[
  {
    "path": ".github/FUNDING.yml",
    "content": "custom: [\"https://www.paypal.me/IsaiahOdhner\"]\n"
  },
  {
    "path": ".gitignore",
    "content": "\n# cypress-image-snapshot visual diffs\n__diff_output__\n\n# cypress-image-snapshot images of the whole cypress UI\n*(failed).snap.png\n\n# electron forge output\nout/\n\n# npm\nnode_modules/\n*.log\n*.log.*\n\n# os crap\nThumbs.db\n~*\n"
  },
  {
    "path": ".vscode/extensions.json",
    "content": "{\n\t\"recommendations\": [\n\t\t\"streetsidesoftware.code-spell-checker\",\n\t\t\"dbaeumer.vscode-eslint\"\n\t]\n}"
  },
  {
    "path": ".vscode/launch.json",
    "content": "{\n\t// Use IntelliSense to learn about possible attributes.\n\t// Hover to view descriptions of existing attributes.\n\t// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387\n\t\"version\": \"0.2.0\",\n\t\"configurations\": [\n\t\t{\n\t\t\t// To use this configuration, you must run Chrome with a flag:\n\t\t\t//   google-chrome --remote-debugging-port=9222 http://127.0.0.1:1999\n\t\t\t// or for Windows:\n\t\t\t//   start chrome --remote-debugging-port=9222 http://127.0.0.1:1999\n\t\t\t// and Chrome must not be running beforehand, as the flag won't apply otherwise.\n\t\t\t// And you need to have the dev server running:\n\t\t\t//   npm run dev\n\t\t\t// If you really don't want to close Chrome, you can use a temporary profile:\n\t\t\t//   mkdir C:\\TempChromeProfile\n\t\t\t//   echo {\"browser\": {\"has_seen_welcome_page\": true, \"default_browser_infobar_last_declined\": \"13354566465257726\"}} > C:\\TempChromeProfile\\Preferences\n\t\t\t//   start chrome --remote-debugging-port=9222 --user-data-dir=\"C:\\TempChromeProfile\" --disable-fre --no-default-browser-check --no-first-run http://127.0.0.1:1999\n\t\t\t//   rmdir /s /q C:\\TempChromeProfile\n\t\t\t\"type\": \"chrome\",\n\t\t\t\"request\": \"attach\",\n\t\t\t\"name\": \"Attach to Chrome\",\n\t\t\t\"port\": 9222,\n\t\t\t\"urlFilter\": \"http://127.0.0.1:1999/*\",\n\t\t\t\"webRoot\": \"${workspaceFolder}\"\n\t\t},\n\t\t{\n\t\t\t// https://www.electronjs.org/docs/latest/tutorial/debugging-vscode\n\t\t\t\"name\": \"Electron: Debug Main Process\",\n\t\t\t\"type\": \"node\",\n\t\t\t\"request\": \"launch\",\n\t\t\t\"cwd\": \"${workspaceFolder}\",\n\t\t\t\"runtimeExecutable\": \"${workspaceFolder}/node_modules/.bin/electron\",\n\t\t\t\"windows\": {\n\t\t\t\t\"runtimeExecutable\": \"${workspaceFolder}/node_modules/.bin/electron.cmd\"\n\t\t\t},\n\t\t\t\"args\": [\n\t\t\t\t\".\"\n\t\t\t],\n\t\t\t\"outputCapture\": \"std\"\n\t\t}\n\t]\n}"
  },
  {
    "path": ".vscode/run-command-on-all-files.ahk",
    "content": "; This script runs on AutoHotkey v2.\n;\n; I tried the VS Code extension \"Command on All Files\" first: https://marketplace.visualstudio.com/items?itemName=rioj7.commandOnAllFiles\n; but it didn't work with the \"cSpell.addIssuesToDictionary\" command.\n; I think it was too fast, and the spell checker didn't have time to run.\n;\n; A better solution would be to:\n; - Improve the \"Command on All Files\" extension:\n;   - add delay options\n;   - add a dry run mode, which I had to work around by setting it to a near-no-op command\n;     - just listing the files would be a lot nicer than opening them all one by one\n;   - unify file matching; you shouldn't have to specify a list of file extensions to include, it should be a glob like the exclusions\n; Or:\n; - Add a command to the cspell-cli to accept spellings\n; Or:\n; - Implement an external Node.js script using cspell's API (but that's less helpful than making a PR)\n\nroot := A_ScriptDir \"\\..\\*\"\nignoreFolders := [\n\t\".git\",\n\t\".history\",\n\t\"node_modules\",\n\t\"lib\",\n\t\"out\",\n\t\"localization\",\n]\nignoreExtensions := [\n\t\"png\",\n\t\"gif\",\n\t\"jpg\",\n\t\"jpeg\",\n\t\"svg\",\n\t\"cur\",\n\t\"ico\",\n\t\"icns\",\n\t\"wav\",\n]\ncommand := \"cSpell.addIssuesToDictionary\"\nbeforeRunInfo := \"This script is designed to add all spelling issues to the dictionary.`nTo use it to prune the dictionary of no-longer-needed words, you must empty the dictionary first.`n`nThis script will run the VS Code command '\" command \"' on all files in the directory '\" root \"'.`n`n\"\ndelayBeforeCommand := 2000 ; Give enough time for spell checker to run\ndelayAfterCommand := 2000 ; Give enough time for CSpell to update the dictionary\ncloseFileAfterCommand := false\nappName := \"VS Code Automation\"\n\npopup := Gui(, appName)\npopup.Opt(\"+AlwaysOnTop +Disabled -SysMenu +Owner\")  ; +Owner avoids a taskbar button.\npopup.Add(\"Text\", , \"`nPress Esc to stop the script.`n`n\")\nstatusBar := popup.Add(\"StatusBar\")\n\nwindowId := WinExist(\"ahk_exe Code.exe\")\n\nIsIgnoredPath(path) {\n\tSplitPath path, &name, &dir, &ext, &nameNoExt, &drive\n\tfor _, ignoreExtension in ignoreExtensions {\n\t\tif (StrLower(ext) = ignoreExtension) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\tparts := StrSplit(path, \"\\\")\n\tfor index, part in parts {\n\t\tfor _, ignoreFolder in ignoreFolders {\n\t\t\tif (part = ignoreFolder) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false\n}\n\nAutomate() {\n\ttargets := []\n\t; Loop through files (F) recursively (R)\n\tloop files, root, \"FR\"\n\t{\n\t\tif (IsIgnoredPath(A_LoopFileFullPath)) {\n\t\t\tcontinue\n\t\t}\n\t\ttargets.Push(A_LoopFileFullPath)\n\t}\n\n\tif (targets.Length = 0) {\n\t\tMsgBox \"No files found for pattern: \" root\n\t\treturn\n\t}\n\n\t; Focus VS Code before confirmation to avoid confusion between multiple VS Code windows\n\ttry {\n\t\tWinActivate { Hwnd: windowId }\n\t} catch TargetError as e {\n\t\tMsgBox \"Could not find VS Code window. Please open it and try again.\", appName, 0x10\n\t\treturn\n\t}\n\n\t; Ask for confirmation\n\tif MsgBox(beforeRunInfo \"Found \" targets.Length \" files. Continue?\", appName, 4) = \"No\" {\n\t\tif MsgBox(\"Copy file paths to clipboard?\", appName, 4) = \"Yes\" {\n\t\t\tA_Clipboard := Join(\"`n\", targets)\n\t\t}\n\t\treturn\n\t}\n\n\tRunCommandOnFiles(targets)\n}\n\nRunCommandOnFiles(targets) {\n\tpopup.Show(\"NoActivate\")  ; NoActivate avoids deactivating the currently active window.\n\n\tfor index, target in targets {\n\t\tstatusBar.SetText(index \"/\" targets.Length)\n\t\ttry {\n\t\t\tRunCommandOnFile(target)\n\t\t} catch TargetError as e {\n\t\t\tpopup.Destroy()\n\t\t\tMsgBox \"Lost VS Code window. Please open it and try again.`n`n\" index \" out of \" targets.Length \" files were processed.\", appName, 0x10\n\t\t\treturn\n\t\t}\n\t}\n\n\tpopup.Destroy()\n\tMsgBox \"Processed \" targets.Length \" files.\"\n\treturn\n}\n\n\nSendToVSCode(keys) {\n\t; ControlSend(keys, , { Hwnd: windowId })\n\tWinActivate { Hwnd: windowId }\n\tSend keys\n}\n\nRunCommandOnFile(target) {\n\t; Open file in VS Code using Ctrl+P file switcher\n\tSendToVSCode \"^p\"\n\tSleep 100\n\tSendToVSCode target\n\tSleep 100\n\tSendToVSCode \"{Enter}\"\n\tSleep delayBeforeCommand\n\n\t; Run command via F1 command palette\n\tSendToVSCode \"{F1}\"\n\tSleep 100\n\tSendToVSCode command\n\tSleep 100\n\tSendToVSCode \"{Enter}\"\n\tSleep delayAfterCommand\n\n\t; Close the file (optional)\n\tif closeFileAfterCommand {\n\t\tSendToVSCode \"^w\"\n\t}\n}\n\nJoin(sep, items) {\n\tstr := \"\"\n\tfor index, item in items {\n\t\tstr .= item . sep\n\t}\n\treturn SubStr(str, 1, -StrLen(sep))\n}\n\n; Escape hatch\nEsc:: {\n\tExitApp\n}\n\nAutomate()\nExitApp()"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n\t// This hides files from the file tree as well as search results.\n\t\"files.exclude\": {\n\t\t\"**/node_modules\": true,\n\t\t\"**/out\": true,\n\t},\n\t// This affects Find In Files (Ctrl+Shift+F) but also Go To File (Ctrl+P) and\n\t// the Quick Search, which I've been using a lot since it was released.\n\t\"search.exclude\": {\n\t\t\"**/images\": true,\n\t\t\"**/lib\": true,\n\t\t\"**/out\": true,\n\t\t// The package lock file contains a lot of repetation, and is usually noise in search results.\n\t\t// You can often search with `npm ls` if you want to check if a package is installed,\n\t\t// and what depends on what.\n\t\t\"package-lock.json\": true,\n\t\t// Ignore localization data, which is in subfolders, but not helper scripts.\n\t\t// Any time a search matches a localized string, it matches an overwhelming number of files.\n\t\t\"**/localization/*/**/*\": true,\n\t},\n\t\"editor.formatOnSave\": true,\n\t\"editor.insertSpaces\": false,\n\t\"editor.detectIndentation\": false,\n\t\"editor.codeActionsOnSave\": {\n\t\t\"source.organizeImports\": \"always\",\n\t},\n\t\"javascript.preferences.importModuleSpecifierEnding\": \"js\",\n\t\"typescript.preferences.importModuleSpecifierEnding\": \"js\",\n\t\"html.format.unformattedContentDelimiter\": \"<!--no_format-->\",\n\t\"[css]\": {\n\t\t// The CSS in this project uses (the lack of) newlines between rules for grouping, as well as inline comments.\n\t\t// VS Code's default formatter adds newlines between all rules, and forces comments to the next line, dissociating them.\n\t\t\"editor.formatOnSave\": false,\n\t},\n\t\"[markdown]\": {\n\t\t// Formatting markdown tables automatically is cool, but doesn't allow padding cells to avoid superflous git diffs.\n\t\t// Also, VS Code's markdown formatter doesn't handle emoji in tables as well as it could.\n\t\t\"editor.formatOnSave\": false,\n\t},\n\t// Note: this doesn't apply to \"JSON with comments\" files, such as this one. That's [jsonc].\n\t\"[json]\": {\n\t\t// npm respects different indent styles, but always adds a newline at the end of package.json/package-lock.json,\n\t\t// so this avoids ping-ponging changes in git.\n\t\t// This could be applied to all files for consistency, but it may introduce noise if all files aren't formatted at once.\n\t\t\"files.insertFinalNewline\": true,\n\t\t// Maintaining current indentation for now, but could remove this for consistency.\n\t\t\"editor.detectIndentation\": true,\n\t},\n\t// Use local TypeScript version instead of the one bundled with VS Code.\n\t// You may need to run \"TypeScript: Select TypeScript Version...\" and choose \"Use workspace version\"\n\t// or that command might just set this setting for you, I'm not sure.\n\t// Go to a TS or JS file for the command to show up in the command palette.\n\t\"typescript.tsdk\": \"node_modules/typescript/lib\",\n\t// Prevent accidental editing.\n\t// This can always be overridden with the command \"File: Toggle Active Editor Read-only in Session\"\n\t\"files.readonlyInclude\": {\n\t\t// Electron Forge output\n\t\t\"out/**\": true,\n\t\t// Built/installed app (sometimes I follow error message links into the built app's code, and end up editing it by mistake)\n\t\t\"**/resources/app/**\": true,\n\t\t// Node.js\n\t\t\"node_modules/**\": true,\n\t\t\"package-lock.json\": true,\n\t\t// RTLCSS output\n\t\t\"**/*.rtl.css\": true,\n\t},\n}"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [Unreleased]\n\n### Changed\n- `systemHooks.writeBlobToHandle` promise can resolve with `true` to indicate success, in which case **File > Save** will not prompt to save the file again. `false` indicates failure or cancellation, whereas `undefined` can be used if it is unknown whether the file will be saved successfully, as is the case when using the `download` attribute on an anchor element. If saving as a monochrome bitmap, `undefined` will cause the canvas to become monochrome, but it will still prompt to save the file again. This tradeoff is reasonable because the download attribute doesn't support saving over an already saved file anyways\n\n\n## [1.0.0] - 2022-08-02\n### Added\n- `systemHooks` API for overriding file dialogs, file saving/loading, and Set as Wallpaper commands\n\t- `systemHooks.showSaveFileDialog = async ({ formats, defaultFileName, defaultPath, defaultFileFormatID, getBlob, savedCallbackUnreliable, dialogTitle }) => { ... };`\n\t- `systemHooks.showOpenFileDialog = async ({ formats }) => { ... };`\n\t- `systemHooks.writeBlobToHandle = async (save_file_handle, blob) => { ... };`\n\t- `systemHooks.readBlobFromHandle = async (file_handle) => { ... };`\n\t- `systemHooks.setWallpaperTiled = (canvas) => { ... };`\n\t- `systemHooks.setWallpaperCentered = (canvas) => { ... };`\n- function `undoable({ name, icon }, actionFunction)` to make an action undoable, as far is it modifies the canvas\n- function `show_error_message(message, [error])` to show an error message dialog box, optionally with expandable error details\n- function `open_from_file(blob, source_file_handle)` to load a file from a blob and file handle pair (kinda quirky API)\n- function `set_theme(theme_file_name)` to switch themes\n- function `set_language(language_code)` to switch languages, prompting the user to reload the application\n- You can use `.main-canvas` selector to access the canvas element.\n- URL parameter `#load:<URL>` to load a file from a URL\n\n[Unreleased]: https://github.com/1j01/jspaint/compare/v1.0.0...HEAD\n[1.1.0]: https://github.com/1j01/jspaint/compare/v1.0.0...v1.1.0\n[1.0.0]: https://github.com/1j01/jspaint/releases/tag/v1.0.0\n"
  },
  {
    "path": "CNAME",
    "content": "jspaint.app"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\n## Pull Requests\n\nLet me know before you work on something by opening an issue or commenting on an existing one.\n\nSomeone may be already working on it, or I may have specific plans or requirements.\nI don't want your effort to be wasted!\n\n## Issues\n\n[Bugs and feature requests are tracked on GitHub.](https://github.com/1j01/jspaint/issues)\n\nBefore opening an issue for a bug or feature request, search to see if it's already been reported.\n\nYou can also [email me](mailto:isaiahodhner@gmail.com) if you prefer.\n\n## Windows 98\n\nNote: JS Paint's GUI is primarily based on Paint from Windows 98.\nThere's a nice [online emulator](https://copy.sh/v86/?profile=windows98)\nthat you can play around with and use as a reference.\n\n## Dev Setup\n\nSee [**Development Setup**](./README.md#Development-Setup) on the readme.\n\n### Project Structure\n\n- `index.html` and `app.js` are the main entry points for the app.\n- `functions.js` has functions that shouldn't own any global state, altho they very much modify global state, and there may be a few stateful global variables defined in there.\n- The project uses [jQuery](https://jquery.com/), and a convention of prefixing variables that hold jQuery objects with `$`\n\t- There are also some weird pseudo-classes like `$ColorBox` which extend and return jQuery objects. I don't recommend this pattern for new code.\n- Menu code and windowing code lives in the [os-gui](https://github.com/1j01/os-gui) project.\n\t- It can be synced (one-way) by running `npm i os-gui@latest --save-exact && npm run sync-os-gui`\n\t- To develop os-gui in the context of jspaint, you can run `npm link` in a clone of os-gui, then run `npm link os-gui && npm run sync-os-gui` in jspaint after making any changes in os-gui.\n\t- (Maybe I should version this using git-subrepo?)\n\t- Some window behavior specific to jspaint is in `$ToolWindow.js` and `$Component.js`\n- `image-manipulation.js` should contain just rendering related code, and ideally no dialogs except maybe some error messages.\n\t- Some image manipulation code is also in `tools.js` and `functions.js`\n- CSS is in `styles/`\n\t- Layout-important CSS is kept separate from theme CSS\n- Localization data is in `localization/`\n\t- As of writing there's no good way to contribute translations, but [get in touch!](https://github.com/1j01/jspaint/issues/80)\n\nAny good IDE or code editor has a project-wide search (often with <kbd>Ctrl+Shift+F</kbd>). I use this all the time.  \nI also use the \"Intellisense\" feature of [VS Code](https://code.visualstudio.com/) to jump to function definitions (an extra convenience over searching for function names)."
  },
  {
    "path": "LICENSE.txt",
    "content": "MIT License\n\nCopyright (c) 2022 Isaiah Odhner\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "\n# [![](images/icons/32x32.png) JS Paint](https://jspaint.app)\n\nA pixel-perfect web-based MS Paint remake and more... [Try it out!](https://jspaint.app)\nThen join the [Discord server](https://discord.gg/jxQBK3k8tx) to share your art!\n\nJS Paint recreates every tool and menu of MS Paint, and even [little-known features](#did-you-know), to a high degree of fidelity.\n\nIt supports themes, additional file types, and accessibility features like a Dwell Clicker and Speech Recognition.\n\n![Screenshot](images/meta/main-screenshot.png)\n\nAh yes, good old Paint. Not the one with the [ribbons][]\nor the [new skeuomorphic one][Fresh Paint] with the interface that can take up nearly half the screen.\n(And not the even newer [Paint 3D][].)\n\n[ribbons]: https://www.google.com/search?tbm=isch&q=MS+Paint+Windows+7+ribbons \"Google Search: MS Paint Windows 7 ribbons\"\n[Fresh Paint]: https://www.google.com/search?tbm=isch&q=MS+Fresh+Paint \"Google Search: MS Fresh Paint\"\n[Paint 3D]: https://www.microsoft.com/en-us/store/p/paint-3d-preview/9nblggh5fv99\n\nWindows 95, 98, and XP were the golden years of Paint.\nYou had a tool box and a color box, a foreground color and a background color,\nand that was all you needed.\n\nThings were simple.\n\nBut we want to undo more than three actions.\nWe want to edit transparent images.\nWe can't just keep using the old Paint.\n\nSo that's why I'm making JS Paint.\nI want to bring good old Paint into the modern era.\n\n\n#### Current improvements include:\n\n* Open source ([MIT licensed](LICENSE.txt))\n* Cross-platform\n* Mobile friendly\n  * Touch support: use two fingers to pan the view, and pinch to zoom\n  * Click/tap the selected colors area to swap the foreground and background colors\n  * **View > Fullscreen** to toggle fullscreen mode, nice for small screens\n  * **Extras > Quick Undo Button** to add a floating undo button for easier access\n    * (this may be enabled by default in the future for touch devices)\n* Web features\n  * **File > Load From URL...** to open an image from the Web.\n  * **File > Upload to Imgur** to upload the current image to Imgur.\n  * **Paste** supports loading from URLs.\n  * You can create links that will open an image from the Web in JS Paint. For example, this link will start with an isometric grid as a template: <https://jspaint.app/#load:https://i.imgur.com/zJMrWwb.png>\n  * Rudimentary **multi-user** collaboration support.\n    Start up a session at\n    [jspaint.app/#session:multi-user-test](https://jspaint.app/#session:multi-user-test)\n    and send the link to your friends!\n    It isn't seamless; actions by other users interrupt what you're doing, and visa versa.\n    Sessions are not private, and you may lose your work at any time.\n    If you want better collaboration support, follow the development of [Mopaint](https://github.com/1j01/mopaint).\n* **Extras > Themes** to change the look of the app.\n  * Dark and light variants\n  * Vector tool icons handcrafted to match the pixel art versions, for both Modern and Classic themes\n  * Occult theme, in the spirit of Halloween\n  * Winter theme, with a special color palette including candy cane stripes, and advent calendar style flaps revealing pixel art for each tool\n  * Bubblegum theme, featuring *Business Pink* color scheme and AI-generated icons\n* **Extras > Enlarge UI** to make buttons and menus bigger, for usage with an eye tracker, head tracker, or other course input devices. May also work well for a tablet, but not so much for a phone at the moment.\n* **Extras > Dwell Clicker** to click automatically by hovering in one spot, for usage with an eye tracker or head tracker.\n  * Hovered buttons are highlighted, and the click is performed after a delay.\n  * Supports dragging windows and drawing on the canvas.\n  * With just a webcam, you can try it out with [Enable Viacam](https://eviacam.crea-si.com/) (head tracker), [GazePointer](https://sourceforge.net/projects/gazepointer/) (eye tracker), or the built in [<img src=\"images/tracky-mouse-16x16.png\" width=\"16\" height=\"16\"> Tracky Mouse](https://trackymouse.js.org/) head tracker using **Extras > Head Tracker**.\n  * This feature can be easily added to other web applications, using the [<img src=\"images/tracky-mouse-16x16.png\" width=\"16\" height=\"16\"> Tracky Mouse API](https://www.npmjs.com/package/tracky-mouse).\n* **Extras > Speech Recognition** to control the app with your voice.\n  * Select tools and colors (\"fill tool\", \"orange\", etc.)\n  * Pan the view (\"scroll down and to the left\", or \"go southwest\", etc.)\n  * Explore the menus, or activate any menu item without opening the menus first\n  * Interact with windows\n  * Dictate text with the Text tool\n  <!-- (Broken due to no-longer-free service) * Even tell the application to sketch things (for instance, \"draw a house\") -->\n* Create an animated GIF from the current document history.\n  Accessible from the Extras menu or with <kbd>Ctrl+Shift+G</kbd>.\n  It's pretty nifty, you should try it out!\n  You might want to limit the size of the image though.\n* Load and save [many different palette formats](#color-palette-formats) with **Colors > Get Colors** and **Colors > Save Colors**.\n  (I made a library for this: <img src=\"images/anypalette-logo-128x128.png\" height=\"16\"> [AnyPalette.js](https://github.com/1j01/anypalette.js).)\n  * You can also drag and drop palette files into the app to load.\n\nEditing Features:\n\n* Use Alt+Mousewheel to zoom in and out\n* Edit transparent images! To create a transparent image,\n  go to **Image > Attributes...** and select Transparent,\n  then OK, and then **Image > Clear Image** or use the Eraser tool.\n  Images with *any* translucent pixels will open in Transparent mode.\n* You can crop the image by making a selection while holding <kbd>Ctrl</kbd>\n* Keyboard shortcuts for rotation: <kbd>Ctrl+.</kbd> and <kbd>Ctrl+,</kbd> (<kbd><</kbd> and <kbd>></kbd>)\n* Rotate by any arbitrary angle in **Image > Flip/Rotate**\n* In **Image > Stretch/Skew**, you can stretch more than 500% at once\n* Zoom to an arbitrary scale in **View > Zoom > Custom...**\n* Zoom to fit the canvas within the window with **View > Zoom > Zoom To Window**\n* Non-contiguous fill: Replace a color in the entire image by holding <kbd>Shift</kbd> when using the fill tool\n\nMiscellaneous Improvements:\n\n* [Vertical Color Box mode](https://jspaint.app/#vertical-color-box-mode), accessible from **Extras > Vertical Color Box**\n* You can use the Text tool at any zoom level (and it previews the exact pixels that will end up on the canvas).\n* Spellcheck is available in the textbox if your browser supports it.\n* Resize handles are easier to grab than in Windows 10's Paint.\n* Omits some Thumbnail view bugs, like the selection showing in the wrong place.\n* Unlimited undos/redos (as opposed to a measly 3 in Windows XP,\n  or a measly 50 in Windows 7)\n* Undo history is *nonlinear*, which means if you undo and do something other than redo, the redos aren't discarded. Instead, a new branch is created in the *history tree*. Jump to any point in history with **Edit > History** or <kbd>Ctrl+Shift+Y</kbd>\n* Automatically keeps a backup of your image. Only one backup per image tho, which doesn't give you a lot of safety. Remember to save with **File > Save** or <kbd>Ctrl+S</kbd>! Manage backups with **File > Manage Storage**.\n\n<!--\nHalf-features:\n\n* When you do **Edit > Paste From...** you can select transparent images.\n  ~~You can even paste a transparent animated GIF and then\n  hold <kbd>Shift</kbd> while dragging the selection to\n  smear it across the canvas *while it animates*!~~\n  Update: This was [due to not-to-spec behavior in Chrome.](https://christianheilmann.com/2014/04/16/browser-inconsistencies-animated-gif-and-drawimage/)\n  I may reimplement this in the future as I really liked this feature.\n* You can open SVG files, though only as a bitmap.\n  (Note: it may open super large, or tiny. There's no option to choose a size when opening.)\n-->\n\n![JS Paint drawing of JS Paint on a phone](images/meta/mobipaint.png)\n\n\n#### Limitations:\n\nA few things with the tools aren't done yet.\nSee [TODO.md](TODO.md#Tools)\n\nFull clipboard support in the web app requires a browser supporting the [Async Clipboard API w/ Images](https://developers.google.com/web/updates/2019/07/image-support-for-async-clipboard), namely Chrome 76+ at the time of writing.\n\nIn other browsers you can still copy with <kbd>Ctrl+C</kbd>, cut with <kbd>Ctrl+X</kbd>, and paste with <kbd>Ctrl+V</kbd>,\nbut data copied from JS Paint can only be pasted into other instances of JS Paint.\nExternal images can be pasted in.\n\n\n## Supported File Formats\n\n### Image Formats\n\n⚠️ Saving as JPEG will introduce artifacts that cause problems when using the Fill tool or transparent selections.\n\n⚠️ Saving in some formats will reduce the number of colors in the image.\n\n💡 Unlike in MS Paint, you can use **Edit > Undo** to revert color or quality reduction from saving.\nThis doesn't undo saving the file, but allows you to then save in a different format with higher quality, using **File > Save As**.\n\n💡 Saving as PNG is recommended as it gives small file sizes while retaining full quality.\n\n| File Extension                | Name                          | Read | Write | Read Palette | Write Palette |\n|-------------------------------|-------------------------------|:----:|:-----:|:------------:|:-------------:|\n| .png                          | [PNG][]                       |  ✅  |  ✅   |      🔜      |               |\n| .bmp, .dib                    | [Monochrome Bitmap][BMP]      |  ✅  |  ✅   |      🔜      |      ✅       |\n| .bmp, .dib                    | [16 Color Bitmap][BMP]        |  ✅  |  ✅   |      🔜      |      ✅       |\n| .bmp, .dib                    | [256 Color Bitmap][BMP]       |  ✅  |  ✅   |      🔜      |      ✅       |\n| .bmp, .dib                    | [24-bit Bitmap][BMP]          |  ✅  |  ✅   |      N/A     |      N/A      |\n| .tif, .tiff, .dng, .cr2, .nef | [TIFF][] (loads first page)   |  ✅  |  ✅   |              |               |\n| .pdf                          | [PDF][] (loads first page)    |  ✅  |       |              |               |\n| .webp                         | [WebP][]                      |  🌐  |  🌐   |              |               |\n| .gif                          | [GIF][]                       |  🌐  |  🌐   |              |               |\n| .jpeg, .jpg                   | [JPEG][]                      |  🌐  |  🌐   |      N/A     |      N/A      |\n| .svg                          | [SVG][] (only default size)   |  🌐  |       |              |               |\n| .ico                          | [ICO][] (only default size)   |  🌐  |       |              |               |\n\nCapabilities marked with 🌐 are currently left up to the browser to support or not.\nIf \"Write\" is marked with 🌐, the format will appear in the file type dropdown but may not work when you try to save.\nFor opening files, see Wikipedia's [browser image format support table][] for more information.\n\nCapabilities marked with 🔜 may be coming soon, and N/A means not applicable.\n\n\"Read Palette\" refers to loading the colors into the Colors box automatically (from an [indexed color][] image),\nand \"Write Palette\" refers to writing an [indexed color][] image.\n\n[PNG]: https://en.wikipedia.org/wiki/Portable_Network_Graphics\n[BMP]: https://en.wikipedia.org/wiki/BMP_file_format\n[TIFF]: https://en.wikipedia.org/wiki/TIFF\n[PDF]: https://en.wikipedia.org/wiki/PDF\n[WebP]: https://en.wikipedia.org/wiki/WebP\n[GIF]: https://en.wikipedia.org/wiki/GIF\n[JPEG]: https://en.wikipedia.org/wiki/JPEG\n[SVG]: https://en.wikipedia.org/wiki/Scalable_Vector_Graphics\n[ICO]: https://en.wikipedia.org/wiki/ICO_(file_format)\n[indexed color]: https://en.wikipedia.org/wiki/Indexed_color\n[browser image format support table]: https://en.wikipedia.org/wiki/Comparison_of_web_browsers#Image_format_support\n\n\n### Color Palette Formats\n\nWith **Colors > Save Colors** and **Colors > Get Colors** you can save and load colors\nin many different formats, for compatibility with a wide range of programs.\n\nIf you want to add extensive palette support to another application, I've made this functionality available as a library:\n<img src=\"images/anypalette-logo-128x128.png\" height=\"16\"> [AnyPalette.js](https://github.com/1j01/anypalette.js)\n\n| File Extension    | Name                              | Programs                                                                          |   Read  |  Write  |\n|-------------------|-----------------------------------|-----------------------------------------------------------------------------------|:-------:|:-------:|\n| .pal              | [RIFF] Palette                    | [MS Paint] for Windows 95 and Windows NT 4.0                                      |   ✅   |   ✅    |\n| .gpl              | [GIMP][Gimp] Palette              | [Gimp], [Inkscape], [Krita], [KolourPaint], [Scribus], [CinePaint], [MyPaint]     |   ✅   |   ✅    |\n| .aco              | Adobe Color Swatch                | Adobe [Photoshop]                                                                 |   ✅   |   ✅    |\n| .ase              | Adobe Swatch Exchange             | Adobe [Photoshop], [InDesign], and [Illustrator]                                  |   ✅   |   ✅    |\n| .txt              | [Paint.NET] Palette               | [Paint.NET]                                                                       |   ✅   |   ✅    |\n| .act              | Adobe Color Table                 | Adobe [Photoshop] and [Illustrator]                                               |   ✅   |   ✅    |\n| .pal, .psppalette | [Paint Shop Pro] Palette          | [Paint Shop Pro] (Jasc Software / Corel)                                          |   ✅   |   ✅    |\n| .hpl              | [Homesite] Palette                | Allaire [Homesite] / Macromedia [ColdFusion]                                      |   ✅   |   ✅    |\n| .cs               | ColorSchemer                      | ColorSchemer Studio                                                               |   ✅   |         |\n| .pal              | [StarCraft] Palette               | [StarCraft]                                                                       |   ✅   |   ✅    |\n| .wpe              | [StarCraft] Terrain Palette       | [StarCraft]                                                                       |   ✅   |   ✅    |\n| .sketchpalette    | [Sketch] Palette                  | [Sketch]                                                                          |   ✅   |   ✅    |\n| .spl              | [Skencil] Palette                 | [Skencil] (formerly called Sketch)                                                |   ✅   |   ✅    |\n| .soc              | StarOffice Colors                 | [StarOffice], [OpenOffice], [LibreOffice]                                         |   ✅   |   ✅    |\n| .colors           | KolourPaint Color Collection      | [KolourPaint]                                                                     |   ✅   |   ✅    |\n| .colors           | Plasma Desktop Color Scheme       | [KDE] Plasma Desktop                                                              |   ✅   |         |\n| .theme            | Windows Theme                     | [Windows] Desktop                                                                 |   ✅   |         |\n| .themepack        | Windows Theme                     | [Windows] Desktop                                                                 |   ✅   |         |\n| .css, .scss, .styl| Cascading StyleSheets             | Web browsers / web pages                                                          |   ✅   |   ✅    |\n| .html, .svg, .js  | any text files with CSS colors    | Web browsers / web pages                                                          |   ✅   |         |\n\n[RIFF]: https://en.wikipedia.org/wiki/Resource_Interchange_File_Format\n[MS Paint]: https://en.wikipedia.org/wiki/Microsoft_Paint\n[Paint.NET]: https://www.getpaint.net/\n[Paint Shop Pro]: https://www.paintshoppro.com/en/\n[StarCraft]: https://en.wikipedia.org/wiki/StarCraft\n[Homesite]: https://en.wikipedia.org/wiki/Macromedia_HomeSite\n[ColdFusion]: https://en.wikipedia.org/wiki/Adobe_ColdFusion\n[StarOffice]: https://en.wikipedia.org/wiki/StarOffice\n[OpenOffice]: https://www.openoffice.org/\n[LibreOffice]: https://www.libreoffice.org/\n[Sketch]: https://www.sketchapp.com/\n[Skencil]: https://skencil.org/\n[Photoshop]: https://www.adobe.com/products/photoshop.html\n[InDesign]: https://www.adobe.com/products/indesign.html\n[Illustrator]: https://www.adobe.com/products/illustrator.html\n[Gimp]: https://www.gimp.org/\n[Inkscape]: https://inkscape.org/en/\n[Krita]: https://www.calligra.org/krita/\n[KolourPaint]: http://kolourpaint.org/\n[KDE]: https://kde.org/\n[Windows]: https://en.wikipedia.org/wiki/Microsoft_Windows\n[Scribus]: https://www.scribus.net/\n[CinePaint]: http://www.cinepaint.org/\n[MyPaint]: http://mypaint.org/\n\n\n## Did you know?\n\n* There's a black and white mode with *patterns* instead of colors in the palette,\n  which you can get to from **Image > Attributes...**\n\n* You can drag the color box and tool box around if you grab them by the right place.\n  You can even drag them out into little windows.\n  You can dock the windows back to the side by double-clicking on their title bars.\n\n* In addition to the left-click foreground color and the right-click background color,\n  there's a third color you can access by holding <kbd>Ctrl</kbd> while you draw.\n  It starts out with no color so you'll need to hold <kbd>Ctrl</kbd> and select a color first.\n  The fancy thing about this color slot is you can\n  press and release <kbd>Ctrl</kbd> to switch colors *while drawing*.\n\n* You can apply image transformations like Flip/Rotate, Stretch/Skew or Invert (in the Image menu) either to the whole image or to a selection.\n  Try scribbling with the Free-Form Select tool and then doing **Image > Invert**\n\n* These Tips and Tricks from [a tutorial for MS Paint](https://www.albinoblacksheep.com/tutorial/mspaint)\n  also work in JS Paint:\n\n\t* [x] Brush Scaling (<kbd>+</kbd> & <kbd>-</kbd> on the number pad to adjust brush size)\n\t* [x] \"Custom Brushes\" (hold <kbd>Shift</kbd> and drag the selection to smear it)\n\t* [x] The 'Stamp' \"Tool\" (hold <kbd>Shift</kbd> and click the selection to stamp it)\n\t* [x] Image Scaling (<kbd>+</kbd> & <kbd>-</kbd> on the number pad to scale the selection by factors of 2)\n\t* [x] Color Replacement (right mouse button with Eraser to selectively replace the foreground color with the background color)\n\t* [x] The Grid (<kbd>Ctrl+G</kbd> & Zoom to 4x+)\n\t* [x] Quick Undo (Pressing a second mouse button cancels the action you were performing.\n\t      I also made it redoable, in case you do it by accident!)\n\t* [ ] Scroll Wheel Bug (Hmm, let's maybe not recreate this?)\n\n\n## Desktop App\n\n### PWA\n\nJS Paint can be installed as a Progressive Web App (PWA), although it doesn't work offline yet.\nLook for the install prompt in the address bar.\n\nPWA features:\n- No address bar; middle-ground between web and native\n- Cross-platform (macOS, Windows, Linux, Android, iOS)\n- Basic file integration:\n\t- File > Open\n\t- File > Save downloads the file after asking for a filename and format\n\t- Drag and drop files onto the window to open them\n\nMissing features:\n\n- <details><summary>Directly saving to files is implemented but not enabled currently.</summary>I was concerned about data loss for two reasons: 1. the change in behavior of File > Save / Ctrl+S from effectively acting as Save As to overwriting files directly, although I made a warning dialog for this, with a don't show again option; 2. there was a bad bug with saved files ending up completely empty (zero bytes), which I don't know if was a bug in my code or in Chrome.</details>\n- <details><summary>Offline support is not implemented.</summary>I've taken a few stabs at this, and <a href=\"https://github.com/1j01/jspaint/pull/144\">I'm not the only one</a>, but there are some huge caveats, such as the development server not being able to live-reload without disabling the service worker.</details>\n\n### Electron\n\nI've also built it into a desktop app with [Electron][] and [Electron Forge][].\nYou can download it from the [releases page][].\n\n![JS Paint running as a desktop app on macOS](images/meta/electron-app-screenshot-mac.png)\n\nElectron app features:\n- Native-like experience (runs in a window with no address bar)\n- Cross-platform (macOS, Windows, Linux)\n- Clipboard support\n- Files can be opened in various ways:\n  - **File > Open**\n  - Drag and drop onto window\n  - Drag and drop onto dock icon on macOS\n  - Drag and drop onto desktop shortcut\n  - **Right Click > Open With** in file manager (macOS and Linux)\n    - On Windows, you can manually paste the path to the executable into the Open With dialog, which you can find by right clicking the app in the taskbar, then right clicking the app's name, and selecting Properties. In the Shortcut tab, the Target field is the path to the executable. Once you open the app in this way, the app will show up in the Open With list, and if you select \"Always\", it will become the default app for that file type.\n  - Command line: type `jspaint path/to/file.png` in the terminal\n- **File > Save** will save directly to the file\n- **File > Set As Wallpaper (Tiled)** and **File > Set As Wallpaper (Centered)**\n- On macOS, an icon representing the currently open file is shown in the titlebar. You can drag this icon into other applications, for example to include the image you're editing in an email. The icon is dimmed while there are unsaved changes.\n\n<details><summary>Electron app limitations</summary>\n\n- Basics:\n  - Execution is blocked by default on Mac and Windows\n    - On macOS you need to Ctrl+click the file and then say Open\n    - On Windows, you need to say \"More info\" and then \"Run\" (or \"Run anyway\"?)\n    - I would need to pay a fee for code signing to avoid this. It's basically *security by extortion*.\n  - There are no automatic updates. Apparently I would need to pay a fee for code signing to get this free service.\n    - That said, **Help > About Paint** can tell you if JS Paint is out of date, at least in terms of news updates.\n  - Electron is out of date. It may, for instance, contain image decoding vulnerabilities that have since been fixed. However, I've taken precautions to sandbox the app and restrict write access to a list of files explicitly opened in the app, the list being controlled by the main process, separate from the renderer process which would handle image decoding.\n  - Only a single editor window can be opened at once.\n  - The File menu's recent files list is not implemented, nor are [OS-specific jump menus](https://www.electronjs.org/docs/latest/tutorial/recent-documents).\n- Minor details:\n  - A very confusing message is shown if you edit a document before clicking an Open link in the Manage Storage dialog.\n  - WebGL error messages tell you to refresh without offering a way to reload; also, calling the app a web page feels unpolished\n  - The File > Open dialog does not have an All Files (\\*.\\*) option, and the list of file types supported is not exhaustive; for example, AVIF images can be loaded but only by drag and drop\n  - Drag and drop shows two \"Save changes to X?\" dialogs on top of each other?\n- I'm not sure if all of these are still issues, need to retest them:\n  - Quit doesn't exit app completely, only closes the window if it's open... intended behavior? shouldn't right click > Quit really quit? https://stackoverflow.com/questions/44316306/how-to-quit-electron-app-on-mac\n  - Quit doesn't show/focus window when save changes prompt is shown on maybe mac/linux\n  - Ctrl+C doesn't exit on mac/linux https://github.com/electron/electron/issues/5273\n    - this is because of `editor_window.on(\"close\")` calling `preventDefault` and may be a feature but needs to show/focus the window\n    - https://stackoverflow.com/questions/75362687/electron-js-processes-do-not-exit-on-app-quit\n  - Opening an SVG file also isn't working via command line argument (dragging onto the shortcut in File Explorer) even though dragging and dropping into the window works.  \n    - Seems to load load SVG as a palette... Is this what I was running into?\n\n</details>\n\n[Electron]: https://electronjs.org/\n[Electron Forge]: https://electronforge.io/\n[releases page]: https://github.com/1j01/jspaint/releases/\n\n\n## Development Setup\n\n[Clone the repo.](https://help.github.com/articles/cloning-a-repository/)\n\nInstall [Node.js][] if you don't have it, then open up a command prompt / terminal in the project directory.\n\n### Quality Assurance\n\nRun `npm run lint` to check for spelling errors, type errors, code style issues, and other problems.\n\nRun `npm run format` to automatically fix formatting issues, or `npx eslint --fix` to fix all auto-fixable issues.\n\nThe formatting rules are configured for compatibility with VS Code's built-in formatter.\n\nRun `npm test` to run browser-based tests with Cypress. (It's slow to start up and run tests, unfortunately.)\n\nRun `npm run accept` to accept any visual changes.\nThis unfortunately re-runs all the tests, rather than accepting results of the previous test, so you could end up with different results than the previous test.\nIf you use [GitHub Desktop](https://desktop.github.com/), you can view diffs of images, in four different modes.\n\nTo open the Cypress UI, first run `npm run test:start-server`, then concurrently `npm run cy:open`\n\n### Web App (https://jspaint.app)\n\nAfter you've installed dependencies with `npm i`,\nuse `npm run dev` to start a live-reloading server.\n\nMake sure any layout-important styles go in `layout.css`.\nWhen updating `layout.css`, a right-to-left version of the stylesheet is generated, using [RTLCSS](https://rtlcss.com/).  \nYou should test the RTL layout by changing the language to Arabic or Hebrew.\nGo to **Extras > Language > العربية** or **עברית**.  \nSee [Control Directives](https://rtlcss.com/learn/usage-guide/control-directives/) for how to control the RTL layout.\n\nThere is a VS Code launch task for attaching to Chrome for debugging.\nSee `.vscode/launch.json` for usage instructions.\n\n### Desktop App (Electron)\n\n- Install dependencies with `npm i`\n- Start the electron app with `npm run electron:start`\n\n[electron-debug][] is included, so you can use <kbd>F5</kbd>/<kbd>Ctrl+R</kbd> to reload and <kbd>F12</kbd>/<kbd>Ctrl+Shift+I</kbd> to open the devtools.\n\nYou can build for production with `npm run electron:make`\n\nThere is a VS Code launch task for debugging the Electron main process.\nFor the renderer process, you can use the embedded Chrome DevTools.\n\n[Live Server]: https://github.com/1j01/live-server\n[Node.js]: https://nodejs.org/\n[electron-debug]: https://github.com/sindresorhus/electron-debug\n\n## Deployment\n\nJS Paint can be deployed using a regular web server.\n\nNothing needs to be compiled.\n\n### CORS proxy\n\nOptionally, you can set up a [CORS Anywhere](https://github.com/Rob--W/cors-anywhere) server, for loading images from the web, if you paste a URL into JS Paint, or use the `#load:<URL>` feature with images that are not on the same domain.\n\nBy default it will use a [CORS Anywhere instance](https://jspaint-cors-proxy.herokuapp.com) set up to work with [jspaint.app](https://jspaint.app).\n\nIt is hosted for free on [Heroku](https://www.heroku.com/),\nand you can set up your own instance and configure it to work with your own domain.\n\nYou'll have to find and replace `https://jspaint-cors-proxy.herokuapp.com` with your own instance URL.\n\n\n### Multiplayer Support\n\nMultiplayer support currently relies on Firebase,\nwhich is not open source software.\n\nYou could create a [Firebase Realtime Database](https://firebase.google.com/docs/database/web/start) instance and edit JS Paint's `sessions.js` to point to it,\nreplacing the `config` passed to `initializeApp` with the config from the Firebase Console when you set up a Web App.\n\nBut the multiplayer mode is very shoddy so far.\nIt should be replaced with something open source, more secure, more efficient, and more robust.\n\n## Embed in your website\n\n### Simple\n\nAdd this to your HTML:\n\n```html\n<iframe src=\"https://jspaint.app\" width=\"100%\" height=\"100%\"></iframe>\n```\n\n#### Start with an image\n\nYou can have it load an image from a URL by adding `#load:<URL>` to the URL.\n\n```html\n<iframe src=\"https://jspaint.app#load:https://jspaint.app/favicon.ico\" width=\"100%\" height=\"100%\"></iframe>\n```\n\n### Advanced\n\nIf you want to control JS Paint, how it saves/loads files, or access the canvas directly,\nthere is an unstable API.\n\nFirst you need to [clone the repo](https://help.github.com/articles/cloning-a-repository/),\nso you can point an `iframe` to your local copy.\n\nThe local copy of JS Paint has to be hosted on the same web server as the containing page, or more specifically, it has to share the [same origin](https://en.wikipedia.org/wiki/Same-origin_policy).\n\nHaving a local copy also means things won't break any time the API changes.\n\nIf JS Paint is cloned to a folder called `jspaint`, which lives in the same folder as the page you want to embed it in, you can use this:\n\n```html\n<iframe src=\"jspaint/index.html\" id=\"jspaint-iframe\" width=\"100%\" height=\"100%\"></iframe>\n```\n\nIf it lives somewhere else, you may need to add `../` to the start of the path, to go up a level. For example, `src=\"../../apps/jspaint/index.html\"`.\nYou can also use an absolute URL, like `src=\"https://example.com/cool-apps/jspaint/index.html\"`.\n\n#### Changing how files are saved/loaded\n\nYou can override the file saving and opening dialogs\nwith JS Paint's `systemHooks` API.\n\n```html\n<script>\nvar iframe = document.getElementById(\"jspaint-iframe\");\nvar jspaint = iframe.contentWindow;\n// Wait for systemHooks object to exist (the iframe needs to load)\nwaitUntil(()=> jspaint.systemHooks, 500, ()=> {\n\t// Hook in\n\tjspaint.systemHooks.showSaveFileDialog = async ({ formats, defaultFileName, defaultPath, defaultFileFormatID, getBlob, savedCallbackUnreliable, dialogTitle }) => { ... };\n\tjspaint.systemHooks.showOpenFileDialog = async ({ formats }) => { ... };\n\tjspaint.systemHooks.writeBlobToHandle = async (save_file_handle, blob) => { ... };\n\tjspaint.systemHooks.readBlobFromHandle = async (file_handle) => { ... };\n});\n// General function to wait for a condition to be met, checking at regular intervals\nfunction waitUntil(test, interval, callback) {\n\tif (test()) {\n\t\tcallback();\n\t} else {\n\t\tsetTimeout(waitUntil, interval, test, interval, callback);\n\t}\n}\n</script>\n```\n\nA [Blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob) represents the contents of a file in memory.\n\nA file handle is anything that can identify a file.\nYou get to own this concept, and define how to identify files.\nIt could be anything from an index into an array, to a Dropbox file ID, to an IPFS URL, to a file path.\nIt can be any type, or maybe it needs to be a string, I forget.\n\nOnce you have a concept of a file handle, you can implement file pickers using the system hooks, and functions to read and write files.\n\n| Command | Hooks Used |\n| ------- | ---------- |\n| **File > Save As** | [`systemHooks.showSaveFileDialog`][], then when a file is picked, [`systemHooks.writeBlobToHandle`][] |\n| **File > Open** | [`systemHooks.showOpenFileDialog`][], then when a file is picked, [`systemHooks.readBlobFromHandle`][] |\n| **File > Save** | [`systemHooks.writeBlobToHandle`][] (or same as **File > Save As** if there's no file open yet) |\n| **Edit > Copy To** | [`systemHooks.showSaveFileDialog`][], then when a file is picked, [`systemHooks.writeBlobToHandle`][] |\n| **Edit > Paste From** | [`systemHooks.showOpenFileDialog`][], then when a file is picked, [`systemHooks.readBlobFromHandle`][] |\n| **File > Set As Wallpaper (Tiled)** | [`systemHooks.setWallpaperTiled`][] if defined, else [`systemHooks.setWallpaperCentered`][] if defined, else same as **File > Save As** |\n| **File > Set As Wallpaper (Centered)** | [`systemHooks.setWallpaperCentered`][] if defined, else same as **File > Save As** |\n| **Extras > Render History As GIF** | Same as **File > Save As** |\n| **Colors > Save Colors** | Same as **File > Save As** |\n| **Colors > Get Colors** | Same as **File > Open** |\n\n#### Loading a file initially\n\nTo start the app with a file loaded for editing,\nwait for the app to load, then call [`systemHooks.readBlobFromHandle`][] with a file handle, and tell the app to load that file blob.\n\n```js\nconst file_handle = \"initial-file-to-load\";\nsystemHooks.readBlobFromHandle(file_handle).then(file => {\n\tif (file) {\n\t\tcontentWindow.open_from_file(file, file_handle);\n\t}\n}, (error) => {\n\t// Note: in some cases, this handler may not be called, and instead an error message is shown by readBlobFromHandle directly.\n\tcontentWindow.show_error_message(`Failed to open file ${file_handle}`, error);\n});\n```\n\nThis is clumsy, and in the future there may be a query string parameter to load an initial file by its handle.\n(Note to self: it will need to wait for your system hooks to be registered, somehow.)\n\nThere's already a query string parameter to load from a URL:\n\n```html\n<iframe src=\"https://jspaint.app?load:SOME_URL_HERE\"></iframe>\n```\n\nBut this won't set up the file handle for saving.\n\n\n#### Integrating Set as Wallpaper\n\nYou can define two functions to set the wallpaper, which will be used by **File > Set As Wallpaper (Tiled)** and **File > Set As Wallpaper (Centered)**.\n\n- [`systemHooks.setWallpaperTiled`][]` = (canvas) => { ... };`\n- [`systemHooks.setWallpaperCentered`][]` = (canvas) => { ... };`\n\nIf you define only [`systemHooks.setWallpaperCentered`][], JS Paint will attempt to guess your screen's dimensions and tile the image, applying it by calling your [`systemHooks.setWallpaperCentered`][] function.\n\nIf you don't specify [`systemHooks.setWallpaperCentered`][], JS Paint will default to saving a file (`<original file name> wallpaper.png`) using [`systemHooks.showSaveFileDialog`][] and [`systemHooks.writeBlobToHandle`][].\n\nHere's a full example supporting a persistent custom wallpaper as a background on the containing page:\n\n```js\nconst wallpaper = document.querySelector(\"body\"); // or some other element\n\njspaint.systemHooks.setWallpaperCentered = (canvas) => {\n\tcanvas.toBlob((blob) => {\n\t\tsetDesktopWallpaper(blob, \"no-repeat\", true);\n\t});\n};\njspaint.systemHooks.setWallpaperTiled = (canvas) => {\n\tcanvas.toBlob((blob) => {\n\t\tsetDesktopWallpaper(blob, \"repeat\", true);\n\t});\n};\n\nfunction setDesktopWallpaper(file, repeat, saveToLocalStorage) {\n\tconst blob_url = URL.createObjectURL(file);\n\twallpaper.style.backgroundImage = `url(${blob_url})`;\n\twallpaper.style.backgroundRepeat = repeat;\n\twallpaper.style.backgroundPosition = \"center\";\n\twallpaper.style.backgroundSize = \"auto\";\n\tif (saveToLocalStorage) {\n\t\tconst fileReader = new FileReader();\n\t\tfileReader.onload = () => {\n\t\t\tlocalStorage.setItem(\"wallpaper-data-url\", fileReader.result);\n\t\t\tlocalStorage.setItem(\"wallpaper-repeat\", repeat);\n\t\t};\n\t\tfileReader.onerror = () => {\n\t\t\tconsole.error(\"Error reading file (for setting wallpaper)\", file);\n\t\t};\n\t\tfileReader.readAsDataURL(file);\n\t}\n}\n\n// Initialize the wallpaper from localStorage, if it exists\ntry {\n\tconst wallpaper_data_url = localStorage.getItem(\"wallpaper-data-url\");\n\tconst wallpaper_repeat = localStorage.getItem(\"wallpaper-repeat\");\n\tif (wallpaper_data_url) {\n\t\tfetch(wallpaper_data_url).then(response => response.blob()).then(file => {\n\t\t\tsetDesktopWallpaper(file, wallpaper_repeat, false);\n\t\t});\n\t}\n} catch (error) {\n\tconsole.error(error);\n}\n```\n\nIt's a little bit recursive, sorry; it could probably be done simpler.\nLike by just using data URLs. (Actually, I think I wanted to use blob URLs just so that it doesn't bloat the DOM inspector with a super long URL. Which is really a devtools UX bug. Maybe they've improved this?)\n\n#### Specifying the canvas size\n\nYou can load a file that has the desired dimensions.\nThere's no special API for this at the moment.\n\nSee [Loading a file initially](#loading-a-file-initially).\n\n#### Specifying the theme\n\nYou could change the theme programmatically:\n\n```js\nvar iframe = document.getElementById(\"jspaint-iframe\");\nvar jspaint = iframe.contentWindow;\njspaint.set_theme(\"modern.css\");\n```\nbut this will break the user preference.\n\nThe **Extras > Themes** menu will still work, but the preference won't persist when reloading the page.\n\nIn the future there may be a query string parameter to specify the default theme. You could also fork jspaint to change the default theme.\n\n#### Specifying the language\n\nSimilar to the theme, you can try to change the language programmatically:\n\n```js\nvar iframe = document.getElementById(\"jspaint-iframe\");\nvar jspaint = iframe.contentWindow;\njspaint.set_language(\"ar\");\n```\nbut this will actually **ask the user to reload the application** to change languages.\n\nThe **Extras > Language** menu will still work, but the user will be bothered to change the language every time they reload the page.\n\nIn the future there may be a query string parameter to specify the default language. You could also fork jspaint to change the default language.\n\n#### Adding custom menus\n\nNot supported yet.\nYou could fork jspaint and add your own menus.\n\n#### Accessing the canvas directly\n\nWith access to the canvas, you can implement a live preview of your drawing, for example updating a texture in a game engine in realtime.\n\n```js\nvar iframe = document.getElementById(\"jspaint-iframe\");\n// contentDocument here refers to the webpage loaded in the iframe, not the image document loaded in jspaint.\n// We're just reaching inside the iframe to get the canvas.\nvar canvas = iframe.contentDocument.querySelector(\".main-canvas\");\n```\n\nIt's recommended **not** to use this for loading a document, as it won't change the document title, or reset undo/redo history, among other things.\nInstead use [`open_from_file`][].\n\n#### Performing custom actions\n\nIf you want to make buttons or other UI to do things to the document, you should (probably) make it undoable.\nIt's very easy, just wrap your action in a call to [`undoable`][].\n\n```js\nvar iframe = document.getElementById(\"jspaint-iframe\");\nvar jspaint = iframe.contentWindow;\nvar icon = new Image();\nicon.src = \"some-folder/some-image-15x11-pixels.png\";\njspaint.undoable({\n\tname: \"Seam Carve\",\n\ticon: icon, // optional\n}, function() {\n\t// do something to the canvas\n});\n```\n\n#### <a href=\"#systemHooks.showSaveFileDialog\" id=\"systemHooks.showSaveFileDialog\">async function `systemHooks.showSaveFileDialog({ formats, defaultFileName, defaultPath, defaultFileFormatID, getBlob, savedCallbackUnreliable, dialogTitle })`</a>\n[`systemHooks.showSaveFileDialog`]: #systemHooks.showSaveFileDialog\n\nDefine this function to override the default save dialog.\nThis is used both for saving images, as well as palette files, and animations.\n\nArguments:\n- `formats`: an array of objects representing types of files, with the following properties:\n\t- `formatID`: a string that uniquely identifies the format (may be the same as `mimeType`)\n\t- `mimeType` (optional): the file format's designated [media type](https://en.wikipedia.org/wiki/Media_type), e.g. `\"image/png\"` (palette formats do not have this property)\n\t- `name`: the file format's name, e.g. `\"WebP\"`\n\t- `nameWithExtensions`: the file format's name followed by a list of extensions, e.g. `\"TIFF (*.tif;*.tiff)\"`\n\t- `extensions`: an array of file extensions, excluding the dot, with the preferred extension first, e.g. `[\"bmp\", \"dib\"]`\n- `defaultFileName` (optional): a suggested file name, e.g. `\"Untitled.png\"` or the name of an open document.\n- `defaultPath` (optional): a file handle for a document that was opened, so you can save to the same folder easily. Misnomer: this may not be a path, it depends on how you define file handles.\n- `defaultFileFormatID` (optional): the `formatID` of a file format to select by default.\n- `async function getBlob(formatID)`: a function you call to get a file in one of the supported formats. It takes a `formatID` and returns a `Promise` that resolves with a `Blob` representing the file contents to save.\n- `function savedCallbackUnreliable({ newFileName, newFileFormatID, newFileHandle, newBlob })` (optional): a function you call when the user has saved the file. The `newBlob` should come from `getBlob(newFileFormatID)`.\n- `dialogTitle` (optional): a title for the save dialog.\n\nNote the inversion of control here:\nJS Paint calls your `systemHooks.showSaveFileDialog` function, and then you call JS Paint's `getBlob` function.\nOnce `getBlob` resolves, you can call the `savedCallbackUnreliable` function which is defined by JS Paint.\n(Hopefully I can clarify this in the future.)\n\nAlso note that this function is responsible for saving the file, not just picking a save location.\nYou may reuse your `systemHooks.writeBlobToHandle` function if it's helpful.\n\n#### <a href=\"#systemHooks.showOpenFileDialog\" id=\"systemHooks.showOpenFileDialog\">async function `systemHooks.showOpenFileDialog({ formats })`</a>\n[`systemHooks.showOpenFileDialog`]: #systemHooks.showOpenFileDialog\n\nDefine this function to override the default open dialog.\nThis is used for opening images and palettes.\n\nArguments:\n- `formats`: same as `systemHooks.showSaveFileDialog`\n\nNote that this function is responsible for loading the contents of the file, not just picking a file.\nYou may reuse your `systemHooks.readBlobFromHandle` function if it's helpful.\n\n#### <a href=\"#systemHooks.writeBlobToHandle\" id=\"systemHooks.writeBlobToHandle\">async function `systemHooks.writeBlobToHandle(fileHandle, blob)`</a>\n[`systemHooks.writeBlobToHandle`]: #systemHooks.writeBlobToHandle\n\nDefine this function to tell JS Paint how to save a file.\n\nArguments:\n- `fileHandle`: a file handle, as defined by your system, representing the file to write to.\n- `blob`: a `Blob` representing the file contents to save.\n\nReturns:\n- `Promise` that resolves with `true` if the file was definitely saved successfully, `false` if an error occurred or the user canceled, or `undefined` if it is not known whether the file was saved successfully, as is the case with file downloading with `<a href=\"...\" download=\"...\">`. The promise should not reject; errors should be handled by showing an error message and returning `false`.\n\n#### <a href=\"#systemHooks.readBlobFromHandle\" id=\"systemHooks.readBlobFromHandle\">async function `systemHooks.readBlobFromHandle(fileHandle)`</a>\n[`systemHooks.readBlobFromHandle`]: #systemHooks.readBlobFromHandle\n\nDefine this function to tell JS Paint how to load a file.\n\nArguments:\n- `fileHandle`: a file handle, as defined by your system, representing the file to read from.\n\n#### <a href=\"#systemHooks.setWallpaperTiled\" id=\"systemHooks.setWallpaperTiled\">function `systemHooks.setWallpaperTiled(canvas)`</a>\n[`systemHooks.setWallpaperTiled`]: #systemHooks.setWallpaperTiled\n\nDefine this function to tell JS Paint how to set the wallpaper. See [Integrating Set as Wallpaper](#integrating-set-as-wallpaper) for an example.\n\nArguments:\n- `canvas`: a `HTMLCanvasElement` with the image to set as the wallpaper.\n\n#### <a href=\"#systemHooks.setWallpaperCentered\" id=\"systemHooks.setWallpaperCentered\">function `systemHooks.setWallpaperCentered(canvas)`</a>\n[`systemHooks.setWallpaperCentered`]: #systemHooks.setWallpaperCentered\n\nDefine this function to tell JS Paint how to set the wallpaper. See [Integrating Set as Wallpaper](#integrating-set-as-wallpaper) for an example.\n\nArguments:\n- `canvas`: a `HTMLCanvasElement` with the image to set as the wallpaper.\n\n#### <a href=\"#undoable\" id=\"undoable\">function `undoable({ name, icon }, actionFunction)`</a>\n[`undoable`]: #undoable\n\nUse this to make an action undoable.\n\nThis function takes a snapshot of the canvas, and some other state, and then calls the `actionFunction` function.\nIt creates an entry in the history so it can be undone.\n\nArguments:\n- `name`: a name for the action, e.g. `\"Brush\"` or `\"Rotate Image 270°\"`\n- `icon` (optional): an `Image` to display in the History window. It is recommended to be 15x11 pixels.\n- `actionFunction`: a function that takes no arguments, and modifies the canvas.\n\n#### <a href=\"#show_error_message\" id=\"show_error_message\">function `show_error_message(message, [error])`</a>\n[`show_error_message`]: #show_error_message\n\nUse this to show an error message dialog box, optionally with expandable error details.\n\nArguments:\n- `message`: plain text to show in the dialog box.\n- `error` (optional): an `Error` object to show in the dialog box, collapsed by default in a \"Details\" expandable section.\n\n#### <a href=\"#open_from_file\" id=\"open_from_file\">function `open_from_file(blob, source_file_handle)`</a>\n[`open_from_file`]: #open_from_file\n\nUse this to load a file into the app.\n\nArguments:\n- `blob`: a `Blob` object representing the file to load.\n- `source_file_handle`: a *corresponding* file handle for the file, as defined by your system.\n\nSorry for the quirky API.\nThe API is new, and parts of it have not been designed at all. This was just a hack that I came to depend on, reaching into the internals of JS Paint to load a file.\nI decided to document it as the first version of the API, since I'll want a changelog when upgrading my usage of it anyways.\n\n#### <a href=\"#set_theme\" id=\"set_theme\">function `set_theme(theme_file_name)`</a>\n[`set_theme`]: #set_theme\n\nUse this to change the look of the application.\n\nArguments:\n- `theme_file_name`: the name of the theme file to load, one of:\n\t- `\"classic.css\"`: the Windows98 theme.\n\t- `\"dark.css\"`: the Dark theme.\n\t- `\"modern.css\"`: the Modern theme.\n\t- `\"winter.css\"`: the festive Winter theme.\n\t- `\"occult.css\"`: a Satanic theme.\n\n#### <a href=\"#set_language\" id=\"set_language\">function `set_language(language_code)`</a>\n[`set_language`]: #set_language\n\nYou can kind of use this to change the language of the application. But actually it will show a prompt to the user to change the language, because the application needs to reload to apply the change.\nAnd if that dialog isn't in the right language, well, they'll probably be confused.\n\nArguments:\n- `language_code`: the language code to use, e.g. `\"en\"` for English, `\"zh\"` for Traditional Chinese, `\"zh-simplified\"` for Simplified Chinese, etc.\n\n#### Changelog\n\nThe API will change a lot, but changes will be documented in the [Changelog](CHANGELOG.md).\n\nNot just a history of changes, but a migration/upgrading guide. <!-- These are some Ctrl+F keywords. -->\n\nFor general project news, click **Extras > Project News** in the app.\n\n## License\n\nJS Paint is free and open source software, licensed under the permissive [MIT license](https://opensource.org/licenses/MIT).\n\n[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![GitHub Repo stars](https://img.shields.io/github/stars/1j01/jspaint?label=GitHub%20Stars&style=social)](https://github.com/1j01/jspaint/stargazers)\n[![GitHub forks](https://img.shields.io/github/forks/1j01/jspaint?style=social)](https://github.com/1j01/jspaint/network/members)\n\n"
  },
  {
    "path": "TODO.md",
    "content": "\n# ![](images/icons/32x32.png) JS Paint Todo\n\n### Help\n\n* Link-esque things\n\t* Popups (I'd probably make the text within the popups selectable)\n\t* Related topics (I'd probably make this a heading with links instead of the weird context menu thing)\n* Add topics\n\t* In \"Tips and Tricks\" (which is just a lame section)\n\t* Transparency\n\t* Multi-user / collaboration / \"To share the document On-Line\" or whatever\n* Index\n* Search\n* Keyboard support\n\n* Interactive tutorials?\n\t* Possibly hosted by Clippy, with [ClippyJS](https://www.smore.com/clippy-js)\n\t* Links the cat has a good \"GetArtsy\" animation, which would be good to use especially if talking about stamping and smearing selections\n\t* Highlight elements on the page\n\t* Be sure to cover undo/redo, and file saving\n\n### Visual\n\n* Fill bucket and airbrush cursors are supposed to invert the background in parts. This is not possible with `.png` files. Microsoft Edge also apparently requires `.cur` files for custom cursors. I already have `.cur` files in the repo for the modern theme (unused), and extracted (outside the repo) for the classic theme. I just need to copy them, rename them semantically, use them, and do some testing to see if format fallbacks work as expected.\n\n### Extended editing\n\n* Optional fill tolerance (slider that you enable from a settings menu?)\n\n* Transparency\n\t* Color opacity slider\n\t* Toggle between blend and copy (overwrite) modes\n\t* Maybe equivalize any rgba(X, X, X, 0) in fill algorithm?\n\tThere'd still be the possibility of 1/255th opacity pixels,\n\tbut if you're creating colors from the combination of a color picker and an opacity slider,\n\tyou might naturally introduce differing zero-opacity color values a lot.\n\n* Documents with multiple sub-images\n\t* Component to switch between sub-images\n\t* Handle undo/redo for sub-images\n\t* Animated GIFs\n\t\t* Transparency ([jnordberg/gif.js issue #5](https://github.com/jnordberg/gif.js/issues/5))\n\t* Animated Transparent APNGs\n\t\t* APNG Library: [UPNG.js](https://github.com/photopea/UPNG.js/) (already used for loading/saving PNGs)\n\t* Multi-size Icons\n\t\t* Windows ICO ([jBinary can read](https://jdataview.github.io/jBinary.Repo/demo/#ico) and presumably write ICO files)\n\t\t* Mac ICNS\n\t* Layered images\n\t\t* Photoshop PSD ([via psd.js](https://github.com/samccone/psd.js)\n\t\t* OpenRaster ORA ([via ora.js](https://github.com/zsgalusz/ora.js))\n\t* Paged Images\n\t\t* PDF (via [pdf.js](https://github.com/mozilla/pdf.js)) (single page already supported)\n\t\t* DjVu (via [djvu.js](https://djvu.js.org/))\n\t\t* TIFF (via [utif.js](https://github.com/photopea/UTIF.js/)) (single page/frame already supported)\n\n* Online (multi-user) and local (single-user) sessions\n\t* See [sessions.js](src/sessions.js)\n\t* Issues\n\t\t* There's no conflict resolution; user edits revert other user edits\n\t\t* It's not eventually consistent\n\t\t* Cursors from other users that go outside the parent can cause the page to be scrollable\n\n* Symmetry, tesselation, painting texture on 3D models, and even an infinite canvas, all could be done with a shared system \n\t* For symmetry and tesselation, [geometry can be generated](), and then it can work the same as painting on a 3D model\n\t* An infinite canvas engine would generate simple square geometry, but would require support for multiple editable textures (also useful for 3D models)\n\t\t* And of course layers and animations and multi-size icons need a similar system (multiple sub-images)\n\t* For 3D model painting, it's important to note there's a few different possible approaches.\n\t\t1. UV-dynamic, like [Chameleon](https://www-ui.is.s.u-tokyo.ac.jp/~takeo/chameleon/chameleon.htm) & [Chameleon.js](https://tomtung.github.io/chameleon.js/) (can adapt texture resolution as you paint)\n\t\t2. UV-static\n\t\t\t1. Ray tracing the pointer to find texture coordinates (gives texture coordinate space scaled result by default)\n\t\t\t2. Screen-space drawing (gives screen space scaled result by default); I saw a good medium post or two about this\n\t* Also, some approaches might not extend to tesselation and symmetry. [\"Very important, this means that we assume our uv has no overlapping triangles. So no \\[tileable\\] textures.\"](https://shahriyarshahrabi.medium.com/mesh-texture-painting-in-unity-using-shaders-8eb7fc31221c)\n\t* Existing 3D texturing systems:\n\t\t* Closed source project: https://discourse.threejs.org/t/a-fully-fledged-texture-painter-for-the-web/15678/16\n\t\t* Open source project with adaptive UVs: https://tomtung.github.io/chameleon.js/\n\t\t* Open source project with adaptive and static UV modes, for both painting and sculpting: https://github.com/stephomi/sculptgl (check Dynamic Topology > Activated)\n\n* Save text and record transformations so the image can be saved as\nSVG (or HTML?) with invisible selectable transformed text elements?\n\t* Every time you move a selection, duplicate the text and create a clip-path for both parts?\n\t\t* Make only one of them audible for screen-readers\n\n\n### Device support\n\n* Prevent text selection in buttons and history entries\n* Enlarge menus on touch devices\n* Enlarge window titlebar close buttons on touch devices\n* Magnifier: on touchscreens, wait until pointerup to zoom\n\t* To detect touchscreen usage, could keep track of whether the last pointermove had any buttons pressed... or use `pointerType`, right?\n* Alternative way to access \"Color Eraser\" feature without a secondary mouse button?\n* Alternative access to functionality that would normally require a keyboard (with a numpad!)\n\t* Numpad +/-: Increase/Decrease brush size, Double/Halve selection size, ...\n\t* Shift toggles a handful of things (could have one toggle button renamed contextually?):\n\t\t* Proportional Resize\n\t\t* Smear / Trail Selection\n\t\t* Snap to 8 directions\n\t\t\t* An isometric mode would also be good\n\t* Ctrl+Select: \"Crop To Selection\" menu option\n* Don't drag toolbars out into windows with touch, it's too easy to do accidentally\n\n### Tools\n\n* Select and Free-Form Select\n\t* Passive: create no undoables until you do something like move or invert the selection\n\t\t* You should be able to make a selection, then change the secondary color, then drag the selection cutting it out with the color you selected\n\t\t* Select and deselect with no actions in between should create no undoables\n\t* Proportionally resize selection while holding Shift\n\t\t* (or maybe by default? I feel like it should be the default, tbh.)\n\n\n* Text\n\t* If it would go over the edge of the canvas, reject the input (at least, that's what mspaint does)\n\t* Add padding left to text area when font has glyphs that extend left, like italic 'f' in Times New Roman\n\t\t* mspaint has access to font metrics\n\t\t* jspaint could render text to see when it would overflow\n\t\t\t* To do it efficiently,\n\t\t\t\t* Take all glyphs in the text\n\t\t\t\t\t* (And maybe a set of common letters like the alphabet)\n\t\t\t\t\t* Split with a library to handle Unicode (emojis etc.)\n\t\t\t\t* Uniquify\n\t\t\t\t* Place them *all on top of each other*, positioned absolutely, leaving room to the left of them to detect pixels\n\t\t\t\t* Scan the pixels at the left to find the maximum extent left\n\t\t\t\t* Could store, per font, what glyphs have been tested and what's the maximum extent detected, in order to not have to rerender these\n\t\t\t\t\t* \"What glyphs have been tested\" should be specific to font size and attributes, since an italic 'f' may extend more than a normal 'f' for instance\n\t* Store position of FontBox\n\n\n* Shape Styles\n\t* Shapes: respond to Ctrl (It's complicated)\n\t* Patterns (black and white mode, winter theme)\n\t\t* Check to make sure patterns are aligned properly for all the tools\n\t\t* There's supposed to be a mapping between color values and pattern fills, used by the text tool and for the palette when switching between modes (colors should be kept between going to black and white mode and back)\n\n\n### Desktop App (Electron)\n\nElectron boilerplate stuff:\n\n* Remember window position/state\n* Set up autoupdating\n* Keep window hidden until loaded (`show: false`, [`ready-to-show`](https://electronjs.org/docs/api/browser-window#event-ready-to-show))\n\nSecurity:\n\n* Context isolation\n* Disable multiplayer?? should be fine\n\nFunctionality:\n\n* Subwindows as separate windows\n* Document recovery without having to know about File > Manage Storage - pop up contextually with a dialog when you need it\n* Show link URLs when you hover over them, in the status bar (because we have a status bar! haha) (there's this API: [event: update-target-url](https://github.com/electron/electron/blob/master/docs/api/web-contents.md#event-update-target-url), which gave me the idea, or it could be implemented with mouse events)\n* Recent files (could also be implemented for 98.js.org in the future)\n* macOS:\n\t* `win.setSheetOffset` with the menu bar height\n* Windows: maybe handle `session-end` event and ask to save?\n* Detect if file changes on disk, ask if you want to reload it?\n\n### Also\n\n* Anything marked `@TODO` or `@FIXME` in the source code\n\n\n* See [Issues on GitHub](https://github.com/1j01/jspaint/issues)\n\n\n* CSS\n\t* DRY, especially button styles, with [os-gui](https://github.com/1j01/os-gui)\n\t* Clearer `z-index` handling, maybe with CSS variables?\n\n\n* JS\n\t* Organize things into files better; \"functions.js\" is like ONE step above saying \"code.js\"\n\t* `$ToolWindow` has a `$Button` facility; `$DialogWindow` overrides it with essentially a better one; now there's `showMessageBox` too! and `$ToolWindow` is a wrapper for OS-GUI's `$Window`, and should be removed at some point; btw, should `show_error_message` functionality be folded into `showMessageBox`?\n\t* Make code clearer / improve code quality\n\t\t* https://codeclimate.com/github/1j01/jspaint\n\n\n* Images\n\t* Use a shared sprite sheet per theme (and optimize it I guess)\n"
  },
  {
    "path": "about.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>JS Paint — MS Paint online</title>\n\n\t<!-- <meta http-equiv=\"Content-Security-Policy\" content=\"\n\t\tdefault-src 'self';\n\t\timg-src 'self' data: blob: http: https:;\n\t\"> -->\n\n\t<link href=\"styles/normalize.css\" rel=\"stylesheet\" type=\"text/css\">\n\t<!-- `styles/layout.css` includes `overflow: hidden` on the body and html elements, designed for the app,\n\t\twhich completely prevents scrolling, at least in Internet Explorer.\n\t\tDon't think we want `styles/layout.css`, but OS-GUI's `layout.css` is used for window elements. -->\n\t<!-- <link href=\"styles/layout.css\" class=\"flippable-layout-stylesheet\" rel=\"stylesheet\" type=\"text/css\"> -->\n\t<!-- <link href=\"styles/print.css\" rel=\"stylesheet\" type=\"text/css\" media=\"print\"> -->\n\t<link href=\"lib/os-gui/build/layout.css\" class=\"flippable-layout-stylesheet\" rel=\"stylesheet\" type=\"text/css\">\n\t<link href=\"lib/98.css/98.custom-build.css\" class=\"flippable-layout-stylesheet not-for-modern\" rel=\"stylesheet\"\n\t\ttype=\"text/css\">\n\n\t<link rel=\"apple-touch-icon\" href=\"images/icons/apple-icon-180x180.png\">\n\t<!-- Chrome will pick the largest image for some reason, instead of the most appropriate one. -->\n\t<!-- <link rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"images/icons/192x192.png\">\n\t\t<link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"images/icons/32x32.png\">\n\t\t<link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"images/icons/96x96.png\"> -->\n\t<!-- <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"images/icons/16x16.png\"> -->\n\t<link rel=\"shortcut icon\" href=\"favicon.ico\">\n\t<link rel=\"mask-icon\" href=\"images/icons/safari-pinned-tab.svg\" color=\"red\">\n\t<link rel=\"manifest\" href=\"manifest.webmanifest\">\n\t<meta name=\"msapplication-TileColor\" content=\"#008080\">\n\t<meta name=\"msapplication-TileImage\" content=\"images/icons/ms-icon-144x144.png\">\n\t<meta name=\"theme-color\" content=\"#000080\">\n\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n\t<meta name=\"description\" content=\"Classic MS Paint in the browser, with extra features\">\n\t<meta property=\"og:image:width\" content=\"279\">\n\t<meta property=\"og:image:height\" content=\"279\">\n\t<meta property=\"og:description\" content=\"Classic MS Paint in the browser, with extra features.\">\n\t<meta property=\"og:title\" content=\"JS Paint\">\n\t<meta property=\"og:url\" content=\"https://jspaint.app\">\n\t<meta property=\"og:image\" content=\"https://jspaint.app/images/icons/og-image-279x279.jpg\">\n\t<meta name=\"twitter:title\" content=\"JS Paint\">\n\t<meta name=\"twitter:description\" content=\"Classic MS Paint in the browser, with extra features\">\n\t<meta name=\"twitter:image\" content=\"https://jspaint.app/images/meta/twitter-card-plz-no-crop.png\">\n\t<meta name=\"twitter:card\" content=\"summary_large_image\">\n\t<meta name=\"twitter:site\" content=\"@isaiahodhner\">\n\t<meta name=\"twitter:creator\" content=\"@isaiahodhner\">\n\n\t<link rel=\"stylesheet\" href=\"styles/themes/classic.css\">\n\t<link rel=\"stylesheet\" href=\"styles/about.css\">\n</head>\n\n<body>\n\t<section id=\"main-section\">\n\t\t<h1 style=\"text-align: center;\">\n\t\t\t<a href=\"https://jspaint.app\" target=\"_blank\">\n\t\t\t\t<img src=\"images/icons/jspaint.svg\" width=\"192\" height=\"192\" alt=\"\">\n\t\t\t\t<br>\n\t\t\t\t<span id=\"jspaint-project-name\">JS Paint</span>\n\t\t\t</a>\n\t\t</h1>\n\n\t\t<p style=\"text-align: center;\">JS Paint is a pixel-perfect remake of Microsoft Paint that runs in the browser.\n\t\t</p>\n\n\t\t<p>\n\t\t\t<a href=\"https://github.com/1j01/jspaint/blob/master/LICENSE.txt\" target=\"_blank\"><img\n\t\t\t\t\tsrc=\"images/about/free.gif\" width=\"88\" height=\"39\" alt=\"Free\" style=\"vertical-align: middle\"></a>\n\t\t\tOpen source under the permissive\n\t\t\t<a href=\"https://github.com/1j01/jspaint/blob/master/LICENSE.txt\" target=\"_blank\">MIT License</a>.\n\t\t</p>\n\t\t<p>\n\t\t\t<a href=\"https://github.com/1j01/jspaint/issues\" target=\"_blank\"><img src=\"images/about/foco.gif\" width=\"40\"\n\t\t\t\t\theight=\"40\" alt=\"Ideas\" style=\"vertical-align: middle\"></a>\n\t\t\tRequest features and report bugs <a href=\"https://github.com/1j01/jspaint/issues\" target=\"_blank\">on\n\t\t\t\tGitHub</a>\n\t\t\tor <a href=\"mailto:isaiahodhner@gmail.com?subject=JS%20Paint\" target=\"_blank\">by email</a>.\n\t\t</p>\n\n\t\t<b>THIS SITE IS...</b>\n\t\t<img src=\"images/about/conpaint.gif\" width=\"350\" height=\"50\" alt=\"Under Construction\"\n\t\t\tstyle=\"vertical-align: middle; max-width: 100%; height: auto;\">\n\n\t\t<img src=\" images/about/red_paint_bucket_brush_md_clr_24887PURPLE.gif\" width=\"87\" height=\"100\"\n\t\t\talt=\"Paint bucket\" style=\"float: right\">\n\n\t\t<!-- <iframe src=\"index.html\" title=\"JS Paint app\" id=\"jspaint-iframe\"></iframe> -->\n\n\t\t<div class=\"window os-window focused\" id=\"os-window-jspaint\"\n\t\t\tstyle=\"width: 267px; height: 392px; touch-action: none; position: relative; z-index: 9; display: flex;\">\n\t\t\t<div class=\"window-titlebar\" style=\"touch-action: none;\"><img src=\"images/icons/16x16.png\" width=\"16\"\n\t\t\t\t\theight=\"16\" draggable=\"false\" style=\"width: 16px; height: 16px;\" alt=\"\">\n\t\t\t\t<div class=\"window-title-area\"><span class=\"window-title\">untitled - Paint</span></div><button\n\t\t\t\t\tclass=\"window-minimize-button window-action-minimize window-button\"\n\t\t\t\t\taria-label=\"Minimize window\"><span class=\"window-button-icon\"></span></button><button\n\t\t\t\t\tclass=\"window-maximize-button window-action-maximize window-button\"\n\t\t\t\t\taria-label=\"Maximize or restore window\"><span class=\"window-button-icon\"></span></button><button\n\t\t\t\t\tclass=\"window-close-button window-action-close window-button\" aria-label=\"Close window\"><span\n\t\t\t\t\t\tclass=\"window-button-icon\"></span></button>\n\t\t\t</div>\n\t\t\t<div class=\"window-content\" tabindex=\"-1\" style=\"outline: none; display: flex; flex-direction: column;\">\n\t\t\t\t<!-- <iframe id=\"jspaint-iframe\" src=\"index.html\" -->\n\t\t\t\t<iframe id=\"jspaint-iframe\" src=\"/\"\n\t\t\t\t\tstyle=\"min-width: 0px; min-height: 0px; flex: 1 1 1px; border: 0px;\"></iframe>\n\t\t\t</div>\n\t\t\t<!-- <div class=\"handle\"\n\t\t\tstyle=\"position: absolute; top: -2px; right: -2px; width: 4px; height: 4px; touch-action: none; cursor: ne-resize;\">\n\t\t</div>\n\t\t<div class=\"handle\"\n\t\t\tstyle=\"position: absolute; top: -2px; left: calc(2px); width: calc(100% - 8px + 4px); height: 4px; touch-action: none; cursor: n-resize;\">\n\t\t</div>\n\t\t<div class=\"handle\"\n\t\t\tstyle=\"position: absolute; top: -2px; left: -2px; width: 4px; height: 4px; touch-action: none; cursor: nw-resize;\">\n\t\t</div>\n\t\t<div class=\"handle\"\n\t\t\tstyle=\"position: absolute; top: calc(2px); left: -2px; width: 4px; height: calc(100% - 8px + 4px); touch-action: none; cursor: w-resize;\">\n\t\t</div>\n\t\t<div class=\"handle\"\n\t\t\tstyle=\"position: absolute; bottom: -2px; left: -2px; width: 4px; height: 4px; touch-action: none; cursor: sw-resize;\">\n\t\t</div>\n\t\t<div class=\"handle\"\n\t\t\tstyle=\"position: absolute; bottom: -2px; left: calc(2px); width: calc(100% - 8px + 4px); height: 4px; touch-action: none; cursor: s-resize;\">\n\t\t</div>\n\t\t<div class=\"handle\"\n\t\t\tstyle=\"position: absolute; bottom: -2px; right: -2px; width: 4px; height: 4px; touch-action: none; cursor: se-resize;\">\n\t\t</div>\n\t\t<div class=\"handle\"\n\t\t\tstyle=\"position: absolute; top: calc(2px); right: -2px; width: 4px; height: calc(100% - 8px + 4px); touch-action: none; cursor: e-resize;\">\n\t\t</div> -->\n\t\t</div>\n\t\t<div id=\"try-me\"\n\t\t\tstyle=\"position: absolute; margin-left: min(300px, 100vw - 80px); margin-top: -200px; z-index: 10; color: purple; font-weight: bold;\">\n\t\t\t<img src=\"images/about/izquierda.gif\" width=\"49\" height=\"23\" alt=\"hand pointing left\"\n\t\t\t\tstyle=\"vertical-align: middle\">\n\t\t\tTry&nbsp;me!\n\t\t\t<!-- <span style=\"color: red\">T</span><span style=\"color: orange\">r</span><span style=\"color: yellow\">y</span>&nbsp;<span\n\t\t\t\tstyle=\"color: green\">m</span><span style=\"color: blue\">e</span><span style=\"color: purple\">!</span> -->\n\t\t</div>\n\t\t<p>\n\t\t\t<a href=\"https://github.com/1j01/jspaint#readme\" target=\"_blank\"><img src=\"images/about/moreinfo_paint.gif\"\n\t\t\t\t\twidth=\"100\" height=\"60\" alt=\"More info\" style=\"vertical-align: middle\"></a>\n\t\t\tRead about the project and extra features on <a href=\"https://github.com/1j01/jspaint#readme\"\n\t\t\t\ttarget=\"_blank\">the readme</a>.\n\t\t</p>\n\t\t<p>\n\t\t\t<a href=\"https://www.paypal.me/IsaiahOdhner\" target=\"_blank\"><img src=\"images/about/money4.gif\" width=\"32\"\n\t\t\t\t\theight=\"32\" alt=\"$\" style=\"vertical-align: middle\"></a>\n\t\t\tSupport the project at <a href=\"https://www.paypal.me/IsaiahOdhner\"\n\t\t\t\ttarget=\"_blank\">paypal.me/IsaiahOdhner</a>.\n\t\t</p>\n\t</section>\n\n\t<section id=\"windows-98-section\">\n\t\t<h2>Windows 98 online</h2>\n\t\t<p>\n\t\t\t<a href=\"https://98.js.org\" target=\"_blank\">\n\t\t\t\t<img src=\"images/about/windows-button.gif\" width=\"40\" height=\"40\" alt=\"Windows logo button\">\n\t\t\t\t<img src=\"images/about/flagani.gif\" style=\"float: right\" width=\"138\" height=\"251\"\n\t\t\t\t\talt=\"Windows 98 flag pole animation\">\n\t\t\t</a>\n\t\t\tJS&nbsp;Paint is also included in a <b>web-based version of Windows&nbsp;98</b>,\n\t\t\talong with Notepad, Minesweeper, Sound Recorder, Calculator, and Winamp.\n\t\t</p>\n\t\t<br>\n\t\t<!--\n\t\tFancy multi-layered image link with a wooden window frame that zooms in on hover.\n\t\t-->\n\t\t<div id=\"enter-98-wrapper\">\n\t\t\t<a href=\"https://98.js.org\" target=\"_blank\" id=\"enter-98-link\">\n\t\t\t\t<img src=\"images/about/98.js.org.png\" width=\"360\" height=\"287\"\n\t\t\t\t\talt=\"Windows 98 desktop recreation with Minesweeper, Paint, and other programs\"\n\t\t\t\t\tstyle=\"position: absolute; left: 0; top: 0\">\n\t\t\t\t<img src=\"images/about/gatinha.gif\" width=\"126\" height=\"141\"\n\t\t\t\t\talt=\"White cat putting paws up and looking around\" style=\"position: absolute; bottom: 0\">\n\t\t\t\t<img src=\"images/about/WindowCLR_WRK.gif\" width=\"360\" height=\"287\" alt=\"windows swung open outwards\"\n\t\t\t\t\tid=\"wooden-window-frame\" style=\"position: absolute; left: 0; top: 0\">\n\t\t\t\t<img src=\"images/about/ENTERsolar.gif\" width=\"128\" height=\"45\" alt=\"ENTER / 由此進入\"\n\t\t\t\t\tstyle=\"position: absolute; left: 50%; top: 80%; transform: translate(-50%, -50%); mix-blend-mode: lighten\">\n\t\t\t</a>\n\t\t</div>\n\t\t<br>\n\t\t<br>\n\t</section>\n\n\t<section id=\"desktop-app-section\">\n\t\t<img src=\"images/about/cordborder.gif\" width=\"620\" height=\"23\" alt=\"\"\n\t\t\tstyle=\"margin: 0 auto; display: block; width: 100%; height: 23px; position: relative; top: -20px\">\n\t\t<h2 class=\"bg\">Desktop Version <img src=\"images/about/news.gif\" alt=\"(New!)\"></h2>\n\t\t<img src=\"images/about/atomo010.gif\" width=\"50\" height=\"50\" alt=\"built with Electron\"\n\t\t\tstyle=\"position: absolute; right: 5%\">\n\t\t<div style=\"position: absolute; left: 2%\">\n\t\t\t<img src=\"images/about/atomo010.gif\" width=\"50\" height=\"50\" alt=\"\" style=\"position: relative; top: 50px\">\n\t\t</div>\n\t\t<div style=\"position: absolute; right: 10%\">\n\t\t\t<img src=\"images/about/atomo010.gif\" width=\"50\" height=\"50\" alt=\"\"\n\t\t\t\tstyle=\"position: relative; top: min(390px, 60vw)\">\n\t\t</div>\n\t\t<img src=\"images/meta/electron-app-screenshot-mac.png\" width=\"592\" height=\"548\"\n\t\t\talt=\"screenshot of JS Paint Electron app running on macOS\"\n\t\t\tstyle=\"max-width: 100%; height: auto; margin: 0 auto; display: block\">\n\t\t<p class=\"bg\">\n\t\t\tFor a more native experience, you can install the JS Paint desktop app.\n\t\t\tIt works on Windows, macOS, and Linux.\n\t\t</p>\n\t\t<div class=\"bg\">\n\t\t\t<p>\n\t\t\t\t<strong>Features:</strong>\n\t\t\t</p>\n\t\t\t<ul>\n\t\t\t\t<li>Runs offline</li>\n\t\t\t\t<li>Clipboard support</li>\n\t\t\t\t<li>Open and save files like a native app</li>\n\t\t\t\t<!-- <li>Save directly to the open file instead of downloading a copy</li>\n\t\t\t\t<li>File associations (on macOS and Linux)</li>\n\t\t\t\t<li>Drag and drop to open files (drop onto desktop icon, dock icon, or window)</li> -->\n\t\t\t\t<!-- <li>Command line interface: <code>jspaint \"My Picture.bmp\"</code></li> -->\n\t\t\t\t<!-- <li>macOS titlebar integration\n\t\t\t\t\t(<img src=\"images/about/electron-app-titlebar-icon-mac.png\" width=\"16\" height=\"16\"\n\t\t\t\t\t\talt=\"image document\">\n\t\t\t\t\ticon next to file name shows saved state and\n\t\t\t\t\tcan be dragged into other apps to insert or open the image)</li> -->\n\t\t\t\t<li>Set wallpaper from File menu</li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<br>\n\t\t<h3>\n\t\t\t<img src=\"images/about/mn_download.gif\" width=\"168\" height=\"28\" alt=\"Download\">\n\t\t\t<!-- <img src=\"images/about/links.gif\" width=\"100\" height=\"60\" alt=\"Links\"> -->\n\t\t\t<img src=\"images/about/here.gif\" width=\"101\" height=\"45\" alt=\"Here\" style=\"position: relative; top: 7px\">\n\t\t\t<img src=\"images/about/grey-tabby.gif\" width=\"51\" height=\"116\" alt=\"Grey tabby cat\"\n\t\t\t\tstyle=\"position: relative; top: 27px\">\n\t\t</h3>\n\t\t<div id=\"compound-download-button\">\n\t\t\t<div id=\"compound-download-button-main-links\" style=\"width: fit-content\">\n\t\t\t\t<!-- Using class instead of id because element is cloned on Linux. -->\n\t\t\t\t<a href=\"https://github.com/1j01/jspaint/releases/\" target=\"_blank\" class=\"main-download-link\">\n\t\t\t\t\t<img src=\"images/about/download5.gif\" width=\"100\" height=\"40\" alt=\"Download\">\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t\t<!-- <a href=\"https://github.com/1j01/jspaint/issues/2\" target=\"_blank\">\n\t\t\t<img src=\"images/about/conpaint.gif\" width=\"350\" height=\"50\" alt=\"Under Construction\" style=\"max-width: 100%; height: auto;\">\n\t\t</a> -->\n\t\t\t<details id=\"more-download-options-expandable\">\n\t\t\t\t<summary id=\"more-download-options-toggle\" title=\"More download options\"></summary>\n\t\t\t\t<div id=\"more-download-options-dropdown\">\n\t\t\t\t\t<ul>\n\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t<a id=\"download-link-windows\"\n\t\t\t\t\t\t\t\thref=\"https://github.com/1j01/jspaint/releases/download/v1.0.0-beta.1/jspaint-1.0.0-Windows-x64-Setup.exe\"><span\n\t\t\t\t\t\t\t\t\tclass=\"os-icon\"><img src=\"images/about/windowslogo.gif\" width=\"34\" height=\"30\"\n\t\t\t\t\t\t\t\t\t\talt=\"Windows logo\"></span>Download for Windows (x64)\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t<a id=\"download-link-mac\"\n\t\t\t\t\t\t\t\thref=\"https://github.com/1j01/jspaint/releases/download/v1.0.0-beta.1/jspaint-1.0.0-Mac-x64.zip\"><span\n\t\t\t\t\t\t\t\t\tclass=\"os-icon\"><img src=\"images/about/maclogo.gif\" width=\"34\" height=\"29\"\n\t\t\t\t\t\t\t\t\t\talt=\"Macintosh logo\"></span>Download for Mac (x64)\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t<a id=\"download-link-linux-deb\"\n\t\t\t\t\t\t\t\thref=\"https://github.com/1j01/jspaint/releases/download/v1.0.0-beta.1/jspaint-1.0.0-Linux-x64.deb\"><span\n\t\t\t\t\t\t\t\t\tclass=\"os-icon\"><img src=\"images/about/linuxlogo.gif\" width=\"30\" height=\"35\"\n\t\t\t\t\t\t\t\t\t\talt=\"Linux mascot Tux the penguin\"></span>Download <span class=\"big\">.deb</span>\n\t\t\t\t\t\t\t\t(x64)\n\t\t\t\t\t\t\t\tfor Ubuntu, Debian, Mint, Kali, etc.\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t<a id=\"download-link-linux-rpm\"\n\t\t\t\t\t\t\t\thref=\"https://github.com/1j01/jspaint/releases/download/v1.0.0-beta.1/jspaint-1.0.0-Linux-x64.rpm\"><span\n\t\t\t\t\t\t\t\t\tclass=\"os-icon\"><img src=\"images/about/linuxlogo.gif\" width=\"30\" height=\"35\"\n\t\t\t\t\t\t\t\t\t\talt=\"Linux mascot Tux the penguin\"></span>Download <span class=\"big\">.rpm</span>\n\t\t\t\t\t\t\t\t(x64)\n\t\t\t\t\t\t\t\tfor Fedora, RHEL, CentOS, OpenSUSE, etc.\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t<!-- icon options: ✱, 📚, 🕓, 🔍, ↩️, github logo -->\n\t\t\t\t\t\t\t<a id=\"download-link-view-all-releases\"\n\t\t\t\t\t\t\t\thref=\"https://github.com/1j01/jspaint/releases/\"><span class=\"os-icon\">🕓</span>View all\n\t\t\t\t\t\t\t\treleases\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t</details>\n\t\t</div>\n\t\t<script>\n\t\t\tconst downloadLinkWindows = document.querySelector(\"#download-link-windows\");\n\t\t\tconst downloadLinkMac = document.querySelector(\"#download-link-mac\");\n\t\t\tconst downloadLinkLinuxDeb = document.querySelector(\"#download-link-linux-deb\");\n\t\t\tconst downloadLinkLinuxRpm = document.querySelector(\"#download-link-linux-rpm\");\n\t\t\tconst downloadLinkViewAllReleases = document.querySelector(\"#download-link-view-all-releases\");\n\t\t\tconst mainDownloadLink = document.querySelector(\".main-download-link\");\n\n\t\t\t/**\n\t\t\t * @returns {\"Windows\" | \"Mac\" | \"Linux\" | \"Android\" | \"iOS\" | \"Unknown\"}\n\t\t\t */\n\t\t\tfunction detectOS() {\n\t\t\t\tconst userAgent = window.navigator.userAgent,\n\t\t\t\t\tplatform = window.navigator?.userAgentData?.platform ?? window.navigator.platform;\n\t\t\t\tif (/^Mac|Darwin/i.test(platform)) {\n\t\t\t\t\treturn \"Mac\";\n\t\t\t\t} else if (/iPhone|iPod|iPad/i.test(platform)) {\n\t\t\t\t\treturn \"iOS\";\n\t\t\t\t} else if (/^Win/i.test(platform)) {\n\t\t\t\t\treturn \"Windows\";\n\t\t\t\t} else if (/Android/i.test(userAgent)) {\n\t\t\t\t\treturn \"Android\";\n\t\t\t\t} else if (/Linux/i.test(platform)) {\n\t\t\t\t\treturn \"Linux\";\n\t\t\t\t}\n\t\t\t\treturn \"Unknown\";\n\t\t\t}\n\n\t\t\tfunction updateDownloadLink() {\n\t\t\t\tconst os = detectOS();\n\t\t\t\tconst specificLink = {\n\t\t\t\t\t\"Windows\": downloadLinkWindows,\n\t\t\t\t\t\"Mac\": downloadLinkMac,\n\t\t\t\t\t\"iOS\": downloadLinkMac,\n\t\t\t\t\t\"Linux\": [downloadLinkLinuxDeb, downloadLinkLinuxRpm],\n\t\t\t\t}[os] ?? downloadLinkViewAllReleases;\n\t\t\t\tconst downloadImageHTML = mainDownloadLink.innerHTML + \"<br>\";\n\t\t\t\tif (specificLink instanceof Array) {\n\t\t\t\t\tconst mainDownloadLink2 = mainDownloadLink.cloneNode(true);\n\t\t\t\t\tmainDownloadLink.parentNode.insertBefore(mainDownloadLink2, mainDownloadLink.nextSibling);\n\n\t\t\t\t\tmainDownloadLink.href = specificLink[0].href;\n\t\t\t\t\tmainDownloadLink.innerHTML = specificLink[0].innerHTML.replace(\"Download\", downloadImageHTML);\n\n\t\t\t\t\tmainDownloadLink2.href = specificLink[1].href;\n\t\t\t\t\tmainDownloadLink2.innerHTML = specificLink[1].innerHTML.replace(\"Download\", downloadImageHTML);\n\n\t\t\t\t\tmainDownloadLink.querySelector(\".big\").style.fontSize = \"1.5em\";\n\t\t\t\t\tmainDownloadLink2.querySelector(\".big\").style.fontSize = \"1.5em\";\n\t\t\t\t} else if (specificLink) {\n\t\t\t\t\tmainDownloadLink.href = specificLink.href;\n\t\t\t\t\tmainDownloadLink.innerHTML = specificLink.innerHTML.replace(\"Download\", downloadImageHTML);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tupdateDownloadLink();\n\n\t\t\t// Close the dropdown when clicking outside of it\n\t\t\tdocument.addEventListener(\"click\", function (event) {\n\t\t\t\tconst details = document.querySelector(\"#more-download-options-expandable\");\n\t\t\t\tif (!details.contains(event.target)) {\n\t\t\t\t\tdetails.removeAttribute(\"open\");\n\t\t\t\t}\n\t\t\t});\n\n\t\t</script>\n\t\t<div style=\"position: absolute; right: 3%\">\n\t\t\t<img src=\"images/about/atomo010.gif\" width=\"50\" height=\"50\" alt=\"\" style=\"position: relative; bottom: 50px\">\n\t\t</div>\n\t\t<img src=\"images/about/cordborder.gif\" width=\"620\" height=\"23\" alt=\"\"\n\t\t\tstyle=\"margin: 0 auto; display: block; width: 100%; height: 23px; position: relative; top: 20px\">\n\t</section>\n\t<section id=\"pwa-section\">\n\t\t<h2>Progressive Web App</h2>\n\t\t<img src=\"images/meta/mobipaint.png\" width=\"308\" height=\"193\" alt=\"JS Paint on a phone\" style=\"float: right;\">\n\t\t<p>\n\t\t\tAlternatively, you can install JS Paint as a PWA (Progressive Web App),\n\t\t\tbut this does not <b>yet</b> support offline use\n\t\t\t(as it doesn't include a Service Worker).\n\t\t\tIt's more like a bookmark (for now), except it runs in a special window.\n\t\t</p>\n\t\t<p>\n\t\t\tThe user interface for installing PWAs differs by browser and operating system.\n\t\t</p>\n\t\t<p>\n\t\t\t<q>On most desktop browsers, the install prompt is in the URL bar.\n\t\t\t\tOn mobile, the install prompt is generally found in the menu of browser options.</q>\n\t\t\tSee <a\n\t\t\t\thref=\"https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Guides/Installing#installing_pwas\"\n\t\t\t\ttarget=\"_blank\">\n\t\t\t\tInstalling PWAs</a> for visual guidance.\n\t\t</p>\n\t\t<button id=\"install-pwa\" hidden style=\"padding: 10px 30px; margin-bottom: 1em;\">\n\t\t\t<img src=\"images/about/monitor.png\" width=\"16\" height=\"16\" alt=\"\" style=\"vertical-align: middle;\">\n\t\t\tInstall JS Paint\n\t\t</button>\n\t\t<!-- prevent floated image mobipaint.png overlapping next section -->\n\t\t<div style=\"clear: both;\"></div>\n\t</section>\n\t<section id=\"textual-paint-section\">\n\t\t<!--\n\t\t\t@TODO: test screen reader accessibility\n\t\t\tNotes about this heading:\n\t\t\t- FIGlet font used: \"small\"\n\t\t\t- Separate elements for each word allows word wrapping on narrow screens\n\t\t\t- Not using `<pre>` element because it's not allowed in a heading, and visa versa.\n\t\t\t\t- VS Code knows not to format `<pre>` elements but not arbitrary elements with `white-space: pre;`,\n\t\t\t\t  so I had to define \"html.format.unformattedContentDelimiter\" in .vscode/settings.json\n\t\t-->\n\t\t<!--no_format-->\n\t\t<h2 style=\"font-size: 1em\">\n\t\t\t<abbr title=\"Textual Paint\" style=\"text-decoration: none\">\n\t\t\t\t<span style=\"display: inline-block; white-space: pre; margin: 0;\">\n _____        _             _ \n|_   _|____ _| |_ _  _ __ _| |\n  | |/ -_) \\ /  _| || / _` | |\n  |_|\\___/_\\_\\\\__|\\_,_\\__,_|_|</span><span style=\"display: inline-block; white-space: pre; margin: 0;\">\n  ___      _     _   \n | _ \\__ _(_)_ _| |_ \n |  _/ _` | | ' \\  _|\n |_| \\__,_|_|_||_\\__|</span>\n\t\t\t</abbr>\n\t\t</h2>\n\t\t<!--no_format-->\n\t\t<br>\n\t\t<p>\n\t\t\tI also made a <em>separate</em> elaborate MS Paint clone that runs in the terminal,\n\t\t\tand edits ANSI art in addition to bitmaps.\n\t\t</p>\n\t\t<p>\n\t\t\tYou can install it with:\n\t\t\t<code>pip install textual-paint</code>\n\t\t</p>\n\t\t<p>\n\t\t\tAnd then run with simply:\n\t\t\t<code>textual-paint</code>\n\t\t</p>\n\t\t<p>\n\t\t\tRequires Python 3.10 or later, and a terminal emulator with Unicode and true color support.\n\t\t</p>\n\t\t<ul>\n\t\t\t<li>\n\t\t\t\t<span class=\"os-icon\"><img src=\"images/about/windowslogo.gif\" width=\"34\" height=\"30\"\n\t\t\t\t\t\talt=\"Windows logo\"></span>\n\t\t\t\tRuns well in <i>Windows Terminal</i>, but not in the older <i>Windows Console</i>.\n\t\t\t</li>\n\t\t\t<li>\n\t\t\t\t<span class=\"os-icon\"><img src=\"images/about/maclogo.gif\" width=\"34\" height=\"29\"\n\t\t\t\t\t\talt=\"Macintosh logo\"></span>\n\t\t\t\tRuns well in <i>iTerm2</i>, but not the built in macOS <i>Terminal.app</i>.\n\t\t\t</li>\n\t\t\t<li>\n\t\t\t\t<span class=\"os-icon\"><img src=\"images/about/linuxlogo.gif\" width=\"30\" height=\"35\"\n\t\t\t\t\t\talt=\"Linux mascot Tux the penguin\"></span>\n\t\t\t\tRuns well in <i>GNOME Terminal</i>, and most Linux terminal emulators, but not the <i>Linux console</i>.\n\t\t\t</li>\n\t\t</ul>\n\t\t<!-- <img src=\"images/about/dos-samp.gif\" width=\"391\" height=\"136\" alt=\"MS DOS prompt\"> -->\n\t\t<!-- TODO: PNG screenshot of GNOME terminal, which has the best rendering (SVG uses browser's rendering and displays artifacts); and include it in the repo -->\n\t\t<img src=\"https://raw.githubusercontent.com/1j01/textual-paint/v0.1.0/screenshot.svg\" width=\"1238\" height=\"1026\"\n\t\t\talt=\"screenshot of Textual Paint showing the About Paint dialog\" style=\"max-width: 100%; height: auto;\">\n\t\t<img src=\"images/about/Computer-04-june.gif\" width=\"134\" height=\"133\" alt=\"Computer typing on its own keyboard\"\n\t\t\tstyle=\"float: left\">\n\t\t<p>\n\t\t\t<a href=\"https://github.com/1j01/textual-paint\" target=\"_blank\">Textual Paint</a>\n\t\t\twas built using the <a href=\"https://textual.textualize.io/\" target=\"_blank\">Textual</a>\n\t\t\tframework, which was very fun to work with!\n\t\t</p>\n\t\t<p>\n\t\t\tI may have more Paint projects planned, the mad man that I am. 🎨\n\t\t</p>\n\t\t<p>\n\t\t\t<i style=\"color: gray\">What's more retro than a terminal-based Paint program, I wonder?</i>\n\t\t</p>\n\t</section>\n\t<section id=\"other-projects-section\">\n\t\t<!-- `clear: both` just in case the floated GIF intrudes too much, for instance if font sizes or margins were changed or paragraphs moved or removed. -->\n\t\t<h2 style=\"clear: both\">Other Projects</h2>\n\t\t<p style=\"float: right;\">\n\t\t\t<a href=\"https://isaiahodhner.io/\" target=\"_blank\">\n\t\t\t\t<img src=\"images/about/home.gif\" width=\"40\" height=\"40\" alt=\"Home button\"\n\t\t\t\t\tstyle=\"vertical-align: middle\">\n\t\t\t\tCheck out my home page for more projects!\n\t\t\t</a>\n\t\t</p>\n\t\t<p>\n\t\t\t<a href=\"https://isaiahodhner.io/\" target=\"_blank\"\n\t\t\t\tstyle=\"color: rgb(160, 42, 52); font-weight: bold; font-style: italic;\">\n\t\t\t\t<img src=\"images/about/artcreated.gif\" width=\"165\" height=\"136\" alt=\"Created by\">\n\t\t\t\t<br>\n\t\t\t\t<span style=\"display: block; text-align: center; width: 165px;\">\n\t\t\t\t\tIsaiah Odhner\n\t\t\t\t</span>\n\t\t\t</a>\n\t\t</p>\n\t\t<div id=\"junkbot-area\">\n\t\t\t<a href=\"https://1j01.github.io/janitorial-android/#junkbot\" target=\"_blank\">\n\t\t\t\t<img src=\"images/about/junkbot-collecting-bin.gif\" width=\"105\" height=\"126\"\n\t\t\t\t\talt=\"LEGO Junkbot minifig eating a recycling bin\" id=\"junkbot-img\"></a>\n\t\t\t<span id=\"feeding-text\" hidden>Please don't feed Junkbot.</span>\n\t\t</div>\n\t\t<a href=\"https://1j01.github.io/guitar/\" target=\"_blank\">\n\t\t\t<img src=\" images/about/guitar.gif\" width=\"60\" height=\"100\" alt=\"Guitar\" style=\"float: right;\">\n\t\t</a>\n\t\t<a href=\"https://1j01.github.io/true-random-movie/\" target=\"_blank\">\n\t\t\t<img src=\"images/about/filmreel.gif\" width=\"116\" height=\"50\" alt=\"film reel\" style=\"float: right;\">\n\t\t</a>\n\t\t<a href=\"https://1j01.github.io/dat-boi/\" target=\"_blank\">\n\t\t\t<img src=\"images/about/dat-boi-transparent-small.gif\" width=\"96\" height=\"120\" alt=\"Dat Boi\"\n\t\t\t\tstyle=\"float: right;\">\n\t\t</a>\n\t\t<a href=\"https://1j01.github.io/chess-mashup/\" target=\"_blank\">\n\t\t\t<img src=\"images/about/CHESS_CUBE.gif\" width=\"100\" height=\"90\" alt=\"Dat Boi\" style=\"float: right;\">\n\t\t</a>\n\t\t<!-- extends background when floated elements wrap -->\n\t\t<div style=\"clear: both;\"></div>\n\t</section>\n\t<section id=\"buttons-section\">\n\n\t\t<h3>Here are some buttons I made</h3>\n\t\t<p>\n\t\t\tFeel free to copy these to your site!\n\t\t\tSome of them are rubbish, but a few of them I'm quite happy with.\n\t\t</p>\n\t\t<p>\n\t\t\tRight click on the image and select \"Save image as...\" to download it,\n\t\t\tthen copy and paste the HTML code below it into your site,\n\t\t\tand update the <code>src</code> attribute to point to where you're hosting the image.\n\t\t</p>\n\t\t<a href=\"https://jspaint.app\">\n\t\t\t<img src=\"images/88x31/custom/jspaint-button-88x31.png\" width=\"88\" height=\"31\" alt=\"JS Paint\">\n\t\t</a>\n\t\t<a href=\"https://jspaint.app\">\n\t\t\t<img src=\"images/88x31/custom/jspaint-button-88x31-history.gif\" width=\"88\" height=\"31\" alt=\"JS Paint\">\n\t\t</a>\n\t\t<!-- <a href=\"https://jspaint.app\">\n\t\t\t<img src=\"images/88x31/custom/jspaint-button-basic-88x31-v1.png\" width=\"88\" height=\"31\" alt=\"JS Paint\">\n\t\t</a> -->\n\t\t<!-- <a href=\"https://jspaint.app\">\n\t\t\t<img src=\"images/88x31/custom/jspaint-button-88x31-v1.png\" width=\"88\" height=\"31\" alt=\"JS Paint\">\n\t\t</a> -->\n\t\t<a href=\"https://jspaint.app\">\n\t\t\t<img src=\"images/88x31/custom/jspaint-button-88x31-bubbly.png\" width=\"88\" height=\"31\" alt=\"JS Paint\">\n\t\t</a>\n\t\t<!-- <a href=\"https://jspaint.app\">\n\t\t\t<img src=\"images/88x31/custom/jspaint-button-88x31-bubbly-inverse.png\" width=\"88\" height=\"31\"\n\t\t\t\talt=\"JS Paint\">\n\t\t</a> -->\n\t\t<!-- <a href=\"https://jspaint.app\">\n\t\t\t<img src=\"images/88x31/custom/jspaint-button-88x31-custom-font.png\" width=\"88\" height=\"31\" alt=\"JS Paint\">\n\t\t</a> -->\n\t\t<!-- <a href=\"https://jspaint.app\">\n\t\t\t<img src=\"images/88x31/custom/jspaint-button-88x31-gray-border.png\" width=\"88\" height=\"31\" alt=\"JS Paint\">\n\t\t</a> -->\n\t\t<a href=\"https://jspaint.app\">\n\t\t\t<img src=\"images/88x31/custom/jspaint-button-88x31-v2-history.gif\" width=\"88\" height=\"31\" alt=\"JS Paint\">\n\t\t</a>\n\t\t<a href=\"https://jspaint.app\">\n\t\t\t<img src=\"images/88x31/custom/jspaint-button-88x31-v2.png\" width=\"88\" height=\"31\" alt=\"JS Paint\">\n\t\t</a>\n\t\t<!-- <img src=\"images/88x31/custom/made-with-jspaint-88x31-v1.png\" width=\"88\" height=\"31\" alt=\"Made with JS Paint\"> -->\n\t\t<a href=\"https://jspaint.app/about\">\n\t\t\t<img src=\"images/88x31/custom/made-with-jspaint-88x31-v2.png\" width=\"88\" height=\"31\"\n\t\t\t\talt=\"Made with JS Paint\">\n\t\t</a>\n\t\t<!-- <a href=\"https://jspaint.app/about\">\n\t\t\t<img src=\"images/88x31/custom/made-with-jspaint-88x31-v3.png\" width=\"88\" height=\"31\"\n\t\t\t\talt=\"Made with JS Paint\">\n\t\t</a> -->\n\t\t<!-- <img src=\"images/88x31/custom/made-with-jspaint-88x31-v4.png\" width=\"88\" height=\"31\" alt=\"Made with JS Paint\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/made-with-jspaint-88x31-v5-history.gif\" width=\"88\" height=\"31\" alt=\"Made with JS Paint\"> -->\n\t\t<a href=\"https://jspaint.app/about\">\n\t\t\t<img src=\"images/88x31/custom/made-with-jspaint-88x31-v5.png\" width=\"88\" height=\"31\"\n\t\t\t\talt=\"Made with JS Paint\">\n\t\t</a>\n\n\t\t<a href=\"https://98.js.org\">\n\t\t\t<img src=\"images/88x31/custom/98.js.org-88x31.png\" width=\"88\" height=\"31\" alt=\"98.JS\">\n\t\t</a>\n\n\t\t<!-- <img src=\"images/88x31/custom/take-this-88x31-v1.png\" width=\"88\" height=\"31\" alt=\"It's dangerous to go alone. Take this, Now!\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/take-this-88x31-v2.png\" width=\"88\" height=\"31\" alt=\"It's dangerous to go alone. Take this, Now!\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/take-this-88x31-v2-frame-2.png\" width=\"88\" height=\"31\" alt=\"It's dangerous to go alone. Take this, Now!\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/take-this-88x31-v2-history.gif\" width=\"88\" height=\"31\" alt=\"It's dangerous to go alone. Take this, Now!\"> -->\n\t\t<img src=\"images/88x31/custom/take-this-88x31-v2.gif\" width=\"88\" height=\"31\"\n\t\t\talt=\"It's dangerous to go alone. Take this, Now! (Legend of Zelda parody)\">\n\t\t<!-- <img src=\"images/88x31/custom/turbo-encabulator-88x31-v0.psd\" width=\"88\" height=\"31\" alt=\"It's dangerous to go alone. Take this, Now!\"> -->\n\t\t<a href=\"https://youtu.be/lVZ8Ko-nss4\">\n\t\t\t<img src=\" images/88x31/custom/turbo-encabulator-88x31-v1.png\" width=\"88\" height=\"31\"\n\t\t\t\talt=\"Powered by turbo encabulator\">\n\t\t</a>\n\t\t<!-- <img src=\"images/88x31/custom/vs-code-88x31-v0.1.png\" width=\"88\" height=\"31\" alt=\"Built with VS Code\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/vs-code-88x31-v0.png\" width=\"88\" height=\"31\" alt=\"Built with VS Code\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/vs-code-88x31-v1.png\" width=\"88\" height=\"31\" alt=\"Built with VS Code\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/vs-code-88x31-v1-history.gif\" width=\"88\" height=\"31\" alt=\"Built with VS Code\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/vs-code-88x31-v2-stupid-garbage.png\" width=\"88\" height=\"31\" alt=\"Built with VS Code\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/vs-code-88x31-v3-no-border.png\" width=\"88\" height=\"31\" alt=\"Built with VS Code\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/vs-code-88x31-v4-overlapping-border.png\" width=\"88\" height=\"31\" alt=\"Built with VS Code\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/vs-code-88x31-v5-history.gif\" width=\"88\" height=\"31\" alt=\"Built with VS Code\"> -->\n\t\t<a href=\"https://code.visualstudio.com/\">\n\t\t\t<img src=\"images/88x31/custom/vs-code-88x31-v5-within-border.png\" width=\"88\" height=\"31\"\n\t\t\t\talt=\"Built with VS Code\">\n\t\t</a>\n\t\t<!-- <img src=\"images/88x31/custom/vs-code-88x31-v6-shadow.png\" width=\"88\" height=\"31\" alt=\"Built with VS Code\"> -->\n\t\t<a href=\"https://code.visualstudio.com/\">\n\t\t\t<img src=\"images/88x31/custom/vs-code-88x31-v7-animated.gif\" width=\"88\" height=\"31\"\n\t\t\t\talt=\"Built with VS Code\">\n\t\t</a>\n\t\t<!-- <img src=\"images/88x31/custom/windows-7.png\" width=\"88\" height=\"31\" alt=\"Windows 7 was Microsoft's last decent operating system\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/windows-7-template-88x31.png\" width=\"88\" height=\"31\" alt=\"Windows 7\"> -->\n\t\t<img src=\"images/88x31/custom/windows-7-vs-11.png\" width=\"88\" height=\"31\"\n\t\t\talt=\"Windows 7 is still better than Windows 11\">\n\t\t<!-- <img src=\"images/88x31/custom/creative-constraints-88x31.png\" width=\"88\" height=\"31\" alt=\"Creative constraints\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/creative-constraints-88x31-v2.png\" width=\"88\" height=\"31\"\n\t\t\talt=\"Creative constraints\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/creative-constraints-88x31-v3.png\" width=\"88\" height=\"31\"\n\t\t\talt=\"Creative constraints\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/creative-constraints-88x31-v4.png\" width=\"88\" height=\"31\"\n\t\t\talt=\"Creative constraints\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/creative-constraints-88x31-v5.png\" width=\"88\" height=\"31\"\n\t\t\talt=\"Creative constraints\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/creative-constraints-88x31-v6.png\" width=\"88\" height=\"31\"\n\t\t\talt=\"Creative constraints\"> -->\n\t\t<a href=\"https://jspaint.app/about\">\n\t\t\t<img src=\"images/88x31/custom/creative-constraints-88x31-v7-history.gif\" width=\"88\" height=\"31\"\n\t\t\t\talt=\"Creative constraints (doodle progress animation)\">\n\t\t</a>\n\t\t<a href=\"https://jspaint.app/about\">\n\t\t\t<img src=\"images/88x31/custom/creative-constraints-88x31-v7.png\" width=\"88\" height=\"31\"\n\t\t\t\talt=\"Creative constraints\">\n\t\t</a>\n\t\t<!-- <img src=\"images/88x31/custom/electron-sucks-88x31-v0.png\" width=\"88\" height=\"31\" alt=\"I hate Electron!\"> -->\n\t\t<img src=\"images/88x31/custom/electron-sucks-88x31-v1.png\" width=\"88\" height=\"31\" alt=\"I hate Electron!\">\n\t\t<!-- <img src=\"images/88x31/custom/how-now-brown-cow-88x31-v1.png\" width=\"88\" height=\"31\" alt=\"How Now! (brown cow)\"> -->\n\t\t<img src=\"images/88x31/custom/how-now-brown-cow-88x31-v2.png\" width=\"88\" height=\"31\" alt=\"How Now! (brown cow)\">\n\t\t<!-- <img src=\"images/88x31/custom/junkbot-play-88x31-frame-1.png\" width=\"88\" height=\"31\" alt=\"Play LEGO Junkbot\">\n\t\t<img src=\"images/88x31/custom/junkbot-play-88x31-frame-2.png\" width=\"88\" height=\"31\" alt=\"Play LEGO Junkbot\">\n\t\t<img src=\"images/88x31/custom/junkbot-play-88x31-frame-3.png\" width=\"88\" height=\"31\" alt=\"Play LEGO Junkbot\">\n\t\t<img src=\"images/88x31/custom/junkbot-play-88x31-frame-4.png\" width=\"88\" height=\"31\" alt=\"Play LEGO Junkbot\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/junkbot-88x31-v0.png\" width=\"88\" height=\"31\" alt=\"Play LEGO Junkbot\"> -->\n\t\t<a href=\"https://github.com/1j01/janitorial-android/?tab=readme-ov-file#readme\">\n\t\t\t<img src=\"images/88x31/custom/junkbot-88x31-v1.png\" width=\"88\" height=\"31\" alt=\"Play LEGO Junkbot\">\n\t\t</a>\n\t\t<!-- <img src=\"images/88x31/custom/junkbot-88x31-v2.png\" width=\"88\" height=\"31\" alt=\"Play LEGO Junkbot\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/junkbot-88x31-v3.png\" width=\"88\" height=\"31\" alt=\"Play LEGO Junkbot\"> -->\n\t\t<!-- <a href=\"https://github.com/1j01/janitorial-android/?tab=readme-ov-file#readme\">\n\t\t\t<img src=\"images/88x31/custom/junkbot-88x31-v4.png\" width=\"88\" height=\"31\" alt=\"Play LEGO Junkbot\">\n\t\t</a> -->\n\t\t<a href=\"https://github.com/1j01/janitorial-android/?tab=readme-ov-file#readme\">\n\t\t\t<img src=\"images/88x31/custom/junkbot-88x31-v5.png\" width=\"88\" height=\"31\" alt=\"Play LEGO Junkbot\">\n\t\t</a>\n\t\t<!-- <img src=\"images/88x31/custom/junkbot-88x31-v6.png\" width=\"88\" height=\"31\" alt=\"Play LEGO Junkbot\"> -->\n\t\t<a href=\"https://github.com/1j01/janitorial-android/?tab=readme-ov-file#readme\">\n\t\t\t<img src=\"images/88x31/custom/junkbot-88x31-v7.png\" width=\"88\" height=\"31\" alt=\"Play LEGO Junkbot\">\n\t\t</a>\n\t\t<!-- <img src=\"images/88x31/custom/junkbot-88x31-v8.png\" width=\"88\" height=\"31\" alt=\"Play LEGO Junkbot\"> -->\n\t\t<!-- <a href=\"https://github.com/1j01/janitorial-android/?tab=readme-ov-file#readme\">\n\t\t\t<img src=\"images/88x31/custom/junkbot-88x31-v9-history.gif\" width=\"88\" height=\"31\"\n\t\t\t\talt=\"LEGO Junkbot button graphic progress animation\">\n\t\t</a> -->\n\t\t<a href=\"https://github.com/1j01/janitorial-android/?tab=readme-ov-file#readme\">\n\t\t\t<img src=\"images/88x31/custom/junkbot-88x31-v9.png\" width=\"88\" height=\"31\" alt=\"Play LEGO Junkbot\">\n\t\t</a>\n\t\t<!-- <img src=\"images/88x31/custom/pipe-strip-88x31-v0.psd\" width=\"88\" height=\"31\" alt=\"The Pipe Strip\">\n\t\t<img src=\"images/88x31/custom/pipe-strip-88x31-v1.png\" width=\"88\" height=\"31\" alt=\"The Pipe Strip\">\n\t\t<img src=\"images/88x31/custom/pipe-strip-88x31-v1.psd\" width=\"88\" height=\"31\" alt=\"The Pipe Strip\">\n\t\t<img src=\"images/88x31/custom/pipe-strip-88x31-v2.png\" width=\"88\" height=\"31\" alt=\"The Pipe Strip\">\n\t\t<img src=\"images/88x31/custom/pipe-strip-88x31-v2.psd\" width=\"88\" height=\"31\" alt=\"The Pipe Strip\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/pipe-strip-88x31-v3.png\" width=\"88\" height=\"31\" alt=\"The Pipe Strip\"> -->\n\t\t<!-- <img src=\"images/88x31/custom/pipe-strip-88x31-v3.psd\" width=\"88\" height=\"31\" alt=\"The Pipe Strip\"> -->\n\t\t<a href=\"https://pypi.org/project/pipe-strip/\">\n\t\t\t<img src=\"images/88x31/custom/pipe-strip-88x31-v4.png\" width=\"88\" height=\"31\"\n\t\t\t\talt=\"Panel 1. Jon is sitting on the sofa reading the newspaper, and he searches the table beside him with his hand. Panel 2. Jon, no longer relaxing with his leg kicked up turns to face the viewer, and thinks to himself, &quot;Now where could my pipe be?&quot; Panel 3. Garfield, Jon's orange tabby cat, is smoking Jon's pipe. Jon is shocked and shouts from off-screen &quot;Garfield!!&quot;\">\n\t\t</a>\n\t\t<!-- <img src=\"images/88x31/custom/pipe-strip-88x31-v4.psd\" width=\"88\" height=\"31\" alt=\"The Pipe Strip\"> -->\n\t\t<a href=\"https://www.youtube.com/watch?v=k1BneeJTDcU\">\n\t\t\t<img src=\"images/88x31/custom/a-little-bit-of-everything.gif\" width=\"88\" height=\"31\"\n\t\t\t\talt=\"A little bit of everything, Now!\">\n\t\t</a>\n\t\t<a href=\"https://ublockorigin.com/\">\n\t\t\t<img src=\"images/88x31/custom/ublock-origin-88x31-v2.png\" width=\"88\" height=\"31\"\n\t\t\t\talt=\"Get uBlock Origin now!\">\n\t\t</a>\n\t\t<a href=\"https://ublockorigin.com/\">\n\t\t\t<img src=\"images/88x31/custom/ublock-origin-88x31.gif\" width=\"88\" height=\"31\" alt=\"Get uBlock Origin now!\">\n\t\t</a>\n\n\t\t<h3>Here are some buttons I collected</h3>\n\t\t<p>\n\t\t\tI don't know where most of these came from, and I've repurposed some of them.\n\t\t</p>\n\t\t<img src=\"images/88x31/collected/mspaint.gif\" width=\"88\" height=\"31\" alt=\"Long live MS Paint!\">\n\t\t<img src=\"images/88x31/collected/mousemade.gif\" width=\"88\" height=\"31\" alt=\"Made with Mouse\">\n\t\t<a href=\"https://98.js.org/\">\n\t\t\t<img src=\"images/88x31/collected/mswin98_89.gif\" width=\"88\" height=\"31\"\n\t\t\t\talt=\"Made with Microsoft Windows 98. Get!\">\n\t\t</a>\n\t\t<a\n\t\t\thref=\"https://www.eff.org/deeplinks/2021/03/google-testing-its-controversial-new-ad-targeting-tech-millions-browsers-heres\"><img\n\t\t\t\tsrc=\"images/88x31/collected/abc.gif\" title=\"Please use any browser but Chrome\">\n\t\t</a>\n\t\t<a href=\"https://rainy.gay/other/buttons\">\n\t\t\t<img src=\"images/88x31/collected/antinft.gif\" width=\"88\" height=\"31\" alt=\"This is an anti-NFT site.\">\n\t\t</a>\n\t\t<img src=\"images/88x31/collected/nofuckingthanks.gif\" width=\"88\" height=\"31\" alt=\"NFT - No Fucking Thanks\">\n\t\t<a href=\"https://www.getpaint.net/\">\n\t\t\t<img src=\"images/88x31/collected/paintnet.gif\" width=\"88\" height=\"31\" alt=\"Get Paint.NET\">\n\t\t</a>\n\t\t<img src=\"images/88x31/collected/goodieblink.png\" width=\"88\" height=\"31\" alt=\"graphic design is my passion\">\n\t\t<img src=\"images/88x31/collected/google_stand.gif\" width=\"88\" height=\"31\"\n\t\t\talt=\"Fight for open web standards. Fight for online privacy. Fight against monopolistic practices. Stand up to Google!\">\n\t\t<img src=\"images/88x31/collected/imissxp.gif\" width=\"88\" height=\"31\" alt=\"I miss Windows XP\">\n\t\t<a href=\"https://archive.org/\">\n\t\t\t<img src=\"images/88x31/collected/internetarchive.gif\" width=\"88\" height=\"31\" alt=\"Internet Archive\">\n\t\t</a>\n\t\t<img src=\"images/88x31/collected/is_it_slow_say_so.gif\" width=\"88\" height=\"31\" alt=\"Is it slow? Say so!\">\n\t\t<img src=\"images/88x31/collected/new-tab.gif\" width=\"88\" height=\"31\"\n\t\t\talt=\"Please do not force this img to be lonely\">\n\t\t<img src=\"images/88x31/collected/nneighborhoodsmall.gif\" width=\"88\" height=\"31\" alt=\"Network neighborhood\">\n\t\t<a href=\"https://code.visualstudio.com/\">\n\t\t\t<img src=\"images/88x31/collected/vscbutton.gif\" width=\"88\" height=\"31\" alt=\"Visual Studio Code\">\n\t\t</a>\n\t\t<a href=\"https://youtu.be/JcJSW7Rprio\">\n\t\t\t<img src=\"images/88x31/collected/webdisk.gif\" width=\"88\" height=\"31\" alt=\"WebDisk, Now\">\n\t\t</a>\n\t\t<a href=\"https://jspaint.app\">\n\t\t\t<img src=\"images/88x31/collected/yay_its_a_button.gif\" width=\"88\" height=\"31\" alt=\"I use MS Paint\">\n\t\t</a>\n\t\t<a href=\"https://98.js.org\">\n\t\t\t<img src=\"images/88x31/collected/98plusani.gif\" width=\"88\" height=\"31\" alt=\"98 Plus!\">\n\t\t</a>\n\t\t<a href=\"https://flashpointarchive.org/\">\n\t\t\t<img src=\"images/88x31/collected/adobe_getflashp.gif\" width=\"88\" height=\"31\"\n\t\t\t\talt=\"Get Flashpoint web game archive\">\n\t\t</a>\n\t\t<img src=\"images/88x31/collected/anibanner.gif\" width=\"88\" height=\"31\" alt=\"Up all night\">\n\t\t<img src=\"images/88x31/collected/bookmark_this_page.gif\" width=\"88\" height=\"31\" alt=\"Bookmark this page\">\n\t\t<img src=\"images/88x31/collected/cssdif.gif\" width=\"88\" height=\"31\" alt=\"CSS is difficult\">\n\t\t<img src=\"images/88x31/collected/dark-mode.gif\" width=\"88\" height=\"31\" alt=\"Made for dark mode\">\n\t\t<a href=\"https://duckduckgo.com/\">\n\t\t\t<img src=\"images/88x31/collected/ddg.gif\" width=\"88\" height=\"31\" alt=\"DuckDuckGo\">\n\t\t</a>\n\t\t<a href=\"https://neocities.org/\">\n\t\t\t<img src=\"images/88x31/collected/delete-twitter.gif\" width=\"88\" height=\"31\"\n\t\t\t\talt=\"Delete Twitter. Make a Neocities.\">\n\t\t</a>\n\t\t<img src=\"images/88x31/collected/desp-anim.gif\" width=\"88\" height=\"31\" alt=\"Despacito, Now!\">\n\t\t<img src=\"images/88x31/collected/diff-now.gif\" width=\"88\" height=\"31\"\n\t\t\talt=\"Something completely different, Now!\">\n\t\t<a href=\"https://webamp.org/\">\n\t\t\t<img src=\"images/88x31/collected/winamp.gif\" width=\"88\" height=\"31\" alt=\"Winamp\">\n\t\t</a>\n\t\t<a onclick=\"{\n\t\t\tconst bubbles = document.createElement('img');\n\t\t\tbubbles.src = 'images/about/bubbles.webp';\n\t\t\tbubbles.width = 732;\n\t\t\tbubbles.height = 544;\n\t\t\tbubbles.style.pointerEvents = 'none';\n\t\t\tbubbles.style.position = 'fixed';\n\t\t\tbubbles.style.left = event.clientX - bubbles.width / 2 + 'px';\n\t\t\tbubbles.style.top = event.clientY - bubbles.height + 'px';\n\t\t\tdocument.body.appendChild(bubbles);\n\t\t\tsetTimeout(() => bubbles.remove(), 5000);\n\t\t\tbubbles.addEventListener('transitionend', () => bubbles.remove());\n\t\t\tbubbles.style.transition = 'transform 5s, opacity 5s';\n\t\t\tsetTimeout(() => {\n\t\t\t\tbubbles.style.transform = 'translate(-50%, -50%) scale(2)';\n\t\t\t\tbubbles.style.opacity = 0;\n\t\t\t});\n\t\t}\" style=\"cursor: pointer;\">\n\t\t\t<img src=\"images/88x31/collected/digby88.gif\" width=\"88\" height=\"31\" alt=\"bubbles\">\n\t\t</a>\n\t\t<a onclick=\"{\n\t\t\tif (window.eSheep) {\n\t\t\t\taddSheep();\n\t\t\t} else {\n\t\t\t\tconst scriptURL = 'https://adrianotiger.github.io/web-esheep/dist/esheep.min.js';\n\t\t\t\tconst script = document.createElement('script');\n\t\t\t\tscript.src = scriptURL;\n\t\t\t\tscript.onload = addSheep;\n\t\t\t\tscript.onerror = () => {\n\t\t\t\t\talert('Failed to load eSheep!');\n\t\t\t\t};\n\t\t\t\tdocument.head.appendChild(script);\n\t\t\t\t// Make eSheep land on more surfaces\n\t\t\t\t// It only lands on div and hr elements:\n\t\t\t\t// https://github.com/Adrianotiger/web-esheep/blob/641210d262e484cab5441c6b5c8fe2c9c28bed58/src/esheep.js#L65\n\t\t\t\t// which have a top border:\n\t\t\t\t// https://github.com/Adrianotiger/web-esheep/blob/641210d262e484cab5441c6b5c8fe2c9c28bed58/src/esheep.js#L601\n\t\t\t\t// and isn't configurable, as of writing.\n\t\t\t\tfor (const section of document.querySelectorAll('section, footer')) {\n\t\t\t\t\tconst hr = document.createElement('hr');\n\t\t\t\t\thr.style.border = '0';\n\t\t\t\t\thr.style.borderTop = '1px solid transparent';\n\t\t\t\t\thr.style.margin = '0';\n\t\t\t\t\thr.style.marginTop = '-1px';\n\t\t\t\t\tsection.parentNode.insertBefore(hr, section);\n\t\t\t\t\thr.classList.add('eSheep-landing-surface');\n\t\t\t\t}\n\t\t\t}\n\t\t\tfunction addSheep() {\n\t\t\t\tconst sheep = new eSheep();\n\t\t\t\tsheep.Start();\n\t\t\t\t// Not part of public API, and doesn't work, possibly because it's not loaded yet.\n\t\t\t\t//sheep._setPosition?.(event.clientX, event.clientY);\n\t\t\t\t// Give some visual feedback that the sheep is being added.\n\t\t\t\tevent.target.style.transform = 'scale(1.5)';\n\t\t\t\tsetTimeout(() => event.target.style.transform = '', 100);\n\t\t\t}\n\t\t}\" style=\"cursor: pointer;\">\n\t\t\t<img src=\"images/88x31/collected/esheep.gif\" width=\"88\" height=\"31\" alt=\"eSheep, Now!\">\n\t\t</a>\n\t\t<a href=\"https://ezgif.com/\">\n\t\t\t<img src=\"images/88x31/collected/ezgif_now.gif\" width=\"88\" height=\"31\" alt=\"EZGIF.COM, Now!\">\n\t\t</a>\n\t\t<a href=\"https://imgur.com/gallery/KXr07TX\">\n\t\t\t<img src=\"images/88x31/collected/folder2.gif\" width=\"88\" height=\"31\" alt=\"A folder with several tabs\">\n\t\t</a>\n\t\t<a href=\"https://isaiahodhner.io/games\">\n\t\t\t<img src=\"images/88x31/collected/games.gif\" width=\"88\" height=\"31\" alt=\"Games\">\n\t\t</a>\n\t\t<a href=\"https://pages.github.com/\">\n\t\t\t<img src=\"images/88x31/collected/gh-pages-bo.gif\" width=\"88\" height=\"31\"\n\t\t\t\talt=\"Powered by Microsoft GitHub Pages\">\n\t\t</a>\n\t\t<a href=\"https://github.com/1j01\">\n\t\t\t<img src=\"images/88x31/collected/github-check.gif\" width=\"88\" height=\"31\" alt=\"Check out my GitHub!\">\n\t\t</a>\n\t</section>\n\n\t<script>\n\t\t// Ideally this would be baked into the HTML, but this is nice and automatic.\n\t\tfor (const button of document.querySelectorAll(\"#buttons-section img\")) {\n\t\t\tconst subject = button.closest(\"a\") ?? button;\n\t\t\tconst wrapper = document.createElement(\"div\");\n\t\t\twrapper.style.display = \"inline-block\";\n\t\t\twrapper.style.margin = \"0 10px 10px 0\";\n\t\t\tconst textarea = document.createElement(\"textarea\");\n\t\t\tconst html = subject.outerHTML;\n\t\t\t// Normalize indentation for the snippet.\n\t\t\t// The last indentation in the HTML will be for the closing tag, if applicable,\n\t\t\t// which should not end up indented, and works for a search string to replace.\n\t\t\t// The first indentation, by contrast, will include one more indent level,\n\t\t\t// and so isn't suitable as a search string.\n\t\t\tconst lastIndentation = html.match(/^\\s*/gm).pop() ?? \"\";\n\t\t\ttextarea.value = html\n\t\t\t\t.replace(new RegExp(\"^\" + lastIndentation, \"gm\"), \"\");\n\t\t\ttextarea.style.width = \"88px\";\n\t\t\ttextarea.style.height = \"31px\";\n\t\t\t//textarea.style.resize = \"none\";\n\t\t\ttextarea.style.display = \"block\";\n\t\t\twrapper.appendChild(textarea);\n\n\t\t\t// Order matters here, because `appendChild` moves the element.\n\t\t\tsubject.parentNode.insertBefore(wrapper, subject);\n\t\t\twrapper.insertBefore(subject, textarea);\n\t\t}\n\t\t// Resize textareas back to normal when clicking outside of them.\n\t\t// This isn't necessarily great for usability (it may be surprising),\n\t\t// but it's kind of fun and restores the even grid, which is nice for aesthetics.\n\t\t// It shouldn't hamper usability too much, since you can still expand multiple at once if you wish.\n\t\tfunction restoreTextareaSizes() {\n\t\t\tfor (const textarea of document.querySelectorAll(\"#buttons-section textarea\")) {\n\t\t\t\tif (getComputedStyle(textarea).width !== \"88px\" || getComputedStyle(textarea).height !== \"31px\") {\n\t\t\t\t\ttextarea.style.transition = \"width 0.5s, height 0.5s\";\n\t\t\t\t\ttextarea.style.width = \"88px\";\n\t\t\t\t\ttextarea.style.height = \"31px\";\n\t\t\t\t\ttextarea.addEventListener(\"transitionend\", function () {\n\t\t\t\t\t\ttextarea.style.transition = \"\";\n\t\t\t\t\t}, { once: true });\n\t\t\t\t\t// In case resize handle is grabbed during transition,\n\t\t\t\t\t// interrupt the resize animation, to prevent a sluggish feeling\n\t\t\t\t\t// from the transition being constantly restarted.\n\t\t\t\t\t// (Test this by increasing the transition duration significantly!)\n\t\t\t\t\ttextarea.addEventListener(\"transitioncancel\", function () {\n\t\t\t\t\t\ttextarea.style.transition = \"\";\n\t\t\t\t\t}, { once: true });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdocument.addEventListener(\"click\", function (event) {\n\t\t\tif (!event.target.closest(\"#buttons-section textarea\")) {\n\t\t\t\trestoreTextareaSizes();\n\t\t\t}\n\t\t});\n\t</script>\n\n\t<script>\n\t\tvar maxButton = document.querySelector(\".window-maximize-button\");\n\t\tvar closeButton = document.querySelector(\".window-close-button\");\n\t\tvar minimizeButton = document.querySelector(\".window-minimize-button\");\n\t\tvar windowElements = document.querySelectorAll(\".window, #try-me\");\n\n\t\tmaxButton.addEventListener(\"click\", function () {\n\t\t\tvar iframe = document.querySelector(\"#jspaint-iframe\");\n\t\t\t// `iframe.src` doesn't contain the document ID added by the app page.\n\t\t\t// Accessing the iframe's `location.href` allows a more seamless transition,\n\t\t\t// although undos are lost.\n\t\t\t// TODO: Save undo history as part of the session.\n\t\t\t// TODO: Make sure the session is saved before navigating away.\n\t\t\t// if (iframe.contentWindow.undos.length) {\n\t\t\t// \tif (!confirm(\"Maximizing will clear your undo history. Continue?\")) {\n\t\t\t// \t\treturn;\n\t\t\t// \t}\n\t\t\t// }\n\t\t\tlocation.href = iframe.contentWindow.location.href;\n\t\t});\n\t\tfunction hideDemo() {\n\t\t\tfor (var i = 0; i < windowElements.length; i++) {\n\t\t\t\twindowElements[i].style.display = \"none\";\n\t\t\t}\n\t\t}\n\t\tcloseButton.addEventListener(\"click\", hideDemo);\n\t\tminimizeButton.addEventListener(\"click\", hideDemo);\n\n\t\t// Junkbot \"feeding\" interaction\n\t\tvar junkbotArea = document.querySelector(\"#junkbot-area\");\n\t\tvar junkbotImg = document.querySelector(\"#junkbot-img\");\n\t\tvar cursorHasBin = true;\n\t\tjunkbotArea.style.cursor = \"url(images/about/junkbot-bin.png) 16 16, auto\";\n\t\tjunkbotImg.src = \"images/about/junkbot.gif\";\n\t\tjunkbotImg.addEventListener(\"mouseenter\", function (event) {\n\t\t\t// console.log(\"mouseenter, cursorHasBin =\", cursorHasBin);\n\t\t\tif (!cursorHasBin) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tjunkbotImg.src = \"images/about/junkbot-collecting-bin.gif\";\n\t\t\tjunkbotArea.style.cursor = \"\";\n\t\t\tcursorHasBin = false;\n\t\t\t// TODO: make non-looping version of GIF and increase timeout\n\t\t\t// or do this differently, because setTimeout isn't reliable!\n\t\t\t// It's not firing in Firefox sometimes (while loading the page?)\n\t\t\t// and may not fire if the tab is in the background (is switched away from).\n\t\t\t// console.log(\"setting timeout\");\n\t\t\tsetTimeout(function () {\n\t\t\t\t// console.log(\"timeout\");\n\t\t\t\tjunkbotImg.src = \"images/about/junkbot.gif\";\n\t\t\t\tjunkbotArea.style.cursor = \"url(images/about/junkbot-bin.png) 16 16, auto\";\n\t\t\t\tcursorHasBin = true;\n\t\t\t}, 1000);\n\t\t});\n\t\tdocument.querySelector(\"#feeding-text\").removeAttribute(\"hidden\");\n\t</script>\n\t<!-- split script to keep above ES5-only -->\n\t<script>\n\t\t// PWA install button\n\t\t// https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/How_to/Trigger_install_prompt\n\t\tconst installButton = document.querySelector(\"#install-pwa\");\n\t\tlet installPrompt = null;\n\n\t\twindow.addEventListener(\"beforeinstallprompt\", (event) => {\n\t\t\tevent.preventDefault();\n\t\t\tinstallPrompt = event;\n\t\t\tinstallButton.removeAttribute(\"hidden\");\n\t\t});\n\n\t\tinstallButton.addEventListener(\"click\", async () => {\n\t\t\tif (!installPrompt) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst result = await installPrompt.prompt();\n\t\t\tconsole.log(`Install prompt was: ${result.outcome}`);\n\t\t\tdisableInAppInstallPrompt();\n\t\t});\n\n\t\tfunction disableInAppInstallPrompt() {\n\t\t\tinstallPrompt = null;\n\t\t\tinstallButton.setAttribute(\"hidden\", \"\");\n\t\t}\n\n\t\twindow.addEventListener(\"appinstalled\", () => {\n\t\t\tdisableInAppInstallPrompt();\n\t\t});\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "browserconfig.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<browserconfig><msapplication><tile><square70x70logo src=\"images/icons/ms-icon-70x70.png\"/><square150x150logo src=\"images/icons/ms-icon-150x150.png\"/><square310x310logo src=\"images/icons/ms-icon-310x310.png\"/><TileColor>#008080</TileColor></tile></msapplication></browserconfig>"
  },
  {
    "path": "cspell.json",
    "content": "{\n\t\"ignorePaths\": [\n\t\t\".history\", // VS Code \"Local History\" extension\n\t\t\"node_modules\",\n\t\t\"lib\",\n\t\t\"out\", // Electron Forge output\n\t\t\"*.png\",\n\t\t\"*.gif\",\n\t\t\"*.jpg\",\n\t\t\"*.jpeg\",\n\t\t\"*.svg\",\n\t\t\"*.cur\",\n\t\t\"*.ico\",\n\t\t\"*.icns\",\n\t\t\"*.wav\",\n\t\t\"*.psd\",\n\t\t\"*.mp4\",\n\t\t\"localization\"\n\t],\n\t\"words\": [\n\t\t\"abcdefghijklmnopqrstuvwxyzabcdef\",\n\t\t\"Adlm\",\n\t\t\"airb\",\n\t\t\"airbrushbrush\",\n\t\t\"Allaire\",\n\t\t\"anypalette\",\n\t\t\"apng\",\n\t\t\"appinstalled\",\n\t\t\"argparse\",\n\t\t\"atombgwht\",\n\t\t\"autoupdating\",\n\t\t\"beforeinstallprompt\",\n\t\t\"bepis\",\n\t\t\"Bgau\",\n\t\t\"bigfix\",\n\t\t\"blackwhite\",\n\t\t\"Bopo\",\n\t\t\"Bresenham\",\n\t\t\"Bresenham's\",\n\t\t\"browserconfig\",\n\t\t\"checkmarks\",\n\t\t\"clipart\",\n\t\t\"Clippy\",\n\t\t\"clmtrackr\",\n\t\t\"cloudflared\",\n\t\t\"clsid\",\n\t\t\"cmaps\",\n\t\t\"colorbar\",\n\t\t\"colorbox\",\n\t\t\"colorstr\",\n\t\t\"colyseus\",\n\t\t\"contenteditable\",\n\t\t\"Corel\",\n\t\t\"ctype\",\n\t\t\"Darude\",\n\t\t\"datetime\",\n\t\t\"dectree\",\n\t\t\"desaturated\",\n\t\t\"Despacito\",\n\t\t\"discoverability\",\n\t\t\"divs\",\n\t\t\"djvu\",\n\t\t\"documentedly\",\n\t\t\"duplicately\",\n\t\t\"ellipticals\",\n\t\t\"encabulator\",\n\t\t\"endonym\",\n\t\t\"endregion\",\n\t\t\"equivalize\",\n\t\t\"ertical\",\n\t\t\"espree\",\n\t\t\"esque\",\n\t\t\"Excelsi\",\n\t\t\"eyedrop\",\n\t\t\"EZGIF\",\n\t\t\"farbling\",\n\t\t\"fieldsets\",\n\t\t\"firebaseapp\",\n\t\t\"firebaseio\",\n\t\t\"firstrun\",\n\t\t\"flagani\",\n\t\t\"fliph\",\n\t\t\"flippable\",\n\t\t\"flipv\",\n\t\t\"floodfill\",\n\t\t\"floodfilling\",\n\t\t\"fontbox\",\n\t\t\"frowny\",\n\t\t\"fullscreen\",\n\t\t\"ghostwhite\",\n\t\t\"Glag\",\n\t\t\"gons\",\n\t\t\"greyscale\",\n\t\t\"gridlines\",\n\t\t\"hackily\",\n\t\t\"haha\",\n\t\t\"Hanb\",\n\t\t\"hcanvas\",\n\t\t\"hctx\",\n\t\t\"hideothers\",\n\t\t\"hilight\",\n\t\t\"HKEY\",\n\t\t\"homescreen\",\n\t\t\"hotspot\",\n\t\t\"hslrgb\",\n\t\t\"hsrgb\",\n\t\t\"humbnail\",\n\t\t\"Icci\",\n\t\t\"ICNS\",\n\t\t\"iconify\",\n\t\t\"IFDs\",\n\t\t\"iframes\",\n\t\t\"IIFE\",\n\t\t\"Imgur\",\n\t\t\"Inkscape\",\n\t\t\"IPFS\",\n\t\t\"isaiahodhner\",\n\t\t\"isded\",\n\t\t\"Jasc\",\n\t\t\"jfif\",\n\t\t\"jnordberg\",\n\t\t\"JSGF\",\n\t\t\"jspaint\",\n\t\t\"jsperf\",\n\t\t\"Junkbot\",\n\t\t\"keyshortcuts\",\n\t\t\"Khoj\",\n\t\t\"Kolour\",\n\t\t\"Konami\",\n\t\t\"Krita\",\n\t\t\"labelledby\",\n\t\t\"lerp\",\n\t\t\"libgconf\",\n\t\t\"libtess\",\n\t\t\"Linb\",\n\t\t\"linebreak\",\n\t\t\"liveweb\",\n\t\t\"llpaper\",\n\t\t\"localdomain\",\n\t\t\"localforage\",\n\t\t\"lookpath\",\n\t\t\"lors\",\n\t\t\"Lospec\",\n\t\t\"lrgb\",\n\t\t\"ltres\",\n\t\t\"Luciferi\",\n\t\t\"Macromedia\",\n\t\t\"mediump\",\n\t\t\"menuitemcheckbox\",\n\t\t\"menuitemradio\",\n\t\t\"mimg\",\n\t\t\"minifig\",\n\t\t\"mobipaint\",\n\t\t\"Mopaint\",\n\t\t\"Mousewheel\",\n\t\t\"msapplication\",\n\t\t\"msgbox\",\n\t\t\"MSPaint\",\n\t\t\"multilines\",\n\t\t\"multitools\",\n\t\t\"multitouch\",\n\t\t\"multiuser\",\n\t\t\"murl\",\n\t\t\"Naptha\",\n\t\t\"nargs\",\n\t\t\"Nbat\",\n\t\t\"Neocities\",\n\t\t\"nesw\",\n\t\t\"nevermind\",\n\t\t\"Nkoo\",\n\t\t\"nocheck\",\n\t\t\"nomine\",\n\t\t\"nonblock\",\n\t\t\"nonwords\",\n\t\t\"nostri\",\n\t\t\"numberofcolors\",\n\t\t\"numpad\",\n\t\t\"occluder\",\n\t\t\"octree\",\n\t\t\"Odhner\",\n\t\t\"oleobject\",\n\t\t\"onestep\",\n\t\t\"Optikey\",\n\t\t\"orizontal\",\n\t\t\"OSGUI\",\n\t\t\"ovaloid\",\n\t\t\"ovaloids\",\n\t\t\"oviforms\",\n\t\t\"paintbucket\",\n\t\t\"pako\",\n\t\t\"palettized\",\n\t\t\"pearlescent\",\n\t\t\"Peggys\",\n\t\t\"Phlp\",\n\t\t\"Photoshop\",\n\t\t\"pipx\",\n\t\t\"pixeling\",\n\t\t\"PLTE\",\n\t\t\"pointermove\",\n\t\t\"pointerup\",\n\t\t\"proch\",\n\t\t\"proclabel\",\n\t\t\"pseudorandomly\",\n\t\t\"psppalette\",\n\t\t\"qtres\",\n\t\t\"redoable\",\n\t\t\"Rege\",\n\t\t\"relh\",\n\t\t\"reltopics\",\n\t\t\"repurposable\",\n\t\t\"resizer\",\n\t\t\"retarget\",\n\t\t\"retargeted\",\n\t\t\"retrofuturist\",\n\t\t\"retrofuturistic\",\n\t\t\"RGBA\",\n\t\t\"RGBAs\",\n\t\t\"rightclick\",\n\t\t\"rotologo\",\n\t\t\"roundrect\",\n\t\t\"roundrects\",\n\t\t\"rrect\",\n\t\t\"RTLCSS\",\n\t\t\"sandboxing\",\n\t\t\"Satana\",\n\t\t\"Satanas\",\n\t\t\"Scribus\",\n\t\t\"scrollbars\",\n\t\t\"Shft\",\n\t\t\"Skencil\",\n\t\t\"sketchpalette\",\n\t\t\"skeuomorphic\",\n\t\t\"skypack\",\n\t\t\"smslant\",\n\t\t\"sorthweast\",\n\t\t\"SoundCloud\",\n\t\t\"spacebar\",\n\t\t\"spirobrush\",\n\t\t\"spraycan\",\n\t\t\"spraypaint\",\n\t\t\"spraypainting\",\n\t\t\"spritesheet\",\n\t\t\"styl\",\n\t\t\"stylable\",\n\t\t\"subh\",\n\t\t\"subrepo\",\n\t\t\"subwindows\",\n\t\t\"tesselator\",\n\t\t\"tessy\",\n\t\t\"textareas\",\n\t\t\"textbox\",\n\t\t\"textboxes\",\n\t\t\"themeable\",\n\t\t\"themepack\",\n\t\t\"throwie\",\n\t\t\"tileable\",\n\t\t\"timespan\",\n\t\t\"titlebar\",\n\t\t\"togglable\",\n\t\t\"topich\",\n\t\t\"tracedata\",\n\t\t\"Tracky\",\n\t\t\"Tvcy\",\n\t\t\"typecheck\",\n\t\t\"typechecked\",\n\t\t\"typestyles\",\n\t\t\"undecagons\",\n\t\t\"undoable\",\n\t\t\"undoables\",\n\t\t\"undock\",\n\t\t\"undocked\",\n\t\t\"undos\",\n\t\t\"unfocusing\",\n\t\t\"uniquify\",\n\t\t\"unmaximize\",\n\t\t\"unminimize\",\n\t\t\"unpackaged\",\n\t\t\"unpremultiplied\",\n\t\t\"unwantedly\",\n\t\t\"UPNG\",\n\t\t\"ustom\",\n\t\t\"UTIF\",\n\t\t\"vaporwave\",\n\t\t\"verts\",\n\t\t\"Viacam\",\n\t\t\"viewports\",\n\t\t\"VSNs\",\n\t\t\"Wayback\",\n\t\t\"Webamp\",\n\t\t\"webglcontextlost\",\n\t\t\"webglcontextrestored\",\n\t\t\"webp\",\n\t\t\"wicg\",\n\t\t\"Winamp\",\n\t\t\"ＷＩＮＴＲＡＰ\",\n\t\t\"woah\",\n\t\t\"Wolfie\",\n\t\t\"xfconf\",\n\t\t\"xtras\",\n\t\t\"zoomable\",\n\t\t\"zoomer\",\n\t\t\"עברית\",\n\t\t\"العربية\",\n\t\t\"𖦹ᯅ𖦹\"\n\t]\n}\n"
  },
  {
    "path": "cypress/cypress-image-snapshot-viewer.js",
    "content": "// ==UserScript==\n// @name         Cypress Image Snapshot Viewer\n// @namespace    https://github.com/1j01/\n// @version      0.1\n// @description  Show diffs of screenshots within the Cypress Dashboard. Works with images from cypress-image-snapshot. To use, press D in the gallery, and then move the mouse over and out of the image.\n// @author       Isaiah Odhner\n// @match        https://dashboard.cypress.io/*\n// @grant        none\n// @noframes\n// ==/UserScript==\n\n(function () {\n\t\"use strict\";\n\n\tlet cleanUp = null;\n\n\tfunction showDiffView(originalImg) {\n\t\tif (cleanUp) { cleanUp(); }\n\n\t\tvar screenshotWidth = originalImg.naturalWidth / 3;\n\t\tvar screenshotHeight = originalImg.naturalHeight;\n\t\toriginalImg.style.opacity = \"0\";\n\t\tvar img = document.createElement(\"img\");\n\t\timg.src = originalImg.src;\n\t\timg.style.position = \"absolute\";\n\t\timg.style.left = \"0\";\n\t\timg.style.pointerEvents = \"all\";\n\t\timg.draggable = false;\n\t\timg.addEventListener(\"mouseenter\", () => {\n\t\t\timg.style.left = `${-2 * screenshotWidth}px`;\n\t\t});\n\t\timg.addEventListener(\"mouseleave\", () => {\n\t\t\timg.style.left = \"0\";\n\t\t});\n\t\tvar container = document.createElement(\"div\");\n\t\tcontainer.style.width = `${screenshotWidth}px`;\n\t\tcontainer.style.height = `${screenshotHeight}px`;\n\t\tcontainer.style.position = \"relative\";\n\t\tcontainer.style.overflow = \"hidden\";\n\t\tcontainer.style.margin = \"auto\";\n\t\tvar outerContainer = document.createElement(\"div\");\n\t\touterContainer.style.position = \"fixed\";\n\t\touterContainer.style.display = \"flex\";\n\t\touterContainer.style.left = \"0\";\n\t\touterContainer.style.right = \"0\";\n\t\touterContainer.style.top = \"0\";\n\t\touterContainer.style.bottom = \"0\";\n\t\touterContainer.style.zIndex = \"100000\";\n\t\touterContainer.style.pointerEvents = \"none\";\n\n\t\touterContainer.appendChild(container);\n\t\tcontainer.appendChild(img);\n\t\tdocument.body.appendChild(outerContainer);\n\n\t\tcleanUp = () => {\n\t\t\toriginalImg.style.opacity = \"\";\n\t\t\tcontainer.style.transformOrigin = \"center center\";\n\t\t\tcontainer.style.transition = \"opacity 0.2s ease, transform 0.2s ease\";\n\t\t\tcontainer.style.opacity = 0;\n\t\t\tcontainer.style.transform = \"scale(0.9)\";\n\t\t\tsetTimeout(() => {\n\t\t\t\touterContainer.remove();\n\t\t\t}, 500);\n\t\t\tcleanUp = null;\n\t\t};\n\t}\n\n\taddEventListener(\"keydown\", (e) => {\n\t\tif (e.key === \"d\") {\n\t\t\tif (cleanUp) {\n\t\t\t\tcleanUp();\n\t\t\t} else {\n\t\t\t\tvar originalImg = document.elementFromPoint(innerWidth / 2, innerHeight / 2);\n\t\t\t\tif (!originalImg || !originalImg.matches(\"img\")) {\n\t\t\t\t\tconsole.warn(\"Didn't find an image in the middle of the page. Found\", originalImg);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tshowDiffView(originalImg);\n\t\t\t}\n\t\t} else if (e.key === \"Escape\") {\n\t\t\tif (cleanUp) { cleanUp(); }\n\t\t}\n\t});\n\n\t// mousedown is TAKEN - with stopPropagation, presumably\n\t// (useCapture doesn't help)\n\taddEventListener(\"pointerdown\", (_event) => {\n\t\tif (cleanUp) { cleanUp(); }\n\t});\n\n})();\n"
  },
  {
    "path": "cypress/fixtures/example.json",
    "content": "{\n  \"name\": \"Using fixtures to represent data\",\n  \"email\": \"hello@cypress.io\",\n  \"body\": \"Fixtures are a great way to mock data for responses to routes\"\n}\n"
  },
  {
    "path": "cypress/integration/tool-tests.spec.js",
    "content": "/// <reference types=\"Cypress\" />\n\ncontext(\"tool tests\", () => {\n\t// @TODO: make rounded tools render consistently across platforms\n\tconst roundedToolsCompareOptions = {\n\t\tfailureThreshold: 13,\n\t\tfailureThresholdType: \"pixel\",\n\t};\n\n\tbefore(() => {\n\t\tcy.visit(\"/\");\n\t\tcy.setResolution([800, 500]);\n\t\tcy.window().should(\"have.property\", \"api_for_cypress_tests\"); // wait for app to be loaded\n\t});\n\tbeforeEach(() => {\n\t\t// eslint-disable-next-line require-await\n\t\tcy.window().then({ timeout: 60000 }, async (win) => {\n\t\t\twin.api_for_cypress_tests.reset_for_next_test();\n\t\t});\n\t});\n\n\tconst simulateGesture = (win, { start, end, shift, /*shiftToggleChance = 0.01,*/ secondary, /*secondaryToggleChance,*/ target }) => {\n\t\ttarget = target || win.$(\".main-canvas\")[0];\n\t\tlet startWithinRect = target.getBoundingClientRect();\n\t\tlet canvasAreaRect = win.$(\".canvas-area\")[0].getBoundingClientRect();\n\n\t\tlet startMinX = Math.max(startWithinRect.left, canvasAreaRect.left);\n\t\tlet startMaxX = Math.min(startWithinRect.right, canvasAreaRect.right);\n\t\tlet startMinY = Math.max(startWithinRect.top, canvasAreaRect.top);\n\t\tlet startMaxY = Math.min(startWithinRect.bottom, canvasAreaRect.bottom);\n\t\tlet startPointX = startMinX + start.x * (startMaxX - startMinX);\n\t\tlet startPointY = startMinY + start.y * (startMaxY - startMinY);\n\t\tlet endPointX = startMinX + end.x * (startMaxX - startMinX);\n\t\tlet endPointY = startMinY + end.y * (startMaxY - startMinY);\n\n\t\tconst $cursor = win.$(`<img src=\"images/cursors/default.png\" class=\"user-cursor\"/>`);\n\t\t$cursor.css({\n\t\t\tposition: \"absolute\",\n\t\t\tleft: 0,\n\t\t\ttop: 0,\n\t\t\topacity: 0,\n\t\t\tzIndex: 5, // @#: z-index\n\t\t\tpointerEvents: \"none\",\n\t\t\ttransition: \"opacity 0.5s\",\n\t\t});\n\t\t$cursor.appendTo(\".jspaint\");\n\t\tlet triggerMouseEvent = (type, point) => {\n\n\t\t\tconst clientX = point.x;\n\t\t\tconst clientY = point.y;\n\t\t\t// const el_over = win.document.elementFromPoint(clientX, clientY);\n\t\t\tconst do_nothing = false;//!type.match(/move/) && (!el_over || !el_over.closest(\".canvas-area\"));\n\t\t\t$cursor.css({\n\t\t\t\tdisplay: \"block\",\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: clientX,\n\t\t\t\ttop: clientY,\n\t\t\t\topacity: do_nothing ? 0.5 : 1,\n\t\t\t});\n\t\t\tif (do_nothing) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet event = new win.$.Event(type, {\n\t\t\t\tview: window,\n\t\t\t\tbubbles: true,\n\t\t\t\tcancelable: true,\n\t\t\t\tclientX,\n\t\t\t\tclientY,\n\t\t\t\tscreenX: clientX,\n\t\t\t\tscreenY: clientY,\n\t\t\t\toffsetX: point.x,\n\t\t\t\toffsetY: point.y,\n\t\t\t\tbutton: secondary ? 2 : 0,\n\t\t\t\tbuttons: secondary ? 2 : 1,\n\t\t\t\tshiftKey: shift,\n\t\t\t});\n\t\t\twin.$(target).trigger(event);\n\t\t};\n\n\t\tlet t = 0;\n\t\tconst stepsInGesture = 3;\n\t\tlet pointForTime = (t) => {\n\t\t\treturn {\n\t\t\t\tx: startPointX + (endPointX - startPointX) * t,\n\t\t\t\ty: startPointY + (endPointY - startPointY) * Math.pow(t, 0.3),\n\t\t\t};\n\t\t};\n\n\t\treturn new Promise((resolve) => {\n\t\t\ttriggerMouseEvent(\"pointerenter\", pointForTime(t)); // so dynamic cursors follow the simulation cursor\n\t\t\ttriggerMouseEvent(\"pointerdown\", pointForTime(t));\n\t\t\tlet move = () => {\n\t\t\t\tt += 1 / stepsInGesture;\n\t\t\t\t// if (seededRandom() < shiftToggleChance) {\n\t\t\t\t// \tshift = !shift;\n\t\t\t\t// }\n\t\t\t\t// if (seededRandom() < secondaryToggleChance) {\n\t\t\t\t// \tsecondary = !secondary;\n\t\t\t\t// }\n\t\t\t\tif (t > 1) {\n\t\t\t\t\ttriggerMouseEvent(\"pointerup\", pointForTime(t));\n\n\t\t\t\t\t$cursor.remove();\n\n\t\t\t\t\tresolve();\n\t\t\t\t} else {\n\t\t\t\t\ttriggerMouseEvent(\"pointermove\", pointForTime(t));\n\t\t\t\t\t/*gestureTimeoutID =*/ setTimeout(move, 10);\n\t\t\t\t}\n\t\t\t};\n\t\t\ttriggerMouseEvent(\"pointerleave\", pointForTime(t));\n\t\t\tmove();\n\t\t});\n\t};\n\n\t// const gesture = (points) => {\n\t// \tconst options = { secondary: false, shift: false };\n\t// \t// @TODO: while loop\n\t// \ttrigger(\"pointerenter\", points[0].x, points[0].y, options);\n\t// \ttrigger(\"pointerdown\", points[0].x, points[0].y, options);\n\t// \tlet i = 0;\n\t// \tfor (; i < points.length; i++) {\n\t// \t\ttrigger(\"pointermove\", points[i].x, points[i].y, options);\n\t// \t}\n\t// \ti--;\n\t// \ttrigger(\"pointerup\", points[i].x, points[i].y, options);\n\t// };\n\n\t// it(\"brush tool\", () => {\n\t// \tcy.get(\".tool[title='Brush']\").click();\n\t// \t// gesture([{ x: 50, y: 50 }, { x: 100, y: 100 }]);\n\t// \tcy.get(\".swatch:nth-child(21)\").rightclick();\n\t// \tcy.window().then({ timeout: 8000 }, async (win) => {\n\t// \t\tfor (let secondary = 0; secondary <= 1; secondary++) {\n\t// \t\t\tfor (let b = 0; b < 12; b++) {\n\t// \t\t\t\twin.$(`.chooser > :nth-child(${b + 1})`).click();\n\t// \t\t\t\tconst start = { x: 0.05 + b * 0.05, y: 0.1 + 0.1 * secondary };\n\t// \t\t\t\tconst end = { x: start.x + 0.04, y: start.y + 0.04 };\n\t// \t\t\t\tawait simulateGesture(win, { shift: false, secondary: !!secondary, start, end });\n\t// \t\t\t}\n\t// \t\t}\n\t// \t});\n\t// \tcy.matchImageSnapshot();\n\t// });\n\n\t// @TODO: test transparent document mode\n\tit(\"eraser tool\", () => {\n\t\tcy.get(\".tool[title='Eraser/Color Eraser']\").click();\n\t\t// gesture([{ x: 50, y: 50 }, { x: 100, y: 100 }]);\n\t\tcy.window().then({ timeout: 60000 }, async (win) => {\n\t\t\tconst { selected_colors } = win.api_for_cypress_tests;\n\t\t\tfor (let row = 0; row < 4; row++) {\n\t\t\t\tconst secondary = !!(row % 2);\n\t\t\t\tconst increaseSize = row >= 2;\n\t\t\t\tlet $options = win.$(\".chooser > *\");\n\t\t\t\tfor (let o = 0; o < $options.length; o++) {\n\t\t\t\t\t$options[o].click();\n\t\t\t\t\tif (increaseSize) {\n\t\t\t\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\t\t\t\twin.$(\"body\").trigger(new win.$.Event(\"keydown\", { code: \"NumpadAdd\" }));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tselected_colors.background = \"#f0f\";\n\t\t\t\t\tconst start = { x: 0.05 + o * 0.05, y: 0.1 + 0.1 * row };\n\t\t\t\t\tconst end = { x: start.x + 0.04, y: start.y + 0.04 };\n\t\t\t\t\tawait simulateGesture(win, { shift: false, secondary: false, start, end });\n\t\t\t\t\tif (secondary) {\n\t\t\t\t\t\tselected_colors.background = \"#ff0\";\n\t\t\t\t\t\tselected_colors.foreground = \"#f0f\";\n\t\t\t\t\t\tconst start = { x: 0.04 + o * 0.05, y: 0.11 + 0.1 * row };\n\t\t\t\t\t\tconst end = { x: start.x + 0.03, y: start.y + 0.02 };\n\t\t\t\t\t\tawait simulateGesture(win, { shift: false, secondary: true, start, end });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tcy.get(\".main-canvas\").matchImageSnapshot();\n\t});\n\n\t[\"Brush\", \"Pencil\", \"Rectangle\", \"Rounded Rectangle\", \"Ellipse\", \"Line\"].forEach((toolName) => {\n\t\tit(`${toolName.toLowerCase()} tool`, () => {\n\t\t\tcy.get(`.tool[title='${toolName}']`).click();\n\t\t\t// gesture([{ x: 50, y: 50 }, { x: 100, y: 100 }]);\n\t\t\tcy.get(\".swatch:nth-child(22)\").rightclick();\n\t\t\tcy.window().then({ timeout: 60000 }, async (win) => {\n\t\t\t\tfor (let row = 0; row < 4; row++) {\n\t\t\t\t\tconst secondary = !!(row % 2);\n\t\t\t\t\tconst increaseSize = row >= 2;\n\t\t\t\t\tlet $options = win.$(\".chooser > *\");\n\t\t\t\t\t// Pencil has no options\n\t\t\t\t\tif ($options.length === 0) {\n\t\t\t\t\t\t$options = win.$(\"<dummy>\");\n\t\t\t\t\t}\n\t\t\t\t\tfor (let o = 0; o < $options.length; o++) {\n\t\t\t\t\t\t$options[o].click();\n\t\t\t\t\t\tif (increaseSize && (o === 0 || toolName === \"Brush\" || toolName === \"Line\")) {\n\t\t\t\t\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\t\t\t\t\twin.$(\"body\").trigger(new win.$.Event(\"keydown\", { code: \"NumpadAdd\" }));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst start = { x: 0.05 + o * 0.05, y: 0.1 + 0.1 * row };\n\t\t\t\t\t\tconst end = { x: start.x + 0.04, y: start.y + 0.04 };\n\t\t\t\t\t\tawait simulateGesture(win, { shift: false, secondary: !!secondary, start, end });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tcy.get(\".main-canvas\").matchImageSnapshot(toolName.match(/Rounded Rectangle|Ellipse/) ? roundedToolsCompareOptions : undefined);\n\t\t});\n\t});\n});\n"
  },
  {
    "path": "cypress/integration/visual-tests.spec.js",
    "content": "/// <reference types=\"Cypress\" />\n\ncontext(\"visual tests\", () => {\n\n\t// These tests are not really cross-platform or even cross-computer,\n\t// since they depend on pixel-exact text and SVG rendering, as well as browser-specific built-in styles and layout.\n\t// Unfortunately, increasing the threshold to a point where the tests pass on all systems would introduce RIDICULOUS false negatives,\n\t// like changing the entire icon set wasn't even detected as a change, in Eye Gaze Mode (now Enlarge UI mode), where the icons are HUGE!\n\t// And again unfortunately, decreasing the threshold to the point where it detects most changes that matter,\n\t// it produces RIDICULOUS false positives, like the window title bar gradient and all text being said to be different,\n\t// even on the same machine! In short, the image comparison is unusable.\n\t// I suspect it treats a difference between 254 and 255 (white and white) the same as a difference between 0 and 255 (black and white),\n\t// and if it just summed the differences instead of counting the number of pixels that differ, it would be much more useful,\n\t// although still not cross-device due to font rendering differences etc.\n\t// For now, I've removed the thresholds so it will always detect changes;\n\t// that way I can at least use it to view the diffs, occasionally, if not automatically check for changes.\n\tconst withTextCompareOptions = {\n\t\t// failureThreshold: 0.05, // masks HUGE differences\n\t\t// failureThresholdType: \"percent\" // not actually percent - fraction\n\t\tfailureThreshold: 0,\n\t\tfailureThresholdType: \"pixel\",\n\t};\n\tconst withMuchTextCompareOptions = {\n\t\t// failureThreshold: 0.08, // masks HUGE differences\n\t\t// failureThresholdType: \"percent\" // not actually percent - fraction\n\t\tfailureThreshold: 0,\n\t\tfailureThresholdType: \"pixel\",\n\t};\n\tconst toolboxCompareOptions = {\n\t\t// failureThreshold: 40,\n\t\t// failureThresholdType: \"pixel\"\n\t\tfailureThreshold: 0,\n\t\tfailureThresholdType: \"pixel\",\n\t};\n\n\tconst escapeRegExp = (string) =>\n\t\tstring.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"); // $& means the whole matched string\n\n\t// Menus need pointer events currently.\n\t// These \"click*\" functions are used to interact with menus, and don't trigger click events.\n\tconst clickElementWithExactText = (selector, text) => {\n\t\tcy.contains(selector, new RegExp(`^${escapeRegExp(text)}$`))\n\t\t\t// .click();\n\t\t\t.trigger(\"pointerdown\", { which: 1 })\n\t\t\t.trigger(\"pointerup\", { force: true });\n\t};\n\tconst closeMenus = () => {\n\t\tcy.get(\".status-text\").click({ force: true }); // force because a menu may be covering the status bar / part of it\n\t};\n\tconst clickMenuButton = (label) => {\n\t\tclickElementWithExactText(\".menu-button\", label);\n\t};\n\tconst clickMenuItem = (label) => {\n\t\tclickElementWithExactText(\".menu-item-label\", label);\n\t};\n\tconst selectTheme = (themeName) => {\n\t\tclickMenuButton(\"Extras\");\n\t\tclickMenuItem(\"Themes\");\n\t\tclickMenuItem(themeName);\n\t\tcloseMenus();\n\t\tcy.wait(1000); // give a bit of time for theme to load\n\t};\n\t// `intercept` requires Cypress 6+\n\t// cypress-image-snapshot@4.0.1 has a peer dependency on cypress@\"^4.5.0\",\n\t// although I believe it works with v9, and only really has problems on v10.\n\t// That said, this didn't work! So. No point in upgrading just yet.\n\t// I'll upgrade when I'm ready to replace the visual testing framework.\n\t// const waitForRequest = (urlPattern, callback) => {\n\t// \t// intercept without changing or stubbing response\n\t// \tcy.intercept(urlPattern).as(\"urlPattern\");\n\t// \tcy.wait(\"@urlPattern\").then(callback);\n\t// };\n\tconst waitForImage = (selector) => {\n\t\t// should automatically retries\n\t\t// checking visibility first ensures we're testing at least one image, theoretically\n\t\tcy.get(selector).should(\"be.visible\");\n\t\tcy.get(selector).should(($imgs) => {\n\t\t\tfor (const img of $imgs) {\n\t\t\t\texpect(img.naturalWidth).to.be.greaterThan(0);\n\t\t\t\texpect(img.naturalHeight).to.be.greaterThan(0);\n\t\t\t}\n\t\t});\n\t};\n\n\tbefore(() => {\n\t\t// Hides the news indicator, which shouldn't affect the visual tests.\n\t\t// If by the year 3000 AI doesn't automatically find and fix stupid code like this, humanity will have already been doomed.\n\t\tcy.clock(32503698000000);\n\n\t\tcy.visit(\"/\");\n\t\tcy.setResolution([760, 490]);\n\t\tcy.window().should(\"have.property\", \"api_for_cypress_tests\"); // wait for app to be loaded\n\n\t\t// Needed, given `cy.clock` is used, for `requestAnimationFrame` in `update_$swatch`,\n\t\t// so the color palette is rendered correctly.\n\t\tcy.tick(100);\n\t});\n\n\tit(\"main screenshot\", () => {\n\t\tcy.matchImageSnapshot(withTextCompareOptions);\n\t});\n\n\tit(\"brush selected\", () => {\n\t\tcy.get('.tool[title=\"Brush\"]').click();\n\t\tcy.get(\".tools-component\").matchImageSnapshot(toolboxCompareOptions);\n\t});\n\tit(\"select selected\", () => {\n\t\tcy.get('.tool[title=\"Select\"]').click();\n\t\tcy.get(\".tools-component\").matchImageSnapshot(toolboxCompareOptions);\n\t});\n\tit(\"magnifier selected\", () => {\n\t\tcy.get('.tool[title=\"Magnifier\"]').click();\n\t\tcy.get(\".tools-component\").matchImageSnapshot(toolboxCompareOptions);\n\t});\n\tit(\"airbrush selected\", () => {\n\t\tcy.get('.tool[title=\"Airbrush\"]').click();\n\t\tcy.get(\".tools-component\").matchImageSnapshot(toolboxCompareOptions);\n\t});\n\tit(\"eraser selected\", () => {\n\t\tcy.get('.tool[title=\"Eraser/Color Eraser\"]').click();\n\t\tcy.get(\".tools-component\").matchImageSnapshot(toolboxCompareOptions);\n\t});\n\tit(\"line selected\", () => {\n\t\tcy.get('.tool[title=\"Line\"]').click();\n\t\tcy.get(\".tools-component\").matchImageSnapshot(toolboxCompareOptions);\n\t});\n\tit(\"rectangle selected\", () => {\n\t\tcy.get('.tool[title=\"Rectangle\"]').click();\n\t\tcy.get(\".tools-component\").matchImageSnapshot(toolboxCompareOptions);\n\t});\n\n\tbeforeEach(() => {\n\t\tif (Cypress.$(\".window:visible\")[0]) {\n\t\t\tcy.get(\".window:visible .window-close-button\").click();\n\t\t\tcy.get(\".window\").should(\"not.be.visible\");\n\t\t}\n\t});\n\n\tit(\"image attributes window\", () => {\n\t\tcy.get(\"body\").type(\"{ctrl}e\");\n\t\tcy.get(\".window:visible\").matchImageSnapshot(withMuchTextCompareOptions);\n\t});\n\n\tit(\"modern dark theme -- image attributes window\", () => {\n\t\tselectTheme(\"Modern Dark\");\n\t\tcy.get(\"body\").type(\"{ctrl}e\");\n\t\tcy.get(\".window:visible\").matchImageSnapshot(withMuchTextCompareOptions);\n\t});\n\n\tit(\"modern dark theme -- custom zoom window\", () => {\n\t\tclickMenuButton(\"View\");\n\t\tclickMenuItem(\"Zoom\");\n\t\tclickMenuItem(\"Custom...\");\n\t\tcy.get(\".window:visible\").matchImageSnapshot(withMuchTextCompareOptions);\n\t});\n\n\tit(\"bubblegum theme - custom zoom window\", () => {\n\t\t// selectTheme(\"Bubblegum\"); // not released yet\n\t\tcy.window().then((win) => {\n\t\t\twin.api_for_cypress_tests.set_theme(\"bubblegum.css\");\n\t\t});\n\t\tclickMenuButton(\"View\");\n\t\tclickMenuItem(\"Zoom\");\n\t\tclickMenuItem(\"Custom...\");\n\t\tcy.get(\".window:visible\").matchImageSnapshot(withMuchTextCompareOptions);\n\t});\n\n\tit(\"custom zoom window\", () => {\n\t\tselectTheme(\"Classic Light\");\n\t\tclickMenuButton(\"View\");\n\t\tclickMenuItem(\"Zoom\");\n\t\tclickMenuItem(\"Custom...\");\n\t\tcy.get(\".window:visible\").matchImageSnapshot(withMuchTextCompareOptions);\n\t});\n\n\tit(\"flip and rotate window\", () => {\n\t\tclickMenuButton(\"Image\");\n\t\tclickMenuItem(\"Flip/Rotate\");\n\t\tcy.get(\".window:visible\").matchImageSnapshot(withMuchTextCompareOptions);\n\t});\n\n\tit(\"stretch and skew window\", () => {\n\t\tclickMenuButton(\"Image\");\n\t\tclickMenuItem(\"Stretch/Skew\");\n\t\twaitForImage(\".window:visible img\");\n\t\tcy.get(\".window:visible\").matchImageSnapshot(withTextCompareOptions);\n\t});\n\n\tit(\"help window\", () => {\n\t\tclickMenuButton(\"Help\");\n\t\tclickMenuItem(\"Help Topics\");\n\t\tcy.get(\".window:visible .folder\", { timeout: 10000 }); // wait for sidebar contents to load\n\t\t// @TODO: wait for iframe to load\n\t\tcy.get(\".window:visible\").matchImageSnapshot(Object.assign({}, withTextCompareOptions, { blackout: [\"iframe\"] }));\n\t});\n\n\tit(\"about window\", () => {\n\t\tclickMenuButton(\"Help\");\n\t\tclickMenuItem(\"About Paint\");\n\t\twaitForImage(\"#about-paint-icon\");\n\t\tcy.get(\".window:visible\").matchImageSnapshot(Object.assign({}, withMuchTextCompareOptions, { blackout: [\"#maybe-outdated-line\", \"#jspaint-version\"] }));\n\t});\n\n\tconst toggleEyeGazeMode = () => {\n\t\t// Eye Gaze Mode has been split into several features.\n\t\tclickMenuButton(\"Extras\");\n\t\tclickMenuItem(\"Vertical Color Box\");\n\t\tcloseMenus();\n\t\tclickMenuButton(\"Extras\");\n\t\tclickMenuItem(\"Quick Undo Button\");\n\t\tcloseMenus();\n\t\tclickMenuButton(\"Extras\");\n\t\tclickMenuItem(\"Dwell Clicker\");\n\t\tcloseMenus();\n\t\tclickMenuButton(\"Extras\");\n\t\tclickMenuItem(\"Enlarge UI\");\n\t\tcloseMenus();\n\t};\n\tit(\"eye gaze mode\", () => {\n\t\tcy.get('.tool[title=\"Select\"]').click();\n\t\ttoggleEyeGazeMode();\n\t\t// clickMenuButton(\"View\");\n\t\t// cy.get(\"body\").trigger(\"pointermove\", { clientX: 200, clientY: 150 });\n\t\tcy.wait(100);\n\t\tcy.get(\".floating-undo-button\").should(\"exist\");\n\t\tcy.matchImageSnapshot(withTextCompareOptions);\n\t});\n\n\tit(\"bubblegum theme -- eye gaze mode\", () => {\n\t\tcy.get(\".floating-undo-button\").should(\"exist\");\n\t\t// selectTheme(\"Bubblegum\"); // not released yet\n\t\tcy.window().then((win) => {\n\t\t\twin.api_for_cypress_tests.set_theme(\"bubblegum.css\");\n\t\t});\n\t\t// clickMenuButton(\"View\");\n\t\t// cy.get(\"body\").trigger(\"pointermove\", { clientX: 200, clientY: 150 });\n\t\tcy.wait(100);\n\t\tcy.matchImageSnapshot(withTextCompareOptions);\n\t});\n\n\tit(\"modern light theme -- eye gaze mode\", () => {\n\t\tcy.get(\".floating-undo-button\").should(\"exist\");\n\t\tselectTheme(\"Modern Light\");\n\t\t// clickMenuButton(\"View\");\n\t\t// cy.get(\"body\").trigger(\"pointermove\", { clientX: 200, clientY: 150 });\n\t\tcy.wait(100);\n\t\tcy.matchImageSnapshot(withTextCompareOptions);\n\t});\n\n\tit(\"exit eye gaze mode\", () => {\n\t\t// this acts as teardown for the eye gaze mode tests\n\t\ttoggleEyeGazeMode();\n\t\tcy.get(\".floating-undo-button\").should(\"not.exist\");\n\t});\n\n\tit(\"modern light theme -- main screenshot\", () => {\n\t\tcy.wait(100);\n\t\t// clickMenuButton(\"View\");\n\t\t// cy.get(\"body\").trigger(\"pointermove\", { clientX: 200, clientY: 150 });\n\t\tcloseMenus();\n\t\tcy.wait(100);\n\t\tcy.matchImageSnapshot(withTextCompareOptions);\n\t});\n\n\tconst test_edit_colors_dialog = (expand = true) => {\n\t\tclickMenuButton(\"Colors\");\n\t\tclickMenuItem(\"Edit Colors...\");\n\t\tcy.wait(100);\n\t\tif (expand) {\n\t\t\tcy.contains(\"button\", \"Define Custom Colors >>\").click();\n\t\t}\n\t\tcy.get(\".window:visible\").matchImageSnapshot(Object.assign({}, withTextCompareOptions));\n\t};\n\tit(\"modern light theme -- edit colors dialog (expanded)\", () => {\n\t\ttest_edit_colors_dialog(true);\n\t});\n\n\tit(\"bubblegum theme -- main screenshot\", () => {\n\t\t// selectTheme(\"Bubblegum\"); // not released yet\n\t\tcy.window().then((win) => {\n\t\t\twin.api_for_cypress_tests.set_theme(\"bubblegum.css\");\n\t\t});\n\t\t// clickMenuButton(\"View\");\n\t\t// cy.get(\"body\").trigger(\"pointermove\", { clientX: 200, clientY: 150 });\n\t\tcy.wait(100);\n\t\tcy.matchImageSnapshot(withTextCompareOptions);\n\t});\n\n\tit(\"bubblegum theme -- about window\", () => {\n\t\tclickMenuButton(\"Help\");\n\t\tclickMenuItem(\"About Paint\");\n\t\t// waitForImage(\"#about-paint-icon\"); // it's actually replaced with a background image in this theme\n\t\t// waitForRequest(\"/images/bubblegum/bubblegum-paint-128x128.png\", () => { // not working\n\t\t// waitForRequest(\"**/bubblegum-paint-*.png\", () => { // not working\n\t\tcy.wait(1000); // wait and hope it's loaded\n\t\tcy.get(\".window:visible\").matchImageSnapshot(Object.assign({}, withMuchTextCompareOptions, { blackout: [\"#maybe-outdated-line\", \"#jspaint-version\"] }));\n\t\t// });\n\t});\n\n\tit(\"winter theme -- main screenshot\", () => {\n\t\tselectTheme(\"Winter\");\n\t\t// clickMenuButton(\"View\");\n\t\t// cy.get(\"body\").trigger(\"pointermove\", { clientX: 200, clientY: 150 });\n\t\tcy.wait(100);\n\t\tcy.matchImageSnapshot(withTextCompareOptions);\n\t});\n\n\tit(\"winter theme -- edit colors dialog (expanded)\", () => {\n\t\ttest_edit_colors_dialog(true);\n\t});\n\n\tit(\"winter theme -- vertical color box\", () => {\n\t\tcy.wait(500);\n\t\tclickMenuButton(\"Extras\");\n\t\tclickMenuItem(\"Vertical Color Box\");\n\t\tcy.wait(500);\n\t\tcloseMenus();\n\t\tcy.wait(100);\n\t\tcy.matchImageSnapshot(withTextCompareOptions);\n\t});\n\n\tit(\"vertical color box\", () => {\n\t\tselectTheme(\"Classic Light\");\n\t\tcy.matchImageSnapshot(withTextCompareOptions);\n\t});\n\n\tit(\"edit colors dialog\", () => {\n\t\ttest_edit_colors_dialog(false);\n\t});\n\n\tit(\"modern light theme -- vertical color box\", () => {\n\t\tselectTheme(\"Modern Light\");\n\t\tcy.matchImageSnapshot(withTextCompareOptions);\n\t});\n\n\tit(\"about window during pride month\", () => {\n\t\t// TODO: DRY with other about window tests and the app loading in the `before` hook,\n\t\t// maybe enable test isolation even though it's slower to load the app every time\n\n\t\t// June 19, 3000\n\t\tcy.clock(32518299600000);\n\n\t\tcy.visit(\"/\");\n\t\tcy.setResolution([760, 490]);\n\t\tcy.window().should(\"have.property\", \"api_for_cypress_tests\"); // wait for app to be loaded\n\n\t\t// Needed, given `cy.clock` is used, for `requestAnimationFrame` in `update_$swatch`,\n\t\t// so the color palette is rendered correctly.\n\t\t// (Doesn't apply to this test.)\n\t\tcy.tick(100);\n\n\t\tclickMenuButton(\"Help\");\n\t\tclickMenuItem(\"About Paint\");\n\t\twaitForImage(\"#about-paint-icon\");\n\t\tcy.get(\".window:visible\").matchImageSnapshot(Object.assign({}, withMuchTextCompareOptions, { blackout: [\"#maybe-outdated-line\", \"#jspaint-version\"] }));\n\t});\n\n});\n"
  },
  {
    "path": "cypress/plugins/index.js",
    "content": "// This function is called when a project is opened or re-opened (e.g. due to\n// the project's config changing)\n\nconst {\n\taddMatchImageSnapshotPlugin,\n} = require(\"cypress-image-snapshot/plugin\");\nmodule.exports = (on, config) => {\n\t// `on` is used to hook into various events Cypress emits\n\t// `config` is the resolved Cypress config\n\taddMatchImageSnapshotPlugin(on, config);\n};\n"
  },
  {
    "path": "cypress/support/commands.js",
    "content": "import { addMatchImageSnapshotCommand } from \"cypress-image-snapshot/command\";\naddMatchImageSnapshotCommand({\n\tfailureThreshold: 0,\n\tfailureThresholdType: \"pixel\",\n\tcustomDiffConfig: { threshold: 0 },\n\tcapture: \"viewport\",\n});\nCypress.Commands.add(\"setResolution\", (size) => {\n\tif (Cypress._.isArray(size)) {\n\t\tcy.viewport(size[0], size[1]);\n\t} else {\n\t\tcy.viewport(size);\n\t}\n});\n"
  },
  {
    "path": "cypress/support/index.js",
    "content": "// ***********************************************************\n// This support/index.js is processed and\n// loaded automatically before your test files.\n//\n// https://on.cypress.io/configuration\n\nimport \"./commands\";\n\n"
  },
  {
    "path": "cypress.json",
    "content": "{\n\t\"projectId\": \"6im7v7\",\n\t\"baseUrl\": \"http://localhost:11822\",\n\t\"video\": false\n}\n"
  },
  {
    "path": "discord-activity/.gitignore",
    "content": "node_modules\n*.pem\n*.log\n.DS_Store\nbuild\ndist\n.env"
  },
  {
    "path": "discord-activity/README.md",
    "content": "# Discord Embedded App Starter\n\nThis repo is a minimal starter-project. Getting an embedded app running in Discord can be complex. The goal of this example is to get you up-and-running as quickly as possible, while making it easy to swap in pieces to fit your embedded app's client and server needs.\n\n## Client architecture\n\nThe client (aka front-end) is using vanilla JS.\n\n### Server architecture\n\nThe server (aka back-end) is using Express with typescript.\n\n## Setting up your Discord Application\n\nBefore we write any code, lets follow the instructions [here](https://discord.com/developers/docs/activities/building-an-activity#step-1-creating-a-new-app) to make sure your Discord application is set up correctly.\n\n## Setting up your environment variables\n\nIn this directory (`/examples/discord-activity-starter`) we need to create a `.env` file with the OAuth2 variables, as described [here](https://discord.com/developers/docs/activities/building-an-activity#find-your-oauth2-credentials).\n\n```env\nVITE_CLIENT_ID=123456789012345678\nCLIENT_SECRET=abcdefghijklmnopqrstuvwxyzabcdef\n```\n\n### Adding a new environment variable\n\nIn order to add new environment variables, you will need to do the following:\n\n1. Add the environment key and value to `.env`\n2. Add the key to [/examples/discord-activity-starter/packages/client/src/vite-env.d.ts](/examples/discord-activity-starter/packages/client/src/vite-env.d.ts)\n3. Add the key to [/examples/discord-activity-starter/packages/server/environment.d.ts](/examples/discord-activity-starter/packages/server/environment.d.ts)\n\nThis will ensure that you have type safety when consuming your environment variables\n\n## Running your app locally\n\nAs described [here](https://discord.com/developers/docs/activities/building-an-activity#step-4-running-your-app-locally-in-discord), we encourage using a tunnel solution such as [cloudflared](https://github.com/cloudflare/cloudflared#installing-cloudflared) for local development.\nTo run your app locally, run the following from this directory (/examples/discord-activity-starter)\n\n```\npnpm install # only need to run this the first time\npnpm dev\npnpm tunnel # from another terminal\n```\n\nBe sure to complete all the steps listed [here](https://discord.com/developers/docs/activities/building-an-activity) to ensure your development setup is working as expected.\n"
  },
  {
    "path": "discord-activity/package.json",
    "content": "{\n  \"name\": \"discord-activity-starter\",\n  \"private\": true,\n  \"version\": \"0.1.0\",\n  \"description\": \"A minimal starter project using embedded-app-sdk\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"dev\": \"pnpm run --filter \\\"./packages/**\\\" --parallel dev\",\n    \"tunnel\": \"cloudflared tunnel --url http://localhost:3000\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"express\": \"^4.19.2\"\n  },\n  \"devDependencies\": {\n    \"@types/express\": \"^4.17.21\",\n    \"@types/node\": \"^20.12.7\",\n    \"nodemon\": \"^3.1.0\",\n    \"npm-run-all2\": \"^6.0.0\",\n    \"rimraf\": \"^5.0.0\",\n    \"ts-node\": \"^10.9.1\",\n    \"typescript\": \"~5.4.0\"\n  }\n}\n"
  },
  {
    "path": "discord-activity/packages/server/environment.d.ts",
    "content": "declare global {\n\tnamespace NodeJS {\n\t\tinterface ProcessEnv {\n\t\t\tVITE_CLIENT_ID: string;\n\t\t\tCLIENT_SECRET: string;\n\t\t\tNODE_ENV: \"development\" | \"production\";\n\t\t\tPORT?: string;\n\t\t\tPWD: string;\n\t\t}\n\t}\n}\n\nexport { };\n"
  },
  {
    "path": "discord-activity/packages/server/package.json",
    "content": "{\n  \"name\": \"server\",\n  \"version\": \"0.1.0\",\n  \"description\": \"The app server\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"start\": \"npm-run-all build start:prod\",\n    \"start:prod\": \"node ./dist/app.js\",\n    \"dev\": \"nodemon --watch src -e ts,ejs --exec $npm_execpath start\",\n    \"build\": \"npm-run-all build:clean build:tsc\",\n    \"build:clean\": \"rimraf dist\",\n    \"build:tsc\": \"tsc\",\n    \"debug:start\": \"npm-run-all build debug:start:prod\",\n    \"debug:start:prod\": \"node --nolazy --inspect-brk=9229 ./dist/app.js\"\n  },\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"body-parser\": \"^1.20.2\",\n    \"dotenv\": \"^16.0.1\",\n    \"express-ws\": \"^5.0.2\",\n    \"nodemon\": \"^3.1.0\"\n  },\n  \"devDependencies\": {\n    \"@types/express-ws\": \"^3.0.4\",\n    \"npm-run-all2\": \"^6.0.0\"\n  }\n}\n"
  },
  {
    "path": "discord-activity/packages/server/src/app.ts",
    "content": "import bodyParser from \"body-parser\";\nimport dotenv from \"dotenv\";\nimport express, { Application, Request, Response } from \"express\";\n// import enableWs from \"express-ws\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { fetchAndRetry } from \"./utils\";\ndotenv.config({ path: \"../../.env\" });\n\nconst app: Application = express();\nconst port: number = Number(process.env.PORT) || 1999;\n\n// enableWs(app);\n\napp.use(express.json());\n\nconst clientSourcePath = path.join(__dirname, \"../../../..\");\nconst clientId = process.env.VITE_CLIENT_ID;\nconst clientIdNeedle = \"$$$$$CLIENT_ID$$$$$\"; // same length as the client ID, just in case\nconst urlPathForPatching = \"/src/discord-activity-client.js\";\nconst fsPathForPatching = path.join(clientSourcePath, urlPathForPatching);\n// Ensure the file exists and prepare it for serving\n// const patchedFileContent = fs.readFileSync(fsPathForPatching, \"utf8\").replace(clientIdNeedle, clientId);\n// // Serve the patched file\n// app.get(urlPathForPatching, (req, res) => {\n// \tres.setHeader(\"Content-Type\", \"text/javascript\");\n// \tres.send(patchedFileContent);\n// });\nif (!fs.existsSync(fsPathForPatching)) {\n\tthrow new Error(`Could not find file at ${fsPathForPatching}`);\n}\n// Serve the patched file without caching it, for development purposes\napp.get(urlPathForPatching, (req, res) => {\n\tfs.readFile(fsPathForPatching, \"utf8\", (err, data) => {\n\t\tif (err) {\n\t\t\tres.status(500).send(err);\n\t\t\treturn;\n\t\t}\n\t\tres.setHeader(\"Content-Type\", \"text/javascript\");\n\t\tres.send(data.replace(clientIdNeedle, clientId));\n\t});\n});\n\n// if (process.env.NODE_ENV === \"production\") {\n//   const clientBuildPath = path.join(__dirname, \"../../client/dist\");\n//   app.use(express.static(clientBuildPath));\n// }\n// I'm hacking this to work without Vite, without a build step, and without a client folder / monorepo structure.\n// This will include odds and ends like .git and .env files by default, so we need to exclude them with an extra route,\n// as .env is a security risk and .git and .history are potentially sensitive as well.\napp.use((req, res, next) => {\n\t// Must be case-insensitive for Windows FS!\n\t// There are quite possibly ways to bypass this, with URL encoding or similar...\n\t// TODO: use a clean allowed set of files.\n\tif (req.path.match(/\\.(git|history|env)/i)) {\n\t\tres.status(403).send(\"Forbidden\");\n\t\treturn;\n\t}\n\tnext();\n});\napp.use(express.static(clientSourcePath));\n\n// Fetch token from developer portal and return to the embedded app\napp.post(\"/api/token\", async (req: Request, res: Response) => {\n\tconst response = await fetchAndRetry(`https://discord.com/api/oauth2/token`, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/x-www-form-urlencoded\",\n\t\t},\n\t\tbody: new URLSearchParams({\n\t\t\tclient_id: process.env.VITE_CLIENT_ID,\n\t\t\tclient_secret: process.env.CLIENT_SECRET,\n\t\t\tgrant_type: \"authorization_code\",\n\t\t\tcode: req.body.code,\n\t\t}),\n\t});\n\n\tconst { access_token } = (await response.json()) as {\n\t\taccess_token: string;\n\t};\n\n\tres.send({ access_token });\n});\n\n// Simple multiplayer image editing\n\nconst rooms: { [key: string]: string } = {};\n\n// app.post(\"/api/rooms\", (req: Request, res: Response) => {\n// \tconst roomId = uuid(); // or the room id might be the Discord Activity instance ID\n// \trooms[roomId] = \"\";\n// \tres.send({ roomId });\n// });\n\napp.get(\"/api/rooms/:roomId/data\", (req: Request, res: Response) => {\n\tconst { roomId } = req.params;\n\tres.send(rooms[roomId]);\n});\n\napp.put(\"/api/rooms/:roomId/data\", bodyParser.text({ type: \"*/*\" }), (req: Request, res: Response) => {\n\tconst { roomId } = req.params;\n\tconst image = req.body;\n\trooms[roomId] = image;\n\tres.send({ success: true });\n});\n\n// app.ws(\"/api/sessions/:session_id\", (ws, req) => {\n// console.log(\"WebSocket support is enabled\")\n// @ts-ignore\n// app.ws(\"/api/session\", (ws, req) => {\n// \tconsole.log(\"WebSocket was opened\")\n\n// \tws.on(\"message\", (msg: string) => {\n// \t\tconsole.log(\"Received message\", msg)\n// \t\tws.send(msg)\n// \t})\n\n// \tws.on(\"close\", () => {\n// \t\tconsole.log(\"WebSocket was closed\")\n// \t})\n// })\n\n\n\n\napp.listen(port, () => {\n\t// eslint-disable-next-line no-console\n\tconsole.log(`App is listening on port ${port} !`);\n});\n"
  },
  {
    "path": "discord-activity/packages/server/src/shared/hello.ts",
    "content": "export function hello() {\n\tconsole.log(\"hello from the server's shared folder\");\n}\n"
  },
  {
    "path": "discord-activity/packages/server/src/utils.ts",
    "content": "export function sleep(ms: number) {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * This function extends fetch to allow retrying\n * If the request returns a 429 error code, it will wait and retry after \"retry_after\" seconds\n */\nexport async function fetchAndRetry(\n\tinput: RequestInfo,\n\tinit?: RequestInit | undefined,\n\tnRetries: number = 3,\n): Promise<Response> {\n\ttry {\n\t\t// Make the request\n\t\tconst response = await fetch(input, init);\n\n\t\t// If there's a 429 error code, retry after retry_after seconds\n\t\t// https://discord.com/developers/docs/topics/rate-limits#rate-limits\n\t\tif (response.status === 429 && nRetries > 0) {\n\t\t\tconst retryAfter = Number(response.headers.get(\"retry_after\"));\n\t\t\tif (Number.isNaN(retryAfter)) {\n\t\t\t\treturn response;\n\t\t\t}\n\t\t\tawait sleep(retryAfter * 1000);\n\t\t\treturn await fetchAndRetry(input, init, nRetries - 1);\n\t\t} else {\n\t\t\treturn response;\n\t\t}\n\t} catch (ex) {\n\t\tif (nRetries <= 0) {\n\t\t\tthrow ex;\n\t\t}\n\n\t\t// If the request failed, wait one second before trying again\n\t\t// This could probably be fancier with exponential backoff\n\t\tawait sleep(1000);\n\t\treturn await fetchAndRetry(input, init, nRetries - 1);\n\t}\n}\n"
  },
  {
    "path": "discord-activity/packages/server/tsconfig.json",
    "content": "{\n\t\"compilerOptions\": {\n\t\t\"outDir\": \"dist\",\n\t\t\"target\": \"es6\",\n\t\t\"module\": \"commonjs\",\n\t\t\"strict\": true,\n\t\t\"esModuleInterop\": true,\n\t\t\"skipLibCheck\": true,\n\t\t\"forceConsistentCasingInFileNames\": true\n\t},\n\t\"include\": [\n\t\t\"src/**/*.ts\",\n\t\t\"./environment.d.ts\"\n\t],\n\t\"exclude\": [\n\t\t\"node_modules\"\n\t]\n}"
  },
  {
    "path": "eslint.config.mjs",
    "content": "import js from \"@eslint/js\";\nimport stylistic from \"@stylistic/eslint-plugin\";\nimport globals from \"globals\";\n\n/** @type {import(\"@types/eslint\").Linter.FlatConfig[]} */\nexport default [\n\t{\n\t\t// \"if an ignores key is used without any other keys in the configuration object, then the patterns act as global ignores\"\n\t\t\"ignores\": [\n\t\t\t\"**/node_modules/\",\n\t\t\t\"**/.git/\",\n\t\t\t\"**/.history/\",\n\t\t\t\"**/.idea/\",\n\t\t\t\"**/.vscode/\",\n\t\t\t\"**/lib/\", // vendored dependencies\n\t\t\t\"**/out/\", // Electron build\n\t\t\t\"**/build/\", // maybe nothing\n\t\t\t\"**/dist/\", // maybe nothing\n\t\t\t\"**/localization/*/*.js\", // generated files (note that there is some non-generated JS directly in `localization/`, hence not using `**/localization/**/*.js`)\n\t\t],\n\t},\n\tjs.configs.recommended,\n\t{\n\t\t\"linterOptions\": {\n\t\t\t\"reportUnusedDisableDirectives\": \"warn\",\n\t\t},\n\t\t\"languageOptions\": {\n\t\t\t\"ecmaVersion\": 2022,\n\t\t\t\"sourceType\": \"module\",\n\t\t\t\"globals\": {\n\t\t\t\t...globals.browser,\n\t\t\t\t...globals.es2022,\n\t\t\t\t// libraries\n\t\t\t\t\"$\": \"readonly\",\n\t\t\t\t\"jQuery\": \"readonly\",\n\t\t\t\t\"libtess\": \"readonly\",\n\t\t\t\t\"firebase\": \"readonly\",\n\t\t\t\t\"GIF\": \"readonly\",\n\t\t\t\t\"saveAs\": \"readonly\",\n\t\t\t\t\"YT\": \"readonly\",\n\t\t\t\t\"FontDetective\": \"readonly\",\n\t\t\t\t\"AnyPalette\": \"readonly\",\n\t\t\t\t\"ImageTracer\": \"readonly\",\n\t\t\t\t// os-gui's MenuBar.js\n\t\t\t\t// \"MenuBar\": \"readonly\",\n\t\t\t\t// \"MENU_DIVIDER\": \"readonly\",\n\t\t\t\t// os-gui's $Window.js\n\t\t\t\t// \"$Window\": \"readonly\",\n\t\t\t\t// \"$FormWindow\": \"readonly\",\n\t\t\t\t// os-gui's parse-theme.js has more\n\t\t\t},\n\t\t},\n\t\t\"plugins\": {\n\t\t\t\"@stylistic\": stylistic,\n\t\t},\n\t\t\"rules\": {\n\t\t\t\"no-undef\": \"warn\",\n\t\t\t\"no-unused-vars\": [\"warn\", {\n\t\t\t\t\"args\": \"all\",\n\t\t\t\t\"argsIgnorePattern\": \"^_\",\n\t\t\t\t\"caughtErrorsIgnorePattern\": \"^_\",\n\t\t\t\t// \"varsIgnorePattern\": \"^_\",\n\t\t\t}],\n\n\t\t\t// \"eqeqeq\": \"error\",\n\t\t\t// \"class-methods-use-this\": \"error\",\n\t\t\t\"no-alert\": \"error\",\n\t\t\t\"no-extend-native\": \"error\",\n\t\t\t\"no-extra-bind\": \"error\",\n\t\t\t\"no-invalid-this\": \"error\",\n\t\t\t\"no-new-func\": \"error\",\n\t\t\t\"no-eval\": \"error\",\n\t\t\t\"no-new-wrappers\": \"error\",\n\t\t\t\"no-proto\": \"error\",\n\t\t\t\"no-return-assign\": \"error\",\n\t\t\t\"no-script-url\": \"error\",\n\t\t\t\"no-self-compare\": \"error\",\n\t\t\t\"no-sequences\": \"error\",\n\t\t\t\"no-throw-literal\": \"error\",\n\t\t\t\"no-unmodified-loop-condition\": \"error\",\n\t\t\t\"no-unused-expressions\": \"error\", // Tip: `a && a();` can become `a?.();` https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining\n\t\t\t\"no-useless-concat\": \"error\",\n\t\t\t\"prefer-promise-reject-errors\": \"error\",\n\t\t\t\"radix\": \"error\",\n\t\t\t\"require-await\": \"error\",\n\t\t\t// \"vars-on-top\": \"error\",\n\t\t\t\"no-label-var\": \"error\",\n\t\t\t// \"no-shadow\": \"error\",\n\t\t\t// \"no-use-before-define\": \"error\",\n\n\t\t\t// To target specific variables to rename or otherwise address:\n\t\t\t\"no-restricted-globals\": [\"error\", \"event\", \"canvas\", \"ctx\", \"colors\", \"i\", \"j\", \"k\", \"x\", \"y\", \"z\", \"width\", \"height\", \"w\", \"h\"],\n\n\t\t\t// Stylistic:\n\t\t\t\"@stylistic/array-bracket-newline\": [\"error\", \"consistent\"],\n\t\t\t\"@stylistic/array-bracket-spacing\": [\"error\", \"never\"],\n\t\t\t// \"@stylistic/array-element-newline\": [\"error\", \"consistent\"], // lot of big arrays with sometimes meaningful line breaks; could exclude certain files though\n\t\t\t\"@stylistic/arrow-parens\": [\"error\", \"always\"],\n\t\t\t\"@stylistic/arrow-spacing\": [\"error\", { \"before\": true, \"after\": true }],\n\t\t\t\"@stylistic/block-spacing\": [\"error\", \"always\"],\n\t\t\t\"@stylistic/brace-style\": [\"error\", \"1tbs\", { \"allowSingleLine\": true }],\n\t\t\t\"@stylistic/comma-dangle\": [\"error\", {\n\t\t\t\t\"arrays\": \"always-multiline\", // ensure commas to avoid confusing git diffs\n\t\t\t\t\"objects\": \"always-multiline\", // ensure commas to avoid confusing git diffs\n\t\t\t\t\"imports\": \"never\", // always a single line anyways\n\t\t\t\t\"exports\": \"never\", // matches VS Code's default JS/TS formatter\n\t\t\t\t\"functions\": \"only-multiline\", // commas sometimes avoid confusing git diffs, sometimes are confusing themselves\n\t\t\t}],\n\t\t\t\"@stylistic/comma-spacing\": [\"error\", { \"before\": false, \"after\": true }],\n\t\t\t\"@stylistic/comma-style\": [\"error\", \"last\"],\n\t\t\t\"@stylistic/computed-property-spacing\": [\"error\", \"never\"],\n\t\t\t\"@stylistic/dot-location\": [\"error\", \"property\"],\n\t\t\t\"@stylistic/eol-last\": [\"error\", \"always\"],\n\t\t\t// \"@stylistic/function-call-argument-newline\": [\"error\", \"consistent\"], // several places with meaningful line breaks grouping arguments\n\t\t\t\"@stylistic/function-call-spacing\": [\"error\", \"never\"],\n\t\t\t// \"@stylistic/function-paren-newline\": [\"error\", \"multiline-arguments\"], // several places with meaningful line breaks grouping arguments\n\t\t\t\"@stylistic/generator-star-spacing\": [\"error\", \"after\"],\n\t\t\t// \"@stylistic/implicit-arrow-linebreak\": [\"error\", \"beside\"], // could encourage parens for clarity, but ESLint won't mention that's the reason, so probably not a good idea\n\t\t\t// The indent settings are mostly defaults copied from https://github.com/eslint-stylistic/eslint-stylistic/blob/c11f1d6f26c13b29fd44c95c908922cb79a0ac82/packages/eslint-plugin/configs/customize.ts#L115-L154\n\t\t\t\"@stylistic/indent\": [\"error\", \"tab\", {\n\t\t\t\tArrayExpression: 1,\n\t\t\t\tCallExpression: { arguments: 1 },\n\t\t\t\tflatTernaryExpressions: false,\n\t\t\t\tFunctionDeclaration: { body: 1, parameters: 1 },\n\t\t\t\tFunctionExpression: { body: 1, parameters: 1 },\n\t\t\t\tignoreComments: true, // modified from default\n\t\t\t\tignoredNodes: [\n\t\t\t\t\t\"TemplateLiteral *\",\n\t\t\t\t\t\"JSXElement\",\n\t\t\t\t\t\"JSXElement > *\",\n\t\t\t\t\t\"JSXAttribute\",\n\t\t\t\t\t\"JSXIdentifier\",\n\t\t\t\t\t\"JSXNamespacedName\",\n\t\t\t\t\t\"JSXMemberExpression\",\n\t\t\t\t\t\"JSXSpreadAttribute\",\n\t\t\t\t\t\"JSXExpressionContainer\",\n\t\t\t\t\t\"JSXOpeningElement\",\n\t\t\t\t\t\"JSXClosingElement\",\n\t\t\t\t\t\"JSXFragment\",\n\t\t\t\t\t\"JSXOpeningFragment\",\n\t\t\t\t\t\"JSXClosingFragment\",\n\t\t\t\t\t\"JSXText\",\n\t\t\t\t\t\"JSXEmptyExpression\",\n\t\t\t\t\t\"JSXSpreadChild\",\n\t\t\t\t\t\"TSUnionType\",\n\t\t\t\t\t\"TSIntersectionType\",\n\t\t\t\t\t\"TSTypeParameterInstantiation\",\n\t\t\t\t\t\"FunctionExpression > .params[decorators.length > 0]\",\n\t\t\t\t\t\"FunctionExpression > .params > :matches(Decorator, :not(:first-child))\",\n\t\t\t\t\t\"ClassBody.body > PropertyDefinition[decorators.length > 0] > .key\",\n\t\t\t\t],\n\t\t\t\tImportDeclaration: 1,\n\t\t\t\tMemberExpression: 1,\n\t\t\t\tObjectExpression: 1,\n\t\t\t\toffsetTernaryExpressions: false,\n\t\t\t\touterIIFEBody: 1,\n\t\t\t\tSwitchCase: 1,\n\t\t\t\tVariableDeclarator: 1,\n\t\t\t}],\n\t\t\t\"@stylistic/indent-binary-ops\": [\"error\", \"tab\"],\n\t\t\t// \"@stylistic/jsx-child-element-spacing\": \"off\",\n\t\t\t// \"@stylistic/jsx-closing-bracket-location\": \"off\",\n\t\t\t// \"@stylistic/jsx-closing-tag-location\": \"off\",\n\t\t\t// \"@stylistic/jsx-curly-brace-presence\": \"off\",\n\t\t\t// \"@stylistic/jsx-curly-newline\": \"off\",\n\t\t\t// \"@stylistic/jsx-curly-spacing\": \"off\",\n\t\t\t// \"@stylistic/jsx-equals-spacing\": \"off\",\n\t\t\t// \"@stylistic/jsx-first-prop-new-line\": \"off\",\n\t\t\t// \"@stylistic/jsx-function-call-newline\": \"off\",\n\t\t\t// \"@stylistic/jsx-indent\": \"off\",\n\t\t\t// \"@stylistic/jsx-indent-props\": \"off\",\n\t\t\t// \"@stylistic/jsx-max-props-per-line\": \"off\",\n\t\t\t// \"@stylistic/jsx-newline\": \"off\",\n\t\t\t// \"@stylistic/jsx-one-expression-per-line\": \"off\",\n\t\t\t// \"@stylistic/jsx-pascal-case\": \"off\",\n\t\t\t// \"@stylistic/jsx-props-no-multi-spaces\": \"off\",\n\t\t\t// \"@stylistic/jsx-quotes\": \"off\",\n\t\t\t// \"@stylistic/jsx-self-closing-comp\": \"off\",\n\t\t\t// \"@stylistic/jsx-sort-props\": \"off\",\n\t\t\t// \"@stylistic/jsx-tag-spacing\": \"off\",\n\t\t\t// \"@stylistic/jsx-wrap-multilines\": \"off\",\n\t\t\t\"@stylistic/key-spacing\": [\"error\", { \"beforeColon\": false, \"afterColon\": true }],\n\t\t\t\"@stylistic/keyword-spacing\": [\"error\", { \"before\": true, \"after\": true }],\n\t\t\t// \"@stylistic/line-comment-position\": \"off\",\n\t\t\t// \"@stylistic/linebreak-style\": \"off\",\n\t\t\t// \"@stylistic/lines-around-comment\": [\"error\", \"\"], // TODO maybe (so many options...)\n\t\t\t\"@stylistic/lines-between-class-members\": [\"error\", \"never\"],\n\t\t\t// \"@stylistic/max-len\": [\"error\", \"\"], // TODO maybe along with changing export {} to individual exports\n\t\t\t\"@stylistic/max-statements-per-line\": [\"error\", { \"max\": 4 }], // TODO: maybe decrease this\n\t\t\t// TODO: lint .d.ts files, and ideally JSDoc comments\n\t\t\t// \"@stylistic/member-delimiter-style\": [\"error\", { \"multiline\": { \"delimiter\": \"semi\", \"requireLast\": true }, \"singleline\": { \"delimiter\": \"semi\", \"requireLast\": true } }],\n\t\t\t// \"@stylistic/multiline-comment-style\": [\"error\", \"separate-lines\"], // I use block comments sometimes for disabled code; also this is detecting a few JSDoc comments even though it says it won't without \"checkJSDoc\" set to true.\n\t\t\t// \"@stylistic/multiline-ternary\": [\"error\", \"always-multiline\"], // might want to change the ternary style in the future...\n\t\t\t\"@stylistic/new-parens\": [\"error\", \"always\"],\n\t\t\t\"@stylistic/newline-per-chained-call\": [\"error\", { \"ignoreChainWithDepth\": 5 }], // TODO: maybe decrease this\n\t\t\t// \"@stylistic/no-confusing-arrow\": [\"error\", { \"allowParens\": true }], // don't really like the changes this implies in the couple of places it flags\n\t\t\t// \"@stylistic/no-extra-parens\": [\"error\", \"all\"], // if there are extra parens, it's probably for clarity (TODO: look at the granular options), also, this doesn't seem to detect cases it should for function calls?\n\t\t\t\"@stylistic/no-extra-semi\": \"error\",\n\t\t\t\"@stylistic/no-floating-decimal\": \"error\",\n\t\t\t// \"@stylistic/no-mixed-operators\": [\"error\", ...], // TODO: investigate options\n\t\t\t\"@stylistic/no-mixed-spaces-and-tabs\": \"error\",\n\t\t\t\"@stylistic/no-multi-spaces\": \"error\",\n\t\t\t\"@stylistic/no-multiple-empty-lines\": [\"error\", { \"max\": 2, \"maxEOF\": 1 }],\n\t\t\t// \"@stylistic/no-tabs\": \"off\", // I use tabs for indentation, in disabled code, and in template literals\n\t\t\t\"@stylistic/no-trailing-spaces\": \"error\",\n\t\t\t\"@stylistic/no-whitespace-before-property\": \"error\",\n\t\t\t\"@stylistic/nonblock-statement-body-position\": [\"error\", \"beside\"], // TODO: maybe drop curly braces from single line conditionals\n\t\t\t// \"@stylistic/object-curly-newline\": [\"error\", \"\"], // TODO: investigate options\n\t\t\t\"@stylistic/object-curly-spacing\": [\"error\", \"always\"],\n\t\t\t\"@stylistic/object-property-newline\": [\"error\", { \"allowAllPropertiesOnSameLine\": true }],\n\t\t\t// \"@stylistic/one-var-declaration-per-line\": [\"error\", \"always\"], // TODO maybe? there is a risk of `let a, b = 0;` leaving `a` as undefined, but sometimes it just looks better, for related variables...\n\t\t\t\"@stylistic/operator-linebreak\": [\"error\", \"after\"], // not sure about ternary operator tbh\n\t\t\t// \"@stylistic/padded-blocks\": \"off\", // it depends, especially on how much stuff is in the block\n\t\t\t// \"@stylistic/padding-line-between-statements\": [\"error\", \"\"], // TODO: investigate options, looks very complex\n\t\t\t// \"@stylistic/quote-props\": [\"error\", \"consistent\"], // I prefer it inconsistent if it's just for a few CSS custom properties when setting several CSS properties at once, especially since it's not going to be consistent with object property shorthand e.g. { \"--requires-quotes\": requiresQuotes, \"quotedForConsistency\": true, inconsistent }\n\t\t\t\"@stylistic/quotes\": [\"error\", \"double\", { \"avoidEscape\": true, \"allowTemplateLiterals\": true }], // Note: allowTemplateLiterals allows template literals without any substitutions, and removing \"allowTemplateLiterals\" doesn't allow them for avoiding escaping\n\t\t\t\"@stylistic/rest-spread-spacing\": [\"error\", \"never\"],\n\t\t\t\"@stylistic/semi\": [\"error\", \"always\"],\n\t\t\t\"@stylistic/semi-spacing\": [\"error\", { \"before\": false, \"after\": true }],\n\t\t\t\"@stylistic/semi-style\": [\"error\", \"last\"],\n\t\t\t\"@stylistic/space-before-blocks\": [\"error\", \"always\"],\n\t\t\t\"@stylistic/space-before-function-paren\": [\"error\", {\n\t\t\t\t\"anonymous\": \"always\",\n\t\t\t\t\"named\": \"never\",\n\t\t\t\t\"asyncArrow\": \"always\",\n\t\t\t}],\n\t\t\t\"@stylistic/space-in-parens\": [\"error\", \"never\"],\n\t\t\t\"@stylistic/space-infix-ops\": \"error\",\n\t\t\t\"@stylistic/space-unary-ops\": [\"error\", {\n\t\t\t\t\"words\": true,\n\t\t\t\t\"nonwords\": false,\n\t\t\t}],\n\t\t\t// \"@stylistic/spaced-comment\": [\"error\", \"always\"], // TODO: investigate\n\t\t\t\"@stylistic/switch-colon-spacing\": [\"error\", { \"after\": true, \"before\": false }],\n\t\t\t\"@stylistic/template-curly-spacing\": [\"error\", \"never\"],\n\t\t\t\"@stylistic/template-tag-spacing\": [\"error\", \"never\"],\n\t\t\t// \"@stylistic/type-annotation-spacing\": [\"error\", \"\"], // TODO: lint TS\n\t\t\t// \"@stylistic/type-generic-spacing\": [\"error\", \"\"], // TODO: lint TS\n\t\t\t// \"@stylistic/type-named-tuple-spacing\": [\"error\", \"\"], // TODO: lint TS\n\t\t\t\"@stylistic/wrap-iife\": [\"error\", \"inside\"],\n\t\t\t// \"@stylistic/wrap-regex\": \"error\", // does that really clarify things? eh\n\t\t\t\"@stylistic/yield-star-spacing\": [\"error\", \"after\"],\n\t\t},\n\t},\n\t{\n\t\t\"files\": [\n\t\t\t\"help/vaporwave.js\",\n\t\t\t\"src/app-localization.js\",\n\t\t\t\"src/app-state.js\",\n\t\t\t\"src/copy-inkscape-labels.js\",\n\t\t\t\"src/error-handling-basic.js\",\n\t\t\t\"svg-paint/svg-paint.js\",\n\t\t\t\"localization/**/*.js\",\n\t\t],\n\t\t\"languageOptions\": {\n\t\t\t\"sourceType\": \"script\",\n\t\t},\n\t},\n\t{\n\t\t\"files\": [\n\t\t\t\"forge.config.js\",\n\t\t\t\"src/electron-injected.js\",\n\t\t\t\"src/electron-main.js\",\n\t\t\t\"sync-package.js\",\n\t\t\t\"prune-globals.js\",\n\t\t\t\"cypress/plugins/index.js\",\n\t\t\t\"localization/*.js\",\n\t\t],\n\t\t\"languageOptions\": {\n\t\t\t\"sourceType\": \"commonjs\",\n\t\t\t\"globals\": {\n\t\t\t\t...globals.node,\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\t\"files\": [\n\t\t\t\"cypress/**/*.js\",\n\t\t],\n\t\t\"languageOptions\": {\n\t\t\t\"globals\": {\n\t\t\t\t...globals.mocha,\n\t\t\t\t\"expect\": \"readonly\",\n\t\t\t\t\"cy\": \"readonly\",\n\t\t\t\t\"Cypress\": \"readonly\",\n\t\t\t},\n\t\t},\n\t},\n];\n"
  },
  {
    "path": "forge.config.js",
    "content": "const sharedDebRpmOptions = {\n\tname: \"jspaint\",\n\tproductName: \"JS Paint\",\n\tproductDescription: \"MS Paint clone with extra features\",\n\tgenericName: \"Image Editor\",\n\thomepage: \"https://jspaint.app/about\",\n\ticon: \"images/icons/512x512.png\",\n\tcategories: [\n\t\t\"Graphics\",\n\t],\n\tmimeType: [\n\t\t// Affects whether the app shows as a recommended app in the \"Open With\" menu/dialog\n\t\t\"image/*\", // wildcard doesn't seem to work\n\t\t\"image/bmp\",\n\t\t\"image/gif\",\n\t\t\"image/jpeg\",\n\t\t\"image/png\",\n\t\t\"image/tiff\",\n\t\t\"image/webp\",\n\t\t\"image/avif\",\n\t\t\"image/x-icon\",\n\t\t\"image/vnd.microsoft.icon\",\n\t\t\"image/x-win-bitmap\",\n\t\t\"image/x-icns\",\n\t\t\"application/x-gimp-palette\",\n\t],\n};\nmodule.exports = {\n\tpackagerConfig: {\n\t\ticon: \"./images/icons/jspaint\",\n\t\tname: \"JS Paint\",\n\t\texecutableName: \"jspaint\",\n\t\tappBundleId: \"io.isaiahodhner.jspaint\",\n\t\tappCategoryType: \"public.app-category.graphics-design\",\n\t\tappCopyright: \"© 2024 Isaiah Odhner\",\n\t\textendInfo: {\n\t\t\t// Based on https://gist.github.com/sonnypgs/de2b6a4a4936d5b8e0fe43946002964a\n\t\t\t// This extends Info.plist to allow dropping files onto the macOS dock icon.\n\t\t\t// (all files, not just images, since it's much simpler and I support loading palettes from arbitrary text files)\n\t\t\tCFBundleDocumentTypes: [\n\t\t\t\t{\n\t\t\t\t\tCFBundleTypeName: \"All Files\",\n\t\t\t\t\tCFBundleTypeRole: \"Editor\", // *\n\t\t\t\t\tLSHandlerRank: \"Alternate\",\n\t\t\t\t\tLSItemContentTypes: [\n\t\t\t\t\t\t\"public.data\",\n\t\t\t\t\t\t\"public.content\",\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t\t// *Added, but... I'm not sure what CFBundleTypeRole exactly affects in practice.\n\t\t\t// The app is an editor, of both images and palettes, but it's not an editor of all file types,\n\t\t\t// so it's unclear if this is appropriate.\n\t\t\t// TODO: granular image types?\n\t\t\t// like https://github.com/electron/forge/issues/492#issuecomment-385956851\n\t\t},\n\t\tjunk: true,\n\t\t// TODO: assess filtering of files; I see eslint in node_modules, why? prune is true by default\n\t\tignore: [\n\t\t\t\".history\", // VS Code \"Local History\" extension\n\t\t\t\"cypress\", // Cypress tests\n\t\t\t\"cypress.json\", // Cypress config\n\t\t\t\"browserconfig.xml\", // Windows 8/10 start menu tile\n\t\t\t\"about.html\", // homepage\n\t\t\t\"parse-rc-file.js\", // localization\n\t\t\t\"preprocess.js\", // localization\n\t\t\t/\\.rc$/, // localization\n\t\t\t/\\.sh$/, // localization\n\t\t\t/\\.psd$/, // theming source files\n\t\t\t\"images/meta\", // images used on README, OpenGraph, etc. (arguably README images could be included)\n\t\t\t// TODO: \"lib/pdf.js/web\", // PDF.js UI? (PDF.js is only used as a library, but does it use data from this folder?)\n\t\t\t// TODO: Bubblegum theme has some files that are embedded in an SVG, so they're not used directly\n\t\t\t// I'd want to move them to a folder or give them a suffix or something, rather than just ignoring them as they are,\n\t\t\t// since I may want to use them in the future.\n\t\t],\n\t\t// TODO: maybe\n\t\t// https://electron.github.io/packager/main/interfaces/Options.html#darwinDarkModeSupport\n\t},\n\tmakers: [\n\t\t{\n\t\t\tname: \"@electron-forge/maker-squirrel\",\n\t\t\tconfig: {\n\t\t\t\tname: \"jspaint\",\n\t\t\t\texe: \"jspaint.exe\",\n\t\t\t\ttitle: \"JS Paint\",\n\t\t\t\tdescription: \"MS Paint clone with extra features\",\n\t\t\t\ticonUrl: \"https://raw.githubusercontent.com/1j01/jspaint/5af996478e28a32627794526ec9d25a799187119/images/icons/192x192.png\",\n\t\t\t\tsetupIcon: \"./images/icons/jspaint.ico\",\n\t\t\t\tloadingGif: \"images/about/flagani.gif\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"@electron-forge/maker-zip\",\n\t\t\tplatforms: [\n\t\t\t\t\"darwin\", // macOS uses a .zip, which may be automatically extracted when opened\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tname: \"@electron-forge/maker-deb\",\n\t\t\tconfig: {\n\t\t\t\toptions: {\n\t\t\t\t\t...sharedDebRpmOptions,\n\t\t\t\t\tsection: \"graphics\",\n\t\t\t\t\tmaintainer: \"Isaiah Odhner <isaiahodhner@gmail.com>\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"@electron-forge/maker-rpm\",\n\t\t\tconfig: {\n\t\t\t\toptions: {\n\t\t\t\t\t...sharedDebRpmOptions,\n\t\t\t\t\tlicense: \"MIT\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t],\n\tpublishers: [\n\t\t{\n\t\t\tname: \"@electron-forge/publisher-github\",\n\t\t\tconfig: {\n\t\t\t\trepository: {\n\t\t\t\t\towner: \"1j01\",\n\t\t\t\t\tname: \"jspaint\",\n\t\t\t\t},\n\t\t\t\tprerelease: true,\n\t\t\t\tdraft: true,\n\t\t\t},\n\t\t},\n\t],\n};\n"
  },
  {
    "path": "help/coUA.css",
    "content": "/* Originally: Cascading Style Sheet for IE4.01 last updated 1-28-98 */\n\n/* for scrollbars and selection color */\n@import \"../lib/os-gui/build/windows-98.css\";\n\nbody {\n\tbackground: #FFFFFF;\n\t/* background: var(--Info); */\n\t/* color: var(--InfoText); */\n\tcolor: var(--WindowText);\n\tfont-size: 70%;\n\tfont-family: Verdana, Arial, Helvetica, \"MS Sans Serif\";\n}\n\na:link {\n\tcolor: #0000CC;\n\tcolor: var(--HotTrackingColor);\n}\n\na:active {\n\tcolor: #996699;\n}\n\na:visited {\n\tcolor: #996699;\n}\n\np {\n\tmargin-top: .6em;\n\tmargin-bottom: .6em;\n}\n\np.bigfix {\n\tmargin-top: -.4em;\n\tmargin-bottom: 0em;\n}\n\np.margin {\n\t/* for SMS links */\n\tmargin-left: 2em;\n\tmargin-top: -1.75em;\n}\n\np.K2 {\n\tmargin-top: 0em;\n\tmargin-left: 10pt;\n}\n\n/* HEADING TAGS */\n\nh1 {\n\tfont-size: 145%;\n\tmargin-bottom: .5em;\n}\n\nh2 {\n\tfont-size: 125%;\n\tmargin-top: 1.5em;\n\tmargin-bottom: .5em;\n}\n\nh3 {\n\tfont-size: 110%;\n\tmargin-top: 1.2em;\n\tmargin-bottom: .5em;\n}\n\nh4 {\n\tfont-size: 105%;\n\tmargin-top: 1.2em;\n\tmargin-bottom: .5em;\n}\n\nh5 {\n\tfont-size: 100%;\n\tmargin-top: 1.2em;\n\tmargin-bottom: .5em;\n}\n\nbig {\n\tfont-weight: bold;\n\tfont-size: 105%;\n}\n\np.proclabel {\n\t/* procedure heading */\n\tfont-weight: bold;\n\tfont-size: 100%;\n\tmargin-top: 1.2em;\n}\n\n\n/* LIST TAGS */\n\nol {\n\tmargin-top: .6em;\n\tmargin-bottom: 0em;\n\tmargin-left: 4em; /* @FIXME */\n}\n\nul {\n\tmargin-top: .6em;\n\tmargin-bottom: 0em;\n}\n\nol ul {\n\tlist-style: disc;\n\tmargin-top: .6em;\n}\n\nul ul {\n\tlist-style: disc;\n}\n\nli {\n\tmargin-bottom: .7em;\n\tmargin-left: -2em;\n}\n\t\t\n\t\t\n\n/* TERM AND DEFINITION TAGS */\n\ndl {\n\tmargin-top: 0em;\n}\n\ndt {\n\tfont-weight: bold;\n\tmargin-top: 1em;\n\t/* margin-left: 0em; */ /* for SMS terms */\n\tmargin-left: 1.5em;\n}\n\ndd {\n\tmargin-bottom: 0em;\n\t/*not currently working*/\n\tmargin-left: 1.5em;\n}\n\ndl li {\n\tmargin-bottom: .7em;\n}\t/*list item inside a term/def list*/\n\ndl dl {\n\tmargin-top: 0em;\n\tmargin-left: 0em;\n}\t/*term/def list inside a term/def list*/\n\n\n\n/* TABLE TAGS */\n\n\ntable {\n\tfont-size: 100%;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n}\n\nth {\n\ttext-align: left;\n\tvertical-align: bottom;\n\tbackground: #dddddd;\n}\n\nth.center {\n\ttext-align: center;\n}\n\ntr {\n\tvertical-align: top;\n}\n\ntd {\n\t/* not used for K2 */\n\tvertical-align: top;\n\tbackground: #eeeeee;\n}\n\n\n/* MISC. TAGS */\n\npre {\n\tfont-family: Courier;\n\tfont-size: 125%;\n\tmargin-top: 1.2em;\n\tmargin-bottom: 1.5em;\n}\n\ncode {\n\tfont-family: Courier;\n\tfont-size: 125%;\n}\n\npre code {\n\tfont-size: 100%;\n}\n\nhr.sms {\n\t/* SMS specific rule used under procedure title */\n\tcolor: black;\n\ttext-align: left;\n}\n\nhr.iis {\n\t/* IIS specific - preceding copyright */\n\tcolor: black;\n}\n"
  },
  {
    "path": "help/default.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>Welcome to Help</title>\n\t<link href=\"nobgcolor.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<div id=\"background-animation\"></div>\n\t<hr id=\"os-logo-colorbar\">\n\t<div id=\"foreground-contents\">\n\t\t<a href=\"https://98.js.org/\" target=\"_blank\" id=\"os-logo-link\">\n\t\t\t<img src=\"../images/98.js.org.svg\" alt=\"98.js.org\" id=\"os-logo\" height=\"100\">\n\t\t</a>\n\t\t<br>\n\t\t<p><font size=\"2\"><b>Welcome to Help</b></font></p>\n\t\t<p>Use the Help system to learn more about <a href=\"https://98.js.org/\" target=\"_blank\">98.js.org</a> and JS Paint.</p>\n\t\t<ul>\n\t\t\t<li>Find answers to your questions.</li>\n\t\t\t<li><strike>Browse the online version of the <i>Getting Started</i> book.</strike></li>\n\t\t\t<li><strike>Connect to the Web to get software updates.</strike></li>\n\t\t\t<li><strike>Troubleshoot your system.</strike></li>\n\t\t</ul>\n\t\t<br>\n\t\t<br>\n\t\t<br>\n\t\t<br>\n\t\t<br>\n\t\t<br>\n\t\t<p><a href=\"memcopy.html\">Original documentation © 1998 Microsoft Corporation, all rights reserved.</a></p>\n\t</div>\n\t<script src=\"vaporwave.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "help/memcopy.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>Legal Information</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#000000\">\n\t<h1 id=\"LegalInformation\">Legal Information</h1>\n\t<p><strong>Microsoft Windows 98</strong></p>\n\t<p>Information in this document is subject to change without notice. The names of companies, products, people, characters, and/or data mentioned herein are fictitious and are in no way intended to represent any real individual, company, product, or event, unless otherwise noted. Complying with all applicable copyright laws is the responsibility of the user. No part of this document may be reproduced or transmitted in any form or by any means, electronic or mechanical, for any purpose, without the express written permission of Microsoft Corporation.</p>\n\t<p>Microsoft may have patents, patent applications, trademarks, copyrights, or other intellectual property rights covering subject matter in this document. Except as expressly provided in any written license agreement from Microsoft, the furnishing of this document does not give you any license to these patents, trademarks, copyrights, or other intellectual property.</p>\n\t<p>© 1998 Microsoft Corporation. All rights reserved.</p>\n\t<p>Microsoft, ActiveX, BackOffice, MS, MS-DOS, MSN, Windows, and Windows&#160;NT are either registered trademarks or trademarks of Microsoft Corporation in the U.S.A. and/or other countries.</p>\n\t<p>Other product and company names mentioned herein may be the trademarks of their respective owners.</p>\n</body>\n</html>\n"
  },
  {
    "path": "help/mspaint.hhc",
    "content": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n<HTML>\n<HEAD>\n<meta name=\"GENERATOR\" content=\"Microsoft&reg; HTML Help Workshop 4.00\">\n<!-- Sitemap 1.0 -->\n</HEAD><BODY>\n<OBJECT type=\"text/site properties\">\n\t<param name=\"Window Styles\" value=\"0x800624\">\n</OBJECT>\n<UL>\n\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t<param name=\"Name\" value=\"Drawing Lines and Shapes\">\n\t\t</OBJECT>\n\t<UL>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Draw a straight line \">\n\t\t\t<param name=\"Local\" value=\"paint_lines.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Draw a free-form line \">\n\t\t\t<param name=\"Local\" value=\"paint_freeform_lines.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Draw a curved line\">\n\t\t\t<param name=\"Local\" value=\"paint_curves.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Draw an ellipse or circle \">\n\t\t\t<param name=\"Local\" value=\"paint_ovals.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Draw a rectangle or square \">\n\t\t\t<param name=\"Local\" value=\"paint_rectangles.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Draw a polygon \">\n\t\t\t<param name=\"Local\" value=\"paint_polygons.html\">\n\t\t\t</OBJECT>\n\t</UL>\n\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t<param name=\"Name\" value=\"Putting Text in Pictures\">\n\t\t</OBJECT>\n\t<UL>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Type and format text \">\n\t\t\t<param name=\"Local\" value=\"paint_text.html\">\n\t\t\t</OBJECT>\n\t</UL>\n\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t<param name=\"Name\" value=\"Working with Color\">\n\t\t</OBJECT>\n\t<UL>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Set the default foreground and background colors\">\n\t\t\t<param name=\"Local\" value=\"paint_set_default_colors.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Fill an area with color \">\n\t\t\t<param name=\"Local\" value=\"paint_fill.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Paint with a brush \">\n\t\t\t<param name=\"Local\" value=\"paint_brush.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Create an airbrush effect \">\n\t\t\t<param name=\"Local\" value=\"paint_airbrush.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Create custom colors \">\n\t\t\t<param name=\"Local\" value=\"paint_custom_colors.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Use black and white instead of color \">\n\t\t\t<param name=\"Local\" value=\"paint_blackwhite.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Invert all the colors in a picture \">\n\t\t\t<param name=\"Local\" value=\"paint_invert.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Change the color of an existing line \">\n\t\t\t<param name=\"Local\" value=\"paint_change_color.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Copy color from one area or object to another \">\n\t\t\t<param name=\"Local\" value=\"paint_not_in_color_box.html\">\n\t\t\t</OBJECT>\n\t</UL>\n\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t<param name=\"Name\" value=\"Erasing\">\n\t\t</OBJECT>\n\t<UL>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Erase a small area\">\n\t\t\t<param name=\"Local\" value=\"paint_erase_small.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Erase a large area\">\n\t\t\t<param name=\"Local\" value=\"paint_erase_large.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Erase an entire image\">\n\t\t\t<param name=\"Local\" value=\"paint_clear_image.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Undo changes \">\n\t\t\t<param name=\"Local\" value=\"paint_undo.html\">\n\t\t\t</OBJECT>\n\t</UL>\n\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t<param name=\"Name\" value=\"Working with Part of the Picture\">\n\t\t</OBJECT>\n\t<UL>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Select part of a picture \">\n\t\t\t<param name=\"Local\" value=\"paint_cutout_select.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Copy and paste part of a picture\">\n\t\t\t<param name=\"Local\" value=\"paint_cutout_copy_move.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Save part of a picture into a bitmap file \">\n\t\t\t<param name=\"Local\" value=\"paint_cutout_save.html\">\n\t\t\t</OBJECT>\n\t</UL>\n\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t<param name=\"Name\" value=\"Changing How Your Picture Looks on the Screen\">\n\t\t</OBJECT>\n\t<UL>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Change the size of your picture\">\n\t\t\t<param name=\"Local\" value=\"paint_change_size.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Zoom in or out \">\n\t\t\t<param name=\"Local\" value=\"paint_zoom.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Enlarge the size of the viewing area\">\n\t\t\t<param name=\"Local\" value=\"paint_enlarge_area.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Display gridlines \">\n\t\t\t<param name=\"Local\" value=\"paint_grid.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Flip or rotate a picture \">\n\t\t\t<param name=\"Local\" value=\"paint_flip_picture.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Stretch or skew an item\">\n\t\t\t<param name=\"Local\" value=\"paint_skew_picture.html\">\n\t\t\t</OBJECT>\n\t</UL>\n\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t<param name=\"Name\" value=\"Printing\">\n\t\t</OBJECT>\n\t<UL>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Print a picture \">\n\t\t\t<param name=\"Local\" value=\"paint_print.html\">\n\t\t\t</OBJECT>\n\t</UL>\n\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t<param name=\"Name\" value=\"Using Paint with Other Programs\">\n\t\t</OBJECT>\n\t<UL>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Insert a bitmap file into the current picture\">\n\t\t\t<param name=\"Local\" value=\"paint_insert_file.html\">\n\t\t\t</OBJECT>\n\t</UL>\n\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t<param name=\"Name\" value=\"Tips and Tricks\">\n\t\t</OBJECT>\n\t<UL>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Use a picture as your desktop background \">\n\t\t\t<param name=\"Local\" value=\"paint_wallpaper.html\">\n\t\t\t</OBJECT>\n\t\t<LI> <OBJECT type=\"text/sitemap\">\n\t\t\t<param name=\"Name\" value=\"Display the tool box\">\n\t\t\t<param name=\"Local\" value=\"paint_toolbox.html\">\n\t\t\t</OBJECT>\n\t</UL>\n</UL>\n</BODY></HTML>\n"
  },
  {
    "path": "help/mspaint.hhk",
    "content": "<HTML>\n<HEAD>\n<!-- Sitemap 1.0 -->\n</HEAD>\n<BODY>\n<OBJECT type=\"text/site properties\">\n              <param name=\"FrameName\" value=\"current\">\n</OBJECT>\n\n<UL>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"adding custom colors\">\n              <param name=\"Name\" value=\"To copy color from one area or object to another\">\n              <param name=\"Local\" value=\"paint_not_in_color_box.html\">\n              <param name=\"Name\" value=\"To create custom colors\">\n              <param name=\"Local\" value=\"paint_custom_colors.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"airbrush tool\">\n              <param name=\"Name\" value=\"To create an airbrush effect\">\n              <param name=\"Local\" value=\"paint_airbrush.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"angles\">\n              <param name=\"Name\" value=\"To draw a polygon\">\n              <param name=\"Local\" value=\"paint_polygons.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"arcs\">\n              <param name=\"Name\" value=\"To draw a curve\">\n              <param name=\"Local\" value=\"paint_curves.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"attributes\">\n              <param name=\"Name\" value=\"To change the size of your picture\">\n              <param name=\"Local\" value=\"paint_change_size.html\">\n              <param name=\"Name\" value=\"To use black and white instead of color\">\n              <param name=\"Local\" value=\"paint_blackwhite.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"background (desktop)\">\n              <param name=\"Name\" value=\"To use a picture as the desktop background\">\n              <param name=\"Local\" value=\"paint_wallpaper.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"background color\">\n              <param name=\"Name\" value=\"To set the default foreground and background colors\">\n              <param name=\"Local\" value=\"paint_set_default_colors.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"bitmap view\">\n              <param name=\"Name\" value=\"To enlarge the size of the viewing area\">\n              <param name=\"Local\" value=\"paint_enlarge_area.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"bitmaps\">\n              <param name=\"Name\" value=\"To insert a bitmap into the current picture\">\n              <param name=\"Local\" value=\"paint_insert_file.html\">\n              <param name=\"Name\" value=\"To use a picture as the desktop background\">\n              <param name=\"Local\" value=\"paint_wallpaper.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"black and white\">\n              <param name=\"Name\" value=\"To use black and white instead of color\">\n              <param name=\"Local\" value=\"paint_blackwhite.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"blank picture\">\n              <param name=\"Name\" value=\"To clear an entire image\">\n              <param name=\"Local\" value=\"paint_clear_image.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"borders\">\n              <param name=\"Name\" value=\"To change the color of an existing line\">\n              <param name=\"Local\" value=\"paint_change_color.html\">\n              <param name=\"Name\" value=\"To draw a polygon\">\n              <param name=\"Local\" value=\"paint_polygons.html\">\n              <param name=\"Name\" value=\"To draw a rectangle or square\">\n              <param name=\"Local\" value=\"paint_rectangles.html\">\n              <param name=\"Name\" value=\"To draw an ellipse or circle\">\n              <param name=\"Local\" value=\"paint_ovals.html\">\n              <param name=\"Name\" value=\"To fill an area or object with color\">\n              <param name=\"Local\" value=\"paint_fill.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"boxes\">\n              <param name=\"Name\" value=\"To draw a rectangle or square\">\n              <param name=\"Local\" value=\"paint_rectangles.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"brush\">\n              <param name=\"Name\" value=\"To paint with a brush\">\n              <param name=\"Local\" value=\"paint_brush.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"buttons, see tools\">\n              <param name=\"See Also\" value=\"tools\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"can of paint\">\n              <param name=\"Name\" value=\"To change the color of an existing line\">\n              <param name=\"Local\" value=\"paint_change_color.html\">\n              <param name=\"Name\" value=\"To fill an area or object with color\">\n              <param name=\"Local\" value=\"paint_fill.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"canceling actions\">\n              <param name=\"Name\" value=\"To undo changes\">\n              <param name=\"Local\" value=\"paint_undo.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"centered wallpaper\">\n              <param name=\"Name\" value=\"To use a picture as the desktop background\">\n              <param name=\"Local\" value=\"paint_wallpaper.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"centimeters\">\n              <param name=\"Name\" value=\"To change the size of your picture\">\n              <param name=\"Local\" value=\"paint_change_size.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"changes, undoing\">\n              <param name=\"Name\" value=\"To undo changes\">\n              <param name=\"Local\" value=\"paint_undo.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"changing colors\">\n              <param name=\"Name\" value=\"To change the color of an existing line\">\n              <param name=\"Local\" value=\"paint_change_color.html\">\n              <param name=\"Name\" value=\"To copy color from one area or object to another\">\n              <param name=\"Local\" value=\"paint_not_in_color_box.html\">\n              <param name=\"Name\" value=\"To fill an area or object with color\">\n              <param name=\"Local\" value=\"paint_fill.html\">\n              <param name=\"Name\" value=\"To invert all the colors in a picture\">\n              <param name=\"Local\" value=\"paint_invert.html\">\n              <param name=\"Name\" value=\"To set the default foreground and background colors\">\n              <param name=\"Local\" value=\"paint_set_default_colors.html\">\n              <param name=\"Name\" value=\"To use black and white instead of color\">\n              <param name=\"Local\" value=\"paint_blackwhite.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"circles\">\n              <param name=\"Name\" value=\"To draw an ellipse or circle\">\n              <param name=\"Local\" value=\"paint_ovals.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"clearing\">\n              <param name=\"Name\" value=\"To clear an entire image\">\n              <param name=\"Local\" value=\"paint_clear_image.html\">\n              <param name=\"Name\" value=\"To erase a large area\">\n              <param name=\"Local\" value=\"paint_erase_large.html\">\n              <param name=\"Name\" value=\"To erase a small area\">\n              <param name=\"Local\" value=\"paint_erase_small.html\">\n              <param name=\"Name\" value=\"To undo changes\">\n              <param name=\"Local\" value=\"paint_undo.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"color box\">\n              <param name=\"Name\" value=\"To create custom colors\">\n              <param name=\"Local\" value=\"paint_custom_colors.html\">\n              <param name=\"Name\" value=\"To show or hide the color box\">\n              <param name=\"Local\" value=\"paint_color_box.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"colors\">\n<param name=\"Name\" value=\"To change the color of an existing line\">\n<param name=\"Local\" value=\"paint_change_color.html\">\n<param name=\"Name\" value=\"To copy color from one area or object to another\">\n<param name=\"Local\" value=\"paint_not_in_color_box.html\">\n<param name=\"Name\" value=\"To fill an area or object with color\">\n<param name=\"Local\" value=\"paint_fill.html\">\n<param name=\"Name\" value=\"To invert all the colors in a picture\">\n<param name=\"Local\" value=\"paint_invert.html\">\n<param name=\"Name\" value=\"To set the default foreground and background colors\">\n<param name=\"Local\" value=\"paint_set_default_colors.html\">\n<param name=\"Name\" value=\"To use black and white instead of color\">\n<param name=\"Local\" value=\"paint_blackwhite.html\">\n<param name=\"Name\" value=\"To create custom colors\">\n<param name=\"Local\" value=\"paint_custom_colors.html\">\n<param name=\"Name\" value=\"To erase a large area\">\n<param name=\"Local\" value=\"paint_erase_large.html\">\n<param name=\"Name\" value=\"To erase a small area\">\n<param name=\"Local\" value=\"paint_erase_small.html\">\n<param name=\"Name\" value=\"To draw a polygon\">\n<param name=\"Local\" value=\"paint_polygons.html\">\n<param name=\"Name\" value=\"To draw a rectangle or square\">\n<param name=\"Local\" value=\"paint_rectangles.html\">\n<param name=\"Name\" value=\"To draw an ellipse or circle\">\n<param name=\"Local\" value=\"paint_ovals.html\">\n<param name=\"Name\" value=\"To draw a curve\">\n<param name=\"Local\" value=\"paint_curves.html\">\n<param name=\"Name\" value=\"To draw a free-form line\">\n<param name=\"Local\" value=\"paint_freeform_lines.html\">\n<param name=\"Name\" value=\"To draw a straight line\">\n<param name=\"Local\" value=\"paint_lines.html\">\n<param name=\"Name\" value=\"To create an airbrush effect\">\n<param name=\"Local\" value=\"paint_airbrush.html\">\n<param name=\"Name\" value=\"To paint with a brush\">\n<param name=\"Local\" value=\"paint_brush.html\">\n<param name=\"Name\" value=\"To type and format text\">\n<param name=\"Local\" value=\"paint_text.html\">\n   <UL>\n                 <param name=\"Name\" value=\"To use black and white instead of color\">\n                 <param name=\"Local\" value=\"paint_blackwhite.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"black and white\">\n                 <param name=\"Name\" value=\"To use black and white instead of color\">\n                 <param name=\"Local\" value=\"paint_blackwhite.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"changing\">\n                 <param name=\"Name\" value=\"To change the color of an existing line\">\n                 <param name=\"Local\" value=\"paint_change_color.html\">\n                 <param name=\"Name\" value=\"To copy color from one area or object to another\">\n                 <param name=\"Local\" value=\"paint_not_in_color_box.html\">\n                 <param name=\"Name\" value=\"To fill an area or object with color\">\n                 <param name=\"Local\" value=\"paint_fill.html\">\n                 <param name=\"Name\" value=\"To invert all the colors in a picture\">\n                 <param name=\"Local\" value=\"paint_invert.html\">\n                 <param name=\"Name\" value=\"To set the default foreground and background colors\">\n                 <param name=\"Local\" value=\"paint_set_default_colors.html\">\n                 <param name=\"Name\" value=\"To use black and white instead of color\">\n                 <param name=\"Local\" value=\"paint_blackwhite.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"complementary\">\n                 <param name=\"Name\" value=\"To invert all the colors in a picture\">\n                 <param name=\"Local\" value=\"paint_invert.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"copying\">\n                 <param name=\"Name\" value=\"To copy color from one area or object to another\">\n                 <param name=\"Local\" value=\"paint_not_in_color_box.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"custom\">\n                 <param name=\"Name\" value=\"To create custom colors\">\n                 <param name=\"Local\" value=\"paint_custom_colors.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"erasing\">\n                 <param name=\"Name\" value=\"To erase a large area\">\n                 <param name=\"Local\" value=\"paint_erase_large.html\">\n                 <param name=\"Name\" value=\"To erase a small area\">\n                 <param name=\"Local\" value=\"paint_erase_small.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"filling\">\n                 <param name=\"Name\" value=\"To change the color of an existing line\">\n                 <param name=\"Local\" value=\"paint_change_color.html\">\n                 <param name=\"Name\" value=\"To copy color from one area or object to another\">\n                 <param name=\"Local\" value=\"paint_not_in_color_box.html\">\n                 <param name=\"Name\" value=\"To draw a polygon\">\n                 <param name=\"Local\" value=\"paint_polygons.html\">\n                 <param name=\"Name\" value=\"To draw a rectangle or square\">\n                 <param name=\"Local\" value=\"paint_rectangles.html\">\n                 <param name=\"Name\" value=\"To draw an ellipse or circle\">\n                 <param name=\"Local\" value=\"paint_ovals.html\">\n                 <param name=\"Name\" value=\"To fill an area or object with color\">\n                 <param name=\"Local\" value=\"paint_fill.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"inverting\">\n                 <param name=\"Name\" value=\"To invert all the colors in a picture\">\n                 <param name=\"Local\" value=\"paint_invert.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"lines\">\n                 <param name=\"Name\" value=\"To change the color of an existing line\">\n                 <param name=\"Local\" value=\"paint_change_color.html\">\n                 <param name=\"Name\" value=\"To draw a curve\">\n                 <param name=\"Local\" value=\"paint_curves.html\">\n                 <param name=\"Name\" value=\"To draw a free-form line\">\n                 <param name=\"Local\" value=\"paint_freeform_lines.html\">\n                 <param name=\"Name\" value=\"To draw a straight line\">\n                 <param name=\"Local\" value=\"paint_lines.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"painting\">\n                 <param name=\"Name\" value=\"To create an airbrush effect\">\n                 <param name=\"Local\" value=\"paint_airbrush.html\">\n                 <param name=\"Name\" value=\"To fill an area or object with color\">\n                 <param name=\"Local\" value=\"paint_fill.html\">\n                 <param name=\"Name\" value=\"To paint with a brush\">\n                 <param name=\"Local\" value=\"paint_brush.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"shapes\">\n                 <param name=\"Name\" value=\"To draw a polygon\">\n                 <param name=\"Local\" value=\"paint_polygons.html\">\n                 <param name=\"Name\" value=\"To draw a rectangle or square\">\n                 <param name=\"Local\" value=\"paint_rectangles.html\">\n                 <param name=\"Name\" value=\"To draw an ellipse or circle\">\n                 <param name=\"Local\" value=\"paint_ovals.html\">\n                 <param name=\"Name\" value=\"To fill an area or object with color\">\n                 <param name=\"Local\" value=\"paint_fill.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"text\">\n                 <param name=\"Name\" value=\"To type and format text\">\n                 <param name=\"Local\" value=\"paint_text.html\">\n                 </OBJECT>\n   </UL>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"complementary colors\">\n              <param name=\"Name\" value=\"To invert all the colors in a picture\">\n              <param name=\"Local\" value=\"paint_invert.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"converting colors\">\n              <param name=\"Name\" value=\"To invert all the colors in a picture\">\n              <param name=\"Local\" value=\"paint_invert.html\">\n              <param name=\"Name\" value=\"To use black and white instead of color\">\n              <param name=\"Local\" value=\"paint_blackwhite.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"copying colors\">\n              <param name=\"Name\" value=\"To copy color from one area or object to another\">\n              <param name=\"Local\" value=\"paint_not_in_color_box.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"copying selections\">\n              <param name=\"Name\" value=\"To copy and paste part of a picture\">\n              <param name=\"Local\" value=\"paint_cutout_copy_move.html\">\n              <param name=\"Name\" value=\"To save part of a picture into another bitmap file\">\n              <param name=\"Local\" value=\"paint_cutout_save.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"creating custom colors\">\n              <param name=\"Name\" value=\"To create custom colors\">\n              <param name=\"Local\" value=\"paint_custom_colors.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"cropping pictures\">\n              <param name=\"Name\" value=\"To change the size of your picture\">\n              <param name=\"Local\" value=\"paint_change_size.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"curves\">\n              <param name=\"Name\" value=\"To draw a curve\">\n              <param name=\"Local\" value=\"paint_curves.html\">\n              <param name=\"Name\" value=\"To draw a free-form line\">\n              <param name=\"Local\" value=\"paint_freeform_lines.html\">\n              <param name=\"Name\" value=\"To paint with a brush\">\n              <param name=\"Local\" value=\"paint_brush.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"custom colors\">\n              <param name=\"Name\" value=\"To copy color from one area or object to another\">\n              <param name=\"Local\" value=\"paint_not_in_color_box.html\">\n              <param name=\"Name\" value=\"To create custom colors\">\n              <param name=\"Local\" value=\"paint_custom_colors.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"cutouts, see selections\">\n              <param name=\"See Also\" value=\"selections\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"defaults\">\n              <param name=\"Name\" value=\"To set the default foreground and background colors\">\n              <param name=\"Local\" value=\"paint_set_default_colors.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"defining custom colors\">\n              <param name=\"Name\" value=\"To create custom colors\">\n              <param name=\"Local\" value=\"paint_custom_colors.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"desktop background\">\n              <param name=\"Name\" value=\"To use a picture as the desktop background\">\n              <param name=\"Local\" value=\"paint_wallpaper.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"displaying\">\n<param name=\"Name\" value=\"To display grid lines\">\n<param name=\"Local\" value=\"paint_grid.html\">\n<param name=\"Name\" value=\"To zoom in or out of a picture\">\n<param name=\"Local\" value=\"paint_zoom.html\">\n<param name=\"Name\" value=\"To type and format text\">\n<param name=\"Local\" value=\"paint_text.html\">\n<param name=\"Name\" value=\"To show or hide the toolbox\">\n<param name=\"Local\" value=\"paint_toolbox.html\">\n   <UL>\n                 <param name=\"Name\" value=\"To show or hide the color box\">\n                 <param name=\"Local\" value=\"paint_color_box.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"color box\">\n                 <param name=\"Name\" value=\"To show or hide the color box\">\n                 <param name=\"Local\" value=\"paint_color_box.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"grid lines\">\n                 <param name=\"Name\" value=\"To display grid lines\">\n                 <param name=\"Local\" value=\"paint_grid.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"pixels\">\n                 <param name=\"Name\" value=\"To display grid lines\">\n                 <param name=\"Local\" value=\"paint_grid.html\">\n                 <param name=\"Name\" value=\"To zoom in or out of a picture\">\n                 <param name=\"Local\" value=\"paint_zoom.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"text toolbar\">\n                 <param name=\"Name\" value=\"To type and format text\">\n                 <param name=\"Local\" value=\"paint_text.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"toolbox\">\n                 <param name=\"Name\" value=\"To show or hide the toolbox\">\n                 <param name=\"Local\" value=\"paint_toolbox.html\">\n                 </OBJECT>\n   </UL>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"dragging\">\n<param name=\"Name\" value=\"To copy and paste part of a picture\">\n<param name=\"Local\" value=\"paint_cutout_copy_move.html\">\n<param name=\"Name\" value=\"To insert a bitmap into the current picture\">\n<param name=\"Local\" value=\"paint_insert_file.html\">\n<param name=\"Name\" value=\"To show or hide the toolbox\">\n<param name=\"Local\" value=\"paint_toolbox.html\">\n   <UL>\n                 <param name=\"Name\" value=\"To show or hide the color box\">\n                 <param name=\"Local\" value=\"paint_color_box.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"color box\">\n                 <param name=\"Name\" value=\"To show or hide the color box\">\n                 <param name=\"Local\" value=\"paint_color_box.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"selections\">\n                 <param name=\"Name\" value=\"To copy and paste part of a picture\">\n                 <param name=\"Local\" value=\"paint_cutout_copy_move.html\">\n                 <param name=\"Name\" value=\"To insert a bitmap into the current picture\">\n                 <param name=\"Local\" value=\"paint_insert_file.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"toolbox\">\n                 <param name=\"Name\" value=\"To show or hide the toolbox\">\n                 <param name=\"Local\" value=\"paint_toolbox.html\">\n                 </OBJECT>\n   </UL>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"Draw Opaque command\">\n              <param name=\"Name\" value=\"To specify transparent or opaque drawing\">\n              <param name=\"Local\" value=\"paint_trans_opaque.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"drawing\">\n<param name=\"Name\" value=\"To draw a curve\">\n<param name=\"Local\" value=\"paint_curves.html\">\n<param name=\"Name\" value=\"To draw a free-form line\">\n<param name=\"Local\" value=\"paint_freeform_lines.html\">\n<param name=\"Name\" value=\"To paint with a brush\">\n<param name=\"Local\" value=\"paint_brush.html\">\n<param name=\"Name\" value=\"To change the color of an existing line\">\n<param name=\"Local\" value=\"paint_change_color.html\">\n<param name=\"Name\" value=\"To draw a straight line\">\n<param name=\"Local\" value=\"paint_lines.html\">\n<param name=\"Name\" value=\"To draw a polygon\">\n<param name=\"Local\" value=\"paint_polygons.html\">\n<param name=\"Name\" value=\"To draw a rectangle or square\">\n<param name=\"Local\" value=\"paint_rectangles.html\">\n<param name=\"Name\" value=\"To draw an ellipse or circle\">\n<param name=\"Local\" value=\"paint_ovals.html\">\n<param name=\"Name\" value=\"To fill an area or object with color\">\n<param name=\"Local\" value=\"paint_fill.html\">\n<param name=\"Name\" value=\"To specify transparent or opaque drawing\">\n<param name=\"Local\" value=\"paint_trans_opaque.html\">\n   <UL>\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"(see also tools)\">\n                 <param name=\"See Also\" value=\"tools\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"curves\">\n                 <param name=\"Name\" value=\"To draw a curve\">\n                 <param name=\"Local\" value=\"paint_curves.html\">\n                 <param name=\"Name\" value=\"To draw a free-form line\">\n                 <param name=\"Local\" value=\"paint_freeform_lines.html\">\n                 <param name=\"Name\" value=\"To paint with a brush\">\n                 <param name=\"Local\" value=\"paint_brush.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"lines\">\n                 <param name=\"Name\" value=\"To change the color of an existing line\">\n                 <param name=\"Local\" value=\"paint_change_color.html\">\n                 <param name=\"Name\" value=\"To draw a free-form line\">\n                 <param name=\"Local\" value=\"paint_freeform_lines.html\">\n                 <param name=\"Name\" value=\"To draw a straight line\">\n                 <param name=\"Local\" value=\"paint_lines.html\">\n                 <param name=\"Name\" value=\"To paint with a brush\">\n                 <param name=\"Local\" value=\"paint_brush.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"shapes\">\n                 <param name=\"Name\" value=\"To draw a polygon\">\n                 <param name=\"Local\" value=\"paint_polygons.html\">\n                 <param name=\"Name\" value=\"To draw a rectangle or square\">\n                 <param name=\"Local\" value=\"paint_rectangles.html\">\n                 <param name=\"Name\" value=\"To draw an ellipse or circle\">\n                 <param name=\"Local\" value=\"paint_ovals.html\">\n                 <param name=\"Name\" value=\"To fill an area or object with color\">\n                 <param name=\"Local\" value=\"paint_fill.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"transparent vs. opaque\">\n                 <param name=\"Name\" value=\"To specify transparent or opaque drawing\">\n                 <param name=\"Local\" value=\"paint_trans_opaque.html\">\n                 </OBJECT>\n   </UL>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"dropper tool\">\n              <param name=\"Name\" value=\"To copy color from one area or object to another\">\n              <param name=\"Local\" value=\"paint_not_in_color_box.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"ellipses\">\n              <param name=\"Name\" value=\"To draw an ellipse or circle\">\n              <param name=\"Local\" value=\"paint_ovals.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"enlarging pictures\">\n              <param name=\"Name\" value=\"To display grid lines\">\n              <param name=\"Local\" value=\"paint_grid.html\">\n              <param name=\"Name\" value=\"To enlarge the size of the viewing area\">\n              <param name=\"Local\" value=\"paint_enlarge_area.html\">\n              <param name=\"Name\" value=\"To stretch or skew an item\">\n              <param name=\"Local\" value=\"paint_skew_picture.html\">\n              <param name=\"Name\" value=\"To zoom in or out of a picture\">\n              <param name=\"Local\" value=\"paint_zoom.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"enlarging text\">\n              <param name=\"Name\" value=\"To type and format text\">\n              <param name=\"Local\" value=\"paint_text.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"erasing\">\n              <param name=\"Name\" value=\"To clear an entire image\">\n              <param name=\"Local\" value=\"paint_clear_image.html\">\n              <param name=\"Name\" value=\"To erase a large area\">\n              <param name=\"Local\" value=\"paint_erase_large.html\">\n              <param name=\"Name\" value=\"To erase a small area\">\n              <param name=\"Local\" value=\"paint_erase_small.html\">\n              <param name=\"Name\" value=\"To undo changes\">\n              <param name=\"Local\" value=\"paint_undo.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"errors, undoing\">\n              <param name=\"Name\" value=\"To undo changes\">\n              <param name=\"Local\" value=\"paint_undo.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"eye dropper tool\">\n              <param name=\"Name\" value=\"To copy color from one area or object to another\">\n              <param name=\"Local\" value=\"paint_not_in_color_box.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"filling\">\n              <param name=\"Name\" value=\"To change the color of an existing line\">\n              <param name=\"Local\" value=\"paint_change_color.html\">\n              <param name=\"Name\" value=\"To copy color from one area or object to another\">\n              <param name=\"Local\" value=\"paint_not_in_color_box.html\">\n              <param name=\"Name\" value=\"To draw a polygon\">\n              <param name=\"Local\" value=\"paint_polygons.html\">\n              <param name=\"Name\" value=\"To draw a rectangle or square\">\n              <param name=\"Local\" value=\"paint_rectangles.html\">\n              <param name=\"Name\" value=\"To draw an ellipse or circle\">\n              <param name=\"Local\" value=\"paint_ovals.html\">\n              <param name=\"Name\" value=\"To fill an area or object with color\">\n              <param name=\"Local\" value=\"paint_fill.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"flipping pictures\">\n              <param name=\"Name\" value=\"To flip or rotate a picture or object\">\n              <param name=\"Local\" value=\"paint_flip_picture.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"fonts\">\n              <param name=\"Name\" value=\"To type and format text\">\n              <param name=\"Local\" value=\"paint_text.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"foreground color\">\n              <param name=\"Name\" value=\"To set the default foreground and background colors\">\n              <param name=\"Local\" value=\"paint_set_default_colors.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"formatting text\">\n              <param name=\"Name\" value=\"To type and format text\">\n              <param name=\"Local\" value=\"paint_text.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"free-form lines\">\n              <param name=\"Name\" value=\"To draw a free-form line\">\n              <param name=\"Local\" value=\"paint_freeform_lines.html\">\n              <param name=\"Name\" value=\"To paint with a brush\">\n              <param name=\"Local\" value=\"paint_brush.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"free-form selection\">\n              <param name=\"Name\" value=\"To select part of a picture\">\n              <param name=\"Local\" value=\"paint_cutout_select.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"getting colors\">\n              <param name=\"Name\" value=\"To copy color from one area or object to another\">\n              <param name=\"Local\" value=\"paint_not_in_color_box.html\">\n              <param name=\"Name\" value=\"To create custom colors\">\n              <param name=\"Local\" value=\"paint_custom_colors.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"greyscale\">\n              <param name=\"Name\" value=\"To use black and white instead of color\">\n              <param name=\"Local\" value=\"paint_blackwhite.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"grid lines\">\n              <param name=\"Name\" value=\"To display grid lines\">\n              <param name=\"Local\" value=\"paint_grid.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"height, picture\">\n              <param name=\"Name\" value=\"To change the size of your picture\">\n              <param name=\"Local\" value=\"paint_change_size.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"hiding\">\n<param name=\"Name\" value=\"To enlarge the size of the viewing area\">\n<param name=\"Local\" value=\"paint_enlarge_area.html\">\n<param name=\"Name\" value=\"To show or hide the toolbox\">\n<param name=\"Local\" value=\"paint_toolbox.html\">\n   <UL>\n                 <param name=\"Name\" value=\"To show or hide the color box\">\n                 <param name=\"Local\" value=\"paint_color_box.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"color box\">\n                 <param name=\"Name\" value=\"To show or hide the color box\">\n                 <param name=\"Local\" value=\"paint_color_box.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"status bar\">\n                 <param name=\"Name\" value=\"To enlarge the size of the viewing area\">\n                 <param name=\"Local\" value=\"paint_enlarge_area.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"toolbox\">\n                 <param name=\"Name\" value=\"To show or hide the toolbox\">\n                 <param name=\"Local\" value=\"paint_toolbox.html\">\n                 </OBJECT>\n   </UL>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"hue\">\n              <param name=\"Name\" value=\"To create custom colors\">\n              <param name=\"Local\" value=\"paint_custom_colors.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"image attributes\">\n              <param name=\"Name\" value=\"To change the size of your picture\">\n              <param name=\"Local\" value=\"paint_change_size.html\">\n              <param name=\"Name\" value=\"To use black and white instead of color\">\n              <param name=\"Local\" value=\"paint_blackwhite.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"images, see pictures\">\n              <param name=\"See Also\" value=\"pictures\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"inches\">\n              <param name=\"Name\" value=\"To change the size of your picture\">\n              <param name=\"Local\" value=\"paint_change_size.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"inkwell\">\n              <param name=\"Name\" value=\"To change the color of an existing line\">\n              <param name=\"Local\" value=\"paint_change_color.html\">\n              <param name=\"Name\" value=\"To fill an area or object with color\">\n              <param name=\"Local\" value=\"paint_fill.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"inserting\">\n              <param name=\"Name\" value=\"To copy and paste part of a picture\">\n              <param name=\"Local\" value=\"paint_cutout_copy_move.html\">\n              <param name=\"Name\" value=\"To insert a bitmap into the current picture\">\n              <param name=\"Local\" value=\"paint_insert_file.html\">\n              <param name=\"Name\" value=\"To type and format text\">\n              <param name=\"Local\" value=\"paint_text.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"inverting colors\">\n              <param name=\"Name\" value=\"To invert all the colors in a picture\">\n              <param name=\"Local\" value=\"paint_invert.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"inverting pictures\">\n              <param name=\"Name\" value=\"To flip or rotate a picture or object\">\n              <param name=\"Local\" value=\"paint_flip_picture.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"landscape orientation\">\n              <param name=\"Name\" value=\"To print a picture\">\n              <param name=\"Local\" value=\"paint_print.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"layout\">\n              <param name=\"Name\" value=\"To print a picture\">\n              <param name=\"Local\" value=\"paint_print.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"lines\">\n              <param name=\"Name\" value=\"To change the color of an existing line\">\n              <param name=\"Local\" value=\"paint_change_color.html\">\n              <param name=\"Name\" value=\"To draw a curve\">\n              <param name=\"Local\" value=\"paint_curves.html\">\n              <param name=\"Name\" value=\"To draw a free-form line\">\n              <param name=\"Local\" value=\"paint_freeform_lines.html\">\n              <param name=\"Name\" value=\"To draw a straight line\">\n              <param name=\"Local\" value=\"paint_lines.html\">\n              <param name=\"Name\" value=\"To paint with a brush\">\n              <param name=\"Local\" value=\"paint_brush.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"luminescence\">\n              <param name=\"Name\" value=\"To create custom colors\">\n              <param name=\"Local\" value=\"paint_custom_colors.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"magnifying\">\n              <param name=\"Name\" value=\"To display grid lines\">\n              <param name=\"Local\" value=\"paint_grid.html\">\n              <param name=\"Name\" value=\"To zoom in or out of a picture\">\n              <param name=\"Local\" value=\"paint_zoom.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"mapping colors\">\n              <param name=\"Name\" value=\"To invert all the colors in a picture\">\n              <param name=\"Local\" value=\"paint_invert.html\">\n              <param name=\"Name\" value=\"To use black and white instead of color\">\n              <param name=\"Local\" value=\"paint_blackwhite.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"margins\">\n              <param name=\"Name\" value=\"To print a picture\">\n              <param name=\"Local\" value=\"paint_print.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"mistakes, undoing\">\n              <param name=\"Name\" value=\"To undo changes\">\n              <param name=\"Local\" value=\"paint_undo.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"monochrome\">\n              <param name=\"Name\" value=\"To use black and white instead of color\">\n              <param name=\"Local\" value=\"paint_blackwhite.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"moving\">\n<param name=\"Name\" value=\"To copy and paste part of a picture\">\n<param name=\"Local\" value=\"paint_cutout_copy_move.html\">\n<param name=\"Name\" value=\"To insert a bitmap into the current picture\">\n<param name=\"Local\" value=\"paint_insert_file.html\">\n<param name=\"Name\" value=\"To type and format text\">\n<param name=\"Local\" value=\"paint_text.html\">\n<param name=\"Name\" value=\"To show or hide the toolbox\">\n<param name=\"Local\" value=\"paint_toolbox.html\">\n   <UL>\n                 <param name=\"Name\" value=\"To show or hide the color box\">\n                 <param name=\"Local\" value=\"paint_color_box.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"color box\">\n                 <param name=\"Name\" value=\"To show or hide the color box\">\n                 <param name=\"Local\" value=\"paint_color_box.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"selections\">\n                 <param name=\"Name\" value=\"To copy and paste part of a picture\">\n                 <param name=\"Local\" value=\"paint_cutout_copy_move.html\">\n                 <param name=\"Name\" value=\"To insert a bitmap into the current picture\">\n                 <param name=\"Local\" value=\"paint_insert_file.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"text\">\n                 <param name=\"Name\" value=\"To type and format text\">\n                 <param name=\"Local\" value=\"paint_text.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"toolbox\">\n                 <param name=\"Name\" value=\"To show or hide the toolbox\">\n                 <param name=\"Local\" value=\"paint_toolbox.html\">\n                 </OBJECT>\n   </UL>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"multiple copies\">\n              <param name=\"Name\" value=\"To copy and paste part of a picture\">\n              <param name=\"Local\" value=\"paint_cutout_copy_move.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"opaque\">\n              <param name=\"Name\" value=\"To copy and paste part of a picture\">\n              <param name=\"Local\" value=\"paint_cutout_copy_move.html\">\n              <param name=\"Name\" value=\"To flip or rotate a picture or object\">\n              <param name=\"Local\" value=\"paint_flip_picture.html\">\n              <param name=\"Name\" value=\"To specify transparent or opaque drawing\">\n              <param name=\"Local\" value=\"paint_trans_opaque.html\">\n              <param name=\"Name\" value=\"To stretch or skew an item\">\n              <param name=\"Local\" value=\"paint_skew_picture.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"orientation\">\n              <param name=\"Name\" value=\"To print a picture\">\n              <param name=\"Local\" value=\"paint_print.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"outlines\">\n              <param name=\"Name\" value=\"To change the color of an existing line\">\n              <param name=\"Local\" value=\"paint_change_color.html\">\n              <param name=\"Name\" value=\"To draw a polygon\">\n              <param name=\"Local\" value=\"paint_polygons.html\">\n              <param name=\"Name\" value=\"To draw a rectangle or square\">\n              <param name=\"Local\" value=\"paint_rectangles.html\">\n              <param name=\"Name\" value=\"To draw an ellipse or circle\">\n              <param name=\"Local\" value=\"paint_ovals.html\">\n              <param name=\"Name\" value=\"To fill an area or object with color\">\n              <param name=\"Local\" value=\"paint_fill.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"ovals\">\n              <param name=\"Name\" value=\"To draw an ellipse or circle\">\n              <param name=\"Local\" value=\"paint_ovals.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"page setup\">\n              <param name=\"Name\" value=\"To print a picture\">\n              <param name=\"Local\" value=\"paint_print.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"paint brush\">\n              <param name=\"Name\" value=\"To paint with a brush\">\n              <param name=\"Local\" value=\"paint_brush.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"paint can\">\n              <param name=\"Name\" value=\"To change the color of an existing line\">\n              <param name=\"Local\" value=\"paint_change_color.html\">\n              <param name=\"Name\" value=\"To fill an area or object with color\">\n              <param name=\"Local\" value=\"paint_fill.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"painting\">\n              <param name=\"Name\" value=\"To change the color of an existing line\">\n              <param name=\"Local\" value=\"paint_change_color.html\">\n              <param name=\"Name\" value=\"To copy color from one area or object to another\">\n              <param name=\"Local\" value=\"paint_not_in_color_box.html\">\n              <param name=\"Name\" value=\"To create an airbrush effect\">\n              <param name=\"Local\" value=\"paint_airbrush.html\">\n              <param name=\"Name\" value=\"To fill an area or object with color\">\n              <param name=\"Local\" value=\"paint_fill.html\">\n              <param name=\"Name\" value=\"To paint with a brush\">\n              <param name=\"Local\" value=\"paint_brush.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"palette\">\n              <param name=\"Name\" value=\"To create custom colors\">\n              <param name=\"Local\" value=\"paint_custom_colors.html\">\n              <param name=\"Name\" value=\"To show or hide the color box\">\n              <param name=\"Local\" value=\"paint_color_box.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"paper size\">\n              <param name=\"Name\" value=\"To print a picture\">\n              <param name=\"Local\" value=\"paint_print.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"parts of pictures, see selections\">\n              <param name=\"See Also\" value=\"selections\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"pasting selections\">\n              <param name=\"Name\" value=\"To copy and paste part of a picture\">\n              <param name=\"Local\" value=\"paint_cutout_copy_move.html\">\n              <param name=\"Name\" value=\"To insert a bitmap into the current picture\">\n              <param name=\"Local\" value=\"paint_insert_file.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"pencil tool\">\n              <param name=\"Name\" value=\"To draw a free-form line\">\n              <param name=\"Local\" value=\"paint_freeform_lines.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"picking up colors\">\n              <param name=\"Name\" value=\"To copy color from one area or object to another\">\n              <param name=\"Local\" value=\"paint_not_in_color_box.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"pictures\">\n<param name=\"Name\" value=\"To clear an entire image\">\n<param name=\"Local\" value=\"paint_clear_image.html\">\n<param name=\"Name\" value=\"To print a picture\">\n<param name=\"Local\" value=\"paint_print.html\">\n<param name=\"Name\" value=\"To change the size of your picture\">\n<param name=\"Local\" value=\"paint_change_size.html\">\n<param name=\"Name\" value=\"To enlarge the size of the viewing area\">\n<param name=\"Local\" value=\"paint_enlarge_area.html\">\n<param name=\"Name\" value=\"To display grid lines\">\n<param name=\"Local\" value=\"paint_grid.html\">\n<param name=\"Name\" value=\"To zoom in or out of a picture\">\n<param name=\"Local\" value=\"paint_zoom.html\">\n   <UL>\n                 <param name=\"Name\" value=\"To use a picture as the desktop background\">\n                 <param name=\"Local\" value=\"paint_wallpaper.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"as desktop background\">\n                 <param name=\"Name\" value=\"To use a picture as the desktop background\">\n                 <param name=\"Local\" value=\"paint_wallpaper.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"clearing\">\n                 <param name=\"Name\" value=\"To clear an entire image\">\n                 <param name=\"Local\" value=\"paint_clear_image.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"printing\">\n                 <param name=\"Name\" value=\"To print a picture\">\n                 <param name=\"Local\" value=\"paint_print.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"sizing\">\n                 <param name=\"Name\" value=\"To change the size of your picture\">\n                 <param name=\"Local\" value=\"paint_change_size.html\">\n                 <param name=\"Name\" value=\"To enlarge the size of the viewing area\">\n                 <param name=\"Local\" value=\"paint_enlarge_area.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"zooming\">\n                 <param name=\"Name\" value=\"To display grid lines\">\n                 <param name=\"Local\" value=\"paint_grid.html\">\n                 <param name=\"Name\" value=\"To zoom in or out of a picture\">\n                 <param name=\"Local\" value=\"paint_zoom.html\">\n                 </OBJECT>\n   </UL>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"pixels\">\n              <param name=\"Name\" value=\"To change the size of your picture\">\n              <param name=\"Local\" value=\"paint_change_size.html\">\n              <param name=\"Name\" value=\"To display grid lines\">\n              <param name=\"Local\" value=\"paint_grid.html\">\n              <param name=\"Name\" value=\"To zoom in or out of a picture\">\n              <param name=\"Local\" value=\"paint_zoom.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"point size\">\n              <param name=\"Name\" value=\"To type and format text\">\n              <param name=\"Local\" value=\"paint_text.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"polygons\">\n              <param name=\"Name\" value=\"To draw a polygon\">\n              <param name=\"Local\" value=\"paint_polygons.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"portrait orientation\">\n              <param name=\"Name\" value=\"To print a picture\">\n              <param name=\"Local\" value=\"paint_print.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"previewing before printing\">\n              <param name=\"Name\" value=\"To print a picture\">\n              <param name=\"Local\" value=\"paint_print.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"printing\">\n              <param name=\"Name\" value=\"To print a picture\">\n              <param name=\"Local\" value=\"paint_print.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"rectangles\">\n              <param name=\"Name\" value=\"To draw a rectangle or square\">\n              <param name=\"Local\" value=\"paint_rectangles.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"removing color\">\n              <param name=\"Name\" value=\"To erase a large area\">\n              <param name=\"Local\" value=\"paint_erase_large.html\">\n              <param name=\"Name\" value=\"To erase a small area\">\n              <param name=\"Local\" value=\"paint_erase_small.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"removing grid lines\">\n              <param name=\"Name\" value=\"To display grid lines\">\n              <param name=\"Local\" value=\"paint_grid.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"resizing pictures\">\n              <param name=\"Name\" value=\"To change the size of your picture\">\n              <param name=\"Local\" value=\"paint_change_size.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"reversing colors\">\n              <param name=\"Name\" value=\"To invert all the colors in a picture\">\n              <param name=\"Local\" value=\"paint_invert.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"reverting\">\n              <param name=\"Name\" value=\"To undo changes\">\n              <param name=\"Local\" value=\"paint_undo.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"rotating pictures\">\n              <param name=\"Name\" value=\"To flip or rotate a picture or object\">\n              <param name=\"Local\" value=\"paint_flip_picture.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"round shapes\">\n              <param name=\"Name\" value=\"To draw an ellipse or circle\">\n              <param name=\"Local\" value=\"paint_ovals.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"saturation\">\n              <param name=\"Name\" value=\"To create custom colors\">\n              <param name=\"Local\" value=\"paint_custom_colors.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"saving colors\">\n              <param name=\"Name\" value=\"To create custom colors\">\n              <param name=\"Local\" value=\"paint_custom_colors.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"saving selections\">\n              <param name=\"Name\" value=\"To save part of a picture into another bitmap file\">\n              <param name=\"Local\" value=\"paint_cutout_save.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"selections\">\n<param name=\"Name\" value=\"To erase a small area\">\n<param name=\"Local\" value=\"paint_erase_small.html\">\n<param name=\"Name\" value=\"To copy and paste part of a picture\">\n<param name=\"Local\" value=\"paint_cutout_copy_move.html\">\n<param name=\"Name\" value=\"To insert a bitmap into the current picture\">\n<param name=\"Local\" value=\"paint_insert_file.html\">\n<param name=\"Name\" value=\"To save part of a picture into another bitmap file\">\n<param name=\"Local\" value=\"paint_cutout_save.html\">\n<param name=\"Name\" value=\"To flip or rotate a picture or object\">\n<param name=\"Local\" value=\"paint_flip_picture.html\">\n<param name=\"Name\" value=\"To stretch or skew an item\">\n<param name=\"Local\" value=\"paint_skew_picture.html\">\n<param name=\"Name\" value=\"To select part of a picture\">\n<param name=\"Local\" value=\"paint_cutout_select.html\">\n   <UL>\n                 <param name=\"Name\" value=\"To erase a large area\">\n                 <param name=\"Local\" value=\"paint_erase_large.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"clearing\">\n                 <param name=\"Name\" value=\"To erase a large area\">\n                 <param name=\"Local\" value=\"paint_erase_large.html\">\n                 <param name=\"Name\" value=\"To erase a small area\">\n                 <param name=\"Local\" value=\"paint_erase_small.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"copying\">\n                 <param name=\"Name\" value=\"To copy and paste part of a picture\">\n                 <param name=\"Local\" value=\"paint_cutout_copy_move.html\">\n                 <param name=\"Name\" value=\"To insert a bitmap into the current picture\">\n                 <param name=\"Local\" value=\"paint_insert_file.html\">\n                 <param name=\"Name\" value=\"To save part of a picture into another bitmap file\">\n                 <param name=\"Local\" value=\"paint_cutout_save.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"flipping\">\n                 <param name=\"Name\" value=\"To flip or rotate a picture or object\">\n                 <param name=\"Local\" value=\"paint_flip_picture.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"moving\">\n                 <param name=\"Name\" value=\"To copy and paste part of a picture\">\n                 <param name=\"Local\" value=\"paint_cutout_copy_move.html\">\n                 <param name=\"Name\" value=\"To insert a bitmap into the current picture\">\n                 <param name=\"Local\" value=\"paint_insert_file.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"pasting\">\n                 <param name=\"Name\" value=\"To copy and paste part of a picture\">\n                 <param name=\"Local\" value=\"paint_cutout_copy_move.html\">\n                 <param name=\"Name\" value=\"To insert a bitmap into the current picture\">\n                 <param name=\"Local\" value=\"paint_insert_file.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"rotating\">\n                 <param name=\"Name\" value=\"To flip or rotate a picture or object\">\n                 <param name=\"Local\" value=\"paint_flip_picture.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"saving\">\n                 <param name=\"Name\" value=\"To save part of a picture into another bitmap file\">\n                 <param name=\"Local\" value=\"paint_cutout_save.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"skewing\">\n                 <param name=\"Name\" value=\"To stretch or skew an item\">\n                 <param name=\"Local\" value=\"paint_skew_picture.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"stretching\">\n                 <param name=\"Name\" value=\"To stretch or skew an item\">\n                 <param name=\"Local\" value=\"paint_skew_picture.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"tools\">\n                 <param name=\"Name\" value=\"To select part of a picture\">\n                 <param name=\"Local\" value=\"paint_cutout_select.html\">\n                 </OBJECT>\n   </UL>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"setting wallpaper\">\n              <param name=\"Name\" value=\"To use a picture as the desktop background\">\n              <param name=\"Local\" value=\"paint_wallpaper.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"setup, page\">\n              <param name=\"Name\" value=\"To print a picture\">\n              <param name=\"Local\" value=\"paint_print.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"shapes\">\n              <param name=\"Name\" value=\"To draw a polygon\">\n              <param name=\"Local\" value=\"paint_polygons.html\">\n              <param name=\"Name\" value=\"To draw a rectangle or square\">\n              <param name=\"Local\" value=\"paint_rectangles.html\">\n              <param name=\"Name\" value=\"To draw an ellipse or circle\">\n              <param name=\"Local\" value=\"paint_ovals.html\">\n              <param name=\"Name\" value=\"To fill an area or object with color\">\n              <param name=\"Local\" value=\"paint_fill.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"showing\">\n<param name=\"Name\" value=\"To display grid lines\">\n<param name=\"Local\" value=\"paint_grid.html\">\n<param name=\"Name\" value=\"To zoom in or out of a picture\">\n<param name=\"Local\" value=\"paint_zoom.html\">\n<param name=\"Name\" value=\"To type and format text\">\n<param name=\"Local\" value=\"paint_text.html\">\n<param name=\"Name\" value=\"To show or hide the toolbox\">\n<param name=\"Local\" value=\"paint_toolbox.html\">\n   <UL>\n                 <param name=\"Name\" value=\"To show or hide the color box\">\n                 <param name=\"Local\" value=\"paint_color_box.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"color box\">\n                 <param name=\"Name\" value=\"To show or hide the color box\">\n                 <param name=\"Local\" value=\"paint_color_box.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"grid lines\">\n                 <param name=\"Name\" value=\"To display grid lines\">\n                 <param name=\"Local\" value=\"paint_grid.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"pixels\">\n                 <param name=\"Name\" value=\"To display grid lines\">\n                 <param name=\"Local\" value=\"paint_grid.html\">\n                 <param name=\"Name\" value=\"To zoom in or out of a picture\">\n                 <param name=\"Local\" value=\"paint_zoom.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"text toolbar\">\n                 <param name=\"Name\" value=\"To type and format text\">\n                 <param name=\"Local\" value=\"paint_text.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"toolbox\">\n                 <param name=\"Name\" value=\"To show or hide the toolbox\">\n                 <param name=\"Local\" value=\"paint_toolbox.html\">\n                 </OBJECT>\n   </UL>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"shrinking pictures\">\n              <param name=\"Name\" value=\"To stretch or skew an item\">\n              <param name=\"Local\" value=\"paint_skew_picture.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"sizing\">\n<param name=\"Name\" value=\"To change the size of your picture\">\n<param name=\"Local\" value=\"paint_change_size.html\">\n<param name=\"Name\" value=\"To enlarge the size of the viewing area\">\n<param name=\"Local\" value=\"paint_enlarge_area.html\">\n   <UL>\n                 <param name=\"Name\" value=\"To type and format text\">\n                 <param name=\"Local\" value=\"paint_text.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"fonts\">\n                 <param name=\"Name\" value=\"To type and format text\">\n                 <param name=\"Local\" value=\"paint_text.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"pictures\">\n                 <param name=\"Name\" value=\"To change the size of your picture\">\n                 <param name=\"Local\" value=\"paint_change_size.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"viewing area\">\n                 <param name=\"Name\" value=\"To enlarge the size of the viewing area\">\n                 <param name=\"Local\" value=\"paint_enlarge_area.html\">\n                 </OBJECT>\n   </UL>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"skewing pictures\">\n              <param name=\"Name\" value=\"To stretch or skew an item\">\n              <param name=\"Local\" value=\"paint_skew_picture.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"spray can\">\n              <param name=\"Name\" value=\"To create an airbrush effect\">\n              <param name=\"Local\" value=\"paint_airbrush.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"squares\">\n              <param name=\"Name\" value=\"To draw a rectangle or square\">\n              <param name=\"Local\" value=\"paint_rectangles.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"starting over\">\n              <param name=\"Name\" value=\"To clear an entire image\">\n              <param name=\"Local\" value=\"paint_clear_image.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"status bar, hiding\">\n              <param name=\"Name\" value=\"To enlarge the size of the viewing area\">\n              <param name=\"Local\" value=\"paint_enlarge_area.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"straight lines\">\n              <param name=\"Name\" value=\"To draw a polygon\">\n              <param name=\"Local\" value=\"paint_polygons.html\">\n              <param name=\"Name\" value=\"To draw a rectangle or square\">\n              <param name=\"Local\" value=\"paint_rectangles.html\">\n              <param name=\"Name\" value=\"To draw a straight line\">\n              <param name=\"Local\" value=\"paint_lines.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"stretching pictures\">\n              <param name=\"Name\" value=\"To stretch or skew an item\">\n              <param name=\"Local\" value=\"paint_skew_picture.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"switching to black and white\">\n              <param name=\"Name\" value=\"To use black and white instead of color\">\n              <param name=\"Local\" value=\"paint_blackwhite.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"switching to complementary colors\">\n              <param name=\"Name\" value=\"To invert all the colors in a picture\">\n              <param name=\"Local\" value=\"paint_invert.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"text\">\n              <param name=\"Name\" value=\"To type and format text\">\n              <param name=\"Local\" value=\"paint_text.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"text toolbar\">\n              <param name=\"Name\" value=\"To type and format text\">\n              <param name=\"Local\" value=\"paint_text.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"thickness, line\">\n              <param name=\"Name\" value=\"To draw a curve\">\n              <param name=\"Local\" value=\"paint_curves.html\">\n              <param name=\"Name\" value=\"To draw a free-form line\">\n              <param name=\"Local\" value=\"paint_freeform_lines.html\">\n              <param name=\"Name\" value=\"To draw a straight line\">\n              <param name=\"Local\" value=\"paint_lines.html\">\n              <param name=\"Name\" value=\"To paint with a brush\">\n              <param name=\"Local\" value=\"paint_brush.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"tiled wallpaper\">\n              <param name=\"Name\" value=\"To use a picture as the desktop background\">\n              <param name=\"Local\" value=\"paint_wallpaper.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"tilting pictures\">\n              <param name=\"Name\" value=\"To flip or rotate a picture or object\">\n              <param name=\"Local\" value=\"paint_flip_picture.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"toolbar, text\">\n              <param name=\"Name\" value=\"To type and format text\">\n              <param name=\"Local\" value=\"paint_text.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"toolbox\">\n              <param name=\"Name\" value=\"To show or hide the toolbox\">\n              <param name=\"Local\" value=\"paint_toolbox.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"tools\">\n<param name=\"Name\" value=\"To create an airbrush effect\">\n<param name=\"Local\" value=\"paint_airbrush.html\">\n<param name=\"Name\" value=\"To draw a curve\">\n<param name=\"Local\" value=\"paint_curves.html\">\n<param name=\"Name\" value=\"To erase a small area\">\n<param name=\"Local\" value=\"paint_erase_small.html\">\n<param name=\"Name\" value=\"To copy color from one area or object to another\">\n<param name=\"Local\" value=\"paint_not_in_color_box.html\">\n<param name=\"Name\" value=\"To change the color of an existing line\">\n<param name=\"Local\" value=\"paint_change_color.html\">\n<param name=\"Name\" value=\"To fill an area or object with color\">\n<param name=\"Local\" value=\"paint_fill.html\">\n<param name=\"Name\" value=\"To paint with a brush\">\n<param name=\"Local\" value=\"paint_brush.html\">\n<param name=\"Name\" value=\"To draw a free-form line\">\n<param name=\"Local\" value=\"paint_freeform_lines.html\">\n<param name=\"Name\" value=\"To copy and paste part of a picture\">\n<param name=\"Local\" value=\"paint_cutout_copy_move.html\">\n<param name=\"Name\" value=\"To erase a large area\">\n<param name=\"Local\" value=\"paint_erase_large.html\">\n<param name=\"Name\" value=\"To flip or rotate a picture or object\">\n<param name=\"Local\" value=\"paint_flip_picture.html\">\n<param name=\"Name\" value=\"To insert a bitmap into the current picture\">\n<param name=\"Local\" value=\"paint_insert_file.html\">\n<param name=\"Name\" value=\"To save part of a picture into another bitmap file\">\n<param name=\"Local\" value=\"paint_cutout_save.html\">\n<param name=\"Name\" value=\"To select part of a picture\">\n<param name=\"Local\" value=\"paint_cutout_select.html\">\n<param name=\"Name\" value=\"To stretch or skew an item\">\n<param name=\"Local\" value=\"paint_skew_picture.html\">\n<param name=\"Name\" value=\"To draw a polygon\">\n<param name=\"Local\" value=\"paint_polygons.html\">\n<param name=\"Name\" value=\"To draw a rectangle or square\">\n<param name=\"Local\" value=\"paint_rectangles.html\">\n<param name=\"Name\" value=\"To draw an ellipse or circle\">\n<param name=\"Local\" value=\"paint_ovals.html\">\n<param name=\"Name\" value=\"To draw a straight line\">\n<param name=\"Local\" value=\"paint_lines.html\">\n<param name=\"Name\" value=\"To type and format text\">\n<param name=\"Local\" value=\"paint_text.html\">\n<param name=\"Name\" value=\"To show or hide the toolbox\">\n<param name=\"Local\" value=\"paint_toolbox.html\">\n   <UL>\n                 <param name=\"Name\" value=\"To type and format text\">\n                 <param name=\"Local\" value=\"paint_text.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"A\">\n                 <param name=\"Name\" value=\"To type and format text\">\n                 <param name=\"Local\" value=\"paint_text.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"airbrush\">\n                 <param name=\"Name\" value=\"To create an airbrush effect\">\n                 <param name=\"Local\" value=\"paint_airbrush.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"curved line\">\n                 <param name=\"Name\" value=\"To draw a curve\">\n                 <param name=\"Local\" value=\"paint_curves.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"eraser\">\n                 <param name=\"Name\" value=\"To erase a small area\">\n                 <param name=\"Local\" value=\"paint_erase_small.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"eye dropper\">\n                 <param name=\"Name\" value=\"To copy color from one area or object to another\">\n                 <param name=\"Local\" value=\"paint_not_in_color_box.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"inkwell\">\n                 <param name=\"Name\" value=\"To change the color of an existing line\">\n                 <param name=\"Local\" value=\"paint_change_color.html\">\n                 <param name=\"Name\" value=\"To fill an area or object with color\">\n                 <param name=\"Local\" value=\"paint_fill.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"paint brush\">\n                 <param name=\"Name\" value=\"To paint with a brush\">\n                 <param name=\"Local\" value=\"paint_brush.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"paint can\">\n                 <param name=\"Name\" value=\"To change the color of an existing line\">\n                 <param name=\"Local\" value=\"paint_change_color.html\">\n                 <param name=\"Name\" value=\"To fill an area or object with color\">\n                 <param name=\"Local\" value=\"paint_fill.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"pencil\">\n                 <param name=\"Name\" value=\"To draw a free-form line\">\n                 <param name=\"Local\" value=\"paint_freeform_lines.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"selection\">\n                 <param name=\"Name\" value=\"To copy and paste part of a picture\">\n                 <param name=\"Local\" value=\"paint_cutout_copy_move.html\">\n                 <param name=\"Name\" value=\"To erase a large area\">\n                 <param name=\"Local\" value=\"paint_erase_large.html\">\n                 <param name=\"Name\" value=\"To flip or rotate a picture or object\">\n                 <param name=\"Local\" value=\"paint_flip_picture.html\">\n                 <param name=\"Name\" value=\"To insert a bitmap into the current picture\">\n                 <param name=\"Local\" value=\"paint_insert_file.html\">\n                 <param name=\"Name\" value=\"To save part of a picture into another bitmap file\">\n                 <param name=\"Local\" value=\"paint_cutout_save.html\">\n                 <param name=\"Name\" value=\"To select part of a picture\">\n                 <param name=\"Local\" value=\"paint_cutout_select.html\">\n                 <param name=\"Name\" value=\"To stretch or skew an item\">\n                 <param name=\"Local\" value=\"paint_skew_picture.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"shapes\">\n                 <param name=\"Name\" value=\"To draw a polygon\">\n                 <param name=\"Local\" value=\"paint_polygons.html\">\n                 <param name=\"Name\" value=\"To draw a rectangle or square\">\n                 <param name=\"Local\" value=\"paint_rectangles.html\">\n                 <param name=\"Name\" value=\"To draw an ellipse or circle\">\n                 <param name=\"Local\" value=\"paint_ovals.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"spray can\">\n                 <param name=\"Name\" value=\"To create an airbrush effect\">\n                 <param name=\"Local\" value=\"paint_airbrush.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"straight line\">\n                 <param name=\"Name\" value=\"To draw a straight line\">\n                 <param name=\"Local\" value=\"paint_lines.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"text\">\n                 <param name=\"Name\" value=\"To type and format text\">\n                 <param name=\"Local\" value=\"paint_text.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"toolbox\">\n                 <param name=\"Name\" value=\"To show or hide the toolbox\">\n                 <param name=\"Local\" value=\"paint_toolbox.html\">\n                 </OBJECT>\n   </UL>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"transparent\">\n              <param name=\"Name\" value=\"To copy and paste part of a picture\">\n              <param name=\"Local\" value=\"paint_cutout_copy_move.html\">\n              <param name=\"Name\" value=\"To flip or rotate a picture or object\">\n              <param name=\"Local\" value=\"paint_flip_picture.html\">\n              <param name=\"Name\" value=\"To specify transparent or opaque drawing\">\n              <param name=\"Local\" value=\"paint_trans_opaque.html\">\n              <param name=\"Name\" value=\"To stretch or skew an item\">\n              <param name=\"Local\" value=\"paint_skew_picture.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"triangles\">\n              <param name=\"Name\" value=\"To draw a polygon\">\n              <param name=\"Local\" value=\"paint_polygons.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"turning pictures\">\n              <param name=\"Name\" value=\"To flip or rotate a picture or object\">\n              <param name=\"Local\" value=\"paint_flip_picture.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"typestyles\">\n              <param name=\"Name\" value=\"To type and format text\">\n              <param name=\"Local\" value=\"paint_text.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"typing text\">\n              <param name=\"Name\" value=\"To type and format text\">\n              <param name=\"Local\" value=\"paint_text.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"undoing changes\">\n              <param name=\"Name\" value=\"To undo changes\">\n              <param name=\"Local\" value=\"paint_undo.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"units of measurement\">\n              <param name=\"Name\" value=\"To change the size of your picture\">\n              <param name=\"Local\" value=\"paint_change_size.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"view options\">\n              <param name=\"Name\" value=\"To display grid lines\">\n              <param name=\"Local\" value=\"paint_grid.html\">\n              <param name=\"Name\" value=\"To enlarge the size of the viewing area\">\n              <param name=\"Local\" value=\"paint_enlarge_area.html\">\n              <param name=\"Name\" value=\"To show or hide the color box\">\n              <param name=\"Local\" value=\"paint_color_box.html\">\n              <param name=\"Name\" value=\"To show or hide the toolbox\">\n              <param name=\"Local\" value=\"paint_toolbox.html\">\n              <param name=\"Name\" value=\"To type and format text\">\n              <param name=\"Local\" value=\"paint_text.html\">\n              <param name=\"Name\" value=\"To zoom in or out of a picture\">\n              <param name=\"Local\" value=\"paint_zoom.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"wallpaper\">\n              <param name=\"Name\" value=\"To use a picture as the desktop background\">\n              <param name=\"Local\" value=\"paint_wallpaper.html\">\n              </OBJECT>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"width\">\n<param name=\"Name\" value=\"To draw a free-form line\">\n<param name=\"Local\" value=\"paint_freeform_lines.html\">\n<param name=\"Name\" value=\"To draw a straight line\">\n<param name=\"Local\" value=\"paint_lines.html\">\n<param name=\"Name\" value=\"To paint with a brush\">\n<param name=\"Local\" value=\"paint_brush.html\">\n<param name=\"Name\" value=\"To change the size of your picture\">\n<param name=\"Local\" value=\"paint_change_size.html\">\n   <UL>\n                 <param name=\"Name\" value=\"To draw a curve\">\n                 <param name=\"Local\" value=\"paint_curves.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"line\">\n                 <param name=\"Name\" value=\"To draw a curve\">\n                 <param name=\"Local\" value=\"paint_curves.html\">\n                 <param name=\"Name\" value=\"To draw a free-form line\">\n                 <param name=\"Local\" value=\"paint_freeform_lines.html\">\n                 <param name=\"Name\" value=\"To draw a straight line\">\n                 <param name=\"Local\" value=\"paint_lines.html\">\n                 <param name=\"Name\" value=\"To paint with a brush\">\n                 <param name=\"Local\" value=\"paint_brush.html\">\n                 </OBJECT>\n   <LI><OBJECT type=\"Text/sitemap\">\n                 <param name=\"Name\" value=\"picture\">\n                 <param name=\"Name\" value=\"To change the size of your picture\">\n                 <param name=\"Local\" value=\"paint_change_size.html\">\n                 </OBJECT>\n   </UL>\n<LI><OBJECT type=\"Text/sitemap\">\n              <param name=\"Name\" value=\"zooming\">\n              <param name=\"Name\" value=\"To display grid lines\">\n              <param name=\"Local\" value=\"paint_grid.html\">\n              <param name=\"Name\" value=\"To enlarge the size of the viewing area\">\n              <param name=\"Local\" value=\"paint_enlarge_area.html\">\n              <param name=\"Name\" value=\"To zoom in or out of a picture\">\n              <param name=\"Local\" value=\"paint_zoom.html\">\n</OBJECT>\n</LI>\n</UL>\n</HEAD>\n</HTML>\n"
  },
  {
    "path": "help/nobgcolor.css",
    "content": "/* Originally: Cascading Style Sheet for IE4 build 1008+ */\n\n/* for scrollbars and selection color */\n@import \"../lib/os-gui/build/windows-98.css\";\n\nbody {\n\tfont-size: 70%;\n\tfont-family: Verdana, Arial, Helvetica, \"MS Sans Serif\";\n}\n\nhtml,\nbody {\n\tmargin: 0;\n\theight: 100%;\n}\n\n#background-animation {\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow: hidden;\n}\n#foreground-contents {\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tmargin-left: 35px;\n\tmargin-top: 10px;\n\toverflow: auto;\n}\n#os-logo-link {\n\ttext-decoration: none;\n}\n#os-logo-colorbar {\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\ttop: 79px;\n\tpointer-events: none;\n\tborder: 0;\n\theight: 1px;\n\t/* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#ff3100+0,ff3100+14,f7df1e+14,f7df1e+29,63ce30+29,63ce30+43,009cff+43,009cff+43 */\n\tbackground: #ff3100; /* Old browsers */\n\tbackground: -moz-linear-gradient(left, #ff3100 0%, #ff3100 14%, #f7df1e 14%, #f7df1e 29%, #63ce30 29%, #63ce30 43%, #009cff 43%, #009cff 43%); /* FF3.6-15 */\n\tbackground: -webkit-linear-gradient(left, #ff3100 0%,#ff3100 14%,#f7df1e 14%,#f7df1e 29%,#63ce30 29%,#63ce30 43%,#009cff 43%,#009cff 43%); /* Chrome10-25,Safari5.1-6 */\n\tbackground: linear-gradient(to right, #ff3100 0%,#ff3100 14%,#f7df1e 14%,#f7df1e 29%,#63ce30 29%,#63ce30 43%,#009cff 43%,#009cff 43%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */\n\tfilter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ff3100', endColorstr='#009cff',GradientType=1 ); /* IE6-9 */\n}\n\na:link {\n\tcolor: #0000CC;\n}\n\na:active {\n\tcolor: #996699;\n}\n\na:visited {\n\tcolor: #996699;\n}\n\nh1 {\n\tfont-size: 145%;\n\tmargin-bottom: .5em;\n}\n\nh2 {\n\tfont-size: 125%;\n\tmargin-top: 1.5em;\n\tmargin-bottom: .5em;\n}\n\nh3 {\n\tfont-size: 110%;\n\tmargin-top: 1.2em;\n\tmargin-bottom: .5em;\n}\n\nh4 {\n\tfont-size: 105%;\n}\n\nh5 {\n\tfont-size: 100%;\n}\n\np.proclabel {\n\tfont-weight: bold;\n\tfont-size: 100%;\n}\n\np {\n\tmargin-top: .6em;\n\tmargin-bottom: .6em;\n}\n\nli p {\n\tmargin-top: 0;\n\tmargin-bottom: .6em;\n}\n\nol {\n\tmargin-top: .5em;\n\tmargin-bottom: 0em;\n\tmargin-left: 4em;\n}\n\nul {\n\tmargin-top: .6em;\n\tmargin-bottom: 0em;\n}\n\nol ul {\n\tlist-style: disc;\n\tmargin-top: 2em;\n}\n\nli {\n\tpadding-bottom: .7em;\n\tmargin-left: -2em;\n}\n\ndl ul {\n\t/* list item inside a def/term */\n\tmargin-top: 2em;\n\tmargin-bottom: 0em;\n}\n\ndl {\n\tmargin-top: -1em;\n}\n\nol dl {\n\t/* term/def list inside a numbered list */\n\tmargin-top: -1.5em;\n\tmargin-left: 0em;\n}\n\nol dl dl {\n\t/* term/def list inside a term/def list */\n\tmargin-top: 0em;\n\tmargin-left: .2em;\n}\n\ndd {\n\tmargin-bottom: 0em;\n\t/* not currently working */\n\tmargin-left: 1.5em;\n}\n\ndt {\n\tpadding-top: 2em;\n\tfont-weight: bold;\n\tmargin-left: 1.5em;\n}\n\npre {\n\tmargin-top: 0em;\n\tmargin-bottom: 1.5em;\n\tfont-family: Courier;\n\tfont-size: 125%;\n}\n\ntable {\n\tfont-size: 100%;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n}\n\nth.center {\n\ttext-align: center;\n}\n\nth {\n\ttext-align: left;\n\tbackground: #dddddd;\n\tmargin: 3pt;\n\tvertical-align: bottom;\n}\n\ntr {\n\tvertical-align: top;\n}\n\ntd {\n\tmargin: 3pt;\n\tvertical-align: top;\n}\n/*\tMISC. TAGS\t*/\n\nhr.sms {\n\t/* SMS specific rule used under procedure title */\n\tcolor: red;\n\ttext-align: left;\n}\n\nhr.iis {\n\tcolor: red;\n}\n/*IIS specific - preceding copyright*/\n/* IE 4.0 TAGS */\n/*\na:visited {\n\tcolor: #0000FF;\n}\n*/\n\np.dis {\n\tfont-size: 6pt;\n}\n\nul.onestep {\n\tlist-style: square;\n}\n\nh5 {\n}\n\nh5.active {\n\tbackground: #000000;\n\tcolor: #FFCC99;\n}\n/* -- subheading -- */\n\nh5.subh {\n\tcolor: #660000;\n\tmargin-bottom: -1em;\n\tmargin-top: 1.5em;\n}\n/* -- procedure heading -- */\n\nh5.proch {\n\tmargin-bottom: 4pt;\n\tcolor: #003399;\n}\n\n/* -- topic heading -- */\nh5.topich {\n\tcolor: #FF0033;\n\tmargin-bottom: -1em;\n}\n\n/* -- note 'n' tip heading -- */\nh5.note {\n\tmargin-top: 2em;\n\tmargin-bottom: -1em;\n\tcolor: #99CC99;\n}\n\n/* -- related topics heading -- */\nh5.relh {\n\tmargin-top: 2.25em;\n\tmargin-bottom: -1em;\n\tcolor: #9933CC;\n}\n\n/* -------------- miscellany 'n' stuff -------------- */\n/* intended to applied with <div></div> tags to groups of links */\n\n.dectree {\n\tmargin-left: 1.33em;\n\tmargin-top: 1.5em;\n}\n\ndiv.dectree p {\n\tmargin-top: 1em;\n\tcolor: orange;\n}\n\ndiv.dectree p:first-letter {\n\tfont-size: 3em;\n\tcolor: orange;\n}\n\na:link .dectree p {\n\tcolor: yellow;\n}\n\n.reltopics {\n\tline-height: .5em;\n\tmargin-top: 2em;\n}\n\ndiv.reltopics p {\n\tmargin-top: 1em;\n}\n"
  },
  {
    "path": "help/online_support.htm",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>Technical Support Online</title>\n\t<link href=\"nobgcolor.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body style=\"margin-left: 35px; margin-top: 80px;\">\n\t<div id=\"background-animation\"></div>\n\t<hr id=\"os-logo-colorbar\">\n\t<div id=\"foreground-contents\">\n\t\t<a href=\"https://98.js.org/\" target=\"_blank\" id=\"os-logo-link\">\n\t\t\t<img src=\"../images/98.js.org.svg\" alt=\"98.js.org\" id=\"os-logo\" height=\"100\">\n\t\t</a>\n\t\t<br>\n\t\t<p><a id=\"windows_update\" name=\"windows_update\"></a><b><i>Additional help via the Internet</i></b></p>\n\t\tIf you have a technical question on a 98.js.org product and can't find your answer in the product Help file or manual, take advantage of one of these online resources:\n\t\t<p></p>\n\t\t<ul>\n\t\t\t<li>\n\t\t\t\tYour primary source for support is the computer manufacturer who provided your software.\n\t\t\t\tYour computer manufacturer may provide a web site to help you find answers to technical questions.\n\t\t\t\tCheck the documentation that came with your computer to determine the availability of an online support site.\n\t\t\t</li>\n\t\t\t<li>\n\t\t\t\tFor the latest technical information on 98.js.org products, you can also find answers at GitHub.\n\t\t\t\tFrom README articles in the repositories, to Troubleshooting <small>that there aren't any</small> Wizards,\n\t\t\t\tthe repositories on GitHub have the specific resources most likely to help you find the answer to your question.\n\t\t\t\tTo begin your search, go to <a href=\"https://github.com/1j01/98\" target=\"_blank\">Support Online</a>.\n\t\t\t</li>\n\t\t</ul>\n\t\t<p></p>\n\t</div>\n\t<script src=\"vaporwave.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "help/paint_airbrush.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To create an airbrush effect</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_airbrush\"><b>To create an airbrush effect</b></p>\n\t<ol>\n\t\t<li>In the toolbox, click <img alt=\"the spray paint can\" src=\"p_airb.gif\">.</li>\n\t\t<li>At the bottom of the toolbox, click a spray size.</li>\n\t\t<li>To spray, drag the pointer.</li>\n\t</ol>\n\t<p><b>Notes</b></p>\n\t<ul>\n\t\t<li>The default background and foreground colors appear at the left in the color box. You can draw with the <a data-topic-id=\"gl_pbrush_fore\">foreground color</a> by clicking, or you can draw with the <a data-topic-id=\"gl_pbrush_back\">background color</a> by right-clicking.</li>\n\t\t<li>You can undo any number of changes by clicking the <b>Edit</b> menu and then clicking <b>Undo</b> for each change.</li>\n\t</ul>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_blackwhite.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To use black and white instead of color</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_blackwhite\"><b>To use black and white instead of color</b></p>\n\t<ol>\n\t\t<li>On the <b>Image</b> menu, click <b>Attributes</b>.</li>\n\t\t<li>Click <b>Black and white</b>.</li>\n\t</ol>\n\t<!--\n\t\tThere's now a conversion to monochrome\n\t\t(altho the black and white mode allows color in the document.)\n\t\t@TODO: Update this help accordingly\n\t-->\n\t<!--\n\t<p><b>Note</b></p>\n\t<ul>\n\t\t<li>If you change back to color, only new work will be in color.</li>\n\t</ul>\n\t-->\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_brush.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To paint with a brush</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_brush\"><b>To paint with a brush</b></p>\n\t<ol>\n\t\t<li>In the toolbox, click <img alt=\"the brush\" src=\"p_brush.gif\">.</li>\n\t\t<li>At the bottom of the toolbox, click a brush shape.</li>\n\t\t<li>To paint, drag the pointer.</li>\n\t</ol>\n\t<p><b>Notes</b></p>\n\t<ul>\n\t\t<li>The default background and foreground colors appear at the left in the color box. You can paint with the <a data-topic-id=\"gl_pbrush_fore\">foreground color</a> by clicking, or you can paint with the <a data-topic-id=\"gl_pbrush_back\">background color</a> by right-clicking.</li>\n\t\t<li>You can undo any number of changes by clicking the <b>Edit</b> menu and then clicking <b>Undo</b> for each change.</li>\n\t</ul>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_change_color.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To change the color of an existing line</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_change_color\"><b>To change the color of an existing line</b></p>\n\t<ol>\n\t\t<li>In the toolbox, click <img alt=\"the inkwell\" src=\"p_paint.gif\">.</li>\n\t\t<li>In the color box, click a different color.</li>\n\t\t<li>Position the pointer so that it is touching the line you want to change, and then click.</li>\n\t</ol>\n\t<p><b>Notes</b></p>\n\t<ul>\n\t\t<li>If the line is part of a shape, any connecting vertical and horizontal lines will also change to the new color.</li>\n\t\t<li>To make sure you change only the line color and not the surrounding area, you can zoom the picture to a larger size.</li>\n\t\t<li>You can undo any number of changes by clicking the <b>Edit</b> menu and then clicking <b>Undo</b> for each change.</li>\n\t</ul>\n\t<p><object classid=\"clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11\" height=\"0\" id=\"alink_1\" type=\"application/x-oleobject\" width=\"0\">\n\t\t<param name=\"Command\" value=\"ALink,MENU\">\n\t\t<param name=\"TEXT\" value=\"Text:Related Topics\">\n\t\t<param name=\"fONT\" value=\"VERDANA,8,0x000800,underline\">\n\t\t<param name=\"Item1\" value=\"\">\n\t\t<param name=\"Item2\" value=\"a_paint_zoom\">\n\t</object></p>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_change_size.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To change the size of your picture</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_change_size\"><b>To change the size of your picture</b></p>\n\t<ol>\n\t\t<li>On the <b>Image</b> menu, click <b>Attributes</b>.</li>\n\t\t<li>Click the unit of measurement you want to use for the width and height.</li>\n\t\t<li>Type the measurements in <b>Width</b> and <b>Height</b>.</li>\n\t</ol>\n\t<p><b>Notes</b></p>\n\t<ul>\n\t\t<li>You can also resize your picture by dragging the three image resize handles, located at the bottom right corner and along the bottom and right sides of your picture.</li>\n\t\t<li>If your current picture is bigger than the new size, the picture is cut from the right side and bottom to fit within the smaller area. If your current picture is smaller than the new size, the extra area is filled with the selected background color.</li>\n\t\t<li>You can undo any number of changes by clicking the <b>Edit</b> menu and then clicking <b>Undo</b> for each change.</li>\n\t</ul>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_clear_image.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To clear an entire image</title>\n\t<meta content=\"a_paint_clear_image\">\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_clear_image\"><b>To clear an entire image</b></p>\n\t<ol>\n\t\t<li>If any part of the image is selected, click outside of the selected area.</li>\n\t\t<li>On the <b>Image</b> menu, click <b>Clear Image</b>.</li>\n\t</ol>\n\t<p><b>Note</b></p>\n\t<ul>\n\t\t<li>The current <a data-topic-id=\"gl_pbrush_back\">background color</a> will be used to fill the cleared area. You can choose a different background color by right-clicking a color in the color box.</li>\n\t</ul>\n\t<p><object classid=\"clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11\" height=\"0\" id=\"alink_1\" type=\"application/x-oleobject\" width=\"0\">\n\t\t<param name=\"Command\" value=\"ALink,MENU\">\n\t\t<param name=\"TEXT\" value=\"Text:Related Topics\">\n\t\t<param name=\"fONT\" value=\"VERDANA,8,0x000800,underline\">\n\t\t<param name=\"Item1\" value=\"\">\n\t\t<param name=\"Item2\" value=\"a_paint_erase_small;a_paint_erase_large;a_paint_undo\">\n\t</object></p>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_color_box.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To show or hide the color box</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_color_box\"><b>To show or hide the color box</b></p>\n\t<p><img src=\"onestep.gif\"> To show the color box, on the <b>View</b> menu, make sure a check mark appears next to <b>Color Box</b>. To hide the color box, click to clear the check mark.</p>\n\t<p><b>Note</b></p>\n\t<ul>\n\t\t<li>You can drag the color box to any location in the window.</li>\n\t</ul>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_curves.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To draw a curve</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_curves\"><b>To draw a curve</b></p>\n\t<ol>\n\t\t<li>In the toolbox, click <img alt=\"the 's' line\" src=\"p_curve.gif\">.</li>\n\t\t<li>At the bottom of the toolbox, click a line width.</li>\n\t\t<li>Draw a straight line by dragging the pointer.</li>\n\t\t<li>Click where you want one arc of the curve to be, and then drag the pointer to adjust the curve. Repeat this step for a second arc.</li>\n\t</ol>\n\t<p><b>Notes</b></p>\n\t<ul>\n\t\t<li>The default background and foreground colors appear at the left in the color box. You can paint with the <a data-topic-id=\"gl_pbrush_fore\">foreground color</a> by clicking, or you can paint with the <a data-topic-id=\"gl_pbrush_back\">background color</a> by right-clicking.</li>\n\t\t<li>Each curve must have at least one arc but no more than two.</li>\n\t\t<li>You can undo any number of changes by clicking the <b>Edit</b> menu and then clicking <b>Undo</b> for each change.</li>\n\t</ul>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_custom_colors.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To create custom colors</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_custom_colors\"><b>To create custom colors</b></p>\n\t<ol>\n\t\t<li>In the color box, click the color you want to change.</li>\n\t\t<li>On the <b>Colors</b> menu, click <b>Edit Colors</b>.</li>\n\t\t<li>Click <b>Define Custom Colors</b>.</li>\n\t\t<li>Click the color swatch to change the <b>Hue</b> and saturation (<b>Sat</b>), and then move the slider in the color gradient to change the luminescence (<b>Lum</b>).</li>\n\t\t<li>Click <b>Add to Custom Colors</b>, and then click <b>OK</b>.</li>\n\t</ol>\n\t<p><b>Notes</b></p>\n\t<ul>\n\t\t<li>You can also double click on a color in the color box to edit.</li>\n\t</ul>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_cutout_copy_move.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To copy and paste part of a picture</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_cutout_copy_move\"><b>To copy and paste part of a picture</b></p>\n\t<ol>\n\t\t<li>In the toolbox, click <img alt=\"the rectangular selection tool\" src=\"p_sel.gif\"> to select a rectangular area or click <img alt=\"the free form selection tool\" src=\"p_free.gif\"> to select a free-form area.</li>\n\t\t<li>Drag the pointer to define the area you want to copy.</li>\n\t\t<li>Select a method of pasting:\n\t\t\t<ul>\n\t\t\t\t<li>Click <img alt=\"opaque image button\" src=\"p_opaq.gif\"> to paste <a data-topic-id=\"GL_PBRUSH_OPAQUE_DEF\">opaquely.</a></li>\n\t\t\t\t<li>Click <img alt=\"transparent image button\" src=\"p_trans.gif\"> to paste <a data-topic-id=\"GL_PBRUSH_TRANSPARENT_DEF\">transparently.</a></li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li>On the <b>Edit</b> menu, click <b>Copy</b>.</li>\n\t\t<li>On the <b>Edit</b> menu, click <b>Paste</b>.</li>\n\t\t<li>Drag the selection where you want it.</li>\n\t</ol>\n\t<p><b>Notes</b></p>\n\t<ul>\n\t\t<li>You cannot paste graphics when the text tool is selected.</li>\n\t\t<li>You can paste multiple copies of an object by holding down <small>CTRL</small> while you drag the pasted object to a new location. Repeat as needed.</li>\n\t\t<li>You can undo any number of changes by clicking the <b>Edit</b> menu and then clicking <b>Undo</b> for each change.</li>\n\t\t<li>You can remove the selection box by clicking outside the box.</li>\n\t</ul>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_cutout_save.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To save part of a picture into another bitmap file</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_cutout_save\"><b>To save part of a picture into another bitmap file</b></p>\n\t<ol>\n\t\t<li>In the toolbox, click <img alt=\"the rectangular selection tool\" src=\"p_sel.gif\"> to select a rectangular area or click <img alt=\"the free form selection tool\" src=\"p_free.gif\"> to select a free-form area.</li>\n\t\t<li>Drag the pointer to define the area you want to save.</li>\n\t\t<li>On the <b>Edit</b> menu, click <b>Copy To</b>.</li>\n\t\t<li>Specify a folder and a file name, and then click <b>Save</b>.</li>\n\t</ol>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_cutout_select.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To select part of a picture</title>\n\t<meta content=\"a_paint_cutout_select\">\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_cutout_select\"><b>To select part of a picture</b></p>\n\t<p><img src=\"onestep.gif\"> In the toolbox, click <img alt=\"the rectangular selection tool\" src=\"p_sel.gif\"> to select a rectangular area, and then drag the pointer diagonally across the area.</p>\n\t<p>Or, click <img alt=\"the free form selection tool\" src=\"p_free.gif\"> to select a free-form area, and then drag the pointer around the area.</p>\n\t<p><b>Note</b></p>\n\t<ul>\n\t\t<li>You can remove the selection box by clicking outside the box.</li>\n\t</ul>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_enlarge_area.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To enlarge the size of the viewing area</title>\n\t<meta content=\"a_paint_enlarge_area\">\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_enlarge_area\"><b>To enlarge the size of the viewing area</b></p>\n\t<p><img src=\"onestep.gif\"> On the <b>View</b> menu, click <b>View Bitmap</b>.</p>\n\t<p>Your picture fills the entire viewing area. You can return to your former view by clicking anywhere in the picture.</p>\n\t<p><b>Notes</b></p>\n\t<ul>\n\t\t<li><s>You cannot make changes to a picture in this view.</s></li>\n\t\t<li>You can also enlarge the size of the viewing area by hiding the toolbox, color box, or status bar. You do this by clearing their check marks on the <b>View</b> menu.</li>\n\t</ul>\n\t<p><object classid=\"clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11\" height=\"0\" id=\"alink_1\" type=\"application/x-oleobject\" width=\"0\">\n\t\t<param name=\"Command\" value=\"ALink,MENU\">\n\t\t<param name=\"TEXT\" value=\"Text:Related Topics\">\n\t\t<param name=\"fONT\" value=\"VERDANA,8,0x000800,underline\">\n\t\t<param name=\"Item1\" value=\"\">\n\t\t<param name=\"Item2\" value=\"a_paint_zoom\">\n\t</object></p>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_erase_large.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To erase a large area</title>\n\t<meta content=\"a_paint_erase_large\">\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_erase_large\"><b>To erase a large area</b></p>\n\t<ol>\n\t\t<li>In the toolbox, click <img alt=\"the rectangular selection tool\" src=\"p_sel.gif\"> to select a rectangular area or click <img alt=\"the free form selection tool\" src=\"p_free.gif\"> to select a free-form area.</li>\n\t\t<li>Drag the pointer to select the area you want to erase.</li>\n\t\t<li>On the <b>Edit</b> menu, click <b>Clear Selection</b>.</li>\n\t</ol>\n\t<p><b>Note</b></p>\n\t<ul>\n\t\t<li>The current <a data-topic-id=\"gl_pbrush_back\">background color</a> will be used to fill the cleared area. You can choose a different background color by right-clicking a color in the color box.</li>\n\t</ul>\n\t<p><object classid=\"clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11\" height=\"0\" id=\"alink_1\" type=\"application/x-oleobject\" width=\"0\">\n\t\t<param name=\"Command\" value=\"ALink,MENU\">\n\t\t<param name=\"TEXT\" value=\"Text:Related Topics\">\n\t\t<param name=\"fONT\" value=\"VERDANA,8,0x000800,underline\">\n\t\t<param name=\"Item1\" value=\"\">\n\t\t<param name=\"Item2\" value=\"a_paint_erase_small;a_paint_clear_image;a_paint_undo;a_paint_not_in_color_box\">\n\t</object></p>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_erase_small.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To erase a small area</title>\n\t<meta content=\"a_paint_erase_small\">\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_erase_small\"><b>To erase a small area</b></p>\n\t<ol>\n\t\t<li>In the toolbox, click <img alt=\"the eraser tool\" src=\"p_erase.gif\">.</li>\n\t\t<li>At the bottom of the toolbox, click an eraser shape.</li>\n\t\t<li>Drag the pointer over the area you want to erase.</li>\n\t</ol>\n\t<p><b>Notes</b></p>\n\t<ul>\n\t\t<li>The selected <a data-topic-id=\"gl_pbrush_back\">background color</a> shows what color the eraser will leave behind. You can change the background color by right-clicking another color in the color box.</li>\n\t\t<li>You can change a specific color (and nothing else) by changing the <a data-topic-id=\"gl_pbrush_fore\">foreground color</a> to the color you want to erase and the background color to the color you want to replace it with. Then, when you click the eraser, you can right-click to change the color.</li>\n\t\t<li>You can undo any number of changes by clicking the <b>Edit</b> menu and then clicking <b>Undo</b> for each change.</li>\n\t</ul>\n\t<p><object classid=\"clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11\" height=\"0\" id=\"alink_1\" type=\"application/x-oleobject\" width=\"0\">\n\t\t<param name=\"Command\" value=\"ALink,MENU\">\n\t\t<param name=\"TEXT\" value=\"Text:Related Topics\">\n\t\t<param name=\"fONT\" value=\"VERDANA,8,0x000800,underline\">\n\t\t<param name=\"Item1\" value=\"\">\n\t\t<param name=\"Item2\" value=\"a_paint_erase_large;a_paint_clear_image;a_paint_undo;a_paint_not_in_color_box\">\n\t</object></p>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_fill.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To fill an area or object with color</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_fill\"><b>To fill an area or object with color</b></p>\n\t<ol>\n\t\t<li>In the toolbox, click <img alt=\"the inkwell\" src=\"p_paint.gif\">.</li>\n\t\t<li>Click the area or object you want to fill.</li>\n\t</ol>\n\t<p><b>Notes</b></p>\n\t<ul>\n\t\t<li>If the shape being filled has any breaks in its border, the filling color leaks through to the rest of the drawing area. You can find and close any openings by clicking the <b>View</b> menu, pointing to <b>Zoom</b>, and then clicking <b>Large Size</b> or <b>Custom</b>.</li>\n\t\t<li>The default background and foreground colors appear at the left in the color box. You can fill with the <a data-topic-id=\"gl_pbrush_fore\">foreground color</a> by clicking, or you can fill with the <a data-topic-id=\"gl_pbrush_back\">background color</a> by right-clicking.</li>\n\t\t<li>You can undo any number of changes by clicking the <b>Edit</b> menu and then clicking <b>Undo</b> for each change.</li>\n\t</ul>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_flip_picture.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To flip or rotate a picture or object</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_flip_picture\"><b>To flip or rotate a picture or object</b></p>\n\t<ol>\n\t\t<li>In the toolbox, click <img alt=\"the rectangular selection tool\" src=\"p_sel.gif\"> to select a rectangular area or click <img alt=\"the free form selection tool\" src=\"p_free.gif\"> to select a free-form area.</li>\n\t\t<li>Drag a box around the item you want to flip or rotate.</li>\n\t\t<li>At the bottom of the toolbox, select one of the following:\n\t\t\t<ul>\n\t\t\t\t<li>Click <img alt=\"opaque image button\" src=\"p_opaq.gif\"> to flip or rotate <a data-topic-id=\"GL_PBRUSH_OPAQUE_DEF\">opaquely.</a></li>\n\t\t\t\t<li>Click <img alt=\"transparent image button\" src=\"p_trans.gif\"> to flip or rotate <a data-topic-id=\"GL_PBRUSH_TRANSPARENT_DEF\">transparently.</a></li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li>On the <b>Image</b> menu, click <b>Flip/Rotate</b>.</li>\n\t\t<li>Click the option you want.</li>\n\t</ol>\n\t<p><b>Note</b></p>\n\t<ul>\n\t\t<li>You can undo any number of changes by clicking the <b>Edit</b> menu and then clicking <b>Undo</b> for each change.</li>\n\t</ul>\n\t<p><object classid=\"clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11\" height=\"0\" id=\"alink_1\" type=\"application/x-oleobject\" width=\"0\">\n\t\t<param name=\"Command\" value=\"ALink,MENU\">\n\t\t<param name=\"TEXT\" value=\"Text:Related Topics\">\n\t\t<param name=\"fONT\" value=\"VERDANA,8,0x000800,underline\">\n\t\t<param name=\"Item1\" value=\"\">\n\t\t<param name=\"Item2\" value=\"a_paint_cutout_select\">\n\t</object></p>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_freeform_lines.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To draw a free-form line</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_freeform_lines\"><b>To draw a free-form line</b></p>\n\t<ol>\n\t\t<li>In the toolbox, click <img alt=\"the pencil\" src=\"p_pencil.gif\">.</li>\n\t\t<li>To draw the line, drag the pointer.</li>\n\t</ol>\n\t<p><b>Notes</b></p>\n\t<ul>\n\t\t<li>The default background and foreground colors appear at the left in the color box. You can draw with the <a data-topic-id=\"gl_pbrush_fore\">foreground color</a> by clicking, or you can draw with the <a data-topic-id=\"gl_pbrush_back\">background color</a> by right-clicking.</li>\n\t\t<li>You can undo any number of changes by clicking the <b>Edit</b> menu and then clicking <b>Undo</b> for each change.</li>\n\t</ul>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_grid.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To display gridlines</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_grid\"><b>To display gridlines</b></p>\n\t<ol>\n\t\t<li>On the <b>View</b> menu, point to <b>Zoom</b>, and then click <b>Custom</b>.</li>\n\t\t<li>Under <b>Zoom to</b>, click <b>400%</b>, <b>600%</b>, or <b>800%</b>, and then click <b>OK</b>.</li>\n\t\t<li>On the <b>View</b> menu, point to <b>Zoom</b>, and then click <b>Show Grid</b>.</li>\n\t</ol>\n\t<p><b>Note</b></p>\n\t<ul>\n\t\t<li>You can remove the gridlines by repeating step 3 and clearing the <b>Show Grid</b> check mark, or by clicking <b>View</b>, pointing to <b>Zoom</b>, and then clicking <b>Normal Size</b>.</li>\n\t</ul>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_insert_file.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To insert a bitmap into the current picture</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_insert_file\"><b>To insert a bitmap into the current picture</b></p>\n\t<ol>\n\t\t<li>In the toolbox, click <img alt=\"the rectangular selection tool\" src=\"p_sel.gif\"> and then drag the pointer to define an area to put the bitmap in.</li>\n\t\t<li>On the <b>Edit</b> menu, click <b>Paste From</b>.</li>\n\t\t<li>Locate and double-click the bitmap file you want to insert.</li>\n\t\t<li>Drag the bitmap where you want it, and then click outside the selection.</li>\n\t</ol>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_invert.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To invert all the colors in a picture</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_invert\"><b>To invert all the colors in a picture</b></p>\n\t<p><img src=\"onestep.gif\"> On the <b>Image</b> menu, click <b>Invert Colors</b>.</p>\n\t<p><b>Note</b></p>\n\t<ul>\n\t\t<li>Each color is replaced by its color complement. For example, red becomes cyan, and blue becomes yellow.</li>\n\t</ul>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_lines.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To draw a straight line</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_lines\"><b>To draw a straight line</b></p>\n\t<ol>\n\t\t<li>In the toolbox, click <img alt=\"the diagonal line tool\" src=\"p_line.gif\">.</li>\n\t\t<li>At the bottom of the toolbox, click a line width.</li>\n\t\t<li>To draw the line, drag the pointer.</li>\n\t</ol>\n\t<p><b>Notes</b></p>\n\t<ul>\n\t\t<li>The default background and foreground colors appear at the left in the color box. You can draw with the <a data-topic-id=\"gl_pbrush_fore\">foreground color</a> by clicking, or you can draw with the <a data-topic-id=\"gl_pbrush_back\">background color</a> by right-clicking.</li>\n\t\t<li>You can draw a perfectly horizontal, vertical, or 45-degree diagonal line by holding down <small>SHIFT</small> while dragging.</li>\n\t</ul>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_not_in_color_box.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To copy color from one area or object to another</title>\n\t<meta content=\"a_paint_not_in_color_box\">\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_not_in_color_box\"><b>To copy color from one area or object to another</b></p>\n\t<ol>\n\t\t<li>In the toolbox, click <img alt=\"the eyedropper tool\" src=\"p_eye.gif\">.</li>\n\t\t<li>Click the object whose color you want to copy.</li>\n\t\t<li>In the toolbox, click <img alt=\"the inkwell\" src=\"p_paint.gif\">.</li>\n\t\t<li>Click the object or area where you want the new color.</li>\n\t</ol>\n\t<p><b>Note</b></p>\n\t<ul>\n\t\t<li>To use a color as a <a data-topic-id=\"gl_pbrush_back\">background color,</a> or to erase with a color that isn't in the color box, right-click the color in your picture.</li>\n\t</ul>\n\t<p><object classid=\"clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11\" height=\"0\" id=\"alink_1\" type=\"application/x-oleobject\" width=\"0\">\n\t\t<param name=\"Command\" value=\"ALink,MENU\">\n\t\t<param name=\"TEXT\" value=\"Text:Related Topics\">\n\t\t<param name=\"fONT\" value=\"VERDANA,8,0x000800,underline\">\n\t\t<param name=\"Item1\" value=\"\">\n\t\t<param name=\"Item2\" value=\"a_paint_erase_small;a_paint_erase_large\">\n\t</object></p>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_ovals.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To draw an ellipse or circle</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_ovals\"><b>To draw an ellipse or circle</b></p>\n\t<ol>\n\t\t<li>In the toolbox, click <img alt=\"the oval tool\" src=\"p_oval.gif\">.</li>\n\t\t<li>Drag the pointer diagonally.\n\t\t\t<p>You can draw a perfect circle by holding down <small>SHIFT</small> while you drag.</p>\n\t\t</li>\n\t</ol>\n\t<p><b>Notes</b></p>\n\t<ul>\n\t\t<li>You can create a colored fill by clicking a fill style at the bottom of the toolbox. Click a new color in the color box to change the line color, or right-click a new color to change the fill color.</li>\n\t\t<li>The default background and foreground colors appear at the left in the color box. You can draw with the <a data-topic-id=\"gl_pbrush_fore\">foreground color</a> by clicking, or you can draw with the <a data-topic-id=\"gl_pbrush_back\">background color</a> by right-clicking.</li>\n\t\t<li>You can undo any number of changes by clicking the <b>Edit</b> menu and then clicking <b>Undo</b> for each change.</li>\n\t</ul>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_polygons.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To draw a polygon</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_polygons\"><b>To draw a polygon</b></p>\n\t<ol>\n\t\t<li>In the toolbox, click <img alt=\"the polygon tool\" src=\"p_poly.gif\">.</li>\n\t\t<li>To draw the polygon, drag the pointer and click at each corner, and then double-click when done.\n\t\t\t<p>To use only 45- and 90-degree angles, hold down <small>SHIFT</small> while dragging.</p>\n\t\t</li>\n\t</ol>\n\t<p><b>Notes</b></p>\n\t<ul>\n\t\t<li>The default background and foreground colors appear at the left in the color box. You can draw with the <a data-topic-id=\"gl_pbrush_fore\">foreground color</a> by clicking, or you can draw with the <a data-topic-id=\"gl_pbrush_back\">background color</a> by right-clicking.</li>\n\t\t<li>You can undo any number of changes by clicking the <b>Edit</b> menu and then clicking <b>Undo</b> for each change.</li>\n\t\t<li>You can create a colored fill by clicking a fill style at the bottom of the toolbox.</li>\n\t</ul>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_print.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To print a picture</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_print\"><b>To print a picture</b></p>\n\t<p><img src=\"onestep.gif\"> On the <b>File</b> menu, click <b>Print</b>.</p>\n\t<p><b>Notes</b></p>\n\t<ul>\n\t\t<li>You can see how the printed picture will look before you print by clicking the <b>File</b> menu and then clicking <b>Print Preview</b>.</li>\n\t\t<li>You can set margins or change orientation by clicking the <b>File</b> menu and then clicking <b>Page Setup</b>.</li>\n\t</ul>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_rectangles.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To draw a rectangle or square</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_rectangles\"><b>To draw a rectangle or square</b></p>\n\t<ol>\n\t\t<li>In the toolbox, click <img alt=\"the rectangle tool\" src=\"p_rect.gif\"> to create a square-cornered shape, or click <img alt=\"the round corner box tool\" src=\"p_rrect.gif\"> to create a round-cornered shape.</li>\n\t\t<li>To draw a rectangle, drag the pointer diagonally in the direction you want.</li>\n\t\t<li>To draw a square, hold down <small>SHIFT</small> while dragging the pointer.</li>\n\t</ol>\n\t<p><b>Notes</b></p>\n\t<ul>\n\t\t<li>The default background and foreground colors appear at the left in the color box. You can draw with the <a data-topic-id=\"gl_pbrush_fore\">foreground color</a> by clicking, or you can draw with the <a data-topic-id=\"gl_pbrush_back\">background color</a> by right-clicking.</li>\n\t\t<li>You can create a colored fill by clicking a fill style at the bottom of the toolbox.</li>\n\t\t<li>The border width of the box is the same as the thickness selected for the line tools. To change the border thickness, click the line or curve tool in the toolbox, and then click the thickness you want in the box below the toolbox.</li>\n\t</ul>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_set_default_colors.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To set the default foreground and background colors</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_set_default_colors\"><b>To set the default foreground and background colors</b></p>\n\t<ul>\n\t\t<li>To set the <a data-topic-id=\"gl_pbrush_fore\">foreground color,</a> click a color in the color box.</li>\n\t\t<li>To set the <a data-topic-id=\"gl_pbrush_back\">background color,</a> right-click a color in the color box.</li>\n\t</ul>\n\t<p><b>Note</b></p>\n\t<ul>\n\t\t<li>The default background and foreground colors appear at the left in the color box. The top color chip represents the foreground color. The bottom color chip represents the background color.</li>\n\t</ul>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_skew_picture.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To stretch or skew an item</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_skew_picture\"><b>To stretch or skew an item</b></p>\n\t<ol>\n\t\t<li>In the toolbox, click <img alt=\"the rectangular selection tool\" src=\"p_sel.gif\"> to select a rectangular area or click <img alt=\"the free form selection tool\" src=\"p_free.gif\"> to select a free-form area.</li>\n\t\t<li>Drag a box around the item you want to change.</li>\n\t\t<li>On the <b>Image</b> menu, click <b>Stretch/Skew</b>.</li>\n\t\t<li>Click the stretching or skewing option you want, and then enter the amount.</li>\n\t\t<li>At the bottom of the toolbox, select one of the following:\n\t\t\t<ul>\n\t\t\t\t<li>Click <img alt=\"opaque image button\" src=\"p_opaq.gif\"> to stretch or skew <a data-topic-id=\"GL_PBRUSH_OPAQUE_DEF\">opaquely.</a></li>\n\t\t\t\t<li>Click <img alt=\"transparent image button\" src=\"p_trans.gif\"> to stretch or skew <a data-topic-id=\"GL_PBRUSH_TRANSPARENT_DEF\">transparently.</a></li>\n\t\t\t</ul>\n\t\t</li>\n\t</ol>\n\t<p><b>Note</b></p>\n\t<ul>\n\t\t<li>You can undo any number of changes by clicking the <b>Edit</b> menu and then clicking <b>Undo</b> for each change.</li>\n\t</ul>\n\t<p><object classid=\"clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11\" height=\"0\" id=\"alink_1\" type=\"application/x-oleobject\" width=\"0\">\n\t\t<param name=\"Command\" value=\"ALink,MENU\">\n\t\t<param name=\"TEXT\" value=\"Text:Related Topics\">\n\t\t<param name=\"fONT\" value=\"VERDANA,8,0x000800,underline\">\n\t\t<param name=\"Item1\" value=\"\">\n\t\t<param name=\"Item2\" value=\"a_paint_cutout_select\">\n\t</object></p>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_text.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To type and format text</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_text\"><b>To type and format text</b></p>\n\t<ol>\n\t\t<li>In the toolbox, click <img alt=\"the 'A' button\" src=\"p_txt.gif\">.</li>\n\t\t<li>To create a text frame, drag the pointer diagonally to the size you want.</li>\n\t\t<li>On the text toolbar, click the font, size, and style you want for the text.</li>\n\t\t<li>Click inside the text frame, type the text, and then do any of the following as needed.\n\t\t\t<ul>\n\t\t\t\t<li>Move or enlarge the text frame.</li>\n\t\t\t\t<li>Click a color to change the color of the text.</li>\n\t\t\t\t<li>Click <img alt=\"opaque image button\" src=\"p_opaq.gif\"> in the toolbox to insert the text on a colored background. Then right-click in the color box to change the background color.</li>\n\t\t\t</ul>\n\t\t</li>\n\t</ol>\n\t<p><b>Notes</b></p>\n\t<ul>\n\t\t<li>You can view the text toolbar by clicking the <b>View</b> menu and then clicking <b>Text Toolbar</b>. If it obscures part of the <b>Paint</b> window, you can drag the toolbar to any location in the window.</li>\n\t\t<li><s>You can enter text into a picture only in Normal view.</s></li>\n\t\t<li>You can insert text into the picture by clicking outside the text frame.</li>\n\t\t<li>When the text tool is selected, you can paste text only. You cannot paste graphics.</li>\n\t\t<li>You can undo any number of changes by clicking the <b>Edit</b> menu and then clicking <b>Undo</b> for each change.</li>\n\t</ul>\n\t<p><object classid=\"clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11\" height=\"0\" id=\"alink_1\" type=\"application/x-oleobject\" width=\"0\">\n\t\t<param name=\"Command\" value=\"ALink,MENU\">\n\t\t<param name=\"TEXT\" value=\"Text:Related Topics\">\n\t\t<param name=\"fONT\" value=\"VERDANA,8,0x000800,underline\">\n\t\t<param name=\"Item1\" value=\"\">\n\t\t<param name=\"Item2\" value=\"a_paint_zoom\">\n\t</object></p>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_toolbox.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To show or hide the toolbox</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_toolbox\"><b>To show or hide the toolbox</b></p>\n\t<p><img src=\"onestep.gif\"> To show the toolbox, click the <b>View</b> menu and make sure a check mark appears next to <b>Tool Box</b>. To hide the toolbox, click to clear the check mark.</p>\n\t<p><b>Note</b></p>\n\t<ul>\n\t\t<li>You can drag the toolbox to any location in the window.</li>\n\t</ul>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_trans_opaque.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To specify transparent or opaque drawing</title>\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_trans_opaque\"><b>To specify transparent or opaque drawing</b></p>\n\t<p><img src=\"onestep.gif\"> To specify <a data-topic-id=\"GL_PBRUSH_TRANSPARENT_DEF\">transparent</a> drawing, on the <b>Image</b> menu, click to clear the check mark next to <b>Draw Opaque</b>. To specify <a data-topic-id=\"GL_PBRUSH_OPAQUE_DEF\">opaque</a> drawing, make sure a check mark appears next to <b>Draw Opaque</b>.</p>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_undo.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To undo changes</title>\n\t<meta content=\"a_paint_undo\">\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_undo\"><b>To undo changes</b></p>\n\t<p><img src=\"onestep.gif\"> On the <b>Edit</b> menu, click <b>Undo</b>.</p>\n\t<p><b>Note</b></p>\n\t<ul>\n\t\t<li>You can undo any number of changes by clicking the <b>Edit</b> menu and then clicking <b>Undo</b> for each change.</li>\n\t</ul>\n\t<p><object classid=\"clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11\" height=\"0\" id=\"alink_1\" type=\"application/x-oleobject\" width=\"0\">\n\t\t<param name=\"Command\" value=\"ALink,MENU\">\n\t\t<param name=\"TEXT\" value=\"Text:Related Topics\">\n\t\t<param name=\"fONT\" value=\"VERDANA,8,0x000800,underline\">\n\t\t<param name=\"Item1\" value=\"\">\n\t\t<param name=\"Item2\" value=\"a_paint_erase_small;a_paint_erase_large;a_paint_not_in_color_box\">\n\t</object></p>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_wallpaper.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To use a picture as the desktop background</title>\n\t<meta content=\"win_paint_to_wallpaper\">\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_wallpaper\"><b>To use a picture as the desktop background</b></p>\n\t<!-- <ol>\n\t\t<li>Save the picture.</li>\n\t\t<li>On the <b>File</b> menu, click either of the following commands:\n\t\t\t<ul>\n\t\t\t\t<li><b>Set As Wallpaper (Tiled)</b> covers the screen with repetitions of your picture.</li>\n\t\t\t\t<li><b>Set As Wallpaper (Centered)</b> places your picture in the center of the screen.</li>\n\t\t\t</ul>\n\t\t</li>\n\t</ol> -->\n\t<ol>\n\t\t<li>On the <b>File</b> menu, click either of the following commands:\n\t\t\t<ul>\n\t\t\t\t<li><b>Set As Wallpaper (Tiled)</b> covers the screen with repetitions of your picture.</li>\n\t\t\t\t<li><b>Set As Wallpaper (Centered)</b> places your picture in the center of the screen.</li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li>Save the picture.</li>\n\t\t<li>Go into your system settings to choose the wallpaper.</li>\n\t</ol>\n\t<p><b>Notes</b></p>\n\t<ul>\n\t\t<li>JS Paint can't directly set your wallpaper, but it can generate a tiled image the size of your desktop.</li>\n\t\t<!-- @TODO: make this note unnecessary? -->\n\t\t<li>The <b>Set As Wallpaper (Centered)</b> option doesn't currently use your desktop size, it just saves a copy of the image.\n\t\tYou need to make sure in your system settings to choose to center the image.</li>\n\t</ul>\n</body>\n</html>\n"
  },
  {
    "path": "help/paint_zoom.html",
    "content": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>To zoom in or out of a picture</title>\n\t<meta content=\"a_paint_zoom\">\n\t<link href=\"coUA.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body>\n\t<p id=\"paint_zoom\"><b>To zoom in or out of a picture</b></p>\n\t<p><img src=\"onestep.gif\"> On the <b>View</b> menu, point to <b>Zoom</b>, and then click <b>Normal Size</b>, <b>Large Size</b>, or <b>Custom</b>.</p>\n\t<p><b>Note</b></p>\n\t<ul>\n\t\t<li><s>You can enter text into a picture only in Normal view.</s></li>\n\t</ul>\n\t<p><object classid=\"clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11\" height=\"0\" id=\"alink_1\" type=\"application/x-oleobject\" width=\"0\">\n\t\t<param name=\"Command\" value=\"ALink,MENU\">\n\t\t<param name=\"TEXT\" value=\"Text:Related Topics\">\n\t\t<param name=\"fONT\" value=\"VERDANA,8,0x000800,underline\">\n\t\t<param name=\"Item1\" value=\"\">\n\t\t<param name=\"Item2\" value=\"a_paint_enlarge_area\">\n\t</object></p>\n</body>\n</html>\n"
  },
  {
    "path": "help/prettify-html.ahk",
    "content": "; AutoHotkey script for formatting HTML with DirtyMarkup\n; They actually have an API, but I decided to go this route instead of... looking for a CLI... which does exist\n\n; Usage:\n; * Open https://www.10bestdesign.com/dirtymarkup/\n; * Check \"Allow proprietary attributes\"\n; * Switch to your editor where you have some HTML\n; * Press F12\n\nF12::\n; SetKeyDelay, 69, 69\n; (extra) delays are needed only for interacting with the webpage\n; so I've done sleeps below instead\n; (they might also be needed if the editor is a webpage)\nOriginalClipboard := ClipboardAll\nClipboard :=\nWinGet, CodeEditorWinID, ID, A\nSend, ^a\nSend, ^c\nClipWait, 1\nIf ErrorLevel\n{\n\tMsgBox, Failed to copy from code editor (no change to clipboard in timeout period)\n\tGoto, ResetAndEnd\n}\nIf Trim(Clipboard) =\n{\n\tMsgBox, Failed to copy from code editor (clipboard empty)\n\tGoto, ResetAndEnd\n}\nWinActivate, DirtyMarkup\nWinWaitActive, DirtyMarkup, , 1\nIf ErrorLevel\n{\n\tMsgBox, Failed to activate DirtyMarkup; I'm not gonna open it for u just open it lol (and focus the tab)\n\tGoto, ResetAndEnd\n}\nClick, 420, 420\nSleep, 50\nSend, ^a\nSleep, 150 ; not sure this needs to be higher\nSend, ^v\nSleep, 150 ; not sure this needs to be higher\nClick, 69, 420\nClipboard :=\nClick, 420, 420\nSleep, 50\nSend, ^a\nSleep, 50\nSend, ^c\nClipWait, 1\nIf ErrorLevel\n{\n\tMsgBox, Failed to copy from DirtyMarkup\n\tGoto, ResetAndEnd\n}\nWinActivate ahk_id %CodeEditorWinID%\nSend, ^a\nSend, ^v\nResetAndEnd:\nClipboard := OriginalClipboard\nReturn\n\n; Shortcut to move to next file\n; This could be set up in your editor instead\nF11::\nSend ^0 ; Ctrl+0 focuses the sidebar in VS Code\nSend {Down}{Enter}\nReturn\n"
  },
  {
    "path": "help/vaporwave.js",
    "content": "\nconst clouds_img = document.createElement(\"img\");\nclouds_img.src = \"clouds.jpg\";\nconst mask_img = document.createElement(\"img\");\nmask_img.src = \"cloud-mask.png\";\nconst something_img = document.createElement(\"img\");\nsomething_img.src = \"../images/icons/32x32.png\";\n\nconst canvas = document.createElement(\"canvas\");\ndocument.getElementById(\"background-animation\").append(canvas);\nconst ctx = canvas.getContext(\"2d\");\nconst animate = () => {\n\trequestAnimationFrame(animate);\n\n\tif (\n\t\tcanvas.width !== mask_img.width ||\n\t\tcanvas.height !== mask_img.height\n\t) {\n\t\tcanvas.width = mask_img.width;\n\t\tcanvas.height = mask_img.height;\n\t}\n\n\tconst clouds_scale = 1;\n\tconst clouds_width = clouds_img.width * clouds_scale;\n\tconst clouds_height = clouds_img.width * clouds_scale;\n\tconst x_extent = (clouds_width - canvas.width) / 2;\n\tconst y_extent = (clouds_height - canvas.height) / 2;\n\tconst x_interval_ms = 19000;\n\tconst y_interval_ms = 7000;\n\tconst now = performance.now();\n\tif (!(\n\t\tmask_img.complete && mask_img.naturalWidth > 1 &&\n\t\tclouds_img.complete && clouds_img.naturalWidth > 1\n\t)) {\n\t\treturn;\n\t}\n\tctx.drawImage(\n\t\tclouds_img,\n\t\tMath.sin(now / x_interval_ms) * x_extent - x_extent,\n\t\tMath.cos(now / y_interval_ms) * y_extent - y_extent,\n\t\tclouds_width,\n\t\tclouds_height\n\t);\n\tif (something_img.complete && something_img.naturalWidth > 1) {\n\t\tlet t = now / 5000;\n\t\tctx.globalAlpha = 0.3 + Math.max(0, Math.sin(-t) * 1);\n\t\tctx.drawImage(\n\t\t\tsomething_img,\n\t\t\t~~(Math.sin(-t) * canvas.width * 0.7),\n\t\t\t~~(Math.cos(-t) * 70)\n\t\t);\n\t\tctx.globalAlpha = 1;\n\t}\n\tctx.globalCompositeOperation = \"screen\";\n\tctx.drawImage(mask_img, 0, 0);\n\tctx.globalCompositeOperation = \"source-over\";\n\tctx.fillStyle = \"white\";\n\tctx.fillRect(0, mask_img.naturalHeight, mask_img.naturalWidth, canvas.height);\n\tctx.fillRect(mask_img.naturalWidth, 0, 50, canvas.height); // for scrollbar\n};\nanimate();\n"
  },
  {
    "path": "index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>JS Paint</title>\n\n\t<!-- This should mirror CSP in electron-main.js, except maybe for firebase stuff. -->\n\t<!-- Firebase stuff is somewhat speculative, as the quota is exceeded as I'm adding this. -->\n\t<!-- Lax img-src is needed for speech recognition, e.g. interpret_command(\"draw a cat\")[0].exec(); -->\n\t<!-- connect-src needs data:/blob: for loading images via fetch, including from local storage. -->\n\t<!-- script⁂-src needs blob: for the Web Worker used by clmtrackr for Tracky Mouse head tracking feature -->\n\t<!-- ⁂: working around bug in @1j01/live-server, my fork of live-server meant to handle CSP (https://github.com/1j01/live-server)\n\twhere the directive (that shall not be named) is replaced even if it's outside the CSP in a comment. -->\n\t<meta http-equiv=\"Content-Security-Policy\" content=\"\n\t\tdefault-src 'self';\n\t\tscript-src 'self' blob: https://jspaint.firebaseio.com https://www.youtube.com;\n\t\tframe-src 'self' https://youtube.com https://www.youtube.com;\n\t\tstyle-src 'self' 'unsafe-inline' https://fonts.googleapis.com;\n\t\timg-src 'self' data: blob: http: https:;\n\t\tfont-src 'self' https://fonts.gstatic.com;\n\t\tconnect-src * data: blob: https://jspaint.firebaseio.com wss://jspaint.firebaseio.com;\n\t\">\n\n\t<link href=\"styles/normalize.css\" rel=\"stylesheet\" type=\"text/css\">\n\t<link href=\"styles/layout.css\" class=\"flippable-layout-stylesheet\" rel=\"stylesheet\" type=\"text/css\">\n\t<link href=\"styles/print.css\" rel=\"stylesheet\" type=\"text/css\" media=\"print\">\n\t<link href=\"lib/os-gui/build/layout.css\" class=\"flippable-layout-stylesheet\" rel=\"stylesheet\" type=\"text/css\">\n\t<!-- <link href=\"lib/os-gui/build/windows-98.css\" rel=\"stylesheet\" type=\"text/css\"> -->\n\t<!-- <link href=\"lib/os-gui/build/windows-default.css\" rel=\"stylesheet\" type=\"text/css\" title=\"Windows Default\"> -->\n\t<!-- <link href=\"lib/os-gui/build/peggys-pastels.css\" rel=\"alternate stylesheet\" type=\"text/css\" title=\"Peggy's Pastels\"> -->\n\t<link href=\"lib/tracky-mouse/core/tracky-mouse.css\" rel=\"stylesheet\" type=\"text/css\">\n\t<!--\n\t\t@TODO: bring these styles into OS-GUI.\n\t\tThis is a custom build of 98.css https://github.com/jdan/98.css\n\t\tfor checkboxes, radio buttons, sliders, and fieldsets,\n\t\texcluding e.g. scrollbars, buttons, and windows (already in OS-GUI),\n\t\tand integrating with the theme CSS vars used by OS-GUI,\n\t\tand with some RTLCSS tweaks.\n\t\tText inputs and dropdowns are styled in classic.css, but should also be included in OS-GUI at some point.\n\t\tThis is not an @import in classic.css because it needs RTLCSS and I'm not applying RTLCSS to themes yet.\n\t\tSo I added .not-for-modern logic to theme.js to exclude these styles depending on the theme.\n\t-->\n\t<link href=\"lib/98.css/98.custom-build.css\" class=\"flippable-layout-stylesheet not-for-modern\" rel=\"stylesheet\"\n\t\ttype=\"text/css\">\n\n\t<link rel=\"apple-touch-icon\" href=\"images/icons/apple-icon-180x180.png\">\n\t<!-- Chrome will pick the largest image for some reason, instead of the most appropriate one. -->\n\t<!-- <link rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"images/icons/192x192.png\">\n\t\t<link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"images/icons/32x32.png\">\n\t\t<link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"images/icons/96x96.png\"> -->\n\t<!-- <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"images/icons/16x16.png\"> -->\n\t<link rel=\"shortcut icon\" href=\"favicon.ico\">\n\t<link rel=\"mask-icon\" href=\"images/icons/safari-pinned-tab.svg\" color=\"red\">\n\t<link rel=\"manifest\" href=\"manifest.webmanifest\">\n\t<meta name=\"msapplication-TileColor\" content=\"#008080\">\n\t<meta name=\"msapplication-TileImage\" content=\"images/icons/ms-icon-144x144.png\">\n\t<meta name=\"theme-color\" content=\"#000080\">\n\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no\">\n\n\t<meta name=\"description\" content=\"Classic MS Paint in the browser, with extra features\" />\n\t<meta property=\"og:image:width\" content=\"279\">\n\t<meta property=\"og:image:height\" content=\"279\">\n\t<meta property=\"og:description\" content=\"Classic MS Paint in the browser, with extra features.\">\n\t<meta property=\"og:title\" content=\"JS Paint\">\n\t<meta property=\"og:url\" content=\"https://jspaint.app\">\n\t<meta property=\"og:image\" content=\"https://jspaint.app/images/icons/og-image-279x279.jpg\">\n\t<meta name=\"twitter:title\" content=\"JS Paint\">\n\t<meta name=\"twitter:description\" content=\"Classic MS Paint in the browser, with extra features\">\n\t<meta name=\"twitter:image\" content=\"https://jspaint.app/images/meta/twitter-card-plz-no-crop.png\">\n\t<meta name=\"twitter:card\" content=\"summary_large_image\">\n\t<meta name=\"twitter:site\" content=\"@isaiahodhner\">\n\t<meta name=\"twitter:creator\" content=\"@isaiahodhner\">\n\n\t<script src=\"src/error-handling-basic.js\"></script>\n\t<script type=\"module\" src=\"src/theme.js\"></script>\n</head>\n\n<body>\n\t<div id=\"about-paint\" style=\"display: none\">\n\t\t<div id=\"about-paint-header\">\n\t\t\t<img src=\"images/icons/128x128.png\" width=\"128\" height=\"128\" id=\"about-paint-icon\" alt=\"\" />\n\t\t\t<div id=\"about-paint-beside-icon\">\n\t\t\t\t<h1 id=\"jspaint-project-name\">JS Paint</h1>\n\t\t\t\t<div id=\"jspaint-version\" title=\"About time to increment the version number, don't you think?\">\n\t\t\t\t\tVersion 1.0.0+\n\t\t\t\t</div>\n\t\t\t\t<div id=\"jspaint-update-status-area\" hidden>\n\t\t\t\t\t<!-- perhaps this can be merged with the container now that it's the only child -->\n\t\t\t\t\t<div id=\"maybe-outdated-line\">\n\t\t\t\t\t\t<div id=\"outdated\" hidden>\n\t\t\t\t\t\t\t<div class=\"on-official-host\">\n\t\t\t\t\t\t\t\tThere's a new version of JS&nbsp;Paint.\n\t\t\t\t\t\t\t\t<a id=\"refresh-to-update\" href=\".\">Refresh</a> to get it.\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"on-third-party-host\">\n\t\t\t\t\t\t\t\tThis instance of JS&nbsp;Paint is outdated compared to\n\t\t\t\t\t\t\t\t<a href=\"https://jspaint.app\" target=\"_blank\">jspaint.app</a>.\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"on-dev-host\">\n\t\t\t\t\t\t\t\tThis version of JS&nbsp;Paint is outdated compared to\n\t\t\t\t\t\t\t\t<a href=\"https://jspaint.app\" target=\"_blank\">jspaint.app</a>.\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div id=\"checking-for-updates\" hidden>\n\t\t\t\t\t\t\tChecking for updates...\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div id=\"failed-to-check-if-outdated\" hidden>\n\t\t\t\t\t\t\tCouldn't check for updates.\n\t\t\t\t\t\t\t<span class=\"navigator-offline\">You're offline.</span>\n\t\t\t\t\t\t\t<span class=\"navigator-online\">JS&nbsp;Paint may be outdated.</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<!-- @#: What's New? -->\n\t\t\t<button id=\"view-project-news\">What's&nbsp;New?</button>\n\t\t</div>\n\n\t\t<!-- <p>JS Paint is a web-based MS Paint remake by <a href=\"https://isaiahodhner.io/\">Isaiah Odhner</a>.</p> -->\n\t\t<!-- @#: Isaiah Odhner -->\n\t\t<p>MS Paint remake by <a href=\"https://isaiahodhner.io/\" target=\"_blank\">Isaiah&nbsp;Odhner</a></p>\n\t\t<!-- <p>Read about the project and extra features on <a href=\"https://github.com/1j01/jspaint#readme\">the readme</a>.</p> -->\n\t\t<!-- <p>Request features and report bugs <a href=\"https://github.com/1j01/jspaint/issues\">on GitHub</a>\n\t\t\tor <a href=\"mailto:isaiahodhner@gmail.com?subject=JS%20Paint\">by email</a>.</p> -->\n\t\t<p>\n\t\t\tFeedback:\n\t\t\t<a href=\"https://github.com/1j01/jspaint/issues\" target=\"_blank\">GitHub</a>\n\t\t\tor <a href=\"mailto:isaiahodhner@gmail.com?subject=JS%20Paint\">E-mail</a>\n\t\t\tor <a href=\"https://discord.gg/jxQBK3k8tx\" target=\"_blank\">Discord</a>\n\t\t</p>\n\t\t<!-- <p>Support the project at <a href=\"https://www.paypal.me/IsaiahOdhner\"\n\t\t\ttarget=\"_blank\">paypal.me/IsaiahOdhner</a>.</p> -->\n\t\t<p>Donate: <a href=\"https://www.paypal.me/IsaiahOdhner\" target=\"_blank\">paypal.me/IsaiahOdhner</a></p>\n\t\t<p>\n\t\t\t<a href=\"about.html\" target=\"_blank\">Homepage</a>\n\t\t\t&middot;\n\t\t\t<a href=\"https://github.com/1j01/jspaint/blob/master/LICENSE.txt\" target=\"_blank\">MIT License</a>\n\t\t\t&middot;\n\t\t\t<a href=\"privacy.html\" target=\"_blank\">Privacy Policy</a>\n\t\t</p>\n\t</div>\n\t<script type=\"module\" src=\"src/test-news.js\"></script>\n\t<!--\n\t\tBefore publishing a news update, make sure:\n\t\t- All important changes are mentioned. Check the commit history, ideally.\n\t\t- The <time> element matches the date of the update.\n\t\t- The id of the <article> will never need to be changed.\n\t\t\tI'm using the format \"news-YYYY-very-brief-description\".\n\t\t\tI'm avoiding putting the full date in the id, in case I push the update later.\n\t\t\tThe id is used to check for updates, and is stored in localStorage.\n\t\t- The console shows no errors.\n\t\t\ttest-news.js checks for some problems.\n\t\t- HTML is valid.\n\t\t- News indicator is updated and reads well.\n\t-->\n\t<div id=\"news\" hidden>\n\t\t<!-- maybe release Textual Paint first as an April Fools day prank? -->\n\t\t<!-- <article class=\"news-entry\" id=\"news-2024-textual-paint\">\n\t\t\t<h1>Paint... in the Terminal!?</h1>\n\t\t\t<time datetime=\"\"></time>\n\t\t\t<img width=\"\" height=\"\" style=\"max-width: 100%; height: auto; image-rendering: auto;\" alt=\"\" src=\"\" />\n\t\t\t<p>\n\t\t\t\tI have created an entirely new MS Paint clone, called <a target=\"_blank\" href=\"https://github.com/1j01/textual-paint\">Textual Paint</a>.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tJS Paint runs in the browser, bringing nostalgia to the web, but if it's not retro enough for you,\n\t\t\t\twhat's more retro than a terminal?\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tOnce again, I've implemented basically every feature of MS Paint, but this time as a Text User Interface (TUI).\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTextual Paint is written in Python, and is built with the <a target=\"_blank\" href=\"https://textual.textualize.io/\">Textual</a> framework.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTo install Textual Paint, first make sure you have Python 3.10 or later.\n\t\t\t\tThen run <code>pip install textual-paint</code>\n\t\t\t\t(or <code><a target=\"_blank\" href=\"https://github.com/pypa/pipx\">pipx</a> install textual-paint</code>).\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTo run Textual Paint, run <code>textual-paint</code>.\n\t\t\t\tYou'll need to use a modern terminal emulator with Unicode and true color support,\n\t\t\t\tsuch as Windows Terminal, GNOME Terminal, or iTerm2.\n\t\t\t</p>\n\t\t-->\n\t\t<article class=\"news-entry\" id=\"news-2024-split-eye-gaze-mode\">\n\t\t\t<h1>More Accessibility Options, and new Discord Server</h1>\n\t\t\t<time datetime=\"2024-12-23\">2024-12-23</time>\n\t\t\t<!-- <img width=\"\" height=\"\" style=\"max-width: 100%; height: auto; image-rendering: auto;\" alt=\"\" src=\"\" /> -->\n\t\t\t<h2>Separated out accessibility features</h2>\n\t\t\t<p>I've split up \"Eye Gaze Mode\" into several discrete features:</p>\n\t\t\t<ul>\n\t\t\t\t<li>\n\t\t\t\t\t<strong>↩️ Quick Undo Button</strong>: Adds a floating undo button that's always visible.\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<strong>🔍 Enlarge UI</strong>: Enlarges menus, buttons, and windows.\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<strong>⏱️ Dwell Clicker</strong>: Automatically clicks by hovering over controls for a time.\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<strong>↕️ Vertical Color Box</strong>: Makes the Colors box tall instead of wide.\n\t\t\t\t\t(This one was already split out.)\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<p>I've also added a brand-new feature:</p>\n\t\t\t<ul>\n\t\t\t\t<li>\n\t\t\t\t\t<strong>🧑 Head Tracker</strong>: Lets you move the cursor with your head.\n\t\t\t\t\t(See demo video below!)\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<!-- <p>Initially I developed Eye Gaze Mode as a monolithic feature because it was easier,\n\t\t\t\tas it limited the combinatorial complexity of the intersection of various features.\n\t\t\t\tFor instance, any theme can be used with any feature. (Not sure how to explain this better.)\n\t\t\t\tBut I decided it was worth the extra development overhead to separate these out.</p>\n\t\t\t<p>I had to fix a number of things, and generalize various code in order to handle different combinations of\n\t\t\t\tthese features.\n\t\t\t\tFor instance, the Dwell Clicker adds a floating button and Quick Undo Button adds a floating button;\n\t\t\t\tpreviously they were always enabled together, but now I have to calculate the width needed for the\n\t\t\t\tcurrently enabled buttons,\n\t\t\t\talso different based on whether they're scaled with Enlarge UI mode,\n\t\t\t\tin order to move the status bar text over,\n\t\t\t\tand the colors box over if Vertical Colors Box is not enabled, which previously it always would be\n\t\t\t\ttogether with those features.</p> -->\n\t\t\t<h2>↩️ Quick Undo Button</h2>\n\t\t\t<p><b>Extras > Quick Undo Button</b> is a huge advancement for usability on touchscreen devices.</p>\n\t\t\t<p>Making mistakes is no more a chore. Just tap, tap, tap to undo. Easy as that.</p>\n\t\t\t<h2>🔍 Enlarge UI</h2>\n\t\t\t<p><b>Extras > Enlarge UI</b> increases the size of menus, buttons, and windows.</p>\n\t\t\t<p>Scaling of toolbars and menus will be limited\n\t\t\t\tto the available space on the screen, making it more useful on mobile devices,\n\t\t\t\tcompared to the basic UI scaling that existed in Eye Gaze Mode.</p>\n\t\t\t<h2>⏱️ Dwell Clicker</h2>\n\t\t\t<p><b>Extras > Dwell Clicker</b> automatically clicks by hovering.</p>\n\t\t\t<p>It's intended for use with an eye tracker or head tracker — software (and optionally\n\t\t\t\tspecialized hardware) that lets you move the mouse without using your hands.</p>\n\t\t\t<p>This was the core feature of Eye Gaze Mode, but it can now be used in any UI configuration: with any\n\t\t\t\ttheme, with or without enlarged UI, with a horizontal or vertical colors box.</p>\n\t\t\t<h2>🧑 Head Tracker (All-New Feature!)</h2>\n\t\t\t<p>\n\t\t\t\t<b>Extras > Head Tracker</b> mode uses your webcam to\n\t\t\t\ttrack your head movements and move the mouse cursor accordingly.\n\t\t\t</p>\n\t\t\t<p>It's powered by\n\t\t\t\t<a href=\"https://trackymouse.js.org\" target=\"_blank\"><img src=\"images/tracky-mouse-16x16.png\"\n\t\t\t\t\t\talt=\"\" />Tracky Mouse</a>.\n\t\t\t</p>\n\t\t\t<p>I recorded a short demonstration video, drawing the Tracky&nbsp;Mouse logo using Tracky&nbsp;Mouse:\n\t\t\t</p>\n\t\t\t<figure>\n\t\t\t\t<video style=\"width: 100%; height: auto;\" controls loop muted playsinline autoplay>\n\t\t\t\t\t<source src=\"images/tracky-mouse-jspaint-demo.mp4\" type=\"video/mp4\">\n\t\t\t\t\tYour browser does not support the video tag.\n\t\t\t\t</video>\n\t\t\t\t<figcaption>\n\t\t\t\t\t<!-- Drawing the Tracky Mouse logo using Tracky Mouse. -->\n\t\t\t\t\tI made sure to tilt the webcam down so you can see that I'm not using my arms.\n\t\t\t\t</figcaption>\n\t\t\t</figure>\n\t\t\t<a href=\"https://trackymouse.js.org\" target=\"_blank\">\n\t\t\t\t<img src=\"lib/tracky-mouse/images/tracky-mouse-logo-512.png\" width=\"128\" height=\"128\"\n\t\t\t\t\talt=\"Tracky Mouse logo\" style=\"float: right\" />\n\t\t\t</a>\n\t\t\t<p>To try it out:</p>\n\t\t\t<ul>\n\t\t\t\t<li>Enable <b>Extras > Head Tracker</b>.</li>\n\t\t\t\t<li>Click <b>Start</b> and allow access to your camera.</li>\n\t\t\t\t<li>Ensure your face is well lit and centered in the camera's view.</li>\n\t\t\t\t<li>Adjust sensitivity and smoothness settings to your liking.</li>\n\t\t\t\t<li>Move your head to move the red dot on the page, which acts as your cursor, and hover over elements\n\t\t\t\t\tto click them.</li>\n\t\t\t</ul>\n\t\t\t<p>Tips:</p>\n\t\t\t<ul>\n\t\t\t\t<li>You can pause dwell clicking by hovering over the pause button\n\t\t\t\t\t(<img alt=\"an eye with three zees\" src=\"images/classic/eye-gaze-pause.svg\"\n\t\t\t\t\t\tstyle=\"vertical-align: middle; width: 1em; height: 1em;\" />)\n\t\t\t\t\tin the bottom left corner.</li>\n\t\t\t\t<li>When hovering over a window title bar, or using certain tools on the canvas,\n\t\t\t\t\tlike the brush, it knows to hold down the mouse button to drag or draw.\n\t\t\t\t\tThe next dwell will release instead of clicking.</li>\n\t\t\t\t<li>If you minimize the Tracky Mouse window, it will minimize to a button in the menu bar,\n\t\t\t\t\twhich you can click to restore the window.\n\t\t\t\t\tIf you close the window, it will disable the feature.</li>\n\t\t\t</ul>\n\t\t\t<p>\n\t\t\t\tRight now this only works with dwell clicking, and automatically enables the Dwell Clicker,\n\t\t\t\tbut in the future, it may work with other ways of clicking, like blinking or smiling.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tYou can also download the\n\t\t\t\t<a href=\"https://trackymouse.js.org\" target=\"_blank\">Tracky Mouse</a>\n\t\t\t\tdesktop app to control your whole computer with your head.\n\t\t\t</p>\n\t\t\t<h2>Discord server</h2>\n\t\t\t<figure>\n\t\t\t\t<a href=\"https://discord.gg/jxQBK3k8tx\" target=\"_blank\">\n\t\t\t\t\t<img width=\"470\" height=\"470\" src=\"https://flipanim.com/gif/b/h/BhZWtwfg.gif\"\n\t\t\t\t\t\talt=\"Animation of Discord logo blinking its eyes\">\n\t\t\t\t</a>\n\t\t\t\t<figcaption>\n\t\t\t\t\tAnimation credit:\n\t\t\t\t\t<a href=\"https://flipanim.com/profile?name=Wolfie-le-Wolf\" target=\"_blank\">Wolfie-le-Wolf</a>\n\t\t\t\t</figcaption>\n\t\t\t</figure>\n\t\t\t<p>Join the new\n\t\t\t\t<a href=\"https://discord.gg/jxQBK3k8tx\" target=\"_blank\">\n\t\t\t\t\t98.JS.org Discord server</a>\n\t\t\t\tto discuss these features and share your JS Paint drawings!\n\t\t\t</p>\n\t\t\t<h2>Improved About window</h2>\n\t\t\t<p>I managed to make the <b>Help > About Paint</b> window much more compact while including more\n\t\t\t\tinformation.</p>\n\t\t\t<p>See a <a href=\"https://github.com/1j01/jspaint/commit/da994966ec2231743867f232d8e1fb334071b512\"\n\t\t\t\t\ttarget=\"_blank\">visual\n\t\t\t\t\tcomparison here</a>.\n\t\t\t\tYou can switch to swipe or onion skin modes and move the slider to compare before and after images.</p>\n\t\t\t<p>Here's what's new:</p>\n\t\t\t<ul>\n\t\t\t\t<li>Reworded everything to be terser, using short labels instead of full sentences.\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/7bc134226f9994cd68fd69d78fb0343f5c873d53\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Replaced <a href=\"https://github.com/1j01/jspaint#readme\" target=\"_blank\">readme</a> link\n\t\t\t\t\twith a link to the <a href=\"https://jspaint.app/about.html\" target=\"_blank\">homepage</a>.\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/7bc134226f9994cd68fd69d78fb0343f5c873d53\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Added a link to the Discord server.\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/7bc134226f9994cd68fd69d78fb0343f5c873d53\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Made sure all links open in a new tab.\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/7bc134226f9994cd68fd69d78fb0343f5c873d53\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Made it use a bigger app icon\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/3dd5ee94ba123a053c7fee64a112914902d825ae\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>);\n\t\t\t\t\talso created a bigger version of the gay pride icon variant for pride month\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/be03638fad35a51cacef5c4f524c81581c2be587\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Added a version number back into the About window\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/224cc37bfa022b912c9b48e70d0e7a412c0f3ec6\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t\tand moved it to a new line\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/aaed9a78945aeec13b15d74dca0502474e268c1e\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Moved the update check status indicator beside the icon\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/c1b407d9134af75533adb3fd3938a82d3a2d71dd\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Fixed centering of the About window on small screens\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/2aa2e66b8ba5927ee833b68480342f1d62477940\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<h2>Misc. Changes</h2>\n\t\t\t<ul>\n\t\t\t\t<li>I updated JS Paint within <a href=\"https://98.js.org/\" target=\"_blank\">98.js.org</a>\n\t\t\t\t\trecently, although it might not have the latest changes yet.\n\t\t\t\t</li>\n\t\t\t\t<li>If an image is dropped on the Project News window, it will no longer try to open it as a document.\n\t\t\t\t\tIt was easy to do this accidentally by idly clicking and dragging while reading the news.\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/77d341378f9a8d84f0f922ab6545e4cab5fca038\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Fixed checkbox menu items showing a grid of small checkmarks instead of a single checkmark\n\t\t\t\t\tin the Electron app with Enlarge UI mode enabled.\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/f367ce043a81c7fdea2c506fcf5aee1ac18b56e3\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>The Dwell Clicker can now toggle collapsed details in error dialogs.\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/2637467762753234af4d40d097af7f1c2b6aea35\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Enabled dragging toolbars with the mouse in Dwell Clicker\n\t\t\t\t\t(but not with dwell clicker itself).\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/7094171b1644391f4ea3b3467865952c39427a4e\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Fixed the titlebar size for tool windows in Enlarge UI mode.\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/a2691ec7c953c3eca7b56f4831c47855044fff6d\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>All themed tool icons now work in Enlarge UI mode.\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/068c61d20c907925a140677eecd5513e03397fbc\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a> +\n\t\t\t\t\t<a href=\"https://github.com/1j01/jspaint/commit/9e6a19c9aa6434a354f067357487946ea92a1670\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a> +\n\t\t\t\t\t<a href=\"https://github.com/1j01/jspaint/commit/8dc1286dd0d4dc219f043b7e2199e47b8cb52f48\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>I've implemented the size status indicator for all tools.\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/3500496b0801a52e05d5ae69f6f98bb09e477e86\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Fixed missing width/height labels in <b>Image > Attributes</b> dialog.\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/af94876a4ffef95c2d00c0022d89a452034793b7\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Fixed default file name when saving a wallpaper with <b>File > Set As Wallpaper\n\t\t\t\t\t\t(Tiled/Centered)</b>.\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/8f89d874a77cc8cf00e4731e3979ceaac070aad7\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Fixed default file name when saving selection with <b>Edit > Copy To</b>,\n\t\t\t\t\tand an error that occurred with <b>Edit > Copy To</b> in the Electron app.\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/fc59a369fd306bedc31611e6729f4fc2ae9e2cc0\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Fixed ignoring of file format choice when saving a palette with <b>Colors > Save Colors</b>\n\t\t\t\t\tin the Electron app\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/2f8f4e7c51a0c1b2d2d26828855d888e8ed641f9\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Fixed error handling for clipboard access\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/193404199b384532a945f382a56fa2deca679950\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Fixed <kbd>Shift+Insert</kbd>, <kbd>Ctrl+Insert</kbd>, and <kbd>Ctrl+Delete</kbd> shortcuts\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/e3ef424d61e0621e36adeeaa37070d07cf7f5d29\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Improved error message dialogs for Imgur upload failures\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/cbfc9cad47b3aa3c6a8acc6ce525b2b426608dca\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Added a <a href=\"https://jspaint.app/privacy\" target=\"_blank\">Privacy Policy</a>\n\t\t\t\t\t(<b>tl;dr</b>: jspaint doesn't try to track you, unlike most of the internet)\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/9d2d4040c0b20532e3819aa662e39b9fd8f3f543\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<h2>Behind-the-Scenes Changes</h2>\n\t\t\t<ul>\n\t\t\t\t<li>Updated <a href=\"https://os-gui.js.org/\" target=\"_blank\">OS-GUI.js</a> from ~0.6.0 to 0.7.3\n\t\t\t\t\t<ul>\n\t\t\t\t\t\t<li>Made use of OS-GUI's new <code>AccessKeys</code> API\n\t\t\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/e6ad042195ce70470f401c400d62575d6c09ea6f\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\">⟜</a>\n\t\t\t\t\t\t\t+\n\t\t\t\t\t\t\t<a href=\"https://github.com/1j01/jspaint/commit/52b7b7632046b578b721a84bf0ceaca6ae3e1a8d\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\">⟜</a>\n\t\t\t\t\t\t\t+\n\t\t\t\t\t\t\t<a href=\"https://github.com/1j01/jspaint/commit/a9fe9d3f8d1d1ff176b7fd91fd9463e66c08cf73\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\tNow using proper <a\n\t\t\t\t\t\t\t\thref=\"https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-keyshortcuts\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"><code>aria-keyshortcuts</code></a>\n\t\t\t\t\t\t\tvalues to tell screen reader software about keyboard shortcuts\n\t\t\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/be233d07e918703b122c415369be5679f588e0c3\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\tDwell Clicker is now powered by Tracky Mouse.\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/1598f42d309ad878b762c5a411476617b16c22f2\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Migrated to ESLint v9 and its flat config, and improved code uniformity.\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/compare/a140810a897afa9dd6111cffb065e5d8f71f1ed8...bddaaffd2837b9696e8e6e159f742b05391067c7\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜⧟...⊸</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Simplified code quality checking workflow by bundling different checks into one script\n\t\t\t\t\t(<code>npm run lint</code>)\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/991b1cceaa12a40701d251f5dcd109d23903e614\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Improved handling of errors with no stack trace, like <code>SyntaxError</code>.\n\t\t\t\t\tIt will now show the URL and line/column numbers for errors with no call stack.\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/dafef7b1b4f2d33c32c434b1e1fe0ffbc271600d\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Fixed an error that occurred when embedded in 98.js.org due to looking for menus\n\t\t\t\t\tinside the app frame when they're actually outside\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/421fad7dc25c4d27caa46535a2641b12e49a9b18\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a> +\n\t\t\t\t\t<a href=\"https://github.com/1j01/jspaint/commit/04804396e187b1bf4af9cc31ca449d18661f97ed\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Marked more parts of the JS Paint <code>systemHooks</code> API as optional\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/2fe8c35ca6500cc32584dae30f8c3d4ffe989aa3\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li>Defined TypeScript types for the JS Paint <code>systemHooks</code> API\n\t\t\t\t\t(<a href=\"https://github.com/1j01/jspaint/commit/cb8bc8893d3c9c049916ac5873a15edc7262ac73\"\n\t\t\t\t\t\ttarget=\"_blank\">⟜</a>)\n\t\t\t\t</li>\n\t\t\t\t<li style=\"color: transparent;\">Worked on secret features which should be really fun in the future.</li>\n\t\t\t</ul>\n\t\t\t<p>\n\t\t\t\tMerry Christmas! 🎄🎁\n\t\t\t</p>\n\t\t</article>\n\t\t<article class=\"news-entry\" id=\"news-2024-bubblegum-theme\">\n\t\t\t<h1>Bubblegum Theme</h1>\n\t\t\t<time datetime=\"2024-04-27\">2024-04-27</time>\n\t\t\t<img width=\"946\" height=\"800\" style=\"max-width: 100%; height: auto; image-rendering: auto;\"\n\t\t\t\talt=\"Screenshot of JS Paint with the Bubblegum theme\"\n\t\t\t\tsrc=\"https://i.postimg.cc/6QwYrWjM/Screen-Shot-2024-04-27-at-14-57-48.png\" />\n\t\t\t<h2>Bubblegum Theme</h2>\n\t\t\t<p>\n\t\t\t\tIntroducing the <b>🫧 Bubblegum</b> theme!\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tOffice software has never looked so refined, as with the Bubblegum theme's elegant\n\t\t\t\t<em><span style=\"\n\t\t\t\t\tfont-family: cursive;\n\t\t\t\t\tfont-style: italic;\n\t\t\t\t\ttransform: skewX(-10deg);\n\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t\t/*background: linear-gradient(to bottom, #a090c6, #efa9d3); background-clip: text; color: transparent;*/\n\t\t\t\t\tcolor: #d39cce;\n\t\t\t\t\ttext-shadow: 0 1px 1px #febee8, 0 -1px 1px #a892c8;\n\t\t\t\t\t\">Business Pink</span>\n\t\t\t\t\tcolor scheme.</em>\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAll the icons in this theme were <strong>AI-generated</strong>, as an experiment.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tCurrent mainstream AI technology really struggles at creating a full set of icons in one go,\n\t\t\t\tand the style is always a little bit different from image to image,\n\t\t\t\tso the process involved generating many, many images,\n\t\t\t\tusually prompting it to create an \"icon set\" in order to <em>hopefully</em> get a few icons that match,\n\t\t\t\tto add to the overall icon set.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tThere's very little control, and things often come out wonky or overly generic,\n\t\t\t\tbut overall it takes very little effort,\n\t\t\t\tso it's a strange thing.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tLuckily, I could get away with some stylistic differences between\n\t\t\t\tthe abstract shape icons and the more detailed tool icons.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tI hand-edited a few of the icons, but they're mostly as they came out of the AI.\n\t\t\t\tMy favorite is the Eye Gaze Mode pause button icon (<img alt=\"an eye\"\n\t\t\t\t\tsrc=\"images/bubblegum/eye-gaze-unpause-128x128.png\"\n\t\t\t\t\tstyle=\"vertical-align: middle; width: 1em; height: 1em;\" />),\n\t\t\t\twhich I got for free randomly due to the AI misinterpreting \"eye dropper\".\n\t\t\t\tI love the way it blends seamlessly into the button.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tThe 3D bevels are also AI-generated, applied with copious usage of 9-slice borders.\n\t\t\t</p>\n\t\t\t<h3>Try The New Theme</h3>\n\t\t\t<p>\n\t\t\t\t<!-- <img src=\"help/onestep.gif\"> -->\n\t\t\t\tOn the <b>Extras</b> menu, click <b>Themes</b>, then <b>Bubblegum</b>.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tThe icons aren't optimized for legibility at small sizes,\n\t\t\t\tso be sure to try it out together with <b>Extras > Eye Gaze Mode</b>,\n\t\t\t\tor else increase your browser's zoom level,\n\t\t\t\tby scrolling the mouse wheel while holding <kbd>Ctrl</kbd> or <kbd>⌘</kbd>,\n\t\t\t\tfor the full effect.\n\t\t\t</p>\n\t\t\t<h2>Maintenance</h2>\n\t\t\t<p>\n\t\t\t\tIn other news, I've been investing a lot into making JS Paint more maintainable.\n\t\t\t<p>\n\t\t\t\tYou won't see these changes in the app directly,\n\t\t\t\tbut they help make the code more <em>malleable</em>,\n\t\t\t\tlike adding water to clay to shape it without breaking it.\n\t\t\t</p>\n\t\t\t<ul>\n\t\t\t\t<li>\n\t\t\t\t\tConverted the codebase almost entirely to <strong>ES Modules</strong>.\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\tMade remaining usage of <strong>global variables explicit</strong> in each file.\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\tSplit up some huge files into <strong>smaller files</strong>.\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\tAdded <strong>type annotations</strong> to the codebase, using JSDoc comments.\n\t\t\t\t\tThis way errors can be spotted earlier, and editors can provide better autocompletion,\n\t\t\t\t\tall while keeping the code in plain JavaScript, with no compile step.\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<p>\n\t\t\t\tThese changes will make it easier to add cool new features to JS Paint in the future.\n\t\t\t</p>\n\t\t\t<!-- \n\t\t\t(It's \"JS Paint\", not \"TS Paint\", after all!)\n\t\t\t<p>\n\t\t\t\tP.S. <strong>Fun fact</strong>: ECMAScript (ES) is a synonym for JavaScript (JS),\n\t\t\t\twhich is a completely different language from Java.\n\t\t\t\tThe more you know!\n\t\t\t\tAlso, TypeScript (TS) is a superset of JavaScript, and the TypeScript compiler (tsc)\n\t\t\t\tcan be used to check JavaScript code for type errors, not just compile TypeScript code.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t(It's not \"ES Paint\", but it <em>could have been</em>,\n\t\t\t\tand then I could have designed a logo with a rotated 'M' to make it an 'E'.\n\t\t\t\tMissed opportunity?? 🤔)\n\t\t\t</p> -->\n\t\t</article>\n\t\t<article class=\"news-entry\" id=\"news-2024-themes-and-save-formats\">\n\t\t\t<h1>Themes and File Formats</h1>\n\t\t\t<time datetime=\"2024-02-22\">2024-02-22</time>\n\t\t\t<!-- Oops, forgot an image. TODO? -->\n\t\t\t<!-- <img width=\"\" height=\"\" style=\"max-width: 100%; height: auto; image-rendering: auto;\" alt=\"\" src=\"\" /> -->\n\t\t\t<h2>New and Updated Themes</h2>\n\t\t\t<p>\n\t\t\t\tThe Modern theme has been renamed <b>Modern Light</b> and a new <b>Modern Dark</b> theme has been added.\n\t\t\t</p>\n\t\t\t<div\n\t\t\t\tstyle=\"background: #c0c0c0; padding: 1em; padding-bottom: 0.1em; border-radius: .5em; border: 1px inset;\">\n\t\t\t\tModern Light before (tool icons from Windows Vista):<br>\n\t\t\t\t<img alt=\"\"\n\t\t\t\t\tsrc=\"https://github.com/1j01/jspaint/blob/master/images/modern/vista-tools-spaced-like-svg.png?raw=true\">\n\t\t\t\t<div style=\"line-height:50%;\"><br></div>\n\t\t\t\tModern Light after (custom SVG icons):<br>\n\t\t\t\t<!-- TODO: custom pixel-fine-tuned PNG; SVG is designed to align with the pixel grid but it's not perfect -->\n\t\t\t\t<!-- <img alt=\"\" src=\"images/modern/modern-light-tools.png\"> -->\n\t\t\t\t<img alt=\"\"\n\t\t\t\t\tsrc=\"https://github.com/1j01/jspaint/blob/master/images/modern/modern-light-tools.svg?raw=true\">\n\t\t\t</div>\n\t\t\t<p>\n\t\t\t\tI designed a custom icon set, inspired by Windows Vista's icons.\n\n\t\t\t\tI also customized the icons significantly for the Modern Dark theme,\n\t\t\t\tto improve the contrast across the board.\n\t\t\t</p>\n\t\t\t<div\n\t\t\t\tstyle=\"background: #222222; color: #aaaaaa; padding: 1em; padding-bottom: 0.1em; border-radius: .5em; border: 1px inset;\">\n\t\t\t\tModern Dark before (tool icons from Windows Vista, with aliasing artifacts when viewed against a dark\n\t\t\t\tbackground):<br>\n\t\t\t\t<img alt=\"\"\n\t\t\t\t\tsrc=\"https://github.com/1j01/jspaint/blob/master/images/modern/vista-tools-spaced-like-svg.png?raw=true\">\n\t\t\t\t<div style=\"line-height:50%;\"><br></div>\n\t\t\t\tModern Dark after (custom SVG icons):<br>\n\t\t\t\t<!-- <img alt=\"\" src=\"images/modern/modern-dark-tools.png\"> -->\n\t\t\t\t<!-- To be consistent, use SVG here too. At least you can zoom in and see the scalability. -->\n\t\t\t\t<!-- Though I'd prefer a nice magnifier effect like https://lenadesign.org/2021/06/30/css-javascript-image-magnifier-glass/ -->\n\t\t\t\t<!-- Onion skin / swipe would be nice for comparison as well. -->\n\t\t\t\t<img alt=\"\"\n\t\t\t\t\tsrc=\"https://github.com/1j01/jspaint/blob/03f934eab98f450d3e527ef8e152cc5aa003fe07/images/modern/modern-dark-tools.svg?raw=true\">\n\t\t\t</div>\n\t\t\t<p>\n\t\t\t\tWhen adapting the Vista icons to scalable vector graphics,\n\t\t\t\tI had to make lots of subtle design decisions, but the biggest difference you'll notice is that\n\t\t\t\tthe Brush tool matches the Classic style of a flat tipped brush (albeit with added gradients),\n\t\t\t\tsince I really didn't like the Vista Brush tool icon.\n\t\t\t\tI mean come on, it's the only icon that's <em>cut off, by design!</em>\n\t\t\t\tAnd it just looks like a blob to me, at least the purple version. (There's also a green version.)\n\t\t\t\tBesides, a wide brush emphasizes the distinction from the Pencil tool.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tThe Classic theme has been renamed <b>Classic Light</b>, and the <b>Classic Dark</b> theme has been\n\t\t\t\tupdated.\n\t\t\t</p>\n\t\t\t<div style=\"background: #c0c0c0; padding: 1em; border-radius: .5em; border: 1px inset;\">\n\t\t\t\tClassic Light (still using tool icons from Windows 98):<br>\n\t\t\t\t<img alt=\"\"\n\t\t\t\t\tsrc=\"https://github.com/1j01/jspaint/blob/03f934eab98f450d3e527ef8e152cc5aa003fe07/images/classic/tools.png?raw=true\">\n\t\t\t</div>\n\t\t\t<div style=\"background: #222222; color: #aaaaaa; padding: 1em; border-radius: .5em; border: 1px inset;\">\n\t\t\t\tClassic Dark before:<br>\n\t\t\t\t<img alt=\"\"\n\t\t\t\t\tsrc=\"https://github.com/1j01/jspaint/blob/43d68cf8eee4cf8aa30e3047955c2bb8315c92f2/images/dark/tools.png?raw=true\">\n\t\t\t\t<div style=\"line-height:50%;\"><br></div>\n\t\t\t\tClassic Dark after:<br>\n\t\t\t\t<img alt=\"\"\n\t\t\t\t\tsrc=\"https://github.com/1j01/jspaint/blob/03f934eab98f450d3e527ef8e152cc5aa003fe07/images/dark/tools.png?raw=true\">\n\t\t\t</div>\n\t\t\t<p>\n\t\t\t\tI wasn't happy with the Classic Dark theme's icons, especially my use of color;\n\t\t\t\tit felt like a cheap RGB color inversion, even though I'm sure I gave it some more thought than that.\n\t\t\t\tI also wasn't sure how to achieve good contrast with the pencil tip while maintaining a consistent\n\t\t\t\tskeuomorphic style, since graphite is dark just like the background.\n\t\t\t\tSo I've redesigned the pencil in a more abstract way (all white including the tip),\n\t\t\t\tand I've made the icons monochrome.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tI'm actually a big fan of color in icons, as I think it helps to distinguish them,\n\t\t\t\tso if anyone wants to try their hand at a Classic Dark theme with colored icons,\n\t\t\t\tI'd be interested to see it!\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tThat said, monochrome has a nice elegance to it; it's less attention grabbing,\n\t\t\t\tand I'm sure some people will always prefer it.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tI also updated the <b>Occult</b> theme.\n\t\t\t\tI changed the Fill With Color tool into a pouring cauldron, the Pick Color tool into a dagger,\n\t\t\t\tand the Magnifier into an eyeball.\n\t\t\t</p>\n\t\t\t<div style=\"background: #660c08; color: #aaaaaa; padding: 1em; border-radius: .5em; border: 1px inset;\">\n\t\t\t\tOccult before:<br>\n\t\t\t\t<img alt=\"\"\n\t\t\t\t\tsrc=\"https://github.com/1j01/jspaint/blob/43d68cf8eee4cf8aa30e3047955c2bb8315c92f2/images/occult/tools.png?raw=true\">\n\t\t\t\t<div style=\"line-height:50%;\"><br></div>\n\t\t\t\tOccult after:<br>\n\t\t\t\t<img alt=\"\"\n\t\t\t\t\tsrc=\"https://github.com/1j01/jspaint/blob/03f934eab98f450d3e527ef8e152cc5aa003fe07/images/occult/tools.png?raw=true\">\n\t\t\t\t<div style=\"line-height:50%;\"><br></div>\n\t\t\t\t(Still needs more ideas.)\n\t\t\t</div>\n\t\t\t<p>\n\t\t\t\tCheck out the themes in <b>Extras > Themes</b>!\n\t\t\t</p>\n\t\t\t<h2>File Formats</h2>\n\t\t\t<aside\n\t\t\t\tstyle=\"background-color: #ffffbb; padding: .5em 1em; border-radius: .5em; border: 1px outset; font-size: smaller\">\n\t\t\t\t<p>\n\t\t\t\t\tThese changes have actually been around since 2021,\n\t\t\t\t\tbut I didn't get around to finishing a news post about them until now.\n\t\t\t\t</p>\n\t\t\t\t<p>\n\t\t\t\t\tStill, there's some good changes here, so it bears mentioning!\n\t\t\t\t</p>\n\t\t\t</aside>\n\t\t\t<!-- I disabled this feature for now, as I saw some 0 bytes files saved, and I REALLY don't want people to lose work!\n\t\t\tIt needs thorough testing / gradual rollout.\n\t\t\tBesides that, I didn't want to promote another feature available only in Chrome.\n\t\t\t<p>\n\t\t\t\t<b>Save</b> (<kbd>Ctrl+S</kbd>) can now save over the open file, in Chrome, Edge, and Opera browsers.\n\t\t\t\tThis works using new <a target=\"_blank\"\n\t\t\t\t\thref=\"https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API\">File System Access\n\t\t\t\t\tAPI</a>.\n\t\t\t\tAlways use <b>Save As</b> (<kbd>Ctrl+Shift+S</kbd>) if you want to save a new file.\n\t\t\t</p> -->\n\t\t\t<p>\n\t\t\t\t<img alt=\"\" src=\"images/save.gif\" width=\"50\" height=\"50\" style=\"float: right;\" />\n\t\t\t\t<b>File > Save As</b> now asks for a file name and format.\n\t\t\t\tPNG, GIF, and BMP are supported, including indexed color BMPs.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tSee the <a href=\"https://github.com/1j01/jspaint?tab=readme-ov-file#supported-file-formats\"\n\t\t\t\t\ttarget=\"_blank\">Supported File Formats</a> table for details.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<img alt=\"\" src=\"images/idea.gif\" width=\"33\" height=\"26\" style=\"float: left;\" />\n\t\t\t\tTip: Use PNG if you don't have a specific reason to use another format,\n\t\t\t\tas it has the best quality when saving.\n\t\t\t</p>\n\t\t\t<!-- I disabled this for now, I think because it's unclear if you'd always want to load the palette when opening an image,\n\t\t\tor if there should be some UI around it, like an undo button beside the palette, or a prompt to load the palette.\n\t\t\tAlso indexed PNGs should be handled consistently with indexed BMPs.\n\t\t\tThe thing is, if you save an image with a subset of colors from a palette, and then load the image,\n\t\t\tyou might not want to load the palette, as it may simply remove colors from the palette,\n\t\t\tparticularly if it was the default palette.\n\t\t\tBut a prompt seems annoying. Maybe it should only load the palette for monochrome (two-color) images?\n\t\t\tIt's unclear.\n\t\t\t<p>\n\t\t\t\tIf you open a BMP file with a palette, the palette is loaded into the Colors box.\n\t\t\t\tIf you load a monochrome BMP file, it loads a gradient of dither patterns into the Colors box.\n\t\t\t</p>-->\n\t\t\t<p>\n\t\t\t\t<!-- <img alt=\"\" src=\"help/p_monochrome.png\" width=\"14\" height=\"11\" style=\"vertical-align: middle;\" /> -->\n\t\t\t\t<b>Black and White</b> mode in <b>Image > Attributes</b> is generalized to handle two arbitrary colors\n\t\t\t\t(although it's still called \"Black and White\" in the Attributes window.)\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tIf an image has only two colors, when switching to \"Black and White\" mode,\n\t\t\t\tit automatically adapts to these colors and fills the Colors box with appropriate dither patterns.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tIf you use <b>Image > Invert</b> in Black and White mode,\n\t\t\t\tit now swaps the two colors present in the image,\n\t\t\t\tinstead of converting colors to their RGB opposites.\n\t\t\t\tIf the image is pure black and white, these two operations are equivalent,\n\t\t\t\tbut now, for example, a <i>green-and-black</i> image will become a <i>black-and-green</i> image,\n\t\t\t\trather than <i>pink-and-white</i>.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<b>Colors > Save Colors</b> also now asks for a file name and format.\n\t\t\t\tAn absurd number of file formats are <a\n\t\t\t\t\thref=\"https://github.com/1j01/jspaint?tab=readme-ov-file#color-palette-formats\"\n\t\t\t\t\ttarget=\"_blank\">supported</a>.\n\t\t\t\tYou can even export CSS variables for use in a web design project.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<img alt=\"\" src=\"images/idea.gif\" width=\"33\" height=\"26\" style=\"float: left;\" />\n\t\t\t\tRIFF Palette (*.pal) is compatible with MS Paint, and GIMP Palette (*.gpl) is compatible with many open\n\t\t\t\tsource graphics programs such as Inkscape and Krita.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tYou can find lots of palettes to use on\n\t\t\t\t<a target=\"_blank\" href=\"https://lospec.com/palette-list\">Lospec</a>.\n\t\t\t\tDownload a palette as GIMP GPL and use <b>Colors > Get Colors</b> to select\n\t\t\t\tthe file, or drag and drop the file onto JS Paint to load the palette.\n\t\t\t</p>\n\t\t\t<h2>API</h2>\n\t\t\t<p>\n\t\t\t\tI also documented a first version of the API for JS Paint.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tI have not yet put much design into the API; rather, I have just documented the interface I came up with\n\t\t\t\tfor my own use in <a href=\"https://98.js.org\" target=\"_blank\">98.js.org</a>.\n\t\t\t\tIn other words, this is more of a draft of an API, though I will certainly create a changelog\n\t\t\t\twhen I decide to clean it up.\n\t\t\t\tSo feel free to start using it if you don't mind updating your code as the API changes.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tIf you want to embed JS Paint in your own project, you can take a look at the\n\t\t\t\t<a href=\"https://github.com/1j01/jspaint?tab=readme-ov-file#embed-in-your-website\" target=\"_blank\">\n\t\t\t\t\tEmbed in your website</a> section of the readme.\n\t\t\t\t<!-- Hm, I might want to move that to a separate markdown file... but maybe keep that heading around so the link stays valid. -->\n\t\t\t</p>\n\t\t\t<h2>Homepage</h2>\n\t\t\t<p>\n\t\t\t\tJS Paint now has a homepage at <a href=\"https://jspaint.app/about\"\n\t\t\t\t\ttarget=\"_blank\">jspaint.app/about</a>.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tI designed it like a 90s website.\n\t\t\t\tYou know, one of those thoughtless background pattern filled ones.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<a href=\"https://jspaint.app/about\" target=\"_blank\">\n\t\t\t\t\t<img src=\"images/enter.gif\" alt=\"Click to Enter\" width=\"145\" height=\"77\" />\n\t\t\t\t</a>\n\t\t\t</p>\n\t\t</article>\n\t\t<article class=\"news-entry\" id=\"news-2022-open-source\">\n\t\t\t<h1>Open Source</h1>\n\t\t\t<time datetime=\"2022-07-28\">2022-07-28</time>\n\t\t\t<!-- <img width=\"\" height=\"\" style=\"max-width: 100%; height: auto; image-rendering: auto;\" alt=\"\" src=\"\" /> -->\n\t\t\t<p>\n\t\t\t\tJS Paint is now finally open source, licensed under the\n\t\t\t\t<a href=\"https://github.com/1j01/jspaint/blob/master/LICENSE.txt\" target=\"_blank\">MIT License</a>.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tThe project has been\n\t\t\t\t<a href=\"https://en.wikipedia.org/wiki/Source-available_software\" target=\"_blank\">source-available</a>\n\t\t\t\tfrom the beginning, since I never felt the need to obfuscate or hide the code,\n\t\t\t\tbut it is now legally open source.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tI look forward to seeing how you use JS Paint in your own projects!\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tThere is not yet a formal API for JS Paint,\n\t\t\t\tbut if you want to get in on the cutting edge,\n\t\t\t\tyou can take a look at how <a href=\"https://98.js.org\" target=\"_blank\">98.js.org</a>\n\t\t\t\tembeds JS Paint.\n\t\t\t\tExpect the API to change significantly in the future.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tI've been meaning to open source JS Paint for a long time.\n\t\t\t\tThere are some legal issues, resources I don't have the copyright to,\n\t\t\t\tbut I think they should generally fall under fair use.\n\t\t\t\tAnd I have created beautiful SVG versions of the icons,\n\t\t\t\tso it's likely possible to have a version of JS Paint without any directly copyrighted resources.\n\t\t\t\tBut I've finally decided to stop worrying about it,\n\t\t\t\tand just open source it already!\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tI hope you enjoy JS Paint!\n\t\t\t</p>\n\t\t</article>\n\t\t<article class=\"news-entry\" id=\"news-2021-saving\">\n\t\t\t<h1>The GUIcci Update</h1>\n\t\t\t<time datetime=\"2021-12-08\">2021-12-08</time>\n\t\t\t<img width=\"640\" height=\"360\" style=\"max-width: 100%; height: auto; image-rendering: auto;\" alt=\"\"\n\t\t\t\tsrc=\"https://i.postimg.cc/tgBncKfJ/guicii-update.png\" />\n\t\t\t<h2>New Features</h2>\n\t\t\t<p>\n\t\t\t\t<b>View > Zoom > Show Thumbnail</b> to show a preview of the image at a small size, great for pixel art.\n\t\t\t\tMake fine, precise edits, while keeping it all in perspective.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<b>Pinch zooming:</b> If you have a touch screen, use two fingers to zoom in and out, and pan the view.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<b>Alt+Mousewheel</b> to zoom in and out quickly on desktop.\n\t\t\t\tUnlike the Magnifier tool, this allows you to zoom while making (or moving) a selection, for added\n\t\t\t\tprecision.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAdded <b>View > Fullscreen</b> to toggle fullscreen mode. This is nice for using JS Paint on your phone.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tThe <b>Text tool</b> now automatically expands the textbox as you type.\n\t\t\t\tWhen resizing, there's now a minimum size based on the text in the textbox.\n\t\t\t\tIt previews exactly what size it will end up with when resizing.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<b>Docking:</b> If you drag the Colors box or Tools box out into a window,\n\t\t\t\tyou can now dock it back when dragging the titlebar.\n\t\t\t\tPreviously to dock it you had to double click the titlebar, or drag it by the edge of the window.\n\t\t\t</p>\n\t\t\t<img alt=\"Area that you have to click to drag a toolbar out into a window (in green)\"\n\t\t\t\tsrc=\"https://i.postimg.cc/7LB18Gcg/toolbar-drag-out-area.png\" width=\"480\" height=\"380\"\n\t\t\t\tstyle=\"max-width: 100%; height: auto; image-rendering: auto;\" />\n\t\t\t<p>\n\t\t\t\t<b>Menus</b> are now fully keyboard (and screen reader) accessible.\n\t\t\t\tIn particular, you can hold <kbd>Alt</kbd> and press the access key of a menu button to open the menu,\n\t\t\t\tand then (without <kbd>Alt</kbd>) press the access key of a menu item to select it.\n\t\t\t\tThe access key of an item is the underlined letter, or the first letter of the item's text if there's no\n\t\t\t\tunderline.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<b>Error details</b> are now hidden by default in error dialogs.\n\t\t\t\tThe details may be more overwhelming than useful in a lot of cases,\n\t\t\t\tbut if you need them, you can expand the details.\n\t\t\t</p>\n\t\t\t<img alt=\"Example error message box saying 'File not found', with details collapsed.\"\n\t\t\t\tsrc=\"https://i.postimg.cc/ZR1qpVGw/file-not-found.png\" width=\"408\" height=\"145\"\n\t\t\t\tstyle=\"max-width: 100%; height: auto; image-rendering: auto;\">\n\t\t\t<p>\n\t\t\t\t<b>File > Exit</b> now exits to the official web desktop,\n\t\t\t\t<a target=\"_blank\" href=\"https://98.js.org\"><img\n\t\t\t\t\t\tsrc=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABKklEQVR42qWTMW7DMAxFKYC+RC/hQR065xSdOyRDr9CxV8gQDzlK5g7RkLmn6CwCCimSchIoWkrAgESTj5+kHeCfFnpORCyPPiLqxgYP9gC/ZyKYEIG+CPAbn0JCr6okizmgvmdIF8BZxUhNgVdv8k3FvCdIu/u228VBnkiUGTZBzgyb1CcASBqdlhAMUEx6aAokWc8KqGCGzB+0lmMTyI0cBUmSV28zMRXzT4bECiI/l+NUZ/J0Cz0TACx6Tiwej9jfQkvIufZ8eVM1tM+1uiTHyP5P7H9IccvtxGCVSg0W6ZDUdz6cYbe8DgAHKKf3P9j8bnhQ0rSJY0DcOm2gwCFSugKqozT51V704xoDQItFWMeTFp+ZbQEGtm4o3/hsoLa1IaC3ocf/4QotsZxI//135gAAAABJRU5ErkJggg==\"\n\t\t\t\t\t\twidth=\"16\" height=\"16\" alt=\"\"> 98.js.org</a>,\n\t\t\t\ta re-creation of Windows 98, full of games and applications.\n\t\t\t</p>\n\t\t\t<img class=\"inset-deep\" src=\"https://i.postimg.cc/SKHrYpx3/98-js-org-screenshot.png\"\n\t\t\t\talt=\"The 98.js desktop featuring desktop icons, a taskbar, and various application windows.\"\n\t\t\t\tstyle=\"max-width: 100%; height: auto; image-rendering: auto;\">\n\t\t\t<p>\n\t\t\t\tThis project spun out of JS Paint, and I have implemented now\n\t\t\t\tSound Recorder, Notepad, Calculator, and even Windows Explorer,\n\t\t\t\tto a high level of detail.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tIt also includes projects from other people, other recreations of old programs,\n\t\t\t\tlike <a target=\"_blank\" href=\"https://webamp.org/\">Webamp</a>,\n\t\t\t\ta meticulous recreation of Winamp,\n\t\t\t\tand <a target=\"_blank\" href=\"https://github.com/rjanjic/js-solitaire\">JS Solitaire</a>,\n\t\t\t\ta Solitaire clone (I tweaked it for accuracy, adding the card back images, etc.)\n\t\t\t</p>\n\t\t\t<h2>Pixel Perfect</h2>\n\t\t\t<p>\n\t\t\t\tAll interface elements are now thematically styled,\n\t\t\t\tpowered by <a target=\"_blank\" href=\"https://os-gui.js.org\">OS-GUI.js</a> and\n\t\t\t\t<a target=\"_blank\" href=\"https://jdan.github.io/98.css/\">98.css</a>.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tThe whole interface is now pixel perfect accurate to Windows 98.\n\n\t\t\t\t(Okay, there's a few things that are a pixel off or so, but seriously,\n\t\t\t\tI lined up a screenshot and got it essentially perfect.)\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tImproved layout of <b>View > Zoom > Custom Zoom</b> window, matching the design in MS Paint.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAdded padding to all dialogs so they don't feel cramped anymore.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tMessage boxes now include warning or error icons, and play a sound when they appear.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tImproved <b>View > View Bitmap</b>: it now uses the theme's wallpaper background color,\n\t\t\t\tif the image is smaller than the window.\n\t\t\t\tIt now closes with a click or key press, and doesn't let you edit the image (which was weird).\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tThe Help window can now be minimized to the bottom of the screen, even though there's no taskbar.\n\t\t\t\tIt works like how Windows 98 does if the process managing the taskbar crashes.\n\t\t\t</p>\n\t\t\t<h2>Fixes</h2>\n\t\t\t<p>\n\t\t\t\t<b>Menu buttons</b> are easier to open on a touch screen. Sometimes you had to tap twice before the menu\n\t\t\t\topened.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tFixed <b>large square brush</b> continuity (it left gaps before, due to a half-implemented\n\t\t\t\toptimization).\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tThe <b>selection and textboxes</b> no longer \"blow up\" if you resize them to a minimal size.\n\t\t\t\tThey are now limited when you drag an edge past the opposite edge.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tFixed a bug where vertically thin selections were difficult or impossible to drag (despite showing a\n\t\t\t\tdrag cursor).\n\t\t\t\t(The draggable region was offset outside of the selection box.)\n\t\t\t\tFixed a similar bug where tool previews would get offset if the canvas's height was very small.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tResize handles no longer get smaller when the object to resize is very small.\n\t\t\t\tThe draggable region for handles no longer gets smaller either, except in dimensions where it must.\n\t\t\t\tIt's now considerably smarter than Windows 10 about where it lets you drag handles from.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tIn <b>Image > Flip/Rotate</b>, you can now click the custom degrees input field before selecting the\n\t\t\t\t\"Rotate by angle\" option.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tThe magnifier preview and other tool previews are now hidden while dragging the Colors box or Tools box.\n\t\t\t\tIt looked confusing when the magnifier preview was shown at the same time as\n\t\t\t\tthe preview outline for dragging/docking a tool window.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tFor languages that read <b>right-to-left</b>, the History view (<b>Edit > History</b>) now uses a\n\t\t\t\tright-to-left layout,\n\t\t\t\tand the color box and tool box no longer flip their layout when dragging them into a window or docking\n\t\t\t\tthem back to a side of the application.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tThe history view and error messages use <b>more localized text</b>.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tFixed <b>cut off icons</b> in buttons in the help window toolbar in the Modern theme.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAll windows now have a default-focused control, and the last focused control in the window is remembered\n\t\t\t\tfor when you refocus the window.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<b>File > New</b> and <b>File > Open</b> now create a new autosave session,\n\t\t\t\tinstead of using the current session.\n\t\t\t</p>\n\t\t\t<h2>Winter Theme</h2>\n\t\t\t<p>\n\t\t\t\tUpdated the Winter theme with advent calendar-style tool buttons,\n\t\t\t\tthat reveal (improved) holiday pixel art for each tool when you select them.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tThis means that the Winter theme is more usable,\n\t\t\t\tsince it doesn't obscure the functions of all the tools with pixel art.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAlso, if it doesn't feel quite enough like an advent calendar for you,\n\t\t\t\tyou can hold <kbd>Shift</kbd> to select multiple tools at once.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tPerhaps you could make a drawing using only one tool for the 16 days leading up to Christmas,\n\t\t\t\twith exceptions for the Pick Color and Magnifier tools, of course.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tSnowflakes in the menus indicate what letter you can press to select that item.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTo disable the Winter theme, click the Grinch at the bottom of the screen,\n\t\t\t\twho will then smile a nasty smile and steal Christmas from you.\n\t\t\t\tYou can get it back with <b>Extras > Theme > Winter</b>.\n\t\t\t</p>\n\t\t\t<img class=\"inset-deep\" alt=\"Winter theme screenshot with candy canes and a text box saying Enjoy!\"\n\t\t\t\tsrc=\"https://i.postimg.cc/SxFtjy8z/winter-theme-enjoy.png\" width=\"440\" height=\"380\"\n\t\t\t\tstyle=\"max-width: 100%; height: auto; image-rendering: auto;\" />\n\t\t</article>\n\t\t<article class=\"news-entry\" id=\"news-2020-accessibility-update\">\n\t\t\t<h1>The Accessibility Update</h1>\n\t\t\t<time datetime=\"2020-12-20\">2020-12-20</time>\n\t\t\t<img width=\"965\" height=\"399\" style=\"max-width: 100%; height: auto; image-rendering: auto;\"\n\t\t\t\talt=\"Hello in several languages, eye gaze guiding a cursor, and a sea lion barking into a microphone.\"\n\t\t\t\tsrc=\"https://i.postimg.cc/j29yrZbm/untitled-23.png\" />\n\t\t\t<h2>Multi-Lingual Support</h2>\n\t\t\t<p>JS Paint is now largely localized into 26 languages.</p>\n\t\t\t<p>\n\t\t\t\tHow am I releasing so many languages at the initial release of multi-lingual support, you may ask?\n\t\t\t\tWell, this project has the somewhat unique opportunity to reuse localizations from an existing program,\n\t\t\t\tsince it's primarily a remake of MS Paint.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tI downloaded and installed <a target=\"_blank\" href=\"https://postimg.cc/4Y1V24wN\">26 versions of Windows\n\t\t\t\t\t98 in virtual machines</a>,\n\t\t\t\tand extracted text from mspaint.exe in each one of them,\n\t\t\t\tusing a set of scripts that I wrote to to help me automate the process.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tTo change the language, go to <b>Extras > Language</b>.\n\t\t\t\tYour preferred language may already be detected, if specified in system or browser settings.\n\t\t\t</p>\n\t\t\t<img width=\"1280\" height=\"720\" style=\"max-width: 100%; height: auto; image-rendering: auto;\"\n\t\t\t\talt=\"26 languages, right off the bat!\" src=\"https://i.postimg.cc/G2bH92fp/language-menu.png\" />\n\t\t\t<p>For Arabic and Hebrew, right-to-left layout is supported!</p>\n\t\t\t<p>I tried my hand at some Arabic calligraphy...</p>\n\t\t\t<img width=\"1141\" height=\"800\" style=\"max-width: 100%; height: auto; image-rendering: auto;\"\n\t\t\t\talt=\"Calligraphy where the shapes of the tools in Paint make up Arabic words for them.\"\n\t\t\t\tsrc=\"https://i.postimg.cc/NFX2TTp1/untitled-45.png\" />\n\t\t\t<p>\n\t\t\t\tIf you want to contribute translations, <a target=\"_blank\"\n\t\t\t\t\thref=\"https://github.com/1j01/jspaint/issues/80\">get in touch!</a>\n\t\t\t\tI need to do some technical work to set up for community translations on a public platform,\n\t\t\t\tbut I'm glad people have already expressed interest in helping translate!\n\t\t\t\t(I also want to simplify the language in various parts of the UI before asking people to translate\n\t\t\t\tthem.)\n\t\t\t</p>\n\t\t\t<h2>Eye Gaze Mode</h2>\n\t\t\t<img width=\"511\" height=\"360\" style=\"max-width: 100%; height: auto; image-rendering: auto;\"\n\t\t\t\talt=\"You can use eye gaze or head movements to control the cursor.\"\n\t\t\t\tsrc=\"https://i.postimg.cc/2yC137gc/20.png\" />\n\t\t\t<p>Eye Gaze Mode lets you control JS Paint without using your hands.</p>\n\t\t\t<p>It's intended for use with an eye tracker, head tracker, or other coarse input scenario.</p>\n\t\t\t<p>You don't need a thousand-dollar eye tracker device to play around with this, just a webcam and some free\n\t\t\t\tsoftware.</p>\n\t\t\t<p>\n\t\t\t\tI recommend <a target=\"_blank\" href=\"https://eviacam.crea-si.com/\">Enable Viacam</a>, which is\n\t\t\t\t<em>not</em> an eye gaze tracker,\n\t\t\t\tbut rather a general video movement tracker that you can set up to track your head movement (or your\n\t\t\t\ttorso or hand or anything else).\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tEye tracking via a webcam has a ways to go, but it's also pretty amazing in its own right.\n\t\t\t\tTry <a target=\"_blank\" href=\"https://sourceforge.net/projects/gazepointer/\">GazePointer</a>.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tEye gaze tracking requires significant calibration, and if the calibration is off,\n\t\t\t\tit's hard to use because you can't look where you want to look to interact with things.\n\t\t\t\tThis is why I recommend head tracking (if that's an option for you),\n\t\t\t\tbecause then you can freely look around, and control the cursor <em>independently</em>,\n\t\t\t\tso if it gets offset, you can just tilt your head a bit.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tEye Gaze Mode is built mainly for people with movement disabilities like ALS or Cerebral Palsy,\n\t\t\t\tbut it can also just be a sort of magical experience.\n\t\t\t\tIt can also be frustrating, and takes some practice to master.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tA good place to start is coloring line art using just the Fill tool (<img src=\"help/p_paint.gif\"\n\t\t\t\t\twidth=\"15\" height=\"11\" alt=\"\">):\n\t\t\t</p>\n\t\t\t<ul>\n\t\t\t\t<li>\n\t\t\t\t\t<a target=\"_blank\"\n\t\t\t\t\t\thref=\"https://duckduckgo.com/?t=canonical&q=coloring+pages&atb=v232-1&iax=images&ia=images\">Find\n\t\t\t\t\t\tcoloring pages online</a>,\n\t\t\t\t\tand copy and paste them into JS Paint.\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\tYou can convert them to black and white in <b>Image > Attributes</b>, and then switch back to\n\t\t\t\t\tColors.\n\t\t\t\t\t(This makes it work better with the Fill tool.)\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\tEnable Eye Gaze Mode with <b>Extras > Eye Gaze Mode</b> and note that it will start clicking where\n\t\t\t\t\tyou hover.\n\t\t\t\t\tYou can disable this dwell clicking with the eye icon in the bottom of the screen.\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\tMake the image fill the screen with <b>View > Zoom > Zoom To Window</b>.\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<p>\n\t\t\t\t<span class=\"new\">Bonus:</span> Since I implemented a vertical color box for Eye Gaze Mode,\n\t\t\t\tI decided to make this available as a separate option. Access with <b>Extras > Vertical Color Box</b>.\n\t\t\t</p>\n\t\t\t<h2>Speech Recognition</h2>\n\t\t\t<img width=\"549\" height=\"275\" style=\"max-width: 100%; height: auto; image-rendering: auto;\"\n\t\t\t\talt=\"The sea lion says &quot;Art! Art! Art!&quot; into a microphone.\"\n\t\t\t\tsrc=\"https://i.postimg.cc/BnQ8cpY2/Art-Art-Art.png\" />\n\t\t\t<p>\n\t\t\t\tUsing only your voice, you can switch tools and colors, pan the view, click on buttons on the screen by\n\t\t\t\tname, and use most menu items.\n\t\t\t\tYou can even say \"draw a cat in a party hat\" to have JS Paint try to sketch a cat in a party hat.\n\t\t\t</p>\n\t\t\t<p>This feature pairs well with Eye Gaze Mode for a more complete hands free experience.</p>\n\t\t\t<p>\n\t\t\t\tThe feature is only available on Chrome, and only understands English.\n\t\t\t\tNote that Chrome sends your voice to Google servers.\n\t\t\t</p>\n\t\t\t<p>Access with <b>Extras > Speech Recognition</b>. If this option is grayed out, your browser is not\n\t\t\t\tsupported.</p>\n\t\t\t<p>JS Paint will show what it thinks you said in the status bar at the bottom of the screen.</p>\n\t\t\t<p>\n\t\t\t\tThere are many synonyms for commands, and often you can do things with very short phrases like \"Curve\"\n\t\t\t\tto switch to the Curve tool.\n\t\t\t\tIf it's not recognizing your voice for short commands like \"Curve\" or \"Cut\", you may want to try longer\n\t\t\t\tphrases like \"Curve tool\" or \"Cut selection\",\n\t\t\t\tas this helps it distinguish the sound as speech, rather than a cough for instance.\n\t\t\t</p>\n\t\t\t<h2>Edit Colors Dialog</h2>\n\t\t\t<p>I also implemented the Edit Colors dialog. Previously this used the native system color picker, and\n\t\t\t\tdidn't work for some people.</p>\n\t\t\t<p>Access with <b>Colors > Edit Colors</b> or double click a color in the palette to edit.</p>\n\t\t\t<figure>\n\t\t\t\t<img width=\"496\" height=\"350\" style=\"max-width: 100%; height: auto; image-rendering: auto;\" alt=\"\"\n\t\t\t\t\tsrc=\"https://i.postimg.cc/cLNgWH0r/Peek-2020-12-04-00-31.gif\" />\n\t\t\t\t<figcaption>An animation morphing between JS Paint and MS Paint's color picking dialog. It's pretty\n\t\t\t\t\tclose, other than the font.</figcaption>\n\t\t\t</figure>\n\t\t\t<p>Keyboard shortcuts are supported in this dialog, and for mobile devices with small screens, I made it\n\t\t\t\ttreat adding custom colors as a separate screen.</p>\n\t\t\t<h2>Conclusion</h2>\n\t\t\t<p>\n\t\t\t\tJS Paint should be way more accessible now. And futuristic.\n\t\t\t<p>\n\t\t\t<p>\n\t\t\t\tOf course there's always more that could be done.\n\t\t\t\tEye Gaze Mode could use brush stroke smoothing, and Speech Recognition could use Artificial General\n\t\t\t\tIntelligence.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tI'd love to see people using JS Paint, especially the Eye Gaze Mode and Speech Recognition,\n\t\t\t\tso if you record a video of using JS Paint, please\n\t\t\t\t<a target=\"_blank\"\n\t\t\t\t\thref=\"https://docs.google.com/forms/d/e/1FAIpQLSdGgS6TS4wBV89v8NoYHenh1eI8jYBfgwYBdPx-OaCEG5EW7g/viewform?usp=sf_link\">send\n\t\t\t\t\tit to me through this form.</a>\n\t\t\t\tThis lets me know what's actually important to people, and what's confusing,\n\t\t\t\tand it gives me motivation to work on new features.\n\t\t\t</p>\n\t\t</article>\n\t\t<article class=\"news-entry\" id=\"news-2019-winter-update\">\n\t\t\t<h1>Winter Update</h1>\n\t\t\t<time datetime=\"2019-12-20\">2019-12-20</time>\n\t\t\t<img width=\"563\" height=\"334\" style=\"max-width: 100%; height: auto; image-rendering: auto;\" alt=\"\"\n\t\t\t\tsrc=\"https://i.postimg.cc/63Wc6vpG/2019-winter-update-candy-cane.gif\" />\n\t\t\t<h2>Winter Theme</h2>\n\t\t\t<p>\n\t\t\t\tA new UI skin is available, under <b>Extras &gt; Themes &gt; Winter</b>, featuring winter and holiday\n\t\t\t\ticons, festive fonts, and a palette with seasonal colors and peppermint patterns.\n\t\t\t</p>\n\t\t\t<img width=\"256\" height=\"16\" alt=\"\" src=\"images/winter/tools.png\" />\n\t\t\t<p>\n\t\t\t\tMerry Christmas and happy Hanukkah!\n\t\t\t</p>\n\t\t\t<h2>Better History</h2>\n\t\t\t<b class=\"new\">New:</b> Jump to any point in the document's history, forwards or backwards, with <b>Edit\n\t\t\t\t&gt; History</b> or <kbd>Ctrl+Shift+Y</kbd>.\n\t\t\t<ul>\n\t\t\t\t<li>\n\t\t\t\t\tClick on Text in the history view to go back to text editing.\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\tYou can return to when a selection existed.\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\tNote: these states are skipped over with normal Undo and Redo, so you need to use the History\n\t\t\t\t\twindow.\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\tBranching history: if you undo, and then make changes, you can get back to everything.\n\t\t\t\t\tFuture states are preserved.\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<b class=\"bad\">Warning:</b> History is not saved with the autosave. Document history will be lost if you\n\t\t\trefresh the page, or close the tab, or if the tab crashes, or if you close or restart your browser, or\n\t\t\tlikely if you're just on a phone and the mobile browser loses focus.\n\t\t\t<h2>Improved Mobile Support</h2>\n\t\t\t<p>\n\t\t\t\t<b class=\"new\">New:</b> Use two fingers to pan the view.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tI recently made it easier to grab handles for resizing things.\n\t\t\t\tWith that, combined with multitouch panning,\n\t\t\t\tJS Paint is much more useable on a phone.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<b class=\"bad\">Caveat:</b> It's slow on some devices, and parts of the interface are still too small for\n\t\t\t\ttouch.\n\t\t\t</p>\n\t\t</article>\n\t\t<article class=\"news-entry\" id=\"news-2019-polygon-text-and-select\">\n\t\t\t<h1>Polygon, Text, and Select</h1>\n\t\t\t<time datetime=\"2019-12-04\">2019-12-04</time>\n\t\t\t<p>\n\t\t\t\tHandles are now way easier to drag, with extended click targets, similar to Paint from Windows 7.\n\t\t\t\tIt's not unreasonable to use with a touch screen now!\n\t\t\t\tThis applies to selections, textboxes, and the main canvas handles.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tResizing things while zoomed in is <a target=\"_blank\"\n\t\t\t\t\thref=\"https://github.com/1j01/jspaint/issues/13#issuecomment-562247085\">finally fixed</a>!\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tThe Text tool now perfectly previews the pixels that will be placed on the canvas.\n\t\t\t\tWhat you see is what you get!\n\t\t\t\tAlso it retains all browser editing behavior, like spellcheck,\n\t\t\t\tusing a convoluted, yet elegant overlaying strategy.\n\t\t\t\t(I prototyped this <a target=\"_blank\" href=\"https://jsfiddle.net/1j01/wnac09u3/\">here</a>\n\t\t\t\tand <a target=\"_blank\" href=\"https://jsfiddle.net/1j01/qkvfjn1r/\">here</a> if you're interested.)\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tWith the fill-only option selected, the Polygon tool now previews with inverted lines, like MS Paint\n\t\t\t\tdoes.\n\t\t\t\t(When you finish the polygon, the boundary of the shape matches the preview exactly,\n\t\t\t\tbecause it actually <em>does</em> draw a stroke, just the same color as the fill.)\n\t\t\t</p>\n\t\t</article>\n\t\t<article class=\"news-entry\" id=\"news-2019-zoom-viewport\">\n\t\t\t<h1>Zoom To Mouse</h1>\n\t\t\t<time datetime=\"2019-10-26\">2019-10-26</time>\n\t\t\t<p>\n\t\t\t\t<b class=\"new\">New:</b> The Magnifier now lets you zoom to a specific location,\n\t\t\t\tshowing a preview of the new viewport.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAlso, when zooming out with the Magnifier,\n\t\t\t\tor changing the zoom from the toolbar or menus,\n\t\t\t\tthe top left corner of the viewport is now kept anchored.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAlso, pasting a selection will now go to the top left of the viewport,\n\t\t\t\tinstead of the entire document.\n\t\t\t</p>\n\t\t</article>\n\t\t<article class=\"news-entry\" id=\"news-2019-grid-zoom-cursors\">\n\t\t\t<h1>The Grid, Custom Zoom, and Dynamic Cursors</h1>\n\t\t\t<time datetime=\"2019-10-09\">2019-10-09</time>\n\t\t\t<p>\n\t\t\t\t<b class=\"new\">New:</b> The Grid. Zoom to 4x+ and use <b>View &gt; Zoom &gt; Show Grid</b> or\n\t\t\t\t<kbd>Ctrl+G</kbd> to enable.\n\t\t\t\tThis works with browser zoom as well to provide crisp gridlines even if you zoom in with your browser.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<b class=\"new\">New:</b> <b>View &gt; Zoom &gt; Custom Zoom</b>,\n\t\t\t\tincluding an actually-custom numerical zoom option, unlike MS Paint.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<b class=\"new\">New:</b> Dynamic cursors for brush and eraser,\n\t\t\t\tso you now have a preview of exactly where the tool will draw.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAlso, in the event that your browser clears canvases to free up memory,\n\t\t\t\tyou should be more likely to be able to undo to get back to a useful state.\n\t\t\t</p>\n\t\t</article>\n\t\t<article class=\"news-entry\" id=\"news-2019-async-clipboard\">\n\t\t\t<h1>Full Clipboard Support</h1>\n\t\t\t<time datetime=\"2019-09-21\">2019-09-21</time>\n\t\t\t<p>\n\t\t\t\tJS Paint now lets you copy real image data to the Clipboard, both with keyboard shortcuts and from the\n\t\t\t\tEdit menu.\n\t\t\t\tThis feature is available in Chrome 76+. Other browsers don't support it yet, as of Sep 2019.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tAlso: paste the URL of an image, and JS Paint will load and paste the image.\n\t\t\t\t(This is an alternative to <b>File &gt; Load from URL</b>, which replaces the document.)\n\t\t\t</p>\n\t\t</article>\n\t\t<style>\n\t\t\t#news {\n\t\t\t\tbackground: white;\n\t\t\t\tcolor: black;\n\t\t\t}\n\n\t\t\t.news-entry {\n\t\t\t\tpadding: 20px;\n\t\t\t\tmax-width: 563px;\n\t\t\t\tborder-bottom: 5px groove #ccc;\n\t\t\t}\n\n\t\t\t.news-entry>h1 {\n\t\t\t\tfont-size: 1.3em;\n\t\t\t\tmargin: 0;\n\t\t\t\tmargin-bottom: 0.3em;\n\t\t\t}\n\n\t\t\t.news-entry>time {\n\t\t\t\tfont-size: 1.2em;\n\t\t\t\tcolor: gray;\n\t\t\t}\n\n\t\t\t.news-entry>h2 {\n\t\t\t\tfont-size: 1.9em;\n\t\t\t\tfont-weight: normal;\n\t\t\t\tmargin: 0;\n\t\t\t\tmargin-bottom: 0.3em;\n\t\t\t\tmargin-top: 0.3em;\n\t\t\t}\n\n\t\t\t.news-entry .new {\n\t\t\t\tcolor: green;\n\t\t\t}\n\n\t\t\t.news-entry .bad {\n\t\t\t\tcolor: #d11a29;\n\t\t\t}\n\t\t</style>\n\t</div>\n\n\t<!-- Note: no CDNs, even with fallback, as the fallback is too complicated to handle with CSP. -->\n\t<script src=\"lib/jquery-3.4.1.min.js\"></script>\n\t<script src=\"lib/gif.js/gif.js\"></script>\n\t<!-- pako is used by UPNG.js and UTIF.js -->\n\t<script src=\"lib/pako-2.0.3.min.js\"></script>\n\t<script src=\"lib/UPNG.js\"></script>\n\t<script src=\"lib/UTIF.js\"></script>\n\t<script src=\"lib/bmp.js\"></script>\n\t<script src=\"lib/pdf.js/build/pdf.js\"></script>\n\t<script src=\"lib/anypalette-0.6.0.js\"></script>\n\t<script src=\"lib/FileSaver.js\"></script>\n\t<script src=\"lib/font-detective.js\"></script>\n\t<script src=\"lib/libtess.min.js\"></script>\n\t<script src=\"lib/tracky-mouse/core/tracky-mouse.js\"></script>\n\t<script src=\"lib/os-gui/parse-theme.js\"></script>\n\t<script src=\"lib/os-gui/$Window.js\"></script>\n\t<script src=\"lib/os-gui/MenuBar.js\"></script>\n\t<script src=\"lib/imagetracer_v1.2.5.js\"></script>\n\n\t<!-- must not be async/deferred, as it uses document.write(); and must come before other app code which uses localization functions -->\n\t<!-- (also depends on msgbox.js and thus os-gui.js, but not initially) -->\n\t<script src=\"src/app-localization.js\"></script>\n\n\t<!-- Scripts that are not yet transitioned to ES Modules are marked as \"defer\"\n\tso that the ES Modules (which are implicitly deferred) can still export globals to be consumed by the non-module scripts,\n\twhich helps with progressively converting the codebase to ES Modules. -->\n\t<script type=\"module\" src=\"src/msgbox.js\"></script>\n\t<script type=\"module\" src=\"src/functions.js\"></script>\n\t<script type=\"module\" src=\"src/helpers.js\"></script>\n\t<script type=\"module\" src=\"src/storage.js\"></script>\n\t<script type=\"module\" src=\"src/$Component.js\"></script>\n\t<script type=\"module\" src=\"src/$ToolWindow.js\"></script>\n\n\t<!-- After show_error_message, showMessageBox, make_window_supporting_scale, and localize are defined,\n\tset up better global error handling. -->\n\t<script type=\"module\" src=\"src/error-handling-enhanced.js\"></script>\n\n\t<script type=\"module\" src=\"src/$ToolBox.js\"></script>\n\t<script type=\"module\" src=\"src/$ColorBox.js\"></script>\n\t<script type=\"module\" src=\"src/$FontBox.js\"></script>\n\t<script type=\"module\" src=\"src/Handles.js\"></script>\n\t<script type=\"module\" src=\"src/OnCanvasObject.js\"></script>\n\t<script type=\"module\" src=\"src/OnCanvasSelection.js\"></script>\n\t<script type=\"module\" src=\"src/OnCanvasTextBox.js\"></script>\n\t<script type=\"module\" src=\"src/OnCanvasHelperLayer.js\"></script>\n\t<script type=\"module\" src=\"src/image-manipulation.js\"></script>\n\t<script type=\"module\" src=\"src/tool-options.js\"></script>\n\t<script type=\"module\" src=\"src/tools.js\"></script>\n\t<!--<script type=\"module\" src=\"src/extra-tools.js\"></script>-->\n\t<script type=\"module\" src=\"src/color-data.js\"></script>\n\t<script type=\"module\" src=\"src/edit-colors.js\"></script>\n\t<script type=\"module\" src=\"src/file-format-data.js\"></script>\n\t<script type=\"module\" src=\"src/manage-storage.js\"></script>\n\t<script type=\"module\" src=\"src/imgur.js\"></script>\n\t<script type=\"module\" src=\"src/help.js\"></script>\n\t<script type=\"module\" src=\"src/simulate-random-gestures.js\"></script>\n\t<script type=\"module\" src=\"src/menus.js\"></script>\n\t<script type=\"module\" src=\"src/speech-recognition.js\"></script>\n\t<script type=\"module\" src=\"src/eye-gaze-mode.js\"></script>\n\t<script defer src=\"src/app-state.js\"></script>\n\t<script type=\"module\" src=\"src/app.js\"></script>\n\t<script type=\"module\" src=\"src/sessions.js\"></script>\n\t<script type=\"module\" src=\"src/konami.js\"></script>\n\t<script type=\"module\" src=\"src/vaporwave-fun.js\"></script>\n\n\t<noscript>\n\t\t<h1><img src=\"images/icons/32x32.png\" width=\"32\" height=\"32\" alt=\"\" /> JS Paint</h1>\n\n\t\t<p>This application requires JavaScript to run.</p>\n\n\t\t<p>\n\t\t\tAssuming this is the official instance of jspaint,\n\t\t\tat <a href=\"https://jspaint.app\">https://jspaint.app</a>,\n\t\t\tyou can safely enable JavaScript.\n\t\t</p>\n\n\t\t<p>You can also check out <a href=\"https://github.com/1j01/jspaint\">the source code and project info</a>.</p>\n\t</noscript>\n\n\t<svg style=\"position: absolute; pointer-events: none; bottom: 100%;\">\n\t\t<defs>\n\t\t\t<filter id=\"disabled-inset-filter\" x=\"0\" y=\"0\" width=\"1px\" height=\"1px\">\n\t\t\t\t<feColorMatrix in=\"SourceGraphic\" type=\"matrix\" values=\"\n\t\t\t\t\t1 0 0 0 0\n\t\t\t\t\t0 1 0 0 0\n\t\t\t\t\t0 0 1 0 0\n\t\t\t\t\t-1000 -1000 -1000 1 0\n\t\t\t\t\" result=\"black-parts-isolated\" />\n\t\t\t\t<feFlood result=\"shadow-color\" flood-color=\"var(--ButtonShadow)\" />\n\t\t\t\t<feFlood result=\"hilight-color\" flood-color=\"var(--ButtonHilight)\" />\n\t\t\t\t<feOffset in=\"black-parts-isolated\" dx=\"1\" dy=\"1\" result=\"offset\" />\n\t\t\t\t<feComposite in=\"hilight-color\" in2=\"offset\" operator=\"in\" result=\"hilight-colored-offset\" />\n\t\t\t\t<feComposite in=\"shadow-color\" in2=\"black-parts-isolated\" operator=\"in\" result=\"shadow-colored\" />\n\t\t\t\t<feMerge>\n\t\t\t\t\t<feMergeNode in=\"hilight-colored-offset\" />\n\t\t\t\t\t<feMergeNode in=\"shadow-colored\" />\n\t\t\t\t</feMerge>\n\t\t\t</filter>\n\t\t\t<filter id=\"disabled-inset-filter-2\" x=\"0\" y=\"0\" width=\"1px\" height=\"1px\">\n\t\t\t\t<feColorMatrix in=\"SourceGraphic\" type=\"matrix\" values=\"\n\t\t\t\t\t1 0 0 0 0\n\t\t\t\t\t0 1 0 0 0\n\t\t\t\t\t0 0 1 0 0\n\t\t\t\t\t-1 -1 -0 1 0\n\t\t\t\t\" result=\"black-and-blue-parts-isolated\" />\n\t\t\t\t<feFlood result=\"shadow-color\" flood-color=\"var(--ButtonShadow)\" />\n\t\t\t\t<feFlood result=\"hilight-color\" flood-color=\"var(--ButtonHilight)\" />\n\t\t\t\t<feOffset in=\"black-and-blue-parts-isolated\" dx=\"1\" dy=\"1\" result=\"offset\" />\n\t\t\t\t<feComposite in=\"hilight-color\" in2=\"offset\" operator=\"in\" result=\"hilight-colored-offset\" />\n\t\t\t\t<feComposite in=\"shadow-color\" in2=\"black-and-blue-parts-isolated\" operator=\"in\"\n\t\t\t\t\tresult=\"shadow-colored\" />\n\t\t\t\t<feMerge>\n\t\t\t\t\t<feMergeNode in=\"hilight-colored-offset\" />\n\t\t\t\t\t<feMergeNode in=\"shadow-colored\" />\n\t\t\t\t</feMerge>\n\t\t\t</filter>\n\t\t</defs>\n\t</svg>\n</body>\n\n</html>"
  },
  {
    "path": "jsconfig.json",
    "content": "{\n\t\"compilerOptions\": {\n\t\t\"target\": \"ES2022\",\n\t\t\"module\": \"ES2022\",\n\t\t\"moduleResolution\": \"node\", // Fixes error TS2792: Cannot find module 'electron'. https://stackoverflow.com/a/46562884/2624876\n\t},\n\t\"include\": [\n\t\t\"src/**/*\",\n\t\t\"localization/*.js\",\n\t\t\"lib/os-gui/os-gui.d.ts\"\n\t]\n}"
  },
  {
    "path": "lib/98.css/98.custom-build.css",
    "content": "/*! 98.css custom build - https://github.com/jdan/98.css */\n/**\n * 98.css\n * Copyright (c) 2020 Jordan Scales <thatjdanisso.cool>\n * https://github.com/jdan/98.css/blob/main/LICENSE\n */\n\n:root {\n  /* Color */\n  --surface: var(--ButtonFace, #c0c0c0);\n  --button-highlight: var(--ButtonHilight, #ffffff);\n  --button-face: var(--ButtonFace, #dfdfdf);\n  --button-shadow: var(--ButtonShadow, #808080);\n  --window-frame: var(--WindowFrame, #0a0a0a);\n  --dialog-blue: var(--ActiveTitle, #000080);\n  --dialog-blue-light: var(--GradientActiveTitle, #1084d0);\n  --dialog-gray: var(--InactiveTitle, #808080);\n  --dialog-gray-light: var(--GradientInactiveTitle, #b5b5b5);\n  --link-blue: #0000ff;\n\n  /* Spacing */\n  --element-spacing: 8px;\n  --grouped-button-spacing: 4px;\n  --grouped-element-spacing: 6px;\n  --radio-width: 12px;\n  --checkbox-width: 13px;\n  --radio-label-spacing: 6px;\n  --range-track-height: 4px;\n  --range-spacing: 10px;\n\n  /* Some detailed computations for radio buttons and checkboxes */\n  --radio-total-width-precalc: var(--radio-width) + var(--radio-label-spacing);\n  --radio-total-width: calc(var(--radio-total-width-precalc));\n  --radio-left: calc(-1 * var(--radio-total-width-precalc));\n  --radio-dot-width: 4px;\n  --radio-dot-top: calc(var(--radio-width) / 2 - var(--radio-dot-width) / 2);\n  --radio-dot-left: calc(\n    -1 * (var(--radio-total-width-precalc)) + var(--radio-width) / 2 - var(\n        --radio-dot-width\n      ) / 2\n  );\n\n  --checkbox-total-width-precalc: var(--checkbox-width) +\n    var(--radio-label-spacing);\n  --checkbox-total-width: calc(var(--checkbox-total-width-precalc));\n  --checkbox-left: calc(-1 * var(--checkbox-total-width-precalc));\n  --checkmark-width: 7px;\n  --checkmark-top: 3px;\n  --checkmark-left: 3px;\n\n  /* Borders */\n  --border-width: 1px;\n  /* rtl:ignore */\n  --border-raised-outer: inset -1px -1px var(--window-frame),\n    inset 1px 1px var(--button-highlight);\n  /* rtl:ignore */\n    --border-raised-inner: inset -2px -2px var(--button-shadow),\n    inset 2px 2px var(--button-face);\n  /* rtl:ignore */\n    --border-sunken-outer: inset -1px -1px var(--button-highlight),\n    inset 1px 1px var(--window-frame);\n  /* rtl:ignore */\n    --border-sunken-inner: inset -2px -2px var(--button-face),\n    inset 2px 2px var(--button-shadow);\n\n  /* Window borders flip button-face and button-highlight */\n  /* rtl:ignore */\n  --border-window-outer: inset -1px -1px var(--window-frame),\n    inset 1px 1px var(--button-face);\n  /* rtl:ignore */\n    --border-window-inner: inset -2px -2px var(--button-shadow),\n    inset 2px 2px var(--button-highlight);\n\n  /* Field borders (checkbox, input, etc) flip window-frame and button-shadow */\n  /* rtl:ignore */\n  --border-field: inset -1px -1px var(--button-highlight),\n    inset 1px 1px var(--button-shadow), inset -2px -2px var(--button-face),\n    inset 2px 2px var(--window-frame);\n}\n\n/* \n@font-face {\n  font-family: \"Pixelated MS Sans Serif\";\n  src: url(\"fonts/converted/ms_sans_serif.woff\") format(\"woff\");\n  src: url(\"fonts/converted/ms_sans_serif.woff2\") format(\"woff2\");\n  font-weight: normal;\n  font-style: normal;\n}\n\n@font-face {\n  font-family: \"Pixelated MS Sans Serif\";\n  src: url(\"fonts/converted/ms_sans_serif_bold.woff\") format(\"woff\");\n  src: url(\"fonts/converted/ms_sans_serif_bold.woff2\") format(\"woff2\");\n  font-weight: bold;\n  font-style: normal;\n}\n\nbody {\n  font-family: Arial;\n  font-size: 12px;\n  color: #222222;\n}\n\nbutton,\nlabel,\ninput,\ntextarea,\nselect,\noption,\nul.tree-view,\n.window,\n.title-bar {\n  font-family: \"Pixelated MS Sans Serif\", Arial;\n  -webkit-font-smoothing: none;\n  font-size: 11px;\n}\n\nh1 {\n  font-size: 5rem;\n}\n\nh2 {\n  font-size: 2.5rem;\n}\n\nh3 {\n  font-size: 2rem;\n}\n\nh4 {\n  font-size: 1.5rem;\n}\n\nu {\n  text-decoration: none;\n  border-bottom: 0.5px solid #222222;\n}\n\nbutton {\n  box-sizing: border-box;\n  border: none;\n  background: var(--surface);\n  box-shadow: var(--border-raised-outer), var(--border-raised-inner);\n  border-radius: 0;\n\n  min-width: 75px;\n  min-height: 23px;\n  padding: 0 12px;\n}\n\n.vertical-bar {\n  width: 4px;\n  height: 20px;\n  background: #c0c0c0;\n  box-shadow: var(--border-raised-outer), var(--border-raised-inner);\n}\n\nbutton:not(:disabled):active {\n  box-shadow: var(--border-sunken-outer), var(--border-sunken-inner);\n  padding: 2px 11px 0 13px;\n}\n\n@media (not(hover)) {\n  button:not(:disabled):hover {\n    box-shadow: var(--border-sunken-outer), var(--border-sunken-inner);\n  }\n}\n\nbutton:focus {\n  outline: 1px dotted #000000;\n  outline-offset: -4px;\n}\n\nbutton::-moz-focus-inner {\n  border: 0;\n}\n\n:disabled,\n:disabled + label {\n  color: var(--button-shadow);\n}\n\nbutton:disabled,\n:disabled + label {\n  text-shadow: 1px 1px 0 var(--button-highlight);\n}\n\n.window {\n  box-shadow: var(--border-window-outer), var(--border-window-inner);\n  background: var(--surface);\n  padding: 3px;\n}\n\n.title-bar {\n  background: linear-gradient(\n    90deg,\n    var(--dialog-blue),\n    var(--dialog-blue-light)\n  );\n  padding: 3px 2px 3px 3px;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n\n.title-bar.inactive {\n  background: linear-gradient(\n    90deg,\n    var(--dialog-gray),\n    var(--dialog-gray-light)\n  );\n}\n\n.title-bar-text {\n  font-weight: bold;\n  color: white;\n  letter-spacing: 0;\n  margin-right: 24px;\n}\n\n.title-bar-controls {\n  display: flex;\n}\n\n.title-bar-controls button {\n  padding: 0;\n  display: block;\n  min-width: 16px;\n  min-height: 14px;\n}\n\n.title-bar-controls button:active {\n  padding: 0;\n}\n\n.title-bar-controls button:focus {\n  outline: none;\n}\n\n.title-bar-controls button[aria-label=\"Minimize\"] {\n  background-image: svg-load(\"./icon/minimize.svg\");\n  background-repeat: no-repeat;\n  background-position: bottom 3px left 4px;\n}\n\n.title-bar-controls button[aria-label=\"Maximize\"] {\n  background-image: svg-load(\"./icon/maximize.svg\");\n  background-repeat: no-repeat;\n  background-position: top 2px left 3px;\n}\n\n.title-bar-controls button[aria-label=\"Restore\"] {\n  background-image: svg-load(\"./icon/restore.svg\");\n  background-repeat: no-repeat;\n  background-position: top 2px left 3px;\n}\n\n.title-bar-controls button[aria-label=\"Help\"] {\n  background-image: svg-load(\"./icon/help.svg\");\n  background-repeat: no-repeat;\n  background-position: top 2px left 5px;\n}\n\n.title-bar-controls button[aria-label=\"Close\"] {\n  margin-left: 2px;\n  background-image: svg-load(\"./icon/close.svg\");\n  background-repeat: no-repeat;\n  background-position: top 3px left 4px;\n}\n\n.status-bar {\n  margin: 0px 1px;\n  display: flex;\n  gap: 1px;\n}\n\n.status-bar-field {\n  box-shadow: inset -1px -1px  #dfdfdf, \n    inset 1px 1px #808080;\n  flex-grow: 1;\n  padding: 2px 3px;\n  margin: 0;\n}\n\n.window-body {\n  margin: var(--element-spacing);\n}\n*/\n\nfieldset {\n  border-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='5' height='5' viewBox='0 0 5 5' fill='grey' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 0H5V5H0V2H2V3H3V2H0' fill='white'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 0H4V4H0V1H1V3H3V1H0' fill='%23808080'/%3E %3C/svg%3E\") 2;\n  padding: calc(2 * var(--border-width) + var(--element-spacing));\n  padding-block-start: var(--element-spacing);\n  margin: 0;\n}\n\nlegend {\n  background: var(--surface);\n}\n\n/* .field-row {\n  display: flex;\n  align-items: center;\n}\n\n[class^=\"field-row\"] + [class^=\"field-row\"] {\n  margin-top: var(--grouped-element-spacing);\n}\n\n.field-row > * + * {\n  margin-left: var(--grouped-element-spacing);\n}\n\n.field-row-stacked {\n  display: flex;\n  flex-direction: column;\n}\n\n.field-row-stacked * + * {\n  margin-top: var(--grouped-element-spacing);\n}\n\n.field-row label {\n  display: inline-flex;\n  align-items: center;\n} */\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  appearance: none;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  margin: 0;\n  background: 0;\n  position: fixed;\n  opacity: 0;\n  border: none;\n}\n\ninput[type=\"radio\"] + label,\ninput[type=\"checkbox\"] + label {\n  line-height: 13px;\n}\n\ninput[type=\"radio\"] + label {\n  position: relative;\n  margin-left: var(--radio-total-width);\n}\n\ninput[type=\"radio\"] + label::before {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  left: calc(-1 * (var(--radio-total-width-precalc)));\n  display: inline-block;\n  width: var(--radio-width);\n  height: var(--radio-width);\n  margin-right: var(--radio-label-spacing);\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='12' viewBox='0 0 12 12' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 0H4V1H2V2H1V4H0V8H1V10H2V8H1V4H2V2H4V1H8V2H10V1H8V0Z' fill='%23808080'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 1H4V2H2V3V4H1V8H2V9H3V8H2V4H3V3H4V2H8V3H10V2H8V1Z' fill='black'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 3H10V4H9V3ZM10 8V4H11V8H10ZM8 10V9H9V8H10V9V10H8ZM4 10V11H8V10H4ZM4 10V9H2V10H4Z' fill='%23DFDFDF'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11 2H10V4H11V8H10V10H8V11H4V10H2V11H4V12H8V11H10V10H11V8H12V4H11V2Z' fill='white'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M4 2H8V3H9V4H10V8H9V9H8V10H4V9H3V8H2V4H3V3H4V2Z' fill='white'/%3E %3C/svg%3E\");\n}\n\ninput[type=\"radio\"]:active + label::before {\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='12' viewBox='0 0 12 12' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 0H4V1H2V2H1V4H0V8H1V10H2V8H1V4H2V2H4V1H8V2H10V1H8V0Z' fill='%23808080'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 1H4V2H2V3V4H1V8H2V9H3V8H2V4H3V3H4V2H8V3H10V2H8V1Z' fill='black'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 3H10V4H9V3ZM10 8V4H11V8H10ZM8 10V9H9V8H10V9V10H8ZM4 10V11H8V10H4ZM4 10V9H2V10H4Z' fill='%23DFDFDF'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11 2H10V4H11V8H10V10H8V11H4V10H2V11H4V12H8V11H10V10H11V8H12V4H11V2Z' fill='white'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M4 2H8V3H9V4H10V8H9V9H8V10H4V9H3V8H2V4H3V3H4V2Z' fill='%23C0C0C0'/%3E %3C/svg%3E\");\n}\n\ninput[type=\"radio\"]:checked + label::after {\n  content: \"\";\n  display: block;\n  width: var(--radio-dot-width);\n  height: var(--radio-dot-width);\n  top: var(--radio-dot-top);\n  left: var(--radio-dot-left);\n  position: absolute;\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='4' height='4' viewBox='0 0 4 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M3 0H1V1H0V2V3H1V4H3V3H4V2V1H3V0Z' fill='black'/%3E %3C/svg%3E\");\n}\n\ninput[type=\"radio\"]:focus + label,\ninput[type=\"checkbox\"]:focus + label {\n  outline: 1px dotted #000000;\n}\n\ninput[type=\"radio\"][disabled] + label::before {\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='12' viewBox='0 0 12 12' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 0H4V1H2V2H1V4H0V8H1V10H2V8H1V4H2V2H4V1H8V2H10V1H8V0Z' fill='%23808080'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 1H4V2H2V3V4H1V8H2V9H3V8H2V4H3V3H4V2H8V3H10V2H8V1Z' fill='black'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 3H10V4H9V3ZM10 8V4H11V8H10ZM8 10V9H9V8H10V9V10H8ZM4 10V11H8V10H4ZM4 10V9H2V10H4Z' fill='%23DFDFDF'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11 2H10V4H11V8H10V10H8V11H4V10H2V11H4V12H8V11H10V10H11V8H12V4H11V2Z' fill='white'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M4 2H8V3H9V4H10V8H9V9H8V10H4V9H3V8H2V4H3V3H4V2Z' fill='%23C0C0C0'/%3E %3C/svg%3E\");\n}\n\ninput[type=\"radio\"][disabled]:checked + label::after {\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='4' height='4' viewBox='0 0 4 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M3 0H1V1H0V2V3H1V4H3V3H4V2V1H3V0Z' fill='%23808080'/%3E %3C/svg%3E\");\n}\n\ninput[type=\"checkbox\"] + label {\n  position: relative;\n  margin-left: var(--checkbox-total-width);\n}\n\ninput[type=\"checkbox\"] + label::before {\n  content: \"\";\n  position: absolute;\n  left: calc(-1 * (var(--checkbox-total-width-precalc)));\n  display: inline-block;\n  width: var(--checkbox-width);\n  height: var(--checkbox-width);\n  background: var(--Window);\n  box-shadow: var(--border-field);\n  margin-right: var(--radio-label-spacing);\n}\n\ninput[type=\"checkbox\"]:active + label::before {\n  background: var(--surface);\n}\n\ninput[type=\"checkbox\"]:checked + label::after {\n  content: \"\";\n  display: block;\n  width: var(--checkmark-width);\n  height: var(--checkmark-width);\n  position: absolute;\n  top: var(--checkmark-top);\n  left: calc(\n    -1 * (var(--checkbox-total-width-precalc)) + var(--checkmark-left)\n  );\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='7' height='7' viewBox='0 0 7 7' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7 0H6V1H5V2H4V3H3V4H2V3H1V2H0V5H1V6H2V7H3V6H4V5H5V4H6V3H7V0Z' fill='black'/%3E %3C/svg%3E\");\n}\n\ninput[type=\"checkbox\"][disabled] + label::before {\n  background: var(--surface);\n}\n\ninput[type=\"checkbox\"][disabled]:checked + label::after {\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='7' height='7' viewBox='0 0 7 7' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7 0H6V1H5V2H4V3H3V4H2V3H1V2H0V5H1V6H2V7H3V6H4V5H5V4H6V3H7V0Z' fill='%23808080'/%3E %3C/svg%3E\");\n}\n\n/*\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"email\"],\nselect,\ntextarea {\n  padding: 3px 4px;\n  border: none;\n  box-shadow: var(--border-field);\n  background-color: var(--Window);\n  color: var(--WindowText);\n  box-sizing: border-box;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  border-radius: 0;\n}\n\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"email\"],\nselect {\n  height: 21px;\n}\n\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"email\"] {\n  /* For some reason descenders are getting cut off without this *.../\n  line-height: 2;\n}\n\ninput[type=\"text\"]:disabled,\ninput[type=\"password\"]:disabled,\ninput[type=\"email\"]:disabled,\ntextarea:disabled {\n  background-color: var(--surface);\n}\n\nselect {\n  appearance: none;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  position: relative;\n  padding-right: 32px;\n  background-image: svg-load(\"./icon/button-down.svg\");\n  background-position: top 2px right 2px;\n  background-repeat: no-repeat;\n  border-radius: 0;\n}\n\nselect:focus,\ninput[type=\"text\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"email\"]:focus,\ntextarea:focus {\n  outline: none;\n}\n*/\n\ninput[type=\"range\"] {\n  -webkit-appearance: none;\n  width: 100%;\n  background: transparent;\n}\n\ninput[type=\"range\"]:focus {\n  outline: none;\n}\n\ninput[type=\"range\"]::-webkit-slider-thumb {\n  -webkit-appearance: none;\n  height: 21px;\n  width: 11px;\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='21' viewBox='0 0 11 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 0V16H2V18H4V20H5V19H3V17H1V1H10V0Z' fill='white'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M1 1V16H2V17H3V18H4V19H6V18H7V17H8V16H9V1Z' fill='%23C0C7C8'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 1H10V16H8V18H6V20H5V19H7V17H9Z' fill='%2387888F'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10 0H11V16H9V18H7V20H5V21H6V19H8V17H10Z' fill='black'/%3E %3C/svg%3E\");\n  transform: translateY(-8px);\n}\n\ninput[type=\"range\"].has-box-indicator::-webkit-slider-thumb {\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='21' viewBox='0 0 11 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 0V20H1V1H10V0Z' fill='white'/%3E %3Crect x='1' y='1' width='8' height='18' fill='%23C0C7C8'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 1H10V20H1V19H9Z' fill='%2387888F'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10 0H11V21H0V20H10Z' fill='black'/%3E %3C/svg%3E\");\n  transform: translateY(-10px);\n}\n\ninput[type=\"range\"]::-moz-range-thumb {\n  height: 21px;\n  width: 11px;\n  border: 0;\n  border-radius: 0;\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='21' viewBox='0 0 11 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 0V16H2V18H4V20H5V19H3V17H1V1H10V0Z' fill='white'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M1 1V16H2V17H3V18H4V19H6V18H7V17H8V16H9V1Z' fill='%23C0C7C8'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 1H10V16H8V18H6V20H5V19H7V17H9Z' fill='%2387888F'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10 0H11V16H9V18H7V20H5V21H6V19H8V17H10Z' fill='black'/%3E %3C/svg%3E\");\n  transform: translateY(2px);\n}\n\ninput[type=\"range\"].has-box-indicator::-moz-range-thumb {\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='21' viewBox='0 0 11 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 0V20H1V1H10V0Z' fill='white'/%3E %3Crect x='1' y='1' width='8' height='18' fill='%23C0C7C8'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 1H10V20H1V19H9Z' fill='%2387888F'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10 0H11V21H0V20H10Z' fill='black'/%3E %3C/svg%3E\");\n  transform: translateY(0px);\n}\n\ninput[type=\"range\"]::-webkit-slider-runnable-track {\n  width: 100%;\n  height: 2px;\n  box-sizing: border-box;\n  background: black;\n  border-right: 1px solid grey;\n  border-bottom: 1px solid grey;\n  /* rtl:ignore */\n  box-shadow: 1px 0 0 white, 1px 1px 0 white, 0 1px 0 white, -1px 0 0 darkgrey,\n    -1px -1px 0 darkgrey, 0 -1px 0 darkgrey, -1px 1px 0 white, 1px -1px darkgrey;\n}\n\ninput[type=\"range\"]::-moz-range-track {\n  width: 100%;\n  height: 2px;\n  box-sizing: border-box;\n  background: black;\n  border-right: 1px solid grey;\n  border-bottom: 1px solid grey;\n  /* rtl:ignore */\n  box-shadow: 1px 0 0 white, 1px 1px 0 white, 0 1px 0 white, -1px 0 0 darkgrey,\n    -1px -1px 0 darkgrey, 0 -1px 0 darkgrey, -1px 1px 0 white, 1px -1px darkgrey;\n}\n\n.is-vertical {\n  display: inline-block;\n  width: 4px;\n  height: 150px;\n  transform: translateY(50%);\n}\n\n.is-vertical > input[type=\"range\"] {\n  width: 150px;\n  height: 4px;\n  margin: 0 calc(var(--grouped-element-spacing) + var(--range-spacing)) 0\n    var(--range-spacing);\n  transform-origin: left;\n  transform: rotate(270deg) translateX(calc(-50% + var(--element-spacing)));\n}\n\n.is-vertical > input[type=\"range\"]::-webkit-slider-runnable-track {\n  border-left: 1px solid grey;\n  border-right: 0;\n  border-bottom: 1px solid grey;\n  /* rtl:ignore */\n  box-shadow: -1px 0 0 white, -1px 1px 0 white, 0 1px 0 white, 1px 0 0 darkgrey,\n    1px -1px 0 darkgrey, 0 -1px 0 darkgrey, 1px 1px 0 white, -1px -1px darkgrey;\n}\n\n.is-vertical > input[type=\"range\"]::-moz-range-track {\n  border-left: 1px solid grey;\n  border-right: 0;\n  border-bottom: 1px solid grey;\n  /* rtl:ignore */\n  box-shadow: -1px 0 0 white, -1px 1px 0 white, 0 1px 0 white, 1px 0 0 darkgrey,\n    1px -1px 0 darkgrey, 0 -1px 0 darkgrey, 1px 1px 0 white, -1px -1px darkgrey;\n}\n\n.is-vertical > input[type=\"range\"]::-webkit-slider-thumb {\n  transform: translateY(-8px) scaleX(-1);\n}\n\n.is-vertical > input[type=\"range\"].has-box-indicator::-webkit-slider-thumb {\n  transform: translateY(-10px) scaleX(-1);\n}\n\n.is-vertical > input[type=\"range\"]::-moz-range-thumb {\n  transform: translateY(2px) scaleX(-1);\n}\n\n.is-vertical > input[type=\"range\"].has-box-indicator::-moz-range-thumb {\n  transform: translateY(0px) scaleX(-1);\n}\n\n/* select:focus {\n  color: var(--HilightText);\n  background-color: var(--Hilight);\n}\nselect:focus option {\n  color: #000;\n  background-color: #fff;\n}\n\nselect:active {\n  background-image: svg-load(\"./icon/button-down-active.svg\");\n} */\n\n/* a {\n  color: var(--link-blue);\n}\n\na:focus {\n  outline: 1px dotted var(--link-blue);\n} */\n\n/* ul.tree-view {\n  display: block;\n  background: var(--Window);\n  box-shadow: var(--border-field);\n  padding: 6px;\n  margin: 0;\n}\n\nul.tree-view li {\n  list-style-type: none;\n}\n\nul.tree-view a {\n  text-decoration: none;\n  color: #000;\n}\n\nul.tree-view a:focus {\n  background-color: var(--Hilight);\n  color: var(--HilightText);\n}\n\nul.tree-view ul,\nul.tree-view li {\n  margin-top: 3px;\n}\n\nul.tree-view ul {\n  margin-left: 16px;\n  padding-left: 16px;\n  /* Goes down too far *.../\n  border-left: 1px dotted #808080;\n}\n\nul.tree-view ul > li {\n  position: relative;\n}\nul.tree-view ul > li::before {\n  content: \"\";\n  display: block;\n  position: absolute;\n  left: -16px;\n  top: 6px;\n  width: 12px;\n  border-bottom: 1px dotted #808080;\n}\n\n/* Cover the bottom of the left dotted border *.../\nul.tree-view ul > li:last-child::after {\n  content: \"\";\n  display: block;\n  position: absolute;\n  left: -20px;\n  top: 7px;\n  bottom: 0px;\n  width: 8px;\n  background: var(--Window);\n}\n\nul.tree-view details {\n  margin-top: 0;\n}\n\nul.tree-view details[open] summary {\n  margin-bottom: 0;\n}\n\nul.tree-view ul details > summary:before {\n  margin-left: -22px;\n  position: relative;\n  z-index: 1;\n}\n\nul.tree-view details > summary:before {\n  text-align: center;\n  display: block;\n  float: left;\n  content: \"+\";\n  border: 1px solid #808080;\n  width: 8px;\n  height: 9px;\n  line-height: 8px;\n  margin-right: 5px;\n  padding-left: 1px;\n  background-color: #fff;\n}\n\nul.tree-view details[open] > summary:before {\n  content: \"-\";\n} */\n\n/* pre {\n  display: block;\n  background: var(--Window);\n  box-shadow: var(--border-field);\n  padding: 12px 8px;\n  margin: 0;\n}\n\ncode,\ncode * {\n  font-family: monospace;\n}\n\nsummary:focus {\n  outline: 1px dotted #000000;\n} */\n\n/*\n::-webkit-scrollbar {\n  width: 16px;\n}\n::-webkit-scrollbar:horizontal {\n  height: 17px;\n}\n\n::-webkit-scrollbar-corner {\n  background: var(--button-face);\n}\n\n::-webkit-scrollbar-track {\n  background-image: svg-load(\"./icon/scrollbar-background.svg\");\n}\n\n::-webkit-scrollbar-thumb {\n  background-color: var(--button-face);\n  box-shadow: var(--border-raised-outer), var(--border-raised-inner);\n}\n\n::-webkit-scrollbar-button:horizontal:start:decrement,\n::-webkit-scrollbar-button:horizontal:end:increment,\n::-webkit-scrollbar-button:vertical:start:decrement,\n::-webkit-scrollbar-button:vertical:end:increment {\n  display: block;\n}\n\n::-webkit-scrollbar-button:vertical:start {\n  height: 17px;\n  background-image: svg-load(\"./icon/button-up.svg\");\n}\n::-webkit-scrollbar-button:vertical:end {\n  height: 17px;\n  background-image: svg-load(\"./icon/button-down.svg\");\n}\n::-webkit-scrollbar-button:horizontal:start {\n  width: 16px;\n  background-image: svg-load(\"./icon/button-left.svg\");\n}\n::-webkit-scrollbar-button:horizontal:end {\n  width: 16px;\n  background-image: svg-load(\"./icon/button-right.svg\");\n}\n*/\n\n/*# sourceMappingURL=98.custom-build.css.map */"
  },
  {
    "path": "lib/98.css/98.custom-build.rtl.css",
    "content": "/*! 98.css custom build - https://github.com/jdan/98.css */\n/**\n * 98.css\n * Copyright (c) 2020 Jordan Scales <thatjdanisso.cool>\n * https://github.com/jdan/98.css/blob/main/LICENSE\n */\n\n:root {\n  /* Color */\n  --surface: var(--ButtonFace, #c0c0c0);\n  --button-highlight: var(--ButtonHilight, #ffffff);\n  --button-face: var(--ButtonFace, #dfdfdf);\n  --button-shadow: var(--ButtonShadow, #808080);\n  --window-frame: var(--WindowFrame, #0a0a0a);\n  --dialog-blue: var(--ActiveTitle, #000080);\n  --dialog-blue-light: var(--GradientActiveTitle, #1084d0);\n  --dialog-gray: var(--InactiveTitle, #808080);\n  --dialog-gray-light: var(--GradientInactiveTitle, #b5b5b5);\n  --link-blue: #0000ff;\n\n  /* Spacing */\n  --element-spacing: 8px;\n  --grouped-button-spacing: 4px;\n  --grouped-element-spacing: 6px;\n  --radio-width: 12px;\n  --checkbox-width: 13px;\n  --radio-label-spacing: 6px;\n  --range-track-height: 4px;\n  --range-spacing: 10px;\n\n  /* Some detailed computations for radio buttons and checkboxes */\n  --radio-total-width-precalc: var(--radio-width) + var(--radio-label-spacing);\n  --radio-total-width: calc(var(--radio-total-width-precalc));\n  --radio-left: calc(-1 * var(--radio-total-width-precalc));\n  --radio-dot-width: 4px;\n  --radio-dot-top: calc(var(--radio-width) / 2 - var(--radio-dot-width) / 2);\n  --radio-dot-left: calc(\n    -1 * (var(--radio-total-width-precalc)) + var(--radio-width) / 2 - var(\n        --radio-dot-width\n      ) / 2\n  );\n\n  --checkbox-total-width-precalc: var(--checkbox-width) +\n    var(--radio-label-spacing);\n  --checkbox-total-width: calc(var(--checkbox-total-width-precalc));\n  --checkbox-left: calc(-1 * var(--checkbox-total-width-precalc));\n  --checkmark-width: 7px;\n  --checkmark-top: 3px;\n  --checkmark-left: 3px;\n\n  /* Borders */\n  --border-width: 1px;\n  --border-raised-outer: inset -1px -1px var(--window-frame),\n    inset 1px 1px var(--button-highlight);\n    --border-raised-inner: inset -2px -2px var(--button-shadow),\n    inset 2px 2px var(--button-face);\n    --border-sunken-outer: inset -1px -1px var(--button-highlight),\n    inset 1px 1px var(--window-frame);\n    --border-sunken-inner: inset -2px -2px var(--button-face),\n    inset 2px 2px var(--button-shadow);\n\n  /* Window borders flip button-face and button-highlight */\n  --border-window-outer: inset -1px -1px var(--window-frame),\n    inset 1px 1px var(--button-face);\n    --border-window-inner: inset -2px -2px var(--button-shadow),\n    inset 2px 2px var(--button-highlight);\n\n  /* Field borders (checkbox, input, etc) flip window-frame and button-shadow */\n  --border-field: inset -1px -1px var(--button-highlight),\n    inset 1px 1px var(--button-shadow), inset -2px -2px var(--button-face),\n    inset 2px 2px var(--window-frame);\n}\n\n/* \n@font-face {\n  font-family: \"Pixelated MS Sans Serif\";\n  src: url(\"fonts/converted/ms_sans_serif.woff\") format(\"woff\");\n  src: url(\"fonts/converted/ms_sans_serif.woff2\") format(\"woff2\");\n  font-weight: normal;\n  font-style: normal;\n}\n\n@font-face {\n  font-family: \"Pixelated MS Sans Serif\";\n  src: url(\"fonts/converted/ms_sans_serif_bold.woff\") format(\"woff\");\n  src: url(\"fonts/converted/ms_sans_serif_bold.woff2\") format(\"woff2\");\n  font-weight: bold;\n  font-style: normal;\n}\n\nbody {\n  font-family: Arial;\n  font-size: 12px;\n  color: #222222;\n}\n\nbutton,\nlabel,\ninput,\ntextarea,\nselect,\noption,\nul.tree-view,\n.window,\n.title-bar {\n  font-family: \"Pixelated MS Sans Serif\", Arial;\n  -webkit-font-smoothing: none;\n  font-size: 11px;\n}\n\nh1 {\n  font-size: 5rem;\n}\n\nh2 {\n  font-size: 2.5rem;\n}\n\nh3 {\n  font-size: 2rem;\n}\n\nh4 {\n  font-size: 1.5rem;\n}\n\nu {\n  text-decoration: none;\n  border-bottom: 0.5px solid #222222;\n}\n\nbutton {\n  box-sizing: border-box;\n  border: none;\n  background: var(--surface);\n  box-shadow: var(--border-raised-outer), var(--border-raised-inner);\n  border-radius: 0;\n\n  min-width: 75px;\n  min-height: 23px;\n  padding: 0 12px;\n}\n\n.vertical-bar {\n  width: 4px;\n  height: 20px;\n  background: #c0c0c0;\n  box-shadow: var(--border-raised-outer), var(--border-raised-inner);\n}\n\nbutton:not(:disabled):active {\n  box-shadow: var(--border-sunken-outer), var(--border-sunken-inner);\n  padding: 2px 11px 0 13px;\n}\n\n@media (not(hover)) {\n  button:not(:disabled):hover {\n    box-shadow: var(--border-sunken-outer), var(--border-sunken-inner);\n  }\n}\n\nbutton:focus {\n  outline: 1px dotted #000000;\n  outline-offset: -4px;\n}\n\nbutton::-moz-focus-inner {\n  border: 0;\n}\n\n:disabled,\n:disabled + label {\n  color: var(--button-shadow);\n}\n\nbutton:disabled,\n:disabled + label {\n  text-shadow: 1px 1px 0 var(--button-highlight);\n}\n\n.window {\n  box-shadow: var(--border-window-outer), var(--border-window-inner);\n  background: var(--surface);\n  padding: 3px;\n}\n\n.title-bar {\n  background: linear-gradient(\n    90deg,\n    var(--dialog-blue),\n    var(--dialog-blue-light)\n  );\n  padding: 3px 2px 3px 3px;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n\n.title-bar.inactive {\n  background: linear-gradient(\n    90deg,\n    var(--dialog-gray),\n    var(--dialog-gray-light)\n  );\n}\n\n.title-bar-text {\n  font-weight: bold;\n  color: white;\n  letter-spacing: 0;\n  margin-right: 24px;\n}\n\n.title-bar-controls {\n  display: flex;\n}\n\n.title-bar-controls button {\n  padding: 0;\n  display: block;\n  min-width: 16px;\n  min-height: 14px;\n}\n\n.title-bar-controls button:active {\n  padding: 0;\n}\n\n.title-bar-controls button:focus {\n  outline: none;\n}\n\n.title-bar-controls button[aria-label=\"Minimize\"] {\n  background-image: svg-load(\"./icon/minimize.svg\");\n  background-repeat: no-repeat;\n  background-position: bottom 3px left 4px;\n}\n\n.title-bar-controls button[aria-label=\"Maximize\"] {\n  background-image: svg-load(\"./icon/maximize.svg\");\n  background-repeat: no-repeat;\n  background-position: top 2px left 3px;\n}\n\n.title-bar-controls button[aria-label=\"Restore\"] {\n  background-image: svg-load(\"./icon/restore.svg\");\n  background-repeat: no-repeat;\n  background-position: top 2px left 3px;\n}\n\n.title-bar-controls button[aria-label=\"Help\"] {\n  background-image: svg-load(\"./icon/help.svg\");\n  background-repeat: no-repeat;\n  background-position: top 2px left 5px;\n}\n\n.title-bar-controls button[aria-label=\"Close\"] {\n  margin-left: 2px;\n  background-image: svg-load(\"./icon/close.svg\");\n  background-repeat: no-repeat;\n  background-position: top 3px left 4px;\n}\n\n.status-bar {\n  margin: 0px 1px;\n  display: flex;\n  gap: 1px;\n}\n\n.status-bar-field {\n  box-shadow: inset -1px -1px  #dfdfdf, \n    inset 1px 1px #808080;\n  flex-grow: 1;\n  padding: 2px 3px;\n  margin: 0;\n}\n\n.window-body {\n  margin: var(--element-spacing);\n}\n*/\n\nfieldset {\n  border-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='5' height='5' viewBox='0 0 5 5' fill='grey' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 0H5V5H0V2H2V3H3V2H0' fill='white'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 0H4V4H0V1H1V3H3V1H0' fill='%23808080'/%3E %3C/svg%3E\") 2;\n  padding: calc(2 * var(--border-width) + var(--element-spacing));\n  padding-block-start: var(--element-spacing);\n  margin: 0;\n}\n\nlegend {\n  background: var(--surface);\n}\n\n/* .field-row {\n  display: flex;\n  align-items: center;\n}\n\n[class^=\"field-row\"] + [class^=\"field-row\"] {\n  margin-top: var(--grouped-element-spacing);\n}\n\n.field-row > * + * {\n  margin-left: var(--grouped-element-spacing);\n}\n\n.field-row-stacked {\n  display: flex;\n  flex-direction: column;\n}\n\n.field-row-stacked * + * {\n  margin-top: var(--grouped-element-spacing);\n}\n\n.field-row label {\n  display: inline-flex;\n  align-items: center;\n} */\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  appearance: none;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  margin: 0;\n  background: 100%;\n  position: fixed;\n  opacity: 0;\n  border: none;\n}\n\ninput[type=\"radio\"] + label,\ninput[type=\"checkbox\"] + label {\n  line-height: 13px;\n}\n\ninput[type=\"radio\"] + label {\n  position: relative;\n  margin-right: var(--radio-total-width);\n}\n\ninput[type=\"radio\"] + label::before {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  right: calc(-1 * (var(--radio-total-width-precalc)));\n  display: inline-block;\n  width: var(--radio-width);\n  height: var(--radio-width);\n  margin-left: var(--radio-label-spacing);\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='12' viewBox='0 0 12 12' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 0H4V1H2V2H1V4H0V8H1V10H2V8H1V4H2V2H4V1H8V2H10V1H8V0Z' fill='%23808080'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 1H4V2H2V3V4H1V8H2V9H3V8H2V4H3V3H4V2H8V3H10V2H8V1Z' fill='black'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 3H10V4H9V3ZM10 8V4H11V8H10ZM8 10V9H9V8H10V9V10H8ZM4 10V11H8V10H4ZM4 10V9H2V10H4Z' fill='%23DFDFDF'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11 2H10V4H11V8H10V10H8V11H4V10H2V11H4V12H8V11H10V10H11V8H12V4H11V2Z' fill='white'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M4 2H8V3H9V4H10V8H9V9H8V10H4V9H3V8H2V4H3V3H4V2Z' fill='white'/%3E %3C/svg%3E\");\n}\n\ninput[type=\"radio\"]:active + label::before {\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='12' viewBox='0 0 12 12' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 0H4V1H2V2H1V4H0V8H1V10H2V8H1V4H2V2H4V1H8V2H10V1H8V0Z' fill='%23808080'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 1H4V2H2V3V4H1V8H2V9H3V8H2V4H3V3H4V2H8V3H10V2H8V1Z' fill='black'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 3H10V4H9V3ZM10 8V4H11V8H10ZM8 10V9H9V8H10V9V10H8ZM4 10V11H8V10H4ZM4 10V9H2V10H4Z' fill='%23DFDFDF'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11 2H10V4H11V8H10V10H8V11H4V10H2V11H4V12H8V11H10V10H11V8H12V4H11V2Z' fill='white'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M4 2H8V3H9V4H10V8H9V9H8V10H4V9H3V8H2V4H3V3H4V2Z' fill='%23C0C0C0'/%3E %3C/svg%3E\");\n}\n\ninput[type=\"radio\"]:checked + label::after {\n  content: \"\";\n  display: block;\n  width: var(--radio-dot-width);\n  height: var(--radio-dot-width);\n  top: var(--radio-dot-top);\n  right: var(--radio-dot-left);\n  position: absolute;\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='4' height='4' viewBox='0 0 4 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M3 0H1V1H0V2V3H1V4H3V3H4V2V1H3V0Z' fill='black'/%3E %3C/svg%3E\");\n}\n\ninput[type=\"radio\"]:focus + label,\ninput[type=\"checkbox\"]:focus + label {\n  outline: 1px dotted #000000;\n}\n\ninput[type=\"radio\"][disabled] + label::before {\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='12' viewBox='0 0 12 12' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 0H4V1H2V2H1V4H0V8H1V10H2V8H1V4H2V2H4V1H8V2H10V1H8V0Z' fill='%23808080'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 1H4V2H2V3V4H1V8H2V9H3V8H2V4H3V3H4V2H8V3H10V2H8V1Z' fill='black'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 3H10V4H9V3ZM10 8V4H11V8H10ZM8 10V9H9V8H10V9V10H8ZM4 10V11H8V10H4ZM4 10V9H2V10H4Z' fill='%23DFDFDF'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11 2H10V4H11V8H10V10H8V11H4V10H2V11H4V12H8V11H10V10H11V8H12V4H11V2Z' fill='white'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M4 2H8V3H9V4H10V8H9V9H8V10H4V9H3V8H2V4H3V3H4V2Z' fill='%23C0C0C0'/%3E %3C/svg%3E\");\n}\n\ninput[type=\"radio\"][disabled]:checked + label::after {\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='4' height='4' viewBox='0 0 4 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M3 0H1V1H0V2V3H1V4H3V3H4V2V1H3V0Z' fill='%23808080'/%3E %3C/svg%3E\");\n}\n\ninput[type=\"checkbox\"] + label {\n  position: relative;\n  margin-right: var(--checkbox-total-width);\n}\n\ninput[type=\"checkbox\"] + label::before {\n  content: \"\";\n  position: absolute;\n  right: calc(-1 * (var(--checkbox-total-width-precalc)));\n  display: inline-block;\n  width: var(--checkbox-width);\n  height: var(--checkbox-width);\n  background: var(--Window);\n  box-shadow: var(--border-field);\n  margin-left: var(--radio-label-spacing);\n}\n\ninput[type=\"checkbox\"]:active + label::before {\n  background: var(--surface);\n}\n\ninput[type=\"checkbox\"]:checked + label::after {\n  content: \"\";\n  display: block;\n  width: var(--checkmark-width);\n  height: var(--checkmark-width);\n  position: absolute;\n  top: var(--checkmark-top);\n  right: calc(\n    -1 * (var(--checkbox-total-width-precalc)) + var(--checkmark-left)\n  );\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='7' height='7' viewBox='0 0 7 7' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7 0H6V1H5V2H4V3H3V4H2V3H1V2H0V5H1V6H2V7H3V6H4V5H5V4H6V3H7V0Z' fill='black'/%3E %3C/svg%3E\");\n}\n\ninput[type=\"checkbox\"][disabled] + label::before {\n  background: var(--surface);\n}\n\ninput[type=\"checkbox\"][disabled]:checked + label::after {\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='7' height='7' viewBox='0 0 7 7' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7 0H6V1H5V2H4V3H3V4H2V3H1V2H0V5H1V6H2V7H3V6H4V5H5V4H6V3H7V0Z' fill='%23808080'/%3E %3C/svg%3E\");\n}\n\n/*\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"email\"],\nselect,\ntextarea {\n  padding: 3px 4px;\n  border: none;\n  box-shadow: var(--border-field);\n  background-color: var(--Window);\n  color: var(--WindowText);\n  box-sizing: border-box;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  border-radius: 0;\n}\n\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"email\"],\nselect {\n  height: 21px;\n}\n\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"email\"] {\n  /* For some reason descenders are getting cut off without this *.../\n  line-height: 2;\n}\n\ninput[type=\"text\"]:disabled,\ninput[type=\"password\"]:disabled,\ninput[type=\"email\"]:disabled,\ntextarea:disabled {\n  background-color: var(--surface);\n}\n\nselect {\n  appearance: none;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  position: relative;\n  padding-right: 32px;\n  background-image: svg-load(\"./icon/button-down.svg\");\n  background-position: top 2px right 2px;\n  background-repeat: no-repeat;\n  border-radius: 0;\n}\n\nselect:focus,\ninput[type=\"text\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"email\"]:focus,\ntextarea:focus {\n  outline: none;\n}\n*/\n\ninput[type=\"range\"] {\n  -webkit-appearance: none;\n  width: 100%;\n  background: transparent;\n}\n\ninput[type=\"range\"]:focus {\n  outline: none;\n}\n\ninput[type=\"range\"]::-webkit-slider-thumb {\n  -webkit-appearance: none;\n  height: 21px;\n  width: 11px;\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='21' viewBox='0 0 11 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 0V16H2V18H4V20H5V19H3V17H1V1H10V0Z' fill='white'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M1 1V16H2V17H3V18H4V19H6V18H7V17H8V16H9V1Z' fill='%23C0C7C8'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 1H10V16H8V18H6V20H5V19H7V17H9Z' fill='%2387888F'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10 0H11V16H9V18H7V20H5V21H6V19H8V17H10Z' fill='black'/%3E %3C/svg%3E\");\n  transform: translateY(-8px);\n}\n\ninput[type=\"range\"].has-box-indicator::-webkit-slider-thumb {\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='21' viewBox='0 0 11 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 0V20H1V1H10V0Z' fill='white'/%3E %3Crect x='1' y='1' width='8' height='18' fill='%23C0C7C8'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 1H10V20H1V19H9Z' fill='%2387888F'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10 0H11V21H0V20H10Z' fill='black'/%3E %3C/svg%3E\");\n  transform: translateY(-10px);\n}\n\ninput[type=\"range\"]::-moz-range-thumb {\n  height: 21px;\n  width: 11px;\n  border: 0;\n  border-radius: 0;\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='21' viewBox='0 0 11 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 0V16H2V18H4V20H5V19H3V17H1V1H10V0Z' fill='white'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M1 1V16H2V17H3V18H4V19H6V18H7V17H8V16H9V1Z' fill='%23C0C7C8'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 1H10V16H8V18H6V20H5V19H7V17H9Z' fill='%2387888F'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10 0H11V16H9V18H7V20H5V21H6V19H8V17H10Z' fill='black'/%3E %3C/svg%3E\");\n  transform: translateY(2px);\n}\n\ninput[type=\"range\"].has-box-indicator::-moz-range-thumb {\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='21' viewBox='0 0 11 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 0V20H1V1H10V0Z' fill='white'/%3E %3Crect x='1' y='1' width='8' height='18' fill='%23C0C7C8'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 1H10V20H1V19H9Z' fill='%2387888F'/%3E %3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10 0H11V21H0V20H10Z' fill='black'/%3E %3C/svg%3E\");\n  transform: translateY(0px);\n}\n\ninput[type=\"range\"]::-webkit-slider-runnable-track {\n  width: 100%;\n  height: 2px;\n  box-sizing: border-box;\n  background: black;\n  border-left: 1px solid grey;\n  border-bottom: 1px solid grey;\n  box-shadow: 1px 0 0 white, 1px 1px 0 white, 0 1px 0 white, -1px 0 0 darkgrey,\n    -1px -1px 0 darkgrey, 0 -1px 0 darkgrey, -1px 1px 0 white, 1px -1px darkgrey;\n}\n\ninput[type=\"range\"]::-moz-range-track {\n  width: 100%;\n  height: 2px;\n  box-sizing: border-box;\n  background: black;\n  border-left: 1px solid grey;\n  border-bottom: 1px solid grey;\n  box-shadow: 1px 0 0 white, 1px 1px 0 white, 0 1px 0 white, -1px 0 0 darkgrey,\n    -1px -1px 0 darkgrey, 0 -1px 0 darkgrey, -1px 1px 0 white, 1px -1px darkgrey;\n}\n\n.is-vertical {\n  display: inline-block;\n  width: 4px;\n  height: 150px;\n  transform: translateY(50%);\n}\n\n.is-vertical > input[type=\"range\"] {\n  width: 150px;\n  height: 4px;\n  margin: 0 var(--range-spacing) 0\n    calc(var(--grouped-element-spacing) + var(--range-spacing));\n  transform-origin: right;\n  transform: rotate(-270deg) translateX(calc(-1*(-50% + var(--element-spacing))));\n}\n\n.is-vertical > input[type=\"range\"]::-webkit-slider-runnable-track {\n  border-right: 1px solid grey;\n  border-left: 0;\n  border-bottom: 1px solid grey;\n  box-shadow: -1px 0 0 white, -1px 1px 0 white, 0 1px 0 white, 1px 0 0 darkgrey,\n    1px -1px 0 darkgrey, 0 -1px 0 darkgrey, 1px 1px 0 white, -1px -1px darkgrey;\n}\n\n.is-vertical > input[type=\"range\"]::-moz-range-track {\n  border-right: 1px solid grey;\n  border-left: 0;\n  border-bottom: 1px solid grey;\n  box-shadow: -1px 0 0 white, -1px 1px 0 white, 0 1px 0 white, 1px 0 0 darkgrey,\n    1px -1px 0 darkgrey, 0 -1px 0 darkgrey, 1px 1px 0 white, -1px -1px darkgrey;\n}\n\n.is-vertical > input[type=\"range\"]::-webkit-slider-thumb {\n  transform: translateY(-8px) scaleX(-1);\n}\n\n.is-vertical > input[type=\"range\"].has-box-indicator::-webkit-slider-thumb {\n  transform: translateY(-10px) scaleX(-1);\n}\n\n.is-vertical > input[type=\"range\"]::-moz-range-thumb {\n  transform: translateY(2px) scaleX(-1);\n}\n\n.is-vertical > input[type=\"range\"].has-box-indicator::-moz-range-thumb {\n  transform: translateY(0px) scaleX(-1);\n}\n\n/* select:focus {\n  color: var(--HilightText);\n  background-color: var(--Hilight);\n}\nselect:focus option {\n  color: #000;\n  background-color: #fff;\n}\n\nselect:active {\n  background-image: svg-load(\"./icon/button-down-active.svg\");\n} */\n\n/* a {\n  color: var(--link-blue);\n}\n\na:focus {\n  outline: 1px dotted var(--link-blue);\n} */\n\n/* ul.tree-view {\n  display: block;\n  background: var(--Window);\n  box-shadow: var(--border-field);\n  padding: 6px;\n  margin: 0;\n}\n\nul.tree-view li {\n  list-style-type: none;\n}\n\nul.tree-view a {\n  text-decoration: none;\n  color: #000;\n}\n\nul.tree-view a:focus {\n  background-color: var(--Hilight);\n  color: var(--HilightText);\n}\n\nul.tree-view ul,\nul.tree-view li {\n  margin-top: 3px;\n}\n\nul.tree-view ul {\n  margin-left: 16px;\n  padding-left: 16px;\n  /* Goes down too far *.../\n  border-left: 1px dotted #808080;\n}\n\nul.tree-view ul > li {\n  position: relative;\n}\nul.tree-view ul > li::before {\n  content: \"\";\n  display: block;\n  position: absolute;\n  left: -16px;\n  top: 6px;\n  width: 12px;\n  border-bottom: 1px dotted #808080;\n}\n\n/* Cover the bottom of the left dotted border *.../\nul.tree-view ul > li:last-child::after {\n  content: \"\";\n  display: block;\n  position: absolute;\n  left: -20px;\n  top: 7px;\n  bottom: 0px;\n  width: 8px;\n  background: var(--Window);\n}\n\nul.tree-view details {\n  margin-top: 0;\n}\n\nul.tree-view details[open] summary {\n  margin-bottom: 0;\n}\n\nul.tree-view ul details > summary:before {\n  margin-left: -22px;\n  position: relative;\n  z-index: 1;\n}\n\nul.tree-view details > summary:before {\n  text-align: center;\n  display: block;\n  float: left;\n  content: \"+\";\n  border: 1px solid #808080;\n  width: 8px;\n  height: 9px;\n  line-height: 8px;\n  margin-right: 5px;\n  padding-left: 1px;\n  background-color: #fff;\n}\n\nul.tree-view details[open] > summary:before {\n  content: \"-\";\n} */\n\n/* pre {\n  display: block;\n  background: var(--Window);\n  box-shadow: var(--border-field);\n  padding: 12px 8px;\n  margin: 0;\n}\n\ncode,\ncode * {\n  font-family: monospace;\n}\n\nsummary:focus {\n  outline: 1px dotted #000000;\n} */\n\n/*\n::-webkit-scrollbar {\n  width: 16px;\n}\n::-webkit-scrollbar:horizontal {\n  height: 17px;\n}\n\n::-webkit-scrollbar-corner {\n  background: var(--button-face);\n}\n\n::-webkit-scrollbar-track {\n  background-image: svg-load(\"./icon/scrollbar-background.svg\");\n}\n\n::-webkit-scrollbar-thumb {\n  background-color: var(--button-face);\n  box-shadow: var(--border-raised-outer), var(--border-raised-inner);\n}\n\n::-webkit-scrollbar-button:horizontal:start:decrement,\n::-webkit-scrollbar-button:horizontal:end:increment,\n::-webkit-scrollbar-button:vertical:start:decrement,\n::-webkit-scrollbar-button:vertical:end:increment {\n  display: block;\n}\n\n::-webkit-scrollbar-button:vertical:start {\n  height: 17px;\n  background-image: svg-load(\"./icon/button-up.svg\");\n}\n::-webkit-scrollbar-button:vertical:end {\n  height: 17px;\n  background-image: svg-load(\"./icon/button-down.svg\");\n}\n::-webkit-scrollbar-button:horizontal:start {\n  width: 16px;\n  background-image: svg-load(\"./icon/button-left.svg\");\n}\n::-webkit-scrollbar-button:horizontal:end {\n  width: 16px;\n  background-image: svg-load(\"./icon/button-right.svg\");\n}\n*/"
  },
  {
    "path": "lib/98.css/98.custom-src.css",
    "content": "/**\n * 98.css\n * Copyright (c) 2020 Jordan Scales <thatjdanisso.cool>\n * https://github.com/jdan/98.css/blob/main/LICENSE\n */\n\n:root {\n  /* Color */\n  --surface: var(--ButtonFace, #c0c0c0);\n  --button-highlight: var(--ButtonHilight, #ffffff);\n  --button-face: var(--ButtonFace, #dfdfdf);\n  --button-shadow: var(--ButtonShadow, #808080);\n  --window-frame: var(--WindowFrame, #0a0a0a);\n  --dialog-blue: var(--ActiveTitle, #000080);\n  --dialog-blue-light: var(--GradientActiveTitle, #1084d0);\n  --dialog-gray: var(--InactiveTitle, #808080);\n  --dialog-gray-light: var(--GradientInactiveTitle, #b5b5b5);\n  --link-blue: #0000ff;\n\n  /* Spacing */\n  --element-spacing: 8px;\n  --grouped-button-spacing: 4px;\n  --grouped-element-spacing: 6px;\n  --radio-width: 12px;\n  --checkbox-width: 13px;\n  --radio-label-spacing: 6px;\n  --range-track-height: 4px;\n  --range-spacing: 10px;\n\n  /* Some detailed computations for radio buttons and checkboxes */\n  --radio-total-width-precalc: var(--radio-width) + var(--radio-label-spacing);\n  --radio-total-width: calc(var(--radio-total-width-precalc));\n  --radio-left: calc(-1 * var(--radio-total-width-precalc));\n  --radio-dot-width: 4px;\n  --radio-dot-top: calc(var(--radio-width) / 2 - var(--radio-dot-width) / 2);\n  --radio-dot-left: calc(\n    -1 * (var(--radio-total-width-precalc)) + var(--radio-width) / 2 - var(\n        --radio-dot-width\n      ) / 2\n  );\n\n  --checkbox-total-width-precalc: var(--checkbox-width) +\n    var(--radio-label-spacing);\n  --checkbox-total-width: calc(var(--checkbox-total-width-precalc));\n  --checkbox-left: calc(-1 * var(--checkbox-total-width-precalc));\n  --checkmark-width: 7px;\n  --checkmark-top: 3px;\n  --checkmark-left: 3px;\n\n  /* Borders */\n  --border-width: 1px;\n  /* rtl:ignore */\n  --border-raised-outer: inset -1px -1px var(--window-frame),\n    inset 1px 1px var(--button-highlight);\n  /* rtl:ignore */\n    --border-raised-inner: inset -2px -2px var(--button-shadow),\n    inset 2px 2px var(--button-face);\n  /* rtl:ignore */\n    --border-sunken-outer: inset -1px -1px var(--button-highlight),\n    inset 1px 1px var(--window-frame);\n  /* rtl:ignore */\n    --border-sunken-inner: inset -2px -2px var(--button-face),\n    inset 2px 2px var(--button-shadow);\n\n  /* Window borders flip button-face and button-highlight */\n  /* rtl:ignore */\n  --border-window-outer: inset -1px -1px var(--window-frame),\n    inset 1px 1px var(--button-face);\n  /* rtl:ignore */\n    --border-window-inner: inset -2px -2px var(--button-shadow),\n    inset 2px 2px var(--button-highlight);\n\n  /* Field borders (checkbox, input, etc) flip window-frame and button-shadow */\n  /* rtl:ignore */\n  --border-field: inset -1px -1px var(--button-highlight),\n    inset 1px 1px var(--button-shadow), inset -2px -2px var(--button-face),\n    inset 2px 2px var(--window-frame);\n}\n\n/* \n@font-face {\n  font-family: \"Pixelated MS Sans Serif\";\n  src: url(\"fonts/converted/ms_sans_serif.woff\") format(\"woff\");\n  src: url(\"fonts/converted/ms_sans_serif.woff2\") format(\"woff2\");\n  font-weight: normal;\n  font-style: normal;\n}\n\n@font-face {\n  font-family: \"Pixelated MS Sans Serif\";\n  src: url(\"fonts/converted/ms_sans_serif_bold.woff\") format(\"woff\");\n  src: url(\"fonts/converted/ms_sans_serif_bold.woff2\") format(\"woff2\");\n  font-weight: bold;\n  font-style: normal;\n}\n\nbody {\n  font-family: Arial;\n  font-size: 12px;\n  color: #222222;\n}\n\nbutton,\nlabel,\ninput,\ntextarea,\nselect,\noption,\nul.tree-view,\n.window,\n.title-bar {\n  font-family: \"Pixelated MS Sans Serif\", Arial;\n  -webkit-font-smoothing: none;\n  font-size: 11px;\n}\n\nh1 {\n  font-size: 5rem;\n}\n\nh2 {\n  font-size: 2.5rem;\n}\n\nh3 {\n  font-size: 2rem;\n}\n\nh4 {\n  font-size: 1.5rem;\n}\n\nu {\n  text-decoration: none;\n  border-bottom: 0.5px solid #222222;\n}\n\nbutton {\n  box-sizing: border-box;\n  border: none;\n  background: var(--surface);\n  box-shadow: var(--border-raised-outer), var(--border-raised-inner);\n  border-radius: 0;\n\n  min-width: 75px;\n  min-height: 23px;\n  padding: 0 12px;\n}\n\n.vertical-bar {\n  width: 4px;\n  height: 20px;\n  background: #c0c0c0;\n  box-shadow: var(--border-raised-outer), var(--border-raised-inner);\n}\n\nbutton:not(:disabled):active {\n  box-shadow: var(--border-sunken-outer), var(--border-sunken-inner);\n  padding: 2px 11px 0 13px;\n}\n\n@media (not(hover)) {\n  button:not(:disabled):hover {\n    box-shadow: var(--border-sunken-outer), var(--border-sunken-inner);\n  }\n}\n\nbutton:focus {\n  outline: 1px dotted #000000;\n  outline-offset: -4px;\n}\n\nbutton::-moz-focus-inner {\n  border: 0;\n}\n\n:disabled,\n:disabled + label {\n  color: var(--button-shadow);\n}\n\nbutton:disabled,\n:disabled + label {\n  text-shadow: 1px 1px 0 var(--button-highlight);\n}\n\n.window {\n  box-shadow: var(--border-window-outer), var(--border-window-inner);\n  background: var(--surface);\n  padding: 3px;\n}\n\n.title-bar {\n  background: linear-gradient(\n    90deg,\n    var(--dialog-blue),\n    var(--dialog-blue-light)\n  );\n  padding: 3px 2px 3px 3px;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n\n.title-bar.inactive {\n  background: linear-gradient(\n    90deg,\n    var(--dialog-gray),\n    var(--dialog-gray-light)\n  );\n}\n\n.title-bar-text {\n  font-weight: bold;\n  color: white;\n  letter-spacing: 0;\n  margin-right: 24px;\n}\n\n.title-bar-controls {\n  display: flex;\n}\n\n.title-bar-controls button {\n  padding: 0;\n  display: block;\n  min-width: 16px;\n  min-height: 14px;\n}\n\n.title-bar-controls button:active {\n  padding: 0;\n}\n\n.title-bar-controls button:focus {\n  outline: none;\n}\n\n.title-bar-controls button[aria-label=\"Minimize\"] {\n  background-image: svg-load(\"./icon/minimize.svg\");\n  background-repeat: no-repeat;\n  background-position: bottom 3px left 4px;\n}\n\n.title-bar-controls button[aria-label=\"Maximize\"] {\n  background-image: svg-load(\"./icon/maximize.svg\");\n  background-repeat: no-repeat;\n  background-position: top 2px left 3px;\n}\n\n.title-bar-controls button[aria-label=\"Restore\"] {\n  background-image: svg-load(\"./icon/restore.svg\");\n  background-repeat: no-repeat;\n  background-position: top 2px left 3px;\n}\n\n.title-bar-controls button[aria-label=\"Help\"] {\n  background-image: svg-load(\"./icon/help.svg\");\n  background-repeat: no-repeat;\n  background-position: top 2px left 5px;\n}\n\n.title-bar-controls button[aria-label=\"Close\"] {\n  margin-left: 2px;\n  background-image: svg-load(\"./icon/close.svg\");\n  background-repeat: no-repeat;\n  background-position: top 3px left 4px;\n}\n\n.status-bar {\n  margin: 0px 1px;\n  display: flex;\n  gap: 1px;\n}\n\n.status-bar-field {\n  box-shadow: inset -1px -1px  #dfdfdf, \n    inset 1px 1px #808080;\n  flex-grow: 1;\n  padding: 2px 3px;\n  margin: 0;\n}\n\n.window-body {\n  margin: var(--element-spacing);\n}\n*/\n\nfieldset {\n  border-image: svg-load(\"./icon/groupbox-border.svg\") 2;\n  padding: calc(2 * var(--border-width) + var(--element-spacing));\n  padding-block-start: var(--element-spacing);\n  margin: 0;\n}\n\nlegend {\n  background: var(--surface);\n}\n\n/* .field-row {\n  display: flex;\n  align-items: center;\n}\n\n[class^=\"field-row\"] + [class^=\"field-row\"] {\n  margin-top: var(--grouped-element-spacing);\n}\n\n.field-row > * + * {\n  margin-left: var(--grouped-element-spacing);\n}\n\n.field-row-stacked {\n  display: flex;\n  flex-direction: column;\n}\n\n.field-row-stacked * + * {\n  margin-top: var(--grouped-element-spacing);\n}\n\n.field-row label {\n  display: inline-flex;\n  align-items: center;\n} */\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  appearance: none;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  margin: 0;\n  background: 0;\n  position: fixed;\n  opacity: 0;\n  border: none;\n}\n\ninput[type=\"radio\"] + label,\ninput[type=\"checkbox\"] + label {\n  line-height: 13px;\n}\n\ninput[type=\"radio\"] + label {\n  position: relative;\n  margin-left: var(--radio-total-width);\n}\n\ninput[type=\"radio\"] + label::before {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  left: calc(-1 * (var(--radio-total-width-precalc)));\n  display: inline-block;\n  width: var(--radio-width);\n  height: var(--radio-width);\n  margin-right: var(--radio-label-spacing);\n  background: svg-load(\"./icon/radio-border.svg\");\n}\n\ninput[type=\"radio\"]:active + label::before {\n  background: svg-load(\"./icon/radio-border-disabled.svg\");\n}\n\ninput[type=\"radio\"]:checked + label::after {\n  content: \"\";\n  display: block;\n  width: var(--radio-dot-width);\n  height: var(--radio-dot-width);\n  top: var(--radio-dot-top);\n  left: var(--radio-dot-left);\n  position: absolute;\n  background: svg-load(\"./icon/radio-dot.svg\");\n}\n\ninput[type=\"radio\"]:focus + label,\ninput[type=\"checkbox\"]:focus + label {\n  outline: 1px dotted #000000;\n}\n\ninput[type=\"radio\"][disabled] + label::before {\n  background: svg-load(\"./icon/radio-border-disabled.svg\");\n}\n\ninput[type=\"radio\"][disabled]:checked + label::after {\n  background: svg-load(\"./icon/radio-dot-disabled.svg\");\n}\n\ninput[type=\"checkbox\"] + label {\n  position: relative;\n  margin-left: var(--checkbox-total-width);\n}\n\ninput[type=\"checkbox\"] + label::before {\n  content: \"\";\n  position: absolute;\n  left: calc(-1 * (var(--checkbox-total-width-precalc)));\n  display: inline-block;\n  width: var(--checkbox-width);\n  height: var(--checkbox-width);\n  background: var(--Window);\n  box-shadow: var(--border-field);\n  margin-right: var(--radio-label-spacing);\n}\n\ninput[type=\"checkbox\"]:active + label::before {\n  background: var(--surface);\n}\n\ninput[type=\"checkbox\"]:checked + label::after {\n  content: \"\";\n  display: block;\n  width: var(--checkmark-width);\n  height: var(--checkmark-width);\n  position: absolute;\n  top: var(--checkmark-top);\n  left: calc(\n    -1 * (var(--checkbox-total-width-precalc)) + var(--checkmark-left)\n  );\n  background: svg-load(\"./icon/checkmark.svg\");\n}\n\ninput[type=\"checkbox\"][disabled] + label::before {\n  background: var(--surface);\n}\n\ninput[type=\"checkbox\"][disabled]:checked + label::after {\n  background: svg-load(\"./icon/checkmark-disabled.svg\");\n}\n\n/*\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"email\"],\nselect,\ntextarea {\n  padding: 3px 4px;\n  border: none;\n  box-shadow: var(--border-field);\n  background-color: var(--Window);\n  color: var(--WindowText);\n  box-sizing: border-box;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  border-radius: 0;\n}\n\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"email\"],\nselect {\n  height: 21px;\n}\n\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"email\"] {\n  /* For some reason descenders are getting cut off without this *.../\n  line-height: 2;\n}\n\ninput[type=\"text\"]:disabled,\ninput[type=\"password\"]:disabled,\ninput[type=\"email\"]:disabled,\ntextarea:disabled {\n  background-color: var(--surface);\n}\n\nselect {\n  appearance: none;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  position: relative;\n  padding-right: 32px;\n  background-image: svg-load(\"./icon/button-down.svg\");\n  background-position: top 2px right 2px;\n  background-repeat: no-repeat;\n  border-radius: 0;\n}\n\nselect:focus,\ninput[type=\"text\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"email\"]:focus,\ntextarea:focus {\n  outline: none;\n}\n*/\n\ninput[type=\"range\"] {\n  -webkit-appearance: none;\n  width: 100%;\n  background: transparent;\n}\n\ninput[type=\"range\"]:focus {\n  outline: none;\n}\n\ninput[type=\"range\"]::-webkit-slider-thumb {\n  -webkit-appearance: none;\n  height: 21px;\n  width: 11px;\n  background: svg-load(\"./icon/indicator-horizontal.svg\");\n  transform: translateY(-8px);\n}\n\ninput[type=\"range\"].has-box-indicator::-webkit-slider-thumb {\n  background: svg-load(\"./icon/indicator-rectangle-horizontal.svg\");\n  transform: translateY(-10px);\n}\n\ninput[type=\"range\"]::-moz-range-thumb {\n  height: 21px;\n  width: 11px;\n  border: 0;\n  border-radius: 0;\n  background: svg-load(\"./icon/indicator-horizontal.svg\");\n  transform: translateY(2px);\n}\n\ninput[type=\"range\"].has-box-indicator::-moz-range-thumb {\n  background: svg-load(\"./icon/indicator-rectangle-horizontal.svg\");\n  transform: translateY(0px);\n}\n\ninput[type=\"range\"]::-webkit-slider-runnable-track {\n  width: 100%;\n  height: 2px;\n  box-sizing: border-box;\n  background: black;\n  border-right: 1px solid grey;\n  border-bottom: 1px solid grey;\n  /* rtl:ignore */\n  box-shadow: 1px 0 0 white, 1px 1px 0 white, 0 1px 0 white, -1px 0 0 darkgrey,\n    -1px -1px 0 darkgrey, 0 -1px 0 darkgrey, -1px 1px 0 white, 1px -1px darkgrey;\n}\n\ninput[type=\"range\"]::-moz-range-track {\n  width: 100%;\n  height: 2px;\n  box-sizing: border-box;\n  background: black;\n  border-right: 1px solid grey;\n  border-bottom: 1px solid grey;\n  /* rtl:ignore */\n  box-shadow: 1px 0 0 white, 1px 1px 0 white, 0 1px 0 white, -1px 0 0 darkgrey,\n    -1px -1px 0 darkgrey, 0 -1px 0 darkgrey, -1px 1px 0 white, 1px -1px darkgrey;\n}\n\n.is-vertical {\n  display: inline-block;\n  width: 4px;\n  height: 150px;\n  transform: translateY(50%);\n}\n\n.is-vertical > input[type=\"range\"] {\n  width: 150px;\n  height: 4px;\n  margin: 0 calc(var(--grouped-element-spacing) + var(--range-spacing)) 0\n    var(--range-spacing);\n  transform-origin: left;\n  transform: rotate(270deg) translateX(calc(-50% + var(--element-spacing)));\n}\n\n.is-vertical > input[type=\"range\"]::-webkit-slider-runnable-track {\n  border-left: 1px solid grey;\n  border-right: 0;\n  border-bottom: 1px solid grey;\n  /* rtl:ignore */\n  box-shadow: -1px 0 0 white, -1px 1px 0 white, 0 1px 0 white, 1px 0 0 darkgrey,\n    1px -1px 0 darkgrey, 0 -1px 0 darkgrey, 1px 1px 0 white, -1px -1px darkgrey;\n}\n\n.is-vertical > input[type=\"range\"]::-moz-range-track {\n  border-left: 1px solid grey;\n  border-right: 0;\n  border-bottom: 1px solid grey;\n  /* rtl:ignore */\n  box-shadow: -1px 0 0 white, -1px 1px 0 white, 0 1px 0 white, 1px 0 0 darkgrey,\n    1px -1px 0 darkgrey, 0 -1px 0 darkgrey, 1px 1px 0 white, -1px -1px darkgrey;\n}\n\n.is-vertical > input[type=\"range\"]::-webkit-slider-thumb {\n  transform: translateY(-8px) scaleX(-1);\n}\n\n.is-vertical > input[type=\"range\"].has-box-indicator::-webkit-slider-thumb {\n  transform: translateY(-10px) scaleX(-1);\n}\n\n.is-vertical > input[type=\"range\"]::-moz-range-thumb {\n  transform: translateY(2px) scaleX(-1);\n}\n\n.is-vertical > input[type=\"range\"].has-box-indicator::-moz-range-thumb {\n  transform: translateY(0px) scaleX(-1);\n}\n\n/* select:focus {\n  color: var(--HilightText);\n  background-color: var(--Hilight);\n}\nselect:focus option {\n  color: #000;\n  background-color: #fff;\n}\n\nselect:active {\n  background-image: svg-load(\"./icon/button-down-active.svg\");\n} */\n\n/* a {\n  color: var(--link-blue);\n}\n\na:focus {\n  outline: 1px dotted var(--link-blue);\n} */\n\n/* ul.tree-view {\n  display: block;\n  background: var(--Window);\n  box-shadow: var(--border-field);\n  padding: 6px;\n  margin: 0;\n}\n\nul.tree-view li {\n  list-style-type: none;\n}\n\nul.tree-view a {\n  text-decoration: none;\n  color: #000;\n}\n\nul.tree-view a:focus {\n  background-color: var(--Hilight);\n  color: var(--HilightText);\n}\n\nul.tree-view ul,\nul.tree-view li {\n  margin-top: 3px;\n}\n\nul.tree-view ul {\n  margin-left: 16px;\n  padding-left: 16px;\n  /* Goes down too far *.../\n  border-left: 1px dotted #808080;\n}\n\nul.tree-view ul > li {\n  position: relative;\n}\nul.tree-view ul > li::before {\n  content: \"\";\n  display: block;\n  position: absolute;\n  left: -16px;\n  top: 6px;\n  width: 12px;\n  border-bottom: 1px dotted #808080;\n}\n\n/* Cover the bottom of the left dotted border *.../\nul.tree-view ul > li:last-child::after {\n  content: \"\";\n  display: block;\n  position: absolute;\n  left: -20px;\n  top: 7px;\n  bottom: 0px;\n  width: 8px;\n  background: var(--Window);\n}\n\nul.tree-view details {\n  margin-top: 0;\n}\n\nul.tree-view details[open] summary {\n  margin-bottom: 0;\n}\n\nul.tree-view ul details > summary:before {\n  margin-left: -22px;\n  position: relative;\n  z-index: 1;\n}\n\nul.tree-view details > summary:before {\n  text-align: center;\n  display: block;\n  float: left;\n  content: \"+\";\n  border: 1px solid #808080;\n  width: 8px;\n  height: 9px;\n  line-height: 8px;\n  margin-right: 5px;\n  padding-left: 1px;\n  background-color: #fff;\n}\n\nul.tree-view details[open] > summary:before {\n  content: \"-\";\n} */\n\n/* pre {\n  display: block;\n  background: var(--Window);\n  box-shadow: var(--border-field);\n  padding: 12px 8px;\n  margin: 0;\n}\n\ncode,\ncode * {\n  font-family: monospace;\n}\n\nsummary:focus {\n  outline: 1px dotted #000000;\n} */\n\n/*\n::-webkit-scrollbar {\n  width: 16px;\n}\n::-webkit-scrollbar:horizontal {\n  height: 17px;\n}\n\n::-webkit-scrollbar-corner {\n  background: var(--button-face);\n}\n\n::-webkit-scrollbar-track {\n  background-image: svg-load(\"./icon/scrollbar-background.svg\");\n}\n\n::-webkit-scrollbar-thumb {\n  background-color: var(--button-face);\n  box-shadow: var(--border-raised-outer), var(--border-raised-inner);\n}\n\n::-webkit-scrollbar-button:horizontal:start:decrement,\n::-webkit-scrollbar-button:horizontal:end:increment,\n::-webkit-scrollbar-button:vertical:start:decrement,\n::-webkit-scrollbar-button:vertical:end:increment {\n  display: block;\n}\n\n::-webkit-scrollbar-button:vertical:start {\n  height: 17px;\n  background-image: svg-load(\"./icon/button-up.svg\");\n}\n::-webkit-scrollbar-button:vertical:end {\n  height: 17px;\n  background-image: svg-load(\"./icon/button-down.svg\");\n}\n::-webkit-scrollbar-button:horizontal:start {\n  width: 16px;\n  background-image: svg-load(\"./icon/button-left.svg\");\n}\n::-webkit-scrollbar-button:horizontal:end {\n  width: 16px;\n  background-image: svg-load(\"./icon/button-right.svg\");\n}\n*/\n"
  },
  {
    "path": "lib/98.css/modified-build.js",
    "content": "#!/usr/bin/env node\nconst dedent = require(\"dedent\");\nconst ejs = require(\"ejs\");\nconst fs = require(\"fs\");\nconst glob = require(\"glob\");\nconst hljs = require(\"highlight.js\");\nconst mkdirp = require(\"mkdirp\");\nconst path = require(\"path\");\nconst postcss = require(\"postcss\");\n\nconst { homepage, version } = require(\"./package.json\");\n\nfunction buildCSS() {\n  const input =\n    `/*! 98.css custom build - ${homepage} */\\n` + fs.readFileSync(\"style.css\");\n\n  return postcss()\n    .use(require(\"postcss-inline-svg\"))\n    // .use(require(\"postcss-css-variables\"))\n    // .use(require(\"postcss-calc\"))\n    .use(require(\"postcss-copy\")({ dest: \"dist\", template: \"[name].[ext]\" }))\n    // .use(require(\"cssnano\"))\n    .process(input, {\n      from: \"style.css\",\n      to: \"dist/98.custom-build.css\",\n      map: { inline: false },\n    })\n    .then((result) => {\n      mkdirp.sync(\"dist\");\n      fs.writeFileSync(\"dist/98.custom-build.css\", result.css);\n      fs.writeFileSync(\"dist/98.custom-build.css.map\", result.map.toString());\n    });\n}\n\nfunction buildDocs() {\n  let id = 0;\n  function getNewId() {\n    return ++id;\n  }\n  function getCurrentId() {\n    return id;\n  }\n\n  const template = fs.readFileSync(\"docs/index.html.ejs\", \"utf-8\");\n  function example(code) {\n    const magicBrackets = /\\[\\[(.*)\\]\\]/g;\n    const dedented = dedent(code);\n    const inline = dedented.replace(magicBrackets, \"$1\");\n    const escaped = hljs.highlight(\"html\", dedented.replace(magicBrackets, \"\"))\n      .value;\n\n    return `<div class=\"example\">\n      ${inline}\n      <details>\n        <summary>Show code</summary>\n        <pre><code>${escaped}</code></pre>\n      </details>\n    </div>`;\n  }\n\n  glob(\"docs/*\", (err, files) => {\n    if (!err) {\n      files.forEach((srcFile) =>\n        fs.copyFileSync(srcFile, path.join(\"dist\", path.basename(srcFile)))\n      );\n    } else throw \"error globbing dist directory.\";\n  });\n  fs.writeFileSync(\n    path.join(__dirname, \"/dist/index.html\"),\n    ejs.render(template, { getNewId, getCurrentId, example })\n  );\n}\n\nfunction build() {\n  buildCSS()\n    .then(buildDocs)\n    .catch((err) => console.log(err));\n}\nmodule.exports = build;\n\nbuild();\n"
  },
  {
    "path": "lib/FileSaver.js",
    "content": "(function (global, factory) {\n  if (typeof define === \"function\" && define.amd) {\n    define([], factory);\n  } else if (typeof exports !== \"undefined\") {\n    factory();\n  } else {\n    var mod = {\n      exports: {}\n    };\n    factory();\n    global.FileSaver = mod.exports;\n  }\n})(this, function () {\n  \"use strict\";\n\n  /*\n  * FileSaver.js\n  * A saveAs() FileSaver implementation.\n  *\n  * By Eli Grey, http://eligrey.com\n  *\n  * License : https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md (MIT)\n  * source  : http://purl.eligrey.com/github/FileSaver.js\n  */\n  // The one and only way of getting global scope in all environments\n  // https://stackoverflow.com/q/3277182/1008999\n  var _global = typeof window === 'object' && window.window === window ? window : typeof self === 'object' && self.self === self ? self : typeof global === 'object' && global.global === global ? global : void 0;\n\n  function bom(blob, opts) {\n    if (typeof opts === 'undefined') opts = {\n      autoBom: false\n    };else if (typeof opts !== 'object') {\n      console.warn('Deprecated: Expected third argument to be a object');\n      opts = {\n        autoBom: !opts\n      };\n    } // prepend BOM for UTF-8 XML and text/* types (including HTML)\n    // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF\n\n    if (opts.autoBom && /^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(blob.type)) {\n      return new Blob([String.fromCharCode(0xFEFF), blob], {\n        type: blob.type\n      });\n    }\n\n    return blob;\n  }\n\n  function download(url, name, opts) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url);\n    xhr.responseType = 'blob';\n\n    xhr.onload = function () {\n      saveAs(xhr.response, name, opts);\n    };\n\n    xhr.onerror = function () {\n      console.error('could not download file');\n    };\n\n    xhr.send();\n  }\n\n  function corsEnabled(url) {\n    var xhr = new XMLHttpRequest(); // use sync to avoid popup blocker\n\n    xhr.open('HEAD', url, false);\n\n    try {\n      xhr.send();\n    } catch (e) {}\n\n    return xhr.status >= 200 && xhr.status <= 299;\n  } // `a.click()` doesn't work for all browsers (#465)\n\n\n  function click(node) {\n    try {\n      node.dispatchEvent(new MouseEvent('click'));\n    } catch (e) {\n      var evt = document.createEvent('MouseEvents');\n      evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null);\n      node.dispatchEvent(evt);\n    }\n  } // Detect WebView inside a native macOS app by ruling out all browsers\n  // We just need to check for 'Safari' because all other browsers (besides Firefox) include that too\n  // https://www.whatismybrowser.com/guides/the-latest-user-agent/macos\n\n\n  var isMacOSWebView = /Macintosh/.test(navigator.userAgent) && /AppleWebKit/.test(navigator.userAgent) && !/Safari/.test(navigator.userAgent);\n  var saveAs = _global.saveAs || ( // probably in some web worker\n  typeof window !== 'object' || window !== _global ? function saveAs() {}\n  /* noop */\n  // Use download attribute first if possible (#193 Lumia mobile) unless this is a macOS WebView\n  : 'download' in HTMLAnchorElement.prototype && !isMacOSWebView ? function saveAs(blob, name, opts) {\n    var URL = _global.URL || _global.webkitURL;\n    var a = document.createElement('a');\n    name = name || blob.name || 'download';\n    a.download = name;\n    a.rel = 'noopener'; // tabnabbing\n    // TODO: detect chrome extensions & packaged apps\n    // a.target = '_blank'\n\n    if (typeof blob === 'string') {\n      // Support regular links\n      a.href = blob;\n\n      if (a.origin !== location.origin) {\n        corsEnabled(a.href) ? download(blob, name, opts) : click(a, a.target = '_blank');\n      } else {\n        click(a);\n      }\n    } else {\n      // Support blobs\n      a.href = URL.createObjectURL(blob);\n      setTimeout(function () {\n        URL.revokeObjectURL(a.href);\n      }, 4E4); // 40s\n\n      setTimeout(function () {\n        click(a);\n      }, 0);\n    }\n  } // Use msSaveOrOpenBlob as a second approach\n  : 'msSaveOrOpenBlob' in navigator ? function saveAs(blob, name, opts) {\n    name = name || blob.name || 'download';\n\n    if (typeof blob === 'string') {\n      if (corsEnabled(blob)) {\n        download(blob, name, opts);\n      } else {\n        var a = document.createElement('a');\n        a.href = blob;\n        a.target = '_blank';\n        setTimeout(function () {\n          click(a);\n        });\n      }\n    } else {\n      navigator.msSaveOrOpenBlob(bom(blob, opts), name);\n    }\n  } // Fallback to using FileReader and a popup\n  : function saveAs(blob, name, opts, popup) {\n    // Open a popup immediately do go around popup blocker\n    // Mostly only available on user interaction and the fileReader is async so...\n    popup = popup || open('', '_blank');\n\n    if (popup) {\n      popup.document.title = popup.document.body.innerText = 'downloading...';\n    }\n\n    if (typeof blob === 'string') return download(blob, name, opts);\n    var force = blob.type === 'application/octet-stream';\n\n    var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari;\n\n    var isChromeIOS = /CriOS\\/[\\d]+/.test(navigator.userAgent);\n\n    if ((isChromeIOS || force && isSafari || isMacOSWebView) && typeof FileReader !== 'undefined') {\n      // Safari doesn't allow downloading of blob URLs\n      var reader = new FileReader();\n\n      reader.onloadend = function () {\n        var url = reader.result;\n        url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, 'data:attachment/file;');\n        if (popup) popup.location.href = url;else location = url;\n        popup = null; // reverse-tabnabbing #460\n      };\n\n      reader.readAsDataURL(blob);\n    } else {\n      var URL = _global.URL || _global.webkitURL;\n      var url = URL.createObjectURL(blob);\n      if (popup) popup.location = url;else location.href = url;\n      popup = null; // reverse-tabnabbing #460\n\n      setTimeout(function () {\n        URL.revokeObjectURL(url);\n      }, 4E4); // 40s\n    }\n  });\n  _global.saveAs = saveAs.saveAs = saveAs;\n\n  if (typeof module !== 'undefined') {\n    module.exports = saveAs;\n  }\n});\n"
  },
  {
    "path": "lib/UPNG.js",
    "content": "\nvar UPNG = {};\n\n\t\n\nUPNG.toRGBA8 = function(out)\n{\n\tvar w = out.width, h = out.height;\n\tif(out.tabs.acTL==null) return [UPNG.toRGBA8.decodeImage(out.data, w, h, out).buffer];\n\t\n\tvar frms = [];\n\tif(out.frames[0].data==null) out.frames[0].data = out.data;\n\t\n\tvar len = w*h*4, img = new Uint8Array(len), empty = new Uint8Array(len), prev=new Uint8Array(len);\n\tfor(var i=0; i<out.frames.length; i++)\n\t{\n\t\tvar frm = out.frames[i];\n\t\tvar fx=frm.rect.x, fy=frm.rect.y, fw = frm.rect.width, fh = frm.rect.height;\n\t\tvar fdata = UPNG.toRGBA8.decodeImage(frm.data, fw,fh, out);\n\t\t\n\t\tif(i!=0) for(var j=0; j<len; j++) prev[j]=img[j];\n\t\t\n\t\tif     (frm.blend==0) UPNG._copyTile(fdata, fw, fh, img, w, h, fx, fy, 0);\n\t\telse if(frm.blend==1) UPNG._copyTile(fdata, fw, fh, img, w, h, fx, fy, 1);\n\t\t\n\t\tfrms.push(img.buffer.slice(0));\n\t\t\n\t\tif     (frm.dispose==0) {}\n\t\telse if(frm.dispose==1) UPNG._copyTile(empty, fw, fh, img, w, h, fx, fy, 0);\n\t\telse if(frm.dispose==2) for(var j=0; j<len; j++) img[j]=prev[j];\n\t}\n\treturn frms;\n}\nUPNG.toRGBA8.decodeImage = function(data, w, h, out)\n{\n\tvar area = w*h, bpp = UPNG.decode._getBPP(out);\n\tvar bpl = Math.ceil(w*bpp/8);\t// bytes per line\n\n\tvar bf = new Uint8Array(area*4), bf32 = new Uint32Array(bf.buffer);\n\tvar ctype = out.ctype, depth = out.depth;\n\tvar rs = UPNG._bin.readUshort;\n\t\n\t//console.log(ctype, depth);\n\tvar time = Date.now();\n\n\tif     (ctype==6) { // RGB + alpha\n\t\tvar qarea = area<<2;\n\t\tif(depth== 8) for(var i=0; i<qarea;i+=4) {  bf[i] = data[i];  bf[i+1] = data[i+1];  bf[i+2] = data[i+2];  bf[i+3] = data[i+3]; }\n\t\tif(depth==16) for(var i=0; i<qarea;i++ ) {  bf[i] = data[i<<1];  }\n\t}\n\telse if(ctype==2) {\t// RGB\n\t\tvar ts=out.tabs[\"tRNS\"];\n\t\tif(ts==null) {\n\t\t\tif(depth== 8) for(var i=0; i<area; i++) {  var ti=i*3;  bf32[i] = (255<<24)|(data[ti+2]<<16)|(data[ti+1]<<8)|data[ti];  }\n\t\t\tif(depth==16) for(var i=0; i<area; i++) {  var ti=i*6;  bf32[i] = (255<<24)|(data[ti+4]<<16)|(data[ti+2]<<8)|data[ti];  }\n\t\t}\n\t\telse {  var tr=ts[0], tg=ts[1], tb=ts[2];\n\t\t\tif(depth== 8) for(var i=0; i<area; i++) {  var qi=i<<2, ti=i*3;  bf32[i] = (255<<24)|(data[ti+2]<<16)|(data[ti+1]<<8)|data[ti];\n\t\t\t\tif(data[ti]   ==tr && data[ti+1]   ==tg && data[ti+2]   ==tb) bf[qi+3] = 0;  }\n\t\t\tif(depth==16) for(var i=0; i<area; i++) {  var qi=i<<2, ti=i*6;  bf32[i] = (255<<24)|(data[ti+4]<<16)|(data[ti+2]<<8)|data[ti];\n\t\t\t\tif(rs(data,ti)==tr && rs(data,ti+2)==tg && rs(data,ti+4)==tb) bf[qi+3] = 0;  }\n\t\t}\n\t}\n\telse if(ctype==3) {\t// palette\n\t\tvar p=out.tabs[\"PLTE\"], ap=out.tabs[\"tRNS\"], tl=ap?ap.length:0;\n\t\t//console.log(p, ap);\n\t\tif(depth==1) for(var y=0; y<h; y++) {  var s0 = y*bpl, t0 = y*w;\n\t\t\tfor(var i=0; i<w; i++) { var qi=(t0+i)<<2, j=((data[s0+(i>>3)]>>(7-((i&7)<<0)))& 1), cj=3*j;  bf[qi]=p[cj];  bf[qi+1]=p[cj+1];  bf[qi+2]=p[cj+2];  bf[qi+3]=(j<tl)?ap[j]:255;  }\n\t\t}\n\t\tif(depth==2) for(var y=0; y<h; y++) {  var s0 = y*bpl, t0 = y*w;\n\t\t\tfor(var i=0; i<w; i++) { var qi=(t0+i)<<2, j=((data[s0+(i>>2)]>>(6-((i&3)<<1)))& 3), cj=3*j;  bf[qi]=p[cj];  bf[qi+1]=p[cj+1];  bf[qi+2]=p[cj+2];  bf[qi+3]=(j<tl)?ap[j]:255;  }\n\t\t}\n\t\tif(depth==4) for(var y=0; y<h; y++) {  var s0 = y*bpl, t0 = y*w;\n\t\t\tfor(var i=0; i<w; i++) { var qi=(t0+i)<<2, j=((data[s0+(i>>1)]>>(4-((i&1)<<2)))&15), cj=3*j;  bf[qi]=p[cj];  bf[qi+1]=p[cj+1];  bf[qi+2]=p[cj+2];  bf[qi+3]=(j<tl)?ap[j]:255;  }\n\t\t}\n\t\tif(depth==8) for(var i=0; i<area; i++ ) {  var qi=i<<2, j=data[i]                      , cj=3*j;  bf[qi]=p[cj];  bf[qi+1]=p[cj+1];  bf[qi+2]=p[cj+2];  bf[qi+3]=(j<tl)?ap[j]:255;  }\n\t}\n\telse if(ctype==4) {\t// gray + alpha\n\t\tif(depth== 8)  for(var i=0; i<area; i++) {  var qi=i<<2, di=i<<1, gr=data[di];  bf[qi]=gr;  bf[qi+1]=gr;  bf[qi+2]=gr;  bf[qi+3]=data[di+1];  }\n\t\tif(depth==16)  for(var i=0; i<area; i++) {  var qi=i<<2, di=i<<2, gr=data[di];  bf[qi]=gr;  bf[qi+1]=gr;  bf[qi+2]=gr;  bf[qi+3]=data[di+2];  }\n\t}\n\telse if(ctype==0) {\t// gray\n\t\tvar tr = out.tabs[\"tRNS\"] ? out.tabs[\"tRNS\"] : -1;\n\t\tfor(var y=0; y<h; y++) {\n\t\t\tvar off = y*bpl, to = y*w;\n\t\t\tif     (depth== 1) for(var x=0; x<w; x++) {  var gr=255*((data[off+(x>>>3)]>>>(7 -((x&7)   )))& 1), al=(gr==tr*255)?0:255;  bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr;  }\n\t\t\telse if(depth== 2) for(var x=0; x<w; x++) {  var gr= 85*((data[off+(x>>>2)]>>>(6 -((x&3)<<1)))& 3), al=(gr==tr* 85)?0:255;  bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr;  }\n\t\t\telse if(depth== 4) for(var x=0; x<w; x++) {  var gr= 17*((data[off+(x>>>1)]>>>(4 -((x&1)<<2)))&15), al=(gr==tr* 17)?0:255;  bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr;  }\n\t\t\telse if(depth== 8) for(var x=0; x<w; x++) {  var gr=data[off+     x], al=(gr                 ==tr)?0:255;  bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr;  }\n\t\t\telse if(depth==16) for(var x=0; x<w; x++) {  var gr=data[off+(x<<1)], al=(rs(data,off+(x<<i))==tr)?0:255;  bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr;  }\n\t\t}\n\t}\n\t//console.log(Date.now()-time);\n\treturn bf;\n}\n\n\n\nUPNG.decode = function(buff)\n{\n\tvar data = new Uint8Array(buff), offset = 8, bin = UPNG._bin, rUs = bin.readUshort, rUi = bin.readUint;\n\tvar out = {tabs:{}, frames:[]};\n\tvar dd = new Uint8Array(data.length), doff = 0;\t // put all IDAT data into it\n\tvar fd, foff = 0;\t// frames\n\t\n\tvar mgck = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n\tfor(var i=0; i<8; i++) if(data[i]!=mgck[i]) throw \"The input is not a PNG file!\";\n\n\twhile(offset<data.length)\n\t{\n\t\tvar len  = bin.readUint(data, offset);  offset += 4;\n\t\tvar type = bin.readASCII(data, offset, 4);  offset += 4;\n\t\t//console.log(type,len);\n\t\t\n\t\tif     (type==\"IHDR\")  {  UPNG.decode._IHDR(data, offset, out);  }\n\t\telse if(type==\"CgBI\")  {  out.tabs[type] = data.slice(offset,offset+4);  }\n\t\telse if(type==\"IDAT\") {\n\t\t\tfor(var i=0; i<len; i++) dd[doff+i] = data[offset+i];\n\t\t\tdoff += len;\n\t\t}\n\t\telse if(type==\"acTL\")  {\n\t\t\tout.tabs[type] = {  num_frames:rUi(data, offset), num_plays:rUi(data, offset+4)  };\n\t\t\tfd = new Uint8Array(data.length);\n\t\t}\n\t\telse if(type==\"fcTL\")  {\n\t\t\tif(foff!=0) {  var fr = out.frames[out.frames.length-1];\n\t\t\t\tfr.data = UPNG.decode._decompress(out, fd.slice(0,foff), fr.rect.width, fr.rect.height);  foff=0;\n\t\t\t}\n\t\t\tvar rct = {x:rUi(data, offset+12),y:rUi(data, offset+16),width:rUi(data, offset+4),height:rUi(data, offset+8)};\n\t\t\tvar del = rUs(data, offset+22);  del = rUs(data, offset+20) / (del==0?100:del);\n\t\t\tvar frm = {rect:rct, delay:Math.round(del*1000), dispose:data[offset+24], blend:data[offset+25]};\n\t\t\t//console.log(frm);\n\t\t\tout.frames.push(frm);\n\t\t}\n\t\telse if(type==\"fdAT\") {\n\t\t\tfor(var i=0; i<len-4; i++) fd[foff+i] = data[offset+i+4];\n\t\t\tfoff += len-4;\n\t\t}\n\t\telse if(type==\"pHYs\") {\n\t\t\tout.tabs[type] = [bin.readUint(data, offset), bin.readUint(data, offset+4), data[offset+8]];\n\t\t}\n\t\telse if(type==\"cHRM\") {\n\t\t\tout.tabs[type] = [];\n\t\t\tfor(var i=0; i<8; i++) out.tabs[type].push(bin.readUint(data, offset+i*4));\n\t\t}\n\t\telse if(type==\"tEXt\" || type==\"zTXt\") {\n\t\t\tif(out.tabs[type]==null) out.tabs[type] = {};\n\t\t\tvar nz = bin.nextZero(data, offset);\n\t\t\tvar keyw = bin.readASCII(data, offset, nz-offset);\n\t\t\tvar text, tl=offset+len-nz-1;\n\t\t\tif(type==\"tEXt\") text = bin.readASCII(data, nz+1, tl);\n\t\t\telse {\n\t\t\t\tvar bfr = UPNG.decode._inflate(data.slice(nz+2,nz+2+tl));\n\t\t\t\ttext = bin.readUTF8(bfr,0,bfr.length);\n\t\t\t}\n\t\t\tout.tabs[type][keyw] = text;\n\t\t}\n\t\telse if(type==\"iTXt\") {\n\t\t\tif(out.tabs[type]==null) out.tabs[type] = {};\n\t\t\tvar nz = 0, off = offset;\n\t\t\tnz = bin.nextZero(data, off);\n\t\t\tvar keyw = bin.readASCII(data, off, nz-off);  off = nz + 1;\n\t\t\tvar cflag = data[off], cmeth = data[off+1];  off+=2;\n\t\t\tnz = bin.nextZero(data, off);\n\t\t\tvar ltag = bin.readASCII(data, off, nz-off);  off = nz + 1;\n\t\t\tnz = bin.nextZero(data, off);\n\t\t\tvar tkeyw = bin.readUTF8(data, off, nz-off);  off = nz + 1;\n\t\t\tvar text, tl=len-(off-offset);\n\t\t\tif(cflag==0) text  = bin.readUTF8(data, off, tl);\n\t\t\telse {\n\t\t\t\tvar bfr = UPNG.decode._inflate(data.slice(off,off+tl));\n\t\t\t\ttext = bin.readUTF8(bfr,0,bfr.length);\n\t\t\t}\n\t\t\tout.tabs[type][keyw] = text;\n\t\t}\n\t\telse if(type==\"PLTE\") {\n\t\t\tout.tabs[type] = bin.readBytes(data, offset, len);\n\t\t}\n\t\telse if(type==\"hIST\") {\n\t\t\tvar pl = out.tabs[\"PLTE\"].length/3;\n\t\t\tout.tabs[type] = [];  for(var i=0; i<pl; i++) out.tabs[type].push(rUs(data, offset+i*2));\n\t\t}\n\t\telse if(type==\"tRNS\") {\n\t\t\tif     (out.ctype==3) out.tabs[type] = bin.readBytes(data, offset, len);\n\t\t\telse if(out.ctype==0) out.tabs[type] = rUs(data, offset);\n\t\t\telse if(out.ctype==2) out.tabs[type] = [ rUs(data,offset),rUs(data,offset+2),rUs(data,offset+4) ];\n\t\t\t//else console.log(\"tRNS for unsupported color type\",out.ctype, len);\n\t\t}\n\t\telse if(type==\"gAMA\") out.tabs[type] = bin.readUint(data, offset)/100000;\n\t\telse if(type==\"sRGB\") out.tabs[type] = data[offset];\n\t\telse if(type==\"bKGD\")\n\t\t{\n\t\t\tif     (out.ctype==0 || out.ctype==4) out.tabs[type] = [rUs(data, offset)];\n\t\t\telse if(out.ctype==2 || out.ctype==6) out.tabs[type] = [rUs(data, offset), rUs(data, offset+2), rUs(data, offset+4)];\n\t\t\telse if(out.ctype==3) out.tabs[type] = data[offset];\n\t\t}\n\t\telse if(type==\"IEND\") {\n\t\t\tbreak;\n\t\t}\n\t\t//else {  log(\"unknown chunk type\", type, len);  }\n\t\toffset += len;\n\t\tvar crc = bin.readUint(data, offset);  offset += 4;\n\t}\n\tif(foff!=0) {  var fr = out.frames[out.frames.length-1];\n\t\tfr.data = UPNG.decode._decompress(out, fd.slice(0,foff), fr.rect.width, fr.rect.height);  foff=0;\n\t}\t\n\tout.data = UPNG.decode._decompress(out, dd, out.width, out.height);\n\t\n\tdelete out.compress;  delete out.interlace;  delete out.filter;\n\treturn out;\n}\n\nUPNG.decode._decompress = function(out, dd, w, h) {\n\tvar time = Date.now();\n\tvar bpp = UPNG.decode._getBPP(out), bpl = Math.ceil(w*bpp/8), buff = new Uint8Array((bpl+1+out.interlace)*h);\n\tif(out.tabs[\"CgBI\"]) dd = UPNG.inflateRaw(dd,buff);\n\telse                 dd = UPNG.decode._inflate(dd,buff);\n\t//console.log(dd.length, buff.length);\n\t//console.log(Date.now()-time);\n\n\tvar time=Date.now();\n\tif     (out.interlace==0) dd = UPNG.decode._filterZero(dd, out, 0, w, h);\n\telse if(out.interlace==1) dd = UPNG.decode._readInterlace(dd, out);\n\t//console.log(Date.now()-time);\n\treturn dd;\n}\n\nUPNG.decode._inflate = function(data, buff) {  var out=UPNG[\"inflateRaw\"](new Uint8Array(data.buffer, 2,data.length-6),buff);  return out;  }\nUPNG.inflateRaw=function(){var H={};H.H={};H.H.N=function(N,W){var R=Uint8Array,i=0,m=0,J=0,h=0,Q=0,X=0,u=0,w=0,d=0,v,C;\nif(N[0]==3&&N[1]==0)return W?W:new R(0);var V=H.H,n=V.b,A=V.e,l=V.R,M=V.n,I=V.A,e=V.Z,b=V.m,Z=W==null;\nif(Z)W=new R(N.length>>>2<<5);while(i==0){i=n(N,d,1);m=n(N,d+1,2);d+=3;if(m==0){if((d&7)!=0)d+=8-(d&7);\nvar D=(d>>>3)+4,q=N[D-4]|N[D-3]<<8;if(Z)W=H.H.W(W,w+q);W.set(new R(N.buffer,N.byteOffset+D,q),w);d=D+q<<3;\nw+=q;continue}if(Z)W=H.H.W(W,w+(1<<17));if(m==1){v=b.J;C=b.h;X=(1<<9)-1;u=(1<<5)-1}if(m==2){J=A(N,d,5)+257;\nh=A(N,d+5,5)+1;Q=A(N,d+10,4)+4;d+=14;var E=d,j=1;for(var c=0;c<38;c+=2){b.Q[c]=0;b.Q[c+1]=0}for(var c=0;\nc<Q;c++){var K=A(N,d+c*3,3);b.Q[(b.X[c]<<1)+1]=K;if(K>j)j=K}d+=3*Q;M(b.Q,j);I(b.Q,j,b.u);v=b.w;C=b.d;\nd=l(b.u,(1<<j)-1,J+h,N,d,b.v);var r=V.V(b.v,0,J,b.C);X=(1<<r)-1;var S=V.V(b.v,J,h,b.D);u=(1<<S)-1;M(b.C,r);\nI(b.C,r,v);M(b.D,S);I(b.D,S,C)}while(!0){var T=v[e(N,d)&X];d+=T&15;var p=T>>>4;if(p>>>8==0){W[w++]=p}else if(p==256){break}else{var z=w+p-254;\nif(p>264){var _=b.q[p-257];z=w+(_>>>3)+A(N,d,_&7);d+=_&7}var $=C[e(N,d)&u];d+=$&15;var s=$>>>4,Y=b.c[s],a=(Y>>>4)+n(N,d,Y&15);\nd+=Y&15;while(w<z){W[w]=W[w++-a];W[w]=W[w++-a];W[w]=W[w++-a];W[w]=W[w++-a]}w=z}}}return W.length==w?W:W.slice(0,w)};\nH.H.W=function(N,W){var R=N.length;if(W<=R)return N;var V=new Uint8Array(R<<1);V.set(N,0);return V};\nH.H.R=function(N,W,R,V,n,A){var l=H.H.e,M=H.H.Z,I=0;while(I<R){var e=N[M(V,n)&W];n+=e&15;var b=e>>>4;\nif(b<=15){A[I]=b;I++}else{var Z=0,m=0;if(b==16){m=3+l(V,n,2);n+=2;Z=A[I-1]}else if(b==17){m=3+l(V,n,3);\nn+=3}else if(b==18){m=11+l(V,n,7);n+=7}var J=I+m;while(I<J){A[I]=Z;I++}}}return n};H.H.V=function(N,W,R,V){var n=0,A=0,l=V.length>>>1;\nwhile(A<R){var M=N[A+W];V[A<<1]=0;V[(A<<1)+1]=M;if(M>n)n=M;A++}while(A<l){V[A<<1]=0;V[(A<<1)+1]=0;A++}return n};\nH.H.n=function(N,W){var R=H.H.m,V=N.length,n,A,l,M,I,e=R.j;for(var M=0;M<=W;M++)e[M]=0;for(M=1;M<V;M+=2)e[N[M]]++;\nvar b=R.K;n=0;e[0]=0;for(A=1;A<=W;A++){n=n+e[A-1]<<1;b[A]=n}for(l=0;l<V;l+=2){I=N[l+1];if(I!=0){N[l]=b[I];\nb[I]++}}};H.H.A=function(N,W,R){var V=N.length,n=H.H.m,A=n.r;for(var l=0;l<V;l+=2)if(N[l+1]!=0){var M=l>>1,I=N[l+1],e=M<<4|I,b=W-I,Z=N[l]<<b,m=Z+(1<<b);\nwhile(Z!=m){var J=A[Z]>>>15-W;R[J]=e;Z++}}};H.H.l=function(N,W){var R=H.H.m.r,V=15-W;for(var n=0;n<N.length;\nn+=2){var A=N[n]<<W-N[n+1];N[n]=R[A]>>>V}};H.H.M=function(N,W,R){R=R<<(W&7);var V=W>>>3;N[V]|=R;N[V+1]|=R>>>8};\nH.H.I=function(N,W,R){R=R<<(W&7);var V=W>>>3;N[V]|=R;N[V+1]|=R>>>8;N[V+2]|=R>>>16};H.H.e=function(N,W,R){return(N[W>>>3]|N[(W>>>3)+1]<<8)>>>(W&7)&(1<<R)-1};\nH.H.b=function(N,W,R){return(N[W>>>3]|N[(W>>>3)+1]<<8|N[(W>>>3)+2]<<16)>>>(W&7)&(1<<R)-1};H.H.Z=function(N,W){return(N[W>>>3]|N[(W>>>3)+1]<<8|N[(W>>>3)+2]<<16)>>>(W&7)};\nH.H.i=function(N,W){return(N[W>>>3]|N[(W>>>3)+1]<<8|N[(W>>>3)+2]<<16|N[(W>>>3)+3]<<24)>>>(W&7)};H.H.m=function(){var N=Uint16Array,W=Uint32Array;\nreturn{K:new N(16),j:new N(16),X:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],S:[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,999,999,999],T:[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,0,0,0],q:new N(32),p:[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,65535,65535],z:[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,0,0],c:new W(32),J:new N(512),_:[],h:new N(32),$:[],w:new N(32768),C:[],v:[],d:new N(32768),D:[],u:new N(512),Q:[],r:new N(1<<15),s:new W(286),Y:new W(30),a:new W(19),t:new W(15e3),k:new N(1<<16),g:new N(1<<15)}}();\n(function(){var N=H.H.m,W=1<<15;for(var R=0;R<W;R++){var V=R;V=(V&2863311530)>>>1|(V&1431655765)<<1;\nV=(V&3435973836)>>>2|(V&858993459)<<2;V=(V&4042322160)>>>4|(V&252645135)<<4;V=(V&4278255360)>>>8|(V&16711935)<<8;\nN.r[R]=(V>>>16|V<<16)>>>17}function n(A,l,M){while(l--!=0)A.push(0,M)}for(var R=0;R<32;R++){N.q[R]=N.S[R]<<3|N.T[R];\nN.c[R]=N.p[R]<<4|N.z[R]}n(N._,144,8);n(N._,255-143,9);n(N._,279-255,7);n(N._,287-279,8);H.H.n(N._,9);\nH.H.A(N._,9,N.J);H.H.l(N._,9);n(N.$,32,5);H.H.n(N.$,5);H.H.A(N.$,5,N.h);H.H.l(N.$,5);n(N.Q,19,0);n(N.C,286,0);\nn(N.D,30,0);n(N.v,320,0)}());return H.H.N}()\n\n\nUPNG.decode._readInterlace = function(data, out)\n{\n\tvar w = out.width, h = out.height;\n\tvar bpp = UPNG.decode._getBPP(out), cbpp = bpp>>3, bpl = Math.ceil(w*bpp/8);\n\tvar img = new Uint8Array( h * bpl );\n\tvar di = 0;\n\n\tvar starting_row  = [ 0, 0, 4, 0, 2, 0, 1 ];\n\tvar starting_col  = [ 0, 4, 0, 2, 0, 1, 0 ];\n\tvar row_increment = [ 8, 8, 8, 4, 4, 2, 2 ];\n\tvar col_increment = [ 8, 8, 4, 4, 2, 2, 1 ];\n\n\tvar pass=0;\n\twhile(pass<7)\n\t{\n\t\tvar ri = row_increment[pass], ci = col_increment[pass];\n\t\tvar sw = 0, sh = 0;\n\t\tvar cr = starting_row[pass];  while(cr<h) {  cr+=ri;  sh++;  }\n\t\tvar cc = starting_col[pass];  while(cc<w) {  cc+=ci;  sw++;  }\n\t\tvar bpll = Math.ceil(sw*bpp/8);\n\t\tUPNG.decode._filterZero(data, out, di, sw, sh);\n\n\t\tvar y=0, row = starting_row[pass];\n\t\twhile(row<h)\n\t\t{\n\t\t\tvar col = starting_col[pass];\n\t\t\tvar cdi = (di+y*bpll)<<3;\n\n\t\t\twhile(col<w)\n\t\t\t{\n\t\t\t\tif(bpp==1) {\n\t\t\t\t\tvar val = data[cdi>>3];  val = (val>>(7-(cdi&7)))&1;\n\t\t\t\t\timg[row*bpl + (col>>3)] |= (val << (7-((col&7)<<0)));\n\t\t\t\t}\n\t\t\t\tif(bpp==2) {\n\t\t\t\t\tvar val = data[cdi>>3];  val = (val>>(6-(cdi&7)))&3;\n\t\t\t\t\timg[row*bpl + (col>>2)] |= (val << (6-((col&3)<<1)));\n\t\t\t\t}\n\t\t\t\tif(bpp==4) {\n\t\t\t\t\tvar val = data[cdi>>3];  val = (val>>(4-(cdi&7)))&15;\n\t\t\t\t\timg[row*bpl + (col>>1)] |= (val << (4-((col&1)<<2)));\n\t\t\t\t}\n\t\t\t\tif(bpp>=8) {\n\t\t\t\t\tvar ii = row*bpl+col*cbpp;\n\t\t\t\t\tfor(var j=0; j<cbpp; j++) img[ii+j] = data[(cdi>>3)+j];\n\t\t\t\t}\n\t\t\t\tcdi+=bpp;  col+=ci;\n\t\t\t}\n\t\t\ty++;  row += ri;\n\t\t}\n\t\tif(sw*sh!=0) di += sh * (1 + bpll);\n\t\tpass = pass + 1;\n\t}\n\treturn img;\n}\n\nUPNG.decode._getBPP = function(out) {\n\tvar noc = [1,null,3,1,2,null,4][out.ctype];\n\treturn noc * out.depth;\n}\n\nUPNG.decode._filterZero = function(data, out, off, w, h)\n{\n\tvar bpp = UPNG.decode._getBPP(out), bpl = Math.ceil(w*bpp/8), paeth = UPNG.decode._paeth;\n\tbpp = Math.ceil(bpp/8);\n\t\n\tvar i=0, di=1, type=data[off], x=0;\n\t\n\tif(type>1) data[off]=[0,0,1][type-2];  \n\tif(type==3) for(x=bpp; x<bpl; x++) data[x+1] = (data[x+1] + (data[x+1-bpp]>>>1) )&255;\n\n\tfor(var y=0; y<h; y++)  {\n\t\ti = off+y*bpl; di = i+y+1;\n\t\ttype = data[di-1]; x=0;\n\n\t\tif     (type==0)   for(; x<bpl; x++) data[i+x] = data[di+x];\n\t\telse if(type==1) { for(; x<bpp; x++) data[i+x] = data[di+x];\n\t\t\t\t\t\t   for(; x<bpl; x++) data[i+x] = (data[di+x] + data[i+x-bpp]);  }\n\t\telse if(type==2) { for(; x<bpl; x++) data[i+x] = (data[di+x] + data[i+x-bpl]);  }\n\t\telse if(type==3) { for(; x<bpp; x++) data[i+x] = (data[di+x] + ( data[i+x-bpl]>>>1));\n\t\t\t               for(; x<bpl; x++) data[i+x] = (data[di+x] + ((data[i+x-bpl]+data[i+x-bpp])>>>1) );  }\n\t\telse             { for(; x<bpp; x++) data[i+x] = (data[di+x] + paeth(0, data[i+x-bpl], 0));\n\t\t\t\t\t\t   for(; x<bpl; x++) data[i+x] = (data[di+x] + paeth(data[i+x-bpp], data[i+x-bpl], data[i+x-bpp-bpl]) );  }\n\t}\n\treturn data;\n}\n\nUPNG.decode._paeth = function(a,b,c)\n{\n\tvar p = a+b-c, pa = (p-a), pb = (p-b), pc = (p-c);\n\tif (pa*pa <= pb*pb && pa*pa <= pc*pc)  return a;\n\telse if (pb*pb <= pc*pc)  return b;\n\treturn c;\n}\n\nUPNG.decode._IHDR = function(data, offset, out)\n{\n\tvar bin = UPNG._bin;\n\tout.width  = bin.readUint(data, offset);  offset += 4;\n\tout.height = bin.readUint(data, offset);  offset += 4;\n\tout.depth     = data[offset];  offset++;\n\tout.ctype     = data[offset];  offset++;\n\tout.compress  = data[offset];  offset++;\n\tout.filter    = data[offset];  offset++;\n\tout.interlace = data[offset];  offset++;\n}\n\nUPNG._bin = {\n\tnextZero   : function(data,p)  {  while(data[p]!=0) p++;  return p;  },\n\treadUshort : function(buff,p)  {  return (buff[p]<< 8) | buff[p+1];  },\n\twriteUshort: function(buff,p,n){  buff[p] = (n>>8)&255;  buff[p+1] = n&255;  },\n\treadUint   : function(buff,p)  {  return (buff[p]*(256*256*256)) + ((buff[p+1]<<16) | (buff[p+2]<< 8) | buff[p+3]);  },\n\twriteUint  : function(buff,p,n){  buff[p]=(n>>24)&255;  buff[p+1]=(n>>16)&255;  buff[p+2]=(n>>8)&255;  buff[p+3]=n&255;  },\n\treadASCII  : function(buff,p,l){  var s = \"\";  for(var i=0; i<l; i++) s += String.fromCharCode(buff[p+i]);  return s;    },\n\twriteASCII : function(data,p,s){  for(var i=0; i<s.length; i++) data[p+i] = s.charCodeAt(i);  },\n\treadBytes  : function(buff,p,l){  var arr = [];   for(var i=0; i<l; i++) arr.push(buff[p+i]);   return arr;  },\n\tpad : function(n) { return n.length < 2 ? \"0\" + n : n; },\n\treadUTF8 : function(buff, p, l) {\n\t\tvar s = \"\", ns;\n\t\tfor(var i=0; i<l; i++) s += \"%\" + UPNG._bin.pad(buff[p+i].toString(16));\n\t\ttry {  ns = decodeURIComponent(s); }\n\t\tcatch(e) {  return UPNG._bin.readASCII(buff, p, l);  }\n\t\treturn  ns;\n\t}\n}\nUPNG._copyTile = function(sb, sw, sh, tb, tw, th, xoff, yoff, mode)\n{\n\tvar w = Math.min(sw,tw), h = Math.min(sh,th);\n\tvar si=0, ti=0;\n\tfor(var y=0; y<h; y++)\n\t\tfor(var x=0; x<w; x++)\n\t\t{\n\t\t\tif(xoff>=0 && yoff>=0) {  si = (y*sw+x)<<2;  ti = (( yoff+y)*tw+xoff+x)<<2;  }\n\t\t\telse                   {  si = ((-yoff+y)*sw-xoff+x)<<2;  ti = (y*tw+x)<<2;  }\n\t\t\t\n\t\t\tif     (mode==0) {  tb[ti] = sb[si];  tb[ti+1] = sb[si+1];  tb[ti+2] = sb[si+2];  tb[ti+3] = sb[si+3];  }\n\t\t\telse if(mode==1) {\n\t\t\t\tvar fa = sb[si+3]*(1/255), fr=sb[si]*fa, fg=sb[si+1]*fa, fb=sb[si+2]*fa; \n\t\t\t\tvar ba = tb[ti+3]*(1/255), br=tb[ti]*ba, bg=tb[ti+1]*ba, bb=tb[ti+2]*ba; \n\t\t\t\t\n\t\t\t\tvar ifa=1-fa, oa = fa+ba*ifa, ioa = (oa==0?0:1/oa);\n\t\t\t\ttb[ti+3] = 255*oa;  \n\t\t\t\ttb[ti+0] = (fr+br*ifa)*ioa;  \n\t\t\t\ttb[ti+1] = (fg+bg*ifa)*ioa;   \n\t\t\t\ttb[ti+2] = (fb+bb*ifa)*ioa;  \n\t\t\t}\n\t\t\telse if(mode==2){\t// copy only differences, otherwise zero\n\t\t\t\tvar fa = sb[si+3], fr=sb[si], fg=sb[si+1], fb=sb[si+2]; \n\t\t\t\tvar ba = tb[ti+3], br=tb[ti], bg=tb[ti+1], bb=tb[ti+2]; \n\t\t\t\tif(fa==ba && fr==br && fg==bg && fb==bb) {  tb[ti]=0;  tb[ti+1]=0;  tb[ti+2]=0;  tb[ti+3]=0;  }\n\t\t\t\telse {  tb[ti]=fr;  tb[ti+1]=fg;  tb[ti+2]=fb;  tb[ti+3]=fa;  }\n\t\t\t}\n\t\t\telse if(mode==3){\t// check if can be blended\n\t\t\t\tvar fa = sb[si+3], fr=sb[si], fg=sb[si+1], fb=sb[si+2]; \n\t\t\t\tvar ba = tb[ti+3], br=tb[ti], bg=tb[ti+1], bb=tb[ti+2]; \n\t\t\t\tif(fa==ba && fr==br && fg==bg && fb==bb) continue;\n\t\t\t\t//if(fa!=255 && ba!=0) return false;\n\t\t\t\tif(fa<220 && ba>20) return false;\n\t\t\t}\n\t\t}\n\treturn true;\n}\n\n\n\n\nUPNG.encode = function(bufs, w, h, ps, dels, tabs, forbidPlte)\n{\n\tif(ps==null) ps=0;\n\tif(forbidPlte==null) forbidPlte = false;\n\n\tvar nimg = UPNG.encode.compress(bufs, w, h, ps, [false, false, false, 0, forbidPlte]);\n\tUPNG.encode.compressPNG(nimg, -1);\n\t\n\treturn UPNG.encode._main(nimg, w, h, dels, tabs);\n}\n\nUPNG.encodeLL = function(bufs, w, h, cc, ac, depth, dels, tabs) {\n\tvar nimg = {  ctype: 0 + (cc==1 ? 0 : 2) + (ac==0 ? 0 : 4),      depth: depth,  frames: []  };\n\t\n\tvar time = Date.now();\n\tvar bipp = (cc+ac)*depth, bipl = bipp * w;\n\tfor(var i=0; i<bufs.length; i++)\n\t\tnimg.frames.push({  rect:{x:0,y:0,width:w,height:h},  img:new Uint8Array(bufs[i]), blend:0, dispose:1, bpp:Math.ceil(bipp/8), bpl:Math.ceil(bipl/8)  });\n\t\n\tUPNG.encode.compressPNG(nimg, 0, true);\n\t\n\tvar out = UPNG.encode._main(nimg, w, h, dels, tabs);\n\treturn out;\n}\n\nUPNG.encode._main = function(nimg, w, h, dels, tabs) {\n\tif(tabs==null) tabs={};\n\tvar crc = UPNG.crc.crc, wUi = UPNG._bin.writeUint, wUs = UPNG._bin.writeUshort, wAs = UPNG._bin.writeASCII;\n\tvar offset = 8, anim = nimg.frames.length>1, pltAlpha = false;\n\t\n\tvar leng = 8 + (16+5+4) /*+ (9+4)*/ + (anim ? 20 : 0);\n\tif(tabs[\"sRGB\"]!=null) leng += 8+1+4;\n\tif(tabs[\"pHYs\"]!=null) leng += 8+9+4;\n\tif(nimg.ctype==3) {\n\t\tvar dl = nimg.plte.length;\n\t\tfor(var i=0; i<dl; i++) if((nimg.plte[i]>>>24)!=255) pltAlpha = true;\n\t\tleng += (8 + dl*3 + 4) + (pltAlpha ? (8 + dl*1 + 4) : 0);\n\t}\n\tfor(var j=0; j<nimg.frames.length; j++)\n\t{\n\t\tvar fr = nimg.frames[j];\n\t\tif(anim) leng += 38;\n\t\tleng += fr.cimg.length + 12;\n\t\tif(j!=0) leng+=4;\n\t}\n\tleng += 12; \n\t\n\tvar data = new Uint8Array(leng);\n\tvar wr=[0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n\tfor(var i=0; i<8; i++) data[i]=wr[i];\n\t\n\twUi(data,offset, 13);     offset+=4;\n\twAs(data,offset,\"IHDR\");  offset+=4;\n\twUi(data,offset,w);  offset+=4;\n\twUi(data,offset,h);  offset+=4;\n\tdata[offset] = nimg.depth;  offset++;  // depth\n\tdata[offset] = nimg.ctype;  offset++;  // ctype\n\tdata[offset] = 0;  offset++;  // compress\n\tdata[offset] = 0;  offset++;  // filter\n\tdata[offset] = 0;  offset++;  // interlace\n\twUi(data,offset,crc(data,offset-17,17));  offset+=4; // crc\n\n\t// 13 bytes to say, that it is sRGB\n\tif(tabs[\"sRGB\"]!=null) {\n\t\twUi(data,offset, 1);      offset+=4;\n\t\twAs(data,offset,\"sRGB\");  offset+=4;\n\t\tdata[offset] = tabs[\"sRGB\"];  offset++;\n\t\twUi(data,offset,crc(data,offset-5,5));  offset+=4; // crc\n\t}\n\tif(tabs[\"pHYs\"]!=null) {\n\t\twUi(data,offset, 9);      offset+=4;\n\t\twAs(data,offset,\"pHYs\");  offset+=4;\n\t\twUi(data,offset, tabs[\"pHYs\"][0]);      offset+=4;\n\t\twUi(data,offset, tabs[\"pHYs\"][1]);      offset+=4;\n\t\tdata[offset]=tabs[\"pHYs\"][2];\t\t\toffset++;\n\t\twUi(data,offset,crc(data,offset-13,13));  offset+=4; // crc\n\t}\n\n\tif(anim) {\n\t\twUi(data,offset, 8);      offset+=4;\n\t\twAs(data,offset,\"acTL\");  offset+=4;\n\t\twUi(data,offset, nimg.frames.length);     offset+=4;\n\t\twUi(data,offset, tabs[\"loop\"]!=null?tabs[\"loop\"]:0);      offset+=4;\n\t\twUi(data,offset,crc(data,offset-12,12));  offset+=4; // crc\n\t}\n\n\tif(nimg.ctype==3) {\n\t\tvar dl = nimg.plte.length;\n\t\twUi(data,offset, dl*3);  offset+=4;\n\t\twAs(data,offset,\"PLTE\");  offset+=4;\n\t\tfor(var i=0; i<dl; i++){\n\t\t\tvar ti=i*3, c=nimg.plte[i], r=(c)&255, g=(c>>>8)&255, b=(c>>>16)&255;\n\t\t\tdata[offset+ti+0]=r;  data[offset+ti+1]=g;  data[offset+ti+2]=b;\n\t\t}\n\t\toffset+=dl*3;\n\t\twUi(data,offset,crc(data,offset-dl*3-4,dl*3+4));  offset+=4; // crc\n\n\t\tif(pltAlpha) {\n\t\t\twUi(data,offset, dl);  offset+=4;\n\t\t\twAs(data,offset,\"tRNS\");  offset+=4;\n\t\t\tfor(var i=0; i<dl; i++)  data[offset+i]=(nimg.plte[i]>>>24)&255;\n\t\t\toffset+=dl;\n\t\t\twUi(data,offset,crc(data,offset-dl-4,dl+4));  offset+=4; // crc\n\t\t}\n\t}\n\t\n\tvar fi = 0;\n\tfor(var j=0; j<nimg.frames.length; j++)\n\t{\n\t\tvar fr = nimg.frames[j];\n\t\tif(anim) {\n\t\t\twUi(data, offset, 26);     offset+=4;\n\t\t\twAs(data, offset,\"fcTL\");  offset+=4;\n\t\t\twUi(data, offset, fi++);   offset+=4;\n\t\t\twUi(data, offset, fr.rect.width );   offset+=4;\n\t\t\twUi(data, offset, fr.rect.height);   offset+=4;\n\t\t\twUi(data, offset, fr.rect.x);   offset+=4;\n\t\t\twUi(data, offset, fr.rect.y);   offset+=4;\n\t\t\twUs(data, offset, dels[j]);   offset+=2;\n\t\t\twUs(data, offset,  1000);   offset+=2;\n\t\t\tdata[offset] = fr.dispose;  offset++;\t// dispose\n\t\t\tdata[offset] = fr.blend  ;  offset++;\t// blend\n\t\t\twUi(data,offset,crc(data,offset-30,30));  offset+=4; // crc\n\t\t}\n\t\t\t\t\n\t\tvar imgd = fr.cimg, dl = imgd.length;\n\t\twUi(data,offset, dl+(j==0?0:4));     offset+=4;\n\t\tvar ioff = offset;\n\t\twAs(data,offset,(j==0)?\"IDAT\":\"fdAT\");  offset+=4;\n\t\tif(j!=0) {  wUi(data, offset, fi++);  offset+=4;  }\n\t\tdata.set(imgd,offset);\n\t\toffset += dl;\n\t\twUi(data,offset,crc(data,ioff,offset-ioff));  offset+=4; // crc\n\t}\n\n\twUi(data,offset, 0);     offset+=4;\n\twAs(data,offset,\"IEND\");  offset+=4;\n\twUi(data,offset,crc(data,offset-4,4));  offset+=4; // crc\n\n\treturn data.buffer;\n}\n\nUPNG.encode.compressPNG = function(out, filter, levelZero) {\n\tfor(var i=0; i<out.frames.length; i++) {\n\t\tvar frm = out.frames[i], nw=frm.rect.width, nh=frm.rect.height;\n\t\tvar fdata = new Uint8Array(nh*frm.bpl+nh);\n\t\tfrm.cimg = UPNG.encode._filterZero(frm.img,nh,frm.bpp,frm.bpl,fdata, filter, levelZero);\n\t}\n}\n\n\n\nUPNG.encode.compress = function(bufs, w, h, ps, prms) // prms:  onlyBlend, minBits, forbidPlte\n{\n\t//var time = Date.now();\n\tvar onlyBlend = prms[0], evenCrd = prms[1], forbidPrev = prms[2], minBits = prms[3], forbidPlte = prms[4];\n\t\n\tvar ctype = 6, depth = 8, alphaAnd=255\n\t\n\tfor(var j=0; j<bufs.length; j++)  {  // when not quantized, other frames can contain colors, that are not in an initial frame\n\t\tvar img = new Uint8Array(bufs[j]), ilen = img.length;\n\t\tfor(var i=0; i<ilen; i+=4) alphaAnd &= img[i+3];\n\t}\n\tvar gotAlpha = (alphaAnd!=255);\n\t\n\t//console.log(\"alpha check\", Date.now()-time);  time = Date.now();\n\t\n\t//var brute = gotAlpha && forGIF;\t\t// brute : frames can only be copied, not \"blended\"\n\tvar frms = UPNG.encode.framize(bufs, w, h, onlyBlend, evenCrd, forbidPrev);\n\t//console.log(\"framize\", Date.now()-time);  time = Date.now();\n\t\n\tvar cmap={}, plte=[], inds=[]; \n\t\n\tif(ps!=0) {\n\t\tvar nbufs = [];  for(var i=0; i<frms.length; i++) nbufs.push(frms[i].img.buffer);\n\t\t\n\t\tvar abuf = UPNG.encode.concatRGBA(nbufs), qres = UPNG.quantize(abuf, ps);  console.log(qres);\n\t\tvar cof = 0, bb = new Uint8Array(qres.abuf);\n\t\tfor(var i=0; i<frms.length; i++) {  var ti=frms[i].img, bln=ti.length;  inds.push(new Uint8Array(qres.inds.buffer, cof>>2, bln>>2));\n\t\t\tfor(var j=0; j<bln; j+=4) {  ti[j]=bb[cof+j];  ti[j+1]=bb[cof+j+1];  ti[j+2]=bb[cof+j+2];  ti[j+3]=bb[cof+j+3];  }    cof+=bln;  }\n\t\t\n\t\tfor(var i=0; i<qres.plte.length; i++) plte.push(qres.plte[i].est.rgba);\n\t\t//console.log(\"quantize\", Date.now()-time);  time = Date.now();\n\t}\n\telse {\n\t\t// what if ps==0, but there are <=256 colors?  we still need to detect, if the palette could be used\n\t\tfor(var j=0; j<frms.length; j++)  {  // when not quantized, other frames can contain colors, that are not in an initial frame\n\t\t\tvar frm = frms[j], img32 = new Uint32Array(frm.img.buffer), nw=frm.rect.width, ilen = img32.length;\n\t\t\tvar ind = new Uint8Array(ilen);  inds.push(ind);\n\t\t\tfor(var i=0; i<ilen; i++) {\n\t\t\t\tvar c = img32[i];\n\t\t\t\tif     (i!=0 && c==img32[i- 1]) ind[i]=ind[i-1];\n\t\t\t\telse if(i>nw && c==img32[i-nw]) ind[i]=ind[i-nw];\n\t\t\t\telse {\n\t\t\t\t\tvar cmc = cmap[c];\n\t\t\t\t\tif(cmc==null) {  cmap[c]=cmc=plte.length;  plte.push(c);  if(plte.length>=300) break;  }\n\t\t\t\t\tind[i]=cmc;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t//console.log(\"make palette\", Date.now()-time);  time = Date.now();\n\t}\n\t\n\tvar cc=plte.length; //console.log(\"colors:\",cc);\n\tif(cc<=256 && forbidPlte==false) {\n\t\tif(cc<= 2) depth=1;  else if(cc<= 4) depth=2;  else if(cc<=16) depth=4;  else depth=8;\n\t\tdepth =  Math.max(depth, minBits);\n\t}\n\t\n\tfor(var j=0; j<frms.length; j++)\n\t{\n\t\tvar frm = frms[j], nx=frm.rect.x, ny=frm.rect.y, nw=frm.rect.width, nh=frm.rect.height;\n\t\tvar cimg = frm.img, cimg32 = new Uint32Array(cimg.buffer);\n\t\tvar bpl = 4*nw, bpp=4;\n\t\tif(cc<=256 && forbidPlte==false) {\n\t\t\tbpl = Math.ceil(depth*nw/8);\n\t\t\tvar nimg = new Uint8Array(bpl*nh);\n\t\t\tvar inj = inds[j];\n\t\t\tfor(var y=0; y<nh; y++) {  var i=y*bpl, ii=y*nw;\n\t\t\t\tif     (depth==8) for(var x=0; x<nw; x++) nimg[i+(x)   ]   =  (inj[ii+x]             );\n\t\t\t\telse if(depth==4) for(var x=0; x<nw; x++) nimg[i+(x>>1)]  |=  (inj[ii+x]<<(4-(x&1)*4));\n\t\t\t\telse if(depth==2) for(var x=0; x<nw; x++) nimg[i+(x>>2)]  |=  (inj[ii+x]<<(6-(x&3)*2));\n\t\t\t\telse if(depth==1) for(var x=0; x<nw; x++) nimg[i+(x>>3)]  |=  (inj[ii+x]<<(7-(x&7)*1));\n\t\t\t}\n\t\t\tcimg=nimg;  ctype=3;  bpp=1;\n\t\t}\n\t\telse if(gotAlpha==false && frms.length==1) {\t// some next \"reduced\" frames may contain alpha for blending\n\t\t\tvar nimg = new Uint8Array(nw*nh*3), area=nw*nh;\n\t\t\tfor(var i=0; i<area; i++) { var ti=i*3, qi=i*4;  nimg[ti]=cimg[qi];  nimg[ti+1]=cimg[qi+1];  nimg[ti+2]=cimg[qi+2];  }\n\t\t\tcimg=nimg;  ctype=2;  bpp=3;  bpl=3*nw;\n\t\t}\n\t\tfrm.img=cimg;  frm.bpl=bpl;  frm.bpp=bpp;\n\t}\n\t//console.log(\"colors => palette indices\", Date.now()-time);  time = Date.now();\n\t\n\treturn {ctype:ctype, depth:depth, plte:plte, frames:frms  };\n}\nUPNG.encode.framize = function(bufs,w,h,alwaysBlend,evenCrd,forbidPrev) {\n\t/*  DISPOSE\n\t    - 0 : no change\n\t\t- 1 : clear to transparent\n\t\t- 2 : retstore to content before rendering (previous frame disposed)\n\t\tBLEND\n\t\t- 0 : replace\n\t\t- 1 : blend\n\t*/\n\tvar frms = [];\n\tfor(var j=0; j<bufs.length; j++) {\n\t\tvar cimg = new Uint8Array(bufs[j]), cimg32 = new Uint32Array(cimg.buffer);\n\t\tvar nimg;\n\t\t\n\t\tvar nx=0, ny=0, nw=w, nh=h, blend=alwaysBlend?1:0;\n\t\tif(j!=0) {\n\t\t\tvar tlim = (forbidPrev || alwaysBlend || j==1 || frms[j-2].dispose!=0)?1:2, tstp = 0, tarea = 1e9;\n\t\t\tfor(var it=0; it<tlim; it++)\n\t\t\t{\n\t\t\t\tvar pimg = new Uint8Array(bufs[j-1-it]), p32 = new Uint32Array(bufs[j-1-it]);\n\t\t\t\tvar mix=w,miy=h,max=-1,may=-1;\n\t\t\t\tfor(var y=0; y<h; y++) for(var x=0; x<w; x++) {\n\t\t\t\t\tvar i = y*w+x;\n\t\t\t\t\tif(cimg32[i]!=p32[i]) {\n\t\t\t\t\t\tif(x<mix) mix=x;  if(x>max) max=x;\n\t\t\t\t\t\tif(y<miy) miy=y;  if(y>may) may=y;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(max==-1) mix=miy=max=may=0;\n\t\t\t\tif(evenCrd) {  if((mix&1)==1)mix--;  if((miy&1)==1)miy--;  }\n\t\t\t\tvar sarea = (max-mix+1)*(may-miy+1);\n\t\t\t\tif(sarea<tarea) {\n\t\t\t\t\ttarea = sarea;  tstp = it;\n\t\t\t\t\tnx = mix; ny = miy; nw = max-mix+1; nh = may-miy+1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// alwaysBlend: pokud zjistím, že blendit nelze, nastavím předchozímu snímku dispose=1. Zajistím, aby obsahoval můj obdélník.\n\t\t\tvar pimg = new Uint8Array(bufs[j-1-tstp]);\n\t\t\tif(tstp==1) frms[j-1].dispose = 2;\n\t\t\t\n\t\t\tnimg = new Uint8Array(nw*nh*4);\n\t\t\tUPNG._copyTile(pimg,w,h, nimg,nw,nh, -nx,-ny, 0);\n\t\t\t\n\t\t\tblend =  UPNG._copyTile(cimg,w,h, nimg,nw,nh, -nx,-ny, 3) ? 1 : 0;\n\t\t\tif(blend==1) UPNG.encode._prepareDiff(cimg,w,h,nimg,{x:nx,y:ny,width:nw,height:nh});\n\t\t\telse         UPNG._copyTile(cimg,w,h, nimg,nw,nh, -nx,-ny, 0);\n\t\t\t//UPNG._copyTile(cimg,w,h, nimg,nw,nh, -nx,-ny, blend==1?2:0);\n\t\t}\n\t\telse nimg = cimg.slice(0);\t// img may be rewritten further ... don't rewrite input\n\t\t\n\t\tfrms.push({rect:{x:nx,y:ny,width:nw,height:nh}, img:nimg, blend:blend, dispose:0});\n\t}\n\t\n\t\n\tif(alwaysBlend) for(var j=0; j<frms.length; j++) {\n\t\tvar frm = frms[j];  if(frm.blend==1) continue;\n\t\tvar r0 = frm.rect, r1 = frms[j-1].rect\n\t\tvar miX = Math.min(r0.x, r1.x), miY = Math.min(r0.y, r1.y);\n\t\tvar maX = Math.max(r0.x+r0.width, r1.x+r1.width), maY = Math.max(r0.y+r0.height, r1.y+r1.height);\n\t\tvar r = {x:miX, y:miY, width:maX-miX, height:maY-miY};\n\t\t\n\t\tfrms[j-1].dispose = 1;\n\t\tif(j-1!=0) \n\t\tUPNG.encode._updateFrame(bufs, w,h,frms, j-1,r, evenCrd);\n\t\tUPNG.encode._updateFrame(bufs, w,h,frms, j  ,r, evenCrd);\n\t}\n\tvar area = 0;\n\tif(bufs.length!=1) for(var i=0; i<frms.length; i++) {\n\t\tvar frm = frms[i];\n\t\tarea += frm.rect.width*frm.rect.height;\n\t\t//if(i==0 || frm.blend!=1) continue;\n\t\t//var ob = new Uint8Array(\n\t\t//console.log(frm.blend, frm.dispose, frm.rect);\n\t}\n\t//if(area!=0) console.log(area);\n\treturn frms;\n}\nUPNG.encode._updateFrame = function(bufs, w,h, frms, i, r, evenCrd) {\n\tvar U8 = Uint8Array, U32 = Uint32Array;\n\tvar pimg = new U8(bufs[i-1]), pimg32 = new U32(bufs[i-1]), nimg = i+1<bufs.length ? new U8(bufs[i+1]):null;\n\tvar cimg = new U8(bufs[i]), cimg32 = new U32(cimg.buffer);\n\t\n\tvar mix=w,miy=h,max=-1,may=-1;\n\tfor(var y=0; y<r.height; y++) for(var x=0; x<r.width; x++) {\n\t\tvar cx = r.x+x, cy = r.y+y;\n\t\tvar j = cy*w+cx, cc = cimg32[j];\n\t\t// no need to draw transparency, or to dispose it. Or, if writing the same color and the next one does not need transparency.\n\t\tif(cc==0 || (frms[i-1].dispose==0 && pimg32[j]==cc && (nimg==null || nimg[j*4+3]!=0))/**/) {}\n\t\telse {\n\t\t\tif(cx<mix) mix=cx;  if(cx>max) max=cx;\n\t\t\tif(cy<miy) miy=cy;  if(cy>may) may=cy;\n\t\t}\n\t}\n\tif(max==-1) mix=miy=max=may=0;\n\tif(evenCrd) {  if((mix&1)==1)mix--;  if((miy&1)==1)miy--;  }\n\tr = {x:mix, y:miy, width:max-mix+1, height:may-miy+1};\n\t\n\tvar fr = frms[i];  fr.rect = r;  fr.blend = 1;  fr.img = new Uint8Array(r.width*r.height*4);\n\tif(frms[i-1].dispose==0) {\n\t\tUPNG._copyTile(pimg,w,h, fr.img,r.width,r.height, -r.x,-r.y, 0);\n\t\tUPNG.encode._prepareDiff(cimg,w,h,fr.img,r);\n\t\t//UPNG._copyTile(cimg,w,h, fr.img,r.width,r.height, -r.x,-r.y, 2);\n\t}\n\telse\n\t\tUPNG._copyTile(cimg,w,h, fr.img,r.width,r.height, -r.x,-r.y, 0);\n}\nUPNG.encode._prepareDiff = function(cimg, w,h, nimg, rec) {\n\tUPNG._copyTile(cimg,w,h, nimg,rec.width,rec.height, -rec.x,-rec.y, 2);\n\t/*\n\tvar n32 = new Uint32Array(nimg.buffer);\n\tvar og = new Uint8Array(rec.width*rec.height*4), o32 = new Uint32Array(og.buffer);\n\tUPNG._copyTile(cimg,w,h, og,rec.width,rec.height, -rec.x,-rec.y, 0);\n\tfor(var i=4; i<nimg.length; i+=4) {\n\t\tif(nimg[i-1]!=0 && nimg[i+3]==0 && o32[i>>>2]==o32[(i>>>2)-1]) {\n\t\t\tn32[i>>>2]=o32[i>>>2];\n\t\t\t//var j = i, c=p32[(i>>>2)-1];\n\t\t\t//while(p32[j>>>2]==c) {  n32[j>>>2]=c;  j+=4;  }\n\t\t}\n\t}\n\tfor(var i=nimg.length-8; i>0; i-=4) {\n\t\tif(nimg[i+7]!=0 && nimg[i+3]==0 && o32[i>>>2]==o32[(i>>>2)+1]) {\n\t\t\tn32[i>>>2]=o32[i>>>2];\n\t\t\t//var j = i, c=p32[(i>>>2)-1];\n\t\t\t//while(p32[j>>>2]==c) {  n32[j>>>2]=c;  j+=4;  }\n\t\t}\n\t}*/\n}\n\nUPNG.encode._filterZero = function(img,h,bpp,bpl,data, filter, levelZero)\n{\n\tvar fls = [], ftry=[0,1,2,3,4];\n\tif     (filter!=-1)             ftry=[filter];\n\telse if(h*bpl>500000 || bpp==1) ftry=[0];\n\tvar opts;  if(levelZero) opts={level:0};\n\t\n\t\n\tvar CMPR = (data.length>10e6 && typeof UZIP!=\"undefined\" && UZIP!=null) ? UZIP : pako;\n\t\n\tvar time = Date.now();\n\tfor(var i=0; i<ftry.length; i++) {\n\t\tfor(var y=0; y<h; y++) UPNG.encode._filterLine(data, img, y, bpl, bpp, ftry[i]);\n\t\t//var nimg = new Uint8Array(data.length);\n\t\t//var sz = UZIP.F.deflate(data, nimg);  fls.push(nimg.slice(0,sz));\n\t\t//var dfl = pako[\"deflate\"](data), dl=dfl.length-4;\n\t\t//var crc = (dfl[dl+3]<<24)|(dfl[dl+2]<<16)|(dfl[dl+1]<<8)|(dfl[dl+0]<<0);\n\t\t//console.log(crc, UZIP.adler(data,2,data.length-6));\n\t\tfls.push(CMPR[\"deflate\"](data,opts));\n\t}\n\t\n\tvar ti, tsize=1e9;\n\tfor(var i=0; i<fls.length; i++) if(fls[i].length<tsize) {  ti=i;  tsize=fls[i].length;  }\n\treturn fls[ti];\n}\nUPNG.encode._filterLine = function(data, img, y, bpl, bpp, type)\n{\n\tvar i = y*bpl, di = i+y, paeth = UPNG.decode._paeth\n\tdata[di]=type;  di++;\n\n\tif(type==0) {\n\t\tif(bpl<500) for(var x=0; x<bpl; x++) data[di+x] = img[i+x];\n\t\telse data.set(new Uint8Array(img.buffer,i,bpl),di);\n\t}\n\telse if(type==1) {\n\t\tfor(var x=  0; x<bpp; x++) data[di+x] =  img[i+x];\n\t\tfor(var x=bpp; x<bpl; x++) data[di+x] = (img[i+x]-img[i+x-bpp]+256)&255;\n\t}\n\telse if(y==0) {\n\t\tfor(var x=  0; x<bpp; x++) data[di+x] = img[i+x];\n\n\t\tif(type==2) for(var x=bpp; x<bpl; x++) data[di+x] = img[i+x];\n\t\tif(type==3) for(var x=bpp; x<bpl; x++) data[di+x] = (img[i+x] - (img[i+x-bpp]>>1) +256)&255;\n\t\tif(type==4) for(var x=bpp; x<bpl; x++) data[di+x] = (img[i+x] - paeth(img[i+x-bpp], 0, 0) +256)&255;\n\t}\n\telse {\n\t\tif(type==2) { for(var x=  0; x<bpl; x++) data[di+x] = (img[i+x]+256 - img[i+x-bpl])&255;  }\n\t\tif(type==3) { for(var x=  0; x<bpp; x++) data[di+x] = (img[i+x]+256 - (img[i+x-bpl]>>1))&255;\n\t\t\t\t\t  for(var x=bpp; x<bpl; x++) data[di+x] = (img[i+x]+256 - ((img[i+x-bpl]+img[i+x-bpp])>>1))&255;  }\n\t\tif(type==4) { for(var x=  0; x<bpp; x++) data[di+x] = (img[i+x]+256 - paeth(0, img[i+x-bpl], 0))&255;\n\t\t\t\t\t  for(var x=bpp; x<bpl; x++) data[di+x] = (img[i+x]+256 - paeth(img[i+x-bpp], img[i+x-bpl], img[i+x-bpp-bpl]))&255;  }\n\t}\n}\n\nUPNG.crc = {\n\ttable : ( function() {\n\t   var tab = new Uint32Array(256);\n\t   for (var n=0; n<256; n++) {\n\t\t\tvar c = n;\n\t\t\tfor (var k=0; k<8; k++) {\n\t\t\t\tif (c & 1)  c = 0xedb88320 ^ (c >>> 1);\n\t\t\t\telse        c = c >>> 1;\n\t\t\t}\n\t\t\ttab[n] = c;  }\n\t\treturn tab;  })(),\n\tupdate : function(c, buf, off, len) {\n\t\tfor (var i=0; i<len; i++)  c = UPNG.crc.table[(c ^ buf[off+i]) & 0xff] ^ (c >>> 8);\n\t\treturn c;\n\t},\n\tcrc : function(b,o,l)  {  return UPNG.crc.update(0xffffffff,b,o,l) ^ 0xffffffff;  }\n}\n\n\nUPNG.quantize = function(abuf, ps)\n{\t\n\tvar oimg = new Uint8Array(abuf), nimg = oimg.slice(0), nimg32 = new Uint32Array(nimg.buffer);\n\t\n\tvar KD = UPNG.quantize.getKDtree(nimg, ps);\n\tvar root = KD[0], leafs = KD[1];\n\t\n\tvar planeDst = UPNG.quantize.planeDst;\n\tvar sb = oimg, tb = nimg32, len=sb.length;\n\t\t\n\tvar inds = new Uint8Array(oimg.length>>2), nd;\n\tif(oimg.length<20e6)  // precise, but slow :(\n\t\tfor(var i=0; i<len; i+=4) {\n\t\t\tvar r=sb[i]*(1/255), g=sb[i+1]*(1/255), b=sb[i+2]*(1/255), a=sb[i+3]*(1/255);\n\t\t\t\n\t\t\tnd = UPNG.quantize.getNearest(root, r, g, b, a);\n\t\t\tinds[i>>2] = nd.ind;  tb[i>>2] = nd.est.rgba;\n\t\t}\n\telse \n\t\tfor(var i=0; i<len; i+=4) {\n\t\t\tvar r=sb[i]*(1/255), g=sb[i+1]*(1/255), b=sb[i+2]*(1/255), a=sb[i+3]*(1/255);\n\t\t\t\n\t\t\tnd = root;  while(nd.left) nd = (planeDst(nd.est,r,g,b,a)<=0) ? nd.left : nd.right;\n\t\t\tinds[i>>2] = nd.ind;  tb[i>>2] = nd.est.rgba;\n\t\t}\n\treturn {  abuf:nimg.buffer, inds:inds, plte:leafs  };\n}\n\nUPNG.quantize.getKDtree = function(nimg, ps, err) {\n\tif(err==null) err = 0.0001;\n\tvar nimg32 = new Uint32Array(nimg.buffer);\n\t\n\tvar root = {i0:0, i1:nimg.length, bst:null, est:null, tdst:0, left:null, right:null };  // basic statistic, extra statistic\n\troot.bst = UPNG.quantize.stats(  nimg,root.i0, root.i1  );  root.est = UPNG.quantize.estats( root.bst );\n\tvar leafs = [root];\n\t\n\twhile(leafs.length<ps)\n\t{\n\t\tvar maxL = 0, mi=0;\n\t\tfor(var i=0; i<leafs.length; i++) if(leafs[i].est.L > maxL) {  maxL=leafs[i].est.L;  mi=i;  }\n\t\tif(maxL<err) break;\n\t\tvar node = leafs[mi];\n\t\t\n\t\tvar s0 = UPNG.quantize.splitPixels(nimg,nimg32, node.i0, node.i1, node.est.e, node.est.eMq255);\n\t\tvar s0wrong = (node.i0>=s0 || node.i1<=s0);\n\t\t//console.log(maxL, leafs.length, mi);\n\t\tif(s0wrong) {  node.est.L=0;  continue;  }\n\t\t\n\t\t\n\t\tvar ln = {i0:node.i0, i1:s0, bst:null, est:null, tdst:0, left:null, right:null };  ln.bst = UPNG.quantize.stats( nimg, ln.i0, ln.i1 );  \n\t\tln.est = UPNG.quantize.estats( ln.bst );\n\t\tvar rn = {i0:s0, i1:node.i1, bst:null, est:null, tdst:0, left:null, right:null };  rn.bst = {R:[], m:[], N:node.bst.N-ln.bst.N};\n\t\tfor(var i=0; i<16; i++) rn.bst.R[i] = node.bst.R[i]-ln.bst.R[i];\n\t\tfor(var i=0; i< 4; i++) rn.bst.m[i] = node.bst.m[i]-ln.bst.m[i];\n\t\trn.est = UPNG.quantize.estats( rn.bst );\n\t\t\n\t\tnode.left = ln;  node.right = rn;\n\t\tleafs[mi]=ln;  leafs.push(rn);\n\t}\n\tleafs.sort(function(a,b) {  return b.bst.N-a.bst.N;  });\n\tfor(var i=0; i<leafs.length; i++) leafs[i].ind=i;\n\treturn [root, leafs];\n}\n\nUPNG.quantize.getNearest = function(nd, r,g,b,a)\n{\n\tif(nd.left==null) {  nd.tdst = UPNG.quantize.dist(nd.est.q,r,g,b,a);  return nd;  }\n\tvar planeDst = UPNG.quantize.planeDst(nd.est,r,g,b,a);\n\t\n\tvar node0 = nd.left, node1 = nd.right;\n\tif(planeDst>0) {  node0=nd.right;  node1=nd.left;  }\n\t\n\tvar ln = UPNG.quantize.getNearest(node0, r,g,b,a);\n\tif(ln.tdst<=planeDst*planeDst) return ln;\n\tvar rn = UPNG.quantize.getNearest(node1, r,g,b,a);\n\treturn rn.tdst<ln.tdst ? rn : ln;\n}\nUPNG.quantize.planeDst = function(est, r,g,b,a) {  var e = est.e;  return e[0]*r + e[1]*g + e[2]*b + e[3]*a - est.eMq;  }\nUPNG.quantize.dist     = function(q,   r,g,b,a) {  var d0=r-q[0], d1=g-q[1], d2=b-q[2], d3=a-q[3];  return d0*d0+d1*d1+d2*d2+d3*d3;  }\n\nUPNG.quantize.splitPixels = function(nimg, nimg32, i0, i1, e, eMq)\n{\n\tvar vecDot = UPNG.quantize.vecDot;\n\ti1-=4;\n\tvar shfs = 0;\n\twhile(i0<i1)\n\t{\n\t\twhile(vecDot(nimg, i0, e)<=eMq) i0+=4;\n\t\twhile(vecDot(nimg, i1, e)> eMq) i1-=4;\n\t\tif(i0>=i1) break;\n\t\t\n\t\tvar t = nimg32[i0>>2];  nimg32[i0>>2] = nimg32[i1>>2];  nimg32[i1>>2]=t;\n\t\t\n\t\ti0+=4;  i1-=4;\n\t}\n\twhile(vecDot(nimg, i0, e)>eMq) i0-=4;\n\treturn i0+4;\n}\nUPNG.quantize.vecDot = function(nimg, i, e)\n{\n\treturn nimg[i]*e[0] + nimg[i+1]*e[1] + nimg[i+2]*e[2] + nimg[i+3]*e[3];\n}\nUPNG.quantize.stats = function(nimg, i0, i1){\n\tvar R = [0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0];\n\tvar m = [0,0,0,0];\n\tvar N = (i1-i0)>>2;\n\tfor(var i=i0; i<i1; i+=4)\n\t{\n\t\tvar r = nimg[i]*(1/255), g = nimg[i+1]*(1/255), b = nimg[i+2]*(1/255), a = nimg[i+3]*(1/255);\n\t\t//var r = nimg[i], g = nimg[i+1], b = nimg[i+2], a = nimg[i+3];\n\t\tm[0]+=r;  m[1]+=g;  m[2]+=b;  m[3]+=a;\n\t\t\n\t\tR[ 0] += r*r;  R[ 1] += r*g;  R[ 2] += r*b;  R[ 3] += r*a;  \n\t\t               R[ 5] += g*g;  R[ 6] += g*b;  R[ 7] += g*a; \n\t\t                              R[10] += b*b;  R[11] += b*a;  \n\t\t                                             R[15] += a*a;  \n\t}\n\tR[4]=R[1];  R[8]=R[2];  R[9]=R[6];  R[12]=R[3];  R[13]=R[7];  R[14]=R[11];\n\t\n\treturn {R:R, m:m, N:N};\n}\nUPNG.quantize.estats = function(stats){\n\tvar R = stats.R, m = stats.m, N = stats.N;\n\t\n\t// when all samples are equal, but N is large (millions), the Rj can be non-zero ( 0.0003.... - precission error)\n\tvar m0 = m[0], m1 = m[1], m2 = m[2], m3 = m[3], iN = (N==0 ? 0 : 1/N);\n\tvar Rj = [\n\t\tR[ 0] - m0*m0*iN,  R[ 1] - m0*m1*iN,  R[ 2] - m0*m2*iN,  R[ 3] - m0*m3*iN,  \n\t\tR[ 4] - m1*m0*iN,  R[ 5] - m1*m1*iN,  R[ 6] - m1*m2*iN,  R[ 7] - m1*m3*iN,\n\t\tR[ 8] - m2*m0*iN,  R[ 9] - m2*m1*iN,  R[10] - m2*m2*iN,  R[11] - m2*m3*iN,  \n\t\tR[12] - m3*m0*iN,  R[13] - m3*m1*iN,  R[14] - m3*m2*iN,  R[15] - m3*m3*iN \n\t];\n\t\n\tvar A = Rj, M = UPNG.M4;\n\tvar b = [Math.random(),Math.random(),Math.random(),Math.random()], mi = 0, tmi = 0;\n\t\n\tif(N!=0)\n\tfor(var i=0; i<16; i++) {\n\t\tb = M.multVec(A, b);  tmi = Math.sqrt(M.dot(b,b));  b = M.sml(1/tmi,  b);\n\t\tif(i!=0 && Math.abs(tmi-mi)<1e-9) break;  mi = tmi;\n\t}\t\n\t//b = [0,0,1,0];  mi=N;\n\tvar q = [m0*iN, m1*iN, m2*iN, m3*iN];\n\tvar eMq255 = M.dot(M.sml(255,q),b);\n\t\n\treturn {  Cov:Rj, q:q, e:b, L:mi,  eMq255:eMq255, eMq : M.dot(b,q),\n\t\t\t\trgba: (((Math.round(255*q[3])<<24) | (Math.round(255*q[2])<<16) |  (Math.round(255*q[1])<<8) | (Math.round(255*q[0])<<0))>>>0)  };\n}\nUPNG.M4 = {\n\tmultVec : function(m,v) {\n\t\t\treturn [\n\t\t\t\tm[ 0]*v[0] + m[ 1]*v[1] + m[ 2]*v[2] + m[ 3]*v[3],\n\t\t\t\tm[ 4]*v[0] + m[ 5]*v[1] + m[ 6]*v[2] + m[ 7]*v[3],\n\t\t\t\tm[ 8]*v[0] + m[ 9]*v[1] + m[10]*v[2] + m[11]*v[3],\n\t\t\t\tm[12]*v[0] + m[13]*v[1] + m[14]*v[2] + m[15]*v[3]\n\t\t\t];\n\t},\n\tdot : function(x,y) {  return  x[0]*y[0]+x[1]*y[1]+x[2]*y[2]+x[3]*y[3];  },\n\tsml : function(a,y) {  return [a*y[0],a*y[1],a*y[2],a*y[3]];  }\n}\n\nUPNG.encode.concatRGBA = function(bufs) {\n\tvar tlen = 0;\n\tfor(var i=0; i<bufs.length; i++) tlen += bufs[i].byteLength;\n\tvar nimg = new Uint8Array(tlen), noff=0;\n\tfor(var i=0; i<bufs.length; i++) {\n\t\tvar img = new Uint8Array(bufs[i]), il = img.length;\n\t\tfor(var j=0; j<il; j+=4) {  \n\t\t\tvar r=img[j], g=img[j+1], b=img[j+2], a = img[j+3];\n\t\t\tif(a==0) r=g=b=0;\n\t\t\tnimg[noff+j]=r;  nimg[noff+j+1]=g;  nimg[noff+j+2]=b;  nimg[noff+j+3]=a;  }\n\t\tnoff += il;\n\t}\n\treturn nimg.buffer;\n}\n"
  },
  {
    "path": "lib/UTIF.js",
    "content": "\n\n/* eslint-disable */\n\n;(function(){\nvar UTIF = {};\n\n// Make available for import by `require()`\nif (typeof module == \"object\") {module.exports = UTIF;}\nelse {self.UTIF = UTIF;}\n\nvar pako = (typeof require === \"function\") ? require(\"pako\") : self.pako;\n\nfunction log() { if (typeof process==\"undefined\" || process.env.NODE_ENV==\"development\") console.log.apply(console, arguments);  }\n\n(function(UTIF, pako){\n\t\n// Following lines add a JPEG decoder  to UTIF.JpegDecoder\n(function(){\"use strict\";var W=function a1(){function W(p){this.message=\"JPEG error: \"+p}W.prototype=new Error;W.prototype.name=\"JpegError\";W.constructor=W;return W}(),ak=function ag(){var p=new Uint8Array([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]),t=4017,ac=799,ah=3406,ao=2276,ar=1567,ai=3784,s=5793,ad=2896;function ak(Q){if(Q==null)Q={};if(Q.w==null)Q.w=-1;this.V=Q.n;this.N=Q.w}function a5(Q,h){var f=0,G=[],n,E,a=16,F;while(a>0&&!Q[a-1]){a--}G.push({children:[],index:0});var C=G[0];for(n=0;n<a;n++)\n{for(E=0;E<Q[n];E++){C=G.pop();C.children[C.index]=h[f];while(C.index>0){C=G.pop()}C.index++;G.push(C);while(G.length<=n){G.push(F={children:[],index:0});C.children[C.index]=F.children;C=F}f++}if(n+1<a){G.push(F={children:[],index:0});C.children[C.index]=F.children;C=F}}return G[0].children}function a2(Q,h,f){return 64*((Q.P+1)*h+f)}function a7(Q,h,f,G,n,E,a,C,F,d){if(d==null)d=!1;var T=f.m,U=f.Z,z=h,J=0,V=0,r=0,D=0,a8,q=0,X,O,_,N,e,K,x=0,k,g,R,c;function Y(){if(V>0){V--;return J>>V&1}J=Q[h++];if(J===255){var I=Q[h++];if(I){if(I===220&&d){h+=2;var l=Z(Q,h);h+=2;if(l>0&&l!==f.s){throw new DNLMarkerError(\"Found DNL marker (0xFFDC) while parsing scan data\",l)}}else if(I===217){if(d){var M=q*8;\nif(M>0&&M<f.s/10){throw new DNLMarkerError(\"Found EOI marker (0xFFD9) while parsing scan data, \"+\"possibly caused by incorrect `scanLines` parameter\",M)}}throw new EOIMarkerError(\"Found EOI marker (0xFFD9) while parsing scan data\")}throw new W(\"unexpected marker\")}}V=7;return J>>>7}function u(I){var l=I;while(!0){l=l[Y()];switch(typeof l){case\"number\":return l;case\"object\":continue}throw new W(\"invalid huffman sequence\")}}function m(I){var e=0;while(I>0){e=e<<1|Y();I--}return e}function j(I){if(I===1){return Y()===1?1:-1}var e=m(I);if(e>=1<<I-1){return e}return e+(-1<<I)+1}function v(X,I){var l=u(X.J),M=l===0?0:j(l),N=1;\nX.D[I]=X.Q+=M;while(N<64){var S=u(X.i),i=S&15,A=S>>4;if(i===0){if(A<15){break}N+=16;continue}N+=A;var o=p[N];X.D[I+o]=j(i);N++}}function $(X,I){var l=u(X.J),M=l===0?0:j(l)<<F;X.D[I]=X.Q+=M}function b(X,I){X.D[I]|=Y()<<F}function P(X,I){if(r>0){r--;return}var N=E,l=a;while(N<=l){var M=u(X.i),S=M&15,i=M>>4;if(S===0){if(i<15){r=m(i)+(1<<i)-1;break}N+=16;continue}N+=i;var A=p[N];X.D[I+A]=j(S)*(1<<F);N++}}function a4(X,I){var N=E,l=a,M=0,S,i;while(N<=l){var A=I+p[N],o=X.D[A]<0?-1:1;switch(D){case 0:i=u(X.i);S=i&15;M=i>>4;if(S===0){if(M<15){r=m(M)+(1<<M);D=4}else{M=16;D=1}}else{if(S!==1){throw new W(\"invalid ACn encoding\")}a8=j(S);D=M?2:3}continue;case 1:case 2:if(X.D[A]){X.D[A]+=o*(Y()<<F)}else{M--;if(M===0){D=D===2?3:0}}break;case 3:if(X.D[A]){X.D[A]+=o*(Y()<<F)}else{X.D[A]=a8<<F;\nD=0}break;case 4:if(X.D[A]){X.D[A]+=o*(Y()<<F)}break}N++}if(D===4){r--;if(r===0){D=0}}}function H(X,I,x,l,M){var S=x/T|0,i=x%T;q=S*X.A+l;var A=i*X.h+M,o=a2(X,q,A);I(X,o)}function w(X,I,x){q=x/X.P|0;var l=x%X.P,M=a2(X,q,l);I(X,M)}var y=G.length;if(U){if(E===0){K=C===0?$:b}else{K=C===0?P:a4}}else{K=v}if(y===1){g=G[0].P*G[0].c}else{g=T*f.R}while(x<=g){var L=n?Math.min(g-x,n):g;if(L>0){for(O=0;O<y;O++){G[O].Q=0}r=0;if(y===1){X=G[0];for(e=0;e<L;e++){w(X,K,x);x++}}else{for(e=0;e<L;\ne++){for(O=0;O<y;O++){X=G[O];R=X.h;c=X.A;for(_=0;_<c;_++){for(N=0;N<R;N++){H(X,K,x,_,N)}}}x++}}}V=0;k=an(Q,h);if(!k){break}if(k.u){var a6=L>0?\"unexpected\":\"excessive\";h=k.offset}if(k.M>=65488&&k.M<=65495){h+=2}else{break}}return h-z}function al(Q,h,f){var G=Q.$,n=Q.D,E,a,C,F,d,T,U,z,J,V,Y,u,m,j,v,$,b;if(!G){throw new W(\"missing required Quantization Table.\")}for(var r=0;r<64;r+=8){J=n[h+r];V=n[h+r+1];Y=n[h+r+2];u=n[h+r+3];m=n[h+r+4];j=n[h+r+5];v=n[h+r+6];$=n[h+r+7];J*=G[r];if((V|Y|u|m|j|v|$)===0){b=s*J+512>>10;f[r]=b;f[r+1]=b;f[r+2]=b;f[r+3]=b;f[r+4]=b;f[r+5]=b;f[r+6]=b;f[r+7]=b;continue}V*=G[r+1];Y*=G[r+2];u*=G[r+3];m*=G[r+4];j*=G[r+5];v*=G[r+6];$*=G[r+7];E=s*J+128>>8;a=s*m+128>>8;C=Y;F=v;d=ad*(V-$)+128>>8;z=ad*(V+$)+128>>8;\nT=u<<4;U=j<<4;E=E+a+1>>1;a=E-a;b=C*ai+F*ar+128>>8;C=C*ar-F*ai+128>>8;F=b;d=d+U+1>>1;U=d-U;z=z+T+1>>1;T=z-T;E=E+F+1>>1;F=E-F;a=a+C+1>>1;C=a-C;b=d*ao+z*ah+2048>>12;d=d*ah-z*ao+2048>>12;z=b;b=T*ac+U*t+2048>>12;T=T*t-U*ac+2048>>12;U=b;f[r]=E+z;f[r+7]=E-z;f[r+1]=a+U;f[r+6]=a-U;f[r+2]=C+T;f[r+5]=C-T;f[r+3]=F+d;f[r+4]=F-d}for(var P=0;P<8;++P){J=f[P];V=f[P+8];Y=f[P+16];u=f[P+24];m=f[P+32];j=f[P+40];v=f[P+48];$=f[P+56];if((V|Y|u|m|j|v|$)===0){b=s*J+8192>>14;if(b<-2040){b=0}else if(b>=2024){b=255}else{b=b+2056>>4}n[h+P]=b;n[h+P+8]=b;n[h+P+16]=b;n[h+P+24]=b;n[h+P+32]=b;n[h+P+40]=b;n[h+P+48]=b;n[h+P+56]=b;continue}E=s*J+2048>>12;a=s*m+2048>>12;C=Y;F=v;d=ad*(V-$)+2048>>12;z=ad*(V+$)+2048>>12;T=u;U=j;E=(E+a+1>>1)+4112;a=E-a;b=C*ai+F*ar+2048>>12;C=C*ar-F*ai+2048>>12;F=b;d=d+U+1>>1;U=d-U;z=z+T+1>>1;T=z-T;E=E+F+1>>1;F=E-F;a=a+C+1>>1;C=a-C;b=d*ao+z*ah+2048>>12;d=d*ah-z*ao+2048>>12;z=b;\nb=T*ac+U*t+2048>>12;T=T*t-U*ac+2048>>12;U=b;J=E+z;$=E-z;V=a+U;v=a-U;Y=C+T;j=C-T;u=F+d;m=F-d;if(J<16){J=0}else if(J>=4080){J=255}else{J>>=4}if(V<16){V=0}else if(V>=4080){V=255}else{V>>=4}if(Y<16){Y=0}else if(Y>=4080){Y=255}else{Y>>=4}if(u<16){u=0}else if(u>=4080){u=255}else{u>>=4}if(m<16){m=0}else if(m>=4080){m=255}else{m>>=4}if(j<16){j=0}else if(j>=4080){j=255}else{j>>=4}if(v<16){v=0}else if(v>=4080){v=255}else{v>>=4}if($<16){$=0}else if($>=4080){$=255}else{$>>=4}n[h+P]=J;\nn[h+P+8]=V;n[h+P+16]=Y;n[h+P+24]=u;n[h+P+32]=m;n[h+P+40]=j;n[h+P+48]=v;n[h+P+56]=$}}function a0(Q,h){var f=h.P,G=h.c,n=new Int16Array(64);for(var E=0;E<G;E++){for(var a=0;a<f;a++){var C=a2(h,E,a);al(h,C,n)}}return h.D}function an(Q,h,f){if(f==null)f=h;var G=Q.length-1,n=f<h?f:h;if(h>=G){return null}var E=Z(Q,h);if(E>=65472&&E<=65534){return{u:null,M:E,offset:h}}var a=Z(Q,n);while(!(a>=65472&&a<=65534)){if(++n>=G){return null}a=Z(Q,n)}return{u:E.toString(16),M:a,offset:n}}ak.prototype={parse(Q,h){if(h==null)h={};\nvar f=h.F,E=0,a=null,C=null,F,d,T=0;function G(){var o=Z(Q,E);E+=2;var B=E+o-2,V=an(Q,B,E);if(V&&V.u){B=V.offset}var ab=Q.subarray(E,B);E+=ab.length;return ab}function n(F){var o=Math.ceil(F.o/8/F.X),B=Math.ceil(F.s/8/F.B);for(var Y=0;Y<F.W.length;Y++){R=F.W[Y];var ab=Math.ceil(Math.ceil(F.o/8)*R.h/F.X),af=Math.ceil(Math.ceil(F.s/8)*R.A/F.B),ap=o*R.h,aq=B*R.A,ae=64*aq*(ap+1);R.D=new Int16Array(ae);R.P=ab;R.c=af}F.m=o;F.R=B}var U=[],z=[],J=[],V=Z(Q,E);E+=2;if(V!==65496){throw new W(\"SOI not found\")}V=Z(Q,E);\nE+=2;markerLoop:while(V!==65497){var Y,u,m;switch(V){case 65504:case 65505:case 65506:case 65507:case 65508:case 65509:case 65510:case 65511:case 65512:case 65513:case 65514:case 65515:case 65516:case 65517:case 65518:case 65519:case 65534:var j=G();if(V===65504){if(j[0]===74&&j[1]===70&&j[2]===73&&j[3]===70&&j[4]===0){a={version:{d:j[5],T:j[6]},K:j[7],j:j[8]<<8|j[9],H:j[10]<<8|j[11],S:j[12],I:j[13],C:j.subarray(14,14+3*j[12]*j[13])}}}if(V===65518){if(j[0]===65&&j[1]===100&&j[2]===111&&j[3]===98&&j[4]===101){C={version:j[5]<<8|j[6],k:j[7]<<8|j[8],q:j[9]<<8|j[10],a:j[11]}}}break;\ncase 65499:var v=Z(Q,E),b;E+=2;var $=v+E-2;while(E<$){var r=Q[E++],P=new Uint16Array(64);if(r>>4===0){for(u=0;u<64;u++){b=p[u];P[b]=Q[E++]}}else if(r>>4===1){for(u=0;u<64;u++){b=p[u];P[b]=Z(Q,E);E+=2}}else{throw new W(\"DQT - invalid table spec\")}U[r&15]=P}break;case 65472:case 65473:case 65474:if(F){throw new W(\"Only single frame JPEGs supported\")}E+=2;F={};F.G=V===65473;F.Z=V===65474;F.precision=Q[E++];var D=Z(Q,E),a4,q=0,H=0;E+=2;F.s=f||D;F.o=Z(Q,E);E+=2;F.W=[];F._={};var a8=Q[E++];for(Y=0;Y<a8;Y++){a4=Q[E];var w=Q[E+1]>>4,y=Q[E+1]&15;if(q<w){q=w}if(H<y){H=y}var X=Q[E+2];m=F.W.push({h:w,A:y,L:X,$:null});F._[a4]=m-1;E+=3}F.X=q;F.B=H;n(F);break;case 65476:var O=Z(Q,E);E+=2;\nfor(Y=2;Y<O;){var _=Q[E++],N=new Uint8Array(16),e=0;for(u=0;u<16;u++,E++){e+=N[u]=Q[E]}var K=new Uint8Array(e);for(u=0;u<e;u++,E++){K[u]=Q[E]}Y+=17+e;(_>>4===0?J:z)[_&15]=a5(N,K)}break;case 65501:E+=2;d=Z(Q,E);E+=2;break;case 65498:var x=++T===1&&!f,R;E+=2;var k=Q[E++],g=[];for(Y=0;Y<k;Y++){var c=Q[E++],L=F._[c];R=F.W[L];R.index=c;var a6=Q[E++];R.J=J[a6>>4];R.i=z[a6&15];g.push(R)}var I=Q[E++],l=Q[E++],M=Q[E++];try{var S=a7(Q,E,F,g,d,I,l,M>>4,M&15,x);E+=S}catch(ex){if(ex instanceof DNLMarkerError){return this.parse(Q,{F:ex.s})}else if(ex instanceof EOIMarkerError){break markerLoop}throw ex}break;case 65500:E+=4;break;case 65535:if(Q[E]!==255){E--}break;default:var i=an(Q,E-2,E-3);if(i&&i.u){E=i.offset;break}if(E>=Q.length-1){break markerLoop}throw new W(\"JpegImage.parse - unknown marker: \"+V.toString(16))}V=Z(Q,E);E+=2}this.width=F.o;this.height=F.s;this.g=a;this.b=C;this.W=[];for(Y=0;Y<F.W.length;Y++){R=F.W[Y];\nvar A=U[R.L];if(A){R.$=A}this.W.push({index:R.index,e:a0(F,R),l:R.h/F.X,t:R.A/F.B,P:R.P,c:R.c})}this.p=this.W.length;return undefined},Y(Q,h,f){if(f==null)f=!1;var G=this.width/Q,n=this.height/h,E,a,C,F,d,T,U,z,J,V,Y=0,u,m=this.W.length,j=Q*h*m,v=new Uint8ClampedArray(j),$=new Uint32Array(Q),b=4294967288,r;for(U=0;U<m;U++){E=this.W[U];a=E.l*G;C=E.t*n;Y=U;u=E.e;F=E.P+1<<3;if(a!==r){for(d=0;d<Q;d++){z=0|d*a;$[d]=(z&b)<<3|z&7}r=a}for(T=0;T<h;T++){z=0|T*C;V=F*(z&b)|(z&7)<<3;for(d=0;d<Q;d++){v[Y]=u[V+$[d]];Y+=m}}}var P=this.V;if(!f&&m===4&&!P){P=new Int32Array([-256,255,-256,255,-256,255,-256,255])}if(P){for(U=0;U<j;){for(z=0,J=0;z<m;z++,U++,J+=2){v[U]=(v[U]*P[J]>>8)+P[J+1]}}}return v},get f(){if(this.b){return!!this.b.a}if(this.p===3){if(this.N===0){return!1}else if(this.W[0].index===82&&this.W[1].index===71&&this.W[2].index===66){return!1}return!0}if(this.N===1){return!0}return!1},z:function aj(Q){var h,f,G;\nfor(var n=0,E=Q.length;n<E;n+=3){h=Q[n];f=Q[n+1];G=Q[n+2];Q[n]=h-179.456+1.402*G;Q[n+1]=h+135.459-.344*f-.714*G;Q[n+2]=h-226.816+1.772*f}return Q},O:function aa(Q){var h,f,G,n,E=0;for(var a=0,C=Q.length;a<C;a+=4){h=Q[a];f=Q[a+1];G=Q[a+2];n=Q[a+3];Q[E++]=-122.67195406894+f*(-660635669420364e-19*f+.000437130475926232*G-54080610064599e-18*h+.00048449797120281*n-.154362151871126)+G*(-.000957964378445773*G+.000817076911346625*h-.00477271405408747*n+1.53380253221734)+h*(.000961250184130688*h-.00266257332283933*n+.48357088451265)+n*(-.000336197177618394*n+.484791561490776);\nQ[E++]=107.268039397724+f*(219927104525741e-19*f-.000640992018297945*G+.000659397001245577*h+.000426105652938837*n-.176491792462875)+G*(-.000778269941513683*G+.00130872261408275*h+.000770482631801132*n-.151051492775562)+h*(.00126935368114843*h-.00265090189010898*n+.25802910206845)+n*(-.000318913117588328*n-.213742400323665);Q[E++]=-20.810012546947+f*(-.000570115196973677*f-263409051004589e-19*G+.0020741088115012*h-.00288260236853442*n+.814272968359295)+G*(-153496057440975e-19*G-.000132689043961446*h+.000560833691242812*n-.195152027534049)+h*(.00174418132927582*h-.00255243321439347*n+.116935020465145)+n*(-.000343531996510555*n+.24165260232407)}return Q.subarray(0,E)},r:function a3(Q){var h,f,G;\nfor(var n=0,E=Q.length;n<E;n+=4){h=Q[n];f=Q[n+1];G=Q[n+2];Q[n]=434.456-h-1.402*G;Q[n+1]=119.541-h+.344*f+.714*G;Q[n+2]=481.816-h-1.772*f}return Q},U:function as(Q){var h,f,G,n,E=0;for(var a=0,C=Q.length;a<C;a+=4){h=Q[a];f=Q[a+1];G=Q[a+2];n=Q[a+3];Q[E++]=255+h*(-6747147073602441e-20*h+.0008379262121013727*f+.0002894718188643294*G+.003264231057537806*n-1.1185611867203937)+f*(26374107616089404e-21*f-8626949158638572e-20*G-.0002748769067499491*n-.02155688794978967)+G*(-3878099212869363e-20*G-.0003267808279485286*n+.0686742238595345)-n*(.0003361971776183937*n+.7430659151342254);\nQ[E++]=255+h*(.00013596372813588848*h+.000924537132573585*f+.00010567359618683593*G+.0004791864687436512*n-.3109689587515875)+f*(-.00023545346108370344*f+.0002702845253534714*G+.0020200308977307156*n-.7488052167015494)+G*(6834815998235662e-20*G+.00015168452363460973*n-.09751927774728933)-n*(.0003189131175883281*n+.7364883807733168);Q[E++]=255+h*(13598650411385308e-21*h+.00012423956175490851*f+.0004751985097583589*G-36729317476630424e-22*n-.05562186980264034)+f*(.00016141380598724676*f+.0009692239130725186*G+.0007782692450036253*n-.44015232367526463)+G*(5.068882914068769e-7*G+.0017778369011375071*n-.7591454649749609)-n*(.0003435319965105553*n+.7063770186160144)}return Q.subarray(0,E)},getData:function(Q){var h=Q.width,f=Q.height,G=Q.forceRGB,n=Q.isSourcePDF;\nif(this.p>4){throw new W(\"Unsupported color mode\")}var E=this.Y(h,f,n);if(this.p===1&&G){var a=E.length,C=new Uint8ClampedArray(a*3),F=0;for(var d=0;d<a;d++){var T=E[d];C[F++]=T;C[F++]=T;C[F++]=T}return C}else if(this.p===3&&this.f){return this.z(E)}else if(this.p===4){if(this.f){if(G){return this.O(E)}return this.r(E)}else if(G){return this.U(E)}}return E}};return ak}();function a9(p,t){return p[t]<<24>>24}function Z(p,t){return p[t]<<8|p[t+1]}function am(p,t){return(p[t]<<24|p[t+1]<<16|p[t+2]<<8|p[t+3])>>>0}UTIF.JpegDecoder=ak}());\n\n//UTIF.JpegDecoder = PDFJS.JpegImage;\n\n\nUTIF.encodeImage = function(rgba, w, h, metadata)\n{\n\tvar idf = { \"t256\":[w], \"t257\":[h], \"t258\":[8,8,8,8], \"t259\":[1], \"t262\":[2], \"t273\":[1000], // strips offset\n\t\t\t\t\"t277\":[4], \"t278\":[h], /* rows per strip */          \"t279\":[w*h*4], // strip byte counts\n\t\t\t\t\"t282\":[[72,1]], \"t283\":[[72,1]], \"t284\":[1], \"t286\":[[0,1]], \"t287\":[[0,1]], \"t296\":[1], \"t305\": [\"Photopea (UTIF.js)\"], \"t338\":[1]\n\t\t};\n\tif (metadata) for (var i in metadata) idf[i] = metadata[i];\n\t\n\tvar prfx = new Uint8Array(UTIF.encode([idf]));\n\tvar img = new Uint8Array(rgba);\n\tvar data = new Uint8Array(1000+w*h*4);\n\tfor(var i=0; i<prfx.length; i++) data[i] = prfx[i];\n\tfor(var i=0; i<img .length; i++) data[1000+i] = img[i];\n\treturn data.buffer;\n}\n\nUTIF.encode = function(ifds)\n{\n\tvar LE = false;\n\tvar data = new Uint8Array(20000), offset = 4, bin = LE ? UTIF._binLE : UTIF._binBE;\n\tdata[0]=data[1]=LE?73:77;  bin.writeUshort(data,2,42);\n\n\tvar ifdo = 8;\n\tbin.writeUint(data, offset, ifdo);  offset+=4;\n\tfor(var i=0; i<ifds.length; i++)\n\t{\n\t\tvar noffs = UTIF._writeIFD(bin, UTIF._types.basic, data, ifdo, ifds[i]);\n\t\tifdo = noffs[1];\n\t\tif(i<ifds.length-1) {\n\t\t\tif((ifdo&3)!=0) ifdo+=(4-(ifdo&3));  // make each IFD start at multiple of 4\n\t\t\tbin.writeUint(data, noffs[0], ifdo);\n\t\t}\n\t}\n\treturn data.slice(0, ifdo).buffer;\n}\n\nUTIF.decode = function(buff, prm)\n{\n\tif(prm==null) prm = {parseMN:true, debug:false};  // read MakerNote, debug\n\tvar data = new Uint8Array(buff), offset = 0;\n\n\tvar id = UTIF._binBE.readASCII(data, offset, 2);  offset+=2;\n\tvar bin = id==\"II\" ? UTIF._binLE : UTIF._binBE;\n\tvar num = bin.readUshort(data, offset);  offset+=2;\n\n\tvar ifdo = bin.readUint(data, offset);  offset+=4;\n\tvar ifds = [];\n\twhile(true) {\n\t\tvar cnt = bin.readUshort(data,ifdo), typ = bin.readUshort(data,ifdo+4);  if(cnt!=0) if(typ<1 || 13<typ) {  log(\"error in TIFF\");  break  };\n\t\tUTIF._readIFD(bin, data, ifdo, ifds, 0, prm);\n\t\t\n\t\tifdo = bin.readUint(data, ifdo+2+cnt*12);\n\t\tif(ifdo==0) break;\n\t}\n\treturn ifds;\n}\n\nUTIF.decodeImage = function(buff, img, ifds)\n{\n\tif(img.data) return;\n\tvar data = new Uint8Array(buff);\n\tvar id = UTIF._binBE.readASCII(data, 0, 2);\n\n\tif(img[\"t256\"]==null) return;\t// No width => probably not an image\n\timg.isLE = id==\"II\";\n\timg.width  = img[\"t256\"][0];  //delete img[\"t256\"];\n\timg.height = img[\"t257\"][0];  //delete img[\"t257\"];\n\n\tvar cmpr   = img[\"t259\"] ? img[\"t259\"][0] : 1;  //delete img[\"t259\"];\n\tvar fo = img[\"t266\"] ? img[\"t266\"][0] : 1;  //delete img[\"t266\"];\n\tif(img[\"t284\"] && img[\"t284\"][0]==2) log(\"PlanarConfiguration 2 should not be used!\");\n\n\tvar bipp;  // bits per pixel\n\tif(img[\"t258\"]) bipp = Math.min(32,img[\"t258\"][0])*img[\"t258\"].length;\n\telse            bipp = (img[\"t277\"]?img[\"t277\"][0]:1);  \n\t// Some .NEF files have t258==14, even though they use 16 bits per pixel\n\tif(cmpr==1 && img[\"t279\"]!=null && img[\"t278\"] && img[\"t262\"][0]==32803)  {\n\t\tbipp = Math.round((img[\"t279\"][0]*8)/(img.width*img[\"t278\"][0]));\n\t}\n\tvar bipl = Math.ceil(img.width*bipp/8)*8;\n\tvar soff = img[\"t273\"];  if(soff==null) soff = img[\"t324\"];\n\tvar bcnt = img[\"t279\"];  if(cmpr==1 && soff.length==1) bcnt = [img.height*(bipl>>>3)];  if(bcnt==null) bcnt = img[\"t325\"];\n\t//bcnt[0] = Math.min(bcnt[0], data.length);  // Hasselblad, \"RAW_HASSELBLAD_H3D39II.3FR\"\n\tvar bytes = new Uint8Array(img.height*(bipl>>>3)), bilen = 0;\n\n\tif(img[\"t322\"]!=null) // tiled\n\t{\n\t\tvar tw = img[\"t322\"][0], th = img[\"t323\"][0];\n\t\tvar tx = Math.floor((img.width  + tw - 1) / tw);\n\t\tvar ty = Math.floor((img.height + th - 1) / th);\n\t\tvar tbuff = new Uint8Array(Math.ceil(tw*th*bipp/8)|0);\n\t\tfor(var y=0; y<ty; y++)\n\t\t\tfor(var x=0; x<tx; x++)\n\t\t\t{\n\t\t\t\tvar i = y*tx+x;  for(var j=0; j<tbuff.length; j++) tbuff[j]=0;\n\t\t\t\tUTIF.decode._decompress(img,ifds, data, soff[i], bcnt[i], cmpr, tbuff, 0, fo);\n\t\t\t\t// Might be required for 7 too. Need to check\n\t\t\t\tif (cmpr==6) bytes = tbuff;\n\t\t\t\telse UTIF._copyTile(tbuff, Math.ceil(tw*bipp/8)|0, th, bytes, Math.ceil(img.width*bipp/8)|0, img.height, Math.ceil(x*tw*bipp/8)|0, y*th);\n\t\t\t}\n\t\tbilen = bytes.length*8;\n\t}\n\telse\t// stripped\n\t{\n\t\tvar rps = img[\"t278\"] ? img[\"t278\"][0] : img.height;   rps = Math.min(rps, img.height);\n\t\tfor(var i=0; i<soff.length; i++)\n\t\t{\n\t\t\tUTIF.decode._decompress(img,ifds, data, soff[i], bcnt[i], cmpr, bytes, Math.ceil(bilen/8)|0, fo);\n\t\t\tbilen += bipl * rps;\n\t\t}\n\t\tbilen = Math.min(bilen, bytes.length*8);\n\t}\n\timg.data = new Uint8Array(bytes.buffer, 0, Math.ceil(bilen/8)|0);\n}\n\nUTIF.decode._decompress = function(img,ifds, data, off, len, cmpr, tgt, toff, fo)  // fill order\n{\n\t//console.log(\"compression\", cmpr);\n\t//var time = Date.now();\n\tif(false) {}\n\telse if(cmpr==1/* || (len==tgt.length && cmpr!=32767)*/) for(var j=0; j<len; j++) tgt[toff+j] = data[off+j];\n\telse if(cmpr==3) UTIF.decode._decodeG3 (data, off, len, tgt, toff, img.width, fo, img[\"t292\"]?((img[\"t292\"][0]&1)==1):false);\n\telse if(cmpr==4) UTIF.decode._decodeG4 (data, off, len, tgt, toff, img.width, fo);\n\telse if(cmpr==5) UTIF.decode._decodeLZW(data, off, len, tgt, toff,8);\n\telse if(cmpr==6) UTIF.decode._decodeOldJPEG(img, data, off, len, tgt, toff);\n\telse if(cmpr==7 || cmpr==34892) UTIF.decode._decodeNewJPEG(img, data, off, len, tgt, toff);\n\telse if(cmpr==8 || cmpr==32946) {  var src = new Uint8Array(data.buffer,off,len);  var bin = pako[\"inflate\"](src);  for(var i=0; i<bin.length; i++) tgt[toff+i]=bin[i];  }\n\telse if(cmpr==9) UTIF.decode._decodeVC5(data,off,len,tgt,toff);\n\telse if(cmpr==32767) UTIF.decode._decodeARW(img, data, off, len, tgt, toff);\n\telse if(cmpr==32773) UTIF.decode._decodePackBits(data, off, len, tgt, toff);\n\telse if(cmpr==32809) UTIF.decode._decodeThunder (data, off, len, tgt, toff);\n\telse if(cmpr==34713) //for(var j=0; j<len; j++) tgt[toff+j] = data[off+j];\n\t\tUTIF.decode._decodeNikon   (img,ifds, data, off, len, tgt, toff);\n\telse log(\"Unknown compression\", cmpr);\n\t\n\t//console.log(Date.now()-time);\n\t\n\tvar bps = (img[\"t258\"]?Math.min(32,img[\"t258\"][0]):1);\n\tvar noc = (img[\"t277\"]?img[\"t277\"][0]:1), bpp=(bps*noc)>>>3, h = (img[\"t278\"] ? img[\"t278\"][0] : img.height), bpl = Math.ceil(bps*noc*img.width/8);\n\t\n\t// convert to Little Endian  /*\n\tif(bps==16 && !img.isLE && img[\"t33422\"]==null)  // not DNG\n\t\tfor(var y=0; y<h; y++) {\n\t\t\t//console.log(\"fixing endianity\");\n\t\t\tvar roff = toff+y*bpl;\n\t\t\tfor(var x=1; x<bpl; x+=2) {  var t=tgt[roff+x];  tgt[roff+x]=tgt[roff+x-1];  tgt[roff+x-1]=t;  }\n\t\t}  //*/\n\n\tif(img[\"t317\"] && img[\"t317\"][0]==2)\n\t{\n\t\tfor(var y=0; y<h; y++)\n\t\t{\n\t\t\tvar ntoff = toff+y*bpl;\n\t\t\tif(bps==16) for(var j=bpp; j<bpl; j+=2) {\n\t\t\t\tvar nv = ((tgt[ntoff+j+1]<<8)|tgt[ntoff+j])  +  ((tgt[ntoff+j-bpp+1]<<8)|tgt[ntoff+j-bpp]);\n\t\t\t\ttgt[ntoff+j] = nv&255;  tgt[ntoff+j+1] = (nv>>>8)&255;  \n\t\t\t}\n\t\t\telse if(noc==3) for(var j=  3; j<bpl; j+=3)\n\t\t\t{\n\t\t\t\ttgt[ntoff+j  ] = (tgt[ntoff+j  ] + tgt[ntoff+j-3])&255;\n\t\t\t\ttgt[ntoff+j+1] = (tgt[ntoff+j+1] + tgt[ntoff+j-2])&255;\n\t\t\t\ttgt[ntoff+j+2] = (tgt[ntoff+j+2] + tgt[ntoff+j-1])&255;\n\t\t\t}\n\t\t\telse for(var j=bpp; j<bpl; j++) tgt[ntoff+j] = (tgt[ntoff+j] + tgt[ntoff+j-bpp])&255;\n\t\t}\n\t}\n}\n\nUTIF.decode._decodeVC5 = UTIF.decode._decodeVC5=function(){var e=[1,0,1,0,2,2,1,1,3,7,1,2,5,25,1,3,6,48,1,4,6,54,1,5,7,111,1,8,7,99,1,6,7,105,12,0,7,107,1,7,8,209,20,0,8,212,1,9,8,220,1,10,9,393,1,11,9,394,32,0,9,416,1,12,9,427,1,13,10,887,1,18,10,784,1,14,10,790,1,15,10,835,60,0,10,852,1,16,10,885,1,17,11,1571,1,19,11,1668,1,20,11,1669,100,0,11,1707,1,21,11,1772,1,22,12,3547,1,29,12,3164,1,24,12,3166,1,25,12,3140,1,23,12,3413,1,26,12,3537,1,27,12,3539,1,28,13,7093,1,35,13,6283,1,30,13,6331,1,31,13,6335,180,0,13,6824,1,32,13,7072,1,33,13,7077,320,0,13,7076,1,34,14,12565,1,36,14,12661,1,37,14,12669,1,38,14,13651,1,39,14,14184,1,40,15,28295,1,46,15,28371,1,47,15,25320,1,42,15,25336,1,43,15,25128,1,41,15,27300,1,44,15,28293,1,45,16,50259,1,48,16,50643,1,49,16,50675,1,50,16,56740,1,53,16,56584,1,51,16,56588,1,52,17,113483,1,61,17,113482,1,60,17,101285,1,55,17,101349,1,56,17,109205,1,57,17,109207,1,58,17,100516,1,54,17,113171,1,59,18,202568,1,62,18,202696,1,63,18,218408,1,64,18,218412,1,65,18,226340,1,66,18,226356,1,67,18,226358,1,68,19,402068,1,69,19,405138,1,70,19,405394,1,71,19,436818,1,72,19,436826,1,73,19,452714,1,75,19,452718,1,76,19,452682,1,74,20,804138,1,77,20,810279,1,78,20,810790,1,79,20,873638,1,80,20,873654,1,81,20,905366,1,82,20,905430,1,83,20,905438,1,84,21,1608278,1,85,21,1620557,1,86,21,1621582,1,87,21,1621583,1,88,21,1747310,1,89,21,1810734,1,90,21,1810735,1,91,21,1810863,1,92,21,1810879,1,93,22,3621725,1,99,22,3621757,1,100,22,3241112,1,94,22,3494556,1,95,22,3494557,1,96,22,3494622,1,97,22,3494623,1,98,23,6482227,1,102,23,6433117,1,101,23,6989117,1,103,23,6989119,1,105,23,6989118,1,104,23,7243449,1,106,23,7243512,1,107,24,13978233,1,111,24,12964453,1,109,24,12866232,1,108,24,14486897,1,113,24,13978232,1,110,24,14486896,1,112,24,14487026,1,114,24,14487027,1,115,25,25732598,1,225,25,25732597,1,189,25,25732596,1,188,25,25732595,1,203,25,25732594,1,202,25,25732593,1,197,25,25732592,1,207,25,25732591,1,169,25,25732590,1,223,25,25732589,1,159,25,25732522,1,235,25,25732579,1,152,25,25732575,1,192,25,25732489,1,179,25,25732573,1,201,25,25732472,1,172,25,25732576,1,149,25,25732488,1,178,25,25732566,1,120,25,25732571,1,219,25,25732577,1,150,25,25732487,1,127,25,25732506,1,211,25,25732548,1,125,25,25732588,1,158,25,25732486,1,247,25,25732467,1,238,25,25732508,1,163,25,25732552,1,228,25,25732603,1,183,25,25732513,1,217,25,25732587,1,168,25,25732520,1,122,25,25732484,1,128,25,25732562,1,249,25,25732505,1,187,25,25732504,1,186,25,25732483,1,136,25,25928905,1,181,25,25732560,1,255,25,25732500,1,230,25,25732482,1,135,25,25732555,1,233,25,25732568,1,222,25,25732583,1,145,25,25732481,1,134,25,25732586,1,167,25,25732521,1,248,25,25732518,1,209,25,25732480,1,243,25,25732512,1,216,25,25732509,1,164,25,25732547,1,140,25,25732479,1,157,25,25732544,1,239,25,25732574,1,191,25,25732564,1,251,25,25732478,1,156,25,25732546,1,139,25,25732498,1,242,25,25732557,1,133,25,25732477,1,162,25,25732515,1,213,25,25732584,1,165,25,25732514,1,212,25,25732476,1,227,25,25732494,1,198,25,25732531,1,236,25,25732530,1,234,25,25732529,1,117,25,25732528,1,215,25,25732527,1,124,25,25732526,1,123,25,25732525,1,254,25,25732524,1,253,25,25732523,1,148,25,25732570,1,218,25,25732580,1,146,25,25732581,1,147,25,25732569,1,224,25,25732533,1,143,25,25732540,1,184,25,25732541,1,185,25,25732585,1,166,25,25732556,1,132,25,25732485,1,129,25,25732563,1,250,25,25732578,1,151,25,25732501,1,119,25,25732502,1,193,25,25732536,1,176,25,25732496,1,245,25,25732553,1,229,25,25732516,1,206,25,25732582,1,144,25,25732517,1,208,25,25732558,1,137,25,25732543,1,241,25,25732466,1,237,25,25732507,1,190,25,25732542,1,240,25,25732551,1,131,25,25732554,1,232,25,25732565,1,252,25,25732475,1,171,25,25732493,1,205,25,25732492,1,204,25,25732491,1,118,25,25732490,1,214,25,25928904,1,180,25,25732549,1,126,25,25732602,1,182,25,25732539,1,175,25,25732545,1,141,25,25732559,1,138,25,25732537,1,177,25,25732534,1,153,25,25732503,1,194,25,25732606,1,160,25,25732567,1,121,25,25732538,1,174,25,25732497,1,246,25,25732550,1,130,25,25732572,1,200,25,25732474,1,170,25,25732511,1,221,25,25732601,1,196,25,25732532,1,142,25,25732519,1,210,25,25732495,1,199,25,25732605,1,155,25,25732535,1,154,25,25732499,1,244,25,25732510,1,220,25,25732600,1,195,25,25732607,1,161,25,25732604,1,231,25,25732473,1,173,25,25732599,1,226,26,51465122,1,116,26,51465123,0,1],x,u,H,d=[3,3,3,3,2,2,2,1,1,1],a=24576,a7=16384,K=8192,ai=a7|K;\nfunction A(B){var P=B[1],D=B[0][P>>>3]>>>7-(P&7)&1;B[1]++;return D}function aj(B,P){if(x==null){x={};\nfor(var D=0;D<e.length;D+=4)x[e[D+1]]=e.slice(D,D+4)}var U=A(B),X=x[U];while(X==null){U=U<<1|A(B);X=x[U]}var y=X[3];\nif(y!=0)y=A(B)==0?y:-y;P[0]=X[2];P[1]=y}function Q(B,P){for(var D=0;D<P;D++){if((B&1)==1)B++;B=B>>>1}return B}function c(B,P){return B>>P}function N(B,P,D,U,X,y){P[D]=c(c(11*B[X]-4*B[X+y]+B[X+y+y]+4,3)+B[U],1);\nP[D+y]=c(c(5*B[X]+4*B[X+y]-B[X+y+y]+4,3)-B[U],1)}function g(B,P,D,U,X,y){var n=B[X-y]-B[X+y],S=B[X],O=B[U];\nP[D]=c(c(n+4,3)+S+O,1);P[D+y]=c(c(-n+4,3)+S-O,1)}function L(B,P,D,U,X,y){P[D]=c(c(5*B[X]+4*B[X-y]-B[X-y-y]+4,3)+B[U],1);\nP[D+y]=c(c(11*B[X]-4*B[X-y]+B[X-y-y]+4,3)-B[U],1)}function t(B){B=B<0?0:B>4095?4095:B;B=H[B]>>>2;return B}function ab(B,P,D,U,X){U=new Uint16Array(U.buffer);\nvar y=Date.now(),n=UTIF._binBE,S=P+D,O,q,i,M,m,aA,T,a8,a0,am,au,a3,aw,ao,v,ax,p,k;P+=4;while(P<S){var W=n.readShort(B,P),E=n.readUshort(B,P+2);\nP+=4;if(W==12)O=E;else if(W==20)q=E;else if(W==21)i=E;else if(W==48)M=E;else if(W==53)m=E;else if(W==35)aA=E;\nelse if(W==62)T=E;else if(W==101)a8=E;else if(W==109)a0=E;else if(W==84)am=E;else if(W==106)au=E;else if(W==107)a3=E;\nelse if(W==108)aw=E;else if(W==102)ao=E;else if(W==104)v=E;else if(W==105)ax=E;else{var C=W<0?-W:W,F=C&65280,o=0;\nif(C&ai){if(C&K){o=E&65535;o+=(C&255)<<16}else{o=E&65535}}if((C&a)==a){if(p==null){p=[];for(var f=0;\nf<4;f++)p[f]=new Int16Array((q>>>1)*(i>>>1));k=new Int16Array((q>>>1)*(i>>>1));u=new Int16Array(1024);\nfor(var f=0;f<1024;f++){var aF=f-512,j=Math.abs(aF),O=Math.floor(768*j*j*j/(255*255*255))+j;u[f]=Math.sign(aF)*O}H=new Uint16Array(4096);\nvar al=(1<<16)-1;for(var f=0;f<4096;f++){var ad=f,az=al*(Math.pow(113,ad/4095)-1)/112;H[f]=Math.min(az,al)}}var Z=p[T],V=Q(q,1+d[M]),z=Q(i,1+d[M]);\nif(M==0){for(var b=0;b<z;b++)for(var G=0;G<V;G++){var w=P+(b*V+G)*2;Z[b*(q>>>1)+G]=B[w]<<8|B[w+1]}}else{var aC=[B,P*8],aq=[],a5=0,ae=V*z,I=[0,0],s=0,E=0;\nwhile(a5<ae){aj(aC,I);s=I[0];E=I[1];while(s>0){aq[a5++]=E;s--}}var $=(M-1)%3,aE=$!=1?V:0,as=$!=0?z:0;\nfor(var b=0;b<z;b++){var ay=(b+as)*(q>>>1)+aE,aa=b*V;for(var G=0;G<V;G++)Z[ay+G]=u[aq[aa+G]+512]*m}if($==2){var v=q>>>1,an=V*2,at=z*2;\nfor(var b=0;b<z;b++){for(var G=0;G<an;G++){var f=b*2*v+G,_=b*v+G,l=z*v+_;if(b==0)N(Z,k,f,l,_,v);else if(b==z-1)L(Z,k,f,l,_,v);\nelse g(Z,k,f,l,_,v)}}var h=Z;Z=k;k=h;for(var b=0;b<at;b++){for(var G=0;G<V;G++){var f=b*v+2*G,_=b*v+G,l=V+_;\nif(G==0)N(Z,k,f,l,_,1);else if(G==V-1)L(Z,k,f,l,_,1);else g(Z,k,f,l,_,1)}}var h=Z;Z=k;k=h;var a6=[],aD=2-~~((M-1)/3);\nfor(var r=0;r<3;r++)a6[r]=a0>>14-r*2&3;var af=a6[aD];if(af!=0)for(var b=0;b<at;b++)for(var G=0;G<an;\nG++){var f=b*v+G;Z[f]=Z[f]<<af}}}if(M==9&&T==3){var a2=p[0],ar=p[1],ah=p[2],a1=p[3];for(var b=0;b<i;\nb+=2)for(var G=0;G<q;G+=2){var J=b*q+G,w=(b>>>1)*(q>>>1)+(G>>>1),R=a2[w],ak=ar[w]-2048,aB=ah[w]-2048,av=a1[w]-2048,a4=(ak<<1)+R,a9=(aB<<1)+R,ap=R+av,ag=R-av;\nU[J]=t(a4);U[J+1]=t(ap);U[J+q]=t(ag);U[J+q+1]=t(a9)}}P+=o*4}else if(C==16388){P+=o*4}else if(F==8192||F==8448||F==9216){}else throw C.toString(16)}}console.log(Date.now()-y)}return ab}()\n\nUTIF.decode._ljpeg_diff = function(data, prm, huff) {\n\tvar getbithuff   = UTIF.decode._getbithuff;\n\tvar len, diff;\n\tlen  = getbithuff(data, prm, huff[0], huff);\n\tdiff = getbithuff(data, prm, len, 0);\n\tif ((diff & (1 << (len-1))) == 0)  diff -= (1 << len) - 1;\n\treturn diff;\n}\nUTIF.decode._decodeARW = function(img, inp, off, src_length, tgt, toff) {\n\tvar raw_width = img[\"t256\"][0], height=img[\"t257\"][0], tiff_bps=img[\"t258\"][0];\n\tvar bin=(img.isLE ? UTIF._binLE : UTIF._binBE);\n\t//console.log(raw_width, height, tiff_bps, raw_width*height, src_length);\n\tvar arw2 = (raw_width*height == src_length) || (raw_width*height*1.5 == src_length);\n\t//arw2 = true;\n\t//console.log(\"ARW2: \", arw2, raw_width*height, src_length, tgt.length);\n\tif(!arw2) {  //\"sony_arw_load_raw\"; // not arw2\n\t\theight+=8;\n\t\tvar prm = [off,0,0,0];\n\t\tvar huff = new Uint16Array(32770);\n\t\tvar tab = [ 0xf11,0xf10,0xe0f,0xd0e,0xc0d,0xb0c,0xa0b,0x90a,0x809,\n\t\t\t0x708,0x607,0x506,0x405,0x304,0x303,0x300,0x202,0x201 ];\n\t\tvar i, c, n, col, row, sum=0;\n\t\tvar ljpeg_diff = UTIF.decode._ljpeg_diff;\n\n\t\thuff[0] = 15;\n\t\tfor (n=i=0; i < 18; i++) {\n\t\t\tvar lim = 32768 >>> (tab[i] >>> 8);\n\t\t\tfor(var c=0; c<lim; c++) huff[++n] = tab[i];\n\t\t}\n\t\tfor (col = raw_width; col--; )\n\t\t\tfor (row=0; row < height+1; row+=2) {\n\t\t\t\tif (row == height) row = 1;\n\t\t\t\tsum += ljpeg_diff(inp, prm, huff);\n\t\t\t\tif (row < height) {\n\t\t\t\t\tvar clr =  (sum)&4095;\n\t\t\t\t\tUTIF.decode._putsF(tgt, (row*raw_width+col)*tiff_bps, clr<<(16-tiff_bps));\n\t\t\t\t}\n\t\t\t}\n\t\treturn;\n\t}\n\tif(raw_width*height*1.5==src_length) {\n\t\t//console.log(\"weird compression\");\n\t\tfor(var i=0; i<src_length; i+=3) {  var b0=inp[off+i+0], b1=inp[off+i+1], b2=inp[off+i+2];  \n\t\t\ttgt[toff+i]=(b1<<4)|(b0>>>4);  tgt[toff+i+1]=(b0<<4)|(b2>>>4);  tgt[toff+i+2]=(b2<<4)|(b1>>>4);  }\n\t\treturn;\n\t}\n\t\n\tvar pix = new Uint16Array(16);\n\tvar row, col, val, max, min, imax, imin, sh, bit, i,    dp;\n\t\n\tvar data = new Uint8Array(raw_width+1);\n\tfor (row=0; row < height; row++) {\n\t\t//fread (data, 1, raw_width, ifp);\n\t\tfor(var j=0; j<raw_width; j++) data[j]=inp[off++];\n\t\tfor (dp=0, col=0; col < raw_width-30; dp+=16) {\n\t\t\tmax  = 0x7ff & (val = bin.readUint(data,dp));\n\t\t\tmin  = 0x7ff & (val >>> 11);\n\t\t\timax = 0x0f & (val >>> 22);\n\t\t\timin = 0x0f & (val >>> 26);\n\t\t\tfor (sh=0; sh < 4 && 0x80 << sh <= max-min; sh++);\n\t\t\tfor (bit=30, i=0; i < 16; i++)\n\t\t\t\tif      (i == imax) pix[i] = max;\n\t\t\t\telse if (i == imin) pix[i] = min;\n\t\t\t\telse {\n\t\t\t\t\tpix[i] = ((bin.readUshort(data, dp+(bit >> 3)) >>> (bit & 7) & 0x7f) << sh) + min;\n\t\t\t\t\tif (pix[i] > 0x7ff) pix[i] = 0x7ff;\n\t\t\t\t\tbit += 7;\n\t\t\t\t}\n\t\t\tfor (i=0; i < 16; i++, col+=2) {\n\t\t\t\t//RAW(row,col) = curve[pix[i] << 1] >> 2;\n\t\t\t\tvar clr =  pix[i]<<1;   //clr = 0xffff;\n\t\t\t\tUTIF.decode._putsF(tgt, (row*raw_width+col)*tiff_bps, clr<<(16-tiff_bps));\n\t\t\t}\n\t\t\tcol -= col & 1 ? 1:31;\n\t\t}\n\t}\n}\n\nUTIF.decode._decodeNikon = function(img,imgs, data, off, src_length, tgt, toff)\n{\n\tvar nikon_tree = [\n    [ 0, 0,1,5,1,1,1,1,1,1,2,0,0,0,0,0,0,\t/* 12-bit lossy */\n      5,4,3,6,2,7,1,0,8,9,11,10,12 ],\n    [ 0, 0,1,5,1,1,1,1,1,1,2,0,0,0,0,0,0,\t/* 12-bit lossy after split */\n      0x39,0x5a,0x38,0x27,0x16,5,4,3,2,1,0,11,12,12 ],\n    [ 0, 0,1,4,2,3,1,2,0,0,0,0,0,0,0,0,0,  /* 12-bit lossless */\n      5,4,6,3,7,2,8,1,9,0,10,11,12 ],\n    [ 0, 0,1,4,3,1,1,1,1,1,2,0,0,0,0,0,0,\t/* 14-bit lossy */\n      5,6,4,7,8,3,9,2,1,0,10,11,12,13,14 ],\n    [ 0, 0,1,5,1,1,1,1,1,1,1,2,0,0,0,0,0,\t/* 14-bit lossy after split */\n      8,0x5c,0x4b,0x3a,0x29,7,6,5,4,3,2,1,0,13,14 ],\n    [ 0, 0,1,4,2,2,3,1,2,0,0,0,0,0,0,0,0,\t/* 14-bit lossless */\n      7,6,8,5,9,4,10,3,11,12,2,0,1,13,14 ] ];\n\t  \n\tvar raw_width = img[\"t256\"][0], height=img[\"t257\"][0], tiff_bps=img[\"t258\"][0];\n\t\n\tvar tree = 0, split = 0;\n\tvar make_decoder = UTIF.decode._make_decoder;\n\tvar getbithuff   = UTIF.decode._getbithuff;\n\t\n\tvar mn = imgs[0].exifIFD.makerNote, md = mn[\"t150\"]?mn[\"t150\"]:mn[\"t140\"], mdo=0;  //console.log(mn,md);\n\t//console.log(md[0].toString(16), md[1].toString(16), tiff_bps);\n\tvar ver0 = md[mdo++], ver1 = md[mdo++];\n\tif (ver0 == 0x49 || ver1 == 0x58)  mdo+=2110;\n\tif (ver0 == 0x46) tree = 2;\n\tif (tiff_bps == 14) tree += 3;\n\t\n\tvar vpred = [[0,0],[0,0]], bin=(img.isLE ? UTIF._binLE : UTIF._binBE);\n\tfor(var i=0; i<2; i++) for(var j=0; j<2; j++) {  vpred[i][j] = bin.readShort(md,mdo);  mdo+=2;   }  // not sure here ... [i][j] or [j][i]\n\t//console.log(vpred);\n\t\n\t\n\tvar max = 1 << tiff_bps & 0x7fff, step=0;\n\tvar csize = bin.readShort(md,mdo);  mdo+=2;\n\tif (csize > 1) step = Math.floor(max / (csize-1));\n\tif (ver0 == 0x44 && ver1 == 0x20 && step > 0)  split = bin.readShort(md,562);\n\t\n\t\n\tvar i;\n\tvar row, col;\n\tvar len, shl, diff;\n\tvar min_v = 0;\n\tvar hpred = [0,0];\n\tvar huff = make_decoder(nikon_tree[tree]);\n\t\n\t//var g_input_offset=0, bitbuf=0, vbits=0, reset=0;\n\tvar prm = [off,0,0,0];\n\t//console.log(split);  split = 170;\n\t\n\tfor (min_v=row=0; row < height; row++) {\n\t\tif (split && row == split) {\n\t\t\t//free (huff);\n\t\t\thuff = make_decoder (nikon_tree[tree+1]);\n\t\t\t//max_v += (min_v = 16) << 1;\n\t\t}\n\t\tfor (col=0; col < raw_width; col++) {\n\t\t\ti = getbithuff(data,prm,huff[0],huff);\n\t\t\tlen = i  & 15;\n\t\t\tshl = i >>> 4;\n\t\t\tdiff = (((getbithuff(data,prm,len-shl,0) << 1) + 1) << shl) >>> 1;\n\t\t\tif ((diff & (1 << (len-1))) == 0)\n\t\t\t\tdiff -= (1 << len) - (shl==0?1:0);\n\t\t\tif (col < 2) hpred[col] = vpred[row & 1][col] += diff;\n\t\t\telse         hpred[col & 1] += diff;\n\t\t\t\n\t\t\tvar clr = Math.min(Math.max(hpred[col & 1],0),(1<<tiff_bps)-1);\n\t\t\tvar bti = (row*raw_width+col)*tiff_bps;  \n\t\t\tUTIF.decode._putsF(tgt, bti, clr<<(16-tiff_bps));\n\t\t}\n\t}\n}\n// put 16 bits\nUTIF.decode._putsF= function(dt, pos, val) {  val = val<<(8-(pos&7));  var o=(pos>>>3);  dt[o]|=val>>>16;  dt[o+1]|=val>>>8;  dt[o+2]|=val;  }\n\n\nUTIF.decode._getbithuff = function(data,prm,nbits, huff) {\n\tvar zero_after_ff = 0;\n\tvar get_byte = UTIF.decode._get_byte;\n\tvar c;\n  \n\tvar off=prm[0], bitbuf=prm[1], vbits=prm[2], reset=prm[3];\n\n\t//if (nbits > 25) return 0;\n\t//if (nbits <  0) return bitbuf = vbits = reset = 0;\n\tif (nbits == 0 || vbits < 0) return 0; \n\twhile (!reset && vbits < nbits && (c = data[off++]) != -1 &&\n\t\t!(reset = zero_after_ff && c == 0xff && data[off++])) {\n\t\t//console.log(\"byte read into c\");\n\t\tbitbuf = (bitbuf << 8) + c;\n\t\tvbits += 8;\n\t} \n\tc = (bitbuf << (32-vbits)) >>> (32-nbits);\n\tif (huff) {\n\t\tvbits -= huff[c+1] >>> 8;  //console.log(c, huff[c]>>8);\n\t\tc =  huff[c+1]&255;\n\t} else\n\t\tvbits -= nbits;\n\tif (vbits < 0) throw \"e\";\n  \n\tprm[0]=off;  prm[1]=bitbuf;  prm[2]=vbits;  prm[3]=reset;\n  \n\treturn c;\n}\n\nUTIF.decode._make_decoder = function(source) {\n\tvar max, len, h, i, j;\n\tvar huff = [];\n\n\tfor (max=16; max!=0 && !source[max]; max--);\n\tvar si=17;\n\t\n\thuff[0] = max;\n\tfor (h=len=1; len <= max; len++)\n\t\tfor (i=0; i < source[len]; i++, ++si)\n\t\t\tfor (j=0; j < 1 << (max-len); j++)\n\t\t\t\tif (h <= 1 << max)\n\t\t\t\t\thuff[h++] = (len << 8) | source[si];\n\treturn huff;\n}\n\nUTIF.decode._decodeNewJPEG = function(img, data, off, len, tgt, toff)\n{\n\tlen = Math.min(len, data.length-off);\n\tvar tables = img[\"t347\"], tlen = tables ? tables.length : 0, buff = new Uint8Array(tlen + len);\n\t\n\tif (tables) {\n\t\tvar SOI = 216, EOI = 217, boff = 0;\n\t\tfor (var i=0; i<(tlen-1); i++)\n\t\t{\n\t\t\t// Skip EOI marker from JPEGTables\n\t\t\tif (tables[i]==255 && tables[i+1]==EOI) break;\n\t\t\tbuff[boff++] = tables[i];\n\t\t}\n\n\t\t// Skip SOI marker from data\n\t\tvar byte1 = data[off], byte2 = data[off + 1];\n\t\tif (byte1!=255 || byte2!=SOI)\n\t\t{\n\t\t\tbuff[boff++] = byte1;\n\t\t\tbuff[boff++] = byte2;\n\t\t}\n\t\tfor (var i=2; i<len; i++) buff[boff++] = data[off+i];\n\t}\n\telse for (var i=0; i<len; i++) buff[i] = data[off+i];\n\n\tif(img[\"t262\"][0]==32803 || (img[\"t259\"][0]==7 && img[\"t262\"][0]==34892)) // lossless JPEG (used in DNG files)\n\t{\n\t\tvar bps = img[\"t258\"][0];//, dcdr = new LosslessJpegDecoder();\n\t\t//var time = Date.now();\n\t\tvar out = UTIF.LosslessJpegDecode(buff), olen=out.length;  //console.log(olen);\n\t\t//var out = ULLJPG(buff), olen=out.length;  //console.log(olen);\n\t\t//console.log(Date.now()-time);\n\t\t\n\t\tif(false) {}\n\t\telse if(bps==16) {\n\t\t\tif(img.isLE) for(var i=0; i<olen; i++ ) {  tgt[toff+(i<<1)] = (out[i]&255);  tgt[toff+(i<<1)+1] = (out[i]>>>8);  }\n\t\t\telse         for(var i=0; i<olen; i++ ) {  tgt[toff+(i<<1)] = (out[i]>>>8);  tgt[toff+(i<<1)+1] = (out[i]&255);  }\n\t\t}\n\t\telse if(bps==14 || bps==12) {  // 4 * 14 == 56 == 7 * 8\n\t\t\tvar rst = 16-bps;\n\t\t\tfor(var i=0; i<olen; i++) UTIF.decode._putsF(tgt, i*bps, out[i]<<rst);\n\t\t}\n\t\telse if(bps==8) {\n\t\t\tfor(var i=0; i<olen; i++) tgt[toff+i]=out[i];\n\t\t}\n\t\telse throw new Error(\"unsupported bit depth \"+bps);\n\t}\n\telse\n\t{\n\t\tvar parser = new UTIF.JpegDecoder();  parser.parse(buff);\n\t\tvar decoded = parser.getData({\"width\":parser.width,\"height\":parser.height,\"forceRGB\":true,\"isSourcePDF\":false});\n\t\tfor (var i=0; i<decoded.length; i++) tgt[toff + i] = decoded[i];\n\t}\n\n\t// PhotometricInterpretation is 6 (YCbCr) for JPEG, but after decoding we populate data in\n\t// RGB format, so updating the tag value\n\tif(img[\"t262\"][0] == 6)  img[\"t262\"][0] = 2;\n}\n\nUTIF.decode._decodeOldJPEGInit = function(img, data, off, len)\n{\n\tvar SOI = 216, EOI = 217, DQT = 219, DHT = 196, DRI = 221, SOF0 = 192, SOS = 218;\n\tvar joff = 0, soff = 0, tables, sosMarker, isTiled = false, i, j, k;\n\tvar jpgIchgFmt    = img[\"t513\"], jifoff = jpgIchgFmt ? jpgIchgFmt[0] : 0;\n\tvar jpgIchgFmtLen = img[\"t514\"], jiflen = jpgIchgFmtLen ? jpgIchgFmtLen[0] : 0;\n\tvar soffTag       = img[\"t324\"] || img[\"t273\"] || jpgIchgFmt;\n\tvar ycbcrss       = img[\"t530\"], ssx = 0, ssy = 0;\n\tvar spp           = img[\"t277\"]?img[\"t277\"][0]:1;\n\tvar jpgresint     = img[\"t515\"];\n\n\tif(soffTag)\n\t{\n\t\tsoff = soffTag[0];\n\t\tisTiled = (soffTag.length > 1);\n\t}\n\n\tif(!isTiled)\n\t{\n\t\tif(data[off]==255 && data[off+1]==SOI) return { jpegOffset: off };\n\t\tif(jpgIchgFmt!=null)\n\t\t{\n\t\t\tif(data[off+jifoff]==255 && data[off+jifoff+1]==SOI) joff = off+jifoff;\n\t\t\telse log(\"JPEGInterchangeFormat does not point to SOI\");\n\n\t\t\tif(jpgIchgFmtLen==null) log(\"JPEGInterchangeFormatLength field is missing\");\n\t\t\telse if(jifoff >= soff || (jifoff+jiflen) <= soff) log(\"JPEGInterchangeFormatLength field value is invalid\");\n\n\t\t\tif(joff != null) return { jpegOffset: joff };\n\t\t}\n\t}\n\n\tif(ycbcrss!=null) {  ssx = ycbcrss[0];  ssy = ycbcrss[1];  }\n\n\tif(jpgIchgFmt!=null)\n\t\tif(jpgIchgFmtLen!=null)\n\t\t\tif(jiflen >= 2 && (jifoff+jiflen) <= soff)\n\t\t\t{\n\t\t\t\tif(data[off+jifoff+jiflen-2]==255 && data[off+jifoff+jiflen-1]==SOI) tables = new Uint8Array(jiflen-2);\n\t\t\t\telse tables = new Uint8Array(jiflen);\n\n\t\t\t\tfor(i=0; i<tables.length; i++) tables[i] = data[off+jifoff+i];\n\t\t\t\tlog(\"Incorrect JPEG interchange format: using JPEGInterchangeFormat offset to derive tables\");\n\t\t\t}\n\t\t\telse log(\"JPEGInterchangeFormat+JPEGInterchangeFormatLength > offset to first strip or tile\");\n\n\tif(tables == null)\n\t{\n\t\tvar ooff = 0, out = [];\n\t\tout[ooff++] = 255; out[ooff++] = SOI;\n\n\t\tvar qtables = img[\"t519\"];\n\t\tif(qtables==null) throw new Error(\"JPEGQTables tag is missing\");\n\t\tfor(i=0; i<qtables.length; i++)\n\t\t{\n\t\t\tout[ooff++] = 255; out[ooff++] = DQT; out[ooff++] = 0; out[ooff++] = 67; out[ooff++] = i;\n\t\t\tfor(j=0; j<64; j++) out[ooff++] = data[off+qtables[i]+j];\n\t\t}\n\n\t\tfor(k=0; k<2; k++)\n\t\t{\n\t\t\tvar htables = img[(k == 0) ? \"t520\" : \"t521\"];\n\t\t\tif(htables==null) throw new Error(((k == 0) ? \"JPEGDCTables\" : \"JPEGACTables\") + \" tag is missing\");\n\t\t\tfor(i=0; i<htables.length; i++)\n\t\t\t{\n\t\t\t\tout[ooff++] = 255; out[ooff++] = DHT;\n\t\t\t\t//out[ooff++] = 0; out[ooff++] = 67; out[ooff++] = i;\n\t\t\t\tvar nc = 19;\n\t\t\t\tfor(j=0; j<16; j++) nc += data[off+htables[i]+j];\n\n\t\t\t\tout[ooff++] = (nc >>> 8); out[ooff++] = nc & 255;\n\t\t\t\tout[ooff++] = (i | (k << 4));\n\t\t\t\tfor(j=0; j<16; j++) out[ooff++] = data[off+htables[i]+j];\n\t\t\t\tfor(j=0; j<nc; j++) out[ooff++] = data[off+htables[i]+16+j];\n\t\t\t}\n\t\t}\n\n\t\tout[ooff++] = 255; out[ooff++] = SOF0;\n\t\tout[ooff++] = 0;  out[ooff++] = 8 + 3*spp;  out[ooff++] = 8;\n\t\tout[ooff++] = (img.height >>> 8) & 255;  out[ooff++] = img.height & 255;\n\t\tout[ooff++] = (img.width  >>> 8) & 255;  out[ooff++] = img.width  & 255;\n\t\tout[ooff++] = spp;\n\t\tif(spp==1) {  out[ooff++] = 1;  out[ooff++] = 17;  out[ooff++] = 0;  }\n\t\telse for(i=0; i<3; i++)\n\t\t{\n\t\t\tout[ooff++] = i + 1;\n\t\t\tout[ooff++] = (i != 0) ? 17 : (((ssx & 15) << 4) | (ssy & 15));\n\t\t\tout[ooff++] = i;\n\t\t}\n\n\t\tif(jpgresint!=null && jpgresint[0]!=0)\n\t\t{\n\t\t\tout[ooff++] = 255;  out[ooff++] = DRI;  out[ooff++] = 0;  out[ooff++] = 4;\n\t\t\tout[ooff++] = (jpgresint[0] >>> 8) & 255;\n\t\t\tout[ooff++] = jpgresint[0] & 255;\n\t\t}\n\n\t\ttables = new Uint8Array(out);\n\t}\n\n\tvar sofpos = -1;\n\ti = 0;\n\twhile(i < (tables.length - 1)) {\n\t\tif(tables[i]==255 && tables[i+1]==SOF0) {  sofpos = i; break;  }\n\t\ti++;\n\t}\n\n\tif(sofpos == -1)\n\t{\n\t\tvar tmptab = new Uint8Array(tables.length + 10 + 3*spp);\n\t\ttmptab.set(tables);\n\t\tvar tmpoff = tables.length;\n\t\tsofpos = tables.length;\n\t\ttables = tmptab;\n\n\t\ttables[tmpoff++] = 255; tables[tmpoff++] = SOF0;\n\t\ttables[tmpoff++] = 0;  tables[tmpoff++] = 8 + 3*spp;  tables[tmpoff++] = 8;\n\t\ttables[tmpoff++] = (img.height >>> 8) & 255;  tables[tmpoff++] = img.height & 255;\n\t\ttables[tmpoff++] = (img.width  >>> 8) & 255;  tables[tmpoff++] = img.width  & 255;\n\t\ttables[tmpoff++] = spp;\n\t\tif(spp==1) {  tables[tmpoff++] = 1;  tables[tmpoff++] = 17;  tables[tmpoff++] = 0;  }\n\t\telse for(i=0; i<3; i++)\n\t\t{\n\t\t\ttables[tmpoff++] = i + 1;\n\t\t\ttables[tmpoff++] = (i != 0) ? 17 : (((ssx & 15) << 4) | (ssy & 15));\n\t\t\ttables[tmpoff++] = i;\n\t\t}\n\t}\n\n\tif(data[soff]==255 && data[soff+1]==SOS)\n\t{\n\t\tvar soslen = (data[soff+2]<<8) | data[soff+3];\n\t\tsosMarker = new Uint8Array(soslen+2);\n\t\tsosMarker[0] = data[soff];  sosMarker[1] = data[soff+1]; sosMarker[2] = data[soff+2];  sosMarker[3] = data[soff+3];\n\t\tfor(i=0; i<(soslen-2); i++) sosMarker[i+4] = data[soff+i+4];\n\t}\n\telse\n\t{\n\t\tsosMarker = new Uint8Array(2 + 6 + 2*spp);\n\t\tvar sosoff = 0;\n\t\tsosMarker[sosoff++] = 255;  sosMarker[sosoff++] = SOS;\n\t\tsosMarker[sosoff++] = 0;  sosMarker[sosoff++] = 6 + 2*spp;  sosMarker[sosoff++] = spp;\n\t\tif(spp==1) {  sosMarker[sosoff++] = 1;  sosMarker[sosoff++] = 0;  }\n\t\telse for(i=0; i<3; i++)\n\t\t{\n\t\t\tsosMarker[sosoff++] = i+1;  sosMarker[sosoff++] = (i << 4) | i;\n\t\t}\n\t\tsosMarker[sosoff++] = 0;  sosMarker[sosoff++] = 63;  sosMarker[sosoff++] = 0;\n\t}\n\n\treturn { jpegOffset: off, tables: tables, sosMarker: sosMarker, sofPosition: sofpos };\n}\n\nUTIF.decode._decodeOldJPEG = function(img, data, off, len, tgt, toff)\n{\n\tvar i, dlen, tlen, buff, buffoff;\n\tvar jpegData = UTIF.decode._decodeOldJPEGInit(img, data, off, len);\n\n\tif(jpegData.jpegOffset!=null)\n\t{\n\t\tdlen = off+len-jpegData.jpegOffset;\n\t\tbuff = new Uint8Array(dlen);\n\t\tfor(i=0; i<dlen; i++) buff[i] = data[jpegData.jpegOffset+i];\n\t}\n\telse\n\t{\n\t\ttlen = jpegData.tables.length;\n\t\tbuff = new Uint8Array(tlen + jpegData.sosMarker.length + len + 2);\n\t\tbuff.set(jpegData.tables);\n\t\tbuffoff = tlen;\n\n\t\tbuff[jpegData.sofPosition+5] = (img.height >>> 8) & 255;  buff[jpegData.sofPosition+6] = img.height & 255;\n\t\tbuff[jpegData.sofPosition+7] = (img.width  >>> 8) & 255;  buff[jpegData.sofPosition+8] = img.width  & 255;\n\n\t\tif(data[off]!=255 || data[off+1]!=SOS)\n\t\t{\n\t\t\tbuff.set(jpegData.sosMarker, buffoff);\n\t\t\tbuffoff += sosMarker.length;\n\t\t}\n\t\tfor(i=0; i<len; i++) buff[buffoff++] = data[off+i];\n\t\tbuff[buffoff++] = 255;  buff[buffoff++] = EOI;\n\t}\n\n\tvar parser = new UTIF.JpegDecoder();  parser.parse(buff);\n\tvar decoded = parser.getData({\"width\":parser.width,\"height\":parser.height,\"forceRGB\":true,\"isSourcePDF\":false});\n\tfor (var i=0; i<decoded.length; i++) tgt[toff + i] = decoded[i];\n\n\t// PhotometricInterpretation is 6 (YCbCr) for JPEG, but after decoding we populate data in\n\t// RGB format, so updating the tag value\n\tif(img[\"t262\"] && img[\"t262\"][0] == 6)  img[\"t262\"][0] = 2;\n}\n\nUTIF.decode._decodePackBits = function(data, off, len, tgt, toff)\n{\n\tvar sa = new Int8Array(data.buffer), ta = new Int8Array(tgt.buffer), lim = off+len;\n\twhile(off<lim)\n\t{\n\t\tvar n = sa[off];  off++;\n\t\tif(n>=0  && n<128)    for(var i=0; i< n+1; i++) {  ta[toff]=sa[off];  toff++;  off++;   }\n\t\tif(n>=-127 && n<0) {  for(var i=0; i<-n+1; i++) {  ta[toff]=sa[off];  toff++;           }  off++;  }\n\t}\n}\n\nUTIF.decode._decodeThunder = function(data, off, len, tgt, toff)\n{\n\tvar d2 = [ 0, 1, 0, -1 ],  d3 = [ 0, 1, 2, 3, 0, -3, -2, -1 ];\n\tvar lim = off+len, qoff = toff*2, px = 0;\n\twhile(off<lim)\n\t{\n\t\tvar b = data[off], msk = (b>>>6), n = (b&63);  off++;\n\t\tif(msk==3) { px=(n&15);  tgt[qoff>>>1] |= (px<<(4*(1-qoff&1)));  qoff++;   }\n\t\tif(msk==0) for(var i=0; i<n; i++) {  tgt[qoff>>>1] |= (px<<(4*(1-qoff&1)));  qoff++;   }\n\t\tif(msk==2) for(var i=0; i<2; i++) {  var d=(n>>>(3*(1-i)))&7;  if(d!=4) { px+=d3[d];  tgt[qoff>>>1] |= (px<<(4*(1-qoff&1)));  qoff++; }  }\n\t\tif(msk==1) for(var i=0; i<3; i++) {  var d=(n>>>(2*(2-i)))&3;  if(d!=2) { px+=d2[d];  tgt[qoff>>>1] |= (px<<(4*(1-qoff&1)));  qoff++; }  }\n\t}\n}\n\nUTIF.decode._dmap = { \"1\":0,\"011\":1,\"000011\":2,\"0000011\":3, \"010\":-1,\"000010\":-2,\"0000010\":-3  };\nUTIF.decode._lens = ( function()\n{\n\tvar addKeys = function(lens, arr, i0, inc) {  for(var i=0; i<arr.length; i++) lens[arr[i]] = i0 + i*inc;  }\n\n\tvar termW = \"00110101,000111,0111,1000,1011,1100,1110,1111,10011,10100,00111,01000,001000,000011,110100,110101,\" // 15\n\t+ \"101010,101011,0100111,0001100,0001000,0010111,0000011,0000100,0101000,0101011,0010011,0100100,0011000,00000010,00000011,00011010,\" // 31\n\t+ \"00011011,00010010,00010011,00010100,00010101,00010110,00010111,00101000,00101001,00101010,00101011,00101100,00101101,00000100,00000101,00001010,\" // 47\n\t+ \"00001011,01010010,01010011,01010100,01010101,00100100,00100101,01011000,01011001,01011010,01011011,01001010,01001011,00110010,00110011,00110100\";\n\n\tvar termB = \"0000110111,010,11,10,011,0011,0010,00011,000101,000100,0000100,0000101,0000111,00000100,00000111,000011000,\" // 15\n\t+ \"0000010111,0000011000,0000001000,00001100111,00001101000,00001101100,00000110111,00000101000,00000010111,00000011000,000011001010,000011001011,000011001100,000011001101,000001101000,000001101001,\" // 31\n\t+ \"000001101010,000001101011,000011010010,000011010011,000011010100,000011010101,000011010110,000011010111,000001101100,000001101101,000011011010,000011011011,000001010100,000001010101,000001010110,000001010111,\" // 47\n\t+ \"000001100100,000001100101,000001010010,000001010011,000000100100,000000110111,000000111000,000000100111,000000101000,000001011000,000001011001,000000101011,000000101100,000001011010,000001100110,000001100111\";\n\n\tvar makeW = \"11011,10010,010111,0110111,00110110,00110111,01100100,01100101,01101000,01100111,011001100,011001101,011010010,011010011,011010100,011010101,011010110,\"\n\t+ \"011010111,011011000,011011001,011011010,011011011,010011000,010011001,010011010,011000,010011011\";\n\n\tvar makeB = \"0000001111,000011001000,000011001001,000001011011,000000110011,000000110100,000000110101,0000001101100,0000001101101,0000001001010,0000001001011,0000001001100,\"\n\t+ \"0000001001101,0000001110010,0000001110011,0000001110100,0000001110101,0000001110110,0000001110111,0000001010010,0000001010011,0000001010100,0000001010101,0000001011010,\"\n\t+ \"0000001011011,0000001100100,0000001100101\";\n\n\tvar makeA = \"00000001000,00000001100,00000001101,000000010010,000000010011,000000010100,000000010101,000000010110,000000010111,000000011100,000000011101,000000011110,000000011111\";\n\n\ttermW = termW.split(\",\");  termB = termB.split(\",\");  makeW = makeW.split(\",\");  makeB = makeB.split(\",\");  makeA = makeA.split(\",\");\n\n\tvar lensW = {}, lensB = {};\n\taddKeys(lensW, termW, 0, 1);  addKeys(lensW, makeW, 64,64);  addKeys(lensW, makeA, 1792,64);\n\taddKeys(lensB, termB, 0, 1);  addKeys(lensB, makeB, 64,64);  addKeys(lensB, makeA, 1792,64);\n\treturn [lensW, lensB];\n} )();\n\nUTIF.decode._decodeG4 = function(data, off, slen, tgt, toff, w, fo)\n{\n\tvar U = UTIF.decode, boff=off<<3, len=0, wrd=\"\";\t// previous starts with 1\n\tvar line=[], pline=[];  for(var i=0; i<w; i++) pline.push(0);  pline=U._makeDiff(pline);\n\tvar a0=0, a1=0, a2=0, b1=0, b2=0, clr=0;\n\tvar y=0, mode=\"\", toRead=0;\n\tvar bipl = Math.ceil(w/8)*8;\n\n\twhile((boff>>>3)<off+slen)\n\t{\n\t\tb1 = U._findDiff(pline, a0+(a0==0?0:1), 1-clr), b2 = U._findDiff(pline, b1, clr);\t// could be precomputed\n\t\tvar bit =0;\n\t\tif(fo==1) bit = (data[boff>>>3]>>>(7-(boff&7)))&1;\n\t\tif(fo==2) bit = (data[boff>>>3]>>>(  (boff&7)))&1;\n\t\tboff++;  wrd+=bit;\n\t\tif(mode==\"H\")\n\t\t{\n\t\t\tif(U._lens[clr][wrd]!=null)\n\t\t\t{\n\t\t\t\tvar dl=U._lens[clr][wrd];  wrd=\"\";  len+=dl;\n\t\t\t\tif(dl<64) {  U._addNtimes(line,len,clr);  a0+=len;  clr=1-clr;  len=0;  toRead--;  if(toRead==0) mode=\"\";  }\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wrd==\"0001\")  {  wrd=\"\";  U._addNtimes(line,b2-a0,clr);  a0=b2;   }\n\t\t\tif(wrd==\"001\" )  {  wrd=\"\";  mode=\"H\";  toRead=2;  }\n\t\t\tif(U._dmap[wrd]!=null) {  a1 = b1+U._dmap[wrd];  U._addNtimes(line, a1-a0, clr);  a0=a1;  wrd=\"\";  clr=1-clr;  }\n\t\t}\n\t\tif(line.length==w && mode==\"\")\n\t\t{\n\t\t\tU._writeBits(line, tgt, toff*8+y*bipl);\n\t\t\tclr=0;  y++;  a0=0;\n\t\t\tpline=U._makeDiff(line);  line=[];\n\t\t}\n\t\t//if(wrd.length>150) {  log(wrd);  break;  throw \"e\";  }\n\t}\n}\n\nUTIF.decode._findDiff = function(line, x, clr) {  for(var i=0; i<line.length; i+=2) if(line[i]>=x && line[i+1]==clr)  return line[i];  }\n\nUTIF.decode._makeDiff = function(line)\n{\n\tvar out = [];  if(line[0]==1) out.push(0,1);\n\tfor(var i=1; i<line.length; i++) if(line[i-1]!=line[i]) out.push(i, line[i]);\n\tout.push(line.length,0,line.length,1);  return out;\n}\n\nUTIF.decode._decodeG3 = function(data, off, slen, tgt, toff, w, fo, twoDim)\n{\n\tvar U = UTIF.decode, boff=off<<3, len=0, wrd=\"\";\n\tvar line=[], pline=[];  for(var i=0; i<w; i++) line.push(0);\n\tvar a0=0, a1=0, a2=0, b1=0, b2=0, clr=0;\n\tvar y=-1, mode=\"\", toRead=0, is1D=true;\n\tvar bipl = Math.ceil(w/8)*8;\n\twhile((boff>>>3)<off+slen)\n\t{\n\t\tb1 = U._findDiff(pline, a0+(a0==0?0:1), 1-clr), b2 = U._findDiff(pline, b1, clr);\t// could be precomputed\n\t\tvar bit =0;\n\t\tif(fo==1) bit = (data[boff>>>3]>>>(7-(boff&7)))&1;\n\t\tif(fo==2) bit = (data[boff>>>3]>>>(  (boff&7)))&1;\n\t\tboff++;  wrd+=bit;\n\n\t\tif(is1D)\n\t\t{\n\t\t\tif(U._lens[clr][wrd]!=null)\n\t\t\t{\n\t\t\t\tvar dl=U._lens[clr][wrd];  wrd=\"\";  len+=dl;\n\t\t\t\tif(dl<64) {  U._addNtimes(line,len,clr);  clr=1-clr;  len=0;  }\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(mode==\"H\")\n\t\t\t{\n\t\t\t\tif(U._lens[clr][wrd]!=null)\n\t\t\t\t{\n\t\t\t\t\tvar dl=U._lens[clr][wrd];  wrd=\"\";  len+=dl;\n\t\t\t\t\tif(dl<64) {  U._addNtimes(line,len,clr);  a0+=len;  clr=1-clr;  len=0;  toRead--;  if(toRead==0) mode=\"\";  }\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(wrd==\"0001\")  {  wrd=\"\";  U._addNtimes(line,b2-a0,clr);  a0=b2;   }\n\t\t\t\tif(wrd==\"001\" )  {  wrd=\"\";  mode=\"H\";  toRead=2;  }\n\t\t\t\tif(U._dmap[wrd]!=null) {  a1 = b1+U._dmap[wrd];  U._addNtimes(line, a1-a0, clr);  a0=a1;  wrd=\"\";  clr=1-clr;  }\n\t\t\t}\n\t\t}\n\t\tif(wrd.endsWith(\"000000000001\")) // needed for some files\n\t\t{\n\t\t\tif(y>=0) U._writeBits(line, tgt, toff*8+y*bipl);\n\t\t\tif(twoDim) {\n\t\t\t\tif(fo==1) is1D = ((data[boff>>>3]>>>(7-(boff&7)))&1)==1;\n\t\t\t\tif(fo==2) is1D = ((data[boff>>>3]>>>(  (boff&7)))&1)==1;\n\t\t\t\tboff++;\n\t\t\t}\n\t\t\t//log(\"EOL\",y, \"next 1D:\", is1D);\n\t\t\twrd=\"\";  clr=0;  y++;  a0=0;\n\t\t\tpline=U._makeDiff(line);  line=[];\n\t\t}\n\t}\n\tif(line.length==w) U._writeBits(line, tgt, toff*8+y*bipl);\n}\n\nUTIF.decode._addNtimes = function(arr, n, val) {  for(var i=0; i<n; i++) arr.push(val);  }\n\nUTIF.decode._writeBits = function(bits, tgt, boff)\n{\n\tfor(var i=0; i<bits.length; i++) tgt[(boff+i)>>>3] |= (bits[i]<<(7-((boff+i)&7)));\n}\n\nUTIF.decode._decodeLZW=UTIF.decode._decodeLZW=function(){var e,U,Z,u,K=0,V=0,g=0,N=0,O=function(){var S=e>>>3,A=U[S]<<16|U[S+1]<<8|U[S+2],j=A>>>24-(e&7)-V&(1<<V)-1;\ne+=V;return j},h=new Uint32Array(4096*4),w=0,m=function(S){if(S==w)return;w=S;g=1<<S;N=g+1;for(var A=0;\nA<N+1;A++){h[4*A]=h[4*A+3]=A;h[4*A+1]=65535;h[4*A+2]=1}},i=function(S){V=S+1;K=N+1},D=function(S){var A=S<<2,j=h[A+2],a=u+j-1;\nwhile(A!=65535){Z[a--]=h[A];A=h[A+1]}u+=j},L=function(S,A){var j=K<<2,a=S<<2;h[j]=h[(A<<2)+3];h[j+1]=a;\nh[j+2]=h[a+2]+1;h[j+3]=h[a+3];K++;if(K+1==1<<V&&V!=12)V++},T=function(S,A,j,a,n,q){e=A<<3;U=S;Z=a;u=n;\nvar B=A+j<<3,_=0,t=0;m(q);i(q);while(e<B&&(_=O())!=N){if(_==g){i(q);_=O();if(_==N)break;D(_)}else{if(_<K){D(_);\nL(t,_)}else{L(t,t);D(K-1)}}t=_}return u};return T}();\n\nUTIF.tags = {};\n//UTIF.ttypes = {  256:3,257:3,258:3,   259:3, 262:3,  273:4,  274:3, 277:3,278:4,279:4, 282:5, 283:5, 284:3, 286:5,287:5, 296:3, 305:2, 306:2, 338:3, 513:4, 514:4, 34665:4  };\n// start at tag 250\nUTIF._types = function() {\n\tvar main = new Array(250);  main.fill(0);\n\tmain = main.concat([0,0,0,0,4,3,3,3,3,3,0,0,3,0,0,0,3,0,0,2,2,2,2,4,3,0,0,3,4,4,3,3,5,5,3,2,5,5,0,0,0,0,4,4,0,0,3,3,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,2,2,3,5,5,3,0,3,3,4,4,4,3,4,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,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,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]);\n\tvar rest = {33432: 2, 33434: 5, 33437: 5, 34665: 4, 34850: 3, 34853: 4, 34855: 3, 34864: 3, 34866: 4, 36864: 7, 36867: 2, 36868: 2, 37121: 7, 37377: 10, 37378: 5, 37380: 10, 37381: 5, 37383: 3, 37384: 3, 37385: 3, 37386: 5, 37510: 7, 37520: 2, 37521: 2, 37522: 2, 40960: 7, 40961: 3, 40962: 4, 40963: 4, 40965: 4, 41486: 5, 41487: 5, 41488: 3, 41985: 3, 41986: 3, 41987: 3, 41988: 5, 41989: 3, 41990: 3, 41993: 3, 41994: 3, 41995: 7, 41996: 3, 42032: 2, 42033: 2, 42034: 5, 42036: 2, 42037: 2, 59932: 7};\n\treturn {\n\t\tbasic: {\n\t\t\tmain: main,\n\t\t\trest: rest\n\t\t},\n\t\tgps: {\n\t\t\tmain: [1,2,5,2,5,1,5,5,0,9],\n\t\t\trest: {18:2,29:2}\n\t\t}\n\t}\n}();\n\nUTIF._readIFD = function(bin, data, offset, ifds, depth, prm)\n{\n\tvar cnt = bin.readUshort(data, offset);  offset+=2;\n\tvar ifd = {};\n\n\tif(prm.debug) log(\"   \".repeat(depth),ifds.length-1,\">>>----------------\");\n\tfor(var i=0; i<cnt; i++)\n\t{\n\t\tvar tag  = bin.readUshort(data, offset);    offset+=2;\n\t\tvar type = bin.readUshort(data, offset);    offset+=2;\n\t\tvar num  = bin.readUint  (data, offset);    offset+=4;\n\t\tvar voff = bin.readUint  (data, offset);    offset+=4;\n\t\t\n\t\tvar arr = [];\n\t\t//ifd[\"t\"+tag+\"-\"+UTIF.tags[tag]] = arr;\n\t\tif(type== 1 || type==7) {  arr = new Uint8Array(data.buffer, (num<5 ? offset-4 : voff), num);  }\n\t\tif(type== 2) {  var o0 = (num<5 ? offset-4 : voff), c=data[o0], len=Math.max(0, Math.min(num-1,data.length-o0));\n\t\t\t\t\t\tif(c<128 || len==0) arr.push( bin.readASCII(data, o0, len) );\n\t\t\t\t\t\telse      arr = new Uint8Array(data.buffer, o0, len);  }\n\t\tif(type== 3) {  for(var j=0; j<num; j++) arr.push(bin.readUshort(data, (num<3 ? offset-4 : voff)+2*j));  }\n\t\tif(type== 4 \n\t\t|| type==13) {  for(var j=0; j<num; j++) arr.push(bin.readUint  (data, (num<2 ? offset-4 : voff)+4*j));  }\n\t\tif(type== 5 || type==10) {  \n\t\t\tvar ri = type==5 ? bin.readUint : bin.readInt;\n\t\t\tfor(var j=0; j<num; j++) arr.push([ri(data, voff+j*8), ri(data,voff+j*8+4)]);  }\n\t\tif(type== 8) {  for(var j=0; j<num; j++) arr.push(bin.readShort (data, (num<3 ? offset-4 : voff)+2*j));  }\n\t\tif(type== 9) {  for(var j=0; j<num; j++) arr.push(bin.readInt   (data, (num<2 ? offset-4 : voff)+4*j));  }\n\t\tif(type==11) {  for(var j=0; j<num; j++) arr.push(bin.readFloat (data, voff+j*4));  }\n\t\tif(type==12) {  for(var j=0; j<num; j++) arr.push(bin.readDouble(data, voff+j*8));  }\n\t\t\n\t\tif(num!=0 && arr.length==0) {  log(tag, \"unknown TIFF tag type: \", type, \"num:\",num);  if(i==0)return;  continue;  }\n\t\tif(prm.debug) log(\"   \".repeat(depth), tag, type, UTIF.tags[tag], arr);\n\t\t\n\t\tifd[\"t\"+tag] = arr;\n\t\t\n\t\tif(tag==330 && ifd[\"t272\"] && ifd[\"t272\"][0]==\"DSLR-A100\") {  } \n\t\telse if(tag==330 || tag==34665 || tag==34853 || (tag==50740 && bin.readUshort(data,bin.readUint(arr,0))<300  ) ||tag==61440) {\n\t\t\tvar oarr = tag==50740 ? [bin.readUint(arr,0)] : arr;\n\t\t\tvar subfd = [];\n\t\t\tfor(var j=0; j<oarr.length; j++) UTIF._readIFD(bin, data, oarr[j], subfd, depth+1, prm);\n\t\t\tif(tag==  330) ifd.subIFD = subfd;\n\t\t\tif(tag==34665) ifd.exifIFD = subfd[0];\n\t\t\tif(tag==34853) ifd.gpsiIFD = subfd[0];  //console.log(\"gps\", subfd[0]);  }\n\t\t\tif(tag==50740) ifd.dngPrvt = subfd[0];\n\t\t\tif(tag==61440) ifd.fujiIFD = subfd[0];\n\t\t}\n\t\tif(tag==37500 && prm.parseMN) {\n\t\t\tvar mn = arr;\n\t\t\t//console.log(bin.readASCII(mn,0,mn.length), mn);\n\t\t\tif(bin.readASCII(mn,0,5)==\"Nikon\")  ifd.makerNote = UTIF[\"decode\"](mn.slice(10).buffer)[0];\n\t\t\telse if(bin.readUshort(data,voff)<300 && bin.readUshort(data,voff+4)<=12){\n\t\t\t\tvar subsub=[];  UTIF._readIFD(bin, data, voff, subsub, depth+1, prm);\n\t\t\t\tifd.makerNote = subsub[0];\n\t\t\t}\n\t\t}\n\t}\n\tifds.push(ifd);\n\tif(prm.debug) log(\"   \".repeat(depth),\"<<<---------------\");\n\treturn offset;\n}\n\nUTIF._writeIFD = function(bin, types, data, offset, ifd)\n{\n\tvar keys = Object.keys(ifd), knum=keys.length;  if(ifd[\"exifIFD\"]) knum--;  if(ifd[\"gpsiIFD\"]) knum--;\n\tbin.writeUshort(data, offset, knum);  offset+=2;\n\n\tvar eoff = offset + knum*12 + 4;\n\n\tfor(var ki=0; ki<keys.length; ki++)\n\t{\n\t\tvar key = keys[ki];  if(key==\"t34665\" || key==\"t34853\") continue;  \n\t\tif(key==\"exifIFD\") key=\"t34665\";  if(key==\"gpsiIFD\") key=\"t34853\";\n\t\tvar tag = parseInt(key.slice(1)), type = types.main[tag];  if(type==null) type=types.rest[tag];\t\t\n\t\tif(type==null || type==0) throw new Error(\"unknown type of tag: \"+tag);\n\t\t//console.log(offset+\":\", tag, type, eoff);\n\t\tvar val = ifd[key];  \n\t\tif(tag==34665) {\n\t\t\tvar outp = UTIF._writeIFD(bin, types, data, eoff, ifd[\"exifIFD\"]);\n\t\t\tval = [eoff];  eoff = outp[1];\n\t\t}\n\t\tif(tag==34853) {\n\t\t\tvar outp = UTIF._writeIFD(bin, UTIF._types.gps, data, eoff, ifd[\"gpsiIFD\"]);\n\t\t\tval = [eoff];  eoff = outp[1];\n\t\t}\n\t\tif(type==2) val=val[0]+\"\\u0000\";  var num = val.length;\n\t\tbin.writeUshort(data, offset, tag );  offset+=2;\n\t\tbin.writeUshort(data, offset, type);  offset+=2;\n\t\tbin.writeUint  (data, offset, num );  offset+=4;\n\n\t\tvar dlen = [-1, 1, 1, 2, 4, 8, 0, 1, 0, 4, 8, 0, 8][type] * num;  //if(dlen<1) throw \"e\";\n\t\tvar toff = offset;\n\t\tif(dlen>4) {  bin.writeUint(data, offset, eoff);  toff=eoff;  }\n\n\t\tif     (type== 1 || type==7) {  for(var i=0; i<num; i++) data[toff+i] = val[i];  }\n\t\telse if(type== 2) {  bin.writeASCII(data, toff, val);   }\n\t\telse if(type== 3) {  for(var i=0; i<num; i++) bin.writeUshort(data, toff+2*i, val[i]);    }\n\t\telse if(type== 4) {  for(var i=0; i<num; i++) bin.writeUint  (data, toff+4*i, val[i]);    }\n\t\telse if(type== 5 || type==10) {  \n\t\t\tvar wr = type==5?bin.writeUint:bin.writeInt;\n\t\t\tfor(var i=0; i<num; i++) {  \n\t\t\tvar v=val[i],nu=v[0],de=v[1];  if(nu==null) throw \"e\";  wr(data, toff+8*i, nu);  wr(data, toff+8*i+4, de);  }   }\n\t\telse if(type== 9) {  for(var i=0; i<num; i++) bin.writeInt   (data, toff+4*i, val[i]);    }\n\t\telse if(type==12) {  for(var i=0; i<num; i++) bin.writeDouble(data, toff+8*i, val[i]);    }\n\t\telse throw type;\n\n\t\tif(dlen>4) {  dlen += (dlen&1);  eoff += dlen;  }\n\t\toffset += 4;\n\t}\n\treturn [offset, eoff];\n}\n\nUTIF.toRGBA8 = function(out, scl)\n{\n\tvar w = out.width, h = out.height, area = w*h, qarea = area*4, data = out.data;\n\tvar img = new Uint8Array(area*4);\n\t//console.log(out);\n\t// 0: WhiteIsZero, 1: BlackIsZero, 2: RGB, 3: Palette color, 4: Transparency mask, 5: CMYK\n\tvar intp = (out[\"t262\"] ? out[\"t262\"][0]: 2), bps = (out[\"t258\"]?Math.min(32,out[\"t258\"][0]):1);\n\tif(out[\"t262\"]==null && bps==1) intp=0;\n\t//log(\"interpretation: \", intp, \"bps\", bps, out);\n\tif(false) {}\n\telse if(intp==0)\n\t{\n\t\tvar bpl = Math.ceil(bps*w/8);\n\t\tfor(var y=0; y<h; y++) {\n\t\t\tvar off = y*bpl, io = y*w;\n\t\t\tif(bps== 1) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, px=((data[off+(i>>3)])>>(7-  (i&7)))& 1;  img[qi]=img[qi+1]=img[qi+2]=( 1-px)*255;  img[qi+3]=255;    }\n\t\t\tif(bps== 4) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, px=((data[off+(i>>1)])>>(4-4*(i&1)))&15;  img[qi]=img[qi+1]=img[qi+2]=(15-px)* 17;  img[qi+3]=255;    }\n\t\t\tif(bps== 8) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, px=data[off+i];  img[qi]=img[qi+1]=img[qi+2]=255-px;  img[qi+3]=255;    }\n\t\t}\n\t}\n\telse if(intp==1)\n\t{\n\t\tvar smpls = out[\"t258\"]?out[\"t258\"].length : 1;\n\t\tvar bpl = Math.ceil(smpls*bps*w/8);\n\t\tif(scl==null) scl=1/256;\n\t\t\n\t\tfor(var y=0; y<h; y++) {\n\t\t\tvar off = y*bpl, io = y*w;\n\t\t\tif(bps== 1) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, px=((data[off+(i>>3)])>>(7-  (i&7)))&1;   img[qi]=img[qi+1]=img[qi+2]=(px)*255;  img[qi+3]=255;    }\n\t\t\tif(bps== 2) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, px=((data[off+(i>>2)])>>(6-2*(i&3)))&3;   img[qi]=img[qi+1]=img[qi+2]=(px)* 85;  img[qi+3]=255;    }\n\t\t\tif(bps== 8) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, px=data[off+i*smpls];  img[qi]=img[qi+1]=img[qi+2]=    px;  img[qi+3]=255;    }\n\t\t\tif(bps==16) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, o=off+(2*i), px=(data[o+1]<<8)|data[o];  img[qi]=img[qi+1]=img[qi+2]= Math.min(255,~~(px*scl));  img[qi+3]=255;    } // ladoga.tif\n\t\t}\n\t}\n\telse if(intp==2)\n\t{\n\t\tvar smpls = out[\"t258\"]?out[\"t258\"].length : 3;\t\t\n\t\tif(bps== 8) \n\t\t{\n\t\t\tif(smpls==4) for(var i=0; i<qarea; i++) img[i] = data[i];\n\t\t\tif(smpls==3) for(var i=0; i<area; i++) {  var qi=i<<2, ti=i*3;  img[qi]=data[ti];  img[qi+1]=data[ti+1];  img[qi+2]=data[ti+2];  img[qi+3]=255;    }\n\t\t\t// e.g. corel_photopaint_rgba.tif from https://github.com/jkriege2/TinyTIFF/blob/f6739ffd351b782e6cf9a81e6a61e8faa615e629/tests/tinytiffreader_test/corel_photopaint_rgba.tif\n\t\t\tif(smpls==5) for(var i=0; i<area; i++) {  var qi=i<<2, ti=i*5;  img[qi]=data[ti];  img[qi+1]=data[ti+1];  img[qi+2]=data[ti+2];  img[qi+3]=data[ti+3];    }\n\t\t}\n\t\telse{  // 3x 16-bit channel\n\t\t\tif(smpls==4) for(var i=0; i<area; i++) {  var qi=i<<2, ti=i*8+1;  img[qi]=data[ti];  img[qi+1]=data[ti+2];  img[qi+2]=data[ti+4];  img[qi+3]=data[ti+6];    }\n\t\t\tif(smpls==3) for(var i=0; i<area; i++) {  var qi=i<<2, ti=i*6+1;  img[qi]=data[ti];  img[qi+1]=data[ti+2];  img[qi+2]=data[ti+4];  img[qi+3]=255;           }\n\t\t}\n\t}\n\telse if(intp==3)\n\t{\n\t\tvar map = out[\"t320\"];\n\t\tvar smpls = out[\"t258\"]?out[\"t258\"].length : 1;\n\t\tvar bpl = Math.ceil(smpls*bps*w/8);\n\t\tvar cn = 1<<bps;\n\t\t\n\t\tfor(var y=0; y<h; y++) \n\t\t\tfor(var x=0; x<w; x++) {  \n\t\t\t\tvar i = y*w+x;\n\t\t\t\tvar qi=i<<2, mi=0;\n\t\t\t\tvar dof = y*bpl;\n\t\t\t\tif(false) {}\n\t\t\t\telse if(bps==1) mi=(data[dof+(x>>>3)]>>>(7-(x&7)))&1;\n\t\t\t\telse if(bps==2) mi=(data[dof+(x>>>2)]>>>(6-2*(x&3)))&3;\n\t\t\t\telse if(bps==4) mi=(data[dof+(x>>>1)]>>>(4-4*(x&1)))&15;\n\t\t\t\telse if(bps==8) mi= data[dof+x*smpls]; \n\t\t\t\telse throw bps;\n\t\t\t\timg[qi]=(map[mi]>>8);  img[qi+1]=(map[cn+mi]>>8);  img[qi+2]=(map[cn+cn+mi]>>8);  img[qi+3]=255;   \n\t\t\t}\n\t}\n\telse if(intp==5) \n\t{\n\t\tvar smpls = out[\"t258\"]?out[\"t258\"].length : 4;\n\t\tvar gotAlpha = smpls>4 ? 1 : 0;\n\t\tfor(var i=0; i<area; i++) {\n\t\t\tvar qi=i<<2, si=i*smpls;  var C=255-data[si], M=255-data[si+1], Y=255-data[si+2], K=(255-data[si+3])*(1/255);\n\t\t\timg[qi]=~~(C*K+0.5);  img[qi+1]=~~(M*K+0.5);  img[qi+2]=~~(Y*K+0.5);  img[qi+3]=255*(1-gotAlpha)+data[si+4]*gotAlpha;\n\t\t}\n\t}\n\telse if(intp==6 && out[\"t278\"]) {  // only for DSC_1538.TIF\n\t\tvar rps = out[\"t278\"][0];\n\t\tfor(var y=0; y<h; y+=rps) {\n\t\t\tvar i=(y*w), len = rps*w;\n\t\t\t\n\t\t\tfor(var j=0; j<len; j++) {\n\t\t\t\tvar qi = 4*(i+j), si = 3*i+4*(j>>>1);\n\t\t\t\tvar Y = data[si+(j&1)], Cb=data[si+2]-128, Cr=data[si+3]-128;\n\t\t\t\t\n\t\t\t\tvar r = Y + ( (Cr >> 2) + (Cr >> 3) + (Cr >> 5) ) ;\n\t\t\t\tvar g = Y - ( (Cb >> 2) + (Cb >> 4) + (Cb >> 5)) - ( (Cr >> 1) + (Cr >> 3) + (Cr >> 4) + (Cr >> 5)) ;\n\t\t\t\tvar b = Y + ( Cb + (Cb >> 1) + (Cb >> 2) + (Cb >> 6)) ;\n\t\t\t\t\n\t\t\t\timg[qi  ]=Math.max(0,Math.min(255,r));\n\t\t\t\timg[qi+1]=Math.max(0,Math.min(255,g));\n\t\t\t\timg[qi+2]=Math.max(0,Math.min(255,b));\n\t\t\t\timg[qi+3]=255;\n\t\t\t}\n\t\t}\n\t}\n\telse log(\"Unknown Photometric interpretation: \"+intp);\n\treturn img;\n}\n\nUTIF.replaceIMG = function(imgs)\n{\n\tif(imgs==null) imgs = document.getElementsByTagName(\"img\");\n\tvar sufs = [\"tif\",\"tiff\",\"dng\",\"cr2\",\"nef\"]\n\tfor (var i=0; i<imgs.length; i++)\n\t{\n\t\tvar img=imgs[i], src=img.getAttribute(\"src\");  if(src==null) continue;\n\t\tvar suff=src.split(\".\").pop().toLowerCase();\n\t\tif(sufs.indexOf(suff)==-1) continue;\n\t\tvar xhr = new XMLHttpRequest();  UTIF._xhrs.push(xhr);  UTIF._imgs.push(img);\n\t\txhr.open(\"GET\", src);  xhr.responseType = \"arraybuffer\";\n\t\txhr.onload = UTIF._imgLoaded;   xhr.send();\n\t}\n}\n\nUTIF._xhrs = [];  UTIF._imgs = [];\nUTIF._imgLoaded = function(e) {\n\tvar ind = UTIF._xhrs.indexOf(e.target), img = UTIF._imgs[ind];\n\tUTIF._xhrs.splice(ind,1);  UTIF._imgs.splice(ind,1);\n\t\n\timg.setAttribute(\"src\",UTIF.bufferToURI(e.target.response));\n}\n\nUTIF.bufferToURI = function(buff) {\n\tvar ifds = UTIF.decode(buff);  //console.log(ifds);\n\tvar vsns = ifds, ma=0, page=vsns[0];  if(ifds[0].subIFD) vsns = vsns.concat(ifds[0].subIFD);\n\tfor(var i=0; i<vsns.length; i++) {\n\t\tvar img = vsns[i];\n\t\tif(img[\"t258\"]==null || img[\"t258\"].length<3) continue;\n\t\tvar ar = img[\"t256\"]*img[\"t257\"];\n\t\tif(ar>ma) {  ma=ar;  page=img;  }\n\t}\n\tUTIF.decodeImage(buff, page, ifds);\n\tvar rgba = UTIF.toRGBA8(page), w=page.width, h=page.height;\n\t\n\tvar cnv = document.createElement(\"canvas\");  cnv.width=w;  cnv.height=h;\n\tvar ctx = cnv.getContext(\"2d\");\n\tvar imgd = new ImageData(new Uint8ClampedArray(rgba.buffer),w,h);\n\tctx.putImageData(imgd,0,0);\n\treturn cnv.toDataURL();\n}\n\n\nUTIF._binBE =\n{\n\tnextZero   : function(data, o) {  while(data[o]!=0) o++;  return o;  },\n\treadUshort : function(buff, p) {  return (buff[p]<< 8) |  buff[p+1];  },\n\treadShort  : function(buff, p) {  var a=UTIF._binBE.ui8;  a[0]=buff[p+1];  a[1]=buff[p+0];                                    return UTIF._binBE. i16[0];  },\n\treadInt    : function(buff, p) {  var a=UTIF._binBE.ui8;  a[0]=buff[p+3];  a[1]=buff[p+2];  a[2]=buff[p+1];  a[3]=buff[p+0];  return UTIF._binBE. i32[0];  },\n\treadUint   : function(buff, p) {  var a=UTIF._binBE.ui8;  a[0]=buff[p+3];  a[1]=buff[p+2];  a[2]=buff[p+1];  a[3]=buff[p+0];  return UTIF._binBE.ui32[0];  },\n\treadASCII  : function(buff, p, l) {  var s = \"\";   for(var i=0; i<l; i++) s += String.fromCharCode(buff[p+i]);   return s; },\n\treadFloat  : function(buff, p) {  var a=UTIF._binBE.ui8;  for(var i=0;i<4;i++) a[i]=buff[p+3-i];  return UTIF._binBE.fl32[0];  },\n\treadDouble : function(buff, p) {  var a=UTIF._binBE.ui8;  for(var i=0;i<8;i++) a[i]=buff[p+7-i];  return UTIF._binBE.fl64[0];  },\n\n\twriteUshort: function(buff, p, n) {  buff[p] = (n>> 8)&255;  buff[p+1] =  n&255;  },\n\twriteInt   : function(buff, p, n) {  var a=UTIF._binBE.ui8;  UTIF._binBE.i32[0]=n;  buff[p+3]=a[0];  buff[p+2]=a[1];  buff[p+1]=a[2];  buff[p+0]=a[3];  },\n\twriteUint  : function(buff, p, n) {  buff[p] = (n>>24)&255;  buff[p+1] = (n>>16)&255;  buff[p+2] = (n>>8)&255;  buff[p+3] = (n>>0)&255;  },\n\twriteASCII : function(buff, p, s) {  for(var i = 0; i < s.length; i++)  buff[p+i] = s.charCodeAt(i);  },\n\twriteDouble: function(buff, p, n)\n\t{\n\t\tUTIF._binBE.fl64[0] = n;\n\t\tfor (var i = 0; i < 8; i++) buff[p + i] = UTIF._binBE.ui8[7 - i];\n\t}\n}\nUTIF._binBE.ui8  = new Uint8Array  (8);\nUTIF._binBE.i16  = new Int16Array  (UTIF._binBE.ui8.buffer);\nUTIF._binBE.i32  = new Int32Array  (UTIF._binBE.ui8.buffer);\nUTIF._binBE.ui32 = new Uint32Array (UTIF._binBE.ui8.buffer);\nUTIF._binBE.fl32 = new Float32Array(UTIF._binBE.ui8.buffer);\nUTIF._binBE.fl64 = new Float64Array(UTIF._binBE.ui8.buffer);\n\nUTIF._binLE =\n{\n\tnextZero   : UTIF._binBE.nextZero,\n\treadUshort : function(buff, p) {  return (buff[p+1]<< 8) |  buff[p];  },\n\treadShort  : function(buff, p) {  var a=UTIF._binBE.ui8;  a[0]=buff[p+0];  a[1]=buff[p+1];                                    return UTIF._binBE. i16[0];  },\n\treadInt    : function(buff, p) {  var a=UTIF._binBE.ui8;  a[0]=buff[p+0];  a[1]=buff[p+1];  a[2]=buff[p+2];  a[3]=buff[p+3];  return UTIF._binBE. i32[0];  },\n\treadUint   : function(buff, p) {  var a=UTIF._binBE.ui8;  a[0]=buff[p+0];  a[1]=buff[p+1];  a[2]=buff[p+2];  a[3]=buff[p+3];  return UTIF._binBE.ui32[0];  },\n\treadASCII  : UTIF._binBE.readASCII,\n\treadFloat  : function(buff, p) {  var a=UTIF._binBE.ui8;  for(var i=0;i<4;i++) a[i]=buff[p+  i];  return UTIF._binBE.fl32[0];  },\n\treadDouble : function(buff, p) {  var a=UTIF._binBE.ui8;  for(var i=0;i<8;i++) a[i]=buff[p+  i];  return UTIF._binBE.fl64[0];  },\n\t\n\twriteUshort: function(buff, p, n) {  buff[p] = (n)&255;  buff[p+1] =  (n>>8)&255;  },\n\twriteInt   : function(buff, p, n) {  var a=UTIF._binBE.ui8;  UTIF._binBE.i32[0]=n;  buff[p+0]=a[0];  buff[p+1]=a[1];  buff[p+2]=a[2];  buff[p+3]=a[3];  },\n\twriteUint  : function(buff, p, n) {  buff[p] = (n>>>0)&255;  buff[p+1] = (n>>>8)&255;  buff[p+2] = (n>>>16)&255;  buff[p+3] = (n>>>24)&255;  },\n\twriteASCII : UTIF._binBE.writeASCII\n}\nUTIF._copyTile = function(tb, tw, th, b, w, h, xoff, yoff)\n{\n\t//log(\"copyTile\", tw, th,  w, h, xoff, yoff);\n\tvar xlim = Math.min(tw, w-xoff);\n\tvar ylim = Math.min(th, h-yoff);\n\tfor(var y=0; y<ylim; y++)\n\t{\n\t\tvar tof = (yoff+y)*w+xoff;\n\t\tvar sof = y*tw;\n\t\tfor(var x=0; x<xlim; x++) b[tof+x] = tb[sof+x];\n\t}\n}\n\nUTIF.LosslessJpegDecode =function(){var y,D,j,H,F,i,l,A,C,e;function q(){return y[D++]}function a(){return y[D++]<<8|y[D++]}function b(){var p=q(),r=[0,0,0,255],c=[],E=8;\nfor(var z=0;z<16;z++)c[z]=q();for(var z=0;z<16;z++){for(var G=0;G<c[z];G++){var I=m(r,0,z+1,1);r[I+3]=q()}}var t=new Uint8Array(1<<E);\nC[p]=[new Uint8Array(r),t];for(var z=0;z<1<<E;z++){var u=E,s=z,k=0,J=0;while(r[k+3]==255&&u!=0){J=s>>--u&1;\nk=r[k+J]}t[z]=k}}function m(p,r,c,z){if(p[r+3]!=255)return 0;if(c==0)return r;for(var G=0;G<2;G++){if(p[r+G]==0){p[r+G]=p.length;\np.push(0,0,z,255)}var I=m(p,p[r+G],c-1,z+1);if(I!=0)return I}return 0}function B(p){var r=p.e,c=p.c;\nwhile(r<25&&p.a<p.d){var z=p.data[p.a++];if(!p.b)p.a+=z+1>>>8;c=c<<8|z;r+=8}p.e=r;p.c=c}function g(p,r){if(r.e<p)B(r);\nreturn r.c>>(r.e-=p)&65535>>16-p}function w(p,r){var c=p[0],z=0,G=255,I=0;if(r.e<16)B(r);var E=r.c>>r.e-8&255;\nz=p[1][E];G=c[z+3];r.e-=c[z+2];while(G==255){I=r.c>>--r.e&1;z=c[z+I];G=c[z+3]}return G}function o(p,r){if(p<32768>>16-r)p+=-(1<<r)+1;\nreturn p}function x(p,r){var c=w(p,r);if(c==0)return 0;if(c==16)return-32768;var z=g(c,r);return o(z,c)}function n(p,r,c){var z=i,G=H,I=l,E=e;\nfor(var t=0;t<z;t++){p[t]=x(E[t],c)+(1<<j-1)}for(var u=z;u<r;u+=z){for(var t=0;t<z;t++)p[u+t]=x(E[t],c)+p[u+t-z]}var s=r;\nfor(var k=1;k<G;k++){for(var t=0;t<z;t++){p[s+t]=x(E[t],c)+p[s+t-r]}for(var u=z;u<r;u+=z){for(var t=0;\nt<z;t++){var J=s+u+t,K=p[J-z],v=0;if(I==0)v=0;else if(I==1)v=K;else if(I==2)v=p[J-r];else if(I==3)v=p[J-r-z];\nelse if(I==4)v=K+(p[J-r]-p[J-r-z]);else if(I==5)v=K+(p[J-r]-p[J-r-z]>>>1);else if(I==6)v=p[J-r]+(K-p[J-r-z]>>>1);\nelse if(I==7)v=K+p[J-r]>>>1;else throw I;p[J]=v+x(E[t],c)}}s+=r}}function f(p,r){return o(g(p,r),p)}function d(p,r,c){var z=y.length-D;\nfor(var G=0;G<z;G+=4){var I=y[D+G];y[D+G]=y[D+G+3];y[D+G+3]=I;var I=y[D+G+1];y[D+G+1]=y[D+G+2];y[D+G+2]=I}var E=e[0];\nfor(var t=0;t<H;t++){var u=32768,s=32768;for(var k=0;k<r;k+=2){var J=w(E,c),K=w(E,c);if(J!=0)u+=f(J,c);\nif(K!=0)s+=f(K,c);p[t*r+k]=u&65535;p[t*r+k+1]=s&65535}}}function h(p){y=p;D=0;C=[],e=[];if(a()!=65496)throw\"e\";\nwhile(!0){var r=a();if(r==65535){D--;continue}var c=a();if(r==65475){j=q();H=a();F=a();i=q();A=[];for(var z=0;\nz<i;z++){var G=q(),I=q();if(I!=17)throw\"e\";var E=q();if(E!=0)throw\"e\";A[G]=z}}else if(r==65476){var t=D+c-2;\nwhile(D<t)b()}else if(r==65498){D++;for(var z=0;z<i;z++){var u=q();e[A[u]]=C[q()>>>4]}l=q();D+=2;break}else{D+=c-2}}var s=j>8?Uint16Array:Uint8Array,k=F*i,J=new s(H*k),K={e:0,c:0,b:l==8,a:D,data:y,d:y.length};\nif(K.b)d(J,k,K);else n(J,k,K);return J}return h}();\n\n\n(function(){var O=0,d=1,n=2,F=3,w=4,j=5,C=6,l=7,k=8,P=9,a9=10,g=11,U=12,t=13,L=14,Y=15,Q=16,M=17,u=18;\nfunction a4($){var z=UTIF._binBE.readUshort,v={m:z($,0),f:$[2],r:$[3],a:$[4],d:z($,5),t:z($,7),h:z($,9),n:z($,11),v:$[13],p:z($,14)};\nif(v.m!=18771||v.f>1||v.d<6||v.d%6||v.h<768||v.h%24||v.n!=768||v.t<v.n||v.t%v.n||v.t-v.h>=v.n||v.v>16||v.v!=v.t/v.n||v.v!=Math.ceil(v.h/v.n)||v.p!=v.d/6||v.a!=12&&v.a!=14&&v.a!=16||v.r!=16&&v.r!=0){throw\"Invalid data\"}if(v.f==0){throw\"Not implemented. We need this file!\"}v.o=v.r==16;\nv.c=(v.o?v.n*2/3:v.n>>>1)|0;v.g=v.c+2;v.q=64;v.j=(1<<v.a)-1;v.w=4*v.a;return v}function a6($,z){var v=new Array(z.v),i=16+4*z.v;\nfor(var y=0,A=16;y<z.v;A+=4){var B=UTIF._binBE.readUint($,A);v[y]=$.slice(i,i+B);v[y].l=0;v[y].s=0;i+=B;\ny++}if(i!=$.length)throw\"Invalid data\";return v}function a7($,z){for(var v=-z[4],i=0;v<=z[4];i++,v++){$[i]=v<=-z[3]?-4:v<=-z[2]?-3:v<=-z[1]?-2:v<-z[0]?-1:v<=z[0]?0:v<z[1]?1:v<z[2]?2:v<z[3]?3:4}}function a3($,z,v){var i=[z,3*z+18,5*z+67,7*z+276,v];\n$.k=z;$.i=(i[4]+2*z)/(2*z+1)+1|0;$.b=Math.ceil(Math.log2($.i));$.e=9;a7($.u,i)}function a1($){var z={u:new Int8Array(2<<$.a)};\na3(z,0,$.j);return z}function N($){var z=[[],[],[]],v=Math.max(2,$.i+32>>>6);for(var i=0;i<3;i++){for(var y=0;\ny<41;y++){z[i][y]=[v,1]}}return z}function a8($){for(var z=-1,v=0;!v;z++){v=$[$.l]>>>7-$.s&1;$.s++;$.s&=7;\nif(!$.s)$.l++}return z}function R($,z){var v=0,i=8-$.s,y=$.l,A=$.s;if(z){if(z>=i){do{v<<=i;z-=i;v|=$[$.l]&(1<<i)-1;\n$.l++;i=8}while(z>=8)}if(z){v<<=z;i-=z;v|=$[$.l]>>>i&(1<<z)-1}$.s=8-i}return v}function a2($,z){var v=0;\nif(z<$){while(v<=14&&z<<++v<$);}return v}function V($,z,v,i,y,A,B,r){if(r==null)r=0;var W=A+1,o=W%2,J=0,K=0,f=0,E,p,h=i[y],e=i[y-1],T=i[y-2][W],I=e[W-1],x=e[W],G=e[W+1],c=h[W-1],D=h[W+1],Z=Math.abs,H,s,X,q;\nif(o){H=Z(G-x);s=Z(T-x);X=Z(I-x)}if(o){q=H>X&&s<H?T+I:H<X&&s<X?T+G:G+I;q=q+2*x>>>2;if(r){h[W]=q;return}E=z.e*z.u[$.j+x-T]+z.u[$.j+I-x]}else{q=x>I&&x>G||x<I&&x<G?D+c+2*x>>>2:c+D>>>1;\nE=z.e*z.u[$.j+x-I]+z.u[$.j+I-c]}p=Z(E);var _=a8(v);if(_<$.w-z.b-1){var a=a2(B[p][0],B[p][1]);f=R(v,a)+(_<<a)}else{f=R(v,z.b)+1}f=f&1?-1-(f>>>1):f>>>1;\nB[p][0]+=Z(f);if(B[p][1]==$.q){B[p][0]>>>=1;B[p][1]>>>=1}B[p][1]++;q=E<0?q-f:q+f;if($.f){if(q<0)q+=z.i;\nelse if(q>$.j)q-=z.i}h[W]=q>=0?Math.min(q,$.j):0}function S($,z,v){var i=$[0].length;for(var y=z;y<=v;\ny++){$[y][0]=$[y-1][1];$[y][i-1]=$[y-1][i-2]}}function b($){S($,l,U);S($,n,w);S($,Y,M)}function m($,z,v,i,y,A,B,r,W,o,J,K,f){var E=0,p=1,h=y<t&&y>w;\nwhile(p<$.c){if(E<$.c){V($,z,v,i,y,E,B[W],$.o&&(h&&o||!h&&(J||(E&K)==f)));V($,z,v,i,A,E,B[W],$.o&&(!h&&o||h&&(J||(E&K)==f)));\nE+=2}if(E>8){V($,z,v,i,y,p,r[W]);V($,z,v,i,A,p,r[W]);p+=2}}b(i)}function a0($,z,v,i,y,A){m($,z,v,i,n,l,y,A,0,0,1,0,8);\nm($,z,v,i,k,Y,y,A,1,0,1,0,8);m($,z,v,i,F,P,y,A,2,1,0,3,0);m($,z,v,i,a9,Q,y,A,0,0,0,3,2);m($,z,v,i,w,g,y,A,1,0,0,3,2);\nm($,z,v,i,U,M,y,A,2,1,0,3,0)}function a5($,z,v,i,y,A){var B=A.length,r=$.n;if(y+1==$.v)r=$.h-y*$.n;var W=6*$.h*i+y*$.n;\nfor(var o=0;o<6;o++){for(var J=0;J<r;J++){var K=A[o%B][J%B],f;if(K==0){f=n+(o>>>1)}else if(K==2){f=Y+(o>>>1)}else{f=l+o}var E=$.o?(J*2/3&2147483646|J%3&1)+(J%3>>>1):J>>>1;\nz[W+J]=v[f][E+1]}W+=$.h}}UTIF._decompressRAF=function($,z){var v=a4($),i=a6($,v),y=a1(v),A=new Int16Array(v.h*v.d);\nif(z==null){z=v.o?[[1,1,0,1,1,2],[1,1,2,1,1,0],[2,0,1,0,2,1],[1,1,2,1,1,0],[1,1,0,1,1,2],[0,2,1,2,0,1]]:[[0,1],[3,2]]}var B=[[O,F],[d,w],[j,g],[C,U],[t,Q],[L,M]],r=[];\nfor(var W=0;W<u;W++){r[W]=new Uint16Array(v.g)}for(var o=0;o<v.v;o++){var J=N(y),K=N(y);for(var W=0;\nW<u;W++){for(var f=0;f<v.g;f++){r[W][f]=0}}for(var E=0;E<v.p;E++){a0(v,y,i[o],r,J,K);for(var W=0;W<6;\nW++){for(var f=0;f<v.g;f++){r[B[W][0]][f]=r[B[W][1]][f]}}a5(v,A,r,E,o,z);for(var W=n;W<u;W++){if([j,C,t,L].indexOf(W)==-1){for(var f=0;\nf<v.g;f++){r[W][f]=0}}}b(r)}}return A}}())\n\n\n\n\n})(UTIF, pako);\n})();"
  },
  {
    "path": "lib/anypalette-0.6.0.js",
    "content": "// This library is PATCHED to expose format objects for LoadingErrors.\n// See \"__PATCHED_LIB_TO_ADD_THIS__format\" below.\n\n/**\n * Modules in this bundle\n * @license\n *\n * anypalette:\n *   license: MIT (http://opensource.org/licenses/MIT)\n *   author: Isaiah Odhner <isaiahodhner@gmail.com>\n *   homepage: https://1j01.github.io/anypalette.js/\n *   version: 0.6.0\n *\n * base64-js:\n *   license: MIT (http://opensource.org/licenses/MIT)\n *   author: T. Jameson Little <t.jameson.little@gmail.com>\n *   homepage: https://github.com/beatgammit/base64-js\n *   version: 1.5.1\n *\n * browser-resolve:\n *   license: MIT (http://opensource.org/licenses/MIT)\n *   author: Roman Shtylman <shtylman@gmail.com>\n *   homepage: https://github.com/browserify/browser-resolve#readme\n *   version: 2.0.0\n *\n * buffer:\n *   license: MIT (http://opensource.org/licenses/MIT)\n *   author: Feross Aboukhadijeh <feross@feross.org>\n *   contributors: Romain Beauxis <toots@rastageeks.org>, James Halliday <mail@substack.net>\n *   homepage: https://github.com/feross/buffer\n *   version: 5.2.1\n *\n * css.escape:\n *   license: MIT (http://opensource.org/licenses/MIT)\n *   author: Mathias Bynens\n *   homepage: https://mths.be/cssescape\n *   version: 1.5.1\n *\n * events:\n *   license: MIT (http://opensource.org/licenses/MIT)\n *   author: Irakli Gozalishvili <rfobic@gmail.com>\n *   homepage: https://github.com/Gozala/events#readme\n *   version: 3.2.0\n *\n * ieee754:\n *   license: BSD-3-Clause (http://opensource.org/licenses/BSD-3-Clause)\n *   author: Feross Aboukhadijeh <feross@feross.org>\n *   contributors: Romain Beauxis <toots@rastageeks.org>\n *   homepage: https://github.com/feross/ieee754#readme\n *   version: 1.2.1\n *\n * inherits:\n *   license: ISC (http://opensource.org/licenses/ISC)\n *   homepage: https://github.com/isaacs/inherits#readme\n *   version: 2.0.4\n *\n * jdataview:\n *   licenses: WTFPL (http://www.wtfpl.net/about/)\n *   author: Vjeux <vjeuxx@gmail.com>\n *   contributors: Vjeux <vjeuxx@gmail.com>, RReverser <me@rreverser.com>\n *   homepage: http://jDataView.github.io/\n *   version: 2.5.0\n *\n * process:\n *   license: MIT (http://opensource.org/licenses/MIT)\n *   author: Roman Shtylman <shtylman@gmail.com>\n *   homepage: https://github.com/shtylman/node-process#readme\n *   version: 0.11.10\n *\n * readable-stream:\n *   license: MIT (http://opensource.org/licenses/MIT)\n *   homepage: https://github.com/nodejs/readable-stream#readme\n *   version: 3.6.0\n *\n * safe-buffer:\n *   license: MIT (http://opensource.org/licenses/MIT)\n *   author: Feross Aboukhadijeh <feross@feross.org>\n *   homepage: https://github.com/feross/safe-buffer\n *   version: 5.1.2\n *\n * sax:\n *   license: ISC (http://opensource.org/licenses/ISC)\n *   author: Isaac Z. Schlueter <i@izs.me>\n *   homepage: https://github.com/isaacs/sax-js#readme\n *   version: 1.2.4\n *\n * stream-browserify:\n *   license: MIT (http://opensource.org/licenses/MIT)\n *   author: James Halliday <mail@substack.net>\n *   homepage: https://github.com/browserify/stream-browserify\n *   version: 3.0.0\n *\n * string_decoder:\n *   license: MIT (http://opensource.org/licenses/MIT)\n *   homepage: https://github.com/nodejs/string_decoder\n *   version: 1.1.1\n *\n * util-deprecate:\n *   license: MIT (http://opensource.org/licenses/MIT)\n *   author: Nathan Rajlich <nathan@tootallnate.net>\n *   homepage: https://github.com/TooTallNate/util-deprecate\n *   version: 1.0.2\n *\n * xml-js:\n *   license: MIT (http://opensource.org/licenses/MIT)\n *   author: Yousuf Almarzooqi <ysf953@gmail.com>\n *   homepage: https://github.com/nashwaan/xml-js#readme\n *   version: 1.6.11\n *\n * This header is generated by licensify (https://github.com/twada/licensify)\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.AnyPalette = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  var i\n  for (i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n\n},{}],2:[function(require,module,exports){\n\n},{}],3:[function(require,module,exports){\n(function (Buffer){(function (){\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <https://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nvar K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Print warning and recommend using `buffer` v4.x which has an Object\n *               implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n    typeof console.error === 'function') {\n  console.error(\n    'This browser lacks typed array (Uint8Array) support which is required by ' +\n    '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n  )\n}\n\nfunction typedArraySupport () {\n  // Can typed array instances can be augmented?\n  try {\n    var arr = new Uint8Array(1)\n    arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } }\n    return arr.foo() === 42\n  } catch (e) {\n    return false\n  }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n  enumerable: true,\n  get: function () {\n    if (!Buffer.isBuffer(this)) return undefined\n    return this.buffer\n  }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n  enumerable: true,\n  get: function () {\n    if (!Buffer.isBuffer(this)) return undefined\n    return this.byteOffset\n  }\n})\n\nfunction createBuffer (length) {\n  if (length > K_MAX_LENGTH) {\n    throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n  }\n  // Return an augmented `Uint8Array` instance\n  var buf = new Uint8Array(length)\n  buf.__proto__ = Buffer.prototype\n  return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new TypeError(\n        'The \"string\" argument must be of type string. Received type number'\n      )\n    }\n    return allocUnsafe(arg)\n  }\n  return from(arg, encodingOrOffset, length)\n}\n\n// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\nif (typeof Symbol !== 'undefined' && Symbol.species != null &&\n    Buffer[Symbol.species] === Buffer) {\n  Object.defineProperty(Buffer, Symbol.species, {\n    value: null,\n    configurable: true,\n    enumerable: false,\n    writable: false\n  })\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n  if (typeof value === 'string') {\n    return fromString(value, encodingOrOffset)\n  }\n\n  if (ArrayBuffer.isView(value)) {\n    return fromArrayLike(value)\n  }\n\n  if (value == null) {\n    throw TypeError(\n      'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n      'or Array-like Object. Received type ' + (typeof value)\n    )\n  }\n\n  if (isInstance(value, ArrayBuffer) ||\n      (value && isInstance(value.buffer, ArrayBuffer))) {\n    return fromArrayBuffer(value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'number') {\n    throw new TypeError(\n      'The \"value\" argument must not be of type number. Received type number'\n    )\n  }\n\n  var valueOf = value.valueOf && value.valueOf()\n  if (valueOf != null && valueOf !== value) {\n    return Buffer.from(valueOf, encodingOrOffset, length)\n  }\n\n  var b = fromObject(value)\n  if (b) return b\n\n  if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n      typeof value[Symbol.toPrimitive] === 'function') {\n    return Buffer.from(\n      value[Symbol.toPrimitive]('string'), encodingOrOffset, length\n    )\n  }\n\n  throw new TypeError(\n    'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n    'or Array-like Object. Received type ' + (typeof value)\n  )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n  return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nBuffer.prototype.__proto__ = Uint8Array.prototype\nBuffer.__proto__ = Uint8Array\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be of type number')\n  } else if (size < 0) {\n    throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n  }\n}\n\nfunction alloc (size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(size)\n  }\n  if (fill !== undefined) {\n    // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpretted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(size).fill(fill, encoding)\n      : createBuffer(size).fill(fill)\n  }\n  return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n  return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n  assertSize(size)\n  return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n  return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n  return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('Unknown encoding: ' + encoding)\n  }\n\n  var length = byteLength(string, encoding) | 0\n  var buf = createBuffer(length)\n\n  var actual = buf.write(string, encoding)\n\n  if (actual !== length) {\n    // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    buf = buf.slice(0, actual)\n  }\n\n  return buf\n}\n\nfunction fromArrayLike (array) {\n  var length = array.length < 0 ? 0 : checked(array.length) | 0\n  var buf = createBuffer(length)\n  for (var i = 0; i < length; i += 1) {\n    buf[i] = array[i] & 255\n  }\n  return buf\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\"offset\" is outside of buffer bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\"length\" is outside of buffer bounds')\n  }\n\n  var buf\n  if (byteOffset === undefined && length === undefined) {\n    buf = new Uint8Array(array)\n  } else if (length === undefined) {\n    buf = new Uint8Array(array, byteOffset)\n  } else {\n    buf = new Uint8Array(array, byteOffset, length)\n  }\n\n  // Return an augmented `Uint8Array` instance\n  buf.__proto__ = Buffer.prototype\n  return buf\n}\n\nfunction fromObject (obj) {\n  if (Buffer.isBuffer(obj)) {\n    var len = checked(obj.length) | 0\n    var buf = createBuffer(len)\n\n    if (buf.length === 0) {\n      return buf\n    }\n\n    obj.copy(buf, 0, 0, len)\n    return buf\n  }\n\n  if (obj.length !== undefined) {\n    if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n      return createBuffer(0)\n    }\n    return fromArrayLike(obj)\n  }\n\n  if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n    return fromArrayLike(obj.data)\n  }\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= K_MAX_LENGTH) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (length) {\n  if (+length != length) { // eslint-disable-line eqeqeq\n    length = 0\n  }\n  return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return b != null && b._isBuffer === true &&\n    b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n  if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n  if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError(\n      'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n    )\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i]\n      y = b[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'latin1':\n    case 'binary':\n    case 'base64':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!Array.isArray(list)) {\n    throw new TypeError('\"list\" argument must be an Array of Buffers')\n  }\n\n  if (list.length === 0) {\n    return Buffer.alloc(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; ++i) {\n      length += list[i].length\n    }\n  }\n\n  var buffer = Buffer.allocUnsafe(length)\n  var pos = 0\n  for (i = 0; i < list.length; ++i) {\n    var buf = list[i]\n    if (isInstance(buf, Uint8Array)) {\n      buf = Buffer.from(buf)\n    }\n    if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    }\n    buf.copy(buffer, pos)\n    pos += buf.length\n  }\n  return buffer\n}\n\nfunction byteLength (string, encoding) {\n  if (Buffer.isBuffer(string)) {\n    return string.length\n  }\n  if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    throw new TypeError(\n      'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n      'Received type ' + typeof string\n    )\n  }\n\n  var len = string.length\n  var mustMatch = (arguments.length > 2 && arguments[2] === true)\n  if (!mustMatch && len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return len\n      case 'utf8':\n      case 'utf-8':\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) {\n          return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n        }\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n  // property of a typed array.\n\n  // This behaves neither like String nor Uint8Array in that we set start/end\n  // to their upper/lower bounds if the value passed is out of range.\n  // undefined is handled specially as per ECMA-262 6th Edition,\n  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n  if (start === undefined || start < 0) {\n    start = 0\n  }\n  // Return early if start > this.length. Done here to prevent potential uint32\n  // coercion fail below.\n  if (start > this.length) {\n    return ''\n  }\n\n  if (end === undefined || end > this.length) {\n    end = this.length\n  }\n\n  if (end <= 0) {\n    return ''\n  }\n\n  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n  end >>>= 0\n  start >>>= 0\n\n  if (end <= start) {\n    return ''\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Slice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  var i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  var len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (var i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  var len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (var i = 0; i < len; i += 4) {\n    swap(this, i, i + 3)\n    swap(this, i + 1, i + 2)\n  }\n  return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n  var len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (var i = 0; i < len; i += 8) {\n    swap(this, i, i + 7)\n    swap(this, i + 1, i + 6)\n    swap(this, i + 2, i + 5)\n    swap(this, i + 3, i + 4)\n  }\n  return this\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n  if (this.length > max) str += ' ... '\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (isInstance(target, Uint8Array)) {\n    target = Buffer.from(target, target.offset, target.byteLength)\n  }\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError(\n      'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n      'Received type ' + (typeof target)\n    )\n  }\n\n  if (start === undefined) {\n    start = 0\n  }\n  if (end === undefined) {\n    end = target ? target.length : 0\n  }\n  if (thisStart === undefined) {\n    thisStart = 0\n  }\n  if (thisEnd === undefined) {\n    thisEnd = this.length\n  }\n\n  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n    throw new RangeError('out of range index')\n  }\n\n  if (thisStart >= thisEnd && start >= end) {\n    return 0\n  }\n  if (thisStart >= thisEnd) {\n    return -1\n  }\n  if (start >= end) {\n    return 1\n  }\n\n  start >>>= 0\n  end >>>= 0\n  thisStart >>>= 0\n  thisEnd >>>= 0\n\n  if (this === target) return 0\n\n  var x = thisEnd - thisStart\n  var y = end - start\n  var len = Math.min(x, y)\n\n  var thisCopy = this.slice(thisStart, thisEnd)\n  var targetCopy = target.slice(start, end)\n\n  for (var i = 0; i < len; ++i) {\n    if (thisCopy[i] !== targetCopy[i]) {\n      x = thisCopy[i]\n      y = targetCopy[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n  // Empty buffer means no match\n  if (buffer.length === 0) return -1\n\n  // Normalize byteOffset\n  if (typeof byteOffset === 'string') {\n    encoding = byteOffset\n    byteOffset = 0\n  } else if (byteOffset > 0x7fffffff) {\n    byteOffset = 0x7fffffff\n  } else if (byteOffset < -0x80000000) {\n    byteOffset = -0x80000000\n  }\n  byteOffset = +byteOffset // Coerce to Number.\n  if (numberIsNaN(byteOffset)) {\n    // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : (buffer.length - 1)\n  }\n\n  // Normalize byteOffset: negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n  if (byteOffset >= buffer.length) {\n    if (dir) return -1\n    else byteOffset = buffer.length - 1\n  } else if (byteOffset < 0) {\n    if (dir) byteOffset = 0\n    else return -1\n  }\n\n  // Normalize val\n  if (typeof val === 'string') {\n    val = Buffer.from(val, encoding)\n  }\n\n  // Finally, search either indexOf (if dir is true) or lastIndexOf\n  if (Buffer.isBuffer(val)) {\n    // Special case: looking for empty string/buffer always fails\n    if (val.length === 0) {\n      return -1\n    }\n    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n  } else if (typeof val === 'number') {\n    val = val & 0xFF // Search for a byte value [0-255]\n    if (typeof Uint8Array.prototype.indexOf === 'function') {\n      if (dir) {\n        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n      } else {\n        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n      }\n    }\n    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n  var indexSize = 1\n  var arrLength = arr.length\n  var valLength = val.length\n\n  if (encoding !== undefined) {\n    encoding = String(encoding).toLowerCase()\n    if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n        encoding === 'utf16le' || encoding === 'utf-16le') {\n      if (arr.length < 2 || val.length < 2) {\n        return -1\n      }\n      indexSize = 2\n      arrLength /= 2\n      valLength /= 2\n      byteOffset /= 2\n    }\n  }\n\n  function read (buf, i) {\n    if (indexSize === 1) {\n      return buf[i]\n    } else {\n      return buf.readUInt16BE(i * indexSize)\n    }\n  }\n\n  var i\n  if (dir) {\n    var foundIndex = -1\n    for (i = byteOffset; i < arrLength; i++) {\n      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n      } else {\n        if (foundIndex !== -1) i -= i - foundIndex\n        foundIndex = -1\n      }\n    }\n  } else {\n    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n    for (i = byteOffset; i >= 0; i--) {\n      var found = true\n      for (var j = 0; j < valLength; j++) {\n        if (read(arr, i + j) !== read(val, j)) {\n          found = false\n          break\n        }\n      }\n      if (found) return i\n    }\n  }\n\n  return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n  return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  var strLen = string.length\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; ++i) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (numberIsNaN(parsed)) return i\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset >>> 0\n    if (isFinite(length)) {\n      length = length >>> 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('Attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Write(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n        : (firstByte > 0xBF) ? 2\n          : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; ++i) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf = this.subarray(start, end)\n  // Return an augmented `Uint8Array` instance\n  newBuf.__proto__ = Buffer.prototype\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  this[offset] = (value >>> 8)\n  this[offset + 1] = (value & 0xff)\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  this[offset + 3] = (value >>> 24)\n  this[offset + 2] = (value >>> 16)\n  this[offset + 1] = (value >>> 8)\n  this[offset] = (value & 0xff)\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  this[offset] = (value >>> 24)\n  this[offset + 1] = (value >>> 16)\n  this[offset + 2] = (value >>> 8)\n  this[offset + 3] = (value & 0xff)\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    var limit = Math.pow(2, (8 * byteLength) - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    var limit = Math.pow(2, (8 * byteLength) - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  this[offset] = (value >>> 8)\n  this[offset + 1] = (value & 0xff)\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\n  this[offset + 2] = (value >>> 16)\n  this[offset + 3] = (value >>> 24)\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  this[offset] = (value >>> 24)\n  this[offset + 1] = (value >>> 16)\n  this[offset + 2] = (value >>> 8)\n  this[offset + 3] = (value & 0xff)\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n  if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n\n  if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n    // Use built-in when available, missing from IE11\n    this.copyWithin(targetStart, start, end)\n  } else if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (var i = len - 1; i >= 0; --i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, end),\n      targetStart\n    )\n  }\n\n  return len\n}\n\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n  // Handle string cases:\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = this.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = this.length\n    }\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n    if (val.length === 1) {\n      var code = val.charCodeAt(0)\n      if ((encoding === 'utf8' && code < 128) ||\n          encoding === 'latin1') {\n        // Fast path: If `val` fits into a single byte, use that numeric value.\n        val = code\n      }\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  }\n\n  // Invalid ranges are not set to a default, so can range check early.\n  if (start < 0 || this.length < start || this.length < end) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return this\n  }\n\n  start = start >>> 0\n  end = end === undefined ? this.length : end >>> 0\n\n  if (!val) val = 0\n\n  var i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    var bytes = Buffer.isBuffer(val)\n      ? val\n      : Buffer.from(val, encoding)\n    var len = bytes.length\n    if (len === 0) {\n      throw new TypeError('The value \"' + val +\n        '\" is invalid for argument \"value\"')\n    }\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node takes equal signs as end of the Base64 encoding\n  str = str.split('=')[0]\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = str.trim().replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; ++i) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; ++i) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n  return obj instanceof type ||\n    (obj != null && obj.constructor != null && obj.constructor.name != null &&\n      obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n  // For IE11 support\n  return obj !== obj // eslint-disable-line no-self-compare\n}\n\n}).call(this)}).call(this,require(\"buffer\").Buffer)\n\n},{\"base64-js\":1,\"buffer\":3,\"ieee754\":6}],4:[function(require,module,exports){\n(function (global){(function (){\n/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */\n;(function(root, factory) {\n\t// https://github.com/umdjs/umd/blob/master/returnExports.js\n\tif (typeof exports == 'object') {\n\t\t// For Node.js.\n\t\tmodule.exports = factory(root);\n\t} else if (typeof define == 'function' && define.amd) {\n\t\t// For AMD. Register as an anonymous module.\n\t\tdefine([], factory.bind(root, root));\n\t} else {\n\t\t// For browser globals (not exposing the function separately).\n\t\tfactory(root);\n\t}\n}(typeof global != 'undefined' ? global : this, function(root) {\n\n\tif (root.CSS && root.CSS.escape) {\n\t\treturn root.CSS.escape;\n\t}\n\n\t// https://drafts.csswg.org/cssom/#serialize-an-identifier\n\tvar cssEscape = function(value) {\n\t\tif (arguments.length == 0) {\n\t\t\tthrow new TypeError('`CSS.escape` requires an argument.');\n\t\t}\n\t\tvar string = String(value);\n\t\tvar length = string.length;\n\t\tvar index = -1;\n\t\tvar codeUnit;\n\t\tvar result = '';\n\t\tvar firstCodeUnit = string.charCodeAt(0);\n\t\twhile (++index < length) {\n\t\t\tcodeUnit = string.charCodeAt(index);\n\t\t\t// Note: there’s no need to special-case astral symbols, surrogate\n\t\t\t// pairs, or lone surrogates.\n\n\t\t\t// If the character is NULL (U+0000), then the REPLACEMENT CHARACTER\n\t\t\t// (U+FFFD).\n\t\t\tif (codeUnit == 0x0000) {\n\t\t\t\tresult += '\\uFFFD';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is in the range [\\1-\\1F] (U+0001 to U+001F) or is\n\t\t\t\t// U+007F, […]\n\t\t\t\t(codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F ||\n\t\t\t\t// If the character is the first character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039), […]\n\t\t\t\t(index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n\t\t\t\t// If the character is the second character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039) and the first character is a `-` (U+002D), […]\n\t\t\t\t(\n\t\t\t\t\tindex == 1 &&\n\t\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 &&\n\t\t\t\t\tfirstCodeUnit == 0x002D\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character-as-code-point\n\t\t\t\tresult += '\\\\' + codeUnit.toString(16) + ' ';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is the first character and is a `-` (U+002D), and\n\t\t\t\t// there is no second character, […]\n\t\t\t\tindex == 0 &&\n\t\t\t\tlength == 1 &&\n\t\t\t\tcodeUnit == 0x002D\n\t\t\t) {\n\t\t\t\tresult += '\\\\' + string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If the character is not handled by one of the above rules and is\n\t\t\t// greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or\n\t\t\t// is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to\n\t\t\t// U+005A), or [a-z] (U+0061 to U+007A), […]\n\t\t\tif (\n\t\t\t\tcodeUnit >= 0x0080 ||\n\t\t\t\tcodeUnit == 0x002D ||\n\t\t\t\tcodeUnit == 0x005F ||\n\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 ||\n\t\t\t\tcodeUnit >= 0x0041 && codeUnit <= 0x005A ||\n\t\t\t\tcodeUnit >= 0x0061 && codeUnit <= 0x007A\n\t\t\t) {\n\t\t\t\t// the character itself\n\t\t\t\tresult += string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Otherwise, the escaped character.\n\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character\n\t\t\tresult += '\\\\' + string.charAt(index);\n\n\t\t}\n\t\treturn result;\n\t};\n\n\tif (!root.CSS) {\n\t\troot.CSS = {};\n\t}\n\n\troot.CSS.escape = cssEscape;\n\treturn cssEscape;\n\n}));\n\n}).call(this)}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{}],5:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// 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 permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n  ? R.apply\n  : function ReflectApply(target, receiver, args) {\n    return Function.prototype.apply.call(target, receiver, args);\n  }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n  ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target)\n      .concat(Object.getOwnPropertySymbols(target));\n  };\n} else {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target);\n  };\n}\n\nfunction ProcessEmitWarning(warning) {\n  if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n  return value !== value;\n}\n\nfunction EventEmitter() {\n  EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n  if (typeof listener !== 'function') {\n    throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n  }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n  enumerable: true,\n  get: function() {\n    return defaultMaxListeners;\n  },\n  set: function(arg) {\n    if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n      throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n    }\n    defaultMaxListeners = arg;\n  }\n});\n\nEventEmitter.init = function() {\n\n  if (this._events === undefined ||\n      this._events === Object.getPrototypeOf(this)._events) {\n    this._events = Object.create(null);\n    this._eventsCount = 0;\n  }\n\n  this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n  if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n    throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n  }\n  this._maxListeners = n;\n  return this;\n};\n\nfunction _getMaxListeners(that) {\n  if (that._maxListeners === undefined)\n    return EventEmitter.defaultMaxListeners;\n  return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n  return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n  var args = [];\n  for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n  var doError = (type === 'error');\n\n  var events = this._events;\n  if (events !== undefined)\n    doError = (doError && events.error === undefined);\n  else if (!doError)\n    return false;\n\n  // If there is no 'error' event listener then throw.\n  if (doError) {\n    var er;\n    if (args.length > 0)\n      er = args[0];\n    if (er instanceof Error) {\n      // Note: The comments on the `throw` lines are intentional, they show\n      // up in Node's output if this results in an unhandled exception.\n      throw er; // Unhandled 'error' event\n    }\n    // At least give some kind of context to the user\n    var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n    err.context = er;\n    throw err; // Unhandled 'error' event\n  }\n\n  var handler = events[type];\n\n  if (handler === undefined)\n    return false;\n\n  if (typeof handler === 'function') {\n    ReflectApply(handler, this, args);\n  } else {\n    var len = handler.length;\n    var listeners = arrayClone(handler, len);\n    for (var i = 0; i < len; ++i)\n      ReflectApply(listeners[i], this, args);\n  }\n\n  return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n  var m;\n  var events;\n  var existing;\n\n  checkListener(listener);\n\n  events = target._events;\n  if (events === undefined) {\n    events = target._events = Object.create(null);\n    target._eventsCount = 0;\n  } else {\n    // To avoid recursion in the case that type === \"newListener\"! Before\n    // adding it to the listeners, first emit \"newListener\".\n    if (events.newListener !== undefined) {\n      target.emit('newListener', type,\n                  listener.listener ? listener.listener : listener);\n\n      // Re-assign `events` because a newListener handler could have caused the\n      // this._events to be assigned to a new object\n      events = target._events;\n    }\n    existing = events[type];\n  }\n\n  if (existing === undefined) {\n    // Optimize the case of one listener. Don't need the extra array object.\n    existing = events[type] = listener;\n    ++target._eventsCount;\n  } else {\n    if (typeof existing === 'function') {\n      // Adding the second element, need to change to array.\n      existing = events[type] =\n        prepend ? [listener, existing] : [existing, listener];\n      // If we've already got an array, just append.\n    } else if (prepend) {\n      existing.unshift(listener);\n    } else {\n      existing.push(listener);\n    }\n\n    // Check for listener leak\n    m = _getMaxListeners(target);\n    if (m > 0 && existing.length > m && !existing.warned) {\n      existing.warned = true;\n      // No error code for this since it is a Warning\n      // eslint-disable-next-line no-restricted-syntax\n      var w = new Error('Possible EventEmitter memory leak detected. ' +\n                          existing.length + ' ' + String(type) + ' listeners ' +\n                          'added. Use emitter.setMaxListeners() to ' +\n                          'increase limit');\n      w.name = 'MaxListenersExceededWarning';\n      w.emitter = target;\n      w.type = type;\n      w.count = existing.length;\n      ProcessEmitWarning(w);\n    }\n  }\n\n  return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n  return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n    function prependListener(type, listener) {\n      return _addListener(this, type, listener, true);\n    };\n\nfunction onceWrapper() {\n  if (!this.fired) {\n    this.target.removeListener(this.type, this.wrapFn);\n    this.fired = true;\n    if (arguments.length === 0)\n      return this.listener.call(this.target);\n    return this.listener.apply(this.target, arguments);\n  }\n}\n\nfunction _onceWrap(target, type, listener) {\n  var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n  var wrapped = onceWrapper.bind(state);\n  wrapped.listener = listener;\n  state.wrapFn = wrapped;\n  return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n  checkListener(listener);\n  this.on(type, _onceWrap(this, type, listener));\n  return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n    function prependOnceListener(type, listener) {\n      checkListener(listener);\n      this.prependListener(type, _onceWrap(this, type, listener));\n      return this;\n    };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n    function removeListener(type, listener) {\n      var list, events, position, i, originalListener;\n\n      checkListener(listener);\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      list = events[type];\n      if (list === undefined)\n        return this;\n\n      if (list === listener || list.listener === listener) {\n        if (--this._eventsCount === 0)\n          this._events = Object.create(null);\n        else {\n          delete events[type];\n          if (events.removeListener)\n            this.emit('removeListener', type, list.listener || listener);\n        }\n      } else if (typeof list !== 'function') {\n        position = -1;\n\n        for (i = list.length - 1; i >= 0; i--) {\n          if (list[i] === listener || list[i].listener === listener) {\n            originalListener = list[i].listener;\n            position = i;\n            break;\n          }\n        }\n\n        if (position < 0)\n          return this;\n\n        if (position === 0)\n          list.shift();\n        else {\n          spliceOne(list, position);\n        }\n\n        if (list.length === 1)\n          events[type] = list[0];\n\n        if (events.removeListener !== undefined)\n          this.emit('removeListener', type, originalListener || listener);\n      }\n\n      return this;\n    };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n    function removeAllListeners(type) {\n      var listeners, events, i;\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      // not listening for removeListener, no need to emit\n      if (events.removeListener === undefined) {\n        if (arguments.length === 0) {\n          this._events = Object.create(null);\n          this._eventsCount = 0;\n        } else if (events[type] !== undefined) {\n          if (--this._eventsCount === 0)\n            this._events = Object.create(null);\n          else\n            delete events[type];\n        }\n        return this;\n      }\n\n      // emit removeListener for all listeners on all events\n      if (arguments.length === 0) {\n        var keys = Object.keys(events);\n        var key;\n        for (i = 0; i < keys.length; ++i) {\n          key = keys[i];\n          if (key === 'removeListener') continue;\n          this.removeAllListeners(key);\n        }\n        this.removeAllListeners('removeListener');\n        this._events = Object.create(null);\n        this._eventsCount = 0;\n        return this;\n      }\n\n      listeners = events[type];\n\n      if (typeof listeners === 'function') {\n        this.removeListener(type, listeners);\n      } else if (listeners !== undefined) {\n        // LIFO order\n        for (i = listeners.length - 1; i >= 0; i--) {\n          this.removeListener(type, listeners[i]);\n        }\n      }\n\n      return this;\n    };\n\nfunction _listeners(target, type, unwrap) {\n  var events = target._events;\n\n  if (events === undefined)\n    return [];\n\n  var evlistener = events[type];\n  if (evlistener === undefined)\n    return [];\n\n  if (typeof evlistener === 'function')\n    return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n  return unwrap ?\n    unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n  return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n  return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  if (typeof emitter.listenerCount === 'function') {\n    return emitter.listenerCount(type);\n  } else {\n    return listenerCount.call(emitter, type);\n  }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n  var events = this._events;\n\n  if (events !== undefined) {\n    var evlistener = events[type];\n\n    if (typeof evlistener === 'function') {\n      return 1;\n    } else if (evlistener !== undefined) {\n      return evlistener.length;\n    }\n  }\n\n  return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n  return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n  var copy = new Array(n);\n  for (var i = 0; i < n; ++i)\n    copy[i] = arr[i];\n  return copy;\n}\n\nfunction spliceOne(list, index) {\n  for (; index + 1 < list.length; index++)\n    list[index] = list[index + 1];\n  list.pop();\n}\n\nfunction unwrapListeners(arr) {\n  var ret = new Array(arr.length);\n  for (var i = 0; i < ret.length; ++i) {\n    ret[i] = arr[i].listener || arr[i];\n  }\n  return ret;\n}\n\nfunction once(emitter, name) {\n  return new Promise(function (resolve, reject) {\n    function eventListener() {\n      if (errorListener !== undefined) {\n        emitter.removeListener('error', errorListener);\n      }\n      resolve([].slice.call(arguments));\n    };\n    var errorListener;\n\n    // Adding an error listener is not optional because\n    // if an error is thrown on an event emitter we cannot\n    // guarantee that the actual event we are waiting will\n    // be fired. The result could be a silent way to create\n    // memory or file descriptor leaks, which is something\n    // we should avoid.\n    if (name !== 'error') {\n      errorListener = function errorListener(err) {\n        emitter.removeListener(name, eventListener);\n        reject(err);\n      };\n\n      emitter.once('error', errorListener);\n    }\n\n    emitter.once(name, eventListener);\n  });\n}\n\n},{}],6:[function(require,module,exports){\n/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = ((value * c) - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n\n},{}],7:[function(require,module,exports){\n(function (Buffer){(function (){\n!function(factory) {\n    var global = this;\n    module.exports = factory(global);\n}(function(global) {\n    \"use strict\";\n    function is(obj, Ctor) {\n        return \"object\" != typeof obj || null === obj ? !1 : obj.constructor === Ctor || Object.prototype.toString.call(obj) === \"[object \" + Ctor.name + \"]\";\n    }\n    function arrayFrom(arrayLike, forceCopy) {\n        return !forceCopy && is(arrayLike, Array) ? arrayLike : Array.prototype.slice.call(arrayLike);\n    }\n    function defined(value, defaultValue) {\n        return void 0 !== value ? value : defaultValue;\n    }\n    function jDataView(buffer, byteOffset, byteLength, littleEndian) {\n        if (jDataView.is(buffer)) {\n            var result = buffer.slice(byteOffset, byteOffset + byteLength);\n            return result._littleEndian = defined(littleEndian, result._littleEndian), result;\n        }\n        if (!jDataView.is(this)) return new jDataView(buffer, byteOffset, byteLength, littleEndian);\n        if (this.buffer = buffer = jDataView.wrapBuffer(buffer), this._isArrayBuffer = compatibility.ArrayBuffer && is(buffer, ArrayBuffer), \n        this._isPixelData = !1, this._isDataView = compatibility.DataView && this._isArrayBuffer, \n        this._isNodeBuffer = !0 && compatibility.NodeBuffer && is(buffer, Buffer), !this._isNodeBuffer && !this._isArrayBuffer && !is(buffer, Array)) throw new TypeError(\"jDataView buffer has an incompatible type\");\n        this._littleEndian = !!littleEndian;\n        var bufferLength = \"byteLength\" in buffer ? buffer.byteLength : buffer.length;\n        this.byteOffset = byteOffset = defined(byteOffset, 0), this.byteLength = byteLength = defined(byteLength, bufferLength - byteOffset), \n        this._offset = this._bitOffset = 0, this._isDataView ? this._view = new DataView(buffer, byteOffset, byteLength) : this._checkBounds(byteOffset, byteLength, bufferLength), \n        this._engineAction = this._isDataView ? this._dataViewAction : this._isNodeBuffer ? this._nodeBufferAction : this._isArrayBuffer ? this._arrayBufferAction : this._arrayAction;\n    }\n    function getCharCodes(string) {\n        if (compatibility.NodeBuffer) return new Buffer(string, \"binary\");\n        for (var Type = compatibility.ArrayBuffer ? Uint8Array : Array, codes = new Type(string.length), i = 0, length = string.length; length > i; i++) codes[i] = 255 & string.charCodeAt(i);\n        return codes;\n    }\n    function pow2(n) {\n        return n >= 0 && 31 > n ? 1 << n : pow2[n] || (pow2[n] = Math.pow(2, n));\n    }\n    function Uint64(lo, hi) {\n        this.lo = lo, this.hi = hi;\n    }\n    function Int64() {\n        Uint64.apply(this, arguments);\n    }\n    var compatibility = {\n        NodeBuffer: !0 && \"Buffer\" in global,\n        DataView: \"DataView\" in global,\n        ArrayBuffer: \"ArrayBuffer\" in global,\n        PixelData: !1\n    }, TextEncoder = global.TextEncoder, TextDecoder = global.TextDecoder;\n    compatibility.NodeBuffer && !function(buffer) {\n        try {\n            buffer.writeFloatLE(1/0, 0);\n        } catch (e) {\n            compatibility.NodeBuffer = !1;\n        }\n    }(new Buffer(4));\n    var dataTypes = {\n        Int8: 1,\n        Int16: 2,\n        Int32: 4,\n        Uint8: 1,\n        Uint16: 2,\n        Uint32: 4,\n        Float32: 4,\n        Float64: 8\n    };\n    jDataView.wrapBuffer = function(buffer) {\n        switch (typeof buffer) {\n          case \"number\":\n            if (compatibility.NodeBuffer) buffer = new Buffer(buffer), buffer.fill(0); else if (compatibility.ArrayBuffer) buffer = new Uint8Array(buffer).buffer; else {\n                buffer = new Array(buffer);\n                for (var i = 0; i < buffer.length; i++) buffer[i] = 0;\n            }\n            return buffer;\n\n          case \"string\":\n            buffer = getCharCodes(buffer);\n\n          default:\n            return \"length\" in buffer && !(compatibility.NodeBuffer && is(buffer, Buffer) || compatibility.ArrayBuffer && is(buffer, ArrayBuffer)) && (compatibility.NodeBuffer ? buffer = new Buffer(buffer) : compatibility.ArrayBuffer ? is(buffer, ArrayBuffer) || (buffer = new Uint8Array(buffer).buffer, \n            is(buffer, ArrayBuffer) || (buffer = new Uint8Array(arrayFrom(buffer, !0)).buffer)) : buffer = arrayFrom(buffer)), \n            buffer;\n        }\n    }, jDataView.is = function(view) {\n        return view && view.jDataView;\n    }, jDataView.from = function() {\n        return new jDataView(arguments);\n    }, jDataView.Uint64 = Uint64, Uint64.prototype = {\n        valueOf: function() {\n            return this.lo + pow2(32) * this.hi;\n        },\n        toString: function() {\n            return Number.prototype.toString.apply(this.valueOf(), arguments);\n        }\n    }, Uint64.fromNumber = function(number) {\n        var hi = Math.floor(number / pow2(32)), lo = number - hi * pow2(32);\n        return new Uint64(lo, hi);\n    }, jDataView.Int64 = Int64, Int64.prototype = \"create\" in Object ? Object.create(Uint64.prototype) : new Uint64(), \n    Int64.prototype.valueOf = function() {\n        return this.hi < pow2(31) ? Uint64.prototype.valueOf.apply(this, arguments) : -(pow2(32) - this.lo + pow2(32) * (pow2(32) - 1 - this.hi));\n    }, Int64.fromNumber = function(number) {\n        var lo, hi;\n        if (number >= 0) {\n            var unsigned = Uint64.fromNumber(number);\n            lo = unsigned.lo, hi = unsigned.hi;\n        } else hi = Math.floor(number / pow2(32)), lo = number - hi * pow2(32), hi += pow2(32);\n        return new Int64(lo, hi);\n    };\n    var proto = jDataView.prototype = {\n        compatibility: compatibility,\n        jDataView: !0,\n        _checkBounds: function(byteOffset, byteLength, maxLength) {\n            if (\"number\" != typeof byteOffset) throw new TypeError(\"Offset is not a number.\");\n            if (\"number\" != typeof byteLength) throw new TypeError(\"Size is not a number.\");\n            if (0 > byteLength) throw new RangeError(\"Length is negative.\");\n            if (0 > byteOffset || byteOffset + byteLength > defined(maxLength, this.byteLength)) throw new RangeError(\"Offsets are out of bounds.\");\n        },\n        _action: function(type, isReadAction, byteOffset, littleEndian, value) {\n            return this._engineAction(type, isReadAction, defined(byteOffset, this._offset), defined(littleEndian, this._littleEndian), value);\n        },\n        _dataViewAction: function(type, isReadAction, byteOffset, littleEndian, value) {\n            return this._offset = byteOffset + dataTypes[type], isReadAction ? this._view[\"get\" + type](byteOffset, littleEndian) : this._view[\"set\" + type](byteOffset, value, littleEndian);\n        },\n        _arrayBufferAction: function(type, isReadAction, byteOffset, littleEndian, value) {\n            var typedArray, size = dataTypes[type], TypedArray = global[type + \"Array\"];\n            if (littleEndian = defined(littleEndian, this._littleEndian), 1 === size || (this.byteOffset + byteOffset) % size === 0 && littleEndian) return typedArray = new TypedArray(this.buffer, this.byteOffset + byteOffset, 1), \n            this._offset = byteOffset + size, isReadAction ? typedArray[0] : typedArray[0] = value;\n            var bytes = new Uint8Array(isReadAction ? this.getBytes(size, byteOffset, littleEndian, !0) : size);\n            return typedArray = new TypedArray(bytes.buffer, 0, 1), isReadAction ? typedArray[0] : (typedArray[0] = value, \n            void this._setBytes(byteOffset, bytes, littleEndian));\n        },\n        _arrayAction: function(type, isReadAction, byteOffset, littleEndian, value) {\n            return isReadAction ? this[\"_get\" + type](byteOffset, littleEndian) : this[\"_set\" + type](byteOffset, value, littleEndian);\n        },\n        _getBytes: function(length, byteOffset, littleEndian) {\n            littleEndian = defined(littleEndian, this._littleEndian), byteOffset = defined(byteOffset, this._offset), \n            length = defined(length, this.byteLength - byteOffset), this._checkBounds(byteOffset, length), \n            byteOffset += this.byteOffset, this._offset = byteOffset - this.byteOffset + length;\n            var result = this._isArrayBuffer ? new Uint8Array(this.buffer, byteOffset, length) : (this.buffer.slice || Array.prototype.slice).call(this.buffer, byteOffset, byteOffset + length);\n            return littleEndian || 1 >= length ? result : arrayFrom(result).reverse();\n        },\n        getBytes: function(length, byteOffset, littleEndian, toArray) {\n            var result = this._getBytes(length, byteOffset, defined(littleEndian, !0));\n            return toArray ? arrayFrom(result) : result;\n        },\n        _setBytes: function(byteOffset, bytes, littleEndian) {\n            var length = bytes.length;\n            if (0 !== length) {\n                if (littleEndian = defined(littleEndian, this._littleEndian), byteOffset = defined(byteOffset, this._offset), \n                this._checkBounds(byteOffset, length), !littleEndian && length > 1 && (bytes = arrayFrom(bytes, !0).reverse()), \n                byteOffset += this.byteOffset, this._isArrayBuffer) new Uint8Array(this.buffer, byteOffset, length).set(bytes); else if (this._isNodeBuffer) new Buffer(bytes).copy(this.buffer, byteOffset); else for (var i = 0; length > i; i++) this.buffer[byteOffset + i] = bytes[i];\n                this._offset = byteOffset - this.byteOffset + length;\n            }\n        },\n        setBytes: function(byteOffset, bytes, littleEndian) {\n            this._setBytes(byteOffset, bytes, defined(littleEndian, !0));\n        },\n        getString: function(byteLength, byteOffset, encoding) {\n            if (this._isNodeBuffer) return byteOffset = defined(byteOffset, this._offset), byteLength = defined(byteLength, this.byteLength - byteOffset), \n            this._checkBounds(byteOffset, byteLength), this._offset = byteOffset + byteLength, \n            this.buffer.toString(encoding || \"binary\", this.byteOffset + byteOffset, this.byteOffset + this._offset);\n            var bytes = this._getBytes(byteLength, byteOffset, !0);\n            if (encoding = \"utf8\" === encoding ? \"utf-8\" : encoding || \"binary\", TextDecoder && \"binary\" !== encoding) return new TextDecoder(encoding).decode(this._isArrayBuffer ? bytes : new Uint8Array(bytes));\n            var string = \"\";\n            byteLength = bytes.length;\n            for (var i = 0; byteLength > i; i++) string += String.fromCharCode(bytes[i]);\n            return \"utf-8\" === encoding && (string = decodeURIComponent(escape(string))), string;\n        },\n        setString: function(byteOffset, subString, encoding) {\n            if (this._isNodeBuffer) return byteOffset = defined(byteOffset, this._offset), this._checkBounds(byteOffset, subString.length), \n            void (this._offset = byteOffset + this.buffer.write(subString, this.byteOffset + byteOffset, encoding || \"binary\"));\n            encoding = \"utf8\" === encoding ? \"utf-8\" : encoding || \"binary\";\n            var bytes;\n            TextEncoder && \"binary\" !== encoding ? bytes = new TextEncoder(encoding).encode(subString) : (\"utf-8\" === encoding && (subString = unescape(encodeURIComponent(subString))), \n            bytes = getCharCodes(subString)), this._setBytes(byteOffset, bytes, !0);\n        },\n        getChar: function(byteOffset) {\n            return this.getString(1, byteOffset);\n        },\n        setChar: function(byteOffset, character) {\n            this.setString(byteOffset, character);\n        },\n        tell: function() {\n            return this._offset;\n        },\n        seek: function(byteOffset) {\n            return this._checkBounds(byteOffset, 0), this._offset = byteOffset;\n        },\n        skip: function(byteLength) {\n            return this.seek(this._offset + byteLength);\n        },\n        slice: function(start, end, forceCopy) {\n            function normalizeOffset(offset, byteLength) {\n                return 0 > offset ? offset + byteLength : offset;\n            }\n            return start = normalizeOffset(start, this.byteLength), end = normalizeOffset(defined(end, this.byteLength), this.byteLength), \n            forceCopy ? new jDataView(this.getBytes(end - start, start, !0, !0), void 0, void 0, this._littleEndian) : new jDataView(this.buffer, this.byteOffset + start, end - start, this._littleEndian);\n        },\n        alignBy: function(byteCount) {\n            return this._bitOffset = 0, 1 !== defined(byteCount, 1) ? this.skip(byteCount - (this._offset % byteCount || byteCount)) : this._offset;\n        },\n        _getFloat64: function(byteOffset, littleEndian) {\n            var b = this._getBytes(8, byteOffset, littleEndian), sign = 1 - 2 * (b[7] >> 7), exponent = ((b[7] << 1 & 255) << 3 | b[6] >> 4) - 1023, mantissa = (15 & b[6]) * pow2(48) + b[5] * pow2(40) + b[4] * pow2(32) + b[3] * pow2(24) + b[2] * pow2(16) + b[1] * pow2(8) + b[0];\n            return 1024 === exponent ? 0 !== mantissa ? 0/0 : 1/0 * sign : -1023 === exponent ? sign * mantissa * pow2(-1074) : sign * (1 + mantissa * pow2(-52)) * pow2(exponent);\n        },\n        _getFloat32: function(byteOffset, littleEndian) {\n            var b = this._getBytes(4, byteOffset, littleEndian), sign = 1 - 2 * (b[3] >> 7), exponent = (b[3] << 1 & 255 | b[2] >> 7) - 127, mantissa = (127 & b[2]) << 16 | b[1] << 8 | b[0];\n            return 128 === exponent ? 0 !== mantissa ? 0/0 : 1/0 * sign : -127 === exponent ? sign * mantissa * pow2(-149) : sign * (1 + mantissa * pow2(-23)) * pow2(exponent);\n        },\n        _get64: function(Type, byteOffset, littleEndian) {\n            littleEndian = defined(littleEndian, this._littleEndian), byteOffset = defined(byteOffset, this._offset);\n            for (var parts = littleEndian ? [ 0, 4 ] : [ 4, 0 ], i = 0; 2 > i; i++) parts[i] = this.getUint32(byteOffset + parts[i], littleEndian);\n            return this._offset = byteOffset + 8, new Type(parts[0], parts[1]);\n        },\n        getInt64: function(byteOffset, littleEndian) {\n            return this._get64(Int64, byteOffset, littleEndian);\n        },\n        getUint64: function(byteOffset, littleEndian) {\n            return this._get64(Uint64, byteOffset, littleEndian);\n        },\n        _getInt32: function(byteOffset, littleEndian) {\n            var b = this._getBytes(4, byteOffset, littleEndian);\n            return b[3] << 24 | b[2] << 16 | b[1] << 8 | b[0];\n        },\n        _getUint32: function(byteOffset, littleEndian) {\n            return this._getInt32(byteOffset, littleEndian) >>> 0;\n        },\n        _getInt16: function(byteOffset, littleEndian) {\n            return this._getUint16(byteOffset, littleEndian) << 16 >> 16;\n        },\n        _getUint16: function(byteOffset, littleEndian) {\n            var b = this._getBytes(2, byteOffset, littleEndian);\n            return b[1] << 8 | b[0];\n        },\n        _getInt8: function(byteOffset) {\n            return this._getUint8(byteOffset) << 24 >> 24;\n        },\n        _getUint8: function(byteOffset) {\n            return this._getBytes(1, byteOffset)[0];\n        },\n        _getBitRangeData: function(bitLength, byteOffset) {\n            var startBit = (defined(byteOffset, this._offset) << 3) + this._bitOffset, endBit = startBit + bitLength, start = startBit >>> 3, end = endBit + 7 >>> 3, b = this._getBytes(end - start, start, !0), wideValue = 0;\n            (this._bitOffset = 7 & endBit) && (this._bitOffset -= 8);\n            for (var i = 0, length = b.length; length > i; i++) wideValue = wideValue << 8 | b[i];\n            return {\n                start: start,\n                bytes: b,\n                wideValue: wideValue\n            };\n        },\n        getSigned: function(bitLength, byteOffset) {\n            var shift = 32 - bitLength;\n            return this.getUnsigned(bitLength, byteOffset) << shift >> shift;\n        },\n        getUnsigned: function(bitLength, byteOffset) {\n            var value = this._getBitRangeData(bitLength, byteOffset).wideValue >>> -this._bitOffset;\n            return 32 > bitLength ? value & ~(-1 << bitLength) : value;\n        },\n        _setBinaryFloat: function(byteOffset, value, mantSize, expSize, littleEndian) {\n            var exponent, mantissa, signBit = 0 > value ? 1 : 0, eMax = ~(-1 << expSize - 1), eMin = 1 - eMax;\n            0 > value && (value = -value), 0 === value ? (exponent = 0, mantissa = 0) : isNaN(value) ? (exponent = 2 * eMax + 1, \n            mantissa = 1) : 1/0 === value ? (exponent = 2 * eMax + 1, mantissa = 0) : (exponent = Math.floor(Math.log(value) / Math.LN2), \n            exponent >= eMin && eMax >= exponent ? (mantissa = Math.floor((value * pow2(-exponent) - 1) * pow2(mantSize)), \n            exponent += eMax) : (mantissa = Math.floor(value / pow2(eMin - mantSize)), exponent = 0));\n            for (var b = []; mantSize >= 8; ) b.push(mantissa % 256), mantissa = Math.floor(mantissa / 256), \n            mantSize -= 8;\n            for (exponent = exponent << mantSize | mantissa, expSize += mantSize; expSize >= 8; ) b.push(255 & exponent), \n            exponent >>>= 8, expSize -= 8;\n            b.push(signBit << expSize | exponent), this._setBytes(byteOffset, b, littleEndian);\n        },\n        _setFloat32: function(byteOffset, value, littleEndian) {\n            this._setBinaryFloat(byteOffset, value, 23, 8, littleEndian);\n        },\n        _setFloat64: function(byteOffset, value, littleEndian) {\n            this._setBinaryFloat(byteOffset, value, 52, 11, littleEndian);\n        },\n        _set64: function(Type, byteOffset, value, littleEndian) {\n            \"object\" != typeof value && (value = Type.fromNumber(value)), littleEndian = defined(littleEndian, this._littleEndian), \n            byteOffset = defined(byteOffset, this._offset);\n            var parts = littleEndian ? {\n                lo: 0,\n                hi: 4\n            } : {\n                lo: 4,\n                hi: 0\n            };\n            for (var partName in parts) this.setUint32(byteOffset + parts[partName], value[partName], littleEndian);\n            this._offset = byteOffset + 8;\n        },\n        setInt64: function(byteOffset, value, littleEndian) {\n            this._set64(Int64, byteOffset, value, littleEndian);\n        },\n        setUint64: function(byteOffset, value, littleEndian) {\n            this._set64(Uint64, byteOffset, value, littleEndian);\n        },\n        _setUint32: function(byteOffset, value, littleEndian) {\n            this._setBytes(byteOffset, [ 255 & value, value >>> 8 & 255, value >>> 16 & 255, value >>> 24 ], littleEndian);\n        },\n        _setUint16: function(byteOffset, value, littleEndian) {\n            this._setBytes(byteOffset, [ 255 & value, value >>> 8 & 255 ], littleEndian);\n        },\n        _setUint8: function(byteOffset, value) {\n            this._setBytes(byteOffset, [ 255 & value ]);\n        },\n        setUnsigned: function(byteOffset, value, bitLength) {\n            var data = this._getBitRangeData(bitLength, byteOffset), wideValue = data.wideValue, b = data.bytes;\n            wideValue &= ~(~(-1 << bitLength) << -this._bitOffset), wideValue |= (32 > bitLength ? value & ~(-1 << bitLength) : value) << -this._bitOffset;\n            for (var i = b.length - 1; i >= 0; i--) b[i] = 255 & wideValue, wideValue >>>= 8;\n            this._setBytes(data.start, b, !0);\n        }\n    }, nodeNaming = {\n        Int8: \"Int8\",\n        Int16: \"Int16\",\n        Int32: \"Int32\",\n        Uint8: \"UInt8\",\n        Uint16: \"UInt16\",\n        Uint32: \"UInt32\",\n        Float32: \"Float\",\n        Float64: \"Double\"\n    };\n    proto._nodeBufferAction = function(type, isReadAction, byteOffset, littleEndian, value) {\n        this._offset = byteOffset + dataTypes[type];\n        var nodeName = nodeNaming[type] + (\"Int8\" === type || \"Uint8\" === type ? \"\" : littleEndian ? \"LE\" : \"BE\");\n        return byteOffset += this.byteOffset, isReadAction ? this.buffer[\"read\" + nodeName](byteOffset) : this.buffer[\"write\" + nodeName](value, byteOffset);\n    };\n    for (var type in dataTypes) !function(type) {\n        proto[\"get\" + type] = function(byteOffset, littleEndian) {\n            return this._action(type, !0, byteOffset, littleEndian);\n        }, proto[\"set\" + type] = function(byteOffset, value, littleEndian) {\n            this._action(type, !1, byteOffset, littleEndian, value);\n        };\n    }(type);\n    proto._setInt32 = proto._setUint32, proto._setInt16 = proto._setUint16, proto._setInt8 = proto._setUint8, \n    proto.setSigned = proto.setUnsigned;\n    for (var method in proto) \"set\" === method.slice(0, 3) && !function(type) {\n        proto[\"write\" + type] = function() {\n            Array.prototype.unshift.call(arguments, void 0), this[\"set\" + type].apply(this, arguments);\n        };\n    }(method.slice(3));\n    return jDataView;\n});\n}).call(this)}).call(this,require(\"buffer\").Buffer)\n\n},{\"buffer\":3}],8:[function(require,module,exports){\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // 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            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // 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            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // 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            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // 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            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],9:[function(require,module,exports){\n/* eslint-disable node/no-deprecated-api */\nvar buffer = require('buffer')\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n  for (var key in src) {\n    dst[key] = src[key]\n  }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n  module.exports = buffer\n} else {\n  // Copy properties from require('buffer')\n  copyProps(buffer, exports)\n  exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n  return Buffer(arg, encodingOrOffset, length)\n}\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n  if (typeof arg === 'number') {\n    throw new TypeError('Argument must not be a number')\n  }\n  return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  var buf = Buffer(size)\n  if (fill !== undefined) {\n    if (typeof encoding === 'string') {\n      buf.fill(fill, encoding)\n    } else {\n      buf.fill(fill)\n    }\n  } else {\n    buf.fill(0)\n  }\n  return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  return buffer.SlowBuffer(size)\n}\n\n},{\"buffer\":3}],10:[function(require,module,exports){\n(function (Buffer){(function (){\n;(function (sax) { // wrapper for non-node envs\n  sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }\n  sax.SAXParser = SAXParser\n  sax.SAXStream = SAXStream\n  sax.createStream = createStream\n\n  // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.\n  // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),\n  // since that's the earliest that a buffer overrun could occur.  This way, checks are\n  // as rare as required, but as often as necessary to ensure never crossing this bound.\n  // Furthermore, buffers are only tested at most once per write(), so passing a very\n  // large string into write() might have undesirable effects, but this is manageable by\n  // the caller, so it is assumed to be safe.  Thus, a call to write() may, in the extreme\n  // edge case, result in creating at most one complete copy of the string passed in.\n  // Set to Infinity to have unlimited buffers.\n  sax.MAX_BUFFER_LENGTH = 64 * 1024\n\n  var buffers = [\n    'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',\n    'procInstName', 'procInstBody', 'entity', 'attribName',\n    'attribValue', 'cdata', 'script'\n  ]\n\n  sax.EVENTS = [\n    'text',\n    'processinginstruction',\n    'sgmldeclaration',\n    'doctype',\n    'comment',\n    'opentagstart',\n    'attribute',\n    'opentag',\n    'closetag',\n    'opencdata',\n    'cdata',\n    'closecdata',\n    'error',\n    'end',\n    'ready',\n    'script',\n    'opennamespace',\n    'closenamespace'\n  ]\n\n  function SAXParser (strict, opt) {\n    if (!(this instanceof SAXParser)) {\n      return new SAXParser(strict, opt)\n    }\n\n    var parser = this\n    clearBuffers(parser)\n    parser.q = parser.c = ''\n    parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH\n    parser.opt = opt || {}\n    parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags\n    parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'\n    parser.tags = []\n    parser.closed = parser.closedRoot = parser.sawRoot = false\n    parser.tag = parser.error = null\n    parser.strict = !!strict\n    parser.noscript = !!(strict || parser.opt.noscript)\n    parser.state = S.BEGIN\n    parser.strictEntities = parser.opt.strictEntities\n    parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)\n    parser.attribList = []\n\n    // namespaces form a prototype chain.\n    // it always points at the current tag,\n    // which protos to its parent tag.\n    if (parser.opt.xmlns) {\n      parser.ns = Object.create(rootNS)\n    }\n\n    // mostly just for error reporting\n    parser.trackPosition = parser.opt.position !== false\n    if (parser.trackPosition) {\n      parser.position = parser.line = parser.column = 0\n    }\n    emit(parser, 'onready')\n  }\n\n  if (!Object.create) {\n    Object.create = function (o) {\n      function F () {}\n      F.prototype = o\n      var newf = new F()\n      return newf\n    }\n  }\n\n  if (!Object.keys) {\n    Object.keys = function (o) {\n      var a = []\n      for (var i in o) if (o.hasOwnProperty(i)) a.push(i)\n      return a\n    }\n  }\n\n  function checkBufferLength (parser) {\n    var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)\n    var maxActual = 0\n    for (var i = 0, l = buffers.length; i < l; i++) {\n      var len = parser[buffers[i]].length\n      if (len > maxAllowed) {\n        // Text/cdata nodes can get big, and since they're buffered,\n        // we can get here under normal conditions.\n        // Avoid issues by emitting the text node now,\n        // so at least it won't get any bigger.\n        switch (buffers[i]) {\n          case 'textNode':\n            closeText(parser)\n            break\n\n          case 'cdata':\n            emitNode(parser, 'oncdata', parser.cdata)\n            parser.cdata = ''\n            break\n\n          case 'script':\n            emitNode(parser, 'onscript', parser.script)\n            parser.script = ''\n            break\n\n          default:\n            error(parser, 'Max buffer length exceeded: ' + buffers[i])\n        }\n      }\n      maxActual = Math.max(maxActual, len)\n    }\n    // schedule the next check for the earliest possible buffer overrun.\n    var m = sax.MAX_BUFFER_LENGTH - maxActual\n    parser.bufferCheckPosition = m + parser.position\n  }\n\n  function clearBuffers (parser) {\n    for (var i = 0, l = buffers.length; i < l; i++) {\n      parser[buffers[i]] = ''\n    }\n  }\n\n  function flushBuffers (parser) {\n    closeText(parser)\n    if (parser.cdata !== '') {\n      emitNode(parser, 'oncdata', parser.cdata)\n      parser.cdata = ''\n    }\n    if (parser.script !== '') {\n      emitNode(parser, 'onscript', parser.script)\n      parser.script = ''\n    }\n  }\n\n  SAXParser.prototype = {\n    end: function () { end(this) },\n    write: write,\n    resume: function () { this.error = null; return this },\n    close: function () { return this.write(null) },\n    flush: function () { flushBuffers(this) }\n  }\n\n  var Stream\n  try {\n    Stream = require('stream').Stream\n  } catch (ex) {\n    Stream = function () {}\n  }\n\n  var streamWraps = sax.EVENTS.filter(function (ev) {\n    return ev !== 'error' && ev !== 'end'\n  })\n\n  function createStream (strict, opt) {\n    return new SAXStream(strict, opt)\n  }\n\n  function SAXStream (strict, opt) {\n    if (!(this instanceof SAXStream)) {\n      return new SAXStream(strict, opt)\n    }\n\n    Stream.apply(this)\n\n    this._parser = new SAXParser(strict, opt)\n    this.writable = true\n    this.readable = true\n\n    var me = this\n\n    this._parser.onend = function () {\n      me.emit('end')\n    }\n\n    this._parser.onerror = function (er) {\n      me.emit('error', er)\n\n      // if didn't throw, then means error was handled.\n      // go ahead and clear error, so we can write again.\n      me._parser.error = null\n    }\n\n    this._decoder = null\n\n    streamWraps.forEach(function (ev) {\n      Object.defineProperty(me, 'on' + ev, {\n        get: function () {\n          return me._parser['on' + ev]\n        },\n        set: function (h) {\n          if (!h) {\n            me.removeAllListeners(ev)\n            me._parser['on' + ev] = h\n            return h\n          }\n          me.on(ev, h)\n        },\n        enumerable: true,\n        configurable: false\n      })\n    })\n  }\n\n  SAXStream.prototype = Object.create(Stream.prototype, {\n    constructor: {\n      value: SAXStream\n    }\n  })\n\n  SAXStream.prototype.write = function (data) {\n    if (typeof Buffer === 'function' &&\n      typeof Buffer.isBuffer === 'function' &&\n      Buffer.isBuffer(data)) {\n      if (!this._decoder) {\n        var SD = require('string_decoder').StringDecoder\n        this._decoder = new SD('utf8')\n      }\n      data = this._decoder.write(data)\n    }\n\n    this._parser.write(data.toString())\n    this.emit('data', data)\n    return true\n  }\n\n  SAXStream.prototype.end = function (chunk) {\n    if (chunk && chunk.length) {\n      this.write(chunk)\n    }\n    this._parser.end()\n    return true\n  }\n\n  SAXStream.prototype.on = function (ev, handler) {\n    var me = this\n    if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {\n      me._parser['on' + ev] = function () {\n        var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)\n        args.splice(0, 0, ev)\n        me.emit.apply(me, args)\n      }\n    }\n\n    return Stream.prototype.on.call(me, ev, handler)\n  }\n\n  // this really needs to be replaced with character classes.\n  // XML allows all manner of ridiculous numbers and digits.\n  var CDATA = '[CDATA['\n  var DOCTYPE = 'DOCTYPE'\n  var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'\n  var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'\n  var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }\n\n  // http://www.w3.org/TR/REC-xml/#NT-NameStartChar\n  // This implementation works on strings, a single character at a time\n  // as such, it cannot ever support astral-plane characters (10000-EFFFF)\n  // without a significant breaking change to either this  parser, or the\n  // JavaScript language.  Implementation of an emoji-capable xml parser\n  // is left as an exercise for the reader.\n  var nameStart = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n\n  var nameBody = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040.\\d-]/\n\n  var entityStart = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n  var entityBody = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040.\\d-]/\n\n  function isWhitespace (c) {\n    return c === ' ' || c === '\\n' || c === '\\r' || c === '\\t'\n  }\n\n  function isQuote (c) {\n    return c === '\"' || c === '\\''\n  }\n\n  function isAttribEnd (c) {\n    return c === '>' || isWhitespace(c)\n  }\n\n  function isMatch (regex, c) {\n    return regex.test(c)\n  }\n\n  function notMatch (regex, c) {\n    return !isMatch(regex, c)\n  }\n\n  var S = 0\n  sax.STATE = {\n    BEGIN: S++, // leading byte order mark or whitespace\n    BEGIN_WHITESPACE: S++, // leading whitespace\n    TEXT: S++, // general stuff\n    TEXT_ENTITY: S++, // &amp and such.\n    OPEN_WAKA: S++, // <\n    SGML_DECL: S++, // <!BLARG\n    SGML_DECL_QUOTED: S++, // <!BLARG foo \"bar\n    DOCTYPE: S++, // <!DOCTYPE\n    DOCTYPE_QUOTED: S++, // <!DOCTYPE \"//blah\n    DOCTYPE_DTD: S++, // <!DOCTYPE \"//blah\" [ ...\n    DOCTYPE_DTD_QUOTED: S++, // <!DOCTYPE \"//blah\" [ \"foo\n    COMMENT_STARTING: S++, // <!-\n    COMMENT: S++, // <!--\n    COMMENT_ENDING: S++, // <!-- blah -\n    COMMENT_ENDED: S++, // <!-- blah --\n    CDATA: S++, // <![CDATA[ something\n    CDATA_ENDING: S++, // ]\n    CDATA_ENDING_2: S++, // ]]\n    PROC_INST: S++, // <?hi\n    PROC_INST_BODY: S++, // <?hi there\n    PROC_INST_ENDING: S++, // <?hi \"there\" ?\n    OPEN_TAG: S++, // <strong\n    OPEN_TAG_SLASH: S++, // <strong /\n    ATTRIB: S++, // <a\n    ATTRIB_NAME: S++, // <a foo\n    ATTRIB_NAME_SAW_WHITE: S++, // <a foo _\n    ATTRIB_VALUE: S++, // <a foo=\n    ATTRIB_VALUE_QUOTED: S++, // <a foo=\"bar\n    ATTRIB_VALUE_CLOSED: S++, // <a foo=\"bar\"\n    ATTRIB_VALUE_UNQUOTED: S++, // <a foo=bar\n    ATTRIB_VALUE_ENTITY_Q: S++, // <foo bar=\"&quot;\"\n    ATTRIB_VALUE_ENTITY_U: S++, // <foo bar=&quot\n    CLOSE_TAG: S++, // </a\n    CLOSE_TAG_SAW_WHITE: S++, // </a   >\n    SCRIPT: S++, // <script> ...\n    SCRIPT_ENDING: S++ // <script> ... <\n  }\n\n  sax.XML_ENTITIES = {\n    'amp': '&',\n    'gt': '>',\n    'lt': '<',\n    'quot': '\"',\n    'apos': \"'\"\n  }\n\n  sax.ENTITIES = {\n    'amp': '&',\n    'gt': '>',\n    'lt': '<',\n    'quot': '\"',\n    'apos': \"'\",\n    'AElig': 198,\n    'Aacute': 193,\n    'Acirc': 194,\n    'Agrave': 192,\n    'Aring': 197,\n    'Atilde': 195,\n    'Auml': 196,\n    'Ccedil': 199,\n    'ETH': 208,\n    'Eacute': 201,\n    'Ecirc': 202,\n    'Egrave': 200,\n    'Euml': 203,\n    'Iacute': 205,\n    'Icirc': 206,\n    'Igrave': 204,\n    'Iuml': 207,\n    'Ntilde': 209,\n    'Oacute': 211,\n    'Ocirc': 212,\n    'Ograve': 210,\n    'Oslash': 216,\n    'Otilde': 213,\n    'Ouml': 214,\n    'THORN': 222,\n    'Uacute': 218,\n    'Ucirc': 219,\n    'Ugrave': 217,\n    'Uuml': 220,\n    'Yacute': 221,\n    'aacute': 225,\n    'acirc': 226,\n    'aelig': 230,\n    'agrave': 224,\n    'aring': 229,\n    'atilde': 227,\n    'auml': 228,\n    'ccedil': 231,\n    'eacute': 233,\n    'ecirc': 234,\n    'egrave': 232,\n    'eth': 240,\n    'euml': 235,\n    'iacute': 237,\n    'icirc': 238,\n    'igrave': 236,\n    'iuml': 239,\n    'ntilde': 241,\n    'oacute': 243,\n    'ocirc': 244,\n    'ograve': 242,\n    'oslash': 248,\n    'otilde': 245,\n    'ouml': 246,\n    'szlig': 223,\n    'thorn': 254,\n    'uacute': 250,\n    'ucirc': 251,\n    'ugrave': 249,\n    'uuml': 252,\n    'yacute': 253,\n    'yuml': 255,\n    'copy': 169,\n    'reg': 174,\n    'nbsp': 160,\n    'iexcl': 161,\n    'cent': 162,\n    'pound': 163,\n    'curren': 164,\n    'yen': 165,\n    'brvbar': 166,\n    'sect': 167,\n    'uml': 168,\n    'ordf': 170,\n    'laquo': 171,\n    'not': 172,\n    'shy': 173,\n    'macr': 175,\n    'deg': 176,\n    'plusmn': 177,\n    'sup1': 185,\n    'sup2': 178,\n    'sup3': 179,\n    'acute': 180,\n    'micro': 181,\n    'para': 182,\n    'middot': 183,\n    'cedil': 184,\n    'ordm': 186,\n    'raquo': 187,\n    'frac14': 188,\n    'frac12': 189,\n    'frac34': 190,\n    'iquest': 191,\n    'times': 215,\n    'divide': 247,\n    'OElig': 338,\n    'oelig': 339,\n    'Scaron': 352,\n    'scaron': 353,\n    'Yuml': 376,\n    'fnof': 402,\n    'circ': 710,\n    'tilde': 732,\n    'Alpha': 913,\n    'Beta': 914,\n    'Gamma': 915,\n    'Delta': 916,\n    'Epsilon': 917,\n    'Zeta': 918,\n    'Eta': 919,\n    'Theta': 920,\n    'Iota': 921,\n    'Kappa': 922,\n    'Lambda': 923,\n    'Mu': 924,\n    'Nu': 925,\n    'Xi': 926,\n    'Omicron': 927,\n    'Pi': 928,\n    'Rho': 929,\n    'Sigma': 931,\n    'Tau': 932,\n    'Upsilon': 933,\n    'Phi': 934,\n    'Chi': 935,\n    'Psi': 936,\n    'Omega': 937,\n    'alpha': 945,\n    'beta': 946,\n    'gamma': 947,\n    'delta': 948,\n    'epsilon': 949,\n    'zeta': 950,\n    'eta': 951,\n    'theta': 952,\n    'iota': 953,\n    'kappa': 954,\n    'lambda': 955,\n    'mu': 956,\n    'nu': 957,\n    'xi': 958,\n    'omicron': 959,\n    'pi': 960,\n    'rho': 961,\n    'sigmaf': 962,\n    'sigma': 963,\n    'tau': 964,\n    'upsilon': 965,\n    'phi': 966,\n    'chi': 967,\n    'psi': 968,\n    'omega': 969,\n    'thetasym': 977,\n    'upsih': 978,\n    'piv': 982,\n    'ensp': 8194,\n    'emsp': 8195,\n    'thinsp': 8201,\n    'zwnj': 8204,\n    'zwj': 8205,\n    'lrm': 8206,\n    'rlm': 8207,\n    'ndash': 8211,\n    'mdash': 8212,\n    'lsquo': 8216,\n    'rsquo': 8217,\n    'sbquo': 8218,\n    'ldquo': 8220,\n    'rdquo': 8221,\n    'bdquo': 8222,\n    'dagger': 8224,\n    'Dagger': 8225,\n    'bull': 8226,\n    'hellip': 8230,\n    'permil': 8240,\n    'prime': 8242,\n    'Prime': 8243,\n    'lsaquo': 8249,\n    'rsaquo': 8250,\n    'oline': 8254,\n    'frasl': 8260,\n    'euro': 8364,\n    'image': 8465,\n    'weierp': 8472,\n    'real': 8476,\n    'trade': 8482,\n    'alefsym': 8501,\n    'larr': 8592,\n    'uarr': 8593,\n    'rarr': 8594,\n    'darr': 8595,\n    'harr': 8596,\n    'crarr': 8629,\n    'lArr': 8656,\n    'uArr': 8657,\n    'rArr': 8658,\n    'dArr': 8659,\n    'hArr': 8660,\n    'forall': 8704,\n    'part': 8706,\n    'exist': 8707,\n    'empty': 8709,\n    'nabla': 8711,\n    'isin': 8712,\n    'notin': 8713,\n    'ni': 8715,\n    'prod': 8719,\n    'sum': 8721,\n    'minus': 8722,\n    'lowast': 8727,\n    'radic': 8730,\n    'prop': 8733,\n    'infin': 8734,\n    'ang': 8736,\n    'and': 8743,\n    'or': 8744,\n    'cap': 8745,\n    'cup': 8746,\n    'int': 8747,\n    'there4': 8756,\n    'sim': 8764,\n    'cong': 8773,\n    'asymp': 8776,\n    'ne': 8800,\n    'equiv': 8801,\n    'le': 8804,\n    'ge': 8805,\n    'sub': 8834,\n    'sup': 8835,\n    'nsub': 8836,\n    'sube': 8838,\n    'supe': 8839,\n    'oplus': 8853,\n    'otimes': 8855,\n    'perp': 8869,\n    'sdot': 8901,\n    'lceil': 8968,\n    'rceil': 8969,\n    'lfloor': 8970,\n    'rfloor': 8971,\n    'lang': 9001,\n    'rang': 9002,\n    'loz': 9674,\n    'spades': 9824,\n    'clubs': 9827,\n    'hearts': 9829,\n    'diams': 9830\n  }\n\n  Object.keys(sax.ENTITIES).forEach(function (key) {\n    var e = sax.ENTITIES[key]\n    var s = typeof e === 'number' ? String.fromCharCode(e) : e\n    sax.ENTITIES[key] = s\n  })\n\n  for (var s in sax.STATE) {\n    sax.STATE[sax.STATE[s]] = s\n  }\n\n  // shorthand\n  S = sax.STATE\n\n  function emit (parser, event, data) {\n    parser[event] && parser[event](data)\n  }\n\n  function emitNode (parser, nodeType, data) {\n    if (parser.textNode) closeText(parser)\n    emit(parser, nodeType, data)\n  }\n\n  function closeText (parser) {\n    parser.textNode = textopts(parser.opt, parser.textNode)\n    if (parser.textNode) emit(parser, 'ontext', parser.textNode)\n    parser.textNode = ''\n  }\n\n  function textopts (opt, text) {\n    if (opt.trim) text = text.trim()\n    if (opt.normalize) text = text.replace(/\\s+/g, ' ')\n    return text\n  }\n\n  function error (parser, er) {\n    closeText(parser)\n    if (parser.trackPosition) {\n      er += '\\nLine: ' + parser.line +\n        '\\nColumn: ' + parser.column +\n        '\\nChar: ' + parser.c\n    }\n    er = new Error(er)\n    parser.error = er\n    emit(parser, 'onerror', er)\n    return parser\n  }\n\n  function end (parser) {\n    if (parser.sawRoot && !parser.closedRoot) strictFail(parser, 'Unclosed root tag')\n    if ((parser.state !== S.BEGIN) &&\n      (parser.state !== S.BEGIN_WHITESPACE) &&\n      (parser.state !== S.TEXT)) {\n      error(parser, 'Unexpected end')\n    }\n    closeText(parser)\n    parser.c = ''\n    parser.closed = true\n    emit(parser, 'onend')\n    SAXParser.call(parser, parser.strict, parser.opt)\n    return parser\n  }\n\n  function strictFail (parser, message) {\n    if (typeof parser !== 'object' || !(parser instanceof SAXParser)) {\n      throw new Error('bad call to strictFail')\n    }\n    if (parser.strict) {\n      error(parser, message)\n    }\n  }\n\n  function newTag (parser) {\n    if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]()\n    var parent = parser.tags[parser.tags.length - 1] || parser\n    var tag = parser.tag = { name: parser.tagName, attributes: {} }\n\n    // will be overridden if tag contails an xmlns=\"foo\" or xmlns:foo=\"bar\"\n    if (parser.opt.xmlns) {\n      tag.ns = parent.ns\n    }\n    parser.attribList.length = 0\n    emitNode(parser, 'onopentagstart', tag)\n  }\n\n  function qname (name, attribute) {\n    var i = name.indexOf(':')\n    var qualName = i < 0 ? [ '', name ] : name.split(':')\n    var prefix = qualName[0]\n    var local = qualName[1]\n\n    // <x \"xmlns\"=\"http://foo\">\n    if (attribute && name === 'xmlns') {\n      prefix = 'xmlns'\n      local = ''\n    }\n\n    return { prefix: prefix, local: local }\n  }\n\n  function attrib (parser) {\n    if (!parser.strict) {\n      parser.attribName = parser.attribName[parser.looseCase]()\n    }\n\n    if (parser.attribList.indexOf(parser.attribName) !== -1 ||\n      parser.tag.attributes.hasOwnProperty(parser.attribName)) {\n      parser.attribName = parser.attribValue = ''\n      return\n    }\n\n    if (parser.opt.xmlns) {\n      var qn = qname(parser.attribName, true)\n      var prefix = qn.prefix\n      var local = qn.local\n\n      if (prefix === 'xmlns') {\n        // namespace binding attribute. push the binding into scope\n        if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) {\n          strictFail(parser,\n            'xml: prefix must be bound to ' + XML_NAMESPACE + '\\n' +\n            'Actual: ' + parser.attribValue)\n        } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) {\n          strictFail(parser,\n            'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\\n' +\n            'Actual: ' + parser.attribValue)\n        } else {\n          var tag = parser.tag\n          var parent = parser.tags[parser.tags.length - 1] || parser\n          if (tag.ns === parent.ns) {\n            tag.ns = Object.create(parent.ns)\n          }\n          tag.ns[local] = parser.attribValue\n        }\n      }\n\n      // defer onattribute events until all attributes have been seen\n      // so any new bindings can take effect. preserve attribute order\n      // so deferred events can be emitted in document order\n      parser.attribList.push([parser.attribName, parser.attribValue])\n    } else {\n      // in non-xmlns mode, we can emit the event right away\n      parser.tag.attributes[parser.attribName] = parser.attribValue\n      emitNode(parser, 'onattribute', {\n        name: parser.attribName,\n        value: parser.attribValue\n      })\n    }\n\n    parser.attribName = parser.attribValue = ''\n  }\n\n  function openTag (parser, selfClosing) {\n    if (parser.opt.xmlns) {\n      // emit namespace binding events\n      var tag = parser.tag\n\n      // add namespace info to tag\n      var qn = qname(parser.tagName)\n      tag.prefix = qn.prefix\n      tag.local = qn.local\n      tag.uri = tag.ns[qn.prefix] || ''\n\n      if (tag.prefix && !tag.uri) {\n        strictFail(parser, 'Unbound namespace prefix: ' +\n          JSON.stringify(parser.tagName))\n        tag.uri = qn.prefix\n      }\n\n      var parent = parser.tags[parser.tags.length - 1] || parser\n      if (tag.ns && parent.ns !== tag.ns) {\n        Object.keys(tag.ns).forEach(function (p) {\n          emitNode(parser, 'onopennamespace', {\n            prefix: p,\n            uri: tag.ns[p]\n          })\n        })\n      }\n\n      // handle deferred onattribute events\n      // Note: do not apply default ns to attributes:\n      //   http://www.w3.org/TR/REC-xml-names/#defaulting\n      for (var i = 0, l = parser.attribList.length; i < l; i++) {\n        var nv = parser.attribList[i]\n        var name = nv[0]\n        var value = nv[1]\n        var qualName = qname(name, true)\n        var prefix = qualName.prefix\n        var local = qualName.local\n        var uri = prefix === '' ? '' : (tag.ns[prefix] || '')\n        var a = {\n          name: name,\n          value: value,\n          prefix: prefix,\n          local: local,\n          uri: uri\n        }\n\n        // if there's any attributes with an undefined namespace,\n        // then fail on them now.\n        if (prefix && prefix !== 'xmlns' && !uri) {\n          strictFail(parser, 'Unbound namespace prefix: ' +\n            JSON.stringify(prefix))\n          a.uri = prefix\n        }\n        parser.tag.attributes[name] = a\n        emitNode(parser, 'onattribute', a)\n      }\n      parser.attribList.length = 0\n    }\n\n    parser.tag.isSelfClosing = !!selfClosing\n\n    // process the tag\n    parser.sawRoot = true\n    parser.tags.push(parser.tag)\n    emitNode(parser, 'onopentag', parser.tag)\n    if (!selfClosing) {\n      // special case for <script> in non-strict mode.\n      if (!parser.noscript && parser.tagName.toLowerCase() === 'script') {\n        parser.state = S.SCRIPT\n      } else {\n        parser.state = S.TEXT\n      }\n      parser.tag = null\n      parser.tagName = ''\n    }\n    parser.attribName = parser.attribValue = ''\n    parser.attribList.length = 0\n  }\n\n  function closeTag (parser) {\n    if (!parser.tagName) {\n      strictFail(parser, 'Weird empty close tag.')\n      parser.textNode += '</>'\n      parser.state = S.TEXT\n      return\n    }\n\n    if (parser.script) {\n      if (parser.tagName !== 'script') {\n        parser.script += '</' + parser.tagName + '>'\n        parser.tagName = ''\n        parser.state = S.SCRIPT\n        return\n      }\n      emitNode(parser, 'onscript', parser.script)\n      parser.script = ''\n    }\n\n    // first make sure that the closing tag actually exists.\n    // <a><b></c></b></a> will close everything, otherwise.\n    var t = parser.tags.length\n    var tagName = parser.tagName\n    if (!parser.strict) {\n      tagName = tagName[parser.looseCase]()\n    }\n    var closeTo = tagName\n    while (t--) {\n      var close = parser.tags[t]\n      if (close.name !== closeTo) {\n        // fail the first time in strict mode\n        strictFail(parser, 'Unexpected close tag')\n      } else {\n        break\n      }\n    }\n\n    // didn't find it.  we already failed for strict, so just abort.\n    if (t < 0) {\n      strictFail(parser, 'Unmatched closing tag: ' + parser.tagName)\n      parser.textNode += '</' + parser.tagName + '>'\n      parser.state = S.TEXT\n      return\n    }\n    parser.tagName = tagName\n    var s = parser.tags.length\n    while (s-- > t) {\n      var tag = parser.tag = parser.tags.pop()\n      parser.tagName = parser.tag.name\n      emitNode(parser, 'onclosetag', parser.tagName)\n\n      var x = {}\n      for (var i in tag.ns) {\n        x[i] = tag.ns[i]\n      }\n\n      var parent = parser.tags[parser.tags.length - 1] || parser\n      if (parser.opt.xmlns && tag.ns !== parent.ns) {\n        // remove namespace bindings introduced by tag\n        Object.keys(tag.ns).forEach(function (p) {\n          var n = tag.ns[p]\n          emitNode(parser, 'onclosenamespace', { prefix: p, uri: n })\n        })\n      }\n    }\n    if (t === 0) parser.closedRoot = true\n    parser.tagName = parser.attribValue = parser.attribName = ''\n    parser.attribList.length = 0\n    parser.state = S.TEXT\n  }\n\n  function parseEntity (parser) {\n    var entity = parser.entity\n    var entityLC = entity.toLowerCase()\n    var num\n    var numStr = ''\n\n    if (parser.ENTITIES[entity]) {\n      return parser.ENTITIES[entity]\n    }\n    if (parser.ENTITIES[entityLC]) {\n      return parser.ENTITIES[entityLC]\n    }\n    entity = entityLC\n    if (entity.charAt(0) === '#') {\n      if (entity.charAt(1) === 'x') {\n        entity = entity.slice(2)\n        num = parseInt(entity, 16)\n        numStr = num.toString(16)\n      } else {\n        entity = entity.slice(1)\n        num = parseInt(entity, 10)\n        numStr = num.toString(10)\n      }\n    }\n    entity = entity.replace(/^0+/, '')\n    if (isNaN(num) || numStr.toLowerCase() !== entity) {\n      strictFail(parser, 'Invalid character entity')\n      return '&' + parser.entity + ';'\n    }\n\n    return String.fromCodePoint(num)\n  }\n\n  function beginWhiteSpace (parser, c) {\n    if (c === '<') {\n      parser.state = S.OPEN_WAKA\n      parser.startTagPosition = parser.position\n    } else if (!isWhitespace(c)) {\n      // have to process this as a text node.\n      // weird, but happens.\n      strictFail(parser, 'Non-whitespace before first tag.')\n      parser.textNode = c\n      parser.state = S.TEXT\n    }\n  }\n\n  function charAt (chunk, i) {\n    var result = ''\n    if (i < chunk.length) {\n      result = chunk.charAt(i)\n    }\n    return result\n  }\n\n  function write (chunk) {\n    var parser = this\n    if (this.error) {\n      throw this.error\n    }\n    if (parser.closed) {\n      return error(parser,\n        'Cannot write after close. Assign an onready handler.')\n    }\n    if (chunk === null) {\n      return end(parser)\n    }\n    if (typeof chunk === 'object') {\n      chunk = chunk.toString()\n    }\n    var i = 0\n    var c = ''\n    while (true) {\n      c = charAt(chunk, i++)\n      parser.c = c\n\n      if (!c) {\n        break\n      }\n\n      if (parser.trackPosition) {\n        parser.position++\n        if (c === '\\n') {\n          parser.line++\n          parser.column = 0\n        } else {\n          parser.column++\n        }\n      }\n\n      switch (parser.state) {\n        case S.BEGIN:\n          parser.state = S.BEGIN_WHITESPACE\n          if (c === '\\uFEFF') {\n            continue\n          }\n          beginWhiteSpace(parser, c)\n          continue\n\n        case S.BEGIN_WHITESPACE:\n          beginWhiteSpace(parser, c)\n          continue\n\n        case S.TEXT:\n          if (parser.sawRoot && !parser.closedRoot) {\n            var starti = i - 1\n            while (c && c !== '<' && c !== '&') {\n              c = charAt(chunk, i++)\n              if (c && parser.trackPosition) {\n                parser.position++\n                if (c === '\\n') {\n                  parser.line++\n                  parser.column = 0\n                } else {\n                  parser.column++\n                }\n              }\n            }\n            parser.textNode += chunk.substring(starti, i - 1)\n          }\n          if (c === '<' && !(parser.sawRoot && parser.closedRoot && !parser.strict)) {\n            parser.state = S.OPEN_WAKA\n            parser.startTagPosition = parser.position\n          } else {\n            if (!isWhitespace(c) && (!parser.sawRoot || parser.closedRoot)) {\n              strictFail(parser, 'Text data outside of root node.')\n            }\n            if (c === '&') {\n              parser.state = S.TEXT_ENTITY\n            } else {\n              parser.textNode += c\n            }\n          }\n          continue\n\n        case S.SCRIPT:\n          // only non-strict\n          if (c === '<') {\n            parser.state = S.SCRIPT_ENDING\n          } else {\n            parser.script += c\n          }\n          continue\n\n        case S.SCRIPT_ENDING:\n          if (c === '/') {\n            parser.state = S.CLOSE_TAG\n          } else {\n            parser.script += '<' + c\n            parser.state = S.SCRIPT\n          }\n          continue\n\n        case S.OPEN_WAKA:\n          // either a /, ?, !, or text is coming next.\n          if (c === '!') {\n            parser.state = S.SGML_DECL\n            parser.sgmlDecl = ''\n          } else if (isWhitespace(c)) {\n            // wait for it...\n          } else if (isMatch(nameStart, c)) {\n            parser.state = S.OPEN_TAG\n            parser.tagName = c\n          } else if (c === '/') {\n            parser.state = S.CLOSE_TAG\n            parser.tagName = ''\n          } else if (c === '?') {\n            parser.state = S.PROC_INST\n            parser.procInstName = parser.procInstBody = ''\n          } else {\n            strictFail(parser, 'Unencoded <')\n            // if there was some whitespace, then add that in.\n            if (parser.startTagPosition + 1 < parser.position) {\n              var pad = parser.position - parser.startTagPosition\n              c = new Array(pad).join(' ') + c\n            }\n            parser.textNode += '<' + c\n            parser.state = S.TEXT\n          }\n          continue\n\n        case S.SGML_DECL:\n          if ((parser.sgmlDecl + c).toUpperCase() === CDATA) {\n            emitNode(parser, 'onopencdata')\n            parser.state = S.CDATA\n            parser.sgmlDecl = ''\n            parser.cdata = ''\n          } else if (parser.sgmlDecl + c === '--') {\n            parser.state = S.COMMENT\n            parser.comment = ''\n            parser.sgmlDecl = ''\n          } else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) {\n            parser.state = S.DOCTYPE\n            if (parser.doctype || parser.sawRoot) {\n              strictFail(parser,\n                'Inappropriately located doctype declaration')\n            }\n            parser.doctype = ''\n            parser.sgmlDecl = ''\n          } else if (c === '>') {\n            emitNode(parser, 'onsgmldeclaration', parser.sgmlDecl)\n            parser.sgmlDecl = ''\n            parser.state = S.TEXT\n          } else if (isQuote(c)) {\n            parser.state = S.SGML_DECL_QUOTED\n            parser.sgmlDecl += c\n          } else {\n            parser.sgmlDecl += c\n          }\n          continue\n\n        case S.SGML_DECL_QUOTED:\n          if (c === parser.q) {\n            parser.state = S.SGML_DECL\n            parser.q = ''\n          }\n          parser.sgmlDecl += c\n          continue\n\n        case S.DOCTYPE:\n          if (c === '>') {\n            parser.state = S.TEXT\n            emitNode(parser, 'ondoctype', parser.doctype)\n            parser.doctype = true // just remember that we saw it.\n          } else {\n            parser.doctype += c\n            if (c === '[') {\n              parser.state = S.DOCTYPE_DTD\n            } else if (isQuote(c)) {\n              parser.state = S.DOCTYPE_QUOTED\n              parser.q = c\n            }\n          }\n          continue\n\n        case S.DOCTYPE_QUOTED:\n          parser.doctype += c\n          if (c === parser.q) {\n            parser.q = ''\n            parser.state = S.DOCTYPE\n          }\n          continue\n\n        case S.DOCTYPE_DTD:\n          parser.doctype += c\n          if (c === ']') {\n            parser.state = S.DOCTYPE\n          } else if (isQuote(c)) {\n            parser.state = S.DOCTYPE_DTD_QUOTED\n            parser.q = c\n          }\n          continue\n\n        case S.DOCTYPE_DTD_QUOTED:\n          parser.doctype += c\n          if (c === parser.q) {\n            parser.state = S.DOCTYPE_DTD\n            parser.q = ''\n          }\n          continue\n\n        case S.COMMENT:\n          if (c === '-') {\n            parser.state = S.COMMENT_ENDING\n          } else {\n            parser.comment += c\n          }\n          continue\n\n        case S.COMMENT_ENDING:\n          if (c === '-') {\n            parser.state = S.COMMENT_ENDED\n            parser.comment = textopts(parser.opt, parser.comment)\n            if (parser.comment) {\n              emitNode(parser, 'oncomment', parser.comment)\n            }\n            parser.comment = ''\n          } else {\n            parser.comment += '-' + c\n            parser.state = S.COMMENT\n          }\n          continue\n\n        case S.COMMENT_ENDED:\n          if (c !== '>') {\n            strictFail(parser, 'Malformed comment')\n            // allow <!-- blah -- bloo --> in non-strict mode,\n            // which is a comment of \" blah -- bloo \"\n            parser.comment += '--' + c\n            parser.state = S.COMMENT\n          } else {\n            parser.state = S.TEXT\n          }\n          continue\n\n        case S.CDATA:\n          if (c === ']') {\n            parser.state = S.CDATA_ENDING\n          } else {\n            parser.cdata += c\n          }\n          continue\n\n        case S.CDATA_ENDING:\n          if (c === ']') {\n            parser.state = S.CDATA_ENDING_2\n          } else {\n            parser.cdata += ']' + c\n            parser.state = S.CDATA\n          }\n          continue\n\n        case S.CDATA_ENDING_2:\n          if (c === '>') {\n            if (parser.cdata) {\n              emitNode(parser, 'oncdata', parser.cdata)\n            }\n            emitNode(parser, 'onclosecdata')\n            parser.cdata = ''\n            parser.state = S.TEXT\n          } else if (c === ']') {\n            parser.cdata += ']'\n          } else {\n            parser.cdata += ']]' + c\n            parser.state = S.CDATA\n          }\n          continue\n\n        case S.PROC_INST:\n          if (c === '?') {\n            parser.state = S.PROC_INST_ENDING\n          } else if (isWhitespace(c)) {\n            parser.state = S.PROC_INST_BODY\n          } else {\n            parser.procInstName += c\n          }\n          continue\n\n        case S.PROC_INST_BODY:\n          if (!parser.procInstBody && isWhitespace(c)) {\n            continue\n          } else if (c === '?') {\n            parser.state = S.PROC_INST_ENDING\n          } else {\n            parser.procInstBody += c\n          }\n          continue\n\n        case S.PROC_INST_ENDING:\n          if (c === '>') {\n            emitNode(parser, 'onprocessinginstruction', {\n              name: parser.procInstName,\n              body: parser.procInstBody\n            })\n            parser.procInstName = parser.procInstBody = ''\n            parser.state = S.TEXT\n          } else {\n            parser.procInstBody += '?' + c\n            parser.state = S.PROC_INST_BODY\n          }\n          continue\n\n        case S.OPEN_TAG:\n          if (isMatch(nameBody, c)) {\n            parser.tagName += c\n          } else {\n            newTag(parser)\n            if (c === '>') {\n              openTag(parser)\n            } else if (c === '/') {\n              parser.state = S.OPEN_TAG_SLASH\n            } else {\n              if (!isWhitespace(c)) {\n                strictFail(parser, 'Invalid character in tag name')\n              }\n              parser.state = S.ATTRIB\n            }\n          }\n          continue\n\n        case S.OPEN_TAG_SLASH:\n          if (c === '>') {\n            openTag(parser, true)\n            closeTag(parser)\n          } else {\n            strictFail(parser, 'Forward-slash in opening tag not followed by >')\n            parser.state = S.ATTRIB\n          }\n          continue\n\n        case S.ATTRIB:\n          // haven't read the attribute name yet.\n          if (isWhitespace(c)) {\n            continue\n          } else if (c === '>') {\n            openTag(parser)\n          } else if (c === '/') {\n            parser.state = S.OPEN_TAG_SLASH\n          } else if (isMatch(nameStart, c)) {\n            parser.attribName = c\n            parser.attribValue = ''\n            parser.state = S.ATTRIB_NAME\n          } else {\n            strictFail(parser, 'Invalid attribute name')\n          }\n          continue\n\n        case S.ATTRIB_NAME:\n          if (c === '=') {\n            parser.state = S.ATTRIB_VALUE\n          } else if (c === '>') {\n            strictFail(parser, 'Attribute without value')\n            parser.attribValue = parser.attribName\n            attrib(parser)\n            openTag(parser)\n          } else if (isWhitespace(c)) {\n            parser.state = S.ATTRIB_NAME_SAW_WHITE\n          } else if (isMatch(nameBody, c)) {\n            parser.attribName += c\n          } else {\n            strictFail(parser, 'Invalid attribute name')\n          }\n          continue\n\n        case S.ATTRIB_NAME_SAW_WHITE:\n          if (c === '=') {\n            parser.state = S.ATTRIB_VALUE\n          } else if (isWhitespace(c)) {\n            continue\n          } else {\n            strictFail(parser, 'Attribute without value')\n            parser.tag.attributes[parser.attribName] = ''\n            parser.attribValue = ''\n            emitNode(parser, 'onattribute', {\n              name: parser.attribName,\n              value: ''\n            })\n            parser.attribName = ''\n            if (c === '>') {\n              openTag(parser)\n            } else if (isMatch(nameStart, c)) {\n              parser.attribName = c\n              parser.state = S.ATTRIB_NAME\n            } else {\n              strictFail(parser, 'Invalid attribute name')\n              parser.state = S.ATTRIB\n            }\n          }\n          continue\n\n        case S.ATTRIB_VALUE:\n          if (isWhitespace(c)) {\n            continue\n          } else if (isQuote(c)) {\n            parser.q = c\n            parser.state = S.ATTRIB_VALUE_QUOTED\n          } else {\n            strictFail(parser, 'Unquoted attribute value')\n            parser.state = S.ATTRIB_VALUE_UNQUOTED\n            parser.attribValue = c\n          }\n          continue\n\n        case S.ATTRIB_VALUE_QUOTED:\n          if (c !== parser.q) {\n            if (c === '&') {\n              parser.state = S.ATTRIB_VALUE_ENTITY_Q\n            } else {\n              parser.attribValue += c\n            }\n            continue\n          }\n          attrib(parser)\n          parser.q = ''\n          parser.state = S.ATTRIB_VALUE_CLOSED\n          continue\n\n        case S.ATTRIB_VALUE_CLOSED:\n          if (isWhitespace(c)) {\n            parser.state = S.ATTRIB\n          } else if (c === '>') {\n            openTag(parser)\n          } else if (c === '/') {\n            parser.state = S.OPEN_TAG_SLASH\n          } else if (isMatch(nameStart, c)) {\n            strictFail(parser, 'No whitespace between attributes')\n            parser.attribName = c\n            parser.attribValue = ''\n            parser.state = S.ATTRIB_NAME\n          } else {\n            strictFail(parser, 'Invalid attribute name')\n          }\n          continue\n\n        case S.ATTRIB_VALUE_UNQUOTED:\n          if (!isAttribEnd(c)) {\n            if (c === '&') {\n              parser.state = S.ATTRIB_VALUE_ENTITY_U\n            } else {\n              parser.attribValue += c\n            }\n            continue\n          }\n          attrib(parser)\n          if (c === '>') {\n            openTag(parser)\n          } else {\n            parser.state = S.ATTRIB\n          }\n          continue\n\n        case S.CLOSE_TAG:\n          if (!parser.tagName) {\n            if (isWhitespace(c)) {\n              continue\n            } else if (notMatch(nameStart, c)) {\n              if (parser.script) {\n                parser.script += '</' + c\n                parser.state = S.SCRIPT\n              } else {\n                strictFail(parser, 'Invalid tagname in closing tag.')\n              }\n            } else {\n              parser.tagName = c\n            }\n          } else if (c === '>') {\n            closeTag(parser)\n          } else if (isMatch(nameBody, c)) {\n            parser.tagName += c\n          } else if (parser.script) {\n            parser.script += '</' + parser.tagName\n            parser.tagName = ''\n            parser.state = S.SCRIPT\n          } else {\n            if (!isWhitespace(c)) {\n              strictFail(parser, 'Invalid tagname in closing tag')\n            }\n            parser.state = S.CLOSE_TAG_SAW_WHITE\n          }\n          continue\n\n        case S.CLOSE_TAG_SAW_WHITE:\n          if (isWhitespace(c)) {\n            continue\n          }\n          if (c === '>') {\n            closeTag(parser)\n          } else {\n            strictFail(parser, 'Invalid characters in closing tag')\n          }\n          continue\n\n        case S.TEXT_ENTITY:\n        case S.ATTRIB_VALUE_ENTITY_Q:\n        case S.ATTRIB_VALUE_ENTITY_U:\n          var returnState\n          var buffer\n          switch (parser.state) {\n            case S.TEXT_ENTITY:\n              returnState = S.TEXT\n              buffer = 'textNode'\n              break\n\n            case S.ATTRIB_VALUE_ENTITY_Q:\n              returnState = S.ATTRIB_VALUE_QUOTED\n              buffer = 'attribValue'\n              break\n\n            case S.ATTRIB_VALUE_ENTITY_U:\n              returnState = S.ATTRIB_VALUE_UNQUOTED\n              buffer = 'attribValue'\n              break\n          }\n\n          if (c === ';') {\n            parser[buffer] += parseEntity(parser)\n            parser.entity = ''\n            parser.state = returnState\n          } else if (isMatch(parser.entity.length ? entityBody : entityStart, c)) {\n            parser.entity += c\n          } else {\n            strictFail(parser, 'Invalid character in entity name')\n            parser[buffer] += '&' + parser.entity + c\n            parser.entity = ''\n            parser.state = returnState\n          }\n\n          continue\n\n        default:\n          throw new Error(parser, 'Unknown state: ' + parser.state)\n      }\n    } // while\n\n    if (parser.position >= parser.bufferCheckPosition) {\n      checkBufferLength(parser)\n    }\n    return parser\n  }\n\n  /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */\n  /* istanbul ignore next */\n  if (!String.fromCodePoint) {\n    (function () {\n      var stringFromCharCode = String.fromCharCode\n      var floor = Math.floor\n      var fromCodePoint = function () {\n        var MAX_SIZE = 0x4000\n        var codeUnits = []\n        var highSurrogate\n        var lowSurrogate\n        var index = -1\n        var length = arguments.length\n        if (!length) {\n          return ''\n        }\n        var result = ''\n        while (++index < length) {\n          var codePoint = Number(arguments[index])\n          if (\n            !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`\n            codePoint < 0 || // not a valid Unicode code point\n            codePoint > 0x10FFFF || // not a valid Unicode code point\n            floor(codePoint) !== codePoint // not an integer\n          ) {\n            throw RangeError('Invalid code point: ' + codePoint)\n          }\n          if (codePoint <= 0xFFFF) { // BMP code point\n            codeUnits.push(codePoint)\n          } else { // Astral code point; split in surrogate halves\n            // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n            codePoint -= 0x10000\n            highSurrogate = (codePoint >> 10) + 0xD800\n            lowSurrogate = (codePoint % 0x400) + 0xDC00\n            codeUnits.push(highSurrogate, lowSurrogate)\n          }\n          if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n            result += stringFromCharCode.apply(null, codeUnits)\n            codeUnits.length = 0\n          }\n        }\n        return result\n      }\n      /* istanbul ignore next */\n      if (Object.defineProperty) {\n        Object.defineProperty(String, 'fromCodePoint', {\n          value: fromCodePoint,\n          configurable: true,\n          writable: true\n        })\n      } else {\n        String.fromCodePoint = fromCodePoint\n      }\n    }())\n  }\n})(typeof exports === 'undefined' ? this.sax = {} : exports)\n\n}).call(this)}).call(this,require(\"buffer\").Buffer)\n\n},{\"buffer\":3,\"stream\":11,\"string_decoder\":27}],11:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// 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 permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nmodule.exports = Stream;\n\nvar EE = require('events').EventEmitter;\nvar inherits = require('inherits');\n\ninherits(Stream, EE);\nStream.Readable = require('readable-stream/lib/_stream_readable.js');\nStream.Writable = require('readable-stream/lib/_stream_writable.js');\nStream.Duplex = require('readable-stream/lib/_stream_duplex.js');\nStream.Transform = require('readable-stream/lib/_stream_transform.js');\nStream.PassThrough = require('readable-stream/lib/_stream_passthrough.js');\nStream.finished = require('readable-stream/lib/internal/streams/end-of-stream.js')\nStream.pipeline = require('readable-stream/lib/internal/streams/pipeline.js')\n\n// Backwards-compat with node 0.4.x\nStream.Stream = Stream;\n\n\n\n// old-style streams.  Note that the pipe method (the only relevant\n// part of this class) is overridden in the Readable class.\n\nfunction Stream() {\n  EE.call(this);\n}\n\nStream.prototype.pipe = function(dest, options) {\n  var source = this;\n\n  function ondata(chunk) {\n    if (dest.writable) {\n      if (false === dest.write(chunk) && source.pause) {\n        source.pause();\n      }\n    }\n  }\n\n  source.on('data', ondata);\n\n  function ondrain() {\n    if (source.readable && source.resume) {\n      source.resume();\n    }\n  }\n\n  dest.on('drain', ondrain);\n\n  // If the 'end' option is not supplied, dest.end() will be called when\n  // source gets the 'end' or 'close' events.  Only dest.end() once.\n  if (!dest._isStdio && (!options || options.end !== false)) {\n    source.on('end', onend);\n    source.on('close', onclose);\n  }\n\n  var didOnEnd = false;\n  function onend() {\n    if (didOnEnd) return;\n    didOnEnd = true;\n\n    dest.end();\n  }\n\n\n  function onclose() {\n    if (didOnEnd) return;\n    didOnEnd = true;\n\n    if (typeof dest.destroy === 'function') dest.destroy();\n  }\n\n  // don't leave dangling pipes when there are errors.\n  function onerror(er) {\n    cleanup();\n    if (EE.listenerCount(this, 'error') === 0) {\n      throw er; // Unhandled stream error in pipe.\n    }\n  }\n\n  source.on('error', onerror);\n  dest.on('error', onerror);\n\n  // remove all the event listeners that were added.\n  function cleanup() {\n    source.removeListener('data', ondata);\n    dest.removeListener('drain', ondrain);\n\n    source.removeListener('end', onend);\n    source.removeListener('close', onclose);\n\n    source.removeListener('error', onerror);\n    dest.removeListener('error', onerror);\n\n    source.removeListener('end', cleanup);\n    source.removeListener('close', cleanup);\n\n    dest.removeListener('close', cleanup);\n  }\n\n  source.on('end', cleanup);\n  source.on('close', cleanup);\n\n  dest.on('close', cleanup);\n\n  dest.emit('pipe', source);\n\n  // Allow for unix-like usage: A.pipe(B).pipe(C)\n  return dest;\n};\n\n},{\"events\":5,\"inherits\":12,\"readable-stream/lib/_stream_duplex.js\":14,\"readable-stream/lib/_stream_passthrough.js\":15,\"readable-stream/lib/_stream_readable.js\":16,\"readable-stream/lib/_stream_transform.js\":17,\"readable-stream/lib/_stream_writable.js\":18,\"readable-stream/lib/internal/streams/end-of-stream.js\":22,\"readable-stream/lib/internal/streams/pipeline.js\":24}],12:[function(require,module,exports){\nif (typeof Object.create === 'function') {\n  // implementation from standard node.js 'util' module\n  module.exports = function inherits(ctor, superCtor) {\n    if (superCtor) {\n      ctor.super_ = superCtor\n      ctor.prototype = Object.create(superCtor.prototype, {\n        constructor: {\n          value: ctor,\n          enumerable: false,\n          writable: true,\n          configurable: true\n        }\n      })\n    }\n  };\n} else {\n  // old school shim for old browsers\n  module.exports = function inherits(ctor, superCtor) {\n    if (superCtor) {\n      ctor.super_ = superCtor\n      var TempCtor = function () {}\n      TempCtor.prototype = superCtor.prototype\n      ctor.prototype = new TempCtor()\n      ctor.prototype.constructor = ctor\n    }\n  }\n}\n\n},{}],13:[function(require,module,exports){\n'use strict';\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nvar codes = {};\n\nfunction createErrorType(code, message, Base) {\n  if (!Base) {\n    Base = Error;\n  }\n\n  function getMessage(arg1, arg2, arg3) {\n    if (typeof message === 'string') {\n      return message;\n    } else {\n      return message(arg1, arg2, arg3);\n    }\n  }\n\n  var NodeError =\n  /*#__PURE__*/\n  function (_Base) {\n    _inheritsLoose(NodeError, _Base);\n\n    function NodeError(arg1, arg2, arg3) {\n      return _Base.call(this, getMessage(arg1, arg2, arg3)) || this;\n    }\n\n    return NodeError;\n  }(Base);\n\n  NodeError.prototype.name = Base.name;\n  NodeError.prototype.code = code;\n  codes[code] = NodeError;\n} // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js\n\n\nfunction oneOf(expected, thing) {\n  if (Array.isArray(expected)) {\n    var len = expected.length;\n    expected = expected.map(function (i) {\n      return String(i);\n    });\n\n    if (len > 2) {\n      return \"one of \".concat(thing, \" \").concat(expected.slice(0, len - 1).join(', '), \", or \") + expected[len - 1];\n    } else if (len === 2) {\n      return \"one of \".concat(thing, \" \").concat(expected[0], \" or \").concat(expected[1]);\n    } else {\n      return \"of \".concat(thing, \" \").concat(expected[0]);\n    }\n  } else {\n    return \"of \".concat(thing, \" \").concat(String(expected));\n  }\n} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith\n\n\nfunction startsWith(str, search, pos) {\n  return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;\n} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith\n\n\nfunction endsWith(str, search, this_len) {\n  if (this_len === undefined || this_len > str.length) {\n    this_len = str.length;\n  }\n\n  return str.substring(this_len - search.length, this_len) === search;\n} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes\n\n\nfunction includes(str, search, start) {\n  if (typeof start !== 'number') {\n    start = 0;\n  }\n\n  if (start + search.length > str.length) {\n    return false;\n  } else {\n    return str.indexOf(search, start) !== -1;\n  }\n}\n\ncreateErrorType('ERR_INVALID_OPT_VALUE', function (name, value) {\n  return 'The value \"' + value + '\" is invalid for option \"' + name + '\"';\n}, TypeError);\ncreateErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) {\n  // determiner: 'must be' or 'must not be'\n  var determiner;\n\n  if (typeof expected === 'string' && startsWith(expected, 'not ')) {\n    determiner = 'must not be';\n    expected = expected.replace(/^not /, '');\n  } else {\n    determiner = 'must be';\n  }\n\n  var msg;\n\n  if (endsWith(name, ' argument')) {\n    // For cases like 'first argument'\n    msg = \"The \".concat(name, \" \").concat(determiner, \" \").concat(oneOf(expected, 'type'));\n  } else {\n    var type = includes(name, '.') ? 'property' : 'argument';\n    msg = \"The \\\"\".concat(name, \"\\\" \").concat(type, \" \").concat(determiner, \" \").concat(oneOf(expected, 'type'));\n  }\n\n  msg += \". Received type \".concat(typeof actual);\n  return msg;\n}, TypeError);\ncreateErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF');\ncreateErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) {\n  return 'The ' + name + ' method is not implemented';\n});\ncreateErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close');\ncreateErrorType('ERR_STREAM_DESTROYED', function (name) {\n  return 'Cannot call ' + name + ' after a stream was destroyed';\n});\ncreateErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times');\ncreateErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable');\ncreateErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end');\ncreateErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError);\ncreateErrorType('ERR_UNKNOWN_ENCODING', function (arg) {\n  return 'Unknown encoding: ' + arg;\n}, TypeError);\ncreateErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event');\nmodule.exports.codes = codes;\n\n},{}],14:[function(require,module,exports){\n(function (process){(function (){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// 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 permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n// a duplex stream is just a stream that is both readable and writable.\n// Since JS doesn't have multiple prototypal inheritance, this class\n// prototypally inherits from Readable, and then parasitically from\n// Writable.\n'use strict';\n/*<replacement>*/\n\nvar objectKeys = Object.keys || function (obj) {\n  var keys = [];\n\n  for (var key in obj) {\n    keys.push(key);\n  }\n\n  return keys;\n};\n/*</replacement>*/\n\n\nmodule.exports = Duplex;\n\nvar Readable = require('./_stream_readable');\n\nvar Writable = require('./_stream_writable');\n\nrequire('inherits')(Duplex, Readable);\n\n{\n  // Allow the keys array to be GC'ed.\n  var keys = objectKeys(Writable.prototype);\n\n  for (var v = 0; v < keys.length; v++) {\n    var method = keys[v];\n    if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];\n  }\n}\n\nfunction Duplex(options) {\n  if (!(this instanceof Duplex)) return new Duplex(options);\n  Readable.call(this, options);\n  Writable.call(this, options);\n  this.allowHalfOpen = true;\n\n  if (options) {\n    if (options.readable === false) this.readable = false;\n    if (options.writable === false) this.writable = false;\n\n    if (options.allowHalfOpen === false) {\n      this.allowHalfOpen = false;\n      this.once('end', onend);\n    }\n  }\n}\n\nObject.defineProperty(Duplex.prototype, 'writableHighWaterMark', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function get() {\n    return this._writableState.highWaterMark;\n  }\n});\nObject.defineProperty(Duplex.prototype, 'writableBuffer', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function get() {\n    return this._writableState && this._writableState.getBuffer();\n  }\n});\nObject.defineProperty(Duplex.prototype, 'writableLength', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function get() {\n    return this._writableState.length;\n  }\n}); // the no-half-open enforcer\n\nfunction onend() {\n  // If the writable side ended, then we're ok.\n  if (this._writableState.ended) return; // no more data can be written.\n  // But allow more writes to happen in this tick.\n\n  process.nextTick(onEndNT, this);\n}\n\nfunction onEndNT(self) {\n  self.end();\n}\n\nObject.defineProperty(Duplex.prototype, 'destroyed', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function get() {\n    if (this._readableState === undefined || this._writableState === undefined) {\n      return false;\n    }\n\n    return this._readableState.destroyed && this._writableState.destroyed;\n  },\n  set: function set(value) {\n    // we ignore the value if the stream\n    // has not been initialized yet\n    if (this._readableState === undefined || this._writableState === undefined) {\n      return;\n    } // backward compatibility, the user is explicitly\n    // managing destroyed\n\n\n    this._readableState.destroyed = value;\n    this._writableState.destroyed = value;\n  }\n});\n}).call(this)}).call(this,require('_process'))\n\n},{\"./_stream_readable\":16,\"./_stream_writable\":18,\"_process\":8,\"inherits\":12}],15:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// 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 permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n// a passthrough stream.\n// basically just the most minimal sort of Transform stream.\n// Every written chunk gets output as-is.\n'use strict';\n\nmodule.exports = PassThrough;\n\nvar Transform = require('./_stream_transform');\n\nrequire('inherits')(PassThrough, Transform);\n\nfunction PassThrough(options) {\n  if (!(this instanceof PassThrough)) return new PassThrough(options);\n  Transform.call(this, options);\n}\n\nPassThrough.prototype._transform = function (chunk, encoding, cb) {\n  cb(null, chunk);\n};\n},{\"./_stream_transform\":17,\"inherits\":12}],16:[function(require,module,exports){\n(function (process,global){(function (){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// 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 permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n'use strict';\n\nmodule.exports = Readable;\n/*<replacement>*/\n\nvar Duplex;\n/*</replacement>*/\n\nReadable.ReadableState = ReadableState;\n/*<replacement>*/\n\nvar EE = require('events').EventEmitter;\n\nvar EElistenerCount = function EElistenerCount(emitter, type) {\n  return emitter.listeners(type).length;\n};\n/*</replacement>*/\n\n/*<replacement>*/\n\n\nvar Stream = require('./internal/streams/stream');\n/*</replacement>*/\n\n\nvar Buffer = require('buffer').Buffer;\n\nvar OurUint8Array = global.Uint8Array || function () {};\n\nfunction _uint8ArrayToBuffer(chunk) {\n  return Buffer.from(chunk);\n}\n\nfunction _isUint8Array(obj) {\n  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n/*<replacement>*/\n\n\nvar debugUtil = require('util');\n\nvar debug;\n\nif (debugUtil && debugUtil.debuglog) {\n  debug = debugUtil.debuglog('stream');\n} else {\n  debug = function debug() {};\n}\n/*</replacement>*/\n\n\nvar BufferList = require('./internal/streams/buffer_list');\n\nvar destroyImpl = require('./internal/streams/destroy');\n\nvar _require = require('./internal/streams/state'),\n    getHighWaterMark = _require.getHighWaterMark;\n\nvar _require$codes = require('../errors').codes,\n    ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,\n    ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF,\n    ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,\n    ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance.\n\n\nvar StringDecoder;\nvar createReadableStreamAsyncIterator;\nvar from;\n\nrequire('inherits')(Readable, Stream);\n\nvar errorOrDestroy = destroyImpl.errorOrDestroy;\nvar kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];\n\nfunction prependListener(emitter, event, fn) {\n  // Sadly this is not cacheable as some libraries bundle their own\n  // event emitter implementation with them.\n  if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); // This is a hack to make sure that our error handler is attached before any\n  // userland ones.  NEVER DO THIS. This is here only because this code needs\n  // to continue to work with older versions of Node.js that do not include\n  // the prependListener() method. The goal is to eventually remove this hack.\n\n  if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];\n}\n\nfunction ReadableState(options, stream, isDuplex) {\n  Duplex = Duplex || require('./_stream_duplex');\n  options = options || {}; // Duplex streams are both readable and writable, but share\n  // the same options object.\n  // However, some cases require setting options to different\n  // values for the readable and the writable sides of the duplex stream.\n  // These options can be provided separately as readableXXX and writableXXX.\n\n  if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag. Used to make read(n) ignore n and to\n  // make all the buffer merging and length checks go away\n\n  this.objectMode = !!options.objectMode;\n  if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer\n  // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n\n  this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); // A linked list is used to store data chunks instead of an array because the\n  // linked list can remove elements from the beginning faster than\n  // array.shift()\n\n  this.buffer = new BufferList();\n  this.length = 0;\n  this.pipes = null;\n  this.pipesCount = 0;\n  this.flowing = null;\n  this.ended = false;\n  this.endEmitted = false;\n  this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted\n  // immediately, or on a later tick.  We set this to true at first, because\n  // any actions that shouldn't happen until \"later\" should generally also\n  // not happen before the first read call.\n\n  this.sync = true; // whenever we return null, then we set a flag to say\n  // that we're awaiting a 'readable' event emission.\n\n  this.needReadable = false;\n  this.emittedReadable = false;\n  this.readableListening = false;\n  this.resumeScheduled = false;\n  this.paused = true; // Should close be emitted on destroy. Defaults to true.\n\n  this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish')\n\n  this.autoDestroy = !!options.autoDestroy; // has it been destroyed\n\n  this.destroyed = false; // Crypto is kind of old and crusty.  Historically, its default string\n  // encoding is 'binary' so we have to make this configurable.\n  // Everything else in the universe uses 'utf8', though.\n\n  this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s\n\n  this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled\n\n  this.readingMore = false;\n  this.decoder = null;\n  this.encoding = null;\n\n  if (options.encoding) {\n    if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;\n    this.decoder = new StringDecoder(options.encoding);\n    this.encoding = options.encoding;\n  }\n}\n\nfunction Readable(options) {\n  Duplex = Duplex || require('./_stream_duplex');\n  if (!(this instanceof Readable)) return new Readable(options); // Checking for a Stream.Duplex instance is faster here instead of inside\n  // the ReadableState constructor, at least with V8 6.5\n\n  var isDuplex = this instanceof Duplex;\n  this._readableState = new ReadableState(options, this, isDuplex); // legacy\n\n  this.readable = true;\n\n  if (options) {\n    if (typeof options.read === 'function') this._read = options.read;\n    if (typeof options.destroy === 'function') this._destroy = options.destroy;\n  }\n\n  Stream.call(this);\n}\n\nObject.defineProperty(Readable.prototype, 'destroyed', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function get() {\n    if (this._readableState === undefined) {\n      return false;\n    }\n\n    return this._readableState.destroyed;\n  },\n  set: function set(value) {\n    // we ignore the value if the stream\n    // has not been initialized yet\n    if (!this._readableState) {\n      return;\n    } // backward compatibility, the user is explicitly\n    // managing destroyed\n\n\n    this._readableState.destroyed = value;\n  }\n});\nReadable.prototype.destroy = destroyImpl.destroy;\nReadable.prototype._undestroy = destroyImpl.undestroy;\n\nReadable.prototype._destroy = function (err, cb) {\n  cb(err);\n}; // Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\n\n\nReadable.prototype.push = function (chunk, encoding) {\n  var state = this._readableState;\n  var skipChunkCheck;\n\n  if (!state.objectMode) {\n    if (typeof chunk === 'string') {\n      encoding = encoding || state.defaultEncoding;\n\n      if (encoding !== state.encoding) {\n        chunk = Buffer.from(chunk, encoding);\n        encoding = '';\n      }\n\n      skipChunkCheck = true;\n    }\n  } else {\n    skipChunkCheck = true;\n  }\n\n  return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);\n}; // Unshift should *always* be something directly out of read()\n\n\nReadable.prototype.unshift = function (chunk) {\n  return readableAddChunk(this, chunk, null, true, false);\n};\n\nfunction readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {\n  debug('readableAddChunk', chunk);\n  var state = stream._readableState;\n\n  if (chunk === null) {\n    state.reading = false;\n    onEofChunk(stream, state);\n  } else {\n    var er;\n    if (!skipChunkCheck) er = chunkInvalid(state, chunk);\n\n    if (er) {\n      errorOrDestroy(stream, er);\n    } else if (state.objectMode || chunk && chunk.length > 0) {\n      if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {\n        chunk = _uint8ArrayToBuffer(chunk);\n      }\n\n      if (addToFront) {\n        if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true);\n      } else if (state.ended) {\n        errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF());\n      } else if (state.destroyed) {\n        return false;\n      } else {\n        state.reading = false;\n\n        if (state.decoder && !encoding) {\n          chunk = state.decoder.write(chunk);\n          if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);\n        } else {\n          addChunk(stream, state, chunk, false);\n        }\n      }\n    } else if (!addToFront) {\n      state.reading = false;\n      maybeReadMore(stream, state);\n    }\n  } // We can push more data if we are below the highWaterMark.\n  // Also, if we have no data yet, we can stand some more bytes.\n  // This is to work around cases where hwm=0, such as the repl.\n\n\n  return !state.ended && (state.length < state.highWaterMark || state.length === 0);\n}\n\nfunction addChunk(stream, state, chunk, addToFront) {\n  if (state.flowing && state.length === 0 && !state.sync) {\n    state.awaitDrain = 0;\n    stream.emit('data', chunk);\n  } else {\n    // update the buffer info.\n    state.length += state.objectMode ? 1 : chunk.length;\n    if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);\n    if (state.needReadable) emitReadable(stream);\n  }\n\n  maybeReadMore(stream, state);\n}\n\nfunction chunkInvalid(state, chunk) {\n  var er;\n\n  if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n    er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk);\n  }\n\n  return er;\n}\n\nReadable.prototype.isPaused = function () {\n  return this._readableState.flowing === false;\n}; // backwards compatibility.\n\n\nReadable.prototype.setEncoding = function (enc) {\n  if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;\n  var decoder = new StringDecoder(enc);\n  this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8\n\n  this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers:\n\n  var p = this._readableState.buffer.head;\n  var content = '';\n\n  while (p !== null) {\n    content += decoder.write(p.data);\n    p = p.next;\n  }\n\n  this._readableState.buffer.clear();\n\n  if (content !== '') this._readableState.buffer.push(content);\n  this._readableState.length = content.length;\n  return this;\n}; // Don't raise the hwm > 1GB\n\n\nvar MAX_HWM = 0x40000000;\n\nfunction computeNewHighWaterMark(n) {\n  if (n >= MAX_HWM) {\n    // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE.\n    n = MAX_HWM;\n  } else {\n    // Get the next highest power of 2 to prevent increasing hwm excessively in\n    // tiny amounts\n    n--;\n    n |= n >>> 1;\n    n |= n >>> 2;\n    n |= n >>> 4;\n    n |= n >>> 8;\n    n |= n >>> 16;\n    n++;\n  }\n\n  return n;\n} // This function is designed to be inlinable, so please take care when making\n// changes to the function body.\n\n\nfunction howMuchToRead(n, state) {\n  if (n <= 0 || state.length === 0 && state.ended) return 0;\n  if (state.objectMode) return 1;\n\n  if (n !== n) {\n    // Only flow one buffer at a time\n    if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;\n  } // If we're asking for more than the current hwm, then raise the hwm.\n\n\n  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);\n  if (n <= state.length) return n; // Don't have enough\n\n  if (!state.ended) {\n    state.needReadable = true;\n    return 0;\n  }\n\n  return state.length;\n} // you can override either this method, or the async _read(n) below.\n\n\nReadable.prototype.read = function (n) {\n  debug('read', n);\n  n = parseInt(n, 10);\n  var state = this._readableState;\n  var nOrig = n;\n  if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we\n  // already have a bunch of data in the buffer, then just trigger\n  // the 'readable' event and move on.\n\n  if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) {\n    debug('read: emitReadable', state.length, state.ended);\n    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);\n    return null;\n  }\n\n  n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up.\n\n  if (n === 0 && state.ended) {\n    if (state.length === 0) endReadable(this);\n    return null;\n  } // All the actual chunk generation logic needs to be\n  // *below* the call to _read.  The reason is that in certain\n  // synthetic stream cases, such as passthrough streams, _read\n  // may be a completely synchronous operation which may change\n  // the state of the read buffer, providing enough data when\n  // before there was *not* enough.\n  //\n  // So, the steps are:\n  // 1. Figure out what the state of things will be after we do\n  // a read from the buffer.\n  //\n  // 2. If that resulting state will trigger a _read, then call _read.\n  // Note that this may be asynchronous, or synchronous.  Yes, it is\n  // deeply ugly to write APIs this way, but that still doesn't mean\n  // that the Readable class should behave improperly, as streams are\n  // designed to be sync/async agnostic.\n  // Take note if the _read call is sync or async (ie, if the read call\n  // has returned yet), so that we know whether or not it's safe to emit\n  // 'readable' etc.\n  //\n  // 3. Actually pull the requested chunks out of the buffer and return.\n  // if we need a readable event, then we need to do some reading.\n\n\n  var doRead = state.needReadable;\n  debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some\n\n  if (state.length === 0 || state.length - n < state.highWaterMark) {\n    doRead = true;\n    debug('length less than watermark', doRead);\n  } // however, if we've ended, then there's no point, and if we're already\n  // reading, then it's unnecessary.\n\n\n  if (state.ended || state.reading) {\n    doRead = false;\n    debug('reading or ended', doRead);\n  } else if (doRead) {\n    debug('do read');\n    state.reading = true;\n    state.sync = true; // if the length is currently zero, then we *need* a readable event.\n\n    if (state.length === 0) state.needReadable = true; // call internal read method\n\n    this._read(state.highWaterMark);\n\n    state.sync = false; // If _read pushed data synchronously, then `reading` will be false,\n    // and we need to re-evaluate how much data we can return to the user.\n\n    if (!state.reading) n = howMuchToRead(nOrig, state);\n  }\n\n  var ret;\n  if (n > 0) ret = fromList(n, state);else ret = null;\n\n  if (ret === null) {\n    state.needReadable = state.length <= state.highWaterMark;\n    n = 0;\n  } else {\n    state.length -= n;\n    state.awaitDrain = 0;\n  }\n\n  if (state.length === 0) {\n    // If we have nothing in the buffer, then we want to know\n    // as soon as we *do* get something into the buffer.\n    if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick.\n\n    if (nOrig !== n && state.ended) endReadable(this);\n  }\n\n  if (ret !== null) this.emit('data', ret);\n  return ret;\n};\n\nfunction onEofChunk(stream, state) {\n  debug('onEofChunk');\n  if (state.ended) return;\n\n  if (state.decoder) {\n    var chunk = state.decoder.end();\n\n    if (chunk && chunk.length) {\n      state.buffer.push(chunk);\n      state.length += state.objectMode ? 1 : chunk.length;\n    }\n  }\n\n  state.ended = true;\n\n  if (state.sync) {\n    // if we are sync, wait until next tick to emit the data.\n    // Otherwise we risk emitting data in the flow()\n    // the readable code triggers during a read() call\n    emitReadable(stream);\n  } else {\n    // emit 'readable' now to make sure it gets picked up.\n    state.needReadable = false;\n\n    if (!state.emittedReadable) {\n      state.emittedReadable = true;\n      emitReadable_(stream);\n    }\n  }\n} // Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow.  This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\n\n\nfunction emitReadable(stream) {\n  var state = stream._readableState;\n  debug('emitReadable', state.needReadable, state.emittedReadable);\n  state.needReadable = false;\n\n  if (!state.emittedReadable) {\n    debug('emitReadable', state.flowing);\n    state.emittedReadable = true;\n    process.nextTick(emitReadable_, stream);\n  }\n}\n\nfunction emitReadable_(stream) {\n  var state = stream._readableState;\n  debug('emitReadable_', state.destroyed, state.length, state.ended);\n\n  if (!state.destroyed && (state.length || state.ended)) {\n    stream.emit('readable');\n    state.emittedReadable = false;\n  } // The stream needs another readable event if\n  // 1. It is not flowing, as the flow mechanism will take\n  //    care of it.\n  // 2. It is not ended.\n  // 3. It is below the highWaterMark, so we can schedule\n  //    another readable later.\n\n\n  state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark;\n  flow(stream);\n} // at this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data.  that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\n\n\nfunction maybeReadMore(stream, state) {\n  if (!state.readingMore) {\n    state.readingMore = true;\n    process.nextTick(maybeReadMore_, stream, state);\n  }\n}\n\nfunction maybeReadMore_(stream, state) {\n  // Attempt to read more data if we should.\n  //\n  // The conditions for reading more data are (one of):\n  // - Not enough data buffered (state.length < state.highWaterMark). The loop\n  //   is responsible for filling the buffer with enough data if such data\n  //   is available. If highWaterMark is 0 and we are not in the flowing mode\n  //   we should _not_ attempt to buffer any extra data. We'll get more data\n  //   when the stream consumer calls read() instead.\n  // - No data in the buffer, and the stream is in flowing mode. In this mode\n  //   the loop below is responsible for ensuring read() is called. Failing to\n  //   call read here would abort the flow and there's no other mechanism for\n  //   continuing the flow if the stream consumer has just subscribed to the\n  //   'data' event.\n  //\n  // In addition to the above conditions to keep reading data, the following\n  // conditions prevent the data from being read:\n  // - The stream has ended (state.ended).\n  // - There is already a pending 'read' operation (state.reading). This is a\n  //   case where the the stream has called the implementation defined _read()\n  //   method, but they are processing the call asynchronously and have _not_\n  //   called push() with new data. In this case we skip performing more\n  //   read()s. The execution ends in this method again after the _read() ends\n  //   up calling push() with more data.\n  while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) {\n    var len = state.length;\n    debug('maybeReadMore read 0');\n    stream.read(0);\n    if (len === state.length) // didn't get any data, stop spinning.\n      break;\n  }\n\n  state.readingMore = false;\n} // abstract method.  to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\n\n\nReadable.prototype._read = function (n) {\n  errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()'));\n};\n\nReadable.prototype.pipe = function (dest, pipeOpts) {\n  var src = this;\n  var state = this._readableState;\n\n  switch (state.pipesCount) {\n    case 0:\n      state.pipes = dest;\n      break;\n\n    case 1:\n      state.pipes = [state.pipes, dest];\n      break;\n\n    default:\n      state.pipes.push(dest);\n      break;\n  }\n\n  state.pipesCount += 1;\n  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);\n  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;\n  var endFn = doEnd ? onend : unpipe;\n  if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn);\n  dest.on('unpipe', onunpipe);\n\n  function onunpipe(readable, unpipeInfo) {\n    debug('onunpipe');\n\n    if (readable === src) {\n      if (unpipeInfo && unpipeInfo.hasUnpiped === false) {\n        unpipeInfo.hasUnpiped = true;\n        cleanup();\n      }\n    }\n  }\n\n  function onend() {\n    debug('onend');\n    dest.end();\n  } // when the dest drains, it reduces the awaitDrain counter\n  // on the source.  This would be more elegant with a .once()\n  // handler in flow(), but adding and removing repeatedly is\n  // too slow.\n\n\n  var ondrain = pipeOnDrain(src);\n  dest.on('drain', ondrain);\n  var cleanedUp = false;\n\n  function cleanup() {\n    debug('cleanup'); // cleanup event handlers once the pipe is broken\n\n    dest.removeListener('close', onclose);\n    dest.removeListener('finish', onfinish);\n    dest.removeListener('drain', ondrain);\n    dest.removeListener('error', onerror);\n    dest.removeListener('unpipe', onunpipe);\n    src.removeListener('end', onend);\n    src.removeListener('end', unpipe);\n    src.removeListener('data', ondata);\n    cleanedUp = true; // if the reader is waiting for a drain event from this\n    // specific writer, then it would cause it to never start\n    // flowing again.\n    // So, if this is awaiting a drain, then we just call it now.\n    // If we don't know, then assume that we are waiting for one.\n\n    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();\n  }\n\n  src.on('data', ondata);\n\n  function ondata(chunk) {\n    debug('ondata');\n    var ret = dest.write(chunk);\n    debug('dest.write', ret);\n\n    if (ret === false) {\n      // If the user unpiped during `dest.write()`, it is possible\n      // to get stuck in a permanently paused state if that write\n      // also returned false.\n      // => Check whether `dest` is still a piping destination.\n      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {\n        debug('false write response, pause', state.awaitDrain);\n        state.awaitDrain++;\n      }\n\n      src.pause();\n    }\n  } // if the dest has an error, then stop piping into it.\n  // however, don't suppress the throwing behavior for this.\n\n\n  function onerror(er) {\n    debug('onerror', er);\n    unpipe();\n    dest.removeListener('error', onerror);\n    if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er);\n  } // Make sure our error handler is attached before userland ones.\n\n\n  prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once.\n\n  function onclose() {\n    dest.removeListener('finish', onfinish);\n    unpipe();\n  }\n\n  dest.once('close', onclose);\n\n  function onfinish() {\n    debug('onfinish');\n    dest.removeListener('close', onclose);\n    unpipe();\n  }\n\n  dest.once('finish', onfinish);\n\n  function unpipe() {\n    debug('unpipe');\n    src.unpipe(dest);\n  } // tell the dest that it's being piped to\n\n\n  dest.emit('pipe', src); // start the flow if it hasn't been started already.\n\n  if (!state.flowing) {\n    debug('pipe resume');\n    src.resume();\n  }\n\n  return dest;\n};\n\nfunction pipeOnDrain(src) {\n  return function pipeOnDrainFunctionResult() {\n    var state = src._readableState;\n    debug('pipeOnDrain', state.awaitDrain);\n    if (state.awaitDrain) state.awaitDrain--;\n\n    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {\n      state.flowing = true;\n      flow(src);\n    }\n  };\n}\n\nReadable.prototype.unpipe = function (dest) {\n  var state = this._readableState;\n  var unpipeInfo = {\n    hasUnpiped: false\n  }; // if we're not piping anywhere, then do nothing.\n\n  if (state.pipesCount === 0) return this; // just one destination.  most common case.\n\n  if (state.pipesCount === 1) {\n    // passed in one, but it's not the right one.\n    if (dest && dest !== state.pipes) return this;\n    if (!dest) dest = state.pipes; // got a match.\n\n    state.pipes = null;\n    state.pipesCount = 0;\n    state.flowing = false;\n    if (dest) dest.emit('unpipe', this, unpipeInfo);\n    return this;\n  } // slow case. multiple pipe destinations.\n\n\n  if (!dest) {\n    // remove all.\n    var dests = state.pipes;\n    var len = state.pipesCount;\n    state.pipes = null;\n    state.pipesCount = 0;\n    state.flowing = false;\n\n    for (var i = 0; i < len; i++) {\n      dests[i].emit('unpipe', this, {\n        hasUnpiped: false\n      });\n    }\n\n    return this;\n  } // try to find the right one.\n\n\n  var index = indexOf(state.pipes, dest);\n  if (index === -1) return this;\n  state.pipes.splice(index, 1);\n  state.pipesCount -= 1;\n  if (state.pipesCount === 1) state.pipes = state.pipes[0];\n  dest.emit('unpipe', this, unpipeInfo);\n  return this;\n}; // set up data events if they are asked for\n// Ensure readable listeners eventually get something\n\n\nReadable.prototype.on = function (ev, fn) {\n  var res = Stream.prototype.on.call(this, ev, fn);\n  var state = this._readableState;\n\n  if (ev === 'data') {\n    // update readableListening so that resume() may be a no-op\n    // a few lines down. This is needed to support once('readable').\n    state.readableListening = this.listenerCount('readable') > 0; // Try start flowing on next tick if stream isn't explicitly paused\n\n    if (state.flowing !== false) this.resume();\n  } else if (ev === 'readable') {\n    if (!state.endEmitted && !state.readableListening) {\n      state.readableListening = state.needReadable = true;\n      state.flowing = false;\n      state.emittedReadable = false;\n      debug('on readable', state.length, state.reading);\n\n      if (state.length) {\n        emitReadable(this);\n      } else if (!state.reading) {\n        process.nextTick(nReadingNextTick, this);\n      }\n    }\n  }\n\n  return res;\n};\n\nReadable.prototype.addListener = Readable.prototype.on;\n\nReadable.prototype.removeListener = function (ev, fn) {\n  var res = Stream.prototype.removeListener.call(this, ev, fn);\n\n  if (ev === 'readable') {\n    // We need to check if there is someone still listening to\n    // readable and reset the state. However this needs to happen\n    // after readable has been emitted but before I/O (nextTick) to\n    // support once('readable', fn) cycles. This means that calling\n    // resume within the same tick will have no\n    // effect.\n    process.nextTick(updateReadableListening, this);\n  }\n\n  return res;\n};\n\nReadable.prototype.removeAllListeners = function (ev) {\n  var res = Stream.prototype.removeAllListeners.apply(this, arguments);\n\n  if (ev === 'readable' || ev === undefined) {\n    // We need to check if there is someone still listening to\n    // readable and reset the state. However this needs to happen\n    // after readable has been emitted but before I/O (nextTick) to\n    // support once('readable', fn) cycles. This means that calling\n    // resume within the same tick will have no\n    // effect.\n    process.nextTick(updateReadableListening, this);\n  }\n\n  return res;\n};\n\nfunction updateReadableListening(self) {\n  var state = self._readableState;\n  state.readableListening = self.listenerCount('readable') > 0;\n\n  if (state.resumeScheduled && !state.paused) {\n    // flowing needs to be set to true now, otherwise\n    // the upcoming resume will not flow.\n    state.flowing = true; // crude way to check if we should resume\n  } else if (self.listenerCount('data') > 0) {\n    self.resume();\n  }\n}\n\nfunction nReadingNextTick(self) {\n  debug('readable nexttick read 0');\n  self.read(0);\n} // pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\n\n\nReadable.prototype.resume = function () {\n  var state = this._readableState;\n\n  if (!state.flowing) {\n    debug('resume'); // we flow only if there is no one listening\n    // for readable, but we still have to call\n    // resume()\n\n    state.flowing = !state.readableListening;\n    resume(this, state);\n  }\n\n  state.paused = false;\n  return this;\n};\n\nfunction resume(stream, state) {\n  if (!state.resumeScheduled) {\n    state.resumeScheduled = true;\n    process.nextTick(resume_, stream, state);\n  }\n}\n\nfunction resume_(stream, state) {\n  debug('resume', state.reading);\n\n  if (!state.reading) {\n    stream.read(0);\n  }\n\n  state.resumeScheduled = false;\n  stream.emit('resume');\n  flow(stream);\n  if (state.flowing && !state.reading) stream.read(0);\n}\n\nReadable.prototype.pause = function () {\n  debug('call pause flowing=%j', this._readableState.flowing);\n\n  if (this._readableState.flowing !== false) {\n    debug('pause');\n    this._readableState.flowing = false;\n    this.emit('pause');\n  }\n\n  this._readableState.paused = true;\n  return this;\n};\n\nfunction flow(stream) {\n  var state = stream._readableState;\n  debug('flow', state.flowing);\n\n  while (state.flowing && stream.read() !== null) {\n    ;\n  }\n} // wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\n\n\nReadable.prototype.wrap = function (stream) {\n  var _this = this;\n\n  var state = this._readableState;\n  var paused = false;\n  stream.on('end', function () {\n    debug('wrapped end');\n\n    if (state.decoder && !state.ended) {\n      var chunk = state.decoder.end();\n      if (chunk && chunk.length) _this.push(chunk);\n    }\n\n    _this.push(null);\n  });\n  stream.on('data', function (chunk) {\n    debug('wrapped data');\n    if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode\n\n    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;\n\n    var ret = _this.push(chunk);\n\n    if (!ret) {\n      paused = true;\n      stream.pause();\n    }\n  }); // proxy all the other methods.\n  // important when wrapping filters and duplexes.\n\n  for (var i in stream) {\n    if (this[i] === undefined && typeof stream[i] === 'function') {\n      this[i] = function methodWrap(method) {\n        return function methodWrapReturnFunction() {\n          return stream[method].apply(stream, arguments);\n        };\n      }(i);\n    }\n  } // proxy certain important events.\n\n\n  for (var n = 0; n < kProxyEvents.length; n++) {\n    stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));\n  } // when we try to consume some more bytes, simply unpause the\n  // underlying stream.\n\n\n  this._read = function (n) {\n    debug('wrapped _read', n);\n\n    if (paused) {\n      paused = false;\n      stream.resume();\n    }\n  };\n\n  return this;\n};\n\nif (typeof Symbol === 'function') {\n  Readable.prototype[Symbol.asyncIterator] = function () {\n    if (createReadableStreamAsyncIterator === undefined) {\n      createReadableStreamAsyncIterator = require('./internal/streams/async_iterator');\n    }\n\n    return createReadableStreamAsyncIterator(this);\n  };\n}\n\nObject.defineProperty(Readable.prototype, 'readableHighWaterMark', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function get() {\n    return this._readableState.highWaterMark;\n  }\n});\nObject.defineProperty(Readable.prototype, 'readableBuffer', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function get() {\n    return this._readableState && this._readableState.buffer;\n  }\n});\nObject.defineProperty(Readable.prototype, 'readableFlowing', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function get() {\n    return this._readableState.flowing;\n  },\n  set: function set(state) {\n    if (this._readableState) {\n      this._readableState.flowing = state;\n    }\n  }\n}); // exposed for testing purposes only.\n\nReadable._fromList = fromList;\nObject.defineProperty(Readable.prototype, 'readableLength', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function get() {\n    return this._readableState.length;\n  }\n}); // Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\n\nfunction fromList(n, state) {\n  // nothing buffered\n  if (state.length === 0) return null;\n  var ret;\n  if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {\n    // read it all, truncate the list\n    if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length);\n    state.buffer.clear();\n  } else {\n    // read part of list\n    ret = state.buffer.consume(n, state.decoder);\n  }\n  return ret;\n}\n\nfunction endReadable(stream) {\n  var state = stream._readableState;\n  debug('endReadable', state.endEmitted);\n\n  if (!state.endEmitted) {\n    state.ended = true;\n    process.nextTick(endReadableNT, state, stream);\n  }\n}\n\nfunction endReadableNT(state, stream) {\n  debug('endReadableNT', state.endEmitted, state.length); // Check that we didn't get one last unshift.\n\n  if (!state.endEmitted && state.length === 0) {\n    state.endEmitted = true;\n    stream.readable = false;\n    stream.emit('end');\n\n    if (state.autoDestroy) {\n      // In case of duplex streams we need a way to detect\n      // if the writable side is ready for autoDestroy as well\n      var wState = stream._writableState;\n\n      if (!wState || wState.autoDestroy && wState.finished) {\n        stream.destroy();\n      }\n    }\n  }\n}\n\nif (typeof Symbol === 'function') {\n  Readable.from = function (iterable, opts) {\n    if (from === undefined) {\n      from = require('./internal/streams/from');\n    }\n\n    return from(Readable, iterable, opts);\n  };\n}\n\nfunction indexOf(xs, x) {\n  for (var i = 0, l = xs.length; i < l; i++) {\n    if (xs[i] === x) return i;\n  }\n\n  return -1;\n}\n}).call(this)}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"../errors\":13,\"./_stream_duplex\":14,\"./internal/streams/async_iterator\":19,\"./internal/streams/buffer_list\":20,\"./internal/streams/destroy\":21,\"./internal/streams/from\":23,\"./internal/streams/state\":25,\"./internal/streams/stream\":26,\"_process\":8,\"buffer\":3,\"events\":5,\"inherits\":12,\"string_decoder/\":27,\"util\":2}],17:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// 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 permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n// a transform stream is a readable/writable stream where you do\n// something with the data.  Sometimes it's called a \"filter\",\n// but that's not a great name for it, since that implies a thing where\n// some bits pass through, and others are simply ignored.  (That would\n// be a valid example of a transform, of course.)\n//\n// While the output is causally related to the input, it's not a\n// necessarily symmetric or synchronous transformation.  For example,\n// a zlib stream might take multiple plain-text writes(), and then\n// emit a single compressed chunk some time in the future.\n//\n// Here's how this works:\n//\n// The Transform stream has all the aspects of the readable and writable\n// stream classes.  When you write(chunk), that calls _write(chunk,cb)\n// internally, and returns false if there's a lot of pending writes\n// buffered up.  When you call read(), that calls _read(n) until\n// there's enough pending readable data buffered up.\n//\n// In a transform stream, the written data is placed in a buffer.  When\n// _read(n) is called, it transforms the queued up data, calling the\n// buffered _write cb's as it consumes chunks.  If consuming a single\n// written chunk would result in multiple output chunks, then the first\n// outputted bit calls the readcb, and subsequent chunks just go into\n// the read buffer, and will cause it to emit 'readable' if necessary.\n//\n// This way, back-pressure is actually determined by the reading side,\n// since _read has to be called to start processing a new chunk.  However,\n// a pathological inflate type of transform can cause excessive buffering\n// here.  For example, imagine a stream where every byte of input is\n// interpreted as an integer from 0-255, and then results in that many\n// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in\n// 1kb of data being output.  In this case, you could write a very small\n// amount of input, and end up with a very large amount of output.  In\n// such a pathological inflating mechanism, there'd be no way to tell\n// the system to stop doing the transform.  A single 4MB write could\n// cause the system to run out of memory.\n//\n// However, even in such a pathological case, only a single written chunk\n// would be consumed, and then the rest would wait (un-transformed) until\n// the results of the previous transformed chunk were consumed.\n'use strict';\n\nmodule.exports = Transform;\n\nvar _require$codes = require('../errors').codes,\n    ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,\n    ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,\n    ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING,\n    ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0;\n\nvar Duplex = require('./_stream_duplex');\n\nrequire('inherits')(Transform, Duplex);\n\nfunction afterTransform(er, data) {\n  var ts = this._transformState;\n  ts.transforming = false;\n  var cb = ts.writecb;\n\n  if (cb === null) {\n    return this.emit('error', new ERR_MULTIPLE_CALLBACK());\n  }\n\n  ts.writechunk = null;\n  ts.writecb = null;\n  if (data != null) // single equals check for both `null` and `undefined`\n    this.push(data);\n  cb(er);\n  var rs = this._readableState;\n  rs.reading = false;\n\n  if (rs.needReadable || rs.length < rs.highWaterMark) {\n    this._read(rs.highWaterMark);\n  }\n}\n\nfunction Transform(options) {\n  if (!(this instanceof Transform)) return new Transform(options);\n  Duplex.call(this, options);\n  this._transformState = {\n    afterTransform: afterTransform.bind(this),\n    needTransform: false,\n    transforming: false,\n    writecb: null,\n    writechunk: null,\n    writeencoding: null\n  }; // start out asking for a readable event once data is transformed.\n\n  this._readableState.needReadable = true; // we have implemented the _read method, and done the other things\n  // that Readable wants before the first _read call, so unset the\n  // sync guard flag.\n\n  this._readableState.sync = false;\n\n  if (options) {\n    if (typeof options.transform === 'function') this._transform = options.transform;\n    if (typeof options.flush === 'function') this._flush = options.flush;\n  } // When the writable side finishes, then flush out anything remaining.\n\n\n  this.on('prefinish', prefinish);\n}\n\nfunction prefinish() {\n  var _this = this;\n\n  if (typeof this._flush === 'function' && !this._readableState.destroyed) {\n    this._flush(function (er, data) {\n      done(_this, er, data);\n    });\n  } else {\n    done(this, null, null);\n  }\n}\n\nTransform.prototype.push = function (chunk, encoding) {\n  this._transformState.needTransform = false;\n  return Duplex.prototype.push.call(this, chunk, encoding);\n}; // This is the part where you do stuff!\n// override this function in implementation classes.\n// 'chunk' is an input chunk.\n//\n// Call `push(newChunk)` to pass along transformed output\n// to the readable side.  You may call 'push' zero or more times.\n//\n// Call `cb(err)` when you are done with this chunk.  If you pass\n// an error, then that'll put the hurt on the whole operation.  If you\n// never call cb(), then you'll never get another chunk.\n\n\nTransform.prototype._transform = function (chunk, encoding, cb) {\n  cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()'));\n};\n\nTransform.prototype._write = function (chunk, encoding, cb) {\n  var ts = this._transformState;\n  ts.writecb = cb;\n  ts.writechunk = chunk;\n  ts.writeencoding = encoding;\n\n  if (!ts.transforming) {\n    var rs = this._readableState;\n    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);\n  }\n}; // Doesn't matter what the args are here.\n// _transform does all the work.\n// That we got here means that the readable side wants more data.\n\n\nTransform.prototype._read = function (n) {\n  var ts = this._transformState;\n\n  if (ts.writechunk !== null && !ts.transforming) {\n    ts.transforming = true;\n\n    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);\n  } else {\n    // mark that we need a transform, so that any data that comes in\n    // will get processed, now that we've asked for it.\n    ts.needTransform = true;\n  }\n};\n\nTransform.prototype._destroy = function (err, cb) {\n  Duplex.prototype._destroy.call(this, err, function (err2) {\n    cb(err2);\n  });\n};\n\nfunction done(stream, er, data) {\n  if (er) return stream.emit('error', er);\n  if (data != null) // single equals check for both `null` and `undefined`\n    stream.push(data); // TODO(BridgeAR): Write a test for these two error cases\n  // if there's nothing in the write buffer, then that means\n  // that nothing more will ever be provided\n\n  if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0();\n  if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING();\n  return stream.push(null);\n}\n},{\"../errors\":13,\"./_stream_duplex\":14,\"inherits\":12}],18:[function(require,module,exports){\n(function (process,global){(function (){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// 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 permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n// A bit simpler than readable streams.\n// Implement an async ._write(chunk, encoding, cb), and it'll handle all\n// the drain event emission and buffering.\n'use strict';\n\nmodule.exports = Writable;\n/* <replacement> */\n\nfunction WriteReq(chunk, encoding, cb) {\n  this.chunk = chunk;\n  this.encoding = encoding;\n  this.callback = cb;\n  this.next = null;\n} // It seems a linked list but it is not\n// there will be only 2 of these for each stream\n\n\nfunction CorkedRequest(state) {\n  var _this = this;\n\n  this.next = null;\n  this.entry = null;\n\n  this.finish = function () {\n    onCorkedFinish(_this, state);\n  };\n}\n/* </replacement> */\n\n/*<replacement>*/\n\n\nvar Duplex;\n/*</replacement>*/\n\nWritable.WritableState = WritableState;\n/*<replacement>*/\n\nvar internalUtil = {\n  deprecate: require('util-deprecate')\n};\n/*</replacement>*/\n\n/*<replacement>*/\n\nvar Stream = require('./internal/streams/stream');\n/*</replacement>*/\n\n\nvar Buffer = require('buffer').Buffer;\n\nvar OurUint8Array = global.Uint8Array || function () {};\n\nfunction _uint8ArrayToBuffer(chunk) {\n  return Buffer.from(chunk);\n}\n\nfunction _isUint8Array(obj) {\n  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n\nvar destroyImpl = require('./internal/streams/destroy');\n\nvar _require = require('./internal/streams/state'),\n    getHighWaterMark = _require.getHighWaterMark;\n\nvar _require$codes = require('../errors').codes,\n    ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,\n    ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,\n    ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,\n    ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE,\n    ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED,\n    ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES,\n    ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END,\n    ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING;\n\nvar errorOrDestroy = destroyImpl.errorOrDestroy;\n\nrequire('inherits')(Writable, Stream);\n\nfunction nop() {}\n\nfunction WritableState(options, stream, isDuplex) {\n  Duplex = Duplex || require('./_stream_duplex');\n  options = options || {}; // Duplex streams are both readable and writable, but share\n  // the same options object.\n  // However, some cases require setting options to different\n  // values for the readable and the writable sides of the duplex stream,\n  // e.g. options.readableObjectMode vs. options.writableObjectMode, etc.\n\n  if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream\n  // contains buffers or objects.\n\n  this.objectMode = !!options.objectMode;\n  if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false\n  // Note: 0 is a valid value, means that we always return false if\n  // the entire buffer is not flushed immediately on write()\n\n  this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); // if _final has been called\n\n  this.finalCalled = false; // drain event flag.\n\n  this.needDrain = false; // at the start of calling end()\n\n  this.ending = false; // when end() has been called, and returned\n\n  this.ended = false; // when 'finish' is emitted\n\n  this.finished = false; // has it been destroyed\n\n  this.destroyed = false; // should we decode strings into buffers before passing to _write?\n  // this is here so that some node-core streams can optimize string\n  // handling at a lower level.\n\n  var noDecode = options.decodeStrings === false;\n  this.decodeStrings = !noDecode; // Crypto is kind of old and crusty.  Historically, its default string\n  // encoding is 'binary' so we have to make this configurable.\n  // Everything else in the universe uses 'utf8', though.\n\n  this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement\n  // of how much we're waiting to get pushed to some underlying\n  // socket or file.\n\n  this.length = 0; // a flag to see when we're in the middle of a write.\n\n  this.writing = false; // when true all writes will be buffered until .uncork() call\n\n  this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately,\n  // or on a later tick.  We set this to true at first, because any\n  // actions that shouldn't happen until \"later\" should generally also\n  // not happen before the first write call.\n\n  this.sync = true; // a flag to know if we're processing previously buffered items, which\n  // may call the _write() callback in the same tick, so that we don't\n  // end up in an overlapped onwrite situation.\n\n  this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb)\n\n  this.onwrite = function (er) {\n    onwrite(stream, er);\n  }; // the callback that the user supplies to write(chunk,encoding,cb)\n\n\n  this.writecb = null; // the amount that is being written when _write is called.\n\n  this.writelen = 0;\n  this.bufferedRequest = null;\n  this.lastBufferedRequest = null; // number of pending user-supplied write callbacks\n  // this must be 0 before 'finish' can be emitted\n\n  this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs\n  // This is relevant for synchronous Transform streams\n\n  this.prefinished = false; // True if the error was already emitted and should not be thrown again\n\n  this.errorEmitted = false; // Should close be emitted on destroy. Defaults to true.\n\n  this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end')\n\n  this.autoDestroy = !!options.autoDestroy; // count buffered requests\n\n  this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always\n  // one allocated and free to use, and we maintain at most two\n\n  this.corkedRequestsFree = new CorkedRequest(this);\n}\n\nWritableState.prototype.getBuffer = function getBuffer() {\n  var current = this.bufferedRequest;\n  var out = [];\n\n  while (current) {\n    out.push(current);\n    current = current.next;\n  }\n\n  return out;\n};\n\n(function () {\n  try {\n    Object.defineProperty(WritableState.prototype, 'buffer', {\n      get: internalUtil.deprecate(function writableStateBufferGetter() {\n        return this.getBuffer();\n      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')\n    });\n  } catch (_) {}\n})(); // Test _writableState for inheritance to account for Duplex streams,\n// whose prototype chain only points to Readable.\n\n\nvar realHasInstance;\n\nif (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {\n  realHasInstance = Function.prototype[Symbol.hasInstance];\n  Object.defineProperty(Writable, Symbol.hasInstance, {\n    value: function value(object) {\n      if (realHasInstance.call(this, object)) return true;\n      if (this !== Writable) return false;\n      return object && object._writableState instanceof WritableState;\n    }\n  });\n} else {\n  realHasInstance = function realHasInstance(object) {\n    return object instanceof this;\n  };\n}\n\nfunction Writable(options) {\n  Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, too.\n  // `realHasInstance` is necessary because using plain `instanceof`\n  // would return false, as no `_writableState` property is attached.\n  // Trying to use the custom `instanceof` for Writable here will also break the\n  // Node.js LazyTransform implementation, which has a non-trivial getter for\n  // `_writableState` that would lead to infinite recursion.\n  // Checking for a Stream.Duplex instance is faster here instead of inside\n  // the WritableState constructor, at least with V8 6.5\n\n  var isDuplex = this instanceof Duplex;\n  if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options);\n  this._writableState = new WritableState(options, this, isDuplex); // legacy.\n\n  this.writable = true;\n\n  if (options) {\n    if (typeof options.write === 'function') this._write = options.write;\n    if (typeof options.writev === 'function') this._writev = options.writev;\n    if (typeof options.destroy === 'function') this._destroy = options.destroy;\n    if (typeof options.final === 'function') this._final = options.final;\n  }\n\n  Stream.call(this);\n} // Otherwise people can pipe Writable streams, which is just wrong.\n\n\nWritable.prototype.pipe = function () {\n  errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE());\n};\n\nfunction writeAfterEnd(stream, cb) {\n  var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb\n\n  errorOrDestroy(stream, er);\n  process.nextTick(cb, er);\n} // Checks that a user-supplied chunk is valid, especially for the particular\n// mode the stream is in. Currently this means that `null` is never accepted\n// and undefined/non-string values are only allowed in object mode.\n\n\nfunction validChunk(stream, state, chunk, cb) {\n  var er;\n\n  if (chunk === null) {\n    er = new ERR_STREAM_NULL_VALUES();\n  } else if (typeof chunk !== 'string' && !state.objectMode) {\n    er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk);\n  }\n\n  if (er) {\n    errorOrDestroy(stream, er);\n    process.nextTick(cb, er);\n    return false;\n  }\n\n  return true;\n}\n\nWritable.prototype.write = function (chunk, encoding, cb) {\n  var state = this._writableState;\n  var ret = false;\n\n  var isBuf = !state.objectMode && _isUint8Array(chunk);\n\n  if (isBuf && !Buffer.isBuffer(chunk)) {\n    chunk = _uint8ArrayToBuffer(chunk);\n  }\n\n  if (typeof encoding === 'function') {\n    cb = encoding;\n    encoding = null;\n  }\n\n  if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;\n  if (typeof cb !== 'function') cb = nop;\n  if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {\n    state.pendingcb++;\n    ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);\n  }\n  return ret;\n};\n\nWritable.prototype.cork = function () {\n  this._writableState.corked++;\n};\n\nWritable.prototype.uncork = function () {\n  var state = this._writableState;\n\n  if (state.corked) {\n    state.corked--;\n    if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);\n  }\n};\n\nWritable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {\n  // node::ParseEncoding() requires lower case.\n  if (typeof encoding === 'string') encoding = encoding.toLowerCase();\n  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding);\n  this._writableState.defaultEncoding = encoding;\n  return this;\n};\n\nObject.defineProperty(Writable.prototype, 'writableBuffer', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function get() {\n    return this._writableState && this._writableState.getBuffer();\n  }\n});\n\nfunction decodeChunk(state, chunk, encoding) {\n  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {\n    chunk = Buffer.from(chunk, encoding);\n  }\n\n  return chunk;\n}\n\nObject.defineProperty(Writable.prototype, 'writableHighWaterMark', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function get() {\n    return this._writableState.highWaterMark;\n  }\n}); // if we're already writing something, then just put this\n// in the queue, and wait our turn.  Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\n\nfunction writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {\n  if (!isBuf) {\n    var newChunk = decodeChunk(state, chunk, encoding);\n\n    if (chunk !== newChunk) {\n      isBuf = true;\n      encoding = 'buffer';\n      chunk = newChunk;\n    }\n  }\n\n  var len = state.objectMode ? 1 : chunk.length;\n  state.length += len;\n  var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false.\n\n  if (!ret) state.needDrain = true;\n\n  if (state.writing || state.corked) {\n    var last = state.lastBufferedRequest;\n    state.lastBufferedRequest = {\n      chunk: chunk,\n      encoding: encoding,\n      isBuf: isBuf,\n      callback: cb,\n      next: null\n    };\n\n    if (last) {\n      last.next = state.lastBufferedRequest;\n    } else {\n      state.bufferedRequest = state.lastBufferedRequest;\n    }\n\n    state.bufferedRequestCount += 1;\n  } else {\n    doWrite(stream, state, false, len, chunk, encoding, cb);\n  }\n\n  return ret;\n}\n\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n  state.writelen = len;\n  state.writecb = cb;\n  state.writing = true;\n  state.sync = true;\n  if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);\n  state.sync = false;\n}\n\nfunction onwriteError(stream, state, sync, er, cb) {\n  --state.pendingcb;\n\n  if (sync) {\n    // defer the callback if we are being called synchronously\n    // to avoid piling up things on the stack\n    process.nextTick(cb, er); // this can emit finish, and it will always happen\n    // after error\n\n    process.nextTick(finishMaybe, stream, state);\n    stream._writableState.errorEmitted = true;\n    errorOrDestroy(stream, er);\n  } else {\n    // the caller expect this to happen before if\n    // it is async\n    cb(er);\n    stream._writableState.errorEmitted = true;\n    errorOrDestroy(stream, er); // this can emit finish, but finish must\n    // always follow error\n\n    finishMaybe(stream, state);\n  }\n}\n\nfunction onwriteStateUpdate(state) {\n  state.writing = false;\n  state.writecb = null;\n  state.length -= state.writelen;\n  state.writelen = 0;\n}\n\nfunction onwrite(stream, er) {\n  var state = stream._writableState;\n  var sync = state.sync;\n  var cb = state.writecb;\n  if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK();\n  onwriteStateUpdate(state);\n  if (er) onwriteError(stream, state, sync, er, cb);else {\n    // Check if we're actually ready to finish, but don't emit yet\n    var finished = needFinish(state) || stream.destroyed;\n\n    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {\n      clearBuffer(stream, state);\n    }\n\n    if (sync) {\n      process.nextTick(afterWrite, stream, state, finished, cb);\n    } else {\n      afterWrite(stream, state, finished, cb);\n    }\n  }\n}\n\nfunction afterWrite(stream, state, finished, cb) {\n  if (!finished) onwriteDrain(stream, state);\n  state.pendingcb--;\n  cb();\n  finishMaybe(stream, state);\n} // Must force callback to be called on nextTick, so that we don't\n// emit 'drain' before the write() consumer gets the 'false' return\n// value, and has a chance to attach a 'drain' listener.\n\n\nfunction onwriteDrain(stream, state) {\n  if (state.length === 0 && state.needDrain) {\n    state.needDrain = false;\n    stream.emit('drain');\n  }\n} // if there's something in the buffer waiting, then process it\n\n\nfunction clearBuffer(stream, state) {\n  state.bufferProcessing = true;\n  var entry = state.bufferedRequest;\n\n  if (stream._writev && entry && entry.next) {\n    // Fast case, write everything using _writev()\n    var l = state.bufferedRequestCount;\n    var buffer = new Array(l);\n    var holder = state.corkedRequestsFree;\n    holder.entry = entry;\n    var count = 0;\n    var allBuffers = true;\n\n    while (entry) {\n      buffer[count] = entry;\n      if (!entry.isBuf) allBuffers = false;\n      entry = entry.next;\n      count += 1;\n    }\n\n    buffer.allBuffers = allBuffers;\n    doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time\n    // as the hot path ends with doWrite\n\n    state.pendingcb++;\n    state.lastBufferedRequest = null;\n\n    if (holder.next) {\n      state.corkedRequestsFree = holder.next;\n      holder.next = null;\n    } else {\n      state.corkedRequestsFree = new CorkedRequest(state);\n    }\n\n    state.bufferedRequestCount = 0;\n  } else {\n    // Slow case, write chunks one-by-one\n    while (entry) {\n      var chunk = entry.chunk;\n      var encoding = entry.encoding;\n      var cb = entry.callback;\n      var len = state.objectMode ? 1 : chunk.length;\n      doWrite(stream, state, false, len, chunk, encoding, cb);\n      entry = entry.next;\n      state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then\n      // it means that we need to wait until it does.\n      // also, that means that the chunk and cb are currently\n      // being processed, so move the buffer counter past them.\n\n      if (state.writing) {\n        break;\n      }\n    }\n\n    if (entry === null) state.lastBufferedRequest = null;\n  }\n\n  state.bufferedRequest = entry;\n  state.bufferProcessing = false;\n}\n\nWritable.prototype._write = function (chunk, encoding, cb) {\n  cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()'));\n};\n\nWritable.prototype._writev = null;\n\nWritable.prototype.end = function (chunk, encoding, cb) {\n  var state = this._writableState;\n\n  if (typeof chunk === 'function') {\n    cb = chunk;\n    chunk = null;\n    encoding = null;\n  } else if (typeof encoding === 'function') {\n    cb = encoding;\n    encoding = null;\n  }\n\n  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks\n\n  if (state.corked) {\n    state.corked = 1;\n    this.uncork();\n  } // ignore unnecessary end() calls.\n\n\n  if (!state.ending) endWritable(this, state, cb);\n  return this;\n};\n\nObject.defineProperty(Writable.prototype, 'writableLength', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function get() {\n    return this._writableState.length;\n  }\n});\n\nfunction needFinish(state) {\n  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;\n}\n\nfunction callFinal(stream, state) {\n  stream._final(function (err) {\n    state.pendingcb--;\n\n    if (err) {\n      errorOrDestroy(stream, err);\n    }\n\n    state.prefinished = true;\n    stream.emit('prefinish');\n    finishMaybe(stream, state);\n  });\n}\n\nfunction prefinish(stream, state) {\n  if (!state.prefinished && !state.finalCalled) {\n    if (typeof stream._final === 'function' && !state.destroyed) {\n      state.pendingcb++;\n      state.finalCalled = true;\n      process.nextTick(callFinal, stream, state);\n    } else {\n      state.prefinished = true;\n      stream.emit('prefinish');\n    }\n  }\n}\n\nfunction finishMaybe(stream, state) {\n  var need = needFinish(state);\n\n  if (need) {\n    prefinish(stream, state);\n\n    if (state.pendingcb === 0) {\n      state.finished = true;\n      stream.emit('finish');\n\n      if (state.autoDestroy) {\n        // In case of duplex streams we need a way to detect\n        // if the readable side is ready for autoDestroy as well\n        var rState = stream._readableState;\n\n        if (!rState || rState.autoDestroy && rState.endEmitted) {\n          stream.destroy();\n        }\n      }\n    }\n  }\n\n  return need;\n}\n\nfunction endWritable(stream, state, cb) {\n  state.ending = true;\n  finishMaybe(stream, state);\n\n  if (cb) {\n    if (state.finished) process.nextTick(cb);else stream.once('finish', cb);\n  }\n\n  state.ended = true;\n  stream.writable = false;\n}\n\nfunction onCorkedFinish(corkReq, state, err) {\n  var entry = corkReq.entry;\n  corkReq.entry = null;\n\n  while (entry) {\n    var cb = entry.callback;\n    state.pendingcb--;\n    cb(err);\n    entry = entry.next;\n  } // reuse the free corkReq.\n\n\n  state.corkedRequestsFree.next = corkReq;\n}\n\nObject.defineProperty(Writable.prototype, 'destroyed', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function get() {\n    if (this._writableState === undefined) {\n      return false;\n    }\n\n    return this._writableState.destroyed;\n  },\n  set: function set(value) {\n    // we ignore the value if the stream\n    // has not been initialized yet\n    if (!this._writableState) {\n      return;\n    } // backward compatibility, the user is explicitly\n    // managing destroyed\n\n\n    this._writableState.destroyed = value;\n  }\n});\nWritable.prototype.destroy = destroyImpl.destroy;\nWritable.prototype._undestroy = destroyImpl.undestroy;\n\nWritable.prototype._destroy = function (err, cb) {\n  cb(err);\n};\n}).call(this)}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"../errors\":13,\"./_stream_duplex\":14,\"./internal/streams/destroy\":21,\"./internal/streams/state\":25,\"./internal/streams/stream\":26,\"_process\":8,\"buffer\":3,\"inherits\":12,\"util-deprecate\":28}],19:[function(require,module,exports){\n(function (process){(function (){\n'use strict';\n\nvar _Object$setPrototypeO;\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar finished = require('./end-of-stream');\n\nvar kLastResolve = Symbol('lastResolve');\nvar kLastReject = Symbol('lastReject');\nvar kError = Symbol('error');\nvar kEnded = Symbol('ended');\nvar kLastPromise = Symbol('lastPromise');\nvar kHandlePromise = Symbol('handlePromise');\nvar kStream = Symbol('stream');\n\nfunction createIterResult(value, done) {\n  return {\n    value: value,\n    done: done\n  };\n}\n\nfunction readAndResolve(iter) {\n  var resolve = iter[kLastResolve];\n\n  if (resolve !== null) {\n    var data = iter[kStream].read(); // we defer if data is null\n    // we can be expecting either 'end' or\n    // 'error'\n\n    if (data !== null) {\n      iter[kLastPromise] = null;\n      iter[kLastResolve] = null;\n      iter[kLastReject] = null;\n      resolve(createIterResult(data, false));\n    }\n  }\n}\n\nfunction onReadable(iter) {\n  // we wait for the next tick, because it might\n  // emit an error with process.nextTick\n  process.nextTick(readAndResolve, iter);\n}\n\nfunction wrapForNext(lastPromise, iter) {\n  return function (resolve, reject) {\n    lastPromise.then(function () {\n      if (iter[kEnded]) {\n        resolve(createIterResult(undefined, true));\n        return;\n      }\n\n      iter[kHandlePromise](resolve, reject);\n    }, reject);\n  };\n}\n\nvar AsyncIteratorPrototype = Object.getPrototypeOf(function () {});\nvar ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = {\n  get stream() {\n    return this[kStream];\n  },\n\n  next: function next() {\n    var _this = this;\n\n    // if we have detected an error in the meanwhile\n    // reject straight away\n    var error = this[kError];\n\n    if (error !== null) {\n      return Promise.reject(error);\n    }\n\n    if (this[kEnded]) {\n      return Promise.resolve(createIterResult(undefined, true));\n    }\n\n    if (this[kStream].destroyed) {\n      // We need to defer via nextTick because if .destroy(err) is\n      // called, the error will be emitted via nextTick, and\n      // we cannot guarantee that there is no error lingering around\n      // waiting to be emitted.\n      return new Promise(function (resolve, reject) {\n        process.nextTick(function () {\n          if (_this[kError]) {\n            reject(_this[kError]);\n          } else {\n            resolve(createIterResult(undefined, true));\n          }\n        });\n      });\n    } // if we have multiple next() calls\n    // we will wait for the previous Promise to finish\n    // this logic is optimized to support for await loops,\n    // where next() is only called once at a time\n\n\n    var lastPromise = this[kLastPromise];\n    var promise;\n\n    if (lastPromise) {\n      promise = new Promise(wrapForNext(lastPromise, this));\n    } else {\n      // fast path needed to support multiple this.push()\n      // without triggering the next() queue\n      var data = this[kStream].read();\n\n      if (data !== null) {\n        return Promise.resolve(createIterResult(data, false));\n      }\n\n      promise = new Promise(this[kHandlePromise]);\n    }\n\n    this[kLastPromise] = promise;\n    return promise;\n  }\n}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () {\n  return this;\n}), _defineProperty(_Object$setPrototypeO, \"return\", function _return() {\n  var _this2 = this;\n\n  // destroy(err, cb) is a private API\n  // we can guarantee we have that here, because we control the\n  // Readable class this is attached to\n  return new Promise(function (resolve, reject) {\n    _this2[kStream].destroy(null, function (err) {\n      if (err) {\n        reject(err);\n        return;\n      }\n\n      resolve(createIterResult(undefined, true));\n    });\n  });\n}), _Object$setPrototypeO), AsyncIteratorPrototype);\n\nvar createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) {\n  var _Object$create;\n\n  var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, {\n    value: stream,\n    writable: true\n  }), _defineProperty(_Object$create, kLastResolve, {\n    value: null,\n    writable: true\n  }), _defineProperty(_Object$create, kLastReject, {\n    value: null,\n    writable: true\n  }), _defineProperty(_Object$create, kError, {\n    value: null,\n    writable: true\n  }), _defineProperty(_Object$create, kEnded, {\n    value: stream._readableState.endEmitted,\n    writable: true\n  }), _defineProperty(_Object$create, kHandlePromise, {\n    value: function value(resolve, reject) {\n      var data = iterator[kStream].read();\n\n      if (data) {\n        iterator[kLastPromise] = null;\n        iterator[kLastResolve] = null;\n        iterator[kLastReject] = null;\n        resolve(createIterResult(data, false));\n      } else {\n        iterator[kLastResolve] = resolve;\n        iterator[kLastReject] = reject;\n      }\n    },\n    writable: true\n  }), _Object$create));\n  iterator[kLastPromise] = null;\n  finished(stream, function (err) {\n    if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') {\n      var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise\n      // returned by next() and store the error\n\n      if (reject !== null) {\n        iterator[kLastPromise] = null;\n        iterator[kLastResolve] = null;\n        iterator[kLastReject] = null;\n        reject(err);\n      }\n\n      iterator[kError] = err;\n      return;\n    }\n\n    var resolve = iterator[kLastResolve];\n\n    if (resolve !== null) {\n      iterator[kLastPromise] = null;\n      iterator[kLastResolve] = null;\n      iterator[kLastReject] = null;\n      resolve(createIterResult(undefined, true));\n    }\n\n    iterator[kEnded] = true;\n  });\n  stream.on('readable', onReadable.bind(null, iterator));\n  return iterator;\n};\n\nmodule.exports = createReadableStreamAsyncIterator;\n}).call(this)}).call(this,require('_process'))\n\n},{\"./end-of-stream\":22,\"_process\":8}],20:[function(require,module,exports){\n'use strict';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _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); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar _require = require('buffer'),\n    Buffer = _require.Buffer;\n\nvar _require2 = require('util'),\n    inspect = _require2.inspect;\n\nvar custom = inspect && inspect.custom || 'inspect';\n\nfunction copyBuffer(src, target, offset) {\n  Buffer.prototype.copy.call(src, target, offset);\n}\n\nmodule.exports =\n/*#__PURE__*/\nfunction () {\n  function BufferList() {\n    _classCallCheck(this, BufferList);\n\n    this.head = null;\n    this.tail = null;\n    this.length = 0;\n  }\n\n  _createClass(BufferList, [{\n    key: \"push\",\n    value: function push(v) {\n      var entry = {\n        data: v,\n        next: null\n      };\n      if (this.length > 0) this.tail.next = entry;else this.head = entry;\n      this.tail = entry;\n      ++this.length;\n    }\n  }, {\n    key: \"unshift\",\n    value: function unshift(v) {\n      var entry = {\n        data: v,\n        next: this.head\n      };\n      if (this.length === 0) this.tail = entry;\n      this.head = entry;\n      ++this.length;\n    }\n  }, {\n    key: \"shift\",\n    value: function shift() {\n      if (this.length === 0) return;\n      var ret = this.head.data;\n      if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;\n      --this.length;\n      return ret;\n    }\n  }, {\n    key: \"clear\",\n    value: function clear() {\n      this.head = this.tail = null;\n      this.length = 0;\n    }\n  }, {\n    key: \"join\",\n    value: function join(s) {\n      if (this.length === 0) return '';\n      var p = this.head;\n      var ret = '' + p.data;\n\n      while (p = p.next) {\n        ret += s + p.data;\n      }\n\n      return ret;\n    }\n  }, {\n    key: \"concat\",\n    value: function concat(n) {\n      if (this.length === 0) return Buffer.alloc(0);\n      var ret = Buffer.allocUnsafe(n >>> 0);\n      var p = this.head;\n      var i = 0;\n\n      while (p) {\n        copyBuffer(p.data, ret, i);\n        i += p.data.length;\n        p = p.next;\n      }\n\n      return ret;\n    } // Consumes a specified amount of bytes or characters from the buffered data.\n\n  }, {\n    key: \"consume\",\n    value: function consume(n, hasStrings) {\n      var ret;\n\n      if (n < this.head.data.length) {\n        // `slice` is the same for buffers and strings.\n        ret = this.head.data.slice(0, n);\n        this.head.data = this.head.data.slice(n);\n      } else if (n === this.head.data.length) {\n        // First chunk is a perfect match.\n        ret = this.shift();\n      } else {\n        // Result spans more than one buffer.\n        ret = hasStrings ? this._getString(n) : this._getBuffer(n);\n      }\n\n      return ret;\n    }\n  }, {\n    key: \"first\",\n    value: function first() {\n      return this.head.data;\n    } // Consumes a specified amount of characters from the buffered data.\n\n  }, {\n    key: \"_getString\",\n    value: function _getString(n) {\n      var p = this.head;\n      var c = 1;\n      var ret = p.data;\n      n -= ret.length;\n\n      while (p = p.next) {\n        var str = p.data;\n        var nb = n > str.length ? str.length : n;\n        if (nb === str.length) ret += str;else ret += str.slice(0, n);\n        n -= nb;\n\n        if (n === 0) {\n          if (nb === str.length) {\n            ++c;\n            if (p.next) this.head = p.next;else this.head = this.tail = null;\n          } else {\n            this.head = p;\n            p.data = str.slice(nb);\n          }\n\n          break;\n        }\n\n        ++c;\n      }\n\n      this.length -= c;\n      return ret;\n    } // Consumes a specified amount of bytes from the buffered data.\n\n  }, {\n    key: \"_getBuffer\",\n    value: function _getBuffer(n) {\n      var ret = Buffer.allocUnsafe(n);\n      var p = this.head;\n      var c = 1;\n      p.data.copy(ret);\n      n -= p.data.length;\n\n      while (p = p.next) {\n        var buf = p.data;\n        var nb = n > buf.length ? buf.length : n;\n        buf.copy(ret, ret.length - n, 0, nb);\n        n -= nb;\n\n        if (n === 0) {\n          if (nb === buf.length) {\n            ++c;\n            if (p.next) this.head = p.next;else this.head = this.tail = null;\n          } else {\n            this.head = p;\n            p.data = buf.slice(nb);\n          }\n\n          break;\n        }\n\n        ++c;\n      }\n\n      this.length -= c;\n      return ret;\n    } // Make sure the linked list only shows the minimal necessary information.\n\n  }, {\n    key: custom,\n    value: function value(_, options) {\n      return inspect(this, _objectSpread({}, options, {\n        // Only inspect one level.\n        depth: 0,\n        // It should not recurse.\n        customInspect: false\n      }));\n    }\n  }]);\n\n  return BufferList;\n}();\n},{\"buffer\":3,\"util\":2}],21:[function(require,module,exports){\n(function (process){(function (){\n'use strict'; // undocumented cb() API, needed for core, not for public API\n\nfunction destroy(err, cb) {\n  var _this = this;\n\n  var readableDestroyed = this._readableState && this._readableState.destroyed;\n  var writableDestroyed = this._writableState && this._writableState.destroyed;\n\n  if (readableDestroyed || writableDestroyed) {\n    if (cb) {\n      cb(err);\n    } else if (err) {\n      if (!this._writableState) {\n        process.nextTick(emitErrorNT, this, err);\n      } else if (!this._writableState.errorEmitted) {\n        this._writableState.errorEmitted = true;\n        process.nextTick(emitErrorNT, this, err);\n      }\n    }\n\n    return this;\n  } // we set destroyed to true before firing error callbacks in order\n  // to make it re-entrance safe in case destroy() is called within callbacks\n\n\n  if (this._readableState) {\n    this._readableState.destroyed = true;\n  } // if this is a duplex stream mark the writable part as destroyed as well\n\n\n  if (this._writableState) {\n    this._writableState.destroyed = true;\n  }\n\n  this._destroy(err || null, function (err) {\n    if (!cb && err) {\n      if (!_this._writableState) {\n        process.nextTick(emitErrorAndCloseNT, _this, err);\n      } else if (!_this._writableState.errorEmitted) {\n        _this._writableState.errorEmitted = true;\n        process.nextTick(emitErrorAndCloseNT, _this, err);\n      } else {\n        process.nextTick(emitCloseNT, _this);\n      }\n    } else if (cb) {\n      process.nextTick(emitCloseNT, _this);\n      cb(err);\n    } else {\n      process.nextTick(emitCloseNT, _this);\n    }\n  });\n\n  return this;\n}\n\nfunction emitErrorAndCloseNT(self, err) {\n  emitErrorNT(self, err);\n  emitCloseNT(self);\n}\n\nfunction emitCloseNT(self) {\n  if (self._writableState && !self._writableState.emitClose) return;\n  if (self._readableState && !self._readableState.emitClose) return;\n  self.emit('close');\n}\n\nfunction undestroy() {\n  if (this._readableState) {\n    this._readableState.destroyed = false;\n    this._readableState.reading = false;\n    this._readableState.ended = false;\n    this._readableState.endEmitted = false;\n  }\n\n  if (this._writableState) {\n    this._writableState.destroyed = false;\n    this._writableState.ended = false;\n    this._writableState.ending = false;\n    this._writableState.finalCalled = false;\n    this._writableState.prefinished = false;\n    this._writableState.finished = false;\n    this._writableState.errorEmitted = false;\n  }\n}\n\nfunction emitErrorNT(self, err) {\n  self.emit('error', err);\n}\n\nfunction errorOrDestroy(stream, err) {\n  // We have tests that rely on errors being emitted\n  // in the same tick, so changing this is semver major.\n  // For now when you opt-in to autoDestroy we allow\n  // the error to be emitted nextTick. In a future\n  // semver major update we should change the default to this.\n  var rState = stream._readableState;\n  var wState = stream._writableState;\n  if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err);\n}\n\nmodule.exports = {\n  destroy: destroy,\n  undestroy: undestroy,\n  errorOrDestroy: errorOrDestroy\n};\n}).call(this)}).call(this,require('_process'))\n\n},{\"_process\":8}],22:[function(require,module,exports){\n// Ported from https://github.com/mafintosh/end-of-stream with\n// permission from the author, Mathias Buus (@mafintosh).\n'use strict';\n\nvar ERR_STREAM_PREMATURE_CLOSE = require('../../../errors').codes.ERR_STREAM_PREMATURE_CLOSE;\n\nfunction once(callback) {\n  var called = false;\n  return function () {\n    if (called) return;\n    called = true;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    callback.apply(this, args);\n  };\n}\n\nfunction noop() {}\n\nfunction isRequest(stream) {\n  return stream.setHeader && typeof stream.abort === 'function';\n}\n\nfunction eos(stream, opts, callback) {\n  if (typeof opts === 'function') return eos(stream, null, opts);\n  if (!opts) opts = {};\n  callback = once(callback || noop);\n  var readable = opts.readable || opts.readable !== false && stream.readable;\n  var writable = opts.writable || opts.writable !== false && stream.writable;\n\n  var onlegacyfinish = function onlegacyfinish() {\n    if (!stream.writable) onfinish();\n  };\n\n  var writableEnded = stream._writableState && stream._writableState.finished;\n\n  var onfinish = function onfinish() {\n    writable = false;\n    writableEnded = true;\n    if (!readable) callback.call(stream);\n  };\n\n  var readableEnded = stream._readableState && stream._readableState.endEmitted;\n\n  var onend = function onend() {\n    readable = false;\n    readableEnded = true;\n    if (!writable) callback.call(stream);\n  };\n\n  var onerror = function onerror(err) {\n    callback.call(stream, err);\n  };\n\n  var onclose = function onclose() {\n    var err;\n\n    if (readable && !readableEnded) {\n      if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();\n      return callback.call(stream, err);\n    }\n\n    if (writable && !writableEnded) {\n      if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();\n      return callback.call(stream, err);\n    }\n  };\n\n  var onrequest = function onrequest() {\n    stream.req.on('finish', onfinish);\n  };\n\n  if (isRequest(stream)) {\n    stream.on('complete', onfinish);\n    stream.on('abort', onclose);\n    if (stream.req) onrequest();else stream.on('request', onrequest);\n  } else if (writable && !stream._writableState) {\n    // legacy streams\n    stream.on('end', onlegacyfinish);\n    stream.on('close', onlegacyfinish);\n  }\n\n  stream.on('end', onend);\n  stream.on('finish', onfinish);\n  if (opts.error !== false) stream.on('error', onerror);\n  stream.on('close', onclose);\n  return function () {\n    stream.removeListener('complete', onfinish);\n    stream.removeListener('abort', onclose);\n    stream.removeListener('request', onrequest);\n    if (stream.req) stream.req.removeListener('finish', onfinish);\n    stream.removeListener('end', onlegacyfinish);\n    stream.removeListener('close', onlegacyfinish);\n    stream.removeListener('finish', onfinish);\n    stream.removeListener('end', onend);\n    stream.removeListener('error', onerror);\n    stream.removeListener('close', onclose);\n  };\n}\n\nmodule.exports = eos;\n},{\"../../../errors\":13}],23:[function(require,module,exports){\nmodule.exports = function () {\n  throw new Error('Readable.from is not available in the browser')\n};\n\n},{}],24:[function(require,module,exports){\n// Ported from https://github.com/mafintosh/pump with\n// permission from the author, Mathias Buus (@mafintosh).\n'use strict';\n\nvar eos;\n\nfunction once(callback) {\n  var called = false;\n  return function () {\n    if (called) return;\n    called = true;\n    callback.apply(void 0, arguments);\n  };\n}\n\nvar _require$codes = require('../../../errors').codes,\n    ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS,\n    ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED;\n\nfunction noop(err) {\n  // Rethrow the error if it exists to avoid swallowing it\n  if (err) throw err;\n}\n\nfunction isRequest(stream) {\n  return stream.setHeader && typeof stream.abort === 'function';\n}\n\nfunction destroyer(stream, reading, writing, callback) {\n  callback = once(callback);\n  var closed = false;\n  stream.on('close', function () {\n    closed = true;\n  });\n  if (eos === undefined) eos = require('./end-of-stream');\n  eos(stream, {\n    readable: reading,\n    writable: writing\n  }, function (err) {\n    if (err) return callback(err);\n    closed = true;\n    callback();\n  });\n  var destroyed = false;\n  return function (err) {\n    if (closed) return;\n    if (destroyed) return;\n    destroyed = true; // request.destroy just do .end - .abort is what we want\n\n    if (isRequest(stream)) return stream.abort();\n    if (typeof stream.destroy === 'function') return stream.destroy();\n    callback(err || new ERR_STREAM_DESTROYED('pipe'));\n  };\n}\n\nfunction call(fn) {\n  fn();\n}\n\nfunction pipe(from, to) {\n  return from.pipe(to);\n}\n\nfunction popCallback(streams) {\n  if (!streams.length) return noop;\n  if (typeof streams[streams.length - 1] !== 'function') return noop;\n  return streams.pop();\n}\n\nfunction pipeline() {\n  for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) {\n    streams[_key] = arguments[_key];\n  }\n\n  var callback = popCallback(streams);\n  if (Array.isArray(streams[0])) streams = streams[0];\n\n  if (streams.length < 2) {\n    throw new ERR_MISSING_ARGS('streams');\n  }\n\n  var error;\n  var destroys = streams.map(function (stream, i) {\n    var reading = i < streams.length - 1;\n    var writing = i > 0;\n    return destroyer(stream, reading, writing, function (err) {\n      if (!error) error = err;\n      if (err) destroys.forEach(call);\n      if (reading) return;\n      destroys.forEach(call);\n      callback(error);\n    });\n  });\n  return streams.reduce(pipe);\n}\n\nmodule.exports = pipeline;\n},{\"../../../errors\":13,\"./end-of-stream\":22}],25:[function(require,module,exports){\n'use strict';\n\nvar ERR_INVALID_OPT_VALUE = require('../../../errors').codes.ERR_INVALID_OPT_VALUE;\n\nfunction highWaterMarkFrom(options, isDuplex, duplexKey) {\n  return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null;\n}\n\nfunction getHighWaterMark(state, options, duplexKey, isDuplex) {\n  var hwm = highWaterMarkFrom(options, isDuplex, duplexKey);\n\n  if (hwm != null) {\n    if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) {\n      var name = isDuplex ? duplexKey : 'highWaterMark';\n      throw new ERR_INVALID_OPT_VALUE(name, hwm);\n    }\n\n    return Math.floor(hwm);\n  } // Default value\n\n\n  return state.objectMode ? 16 : 16 * 1024;\n}\n\nmodule.exports = {\n  getHighWaterMark: getHighWaterMark\n};\n},{\"../../../errors\":13}],26:[function(require,module,exports){\nmodule.exports = require('events').EventEmitter;\n\n},{\"events\":5}],27:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// 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 permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n/*<replacement>*/\n\nvar Buffer = require('safe-buffer').Buffer;\n/*</replacement>*/\n\nvar isEncoding = Buffer.isEncoding || function (encoding) {\n  encoding = '' + encoding;\n  switch (encoding && encoding.toLowerCase()) {\n    case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':\n      return true;\n    default:\n      return false;\n  }\n};\n\nfunction _normalizeEncoding(enc) {\n  if (!enc) return 'utf8';\n  var retried;\n  while (true) {\n    switch (enc) {\n      case 'utf8':\n      case 'utf-8':\n        return 'utf8';\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return 'utf16le';\n      case 'latin1':\n      case 'binary':\n        return 'latin1';\n      case 'base64':\n      case 'ascii':\n      case 'hex':\n        return enc;\n      default:\n        if (retried) return; // undefined\n        enc = ('' + enc).toLowerCase();\n        retried = true;\n    }\n  }\n};\n\n// Do not cache `Buffer.isEncoding` when checking encoding names as some\n// modules monkey-patch it to support additional encodings\nfunction normalizeEncoding(enc) {\n  var nenc = _normalizeEncoding(enc);\n  if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);\n  return nenc || enc;\n}\n\n// StringDecoder provides an interface for efficiently splitting a series of\n// buffers into a series of JS strings without breaking apart multi-byte\n// characters.\nexports.StringDecoder = StringDecoder;\nfunction StringDecoder(encoding) {\n  this.encoding = normalizeEncoding(encoding);\n  var nb;\n  switch (this.encoding) {\n    case 'utf16le':\n      this.text = utf16Text;\n      this.end = utf16End;\n      nb = 4;\n      break;\n    case 'utf8':\n      this.fillLast = utf8FillLast;\n      nb = 4;\n      break;\n    case 'base64':\n      this.text = base64Text;\n      this.end = base64End;\n      nb = 3;\n      break;\n    default:\n      this.write = simpleWrite;\n      this.end = simpleEnd;\n      return;\n  }\n  this.lastNeed = 0;\n  this.lastTotal = 0;\n  this.lastChar = Buffer.allocUnsafe(nb);\n}\n\nStringDecoder.prototype.write = function (buf) {\n  if (buf.length === 0) return '';\n  var r;\n  var i;\n  if (this.lastNeed) {\n    r = this.fillLast(buf);\n    if (r === undefined) return '';\n    i = this.lastNeed;\n    this.lastNeed = 0;\n  } else {\n    i = 0;\n  }\n  if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);\n  return r || '';\n};\n\nStringDecoder.prototype.end = utf8End;\n\n// Returns only complete characters in a Buffer\nStringDecoder.prototype.text = utf8Text;\n\n// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer\nStringDecoder.prototype.fillLast = function (buf) {\n  if (this.lastNeed <= buf.length) {\n    buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);\n    return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n  }\n  buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);\n  this.lastNeed -= buf.length;\n};\n\n// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a\n// continuation byte. If an invalid byte is detected, -2 is returned.\nfunction utf8CheckByte(byte) {\n  if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;\n  return byte >> 6 === 0x02 ? -1 : -2;\n}\n\n// Checks at most 3 bytes at the end of a Buffer in order to detect an\n// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)\n// needed to complete the UTF-8 character (if applicable) are returned.\nfunction utf8CheckIncomplete(self, buf, i) {\n  var j = buf.length - 1;\n  if (j < i) return 0;\n  var nb = utf8CheckByte(buf[j]);\n  if (nb >= 0) {\n    if (nb > 0) self.lastNeed = nb - 1;\n    return nb;\n  }\n  if (--j < i || nb === -2) return 0;\n  nb = utf8CheckByte(buf[j]);\n  if (nb >= 0) {\n    if (nb > 0) self.lastNeed = nb - 2;\n    return nb;\n  }\n  if (--j < i || nb === -2) return 0;\n  nb = utf8CheckByte(buf[j]);\n  if (nb >= 0) {\n    if (nb > 0) {\n      if (nb === 2) nb = 0;else self.lastNeed = nb - 3;\n    }\n    return nb;\n  }\n  return 0;\n}\n\n// Validates as many continuation bytes for a multi-byte UTF-8 character as\n// needed or are available. If we see a non-continuation byte where we expect\n// one, we \"replace\" the validated continuation bytes we've seen so far with\n// a single UTF-8 replacement character ('\\ufffd'), to match v8's UTF-8 decoding\n// behavior. The continuation byte check is included three times in the case\n// where all of the continuation bytes for a character exist in the same buffer.\n// It is also done this way as a slight performance increase instead of using a\n// loop.\nfunction utf8CheckExtraBytes(self, buf, p) {\n  if ((buf[0] & 0xC0) !== 0x80) {\n    self.lastNeed = 0;\n    return '\\ufffd';\n  }\n  if (self.lastNeed > 1 && buf.length > 1) {\n    if ((buf[1] & 0xC0) !== 0x80) {\n      self.lastNeed = 1;\n      return '\\ufffd';\n    }\n    if (self.lastNeed > 2 && buf.length > 2) {\n      if ((buf[2] & 0xC0) !== 0x80) {\n        self.lastNeed = 2;\n        return '\\ufffd';\n      }\n    }\n  }\n}\n\n// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.\nfunction utf8FillLast(buf) {\n  var p = this.lastTotal - this.lastNeed;\n  var r = utf8CheckExtraBytes(this, buf, p);\n  if (r !== undefined) return r;\n  if (this.lastNeed <= buf.length) {\n    buf.copy(this.lastChar, p, 0, this.lastNeed);\n    return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n  }\n  buf.copy(this.lastChar, p, 0, buf.length);\n  this.lastNeed -= buf.length;\n}\n\n// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a\n// partial character, the character's bytes are buffered until the required\n// number of bytes are available.\nfunction utf8Text(buf, i) {\n  var total = utf8CheckIncomplete(this, buf, i);\n  if (!this.lastNeed) return buf.toString('utf8', i);\n  this.lastTotal = total;\n  var end = buf.length - (total - this.lastNeed);\n  buf.copy(this.lastChar, 0, end);\n  return buf.toString('utf8', i, end);\n}\n\n// For UTF-8, a replacement character is added when ending on a partial\n// character.\nfunction utf8End(buf) {\n  var r = buf && buf.length ? this.write(buf) : '';\n  if (this.lastNeed) return r + '\\ufffd';\n  return r;\n}\n\n// UTF-16LE typically needs two bytes per character, but even if we have an even\n// number of bytes available, we need to check if we end on a leading/high\n// surrogate. In that case, we need to wait for the next two bytes in order to\n// decode the last character properly.\nfunction utf16Text(buf, i) {\n  if ((buf.length - i) % 2 === 0) {\n    var r = buf.toString('utf16le', i);\n    if (r) {\n      var c = r.charCodeAt(r.length - 1);\n      if (c >= 0xD800 && c <= 0xDBFF) {\n        this.lastNeed = 2;\n        this.lastTotal = 4;\n        this.lastChar[0] = buf[buf.length - 2];\n        this.lastChar[1] = buf[buf.length - 1];\n        return r.slice(0, -1);\n      }\n    }\n    return r;\n  }\n  this.lastNeed = 1;\n  this.lastTotal = 2;\n  this.lastChar[0] = buf[buf.length - 1];\n  return buf.toString('utf16le', i, buf.length - 1);\n}\n\n// For UTF-16LE we do not explicitly append special replacement characters if we\n// end on a partial character, we simply let v8 handle that.\nfunction utf16End(buf) {\n  var r = buf && buf.length ? this.write(buf) : '';\n  if (this.lastNeed) {\n    var end = this.lastTotal - this.lastNeed;\n    return r + this.lastChar.toString('utf16le', 0, end);\n  }\n  return r;\n}\n\nfunction base64Text(buf, i) {\n  var n = (buf.length - i) % 3;\n  if (n === 0) return buf.toString('base64', i);\n  this.lastNeed = 3 - n;\n  this.lastTotal = 3;\n  if (n === 1) {\n    this.lastChar[0] = buf[buf.length - 1];\n  } else {\n    this.lastChar[0] = buf[buf.length - 2];\n    this.lastChar[1] = buf[buf.length - 1];\n  }\n  return buf.toString('base64', i, buf.length - n);\n}\n\nfunction base64End(buf) {\n  var r = buf && buf.length ? this.write(buf) : '';\n  if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);\n  return r;\n}\n\n// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)\nfunction simpleWrite(buf) {\n  return buf.toString(this.encoding);\n}\n\nfunction simpleEnd(buf) {\n  return buf && buf.length ? this.write(buf) : '';\n}\n},{\"safe-buffer\":9}],28:[function(require,module,exports){\n(function (global){(function (){\n\n/**\n * Module exports.\n */\n\nmodule.exports = deprecate;\n\n/**\n * Mark that a method should not be used.\n * Returns a modified function which warns once by default.\n *\n * If `localStorage.noDeprecation = true` is set, then it is a no-op.\n *\n * If `localStorage.throwDeprecation = true` is set, then deprecated functions\n * will throw an Error when invoked.\n *\n * If `localStorage.traceDeprecation = true` is set, then deprecated functions\n * will invoke `console.trace()` instead of `console.error()`.\n *\n * @param {Function} fn - the function to deprecate\n * @param {String} msg - the string to print to the console when `fn` is invoked\n * @returns {Function} a new \"deprecated\" version of `fn`\n * @api public\n */\n\nfunction deprecate (fn, msg) {\n  if (config('noDeprecation')) {\n    return fn;\n  }\n\n  var warned = false;\n  function deprecated() {\n    if (!warned) {\n      if (config('throwDeprecation')) {\n        throw new Error(msg);\n      } else if (config('traceDeprecation')) {\n        console.trace(msg);\n      } else {\n        console.warn(msg);\n      }\n      warned = true;\n    }\n    return fn.apply(this, arguments);\n  }\n\n  return deprecated;\n}\n\n/**\n * Checks `localStorage` for boolean values for the given `name`.\n *\n * @param {String} name\n * @returns {Boolean}\n * @api private\n */\n\nfunction config (name) {\n  // accessing global.localStorage can trigger a DOMException in sandboxed iframes\n  try {\n    if (!global.localStorage) return false;\n  } catch (_) {\n    return false;\n  }\n  var val = global.localStorage[name];\n  if (null == val) return false;\n  return String(val).toLowerCase() === 'true';\n}\n\n}).call(this)}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{}],29:[function(require,module,exports){\nmodule.exports = {\n\n  isArray: function(value) {\n    if (Array.isArray) {\n      return Array.isArray(value);\n    }\n    // fallback for older browsers like  IE 8\n    return Object.prototype.toString.call( value ) === '[object Array]';\n  }\n\n};\n\n},{}],30:[function(require,module,exports){\n/*jslint node:true */\n\nvar xml2js = require('./xml2js');\nvar xml2json = require('./xml2json');\nvar js2xml = require('./js2xml');\nvar json2xml = require('./json2xml');\n\nmodule.exports = {\n  xml2js: xml2js,\n  xml2json: xml2json,\n  js2xml: js2xml,\n  json2xml: json2xml\n};\n\n},{\"./js2xml\":31,\"./json2xml\":32,\"./xml2js\":34,\"./xml2json\":35}],31:[function(require,module,exports){\nvar helper = require('./options-helper');\nvar isArray = require('./array-helper').isArray;\n\nvar currentElement, currentElementName;\n\nfunction validateOptions(userOptions) {\n  var options = helper.copyOptions(userOptions);\n  helper.ensureFlagExists('ignoreDeclaration', options);\n  helper.ensureFlagExists('ignoreInstruction', options);\n  helper.ensureFlagExists('ignoreAttributes', options);\n  helper.ensureFlagExists('ignoreText', options);\n  helper.ensureFlagExists('ignoreComment', options);\n  helper.ensureFlagExists('ignoreCdata', options);\n  helper.ensureFlagExists('ignoreDoctype', options);\n  helper.ensureFlagExists('compact', options);\n  helper.ensureFlagExists('indentText', options);\n  helper.ensureFlagExists('indentCdata', options);\n  helper.ensureFlagExists('indentAttributes', options);\n  helper.ensureFlagExists('indentInstruction', options);\n  helper.ensureFlagExists('fullTagEmptyElement', options);\n  helper.ensureFlagExists('noQuotesForNativeAttributes', options);\n  helper.ensureSpacesExists(options);\n  if (typeof options.spaces === 'number') {\n    options.spaces = Array(options.spaces + 1).join(' ');\n  }\n  helper.ensureKeyExists('declaration', options);\n  helper.ensureKeyExists('instruction', options);\n  helper.ensureKeyExists('attributes', options);\n  helper.ensureKeyExists('text', options);\n  helper.ensureKeyExists('comment', options);\n  helper.ensureKeyExists('cdata', options);\n  helper.ensureKeyExists('doctype', options);\n  helper.ensureKeyExists('type', options);\n  helper.ensureKeyExists('name', options);\n  helper.ensureKeyExists('elements', options);\n  helper.checkFnExists('doctype', options);\n  helper.checkFnExists('instruction', options);\n  helper.checkFnExists('cdata', options);\n  helper.checkFnExists('comment', options);\n  helper.checkFnExists('text', options);\n  helper.checkFnExists('instructionName', options);\n  helper.checkFnExists('elementName', options);\n  helper.checkFnExists('attributeName', options);\n  helper.checkFnExists('attributeValue', options);\n  helper.checkFnExists('attributes', options);\n  helper.checkFnExists('fullTagEmptyElement', options);\n  return options;\n}\n\nfunction writeIndentation(options, depth, firstLine) {\n  return (!firstLine && options.spaces ? '\\n' : '') + Array(depth + 1).join(options.spaces);\n}\n\nfunction writeAttributes(attributes, options, depth) {\n  if (options.ignoreAttributes) {\n    return '';\n  }\n  if ('attributesFn' in options) {\n    attributes = options.attributesFn(attributes, currentElementName, currentElement);\n  }\n  var key, attr, attrName, quote, result = [];\n  for (key in attributes) {\n    if (attributes.hasOwnProperty(key) && attributes[key] !== null && attributes[key] !== undefined) {\n      quote = options.noQuotesForNativeAttributes && typeof attributes[key] !== 'string' ? '' : '\"';\n      attr = '' + attributes[key]; // ensure number and boolean are converted to String\n      attr = attr.replace(/\"/g, '&quot;');\n      attrName = 'attributeNameFn' in options ? options.attributeNameFn(key, attr, currentElementName, currentElement) : key;\n      result.push((options.spaces && options.indentAttributes? writeIndentation(options, depth+1, false) : ' '));\n      result.push(attrName + '=' + quote + ('attributeValueFn' in options ? options.attributeValueFn(attr, key, currentElementName, currentElement) : attr) + quote);\n    }\n  }\n  if (attributes && Object.keys(attributes).length && options.spaces && options.indentAttributes) {\n    result.push(writeIndentation(options, depth, false));\n  }\n  return result.join('');\n}\n\nfunction writeDeclaration(declaration, options, depth) {\n  currentElement = declaration;\n  currentElementName = 'xml';\n  return options.ignoreDeclaration ? '' :  '<?' + 'xml' + writeAttributes(declaration[options.attributesKey], options, depth) + '?>';\n}\n\nfunction writeInstruction(instruction, options, depth) {\n  if (options.ignoreInstruction) {\n    return '';\n  }\n  var key;\n  for (key in instruction) {\n    if (instruction.hasOwnProperty(key)) {\n      break;\n    }\n  }\n  var instructionName = 'instructionNameFn' in options ? options.instructionNameFn(key, instruction[key], currentElementName, currentElement) : key;\n  if (typeof instruction[key] === 'object') {\n    currentElement = instruction;\n    currentElementName = instructionName;\n    return '<?' + instructionName + writeAttributes(instruction[key][options.attributesKey], options, depth) + '?>';\n  } else {\n    var instructionValue = instruction[key] ? instruction[key] : '';\n    if ('instructionFn' in options) instructionValue = options.instructionFn(instructionValue, key, currentElementName, currentElement);\n    return '<?' + instructionName + (instructionValue ? ' ' + instructionValue : '') + '?>';\n  }\n}\n\nfunction writeComment(comment, options) {\n  return options.ignoreComment ? '' : '<!--' + ('commentFn' in options ? options.commentFn(comment, currentElementName, currentElement) : comment) + '-->';\n}\n\nfunction writeCdata(cdata, options) {\n  return options.ignoreCdata ? '' : '<![CDATA[' + ('cdataFn' in options ? options.cdataFn(cdata, currentElementName, currentElement) : cdata.replace(']]>', ']]]]><![CDATA[>')) + ']]>';\n}\n\nfunction writeDoctype(doctype, options) {\n  return options.ignoreDoctype ? '' : '<!DOCTYPE ' + ('doctypeFn' in options ? options.doctypeFn(doctype, currentElementName, currentElement) : doctype) + '>';\n}\n\nfunction writeText(text, options) {\n  if (options.ignoreText) return '';\n  text = '' + text; // ensure Number and Boolean are converted to String\n  text = text.replace(/&amp;/g, '&'); // desanitize to avoid double sanitization\n  text = text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n  return 'textFn' in options ? options.textFn(text, currentElementName, currentElement) : text;\n}\n\nfunction hasContent(element, options) {\n  var i;\n  if (element.elements && element.elements.length) {\n    for (i = 0; i < element.elements.length; ++i) {\n      switch (element.elements[i][options.typeKey]) {\n      case 'text':\n        if (options.indentText) {\n          return true;\n        }\n        break; // skip to next key\n      case 'cdata':\n        if (options.indentCdata) {\n          return true;\n        }\n        break; // skip to next key\n      case 'instruction':\n        if (options.indentInstruction) {\n          return true;\n        }\n        break; // skip to next key\n      case 'doctype':\n      case 'comment':\n      case 'element':\n        return true;\n      default:\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\nfunction writeElement(element, options, depth) {\n  currentElement = element;\n  currentElementName = element.name;\n  var xml = [], elementName = 'elementNameFn' in options ? options.elementNameFn(element.name, element) : element.name;\n  xml.push('<' + elementName);\n  if (element[options.attributesKey]) {\n    xml.push(writeAttributes(element[options.attributesKey], options, depth));\n  }\n  var withClosingTag = element[options.elementsKey] && element[options.elementsKey].length || element[options.attributesKey] && element[options.attributesKey]['xml:space'] === 'preserve';\n  if (!withClosingTag) {\n    if ('fullTagEmptyElementFn' in options) {\n      withClosingTag = options.fullTagEmptyElementFn(element.name, element);\n    } else {\n      withClosingTag = options.fullTagEmptyElement;\n    }\n  }\n  if (withClosingTag) {\n    xml.push('>');\n    if (element[options.elementsKey] && element[options.elementsKey].length) {\n      xml.push(writeElements(element[options.elementsKey], options, depth + 1));\n      currentElement = element;\n      currentElementName = element.name;\n    }\n    xml.push(options.spaces && hasContent(element, options) ? '\\n' + Array(depth + 1).join(options.spaces) : '');\n    xml.push('</' + elementName + '>');\n  } else {\n    xml.push('/>');\n  }\n  return xml.join('');\n}\n\nfunction writeElements(elements, options, depth, firstLine) {\n  return elements.reduce(function (xml, element) {\n    var indent = writeIndentation(options, depth, firstLine && !xml);\n    switch (element.type) {\n    case 'element': return xml + indent + writeElement(element, options, depth);\n    case 'comment': return xml + indent + writeComment(element[options.commentKey], options);\n    case 'doctype': return xml + indent + writeDoctype(element[options.doctypeKey], options);\n    case 'cdata': return xml + (options.indentCdata ? indent : '') + writeCdata(element[options.cdataKey], options);\n    case 'text': return xml + (options.indentText ? indent : '') + writeText(element[options.textKey], options);\n    case 'instruction':\n      var instruction = {};\n      instruction[element[options.nameKey]] = element[options.attributesKey] ? element : element[options.instructionKey];\n      return xml + (options.indentInstruction ? indent : '') + writeInstruction(instruction, options, depth);\n    }\n  }, '');\n}\n\nfunction hasContentCompact(element, options, anyContent) {\n  var key;\n  for (key in element) {\n    if (element.hasOwnProperty(key)) {\n      switch (key) {\n      case options.parentKey:\n      case options.attributesKey:\n        break; // skip to next key\n      case options.textKey:\n        if (options.indentText || anyContent) {\n          return true;\n        }\n        break; // skip to next key\n      case options.cdataKey:\n        if (options.indentCdata || anyContent) {\n          return true;\n        }\n        break; // skip to next key\n      case options.instructionKey:\n        if (options.indentInstruction || anyContent) {\n          return true;\n        }\n        break; // skip to next key\n      case options.doctypeKey:\n      case options.commentKey:\n        return true;\n      default:\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\nfunction writeElementCompact(element, name, options, depth, indent) {\n  currentElement = element;\n  currentElementName = name;\n  var elementName = 'elementNameFn' in options ? options.elementNameFn(name, element) : name;\n  if (typeof element === 'undefined' || element === null || element === '') {\n    return 'fullTagEmptyElementFn' in options && options.fullTagEmptyElementFn(name, element) || options.fullTagEmptyElement ? '<' + elementName + '></' + elementName + '>' : '<' + elementName + '/>';\n  }\n  var xml = [];\n  if (name) {\n    xml.push('<' + elementName);\n    if (typeof element !== 'object') {\n      xml.push('>' + writeText(element,options) + '</' + elementName + '>');\n      return xml.join('');\n    }\n    if (element[options.attributesKey]) {\n      xml.push(writeAttributes(element[options.attributesKey], options, depth));\n    }\n    var withClosingTag = hasContentCompact(element, options, true) || element[options.attributesKey] && element[options.attributesKey]['xml:space'] === 'preserve';\n    if (!withClosingTag) {\n      if ('fullTagEmptyElementFn' in options) {\n        withClosingTag = options.fullTagEmptyElementFn(name, element);\n      } else {\n        withClosingTag = options.fullTagEmptyElement;\n      }\n    }\n    if (withClosingTag) {\n      xml.push('>');\n    } else {\n      xml.push('/>');\n      return xml.join('');\n    }\n  }\n  xml.push(writeElementsCompact(element, options, depth + 1, false));\n  currentElement = element;\n  currentElementName = name;\n  if (name) {\n    xml.push((indent ? writeIndentation(options, depth, false) : '') + '</' + elementName + '>');\n  }\n  return xml.join('');\n}\n\nfunction writeElementsCompact(element, options, depth, firstLine) {\n  var i, key, nodes, xml = [];\n  for (key in element) {\n    if (element.hasOwnProperty(key)) {\n      nodes = isArray(element[key]) ? element[key] : [element[key]];\n      for (i = 0; i < nodes.length; ++i) {\n        switch (key) {\n        case options.declarationKey: xml.push(writeDeclaration(nodes[i], options, depth)); break;\n        case options.instructionKey: xml.push((options.indentInstruction ? writeIndentation(options, depth, firstLine) : '') + writeInstruction(nodes[i], options, depth)); break;\n        case options.attributesKey: case options.parentKey: break; // skip\n        case options.textKey: xml.push((options.indentText ? writeIndentation(options, depth, firstLine) : '') + writeText(nodes[i], options)); break;\n        case options.cdataKey: xml.push((options.indentCdata ? writeIndentation(options, depth, firstLine) : '') + writeCdata(nodes[i], options)); break;\n        case options.doctypeKey: xml.push(writeIndentation(options, depth, firstLine) + writeDoctype(nodes[i], options)); break;\n        case options.commentKey: xml.push(writeIndentation(options, depth, firstLine) + writeComment(nodes[i], options)); break;\n        default: xml.push(writeIndentation(options, depth, firstLine) + writeElementCompact(nodes[i], key, options, depth, hasContentCompact(nodes[i], options)));\n        }\n        firstLine = firstLine && !xml.length;\n      }\n    }\n  }\n  return xml.join('');\n}\n\nmodule.exports = function (js, options) {\n  options = validateOptions(options);\n  var xml = [];\n  currentElement = js;\n  currentElementName = '_root_';\n  if (options.compact) {\n    xml.push(writeElementsCompact(js, options, 0, true));\n  } else {\n    if (js[options.declarationKey]) {\n      xml.push(writeDeclaration(js[options.declarationKey], options, 0));\n    }\n    if (js[options.elementsKey] && js[options.elementsKey].length) {\n      xml.push(writeElements(js[options.elementsKey], options, 0, !xml.length));\n    }\n  }\n  return xml.join('');\n};\n\n},{\"./array-helper\":29,\"./options-helper\":33}],32:[function(require,module,exports){\n(function (Buffer){(function (){\nvar js2xml = require('./js2xml.js');\n\nmodule.exports = function (json, options) {\n  if (json instanceof Buffer) {\n    json = json.toString();\n  }\n  var js = null;\n  if (typeof (json) === 'string') {\n    try {\n      js = JSON.parse(json);\n    } catch (e) {\n      throw new Error('The JSON structure is invalid');\n    }\n  } else {\n    js = json;\n  }\n  return js2xml(js, options);\n};\n\n}).call(this)}).call(this,require(\"buffer\").Buffer)\n\n},{\"./js2xml.js\":31,\"buffer\":3}],33:[function(require,module,exports){\nvar isArray = require('./array-helper').isArray;\n\nmodule.exports = {\n\n  copyOptions: function (options) {\n    var key, copy = {};\n    for (key in options) {\n      if (options.hasOwnProperty(key)) {\n        copy[key] = options[key];\n      }\n    }\n    return copy;\n  },\n\n  ensureFlagExists: function (item, options) {\n    if (!(item in options) || typeof options[item] !== 'boolean') {\n      options[item] = false;\n    }\n  },\n\n  ensureSpacesExists: function (options) {\n    if (!('spaces' in options) || (typeof options.spaces !== 'number' && typeof options.spaces !== 'string')) {\n      options.spaces = 0;\n    }\n  },\n\n  ensureAlwaysArrayExists: function (options) {\n    if (!('alwaysArray' in options) || (typeof options.alwaysArray !== 'boolean' && !isArray(options.alwaysArray))) {\n      options.alwaysArray = false;\n    }\n  },\n\n  ensureKeyExists: function (key, options) {\n    if (!(key + 'Key' in options) || typeof options[key + 'Key'] !== 'string') {\n      options[key + 'Key'] = options.compact ? '_' + key : key;\n    }\n  },\n\n  checkFnExists: function (key, options) {\n    return key + 'Fn' in options;\n  }\n\n};\n\n},{\"./array-helper\":29}],34:[function(require,module,exports){\nvar sax = require('sax');\nvar expat /*= require('node-expat');*/ = { on: function () { }, parse: function () { } };\nvar helper = require('./options-helper');\nvar isArray = require('./array-helper').isArray;\n\nvar options;\nvar pureJsParser = true;\nvar currentElement;\n\nfunction validateOptions(userOptions) {\n  options = helper.copyOptions(userOptions);\n  helper.ensureFlagExists('ignoreDeclaration', options);\n  helper.ensureFlagExists('ignoreInstruction', options);\n  helper.ensureFlagExists('ignoreAttributes', options);\n  helper.ensureFlagExists('ignoreText', options);\n  helper.ensureFlagExists('ignoreComment', options);\n  helper.ensureFlagExists('ignoreCdata', options);\n  helper.ensureFlagExists('ignoreDoctype', options);\n  helper.ensureFlagExists('compact', options);\n  helper.ensureFlagExists('alwaysChildren', options);\n  helper.ensureFlagExists('addParent', options);\n  helper.ensureFlagExists('trim', options);\n  helper.ensureFlagExists('nativeType', options);\n  helper.ensureFlagExists('nativeTypeAttributes', options);\n  helper.ensureFlagExists('sanitize', options);\n  helper.ensureFlagExists('instructionHasAttributes', options);\n  helper.ensureFlagExists('captureSpacesBetweenElements', options);\n  helper.ensureAlwaysArrayExists(options);\n  helper.ensureKeyExists('declaration', options);\n  helper.ensureKeyExists('instruction', options);\n  helper.ensureKeyExists('attributes', options);\n  helper.ensureKeyExists('text', options);\n  helper.ensureKeyExists('comment', options);\n  helper.ensureKeyExists('cdata', options);\n  helper.ensureKeyExists('doctype', options);\n  helper.ensureKeyExists('type', options);\n  helper.ensureKeyExists('name', options);\n  helper.ensureKeyExists('elements', options);\n  helper.ensureKeyExists('parent', options);\n  helper.checkFnExists('doctype', options);\n  helper.checkFnExists('instruction', options);\n  helper.checkFnExists('cdata', options);\n  helper.checkFnExists('comment', options);\n  helper.checkFnExists('text', options);\n  helper.checkFnExists('instructionName', options);\n  helper.checkFnExists('elementName', options);\n  helper.checkFnExists('attributeName', options);\n  helper.checkFnExists('attributeValue', options);\n  helper.checkFnExists('attributes', options);\n  return options;\n}\n\nfunction nativeType(value) {\n  var nValue = Number(value);\n  if (!isNaN(nValue)) {\n    return nValue;\n  }\n  var bValue = value.toLowerCase();\n  if (bValue === 'true') {\n    return true;\n  } else if (bValue === 'false') {\n    return false;\n  }\n  return value;\n}\n\nfunction addField(type, value) {\n  var key;\n  if (options.compact) {\n    if (\n      !currentElement[options[type + 'Key']] &&\n      (isArray(options.alwaysArray) ? options.alwaysArray.indexOf(options[type + 'Key']) !== -1 : options.alwaysArray)\n    ) {\n      currentElement[options[type + 'Key']] = [];\n    }\n    if (currentElement[options[type + 'Key']] && !isArray(currentElement[options[type + 'Key']])) {\n      currentElement[options[type + 'Key']] = [currentElement[options[type + 'Key']]];\n    }\n    if (type + 'Fn' in options && typeof value === 'string') {\n      value = options[type + 'Fn'](value, currentElement);\n    }\n    if (type === 'instruction' && ('instructionFn' in options || 'instructionNameFn' in options)) {\n      for (key in value) {\n        if (value.hasOwnProperty(key)) {\n          if ('instructionFn' in options) {\n            value[key] = options.instructionFn(value[key], key, currentElement);\n          } else {\n            var temp = value[key];\n            delete value[key];\n            value[options.instructionNameFn(key, temp, currentElement)] = temp;\n          }\n        }\n      }\n    }\n    if (isArray(currentElement[options[type + 'Key']])) {\n      currentElement[options[type + 'Key']].push(value);\n    } else {\n      currentElement[options[type + 'Key']] = value;\n    }\n  } else {\n    if (!currentElement[options.elementsKey]) {\n      currentElement[options.elementsKey] = [];\n    }\n    var element = {};\n    element[options.typeKey] = type;\n    if (type === 'instruction') {\n      for (key in value) {\n        if (value.hasOwnProperty(key)) {\n          break;\n        }\n      }\n      element[options.nameKey] = 'instructionNameFn' in options ? options.instructionNameFn(key, value, currentElement) : key;\n      if (options.instructionHasAttributes) {\n        element[options.attributesKey] = value[key][options.attributesKey];\n        if ('instructionFn' in options) {\n          element[options.attributesKey] = options.instructionFn(element[options.attributesKey], key, currentElement);\n        }\n      } else {\n        if ('instructionFn' in options) {\n          value[key] = options.instructionFn(value[key], key, currentElement);\n        }\n        element[options.instructionKey] = value[key];\n      }\n    } else {\n      if (type + 'Fn' in options) {\n        value = options[type + 'Fn'](value, currentElement);\n      }\n      element[options[type + 'Key']] = value;\n    }\n    if (options.addParent) {\n      element[options.parentKey] = currentElement;\n    }\n    currentElement[options.elementsKey].push(element);\n  }\n}\n\nfunction manipulateAttributes(attributes) {\n  if ('attributesFn' in options && attributes) {\n    attributes = options.attributesFn(attributes, currentElement);\n  }\n  if ((options.trim || 'attributeValueFn' in options || 'attributeNameFn' in options || options.nativeTypeAttributes) && attributes) {\n    var key;\n    for (key in attributes) {\n      if (attributes.hasOwnProperty(key)) {\n        if (options.trim) attributes[key] = attributes[key].trim();\n        if (options.nativeTypeAttributes) {\n          attributes[key] = nativeType(attributes[key]);\n        }\n        if ('attributeValueFn' in options) attributes[key] = options.attributeValueFn(attributes[key], key, currentElement);\n        if ('attributeNameFn' in options) {\n          var temp = attributes[key];\n          delete attributes[key];\n          attributes[options.attributeNameFn(key, attributes[key], currentElement)] = temp;\n        }\n      }\n    }\n  }\n  return attributes;\n}\n\nfunction onInstruction(instruction) {\n  var attributes = {};\n  if (instruction.body && (instruction.name.toLowerCase() === 'xml' || options.instructionHasAttributes)) {\n    var attrsRegExp = /([\\w:-]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|(\\w+))\\s*/g;\n    var match;\n    while ((match = attrsRegExp.exec(instruction.body)) !== null) {\n      attributes[match[1]] = match[2] || match[3] || match[4];\n    }\n    attributes = manipulateAttributes(attributes);\n  }\n  if (instruction.name.toLowerCase() === 'xml') {\n    if (options.ignoreDeclaration) {\n      return;\n    }\n    currentElement[options.declarationKey] = {};\n    if (Object.keys(attributes).length) {\n      currentElement[options.declarationKey][options.attributesKey] = attributes;\n    }\n    if (options.addParent) {\n      currentElement[options.declarationKey][options.parentKey] = currentElement;\n    }\n  } else {\n    if (options.ignoreInstruction) {\n      return;\n    }\n    if (options.trim) {\n      instruction.body = instruction.body.trim();\n    }\n    var value = {};\n    if (options.instructionHasAttributes && Object.keys(attributes).length) {\n      value[instruction.name] = {};\n      value[instruction.name][options.attributesKey] = attributes;\n    } else {\n      value[instruction.name] = instruction.body;\n    }\n    addField('instruction', value);\n  }\n}\n\nfunction onStartElement(name, attributes) {\n  var element;\n  if (typeof name === 'object') {\n    attributes = name.attributes;\n    name = name.name;\n  }\n  attributes = manipulateAttributes(attributes);\n  if ('elementNameFn' in options) {\n    name = options.elementNameFn(name, currentElement);\n  }\n  if (options.compact) {\n    element = {};\n    if (!options.ignoreAttributes && attributes && Object.keys(attributes).length) {\n      element[options.attributesKey] = {};\n      var key;\n      for (key in attributes) {\n        if (attributes.hasOwnProperty(key)) {\n          element[options.attributesKey][key] = attributes[key];\n        }\n      }\n    }\n    if (\n      !(name in currentElement) &&\n      (isArray(options.alwaysArray) ? options.alwaysArray.indexOf(name) !== -1 : options.alwaysArray)\n    ) {\n      currentElement[name] = [];\n    }\n    if (currentElement[name] && !isArray(currentElement[name])) {\n      currentElement[name] = [currentElement[name]];\n    }\n    if (isArray(currentElement[name])) {\n      currentElement[name].push(element);\n    } else {\n      currentElement[name] = element;\n    }\n  } else {\n    if (!currentElement[options.elementsKey]) {\n      currentElement[options.elementsKey] = [];\n    }\n    element = {};\n    element[options.typeKey] = 'element';\n    element[options.nameKey] = name;\n    if (!options.ignoreAttributes && attributes && Object.keys(attributes).length) {\n      element[options.attributesKey] = attributes;\n    }\n    if (options.alwaysChildren) {\n      element[options.elementsKey] = [];\n    }\n    currentElement[options.elementsKey].push(element);\n  }\n  element[options.parentKey] = currentElement; // will be deleted in onEndElement() if !options.addParent\n  currentElement = element;\n}\n\nfunction onText(text) {\n  if (options.ignoreText) {\n    return;\n  }\n  if (!text.trim() && !options.captureSpacesBetweenElements) {\n    return;\n  }\n  if (options.trim) {\n    text = text.trim();\n  }\n  if (options.nativeType) {\n    text = nativeType(text);\n  }\n  if (options.sanitize) {\n    text = text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n  }\n  addField('text', text);\n}\n\nfunction onComment(comment) {\n  if (options.ignoreComment) {\n    return;\n  }\n  if (options.trim) {\n    comment = comment.trim();\n  }\n  addField('comment', comment);\n}\n\nfunction onEndElement(name) {\n  var parentElement = currentElement[options.parentKey];\n  if (!options.addParent) {\n    delete currentElement[options.parentKey];\n  }\n  currentElement = parentElement;\n}\n\nfunction onCdata(cdata) {\n  if (options.ignoreCdata) {\n    return;\n  }\n  if (options.trim) {\n    cdata = cdata.trim();\n  }\n  addField('cdata', cdata);\n}\n\nfunction onDoctype(doctype) {\n  if (options.ignoreDoctype) {\n    return;\n  }\n  doctype = doctype.replace(/^ /, '');\n  if (options.trim) {\n    doctype = doctype.trim();\n  }\n  addField('doctype', doctype);\n}\n\nfunction onError(error) {\n  error.note = error; //console.error(error);\n}\n\nmodule.exports = function (xml, userOptions) {\n\n  var parser = pureJsParser ? sax.parser(true, {}) : parser = new expat.Parser('UTF-8');\n  var result = {};\n  currentElement = result;\n\n  options = validateOptions(userOptions);\n\n  if (pureJsParser) {\n    parser.opt = {strictEntities: true};\n    parser.onopentag = onStartElement;\n    parser.ontext = onText;\n    parser.oncomment = onComment;\n    parser.onclosetag = onEndElement;\n    parser.onerror = onError;\n    parser.oncdata = onCdata;\n    parser.ondoctype = onDoctype;\n    parser.onprocessinginstruction = onInstruction;\n  } else {\n    parser.on('startElement', onStartElement);\n    parser.on('text', onText);\n    parser.on('comment', onComment);\n    parser.on('endElement', onEndElement);\n    parser.on('error', onError);\n    //parser.on('startCdata', onStartCdata);\n    //parser.on('endCdata', onEndCdata);\n    //parser.on('entityDecl', onEntityDecl);\n  }\n\n  if (pureJsParser) {\n    parser.write(xml).close();\n  } else {\n    if (!parser.parse(xml)) {\n      throw new Error('XML parsing error: ' + parser.getError());\n    }\n  }\n\n  if (result[options.elementsKey]) {\n    var temp = result[options.elementsKey];\n    delete result[options.elementsKey];\n    result[options.elementsKey] = temp;\n    delete result.text;\n  }\n\n  return result;\n\n};\n\n},{\"./array-helper\":29,\"./options-helper\":33,\"sax\":10}],35:[function(require,module,exports){\nvar helper = require('./options-helper');\nvar xml2js = require('./xml2js');\n\nfunction validateOptions (userOptions) {\n  var options = helper.copyOptions(userOptions);\n  helper.ensureSpacesExists(options);\n  return options;\n}\n\nmodule.exports = function(xml, userOptions) {\n  var options, js, json, parentKey;\n  options = validateOptions(userOptions);\n  js = xml2js(xml, options);\n  parentKey = 'compact' in options && options.compact ? '_parent' : 'parent';\n  // parentKey = ptions.compact ? '_parent' : 'parent'; // consider this\n  if ('addParent' in options && options.addParent) {\n    json = JSON.stringify(js, function (k, v) { return k === parentKey? '_' : v; }, options.spaces);\n  } else {\n    json = JSON.stringify(js, null, options.spaces);\n  }\n  return json.replace(/\\u2028/g, '\\\\u2028').replace(/\\u2029/g, '\\\\u2029');\n};\n\n},{\"./options-helper\":33,\"./xml2js\":34}],36:[function(require,module,exports){\n// color value ranges are all 0 to 1\n\n// input: hue,saturation,lightness in [0,1] - output: red,green,blue in [0,1]\nvar Color, component_names, hsl2rgb;\n\nhsl2rgb = function(hue, saturation, lightness) {\n  var a, f;\n  a = saturation * Math.min(lightness, 1 - lightness);\n  f = function(n, k = (n + hue * 12) % 12) {\n    return lightness - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n  };\n  return [f(0), f(8), f(4)].map(function(component) {\n    return component;\n  });\n};\n\ncomponent_names = [\"red\", \"green\", \"blue\", \"hue\", \"saturation\", \"lightness\", \"value\", \"cyan\", \"magenta\", \"yellow\", \"key\", \"alpha\", \"x\", \"y\", \"z\", \"l\", \"a\", \"b\"];\n\nmodule.exports = Color = class Color {\n  constructor(options) {\n    var c, component_name, cyan, i, j, key, l, len, len1, len2, magenta, powed, ref, ref1, reject_args, rgb, white_D50, x, xyz, y, yellow, z;\n    // @TODO: don't assign all of {@red, @green, @blue, @hue, @saturation, @value, @lightness} right away\n    // only assign the properties that are used\n    ({red: this.red, green: this.green, blue: this.blue, hue: this.hue, saturation: this.saturation, value: this.value, lightness: this.lightness, cyan, magenta, yellow, key, alpha: this.alpha, name: this.name} = options);\n    for (i = 0, len = component_names.length; i < len; i++) {\n      component_name = component_names[i];\n      if (!(options[component_name] != null)) {\n        continue;\n      }\n      if ((!isFinite(options[component_name])) || (typeof options[component_name] !== \"number\")) {\n        throw new TypeError(`Color component option ${component_name} is not a finite number: ${JSON.stringify(options[component_name])}`);\n      }\n      if (options[component_name] < 0 || options[component_name] > 1) {\n        throw new TypeError(`Color component option ${component_name} outside range of [0,1]: ${options[component_name]}`);\n      }\n    }\n    reject_args = function() {\n      throw new TypeError(`Color constructor must be called with {red,green,blue} or {hue,saturation,value} or {hue,saturation,lightness} or {cyan,magenta,yellow,key} or {x,y,z} or {l,a,b}, ${(function() {\n        try {\n          return `got ${JSON.stringify(options)}`;\n        } catch (error) {\n          return \"got something that couldn't be displayed with JSON.stringify for this error message\";\n        }\n      })()}`);\n    };\n    if ((this.red != null) && (this.green != null) && (this.blue != null)) {\n\n    // Red Green Blue\n    // (no conversions needed here)\n    } else if ((this.hue != null) && (this.saturation != null)) {\n      // Cylindrical Color Space\n      if (this.value != null) {\n        // Hue Saturation Value\n        this.lightness = (2 - this.saturation) * this.value / 2;\n        this.saturation = this.saturation * this.value / (this.lightness < 0.5 ? this.lightness * 2 : 2 - this.lightness * 2);\n        if (isNaN(this.saturation)) {\n          this.saturation = 0;\n        }\n      } else if (this.lightness != null) {\n\n      // Hue Saturation Lightness\n      // (no conversions needed here)\n      } else if (options.brightness != null) {\n        throw new TypeError(\"{hue, saturation, brightness} not supported. Use {hue, saturation, value} instead for an equivalent color space\");\n      } else {\n        reject_args();\n      }\n      [this.red, this.green, this.blue] = hsl2rgb(this.hue, this.saturation, this.lightness);\n    } else if ((cyan != null) && (magenta != null) && (yellow != null) && (key != null)) {\n      // Cyan Magenta Yellow blacK\n      throw new Error(\"CMYK color space is not currently supported\");\n      this.red = 1 - Math.min(1, cyan * (1 - key) + key);\n      this.green = 1 - Math.min(1, magenta * (1 - key) + key);\n      this.blue = 1 - Math.min(1, yellow * (1 - key) + key);\n    } else {\n      // TODO: rename l -> lightness?\n      // a/b -> aChroma/bChroma? aChrominance/bChrominance??\n      if ((options.l != null) && (options.a != null) && (options.b != null)) {\n        throw new Error(\"L*a*b* color space is not currently supported\");\n        white_D50 = {\n          x: 96.422,\n          y: 100.000,\n          z: 82.521\n        };\n        // white_D65 =\n        // \tx: 95.047\n        // \ty: 100.000\n        // \tz: 108.883\n        options.a -= 1 / 2;\n        options.b -= 1 / 2;\n        // TODO: Get this actually working, using Information and Math instead of Fiddling Around\n        // It would be nice if I could find some XYZ palettes,\n        // since the LAB handling depends on the XYZ handling.\n        options.l = Math.pow(options.l, 2); // messing around\n        options.l *= 15; // messing around\n        options.a *= 80; // messing around\n        options.b *= 80; // messing around\n        xyz = {\n          y: (options.l + 16) / 116\n        };\n        xyz.x = options.a / 500 + xyz.y;\n        xyz.z = xyz.y - options.b / 200;\n        ref = \"xyz\";\n        for (j = 0, len1 = ref.length; j < len1; j++) {\n          c = ref[j];\n          powed = Math.pow(xyz[c], 3);\n          if (powed > 0.008856) {\n            xyz[c] = powed;\n          } else {\n            xyz[c] = (xyz[c] - 16 / 116) / 7.787;\n          }\n          // set {x, y, z} options for fallthrough\n          options[c] = xyz[c] * white_D50[c];\n        }\n      }\n      // fallthrough\n      if ((options.x != null) && (options.y != null) && (options.z != null)) {\n        throw new Error(\"XYZ color space is not currently supported\");\n        ({x, y, z} = options);\n        rgb = {\n          r: x * 3.2406 + y * -1.5372 + z * -0.4986,\n          g: x * -0.9689 + y * 1.8758 + z * 0.0415,\n          b: x * 0.0557 + y * -0.2040 + z * 1.0570\n        };\n        ref1 = \"rgb\";\n        \n        // r =  3.2404542*x - 1.5371385*y - 0.4985314*z\n        // g = -0.9692660*x + 1.8760108*y + 0.0415560*z\n        // b =  0.0556434*x - 0.2040259*y + 1.0572252*z\n        for (l = 0, len2 = ref1.length; l < len2; l++) {\n          c = ref1[l];\n          if (rgb[c] < 0) {\n            rgb[c] = 0;\n          }\n          if (rgb[c] > 0.0031308) {\n            rgb[c] = 1.055 * Math.pow(rgb[c], 1 / 2.4) - 0.055;\n          } else {\n            rgb[c] *= 12.92;\n          }\n        }\n        this.red = rgb.r;\n        this.green = rgb.g;\n        this.blue = rgb.b;\n      } else {\n        reject_args();\n      }\n    }\n  }\n\n  toString() {\n    if (this.hue != null) {\n      // Hue Saturation Lightness\n      if (this.alpha != null) {\n        return `hsla(${this.hue * 360}, ${this.saturation * 100}%, ${this.lightness * 100}%, ${this.alpha})`;\n      } else {\n        return `hsl(${this.hue * 360}, ${this.saturation * 100}%, ${this.lightness * 100}%)`;\n      }\n    } else if (this.red != null) {\n      // Red Green Blue\n      if (this.alpha != null) {\n        return `rgba(${this.red * 255}, ${this.green * 255}, ${this.blue * 255}, ${this.alpha})`;\n      } else {\n        return `rgb(${this.red * 255}, ${this.green * 255}, ${this.blue * 255})`;\n      }\n    }\n  }\n\n  static is(colorA, colorB, epsilon = 0.0001) {\n    var ref, ref1;\n    return Math.abs(colorA.red - colorB.red) < epsilon && Math.abs(colorA.green - colorB.green) < epsilon && Math.abs(colorA.blue - colorB.blue) < epsilon && Math.abs(((ref = colorA.alpha) != null ? ref : 1) - ((ref1 = colorB.alpha) != null ? ref1 : 1)) < epsilon;\n  }\n\n};\n\n\n},{}],37:[function(require,module,exports){\nvar Color, Palette, component_names;\n\nColor = require(\"./Color\");\n\ncomponent_names = [\"r\", \"g\", \"b\", \"h\", \"s\", \"l\", \"v\", \"x\", \"y\", \"z\", \"a\", \"b\", \"c\", \"m\", \"y\", \"k\", \"red\", \"green\", \"blue\", \"hue\", \"saturation\", \"lightness\", \"value\", \"cyan\", \"magenta\", \"yellow\", \"key\", \"alpha\"];\n\nmodule.exports = Palette = class Palette extends Array {\n  constructor(...args) {\n    super(...args);\n    this.name = void 0;\n    this.description = void 0;\n    this.numberOfColumns = void 0;\n    this.geometrySpecifiedByFile = void 0;\n  }\n\n  add(o) {\n    var component_name, i, len, new_color;\n    for (i = 0, len = component_names.length; i < len; i++) {\n      component_name = component_names[i];\n      if (!(o[component_name] != null)) {\n        continue;\n      }\n      if ((!isFinite(o[component_name])) || (typeof o[component_name] !== \"number\")) {\n        throw new TypeError(`palette.add() component option ${component_name} is not a finite number: ${JSON.stringify(o[component_name])}`);\n      }\n      if (o[component_name] < 0 || o[component_name] > 1) {\n        throw new TypeError(`palette.add() component option ${component_name} outside range of [0,1]: ${o[component_name]}`);\n      }\n    }\n    new_color = o instanceof Color ? o : new Color(o);\n    return this.push(new_color);\n  }\n\n};\n\n/*\nguess_dimensions: ->\n * TODO: get this working properly and enable\n\n\tlen = @length\n\tcandidate_dimensions = []\n\tfor numberOfColumns in [0..len]\n\t\tn_rows = len / numberOfColumns\n\t\tif n_rows is Math.round n_rows\n\t\t\tcandidate_dimensions.push [n_rows, numberOfColumns]\n\n\tsquarest = [0, 3495093]\n\tfor cd in candidate_dimensions\n\t\tif Math.abs(cd[0] - cd[1]) < Math.abs(squarest[0] - squarest[1])\n\t\t\tsquarest = cd\n\n\t@numberOfColumns = squarest[1]\n */\n\n\n},{\"./Color\":36}],38:[function(require,module,exports){\nvar MAX_UINT16, MAX_UINT32, Palette, PhotoshopColorSpace, get_utf_16_string, jDataView;\n\njDataView = require(\"jdataview\");\n\nPalette = require(\"../Palette\");\n\nMAX_UINT16 = 2 ** 16 - 1;\n\nMAX_UINT32 = 2 ** 32 - 1;\n\nPhotoshopColorSpace = Object.freeze({\n  RGB: 0,\n  HSB: 1, // also known as HSV\n  CMYK: 2,\n  PANTONE: 3, // brand name\n  FOCOLTONE: 4, // brand name\n  TRUMATCH: 5, // brand name\n  TOYO: 6, // brand name\n  LAB: 7, // CIELAB D50 \n  GRAYSCALE: 8,\n  WIDE_CMYK: 9,\n  HKS: 10, // brand name\n  DIC: 11, // brand name\n  TOTAL_INK: 12, // brand name\n  MONITOR_RGB: 13,\n  DUOTONE: 14,\n  OPACITY: 15,\n  WEB: 16,\n  GRAY_FLOAT: 17,\n  RGB_FLOAT: 18,\n  OPACITY_FLOAT: 19,\n  0: \"RGB\",\n  1: \"HSB\", // also known as HSV\n  2: \"CMYK\",\n  3: \"PANTONE\", // brand name\n  4: \"FOCOLTONE\", // brand name\n  5: \"TRUMATCH\", // brand name\n  6: \"TOYO\", // brand name\n  7: \"LAB\", // CIELAB D50 \n  8: \"GRAYSCALE\",\n  9: \"WIDE_CMYK\",\n  10: \"HKS\", // brand name\n  11: \"DIC\", // brand name\n  12: \"TOTAL_INK\", // brand name\n  13: \"MONITOR_RGB\",\n  14: \"DUOTONE\",\n  15: \"OPACITY\",\n  16: \"WEB\",\n  17: \"GRAY_FLOAT\",\n  18: \"RGB_FLOAT\",\n  19: \"OPACITY_FLOAT\"\n});\n\nget_utf_16_string = function(view, length, including_terminator) {\n  var i, ref, string;\n  if (including_terminator) {\n    length -= 1;\n  }\n  string = \"\";\n  for (i = 0, ref = length; (0 <= ref ? i < ref : i > ref); 0 <= ref ? i++ : i--) {\n    string += String.fromCharCode(view.getUint16());\n  }\n  if (including_terminator) {\n    view.getUint16(); // should be 0x0000\n  }\n  return string;\n};\n\nmodule.exports.read_adobe_color_swatch = function({data}) {\n  var aco_v1_version, aco_v2_colors_offset, aco_v2_number_of_colors, aco_v2_offset, aco_v2_version, header_size, i, j, number_of_colors, palette, read_color, ref, ref1, view;\n  // ACO (Adobe Color Swatch)\n  palette = new Palette();\n  view = new jDataView(data);\n  read_color = function(aco_v2) {\n    var color_space, length_including_terminator, name, w, x, y, z;\n    color_space = view.getUint16();\n    w = view.getUint16() / MAX_UINT16;\n    x = view.getUint16() / MAX_UINT16;\n    y = view.getUint16() / MAX_UINT16;\n    z = view.getUint16() / MAX_UINT16;\n    if (aco_v2) {\n      view.getUint16(); // should be 0x0000\n      length_including_terminator = view.getUint16();\n      name = get_utf_16_string(view, length_including_terminator, true);\n    } else {\n      name = void 0;\n    }\n    switch (color_space) {\n      case PhotoshopColorSpace.RGB:\n        return palette.add({\n          red: w,\n          green: x,\n          blue: y,\n          name: name\n        });\n      case PhotoshopColorSpace.HSB:\n        return palette.add({\n          hue: w,\n          saturation: x,\n          value: y,\n          name: name\n        });\n      case PhotoshopColorSpace.CMYK:\n      case PhotoshopColorSpace.WIDE_CMYK:\n        return palette.add({\n          cyan: w,\n          magenta: x,\n          yellow: y,\n          key: z,\n          name: name\n        });\n      case PhotoshopColorSpace.LAB:\n        return palette.add({\n          l: w,\n          a: x,\n          b: y,\n          name: name\n        });\n      case PhotoshopColorSpace.GRAYSCALE:\n        return palette.add({\n          red: w,\n          green: w,\n          blue: w,\n          name: name\n        });\n    }\n  };\n  aco_v1_version = view.getUint16();\n  number_of_colors = view.getUint16();\n  if (aco_v1_version !== 1) {\n    throw new Error(\"Not an Adobe Color Swatch file\");\n  }\n  header_size = 4; // ACO v1 or v2 header, same size\n  aco_v2_offset = header_size + number_of_colors * (5 * 2);\n  aco_v2_colors_offset = aco_v2_offset + header_size;\n  if (view.byteLength <= aco_v2_offset) {\n// ACO v1 only file\n    for (i = 0, ref = number_of_colors; (0 <= ref ? i < ref : i > ref); 0 <= ref ? i++ : i--) {\n      read_color(false);\n    }\n    return palette;\n  }\n  view.seek(aco_v2_offset);\n  aco_v2_version = view.getUint16();\n  aco_v2_number_of_colors = view.getUint16();\n  // view.seek(aco_v2_colors_offset)\n  if (aco_v2_version !== 2) {\n    throw new Error(\"Not an Adobe Color Swatch file v2\");\n  }\n  if (aco_v2_number_of_colors !== number_of_colors) {\n    throw new Error(\"Number of colors mismatch between ACO v1 and v2 sections\");\n  }\n  for (j = 0, ref1 = number_of_colors; (0 <= ref1 ? j < ref1 : j > ref1); 0 <= ref1 ? j++ : j--) {\n    read_color(true);\n  }\n  return palette;\n};\n\nmodule.exports.write_adobe_color_swatch = function(palette) {\n  var aco_v1_colors, aco_v2_colors, array_buffer, color, file_size, file_view, i, j, len, len1, write_color;\n  // ACO (Adobe Color Swatch)\n  write_color = function(color, aco_v2) {\n    var char, color_space, color_view, component, components, i, j, len, len1, name, ref, size;\n    name = (ref = color.name) != null ? ref : color.toString();\n    color_space = PhotoshopColorSpace.RGB;\n    components = [\n      color.red,\n      color.green,\n      color.blue,\n      0 // always 4 long\n    ];\n    size = 2 + components.length * 2; // color space // components\n    if (aco_v2) {\n      size += 2 + 2 + (name.length + 1) * 2; // padding/reserved // name length // name + terminator\n    }\n    color_view = new jDataView(size);\n    color_view.writeUint16(color_space);\n    for (i = 0, len = components.length; i < len; i++) {\n      component = components[i];\n      color_view.writeUint16(component * MAX_UINT16);\n    }\n    if (aco_v2) {\n      color_view.writeUint16(0); // padding/reserved\n      color_view.writeUint16(name.length + 1);\n      for (j = 0, len1 = name.length; j < len1; j++) {\n        char = name[j];\n        color_view.writeUint16(char.charCodeAt(0));\n      }\n      color_view.writeUint16(0); // terminator\n    }\n    return color_view.buffer;\n  };\n  aco_v1_colors = (function() {\n    var i, len, results;\n    results = [];\n    for (i = 0, len = palette.length; i < len; i++) {\n      color = palette[i];\n      results.push(write_color(color, false));\n    }\n    return results;\n  })();\n  aco_v2_colors = (function() {\n    var i, len, results;\n    results = [];\n    for (i = 0, len = palette.length; i < len; i++) {\n      color = palette[i];\n      results.push(write_color(color, true));\n    }\n    return results;\n  })();\n  // aco v1\n  file_size = 2 + 2 + aco_v1_colors.reduce((function(size_sum, array_buffer) { // version number // number of colors\n    return size_sum + array_buffer.byteLength;\n  // # aco v2\n  }), 0) + 2 + 2 + aco_v2_colors.reduce((function(size_sum, array_buffer) { // version number // number of colors\n    return size_sum + array_buffer.byteLength;\n  }), 0);\n  file_view = new jDataView(file_size);\n  // aco v1\n  file_view.writeUint16(1); // version number for aco v1 section\n  file_view.writeUint16(palette.length); // number of colors\n  for (i = 0, len = aco_v1_colors.length; i < len; i++) {\n    array_buffer = aco_v1_colors[i];\n    file_view.writeBytes(new Uint8Array(array_buffer));\n  }\n  // aco v2\n  file_view.writeUint16(2); // version number for aco v2 section\n  file_view.writeUint16(palette.length); // number of colors\n  for (j = 0, len1 = aco_v2_colors.length; j < len1; j++) {\n    array_buffer = aco_v2_colors[j];\n    file_view.writeBytes(new Uint8Array(array_buffer));\n  }\n  return file_view.buffer;\n};\n\nmodule.exports.read_adobe_swatch_exchange = function({data}) {\n  var BLOCK_TYPE_COLOR, BLOCK_TYPE_GROUP_END, BLOCK_TYPE_GROUP_START, COLOR_MODE_GLOBAL, COLOR_MODE_NORMAL, COLOR_MODE_SPOT, COLOR_SPACE_CMYK, COLOR_SPACE_GRAYSCALE, COLOR_SPACE_RGB, block_end_pos, block_length, block_type, color_mode, color_space, gray, i, name, name_length_including_terminator, number_of_blocks, palette, ref, version, view, within_groups;\n  // ASE (Adobe Swatch Exchange)\n  palette = new Palette();\n  view = new jDataView(data);\n  if (view.getString(4) !== \"ASEF\") {\n    throw new Error(\"Not an Adobe Swatch Exchange file\");\n  }\n  version = view.getUint32();\n  // if version isnt 1 \n  // \tthrow new Error \"Unknown Adobe Swatch Exchange format version #{version}\"\n  number_of_blocks = view.getUint32();\n  BLOCK_TYPE_GROUP_START = 0xc001;\n  BLOCK_TYPE_GROUP_END = 0xc002;\n  BLOCK_TYPE_COLOR = 0x0001;\n  COLOR_SPACE_CMYK = \"CMYK\";\n  COLOR_SPACE_RGB = \"RGB \";\n  COLOR_SPACE_GRAYSCALE = \"GRAY\";\n  COLOR_MODE_GLOBAL = 0;\n  COLOR_MODE_SPOT = 1;\n  COLOR_MODE_NORMAL = 2;\n  within_groups = [];\n  for (i = 0, ref = number_of_blocks; (0 <= ref ? i < ref : i > ref); 0 <= ref ? i++ : i--) {\n    block_type = view.getUint16();\n    block_length = view.getUint32();\n    block_end_pos = view.tell() + block_length;\n    switch (block_type) {\n      case BLOCK_TYPE_GROUP_START:\n        name_length_including_terminator = view.getUint16();\n        name = get_utf_16_string(view, name_length_including_terminator, true);\n        within_groups.push({name});\n        break;\n      case BLOCK_TYPE_GROUP_END:\n        within_groups.pop();\n        break;\n      case BLOCK_TYPE_COLOR:\n        name_length_including_terminator = view.getUint16();\n        name = get_utf_16_string(view, name_length_including_terminator, true);\n        color_space = view.getString(4);\n        switch (color_space) {\n          case COLOR_SPACE_CMYK:\n            palette.add({\n              cyan: view.getFloat32(),\n              magenta: view.getFloat32(),\n              yellow: view.getFloat32(),\n              key: view.getFloat32(),\n              name: name\n            });\n            break;\n          case COLOR_SPACE_RGB:\n            palette.add({\n              red: view.getFloat32(),\n              green: view.getFloat32(),\n              blue: view.getFloat32(),\n              name: name\n            });\n            break;\n          case COLOR_SPACE_GRAYSCALE:\n            gray = view.getFloat32();\n            palette.add({\n              red: gray,\n              green: gray,\n              blue: gray,\n              name: name\n            });\n        }\n        color_mode = view.getUint16();\n    }\n    view.seek(block_end_pos);\n  }\n  return palette;\n};\n\nmodule.exports.write_adobe_swatch_exchange = function(palette) {\n  var BLOCK_TYPE_COLOR, BLOCK_TYPE_GROUP_END, BLOCK_TYPE_GROUP_START, COLOR_MODE_GLOBAL, COLOR_MODE_NORMAL, COLOR_MODE_SPOT, COLOR_SPACE_CMYK, COLOR_SPACE_GRAYSCALE, COLOR_SPACE_RGB, block, block_size, block_type, block_view, blocks, body_size, char, color, file_size, i, j, k, len, len1, len2, name, ref, size_of_all_blocks, version, view;\n  // ASE (Adobe Swatch Exchange)\n\n  // TODO: DRY\n  BLOCK_TYPE_GROUP_START = 0xc001;\n  BLOCK_TYPE_GROUP_END = 0xc002;\n  BLOCK_TYPE_COLOR = 0x0001;\n  COLOR_SPACE_CMYK = \"CMYK\";\n  COLOR_SPACE_RGB = \"RGB \";\n  COLOR_SPACE_GRAYSCALE = \"GRAY\";\n  COLOR_MODE_GLOBAL = 0;\n  COLOR_MODE_SPOT = 1;\n  COLOR_MODE_NORMAL = 2;\n  blocks = [];\n  size_of_all_blocks = 0;\n  for (i = 0, len = palette.length; i < len; i++) {\n    color = palette[i];\n    name = (ref = color.name) != null ? ref : color.toString();\n    block_type = BLOCK_TYPE_COLOR;\n    body_size = 2 + (name.length + 1) * 2 + 4 + (3 * 4) + 2; // name length +  +  +  // name (zero codepoint terminated and 2 bytes per codepoint) // color space ID // color components (3 float32 values) // color type\n    block_size = 2 + 4 + body_size; // block type // body size // body\n    block_view = jDataView(block_size);\n    block_view.writeUint16(block_type);\n    block_view.writeUint32(body_size);\n    block_view.writeUint16(name.length + 1);\n    for (j = 0, len1 = name.length; j < len1; j++) {\n      char = name[j];\n      block_view.writeUint16(char.charCodeAt(0));\n    }\n    block_view.writeUint16(0); // terminator\n    block_view.writeString(COLOR_SPACE_RGB);\n    block_view.writeFloat32(color.red);\n    block_view.writeFloat32(color.green);\n    block_view.writeFloat32(color.blue);\n    block_view.writeUint16(COLOR_MODE_GLOBAL); // TODO: which to use?\n    blocks.push(block_view.buffer);\n    size_of_all_blocks += block_size;\n  }\n  file_size = 4 + 4 + 4 + size_of_all_blocks; // magic number (\"ASEF\") // version number // number of blocks\n  view = new jDataView(file_size);\n  view.writeString(\"ASEF\");\n  version = 1;\n  view.writeUint32(version);\n  view.writeUint32(blocks.length);\n  for (k = 0, len2 = blocks.length; k < len2; k++) {\n    block = blocks[k];\n    view.writeBytes(new Uint8Array(block));\n  }\n  return view.buffer;\n};\n\nmodule.exports.read_adobe_color_book = function({data}) {\n  var add, bad, book_description, book_id, book_title, color_code, color_count, color_name, color_name_prefix, color_name_suffix, color_space, extract_value, i, page_selector_offset, page_size, palette, pos, ref, sig, ver, view;\n  // ACB (Adobe Color Book)\n\n  // References:\n  // https://magnetiq.ca/pages/acb-spec/\n  // https://github.com/jacobbubu/acb/blob/177e3acc9549d6f7802f9d039410f218942b1610/decoder.coffee\n  palette = new Palette();\n  view = new jDataView(data);\n  sig = view.getString(4);\n  if (sig !== \"8BCB\") {\n    throw new Error(\"Not an Adobe Color Book\");\n  }\n  ver = view.getUint16();\n  if (ver !== 1) {\n    throw new Error(`Unknown Adobe Color Book version: ${ver}?`);\n  }\n  extract_value = function(str) {\n    var value;\n    // remove wrapper double quote\n    value = str.replace(/^\"(.*)\"$/, '$1');\n    // e.x: $$$/acb/Pantone/ProcessYellow=Process Yellow CP\n    if (value.startsWith('$$$')) {\n      value = value.split('=')[1];\n    }\n    value = value.replace('^R', '®');\n    value = value.replace('^C', '©');\n    return value;\n  };\n  book_id = view.getUint16();\n  book_title = extract_value(get_utf_16_string(view, view.getUint32(), false));\n  color_name_prefix = extract_value(get_utf_16_string(view, view.getUint32(), false));\n  color_name_suffix = extract_value(get_utf_16_string(view, view.getUint32(), false));\n  book_description = extract_value(get_utf_16_string(view, view.getUint32()));\n  color_count = view.getUint16();\n  page_size = view.getUint16();\n  page_selector_offset = view.getUint16();\n  color_space = view.getUint16();\n  for (i = 0, ref = color_count; (0 <= ref ? i < ref : i > ref); 0 <= ref ? i++ : i--) {\n    color_name = extract_value(get_utf_16_string(view, view.getUint32(), false));\n    color_code = view.getString(6).trim();\n    color_code = color_code.replace(/^0*(\\d+)$/, '$1');\n    color_code = color_code.replace('X', '-');\n    \n    // just in case? I've not seen an example of this\n    if (color_code && !color_name) {\n      pos = color_code.lastIndexOf(color_name_suffix.trim());\n      color_name = pos >= 0 ? color_code.slice(0, pos) : color_code;\n    }\n    // console.log color_code, pos, color_name\n    add = function(o) {\n      if (!color_name.trim() && !color_code.trim()) {\n        return;\n      }\n      // This is just a dummy record used for padding\n      o.name = color_name_prefix + color_name + color_name_suffix;\n      // o.code = color_code\n      return palette.add(o);\n    };\n    bad = function() {\n      throw new Error(`Color space #${color_space} (${PhotoshopColorSpace[color_space]}) not supported.`);\n    };\n    switch (color_space) {\n      case 0: // RGB\n        add({\n          red: view.getUint8() / 255,\n          green: view.getUint8() / 255,\n          blue: view.getUint8() / 255\n        });\n        break;\n      case 1: // HSB\n        add({\n          hue: view.getUint8() / 255,\n          saturation: view.getUint8() / 255,\n          value: view.getUint8() / 255\n        });\n        break;\n      case 2: // CMYK\n        add({\n          cyan: 1 - (view.getUint8() / 255),\n          magenta: 1 - (view.getUint8() / 255),\n          yellow: 1 - (view.getUint8() / 255),\n          key: 1 - (view.getUint8() / 255)\n        });\n        break;\n      case 3: // Pantone\n        bad();\n        break;\n      case 4: // Focoltone\n        bad();\n        break;\n      case 5: // Trumatch\n        bad();\n        break;\n      case 6: // Toyo\n        bad();\n        break;\n      case 7: // Lab (CIELAB D50)\n        add({\n          l: view.getUint8() / 255,\n          a: view.getUint8() / 255,\n          b: view.getUint8() / 255\n        });\n        break;\n      case 8: // Grayscale\n        bad();\n        break;\n      case 9: // Wide CMYK\n        bad();\n        break;\n      case 10: // HKS\n        bad();\n        break;\n      default:\n        bad();\n    }\n  }\n  \n  // There's an optional field defining whether the color book is for spot or process colors.\n  // Would need to check for EOF to read this field.\n  // isSpot = view.getString(8) is \"spflspot\"\n  palette.name = book_title;\n  palette.description = book_description;\n  return palette;\n};\n\n\n},{\"../Palette\":37,\"jdataview\":7}],39:[function(require,module,exports){\n// Read/write Adobe Color Table file (.act)\n/*\n\"There is no version number written in the file.\nThe file is 768 or 772 bytes long and contains 256 RGB colors.\nThe first color in the table is index zero.\nThere are three bytes per color in the order red, green, blue.\nIf the file is 772 bytes long there are 4 additional bytes remaining.\n\tTwo bytes for the number of colors to use.\n\tTwo bytes for the color index with the transparency color to use.\"\n\nhttps://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577411_pgfId-1070626\n*/\nvar Palette, jDataView, read_adobe_color_table, write_adobe_color_table;\n\njDataView = require(\"jdataview\");\n\nPalette = require(\"../Palette\");\n\nmodule.exports = read_adobe_color_table = function({data, fileExt}) {\n  var j, palette, ref, view;\n  palette = new Palette();\n  view = new jDataView(data);\n  if (!(((ref = view.byteLength) === 768 || ref === 772) || fileExt === \"act\")) { // because \"Fireworks can read ACT files bigger than 768 bytes\"\n    throw new Error(`file size must be 768 or 772 bytes (saw ${view.byteLength}), OR file extension must be '.act' (saw '.${fileExt}')`);\n  }\n  for (var j = 0; j < 256; j++) {\n    palette.add({\n      red: view.getUint8() / 255,\n      green: view.getUint8() / 255,\n      blue: view.getUint8() / 255\n    });\n  }\n  palette.numberOfColumns = 16; // configurable in Photoshop, but this is the default view, and for instance Visibone and the default swatches rely on this layout\n  return palette;\n};\n\nmodule.exports.write = write_adobe_color_table = function(palette) {\n  var i, j, view;\n  view = new jDataView(256 * 3);\n  for (i = j = 0; j < 256; i = ++j) {\n    view.writeUint8(palette[i] ? Math.round(palette[i].red * 255) : 0);\n    view.writeUint8(palette[i] ? Math.round(palette[i].green * 255) : 0);\n    view.writeUint8(palette[i] ? Math.round(palette[i].blue * 255) : 0);\n  }\n  return view.buffer;\n};\n\n\n},{\"../Palette\":37,\"jdataview\":7}],40:[function(require,module,exports){\n// Detect CSS colors (except named colors), and write .css/.less/.scss/.sass/.styl files\nvar Palette, css_escape;\n\ncss_escape = require(\"css.escape\");\n\nPalette = require(\"../Palette\");\n\n// TODO: detect names via structures like CSS variables, JSON object keys/values, comments\n// TODO: use all colors regardless of format, within a detected structure, or maybe always\nmodule.exports = function({fileContentString}) {\n  var char, hex, i, j, len, len1, most_colors, n, n_control_characters, palette, palette_hex_long, palette_hex_short, palette_hsl, palette_hsla, palette_rgb, palette_rgba, palettes;\n  n_control_characters = 0;\n  for (i = 0, len = fileContentString.length; i < len; i++) {\n    char = fileContentString[i];\n    if (char === \"\\x00\" || char === \"\\x01\" || char === \"\\x02\" || char === \"\\x03\" || char === \"\\x04\" || char === \"\\x05\" || char === \"\\x06\" || char === \"\\x07\" || char === \"\\x08\" || char === \"\\x0B\" || char === \"\\x0C\" || char === \"\\x0E\" || char === \"\\x0F\" || char === \"\\x10\" || char === \"\\x11\" || char === \"\\x12\" || char === \"\\x13\" || char === \"\\x14\" || char === \"\\x15\" || char === \"\\x16\" || char === \"\\x17\" || char === \"\\x18\" || char === \"\\x19\" || char === \"\\x1A\" || char === \"\\x1B\" || char === \"\\x1C\" || char === \"\\x1D\" || char === \"\\x1E\" || char === \"\\x1F\" || char === \"\\x7F\") {\n      n_control_characters++;\n    }\n  }\n  if (n_control_characters > 5) {\n    throw new Error(\"looks like a binary file\");\n  }\n  palettes = [palette_hex_long = new Palette(), palette_hex_short = new Palette(), palette_rgb = new Palette(), palette_hsl = new Palette(), palette_hsla = new Palette(), palette_rgba = new Palette()];\n  hex = function(x) {\n    return parseInt(x, 16);\n  };\n  fileContentString.replace(/\\#([0-9A-F]{3}|[0-9A-F]{6}|[0-9A-F]{4}|[0-9A-F]{8})(?![0-9A-F])/gim, function(m, $1) { // hashtag # #/\n    // three hex-digits (#A0C)\n    // six hex-digits (#AA00CC)\n    // with alpha, four hex-digits (#A0CF)\n    // with alpha, eight hex-digits (#AA00CCFF)\n    // (and no more!)\n    if ($1.length > 4) {\n      return palette_hex_long.add({\n        red: hex($1[0] + $1[1]) / 255,\n        green: hex($1[2] + $1[3]) / 255,\n        blue: hex($1[4] + $1[5]) / 255,\n        alpha: $1.length === 8 ? hex($1[6] + $1[7]) / 255 : void 0\n      });\n    } else {\n      return palette_hex_short.add({\n        red: hex($1[0] + $1[0]) / 255,\n        green: hex($1[1] + $1[1]) / 255,\n        blue: hex($1[2] + $1[2]) / 255,\n        alpha: $1.length === 4 ? hex($1[3] + $1[3]) / 255 : void 0\n      });\n    }\n  });\n  fileContentString.replace(/rgb\\(\\s*([0-9]*\\.?[0-9]+)(%?)\\s*(?:,|\\s)\\s*([0-9]*\\.?[0-9]+)(%?)\\s*(?:,|\\s)\\s*([0-9]*\\.?[0-9]+)(%?)\\s*\\)/gim, function(_m, r_val, r_unit, g_val, g_unit, b_val, b_unit) { // red\n    // green\n    // blue\n    return palette_rgb.add({\n      red: Number(r_val) / (r_unit === \"%\" ? 100 : 255),\n      green: Number(g_val) / (g_unit === \"%\" ? 100 : 255),\n      blue: Number(b_val) / (b_unit === \"%\" ? 100 : 255)\n    });\n  });\n  fileContentString.replace(/rgba?\\(\\s*([0-9]*\\.?[0-9]+)(%?)\\s*(?:,|\\s)\\s*([0-9]*\\.?[0-9]+)(%?)\\s*(?:,|\\s)\\s*([0-9]*\\.?[0-9]+)(%?)\\s*(?:,|\\/)\\s*([0-9]*\\.?[0-9]+)(%?)\\s*\\)/gim, function(_m, r_val, r_unit, g_val, g_unit, b_val, b_unit, a_val, a_unit) { // red\n    // green\n    // blue\n    // alpha\n    return palette_rgba.add({\n      red: Number(r_val) / (r_unit === \"%\" ? 100 : 255),\n      green: Number(g_val) / (g_unit === \"%\" ? 100 : 255),\n      blue: Number(b_val) / (b_unit === \"%\" ? 100 : 255),\n      alpha: Number(a_val) / (a_unit === \"%\" ? 100 : 1)\n    });\n  });\n  fileContentString.replace(/hsl\\(\\s*([0-9]*\\.?[0-9]+)(deg|rad|turn|)\\s*(?:,|\\s)\\s*([0-9]*\\.?[0-9]+)(%?)\\s*(?:,|\\s)\\s*([0-9]*\\.?[0-9]+)(%?)\\s*\\)/gim, function(_m, h_val, h_unit, s_val, s_unit, l_val, l_unit) { // hue\n    // saturation\n    // value\n    return palette_hsl.add({\n      hue: Number(h_val) / (h_unit === \"rad\" ? 2 * Math.PI : h_unit === \"turn\" ? 1 : 360),\n      saturation: Number(s_val) / (s_unit === \"%\" ? 100 : 1),\n      lightness: Number(l_val) / (l_unit === \"%\" ? 100 : 1)\n    });\n  });\n  fileContentString.replace(/hsla?\\(\\s*([0-9]*\\.?[0-9]+)(deg|rad|turn|)\\s*(?:,|\\s)\\s*([0-9]*\\.?[0-9]+)(%?)\\s*(?:,|\\s)\\s*([0-9]*\\.?[0-9]+)(%?)\\s*(?:,|\\/)\\s*([0-9]*\\.?[0-9]+)(%?)\\s*\\)/gim, function(_m, h_val, h_unit, s_val, s_unit, l_val, l_unit, a_val, a_unit) { // hue\n    // saturation\n    // value\n    // alpha\n    return palette_hsla.add({\n      hue: Number(h_val) / (h_unit === \"rad\" ? 2 * Math.PI : h_unit === \"turn\" ? 1 : 360),\n      saturation: Number(s_val) / (s_unit === \"%\" ? 100 : 1),\n      lightness: Number(l_val) / (l_unit === \"%\" ? 100 : 1),\n      alpha: Number(a_val) / (a_unit === \"%\" ? 100 : 1)\n    });\n  });\n  most_colors = [];\n  for (j = 0, len1 = palettes.length; j < len1; j++) {\n    palette = palettes[j];\n    if (palette.length >= most_colors.length) {\n      most_colors = palette;\n    }\n  }\n  n = most_colors.length;\n  if (n < 4) {\n    throw new Error([\"No colors found\", \"Only one color found\", \"Only a couple colors found\", \"Only a few colors found\"][n] + ` (${n})`);\n  }\n  return most_colors;\n};\n\nmodule.exports.write_css = function(palette) {\n  return `:root {\n\t${palette.map(function(color, index) {\n    return `--${color.name ? css_escape(color.name.replace(/\\s/g, \"-\")) : `color-${index + 1}`}: ${color};`;\n  }).join(\"\\n\\t\")}\n}`;\n};\n\nmodule.exports.write_styl = function(palette) {\n  return palette.map(function(color, index) {\n    return `${color.name ? css_escape(color.name.replace(/\\s/g, \"-\")) : `color-${index + 1}`} = ${color};`;\n  }).join(\"\\n\");\n};\n\nmodule.exports.write_less = function(palette) {\n  return palette.map(function(color, index) {\n    return `@${color.name ? css_escape(color.name.replace(/\\s/g, \"-\")) : `color-${index + 1}`}: ${color};`;\n  }).join(\"\\n\");\n};\n\nmodule.exports.write_scss = function(palette) {\n  return palette.map(function(color, index) {\n    return `$${color.name ? css_escape(color.name.replace(/\\s/g, \"-\")) : `color-${index + 1}`}: ${color};`;\n  }).join(\"\\n\");\n};\n\nmodule.exports.write_sass = function(palette) {\n  return palette.map(function(color, index) {\n    return `$${color.name ? css_escape(color.name.replace(/\\s/g, \"-\")) : `color-${index + 1}`}: ${color}`;\n  }).join(\"\\n\");\n};\n\n\n},{\"../Palette\":37,\"css.escape\":4}],41:[function(require,module,exports){\n// Load a ColorSchemer palette (.cs)\nvar Palette, jDataView;\n\njDataView = require(\"jdataview\");\n\nPalette = require(\"../Palette\");\n\nmodule.exports = function({data, fileExt}) {\n  var color_count, i, j, littleEndian, palette, ref, version, view;\n  if (fileExt !== \"cs\") {\n    throw new Error(`ColorSchemer loader is only enabled when file extension is '.cs' (saw '.${fileExt}' instead)`);\n  }\n  palette = new Palette();\n  littleEndian = true;\n  view = new jDataView(data, 0, void 0, littleEndian);\n  version = view.getUint16(); // or something\n  color_count = view.getUint16();\n  for (i = j = 0, ref = color_count; (0 <= ref ? j < ref : j > ref); i = 0 <= ref ? ++j : --j) {\n    view.seek(8 + i * 26);\n    palette.add({\n      red: view.getUint8() / 255,\n      green: view.getUint8() / 255,\n      blue: view.getUint8() / 255\n    });\n  }\n  return palette;\n};\n\n\n},{\"../Palette\":37,\"jdataview\":7}],42:[function(require,module,exports){\n// Read/write GIMP palette (.gpl), also used by or supported by many programs, such as Inkscape, Krita,\nvar Palette, parse_gimp_or_kde_rgb_palette, write_gimp_or_kde_rgb_palette;\n\nPalette = require(\"../Palette\");\n\nparse_gimp_or_kde_rgb_palette = function(fileContentString, format_name) {\n  var line, line_index, lines, m, palette, r_g_b_name;\n  lines = fileContentString.split(/\\r?\\n/);\n  if (lines[0] !== format_name) {\n    throw new Error(`Not a ${format_name}`);\n  }\n  palette = new Palette();\n  line_index = 0;\n  // on the first iteration, line_index = 1 because the increment happens at the start of the loop\n  while ((line_index += 1) < lines.length) {\n    line = lines[line_index];\n    if (line[0] === \"#\" || line === \"\") {\n      continue;\n    }\n    // TODO: handle non-start-of-line comments? where's the spec?\n    m = line.match(/Name:\\s*(.*)/);\n    if (m) {\n      palette.name = m[1];\n      continue;\n    }\n    m = line.match(/Columns:\\s*(.*)/);\n    if (m) {\n      palette.numberOfColumns = Number(m[1]);\n      // TODO: handle 0 as not specified? where's the spec at, yo?\n      palette.geometrySpecifiedByFile = true;\n      continue;\n    }\n    \n    // TODO: replace \\s with [\\ \\t] (spaces or tabs)\n    // it can't match \\n because it's already split on that, but still\n    // TODO: handle line with no name but space on the end\n    r_g_b_name = line.match(/^\\s*([0-9]+)\\s+([0-9]+)\\s+([0-9]+)(?:\\s+(.*))?$/); // \"at the beginning of the line,\"\n    // \"give or take some spaces,\"\n    // match 3 groups of numbers separated by spaces\n    // red\n    // green\n    // blue\n    // optionally a name\n    // \"and that should be the end of the line\"\n    if (!r_g_b_name) {\n      throw new Error(`Line ${line_index + 1} doesn't match pattern of red green blue name`);\n    }\n    palette.add({\n      red: Number(r_g_b_name[1]) / 255,\n      green: Number(r_g_b_name[2]) / 255,\n      blue: Number(r_g_b_name[3]) / 255,\n      name: r_g_b_name[4]\n    });\n  }\n  return palette;\n};\n\nmodule.exports = function({fileContentString}) {\n  return parse_gimp_or_kde_rgb_palette(fileContentString, \"GIMP Palette\");\n};\n\nwrite_gimp_or_kde_rgb_palette = function(palette, format_name) {\n  return `${format_name || \"GIMP Palette\"}\nName: ${palette.name || \"Saved Colors\"}\nColumns: ${palette.numberOfColumns || 8}\n#\n${palette.map((color) => {\n    var blue, green, red;\n    ({red, green, blue} = color);\n    return `${[red, green, blue].map((component) => {\n      return `${Math.round(component * 255)}`.padEnd(3, \" \");\n    }).join(\" \")}   ${color.name || color}`;\n  }).join(\"\\n\")}`;\n};\n\nmodule.exports.write = function(palette) {\n  return write_gimp_or_kde_rgb_palette(palette, \"GIMP Palette\");\n};\n\nmodule.exports.extension = \"gpl\";\n\nmodule.exports.write_gimp_or_kde_rgb_palette = write_gimp_or_kde_rgb_palette;\n\nmodule.exports.parse_gimp_or_kde_rgb_palette = parse_gimp_or_kde_rgb_palette;\n\n\n},{\"../Palette\":37}],43:[function(require,module,exports){\n// Read/write Allaire Homesite / Macromedia ColdFusion palette (.hpl)\nvar Palette;\n\nPalette = require(\"../Palette\");\n\nmodule.exports = function({fileContentString}) {\n  var i, len, line, lines, match, palette;\n  lines = fileContentString.split(/\\r?\\n/);\n  if (lines[0] !== \"Palette\") {\n    throw new Error(\"Not a Homesite palette\");\n  }\n  if (!lines[1].match(/Version [34]\\.0/)) {\n    throw new Error(\"Unsupported Homesite palette version\");\n  }\n  palette = new Palette();\n  for (i = 0, len = lines.length; i < len; i++) {\n    line = lines[i];\n    match = line.match(/(\\d+)\\s+(\\d+)\\s+(\\d+)/);\n    if (match) {\n      palette.add({\n        red: Number(match[1]) / 255,\n        green: Number(match[2]) / 255,\n        blue: Number(match[3]) / 255\n      });\n    }\n  }\n  return palette;\n};\n\nmodule.exports.write = function(palette) {\n  return `Palette\nVersion 4.0\n-----------\n${palette.map(function(color) {\n    return `${Math.round(color.red * 255)} ${Math.round(color.green * 255)} ${Math.round(color.blue * 255)}`;\n  }).join(\"\\n\")}`;\n};\n\n\n},{\"../Palette\":37}],44:[function(require,module,exports){\n// Read/write KDE RGB Palette / KolourPaint / KOffice palette (.colors)\nvar parse_gimp_or_kde_rgb_palette, write_gimp_or_kde_rgb_palette;\n\n({parse_gimp_or_kde_rgb_palette, write_gimp_or_kde_rgb_palette} = require(\"./GIMP\"));\n\nmodule.exports = function({fileContentString}) {\n  return parse_gimp_or_kde_rgb_palette(fileContentString, \"KDE RGB Palette\");\n};\n\nmodule.exports.write = function(palette) {\n  return write_gimp_or_kde_rgb_palette(palette, \"KDE RGB Palette\");\n};\n\nmodule.exports.extension = \"colors\";\n\n\n},{\"./GIMP\":42}],45:[function(require,module,exports){\n// Read/write Paint.NET palette format (.txt)\nvar Palette;\n\nPalette = require(\"../Palette\");\n\nmodule.exports = function({fileContentString}) {\n  var hex, i, len, line, m, palette, ref;\n  palette = new Palette();\n  hex = function(x) {\n    return parseInt(x, 16);\n  };\n  ref = fileContentString.split(/\\r?\\n/);\n  for (i = 0, len = ref.length; i < len; i++) {\n    line = ref[i];\n    m = line.match(/^([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i);\n    if (m) {\n      palette.add({\n        alpha: hex(m[1]) / 255,\n        red: hex(m[2]) / 255,\n        green: hex(m[3]) / 255,\n        blue: hex(m[4]) / 255\n      });\n    }\n  }\n  return palette;\n};\n\nmodule.exports.write = function(palette) {\n  var comments, component_to_hex, stringify_color;\n  component_to_hex = function(component) {\n    var hex;\n    hex = Math.round(component * 255).toString(16);\n    if (hex.length === 1) {\n      return `0${hex}`;\n    } else {\n      return hex;\n    }\n  };\n  stringify_color = function(color) {\n    var alpha, blue, green, red;\n    ({alpha, red, green, blue} = color);\n    if (alpha == null) {\n      alpha = 1;\n    }\n    return [alpha, red, green, blue].map(component_to_hex).join(\"\");\n  };\n  comments = `Paint.NET Palette File\nLines that start with a semicolon are comments\nColors are written as 8-digit hexadecimal numbers: aarrggbb\nFor example, this would specify green: FF00FF00\nThe alpha ('aa') value specifies how transparent a color is. FF is fully opaque, 00 is fully transparent.\nA palette must consist of ninety six (96) colors. If there are less than this, the remaining color\nslots will be set to white (FFFFFFFF). If there are more, then the remaining colors will be ignored.\n\n`;\n  if (palette.name) {\n    comments += `Palette Name: ${palette.name}\\n`;\n  }\n  if (palette.description) {\n    comments += `Description: ${palette.description}\\n`;\n  }\n  comments += `Colors: ${palette.length}\\n`;\n  if (palette.numberOfColumns) {\n    comments += `Columns: ${palette.numberOfColumns}\\n`;\n  }\n  comments = `; ${comments}`.replace(/\\n/g, \"\\n; \").replace(/\\s*\\n/g, \"\\n\");\n  return `${comments}\n${palette.map(stringify_color).join(\"\\n\")}`;\n};\n\n\n},{\"../Palette\":37}],46:[function(require,module,exports){\n// Read/write JASC PAL file (Paint Shop Pro palette file) (.pal)\nvar Palette;\n\nPalette = require(\"../Palette\");\n\nmodule.exports = function({fileContentString}) {\n  var i, j, len, line, lines, palette, rgb;\n  lines = fileContentString.split(/[\\n\\r]+/m);\n  if (lines[0] !== \"JASC-PAL\") {\n    throw new Error(\"Not a JASC-PAL\");\n  }\n  if (lines[1] !== \"0100\") {\n    throw new Error(\"Unknown JASC-PAL version\");\n  }\n  // if lines[2] isnt \"256\"\n  // \t\"that's ok\"\n  palette = new Palette();\n//n_colors = Number(lines[2])\n  for (i = j = 0, len = lines.length; j < len; i = ++j) {\n    line = lines[i];\n    if (line !== \"\" && i > 2) {\n      rgb = line.split(\" \");\n      palette.add({\n        red: Number(rgb[0]) / 255,\n        green: Number(rgb[1]) / 255,\n        blue: Number(rgb[2]) / 255\n      });\n    }\n  }\n  return palette;\n};\n\nmodule.exports.write = function(palette) {\n  return `JASC-PAL\n0100\n${palette.length}\n${palette.map(function(color) {\n    return `${Math.round(color.red * 255)} ${Math.round(color.green * 255)} ${Math.round(color.blue * 255)}`;\n  }).join(\"\\n\")}`;\n};\n\n\n},{\"../Palette\":37}],47:[function(require,module,exports){\n// Read/write Resource Interchange File Format (RIFF) palette file (.pal)\n\n// ported from C# code at https://worms2d.info/Palette_file\nvar Palette, jDataView;\n\njDataView = require(\"jdataview\");\n\nPalette = require(\"../Palette\");\n\nmodule.exports = function({data}) {\n  var chunkSize, chunkType, colorCount, dataSize, i, littleEndian, palVersion, palette, ref, riff, type, view;\n  littleEndian = true;\n  view = new jDataView(data, 0, void 0, littleEndian);\n  \n  // RIFF header\n  riff = view.getString(4); // \"RIFF\"\n  dataSize = view.getUint32();\n  type = view.getString(4); // \"PAL \"\n  if (riff !== \"RIFF\") {\n    throw new Error(\"RIFF header not found; not a RIFF PAL file\");\n  }\n  if (type !== \"PAL \") {\n    throw new Error(`RIFF header says this isn't a PAL file,\nmore of a sort of ${(type + \"\").trim()} file`);\n  }\n  \n  // Data chunk\n  chunkType = view.getString(4); // \"data\"\n  chunkSize = view.getUint32();\n  palVersion = view.getUint16(); // 0x0300\n  colorCount = view.getUint16();\n  if (chunkType !== \"data\") {\n    throw new Error(`Data chunk not found (...'${chunkType}'?)`);\n  }\n  if (palVersion !== 0x0300) {\n    throw new Error(`Unsupported PAL file format version: 0x${palVersion.toString(16)}`);\n  }\n  \n  // Colors\n  palette = new Palette();\n  for (i = 0, ref = colorCount; (0 <= ref ? i < ref : i > ref); 0 <= ref ? i++ : i--) {\n    palette.add({\n      red: view.getUint8() / 255,\n      green: view.getUint8() / 255,\n      blue: view.getUint8() / 255\n    });\n    view.getUint8(); // \"flags\", always 0x00\n  }\n  return palette;\n};\n\nmodule.exports.write = function(palette) {\n  var color, data_chunk_body_size, data_chunk_total_size, file_size, file_view, i, len, littleEndian;\n  data_chunk_body_size = 2 + 2 + 4 * palette.length; // for the version number (Uint16) // for the color count (Uint16) // for the colors (4x Uint8)\n  data_chunk_total_size = 4 + 4 + data_chunk_body_size; // for \"data\" // for the chunk size (Uint32) // for the data chunk body\n  file_size = 4 + 4 + 4 + data_chunk_total_size; // for \"RIFF\" // for the document size (Uint32) // for \"PAL \" // for the data chunk\n  littleEndian = true;\n  file_view = new jDataView(file_size, 0, void 0, littleEndian);\n  file_view.writeString(\"RIFF\");\n  file_view.writeUint32(data_chunk_total_size + 4);\n  file_view.writeString(\"PAL \");\n  file_view.writeString(\"data\");\n  file_view.writeUint32(data_chunk_body_size);\n  file_view.writeUint16(0x0300); // version number\n  file_view.writeUint16(palette.length); // number of colors\n  for (i = 0, len = palette.length; i < len; i++) {\n    color = palette[i];\n    file_view.writeUint8(Math.round(color.red * 255));\n    file_view.writeUint8(Math.round(color.green * 255));\n    file_view.writeUint8(Math.round(color.blue * 255));\n    file_view.writeUint8(0); // \"flags\"\n  }\n  return file_view.buffer;\n};\n\n\n},{\"../Palette\":37,\"jdataview\":7}],48:[function(require,module,exports){\n// Read/write sK1 palettes (.skp)\n\n// These files are actually sort of python source code,\n// but let's just try to parse them as if it's a declarative language.\n\n// Normally the format is handled line by line but compiling python code for each line:\n// https://github.com/sk1project/uniconvertor/blob/751a4f559bac48ded59028d9b2cf6778d1267a8f/src/uc2/formats/skp/skp_filters.py#L43-L44\nvar Palette, parse_css_hex_color;\n\nPalette = require(\"../Palette\");\n\n({parse_css_hex_color} = require(\"../helpers\"));\n\nmodule.exports = function({fileContentString}) {\n  var _, args, args_str, fn, fn_name, fns, i, len, line, line_index, lines, match, n, palette, parse_args;\n  lines = fileContentString.split(/[\\n\\r]+/m);\n  palette = new Palette();\n  fns = {\n    set_name: function(name) {\n      return palette.name = name;\n    },\n    // set_source: (source)-> palette.source = source\n    add_comments: function(line) {\n      if (palette.description == null) {\n        palette.description = \"\";\n      }\n      if (palette.description.length > 0) {\n        palette.description += \"\\n\";\n      }\n      return palette.description += line;\n    },\n    set_columns: function(columns) {\n      palette.numberOfColumns = columns;\n      return palette.geometrySpecifiedByFile = true;\n    },\n    hexcolor: function(hexcolor, name) {\n      var color;\n      // TODO: find example palettes with hexcolor()\n      // I think adding # is unnesessary\n      color = parse_css_hex_color(\"#\" + hexcolor);\n      color.name = name;\n      return palette.add(color);\n    },\n    rgbcolor: function(red, green, blue, name) {\n      // TODO: find example palettes with rgbcolor()\n      return palette.add({\n        red: red / 255,\n        green: green / 255,\n        blue: blue / 255,\n        name: name\n      });\n    },\n    color: function([color_type, components, alpha, name]) {\n      switch (color_type) {\n        case \"RGB\":\n          return palette.add({\n            red: components[0],\n            green: components[1],\n            blue: components[2],\n            alpha: alpha,\n            name: name\n          });\n        case \"Grayscale\":\n          return palette.add({\n            red: components[0],\n            green: components[0],\n            blue: components[0],\n            alpha: alpha,\n            name: name\n          });\n        case \"CMYK\":\n          return palette.add({\n            cyan: components[0],\n            magenta: components[1],\n            yellow: components[2],\n            key: components[3],\n            alpha: alpha,\n            name: name\n          });\n        case \"HSL\":\n          return palette.add({\n            hue: components[0],\n            saturation: components[1],\n            lightness: components[2],\n            alpha: alpha,\n            name: name\n          });\n      }\n    }\n  };\n  parse_args = function(args_str, line_number) {\n    var args, index, parse_array, parse_number, parse_string, ref, ref1;\n    // JSON.parse(\"[#{args_str.replace(/\\bu(['\"])/g, \"$1\").replace(/\"/g, '\\\\\"').replace(/'/g, '\"')}]\")\n    // TODO: proper parsing that handles u\"You've got mail!\" etc.\n    args = [];\n    index = 0;\n    parse_string = function() {\n      var quote_char, str;\n      str = \"\";\n      quote_char = args_str[index];\n      if (quote_char !== \"'\" && quote_char !== '\"') {\n        throw new Error(\"Expected to start parsing string on a quote character\");\n      }\n      index += 1;\n      while (index < args_str.length) {\n        if (args_str[index] === \"\\\\\") {\n          index += 1;\n          if (args_str[index] === \"\\\\\") {\n            str += \"\\\\\";\n          } else if (args_str[index] === \"r\") {\n            str += \"\\r\";\n          } else if (args_str[index] === \"n\") {\n            str += \"\\n\";\n          } else if (args_str[index] === \"t\") {\n            str += \"\\t\";\n          } else if (args_str[index] === \"v\") {\n            str += \"\\v\";\n          } else if (args_str[index] === \"a\") {\n            str += \"\\a\";\n          } else if (args_str[index] === \"b\") {\n            str += \"\\b\";\n          } else if (args_str[index] === \"'\") {\n            str += \"'\";\n          } else if (args_str[index] === '\"') {\n            str += '\"';\n          } else if (args_str[index].match(/\\d/)) {\n\n          // TODO: handle octal escape\n          } else if (args_str[index] === \"x\") {\n\n          // TODO: handle hex escape\n          } else if (args_str[index] === \"N\") {\n\n          // TODO: character by Unicode name\n          } else if (args_str[index] === \"u\") {\n\n          // TODO: character with 16-bit hex value (four hexadecimal digits).\n          } else if (args_str[index] === \"U\") {\n\n          } else {\n            // TODO: character with 32-bit hex value (eight hexadecimal digits).\n            console.log(`Warning: unecessary escape in python string: \\\\${args_str[index]}`);\n            str += args_str[index];\n          }\n        } else if (args_str[index] === quote_char) {\n          return str;\n        } else {\n          str += args_str[index];\n        }\n        index += 1;\n      }\n      throw new SyntaxError(`Expected end of string on line ${line_number}`);\n    };\n    parse_number = function() {\n      var num_str;\n      // not super robust - 127.0.0.1 is just a number, right?\n      // could be done a lot simpler too with a single regexp match\n      num_str = \"\";\n      while (index < args_str.length) {\n        if (args_str[index].match(/[\\d\\.]/)) {\n          num_str += args_str[index];\n        } else {\n          break;\n        }\n        index += 1;\n      }\n      index -= 1;\n      return parseFloat(num_str);\n    };\n    parse_array = function() {\n      var ref, ref1, values;\n      index += 1;\n      values = [];\n      while (index < args_str.length) {\n        if (args_str[index] === \"u\") {\n          index += 1;\n          if ((ref = args_str[index]) === \"'\" || ref === '\"') {\n            values.push(parse_string());\n          } else {\n            throw new SyntaxError(`Unexpected 'u${args_str.slice(index)}' on line ${line_number}`);\n          }\n        } else if ((ref1 = args_str[index]) === \"'\" || ref1 === '\"') {\n          values.push(parse_string());\n        } else if (args_str[index] === \"[\") {\n          values.push(parse_array());\n        } else if (args_str[index].match(/\\d/)) {\n          values.push(parse_number());\n        } else if (args_str[index] === \"]\") {\n          return values;\n        } else if (args_str[index] === \",\") {\n\n        // not keeping track of commas, you could duplicate or omit them and we'd still parse\n        } else if (args_str[index].match(/\\S/)) {\n          throw new SyntaxError(`Unexpected '${args_str.slice(index)}' on line ${line_number}`);\n        }\n        index += 1;\n      }\n      throw new SyntaxError(`Expected end of array on line ${line_number}`);\n    };\n    while (index < args_str.length) {\n      if (args_str[index] === \"u\") {\n        index += 1;\n        if ((ref = args_str[index]) === \"'\" || ref === '\"') {\n          args.push(parse_string());\n        } else {\n          throw new SyntaxError(`Unexpected 'u${args_str.slice(index)}' on line ${line_number}`);\n        }\n      } else if ((ref1 = args_str[index]) === \"'\" || ref1 === '\"') {\n        args.push(parse_string());\n      } else if (args_str[index] === \"[\") {\n        args.push(parse_array());\n      } else if (args_str[index].match(/\\d/)) {\n        args.push(parse_number());\n      } else if (args_str[index] === \",\") {\n\n      // not keeping track of commas, you could duplicate or omit them and we'd still parse\n      } else if (args_str[index].match(/\\S/)) {\n        throw new SyntaxError(`Unexpected '${args_str.slice(index)}' on line ${line_number}`);\n      }\n      index += 1;\n    }\n    return args;\n  };\n  for (line_index = i = 0, len = lines.length; i < len; line_index = ++i) {\n    line = lines[line_index];\n    match = line.match(/([\\w_]+)\\((.*)\\)/);\n    if (match) {\n      [_, fn_name, args_str] = match;\n      fn = fns[fn_name];\n      if (fn) {\n        args = parse_args(args_str, line_index + 1);\n        fn(...args);\n      }\n    }\n  }\n  n = palette.length;\n  if (n < 2) {\n    throw new Error([\"No colors found\", \"Only one color found\"][n] + ` (${n})`);\n  }\n  return palette;\n};\n\nmodule.exports.write = function(palette) {\n  var alpha, color, color_type, components, i, item, j, len, len1, name, ref, ref1, ref2, serialize_str, str;\n  serialize_str = function(str) {\n    return `'${str.replace(/[\\r\\n]+/g, \" \").replace(/'/g, \"\\\\'\")}'`;\n  };\n  str = \"##sK1 palette\\n\";\n  str += \"palette()\\n\";\n  if (palette.name) {\n    str += `set_name(${serialize_str(palette.name)})\\n`;\n  }\n  if (palette.source) {\n    str += `set_source(${serialize_str(palette.source)})\\n`;\n  }\n  if (palette.description) {\n    ref = palette.description.split(/\\r?\\n/g);\n    for (i = 0, len = ref.length; i < len; i++) {\n      item = ref[i];\n      str += `add_comments(${serialize_str(item)})\\n`;\n    }\n  }\n  if (palette.numberOfColumns) {\n    str += `set_columns(${palette.numberOfColumns})\\n`;\n  }\n  for (j = 0, len1 = palette.length; j < len1; j++) {\n    color = palette[j];\n    if (color.hue != null) {\n      color_type = \"HSL\";\n      components = [color.hue, color.saturation, color.lightness];\n    } else {\n      color_type = \"RGB\";\n      components = [color.red, color.green, color.blue];\n    }\n    alpha = (ref1 = color.alpha) != null ? ref1 : 1;\n    name = (ref2 = color.name) != null ? ref2 : color.toString();\n    str += `color([${serialize_str(color_type)}, [${components.join(\", \")}], ${alpha}, ${serialize_str(name)}])\\n`;\n  }\n  str += \"palette_end()\\n\";\n  return str;\n};\n\n\n},{\"../Palette\":37,\"../helpers\":56}],49:[function(require,module,exports){\n// Read/write Skencil palette (.spl) (\"Sketch RGBPalette\")\n// Skencil was formerly called Sketch, but this is not related to the .sketchpalette format.\nvar Palette;\n\nPalette = require(\"../Palette\");\n\nmodule.exports = function({fileContentString}) {\n  var i, len, line, line_index, lines, palette, r_g_b_name;\n  lines = fileContentString.split(/[\\n\\r]+/m);\n  if (lines[0] !== \"##Sketch RGBPalette 0\") {\n    throw new Error(\"Not a Skencil palette\");\n  }\n  palette = new Palette();\n  for (line_index = i = 0, len = lines.length; i < len; line_index = ++i) {\n    line = lines[line_index];\n    if (line[0] === \"#\" || line === \"\") {\n      continue;\n    }\n    // TODO: handle non-start-of-line comments? where's the spec?\n\n    // TODO: replace \\s with [\\ \\t] (spaces or tabs)\n    // it can't match \\n because it's already split on that, but still\n    // TODO: handle line with no name but space on the end\n    r_g_b_name = line.match(/^\\s*([0-9]*\\.?[0-9]+)\\s+([0-9]*\\.?[0-9]+)\\s+([0-9]*\\.?[0-9]+)(?:\\s+(.*))?$/); // at the beginning of the line,\n    // perhaps with some leading spaces\n    // match 3 groups of numbers separated by spaces\n    // red\n    // green\n    // blue\n    // optionally a name\n    // \"and that should be the end of the line\"\n    if (!r_g_b_name) {\n      throw new Error(`Line ${line_index + 1} doesn't match pattern of red green blue name`);\n    }\n    palette.add({\n      red: Number(r_g_b_name[1]),\n      green: Number(r_g_b_name[2]),\n      blue: Number(r_g_b_name[3]),\n      name: r_g_b_name[4]\n    });\n  }\n  return palette;\n};\n\nmodule.exports.write = function(palette) {\n  return `##Sketch RGBPalette 0\n${palette.map(function(color) {\n    var ref;\n    return `${color.red.toFixed(6)} ${color.green.toFixed(6)} ${color.blue.toFixed(6)} ${(ref = color.name) != null ? ref : color}`;\n  }).join(\"\\n\")}`;\n};\n\n\n},{\"../Palette\":37}],50:[function(require,module,exports){\n// Read/write StarCraft raw palette (.pal)\nvar Palette, jDataView;\n\njDataView = require(\"jdataview\");\n\nPalette = require(\"../Palette\");\n\nmodule.exports = function({data}) {\n  var j, palette, view;\n  palette = new Palette();\n  view = new jDataView(data);\n  if (view.byteLength !== 768) {\n    throw new Error(`Wrong file size, must be ${768} bytes long (not ${view.byteLength})`);\n  }\n  for (var j = 0; j < 256; j++) {\n    palette.add({\n      red: view.getUint8() / 255,\n      green: view.getUint8() / 255,\n      blue: view.getUint8() / 255\n    });\n  }\n  // no padding\n\n  //? palette.numberOfColumns = 16\n  return palette;\n};\n\nmodule.exports.write = function(palette) {\n  var i, j, view;\n  view = new jDataView(256 * 3);\n  for (i = j = 0; j < 256; i = ++j) {\n    view.writeUint8(palette[i] ? Math.round(palette[i].red * 255) : 0);\n    view.writeUint8(palette[i] ? Math.round(palette[i].green * 255) : 0);\n    view.writeUint8(palette[i] ? Math.round(palette[i].blue * 255) : 0);\n  }\n  return view.buffer;\n};\n\n\n},{\"../Palette\":37,\"jdataview\":7}],51:[function(require,module,exports){\n// Read/write StarCraft padded raw palette (.wpe)\nvar Palette, jDataView;\n\njDataView = require(\"jdataview\");\n\nPalette = require(\"../Palette\");\n\nmodule.exports = function({data}) {\n  var j, palette, view;\n  palette = new Palette();\n  view = new jDataView(data);\n  if (view.byteLength !== 1024) {\n    throw new Error(`Wrong file size, must be ${1024} bytes long (not ${view.byteLength})`);\n  }\n  for (var j = 0; j < 256; j++) {\n    palette.add({\n      red: view.getUint8() / 255,\n      green: view.getUint8() / 255,\n      blue: view.getUint8() / 255\n    });\n    view.getUint8(); // padding\n  }\n  palette.numberOfColumns = 16;\n  return palette;\n};\n\nmodule.exports.write = function(palette) {\n  var i, j, view;\n  view = new jDataView(256 * 4);\n  for (i = j = 0; j < 256; i = ++j) {\n    view.writeUint8(palette[i] ? Math.round(palette[i].red * 255) : 0);\n    view.writeUint8(palette[i] ? Math.round(palette[i].green * 255) : 0);\n    view.writeUint8(palette[i] ? Math.round(palette[i].blue * 255) : 0);\n    view.writeUint8(0); // padding\n  }\n  return view.buffer;\n};\n\n\n},{\"../Palette\":37,\"jdataview\":7}],52:[function(require,module,exports){\n// Read/write StarOffice / OpenOffice / LibreOffice palette (.soc)\nvar Palette, convert, parse_css_hex_color, write_soc;\n\nconvert = require(\"xml-js\");\n\nPalette = require(\"../Palette\");\n\n({parse_css_hex_color} = require(\"../helpers\"));\n\nmodule.exports.read_soc = function({fileContentString}) {\n  var child, color_options, element, i, j, len, len1, palette, parsed, ref, ref1, ref2, ref3, ref4;\n  if (!fileContentString.match(/^\\s*<\\?\\s*xml/i)) { // I doubt space is actually allowed between <? and xml\n    throw new Error(\"not a StarOffice palette (no <?xml...?> declaration)\");\n  }\n  palette = new Palette();\n  parsed = convert.xml2js(fileContentString, {\n    compact: false\n  });\n  if (!((ref = parsed.elements) != null ? ref.length : void 0)) {\n    throw new Error(\"No XML elements found\");\n  }\n  ref1 = parsed.elements;\n  for (i = 0, len = ref1.length; i < len; i++) {\n    element = ref1[i];\n    if (((ref2 = element.name) != null ? ref2.match(/:color-table$/) : void 0) && element.elements) {\n      ref3 = element.elements;\n      for (j = 0, len1 = ref3.length; j < len1; j++) {\n        child = ref3[j];\n        if (!(child.name === \"draw:color\" && ((ref4 = child.attributes[\"draw:color\"]) != null ? ref4.match(/#/) : void 0))) {\n          continue;\n        }\n        // TODO: probably can be any CSS color\n        color_options = parse_css_hex_color(child.attributes[\"draw:color\"]);\n        color_options.name = child.attributes[\"draw:name\"];\n        palette.add(color_options);\n      }\n    }\n  }\n  return palette;\n};\n\nwrite_soc = function(palette, modern) {\n  var color, component_to_hex, to_css_hex_color;\n  component_to_hex = function(component) {\n    var hex;\n    hex = Math.round(component * 255).toString(16);\n    if (hex.length === 1) {\n      return `0${hex}`;\n    } else {\n      return hex;\n    }\n  };\n  to_css_hex_color = function(color) {\n    var blue, green, red;\n    ({red, green, blue} = color);\n    return \"#\" + [red, green, blue].map(component_to_hex).join(\"\");\n  };\n  return convert.js2xml({\n    declaration: {\n      attributes: {\n        version: \"1.0\",\n        encoding: \"UTF-8\"\n      }\n    },\n    elements: [\n      {\n        // {\n        //  \ttype: \"comment\"\n        //  \tcomment: \"\"\n        // }\n        type: \"element\",\n        name: modern ? \"ooo:color-table\" : \"office:color-table\",\n        attributes: modern ? {\n          \"xmlns:office\": \"urn:oasis:names:tc:opendocument:xmlns:office:1.0\",\n          \"xmlns:draw\": \"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0\",\n          \"xmlns:xlink\": \"http://www.w3.org/1999/xlink\",\n          \"xmlns:svg\": \"http://www.w3.org/2000/svg\",\n          \"xmlns:ooo\": \"http://openoffice.org/2004/office\"\n        } : {\n          \"xmlns:form\": \"http://openoffice.org/2000/form\",\n          \"xmlns:number\": \"http://openoffice.org/2000/datastyle\",\n          \"xmlns:xlink\": \"http://www.w3.org/1999/xlink\",\n          \"xmlns:office\": \"http://openoffice.org/2000/office\",\n          \"xmlns:meta\": \"http://openoffice.org/2000/meta\",\n          \"xmlns:math\": \"http://www.w3.org/1998/Math/MathML\",\n          \"xmlns:svg\": \"http://www.w3.org/2000/svg\",\n          \"xmlns:dr3d\": \"http://openoffice.org/2000/dr3d\",\n          \"xmlns:text\": \"http://openoffice.org/2000/text\",\n          \"xmlns:style\": \"http://openoffice.org/2000/style\",\n          \"xmlns:script\": \"http://openoffice.org/2000/script\",\n          \"xmlns:chart\": \"http://openoffice.org/2000/chart\",\n          \"xmlns:draw\": \"http://openoffice.org/2000/drawing\",\n          \"xmlns:table\": \"http://openoffice.org/2000/table\",\n          \"xmlns:fo\": \"http://www.w3.org/1999/XSL/Format\",\n          \"xmlns:config\": \"http://openoffice.org/2001/config\",\n          \"xmlns:dc\": \"http://purl.org/dc/elements/1.1/\"\n        },\n        elements: (function() {\n          var i,\n      len,\n      results;\n          results = [];\n          for (i = 0, len = palette.length; i < len; i++) {\n            color = palette[i];\n            results.push({\n              type: \"element\",\n              name: \"draw:color\",\n              attributes: {\n                \"draw:name\": color.name || color.toString(),\n                \"draw:color\": to_css_hex_color(color)\n              }\n            });\n          }\n          return results;\n        })()\n      }\n    ]\n  }, {\n    spaces: \"\\t\"\n  });\n};\n\nmodule.exports.write_staroffice_soc = function(palette) {\n  return write_soc(palette, false);\n};\n\n// I assume this is the format used by OpenOffice.org as well, given the ooo namespace\nmodule.exports.write_libreoffice_soc = function(palette) {\n  return write_soc(palette, true);\n};\n\n\n},{\"../Palette\":37,\"../helpers\":56,\"xml-js\":30}],53:[function(require,module,exports){\n// Read/write Sketch App JSON palette (.sketchpalette)\n// (not related to .spl Sketch RGB Palette format)\n\n// based on https://github.com/andrewfiorillo/sketch-palettes/blob/5b6bfa6eb25cb3244a9e6a226df259e8fb31fc2c/Sketch%20Palettes.sketchplugin/Contents/Sketch/sketchPalettes.js\nvar Palette, parse_css_hex_color, version;\n\nPalette = require(\"../Palette\");\n\n({parse_css_hex_color} = require(\"../helpers\"));\n\nversion = 1.4;\n\nmodule.exports = function({fileContentString}) {\n  var colorAssets, colorDefinitions, color_definition, compatibleVersion, gradientAssets, hex_color, i, images, j, len, len1, palette, paletteContents, ref;\n  if (!fileContentString.match(/^\\s*{/)) {\n    throw new Error(\"not sketchpalette JSON\");\n  }\n  paletteContents = JSON.parse(fileContentString);\n  compatibleVersion = paletteContents.compatibleVersion;\n  // Check for presets in file, else set to empty array\n  colorDefinitions = (ref = paletteContents.colors) != null ? ref : [];\n  // gradientDefinitions = paletteContents.gradients ? []\n  // imageDefinitions = paletteContents.images ? []\n  colorAssets = [];\n  gradientAssets = [];\n  images = [];\n  palette = new Palette();\n  // Check if plugin is out of date and incompatible with a newer palette version\n  if (compatibleVersion && compatibleVersion > version) {\n    throw new Error(`Can't handle compatibleVersion of ${compatibleVersion}.`);\n  }\n  // Check for older hex code palette version\n  if (!compatibleVersion || compatibleVersion < 1.4) {\n// Convert hex colors\n    for (i = 0, len = colorDefinitions.length; i < len; i++) {\n      hex_color = colorDefinitions[i];\n      palette.add(parse_css_hex_color(hex_color));\n    }\n  } else {\n    // Color Fills: convert rgba colors\n    if (colorDefinitions.length > 0) {\n      for (j = 0, len1 = colorDefinitions.length; j < len1; j++) {\n        color_definition = colorDefinitions[j];\n        palette.add(color_definition);\n      }\n    }\n  }\n  // # Pattern Fills: convert base64 strings to MSImageData objects\n  // if imageDefinitions.length > 0\n  // \tfor imageDefinition in imageDefinitions\n  // \t\tnsdata = NSData.alloc().initWithBase64EncodedString_options(imageDefinition.data, 0)\n  // \t\tnsimage = NSImage.alloc().initWithData(nsdata)\n  // \t\t# msimage = MSImageData.alloc().initWithImageConvertingColorSpace(nsimage)\n  // \t\tmsimage = MSImageData.alloc().initWithImage(nsimage)\n  // \t\timages.push(msimage)\n\n  // # Gradient Fills: build MSGradientStop and MSGradient objects\n  // if gradientDefinitions.length > 0\n  // \tfor gradient in gradientDefinitions\n  // \t\t# Create gradient stops\n  // \t\tstops = []\n  // \t\tfor stop in gradient.stops\n  // \t\t\tcolor = MSColor.colorWithRed_green_blue_alpha(\n  // \t\t\t\tstop.color.red,\n  // \t\t\t\tstop.color.green,\n  // \t\t\t\tstop.color.blue,\n  // \t\t\t\tstop.color.alpha\n  // \t\t\t)\n  // \t\t\tstops.push(MSGradientStop.stopWithPosition_color_(stop.position, color))\n\n  // \t\t# Create gradient object and set basic properties\n  // \t\tmsgradient = MSGradient.new()\n  // \t\tmsgradient.setGradientType(gradient.gradientType)\n  // \t\t# msgradient.shouldSmoothenOpacity = gradient.shouldSmoothenOpacity\n  // \t\tmsgradient.elipseLength = gradient.elipseLength\n  // \t\tmsgradient.setStops(stops)\n\n  // \t\t# Parse From and To values into arrays e.g.: from: \"{0.1,-0.43}\" => fromValue = [0.1, -0.43]\n  // \t\tfromValue = gradient.from.slice(1,-1).split(\",\")\n  // \t\ttoValue = gradient.to.slice(1,-1).split(\",\")\n\n  // \t\t# Set CGPoint objects as From and To values\n  // \t\tmsgradient.setFrom({ x: fromValue[0], y: fromValue[1] })\n  // \t\tmsgradient.setTo({ x: toValue[0], y: toValue[1] })\n\n  // \t\tgradientName = gradient.name ? null\n  // \t\tgradientAssets.push(MSGradientAsset.alloc().initWithAsset_name(msgradient, gradientName))\n  return palette;\n};\n\nmodule.exports.write = function(palette) {\n  return JSON.stringify({\n    \"compatibleVersion\": \"1.4\",\n    \"pluginVersion\": \"1.4\",\n    \"colors\": palette.map(function(color) {\n      var alpha, blue, green, red;\n      ({red, green, blue, alpha} = color);\n      if (alpha == null) {\n        alpha = 1;\n      }\n      return {red, green, blue, alpha};\n    })\n  }, null, \"\\t\");\n};\n\nmodule.exports.extension = \"sketchpalette\";\n\n\n},{\"../Palette\":37,\"../helpers\":56}],54:[function(require,module,exports){\n// Load tabular RGB values\nvar Palette;\n\nPalette = require(\"../Palette\");\n\nmodule.exports = function({fileContentString}) {\n  var csv_palette, i, j, len, len1, line, lines, most_colors, n, palette, palettes, ssv_palette, try_parse_line;\n  lines = fileContentString.split(/[\\n\\r]+/m);\n  palettes = [csv_palette = new Palette(), ssv_palette = new Palette()];\n  try_parse_line = function(line, palette, regexp) {\n    var match;\n    match = line.match(regexp);\n    if (match) {\n      return palette.add({\n        red: Number(match[1]) / 255,\n        green: Number(match[2]) / 255,\n        blue: Number(match[3]) / 255\n      });\n    }\n  };\n  for (i = 0, len = lines.length; i < len; i++) {\n    line = lines[i];\n    try_parse_line(line, csv_palette, /([0-9]*\\.?[0-9]+),\\s*([0-9]*\\.?[0-9]+),\\s*([0-9]*\\.?[0-9]+)/);\n    try_parse_line(line, ssv_palette, /([0-9]*\\.?[0-9]+)\\s+([0-9]*\\.?[0-9]+)\\s+([0-9]*\\.?[0-9]+)/);\n  }\n  most_colors = [];\n  for (j = 0, len1 = palettes.length; j < len1; j++) {\n    palette = palettes[j];\n    if (palette.length >= most_colors.length) {\n      most_colors = palette;\n    }\n  }\n  n = most_colors.length;\n  if (n < 4) {\n    throw new Error([\"No colors found\", \"Only one color found\", \"Only a couple colors found\", \"Only a few colors found\"][n] + ` (${n})`);\n  }\n  if (most_colors.every(function(color) {\n    return color.red <= 1 / 255 && color.green <= 1 / 255 && color.blue <= 1 / 255;\n  })) {\n    most_colors.forEach(function(color) {\n      color.red *= 255;\n      color.green *= 255;\n      return color.blue *= 255;\n    });\n  }\n  return most_colors;\n};\n\n\n},{\"../Palette\":37}],55:[function(require,module,exports){\n// Load Windows .theme and .themepack files\nvar Palette, parseINIString, parseThemeFileString;\n\nPalette = require(\"../Palette\");\n\nparseINIString = function(fileContentString) {\n  var lines, regex, section, value;\n  regex = {\n    section: /^\\s*\\[\\s*([^\\]]*)\\s*\\]\\s*$/,\n    param: /^\\s*([^=]+?)\\s*=\\s*(.*?)\\s*$/,\n    comment: /^\\s*;.*$/\n  };\n  value = {};\n  lines = fileContentString.split(/[\\r\\n]+/);\n  section = null;\n  lines.forEach(function(line) {\n    var match;\n    if (regex.comment.test(line)) {\n      return;\n    } else if (regex.param.test(line)) {\n      match = line.match(regex.param);\n      if (section) {\n        value[section][match[1]] = match[2];\n      } else {\n        value[match[1]] = match[2];\n      }\n    } else if (regex.section.test(line)) {\n      match = line.match(regex.section);\n      value[match[1]] = {};\n      section = match[1];\n    } else if (line.length === 0 && section) {\n      section = null;\n    }\n  });\n  return value;\n};\n\nparseThemeFileString = function(themeIni) {\n  var colors, component, components, i, j, key, len, palette, ref, theme;\n  // .theme is a renamed .ini text file\n  // .themepack is a renamed .cab file, and parsing it as .ini seems to work well enough for the most part, as the .ini data appears in plain,\n  // but it may not if compression is enabled for the .cab file\n  theme = parseINIString(themeIni);\n  colors = theme[\"Control Panel\\\\Colors\"];\n  if (!colors) {\n    throw new Error(\"Invalid theme file, no [Control Panel\\\\Colors] section\");\n  }\n  palette = new Palette();\n  for (key in colors) {\n    // for .themepack file support, just ignore bad keys that were parsed\n    if (!key.match(/\\W/)) {\n      components = colors[key].split(\" \");\n      if (components.length === 3) {\n        for (i = j = 0, len = components.length; j < len; i = ++j) {\n          component = components[i];\n          components[i] = parseInt(component, 10);\n        }\n        if (components.every(function(component) {\n          return isFinite(component);\n        })) {\n          palette.add({\n            red: components[0] / 255,\n            green: components[1] / 255,\n            blue: components[2] / 255,\n            name: key\n          });\n        }\n      }\n    }\n  }\n  palette.name = (ref = theme[\"Theme\"]) != null ? ref.DisplayName : void 0; // or theme[\"General\"]?.Name for KDE .colors\n  return palette;\n};\n\nmodule.exports = function({fileContentString}) {\n  return parseThemeFileString(fileContentString);\n};\n\n\n},{\"../Palette\":37}],56:[function(require,module,exports){\n// TODO: DRY with CSS.coffee\nmodule.exports.parse_css_hex_color = function(hex_color) {\n  var $0, $1, hex, match;\n  hex = function(x) {\n    return parseInt(x, 16);\n  };\n  match = hex_color.match(/\\#([0-9A-F]{3}|[0-9A-F]{6}|[0-9A-F]{4}|[0-9A-F]{8})(?![0-9A-F])/im); // hashtag # #/\n  // three hex-digits (#A0C)\n  // six hex-digits (#AA00CC)\n  // with alpha, four hex-digits (#A0CF)\n  // with alpha, eight hex-digits (#AA00CCFF)\n  // (and no more!)\n  [$0, $1] = match;\n  if ($1.length > 4) {\n    return {\n      red: hex($1[0] + $1[1]) / 255,\n      green: hex($1[2] + $1[3]) / 255,\n      blue: hex($1[4] + $1[5]) / 255,\n      alpha: $1.length === 8 ? hex($1[6] + $1[7]) / 255 : void 0\n    };\n  } else {\n    return {\n      red: hex($1[0] + $1[0]) / 255,\n      green: hex($1[1] + $1[1]) / 255,\n      blue: hex($1[2] + $1[2]) / 255,\n      alpha: $1.length === 4 ? hex($1[3] + $1[3]) / 255 : void 0\n    };\n  }\n};\n\n\n},{}],57:[function(require,module,exports){\nvar AnyPalette, Color, LoadingErrors, Palette, format, format_id, formats, k, len, normalize_options, read_palette, ref,\n  splice = [].splice;\n\nPalette = require(\"./Palette\");\n\nColor = require(\"./Color\");\n\nLoadingErrors = class LoadingErrors extends Error {\n  constructor(errors1) {\n    var error;\n    super();\n    this.errors = errors1;\n    this.message = \"Some errors were encountered when loading:\" + (function() {\n      var k, len, ref, results;\n      ref = this.errors;\n      results = [];\n      for (k = 0, len = ref.length; k < len; k++) {\n        error = ref[k];\n        results.push(\"\\n\\t\" + error.message);\n      }\n      return results;\n    }).call(this);\n  }\n\n};\n\n// Formats are sorted by file extension if available,\n// but it's not always available, and some formats use the same extensions.\n// More generic formats should go at the bottom.\nformats = {\n  PAINT_SHOP_PRO_PALETTE: {\n    name: \"Paint Shop Pro palette\",\n    fileExtensions: [\"psppalette\", \"pal\"],\n    readFromText: require(\"./formats/PaintShopPro\"),\n    write: (require(\"./formats/PaintShopPro\")).write\n  },\n  RIFF_PALETTE: {\n    name: \"RIFF PAL\",\n    fileExtensions: [\"pal\"],\n    read: require(\"./formats/RIFF\"),\n    write: (require(\"./formats/RIFF\")).write\n  },\n  COLORSCHEMER_PALETTE: {\n    name: \"ColorSchemer palette\",\n    fileExtensions: [\"cs\"],\n    read: require(\"./formats/ColorSchemer\")\n  },\n  PAINTDOTNET_PALETTE: {\n    name: \"Paint.NET palette\",\n    fileExtensions: [\"txt\"],\n    readFromText: require(\"./formats/Paint.NET\"),\n    write: (require(\"./formats/Paint.NET\")).write\n  },\n  GIMP_PALETTE: {\n    name: \"GIMP palette\",\n    fileExtensions: [\"gpl\", \"gimp\", \"colors\"],\n    readFromText: require(\"./formats/GIMP\"),\n    write: (require(\"./formats/GIMP\")).write\n  },\n  KDE_RGB_PALETTE: {\n    name: \"KolourPaint palette\",\n    fileExtensions: [\"colors\"],\n    readFromText: require(\"./formats/KolourPaint\"),\n    write: (require(\"./formats/KolourPaint\")).write\n  },\n  SKENCIL_PALETTE: {\n    name: \"Skencil palette\",\n    fileExtensions: [\"spl\"],\n    readFromText: require(\"./formats/SPL\"),\n    write: (require(\"./formats/SPL\")).write\n  },\n  SKETCH_JSON_PALETTE: {\n    name: \"Sketch palette\",\n    fileExtensions: [\"sketchpalette\"],\n    readFromText: require(\"./formats/sketchpalette\"),\n    write: (require(\"./formats/sketchpalette\")).write\n  },\n  SK1_PALETTE: {\n    name: \"sK1 palette\",\n    fileExtensions: [\"skp\"],\n    readFromText: require(\"./formats/SKP\"),\n    write: (require(\"./formats/SKP\")).write\n  },\n  WINDOWS_THEME_COLORS: {\n    name: \"Windows desktop theme\",\n    fileExtensions: [\"theme\", \"themepack\"],\n    readFromText: require(\"./formats/theme\")\n  },\n  ADOBE_SWATCH_EXCHANGE_PALETTE: {\n    name: \"Adobe Swatch Exchange\",\n    fileExtensions: [\"ase\"],\n    read: (require(\"./formats/Adobe\")).read_adobe_swatch_exchange,\n    write: (require(\"./formats/Adobe\")).write_adobe_swatch_exchange\n  },\n  ADOBE_COLOR_BOOK_PALETTE: {\n    name: \"Adobe Color Book\",\n    fileExtensions: [\"acb\"],\n    read: (require(\"./formats/Adobe\")).read_adobe_color_book\n  },\n  STAROFFICE_PALETTE: {\n    name: \"StarOffice Colors\",\n    fileExtensions: [\"soc\"],\n    readFromText: (require(\"./formats/StarOffice\")).read_soc,\n    write: (require(\"./formats/StarOffice\")).write_libreoffice_soc\n  },\n  // KDE_THEME_COLORS: {\n  // \tname: \"KDE desktop theme\"\n  // \tfileExtensions: [\"colors\"]\n  // \tread: require \"./formats/theme\"\n  // }\n  CSS_VARIABLES: {\n    name: \"CSS variables\",\n    fileExtensions: [\"css\"],\n    write: (require(\"./formats/CSS\")).write_css\n  },\n  SCSS_VARIABLES: {\n    name: \"SCSS variables\",\n    fileExtensions: [\"scss\"],\n    write: (require(\"./formats/CSS\")).write_scss\n  },\n  SASS_VARIABLES: {\n    name: \"SASS variables\",\n    fileExtensions: [\"sass\"],\n    write: (require(\"./formats/CSS\")).write_sass\n  },\n  LESS_VARIABLES: {\n    name: \"LESS variables\",\n    fileExtensions: [\"less\"],\n    write: (require(\"./formats/CSS\")).write_less\n  },\n  STYLUS_VARIABLES: {\n    name: \"Stylus variables\",\n    fileExtensions: [\"styl\"],\n    write: (require(\"./formats/CSS\")).write_styl\n  },\n  CSS_COLORS: {\n    name: \"CSS colors\",\n    fileExtensions: [\"css\", \"scss\", \"sass\", \"less\", \"styl\", \"html\", \"htm\", \"svg\", \"js\", \"ts\", \"xml\", \"txt\"],\n    readFromText: require(\"./formats/CSS\")\n  },\n  HOMESITE_PALETTE: {\n    name: \"Homesite palette\",\n    fileExtensions: [\"hpl\"],\n    readFromText: require(\"./formats/Homesite\"),\n    write: (require(\"./formats/Homesite\")).write\n  },\n  ADOBE_COLOR_SWATCH_PALETTE: {\n    name: \"Adobe Color Swatch\",\n    fileExtensions: [\"aco\"],\n    read: (require(\"./formats/Adobe\")).read_adobe_color_swatch,\n    write: (require(\"./formats/Adobe\")).write_adobe_color_swatch\n  },\n  ADOBE_COLOR_TABLE_PALETTE: {\n    name: \"Adobe Color Table\",\n    fileExtensions: [\"act\"],\n    read: require(\"./formats/AdobeColorTable\"),\n    write: (require(\"./formats/AdobeColorTable\")).write\n  },\n  STARCRAFT_PALETTE: {\n    name: \"StarCraft palette\",\n    fileExtensions: [\"pal\"],\n    read: require(\"./formats/StarCraft\"),\n    write: (require(\"./formats/StarCraft\")).write\n  },\n  STARCRAFT_PADDED: {\n    name: \"StarCraft terrain palette\",\n    fileExtensions: [\"wpe\"],\n    read: require(\"./formats/StarCraftPadded\"),\n    write: (require(\"./formats/StarCraftPadded\")).write\n  },\n  // AUTOCAD_COLOR_BOOK_PALETTE: {\n  // \tname: \"AutoCAD Color Book\"\n  // \tfileExtensions: [\"acb\"]\n  // \treadFromText?: require \"./formats/AutoCADColorBook\"\n  // }\n\n  // CORELDRAW_PALETTE: {\n  // \t# (same as Paint Shop Pro palette?)\n  // \tname: \"CorelDRAW palette\"\n  // \tfileExtensions: [\"pal\", \"cpl\"]\n  // \treadFromText?: require \"./formats/CorelDRAW\"\n  // }\n  TABULAR: {\n    name: \"tabular colors\",\n    fileExtensions: [\"csv\", \"tsv\", \"txt\"],\n    readFromText: require(\"./formats/tabular\")\n  }\n};\n\nref = Object.keys(formats);\nfor (k = 0, len = ref.length; k < len; k++) {\n  format_id = ref[k];\n  format = formats[format_id];\n  format.fileExtensionsPretty = `.${format.fileExtensions.join(\", .\")}`;\n}\n\nread_palette = function(o, callback) {\n  var e, err, errors, format_ids, l, len1, len2, m, matching_ext, msg, palette, ref1;\n  o.fileContentString = typeof o.data === \"string\" ? o.data : new TextDecoder().decode(o.data);\n  // find formats that use this file extension\n  matching_ext = {};\n  ref1 = Object.keys(formats);\n  for (l = 0, len1 = ref1.length; l < len1; l++) {\n    format_id = ref1[l];\n    if (formats[format_id].fileExtensions.indexOf(o.fileExt) > -1) {\n      matching_ext[format_id] = true;\n    }\n  }\n  \n  // sort formats to the beginning that use this file extension\n  format_ids = Object.keys(formats);\n  format_ids.sort(function(format_id_1, format_id_2) {\n    return (matching_ext[format_id_2] != null) - (matching_ext[format_id_1] != null);\n  });\n  \n  // try loading stuff\n  errors = [];\n  for (m = 0, len2 = format_ids.length; m < len2; m++) {\n    format_id = format_ids[m];\n    format = formats[format_id];\n    if (!(format.read || format.readFromText)) {\n      continue; // skip this format\n    }\n    try {\n      if (format.readFromText) {\n        palette = format.readFromText(o);\n      } else {\n        palette = format.read(o);\n      }\n      if (palette.length === 0) {\n        palette = null;\n        throw new Error(\"no colors returned\");\n      }\n    } catch (error1) {\n      e = error1;\n      // TODO: should this be \"failed to read\"?\n      msg = `failed to load ${o.fileName} as ${format.name}: ${e.message}`;\n      // msg = \"failed to load #{o.fileName} as #{format.name}: #{if format_id.match(/staroffice/i) then e.stack else e.message}\"\n      // if matching_ext[format_id]? #and not e.message.match(/not a/i) # meant to avoid \"Not a <FORMAT> Palette\", overly broad\n      // \tconsole?.error? msg\n      // else\n      // \tconsole?.warn? msg\n\n      // TODO: maybe this shouldn't be an Error object, just a {message, error} object\n      // or {friendlyMessage, error}\n      err = new Error(msg);\n      err.error = e;\n      err.__PATCHED_LIB_TO_ADD_THIS__format = format;\n      errors.push(err);\n    }\n    if (palette) {\n      // console?.info? \"loaded #{o.fileName} as #{format.name}\"\n      palette.confidence = matching_ext[format_id] != null ? 0.9 : 0.01;\n      callback(null, palette, format, matching_ext[format_id] != null, {\n        __errors_before_success: errors\n      });\n      return;\n    }\n  }\n  callback(new LoadingErrors(errors));\n};\n\nnormalize_options = function(o = {}) {\n  var ref1, ref2;\n  if (typeof o === \"string\" || o instanceof String) {\n    o = {\n      filePath: o\n    };\n  }\n  if ((typeof File !== \"undefined\" && File !== null) && o instanceof File) {\n    o = {\n      file: o\n    };\n  }\n  \n  // o.minColors ?= 2\n  // o.maxColors ?= 256\n  if (o.fileName == null) {\n    o.fileName = (ref1 = (ref2 = o.file) != null ? ref2.name : void 0) != null ? ref1 : (o.filePath ? require(\"path\").basename(o.filePath) : void 0);\n  }\n  if (o.fileExt == null) {\n    o.fileExt = `${o.fileName}`.split(\".\").pop();\n  }\n  o.fileExt = `${o.fileExt}`.toLowerCase();\n  return o;\n};\n\n// LoadingErrors\nAnyPalette = {Color, Palette, formats};\n\n// Get palette from a file\nAnyPalette.loadPalette = function(o, callback) {\n  var fr, fs;\n  if (!o) {\n    throw new TypeError(\"parameters required: AnyPalette.loadPalette(options, function callback(error, palette){})\");\n  }\n  if (!callback) {\n    throw new TypeError(\"callback required: AnyPalette.loadPalette(options, function callback(error, palette){})\");\n  }\n  o = normalize_options(o);\n  if (o.data) {\n    return read_palette(o, callback);\n  } else if (o.file) {\n    if (!(o.file instanceof File)) {\n      throw new TypeError(\"options.file was passed but it is not a File\");\n    }\n    fr = new FileReader();\n    fr.onerror = function() {\n      return callback(fr.error);\n    };\n    fr.onload = function() {\n      o.data = fr.result;\n      return read_palette(o, callback);\n    };\n    return fr.readAsArrayBuffer(o.file);\n  } else if (o.filePath != null) {\n    fs = require(\"fs\");\n    return fs.readFile(o.filePath, function(error, data) {\n      if (error) {\n        return callback(error);\n      } else {\n        o.data = data;\n        return read_palette(o, callback);\n      }\n    });\n  } else {\n    throw new TypeError(\"either options.data or options.file or options.filePath must be passed\");\n  }\n};\n\nAnyPalette.writePalette = function(palette, format) {\n  if (format == null) {\n    format = AnyPalette.formats.GIMP_PALETTE;\n  }\n  return format.write(palette);\n};\n\n// file = new File([palette_content_string], (palette.name ? \"Saved Colors\") + \".#{format.fileExtensions[0]}\")\n// return [file, format.fileExtensions[0]]\nAnyPalette.uniqueColors = function(palette, epsilon) {\n  var i, i_color, j, j_color, new_palette, ref1;\n  new_palette = new Palette();\n  new_palette.name = this.name;\n  new_palette.description = this.description;\n  // These aren't super meaningful if some colors are removed:\n  // new_palette.numberOfColumns = palette.numberOfColumns\n  // new_palette.geometrySpecifiedByFile = palette.geometrySpecifiedByFile\n  splice.apply(new_palette, [0, 9e9].concat(ref1 = palette.slice(0))), ref1;\n  // In-place uniquify\n  // (Can't simply use `new_palette[..] = [...new Set(palette)]` because it's Color objects, not strings)\n  i = 0;\n  while (i < new_palette.length) {\n    i_color = new_palette[i];\n    j = i + 1;\n    while (j < new_palette.length) {\n      j_color = new_palette[j];\n      if (Color.is(i_color, j_color, epsilon)) {\n        new_palette.splice(j, 1);\n        j -= 1;\n      }\n      j += 1;\n    }\n    i += 1;\n  }\n  return new_palette;\n};\n\n// Exports\nmodule.exports = AnyPalette;\n\n\n},{\"./Color\":36,\"./Palette\":37,\"./formats/Adobe\":38,\"./formats/AdobeColorTable\":39,\"./formats/CSS\":40,\"./formats/ColorSchemer\":41,\"./formats/GIMP\":42,\"./formats/Homesite\":43,\"./formats/KolourPaint\":44,\"./formats/Paint.NET\":45,\"./formats/PaintShopPro\":46,\"./formats/RIFF\":47,\"./formats/SKP\":48,\"./formats/SPL\":49,\"./formats/StarCraft\":50,\"./formats/StarCraftPadded\":51,\"./formats/StarOffice\":52,\"./formats/sketchpalette\":53,\"./formats/tabular\":54,\"./formats/theme\":55,\"fs\":\"fs\",\"path\":\"path\"}]},{},[57])(57)\n});\n\n"
  },
  {
    "path": "lib/bmp.js",
    "content": "/**\n * Based on: https://github.com/shaozilee/bmp-js/blob/db2c466ca1869ddc09e4b2143404eb03ecd490db/lib/encoder.js\n * @author shaozilee\n * @author 1j01\n * @license MIT\n *\n * BMP format encoder, encodes 24bit, 8bit, 4bit, and 1bit BMP files.\n * Doesn't support compression.\n *\n */\n\nfunction encodeBMP(imgData, bitsPerPixel = 24) {\n\tif (![1, 4, 8, 24/*, 32*/].includes(bitsPerPixel)) {\n\t\tthrow new Error(`not supported: ${bitsPerPixel} bits per pixel`)\n\t}\n\tconst bytesPerPixel = bitsPerPixel / 8; // can be more or less than one\n\t// Rows are always a multiple of 4 bytes long.\n\tconst pixelRowSize = Math.ceil(imgData.width * bytesPerPixel / 4) * 4;\n\tconst pixelDataSize = imgData.height * pixelRowSize;\n\tconst headerInfoSize = 40;\n\tconst indexed = bitsPerPixel <= 8;\n\tconst maxColorCount = 2 ** bitsPerPixel;\n\n\tlet rgbTable;\n\tlet indices;\n\tlet colorCount = 0;\n\tif (indexed) {\n\t\t// rgbTable = [];\n\t\t// for (const color of palette.slice(0, maxColorCount)) {\n\t\t// \tconst [r, g, b] = get_rgba_from_color(color);\n\t\t// \trgbTable.push([r, g, b]);\n\t\t// }\n\t\tconst res = UPNG.quantize(imgData.data, maxColorCount);\n\t\tindices = res.inds;\n\t\trgbTable = res.plte.map((color_entry) => color_entry.est.q.map((component) => Math.round(component * 255)));\n\t\tcolorCount = rgbTable.length;\n\t}\n\n\tconst flag = \"BM\";\n\tconst planes = 1;\n\tconst compressionType = 0;// bitsPerPixel === 32 ? 3 : 0\n\tconst hr = 0;\n\tconst vr = 0;\n\tconst importantColorCount = 0; // 0 means all colors are important\n\n\tconst colorTableSize = colorCount * 4;\n\tconst offsetToPixelData = 54 + colorTableSize;\n\tconst fileSize = pixelDataSize + offsetToPixelData;\n\n\tconst fileArrayBuffer = new ArrayBuffer(fileSize);\n\tconst view = new DataView(fileArrayBuffer);\n\tlet pos = 0;\n\t// BMP header\n\tview.setUint8(pos, flag.charCodeAt(0)); pos += 1;\n\tview.setUint8(pos, flag.charCodeAt(1)); pos += 1;\n\tview.setUint32(pos, fileSize, true); pos += 4;\n\tpos += 4; // reserved / application-specific\n\tview.setUint32(pos, offsetToPixelData, true); pos += 4;\n\t// DIB header\n\tview.setUint32(pos, headerInfoSize, true); pos += 4;\n\tview.setInt32(pos, imgData.width, true); pos += 4;\n\tview.setInt32(pos, -imgData.height, true); pos += 4; // negative indicates rows are stored top to bottom\n\tview.setUint16(pos, planes, true); pos += 2;\n\tview.setUint16(pos, bitsPerPixel, true); pos += 2;\n\tview.setUint32(pos, compressionType, true); pos += 4;\n\tview.setUint32(pos, pixelDataSize, true); pos += 4;\n\tview.setInt32(pos, hr, true); pos += 4;\n\tview.setInt32(pos, vr, true); pos += 4;\n\tview.setUint32(pos, colorCount, true); pos += 4;\n\tview.setUint32(pos, importantColorCount, true); pos += 4;\n\n\tif (rgbTable) {\n\t\tfor (const [r, g, b] of rgbTable) {\n\t\t\tview.setUint8(pos, b); pos += 1;\n\t\t\tview.setUint8(pos, g); pos += 1;\n\t\t\tview.setUint8(pos, r); pos += 1;\n\t\t\tpos += 1;\n\t\t}\n\t}\n\n\tconst getColorIndex = (imgDataIndex) => {\n\t\treturn indices[imgDataIndex / 4];\n\t};\n\n\tlet i = 0;\n\tfor (let y = 0; y < imgData.height; y += 1) {\n\t\tfor (let x = 0; x < imgData.width;) {\n\t\t\tconst pixelGroupPos = pos + y * pixelRowSize + x * bytesPerPixel;\n\t\t\tif (bitsPerPixel === 1) {\n\t\t\t\tlet byte = 0;\n\t\t\t\tfor (let j = 0; j < 8 && x + j < imgData.width; j += 1) {\n\t\t\t\t\tbyte |= getColorIndex(i) << (7 - j);\n\t\t\t\t\ti += 4;\n\t\t\t\t}\n\t\t\t\tview.setUint8(pixelGroupPos, byte);\n\t\t\t\tx += 8;\n\t\t\t} else if (bitsPerPixel === 4) {\n\t\t\t\tlet byte = 0;\n\t\t\t\tfor (let j = 0; j < 2 && x + j < imgData.width; j += 1) {\n\t\t\t\t\tbyte |= getColorIndex(i) << (4 * (1 - j));\n\t\t\t\t\ti += 4;\n\t\t\t\t}\n\t\t\t\tview.setUint8(pixelGroupPos, byte);\n\t\t\t\tx += 2;\n\t\t\t} else if (bitsPerPixel === 8) {\n\t\t\t\tview.setUint8(pixelGroupPos, getColorIndex(i));\n\t\t\t\ti += 4;\n\t\t\t\tx += 1;\n\t\t\t} else {\n\t\t\t\tview.setUint8(pixelGroupPos + 2, imgData.data[i + 0]); // red\n\t\t\t\tview.setUint8(pixelGroupPos + 1, imgData.data[i + 1]); // green\n\t\t\t\tview.setUint8(pixelGroupPos + 0, imgData.data[i + 2]); // blue\n\t\t\t\t// if (bitsPerPixel === 32) {\n\t\t\t\t// \tview.setUint8(pixelGroupPos + 3, imgData.data[i + 3]); // alpha\n\t\t\t\t// }\n\t\t\t\ti += 4;\n\t\t\t\tx += 1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn view.buffer;\n}\n\n/**\n * Based on https://github.com/ericandrewlewis/bitmap-js/blob/c33a6137829b18e3420a763ef20bffae874610b3/index.js\n * @author ericandrewlewis\n * @license MIT\n */\n/*\nfunction decodeBMP(arrayBuffer) {\n\tfunction readBitmapFileHeader(view) {\n\t\tif (view.getUint8(0) !== \"B\".charCodeAt(0) || view.getUint8(1) !== \"M\".charCodeAt(0)) {\n\t\t\tthrow new Error(\"not a BMP file\"); // Note: exact error message is checked for to detect this case\n\t\t}\n\t\treturn {\n\t\t\tfilesize: view.getUint32(2, true),\n\t\t\timageDataOffset: view.getUint32(10, true)\n\t\t};\n\t}\n\n\tconst dibHeaderLengthToVersionMap = {\n\t\t12: \"BITMAPCOREHEADER\",\n\t\t16: \"OS22XBITMAPHEADER\",\n\t\t40: \"BITMAPINFOHEADER\",\n\t\t52: \"BITMAPV2INFOHEADER\",\n\t\t56: \"BITMAPV3INFOHEADER\",\n\t\t64: \"OS22XBITMAPHEADER\",\n\t\t108: \"BITMAPV4HEADER\",\n\t\t124: \"BITMAPV5HEADER\"\n\t};\n\n\tfunction readDibHeader(view) {\n\t\tconst dibHeaderLength = view.getUint32(14, true);\n\t\tconst header = {};\n\t\theader.headerLength = dibHeaderLength;\n\t\theader.headerType = dibHeaderLengthToVersionMap[dibHeaderLength];\n\t\theader.width = view.getInt32(18, true);\n\t\theader.height = view.getInt32(22, true); // Note: negative is used to mean rows go top to bottom instead of bottom to top\n\t\tif (header.headerType == \"BITMAPCOREHEADER\") {\n\t\t\treturn header;\n\t\t}\n\t\theader.bitsPerPixel = view.getUint16(28, true);\n\t\theader.compressionType = view.getUint32(30, true);\n\t\tif (header.headerType == \"OS22XBITMAPHEADER\") {\n\t\t\treturn header;\n\t\t}\n\t\theader.bitmapDataSize = view.getUint32(34, true);\n\t\theader.numberOfColorsInPalette = view.getUint32(46, true);\n\t\theader.numberOfImportantColors = view.getUint32(50, true);\n\t\tif (header.headerType == \"BITMAPINFOHEADER\") {\n\t\t\treturn header;\n\t\t}\n\t\t// There are more data fields in later versions of the dib header.\n\t\t// I hear that BITMAPINFOHEADER is the most widely supported\n\t\t// header type, so I'm not going to implement them yet.\n\t\treturn header;\n\t}\n\n\tfunction readColorTable(view) {\n\t\tconst dibHeader = readDibHeader(view);\n\t\tconst colorTable = [];\n\t\tconst sourceStart = 14 + dibHeader.headerLength;\n\t\tconst numberOfColorsInPalette = dibHeader.numberOfColorsInPalette || (dibHeader.bitsPerPixel <= 8 ? 2 ** dibHeader.bitsPerPixel : 0);\n\t\tfor (let i = 0; i < numberOfColorsInPalette; i += 1) {\n\t\t\tcolorTable.push({\n\t\t\t\tr: view.getUint8(sourceStart + i * 4 + 2),\n\t\t\t\tg: view.getUint8(sourceStart + i * 4 + 1),\n\t\t\t\tb: view.getUint8(sourceStart + i * 4 + 0),\n\t\t\t});\n\t\t}\n\t\treturn colorTable;\n\t}\n\n\tconst view = new DataView(arrayBuffer);\n\tconst fileHeader = readBitmapFileHeader(view);\n\tconst dibHeader = readDibHeader(view);\n\t// const imageDataLength = dibHeader.bitmapDataSize;\n\t// const imageDataOffset = fileHeader.imageDataOffset;\n\tconst colorTable = readColorTable(view);\n\t// view.copy(imageData, 0, imageDataOffset);\n\tconst width = Math.abs(fileHeader.width);\n\tconst height = Math.abs(fileHeader.height); // negative is used to mean rows go top to bottom instead of bottom to top\n\t// const imageData = new ImageData(width, height);\n\t// const pixelRowSize = Math.ceil(width * dibHeader.bitsPerPixel / 8 / 4) * 4;\n\t// for (let y = 0; y < height; y += 1) {\n\t// \tfor (let x = 0; x < width; x += 1) {\n\t// \t\tconst byte = view.readUint8(y * pixelRowSize + x * dibHeader.bitsPerPixel / 8);\n\t// \t\timageData.data[y * height * 4 + 0,1,2,3] = ...;\n\t// \t}\n\t// }\n\treturn {\n\t\t// width,\n\t\t// height,\n\t\t// fileHeader,\n\t\t// dibHeader,\n\t\t// imageData,\n\t\tcolorTable,\n\t\tbitsPerPixel: dibHeader.bitsPerPixel,\n\t};\n}\n*/\n\nfunction decodeBMP(arrayBuffer) {\n\tconst decoder = new BmpDecoder(arrayBuffer, {toRGBA: true});\n\treturn {\n\t\tbitsPerPixel: decoder.bitsPerPixel,\n\t\tcolorTable: decoder.palette ? decoder.palette.map(({red, green, blue})=> ({r: red, g: green, b: blue})) : [],\n\t\timageData: new ImageData(decoder.data, decoder.width, decoder.height),\n\t};\n}\n\n/**\n * Based on: https://github.com/hipstersmoothie/bmp-ts\n * @license MIT\n */\n\nconst HeaderTypes = {};\nHeaderTypes[HeaderTypes[\"BITMAP_INFO_HEADER\"] = 40] = \"BITMAP_INFO_HEADER\";\nHeaderTypes[HeaderTypes[\"BITMAP_V2_INFO_HEADER\"] = 52] = \"BITMAP_V2_INFO_HEADER\";\nHeaderTypes[HeaderTypes[\"BITMAP_V3_INFO_HEADER\"] = 56] = \"BITMAP_V3_INFO_HEADER\";\nHeaderTypes[HeaderTypes[\"BITMAP_V4_HEADER\"] = 108] = \"BITMAP_V4_HEADER\";\nHeaderTypes[HeaderTypes[\"BITMAP_V5_HEADER\"] = 124] = \"BITMAP_V5_HEADER\";\nObject.freeze(HeaderTypes);\n\n// We have these:\n//\n// const sample = 0101 0101 0101 0101\n// const mask   = 0111 1100 0000 0000\n// 256        === 0000 0001 0000 0000\n//\n// We want to take the sample and turn it into an 8-bit value.\n//\n// 1. We extract the last bit of the mask:\n//\n// 0000 0100 0000 0000\n//       ^\n//\n// Like so:\n//\n// const a = ~mask =    1000 0011 1111 1111\n// const b = a + 1 =    1000 0100 0000 0000\n// const c = b & mask = 0000 0100 0000 0000\n//\n// 2. We shift it to the right and extract the bit before the first:\n//\n// 0000 0000 0010 0000\n//             ^\n//\n// Like so:\n//\n// const d = mask / c = 0000 0000 0001 1111\n// const e = mask + 1 = 0000 0000 0010 0000\n//\n// 3. We apply the mask and the two values above to a sample:\n//\n// const f = sample & mask = 0101 0100 0000 0000\n// const g = f / c =         0000 0000 0001 0101\n// const h = 256 / e =       0000 0000 0000 0100\n// const i = g * h =         0000 0000 1010 1000\n//                                     ^^^^ ^\n//\n// Voila, we have extracted a sample and \"stretched\" it to 8 bits. For samples\n// which are already 8-bit, h === 1 and g === i.\nfunction maskColor(maskRed, maskGreen, maskBlue, maskAlpha) {\n    const maskRedR = (~maskRed + 1) & maskRed;\n    const maskGreenR = (~maskGreen + 1) & maskGreen;\n    const maskBlueR = (~maskBlue + 1) & maskBlue;\n    const maskAlphaR = (~maskAlpha + 1) & maskAlpha;\n    const shiftedMaskRedL = maskRed / maskRedR + 1;\n    const shiftedMaskGreenL = maskGreen / maskGreenR + 1;\n    const shiftedMaskBlueL = maskBlue / maskBlueR + 1;\n    const shiftedMaskAlphaL = maskAlpha / maskAlphaR + 1;\n    return {\n        shiftRed: (x) => (((x & maskRed) / maskRedR) * 0x100) / shiftedMaskRedL,\n        shiftGreen: (x) => (((x & maskGreen) / maskGreenR) * 0x100) / shiftedMaskGreenL,\n        shiftBlue: (x) => (((x & maskBlue) / maskBlueR) * 0x100) / shiftedMaskBlueL,\n        shiftAlpha: maskAlpha !== 0\n            ? (x) => (((x & maskAlpha) / maskAlphaR) * 0x100) / shiftedMaskAlphaL\n            : () => 255\n    };\n}\nclass BmpDecoder {\n\tconstructor(arrayBuffer, { toRGBA } = { toRGBA: false }) {\n\t\tthis.view = new DataView(arrayBuffer);\n\t\tthis.toRGBA = !!toRGBA;\n\t\tthis.pos = 0;\n\t\tthis.bottomUp = true;\n\t\tthis.flag = String.fromCharCode(this.view.getUint8(0)) + String.fromCharCode(this.view.getUint8(1));\n\t\tthis.pos += 2;\n\t\tif (this.flag !== 'BM') {\n\t\t\tthrow new Error('Invalid BMP File');\n\t\t}\n\t\tthis.locRed = this.toRGBA ? 0 : 3;\n\t\tthis.locGreen = this.toRGBA ? 1 : 2;\n\t\tthis.locBlue = this.toRGBA ? 2 : 1;\n\t\tthis.locAlpha = this.toRGBA ? 3 : 0;\n\t\tthis.parseHeader();\n\t\tthis.parseRGBA();\n\t}\n\tparseHeader() {\n\t\tthis.fileSize = this.view.getUint32(this.pos, true); this.pos += 4;\n\t\tthis.reserved1 = this.view.getUint16(this.pos, true); this.pos += 2;\n\t\tthis.reserved2 = this.view.getUint16(this.pos, true); this.pos += 2;\n\t\tthis.offset = this.view.getUint32(this.pos, true); this.pos += 4;\n\t\t// End of BITMAP_FILE_HEADER\n\t\tthis.headerSize = this.view.getUint32(this.pos, true); this.pos += 4;\n\t\tif (!(this.headerSize in HeaderTypes)) {\n\t\t\tthrow new Error(`Unsupported BMP header size ${this.headerSize}`);\n\t\t}\n\t\tthis.width = this.view.getInt32(this.pos, true); this.pos += 4;\n\t\tthis.height = this.view.getInt32(this.pos, true); this.pos += 4;\n\t\tif (this.height < 0) {\n\t\t\tthis.height *= -1;\n\t\t\tthis.bottomUp = false;\n\t\t}\n\t\tthis.planes = this.view.getUint16(this.pos, true); this.pos += 2;\n\t\tthis.bitsPerPixel = this.view.getUint16(this.pos, true); this.pos += 2;\n\t\tthis.compression = this.view.getUint32(this.pos, true); this.pos += 4;\n\t\tthis.rawSize = this.view.getUint32(this.pos, true); this.pos += 4;\n\t\tthis.hr = this.view.getInt32(this.pos, true); this.pos += 4;\n\t\tthis.vr = this.view.getInt32(this.pos, true); this.pos += 4;\n\t\tthis.colors = this.view.getUint32(this.pos, true); this.pos += 4;\n\t\tthis.importantColors = this.view.getUint32(this.pos, true); this.pos += 4;\n\t\t// De facto defaults\n\t\tif (this.bitsPerPixel === 32) {\n\t\t\tthis.maskAlpha = 0;\n\t\t\tthis.maskRed = 0x00ff0000;\n\t\t\tthis.maskGreen = 0x0000ff00;\n\t\t\tthis.maskBlue = 0x000000ff;\n\t\t}\n\t\telse if (this.bitsPerPixel === 16) {\n\t\t\tthis.maskAlpha = 0;\n\t\t\tthis.maskRed = 0x7c00;\n\t\t\tthis.maskGreen = 0x03e0;\n\t\t\tthis.maskBlue = 0x001f;\n\t\t}\n\t\t// End of BITMAP_INFO_HEADER\n\t\tif (this.headerSize > HeaderTypes.BITMAP_INFO_HEADER ||\n\t\t\tthis.compression === 3 /* BI_BIT_FIELDS */ ||\n\t\t\tthis.compression === 6 /* BI_ALPHA_BIT_FIELDS */) {\n\t\t\tthis.maskRed = this.view.getUint32(this.pos, true); this.pos += 4;\n\t\t\tthis.maskGreen = this.view.getUint32(this.pos, true); this.pos += 4;\n\t\t\tthis.maskBlue = this.view.getUint32(this.pos, true); this.pos += 4;\n\t\t}\n\t\t// End of BITMAP_V2_INFO_HEADER\n\t\tif (this.headerSize > HeaderTypes.BITMAP_V2_INFO_HEADER ||\n\t\t\tthis.compression === 6 /* BI_ALPHA_BIT_FIELDS */) {\n\t\t\tthis.maskAlpha = this.view.getUint32(this.pos, true); this.pos += 4;\n\t\t}\n\t\t// End of BITMAP_V3_INFO_HEADER\n\t\tif (this.headerSize > HeaderTypes.BITMAP_V3_INFO_HEADER) {\n\t\t\tthis.pos +=\n\t\t\t\tHeaderTypes.BITMAP_V4_HEADER - HeaderTypes.BITMAP_V3_INFO_HEADER;\n\t\t}\n\t\t// End of BITMAP_V4_HEADER\n\t\tif (this.headerSize > HeaderTypes.BITMAP_V4_HEADER) {\n\t\t\tthis.pos += HeaderTypes.BITMAP_V5_HEADER - HeaderTypes.BITMAP_V4_HEADER;\n\t\t}\n\t\t// End of BITMAP_V5_HEADER\n\t\tif (this.bitsPerPixel <= 8 || this.colors > 0) {\n\t\t\tconst len = this.colors === 0 ? 1 << this.bitsPerPixel : this.colors;\n\t\t\tthis.palette = new Array(len);\n\t\t\tfor (let i = 0; i < len; i++) {\n\t\t\t\tconst blue = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\t\tconst green = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\t\tconst red = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\t\tconst quad = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\t\tthis.palette[i] = {\n\t\t\t\t\tred,\n\t\t\t\t\tgreen,\n\t\t\t\t\tblue,\n\t\t\t\t\tquad\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\t// End of color table\n\t\tconst coloShift = maskColor(this.maskRed, this.maskGreen, this.maskBlue, this.maskAlpha);\n\t\tthis.shiftRed = coloShift.shiftRed;\n\t\tthis.shiftGreen = coloShift.shiftGreen;\n\t\tthis.shiftBlue = coloShift.shiftBlue;\n\t\tthis.shiftAlpha = coloShift.shiftAlpha;\n\t}\n\tparseRGBA() {\n\t\tthis.data = new Uint8ClampedArray(this.width * this.height * 4);\n\t\tswitch (this.bitsPerPixel) {\n\t\t\tcase 1:\n\t\t\t\tthis.parse1bpp();\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\tthis.parse4bpp();\n\t\t\t\tbreak;\n\t\t\tcase 8:\n\t\t\t\tthis.parse8bpp();\n\t\t\t\tbreak;\n\t\t\tcase 16:\n\t\t\t\tthis.parse16bpp();\n\t\t\t\tbreak;\n\t\t\tcase 24:\n\t\t\t\tthis.parse24bpp();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthis.parse32bpp();\n\t\t}\n\t}\n\tparse1bpp() {\n\t\tconst xLen = Math.ceil(this.width / 8);\n\t\tconst mode = xLen % 4;\n\t\tconst padding = mode !== 0 ? 4 - mode : 0;\n\t\tlet lastLine;\n\t\tthis.scanImage(padding, xLen, (x, line) => {\n\t\t\tif (line !== lastLine) {\n\t\t\t\tlastLine = line;\n\t\t\t}\n\t\t\tconst b = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\tconst location = line * this.width * 4 + x * 8 * 4;\n\t\t\tfor (let i = 0; i < 8; i++) {\n\t\t\t\tif (x * 8 + i < this.width) {\n\t\t\t\t\t// @TODO: use setPixelData?\n\t\t\t\t\tconst rgb = this.palette[(b >> (7 - i)) & 0x1];\n\t\t\t\t\tthis.data[location + i * 4 + this.locAlpha] = 255;\n\t\t\t\t\tthis.data[location + i * 4 + this.locBlue] = rgb.blue;\n\t\t\t\t\tthis.data[location + i * 4 + this.locGreen] = rgb.green;\n\t\t\t\t\tthis.data[location + i * 4 + this.locRed] = rgb.red;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tparse4bpp() {\n\t\tif (this.compression === 2 /* BI_RLE4 */) {\n\t\t\tlet lowNibble = false; //for all count of pixel\n\t\t\tlet lines = this.bottomUp ? this.height - 1 : 0;\n\t\t\tlet location = 0;\n\t\t\twhile (location < this.data.length) {\n\t\t\t\tconst a = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\t\tconst b = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\t\t//absolute mode\n\t\t\t\tif (a === 0) {\n\t\t\t\t\tif (b === 0) {\n\t\t\t\t\t\t//line end\n\t\t\t\t\t\tlines += this.bottomUp ? -1 : 1;\n\t\t\t\t\t\tlocation = lines * this.width * 4;\n\t\t\t\t\t\tlowNibble = false;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (b === 1) {\n\t\t\t\t\t\t// image end\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (b === 2) {\n\t\t\t\t\t\t// offset x, y\n\t\t\t\t\t\tconst x = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\t\t\t\tconst y = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\t\t\t\tlines += this.bottomUp ? -y : y;\n\t\t\t\t\t\tlocation += y * this.width * 4 + x * 4;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet c = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\t\t\t\tfor (let i = 0; i < b; i++) {\n\t\t\t\t\t\t\tlocation = this.setPixelData(location, lowNibble ? c & 0x0f : (c & 0xf0) >> 4);\n\t\t\t\t\t\t\tif (i & 1 && i + 1 < b) {\n\t\t\t\t\t\t\t\tc = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlowNibble = !lowNibble;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ((((b + 1) >> 1) & 1) === 1) {\n\t\t\t\t\t\t\tthis.pos += 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t//encoded mode\n\t\t\t\t\tfor (let i = 0; i < a; i++) {\n\t\t\t\t\t\tlocation = this.setPixelData(location, lowNibble ? b & 0x0f : (b & 0xf0) >> 4);\n\t\t\t\t\t\tlowNibble = !lowNibble;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconst xLen = Math.ceil(this.width / 2);\n\t\t\tconst mode = xLen % 4;\n\t\t\tconst padding = mode !== 0 ? 4 - mode : 0;\n\t\t\tthis.scanImage(padding, xLen, (x, line) => {\n\t\t\t\tconst b = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\t\tconst location = line * this.width * 4 + x * 2 * 4;\n\t\t\t\tconst first4 = b >> 4;\n\t\t\t\t// @TODO: use setPixelData?\n\t\t\t\tlet rgb = this.palette[first4];\n\t\t\t\tthis.data[location + this.locAlpha] = 255;\n\t\t\t\tthis.data[location + this.locBlue] = rgb.blue;\n\t\t\t\tthis.data[location + this.locGreen] = rgb.green;\n\t\t\t\tthis.data[location + this.locRed] = rgb.red;\n\t\t\t\tif (x * 2 + 1 >= this.width) {\n\t\t\t\t\t// throw new Error('Something');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tconst last4 = b & 0x0f;\n\t\t\t\t// @TODO: use setPixelData?\n\t\t\t\trgb = this.palette[last4];\n\t\t\t\tthis.data[location + 4 + this.locAlpha] = 255;\n\t\t\t\tthis.data[location + 4 + this.locBlue] = rgb.blue;\n\t\t\t\tthis.data[location + 4 + this.locGreen] = rgb.green;\n\t\t\t\tthis.data[location + 4 + this.locRed] = rgb.red;\n\t\t\t});\n\t\t}\n\t}\n\tparse8bpp() {\n\t\tif (this.compression === 1 /* BI_RLE8 */) {\n\t\t\tlet lines = this.bottomUp ? this.height - 1 : 0;\n\t\t\tlet location = 0;\n\t\t\twhile (location < this.data.length) {\n\t\t\t\tconst a = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\t\tconst b = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\t\t//absolute mode\n\t\t\t\tif (a === 0) {\n\t\t\t\t\tif (b === 0) {\n\t\t\t\t\t\t//line end\n\t\t\t\t\t\tlines += this.bottomUp ? -1 : 1;\n\t\t\t\t\t\tlocation = lines * this.width * 4;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (b === 1) {\n\t\t\t\t\t\t//image end\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (b === 2) {\n\t\t\t\t\t\t//offset x,y\n\t\t\t\t\t\tconst x = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\t\t\t\tconst y = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\t\t\t\tlines += this.bottomUp ? -y : y;\n\t\t\t\t\t\tlocation += y * this.width * 4 + x * 4;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (let i = 0; i < b; i++) {\n\t\t\t\t\t\t\tconst c = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\t\t\t\t\tlocation = this.setPixelData(location, c);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// why 1 === 1???\n\t\t\t\t\t\t// eslint-disable-next-line no-self-compare\n\t\t\t\t\t\tconst shouldIncrement = b & (1 === 1);\n\t\t\t\t\t\tif (shouldIncrement) {\n\t\t\t\t\t\t\tthis.pos += 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t//encoded mode\n\t\t\t\t\tfor (let i = 0; i < a; i++) {\n\t\t\t\t\t\tlocation = this.setPixelData(location, b);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconst mode = this.width % 4;\n\t\t\tconst padding = mode !== 0 ? 4 - mode : 0;\n\t\t\tthis.scanImage(padding, this.width, (x, line) => {\n\t\t\t\tconst b = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\t\tconst location = line * this.width * 4 + x * 4;\n\t\t\t\t// @TODO: use setPixelData?\n\t\t\t\tif (b < this.palette.length) {\n\t\t\t\t\tconst rgb = this.palette[b];\n\t\t\t\t\tthis.data[location + this.locRed] = rgb.red;\n\t\t\t\t\tthis.data[location + this.locGreen] = rgb.green;\n\t\t\t\t\tthis.data[location + this.locBlue] = rgb.blue;\n\t\t\t\t\tthis.data[location + this.locAlpha] = 0xff;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.data[location] = 0xff;\n\t\t\t\t\tthis.data[location + 1] = 0xff;\n\t\t\t\t\tthis.data[location + 2] = 0xff;\n\t\t\t\t\tthis.data[location + 3] = 0xff;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\tparse16bpp() {\n\t\tconst padding = (this.width % 2) * 2;\n\t\tthis.scanImage(padding, this.width, (x, line) => {\n\t\t\tconst loc = line * this.width * 4 + x * 4;\n\t\t\tconst px = this.view.getUint16(this.pos, true); this.pos += 2;\n\t\t\tthis.data[loc + this.locRed] = this.shiftRed(px);\n\t\t\tthis.data[loc + this.locGreen] = this.shiftGreen(px);\n\t\t\tthis.data[loc + this.locBlue] = this.shiftBlue(px);\n\t\t\tthis.data[loc + this.locAlpha] = 255; //this.shiftAlpha(px); // @TODO??\n\t\t});\n\t}\n\tparse24bpp() {\n\t\tconst padding = this.width % 4;\n\t\tthis.scanImage(padding, this.width, (x, line) => {\n\t\t\tconst loc = line * this.width * 4 + x * 4;\n\t\t\tconst blue = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\tconst green = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\tconst red = this.view.getUint8(this.pos); this.pos += 1;\n\t\t\tthis.data[loc + this.locRed] = red;\n\t\t\tthis.data[loc + this.locGreen] = green;\n\t\t\tthis.data[loc + this.locBlue] = blue;\n\t\t\tthis.data[loc + this.locAlpha] = 255;\n\t\t});\n\t}\n\tparse32bpp() {\n\t\tthis.scanImage(0, this.width, (x, line) => {\n\t\t\tconst loc = line * this.width * 4 + x * 4;\n\t\t\tconst px = this.view.getUint32(this.pos, true); this.pos += 4;\n\t\t\tthis.data[loc + this.locRed] = this.shiftRed(px);\n\t\t\tthis.data[loc + this.locGreen] = this.shiftGreen(px);\n\t\t\tthis.data[loc + this.locBlue] = this.shiftBlue(px);\n\t\t\tthis.data[loc + this.locAlpha] = this.shiftAlpha(px);\n\t\t});\n\t}\n\tscanImage(padding = 0, width = this.width, processPixel) {\n\t\tfor (let y = this.height - 1; y >= 0; y--) {\n\t\t\tconst line = this.bottomUp ? y : this.height - 1 - y;\n\t\t\tfor (let x = 0; x < width; x++) {\n\t\t\t\tconst result = processPixel.call(this, x, line);\n\t\t\t\tif (result === false) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.pos += padding;\n\t\t}\n\t}\n\tsetPixelData(location, rgbIndex) {\n\t\tconst { blue, green, red } = this.palette[rgbIndex];\n\t\tthis.data[location + this.locAlpha] = 255;\n\t\tthis.data[location + this.locBlue] = blue;\n\t\tthis.data[location + this.locGreen] = green;\n\t\tthis.data[location + this.locRed] = red;\n\t\treturn location + 4;\n\t}\n}\n"
  },
  {
    "path": "lib/discord-embedded-app-sdk-v1.2.0-bundled-with-skypack.js",
    "content": "var global$1 = typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {};\nvar commonjsGlobal = typeof globalThis !== \"undefined\" ? globalThis : typeof window !== \"undefined\" ? window : typeof global$1 !== \"undefined\" ? global$1 : typeof self !== \"undefined\" ? self : {};\nfunction getDefaultExportFromCjs(x) {\n  return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, \"default\") ? x[\"default\"] : x;\n}\nvar eventemitter3 = {exports: {}};\n(function(module) {\n  var has = Object.prototype.hasOwnProperty, prefix = \"~\";\n  function Events2() {\n  }\n  if (Object.create) {\n    Events2.prototype = Object.create(null);\n    if (!new Events2().__proto__)\n      prefix = false;\n  }\n  function EE(fn, context, once) {\n    this.fn = fn;\n    this.context = context;\n    this.once = once || false;\n  }\n  function addListener(emitter, event, fn, context, once) {\n    if (typeof fn !== \"function\") {\n      throw new TypeError(\"The listener must be a function\");\n    }\n    var listener = new EE(fn, context || emitter, once), evt = prefix ? prefix + event : event;\n    if (!emitter._events[evt])\n      emitter._events[evt] = listener, emitter._eventsCount++;\n    else if (!emitter._events[evt].fn)\n      emitter._events[evt].push(listener);\n    else\n      emitter._events[evt] = [emitter._events[evt], listener];\n    return emitter;\n  }\n  function clearEvent(emitter, evt) {\n    if (--emitter._eventsCount === 0)\n      emitter._events = new Events2();\n    else\n      delete emitter._events[evt];\n  }\n  function EventEmitter2() {\n    this._events = new Events2();\n    this._eventsCount = 0;\n  }\n  EventEmitter2.prototype.eventNames = function eventNames() {\n    var names = [], events, name;\n    if (this._eventsCount === 0)\n      return names;\n    for (name in events = this._events) {\n      if (has.call(events, name))\n        names.push(prefix ? name.slice(1) : name);\n    }\n    if (Object.getOwnPropertySymbols) {\n      return names.concat(Object.getOwnPropertySymbols(events));\n    }\n    return names;\n  };\n  EventEmitter2.prototype.listeners = function listeners(event) {\n    var evt = prefix ? prefix + event : event, handlers = this._events[evt];\n    if (!handlers)\n      return [];\n    if (handlers.fn)\n      return [handlers.fn];\n    for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n      ee[i] = handlers[i].fn;\n    }\n    return ee;\n  };\n  EventEmitter2.prototype.listenerCount = function listenerCount(event) {\n    var evt = prefix ? prefix + event : event, listeners = this._events[evt];\n    if (!listeners)\n      return 0;\n    if (listeners.fn)\n      return 1;\n    return listeners.length;\n  };\n  EventEmitter2.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n    var evt = prefix ? prefix + event : event;\n    if (!this._events[evt])\n      return false;\n    var listeners = this._events[evt], len = arguments.length, args, i;\n    if (listeners.fn) {\n      if (listeners.once)\n        this.removeListener(event, listeners.fn, void 0, true);\n      switch (len) {\n        case 1:\n          return listeners.fn.call(listeners.context), true;\n        case 2:\n          return listeners.fn.call(listeners.context, a1), true;\n        case 3:\n          return listeners.fn.call(listeners.context, a1, a2), true;\n        case 4:\n          return listeners.fn.call(listeners.context, a1, a2, a3), true;\n        case 5:\n          return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n        case 6:\n          return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n      }\n      for (i = 1, args = new Array(len - 1); i < len; i++) {\n        args[i - 1] = arguments[i];\n      }\n      listeners.fn.apply(listeners.context, args);\n    } else {\n      var length = listeners.length, j;\n      for (i = 0; i < length; i++) {\n        if (listeners[i].once)\n          this.removeListener(event, listeners[i].fn, void 0, true);\n        switch (len) {\n          case 1:\n            listeners[i].fn.call(listeners[i].context);\n            break;\n          case 2:\n            listeners[i].fn.call(listeners[i].context, a1);\n            break;\n          case 3:\n            listeners[i].fn.call(listeners[i].context, a1, a2);\n            break;\n          case 4:\n            listeners[i].fn.call(listeners[i].context, a1, a2, a3);\n            break;\n          default:\n            if (!args)\n              for (j = 1, args = new Array(len - 1); j < len; j++) {\n                args[j - 1] = arguments[j];\n              }\n            listeners[i].fn.apply(listeners[i].context, args);\n        }\n      }\n    }\n    return true;\n  };\n  EventEmitter2.prototype.on = function on(event, fn, context) {\n    return addListener(this, event, fn, context, false);\n  };\n  EventEmitter2.prototype.once = function once(event, fn, context) {\n    return addListener(this, event, fn, context, true);\n  };\n  EventEmitter2.prototype.removeListener = function removeListener(event, fn, context, once) {\n    var evt = prefix ? prefix + event : event;\n    if (!this._events[evt])\n      return this;\n    if (!fn) {\n      clearEvent(this, evt);\n      return this;\n    }\n    var listeners = this._events[evt];\n    if (listeners.fn) {\n      if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {\n        clearEvent(this, evt);\n      }\n    } else {\n      for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n        if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {\n          events.push(listeners[i]);\n        }\n      }\n      if (events.length)\n        this._events[evt] = events.length === 1 ? events[0] : events;\n      else\n        clearEvent(this, evt);\n    }\n    return this;\n  };\n  EventEmitter2.prototype.removeAllListeners = function removeAllListeners(event) {\n    var evt;\n    if (event) {\n      evt = prefix ? prefix + event : event;\n      if (this._events[evt])\n        clearEvent(this, evt);\n    } else {\n      this._events = new Events2();\n      this._eventsCount = 0;\n    }\n    return this;\n  };\n  EventEmitter2.prototype.off = EventEmitter2.prototype.removeListener;\n  EventEmitter2.prototype.addListener = EventEmitter2.prototype.on;\n  EventEmitter2.prefixed = prefix;\n  EventEmitter2.EventEmitter = EventEmitter2;\n  {\n    module.exports = EventEmitter2;\n  }\n})(eventemitter3);\nvar eventemitter3Exports = eventemitter3.exports;\nvar EventEmitter = /* @__PURE__ */ getDefaultExportFromCjs(eventemitter3Exports);\nvar util;\n(function(util2) {\n  util2.assertEqual = (val) => val;\n  function assertIs(_arg) {\n  }\n  util2.assertIs = assertIs;\n  function assertNever(_x) {\n    throw new Error();\n  }\n  util2.assertNever = assertNever;\n  util2.arrayToEnum = (items) => {\n    const obj = {};\n    for (const item of items) {\n      obj[item] = item;\n    }\n    return obj;\n  };\n  util2.getValidEnumValues = (obj) => {\n    const validKeys = util2.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n    const filtered = {};\n    for (const k of validKeys) {\n      filtered[k] = obj[k];\n    }\n    return util2.objectValues(filtered);\n  };\n  util2.objectValues = (obj) => {\n    return util2.objectKeys(obj).map(function(e) {\n      return obj[e];\n    });\n  };\n  util2.objectKeys = typeof Object.keys === \"function\" ? (obj) => Object.keys(obj) : (object) => {\n    const keys = [];\n    for (const key in object) {\n      if (Object.prototype.hasOwnProperty.call(object, key)) {\n        keys.push(key);\n      }\n    }\n    return keys;\n  };\n  util2.find = (arr, checker) => {\n    for (const item of arr) {\n      if (checker(item))\n        return item;\n    }\n    return void 0;\n  };\n  util2.isInteger = typeof Number.isInteger === \"function\" ? (val) => Number.isInteger(val) : (val) => typeof val === \"number\" && isFinite(val) && Math.floor(val) === val;\n  function joinValues(array, separator = \" | \") {\n    return array.map((val) => typeof val === \"string\" ? `'${val}'` : val).join(separator);\n  }\n  util2.joinValues = joinValues;\n  util2.jsonStringifyReplacer = (_, value) => {\n    if (typeof value === \"bigint\") {\n      return value.toString();\n    }\n    return value;\n  };\n})(util || (util = {}));\nvar objectUtil;\n(function(objectUtil2) {\n  objectUtil2.mergeShapes = (first, second) => {\n    return {\n      ...first,\n      ...second\n    };\n  };\n})(objectUtil || (objectUtil = {}));\nconst ZodParsedType = util.arrayToEnum([\n  \"string\",\n  \"nan\",\n  \"number\",\n  \"integer\",\n  \"float\",\n  \"boolean\",\n  \"date\",\n  \"bigint\",\n  \"symbol\",\n  \"function\",\n  \"undefined\",\n  \"null\",\n  \"array\",\n  \"object\",\n  \"unknown\",\n  \"promise\",\n  \"void\",\n  \"never\",\n  \"map\",\n  \"set\"\n]);\nconst getParsedType = (data) => {\n  const t = typeof data;\n  switch (t) {\n    case \"undefined\":\n      return ZodParsedType.undefined;\n    case \"string\":\n      return ZodParsedType.string;\n    case \"number\":\n      return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n    case \"boolean\":\n      return ZodParsedType.boolean;\n    case \"function\":\n      return ZodParsedType.function;\n    case \"bigint\":\n      return ZodParsedType.bigint;\n    case \"symbol\":\n      return ZodParsedType.symbol;\n    case \"object\":\n      if (Array.isArray(data)) {\n        return ZodParsedType.array;\n      }\n      if (data === null) {\n        return ZodParsedType.null;\n      }\n      if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n        return ZodParsedType.promise;\n      }\n      if (typeof Map !== \"undefined\" && data instanceof Map) {\n        return ZodParsedType.map;\n      }\n      if (typeof Set !== \"undefined\" && data instanceof Set) {\n        return ZodParsedType.set;\n      }\n      if (typeof Date !== \"undefined\" && data instanceof Date) {\n        return ZodParsedType.date;\n      }\n      return ZodParsedType.object;\n    default:\n      return ZodParsedType.unknown;\n  }\n};\nconst ZodIssueCode = util.arrayToEnum([\n  \"invalid_type\",\n  \"invalid_literal\",\n  \"custom\",\n  \"invalid_union\",\n  \"invalid_union_discriminator\",\n  \"invalid_enum_value\",\n  \"unrecognized_keys\",\n  \"invalid_arguments\",\n  \"invalid_return_type\",\n  \"invalid_date\",\n  \"invalid_string\",\n  \"too_small\",\n  \"too_big\",\n  \"invalid_intersection_types\",\n  \"not_multiple_of\",\n  \"not_finite\"\n]);\nconst quotelessJson = (obj) => {\n  const json = JSON.stringify(obj, null, 2);\n  return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nclass ZodError extends Error {\n  constructor(issues) {\n    super();\n    this.issues = [];\n    this.addIssue = (sub) => {\n      this.issues = [...this.issues, sub];\n    };\n    this.addIssues = (subs = []) => {\n      this.issues = [...this.issues, ...subs];\n    };\n    const actualProto = new.target.prototype;\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(this, actualProto);\n    } else {\n      this.__proto__ = actualProto;\n    }\n    this.name = \"ZodError\";\n    this.issues = issues;\n  }\n  get errors() {\n    return this.issues;\n  }\n  format(_mapper) {\n    const mapper = _mapper || function(issue) {\n      return issue.message;\n    };\n    const fieldErrors = {_errors: []};\n    const processError = (error) => {\n      for (const issue of error.issues) {\n        if (issue.code === \"invalid_union\") {\n          issue.unionErrors.map(processError);\n        } else if (issue.code === \"invalid_return_type\") {\n          processError(issue.returnTypeError);\n        } else if (issue.code === \"invalid_arguments\") {\n          processError(issue.argumentsError);\n        } else if (issue.path.length === 0) {\n          fieldErrors._errors.push(mapper(issue));\n        } else {\n          let curr = fieldErrors;\n          let i = 0;\n          while (i < issue.path.length) {\n            const el = issue.path[i];\n            const terminal = i === issue.path.length - 1;\n            if (!terminal) {\n              curr[el] = curr[el] || {_errors: []};\n            } else {\n              curr[el] = curr[el] || {_errors: []};\n              curr[el]._errors.push(mapper(issue));\n            }\n            curr = curr[el];\n            i++;\n          }\n        }\n      }\n    };\n    processError(this);\n    return fieldErrors;\n  }\n  toString() {\n    return this.message;\n  }\n  get message() {\n    return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n  }\n  get isEmpty() {\n    return this.issues.length === 0;\n  }\n  flatten(mapper = (issue) => issue.message) {\n    const fieldErrors = {};\n    const formErrors = [];\n    for (const sub of this.issues) {\n      if (sub.path.length > 0) {\n        fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n        fieldErrors[sub.path[0]].push(mapper(sub));\n      } else {\n        formErrors.push(mapper(sub));\n      }\n    }\n    return {formErrors, fieldErrors};\n  }\n  get formErrors() {\n    return this.flatten();\n  }\n}\nZodError.create = (issues) => {\n  const error = new ZodError(issues);\n  return error;\n};\nconst errorMap = (issue, _ctx) => {\n  let message;\n  switch (issue.code) {\n    case ZodIssueCode.invalid_type:\n      if (issue.received === ZodParsedType.undefined) {\n        message = \"Required\";\n      } else {\n        message = `Expected ${issue.expected}, received ${issue.received}`;\n      }\n      break;\n    case ZodIssueCode.invalid_literal:\n      message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n      break;\n    case ZodIssueCode.unrecognized_keys:\n      message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n      break;\n    case ZodIssueCode.invalid_union:\n      message = `Invalid input`;\n      break;\n    case ZodIssueCode.invalid_union_discriminator:\n      message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n      break;\n    case ZodIssueCode.invalid_enum_value:\n      message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n      break;\n    case ZodIssueCode.invalid_arguments:\n      message = `Invalid function arguments`;\n      break;\n    case ZodIssueCode.invalid_return_type:\n      message = `Invalid function return type`;\n      break;\n    case ZodIssueCode.invalid_date:\n      message = `Invalid date`;\n      break;\n    case ZodIssueCode.invalid_string:\n      if (typeof issue.validation === \"object\") {\n        if (\"includes\" in issue.validation) {\n          message = `Invalid input: must include \"${issue.validation.includes}\"`;\n          if (typeof issue.validation.position === \"number\") {\n            message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n          }\n        } else if (\"startsWith\" in issue.validation) {\n          message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n        } else if (\"endsWith\" in issue.validation) {\n          message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n        } else {\n          util.assertNever(issue.validation);\n        }\n      } else if (issue.validation !== \"regex\") {\n        message = `Invalid ${issue.validation}`;\n      } else {\n        message = \"Invalid\";\n      }\n      break;\n    case ZodIssueCode.too_small:\n      if (issue.type === \"array\")\n        message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n      else if (issue.type === \"string\")\n        message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n      else if (issue.type === \"number\")\n        message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n      else if (issue.type === \"date\")\n        message = `Date must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue.minimum))}`;\n      else\n        message = \"Invalid input\";\n      break;\n    case ZodIssueCode.too_big:\n      if (issue.type === \"array\")\n        message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n      else if (issue.type === \"string\")\n        message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n      else if (issue.type === \"number\")\n        message = `Number must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n      else if (issue.type === \"bigint\")\n        message = `BigInt must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n      else if (issue.type === \"date\")\n        message = `Date must be ${issue.exact ? `exactly` : issue.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue.maximum))}`;\n      else\n        message = \"Invalid input\";\n      break;\n    case ZodIssueCode.custom:\n      message = `Invalid input`;\n      break;\n    case ZodIssueCode.invalid_intersection_types:\n      message = `Intersection results could not be merged`;\n      break;\n    case ZodIssueCode.not_multiple_of:\n      message = `Number must be a multiple of ${issue.multipleOf}`;\n      break;\n    case ZodIssueCode.not_finite:\n      message = \"Number must be finite\";\n      break;\n    default:\n      message = _ctx.defaultError;\n      util.assertNever(issue);\n  }\n  return {message};\n};\nlet overrideErrorMap = errorMap;\nfunction setErrorMap(map) {\n  overrideErrorMap = map;\n}\nfunction getErrorMap() {\n  return overrideErrorMap;\n}\nconst makeIssue = (params) => {\n  const {data, path, errorMaps, issueData} = params;\n  const fullPath = [...path, ...issueData.path || []];\n  const fullIssue = {\n    ...issueData,\n    path: fullPath\n  };\n  let errorMessage = \"\";\n  const maps = errorMaps.filter((m) => !!m).slice().reverse();\n  for (const map of maps) {\n    errorMessage = map(fullIssue, {data, defaultError: errorMessage}).message;\n  }\n  return {\n    ...issueData,\n    path: fullPath,\n    message: issueData.message || errorMessage\n  };\n};\nconst EMPTY_PATH = [];\nfunction addIssueToContext(ctx, issueData) {\n  const issue = makeIssue({\n    issueData,\n    data: ctx.data,\n    path: ctx.path,\n    errorMaps: [\n      ctx.common.contextualErrorMap,\n      ctx.schemaErrorMap,\n      getErrorMap(),\n      errorMap\n    ].filter((x) => !!x)\n  });\n  ctx.common.issues.push(issue);\n}\nclass ParseStatus {\n  constructor() {\n    this.value = \"valid\";\n  }\n  dirty() {\n    if (this.value === \"valid\")\n      this.value = \"dirty\";\n  }\n  abort() {\n    if (this.value !== \"aborted\")\n      this.value = \"aborted\";\n  }\n  static mergeArray(status, results) {\n    const arrayValue = [];\n    for (const s of results) {\n      if (s.status === \"aborted\")\n        return INVALID;\n      if (s.status === \"dirty\")\n        status.dirty();\n      arrayValue.push(s.value);\n    }\n    return {status: status.value, value: arrayValue};\n  }\n  static async mergeObjectAsync(status, pairs) {\n    const syncPairs = [];\n    for (const pair of pairs) {\n      syncPairs.push({\n        key: await pair.key,\n        value: await pair.value\n      });\n    }\n    return ParseStatus.mergeObjectSync(status, syncPairs);\n  }\n  static mergeObjectSync(status, pairs) {\n    const finalObject = {};\n    for (const pair of pairs) {\n      const {key, value} = pair;\n      if (key.status === \"aborted\")\n        return INVALID;\n      if (value.status === \"aborted\")\n        return INVALID;\n      if (key.status === \"dirty\")\n        status.dirty();\n      if (value.status === \"dirty\")\n        status.dirty();\n      if (key.value !== \"__proto__\" && (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n        finalObject[key.value] = value.value;\n      }\n    }\n    return {status: status.value, value: finalObject};\n  }\n}\nconst INVALID = Object.freeze({\n  status: \"aborted\"\n});\nconst DIRTY = (value) => ({status: \"dirty\", value});\nconst OK = (value) => ({status: \"valid\", value});\nconst isAborted = (x) => x.status === \"aborted\";\nconst isDirty = (x) => x.status === \"dirty\";\nconst isValid = (x) => x.status === \"valid\";\nconst isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\nvar errorUtil;\n(function(errorUtil2) {\n  errorUtil2.errToObj = (message) => typeof message === \"string\" ? {message} : message || {};\n  errorUtil2.toString = (message) => typeof message === \"string\" ? message : message === null || message === void 0 ? void 0 : message.message;\n})(errorUtil || (errorUtil = {}));\nclass ParseInputLazyPath {\n  constructor(parent, value, path, key) {\n    this._cachedPath = [];\n    this.parent = parent;\n    this.data = value;\n    this._path = path;\n    this._key = key;\n  }\n  get path() {\n    if (!this._cachedPath.length) {\n      if (this._key instanceof Array) {\n        this._cachedPath.push(...this._path, ...this._key);\n      } else {\n        this._cachedPath.push(...this._path, this._key);\n      }\n    }\n    return this._cachedPath;\n  }\n}\nconst handleResult = (ctx, result) => {\n  if (isValid(result)) {\n    return {success: true, data: result.value};\n  } else {\n    if (!ctx.common.issues.length) {\n      throw new Error(\"Validation failed but no issues detected.\");\n    }\n    return {\n      success: false,\n      get error() {\n        if (this._error)\n          return this._error;\n        const error = new ZodError(ctx.common.issues);\n        this._error = error;\n        return this._error;\n      }\n    };\n  }\n};\nfunction processCreateParams(params) {\n  if (!params)\n    return {};\n  const {errorMap: errorMap2, invalid_type_error, required_error, description} = params;\n  if (errorMap2 && (invalid_type_error || required_error)) {\n    throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n  }\n  if (errorMap2)\n    return {errorMap: errorMap2, description};\n  const customMap = (iss, ctx) => {\n    if (iss.code !== \"invalid_type\")\n      return {message: ctx.defaultError};\n    if (typeof ctx.data === \"undefined\") {\n      return {message: required_error !== null && required_error !== void 0 ? required_error : ctx.defaultError};\n    }\n    return {message: invalid_type_error !== null && invalid_type_error !== void 0 ? invalid_type_error : ctx.defaultError};\n  };\n  return {errorMap: customMap, description};\n}\nclass ZodType {\n  constructor(def) {\n    this.spa = this.safeParseAsync;\n    this._def = def;\n    this.parse = this.parse.bind(this);\n    this.safeParse = this.safeParse.bind(this);\n    this.parseAsync = this.parseAsync.bind(this);\n    this.safeParseAsync = this.safeParseAsync.bind(this);\n    this.spa = this.spa.bind(this);\n    this.refine = this.refine.bind(this);\n    this.refinement = this.refinement.bind(this);\n    this.superRefine = this.superRefine.bind(this);\n    this.optional = this.optional.bind(this);\n    this.nullable = this.nullable.bind(this);\n    this.nullish = this.nullish.bind(this);\n    this.array = this.array.bind(this);\n    this.promise = this.promise.bind(this);\n    this.or = this.or.bind(this);\n    this.and = this.and.bind(this);\n    this.transform = this.transform.bind(this);\n    this.brand = this.brand.bind(this);\n    this.default = this.default.bind(this);\n    this.catch = this.catch.bind(this);\n    this.describe = this.describe.bind(this);\n    this.pipe = this.pipe.bind(this);\n    this.readonly = this.readonly.bind(this);\n    this.isNullable = this.isNullable.bind(this);\n    this.isOptional = this.isOptional.bind(this);\n  }\n  get description() {\n    return this._def.description;\n  }\n  _getType(input) {\n    return getParsedType(input.data);\n  }\n  _getOrReturnCtx(input, ctx) {\n    return ctx || {\n      common: input.parent.common,\n      data: input.data,\n      parsedType: getParsedType(input.data),\n      schemaErrorMap: this._def.errorMap,\n      path: input.path,\n      parent: input.parent\n    };\n  }\n  _processInputParams(input) {\n    return {\n      status: new ParseStatus(),\n      ctx: {\n        common: input.parent.common,\n        data: input.data,\n        parsedType: getParsedType(input.data),\n        schemaErrorMap: this._def.errorMap,\n        path: input.path,\n        parent: input.parent\n      }\n    };\n  }\n  _parseSync(input) {\n    const result = this._parse(input);\n    if (isAsync(result)) {\n      throw new Error(\"Synchronous parse encountered promise.\");\n    }\n    return result;\n  }\n  _parseAsync(input) {\n    const result = this._parse(input);\n    return Promise.resolve(result);\n  }\n  parse(data, params) {\n    const result = this.safeParse(data, params);\n    if (result.success)\n      return result.data;\n    throw result.error;\n  }\n  safeParse(data, params) {\n    var _a;\n    const ctx = {\n      common: {\n        issues: [],\n        async: (_a = params === null || params === void 0 ? void 0 : params.async) !== null && _a !== void 0 ? _a : false,\n        contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap\n      },\n      path: (params === null || params === void 0 ? void 0 : params.path) || [],\n      schemaErrorMap: this._def.errorMap,\n      parent: null,\n      data,\n      parsedType: getParsedType(data)\n    };\n    const result = this._parseSync({data, path: ctx.path, parent: ctx});\n    return handleResult(ctx, result);\n  }\n  async parseAsync(data, params) {\n    const result = await this.safeParseAsync(data, params);\n    if (result.success)\n      return result.data;\n    throw result.error;\n  }\n  async safeParseAsync(data, params) {\n    const ctx = {\n      common: {\n        issues: [],\n        contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n        async: true\n      },\n      path: (params === null || params === void 0 ? void 0 : params.path) || [],\n      schemaErrorMap: this._def.errorMap,\n      parent: null,\n      data,\n      parsedType: getParsedType(data)\n    };\n    const maybeAsyncResult = this._parse({data, path: ctx.path, parent: ctx});\n    const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult));\n    return handleResult(ctx, result);\n  }\n  refine(check, message) {\n    const getIssueProperties = (val) => {\n      if (typeof message === \"string\" || typeof message === \"undefined\") {\n        return {message};\n      } else if (typeof message === \"function\") {\n        return message(val);\n      } else {\n        return message;\n      }\n    };\n    return this._refinement((val, ctx) => {\n      const result = check(val);\n      const setError = () => ctx.addIssue({\n        code: ZodIssueCode.custom,\n        ...getIssueProperties(val)\n      });\n      if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n        return result.then((data) => {\n          if (!data) {\n            setError();\n            return false;\n          } else {\n            return true;\n          }\n        });\n      }\n      if (!result) {\n        setError();\n        return false;\n      } else {\n        return true;\n      }\n    });\n  }\n  refinement(check, refinementData) {\n    return this._refinement((val, ctx) => {\n      if (!check(val)) {\n        ctx.addIssue(typeof refinementData === \"function\" ? refinementData(val, ctx) : refinementData);\n        return false;\n      } else {\n        return true;\n      }\n    });\n  }\n  _refinement(refinement) {\n    return new ZodEffects({\n      schema: this,\n      typeName: ZodFirstPartyTypeKind.ZodEffects,\n      effect: {type: \"refinement\", refinement}\n    });\n  }\n  superRefine(refinement) {\n    return this._refinement(refinement);\n  }\n  optional() {\n    return ZodOptional.create(this, this._def);\n  }\n  nullable() {\n    return ZodNullable.create(this, this._def);\n  }\n  nullish() {\n    return this.nullable().optional();\n  }\n  array() {\n    return ZodArray.create(this, this._def);\n  }\n  promise() {\n    return ZodPromise.create(this, this._def);\n  }\n  or(option) {\n    return ZodUnion.create([this, option], this._def);\n  }\n  and(incoming) {\n    return ZodIntersection.create(this, incoming, this._def);\n  }\n  transform(transform2) {\n    return new ZodEffects({\n      ...processCreateParams(this._def),\n      schema: this,\n      typeName: ZodFirstPartyTypeKind.ZodEffects,\n      effect: {type: \"transform\", transform: transform2}\n    });\n  }\n  default(def) {\n    const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n    return new ZodDefault({\n      ...processCreateParams(this._def),\n      innerType: this,\n      defaultValue: defaultValueFunc,\n      typeName: ZodFirstPartyTypeKind.ZodDefault\n    });\n  }\n  brand() {\n    return new ZodBranded({\n      typeName: ZodFirstPartyTypeKind.ZodBranded,\n      type: this,\n      ...processCreateParams(this._def)\n    });\n  }\n  catch(def) {\n    const catchValueFunc = typeof def === \"function\" ? def : () => def;\n    return new ZodCatch({\n      ...processCreateParams(this._def),\n      innerType: this,\n      catchValue: catchValueFunc,\n      typeName: ZodFirstPartyTypeKind.ZodCatch\n    });\n  }\n  describe(description) {\n    const This = this.constructor;\n    return new This({\n      ...this._def,\n      description\n    });\n  }\n  pipe(target) {\n    return ZodPipeline.create(this, target);\n  }\n  readonly() {\n    return ZodReadonly.create(this);\n  }\n  isOptional() {\n    return this.safeParse(void 0).success;\n  }\n  isNullable() {\n    return this.safeParse(null).success;\n  }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[a-z][a-z0-9]*$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_+-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\nconst ipv4Regex = /^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/;\nconst ipv6Regex = /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst datetimeRegex = (args) => {\n  if (args.precision) {\n    if (args.offset) {\n      return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}\\\\.\\\\d{${args.precision}}(([+-]\\\\d{2}(:?\\\\d{2})?)|Z)$`);\n    } else {\n      return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}\\\\.\\\\d{${args.precision}}Z$`);\n    }\n  } else if (args.precision === 0) {\n    if (args.offset) {\n      return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}(([+-]\\\\d{2}(:?\\\\d{2})?)|Z)$`);\n    } else {\n      return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}Z$`);\n    }\n  } else {\n    if (args.offset) {\n      return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}(\\\\.\\\\d+)?(([+-]\\\\d{2}(:?\\\\d{2})?)|Z)$`);\n    } else {\n      return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}(\\\\.\\\\d+)?Z$`);\n    }\n  }\n};\nfunction isValidIP(ip, version) {\n  if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n    return true;\n  }\n  if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n    return true;\n  }\n  return false;\n}\nclass ZodString extends ZodType {\n  _parse(input) {\n    if (this._def.coerce) {\n      input.data = String(input.data);\n    }\n    const parsedType = this._getType(input);\n    if (parsedType !== ZodParsedType.string) {\n      const ctx2 = this._getOrReturnCtx(input);\n      addIssueToContext(ctx2, {\n        code: ZodIssueCode.invalid_type,\n        expected: ZodParsedType.string,\n        received: ctx2.parsedType\n      });\n      return INVALID;\n    }\n    const status = new ParseStatus();\n    let ctx = void 0;\n    for (const check of this._def.checks) {\n      if (check.kind === \"min\") {\n        if (input.data.length < check.value) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            code: ZodIssueCode.too_small,\n            minimum: check.value,\n            type: \"string\",\n            inclusive: true,\n            exact: false,\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"max\") {\n        if (input.data.length > check.value) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            code: ZodIssueCode.too_big,\n            maximum: check.value,\n            type: \"string\",\n            inclusive: true,\n            exact: false,\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"length\") {\n        const tooBig = input.data.length > check.value;\n        const tooSmall = input.data.length < check.value;\n        if (tooBig || tooSmall) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          if (tooBig) {\n            addIssueToContext(ctx, {\n              code: ZodIssueCode.too_big,\n              maximum: check.value,\n              type: \"string\",\n              inclusive: true,\n              exact: true,\n              message: check.message\n            });\n          } else if (tooSmall) {\n            addIssueToContext(ctx, {\n              code: ZodIssueCode.too_small,\n              minimum: check.value,\n              type: \"string\",\n              inclusive: true,\n              exact: true,\n              message: check.message\n            });\n          }\n          status.dirty();\n        }\n      } else if (check.kind === \"email\") {\n        if (!emailRegex.test(input.data)) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            validation: \"email\",\n            code: ZodIssueCode.invalid_string,\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"emoji\") {\n        if (!emojiRegex) {\n          emojiRegex = new RegExp(_emojiRegex, \"u\");\n        }\n        if (!emojiRegex.test(input.data)) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            validation: \"emoji\",\n            code: ZodIssueCode.invalid_string,\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"uuid\") {\n        if (!uuidRegex.test(input.data)) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            validation: \"uuid\",\n            code: ZodIssueCode.invalid_string,\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"cuid\") {\n        if (!cuidRegex.test(input.data)) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            validation: \"cuid\",\n            code: ZodIssueCode.invalid_string,\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"cuid2\") {\n        if (!cuid2Regex.test(input.data)) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            validation: \"cuid2\",\n            code: ZodIssueCode.invalid_string,\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"ulid\") {\n        if (!ulidRegex.test(input.data)) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            validation: \"ulid\",\n            code: ZodIssueCode.invalid_string,\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"url\") {\n        try {\n          new URL(input.data);\n        } catch (_a) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            validation: \"url\",\n            code: ZodIssueCode.invalid_string,\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"regex\") {\n        check.regex.lastIndex = 0;\n        const testResult = check.regex.test(input.data);\n        if (!testResult) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            validation: \"regex\",\n            code: ZodIssueCode.invalid_string,\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"trim\") {\n        input.data = input.data.trim();\n      } else if (check.kind === \"includes\") {\n        if (!input.data.includes(check.value, check.position)) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            code: ZodIssueCode.invalid_string,\n            validation: {includes: check.value, position: check.position},\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"toLowerCase\") {\n        input.data = input.data.toLowerCase();\n      } else if (check.kind === \"toUpperCase\") {\n        input.data = input.data.toUpperCase();\n      } else if (check.kind === \"startsWith\") {\n        if (!input.data.startsWith(check.value)) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            code: ZodIssueCode.invalid_string,\n            validation: {startsWith: check.value},\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"endsWith\") {\n        if (!input.data.endsWith(check.value)) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            code: ZodIssueCode.invalid_string,\n            validation: {endsWith: check.value},\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"datetime\") {\n        const regex = datetimeRegex(check);\n        if (!regex.test(input.data)) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            code: ZodIssueCode.invalid_string,\n            validation: \"datetime\",\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"ip\") {\n        if (!isValidIP(input.data, check.version)) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            validation: \"ip\",\n            code: ZodIssueCode.invalid_string,\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else {\n        util.assertNever(check);\n      }\n    }\n    return {status: status.value, value: input.data};\n  }\n  _regex(regex, validation, message) {\n    return this.refinement((data) => regex.test(data), {\n      validation,\n      code: ZodIssueCode.invalid_string,\n      ...errorUtil.errToObj(message)\n    });\n  }\n  _addCheck(check) {\n    return new ZodString({\n      ...this._def,\n      checks: [...this._def.checks, check]\n    });\n  }\n  email(message) {\n    return this._addCheck({kind: \"email\", ...errorUtil.errToObj(message)});\n  }\n  url(message) {\n    return this._addCheck({kind: \"url\", ...errorUtil.errToObj(message)});\n  }\n  emoji(message) {\n    return this._addCheck({kind: \"emoji\", ...errorUtil.errToObj(message)});\n  }\n  uuid(message) {\n    return this._addCheck({kind: \"uuid\", ...errorUtil.errToObj(message)});\n  }\n  cuid(message) {\n    return this._addCheck({kind: \"cuid\", ...errorUtil.errToObj(message)});\n  }\n  cuid2(message) {\n    return this._addCheck({kind: \"cuid2\", ...errorUtil.errToObj(message)});\n  }\n  ulid(message) {\n    return this._addCheck({kind: \"ulid\", ...errorUtil.errToObj(message)});\n  }\n  ip(options) {\n    return this._addCheck({kind: \"ip\", ...errorUtil.errToObj(options)});\n  }\n  datetime(options) {\n    var _a;\n    if (typeof options === \"string\") {\n      return this._addCheck({\n        kind: \"datetime\",\n        precision: null,\n        offset: false,\n        message: options\n      });\n    }\n    return this._addCheck({\n      kind: \"datetime\",\n      precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n      offset: (_a = options === null || options === void 0 ? void 0 : options.offset) !== null && _a !== void 0 ? _a : false,\n      ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message)\n    });\n  }\n  regex(regex, message) {\n    return this._addCheck({\n      kind: \"regex\",\n      regex,\n      ...errorUtil.errToObj(message)\n    });\n  }\n  includes(value, options) {\n    return this._addCheck({\n      kind: \"includes\",\n      value,\n      position: options === null || options === void 0 ? void 0 : options.position,\n      ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message)\n    });\n  }\n  startsWith(value, message) {\n    return this._addCheck({\n      kind: \"startsWith\",\n      value,\n      ...errorUtil.errToObj(message)\n    });\n  }\n  endsWith(value, message) {\n    return this._addCheck({\n      kind: \"endsWith\",\n      value,\n      ...errorUtil.errToObj(message)\n    });\n  }\n  min(minLength, message) {\n    return this._addCheck({\n      kind: \"min\",\n      value: minLength,\n      ...errorUtil.errToObj(message)\n    });\n  }\n  max(maxLength, message) {\n    return this._addCheck({\n      kind: \"max\",\n      value: maxLength,\n      ...errorUtil.errToObj(message)\n    });\n  }\n  length(len, message) {\n    return this._addCheck({\n      kind: \"length\",\n      value: len,\n      ...errorUtil.errToObj(message)\n    });\n  }\n  nonempty(message) {\n    return this.min(1, errorUtil.errToObj(message));\n  }\n  trim() {\n    return new ZodString({\n      ...this._def,\n      checks: [...this._def.checks, {kind: \"trim\"}]\n    });\n  }\n  toLowerCase() {\n    return new ZodString({\n      ...this._def,\n      checks: [...this._def.checks, {kind: \"toLowerCase\"}]\n    });\n  }\n  toUpperCase() {\n    return new ZodString({\n      ...this._def,\n      checks: [...this._def.checks, {kind: \"toUpperCase\"}]\n    });\n  }\n  get isDatetime() {\n    return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n  }\n  get isEmail() {\n    return !!this._def.checks.find((ch) => ch.kind === \"email\");\n  }\n  get isURL() {\n    return !!this._def.checks.find((ch) => ch.kind === \"url\");\n  }\n  get isEmoji() {\n    return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n  }\n  get isUUID() {\n    return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n  }\n  get isCUID() {\n    return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n  }\n  get isCUID2() {\n    return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n  }\n  get isULID() {\n    return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n  }\n  get isIP() {\n    return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n  }\n  get minLength() {\n    let min = null;\n    for (const ch of this._def.checks) {\n      if (ch.kind === \"min\") {\n        if (min === null || ch.value > min)\n          min = ch.value;\n      }\n    }\n    return min;\n  }\n  get maxLength() {\n    let max = null;\n    for (const ch of this._def.checks) {\n      if (ch.kind === \"max\") {\n        if (max === null || ch.value < max)\n          max = ch.value;\n      }\n    }\n    return max;\n  }\n}\nZodString.create = (params) => {\n  var _a;\n  return new ZodString({\n    checks: [],\n    typeName: ZodFirstPartyTypeKind.ZodString,\n    coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n    ...processCreateParams(params)\n  });\n};\nfunction floatSafeRemainder(val, step) {\n  const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n  const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n  const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n  const valInt = parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n  const stepInt = parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n  return valInt % stepInt / Math.pow(10, decCount);\n}\nclass ZodNumber extends ZodType {\n  constructor() {\n    super(...arguments);\n    this.min = this.gte;\n    this.max = this.lte;\n    this.step = this.multipleOf;\n  }\n  _parse(input) {\n    if (this._def.coerce) {\n      input.data = Number(input.data);\n    }\n    const parsedType = this._getType(input);\n    if (parsedType !== ZodParsedType.number) {\n      const ctx2 = this._getOrReturnCtx(input);\n      addIssueToContext(ctx2, {\n        code: ZodIssueCode.invalid_type,\n        expected: ZodParsedType.number,\n        received: ctx2.parsedType\n      });\n      return INVALID;\n    }\n    let ctx = void 0;\n    const status = new ParseStatus();\n    for (const check of this._def.checks) {\n      if (check.kind === \"int\") {\n        if (!util.isInteger(input.data)) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            code: ZodIssueCode.invalid_type,\n            expected: \"integer\",\n            received: \"float\",\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"min\") {\n        const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n        if (tooSmall) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            code: ZodIssueCode.too_small,\n            minimum: check.value,\n            type: \"number\",\n            inclusive: check.inclusive,\n            exact: false,\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"max\") {\n        const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n        if (tooBig) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            code: ZodIssueCode.too_big,\n            maximum: check.value,\n            type: \"number\",\n            inclusive: check.inclusive,\n            exact: false,\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"multipleOf\") {\n        if (floatSafeRemainder(input.data, check.value) !== 0) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            code: ZodIssueCode.not_multiple_of,\n            multipleOf: check.value,\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"finite\") {\n        if (!Number.isFinite(input.data)) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            code: ZodIssueCode.not_finite,\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else {\n        util.assertNever(check);\n      }\n    }\n    return {status: status.value, value: input.data};\n  }\n  gte(value, message) {\n    return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n  }\n  gt(value, message) {\n    return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n  }\n  lte(value, message) {\n    return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n  }\n  lt(value, message) {\n    return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n  }\n  setLimit(kind, value, inclusive, message) {\n    return new ZodNumber({\n      ...this._def,\n      checks: [\n        ...this._def.checks,\n        {\n          kind,\n          value,\n          inclusive,\n          message: errorUtil.toString(message)\n        }\n      ]\n    });\n  }\n  _addCheck(check) {\n    return new ZodNumber({\n      ...this._def,\n      checks: [...this._def.checks, check]\n    });\n  }\n  int(message) {\n    return this._addCheck({\n      kind: \"int\",\n      message: errorUtil.toString(message)\n    });\n  }\n  positive(message) {\n    return this._addCheck({\n      kind: \"min\",\n      value: 0,\n      inclusive: false,\n      message: errorUtil.toString(message)\n    });\n  }\n  negative(message) {\n    return this._addCheck({\n      kind: \"max\",\n      value: 0,\n      inclusive: false,\n      message: errorUtil.toString(message)\n    });\n  }\n  nonpositive(message) {\n    return this._addCheck({\n      kind: \"max\",\n      value: 0,\n      inclusive: true,\n      message: errorUtil.toString(message)\n    });\n  }\n  nonnegative(message) {\n    return this._addCheck({\n      kind: \"min\",\n      value: 0,\n      inclusive: true,\n      message: errorUtil.toString(message)\n    });\n  }\n  multipleOf(value, message) {\n    return this._addCheck({\n      kind: \"multipleOf\",\n      value,\n      message: errorUtil.toString(message)\n    });\n  }\n  finite(message) {\n    return this._addCheck({\n      kind: \"finite\",\n      message: errorUtil.toString(message)\n    });\n  }\n  safe(message) {\n    return this._addCheck({\n      kind: \"min\",\n      inclusive: true,\n      value: Number.MIN_SAFE_INTEGER,\n      message: errorUtil.toString(message)\n    })._addCheck({\n      kind: \"max\",\n      inclusive: true,\n      value: Number.MAX_SAFE_INTEGER,\n      message: errorUtil.toString(message)\n    });\n  }\n  get minValue() {\n    let min = null;\n    for (const ch of this._def.checks) {\n      if (ch.kind === \"min\") {\n        if (min === null || ch.value > min)\n          min = ch.value;\n      }\n    }\n    return min;\n  }\n  get maxValue() {\n    let max = null;\n    for (const ch of this._def.checks) {\n      if (ch.kind === \"max\") {\n        if (max === null || ch.value < max)\n          max = ch.value;\n      }\n    }\n    return max;\n  }\n  get isInt() {\n    return !!this._def.checks.find((ch) => ch.kind === \"int\" || ch.kind === \"multipleOf\" && util.isInteger(ch.value));\n  }\n  get isFinite() {\n    let max = null, min = null;\n    for (const ch of this._def.checks) {\n      if (ch.kind === \"finite\" || ch.kind === \"int\" || ch.kind === \"multipleOf\") {\n        return true;\n      } else if (ch.kind === \"min\") {\n        if (min === null || ch.value > min)\n          min = ch.value;\n      } else if (ch.kind === \"max\") {\n        if (max === null || ch.value < max)\n          max = ch.value;\n      }\n    }\n    return Number.isFinite(min) && Number.isFinite(max);\n  }\n}\nZodNumber.create = (params) => {\n  return new ZodNumber({\n    checks: [],\n    typeName: ZodFirstPartyTypeKind.ZodNumber,\n    coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n    ...processCreateParams(params)\n  });\n};\nclass ZodBigInt extends ZodType {\n  constructor() {\n    super(...arguments);\n    this.min = this.gte;\n    this.max = this.lte;\n  }\n  _parse(input) {\n    if (this._def.coerce) {\n      input.data = BigInt(input.data);\n    }\n    const parsedType = this._getType(input);\n    if (parsedType !== ZodParsedType.bigint) {\n      const ctx2 = this._getOrReturnCtx(input);\n      addIssueToContext(ctx2, {\n        code: ZodIssueCode.invalid_type,\n        expected: ZodParsedType.bigint,\n        received: ctx2.parsedType\n      });\n      return INVALID;\n    }\n    let ctx = void 0;\n    const status = new ParseStatus();\n    for (const check of this._def.checks) {\n      if (check.kind === \"min\") {\n        const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n        if (tooSmall) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            code: ZodIssueCode.too_small,\n            type: \"bigint\",\n            minimum: check.value,\n            inclusive: check.inclusive,\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"max\") {\n        const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n        if (tooBig) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            code: ZodIssueCode.too_big,\n            type: \"bigint\",\n            maximum: check.value,\n            inclusive: check.inclusive,\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"multipleOf\") {\n        if (input.data % check.value !== BigInt(0)) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            code: ZodIssueCode.not_multiple_of,\n            multipleOf: check.value,\n            message: check.message\n          });\n          status.dirty();\n        }\n      } else {\n        util.assertNever(check);\n      }\n    }\n    return {status: status.value, value: input.data};\n  }\n  gte(value, message) {\n    return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n  }\n  gt(value, message) {\n    return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n  }\n  lte(value, message) {\n    return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n  }\n  lt(value, message) {\n    return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n  }\n  setLimit(kind, value, inclusive, message) {\n    return new ZodBigInt({\n      ...this._def,\n      checks: [\n        ...this._def.checks,\n        {\n          kind,\n          value,\n          inclusive,\n          message: errorUtil.toString(message)\n        }\n      ]\n    });\n  }\n  _addCheck(check) {\n    return new ZodBigInt({\n      ...this._def,\n      checks: [...this._def.checks, check]\n    });\n  }\n  positive(message) {\n    return this._addCheck({\n      kind: \"min\",\n      value: BigInt(0),\n      inclusive: false,\n      message: errorUtil.toString(message)\n    });\n  }\n  negative(message) {\n    return this._addCheck({\n      kind: \"max\",\n      value: BigInt(0),\n      inclusive: false,\n      message: errorUtil.toString(message)\n    });\n  }\n  nonpositive(message) {\n    return this._addCheck({\n      kind: \"max\",\n      value: BigInt(0),\n      inclusive: true,\n      message: errorUtil.toString(message)\n    });\n  }\n  nonnegative(message) {\n    return this._addCheck({\n      kind: \"min\",\n      value: BigInt(0),\n      inclusive: true,\n      message: errorUtil.toString(message)\n    });\n  }\n  multipleOf(value, message) {\n    return this._addCheck({\n      kind: \"multipleOf\",\n      value,\n      message: errorUtil.toString(message)\n    });\n  }\n  get minValue() {\n    let min = null;\n    for (const ch of this._def.checks) {\n      if (ch.kind === \"min\") {\n        if (min === null || ch.value > min)\n          min = ch.value;\n      }\n    }\n    return min;\n  }\n  get maxValue() {\n    let max = null;\n    for (const ch of this._def.checks) {\n      if (ch.kind === \"max\") {\n        if (max === null || ch.value < max)\n          max = ch.value;\n      }\n    }\n    return max;\n  }\n}\nZodBigInt.create = (params) => {\n  var _a;\n  return new ZodBigInt({\n    checks: [],\n    typeName: ZodFirstPartyTypeKind.ZodBigInt,\n    coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n    ...processCreateParams(params)\n  });\n};\nclass ZodBoolean extends ZodType {\n  _parse(input) {\n    if (this._def.coerce) {\n      input.data = Boolean(input.data);\n    }\n    const parsedType = this._getType(input);\n    if (parsedType !== ZodParsedType.boolean) {\n      const ctx = this._getOrReturnCtx(input);\n      addIssueToContext(ctx, {\n        code: ZodIssueCode.invalid_type,\n        expected: ZodParsedType.boolean,\n        received: ctx.parsedType\n      });\n      return INVALID;\n    }\n    return OK(input.data);\n  }\n}\nZodBoolean.create = (params) => {\n  return new ZodBoolean({\n    typeName: ZodFirstPartyTypeKind.ZodBoolean,\n    coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n    ...processCreateParams(params)\n  });\n};\nclass ZodDate extends ZodType {\n  _parse(input) {\n    if (this._def.coerce) {\n      input.data = new Date(input.data);\n    }\n    const parsedType = this._getType(input);\n    if (parsedType !== ZodParsedType.date) {\n      const ctx2 = this._getOrReturnCtx(input);\n      addIssueToContext(ctx2, {\n        code: ZodIssueCode.invalid_type,\n        expected: ZodParsedType.date,\n        received: ctx2.parsedType\n      });\n      return INVALID;\n    }\n    if (isNaN(input.data.getTime())) {\n      const ctx2 = this._getOrReturnCtx(input);\n      addIssueToContext(ctx2, {\n        code: ZodIssueCode.invalid_date\n      });\n      return INVALID;\n    }\n    const status = new ParseStatus();\n    let ctx = void 0;\n    for (const check of this._def.checks) {\n      if (check.kind === \"min\") {\n        if (input.data.getTime() < check.value) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            code: ZodIssueCode.too_small,\n            message: check.message,\n            inclusive: true,\n            exact: false,\n            minimum: check.value,\n            type: \"date\"\n          });\n          status.dirty();\n        }\n      } else if (check.kind === \"max\") {\n        if (input.data.getTime() > check.value) {\n          ctx = this._getOrReturnCtx(input, ctx);\n          addIssueToContext(ctx, {\n            code: ZodIssueCode.too_big,\n            message: check.message,\n            inclusive: true,\n            exact: false,\n            maximum: check.value,\n            type: \"date\"\n          });\n          status.dirty();\n        }\n      } else {\n        util.assertNever(check);\n      }\n    }\n    return {\n      status: status.value,\n      value: new Date(input.data.getTime())\n    };\n  }\n  _addCheck(check) {\n    return new ZodDate({\n      ...this._def,\n      checks: [...this._def.checks, check]\n    });\n  }\n  min(minDate, message) {\n    return this._addCheck({\n      kind: \"min\",\n      value: minDate.getTime(),\n      message: errorUtil.toString(message)\n    });\n  }\n  max(maxDate, message) {\n    return this._addCheck({\n      kind: \"max\",\n      value: maxDate.getTime(),\n      message: errorUtil.toString(message)\n    });\n  }\n  get minDate() {\n    let min = null;\n    for (const ch of this._def.checks) {\n      if (ch.kind === \"min\") {\n        if (min === null || ch.value > min)\n          min = ch.value;\n      }\n    }\n    return min != null ? new Date(min) : null;\n  }\n  get maxDate() {\n    let max = null;\n    for (const ch of this._def.checks) {\n      if (ch.kind === \"max\") {\n        if (max === null || ch.value < max)\n          max = ch.value;\n      }\n    }\n    return max != null ? new Date(max) : null;\n  }\n}\nZodDate.create = (params) => {\n  return new ZodDate({\n    checks: [],\n    coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n    typeName: ZodFirstPartyTypeKind.ZodDate,\n    ...processCreateParams(params)\n  });\n};\nclass ZodSymbol extends ZodType {\n  _parse(input) {\n    const parsedType = this._getType(input);\n    if (parsedType !== ZodParsedType.symbol) {\n      const ctx = this._getOrReturnCtx(input);\n      addIssueToContext(ctx, {\n        code: ZodIssueCode.invalid_type,\n        expected: ZodParsedType.symbol,\n        received: ctx.parsedType\n      });\n      return INVALID;\n    }\n    return OK(input.data);\n  }\n}\nZodSymbol.create = (params) => {\n  return new ZodSymbol({\n    typeName: ZodFirstPartyTypeKind.ZodSymbol,\n    ...processCreateParams(params)\n  });\n};\nclass ZodUndefined extends ZodType {\n  _parse(input) {\n    const parsedType = this._getType(input);\n    if (parsedType !== ZodParsedType.undefined) {\n      const ctx = this._getOrReturnCtx(input);\n      addIssueToContext(ctx, {\n        code: ZodIssueCode.invalid_type,\n        expected: ZodParsedType.undefined,\n        received: ctx.parsedType\n      });\n      return INVALID;\n    }\n    return OK(input.data);\n  }\n}\nZodUndefined.create = (params) => {\n  return new ZodUndefined({\n    typeName: ZodFirstPartyTypeKind.ZodUndefined,\n    ...processCreateParams(params)\n  });\n};\nclass ZodNull extends ZodType {\n  _parse(input) {\n    const parsedType = this._getType(input);\n    if (parsedType !== ZodParsedType.null) {\n      const ctx = this._getOrReturnCtx(input);\n      addIssueToContext(ctx, {\n        code: ZodIssueCode.invalid_type,\n        expected: ZodParsedType.null,\n        received: ctx.parsedType\n      });\n      return INVALID;\n    }\n    return OK(input.data);\n  }\n}\nZodNull.create = (params) => {\n  return new ZodNull({\n    typeName: ZodFirstPartyTypeKind.ZodNull,\n    ...processCreateParams(params)\n  });\n};\nclass ZodAny extends ZodType {\n  constructor() {\n    super(...arguments);\n    this._any = true;\n  }\n  _parse(input) {\n    return OK(input.data);\n  }\n}\nZodAny.create = (params) => {\n  return new ZodAny({\n    typeName: ZodFirstPartyTypeKind.ZodAny,\n    ...processCreateParams(params)\n  });\n};\nclass ZodUnknown extends ZodType {\n  constructor() {\n    super(...arguments);\n    this._unknown = true;\n  }\n  _parse(input) {\n    return OK(input.data);\n  }\n}\nZodUnknown.create = (params) => {\n  return new ZodUnknown({\n    typeName: ZodFirstPartyTypeKind.ZodUnknown,\n    ...processCreateParams(params)\n  });\n};\nclass ZodNever extends ZodType {\n  _parse(input) {\n    const ctx = this._getOrReturnCtx(input);\n    addIssueToContext(ctx, {\n      code: ZodIssueCode.invalid_type,\n      expected: ZodParsedType.never,\n      received: ctx.parsedType\n    });\n    return INVALID;\n  }\n}\nZodNever.create = (params) => {\n  return new ZodNever({\n    typeName: ZodFirstPartyTypeKind.ZodNever,\n    ...processCreateParams(params)\n  });\n};\nclass ZodVoid extends ZodType {\n  _parse(input) {\n    const parsedType = this._getType(input);\n    if (parsedType !== ZodParsedType.undefined) {\n      const ctx = this._getOrReturnCtx(input);\n      addIssueToContext(ctx, {\n        code: ZodIssueCode.invalid_type,\n        expected: ZodParsedType.void,\n        received: ctx.parsedType\n      });\n      return INVALID;\n    }\n    return OK(input.data);\n  }\n}\nZodVoid.create = (params) => {\n  return new ZodVoid({\n    typeName: ZodFirstPartyTypeKind.ZodVoid,\n    ...processCreateParams(params)\n  });\n};\nclass ZodArray extends ZodType {\n  _parse(input) {\n    const {ctx, status} = this._processInputParams(input);\n    const def = this._def;\n    if (ctx.parsedType !== ZodParsedType.array) {\n      addIssueToContext(ctx, {\n        code: ZodIssueCode.invalid_type,\n        expected: ZodParsedType.array,\n        received: ctx.parsedType\n      });\n      return INVALID;\n    }\n    if (def.exactLength !== null) {\n      const tooBig = ctx.data.length > def.exactLength.value;\n      const tooSmall = ctx.data.length < def.exactLength.value;\n      if (tooBig || tooSmall) {\n        addIssueToContext(ctx, {\n          code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n          minimum: tooSmall ? def.exactLength.value : void 0,\n          maximum: tooBig ? def.exactLength.value : void 0,\n          type: \"array\",\n          inclusive: true,\n          exact: true,\n          message: def.exactLength.message\n        });\n        status.dirty();\n      }\n    }\n    if (def.minLength !== null) {\n      if (ctx.data.length < def.minLength.value) {\n        addIssueToContext(ctx, {\n          code: ZodIssueCode.too_small,\n          minimum: def.minLength.value,\n          type: \"array\",\n          inclusive: true,\n          exact: false,\n          message: def.minLength.message\n        });\n        status.dirty();\n      }\n    }\n    if (def.maxLength !== null) {\n      if (ctx.data.length > def.maxLength.value) {\n        addIssueToContext(ctx, {\n          code: ZodIssueCode.too_big,\n          maximum: def.maxLength.value,\n          type: \"array\",\n          inclusive: true,\n          exact: false,\n          message: def.maxLength.message\n        });\n        status.dirty();\n      }\n    }\n    if (ctx.common.async) {\n      return Promise.all([...ctx.data].map((item, i) => {\n        return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n      })).then((result2) => {\n        return ParseStatus.mergeArray(status, result2);\n      });\n    }\n    const result = [...ctx.data].map((item, i) => {\n      return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n    });\n    return ParseStatus.mergeArray(status, result);\n  }\n  get element() {\n    return this._def.type;\n  }\n  min(minLength, message) {\n    return new ZodArray({\n      ...this._def,\n      minLength: {value: minLength, message: errorUtil.toString(message)}\n    });\n  }\n  max(maxLength, message) {\n    return new ZodArray({\n      ...this._def,\n      maxLength: {value: maxLength, message: errorUtil.toString(message)}\n    });\n  }\n  length(len, message) {\n    return new ZodArray({\n      ...this._def,\n      exactLength: {value: len, message: errorUtil.toString(message)}\n    });\n  }\n  nonempty(message) {\n    return this.min(1, message);\n  }\n}\nZodArray.create = (schema, params) => {\n  return new ZodArray({\n    type: schema,\n    minLength: null,\n    maxLength: null,\n    exactLength: null,\n    typeName: ZodFirstPartyTypeKind.ZodArray,\n    ...processCreateParams(params)\n  });\n};\nfunction deepPartialify(schema) {\n  if (schema instanceof ZodObject) {\n    const newShape = {};\n    for (const key in schema.shape) {\n      const fieldSchema = schema.shape[key];\n      newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n    }\n    return new ZodObject({\n      ...schema._def,\n      shape: () => newShape\n    });\n  } else if (schema instanceof ZodArray) {\n    return new ZodArray({\n      ...schema._def,\n      type: deepPartialify(schema.element)\n    });\n  } else if (schema instanceof ZodOptional) {\n    return ZodOptional.create(deepPartialify(schema.unwrap()));\n  } else if (schema instanceof ZodNullable) {\n    return ZodNullable.create(deepPartialify(schema.unwrap()));\n  } else if (schema instanceof ZodTuple) {\n    return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n  } else {\n    return schema;\n  }\n}\nclass ZodObject extends ZodType {\n  constructor() {\n    super(...arguments);\n    this._cached = null;\n    this.nonstrict = this.passthrough;\n    this.augment = this.extend;\n  }\n  _getCached() {\n    if (this._cached !== null)\n      return this._cached;\n    const shape = this._def.shape();\n    const keys = util.objectKeys(shape);\n    return this._cached = {shape, keys};\n  }\n  _parse(input) {\n    const parsedType = this._getType(input);\n    if (parsedType !== ZodParsedType.object) {\n      const ctx2 = this._getOrReturnCtx(input);\n      addIssueToContext(ctx2, {\n        code: ZodIssueCode.invalid_type,\n        expected: ZodParsedType.object,\n        received: ctx2.parsedType\n      });\n      return INVALID;\n    }\n    const {status, ctx} = this._processInputParams(input);\n    const {shape, keys: shapeKeys} = this._getCached();\n    const extraKeys = [];\n    if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === \"strip\")) {\n      for (const key in ctx.data) {\n        if (!shapeKeys.includes(key)) {\n          extraKeys.push(key);\n        }\n      }\n    }\n    const pairs = [];\n    for (const key of shapeKeys) {\n      const keyValidator = shape[key];\n      const value = ctx.data[key];\n      pairs.push({\n        key: {status: \"valid\", value: key},\n        value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n        alwaysSet: key in ctx.data\n      });\n    }\n    if (this._def.catchall instanceof ZodNever) {\n      const unknownKeys = this._def.unknownKeys;\n      if (unknownKeys === \"passthrough\") {\n        for (const key of extraKeys) {\n          pairs.push({\n            key: {status: \"valid\", value: key},\n            value: {status: \"valid\", value: ctx.data[key]}\n          });\n        }\n      } else if (unknownKeys === \"strict\") {\n        if (extraKeys.length > 0) {\n          addIssueToContext(ctx, {\n            code: ZodIssueCode.unrecognized_keys,\n            keys: extraKeys\n          });\n          status.dirty();\n        }\n      } else if (unknownKeys === \"strip\")\n        ;\n      else {\n        throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n      }\n    } else {\n      const catchall = this._def.catchall;\n      for (const key of extraKeys) {\n        const value = ctx.data[key];\n        pairs.push({\n          key: {status: \"valid\", value: key},\n          value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n          alwaysSet: key in ctx.data\n        });\n      }\n    }\n    if (ctx.common.async) {\n      return Promise.resolve().then(async () => {\n        const syncPairs = [];\n        for (const pair of pairs) {\n          const key = await pair.key;\n          syncPairs.push({\n            key,\n            value: await pair.value,\n            alwaysSet: pair.alwaysSet\n          });\n        }\n        return syncPairs;\n      }).then((syncPairs) => {\n        return ParseStatus.mergeObjectSync(status, syncPairs);\n      });\n    } else {\n      return ParseStatus.mergeObjectSync(status, pairs);\n    }\n  }\n  get shape() {\n    return this._def.shape();\n  }\n  strict(message) {\n    errorUtil.errToObj;\n    return new ZodObject({\n      ...this._def,\n      unknownKeys: \"strict\",\n      ...message !== void 0 ? {\n        errorMap: (issue, ctx) => {\n          var _a, _b, _c, _d;\n          const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError;\n          if (issue.code === \"unrecognized_keys\")\n            return {\n              message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError\n            };\n          return {\n            message: defaultError\n          };\n        }\n      } : {}\n    });\n  }\n  strip() {\n    return new ZodObject({\n      ...this._def,\n      unknownKeys: \"strip\"\n    });\n  }\n  passthrough() {\n    return new ZodObject({\n      ...this._def,\n      unknownKeys: \"passthrough\"\n    });\n  }\n  extend(augmentation) {\n    return new ZodObject({\n      ...this._def,\n      shape: () => ({\n        ...this._def.shape(),\n        ...augmentation\n      })\n    });\n  }\n  merge(merging) {\n    const merged = new ZodObject({\n      unknownKeys: merging._def.unknownKeys,\n      catchall: merging._def.catchall,\n      shape: () => ({\n        ...this._def.shape(),\n        ...merging._def.shape()\n      }),\n      typeName: ZodFirstPartyTypeKind.ZodObject\n    });\n    return merged;\n  }\n  setKey(key, schema) {\n    return this.augment({[key]: schema});\n  }\n  catchall(index) {\n    return new ZodObject({\n      ...this._def,\n      catchall: index\n    });\n  }\n  pick(mask) {\n    const shape = {};\n    util.objectKeys(mask).forEach((key) => {\n      if (mask[key] && this.shape[key]) {\n        shape[key] = this.shape[key];\n      }\n    });\n    return new ZodObject({\n      ...this._def,\n      shape: () => shape\n    });\n  }\n  omit(mask) {\n    const shape = {};\n    util.objectKeys(this.shape).forEach((key) => {\n      if (!mask[key]) {\n        shape[key] = this.shape[key];\n      }\n    });\n    return new ZodObject({\n      ...this._def,\n      shape: () => shape\n    });\n  }\n  deepPartial() {\n    return deepPartialify(this);\n  }\n  partial(mask) {\n    const newShape = {};\n    util.objectKeys(this.shape).forEach((key) => {\n      const fieldSchema = this.shape[key];\n      if (mask && !mask[key]) {\n        newShape[key] = fieldSchema;\n      } else {\n        newShape[key] = fieldSchema.optional();\n      }\n    });\n    return new ZodObject({\n      ...this._def,\n      shape: () => newShape\n    });\n  }\n  required(mask) {\n    const newShape = {};\n    util.objectKeys(this.shape).forEach((key) => {\n      if (mask && !mask[key]) {\n        newShape[key] = this.shape[key];\n      } else {\n        const fieldSchema = this.shape[key];\n        let newField = fieldSchema;\n        while (newField instanceof ZodOptional) {\n          newField = newField._def.innerType;\n        }\n        newShape[key] = newField;\n      }\n    });\n    return new ZodObject({\n      ...this._def,\n      shape: () => newShape\n    });\n  }\n  keyof() {\n    return createZodEnum(util.objectKeys(this.shape));\n  }\n}\nZodObject.create = (shape, params) => {\n  return new ZodObject({\n    shape: () => shape,\n    unknownKeys: \"strip\",\n    catchall: ZodNever.create(),\n    typeName: ZodFirstPartyTypeKind.ZodObject,\n    ...processCreateParams(params)\n  });\n};\nZodObject.strictCreate = (shape, params) => {\n  return new ZodObject({\n    shape: () => shape,\n    unknownKeys: \"strict\",\n    catchall: ZodNever.create(),\n    typeName: ZodFirstPartyTypeKind.ZodObject,\n    ...processCreateParams(params)\n  });\n};\nZodObject.lazycreate = (shape, params) => {\n  return new ZodObject({\n    shape,\n    unknownKeys: \"strip\",\n    catchall: ZodNever.create(),\n    typeName: ZodFirstPartyTypeKind.ZodObject,\n    ...processCreateParams(params)\n  });\n};\nclass ZodUnion extends ZodType {\n  _parse(input) {\n    const {ctx} = this._processInputParams(input);\n    const options = this._def.options;\n    function handleResults(results) {\n      for (const result of results) {\n        if (result.result.status === \"valid\") {\n          return result.result;\n        }\n      }\n      for (const result of results) {\n        if (result.result.status === \"dirty\") {\n          ctx.common.issues.push(...result.ctx.common.issues);\n          return result.result;\n        }\n      }\n      const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n      addIssueToContext(ctx, {\n        code: ZodIssueCode.invalid_union,\n        unionErrors\n      });\n      return INVALID;\n    }\n    if (ctx.common.async) {\n      return Promise.all(options.map(async (option) => {\n        const childCtx = {\n          ...ctx,\n          common: {\n            ...ctx.common,\n            issues: []\n          },\n          parent: null\n        };\n        return {\n          result: await option._parseAsync({\n            data: ctx.data,\n            path: ctx.path,\n            parent: childCtx\n          }),\n          ctx: childCtx\n        };\n      })).then(handleResults);\n    } else {\n      let dirty = void 0;\n      const issues = [];\n      for (const option of options) {\n        const childCtx = {\n          ...ctx,\n          common: {\n            ...ctx.common,\n            issues: []\n          },\n          parent: null\n        };\n        const result = option._parseSync({\n          data: ctx.data,\n          path: ctx.path,\n          parent: childCtx\n        });\n        if (result.status === \"valid\") {\n          return result;\n        } else if (result.status === \"dirty\" && !dirty) {\n          dirty = {result, ctx: childCtx};\n        }\n        if (childCtx.common.issues.length) {\n          issues.push(childCtx.common.issues);\n        }\n      }\n      if (dirty) {\n        ctx.common.issues.push(...dirty.ctx.common.issues);\n        return dirty.result;\n      }\n      const unionErrors = issues.map((issues2) => new ZodError(issues2));\n      addIssueToContext(ctx, {\n        code: ZodIssueCode.invalid_union,\n        unionErrors\n      });\n      return INVALID;\n    }\n  }\n  get options() {\n    return this._def.options;\n  }\n}\nZodUnion.create = (types, params) => {\n  return new ZodUnion({\n    options: types,\n    typeName: ZodFirstPartyTypeKind.ZodUnion,\n    ...processCreateParams(params)\n  });\n};\nconst getDiscriminator = (type) => {\n  if (type instanceof ZodLazy) {\n    return getDiscriminator(type.schema);\n  } else if (type instanceof ZodEffects) {\n    return getDiscriminator(type.innerType());\n  } else if (type instanceof ZodLiteral) {\n    return [type.value];\n  } else if (type instanceof ZodEnum) {\n    return type.options;\n  } else if (type instanceof ZodNativeEnum) {\n    return Object.keys(type.enum);\n  } else if (type instanceof ZodDefault) {\n    return getDiscriminator(type._def.innerType);\n  } else if (type instanceof ZodUndefined) {\n    return [void 0];\n  } else if (type instanceof ZodNull) {\n    return [null];\n  } else {\n    return null;\n  }\n};\nclass ZodDiscriminatedUnion extends ZodType {\n  _parse(input) {\n    const {ctx} = this._processInputParams(input);\n    if (ctx.parsedType !== ZodParsedType.object) {\n      addIssueToContext(ctx, {\n        code: ZodIssueCode.invalid_type,\n        expected: ZodParsedType.object,\n        received: ctx.parsedType\n      });\n      return INVALID;\n    }\n    const discriminator = this.discriminator;\n    const discriminatorValue = ctx.data[discriminator];\n    const option = this.optionsMap.get(discriminatorValue);\n    if (!option) {\n      addIssueToContext(ctx, {\n        code: ZodIssueCode.invalid_union_discriminator,\n        options: Array.from(this.optionsMap.keys()),\n        path: [discriminator]\n      });\n      return INVALID;\n    }\n    if (ctx.common.async) {\n      return option._parseAsync({\n        data: ctx.data,\n        path: ctx.path,\n        parent: ctx\n      });\n    } else {\n      return option._parseSync({\n        data: ctx.data,\n        path: ctx.path,\n        parent: ctx\n      });\n    }\n  }\n  get discriminator() {\n    return this._def.discriminator;\n  }\n  get options() {\n    return this._def.options;\n  }\n  get optionsMap() {\n    return this._def.optionsMap;\n  }\n  static create(discriminator, options, params) {\n    const optionsMap = new Map();\n    for (const type of options) {\n      const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n      if (!discriminatorValues) {\n        throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n      }\n      for (const value of discriminatorValues) {\n        if (optionsMap.has(value)) {\n          throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n        }\n        optionsMap.set(value, type);\n      }\n    }\n    return new ZodDiscriminatedUnion({\n      typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n      discriminator,\n      options,\n      optionsMap,\n      ...processCreateParams(params)\n    });\n  }\n}\nfunction mergeValues(a, b) {\n  const aType = getParsedType(a);\n  const bType = getParsedType(b);\n  if (a === b) {\n    return {valid: true, data: a};\n  } else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n    const bKeys = util.objectKeys(b);\n    const sharedKeys = util.objectKeys(a).filter((key) => bKeys.indexOf(key) !== -1);\n    const newObj = {...a, ...b};\n    for (const key of sharedKeys) {\n      const sharedValue = mergeValues(a[key], b[key]);\n      if (!sharedValue.valid) {\n        return {valid: false};\n      }\n      newObj[key] = sharedValue.data;\n    }\n    return {valid: true, data: newObj};\n  } else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n    if (a.length !== b.length) {\n      return {valid: false};\n    }\n    const newArray = [];\n    for (let index = 0; index < a.length; index++) {\n      const itemA = a[index];\n      const itemB = b[index];\n      const sharedValue = mergeValues(itemA, itemB);\n      if (!sharedValue.valid) {\n        return {valid: false};\n      }\n      newArray.push(sharedValue.data);\n    }\n    return {valid: true, data: newArray};\n  } else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a === +b) {\n    return {valid: true, data: a};\n  } else {\n    return {valid: false};\n  }\n}\nclass ZodIntersection extends ZodType {\n  _parse(input) {\n    const {status, ctx} = this._processInputParams(input);\n    const handleParsed = (parsedLeft, parsedRight) => {\n      if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n        return INVALID;\n      }\n      const merged = mergeValues(parsedLeft.value, parsedRight.value);\n      if (!merged.valid) {\n        addIssueToContext(ctx, {\n          code: ZodIssueCode.invalid_intersection_types\n        });\n        return INVALID;\n      }\n      if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n        status.dirty();\n      }\n      return {status: status.value, value: merged.data};\n    };\n    if (ctx.common.async) {\n      return Promise.all([\n        this._def.left._parseAsync({\n          data: ctx.data,\n          path: ctx.path,\n          parent: ctx\n        }),\n        this._def.right._parseAsync({\n          data: ctx.data,\n          path: ctx.path,\n          parent: ctx\n        })\n      ]).then(([left, right]) => handleParsed(left, right));\n    } else {\n      return handleParsed(this._def.left._parseSync({\n        data: ctx.data,\n        path: ctx.path,\n        parent: ctx\n      }), this._def.right._parseSync({\n        data: ctx.data,\n        path: ctx.path,\n        parent: ctx\n      }));\n    }\n  }\n}\nZodIntersection.create = (left, right, params) => {\n  return new ZodIntersection({\n    left,\n    right,\n    typeName: ZodFirstPartyTypeKind.ZodIntersection,\n    ...processCreateParams(params)\n  });\n};\nclass ZodTuple extends ZodType {\n  _parse(input) {\n    const {status, ctx} = this._processInputParams(input);\n    if (ctx.parsedType !== ZodParsedType.array) {\n      addIssueToContext(ctx, {\n        code: ZodIssueCode.invalid_type,\n        expected: ZodParsedType.array,\n        received: ctx.parsedType\n      });\n      return INVALID;\n    }\n    if (ctx.data.length < this._def.items.length) {\n      addIssueToContext(ctx, {\n        code: ZodIssueCode.too_small,\n        minimum: this._def.items.length,\n        inclusive: true,\n        exact: false,\n        type: \"array\"\n      });\n      return INVALID;\n    }\n    const rest = this._def.rest;\n    if (!rest && ctx.data.length > this._def.items.length) {\n      addIssueToContext(ctx, {\n        code: ZodIssueCode.too_big,\n        maximum: this._def.items.length,\n        inclusive: true,\n        exact: false,\n        type: \"array\"\n      });\n      status.dirty();\n    }\n    const items = [...ctx.data].map((item, itemIndex) => {\n      const schema = this._def.items[itemIndex] || this._def.rest;\n      if (!schema)\n        return null;\n      return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n    }).filter((x) => !!x);\n    if (ctx.common.async) {\n      return Promise.all(items).then((results) => {\n        return ParseStatus.mergeArray(status, results);\n      });\n    } else {\n      return ParseStatus.mergeArray(status, items);\n    }\n  }\n  get items() {\n    return this._def.items;\n  }\n  rest(rest) {\n    return new ZodTuple({\n      ...this._def,\n      rest\n    });\n  }\n}\nZodTuple.create = (schemas, params) => {\n  if (!Array.isArray(schemas)) {\n    throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n  }\n  return new ZodTuple({\n    items: schemas,\n    typeName: ZodFirstPartyTypeKind.ZodTuple,\n    rest: null,\n    ...processCreateParams(params)\n  });\n};\nclass ZodRecord extends ZodType {\n  get keySchema() {\n    return this._def.keyType;\n  }\n  get valueSchema() {\n    return this._def.valueType;\n  }\n  _parse(input) {\n    const {status, ctx} = this._processInputParams(input);\n    if (ctx.parsedType !== ZodParsedType.object) {\n      addIssueToContext(ctx, {\n        code: ZodIssueCode.invalid_type,\n        expected: ZodParsedType.object,\n        received: ctx.parsedType\n      });\n      return INVALID;\n    }\n    const pairs = [];\n    const keyType = this._def.keyType;\n    const valueType = this._def.valueType;\n    for (const key in ctx.data) {\n      pairs.push({\n        key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n        value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key))\n      });\n    }\n    if (ctx.common.async) {\n      return ParseStatus.mergeObjectAsync(status, pairs);\n    } else {\n      return ParseStatus.mergeObjectSync(status, pairs);\n    }\n  }\n  get element() {\n    return this._def.valueType;\n  }\n  static create(first, second, third) {\n    if (second instanceof ZodType) {\n      return new ZodRecord({\n        keyType: first,\n        valueType: second,\n        typeName: ZodFirstPartyTypeKind.ZodRecord,\n        ...processCreateParams(third)\n      });\n    }\n    return new ZodRecord({\n      keyType: ZodString.create(),\n      valueType: first,\n      typeName: ZodFirstPartyTypeKind.ZodRecord,\n      ...processCreateParams(second)\n    });\n  }\n}\nclass ZodMap extends ZodType {\n  get keySchema() {\n    return this._def.keyType;\n  }\n  get valueSchema() {\n    return this._def.valueType;\n  }\n  _parse(input) {\n    const {status, ctx} = this._processInputParams(input);\n    if (ctx.parsedType !== ZodParsedType.map) {\n      addIssueToContext(ctx, {\n        code: ZodIssueCode.invalid_type,\n        expected: ZodParsedType.map,\n        received: ctx.parsedType\n      });\n      return INVALID;\n    }\n    const keyType = this._def.keyType;\n    const valueType = this._def.valueType;\n    const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n      return {\n        key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n        value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"]))\n      };\n    });\n    if (ctx.common.async) {\n      const finalMap = new Map();\n      return Promise.resolve().then(async () => {\n        for (const pair of pairs) {\n          const key = await pair.key;\n          const value = await pair.value;\n          if (key.status === \"aborted\" || value.status === \"aborted\") {\n            return INVALID;\n          }\n          if (key.status === \"dirty\" || value.status === \"dirty\") {\n            status.dirty();\n          }\n          finalMap.set(key.value, value.value);\n        }\n        return {status: status.value, value: finalMap};\n      });\n    } else {\n      const finalMap = new Map();\n      for (const pair of pairs) {\n        const key = pair.key;\n        const value = pair.value;\n        if (key.status === \"aborted\" || value.status === \"aborted\") {\n          return INVALID;\n        }\n        if (key.status === \"dirty\" || value.status === \"dirty\") {\n          status.dirty();\n        }\n        finalMap.set(key.value, value.value);\n      }\n      return {status: status.value, value: finalMap};\n    }\n  }\n}\nZodMap.create = (keyType, valueType, params) => {\n  return new ZodMap({\n    valueType,\n    keyType,\n    typeName: ZodFirstPartyTypeKind.ZodMap,\n    ...processCreateParams(params)\n  });\n};\nclass ZodSet extends ZodType {\n  _parse(input) {\n    const {status, ctx} = this._processInputParams(input);\n    if (ctx.parsedType !== ZodParsedType.set) {\n      addIssueToContext(ctx, {\n        code: ZodIssueCode.invalid_type,\n        expected: ZodParsedType.set,\n        received: ctx.parsedType\n      });\n      return INVALID;\n    }\n    const def = this._def;\n    if (def.minSize !== null) {\n      if (ctx.data.size < def.minSize.value) {\n        addIssueToContext(ctx, {\n          code: ZodIssueCode.too_small,\n          minimum: def.minSize.value,\n          type: \"set\",\n          inclusive: true,\n          exact: false,\n          message: def.minSize.message\n        });\n        status.dirty();\n      }\n    }\n    if (def.maxSize !== null) {\n      if (ctx.data.size > def.maxSize.value) {\n        addIssueToContext(ctx, {\n          code: ZodIssueCode.too_big,\n          maximum: def.maxSize.value,\n          type: \"set\",\n          inclusive: true,\n          exact: false,\n          message: def.maxSize.message\n        });\n        status.dirty();\n      }\n    }\n    const valueType = this._def.valueType;\n    function finalizeSet(elements2) {\n      const parsedSet = new Set();\n      for (const element of elements2) {\n        if (element.status === \"aborted\")\n          return INVALID;\n        if (element.status === \"dirty\")\n          status.dirty();\n        parsedSet.add(element.value);\n      }\n      return {status: status.value, value: parsedSet};\n    }\n    const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n    if (ctx.common.async) {\n      return Promise.all(elements).then((elements2) => finalizeSet(elements2));\n    } else {\n      return finalizeSet(elements);\n    }\n  }\n  min(minSize, message) {\n    return new ZodSet({\n      ...this._def,\n      minSize: {value: minSize, message: errorUtil.toString(message)}\n    });\n  }\n  max(maxSize, message) {\n    return new ZodSet({\n      ...this._def,\n      maxSize: {value: maxSize, message: errorUtil.toString(message)}\n    });\n  }\n  size(size, message) {\n    return this.min(size, message).max(size, message);\n  }\n  nonempty(message) {\n    return this.min(1, message);\n  }\n}\nZodSet.create = (valueType, params) => {\n  return new ZodSet({\n    valueType,\n    minSize: null,\n    maxSize: null,\n    typeName: ZodFirstPartyTypeKind.ZodSet,\n    ...processCreateParams(params)\n  });\n};\nclass ZodFunction extends ZodType {\n  constructor() {\n    super(...arguments);\n    this.validate = this.implement;\n  }\n  _parse(input) {\n    const {ctx} = this._processInputParams(input);\n    if (ctx.parsedType !== ZodParsedType.function) {\n      addIssueToContext(ctx, {\n        code: ZodIssueCode.invalid_type,\n        expected: ZodParsedType.function,\n        received: ctx.parsedType\n      });\n      return INVALID;\n    }\n    function makeArgsIssue(args, error) {\n      return makeIssue({\n        data: args,\n        path: ctx.path,\n        errorMaps: [\n          ctx.common.contextualErrorMap,\n          ctx.schemaErrorMap,\n          getErrorMap(),\n          errorMap\n        ].filter((x) => !!x),\n        issueData: {\n          code: ZodIssueCode.invalid_arguments,\n          argumentsError: error\n        }\n      });\n    }\n    function makeReturnsIssue(returns, error) {\n      return makeIssue({\n        data: returns,\n        path: ctx.path,\n        errorMaps: [\n          ctx.common.contextualErrorMap,\n          ctx.schemaErrorMap,\n          getErrorMap(),\n          errorMap\n        ].filter((x) => !!x),\n        issueData: {\n          code: ZodIssueCode.invalid_return_type,\n          returnTypeError: error\n        }\n      });\n    }\n    const params = {errorMap: ctx.common.contextualErrorMap};\n    const fn = ctx.data;\n    if (this._def.returns instanceof ZodPromise) {\n      const me = this;\n      return OK(async function(...args) {\n        const error = new ZodError([]);\n        const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => {\n          error.addIssue(makeArgsIssue(args, e));\n          throw error;\n        });\n        const result = await Reflect.apply(fn, this, parsedArgs);\n        const parsedReturns = await me._def.returns._def.type.parseAsync(result, params).catch((e) => {\n          error.addIssue(makeReturnsIssue(result, e));\n          throw error;\n        });\n        return parsedReturns;\n      });\n    } else {\n      const me = this;\n      return OK(function(...args) {\n        const parsedArgs = me._def.args.safeParse(args, params);\n        if (!parsedArgs.success) {\n          throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n        }\n        const result = Reflect.apply(fn, this, parsedArgs.data);\n        const parsedReturns = me._def.returns.safeParse(result, params);\n        if (!parsedReturns.success) {\n          throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n        }\n        return parsedReturns.data;\n      });\n    }\n  }\n  parameters() {\n    return this._def.args;\n  }\n  returnType() {\n    return this._def.returns;\n  }\n  args(...items) {\n    return new ZodFunction({\n      ...this._def,\n      args: ZodTuple.create(items).rest(ZodUnknown.create())\n    });\n  }\n  returns(returnType) {\n    return new ZodFunction({\n      ...this._def,\n      returns: returnType\n    });\n  }\n  implement(func) {\n    const validatedFunc = this.parse(func);\n    return validatedFunc;\n  }\n  strictImplement(func) {\n    const validatedFunc = this.parse(func);\n    return validatedFunc;\n  }\n  static create(args, returns, params) {\n    return new ZodFunction({\n      args: args ? args : ZodTuple.create([]).rest(ZodUnknown.create()),\n      returns: returns || ZodUnknown.create(),\n      typeName: ZodFirstPartyTypeKind.ZodFunction,\n      ...processCreateParams(params)\n    });\n  }\n}\nclass ZodLazy extends ZodType {\n  get schema() {\n    return this._def.getter();\n  }\n  _parse(input) {\n    const {ctx} = this._processInputParams(input);\n    const lazySchema = this._def.getter();\n    return lazySchema._parse({data: ctx.data, path: ctx.path, parent: ctx});\n  }\n}\nZodLazy.create = (getter, params) => {\n  return new ZodLazy({\n    getter,\n    typeName: ZodFirstPartyTypeKind.ZodLazy,\n    ...processCreateParams(params)\n  });\n};\nclass ZodLiteral extends ZodType {\n  _parse(input) {\n    if (input.data !== this._def.value) {\n      const ctx = this._getOrReturnCtx(input);\n      addIssueToContext(ctx, {\n        received: ctx.data,\n        code: ZodIssueCode.invalid_literal,\n        expected: this._def.value\n      });\n      return INVALID;\n    }\n    return {status: \"valid\", value: input.data};\n  }\n  get value() {\n    return this._def.value;\n  }\n}\nZodLiteral.create = (value, params) => {\n  return new ZodLiteral({\n    value,\n    typeName: ZodFirstPartyTypeKind.ZodLiteral,\n    ...processCreateParams(params)\n  });\n};\nfunction createZodEnum(values, params) {\n  return new ZodEnum({\n    values,\n    typeName: ZodFirstPartyTypeKind.ZodEnum,\n    ...processCreateParams(params)\n  });\n}\nclass ZodEnum extends ZodType {\n  _parse(input) {\n    if (typeof input.data !== \"string\") {\n      const ctx = this._getOrReturnCtx(input);\n      const expectedValues = this._def.values;\n      addIssueToContext(ctx, {\n        expected: util.joinValues(expectedValues),\n        received: ctx.parsedType,\n        code: ZodIssueCode.invalid_type\n      });\n      return INVALID;\n    }\n    if (this._def.values.indexOf(input.data) === -1) {\n      const ctx = this._getOrReturnCtx(input);\n      const expectedValues = this._def.values;\n      addIssueToContext(ctx, {\n        received: ctx.data,\n        code: ZodIssueCode.invalid_enum_value,\n        options: expectedValues\n      });\n      return INVALID;\n    }\n    return OK(input.data);\n  }\n  get options() {\n    return this._def.values;\n  }\n  get enum() {\n    const enumValues = {};\n    for (const val of this._def.values) {\n      enumValues[val] = val;\n    }\n    return enumValues;\n  }\n  get Values() {\n    const enumValues = {};\n    for (const val of this._def.values) {\n      enumValues[val] = val;\n    }\n    return enumValues;\n  }\n  get Enum() {\n    const enumValues = {};\n    for (const val of this._def.values) {\n      enumValues[val] = val;\n    }\n    return enumValues;\n  }\n  extract(values) {\n    return ZodEnum.create(values);\n  }\n  exclude(values) {\n    return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)));\n  }\n}\nZodEnum.create = createZodEnum;\nclass ZodNativeEnum extends ZodType {\n  _parse(input) {\n    const nativeEnumValues = util.getValidEnumValues(this._def.values);\n    const ctx = this._getOrReturnCtx(input);\n    if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) {\n      const expectedValues = util.objectValues(nativeEnumValues);\n      addIssueToContext(ctx, {\n        expected: util.joinValues(expectedValues),\n        received: ctx.parsedType,\n        code: ZodIssueCode.invalid_type\n      });\n      return INVALID;\n    }\n    if (nativeEnumValues.indexOf(input.data) === -1) {\n      const expectedValues = util.objectValues(nativeEnumValues);\n      addIssueToContext(ctx, {\n        received: ctx.data,\n        code: ZodIssueCode.invalid_enum_value,\n        options: expectedValues\n      });\n      return INVALID;\n    }\n    return OK(input.data);\n  }\n  get enum() {\n    return this._def.values;\n  }\n}\nZodNativeEnum.create = (values, params) => {\n  return new ZodNativeEnum({\n    values,\n    typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n    ...processCreateParams(params)\n  });\n};\nclass ZodPromise extends ZodType {\n  unwrap() {\n    return this._def.type;\n  }\n  _parse(input) {\n    const {ctx} = this._processInputParams(input);\n    if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) {\n      addIssueToContext(ctx, {\n        code: ZodIssueCode.invalid_type,\n        expected: ZodParsedType.promise,\n        received: ctx.parsedType\n      });\n      return INVALID;\n    }\n    const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data);\n    return OK(promisified.then((data) => {\n      return this._def.type.parseAsync(data, {\n        path: ctx.path,\n        errorMap: ctx.common.contextualErrorMap\n      });\n    }));\n  }\n}\nZodPromise.create = (schema, params) => {\n  return new ZodPromise({\n    type: schema,\n    typeName: ZodFirstPartyTypeKind.ZodPromise,\n    ...processCreateParams(params)\n  });\n};\nclass ZodEffects extends ZodType {\n  innerType() {\n    return this._def.schema;\n  }\n  sourceType() {\n    return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects ? this._def.schema.sourceType() : this._def.schema;\n  }\n  _parse(input) {\n    const {status, ctx} = this._processInputParams(input);\n    const effect = this._def.effect || null;\n    const checkCtx = {\n      addIssue: (arg) => {\n        addIssueToContext(ctx, arg);\n        if (arg.fatal) {\n          status.abort();\n        } else {\n          status.dirty();\n        }\n      },\n      get path() {\n        return ctx.path;\n      }\n    };\n    checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n    if (effect.type === \"preprocess\") {\n      const processed = effect.transform(ctx.data, checkCtx);\n      if (ctx.common.issues.length) {\n        return {\n          status: \"dirty\",\n          value: ctx.data\n        };\n      }\n      if (ctx.common.async) {\n        return Promise.resolve(processed).then((processed2) => {\n          return this._def.schema._parseAsync({\n            data: processed2,\n            path: ctx.path,\n            parent: ctx\n          });\n        });\n      } else {\n        return this._def.schema._parseSync({\n          data: processed,\n          path: ctx.path,\n          parent: ctx\n        });\n      }\n    }\n    if (effect.type === \"refinement\") {\n      const executeRefinement = (acc) => {\n        const result = effect.refinement(acc, checkCtx);\n        if (ctx.common.async) {\n          return Promise.resolve(result);\n        }\n        if (result instanceof Promise) {\n          throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n        }\n        return acc;\n      };\n      if (ctx.common.async === false) {\n        const inner = this._def.schema._parseSync({\n          data: ctx.data,\n          path: ctx.path,\n          parent: ctx\n        });\n        if (inner.status === \"aborted\")\n          return INVALID;\n        if (inner.status === \"dirty\")\n          status.dirty();\n        executeRefinement(inner.value);\n        return {status: status.value, value: inner.value};\n      } else {\n        return this._def.schema._parseAsync({data: ctx.data, path: ctx.path, parent: ctx}).then((inner) => {\n          if (inner.status === \"aborted\")\n            return INVALID;\n          if (inner.status === \"dirty\")\n            status.dirty();\n          return executeRefinement(inner.value).then(() => {\n            return {status: status.value, value: inner.value};\n          });\n        });\n      }\n    }\n    if (effect.type === \"transform\") {\n      if (ctx.common.async === false) {\n        const base = this._def.schema._parseSync({\n          data: ctx.data,\n          path: ctx.path,\n          parent: ctx\n        });\n        if (!isValid(base))\n          return base;\n        const result = effect.transform(base.value, checkCtx);\n        if (result instanceof Promise) {\n          throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n        }\n        return {status: status.value, value: result};\n      } else {\n        return this._def.schema._parseAsync({data: ctx.data, path: ctx.path, parent: ctx}).then((base) => {\n          if (!isValid(base))\n            return base;\n          return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({status: status.value, value: result}));\n        });\n      }\n    }\n    util.assertNever(effect);\n  }\n}\nZodEffects.create = (schema, effect, params) => {\n  return new ZodEffects({\n    schema,\n    typeName: ZodFirstPartyTypeKind.ZodEffects,\n    effect,\n    ...processCreateParams(params)\n  });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n  return new ZodEffects({\n    schema,\n    effect: {type: \"preprocess\", transform: preprocess},\n    typeName: ZodFirstPartyTypeKind.ZodEffects,\n    ...processCreateParams(params)\n  });\n};\nclass ZodOptional extends ZodType {\n  _parse(input) {\n    const parsedType = this._getType(input);\n    if (parsedType === ZodParsedType.undefined) {\n      return OK(void 0);\n    }\n    return this._def.innerType._parse(input);\n  }\n  unwrap() {\n    return this._def.innerType;\n  }\n}\nZodOptional.create = (type, params) => {\n  return new ZodOptional({\n    innerType: type,\n    typeName: ZodFirstPartyTypeKind.ZodOptional,\n    ...processCreateParams(params)\n  });\n};\nclass ZodNullable extends ZodType {\n  _parse(input) {\n    const parsedType = this._getType(input);\n    if (parsedType === ZodParsedType.null) {\n      return OK(null);\n    }\n    return this._def.innerType._parse(input);\n  }\n  unwrap() {\n    return this._def.innerType;\n  }\n}\nZodNullable.create = (type, params) => {\n  return new ZodNullable({\n    innerType: type,\n    typeName: ZodFirstPartyTypeKind.ZodNullable,\n    ...processCreateParams(params)\n  });\n};\nclass ZodDefault extends ZodType {\n  _parse(input) {\n    const {ctx} = this._processInputParams(input);\n    let data = ctx.data;\n    if (ctx.parsedType === ZodParsedType.undefined) {\n      data = this._def.defaultValue();\n    }\n    return this._def.innerType._parse({\n      data,\n      path: ctx.path,\n      parent: ctx\n    });\n  }\n  removeDefault() {\n    return this._def.innerType;\n  }\n}\nZodDefault.create = (type, params) => {\n  return new ZodDefault({\n    innerType: type,\n    typeName: ZodFirstPartyTypeKind.ZodDefault,\n    defaultValue: typeof params.default === \"function\" ? params.default : () => params.default,\n    ...processCreateParams(params)\n  });\n};\nclass ZodCatch extends ZodType {\n  _parse(input) {\n    const {ctx} = this._processInputParams(input);\n    const newCtx = {\n      ...ctx,\n      common: {\n        ...ctx.common,\n        issues: []\n      }\n    };\n    const result = this._def.innerType._parse({\n      data: newCtx.data,\n      path: newCtx.path,\n      parent: {\n        ...newCtx\n      }\n    });\n    if (isAsync(result)) {\n      return result.then((result2) => {\n        return {\n          status: \"valid\",\n          value: result2.status === \"valid\" ? result2.value : this._def.catchValue({\n            get error() {\n              return new ZodError(newCtx.common.issues);\n            },\n            input: newCtx.data\n          })\n        };\n      });\n    } else {\n      return {\n        status: \"valid\",\n        value: result.status === \"valid\" ? result.value : this._def.catchValue({\n          get error() {\n            return new ZodError(newCtx.common.issues);\n          },\n          input: newCtx.data\n        })\n      };\n    }\n  }\n  removeCatch() {\n    return this._def.innerType;\n  }\n}\nZodCatch.create = (type, params) => {\n  return new ZodCatch({\n    innerType: type,\n    typeName: ZodFirstPartyTypeKind.ZodCatch,\n    catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n    ...processCreateParams(params)\n  });\n};\nclass ZodNaN extends ZodType {\n  _parse(input) {\n    const parsedType = this._getType(input);\n    if (parsedType !== ZodParsedType.nan) {\n      const ctx = this._getOrReturnCtx(input);\n      addIssueToContext(ctx, {\n        code: ZodIssueCode.invalid_type,\n        expected: ZodParsedType.nan,\n        received: ctx.parsedType\n      });\n      return INVALID;\n    }\n    return {status: \"valid\", value: input.data};\n  }\n}\nZodNaN.create = (params) => {\n  return new ZodNaN({\n    typeName: ZodFirstPartyTypeKind.ZodNaN,\n    ...processCreateParams(params)\n  });\n};\nconst BRAND = Symbol(\"zod_brand\");\nclass ZodBranded extends ZodType {\n  _parse(input) {\n    const {ctx} = this._processInputParams(input);\n    const data = ctx.data;\n    return this._def.type._parse({\n      data,\n      path: ctx.path,\n      parent: ctx\n    });\n  }\n  unwrap() {\n    return this._def.type;\n  }\n}\nclass ZodPipeline extends ZodType {\n  _parse(input) {\n    const {status, ctx} = this._processInputParams(input);\n    if (ctx.common.async) {\n      const handleAsync = async () => {\n        const inResult = await this._def.in._parseAsync({\n          data: ctx.data,\n          path: ctx.path,\n          parent: ctx\n        });\n        if (inResult.status === \"aborted\")\n          return INVALID;\n        if (inResult.status === \"dirty\") {\n          status.dirty();\n          return DIRTY(inResult.value);\n        } else {\n          return this._def.out._parseAsync({\n            data: inResult.value,\n            path: ctx.path,\n            parent: ctx\n          });\n        }\n      };\n      return handleAsync();\n    } else {\n      const inResult = this._def.in._parseSync({\n        data: ctx.data,\n        path: ctx.path,\n        parent: ctx\n      });\n      if (inResult.status === \"aborted\")\n        return INVALID;\n      if (inResult.status === \"dirty\") {\n        status.dirty();\n        return {\n          status: \"dirty\",\n          value: inResult.value\n        };\n      } else {\n        return this._def.out._parseSync({\n          data: inResult.value,\n          path: ctx.path,\n          parent: ctx\n        });\n      }\n    }\n  }\n  static create(a, b) {\n    return new ZodPipeline({\n      in: a,\n      out: b,\n      typeName: ZodFirstPartyTypeKind.ZodPipeline\n    });\n  }\n}\nclass ZodReadonly extends ZodType {\n  _parse(input) {\n    const result = this._def.innerType._parse(input);\n    if (isValid(result)) {\n      result.value = Object.freeze(result.value);\n    }\n    return result;\n  }\n}\nZodReadonly.create = (type, params) => {\n  return new ZodReadonly({\n    innerType: type,\n    typeName: ZodFirstPartyTypeKind.ZodReadonly,\n    ...processCreateParams(params)\n  });\n};\nconst custom = (check, params = {}, fatal) => {\n  if (check)\n    return ZodAny.create().superRefine((data, ctx) => {\n      var _a, _b;\n      if (!check(data)) {\n        const p = typeof params === \"function\" ? params(data) : typeof params === \"string\" ? {message: params} : params;\n        const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true;\n        const p2 = typeof p === \"string\" ? {message: p} : p;\n        ctx.addIssue({code: \"custom\", ...p2, fatal: _fatal});\n      }\n    });\n  return ZodAny.create();\n};\nconst late = {\n  object: ZodObject.lazycreate\n};\nvar ZodFirstPartyTypeKind;\n(function(ZodFirstPartyTypeKind2) {\n  ZodFirstPartyTypeKind2[\"ZodString\"] = \"ZodString\";\n  ZodFirstPartyTypeKind2[\"ZodNumber\"] = \"ZodNumber\";\n  ZodFirstPartyTypeKind2[\"ZodNaN\"] = \"ZodNaN\";\n  ZodFirstPartyTypeKind2[\"ZodBigInt\"] = \"ZodBigInt\";\n  ZodFirstPartyTypeKind2[\"ZodBoolean\"] = \"ZodBoolean\";\n  ZodFirstPartyTypeKind2[\"ZodDate\"] = \"ZodDate\";\n  ZodFirstPartyTypeKind2[\"ZodSymbol\"] = \"ZodSymbol\";\n  ZodFirstPartyTypeKind2[\"ZodUndefined\"] = \"ZodUndefined\";\n  ZodFirstPartyTypeKind2[\"ZodNull\"] = \"ZodNull\";\n  ZodFirstPartyTypeKind2[\"ZodAny\"] = \"ZodAny\";\n  ZodFirstPartyTypeKind2[\"ZodUnknown\"] = \"ZodUnknown\";\n  ZodFirstPartyTypeKind2[\"ZodNever\"] = \"ZodNever\";\n  ZodFirstPartyTypeKind2[\"ZodVoid\"] = \"ZodVoid\";\n  ZodFirstPartyTypeKind2[\"ZodArray\"] = \"ZodArray\";\n  ZodFirstPartyTypeKind2[\"ZodObject\"] = \"ZodObject\";\n  ZodFirstPartyTypeKind2[\"ZodUnion\"] = \"ZodUnion\";\n  ZodFirstPartyTypeKind2[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n  ZodFirstPartyTypeKind2[\"ZodIntersection\"] = \"ZodIntersection\";\n  ZodFirstPartyTypeKind2[\"ZodTuple\"] = \"ZodTuple\";\n  ZodFirstPartyTypeKind2[\"ZodRecord\"] = \"ZodRecord\";\n  ZodFirstPartyTypeKind2[\"ZodMap\"] = \"ZodMap\";\n  ZodFirstPartyTypeKind2[\"ZodSet\"] = \"ZodSet\";\n  ZodFirstPartyTypeKind2[\"ZodFunction\"] = \"ZodFunction\";\n  ZodFirstPartyTypeKind2[\"ZodLazy\"] = \"ZodLazy\";\n  ZodFirstPartyTypeKind2[\"ZodLiteral\"] = \"ZodLiteral\";\n  ZodFirstPartyTypeKind2[\"ZodEnum\"] = \"ZodEnum\";\n  ZodFirstPartyTypeKind2[\"ZodEffects\"] = \"ZodEffects\";\n  ZodFirstPartyTypeKind2[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n  ZodFirstPartyTypeKind2[\"ZodOptional\"] = \"ZodOptional\";\n  ZodFirstPartyTypeKind2[\"ZodNullable\"] = \"ZodNullable\";\n  ZodFirstPartyTypeKind2[\"ZodDefault\"] = \"ZodDefault\";\n  ZodFirstPartyTypeKind2[\"ZodCatch\"] = \"ZodCatch\";\n  ZodFirstPartyTypeKind2[\"ZodPromise\"] = \"ZodPromise\";\n  ZodFirstPartyTypeKind2[\"ZodBranded\"] = \"ZodBranded\";\n  ZodFirstPartyTypeKind2[\"ZodPipeline\"] = \"ZodPipeline\";\n  ZodFirstPartyTypeKind2[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\nconst instanceOfType = (cls, params = {\n  message: `Input not instance of ${cls.name}`\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nconst coerce = {\n  string: (arg) => ZodString.create({...arg, coerce: true}),\n  number: (arg) => ZodNumber.create({...arg, coerce: true}),\n  boolean: (arg) => ZodBoolean.create({\n    ...arg,\n    coerce: true\n  }),\n  bigint: (arg) => ZodBigInt.create({...arg, coerce: true}),\n  date: (arg) => ZodDate.create({...arg, coerce: true})\n};\nconst NEVER = INVALID;\nvar z = /* @__PURE__ */ Object.freeze({\n  __proto__: null,\n  defaultErrorMap: errorMap,\n  setErrorMap,\n  getErrorMap,\n  makeIssue,\n  EMPTY_PATH,\n  addIssueToContext,\n  ParseStatus,\n  INVALID,\n  DIRTY,\n  OK,\n  isAborted,\n  isDirty,\n  isValid,\n  isAsync,\n  get util() {\n    return util;\n  },\n  get objectUtil() {\n    return objectUtil;\n  },\n  ZodParsedType,\n  getParsedType,\n  ZodType,\n  ZodString,\n  ZodNumber,\n  ZodBigInt,\n  ZodBoolean,\n  ZodDate,\n  ZodSymbol,\n  ZodUndefined,\n  ZodNull,\n  ZodAny,\n  ZodUnknown,\n  ZodNever,\n  ZodVoid,\n  ZodArray,\n  ZodObject,\n  ZodUnion,\n  ZodDiscriminatedUnion,\n  ZodIntersection,\n  ZodTuple,\n  ZodRecord,\n  ZodMap,\n  ZodSet,\n  ZodFunction,\n  ZodLazy,\n  ZodLiteral,\n  ZodEnum,\n  ZodNativeEnum,\n  ZodPromise,\n  ZodEffects,\n  ZodTransformer: ZodEffects,\n  ZodOptional,\n  ZodNullable,\n  ZodDefault,\n  ZodCatch,\n  ZodNaN,\n  BRAND,\n  ZodBranded,\n  ZodPipeline,\n  ZodReadonly,\n  custom,\n  Schema: ZodType,\n  ZodSchema: ZodType,\n  late,\n  get ZodFirstPartyTypeKind() {\n    return ZodFirstPartyTypeKind;\n  },\n  coerce,\n  any: anyType,\n  array: arrayType,\n  bigint: bigIntType,\n  boolean: booleanType,\n  date: dateType,\n  discriminatedUnion: discriminatedUnionType,\n  effect: effectsType,\n  enum: enumType,\n  function: functionType,\n  instanceof: instanceOfType,\n  intersection: intersectionType,\n  lazy: lazyType,\n  literal: literalType,\n  map: mapType,\n  nan: nanType,\n  nativeEnum: nativeEnumType,\n  never: neverType,\n  null: nullType,\n  nullable: nullableType,\n  number: numberType,\n  object: objectType,\n  oboolean,\n  onumber,\n  optional: optionalType,\n  ostring,\n  pipeline: pipelineType,\n  preprocess: preprocessType,\n  promise: promiseType,\n  record: recordType,\n  set: setType,\n  strictObject: strictObjectType,\n  string: stringType,\n  symbol: symbolType,\n  transformer: effectsType,\n  tuple: tupleType,\n  undefined: undefinedType,\n  union: unionType,\n  unknown: unknownType,\n  void: voidType,\n  NEVER,\n  ZodIssueCode,\n  quotelessJson,\n  ZodError\n});\nvar BigInteger = {exports: {}};\n(function(module) {\n  var bigInt2 = function(undefined$1) {\n    var BASE2 = 1e7, LOG_BASE2 = 7, MAX_INT = 9007199254740992, MAX_INT_ARR = smallToArray(MAX_INT), DEFAULT_ALPHABET = \"0123456789abcdefghijklmnopqrstuvwxyz\";\n    var supportsNativeBigInt = typeof BigInt === \"function\";\n    function Integer(v, radix, alphabet, caseSensitive) {\n      if (typeof v === \"undefined\")\n        return Integer[0];\n      if (typeof radix !== \"undefined\")\n        return +radix === 10 && !alphabet ? parseValue(v) : parseBase(v, radix, alphabet, caseSensitive);\n      return parseValue(v);\n    }\n    function BigInteger2(value, sign) {\n      this.value = value;\n      this.sign = sign;\n      this.isSmall = false;\n    }\n    BigInteger2.prototype = Object.create(Integer.prototype);\n    function SmallInteger(value) {\n      this.value = value;\n      this.sign = value < 0;\n      this.isSmall = true;\n    }\n    SmallInteger.prototype = Object.create(Integer.prototype);\n    function NativeBigInt(value) {\n      this.value = value;\n    }\n    NativeBigInt.prototype = Object.create(Integer.prototype);\n    function isPrecise(n) {\n      return -MAX_INT < n && n < MAX_INT;\n    }\n    function smallToArray(n) {\n      if (n < 1e7)\n        return [n];\n      if (n < 1e14)\n        return [n % 1e7, Math.floor(n / 1e7)];\n      return [n % 1e7, Math.floor(n / 1e7) % 1e7, Math.floor(n / 1e14)];\n    }\n    function arrayToSmall(arr) {\n      trim(arr);\n      var length = arr.length;\n      if (length < 4 && compareAbs(arr, MAX_INT_ARR) < 0) {\n        switch (length) {\n          case 0:\n            return 0;\n          case 1:\n            return arr[0];\n          case 2:\n            return arr[0] + arr[1] * BASE2;\n          default:\n            return arr[0] + (arr[1] + arr[2] * BASE2) * BASE2;\n        }\n      }\n      return arr;\n    }\n    function trim(v) {\n      var i2 = v.length;\n      while (v[--i2] === 0)\n        ;\n      v.length = i2 + 1;\n    }\n    function createArray(length) {\n      var x = new Array(length);\n      var i2 = -1;\n      while (++i2 < length) {\n        x[i2] = 0;\n      }\n      return x;\n    }\n    function truncate2(n) {\n      if (n > 0)\n        return Math.floor(n);\n      return Math.ceil(n);\n    }\n    function add2(a, b) {\n      var l_a = a.length, l_b = b.length, r = new Array(l_a), carry = 0, base = BASE2, sum, i2;\n      for (i2 = 0; i2 < l_b; i2++) {\n        sum = a[i2] + b[i2] + carry;\n        carry = sum >= base ? 1 : 0;\n        r[i2] = sum - carry * base;\n      }\n      while (i2 < l_a) {\n        sum = a[i2] + carry;\n        carry = sum === base ? 1 : 0;\n        r[i2++] = sum - carry * base;\n      }\n      if (carry > 0)\n        r.push(carry);\n      return r;\n    }\n    function addAny(a, b) {\n      if (a.length >= b.length)\n        return add2(a, b);\n      return add2(b, a);\n    }\n    function addSmall(a, carry) {\n      var l = a.length, r = new Array(l), base = BASE2, sum, i2;\n      for (i2 = 0; i2 < l; i2++) {\n        sum = a[i2] - base + carry;\n        carry = Math.floor(sum / base);\n        r[i2] = sum - carry * base;\n        carry += 1;\n      }\n      while (carry > 0) {\n        r[i2++] = carry % base;\n        carry = Math.floor(carry / base);\n      }\n      return r;\n    }\n    BigInteger2.prototype.add = function(v) {\n      var n = parseValue(v);\n      if (this.sign !== n.sign) {\n        return this.subtract(n.negate());\n      }\n      var a = this.value, b = n.value;\n      if (n.isSmall) {\n        return new BigInteger2(addSmall(a, Math.abs(b)), this.sign);\n      }\n      return new BigInteger2(addAny(a, b), this.sign);\n    };\n    BigInteger2.prototype.plus = BigInteger2.prototype.add;\n    SmallInteger.prototype.add = function(v) {\n      var n = parseValue(v);\n      var a = this.value;\n      if (a < 0 !== n.sign) {\n        return this.subtract(n.negate());\n      }\n      var b = n.value;\n      if (n.isSmall) {\n        if (isPrecise(a + b))\n          return new SmallInteger(a + b);\n        b = smallToArray(Math.abs(b));\n      }\n      return new BigInteger2(addSmall(b, Math.abs(a)), a < 0);\n    };\n    SmallInteger.prototype.plus = SmallInteger.prototype.add;\n    NativeBigInt.prototype.add = function(v) {\n      return new NativeBigInt(this.value + parseValue(v).value);\n    };\n    NativeBigInt.prototype.plus = NativeBigInt.prototype.add;\n    function subtract2(a, b) {\n      var a_l = a.length, b_l = b.length, r = new Array(a_l), borrow = 0, base = BASE2, i2, difference;\n      for (i2 = 0; i2 < b_l; i2++) {\n        difference = a[i2] - borrow - b[i2];\n        if (difference < 0) {\n          difference += base;\n          borrow = 1;\n        } else\n          borrow = 0;\n        r[i2] = difference;\n      }\n      for (i2 = b_l; i2 < a_l; i2++) {\n        difference = a[i2] - borrow;\n        if (difference < 0)\n          difference += base;\n        else {\n          r[i2++] = difference;\n          break;\n        }\n        r[i2] = difference;\n      }\n      for (; i2 < a_l; i2++) {\n        r[i2] = a[i2];\n      }\n      trim(r);\n      return r;\n    }\n    function subtractAny(a, b, sign) {\n      var value;\n      if (compareAbs(a, b) >= 0) {\n        value = subtract2(a, b);\n      } else {\n        value = subtract2(b, a);\n        sign = !sign;\n      }\n      value = arrayToSmall(value);\n      if (typeof value === \"number\") {\n        if (sign)\n          value = -value;\n        return new SmallInteger(value);\n      }\n      return new BigInteger2(value, sign);\n    }\n    function subtractSmall(a, b, sign) {\n      var l = a.length, r = new Array(l), carry = -b, base = BASE2, i2, difference;\n      for (i2 = 0; i2 < l; i2++) {\n        difference = a[i2] + carry;\n        carry = Math.floor(difference / base);\n        difference %= base;\n        r[i2] = difference < 0 ? difference + base : difference;\n      }\n      r = arrayToSmall(r);\n      if (typeof r === \"number\") {\n        if (sign)\n          r = -r;\n        return new SmallInteger(r);\n      }\n      return new BigInteger2(r, sign);\n    }\n    BigInteger2.prototype.subtract = function(v) {\n      var n = parseValue(v);\n      if (this.sign !== n.sign) {\n        return this.add(n.negate());\n      }\n      var a = this.value, b = n.value;\n      if (n.isSmall)\n        return subtractSmall(a, Math.abs(b), this.sign);\n      return subtractAny(a, b, this.sign);\n    };\n    BigInteger2.prototype.minus = BigInteger2.prototype.subtract;\n    SmallInteger.prototype.subtract = function(v) {\n      var n = parseValue(v);\n      var a = this.value;\n      if (a < 0 !== n.sign) {\n        return this.add(n.negate());\n      }\n      var b = n.value;\n      if (n.isSmall) {\n        return new SmallInteger(a - b);\n      }\n      return subtractSmall(b, Math.abs(a), a >= 0);\n    };\n    SmallInteger.prototype.minus = SmallInteger.prototype.subtract;\n    NativeBigInt.prototype.subtract = function(v) {\n      return new NativeBigInt(this.value - parseValue(v).value);\n    };\n    NativeBigInt.prototype.minus = NativeBigInt.prototype.subtract;\n    BigInteger2.prototype.negate = function() {\n      return new BigInteger2(this.value, !this.sign);\n    };\n    SmallInteger.prototype.negate = function() {\n      var sign = this.sign;\n      var small = new SmallInteger(-this.value);\n      small.sign = !sign;\n      return small;\n    };\n    NativeBigInt.prototype.negate = function() {\n      return new NativeBigInt(-this.value);\n    };\n    BigInteger2.prototype.abs = function() {\n      return new BigInteger2(this.value, false);\n    };\n    SmallInteger.prototype.abs = function() {\n      return new SmallInteger(Math.abs(this.value));\n    };\n    NativeBigInt.prototype.abs = function() {\n      return new NativeBigInt(this.value >= 0 ? this.value : -this.value);\n    };\n    function multiplyLong(a, b) {\n      var a_l = a.length, b_l = b.length, l = a_l + b_l, r = createArray(l), base = BASE2, product, carry, i2, a_i, b_j;\n      for (i2 = 0; i2 < a_l; ++i2) {\n        a_i = a[i2];\n        for (var j = 0; j < b_l; ++j) {\n          b_j = b[j];\n          product = a_i * b_j + r[i2 + j];\n          carry = Math.floor(product / base);\n          r[i2 + j] = product - carry * base;\n          r[i2 + j + 1] += carry;\n        }\n      }\n      trim(r);\n      return r;\n    }\n    function multiplySmall(a, b) {\n      var l = a.length, r = new Array(l), base = BASE2, carry = 0, product, i2;\n      for (i2 = 0; i2 < l; i2++) {\n        product = a[i2] * b + carry;\n        carry = Math.floor(product / base);\n        r[i2] = product - carry * base;\n      }\n      while (carry > 0) {\n        r[i2++] = carry % base;\n        carry = Math.floor(carry / base);\n      }\n      return r;\n    }\n    function shiftLeft(x, n) {\n      var r = [];\n      while (n-- > 0)\n        r.push(0);\n      return r.concat(x);\n    }\n    function multiplyKaratsuba(x, y) {\n      var n = Math.max(x.length, y.length);\n      if (n <= 30)\n        return multiplyLong(x, y);\n      n = Math.ceil(n / 2);\n      var b = x.slice(n), a = x.slice(0, n), d = y.slice(n), c = y.slice(0, n);\n      var ac = multiplyKaratsuba(a, c), bd = multiplyKaratsuba(b, d), abcd = multiplyKaratsuba(addAny(a, b), addAny(c, d));\n      var product = addAny(addAny(ac, shiftLeft(subtract2(subtract2(abcd, ac), bd), n)), shiftLeft(bd, 2 * n));\n      trim(product);\n      return product;\n    }\n    function useKaratsuba(l1, l2) {\n      return -0.012 * l1 - 0.012 * l2 + 15e-6 * l1 * l2 > 0;\n    }\n    BigInteger2.prototype.multiply = function(v) {\n      var n = parseValue(v), a = this.value, b = n.value, sign = this.sign !== n.sign, abs;\n      if (n.isSmall) {\n        if (b === 0)\n          return Integer[0];\n        if (b === 1)\n          return this;\n        if (b === -1)\n          return this.negate();\n        abs = Math.abs(b);\n        if (abs < BASE2) {\n          return new BigInteger2(multiplySmall(a, abs), sign);\n        }\n        b = smallToArray(abs);\n      }\n      if (useKaratsuba(a.length, b.length))\n        return new BigInteger2(multiplyKaratsuba(a, b), sign);\n      return new BigInteger2(multiplyLong(a, b), sign);\n    };\n    BigInteger2.prototype.times = BigInteger2.prototype.multiply;\n    function multiplySmallAndArray(a, b, sign) {\n      if (a < BASE2) {\n        return new BigInteger2(multiplySmall(b, a), sign);\n      }\n      return new BigInteger2(multiplyLong(b, smallToArray(a)), sign);\n    }\n    SmallInteger.prototype._multiplyBySmall = function(a) {\n      if (isPrecise(a.value * this.value)) {\n        return new SmallInteger(a.value * this.value);\n      }\n      return multiplySmallAndArray(Math.abs(a.value), smallToArray(Math.abs(this.value)), this.sign !== a.sign);\n    };\n    BigInteger2.prototype._multiplyBySmall = function(a) {\n      if (a.value === 0)\n        return Integer[0];\n      if (a.value === 1)\n        return this;\n      if (a.value === -1)\n        return this.negate();\n      return multiplySmallAndArray(Math.abs(a.value), this.value, this.sign !== a.sign);\n    };\n    SmallInteger.prototype.multiply = function(v) {\n      return parseValue(v)._multiplyBySmall(this);\n    };\n    SmallInteger.prototype.times = SmallInteger.prototype.multiply;\n    NativeBigInt.prototype.multiply = function(v) {\n      return new NativeBigInt(this.value * parseValue(v).value);\n    };\n    NativeBigInt.prototype.times = NativeBigInt.prototype.multiply;\n    function square(a) {\n      var l = a.length, r = createArray(l + l), base = BASE2, product, carry, i2, a_i, a_j;\n      for (i2 = 0; i2 < l; i2++) {\n        a_i = a[i2];\n        carry = 0 - a_i * a_i;\n        for (var j = i2; j < l; j++) {\n          a_j = a[j];\n          product = 2 * (a_i * a_j) + r[i2 + j] + carry;\n          carry = Math.floor(product / base);\n          r[i2 + j] = product - carry * base;\n        }\n        r[i2 + l] = carry;\n      }\n      trim(r);\n      return r;\n    }\n    BigInteger2.prototype.square = function() {\n      return new BigInteger2(square(this.value), false);\n    };\n    SmallInteger.prototype.square = function() {\n      var value = this.value * this.value;\n      if (isPrecise(value))\n        return new SmallInteger(value);\n      return new BigInteger2(square(smallToArray(Math.abs(this.value))), false);\n    };\n    NativeBigInt.prototype.square = function(v) {\n      return new NativeBigInt(this.value * this.value);\n    };\n    function divMod1(a, b) {\n      var a_l = a.length, b_l = b.length, base = BASE2, result = createArray(b.length), divisorMostSignificantDigit = b[b_l - 1], lambda = Math.ceil(base / (2 * divisorMostSignificantDigit)), remainder = multiplySmall(a, lambda), divisor = multiplySmall(b, lambda), quotientDigit, shift, carry, borrow, i2, l, q;\n      if (remainder.length <= a_l)\n        remainder.push(0);\n      divisor.push(0);\n      divisorMostSignificantDigit = divisor[b_l - 1];\n      for (shift = a_l - b_l; shift >= 0; shift--) {\n        quotientDigit = base - 1;\n        if (remainder[shift + b_l] !== divisorMostSignificantDigit) {\n          quotientDigit = Math.floor((remainder[shift + b_l] * base + remainder[shift + b_l - 1]) / divisorMostSignificantDigit);\n        }\n        carry = 0;\n        borrow = 0;\n        l = divisor.length;\n        for (i2 = 0; i2 < l; i2++) {\n          carry += quotientDigit * divisor[i2];\n          q = Math.floor(carry / base);\n          borrow += remainder[shift + i2] - (carry - q * base);\n          carry = q;\n          if (borrow < 0) {\n            remainder[shift + i2] = borrow + base;\n            borrow = -1;\n          } else {\n            remainder[shift + i2] = borrow;\n            borrow = 0;\n          }\n        }\n        while (borrow !== 0) {\n          quotientDigit -= 1;\n          carry = 0;\n          for (i2 = 0; i2 < l; i2++) {\n            carry += remainder[shift + i2] - base + divisor[i2];\n            if (carry < 0) {\n              remainder[shift + i2] = carry + base;\n              carry = 0;\n            } else {\n              remainder[shift + i2] = carry;\n              carry = 1;\n            }\n          }\n          borrow += carry;\n        }\n        result[shift] = quotientDigit;\n      }\n      remainder = divModSmall(remainder, lambda)[0];\n      return [arrayToSmall(result), arrayToSmall(remainder)];\n    }\n    function divMod2(a, b) {\n      var a_l = a.length, b_l = b.length, result = [], part = [], base = BASE2, guess, xlen, highx, highy, check;\n      while (a_l) {\n        part.unshift(a[--a_l]);\n        trim(part);\n        if (compareAbs(part, b) < 0) {\n          result.push(0);\n          continue;\n        }\n        xlen = part.length;\n        highx = part[xlen - 1] * base + part[xlen - 2];\n        highy = b[b_l - 1] * base + b[b_l - 2];\n        if (xlen > b_l) {\n          highx = (highx + 1) * base;\n        }\n        guess = Math.ceil(highx / highy);\n        do {\n          check = multiplySmall(b, guess);\n          if (compareAbs(check, part) <= 0)\n            break;\n          guess--;\n        } while (guess);\n        result.push(guess);\n        part = subtract2(part, check);\n      }\n      result.reverse();\n      return [arrayToSmall(result), arrayToSmall(part)];\n    }\n    function divModSmall(value, lambda) {\n      var length = value.length, quotient = createArray(length), base = BASE2, i2, q, remainder, divisor;\n      remainder = 0;\n      for (i2 = length - 1; i2 >= 0; --i2) {\n        divisor = remainder * base + value[i2];\n        q = truncate2(divisor / lambda);\n        remainder = divisor - q * lambda;\n        quotient[i2] = q | 0;\n      }\n      return [quotient, remainder | 0];\n    }\n    function divModAny(self2, v) {\n      var value, n = parseValue(v);\n      if (supportsNativeBigInt) {\n        return [new NativeBigInt(self2.value / n.value), new NativeBigInt(self2.value % n.value)];\n      }\n      var a = self2.value, b = n.value;\n      var quotient;\n      if (b === 0)\n        throw new Error(\"Cannot divide by zero\");\n      if (self2.isSmall) {\n        if (n.isSmall) {\n          return [new SmallInteger(truncate2(a / b)), new SmallInteger(a % b)];\n        }\n        return [Integer[0], self2];\n      }\n      if (n.isSmall) {\n        if (b === 1)\n          return [self2, Integer[0]];\n        if (b == -1)\n          return [self2.negate(), Integer[0]];\n        var abs = Math.abs(b);\n        if (abs < BASE2) {\n          value = divModSmall(a, abs);\n          quotient = arrayToSmall(value[0]);\n          var remainder = value[1];\n          if (self2.sign)\n            remainder = -remainder;\n          if (typeof quotient === \"number\") {\n            if (self2.sign !== n.sign)\n              quotient = -quotient;\n            return [new SmallInteger(quotient), new SmallInteger(remainder)];\n          }\n          return [new BigInteger2(quotient, self2.sign !== n.sign), new SmallInteger(remainder)];\n        }\n        b = smallToArray(abs);\n      }\n      var comparison = compareAbs(a, b);\n      if (comparison === -1)\n        return [Integer[0], self2];\n      if (comparison === 0)\n        return [Integer[self2.sign === n.sign ? 1 : -1], Integer[0]];\n      if (a.length + b.length <= 200)\n        value = divMod1(a, b);\n      else\n        value = divMod2(a, b);\n      quotient = value[0];\n      var qSign = self2.sign !== n.sign, mod = value[1], mSign = self2.sign;\n      if (typeof quotient === \"number\") {\n        if (qSign)\n          quotient = -quotient;\n        quotient = new SmallInteger(quotient);\n      } else\n        quotient = new BigInteger2(quotient, qSign);\n      if (typeof mod === \"number\") {\n        if (mSign)\n          mod = -mod;\n        mod = new SmallInteger(mod);\n      } else\n        mod = new BigInteger2(mod, mSign);\n      return [quotient, mod];\n    }\n    BigInteger2.prototype.divmod = function(v) {\n      var result = divModAny(this, v);\n      return {\n        quotient: result[0],\n        remainder: result[1]\n      };\n    };\n    NativeBigInt.prototype.divmod = SmallInteger.prototype.divmod = BigInteger2.prototype.divmod;\n    BigInteger2.prototype.divide = function(v) {\n      return divModAny(this, v)[0];\n    };\n    NativeBigInt.prototype.over = NativeBigInt.prototype.divide = function(v) {\n      return new NativeBigInt(this.value / parseValue(v).value);\n    };\n    SmallInteger.prototype.over = SmallInteger.prototype.divide = BigInteger2.prototype.over = BigInteger2.prototype.divide;\n    BigInteger2.prototype.mod = function(v) {\n      return divModAny(this, v)[1];\n    };\n    NativeBigInt.prototype.mod = NativeBigInt.prototype.remainder = function(v) {\n      return new NativeBigInt(this.value % parseValue(v).value);\n    };\n    SmallInteger.prototype.remainder = SmallInteger.prototype.mod = BigInteger2.prototype.remainder = BigInteger2.prototype.mod;\n    BigInteger2.prototype.pow = function(v) {\n      var n = parseValue(v), a = this.value, b = n.value, value, x, y;\n      if (b === 0)\n        return Integer[1];\n      if (a === 0)\n        return Integer[0];\n      if (a === 1)\n        return Integer[1];\n      if (a === -1)\n        return n.isEven() ? Integer[1] : Integer[-1];\n      if (n.sign) {\n        return Integer[0];\n      }\n      if (!n.isSmall)\n        throw new Error(\"The exponent \" + n.toString() + \" is too large.\");\n      if (this.isSmall) {\n        if (isPrecise(value = Math.pow(a, b)))\n          return new SmallInteger(truncate2(value));\n      }\n      x = this;\n      y = Integer[1];\n      while (true) {\n        if (b & true) {\n          y = y.times(x);\n          --b;\n        }\n        if (b === 0)\n          break;\n        b /= 2;\n        x = x.square();\n      }\n      return y;\n    };\n    SmallInteger.prototype.pow = BigInteger2.prototype.pow;\n    NativeBigInt.prototype.pow = function(v) {\n      var n = parseValue(v);\n      var a = this.value, b = n.value;\n      var _0 = BigInt(0), _1 = BigInt(1), _2 = BigInt(2);\n      if (b === _0)\n        return Integer[1];\n      if (a === _0)\n        return Integer[0];\n      if (a === _1)\n        return Integer[1];\n      if (a === BigInt(-1))\n        return n.isEven() ? Integer[1] : Integer[-1];\n      if (n.isNegative())\n        return new NativeBigInt(_0);\n      var x = this;\n      var y = Integer[1];\n      while (true) {\n        if ((b & _1) === _1) {\n          y = y.times(x);\n          --b;\n        }\n        if (b === _0)\n          break;\n        b /= _2;\n        x = x.square();\n      }\n      return y;\n    };\n    BigInteger2.prototype.modPow = function(exp2, mod) {\n      exp2 = parseValue(exp2);\n      mod = parseValue(mod);\n      if (mod.isZero())\n        throw new Error(\"Cannot take modPow with modulus 0\");\n      var r = Integer[1], base = this.mod(mod);\n      if (exp2.isNegative()) {\n        exp2 = exp2.multiply(Integer[-1]);\n        base = base.modInv(mod);\n      }\n      while (exp2.isPositive()) {\n        if (base.isZero())\n          return Integer[0];\n        if (exp2.isOdd())\n          r = r.multiply(base).mod(mod);\n        exp2 = exp2.divide(2);\n        base = base.square().mod(mod);\n      }\n      return r;\n    };\n    NativeBigInt.prototype.modPow = SmallInteger.prototype.modPow = BigInteger2.prototype.modPow;\n    function compareAbs(a, b) {\n      if (a.length !== b.length) {\n        return a.length > b.length ? 1 : -1;\n      }\n      for (var i2 = a.length - 1; i2 >= 0; i2--) {\n        if (a[i2] !== b[i2])\n          return a[i2] > b[i2] ? 1 : -1;\n      }\n      return 0;\n    }\n    BigInteger2.prototype.compareAbs = function(v) {\n      var n = parseValue(v), a = this.value, b = n.value;\n      if (n.isSmall)\n        return 1;\n      return compareAbs(a, b);\n    };\n    SmallInteger.prototype.compareAbs = function(v) {\n      var n = parseValue(v), a = Math.abs(this.value), b = n.value;\n      if (n.isSmall) {\n        b = Math.abs(b);\n        return a === b ? 0 : a > b ? 1 : -1;\n      }\n      return -1;\n    };\n    NativeBigInt.prototype.compareAbs = function(v) {\n      var a = this.value;\n      var b = parseValue(v).value;\n      a = a >= 0 ? a : -a;\n      b = b >= 0 ? b : -b;\n      return a === b ? 0 : a > b ? 1 : -1;\n    };\n    BigInteger2.prototype.compare = function(v) {\n      if (v === Infinity) {\n        return -1;\n      }\n      if (v === -Infinity) {\n        return 1;\n      }\n      var n = parseValue(v), a = this.value, b = n.value;\n      if (this.sign !== n.sign) {\n        return n.sign ? 1 : -1;\n      }\n      if (n.isSmall) {\n        return this.sign ? -1 : 1;\n      }\n      return compareAbs(a, b) * (this.sign ? -1 : 1);\n    };\n    BigInteger2.prototype.compareTo = BigInteger2.prototype.compare;\n    SmallInteger.prototype.compare = function(v) {\n      if (v === Infinity) {\n        return -1;\n      }\n      if (v === -Infinity) {\n        return 1;\n      }\n      var n = parseValue(v), a = this.value, b = n.value;\n      if (n.isSmall) {\n        return a == b ? 0 : a > b ? 1 : -1;\n      }\n      if (a < 0 !== n.sign) {\n        return a < 0 ? -1 : 1;\n      }\n      return a < 0 ? 1 : -1;\n    };\n    SmallInteger.prototype.compareTo = SmallInteger.prototype.compare;\n    NativeBigInt.prototype.compare = function(v) {\n      if (v === Infinity) {\n        return -1;\n      }\n      if (v === -Infinity) {\n        return 1;\n      }\n      var a = this.value;\n      var b = parseValue(v).value;\n      return a === b ? 0 : a > b ? 1 : -1;\n    };\n    NativeBigInt.prototype.compareTo = NativeBigInt.prototype.compare;\n    BigInteger2.prototype.equals = function(v) {\n      return this.compare(v) === 0;\n    };\n    NativeBigInt.prototype.eq = NativeBigInt.prototype.equals = SmallInteger.prototype.eq = SmallInteger.prototype.equals = BigInteger2.prototype.eq = BigInteger2.prototype.equals;\n    BigInteger2.prototype.notEquals = function(v) {\n      return this.compare(v) !== 0;\n    };\n    NativeBigInt.prototype.neq = NativeBigInt.prototype.notEquals = SmallInteger.prototype.neq = SmallInteger.prototype.notEquals = BigInteger2.prototype.neq = BigInteger2.prototype.notEquals;\n    BigInteger2.prototype.greater = function(v) {\n      return this.compare(v) > 0;\n    };\n    NativeBigInt.prototype.gt = NativeBigInt.prototype.greater = SmallInteger.prototype.gt = SmallInteger.prototype.greater = BigInteger2.prototype.gt = BigInteger2.prototype.greater;\n    BigInteger2.prototype.lesser = function(v) {\n      return this.compare(v) < 0;\n    };\n    NativeBigInt.prototype.lt = NativeBigInt.prototype.lesser = SmallInteger.prototype.lt = SmallInteger.prototype.lesser = BigInteger2.prototype.lt = BigInteger2.prototype.lesser;\n    BigInteger2.prototype.greaterOrEquals = function(v) {\n      return this.compare(v) >= 0;\n    };\n    NativeBigInt.prototype.geq = NativeBigInt.prototype.greaterOrEquals = SmallInteger.prototype.geq = SmallInteger.prototype.greaterOrEquals = BigInteger2.prototype.geq = BigInteger2.prototype.greaterOrEquals;\n    BigInteger2.prototype.lesserOrEquals = function(v) {\n      return this.compare(v) <= 0;\n    };\n    NativeBigInt.prototype.leq = NativeBigInt.prototype.lesserOrEquals = SmallInteger.prototype.leq = SmallInteger.prototype.lesserOrEquals = BigInteger2.prototype.leq = BigInteger2.prototype.lesserOrEquals;\n    BigInteger2.prototype.isEven = function() {\n      return (this.value[0] & 1) === 0;\n    };\n    SmallInteger.prototype.isEven = function() {\n      return (this.value & 1) === 0;\n    };\n    NativeBigInt.prototype.isEven = function() {\n      return (this.value & BigInt(1)) === BigInt(0);\n    };\n    BigInteger2.prototype.isOdd = function() {\n      return (this.value[0] & 1) === 1;\n    };\n    SmallInteger.prototype.isOdd = function() {\n      return (this.value & 1) === 1;\n    };\n    NativeBigInt.prototype.isOdd = function() {\n      return (this.value & BigInt(1)) === BigInt(1);\n    };\n    BigInteger2.prototype.isPositive = function() {\n      return !this.sign;\n    };\n    SmallInteger.prototype.isPositive = function() {\n      return this.value > 0;\n    };\n    NativeBigInt.prototype.isPositive = SmallInteger.prototype.isPositive;\n    BigInteger2.prototype.isNegative = function() {\n      return this.sign;\n    };\n    SmallInteger.prototype.isNegative = function() {\n      return this.value < 0;\n    };\n    NativeBigInt.prototype.isNegative = SmallInteger.prototype.isNegative;\n    BigInteger2.prototype.isUnit = function() {\n      return false;\n    };\n    SmallInteger.prototype.isUnit = function() {\n      return Math.abs(this.value) === 1;\n    };\n    NativeBigInt.prototype.isUnit = function() {\n      return this.abs().value === BigInt(1);\n    };\n    BigInteger2.prototype.isZero = function() {\n      return false;\n    };\n    SmallInteger.prototype.isZero = function() {\n      return this.value === 0;\n    };\n    NativeBigInt.prototype.isZero = function() {\n      return this.value === BigInt(0);\n    };\n    BigInteger2.prototype.isDivisibleBy = function(v) {\n      var n = parseValue(v);\n      if (n.isZero())\n        return false;\n      if (n.isUnit())\n        return true;\n      if (n.compareAbs(2) === 0)\n        return this.isEven();\n      return this.mod(n).isZero();\n    };\n    NativeBigInt.prototype.isDivisibleBy = SmallInteger.prototype.isDivisibleBy = BigInteger2.prototype.isDivisibleBy;\n    function isBasicPrime(v) {\n      var n = v.abs();\n      if (n.isUnit())\n        return false;\n      if (n.equals(2) || n.equals(3) || n.equals(5))\n        return true;\n      if (n.isEven() || n.isDivisibleBy(3) || n.isDivisibleBy(5))\n        return false;\n      if (n.lesser(49))\n        return true;\n    }\n    function millerRabinTest(n, a) {\n      var nPrev = n.prev(), b = nPrev, r = 0, d, i2, x;\n      while (b.isEven())\n        b = b.divide(2), r++;\n      next:\n        for (i2 = 0; i2 < a.length; i2++) {\n          if (n.lesser(a[i2]))\n            continue;\n          x = bigInt2(a[i2]).modPow(b, n);\n          if (x.isUnit() || x.equals(nPrev))\n            continue;\n          for (d = r - 1; d != 0; d--) {\n            x = x.square().mod(n);\n            if (x.isUnit())\n              return false;\n            if (x.equals(nPrev))\n              continue next;\n          }\n          return false;\n        }\n      return true;\n    }\n    BigInteger2.prototype.isPrime = function(strict) {\n      var isPrime = isBasicPrime(this);\n      if (isPrime !== undefined$1)\n        return isPrime;\n      var n = this.abs();\n      var bits = n.bitLength();\n      if (bits <= 64)\n        return millerRabinTest(n, [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]);\n      var logN = Math.log(2) * bits.toJSNumber();\n      var t = Math.ceil(strict === true ? 2 * Math.pow(logN, 2) : logN);\n      for (var a = [], i2 = 0; i2 < t; i2++) {\n        a.push(bigInt2(i2 + 2));\n      }\n      return millerRabinTest(n, a);\n    };\n    NativeBigInt.prototype.isPrime = SmallInteger.prototype.isPrime = BigInteger2.prototype.isPrime;\n    BigInteger2.prototype.isProbablePrime = function(iterations, rng2) {\n      var isPrime = isBasicPrime(this);\n      if (isPrime !== undefined$1)\n        return isPrime;\n      var n = this.abs();\n      var t = iterations === undefined$1 ? 5 : iterations;\n      for (var a = [], i2 = 0; i2 < t; i2++) {\n        a.push(bigInt2.randBetween(2, n.minus(2), rng2));\n      }\n      return millerRabinTest(n, a);\n    };\n    NativeBigInt.prototype.isProbablePrime = SmallInteger.prototype.isProbablePrime = BigInteger2.prototype.isProbablePrime;\n    BigInteger2.prototype.modInv = function(n) {\n      var t = bigInt2.zero, newT = bigInt2.one, r = parseValue(n), newR = this.abs(), q, lastT, lastR;\n      while (!newR.isZero()) {\n        q = r.divide(newR);\n        lastT = t;\n        lastR = r;\n        t = newT;\n        r = newR;\n        newT = lastT.subtract(q.multiply(newT));\n        newR = lastR.subtract(q.multiply(newR));\n      }\n      if (!r.isUnit())\n        throw new Error(this.toString() + \" and \" + n.toString() + \" are not co-prime\");\n      if (t.compare(0) === -1) {\n        t = t.add(n);\n      }\n      if (this.isNegative()) {\n        return t.negate();\n      }\n      return t;\n    };\n    NativeBigInt.prototype.modInv = SmallInteger.prototype.modInv = BigInteger2.prototype.modInv;\n    BigInteger2.prototype.next = function() {\n      var value = this.value;\n      if (this.sign) {\n        return subtractSmall(value, 1, this.sign);\n      }\n      return new BigInteger2(addSmall(value, 1), this.sign);\n    };\n    SmallInteger.prototype.next = function() {\n      var value = this.value;\n      if (value + 1 < MAX_INT)\n        return new SmallInteger(value + 1);\n      return new BigInteger2(MAX_INT_ARR, false);\n    };\n    NativeBigInt.prototype.next = function() {\n      return new NativeBigInt(this.value + BigInt(1));\n    };\n    BigInteger2.prototype.prev = function() {\n      var value = this.value;\n      if (this.sign) {\n        return new BigInteger2(addSmall(value, 1), true);\n      }\n      return subtractSmall(value, 1, this.sign);\n    };\n    SmallInteger.prototype.prev = function() {\n      var value = this.value;\n      if (value - 1 > -MAX_INT)\n        return new SmallInteger(value - 1);\n      return new BigInteger2(MAX_INT_ARR, true);\n    };\n    NativeBigInt.prototype.prev = function() {\n      return new NativeBigInt(this.value - BigInt(1));\n    };\n    var powersOfTwo = [1];\n    while (2 * powersOfTwo[powersOfTwo.length - 1] <= BASE2)\n      powersOfTwo.push(2 * powersOfTwo[powersOfTwo.length - 1]);\n    var powers2Length = powersOfTwo.length, highestPower2 = powersOfTwo[powers2Length - 1];\n    function shift_isSmall(n) {\n      return Math.abs(n) <= BASE2;\n    }\n    BigInteger2.prototype.shiftLeft = function(v) {\n      var n = parseValue(v).toJSNumber();\n      if (!shift_isSmall(n)) {\n        throw new Error(String(n) + \" is too large for shifting.\");\n      }\n      if (n < 0)\n        return this.shiftRight(-n);\n      var result = this;\n      if (result.isZero())\n        return result;\n      while (n >= powers2Length) {\n        result = result.multiply(highestPower2);\n        n -= powers2Length - 1;\n      }\n      return result.multiply(powersOfTwo[n]);\n    };\n    NativeBigInt.prototype.shiftLeft = SmallInteger.prototype.shiftLeft = BigInteger2.prototype.shiftLeft;\n    BigInteger2.prototype.shiftRight = function(v) {\n      var remQuo;\n      var n = parseValue(v).toJSNumber();\n      if (!shift_isSmall(n)) {\n        throw new Error(String(n) + \" is too large for shifting.\");\n      }\n      if (n < 0)\n        return this.shiftLeft(-n);\n      var result = this;\n      while (n >= powers2Length) {\n        if (result.isZero() || result.isNegative() && result.isUnit())\n          return result;\n        remQuo = divModAny(result, highestPower2);\n        result = remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0];\n        n -= powers2Length - 1;\n      }\n      remQuo = divModAny(result, powersOfTwo[n]);\n      return remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0];\n    };\n    NativeBigInt.prototype.shiftRight = SmallInteger.prototype.shiftRight = BigInteger2.prototype.shiftRight;\n    function bitwise(x, y, fn) {\n      y = parseValue(y);\n      var xSign = x.isNegative(), ySign = y.isNegative();\n      var xRem = xSign ? x.not() : x, yRem = ySign ? y.not() : y;\n      var xDigit = 0, yDigit = 0;\n      var xDivMod = null, yDivMod = null;\n      var result = [];\n      while (!xRem.isZero() || !yRem.isZero()) {\n        xDivMod = divModAny(xRem, highestPower2);\n        xDigit = xDivMod[1].toJSNumber();\n        if (xSign) {\n          xDigit = highestPower2 - 1 - xDigit;\n        }\n        yDivMod = divModAny(yRem, highestPower2);\n        yDigit = yDivMod[1].toJSNumber();\n        if (ySign) {\n          yDigit = highestPower2 - 1 - yDigit;\n        }\n        xRem = xDivMod[0];\n        yRem = yDivMod[0];\n        result.push(fn(xDigit, yDigit));\n      }\n      var sum = fn(xSign ? 1 : 0, ySign ? 1 : 0) !== 0 ? bigInt2(-1) : bigInt2(0);\n      for (var i2 = result.length - 1; i2 >= 0; i2 -= 1) {\n        sum = sum.multiply(highestPower2).add(bigInt2(result[i2]));\n      }\n      return sum;\n    }\n    BigInteger2.prototype.not = function() {\n      return this.negate().prev();\n    };\n    NativeBigInt.prototype.not = SmallInteger.prototype.not = BigInteger2.prototype.not;\n    BigInteger2.prototype.and = function(n) {\n      return bitwise(this, n, function(a, b) {\n        return a & b;\n      });\n    };\n    NativeBigInt.prototype.and = SmallInteger.prototype.and = BigInteger2.prototype.and;\n    BigInteger2.prototype.or = function(n) {\n      return bitwise(this, n, function(a, b) {\n        return a | b;\n      });\n    };\n    NativeBigInt.prototype.or = SmallInteger.prototype.or = BigInteger2.prototype.or;\n    BigInteger2.prototype.xor = function(n) {\n      return bitwise(this, n, function(a, b) {\n        return a ^ b;\n      });\n    };\n    NativeBigInt.prototype.xor = SmallInteger.prototype.xor = BigInteger2.prototype.xor;\n    var LOBMASK_I = 1 << 30, LOBMASK_BI = (BASE2 & -BASE2) * (BASE2 & -BASE2) | LOBMASK_I;\n    function roughLOB(n) {\n      var v = n.value, x = typeof v === \"number\" ? v | LOBMASK_I : typeof v === \"bigint\" ? v | BigInt(LOBMASK_I) : v[0] + v[1] * BASE2 | LOBMASK_BI;\n      return x & -x;\n    }\n    function integerLogarithm(value, base) {\n      if (base.compareTo(value) <= 0) {\n        var tmp = integerLogarithm(value, base.square(base));\n        var p = tmp.p;\n        var e = tmp.e;\n        var t = p.multiply(base);\n        return t.compareTo(value) <= 0 ? {p: t, e: e * 2 + 1} : {p, e: e * 2};\n      }\n      return {p: bigInt2(1), e: 0};\n    }\n    BigInteger2.prototype.bitLength = function() {\n      var n = this;\n      if (n.compareTo(bigInt2(0)) < 0) {\n        n = n.negate().subtract(bigInt2(1));\n      }\n      if (n.compareTo(bigInt2(0)) === 0) {\n        return bigInt2(0);\n      }\n      return bigInt2(integerLogarithm(n, bigInt2(2)).e).add(bigInt2(1));\n    };\n    NativeBigInt.prototype.bitLength = SmallInteger.prototype.bitLength = BigInteger2.prototype.bitLength;\n    function max(a, b) {\n      a = parseValue(a);\n      b = parseValue(b);\n      return a.greater(b) ? a : b;\n    }\n    function min(a, b) {\n      a = parseValue(a);\n      b = parseValue(b);\n      return a.lesser(b) ? a : b;\n    }\n    function gcd(a, b) {\n      a = parseValue(a).abs();\n      b = parseValue(b).abs();\n      if (a.equals(b))\n        return a;\n      if (a.isZero())\n        return b;\n      if (b.isZero())\n        return a;\n      var c = Integer[1], d, t;\n      while (a.isEven() && b.isEven()) {\n        d = min(roughLOB(a), roughLOB(b));\n        a = a.divide(d);\n        b = b.divide(d);\n        c = c.multiply(d);\n      }\n      while (a.isEven()) {\n        a = a.divide(roughLOB(a));\n      }\n      do {\n        while (b.isEven()) {\n          b = b.divide(roughLOB(b));\n        }\n        if (a.greater(b)) {\n          t = b;\n          b = a;\n          a = t;\n        }\n        b = b.subtract(a);\n      } while (!b.isZero());\n      return c.isUnit() ? a : a.multiply(c);\n    }\n    function lcm(a, b) {\n      a = parseValue(a).abs();\n      b = parseValue(b).abs();\n      return a.divide(gcd(a, b)).multiply(b);\n    }\n    function randBetween(a, b, rng2) {\n      a = parseValue(a);\n      b = parseValue(b);\n      var usedRNG = rng2 || Math.random;\n      var low = min(a, b), high = max(a, b);\n      var range = high.subtract(low).add(1);\n      if (range.isSmall)\n        return low.add(Math.floor(usedRNG() * range));\n      var digits = toBase(range, BASE2).value;\n      var result = [], restricted = true;\n      for (var i2 = 0; i2 < digits.length; i2++) {\n        var top = restricted ? digits[i2] : BASE2;\n        var digit = truncate2(usedRNG() * top);\n        result.push(digit);\n        if (digit < top)\n          restricted = false;\n      }\n      return low.add(Integer.fromArray(result, BASE2, false));\n    }\n    var parseBase = function(text, base, alphabet, caseSensitive) {\n      alphabet = alphabet || DEFAULT_ALPHABET;\n      text = String(text);\n      if (!caseSensitive) {\n        text = text.toLowerCase();\n        alphabet = alphabet.toLowerCase();\n      }\n      var length = text.length;\n      var i2;\n      var absBase = Math.abs(base);\n      var alphabetValues = {};\n      for (i2 = 0; i2 < alphabet.length; i2++) {\n        alphabetValues[alphabet[i2]] = i2;\n      }\n      for (i2 = 0; i2 < length; i2++) {\n        var c = text[i2];\n        if (c === \"-\")\n          continue;\n        if (c in alphabetValues) {\n          if (alphabetValues[c] >= absBase) {\n            if (c === \"1\" && absBase === 1)\n              continue;\n            throw new Error(c + \" is not a valid digit in base \" + base + \".\");\n          }\n        }\n      }\n      base = parseValue(base);\n      var digits = [];\n      var isNegative = text[0] === \"-\";\n      for (i2 = isNegative ? 1 : 0; i2 < text.length; i2++) {\n        var c = text[i2];\n        if (c in alphabetValues)\n          digits.push(parseValue(alphabetValues[c]));\n        else if (c === \"<\") {\n          var start = i2;\n          do {\n            i2++;\n          } while (text[i2] !== \">\" && i2 < text.length);\n          digits.push(parseValue(text.slice(start + 1, i2)));\n        } else\n          throw new Error(c + \" is not a valid character\");\n      }\n      return parseBaseFromArray(digits, base, isNegative);\n    };\n    function parseBaseFromArray(digits, base, isNegative) {\n      var val = Integer[0], pow = Integer[1], i2;\n      for (i2 = digits.length - 1; i2 >= 0; i2--) {\n        val = val.add(digits[i2].times(pow));\n        pow = pow.times(base);\n      }\n      return isNegative ? val.negate() : val;\n    }\n    function stringify(digit, alphabet) {\n      alphabet = alphabet || DEFAULT_ALPHABET;\n      if (digit < alphabet.length) {\n        return alphabet[digit];\n      }\n      return \"<\" + digit + \">\";\n    }\n    function toBase(n, base) {\n      base = bigInt2(base);\n      if (base.isZero()) {\n        if (n.isZero())\n          return {value: [0], isNegative: false};\n        throw new Error(\"Cannot convert nonzero numbers to base 0.\");\n      }\n      if (base.equals(-1)) {\n        if (n.isZero())\n          return {value: [0], isNegative: false};\n        if (n.isNegative())\n          return {\n            value: [].concat.apply([], Array.apply(null, Array(-n.toJSNumber())).map(Array.prototype.valueOf, [1, 0])),\n            isNegative: false\n          };\n        var arr = Array.apply(null, Array(n.toJSNumber() - 1)).map(Array.prototype.valueOf, [0, 1]);\n        arr.unshift([1]);\n        return {\n          value: [].concat.apply([], arr),\n          isNegative: false\n        };\n      }\n      var neg = false;\n      if (n.isNegative() && base.isPositive()) {\n        neg = true;\n        n = n.abs();\n      }\n      if (base.isUnit()) {\n        if (n.isZero())\n          return {value: [0], isNegative: false};\n        return {\n          value: Array.apply(null, Array(n.toJSNumber())).map(Number.prototype.valueOf, 1),\n          isNegative: neg\n        };\n      }\n      var out = [];\n      var left = n, divmod;\n      while (left.isNegative() || left.compareAbs(base) >= 0) {\n        divmod = left.divmod(base);\n        left = divmod.quotient;\n        var digit = divmod.remainder;\n        if (digit.isNegative()) {\n          digit = base.minus(digit).abs();\n          left = left.next();\n        }\n        out.push(digit.toJSNumber());\n      }\n      out.push(left.toJSNumber());\n      return {value: out.reverse(), isNegative: neg};\n    }\n    function toBaseString(n, base, alphabet) {\n      var arr = toBase(n, base);\n      return (arr.isNegative ? \"-\" : \"\") + arr.value.map(function(x) {\n        return stringify(x, alphabet);\n      }).join(\"\");\n    }\n    BigInteger2.prototype.toArray = function(radix) {\n      return toBase(this, radix);\n    };\n    SmallInteger.prototype.toArray = function(radix) {\n      return toBase(this, radix);\n    };\n    NativeBigInt.prototype.toArray = function(radix) {\n      return toBase(this, radix);\n    };\n    BigInteger2.prototype.toString = function(radix, alphabet) {\n      if (radix === undefined$1)\n        radix = 10;\n      if (radix !== 10)\n        return toBaseString(this, radix, alphabet);\n      var v = this.value, l = v.length, str = String(v[--l]), zeros = \"0000000\", digit;\n      while (--l >= 0) {\n        digit = String(v[l]);\n        str += zeros.slice(digit.length) + digit;\n      }\n      var sign = this.sign ? \"-\" : \"\";\n      return sign + str;\n    };\n    SmallInteger.prototype.toString = function(radix, alphabet) {\n      if (radix === undefined$1)\n        radix = 10;\n      if (radix != 10)\n        return toBaseString(this, radix, alphabet);\n      return String(this.value);\n    };\n    NativeBigInt.prototype.toString = SmallInteger.prototype.toString;\n    NativeBigInt.prototype.toJSON = BigInteger2.prototype.toJSON = SmallInteger.prototype.toJSON = function() {\n      return this.toString();\n    };\n    BigInteger2.prototype.valueOf = function() {\n      return parseInt(this.toString(), 10);\n    };\n    BigInteger2.prototype.toJSNumber = BigInteger2.prototype.valueOf;\n    SmallInteger.prototype.valueOf = function() {\n      return this.value;\n    };\n    SmallInteger.prototype.toJSNumber = SmallInteger.prototype.valueOf;\n    NativeBigInt.prototype.valueOf = NativeBigInt.prototype.toJSNumber = function() {\n      return parseInt(this.toString(), 10);\n    };\n    function parseStringValue(v) {\n      if (isPrecise(+v)) {\n        var x = +v;\n        if (x === truncate2(x))\n          return supportsNativeBigInt ? new NativeBigInt(BigInt(x)) : new SmallInteger(x);\n        throw new Error(\"Invalid integer: \" + v);\n      }\n      var sign = v[0] === \"-\";\n      if (sign)\n        v = v.slice(1);\n      var split = v.split(/e/i);\n      if (split.length > 2)\n        throw new Error(\"Invalid integer: \" + split.join(\"e\"));\n      if (split.length === 2) {\n        var exp2 = split[1];\n        if (exp2[0] === \"+\")\n          exp2 = exp2.slice(1);\n        exp2 = +exp2;\n        if (exp2 !== truncate2(exp2) || !isPrecise(exp2))\n          throw new Error(\"Invalid integer: \" + exp2 + \" is not a valid exponent.\");\n        var text = split[0];\n        var decimalPlace = text.indexOf(\".\");\n        if (decimalPlace >= 0) {\n          exp2 -= text.length - decimalPlace - 1;\n          text = text.slice(0, decimalPlace) + text.slice(decimalPlace + 1);\n        }\n        if (exp2 < 0)\n          throw new Error(\"Cannot include negative exponent part for integers\");\n        text += new Array(exp2 + 1).join(\"0\");\n        v = text;\n      }\n      var isValid2 = /^([0-9][0-9]*)$/.test(v);\n      if (!isValid2)\n        throw new Error(\"Invalid integer: \" + v);\n      if (supportsNativeBigInt) {\n        return new NativeBigInt(BigInt(sign ? \"-\" + v : v));\n      }\n      var r = [], max2 = v.length, l = LOG_BASE2, min2 = max2 - l;\n      while (max2 > 0) {\n        r.push(+v.slice(min2, max2));\n        min2 -= l;\n        if (min2 < 0)\n          min2 = 0;\n        max2 -= l;\n      }\n      trim(r);\n      return new BigInteger2(r, sign);\n    }\n    function parseNumberValue(v) {\n      if (supportsNativeBigInt) {\n        return new NativeBigInt(BigInt(v));\n      }\n      if (isPrecise(v)) {\n        if (v !== truncate2(v))\n          throw new Error(v + \" is not an integer.\");\n        return new SmallInteger(v);\n      }\n      return parseStringValue(v.toString());\n    }\n    function parseValue(v) {\n      if (typeof v === \"number\") {\n        return parseNumberValue(v);\n      }\n      if (typeof v === \"string\") {\n        return parseStringValue(v);\n      }\n      if (typeof v === \"bigint\") {\n        return new NativeBigInt(v);\n      }\n      return v;\n    }\n    for (var i = 0; i < 1e3; i++) {\n      Integer[i] = parseValue(i);\n      if (i > 0)\n        Integer[-i] = parseValue(-i);\n    }\n    Integer.one = Integer[1];\n    Integer.zero = Integer[0];\n    Integer.minusOne = Integer[-1];\n    Integer.max = max;\n    Integer.min = min;\n    Integer.gcd = gcd;\n    Integer.lcm = lcm;\n    Integer.isInstance = function(x) {\n      return x instanceof BigInteger2 || x instanceof SmallInteger || x instanceof NativeBigInt;\n    };\n    Integer.randBetween = randBetween;\n    Integer.fromArray = function(digits, base, isNegative) {\n      return parseBaseFromArray(digits.map(parseValue), parseValue(base || 10), isNegative);\n    };\n    return Integer;\n  }();\n  if (module.hasOwnProperty(\"exports\")) {\n    module.exports = bigInt2;\n  }\n})(BigInteger);\nvar BigIntegerExports = BigInteger.exports;\nvar bigInt = /* @__PURE__ */ getDefaultExportFromCjs(BigIntegerExports);\nconst MAX_BIG_INT = 64;\nconst SMALL_INT = 16;\nconst PARTS = MAX_BIG_INT / SMALL_INT;\nfunction checkBrowserSupportsBigInt() {\n  try {\n    BigInt;\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\nfunction fromHexReverseArray(hexValues, start, size) {\n  let value = 0;\n  for (let i = 0; i < size; i++) {\n    const byte = hexValues[start + i];\n    if (byte === void 0) {\n      break;\n    }\n    value += byte * 16 ** i;\n  }\n  return value;\n}\nfunction toHexReverseArray(value) {\n  const sum = [];\n  for (let i = 0; i < value.length; i++) {\n    let s = Number(value[i]);\n    for (let j = 0; s || j < sum.length; j++) {\n      s += (sum[j] || 0) * 10;\n      sum[j] = s % 16;\n      s = (s - sum[j]) / 16;\n    }\n  }\n  return sum;\n}\nfunction splitBigInt(value) {\n  const sum = toHexReverseArray(value);\n  const parts = Array(PARTS);\n  for (let i = 0; i < PARTS; i++) {\n    parts[PARTS - 1 - i] = fromHexReverseArray(sum, i * PARTS, PARTS);\n  }\n  return parts;\n}\nclass HighLow {\n  static fromString(value) {\n    return new HighLow(splitBigInt(value), value);\n  }\n  static fromBit(index) {\n    const parts = Array(PARTS);\n    const offset = Math.floor(index / SMALL_INT);\n    for (let i = 0; i < PARTS; i++) {\n      parts[PARTS - 1 - i] = i === offset ? 1 << index - offset * SMALL_INT : 0;\n    }\n    return new HighLow(parts);\n  }\n  constructor(parts, str) {\n    this.parts = parts;\n    this.str = str;\n  }\n  and({parts}) {\n    return new HighLow(this.parts.map((v, i) => v & parts[i]));\n  }\n  or({parts}) {\n    return new HighLow(this.parts.map((v, i) => v | parts[i]));\n  }\n  xor({parts}) {\n    return new HighLow(this.parts.map((v, i) => v ^ parts[i]));\n  }\n  not() {\n    return new HighLow(this.parts.map((v) => ~v));\n  }\n  equals({parts}) {\n    return this.parts.every((v, i) => v === parts[i]);\n  }\n  toString() {\n    if (this.str != null) {\n      return this.str;\n    }\n    const array = new Array(MAX_BIG_INT / 4);\n    this.parts.forEach((value, offset) => {\n      const hex = toHexReverseArray(value.toString());\n      for (let i = 0; i < 4; i++) {\n        array[i + offset * 4] = hex[4 - 1 - i] || 0;\n      }\n    });\n    return this.str = bigInt.fromArray(array, 16).toString();\n  }\n  toJSON() {\n    return this.toString();\n  }\n}\nconst SUPPORTS_BIGINT = checkBrowserSupportsBigInt();\nif (SUPPORTS_BIGINT && BigInt.prototype.toJSON == null) {\n  BigInt.prototype.toJSON = function() {\n    return this.toString();\n  };\n}\nconst HIGH_LOW_CACHE = {};\nconst convertToBigFlag = SUPPORTS_BIGINT ? function convertToBigFlagBigInt(value) {\n  return BigInt(value);\n} : function convertToBigFlagHighLow(value) {\n  if (value instanceof HighLow) {\n    return value;\n  }\n  if (typeof value === \"number\") {\n    value = value.toString();\n  }\n  if (HIGH_LOW_CACHE[value] != null) {\n    return HIGH_LOW_CACHE[value];\n  }\n  HIGH_LOW_CACHE[value] = HighLow.fromString(value);\n  return HIGH_LOW_CACHE[value];\n};\nconst EMPTY_FLAG = convertToBigFlag(0);\nconst flagAnd = SUPPORTS_BIGINT ? function flagAndBigInt(first = EMPTY_FLAG, second = EMPTY_FLAG) {\n  return first & second;\n} : function flagAndHighLow(first = EMPTY_FLAG, second = EMPTY_FLAG) {\n  return first.and(second);\n};\nconst flagOr = SUPPORTS_BIGINT ? function flagOrBigInt(first = EMPTY_FLAG, second = EMPTY_FLAG) {\n  return first | second;\n} : function flagOrHighLow(first = EMPTY_FLAG, second = EMPTY_FLAG) {\n  return first.or(second);\n};\nconst flagXor = SUPPORTS_BIGINT ? function flagXorBigInt(first = EMPTY_FLAG, second = EMPTY_FLAG) {\n  return first ^ second;\n} : function flagXorHighLow(first = EMPTY_FLAG, second = EMPTY_FLAG) {\n  return first.xor(second);\n};\nconst flagNot = SUPPORTS_BIGINT ? function flagNotBigInt(first = EMPTY_FLAG) {\n  return ~first;\n} : function flagNotHighLow(first = EMPTY_FLAG) {\n  return first.not();\n};\nconst flagEquals = SUPPORTS_BIGINT ? function flagEqualsBigInt(first, second) {\n  return first === second;\n} : function flagEqualsHighLow(first, second) {\n  if (first == null || second == null) {\n    return first == second;\n  }\n  return first.equals(second);\n};\nfunction flagOrMultiple(...flags) {\n  let result = flags[0];\n  for (let i = 1; i < flags.length; i++) {\n    result = flagOr(result, flags[i]);\n  }\n  return result;\n}\nfunction flagHas(base, flag) {\n  return flagEquals(flagAnd(base, flag), flag);\n}\nfunction flagHasAny(base, flag) {\n  return !flagEquals(flagAnd(base, flag), EMPTY_FLAG);\n}\nfunction flagAdd(base, flag) {\n  return flag === EMPTY_FLAG ? base : flagOr(base, flag);\n}\nfunction flagRemove(base, flag) {\n  return flag === EMPTY_FLAG ? base : flagXor(base, flagAnd(base, flag));\n}\nconst getFlag = SUPPORTS_BIGINT ? function getFlagBigInt(index) {\n  return BigInt(1) << BigInt(index);\n} : function getFlagHighLow(index) {\n  return HighLow.fromBit(index);\n};\nvar BigFlagUtils = {\n  combine: flagOrMultiple,\n  add: flagAdd,\n  remove: flagRemove,\n  filter: flagAnd,\n  invert: flagNot,\n  has: flagHas,\n  hasAny: flagHasAny,\n  equals: flagEquals,\n  deserialize: convertToBigFlag,\n  getFlag\n};\nvar RPCCloseCodes;\n(function(RPCCloseCodes2) {\n  RPCCloseCodes2[RPCCloseCodes2[\"CLOSE_NORMAL\"] = 1e3] = \"CLOSE_NORMAL\";\n  RPCCloseCodes2[RPCCloseCodes2[\"CLOSE_UNSUPPORTED\"] = 1003] = \"CLOSE_UNSUPPORTED\";\n  RPCCloseCodes2[RPCCloseCodes2[\"CLOSE_ABNORMAL\"] = 1006] = \"CLOSE_ABNORMAL\";\n  RPCCloseCodes2[RPCCloseCodes2[\"INVALID_CLIENTID\"] = 4e3] = \"INVALID_CLIENTID\";\n  RPCCloseCodes2[RPCCloseCodes2[\"INVALID_ORIGIN\"] = 4001] = \"INVALID_ORIGIN\";\n  RPCCloseCodes2[RPCCloseCodes2[\"RATELIMITED\"] = 4002] = \"RATELIMITED\";\n  RPCCloseCodes2[RPCCloseCodes2[\"TOKEN_REVOKED\"] = 4003] = \"TOKEN_REVOKED\";\n  RPCCloseCodes2[RPCCloseCodes2[\"INVALID_VERSION\"] = 4004] = \"INVALID_VERSION\";\n  RPCCloseCodes2[RPCCloseCodes2[\"INVALID_ENCODING\"] = 4005] = \"INVALID_ENCODING\";\n})(RPCCloseCodes || (RPCCloseCodes = {}));\nvar RPCErrorCodes;\n(function(RPCErrorCodes2) {\n  RPCErrorCodes2[RPCErrorCodes2[\"INVALID_PAYLOAD\"] = 4e3] = \"INVALID_PAYLOAD\";\n  RPCErrorCodes2[RPCErrorCodes2[\"INVALID_COMMAND\"] = 4002] = \"INVALID_COMMAND\";\n  RPCErrorCodes2[RPCErrorCodes2[\"INVALID_EVENT\"] = 4004] = \"INVALID_EVENT\";\n  RPCErrorCodes2[RPCErrorCodes2[\"INVALID_PERMISSIONS\"] = 4006] = \"INVALID_PERMISSIONS\";\n})(RPCErrorCodes || (RPCErrorCodes = {}));\nvar Orientation;\n(function(Orientation2) {\n  Orientation2[\"LANDSCAPE\"] = \"landscape\";\n  Orientation2[\"PORTRAIT\"] = \"portrait\";\n})(Orientation || (Orientation = {}));\nvar Platform;\n(function(Platform2) {\n  Platform2[\"MOBILE\"] = \"mobile\";\n  Platform2[\"DESKTOP\"] = \"desktop\";\n})(Platform || (Platform = {}));\nconst Permissions = Object.freeze({\n  CREATE_INSTANT_INVITE: BigFlagUtils.getFlag(0),\n  ADMINISTRATOR: BigFlagUtils.getFlag(3)\n});\nfunction zodCoerceUnhandledValue(inputObject) {\n  return preprocessType((arg) => {\n    var _a;\n    const [objectKey] = (_a = Object.entries(inputObject).find(([, value]) => value === arg)) !== null && _a !== void 0 ? _a : [];\n    if (arg != null && objectKey === void 0) {\n      return inputObject.UNHANDLED;\n    }\n    return arg;\n  }, stringType().or(numberType()));\n}\nfunction fallbackToDefault(schema) {\n  const transform2 = custom().transform((data) => {\n    const res = schema.safeParse(data);\n    if (res.success) {\n      return res.data;\n    }\n    return schema._def.defaultValue();\n  });\n  transform2.overlayType = schema;\n  return transform2;\n}\nconst InitiateImageUploadResponseSchema = z.object({image_url: z.string()});\nconst OpenShareMomentDialogRequestSchema = z.object({mediaUrl: z.string().max(1024)});\nconst AuthenticateRequestSchema = z.object({access_token: z.union([z.string(), z.null()]).optional()});\nconst AuthenticateResponseSchema = z.object({\n  access_token: z.string(),\n  user: z.object({\n    username: z.string(),\n    discriminator: z.string(),\n    id: z.string(),\n    avatar: z.union([z.string(), z.null()]).optional(),\n    public_flags: z.number(),\n    global_name: z.union([z.string(), z.null()]).optional()\n  }),\n  scopes: z.array(fallbackToDefault(z.enum([\n    \"identify\",\n    \"email\",\n    \"connections\",\n    \"guilds\",\n    \"guilds.join\",\n    \"guilds.members.read\",\n    \"gdm.join\",\n    \"rpc\",\n    \"rpc.notifications.read\",\n    \"rpc.voice.read\",\n    \"rpc.voice.write\",\n    \"rpc.video.read\",\n    \"rpc.video.write\",\n    \"rpc.screenshare.read\",\n    \"rpc.screenshare.write\",\n    \"rpc.activities.write\",\n    \"bot\",\n    \"webhook.incoming\",\n    \"messages.read\",\n    \"applications.builds.upload\",\n    \"applications.builds.read\",\n    \"applications.commands\",\n    \"applications.commands.update\",\n    \"applications.commands.permissions.update\",\n    \"applications.store.update\",\n    \"applications.entitlements\",\n    \"activities.read\",\n    \"activities.write\",\n    \"relationships.read\",\n    \"voice\",\n    \"dm_channels.read\",\n    \"role_connections.write\"\n  ]).or(z.literal(-1)).default(-1))),\n  expires: z.string(),\n  application: z.object({\n    description: z.string(),\n    icon: z.union([z.string(), z.null()]).optional(),\n    id: z.string(),\n    rpc_origins: z.array(z.string()).optional(),\n    name: z.string()\n  })\n});\nconst GetActivityInstanceConnectedParticipantsResponseSchema = z.object({\n  participants: z.array(z.object({\n    id: z.string(),\n    username: z.string(),\n    global_name: z.union([z.string(), z.null()]).optional(),\n    discriminator: z.string(),\n    avatar: z.union([z.string(), z.null()]).optional(),\n    flags: z.number(),\n    bot: z.boolean(),\n    avatar_decoration_data: z.union([z.object({asset: z.string(), skuId: z.string().optional()}), z.null()]).optional(),\n    premium_type: z.union([z.number(), z.null()]).optional(),\n    nickname: z.string().optional()\n  }))\n});\nvar Command;\n(function(Command2) {\n  Command2[\"INITIATE_IMAGE_UPLOAD\"] = \"INITIATE_IMAGE_UPLOAD\";\n  Command2[\"OPEN_SHARE_MOMENT_DIALOG\"] = \"OPEN_SHARE_MOMENT_DIALOG\";\n  Command2[\"AUTHENTICATE\"] = \"AUTHENTICATE\";\n  Command2[\"GET_ACTIVITY_INSTANCE_CONNECTED_PARTICIPANTS\"] = \"GET_ACTIVITY_INSTANCE_CONNECTED_PARTICIPANTS\";\n})(Command || (Command = {}));\nconst emptyResponseSchema = z.object({}).optional().nullable();\nconst emptyRequestSchema = z.void();\nconst Schemas = {\n  [Command.INITIATE_IMAGE_UPLOAD]: {\n    request: emptyRequestSchema,\n    response: InitiateImageUploadResponseSchema\n  },\n  [Command.OPEN_SHARE_MOMENT_DIALOG]: {\n    request: OpenShareMomentDialogRequestSchema,\n    response: emptyResponseSchema\n  },\n  [Command.AUTHENTICATE]: {\n    request: AuthenticateRequestSchema,\n    response: AuthenticateResponseSchema\n  },\n  [Command.GET_ACTIVITY_INSTANCE_CONNECTED_PARTICIPANTS]: {\n    request: emptyRequestSchema,\n    response: GetActivityInstanceConnectedParticipantsResponseSchema\n  }\n};\nconst DISPATCH = \"DISPATCH\";\nvar Commands;\n(function(Commands2) {\n  Commands2[\"AUTHORIZE\"] = \"AUTHORIZE\";\n  Commands2[\"AUTHENTICATE\"] = \"AUTHENTICATE\";\n  Commands2[\"GET_GUILDS\"] = \"GET_GUILDS\";\n  Commands2[\"GET_GUILD\"] = \"GET_GUILD\";\n  Commands2[\"GET_CHANNEL\"] = \"GET_CHANNEL\";\n  Commands2[\"GET_CHANNELS\"] = \"GET_CHANNELS\";\n  Commands2[\"SELECT_VOICE_CHANNEL\"] = \"SELECT_VOICE_CHANNEL\";\n  Commands2[\"SELECT_TEXT_CHANNEL\"] = \"SELECT_TEXT_CHANNEL\";\n  Commands2[\"SUBSCRIBE\"] = \"SUBSCRIBE\";\n  Commands2[\"UNSUBSCRIBE\"] = \"UNSUBSCRIBE\";\n  Commands2[\"CAPTURE_SHORTCUT\"] = \"CAPTURE_SHORTCUT\";\n  Commands2[\"SET_CERTIFIED_DEVICES\"] = \"SET_CERTIFIED_DEVICES\";\n  Commands2[\"SET_ACTIVITY\"] = \"SET_ACTIVITY\";\n  Commands2[\"GET_SKUS\"] = \"GET_SKUS\";\n  Commands2[\"GET_ENTITLEMENTS\"] = \"GET_ENTITLEMENTS\";\n  Commands2[\"GET_SKUS_EMBEDDED\"] = \"GET_SKUS_EMBEDDED\";\n  Commands2[\"GET_ENTITLEMENTS_EMBEDDED\"] = \"GET_ENTITLEMENTS_EMBEDDED\";\n  Commands2[\"START_PURCHASE\"] = \"START_PURCHASE\";\n  Commands2[\"SET_CONFIG\"] = \"SET_CONFIG\";\n  Commands2[\"SEND_ANALYTICS_EVENT\"] = \"SEND_ANALYTICS_EVENT\";\n  Commands2[\"USER_SETTINGS_GET_LOCALE\"] = \"USER_SETTINGS_GET_LOCALE\";\n  Commands2[\"OPEN_EXTERNAL_LINK\"] = \"OPEN_EXTERNAL_LINK\";\n  Commands2[\"ENCOURAGE_HW_ACCELERATION\"] = \"ENCOURAGE_HW_ACCELERATION\";\n  Commands2[\"CAPTURE_LOG\"] = \"CAPTURE_LOG\";\n  Commands2[\"SET_ORIENTATION_LOCK_STATE\"] = \"SET_ORIENTATION_LOCK_STATE\";\n  Commands2[\"OPEN_INVITE_DIALOG\"] = \"OPEN_INVITE_DIALOG\";\n  Commands2[\"GET_PLATFORM_BEHAVIORS\"] = \"GET_PLATFORM_BEHAVIORS\";\n  Commands2[\"GET_CHANNEL_PERMISSIONS\"] = \"GET_CHANNEL_PERMISSIONS\";\n  Commands2[\"OPEN_SHARE_MOMENT_DIALOG\"] = \"OPEN_SHARE_MOMENT_DIALOG\";\n  Commands2[\"INITIATE_IMAGE_UPLOAD\"] = \"INITIATE_IMAGE_UPLOAD\";\n  Commands2[\"GET_ACTIVITY_INSTANCE_CONNECTED_PARTICIPANTS\"] = \"GET_ACTIVITY_INSTANCE_CONNECTED_PARTICIPANTS\";\n})(Commands || (Commands = {}));\nconst ReceiveFramePayload = objectType({\n  cmd: stringType(),\n  data: unknownType(),\n  evt: nullType(),\n  nonce: stringType()\n}).passthrough();\nconst ScopesObject = Object.assign(Object.assign({}, AuthenticateResponseSchema.shape.scopes.element.overlayType._def.innerType.options[0].Values), {UNHANDLED: -1});\nconst Scopes = zodCoerceUnhandledValue(ScopesObject);\nconst User = objectType({\n  id: stringType(),\n  username: stringType(),\n  discriminator: stringType(),\n  global_name: stringType().optional().nullable(),\n  avatar: stringType().optional().nullable(),\n  avatar_decoration_data: objectType({\n    asset: stringType(),\n    sku_id: stringType().optional()\n  }).nullable(),\n  bot: booleanType(),\n  flags: numberType().optional().nullable(),\n  premium_type: numberType().optional().nullable()\n});\nconst GuildMember = objectType({\n  user: User,\n  nick: stringType().optional().nullable(),\n  roles: arrayType(stringType()),\n  joined_at: stringType(),\n  deaf: booleanType(),\n  mute: booleanType()\n});\nconst Emoji = objectType({\n  id: stringType(),\n  name: stringType().optional().nullable(),\n  roles: arrayType(stringType()).optional().nullable(),\n  user: User.optional().nullable(),\n  require_colons: booleanType().optional().nullable(),\n  managed: booleanType().optional().nullable(),\n  animated: booleanType().optional().nullable(),\n  available: booleanType().optional().nullable()\n});\nconst VoiceState = objectType({\n  mute: booleanType(),\n  deaf: booleanType(),\n  self_mute: booleanType(),\n  self_deaf: booleanType(),\n  suppress: booleanType()\n});\nconst UserVoiceState = objectType({\n  mute: booleanType(),\n  nick: stringType(),\n  user: User,\n  voice_state: VoiceState,\n  volume: numberType()\n});\nconst StatusObject = {\n  UNHANDLED: -1,\n  IDLE: \"idle\",\n  DND: \"dnd\",\n  ONLINE: \"online\",\n  OFFLINE: \"offline\"\n};\nconst Status = zodCoerceUnhandledValue(StatusObject);\nconst Activity = objectType({\n  name: stringType(),\n  type: numberType(),\n  url: stringType().optional().nullable(),\n  created_at: numberType().optional().nullable(),\n  timestamps: objectType({\n    start: numberType(),\n    end: numberType()\n  }).partial().optional().nullable(),\n  application_id: stringType().optional().nullable(),\n  details: stringType().optional().nullable(),\n  state: stringType().optional().nullable(),\n  emoji: Emoji.optional().nullable(),\n  party: objectType({\n    id: stringType().optional().nullable(),\n    size: arrayType(numberType()).optional().nullable()\n  }).optional().nullable(),\n  assets: objectType({\n    large_image: stringType().nullable(),\n    large_text: stringType().nullable(),\n    small_image: stringType().nullable(),\n    small_text: stringType().nullable()\n  }).partial().optional().nullable(),\n  secrets: objectType({\n    join: stringType(),\n    match: stringType()\n  }).partial().optional().nullable(),\n  instance: booleanType().optional().nullable(),\n  flags: numberType().optional().nullable()\n});\nconst PermissionOverwriteTypeObject = {\n  UNHANDLED: -1,\n  ROLE: 0,\n  MEMBER: 1\n};\nconst PermissionOverwrite = objectType({\n  id: stringType(),\n  type: zodCoerceUnhandledValue(PermissionOverwriteTypeObject),\n  allow: stringType(),\n  deny: stringType()\n});\nconst ChannelTypesObject = {\n  UNHANDLED: -1,\n  DM: 1,\n  GROUP_DM: 3,\n  GUILD_TEXT: 0,\n  GUILD_VOICE: 2,\n  GUILD_CATEGORY: 4,\n  GUILD_ANNOUNCEMENT: 5,\n  GUILD_STORE: 6,\n  ANNOUNCEMENT_THREAD: 10,\n  PUBLIC_THREAD: 11,\n  PRIVATE_THREAD: 12,\n  GUILD_STAGE_VOICE: 13,\n  GUILD_DIRECTORY: 14,\n  GUILD_FORUM: 15\n};\nconst Channel = objectType({\n  id: stringType(),\n  type: zodCoerceUnhandledValue(ChannelTypesObject),\n  guild_id: stringType().optional().nullable(),\n  position: numberType().optional().nullable(),\n  permission_overwrites: arrayType(PermissionOverwrite).optional().nullable(),\n  name: stringType().optional().nullable(),\n  topic: stringType().optional().nullable(),\n  nsfw: booleanType().optional().nullable(),\n  last_message_id: stringType().optional().nullable(),\n  bitrate: numberType().optional().nullable(),\n  user_limit: numberType().optional().nullable(),\n  rate_limit_per_user: numberType().optional().nullable(),\n  recipients: arrayType(User).optional().nullable(),\n  icon: stringType().optional().nullable(),\n  owner_id: stringType().optional().nullable(),\n  application_id: stringType().optional().nullable(),\n  parent_id: stringType().optional().nullable(),\n  last_pin_timestamp: stringType().optional().nullable()\n});\nconst PresenceUpdate = objectType({\n  user: User,\n  guild_id: stringType(),\n  status: Status,\n  activities: arrayType(Activity),\n  client_status: objectType({\n    desktop: Status,\n    mobile: Status,\n    web: Status\n  }).partial()\n});\nconst Role = objectType({\n  id: stringType(),\n  name: stringType(),\n  color: numberType(),\n  hoist: booleanType(),\n  position: numberType(),\n  permissions: stringType(),\n  managed: booleanType(),\n  mentionable: booleanType()\n});\nconst Guild = objectType({\n  id: stringType(),\n  name: stringType(),\n  owner_id: stringType(),\n  icon: stringType().nullable(),\n  icon_hash: stringType().optional().nullable(),\n  splash: stringType().nullable(),\n  discovery_splash: stringType().nullable(),\n  owner: booleanType().optional().nullable(),\n  permissions: stringType().optional().nullable(),\n  region: stringType(),\n  afk_channel_id: stringType().nullable(),\n  afk_timeout: numberType(),\n  widget_enabled: booleanType().optional().nullable(),\n  widget_channel_id: stringType().optional().nullable(),\n  verification_level: numberType(),\n  default_message_notifications: numberType(),\n  explicit_content_filter: numberType(),\n  roles: arrayType(Role),\n  emojis: arrayType(Emoji),\n  features: arrayType(stringType()),\n  mfa_level: numberType(),\n  application_id: stringType().nullable(),\n  system_channel_id: stringType().nullable(),\n  system_channel_flags: numberType(),\n  rules_channel_id: stringType().nullable(),\n  joined_at: stringType().optional().nullable(),\n  large: booleanType().optional().nullable(),\n  unavailable: booleanType().optional().nullable(),\n  member_count: numberType().optional().nullable(),\n  voice_states: arrayType(VoiceState).optional().nullable(),\n  members: arrayType(GuildMember).optional().nullable(),\n  channels: arrayType(Channel).optional().nullable(),\n  presences: arrayType(PresenceUpdate).optional().nullable(),\n  max_presences: numberType().optional().nullable(),\n  max_members: numberType().optional().nullable(),\n  vanity_url_code: stringType().nullable(),\n  description: stringType().nullable(),\n  banner: stringType().nullable(),\n  premium_tier: numberType(),\n  premium_subscription_count: numberType().optional().nullable(),\n  preferred_locale: stringType(),\n  public_updates_channel_id: stringType().nullable(),\n  max_video_channel_users: numberType().optional().nullable(),\n  approximate_member_count: numberType().optional().nullable(),\n  approximate_presence_count: numberType().optional().nullable()\n});\nconst ChannelMention = objectType({\n  id: stringType(),\n  guild_id: stringType(),\n  type: numberType(),\n  name: stringType()\n});\nconst Attachment = objectType({\n  id: stringType(),\n  filename: stringType(),\n  size: numberType(),\n  url: stringType(),\n  proxy_url: stringType(),\n  height: numberType().optional().nullable(),\n  width: numberType().optional().nullable()\n});\nconst EmbedFooter = objectType({\n  text: stringType(),\n  icon_url: stringType().optional().nullable(),\n  proxy_icon_url: stringType().optional().nullable()\n});\nconst Image = objectType({\n  url: stringType().optional().nullable(),\n  proxy_url: stringType().optional().nullable(),\n  height: numberType().optional().nullable(),\n  width: numberType().optional().nullable()\n});\nconst Video = Image.omit({proxy_url: true});\nconst EmbedProvider = objectType({\n  name: stringType().optional().nullable(),\n  url: stringType().optional().nullable()\n});\nconst EmbedAuthor = objectType({\n  name: stringType().optional().nullable(),\n  url: stringType().optional().nullable(),\n  icon_url: stringType().optional().nullable(),\n  proxy_icon_url: stringType().optional().nullable()\n});\nconst EmbedField = objectType({\n  name: stringType(),\n  value: stringType(),\n  inline: booleanType()\n});\nconst Embed = objectType({\n  title: stringType().optional().nullable(),\n  type: stringType().optional().nullable(),\n  description: stringType().optional().nullable(),\n  url: stringType().optional().nullable(),\n  timestamp: stringType().optional().nullable(),\n  color: numberType().optional().nullable(),\n  footer: EmbedFooter.optional().nullable(),\n  image: Image.optional().nullable(),\n  thumbnail: Image.optional().nullable(),\n  video: Video.optional().nullable(),\n  provider: EmbedProvider.optional().nullable(),\n  author: EmbedAuthor.optional().nullable(),\n  fields: arrayType(EmbedField).optional().nullable()\n});\nconst Reaction = objectType({\n  count: numberType(),\n  me: booleanType(),\n  emoji: Emoji\n});\nconst MessageActivity = objectType({\n  type: numberType(),\n  party_id: stringType().optional().nullable()\n});\nconst MessageApplication = objectType({\n  id: stringType(),\n  cover_image: stringType().optional().nullable(),\n  description: stringType(),\n  icon: stringType().optional().nullable(),\n  name: stringType()\n});\nconst MessageReference = objectType({\n  message_id: stringType().optional().nullable(),\n  channel_id: stringType().optional().nullable(),\n  guild_id: stringType().optional().nullable()\n});\nconst Message = objectType({\n  id: stringType(),\n  channel_id: stringType(),\n  guild_id: stringType().optional().nullable(),\n  author: User.optional().nullable(),\n  member: GuildMember.optional().nullable(),\n  content: stringType(),\n  timestamp: stringType(),\n  edited_timestamp: stringType().optional().nullable(),\n  tts: booleanType(),\n  mention_everyone: booleanType(),\n  mentions: arrayType(User),\n  mention_roles: arrayType(stringType()),\n  mention_channels: arrayType(ChannelMention),\n  attachments: arrayType(Attachment),\n  embeds: arrayType(Embed),\n  reactions: arrayType(Reaction).optional().nullable(),\n  nonce: unionType([stringType(), numberType()]).optional().nullable(),\n  pinned: booleanType(),\n  webhook_id: stringType().optional().nullable(),\n  type: numberType(),\n  activity: MessageActivity.optional().nullable(),\n  application: MessageApplication.optional().nullable(),\n  message_reference: MessageReference.optional().nullable(),\n  flags: numberType().optional().nullable(),\n  stickers: arrayType(unknownType()).optional().nullable(),\n  referenced_message: unknownType().optional().nullable()\n});\nconst VoiceDevice = objectType({\n  id: stringType(),\n  name: stringType()\n});\nconst KeyTypesObject = {\n  UNHANDLED: -1,\n  KEYBOARD_KEY: 0,\n  MOUSE_BUTTON: 1,\n  KEYBOARD_MODIFIER_KEY: 2,\n  GAMEPAD_BUTTON: 3\n};\nconst ShortcutKey = objectType({\n  type: zodCoerceUnhandledValue(KeyTypesObject),\n  code: numberType(),\n  name: stringType()\n});\nconst VoiceSettingModeTypeObject = {\n  UNHANDLED: -1,\n  PUSH_TO_TALK: \"PUSH_TO_TALK\",\n  VOICE_ACTIVITY: \"VOICE_ACTIVITY\"\n};\nconst VoiceSettingsMode = objectType({\n  type: zodCoerceUnhandledValue(VoiceSettingModeTypeObject),\n  auto_threshold: booleanType(),\n  threshold: numberType(),\n  shortcut: arrayType(ShortcutKey),\n  delay: numberType()\n});\nconst VoiceSettingsIO = objectType({\n  device_id: stringType(),\n  volume: numberType(),\n  available_devices: arrayType(VoiceDevice)\n});\nconst CertifiedDeviceTypeObject = {\n  UNHANDLED: -1,\n  AUDIO_INPUT: \"AUDIO_INPUT\",\n  AUDIO_OUTPUT: \"AUDIO_OUTPUT\",\n  VIDEO_INPUT: \"VIDEO_INPUT\"\n};\nconst CertifiedDevice = objectType({\n  type: zodCoerceUnhandledValue(CertifiedDeviceTypeObject),\n  id: stringType(),\n  vendor: objectType({\n    name: stringType(),\n    url: stringType()\n  }),\n  model: objectType({\n    name: stringType(),\n    url: stringType()\n  }),\n  related: arrayType(stringType()),\n  echo_cancellation: booleanType().optional().nullable(),\n  noise_suppression: booleanType().optional().nullable(),\n  automatic_gain_control: booleanType().optional().nullable(),\n  hardware_mute: booleanType().optional().nullable()\n});\nconst SkuTypeObject = {\n  UNHANDLED: -1,\n  APPLICATION: 1,\n  DLC: 2,\n  CONSUMABLE: 3,\n  BUNDLE: 4,\n  SUBSCRIPTION: 5\n};\nconst Sku = objectType({\n  id: stringType(),\n  name: stringType(),\n  type: zodCoerceUnhandledValue(SkuTypeObject),\n  price: objectType({\n    amount: numberType(),\n    currency: stringType()\n  }),\n  application_id: stringType(),\n  flags: numberType(),\n  release_date: stringType().nullable()\n});\nconst EntitlementTypesObject = {\n  UNHANDLED: -1,\n  PURCHASE: 1,\n  PREMIUM_SUBSCRIPTION: 2,\n  DEVELOPER_GIFT: 3,\n  TEST_MODE_PURCHASE: 4,\n  FREE_PURCHASE: 5,\n  USER_GIFT: 6,\n  PREMIUM_PURCHASE: 7\n};\nconst Entitlement = objectType({\n  id: stringType(),\n  sku_id: stringType(),\n  application_id: stringType(),\n  user_id: stringType(),\n  gift_code_flags: numberType(),\n  type: zodCoerceUnhandledValue(EntitlementTypesObject),\n  gifter_user_id: stringType().optional().nullable(),\n  branches: arrayType(stringType()).optional().nullable(),\n  starts_at: stringType().optional().nullable(),\n  ends_at: stringType().optional().nullable(),\n  parent_id: stringType().optional().nullable(),\n  consumed: booleanType().optional().nullable(),\n  deleted: booleanType().optional().nullable(),\n  gift_code_batch_id: stringType().optional().nullable()\n});\nconst OrientationLockStateTypeObject = {\n  UNHANDLED: -1,\n  UNLOCKED: 1,\n  PORTRAIT: 2,\n  LANDSCAPE: 3\n};\nconst OrientationLockState = zodCoerceUnhandledValue(OrientationLockStateTypeObject);\nconst ThermalStateTypeObject = {\n  UNHANDLED: -1,\n  NOMINAL: 0,\n  FAIR: 1,\n  SERIOUS: 2,\n  CRITICAL: 3\n};\nconst ThermalState = zodCoerceUnhandledValue(ThermalStateTypeObject);\nconst OrientationTypeObject = {\n  UNHANDLED: -1,\n  PORTRAIT: 0,\n  LANDSCAPE: 1\n};\nconst Orientation$1 = zodCoerceUnhandledValue(OrientationTypeObject);\nconst LayoutModeTypeObject = {\n  UNHANDLED: -1,\n  FOCUSED: 0,\n  PIP: 1,\n  GRID: 2\n};\nconst LayoutMode = zodCoerceUnhandledValue(LayoutModeTypeObject);\nvar common = /* @__PURE__ */ Object.freeze({\n  __proto__: null,\n  Activity,\n  Attachment,\n  CertifiedDevice,\n  CertifiedDeviceTypeObject,\n  Channel,\n  ChannelMention,\n  ChannelTypesObject,\n  get Commands() {\n    return Commands;\n  },\n  DISPATCH,\n  Embed,\n  EmbedAuthor,\n  EmbedField,\n  EmbedFooter,\n  EmbedProvider,\n  Emoji,\n  Entitlement,\n  EntitlementTypesObject,\n  Guild,\n  GuildMember,\n  Image,\n  KeyTypesObject,\n  LayoutMode,\n  LayoutModeTypeObject,\n  Message,\n  MessageActivity,\n  MessageApplication,\n  MessageReference,\n  Orientation: Orientation$1,\n  OrientationLockState,\n  OrientationLockStateTypeObject,\n  OrientationTypeObject,\n  PermissionOverwrite,\n  PermissionOverwriteTypeObject,\n  PresenceUpdate,\n  Reaction,\n  ReceiveFramePayload,\n  Role,\n  Scopes,\n  ScopesObject,\n  ShortcutKey,\n  Sku,\n  SkuTypeObject,\n  Status,\n  StatusObject,\n  ThermalState,\n  ThermalStateTypeObject,\n  User,\n  UserVoiceState,\n  Video,\n  VoiceDevice,\n  VoiceSettingModeTypeObject,\n  VoiceSettingsIO,\n  VoiceSettingsMode,\n  VoiceState\n});\nconst ERROR = \"ERROR\";\nvar Events;\n(function(Events2) {\n  Events2[\"READY\"] = \"READY\";\n  Events2[\"VOICE_STATE_UPDATE\"] = \"VOICE_STATE_UPDATE\";\n  Events2[\"SPEAKING_START\"] = \"SPEAKING_START\";\n  Events2[\"SPEAKING_STOP\"] = \"SPEAKING_STOP\";\n  Events2[\"ACTIVITY_LAYOUT_MODE_UPDATE\"] = \"ACTIVITY_LAYOUT_MODE_UPDATE\";\n  Events2[\"ORIENTATION_UPDATE\"] = \"ORIENTATION_UPDATE\";\n  Events2[\"CURRENT_USER_UPDATE\"] = \"CURRENT_USER_UPDATE\";\n  Events2[\"ENTITLEMENT_CREATE\"] = \"ENTITLEMENT_CREATE\";\n  Events2[\"THERMAL_STATE_UPDATE\"] = \"THERMAL_STATE_UPDATE\";\n  Events2[\"ACTIVITY_INSTANCE_PARTICIPANTS_UPDATE\"] = \"ACTIVITY_INSTANCE_PARTICIPANTS_UPDATE\";\n})(Events || (Events = {}));\nconst DispatchEventFrame = ReceiveFramePayload.extend({\n  evt: nativeEnumType(Events),\n  nonce: stringType().nullable(),\n  cmd: literalType(DISPATCH),\n  data: objectType({}).passthrough()\n});\nconst ErrorEvent = ReceiveFramePayload.extend({\n  evt: literalType(ERROR),\n  data: objectType({\n    code: numberType(),\n    message: stringType().optional()\n  }).passthrough(),\n  cmd: nativeEnumType(Commands),\n  nonce: stringType().nullable()\n});\nconst OtherEvent = DispatchEventFrame.extend({\n  evt: stringType()\n});\nconst EventFrame = unionType([DispatchEventFrame, OtherEvent, ErrorEvent]);\nfunction parseEventPayload(data) {\n  const event = data.evt;\n  if (!(event in Events)) {\n    throw new Error(`Unrecognized event type ${data.evt}`);\n  }\n  const eventSchema = EventSchema[event];\n  return eventSchema.payload.parse(data);\n}\nconst EventSchema = {\n  [Events.READY]: {\n    payload: DispatchEventFrame.extend({\n      evt: literalType(Events.READY),\n      data: objectType({\n        v: numberType(),\n        config: objectType({\n          cdn_host: stringType().optional(),\n          api_endpoint: stringType(),\n          environment: stringType()\n        }),\n        user: objectType({\n          id: stringType(),\n          username: stringType(),\n          discriminator: stringType(),\n          avatar: stringType().optional()\n        }).optional()\n      })\n    })\n  },\n  [Events.VOICE_STATE_UPDATE]: {\n    payload: DispatchEventFrame.extend({\n      evt: literalType(Events.VOICE_STATE_UPDATE),\n      data: UserVoiceState\n    }),\n    subscribeArgs: objectType({\n      channel_id: stringType()\n    })\n  },\n  [Events.SPEAKING_START]: {\n    payload: DispatchEventFrame.extend({\n      evt: literalType(Events.SPEAKING_START),\n      data: objectType({\n        lobby_id: stringType().optional(),\n        channel_id: stringType().optional(),\n        user_id: stringType()\n      })\n    }),\n    subscribeArgs: objectType({\n      lobby_id: stringType().nullable().optional(),\n      channel_id: stringType().nullable().optional()\n    })\n  },\n  [Events.SPEAKING_STOP]: {\n    payload: DispatchEventFrame.extend({\n      evt: literalType(Events.SPEAKING_STOP),\n      data: objectType({\n        lobby_id: stringType().optional(),\n        channel_id: stringType().optional(),\n        user_id: stringType()\n      })\n    }),\n    subscribeArgs: objectType({\n      lobby_id: stringType().nullable().optional(),\n      channel_id: stringType().nullable().optional()\n    })\n  },\n  [Events.ACTIVITY_LAYOUT_MODE_UPDATE]: {\n    payload: DispatchEventFrame.extend({\n      evt: literalType(Events.ACTIVITY_LAYOUT_MODE_UPDATE),\n      data: objectType({\n        layout_mode: zodCoerceUnhandledValue(LayoutModeTypeObject)\n      })\n    })\n  },\n  [Events.ORIENTATION_UPDATE]: {\n    payload: DispatchEventFrame.extend({\n      evt: literalType(Events.ORIENTATION_UPDATE),\n      data: objectType({\n        screen_orientation: zodCoerceUnhandledValue(OrientationTypeObject),\n        orientation: nativeEnumType(Orientation)\n      })\n    })\n  },\n  [Events.CURRENT_USER_UPDATE]: {\n    payload: DispatchEventFrame.extend({\n      evt: literalType(Events.CURRENT_USER_UPDATE),\n      data: User\n    })\n  },\n  [Events.ENTITLEMENT_CREATE]: {\n    payload: DispatchEventFrame.extend({\n      evt: literalType(Events.ENTITLEMENT_CREATE),\n      data: objectType({entitlement: Entitlement})\n    })\n  },\n  [Events.THERMAL_STATE_UPDATE]: {\n    payload: DispatchEventFrame.extend({\n      evt: literalType(Events.THERMAL_STATE_UPDATE),\n      data: objectType({thermal_state: ThermalState})\n    })\n  },\n  [Events.ACTIVITY_INSTANCE_PARTICIPANTS_UPDATE]: {\n    payload: DispatchEventFrame.extend({\n      evt: literalType(Events.ACTIVITY_INSTANCE_PARTICIPANTS_UPDATE),\n      data: objectType({\n        participants: GetActivityInstanceConnectedParticipantsResponseSchema.shape.participants\n      })\n    })\n  }\n};\nfunction assertUnreachable(_x, runtimeError) {\n  throw runtimeError;\n}\nconst EmptyResponse = objectType({}).nullable();\nconst AuthorizeResponse = objectType({\n  code: stringType()\n});\nconst GetGuildsResponse = objectType({\n  guilds: arrayType(objectType({\n    id: stringType(),\n    name: stringType()\n  }))\n});\nconst GetGuildResponse = objectType({\n  id: stringType(),\n  name: stringType(),\n  icon_url: stringType().optional(),\n  members: arrayType(GuildMember)\n});\nconst GetChannelResponse = objectType({\n  id: stringType(),\n  type: zodCoerceUnhandledValue(ChannelTypesObject),\n  guild_id: stringType().optional().nullable(),\n  name: stringType().optional().nullable(),\n  topic: stringType().optional().nullable(),\n  bitrate: numberType().optional().nullable(),\n  user_limit: numberType().optional().nullable(),\n  position: numberType().optional().nullable(),\n  voice_states: arrayType(UserVoiceState),\n  messages: arrayType(Message)\n});\nconst GetChannelsResponse = objectType({\n  channels: arrayType(Channel)\n});\nconst NullableChannelResponse = GetChannelResponse.nullable();\nconst SelectVoiceChannelResponse = GetChannelResponse.nullable();\nconst SelectTextChannelResponse = GetChannelResponse.nullable();\nconst VoiceSettingsResponse = objectType({\n  input: VoiceSettingsIO,\n  output: VoiceSettingsIO,\n  mode: VoiceSettingsMode,\n  automatic_gain_control: booleanType(),\n  echo_cancellation: booleanType(),\n  noise_suppression: booleanType(),\n  qos: booleanType(),\n  silence_warning: booleanType(),\n  deaf: booleanType(),\n  mute: booleanType()\n});\nconst SubscribeResponse = objectType({\n  evt: stringType()\n});\nconst CaptureShortcutResponse = objectType({shortcut: ShortcutKey});\nconst SetActivityResponse = Activity;\nconst GetSkusResponse = objectType({skus: arrayType(Sku)});\nconst GetEntitlementsResponse = objectType({entitlements: arrayType(Entitlement)});\nconst StartPurchaseResponse = arrayType(Entitlement).nullable();\nconst SetConfigResponse = objectType({\n  use_interactive_pip: booleanType()\n});\nconst UserSettingsGetLocaleResponse = objectType({\n  locale: stringType()\n});\nconst EncourageHardwareAccelerationResponse = objectType({\n  enabled: booleanType()\n});\nconst GetChannelPermissionsResponse = objectType({\n  permissions: bigIntType().or(stringType())\n});\nconst GetPlatformBehaviorsResponse = objectType({\n  iosKeyboardResizesView: optionalType(booleanType())\n});\nconst ResponseFrame = ReceiveFramePayload.extend({\n  cmd: nativeEnumType(Commands),\n  evt: nullType()\n});\nfunction parseResponseData({cmd, data}) {\n  switch (cmd) {\n    case Commands.AUTHORIZE:\n      return AuthorizeResponse.parse(data);\n    case Commands.CAPTURE_SHORTCUT:\n      return CaptureShortcutResponse.parse(data);\n    case Commands.ENCOURAGE_HW_ACCELERATION:\n      return EncourageHardwareAccelerationResponse.parse(data);\n    case Commands.GET_CHANNEL:\n      return GetChannelResponse.parse(data);\n    case Commands.GET_CHANNELS:\n      return GetChannelsResponse.parse(data);\n    case Commands.GET_CHANNEL_PERMISSIONS:\n      return GetChannelPermissionsResponse.parse(data);\n    case Commands.GET_GUILD:\n      return GetGuildResponse.parse(data);\n    case Commands.GET_GUILDS:\n      return GetGuildsResponse.parse(data);\n    case Commands.GET_PLATFORM_BEHAVIORS:\n      return GetPlatformBehaviorsResponse.parse(data);\n    case Commands.GET_CHANNEL:\n      return GetChannelResponse.parse(data);\n    case Commands.SELECT_TEXT_CHANNEL:\n      return SelectTextChannelResponse.parse(data);\n    case Commands.SELECT_VOICE_CHANNEL:\n      return SelectVoiceChannelResponse.parse(data);\n    case Commands.SET_ACTIVITY:\n      return SetActivityResponse.parse(data);\n    case Commands.GET_SKUS_EMBEDDED:\n      return GetSkusResponse.parse(data);\n    case Commands.GET_ENTITLEMENTS_EMBEDDED:\n      return GetEntitlementsResponse.parse(data);\n    case Commands.SET_CONFIG:\n      return SetConfigResponse.parse(data);\n    case Commands.START_PURCHASE:\n      return StartPurchaseResponse.parse(data);\n    case Commands.SUBSCRIBE:\n    case Commands.UNSUBSCRIBE:\n      return SubscribeResponse.parse(data);\n    case Commands.USER_SETTINGS_GET_LOCALE:\n      return UserSettingsGetLocaleResponse.parse(data);\n    case Commands.OPEN_EXTERNAL_LINK:\n    case Commands.SET_ORIENTATION_LOCK_STATE:\n    case Commands.SET_CERTIFIED_DEVICES:\n    case Commands.SEND_ANALYTICS_EVENT:\n    case Commands.OPEN_INVITE_DIALOG:\n    case Commands.CAPTURE_LOG:\n    case Commands.GET_SKUS:\n    case Commands.GET_ENTITLEMENTS:\n      return EmptyResponse.parse(data);\n    case Commands.AUTHENTICATE:\n    case Commands.INITIATE_IMAGE_UPLOAD:\n    case Commands.OPEN_SHARE_MOMENT_DIALOG:\n    case Commands.GET_ACTIVITY_INSTANCE_CONNECTED_PARTICIPANTS:\n      const {response} = Schemas[cmd];\n      return response.parse(data);\n    default:\n      assertUnreachable(cmd, new Error(`Unrecognized command ${cmd}`));\n  }\n}\nfunction parseResponsePayload(payload) {\n  return Object.assign(Object.assign({}, payload), {data: parseResponseData(payload)});\n}\nvar responses = /* @__PURE__ */ Object.freeze({\n  __proto__: null,\n  AuthorizeResponse,\n  CaptureShortcutResponse,\n  EmptyResponse,\n  EncourageHardwareAccelerationResponse,\n  GetChannelPermissionsResponse,\n  GetChannelResponse,\n  GetChannelsResponse,\n  GetEntitlementsResponse,\n  GetGuildResponse,\n  GetGuildsResponse,\n  GetPlatformBehaviorsResponse,\n  GetSkusResponse,\n  NullableChannelResponse,\n  ResponseFrame,\n  SelectTextChannelResponse,\n  SelectVoiceChannelResponse,\n  SetActivityResponse,\n  SetConfigResponse,\n  StartPurchaseResponse,\n  SubscribeResponse,\n  UserSettingsGetLocaleResponse,\n  VoiceSettingsResponse,\n  parseResponsePayload,\n  AuthenticateResponse: AuthenticateResponseSchema,\n  InitiateImageUploadResponse: InitiateImageUploadResponseSchema\n});\nobjectType({\n  frame_id: stringType(),\n  platform: nativeEnumType(Platform).optional().nullable()\n});\nobjectType({\n  v: literalType(1),\n  encoding: literalType(\"json\").optional(),\n  client_id: stringType(),\n  frame_id: stringType()\n});\nconst ClosePayload = objectType({\n  code: numberType(),\n  message: stringType().optional()\n});\nconst IncomingPayload = objectType({\n  evt: stringType().nullable(),\n  nonce: stringType().nullable(),\n  data: unknownType().nullable(),\n  cmd: stringType()\n}).passthrough();\nfunction parseIncomingPayload(payload) {\n  const incoming = IncomingPayload.parse(payload);\n  if (incoming.evt != null) {\n    if (incoming.evt === ERROR) {\n      return ErrorEvent.parse(incoming);\n    }\n    return parseEventPayload(EventFrame.parse(incoming));\n  } else {\n    return parseResponsePayload(ResponseFrame.passthrough().parse(incoming));\n  }\n}\nfunction commandFactory(sendCommand, cmd, response, transferTransform = () => void 0) {\n  const payload = ReceiveFramePayload.extend({\n    cmd: literalType(cmd),\n    data: response\n  });\n  return async (args) => {\n    const reply = await sendCommand({cmd, args, transfer: transferTransform(args)});\n    const parsed = payload.parse(reply);\n    return parsed.data;\n  };\n}\nfunction schemaCommandFactory(cmd, transferTransform = () => void 0) {\n  const response = Schemas[cmd].response;\n  const payload = ReceiveFramePayload.extend({\n    cmd: literalType(cmd),\n    data: response\n  });\n  return (sendCommand) => async (args) => {\n    const reply = await sendCommand({\n      cmd,\n      args,\n      transfer: transferTransform(args)\n    });\n    const parsed = payload.parse(reply);\n    return parsed.data;\n  };\n}\nconst authenticate = schemaCommandFactory(Command.AUTHENTICATE);\nconst authorize = (sendCommand) => commandFactory(sendCommand, Commands.AUTHORIZE, AuthorizeResponse);\nconst captureLog = (sendCommand) => commandFactory(sendCommand, Commands.CAPTURE_LOG, EmptyResponse);\nconst encourageHardwareAcceleration = (sendCommand) => commandFactory(sendCommand, Commands.ENCOURAGE_HW_ACCELERATION, EncourageHardwareAccelerationResponse);\nconst getEntitlements = (sendCommand) => commandFactory(sendCommand, Commands.GET_ENTITLEMENTS_EMBEDDED, GetEntitlementsResponse);\nconst getSkus = (sendCommand) => commandFactory(sendCommand, Commands.GET_SKUS_EMBEDDED, GetSkusResponse);\nconst getChannelPermissions = (sendCommand) => commandFactory(sendCommand, Commands.GET_CHANNEL_PERMISSIONS, GetChannelPermissionsResponse);\nconst getPlatformBehaviors = (sendCommand) => commandFactory(sendCommand, Commands.GET_PLATFORM_BEHAVIORS, GetPlatformBehaviorsResponse);\nconst openExternalLink = (sendCommand) => commandFactory(sendCommand, Commands.OPEN_EXTERNAL_LINK, EmptyResponse);\nconst openInviteDialog = (sendCommand) => commandFactory(sendCommand, Commands.OPEN_INVITE_DIALOG, EmptyResponse);\nconst openShareMomentDialog = schemaCommandFactory(Command.OPEN_SHARE_MOMENT_DIALOG);\nActivity.pick({\n  state: true,\n  details: true,\n  timestamps: true,\n  assets: true,\n  party: true,\n  secrets: true,\n  buttons: true,\n  instance: true,\n  supported_platforms: true,\n  type: true\n}).extend({\n  type: Activity.shape.type.optional(),\n  instance: Activity.shape.instance.optional()\n}).nullable();\nconst setActivity = (sendCommand) => commandFactory(sendCommand, Commands.SET_ACTIVITY, SetActivityResponse);\nconst setConfig = (sendCommand) => commandFactory(sendCommand, Commands.SET_CONFIG, SetConfigResponse);\nfunction compatCommandFactory({sendCommand, cmd, response, fallbackTransform: fallbackTransform2, transferTransform = () => void 0}) {\n  const payload = ReceiveFramePayload.extend({\n    cmd: literalType(cmd),\n    data: response\n  });\n  return async (args) => {\n    try {\n      const reply = await sendCommand({cmd, args, transfer: transferTransform(args)});\n      const parsed = payload.parse(reply);\n      return parsed.data;\n    } catch (error) {\n      if (error.code === RPCErrorCodes.INVALID_PAYLOAD) {\n        const fallbackArgs = fallbackTransform2(args);\n        const reply = await sendCommand({cmd, args: fallbackArgs, transfer: transferTransform(fallbackArgs)});\n        const parsed = payload.parse(reply);\n        return parsed.data;\n      } else {\n        throw error;\n      }\n    }\n  };\n}\nconst fallbackTransform = (args) => {\n  return {\n    lock_state: args.lock_state,\n    picture_in_picture_lock_state: args.picture_in_picture_lock_state\n  };\n};\nconst setOrientationLockState = (sendCommand) => compatCommandFactory({\n  sendCommand,\n  cmd: Commands.SET_ORIENTATION_LOCK_STATE,\n  response: EmptyResponse,\n  fallbackTransform\n});\nconst startPurchase = (sendCommand) => commandFactory(sendCommand, Commands.START_PURCHASE, StartPurchaseResponse);\nconst userSettingsGetLocale = (sendCommand) => commandFactory(sendCommand, Commands.USER_SETTINGS_GET_LOCALE, UserSettingsGetLocaleResponse);\nconst initiateImageUpload = schemaCommandFactory(Command.INITIATE_IMAGE_UPLOAD);\nconst getChannel = (sendCommand) => commandFactory(sendCommand, Commands.GET_CHANNEL, GetChannelResponse);\nconst getInstanceConnectedParticipants = schemaCommandFactory(Command.GET_ACTIVITY_INSTANCE_CONNECTED_PARTICIPANTS);\nfunction commands(sendCommand) {\n  return {\n    authenticate: authenticate(sendCommand),\n    authorize: authorize(sendCommand),\n    captureLog: captureLog(sendCommand),\n    encourageHardwareAcceleration: encourageHardwareAcceleration(sendCommand),\n    getChannel: getChannel(sendCommand),\n    getChannelPermissions: getChannelPermissions(sendCommand),\n    getEntitlements: getEntitlements(sendCommand),\n    getPlatformBehaviors: getPlatformBehaviors(sendCommand),\n    getSkus: getSkus(sendCommand),\n    openExternalLink: openExternalLink(sendCommand),\n    openInviteDialog: openInviteDialog(sendCommand),\n    openShareMomentDialog: openShareMomentDialog(sendCommand),\n    setActivity: setActivity(sendCommand),\n    setConfig: setConfig(sendCommand),\n    setOrientationLockState: setOrientationLockState(sendCommand),\n    startPurchase: startPurchase(sendCommand),\n    userSettingsGetLocale: userSettingsGetLocale(sendCommand),\n    initiateImageUpload: initiateImageUpload(sendCommand),\n    getInstanceConnectedParticipants: getInstanceConnectedParticipants(sendCommand)\n  };\n}\nclass SDKError extends Error {\n  constructor(code, message = \"\") {\n    super(message);\n    this.code = code;\n    this.message = message;\n    this.name = \"Discord SDK Error\";\n  }\n}\nfunction getDefaultSdkConfiguration() {\n  return {\n    disableConsoleLogOverride: false\n  };\n}\nconst consoleLevels = [\"log\", \"warn\", \"debug\", \"info\", \"error\"];\nfunction wrapConsoleMethod(console2, level, callback) {\n  const _consoleMethod = console2[level];\n  const _console = console2;\n  if (!_consoleMethod) {\n    return;\n  }\n  console2[level] = function() {\n    const args = [].slice.call(arguments);\n    const message = \"\" + args.join(\" \");\n    callback(level, message);\n    _consoleMethod.apply(_console, args);\n  };\n}\nconst randomUUID = typeof crypto !== \"undefined\" && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nvar native = {\n  randomUUID\n};\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nfunction rng() {\n  if (!getRandomValues) {\n    getRandomValues = typeof crypto !== \"undefined\" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n    if (!getRandomValues) {\n      throw new Error(\"crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported\");\n    }\n  }\n  return getRandomValues(rnds8);\n}\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n  byteToHex.push((i + 256).toString(16).slice(1));\n}\nfunction unsafeStringify(arr, offset = 0) {\n  return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + \"-\" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + \"-\" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + \"-\" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + \"-\" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\nfunction v4(options, buf, offset) {\n  if (native.randomUUID && !buf && !options) {\n    return native.randomUUID();\n  }\n  options = options || {};\n  const rnds = options.random || (options.rng || rng)();\n  rnds[6] = rnds[6] & 15 | 64;\n  rnds[8] = rnds[8] & 63 | 128;\n  if (buf) {\n    offset = offset || 0;\n    for (let i = 0; i < 16; ++i) {\n      buf[offset + i] = rnds[i];\n    }\n    return buf;\n  }\n  return unsafeStringify(rnds);\n}\nvar Opcodes;\n(function(Opcodes2) {\n  Opcodes2[Opcodes2[\"HANDSHAKE\"] = 0] = \"HANDSHAKE\";\n  Opcodes2[Opcodes2[\"FRAME\"] = 1] = \"FRAME\";\n  Opcodes2[Opcodes2[\"CLOSE\"] = 2] = \"CLOSE\";\n  Opcodes2[Opcodes2[\"HELLO\"] = 3] = \"HELLO\";\n})(Opcodes || (Opcodes = {}));\nconst ALLOWED_ORIGINS = new Set(getAllowedOrigins());\nfunction getAllowedOrigins() {\n  if (typeof window === \"undefined\")\n    return [];\n  return [\n    window.location.origin,\n    \"https://discord.com\",\n    \"https://discordapp.com\",\n    \"https://ptb.discord.com\",\n    \"https://ptb.discordapp.com\",\n    \"https://canary.discord.com\",\n    \"https://canary.discordapp.com\",\n    \"https://staging.discord.co\",\n    \"http://localhost:3333\",\n    \"https://pax.discord.com\",\n    \"null\"\n  ];\n}\nfunction getRPCServerSource() {\n  var _a;\n  return [(_a = window.parent.opener) !== null && _a !== void 0 ? _a : window.parent, !!document.referrer ? document.referrer : \"*\"];\n}\nclass DiscordSDK {\n  getTransfer(payload) {\n    var _a;\n    switch (payload.cmd) {\n      case Commands.SUBSCRIBE:\n      case Commands.UNSUBSCRIBE:\n        return void 0;\n      default:\n        return (_a = payload.transfer) !== null && _a !== void 0 ? _a : void 0;\n    }\n  }\n  constructor(clientId, configuration) {\n    this.source = null;\n    this.sourceOrigin = \"\";\n    this.eventBus = new EventEmitter();\n    this.pendingCommands = new Map();\n    this.sendCommand = (payload) => {\n      var _a;\n      if (this.source == null)\n        throw new Error(\"Attempting to send message before initialization\");\n      const nonce = v4();\n      (_a = this.source) === null || _a === void 0 ? void 0 : _a.postMessage([Opcodes.FRAME, Object.assign(Object.assign({}, payload), {nonce})], this.sourceOrigin, this.getTransfer(payload));\n      const promise = new Promise((resolve, reject) => {\n        this.pendingCommands.set(nonce, {resolve, reject});\n      });\n      return promise;\n    };\n    this.commands = commands(this.sendCommand);\n    this.handleMessage = (event) => {\n      if (!ALLOWED_ORIGINS.has(event.origin))\n        return;\n      const tuple = event.data;\n      if (!Array.isArray(tuple)) {\n        return;\n      }\n      const [opcode, data] = tuple;\n      switch (opcode) {\n        case Opcodes.HELLO:\n          return;\n        case Opcodes.CLOSE:\n          return this.handleClose(data);\n        case Opcodes.HANDSHAKE:\n          return this.handleHandshake();\n        case Opcodes.FRAME:\n          return this.handleFrame(data);\n        default:\n          throw new Error(\"Invalid message format\");\n      }\n    };\n    this.isReady = false;\n    this.clientId = clientId;\n    this.configuration = configuration !== null && configuration !== void 0 ? configuration : getDefaultSdkConfiguration();\n    if (typeof window !== \"undefined\") {\n      window.addEventListener(\"message\", this.handleMessage);\n    }\n    if (typeof window === \"undefined\") {\n      this.frameId = \"\";\n      this.instanceId = \"\";\n      this.platform = Platform.DESKTOP;\n      this.guildId = null;\n      this.channelId = null;\n      return;\n    }\n    const urlParams = new URLSearchParams(this._getSearch());\n    const frameId = urlParams.get(\"frame_id\");\n    if (!frameId) {\n      throw new Error(\"frame_id query param is not defined\");\n    }\n    this.frameId = frameId;\n    const instanceId = urlParams.get(\"instance_id\");\n    if (!instanceId) {\n      throw new Error(\"instance_id query param is not defined\");\n    }\n    this.instanceId = instanceId;\n    const platform = urlParams.get(\"platform\");\n    if (!platform) {\n      throw new Error(\"platform query param is not defined\");\n    } else if (platform !== Platform.DESKTOP && platform !== Platform.MOBILE) {\n      throw new Error(`Invalid query param \"platform\" of \"${platform}\". Valid values are \"${Platform.DESKTOP}\" or \"${Platform.MOBILE}\"`);\n    }\n    this.platform = platform;\n    this.guildId = urlParams.get(\"guild_id\");\n    this.channelId = urlParams.get(\"channel_id\");\n    [this.source, this.sourceOrigin] = getRPCServerSource();\n    this.addOnReadyListener();\n    this.handshake();\n  }\n  close(code, message) {\n    var _a;\n    window.removeEventListener(\"message\", this.handleMessage);\n    const nonce = v4();\n    (_a = this.source) === null || _a === void 0 ? void 0 : _a.postMessage([Opcodes.CLOSE, {code, message, nonce}], this.sourceOrigin);\n  }\n  async subscribe(event, listener, ...rest) {\n    const [subscribeArgs] = rest;\n    const listenerCount = this.eventBus.listenerCount(event);\n    const emitter = this.eventBus.on(event, listener);\n    if (Object.values(Events).includes(event) && event !== Events.READY && listenerCount === 0) {\n      await this.sendCommand({\n        cmd: Commands.SUBSCRIBE,\n        args: subscribeArgs,\n        evt: event\n      });\n    }\n    return emitter;\n  }\n  async unsubscribe(event, listener, ...rest) {\n    const [unsubscribeArgs] = rest;\n    if (event !== Events.READY && this.eventBus.listenerCount(event) === 1) {\n      await this.sendCommand({\n        cmd: Commands.UNSUBSCRIBE,\n        evt: event,\n        args: unsubscribeArgs\n      });\n    }\n    return this.eventBus.off(event, listener);\n  }\n  async ready() {\n    if (this.isReady) {\n      return;\n    } else {\n      await new Promise((resolve) => {\n        this.eventBus.once(Events.READY, resolve);\n      });\n    }\n  }\n  handshake() {\n    var _a;\n    (_a = this.source) === null || _a === void 0 ? void 0 : _a.postMessage([\n      Opcodes.HANDSHAKE,\n      {\n        v: 1,\n        encoding: \"json\",\n        client_id: this.clientId,\n        frame_id: this.frameId\n      }\n    ], this.sourceOrigin);\n  }\n  addOnReadyListener() {\n    this.eventBus.once(Events.READY, () => {\n      this.overrideConsoleLogging();\n      this.isReady = true;\n    });\n  }\n  overrideConsoleLogging() {\n    if (this.configuration.disableConsoleLogOverride)\n      return;\n    const sendCaptureLogCommand = (level, message) => {\n      this.commands.captureLog({\n        level,\n        message\n      });\n    };\n    consoleLevels.forEach((level) => {\n      wrapConsoleMethod(console, level, sendCaptureLogCommand);\n    });\n  }\n  handleClose(data) {\n    ClosePayload.parse(data);\n  }\n  handleHandshake() {\n  }\n  handleFrame(payload) {\n    var _a, _b;\n    let parsed;\n    try {\n      parsed = parseIncomingPayload(payload);\n    } catch (e) {\n      console.error(\"Failed to parse\", payload);\n      console.error(e);\n      return;\n    }\n    if (parsed.cmd === \"DISPATCH\") {\n      this.eventBus.emit(parsed.evt, parsed.data);\n    } else {\n      if (parsed.evt === ERROR) {\n        if (parsed.nonce != null) {\n          (_a = this.pendingCommands.get(parsed.nonce)) === null || _a === void 0 ? void 0 : _a.reject(parsed.data);\n          this.pendingCommands.delete(parsed.nonce);\n          return;\n        }\n        this.eventBus.emit(\"error\", new SDKError(parsed.data.code, parsed.data.message));\n      }\n      if (parsed.nonce == null) {\n        console.error(\"Missing nonce\", payload);\n        return;\n      }\n      (_b = this.pendingCommands.get(parsed.nonce)) === null || _b === void 0 ? void 0 : _b.resolve(parsed);\n      this.pendingCommands.delete(parsed.nonce);\n    }\n  }\n  _getSearch() {\n    return typeof window === \"undefined\" ? \"\" : window.location.search;\n  }\n}\nfunction can(permission, permissions) {\n  return BigFlagUtils.has(BigFlagUtils.deserialize(permissions), permission);\n}\nvar PermissionUtils = {\n  can\n};\nvar MAX_DIGITS = 1e9, defaults = {\n  precision: 20,\n  rounding: 4,\n  toExpNeg: -7,\n  toExpPos: 21,\n  LN10: \"2.302585092994045684017991454684364207601101488628772976033327900967572609677352480235997205089598298341967784042286\"\n}, Decimal, external = true, decimalError = \"[DecimalError] \", invalidArgument = decimalError + \"Invalid argument: \", exponentOutOfRange = decimalError + \"Exponent out of range: \", mathfloor = Math.floor, mathpow = Math.pow, isDecimal = /^(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i, ONE, BASE = 1e7, LOG_BASE = 7, MAX_SAFE_INTEGER = 9007199254740991, MAX_E = mathfloor(MAX_SAFE_INTEGER / LOG_BASE), P = {};\nP.absoluteValue = P.abs = function() {\n  var x = new this.constructor(this);\n  if (x.s)\n    x.s = 1;\n  return x;\n};\nP.comparedTo = P.cmp = function(y) {\n  var i, j, xdL, ydL, x = this;\n  y = new x.constructor(y);\n  if (x.s !== y.s)\n    return x.s || -y.s;\n  if (x.e !== y.e)\n    return x.e > y.e ^ x.s < 0 ? 1 : -1;\n  xdL = x.d.length;\n  ydL = y.d.length;\n  for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) {\n    if (x.d[i] !== y.d[i])\n      return x.d[i] > y.d[i] ^ x.s < 0 ? 1 : -1;\n  }\n  return xdL === ydL ? 0 : xdL > ydL ^ x.s < 0 ? 1 : -1;\n};\nP.decimalPlaces = P.dp = function() {\n  var x = this, w = x.d.length - 1, dp = (w - x.e) * LOG_BASE;\n  w = x.d[w];\n  if (w)\n    for (; w % 10 == 0; w /= 10)\n      dp--;\n  return dp < 0 ? 0 : dp;\n};\nP.dividedBy = P.div = function(y) {\n  return divide(this, new this.constructor(y));\n};\nP.dividedToIntegerBy = P.idiv = function(y) {\n  var x = this, Ctor = x.constructor;\n  return round(divide(x, new Ctor(y), 0, 1), Ctor.precision);\n};\nP.equals = P.eq = function(y) {\n  return !this.cmp(y);\n};\nP.exponent = function() {\n  return getBase10Exponent(this);\n};\nP.greaterThan = P.gt = function(y) {\n  return this.cmp(y) > 0;\n};\nP.greaterThanOrEqualTo = P.gte = function(y) {\n  return this.cmp(y) >= 0;\n};\nP.isInteger = P.isint = function() {\n  return this.e > this.d.length - 2;\n};\nP.isNegative = P.isneg = function() {\n  return this.s < 0;\n};\nP.isPositive = P.ispos = function() {\n  return this.s > 0;\n};\nP.isZero = function() {\n  return this.s === 0;\n};\nP.lessThan = P.lt = function(y) {\n  return this.cmp(y) < 0;\n};\nP.lessThanOrEqualTo = P.lte = function(y) {\n  return this.cmp(y) < 1;\n};\nP.logarithm = P.log = function(base) {\n  var r, x = this, Ctor = x.constructor, pr = Ctor.precision, wpr = pr + 5;\n  if (base === void 0) {\n    base = new Ctor(10);\n  } else {\n    base = new Ctor(base);\n    if (base.s < 1 || base.eq(ONE))\n      throw Error(decimalError + \"NaN\");\n  }\n  if (x.s < 1)\n    throw Error(decimalError + (x.s ? \"NaN\" : \"-Infinity\"));\n  if (x.eq(ONE))\n    return new Ctor(0);\n  external = false;\n  r = divide(ln(x, wpr), ln(base, wpr), wpr);\n  external = true;\n  return round(r, pr);\n};\nP.minus = P.sub = function(y) {\n  var x = this;\n  y = new x.constructor(y);\n  return x.s == y.s ? subtract(x, y) : add(x, (y.s = -y.s, y));\n};\nP.modulo = P.mod = function(y) {\n  var q, x = this, Ctor = x.constructor, pr = Ctor.precision;\n  y = new Ctor(y);\n  if (!y.s)\n    throw Error(decimalError + \"NaN\");\n  if (!x.s)\n    return round(new Ctor(x), pr);\n  external = false;\n  q = divide(x, y, 0, 1).times(y);\n  external = true;\n  return x.minus(q);\n};\nP.naturalExponential = P.exp = function() {\n  return exp(this);\n};\nP.naturalLogarithm = P.ln = function() {\n  return ln(this);\n};\nP.negated = P.neg = function() {\n  var x = new this.constructor(this);\n  x.s = -x.s || 0;\n  return x;\n};\nP.plus = P.add = function(y) {\n  var x = this;\n  y = new x.constructor(y);\n  return x.s == y.s ? add(x, y) : subtract(x, (y.s = -y.s, y));\n};\nP.precision = P.sd = function(z2) {\n  var e, sd, w, x = this;\n  if (z2 !== void 0 && z2 !== !!z2 && z2 !== 1 && z2 !== 0)\n    throw Error(invalidArgument + z2);\n  e = getBase10Exponent(x) + 1;\n  w = x.d.length - 1;\n  sd = w * LOG_BASE + 1;\n  w = x.d[w];\n  if (w) {\n    for (; w % 10 == 0; w /= 10)\n      sd--;\n    for (w = x.d[0]; w >= 10; w /= 10)\n      sd++;\n  }\n  return z2 && e > sd ? e : sd;\n};\nP.squareRoot = P.sqrt = function() {\n  var e, n, pr, r, s, t, wpr, x = this, Ctor = x.constructor;\n  if (x.s < 1) {\n    if (!x.s)\n      return new Ctor(0);\n    throw Error(decimalError + \"NaN\");\n  }\n  e = getBase10Exponent(x);\n  external = false;\n  s = Math.sqrt(+x);\n  if (s == 0 || s == 1 / 0) {\n    n = digitsToString(x.d);\n    if ((n.length + e) % 2 == 0)\n      n += \"0\";\n    s = Math.sqrt(n);\n    e = mathfloor((e + 1) / 2) - (e < 0 || e % 2);\n    if (s == 1 / 0) {\n      n = \"1e\" + e;\n    } else {\n      n = s.toExponential();\n      n = n.slice(0, n.indexOf(\"e\") + 1) + e;\n    }\n    r = new Ctor(n);\n  } else {\n    r = new Ctor(s.toString());\n  }\n  pr = Ctor.precision;\n  s = wpr = pr + 3;\n  for (; ; ) {\n    t = r;\n    r = t.plus(divide(x, t, wpr + 2)).times(0.5);\n    if (digitsToString(t.d).slice(0, wpr) === (n = digitsToString(r.d)).slice(0, wpr)) {\n      n = n.slice(wpr - 3, wpr + 1);\n      if (s == wpr && n == \"4999\") {\n        round(t, pr + 1, 0);\n        if (t.times(t).eq(x)) {\n          r = t;\n          break;\n        }\n      } else if (n != \"9999\") {\n        break;\n      }\n      wpr += 4;\n    }\n  }\n  external = true;\n  return round(r, pr);\n};\nP.times = P.mul = function(y) {\n  var carry, e, i, k, r, rL, t, xdL, ydL, x = this, Ctor = x.constructor, xd = x.d, yd = (y = new Ctor(y)).d;\n  if (!x.s || !y.s)\n    return new Ctor(0);\n  y.s *= x.s;\n  e = x.e + y.e;\n  xdL = xd.length;\n  ydL = yd.length;\n  if (xdL < ydL) {\n    r = xd;\n    xd = yd;\n    yd = r;\n    rL = xdL;\n    xdL = ydL;\n    ydL = rL;\n  }\n  r = [];\n  rL = xdL + ydL;\n  for (i = rL; i--; )\n    r.push(0);\n  for (i = ydL; --i >= 0; ) {\n    carry = 0;\n    for (k = xdL + i; k > i; ) {\n      t = r[k] + yd[i] * xd[k - i - 1] + carry;\n      r[k--] = t % BASE | 0;\n      carry = t / BASE | 0;\n    }\n    r[k] = (r[k] + carry) % BASE | 0;\n  }\n  for (; !r[--rL]; )\n    r.pop();\n  if (carry)\n    ++e;\n  else\n    r.shift();\n  y.d = r;\n  y.e = e;\n  return external ? round(y, Ctor.precision) : y;\n};\nP.toDecimalPlaces = P.todp = function(dp, rm) {\n  var x = this, Ctor = x.constructor;\n  x = new Ctor(x);\n  if (dp === void 0)\n    return x;\n  checkInt32(dp, 0, MAX_DIGITS);\n  if (rm === void 0)\n    rm = Ctor.rounding;\n  else\n    checkInt32(rm, 0, 8);\n  return round(x, dp + getBase10Exponent(x) + 1, rm);\n};\nP.toExponential = function(dp, rm) {\n  var str, x = this, Ctor = x.constructor;\n  if (dp === void 0) {\n    str = toString(x, true);\n  } else {\n    checkInt32(dp, 0, MAX_DIGITS);\n    if (rm === void 0)\n      rm = Ctor.rounding;\n    else\n      checkInt32(rm, 0, 8);\n    x = round(new Ctor(x), dp + 1, rm);\n    str = toString(x, true, dp + 1);\n  }\n  return str;\n};\nP.toFixed = function(dp, rm) {\n  var str, y, x = this, Ctor = x.constructor;\n  if (dp === void 0)\n    return toString(x);\n  checkInt32(dp, 0, MAX_DIGITS);\n  if (rm === void 0)\n    rm = Ctor.rounding;\n  else\n    checkInt32(rm, 0, 8);\n  y = round(new Ctor(x), dp + getBase10Exponent(x) + 1, rm);\n  str = toString(y.abs(), false, dp + getBase10Exponent(y) + 1);\n  return x.isneg() && !x.isZero() ? \"-\" + str : str;\n};\nP.toInteger = P.toint = function() {\n  var x = this, Ctor = x.constructor;\n  return round(new Ctor(x), getBase10Exponent(x) + 1, Ctor.rounding);\n};\nP.toNumber = function() {\n  return +this;\n};\nP.toPower = P.pow = function(y) {\n  var e, k, pr, r, sign, yIsInt, x = this, Ctor = x.constructor, guard = 12, yn = +(y = new Ctor(y));\n  if (!y.s)\n    return new Ctor(ONE);\n  x = new Ctor(x);\n  if (!x.s) {\n    if (y.s < 1)\n      throw Error(decimalError + \"Infinity\");\n    return x;\n  }\n  if (x.eq(ONE))\n    return x;\n  pr = Ctor.precision;\n  if (y.eq(ONE))\n    return round(x, pr);\n  e = y.e;\n  k = y.d.length - 1;\n  yIsInt = e >= k;\n  sign = x.s;\n  if (!yIsInt) {\n    if (sign < 0)\n      throw Error(decimalError + \"NaN\");\n  } else if ((k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) {\n    r = new Ctor(ONE);\n    e = Math.ceil(pr / LOG_BASE + 4);\n    external = false;\n    for (; ; ) {\n      if (k % 2) {\n        r = r.times(x);\n        truncate(r.d, e);\n      }\n      k = mathfloor(k / 2);\n      if (k === 0)\n        break;\n      x = x.times(x);\n      truncate(x.d, e);\n    }\n    external = true;\n    return y.s < 0 ? new Ctor(ONE).div(r) : round(r, pr);\n  }\n  sign = sign < 0 && y.d[Math.max(e, k)] & 1 ? -1 : 1;\n  x.s = 1;\n  external = false;\n  r = y.times(ln(x, pr + guard));\n  external = true;\n  r = exp(r);\n  r.s = sign;\n  return r;\n};\nP.toPrecision = function(sd, rm) {\n  var e, str, x = this, Ctor = x.constructor;\n  if (sd === void 0) {\n    e = getBase10Exponent(x);\n    str = toString(x, e <= Ctor.toExpNeg || e >= Ctor.toExpPos);\n  } else {\n    checkInt32(sd, 1, MAX_DIGITS);\n    if (rm === void 0)\n      rm = Ctor.rounding;\n    else\n      checkInt32(rm, 0, 8);\n    x = round(new Ctor(x), sd, rm);\n    e = getBase10Exponent(x);\n    str = toString(x, sd <= e || e <= Ctor.toExpNeg, sd);\n  }\n  return str;\n};\nP.toSignificantDigits = P.tosd = function(sd, rm) {\n  var x = this, Ctor = x.constructor;\n  if (sd === void 0) {\n    sd = Ctor.precision;\n    rm = Ctor.rounding;\n  } else {\n    checkInt32(sd, 1, MAX_DIGITS);\n    if (rm === void 0)\n      rm = Ctor.rounding;\n    else\n      checkInt32(rm, 0, 8);\n  }\n  return round(new Ctor(x), sd, rm);\n};\nP.toString = P.valueOf = P.val = P.toJSON = P[Symbol.for(\"nodejs.util.inspect.custom\")] = function() {\n  var x = this, e = getBase10Exponent(x), Ctor = x.constructor;\n  return toString(x, e <= Ctor.toExpNeg || e >= Ctor.toExpPos);\n};\nfunction add(x, y) {\n  var carry, d, e, i, k, len, xd, yd, Ctor = x.constructor, pr = Ctor.precision;\n  if (!x.s || !y.s) {\n    if (!y.s)\n      y = new Ctor(x);\n    return external ? round(y, pr) : y;\n  }\n  xd = x.d;\n  yd = y.d;\n  k = x.e;\n  e = y.e;\n  xd = xd.slice();\n  i = k - e;\n  if (i) {\n    if (i < 0) {\n      d = xd;\n      i = -i;\n      len = yd.length;\n    } else {\n      d = yd;\n      e = k;\n      len = xd.length;\n    }\n    k = Math.ceil(pr / LOG_BASE);\n    len = k > len ? k + 1 : len + 1;\n    if (i > len) {\n      i = len;\n      d.length = 1;\n    }\n    d.reverse();\n    for (; i--; )\n      d.push(0);\n    d.reverse();\n  }\n  len = xd.length;\n  i = yd.length;\n  if (len - i < 0) {\n    i = len;\n    d = yd;\n    yd = xd;\n    xd = d;\n  }\n  for (carry = 0; i; ) {\n    carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0;\n    xd[i] %= BASE;\n  }\n  if (carry) {\n    xd.unshift(carry);\n    ++e;\n  }\n  for (len = xd.length; xd[--len] == 0; )\n    xd.pop();\n  y.d = xd;\n  y.e = e;\n  return external ? round(y, pr) : y;\n}\nfunction checkInt32(i, min, max) {\n  if (i !== ~~i || i < min || i > max) {\n    throw Error(invalidArgument + i);\n  }\n}\nfunction digitsToString(d) {\n  var i, k, ws, indexOfLastWord = d.length - 1, str = \"\", w = d[0];\n  if (indexOfLastWord > 0) {\n    str += w;\n    for (i = 1; i < indexOfLastWord; i++) {\n      ws = d[i] + \"\";\n      k = LOG_BASE - ws.length;\n      if (k)\n        str += getZeroString(k);\n      str += ws;\n    }\n    w = d[i];\n    ws = w + \"\";\n    k = LOG_BASE - ws.length;\n    if (k)\n      str += getZeroString(k);\n  } else if (w === 0) {\n    return \"0\";\n  }\n  for (; w % 10 === 0; )\n    w /= 10;\n  return str + w;\n}\nvar divide = function() {\n  function multiplyInteger(x, k) {\n    var temp, carry = 0, i = x.length;\n    for (x = x.slice(); i--; ) {\n      temp = x[i] * k + carry;\n      x[i] = temp % BASE | 0;\n      carry = temp / BASE | 0;\n    }\n    if (carry)\n      x.unshift(carry);\n    return x;\n  }\n  function compare(a, b, aL, bL) {\n    var i, r;\n    if (aL != bL) {\n      r = aL > bL ? 1 : -1;\n    } else {\n      for (i = r = 0; i < aL; i++) {\n        if (a[i] != b[i]) {\n          r = a[i] > b[i] ? 1 : -1;\n          break;\n        }\n      }\n    }\n    return r;\n  }\n  function subtract2(a, b, aL) {\n    var i = 0;\n    for (; aL--; ) {\n      a[aL] -= i;\n      i = a[aL] < b[aL] ? 1 : 0;\n      a[aL] = i * BASE + a[aL] - b[aL];\n    }\n    for (; !a[0] && a.length > 1; )\n      a.shift();\n  }\n  return function(x, y, pr, dp) {\n    var cmp, e, i, k, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0, yL, yz, Ctor = x.constructor, sign = x.s == y.s ? 1 : -1, xd = x.d, yd = y.d;\n    if (!x.s)\n      return new Ctor(x);\n    if (!y.s)\n      throw Error(decimalError + \"Division by zero\");\n    e = x.e - y.e;\n    yL = yd.length;\n    xL = xd.length;\n    q = new Ctor(sign);\n    qd = q.d = [];\n    for (i = 0; yd[i] == (xd[i] || 0); )\n      ++i;\n    if (yd[i] > (xd[i] || 0))\n      --e;\n    if (pr == null) {\n      sd = pr = Ctor.precision;\n    } else if (dp) {\n      sd = pr + (getBase10Exponent(x) - getBase10Exponent(y)) + 1;\n    } else {\n      sd = pr;\n    }\n    if (sd < 0)\n      return new Ctor(0);\n    sd = sd / LOG_BASE + 2 | 0;\n    i = 0;\n    if (yL == 1) {\n      k = 0;\n      yd = yd[0];\n      sd++;\n      for (; (i < xL || k) && sd--; i++) {\n        t = k * BASE + (xd[i] || 0);\n        qd[i] = t / yd | 0;\n        k = t % yd | 0;\n      }\n    } else {\n      k = BASE / (yd[0] + 1) | 0;\n      if (k > 1) {\n        yd = multiplyInteger(yd, k);\n        xd = multiplyInteger(xd, k);\n        yL = yd.length;\n        xL = xd.length;\n      }\n      xi = yL;\n      rem = xd.slice(0, yL);\n      remL = rem.length;\n      for (; remL < yL; )\n        rem[remL++] = 0;\n      yz = yd.slice();\n      yz.unshift(0);\n      yd0 = yd[0];\n      if (yd[1] >= BASE / 2)\n        ++yd0;\n      do {\n        k = 0;\n        cmp = compare(yd, rem, yL, remL);\n        if (cmp < 0) {\n          rem0 = rem[0];\n          if (yL != remL)\n            rem0 = rem0 * BASE + (rem[1] || 0);\n          k = rem0 / yd0 | 0;\n          if (k > 1) {\n            if (k >= BASE)\n              k = BASE - 1;\n            prod = multiplyInteger(yd, k);\n            prodL = prod.length;\n            remL = rem.length;\n            cmp = compare(prod, rem, prodL, remL);\n            if (cmp == 1) {\n              k--;\n              subtract2(prod, yL < prodL ? yz : yd, prodL);\n            }\n          } else {\n            if (k == 0)\n              cmp = k = 1;\n            prod = yd.slice();\n          }\n          prodL = prod.length;\n          if (prodL < remL)\n            prod.unshift(0);\n          subtract2(rem, prod, remL);\n          if (cmp == -1) {\n            remL = rem.length;\n            cmp = compare(yd, rem, yL, remL);\n            if (cmp < 1) {\n              k++;\n              subtract2(rem, yL < remL ? yz : yd, remL);\n            }\n          }\n          remL = rem.length;\n        } else if (cmp === 0) {\n          k++;\n          rem = [0];\n        }\n        qd[i++] = k;\n        if (cmp && rem[0]) {\n          rem[remL++] = xd[xi] || 0;\n        } else {\n          rem = [xd[xi]];\n          remL = 1;\n        }\n      } while ((xi++ < xL || rem[0] !== void 0) && sd--);\n    }\n    if (!qd[0])\n      qd.shift();\n    q.e = e;\n    return round(q, dp ? pr + getBase10Exponent(q) + 1 : pr);\n  };\n}();\nfunction exp(x, sd) {\n  var denominator, guard, pow, sum, t, wpr, i = 0, k = 0, Ctor = x.constructor, pr = Ctor.precision;\n  if (getBase10Exponent(x) > 16)\n    throw Error(exponentOutOfRange + getBase10Exponent(x));\n  if (!x.s)\n    return new Ctor(ONE);\n  if (sd == null) {\n    external = false;\n    wpr = pr;\n  } else {\n    wpr = sd;\n  }\n  t = new Ctor(0.03125);\n  while (x.abs().gte(0.1)) {\n    x = x.times(t);\n    k += 5;\n  }\n  guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0;\n  wpr += guard;\n  denominator = pow = sum = new Ctor(ONE);\n  Ctor.precision = wpr;\n  for (; ; ) {\n    pow = round(pow.times(x), wpr);\n    denominator = denominator.times(++i);\n    t = sum.plus(divide(pow, denominator, wpr));\n    if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\n      while (k--)\n        sum = round(sum.times(sum), wpr);\n      Ctor.precision = pr;\n      return sd == null ? (external = true, round(sum, pr)) : sum;\n    }\n    sum = t;\n  }\n}\nfunction getBase10Exponent(x) {\n  var e = x.e * LOG_BASE, w = x.d[0];\n  for (; w >= 10; w /= 10)\n    e++;\n  return e;\n}\nfunction getLn10(Ctor, sd, pr) {\n  if (sd > Ctor.LN10.sd()) {\n    external = true;\n    if (pr)\n      Ctor.precision = pr;\n    throw Error(decimalError + \"LN10 precision limit exceeded\");\n  }\n  return round(new Ctor(Ctor.LN10), sd);\n}\nfunction getZeroString(k) {\n  var zs = \"\";\n  for (; k--; )\n    zs += \"0\";\n  return zs;\n}\nfunction ln(y, sd) {\n  var c, c0, denominator, e, numerator, sum, t, wpr, x2, n = 1, guard = 10, x = y, xd = x.d, Ctor = x.constructor, pr = Ctor.precision;\n  if (x.s < 1)\n    throw Error(decimalError + (x.s ? \"NaN\" : \"-Infinity\"));\n  if (x.eq(ONE))\n    return new Ctor(0);\n  if (sd == null) {\n    external = false;\n    wpr = pr;\n  } else {\n    wpr = sd;\n  }\n  if (x.eq(10)) {\n    if (sd == null)\n      external = true;\n    return getLn10(Ctor, wpr);\n  }\n  wpr += guard;\n  Ctor.precision = wpr;\n  c = digitsToString(xd);\n  c0 = c.charAt(0);\n  e = getBase10Exponent(x);\n  if (Math.abs(e) < 15e14) {\n    while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) {\n      x = x.times(y);\n      c = digitsToString(x.d);\n      c0 = c.charAt(0);\n      n++;\n    }\n    e = getBase10Exponent(x);\n    if (c0 > 1) {\n      x = new Ctor(\"0.\" + c);\n      e++;\n    } else {\n      x = new Ctor(c0 + \".\" + c.slice(1));\n    }\n  } else {\n    t = getLn10(Ctor, wpr + 2, pr).times(e + \"\");\n    x = ln(new Ctor(c0 + \".\" + c.slice(1)), wpr - guard).plus(t);\n    Ctor.precision = pr;\n    return sd == null ? (external = true, round(x, pr)) : x;\n  }\n  sum = numerator = x = divide(x.minus(ONE), x.plus(ONE), wpr);\n  x2 = round(x.times(x), wpr);\n  denominator = 3;\n  for (; ; ) {\n    numerator = round(numerator.times(x2), wpr);\n    t = sum.plus(divide(numerator, new Ctor(denominator), wpr));\n    if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\n      sum = sum.times(2);\n      if (e !== 0)\n        sum = sum.plus(getLn10(Ctor, wpr + 2, pr).times(e + \"\"));\n      sum = divide(sum, new Ctor(n), wpr);\n      Ctor.precision = pr;\n      return sd == null ? (external = true, round(sum, pr)) : sum;\n    }\n    sum = t;\n    denominator += 2;\n  }\n}\nfunction parseDecimal(x, str) {\n  var e, i, len;\n  if ((e = str.indexOf(\".\")) > -1)\n    str = str.replace(\".\", \"\");\n  if ((i = str.search(/e/i)) > 0) {\n    if (e < 0)\n      e = i;\n    e += +str.slice(i + 1);\n    str = str.substring(0, i);\n  } else if (e < 0) {\n    e = str.length;\n  }\n  for (i = 0; str.charCodeAt(i) === 48; )\n    ++i;\n  for (len = str.length; str.charCodeAt(len - 1) === 48; )\n    --len;\n  str = str.slice(i, len);\n  if (str) {\n    len -= i;\n    e = e - i - 1;\n    x.e = mathfloor(e / LOG_BASE);\n    x.d = [];\n    i = (e + 1) % LOG_BASE;\n    if (e < 0)\n      i += LOG_BASE;\n    if (i < len) {\n      if (i)\n        x.d.push(+str.slice(0, i));\n      for (len -= LOG_BASE; i < len; )\n        x.d.push(+str.slice(i, i += LOG_BASE));\n      str = str.slice(i);\n      i = LOG_BASE - str.length;\n    } else {\n      i -= len;\n    }\n    for (; i--; )\n      str += \"0\";\n    x.d.push(+str);\n    if (external && (x.e > MAX_E || x.e < -MAX_E))\n      throw Error(exponentOutOfRange + e);\n  } else {\n    x.s = 0;\n    x.e = 0;\n    x.d = [0];\n  }\n  return x;\n}\nfunction round(x, sd, rm) {\n  var i, j, k, n, rd, doRound, w, xdi, xd = x.d;\n  for (n = 1, k = xd[0]; k >= 10; k /= 10)\n    n++;\n  i = sd - n;\n  if (i < 0) {\n    i += LOG_BASE;\n    j = sd;\n    w = xd[xdi = 0];\n  } else {\n    xdi = Math.ceil((i + 1) / LOG_BASE);\n    k = xd.length;\n    if (xdi >= k)\n      return x;\n    w = k = xd[xdi];\n    for (n = 1; k >= 10; k /= 10)\n      n++;\n    i %= LOG_BASE;\n    j = i - LOG_BASE + n;\n  }\n  if (rm !== void 0) {\n    k = mathpow(10, n - j - 1);\n    rd = w / k % 10 | 0;\n    doRound = sd < 0 || xd[xdi + 1] !== void 0 || w % k;\n    doRound = rm < 4 ? (rd || doRound) && (rm == 0 || rm == (x.s < 0 ? 3 : 2)) : rd > 5 || rd == 5 && (rm == 4 || doRound || rm == 6 && (i > 0 ? j > 0 ? w / mathpow(10, n - j) : 0 : xd[xdi - 1]) % 10 & 1 || rm == (x.s < 0 ? 8 : 7));\n  }\n  if (sd < 1 || !xd[0]) {\n    if (doRound) {\n      k = getBase10Exponent(x);\n      xd.length = 1;\n      sd = sd - k - 1;\n      xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE);\n      x.e = mathfloor(-sd / LOG_BASE) || 0;\n    } else {\n      xd.length = 1;\n      xd[0] = x.e = x.s = 0;\n    }\n    return x;\n  }\n  if (i == 0) {\n    xd.length = xdi;\n    k = 1;\n    xdi--;\n  } else {\n    xd.length = xdi + 1;\n    k = mathpow(10, LOG_BASE - i);\n    xd[xdi] = j > 0 ? (w / mathpow(10, n - j) % mathpow(10, j) | 0) * k : 0;\n  }\n  if (doRound) {\n    for (; ; ) {\n      if (xdi == 0) {\n        if ((xd[0] += k) == BASE) {\n          xd[0] = 1;\n          ++x.e;\n        }\n        break;\n      } else {\n        xd[xdi] += k;\n        if (xd[xdi] != BASE)\n          break;\n        xd[xdi--] = 0;\n        k = 1;\n      }\n    }\n  }\n  for (i = xd.length; xd[--i] === 0; )\n    xd.pop();\n  if (external && (x.e > MAX_E || x.e < -MAX_E)) {\n    throw Error(exponentOutOfRange + getBase10Exponent(x));\n  }\n  return x;\n}\nfunction subtract(x, y) {\n  var d, e, i, j, k, len, xd, xe, xLTy, yd, Ctor = x.constructor, pr = Ctor.precision;\n  if (!x.s || !y.s) {\n    if (y.s)\n      y.s = -y.s;\n    else\n      y = new Ctor(x);\n    return external ? round(y, pr) : y;\n  }\n  xd = x.d;\n  yd = y.d;\n  e = y.e;\n  xe = x.e;\n  xd = xd.slice();\n  k = xe - e;\n  if (k) {\n    xLTy = k < 0;\n    if (xLTy) {\n      d = xd;\n      k = -k;\n      len = yd.length;\n    } else {\n      d = yd;\n      e = xe;\n      len = xd.length;\n    }\n    i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2;\n    if (k > i) {\n      k = i;\n      d.length = 1;\n    }\n    d.reverse();\n    for (i = k; i--; )\n      d.push(0);\n    d.reverse();\n  } else {\n    i = xd.length;\n    len = yd.length;\n    xLTy = i < len;\n    if (xLTy)\n      len = i;\n    for (i = 0; i < len; i++) {\n      if (xd[i] != yd[i]) {\n        xLTy = xd[i] < yd[i];\n        break;\n      }\n    }\n    k = 0;\n  }\n  if (xLTy) {\n    d = xd;\n    xd = yd;\n    yd = d;\n    y.s = -y.s;\n  }\n  len = xd.length;\n  for (i = yd.length - len; i > 0; --i)\n    xd[len++] = 0;\n  for (i = yd.length; i > k; ) {\n    if (xd[--i] < yd[i]) {\n      for (j = i; j && xd[--j] === 0; )\n        xd[j] = BASE - 1;\n      --xd[j];\n      xd[i] += BASE;\n    }\n    xd[i] -= yd[i];\n  }\n  for (; xd[--len] === 0; )\n    xd.pop();\n  for (; xd[0] === 0; xd.shift())\n    --e;\n  if (!xd[0])\n    return new Ctor(0);\n  y.d = xd;\n  y.e = e;\n  return external ? round(y, pr) : y;\n}\nfunction toString(x, isExp, sd) {\n  var k, e = getBase10Exponent(x), str = digitsToString(x.d), len = str.length;\n  if (isExp) {\n    if (sd && (k = sd - len) > 0) {\n      str = str.charAt(0) + \".\" + str.slice(1) + getZeroString(k);\n    } else if (len > 1) {\n      str = str.charAt(0) + \".\" + str.slice(1);\n    }\n    str = str + (e < 0 ? \"e\" : \"e+\") + e;\n  } else if (e < 0) {\n    str = \"0.\" + getZeroString(-e - 1) + str;\n    if (sd && (k = sd - len) > 0)\n      str += getZeroString(k);\n  } else if (e >= len) {\n    str += getZeroString(e + 1 - len);\n    if (sd && (k = sd - e - 1) > 0)\n      str = str + \".\" + getZeroString(k);\n  } else {\n    if ((k = e + 1) < len)\n      str = str.slice(0, k) + \".\" + str.slice(k);\n    if (sd && (k = sd - len) > 0) {\n      if (e + 1 === len)\n        str += \".\";\n      str += getZeroString(k);\n    }\n  }\n  return x.s < 0 ? \"-\" + str : str;\n}\nfunction truncate(arr, len) {\n  if (arr.length > len) {\n    arr.length = len;\n    return true;\n  }\n}\nfunction clone(obj) {\n  var i, p, ps;\n  function Decimal2(value) {\n    var x = this;\n    if (!(x instanceof Decimal2))\n      return new Decimal2(value);\n    x.constructor = Decimal2;\n    if (value instanceof Decimal2) {\n      x.s = value.s;\n      x.e = value.e;\n      x.d = (value = value.d) ? value.slice() : value;\n      return;\n    }\n    if (typeof value === \"number\") {\n      if (value * 0 !== 0) {\n        throw Error(invalidArgument + value);\n      }\n      if (value > 0) {\n        x.s = 1;\n      } else if (value < 0) {\n        value = -value;\n        x.s = -1;\n      } else {\n        x.s = 0;\n        x.e = 0;\n        x.d = [0];\n        return;\n      }\n      if (value === ~~value && value < 1e7) {\n        x.e = 0;\n        x.d = [value];\n        return;\n      }\n      return parseDecimal(x, value.toString());\n    } else if (typeof value !== \"string\") {\n      throw Error(invalidArgument + value);\n    }\n    if (value.charCodeAt(0) === 45) {\n      value = value.slice(1);\n      x.s = -1;\n    } else {\n      x.s = 1;\n    }\n    if (isDecimal.test(value))\n      parseDecimal(x, value);\n    else\n      throw Error(invalidArgument + value);\n  }\n  Decimal2.prototype = P;\n  Decimal2.ROUND_UP = 0;\n  Decimal2.ROUND_DOWN = 1;\n  Decimal2.ROUND_CEIL = 2;\n  Decimal2.ROUND_FLOOR = 3;\n  Decimal2.ROUND_HALF_UP = 4;\n  Decimal2.ROUND_HALF_DOWN = 5;\n  Decimal2.ROUND_HALF_EVEN = 6;\n  Decimal2.ROUND_HALF_CEIL = 7;\n  Decimal2.ROUND_HALF_FLOOR = 8;\n  Decimal2.clone = clone;\n  Decimal2.config = Decimal2.set = config;\n  if (obj === void 0)\n    obj = {};\n  if (obj) {\n    ps = [\"precision\", \"rounding\", \"toExpNeg\", \"toExpPos\", \"LN10\"];\n    for (i = 0; i < ps.length; )\n      if (!obj.hasOwnProperty(p = ps[i++]))\n        obj[p] = this[p];\n  }\n  Decimal2.config(obj);\n  return Decimal2;\n}\nfunction config(obj) {\n  if (!obj || typeof obj !== \"object\") {\n    throw Error(decimalError + \"Object expected\");\n  }\n  var i, p, v, ps = [\n    \"precision\",\n    1,\n    MAX_DIGITS,\n    \"rounding\",\n    0,\n    8,\n    \"toExpNeg\",\n    -1 / 0,\n    0,\n    \"toExpPos\",\n    0,\n    1 / 0\n  ];\n  for (i = 0; i < ps.length; i += 3) {\n    if ((v = obj[p = ps[i]]) !== void 0) {\n      if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2])\n        this[p] = v;\n      else\n        throw Error(invalidArgument + p + \": \" + v);\n    }\n  }\n  if ((v = obj[p = \"LN10\"]) !== void 0) {\n    if (v == Math.LN10)\n      this[p] = new this(v);\n    else\n      throw Error(invalidArgument + p + \": \" + v);\n  }\n  return this;\n}\nvar Decimal = clone(defaults);\nONE = new Decimal(1);\nvar Decimal$1 = Decimal;\nvar CurrencyCodes;\n(function(CurrencyCodes2) {\n  CurrencyCodes2[\"AED\"] = \"aed\";\n  CurrencyCodes2[\"AFN\"] = \"afn\";\n  CurrencyCodes2[\"ALL\"] = \"all\";\n  CurrencyCodes2[\"AMD\"] = \"amd\";\n  CurrencyCodes2[\"ANG\"] = \"ang\";\n  CurrencyCodes2[\"AOA\"] = \"aoa\";\n  CurrencyCodes2[\"ARS\"] = \"ars\";\n  CurrencyCodes2[\"AUD\"] = \"aud\";\n  CurrencyCodes2[\"AWG\"] = \"awg\";\n  CurrencyCodes2[\"AZN\"] = \"azn\";\n  CurrencyCodes2[\"BAM\"] = \"bam\";\n  CurrencyCodes2[\"BBD\"] = \"bbd\";\n  CurrencyCodes2[\"BDT\"] = \"bdt\";\n  CurrencyCodes2[\"BGN\"] = \"bgn\";\n  CurrencyCodes2[\"BHD\"] = \"bhd\";\n  CurrencyCodes2[\"BIF\"] = \"bif\";\n  CurrencyCodes2[\"BMD\"] = \"bmd\";\n  CurrencyCodes2[\"BND\"] = \"bnd\";\n  CurrencyCodes2[\"BOB\"] = \"bob\";\n  CurrencyCodes2[\"BOV\"] = \"bov\";\n  CurrencyCodes2[\"BRL\"] = \"brl\";\n  CurrencyCodes2[\"BSD\"] = \"bsd\";\n  CurrencyCodes2[\"BTN\"] = \"btn\";\n  CurrencyCodes2[\"BWP\"] = \"bwp\";\n  CurrencyCodes2[\"BYN\"] = \"byn\";\n  CurrencyCodes2[\"BYR\"] = \"byr\";\n  CurrencyCodes2[\"BZD\"] = \"bzd\";\n  CurrencyCodes2[\"CAD\"] = \"cad\";\n  CurrencyCodes2[\"CDF\"] = \"cdf\";\n  CurrencyCodes2[\"CHE\"] = \"che\";\n  CurrencyCodes2[\"CHF\"] = \"chf\";\n  CurrencyCodes2[\"CHW\"] = \"chw\";\n  CurrencyCodes2[\"CLF\"] = \"clf\";\n  CurrencyCodes2[\"CLP\"] = \"clp\";\n  CurrencyCodes2[\"CNY\"] = \"cny\";\n  CurrencyCodes2[\"COP\"] = \"cop\";\n  CurrencyCodes2[\"COU\"] = \"cou\";\n  CurrencyCodes2[\"CRC\"] = \"crc\";\n  CurrencyCodes2[\"CUC\"] = \"cuc\";\n  CurrencyCodes2[\"CUP\"] = \"cup\";\n  CurrencyCodes2[\"CVE\"] = \"cve\";\n  CurrencyCodes2[\"CZK\"] = \"czk\";\n  CurrencyCodes2[\"DJF\"] = \"djf\";\n  CurrencyCodes2[\"DKK\"] = \"dkk\";\n  CurrencyCodes2[\"DOP\"] = \"dop\";\n  CurrencyCodes2[\"DZD\"] = \"dzd\";\n  CurrencyCodes2[\"EGP\"] = \"egp\";\n  CurrencyCodes2[\"ERN\"] = \"ern\";\n  CurrencyCodes2[\"ETB\"] = \"etb\";\n  CurrencyCodes2[\"EUR\"] = \"eur\";\n  CurrencyCodes2[\"FJD\"] = \"fjd\";\n  CurrencyCodes2[\"FKP\"] = \"fkp\";\n  CurrencyCodes2[\"GBP\"] = \"gbp\";\n  CurrencyCodes2[\"GEL\"] = \"gel\";\n  CurrencyCodes2[\"GHS\"] = \"ghs\";\n  CurrencyCodes2[\"GIP\"] = \"gip\";\n  CurrencyCodes2[\"GMD\"] = \"gmd\";\n  CurrencyCodes2[\"GNF\"] = \"gnf\";\n  CurrencyCodes2[\"GTQ\"] = \"gtq\";\n  CurrencyCodes2[\"GYD\"] = \"gyd\";\n  CurrencyCodes2[\"HKD\"] = \"hkd\";\n  CurrencyCodes2[\"HNL\"] = \"hnl\";\n  CurrencyCodes2[\"HRK\"] = \"hrk\";\n  CurrencyCodes2[\"HTG\"] = \"htg\";\n  CurrencyCodes2[\"HUF\"] = \"huf\";\n  CurrencyCodes2[\"IDR\"] = \"idr\";\n  CurrencyCodes2[\"ILS\"] = \"ils\";\n  CurrencyCodes2[\"INR\"] = \"inr\";\n  CurrencyCodes2[\"IQD\"] = \"iqd\";\n  CurrencyCodes2[\"IRR\"] = \"irr\";\n  CurrencyCodes2[\"ISK\"] = \"isk\";\n  CurrencyCodes2[\"JMD\"] = \"jmd\";\n  CurrencyCodes2[\"JOD\"] = \"jod\";\n  CurrencyCodes2[\"JPY\"] = \"jpy\";\n  CurrencyCodes2[\"KES\"] = \"kes\";\n  CurrencyCodes2[\"KGS\"] = \"kgs\";\n  CurrencyCodes2[\"KHR\"] = \"khr\";\n  CurrencyCodes2[\"KMF\"] = \"kmf\";\n  CurrencyCodes2[\"KPW\"] = \"kpw\";\n  CurrencyCodes2[\"KRW\"] = \"krw\";\n  CurrencyCodes2[\"KWD\"] = \"kwd\";\n  CurrencyCodes2[\"KYD\"] = \"kyd\";\n  CurrencyCodes2[\"KZT\"] = \"kzt\";\n  CurrencyCodes2[\"LAK\"] = \"lak\";\n  CurrencyCodes2[\"LBP\"] = \"lbp\";\n  CurrencyCodes2[\"LKR\"] = \"lkr\";\n  CurrencyCodes2[\"LRD\"] = \"lrd\";\n  CurrencyCodes2[\"LSL\"] = \"lsl\";\n  CurrencyCodes2[\"LTL\"] = \"ltl\";\n  CurrencyCodes2[\"LVL\"] = \"lvl\";\n  CurrencyCodes2[\"LYD\"] = \"lyd\";\n  CurrencyCodes2[\"MAD\"] = \"mad\";\n  CurrencyCodes2[\"MDL\"] = \"mdl\";\n  CurrencyCodes2[\"MGA\"] = \"mga\";\n  CurrencyCodes2[\"MKD\"] = \"mkd\";\n  CurrencyCodes2[\"MMK\"] = \"mmk\";\n  CurrencyCodes2[\"MNT\"] = \"mnt\";\n  CurrencyCodes2[\"MOP\"] = \"mop\";\n  CurrencyCodes2[\"MRO\"] = \"mro\";\n  CurrencyCodes2[\"MUR\"] = \"mur\";\n  CurrencyCodes2[\"MVR\"] = \"mvr\";\n  CurrencyCodes2[\"MWK\"] = \"mwk\";\n  CurrencyCodes2[\"MXN\"] = \"mxn\";\n  CurrencyCodes2[\"MXV\"] = \"mxv\";\n  CurrencyCodes2[\"MYR\"] = \"myr\";\n  CurrencyCodes2[\"MZN\"] = \"mzn\";\n  CurrencyCodes2[\"NAD\"] = \"nad\";\n  CurrencyCodes2[\"NGN\"] = \"ngn\";\n  CurrencyCodes2[\"NIO\"] = \"nio\";\n  CurrencyCodes2[\"NOK\"] = \"nok\";\n  CurrencyCodes2[\"NPR\"] = \"npr\";\n  CurrencyCodes2[\"NZD\"] = \"nzd\";\n  CurrencyCodes2[\"OMR\"] = \"omr\";\n  CurrencyCodes2[\"PAB\"] = \"pab\";\n  CurrencyCodes2[\"PEN\"] = \"pen\";\n  CurrencyCodes2[\"PGK\"] = \"pgk\";\n  CurrencyCodes2[\"PHP\"] = \"php\";\n  CurrencyCodes2[\"PKR\"] = \"pkr\";\n  CurrencyCodes2[\"PLN\"] = \"pln\";\n  CurrencyCodes2[\"PYG\"] = \"pyg\";\n  CurrencyCodes2[\"QAR\"] = \"qar\";\n  CurrencyCodes2[\"RON\"] = \"ron\";\n  CurrencyCodes2[\"RSD\"] = \"rsd\";\n  CurrencyCodes2[\"RUB\"] = \"rub\";\n  CurrencyCodes2[\"RWF\"] = \"rwf\";\n  CurrencyCodes2[\"SAR\"] = \"sar\";\n  CurrencyCodes2[\"SBD\"] = \"sbd\";\n  CurrencyCodes2[\"SCR\"] = \"scr\";\n  CurrencyCodes2[\"SDG\"] = \"sdg\";\n  CurrencyCodes2[\"SEK\"] = \"sek\";\n  CurrencyCodes2[\"SGD\"] = \"sgd\";\n  CurrencyCodes2[\"SHP\"] = \"shp\";\n  CurrencyCodes2[\"SLL\"] = \"sll\";\n  CurrencyCodes2[\"SOS\"] = \"sos\";\n  CurrencyCodes2[\"SRD\"] = \"srd\";\n  CurrencyCodes2[\"SSP\"] = \"ssp\";\n  CurrencyCodes2[\"STD\"] = \"std\";\n  CurrencyCodes2[\"SVC\"] = \"svc\";\n  CurrencyCodes2[\"SYP\"] = \"syp\";\n  CurrencyCodes2[\"SZL\"] = \"szl\";\n  CurrencyCodes2[\"THB\"] = \"thb\";\n  CurrencyCodes2[\"TJS\"] = \"tjs\";\n  CurrencyCodes2[\"TMT\"] = \"tmt\";\n  CurrencyCodes2[\"TND\"] = \"tnd\";\n  CurrencyCodes2[\"TOP\"] = \"top\";\n  CurrencyCodes2[\"TRY\"] = \"try\";\n  CurrencyCodes2[\"TTD\"] = \"ttd\";\n  CurrencyCodes2[\"TWD\"] = \"twd\";\n  CurrencyCodes2[\"TZS\"] = \"tzs\";\n  CurrencyCodes2[\"UAH\"] = \"uah\";\n  CurrencyCodes2[\"UGX\"] = \"ugx\";\n  CurrencyCodes2[\"USD\"] = \"usd\";\n  CurrencyCodes2[\"USN\"] = \"usn\";\n  CurrencyCodes2[\"USS\"] = \"uss\";\n  CurrencyCodes2[\"UYI\"] = \"uyi\";\n  CurrencyCodes2[\"UYU\"] = \"uyu\";\n  CurrencyCodes2[\"UZS\"] = \"uzs\";\n  CurrencyCodes2[\"VEF\"] = \"vef\";\n  CurrencyCodes2[\"VND\"] = \"vnd\";\n  CurrencyCodes2[\"VUV\"] = \"vuv\";\n  CurrencyCodes2[\"WST\"] = \"wst\";\n  CurrencyCodes2[\"XAF\"] = \"xaf\";\n  CurrencyCodes2[\"XAG\"] = \"xag\";\n  CurrencyCodes2[\"XAU\"] = \"xau\";\n  CurrencyCodes2[\"XBA\"] = \"xba\";\n  CurrencyCodes2[\"XBB\"] = \"xbb\";\n  CurrencyCodes2[\"XBC\"] = \"xbc\";\n  CurrencyCodes2[\"XBD\"] = \"xbd\";\n  CurrencyCodes2[\"XCD\"] = \"xcd\";\n  CurrencyCodes2[\"XDR\"] = \"xdr\";\n  CurrencyCodes2[\"XFU\"] = \"xfu\";\n  CurrencyCodes2[\"XOF\"] = \"xof\";\n  CurrencyCodes2[\"XPD\"] = \"xpd\";\n  CurrencyCodes2[\"XPF\"] = \"xpf\";\n  CurrencyCodes2[\"XPT\"] = \"xpt\";\n  CurrencyCodes2[\"XSU\"] = \"xsu\";\n  CurrencyCodes2[\"XTS\"] = \"xts\";\n  CurrencyCodes2[\"XUA\"] = \"xua\";\n  CurrencyCodes2[\"YER\"] = \"yer\";\n  CurrencyCodes2[\"ZAR\"] = \"zar\";\n  CurrencyCodes2[\"ZMW\"] = \"zmw\";\n  CurrencyCodes2[\"ZWL\"] = \"zwl\";\n})(CurrencyCodes || (CurrencyCodes = {}));\nconst CurrencyExponents = {\n  [CurrencyCodes.AED]: 2,\n  [CurrencyCodes.AFN]: 2,\n  [CurrencyCodes.ALL]: 2,\n  [CurrencyCodes.AMD]: 2,\n  [CurrencyCodes.ANG]: 2,\n  [CurrencyCodes.AOA]: 2,\n  [CurrencyCodes.ARS]: 2,\n  [CurrencyCodes.AUD]: 2,\n  [CurrencyCodes.AWG]: 2,\n  [CurrencyCodes.AZN]: 2,\n  [CurrencyCodes.BAM]: 2,\n  [CurrencyCodes.BBD]: 2,\n  [CurrencyCodes.BDT]: 2,\n  [CurrencyCodes.BGN]: 2,\n  [CurrencyCodes.BHD]: 3,\n  [CurrencyCodes.BIF]: 0,\n  [CurrencyCodes.BMD]: 2,\n  [CurrencyCodes.BND]: 2,\n  [CurrencyCodes.BOB]: 2,\n  [CurrencyCodes.BOV]: 2,\n  [CurrencyCodes.BRL]: 2,\n  [CurrencyCodes.BSD]: 2,\n  [CurrencyCodes.BTN]: 2,\n  [CurrencyCodes.BWP]: 2,\n  [CurrencyCodes.BYR]: 0,\n  [CurrencyCodes.BYN]: 2,\n  [CurrencyCodes.BZD]: 2,\n  [CurrencyCodes.CAD]: 2,\n  [CurrencyCodes.CDF]: 2,\n  [CurrencyCodes.CHE]: 2,\n  [CurrencyCodes.CHF]: 2,\n  [CurrencyCodes.CHW]: 2,\n  [CurrencyCodes.CLF]: 0,\n  [CurrencyCodes.CLP]: 0,\n  [CurrencyCodes.CNY]: 2,\n  [CurrencyCodes.COP]: 2,\n  [CurrencyCodes.COU]: 2,\n  [CurrencyCodes.CRC]: 2,\n  [CurrencyCodes.CUC]: 2,\n  [CurrencyCodes.CUP]: 2,\n  [CurrencyCodes.CVE]: 2,\n  [CurrencyCodes.CZK]: 2,\n  [CurrencyCodes.DJF]: 0,\n  [CurrencyCodes.DKK]: 2,\n  [CurrencyCodes.DOP]: 2,\n  [CurrencyCodes.DZD]: 2,\n  [CurrencyCodes.EGP]: 2,\n  [CurrencyCodes.ERN]: 2,\n  [CurrencyCodes.ETB]: 2,\n  [CurrencyCodes.EUR]: 2,\n  [CurrencyCodes.FJD]: 2,\n  [CurrencyCodes.FKP]: 2,\n  [CurrencyCodes.GBP]: 2,\n  [CurrencyCodes.GEL]: 2,\n  [CurrencyCodes.GHS]: 2,\n  [CurrencyCodes.GIP]: 2,\n  [CurrencyCodes.GMD]: 2,\n  [CurrencyCodes.GNF]: 0,\n  [CurrencyCodes.GTQ]: 2,\n  [CurrencyCodes.GYD]: 2,\n  [CurrencyCodes.HKD]: 2,\n  [CurrencyCodes.HNL]: 2,\n  [CurrencyCodes.HRK]: 2,\n  [CurrencyCodes.HTG]: 2,\n  [CurrencyCodes.HUF]: 2,\n  [CurrencyCodes.IDR]: 2,\n  [CurrencyCodes.ILS]: 2,\n  [CurrencyCodes.INR]: 2,\n  [CurrencyCodes.IQD]: 3,\n  [CurrencyCodes.IRR]: 2,\n  [CurrencyCodes.ISK]: 0,\n  [CurrencyCodes.JMD]: 2,\n  [CurrencyCodes.JOD]: 3,\n  [CurrencyCodes.JPY]: 0,\n  [CurrencyCodes.KES]: 2,\n  [CurrencyCodes.KGS]: 2,\n  [CurrencyCodes.KHR]: 2,\n  [CurrencyCodes.KMF]: 0,\n  [CurrencyCodes.KPW]: 2,\n  [CurrencyCodes.KRW]: 0,\n  [CurrencyCodes.KWD]: 3,\n  [CurrencyCodes.KYD]: 2,\n  [CurrencyCodes.KZT]: 2,\n  [CurrencyCodes.LAK]: 2,\n  [CurrencyCodes.LBP]: 2,\n  [CurrencyCodes.LKR]: 2,\n  [CurrencyCodes.LRD]: 2,\n  [CurrencyCodes.LSL]: 2,\n  [CurrencyCodes.LTL]: 2,\n  [CurrencyCodes.LVL]: 2,\n  [CurrencyCodes.LYD]: 3,\n  [CurrencyCodes.MAD]: 2,\n  [CurrencyCodes.MDL]: 2,\n  [CurrencyCodes.MGA]: 2,\n  [CurrencyCodes.MKD]: 2,\n  [CurrencyCodes.MMK]: 2,\n  [CurrencyCodes.MNT]: 2,\n  [CurrencyCodes.MOP]: 2,\n  [CurrencyCodes.MRO]: 2,\n  [CurrencyCodes.MUR]: 2,\n  [CurrencyCodes.MVR]: 2,\n  [CurrencyCodes.MWK]: 2,\n  [CurrencyCodes.MXN]: 2,\n  [CurrencyCodes.MXV]: 2,\n  [CurrencyCodes.MYR]: 2,\n  [CurrencyCodes.MZN]: 2,\n  [CurrencyCodes.NAD]: 2,\n  [CurrencyCodes.NGN]: 2,\n  [CurrencyCodes.NIO]: 2,\n  [CurrencyCodes.NOK]: 2,\n  [CurrencyCodes.NPR]: 2,\n  [CurrencyCodes.NZD]: 2,\n  [CurrencyCodes.OMR]: 3,\n  [CurrencyCodes.PAB]: 2,\n  [CurrencyCodes.PEN]: 2,\n  [CurrencyCodes.PGK]: 2,\n  [CurrencyCodes.PHP]: 2,\n  [CurrencyCodes.PKR]: 2,\n  [CurrencyCodes.PLN]: 2,\n  [CurrencyCodes.PYG]: 0,\n  [CurrencyCodes.QAR]: 2,\n  [CurrencyCodes.RON]: 2,\n  [CurrencyCodes.RSD]: 2,\n  [CurrencyCodes.RUB]: 2,\n  [CurrencyCodes.RWF]: 0,\n  [CurrencyCodes.SAR]: 2,\n  [CurrencyCodes.SBD]: 2,\n  [CurrencyCodes.SCR]: 2,\n  [CurrencyCodes.SDG]: 2,\n  [CurrencyCodes.SEK]: 2,\n  [CurrencyCodes.SGD]: 2,\n  [CurrencyCodes.SHP]: 2,\n  [CurrencyCodes.SLL]: 2,\n  [CurrencyCodes.SOS]: 2,\n  [CurrencyCodes.SRD]: 2,\n  [CurrencyCodes.SSP]: 2,\n  [CurrencyCodes.STD]: 2,\n  [CurrencyCodes.SVC]: 2,\n  [CurrencyCodes.SYP]: 2,\n  [CurrencyCodes.SZL]: 2,\n  [CurrencyCodes.THB]: 2,\n  [CurrencyCodes.TJS]: 2,\n  [CurrencyCodes.TMT]: 2,\n  [CurrencyCodes.TND]: 3,\n  [CurrencyCodes.TOP]: 2,\n  [CurrencyCodes.TRY]: 2,\n  [CurrencyCodes.TTD]: 2,\n  [CurrencyCodes.TWD]: 2,\n  [CurrencyCodes.TZS]: 2,\n  [CurrencyCodes.UAH]: 2,\n  [CurrencyCodes.UGX]: 0,\n  [CurrencyCodes.USD]: 2,\n  [CurrencyCodes.USN]: 2,\n  [CurrencyCodes.USS]: 2,\n  [CurrencyCodes.UYI]: 0,\n  [CurrencyCodes.UYU]: 2,\n  [CurrencyCodes.UZS]: 2,\n  [CurrencyCodes.VEF]: 2,\n  [CurrencyCodes.VND]: 0,\n  [CurrencyCodes.VUV]: 0,\n  [CurrencyCodes.WST]: 2,\n  [CurrencyCodes.XAF]: 0,\n  [CurrencyCodes.XAG]: 0,\n  [CurrencyCodes.XAU]: 0,\n  [CurrencyCodes.XBA]: 0,\n  [CurrencyCodes.XBB]: 0,\n  [CurrencyCodes.XBC]: 0,\n  [CurrencyCodes.XBD]: 0,\n  [CurrencyCodes.XCD]: 2,\n  [CurrencyCodes.XDR]: 0,\n  [CurrencyCodes.XFU]: 0,\n  [CurrencyCodes.XOF]: 0,\n  [CurrencyCodes.XPD]: 0,\n  [CurrencyCodes.XPF]: 0,\n  [CurrencyCodes.XPT]: 0,\n  [CurrencyCodes.XSU]: 0,\n  [CurrencyCodes.XTS]: 0,\n  [CurrencyCodes.XUA]: 0,\n  [CurrencyCodes.YER]: 2,\n  [CurrencyCodes.ZAR]: 2,\n  [CurrencyCodes.ZMW]: 2,\n  [CurrencyCodes.ZWL]: 2\n};\nfunction formatPrice(price, locale = \"en-US\") {\n  const {amount, currency} = price;\n  const formatter = Intl.NumberFormat(locale, {style: \"currency\", currency});\n  return formatter.format(convertToMajorCurrencyUnits(amount, currency));\n}\nfunction convertToMajorCurrencyUnits(minorUnitValue, currency) {\n  const exponent = CurrencyExponents[currency];\n  if (exponent == null) {\n    console.warn(`Unexpected currency ${currency}`);\n    return minorUnitValue;\n  }\n  const minorUnit = new Decimal$1(minorUnitValue);\n  return minorUnit.dividedBy(10 ** exponent).toNumber();\n}\nvar PriceUtils = {\n  formatPrice\n};\nvar lodash_transform = {exports: {}};\n(function(module, exports) {\n  var LARGE_ARRAY_SIZE = 200;\n  var FUNC_ERROR_TEXT = \"Expected a function\";\n  var HASH_UNDEFINED = \"__lodash_hash_undefined__\";\n  var UNORDERED_COMPARE_FLAG = 1, PARTIAL_COMPARE_FLAG = 2;\n  var INFINITY = 1 / 0, MAX_SAFE_INTEGER2 = 9007199254740991;\n  var argsTag = \"[object Arguments]\", arrayTag = \"[object Array]\", boolTag = \"[object Boolean]\", dateTag = \"[object Date]\", errorTag = \"[object Error]\", funcTag = \"[object Function]\", genTag = \"[object GeneratorFunction]\", mapTag = \"[object Map]\", numberTag = \"[object Number]\", objectTag = \"[object Object]\", promiseTag = \"[object Promise]\", regexpTag = \"[object RegExp]\", setTag = \"[object Set]\", stringTag = \"[object String]\", symbolTag = \"[object Symbol]\", weakMapTag = \"[object WeakMap]\";\n  var arrayBufferTag = \"[object ArrayBuffer]\", dataViewTag = \"[object DataView]\", float32Tag = \"[object Float32Array]\", float64Tag = \"[object Float64Array]\", int8Tag = \"[object Int8Array]\", int16Tag = \"[object Int16Array]\", int32Tag = \"[object Int32Array]\", uint8Tag = \"[object Uint8Array]\", uint8ClampedTag = \"[object Uint8ClampedArray]\", uint16Tag = \"[object Uint16Array]\", uint32Tag = \"[object Uint32Array]\";\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/, reIsPlainProp = /^\\w*$/, reLeadingDot = /^\\./, rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n  var reEscapeChar = /\\\\(\\\\)?/g;\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n  var freeGlobal = typeof commonjsGlobal == \"object\" && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;\n  var freeSelf = typeof self == \"object\" && self && self.Object === Object && self;\n  var root = freeGlobal || freeSelf || Function(\"return this\")();\n  var freeExports = exports && !exports.nodeType && exports;\n  var freeModule = freeExports && true && module && !module.nodeType && module;\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n  var freeProcess = moduleExports && freeGlobal.process;\n  var nodeUtil = function() {\n    try {\n      return freeProcess && freeProcess.binding(\"util\");\n    } catch (e) {\n    }\n  }();\n  var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n  function arrayEach(array, iteratee) {\n    var index = -1, length = array ? array.length : 0;\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n  function arraySome(array, predicate) {\n    var index = -1, length = array ? array.length : 0;\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true;\n      }\n    }\n    return false;\n  }\n  function baseProperty(key) {\n    return function(object) {\n      return object == null ? void 0 : object[key];\n    };\n  }\n  function baseTimes(n, iteratee) {\n    var index = -1, result = Array(n);\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n  function baseUnary(func) {\n    return function(value) {\n      return func(value);\n    };\n  }\n  function getValue(object, key) {\n    return object == null ? void 0 : object[key];\n  }\n  function isHostObject(value) {\n    var result = false;\n    if (value != null && typeof value.toString != \"function\") {\n      try {\n        result = !!(value + \"\");\n      } catch (e) {\n      }\n    }\n    return result;\n  }\n  function mapToArray(map) {\n    var index = -1, result = Array(map.size);\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n  function overArg(func, transform3) {\n    return function(arg) {\n      return func(transform3(arg));\n    };\n  }\n  function setToArray(set) {\n    var index = -1, result = Array(set.size);\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n  var arrayProto = Array.prototype, funcProto = Function.prototype, objectProto = Object.prototype;\n  var coreJsData = root[\"__core-js_shared__\"];\n  var maskSrcKey = function() {\n    var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || \"\");\n    return uid ? \"Symbol(src)_1.\" + uid : \"\";\n  }();\n  var funcToString = funcProto.toString;\n  var hasOwnProperty = objectProto.hasOwnProperty;\n  var objectToString = objectProto.toString;\n  var reIsNative = RegExp(\"^\" + funcToString.call(hasOwnProperty).replace(reRegExpChar, \"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, \"$1.*?\") + \"$\");\n  var Symbol2 = root.Symbol, Uint8Array2 = root.Uint8Array, getPrototype = overArg(Object.getPrototypeOf, Object), objectCreate = Object.create, propertyIsEnumerable = objectProto.propertyIsEnumerable, splice = arrayProto.splice;\n  var nativeKeys = overArg(Object.keys, Object);\n  var DataView = getNative(root, \"DataView\"), Map2 = getNative(root, \"Map\"), Promise2 = getNative(root, \"Promise\"), Set2 = getNative(root, \"Set\"), WeakMap = getNative(root, \"WeakMap\"), nativeCreate = getNative(Object, \"create\");\n  var dataViewCtorString = toSource(DataView), mapCtorString = toSource(Map2), promiseCtorString = toSource(Promise2), setCtorString = toSource(Set2), weakMapCtorString = toSource(WeakMap);\n  var symbolProto = Symbol2 ? Symbol2.prototype : void 0, symbolValueOf = symbolProto ? symbolProto.valueOf : void 0, symbolToString = symbolProto ? symbolProto.toString : void 0;\n  function Hash(entries) {\n    var index = -1, length = entries ? entries.length : 0;\n    this.clear();\n    while (++index < length) {\n      var entry = entries[index];\n      this.set(entry[0], entry[1]);\n    }\n  }\n  function hashClear() {\n    this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  }\n  function hashDelete(key) {\n    return this.has(key) && delete this.__data__[key];\n  }\n  function hashGet(key) {\n    var data = this.__data__;\n    if (nativeCreate) {\n      var result = data[key];\n      return result === HASH_UNDEFINED ? void 0 : result;\n    }\n    return hasOwnProperty.call(data, key) ? data[key] : void 0;\n  }\n  function hashHas(key) {\n    var data = this.__data__;\n    return nativeCreate ? data[key] !== void 0 : hasOwnProperty.call(data, key);\n  }\n  function hashSet(key, value) {\n    var data = this.__data__;\n    data[key] = nativeCreate && value === void 0 ? HASH_UNDEFINED : value;\n    return this;\n  }\n  Hash.prototype.clear = hashClear;\n  Hash.prototype[\"delete\"] = hashDelete;\n  Hash.prototype.get = hashGet;\n  Hash.prototype.has = hashHas;\n  Hash.prototype.set = hashSet;\n  function ListCache(entries) {\n    var index = -1, length = entries ? entries.length : 0;\n    this.clear();\n    while (++index < length) {\n      var entry = entries[index];\n      this.set(entry[0], entry[1]);\n    }\n  }\n  function listCacheClear() {\n    this.__data__ = [];\n  }\n  function listCacheDelete(key) {\n    var data = this.__data__, index = assocIndexOf(data, key);\n    if (index < 0) {\n      return false;\n    }\n    var lastIndex = data.length - 1;\n    if (index == lastIndex) {\n      data.pop();\n    } else {\n      splice.call(data, index, 1);\n    }\n    return true;\n  }\n  function listCacheGet(key) {\n    var data = this.__data__, index = assocIndexOf(data, key);\n    return index < 0 ? void 0 : data[index][1];\n  }\n  function listCacheHas(key) {\n    return assocIndexOf(this.__data__, key) > -1;\n  }\n  function listCacheSet(key, value) {\n    var data = this.__data__, index = assocIndexOf(data, key);\n    if (index < 0) {\n      data.push([key, value]);\n    } else {\n      data[index][1] = value;\n    }\n    return this;\n  }\n  ListCache.prototype.clear = listCacheClear;\n  ListCache.prototype[\"delete\"] = listCacheDelete;\n  ListCache.prototype.get = listCacheGet;\n  ListCache.prototype.has = listCacheHas;\n  ListCache.prototype.set = listCacheSet;\n  function MapCache(entries) {\n    var index = -1, length = entries ? entries.length : 0;\n    this.clear();\n    while (++index < length) {\n      var entry = entries[index];\n      this.set(entry[0], entry[1]);\n    }\n  }\n  function mapCacheClear() {\n    this.__data__ = {\n      hash: new Hash(),\n      map: new (Map2 || ListCache)(),\n      string: new Hash()\n    };\n  }\n  function mapCacheDelete(key) {\n    return getMapData(this, key)[\"delete\"](key);\n  }\n  function mapCacheGet(key) {\n    return getMapData(this, key).get(key);\n  }\n  function mapCacheHas(key) {\n    return getMapData(this, key).has(key);\n  }\n  function mapCacheSet(key, value) {\n    getMapData(this, key).set(key, value);\n    return this;\n  }\n  MapCache.prototype.clear = mapCacheClear;\n  MapCache.prototype[\"delete\"] = mapCacheDelete;\n  MapCache.prototype.get = mapCacheGet;\n  MapCache.prototype.has = mapCacheHas;\n  MapCache.prototype.set = mapCacheSet;\n  function SetCache(values) {\n    var index = -1, length = values ? values.length : 0;\n    this.__data__ = new MapCache();\n    while (++index < length) {\n      this.add(values[index]);\n    }\n  }\n  function setCacheAdd(value) {\n    this.__data__.set(value, HASH_UNDEFINED);\n    return this;\n  }\n  function setCacheHas(value) {\n    return this.__data__.has(value);\n  }\n  SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n  SetCache.prototype.has = setCacheHas;\n  function Stack(entries) {\n    this.__data__ = new ListCache(entries);\n  }\n  function stackClear() {\n    this.__data__ = new ListCache();\n  }\n  function stackDelete(key) {\n    return this.__data__[\"delete\"](key);\n  }\n  function stackGet(key) {\n    return this.__data__.get(key);\n  }\n  function stackHas(key) {\n    return this.__data__.has(key);\n  }\n  function stackSet(key, value) {\n    var cache = this.__data__;\n    if (cache instanceof ListCache) {\n      var pairs = cache.__data__;\n      if (!Map2 || pairs.length < LARGE_ARRAY_SIZE - 1) {\n        pairs.push([key, value]);\n        return this;\n      }\n      cache = this.__data__ = new MapCache(pairs);\n    }\n    cache.set(key, value);\n    return this;\n  }\n  Stack.prototype.clear = stackClear;\n  Stack.prototype[\"delete\"] = stackDelete;\n  Stack.prototype.get = stackGet;\n  Stack.prototype.has = stackHas;\n  Stack.prototype.set = stackSet;\n  function arrayLikeKeys(value, inherited) {\n    var result = isArray(value) || isArguments(value) ? baseTimes(value.length, String) : [];\n    var length = result.length, skipIndexes = !!length;\n    for (var key in value) {\n      if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && (key == \"length\" || isIndex(key, length)))) {\n        result.push(key);\n      }\n    }\n    return result;\n  }\n  function assocIndexOf(array, key) {\n    var length = array.length;\n    while (length--) {\n      if (eq(array[length][0], key)) {\n        return length;\n      }\n    }\n    return -1;\n  }\n  function baseCreate(proto) {\n    return isObject(proto) ? objectCreate(proto) : {};\n  }\n  var baseFor = createBaseFor();\n  function baseForOwn(object, iteratee) {\n    return object && baseFor(object, iteratee, keys);\n  }\n  function baseGet(object, path) {\n    path = isKey(path, object) ? [path] : castPath(path);\n    var index = 0, length = path.length;\n    while (object != null && index < length) {\n      object = object[toKey(path[index++])];\n    }\n    return index && index == length ? object : void 0;\n  }\n  function baseGetTag(value) {\n    return objectToString.call(value);\n  }\n  function baseHasIn(object, key) {\n    return object != null && key in Object(object);\n  }\n  function baseIsEqual(value, other, customizer, bitmask, stack) {\n    if (value === other) {\n      return true;\n    }\n    if (value == null || other == null || !isObject(value) && !isObjectLike(other)) {\n      return value !== value && other !== other;\n    }\n    return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack);\n  }\n  function baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) {\n    var objIsArr = isArray(object), othIsArr = isArray(other), objTag = arrayTag, othTag = arrayTag;\n    if (!objIsArr) {\n      objTag = getTag(object);\n      objTag = objTag == argsTag ? objectTag : objTag;\n    }\n    if (!othIsArr) {\n      othTag = getTag(other);\n      othTag = othTag == argsTag ? objectTag : othTag;\n    }\n    var objIsObj = objTag == objectTag && !isHostObject(object), othIsObj = othTag == objectTag && !isHostObject(other), isSameTag = objTag == othTag;\n    if (isSameTag && !objIsObj) {\n      stack || (stack = new Stack());\n      return objIsArr || isTypedArray(object) ? equalArrays(object, other, equalFunc, customizer, bitmask, stack) : equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack);\n    }\n    if (!(bitmask & PARTIAL_COMPARE_FLAG)) {\n      var objIsWrapped = objIsObj && hasOwnProperty.call(object, \"__wrapped__\"), othIsWrapped = othIsObj && hasOwnProperty.call(other, \"__wrapped__\");\n      if (objIsWrapped || othIsWrapped) {\n        var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other;\n        stack || (stack = new Stack());\n        return equalFunc(objUnwrapped, othUnwrapped, customizer, bitmask, stack);\n      }\n    }\n    if (!isSameTag) {\n      return false;\n    }\n    stack || (stack = new Stack());\n    return equalObjects(object, other, equalFunc, customizer, bitmask, stack);\n  }\n  function baseIsMatch(object, source, matchData, customizer) {\n    var index = matchData.length, length = index, noCustomizer = !customizer;\n    if (object == null) {\n      return !length;\n    }\n    object = Object(object);\n    while (index--) {\n      var data = matchData[index];\n      if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) {\n        return false;\n      }\n    }\n    while (++index < length) {\n      data = matchData[index];\n      var key = data[0], objValue = object[key], srcValue = data[1];\n      if (noCustomizer && data[2]) {\n        if (objValue === void 0 && !(key in object)) {\n          return false;\n        }\n      } else {\n        var stack = new Stack();\n        if (customizer) {\n          var result = customizer(objValue, srcValue, key, object, source, stack);\n        }\n        if (!(result === void 0 ? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack) : result)) {\n          return false;\n        }\n      }\n    }\n    return true;\n  }\n  function baseIsNative(value) {\n    if (!isObject(value) || isMasked(value)) {\n      return false;\n    }\n    var pattern = isFunction(value) || isHostObject(value) ? reIsNative : reIsHostCtor;\n    return pattern.test(toSource(value));\n  }\n  function baseIsTypedArray(value) {\n    return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objectToString.call(value)];\n  }\n  function baseIteratee(value) {\n    if (typeof value == \"function\") {\n      return value;\n    }\n    if (value == null) {\n      return identity;\n    }\n    if (typeof value == \"object\") {\n      return isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value);\n    }\n    return property(value);\n  }\n  function baseKeys(object) {\n    if (!isPrototype(object)) {\n      return nativeKeys(object);\n    }\n    var result = [];\n    for (var key in Object(object)) {\n      if (hasOwnProperty.call(object, key) && key != \"constructor\") {\n        result.push(key);\n      }\n    }\n    return result;\n  }\n  function baseMatches(source) {\n    var matchData = getMatchData(source);\n    if (matchData.length == 1 && matchData[0][2]) {\n      return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n    }\n    return function(object) {\n      return object === source || baseIsMatch(object, source, matchData);\n    };\n  }\n  function baseMatchesProperty(path, srcValue) {\n    if (isKey(path) && isStrictComparable(srcValue)) {\n      return matchesStrictComparable(toKey(path), srcValue);\n    }\n    return function(object) {\n      var objValue = get(object, path);\n      return objValue === void 0 && objValue === srcValue ? hasIn(object, path) : baseIsEqual(srcValue, objValue, void 0, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG);\n    };\n  }\n  function basePropertyDeep(path) {\n    return function(object) {\n      return baseGet(object, path);\n    };\n  }\n  function baseToString(value) {\n    if (typeof value == \"string\") {\n      return value;\n    }\n    if (isSymbol(value)) {\n      return symbolToString ? symbolToString.call(value) : \"\";\n    }\n    var result = value + \"\";\n    return result == \"0\" && 1 / value == -INFINITY ? \"-0\" : result;\n  }\n  function castPath(value) {\n    return isArray(value) ? value : stringToPath(value);\n  }\n  function createBaseFor(fromRight) {\n    return function(object, iteratee, keysFunc) {\n      var index = -1, iterable = Object(object), props = keysFunc(object), length = props.length;\n      while (length--) {\n        var key = props[fromRight ? length : ++index];\n        if (iteratee(iterable[key], key, iterable) === false) {\n          break;\n        }\n      }\n      return object;\n    };\n  }\n  function equalArrays(array, other, equalFunc, customizer, bitmask, stack) {\n    var isPartial = bitmask & PARTIAL_COMPARE_FLAG, arrLength = array.length, othLength = other.length;\n    if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n      return false;\n    }\n    var stacked = stack.get(array);\n    if (stacked && stack.get(other)) {\n      return stacked == other;\n    }\n    var index = -1, result = true, seen = bitmask & UNORDERED_COMPARE_FLAG ? new SetCache() : void 0;\n    stack.set(array, other);\n    stack.set(other, array);\n    while (++index < arrLength) {\n      var arrValue = array[index], othValue = other[index];\n      if (customizer) {\n        var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack);\n      }\n      if (compared !== void 0) {\n        if (compared) {\n          continue;\n        }\n        result = false;\n        break;\n      }\n      if (seen) {\n        if (!arraySome(other, function(othValue2, othIndex) {\n          if (!seen.has(othIndex) && (arrValue === othValue2 || equalFunc(arrValue, othValue2, customizer, bitmask, stack))) {\n            return seen.add(othIndex);\n          }\n        })) {\n          result = false;\n          break;\n        }\n      } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) {\n        result = false;\n        break;\n      }\n    }\n    stack[\"delete\"](array);\n    stack[\"delete\"](other);\n    return result;\n  }\n  function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) {\n    switch (tag) {\n      case dataViewTag:\n        if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) {\n          return false;\n        }\n        object = object.buffer;\n        other = other.buffer;\n      case arrayBufferTag:\n        if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array2(object), new Uint8Array2(other))) {\n          return false;\n        }\n        return true;\n      case boolTag:\n      case dateTag:\n      case numberTag:\n        return eq(+object, +other);\n      case errorTag:\n        return object.name == other.name && object.message == other.message;\n      case regexpTag:\n      case stringTag:\n        return object == other + \"\";\n      case mapTag:\n        var convert = mapToArray;\n      case setTag:\n        var isPartial = bitmask & PARTIAL_COMPARE_FLAG;\n        convert || (convert = setToArray);\n        if (object.size != other.size && !isPartial) {\n          return false;\n        }\n        var stacked = stack.get(object);\n        if (stacked) {\n          return stacked == other;\n        }\n        bitmask |= UNORDERED_COMPARE_FLAG;\n        stack.set(object, other);\n        var result = equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack);\n        stack[\"delete\"](object);\n        return result;\n      case symbolTag:\n        if (symbolValueOf) {\n          return symbolValueOf.call(object) == symbolValueOf.call(other);\n        }\n    }\n    return false;\n  }\n  function equalObjects(object, other, equalFunc, customizer, bitmask, stack) {\n    var isPartial = bitmask & PARTIAL_COMPARE_FLAG, objProps = keys(object), objLength = objProps.length, othProps = keys(other), othLength = othProps.length;\n    if (objLength != othLength && !isPartial) {\n      return false;\n    }\n    var index = objLength;\n    while (index--) {\n      var key = objProps[index];\n      if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n        return false;\n      }\n    }\n    var stacked = stack.get(object);\n    if (stacked && stack.get(other)) {\n      return stacked == other;\n    }\n    var result = true;\n    stack.set(object, other);\n    stack.set(other, object);\n    var skipCtor = isPartial;\n    while (++index < objLength) {\n      key = objProps[index];\n      var objValue = object[key], othValue = other[key];\n      if (customizer) {\n        var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack);\n      }\n      if (!(compared === void 0 ? objValue === othValue || equalFunc(objValue, othValue, customizer, bitmask, stack) : compared)) {\n        result = false;\n        break;\n      }\n      skipCtor || (skipCtor = key == \"constructor\");\n    }\n    if (result && !skipCtor) {\n      var objCtor = object.constructor, othCtor = other.constructor;\n      if (objCtor != othCtor && (\"constructor\" in object && \"constructor\" in other) && !(typeof objCtor == \"function\" && objCtor instanceof objCtor && typeof othCtor == \"function\" && othCtor instanceof othCtor)) {\n        result = false;\n      }\n    }\n    stack[\"delete\"](object);\n    stack[\"delete\"](other);\n    return result;\n  }\n  function getMapData(map, key) {\n    var data = map.__data__;\n    return isKeyable(key) ? data[typeof key == \"string\" ? \"string\" : \"hash\"] : data.map;\n  }\n  function getMatchData(object) {\n    var result = keys(object), length = result.length;\n    while (length--) {\n      var key = result[length], value = object[key];\n      result[length] = [key, value, isStrictComparable(value)];\n    }\n    return result;\n  }\n  function getNative(object, key) {\n    var value = getValue(object, key);\n    return baseIsNative(value) ? value : void 0;\n  }\n  var getTag = baseGetTag;\n  if (DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag || Map2 && getTag(new Map2()) != mapTag || Promise2 && getTag(Promise2.resolve()) != promiseTag || Set2 && getTag(new Set2()) != setTag || WeakMap && getTag(new WeakMap()) != weakMapTag) {\n    getTag = function(value) {\n      var result = objectToString.call(value), Ctor = result == objectTag ? value.constructor : void 0, ctorString = Ctor ? toSource(Ctor) : void 0;\n      if (ctorString) {\n        switch (ctorString) {\n          case dataViewCtorString:\n            return dataViewTag;\n          case mapCtorString:\n            return mapTag;\n          case promiseCtorString:\n            return promiseTag;\n          case setCtorString:\n            return setTag;\n          case weakMapCtorString:\n            return weakMapTag;\n        }\n      }\n      return result;\n    };\n  }\n  function hasPath(object, path, hasFunc) {\n    path = isKey(path, object) ? [path] : castPath(path);\n    var result, index = -1, length = path.length;\n    while (++index < length) {\n      var key = toKey(path[index]);\n      if (!(result = object != null && hasFunc(object, key))) {\n        break;\n      }\n      object = object[key];\n    }\n    if (result) {\n      return result;\n    }\n    var length = object ? object.length : 0;\n    return !!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object));\n  }\n  function isIndex(value, length) {\n    length = length == null ? MAX_SAFE_INTEGER2 : length;\n    return !!length && (typeof value == \"number\" || reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length);\n  }\n  function isKey(value, object) {\n    if (isArray(value)) {\n      return false;\n    }\n    var type = typeof value;\n    if (type == \"number\" || type == \"symbol\" || type == \"boolean\" || value == null || isSymbol(value)) {\n      return true;\n    }\n    return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object(object);\n  }\n  function isKeyable(value) {\n    var type = typeof value;\n    return type == \"string\" || type == \"number\" || type == \"symbol\" || type == \"boolean\" ? value !== \"__proto__\" : value === null;\n  }\n  function isMasked(func) {\n    return !!maskSrcKey && maskSrcKey in func;\n  }\n  function isPrototype(value) {\n    var Ctor = value && value.constructor, proto = typeof Ctor == \"function\" && Ctor.prototype || objectProto;\n    return value === proto;\n  }\n  function isStrictComparable(value) {\n    return value === value && !isObject(value);\n  }\n  function matchesStrictComparable(key, srcValue) {\n    return function(object) {\n      if (object == null) {\n        return false;\n      }\n      return object[key] === srcValue && (srcValue !== void 0 || key in Object(object));\n    };\n  }\n  var stringToPath = memoize(function(string) {\n    string = toString2(string);\n    var result = [];\n    if (reLeadingDot.test(string)) {\n      result.push(\"\");\n    }\n    string.replace(rePropName, function(match, number, quote, string2) {\n      result.push(quote ? string2.replace(reEscapeChar, \"$1\") : number || match);\n    });\n    return result;\n  });\n  function toKey(value) {\n    if (typeof value == \"string\" || isSymbol(value)) {\n      return value;\n    }\n    var result = value + \"\";\n    return result == \"0\" && 1 / value == -INFINITY ? \"-0\" : result;\n  }\n  function toSource(func) {\n    if (func != null) {\n      try {\n        return funcToString.call(func);\n      } catch (e) {\n      }\n      try {\n        return func + \"\";\n      } catch (e) {\n      }\n    }\n    return \"\";\n  }\n  function memoize(func, resolver) {\n    if (typeof func != \"function\" || resolver && typeof resolver != \"function\") {\n      throw new TypeError(FUNC_ERROR_TEXT);\n    }\n    var memoized = function() {\n      var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache;\n      if (cache.has(key)) {\n        return cache.get(key);\n      }\n      var result = func.apply(this, args);\n      memoized.cache = cache.set(key, result);\n      return result;\n    };\n    memoized.cache = new (memoize.Cache || MapCache)();\n    return memoized;\n  }\n  memoize.Cache = MapCache;\n  function eq(value, other) {\n    return value === other || value !== value && other !== other;\n  }\n  function isArguments(value) {\n    return isArrayLikeObject(value) && hasOwnProperty.call(value, \"callee\") && (!propertyIsEnumerable.call(value, \"callee\") || objectToString.call(value) == argsTag);\n  }\n  var isArray = Array.isArray;\n  function isArrayLike(value) {\n    return value != null && isLength(value.length) && !isFunction(value);\n  }\n  function isArrayLikeObject(value) {\n    return isObjectLike(value) && isArrayLike(value);\n  }\n  function isFunction(value) {\n    var tag = isObject(value) ? objectToString.call(value) : \"\";\n    return tag == funcTag || tag == genTag;\n  }\n  function isLength(value) {\n    return typeof value == \"number\" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER2;\n  }\n  function isObject(value) {\n    var type = typeof value;\n    return !!value && (type == \"object\" || type == \"function\");\n  }\n  function isObjectLike(value) {\n    return !!value && typeof value == \"object\";\n  }\n  function isSymbol(value) {\n    return typeof value == \"symbol\" || isObjectLike(value) && objectToString.call(value) == symbolTag;\n  }\n  var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n  function toString2(value) {\n    return value == null ? \"\" : baseToString(value);\n  }\n  function get(object, path, defaultValue) {\n    var result = object == null ? void 0 : baseGet(object, path);\n    return result === void 0 ? defaultValue : result;\n  }\n  function hasIn(object, path) {\n    return object != null && hasPath(object, path, baseHasIn);\n  }\n  function keys(object) {\n    return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n  }\n  function transform2(object, iteratee, accumulator) {\n    var isArr = isArray(object) || isTypedArray(object);\n    iteratee = baseIteratee(iteratee);\n    if (accumulator == null) {\n      if (isArr || isObject(object)) {\n        var Ctor = object.constructor;\n        if (isArr) {\n          accumulator = isArray(object) ? new Ctor() : [];\n        } else {\n          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n        }\n      } else {\n        accumulator = {};\n      }\n    }\n    (isArr ? arrayEach : baseForOwn)(object, function(value, index, object2) {\n      return iteratee(accumulator, value, index, object2);\n    });\n    return accumulator;\n  }\n  function identity(value) {\n    return value;\n  }\n  function property(path) {\n    return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n  }\n  module.exports = transform2;\n})(lodash_transform, lodash_transform.exports);\nvar lodash_transformExports = lodash_transform.exports;\nvar transform = /* @__PURE__ */ getDefaultExportFromCjs(lodash_transformExports);\nclass DiscordSDKMock {\n  constructor(clientId, guildId, channelId) {\n    this.platform = Platform.DESKTOP;\n    this.instanceId = \"123456789012345678\";\n    this.configuration = getDefaultSdkConfiguration();\n    this.source = null;\n    this.sourceOrigin = \"\";\n    this.frameId = \"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa\";\n    this.eventBus = new EventEmitter();\n    this.clientId = clientId;\n    this.commands = this._updateCommandMocks({});\n    this.guildId = guildId;\n    this.channelId = channelId;\n  }\n  _updateCommandMocks(newCommands) {\n    this.commands = transform(Object.assign({}, commandsMockDefault, newCommands), (mock, func, name) => {\n      mock[name] = async (...args) => {\n        console.info(`DiscordSDKMock: ${String(name)}(${JSON.stringify(args)})`);\n        return await func(...args);\n      };\n    });\n    return this.commands;\n  }\n  emitReady() {\n    this.emitEvent(\"READY\", void 0);\n  }\n  close(...args) {\n    console.info(`DiscordSDKMock: close(${JSON.stringify(args)})`);\n  }\n  ready() {\n    return Promise.resolve();\n  }\n  async subscribe(event, listener, ..._subscribeArgs) {\n    return await this.eventBus.on(event, listener);\n  }\n  async unsubscribe(event, listener, ..._unsubscribeArgs) {\n    return await this.eventBus.off(event, listener);\n  }\n  emitEvent(event, data) {\n    this.eventBus.emit(event, data);\n  }\n}\nconst commandsMockDefault = {\n  authorize: () => Promise.resolve({code: \"mock_code\"}),\n  authenticate: () => Promise.resolve({\n    access_token: \"mock_token\",\n    user: {\n      username: \"mock_user_username\",\n      discriminator: \"mock_user_discriminator\",\n      id: \"mock_user_id\",\n      avatar: null,\n      public_flags: 1\n    },\n    scopes: [],\n    expires: new Date(2121, 1, 1).toString(),\n    application: {\n      description: \"mock_app_description\",\n      icon: \"mock_app_icon\",\n      id: \"mock_app_id\",\n      name: \"mock_app_name\"\n    }\n  }),\n  setActivity: () => Promise.resolve({\n    name: \"mock_activity_name\",\n    type: 0\n  }),\n  getChannel: () => Promise.resolve({\n    id: \"mock_channel_id\",\n    name: \"mock_channel_name\",\n    type: ChannelTypesObject.GUILD_TEXT,\n    voice_states: [],\n    messages: []\n  }),\n  getSkus: () => Promise.resolve({skus: []}),\n  getEntitlements: () => Promise.resolve({entitlements: []}),\n  startPurchase: () => Promise.resolve([]),\n  setConfig: () => Promise.resolve({use_interactive_pip: false}),\n  userSettingsGetLocale: () => Promise.resolve({locale: \"\"}),\n  openExternalLink: () => Promise.resolve(null),\n  encourageHardwareAcceleration: () => Promise.resolve({enabled: true}),\n  captureLog: () => Promise.resolve(null),\n  setOrientationLockState: () => Promise.resolve(null),\n  openInviteDialog: () => Promise.resolve(null),\n  getPlatformBehaviors: () => Promise.resolve({\n    iosKeyboardResizesView: true\n  }),\n  getChannelPermissions: () => Promise.resolve({permissions: bigInt(1234567890)}),\n  openShareMomentDialog: () => Promise.resolve(null),\n  initiateImageUpload: () => Promise.resolve({\n    image_url: \"https://assets-global.website-files.com/6257adef93867e50d84d30e2/636e0b52aa9e99b832574a53_full_logo_blurple_RGB.png\"\n  }),\n  getInstanceConnectedParticipants: () => Promise.resolve({participants: []})\n};\nfunction __rest(s, e) {\n  var t = {};\n  for (var p in s)\n    if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n      t[p] = s[p];\n  if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n    for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n      if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n        t[p[i]] = s[p[i]];\n    }\n  return t;\n}\ntypeof SuppressedError === \"function\" ? SuppressedError : function(error, suppressed, message) {\n  var e = new Error(message);\n  return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\nconst SUBSTITUTION_REGEX = /\\{([a-z]+)\\}/g;\nfunction regexFromTarget(target) {\n  const regexString = target.replace(SUBSTITUTION_REGEX, (match, name) => `(?<${name}>[\\\\w-]+)`);\n  return new RegExp(`${regexString}(/|$)`);\n}\nfunction matchAndRewriteURL({originalURL, prefix, prefixHost, target}) {\n  const targetURL = new URL(`https://${target}`);\n  const targetRegEx = regexFromTarget(targetURL.host.replace(/%7B/g, \"{\").replace(/%7D/g, \"}\"));\n  const match = originalURL.toString().match(targetRegEx);\n  if (match == null)\n    return originalURL;\n  const newURL = new URL(originalURL.toString());\n  newURL.host = prefixHost;\n  newURL.pathname = prefix.replace(SUBSTITUTION_REGEX, (_, matchName) => {\n    var _a;\n    const replaceValue = (_a = match.groups) === null || _a === void 0 ? void 0 : _a[matchName];\n    if (replaceValue == null)\n      throw new Error(\"Misconfigured route.\");\n    return replaceValue;\n  });\n  newURL.pathname += newURL.pathname === \"/\" ? originalURL.pathname.slice(1) : originalURL.pathname;\n  newURL.pathname = newURL.pathname.replace(targetURL.pathname, \"\");\n  if (originalURL.pathname.endsWith(\"/\") && !newURL.pathname.endsWith(\"/\")) {\n    newURL.pathname += \"/\";\n  }\n  return newURL;\n}\nfunction absoluteURL(url, protocol = window.location.protocol, host = window.location.host) {\n  return new URL(url, `${protocol}//${host}`);\n}\nfunction patchUrlMappings(mappings, {patchFetch = true, patchWebSocket = true, patchXhr = true, patchSrcAttributes = false} = {}) {\n  if (typeof window === \"undefined\")\n    return;\n  if (patchFetch) {\n    const fetchImpl = window.fetch;\n    window.fetch = function(input, init) {\n      if (input instanceof Request) {\n        const newUrl = attemptRemap({url: absoluteURL(input.url), mappings});\n        const _a = init !== null && init !== void 0 ? init : {}, newInit = __rest(_a, [\"url\"]);\n        Object.keys(Request.prototype).forEach((value) => {\n          if (value === \"url\")\n            return;\n          try {\n            newInit[value] = input[value];\n          } catch (ex) {\n            console.warn(`Remapping fetch request key \"${value}\" failed`, ex);\n          }\n        });\n        return new Promise((resolve, reject) => {\n          try {\n            input.blob().then((blob) => {\n              if (input.method.toUpperCase() !== \"HEAD\" && input.method.toUpperCase() !== \"GET\" && blob.size > 0) {\n                newInit.body = blob;\n              }\n              resolve(fetchImpl(new Request(newUrl, newInit)));\n            });\n          } catch (ex) {\n            reject(ex);\n          }\n        });\n      }\n      const remapped = attemptRemap({url: input instanceof URL ? input : absoluteURL(input), mappings});\n      return fetchImpl(remapped, init);\n    };\n  }\n  if (patchWebSocket) {\n    class WebSocketProxy extends WebSocket {\n      constructor(url, protocols) {\n        const remapped = attemptRemap({url: url instanceof URL ? url : absoluteURL(url), mappings});\n        super(remapped, protocols);\n      }\n    }\n    window.WebSocket = WebSocketProxy;\n  }\n  if (patchXhr) {\n    const openImpl = XMLHttpRequest.prototype.open;\n    XMLHttpRequest.prototype.open = function(method, url, async, username, password) {\n      const remapped = attemptRemap({url: absoluteURL(url), mappings});\n      openImpl.apply(this, [method, remapped, async, username, password]);\n    };\n  }\n  if (patchSrcAttributes) {\n    const callback = function(mutationsList) {\n      for (const mutation of mutationsList) {\n        if (mutation.type === \"attributes\" && mutation.attributeName === \"src\") {\n          attemptSetNodeSrc(mutation.target, mappings);\n        } else if (mutation.type === \"childList\") {\n          mutation.addedNodes.forEach((node) => recursivelyRemapChildNodes(node, mappings));\n        }\n      }\n    };\n    const observer = new MutationObserver(callback);\n    const config2 = {\n      attributeFilter: [\"src\"],\n      childList: true,\n      subtree: true\n    };\n    observer.observe(window.document, config2);\n    window.document.querySelectorAll(\"[src]\").forEach((node) => {\n      attemptSetNodeSrc(node, mappings);\n    });\n  }\n}\nfunction recursivelyRemapChildNodes(node, mappings) {\n  if (node.hasChildNodes()) {\n    node.childNodes.forEach((child) => {\n      attemptSetNodeSrc(child, mappings);\n      recursivelyRemapChildNodes(child, mappings);\n    });\n  }\n}\nfunction attemptSetNodeSrc(node, mappings) {\n  var _a;\n  if (node instanceof HTMLElement && node.hasAttribute(\"src\")) {\n    const url = absoluteURL((_a = node.getAttribute(\"src\")) !== null && _a !== void 0 ? _a : \"\");\n    if (url.host === window.location.host)\n      return;\n    node.setAttribute(\"src\", attemptRemap({url, mappings}).toString());\n  }\n}\nfunction attemptRemap({url, mappings}) {\n  for (const mapping of mappings) {\n    const mapped = matchAndRewriteURL({\n      originalURL: url,\n      prefix: mapping.prefix,\n      target: mapping.target,\n      prefixHost: window.location.host\n    });\n    if (mapped != null && (mapped === null || mapped === void 0 ? void 0 : mapped.toString()) !== url.toString()) {\n      return mapped;\n    }\n  }\n  return url;\n}\nconst {Commands: Commands$1} = common;\nexport {Commands$1 as Commands, common as Common, DiscordSDK, DiscordSDKMock, Events, Orientation, PermissionUtils, Permissions, Platform, PriceUtils, RPCCloseCodes, RPCErrorCodes, responses as Responses, attemptRemap, patchUrlMappings};\nexport default null;\n"
  },
  {
    "path": "lib/firebase.js",
    "content": "/*!\n * @license Firebase v4.9.0\n * Build: rev-a586a7f\n * Terms: https://firebase.google.com/terms/\n */\nvar firebase=function(){var e=void 0===e?self:e;return function(t){function r(e){if(o[e])return o[e].exports;var n=o[e]={i:e,l:!1,exports:{}};return t[e].call(n.exports,n,n.exports,r),n.l=!0,n.exports}var n=e.webpackJsonpFirebase;e.webpackJsonpFirebase=function(e,o,a){for(var c,s,u,f=0,h=[];f<e.length;f++)s=e[f],i[s]&&h.push(i[s][0]),i[s]=0;for(c in o)Object.prototype.hasOwnProperty.call(o,c)&&(t[c]=o[c]);for(n&&n(e,o,a);h.length;)h.shift()();if(a)for(f=0;f<a.length;f++)u=r(r.s=a[f]);return u};var o={},i={5:0};return r.e=function(e){function t(){c.onerror=c.onload=null,clearTimeout(s);var t=i[e];0!==t&&(t&&t[1](Error(\"Loading chunk \"+e+\" failed.\")),i[e]=void 0)}var n=i[e];if(0===n)return new Promise(function(e){e()});if(n)return n[2];var o=new Promise(function(t,r){n=i[e]=[t,r]});n[2]=o;var a=document.getElementsByTagName(\"head\")[0],c=document.createElement(\"script\");c.type=\"text/javascript\",c.charset=\"utf-8\",c.async=!0,c.timeout=12e4,r.nc&&c.setAttribute(\"nonce\",r.nc),c.src=r.p+\"\"+e+\".js\";var s=setTimeout(t,12e4);return c.onerror=c.onload=t,a.appendChild(c),o},r.m=t,r.c=o,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,\"a\",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p=\"\",r.oe=function(e){throw console.error(e),e},r(r.s=57)}([function(e,t,r){\"use strict\";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,\"__esModule\",{value:!0}),n(r(28)),n(r(29)),n(r(20)),n(r(65)),n(r(66)),n(r(67)),n(r(68)),n(r(30)),n(r(69)),n(r(31)),n(r(70)),n(r(71)),n(r(73)),n(r(74)),n(r(75))},,,,,,function(e,t,r){\"use strict\";function n(){function e(e){l(d[e],\"delete\"),delete d[e]}function t(e){return e=e||c,a(d,e)||o(\"no-app\",{name:e}),d[e]}function r(e,t){void 0===t?t=c:\"string\"==typeof t&&\"\"!==t||o(\"bad-app-name\",{name:t+\"\"}),a(d,t)&&o(\"duplicate-app\",{name:t});var r=new u(e,t,b);return d[t]=r,l(r,\"create\"),r}function s(){return Object.keys(d).map(function(e){return d[e]})}function f(e,r,n,a,c){v[e]&&o(\"duplicate-service\",{name:e}),v[e]=r,a&&(y[e]=a,s().forEach(function(e){a(\"create\",e)}));var f=function(r){return void 0===r&&(r=t()),\"function\"!=typeof r[e]&&o(\"invalid-app-argument\",{name:e}),r[e]()};return void 0!==n&&Object(i.deepExtend)(f,n),b[e]=f,u.prototype[e]=function(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];return this.t.bind(this,e).apply(this,c?t:[])},f}function h(e){Object(i.deepExtend)(b,e)}function l(e,t){Object.keys(v).forEach(function(r){var n=p(e,r);null!==n&&y[n]&&y[n](t,e)})}function p(e,t){if(\"serverAuth\"===t)return null;var r=t;return e.options,r}var d={},v={},y={},b={__esModule:!0,initializeApp:r,app:t,apps:null,Promise:Promise,SDK_VERSION:\"4.9.0\",INTERNAL:{registerService:f,createFirebaseNamespace:n,extendNamespace:h,createSubscribe:i.createSubscribe,ErrorFactory:i.ErrorFactory,removeApp:e,factories:v,useAsService:p,Promise:Promise,deepExtend:i.deepExtend}};return Object(i.patchProperty)(b,\"default\",b),Object.defineProperty(b,\"apps\",{get:s}),Object(i.patchProperty)(t,\"App\",u),b}function o(e,t){throw h.create(e,t)}Object.defineProperty(t,\"__esModule\",{value:!0});var i=r(0),a=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},c=\"[DEFAULT]\",s=[],u=function(){function e(e,t,r){this.r=r,this.a=!1,this.u={},this.f=t,this.h=Object(i.deepCopy)(e),this.INTERNAL={getUid:function(){return null},getToken:function(){return Promise.resolve(null)},addAuthTokenListener:function(e){s.push(e),setTimeout(function(){return e(null)},0)},removeAuthTokenListener:function(e){s=s.filter(function(t){return t!==e})}}}return Object.defineProperty(e.prototype,\"name\",{get:function(){return this.v(),this.f},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,\"options\",{get:function(){return this.v(),this.h},enumerable:!0,configurable:!0}),e.prototype.delete=function(){var e=this;return new Promise(function(t){e.v(),t()}).then(function(){e.r.INTERNAL.removeApp(e.f);var t=[];return Object.keys(e.u).forEach(function(r){Object.keys(e.u[r]).forEach(function(n){t.push(e.u[r][n])})}),Promise.all(t.map(function(e){return e.INTERNAL.delete()}))}).then(function(){e.a=!0,e.u={}})},e.prototype.t=function(e,t){if(void 0===t&&(t=c),this.v(),this.u[e]||(this.u[e]={}),!this.u[e][t]){var r=t!==c?t:void 0,n=this.r.INTERNAL.factories[e](this,this.extendApp.bind(this),r);this.u[e][t]=n}return this.u[e][t]},e.prototype.extendApp=function(e){var t=this;Object(i.deepExtend)(this,e),e.INTERNAL&&e.INTERNAL.addAuthTokenListener&&(s.forEach(function(e){t.INTERNAL.addAuthTokenListener(e)}),s=[])},e.prototype.v=function(){this.a&&o(\"app-deleted\",{name:this.f})},e}();u.prototype.name&&u.prototype.options||u.prototype.delete||console.log(\"dc\");var f={\"no-app\":\"No Firebase App '{$name}' has been created - call Firebase App.initializeApp()\",\"bad-app-name\":\"Illegal App name: '{$name}\",\"duplicate-app\":\"Firebase App named '{$name}' already exists\",\"app-deleted\":\"Firebase App named '{$name}' already deleted\",\"duplicate-service\":\"Firebase service named '{$name}' already registered\",\"sa-not-supported\":\"Initializing the Firebase SDK with a service account is only allowed in a Node.js environment. On client devices, you should instead initialize the SDK with an api key and auth domain\",\"invalid-app-argument\":\"firebase.{$name}() takes either no argument or a Firebase App instance.\"},h=new i.ErrorFactory(\"app\",\"Firebase\",f);r.d(t,\"firebase\",function(){return l});var l=n();t.default=l},,,,,,function(t,r){var n;n=function(){return this}();try{n=n||Function(\"return this\")()||(0,eval)(\"this\")}catch(t){\"object\"==typeof e&&(n=e)}t.exports=n},,,,,,,,function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.CONSTANTS={NODE_CLIENT:!1,NODE_ADMIN:!1,SDK_VERSION:\"${JSCORE_VERSION}\"}},,,,,,,function(e,t){function r(){throw Error(\"setTimeout has not been defined\")}function n(){throw Error(\"clearTimeout has not been defined\")}function o(e){if(f===setTimeout)return setTimeout(e,0);if((f===r||!f)&&setTimeout)return f=setTimeout,setTimeout(e,0);try{return f(e,0)}catch(t){try{return f.call(null,e,0)}catch(t){return f.call(this,e,0)}}}function i(e){if(h===clearTimeout)return clearTimeout(e);if((h===n||!h)&&clearTimeout)return h=clearTimeout,clearTimeout(e);try{return h(e)}catch(t){try{return h.call(null,e)}catch(t){return h.call(this,e)}}}function a(){v&&p&&(v=!1,p.length?d=p.concat(d):y=-1,d.length&&c())}function c(){if(!v){var e=o(a);v=!0;for(var t=d.length;t;){for(p=d,d=[];++y<t;)p&&p[y].run();y=-1,t=d.length}p=null,v=!1,i(e)}}function s(e,t){this.fun=e,this.array=t}function u(){}var f,h,l=e.exports={};!function(){try{f=\"function\"==typeof setTimeout?setTimeout:r}catch(e){f=r}try{h=\"function\"==typeof clearTimeout?clearTimeout:n}catch(e){h=n}}();var p,d=[],v=!1,y=-1;l.nextTick=function(e){var t=Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)t[r-1]=arguments[r];d.push(new s(e,t)),1!==d.length||v||o(c)},s.prototype.run=function(){this.fun.apply(null,this.array)},l.title=\"browser\",l.browser=!0,l.env={},l.argv=[],l.version=\"\",l.versions={},l.on=u,l.addListener=u,l.once=u,l.off=u,l.removeListener=u,l.removeAllListeners=u,l.emit=u,l.prependListener=u,l.prependOnceListener=u,l.listeners=function(e){return[]},l.binding=function(e){throw Error(\"process.binding is not supported\")},l.cwd=function(){return\"/\"},l.chdir=function(e){throw Error(\"process.chdir is not supported\")},l.umask=function(){return 0}},function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=r(20);t.assert=function(e,r){if(!e)throw t.assertionError(r)},t.assertionError=function(e){return Error(\"Firebase Database (\"+n.CONSTANTS.SDK_VERSION+\") INTERNAL ASSERT FAILED: \"+e)}},function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(e){for(var t=[],r=0,n=0;n<e.length;n++){var o=e.charCodeAt(n);o<128?t[r++]=o:o<2048?(t[r++]=o>>6|192,t[r++]=63&o|128):55296==(64512&o)&&n+1<e.length&&56320==(64512&e.charCodeAt(n+1))?(o=65536+((1023&o)<<10)+(1023&e.charCodeAt(++n)),t[r++]=o>>18|240,t[r++]=o>>12&63|128,t[r++]=o>>6&63|128,t[r++]=63&o|128):(t[r++]=o>>12|224,t[r++]=o>>6&63|128,t[r++]=63&o|128)}return t},o=function(e){for(var t=[],r=0,n=0;r<e.length;){var o=e[r++];if(o<128)t[n++]=String.fromCharCode(o);else if(o>191&&o<224){var i=e[r++];t[n++]=String.fromCharCode((31&o)<<6|63&i)}else if(o>239&&o<365){var i=e[r++],a=e[r++],c=e[r++],s=((7&o)<<18|(63&i)<<12|(63&a)<<6|63&c)-65536;t[n++]=String.fromCharCode(55296+(s>>10)),t[n++]=String.fromCharCode(56320+(1023&s))}else{var i=e[r++],a=e[r++];t[n++]=String.fromCharCode((15&o)<<12|(63&i)<<6|63&a)}}return t.join(\"\")};t.base64={y:null,b:null,_:null,g:null,ENCODED_VALS_BASE:\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\",get ENCODED_VALS(){return this.ENCODED_VALS_BASE+\"+/=\"},get ENCODED_VALS_WEBSAFE(){return this.ENCODED_VALS_BASE+\"-_.\"},HAS_NATIVE_SUPPORT:\"function\"==typeof atob,encodeByteArray:function(e,t){if(!Array.isArray(e))throw Error(\"encodeByteArray takes an array as a parameter\");this.O();for(var r=t?this._:this.y,n=[],o=0;o<e.length;o+=3){var i=e[o],a=o+1<e.length,c=a?e[o+1]:0,s=o+2<e.length,u=s?e[o+2]:0,f=i>>2,h=(3&i)<<4|c>>4,l=(15&c)<<2|u>>6,p=63&u;s||(p=64,a||(l=64)),n.push(r[f],r[h],r[l],r[p])}return n.join(\"\")},encodeString:function(e,t){return this.HAS_NATIVE_SUPPORT&&!t?btoa(e):this.encodeByteArray(n(e),t)},decodeString:function(e,t){return this.HAS_NATIVE_SUPPORT&&!t?atob(e):o(this.decodeStringToByteArray(e,t))},decodeStringToByteArray:function(e,t){this.O();for(var r=t?this.g:this.b,n=[],o=0;o<e.length;){var i=r[e.charAt(o++)],a=o<e.length,c=a?r[e.charAt(o)]:0;++o;var s=o<e.length,u=s?r[e.charAt(o)]:64;++o;var f=o<e.length,h=f?r[e.charAt(o)]:64;if(++o,null==i||null==c||null==u||null==h)throw Error();var l=i<<2|c>>4;if(n.push(l),64!=u){var p=c<<4&240|u>>2;if(n.push(p),64!=h){var d=u<<6&192|h;n.push(d)}}}return n},O:function(){if(!this.y){this.y={},this.b={},this._={},this.g={};for(var e=0;e<this.ENCODED_VALS.length;e++)this.y[e]=this.ENCODED_VALS.charAt(e),this.b[this.y[e]]=e,this._[e]=this.ENCODED_VALS_WEBSAFE.charAt(e),this.g[this._[e]]=e,e>=this.ENCODED_VALS_BASE.length&&(this.b[this.ENCODED_VALS_WEBSAFE.charAt(e)]=e,this.g[this.ENCODED_VALS.charAt(e)]=e)}}},t.base64Encode=function(e){var r=n(e);return t.base64.encodeByteArray(r,!0)},t.base64Decode=function(e){try{return t.base64.decodeString(e,!0)}catch(e){console.error(\"base64Decode failed: \",e)}return null}},function(e,t,r){\"use strict\";function n(e){return JSON.parse(e)}function o(e){return JSON.stringify(e)}Object.defineProperty(t,\"__esModule\",{value:!0}),t.jsonEval=n,t.stringify=o},function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.contains=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.safeGet=function(e,t){if(Object.prototype.hasOwnProperty.call(e,t))return e[t]},t.forEach=function(e,t){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t(r,e[r])},t.extend=function(e,r){return t.forEach(r,function(t,r){e[t]=r}),e},t.clone=function(e){return t.extend({},e)},t.isNonNullObject=function(e){return\"object\"==typeof e&&null!==e},t.isEmpty=function(e){for(var t in e)return!1;return!0},t.getCount=function(e){var t=0;for(var r in e)t++;return t},t.map=function(e,t,r){var n={};for(var o in e)n[o]=t.call(r,e[o],o,e);return n},t.findKey=function(e,t,r){for(var n in e)if(t.call(r,e[n],n,e))return n},t.findValue=function(e,r,n){var o=t.findKey(e,r,n);return o&&e[o]},t.getAnyKey=function(e){for(var t in e)return t},t.getValues=function(e){var t=[],r=0;for(var n in e)t[r++]=e[n];return t},t.every=function(e,t){for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r)&&!t(r,e[r]))return!1;return!0}},,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,r){r(58),e.exports=r(6).default},function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=r(59),o=(r.n(n),r(63)),i=(r.n(o),r(64));r.n(i)},function(t,r,n){(function(t){var r=function(){if(void 0!==t)return t;if(void 0!==e)return e;if(\"undefined\"!=typeof self)return self;throw Error(\"unable to locate global object\")}();\"undefined\"==typeof Promise&&(r.Promise=Promise=n(60))}).call(r,n(12))},function(e,t,r){(function(t){!function(r){function n(){}function o(e,t){return function(){e.apply(t,arguments)}}function i(e){if(\"object\"!=typeof this)throw new TypeError(\"Promises must be constructed via new\");if(\"function\"!=typeof e)throw new TypeError(\"not a function\");this._state=0,this._handled=!1,this._value=void 0,this.T=[],h(e,this)}function a(e,t){for(;3===e._state;)e=e._value;if(0===e._state)return void e.T.push(t);e._handled=!0,i.A(function(){var r=1===e._state?t.onFulfilled:t.onRejected;if(null===r)return void(1===e._state?c:s)(t.promise,e._value);var n;try{n=r(e._value)}catch(e){return void s(t.promise,e)}c(t.promise,n)})}function c(e,t){try{if(t===e)throw new TypeError(\"A promise cannot be resolved with itself.\");if(t&&(\"object\"==typeof t||\"function\"==typeof t)){var r=t.then;if(t instanceof i)return e._state=3,e._value=t,void u(e);if(\"function\"==typeof r)return void h(o(r,t),e)}e._state=1,e._value=t,u(e)}catch(t){s(e,t)}}function s(e,t){e._state=2,e._value=t,u(e)}function u(e){2===e._state&&0===e.T.length&&i.A(function(){e._handled||i.j(e._value)});for(var t=0,r=e.T.length;t<r;t++)a(e,e.T[t]);e.T=null}function f(e,t,r){this.onFulfilled=\"function\"==typeof e?e:null,this.onRejected=\"function\"==typeof t?t:null,this.promise=r}function h(e,t){var r=!1;try{e(function(e){r||(r=!0,c(t,e))},function(e){r||(r=!0,s(t,e))})}catch(e){if(r)return;r=!0,s(t,e)}}var l=setTimeout;i.prototype.catch=function(e){return this.then(null,e)},i.prototype.then=function(e,t){var r=new this.constructor(n);return a(this,new f(e,t,r)),r},i.all=function(e){var t=Array.prototype.slice.call(e);return new i(function(e,r){function n(i,a){try{if(a&&(\"object\"==typeof a||\"function\"==typeof a)){var c=a.then;if(\"function\"==typeof c)return void c.call(a,function(e){n(i,e)},r)}t[i]=a,0==--o&&e(t)}catch(e){r(e)}}if(0===t.length)return e([]);for(var o=t.length,i=0;i<t.length;i++)n(i,t[i])})},i.resolve=function(e){return e&&\"object\"==typeof e&&e.constructor===i?e:new i(function(t){t(e)})},i.reject=function(e){return new i(function(t,r){r(e)})},i.race=function(e){return new i(function(t,r){for(var n=0,o=e.length;n<o;n++)e[n].then(t,r)})},i.A=\"function\"==typeof t&&function(e){t(e)}||function(e){l(e,0)},i.j=function(e){\"undefined\"!=typeof console&&console&&console.warn(\"Possible Unhandled Promise Rejection:\",e)},i.S=function(e){i.A=e},i.w=function(e){i.j=e},void 0!==e&&e.exports?e.exports=i:r.Promise||(r.Promise=i)}(this)}).call(t,r(61).setImmediate)},function(t,r,n){function o(e,t){this.P=e,this._clearFn=t}var i=Function.prototype.apply;r.setTimeout=function(){return new o(i.call(setTimeout,e,arguments),clearTimeout)},r.setInterval=function(){return new o(i.call(setInterval,e,arguments),clearInterval)},r.clearTimeout=r.clearInterval=function(e){e&&e.close()},o.prototype.unref=o.prototype.ref=function(){},o.prototype.close=function(){this._clearFn.call(e,this.P)},r.enroll=function(e,t){clearTimeout(e.N),e.C=t},r.unenroll=function(e){clearTimeout(e.N),e.C=-1},r.k=r.active=function(e){clearTimeout(e.N);var t=e.C;t>=0&&(e.N=setTimeout(function(){e.M&&e.M()},t))},n(62),r.setImmediate=setImmediate,r.clearImmediate=clearImmediate},function(e,t,r){(function(e,t){!function(e,r){\"use strict\";function n(e){\"function\"!=typeof e&&(e=Function(\"\"+e));for(var t=Array(arguments.length-1),r=0;r<t.length;r++)t[r]=arguments[r+1];var n={callback:e,args:t};return u[s]=n,c(s),s++}function o(e){delete u[e]}function i(e){var t=e.callback,n=e.args;switch(n.length){case 0:t();break;case 1:t(n[0]);break;case 2:t(n[0],n[1]);break;case 3:t(n[0],n[1],n[2]);break;default:t.apply(r,n)}}function a(e){if(f)setTimeout(a,0,e);else{var t=u[e];if(t){f=!0;try{i(t)}finally{o(e),f=!1}}}}if(!e.setImmediate){var c,s=1,u={},f=!1,h=e.document,l=Object.getPrototypeOf&&Object.getPrototypeOf(e);l=l&&l.setTimeout?l:e,\"[object process]\"==={}.toString.call(e.process)?function(){c=function(e){t.nextTick(function(){a(e)})}}():function(){if(e.postMessage&&!e.importScripts){var t=!0,r=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage(\"\",\"*\"),e.onmessage=r,t}}()?function(){var t=\"setImmediate$\"+Math.random()+\"$\",r=function(r){r.source===e&&\"string\"==typeof r.data&&0===r.data.indexOf(t)&&a(+r.data.slice(t.length))};e.addEventListener?e.addEventListener(\"message\",r,!1):e.attachEvent(\"onmessage\",r),c=function(r){e.postMessage(t+r,\"*\")}}():e.MessageChannel?function(){var e=new MessageChannel;e.port1.onmessage=function(e){a(e.data)},c=function(t){e.port2.postMessage(t)}}():h&&\"onreadystatechange\"in h.createElement(\"script\")?function(){var e=h.documentElement;c=function(t){var r=h.createElement(\"script\");r.onreadystatechange=function(){a(t),r.onreadystatechange=null,e.removeChild(r),r=null},e.appendChild(r)}}():function(){c=function(e){setTimeout(a,0,e)}}(),l.setImmediate=n,l.clearImmediate=o}}(\"undefined\"==typeof self?void 0===e?this:e:self)}).call(t,r(12),r(27))},function(e,t){Array.prototype.find||Object.defineProperty(Array.prototype,\"find\",{value:function(e){if(null==this)throw new TypeError('\"this\" is null or not defined');var t=Object(this),r=t.length>>>0;if(\"function\"!=typeof e)throw new TypeError(\"predicate must be a function\");for(var n=arguments[1],o=0;o<r;){var i=t[o];if(e.call(n,i,o,t))return i;o++}}})},function(e,t){Array.prototype.findIndex||Object.defineProperty(Array.prototype,\"findIndex\",{value:function(e){if(null==this)throw new TypeError('\"this\" is null or not defined');var t=Object(this),r=t.length>>>0;if(\"function\"!=typeof e)throw new TypeError(\"predicate must be a function\");for(var n=arguments[1],o=0;o<r;){var i=t[o];if(e.call(n,i,o,t))return o;o++}return-1}})},function(e,t,r){\"use strict\";function n(e){return o(void 0,e)}function o(e,t){if(!(t instanceof Object))return t;switch(t.constructor){case Date:var r=t;return new Date(r.getTime());case Object:void 0===e&&(e={});break;case Array:e=[];break;default:return t}for(var n in t)t.hasOwnProperty(n)&&(e[n]=o(e[n],t[n]));return e}function i(e,t,r){e[t]=r}Object.defineProperty(t,\"__esModule\",{value:!0}),t.deepCopy=n,t.deepExtend=o,t.patchProperty=i},function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){var e=this;this.promise=new Promise(function(t,r){e.resolve=t,e.reject=r})}return e.prototype.wrapCallback=function(e){var t=this;return function(r,n){r?t.reject(r):t.resolve(n),\"function\"==typeof e&&(t.promise.catch(function(){}),1===e.length?e(r):e(r,n))}},e}();t.Deferred=n},function(t,r,n){\"use strict\";Object.defineProperty(r,\"__esModule\",{value:!0});var o=n(20);r.getUA=function(){return\"undefined\"!=typeof navigator&&\"string\"==typeof navigator.userAgent?navigator.userAgent:\"\"},r.isMobileCordova=function(){return void 0!==e&&!!(e.cordova||e.phonegap||e.PhoneGap)&&/ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(r.getUA())},r.isReactNative=function(){return\"object\"==typeof navigator&&\"ReactNative\"===navigator.product},r.isNodeSdk=function(){return!0===o.CONSTANTS.NODE_CLIENT||!0===o.CONSTANTS.NODE_ADMIN}},function(e,t,r){\"use strict\";function n(e){var t=i;return i=e,t}Object.defineProperty(t,\"__esModule\",{value:!0});var o=\"FirebaseError\",i=Error.captureStackTrace;t.patchCapture=n;var a=function(){function e(e,t){if(this.code=e,this.message=t,i)i(this,c.prototype.create);else{var r=Error.apply(this,arguments);this.name=o,Object.defineProperty(this,\"stack\",{get:function(){return r.stack}})}}return e}();t.FirebaseError=a,a.prototype=Object.create(Error.prototype),a.prototype.constructor=a,a.prototype.name=o;var c=function(){function e(e,t,r){this.service=e,this.serviceName=t,this.errors=r,this.pattern=/\\{\\$([^}]+)}/g}return e.prototype.create=function(e,t){void 0===t&&(t={});var r,n=this.errors[e],o=this.service+\"/\"+e;r=void 0===n?\"Error\":n.replace(this.pattern,function(e,r){var n=t[r];return void 0!==n?\"\"+n:\"<\"+r+\"?>\"}),r=this.serviceName+\": \"+r+\" (\"+o+\").\";var i=new a(o,r);for(var c in t)t.hasOwnProperty(c)&&\"_\"!==c.slice(-1)&&(i[c]=t[c]);return i},e}();t.ErrorFactory=c},function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=r(29),o=r(30);t.decode=function(e){var t={},r={},i={},a=\"\";try{var c=e.split(\".\");t=o.jsonEval(n.base64Decode(c[0])||\"\"),r=o.jsonEval(n.base64Decode(c[1])||\"\"),a=c[2],i=r.d||{},delete r.d}catch(e){}return{header:t,claims:r,data:i,signature:a}},t.isValidTimestamp=function(e){var r,n,o=t.decode(e).claims,i=Math.floor((new Date).getTime()/1e3);return\"object\"==typeof o&&(o.hasOwnProperty(\"nbf\")?r=o.nbf:o.hasOwnProperty(\"iat\")&&(r=o.iat),n=o.hasOwnProperty(\"exp\")?o.exp:r+86400),i&&r&&n&&i>=r&&i<=n},t.issuedAtTime=function(e){var r=t.decode(e).claims;return\"object\"==typeof r&&r.hasOwnProperty(\"iat\")?r.iat:null},t.isValidFormat=function(e){var r=t.decode(e),n=r.claims;return!!r.signature&&!!n&&\"object\"==typeof n&&n.hasOwnProperty(\"iat\")},t.isAdmin=function(e){var r=t.decode(e).claims;return\"object\"==typeof r&&!0===r.admin}},function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=r(31);t.querystring=function(e){var t=[];return n.forEach(e,function(e,r){Array.isArray(r)?r.forEach(function(r){t.push(encodeURIComponent(e)+\"=\"+encodeURIComponent(r))}):t.push(encodeURIComponent(e)+\"=\"+encodeURIComponent(r))}),t.length?\"&\"+t.join(\"&\"):\"\"},t.querystringDecode=function(e){var t={};return e.replace(/^\\?/,\"\").split(\"&\").forEach(function(e){if(e){var r=e.split(\"=\");t[r[0]]=r[1]}}),t}},function(e,t,r){\"use strict\";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(t,\"__esModule\",{value:!0});var o=r(72),i=function(e){function t(){var t=e.call(this)||this;t.D=[],t.I=[],t.x=[],t.F=[],t.L=0,t.R=0,t.blockSize=64,t.F[0]=128;for(var r=1;r<t.blockSize;++r)t.F[r]=0;return t.reset(),t}return n(t,e),t.prototype.reset=function(){this.D[0]=1732584193,this.D[1]=4023233417,this.D[2]=2562383102,this.D[3]=271733878,this.D[4]=3285377520,this.L=0,this.R=0},t.prototype.B=function(e,t){t||(t=0);var r=this.x;if(\"string\"==typeof e)for(var n=0;n<16;n++)r[n]=e.charCodeAt(t)<<24|e.charCodeAt(t+1)<<16|e.charCodeAt(t+2)<<8|e.charCodeAt(t+3),t+=4;else for(var n=0;n<16;n++)r[n]=e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3],t+=4;for(var n=16;n<80;n++){var o=r[n-3]^r[n-8]^r[n-14]^r[n-16];r[n]=4294967295&(o<<1|o>>>31)}for(var i,a,c=this.D[0],s=this.D[1],u=this.D[2],f=this.D[3],h=this.D[4],n=0;n<80;n++){n<40?n<20?(i=f^s&(u^f),a=1518500249):(i=s^u^f,a=1859775393):n<60?(i=s&u|f&(s|u),a=2400959708):(i=s^u^f,a=3395469782);var o=(c<<5|c>>>27)+i+h+a+r[n]&4294967295;h=f,f=u,u=4294967295&(s<<30|s>>>2),s=c,c=o}this.D[0]=this.D[0]+c&4294967295,this.D[1]=this.D[1]+s&4294967295,this.D[2]=this.D[2]+u&4294967295,this.D[3]=this.D[3]+f&4294967295,this.D[4]=this.D[4]+h&4294967295},t.prototype.update=function(e,t){if(null!=e){void 0===t&&(t=e.length);for(var r=t-this.blockSize,n=0,o=this.I,i=this.L;n<t;){if(0==i)for(;n<=r;)this.B(e,n),n+=this.blockSize;if(\"string\"==typeof e){for(;n<t;)if(o[i]=e.charCodeAt(n),++i,++n,i==this.blockSize){this.B(o),i=0;break}}else for(;n<t;)if(o[i]=e[n],++i,++n,i==this.blockSize){this.B(o),i=0;break}}this.L=i,this.R+=t}},t.prototype.digest=function(){var e=[],t=8*this.R;this.L<56?this.update(this.F,56-this.L):this.update(this.F,this.blockSize-(this.L-56));for(var r=this.blockSize-1;r>=56;r--)this.I[r]=255&t,t/=256;this.B(this.I);for(var n=0,r=0;r<5;r++)for(var o=24;o>=0;o-=8)e[n]=this.D[r]>>o&255,++n;return e},t}(o.Hash);t.Sha1=i},function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){this.blockSize=-1}return e}();t.Hash=n},function(e,t,r){\"use strict\";function n(e,t){var r=new c(e,t);return r.subscribe.bind(r)}function o(e,t){return function(){for(var r=[],n=0;n<arguments.length;n++)r[n]=arguments[n];Promise.resolve(!0).then(function(){e.apply(void 0,r)}).catch(function(e){t&&t(e)})}}function i(e,t){if(\"object\"!=typeof e||null===e)return!1;for(var r=0,n=t;r<n.length;r++){var o=n[r];if(o in e&&\"function\"==typeof e[o])return!0}return!1}function a(){}Object.defineProperty(t,\"__esModule\",{value:!0}),t.createSubscribe=n;var c=function(){function e(e,t){var r=this;this.observers=[],this.unsubscribes=[],this.observerCount=0,this.task=Promise.resolve(),this.finalized=!1,this.onNoObservers=t,this.task.then(function(){e(r)}).catch(function(e){r.error(e)})}return e.prototype.next=function(e){this.forEachObserver(function(t){t.next(e)})},e.prototype.error=function(e){this.forEachObserver(function(t){t.error(e)}),this.close(e)},e.prototype.complete=function(){this.forEachObserver(function(e){e.complete()}),this.close()},e.prototype.subscribe=function(e,t,r){var n,o=this;if(void 0===e&&void 0===t&&void 0===r)throw Error(\"Missing Observer.\");n=i(e,[\"next\",\"error\",\"complete\"])?e:{next:e,error:t,complete:r},void 0===n.next&&(n.next=a),void 0===n.error&&(n.error=a),void 0===n.complete&&(n.complete=a);var c=this.unsubscribeOne.bind(this,this.observers.length);return this.finalized&&this.task.then(function(){try{o.finalError?n.error(o.finalError):n.complete()}catch(e){}}),this.observers.push(n),c},e.prototype.unsubscribeOne=function(e){void 0!==this.observers&&void 0!==this.observers[e]&&(delete this.observers[e],this.observerCount-=1,0===this.observerCount&&void 0!==this.onNoObservers&&this.onNoObservers(this))},e.prototype.forEachObserver=function(e){if(!this.finalized)for(var t=0;t<this.observers.length;t++)this.sendOne(t,e)},e.prototype.sendOne=function(e,t){var r=this;this.task.then(function(){if(void 0!==r.observers&&void 0!==r.observers[e])try{t(r.observers[e])}catch(e){\"undefined\"!=typeof console&&console.error&&console.error(e)}})},e.prototype.close=function(e){var t=this;this.finalized||(this.finalized=!0,void 0!==e&&(this.finalError=e),this.task.then(function(){t.observers=void 0,t.onNoObservers=void 0}))},e}();t.async=o},function(e,t,r){\"use strict\";function n(e,t,r){var n=\"\";switch(t){case 1:n=r?\"first\":\"First\";break;case 2:n=r?\"second\":\"Second\";break;case 3:n=r?\"third\":\"Third\";break;case 4:n=r?\"fourth\":\"Fourth\";break;default:throw Error(\"errorPrefix called with argumentNumber > 4.  Need to update it?\")}var o=e+\" failed: \";return o+=n+\" argument \"}function o(e,t,r,o){if((!o||r)&&\"string\"!=typeof r)throw Error(n(e,t,o)+\"must be a valid firebase namespace.\")}function i(e,t,r,o){if((!o||r)&&\"function\"!=typeof r)throw Error(n(e,t,o)+\"must be a valid function.\")}function a(e,t,r,o){if((!o||r)&&(\"object\"!=typeof r||null===r))throw Error(n(e,t,o)+\"must be a valid context object.\")}Object.defineProperty(t,\"__esModule\",{value:!0}),t.validateArgCount=function(e,t,r,n){var o;if(n<t?o=\"at least \"+t:n>r&&(o=0===r?\"none\":\"no more than \"+r),o){var i=e+\" failed: Was called with \"+n+(1===n?\" argument.\":\" arguments.\")+\" Expects \"+o+\".\";throw Error(i)}},t.errorPrefix=n,t.validateNamespace=o,t.validateCallback=i,t.validateContextObject=a},function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=r(28);t.stringToByteArray=function(e){for(var t=[],r=0,o=0;o<e.length;o++){var i=e.charCodeAt(o);if(i>=55296&&i<=56319){var a=i-55296;o++,n.assert(o<e.length,\"Surrogate pair missing trail surrogate.\"),i=65536+(a<<10)+(e.charCodeAt(o)-56320)}i<128?t[r++]=i:i<2048?(t[r++]=i>>6|192,t[r++]=63&i|128):i<65536?(t[r++]=i>>12|224,t[r++]=i>>6&63|128,t[r++]=63&i|128):(t[r++]=i>>18|240,t[r++]=i>>12&63|128,t[r++]=i>>6&63|128,t[r++]=63&i|128)}return t},t.stringLength=function(e){for(var t=0,r=0;r<e.length;r++){var n=e.charCodeAt(r);n<128?t++:n<2048?t+=2:n>=55296&&n<=56319?(t+=4,r++):t+=3}return t}}])}().default;\n\n/*!\n * @license Firebase v4.9.0\n * Build: rev-a586a7f\n * Terms: https://firebase.google.com/terms/\n */\ntry{webpackJsonpFirebase([4],{76:function(t,n,e){e(77)},77:function(t,n,e){(function(t){(function(){function t(t){return\"string\"==typeof t}function n(t){return\"boolean\"==typeof t}function i(){}function r(t){var n=typeof t;if(\"object\"==n){if(!t)return\"null\";if(t instanceof Array)return\"array\";if(t instanceof Object)return n;var e=Object.prototype.toString.call(t);if(\"[object Window]\"==e)return\"object\";if(\"[object Array]\"==e||\"number\"==typeof t.length&&void 0!==t.splice&&void 0!==t.propertyIsEnumerable&&!t.propertyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==e||void 0!==t.call&&void 0!==t.propertyIsEnumerable&&!t.propertyIsEnumerable(\"call\"))return\"function\"}else if(\"function\"==n&&void 0===t.call)return\"object\";return n}function o(t){return null===t}function a(t){return\"array\"==r(t)}function s(t){var n=r(t);return\"array\"==n||\"object\"==n&&\"number\"==typeof t.length}function u(t){return\"function\"==r(t)}function c(t){var n=typeof t;return\"object\"==n&&null!=t||\"function\"==n}function h(t,n,e){return t.call.apply(t.bind,arguments)}function f(t,n,e){if(!t)throw Error();if(2<arguments.length){var i=Array.prototype.slice.call(arguments,2);return function(){var e=Array.prototype.slice.call(arguments);return Array.prototype.unshift.apply(e,i),t.apply(n,e)}}return function(){return t.apply(n,arguments)}}function l(t,n,e){return l=Function.prototype.bind&&-1!=(\"\"+Function.prototype.bind).indexOf(\"native code\")?h:f,l.apply(null,arguments)}function d(t,n){var e=Array.prototype.slice.call(arguments,1);return function(){var n=e.slice();return n.push.apply(n,arguments),t.apply(this,n)}}function p(t,n){function e(){}e.prototype=n.prototype,t.ib=n.prototype,t.prototype=new e,t.prototype.constructor=t,t.Rc=function(t,e,i){for(var r=Array(arguments.length-2),o=2;o<arguments.length;o++)r[o-2]=arguments[o];return n.prototype[e].apply(t,r)}}function v(t){if(Error.captureStackTrace)Error.captureStackTrace(this,v);else{var n=Error().stack;n&&(this.stack=n)}t&&(this.message=t+\"\")}function m(t,n){for(var e=t.split(\"%s\"),i=\"\",r=Array.prototype.slice.call(arguments,1);r.length&&1<e.length;)i+=e.shift()+r.shift();return i+e.join(\"%s\")}function g(t){return wu.test(t)?(-1!=t.indexOf(\"&\")&&(t=t.replace(du,\"&amp;\")),-1!=t.indexOf(\"<\")&&(t=t.replace(pu,\"&lt;\")),-1!=t.indexOf(\">\")&&(t=t.replace(vu,\"&gt;\")),-1!=t.indexOf('\"')&&(t=t.replace(mu,\"&quot;\")),-1!=t.indexOf(\"'\")&&(t=t.replace(gu,\"&#39;\")),-1!=t.indexOf(\"\\0\")&&(t=t.replace(bu,\"&#0;\")),t):t}function b(t,n){return-1!=t.indexOf(n)}function w(t,n){return t<n?-1:t>n?1:0}function y(t,n){n.unshift(t),v.call(this,m.apply(null,n)),n.shift()}function I(t,n){throw new y(\"Failure\"+(t?\": \"+t:\"\"),Array.prototype.slice.call(arguments,1))}function T(n,e){var i=n.length,r=t(n)?n.split(\"\"):n;for(--i;0<=i;--i)i in r&&e.call(void 0,r[i],i,n)}function A(n){t:{for(var e=Ae,i=n.length,r=t(n)?n.split(\"\"):n,o=0;o<i;o++)if(o in r&&e.call(void 0,r[o],o,n)){e=o;break t}e=-1}return 0>e?null:t(n)?n.charAt(e):n[e]}function k(t,n){return 0<=Iu(t,n)}function E(t,n){n=Iu(t,n);var e;return(e=0<=n)&&Array.prototype.splice.call(t,n,1),e}function N(t,n){var e=0;T(t,function(i,r){n.call(void 0,i,r,t)&&1==Array.prototype.splice.call(t,r,1).length&&e++})}function S(t){return Array.prototype.concat.apply([],arguments)}function O(t){var n=t.length;if(0<n){for(var e=Array(n),i=0;i<n;i++)e[i]=t[i];return e}return[]}function P(t){return b(yu,t)}function C(t,n){for(var e in t)n.call(void 0,t[e],e,t)}function R(t){var n,e=[],i=0;for(n in t)e[i++]=t[n];return e}function _(t){var n,e=[],i=0;for(n in t)e[i++]=n;return e}function D(t){for(var n in t)return!1;return!0}function L(t,n){for(var e in t)if(!(e in n)||t[e]!==n[e])return!1;for(e in n)if(!(e in t))return!1;return!0}function x(t){var n,e={};for(n in t)e[n]=t[n];return e}function U(t,n){for(var e,i,r=1;r<arguments.length;r++){i=arguments[r];for(e in i)t[e]=i[e];for(var o=0;o<Su.length;o++)e=Su[o],Object.prototype.hasOwnProperty.call(i,e)&&(t[e]=i[e])}}function j(t){return j[\" \"](t),t}function M(t,n){var e=Vu;return Object.prototype.hasOwnProperty.call(e,t)?e[t]:e[t]=n(t)}function V(){var t=uu.document;return t?t.documentMode:void 0}function F(t){return M(t,function(){for(var n=0,e=lu(Ou+\"\").split(\".\"),i=lu(t+\"\").split(\".\"),r=Math.max(e.length,i.length),o=0;0==n&&o<r;o++){var a=e[o]||\"\",s=i[o]||\"\";do{if(a=/(\\d*)(\\D*)(.*)/.exec(a)||[\"\",\"\",\"\",\"\"],s=/(\\d*)(\\D*)(.*)/.exec(s)||[\"\",\"\",\"\",\"\"],0==a[0].length&&0==s[0].length)break;n=w(0==a[1].length?0:parseInt(a[1],10),0==s[1].length?0:parseInt(s[1],10))||w(0==a[2].length,0==s[2].length)||w(a[2],s[2]),a=a[3],s=s[3]}while(0==n)}return 0<=n})}function K(t){t.prototype.then=t.prototype.then,t.prototype.$goog_Thenable=!0}function q(t){if(!t)return!1;try{return!!t.$goog_Thenable}catch(t){return!1}}function X(t,n,e){this.f=e,this.c=t,this.g=n,this.b=0,this.a=null}function B(t,n){t.g(n),t.b<t.f&&(t.b++,n.next=t.a,t.a=n)}function H(){var t=Hu,n=null;return t.a&&(n=t.a,t.a=t.a.next,t.a||(t.b=null),n.next=null),n}function W(){this.next=this.b=this.a=null}function G(t){uu.setTimeout(function(){throw t},0)}function z(){var t=uu.MessageChannel;if(void 0===t&&\"undefined\"!=typeof window&&window.postMessage&&window.addEventListener&&!P(\"Presto\")&&(t=function(){var t=document.createElement(\"IFRAME\");t.style.display=\"none\",t.src=\"\",document.documentElement.appendChild(t);var n=t.contentWindow;t=n.document,t.open(),t.write(\"\"),t.close();var e=\"callImmediate\"+Math.random(),i=\"file:\"==n.location.protocol?\"*\":n.location.protocol+\"//\"+n.location.host;t=l(function(t){\"*\"!=i&&t.origin!=i||t.data!=e||this.port1.onmessage()},this),n.addEventListener(\"message\",t,!1),this.port1={},this.port2={postMessage:function(){n.postMessage(e,i)}}}),void 0!==t&&!P(\"Trident\")&&!P(\"MSIE\")){var n=new t,e={},i=e;return n.port1.onmessage=function(){if(void 0!==e.next){e=e.next;var t=e.pb;e.pb=null,t()}},function(t){i.next={pb:t},i=i.next,n.port2.postMessage(0)}}return\"undefined\"!=typeof document&&\"onreadystatechange\"in document.createElement(\"SCRIPT\")?function(t){var n=document.createElement(\"SCRIPT\");n.onreadystatechange=function(){n.onreadystatechange=null,n.parentNode.removeChild(n),n=null,t(),t=null},document.documentElement.appendChild(n)}:function(t){uu.setTimeout(t,0)}}function J(t,n){Xu||Y(),Bu||(Xu(),Bu=!0);var e=Hu,i=Ku.get();i.set(t,n),e.b?e.b.next=i:e.a=i,e.b=i}function Y(){if(-1!=(uu.Promise+\"\").indexOf(\"[native code]\")){var t=uu.Promise.resolve(void 0);Xu=function(){t.then($)}}else Xu=function(){var t=$;!u(uu.setImmediate)||uu.Window&&uu.Window.prototype&&!P(\"Edge\")&&uu.Window.prototype.setImmediate==uu.setImmediate?(qu||(qu=z()),qu(t)):uu.setImmediate(t)}}function $(){for(var t;t=H();){try{t.a.call(t.b)}catch(t){G(t)}B(Ku,t)}Bu=!1}function Z(t,n){if(this.a=Wu,this.i=void 0,this.f=this.b=this.c=null,this.g=this.h=!1,t!=i)try{var e=this;t.call(n,function(t){ht(e,Gu,t)},function(t){if(!(t instanceof bt))try{if(t instanceof Error)throw t;throw Error(\"Promise rejected.\")}catch(t){}ht(e,zu,t)})}catch(t){ht(this,zu,t)}}function Q(){this.next=this.f=this.b=this.g=this.a=null,this.c=!1}function tt(t,n,e){var i=Ju.get();return i.g=t,i.b=n,i.f=e,i}function nt(t){if(t instanceof Z)return t;var n=new Z(i);return ht(n,Gu,t),n}function et(t){return new Z(function(n,e){e(t)})}function it(t,n,e){ft(t,n,e,null)||J(d(n,t))}function rt(t){return new Z(function(n,e){var i=t.length,r=[];if(i)for(var o,a=function(t,e){i--,r[t]=e,0==i&&n(r)},s=function(t){e(t)},u=0;u<t.length;u++)o=t[u],it(o,d(a,u),s);else n(r)})}function ot(t){return new Z(function(n){var e=t.length,i=[];if(e)for(var r,o=function(t,r,o){e--,i[t]=r?{Ub:!0,value:o}:{Ub:!1,reason:o},0==e&&n(i)},a=0;a<t.length;a++)r=t[a],it(r,d(o,a,!0),d(o,a,!1));else n(i)})}function at(t,n){return n=tt(n,n,void 0),n.c=!0,ut(t,n),t}function st(t,n){if(t.a==Wu)if(t.c){var e=t.c;if(e.b){for(var i=0,r=null,o=null,a=e.b;a&&(a.c||(i++,a.a==t&&(r=a),!(r&&1<i)));a=a.next)r||(o=a);r&&(e.a==Wu&&1==i?st(e,n):(o?(i=o,i.next==e.f&&(e.f=i),i.next=i.next.next):pt(e),vt(e,r,zu,n)))}t.c=null}else ht(t,zu,n)}function ut(t,n){t.b||t.a!=Gu&&t.a!=zu||dt(t),t.f?t.f.next=n:t.b=n,t.f=n}function ct(t,n,e,i){var r=tt(null,null,null);return r.a=new Z(function(t,o){r.g=n?function(e){try{var r=n.call(i,e);t(r)}catch(t){o(t)}}:t,r.b=e?function(n){try{var r=e.call(i,n);void 0===r&&n instanceof bt?o(n):t(r)}catch(t){o(t)}}:o}),r.a.c=t,ut(t,r),r.a}function ht(t,n,e){t.a==Wu&&(t===e&&(n=zu,e=new TypeError(\"Promise cannot resolve to itself\")),t.a=1,ft(e,t.Ac,t.Bc,t)||(t.i=e,t.a=n,t.c=null,dt(t),n!=zu||e instanceof bt||gt(t,e)))}function ft(t,n,e,r){if(t instanceof Z)return ut(t,tt(n||i,e||null,r)),!0;if(q(t))return t.then(n,e,r),!0;if(c(t))try{var o=t.then;if(u(o))return lt(t,o,n,e,r),!0}catch(t){return e.call(r,t),!0}return!1}function lt(t,n,e,i,r){function o(t){s||(s=!0,i.call(r,t))}function a(t){s||(s=!0,e.call(r,t))}var s=!1;try{n.call(t,a,o)}catch(t){o(t)}}function dt(t){t.h||(t.h=!0,J(t.Qb,t))}function pt(t){var n=null;return t.b&&(n=t.b,t.b=n.next,n.next=null),t.b||(t.f=null),n}function vt(t,n,e,i){if(e==zu&&n.b&&!n.c)for(;t&&t.g;t=t.c)t.g=!1;if(n.a)n.a.c=null,mt(n,e,i);else try{n.c?n.g.call(n.f):mt(n,e,i)}catch(t){Yu.call(null,t)}B(Ju,n)}function mt(t,n,e){n==Gu?t.g.call(t.f,e):t.b&&t.b.call(t.f,e)}function gt(t,n){t.g=!0,J(function(){t.g&&Yu.call(null,n)})}function bt(t){v.call(this,t)}function wt(){this.a=\"\",this.b=Zu}function yt(t){return t instanceof wt&&t.constructor===wt&&t.b===Zu?t.a:(I(\"expected object of type Const, got '\"+t+\"'\"),\"type_error:Const\")}function It(t){var n=new wt;return n.a=t,n}function Tt(){this.a=\"\",this.b=nc}function At(t){return t instanceof Tt&&t.constructor===Tt&&t.b===nc?t.a:(I(\"expected object of type TrustedResourceUrl, got '\"+t+\"' of type \"+r(t)),\"type_error:TrustedResourceUrl\")}function kt(t,n){return t=Et(t,n),n=new Tt,n.a=t,n}function Et(t,n){var e=yt(t);if(!tc.test(e))throw Error(\"Invalid TrustedResourceUrl format: \"+e);return e.replace(Qu,function(t,i){if(!Object.prototype.hasOwnProperty.call(n,i))throw Error('Found marker, \"'+i+'\", in format string, \"'+e+'\", but no valid label mapping found in args: '+JSON.stringify(n));return t=n[i],t instanceof wt?yt(t):encodeURIComponent(t+\"\")})}function Nt(){this.a=\"\",this.b=ic}function St(t){return t instanceof Nt&&t.constructor===Nt&&t.b===ic?t.a:(I(\"expected object of type SafeUrl, got '\"+t+\"' of type \"+r(t)),\"type_error:SafeUrl\")}function Ot(t){return t instanceof Nt?t:(t=t.la?t.ja():t+\"\",ec.test(t)||(t=\"about:invalid#zClosurez\"),Pt(t))}function Pt(t){var n=new Nt;return n.a=t,n}function Ct(){this.a=\"\",this.b=rc}function Rt(t){return t instanceof Ct&&t.constructor===Ct&&t.b===rc?t.a:(I(\"expected object of type SafeHtml, got '\"+t+\"' of type \"+r(t)),\"type_error:SafeHtml\")}function _t(t){var n=new Ct;return n.a=t,n}function Dt(n){var e=document;return t(n)?e.getElementById(n):n}function Lt(t,n){C(n,function(n,e){n&&n.la&&(n=n.ja()),\"style\"==e?t.style.cssText=n:\"class\"==e?t.className=n:\"for\"==e?t.htmlFor=n:oc.hasOwnProperty(e)?t.setAttribute(oc[e],n):0==e.lastIndexOf(\"aria-\",0)||0==e.lastIndexOf(\"data-\",0)?t.setAttribute(e,n):t[e]=n})}function xt(n,e,i){var r=arguments,o=document,s=r[0]+\"\",u=r[1];if(!$u&&u&&(u.name||u.type)){if(s=[\"<\",s],u.name&&s.push(' name=\"',g(u.name),'\"'),u.type){s.push(' type=\"',g(u.type),'\"');var c={};U(c,u),delete c.type,u=c}s.push(\">\"),s=s.join(\"\")}return s=o.createElement(s),u&&(t(u)?s.className=u:a(u)?s.className=u.join(\" \"):Lt(s,u)),2<r.length&&Ut(o,s,r),s}function Ut(n,e,i){function r(i){i&&e.appendChild(t(i)?n.createTextNode(i):i)}for(var o=2;o<i.length;o++){var a=i[o];!s(a)||c(a)&&0<a.nodeType?r(a):Tu(jt(a)?O(a):a,r)}}function jt(t){if(t&&\"number\"==typeof t.length){if(c(t))return\"function\"==typeof t.item||\"string\"==typeof t.item;if(u(t))return\"function\"==typeof t.item}return!1}function Mt(t){var n=[];return Ft(new Vt,t,n),n.join(\"\")}function Vt(){}function Ft(t,n,e){if(null==n)e.push(\"null\");else{if(\"object\"==typeof n){if(a(n)){var i=n;n=i.length,e.push(\"[\");for(var r=\"\",o=0;o<n;o++)e.push(r),Ft(t,i[o],e),r=\",\";return void e.push(\"]\")}if(!(n instanceof String||n instanceof Number||n instanceof Boolean)){e.push(\"{\"),r=\"\";for(i in n)Object.prototype.hasOwnProperty.call(n,i)&&\"function\"!=typeof(o=n[i])&&(e.push(r),Kt(i,e),e.push(\":\"),Ft(t,o,e),r=\",\");return void e.push(\"}\")}n=n.valueOf()}switch(typeof n){case\"string\":Kt(n,e);break;case\"number\":e.push(isFinite(n)&&!isNaN(n)?n+\"\":\"null\");break;case\"boolean\":e.push(n+\"\");break;case\"function\":e.push(\"null\");break;default:throw Error(\"Unknown type: \"+typeof n)}}}function Kt(t,n){n.push('\"',t.replace(sc,function(t){var n=ac[t];return n||(n=\"\\\\u\"+(65536|t.charCodeAt(0)).toString(16).substr(1),ac[t]=n),n}),'\"')}function qt(){0!=uc&&(cc[this[cu]||(this[cu]=++hu)]=this),this.oa=this.oa,this.Fa=this.Fa}function Xt(t){t.oa||(t.oa=!0,t.ta(),0!=uc&&(t=t[cu]||(t[cu]=++hu),delete cc[t]))}function Bt(t,n){this.type=t,this.b=this.target=n,this.Bb=!0}function Ht(n,e){if(Bt.call(this,n?n.type:\"\"),this.relatedTarget=this.b=this.target=null,this.button=this.screenY=this.screenX=this.clientY=this.clientX=0,this.key=\"\",this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1,this.pointerId=0,this.pointerType=\"\",this.a=null,n){var i=this.type=n.type,r=n.changedTouches?n.changedTouches[0]:null;if(this.target=n.target||n.srcElement,this.b=e,e=n.relatedTarget){if(Du){t:{try{j(e.nodeName);var o=!0;break t}catch(t){}o=!1}o||(e=null)}}else\"mouseover\"==i?e=n.fromElement:\"mouseout\"==i&&(e=n.toElement);this.relatedTarget=e,null===r?(this.clientX=void 0!==n.clientX?n.clientX:n.pageX,this.clientY=void 0!==n.clientY?n.clientY:n.pageY,this.screenX=n.screenX||0,this.screenY=n.screenY||0):(this.clientX=void 0!==r.clientX?r.clientX:r.pageX,this.clientY=void 0!==r.clientY?r.clientY:r.pageY,this.screenX=r.screenX||0,this.screenY=r.screenY||0),this.button=n.button,this.key=n.key||\"\",this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.pointerId=n.pointerId||0,this.pointerType=t(n.pointerType)?n.pointerType:pc[n.pointerType]||\"\",this.a=n,n.defaultPrevented&&this.c()}}function Wt(t,n,e,i,r){this.listener=t,this.a=null,this.src=n,this.type=e,this.capture=!!i,this.La=r,this.key=++mc,this.ma=this.Ha=!1}function Gt(t){t.ma=!0,t.listener=null,t.a=null,t.src=null,t.La=null}function zt(t){this.src=t,this.a={},this.b=0}function Jt(t,n,e,i,r,o){var a=\"\"+n;(n=t.a[a])||(n=t.a[a]=[],t.b++);var s=$t(n,e,r,o);return-1<s?(t=n[s],i||(t.Ha=!1)):(t=new Wt(e,t.src,a,!!r,o),t.Ha=i,n.push(t)),t}function Yt(t,n){var e=n.type;e in t.a&&E(t.a[e],n)&&(Gt(n),0==t.a[e].length&&(delete t.a[e],t.b--))}function $t(t,n,e,i){for(var r=0;r<t.length;++r){var o=t[r];if(!o.ma&&o.listener==n&&o.capture==!!e&&o.La==i)return r}return-1}function Zt(t,n,e,i,r){if(i&&i.once)nn(t,n,e,i,r);else if(a(n))for(var o=0;o<n.length;o++)Zt(t,n[o],e,i,r);else e=hn(e),t&&t[vc]?dn(t,n,e,c(i)?!!i.capture:!!i,r):Qt(t,n,e,!1,i,r)}function Qt(t,n,e,i,r,o){if(!n)throw Error(\"Invalid event type\");var a=c(r)?!!r.capture:!!r,s=cn(t);if(s||(t[gc]=s=new zt(t)),e=Jt(s,n,e,i,a,o),!e.a){if(i=tn(),e.a=i,i.src=t,i.listener=e,t.addEventListener)dc||(r=a),void 0===r&&(r=!1),t.addEventListener(\"\"+n,i,r);else{if(!t.attachEvent)throw Error(\"addEventListener and attachEvent are unavailable.\");t.attachEvent(on(\"\"+n),i)}wc++}}function tn(){var t=un,n=fc?function(e){return t.call(n.src,n.listener,e)}:function(e){if(!(e=t.call(n.src,n.listener,e)))return e};return n}function nn(t,n,e,i,r){if(a(n))for(var o=0;o<n.length;o++)nn(t,n[o],e,i,r);else e=hn(e),t&&t[vc]?pn(t,n,e,c(i)?!!i.capture:!!i,r):Qt(t,n,e,!0,i,r)}function en(t,n,e,i,r){if(a(n))for(var o=0;o<n.length;o++)en(t,n[o],e,i,r);else i=c(i)?!!i.capture:!!i,e=hn(e),t&&t[vc]?(t=t.u,(n+=\"\")in t.a&&(o=t.a[n],-1<(e=$t(o,e,i,r))&&(Gt(o[e]),Array.prototype.splice.call(o,e,1),0==o.length&&(delete t.a[n],t.b--)))):t&&(t=cn(t))&&(n=t.a[\"\"+n],t=-1,n&&(t=$t(n,e,i,r)),(e=-1<t?n[t]:null)&&rn(e))}function rn(t){if(\"number\"!=typeof t&&t&&!t.ma){var n=t.src;if(n&&n[vc])Yt(n.u,t);else{var e=t.type,i=t.a;n.removeEventListener?n.removeEventListener(e,i,t.capture):n.detachEvent&&n.detachEvent(on(e),i),wc--,(e=cn(n))?(Yt(e,t),0==e.b&&(e.src=null,n[gc]=null)):Gt(t)}}}function on(t){return t in bc?bc[t]:bc[t]=\"on\"+t}function an(t,n,e,i){var r=!0;if((t=cn(t))&&(n=t.a[\"\"+n]))for(n=n.concat(),t=0;t<n.length;t++){var o=n[t];o&&o.capture==e&&!o.ma&&(o=sn(o,i),r=r&&!1!==o)}return r}function sn(t,n){var e=t.listener,i=t.La||t.src;return t.Ha&&rn(t),e.call(i,n)}function un(t,n){if(t.ma)return!0;if(!fc){if(!n)t:{n=[\"window\",\"event\"];for(var e=uu,i=0;i<n.length;i++)if(null==(e=e[n[i]])){n=null;break t}n=e}if(i=n,n=new Ht(i,this),e=!0,!(0>i.keyCode||void 0!=i.returnValue)){t:{var r=!1;if(0==i.keyCode)try{i.keyCode=-1;break t}catch(t){r=!0}(r||void 0==i.returnValue)&&(i.returnValue=!0)}for(i=[],r=n.b;r;r=r.parentNode)i.push(r);for(t=t.type,r=i.length-1;0<=r;r--){n.b=i[r];var o=an(i[r],t,!0,n);e=e&&o}for(r=0;r<i.length;r++)n.b=i[r],o=an(i[r],t,!1,n),e=e&&o}return e}return sn(t,new Ht(n,this))}function cn(t){return t=t[gc],t instanceof zt?t:null}function hn(t){return u(t)?t:(t[yc]||(t[yc]=function(n){return t.handleEvent(n)}),t[yc])}function fn(){qt.call(this),this.u=new zt(this),this.Ib=this,this.Ra=null}function ln(n,e){var i,r=n.Ra;if(r)for(i=[];r;r=r.Ra)i.push(r);if(n=n.Ib,r=e.type||e,t(e))e=new Bt(e,n);else if(e instanceof Bt)e.target=e.target||n;else{var o=e;e=new Bt(r,n),U(e,o)}if(o=!0,i)for(var a=i.length-1;0<=a;a--){var s=e.b=i[a];o=vn(s,r,!0,e)&&o}if(s=e.b=n,o=vn(s,r,!0,e)&&o,o=vn(s,r,!1,e)&&o,i)for(a=0;a<i.length;a++)s=e.b=i[a],o=vn(s,r,!1,e)&&o}function dn(t,n,e,i,r){Jt(t.u,n+\"\",e,!1,i,r)}function pn(t,n,e,i,r){Jt(t.u,n+\"\",e,!0,i,r)}function vn(t,n,e,i){if(!(n=t.u.a[n+\"\"]))return!0;n=n.concat();for(var r=!0,o=0;o<n.length;++o){var a=n[o];if(a&&!a.ma&&a.capture==e){var s=a.listener,u=a.La||a.src;a.Ha&&Yt(t.u,a),r=!1!==s.call(u,i)&&r}}return r&&0!=i.Bb}function mn(t,n,e){if(u(t))e&&(t=l(t,e));else{if(!t||\"function\"!=typeof t.handleEvent)throw Error(\"Invalid listener argument\");t=l(t.handleEvent,t)}return 2147483647<+n?-1:uu.setTimeout(t,n||0)}function gn(t){var n=null;return new Z(function(e,i){-1==(n=mn(function(){e(void 0)},t))&&i(Error(\"Failed to schedule timer.\"))}).s(function(t){throw uu.clearTimeout(n),t})}function bn(t,n,e,i,r){this.reset(t,n,e,i,r)}function wn(t){this.f=t,this.b=this.c=this.a=null}function yn(t,n){this.name=t,this.value=n}function In(t){return t.c?t.c:t.a?In(t.a):(I(\"Root logger has no level set.\"),null)}function Tn(t){Nc||(Nc=new wn(\"\"),Ec[\"\"]=Nc,Nc.c=Ac);var n;if(!(n=Ec[t])){n=new wn(t);var e=t.lastIndexOf(\".\"),i=t.substr(e+1);e=Tn(t.substr(0,e)),e.b||(e.b={}),e.b[i]=n,n.a=e,Ec[t]=n}return n}function An(t,n){this.b={},this.a=[],this.c=0;var e=arguments.length;if(1<e){if(e%2)throw Error(\"Uneven number of arguments\");for(var i=0;i<e;i+=2)this.set(arguments[i],arguments[i+1])}else if(t){t instanceof An?(e=t.S(),i=t.P()):(e=_(t),i=R(t));for(var r=0;r<e.length;r++)this.set(e[r],i[r])}}function kn(t){if(t.c!=t.a.length){for(var n=0,e=0;n<t.a.length;){var i=t.a[n];En(t.b,i)&&(t.a[e++]=i),n++}t.a.length=e}if(t.c!=t.a.length){var r={};for(e=n=0;n<t.a.length;)i=t.a[n],En(r,i)||(t.a[e++]=i,r[i]=1),n++;t.a.length=e}}function En(t,n){return Object.prototype.hasOwnProperty.call(t,n)}function Nn(t,n){t&&t.log(kc,n,void 0)}function Sn(t){return Au(t,function(t){return t=t.toString(16),1<t.length?t:\"0\"+t}).join(\"\")}function On(t){var n=\"\";return Pn(t,function(t){n+=String.fromCharCode(t)}),n}function Pn(t,n){function e(n){for(;i<t.length;){var e=t.charAt(i++),r=Oc[e];if(null!=r)return r;if(!/^[\\s\\xa0]*$/.test(e))throw Error(\"Unknown base64 encoding at char: \"+e)}return n}Cn();for(var i=0;;){var r=e(-1),o=e(0),a=e(64),s=e(64);if(64===s&&-1===r)break;n(r<<2|o>>4),64!=a&&(n(o<<4&240|a>>2),64!=s&&n(a<<6&192|s))}}function Cn(){if(!Sc){Sc={},Oc={};for(var t=0;65>t;t++)Sc[t]=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".charAt(t),Oc[Sc[t]]=t,62<=t&&(Oc[\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.\".charAt(t)]=t)}}function Rn(t,n){this.g=[],this.v=t,this.o=n||null,this.f=this.a=!1,this.c=void 0,this.u=this.w=this.i=!1,this.h=0,this.b=null,this.l=0}function _n(t,n,e){t.a=!0,t.c=e,t.f=!n,jn(t)}function Dn(t){if(t.a){if(!t.u)throw new Mn;t.u=!1}}function Ln(t,n){xn(t,null,n,void 0)}function xn(t,n,e,i){t.g.push([n,e,i]),t.a&&jn(t)}function Un(t){return ku(t.g,function(t){return u(t[1])})}function jn(t){if(t.h&&t.a&&Un(t)){var n=t.h,e=Cc[n];e&&(uu.clearTimeout(e.a),delete Cc[n]),t.h=0}t.b&&(t.b.l--,delete t.b),n=t.c;for(var i=e=!1;t.g.length&&!t.i;){var r=t.g.shift(),o=r[0],a=r[1];if(r=r[2],o=t.f?a:o)try{var s=o.call(r||t.o,n);void 0!==s&&(t.f=t.f&&(s==n||s instanceof Error),t.c=n=s),(q(n)||\"function\"==typeof uu.Promise&&n instanceof uu.Promise)&&(i=!0,t.i=!0)}catch(i){n=i,t.f=!0,Un(t)||(e=!0)}}t.c=n,i&&(s=l(t.m,t,!0),i=l(t.m,t,!1),n instanceof Rn?(xn(n,s,i),n.w=!0):n.then(s,i)),e&&(n=new Fn(n),Cc[n.a]=n,t.h=n.a)}function Mn(){v.call(this)}function Vn(){v.call(this)}function Fn(t){this.a=uu.setTimeout(l(this.c,this),0),this.b=t}function Kn(){this.b=-1}function qn(t,n){this.b=-1,this.b=Rc,this.f=uu.Uint8Array?new Uint8Array(this.b):Array(this.b),this.g=this.c=0,this.a=[],this.i=t,this.h=n,this.l=uu.Int32Array?new Int32Array(64):Array(64),Pc||(Pc=uu.Int32Array?new Int32Array(Uc):Uc),this.reset()}function Xn(t){for(var n=t.f,e=t.l,i=0,r=0;r<n.length;)e[i++]=n[r]<<24|n[r+1]<<16|n[r+2]<<8|n[r+3],r=4*i;for(n=16;64>n;n++){r=0|e[n-15],i=0|e[n-2];var o=(0|e[n-16])+((r>>>7|r<<25)^(r>>>18|r<<14)^r>>>3)|0,a=(0|e[n-7])+((i>>>17|i<<15)^(i>>>19|i<<13)^i>>>10)|0;e[n]=o+a|0}i=0|t.a[0],r=0|t.a[1];var s=0|t.a[2],u=0|t.a[3],c=0|t.a[4],h=0|t.a[5],f=0|t.a[6];for(o=0|t.a[7],n=0;64>n;n++){var l=((i>>>2|i<<30)^(i>>>13|i<<19)^(i>>>22|i<<10))+(i&r^i&s^r&s)|0;a=c&h^~c&f,o=o+((c>>>6|c<<26)^(c>>>11|c<<21)^(c>>>25|c<<7))|0,a=a+(0|Pc[n])|0,a=o+(a+(0|e[n])|0)|0,o=f,f=h,h=c,c=u+a|0,u=s,s=r,r=i,i=a+l|0}t.a[0]=t.a[0]+i|0,t.a[1]=t.a[1]+r|0,t.a[2]=t.a[2]+s|0,t.a[3]=t.a[3]+u|0,t.a[4]=t.a[4]+c|0,t.a[5]=t.a[5]+h|0,t.a[6]=t.a[6]+f|0,t.a[7]=t.a[7]+o|0}function Bn(n,e,i){void 0===i&&(i=e.length);var r=0,o=n.c;if(t(e))for(;r<i;)n.f[o++]=e.charCodeAt(r++),o==n.b&&(Xn(n),o=0);else{if(!s(e))throw Error(\"message must be string or array\");for(;r<i;){var a=e[r++];if(!(\"number\"==typeof a&&0<=a&&255>=a&&a==(0|a)))throw Error(\"message must be a byte array\");n.f[o++]=a,o==n.b&&(Xn(n),o=0)}}n.c=o,n.g+=i}function Hn(){qn.call(this,8,jc)}function Wn(n){if(n.P&&\"function\"==typeof n.P)return n.P();if(t(n))return n.split(\"\");if(s(n)){for(var e=[],i=n.length,r=0;r<i;r++)e.push(n[r]);return e}return R(n)}function Gn(n){if(n.S&&\"function\"==typeof n.S)return n.S();if(!n.P||\"function\"!=typeof n.P){if(s(n)||t(n)){var e=[];n=n.length;for(var i=0;i<n;i++)e.push(i);return e}return _(n)}}function zn(n,e){if(n.forEach&&\"function\"==typeof n.forEach)n.forEach(e,void 0);else if(s(n)||t(n))Tu(n,e,void 0);else for(var i=Gn(n),r=Wn(n),o=r.length,a=0;a<o;a++)e.call(void 0,r[a],i&&i[a],n)}function Jn(t,n){if(t){t=t.split(\"&\");for(var e=0;e<t.length;e++){var i=t[e].indexOf(\"=\"),r=null;if(0<=i){var o=t[e].substring(0,i);r=t[e].substring(i+1)}else o=t[e];n(o,r?decodeURIComponent(r.replace(/\\+/g,\" \")):\"\")}}}function Yn(t,n){if(this.b=this.l=this.c=\"\",this.i=null,this.h=this.g=\"\",this.f=!1,t instanceof Yn){this.f=void 0!==n?n:t.f,$n(this,t.c),this.l=t.l,this.b=t.b,Zn(this,t.i),this.g=t.g,n=t.a;var e=new se;e.c=n.c,n.a&&(e.a=new An(n.a),e.b=n.b),Qn(this,e),this.h=t.h}else t&&(e=(t+\"\").match(Mc))?(this.f=!!n,$n(this,e[1]||\"\",!0),this.l=re(e[2]||\"\"),this.b=re(e[3]||\"\",!0),Zn(this,e[4]),this.g=re(e[5]||\"\",!0),Qn(this,e[6]||\"\",!0),this.h=re(e[7]||\"\")):(this.f=!!n,this.a=new se(null,0,this.f))}function $n(t,n,e){t.c=e?re(n,!0):n,t.c&&(t.c=t.c.replace(/:$/,\"\"))}function Zn(t,n){if(n){if(n=+n,isNaN(n)||0>n)throw Error(\"Bad port number \"+n);t.i=n}else t.i=null}function Qn(t,n,e){n instanceof se?(t.a=n,ve(t.a,t.f)):(e||(n=oe(n,qc)),t.a=new se(n,0,t.f))}function te(t,n,e){t.a.set(n,e)}function ne(t,n){return t.a.get(n)}function ee(t){return t instanceof Yn?new Yn(t):new Yn(t,void 0)}function ie(t,n){var e=new Yn(null,void 0);return $n(e,\"https\"),t&&(e.b=t),n&&(e.g=n),e}function re(t,n){return t?n?decodeURI(t.replace(/%25/g,\"%2525\")):decodeURIComponent(t):\"\"}function oe(n,e,i){return t(n)?(n=encodeURI(n).replace(e,ae),i&&(n=n.replace(/%25([0-9a-fA-F]{2})/g,\"%$1\")),n):null}function ae(t){return t=t.charCodeAt(0),\"%\"+(t>>4&15).toString(16)+(15&t).toString(16)}function se(t,n,e){this.b=this.a=null,this.c=t||null,this.f=!!e}function ue(t){t.a||(t.a=new An,t.b=0,t.c&&Jn(t.c,function(n,e){he(t,decodeURIComponent(n.replace(/\\+/g,\" \")),e)}))}function ce(t){var n=Gn(t);if(void 0===n)throw Error(\"Keys are undefined\");var e=new se(null,0,void 0);t=Wn(t);for(var i=0;i<n.length;i++){var r=n[i],o=t[i];a(o)?de(e,r,o):he(e,r,o)}return e}function he(t,n,e){ue(t),t.c=null,n=pe(t,n);var i=t.a.get(n);i||t.a.set(n,i=[]),i.push(e),t.b+=1}function fe(t,n){ue(t),n=pe(t,n),En(t.a.b,n)&&(t.c=null,t.b-=t.a.get(n).length,t=t.a,En(t.b,n)&&(delete t.b[n],t.c--,t.a.length>2*t.c&&kn(t)))}function le(t,n){return ue(t),n=pe(t,n),En(t.a.b,n)}function de(t,n,e){fe(t,n),0<e.length&&(t.c=null,t.a.set(pe(t,n),O(e)),t.b+=e.length)}function pe(t,n){return n+=\"\",t.f&&(n=n.toLowerCase()),n}function ve(t,n){n&&!t.f&&(ue(t),t.c=null,t.a.forEach(function(t,n){var e=n.toLowerCase();n!=e&&(fe(this,n),de(this,e,t))},t)),t.f=n}function me(){}function ge(t){return t.c||(t.c=t.b())}function be(){}function we(t){if(!t.f&&\"undefined\"==typeof XMLHttpRequest&&\"undefined\"!=typeof ActiveXObject){for(var n=[\"MSXML2.XMLHTTP.6.0\",\"MSXML2.XMLHTTP.3.0\",\"MSXML2.XMLHTTP\",\"Microsoft.XMLHTTP\"],e=0;e<4;e++){var i=n[e];try{return new ActiveXObject(i),t.f=i}catch(t){}}throw Error(\"Could not create ActiveXObject. ActiveX might be disabled, or MSXML might not be installed\")}return t.f}function ye(t){fn.call(this),this.headers=new An,this.w=t||null,this.b=!1,this.v=this.a=null,this.g=this.I=this.i=\"\",this.c=this.G=this.h=this.A=!1,this.f=0,this.m=null,this.l=Hc,this.o=this.N=!1}function Ie(t,n,e,i,r){if(t.a)throw Error(\"[goog.net.XhrIo] Object is active with another request=\"+t.i+\"; newUri=\"+n);e=e?e.toUpperCase():\"GET\",t.i=n,t.g=\"\",t.I=e,t.A=!1,t.b=!0,t.a=t.w?t.w.a():Bc.a(),t.v=ge(t.w?t.w:Bc),t.a.onreadystatechange=l(t.Ab,t);try{Nn(t.J,_e(t,\"Opening Xhr\")),t.G=!0,t.a.open(e,n+\"\",!0),t.G=!1}catch(n){return Nn(t.J,_e(t,\"Error opening Xhr: \"+n.message)),void ke(t,n)}n=i||\"\";var o=new An(t.headers);r&&zn(r,function(t,n){o.set(n,t)}),r=A(o.S()),i=uu.FormData&&n instanceof uu.FormData,!k(Jc,e)||r||i||o.set(\"Content-Type\",\"application/x-www-form-urlencoded;charset=utf-8\"),o.forEach(function(t,n){this.a.setRequestHeader(n,t)},t),t.l&&(t.a.responseType=t.l),\"withCredentials\"in t.a&&t.a.withCredentials!==t.N&&(t.a.withCredentials=t.N);try{Oe(t),0<t.f&&(t.o=Te(t.a),Nn(t.J,_e(t,\"Will abort after \"+t.f+\"ms if incomplete, xhr2 \"+t.o)),t.o?(t.a.timeout=t.f,t.a.ontimeout=l(t.Ea,t)):t.m=mn(t.Ea,t.f,t)),Nn(t.J,_e(t,\"Sending request\")),t.h=!0,t.a.send(n),t.h=!1}catch(n){Nn(t.J,_e(t,\"Send error: \"+n.message)),ke(t,n)}}function Te(t){return Cu&&F(9)&&\"number\"==typeof t.timeout&&void 0!==t.ontimeout}function Ae(t){return\"content-type\"==t.toLowerCase()}function ke(t,n){t.b=!1,t.a&&(t.c=!0,t.a.abort(),t.c=!1),t.g=n,Ee(t),Se(t)}function Ee(t){t.A||(t.A=!0,ln(t,\"complete\"),ln(t,\"error\"))}function Ne(t){if(t.b&&void 0!==su)if(t.v[1]&&4==Pe(t)&&2==Ce(t))Nn(t.J,_e(t,\"Local request error detected and ignored\"));else if(t.h&&4==Pe(t))mn(t.Ab,0,t);else if(ln(t,\"readystatechange\"),4==Pe(t)){Nn(t.J,_e(t,\"Request complete\")),t.b=!1;try{var n=Ce(t);t:switch(n){case 200:case 201:case 202:case 204:case 206:case 304:case 1223:var e=!0;break t;default:e=!1}var i;if(!(i=e)){var r;if(r=0===n){var o=(t.i+\"\").match(Mc)[1]||null;if(!o&&uu.self&&uu.self.location){var a=uu.self.location.protocol;o=a.substr(0,a.length-1)}r=!zc.test(o?o.toLowerCase():\"\")}i=r}if(i)ln(t,\"complete\"),ln(t,\"success\");else{try{var s=2<Pe(t)?t.a.statusText:\"\"}catch(n){Nn(t.J,\"Can not get status: \"+n.message),s=\"\"}t.g=s+\" [\"+Ce(t)+\"]\",Ee(t)}}finally{Se(t)}}}function Se(t,n){if(t.a){Oe(t);var e=t.a,r=t.v[0]?i:null;t.a=null,t.v=null,n||ln(t,\"ready\");try{e.onreadystatechange=r}catch(n){(t=t.J)&&t.log(Tc,\"Problem encountered resetting onreadystatechange: \"+n.message,void 0)}}}function Oe(t){t.a&&t.o&&(t.a.ontimeout=null),\"number\"==typeof t.m&&(uu.clearTimeout(t.m),t.m=null)}function Pe(t){return t.a?t.a.readyState:0}function Ce(t){try{return 2<Pe(t)?t.a.status:-1}catch(t){return-1}}function Re(t){try{return t.a?t.a.responseText:\"\"}catch(n){return Nn(t.J,\"Can not get responseText: \"+n.message),\"\"}}function _e(t,n){return n+\" [\"+t.I+\" \"+t.i+\" \"+Ce(t)+\"]\"}function De(t){var n={},e=n.document||document,i=At(t),r=document.createElement(\"SCRIPT\"),o={Cb:r,Ea:void 0},a=new Rn(xe,o),s=null,u=null!=n.timeout?n.timeout:5e3;return 0<u&&(s=window.setTimeout(function(){Ue(r,!0);var t=new je(Zc,\"Timeout reached for loading script \"+i);Dn(a),_n(a,!1,t)},u),o.Ea=s),r.onload=r.onreadystatechange=function(){r.readyState&&\"loaded\"!=r.readyState&&\"complete\"!=r.readyState||(Ue(r,n.Sc||!1,s),a.A(null))},r.onerror=function(){Ue(r,!0,s);var t=new je($c,\"Error while loading script \"+i);Dn(a),_n(a,!1,t)},o=n.attributes||{},U(o,{type:\"text/javascript\",charset:\"UTF-8\"}),Lt(r,o),r.src=At(t),Le(e).appendChild(r),a}function Le(t){var n;return(n=(t||document).getElementsByTagName(\"HEAD\"))&&0!=n.length?n[0]:t.documentElement}function xe(){if(this&&this.Cb){var t=this.Cb;t&&\"SCRIPT\"==t.tagName&&Ue(t,!0,this.Ea)}}function Ue(t,n,e){null!=e&&uu.clearTimeout(e),t.onload=i,t.onerror=i,t.onreadystatechange=i,n&&window.setTimeout(function(){t&&t.parentNode&&t.parentNode.removeChild(t)},0)}function je(t,n){var e=\"Jsloader error (code #\"+t+\")\";n&&(e+=\": \"+n),v.call(this,e),this.code=t}function Me(){}function Ve(){this.a=new XDomainRequest,this.readyState=0,this.onreadystatechange=null,this.responseText=\"\",this.status=-1,this.statusText=this.responseXML=null,this.a.onload=l(this.Wb,this),this.a.onerror=l(this.xb,this),this.a.onprogress=l(this.Xb,this),this.a.ontimeout=l(this.Yb,this)}function Fe(t,n){t.readyState=n,t.onreadystatechange&&t.onreadystatechange()}function Ke(){var t=ri();return Cu&&!!Mu&&11==Mu||/Edge\\/\\d+/.test(t)}function qe(){return uu.window&&uu.window.location.href||\"\"}function Xe(t,n){n=n||uu.window;var e=\"about:blank\";t&&(e=St(Ot(t))),n.location.href=e}function Be(t,n){var e,i=[];for(e in t)e in n?typeof t[e]!=typeof n[e]?i.push(e):a(t[e])?L(t[e],n[e])||i.push(e):\"object\"==typeof t[e]&&null!=t[e]&&null!=n[e]?0<Be(t[e],n[e]).length&&i.push(e):t[e]!==n[e]&&i.push(e):i.push(e);for(e in n)e in t||i.push(e);return i}function He(){var t=ri();return!((t=ei(t)!=nh?null:(t=t.match(/\\sChrome\\/(\\d+)/i))&&2==t.length?parseInt(t[1],10):null)&&30>t||Cu&&Mu&&!(9<Mu))}function We(t){return t=(t||ri()).toLowerCase(),!!(t.match(/android/)||t.match(/webos/)||t.match(/iphone|ipad|ipod/)||t.match(/blackberry/)||t.match(/windows phone/)||t.match(/iemobile/))}function Ge(t){t=t||uu.window;try{t.close()}catch(t){}}function ze(t,n,e){var i=\"\"+Math.floor(1e9*Math.random());n=n||500,e=e||600;var r=(window.screen.availHeight-e)/2,o=(window.screen.availWidth-n)/2;n={width:n,height:e,top:0<r?r:0,left:0<o?o:0,location:!0,resizable:!0,statusbar:!0,toolbar:!1},e=ri().toLowerCase(),i&&(n.target=i,b(e,\"crios/\")&&(n.target=\"_blank\")),ei(ri())==th&&(t=t||\"http://localhost\",n.scrollbars=!0),e=t||\"\",(i=n)||(i={}),t=window,n=e instanceof Nt?e:Ot(void 0!==e.href?e.href:e+\"\"),e=i.target||e.target,r=[];for(a in i)switch(a){case\"width\":case\"height\":case\"top\":case\"left\":r.push(a+\"=\"+i[a]);break;case\"target\":case\"noreferrer\":break;default:r.push(a+\"=\"+(i[a]?1:0))}var a=r.join(\",\");if((P(\"iPhone\")&&!P(\"iPod\")&&!P(\"iPad\")||P(\"iPad\")||P(\"iPod\"))&&t.navigator&&t.navigator.standalone&&e&&\"_self\"!=e?(a=t.document.createElement(\"A\"),n instanceof Nt||n instanceof Nt||(n=n.la?n.ja():n+\"\",ec.test(n)||(n=\"about:invalid#zClosurez\"),n=Pt(n)),a.href=St(n),a.setAttribute(\"target\",e),i.noreferrer&&a.setAttribute(\"rel\",\"noreferrer\"),i=document.createEvent(\"MouseEvent\"),i.initMouseEvent(\"click\",!0,!0,t,1),a.dispatchEvent(i),a={}):i.noreferrer?(a=t.open(\"\",e,a),t=St(n),a&&(_u&&b(t,\";\")&&(t=\"'\"+t.replace(/'/g,\"%27\")+\"'\"),a.opener=null,It(\"b/12014412, meta tag with sanitized URL\"),t='<META HTTP-EQUIV=\"refresh\" content=\"0; url='+g(t)+'\">',t=_t(t),a.document.write(Rt(t)),a.document.close())):a=t.open(St(n),e,a),a)try{a.focus()}catch(t){}return a}function Je(t){return new Z(function(n){function e(){gn(2e3).then(function(){if(t&&!t.closed)return e();n()})}return e()})}function Ye(){var t=null;return new Z(function(n){\"complete\"==uu.document.readyState?n():(t=function(){n()},nn(window,\"load\",t))}).s(function(n){throw en(window,\"load\",t),n})}function $e(){return Ze(void 0)?Ye().then(function(){return new Z(function(t,n){var e=uu.document,i=setTimeout(function(){n(Error(\"Cordova framework is not ready.\"))},1e3);e.addEventListener(\"deviceready\",function(){clearTimeout(i),t()},!1)})}):et(Error(\"Cordova must run in an Android or iOS file scheme.\"))}function Ze(t){return t=t||ri(),!(\"file:\"!==ci()||!t.toLowerCase().match(/iphone|ipad|ipod|android/))}function Qe(){var t=uu.window;try{return!(!t||t==t.top)}catch(t){return!1}}function ti(){return au.INTERNAL.hasOwnProperty(\"reactNative\")?\"ReactNative\":au.INTERNAL.hasOwnProperty(\"node\")?\"Node\":\"Browser\"}function ni(){var t=ti();return\"ReactNative\"===t||\"Node\"===t}function ei(t){var n=t.toLowerCase();return b(n,\"opera/\")||b(n,\"opr/\")||b(n,\"opios/\")?\"Opera\":b(n,\"iemobile\")?\"IEMobile\":b(n,\"msie\")||b(n,\"trident/\")?\"IE\":b(n,\"edge/\")?\"Edge\":b(n,\"firefox/\")?th:b(n,\"silk/\")?\"Silk\":b(n,\"blackberry\")?\"Blackberry\":b(n,\"webos\")?\"Webos\":!b(n,\"safari/\")||b(n,\"chrome/\")||b(n,\"crios/\")||b(n,\"android\")?!b(n,\"chrome/\")&&!b(n,\"crios/\")||b(n,\"edge/\")?b(n,\"android\")?\"Android\":(t=t.match(/([a-zA-Z\\d\\.]+)\\/[a-zA-Z\\d\\.]*$/))&&2==t.length?t[1]:\"Other\":nh:\"Safari\"}function ii(t,n){n=n||[];var e,i=[],r={};for(e in eh)r[eh[e]]=!0;for(e=0;e<n.length;e++)void 0!==r[n[e]]&&(delete r[n[e]],i.push(n[e]));return i.sort(),n=i,n.length||(n=[\"FirebaseCore-web\"]),i=ti(),r=\"\",(r=\"Browser\"===i?ei(ri()):i)+\"/JsCore/\"+t+\"/\"+n.join(\",\")}function ri(){return uu.navigator&&uu.navigator.userAgent||\"\"}function oi(t,n){t=t.split(\".\"),n=n||uu;for(var e=0;e<t.length&&\"object\"==typeof n&&null!=n;e++)n=n[t[e]];return e!=t.length&&(n=void 0),n}function ai(){try{var t=uu.localStorage,n=pi();if(t)return t.setItem(n,\"1\"),t.removeItem(n),!Ke()||!!uu.indexedDB}catch(t){}return!1}function si(){return(ui()||\"chrome-extension:\"===ci()||Ze())&&!ni()&&ai()}function ui(){return\"http:\"===ci()||\"https:\"===ci()}function ci(){return uu.location&&uu.location.protocol||null}function hi(t){return t=t||ri(),!We(t)&&ei(t)!=th}function fi(t){return void 0===t?null:Mt(t)}function li(t){var n,e={};for(n in t)t.hasOwnProperty(n)&&null!==t[n]&&void 0!==t[n]&&(e[n]=t[n]);return e}function di(t){if(null!==t)return JSON.parse(t)}function pi(t){return t||\"\"+Math.floor(1e9*Math.random())}function vi(t){return t=t||ri(),\"Safari\"!=ei(t)&&!t.toLowerCase().match(/iphone|ipad|ipod/)}function mi(){var t=uu.___jsl;if(t&&t.H)for(var n in t.H)if(t.H[n].r=t.H[n].r||[],t.H[n].L=t.H[n].L||[],t.H[n].r=t.H[n].L.concat(),t.CP)for(var e=0;e<t.CP.length;e++)t.CP[e]=null}function gi(){var t=uu.navigator;return!t||\"boolean\"!=typeof t.onLine||!ui()&&\"chrome-extension:\"!==ci()&&void 0===t.connection||t.onLine}function bi(t,n,e,i){if(t>n)throw Error(\"Short delay should be less than long delay!\");this.c=t,this.b=n,t=e||ri(),i=i||ti(),this.a=We(t)||\"ReactNative\"===i}function wi(){var t=uu.document;return!t||void 0===t.visibilityState||\"visible\"==t.visibilityState}function yi(){var t=uu.document,n=null;return wi()||!t?nt():new Z(function(e){n=function(){wi()&&(t.removeEventListener(\"visibilitychange\",n,!1),e())},t.addEventListener(\"visibilitychange\",n,!1)}).s(function(e){throw t.removeEventListener(\"visibilitychange\",n,!1),e})}function Ii(t){try{var n=new Date(parseInt(t,10));if(!isNaN(n.getTime())&&!/[^0-9]/.test(t))return n.toUTCString()}catch(t){}return null}function Ti(t,n,e){ih?Object.defineProperty(t,n,{configurable:!0,enumerable:!0,value:e}):t[n]=e}function Ai(t,n){if(n)for(var e in n)n.hasOwnProperty(e)&&Ti(t,e,n[e])}function ki(t){var n={};return Ai(n,t),n}function Ei(t){var n,e={};for(n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function Ni(t,n){if(!n||!n.length)return!0;if(!t)return!1;for(var e=0;e<n.length;e++){var i=t[n[e]];if(void 0===i||null===i||\"\"===i)return!1}return!0}function Si(t){var n=t;if(\"object\"==typeof t&&null!=t){n=\"length\"in t?[]:{};for(var e in t)Ti(n,e,Si(t[e]))}return n}function Oi(t){var n={},e=t[ah],i=t[sh];if(t=t[uh],!e||!t)throw Error(\"Invalid provider user info!\");n[hh]=i||null,n[ch]=e,Ti(this,lh,t),Ti(this,fh,Si(n))}function Pi(t,n){this.code=dh+t,this.message=n||ph[t]||\"\"}function Ci(t){var n=t&&t.code;return n?new Pi(n.substring(dh.length),t.message):null}function Ri(t){var n=t[bh];if(void 0===n)throw new Pi(\"missing-continue-uri\");if(\"string\"!=typeof n||\"string\"==typeof n&&!n.length)throw new Pi(\"invalid-continue-uri\");this.h=n,this.c=this.a=null,this.g=!1;var e=t[vh];if(e&&\"object\"==typeof e){n=e[Ih];var i=e[wh];if(e=e[yh],\"string\"==typeof n&&n.length){if(this.a=n,void 0!==i&&\"boolean\"!=typeof i)throw new Pi(\"argument-error\",wh+\" property must be a boolean when specified.\");if(this.g=!!i,void 0!==e&&(\"string\"!=typeof e||\"string\"==typeof e&&!e.length))throw new Pi(\"argument-error\",yh+\" property must be a non empty string when specified.\");this.c=e||null}else{if(void 0!==n)throw new Pi(\"argument-error\",Ih+\" property must be a non empty string when specified.\");if(void 0!==i||void 0!==e)throw new Pi(\"missing-android-pkg-name\")}}else if(void 0!==e)throw new Pi(\"argument-error\",vh+\" property must be a non null object when specified.\");if(this.b=null,(n=t[gh])&&\"object\"==typeof n){if(\"string\"==typeof(n=n[Th])&&n.length)this.b=n;else if(void 0!==n)throw new Pi(\"argument-error\",Th+\" property must be a non empty string when specified.\")}else if(void 0!==n)throw new Pi(\"argument-error\",gh+\" property must be a non null object when specified.\");if(void 0!==(t=t[mh])&&\"boolean\"!=typeof t)throw new Pi(\"argument-error\",mh+\" property must be a boolean when specified.\");if((this.f=!!t)&&!this.b&&!this.a)throw new Pi(\"argument-error\",mh+\" property can't be true when no mobile application is provided.\")}function _i(t){var n={};n.continueUrl=t.h,n.canHandleCodeInApp=t.f,(n.androidPackageName=t.a)&&(n.androidMinimumVersion=t.c,n.androidInstallApp=t.g),n.iOSBundleId=t.b;for(var e in n)null===n[e]&&delete n[e];return n}function Di(t){this.b=t.sub,fu(),this.a=t.provider_id||t.firebase&&t.firebase.sign_in_provider||null}function Li(t){if(t=t.split(\".\"),3!=t.length)return null;t=t[1];for(var n=(4-t.length%4)%4,e=0;e<n;e++)t+=\".\";try{var i=JSON.parse(On(t));if(i.sub&&i.iss&&i.aud&&i.exp)return new Di(i)}catch(t){}return null}function xi(t){for(var n in Eh)if(Eh[n].Na==t)return Eh[n];return null}function Ui(t){var n={};n[\"facebook.com\"]=Vi,n[\"google.com\"]=Ki,n[\"github.com\"]=Fi,n[\"twitter.com\"]=qi;var e=t&&t[Sh];try{if(e)return n[e]?new n[e](t):new Mi(t);if(void 0!==t[Nh])return new ji(t)}catch(t){}return null}function ji(t){var n=t[Sh];if(!n&&t[Nh]){var e=Li(t[Nh]);e&&e.a&&(n=e.a)}if(!n)throw Error(\"Invalid additional user info!\");\"anonymous\"!=n&&\"custom\"!=n||(n=null),e=!1,void 0!==t.isNewUser?e=!!t.isNewUser:\"identitytoolkit#SignupNewUserResponse\"===t.kind&&(e=!0),Ti(this,\"providerId\",n),Ti(this,\"isNewUser\",e)}function Mi(t){ji.call(this,t),t=di(t.rawUserInfo||\"{}\"),Ti(this,\"profile\",Si(t||{}))}function Vi(t){if(Mi.call(this,t),\"facebook.com\"!=this.providerId)throw Error(\"Invalid provider ID!\")}function Fi(t){if(Mi.call(this,t),\"github.com\"!=this.providerId)throw Error(\"Invalid provider ID!\");Ti(this,\"username\",this.profile&&this.profile.login||null)}function Ki(t){if(Mi.call(this,t),\"google.com\"!=this.providerId)throw Error(\"Invalid provider ID!\")}function qi(t){if(Mi.call(this,t),\"twitter.com\"!=this.providerId)throw Error(\"Invalid provider ID!\");Ti(this,\"username\",t.screenName||null)}function Xi(t,n){return t.then(function(t){if(t[Ph]){var e=Li(t[Ph]);if(!e||n!=e.b)throw new Pi(\"user-mismatch\");return t}throw new Pi(\"user-mismatch\")}).s(function(t){throw t&&t.code&&t.code==dh+\"user-not-found\"?new Pi(\"user-mismatch\"):t})}function Bi(t,n){if(n.idToken||n.accessToken)n.idToken&&Ti(this,\"idToken\",n.idToken),n.accessToken&&Ti(this,\"accessToken\",n.accessToken);else{if(!n.oauthToken||!n.oauthTokenSecret)throw new Pi(\"internal-error\",\"failed to construct a credential\");Ti(this,\"accessToken\",n.oauthToken),Ti(this,\"secret\",n.oauthTokenSecret)}Ti(this,\"providerId\",t)}function Hi(t){var n={};return t.idToken&&(n.id_token=t.idToken),t.accessToken&&(n.access_token=t.accessToken),t.secret&&(n.oauth_token_secret=t.secret),n.providerId=t.providerId,{postBody:\"\"+ce(n),requestUri:\"http://localhost\"}}function Wi(t,n){this.rc=n||[],Ai(this,{providerId:t,isOAuthProvider:!0}),this.rb={},this.Wa=(xi(t)||{}).Ma||null,this.Ua=null}function Gi(t){Wi.call(this,t,kh),this.a=[]}function zi(){Gi.call(this,\"facebook.com\")}function Ji(t){if(!t)throw new Pi(\"argument-error\",\"credential failed: expected 1 argument (the OAuth access token).\");var n=t;return c(t)&&(n=t.accessToken),(new zi).credential(null,n)}function Yi(){Gi.call(this,\"github.com\")}function $i(t){if(!t)throw new Pi(\"argument-error\",\"credential failed: expected 1 argument (the OAuth access token).\");var n=t;return c(t)&&(n=t.accessToken),(new Yi).credential(null,n)}function Zi(){Gi.call(this,\"google.com\"),this.sa(\"profile\")}function Qi(t,n){var e=t;return c(t)&&(e=t.idToken,n=t.accessToken),(new Zi).credential(e,n)}function tr(){Wi.call(this,\"twitter.com\",Ah)}function nr(t,n){var e=t;if(c(e)||(e={oauthToken:t,oauthTokenSecret:n}),!e.oauthToken||!e.oauthTokenSecret)throw new Pi(\"argument-error\",\"credential failed: expected 2 arguments (the OAuth access token and secret).\");return new Bi(\"twitter.com\",e)}function er(t,n){this.a=t,this.f=n,Ti(this,\"providerId\",\"password\")}function ir(){Ai(this,{providerId:\"password\",isOAuthProvider:!1})}function rr(t){if(!(t.Pa&&t.Oa||t.Da&&t.Y))throw new Pi(\"internal-error\");this.a=t,Ti(this,\"providerId\",\"phone\")}function or(t){return t.a.Da&&t.a.Y?{temporaryProof:t.a.Da,phoneNumber:t.a.Y}:{sessionInfo:t.a.Pa,code:t.a.Oa}}function ar(t){try{this.a=t||au.auth()}catch(t){throw new Pi(\"argument-error\",\"Either an instance of firebase.auth.Auth must be passed as an argument to the firebase.auth.PhoneAuthProvider constructor, or the default firebase App instance must be initialized via firebase.initializeApp().\")}Ai(this,{providerId:\"phone\",isOAuthProvider:!1})}function sr(t,n){if(!t)throw new Pi(\"missing-verification-id\");if(!n)throw new Pi(\"missing-verification-code\");return new rr({Pa:t,Oa:n})}function ur(t){if(t.temporaryProof&&t.phoneNumber)return new rr({Da:t.temporaryProof,Y:t.phoneNumber});var n=t&&t.providerId;if(!n||\"password\"===n)return null;var e=t&&t.oauthAccessToken,i=t&&t.oauthTokenSecret;t=t&&t.oauthIdToken;try{switch(n){case\"google.com\":return Qi(t,e);case\"facebook.com\":return Ji(e);case\"github.com\":return $i(e);case\"twitter.com\":return nr(e,i);default:return new Gi(n).credential(t,e)}}catch(t){return null}}function cr(t){if(!t.isOAuthProvider)throw new Pi(\"invalid-oauth-provider\")}function hr(t,n,e,i,r){if(this.b=t,this.c=n||null,this.f=e||null,this.g=i||null,this.a=r||null,!this.f&&!this.a)throw new Pi(\"invalid-auth-event\");if(this.f&&this.a)throw new Pi(\"invalid-auth-event\");if(this.f&&!this.g)throw new Pi(\"invalid-auth-event\")}function fr(t){return t=t||{},t.type?new hr(t.type,t.eventId,t.urlResponse,t.sessionId,t.error&&Ci(t.error)):null}function lr(t){var n=\"unauthorized-domain\",e=void 0,i=ee(t);t=i.b,i=i.c,\"chrome-extension\"==i?e=m(\"This chrome extension ID (chrome-extension://%s) is not authorized to run this operation. Add it to the OAuth redirect domains list in the Firebase console -> Auth section -> Sign in method tab.\",t):\"http\"==i||\"https\"==i?e=m(\"This domain (%s) is not authorized to run this operation. Add it to the OAuth redirect domains list in the Firebase console -> Auth section -> Sign in method tab.\",t):n=\"operation-not-supported-in-this-environment\",Pi.call(this,n,e)}function dr(t,n,e){Pi.call(this,t,e),t=n||{},t.sb&&Ti(this,\"email\",t.sb),t.Y&&Ti(this,\"phoneNumber\",t.Y),t.credential&&Ti(this,\"credential\",t.credential)}function pr(t){if(t.code){var n=t.code||\"\";0==n.indexOf(dh)&&(n=n.substring(dh.length));var e={credential:ur(t)};if(t.email)e.sb=t.email;else{if(!t.phoneNumber)return new Pi(n,t.message||void 0);e.Y=t.phoneNumber}return new dr(n,e,t.message)}return null}function vr(t){this.f=t}function mr(t,n,e){var i=\"Node\"==ti();if(!(i=uu.XMLHttpRequest||i&&au.INTERNAL.node&&au.INTERNAL.node.XMLHttpRequest))throw new Pi(\"internal-error\",\"The XMLHttpRequest compatibility library was not found.\");this.b=t,t=n||{},this.i=t.secureTokenEndpoint||\"https://securetoken.googleapis.com/v1/token\",this.l=t.secureTokenTimeout||Ch,this.c=x(t.secureTokenHeaders||Rh),this.g=t.firebaseEndpoint||\"https://www.googleapis.com/identitytoolkit/v3/relyingparty/\",this.h=t.firebaseTimeout||_h,this.a=x(t.firebaseHeaders||Dh),e&&(this.a[\"X-Client-Version\"]=e,this.c[\"X-Client-Version\"]=e),this.f=new Me,this.o=new vr(i)}function gr(t,n){n?t.a[\"X-Firebase-Locale\"]=n:delete t.a[\"X-Firebase-Locale\"]}function br(t,n){n?(t.a[\"X-Client-Version\"]=n,t.c[\"X-Client-Version\"]=n):(delete t.a[\"X-Client-Version\"],delete t.c[\"X-Client-Version\"])}function wr(t,n,e,i,r,o,a){gi()?(He()?t=l(t.m,t):(Oh||(Oh=new Z(function(t,n){yr(t,n)})),t=l(t.u,t)),t(n,e,i,r,o,a)):e&&e(null)}function yr(t,n){((window.gapi||{}).client||{}).request?t():(uu[xh]=function(){((window.gapi||{}).client||{}).request?t():n(Error(\"CORS_UNSUPPORTED\"))},Ln(De(kt(Lh,{onload:xh})),function(){n(Error(\"CORS_UNSUPPORTED\"))}))}function Ir(t,n){return new Z(function(e,i){\"refresh_token\"==n.grant_type&&n.refresh_token||\"authorization_code\"==n.grant_type&&n.code?wr(t,t.i+\"?key=\"+encodeURIComponent(t.b),function(t){t?t.error?i(Vr(t)):t.access_token&&t.refresh_token?e(t):i(new Pi(\"internal-error\")):i(new Pi(\"network-request-failed\"))},\"POST\",\"\"+ce(n),t.c,t.l.get()):i(new Pi(\"internal-error\"))})}function Tr(t,n,e,i,r,o){var a=ee(t.g+n);te(a,\"key\",t.b),o&&te(a,\"cb\",\"\"+fu());var s=\"GET\"==e;if(s)for(var u in i)i.hasOwnProperty(u)&&te(a,u,i[u]);return new Z(function(n,o){wr(t,\"\"+a,function(t){t?t.error?o(Vr(t,r||{})):n(t):o(new Pi(\"network-request-failed\"))},e,s?void 0:Mt(li(i)),t.a,t.h.get())})}function Ar(t){if(!Yc.test(t.email))throw new Pi(\"invalid-email\")}function kr(t){\"email\"in t&&Ar(t)}function Er(t,n){return jr(t,Kh,{identifier:n,continueUri:ui()?qe():\"http://localhost\"}).then(function(t){return t.allProviders||[]})}function Nr(t){return jr(t,Gh,{}).then(function(t){return t.authorizedDomains||[]})}function Sr(t){if(!t[Ph])throw new Pi(\"internal-error\")}function Or(t){if(t.phoneNumber||t.temporaryProof){if(!t.phoneNumber||!t.temporaryProof)throw new Pi(\"internal-error\")}else{if(!t.sessionInfo)throw new Pi(\"missing-verification-id\");if(!t.code)throw new Pi(\"missing-verification-code\")}}function Pr(t,n){return jr(t,Yh,n)}function Cr(t,n,e){return jr(t,Xh,{idToken:n,deleteProvider:e})}function Rr(t){if(!t.requestUri||!t.sessionId&&!t.postBody)throw new Pi(\"internal-error\")}function _r(t){var n=null;if(t.needConfirmation?(t.code=\"account-exists-with-different-credential\",n=pr(t)):\"FEDERATED_USER_ID_ALREADY_LINKED\"==t.errorMessage?(t.code=\"credential-already-in-use\",n=pr(t)):\"EMAIL_EXISTS\"==t.errorMessage?(t.code=\"email-already-in-use\",n=pr(t)):t.errorMessage&&(n=Mr(t.errorMessage)),n)throw n;if(!t[Ph])throw new Pi(\"internal-error\")}function Dr(t,n){return n.returnIdpCredential=!0,jr(t,tf,n)}function Lr(t,n){return n.returnIdpCredential=!0,jr(t,ef,n)}function xr(t,n){return n.returnIdpCredential=!0,n.autoCreate=!1,jr(t,nf,n)}function Ur(t){if(!t.oobCode)throw new Pi(\"invalid-action-code\")}function jr(t,n,e){if(!Ni(e,n.ea))return et(new Pi(\"internal-error\"));var i,r=n.zb||\"POST\";return nt(e).then(n.D).then(function(){return n.T&&(e.returnSecureToken=!0),Tr(t,n.endpoint,r,e,n.Pb,n.nb||!1)}).then(function(t){return i=t}).then(n.O).then(function(){if(!n.ga)return i;if(!(n.ga in i))throw new Pi(\"internal-error\");return i[n.ga]})}function Mr(t){return Vr({error:{errors:[{message:t}],code:400,message:t}})}function Vr(t,n){var e=(t.error&&t.error.errors&&t.error.errors[0]||{}).reason||\"\",i={keyInvalid:\"invalid-api-key\",ipRefererBlocked:\"app-not-authorized\"};if(e=i[e]?new Pi(i[e]):null)return e;e=t.error&&t.error.message||\"\",i={INVALID_CUSTOM_TOKEN:\"invalid-custom-token\",CREDENTIAL_MISMATCH:\"custom-token-mismatch\",MISSING_CUSTOM_TOKEN:\"internal-error\",INVALID_IDENTIFIER:\"invalid-email\",MISSING_CONTINUE_URI:\"internal-error\",INVALID_EMAIL:\"invalid-email\",INVALID_PASSWORD:\"wrong-password\",USER_DISABLED:\"user-disabled\",MISSING_PASSWORD:\"internal-error\",EMAIL_EXISTS:\"email-already-in-use\",PASSWORD_LOGIN_DISABLED:\"operation-not-allowed\",INVALID_IDP_RESPONSE:\"invalid-credential\",FEDERATED_USER_ID_ALREADY_LINKED:\"credential-already-in-use\",INVALID_MESSAGE_PAYLOAD:\"invalid-message-payload\",INVALID_RECIPIENT_EMAIL:\"invalid-recipient-email\",INVALID_SENDER:\"invalid-sender\",EMAIL_NOT_FOUND:\"user-not-found\",EXPIRED_OOB_CODE:\"expired-action-code\",INVALID_OOB_CODE:\"invalid-action-code\",MISSING_OOB_CODE:\"internal-error\",CREDENTIAL_TOO_OLD_LOGIN_AGAIN:\"requires-recent-login\",INVALID_ID_TOKEN:\"invalid-user-token\",TOKEN_EXPIRED:\"user-token-expired\",USER_NOT_FOUND:\"user-token-expired\",CORS_UNSUPPORTED:\"cors-unsupported\",DYNAMIC_LINK_NOT_ACTIVATED:\"dynamic-link-not-activated\",INVALID_APP_ID:\"invalid-app-id\",TOO_MANY_ATTEMPTS_TRY_LATER:\"too-many-requests\",WEAK_PASSWORD:\"weak-password\",OPERATION_NOT_ALLOWED:\"operation-not-allowed\",USER_CANCELLED:\"user-cancelled\",CAPTCHA_CHECK_FAILED:\"captcha-check-failed\",INVALID_APP_CREDENTIAL:\"invalid-app-credential\",INVALID_CODE:\"invalid-verification-code\",INVALID_PHONE_NUMBER:\"invalid-phone-number\",INVALID_SESSION_INFO:\"invalid-verification-id\",INVALID_TEMPORARY_PROOF:\"invalid-credential\",MISSING_APP_CREDENTIAL:\"missing-app-credential\",MISSING_CODE:\"missing-verification-code\",MISSING_PHONE_NUMBER:\"missing-phone-number\",MISSING_SESSION_INFO:\"missing-verification-id\",QUOTA_EXCEEDED:\"quota-exceeded\",SESSION_EXPIRED:\"code-expired\",INVALID_CONTINUE_URI:\"invalid-continue-uri\",MISSING_ANDROID_PACKAGE_NAME:\"missing-android-pkg-name\",MISSING_IOS_BUNDLE_ID:\"missing-ios-bundle-id\",UNAUTHORIZED_DOMAIN:\"unauthorized-continue-uri\",INVALID_OAUTH_CLIENT_ID:\"invalid-oauth-client-id\",INVALID_CERT_HASH:\"invalid-cert-hash\"},U(i,n||{}),n=(n=e.match(/^[^\\s]+\\s*:\\s*(.*)$/))&&1<n.length?n[1]:void 0;for(var r in i)if(0===e.indexOf(r))return new Pi(i[r],n);return!n&&t&&(n=fi(t)),new Pi(\"internal-error\",n)}function Fr(t){for(var n in cf)if(cf[n].id===t)return t=cf[n],{firebaseEndpoint:t.Va,secureTokenEndpoint:t.ab};return null}function Kr(t){this.b=t,this.a=null,this.Ya=qr(this)}function qr(t){return Hr().then(function(){return new Z(function(n,e){oi(\"gapi.iframes.getContext\")().open({where:document.body,url:t.b,messageHandlersFilter:oi(\"gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER\"),attributes:{style:{position:\"absolute\",top:\"-100px\",width:\"1px\",height:\"1px\"}},dontclear:!0},function(i){function r(){clearTimeout(o),n()}t.a=i,t.a.restyle({setHideOnLeave:!1});var o=setTimeout(function(){e(Error(\"Network Error\"))},lf.get());i.ping(r).then(r,function(){e(Error(\"Network Error\"))})})})})}function Xr(t,n){return t.Ya.then(function(){return new Z(function(e){t.a.send(n.type,n,e,oi(\"gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER\"))})})}function Br(t,n){t.Ya.then(function(){t.a.register(\"authEvent\",n,oi(\"gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER\"))})}function Hr(){return df||(df=new Z(function(t,n){if(gi()){var e=function(){mi(),oi(\"gapi.load\")(\"gapi.iframes\",{callback:t,ontimeout:function(){mi(),n(Error(\"Network Error\"))},timeout:ff.get()})};if(oi(\"gapi.iframes.Iframe\"))t();else if(oi(\"gapi.load\"))e();else{var i=\"__iframefcb\"+Math.floor(1e6*Math.random());uu[i]=function(){oi(\"gapi.load\")?e():n(Error(\"Network Error\"))},i=kt(hf,{onload:i}),nt(De(i)).s(function(){n(Error(\"Network Error\"))})}}else n(Error(\"Network Error\"))}).s(function(t){throw df=null,t}))}function Wr(t,n,e){this.i=t,this.g=n,this.h=e,this.f=null,this.a=ie(this.i,\"/__/auth/iframe\"),te(this.a,\"apiKey\",this.g),te(this.a,\"appName\",this.h),this.b=null,this.c=[]}function Gr(t,n,e,i,r){this.m=t,this.u=n,this.c=e,this.l=i,this.i=this.g=this.h=null,this.a=r,this.f=null}function zr(t){try{return au.app(t).auth().Ka()}catch(t){return[]}}function Jr(t,n,e,i,r){this.u=t,this.f=n,this.b=e,this.c=i||null,this.h=r||null,this.m=this.o=this.v=null,this.g=[],this.l=this.a=null}function Yr(t){var n=qe();return Nr(t).then(function(t){t:{var e=ee(n),i=e.c;e=e.b;for(var r=0;r<t.length;r++){var o=t[r],a=e,s=i;if(0==o.indexOf(\"chrome-extension://\")?a=ee(o).b==a&&\"chrome-extension\"==s:\"http\"!=s&&\"https\"!=s?a=!1:Qc.test(o)?a=a==o:(o=o.split(\".\").join(\"\\\\.\"),a=RegExp(\"^(.+\\\\.\"+o+\"|\"+o+\")$\",\"i\").test(a)),a){t=!0;break t}}t=!1}if(!t)throw new lr(qe())})}function $r(t){return t.l?t.l:(t.l=Ye().then(function(){if(!t.o){var n=t.c,e=t.h,i=zr(t.b),r=new Wr(t.u,t.f,t.b);r.f=n,r.b=e,r.c=O(i||[]),t.o=\"\"+r}t.i=new Kr(t.o),to(t)}),t.l)}function Zr(t){return t.m||(t.v=t.c?ii(t.c,zr(t.b)):null,t.m=new mr(t.f,Fr(t.h),t.v)),t.m}function Qr(t,n,e,i,r,o,a,s,u,c){return t=new Gr(t,n,e,i,r),t.h=o,t.g=a,t.i=s,t.b=x(u||null),t.f=c,\"\"+t}function to(t){if(!t.i)throw Error(\"IfcHandler must be initialized!\");Br(t.i,function(n){var e={};if(n&&n.authEvent){var i=!1;for(n=fr(n.authEvent),e=0;e<t.g.length;e++)i=t.g[e](n)||i;return e={},e.status=i?\"ACK\":\"ERROR\",nt(e)}return e.status=\"ERROR\",nt(e)})}function no(t){var n={type:\"webStorageSupport\"};return $r(t).then(function(){return Xr(t.i,n)}).then(function(t){if(t&&t.length&&void 0!==t[0].webStorageSupport)return t[0].webStorageSupport;throw Error()})}function eo(t){if(this.a=t||au.INTERNAL.reactNative&&au.INTERNAL.reactNative.AsyncStorage,!this.a)throw new Pi(\"internal-error\",\"The React Native compatibility library was not found.\")}function io(){this.a={}}function ro(t,n,e,i,r,o){try{var a=!!uu.indexedDB}catch(t){a=!1}if(!a)throw new Pi(\"web-storage-unsupported\");this.u=t,this.h=n,this.g=e,this.l=i,this.m=r,this.f={},this.c=[],this.a=0,this.o=o||uu.indexedDB}function oo(t){return new Z(function(n,e){var i=t.o.open(t.u,t.m);i.onerror=function(t){e(Error(t.target.errorCode))},i.onupgradeneeded=function(n){n=n.target.result;try{n.createObjectStore(t.h,{keyPath:t.g})}catch(t){e(t)}},i.onsuccess=function(t){n(t.target.result)}})}function ao(t){return t.i||(t.i=oo(t)),t.i}function so(t,n){return n.objectStore(t.h)}function uo(t,n,e){return n.transaction([t.h],e?\"readwrite\":\"readonly\")}function co(t){return new Z(function(n,e){t.onsuccess=function(t){t&&t.target?n(t.target.result):n()},t.onerror=function(t){e(Error(t.target.errorCode))}})}function ho(t){function n(){return t.b=gn(800).then(l(t.zc,t)).then(function(n){0<n.length&&Tu(t.c,function(t){t(n)})}).then(n).s(function(t){\"STOP_EVENT\"!=t.message&&n()}),t.b}t.b&&t.b.cancel(\"STOP_EVENT\"),n()}function fo(){if(!po()){if(\"Node\"==ti())throw new Pi(\"internal-error\",\"The LocalStorage compatibility library was not found.\");throw new Pi(\"web-storage-unsupported\")}this.a=lo()||au.INTERNAL.node.localStorage}function lo(){try{var t=uu.localStorage,n=pi();return t&&(t.setItem(n,\"1\"),t.removeItem(n)),t}catch(t){return null}}function po(){var t=\"Node\"==ti();if(!(t=lo()||t&&au.INTERNAL.node&&au.INTERNAL.node.localStorage))return!1;try{return t.setItem(\"__sak\",\"1\"),t.removeItem(\"__sak\"),!0}catch(t){return!1}}function vo(){}function mo(){if(!bo()){if(\"Node\"==ti())throw new Pi(\"internal-error\",\"The SessionStorage compatibility library was not found.\");throw new Pi(\"web-storage-unsupported\")}this.a=go()||au.INTERNAL.node.sessionStorage}function go(){try{var t=uu.sessionStorage,n=pi();return t&&(t.setItem(n,\"1\"),t.removeItem(n)),t}catch(t){return null}}function bo(){var t=\"Node\"==ti();if(!(t=go()||t&&au.INTERNAL.node&&au.INTERNAL.node.sessionStorage))return!1;try{return t.setItem(\"__sak\",\"1\"),t.removeItem(\"__sak\"),!0}catch(t){return!1}}function wo(){var t={};t.Browser=gf,t.Node=bf,t.ReactNative=wf,this.a=t[ti()]}function yo(t){var n=new Pi(\"invalid-persistence-type\"),e=new Pi(\"unsupported-persistence-type\");t:{for(i in yf)if(yf[i]==t){var i=!0;break t}i=!1}if(!i||\"string\"!=typeof t)throw n;switch(ti()){case\"ReactNative\":if(\"session\"===t)throw e;break;case\"Node\":if(\"none\"!==t)throw e;break;default:if(!ai()&&\"none\"!==t)throw e}}function Io(t,n,e,i,r){this.i=t,this.g=n,this.A=e,this.u=i,this.v=r,this.a={},vf||(vf=new wo),t=vf;try{if(Ke()){pf||(pf=new ro(\"firebaseLocalStorageDb\",\"firebaseLocalStorage\",\"fbase_key\",\"value\",1));var o=pf}else o=new t.a.C;this.l=o}catch(t){this.l=new io,this.u=!0}try{this.o=new t.a.jb}catch(t){this.o=new io}this.w=new io,this.h=l(this.m,this),this.b={}}function To(){return mf||(mf=new Io(\"firebase\",\":\",!(vi(ri())||!Qe()),hi(),ai())),mf}function Ao(t,n){switch(n){case\"session\":return t.o;case\"none\":return t.w;default:return t.l}}function ko(t,n,e){return t.i+t.g+n.name+(e?t.g+e:\"\")}function Eo(t,n,e){return e=ko(t,n,e),\"local\"==n.C&&(t.b[e]=null),Ao(t,n.C).X(e)}function No(t,n,e,i){n=ko(t,n,e),t.v&&(t.b[n]=uu.localStorage.getItem(n)),D(t.a)&&(Ao(t,\"local\").ia(t.h),t.u||Ke()||!t.v||Oo(t)),t.a[n]||(t.a[n]=[]),t.a[n].push(i)}function So(t,n,e){n=ko(t,cs(\"local\"),n),t.a[n]&&(N(t.a[n],function(t){return t==e}),0==t.a[n].length&&delete t.a[n]),D(t.a)&&Co(t)}function Oo(t){Po(t),t.f=setInterval(function(){for(var n in t.a){var e=uu.localStorage.getItem(n),i=t.b[n];e!=i&&(t.b[n]=e,e=new Ht({type:\"storage\",key:n,target:window,oldValue:i,newValue:e,a:!0}),t.m(e))}},1e3)}function Po(t){t.f&&(clearInterval(t.f),t.f=null)}function Co(t){Ao(t,\"local\").da(t.h),Po(t)}function Ro(t){this.a=t,this.b=To()}function _o(t){return t.b.get(If,t.a).then(function(t){return fr(t)})}function Do(){this.a=To()}function Lo(t,n,e,i,r,o,a){this.u=t,this.i=n,this.l=e,this.m=i||null,this.o=a||null,this.h=n+\":\"+e,this.A=new Do,this.g=new Ro(this.h),this.f=null,this.b=[],this.v=r||500,this.w=o||2e3,this.a=this.c=null}function xo(t){return new Pi(\"invalid-cordova-configuration\",t)}function Uo(){for(var t=20,n=[];0<t;)n.push(\"1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\".charAt(Math.floor(62*Math.random()))),t--;return n.join(\"\")}function jo(t){var n=new Hn;Bn(n,t),t=[];var e=8*n.g;56>n.c?Bn(n,xc,56-n.c):Bn(n,xc,n.b-(n.c-56));for(var i=63;56<=i;i--)n.f[i]=255&e,e/=256;for(Xn(n),i=e=0;i<n.i;i++)for(var r=24;0<=r;r-=8)t[e++]=n.a[i]>>r&255;return Sn(t)}function Mo(t,n,e,i){var r=Uo(),o=new hr(n,i,null,r,new Pi(\"no-auth-event\")),a=oi(\"BuildInfo.packageName\",uu);if(\"string\"!=typeof a)throw new Pi(\"invalid-cordova-configuration\");var s=oi(\"BuildInfo.displayName\",uu),u={};if(ri().toLowerCase().match(/iphone|ipad|ipod/))u.ibi=a;else{if(!ri().toLowerCase().match(/android/))return et(new Pi(\"operation-not-supported-in-this-environment\"));u.apn=a}s&&(u.appDisplayName=s),r=jo(r),u.sessionId=r;var c=Qr(t.u,t.i,t.l,n,e,null,i,t.m,u,t.o);return t.ba().then(function(){var n=t.h;return t.A.a.set(If,o.B(),n)}).then(function(){var n=oi(\"cordova.plugins.browsertab.isAvailable\",uu);if(\"function\"!=typeof n)throw new Pi(\"invalid-cordova-configuration\");var e=null;n(function(n){if(n){if(\"function\"!=typeof(e=oi(\"cordova.plugins.browsertab.openUrl\",uu)))throw new Pi(\"invalid-cordova-configuration\");e(c)}else{if(\"function\"!=typeof(e=oi(\"cordova.InAppBrowser.open\",uu)))throw new Pi(\"invalid-cordova-configuration\");n=ri(),n=!(!n.match(/(iPad|iPhone|iPod).*OS 7_\\d/i)&&!n.match(/(iPad|iPhone|iPod).*OS 8_\\d/i)),t.a=e(c,n?\"_blank\":\"_system\",\"location=yes\")}})})}function Vo(t,n){for(var e=0;e<t.b.length;e++)try{t.b[e](n)}catch(t){}}function Fo(t){return t.f||(t.f=t.ba().then(function(){return new Z(function(n){function e(i){return n(i),t.Ja(e),!1}t.ua(e),qo(t)})})),t.f}function Ko(t){var n=null;return _o(t.g).then(function(e){return n=e,e=t.g,Eo(e.b,If,e.a)}).then(function(){return n})}function qo(t){function n(n){r=!0,o&&o.cancel(),Ko(t).then(function(e){var r=i;if(e&&n&&n.url){r=null;var o=n.url,a=ee(o),s=ne(a,\"link\"),u=ne(ee(s),\"link\");a=ne(a,\"deep_link_id\"),o=ne(ee(a),\"link\")||a||u||s||o,-1!=o.indexOf(\"/__/auth/callback\")&&(r=ee(o),r=di(ne(r,\"firebaseError\")||null),r=(r=\"object\"==typeof r?Ci(r):null)?new hr(e.b,e.c,null,null,r):new hr(e.b,e.c,o,e.g)),r=r||i}Vo(t,r)})}var e=oi(\"universalLinks.subscribe\",uu);if(\"function\"!=typeof e)throw new Pi(\"invalid-cordova-configuration\");var i=new hr(\"unknown\",null,null,null,new Pi(\"no-auth-event\")),r=!1,o=gn(t.v).then(function(){return Ko(t).then(function(){r||Vo(t,i)})}),a=uu.handleOpenURL;uu.handleOpenURL=function(t){if(0==t.toLowerCase().indexOf(oi(\"BuildInfo.packageName\",uu).toLowerCase()+\"://\")&&n({url:t}),\"function\"==typeof a)try{a(t)}catch(t){console.error(t)}},e(null,n)}function Xo(t){this.a=t,this.b=To()}function Bo(t){return t.b.set(Tf,\"pending\",t.a)}function Ho(t){return Eo(t.b,Tf,t.a)}function Wo(t){return t.b.get(Tf,t.a).then(function(t){return\"pending\"==t})}function Go(t,n,e){this.v=t,this.l=n,this.u=e,this.h=[],this.f=!1,this.i=l(this.m,this),this.c=new ta,this.o=new sa,this.g=new Xo(this.l+\":\"+this.u),this.b={},this.b.unknown=this.c,this.b.signInViaRedirect=this.c,this.b.linkViaRedirect=this.c,this.b.reauthViaRedirect=this.c,this.b.signInViaPopup=this.o,this.b.linkViaPopup=this.o,this.b.reauthViaPopup=this.o,this.a=zo(this.v,this.l,this.u,jh)}function zo(t,n,e,i){var r=au.SDK_VERSION||null;return Ze()?new Lo(t,n,e,r,void 0,void 0,i):new Jr(t,n,e,r,i)}function Jo(t){t.f||(t.f=!0,t.a.ua(t.i));var n=t.a;return t.a.ba().s(function(e){throw t.a==n&&t.reset(),e})}function Yo(t){t.a.Db()&&Jo(t).s(function(n){var e=new hr(\"unknown\",null,null,null,new Pi(\"operation-not-supported-in-this-environment\"));Zo(n)&&t.m(e)}),t.a.yb()||na(t.c)}function $o(t,n,e,i,r,o){return t.a.vb(n,e,i,function(){t.f||(t.f=!0,t.a.ua(t.i))},function(){t.reset()},r,o)}function Zo(t){return!(!t||\"auth/cordova-not-ready\"!=t.code)}function Qo(t,n,e){var i=n+\":\"+e;return Ef[i]||(Ef[i]=new Go(t,n,e)),Ef[i]}function ta(){this.b=null,this.f=[],this.c=[],this.a=null,this.g=!1}function na(t){t.g||(t.g=!0,oa(t,!1,null,null))}function ea(t,n,e){e=e.va(n.b,n.c);var i=n.f,r=n.g,o=!!n.b.match(/Redirect$/);return e(i,r).then(function(n){oa(t,o,n,null)}).s(function(n){oa(t,o,null,n)})}function ia(t,n){if(t.b=function(){return et(n)},t.c.length)for(var e=0;e<t.c.length;e++)t.c[e](n)}function ra(t,n){if(t.b=function(){return nt(n)},t.f.length)for(var e=0;e<t.f.length;e++)t.f[e](n)}function oa(t,n,e,i){n?i?ia(t,i):ra(t,e):ra(t,{user:null}),t.f=[],t.c=[]}function aa(t){var n=new Pi(\"timeout\");t.a&&t.a.cancel(),t.a=gn(kf.get()).then(function(){t.b||oa(t,!0,null,n)})}function sa(){}function ua(t,n){var e=t.c,i=t.b;return n.va(i,e)(t.f,t.g).then(function(t){n.fa(i,t,null,e)}).s(function(t){n.fa(i,null,t,e)})}function ca(t,n){this.a=n,Ti(this,\"verificationId\",t)}function ha(t,n,e,i){return new ar(t).Qa(n,e).then(function(t){return new ca(t,i)})}function fa(t,n,e,i,r,o){if(this.h=t,this.i=n,this.g=e,this.c=i,this.f=r,this.l=!!o,this.b=null,this.a=this.c,this.f<this.c)throw Error(\"Proactive refresh lower bound greater than upper bound!\")}function la(t,n){return n?(t.a=t.c,t.g()):(n=t.a,t.a*=2,t.a>t.f&&(t.a=t.f),n)}function da(t,n){pa(t),t.b=gn(la(t,n)).then(function(){return t.l?nt():yi()}).then(function(){return t.h()}).then(function(){da(t,!0)}).s(function(n){t.i(n)&&da(t,!1)})}function pa(t){t.b&&(t.b.cancel(),t.b=null)}function va(t){this.f=t,this.b=this.a=null,this.c=0}function ma(t,n){var e=n[Ph],i=n.refreshToken;n=ga(n.expiresIn),t.b=e,t.c=n,t.a=i}function ga(t){return fu()+1e3*parseInt(t,10)}function ba(t,n){return Ir(t.f,n).then(function(n){return t.b=n.access_token,t.c=ga(n.expires_in),t.a=n.refresh_token,{accessToken:t.b,expirationTime:t.c,refreshToken:t.a}}).s(function(n){throw\"auth/user-token-expired\"==n.code&&(t.a=null),n})}function wa(t,n){this.a=t||null,this.b=n||null,Ai(this,{lastSignInTime:Ii(n||null),creationTime:Ii(t||null)})}function ya(t){return new wa(t.a,t.b)}function Ia(t,n,e,i,r,o){Ai(this,{uid:t,displayName:i||null,photoURL:r||null,email:e||null,phoneNumber:o||null,providerId:n})}function Ta(t,n){Bt.call(this,t);for(var e in n)this[e]=n[e]}function Aa(t,n,e){this.A=[],this.G=t.apiKey,this.o=t.appName,this.w=t.authDomain||null,t=au.SDK_VERSION?ii(au.SDK_VERSION):null,this.c=new mr(this.G,Fr(jh),t),this.h=new va(this.c),Ra(this,n[Ph]),ma(this.h,n),Ti(this,\"refreshToken\",this.h.a),xa(this,e||{}),fn.call(this),this.I=!1,this.w&&si()&&(this.a=Qo(this.w,this.G,this.o)),this.N=[],this.i=null,this.l=Oa(this),this.U=l(this.Ga,this);var i=this;this.ha=null,this.ra=function(t){i.na(t.h)},this.W=null,this.R=[],this.qa=function(t){Ea(i,t.f)},this.V=null}function ka(t,n){t.W&&en(t.W,\"languageCodeChanged\",t.ra),(t.W=n)&&Zt(n,\"languageCodeChanged\",t.ra)}function Ea(t,n){t.R=n,br(t.c,au.SDK_VERSION?ii(au.SDK_VERSION,t.R):null)}function Na(t,n){t.V&&en(t.V,\"frameworkChanged\",t.qa),(t.V=n)&&Zt(n,\"frameworkChanged\",t.qa)}function Sa(t){try{return au.app(t.o).auth()}catch(n){throw new Pi(\"internal-error\",\"No firebase.auth.Auth instance is available for the Firebase App '\"+t.o+\"'!\")}}function Oa(t){return new fa(function(){return t.F(!0)},function(t){return!(!t||\"auth/network-request-failed\"!=t.code)},function(){var n=t.h.c-fu()-3e5;return 0<n?n:0},3e4,96e4,!1)}function Pa(t){t.m||t.l.b||(t.l.start(),en(t,\"tokenChanged\",t.U),Zt(t,\"tokenChanged\",t.U))}function Ca(t){en(t,\"tokenChanged\",t.U),pa(t.l)}function Ra(t,n){t.pa=n,Ti(t,\"_lat\",n)}function _a(t,n){N(t.N,function(t){return t==n})}function Da(t){for(var n=[],e=0;e<t.N.length;e++)n.push(t.N[e](t));return ot(n).then(function(){return t})}function La(t){t.a&&!t.I&&(t.I=!0,t.a.subscribe(t))}function xa(t,n){Ai(t,{uid:n.uid,displayName:n.displayName||null,photoURL:n.photoURL||null,email:n.email||null,emailVerified:n.emailVerified||!1,phoneNumber:n.phoneNumber||null,isAnonymous:n.isAnonymous||!1,metadata:new wa(n.createdAt,n.lastLoginAt),providerData:[]})}function Ua(){}function ja(t){return nt().then(function(){if(t.m)throw new Pi(\"app-deleted\")})}function Ma(t){return Au(t.providerData,function(t){return t.providerId})}function Va(t,n){n&&(Fa(t,n.providerId),t.providerData.push(n))}function Fa(t,n){N(t.providerData,function(t){return t.providerId==n})}function Ka(t,n,e){(\"uid\"!=n||e)&&t.hasOwnProperty(n)&&Ti(t,n,e)}function qa(t,n){t!=n&&(Ai(t,{uid:n.uid,displayName:n.displayName,photoURL:n.photoURL,email:n.email,emailVerified:n.emailVerified,phoneNumber:n.phoneNumber,isAnonymous:n.isAnonymous,providerData:[]}),n.metadata?Ti(t,\"metadata\",ya(n.metadata)):Ti(t,\"metadata\",new wa),Tu(n.providerData,function(n){Va(t,n)}),t.h=n.h,Ti(t,\"refreshToken\",t.h.a))}function Xa(t){return t.F().then(function(n){var e=t.isAnonymous;return Ha(t,n).then(function(){return e||Ka(t,\"isAnonymous\",!1),n})})}function Ba(t,n){n[Ph]&&t.pa!=n[Ph]&&(ma(t.h,n),ln(t,new Ta(\"tokenChanged\")),Ra(t,n[Ph]),Ka(t,\"refreshToken\",t.h.a))}function Ha(t,n){return jr(t.c,Bh,{idToken:n}).then(l(t.kc,t))}function Wa(t){return(t=t.providerUserInfo)&&t.length?Au(t,function(t){return new Ia(t.rawId,t.providerId,t.email,t.displayName,t.photoUrl,t.phoneNumber)}):[]}function Ga(t,n){return Xa(t).then(function(){if(k(Ma(t),n))return Da(t).then(function(){throw new Pi(\"provider-already-linked\")})})}function za(t,n,e){var i=ur(n);return n=Ui(n),ki({user:t,credential:i,additionalUserInfo:n,operationType:e})}function Ja(t,n){return Ba(t,n),t.reload().then(function(){return t})}function Ya(t,n,e,i,r){if(!si())return et(new Pi(\"operation-not-supported-in-this-environment\"));if(t.i&&!r)return et(t.i);var o=xi(e.providerId),a=pi(t.uid+\":::\"),s=null;(!hi()||Qe())&&t.w&&e.isOAuthProvider&&(s=Qr(t.w,t.G,t.o,n,e,null,a,au.SDK_VERSION||null));var u=ze(s,o&&o.za,o&&o.ya);return i=i().then(function(){if(Za(t),!r)return t.F().then(function(){})}).then(function(){return $o(t.a,u,n,e,a,!!s)}).then(function(){return new Z(function(e,i){t.fa(n,null,new Pi(\"cancelled-popup-request\"),t.g||null),t.f=e,t.v=i,t.g=a,t.b=t.a.Ca(t,n,u,a)})}).then(function(t){return u&&Ge(u),t?ki(t):null}).s(function(t){throw u&&Ge(u),t}),Qa(t,i,r)}function $a(t,n,e,i,r){if(!si())return et(new Pi(\"operation-not-supported-in-this-environment\"));if(t.i&&!r)return et(t.i);var o=null,a=pi(t.uid+\":::\");return i=i().then(function(){if(Za(t),!r)return t.F().then(function(){})}).then(function(){return t.Z=a,Da(t)}).then(function(n){return t.ca&&(n=t.ca,n=n.b.set(Nf,t.B(),n.a)),n}).then(function(){return t.a.Aa(n,e,a)}).s(function(n){if(o=n,t.ca)return rs(t.ca);throw o}).then(function(){if(o)throw o}),Qa(t,i,r)}function Za(t){if(!t.a||!t.I){if(t.a&&!t.I)throw new Pi(\"internal-error\");throw new Pi(\"auth-domain-config-required\")}}function Qa(t,n,e){var i=ts(t,n,e);return t.A.push(i),at(i,function(){E(t.A,i)}),i}function ts(t,n,e){return t.i&&!e?(n.cancel(),et(t.i)):n.s(function(n){throw!n||\"auth/user-disabled\"!=n.code&&\"auth/user-token-expired\"!=n.code||(t.i||ln(t,new Ta(\"userInvalidated\")),t.i=n),n})}function ns(t){if(!t.apiKey)return null;var n={apiKey:t.apiKey,authDomain:t.authDomain,appName:t.appName},e={};if(!(t.stsTokenManager&&t.stsTokenManager.accessToken&&t.stsTokenManager.expirationTime))return null;e[Ph]=t.stsTokenManager.accessToken,e.refreshToken=t.stsTokenManager.refreshToken||null,e.expiresIn=(t.stsTokenManager.expirationTime-fu())/1e3;var i=new Aa(n,e,t);return t.providerData&&Tu(t.providerData,function(t){t&&Va(i,ki(t))}),t.redirectEventId&&(i.Z=t.redirectEventId),i}function es(t,n,e,i){var r=new Aa(t,n);return e&&(r.ca=e),i&&Ea(r,i),r.reload().then(function(){return r})}function is(t){this.a=t,this.b=To()}function rs(t){return Eo(t.b,Nf,t.a)}function os(t,n){return t.b.get(Nf,t.a).then(function(t){return t&&n&&(t.authDomain=n),ns(t||{})})}function as(t,n){this.a=t,this.b=n||To(),this.c=null,this.f=us(this),No(this.b,cs(\"local\"),this.a,l(this.g,this))}function ss(t,n){var e,i=[];for(e in yf)yf[e]!==n&&i.push(Eo(t.b,cs(yf[e]),t.a));return i.push(Eo(t.b,Sf,t.a)),rt(i)}function us(t){var n=cs(\"local\"),e=cs(\"session\"),i=cs(\"none\");return t.b.get(e,t.a).then(function(r){return r?e:t.b.get(i,t.a).then(function(e){return e?i:t.b.get(n,t.a).then(function(e){return e?n:t.b.get(Sf,t.a).then(function(t){return t?cs(t):n})})})}).then(function(n){return t.c=n,ss(t,n.C)}).s(function(){t.c||(t.c=n)})}function cs(t){return{name:\"authUser\",C:t}}function hs(t){return ps(t,function(){return t.b.set(Sf,t.c.C,t.a)})}function fs(t,n){return ps(t,function(){return t.b.set(t.c,n.B(),t.a)})}function ls(t){return ps(t,function(){return Eo(t.b,t.c,t.a)})}function ds(t,n){return ps(t,function(){return t.b.get(t.c,t.a).then(function(t){return t&&n&&(t.authDomain=n),ns(t||{})})})}function ps(t,n){return t.f=t.f.then(n,n),t.f}function vs(t){if(this.l=!1,Ti(this,\"app\",t),!Ss(this).options||!Ss(this).options.apiKey)throw new Pi(\"invalid-api-key\");t=au.SDK_VERSION?ii(au.SDK_VERSION):null,this.c=new mr(Ss(this).options&&Ss(this).options.apiKey,Fr(jh),t),this.N=[],this.m=[],this.I=[],this.Kb=au.INTERNAL.createSubscribe(l(this.ac,this)),this.R=void 0,this.Lb=au.INTERNAL.createSubscribe(l(this.bc,this)),Ts(this,null),this.h=new as(Ss(this).options.apiKey+\":\"+Ss(this).name),this.G=new is(Ss(this).options.apiKey+\":\"+Ss(this).name),this.U=_s(this,ks(this)),this.i=_s(this,Es(this)),this.W=!1,this.ha=l(this.yc,this),this.Ga=l(this.ka,this),this.pa=l(this.Tb,this),this.qa=l(this.Zb,this),this.ra=l(this.$b,this),ys(this),this.INTERNAL={},this.INTERNAL.delete=l(this.delete,this),this.INTERNAL.logFramework=l(this.gc,this),this.o=0,fn.call(this),bs(this),this.A=[]}function ms(t){Bt.call(this,\"languageCodeChanged\"),this.h=t}function gs(t){Bt.call(this,\"frameworkChanged\"),this.f=t}function bs(t){Object.defineProperty(t,\"lc\",{get:function(){return this.$()},set:function(t){this.na(t)},enumerable:!1}),t.V=null}function ws(t){return t.Jb||et(new Pi(\"auth-domain-config-required\"))}function ys(t){var n=Ss(t).options.authDomain,e=Ss(t).options.apiKey;n&&si()&&(t.Jb=t.U.then(function(){if(!t.l){if(t.a=Qo(n,e,Ss(t).name),t.a.subscribe(t),Os(t)&&La(Os(t)),t.w){La(t.w);var i=t.w;i.na(t.$()),ka(i,t),i=t.w,Ea(i,t.A),Na(i,t),t.w=null}return t.a}}))}function Is(t,n){var e={};return e.apiKey=Ss(t).options.apiKey,e.authDomain=Ss(t).options.authDomain,e.appName=Ss(t).name,t.U.then(function(){return es(e,n,t.G,t.Ka())}).then(function(n){return Os(t)&&n.uid==Os(t).uid?(qa(Os(t),n),t.ka(n)):(Ts(t,n),La(n),t.ka(n))}).then(function(){Cs(t)})}function Ts(t,n){Os(t)&&(_a(Os(t),t.Ga),en(Os(t),\"tokenChanged\",t.pa),en(Os(t),\"userDeleted\",t.qa),en(Os(t),\"userInvalidated\",t.ra),Ca(Os(t))),n&&(n.N.push(t.Ga),Zt(n,\"tokenChanged\",t.pa),Zt(n,\"userDeleted\",t.qa),Zt(n,\"userInvalidated\",t.ra),0<t.o&&Pa(n)),Ti(t,\"currentUser\",n),n&&(n.na(t.$()),ka(n,t),Ea(n,t.A),Na(n,t))}function As(t){var n=os(t.G,Ss(t).options.authDomain).then(function(n){return(t.w=n)&&(n.ca=t.G),rs(t.G)});return _s(t,n)}function ks(t){var n=Ss(t).options.authDomain,e=As(t).then(function(){return ds(t.h,n)}).then(function(n){return n?(n.ca=t.G,t.w&&(t.w.Z||null)==(n.Z||null)?n:n.reload().then(function(){return fs(t.h,n).then(function(){return n})}).s(function(e){return\"auth/network-request-failed\"==e.code?n:ls(t.h)})):null}).then(function(n){Ts(t,n||null)});return _s(t,e)}function Es(t){return t.U.then(function(){return t.aa()}).s(function(){}).then(function(){if(!t.l)return t.ha()}).s(function(){}).then(function(){if(!t.l){t.W=!0;var n=t.h;No(n.b,cs(\"local\"),n.a,t.ha)}})}function Ns(t,n){var e=null,i=null;return _s(t,n.then(function(n){return e=ur(n),i=Ui(n),Is(t,n)}).then(function(){return ki({user:Os(t),credential:e,additionalUserInfo:i,operationType:\"signIn\"})}))}function Ss(t){return t.app}function Os(t){return t.currentUser}function Ps(t){return Os(t)&&Os(t)._lat||null}function Cs(t){if(t.W){for(var n=0;n<t.m.length;n++)t.m[n]&&t.m[n](Ps(t));if(t.R!==t.getUid()&&t.I.length)for(t.R=t.getUid(),n=0;n<t.I.length;n++)t.I[n]&&t.I[n](Ps(t))}}function Rs(t,n){t.I.push(n),_s(t,t.i.then(function(){!t.l&&k(t.I,n)&&t.R!==t.getUid()&&(t.R=t.getUid(),n(Ps(t)))}))}function _s(t,n){return t.N.push(n),at(n,function(){E(t.N,n)}),n}function Ds(t,n,e,i){t:{e=Array.prototype.slice.call(e);for(var r=0,o=!1,a=0;a<n.length;a++)if(n[a].optional)o=!0;else{if(o)throw new Pi(\"internal-error\",\"Argument validator encountered a required argument after an optional argument.\");r++}if(o=n.length,e.length<r||o<e.length)i=\"Expected \"+(r==o?1==r?\"1 argument\":r+\" arguments\":r+\"-\"+o+\" arguments\")+\" but got \"+e.length+\".\";else{for(r=0;r<e.length;r++)if(o=n[r].optional&&void 0===e[r],!n[r].M(e[r])&&!o){if(n=n[r],0>r||r>=Of.length)throw new Pi(\"internal-error\",\"Argument validator received an unsupported number of arguments.\");e=Of[r],i=(i?\"\":e+\" argument \")+(n.name?'\"'+n.name+'\" ':\"\")+\"must be \"+n.K+\".\";break t}i=null}}if(i)throw new Pi(\"argument-error\",t+\" failed: \"+i)}function Ls(n,e){return{name:n||\"\",K:\"a valid string\",optional:!!e,M:t}}function xs(){return{name:\"opt_forceRefresh\",K:\"a boolean\",optional:!0,M:n}}function Us(t,n){return{name:t||\"\",K:\"a valid object\",optional:!!n,M:c}}function js(t,n){return{name:t||\"\",K:\"a function\",optional:!!n,M:u}}function Ms(t,n){return{name:t||\"\",K:\"null\",optional:!!n,M:o}}function Vs(){return{name:\"\",K:\"an HTML element\",optional:!1,M:function(t){return!!(t&&t instanceof Element)}}}function Fs(){return{name:\"auth\",K:\"an instance of Firebase Auth\",optional:!0,M:function(t){return!!(t&&t instanceof vs)}}}function Ks(){return{name:\"app\",K:\"an instance of Firebase App\",optional:!0,M:function(t){return!!(t&&t instanceof au.app.App)}}}function qs(t){return{name:t?t+\"Credential\":\"credential\",K:t?\"a valid \"+t+\" credential\":\"a valid credential\",optional:!1,M:function(n){if(!n)return!1;var e=!t||n.providerId===t;return!(!n.wa||!e)}}}function Xs(){return{name:\"authProvider\",K:\"a valid Auth provider\",optional:!1,M:function(t){return!!(t&&t.providerId&&t.hasOwnProperty&&t.hasOwnProperty(\"isOAuthProvider\"))}}}function Bs(){return{name:\"applicationVerifier\",K:\"an implementation of firebase.auth.ApplicationVerifier\",optional:!1,M:function(n){return!!(n&&t(n.type)&&u(n.verify))}}}function Hs(t,n,e,i){return{name:e||\"\",K:t.K+\" or \"+n.K,optional:!!i,M:function(e){return t.M(e)||n.M(e)}}}function Ws(t,n,e,i,r,o){if(Ti(this,\"type\",\"recaptcha\"),this.b=this.c=null,this.m=!1,this.l=n,this.a=e||{theme:\"light\",type:\"image\"},this.g=[],this.a[Rf])throw new Pi(\"argument-error\",\"sitekey should not be provided for reCAPTCHA as one is automatically provisioned for the current project.\");if(this.h=\"invisible\"===this.a[_f],!Dt(n)||!this.h&&Dt(n).hasChildNodes())throw new Pi(\"argument-error\",\"reCAPTCHA container is either not found or already contains inner elements!\");this.u=new mr(t,o||null,r||null),this.o=i||function(){return null};var a=this;this.i=[];var s=this.a[Pf];this.a[Pf]=function(t){if(Gs(a,t),\"function\"==typeof s)s(t);else if(\"string\"==typeof s){var n=oi(s,uu);\"function\"==typeof n&&n(t)}};var u=this.a[Cf];this.a[Cf]=function(){if(Gs(a,null),\"function\"==typeof u)u();else if(\"string\"==typeof u){var t=oi(u,uu);\"function\"==typeof t&&t()}}}function Gs(t,n){for(var e=0;e<t.i.length;e++)try{t.i[e](n)}catch(t){}}function zs(t,n){N(t.i,function(t){return t==n})}function Js(t,n){return t.g.push(n),at(n,function(){E(t.g,n)}),n}function Ys(t){if(t.m)throw new Pi(\"internal-error\",\"RecaptchaVerifier instance has been destroyed.\")}function $s(){this.b=uu.grecaptcha?1/0:0,this.c=null,this.a=\"__rcb\"+Math.floor(1e6*Math.random())}function Zs(t,n){return new Z(function(e,i){if(gi())if(!uu.grecaptcha||n!==t.c&&!t.b){uu[t.a]=function(){if(uu.grecaptcha){t.c=n;var r=uu.grecaptcha.render;uu.grecaptcha.render=function(n,e){return n=r(n,e),t.b++,n},e()}else i(new Pi(\"internal-error\"));delete uu[t.a]};var r=kt(Df,{onload:t.a,hl:n||\"\"});nt(De(r)).s(function(){i(new Pi(\"internal-error\",\"Unable to load external reCAPTCHA dependencies!\"))})}else e();else i(new Pi(\"network-request-failed\"))})}function Qs(){return Lf||(Lf=new $s),Lf}function tu(t,n,e){try{this.f=e||au.app()}catch(t){throw new Pi(\"argument-error\",\"No firebase.app.App instance is currently initialized.\")}if(!this.f.options||!this.f.options.apiKey)throw new Pi(\"invalid-api-key\");e=this.f.options.apiKey;var i=this,r=null;try{r=this.f.auth().Ka()}catch(t){}r=au.SDK_VERSION?ii(au.SDK_VERSION,r):null,Ws.call(this,e,t,n,function(){try{var t=i.f.auth().$()}catch(n){t=null}return t},r,Fr(jh))}function nu(t,n){for(var e in n){var i=n[e].name;t[i]=iu(i,t[e],n[e].j)}}function eu(t,n,e,i){t[n]=iu(n,e,i)}function iu(t,n,e){function i(){var t=Array.prototype.slice.call(arguments);return Ds(o,e,t),n.apply(this,t)}if(!e)return n;var r,o=ru(t);for(r in n)i[r]=n[r];for(r in n.prototype)i.prototype[r]=n.prototype[r];return i}function ru(t){return t=t.split(\".\"),t[t.length-1]}var ou,au=e(6).default,su=su||{},uu=this,cu=\"closure_uid_\"+(1e9*Math.random()>>>0),hu=0,fu=Date.now||function(){return+new Date};p(v,Error),v.prototype.name=\"CustomError\";var lu=String.prototype.trim?function(t){return t.trim()}:function(t){return t.replace(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")},du=/&/g,pu=/</g,vu=/>/g,mu=/\"/g,gu=/'/g,bu=/\\x00/g,wu=/[\\x00&<>\"']/;p(y,v),y.prototype.name=\"AssertionError\";var yu,Iu=Array.prototype.indexOf?function(t,n,e){return Array.prototype.indexOf.call(t,n,e)}:function(n,e,i){if(i=null==i?0:0>i?Math.max(0,n.length+i):i,t(n))return t(e)&&1==e.length?n.indexOf(e,i):-1;for(;i<n.length;i++)if(i in n&&n[i]===e)return i;return-1},Tu=Array.prototype.forEach?function(t,n,e){Array.prototype.forEach.call(t,n,e)}:function(n,e,i){for(var r=n.length,o=t(n)?n.split(\"\"):n,a=0;a<r;a++)a in o&&e.call(i,o[a],a,n)},Au=Array.prototype.map?function(t,n,e){return Array.prototype.map.call(t,n,e)}:function(n,e,i){for(var r=n.length,o=Array(r),a=t(n)?n.split(\"\"):n,s=0;s<r;s++)s in a&&(o[s]=e.call(i,a[s],s,n));return o},ku=Array.prototype.some?function(t,n,e){return Array.prototype.some.call(t,n,e)}:function(n,e,i){for(var r=n.length,o=t(n)?n.split(\"\"):n,a=0;a<r;a++)if(a in o&&e.call(i,o[a],a,n))return!0;return!1};t:{var Eu=uu.navigator;if(Eu){var Nu=Eu.userAgent;if(Nu){yu=Nu;break t}}yu=\"\"}var Su=\"constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf\".split(\" \");j[\" \"]=i;var Ou,Pu=P(\"Opera\"),Cu=P(\"Trident\")||P(\"MSIE\"),Ru=P(\"Edge\"),_u=Ru||Cu,Du=P(\"Gecko\")&&!(b(yu.toLowerCase(),\"webkit\")&&!P(\"Edge\"))&&!(P(\"Trident\")||P(\"MSIE\"))&&!P(\"Edge\"),Lu=b(yu.toLowerCase(),\"webkit\")&&!P(\"Edge\");t:{var xu=\"\",Uu=function(){var t=yu;return Du?/rv\\:([^\\);]+)(\\)|;)/.exec(t):Ru?/Edge\\/([\\d\\.]+)/.exec(t):Cu?/\\b(?:MSIE|rv)[: ]([^\\);]+)(\\)|;)/.exec(t):Lu?/WebKit\\/(\\S+)/.exec(t):Pu?/(?:Version)[ \\/]?(\\S+)/.exec(t):void 0}();if(Uu&&(xu=Uu?Uu[1]:\"\"),Cu){var ju=V();if(null!=ju&&ju>parseFloat(xu)){Ou=ju+\"\";break t}}Ou=xu}var Mu,Vu={},Fu=uu.document;Mu=Fu&&Cu?V()||(\"CSS1Compat\"==Fu.compatMode?parseInt(Ou,10):5):void 0,X.prototype.get=function(){if(0<this.b){this.b--;var t=this.a;this.a=t.next,t.next=null}else t=this.c();return t};var Ku=new X(function(){return new W},function(t){t.reset()},100);W.prototype.set=function(t,n){this.a=t,this.b=n,this.next=null},W.prototype.reset=function(){this.next=this.b=this.a=null};var qu,Xu,Bu=!1,Hu=new function(){this.b=this.a=null},Wu=0,Gu=2,zu=3;Q.prototype.reset=function(){this.f=this.b=this.g=this.a=null,this.c=!1};var Ju=new X(function(){return new Q},function(t){t.reset()},100);Z.prototype.then=function(t,n,e){return ct(this,u(t)?t:null,u(n)?n:null,e)},K(Z),ou=Z.prototype,ou.s=function(t,n){return ct(this,null,t,n)},ou.cancel=function(t){this.a==Wu&&J(function(){st(this,new bt(t))},this)},ou.Ac=function(t){this.a=Wu,ht(this,Gu,t)},ou.Bc=function(t){this.a=Wu,ht(this,zu,t)},ou.Qb=function(){for(var t;t=pt(this);)vt(this,t,this.a,this.i);this.h=!1};var Yu=G;p(bt,v),bt.prototype.name=\"cancel\";var $u=!Cu||9<=+Mu;wt.prototype.la=!0,wt.prototype.ja=function(){return this.a},wt.prototype.toString=function(){return\"Const{\"+this.a+\"}\"};var Zu={};It(\"\"),Tt.prototype.la=!0,Tt.prototype.ja=function(){return this.a},Tt.prototype.toString=function(){return\"TrustedResourceUrl{\"+this.a+\"}\"};var Qu=/%{(\\w+)}/g,tc=/^(?:https:)?\\/\\/[0-9a-z.:[\\]-]+\\/|^\\/[^\\/\\\\]|^about:blank(#|$)/i,nc={};Nt.prototype.la=!0,Nt.prototype.ja=function(){return this.a},Nt.prototype.toString=function(){return\"SafeUrl{\"+this.a+\"}\"};var ec=/^(?:(?:https?|mailto|ftp):|[^:\\/?#]*(?:[\\/?#]|$))/i,ic={};Pt(\"about:blank\"),Ct.prototype.la=!0,Ct.prototype.ja=function(){return this.a},Ct.prototype.toString=function(){return\"SafeHtml{\"+this.a+\"}\"};var rc={};_t(\"<!DOCTYPE html>\"),_t(\"\"),_t(\"<br>\");var oc={cellpadding:\"cellPadding\",cellspacing:\"cellSpacing\",colspan:\"colSpan\",frameborder:\"frameBorder\",height:\"height\",maxlength:\"maxLength\",nonce:\"nonce\",role:\"role\",rowspan:\"rowSpan\",type:\"type\",usemap:\"useMap\",valign:\"vAlign\",width:\"width\"},ac={'\"':'\\\\\"',\"\\\\\":\"\\\\\\\\\",\"/\":\"\\\\/\",\"\\b\":\"\\\\b\",\"\\f\":\"\\\\f\",\"\\n\":\"\\\\n\",\"\\r\":\"\\\\r\",\"\\t\":\"\\\\t\",\"\\v\":\"\\\\u000b\"},sc=/\\uffff/.test(\"￿\")?/[\\\\\\\"\\x00-\\x1f\\x7f-\\uffff]/g:/[\\\\\\\"\\x00-\\x1f\\x7f-\\xff]/g,uc=0,cc={};qt.prototype.oa=!1,qt.prototype.ta=function(){if(this.Fa)for(;this.Fa.length;)this.Fa.shift()()};var hc=Object.freeze||function(t){return t},fc=!Cu||9<=+Mu,lc=Cu&&!F(\"9\"),dc=function(){if(!uu.addEventListener||!Object.defineProperty)return!1;var t=!1,n=Object.defineProperty({},\"passive\",{get:function(){t=!0}});return uu.addEventListener(\"test\",i,n),uu.removeEventListener(\"test\",i,n),t}();Bt.prototype.c=function(){this.Bb=!1},p(Ht,Bt);var pc=hc({2:\"touch\",3:\"pen\",4:\"mouse\"});Ht.prototype.c=function(){Ht.ib.c.call(this);var t=this.a;if(t.preventDefault)t.preventDefault();else if(t.returnValue=!1,lc)try{(t.ctrlKey||112<=t.keyCode&&123>=t.keyCode)&&(t.keyCode=-1)}catch(t){}},Ht.prototype.g=function(){return this.a};var vc=\"closure_listenable_\"+(1e6*Math.random()|0),mc=0,gc=\"closure_lm_\"+(1e6*Math.random()|0),bc={},wc=0,yc=\"__closure_events_fn_\"+(1e9*Math.random()>>>0);p(fn,qt),fn.prototype[vc]=!0,fn.prototype.removeEventListener=function(t,n,e,i){en(this,t,n,e,i)},fn.prototype.ta=function(){if(fn.ib.ta.call(this),this.u){var t,n=this.u,e=0;for(t in n.a){for(var i=n.a[t],r=0;r<i.length;r++)++e,Gt(i[r]);delete n.a[t],n.b--}}this.Ra=null},bn.prototype.a=null;var Ic=0;bn.prototype.reset=function(t,n,e,i,r){\"number\"==typeof r||Ic++,i||fu(),this.b=n,delete this.a},yn.prototype.toString=function(){return this.name};var Tc=new yn(\"SEVERE\",1e3),Ac=new yn(\"CONFIG\",700),kc=new yn(\"FINE\",500);wn.prototype.log=function(t,n,e){if(t.value>=In(this).value)for(u(n)&&(n=n()),t=new bn(t,n+\"\",this.f),e&&(t.a=e),e=\"log:\"+t.b,(t=uu.console)&&t.timeStamp&&t.timeStamp(e),(t=uu.msWriteProfilerMark)&&t(e),e=this;e;)e=e.a};var Ec={},Nc=null;ou=An.prototype,ou.P=function(){kn(this);for(var t=[],n=0;n<this.a.length;n++)t.push(this.b[this.a[n]]);return t},ou.S=function(){return kn(this),this.a.concat()},ou.clear=function(){this.b={},this.c=this.a.length=0},ou.get=function(t,n){return En(this.b,t)?this.b[t]:n},ou.set=function(t,n){En(this.b,t)||(this.c++,this.a.push(t)),this.b[t]=n},ou.forEach=function(t,n){for(var e=this.S(),i=0;i<e.length;i++){var r=e[i],o=this.get(r);t.call(n,o,r,this)}};var Sc=null,Oc=null;Rn.prototype.cancel=function(t){if(this.a)this.c instanceof Rn&&this.c.cancel();else{if(this.b){var n=this.b;delete this.b,t?n.cancel(t):0>=--n.l&&n.cancel()}this.v?this.v.call(this.o,this):this.u=!0,this.a||(t=new Vn,Dn(this),_n(this,!1,t))}},Rn.prototype.m=function(t,n){this.i=!1,_n(this,t,n)},Rn.prototype.A=function(t){Dn(this),_n(this,!0,t)},Rn.prototype.then=function(t,n,e){var i,r,o=new Z(function(t,n){i=t,r=n});return xn(this,i,function(t){t instanceof Vn?o.cancel():r(t)}),o.then(t,n,e)},K(Rn),p(Mn,v),Mn.prototype.message=\"Deferred has already fired\",Mn.prototype.name=\"AlreadyCalledError\",p(Vn,v),Vn.prototype.message=\"Deferred was canceled\",Vn.prototype.name=\"CanceledError\",Fn.prototype.c=function(){throw delete Cc[this.a],this.b};var Pc,Cc={};p(qn,Kn);for(var Rc=64,_c=Rc-1,Dc=[],Lc=0;Lc<_c;Lc++)Dc[Lc]=0;var xc=S(128,Dc);qn.prototype.reset=function(){this.g=this.c=0,this.a=uu.Int32Array?new Int32Array(this.h):O(this.h)};var Uc=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];p(Hn,qn);var jc=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],Mc=/^(?:([^:\\/?#.]+):)?(?:\\/\\/(?:([^\\/?#]*)@)?([^\\/#?]*?)(?::([0-9]+))?(?=[\\/#?]|$))?([^?#]+)?(?:\\?([^#]*))?(?:#([\\s\\S]*))?$/;Yn.prototype.toString=function(){var t=[],n=this.c;n&&t.push(oe(n,Vc,!0),\":\");var e=this.b;return(e||\"file\"==n)&&(t.push(\"//\"),(n=this.l)&&t.push(oe(n,Vc,!0),\"@\"),t.push(encodeURIComponent(e+\"\").replace(/%25([0-9a-fA-F]{2})/g,\"%$1\")),null!=(e=this.i)&&t.push(\":\",e+\"\")),(e=this.g)&&(this.b&&\"/\"!=e.charAt(0)&&t.push(\"/\"),t.push(oe(e,\"/\"==e.charAt(0)?Kc:Fc,!0))),(e=\"\"+this.a)&&t.push(\"?\",e),(e=this.h)&&t.push(\"#\",oe(e,Xc)),t.join(\"\")};var Vc=/[#\\/\\?@]/g,Fc=/[\\#\\?:]/g,Kc=/[\\#\\?]/g,qc=/[\\#\\?@]/g,Xc=/#/g;ou=se.prototype,ou.clear=function(){this.a=this.c=null,this.b=0},ou.forEach=function(t,n){ue(this),this.a.forEach(function(e,i){Tu(e,function(e){t.call(n,e,i,this)},this)},this)},ou.S=function(){ue(this);for(var t=this.a.P(),n=this.a.S(),e=[],i=0;i<n.length;i++)for(var r=t[i],o=0;o<r.length;o++)e.push(n[i]);return e},ou.P=function(n){ue(this);var e=[];if(t(n))le(this,n)&&(e=S(e,this.a.get(pe(this,n))));else{n=this.a.P();for(var i=0;i<n.length;i++)e=S(e,n[i])}return e},ou.set=function(t,n){return ue(this),this.c=null,t=pe(this,t),le(this,t)&&(this.b-=this.a.get(t).length),this.a.set(t,[n]),this.b+=1,this},ou.get=function(t,n){return t=t?this.P(t):[],0<t.length?t[0]+\"\":n},ou.toString=function(){if(this.c)return this.c;if(!this.a)return\"\";for(var t=[],n=this.a.S(),e=0;e<n.length;e++){var i=n[e],r=encodeURIComponent(i+\"\");i=this.P(i);for(var o=0;o<i.length;o++){var a=r;\"\"!==i[o]&&(a+=\"=\"+encodeURIComponent(i[o]+\"\")),t.push(a)}}return this.c=t.join(\"&\")},me.prototype.c=null;var Bc;p(be,me),be.prototype.a=function(){var t=we(this);return t?new ActiveXObject(t):new XMLHttpRequest},be.prototype.b=function(){var t={};return we(this)&&(t[0]=!0,t[1]=!0),t},Bc=new be,p(ye,fn);var Hc=\"\",Wc=ye.prototype,Gc=Tn(\"goog.net.XhrIo\");Wc.J=Gc;var zc=/^https?$/i,Jc=[\"POST\",\"PUT\"];ou=ye.prototype,ou.Ea=function(){void 0!==su&&this.a&&(this.g=\"Timed out after \"+this.f+\"ms, aborting\",Nn(this.J,_e(this,this.g)),ln(this,\"timeout\"),this.abort(8))},ou.abort=function(){this.a&&this.b&&(Nn(this.J,_e(this,\"Aborting\")),this.b=!1,this.c=!0,this.a.abort(),this.c=!1,ln(this,\"complete\"),ln(this,\"abort\"),Se(this))},ou.ta=function(){this.a&&(this.b&&(this.b=!1,this.c=!0,this.a.abort(),this.c=!1),Se(this,!0)),ye.ib.ta.call(this)},ou.Ab=function(){this.oa||(this.G||this.h||this.c?Ne(this):this.jc())},ou.jc=function(){Ne(this)},ou.getResponse=function(){try{if(!this.a)return null;if(\"response\"in this.a)return this.a.response;switch(this.l){case Hc:case\"text\":return this.a.responseText;case\"arraybuffer\":if(\"mozResponseArrayBuffer\"in this.a)return this.a.mozResponseArrayBuffer}var t=this.J;return t&&t.log(Tc,\"Response type \"+this.l+\" is not supported on this browser\",void 0),null}catch(t){return Nn(this.J,\"Can not get response: \"+t.message),null}};var Yc=/^[+a-zA-Z0-9_.!#$%&'*\\/=?^`{|}~-]+@([a-zA-Z0-9-]+\\.)+[a-zA-Z0-9]{2,63}$/,$c=0,Zc=1;p(je,v),p(Me,me),Me.prototype.a=function(){var t=new XMLHttpRequest;if(\"withCredentials\"in t)return t;if(\"undefined\"!=typeof XDomainRequest)return new Ve;throw Error(\"Unsupported browser\")},Me.prototype.b=function(){return{}},ou=Ve.prototype,ou.open=function(t,n,e){if(null!=e&&!e)throw Error(\"Only async requests are supported.\");this.a.open(t,n)},ou.send=function(t){if(t){if(\"string\"!=typeof t)throw Error(\"Only string data is supported\");this.a.send(t)}else this.a.send()},ou.abort=function(){this.a.abort()},ou.setRequestHeader=function(){},ou.getResponseHeader=function(t){return\"content-type\"==t.toLowerCase()?this.a.contentType:\"\"},ou.Wb=function(){this.status=200,this.responseText=this.a.responseText,Fe(this,4)},ou.xb=function(){this.status=500,this.responseText=\"\",Fe(this,4)},ou.Yb=function(){this.xb()},ou.Xb=function(){this.status=200,Fe(this,1)},ou.getAllResponseHeaders=function(){return\"content-type: \"+this.a.contentType};var Qc=/^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,th=\"Firefox\",nh=\"Chrome\",eh={Gc:\"FirebaseCore-web\",Ic:\"FirebaseUI-web\"};bi.prototype.get=function(){return this.a?this.b:this.c};var ih,rh={};try{var oh={};Object.defineProperty(oh,\"abcd\",{configurable:!0,enumerable:!0,value:1}),Object.defineProperty(oh,\"abcd\",{configurable:!0,enumerable:!0,value:2}),ih=2==oh.abcd}catch(t){ih=!1}var ah=\"email\",sh=\"newEmail\",uh=\"requestType\",ch=\"email\",hh=\"fromEmail\",fh=\"data\",lh=\"operation\";p(Pi,Error),Pi.prototype.B=function(){return{code:this.code,message:this.message}},Pi.prototype.toJSON=function(){return this.B()};var dh=\"auth/\",ph={\"argument-error\":\"\",\"app-not-authorized\":\"This app, identified by the domain where it's hosted, is not authorized to use Firebase Authentication with the provided API key. Review your key configuration in the Google API console.\",\"app-not-installed\":\"The requested mobile application corresponding to the identifier (Android package name or iOS bundle ID) provided is not installed on this device.\",\"captcha-check-failed\":\"The reCAPTCHA response token provided is either invalid, expired, already used or the domain associated with it does not match the list of whitelisted domains.\",\"code-expired\":\"The SMS code has expired. Please re-send the verification code to try again.\",\"cordova-not-ready\":\"Cordova framework is not ready.\",\"cors-unsupported\":\"This browser is not supported.\",\"credential-already-in-use\":\"This credential is already associated with a different user account.\",\"custom-token-mismatch\":\"The custom token corresponds to a different audience.\",\"requires-recent-login\":\"This operation is sensitive and requires recent authentication. Log in again before retrying this request.\",\"dynamic-link-not-activated\":\"Please activate Dynamic Links in the Firebase Console and agree to the terms and conditions.\",\"email-already-in-use\":\"The email address is already in use by another account.\",\"expired-action-code\":\"The action code has expired. \",\"cancelled-popup-request\":\"This operation has been cancelled due to another conflicting popup being opened.\",\"internal-error\":\"An internal error has occurred.\",\"invalid-app-credential\":\"The phone verification request contains an invalid application verifier. The reCAPTCHA token response is either invalid or expired.\",\"invalid-app-id\":\"The mobile app identifier is not registed for the current project.\",\"invalid-user-token\":\"The user's credential is no longer valid. The user must sign in again.\",\"invalid-auth-event\":\"An internal error has occurred.\",\"invalid-verification-code\":\"The SMS verification code used to create the phone auth credential is invalid. Please resend the verification code sms and be sure use the verification code provided by the user.\",\"invalid-continue-uri\":\"The continue URL provided in the request is invalid.\",\"invalid-cordova-configuration\":\"The following Cordova plugins must be installed to enable OAuth sign-in: cordova-plugin-buildinfo, cordova-universal-links-plugin, cordova-plugin-browsertab, cordova-plugin-inappbrowser and cordova-plugin-customurlscheme.\",\"invalid-custom-token\":\"The custom token format is incorrect. Please check the documentation.\",\"invalid-email\":\"The email address is badly formatted.\",\"invalid-api-key\":\"Your API key is invalid, please check you have copied it correctly.\",\"invalid-cert-hash\":\"The SHA-1 certificate hash provided is invalid.\",\"invalid-credential\":\"The supplied auth credential is malformed or has expired.\",\"invalid-persistence-type\":\"The specified persistence type is invalid. It can only be local, session or none.\",\"invalid-message-payload\":\"The email template corresponding to this action contains invalid characters in its message. Please fix by going to the Auth email templates section in the Firebase Console.\",\"invalid-oauth-provider\":\"EmailAuthProvider is not supported for this operation. This operation only supports OAuth providers.\",\"invalid-oauth-client-id\":\"The OAuth client ID provided is either invalid or does not match the specified API key.\",\"unauthorized-domain\":\"This domain is not authorized for OAuth operations for your Firebase project. Edit the list of authorized domains from the Firebase console.\",\"invalid-action-code\":\"The action code is invalid. This can happen if the code is malformed, expired, or has already been used.\",\"wrong-password\":\"The password is invalid or the user does not have a password.\",\"invalid-phone-number\":\"The format of the phone number provided is incorrect. Please enter the phone number in a format that can be parsed into E.164 format. E.164 phone numbers are written in the format [+][country code][subscriber number including area code].\",\"invalid-recipient-email\":\"The email corresponding to this action failed to send as the provided recipient email address is invalid.\",\"invalid-sender\":\"The email template corresponding to this action contains an invalid sender email or name. Please fix by going to the Auth email templates section in the Firebase Console.\",\"invalid-verification-id\":\"The verification ID used to create the phone auth credential is invalid.\",\"missing-android-pkg-name\":\"An Android Package Name must be provided if the Android App is required to be installed.\",\"auth-domain-config-required\":\"Be sure to include authDomain when calling firebase.initializeApp(), by following the instructions in the Firebase console.\",\"missing-app-credential\":\"The phone verification request is missing an application verifier assertion. A reCAPTCHA response token needs to be provided.\",\"missing-verification-code\":\"The phone auth credential was created with an empty SMS verification code.\",\"missing-continue-uri\":\"A continue URL must be provided in the request.\",\"missing-iframe-start\":\"An internal error has occurred.\",\"missing-ios-bundle-id\":\"An iOS Bundle ID must be provided if an App Store ID is provided.\",\"missing-phone-number\":\"To send verification codes, provide a phone number for the recipient.\",\"missing-verification-id\":\"The phone auth credential was created with an empty verification ID.\",\"app-deleted\":\"This instance of FirebaseApp has been deleted.\",\"account-exists-with-different-credential\":\"An account already exists with the same email address but different sign-in credentials. Sign in using a provider associated with this email address.\",\"network-request-failed\":\"A network error (such as timeout, interrupted connection or unreachable host) has occurred.\",\"no-auth-event\":\"An internal error has occurred.\",\"no-such-provider\":\"User was not linked to an account with the given provider.\",\"operation-not-allowed\":\"The given sign-in provider is disabled for this Firebase project. Enable it in the Firebase console, under the sign-in method tab of the Auth section.\",\"operation-not-supported-in-this-environment\":'This operation is not supported in the environment this application is running on. \"location.protocol\" must be http, https or chrome-extension and web storage must be enabled.',\"popup-blocked\":\"Unable to establish a connection with the popup. It may have been blocked by the browser.\",\"popup-closed-by-user\":\"The popup has been closed by the user before finalizing the operation.\",\"provider-already-linked\":\"User can only be linked to one identity for the given provider.\",\"quota-exceeded\":\"The project's quota for this operation has been exceeded.\",\"redirect-cancelled-by-user\":\"The redirect operation has been cancelled by the user before finalizing.\",\"redirect-operation-pending\":\"A redirect sign-in operation is already pending.\",timeout:\"The operation has timed out.\",\"user-token-expired\":\"The user's credential is no longer valid. The user must sign in again.\",\"too-many-requests\":\"We have blocked all requests from this device due to unusual activity. Try again later.\",\"unauthorized-continue-uri\":\"The domain of the continue URL is not whitelisted.  Please whitelist the domain in the Firebase console.\",\"unsupported-persistence-type\":\"The current environment does not support the specified persistence type.\",\"user-cancelled\":\"User did not grant your application the permissions it requested.\",\"user-not-found\":\"There is no user record corresponding to this identifier. The user may have been deleted.\",\"user-disabled\":\"The user account has been disabled by an administrator.\",\"user-mismatch\":\"The supplied credentials do not correspond to the previously signed in user.\",\"user-signed-out\":\"\",\"weak-password\":\"The password must be 6 characters long or more.\",\"web-storage-unsupported\":\"This browser is not supported or 3rd party cookies and data may be disabled.\"},vh=\"android\",mh=\"handleCodeInApp\",gh=\"iOS\",bh=\"url\",wh=\"installApp\",yh=\"minimumVersion\",Ih=\"packageName\",Th=\"bundleId\",Ah=\"oauth_consumer_key oauth_nonce oauth_signature oauth_signature_method oauth_timestamp oauth_token oauth_version\".split(\" \"),kh=[\"client_id\",\"response_type\",\"scope\",\"redirect_uri\",\"state\"],Eh={Hc:{Ma:\"locale\",za:500,ya:600,Na:\"facebook.com\",$a:kh},Jc:{Ma:null,za:500,ya:620,Na:\"github.com\",$a:kh},Kc:{Ma:\"hl\",za:515,ya:680,Na:\"google.com\",$a:kh},Qc:{Ma:\"lang\",za:485,ya:705,Na:\"twitter.com\",$a:Ah}},Nh=\"idToken\",Sh=\"providerId\";p(Mi,ji),p(Vi,Mi),p(Fi,Mi),p(Ki,Mi),p(qi,Mi),Bi.prototype.wa=function(t){return Dr(t,Hi(this))},Bi.prototype.b=function(t,n){var e=Hi(this);return e.idToken=n,Lr(t,e)},Bi.prototype.c=function(t,n){return Xi(xr(t,Hi(this)),n)},Bi.prototype.B=function(){var t={providerId:this.providerId};return this.idToken&&(t.oauthIdToken=this.idToken),this.accessToken&&(t.oauthAccessToken=this.accessToken),this.secret&&(t.oauthTokenSecret=this.secret),t},Wi.prototype.Ba=function(t){return this.rb=x(t),this},p(Gi,Wi),Gi.prototype.sa=function(t){return k(this.a,t)||this.a.push(t),this},Gi.prototype.wb=function(){return O(this.a)},Gi.prototype.credential=function(t,n){if(!t&&!n)throw new Pi(\"argument-error\",\"credential failed: must provide the ID token and/or the access token.\");return new Bi(this.providerId,{idToken:t||null,accessToken:n||null})},p(zi,Gi),Ti(zi,\"PROVIDER_ID\",\"facebook.com\"),p(Yi,Gi),Ti(Yi,\"PROVIDER_ID\",\"github.com\"),p(Zi,Gi),Ti(Zi,\"PROVIDER_ID\",\"google.com\"),p(tr,Wi),Ti(tr,\"PROVIDER_ID\",\"twitter.com\"),er.prototype.wa=function(t){return jr(t,of,{email:this.a,password:this.f})},er.prototype.b=function(t,n){return jr(t,Zh,{idToken:n,email:this.a,password:this.f})},er.prototype.c=function(t,n){return Xi(this.wa(t),n)},er.prototype.B=function(){return{email:this.a,password:this.f}},Ai(ir,{PROVIDER_ID:\"password\"}),rr.prototype.wa=function(t){return t.Qa(or(this))},rr.prototype.b=function(t,n){var e=or(this);return e.idToken=n,jr(t,sf,e)},rr.prototype.c=function(t,n){var e=or(this);return e.operation=\"REAUTH\",t=jr(t,uf,e),Xi(t,n)},rr.prototype.B=function(){var t={providerId:\"phone\"};return this.a.Pa&&(t.verificationId=this.a.Pa),this.a.Oa&&(t.verificationCode=this.a.Oa),this.a.Da&&(t.temporaryProof=this.a.Da),this.a.Y&&(t.phoneNumber=this.a.Y),t},ar.prototype.Qa=function(n,e){var i=this.a.c;return nt(e.verify()).then(function(r){if(!t(r))throw new Pi(\"argument-error\",\"An implementation of firebase.auth.ApplicationVerifier.prototype.verify() must return a firebase.Promise that resolves with a string.\");switch(e.type){case\"recaptcha\":return Pr(i,{phoneNumber:n,recaptchaToken:r}).then(function(t){return\"function\"==typeof e.reset&&e.reset(),t},function(t){throw\"function\"==typeof e.reset&&e.reset(),t});default:throw new Pi(\"argument-error\",'Only firebase.auth.ApplicationVerifiers with type=\"recaptcha\" are currently supported.')}})},Ai(ar,{PROVIDER_ID:\"phone\"}),hr.prototype.B=function(){return{type:this.b,eventId:this.c,urlResponse:this.f,sessionId:this.g,error:this.a&&this.a.B()}},p(lr,Pi),p(dr,Pi),dr.prototype.B=function(){var t={code:this.code,message:this.message};this.email&&(t.email=this.email),this.phoneNumber&&(t.phoneNumber=this.phoneNumber);var n=this.credential&&this.credential.B();return n&&U(t,n),t},dr.prototype.toJSON=function(){return this.B()},p(vr,me),vr.prototype.a=function(){return new this.f},vr.prototype.b=function(){return{}};var Oh,Ph=\"idToken\",Ch=new bi(3e4,6e4),Rh={\"Content-Type\":\"application/x-www-form-urlencoded\"},_h=new bi(3e4,6e4),Dh={\"Content-Type\":\"application/json\"};mr.prototype.m=function(t,n,e,i,r,o){var a=\"Node\"==ti(),s=ni()?a?new ye(this.o):new ye:new ye(this.f);if(o){s.f=Math.max(0,o);var u=setTimeout(function(){ln(s,\"timeout\")},o)}dn(s,\"complete\",function(){u&&clearTimeout(u);var t=null;try{t=JSON.parse(Re(this))||null}catch(n){t=null}n&&n(t)}),pn(s,\"ready\",function(){u&&clearTimeout(u),Xt(this)}),pn(s,\"timeout\",function(){u&&clearTimeout(u),Xt(this),n&&n(null)}),Ie(s,t,e,i,r)};var Lh=It(\"https://apis.google.com/js/client.js?onload=%{onload}\"),xh=\"__fcb\"+Math.floor(1e6*Math.random());mr.prototype.u=function(t,n,e,i,r){var o=this;Oh.then(function(){window.gapi.client.setApiKey(o.b);var a=window.gapi.auth.getToken();window.gapi.auth.setToken(null),window.gapi.client.request({path:t,method:e,body:i,headers:r,authType:\"none\",callback:function(t){window.gapi.auth.setToken(a),n&&n(t)}})}).s(function(t){n&&n({error:{message:t&&t.message||\"CORS_UNSUPPORTED\"}})})},mr.prototype.gb=function(){return jr(this,Qh,{})},mr.prototype.kb=function(t,n){return jr(this,$h,{idToken:t,email:n})},mr.prototype.lb=function(t,n){return jr(this,Zh,{idToken:t,password:n})};var Uh={displayName:\"DISPLAY_NAME\",photoUrl:\"PHOTO_URL\"};ou=mr.prototype,ou.mb=function(t,n){var e={idToken:t},i=[];return C(Uh,function(t,r){var o=n[r];null===o?i.push(t):r in n&&(e[r]=o)}),i.length&&(e.deleteAttribute=i),jr(this,$h,e)},ou.cb=function(t,n){return t={requestType:\"PASSWORD_RESET\",email:t},U(t,n),jr(this,Wh,t)},ou.bb=function(t,n){return t={requestType:\"VERIFY_EMAIL\",idToken:t},U(t,n),jr(this,Hh,t)},ou.Qa=function(t){return jr(this,af,t)},ou.Ta=function(t,n){return jr(this,Jh,{oobCode:t,newPassword:n})},ou.Ia=function(t){return jr(this,Vh,{oobCode:t})},ou.Sa=function(t){return jr(this,Mh,{oobCode:t})};var jh,Mh={endpoint:\"setAccountInfo\",D:Ur,ga:\"email\"},Vh={endpoint:\"resetPassword\",D:Ur,O:function(t){if(!t.email||!t.requestType)throw new Pi(\"internal-error\")}},Fh={endpoint:\"signupNewUser\",D:function(t){if(Ar(t),!t.password)throw new Pi(\"weak-password\")},O:Sr,T:!0},Kh={endpoint:\"createAuthUri\"},qh={endpoint:\"deleteAccount\",ea:[\"idToken\"]},Xh={endpoint:\"setAccountInfo\",ea:[\"idToken\",\"deleteProvider\"],D:function(t){if(!a(t.deleteProvider))throw new Pi(\"internal-error\")}},Bh={endpoint:\"getAccountInfo\"},Hh={endpoint:\"getOobConfirmationCode\",ea:[\"idToken\",\"requestType\"],D:function(t){if(\"VERIFY_EMAIL\"!=t.requestType)throw new Pi(\"internal-error\")},ga:\"email\"},Wh={endpoint:\"getOobConfirmationCode\",ea:[\"requestType\"],D:function(t){if(\"PASSWORD_RESET\"!=t.requestType)throw new Pi(\"internal-error\");Ar(t)},ga:\"email\"},Gh={nb:!0,endpoint:\"getProjectConfig\",zb:\"GET\"},zh={nb:!0,endpoint:\"getRecaptchaParam\",zb:\"GET\",O:function(t){if(!t.recaptchaSiteKey)throw new Pi(\"internal-error\")}},Jh={endpoint:\"resetPassword\",D:Ur,ga:\"email\"},Yh={endpoint:\"sendVerificationCode\",ea:[\"phoneNumber\",\"recaptchaToken\"],ga:\"sessionInfo\"},$h={endpoint:\"setAccountInfo\",ea:[\"idToken\"],D:kr,T:!0},Zh={endpoint:\"setAccountInfo\",ea:[\"idToken\"],D:function(t){if(kr(t),!t.password)throw new Pi(\"weak-password\")},O:Sr,T:!0},Qh={endpoint:\"signupNewUser\",O:Sr,T:!0},tf={endpoint:\"verifyAssertion\",D:Rr,O:_r,T:!0},nf={endpoint:\"verifyAssertion\",D:Rr,O:function(t){if(t.errorMessage&&\"USER_NOT_FOUND\"==t.errorMessage)throw new Pi(\"user-not-found\");if(t.errorMessage)throw Mr(t.errorMessage);if(!t[Ph])throw new Pi(\"internal-error\")},T:!0},ef={endpoint:\"verifyAssertion\",D:function(t){if(Rr(t),!t.idToken)throw new Pi(\"internal-error\")},O:_r,T:!0},rf={endpoint:\"verifyCustomToken\",D:function(t){if(!t.token)throw new Pi(\"invalid-custom-token\")},O:Sr,T:!0},of={endpoint:\"verifyPassword\",D:function(t){if(Ar(t),!t.password)throw new Pi(\"wrong-password\")},O:Sr,T:!0},af={endpoint:\"verifyPhoneNumber\",D:Or,O:Sr},sf={endpoint:\"verifyPhoneNumber\",D:function(t){if(!t.idToken)throw new Pi(\"internal-error\");Or(t)},O:function(t){if(t.temporaryProof)throw t.code=\"credential-already-in-use\",pr(t);Sr(t)}},uf={Pb:{USER_NOT_FOUND:\"user-not-found\"},endpoint:\"verifyPhoneNumber\",D:Or,O:Sr},cf={Mc:{Va:\"https://www.googleapis.com/identitytoolkit/v3/relyingparty/\",ab:\"https://securetoken.googleapis.com/v1/token\",id:\"p\"},Oc:{Va:\"https://staging-www.sandbox.googleapis.com/identitytoolkit/v3/relyingparty/\",ab:\"https://staging-securetoken.sandbox.googleapis.com/v1/token\",id:\"s\"},Pc:{Va:\"https://www-googleapis-test.sandbox.google.com/identitytoolkit/v3/relyingparty/\",ab:\"https://test-securetoken.sandbox.googleapis.com/v1/token\",id:\"t\"}};jh=Fr(\"__EID__\")?\"__EID__\":void 0;var hf=It(\"https://apis.google.com/js/api.js?onload=%{onload}\"),ff=new bi(3e4,6e4),lf=new bi(5e3,15e3),df=null;Wr.prototype.toString=function(){return this.f?te(this.a,\"v\",this.f):fe(this.a.a,\"v\"),this.b?te(this.a,\"eid\",this.b):fe(this.a.a,\"eid\"),this.c.length?te(this.a,\"fw\",this.c.join(\",\")):fe(this.a.a,\"fw\"),\"\"+this.a},Gr.prototype.toString=function(){var t=ie(this.m,\"/__/auth/handler\");if(te(t,\"apiKey\",this.u),te(t,\"appName\",this.c),te(t,\"authType\",this.l),this.a.isOAuthProvider){var n=this.a;try{var e=au.app(this.c).auth().$()}catch(t){e=null}n.Ua=e,te(t,\"providerId\",this.a.providerId),n=this.a,e=li(n.rb);for(var i in e)e[i]=\"\"+e[i];i=n.rc,e=x(e);for(var r=0;r<i.length;r++){var o=i[r];o in e&&delete e[o]}n.Wa&&n.Ua&&!e[n.Wa]&&(e[n.Wa]=n.Ua),D(e)||te(t,\"customParameters\",fi(e))}if(\"function\"==typeof this.a.wb&&(n=this.a.wb(),n.length&&te(t,\"scopes\",n.join(\",\"))),this.h?te(t,\"redirectUrl\",this.h):fe(t.a,\"redirectUrl\"),this.g?te(t,\"eventId\",this.g):fe(t.a,\"eventId\"),this.i?te(t,\"v\",this.i):fe(t.a,\"v\"),this.b)for(var a in this.b)this.b.hasOwnProperty(a)&&!ne(t,a)&&te(t,a,this.b[a]);return this.f?te(t,\"eid\",this.f):fe(t.a,\"eid\"),a=zr(this.c),a.length&&te(t,\"fw\",a.join(\",\")),\"\"+t},ou=Jr.prototype,ou.Ca=function(t,n,e){var i=new Pi(\"popup-closed-by-user\"),r=new Pi(\"web-storage-unsupported\"),o=this,a=!1;return this.ba().then(function(){no(o).then(function(e){e||(t&&Ge(t),n(r),a=!0)})}).s(function(){}).then(function(){if(!a)return Je(t)}).then(function(){if(!a)return gn(e).then(function(){n(i)})})},ou.Db=function(){var t=ri();return!hi(t)&&!vi(t)},ou.yb=function(){return!1},ou.vb=function(t,n,e,i,r,o,a){if(!t)return et(new Pi(\"popup-blocked\"));if(a&&!hi())return this.ba().s(function(n){Ge(t),r(n)}),i(),nt();this.a||(this.a=Yr(Zr(this)));var s=this;return this.a.then(function(){var n=s.ba().s(function(n){throw Ge(t),r(n),n});return i(),n}).then(function(){cr(e),a||Xe(Qr(s.u,s.f,s.b,n,e,null,o,s.c,void 0,s.h),t)}).s(function(t){throw\"auth/network-request-failed\"==t.code&&(s.a=null),t})},ou.Aa=function(t,n,e){this.a||(this.a=Yr(Zr(this)));var i=this;return this.a.then(function(){cr(n),Xe(Qr(i.u,i.f,i.b,t,n,qe(),e,i.c,void 0,i.h))}).s(function(t){throw\"auth/network-request-failed\"==t.code&&(i.a=null),t})},ou.ba=function(){var t=this;return $r(this).then(function(){return t.i.Ya}).s(function(){throw t.a=null,new Pi(\"network-request-failed\")})},ou.Hb=function(){return!0},ou.ua=function(t){this.g.push(t)},ou.Ja=function(t){N(this.g,function(n){return n==t})},ou=eo.prototype,ou.get=function(t){return nt(this.a.getItem(t)).then(function(t){return t&&di(t)})},ou.set=function(t,n){return nt(this.a.setItem(t,fi(n)))},ou.X=function(t){return nt(this.a.removeItem(t))},ou.ia=function(){},ou.da=function(){},ou=io.prototype,ou.get=function(t){return nt(this.a[t])},ou.set=function(t,n){return this.a[t]=n,nt()},ou.X=function(t){return delete this.a[t],nt()},ou.ia=function(){},ou.da=function(){};var pf;ou=ro.prototype,ou.set=function(t,n){var e,i=!1,r=this;return at(ao(this).then(function(n){return e=n,n=so(r,uo(r,e,!0)),co(n.get(t))}).then(function(o){var a=so(r,uo(r,e,!0));return o?(o.value=n,co(a.put(o))):(r.a++,i=!0,o={},o[r.g]=t,o[r.l]=n,co(a.add(o)))}).then(function(){r.f[t]=n}),function(){i&&r.a--})},ou.get=function(t){var n=this;return ao(this).then(function(e){return co(so(n,uo(n,e,!1)).get(t))}).then(function(t){return t&&t.value})},ou.X=function(t){var n=!1,e=this;return at(ao(this).then(function(i){return n=!0,e.a++,co(so(e,uo(e,i,!0)).delete(t))}).then(function(){delete e.f[t]}),function(){n&&e.a--})},ou.zc=function(){var t=this;return ao(this).then(function(n){var e=so(t,uo(t,n,!1));return e.getAll?co(e.getAll()):new Z(function(t,n){var i=[],r=e.openCursor();r.onsuccess=function(n){(n=n.target.result)?(i.push(n.value),n.continue()):t(i)},r.onerror=function(t){n(Error(t.target.errorCode))}})}).then(function(n){var e={},i=[];if(0==t.a){for(i=0;i<n.length;i++)e[n[i][t.g]]=n[i][t.l];i=Be(t.f,e),t.f=e}return i})},ou.ia=function(t){0==this.c.length&&ho(this),this.c.push(t)},ou.da=function(t){N(this.c,function(n){return n==t}),0==this.c.length&&this.b&&this.b.cancel(\"STOP_EVENT\")},ou=fo.prototype,ou.get=function(t){var n=this;return nt().then(function(){return di(n.a.getItem(t))})},ou.set=function(t,n){var e=this;return nt().then(function(){var i=fi(n);null===i?e.X(t):e.a.setItem(t,i)})},ou.X=function(t){var n=this;return nt().then(function(){n.a.removeItem(t)})},ou.ia=function(t){uu.window&&Zt(uu.window,\"storage\",t)},ou.da=function(t){uu.window&&en(uu.window,\"storage\",t)},ou=vo.prototype,ou.get=function(){return nt(null)},ou.set=function(){return nt()},ou.X=function(){return nt()},ou.ia=function(){},ou.da=function(){},ou=mo.prototype,ou.get=function(t){var n=this;return nt().then(function(){return di(n.a.getItem(t))})},ou.set=function(t,n){var e=this;return nt().then(function(){var i=fi(n);null===i?e.X(t):e.a.setItem(t,i)})},ou.X=function(t){var n=this;return nt().then(function(){n.a.removeItem(t)})},ou.ia=function(){},ou.da=function(){};var vf,mf,gf={C:fo,jb:mo},bf={C:fo,jb:mo},wf={C:eo,jb:vo},yf={Lc:\"local\",NONE:\"none\",Nc:\"session\"};Io.prototype.get=function(t,n){return Ao(this,t.C).get(ko(this,t,n))},Io.prototype.set=function(t,n,e){var i=ko(this,t,e),r=this,o=Ao(this,t.C);return o.set(i,n).then(function(){return o.get(i)}).then(function(n){\"local\"==t.C&&(r.b[i]=n)})},Io.prototype.m=function(t){if(t&&t.g){var n=t.a.key;if(null==n)for(var e in this.a){var i=this.b[e];void 0===i&&(i=null);var r=uu.localStorage.getItem(e);r!==i&&(this.b[e]=r,this.c(e))}else if(0==n.indexOf(this.i+this.g)&&this.a[n]){if(void 0!==t.a.a?Ao(this,\"local\").da(this.h):Po(this),this.A)if(e=uu.localStorage.getItem(n),(i=t.a.newValue)!==e)null!==i?uu.localStorage.setItem(n,i):uu.localStorage.removeItem(n);else if(this.b[n]===i&&void 0===t.a.a)return;var o=this;e=function(){void 0===t.a.a&&o.b[n]===uu.localStorage.getItem(n)||(o.b[n]=uu.localStorage.getItem(n),o.c(n))},Cu&&Mu&&10==Mu&&uu.localStorage.getItem(n)!==t.a.newValue&&t.a.newValue!==t.a.oldValue?setTimeout(e,10):e()}}else Tu(t,l(this.c,this))},Io.prototype.c=function(t){this.a[t]&&Tu(this.a[t],function(t){t()})};var If={name:\"authEvent\",C:\"local\"};ou=Lo.prototype,ou.ba=function(){return this.xa?this.xa:this.xa=$e().then(function(){if(\"function\"!=typeof oi(\"universalLinks.subscribe\",uu))throw xo(\"cordova-universal-links-plugin is not installed\");if(void 0===oi(\"BuildInfo.packageName\",uu))throw xo(\"cordova-plugin-buildinfo is not installed\");if(\"function\"!=typeof oi(\"cordova.plugins.browsertab.openUrl\",uu))throw xo(\"cordova-plugin-browsertab is not installed\");if(\"function\"!=typeof oi(\"cordova.InAppBrowser.open\",uu))throw xo(\"cordova-plugin-inappbrowser is not installed\")},function(){throw new Pi(\"cordova-not-ready\")})},ou.Ca=function(t,n){return n(new Pi(\"operation-not-supported-in-this-environment\")),nt()},ou.vb=function(){return et(new Pi(\"operation-not-supported-in-this-environment\"))},ou.Hb=function(){return!1},ou.Db=function(){return!0},ou.yb=function(){return!0},ou.Aa=function(t,n,e){if(this.c)return et(new Pi(\"redirect-operation-pending\"));var i=this,r=uu.document,o=null,a=null,s=null,u=null;return this.c=at(nt().then(function(){return cr(n),Fo(i)}).then(function(){return Mo(i,t,n,e)}).then(function(){return new Z(function(t,n){a=function(){var n=oi(\"cordova.plugins.browsertab.close\",uu);return t(),\"function\"==typeof n&&n(),i.a&&\"function\"==typeof i.a.close&&(i.a.close(),i.a=null),!1},i.ua(a),s=function(){o||(o=gn(i.w).then(function(){n(new Pi(\"redirect-cancelled-by-user\"))}))},u=function(){wi()&&s()},r.addEventListener(\"resume\",s,!1),ri().toLowerCase().match(/android/)||r.addEventListener(\"visibilitychange\",u,!1)}).s(function(t){return Ko(i).then(function(){throw t})})}),function(){s&&r.removeEventListener(\"resume\",s,!1),u&&r.removeEventListener(\"visibilitychange\",u,!1),o&&o.cancel(),a&&i.Ja(a),i.c=null})},ou.ua=function(t){this.b.push(t),Fo(this).s(function(n){\"auth/invalid-cordova-configuration\"===n.code&&(n=new hr(\"unknown\",null,null,null,new Pi(\"no-auth-event\")),t(n))})},ou.Ja=function(t){N(this.b,function(n){return n==t})};var Tf={name:\"pendingRedirect\",C:\"session\"};Go.prototype.reset=function(){this.f=!1,this.a.Ja(this.i),this.a=zo(this.v,this.l,this.u)},Go.prototype.subscribe=function(t){if(k(this.h,t)||this.h.push(t),!this.f){var n=this;Wo(this.g).then(function(t){t?Ho(n.g).then(function(){Jo(n).s(function(t){var e=new hr(\"unknown\",null,null,null,new Pi(\"operation-not-supported-in-this-environment\"));Zo(t)&&n.m(e)})}):Yo(n)}).s(function(){Yo(n)})}},Go.prototype.unsubscribe=function(t){N(this.h,function(n){return n==t})},Go.prototype.m=function(t){if(!t)throw new Pi(\"invalid-auth-event\");for(var n=!1,e=0;e<this.h.length;e++){var i=this.h[e];if(i.ob(t.b,t.c)){(n=this.b[t.b])&&n.h(t,i),n=!0;break}}return na(this.c),n};var Af=new bi(2e3,1e4),kf=new bi(3e4,6e4);Go.prototype.aa=function(){return this.c.aa()},Go.prototype.Aa=function(t,n,e){var i,r=this;return Bo(this.g).then(function(){return r.a.Aa(t,n,e).s(function(t){if(Zo(t))throw new Pi(\"operation-not-supported-in-this-environment\");return i=t,Ho(r.g).then(function(){throw i})}).then(function(){return r.a.Hb()?new Z(function(){}):Ho(r.g).then(function(){return r.aa()}).then(function(){}).s(function(){})})})},Go.prototype.Ca=function(t,n,e,i){return this.a.Ca(e,function(e){t.fa(n,null,e,i)},Af.get())};var Ef={};ta.prototype.reset=function(){this.b=null,this.a&&(this.a.cancel(),this.a=null)},ta.prototype.h=function(t,n){if(!t)return et(new Pi(\"invalid-auth-event\"));this.reset(),this.g=!0;var e=t.b,i=t.c,r=t.a&&\"auth/web-storage-unsupported\"==t.a.code,o=t.a&&\"auth/operation-not-supported-in-this-environment\"==t.a.code;return\"unknown\"!=e||r||o?t.a?(oa(this,!0,null,t.a),t=nt()):t=n.va(e,i)?ea(this,t,n):et(new Pi(\"invalid-auth-event\")):(oa(this,!1,null,null),t=nt()),t},ta.prototype.aa=function(){var t=this;return new Z(function(n,e){t.b?t.b().then(n,e):(t.f.push(n),t.c.push(e),aa(t))})},sa.prototype.h=function(t,n){if(!t)return et(new Pi(\"invalid-auth-event\"));var e=t.b,i=t.c;return t.a?(n.fa(t.b,null,t.a,t.c),t=nt()):t=n.va(e,i)?ua(t,n):et(new Pi(\"invalid-auth-event\")),t},ca.prototype.confirm=function(t){return t=sr(this.verificationId,t),this.a(t)},fa.prototype.start=function(){this.a=this.c,da(this,!0)},va.prototype.B=function(){return{apiKey:this.f.b,refreshToken:this.a,accessToken:this.b,expirationTime:this.c}},va.prototype.getToken=function(t){return t=!!t,this.b&&!this.a?et(new Pi(\"user-token-expired\")):t||!this.b||fu()>this.c-3e4?this.a?ba(this,{grant_type:\"refresh_token\",refresh_token:this.a}):nt(null):nt({accessToken:this.b,expirationTime:this.c,refreshToken:this.a})},wa.prototype.B=function(){return{lastLoginAt:this.b,createdAt:this.a}},p(Ta,Bt),p(Aa,fn),Aa.prototype.na=function(t){this.ha=t,gr(this.c,t)},Aa.prototype.$=function(){return this.ha},Aa.prototype.Ka=function(){return O(this.R)},Aa.prototype.Ga=function(){this.l.b&&(pa(this.l),this.l.start())},Ti(Aa.prototype,\"providerId\",\"firebase\"),ou=Aa.prototype,ou.reload=function(){var t=this;return Qa(this,ja(this).then(function(){return Xa(t).then(function(){return Da(t)}).then(Ua)}))},ou.F=function(t){var n=this;return Qa(this,ja(this).then(function(){return n.h.getToken(t)}).then(function(t){if(!t)throw new Pi(\"internal-error\");return t.accessToken!=n.pa&&(Ra(n,t.accessToken),ln(n,new Ta(\"tokenChanged\"))),Ka(n,\"refreshToken\",t.refreshToken),t.accessToken}))},ou.getToken=function(t){return rh[\"firebase.User.prototype.getToken is deprecated. Please use firebase.User.prototype.getIdToken instead.\"]||(rh[\"firebase.User.prototype.getToken is deprecated. Please use firebase.User.prototype.getIdToken instead.\"]=!0,\"undefined\"!=typeof console&&\"function\"==typeof console.warn&&console.warn(\"firebase.User.prototype.getToken is deprecated. Please use firebase.User.prototype.getIdToken instead.\")),this.F(t)},ou.kc=function(t){if(!(t=t.users)||!t.length)throw new Pi(\"internal-error\");t=t[0],xa(this,{uid:t.localId,displayName:t.displayName,photoURL:t.photoUrl,email:t.email,emailVerified:!!t.emailVerified,phoneNumber:t.phoneNumber,lastLoginAt:t.lastLoginAt,createdAt:t.createdAt});for(var n=Wa(t),e=0;e<n.length;e++)Va(this,n[e]);Ka(this,\"isAnonymous\",!(this.email&&t.passwordHash||this.providerData&&this.providerData.length))},ou.Za=function(t){var n=this,e=null;return Qa(this,t.c(this.c,this.uid).then(function(t){return Ba(n,t),e=za(n,t,\"reauthenticate\"),n.i=null,n.reload()}).then(function(){return e}),!0)},ou.mc=function(t){return this.Za(t).then(function(){})},ou.Xa=function(t){var n=this,e=null;return Qa(this,Ga(this,t.providerId).then(function(){return n.F()}).then(function(e){return t.b(n.c,e)}).then(function(t){return e=za(n,t,\"link\"),Ja(n,t)}).then(function(){return e}))},ou.cc=function(t){return this.Xa(t).then(function(t){return t.user})},ou.dc=function(t,n){var e=this;return Qa(this,Ga(this,\"phone\").then(function(){return ha(Sa(e),t,n,l(e.Xa,e))}))},ou.nc=function(t,n){var e=this;return Qa(this,nt().then(function(){return ha(Sa(e),t,n,l(e.Za,e))}),!0)},ou.kb=function(t){var n=this;return Qa(this,this.F().then(function(e){return n.c.kb(e,t)}).then(function(t){return Ba(n,t),n.reload()}))},ou.Dc=function(t){var n=this;return Qa(this,this.F().then(function(e){return t.b(n.c,e)}).then(function(t){return Ba(n,t),n.reload()}))},ou.lb=function(t){var n=this;return Qa(this,this.F().then(function(e){return n.c.lb(e,t)}).then(function(t){return Ba(n,t),n.reload()}))},ou.mb=function(t){if(void 0===t.displayName&&void 0===t.photoURL)return ja(this);var n=this;return Qa(this,this.F().then(function(e){return n.c.mb(e,{displayName:t.displayName,photoUrl:t.photoURL})}).then(function(t){return Ba(n,t),Ka(n,\"displayName\",t.displayName||null),Ka(n,\"photoURL\",t.photoUrl||null),Tu(n.providerData,function(t){\"password\"===t.providerId&&(Ti(t,\"displayName\",n.displayName),Ti(t,\"photoURL\",n.photoURL))}),Da(n)}).then(Ua))},ou.Cc=function(t){var n=this;return Qa(this,Xa(this).then(function(e){return k(Ma(n),t)?Cr(n.c,e,[t]).then(function(t){var e={};return Tu(t.providerUserInfo||[],function(t){e[t.providerId]=!0}),Tu(Ma(n),function(t){e[t]||Fa(n,t)}),e[ar.PROVIDER_ID]||Ti(n,\"phoneNumber\",null),Da(n)}):Da(n).then(function(){throw new Pi(\"no-such-provider\")})}))},ou.delete=function(){var t=this;return Qa(this,this.F().then(function(n){return jr(t.c,qh,{idToken:n})}).then(function(){ln(t,new Ta(\"userDeleted\"))})).then(function(){for(var n=0;n<t.A.length;n++)t.A[n].cancel(\"app-deleted\");ka(t,null),Na(t,null),t.A=[],t.m=!0,Ca(t),Ti(t,\"refreshToken\",null),t.a&&t.a.unsubscribe(t)})},ou.ob=function(t,n){return!!(\"linkViaPopup\"==t&&(this.g||null)==n&&this.f||\"reauthViaPopup\"==t&&(this.g||null)==n&&this.f||\"linkViaRedirect\"==t&&(this.Z||null)==n||\"reauthViaRedirect\"==t&&(this.Z||null)==n)},ou.fa=function(t,n,e,i){\"linkViaPopup\"!=t&&\"reauthViaPopup\"!=t||i!=(this.g||null)||(e&&this.v?this.v(e):n&&!e&&this.f&&this.f(n),this.b&&(this.b.cancel(),this.b=null),delete this.f,delete this.v)},ou.va=function(t,n){return\"linkViaPopup\"==t&&n==(this.g||null)?l(this.tb,this):\"reauthViaPopup\"==t&&n==(this.g||null)?l(this.ub,this):\"linkViaRedirect\"==t&&(this.Z||null)==n?l(this.tb,this):\"reauthViaRedirect\"==t&&(this.Z||null)==n?l(this.ub,this):null},ou.ec=function(t){var n=this;return Ya(this,\"linkViaPopup\",t,function(){return Ga(n,t.providerId).then(function(){return Da(n)})},!1)},ou.oc=function(t){return Ya(this,\"reauthViaPopup\",t,function(){return nt()},!0)},ou.fc=function(t){var n=this;return $a(this,\"linkViaRedirect\",t,function(){return Ga(n,t.providerId)},!1)},ou.pc=function(t){return $a(this,\"reauthViaRedirect\",t,function(){return nt()},!0)},ou.tb=function(t,n){var e=this;this.b&&(this.b.cancel(),this.b=null);var i=null;return Qa(this,this.F().then(function(i){return Lr(e.c,{requestUri:t,sessionId:n,idToken:i})}).then(function(t){return i=za(e,t,\"link\"),Ja(e,t)}).then(function(){return i}))},ou.ub=function(t,n){var e=this;this.b&&(this.b.cancel(),this.b=null);var i=null;return Qa(this,nt().then(function(){return Xi(xr(e.c,{requestUri:t,sessionId:n}),e.uid)}).then(function(t){return i=za(e,t,\"reauthenticate\"),Ba(e,t),e.i=null,e.reload()}).then(function(){return i}),!0)},ou.bb=function(t){var n=this,e=null;return Qa(this,this.F().then(function(n){return e=n,void 0===t||D(t)?{}:_i(new Ri(t))}).then(function(t){return n.c.bb(e,t)}).then(function(t){if(n.email!=t)return n.reload()}).then(function(){}))},ou.toJSON=function(){return this.B()},ou.B=function(){var t={uid:this.uid,displayName:this.displayName,photoURL:this.photoURL,email:this.email,emailVerified:this.emailVerified,phoneNumber:this.phoneNumber,isAnonymous:this.isAnonymous,providerData:[],apiKey:this.G,appName:this.o,authDomain:this.w,stsTokenManager:this.h.B(),redirectEventId:this.Z||null};return this.metadata&&U(t,this.metadata.B()),Tu(this.providerData,function(n){t.providerData.push(Ei(n))}),t};var Nf={name:\"redirectUser\",C:\"session\"};as.prototype.g=function(){var t=this,n=cs(\"local\");ps(this,function(){return nt().then(function(){return t.c&&\"local\"!=t.c.C?t.b.get(n,t.a):null}).then(function(e){if(e)return ss(t,\"local\").then(function(){t.c=n})})})};var Sf={name:\"persistence\",C:\"session\"};as.prototype.eb=function(t){var n=null,e=this;return yo(t),ps(this,function(){return t!=e.c.C?e.b.get(e.c,e.a).then(function(i){return n=i,ss(e,t)}).then(function(){if(e.c=cs(t),n)return e.b.set(e.c,n,e.a)}):nt()})},p(vs,fn),p(ms,Bt),p(gs,Bt),ou=vs.prototype,ou.eb=function(t){return t=this.h.eb(t),_s(this,t)},ou.na=function(t){this.V===t||this.l||(this.V=t,gr(this.c,this.V),ln(this,new ms(this.$())))},ou.$=function(){return this.V},ou.Ec=function(){var t=uu.navigator;this.na(t?t.languages&&t.languages[0]||t.language||t.userLanguage||null:null)},ou.gc=function(t){this.A.push(t),br(this.c,au.SDK_VERSION?ii(au.SDK_VERSION,this.A):null),ln(this,new gs(this.A))},ou.Ka=function(){return O(this.A)},ou.toJSON=function(){return{apiKey:Ss(this).options.apiKey,authDomain:Ss(this).options.authDomain,appName:Ss(this).name,currentUser:Os(this)&&Os(this).B()}},ou.ob=function(t,n){switch(t){case\"unknown\":case\"signInViaRedirect\":return!0;case\"signInViaPopup\":return this.g==n&&!!this.f;default:return!1}},ou.fa=function(t,n,e,i){\"signInViaPopup\"==t&&this.g==i&&(e&&this.v?this.v(e):n&&!e&&this.f&&this.f(n),this.b&&(this.b.cancel(),this.b=null),delete this.f,delete this.v)},ou.va=function(t,n){return\"signInViaRedirect\"==t||\"signInViaPopup\"==t&&this.g==n&&this.f?l(this.Sb,this):null},ou.Sb=function(t,n){var e=this;t={requestUri:t,sessionId:n},this.b&&(this.b.cancel(),this.b=null);var i=null,r=null,o=Dr(e.c,t).then(function(t){return i=ur(t),r=Ui(t),t});return t=e.U.then(function(){return o}).then(function(t){return Is(e,t)}).then(function(){return ki({user:Os(e),credential:i,additionalUserInfo:r,operationType:\"signIn\"})}),_s(this,t)},ou.wc=function(t){if(!si())return et(new Pi(\"operation-not-supported-in-this-environment\"));var n=this,e=xi(t.providerId),i=pi(),r=null;(!hi()||Qe())&&Ss(this).options.authDomain&&t.isOAuthProvider&&(r=Qr(Ss(this).options.authDomain,Ss(this).options.apiKey,Ss(this).name,\"signInViaPopup\",t,null,i,au.SDK_VERSION||null));var o=ze(r,e&&e.za,e&&e.ya);return e=ws(this).then(function(n){return $o(n,o,\"signInViaPopup\",t,i,!!r)}).then(function(){return new Z(function(t,e){n.fa(\"signInViaPopup\",null,new Pi(\"cancelled-popup-request\"),n.g),n.f=t,n.v=e,n.g=i,n.b=n.a.Ca(n,\"signInViaPopup\",o,i)})}).then(function(t){return o&&Ge(o),t?ki(t):null}).s(function(t){throw o&&Ge(o),t}),_s(this,e)},ou.xc=function(t){if(!si())return et(new Pi(\"operation-not-supported-in-this-environment\"));var n=this;return _s(this,ws(this).then(function(){return hs(n.h)}).then(function(){return n.a.Aa(\"signInViaRedirect\",t)}))},ou.aa=function(){if(!si())return et(new Pi(\"operation-not-supported-in-this-environment\"));var t=this;return _s(this,ws(this).then(function(){return t.a.aa()}).then(function(t){return t?ki(t):null}))},ou.hb=function(){var t=this;return _s(this,this.i.then(function(){return Os(t)?(Ts(t,null),ls(t.h).then(function(){Cs(t)})):nt()}))},ou.yc=function(){var t=this;return ds(this.h,Ss(this).options.authDomain).then(function(n){if(!t.l){var e;if(e=Os(t)&&n){e=Os(t).uid;var i=n.uid;e=void 0!==e&&null!==e&&\"\"!==e&&void 0!==i&&null!==i&&\"\"!==i&&e==i}if(e)return qa(Os(t),n),Os(t).F();(Os(t)||n)&&(Ts(t,n),n&&(La(n),n.ca=t.G),t.a&&t.a.subscribe(t),Cs(t))}})},ou.ka=function(t){return fs(this.h,t)},ou.Tb=function(){Cs(this),this.ka(Os(this))},ou.Zb=function(){this.hb()},ou.$b=function(){this.hb()},ou.ac=function(t){var n=this;this.addAuthTokenListener(function(){t.next(Os(n))})},ou.bc=function(t){var n=this;Rs(this,function(){t.next(Os(n))})},ou.ic=function(t,n,e){var i=this;return this.W&&au.Promise.resolve().then(function(){u(t)?t(Os(i)):u(t.next)&&t.next(Os(i))}),this.Kb(t,n,e)},ou.hc=function(t,n,e){var i=this;return this.W&&au.Promise.resolve().then(function(){i.R=i.getUid(),u(t)?t(Os(i)):u(t.next)&&t.next(Os(i))}),this.Lb(t,n,e)},ou.Vb=function(t){var n=this;return _s(this,this.i.then(function(){return Os(n)?Os(n).F(t).then(function(t){return{accessToken:t}}):null}))},ou.tc=function(t){return this.Eb(t).then(function(t){return t.user})},ou.Eb=function(t){var n=this;return this.i.then(function(){return Ns(n,jr(n.c,rf,{token:t}))}).then(function(t){var e=t.user;return Ka(e,\"isAnonymous\",!1),n.ka(e),t})},ou.Fb=function(t,n){var e=this;return this.i.then(function(){return Ns(e,jr(e.c,of,{email:t,password:n}))})},ou.uc=function(t,n){return this.Fb(t,n).then(function(t){return t.user})},ou.Ob=function(t,n){return this.qb(t,n).then(function(t){return t.user})},ou.qb=function(t,n){var e=this;return this.i.then(function(){return Ns(e,jr(e.c,Fh,{email:t,password:n}))})},ou.sc=function(t){return this.fb(t).then(function(t){return t.user})},ou.fb=function(t){var n=this;return this.i.then(function(){return Ns(n,t.wa(n.c))})},ou.gb=function(){return this.Gb().then(function(t){return t.user})},ou.Gb=function(){var t=this;return this.i.then(function(){var n=Os(t);return n&&n.isAnonymous?ki({user:n,credential:null,additionalUserInfo:ki({providerId:null,isNewUser:!1}),operationType:\"signIn\"}):Ns(t,t.c.gb()).then(function(n){var e=n.user;return Ka(e,\"isAnonymous\",!0),t.ka(e),n})})},ou.getUid=function(){return Os(this)&&Os(this).uid||null},ou.Mb=function(t){this.addAuthTokenListener(t),0<++this.o&&Os(this)&&Pa(Os(this))},ou.qc=function(t){var n=this;Tu(this.m,function(e){e==t&&n.o--}),0>this.o&&(this.o=0),0==this.o&&Os(this)&&Ca(Os(this)),this.removeAuthTokenListener(t)},ou.addAuthTokenListener=function(t){var n=this;this.m.push(t),_s(this,this.i.then(function(){n.l||k(n.m,t)&&t(Ps(n))}))},ou.removeAuthTokenListener=function(t){N(this.m,function(n){return n==t})},ou.delete=function(){this.l=!0;for(var t=0;t<this.N.length;t++)this.N[t].cancel(\"app-deleted\");return this.N=[],this.h&&(t=this.h,So(t.b,t.a,this.ha)),this.a&&this.a.unsubscribe(this),au.Promise.resolve()},ou.Rb=function(t){return _s(this,Er(this.c,t))},ou.Fc=function(t){return this.Ia(t).then(function(t){return t.data.email})},ou.Ta=function(t,n){return _s(this,this.c.Ta(t,n).then(function(){}))},ou.Ia=function(t){return _s(this,this.c.Ia(t).then(function(t){return new Oi(t)}))},ou.Sa=function(t){return _s(this,this.c.Sa(t).then(function(){}))},ou.cb=function(t,n){var e=this;return _s(this,nt().then(function(){return void 0===n||D(n)?{}:_i(new Ri(n))}).then(function(n){return e.c.cb(t,n)}).then(function(){}))},ou.vc=function(t,n){return _s(this,ha(this,t,n,l(this.fb,this)))};var Of=\"First Second Third Fourth Fifth Sixth Seventh Eighth Ninth\".split(\" \"),Pf=\"callback\",Cf=\"expired-callback\",Rf=\"sitekey\",_f=\"size\";ou=Ws.prototype,ou.xa=function(){var t=this;return this.c?this.c:this.c=Js(this,nt().then(function(){if(ui())return Ye();throw new Pi(\"operation-not-supported-in-this-environment\",\"RecaptchaVerifier is only supported in a browser HTTP/HTTPS environment.\")}).then(function(){return Zs(Qs(),t.o())}).then(function(){return jr(t.u,zh,{})}).then(function(n){t.a[Rf]=n.recaptchaSiteKey}).s(function(n){throw t.c=null,n}))},ou.render=function(){Ys(this);var t=this;return Js(this,this.xa().then(function(){if(null===t.b){var n=t.l;if(!t.h){var e=Dt(n);n=xt(\"DIV\"),e.appendChild(n)}t.b=grecaptcha.render(n,t.a)}return t.b}))},ou.verify=function(){Ys(this);var t=this;return Js(this,this.render().then(function(n){return new Z(function(e){var i=grecaptcha.getResponse(n);if(i)e(i);else{var r=function(n){n&&(zs(t,r),e(n))};t.i.push(r),t.h&&grecaptcha.execute(t.b)}})}))},ou.reset=function(){Ys(this),null!==this.b&&grecaptcha.reset(this.b)},ou.clear=function(){Ys(this),this.m=!0,Qs().b--;for(var t=0;t<this.g.length;t++)this.g[t].cancel(\"RecaptchaVerifier instance has been destroyed.\");if(!this.h){t=Dt(this.l);for(var n;n=t.firstChild;)t.removeChild(n)}};var Df=It(\"https://www.google.com/recaptcha/api.js?onload=%{onload}&render=explicit&hl=%{hl}\"),Lf=null;p(tu,Ws),nu(vs.prototype,{Sa:{name:\"applyActionCode\",j:[Ls(\"code\")]},Ia:{name:\"checkActionCode\",j:[Ls(\"code\")]},Ta:{name:\"confirmPasswordReset\",j:[Ls(\"code\"),Ls(\"newPassword\")]},Ob:{name:\"createUserWithEmailAndPassword\",j:[Ls(\"email\"),Ls(\"password\")]},qb:{name:\"createUserAndRetrieveDataWithEmailAndPassword\",j:[Ls(\"email\"),Ls(\"password\")]},Rb:{name:\"fetchProvidersForEmail\",j:[Ls(\"email\")]},aa:{name:\"getRedirectResult\",j:[]},hc:{name:\"onAuthStateChanged\",j:[Hs(Us(),js(),\"nextOrObserver\"),js(\"opt_error\",!0),js(\"opt_completed\",!0)]},ic:{name:\"onIdTokenChanged\",j:[Hs(Us(),js(),\"nextOrObserver\"),js(\"opt_error\",!0),js(\"opt_completed\",!0)]},cb:{name:\"sendPasswordResetEmail\",j:[Ls(\"email\"),Hs(Us(\"opt_actionCodeSettings\",!0),Ms(null,!0),\"opt_actionCodeSettings\",!0)]},eb:{name:\"setPersistence\",j:[Ls(\"persistence\")]},fb:{name:\"signInAndRetrieveDataWithCredential\",j:[qs()]},gb:{name:\"signInAnonymously\",j:[]},Gb:{name:\"signInAnonymouslyAndRetrieveData\",j:[]},sc:{name:\"signInWithCredential\",j:[qs()]},tc:{name:\"signInWithCustomToken\",j:[Ls(\"token\")]},Eb:{name:\"signInAndRetrieveDataWithCustomToken\",j:[Ls(\"token\")]},uc:{name:\"signInWithEmailAndPassword\",j:[Ls(\"email\"),Ls(\"password\")]},Fb:{name:\"signInAndRetrieveDataWithEmailAndPassword\",j:[Ls(\"email\"),Ls(\"password\")]},vc:{name:\"signInWithPhoneNumber\",j:[Ls(\"phoneNumber\"),Bs()]},wc:{name:\"signInWithPopup\",j:[Xs()]},xc:{name:\"signInWithRedirect\",j:[Xs()]},hb:{name:\"signOut\",j:[]},toJSON:{name:\"toJSON\",j:[Ls(null,!0)]},Ec:{name:\"useDeviceLanguage\",j:[]},Fc:{name:\"verifyPasswordResetCode\",j:[Ls(\"code\")]}}),function(t,n){for(var e in n){var i=n[e].name;if(i!==e){var r=n[e].Nb;Object.defineProperty(t,i,{get:function(){return this[e]},set:function(t){Ds(i,[r],[t],!0),this[e]=t},enumerable:!0})}}}(vs.prototype,{lc:{name:\"languageCode\",Nb:Hs(Ls(),Ms(),\"languageCode\")}}),vs.Persistence=yf,vs.Persistence.LOCAL=\"local\",vs.Persistence.SESSION=\"session\",vs.Persistence.NONE=\"none\",nu(Aa.prototype,{delete:{name:\"delete\",j:[]},F:{name:\"getIdToken\",j:[xs()]},getToken:{name:\"getToken\",j:[xs()]},Xa:{name:\"linkAndRetrieveDataWithCredential\",j:[qs()]},cc:{name:\"linkWithCredential\",j:[qs()]},dc:{name:\"linkWithPhoneNumber\",j:[Ls(\"phoneNumber\"),Bs()]},ec:{name:\"linkWithPopup\",j:[Xs()]},fc:{name:\"linkWithRedirect\",j:[Xs()]},Za:{name:\"reauthenticateAndRetrieveDataWithCredential\",j:[qs()]},mc:{name:\"reauthenticateWithCredential\",j:[qs()]},nc:{name:\"reauthenticateWithPhoneNumber\",j:[Ls(\"phoneNumber\"),Bs()]},oc:{name:\"reauthenticateWithPopup\",j:[Xs()]},pc:{name:\"reauthenticateWithRedirect\",j:[Xs()]},reload:{name:\"reload\",j:[]},bb:{name:\"sendEmailVerification\",j:[Hs(Us(\"opt_actionCodeSettings\",!0),Ms(null,!0),\"opt_actionCodeSettings\",!0)]},toJSON:{name:\"toJSON\",j:[Ls(null,!0)]},Cc:{name:\"unlink\",j:[Ls(\"provider\")]},kb:{name:\"updateEmail\",j:[Ls(\"email\")]},lb:{name:\"updatePassword\",j:[Ls(\"password\")]},Dc:{name:\"updatePhoneNumber\",j:[qs(\"phone\")]},mb:{name:\"updateProfile\",j:[Us(\"profile\")]}}),nu(Z.prototype,{s:{name:\"catch\"},then:{name:\"then\"}}),nu(ca.prototype,{confirm:{name:\"confirm\",j:[Ls(\"verificationCode\")]}}),eu(ir,\"credential\",function(t,n){return new er(t,n)},[Ls(\"email\"),Ls(\"password\")]),nu(zi.prototype,{sa:{name:\"addScope\",j:[Ls(\"scope\")]},Ba:{name:\"setCustomParameters\",j:[Us(\"customOAuthParameters\")]}}),eu(zi,\"credential\",Ji,[Hs(Ls(),Us(),\"token\")]),nu(Yi.prototype,{sa:{name:\"addScope\",j:[Ls(\"scope\")]},Ba:{name:\"setCustomParameters\",j:[Us(\"customOAuthParameters\")]}}),eu(Yi,\"credential\",$i,[Hs(Ls(),Us(),\"token\")]),nu(Zi.prototype,{sa:{name:\"addScope\",j:[Ls(\"scope\")]},Ba:{name:\"setCustomParameters\",j:[Us(\"customOAuthParameters\")]}}),eu(Zi,\"credential\",Qi,[Hs(Ls(),Hs(Us(),Ms()),\"idToken\"),Hs(Ls(),Ms(),\"accessToken\",!0)]),nu(tr.prototype,{Ba:{name:\"setCustomParameters\",j:[Us(\"customOAuthParameters\")]}}),eu(tr,\"credential\",nr,[Hs(Ls(),Us(),\"token\"),Ls(\"secret\",!0)]),nu(Gi.prototype,{sa:{name:\"addScope\",j:[Ls(\"scope\")]},credential:{name:\"credential\",j:[Hs(Ls(),Ms(),\"idToken\",!0),Hs(Ls(),Ms(),\"accessToken\",!0)]},Ba:{name:\"setCustomParameters\",j:[Us(\"customOAuthParameters\")]}}),eu(ar,\"credential\",sr,[Ls(\"verificationId\"),Ls(\"verificationCode\")]),nu(ar.prototype,{Qa:{name:\"verifyPhoneNumber\",j:[Ls(\"phoneNumber\"),Bs()]}}),nu(Pi.prototype,{toJSON:{name:\"toJSON\",j:[Ls(null,!0)]}}),nu(dr.prototype,{toJSON:{name:\"toJSON\",j:[Ls(null,!0)]}}),nu(lr.prototype,{toJSON:{name:\"toJSON\",j:[Ls(null,!0)]}}),nu(tu.prototype,{clear:{name:\"clear\",j:[]},render:{name:\"render\",j:[]},verify:{name:\"verify\",j:[]}}),function(){if(void 0===au||!au.INTERNAL||!au.INTERNAL.registerService)throw Error(\"Cannot find the firebase namespace; be sure to include firebase-app.js before this library.\");var t={Auth:vs,Error:Pi};eu(t,\"EmailAuthProvider\",ir,[]),eu(t,\"FacebookAuthProvider\",zi,[]),eu(t,\"GithubAuthProvider\",Yi,[]),eu(t,\"GoogleAuthProvider\",Zi,[]),eu(t,\"TwitterAuthProvider\",tr,[]),eu(t,\"OAuthProvider\",Gi,[Ls(\"providerId\")]),eu(t,\"PhoneAuthProvider\",ar,[Fs()]),eu(t,\"RecaptchaVerifier\",tu,[Hs(Ls(),Vs(),\"recaptchaContainer\"),Us(\"recaptchaParameters\",!0),Ks()]),au.INTERNAL.registerService(\"auth\",function(t,n){return t=new vs(t),n({INTERNAL:{getUid:l(t.getUid,t),getToken:l(t.Vb,t),addAuthTokenListener:l(t.Mb,t),removeAuthTokenListener:l(t.qc,t)}}),t},t,function(t,n){if(\"create\"===t)try{n.auth()}catch(t){}}),au.INTERNAL.extendNamespace({User:Aa})}()}).call(void 0!==t?t:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})}).call(n,e(12))}},[76])}catch(t){throw Error(\"Cannot instantiate firebase-auth.js - be sure to load firebase-app.js first.\")}\n\n/*!\n * @license Firebase v4.9.0\n * Build: rev-a586a7f\n * Terms: https://firebase.google.com/terms/\n */\ntry{webpackJsonpFirebase([0],[,function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=n(0),o=n(0),a=n(0),s=n(0),u=n(0),l=n(13),h=n(0);t.LUIDGenerator=function(){var e=1;return function(){return e++}}(),t.sha1=function(e){var t=s.stringToByteArray(e),n=new a.Sha1;n.update(t);var r=n.digest();return o.base64.encodeByteArray(r)};var c=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var n=\"\",r=0;r<e.length;r++)Array.isArray(e[r])||e[r]&&\"object\"==typeof e[r]&&\"number\"==typeof e[r].length?n+=c.apply(null,e[r]):\"object\"==typeof e[r]?n+=u.stringify(e[r]):n+=e[r],n+=\" \";return n};t.logger=null;var p=!0;t.enableLogging=function(e,n){r.assert(!n||!0===e||!1===e,\"Can't turn on custom loggers persistently.\"),!0===e?(\"undefined\"!=typeof console&&(\"function\"==typeof console.log?t.logger=console.log.bind(console):\"object\"==typeof console.log&&(t.logger=function(e){console.log(e)})),n&&l.SessionStorage.set(\"logging_enabled\",!0)):\"function\"==typeof e?t.logger=e:(t.logger=null,l.SessionStorage.remove(\"logging_enabled\"))},t.log=function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];if(!0===p&&(p=!1,null===t.logger&&!0===l.SessionStorage.get(\"logging_enabled\")&&t.enableLogging(!0)),t.logger){var r=c.apply(null,e);t.logger(r)}},t.logWrapper=function(e){return function(){for(var n=[],r=0;r<arguments.length;r++)n[r]=arguments[r];t.log.apply(void 0,[e].concat(n))}},t.error=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];if(\"undefined\"!=typeof console){var n=\"FIREBASE INTERNAL ERROR: \"+c.apply(void 0,e);void 0!==console.error?console.error(n):console.log(n)}},t.fatal=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=c.apply(void 0,e);throw Error(\"FIREBASE FATAL ERROR: \"+n)},t.warn=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];if(\"undefined\"!=typeof console){var n=\"FIREBASE WARNING: \"+c.apply(void 0,e);void 0!==console.warn?console.warn(n):console.log(n)}},t.warnIfPageIsSecure=function(){\"undefined\"!=typeof window&&window.location&&window.location.protocol&&-1!==window.location.protocol.indexOf(\"https:\")&&t.warn(\"Insecure Firebase access from a secure page. Please use https in calls to new Firebase().\")},t.warnAboutUnsupportedMethod=function(e){t.warn(e+\" is unsupported and will likely change soon.  Please do not use.\")},t.isInvalidJSONNumber=function(e){return\"number\"==typeof e&&(e!=e||e==Number.POSITIVE_INFINITY||e==Number.NEGATIVE_INFINITY)},t.executeWhenDOMReady=function(e){if(h.isNodeSdk()||\"complete\"===document.readyState)e();else{var t=!1,n=function(){if(!document.body)return void setTimeout(n,Math.floor(10));t||(t=!0,e())};document.addEventListener?(document.addEventListener(\"DOMContentLoaded\",n,!1),window.addEventListener(\"load\",n,!1)):document.attachEvent&&(document.attachEvent(\"onreadystatechange\",function(){\"complete\"===document.readyState&&n()}),window.attachEvent(\"onload\",n))}},t.MIN_NAME=\"[MIN_NAME]\",t.MAX_NAME=\"[MAX_NAME]\",t.nameCompare=function(e,n){if(e===n)return 0;if(e===t.MIN_NAME||n===t.MAX_NAME)return-1;if(n===t.MIN_NAME||e===t.MAX_NAME)return 1;var r=t.tryParseInt(e),i=t.tryParseInt(n);return null!==r?null!==i?r-i==0?e.length-n.length:r-i:-1:null!==i?1:e<n?-1:1},t.stringCompare=function(e,t){return e===t?0:e<t?-1:1},t.requireKey=function(e,t){if(t&&e in t)return t[e];throw Error(\"Missing required key (\"+e+\") in object: \"+u.stringify(t))},t.ObjectToUniqueKey=function(e){if(\"object\"!=typeof e||null===e)return u.stringify(e);var n=[];for(var r in e)n.push(r);n.sort();for(var i=\"{\",o=0;o<n.length;o++)0!==o&&(i+=\",\"),i+=u.stringify(n[o]),i+=\":\",i+=t.ObjectToUniqueKey(e[n[o]]);return i+=\"}\"},t.splitStringBySize=function(e,t){var n=e.length;if(n<=t)return[e];for(var r=[],i=0;i<n;i+=t)i+t>n?r.push(e.substring(i,n)):r.push(e.substring(i,i+t));return r},t.each=function(e,t){if(Array.isArray(e))for(var n=0;n<e.length;++n)t(n,e[n]);else i.forEach(e,function(e,n){return t(n,e)})},t.bindCallback=function(e,t){return t?e.bind(t):e},t.doubleToIEEE754String=function(e){r.assert(!t.isInvalidJSONNumber(e),\"Invalid JSON number\");var n,i,o,a,s,u,l;for(0===e?(i=0,o=0,n=1/e==-1/0?1:0):(n=e<0,e=Math.abs(e),e>=Math.pow(2,-1022)?(a=Math.min(Math.floor(Math.log(e)/Math.LN2),1023),i=a+1023,o=Math.round(e*Math.pow(2,52-a)-Math.pow(2,52))):(i=0,o=Math.round(e/Math.pow(2,-1074)))),u=[],s=52;s;s-=1)u.push(o%2?1:0),o=Math.floor(o/2);for(s=11;s;s-=1)u.push(i%2?1:0),i=Math.floor(i/2);u.push(n?1:0),u.reverse(),l=u.join(\"\");var h=\"\";for(s=0;s<64;s+=8){var c=parseInt(l.substr(s,8),2).toString(16);1===c.length&&(c=\"0\"+c),h+=c}return h.toLowerCase()},t.isChromeExtensionContentScript=function(){return!(\"object\"!=typeof window||!window.chrome||!window.chrome.extension||/^chrome/.test(window.location.href))},t.isWindowsStoreApp=function(){return\"object\"==typeof Windows&&\"object\"==typeof Windows.UI},t.errorForServerCode=function(e,t){var n=\"Unknown Error\";\"too_big\"===e?n=\"The data requested exceeds the maximum size that can be accessed with a single request.\":\"permission_denied\"==e?n=\"Client doesn't have permission to access the desired data.\":\"unavailable\"==e&&(n=\"The service is unavailable\");var r=Error(e+\" at \"+t.path+\": \"+n);return r.code=e.toUpperCase(),r},t.e=RegExp(\"^-?\\\\d{1,10}$\"),t.tryParseInt=function(e){if(t.e.test(e)){var n=+e;if(n>=-2147483648&&n<=2147483647)return n}return null},t.exceptionGuard=function(e){try{e()}catch(e){setTimeout(function(){var n=e.stack||\"\";throw t.warn(\"Exception was thrown by user callback.\",n),e},Math.floor(0))}},t.callUserCallback=function(e){for(var n=[],r=1;r<arguments.length;r++)n[r-1]=arguments[r];\"function\"==typeof e&&t.exceptionGuard(function(){e.apply(void 0,n)})},t.beingCrawled=function(){return(\"object\"==typeof window&&window.navigator&&window.navigator.userAgent||\"\").search(/googlebot|google webmaster tools|bingbot|yahoo! slurp|baiduspider|yandexbot|duckduckbot/i)>=0},t.exportPropGetter=function(e,t,n){Object.defineProperty(e,t,{get:n})},t.setTimeoutNonBlocking=function(e,t){var n=setTimeout(e,t);return\"object\"==typeof n&&n.unref&&n.unref(),n}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(1),i=n(0),o=function(){function e(e,t){if(void 0===t){this.n=e.split(\"/\");for(var n=0,r=0;r<this.n.length;r++)this.n[r].length>0&&(this.n[n]=this.n[r],n++);this.n.length=n,this.i=0}else this.n=e,this.i=t}return Object.defineProperty(e,\"Empty\",{get:function(){return new e(\"\")},enumerable:!0,configurable:!0}),e.prototype.getFront=function(){return this.i>=this.n.length?null:this.n[this.i]},e.prototype.getLength=function(){return this.n.length-this.i},e.prototype.popFront=function(){var t=this.i;return t<this.n.length&&t++,new e(this.n,t)},e.prototype.getBack=function(){return this.i<this.n.length?this.n[this.n.length-1]:null},e.prototype.toString=function(){for(var e=\"\",t=this.i;t<this.n.length;t++)\"\"!==this.n[t]&&(e+=\"/\"+this.n[t]);return e||\"/\"},e.prototype.toUrlEncodedString=function(){for(var e=\"\",t=this.i;t<this.n.length;t++)\"\"!==this.n[t]&&(e+=\"/\"+encodeURIComponent(this.n[t]+\"\"));return e||\"/\"},e.prototype.slice=function(e){return void 0===e&&(e=0),this.n.slice(this.i+e)},e.prototype.parent=function(){if(this.i>=this.n.length)return null;for(var t=[],n=this.i;n<this.n.length-1;n++)t.push(this.n[n]);return new e(t,0)},e.prototype.child=function(t){for(var n=[],r=this.i;r<this.n.length;r++)n.push(this.n[r]);if(t instanceof e)for(var r=t.i;r<t.n.length;r++)n.push(t.n[r]);else for(var i=t.split(\"/\"),r=0;r<i.length;r++)i[r].length>0&&n.push(i[r]);return new e(n,0)},e.prototype.isEmpty=function(){return this.i>=this.n.length},e.relativePath=function(t,n){var r=t.getFront(),i=n.getFront();if(null===r)return n;if(r===i)return e.relativePath(t.popFront(),n.popFront());throw Error(\"INTERNAL ERROR: innerPath (\"+n+\") is not within outerPath (\"+t+\")\")},e.comparePaths=function(e,t){for(var n=e.slice(),i=t.slice(),o=0;o<n.length&&o<i.length;o++){var a=r.nameCompare(n[o],i[o]);if(0!==a)return a}return n.length===i.length?0:n.length<i.length?-1:1},e.prototype.equals=function(e){if(this.getLength()!==e.getLength())return!1;for(var t=this.i,n=e.i;t<=this.n.length;t++,n++)if(this.n[t]!==e.n[n])return!1;return!0},e.prototype.contains=function(e){var t=this.i,n=e.i;if(this.getLength()>e.getLength())return!1;for(;t<this.n.length;){if(this.n[t]!==e.n[n])return!1;++t,++n}return!0},e}();t.Path=o;var a=function(){function e(e,t){this.o=t,this.u=e.slice(),this.l=Math.max(1,this.u.length);for(var n=0;n<this.u.length;n++)this.l+=i.stringLength(this.u[n]);this.f()}return Object.defineProperty(e,\"MAX_PATH_DEPTH\",{get:function(){return 32},enumerable:!0,configurable:!0}),Object.defineProperty(e,\"MAX_PATH_LENGTH_BYTES\",{get:function(){return 768},enumerable:!0,configurable:!0}),e.prototype.push=function(e){this.u.length>0&&(this.l+=1),this.u.push(e),this.l+=i.stringLength(e),this.f()},e.prototype.pop=function(){var e=this.u.pop();this.l-=i.stringLength(e),this.u.length>0&&(this.l-=1)},e.prototype.f=function(){if(this.l>e.MAX_PATH_LENGTH_BYTES)throw Error(this.o+\"has a key path longer than \"+e.MAX_PATH_LENGTH_BYTES+\" bytes (\"+this.l+\").\");if(this.u.length>e.MAX_PATH_DEPTH)throw Error(this.o+\"path specified exceeds the maximum depth that can be written (\"+e.MAX_PATH_DEPTH+\") or object contains a cycle \"+this.toErrorString())},e.prototype.toErrorString=function(){return 0==this.u.length?\"\":\"in property '\"+this.u.join(\".\")+\"'\"},e}();t.ValidationPath=a},function(e,t,n){\"use strict\";function r(e){a=e}function i(e){s=e}var o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,\"__esModule\",{value:!0});var a,s,u=n(15),l=n(1),h=n(5),c=n(16);t.setNodeFromJSON=r,t.setMaxNode=i;var p=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.compare=function(e,t){var n=e.node.getPriority(),r=t.node.getPriority(),i=n.compareTo(r);return 0===i?l.nameCompare(e.name,t.name):i},t.prototype.isDefinedOn=function(e){return!e.getPriority().isEmpty()},t.prototype.indexedValueChanged=function(e,t){return!e.getPriority().equals(t.getPriority())},t.prototype.minPost=function(){return h.NamedNode.MIN},t.prototype.maxPost=function(){return new h.NamedNode(l.MAX_NAME,new c.LeafNode(\"[PRIORITY-POST]\",s))},t.prototype.makePost=function(e,t){var n=a(e);return new h.NamedNode(t,new c.LeafNode(\"[PRIORITY-POST]\",n))},t.prototype.toString=function(){return\".priority\"},t}(u.Index);t.PriorityIndex=p,t.PRIORITY_INDEX=new p},function(e,t,n){\"use strict\";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,\"__esModule\",{value:!0});var i,o=n(0),a=n(1),s=n(17),u=n(5),l=n(37),h=n(3),c=n(10),p=n(39),d=n(16),f=n(41),_=function(){function e(e,t,n){this._=e,this.y=t,this.g=n,this.m=null,this.y&&l.validatePriorityNode(this.y),this._.isEmpty()&&o.assert(!this.y||this.y.isEmpty(),\"An empty node cannot have a priority\")}return Object.defineProperty(e,\"EMPTY_NODE\",{get:function(){return i||(i=new e(new s.SortedMap(f.NAME_COMPARATOR),null,p.IndexMap.Default))},enumerable:!0,configurable:!0}),e.prototype.isLeafNode=function(){return!1},e.prototype.getPriority=function(){return this.y||i},e.prototype.updatePriority=function(t){return this._.isEmpty()?this:new e(this._,t,this.g)},e.prototype.getImmediateChild=function(e){if(\".priority\"===e)return this.getPriority();var t=this._.get(e);return null===t?i:t},e.prototype.getChild=function(e){var t=e.getFront();return null===t?this:this.getImmediateChild(t).getChild(e.popFront())},e.prototype.hasChild=function(e){return null!==this._.get(e)},e.prototype.updateImmediateChild=function(t,n){if(o.assert(n,\"We should always be passing snapshot nodes\"),\".priority\"===t)return this.updatePriority(n);var r=new u.NamedNode(t,n),a=void 0,s=void 0,l=void 0;return n.isEmpty()?(a=this._.remove(t),s=this.g.removeFromIndexes(r,this._)):(a=this._.insert(t,n),s=this.g.addToIndexes(r,this._)),l=a.isEmpty()?i:this.y,new e(a,l,s)},e.prototype.updateChild=function(e,t){var n=e.getFront();if(null===n)return t;o.assert(\".priority\"!==e.getFront()||1===e.getLength(),\".priority must be the last token in a path\");var r=this.getImmediateChild(n).updateChild(e.popFront(),t);return this.updateImmediateChild(n,r)},e.prototype.isEmpty=function(){return this._.isEmpty()},e.prototype.numChildren=function(){return this._.count()},e.prototype.val=function(t){if(this.isEmpty())return null;var n={},r=0,i=0,o=!0;if(this.forEachChild(h.PRIORITY_INDEX,function(a,s){n[a]=s.val(t),r++,o&&e.e.test(a)?i=Math.max(i,+a):o=!1}),!t&&o&&i<2*r){var a=[];for(var s in n)a[s]=n[s];return a}return t&&!this.getPriority().isEmpty()&&(n[\".priority\"]=this.getPriority().val()),n},e.prototype.hash=function(){if(null===this.m){var e=\"\";this.getPriority().isEmpty()||(e+=\"priority:\"+l.priorityHashText(this.getPriority().val())+\":\"),this.forEachChild(h.PRIORITY_INDEX,function(t,n){var r=n.hash();\"\"!==r&&(e+=\":\"+t+\":\"+r)}),this.m=\"\"===e?\"\":a.sha1(e)}return this.m},e.prototype.getPredecessorChildName=function(e,t,n){var r=this.C(n);if(r){var i=r.getPredecessorKey(new u.NamedNode(e,t));return i?i.name:null}return this._.getPredecessorKey(e)},e.prototype.getFirstChildName=function(e){var t=this.C(e);if(t){var n=t.minKey();return n&&n.name}return this._.minKey()},e.prototype.getFirstChild=function(e){var t=this.getFirstChildName(e);return t?new u.NamedNode(t,this._.get(t)):null},e.prototype.getLastChildName=function(e){var t=this.C(e);if(t){var n=t.maxKey();return n&&n.name}return this._.maxKey()},e.prototype.getLastChild=function(e){var t=this.getLastChildName(e);return t?new u.NamedNode(t,this._.get(t)):null},e.prototype.forEachChild=function(e,t){var n=this.C(e);return n?n.inorderTraversal(function(e){return t(e.name,e.node)}):this._.inorderTraversal(t)},e.prototype.getIterator=function(e){return this.getIteratorFrom(e.minPost(),e)},e.prototype.getIteratorFrom=function(e,t){var n=this.C(t);if(n)return n.getIteratorFrom(e,function(e){return e});for(var r=this._.getIteratorFrom(e.name,u.NamedNode.Wrap),i=r.peek();null!=i&&t.compare(i,e)<0;)r.getNext(),i=r.peek();return r},e.prototype.getReverseIterator=function(e){return this.getReverseIteratorFrom(e.maxPost(),e)},e.prototype.getReverseIteratorFrom=function(e,t){var n=this.C(t);if(n)return n.getReverseIteratorFrom(e,function(e){return e});for(var r=this._.getReverseIteratorFrom(e.name,u.NamedNode.Wrap),i=r.peek();null!=i&&t.compare(i,e)>0;)r.getNext(),i=r.peek();return r},e.prototype.compareTo=function(e){return this.isEmpty()?e.isEmpty()?0:-1:e.isLeafNode()||e.isEmpty()?1:e===t.MAX_NODE?-1:0},e.prototype.withIndex=function(t){if(t===c.KEY_INDEX||this.g.hasIndex(t))return this;var n=this.g.addIndex(t,this._);return new e(this._,this.y,n)},e.prototype.isIndexed=function(e){return e===c.KEY_INDEX||this.g.hasIndex(e)},e.prototype.equals=function(e){if(e===this)return!0;if(e.isLeafNode())return!1;var t=e;if(this.getPriority().equals(t.getPriority())){if(this._.count()===t._.count()){for(var n=this.getIterator(h.PRIORITY_INDEX),r=t.getIterator(h.PRIORITY_INDEX),i=n.getNext(),o=r.getNext();i&&o;){if(i.name!==o.name||!i.node.equals(o.node))return!1;i=n.getNext(),o=r.getNext()}return null===i&&null===o}return!1}return!1},e.prototype.C=function(e){return e===c.KEY_INDEX?null:this.g.get(\"\"+e)},e.e=/^(0|[1-9]\\d*)$/,e}();t.ChildrenNode=_;var y=function(e){function t(){return e.call(this,new s.SortedMap(f.NAME_COMPARATOR),_.EMPTY_NODE,p.IndexMap.Default)||this}return r(t,e),t.prototype.compareTo=function(e){return e===this?0:1},t.prototype.equals=function(e){return e===this},t.prototype.getPriority=function(){return this},t.prototype.getImmediateChild=function(e){return _.EMPTY_NODE},t.prototype.isEmpty=function(){return!1},t}(_);t.MaxNode=y,t.MAX_NODE=new y,Object.defineProperties(u.NamedNode,{MIN:{value:new u.NamedNode(a.MIN_NAME,_.EMPTY_NODE)},MAX:{value:new u.NamedNode(a.MAX_NAME,t.MAX_NODE)}}),c.KeyIndex.__EMPTY_NODE=_.EMPTY_NODE,d.LeafNode.__childrenNodeConstructor=_,l.setMaxNode(t.MAX_NODE),h.setMaxNode(t.MAX_NODE)},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(e,t){this.name=e,this.node=t}return e.Wrap=function(t,n){return new e(t,n)},e}();t.NamedNode=r},,function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(2),i=n(0),o=n(1),a=n(0),s=n(0);t.N=/[\\[\\].#$\\/\\u0000-\\u001F\\u007F]/,t.P=/[\\[\\].#$\\u0000-\\u001F\\u007F]/,t.S=10485760,t.isValidKey=function(e){return\"string\"==typeof e&&0!==e.length&&!t.N.test(e)},t.isValidPathString=function(e){return\"string\"==typeof e&&0!==e.length&&!t.P.test(e)},t.isValidRootPathString=function(e){return e&&(e=e.replace(/^\\/*\\.info(\\/|$)/,\"/\")),t.isValidPathString(e)},t.isValidPriority=function(e){return null===e||\"string\"==typeof e||\"number\"==typeof e&&!o.isInvalidJSONNumber(e)||e&&\"object\"==typeof e&&i.contains(e,\".sv\")},t.validateFirebaseDataArg=function(e,n,r,i,o){o&&void 0===r||t.validateFirebaseData(a.errorPrefix(e,n,o),r,i)},t.validateFirebaseData=function(e,n,a){var u=a instanceof r.Path?new r.ValidationPath(a,e):a;if(void 0===n)throw Error(e+\"contains undefined \"+u.toErrorString());if(\"function\"==typeof n)throw Error(e+\"contains a function \"+u.toErrorString()+\" with contents = \"+n);if(o.isInvalidJSONNumber(n))throw Error(e+\"contains \"+n+\" \"+u.toErrorString());if(\"string\"==typeof n&&n.length>t.S/3&&s.stringLength(n)>t.S)throw Error(e+\"contains a string greater than \"+t.S+\" utf8 bytes \"+u.toErrorString()+\" ('\"+n.substring(0,50)+\"...')\");if(n&&\"object\"==typeof n){var l=!1,h=!1;if(i.forEach(n,function(n,r){if(\".value\"===n)l=!0;else if(\".priority\"!==n&&\".sv\"!==n&&(h=!0,!t.isValidKey(n)))throw Error(e+\" contains an invalid key (\"+n+\") \"+u.toErrorString()+'.  Keys must be non-empty strings and can\\'t contain \".\", \"#\", \"$\", \"/\", \"[\", or \"]\"');u.push(n),t.validateFirebaseData(e,r,u),u.pop()}),l&&h)throw Error(e+' contains \".value\" child '+u.toErrorString()+\" in addition to actual children.\")}},t.validateFirebaseMergePaths=function(e,n){var i,o;for(i=0;i<n.length;i++){o=n[i];for(var a=o.slice(),s=0;s<a.length;s++)if(\".priority\"===a[s]&&s===a.length-1);else if(!t.isValidKey(a[s]))throw Error(e+\"contains an invalid key (\"+a[s]+\") in path \"+o+'. Keys must be non-empty strings and can\\'t contain \".\", \"#\", \"$\", \"/\", \"[\", or \"]\"')}n.sort(r.Path.comparePaths);var u=null;for(i=0;i<n.length;i++){if(o=n[i],null!==u&&u.contains(o))throw Error(e+\"contains a path \"+u+\" that is ancestor of another path \"+o);u=o}},t.validateFirebaseMergeDataArg=function(e,n,o,s,u){if(!u||void 0!==o){var l=a.errorPrefix(e,n,u);if(!o||\"object\"!=typeof o||Array.isArray(o))throw Error(l+\" must be an object containing the children to replace.\");var h=[];i.forEach(o,function(e,n){var i=new r.Path(e);if(t.validateFirebaseData(l,n,s.child(i)),\".priority\"===i.getBack()&&!t.isValidPriority(n))throw Error(l+\"contains an invalid value for '\"+i+\"', which must be a valid Firebase priority (a string, finite number, server value, or null).\");h.push(i)}),t.validateFirebaseMergePaths(l,h)}},t.validatePriority=function(e,n,r,i){if(!i||void 0!==r){if(o.isInvalidJSONNumber(r))throw Error(a.errorPrefix(e,n,i)+\"is \"+r+\", but must be a valid Firebase priority (a string, finite number, server value, or null).\");if(!t.isValidPriority(r))throw Error(a.errorPrefix(e,n,i)+\"must be a valid Firebase priority (a string, finite number, server value, or null).\")}},t.validateEventType=function(e,t,n,r){if(!r||void 0!==n)switch(n){case\"value\":case\"child_added\":case\"child_removed\":case\"child_changed\":case\"child_moved\":break;default:throw Error(a.errorPrefix(e,t,r)+'must be a valid event type = \"value\", \"child_added\", \"child_removed\", \"child_changed\", or \"child_moved\".')}},t.validateKey=function(e,n,r,i){if(!(i&&void 0===r||t.isValidKey(r)))throw Error(a.errorPrefix(e,n,i)+'was an invalid key = \"'+r+'\".  Firebase keys must be non-empty strings and can\\'t contain \".\", \"#\", \"$\", \"/\", \"[\", or \"]\").')},t.validatePathString=function(e,n,r,i){if(!(i&&void 0===r||t.isValidPathString(r)))throw Error(a.errorPrefix(e,n,i)+'was an invalid path = \"'+r+'\". Paths must be non-empty strings and can\\'t contain \".\", \"#\", \"$\", \"[\", or \"]\"')},t.validateRootPathString=function(e,n,r,i){r&&(r=r.replace(/^\\/*\\.info(\\/|$)/,\"/\")),t.validatePathString(e,n,r,i)},t.validateWritablePath=function(e,t){if(\".info\"===t.getFront())throw Error(e+\" failed = Can't modify data under /.info/\")},t.validateUrl=function(e,n,r){var i=\"\"+r.path;if(\"string\"!=typeof r.repoInfo.host||0===r.repoInfo.host.length||!t.isValidKey(r.repoInfo.namespace)||0!==i.length&&!t.isValidRootPathString(i))throw Error(a.errorPrefix(e,n,!1)+'must be a valid firebase URL and the path can\\'t contain \".\", \"#\", \"$\", \"[\", or \"]\".')},t.validateCredential=function(e,t,n,r){if((!r||void 0!==n)&&\"string\"!=typeof n)throw Error(a.errorPrefix(e,t,r)+\"must be a valid credential (a string).\")},t.validateBoolean=function(e,t,n,r){if((!r||void 0!==n)&&\"boolean\"!=typeof n)throw Error(a.errorPrefix(e,t,r)+\"must be a boolean.\")},t.validateString=function(e,t,n,r){if((!r||void 0!==n)&&\"string\"!=typeof n)throw Error(a.errorPrefix(e,t,r)+\"must be a valid string.\")},t.validateObject=function(e,t,n,r){if(!(r&&void 0===n||n&&\"object\"==typeof n&&null!==n))throw Error(a.errorPrefix(e,t,r)+\"must be a valid object.\")},t.validateObjectContainsKey=function(e,t,n,r,o,s){if(!n||\"object\"!=typeof n||!i.contains(n,r)){if(o)return;throw Error(a.errorPrefix(e,t,o)+'must contain the key \"'+r+'\"')}if(s){var u=i.safeGet(n,r);if(\"number\"===s&&\"number\"!=typeof u||\"string\"===s&&\"string\"!=typeof u||\"boolean\"===s&&\"boolean\"!=typeof u||\"function\"===s&&\"function\"!=typeof u||\"object\"===s&&\"object\"!=typeof u&&u)throw o?Error(a.errorPrefix(e,t,o)+'contains invalid value for key \"'+r+'\" (must be of type \"'+s+'\")'):Error(a.errorPrefix(e,t,o)+'must contain the key \"'+r+'\" with type \"'+s+'\"')}}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0);!function(e){e[e.OVERWRITE=0]=\"OVERWRITE\",e[e.MERGE=1]=\"MERGE\",e[e.ACK_USER_WRITE=2]=\"ACK_USER_WRITE\",e[e.LISTEN_COMPLETE=3]=\"LISTEN_COMPLETE\"}(t.OperationType||(t.OperationType={}));var i=function(){function e(e,t,n,i){this.fromUser=e,this.fromServer=t,this.queryId=n,this.tagged=i,r.assert(!i||t,\"Tagged queries must be from server.\")}return e.User=new e(!0,!1,null,!1),e.Server=new e(!1,!0,null,!1),e.forServerTaggedQuery=function(t){return new e(!1,!0,t,!0)},e}();t.OperationSource=i},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(e,t,n,r,i){this.type=e,this.snapshotNode=t,this.childName=n,this.oldSnap=r,this.prevName=i}return e.valueChange=function(t){return new e(e.VALUE,t)},e.childAddedChange=function(t,n){return new e(e.CHILD_ADDED,n,t)},e.childRemovedChange=function(t,n){return new e(e.CHILD_REMOVED,n,t)},e.childChangedChange=function(t,n,r){return new e(e.CHILD_CHANGED,n,t,r)},e.childMovedChange=function(t,n){return new e(e.CHILD_MOVED,n,t)},e.CHILD_ADDED=\"child_added\",e.CHILD_REMOVED=\"child_removed\",e.CHILD_CHANGED=\"child_changed\",e.CHILD_MOVED=\"child_moved\",e.VALUE=\"value\",e}();t.Change=r},function(e,t,n){\"use strict\";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,\"__esModule\",{value:!0});var i,o=n(15),a=n(5),s=n(1),u=n(0),l=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),Object.defineProperty(t,\"__EMPTY_NODE\",{get:function(){return i},set:function(e){i=e},enumerable:!0,configurable:!0}),t.prototype.compare=function(e,t){return s.nameCompare(e.name,t.name)},t.prototype.isDefinedOn=function(e){throw u.assertionError(\"KeyIndex.isDefinedOn not expected to be called.\")},t.prototype.indexedValueChanged=function(e,t){return!1},t.prototype.minPost=function(){return a.NamedNode.MIN},t.prototype.maxPost=function(){return new a.NamedNode(s.MAX_NAME,i)},t.prototype.makePost=function(e,t){return u.assert(\"string\"==typeof e,\"KeyIndex indexValue must always be a string.\"),new a.NamedNode(e,i)},t.prototype.toString=function(){return\".key\"},t}(o.Index);t.KeyIndex=l,t.KEY_INDEX=new l},function(e,t,n){\"use strict\";function r(e,t){if(void 0===t&&(t=null),null===e)return i.ChildrenNode.EMPTY_NODE;if(\"object\"==typeof e&&\".priority\"in e&&(t=e[\".priority\"]),u.assert(null===t||\"string\"==typeof t||\"number\"==typeof t||\"object\"==typeof t&&\".sv\"in t,\"Invalid priority type found: \"+typeof t),\"object\"==typeof e&&\".value\"in e&&null!==e[\".value\"]&&(e=e[\".value\"]),\"object\"!=typeof e||\".sv\"in e){var n=e;return new o.LeafNode(n,r(t))}if(e instanceof Array||!d){var f=i.ChildrenNode.EMPTY_NODE,_=e;return s.forEach(_,function(e,t){if(s.contains(_,e)&&\".\"!==e.substring(0,1)){var n=r(t);!n.isLeafNode()&&n.isEmpty()||(f=f.updateImmediateChild(e,n))}}),f.updatePriority(r(t))}var y=[],v=!1,g=e;if(s.forEach(g,function(e,t){if(\"string\"!=typeof e||\".\"!==e.substring(0,1)){var n=r(g[e]);n.isEmpty()||(v=v||!n.getPriority().isEmpty(),y.push(new a.NamedNode(e,n)))}}),0==y.length)return i.ChildrenNode.EMPTY_NODE;var m=l.buildChildSet(y,h.NAME_ONLY_COMPARATOR,function(e){return e.name},h.NAME_COMPARATOR);if(v){var C=l.buildChildSet(y,p.PRIORITY_INDEX.getCompare());return new i.ChildrenNode(m,r(t),new c.IndexMap({\".priority\":C},{\".priority\":p.PRIORITY_INDEX}))}return new i.ChildrenNode(m,r(t),c.IndexMap.Default)}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(4),o=n(16),a=n(5),s=n(0),u=n(0),l=n(40),h=n(41),c=n(39),p=n(3),d=!0;t.nodeFromJSON=r,p.setNodeFromJSON(r)},,function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(80),i=n(81),o=function(e){try{if(\"undefined\"!=typeof window&&void 0!==window[e]){var t=window[e];return t.setItem(\"firebase:sentinel\",\"cache\"),t.removeItem(\"firebase:sentinel\"),new r.DOMStorageWrapper(t)}}catch(e){}return new i.MemoryStorage};t.PersistentStorage=o(\"localStorage\"),t.SessionStorage=o(\"sessionStorage\")},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.PROTOCOL_VERSION=\"5\",t.VERSION_PARAM=\"v\",t.TRANSPORT_SESSION_PARAM=\"s\",t.REFERER_PARAM=\"r\",t.FORGE_REF=\"f\",t.FORGE_DOMAIN=\"firebaseio.com\",t.LAST_SESSION_PARAM=\"ls\",t.WEBSOCKET=\"websocket\",t.LONG_POLLING=\"long_polling\"},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(5),i=n(1),o=function(){function e(){}return e.prototype.getCompare=function(){return this.compare.bind(this)},e.prototype.indexedValueChanged=function(e,t){var n=new r.NamedNode(i.MIN_NAME,e),o=new r.NamedNode(i.MIN_NAME,t);return 0!==this.compare(n,o)},e.prototype.minPost=function(){return r.NamedNode.MIN},e}();t.Index=o},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r,i=n(0),o=n(1),a=n(37),s=function(){function e(t,n){void 0===n&&(n=e.__childrenNodeConstructor.EMPTY_NODE),this.T=t,this.y=n,this.m=null,i.assert(void 0!==this.T&&null!==this.T,\"LeafNode shouldn't be created with null/undefined value.\"),a.validatePriorityNode(this.y)}return Object.defineProperty(e,\"__childrenNodeConstructor\",{get:function(){return r},set:function(e){r=e},enumerable:!0,configurable:!0}),e.prototype.isLeafNode=function(){return!0},e.prototype.getPriority=function(){return this.y},e.prototype.updatePriority=function(t){return new e(this.T,t)},e.prototype.getImmediateChild=function(t){return\".priority\"===t?this.y:e.__childrenNodeConstructor.EMPTY_NODE},e.prototype.getChild=function(t){return t.isEmpty()?this:\".priority\"===t.getFront()?this.y:e.__childrenNodeConstructor.EMPTY_NODE},e.prototype.hasChild=function(){return!1},e.prototype.getPredecessorChildName=function(e,t){return null},e.prototype.updateImmediateChild=function(t,n){return\".priority\"===t?this.updatePriority(n):n.isEmpty()&&\".priority\"!==t?this:e.__childrenNodeConstructor.EMPTY_NODE.updateImmediateChild(t,n).updatePriority(this.y)},e.prototype.updateChild=function(t,n){var r=t.getFront();return null===r?n:n.isEmpty()&&\".priority\"!==r?this:(i.assert(\".priority\"!==r||1===t.getLength(),\".priority must be the last token in a path\"),this.updateImmediateChild(r,e.__childrenNodeConstructor.EMPTY_NODE.updateChild(t.popFront(),n)))},e.prototype.isEmpty=function(){return!1},e.prototype.numChildren=function(){return 0},e.prototype.forEachChild=function(e,t){return!1},e.prototype.val=function(e){return e&&!this.getPriority().isEmpty()?{\".value\":this.getValue(),\".priority\":this.getPriority().val()}:this.getValue()},e.prototype.hash=function(){if(null===this.m){var e=\"\";this.y.isEmpty()||(e+=\"priority:\"+a.priorityHashText(this.y.val())+\":\");var t=typeof this.T;e+=t+\":\",e+=\"number\"===t?o.doubleToIEEE754String(this.T):this.T,this.m=o.sha1(e)}return this.m},e.prototype.getValue=function(){return this.T},e.prototype.compareTo=function(t){return t===e.__childrenNodeConstructor.EMPTY_NODE?1:t instanceof e.__childrenNodeConstructor?-1:(i.assert(t.isLeafNode(),\"Unknown node type\"),this.w(t))},e.prototype.w=function(t){var n=typeof t.T,r=typeof this.T,o=e.VALUE_TYPE_ORDER.indexOf(n),a=e.VALUE_TYPE_ORDER.indexOf(r);return i.assert(o>=0,\"Unknown leaf type: \"+n),i.assert(a>=0,\"Unknown leaf type: \"+r),o===a?\"object\"===r?0:this.T<t.T?-1:this.T===t.T?0:1:a-o},e.prototype.withIndex=function(){return this},e.prototype.isIndexed=function(){return!0},e.prototype.equals=function(e){if(e===this)return!0;if(e.isLeafNode()){var t=e;return this.T===t.T&&this.y.equals(t.y)}return!1},e.VALUE_TYPE_ORDER=[\"object\",\"boolean\",\"number\",\"string\"],e}();t.LeafNode=s},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(e,t,n,r,i){void 0===i&&(i=null),this.I=r,this.R=i,this.O=[];for(var o=1;!e.isEmpty();)if(e=e,o=t?n(e.key,t):1,r&&(o*=-1),o<0)e=this.I?e.left:e.right;else{if(0===o){this.O.push(e);break}this.O.push(e),e=this.I?e.right:e.left}}return e.prototype.getNext=function(){if(0===this.O.length)return null;var e,t=this.O.pop();if(e=this.R?this.R(t.key,t.value):{key:t.key,value:t.value},this.I)for(t=t.left;!t.isEmpty();)this.O.push(t),t=t.right;else for(t=t.right;!t.isEmpty();)this.O.push(t),t=t.left;return e},e.prototype.hasNext=function(){return this.O.length>0},e.prototype.peek=function(){if(0===this.O.length)return null;var e=this.O[this.O.length-1];return this.R?this.R(e.key,e.value):{key:e.key,value:e.value}},e}();t.SortedMapIterator=r;var i=function(){function e(t,n,r,i,o){this.key=t,this.value=n,this.color=null!=r?r:e.RED,this.left=null!=i?i:a.EMPTY_NODE,this.right=null!=o?o:a.EMPTY_NODE}return e.prototype.copy=function(t,n,r,i,o){return new e(null!=t?t:this.key,null!=n?n:this.value,null!=r?r:this.color,null!=i?i:this.left,null!=o?o:this.right)},e.prototype.count=function(){return this.left.count()+1+this.right.count()},e.prototype.isEmpty=function(){return!1},e.prototype.inorderTraversal=function(e){return this.left.inorderTraversal(e)||e(this.key,this.value)||this.right.inorderTraversal(e)},e.prototype.reverseTraversal=function(e){return this.right.reverseTraversal(e)||e(this.key,this.value)||this.left.reverseTraversal(e)},e.prototype.A=function(){return this.left.isEmpty()?this:this.left.A()},e.prototype.minKey=function(){return this.A().key},e.prototype.maxKey=function(){return this.right.isEmpty()?this.key:this.right.maxKey()},e.prototype.insert=function(e,t,n){var r,i;return i=this,r=n(e,i.key),i=r<0?i.copy(null,null,null,i.left.insert(e,t,n),null):0===r?i.copy(null,t,null,null,null):i.copy(null,null,null,null,i.right.insert(e,t,n)),i.D()},e.prototype.M=function(){if(this.left.isEmpty())return a.EMPTY_NODE;var e=this;return e.left.L()||e.left.left.L()||(e=e.F()),e=e.copy(null,null,null,e.left.M(),null),e.D()},e.prototype.remove=function(e,t){var n,r;if(n=this,t(e,n.key)<0)n.left.isEmpty()||n.left.L()||n.left.left.L()||(n=n.F()),n=n.copy(null,null,null,n.left.remove(e,t),null);else{if(n.left.L()&&(n=n.x()),n.right.isEmpty()||n.right.L()||n.right.left.L()||(n=n.k()),0===t(e,n.key)){if(n.right.isEmpty())return a.EMPTY_NODE;r=n.right.A(),n=n.copy(r.key,r.value,null,null,n.right.M())}n=n.copy(null,null,null,null,n.right.remove(e,t))}return n.D()},e.prototype.L=function(){return this.color},e.prototype.D=function(){var e=this;return e.right.L()&&!e.left.L()&&(e=e.W()),e.left.L()&&e.left.left.L()&&(e=e.x()),e.left.L()&&e.right.L()&&(e=e.j()),e},e.prototype.F=function(){var e=this.j();return e.right.left.L()&&(e=e.copy(null,null,null,null,e.right.x()),e=e.W(),e=e.j()),e},e.prototype.k=function(){var e=this.j();return e.left.left.L()&&(e=e.x(),e=e.j()),e},e.prototype.W=function(){var t=this.copy(null,null,e.RED,null,this.right.left);return this.right.copy(null,null,this.color,t,null)},e.prototype.x=function(){var t=this.copy(null,null,e.RED,this.left.right,null);return this.left.copy(null,null,this.color,null,t)},e.prototype.j=function(){var e=this.left.copy(null,null,!this.left.color,null,null),t=this.right.copy(null,null,!this.right.color,null,null);return this.copy(null,null,!this.color,e,t)},e.prototype.V=function(){var e=this.Q();return Math.pow(2,e)<=this.count()+1},e.prototype.Q=function(){var e;if(this.L()&&this.left.L())throw Error(\"Red node has red child(\"+this.key+\",\"+this.value+\")\");if(this.right.L())throw Error(\"Right child of (\"+this.key+\",\"+this.value+\") is red\");if((e=this.left.Q())!==this.right.Q())throw Error(\"Black depths differ\");return e+(this.L()?0:1)},e.RED=!0,e.BLACK=!1,e}();t.LLRBNode=i;var o=function(){function e(){}return e.prototype.copy=function(e,t,n,r,i){return this},e.prototype.insert=function(e,t,n){return new i(e,t,null)},e.prototype.remove=function(e,t){return this},e.prototype.count=function(){return 0},e.prototype.isEmpty=function(){return!0},e.prototype.inorderTraversal=function(e){return!1},e.prototype.reverseTraversal=function(e){return!1},e.prototype.minKey=function(){return null},e.prototype.maxKey=function(){return null},e.prototype.Q=function(){return 0},e.prototype.L=function(){return!1},e}();t.LLRBEmptyNode=o;var a=function(){function e(t,n){void 0===n&&(n=e.EMPTY_NODE),this.U=t,this.B=n}return e.prototype.insert=function(t,n){return new e(this.U,this.B.insert(t,n,this.U).copy(null,null,i.BLACK,null,null))},e.prototype.remove=function(t){return new e(this.U,this.B.remove(t,this.U).copy(null,null,i.BLACK,null,null))},e.prototype.get=function(e){for(var t,n=this.B;!n.isEmpty();){if(0===(t=this.U(e,n.key)))return n.value;t<0?n=n.left:t>0&&(n=n.right)}return null},e.prototype.getPredecessorKey=function(e){for(var t,n=this.B,r=null;!n.isEmpty();){if(0===(t=this.U(e,n.key))){if(n.left.isEmpty())return r?r.key:null;for(n=n.left;!n.right.isEmpty();)n=n.right;return n.key}t<0?n=n.left:t>0&&(r=n,n=n.right)}throw Error(\"Attempted to find predecessor key for a nonexistent key.  What gives?\")},e.prototype.isEmpty=function(){return this.B.isEmpty()},e.prototype.count=function(){return this.B.count()},e.prototype.minKey=function(){return this.B.minKey()},e.prototype.maxKey=function(){return this.B.maxKey()},e.prototype.inorderTraversal=function(e){return this.B.inorderTraversal(e)},e.prototype.reverseTraversal=function(e){return this.B.reverseTraversal(e)},e.prototype.getIterator=function(e){return new r(this.B,null,this.U,!1,e)},e.prototype.getIteratorFrom=function(e,t){return new r(this.B,e,this.U,!1,t)},e.prototype.getReverseIteratorFrom=function(e,t){return new r(this.B,e,this.U,!0,t)},e.prototype.getReverseIterator=function(e){return new r(this.B,null,this.U,!0,e)},e.EMPTY_NODE=new o,e}();t.SortedMap=a},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(43),i=n(11),o=n(2),a=n(44),s=n(86),u=n(97),l=n(0),h=n(1),c=n(0),p=n(98),d=n(25),f=n(100),_=n(49),y=n(101),v=n(50),g=n(106),m=n(32),C=function(){function e(e,t,n){var r=this;this.H=e,this.app=n,this.dataUpdateCount=0,this.G=null,this.K=new y.EventQueue,this.Y=1,this.X=null,this.z=new a.SparseSnapshotTree,this.J=null;var i=new p.AuthTokenProvider(n);if(this.$=d.StatsManager.getCollection(e),t||h.beingCrawled())this.Z=new g.ReadonlyRestClient(this.H,this.ee.bind(this),i),setTimeout(this.te.bind(this,!0),0);else{var o=n.options.databaseAuthVariableOverride;if(void 0!==o&&null!==o){if(\"object\"!=typeof o)throw Error(\"Only objects are supported for option databaseAuthVariableOverride\");try{l.stringify(o)}catch(e){throw Error(\"Invalid authOverride provided: \"+e)}}this.J=new v.PersistentConnection(this.H,this.ee.bind(this),this.te.bind(this),this.ne.bind(this),i,o),this.Z=this.J}i.addTokenChangeListener(function(e){r.Z.refreshAuthToken(e)}),this.re=d.StatsManager.getOrCreateReporter(e,function(){return new f.StatsReporter(r.$,r.Z)}),this.ie(),this.oe=new u.SnapshotHolder,this.ae=new s.SyncTree({startListening:function(e,t,n,i){var o=[],a=r.oe.getNode(e.path);return a.isEmpty()||(o=r.ae.applyServerOverwrite(e.path,a),setTimeout(function(){i(\"ok\")},0)),o},stopListening:function(){}}),this.se(\"connected\",!1),this.ue=new s.SyncTree({startListening:function(e,t,n,i){return r.Z.listen(e,n,t,function(t,n){var o=i(t,n);r.K.raiseEventsForChangedPath(e.path,o)}),[]},stopListening:function(e,t){r.Z.unlisten(e,t)}})}return e.prototype.toString=function(){return(this.H.secure?\"https://\":\"http://\")+this.H.host},e.prototype.name=function(){return this.H.namespace},e.prototype.serverTime=function(){var e=this.oe.getNode(new o.Path(\".info/serverTimeOffset\")),t=e.val()||0;return(new Date).getTime()+t},e.prototype.generateServerValues=function(){return r.generateWithValues({timestamp:this.serverTime()})},e.prototype.ee=function(e,t,n,r){this.dataUpdateCount++;var a=new o.Path(e);t=this.X?this.X(e,t):t;var s=[];if(r)if(n){var u=c.map(t,function(e){return i.nodeFromJSON(e)});s=this.ue.applyTaggedQueryMerge(a,u,r)}else{var l=i.nodeFromJSON(t);s=this.ue.applyTaggedQueryOverwrite(a,l,r)}else if(n){var h=c.map(t,function(e){return i.nodeFromJSON(e)});s=this.ue.applyServerMerge(a,h)}else{var p=i.nodeFromJSON(t);s=this.ue.applyServerOverwrite(a,p)}var d=a;s.length>0&&(d=this.le(a)),this.K.raiseEventsForChangedPath(d,s)},e.prototype.he=function(e){this.X=e},e.prototype.te=function(e){this.se(\"connected\",e),!1===e&&this.ce()},e.prototype.ne=function(e){var t=this;h.each(e,function(e,n){t.se(n,e)})},e.prototype.se=function(e,t){var n=new o.Path(\"/.info/\"+e),r=i.nodeFromJSON(t);this.oe.updateSnapshot(n,r);var a=this.ae.applyServerOverwrite(n,r);this.K.raiseEventsForChangedPath(n,a)},e.prototype.pe=function(){return this.Y++},e.prototype.setWithPriority=function(e,t,n,o){var a=this;this.de(\"set\",{path:\"\"+e,value:t,priority:n});var s=this.generateServerValues(),u=i.nodeFromJSON(t,n),l=r.resolveDeferredValueSnapshot(u,s),c=this.pe(),p=this.ue.applyUserOverwrite(e,l,c,!0);this.K.queueEvents(p),this.Z.put(\"\"+e,u.val(!0),function(t,n){var r=\"ok\"===t;r||h.warn(\"set at \"+e+\" failed: \"+t);var i=a.ue.ackUserWrite(c,!r);a.K.raiseEventsForChangedPath(e,i),a.callOnCompleteCallback(o,t,n)});var d=this.fe(e);this.le(d),this.K.raiseEventsForChangedPath(d,[])},e.prototype.update=function(e,t,n){var o=this;this.de(\"update\",{path:\"\"+e,value:t});var a=!0,s=this.generateServerValues(),u={};if(c.forEach(t,function(e,t){a=!1;var n=i.nodeFromJSON(t);u[e]=r.resolveDeferredValueSnapshot(n,s)}),a)h.log(\"update() called with empty data.  Don't do anything.\"),this.callOnCompleteCallback(n,\"ok\");else{var l=this.pe(),p=this.ue.applyUserMerge(e,u,l);this.K.queueEvents(p),this.Z.merge(\"\"+e,t,function(t,r){var i=\"ok\"===t;i||h.warn(\"update at \"+e+\" failed: \"+t);var a=o.ue.ackUserWrite(l,!i),s=a.length>0?o.le(e):e;o.K.raiseEventsForChangedPath(s,a),o.callOnCompleteCallback(n,t,r)}),c.forEach(t,function(t){var n=o.fe(e.child(t));o.le(n)}),this.K.raiseEventsForChangedPath(e,[])}},e.prototype.ce=function(){var e=this;this.de(\"onDisconnectEvents\");var t=this.generateServerValues(),n=r.resolveDeferredValueTree(this.z,t),i=[];n.forEachTree(o.Path.Empty,function(t,n){i=i.concat(e.ue.applyServerOverwrite(t,n));var r=e.fe(t);e.le(r)}),this.z=new a.SparseSnapshotTree,this.K.raiseEventsForChangedPath(o.Path.Empty,i)},e.prototype.onDisconnectCancel=function(e,t){var n=this;this.Z.onDisconnectCancel(\"\"+e,function(r,i){\"ok\"===r&&n.z.forget(e),n.callOnCompleteCallback(t,r,i)})},e.prototype.onDisconnectSet=function(e,t,n){var r=this,o=i.nodeFromJSON(t);this.Z.onDisconnectPut(\"\"+e,o.val(!0),function(t,i){\"ok\"===t&&r.z.remember(e,o),r.callOnCompleteCallback(n,t,i)})},e.prototype.onDisconnectSetWithPriority=function(e,t,n,r){var o=this,a=i.nodeFromJSON(t,n);this.Z.onDisconnectPut(\"\"+e,a.val(!0),function(t,n){\"ok\"===t&&o.z.remember(e,a),o.callOnCompleteCallback(r,t,n)})},e.prototype.onDisconnectUpdate=function(e,t,n){var r=this;if(c.isEmpty(t))return h.log(\"onDisconnect().update() called with empty data.  Don't do anything.\"),void this.callOnCompleteCallback(n,\"ok\");this.Z.onDisconnectMerge(\"\"+e,t,function(o,a){\"ok\"===o&&c.forEach(t,function(t,n){var o=i.nodeFromJSON(n);r.z.remember(e.child(t),o)}),r.callOnCompleteCallback(n,o,a)})},e.prototype.addEventCallbackForQuery=function(e,t){var n;n=\".info\"===e.path.getFront()?this.ae.addEventRegistration(e,t):this.ue.addEventRegistration(e,t),this.K.raiseEventsAtPath(e.path,n)},e.prototype.removeEventCallbackForQuery=function(e,t){var n;n=\".info\"===e.path.getFront()?this.ae.removeEventRegistration(e,t):this.ue.removeEventRegistration(e,t),this.K.raiseEventsAtPath(e.path,n)},e.prototype.interrupt=function(){this.J&&this.J.interrupt(\"repo_interrupt\")},e.prototype.resume=function(){this.J&&this.J.resume(\"repo_interrupt\")},e.prototype.stats=function(e){if(void 0===e&&(e=!1),\"undefined\"!=typeof console){var t;e?(this.G||(this.G=new _.StatsListener(this.$)),t=this.G.get()):t=this.$.get();var n=Object.keys(t).reduce(function(e,t){return Math.max(t.length,e)},0);c.forEach(t,function(e,t){for(var r=e.length;r<n+2;r++)e+=\" \";console.log(e+t)})}},e.prototype.statsIncrementCounter=function(e){this.$.incrementCounter(e),this.re.includeStat(e)},e.prototype.de=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=\"\";this.J&&(n=this.J.id+\":\"),h.log.apply(void 0,[n].concat(e))},e.prototype.callOnCompleteCallback=function(e,t,n){e&&h.exceptionGuard(function(){if(\"ok\"==t)e(null);else{var r=(t||\"error\").toUpperCase(),i=r;n&&(i+=\": \"+n);var o=Error(i);o.code=r,e(o)}})},Object.defineProperty(e.prototype,\"database\",{get:function(){return this.__database||(this.__database=new m.Database(this))},enumerable:!0,configurable:!0}),e}();t.Repo=C},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(e,t,n){this._e=e,this.ye=t,this.ve=n}return e.prototype.isFullyInitialized=function(){return this.ye},e.prototype.isFiltered=function(){return this.ve},e.prototype.isCompleteForPath=function(e){if(e.isEmpty())return this.isFullyInitialized()&&!this.ve;var t=e.getFront();return this.isCompleteForChild(t)},e.prototype.isCompleteForChild=function(e){return this.isFullyInitialized()&&!this.ve||this._e.hasChild(e)},e.prototype.getNode=function(){return this._e},e}();t.CacheNode=r},,function(e,t,n){\"use strict\";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(35),o=n(82),a=n(1),s=n(83),u=n(36),l=n(18),h=n(2),c=n(107),p=n(7),d=n(0),f=n(0),_=n(47),y=function(e){function t(t,n){if(!(t instanceof l.Repo))throw Error(\"new Reference() no longer supported - use app.database().\");return e.call(this,t,n,c.QueryParams.DEFAULT,!1)||this}return r(t,e),t.prototype.getKey=function(){return d.validateArgCount(\"Reference.key\",0,0,arguments.length),this.path.isEmpty()?null:this.path.getBack()},t.prototype.child=function(e){return d.validateArgCount(\"Reference.child\",1,1,arguments.length),\"number\"==typeof e?e+=\"\":e instanceof h.Path||(null===this.path.getFront()?p.validateRootPathString(\"Reference.child\",1,e,!1):p.validatePathString(\"Reference.child\",1,e,!1)),new t(this.repo,this.path.child(e))},t.prototype.getParent=function(){d.validateArgCount(\"Reference.parent\",0,0,arguments.length);var e=this.path.parent();return null===e?null:new t(this.repo,e)},t.prototype.getRoot=function(){d.validateArgCount(\"Reference.root\",0,0,arguments.length);for(var e=this;null!==e.getParent();)e=e.getParent();return e},t.prototype.databaseProp=function(){return this.repo.database},t.prototype.set=function(e,t){d.validateArgCount(\"Reference.set\",1,2,arguments.length),p.validateWritablePath(\"Reference.set\",this.path),p.validateFirebaseDataArg(\"Reference.set\",1,e,this.path,!1),d.validateCallback(\"Reference.set\",2,t,!0);var n=new f.Deferred;return this.repo.setWithPriority(this.path,e,null,n.wrapCallback(t)),n.promise},t.prototype.update=function(e,t){if(d.validateArgCount(\"Reference.update\",1,2,arguments.length),p.validateWritablePath(\"Reference.update\",this.path),Array.isArray(e)){for(var n={},r=0;r<e.length;++r)n[\"\"+r]=e[r];e=n,a.warn(\"Passing an Array to Firebase.update() is deprecated. Use set() if you want to overwrite the existing data, or an Object with integer keys if you really do want to only update some of the children.\")}p.validateFirebaseMergeDataArg(\"Reference.update\",1,e,this.path,!1),d.validateCallback(\"Reference.update\",2,t,!0);var i=new f.Deferred;return this.repo.update(this.path,e,i.wrapCallback(t)),i.promise},t.prototype.setWithPriority=function(e,t,n){if(d.validateArgCount(\"Reference.setWithPriority\",2,3,arguments.length),p.validateWritablePath(\"Reference.setWithPriority\",this.path),p.validateFirebaseDataArg(\"Reference.setWithPriority\",1,e,this.path,!1),p.validatePriority(\"Reference.setWithPriority\",2,t,!1),d.validateCallback(\"Reference.setWithPriority\",3,n,!0),\".length\"===this.getKey()||\".keys\"===this.getKey())throw\"Reference.setWithPriority failed: \"+this.getKey()+\" is a read-only object.\";var r=new f.Deferred;return this.repo.setWithPriority(this.path,e,t,r.wrapCallback(n)),r.promise},t.prototype.remove=function(e){return d.validateArgCount(\"Reference.remove\",0,1,arguments.length),p.validateWritablePath(\"Reference.remove\",this.path),d.validateCallback(\"Reference.remove\",1,e,!0),this.set(null,e)},t.prototype.transaction=function(e,t,n){if(d.validateArgCount(\"Reference.transaction\",1,3,arguments.length),p.validateWritablePath(\"Reference.transaction\",this.path),d.validateCallback(\"Reference.transaction\",1,e,!1),d.validateCallback(\"Reference.transaction\",2,t,!0),p.validateBoolean(\"Reference.transaction\",3,n,!0),\".length\"===this.getKey()||\".keys\"===this.getKey())throw\"Reference.transaction failed: \"+this.getKey()+\" is a read-only object.\";void 0===n&&(n=!0);var r=new f.Deferred;\"function\"==typeof t&&r.promise.catch(function(){});var i=function(e,n,i){e?r.reject(e):r.resolve(new o.TransactionResult(n,i)),\"function\"==typeof t&&t(e,n,i)};return this.repo.startTransaction(this.path,e,i,n),r.promise},t.prototype.setPriority=function(e,t){d.validateArgCount(\"Reference.setPriority\",1,2,arguments.length),p.validateWritablePath(\"Reference.setPriority\",this.path),p.validatePriority(\"Reference.setPriority\",1,e,!1),d.validateCallback(\"Reference.setPriority\",2,t,!0);var n=new f.Deferred;return this.repo.setWithPriority(this.path.child(\".priority\"),e,null,n.wrapCallback(t)),n.promise},t.prototype.push=function(e,t){d.validateArgCount(\"Reference.push\",0,2,arguments.length),p.validateWritablePath(\"Reference.push\",this.path),p.validateFirebaseDataArg(\"Reference.push\",1,e,this.path,!0),d.validateCallback(\"Reference.push\",2,t,!0);var n,r=this.repo.serverTime(),i=s.nextPushId(r),o=this.child(i),a=this.child(i);return n=null!=e?o.set(e,t).then(function(){return a}):Promise.resolve(a),o.then=n.then.bind(n),o.catch=n.then.bind(n,void 0),\"function\"==typeof t&&n.catch(function(){}),o},t.prototype.onDisconnect=function(){return p.validateWritablePath(\"Reference.onDisconnect\",this.path),new i.OnDisconnect(this.repo,this.path)},Object.defineProperty(t.prototype,\"database\",{get:function(){return this.databaseProp()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,\"key\",{get:function(){return this.getKey()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,\"parent\",{get:function(){return this.getParent()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,\"root\",{get:function(){return this.getRoot()},enumerable:!0,configurable:!0}),t}(u.Query);t.Reference=y,u.Query.__referenceConstructor=y,_.SyncPoint.__referenceConstructor=y},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=n(7),o=n(2),a=n(3),s=function(){function e(e,t,n){this._e=e,this.ge=t,this.me=n}return e.prototype.val=function(){return r.validateArgCount(\"DataSnapshot.val\",0,0,arguments.length),this._e.val()},e.prototype.exportVal=function(){return r.validateArgCount(\"DataSnapshot.exportVal\",0,0,arguments.length),this._e.val(!0)},e.prototype.toJSON=function(){return r.validateArgCount(\"DataSnapshot.toJSON\",0,1,arguments.length),this.exportVal()},e.prototype.exists=function(){return r.validateArgCount(\"DataSnapshot.exists\",0,0,arguments.length),!this._e.isEmpty()},e.prototype.child=function(t){r.validateArgCount(\"DataSnapshot.child\",0,1,arguments.length),t+=\"\",i.validatePathString(\"DataSnapshot.child\",1,t,!1);var n=new o.Path(t),s=this.ge.child(n);return new e(this._e.getChild(n),s,a.PRIORITY_INDEX)},e.prototype.hasChild=function(e){r.validateArgCount(\"DataSnapshot.hasChild\",1,1,arguments.length),i.validatePathString(\"DataSnapshot.hasChild\",1,e,!1);var t=new o.Path(e);return!this._e.getChild(t).isEmpty()},e.prototype.getPriority=function(){return r.validateArgCount(\"DataSnapshot.getPriority\",0,0,arguments.length),this._e.getPriority().val()},e.prototype.forEach=function(t){var n=this;return r.validateArgCount(\"DataSnapshot.forEach\",1,1,arguments.length),r.validateCallback(\"DataSnapshot.forEach\",1,t,!1),!this._e.isLeafNode()&&!!this._e.forEachChild(this.me,function(r,i){return t(new e(i,n.ge.child(r),a.PRIORITY_INDEX))})},e.prototype.hasChildren=function(){return r.validateArgCount(\"DataSnapshot.hasChildren\",0,0,arguments.length),!this._e.isLeafNode()&&!this._e.isEmpty()},Object.defineProperty(e.prototype,\"key\",{get:function(){return this.ge.getKey()},enumerable:!0,configurable:!0}),e.prototype.numChildren=function(){return r.validateArgCount(\"DataSnapshot.numChildren\",0,0,arguments.length),this._e.numChildren()},e.prototype.getRef=function(){return r.validateArgCount(\"DataSnapshot.ref\",0,0,arguments.length),this.ge},Object.defineProperty(e.prototype,\"ref\",{get:function(){return this.getRef()},enumerable:!0,configurable:!0}),e}();t.DataSnapshot=s},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r,i=n(17),o=n(2),a=n(1),s=n(0),u=function(){return r||(r=new i.SortedMap(a.stringCompare)),r},l=function(){function e(e,t){void 0===t&&(t=u()),this.value=e,this.children=t}return e.fromObject=function(t){var n=e.Empty;return s.forEach(t,function(e,t){n=n.set(new o.Path(e),t)}),n},e.prototype.isEmpty=function(){return null===this.value&&this.children.isEmpty()},e.prototype.findRootMostMatchingPathAndValue=function(e,t){if(null!=this.value&&t(this.value))return{path:o.Path.Empty,value:this.value};if(e.isEmpty())return null;var n=e.getFront(),r=this.children.get(n);if(null!==r){var i=r.findRootMostMatchingPathAndValue(e.popFront(),t);return null!=i?{path:new o.Path(n).child(i.path),value:i.value}:null}return null},e.prototype.findRootMostValueAndPath=function(e){return this.findRootMostMatchingPathAndValue(e,function(){return!0})},e.prototype.subtree=function(t){if(t.isEmpty())return this;var n=t.getFront(),r=this.children.get(n);return null!==r?r.subtree(t.popFront()):e.Empty},e.prototype.set=function(t,n){if(t.isEmpty())return new e(n,this.children);var r=t.getFront(),i=this.children.get(r)||e.Empty,o=i.set(t.popFront(),n),a=this.children.insert(r,o);return new e(this.value,a)},e.prototype.remove=function(t){if(t.isEmpty())return this.children.isEmpty()?e.Empty:new e(null,this.children);var n=t.getFront(),r=this.children.get(n);if(r){var i=r.remove(t.popFront()),o=void 0;return o=i.isEmpty()?this.children.remove(n):this.children.insert(n,i),null===this.value&&o.isEmpty()?e.Empty:new e(this.value,o)}return this},e.prototype.get=function(e){if(e.isEmpty())return this.value;var t=e.getFront(),n=this.children.get(t);return n?n.get(e.popFront()):null},e.prototype.setTree=function(t,n){if(t.isEmpty())return n;var r=t.getFront(),i=this.children.get(r)||e.Empty,o=i.setTree(t.popFront(),n),a=void 0;return a=o.isEmpty()?this.children.remove(r):this.children.insert(r,o),new e(this.value,a)},e.prototype.fold=function(e){return this.Ce(o.Path.Empty,e)},e.prototype.Ce=function(e,t){var n={};return this.children.inorderTraversal(function(r,i){n[r]=i.Ce(e.child(r),t)}),t(e,this.value,n)},e.prototype.findOnPath=function(e,t){return this.Ee(e,o.Path.Empty,t)},e.prototype.Ee=function(e,t,n){var r=!!this.value&&n(t,this.value);if(r)return r;if(e.isEmpty())return null;var i=e.getFront(),o=this.children.get(i);return o?o.Ee(e.popFront(),t.child(i),n):null},e.prototype.foreachOnPath=function(e,t){return this.Ne(e,o.Path.Empty,t)},e.prototype.Ne=function(t,n,r){if(t.isEmpty())return this;this.value&&r(n,this.value);var i=t.getFront(),o=this.children.get(i);return o?o.Ne(t.popFront(),n.child(i),r):e.Empty},e.prototype.foreach=function(e){this.Pe(o.Path.Empty,e)},e.prototype.Pe=function(e,t){this.children.inorderTraversal(function(n,r){r.Pe(e.child(n),t)}),this.value&&t(e,this.value)},e.prototype.foreachChild=function(e){this.children.inorderTraversal(function(t,n){n.value&&e(t,n.value)})},e.Empty=new e(null),e}();t.ImmutableTree=l},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=n(9),o=n(4),a=n(3),s=function(){function e(e){this.me=e}return e.prototype.updateChild=function(e,t,n,o,a,s){r.assert(e.isIndexed(this.me),\"A node must be indexed if only a child is updated\");var u=e.getImmediateChild(t);return u.getChild(o).equals(n.getChild(o))&&u.isEmpty()==n.isEmpty()?e:(null!=s&&(n.isEmpty()?e.hasChild(t)?s.trackChildChange(i.Change.childRemovedChange(t,u)):r.assert(e.isLeafNode(),\"A child remove without an old child only makes sense on a leaf node\"):u.isEmpty()?s.trackChildChange(i.Change.childAddedChange(t,n)):s.trackChildChange(i.Change.childChangedChange(t,n,u))),e.isLeafNode()&&n.isEmpty()?e:e.updateImmediateChild(t,n).withIndex(this.me))},e.prototype.updateFullNode=function(e,t,n){return null!=n&&(e.isLeafNode()||e.forEachChild(a.PRIORITY_INDEX,function(e,r){t.hasChild(e)||n.trackChildChange(i.Change.childRemovedChange(e,r))}),t.isLeafNode()||t.forEachChild(a.PRIORITY_INDEX,function(t,r){if(e.hasChild(t)){var o=e.getImmediateChild(t);o.equals(r)||n.trackChildChange(i.Change.childChangedChange(t,r,o))}else n.trackChildChange(i.Change.childAddedChange(t,r))})),t.withIndex(this.me)},e.prototype.updatePriority=function(e,t){return e.isEmpty()?o.ChildrenNode.EMPTY_NODE:e.updatePriority(t)},e.prototype.filtersNodes=function(){return!1},e.prototype.getIndexedFilter=function(){return this},e.prototype.getIndex=function(){return this.me},e}();t.IndexedFilter=s},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(99),i=function(){function e(){}return e.getCollection=function(e){var t=\"\"+e;return this.be[t]||(this.be[t]=new r.StatsCollection),this.be[t]},e.getOrCreateReporter=function(e,t){var n=\"\"+e;return this.Se[n]||(this.Se[n]=t()),this.Se[n]},e.be={},e.Se={},e}();t.StatsManager=i},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=n(18),o=n(1),a=n(33),s=n(7);n(109);var u,l=function(){function e(){this.Te={},this.we=!1}return e.getInstance=function(){return u||(u=new e),u},e.prototype.interrupt=function(){for(var e in this.Te)for(var t in this.Te[e])this.Te[e][t].interrupt()},e.prototype.resume=function(){for(var e in this.Te)for(var t in this.Te[e])this.Te[e][t].resume()},e.prototype.databaseFromApp=function(e,t){var n=t||e.options.databaseURL;void 0===n&&o.fatal(\"Can't determine Firebase Database URL.  Be sure to include databaseURL option when calling firebase.initializeApp().\");var r=a.parseRepoInfo(n),i=r.repoInfo;return s.validateUrl(\"Invalid Firebase Database URL\",1,r),r.path.isEmpty()||o.fatal(\"Database URL must point to the root of a Firebase Database (not including a child path).\"),this.createRepo(i,e).database},e.prototype.deleteRepo=function(e){var t=r.safeGet(this.Te,e.app.name);t&&r.safeGet(t,e.H.toURLString())===e||o.fatal(\"Database \"+e.app.name+\"(\"+e.H+\") has already been deleted.\"),e.interrupt(),delete t[e.H.toURLString()]},e.prototype.createRepo=function(e,t){var n=r.safeGet(this.Te,t.name);n||(n={},this.Te[t.name]=n);var a=r.safeGet(n,e.toURLString());return a&&o.fatal(\"Database initialized multiple times. Please make sure the format of the database URL matches with each database() call.\"),a=new i.Repo(e,this.we,t),n[e.toURLString()]=a,a},e.prototype.forceRestClient=function(e){this.we=e},e}();t.RepoManager=l},,,,,,function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(1),i=n(33),o=n(2),a=n(21),s=n(18),u=n(26),l=n(0),h=n(7),c=function(){function e(e){this.Ie=e,e instanceof s.Repo||r.fatal(\"Don't call new Database() directly - please use firebase.database().\"),this.B=new a.Reference(e,o.Path.Empty),this.INTERNAL=new p(this)}return Object.defineProperty(e.prototype,\"app\",{get:function(){return this.Ie.app},enumerable:!0,configurable:!0}),e.prototype.ref=function(e){return this.Re(\"ref\"),l.validateArgCount(\"database.ref\",0,1,arguments.length),void 0!==e?this.B.child(e):this.B},e.prototype.refFromURL=function(e){var t=\"database.refFromURL\";this.Re(t),l.validateArgCount(t,1,1,arguments.length);var n=i.parseRepoInfo(e);h.validateUrl(t,1,n);var o=n.repoInfo;return o.host!==this.Ie.H.host&&r.fatal(t+\": Host name does not match the current database: (found \"+o.host+\" but expected \"+this.Ie.H.host+\")\"),this.ref(\"\"+n.path)},e.prototype.Re=function(e){null===this.Ie&&r.fatal(\"Cannot call \"+e+\" on a deleted database.\")},e.prototype.goOffline=function(){l.validateArgCount(\"database.goOffline\",0,0,arguments.length),this.Re(\"goOffline\"),this.Ie.interrupt()},e.prototype.goOnline=function(){l.validateArgCount(\"database.goOnline\",0,0,arguments.length),this.Re(\"goOnline\"),this.Ie.resume()},e.ServerValue={TIMESTAMP:{\".sv\":\"timestamp\"}},e}();t.Database=c;var p=function(){function e(e){this.database=e}return e.prototype.delete=function(){return this.database.Re(\"delete\"),u.RepoManager.getInstance().deleteRepo(this.database.Ie),this.database.Ie=null,this.database.B=null,this.database.INTERNAL=null,this.database=null,Promise.resolve()},e}();t.DatabaseInternals=p},function(e,t,n){\"use strict\";function r(e){for(var t=\"\",n=e.split(\"/\"),r=0;r<n.length;r++)if(n[r].length>0){var i=n[r];try{i=decodeURIComponent(i.replace(/\\+/g,\" \"))}catch(e){}t+=\"/\"+i}return t}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(2),o=n(34),a=n(1);t.parseRepoInfo=function(e){var n=t.parseURL(e),r=n.subdomain;\"firebase\"===n.domain&&a.fatal(n.host+\" is no longer supported. Please use <YOUR FIREBASE>.firebaseio.com instead\"),r&&\"undefined\"!=r||a.fatal(\"Cannot parse Firebase url. Please use https://<YOUR FIREBASE>.firebaseio.com\"),n.secure||a.warnIfPageIsSecure();var s=\"ws\"===n.scheme||\"wss\"===n.scheme;return{repoInfo:new o.RepoInfo(n.host,n.secure,r,s),path:new i.Path(n.pathString)}},t.parseURL=function(e){var t=\"\",n=\"\",i=\"\",o=\"\",a=!0,s=\"https\",u=443;if(\"string\"==typeof e){var l=e.indexOf(\"//\");l>=0&&(s=e.substring(0,l-1),e=e.substring(l+2));var h=e.indexOf(\"/\");-1===h&&(h=e.length),t=e.substring(0,h),o=r(e.substring(h));var c=t.split(\".\");3===c.length?(n=c[1],i=c[0].toLowerCase()):2===c.length&&(n=c[0]),(l=t.indexOf(\":\"))>=0&&(a=\"https\"===s||\"wss\"===s,u=parseInt(t.substring(l+1),10))}return{host:t,port:u,domain:n,subdomain:i,secure:a,scheme:s,pathString:o}}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=n(0),o=n(13),a=n(14),s=function(){function e(e,t,n,r,i){void 0===i&&(i=\"\"),this.secure=t,this.namespace=n,this.webSocketOnly=r,this.persistenceKey=i,this.host=e.toLowerCase(),this.domain=this.host.substr(this.host.indexOf(\".\")+1),this.internalHost=o.PersistentStorage.get(\"host:\"+e)||this.host}return e.prototype.needsQueryParam=function(){return this.host!==this.internalHost},e.prototype.isCacheableHost=function(){return\"s-\"===this.internalHost.substr(0,2)},e.prototype.isDemoHost=function(){return\"firebaseio-demo.com\"===this.domain},e.prototype.isCustomHost=function(){return\"firebaseio.com\"!==this.domain&&\"firebaseio-demo.com\"!==this.domain},e.prototype.updateHost=function(e){e!==this.internalHost&&(this.internalHost=e,this.isCacheableHost()&&o.PersistentStorage.set(\"host:\"+this.host,this.internalHost))},e.prototype.connectionURL=function(e,t){r.assert(\"string\"==typeof e,\"typeof type must == string\"),r.assert(\"object\"==typeof t,\"typeof params must == object\");var n;if(e===a.WEBSOCKET)n=(this.secure?\"wss://\":\"ws://\")+this.internalHost+\"/.ws?\";else{if(e!==a.LONG_POLLING)throw Error(\"Unknown connection type: \"+e);n=(this.secure?\"https://\":\"http://\")+this.internalHost+\"/.lp?\"}this.needsQueryParam()&&(t.ns=this.namespace);var o=[];return i.forEach(t,function(e,t){o.push(e+\"=\"+t)}),n+o.join(\"&\")},e.prototype.toString=function(){var e=this.toURLString();return this.persistenceKey&&(e+=\"<\"+this.persistenceKey+\">\"),e},e.prototype.toURLString=function(){return(this.secure?\"https://\":\"http://\")+this.host},e}();t.RepoInfo=s},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=n(7),o=n(1),a=n(0),s=function(){function e(e,t){this.Ie=e,this.Oe=t}return e.prototype.cancel=function(e){r.validateArgCount(\"OnDisconnect.cancel\",0,1,arguments.length),r.validateCallback(\"OnDisconnect.cancel\",1,e,!0);var t=new a.Deferred;return this.Ie.onDisconnectCancel(this.Oe,t.wrapCallback(e)),t.promise},e.prototype.remove=function(e){r.validateArgCount(\"OnDisconnect.remove\",0,1,arguments.length),i.validateWritablePath(\"OnDisconnect.remove\",this.Oe),r.validateCallback(\"OnDisconnect.remove\",1,e,!0);var t=new a.Deferred;return this.Ie.onDisconnectSet(this.Oe,null,t.wrapCallback(e)),t.promise},e.prototype.set=function(e,t){r.validateArgCount(\"OnDisconnect.set\",1,2,arguments.length),i.validateWritablePath(\"OnDisconnect.set\",this.Oe),i.validateFirebaseDataArg(\"OnDisconnect.set\",1,e,this.Oe,!1),r.validateCallback(\"OnDisconnect.set\",2,t,!0);var n=new a.Deferred;return this.Ie.onDisconnectSet(this.Oe,e,n.wrapCallback(t)),n.promise},e.prototype.setWithPriority=function(e,t,n){r.validateArgCount(\"OnDisconnect.setWithPriority\",2,3,arguments.length),i.validateWritablePath(\"OnDisconnect.setWithPriority\",this.Oe),i.validateFirebaseDataArg(\"OnDisconnect.setWithPriority\",1,e,this.Oe,!1),i.validatePriority(\"OnDisconnect.setWithPriority\",2,t,!1),r.validateCallback(\"OnDisconnect.setWithPriority\",3,n,!0);var o=new a.Deferred;return this.Ie.onDisconnectSetWithPriority(this.Oe,e,t,o.wrapCallback(n)),o.promise},e.prototype.update=function(e,t){if(r.validateArgCount(\"OnDisconnect.update\",1,2,arguments.length),i.validateWritablePath(\"OnDisconnect.update\",this.Oe),Array.isArray(e)){for(var n={},s=0;s<e.length;++s)n[\"\"+s]=e[s];e=n,o.warn(\"Passing an Array to firebase.database.onDisconnect().update() is deprecated. Use set() if you want to overwrite the existing data, or an Object with integer keys if you really do want to only update some of the children.\")}i.validateFirebaseMergeDataArg(\"OnDisconnect.update\",1,e,this.Oe,!1),r.validateCallback(\"OnDisconnect.update\",2,t,!0);var u=new a.Deferred;return this.Ie.onDisconnectUpdate(this.Oe,e,u.wrapCallback(t)),u.promise},e}();t.OnDisconnect=s},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r,i=n(0),o=n(10),a=n(3),s=n(38),u=n(42),l=n(1),h=n(2),c=n(7),p=n(0),d=n(84),f=n(0),_=function(){function e(e,t,n,r){this.repo=e,this.path=t,this.Ae=n,this.De=r}return Object.defineProperty(e,\"__referenceConstructor\",{get:function(){return i.assert(r,\"Reference.ts has not been loaded\"),r},set:function(e){r=e},enumerable:!0,configurable:!0}),e.Me=function(e){var t=null,n=null;if(e.hasStart()&&(t=e.getIndexStartValue()),e.hasEnd()&&(n=e.getIndexEndValue()),e.getIndex()===o.KEY_INDEX){var r=\"Query: When ordering by key, you may only pass one argument to startAt(), endAt(), or equalTo().\",h=\"Query: When ordering by key, the argument passed to startAt(), endAt(),or equalTo() must be a string.\";if(e.hasStart()){if(e.getIndexStartName()!=l.MIN_NAME)throw Error(r);if(\"string\"!=typeof t)throw Error(h)}if(e.hasEnd()){if(e.getIndexEndName()!=l.MAX_NAME)throw Error(r);if(\"string\"!=typeof n)throw Error(h)}}else if(e.getIndex()===a.PRIORITY_INDEX){if(null!=t&&!c.isValidPriority(t)||null!=n&&!c.isValidPriority(n))throw Error(\"Query: When ordering by priority, the first argument passed to startAt(), endAt(), or equalTo() must be a valid priority value (null, a number, or a string).\")}else if(i.assert(e.getIndex()instanceof u.PathIndex||e.getIndex()===s.VALUE_INDEX,\"unknown index type.\"),null!=t&&\"object\"==typeof t||null!=n&&\"object\"==typeof n)throw Error(\"Query: First argument passed to startAt(), endAt(), or equalTo() cannot be an object.\")},e.Le=function(e){if(e.hasStart()&&e.hasEnd()&&e.hasLimit()&&!e.hasAnchoredLimit())throw Error(\"Query: Can't combine startAt(), endAt(), and limit(). Use limitToFirst() or limitToLast() instead.\")},e.prototype.Fe=function(e){if(!0===this.De)throw Error(e+\": You can't combine multiple orderBy calls.\")},e.prototype.getQueryParams=function(){return this.Ae},e.prototype.getRef=function(){return p.validateArgCount(\"Query.ref\",0,0,arguments.length),new e.__referenceConstructor(this.repo,this.path)},e.prototype.on=function(t,n,r,i){p.validateArgCount(\"Query.on\",2,4,arguments.length),c.validateEventType(\"Query.on\",1,t,!1),p.validateCallback(\"Query.on\",2,n,!1);var o=e.xe(\"Query.on\",r,i);if(\"value\"===t)this.onValueEvent(n,o.cancel,o.context);else{var a={};a[t]=n,this.onChildEvent(a,o.cancel,o.context)}return n},e.prototype.onValueEvent=function(e,t,n){var r=new d.ValueEventRegistration(e,t||null,n||null);this.repo.addEventCallbackForQuery(this,r)},e.prototype.onChildEvent=function(e,t,n){var r=new d.ChildEventRegistration(e,t,n);this.repo.addEventCallbackForQuery(this,r)},e.prototype.off=function(e,t,n){p.validateArgCount(\"Query.off\",0,3,arguments.length),c.validateEventType(\"Query.off\",1,e,!0),p.validateCallback(\"Query.off\",2,t,!0),p.validateContextObject(\"Query.off\",3,n,!0);var r=null,i=null;if(\"value\"===e){var o=t||null;r=new d.ValueEventRegistration(o,null,n||null)}else e&&(t&&(i={},i[e]=t),r=new d.ChildEventRegistration(i,null,n||null));this.repo.removeEventCallbackForQuery(this,r)},e.prototype.once=function(t,n,r,i){var o=this;p.validateArgCount(\"Query.once\",1,4,arguments.length),c.validateEventType(\"Query.once\",1,t,!1),p.validateCallback(\"Query.once\",2,n,!0);var a=e.xe(\"Query.once\",r,i),s=!0,u=new f.Deferred;u.promise.catch(function(){});var l=function(e){s&&(s=!1,o.off(t,l),n&&n.bind(a.context)(e),u.resolve(e))};return this.on(t,l,function(e){o.off(t,l),a.cancel&&a.cancel.bind(a.context)(e),u.reject(e)}),u.promise},e.prototype.limitToFirst=function(t){if(p.validateArgCount(\"Query.limitToFirst\",1,1,arguments.length),\"number\"!=typeof t||Math.floor(t)!==t||t<=0)throw Error(\"Query.limitToFirst: First argument must be a positive integer.\");if(this.Ae.hasLimit())throw Error(\"Query.limitToFirst: Limit was already set (by another call to limit, limitToFirst, or limitToLast).\");return new e(this.repo,this.path,this.Ae.limitToFirst(t),this.De)},e.prototype.limitToLast=function(t){if(p.validateArgCount(\"Query.limitToLast\",1,1,arguments.length),\"number\"!=typeof t||Math.floor(t)!==t||t<=0)throw Error(\"Query.limitToLast: First argument must be a positive integer.\");if(this.Ae.hasLimit())throw Error(\"Query.limitToLast: Limit was already set (by another call to limit, limitToFirst, or limitToLast).\");return new e(this.repo,this.path,this.Ae.limitToLast(t),this.De)},e.prototype.orderByChild=function(t){if(p.validateArgCount(\"Query.orderByChild\",1,1,arguments.length),\"$key\"===t)throw Error('Query.orderByChild: \"$key\" is invalid.  Use Query.orderByKey() instead.');if(\"$priority\"===t)throw Error('Query.orderByChild: \"$priority\" is invalid.  Use Query.orderByPriority() instead.');if(\"$value\"===t)throw Error('Query.orderByChild: \"$value\" is invalid.  Use Query.orderByValue() instead.');c.validatePathString(\"Query.orderByChild\",1,t,!1),this.Fe(\"Query.orderByChild\");var n=new h.Path(t);if(n.isEmpty())throw Error(\"Query.orderByChild: cannot pass in empty path.  Use Query.orderByValue() instead.\");var r=new u.PathIndex(n),i=this.Ae.orderBy(r);return e.Me(i),new e(this.repo,this.path,i,!0)},e.prototype.orderByKey=function(){p.validateArgCount(\"Query.orderByKey\",0,0,arguments.length),this.Fe(\"Query.orderByKey\");var t=this.Ae.orderBy(o.KEY_INDEX);return e.Me(t),new e(this.repo,this.path,t,!0)},e.prototype.orderByPriority=function(){p.validateArgCount(\"Query.orderByPriority\",0,0,arguments.length),this.Fe(\"Query.orderByPriority\");var t=this.Ae.orderBy(a.PRIORITY_INDEX);return e.Me(t),new e(this.repo,this.path,t,!0)},e.prototype.orderByValue=function(){p.validateArgCount(\"Query.orderByValue\",0,0,arguments.length),this.Fe(\"Query.orderByValue\");var t=this.Ae.orderBy(s.VALUE_INDEX);return e.Me(t),new e(this.repo,this.path,t,!0)},e.prototype.startAt=function(t,n){void 0===t&&(t=null),p.validateArgCount(\"Query.startAt\",0,2,arguments.length),c.validateFirebaseDataArg(\"Query.startAt\",1,t,this.path,!0),c.validateKey(\"Query.startAt\",2,n,!0);var r=this.Ae.startAt(t,n);if(e.Le(r),e.Me(r),this.Ae.hasStart())throw Error(\"Query.startAt: Starting point was already set (by another call to startAt or equalTo).\");return void 0===t&&(t=null,n=null),new e(this.repo,this.path,r,this.De)},e.prototype.endAt=function(t,n){void 0===t&&(t=null),p.validateArgCount(\"Query.endAt\",0,2,arguments.length),c.validateFirebaseDataArg(\"Query.endAt\",1,t,this.path,!0),c.validateKey(\"Query.endAt\",2,n,!0);var r=this.Ae.endAt(t,n);if(e.Le(r),e.Me(r),this.Ae.hasEnd())throw Error(\"Query.endAt: Ending point was already set (by another call to endAt or equalTo).\");return new e(this.repo,this.path,r,this.De)},e.prototype.equalTo=function(e,t){if(p.validateArgCount(\"Query.equalTo\",1,2,arguments.length),c.validateFirebaseDataArg(\"Query.equalTo\",1,e,this.path,!1),c.validateKey(\"Query.equalTo\",2,t,!0),this.Ae.hasStart())throw Error(\"Query.equalTo: Starting point was already set (by another call to startAt or equalTo).\");if(this.Ae.hasEnd())throw Error(\"Query.equalTo: Ending point was already set (by another call to endAt or equalTo).\");return this.startAt(e,t).endAt(e,t)},e.prototype.toString=function(){return p.validateArgCount(\"Query.toString\",0,0,arguments.length),\"\"+this.repo+this.path.toUrlEncodedString()},e.prototype.toJSON=function(){return p.validateArgCount(\"Query.toJSON\",0,1,arguments.length),\"\"+this},e.prototype.queryObject=function(){return this.Ae.getQueryObject()},e.prototype.queryIdentifier=function(){var e=this.queryObject(),t=l.ObjectToUniqueKey(e);return\"{}\"===t?\"default\":t},e.prototype.isEqual=function(t){if(p.validateArgCount(\"Query.isEqual\",1,1,arguments.length),!(t instanceof e))throw Error(\"Query.isEqual failed: First argument must be an instance of firebase.database.Query.\");var n=this.repo===t.repo,r=this.path.equals(t.path),i=this.queryIdentifier()===t.queryIdentifier();return n&&r&&i},e.xe=function(e,t,n){var r={cancel:null,context:null};if(t&&n)r.cancel=t,p.validateCallback(e,3,r.cancel,!0),r.context=n,p.validateContextObject(e,4,r.context,!0);else if(t)if(\"object\"==typeof t&&null!==t)r.context=t;else{if(\"function\"!=typeof t)throw Error(p.errorPrefix(e,3,!0)+\" must either be a cancel callback or a context object.\");r.cancel=t}return r},Object.defineProperty(e.prototype,\"ref\",{get:function(){return this.getRef()},enumerable:!0,configurable:!0}),e}();t.Query=_},function(e,t,n){\"use strict\";function r(e){i=e}Object.defineProperty(t,\"__esModule\",{value:!0});var i,o=n(0),a=n(1),s=n(0);t.setMaxNode=r,t.priorityHashText=function(e){return\"number\"==typeof e?\"number:\"+a.doubleToIEEE754String(e):\"string:\"+e},t.validatePriorityNode=function(e){if(e.isLeafNode()){var t=e.val();o.assert(\"string\"==typeof t||\"number\"==typeof t||\"object\"==typeof t&&s.contains(t,\".sv\"),\"Priority must be a string or number.\")}else o.assert(e===i||e.isEmpty(),\"priority of unexpected type.\");o.assert(e===i||e.getPriority().isEmpty(),\"Priority nodes can't have a priority of their own.\")}},function(e,t,n){\"use strict\";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(15),o=n(5),a=n(1),s=n(11),u=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.compare=function(e,t){var n=e.node.compareTo(t.node);return 0===n?a.nameCompare(e.name,t.name):n},t.prototype.isDefinedOn=function(e){return!0},t.prototype.indexedValueChanged=function(e,t){return!e.equals(t)},t.prototype.minPost=function(){return o.NamedNode.MIN},t.prototype.maxPost=function(){return o.NamedNode.MAX},t.prototype.makePost=function(e,t){var n=s.nodeFromJSON(e);return new o.NamedNode(t,n)},t.prototype.toString=function(){return\".value\"},t}(i.Index);t.ValueIndex=u,t.VALUE_INDEX=new u},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r,i=n(0),o=n(40),a=n(0),s=n(5),u=n(3),l=n(10),h={},c=function(){function e(e,t){this.ke=e,this.We=t}return Object.defineProperty(e,\"Default\",{get:function(){return i.assert(h&&u.PRIORITY_INDEX,\"ChildrenNode.ts has not been loaded\"),r=r||new e({\".priority\":h},{\".priority\":u.PRIORITY_INDEX})},enumerable:!0,configurable:!0}),e.prototype.get=function(e){var t=a.safeGet(this.ke,e);if(!t)throw Error(\"No index defined for \"+e);return t===h?null:t},e.prototype.hasIndex=function(e){return a.contains(this.We,\"\"+e)},e.prototype.addIndex=function(t,n){i.assert(t!==l.KEY_INDEX,\"KeyIndex always exists and isn't meant to be added to the IndexMap.\");for(var r=[],u=!1,c=n.getIterator(s.NamedNode.Wrap),p=c.getNext();p;)u=u||t.isDefinedOn(p.node),r.push(p),p=c.getNext();var d;d=u?o.buildChildSet(r,t.getCompare()):h;var f=\"\"+t,_=a.clone(this.We);_[f]=t;var y=a.clone(this.ke);return y[f]=d,new e(y,_)},e.prototype.addToIndexes=function(t,n){var r=this;return new e(a.map(this.ke,function(e,u){var l=a.safeGet(r.We,u);if(i.assert(l,\"Missing index implementation for \"+u),e===h){if(l.isDefinedOn(t.node)){for(var c=[],p=n.getIterator(s.NamedNode.Wrap),d=p.getNext();d;)d.name!=t.name&&c.push(d),d=p.getNext();return c.push(t),o.buildChildSet(c,l.getCompare())}return h}var f=n.get(t.name),_=e;return f&&(_=_.remove(new s.NamedNode(t.name,f))),_.insert(t,t.node)}),this.We)},e.prototype.removeFromIndexes=function(t,n){return new e(a.map(this.ke,function(e){if(e===h)return e;var r=n.get(t.name);return r?e.remove(new s.NamedNode(t.name,r)):e}),this.We)},e}();t.IndexMap=c},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(17),i=n(17),o=Math.log(2),a=function(){function e(e){this.count=function(e){return parseInt(Math.log(e)/o,10)}(e+1),this.je=this.count-1;var t=function(e){return parseInt(Array(e+1).join(\"1\"),2)}(this.count);this.Ve=e+1&t}return e.prototype.nextBitIsOne=function(){var e=!(this.Ve&1<<this.je);return this.je--,e},e}();t.buildChildSet=function(e,t,n,o){e.sort(t);var s=function(t,i){var o,a,u=i-t;if(0==u)return null;if(1==u)return o=e[t],a=n?n(o):o,new r.LLRBNode(a,o.node,r.LLRBNode.BLACK,null,null);var l=parseInt(u/2,10)+t,h=s(t,l),c=s(l+1,i);return o=e[l],a=n?n(o):o,new r.LLRBNode(a,o.node,r.LLRBNode.BLACK,h,c)},u=new a(e.length),l=function(t){for(var i=null,o=null,a=e.length,u=function(t,i){var o=a-t,u=a;a-=t;var h=s(o+1,u),c=e[o],p=n?n(c):c;l(new r.LLRBNode(p,c.node,i,null,h))},l=function(e){i?(i.left=e,i=e):(o=e,i=e)},h=0;h<t.count;++h){var c=t.nextBitIsOne(),p=Math.pow(2,t.count-(h+1));c?u(p,r.LLRBNode.BLACK):(u(p,r.LLRBNode.BLACK),u(p,r.LLRBNode.RED))}return o}(u);return new i.SortedMap(o||t,l)}},function(e,t,n){\"use strict\";function r(e,t){return o.nameCompare(e.name,t.name)}function i(e,t){return o.nameCompare(e,t)}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(1);t.NAME_ONLY_COMPARATOR=r,t.NAME_COMPARATOR=i},function(e,t,n){\"use strict\";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(0),o=n(1),a=n(15),s=n(4),u=n(5),l=n(11),h=function(e){function t(t){var n=e.call(this)||this;return n.Qe=t,i.assert(!t.isEmpty()&&\".priority\"!==t.getFront(),\"Can't create PathIndex with empty path or .priority key\"),n}return r(t,e),t.prototype.extractChild=function(e){return e.getChild(this.Qe)},t.prototype.isDefinedOn=function(e){return!e.getChild(this.Qe).isEmpty()},t.prototype.compare=function(e,t){var n=this.extractChild(e.node),r=this.extractChild(t.node),i=n.compareTo(r);return 0===i?o.nameCompare(e.name,t.name):i},t.prototype.makePost=function(e,t){var n=l.nodeFromJSON(e),r=s.ChildrenNode.EMPTY_NODE.updateChild(this.Qe,n);return new u.NamedNode(t,r)},t.prototype.maxPost=function(){var e=s.ChildrenNode.EMPTY_NODE.updateChild(this.Qe,s.MAX_NODE);return new u.NamedNode(o.MAX_NAME,e)},t.prototype.toString=function(){return this.Qe.slice().join(\"/\")},t}(a.Index);t.PathIndex=h},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=n(2),o=n(44),a=n(16),s=n(11),u=n(3);t.generateWithValues=function(e){return e=e||{},e.timestamp=e.timestamp||(new Date).getTime(),e},t.resolveDeferredValue=function(e,t){return e&&\"object\"==typeof e?(r.assert(\".sv\"in e,\"Unexpected leaf node or priority contents\"),t[e[\".sv\"]]):e},t.resolveDeferredValueTree=function(e,n){var r=new o.SparseSnapshotTree;return e.forEachTree(new i.Path(\"\"),function(e,i){r.remember(e,t.resolveDeferredValueSnapshot(i,n))}),r},t.resolveDeferredValueSnapshot=function(e,n){var r,i=e.getPriority().val(),o=t.resolveDeferredValue(i,n);if(e.isLeafNode()){var l=e,h=t.resolveDeferredValue(l.getValue(),n);return h!==l.getValue()||o!==l.getPriority().val()?new a.LeafNode(h,s.nodeFromJSON(o)):e}var c=e;return r=c,o!==c.getPriority().val()&&(r=r.updatePriority(new a.LeafNode(o))),c.forEachChild(u.PRIORITY_INDEX,function(e,i){var o=t.resolveDeferredValueSnapshot(i,n);o!==i&&(r=r.updateImmediateChild(e,o))}),r}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(2),i=n(3),o=n(45),a=function(){function e(){this.T=null,this._=null}return e.prototype.find=function(e){if(null!=this.T)return this.T.getChild(e);if(e.isEmpty()||null==this._)return null;var t=e.getFront();return e=e.popFront(),this._.contains(t)?this._.get(t).find(e):null},e.prototype.remember=function(t,n){if(t.isEmpty())this.T=n,this._=null;else if(null!==this.T)this.T=this.T.updateChild(t,n);else{null==this._&&(this._=new o.CountedSet);var r=t.getFront();this._.contains(r)||this._.add(r,new e);var i=this._.get(r);t=t.popFront(),i.remember(t,n)}},e.prototype.forget=function(e){if(e.isEmpty())return this.T=null,this._=null,!0;if(null!==this.T){if(this.T.isLeafNode())return!1;var t=this.T;this.T=null;var n=this;return t.forEachChild(i.PRIORITY_INDEX,function(e,t){n.remember(new r.Path(e),t)}),this.forget(e)}if(null!==this._){var o=e.getFront();return e=e.popFront(),this._.contains(o)&&this._.get(o).forget(e)&&this._.remove(o),!!this._.isEmpty()&&(this._=null,!0)}return!0},e.prototype.forEachTree=function(e,t){null!==this.T?t(e,this.T):this.forEachChild(function(n,i){var o=new r.Path(e+\"/\"+n);i.forEachTree(o,t)})},e.prototype.forEachChild=function(e){null!==this._&&this._.each(function(t,n){e(t,n)})},e}();t.SparseSnapshotTree=a},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=function(){function e(){this.set={}}return e.prototype.add=function(e,t){this.set[e]=null===t||t},e.prototype.contains=function(e){return r.contains(this.set,e)},e.prototype.get=function(e){return this.contains(e)?this.set[e]:void 0},e.prototype.remove=function(e){delete this.set[e]},e.prototype.clear=function(){this.set={}},e.prototype.isEmpty=function(){return r.isEmpty(this.set)},e.prototype.count=function(){return r.getCount(this.set)},e.prototype.each=function(e){r.forEach(this.set,function(t,n){return e(t,n)})},e.prototype.keys=function(){var e=[];return r.forEach(this.set,function(t){e.push(t)}),e},e}();t.CountedSet=i},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(8),i=n(2),o=function(){function e(e,t,n){this.source=e,this.path=t,this.snap=n,this.type=r.OperationType.OVERWRITE}return e.prototype.operationForChild=function(t){return this.path.isEmpty()?new e(this.source,i.Path.Empty,this.snap.getImmediateChild(t)):new e(this.source,this.path.popFront(),this.snap)},e}();t.Overwrite=o},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r,i=n(19),o=n(4),a=n(0),s=n(0),u=n(48),l=n(90),h=function(){function e(){this.qe={}}return Object.defineProperty(e,\"__referenceConstructor\",{get:function(){return a.assert(r,\"Reference.ts has not been loaded\"),r},set:function(e){a.assert(!r,\"__referenceConstructor has already been defined\"),r=e},enumerable:!0,configurable:!0}),e.prototype.isEmpty=function(){return s.isEmpty(this.qe)},e.prototype.applyOperation=function(e,t,n){var r=e.source.queryId;if(null!==r){var i=s.safeGet(this.qe,r);return a.assert(null!=i,\"SyncTree gave us an op for an invalid query.\"),i.applyOperation(e,t,n)}var o=[];return s.forEach(this.qe,function(r,i){o=o.concat(i.applyOperation(e,t,n))}),o},e.prototype.addEventRegistration=function(e,t,n,r,a){var h=e.queryIdentifier(),c=s.safeGet(this.qe,h);if(!c){var p=n.calcCompleteEventCache(a?r:null),d=!1;p?d=!0:r instanceof o.ChildrenNode?(p=n.calcCompleteEventChildren(r),d=!1):(p=o.ChildrenNode.EMPTY_NODE,d=!1);var f=new u.ViewCache(new i.CacheNode(p,d,!1),new i.CacheNode(r,a,!1));c=new l.View(e,f),this.qe[h]=c}return c.addEventRegistration(t),c.getInitialEvents(t)},e.prototype.removeEventRegistration=function(t,n,r){var i=t.queryIdentifier(),o=[],a=[],u=this.hasCompleteView();if(\"default\"===i){var l=this;s.forEach(this.qe,function(e,t){a=a.concat(t.removeEventRegistration(n,r)),t.isEmpty()&&(delete l.qe[e],t.getQuery().getQueryParams().loadsAllData()||o.push(t.getQuery()))})}else{var h=s.safeGet(this.qe,i);h&&(a=a.concat(h.removeEventRegistration(n,r)),h.isEmpty()&&(delete this.qe[i],h.getQuery().getQueryParams().loadsAllData()||o.push(h.getQuery())))}return u&&!this.hasCompleteView()&&o.push(new e.__referenceConstructor(t.repo,t.path)),{removed:o,events:a}},e.prototype.getQueryViews=function(){var e=this;return Object.keys(this.qe).map(function(t){return e.qe[t]}).filter(function(e){return!e.getQuery().getQueryParams().loadsAllData()})},e.prototype.getCompleteServerCache=function(e){var t=null;return s.forEach(this.qe,function(n,r){t=t||r.getCompleteServerCache(e)}),t},e.prototype.viewForQuery=function(e){if(e.getQueryParams().loadsAllData())return this.getCompleteView();var t=e.queryIdentifier();return s.safeGet(this.qe,t)},e.prototype.viewExistsForQuery=function(e){return null!=this.viewForQuery(e)},e.prototype.hasCompleteView=function(){return null!=this.getCompleteView()},e.prototype.getCompleteView=function(){return s.findValue(this.qe,function(e){return e.getQuery().getQueryParams().loadsAllData()})||null},e}();t.SyncPoint=h},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(4),i=n(19),o=function(){function e(e,t){this.Ue=e,this.Be=t}return e.prototype.updateEventSnap=function(t,n,r){return new e(new i.CacheNode(t,n,r),this.Be)},e.prototype.updateServerSnap=function(t,n,r){return new e(this.Ue,new i.CacheNode(t,n,r))},e.prototype.getEventCache=function(){return this.Ue},e.prototype.getCompleteEventSnap=function(){return this.Ue.isFullyInitialized()?this.Ue.getNode():null},e.prototype.getServerCache=function(){return this.Be},e.prototype.getCompleteServerSnap=function(){return this.Be.isFullyInitialized()?this.Be.getNode():null},e.Empty=new e(new i.CacheNode(r.ChildrenNode.EMPTY_NODE,!1,!1),new i.CacheNode(r.ChildrenNode.EMPTY_NODE,!1,!1)),e}();t.ViewCache=o},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=function(){function e(e){this.He=e,this.Ge=null}return e.prototype.get=function(){var e=this.He.get(),t=r.clone(e);return this.Ge&&r.forEach(this.Ge,function(e,n){t[e]=t[e]-n}),this.Ge=e,t},e}();t.StatsListener=i},function(e,t,n){\"use strict\";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(6),o=n(0),a=n(0),s=n(0),u=n(1),l=n(2),h=n(102),c=n(103),p=n(0),d=n(52),f=n(0),_=n(0),y=n(55),v=1e3,g=3e5,m=function(e){function t(n,r,i,o,a,s){var l=e.call(this)||this;if(l.H=n,l.ee=r,l.te=i,l.ne=o,l.Ke=a,l.Ye=s,l.id=t.Xe++,l.de=u.logWrapper(\"p:\"+l.id+\":\"),l.ze={},l.Je={},l.$e=[],l.Ze=0,l.et=[],l.tt=!1,l.nt=v,l.rt=g,l.it=null,l.lastSessionId=null,l.ot=null,l.at=!1,l.st={},l.ut=0,l.lt=null,l.ht=null,l.ct=!1,l.pt=0,l.dt=!0,l.ft=null,l._t=null,s&&!_.isNodeSdk())throw Error(\"Auth override specified in options, but not supported on non Node.js platforms\");return l.yt(0),h.VisibilityMonitor.getInstance().on(\"visible\",l.vt,l),-1===n.host.indexOf(\"fblocal\")&&c.OnlineMonitor.getInstance().on(\"online\",l.gt,l),l}return r(t,e),t.prototype.sendRequest=function(e,t,n){var r=++this.ut,i={r:r,a:e,b:t};this.de(a.stringify(i)),s.assert(this.tt,\"sendRequest call when we're not connected not allowed.\"),this.lt.sendRequest(i),n&&(this.st[r]=n)},t.prototype.listen=function(e,t,n,r){var i=e.queryIdentifier(),o=\"\"+e.path;this.de(\"Listen called for \"+o+\" \"+i),this.Je[o]=this.Je[o]||{},s.assert(e.getQueryParams().isDefault()||!e.getQueryParams().loadsAllData(),\"listen() called for non-default but complete query\"),s.assert(!this.Je[o][i],\"listen() called twice for same path/queryId.\");var a={onComplete:r,hashFn:t,query:e,tag:n};this.Je[o][i]=a,this.tt&&this.mt(a)},t.prototype.mt=function(e){var n=this,r=e.query,i=\"\"+r.path,o=r.queryIdentifier();this.de(\"Listen on \"+i+\" for \"+o);var a={p:i};e.tag&&(a.q=r.queryObject(),a.t=e.tag),a.h=e.hashFn(),this.sendRequest(\"q\",a,function(a){var s=a.d,u=a.s;t.Ct(s,r),(n.Je[i]&&n.Je[i][o])===e&&(n.de(\"listen response\",a),\"ok\"!==u&&n.Et(i,o),e.onComplete&&e.onComplete(u,s))})},t.Ct=function(e,t){if(e&&\"object\"==typeof e&&o.contains(e,\"w\")){var n=o.safeGet(e,\"w\");if(Array.isArray(n)&&~n.indexOf(\"no_index\")){var r='\".indexOn\": \"'+t.getQueryParams().getIndex()+'\"',i=\"\"+t.path;u.warn(\"Using an unspecified index. Your data will be downloaded and filtered on the client. Consider adding \"+r+\" at \"+i+\" to your security rules for better performance.\")}}},t.prototype.refreshAuthToken=function(e){this.ht=e,this.de(\"Auth token refreshed\"),this.ht?this.tryAuth():this.tt&&this.sendRequest(\"unauth\",{},function(){}),this.Nt(e)},t.prototype.Nt=function(e){(e&&40===e.length||p.isAdmin(e))&&(this.de(\"Admin auth credential detected.  Reducing max reconnect time.\"),this.rt=3e4)},t.prototype.tryAuth=function(){var e=this;if(this.tt&&this.ht){var t=this.ht,n=p.isValidFormat(t)?\"auth\":\"gauth\",r={cred:t};null===this.Ye?r.noauth=!0:\"object\"==typeof this.Ye&&(r.authvar=this.Ye),this.sendRequest(n,r,function(n){var r=n.s,i=n.d||\"error\";e.ht===t&&(\"ok\"===r?e.pt=0:e.Pt(r,i))})}},t.prototype.unlisten=function(e,t){var n=\"\"+e.path,r=e.queryIdentifier();this.de(\"Unlisten called for \"+n+\" \"+r),s.assert(e.getQueryParams().isDefault()||!e.getQueryParams().loadsAllData(),\"unlisten() called for non-default but complete query\"),this.Et(n,r)&&this.tt&&this.bt(n,r,e.queryObject(),t)},t.prototype.bt=function(e,t,n,r){this.de(\"Unlisten on \"+e+\" for \"+t);var i={p:e};r&&(i.q=n,i.t=r),this.sendRequest(\"n\",i)},t.prototype.onDisconnectPut=function(e,t,n){this.tt?this.St(\"o\",e,t,n):this.et.push({pathString:e,action:\"o\",data:t,onComplete:n})},t.prototype.onDisconnectMerge=function(e,t,n){this.tt?this.St(\"om\",e,t,n):this.et.push({pathString:e,action:\"om\",data:t,onComplete:n})},t.prototype.onDisconnectCancel=function(e,t){this.tt?this.St(\"oc\",e,null,t):this.et.push({pathString:e,action:\"oc\",data:null,onComplete:t})},t.prototype.St=function(e,t,n,r){var i={p:t,d:n};this.de(\"onDisconnect \"+e,i),this.sendRequest(e,i,function(e){r&&setTimeout(function(){r(e.s,e.d)},Math.floor(0))})},t.prototype.put=function(e,t,n,r){this.putInternal(\"p\",e,t,n,r)},t.prototype.merge=function(e,t,n,r){this.putInternal(\"m\",e,t,n,r)},t.prototype.putInternal=function(e,t,n,r,i){var o={p:t,d:n};void 0!==i&&(o.h=i),this.$e.push({action:e,request:o,onComplete:r}),this.Ze++;var a=this.$e.length-1;this.tt?this.Tt(a):this.de(\"Buffering put: \"+t)},t.prototype.Tt=function(e){var t=this,n=this.$e[e].action,r=this.$e[e].request,i=this.$e[e].onComplete;this.$e[e].queued=this.tt,this.sendRequest(n,r,function(r){t.de(n+\" response\",r),delete t.$e[e],t.Ze--,0===t.Ze&&(t.$e=[]),i&&i(r.s,r.d)})},t.prototype.reportStats=function(e){var t=this;if(this.tt){var n={c:e};this.de(\"reportStats\",n),this.sendRequest(\"s\",n,function(e){if(\"ok\"!==e.s){var n=e.d;t.de(\"reportStats\",\"Error sending stats: \"+n)}})}},t.prototype.wt=function(e){if(\"r\"in e){this.de(\"from server: \"+a.stringify(e));var t=e.r,n=this.st[t];n&&(delete this.st[t],n(e.b))}else{if(\"error\"in e)throw\"A server-side error has occurred: \"+e.error;\"a\"in e&&this.It(e.a,e.b)}},t.prototype.It=function(e,t){this.de(\"handleServerMessage\",e,t),\"d\"===e?this.ee(t.p,t.d,!1,t.t):\"m\"===e?this.ee(t.p,t.d,!0,t.t):\"c\"===e?this.Rt(t.p,t.q):\"ac\"===e?this.Pt(t.s,t.d):\"sd\"===e?this.Ot(t):u.error(\"Unrecognized action received from server: \"+a.stringify(e)+\"\\nAre you using the latest client?\")},t.prototype.At=function(e,t){this.de(\"connection ready\"),this.tt=!0,this._t=(new Date).getTime(),this.Dt(e),this.lastSessionId=t,this.dt&&this.Mt(),this.Lt(),this.dt=!1,this.te(!0)},t.prototype.yt=function(e){var t=this;s.assert(!this.lt,\"Scheduling a connect when we're already connected/ing?\"),this.ot&&clearTimeout(this.ot),this.ot=setTimeout(function(){t.ot=null,t.Ft()},Math.floor(e))},t.prototype.vt=function(e){e&&!this.at&&this.nt===this.rt&&(this.de(\"Window became visible.  Reducing delay.\"),this.nt=v,this.lt||this.yt(0)),this.at=e},t.prototype.gt=function(e){e?(this.de(\"Browser went online.\"),this.nt=v,this.lt||this.yt(0)):(this.de(\"Browser went offline.  Killing connection.\"),this.lt&&this.lt.close())},t.prototype.xt=function(){if(this.de(\"data client disconnected\"),this.tt=!1,this.lt=null,this.kt(),this.st={},this.Wt()){if(this.at){if(this._t){var e=(new Date).getTime()-this._t;e>3e4&&(this.nt=v),this._t=null}}else this.de(\"Window isn't visible.  Delaying reconnect.\"),this.nt=this.rt,this.ft=(new Date).getTime();var t=(new Date).getTime()-this.ft,n=Math.max(0,this.nt-t);n=Math.random()*n,this.de(\"Trying to reconnect in \"+n+\"ms\"),this.yt(n),this.nt=Math.min(this.rt,1.3*this.nt)}this.te(!1)},t.prototype.Ft=function(){if(this.Wt()){this.de(\"Making a connection attempt\"),this.ft=(new Date).getTime(),this._t=null;var e=this.wt.bind(this),n=this.At.bind(this),r=this.xt.bind(this),i=this.id+\":\"+t.jt++,o=this,a=this.lastSessionId,l=!1,h=null,c=function(){h?h.close():(l=!0,r())},p=function(e){s.assert(h,\"sendRequest call when we're not connected not allowed.\"),h.sendRequest(e)};this.lt={close:c,sendRequest:p};var _=this.ct;this.ct=!1,this.Ke.getToken(_).then(function(t){l?u.log(\"getToken() completed but was canceled\"):(u.log(\"getToken() completed. Creating connection.\"),o.ht=t&&t.accessToken,h=new d.Connection(i,o.H,e,n,r,function(e){u.warn(e+\" (\"+o.H+\")\"),o.interrupt(\"server_kill\")},a))}).then(null,function(e){o.de(\"Failed to get token: \"+e),l||(f.CONSTANTS.NODE_ADMIN&&u.warn(e),c())})}},t.prototype.interrupt=function(e){u.log(\"Interrupting connection for reason: \"+e),this.ze[e]=!0,this.lt?this.lt.close():(this.ot&&(clearTimeout(this.ot),this.ot=null),this.tt&&this.xt())},t.prototype.resume=function(e){u.log(\"Resuming connection for reason: \"+e),delete this.ze[e],o.isEmpty(this.ze)&&(this.nt=v,this.lt||this.yt(0))},t.prototype.Dt=function(e){var t=e-(new Date).getTime();this.ne({serverTimeOffset:t})},t.prototype.kt=function(){for(var e=0;e<this.$e.length;e++){var t=this.$e[e];t&&\"h\"in t.request&&t.queued&&(t.onComplete&&t.onComplete(\"disconnect\"),delete this.$e[e],this.Ze--)}0===this.Ze&&(this.$e=[])},t.prototype.Rt=function(e,t){var n;n=t?t.map(function(e){return u.ObjectToUniqueKey(e)}).join(\"$\"):\"default\";var r=this.Et(e,n);r&&r.onComplete&&r.onComplete(\"permission_denied\")},t.prototype.Et=function(e,t){var n,r=\"\"+new l.Path(e);return void 0!==this.Je[r]?(n=this.Je[r][t],delete this.Je[r][t],0===o.getCount(this.Je[r])&&delete this.Je[r]):n=void 0,n},t.prototype.Pt=function(e,t){u.log(\"Auth token revoked: \"+e+\"/\"+t),this.ht=null,this.ct=!0,this.lt.close(),\"invalid_token\"!==e&&\"permission_denied\"!==e||++this.pt>=3&&(this.nt=3e4,this.Ke.notifyForInvalidToken())},t.prototype.Ot=function(e){this.it?this.it(e):\"msg\"in e&&\"undefined\"!=typeof console&&console.log(\"FIREBASE: \"+e.msg.replace(\"\\n\",\"\\nFIREBASE: \"))},t.prototype.Lt=function(){var e=this;this.tryAuth(),o.forEach(this.Je,function(t,n){o.forEach(n,function(t,n){e.mt(n)})});for(var t=0;t<this.$e.length;t++)this.$e[t]&&this.Tt(t);for(;this.et.length;){var n=this.et.shift();this.St(n.action,n.pathString,n.data,n.onComplete)}},t.prototype.Mt=function(){var e={},t=\"js\";f.CONSTANTS.NODE_ADMIN?t=\"admin_node\":f.CONSTANTS.NODE_CLIENT&&(t=\"node\"),e[\"sdk.\"+t+\".\"+i.default.SDK_VERSION.replace(/\\./g,\"-\")]=1,_.isMobileCordova()?e[\"framework.cordova\"]=1:_.isReactNative()&&(e[\"framework.reactnative\"]=1),this.reportStats(e)},t.prototype.Wt=function(){var e=c.OnlineMonitor.getInstance().currentlyOnline();return o.isEmpty(this.ze)&&e},t.Xe=0,t.jt=0,t}(y.ServerActions);t.PersistentConnection=m},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=function(){function e(e){this.Vt=e,this.Qt={},r.assert(Array.isArray(e)&&e.length>0,\"Requires a non-empty array\")}return e.prototype.trigger=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];if(Array.isArray(this.Qt[e]))for(var r=this.Qt[e].slice(),i=0;i<r.length;i++)r[i].callback.apply(r[i].context,t)},e.prototype.on=function(e,t,n){this.qt(e),this.Qt[e]=this.Qt[e]||[],this.Qt[e].push({callback:t,context:n});var r=this.getInitialEvent(e);r&&t.apply(n,r)},e.prototype.off=function(e,t,n){this.qt(e);for(var r=this.Qt[e]||[],i=0;i<r.length;i++)if(r[i].callback===t&&(!n||n===r[i].context))return void r.splice(i,1)},e.prototype.qt=function(e){r.assert(this.Vt.find(function(t){return t===e}),\"Unknown event: \"+e)},e}();t.EventEmitter=i},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(1),i=n(13),o=n(14),a=n(104),s=function(){function e(e,t,n,i,o,s,u){this.id=e,this.H=t,this.Ut=n,this.At=i,this.z=o,this.Bt=s,this.lastSessionId=u,this.connectionCount=0,this.pendingDataMessages=[],this.Ht=0,this.de=r.logWrapper(\"c:\"+this.id+\":\"),this.Gt=new a.TransportManager(t),this.de(\"Connection created\"),this.Kt()}return e.prototype.Kt=function(){var e=this,t=this.Gt.initialTransport();this.Yt=new t(this.Xt(),this.H,void 0,this.lastSessionId),this.zt=t.responsesRequiredToBeHealthy||0;var n=this.Jt(this.Yt),i=this.$t(this.Yt);this.Zt=this.Yt,this.en=this.Yt,this.tn=null,this.nn=!1,setTimeout(function(){e.Yt&&e.Yt.open(n,i)},Math.floor(0));var o=t.healthyTimeout||0;o>0&&(this.rn=r.setTimeoutNonBlocking(function(){e.rn=null,e.nn||(e.Yt&&e.Yt.bytesReceived>102400?(e.de(\"Connection exceeded healthy timeout but has received \"+e.Yt.bytesReceived+\" bytes.  Marking connection healthy.\"),e.nn=!0,e.Yt.markConnectionHealthy()):e.Yt&&e.Yt.bytesSent>10240?e.de(\"Connection exceeded healthy timeout but has sent \"+e.Yt.bytesSent+\" bytes.  Leaving connection alive.\"):(e.de(\"Closing unhealthy connection after timeout.\"),e.close()))},Math.floor(o)))},e.prototype.Xt=function(){return\"c:\"+this.id+\":\"+this.connectionCount++},e.prototype.$t=function(e){var t=this;return function(n){e===t.Yt?t.in(n):e===t.tn?(t.de(\"Secondary connection lost.\"),t.an()):t.de(\"closing an old connection\")}},e.prototype.Jt=function(e){var t=this;return function(n){2!=t.Ht&&(e===t.en?t.sn(n):e===t.tn?t.un(n):t.de(\"message on old connection\"))}},e.prototype.sendRequest=function(e){var t={t:\"d\",d:e};this.ln(t)},e.prototype.tryCleanupConnection=function(){this.Zt===this.tn&&this.en===this.tn&&(this.de(\"cleaning up and promoting a connection: \"+this.tn.connId),this.Yt=this.tn,this.tn=null)},e.prototype.hn=function(e){if(\"t\"in e){var t=e.t;\"a\"===t?this.cn():\"r\"===t?(this.de(\"Got a reset on secondary, closing it\"),this.tn.close(),this.Zt!==this.tn&&this.en!==this.tn||this.close()):\"o\"===t&&(this.de(\"got pong on secondary.\"),this.pn--,this.cn())}},e.prototype.un=function(e){var t=r.requireKey(\"t\",e),n=r.requireKey(\"d\",e);if(\"c\"==t)this.hn(n);else{if(\"d\"!=t)throw Error(\"Unknown protocol layer: \"+t);this.pendingDataMessages.push(n)}},e.prototype.cn=function(){this.pn<=0?(this.de(\"Secondary connection is healthy.\"),this.nn=!0,this.tn.markConnectionHealthy(),this.dn()):(this.de(\"sending ping on secondary.\"),this.tn.send({t:\"c\",d:{t:\"p\",d:{}}}))},e.prototype.dn=function(){this.tn.start(),this.de(\"sending client ack on secondary\"),this.tn.send({t:\"c\",d:{t:\"a\",d:{}}}),this.de(\"Ending transmission on primary\"),this.Yt.send({t:\"c\",d:{t:\"n\",d:{}}}),this.Zt=this.tn,this.tryCleanupConnection()},e.prototype.sn=function(e){var t=r.requireKey(\"t\",e),n=r.requireKey(\"d\",e);\"c\"==t?this.fn(n):\"d\"==t&&this.wt(n)},e.prototype.wt=function(e){this._n(),this.Ut(e)},e.prototype._n=function(){this.nn||--this.zt<=0&&(this.de(\"Primary connection is healthy.\"),this.nn=!0,this.Yt.markConnectionHealthy())},e.prototype.fn=function(e){var t=r.requireKey(\"t\",e);if(\"d\"in e){var n=e.d;if(\"h\"===t)this.yn(n);else if(\"n\"===t){this.de(\"recvd end transmission on primary\"),this.en=this.tn;for(var i=0;i<this.pendingDataMessages.length;++i)this.wt(this.pendingDataMessages[i]);this.pendingDataMessages=[],this.tryCleanupConnection()}else\"s\"===t?this.vn(n):\"r\"===t?this.gn(n):\"e\"===t?r.error(\"Server Error: \"+n):\"o\"===t?(this.de(\"got pong on primary.\"),this._n(),this.mn()):r.error(\"Unknown control packet command: \"+t)}},e.prototype.yn=function(e){var t=e.ts,n=e.v,i=e.h;this.sessionId=e.s,this.H.updateHost(i),0==this.Ht&&(this.Yt.start(),this.Cn(this.Yt,t),o.PROTOCOL_VERSION!==n&&r.warn(\"Protocol version mismatch detected\"),this.En())},e.prototype.En=function(){var e=this.Gt.upgradeTransport();e&&this.Nn(e)},e.prototype.Nn=function(e){var t=this;this.tn=new e(this.Xt(),this.H,this.sessionId),this.pn=e.responsesRequiredToBeHealthy||0;var n=this.Jt(this.tn),i=this.$t(this.tn);this.tn.open(n,i),r.setTimeoutNonBlocking(function(){t.tn&&(t.de(\"Timed out trying to upgrade.\"),t.tn.close())},Math.floor(6e4))},e.prototype.gn=function(e){this.de(\"Reset packet received.  New host: \"+e),this.H.updateHost(e),1===this.Ht?this.close():(this.Pn(),this.Kt())},e.prototype.Cn=function(e,t){var n=this;this.de(\"Realtime connection established.\"),this.Yt=e,this.Ht=1,this.At&&(this.At(t,this.sessionId),this.At=null),0===this.zt?(this.de(\"Primary connection is healthy.\"),this.nn=!0):r.setTimeoutNonBlocking(function(){n.mn()},Math.floor(5e3))},e.prototype.mn=function(){this.nn||1!==this.Ht||(this.de(\"sending ping on primary.\"),this.ln({t:\"c\",d:{t:\"p\",d:{}}}))},e.prototype.an=function(){var e=this.tn;this.tn=null,this.Zt!==e&&this.en!==e||this.close()},e.prototype.in=function(e){this.Yt=null,e||0!==this.Ht?1===this.Ht&&this.de(\"Realtime connection lost.\"):(this.de(\"Realtime connection failed.\"),this.H.isCacheableHost()&&(i.PersistentStorage.remove(\"host:\"+this.H.host),this.H.internalHost=this.H.host)),this.close()},e.prototype.vn=function(e){this.de(\"Connection shutdown command received. Shutting down...\"),this.Bt&&(this.Bt(e),this.Bt=null),this.z=null,this.close()},e.prototype.ln=function(e){if(1!==this.Ht)throw\"Connection is not connected\";this.Zt.send(e)},e.prototype.close=function(){2!==this.Ht&&(this.de(\"Closing realtime connection.\"),this.Ht=2,this.Pn(),this.z&&(this.z(),this.z=null))},e.prototype.Pn=function(){this.de(\"Shutting down all connections\"),this.Yt&&(this.Yt.close(),this.Yt=null),this.tn&&(this.tn.close(),this.tn=null),this.rn&&(clearTimeout(this.rn),this.rn=null)},e}();t.Connection=s},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(1),i=n(45),o=n(25),a=n(105),s=n(14),u=n(0),l=n(0);t.FIREBASE_LONGPOLL_START_PARAM=\"start\",t.FIREBASE_LONGPOLL_CLOSE_COMMAND=\"close\",t.FIREBASE_LONGPOLL_COMMAND_CB_NAME=\"pLPCommand\",t.FIREBASE_LONGPOLL_DATA_CB_NAME=\"pRTLPCB\",t.FIREBASE_LONGPOLL_ID_PARAM=\"id\",t.FIREBASE_LONGPOLL_PW_PARAM=\"pw\",t.FIREBASE_LONGPOLL_SERIAL_PARAM=\"ser\",t.FIREBASE_LONGPOLL_CALLBACK_ID_PARAM=\"cb\",t.FIREBASE_LONGPOLL_SEGMENT_NUM_PARAM=\"seg\",t.FIREBASE_LONGPOLL_SEGMENTS_IN_PACKET=\"ts\",t.FIREBASE_LONGPOLL_DATA_PARAM=\"d\",t.FIREBASE_LONGPOLL_DISCONN_FRAME_PARAM=\"disconn\",t.FIREBASE_LONGPOLL_DISCONN_FRAME_REQUEST_PARAM=\"dframe\";var h=function(){function e(e,t,n,i){this.connId=e,this.repoInfo=t,this.transportSessionId=n,this.lastSessionId=i,this.bytesSent=0,this.bytesReceived=0,this.bn=!1,this.de=r.logWrapper(e),this.$=o.StatsManager.getCollection(t),this.urlFn=function(e){return t.connectionURL(s.LONG_POLLING,e)}}return e.prototype.open=function(e,n){var i=this;this.curSegmentNum=0,this.z=n,this.myPacketOrderer=new a.PacketReceiver(e),this.Sn=!1,this.Tn=setTimeout(function(){i.de(\"Timed out trying to connect.\"),i.wn(),i.Tn=null},Math.floor(3e4)),r.executeWhenDOMReady(function(){if(!i.Sn){i.scriptTagHolder=new c(function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];var r=e[0],o=e[1],a=e[2];if(e[3],e[4],i.In(e),i.scriptTagHolder)if(i.Tn&&(clearTimeout(i.Tn),i.Tn=null),i.bn=!0,r==t.FIREBASE_LONGPOLL_START_PARAM)i.id=o,i.password=a;else{if(r!==t.FIREBASE_LONGPOLL_CLOSE_COMMAND)throw Error(\"Unrecognized command received: \"+r);o?(i.scriptTagHolder.sendNewPolls=!1,i.myPacketOrderer.closeAfter(o,function(){i.wn()})):i.wn()}},function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=e[0],r=e[1];i.In(e),i.myPacketOrderer.handleResponse(n,r)},function(){i.wn()},i.urlFn);var e={};e[t.FIREBASE_LONGPOLL_START_PARAM]=\"t\",e[t.FIREBASE_LONGPOLL_SERIAL_PARAM]=Math.floor(1e8*Math.random()),i.scriptTagHolder.uniqueCallbackIdentifier&&(e[t.FIREBASE_LONGPOLL_CALLBACK_ID_PARAM]=i.scriptTagHolder.uniqueCallbackIdentifier),e[s.VERSION_PARAM]=s.PROTOCOL_VERSION,i.transportSessionId&&(e[s.TRANSPORT_SESSION_PARAM]=i.transportSessionId),i.lastSessionId&&(e[s.LAST_SESSION_PARAM]=i.lastSessionId),!l.isNodeSdk()&&\"undefined\"!=typeof location&&location.href&&-1!==location.href.indexOf(s.FORGE_DOMAIN)&&(e[s.REFERER_PARAM]=s.FORGE_REF);var n=i.urlFn(e);i.de(\"Connecting via long-poll to \"+n),i.scriptTagHolder.addTag(n,function(){})}})},e.prototype.start=function(){this.scriptTagHolder.startLongPoll(this.id,this.password),this.addDisconnectPingFrame(this.id,this.password)},e.forceAllow=function(){e.Rn=!0},e.forceDisallow=function(){e.On=!0},e.isAvailable=function(){return e.Rn||!e.On&&\"undefined\"!=typeof document&&null!=document.createElement&&!r.isChromeExtensionContentScript()&&!r.isWindowsStoreApp()&&!l.isNodeSdk()},e.prototype.markConnectionHealthy=function(){},e.prototype.An=function(){this.Sn=!0,this.scriptTagHolder&&(this.scriptTagHolder.close(),this.scriptTagHolder=null),this.myDisconnFrame&&(document.body.removeChild(this.myDisconnFrame),this.myDisconnFrame=null),this.Tn&&(clearTimeout(this.Tn),this.Tn=null)},e.prototype.wn=function(){this.Sn||(this.de(\"Longpoll is closing itself\"),this.An(),this.z&&(this.z(this.bn),this.z=null))},e.prototype.close=function(){this.Sn||(this.de(\"Longpoll is being closed.\"),this.An())},e.prototype.send=function(e){var t=u.stringify(e);this.bytesSent+=t.length,this.$.incrementCounter(\"bytes_sent\",t.length);for(var n=u.base64Encode(t),i=r.splitStringBySize(n,1840),o=0;o<i.length;o++)this.scriptTagHolder.enqueueSegment(this.curSegmentNum,i.length,i[o]),this.curSegmentNum++},e.prototype.addDisconnectPingFrame=function(e,n){if(!l.isNodeSdk()){this.myDisconnFrame=document.createElement(\"iframe\");var r={};r[t.FIREBASE_LONGPOLL_DISCONN_FRAME_REQUEST_PARAM]=\"t\",r[t.FIREBASE_LONGPOLL_ID_PARAM]=e,r[t.FIREBASE_LONGPOLL_PW_PARAM]=n,this.myDisconnFrame.src=this.urlFn(r),this.myDisconnFrame.style.display=\"none\",document.body.appendChild(this.myDisconnFrame)}},e.prototype.In=function(e){var t=u.stringify(e).length;this.bytesReceived+=t,this.$.incrementCounter(\"bytes_received\",t)},e}();t.BrowserPollConnection=h;var c=function(){function e(n,o,a,s){if(this.onDisconnect=a,this.urlFn=s,this.outstandingRequests=new i.CountedSet,this.pendingSegs=[],this.currentSerial=Math.floor(1e8*Math.random()),this.sendNewPolls=!0,l.isNodeSdk())this.commandCB=n,this.onMessageCB=o;else{this.uniqueCallbackIdentifier=r.LUIDGenerator(),window[t.FIREBASE_LONGPOLL_COMMAND_CB_NAME+this.uniqueCallbackIdentifier]=n,window[t.FIREBASE_LONGPOLL_DATA_CB_NAME+this.uniqueCallbackIdentifier]=o,this.myIFrame=e.Dn();var u=\"\";this.myIFrame.src&&\"javascript:\"===this.myIFrame.src.substr(0,11)&&(u='<script>document.domain=\"'+document.domain+'\";<\\/script>');var h=\"<html><body>\"+u+\"</body></html>\";try{this.myIFrame.doc.open(),this.myIFrame.doc.write(h),this.myIFrame.doc.close()}catch(e){r.log(\"frame writing exception\"),e.stack&&r.log(e.stack),r.log(e)}}}return e.Dn=function(){var e=document.createElement(\"iframe\");if(e.style.display=\"none\",!document.body)throw\"Document body has not initialized. Wait to initialize Firebase until after the document is ready.\";document.body.appendChild(e);try{e.contentWindow.document||r.log(\"No IE domain setting required\")}catch(n){var t=document.domain;e.src=\"javascript:void((function(){document.open();document.domain='\"+t+\"';document.close();})())\"}return e.contentDocument?e.doc=e.contentDocument:e.contentWindow?e.doc=e.contentWindow.document:e.document&&(e.doc=e.document),e},e.prototype.close=function(){var n=this;if(this.alive=!1,this.myIFrame&&(this.myIFrame.doc.body.innerHTML=\"\",setTimeout(function(){null!==n.myIFrame&&(document.body.removeChild(n.myIFrame),n.myIFrame=null)},Math.floor(0))),l.isNodeSdk()&&this.myID){var r={};r[t.FIREBASE_LONGPOLL_DISCONN_FRAME_PARAM]=\"t\",r[t.FIREBASE_LONGPOLL_ID_PARAM]=this.myID,r[t.FIREBASE_LONGPOLL_PW_PARAM]=this.myPW;var i=this.urlFn(r);e.nodeRestRequest(i)}var o=this.onDisconnect;o&&(this.onDisconnect=null,o())},e.prototype.startLongPoll=function(e,t){for(this.myID=e,this.myPW=t,this.alive=!0;this.Mn(););},e.prototype.Mn=function(){if(this.alive&&this.sendNewPolls&&this.outstandingRequests.count()<(this.pendingSegs.length>0?2:1)){this.currentSerial++;var e={};e[t.FIREBASE_LONGPOLL_ID_PARAM]=this.myID,e[t.FIREBASE_LONGPOLL_PW_PARAM]=this.myPW,e[t.FIREBASE_LONGPOLL_SERIAL_PARAM]=this.currentSerial;for(var n=this.urlFn(e),r=\"\",i=0;this.pendingSegs.length>0&&this.pendingSegs[0].d.length+30+r.length<=1870;){var o=this.pendingSegs.shift();r=r+\"&\"+t.FIREBASE_LONGPOLL_SEGMENT_NUM_PARAM+i+\"=\"+o.seg+\"&\"+t.FIREBASE_LONGPOLL_SEGMENTS_IN_PACKET+i+\"=\"+o.ts+\"&\"+t.FIREBASE_LONGPOLL_DATA_PARAM+i+\"=\"+o.d,i++}return n+=r,this.Ln(n,this.currentSerial),!0}return!1},e.prototype.enqueueSegment=function(e,t,n){this.pendingSegs.push({seg:e,ts:t,d:n}),this.alive&&this.Mn()},e.prototype.Ln=function(e,t){var n=this;this.outstandingRequests.add(t,1);var r=function(){n.outstandingRequests.remove(t),n.Mn()},i=setTimeout(r,Math.floor(25e3)),o=function(){clearTimeout(i),r()};this.addTag(e,o)},e.prototype.addTag=function(e,t){var n=this;l.isNodeSdk()?this.doNodeLongPoll(e,t):setTimeout(function(){try{if(!n.sendNewPolls)return;var i=n.myIFrame.doc.createElement(\"script\");i.type=\"text/javascript\",i.async=!0,i.src=e,i.onload=i.onreadystatechange=function(){var e=i.readyState;e&&\"loaded\"!==e&&\"complete\"!==e||(i.onload=i.onreadystatechange=null,i.parentNode&&i.parentNode.removeChild(i),t())},i.onerror=function(){r.log(\"Long-poll script failed to load: \"+e),n.sendNewPolls=!1,n.close()},n.myIFrame.doc.body.appendChild(i)}catch(e){}},Math.floor(1))},e}();t.FirebaseIFrameScriptHolder=c},function(e,t,n){\"use strict\";(function(e){function r(e){d=e}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(6),o=n(0),a=n(1),s=n(25),u=n(14),l=n(0),h=n(13),c=n(0),p=n(0),d=null;\"undefined\"!=typeof MozWebSocket?d=MozWebSocket:\"undefined\"!=typeof WebSocket&&(d=WebSocket),t.setWebSocketImpl=r;var f=function(){function t(e,n,r,i){this.connId=e,this.keepaliveTimer=null,this.frames=null,this.totalFrames=0,this.bytesSent=0,this.bytesReceived=0,this.de=a.logWrapper(this.connId),this.$=s.StatsManager.getCollection(n),this.connURL=t.Fn(n,r,i)}return t.Fn=function(e,t,n){var r={};return r[u.VERSION_PARAM]=u.PROTOCOL_VERSION,!p.isNodeSdk()&&\"undefined\"!=typeof location&&location.href&&-1!==location.href.indexOf(u.FORGE_DOMAIN)&&(r[u.REFERER_PARAM]=u.FORGE_REF),t&&(r[u.TRANSPORT_SESSION_PARAM]=t),n&&(r[u.LAST_SESSION_PARAM]=n),e.connectionURL(u.WEBSOCKET,r)},t.prototype.open=function(t,n){var r=this;this.onDisconnect=n,this.onMessage=t,this.de(\"Websocket connecting to \"+this.connURL),this.bn=!1,h.PersistentStorage.set(\"previous_websocket_failure\",!0);try{if(p.isNodeSdk()){var o=l.CONSTANTS.NODE_ADMIN?\"AdminNode\":\"Node\",a={headers:{\"User-Agent\":\"Firebase/\"+u.PROTOCOL_VERSION+\"/\"+i.default.SDK_VERSION+\"/\"+e.platform+\"/\"+o}},s=e.env,c=0==this.connURL.indexOf(\"wss://\")?s.HTTPS_PROXY||s.https_proxy:s.HTTP_PROXY||s.http_proxy;c&&(a.proxy={origin:c}),this.mySock=new d(this.connURL,[],a)}else this.mySock=new d(this.connURL)}catch(e){this.de(\"Error instantiating WebSocket.\");var f=e.message||e.data;return f&&this.de(f),void this.wn()}this.mySock.onopen=function(){r.de(\"Websocket connected.\"),r.bn=!0},this.mySock.onclose=function(){r.de(\"Websocket connection was disconnected.\"),r.mySock=null,r.wn()},this.mySock.onmessage=function(e){r.handleIncomingFrame(e)},this.mySock.onerror=function(e){r.de(\"WebSocket error.  Closing connection.\");var t=e.message||e.data;t&&r.de(t),r.wn()}},t.prototype.start=function(){},t.forceDisallow=function(){t.On=!0},t.isAvailable=function(){var e=!1;if(\"undefined\"!=typeof navigator&&navigator.userAgent){var n=/Android ([0-9]{0,}\\.[0-9]{0,})/,r=navigator.userAgent.match(n);r&&r.length>1&&parseFloat(r[1])<4.4&&(e=!0)}return!e&&null!==d&&!t.On},t.previouslyFailed=function(){return h.PersistentStorage.isInMemoryStorage||!0===h.PersistentStorage.get(\"previous_websocket_failure\")},t.prototype.markConnectionHealthy=function(){h.PersistentStorage.remove(\"previous_websocket_failure\")},t.prototype.xn=function(e){if(this.frames.push(e),this.frames.length==this.totalFrames){var t=this.frames.join(\"\");this.frames=null;var n=c.jsonEval(t);this.onMessage(n)}},t.prototype.kn=function(e){this.totalFrames=e,this.frames=[]},t.prototype.Wn=function(e){if(o.assert(null===this.frames,\"We already have a frame buffer\"),e.length<=6){var t=+e;if(!isNaN(t))return this.kn(t),null}return this.kn(1),e},t.prototype.handleIncomingFrame=function(e){if(null!==this.mySock){var t=e.data;if(this.bytesReceived+=t.length,this.$.incrementCounter(\"bytes_received\",t.length),this.resetKeepAlive(),null!==this.frames)this.xn(t);else{var n=this.Wn(t);null!==n&&this.xn(n)}}},t.prototype.send=function(e){this.resetKeepAlive();var t=c.stringify(e);this.bytesSent+=t.length,this.$.incrementCounter(\"bytes_sent\",t.length);var n=a.splitStringBySize(t,16384);n.length>1&&this.jn(n.length+\"\");for(var r=0;r<n.length;r++)this.jn(n[r])},t.prototype.An=function(){this.Sn=!0,this.keepaliveTimer&&(clearInterval(this.keepaliveTimer),this.keepaliveTimer=null),this.mySock&&(this.mySock.close(),this.mySock=null)},t.prototype.wn=function(){this.Sn||(this.de(\"WebSocket is closing itself\"),this.An(),this.onDisconnect&&(this.onDisconnect(this.bn),this.onDisconnect=null))},t.prototype.close=function(){this.Sn||(this.de(\"WebSocket is being closed\"),this.An())},t.prototype.resetKeepAlive=function(){var e=this;clearInterval(this.keepaliveTimer),this.keepaliveTimer=setInterval(function(){e.mySock&&e.jn(\"0\"),e.resetKeepAlive()},Math.floor(45e3))},t.prototype.jn=function(e){try{this.mySock.send(e)}catch(e){this.de(\"Exception thrown from WebSocket.send():\",e.message||e.data,\"Closing connection.\"),setTimeout(this.wn.bind(this),0)}},t.responsesRequiredToBeHealthy=2,t.healthyTimeout=3e4,t}();t.WebSocketConnection=f}).call(t,n(27))},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(){}return e.prototype.put=function(e,t,n,r){},e.prototype.merge=function(e,t,n,r){},e.prototype.refreshAuthToken=function(e){},e.prototype.onDisconnectPut=function(e,t,n){},e.prototype.onDisconnectMerge=function(e,t,n){},e.prototype.onDisconnectCancel=function(e,t){},e.prototype.reportStats=function(e){},e}();t.ServerActions=r},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(24),i=n(3),o=n(5),a=n(4),s=function(){function e(t){this.Vn=new r.IndexedFilter(t.getIndex()),this.me=t.getIndex(),this.Qn=e.qn(t),this.Un=e.Bn(t)}return e.prototype.getStartPost=function(){return this.Qn},e.prototype.getEndPost=function(){return this.Un},e.prototype.matches=function(e){return this.me.compare(this.getStartPost(),e)<=0&&this.me.compare(e,this.getEndPost())<=0},e.prototype.updateChild=function(e,t,n,r,i,s){return this.matches(new o.NamedNode(t,n))||(n=a.ChildrenNode.EMPTY_NODE),this.Vn.updateChild(e,t,n,r,i,s)},e.prototype.updateFullNode=function(e,t,n){t.isLeafNode()&&(t=a.ChildrenNode.EMPTY_NODE);var r=t.withIndex(this.me);r=r.updatePriority(a.ChildrenNode.EMPTY_NODE);var s=this;return t.forEachChild(i.PRIORITY_INDEX,function(e,t){s.matches(new o.NamedNode(e,t))||(r=r.updateImmediateChild(e,a.ChildrenNode.EMPTY_NODE))}),this.Vn.updateFullNode(e,r,n)},e.prototype.updatePriority=function(e,t){return e},e.prototype.filtersNodes=function(){return!0},e.prototype.getIndexedFilter=function(){return this.Vn},e.prototype.getIndex=function(){return this.me},e.qn=function(e){if(e.hasStart()){var t=e.getIndexStartName();return e.getIndex().makePost(e.getIndexStartValue(),t)}return e.getIndex().minPost()},e.Bn=function(e){if(e.hasEnd()){var t=e.getIndexEndName();return e.getIndex().makePost(e.getIndexEndValue(),t)}return e.getIndex().maxPost()},e}();t.RangedFilter=s},,,,,,,,,,,,,,,,,,,,,,function(e,t,n){e.exports=n(79)},function(e,t,n){\"use strict\";function r(t){var n=t.INTERNAL.registerService(\"database\",function(e,t,n){return l.RepoManager.getInstance().databaseFromApp(e,n)},{Reference:s.Reference,Query:a.Query,Database:o.Database,enableLogging:u.enableLogging,INTERNAL:h,ServerValue:d,TEST_ACCESS:c},null,!0);p.isNodeSdk()&&(e.exports=n)}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(6),o=n(32);t.Database=o.Database;var a=n(36);t.Query=a.Query;var s=n(21);t.Reference=s.Reference;var u=n(1);t.enableLogging=u.enableLogging;var l=n(26),h=n(111),c=n(112),p=n(0),d=o.Database.ServerValue;t.ServerValue=d,t.registerDatabase=r,r(i.default);var f=n(22);t.DataSnapshot=f.DataSnapshot;var _=n(35);t.OnDisconnect=_.OnDisconnect},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=function(){function e(e){this.Hn=e,this.Gn=\"firebase:\"}return e.prototype.set=function(e,t){null==t?this.Hn.removeItem(this.Kn(e)):this.Hn.setItem(this.Kn(e),r.stringify(t))},e.prototype.get=function(e){var t=this.Hn.getItem(this.Kn(e));return null==t?null:r.jsonEval(t)},e.prototype.remove=function(e){this.Hn.removeItem(this.Kn(e))},e.prototype.Kn=function(e){return this.Gn+e},e.prototype.toString=function(){return\"\"+this.Hn},e}();t.DOMStorageWrapper=i},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=function(){function e(){this.Yn={},this.isInMemoryStorage=!0}return e.prototype.set=function(e,t){null==t?delete this.Yn[e]:this.Yn[e]=t},e.prototype.get=function(e){return r.contains(this.Yn,e)?this.Yn[e]:null},e.prototype.remove=function(e){delete this.Yn[e]},e}();t.MemoryStorage=i},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=function(){function e(e,t){this.committed=e,this.snapshot=t}return e.prototype.toJSON=function(){return r.validateArgCount(\"TransactionResult.toJSON\",0,1,arguments.length),{committed:this.committed,snapshot:this.snapshot.toJSON()}},e}();t.TransactionResult=i},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0);t.nextPushId=function(){var e=\"-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\",t=0,n=[];return function(i){var o=i===t;t=i;var a,s=Array(8);for(a=7;a>=0;a--)s[a]=e.charAt(i%64),i=Math.floor(i/64);r.assert(0===i,\"Cannot push at time == 0\");var u=s.join(\"\");if(o){for(a=11;a>=0&&63===n[a];a--)n[a]=0;n[a]++}else for(a=0;a<12;a++)n[a]=Math.floor(64*Math.random());for(a=0;a<12;a++)u+=e.charAt(n[a]);return r.assert(20===u.length,\"nextPushId: Length should be 20.\"),u}}()},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(22),i=n(85),o=n(0),a=n(0),s=function(){function e(e,t,n){this.Xn=e,this.zn=t,this.Jn=n}return e.prototype.respondsTo=function(e){return\"value\"===e},e.prototype.createEvent=function(e,t){var n=t.getQueryParams().getIndex();return new i.DataEvent(\"value\",this,new r.DataSnapshot(e.snapshotNode,t.getRef(),n))},e.prototype.getEventRunner=function(e){var t=this.Jn;if(\"cancel\"===e.getEventType()){a.assert(this.zn,\"Raising a cancel event on a listener with no cancel callback\");var n=this.zn;return function(){n.call(t,e.error)}}var r=this.Xn;return function(){r.call(t,e.snapshot)}},e.prototype.createCancelEvent=function(e,t){return this.zn?new i.CancelEvent(this,e,t):null},e.prototype.matches=function(t){return t instanceof e&&(!t.Xn||!this.Xn||t.Xn===this.Xn&&t.Jn===this.Jn)},e.prototype.hasAnyCallback=function(){return null!==this.Xn},e}();t.ValueEventRegistration=s;var u=function(){function e(e,t,n){this.$n=e,this.zn=t,this.Jn=n}return e.prototype.respondsTo=function(e){var t=\"children_added\"===e?\"child_added\":e;return t=\"children_removed\"===t?\"child_removed\":t,o.contains(this.$n,t)},e.prototype.createCancelEvent=function(e,t){return this.zn?new i.CancelEvent(this,e,t):null},e.prototype.createEvent=function(e,t){a.assert(null!=e.childName,\"Child events should have a childName.\");var n=t.getRef().child(e.childName),o=t.getQueryParams().getIndex();return new i.DataEvent(e.type,this,new r.DataSnapshot(e.snapshotNode,n,o),e.prevName)},e.prototype.getEventRunner=function(e){var t=this.Jn;if(\"cancel\"===e.getEventType()){a.assert(this.zn,\"Raising a cancel event on a listener with no cancel callback\");var n=this.zn;return function(){n.call(t,e.error)}}var r=this.$n[e.eventType];return function(){r.call(t,e.snapshot,e.prevName)}},e.prototype.matches=function(t){if(t instanceof e){if(!this.$n||!t.$n)return!0;if(this.Jn===t.Jn){var n=o.getCount(t.$n);if(n===o.getCount(this.$n)){if(1===n){var r=o.getAnyKey(t.$n),i=o.getAnyKey(this.$n);return!(i!==r||t.$n[r]&&this.$n[i]&&t.$n[r]!==this.$n[i])}return o.every(this.$n,function(e,n){return t.$n[e]===n})}}}return!1},e.prototype.hasAnyCallback=function(){return null!==this.$n},e}();t.ChildEventRegistration=u},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=function(){function e(e,t,n,r){this.eventType=e,this.eventRegistration=t,this.snapshot=n,this.prevName=r}return e.prototype.getPath=function(){var e=this.snapshot.getRef();return\"value\"===this.eventType?e.path:e.getParent().path},e.prototype.getEventType=function(){return this.eventType},e.prototype.getEventRunner=function(){return this.eventRegistration.getEventRunner(this)},e.prototype.toString=function(){return this.getPath()+\":\"+this.eventType+\":\"+r.stringify(this.snapshot.exportVal())},e}();t.DataEvent=i;var o=function(){function e(e,t,n){this.eventRegistration=e,this.error=t,this.path=n}return e.prototype.getPath=function(){return this.path},e.prototype.getEventType=function(){return\"cancel\"},e.prototype.getEventRunner=function(){return this.eventRegistration.getEventRunner(this)},e.prototype.toString=function(){return this.path+\":cancel\"},e}();t.CancelEvent=o},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=n(1),o=n(87),a=n(4),s=n(0),u=n(23),l=n(88),h=n(89),c=n(8),p=n(46),d=n(2),f=n(47),_=n(95),y=function(){function e(e){this.Zn=e,this.er=u.ImmutableTree.Empty,this.tr=new _.WriteTree,this.nr={},this.rr={}}return e.prototype.applyUserOverwrite=function(e,t,n,r){return this.tr.addOverwrite(e,t,n,r),r?this.ir(new p.Overwrite(c.OperationSource.User,e,t)):[]},e.prototype.applyUserMerge=function(e,t,n){this.tr.addMerge(e,t,n);var r=u.ImmutableTree.fromObject(t);return this.ir(new h.Merge(c.OperationSource.User,e,r))},e.prototype.ackUserWrite=function(e,t){void 0===t&&(t=!1);var n=this.tr.getWrite(e);if(this.tr.removeWrite(e)){var r=u.ImmutableTree.Empty;return null!=n.snap?r=r.set(d.Path.Empty,!0):s.forEach(n.children,function(e,t){r=r.set(new d.Path(e),t)}),this.ir(new o.AckUserWrite(n.path,r,t))}return[]},e.prototype.applyServerOverwrite=function(e,t){return this.ir(new p.Overwrite(c.OperationSource.Server,e,t))},e.prototype.applyServerMerge=function(e,t){var n=u.ImmutableTree.fromObject(t);return this.ir(new h.Merge(c.OperationSource.Server,e,n))},e.prototype.applyListenComplete=function(e){return this.ir(new l.ListenComplete(c.OperationSource.Server,e))},e.prototype.applyTaggedQueryOverwrite=function(t,n,r){var i=this.or(r);if(null!=i){var o=e.ar(i),a=o.path,s=o.queryId,u=d.Path.relativePath(a,t),l=new p.Overwrite(c.OperationSource.forServerTaggedQuery(s),u,n);return this.sr(a,l)}return[]},e.prototype.applyTaggedQueryMerge=function(t,n,r){var i=this.or(r);if(i){var o=e.ar(i),a=o.path,s=o.queryId,l=d.Path.relativePath(a,t),p=u.ImmutableTree.fromObject(n),f=new h.Merge(c.OperationSource.forServerTaggedQuery(s),l,p);return this.sr(a,f)}return[]},e.prototype.applyTaggedListenComplete=function(t,n){var r=this.or(n);if(r){var i=e.ar(r),o=i.path,a=i.queryId,s=d.Path.relativePath(o,t),u=new l.ListenComplete(c.OperationSource.forServerTaggedQuery(a),s);return this.sr(o,u)}return[]},e.prototype.addEventRegistration=function(t,n){var i=t.path,o=null,s=!1;this.er.foreachOnPath(i,function(e,t){var n=d.Path.relativePath(e,i);o=o||t.getCompleteServerCache(n),s=s||t.hasCompleteView()});var u=this.er.get(i);u?(s=s||u.hasCompleteView(),o=o||u.getCompleteServerCache(d.Path.Empty)):(u=new f.SyncPoint,this.er=this.er.set(i,u));var l;null!=o?l=!0:(l=!1,o=a.ChildrenNode.EMPTY_NODE,this.er.subtree(i).foreachChild(function(e,t){var n=t.getCompleteServerCache(d.Path.Empty);n&&(o=o.updateImmediateChild(e,n))}));var h=u.viewExistsForQuery(t);if(!h&&!t.getQueryParams().loadsAllData()){var c=e.ur(t);r.assert(!(c in this.rr),\"View does not exist, but we have a tag\");var p=e.lr();this.rr[c]=p,this.nr[\"_\"+p]=c}var _=this.tr.childWrites(i),y=u.addEventRegistration(t,n,_,o,l);if(!h&&!s){var v=u.viewForQuery(t);y=y.concat(this.hr(t,v))}return y},e.prototype.removeEventRegistration=function(t,n,r){var i=this,o=t.path,a=this.er.get(o),s=[];if(a&&(\"default\"===t.queryIdentifier()||a.viewExistsForQuery(t))){var u=a.removeEventRegistration(t,n,r);a.isEmpty()&&(this.er=this.er.remove(o));var l=u.removed;s=u.events;var h=-1!==l.findIndex(function(e){return e.getQueryParams().loadsAllData()}),c=this.er.findOnPath(o,function(e,t){return t.hasCompleteView()});if(h&&!c){var p=this.er.subtree(o);if(!p.isEmpty())for(var d=this.cr(p),f=0;f<d.length;++f){var _=d[f],y=_.getQuery(),v=this.pr(_);this.Zn.startListening(e.dr(y),this.fr(y),v.hashFn,v.onComplete)}}!c&&l.length>0&&!r&&(h?this.Zn.stopListening(e.dr(t),null):l.forEach(function(t){var n=i.rr[e.ur(t)];i.Zn.stopListening(e.dr(t),n)})),this._r(l)}return s},e.prototype.calcCompleteEventCache=function(e,t){var n=this.tr,r=this.er.findOnPath(e,function(t,n){var r=d.Path.relativePath(t,e),i=n.getCompleteServerCache(r);if(i)return i});return n.calcCompleteEventCache(e,r,t,!0)},e.prototype.cr=function(e){return e.fold(function(e,t,n){if(t&&t.hasCompleteView())return[t.getCompleteView()];var r=[];return t&&(r=t.getQueryViews()),s.forEach(n,function(e,t){r=r.concat(t)}),r})},e.prototype._r=function(t){for(var n=0;n<t.length;++n){var r=t[n];if(!r.getQueryParams().loadsAllData()){var i=e.ur(r),o=this.rr[i];delete this.rr[i],delete this.nr[\"_\"+o]}}},e.dr=function(e){return e.getQueryParams().loadsAllData()&&!e.getQueryParams().isDefault()?e.getRef():e},e.prototype.hr=function(t,n){var i=t.path,o=this.fr(t),a=this.pr(n),u=this.Zn.startListening(e.dr(t),o,a.hashFn,a.onComplete),l=this.er.subtree(i);if(o)r.assert(!l.value.hasCompleteView(),\"If we're adding a query, it shouldn't be shadowed\");else for(var h=l.fold(function(e,t,n){if(!e.isEmpty()&&t&&t.hasCompleteView())return[t.getCompleteView().getQuery()];var r=[];return t&&(r=r.concat(t.getQueryViews().map(function(e){return e.getQuery()}))),s.forEach(n,function(e,t){r=r.concat(t)}),r}),c=0;c<h.length;++c){var p=h[c];this.Zn.stopListening(e.dr(p),this.fr(p))}return u},e.prototype.pr=function(e){var t=this,n=e.getQuery(),r=this.fr(n);return{hashFn:function(){return(e.getServerCache()||a.ChildrenNode.EMPTY_NODE).hash()},onComplete:function(e){if(\"ok\"===e)return r?t.applyTaggedListenComplete(n.path,r):t.applyListenComplete(n.path);var o=i.errorForServerCode(e,n);return t.removeEventRegistration(n,null,o)}}},e.ur=function(e){return e.path+\"$\"+e.queryIdentifier()},e.ar=function(e){var t=e.indexOf(\"$\");return r.assert(-1!==t&&t<e.length-1,\"Bad queryKey.\"),{queryId:e.substr(t+1),path:new d.Path(e.substr(0,t))}},e.prototype.or=function(e){return this.nr[\"_\"+e]},e.prototype.fr=function(t){var n=e.ur(t);return s.safeGet(this.rr,n)},e.lr=function(){return e.yr++},e.prototype.sr=function(e,t){var n=this.er.get(e);r.assert(n,\"Missing sync point for query tag that we're tracking\");var i=this.tr.childWrites(e);return n.applyOperation(t,i,null)},e.prototype.ir=function(e){return this.vr(e,this.er,null,this.tr.childWrites(d.Path.Empty))},e.prototype.vr=function(e,t,n,r){if(e.path.isEmpty())return this.gr(e,t,n,r);var i=t.get(d.Path.Empty);null==n&&null!=i&&(n=i.getCompleteServerCache(d.Path.Empty));var o=[],a=e.path.getFront(),s=e.operationForChild(a),u=t.children.get(a);if(u&&s){var l=n?n.getImmediateChild(a):null,h=r.child(a);o=o.concat(this.vr(s,u,l,h))}return i&&(o=o.concat(i.applyOperation(e,r,n))),o},e.prototype.gr=function(e,t,n,r){var i=this,o=t.get(d.Path.Empty);null==n&&null!=o&&(n=o.getCompleteServerCache(d.Path.Empty));var a=[];return t.children.inorderTraversal(function(t,o){var s=n?n.getImmediateChild(t):null,u=r.child(t),l=e.operationForChild(t);l&&(a=a.concat(i.gr(l,o,s,u)))}),o&&(a=a.concat(o.applyOperation(e,r,n))),a},e.yr=1,e}();t.SyncTree=y},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=n(2),o=n(8),a=function(){function e(e,t,n){this.path=e,this.affectedTree=t,this.revert=n,this.type=o.OperationType.ACK_USER_WRITE,this.source=o.OperationSource.User}return e.prototype.operationForChild=function(t){if(this.path.isEmpty()){if(null!=this.affectedTree.value)return r.assert(this.affectedTree.children.isEmpty(),\"affectedTree should not have overlapping affected paths.\"),this;var n=this.affectedTree.subtree(new i.Path(t));return new e(i.Path.Empty,n,this.revert)}return r.assert(this.path.getFront()===t,\"operationForChild called for unrelated child.\"),new e(this.path.popFront(),this.affectedTree,this.revert)},e}();t.AckUserWrite=a},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(2),i=n(8),o=function(){function e(e,t){this.source=e,this.path=t,this.type=i.OperationType.LISTEN_COMPLETE}return e.prototype.operationForChild=function(t){return this.path.isEmpty()?new e(this.source,r.Path.Empty):new e(this.source,this.path.popFront())},e}();t.ListenComplete=o},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(8),i=n(46),o=n(2),a=n(0),s=function(){function e(e,t,n){this.source=e,this.path=t,this.children=n,this.type=r.OperationType.MERGE}return e.prototype.operationForChild=function(t){if(this.path.isEmpty()){var n=this.children.subtree(new o.Path(t));return n.isEmpty()?null:n.value?new i.Overwrite(this.source,o.Path.Empty,n.value):new e(this.source,o.Path.Empty,n)}return a.assert(this.path.getFront()===t,\"Can't get a merge for a child not on the path of the operation\"),new e(this.source,this.path.popFront(),this.children)},e.prototype.toString=function(){return\"Operation(\"+this.path+\": \"+this.source+\" merge: \"+this.children+\")\"},e}();t.Merge=s},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(24),i=n(91),o=n(4),a=n(19),s=n(48),u=n(94),l=n(0),h=n(8),c=n(9),p=n(3),d=function(){function e(e,t){this.mr=e,this.Cr=[];var n=this.mr.getQueryParams(),l=new r.IndexedFilter(n.getIndex()),h=n.getNodeFilter();this.Er=new i.ViewProcessor(h);var c=t.getServerCache(),p=t.getEventCache(),d=l.updateFullNode(o.ChildrenNode.EMPTY_NODE,c.getNode(),null),f=h.updateFullNode(o.ChildrenNode.EMPTY_NODE,p.getNode(),null),_=new a.CacheNode(d,c.isFullyInitialized(),l.filtersNodes()),y=new a.CacheNode(f,p.isFullyInitialized(),h.filtersNodes());this.Nr=new s.ViewCache(y,_),this.Pr=new u.EventGenerator(this.mr)}return e.prototype.getQuery=function(){return this.mr},e.prototype.getServerCache=function(){return this.Nr.getServerCache().getNode()},e.prototype.getCompleteServerCache=function(e){var t=this.Nr.getCompleteServerSnap();return t&&(this.mr.getQueryParams().loadsAllData()||!e.isEmpty()&&!t.getImmediateChild(e.getFront()).isEmpty())?t.getChild(e):null},e.prototype.isEmpty=function(){return 0===this.Cr.length},e.prototype.addEventRegistration=function(e){this.Cr.push(e)},e.prototype.removeEventRegistration=function(e,t){var n=[];if(t){l.assert(null==e,\"A cancel should cancel all event registrations.\");var r=this.mr.path;this.Cr.forEach(function(e){t=t;var i=e.createCancelEvent(t,r);i&&n.push(i)})}if(e){for(var i=[],o=0;o<this.Cr.length;++o){var a=this.Cr[o];if(a.matches(e)){if(e.hasAnyCallback()){i=i.concat(this.Cr.slice(o+1));break}}else i.push(a)}this.Cr=i}else this.Cr=[];return n},e.prototype.applyOperation=function(e,t,n){e.type===h.OperationType.MERGE&&null!==e.source.queryId&&(l.assert(this.Nr.getCompleteServerSnap(),\"We should always have a full cache before handling merges\"),l.assert(this.Nr.getCompleteEventSnap(),\"Missing event cache, even though we have a server cache\"));var r=this.Nr,i=this.Er.applyOperation(r,e,t,n);return this.Er.assertIndexed(i.viewCache),l.assert(i.viewCache.getServerCache().isFullyInitialized()||!r.getServerCache().isFullyInitialized(),\"Once a server snap is complete, it should never go back\"),this.Nr=i.viewCache,this.br(i.changes,i.viewCache.getEventCache().getNode(),null)},e.prototype.getInitialEvents=function(e){var t=this.Nr.getEventCache(),n=[];return t.getNode().isLeafNode()||t.getNode().forEachChild(p.PRIORITY_INDEX,function(e,t){n.push(c.Change.childAddedChange(e,t))}),t.isFullyInitialized()&&n.push(c.Change.valueChange(t.getNode())),this.br(n,t.getNode(),e)},e.prototype.br=function(e,t,n){var r=n?[n]:this.Cr;return this.Pr.generateEventsForChanges(e,t,r)},e}();t.View=d},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(8),i=n(0),o=n(92),a=n(9),s=n(4),u=n(10),l=n(23),h=n(2),c=n(93),p=function(){function e(e,t){this.viewCache=e,this.changes=t}return e}();t.ProcessorResult=p;var d=function(){function e(e){this.Sr=e}return e.prototype.assertIndexed=function(e){i.assert(e.getEventCache().getNode().isIndexed(this.Sr.getIndex()),\"Event snap not indexed\"),i.assert(e.getServerCache().getNode().isIndexed(this.Sr.getIndex()),\"Server snap not indexed\")},e.prototype.applyOperation=function(t,n,a,s){var u,l,h=new o.ChildChangeAccumulator;if(n.type===r.OperationType.OVERWRITE){var c=n;c.source.fromUser?u=this.Tr(t,c.path,c.snap,a,s,h):(i.assert(c.source.fromServer,\"Unknown source.\"),l=c.source.tagged||t.getServerCache().isFiltered()&&!c.path.isEmpty(),u=this.wr(t,c.path,c.snap,a,s,l,h))}else if(n.type===r.OperationType.MERGE){var d=n;d.source.fromUser?u=this.Ir(t,d.path,d.children,a,s,h):(i.assert(d.source.fromServer,\"Unknown source.\"),l=d.source.tagged||t.getServerCache().isFiltered(),u=this.Rr(t,d.path,d.children,a,s,l,h))}else if(n.type===r.OperationType.ACK_USER_WRITE){var f=n;u=f.revert?this.Or(t,f.path,a,s,h):this.Ar(t,f.path,f.affectedTree,a,s,h)}else{if(n.type!==r.OperationType.LISTEN_COMPLETE)throw i.assertionError(\"Unknown operation type: \"+n.type);u=this.Dr(t,n.path,a,h)}var _=h.getChanges();return e.Mr(t,u,_),new p(u,_)},e.Mr=function(e,t,n){var r=t.getEventCache();if(r.isFullyInitialized()){var i=r.getNode().isLeafNode()||r.getNode().isEmpty(),o=e.getCompleteEventSnap();(n.length>0||!e.getEventCache().isFullyInitialized()||i&&!r.getNode().equals(o)||!r.getNode().getPriority().equals(o.getPriority()))&&n.push(a.Change.valueChange(t.getCompleteEventSnap()))}},e.prototype.Lr=function(e,t,n,r,o){var a=e.getEventCache();if(null!=n.shadowingWrite(t))return e;var u=void 0,l=void 0;if(t.isEmpty())if(i.assert(e.getServerCache().isFullyInitialized(),\"If change path is empty, we must have complete server data\"),e.getServerCache().isFiltered()){var h=e.getCompleteServerSnap(),c=h instanceof s.ChildrenNode?h:s.ChildrenNode.EMPTY_NODE,p=n.calcCompleteEventChildren(c);u=this.Sr.updateFullNode(e.getEventCache().getNode(),p,o)}else{var d=n.calcCompleteEventCache(e.getCompleteServerSnap());u=this.Sr.updateFullNode(e.getEventCache().getNode(),d,o)}else{var f=t.getFront();if(\".priority\"==f){i.assert(1==t.getLength(),\"Can't have a priority with additional path components\");var _=a.getNode();l=e.getServerCache().getNode();var y=n.calcEventCacheAfterServerOverwrite(t,_,l);u=null!=y?this.Sr.updatePriority(_,y):a.getNode()}else{var v=t.popFront(),g=void 0;if(a.isCompleteForChild(f)){l=e.getServerCache().getNode();var m=n.calcEventCacheAfterServerOverwrite(t,a.getNode(),l);g=null!=m?a.getNode().getImmediateChild(f).updateChild(v,m):a.getNode().getImmediateChild(f)}else g=n.calcCompleteChild(f,e.getServerCache());u=null!=g?this.Sr.updateChild(a.getNode(),f,g,v,r,o):a.getNode()}}return e.updateEventSnap(u,a.isFullyInitialized()||t.isEmpty(),this.Sr.filtersNodes())},e.prototype.wr=function(e,t,n,r,i,o,a){var s,u=e.getServerCache(),l=o?this.Sr:this.Sr.getIndexedFilter();if(t.isEmpty())s=l.updateFullNode(u.getNode(),n,null);else if(l.filtersNodes()&&!u.isFiltered()){var h=u.getNode().updateChild(t,n);s=l.updateFullNode(u.getNode(),h,null)}else{var p=t.getFront();if(!u.isCompleteForPath(t)&&t.getLength()>1)return e;var d=t.popFront(),f=u.getNode().getImmediateChild(p),_=f.updateChild(d,n);s=\".priority\"==p?l.updatePriority(u.getNode(),_):l.updateChild(u.getNode(),p,_,d,c.NO_COMPLETE_CHILD_SOURCE,null)}var y=e.updateServerSnap(s,u.isFullyInitialized()||t.isEmpty(),l.filtersNodes()),v=new c.WriteTreeCompleteChildSource(r,y,i);return this.Lr(y,t,r,v,a)},e.prototype.Tr=function(e,t,n,r,i,o){var a,u,l=e.getEventCache(),h=new c.WriteTreeCompleteChildSource(r,e,i);if(t.isEmpty())u=this.Sr.updateFullNode(e.getEventCache().getNode(),n,o),a=e.updateEventSnap(u,!0,this.Sr.filtersNodes());else{var p=t.getFront();if(\".priority\"===p)u=this.Sr.updatePriority(e.getEventCache().getNode(),n),a=e.updateEventSnap(u,l.isFullyInitialized(),l.isFiltered());else{var d=t.popFront(),f=l.getNode().getImmediateChild(p),_=void 0;if(d.isEmpty())_=n;else{var y=h.getCompleteChild(p);_=null!=y?\".priority\"===d.getBack()&&y.getChild(d.parent()).isEmpty()?y:y.updateChild(d,n):s.ChildrenNode.EMPTY_NODE}if(f.equals(_))a=e;else{var v=this.Sr.updateChild(l.getNode(),p,_,d,h,o);a=e.updateEventSnap(v,l.isFullyInitialized(),this.Sr.filtersNodes())}}}return a},e.Fr=function(e,t){return e.getEventCache().isCompleteForChild(t)},e.prototype.Ir=function(t,n,r,i,o,a){var s=this,u=t;return r.foreach(function(r,l){var h=n.child(r);e.Fr(t,h.getFront())&&(u=s.Tr(u,h,l,i,o,a))}),r.foreach(function(r,l){var h=n.child(r);e.Fr(t,h.getFront())||(u=s.Tr(u,h,l,i,o,a))}),u},e.prototype.xr=function(e,t){return t.foreach(function(t,n){e=e.updateChild(t,n)}),e},e.prototype.Rr=function(e,t,n,r,i,o,a){var s=this;if(e.getServerCache().getNode().isEmpty()&&!e.getServerCache().isFullyInitialized())return e;var u,c=e;u=t.isEmpty()?n:l.ImmutableTree.Empty.setTree(t,n);var p=e.getServerCache().getNode();return u.children.inorderTraversal(function(t,n){if(p.hasChild(t)){var u=e.getServerCache().getNode().getImmediateChild(t),l=s.xr(u,n);c=s.wr(c,new h.Path(t),l,r,i,o,a)}}),u.children.inorderTraversal(function(t,n){var u=!e.getServerCache().isCompleteForChild(t)&&null==n.value;if(!p.hasChild(t)&&!u){var l=e.getServerCache().getNode().getImmediateChild(t),d=s.xr(l,n);c=s.wr(c,new h.Path(t),d,r,i,o,a)}}),c},e.prototype.Ar=function(e,t,n,r,i,o){if(null!=r.shadowingWrite(t))return e;var a=e.getServerCache().isFiltered(),s=e.getServerCache();if(null!=n.value){if(t.isEmpty()&&s.isFullyInitialized()||s.isCompleteForPath(t))return this.wr(e,t,s.getNode().getChild(t),r,i,a,o);if(t.isEmpty()){var c=l.ImmutableTree.Empty;return s.getNode().forEachChild(u.KEY_INDEX,function(e,t){c=c.set(new h.Path(e),t)}),this.Rr(e,t,c,r,i,a,o)}return e}var p=l.ImmutableTree.Empty;return n.foreach(function(e,n){var r=t.child(e);s.isCompleteForPath(r)&&(p=p.set(e,s.getNode().getChild(r)))}),this.Rr(e,t,p,r,i,a,o)},e.prototype.Dr=function(e,t,n,r){var i=e.getServerCache(),o=e.updateServerSnap(i.getNode(),i.isFullyInitialized()||t.isEmpty(),i.isFiltered());return this.Lr(o,t,n,c.NO_COMPLETE_CHILD_SOURCE,r)},e.prototype.Or=function(e,t,n,r,o){var a;if(null!=n.shadowingWrite(t))return e;var u=new c.WriteTreeCompleteChildSource(n,e,r),l=e.getEventCache().getNode(),p=void 0;if(t.isEmpty()||\".priority\"===t.getFront()){var d=void 0;if(e.getServerCache().isFullyInitialized())d=n.calcCompleteEventCache(e.getCompleteServerSnap());else{var f=e.getServerCache().getNode();i.assert(f instanceof s.ChildrenNode,\"serverChildren would be complete if leaf node\"),d=n.calcCompleteEventChildren(f)}d=d,p=this.Sr.updateFullNode(l,d,o)}else{var _=t.getFront(),y=n.calcCompleteChild(_,e.getServerCache());null==y&&e.getServerCache().isCompleteForChild(_)&&(y=l.getImmediateChild(_)),p=null!=y?this.Sr.updateChild(l,_,y,t.popFront(),u,o):e.getEventCache().getNode().hasChild(_)?this.Sr.updateChild(l,_,s.ChildrenNode.EMPTY_NODE,t.popFront(),u,o):l,p.isEmpty()&&e.getServerCache().isFullyInitialized()&&(a=n.calcCompleteEventCache(e.getCompleteServerSnap()),a.isLeafNode()&&(p=this.Sr.updateFullNode(p,a,o)))}return a=e.getServerCache().isFullyInitialized()||null!=n.shadowingWrite(h.Path.Empty),e.updateEventSnap(p,a,this.Sr.filtersNodes())},e}();t.ViewProcessor=d},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=n(9),o=n(0),a=function(){function e(){this.kr={}}return e.prototype.trackChildChange=function(e){var t=e.type,n=e.childName;o.assert(t==i.Change.CHILD_ADDED||t==i.Change.CHILD_CHANGED||t==i.Change.CHILD_REMOVED,\"Only child changes supported for tracking\"),o.assert(\".priority\"!==n,\"Only non-priority child changes can be tracked.\");var a=r.safeGet(this.kr,n);if(a){var s=a.type;if(t==i.Change.CHILD_ADDED&&s==i.Change.CHILD_REMOVED)this.kr[n]=i.Change.childChangedChange(n,e.snapshotNode,a.snapshotNode);else if(t==i.Change.CHILD_REMOVED&&s==i.Change.CHILD_ADDED)delete this.kr[n];else if(t==i.Change.CHILD_REMOVED&&s==i.Change.CHILD_CHANGED)this.kr[n]=i.Change.childRemovedChange(n,a.oldSnap);else if(t==i.Change.CHILD_CHANGED&&s==i.Change.CHILD_ADDED)this.kr[n]=i.Change.childAddedChange(n,e.snapshotNode);else{if(t!=i.Change.CHILD_CHANGED||s!=i.Change.CHILD_CHANGED)throw o.assertionError(\"Illegal combination of changes: \"+e+\" occurred after \"+a);this.kr[n]=i.Change.childChangedChange(n,e.snapshotNode,a.oldSnap)}}else this.kr[n]=e},e.prototype.getChanges=function(){return r.getValues(this.kr)},e}();t.ChildChangeAccumulator=a},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(19),i=function(){function e(){}return e.prototype.getCompleteChild=function(e){return null},e.prototype.getChildAfterChild=function(e,t,n){return null},e}();t.Wr=i,t.NO_COMPLETE_CHILD_SOURCE=new i;var o=function(){function e(e,t,n){void 0===n&&(n=null),this.jr=e,this.Nr=t,this.Vr=n}return e.prototype.getCompleteChild=function(e){var t=this.Nr.getEventCache();if(t.isCompleteForChild(e))return t.getNode().getImmediateChild(e);var n=null!=this.Vr?new r.CacheNode(this.Vr,!0,!1):this.Nr.getServerCache();return this.jr.calcCompleteChild(e,n)},e.prototype.getChildAfterChild=function(e,t,n){var r=null!=this.Vr?this.Vr:this.Nr.getCompleteServerSnap(),i=this.jr.calcIndexedSlice(r,t,1,n,e);return 0===i.length?null:i[0]},e}();t.WriteTreeCompleteChildSource=o},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(5),i=n(9),o=n(0),a=function(){function e(e){this.mr=e,this.me=this.mr.getQueryParams().getIndex()}return e.prototype.generateEventsForChanges=function(e,t,n){var r=this,o=[],a=[];return e.forEach(function(e){e.type===i.Change.CHILD_CHANGED&&r.me.indexedValueChanged(e.oldSnap,e.snapshotNode)&&a.push(i.Change.childMovedChange(e.childName,e.snapshotNode))}),this.Qr(o,i.Change.CHILD_REMOVED,e,n,t),this.Qr(o,i.Change.CHILD_ADDED,e,n,t),this.Qr(o,i.Change.CHILD_MOVED,a,n,t),this.Qr(o,i.Change.CHILD_CHANGED,e,n,t),this.Qr(o,i.Change.VALUE,e,n,t),o},e.prototype.Qr=function(e,t,n,r,i){var o=this,a=n.filter(function(e){return e.type===t});a.sort(this.qr.bind(this)),a.forEach(function(t){var n=o.Ur(t,i);r.forEach(function(r){r.respondsTo(t.type)&&e.push(r.createEvent(n,o.mr))})})},e.prototype.Ur=function(e,t){return\"value\"===e.type||\"child_removed\"===e.type?e:(e.prevName=t.getPredecessorChildName(e.childName,e.snapshotNode,this.me),e)},e.prototype.qr=function(e,t){if(null==e.childName||null==t.childName)throw o.assertionError(\"Should only compare child_ events.\");var n=new r.NamedNode(e.childName,e.snapshotNode),i=new r.NamedNode(t.childName,t.snapshotNode);return this.me.compare(n,i)},e}();t.EventGenerator=a},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=n(0),o=n(2),a=n(96),s=n(3),u=n(4),l=function(){function e(){this.Br=a.CompoundWrite.Empty,this.Hr=[],this.Gr=-1}return e.prototype.childWrites=function(e){return new h(e,this)},e.prototype.addOverwrite=function(e,t,n,r){i.assert(n>this.Gr,\"Stacking an older write on top of newer ones\"),void 0===r&&(r=!0),this.Hr.push({path:e,snap:t,writeId:n,visible:r}),r&&(this.Br=this.Br.addWrite(e,t)),this.Gr=n},e.prototype.addMerge=function(e,t,n){i.assert(n>this.Gr,\"Stacking an older merge on top of newer ones\"),this.Hr.push({path:e,children:t,writeId:n,visible:!0}),this.Br=this.Br.addWrites(e,t),this.Gr=n},e.prototype.getWrite=function(e){for(var t=0;t<this.Hr.length;t++){var n=this.Hr[t];if(n.writeId===e)return n}return null},e.prototype.removeWrite=function(e){var t=this,n=this.Hr.findIndex(function(t){return t.writeId===e});i.assert(n>=0,\"removeWrite called with nonexistent writeId.\");var o=this.Hr[n];this.Hr.splice(n,1);for(var a=o.visible,s=!1,u=this.Hr.length-1;a&&u>=0;){var l=this.Hr[u];l.visible&&(u>=n&&this.Kr(l,o.path)?a=!1:o.path.contains(l.path)&&(s=!0)),u--}if(a){if(s)return this.Yr(),!0;if(o.snap)this.Br=this.Br.removeWrite(o.path);else{var h=o.children;r.forEach(h,function(e){t.Br=t.Br.removeWrite(o.path.child(e))})}return!0}return!1},e.prototype.getCompleteWriteData=function(e){return this.Br.getCompleteNode(e)},e.prototype.calcCompleteEventCache=function(t,n,r,i){if(r||i){var a=this.Br.childCompoundWrite(t);if(!i&&a.isEmpty())return n;if(i||null!=n||a.hasCompleteWrite(o.Path.Empty)){var s=function(e){return(e.visible||i)&&(!r||!~r.indexOf(e.writeId))&&(e.path.contains(t)||t.contains(e.path))},l=e.Xr(this.Hr,s,t),h=n||u.ChildrenNode.EMPTY_NODE;return l.apply(h)}return null}var c=this.Br.getCompleteNode(t);if(null!=c)return c;var p=this.Br.childCompoundWrite(t);if(p.isEmpty())return n;if(null!=n||p.hasCompleteWrite(o.Path.Empty)){var h=n||u.ChildrenNode.EMPTY_NODE;return p.apply(h)}return null},e.prototype.calcCompleteEventChildren=function(e,t){var n=u.ChildrenNode.EMPTY_NODE,r=this.Br.getCompleteNode(e);if(r)return r.isLeafNode()||r.forEachChild(s.PRIORITY_INDEX,function(e,t){n=n.updateImmediateChild(e,t)}),n;if(t){var i=this.Br.childCompoundWrite(e);return t.forEachChild(s.PRIORITY_INDEX,function(e,t){var r=i.childCompoundWrite(new o.Path(e)).apply(t);n=n.updateImmediateChild(e,r)}),i.getCompleteChildren().forEach(function(e){n=n.updateImmediateChild(e.name,e.node)}),n}return this.Br.childCompoundWrite(e).getCompleteChildren().forEach(function(e){n=n.updateImmediateChild(e.name,e.node)}),n},e.prototype.calcEventCacheAfterServerOverwrite=function(e,t,n,r){i.assert(n||r,\"Either existingEventSnap or existingServerSnap must exist\");var o=e.child(t);if(this.Br.hasCompleteWrite(o))return null;var a=this.Br.childCompoundWrite(o);return a.isEmpty()?r.getChild(t):a.apply(r.getChild(t))},e.prototype.calcCompleteChild=function(e,t,n){var r=e.child(t),i=this.Br.getCompleteNode(r);return null!=i?i:n.isCompleteForChild(t)?this.Br.childCompoundWrite(r).apply(n.getNode().getImmediateChild(t)):null},e.prototype.shadowingWrite=function(e){return this.Br.getCompleteNode(e)},e.prototype.calcIndexedSlice=function(e,t,n,r,i,a){var s,u=this.Br.childCompoundWrite(e),l=u.getCompleteNode(o.Path.Empty);if(null!=l)s=l;else{if(null==t)return[];s=u.apply(t)}if(s=s.withIndex(a),s.isEmpty()||s.isLeafNode())return[];for(var h=[],c=a.getCompare(),p=i?s.getReverseIteratorFrom(n,a):s.getIteratorFrom(n,a),d=p.getNext();d&&h.length<r;)0!==c(d,n)&&h.push(d),d=p.getNext();return h},e.prototype.Kr=function(e,t){return e.snap?e.path.contains(t):!!r.findKey(e.children,function(n,r){return e.path.child(r).contains(t)})},e.prototype.Yr=function(){this.Br=e.Xr(this.Hr,e.zr,o.Path.Empty),this.Hr.length>0?this.Gr=this.Hr[this.Hr.length-1].writeId:this.Gr=-1},e.zr=function(e){return e.visible},e.Xr=function(e,t,n){for(var s=a.CompoundWrite.Empty,u=0;u<e.length;++u){var l=e[u];if(t(l)){var h=l.path,c=void 0;if(l.snap)n.contains(h)?(c=o.Path.relativePath(n,h),s=s.addWrite(c,l.snap)):h.contains(n)&&(c=o.Path.relativePath(h,n),s=s.addWrite(o.Path.Empty,l.snap.getChild(c)));else{if(!l.children)throw i.assertionError(\"WriteRecord should have .snap or .children\");if(n.contains(h))c=o.Path.relativePath(n,h),s=s.addWrites(c,l.children);else if(h.contains(n))if(c=o.Path.relativePath(h,n),c.isEmpty())s=s.addWrites(o.Path.Empty,l.children);else{var p=r.safeGet(l.children,c.getFront());if(p){var d=p.getChild(c.popFront());s=s.addWrite(o.Path.Empty,d)}}}}}return s},e}();t.WriteTree=l;var h=function(){function e(e,t){this.Jr=e,this.$r=t}return e.prototype.calcCompleteEventCache=function(e,t,n){return this.$r.calcCompleteEventCache(this.Jr,e,t,n)},e.prototype.calcCompleteEventChildren=function(e){return this.$r.calcCompleteEventChildren(this.Jr,e)},e.prototype.calcEventCacheAfterServerOverwrite=function(e,t,n){return this.$r.calcEventCacheAfterServerOverwrite(this.Jr,e,t,n)},e.prototype.shadowingWrite=function(e){return this.$r.shadowingWrite(this.Jr.child(e))},e.prototype.calcIndexedSlice=function(e,t,n,r,i){return this.$r.calcIndexedSlice(this.Jr,e,t,n,r,i)},e.prototype.calcCompleteChild=function(e,t){return this.$r.calcCompleteChild(this.Jr,e,t)},e.prototype.child=function(t){return new e(this.Jr.child(t),this.$r)},e}();t.WriteTreeRef=h},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(23),i=n(2),o=n(0),a=n(5),s=n(3),u=n(0),l=function(){function e(e){this.$r=e}return e.prototype.addWrite=function(t,n){if(t.isEmpty())return new e(new r.ImmutableTree(n));var o=this.$r.findRootMostValueAndPath(t);if(null!=o){var a=o.path,s=o.value,u=i.Path.relativePath(a,t);return s=s.updateChild(u,n),new e(this.$r.set(a,s))}var l=new r.ImmutableTree(n);return new e(this.$r.setTree(t,l))},e.prototype.addWrites=function(e,t){var n=this;return o.forEach(t,function(t,r){n=n.addWrite(e.child(t),r)}),n},e.prototype.removeWrite=function(t){return t.isEmpty()?e.Empty:new e(this.$r.setTree(t,r.ImmutableTree.Empty))},e.prototype.hasCompleteWrite=function(e){return null!=this.getCompleteNode(e)},e.prototype.getCompleteNode=function(e){var t=this.$r.findRootMostValueAndPath(e);return null!=t?this.$r.get(t.path).getChild(i.Path.relativePath(t.path,e)):null},e.prototype.getCompleteChildren=function(){var e=[],t=this.$r.value;return null!=t?t.isLeafNode()||t.forEachChild(s.PRIORITY_INDEX,function(t,n){e.push(new a.NamedNode(t,n))}):this.$r.children.inorderTraversal(function(t,n){null!=n.value&&e.push(new a.NamedNode(t,n.value))}),e},e.prototype.childCompoundWrite=function(t){if(t.isEmpty())return this;var n=this.getCompleteNode(t);return new e(null!=n?new r.ImmutableTree(n):this.$r.subtree(t))},e.prototype.isEmpty=function(){return this.$r.isEmpty()},e.prototype.apply=function(t){return e.Zr(i.Path.Empty,this.$r,t)},e.Empty=new e(new r.ImmutableTree(null)),e.Zr=function(t,n,r){if(null!=n.value)return r.updateChild(t,n.value);var i=null;return n.children.inorderTraversal(function(n,o){\".priority\"===n?(u.assert(null!==o.value,\"Priority writes must always be leaf nodes\"),i=o.value):r=e.Zr(t.child(n),o,r)}),r.getChild(t).isEmpty()||null===i||(r=r.updateChild(t.child(\".priority\"),i)),r},e}();t.CompoundWrite=l},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(4),i=function(){function e(){this.ei=r.ChildrenNode.EMPTY_NODE}return e.prototype.getNode=function(e){return this.ei.getChild(e)},e.prototype.updateSnapshot=function(e,t){this.ei=this.ei.updateChild(e,t)},e}();t.SnapshotHolder=i},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(1),i=function(){function e(e){this.ti=e}return e.prototype.getToken=function(e){return this.ti.INTERNAL.getToken(e).then(null,function(e){return e&&\"auth/token-not-initialized\"===e.code?(r.log(\"Got auth/token-not-initialized error.  Treating as null token.\"),null):Promise.reject(e)})},e.prototype.addTokenChangeListener=function(e){this.ti.INTERNAL.addAuthTokenListener(e)},e.prototype.removeTokenChangeListener=function(e){this.ti.INTERNAL.removeAuthTokenListener(e)},e.prototype.notifyForInvalidToken=function(){var e='Provided authentication credentials for the app named \"'+this.ti.name+'\" are invalid. This usually indicates your app was not initialized correctly. ';\"credential\"in this.ti.options?e+='Make sure the \"credential\" property provided to initializeApp() is authorized to access the specified \"databaseURL\" and is from the correct project.':\"serviceAccount\"in this.ti.options?e+='Make sure the \"serviceAccount\" property provided to initializeApp() is authorized to access the specified \"databaseURL\" and is from the correct project.':e+='Make sure the \"apiKey\" and \"databaseURL\" properties provided to initializeApp() match the values provided for your app at https://console.firebase.google.com/.',r.warn(e)},e}();t.AuthTokenProvider=i},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=n(0),o=function(){function e(){this.ni={}}return e.prototype.incrementCounter=function(e,t){void 0===t&&(t=1),i.contains(this.ni,e)||(this.ni[e]=0),this.ni[e]+=t},e.prototype.get=function(){return r.deepCopy(this.ni)},e}();t.StatsCollection=o},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=n(1),o=n(49),a=1e4,s=3e4,u=function(){function e(e,t){this.Z=t,this.ri={},this.G=new o.StatsListener(e);var n=a+(s-a)*Math.random();i.setTimeoutNonBlocking(this.ii.bind(this),Math.floor(n))}return e.prototype.includeStat=function(e){this.ri[e]=!0},e.prototype.ii=function(){var e=this,t=this.G.get(),n={},o=!1;r.forEach(t,function(t,i){i>0&&r.contains(e.ri,t)&&(n[t]=i,o=!0)}),o&&this.Z.reportStats(n),i.setTimeoutNonBlocking(this.ii.bind(this),Math.floor(2*Math.random()*3e5))},e}();t.StatsReporter=u},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(1),i=function(){function e(){this.oi=[],this.ai=0}return e.prototype.queueEvents=function(e){for(var t=null,n=0;n<e.length;n++){var r=e[n],i=r.getPath();null===t||i.equals(t.getPath())||(this.oi.push(t),t=null),null===t&&(t=new o(i)),t.add(r)}t&&this.oi.push(t)},e.prototype.raiseEventsAtPath=function(e,t){this.queueEvents(t),this.si(function(t){return t.equals(e)})},e.prototype.raiseEventsForChangedPath=function(e,t){this.queueEvents(t),this.si(function(t){return t.contains(e)||e.contains(t)})},e.prototype.si=function(e){this.ai++;for(var t=!0,n=0;n<this.oi.length;n++){var r=this.oi[n];r&&(e(r.getPath())?(this.oi[n].raise(),this.oi[n]=null):t=!1)}t&&(this.oi=[]),this.ai--},e}();t.EventQueue=i;var o=function(){function e(e){this.Oe=e,this.ui=[]}return e.prototype.add=function(e){this.ui.push(e)},e.prototype.raise=function(){for(var e=0;e<this.ui.length;e++){var t=this.ui[e];if(null!==t){this.ui[e]=null;var n=t.getEventRunner();r.logger&&r.log(\"event: \"+t),r.exceptionGuard(n)}}},e.prototype.getPath=function(){return this.Oe},e}();t.EventList=o},function(e,t,n){\"use strict\";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(51),o=n(0),a=function(e){function t(){var t,n,r=e.call(this,[\"visible\"])||this;return\"undefined\"!=typeof document&&void 0!==document.addEventListener&&(void 0!==document.hidden?(n=\"visibilitychange\",t=\"hidden\"):void 0!==document.mozHidden?(n=\"mozvisibilitychange\",t=\"mozHidden\"):void 0!==document.msHidden?(n=\"msvisibilitychange\",t=\"msHidden\"):void 0!==document.webkitHidden&&(n=\"webkitvisibilitychange\",t=\"webkitHidden\")),r.at=!0,n&&document.addEventListener(n,function(){var e=!document[t];e!==r.at&&(r.at=e,r.trigger(\"visible\",e))},!1),r}return r(t,e),t.getInstance=function(){return new t},t.prototype.getInitialEvent=function(e){return o.assert(\"visible\"===e,\"Unknown event type: \"+e),[this.at]},t}(i.EventEmitter);t.VisibilityMonitor=a},function(e,t,n){\"use strict\";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(0),o=n(51),a=n(0),s=function(e){function t(){var t=e.call(this,[\"online\"])||this;return t.li=!0,\"undefined\"==typeof window||void 0===window.addEventListener||a.isMobileCordova()||(window.addEventListener(\"online\",function(){t.li||(t.li=!0,t.trigger(\"online\",!0))},!1),window.addEventListener(\"offline\",function(){t.li&&(t.li=!1,t.trigger(\"online\",!1))},!1)),t}return r(t,e),t.getInstance=function(){return new t},t.prototype.getInitialEvent=function(e){return i.assert(\"online\"===e,\"Unknown event type: \"+e),[this.li]},t.prototype.currentlyOnline=function(){return this.li},t}(o.EventEmitter);t.OnlineMonitor=s},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(53),i=n(54),o=n(1),a=function(){function e(e){this.hi(e)}return Object.defineProperty(e,\"ALL_TRANSPORTS\",{get:function(){return[r.BrowserPollConnection,i.WebSocketConnection]},enumerable:!0,configurable:!0}),e.prototype.hi=function(t){var n=i.WebSocketConnection&&i.WebSocketConnection.isAvailable(),r=n&&!i.WebSocketConnection.previouslyFailed();if(t.webSocketOnly&&(n||o.warn(\"wss:// URL used, but browser isn't known to support websockets.  Trying anyway.\"),r=!0),r)this.ci=[i.WebSocketConnection];else{var a=this.ci=[];o.each(e.ALL_TRANSPORTS,function(e,t){t&&t.isAvailable()&&a.push(t)})}},e.prototype.initialTransport=function(){if(this.ci.length>0)return this.ci[0];throw Error(\"No transports available\")},e.prototype.upgradeTransport=function(){return this.ci.length>1?this.ci[1]:null},e}();t.TransportManager=a},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(1),i=function(){function e(e){this.Ut=e,this.pendingResponses=[],this.currentResponseNum=0,this.closeAfterResponse=-1,this.onClose=null}return e.prototype.closeAfter=function(e,t){this.closeAfterResponse=e,this.onClose=t,this.closeAfterResponse<this.currentResponseNum&&(this.onClose(),this.onClose=null)},e.prototype.handleResponse=function(e,t){var n=this;this.pendingResponses[e]=t;for(var i=this;this.pendingResponses[this.currentResponseNum]&&\"break\"!==function(){var e=i.pendingResponses[i.currentResponseNum];delete i.pendingResponses[i.currentResponseNum];for(var t=0;t<e.length;++t)!function(t){e[t]&&r.exceptionGuard(function(){n.Ut(e[t])})}(t);if(i.currentResponseNum===i.closeAfterResponse)return i.onClose&&(i.onClose(),i.onClose=null),\"break\";i.currentResponseNum++}(););},e}();t.PacketReceiver=i},function(e,t,n){\"use strict\";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(0),o=n(1),a=n(0),s=n(0),u=n(0),l=n(55),h=function(e){function t(t,n,r){var i=e.call(this)||this;return i.H=t,i.ee=n,i.Ke=r,i.de=o.logWrapper(\"p:rest:\"),i.Je={},i}return r(t,e),t.prototype.reportStats=function(e){throw Error(\"Method not implemented.\")},t.pi=function(e,t){return void 0!==t?\"tag$\"+t:(i.assert(e.getQueryParams().isDefault(),\"should have a tag if it's not a default query.\"),\"\"+e.path)},t.prototype.listen=function(e,n,r,i){var o=this,a=\"\"+e.path;this.de(\"Listen called for \"+a+\" \"+e.queryIdentifier());var u=t.pi(e,r),l={};this.Je[u]=l;var h=e.getQueryParams().toRestQueryStringParameters();this.di(a+\".json\",h,function(e,t){var n=t;if(404===e&&(n=null,e=null),null===e&&o.ee(a,n,!1,r),s.safeGet(o.Je,u)===l){var h;h=e?401==e?\"permission_denied\":\"rest_error:\"+e:\"ok\",i(h,null)}})},t.prototype.unlisten=function(e,n){var r=t.pi(e,n);delete this.Je[r]},t.prototype.refreshAuthToken=function(e){},t.prototype.di=function(e,t,n){var r=this;void 0===t&&(t={}),t.format=\"export\",this.Ke.getToken(!1).then(function(i){var s=i&&i.accessToken;s&&(t.auth=s);var l=(r.H.secure?\"https://\":\"http://\")+r.H.host+e+\"?\"+u.querystring(t);r.de(\"Sending REST request for \"+l);var h=new XMLHttpRequest;h.onreadystatechange=function(){if(n&&4===h.readyState){r.de(\"REST Response for \"+l+\" received. status:\",h.status,\"response:\",h.responseText);var e=null;if(h.status>=200&&h.status<300){try{e=a.jsonEval(h.responseText)}catch(e){o.warn(\"Failed to parse JSON response for \"+l+\": \"+h.responseText)}n(null,e)}else 401!==h.status&&404!==h.status&&o.warn(\"Got unsuccessful REST response for \"+l+\" Status: \"+h.status),n(h.status);n=null}},h.open(\"GET\",l,!0),h.send()})},t}(l.ServerActions);t.ReadonlyRestClient=h},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=n(1),o=n(10),a=n(3),s=n(38),u=n(42),l=n(24),h=n(108),c=n(56),p=n(0),d=function(){function e(){this.fi=!1,this._i=!1,this.yi=!1,this.vi=!1,this.gi=!1,this.mi=0,this.Ci=\"\",this.Ei=null,this.Ni=\"\",this.Pi=null,this.bi=\"\",this.me=a.PRIORITY_INDEX}return e.prototype.hasStart=function(){return this._i},e.prototype.isViewFromLeft=function(){return\"\"===this.Ci?this._i:this.Ci===e.Si.VIEW_FROM_LEFT},e.prototype.getIndexStartValue=function(){return r.assert(this._i,\"Only valid if start has been set\"),this.Ei},e.prototype.getIndexStartName=function(){return r.assert(this._i,\"Only valid if start has been set\"),this.yi?this.Ni:i.MIN_NAME},e.prototype.hasEnd=function(){return this.vi},e.prototype.getIndexEndValue=function(){return r.assert(this.vi,\"Only valid if end has been set\"),this.Pi},e.prototype.getIndexEndName=function(){return r.assert(this.vi,\"Only valid if end has been set\"),this.gi?this.bi:i.MAX_NAME},e.prototype.hasLimit=function(){return this.fi},e.prototype.hasAnchoredLimit=function(){return this.fi&&\"\"!==this.Ci},e.prototype.getLimit=function(){return r.assert(this.fi,\"Only valid if limit has been set\"),this.mi},e.prototype.getIndex=function(){return this.me},e.prototype.Ti=function(){var t=new e;return t.fi=this.fi,t.mi=this.mi,t._i=this._i,t.Ei=this.Ei,t.yi=this.yi,t.Ni=this.Ni,t.vi=this.vi,t.Pi=this.Pi,t.gi=this.gi,t.bi=this.bi,t.me=this.me,t.Ci=this.Ci,t},e.prototype.limit=function(e){var t=this.Ti();return t.fi=!0,t.mi=e,t.Ci=\"\",t},e.prototype.limitToFirst=function(t){var n=this.Ti();return n.fi=!0,n.mi=t,n.Ci=e.Si.VIEW_FROM_LEFT,n},e.prototype.limitToLast=function(t){var n=this.Ti();return n.fi=!0,n.mi=t,n.Ci=e.Si.VIEW_FROM_RIGHT,n},e.prototype.startAt=function(e,t){var n=this.Ti();return n._i=!0,void 0===e&&(e=null),n.Ei=e,null!=t?(n.yi=!0,n.Ni=t):(n.yi=!1,n.Ni=\"\"),n},e.prototype.endAt=function(e,t){var n=this.Ti();return n.vi=!0,void 0===e&&(e=null),n.Pi=e,void 0!==t?(n.gi=!0,n.bi=t):(n.gi=!1,n.bi=\"\"),n},e.prototype.orderBy=function(e){var t=this.Ti();return t.me=e,t},e.prototype.getQueryObject=function(){var t=e.Si,n={};if(this._i&&(n[t.INDEX_START_VALUE]=this.Ei,this.yi&&(n[t.INDEX_START_NAME]=this.Ni)),this.vi&&(n[t.INDEX_END_VALUE]=this.Pi,this.gi&&(n[t.INDEX_END_NAME]=this.bi)),this.fi){n[t.LIMIT]=this.mi;var r=this.Ci;\"\"===r&&(r=this.isViewFromLeft()?t.VIEW_FROM_LEFT:t.VIEW_FROM_RIGHT),n[t.VIEW_FROM]=r}return this.me!==a.PRIORITY_INDEX&&(n[t.INDEX]=\"\"+this.me),n},e.prototype.loadsAllData=function(){return!(this._i||this.vi||this.fi)},e.prototype.isDefault=function(){return this.loadsAllData()&&this.me==a.PRIORITY_INDEX},e.prototype.getNodeFilter=function(){return this.loadsAllData()?new l.IndexedFilter(this.getIndex()):this.hasLimit()?new h.LimitedFilter(this):new c.RangedFilter(this)},e.prototype.toRestQueryStringParameters=function(){var t=e.wi,n={};if(this.isDefault())return n;var i;return this.me===a.PRIORITY_INDEX?i=t.PRIORITY_INDEX:this.me===s.VALUE_INDEX?i=t.VALUE_INDEX:this.me===o.KEY_INDEX?i=t.KEY_INDEX:(r.assert(this.me instanceof u.PathIndex,\"Unrecognized index type!\"),i=\"\"+this.me),n[t.ORDER_BY]=p.stringify(i),this._i&&(n[t.START_AT]=p.stringify(this.Ei),this.yi&&(n[t.START_AT]+=\",\"+p.stringify(this.Ni))),this.vi&&(n[t.END_AT]=p.stringify(this.Pi),this.gi&&(n[t.END_AT]+=\",\"+p.stringify(this.bi))),this.fi&&(this.isViewFromLeft()?n[t.LIMIT_TO_FIRST]=this.mi:n[t.LIMIT_TO_LAST]=this.mi),n},e.Si={INDEX_START_VALUE:\"sp\",INDEX_START_NAME:\"sn\",INDEX_END_VALUE:\"ep\",INDEX_END_NAME:\"en\",LIMIT:\"l\",VIEW_FROM:\"vf\",VIEW_FROM_LEFT:\"l\",VIEW_FROM_RIGHT:\"r\",INDEX:\"i\"},e.wi={ORDER_BY:\"orderBy\",PRIORITY_INDEX:\"$priority\",VALUE_INDEX:\"$value\",KEY_INDEX:\"$key\",START_AT:\"startAt\",END_AT:\"endAt\",LIMIT_TO_FIRST:\"limitToFirst\",LIMIT_TO_LAST:\"limitToLast\"},e.DEFAULT=new e,e}();t.QueryParams=d},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(56),i=n(4),o=n(5),a=n(0),s=n(9),u=function(){function e(e){this.Ii=new r.RangedFilter(e),this.me=e.getIndex(),this.mi=e.getLimit(),this.Ri=!e.isViewFromLeft()}return e.prototype.updateChild=function(e,t,n,r,a,s){return this.Ii.matches(new o.NamedNode(t,n))||(n=i.ChildrenNode.EMPTY_NODE),e.getImmediateChild(t).equals(n)?e:e.numChildren()<this.mi?this.Ii.getIndexedFilter().updateChild(e,t,n,r,a,s):this.Oi(e,t,n,a,s)},e.prototype.updateFullNode=function(e,t,n){var r;if(t.isLeafNode()||t.isEmpty())r=i.ChildrenNode.EMPTY_NODE.withIndex(this.me);else if(2*this.mi<t.numChildren()&&t.isIndexed(this.me)){r=i.ChildrenNode.EMPTY_NODE.withIndex(this.me);var o=void 0;o=this.Ri?t.getReverseIteratorFrom(this.Ii.getEndPost(),this.me):t.getIteratorFrom(this.Ii.getStartPost(),this.me);for(var a=0;o.hasNext()&&a<this.mi;){var s=o.getNext(),u=void 0;if(!(u=this.Ri?this.me.compare(this.Ii.getStartPost(),s)<=0:this.me.compare(s,this.Ii.getEndPost())<=0))break;r=r.updateImmediateChild(s.name,s.node),a++}}else{r=t.withIndex(this.me),r=r.updatePriority(i.ChildrenNode.EMPTY_NODE);var l=void 0,h=void 0,c=void 0,o=void 0;if(this.Ri){o=r.getReverseIterator(this.me),l=this.Ii.getEndPost(),h=this.Ii.getStartPost();var p=this.me.getCompare();c=function(e,t){return p(t,e)}}else o=r.getIterator(this.me),l=this.Ii.getStartPost(),h=this.Ii.getEndPost(),c=this.me.getCompare();for(var a=0,d=!1;o.hasNext();){var s=o.getNext();!d&&c(l,s)<=0&&(d=!0);var u=d&&a<this.mi&&c(s,h)<=0;u?a++:r=r.updateImmediateChild(s.name,i.ChildrenNode.EMPTY_NODE)}}return this.Ii.getIndexedFilter().updateFullNode(e,r,n)},e.prototype.updatePriority=function(e,t){return e},e.prototype.filtersNodes=function(){return!0},e.prototype.getIndexedFilter=function(){return this.Ii.getIndexedFilter()},e.prototype.getIndex=function(){return this.me},e.prototype.Oi=function(e,t,n,r,u){var l;if(this.Ri){var h=this.me.getCompare();l=function(e,t){return h(t,e)}}else l=this.me.getCompare();var c=e;a.assert(c.numChildren()==this.mi,\"\");var p=new o.NamedNode(t,n),d=this.Ri?c.getFirstChild(this.me):c.getLastChild(this.me),f=this.Ii.matches(p);if(c.hasChild(t)){for(var _=c.getImmediateChild(t),y=r.getChildAfterChild(this.me,d,this.Ri);null!=y&&(y.name==t||c.hasChild(y.name));)y=r.getChildAfterChild(this.me,y,this.Ri);var v=null==y?1:l(y,p);if(f&&!n.isEmpty()&&v>=0)return null!=u&&u.trackChildChange(s.Change.childChangedChange(t,n,_)),c.updateImmediateChild(t,n);null!=u&&u.trackChildChange(s.Change.childRemovedChange(t,_));var g=c.updateImmediateChild(t,i.ChildrenNode.EMPTY_NODE);return null!=y&&this.Ii.matches(y)?(null!=u&&u.trackChildChange(s.Change.childAddedChange(y.name,y.node)),g.updateImmediateChild(y.name,y.node)):g}return n.isEmpty()?e:f&&l(d,p)>=0?(null!=u&&(u.trackChildChange(s.Change.childRemovedChange(d.name,d.node)),u.trackChildChange(s.Change.childAddedChange(t,n))),c.updateImmediateChild(t,n).updateImmediateChild(d.name,i.ChildrenNode.EMPTY_NODE)):e},e}();t.LimitedFilter=u},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r,i=n(0),o=n(21),a=n(22),s=n(2),u=n(110),l=n(3),h=n(1),c=n(43),p=n(7),d=n(0),f=n(11),_=n(4),y=n(18);!function(e){e[e.RUN=0]=\"RUN\",e[e.SENT=1]=\"SENT\",e[e.COMPLETED=2]=\"COMPLETED\",e[e.SENT_NEEDS_ABORT=3]=\"SENT_NEEDS_ABORT\",e[e.NEEDS_ABORT=4]=\"NEEDS_ABORT\"}(r=t.TransactionStatus||(t.TransactionStatus={})),y.Repo.Ai=25,y.Repo.prototype.ie=function(){this.Di=new u.Tree},y.Repo.prototype.startTransaction=function(e,t,n,s){this.de(\"transaction on \"+e);var u=function(){},y=new o.Reference(this,e);y.on(\"value\",u);var v=function(){y.off(\"value\",u)},g={path:e,update:t,onComplete:n,status:null,order:h.LUIDGenerator(),applyLocally:s,retryCount:0,unwatcher:v,abortReason:null,currentWriteId:null,currentInputSnapshot:null,currentOutputSnapshotRaw:null,currentOutputSnapshotResolved:null},m=this.Mi(e);g.currentInputSnapshot=m;var C=g.update(m.val());if(void 0===C){if(g.unwatcher(),g.currentOutputSnapshotRaw=null,g.currentOutputSnapshotResolved=null,g.onComplete){var E=new a.DataSnapshot(g.currentInputSnapshot,new o.Reference(this,g.path),l.PRIORITY_INDEX);g.onComplete(null,!1,E)}}else{p.validateFirebaseData(\"transaction failed: Data returned \",C,g.path),g.status=r.RUN;var N=this.Di.subTree(e),P=N.getValue()||[];P.push(g),N.setValue(P);var b=void 0;\"object\"==typeof C&&null!==C&&d.contains(C,\".priority\")?(b=d.safeGet(C,\".priority\"),i.assert(p.isValidPriority(b),\"Invalid priority returned by transaction. Priority must be a valid string, finite number, server value, or null.\")):b=(this.ue.calcCompleteEventCache(e)||_.ChildrenNode.EMPTY_NODE).getPriority().val(),b=b;var S=this.generateServerValues(),T=f.nodeFromJSON(C,b),w=c.resolveDeferredValueSnapshot(T,S);g.currentOutputSnapshotRaw=T,g.currentOutputSnapshotResolved=w,g.currentWriteId=this.pe();var I=this.ue.applyUserOverwrite(e,w,g.currentWriteId,g.applyLocally);this.K.raiseEventsForChangedPath(e,I),this.Li()}},y.Repo.prototype.Mi=function(e,t){return this.ue.calcCompleteEventCache(e,t)||_.ChildrenNode.EMPTY_NODE},y.Repo.prototype.Li=function(e){var t=this;if(void 0===e&&(e=this.Di),e||this.Fi(e),null!==e.getValue()){var n=this.xi(e);i.assert(n.length>0,\"Sending zero length transaction queue\"),n.every(function(e){return e.status===r.RUN})&&this.ki(e.path(),n)}else e.hasChildren()&&e.forEachChild(function(e){t.Li(e)})},y.Repo.prototype.ki=function(e,t){for(var n=this,u=t.map(function(e){return e.currentWriteId}),c=this.Mi(e,u),p=c,d=c.hash(),f=0;f<t.length;f++){var _=t[f];i.assert(_.status===r.RUN,\"tryToSendTransactionQueue_: items in queue should all be run.\"),_.status=r.SENT,_.retryCount++;var y=s.Path.relativePath(e,_.path);p=p.updateChild(y,_.currentOutputSnapshotRaw)}var v=p.val(!0),g=e;this.Z.put(\"\"+g,v,function(i){n.de(\"transaction put response\",{path:\"\"+g,status:i});var s=[];if(\"ok\"===i){for(var u=[],c=0;c<t.length;c++){if(t[c].status=r.COMPLETED,s=s.concat(n.ue.ackUserWrite(t[c].currentWriteId)),t[c].onComplete){var p=t[c].currentOutputSnapshotResolved,d=new o.Reference(n,t[c].path),f=new a.DataSnapshot(p,d,l.PRIORITY_INDEX);u.push(t[c].onComplete.bind(null,null,!0,f))}t[c].unwatcher()}n.Fi(n.Di.subTree(e)),n.Li(),n.K.raiseEventsForChangedPath(e,s);for(var c=0;c<u.length;c++)h.exceptionGuard(u[c])}else{if(\"datastale\"===i)for(var c=0;c<t.length;c++)t[c].status===r.SENT_NEEDS_ABORT?t[c].status=r.NEEDS_ABORT:t[c].status=r.RUN;else{h.warn(\"transaction at \"+g+\" failed: \"+i);for(var c=0;c<t.length;c++)t[c].status=r.NEEDS_ABORT,t[c].abortReason=i}n.le(e)}},d)},y.Repo.prototype.le=function(e){var t=this.Wi(e),n=t.path(),r=this.xi(t);return this.ji(r,n),n},y.Repo.prototype.ji=function(e,t){if(0!==e.length){for(var n=[],u=[],_=e.filter(function(e){return e.status===r.RUN}),v=_.map(function(e){return e.currentWriteId}),g=0;g<e.length;g++){var m=e[g],C=s.Path.relativePath(t,m.path),E=!1,N=void 0;if(i.assert(null!==C,\"rerunTransactionsUnderNode_: relativePath should not be null.\"),m.status===r.NEEDS_ABORT)E=!0,N=m.abortReason,u=u.concat(this.ue.ackUserWrite(m.currentWriteId,!0));else if(m.status===r.RUN)if(m.retryCount>=y.Repo.Ai)E=!0,N=\"maxretry\",u=u.concat(this.ue.ackUserWrite(m.currentWriteId,!0));else{var P=this.Mi(m.path,v);m.currentInputSnapshot=P;var b=e[g].update(P.val());if(void 0!==b){p.validateFirebaseData(\"transaction failed: Data returned \",b,m.path);var S=f.nodeFromJSON(b),T=\"object\"==typeof b&&null!=b&&d.contains(b,\".priority\");T||(S=S.updatePriority(P.getPriority()));var w=m.currentWriteId,I=this.generateServerValues(),R=c.resolveDeferredValueSnapshot(S,I);m.currentOutputSnapshotRaw=S,m.currentOutputSnapshotResolved=R,m.currentWriteId=this.pe(),v.splice(v.indexOf(w),1),u=u.concat(this.ue.applyUserOverwrite(m.path,R,m.currentWriteId,m.applyLocally)),u=u.concat(this.ue.ackUserWrite(w,!0))}else E=!0,N=\"nodata\",u=u.concat(this.ue.ackUserWrite(m.currentWriteId,!0))}if(this.K.raiseEventsForChangedPath(t,u),u=[],E&&(e[g].status=r.COMPLETED,function(e){setTimeout(e,Math.floor(0))}(e[g].unwatcher),e[g].onComplete))if(\"nodata\"===N){var O=new o.Reference(this,e[g].path),A=e[g].currentInputSnapshot,D=new a.DataSnapshot(A,O,l.PRIORITY_INDEX);n.push(e[g].onComplete.bind(null,null,!1,D))}else n.push(e[g].onComplete.bind(null,Error(N),!1,null))}this.Fi(this.Di);for(var g=0;g<n.length;g++)h.exceptionGuard(n[g]);this.Li()}},y.Repo.prototype.Wi=function(e){for(var t,n=this.Di;null!==(t=e.getFront())&&null===n.getValue();)n=n.subTree(t),e=e.popFront();return n},y.Repo.prototype.xi=function(e){var t=[];return this.Vi(e,t),t.sort(function(e,t){return e.order-t.order}),t},y.Repo.prototype.Vi=function(e,t){var n=this,r=e.getValue();if(null!==r)for(var i=0;i<r.length;i++)t.push(r[i]);e.forEachChild(function(e){n.Vi(e,t)})},y.Repo.prototype.Fi=function(e){var t=this,n=e.getValue();if(n){for(var i=0,o=0;o<n.length;o++)n[o].status!==r.COMPLETED&&(n[i]=n[o],i++);n.length=i,e.setValue(n.length>0?n:null)}e.forEachChild(function(e){t.Fi(e)})},y.Repo.prototype.fe=function(e){var t=this,n=this.Wi(e).path(),r=this.Di.subTree(e);return r.forEachAncestor(function(e){t.Qi(e)}),this.Qi(r),r.forEachDescendant(function(e){t.Qi(e)}),n},y.Repo.prototype.Qi=function(e){var t=e.getValue();if(null!==t){for(var n=[],o=[],a=-1,s=0;s<t.length;s++)t[s].status===r.SENT_NEEDS_ABORT||(t[s].status===r.SENT?(i.assert(a===s-1,\"All SENT items should be at beginning of queue.\"),a=s,t[s].status=r.SENT_NEEDS_ABORT,t[s].abortReason=\"set\"):(i.assert(t[s].status===r.RUN,\"Unexpected transaction status in abort\"),t[s].unwatcher(),o=o.concat(this.ue.ackUserWrite(t[s].currentWriteId,!0)),t[s].onComplete&&n.push(t[s].onComplete.bind(null,Error(\"set\"),!1,null))));-1===a?e.setValue(null):t.length=a+1,this.K.raiseEventsForChangedPath(e.path(),o);for(var s=0;s<n.length;s++)h.exceptionGuard(n[s])}}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),i=n(2),o=n(0),a=function(){function e(){this.children={},this.childCount=0,this.value=null}return e}();t.TreeNode=a;var s=function(){function e(e,t,n){void 0===e&&(e=\"\"),void 0===t&&(t=null),void 0===n&&(n=new a),this.qi=e,this.Ui=t,this._e=n}return e.prototype.subTree=function(t){for(var n,r=t instanceof i.Path?t:new i.Path(t),s=this;null!==(n=r.getFront());)s=new e(n,s,o.safeGet(s._e.children,n)||new a),r=r.popFront();return s},e.prototype.getValue=function(){return this._e.value},e.prototype.setValue=function(e){r.assert(void 0!==e,\"Cannot set value to undefined\"),this._e.value=e,this.Bi()},e.prototype.clear=function(){this._e.value=null,this._e.children={},this._e.childCount=0,this.Bi()},e.prototype.hasChildren=function(){return this._e.childCount>0},e.prototype.isEmpty=function(){return null===this.getValue()&&!this.hasChildren()},e.prototype.forEachChild=function(t){var n=this;o.forEach(this._e.children,function(r,i){t(new e(r,n,i))})},e.prototype.forEachDescendant=function(e,t,n){t&&!n&&e(this),this.forEachChild(function(t){t.forEachDescendant(e,!0,n)}),t&&n&&e(this)},e.prototype.forEachAncestor=function(e,t){for(var n=t?this:this.parent();null!==n;){if(e(n))return!0;n=n.parent()}return!1},e.prototype.forEachImmediateDescendantWithValue=function(e){this.forEachChild(function(t){null!==t.getValue()?e(t):t.forEachImmediateDescendantWithValue(e)})},e.prototype.path=function(){return new i.Path(null===this.Ui?this.qi:this.Ui.path()+\"/\"+this.qi)},e.prototype.name=function(){return this.qi},e.prototype.parent=function(){return this.Ui},e.prototype.Bi=function(){null!==this.Ui&&this.Ui.Hi(this.qi,this)},e.prototype.Hi=function(e,t){var n=t.isEmpty(),r=o.contains(this._e.children,e);n&&r?(delete this._e.children[e],this._e.childCount--,this.Bi()):n||r||(this._e.children[e]=t._e,this._e.childCount++,this.Bi())},e}();t.Tree=s},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(54),i=n(53);t.forceLongPolling=function(){r.WebSocketConnection.forceDisallow(),i.BrowserPollConnection.forceAllow()},t.forceWebSockets=function(){i.BrowserPollConnection.forceDisallow()},t.isWebSocketsAvailable=function(){return r.WebSocketConnection.isAvailable()},t.setSecurityDebugCallback=function(e,t){e.repo.J.it=t},t.stats=function(e,t){e.repo.stats(t)},t.statsIncrementCounter=function(e,t){e.repo.statsIncrementCounter(t)},t.dataUpdateCount=function(e){return e.repo.dataUpdateCount},t.interceptServerData=function(e,t){return e.repo.he(t)}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(34),i=n(50),o=n(26),a=n(52);t.DataConnection=i.PersistentConnection,i.PersistentConnection.prototype.simpleListen=function(e,t){this.sendRequest(\"q\",{p:e},t)},i.PersistentConnection.prototype.echo=function(e,t){this.sendRequest(\"echo\",{d:e},t)},t.RealTimeConnection=a.Connection,t.hijackHash=function(e){var t=i.PersistentConnection.prototype.put;return i.PersistentConnection.prototype.put=function(n,r,i,o){void 0!==o&&(o=e()),t.call(this,n,r,i,o)},function(){i.PersistentConnection.prototype.put=t}},t.ConnectionTarget=r.RepoInfo,t.queryIdentifier=function(e){return e.queryIdentifier()},t.listens=function(e){return e.repo.J.Je},t.forceRestClient=function(e){o.RepoManager.getInstance().forceRestClient(e)}}],[78])}catch(e){throw Error(\"Cannot instantiate firebase-database.js - be sure to load firebase-app.js first.\")}\n\n/*!\n * @license Firebase v4.9.0\n * Build: rev-a586a7f\n * Terms: https://firebase.google.com/terms/\n */\ntry{webpackJsonpFirebase([3],{116:function(e,t,r){r(117)},117:function(e,t,r){\"use strict\";function n(e){var t=new Uint8Array(e);return window.btoa(String.fromCharCode.apply(null,t))}function o(e){var t=function(e){return self&&\"ServiceWorkerGlobalScope\"in self?new A(e):new k(e)},r={Messaging:k};e.INTERNAL.registerService(\"messaging\",t,r)}Object.defineProperty(t,\"__esModule\",{value:!0});var i,s=r(0),a={AVAILABLE_IN_WINDOW:\"only-available-in-window\",AVAILABLE_IN_SW:\"only-available-in-sw\",SHOULD_BE_INHERITED:\"should-be-overriden\",BAD_SENDER_ID:\"bad-sender-id\",INCORRECT_GCM_SENDER_ID:\"incorrect-gcm-sender-id\",PERMISSION_DEFAULT:\"permission-default\",PERMISSION_BLOCKED:\"permission-blocked\",UNSUPPORTED_BROWSER:\"unsupported-browser\",NOTIFICATIONS_BLOCKED:\"notifications-blocked\",FAILED_DEFAULT_REGISTRATION:\"failed-serviceworker-registration\",SW_REGISTRATION_EXPECTED:\"sw-registration-expected\",GET_SUBSCRIPTION_FAILED:\"get-subscription-failed\",INVALID_SAVED_TOKEN:\"invalid-saved-token\",SW_REG_REDUNDANT:\"sw-reg-redundant\",TOKEN_SUBSCRIBE_FAILED:\"token-subscribe-failed\",TOKEN_SUBSCRIBE_NO_TOKEN:\"token-subscribe-no-token\",TOKEN_SUBSCRIBE_NO_PUSH_SET:\"token-subscribe-no-push-set\",USE_SW_BEFORE_GET_TOKEN:\"use-sw-before-get-token\",INVALID_DELETE_TOKEN:\"invalid-delete-token\",DELETE_TOKEN_NOT_FOUND:\"delete-token-not-found\",DELETE_SCOPE_NOT_FOUND:\"delete-scope-not-found\",BG_HANDLER_FUNCTION_EXPECTED:\"bg-handler-function-expected\",NO_WINDOW_CLIENT_TO_MSG:\"no-window-client-to-msg\",UNABLE_TO_RESUBSCRIBE:\"unable-to-resubscribe\",NO_FCM_TOKEN_FOR_RESUBSCRIBE:\"no-fcm-token-for-resubscribe\",FAILED_TO_DELETE_TOKEN:\"failed-to-delete-token\",NO_SW_IN_REG:\"no-sw-in-reg\",BAD_SCOPE:\"bad-scope\",BAD_VAPID_KEY:\"bad-vapid-key\",BAD_SUBSCRIPTION:\"bad-subscription\",BAD_TOKEN:\"bad-token\",BAD_PUSH_SET:\"bad-push-set\",FAILED_DELETE_VAPID_KEY:\"failed-delete-vapid-key\"},c=(i={},i[a.AVAILABLE_IN_WINDOW]=\"This method is available in a Window context.\",i[a.AVAILABLE_IN_SW]=\"This method is available in a service worker context.\",i[\"should-be-overriden\"]=\"This method should be overriden by extended classes.\",i[\"bad-sender-id\"]=\"Please ensure that 'messagingSenderId' is set correctly in the options passed into firebase.initializeApp().\",i[\"permission-default\"]=\"The required permissions were not granted and dismissed instead.\",i[\"permission-blocked\"]=\"The required permissions were not granted and blocked instead.\",i[\"unsupported-browser\"]=\"This browser doesn't support the API's required to use the firebase SDK.\",i[\"notifications-blocked\"]=\"Notifications have been blocked.\",i[a.FAILED_DEFAULT_REGISTRATION]=\"We are unable to register the default service worker. {$browserErrorMessage}\",i[\"sw-registration-expected\"]=\"A service worker registration was the expected input.\",i[\"get-subscription-failed\"]=\"There was an error when trying to get any existing Push Subscriptions.\",i[\"invalid-saved-token\"]=\"Unable to access details of the saved token.\",i[\"sw-reg-redundant\"]=\"The service worker being used for push was made redundant.\",i[\"token-subscribe-failed\"]=\"A problem occured while subscribing the user to FCM: {$message}\",i[\"token-subscribe-no-token\"]=\"FCM returned no token when subscribing the user to push.\",i[\"token-subscribe-no-push-set\"]=\"FCM returned an invalid response when getting an FCM token.\",i[\"use-sw-before-get-token\"]=\"You must call useServiceWorker() before calling getToken() to ensure your service worker is used.\",i[\"invalid-delete-token\"]=\"You must pass a valid token into deleteToken(), i.e. the token from getToken().\",i[\"delete-token-not-found\"]=\"The deletion attempt for token could not be performed as the token was not found.\",i[\"delete-scope-not-found\"]=\"The deletion attempt for service worker scope could not be performed as the scope was not found.\",i[\"bg-handler-function-expected\"]=\"The input to setBackgroundMessageHandler() must be a function.\",i[\"no-window-client-to-msg\"]=\"An attempt was made to message a non-existant window client.\",i[\"unable-to-resubscribe\"]=\"There was an error while re-subscribing the FCM token for push messaging. Will have to resubscribe the user on next visit. {$message}\",i[\"no-fcm-token-for-resubscribe\"]=\"Could not find an FCM token and as a result, unable to resubscribe. Will have to resubscribe the user on next visit.\",i[\"failed-to-delete-token\"]=\"Unable to delete the currently saved token.\",i[\"no-sw-in-reg\"]=\"Even though the service worker registration was successful, there was a problem accessing the service worker itself.\",i[\"incorrect-gcm-sender-id\"]=\"Please change your web app manifest's 'gcm_sender_id' value to '103953800507' to use Firebase messaging.\",i[\"bad-scope\"]=\"The service worker scope must be a string with at least one character.\",i[\"bad-vapid-key\"]=\"The public VAPID key must be a string with at least one character.\",i[\"bad-subscription\"]=\"The subscription must be a valid PushSubscription.\",i[\"bad-token\"]=\"The FCM Token used for storage / lookup was not a valid token string.\",i[\"bad-push-set\"]=\"The FCM push set used for storage / lookup was not not a valid push set string.\",i[\"failed-delete-vapid-key\"]=\"The VAPID key could not be deleted.\",i),u={codes:a,map:c},_=function(e){return n(e).replace(/=/g,\"\").replace(/\\+/g,\"-\").replace(/\\//g,\"_\")},d=[4,51,148,247,223,161,235,177,220,3,162,94,21,113,219,72,211,46,237,237,178,52,219,183,71,58,12,143,196,204,225,111,60,140,132,223,171,182,102,62,242,12,212,139,254,227,249,118,47,20,28,99,8,106,111,45,177,26,149,176,206,55,192,156,110],f={userVisibleOnly:!0,applicationServerKey:new Uint8Array(d)},h={ENDPOINT:\"https://fcm.googleapis.com\",APPLICATION_SERVER_KEY:d,SUBSCRIPTION_OPTIONS:f},p=\"fcm_token_object_Store\",l=function(){function e(){this.e=new s.ErrorFactory(\"messaging\",\"Messaging\",u.map),this.t=null}return e.prototype.r=function(){return this.t?this.t:(this.t=new Promise(function(t,r){var n=indexedDB.open(e.DB_NAME,1);n.onerror=function(e){r(e.target.error)},n.onsuccess=function(e){t(e.target.result)},n.onupgradeneeded=function(e){var t=e.target.result,r=t.createObjectStore(p,{keyPath:\"swScope\"});r.createIndex(\"fcmSenderId\",\"fcmSenderId\",{unique:!1}),r.createIndex(\"fcmToken\",\"fcmToken\",{unique:!0})}}),this.t)},e.prototype.closeDatabase=function(){var e=this;return this.t?this.t.then(function(t){t.close(),e.t=null}):Promise.resolve()},e.prototype.getTokenDetailsFromToken=function(e){return this.r().then(function(t){return new Promise(function(r,n){var o=t.transaction([p]),i=o.objectStore(p),s=i.index(\"fcmToken\"),a=s.get(e);a.onerror=function(e){n(e.target.error)},a.onsuccess=function(e){r(e.target.result)}})})},e.prototype.n=function(e){return this.r().then(function(t){return new Promise(function(r,n){var o=t.transaction([p]),i=o.objectStore(p),s=i.get(e);s.onerror=function(e){n(e.target.error)},s.onsuccess=function(e){r(e.target.result)}})})},e.prototype.o=function(e){return this.r().then(function(t){return new Promise(function(r,n){var o=t.transaction([p]),i=o.objectStore(p),s=[],a=i.openCursor();a.onerror=function(e){n(e.target.error)},a.onsuccess=function(t){var n=t.target.result;n?(n.value.fcmSenderId===e&&s.push(n.value),n.continue()):r(s)}})})},e.prototype.subscribeToFCM=function(e,t,r){var n=this,o=_(t.getKey(\"p256dh\")),i=_(t.getKey(\"auth\")),s=\"authorized_entity=\"+e+\"&endpoint=\"+t.endpoint+\"&encryption_key=\"+o+\"&encryption_auth=\"+i;r&&(s+=\"&pushSet=\"+r);var a=new Headers;a.append(\"Content-Type\",\"application/x-www-form-urlencoded\");var c={method:\"POST\",headers:a,body:s};return fetch(h.ENDPOINT+\"/fcm/connect/subscribe\",c).then(function(e){return e.json()}).then(function(e){var t=e;if(t.error){var r=t.error.message;throw n.e.create(u.codes.TOKEN_SUBSCRIBE_FAILED,{message:r})}if(!t.token)throw n.e.create(u.codes.TOKEN_SUBSCRIBE_NO_TOKEN);if(!t.pushSet)throw n.e.create(u.codes.TOKEN_SUBSCRIBE_NO_PUSH_SET);return{token:t.token,pushSet:t.pushSet}})},e.prototype.i=function(e,t){return e.endpoint===t.endpoint&&_(e.getKey(\"auth\"))===t.auth&&_(e.getKey(\"p256dh\"))===t.p256dh},e.prototype.s=function(e,t,r,n,o){var i={swScope:t.scope,endpoint:r.endpoint,auth:_(r.getKey(\"auth\")),p256dh:_(r.getKey(\"p256dh\")),fcmToken:n,fcmPushSet:o,fcmSenderId:e};return this.r().then(function(e){return new Promise(function(t,r){var n=e.transaction([p],\"readwrite\"),o=n.objectStore(p),s=o.put(i);s.onerror=function(e){r(e.target.error)},s.onsuccess=function(e){t()}})})},e.prototype.getSavedToken=function(e,t){var r=this;return t instanceof ServiceWorkerRegistration?\"string\"!=typeof e||0===e.length?Promise.reject(this.e.create(u.codes.BAD_SENDER_ID)):this.o(e).then(function(r){if(0!==r.length){var n=r.findIndex(function(r){return t.scope===r.swScope&&e===r.fcmSenderId});if(-1!==n)return r[n]}}).then(function(e){if(e)return t.pushManager.getSubscription().catch(function(e){throw r.e.create(u.codes.GET_SUBSCRIPTION_FAILED)}).then(function(t){if(t&&r.i(t,e))return e.fcmToken})}):Promise.reject(this.e.create(u.codes.SW_REGISTRATION_EXPECTED))},e.prototype.createToken=function(e,t){var r=this;if(\"string\"!=typeof e||0===e.length)return Promise.reject(this.e.create(u.codes.BAD_SENDER_ID));if(!(t instanceof ServiceWorkerRegistration))return Promise.reject(this.e.create(u.codes.SW_REGISTRATION_EXPECTED));var n,o;return t.pushManager.getSubscription().then(function(e){return e||t.pushManager.subscribe(h.SUBSCRIPTION_OPTIONS)}).then(function(t){return n=t,r.subscribeToFCM(e,n)}).then(function(i){return o=i,r.s(e,t,n,o.token,o.pushSet)}).then(function(){return o.token})},e.prototype.deleteToken=function(e){var t=this;return\"string\"!=typeof e||0===e.length?Promise.reject(this.e.create(u.codes.INVALID_DELETE_TOKEN)):this.getTokenDetailsFromToken(e).then(function(e){if(!e)throw t.e.create(u.codes.DELETE_TOKEN_NOT_FOUND);return t.r().then(function(r){return new Promise(function(n,o){var i=r.transaction([p],\"readwrite\"),s=i.objectStore(p),a=s.delete(e.swScope);a.onerror=function(e){o(e.target.error)},a.onsuccess=function(r){if(0===r.target.result)return void o(t.e.create(u.codes.FAILED_TO_DELETE_TOKEN));n(e)}})})})},e}(),g=l,E=\"messagingSenderId\",T=function(){function e(e){var t=this;if(this.e=new s.ErrorFactory(\"messaging\",\"Messaging\",u.map),!e.options[E]||\"string\"!=typeof e.options[E])throw this.e.create(u.codes.BAD_SENDER_ID);this.a=e.options[E],this.c=new g,this.app=e,this.INTERNAL={},this.INTERNAL.delete=function(){return t.delete}}return e.prototype.getToken=function(){var e=this,t=this.u();return\"granted\"!==t?\"denied\"===t?Promise.reject(this.e.create(u.codes.NOTIFICATIONS_BLOCKED)):Promise.resolve(null):this._().then(function(t){return e.c.getSavedToken(e.a,t).then(function(r){return r||e.c.createToken(e.a,t)})})},e.prototype.deleteToken=function(e){var t=this;return this.c.deleteToken(e).then(function(){return t._().then(function(e){if(e)return e.pushManager.getSubscription()}).then(function(e){if(e)return e.unsubscribe()})})},e.prototype._=function(){throw this.e.create(u.codes.SHOULD_BE_INHERITED)},e.prototype.requestPermission=function(){throw this.e.create(u.codes.AVAILABLE_IN_WINDOW)},e.prototype.useServiceWorker=function(e){throw this.e.create(u.codes.AVAILABLE_IN_WINDOW)},e.prototype.onMessage=function(e,t,r){throw this.e.create(u.codes.AVAILABLE_IN_WINDOW)},e.prototype.onTokenRefresh=function(e,t,r){throw this.e.create(u.codes.AVAILABLE_IN_WINDOW)},e.prototype.setBackgroundMessageHandler=function(e){throw this.e.create(u.codes.AVAILABLE_IN_SW)},e.prototype.delete=function(){return this.c.closeDatabase()},e.prototype.u=function(){return Notification.permission},e.prototype.getTokenManager=function(){return this.c},e}(),S=T,b={TYPE_OF_MSG:\"firebase-messaging-msg-type\",DATA:\"firebase-messaging-msg-data\"},v={PUSH_MSG_RECEIVED:\"push-msg-received\",NOTIFICATION_CLICKED:\"notification-clicked\"},I=function(e,t){return r={},r[b.TYPE_OF_MSG]=e,r[b.DATA]=t,r;var r},m={PARAMS:b,TYPES_OF_MSG:v,createNewMsg:I},y={path:\"/firebase-messaging-sw.js\",scope:\"/firebase-cloud-messaging-push-scope\"},N=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),w=function(e){function t(t){var r=e.call(this,t)||this;return r.d=null,r.f=Object(s.createSubscribe)(function(e){r.d=e}),r.h=null,r.p=Object(s.createSubscribe)(function(e){r.h=e}),r.l(),r}return N(t,e),t.prototype.getToken=function(){var t=this;return this.g()?this.T().then(function(){return e.prototype.getToken.call(t)}):Promise.reject(this.e.create(u.codes.UNSUPPORTED_BROWSER))},t.prototype.T=function(){var e=this;if(this.S)return this.S;var t=document.querySelector('link[rel=\"manifest\"]');return this.S=t?fetch(t.href).then(function(e){return e.json()}).catch(function(){return Promise.resolve()}).then(function(t){if(t&&t.gcm_sender_id&&\"103953800507\"!==t.gcm_sender_id)throw e.e.create(u.codes.INCORRECT_GCM_SENDER_ID)}):Promise.resolve(),this.S},t.prototype.requestPermission=function(){var e=this;return\"granted\"===Notification.permission?Promise.resolve():new Promise(function(t,r){var n=function(n){return\"granted\"===n?t():r(\"denied\"===n?e.e.create(u.codes.PERMISSION_BLOCKED):e.e.create(u.codes.PERMISSION_DEFAULT))},o=Notification.requestPermission(function(e){o||n(e)});o&&o.then(n)})},t.prototype.useServiceWorker=function(e){if(!(e instanceof ServiceWorkerRegistration))throw this.e.create(u.codes.SW_REGISTRATION_EXPECTED);if(void 0!==this.b)throw this.e.create(u.codes.USE_SW_BEFORE_GET_TOKEN);this.b=e},t.prototype.onMessage=function(e,t,r){return this.f(e,t,r)},t.prototype.onTokenRefresh=function(e,t,r){return this.p(e,t,r)},t.prototype.v=function(e){var t=this,r=e.installing||e.waiting||e.active;return new Promise(function(n,o){if(!r)return void o(t.e.create(u.codes.NO_SW_IN_REG));if(\"activated\"===r.state)return void n(e);if(\"redundant\"===r.state)return void o(t.e.create(u.codes.SW_REG_REDUNDANT));var i=function(){if(\"activated\"===r.state)n(e);else{if(\"redundant\"!==r.state)return;o(t.e.create(u.codes.SW_REG_REDUNDANT))}r.removeEventListener(\"statechange\",i)};r.addEventListener(\"statechange\",i)})},t.prototype._=function(){var e=this;return this.b?this.v(this.b):(this.b=null,navigator.serviceWorker.register(y.path,{scope:y.scope}).catch(function(t){throw e.e.create(u.codes.FAILED_DEFAULT_REGISTRATION,{browserErrorMessage:t.message})}).then(function(t){return e.v(t).then(function(){return e.b=t,t.update(),t})}))},t.prototype.l=function(){var e=this;\"serviceWorker\"in navigator&&navigator.serviceWorker.addEventListener(\"message\",function(t){if(t.data&&t.data[m.PARAMS.TYPE_OF_MSG]){var r=t.data;switch(r[m.PARAMS.TYPE_OF_MSG]){case m.TYPES_OF_MSG.PUSH_MSG_RECEIVED:case m.TYPES_OF_MSG.NOTIFICATION_CLICKED:var n=r[m.PARAMS.DATA];e.d.next(n)}}},!1)},t.prototype.g=function(){return\"serviceWorker\"in navigator&&\"PushManager\"in window&&\"Notification\"in window&&\"fetch\"in window&&ServiceWorkerRegistration.prototype.hasOwnProperty(\"showNotification\")&&PushSubscription.prototype.hasOwnProperty(\"getKey\")},t}(S),k=w,O=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),D=function(e){function t(t){var r=e.call(this,t)||this;return self.addEventListener(\"push\",function(e){return r.I(e)},!1),self.addEventListener(\"pushsubscriptionchange\",function(e){return r.m(e)},!1),self.addEventListener(\"notificationclick\",function(e){return r.y(e)},!1),r.N=null,r}return O(t,e),t.prototype.I=function(e){var t,r=this;try{t=e.data.json()}catch(e){return}var n=this.w().then(function(e){if(e){if(t.notification||r.N)return r.k(t)}else{var n=r.O(t);if(n){var o=n.title||\"\";return self.registration.showNotification(o,n)}if(r.N)return r.N(t)}});e.waitUntil(n)},t.prototype.m=function(e){var t=this,r=this.getToken().then(function(e){if(!e)throw t.e.create(u.codes.NO_FCM_TOKEN_FOR_RESUBSCRIBE);var r=null,n=t.getTokenManager();return n.getTokenDetailsFromToken(e).then(function(e){if(!(r=e))throw t.e.create(u.codes.INVALID_SAVED_TOKEN);return self.registration.pushManager.subscribe(h.SUBSCRIPTION_OPTIONS)}).then(function(e){return n.subscribeToFCM(r.fcmSenderId,e,r.fcmPushSet)}).catch(function(e){return n.deleteToken(r.fcmToken).then(function(){throw t.e.create(u.codes.UNABLE_TO_RESUBSCRIBE,{message:e})})})});e.waitUntil(r)},t.prototype.y=function(e){var t=this;if(e.notification&&e.notification.data&&e.notification.data.FCM_MSG){e.stopImmediatePropagation(),e.notification.close();var r=e.notification.data.FCM_MSG,n=r.notification.click_action;if(n){var o=this.D(n).then(function(e){return e||self.clients.openWindow(n)}).then(function(e){if(e){r.notification,delete r.notification;var n=m.createNewMsg(m.TYPES_OF_MSG.NOTIFICATION_CLICKED,r);return t.A(e,n)}});e.waitUntil(o)}}},t.prototype.O=function(e){if(e&&\"object\"==typeof e.notification){var t=Object.assign({},e.notification);return t.data=(r={},r.FCM_MSG=e,r),t;var r}},t.prototype.setBackgroundMessageHandler=function(e){if(e&&\"function\"!=typeof e)throw this.e.create(u.codes.BG_HANDLER_FUNCTION_EXPECTED);this.N=e},t.prototype.D=function(e){var t=new URL(e).href;return self.clients.matchAll({type:\"window\",includeUncontrolled:!0}).then(function(e){for(var r=null,n=0;n<e.length;n++)if(new URL(e[n].url).href===t){r=e[n];break}if(r)return r.focus(),r})},t.prototype.A=function(e,t){var r=this;return new Promise(function(n,o){if(!e)return o(r.e.create(u.codes.NO_WINDOW_CLIENT_TO_MSG));e.postMessage(t),n()})},t.prototype.w=function(){return self.clients.matchAll({type:\"window\",includeUncontrolled:!0}).then(function(e){return e.some(function(e){return\"visible\"===e.visibilityState})})},t.prototype.k=function(e){var t=this;return self.clients.matchAll({type:\"window\",includeUncontrolled:!0}).then(function(r){var n=m.createNewMsg(m.TYPES_OF_MSG.PUSH_MSG_RECEIVED,e);return Promise.all(r.map(function(e){return t.A(e,n)}))})},t.prototype._=function(){return Promise.resolve(self.registration)},t}(S),A=D,P=r(6);t.registerMessaging=o,o(P.firebase)}},[116])}catch(e){throw Error(\"Cannot instantiate firebase-messaging.js - be sure to load firebase-app.js first.\")}\n\n/*!\n * @license Firebase v4.9.0\n * Build: rev-a586a7f\n * Terms: https://firebase.google.com/terms/\n */\ntry{webpackJsonpFirebase([2],{118:function(t,e,n){n(119)},119:function(t,e,n){\"use strict\";function r(t){return\"storage/\"+t}function o(){return new te(ee.UNKNOWN,\"An unknown error occurred, please check the error payload for server response.\")}function i(t){return new te(ee.OBJECT_NOT_FOUND,\"Object '\"+t+\"' does not exist.\")}function a(t){return new te(ee.QUOTA_EXCEEDED,\"Quota for bucket '\"+t+\"' exceeded, please view quota on https://firebase.google.com/pricing/.\")}function s(){return new te(ee.UNAUTHENTICATED,\"User is not authenticated, please authenticate using Firebase Authentication and try again.\")}function u(t){return new te(ee.UNAUTHORIZED,\"User does not have permission to access '\"+t+\"'.\")}function c(){return new te(ee.RETRY_LIMIT_EXCEEDED,\"Max retry time for operation exceeded, please try again.\")}function l(){return new te(ee.CANCELED,\"User canceled the upload/download.\")}function h(t){return new te(ee.INVALID_URL,\"Invalid URL '\"+t+\"'.\")}function p(t){return new te(ee.INVALID_DEFAULT_BUCKET,\"Invalid default bucket '\"+t+\"'.\")}function f(){return new te(ee.CANNOT_SLICE_BLOB,\"Cannot slice blob for upload. Please retry the upload.\")}function d(){return new te(ee.SERVER_FILE_WRONG_SIZE,\"Server recorded incorrect upload file size, please retry the upload.\")}function _(){return new te(ee.NO_DOWNLOAD_URL,\"The given file does not have any download URLs.\")}function v(t,e,n){return new te(ee.INVALID_ARGUMENT,\"Invalid argument in `\"+e+\"` at index \"+t+\": \"+n)}function b(t,e,n,r){var o,i;return t===e?(o=t,i=1===t?\"argument\":\"arguments\"):(o=\"between \"+t+\" and \"+e,i=\"arguments\"),new te(ee.INVALID_ARGUMENT_COUNT,\"Invalid argument count in `\"+n+\"`: Expected \"+o+\" \"+i+\", received \"+r+\".\")}function m(){return new te(ee.APP_DELETED,\"The Firebase app was deleted.\")}function g(t){return new te(ee.INVALID_ROOT_OPERATION,\"The operation '\"+t+\"' cannot be performed on a root reference, create a non-root reference using child, such as .child('file.png').\")}function y(t,e){return new te(ee.INVALID_FORMAT,\"String does not match format '\"+t+\"': \"+e)}function R(t){throw new te(ee.INTERNAL_ERROR,\"Internal error: \"+t)}function E(t){switch(t){case ne.RAW:case ne.BASE64:case ne.BASE64URL:case ne.DATA_URL:return;default:throw\"Expected one of the event types: [\"+ne.RAW+\", \"+ne.BASE64+\", \"+ne.BASE64URL+\", \"+ne.DATA_URL+\"].\"}}function w(t,e){switch(t){case ne.RAW:return new re(U(e));case ne.BASE64:case ne.BASE64URL:return new re(A(t,e));case ne.DATA_URL:return new re(N(e),O(e))}throw o()}function U(t){for(var e=[],n=0;n<t.length;n++){var r=t.charCodeAt(n);if(r<=127)e.push(r);else if(r<=2047)e.push(192|r>>6,128|63&r);else if(55296==(64512&r)){var o=n<t.length-1&&56320==(64512&t.charCodeAt(n+1));if(o){var i=r,a=t.charCodeAt(++n);r=65536|(1023&i)<<10|1023&a,e.push(240|r>>18,128|r>>12&63,128|r>>6&63,128|63&r)}else e.push(239,191,189)}else 56320==(64512&r)?e.push(239,191,189):e.push(224|r>>12,128|r>>6&63,128|63&r)}return new Uint8Array(e)}function T(t){var e;try{e=decodeURIComponent(t)}catch(t){throw y(ne.DATA_URL,\"Malformed data URL.\")}return U(e)}function A(t,e){switch(t){case ne.BASE64:var n=-1!==e.indexOf(\"-\"),r=-1!==e.indexOf(\"_\");if(n||r){var o=n?\"-\":\"_\";throw y(t,\"Invalid character '\"+o+\"' found: is it base64url encoded?\")}break;case ne.BASE64URL:var i=-1!==e.indexOf(\"+\"),a=-1!==e.indexOf(\"/\");if(i||a){var o=i?\"+\":\"/\";throw y(t,\"Invalid character '\"+o+\"' found: is it base64 encoded?\")}e=e.replace(/-/g,\"+\").replace(/_/g,\"/\")}var s;try{s=atob(e)}catch(e){throw y(t,\"Invalid character found\")}for(var u=new Uint8Array(s.length),c=0;c<s.length;c++)u[c]=s.charCodeAt(c);return u}function N(t){var e=new oe(t);return e.base64?A(ne.BASE64,e.rest):T(e.rest)}function O(t){return new oe(t).contentType}function C(t,e){return!!(t.length>=e.length)&&t.substring(t.length-e.length)===e}function S(t){switch(t){case ae.RUNNING:case ae.PAUSING:case ae.CANCELING:return se.RUNNING;case ae.PAUSED:return se.PAUSED;case ae.SUCCESS:return se.SUCCESS;case ae.CANCELED:return se.CANCELED;case ae.ERROR:default:return se.ERROR}}function k(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function I(t,e){for(var n in t)k(t,n)&&e(n,t[n])}function L(t){if(null==t)return{};var e={};return I(t,function(t,n){e[t]=n}),e}function P(t){return new Promise(t)}function x(t){return Promise.resolve(t)}function D(t){return Promise.reject(t)}function M(t){return null!=t}function W(t){return void 0!==t}function B(t){return\"function\"==typeof t}function G(t){return\"object\"==typeof t}function j(t){return G(t)&&null!==t}function q(t){return G(t)&&!Array.isArray(t)}function F(t){return\"string\"==typeof t||t instanceof String}function H(t){return\"number\"==typeof t||t instanceof Number}function z(t){return X()&&t instanceof Blob}function X(){return\"undefined\"!=typeof Blob}function V(t){var e;try{e=JSON.parse(t)}catch(t){return null}return q(e)?e:null}function K(t){if(0==t.length)return null;var e=t.lastIndexOf(\"/\");return-1===e?\"\":t.slice(0,e)}function Z(t,e){var n=e.split(\"/\").filter(function(t){return t.length>0}).join(\"/\");return 0===t.length?n:t+\"/\"+n}function J(t){var e=t.lastIndexOf(\"/\",t.length-2);return-1===e?t:t.slice(e+1)}function Q(t){return Vt+Zt+t}function Y(t){return Kt+Zt+t}function $(t){return Vt+Jt+t}function tt(t){var e=encodeURIComponent,n=\"?\";return I(t,function(t,r){var o=e(t)+\"=\"+e(r);n=n+o+\"&\"}),n=n.slice(0,-1)}function et(t,e){return e}function nt(t){return!F(t)||t.length<2?t:(t=t,J(t))}function rt(){function t(t,e){return nt(e)}function e(t,e){return M(e)?+e:e}function n(t,e){if(!(F(e)&&e.length>0))return[];var n=encodeURIComponent;return e.split(\",\").map(function(e){var r=t.bucket,o=t.fullPath;return Y(\"/b/\"+n(r)+\"/o/\"+n(o))+tt({alt:\"media\",token:e})})}if(pe)return pe;var r=[];r.push(new he(\"bucket\")),r.push(new he(\"generation\")),r.push(new he(\"metageneration\")),r.push(new he(\"name\",\"fullPath\",!0));var o=new he(\"name\");o.xform=t,r.push(o);var i=new he(\"size\");return i.xform=e,r.push(i),r.push(new he(\"timeCreated\")),r.push(new he(\"updated\")),r.push(new he(\"md5Hash\",null,!0)),r.push(new he(\"cacheControl\",null,!0)),r.push(new he(\"contentDisposition\",null,!0)),r.push(new he(\"contentEncoding\",null,!0)),r.push(new he(\"contentLanguage\",null,!0)),r.push(new he(\"contentType\",null,!0)),r.push(new he(\"metadata\",\"customMetadata\",!0)),r.push(new he(\"downloadTokens\",\"downloadURLs\",!1,n)),pe=r}function ot(t,e){function n(){var n=t.bucket,r=t.fullPath,o=new le(n,r);return e.makeStorageReference(o)}Object.defineProperty(t,\"ref\",{get:n})}function it(t,e,n){var r={};r.type=\"file\";for(var o=n.length,i=0;i<o;i++){var a=n[i];r[a.local]=a.xform(r,e[a.server])}return ot(r,t),r}function at(t,e,n){var r=V(e);return null===r?null:it(t,r,n)}function st(t,e){for(var n={},r=e.length,o=0;o<r;o++){var i=e[o];i.writable&&(n[i.server]=t[i.local])}return JSON.stringify(n)}function ut(t){if(!t||!G(t))throw\"Expected Metadata object.\";for(var e in t){var n=t[e];if(\"customMetadata\"===e){if(!G(n))throw\"Expected object for 'customMetadata' mapping.\"}else if(j(n))throw\"Mapping for '\"+e+\"' cannot be an object.\"}}function ct(t,e,n){for(var r=e.length,o=e.length,i=0;i<e.length;i++)if(e[i].optional){r=i;break}if(!(r<=n.length&&n.length<=o))throw b(r,o,t,n.length);for(var i=0;i<n.length;i++)try{e[i].validator(n[i])}catch(e){throw e instanceof Error?v(i,t,e.message):v(i,t,e)}}function lt(t,e){return function(n){t(n),e(n)}}function ht(t,e){function n(t){if(!F(t))throw\"Expected string.\"}var r;return r=t?lt(n,t):n,new fe(r,e)}function pt(){function t(t){if(!(t instanceof Uint8Array||t instanceof ArrayBuffer||X()&&t instanceof Blob))throw\"Expected Blob or File.\"}return new fe(t)}function ft(t){return new fe(ut,t)}function dt(){function t(t){if(!(H(t)&&t>=0))throw\"Expected a number 0 or greater.\"}return new fe(t)}function _t(t,e){function n(e){if(!(null===e||M(e)&&e instanceof Object))throw\"Expected an Object.\";void 0!==t&&null!==t&&t(e)}return new fe(n,e)}function vt(t){function e(t){if(null!==t&&!B(t))throw\"Expected a Function.\"}return new fe(e,t)}function bt(){return\"undefined\"!=typeof BlobBuilder?BlobBuilder:\"undefined\"!=typeof WebKitBlobBuilder?WebKitBlobBuilder:void 0}function mt(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var n=bt();if(void 0!==n){for(var r=new n,o=0;o<t.length;o++)r.append(t[o]);return r.getBlob()}if(X())return new Blob(t);throw Error(\"This browser doesn't seem to support creating Blobs\")}function gt(t,e,n){return t.webkitSlice?t.webkitSlice(e,n):t.mozSlice?t.mozSlice(e,n):t.slice?t.slice(e,n):null}function yt(t,e){return-1!==t.indexOf(e)}function Rt(t){return Array.prototype.slice.call(t)}function Et(t,e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}function wt(t){if(!t)throw o()}function Ut(t,e){function n(n,r){var o=at(t,r,e);return wt(null!==o),o}return n}function Tt(t){function e(e,n){var r;return r=401===e.getStatus()?s():402===e.getStatus()?a(t.bucket):403===e.getStatus()?u(t.path):n,r.setServerResponseProp(n.serverResponseProp()),r}return e}function At(t){function e(e,r){var o=n(e,r);return 404===e.getStatus()&&(o=i(t.path)),o.setServerResponseProp(r.serverResponseProp()),o}var n=Tt(t);return e}function Nt(t,e,n){var r=e.fullServerUrl(),o=Q(r),i=t.maxOperationRetryTime(),a=new _e(o,\"GET\",Ut(t,n),i);return a.errorHandler=At(e),a}function Ot(t,e,n,r){var o=e.fullServerUrl(),i=Q(o),a=st(n,r),s={\"Content-Type\":\"application/json; charset=utf-8\"},u=t.maxOperationRetryTime(),c=new _e(i,\"PATCH\",Ut(t,r),u);return c.headers=s,c.body=a,c.errorHandler=At(e),c}function Ct(t,e){function n(t,e){}var r=e.fullServerUrl(),o=Q(r),i=t.maxOperationRetryTime(),a=new _e(o,\"DELETE\",n,i);return a.successCodes=[200,204],a.errorHandler=At(e),a}function St(t,e){return t&&t.contentType||e&&e.type()||\"application/octet-stream\"}function kt(t,e,n){var r=L(n);return r.fullPath=t.path,r.size=e.size(),r.contentType||(r.contentType=St(null,e)),r}function It(t,e,n,r,o){var i=e.bucketOnlyServerUrl(),a={\"X-Goog-Upload-Protocol\":\"multipart\"},s=function(){for(var t=\"\",e=0;e<2;e++)t+=(\"\"+Math.random()).slice(2);return t}();a[\"Content-Type\"]=\"multipart/related; boundary=\"+s;var u=kt(e,r,o),c=st(u,n),l=\"--\"+s+\"\\r\\nContent-Type: application/json; charset=utf-8\\r\\n\\r\\n\"+c+\"\\r\\n--\"+s+\"\\r\\nContent-Type: \"+u.contentType+\"\\r\\n\\r\\n\",h=\"\\r\\n--\"+s+\"--\",p=de.getBlob(l,r,h);if(null===p)throw f();var d={name:u.fullPath},_=$(i),v=t.maxUploadRetryTime(),b=new _e(_,\"POST\",Ut(t,n),v);return b.urlParams=d,b.headers=a,b.body=p.uploadData(),b.errorHandler=Tt(e),b}function Lt(t,e){var n;try{n=t.getResponseHeader(\"X-Goog-Upload-Status\")}catch(t){wt(!1)}return wt(yt(e||[\"active\"],n)),n}function Pt(t,e,n,r,o){function i(t,e){Lt(t);var n;try{n=t.getResponseHeader(\"X-Goog-Upload-URL\")}catch(t){wt(!1)}return wt(F(n)),n}var a=e.bucketOnlyServerUrl(),s=kt(e,r,o),u={name:s.fullPath},c=$(a),l={\"X-Goog-Upload-Protocol\":\"resumable\",\"X-Goog-Upload-Command\":\"start\",\"X-Goog-Upload-Header-Content-Length\":r.size(),\"X-Goog-Upload-Header-Content-Type\":s.contentType,\"Content-Type\":\"application/json; charset=utf-8\"},h=st(s,n),p=t.maxUploadRetryTime(),f=new _e(c,\"POST\",i,p);return f.urlParams=u,f.headers=l,f.body=h,f.errorHandler=Tt(e),f}function xt(t,e,n,r){function o(t,e){var n,o=Lt(t,[\"active\",\"final\"]);try{n=t.getResponseHeader(\"X-Goog-Upload-Size-Received\")}catch(t){wt(!1)}var i=parseInt(n,10);return wt(!isNaN(i)),new ve(i,r.size(),\"final\"===o)}var i={\"X-Goog-Upload-Command\":\"query\"},a=t.maxUploadRetryTime(),s=new _e(n,\"POST\",o,a);return s.headers=i,s.errorHandler=Tt(e),s}function Dt(t,e,n,r,o,i,a,s){function u(t,n){var o,a=Lt(t,[\"active\",\"final\"]),s=c.current+h,u=r.size();return o=\"final\"===a?Ut(e,i)(t,n):null,new ve(s,u,\"final\"===a,o)}var c=new ve(0,0);if(a?(c.current=a.current,c.total=a.total):(c.current=0,c.total=r.size()),r.size()!==c.total)throw d();var l=c.total-c.current,h=l;o>0&&(h=Math.min(h,o));var p=c.current,_=p+h,v=h===l?\"upload, finalize\":\"upload\",b={\"X-Goog-Upload-Command\":v,\"X-Goog-Upload-Offset\":c.current},m=r.slice(p,_);if(null===m)throw f();var g=e.maxUploadRetryTime(),y=new _e(n,\"POST\",u,g);return y.headers=b,y.body=m.uploadData(),y.progressCallback=s||null,y.errorHandler=Tt(t),y}function Mt(t){return function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];x(!0).then(function(){t.apply(null,e)})}}function Wt(t,e,n){function r(){return 2===h}function o(){p||(p=!0,e.apply(null,arguments))}function i(e){c=setTimeout(function(){c=null,t(a,r())},e)}function a(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];if(!p){if(t)return void o.apply(null,arguments);if(r()||l)return void o.apply(null,arguments);u<64&&(u*=2);var a;1===h?(h=2,a=0):a=1e3*(u+Math.random()),i(a)}}function s(t){f||(f=!0,p||(null!==c?(t||(h=2),clearTimeout(c),i(0)):t||(h=1)))}var u=1,c=null,l=!1,h=0,p=!1,f=!1;return i(0),setTimeout(function(){l=!0,s(!0)},n),s}function Bt(t){t(!1)}function Gt(t,e){null!==e&&e.length>0&&(t.Authorization=\"Firebase \"+e)}function jt(t){var e=void 0!==Xt.default?Xt.default.SDK_VERSION:\"AppManager\";t[\"X-Firebase-Storage-Version\"]=\"webjs/\"+e}function qt(t,e,n){var r=tt(t.urlParams),o=t.url+r,i=L(t.headers);return Gt(i,e),jt(i),new Ue(o,t.method,i,t.body,t.successCodes,t.additionalRetryCodes,t.handler,t.errorHandler,t.timeout,t.progressCallback,n)}function Ft(t,e,n){return new Ae(t,new ce,n)}function Ht(t){var e={TaskState:se,TaskEvent:ie,StringFormat:ne,Storage:Ae,Reference:ye};t.INTERNAL.registerService(Oe,Ft,e,void 0,!0)}Object.defineProperty(e,\"__esModule\",{value:!0});var zt,Xt=n(6),Vt=\"https://firebasestorage.googleapis.com\",Kt=\"https://firebasestorage.googleapis.com\",Zt=\"/v0\",Jt=\"/v0\",Qt=12e4,Yt=6e4,$t=-9007199254740991,te=function(){function t(t,e){this.t=r(t),this.e=\"Firebase Storage: \"+e,this.n=null,this.r=\"FirebaseError\"}return t.prototype.codeProp=function(){return this.code},t.prototype.codeEquals=function(t){return r(t)===this.codeProp()},t.prototype.serverResponseProp=function(){return this.n},t.prototype.setServerResponseProp=function(t){this.n=t},Object.defineProperty(t.prototype,\"name\",{get:function(){return this.r},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,\"code\",{get:function(){return this.t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,\"message\",{get:function(){return this.e},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,\"serverResponse\",{get:function(){return this.n},enumerable:!0,configurable:!0}),t}(),ee={UNKNOWN:\"unknown\",OBJECT_NOT_FOUND:\"object-not-found\",BUCKET_NOT_FOUND:\"bucket-not-found\",PROJECT_NOT_FOUND:\"project-not-found\",QUOTA_EXCEEDED:\"quota-exceeded\",UNAUTHENTICATED:\"unauthenticated\",UNAUTHORIZED:\"unauthorized\",RETRY_LIMIT_EXCEEDED:\"retry-limit-exceeded\",INVALID_CHECKSUM:\"invalid-checksum\",CANCELED:\"canceled\",INVALID_EVENT_NAME:\"invalid-event-name\",INVALID_URL:\"invalid-url\",INVALID_DEFAULT_BUCKET:\"invalid-default-bucket\",NO_DEFAULT_BUCKET:\"no-default-bucket\",CANNOT_SLICE_BLOB:\"cannot-slice-blob\",SERVER_FILE_WRONG_SIZE:\"server-file-wrong-size\",NO_DOWNLOAD_URL:\"no-download-url\",INVALID_ARGUMENT:\"invalid-argument\",INVALID_ARGUMENT_COUNT:\"invalid-argument-count\",APP_DELETED:\"app-deleted\",INVALID_ROOT_OPERATION:\"invalid-root-operation\",INVALID_FORMAT:\"invalid-format\",INTERNAL_ERROR:\"internal-error\"},ne={RAW:\"raw\",BASE64:\"base64\",BASE64URL:\"base64url\",DATA_URL:\"data_url\"},re=function(){function t(t,e){this.data=t,this.contentType=e||null}return t}(),oe=function(){function t(t){this.base64=!1,this.contentType=null;var e=t.match(/^data:([^,]+)?,/);if(null===e)throw y(ne.DATA_URL,\"Must be formatted 'data:[<mediatype>][;base64],<data>\");var n=e[1]||null;null!=n&&(this.base64=C(n,\";base64\"),this.contentType=this.base64?n.substring(0,n.length-7):n),this.rest=t.substring(t.indexOf(\",\")+1)}return t}(),ie={STATE_CHANGED:\"state_changed\"},ae={RUNNING:\"running\",PAUSING:\"pausing\",PAUSED:\"paused\",SUCCESS:\"success\",CANCELING:\"canceling\",CANCELED:\"canceled\",ERROR:\"error\"},se={RUNNING:\"running\",PAUSED:\"paused\",SUCCESS:\"success\",CANCELED:\"canceled\",ERROR:\"error\"};!function(t){t[t.NO_ERROR=0]=\"NO_ERROR\",t[t.NETWORK_ERROR=1]=\"NETWORK_ERROR\",t[t.ABORT=2]=\"ABORT\"}(zt||(zt={}));var ue=function(){function t(){var t=this;this.o=!1,this.i=new XMLHttpRequest,this.a=zt.NO_ERROR,this.s=P(function(e,n){t.i.addEventListener(\"abort\",function(n){t.a=zt.ABORT,e(t)}),t.i.addEventListener(\"error\",function(n){t.a=zt.NETWORK_ERROR,e(t)}),t.i.addEventListener(\"load\",function(n){e(t)})})}return t.prototype.send=function(t,e,n,r){var o=this;if(this.o)throw R(\"cannot .send() more than once\");return this.o=!0,this.i.open(e,t,!0),M(r)&&I(r,function(t,e){o.i.setRequestHeader(t,\"\"+e)}),M(n)?this.i.send(n):this.i.send(),this.s},t.prototype.getErrorCode=function(){if(!this.o)throw R(\"cannot .getErrorCode() before sending\");return this.a},t.prototype.getStatus=function(){if(!this.o)throw R(\"cannot .getStatus() before sending\");try{return this.i.status}catch(t){return-1}},t.prototype.getResponseText=function(){if(!this.o)throw R(\"cannot .getResponseText() before sending\");return this.i.responseText},t.prototype.abort=function(){this.i.abort()},t.prototype.getResponseHeader=function(t){return this.i.getResponseHeader(t)},t.prototype.addUploadProgressListener=function(t){M(this.i.upload)&&this.i.upload.addEventListener(\"progress\",t)},t.prototype.removeUploadProgressListener=function(t){M(this.i.upload)&&this.i.upload.removeEventListener(\"progress\",t)},t}(),ce=function(){function t(){}return t.prototype.createXhrIo=function(){return new ue},t}(),le=function(){function t(t,e){this.bucket=t,this.u=e}return Object.defineProperty(t.prototype,\"path\",{get:function(){return this.u},enumerable:!0,configurable:!0}),t.prototype.fullServerUrl=function(){var t=encodeURIComponent;return\"/b/\"+t(this.bucket)+\"/o/\"+t(this.path)},t.prototype.bucketOnlyServerUrl=function(){return\"/b/\"+encodeURIComponent(this.bucket)+\"/o\"},t.makeFromBucketSpec=function(e){var n;try{n=t.makeFromUrl(e)}catch(n){return new t(e,\"\")}if(\"\"===n.path)return n;throw p(e)},t.makeFromUrl=function(e){function n(t){\"/\"===t.path.charAt(t.path.length-1)&&(t.u=t.u.slice(0,-1))}function r(t){t.u=decodeURIComponent(t.path)}for(var o=null,i=RegExp(\"^gs://([A-Za-z0-9.\\\\-]+)(/(.*))?$\",\"i\"),a={bucket:1,path:3},s=RegExp(\"^https?://firebasestorage\\\\.googleapis\\\\.com/v[A-Za-z0-9_]+/b/([A-Za-z0-9.\\\\-]+)/o(/([^?#]*).*)?$\",\"i\"),u={bucket:1,path:3},c=[{regex:i,indices:a,postModify:n},{regex:s,indices:u,postModify:r}],l=0;l<c.length;l++){var p=c[l],f=p.regex.exec(e);if(f){var d=f[p.indices.bucket],_=f[p.indices.path];_||(_=\"\"),o=new t(d,_),p.postModify(o);break}}if(null==o)throw h(e);return o},t}(),he=function(){function t(t,e,n,r){this.server=t,this.local=e||t,this.writable=!!n,this.xform=r||et}return t}(),pe=null,fe=function(){function t(t,e){var n=this;this.validator=function(e){n.optional&&!W(e)||t(e)},this.optional=!!e}return t}(),de=function(){function t(t,e){var n=0,r=\"\";z(t)?(this.c=t,n=t.size,r=t.type):t instanceof ArrayBuffer?(e?this.c=new Uint8Array(t):(this.c=new Uint8Array(t.byteLength),this.c.set(new Uint8Array(t))),n=this.c.length):t instanceof Uint8Array&&(e?this.c=t:(this.c=new Uint8Array(t.length),this.c.set(t)),n=t.length),this.l=n,this.h=r}return t.prototype.size=function(){return this.l},t.prototype.type=function(){return this.h},t.prototype.slice=function(e,n){if(z(this.c)){var r=this.c,o=gt(r,e,n);return null===o?null:new t(o)}return new t(new Uint8Array(this.c.buffer,e,n-e),!0)},t.getBlob=function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];if(X()){var r=e.map(function(e){return e instanceof t?e.c:e});return new t(mt.apply(null,r))}var o=e.map(function(t){return F(t)?w(ne.RAW,t).data:t.c}),i=0;o.forEach(function(t){i+=t.byteLength});var a=new Uint8Array(i),s=0;return o.forEach(function(t){for(var e=0;e<t.length;e++)a[s++]=t[e]}),new t(a,!0)},t.prototype.uploadData=function(){return this.c},t}(),_e=function(){function t(t,e,n,r){this.url=t,this.method=e,this.handler=n,this.timeout=r,this.urlParams={},this.headers={},this.body=null,this.errorHandler=null,this.progressCallback=null,this.successCodes=[200],this.additionalRetryCodes=[]}return t}(),ve=function(){function t(t,e,n,r){this.current=t,this.total=e,this.finalized=!!n,this.metadata=r||null}return t}(),be=function(){function t(t,e,n){if(B(t)||M(e)||M(n))this.next=t,this.error=e||null,this.complete=n||null;else{var r=t;this.next=r.next||null,this.error=r.error||null,this.complete=r.complete||null}}return t}(),me=function(){function t(t,e,n,r,o,i){this.bytesTransferred=t,this.totalBytes=e,this.state=n,this.metadata=r,this.task=o,this.ref=i}return Object.defineProperty(t.prototype,\"downloadURL\",{get:function(){if(null!==this.metadata){var t=this.metadata.downloadURLs;return null!=t&&null!=t[0]?t[0]:null}return null},enumerable:!0,configurable:!0}),t}(),ge=function(){function t(t,e,n,r,o,i){void 0===i&&(i=null);var a=this;this.p=0,this.f=!1,this.d=!1,this._=[],this.v=null,this.b=null,this.m=null,this.g=1,this.y=null,this.R=null,this.w=t,this.U=e,this.T=n,this.A=o,this.N=i,this.O=r,this.C=this.S(this.A),this.k=ae.RUNNING,this.I=function(t){a.m=null,a.g=1,t.codeEquals(ee.CANCELED)?(a.f=!0,a.L()):(a.v=t,a.P(ae.ERROR))},this.x=function(t){a.m=null,t.codeEquals(ee.CANCELED)?a.L():(a.v=t,a.P(ae.ERROR))},this.D=P(function(t,e){a.y=t,a.R=e,a.M()}),this.D.then(null,function(){})}return t.prototype.W=function(){var t=this,e=this.p;return function(n,r){t.B(e+n)}},t.prototype.S=function(t){return t.size()>262144},t.prototype.M=function(){this.k===ae.RUNNING&&null===this.m&&(this.C?null===this.b?this.G():this.f?this.j():this.d?this.q():this.F():this.H())},t.prototype.z=function(t){var e=this;this.U.getAuthToken().then(function(n){switch(e.k){case ae.RUNNING:t(n);break;case ae.CANCELING:e.P(ae.CANCELED);break;case ae.PAUSING:e.P(ae.PAUSED)}})},t.prototype.G=function(){var t=this;this.z(function(e){var n=Pt(t.U,t.T,t.O,t.A,t.N),r=t.U.makeRequest(n,e);t.m=r,r.getPromise().then(function(e){t.m=null,t.b=e,t.f=!1,t.L()},t.I)})},t.prototype.j=function(){var t=this,e=this.b;this.z(function(n){var r=xt(t.U,t.T,e,t.A),o=t.U.makeRequest(r,n);t.m=o,o.getPromise().then(function(e){e=e,t.m=null,t.B(e.current),t.f=!1,e.finalized&&(t.d=!0),t.L()},t.I)})},t.prototype.F=function(){var t=this,e=262144*this.g,n=new ve(this.p,this.A.size()),r=this.b;this.z(function(o){var i;try{i=Dt(t.T,t.U,r,t.A,e,t.O,n,t.W())}catch(e){return t.v=e,void t.P(ae.ERROR)}var a=t.U.makeRequest(i,o);t.m=a,a.getPromise().then(function(e){t.X(),t.m=null,t.B(e.current),e.finalized?(t.N=e.metadata,t.P(ae.SUCCESS)):t.L()},t.I)})},t.prototype.X=function(){262144*this.g<33554432&&(this.g*=2)},t.prototype.q=function(){var t=this;this.z(function(e){var n=Nt(t.U,t.T,t.O),r=t.U.makeRequest(n,e);t.m=r,r.getPromise().then(function(e){t.m=null,t.N=e,t.P(ae.SUCCESS)},t.x)})},t.prototype.H=function(){var t=this;this.z(function(e){var n=It(t.U,t.T,t.O,t.A,t.N),r=t.U.makeRequest(n,e);t.m=r,r.getPromise().then(function(e){t.m=null,t.N=e,t.B(t.A.size()),t.P(ae.SUCCESS)},t.I)})},t.prototype.B=function(t){var e=this.p;this.p=t,this.p!==e&&this.V()},t.prototype.P=function(t){if(this.k!==t)switch(t){case ae.CANCELING:case ae.PAUSING:this.k=t,null!==this.m&&this.m.cancel();break;case ae.RUNNING:var e=this.k===ae.PAUSED;this.k=t,e&&(this.V(),this.M());break;case ae.PAUSED:this.k=t,this.V();break;case ae.CANCELED:this.v=l(),this.k=t,this.V();break;case ae.ERROR:case ae.SUCCESS:this.k=t,this.V()}},t.prototype.L=function(){switch(this.k){case ae.PAUSING:this.P(ae.PAUSED);break;case ae.CANCELING:this.P(ae.CANCELED);break;case ae.RUNNING:this.M()}},Object.defineProperty(t.prototype,\"snapshot\",{get:function(){var t=S(this.k);return new me(this.p,this.A.size(),t,this.N,this,this.w)},enumerable:!0,configurable:!0}),t.prototype.on=function(t,e,n,r){function o(e){if(t!==ie.STATE_CHANGED)throw\"Expected one of the event types: [\"+ie.STATE_CHANGED+\"].\"}function i(t){try{return void c(t)}catch(t){}try{if(l(t),!(W(t.next)||W(t.error)||W(t.complete)))throw\"\";return}catch(t){throw u}}function a(t){function e(e,n,o){null!==t&&ct(\"on\",t,arguments);var i=new be(e,n,r);return h.K(i),function(){h.Z(i)}}return e}function s(t){if(null===t)throw u;i(t)}void 0===e&&(e=void 0),void 0===n&&(n=void 0),void 0===r&&(r=void 0);var u=\"Expected a function or an Object with one of `next`, `error`, `complete` properties.\",c=vt(!0).validator,l=_t(null,!0).validator;ct(\"on\",[ht(o),_t(i,!0),vt(!0),vt(!0)],arguments);var h=this,p=[_t(s),vt(!0),vt(!0)];return W(e)||W(n)||W(r)?a(null)(e,n,r):a(p)},t.prototype.then=function(t,e){return this.D.then(t,e)},t.prototype.catch=function(t){return this.then(null,t)},t.prototype.K=function(t){this._.push(t),this.J(t)},t.prototype.Z=function(t){Et(this._,t)},t.prototype.V=function(){var t=this;this.Q(),Rt(this._).forEach(function(e){t.J(e)})},t.prototype.Q=function(){if(null!==this.y){var t=!0;switch(S(this.k)){case se.SUCCESS:Mt(this.y.bind(null,this.snapshot))();break;case se.CANCELED:case se.ERROR:Mt(this.R.bind(null,this.v))();break;default:t=!1}t&&(this.y=null,this.R=null)}},t.prototype.J=function(t){switch(S(this.k)){case se.RUNNING:case se.PAUSED:null!==t.next&&Mt(t.next.bind(t,this.snapshot))();break;case se.SUCCESS:null!==t.complete&&Mt(t.complete.bind(t))();break;case se.CANCELED:case se.ERROR:null!==t.error&&Mt(t.error.bind(t,this.v))();break;default:null!==t.error&&Mt(t.error.bind(t,this.v))()}},t.prototype.resume=function(){ct(\"resume\",[],arguments);var t=this.k===ae.PAUSED||this.k===ae.PAUSING;return t&&this.P(ae.RUNNING),t},t.prototype.pause=function(){ct(\"pause\",[],arguments);var t=this.k===ae.RUNNING;return t&&this.P(ae.PAUSING),t},t.prototype.cancel=function(){ct(\"cancel\",[],arguments);var t=this.k===ae.RUNNING||this.k===ae.PAUSING;return t&&this.P(ae.CANCELING),t},t}(),ye=function(){function t(t,e){this.authWrapper=t,this.location=e instanceof le?e:le.makeFromUrl(e)}return t.prototype.toString=function(){return ct(\"toString\",[],arguments),\"gs://\"+this.location.bucket+\"/\"+this.location.path},t.prototype.newRef=function(e,n){return new t(e,n)},t.prototype.mappings=function(){return rt()},t.prototype.child=function(t){ct(\"child\",[ht()],arguments);var e=Z(this.location.path,t),n=new le(this.location.bucket,e);return this.newRef(this.authWrapper,n)},Object.defineProperty(t.prototype,\"parent\",{get:function(){var t=K(this.location.path);if(null===t)return null;var e=new le(this.location.bucket,t);return this.newRef(this.authWrapper,e)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,\"root\",{get:function(){var t=new le(this.location.bucket,\"\");return this.newRef(this.authWrapper,t)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,\"bucket\",{get:function(){return this.location.bucket},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,\"fullPath\",{get:function(){return this.location.path},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,\"name\",{get:function(){return J(this.location.path)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,\"storage\",{get:function(){return this.authWrapper.service()},enumerable:!0,configurable:!0}),t.prototype.put=function(t,e){return void 0===e&&(e=null),ct(\"put\",[pt(),ft(!0)],arguments),this.Y(\"put\"),new ge(this,this.authWrapper,this.location,this.mappings(),new de(t),e)},t.prototype.putString=function(t,e,n){void 0===e&&(e=ne.RAW),ct(\"putString\",[ht(),ht(E,!0),ft(!0)],arguments),this.Y(\"putString\");var r=w(e,t),o=L(n);return!M(o.contentType)&&M(r.contentType)&&(o.contentType=r.contentType),new ge(this,this.authWrapper,this.location,this.mappings(),new de(r.data,!0),o)},t.prototype.delete=function(){ct(\"delete\",[],arguments),this.Y(\"delete\");var t=this;return this.authWrapper.getAuthToken().then(function(e){var n=Ct(t.authWrapper,t.location);return t.authWrapper.makeRequest(n,e).getPromise()})},t.prototype.getMetadata=function(){ct(\"getMetadata\",[],arguments),this.Y(\"getMetadata\");var t=this;return this.authWrapper.getAuthToken().then(function(e){var n=Nt(t.authWrapper,t.location,t.mappings());return t.authWrapper.makeRequest(n,e).getPromise()})},t.prototype.updateMetadata=function(t){ct(\"updateMetadata\",[ft()],arguments),this.Y(\"updateMetadata\");var e=this;return this.authWrapper.getAuthToken().then(function(n){var r=Ot(e.authWrapper,e.location,t,e.mappings());return e.authWrapper.makeRequest(r,n).getPromise()})},t.prototype.getDownloadURL=function(){return ct(\"getDownloadURL\",[],arguments),this.Y(\"getDownloadURL\"),this.getMetadata().then(function(t){var e=t.downloadURLs[0];if(M(e))return e;throw _()})},t.prototype.Y=function(t){if(\"\"===this.location.path)throw g(t)},t}(),Re=function(){function t(t){this.D=D(t)}return t.prototype.getPromise=function(){return this.D},t.prototype.cancel=function(t){void 0===t&&(t=!1)},t}(),Ee=function(){function t(){this.$={},this.tt=$t}return t.prototype.addRequest=function(t){function e(){delete r.$[n]}var n=this.tt;this.tt++,this.$[n]=t;var r=this;t.getPromise().then(e,e)},t.prototype.clear=function(){I(this.$,function(t,e){e&&e.cancel(!0)}),this.$={}},t}(),we=function(){function t(e,n,r,o,i){if(this.et=null,this.nt=!1,this.rt=e,null!==this.rt){var a=this.rt.options;M(a)&&(this.et=t.ot(a))}this.it=n,this.at=r,this.st=i,this.ut=o,this.ct=Qt,this.lt=Yt,this.ht=new Ee}return t.ot=function(t){var e=t.storageBucket||null;return null==e?null:le.makeFromBucketSpec(e).bucket},t.prototype.getAuthToken=function(){return null!==this.rt&&M(this.rt.INTERNAL)&&M(this.rt.INTERNAL.getToken)?this.rt.INTERNAL.getToken().then(function(t){return null!==t?t.accessToken:null},function(t){return null}):x(null)},t.prototype.bucket=function(){if(this.nt)throw m();return this.et},t.prototype.service=function(){return this.ut},t.prototype.makeStorageReference=function(t){return this.it(this,t)},t.prototype.makeRequest=function(t,e){if(this.nt)return new Re(m());var n=this.at(t,e,this.st);return this.ht.addRequest(n),n},t.prototype.deleteApp=function(){this.nt=!0,this.rt=null,this.ht.clear()},t.prototype.maxUploadRetryTime=function(){return this.lt},t.prototype.setMaxUploadRetryTime=function(t){this.lt=t},t.prototype.maxOperationRetryTime=function(){return this.ct},t.prototype.setMaxOperationRetryTime=function(t){this.ct=t},t}(),Ue=function(){function t(t,e,n,r,o,i,a,s,u,c,l){this.pt=null,this.ft=null,this.y=null,this.R=null,this.dt=!1,this._t=!1,this.vt=t,this.bt=e,this.mt=n,this.gt=r,this.yt=o.slice(),this.Rt=i.slice(),this.Et=a,this.wt=s,this.Ut=c,this.Tt=u,this.st=l;var h=this;this.D=P(function(t,e){h.y=t,h.R=e,h.M()})}return t.prototype.M=function(){function t(t,e){function r(t){var e=t.loaded,r=t.lengthComputable?t.total:-1;null!==n.Ut&&n.Ut(e,r)}if(e)return void t(!1,new Te(!1,null,!0));var o=n.st.createXhrIo();n.pt=o,null!==n.Ut&&o.addUploadProgressListener(r),o.send(n.vt,n.bt,n.gt,n.mt).then(function(e){null!==n.Ut&&e.removeUploadProgressListener(r),n.pt=null,e=e;var o=e.getErrorCode()===zt.NO_ERROR,i=e.getStatus();if(!o||n.At(i)){var a=e.getErrorCode()===zt.ABORT;return void t(!1,new Te(!1,null,a))}var s=yt(n.yt,i);t(!0,new Te(s,e))})}function e(t,e){var r=n.y,i=n.R,a=e.xhr;if(e.wasSuccessCode)try{var s=n.Et(a,a.getResponseText());W(s)?r(s):r()}catch(t){i(t)}else if(null!==a){var u=o();u.setServerResponseProp(a.getResponseText()),i(n.wt?n.wt(a,u):u)}else if(e.canceled){var u=n._t?m():l();i(u)}else{var u=c();i(u)}}var n=this;this.dt?e(!1,new Te(!1,null,!0)):this.ft=Wt(t,e,this.Tt)},t.prototype.getPromise=function(){return this.D},t.prototype.cancel=function(t){this.dt=!0,this._t=t||!1,null!==this.ft&&Bt(this.ft),null!==this.pt&&this.pt.abort()},t.prototype.At=function(t){var e=t>=500&&t<600,n=[408,429],r=yt(n,t),o=yt(this.Rt,t);return e||r||o},t}(),Te=function(){function t(t,e,n){this.wasSuccessCode=t,this.xhr=e,this.canceled=!!n}return t}(),Ae=function(){function t(t,e,n){function r(t,e){return new ye(t,e)}if(this.et=null,this.U=new we(t,r,qt,this,e),this.rt=t,null!=n)this.et=le.makeFromBucketSpec(n);else{var o=this.U.bucket();null!=o&&(this.et=new le(o,\"\"))}this.Nt=new Ne(this)}return t.prototype.ref=function(t){function e(t){if(/^[A-Za-z]+:\\/\\//.test(t))throw\"Expected child path but got a URL, use refFromURL instead.\"}if(ct(\"ref\",[ht(e,!0)],arguments),null==this.et)throw Error(\"No Storage Bucket defined in Firebase Options.\");var n=new ye(this.U,this.et);return null!=t?n.child(t):n},t.prototype.refFromURL=function(t){function e(t){if(!/^[A-Za-z]+:\\/\\//.test(t))throw\"Expected full URL but got a child path, use ref instead.\";try{le.makeFromUrl(t)}catch(t){throw\"Expected valid full URL but got an invalid one.\"}}return ct(\"refFromURL\",[ht(e,!1)],arguments),new ye(this.U,t)},Object.defineProperty(t.prototype,\"maxUploadRetryTime\",{get:function(){return this.U.maxUploadRetryTime()},enumerable:!0,configurable:!0}),t.prototype.setMaxUploadRetryTime=function(t){ct(\"setMaxUploadRetryTime\",[dt()],arguments),this.U.setMaxUploadRetryTime(t)},Object.defineProperty(t.prototype,\"maxOperationRetryTime\",{get:function(){return this.U.maxOperationRetryTime()},enumerable:!0,configurable:!0}),t.prototype.setMaxOperationRetryTime=function(t){ct(\"setMaxOperationRetryTime\",[dt()],arguments),this.U.setMaxOperationRetryTime(t)},Object.defineProperty(t.prototype,\"app\",{get:function(){return this.rt},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,\"INTERNAL\",{get:function(){return this.Nt},enumerable:!0,configurable:!0}),t}(),Ne=function(){function t(t){this.ut=t}return t.prototype.delete=function(){return this.ut.U.deleteApp(),x(void 0)},t}();e.registerStorage=Ht;var Oe=\"storage\";Ht(Xt.default)}},[118])}catch(t){throw Error(\"Cannot instantiate firebase-storage.js - be sure to load firebase-app.js first.\")}\n\n//# sourceMappingURL=firebase.js.map\n"
  },
  {
    "path": "lib/font-detective.js",
    "content": "(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 after, domReady, every;\n\nafter = function(ms, fn) {\n  var tid;\n  tid = setTimeout(fn, ms);\n  return {\n    stop: function() {\n      return clearTimeout(tid);\n    }\n  };\n};\n\nevery = function(ms, fn) {\n  var iid;\n  iid = setInterval(fn, ms);\n  return {\n    stop: function() {\n      return clearInterval(iid);\n    }\n  };\n};\n\ndomReady = function(callback) {\n  if (/in/.test(document.readyState)) {\n    return after(10, function() {\n      return domReady(callback);\n    });\n  } else {\n    return callback();\n  }\n};\n\n(function(exports) {\n  var FD, Font, container, doneTestingFonts, fontAvailabilityChecker, genericFontFamilies, loadFonts, someCommonFontNames, startedLoading, testFonts, testedFonts;\n  FD = exports.FontDetective = {};\n  genericFontFamilies = [\"serif\", \"sans-serif\", \"cursive\", \"fantasy\", \"monospace\"];\n  someCommonFontNames = \"Helvetica,Lucida Grande,Lucida Sans,Tahoma,Arial,Geneva,Monaco,Verdana,Microsoft Sans Serif,Trebuchet MS,Courier New,Times New Roman,Courier,Lucida Bright,Lucida Sans Typewriter,URW Chancery L,Comic Sans MS,Georgia,Palatino Linotype,Lucida Sans Unicode,Times,Century Schoolbook L,URW Gothic L,Franklin Gothic Medium,Lucida Console,Impact,URW Bookman L,Helvetica Neue,Nimbus Sans L,URW Palladio L,Nimbus Mono L,Nimbus Roman No9 L,Arial Black,Sylfaen,MV Boli,Estrangelo Edessa,Tunga,Gautami,Raavi,Mangal,Shruti,Latha,Kartika,Vrinda,Arial Narrow,Century Gothic,Garamond,Book Antiqua,Bookman Old Style,Calibri,Cambria,Candara,Corbel,Monotype Corsiva,Cambria Math,Consolas,Constantia,MS Reference Sans Serif,MS Mincho,Segoe UI,Arial Unicode MS,Tempus Sans ITC,Kristen ITC,Mistral,Meiryo UI,Juice ITC,Papyrus,Bradley Hand ITC,French Script MT,Malgun Gothic,Microsoft YaHei,Gisha,Leelawadee,Microsoft JhengHei,Haettenschweiler,Microsoft Himalaya,Microsoft Uighur,MoolBoran,Jokerman,DFKai-SB,KaiTi,SimSun-ExtB,Freestyle Script,Vivaldi,FangSong,MingLiU-ExtB,MingLiU_HKSCS,MingLiU_HKSCS-ExtB,PMingLiU-ExtB,Copperplate Gothic Light,Copperplate Gothic Bold,Franklin Gothic Book,Maiandra GD,Perpetua,Eras Demi ITC,Felix Titling,Franklin Gothic Demi,Pristina,Edwardian Script ITC,OCR A Extended,Engravers MT,Eras Light ITC,Franklin Gothic Medium Cond,Rockwell Extra Bold,Rockwell,Curlz MT,Blackadder ITC,Franklin Gothic Heavy,Franklin Gothic Demi Cond,Lucida Handwriting,Segoe UI Light,Segoe UI Semibold,Lucida Calligraphy,Cooper Black,Viner Hand ITC,Britannic Bold,Wide Latin,Old English Text MT,Broadway,Footlight MT Light,Harrington,Snap ITC,Onyx,Playbill,Bauhaus 93,Baskerville Old Face,Algerian,Matura MT Script Capitals,Stencil,Batang,Chiller,Harlow Solid Italic,Kunstler Script,Bernard MT Condensed,Informal Roman,Vladimir Script,Bell MT,Colonna MT,High Tower Text,Californian FB,Ravie,Segoe Script,Brush Script MT,SimSun,Arial Rounded MT Bold,Berlin Sans FB,Centaur,Niagara Solid,Showcard Gothic,Niagara Engraved,Segoe Print,Gabriola,Gill Sans MT,Iskoola Pota,Calisto MT,Script MT Bold,Century Schoolbook,Berlin Sans FB Demi,Magneto,Arabic Typesetting,DaunPenh,Mongolian Baiti,DokChampa,Euphemia,Kalinga,Microsoft Yi Baiti,Nyala,Bodoni MT Poster Compressed,Goudy Old Style,Imprint MT Shadow,Gill Sans MT Condensed,Gill Sans Ultra Bold,Palace Script MT,Lucida Fax,Gill Sans MT Ext Condensed Bold,Goudy Stout,Eras Medium ITC,Rage Italic,Rockwell Condensed,Castellar,Eras Bold ITC,Forte,Gill Sans Ultra Bold Condensed,Perpetua Titling MT,Agency FB,Tw Cen MT,Gigi,Tw Cen MT Condensed,Aparajita,Gloucester MT Extra Condensed,Tw Cen MT Condensed Extra Bold,PMingLiU,Bodoni MT,Bodoni MT Black,Bodoni MT Condensed,MS Gothic,GulimChe,MS UI Gothic,MS PGothic,Gulim,MS PMincho,BatangChe,Dotum,DotumChe,Gungsuh,GungsuhChe,MingLiU,NSimSun,SimHei,DejaVu Sans,DejaVu Sans Condensed,DejaVu Sans Mono,DejaVu Serif,DejaVu Serif Condensed,Eurostile,Matisse ITC,Bitstream Vera Sans Mono,Bitstream Vera Sans,Staccato222 BT,Bitstream Vera Serif,Broadway BT,ParkAvenue BT,Square721 BT,Calligraph421 BT,MisterEarl BT,Cataneo BT,Ruach LET,Rage Italic LET,La Bamba LET,Blackletter686 BT,John Handy LET,Scruff LET,Westwood LET\".split(\",\").sort();\n  testedFonts = [];\n  doneTestingFonts = false;\n  startedLoading = false;\n  container = document.createElement(\"div\");\n  container.id = \"font-detective\";\n\n  /*\n  \t * A font class that can be stringified for use in css\n  \t * e.g. font.toString() or (font + \", sans-serif\")\n   */\n  Font = (function() {\n    function Font(name, type, style) {\n      this.name = name;\n      this.type = type;\n      this.style = style;\n    }\n\n    Font.prototype.toString = function() {\n      return '\"' + this.name.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, \"\\\\\\\"\") + '\"';\n    };\n\n    return Font;\n\n  })();\n  fontAvailabilityChecker = (function() {\n    var baseFontFamilies, baseHeights, baseWidths, span;\n    baseFontFamilies = [\"monospace\", \"sans-serif\", \"serif\"];\n    span = document.createElement(\"span\");\n    span.innerHTML = \"mmmmmmmmmmlli\";\n    span.style.fontSize = \"72px\";\n    baseWidths = {};\n    baseHeights = {};\n    return {\n      init: function() {\n        var baseFontFamily, j, len, results;\n        document.body.appendChild(container);\n        results = [];\n        for (j = 0, len = baseFontFamilies.length; j < len; j++) {\n          baseFontFamily = baseFontFamilies[j];\n          span.style.fontFamily = baseFontFamily;\n          container.appendChild(span);\n          baseWidths[baseFontFamily] = span.offsetWidth;\n          baseHeights[baseFontFamily] = span.offsetHeight;\n          results.push(container.removeChild(span));\n        }\n        return results;\n      },\n      check: function(font) {\n        var baseFontFamily, differs, j, len;\n        for (j = 0, len = baseFontFamilies.length; j < len; j++) {\n          baseFontFamily = baseFontFamilies[j];\n          span.style.fontFamily = font + \", \" + baseFontFamily;\n          container.appendChild(span);\n          differs = span.offsetWidth !== baseWidths[baseFontFamily] || span.offsetHeight !== baseHeights[baseFontFamily];\n          container.removeChild(span);\n          if (differs) {\n            return true;\n          }\n        }\n        return false;\n      }\n    };\n  })();\n  loadFonts = function() {\n    if (startedLoading) {\n      return;\n    }\n    startedLoading = true;\n    FD.incomplete = true;\n    return domReady((function(_this) {\n      return function() {\n        var fontName;\n        return testFonts((function() {\n          var j, len, results;\n          results = [];\n          for (j = 0, len = someCommonFontNames.length; j < len; j++) {\n            fontName = someCommonFontNames[j];\n            results.push(new Font(fontName));\n          }\n          return results;\n        })());\n      };\n    })(this));\n  };\n  testFonts = function(fonts) {\n    var i, testingFonts;\n    fontAvailabilityChecker.init();\n    i = 0;\n    return testingFonts = every(20, function() {\n      var available, callback, font, j, k, l, len, len1, ref, ref1;\n      for (j = 0; j <= 5; j++) {\n        font = fonts[i];\n        available = fontAvailabilityChecker.check(font);\n        if (available) {\n          testedFonts.push(font);\n          ref = FD.each.callbacks;\n          for (k = 0, len = ref.length; k < len; k++) {\n            callback = ref[k];\n            callback(font);\n          }\n        }\n        i++;\n        if (i >= fonts.length) {\n          testingFonts.stop();\n          ref1 = FD.all.callbacks;\n          for (l = 0, len1 = ref1.length; l < len1; l++) {\n            callback = ref1[l];\n            callback(testedFonts);\n          }\n          FD.all.callbacks = [];\n          FD.each.callbacks = [];\n          doneTestingFonts = true;\n          return;\n        }\n      }\n    });\n  };\n\n  /*\n  \t * FontDetective.preload()\n  \t * Starts detecting fonts early\n   */\n  FD.preload = loadFonts;\n\n  /*\n  \t * FontDetective.each(function(font){})\n  \t * Calls back with a `Font` every time a font is detected and tested\n   */\n  FD.each = function(callback) {\n    var font, j, len;\n    for (j = 0, len = testedFonts.length; j < len; j++) {\n      font = testedFonts[j];\n      callback(font);\n    }\n    if (!doneTestingFonts) {\n      FD.each.callbacks.push(callback);\n      return loadFonts();\n    }\n  };\n  FD.each.callbacks = [];\n\n  /*\n  \t * FontDetective.all(function(fonts){})\n  \t * Calls back with an `Array` of `Font`s when all fonts are detected and tested\n   */\n  FD.all = function(callback) {\n    if (doneTestingFonts) {\n      return callback(testedFonts);\n    } else {\n      FD.all.callbacks.push(callback);\n      return loadFonts();\n    }\n  };\n  return FD.all.callbacks = [];\n})(window);\n\n\n},{}]},{},[1]);\n"
  },
  {
    "path": "lib/gif.js/gif.js",
    "content": "// gif.js @ https://github.com/jnordberg/gif.js/tree/92d27a02841339e202c75150dcf6fe5f4fa42ec5\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.GIF=f()}})(function(){var define,module,exports;return function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r}()({1:[function(require,module,exports){function EventEmitter(){this._events=this._events||{};this._maxListeners=this._maxListeners||undefined}module.exports=EventEmitter;EventEmitter.EventEmitter=EventEmitter;EventEmitter.prototype._events=undefined;EventEmitter.prototype._maxListeners=undefined;EventEmitter.defaultMaxListeners=10;EventEmitter.prototype.setMaxListeners=function(n){if(!isNumber(n)||n<0||isNaN(n))throw TypeError(\"n must be a positive number\");this._maxListeners=n;return this};EventEmitter.prototype.emit=function(type){var er,handler,len,args,i,listeners;if(!this._events)this._events={};if(type===\"error\"){if(!this._events.error||isObject(this._events.error)&&!this._events.error.length){er=arguments[1];if(er instanceof Error){throw er}else{var err=new Error('Uncaught, unspecified \"error\" event. ('+er+\")\");err.context=er;throw err}}}handler=this._events[type];if(isUndefined(handler))return false;if(isFunction(handler)){switch(arguments.length){case 1:handler.call(this);break;case 2:handler.call(this,arguments[1]);break;case 3:handler.call(this,arguments[1],arguments[2]);break;default:args=Array.prototype.slice.call(arguments,1);handler.apply(this,args)}}else if(isObject(handler)){args=Array.prototype.slice.call(arguments,1);listeners=handler.slice();len=listeners.length;for(i=0;i<len;i++)listeners[i].apply(this,args)}return true};EventEmitter.prototype.addListener=function(type,listener){var m;if(!isFunction(listener))throw TypeError(\"listener must be a function\");if(!this._events)this._events={};if(this._events.newListener)this.emit(\"newListener\",type,isFunction(listener.listener)?listener.listener:listener);if(!this._events[type])this._events[type]=listener;else if(isObject(this._events[type]))this._events[type].push(listener);else this._events[type]=[this._events[type],listener];if(isObject(this._events[type])&&!this._events[type].warned){if(!isUndefined(this._maxListeners)){m=this._maxListeners}else{m=EventEmitter.defaultMaxListeners}if(m&&m>0&&this._events[type].length>m){this._events[type].warned=true;console.error(\"(node) warning: possible EventEmitter memory \"+\"leak detected. %d listeners added. \"+\"Use emitter.setMaxListeners() to increase limit.\",this._events[type].length);if(typeof console.trace===\"function\"){console.trace()}}}return this};EventEmitter.prototype.on=EventEmitter.prototype.addListener;EventEmitter.prototype.once=function(type,listener){if(!isFunction(listener))throw TypeError(\"listener must be a function\");var fired=false;function g(){this.removeListener(type,g);if(!fired){fired=true;listener.apply(this,arguments)}}g.listener=listener;this.on(type,g);return this};EventEmitter.prototype.removeListener=function(type,listener){var list,position,length,i;if(!isFunction(listener))throw TypeError(\"listener must be a function\");if(!this._events||!this._events[type])return this;list=this._events[type];length=list.length;position=-1;if(list===listener||isFunction(list.listener)&&list.listener===listener){delete this._events[type];if(this._events.removeListener)this.emit(\"removeListener\",type,listener)}else if(isObject(list)){for(i=length;i-- >0;){if(list[i]===listener||list[i].listener&&list[i].listener===listener){position=i;break}}if(position<0)return this;if(list.length===1){list.length=0;delete this._events[type]}else{list.splice(position,1)}if(this._events.removeListener)this.emit(\"removeListener\",type,listener)}return this};EventEmitter.prototype.removeAllListeners=function(type){var key,listeners;if(!this._events)return this;if(!this._events.removeListener){if(arguments.length===0)this._events={};else if(this._events[type])delete this._events[type];return this}if(arguments.length===0){for(key in this._events){if(key===\"removeListener\")continue;this.removeAllListeners(key)}this.removeAllListeners(\"removeListener\");this._events={};return this}listeners=this._events[type];if(isFunction(listeners)){this.removeListener(type,listeners)}else if(listeners){while(listeners.length)this.removeListener(type,listeners[listeners.length-1])}delete this._events[type];return this};EventEmitter.prototype.listeners=function(type){var ret;if(!this._events||!this._events[type])ret=[];else if(isFunction(this._events[type]))ret=[this._events[type]];else ret=this._events[type].slice();return ret};EventEmitter.prototype.listenerCount=function(type){if(this._events){var evlistener=this._events[type];if(isFunction(evlistener))return 1;else if(evlistener)return evlistener.length}return 0};EventEmitter.listenerCount=function(emitter,type){return emitter.listenerCount(type)};function isFunction(arg){return typeof arg===\"function\"}function isNumber(arg){return typeof arg===\"number\"}function isObject(arg){return typeof arg===\"object\"&&arg!==null}function isUndefined(arg){return arg===void 0}},{}],2:[function(require,module,exports){var UA,browser,mode,platform,ua;ua=navigator.userAgent.toLowerCase();platform=navigator.platform.toLowerCase();UA=ua.match(/(opera|ie|firefox|chrome|version)[\\s\\/:]([\\w\\d\\.]+)?.*?(safari|version[\\s\\/:]([\\w\\d\\.]+)|$)/)||[null,\"unknown\",0];mode=UA[1]===\"ie\"&&document.documentMode;browser={name:UA[1]===\"version\"?UA[3]:UA[1],version:mode||parseFloat(UA[1]===\"opera\"&&UA[4]?UA[4]:UA[2]),platform:{name:ua.match(/ip(?:ad|od|hone)/)?\"ios\":(ua.match(/(?:webos|android)/)||platform.match(/mac|win|linux/)||[\"other\"])[0]}};browser[browser.name]=true;browser[browser.name+parseInt(browser.version,10)]=true;browser.platform[browser.platform.name]=true;module.exports=browser},{}],3:[function(require,module,exports){var EventEmitter,GIF,browser,extend=function(child,parent){for(var key in parent){if(hasProp.call(parent,key))child[key]=parent[key]}function ctor(){this.constructor=child}ctor.prototype=parent.prototype;child.prototype=new ctor;child.__super__=parent.prototype;return child},hasProp={}.hasOwnProperty,indexOf=[].indexOf||function(item){for(var i=0,l=this.length;i<l;i++){if(i in this&&this[i]===item)return i}return-1},slice=[].slice;EventEmitter=require(\"events\").EventEmitter;browser=require(\"./browser.coffee\");GIF=function(superClass){var defaults,frameDefaults;extend(GIF,superClass);defaults={workerScript:\"gif.worker.js\",workers:2,repeat:0,background:\"#fff\",quality:10,width:null,height:null,transparent:null,debug:false,dither:false};frameDefaults={delay:500,copy:false,dispose:-1};function GIF(options){var base,key,value;this.running=false;this.options={};this.frames=[];this.freeWorkers=[];this.activeWorkers=[];this.setOptions(options);for(key in defaults){value=defaults[key];if((base=this.options)[key]==null){base[key]=value}}}GIF.prototype.setOption=function(key,value){this.options[key]=value;if(this._canvas!=null&&(key===\"width\"||key===\"height\")){return this._canvas[key]=value}};GIF.prototype.setOptions=function(options){var key,results,value;results=[];for(key in options){if(!hasProp.call(options,key))continue;value=options[key];results.push(this.setOption(key,value))}return results};GIF.prototype.addFrame=function(image,options){var frame,key;if(options==null){options={}}frame={};frame.transparent=this.options.transparent;for(key in frameDefaults){frame[key]=options[key]||frameDefaults[key]}if(this.options.width==null){this.setOption(\"width\",image.width)}if(this.options.height==null){this.setOption(\"height\",image.height)}if(typeof ImageData!==\"undefined\"&&ImageData!==null&&image instanceof ImageData){frame.data=image.data}else if(typeof CanvasRenderingContext2D!==\"undefined\"&&CanvasRenderingContext2D!==null&&image instanceof CanvasRenderingContext2D||typeof WebGLRenderingContext!==\"undefined\"&&WebGLRenderingContext!==null&&image instanceof WebGLRenderingContext){if(options.copy){frame.data=this.getContextData(image)}else{frame.context=image}}else if(image.childNodes!=null){if(options.copy){frame.data=this.getImageData(image)}else{frame.image=image}}else{throw new Error(\"Invalid image\")}return this.frames.push(frame)};GIF.prototype.render=function(){var i,j,numWorkers,ref;if(this.running){throw new Error(\"Already running\")}if(this.options.width==null||this.options.height==null){throw new Error(\"Width and height must be set prior to rendering\")}this.running=true;this.nextFrame=0;this.finishedFrames=0;this.imageParts=function(){var j,ref,results;results=[];for(i=j=0,ref=this.frames.length;0<=ref?j<ref:j>ref;i=0<=ref?++j:--j){results.push(null)}return results}.call(this);numWorkers=this.spawnWorkers();if(this.options.globalPalette===true){this.renderNextFrame()}else{for(i=j=0,ref=numWorkers;0<=ref?j<ref:j>ref;i=0<=ref?++j:--j){this.renderNextFrame()}}this.emit(\"start\");return this.emit(\"progress\",0)};GIF.prototype.abort=function(){var worker;while(true){worker=this.activeWorkers.shift();if(worker==null){break}this.log(\"killing active worker\");worker.terminate()}this.running=false;return this.emit(\"abort\")};GIF.prototype.spawnWorkers=function(){var j,numWorkers,ref,results;numWorkers=Math.min(this.options.workers,this.frames.length);(function(){results=[];for(var j=ref=this.freeWorkers.length;ref<=numWorkers?j<numWorkers:j>numWorkers;ref<=numWorkers?j++:j--){results.push(j)}return results}).apply(this).forEach(function(_this){return function(i){var worker;_this.log(\"spawning worker \"+i);worker=new Worker(_this.options.workerScript);worker.onmessage=function(event){_this.activeWorkers.splice(_this.activeWorkers.indexOf(worker),1);_this.freeWorkers.push(worker);return _this.frameFinished(event.data)};return _this.freeWorkers.push(worker)}}(this));return numWorkers};GIF.prototype.frameFinished=function(frame){var i,j,ref;this.log(\"frame \"+frame.index+\" finished - \"+this.activeWorkers.length+\" active\");this.finishedFrames++;this.emit(\"progress\",this.finishedFrames/this.frames.length);this.imageParts[frame.index]=frame;if(this.options.globalPalette===true){this.options.globalPalette=frame.globalPalette;this.log(\"global palette analyzed\");if(this.frames.length>2){for(i=j=1,ref=this.freeWorkers.length;1<=ref?j<ref:j>ref;i=1<=ref?++j:--j){this.renderNextFrame()}}}if(indexOf.call(this.imageParts,null)>=0){return this.renderNextFrame()}else{return this.finishRendering()}};GIF.prototype.finishRendering=function(){var data,frame,i,image,j,k,l,len,len1,len2,len3,offset,page,ref,ref1,ref2;len=0;ref=this.imageParts;for(j=0,len1=ref.length;j<len1;j++){frame=ref[j];len+=(frame.data.length-1)*frame.pageSize+frame.cursor}len+=frame.pageSize-frame.cursor;this.log(\"rendering finished - filesize \"+Math.round(len/1e3)+\"kb\");data=new Uint8Array(len);offset=0;ref1=this.imageParts;for(k=0,len2=ref1.length;k<len2;k++){frame=ref1[k];ref2=frame.data;for(i=l=0,len3=ref2.length;l<len3;i=++l){page=ref2[i];data.set(page,offset);if(i===frame.data.length-1){offset+=frame.cursor}else{offset+=frame.pageSize}}}image=new Blob([data],{type:\"image/gif\"});return this.emit(\"finished\",image,data)};GIF.prototype.renderNextFrame=function(){var frame,task,worker;if(this.freeWorkers.length===0){throw new Error(\"No free workers\")}if(this.nextFrame>=this.frames.length){return}frame=this.frames[this.nextFrame++];worker=this.freeWorkers.shift();task=this.getTask(frame);this.log(\"starting frame \"+(task.index+1)+\" of \"+this.frames.length);this.activeWorkers.push(worker);return worker.postMessage(task)};GIF.prototype.getContextData=function(ctx){return ctx.getImageData(0,0,this.options.width,this.options.height).data};GIF.prototype.getImageData=function(image){var ctx;if(this._canvas==null){this._canvas=document.createElement(\"canvas\");this._canvas.width=this.options.width;this._canvas.height=this.options.height}ctx=this._canvas.getContext(\"2d\");ctx.fillStyle=this.options.background;ctx.fillRect(0,0,this.options.width,this.options.height);ctx.drawImage(image,0,0);return this.getContextData(ctx)};GIF.prototype.getTask=function(frame){var index,task;index=this.frames.indexOf(frame);task={index:index,last:index===this.frames.length-1,delay:frame.delay,dispose:frame.dispose,transparent:frame.transparent,width:this.options.width,height:this.options.height,quality:this.options.quality,dither:this.options.dither,globalPalette:this.options.globalPalette,repeat:this.options.repeat,canTransfer:browser.name===\"chrome\"};if(frame.data!=null){task.data=frame.data}else if(frame.context!=null){task.data=this.getContextData(frame.context)}else if(frame.image!=null){task.data=this.getImageData(frame.image)}else{throw new Error(\"Invalid frame\")}return task};GIF.prototype.log=function(){var args;args=1<=arguments.length?slice.call(arguments,0):[];if(!this.options.debug){return}return console.log.apply(console,args)};return GIF}(EventEmitter);module.exports=GIF},{\"./browser.coffee\":2,events:1}]},{},[3])(3)});\n//# sourceMappingURL=gif.js.map\n"
  },
  {
    "path": "lib/gif.js/gif.worker.js",
    "content": "// gif.worker.js @ https://github.com/jnordberg/gif.js/tree/92d27a02841339e202c75150dcf6fe5f4fa42ec5\n(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){var NeuQuant=require(\"./TypedNeuQuant.js\");var LZWEncoder=require(\"./LZWEncoder.js\");function ByteArray(){this.page=-1;this.pages=[];this.newPage()}ByteArray.pageSize=4096;ByteArray.charMap={};for(var i=0;i<256;i++)ByteArray.charMap[i]=String.fromCharCode(i);ByteArray.prototype.newPage=function(){this.pages[++this.page]=new Uint8Array(ByteArray.pageSize);this.cursor=0};ByteArray.prototype.getData=function(){var rv=\"\";for(var p=0;p<this.pages.length;p++){for(var i=0;i<ByteArray.pageSize;i++){rv+=ByteArray.charMap[this.pages[p][i]]}}return rv};ByteArray.prototype.writeByte=function(val){if(this.cursor>=ByteArray.pageSize)this.newPage();this.pages[this.page][this.cursor++]=val};ByteArray.prototype.writeUTFBytes=function(string){for(var l=string.length,i=0;i<l;i++)this.writeByte(string.charCodeAt(i))};ByteArray.prototype.writeBytes=function(array,offset,length){for(var l=length||array.length,i=offset||0;i<l;i++)this.writeByte(array[i])};function GIFEncoder(width,height){this.width=~~width;this.height=~~height;this.transparent=null;this.transIndex=0;this.repeat=-1;this.delay=0;this.image=null;this.pixels=null;this.indexedPixels=null;this.colorDepth=null;this.colorTab=null;this.neuQuant=null;this.usedEntry=new Array;this.palSize=7;this.dispose=-1;this.firstFrame=true;this.sample=10;this.dither=false;this.globalPalette=false;this.out=new ByteArray}GIFEncoder.prototype.setDelay=function(milliseconds){this.delay=Math.round(milliseconds/10)};GIFEncoder.prototype.setFrameRate=function(fps){this.delay=Math.round(100/fps)};GIFEncoder.prototype.setDispose=function(disposalCode){if(disposalCode>=0)this.dispose=disposalCode};GIFEncoder.prototype.setRepeat=function(repeat){this.repeat=repeat};GIFEncoder.prototype.setTransparent=function(color){this.transparent=color};GIFEncoder.prototype.addFrame=function(imageData){this.image=imageData;this.colorTab=this.globalPalette&&this.globalPalette.slice?this.globalPalette:null;this.getImagePixels();this.analyzePixels();if(this.globalPalette===true)this.globalPalette=this.colorTab;if(this.firstFrame){this.writeLSD();this.writePalette();if(this.repeat>=0){this.writeNetscapeExt()}}this.writeGraphicCtrlExt();this.writeImageDesc();if(!this.firstFrame&&!this.globalPalette)this.writePalette();this.writePixels();this.firstFrame=false};GIFEncoder.prototype.finish=function(){this.out.writeByte(59)};GIFEncoder.prototype.setQuality=function(quality){if(quality<1)quality=1;this.sample=quality};GIFEncoder.prototype.setDither=function(dither){if(dither===true)dither=\"FloydSteinberg\";this.dither=dither};GIFEncoder.prototype.setGlobalPalette=function(palette){this.globalPalette=palette};GIFEncoder.prototype.getGlobalPalette=function(){return this.globalPalette&&this.globalPalette.slice&&this.globalPalette.slice(0)||this.globalPalette};GIFEncoder.prototype.writeHeader=function(){this.out.writeUTFBytes(\"GIF89a\")};GIFEncoder.prototype.analyzePixels=function(){if(!this.colorTab){this.neuQuant=new NeuQuant(this.pixels,this.sample);this.neuQuant.buildColormap();this.colorTab=this.neuQuant.getColormap()}if(this.dither){this.ditherPixels(this.dither.replace(\"-serpentine\",\"\"),this.dither.match(/-serpentine/)!==null)}else{this.indexPixels()}this.pixels=null;this.colorDepth=8;this.palSize=7;if(this.transparent!==null){this.transIndex=this.findClosest(this.transparent,true)}};GIFEncoder.prototype.indexPixels=function(imgq){var nPix=this.pixels.length/3;this.indexedPixels=new Uint8Array(nPix);var k=0;for(var j=0;j<nPix;j++){var index=this.findClosestRGB(this.pixels[k++]&255,this.pixels[k++]&255,this.pixels[k++]&255);this.usedEntry[index]=true;this.indexedPixels[j]=index}};GIFEncoder.prototype.ditherPixels=function(kernel,serpentine){var kernels={FalseFloydSteinberg:[[3/8,1,0],[3/8,0,1],[2/8,1,1]],FloydSteinberg:[[7/16,1,0],[3/16,-1,1],[5/16,0,1],[1/16,1,1]],Stucki:[[8/42,1,0],[4/42,2,0],[2/42,-2,1],[4/42,-1,1],[8/42,0,1],[4/42,1,1],[2/42,2,1],[1/42,-2,2],[2/42,-1,2],[4/42,0,2],[2/42,1,2],[1/42,2,2]],Atkinson:[[1/8,1,0],[1/8,2,0],[1/8,-1,1],[1/8,0,1],[1/8,1,1],[1/8,0,2]]};if(!kernel||!kernels[kernel]){throw\"Unknown dithering kernel: \"+kernel}var ds=kernels[kernel];var index=0,height=this.height,width=this.width,data=this.pixels;var direction=serpentine?-1:1;this.indexedPixels=new Uint8Array(this.pixels.length/3);for(var y=0;y<height;y++){if(serpentine)direction=direction*-1;for(var x=direction==1?0:width-1,xend=direction==1?width:0;x!==xend;x+=direction){index=y*width+x;var idx=index*3;var r1=data[idx];var g1=data[idx+1];var b1=data[idx+2];idx=this.findClosestRGB(r1,g1,b1);this.usedEntry[idx]=true;this.indexedPixels[index]=idx;idx*=3;var r2=this.colorTab[idx];var g2=this.colorTab[idx+1];var b2=this.colorTab[idx+2];var er=r1-r2;var eg=g1-g2;var eb=b1-b2;for(var i=direction==1?0:ds.length-1,end=direction==1?ds.length:0;i!==end;i+=direction){var x1=ds[i][1];var y1=ds[i][2];if(x1+x>=0&&x1+x<width&&y1+y>=0&&y1+y<height){var d=ds[i][0];idx=index+x1+y1*width;idx*=3;data[idx]=Math.max(0,Math.min(255,data[idx]+er*d));data[idx+1]=Math.max(0,Math.min(255,data[idx+1]+eg*d));data[idx+2]=Math.max(0,Math.min(255,data[idx+2]+eb*d))}}}}};GIFEncoder.prototype.findClosest=function(c,used){return this.findClosestRGB((c&16711680)>>16,(c&65280)>>8,c&255,used)};GIFEncoder.prototype.findClosestRGB=function(r,g,b,used){if(this.colorTab===null)return-1;if(this.neuQuant&&!used){return this.neuQuant.lookupRGB(r,g,b)}var c=b|g<<8|r<<16;var minpos=0;var dmin=256*256*256;var len=this.colorTab.length;for(var i=0,index=0;i<len;index++){var dr=r-(this.colorTab[i++]&255);var dg=g-(this.colorTab[i++]&255);var db=b-(this.colorTab[i++]&255);var d=dr*dr+dg*dg+db*db;if((!used||this.usedEntry[index])&&d<dmin){dmin=d;minpos=index}}return minpos};GIFEncoder.prototype.getImagePixels=function(){var w=this.width;var h=this.height;this.pixels=new Uint8Array(w*h*3);var data=this.image;var srcPos=0;var count=0;for(var i=0;i<h;i++){for(var j=0;j<w;j++){this.pixels[count++]=data[srcPos++];this.pixels[count++]=data[srcPos++];this.pixels[count++]=data[srcPos++];srcPos++}}};GIFEncoder.prototype.writeGraphicCtrlExt=function(){this.out.writeByte(33);this.out.writeByte(249);this.out.writeByte(4);var transp,disp;if(this.transparent===null){transp=0;disp=0}else{transp=1;disp=2}if(this.dispose>=0){disp=this.dispose&7}disp<<=2;this.out.writeByte(0|disp|0|transp);this.writeShort(this.delay);this.out.writeByte(this.transIndex);this.out.writeByte(0)};GIFEncoder.prototype.writeImageDesc=function(){this.out.writeByte(44);this.writeShort(0);this.writeShort(0);this.writeShort(this.width);this.writeShort(this.height);if(this.firstFrame||this.globalPalette){this.out.writeByte(0)}else{this.out.writeByte(128|0|0|0|this.palSize)}};GIFEncoder.prototype.writeLSD=function(){this.writeShort(this.width);this.writeShort(this.height);this.out.writeByte(128|112|0|this.palSize);this.out.writeByte(0);this.out.writeByte(0)};GIFEncoder.prototype.writeNetscapeExt=function(){this.out.writeByte(33);this.out.writeByte(255);this.out.writeByte(11);this.out.writeUTFBytes(\"NETSCAPE2.0\");this.out.writeByte(3);this.out.writeByte(1);this.writeShort(this.repeat);this.out.writeByte(0)};GIFEncoder.prototype.writePalette=function(){this.out.writeBytes(this.colorTab);var n=3*256-this.colorTab.length;for(var i=0;i<n;i++)this.out.writeByte(0)};GIFEncoder.prototype.writeShort=function(pValue){this.out.writeByte(pValue&255);this.out.writeByte(pValue>>8&255)};GIFEncoder.prototype.writePixels=function(){var enc=new LZWEncoder(this.width,this.height,this.indexedPixels,this.colorDepth);enc.encode(this.out)};GIFEncoder.prototype.stream=function(){return this.out};module.exports=GIFEncoder},{\"./LZWEncoder.js\":2,\"./TypedNeuQuant.js\":3}],2:[function(require,module,exports){var EOF=-1;var BITS=12;var HSIZE=5003;var masks=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535];function LZWEncoder(width,height,pixels,colorDepth){var initCodeSize=Math.max(2,colorDepth);var accum=new Uint8Array(256);var htab=new Int32Array(HSIZE);var codetab=new Int32Array(HSIZE);var cur_accum,cur_bits=0;var a_count;var free_ent=0;var maxcode;var clear_flg=false;var g_init_bits,ClearCode,EOFCode;function char_out(c,outs){accum[a_count++]=c;if(a_count>=254)flush_char(outs)}function cl_block(outs){cl_hash(HSIZE);free_ent=ClearCode+2;clear_flg=true;output(ClearCode,outs)}function cl_hash(hsize){for(var i=0;i<hsize;++i)htab[i]=-1}function compress(init_bits,outs){var fcode,c,i,ent,disp,hsize_reg,hshift;g_init_bits=init_bits;clear_flg=false;n_bits=g_init_bits;maxcode=MAXCODE(n_bits);ClearCode=1<<init_bits-1;EOFCode=ClearCode+1;free_ent=ClearCode+2;a_count=0;ent=nextPixel();hshift=0;for(fcode=HSIZE;fcode<65536;fcode*=2)++hshift;hshift=8-hshift;hsize_reg=HSIZE;cl_hash(hsize_reg);output(ClearCode,outs);outer_loop:while((c=nextPixel())!=EOF){fcode=(c<<BITS)+ent;i=c<<hshift^ent;if(htab[i]===fcode){ent=codetab[i];continue}else if(htab[i]>=0){disp=hsize_reg-i;if(i===0)disp=1;do{if((i-=disp)<0)i+=hsize_reg;if(htab[i]===fcode){ent=codetab[i];continue outer_loop}}while(htab[i]>=0)}output(ent,outs);ent=c;if(free_ent<1<<BITS){codetab[i]=free_ent++;htab[i]=fcode}else{cl_block(outs)}}output(ent,outs);output(EOFCode,outs)}function encode(outs){outs.writeByte(initCodeSize);remaining=width*height;curPixel=0;compress(initCodeSize+1,outs);outs.writeByte(0)}function flush_char(outs){if(a_count>0){outs.writeByte(a_count);outs.writeBytes(accum,0,a_count);a_count=0}}function MAXCODE(n_bits){return(1<<n_bits)-1}function nextPixel(){if(remaining===0)return EOF;--remaining;var pix=pixels[curPixel++];return pix&255}function output(code,outs){cur_accum&=masks[cur_bits];if(cur_bits>0)cur_accum|=code<<cur_bits;else cur_accum=code;cur_bits+=n_bits;while(cur_bits>=8){char_out(cur_accum&255,outs);cur_accum>>=8;cur_bits-=8}if(free_ent>maxcode||clear_flg){if(clear_flg){maxcode=MAXCODE(n_bits=g_init_bits);clear_flg=false}else{++n_bits;if(n_bits==BITS)maxcode=1<<BITS;else maxcode=MAXCODE(n_bits)}}if(code==EOFCode){while(cur_bits>0){char_out(cur_accum&255,outs);cur_accum>>=8;cur_bits-=8}flush_char(outs)}}this.encode=encode}module.exports=LZWEncoder},{}],3:[function(require,module,exports){var ncycles=100;var netsize=256;var maxnetpos=netsize-1;var netbiasshift=4;var intbiasshift=16;var intbias=1<<intbiasshift;var gammashift=10;var gamma=1<<gammashift;var betashift=10;var beta=intbias>>betashift;var betagamma=intbias<<gammashift-betashift;var initrad=netsize>>3;var radiusbiasshift=6;var radiusbias=1<<radiusbiasshift;var initradius=initrad*radiusbias;var radiusdec=30;var alphabiasshift=10;var initalpha=1<<alphabiasshift;var alphadec;var radbiasshift=8;var radbias=1<<radbiasshift;var alpharadbshift=alphabiasshift+radbiasshift;var alpharadbias=1<<alpharadbshift;var prime1=499;var prime2=491;var prime3=487;var prime4=503;var minpicturebytes=3*prime4;function NeuQuant(pixels,samplefac){var network;var netindex;var bias;var freq;var radpower;function init(){network=[];netindex=new Int32Array(256);bias=new Int32Array(netsize);freq=new Int32Array(netsize);radpower=new Int32Array(netsize>>3);var i,v;for(i=0;i<netsize;i++){v=(i<<netbiasshift+8)/netsize;network[i]=new Float64Array([v,v,v,0]);freq[i]=intbias/netsize;bias[i]=0}}function unbiasnet(){for(var i=0;i<netsize;i++){network[i][0]>>=netbiasshift;network[i][1]>>=netbiasshift;network[i][2]>>=netbiasshift;network[i][3]=i}}function altersingle(alpha,i,b,g,r){network[i][0]-=alpha*(network[i][0]-b)/initalpha;network[i][1]-=alpha*(network[i][1]-g)/initalpha;network[i][2]-=alpha*(network[i][2]-r)/initalpha}function alterneigh(radius,i,b,g,r){var lo=Math.abs(i-radius);var hi=Math.min(i+radius,netsize);var j=i+1;var k=i-1;var m=1;var p,a;while(j<hi||k>lo){a=radpower[m++];if(j<hi){p=network[j++];p[0]-=a*(p[0]-b)/alpharadbias;p[1]-=a*(p[1]-g)/alpharadbias;p[2]-=a*(p[2]-r)/alpharadbias}if(k>lo){p=network[k--];p[0]-=a*(p[0]-b)/alpharadbias;p[1]-=a*(p[1]-g)/alpharadbias;p[2]-=a*(p[2]-r)/alpharadbias}}}function contest(b,g,r){var bestd=~(1<<31);var bestbiasd=bestd;var bestpos=-1;var bestbiaspos=bestpos;var i,n,dist,biasdist,betafreq;for(i=0;i<netsize;i++){n=network[i];dist=Math.abs(n[0]-b)+Math.abs(n[1]-g)+Math.abs(n[2]-r);if(dist<bestd){bestd=dist;bestpos=i}biasdist=dist-(bias[i]>>intbiasshift-netbiasshift);if(biasdist<bestbiasd){bestbiasd=biasdist;bestbiaspos=i}betafreq=freq[i]>>betashift;freq[i]-=betafreq;bias[i]+=betafreq<<gammashift}freq[bestpos]+=beta;bias[bestpos]-=betagamma;return bestbiaspos}function inxbuild(){var i,j,p,q,smallpos,smallval,previouscol=0,startpos=0;for(i=0;i<netsize;i++){p=network[i];smallpos=i;smallval=p[1];for(j=i+1;j<netsize;j++){q=network[j];if(q[1]<smallval){smallpos=j;smallval=q[1]}}q=network[smallpos];if(i!=smallpos){j=q[0];q[0]=p[0];p[0]=j;j=q[1];q[1]=p[1];p[1]=j;j=q[2];q[2]=p[2];p[2]=j;j=q[3];q[3]=p[3];p[3]=j}if(smallval!=previouscol){netindex[previouscol]=startpos+i>>1;for(j=previouscol+1;j<smallval;j++)netindex[j]=i;previouscol=smallval;startpos=i}}netindex[previouscol]=startpos+maxnetpos>>1;for(j=previouscol+1;j<256;j++)netindex[j]=maxnetpos}function inxsearch(b,g,r){var a,p,dist;var bestd=1e3;var best=-1;var i=netindex[g];var j=i-1;while(i<netsize||j>=0){if(i<netsize){p=network[i];dist=p[1]-g;if(dist>=bestd)i=netsize;else{i++;if(dist<0)dist=-dist;a=p[0]-b;if(a<0)a=-a;dist+=a;if(dist<bestd){a=p[2]-r;if(a<0)a=-a;dist+=a;if(dist<bestd){bestd=dist;best=p[3]}}}}if(j>=0){p=network[j];dist=g-p[1];if(dist>=bestd)j=-1;else{j--;if(dist<0)dist=-dist;a=p[0]-b;if(a<0)a=-a;dist+=a;if(dist<bestd){a=p[2]-r;if(a<0)a=-a;dist+=a;if(dist<bestd){bestd=dist;best=p[3]}}}}}return best}function learn(){var i;var lengthcount=pixels.length;var alphadec=30+(samplefac-1)/3;var samplepixels=lengthcount/(3*samplefac);var delta=~~(samplepixels/ncycles);var alpha=initalpha;var radius=initradius;var rad=radius>>radiusbiasshift;if(rad<=1)rad=0;for(i=0;i<rad;i++)radpower[i]=alpha*((rad*rad-i*i)*radbias/(rad*rad));var step;if(lengthcount<minpicturebytes){samplefac=1;step=3}else if(lengthcount%prime1!==0){step=3*prime1}else if(lengthcount%prime2!==0){step=3*prime2}else if(lengthcount%prime3!==0){step=3*prime3}else{step=3*prime4}var b,g,r,j;var pix=0;i=0;while(i<samplepixels){b=(pixels[pix]&255)<<netbiasshift;g=(pixels[pix+1]&255)<<netbiasshift;r=(pixels[pix+2]&255)<<netbiasshift;j=contest(b,g,r);altersingle(alpha,j,b,g,r);if(rad!==0)alterneigh(rad,j,b,g,r);pix+=step;if(pix>=lengthcount)pix-=lengthcount;i++;if(delta===0)delta=1;if(i%delta===0){alpha-=alpha/alphadec;radius-=radius/radiusdec;rad=radius>>radiusbiasshift;if(rad<=1)rad=0;for(j=0;j<rad;j++)radpower[j]=alpha*((rad*rad-j*j)*radbias/(rad*rad))}}}function buildColormap(){init();learn();unbiasnet();inxbuild()}this.buildColormap=buildColormap;function getColormap(){var map=[];var index=[];for(var i=0;i<netsize;i++)index[network[i][3]]=i;var k=0;for(var l=0;l<netsize;l++){var j=index[l];map[k++]=network[j][0];map[k++]=network[j][1];map[k++]=network[j][2]}return map}this.getColormap=getColormap;this.lookupRGB=inxsearch}module.exports=NeuQuant},{}],4:[function(require,module,exports){var GIFEncoder,renderFrame;GIFEncoder=require(\"./GIFEncoder.js\");renderFrame=function(frame){var encoder,page,stream,transfer;encoder=new GIFEncoder(frame.width,frame.height);if(frame.index===0){encoder.writeHeader()}else{encoder.firstFrame=false}encoder.setTransparent(frame.transparent);encoder.setDispose(frame.dispose);encoder.setRepeat(frame.repeat);encoder.setDelay(frame.delay);encoder.setQuality(frame.quality);encoder.setDither(frame.dither);encoder.setGlobalPalette(frame.globalPalette);encoder.addFrame(frame.data);if(frame.last){encoder.finish()}if(frame.globalPalette===true){frame.globalPalette=encoder.getGlobalPalette()}stream=encoder.stream();frame.data=stream.pages;frame.cursor=stream.cursor;frame.pageSize=stream.constructor.pageSize;if(frame.canTransfer){transfer=function(){var i,len,ref,results;ref=frame.data;results=[];for(i=0,len=ref.length;i<len;i++){page=ref[i];results.push(page.buffer)}return results}();return self.postMessage(frame,transfer)}else{return self.postMessage(frame)}};self.onmessage=function(event){return renderFrame(event.data)}},{\"./GIFEncoder.js\":1}]},{},[4]);\n//# sourceMappingURL=gif.worker.js.map\n"
  },
  {
    "path": "lib/imagetracer_v1.2.5.js",
    "content": "/*\n\timagetracer.js version 1.2.5\n\tSimple raster image tracer and vectorizer written in JavaScript.\n\tandras@jankovics.net\n*/\n\n/*\n\nThe Unlicense / PUBLIC DOMAIN\n\nThis is free and unencumbered software released into the public domain.\n\nAnyone is free to copy, modify, publish, use, compile, sell, or\ndistribute this software, either in source code form or as a compiled\nbinary, for any purpose, commercial or non-commercial, and by any\nmeans.\n\nIn jurisdictions that recognize copyright laws, the author or authors\nof this software dedicate any and all copyright interest in the\nsoftware to the public domain. We make this dedication for the benefit\nof the public at large and to the detriment of our heirs and\nsuccessors. We intend this dedication to be an overt act of\nrelinquishment in perpetuity of all present and future rights to this\nsoftware under copyright law.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\nFor more information, please refer to http://unlicense.org/\n\n*/\n\n(function(){ 'use strict';\n\nfunction ImageTracer(){\n\tvar _this = this;\n\n\tthis.versionnumber = '1.2.5',\n\t\n\t////////////////////////////////////////////////////////////\n\t//\n\t//  User friendly functions\n\t//\n\t////////////////////////////////////////////////////////////\n\t\n\t// Loading an image from a URL, tracing when loaded,\n\t// then executing callback with the scaled svg string as argument\n\tthis.imageToSVG = function( url, callback, options ){\n\t\toptions = _this.checkoptions(options);\n\t\t// loading image, tracing and callback\n\t\t_this.loadImage(\n\t\t\turl,\n\t\t\tfunction(canvas){\n\t\t\t\tcallback(\n\t\t\t\t\t_this.imagedataToSVG( _this.getImgdata(canvas), options )\n\t\t\t\t);\n\t\t\t},\n\t\t\toptions\n\t\t);\n\t},// End of imageToSVG()\n\t\n\t// Tracing imagedata, then returning the scaled svg string\n\tthis.imagedataToSVG = function( imgd, options ){\n\t\toptions = _this.checkoptions(options);\n\t\t// tracing imagedata\n\t\tvar td = _this.imagedataToTracedata( imgd, options );\n\t\t// returning SVG string\n\t\treturn _this.getsvgstring(td, options);\n\t},// End of imagedataToSVG()\n\t\n\t// Loading an image from a URL, tracing when loaded,\n\t// then executing callback with tracedata as argument\n\tthis.imageToTracedata = function( url, callback, options ){\n\t\toptions = _this.checkoptions(options);\n\t\t// loading image, tracing and callback\n\t\t_this.loadImage(\n\t\t\t\turl,\n\t\t\t\tfunction(canvas){\n\t\t\t\t\tcallback(\n\t\t\t\t\t\t_this.imagedataToTracedata( _this.getImgdata(canvas), options )\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\toptions\n\t\t);\n\t},// End of imageToTracedata()\n\t\n\t// Tracing imagedata, then returning tracedata (layers with paths, palette, image size)\n\tthis.imagedataToTracedata = function( imgd, options ){\n\t\toptions = _this.checkoptions(options);\n\t\t\n\t\t// 1. Color quantization\n\t\tvar ii = _this.colorquantization( imgd, options );\n\t\t\n\t\tif(options.layering === 0){// Sequential layering\n\t\t\t\n\t\t\t// create tracedata object\n\t\t\tvar tracedata = {\n\t\t\t\tlayers : [],\n\t\t\t\tpalette : ii.palette,\n\t\t\t\twidth : ii.array[0].length-2,\n\t\t\t\theight : ii.array.length-2\n\t\t\t};\n\t\t\t\n\t\t\t// Loop to trace each color layer\n\t\t\tfor(var colornum=0; colornum<ii.palette.length; colornum++){\n\t\t\t\t\n\t\t\t\t// layeringstep -> pathscan -> internodes -> batchtracepaths\n\t\t\t\tvar tracedlayer =\n\t\t\t\t\t_this.batchtracepaths(\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t_this.internodes(\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t_this.pathscan(\n\t\t\t\t\t\t\t\t_this.layeringstep( ii, colornum ),\n\t\t\t\t\t\t\t\toptions.pathomit\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\toptions\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t),\n\t\t\t\t\t\t\n\t\t\t\t\t\toptions.ltres,\n\t\t\t\t\t\toptions.qtres\n\t\t\t\t\t\t\n\t\t\t\t\t);\n\t\t\t\t\n\t\t\t\t// adding traced layer\n\t\t\t\ttracedata.layers.push(tracedlayer);\n\t\t\t\t\n\t\t\t}// End of color loop\n\t\t\t\n\t\t}else{// Parallel layering\n\t\t\t// 2. Layer separation and edge detection\n\t\t\tvar ls = _this.layering( ii );\n\t\t\t\n\t\t\t// Optional edge node visualization\n\t\t\tif(options.layercontainerid){ _this.drawLayers( ls, _this.specpalette, options.scale, options.layercontainerid ); }\n\t\t\t\n\t\t\t// 3. Batch pathscan\n\t\t\tvar bps = _this.batchpathscan( ls, options.pathomit );\n\t\t\t\n\t\t\t// 4. Batch interpollation\n\t\t\tvar bis = _this.batchinternodes( bps, options );\n\t\t\t\n\t\t\t// 5. Batch tracing and creating tracedata object\n\t\t\tvar tracedata = {\n\t\t\t\tlayers : _this.batchtracelayers( bis, options.ltres, options.qtres ),\n\t\t\t\tpalette : ii.palette,\n\t\t\t\twidth : imgd.width,\n\t\t\t\theight : imgd.height\n\t\t\t};\n\t\t\t\n\t\t}// End of parallel layering\n\t\t\n\t\t// return tracedata\n\t\treturn tracedata;\n\t\t\n\t},// End of imagedataToTracedata()\n\t\n\tthis.optionpresets = {\n\t\t'default': {\n\t\t\t\n\t\t\t// Tracing\n\t\t\tcorsenabled : false,\n\t\t\tltres : 1,\n\t\t\tqtres : 1,\n\t\t\tpathomit : 8,\n\t\t\trightangleenhance : true,\n\t\t\t\n\t\t\t// Color quantization\n\t\t\tcolorsampling : 2,\n\t\t\tnumberofcolors : 16,\n\t\t\tmincolorratio : 0,\n\t\t\tcolorquantcycles : 3,\n\t\t\t\n\t\t\t// Layering method\n\t\t\tlayering : 0,\n\t\t\t\n\t\t\t// SVG rendering\n\t\t\tstrokewidth : 1,\n\t\t\tlinefilter : false,\n\t\t\tscale : 1,\n\t\t\troundcoords : 1,\n\t\t\tviewbox : false,\n\t\t\tdesc : false,\n\t\t\tlcpr : 0,\n\t\t\tqcpr : 0,\n\t\t\t\n\t\t\t// Blur\n\t\t\tblurradius : 0,\n\t\t\tblurdelta : 20\n\t\t\t\n\t\t},\n\t\t'posterized1': { colorsampling:0, numberofcolors:2 },\n\t\t'posterized2': { numberofcolors:4, blurradius:5 },\n\t\t'curvy': { ltres:0.01, linefilter:true, rightangleenhance:false },\n\t\t'sharp': { qtres:0.01, linefilter:false },\n\t\t'detailed': { pathomit:0, roundcoords:2, ltres:0.5, qtres:0.5, numberofcolors:64 },\n\t\t'smoothed': { blurradius:5, blurdelta: 64 },\n\t\t'grayscale': { colorsampling:0, colorquantcycles:1, numberofcolors:7 },\n\t\t'fixedpalette': { colorsampling:0, colorquantcycles:1, numberofcolors:27 },\n\t\t'randomsampling1': { colorsampling:1, numberofcolors:8 },\n\t\t'randomsampling2': { colorsampling:1, numberofcolors:64 },\n\t\t'artistic1': { colorsampling:0, colorquantcycles:1, pathomit:0, blurradius:5, blurdelta: 64, ltres:0.01, linefilter:true, numberofcolors:16, strokewidth:2 },\n\t\t'artistic2': { qtres:0.01, colorsampling:0, colorquantcycles:1, numberofcolors:4, strokewidth:0 },\n\t\t'artistic3': { qtres:10, ltres:10, numberofcolors:8 },\n\t\t'artistic4': { qtres:10, ltres:10, numberofcolors:64, blurradius:5, blurdelta: 256, strokewidth:2 },\n\t\t'posterized3': { ltres: 1, qtres: 1, pathomit: 20, rightangleenhance: true, colorsampling: 0, numberofcolors: 3,\n\t\t\tmincolorratio: 0, colorquantcycles: 3, blurradius: 3, blurdelta: 20, strokewidth: 0, linefilter: false,\n\t\t\troundcoords: 1, pal: [ { r: 0, g: 0, b: 100, a: 255 }, { r: 255, g: 255, b: 255, a: 255 } ] }\n\t},// End of optionpresets\n\t\n\t// creating options object, setting defaults for missing values\n\tthis.checkoptions = function(options){\n\t\toptions = options || {};\n\t\t// Option preset\n\t\tif(typeof options === 'string'){\n\t\t\toptions = options.toLowerCase();\n\t\t\tif( _this.optionpresets[options] ){ options = _this.optionpresets[options]; }else{ options = {}; }\n\t\t}\n\t\t// Defaults\n\t\tvar ok = Object.keys(_this.optionpresets['default']);\n\t\tfor(var k=0; k<ok.length; k++){\n\t\t\tif(!options.hasOwnProperty(ok[k])){ options[ok[k]] = _this.optionpresets['default'][ok[k]]; }\n\t\t}\n\t\t// options.pal is not defined here, the custom palette should be added externally: options.pal = [ { 'r':0, 'g':0, 'b':0, 'a':255 }, {...}, ... ];\n\t\t// options.layercontainerid is not defined here, can be added externally: options.layercontainerid = 'mydiv'; ... <div id=\"mydiv\"></div>\n\t\treturn options;\n\t},// End of checkoptions()\n\t\n\t////////////////////////////////////////////////////////////\n\t//\n\t//  Vectorizing functions\n\t//\n\t////////////////////////////////////////////////////////////\n\t\n\t// 1. Color quantization\n\t// Using a form of k-means clustering repeatead options.colorquantcycles times. http://en.wikipedia.org/wiki/Color_quantization\n\tthis.colorquantization = function( imgd, options ){\n\t\tvar arr = [], idx=0, cd,cdl,ci, paletteacc = [], pixelnum = imgd.width * imgd.height, i, j, k, cnt, palette;\n\t\t\n\t\t// imgd.data must be RGBA, not just RGB\n\t\tif( imgd.data.length < pixelnum * 4 ){\n\t\t\tvar newimgddata = new Uint8ClampedArray(pixelnum * 4);\n\t\t\tfor(var pxcnt = 0; pxcnt < pixelnum ; pxcnt++){\n\t\t\t\tnewimgddata[pxcnt*4  ] = imgd.data[pxcnt*3  ];\n\t\t\t\tnewimgddata[pxcnt*4+1] = imgd.data[pxcnt*3+1];\n\t\t\t\tnewimgddata[pxcnt*4+2] = imgd.data[pxcnt*3+2];\n\t\t\t\tnewimgddata[pxcnt*4+3] = 255;\n\t\t\t}\n\t\t\timgd.data = newimgddata;\n\t\t}// End of RGBA imgd.data check\n\t\t\n\t\t// Filling arr (color index array) with -1\n\t\tfor( j=0; j<imgd.height+2; j++ ){ arr[j]=[]; for(i=0; i<imgd.width+2 ; i++){ arr[j][i] = -1; } }\n\t\t\n\t\t// Use custom palette if pal is defined or sample / generate custom length palette\n\t\tif(options.pal){\n\t\t\tpalette = options.pal;\n\t\t}else if(options.colorsampling === 0){\n\t\t\tpalette = _this.generatepalette(options.numberofcolors);\n\t\t}else if(options.colorsampling === 1){\n\t\t\tpalette = _this.samplepalette( options.numberofcolors, imgd );\n\t\t}else{\n\t\t\tpalette = _this.samplepalette2( options.numberofcolors, imgd );\n\t\t}\n\t\t\n\t\t// Selective Gaussian blur preprocessing\n\t\tif( options.blurradius > 0 ){ imgd = _this.blur( imgd, options.blurradius, options.blurdelta ); }\n\t\t\n\t\t// Repeat clustering step options.colorquantcycles times\n\t\tfor( cnt=0; cnt < options.colorquantcycles; cnt++ ){\n\t\t\t\n\t\t\t// Average colors from the second iteration\n\t\t\tif(cnt>0){\n\t\t\t\t// averaging paletteacc for palette\n\t\t\t\tfor( k=0; k < palette.length; k++ ){\n\t\t\t\t\t\n\t\t\t\t\t// averaging\n\t\t\t\t\tif( paletteacc[k].n > 0 ){\n\t\t\t\t\t\tpalette[k] = {  r: Math.floor( paletteacc[k].r / paletteacc[k].n ),\n\t\t\t\t\t\t\t\t\t\tg: Math.floor( paletteacc[k].g / paletteacc[k].n ),\n\t\t\t\t\t\t\t\t\t\tb: Math.floor( paletteacc[k].b / paletteacc[k].n ),\n\t\t\t\t\t\t\t\t\t\ta:  Math.floor( paletteacc[k].a / paletteacc[k].n ) };\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Randomizing a color, if there are too few pixels and there will be a new cycle\n\t\t\t\t\tif( ( paletteacc[k].n/pixelnum < options.mincolorratio ) && ( cnt < options.colorquantcycles-1 ) ){\n\t\t\t\t\t\tpalette[k] = {  r: Math.floor(Math.random()*255),\n\t\t\t\t\t\t\t\t\t\tg: Math.floor(Math.random()*255),\n\t\t\t\t\t\t\t\t\t\tb: Math.floor(Math.random()*255),\n\t\t\t\t\t\t\t\t\t\ta: Math.floor(Math.random()*255) };\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}// End of palette loop\n\t\t\t}// End of Average colors from the second iteration\n\t\t\t\n\t\t\t// Reseting palette accumulator for averaging\n\t\t\tfor( i=0; i < palette.length; i++ ){ paletteacc[i] = { r:0, g:0, b:0, a:0, n:0 }; }\n\t\t\t\n\t\t\t// loop through all pixels\n\t\t\tfor( j=0; j < imgd.height; j++ ){\n\t\t\t\tfor( i=0; i < imgd.width; i++ ){\n\t\t\t\t\t\n\t\t\t\t\t// pixel index\n\t\t\t\t\tidx = (j*imgd.width+i)*4;\n\t\t\t\t\t\n\t\t\t\t\t// find closest color from palette by measuring (rectilinear) color distance between this pixel and all palette colors\n\t\t\t\t\tci=0; cdl = 1024; // 4 * 256 is the maximum RGBA distance\n\t\t\t\t\tfor( k=0; k<palette.length; k++ ){\n\t\t\t\t\t\t\n\t\t\t\t\t\t// In my experience, https://en.wikipedia.org/wiki/Rectilinear_distance works better than https://en.wikipedia.org/wiki/Euclidean_distance\n\t\t\t\t\t\tcd = Math.abs(palette[k].r-imgd.data[idx]) + Math.abs(palette[k].g-imgd.data[idx+1]) + Math.abs(palette[k].b-imgd.data[idx+2]) + Math.abs(palette[k].a-imgd.data[idx+3]);\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Remember this color if this is the closest yet\n\t\t\t\t\t\tif(cd<cdl){ cdl = cd; ci = k; }\n\t\t\t\t\t\t\n\t\t\t\t\t}// End of palette loop\n\t\t\t\t\t\n\t\t\t\t\t// add to palettacc\n\t\t\t\t\tpaletteacc[ci].r += imgd.data[idx  ];\n\t\t\t\t\tpaletteacc[ci].g += imgd.data[idx+1];\n\t\t\t\t\tpaletteacc[ci].b += imgd.data[idx+2];\n\t\t\t\t\tpaletteacc[ci].a += imgd.data[idx+3];\n\t\t\t\t\tpaletteacc[ci].n++;\n\t\t\t\t\t\n\t\t\t\t\t// update the indexed color array\n\t\t\t\t\tarr[j+1][i+1] = ci;\n\t\t\t\t\t\n\t\t\t\t}// End of i loop\n\t\t\t}// End of j loop\n\t\t\t\n\t\t}// End of Repeat clustering step options.colorquantcycles times\n\t\t\n\t\treturn { array:arr, palette:palette };\n\t\t\n\t},// End of colorquantization()\n\t\n\t// Sampling a palette from imagedata\n\tthis.samplepalette = function( numberofcolors, imgd ){\n\t\tvar idx, palette=[];\n\t\tfor(var i=0; i<numberofcolors; i++){\n\t\t\tidx = Math.floor( Math.random() * imgd.data.length / 4 ) * 4;\n\t\t\tpalette.push({ r:imgd.data[idx  ], g:imgd.data[idx+1], b:imgd.data[idx+2], a:imgd.data[idx+3] });\n\t\t}\n\t\treturn palette;\n\t},// End of samplepalette()\n\t\n\t// Deterministic sampling a palette from imagedata: rectangular grid\n\tthis.samplepalette2 = function( numberofcolors, imgd ){\n\t\tvar idx, palette=[], ni = Math.ceil(Math.sqrt(numberofcolors)), nj = Math.ceil(numberofcolors/ni),\n\t\t\tvx = imgd.width / (ni+1), vy = imgd.height / (nj+1);\n\t\tfor(var j=0; j<nj; j++){\n\t\t\tfor(var i=0; i<ni; i++){\n\t\t\t\tif(palette.length === numberofcolors){\n\t\t\t\t\tbreak;\n\t\t\t\t}else{\n\t\t\t\t\tidx = Math.floor( ((j+1)*vy) * imgd.width + ((i+1)*vx) ) * 4;\n\t\t\t\t\tpalette.push( { r:imgd.data[idx], g:imgd.data[idx+1], b:imgd.data[idx+2], a:imgd.data[idx+3] } );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn palette;\n\t},// End of samplepalette2()\n\t\n\t// Generating a palette with numberofcolors\n\tthis.generatepalette = function(numberofcolors){\n\t\tvar palette = [], rcnt, gcnt, bcnt;\n\t\tif(numberofcolors<8){\n\t\t\t\n\t\t\t// Grayscale\n\t\t\tvar graystep = Math.floor(255/(numberofcolors-1));\n\t\t\tfor(var i=0; i<numberofcolors; i++){ palette.push({ r:i*graystep, g:i*graystep, b:i*graystep, a:255 }); }\n\t\t\t\n\t\t}else{\n\t\t\t\n\t\t\t// RGB color cube\n\t\t\tvar colorqnum = Math.floor(Math.pow(numberofcolors, 1/3)), // Number of points on each edge on the RGB color cube\n\t\t\t\tcolorstep = Math.floor(255/(colorqnum-1)), // distance between points\n\t\t\t\trndnum = numberofcolors - colorqnum*colorqnum*colorqnum; // number of random colors\n\t\t\t\n\t\t\tfor(rcnt=0; rcnt<colorqnum; rcnt++){\n\t\t\t\tfor(gcnt=0; gcnt<colorqnum; gcnt++){\n\t\t\t\t\tfor(bcnt=0; bcnt<colorqnum; bcnt++){\n\t\t\t\t\t\tpalette.push( { r:rcnt*colorstep, g:gcnt*colorstep, b:bcnt*colorstep, a:255 } );\n\t\t\t\t\t}// End of blue loop\n\t\t\t\t}// End of green loop\n\t\t\t}// End of red loop\n\t\t\t\n\t\t\t// Rest is random\n\t\t\tfor(rcnt=0; rcnt<rndnum; rcnt++){ palette.push({ r:Math.floor(Math.random()*255), g:Math.floor(Math.random()*255), b:Math.floor(Math.random()*255), a:Math.floor(Math.random()*255) }); }\n\n\t\t}// End of numberofcolors check\n\t\t\n\t\treturn palette;\n\t},// End of generatepalette()\n\t\t\n\t// 2. Layer separation and edge detection\n\t// Edge node types ( ▓: this layer or 1; ░: not this layer or 0 )\n\t// 12  ░░  ▓░  ░▓  ▓▓  ░░  ▓░  ░▓  ▓▓  ░░  ▓░  ░▓  ▓▓  ░░  ▓░  ░▓  ▓▓\n\t// 48  ░░  ░░  ░░  ░░  ░▓  ░▓  ░▓  ░▓  ▓░  ▓░  ▓░  ▓░  ▓▓  ▓▓  ▓▓  ▓▓\n\t//     0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15\n\tthis.layering = function(ii){\n\t\t// Creating layers for each indexed color in arr\n\t\tvar layers = [], val=0, ah = ii.array.length, aw = ii.array[0].length, n1,n2,n3,n4,n5,n6,n7,n8, i, j, k;\n\t\t\n\t\t// Create layers\n\t\tfor(k=0; k<ii.palette.length; k++){\n\t\t\tlayers[k] = [];\n\t\t\tfor(j=0; j<ah; j++){\n\t\t\t\tlayers[k][j] = [];\n\t\t\t\tfor(i=0; i<aw; i++){\n\t\t\t\t\tlayers[k][j][i]=0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Looping through all pixels and calculating edge node type\n\t\tfor(j=1; j<ah-1; j++){\n\t\t\tfor(i=1; i<aw-1; i++){\n\t\t\t\t\n\t\t\t\t// This pixel's indexed color\n\t\t\t\tval = ii.array[j][i];\n\t\t\t\t\n\t\t\t\t// Are neighbor pixel colors the same?\n\t\t\t\tn1 = ii.array[j-1][i-1]===val ? 1 : 0;\n\t\t\t\tn2 = ii.array[j-1][i  ]===val ? 1 : 0;\n\t\t\t\tn3 = ii.array[j-1][i+1]===val ? 1 : 0;\n\t\t\t\tn4 = ii.array[j  ][i-1]===val ? 1 : 0;\n\t\t\t\tn5 = ii.array[j  ][i+1]===val ? 1 : 0;\n\t\t\t\tn6 = ii.array[j+1][i-1]===val ? 1 : 0;\n\t\t\t\tn7 = ii.array[j+1][i  ]===val ? 1 : 0;\n\t\t\t\tn8 = ii.array[j+1][i+1]===val ? 1 : 0;\n\t\t\t\t\n\t\t\t\t// this pixel's type and looking back on previous pixels\n\t\t\t\tlayers[val][j+1][i+1] = 1 + n5 * 2 + n8 * 4 + n7 * 8 ;\n\t\t\t\tif(!n4){ layers[val][j+1][i  ] = 0 + 2 + n7 * 4 + n6 * 8 ; }\n\t\t\t\tif(!n2){ layers[val][j  ][i+1] = 0 + n3*2 + n5 * 4 + 8 ; }\n\t\t\t\tif(!n1){ layers[val][j  ][i  ] = 0 + n2*2 + 4 + n4 * 8 ; }\n\t\t\t\t\n\t\t\t}// End of i loop\n\t\t}// End of j loop\n\t\t\n\t\treturn layers;\n\t},// End of layering()\n\t\n\t// 2. Layer separation and edge detection\n\t// Edge node types ( ▓: this layer or 1; ░: not this layer or 0 )\n\t// 12  ░░  ▓░  ░▓  ▓▓  ░░  ▓░  ░▓  ▓▓  ░░  ▓░  ░▓  ▓▓  ░░  ▓░  ░▓  ▓▓\n\t// 48  ░░  ░░  ░░  ░░  ░▓  ░▓  ░▓  ░▓  ▓░  ▓░  ▓░  ▓░  ▓▓  ▓▓  ▓▓  ▓▓\n\t//     0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15\n\tthis.layeringstep = function(ii,cnum){\n\t\t// Creating layers for each indexed color in arr\n\t\tvar layer = [], val=0, ah = ii.array.length, aw = ii.array[0].length, n1,n2,n3,n4,n5,n6,n7,n8, i, j, k;\n\t\t\n\t\t// Create layer\n\t\tfor(j=0; j<ah; j++){\n\t\t\tlayer[j] = [];\n\t\t\tfor(i=0; i<aw; i++){\n\t\t\t\tlayer[j][i]=0;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Looping through all pixels and calculating edge node type\n\t\tfor(j=1; j<ah; j++){\n\t\t\tfor(i=1; i<aw; i++){\n\t\t\t\tlayer[j][i] =\n\t\t\t\t\t( ii.array[j-1][i-1]===cnum ? 1 : 0 ) +\n\t\t\t\t\t( ii.array[j-1][i]===cnum ? 2 : 0 ) +\n\t\t\t\t\t( ii.array[j][i-1]===cnum ? 8 : 0 ) +\n\t\t\t\t\t( ii.array[j][i]===cnum ? 4 : 0 )\n\t\t\t\t;\n\t\t\t}// End of i loop\n\t\t}// End of j loop\n\t\t\t\n\t\treturn layer;\n\t},// End of layeringstep()\n\t\n\t// Lookup tables for pathscan\n\t// pathscan_combined_lookup[ arr[py][px] ][ dir ] = [nextarrpypx, nextdir, deltapx, deltapy];\n\tthis.pathscan_combined_lookup = [\n\t\t[[-1,-1,-1,-1], [-1,-1,-1,-1], [-1,-1,-1,-1], [-1,-1,-1,-1]],// arr[py][px]===0 is invalid\n\t\t[[ 0, 1, 0,-1], [-1,-1,-1,-1], [-1,-1,-1,-1], [ 0, 2,-1, 0]],\n\t\t[[-1,-1,-1,-1], [-1,-1,-1,-1], [ 0, 1, 0,-1], [ 0, 0, 1, 0]],\n\t\t[[ 0, 0, 1, 0], [-1,-1,-1,-1], [ 0, 2,-1, 0], [-1,-1,-1,-1]],\n\t\t\n\t\t[[-1,-1,-1,-1], [ 0, 0, 1, 0], [ 0, 3, 0, 1], [-1,-1,-1,-1]],\n\t\t[[13, 3, 0, 1], [13, 2,-1, 0], [ 7, 1, 0,-1], [ 7, 0, 1, 0]],\n\t\t[[-1,-1,-1,-1], [ 0, 1, 0,-1], [-1,-1,-1,-1], [ 0, 3, 0, 1]],\n\t\t[[ 0, 3, 0, 1], [ 0, 2,-1, 0], [-1,-1,-1,-1], [-1,-1,-1,-1]],\n\t\t\n\t\t[[ 0, 3, 0, 1], [ 0, 2,-1, 0], [-1,-1,-1,-1], [-1,-1,-1,-1]],\n\t\t[[-1,-1,-1,-1], [ 0, 1, 0,-1], [-1,-1,-1,-1], [ 0, 3, 0, 1]],\n\t\t[[11, 1, 0,-1], [14, 0, 1, 0], [14, 3, 0, 1], [11, 2,-1, 0]],\n\t\t[[-1,-1,-1,-1], [ 0, 0, 1, 0], [ 0, 3, 0, 1], [-1,-1,-1,-1]],\n\t\t\n\t\t[[ 0, 0, 1, 0], [-1,-1,-1,-1], [ 0, 2,-1, 0], [-1,-1,-1,-1]],\n\t\t[[-1,-1,-1,-1], [-1,-1,-1,-1], [ 0, 1, 0,-1], [ 0, 0, 1, 0]],\n\t\t[[ 0, 1, 0,-1], [-1,-1,-1,-1], [-1,-1,-1,-1], [ 0, 2,-1, 0]],\n\t\t[[-1,-1,-1,-1], [-1,-1,-1,-1], [-1,-1,-1,-1], [-1,-1,-1,-1]]// arr[py][px]===15 is invalid\n\t],\n\n\t// 3. Walking through an edge node array, discarding edge node types 0 and 15 and creating paths from the rest.\n\t// Walk directions (dir): 0 > ; 1 ^ ; 2 < ; 3 v \n\tthis.pathscan = function( arr, pathomit ){\n\t\tvar paths=[], pacnt=0, pcnt=0, px=0, py=0, w = arr[0].length, h = arr.length,\n\t\t\tdir=0, pathfinished=true, holepath=false, lookuprow;\n\t\t\n\t\tfor(var j=0; j<h; j++){\n\t\t\tfor(var i=0; i<w; i++){\n\t\t\t\tif( (arr[j][i] == 4) || ( arr[j][i] == 11) ){ // Other values are not valid\n\t\t\t\t\t\n\t\t\t\t\t// Init\n\t\t\t\t\tpx = i; py = j;\n\t\t\t\t\tpaths[pacnt] = {};\n\t\t\t\t\tpaths[pacnt].points = [];\n\t\t\t\t\tpaths[pacnt].boundingbox = [px,py,px,py];\n\t\t\t\t\tpaths[pacnt].holechildren = [];\n\t\t\t\t\tpathfinished = false;\n\t\t\t\t\tpcnt=0;\n\t\t\t\t\tholepath = ( arr[j][i] == 11);\n\t\t\t\t\tdir = 1;\n\n\t\t\t\t\t// Path points loop\n\t\t\t\t\twhile(!pathfinished){\n\t\t\t\t\t\t\n\t\t\t\t\t\t// New path point\n\t\t\t\t\t\tpaths[pacnt].points[pcnt] = {};\n\t\t\t\t\t\tpaths[pacnt].points[pcnt].x = px-1;\n\t\t\t\t\t\tpaths[pacnt].points[pcnt].y = py-1;\n\t\t\t\t\t\tpaths[pacnt].points[pcnt].t = arr[py][px];\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Bounding box\n\t\t\t\t\t\tif( (px-1) < paths[pacnt].boundingbox[0] ){ paths[pacnt].boundingbox[0] = px-1; }\n\t\t\t\t\t\tif( (px-1) > paths[pacnt].boundingbox[2] ){ paths[pacnt].boundingbox[2] = px-1; }\n\t\t\t\t\t\tif( (py-1) < paths[pacnt].boundingbox[1] ){ paths[pacnt].boundingbox[1] = py-1; }\n\t\t\t\t\t\tif( (py-1) > paths[pacnt].boundingbox[3] ){ paths[pacnt].boundingbox[3] = py-1; }\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Next: look up the replacement, direction and coordinate changes = clear this cell, turn if required, walk forward\n\t\t\t\t\t\tlookuprow = _this.pathscan_combined_lookup[ arr[py][px] ][ dir ];\n\t\t\t\t\t\tarr[py][px] = lookuprow[0]; dir = lookuprow[1]; px += lookuprow[2]; py += lookuprow[3];\n\n\t\t\t\t\t\t// Close path\n\t\t\t\t\t\tif( (px-1 === paths[pacnt].points[0].x ) && ( py-1 === paths[pacnt].points[0].y ) ){\n\t\t\t\t\t\t\tpathfinished = true;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t// Discarding paths shorter than pathomit\n\t\t\t\t\t\t\tif( paths[pacnt].points.length < pathomit ){\n\t\t\t\t\t\t\t\tpaths.pop();\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tpaths[pacnt].isholepath = holepath ? true : false;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t// Finding the parent shape for this hole\n\t\t\t\t\t\t\t\tif(holepath){\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tvar parentidx = 0, parentbbox = [-1,-1,w+1,h+1];\n\t\t\t\t\t\t\t\t\tfor(var parentcnt=0; parentcnt < pacnt; parentcnt++){\n\t\t\t\t\t\t\t\t\t\tif( (!paths[parentcnt].isholepath) &&\n\t\t\t\t\t\t\t\t\t\t\t_this.boundingboxincludes( paths[parentcnt].boundingbox , paths[pacnt].boundingbox ) &&\n\t\t\t\t\t\t\t\t\t\t\t_this.boundingboxincludes( parentbbox , paths[parentcnt].boundingbox )\n\t\t\t\t\t\t\t\t\t\t){\n\t\t\t\t\t\t\t\t\t\t\tparentidx = parentcnt;\n\t\t\t\t\t\t\t\t\t\t\tparentbbox = paths[parentcnt].boundingbox;\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\t\n\t\t\t\t\t\t\t\t\tpaths[parentidx].holechildren.push( pacnt );\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}// End of holepath parent finding\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tpacnt++;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}// End of Close path\n\t\t\t\t\t\t\n\t\t\t\t\t\tpcnt++;\n\t\t\t\t\t\t\n\t\t\t\t\t}// End of Path points loop\n\t\t\t\t\t\n\t\t\t\t}// End of Follow path\n\t\t\t\t\n\t\t\t}// End of i loop\n\t\t}// End of j loop\n\t\t\n\t\treturn paths;\n\t},// End of pathscan()\n\t\n\tthis.boundingboxincludes = function( parentbbox, childbbox ){\n\t\treturn ( ( parentbbox[0] < childbbox[0] ) && ( parentbbox[1] < childbbox[1] ) && ( parentbbox[2] > childbbox[2] ) && ( parentbbox[3] > childbbox[3] ) );\n\t},// End of boundingboxincludes()\n\t\n\t// 3. Batch pathscan\n\tthis.batchpathscan = function( layers, pathomit ){\n\t\tvar bpaths = [];\n\t\tfor(var k in layers){\n\t\t\tif(!layers.hasOwnProperty(k)){ continue; }\n\t\t\tbpaths[k] = _this.pathscan( layers[k], pathomit );\n\t\t}\n\t\treturn bpaths;\n\t},\n\t\n\t// 4. interpollating between path points for nodes with 8 directions ( East, SouthEast, S, SW, W, NW, N, NE )\n\tthis.internodes = function( paths, options ){\n\t\tvar ins = [], palen=0, nextidx=0, nextidx2=0, previdx=0, previdx2=0, pacnt, pcnt;\n\t\t\n\t\t// paths loop\n\t\tfor(pacnt=0; pacnt<paths.length; pacnt++){\n\t\t\t\n\t\t\tins[pacnt] = {};\n\t\t\tins[pacnt].points = [];\n\t\t\tins[pacnt].boundingbox = paths[pacnt].boundingbox;\n\t\t\tins[pacnt].holechildren = paths[pacnt].holechildren;\n\t\t\tins[pacnt].isholepath = paths[pacnt].isholepath;\n\t\t\tpalen = paths[pacnt].points.length;\n\t\t\t\n\t\t\t// pathpoints loop\n\t\t\tfor(pcnt=0; pcnt<palen; pcnt++){\n\t\t\t\n\t\t\t\t// next and previous point indexes\n\t\t\t\tnextidx = (pcnt+1)%palen; nextidx2 = (pcnt+2)%palen; previdx = (pcnt-1+palen)%palen; previdx2 = (pcnt-2+palen)%palen;\n\t\t\t\t\n\t\t\t\t// right angle enhance\n\t\t\t\tif( options.rightangleenhance && _this.testrightangle( paths[pacnt], previdx2, previdx, pcnt, nextidx, nextidx2 ) ){\n\t\t\t\t\t\n\t\t\t\t\t// Fix previous direction\n\t\t\t\t\tif(ins[pacnt].points.length > 0){\n\t\t\t\t\t\tins[pacnt].points[ ins[pacnt].points.length-1 ].linesegment = _this.getdirection(\n\t\t\t\t\t\t\t\tins[pacnt].points[ ins[pacnt].points.length-1 ].x,\n\t\t\t\t\t\t\t\tins[pacnt].points[ ins[pacnt].points.length-1 ].y,\n\t\t\t\t\t\t\t\tpaths[pacnt].points[pcnt].x,\n\t\t\t\t\t\t\t\tpaths[pacnt].points[pcnt].y\n\t\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// This corner point\n\t\t\t\t\tins[pacnt].points.push({\n\t\t\t\t\t\tx : paths[pacnt].points[pcnt].x,\n\t\t\t\t\t\ty : paths[pacnt].points[pcnt].y,\n\t\t\t\t\t\tlinesegment : _this.getdirection(\n\t\t\t\t\t\t\t\tpaths[pacnt].points[pcnt].x,\n\t\t\t\t\t\t\t\tpaths[pacnt].points[pcnt].y,\n\t\t\t\t\t\t\t\t(( paths[pacnt].points[pcnt].x + paths[pacnt].points[nextidx].x ) /2),\n\t\t\t\t\t\t\t\t(( paths[pacnt].points[pcnt].y + paths[pacnt].points[nextidx].y ) /2)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t}// End of right angle enhance\n\t\t\t\t\n\t\t\t\t// interpolate between two path points\n\t\t\t\tins[pacnt].points.push({\n\t\t\t\t\tx : (( paths[pacnt].points[pcnt].x + paths[pacnt].points[nextidx].x ) /2),\n\t\t\t\t\ty : (( paths[pacnt].points[pcnt].y + paths[pacnt].points[nextidx].y ) /2),\n\t\t\t\t\tlinesegment : _this.getdirection(\n\t\t\t\t\t\t\t(( paths[pacnt].points[pcnt].x + paths[pacnt].points[nextidx].x ) /2),\n\t\t\t\t\t\t\t(( paths[pacnt].points[pcnt].y + paths[pacnt].points[nextidx].y ) /2),\n\t\t\t\t\t\t\t(( paths[pacnt].points[nextidx].x + paths[pacnt].points[nextidx2].x ) /2),\n\t\t\t\t\t\t\t(( paths[pacnt].points[nextidx].y + paths[pacnt].points[nextidx2].y ) /2)\n\t\t\t\t\t\t)\n\t\t\t\t});\n\t\t\t\t\n\t\t\t}// End of pathpoints loop\n\t\t\t\t\t\t\n\t\t}// End of paths loop\n\t\t\n\t\treturn ins;\n\t},// End of internodes()\n\t\n\tthis.testrightangle = function( path, idx1, idx2, idx3, idx4, idx5 ){\n\t\treturn ( (( path.points[idx3].x === path.points[idx1].x) &&\n\t\t\t\t  ( path.points[idx3].x === path.points[idx2].x) &&\n\t\t\t\t  ( path.points[idx3].y === path.points[idx4].y) &&\n\t\t\t\t  ( path.points[idx3].y === path.points[idx5].y)\n\t\t\t\t ) ||\n\t\t\t\t (( path.points[idx3].y === path.points[idx1].y) &&\n\t\t\t\t  ( path.points[idx3].y === path.points[idx2].y) &&\n\t\t\t\t  ( path.points[idx3].x === path.points[idx4].x) &&\n\t\t\t\t  ( path.points[idx3].x === path.points[idx5].x)\n\t\t\t\t )\n\t\t);\n\t},// End of testrightangle()\n\t\n\tthis.getdirection = function( x1, y1, x2, y2 ){\n\t\tvar val = 8;\n\t\tif(x1 < x2){\n\t\t\tif     (y1 < y2){ val = 1; }// SouthEast\n\t\t\telse if(y1 > y2){ val = 7; }// NE\n\t\t\telse            { val = 0; }// E\n\t\t}else if(x1 > x2){\n\t\t\tif     (y1 < y2){ val = 3; }// SW\n\t\t\telse if(y1 > y2){ val = 5; }// NW\n\t\t\telse            { val = 4; }// W\n\t\t}else{\n\t\t\tif     (y1 < y2){ val = 2; }// S\n\t\t\telse if(y1 > y2){ val = 6; }// N\n\t\t\telse            { val = 8; }// center, this should not happen\n\t\t}\n\t\treturn val;\n\t},// End of getdirection()\n\t\n\t// 4. Batch interpollation\n\tthis.batchinternodes = function( bpaths, options ){\n\t\tvar binternodes = [];\n\t\tfor (var k in bpaths) {\n\t\t\tif(!bpaths.hasOwnProperty(k)){ continue; }\n\t\t\tbinternodes[k] = _this.internodes(bpaths[k], options);\n\t\t}\n\t\treturn binternodes;\n\t},\n\t\n\t// 5. tracepath() : recursively trying to fit straight and quadratic spline segments on the 8 direction internode path\n\t\n\t// 5.1. Find sequences of points with only 2 segment types\n\t// 5.2. Fit a straight line on the sequence\n\t// 5.3. If the straight line fails (distance error > ltres), find the point with the biggest error\n\t// 5.4. Fit a quadratic spline through errorpoint (project this to get controlpoint), then measure errors on every point in the sequence\n\t// 5.5. If the spline fails (distance error > qtres), find the point with the biggest error, set splitpoint = fitting point\n\t// 5.6. Split sequence and recursively apply 5.2. - 5.6. to startpoint-splitpoint and splitpoint-endpoint sequences\n\t\n\tthis.tracepath = function( path, ltres, qtres ){\n\t\tvar pcnt=0, segtype1, segtype2, seqend, smp = {};\n\t\tsmp.segments = [];\n\t\tsmp.boundingbox = path.boundingbox;\n\t\tsmp.holechildren = path.holechildren;\n\t\tsmp.isholepath = path.isholepath;\n\t\t\n\t\twhile(pcnt < path.points.length){\n\t\t\t// 5.1. Find sequences of points with only 2 segment types\n\t\t\tsegtype1 = path.points[pcnt].linesegment; segtype2 = -1; seqend=pcnt+1;\n\t\t\twhile(\n\t\t\t\t((path.points[seqend].linesegment === segtype1) || (path.points[seqend].linesegment === segtype2) || (segtype2 === -1))\n\t\t\t\t&& (seqend < path.points.length-1) ){\n\t\t\t\t\n\t\t\t\tif((path.points[seqend].linesegment!==segtype1) && (segtype2===-1)){ segtype2 = path.points[seqend].linesegment; }\n\t\t\t\tseqend++;\n\t\t\t\t\n\t\t\t}\n\t\t\tif(seqend === path.points.length-1){ seqend = 0; }\n\n\t\t\t// 5.2. - 5.6. Split sequence and recursively apply 5.2. - 5.6. to startpoint-splitpoint and splitpoint-endpoint sequences\n\t\t\tsmp.segments = smp.segments.concat( _this.fitseq(path, ltres, qtres, pcnt, seqend) );\n\t\t\t\n\t\t\t// forward pcnt;\n\t\t\tif(seqend>0){ pcnt = seqend; }else{ pcnt = path.points.length; }\n\t\t\t\n\t\t}// End of pcnt loop\n\t\t\n\t\treturn smp;\n\t},// End of tracepath()\n\t\t\n\t// 5.2. - 5.6. recursively fitting a straight or quadratic line segment on this sequence of path nodes,\n\t// called from tracepath()\n\tthis.fitseq = function( path, ltres, qtres, seqstart, seqend ){\n\t\t// return if invalid seqend\n\t\tif( (seqend>path.points.length) || (seqend<0) ){ return []; }\n\t\t// variables\n\t\tvar errorpoint=seqstart, errorval=0, curvepass=true, px, py, dist2;\n\t\tvar tl = (seqend-seqstart); if(tl<0){ tl += path.points.length; }\n\t\tvar vx = (path.points[seqend].x-path.points[seqstart].x) / tl,\n\t\t\tvy = (path.points[seqend].y-path.points[seqstart].y) / tl;\n\t\t\n\t\t// 5.2. Fit a straight line on the sequence\n\t\tvar pcnt = (seqstart+1) % path.points.length, pl;\n\t\twhile(pcnt != seqend){\n\t\t\tpl = pcnt-seqstart; if(pl<0){ pl += path.points.length; }\n\t\t\tpx = path.points[seqstart].x + vx * pl; py = path.points[seqstart].y + vy * pl;\n\t\t\tdist2 = (path.points[pcnt].x-px)*(path.points[pcnt].x-px) + (path.points[pcnt].y-py)*(path.points[pcnt].y-py);\n\t\t\tif(dist2>ltres){curvepass=false;}\n\t\t\tif(dist2>errorval){ errorpoint=pcnt; errorval=dist2; }\n\t\t\tpcnt = (pcnt+1)%path.points.length;\n\t\t}\n\t\t// return straight line if fits\n\t\tif(curvepass){ return [{ type:'L', x1:path.points[seqstart].x, y1:path.points[seqstart].y, x2:path.points[seqend].x, y2:path.points[seqend].y }]; }\n\t\t\n\t\t// 5.3. If the straight line fails (distance error>ltres), find the point with the biggest error\n\t\tvar fitpoint = errorpoint; curvepass = true; errorval = 0;\n\t\t\n\t\t// 5.4. Fit a quadratic spline through this point, measure errors on every point in the sequence\n\t\t// helpers and projecting to get control point\n\t\tvar t=(fitpoint-seqstart)/tl, t1=(1-t)*(1-t), t2=2*(1-t)*t, t3=t*t;\n\t\tvar cpx = (t1*path.points[seqstart].x + t3*path.points[seqend].x - path.points[fitpoint].x)/-t2 ,\n\t\t\tcpy = (t1*path.points[seqstart].y + t3*path.points[seqend].y - path.points[fitpoint].y)/-t2 ;\n\t\t\n\t\t// Check every point\n\t\tpcnt = seqstart+1;\n\t\twhile(pcnt != seqend){\n\t\t\tt=(pcnt-seqstart)/tl; t1=(1-t)*(1-t); t2=2*(1-t)*t; t3=t*t;\n\t\t\tpx = t1 * path.points[seqstart].x + t2 * cpx + t3 * path.points[seqend].x;\n\t\t\tpy = t1 * path.points[seqstart].y + t2 * cpy + t3 * path.points[seqend].y;\n\t\t\t\n\t\t\tdist2 = (path.points[pcnt].x-px)*(path.points[pcnt].x-px) + (path.points[pcnt].y-py)*(path.points[pcnt].y-py);\n\t\t\t\n\t\t\tif(dist2>qtres){curvepass=false;}\n\t\t\tif(dist2>errorval){ errorpoint=pcnt; errorval=dist2; }\n\t\t\tpcnt = (pcnt+1)%path.points.length;\n\t\t}\n\t\t// return spline if fits\n\t\tif(curvepass){ return [{ type:'Q', x1:path.points[seqstart].x, y1:path.points[seqstart].y, x2:cpx, y2:cpy, x3:path.points[seqend].x, y3:path.points[seqend].y }]; }\n\t\t// 5.5. If the spline fails (distance error>qtres), find the point with the biggest error\n\t\tvar splitpoint = fitpoint; // Earlier: Math.floor((fitpoint + errorpoint)/2);\n\t\t\n\t\t// 5.6. Split sequence and recursively apply 5.2. - 5.6. to startpoint-splitpoint and splitpoint-endpoint sequences\n\t\treturn _this.fitseq( path, ltres, qtres, seqstart, splitpoint ).concat(\n\t\t\t\t_this.fitseq( path, ltres, qtres, splitpoint, seqend ) );\n\t\t\n\t},// End of fitseq()\n\t\n\t// 5. Batch tracing paths\n\tthis.batchtracepaths = function(internodepaths,ltres,qtres){\n\t\tvar btracedpaths = [];\n\t\tfor(var k in internodepaths){\n\t\t\tif(!internodepaths.hasOwnProperty(k)){ continue; }\n\t\t\tbtracedpaths.push( _this.tracepath(internodepaths[k],ltres,qtres) );\n\t\t}\n\t\treturn btracedpaths;\n\t},\n\t\n\t// 5. Batch tracing layers\n\tthis.batchtracelayers = function(binternodes, ltres, qtres){\n\t\tvar btbis = [];\n\t\tfor(var k in binternodes){\n\t\t\tif(!binternodes.hasOwnProperty(k)){ continue; }\n\t\t\tbtbis[k] = _this.batchtracepaths(binternodes[k], ltres, qtres);\n\t\t}\n\t\treturn btbis;\n\t},\n\t\n\t////////////////////////////////////////////////////////////\n\t//\n\t//  SVG Drawing functions\n\t//\n\t////////////////////////////////////////////////////////////\n\t\n\t// Rounding to given decimals https://stackoverflow.com/questions/11832914/round-to-at-most-2-decimal-places-in-javascript\n\tthis.roundtodec = function(val,places){ return +val.toFixed(places); },\n\t\n\t// Getting SVG path element string from a traced path\n\tthis.svgpathstring = function( tracedata, lnum, pathnum, options ){\n\t\t\n\t\tvar layer = tracedata.layers[lnum], smp = layer[pathnum], str='', pcnt;\n\t\t\n\t\t// Line filter\n\t\tif(options.linefilter && (smp.segments.length < 3)){ return str; }\n\t\t\n\t\t// Starting path element, desc contains layer and path number\n\t\tstr = '<path '+\n\t\t\t( options.desc ? ('desc=\"l '+lnum+' p '+pathnum+'\" ') : '' ) +\n\t\t\t_this.tosvgcolorstr(tracedata.palette[lnum], options) +\n\t\t\t'd=\"';\n\t\t\n\t\t// Creating non-hole path string\n\t\tif( options.roundcoords === -1 ){\n\t\t\tstr += 'M '+ smp.segments[0].x1 * options.scale +' '+ smp.segments[0].y1 * options.scale +' ';\n\t\t\tfor(pcnt=0; pcnt<smp.segments.length; pcnt++){\n\t\t\t\tstr += smp.segments[pcnt].type +' '+ smp.segments[pcnt].x2 * options.scale +' '+ smp.segments[pcnt].y2 * options.scale +' ';\n\t\t\t\tif(smp.segments[pcnt].hasOwnProperty('x3')){\n\t\t\t\t\tstr += smp.segments[pcnt].x3 * options.scale +' '+ smp.segments[pcnt].y3 * options.scale +' ';\n\t\t\t\t}\n\t\t\t}\n\t\t\tstr += 'Z ';\n\t\t}else{\n\t\t\tstr += 'M '+ _this.roundtodec( smp.segments[0].x1 * options.scale, options.roundcoords ) +' '+ _this.roundtodec( smp.segments[0].y1 * options.scale, options.roundcoords ) +' ';\n\t\t\tfor(pcnt=0; pcnt<smp.segments.length; pcnt++){\n\t\t\t\tstr += smp.segments[pcnt].type +' '+ _this.roundtodec( smp.segments[pcnt].x2 * options.scale, options.roundcoords ) +' '+ _this.roundtodec( smp.segments[pcnt].y2 * options.scale, options.roundcoords ) +' ';\n\t\t\t\tif(smp.segments[pcnt].hasOwnProperty('x3')){\n\t\t\t\t\tstr += _this.roundtodec( smp.segments[pcnt].x3 * options.scale, options.roundcoords ) +' '+ _this.roundtodec( smp.segments[pcnt].y3 * options.scale, options.roundcoords ) +' ';\n\t\t\t\t}\n\t\t\t}\n\t\t\tstr += 'Z ';\n\t\t}// End of creating non-hole path string\n\t\t\n\t\t// Hole children\n\t\tfor( var hcnt=0; hcnt < smp.holechildren.length; hcnt++){\n\t\t\tvar hsmp = layer[ smp.holechildren[hcnt] ];\n\t\t\t// Creating hole path string\n\t\t\tif( options.roundcoords === -1 ){\n\t\t\t\t\n\t\t\t\tif(hsmp.segments[ hsmp.segments.length-1 ].hasOwnProperty('x3')){\n\t\t\t\t\tstr += 'M '+ hsmp.segments[ hsmp.segments.length-1 ].x3 * options.scale +' '+ hsmp.segments[ hsmp.segments.length-1 ].y3 * options.scale +' ';\n\t\t\t\t}else{\n\t\t\t\t\tstr += 'M '+ hsmp.segments[ hsmp.segments.length-1 ].x2 * options.scale +' '+ hsmp.segments[ hsmp.segments.length-1 ].y2 * options.scale +' ';\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfor(pcnt = hsmp.segments.length-1; pcnt >= 0; pcnt--){\n\t\t\t\t\tstr += hsmp.segments[pcnt].type +' ';\n\t\t\t\t\tif(hsmp.segments[pcnt].hasOwnProperty('x3')){\n\t\t\t\t\t\tstr += hsmp.segments[pcnt].x2 * options.scale +' '+ hsmp.segments[pcnt].y2 * options.scale +' ';\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tstr += hsmp.segments[pcnt].x1 * options.scale +' '+ hsmp.segments[pcnt].y1 * options.scale +' ';\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\t\n\t\t\t\tif(hsmp.segments[ hsmp.segments.length-1 ].hasOwnProperty('x3')){\n\t\t\t\t\tstr += 'M '+ _this.roundtodec( hsmp.segments[ hsmp.segments.length-1 ].x3 * options.scale ) +' '+ _this.roundtodec( hsmp.segments[ hsmp.segments.length-1 ].y3 * options.scale ) +' ';\n\t\t\t\t}else{\n\t\t\t\t\tstr += 'M '+ _this.roundtodec( hsmp.segments[ hsmp.segments.length-1 ].x2 * options.scale ) +' '+ _this.roundtodec( hsmp.segments[ hsmp.segments.length-1 ].y2 * options.scale ) +' ';\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfor(pcnt = hsmp.segments.length-1; pcnt >= 0; pcnt--){\n\t\t\t\t\tstr += hsmp.segments[pcnt].type +' ';\n\t\t\t\t\tif(hsmp.segments[pcnt].hasOwnProperty('x3')){\n\t\t\t\t\t\tstr += _this.roundtodec( hsmp.segments[pcnt].x2 * options.scale ) +' '+ _this.roundtodec( hsmp.segments[pcnt].y2 * options.scale ) +' ';\n\t\t\t\t\t}\n\t\t\t\t\tstr += _this.roundtodec( hsmp.segments[pcnt].x1 * options.scale ) +' '+ _this.roundtodec( hsmp.segments[pcnt].y1 * options.scale ) +' ';\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t}// End of creating hole path string\n\t\t\t\n\t\t\tstr += 'Z '; // Close path\n\t\t\t\n\t\t}// End of holepath check\n\t\t\n\t\t// Closing path element\n\t\tstr += '\" />';\n\t\t\n\t\t// Rendering control points\n\t\tif(options.lcpr || options.qcpr){\n\t\t\tfor(pcnt=0; pcnt<smp.segments.length; pcnt++){\n\t\t\t\tif( smp.segments[pcnt].hasOwnProperty('x3') && options.qcpr ){\n\t\t\t\t\tstr += '<circle cx=\"'+ smp.segments[pcnt].x2 * options.scale +'\" cy=\"'+ smp.segments[pcnt].y2 * options.scale +'\" r=\"'+ options.qcpr +'\" fill=\"cyan\" stroke-width=\"'+ options.qcpr * 0.2 +'\" stroke=\"black\" />';\n\t\t\t\t\tstr += '<circle cx=\"'+ smp.segments[pcnt].x3 * options.scale +'\" cy=\"'+ smp.segments[pcnt].y3 * options.scale +'\" r=\"'+ options.qcpr +'\" fill=\"white\" stroke-width=\"'+ options.qcpr * 0.2 +'\" stroke=\"black\" />';\n\t\t\t\t\tstr += '<line x1=\"'+ smp.segments[pcnt].x1 * options.scale +'\" y1=\"'+ smp.segments[pcnt].y1 * options.scale +'\" x2=\"'+ smp.segments[pcnt].x2 * options.scale +'\" y2=\"'+ smp.segments[pcnt].y2 * options.scale +'\" stroke-width=\"'+ options.qcpr * 0.2 +'\" stroke=\"cyan\" />';\n\t\t\t\t\tstr += '<line x1=\"'+ smp.segments[pcnt].x2 * options.scale +'\" y1=\"'+ smp.segments[pcnt].y2 * options.scale +'\" x2=\"'+ smp.segments[pcnt].x3 * options.scale +'\" y2=\"'+ smp.segments[pcnt].y3 * options.scale +'\" stroke-width=\"'+ options.qcpr * 0.2 +'\" stroke=\"cyan\" />';\n\t\t\t\t}\n\t\t\t\tif( (!smp.segments[pcnt].hasOwnProperty('x3')) && options.lcpr){\n\t\t\t\t\tstr += '<circle cx=\"'+ smp.segments[pcnt].x2 * options.scale +'\" cy=\"'+ smp.segments[pcnt].y2 * options.scale +'\" r=\"'+ options.lcpr +'\" fill=\"white\" stroke-width=\"'+ options.lcpr * 0.2 +'\" stroke=\"black\" />';\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// Hole children control points\n\t\t\tfor( var hcnt=0; hcnt < smp.holechildren.length; hcnt++){\n\t\t\t\tvar hsmp = layer[ smp.holechildren[hcnt] ];\n\t\t\t\tfor(pcnt=0; pcnt<hsmp.segments.length; pcnt++){\n\t\t\t\t\tif( hsmp.segments[pcnt].hasOwnProperty('x3') && options.qcpr ){\n\t\t\t\t\t\tstr += '<circle cx=\"'+ hsmp.segments[pcnt].x2 * options.scale +'\" cy=\"'+ hsmp.segments[pcnt].y2 * options.scale +'\" r=\"'+ options.qcpr +'\" fill=\"cyan\" stroke-width=\"'+ options.qcpr * 0.2 +'\" stroke=\"black\" />';\n\t\t\t\t\t\tstr += '<circle cx=\"'+ hsmp.segments[pcnt].x3 * options.scale +'\" cy=\"'+ hsmp.segments[pcnt].y3 * options.scale +'\" r=\"'+ options.qcpr +'\" fill=\"white\" stroke-width=\"'+ options.qcpr * 0.2 +'\" stroke=\"black\" />';\n\t\t\t\t\t\tstr += '<line x1=\"'+ hsmp.segments[pcnt].x1 * options.scale +'\" y1=\"'+ hsmp.segments[pcnt].y1 * options.scale +'\" x2=\"'+ hsmp.segments[pcnt].x2 * options.scale +'\" y2=\"'+ hsmp.segments[pcnt].y2 * options.scale +'\" stroke-width=\"'+ options.qcpr * 0.2 +'\" stroke=\"cyan\" />';\n\t\t\t\t\t\tstr += '<line x1=\"'+ hsmp.segments[pcnt].x2 * options.scale +'\" y1=\"'+ hsmp.segments[pcnt].y2 * options.scale +'\" x2=\"'+ hsmp.segments[pcnt].x3 * options.scale +'\" y2=\"'+ hsmp.segments[pcnt].y3 * options.scale +'\" stroke-width=\"'+ options.qcpr * 0.2 +'\" stroke=\"cyan\" />';\n\t\t\t\t\t}\n\t\t\t\t\tif( (!hsmp.segments[pcnt].hasOwnProperty('x3')) && options.lcpr){\n\t\t\t\t\t\tstr += '<circle cx=\"'+ hsmp.segments[pcnt].x2 * options.scale +'\" cy=\"'+ hsmp.segments[pcnt].y2 * options.scale +'\" r=\"'+ options.lcpr +'\" fill=\"white\" stroke-width=\"'+ options.lcpr * 0.2 +'\" stroke=\"black\" />';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}// End of Rendering control points\n\t\t\t\n\t\treturn str;\n\t\t\n\t},// End of svgpathstring()\n\t\n\t// Converting tracedata to an SVG string\n\tthis.getsvgstring = function( tracedata, options ){\n\t\t\n\t\toptions = _this.checkoptions(options);\n\t\t\n\t\tvar w = tracedata.width * options.scale, h = tracedata.height * options.scale;\n\t\t\n\t\t// SVG start\n\t\tvar svgstr = '<svg ' + (options.viewbox ? ('viewBox=\"0 0 '+w+' '+h+'\" ') : ('width=\"'+w+'\" height=\"'+h+'\" ')) +\n\t\t\t'version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" desc=\"Created with imagetracer.js version '+_this.versionnumber+'\" >';\n\n\t\t// Drawing: Layers and Paths loops\n\t\tfor(var lcnt=0; lcnt < tracedata.layers.length; lcnt++){\n\t\t\tfor(var pcnt=0; pcnt < tracedata.layers[lcnt].length; pcnt++){\n\t\t\t\t\n\t\t\t\t// Adding SVG <path> string\n\t\t\t\tif( !tracedata.layers[lcnt][pcnt].isholepath ){\n\t\t\t\t\tsvgstr += _this.svgpathstring( tracedata, lcnt, pcnt, options );\n\t\t\t\t}\n\t\t\t\t\t\n\t\t\t}// End of paths loop\n\t\t}// End of layers loop\n\t\t\n\t\t// SVG End\n\t\tsvgstr+='</svg>';\n\t\t\n\t\treturn svgstr;\n\t\t\n\t},// End of getsvgstring()\n\t\n\t// Comparator for numeric Array.sort\n\tthis.compareNumbers = function(a,b){ return a - b; },\n\t\n\t// Convert color object to rgba string\n\tthis.torgbastr = function(c){ return 'rgba('+c.r+','+c.g+','+c.b+','+c.a+')'; },\n\t\n\t// Convert color object to SVG color string\n\tthis.tosvgcolorstr = function(c, options){\n\t\treturn 'fill=\"rgb('+c.r+','+c.g+','+c.b+')\" stroke=\"rgb('+c.r+','+c.g+','+c.b+')\" stroke-width=\"'+options.strokewidth+'\" opacity=\"'+c.a/255.0+'\" ';\n\t},\n\t\n\t// Helper function: Appending an <svg> element to a container from an svgstring\n\tthis.appendSVGString = function(svgstr,parentid){\n\t\tvar div;\n\t\tif(parentid){\n\t\t\tdiv = document.getElementById(parentid);\n\t\t\tif(!div){\n\t\t\t\tdiv = document.createElement('div');\n\t\t\t\tdiv.id = parentid;\n\t\t\t\tdocument.body.appendChild(div);\n\t\t\t}\n\t\t}else{\n\t\t\tdiv = document.createElement('div');\n\t\t\tdocument.body.appendChild(div);\n\t\t}\n\t\tdiv.innerHTML += svgstr;\n\t},\n\t\n\t////////////////////////////////////////////////////////////\n\t//\n\t//  Canvas functions\n\t//\n\t////////////////////////////////////////////////////////////\n\t\n\t// Gaussian kernels for blur\n\tthis.gks = [ [0.27901,0.44198,0.27901], [0.135336,0.228569,0.272192,0.228569,0.135336], [0.086776,0.136394,0.178908,0.195843,0.178908,0.136394,0.086776],\n\t             [0.063327,0.093095,0.122589,0.144599,0.152781,0.144599,0.122589,0.093095,0.063327], [0.049692,0.069304,0.089767,0.107988,0.120651,0.125194,0.120651,0.107988,0.089767,0.069304,0.049692] ],\n\t\n\t// Selective Gaussian blur for preprocessing\n\tthis.blur = function(imgd,radius,delta){\n\t\tvar i,j,k,d,idx,racc,gacc,bacc,aacc,wacc;\n\t\t\n\t\t// new ImageData\n\t\tvar imgd2 = { width:imgd.width, height:imgd.height, data:[] };\n\t\t\n\t\t// radius and delta limits, this kernel\n\t\tradius = Math.floor(radius); if(radius<1){ return imgd; } if(radius>5){ radius = 5; } delta = Math.abs( delta ); if(delta>1024){ delta = 1024; }\n\t\tvar thisgk = _this.gks[radius-1];\n\t\t\n\t\t// loop through all pixels, horizontal blur\n\t\tfor( j=0; j < imgd.height; j++ ){\n\t\t\tfor( i=0; i < imgd.width; i++ ){\n\n\t\t\t\tracc = 0; gacc = 0; bacc = 0; aacc = 0; wacc = 0;\n\t\t\t\t// gauss kernel loop\n\t\t\t\tfor( k = -radius; k < radius+1; k++){\n\t\t\t\t\t// add weighted color values\n\t\t\t\t\tif( (i+k > 0) && (i+k < imgd.width) ){\n\t\t\t\t\t\tidx = (j*imgd.width+i+k)*4;\n\t\t\t\t\t\tracc += imgd.data[idx  ] * thisgk[k+radius];\n\t\t\t\t\t\tgacc += imgd.data[idx+1] * thisgk[k+radius];\n\t\t\t\t\t\tbacc += imgd.data[idx+2] * thisgk[k+radius];\n\t\t\t\t\t\taacc += imgd.data[idx+3] * thisgk[k+radius];\n\t\t\t\t\t\twacc += thisgk[k+radius];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// The new pixel\n\t\t\t\tidx = (j*imgd.width+i)*4;\n\t\t\t\timgd2.data[idx  ] = Math.floor(racc / wacc);\n\t\t\t\timgd2.data[idx+1] = Math.floor(gacc / wacc);\n\t\t\t\timgd2.data[idx+2] = Math.floor(bacc / wacc);\n\t\t\t\timgd2.data[idx+3] = Math.floor(aacc / wacc);\n\t\t\t\t\n\t\t\t}// End of width loop\n\t\t}// End of horizontal blur\n\t\t\n\t\t// copying the half blurred imgd2\n\t\tvar himgd = new Uint8ClampedArray(imgd2.data);\n\t\t\n\t\t// loop through all pixels, vertical blur\n\t\tfor( j=0; j < imgd.height; j++ ){\n\t\t\tfor( i=0; i < imgd.width; i++ ){\n\n\t\t\t\tracc = 0; gacc = 0; bacc = 0; aacc = 0; wacc = 0;\n\t\t\t\t// gauss kernel loop\n\t\t\t\tfor( k = -radius; k < radius+1; k++){\n\t\t\t\t\t// add weighted color values\n\t\t\t\t\tif( (j+k > 0) && (j+k < imgd.height) ){\n\t\t\t\t\t\tidx = ((j+k)*imgd.width+i)*4;\n\t\t\t\t\t\tracc += himgd[idx  ] * thisgk[k+radius];\n\t\t\t\t\t\tgacc += himgd[idx+1] * thisgk[k+radius];\n\t\t\t\t\t\tbacc += himgd[idx+2] * thisgk[k+radius];\n\t\t\t\t\t\taacc += himgd[idx+3] * thisgk[k+radius];\n\t\t\t\t\t\twacc += thisgk[k+radius];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// The new pixel\n\t\t\t\tidx = (j*imgd.width+i)*4;\n\t\t\t\timgd2.data[idx  ] = Math.floor(racc / wacc);\n\t\t\t\timgd2.data[idx+1] = Math.floor(gacc / wacc);\n\t\t\t\timgd2.data[idx+2] = Math.floor(bacc / wacc);\n\t\t\t\timgd2.data[idx+3] = Math.floor(aacc / wacc);\n\t\t\t\t\n\t\t\t}// End of width loop\n\t\t}// End of vertical blur\n\t\t\n\t\t// Selective blur: loop through all pixels\n\t\tfor( j=0; j < imgd.height; j++ ){\n\t\t\tfor( i=0; i < imgd.width; i++ ){\n\t\t\t\t\n\t\t\t\tidx = (j*imgd.width+i)*4;\n\t\t\t\t// d is the difference between the blurred and the original pixel\n\t\t\t\td = Math.abs(imgd2.data[idx  ] - imgd.data[idx  ]) + Math.abs(imgd2.data[idx+1] - imgd.data[idx+1]) +\n\t\t\t\t\tMath.abs(imgd2.data[idx+2] - imgd.data[idx+2]) + Math.abs(imgd2.data[idx+3] - imgd.data[idx+3]);\n\t\t\t\t// selective blur: if d>delta, put the original pixel back\n\t\t\t\tif(d>delta){\n\t\t\t\t\timgd2.data[idx  ] = imgd.data[idx  ];\n\t\t\t\t\timgd2.data[idx+1] = imgd.data[idx+1];\n\t\t\t\t\timgd2.data[idx+2] = imgd.data[idx+2];\n\t\t\t\t\timgd2.data[idx+3] = imgd.data[idx+3];\n\t\t\t\t}\n\t\t\t}\n\t\t}// End of Selective blur\n\t\t\n\t\treturn imgd2;\n\t\t\n\t},// End of blur()\n\t\n\t// Helper function: loading an image from a URL, then executing callback with canvas as argument\n\tthis.loadImage = function(url,callback,options){\n\t\tvar img = new Image();\n\t\tif(options && options.corsenabled){ img.crossOrigin = 'Anonymous'; }\n\t\timg.onload = function(){\n\t\t\tvar canvas = document.createElement('canvas');\n\t\t\tcanvas.width = img.width;\n\t\t\tcanvas.height = img.height;\n\t\t\tvar context = canvas.getContext('2d');\n\t\t\tcontext.drawImage(img,0,0);\n\t\t\tcallback(canvas);\n\t\t};\n\t\timg.src = url;\n\t},\n\t\n\t// Helper function: getting ImageData from a canvas\n\tthis.getImgdata = function(canvas){\n\t\tvar context = canvas.getContext('2d');\n\t\treturn context.getImageData(0,0,canvas.width,canvas.height);\n\t},\n\t\n\t// Special palette to use with drawlayers()\n\tthis.specpalette = [\n\t\t{r:0,g:0,b:0,a:255}, {r:128,g:128,b:128,a:255}, {r:0,g:0,b:128,a:255}, {r:64,g:64,b:128,a:255},\n\t\t{r:192,g:192,b:192,a:255}, {r:255,g:255,b:255,a:255}, {r:128,g:128,b:192,a:255}, {r:0,g:0,b:192,a:255},\n\t\t{r:128,g:0,b:0,a:255}, {r:128,g:64,b:64,a:255}, {r:128,g:0,b:128,a:255}, {r:168,g:168,b:168,a:255},\n\t\t{r:192,g:128,b:128,a:255}, {r:192,g:0,b:0,a:255}, {r:255,g:255,b:255,a:255}, {r:0,g:128,b:0,a:255}\n\t],\n\t\n\t// Helper function: Drawing all edge node layers into a container\n\tthis.drawLayers = function(layers,palette,scale,parentid){\n\t\tscale = scale||1;\n\t\tvar w,h,i,j,k;\n\t\t\n\t\t// Preparing container\n\t\tvar div;\n\t\tif(parentid){\n\t\t\tdiv = document.getElementById(parentid);\n\t\t\tif(!div){\n\t\t\t\tdiv = document.createElement('div');\n\t\t\t\tdiv.id = parentid;\n\t\t\t\tdocument.body.appendChild(div);\n\t\t\t}\n\t\t}else{\n\t\t\tdiv = document.createElement('div');\n\t\t\tdocument.body.appendChild(div);\n\t\t}\n\t\t\n\t\t// Layers loop\n\t\tfor (k in layers) {\n\t\t\tif(!layers.hasOwnProperty(k)){ continue; }\n\t\t\t\n\t\t\t// width, height\n\t\t\tw=layers[k][0].length; h=layers[k].length;\n\t\t\t\n\t\t\t// Creating new canvas for every layer\n\t\t\tvar canvas = document.createElement('canvas'); canvas.width=w*scale; canvas.height=h*scale;\n\t\t\tvar context = canvas.getContext('2d');\n\t\t\t\n\t\t\t// Drawing\n\t\t\tfor(j=0; j<h; j++){\n\t\t\t\tfor(i=0; i<w; i++){\n\t\t\t\t\tcontext.fillStyle = _this.torgbastr(palette[ layers[k][j][i]%palette.length ]);\n\t\t\t\t\tcontext.fillRect(i*scale,j*scale,scale,scale);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// Appending canvas to container\n\t\t\tdiv.appendChild(canvas);\n\t\t}// End of Layers loop\n\t}// End of drawlayers\n\t\n\t;// End of function list\n\t\n}// End of ImageTracer object\n\n// export as AMD module / Node module / browser or worker variable\nif(typeof define === 'function' && define.amd){\n\tdefine(function() { return new ImageTracer(); });\n}else if(typeof module !== 'undefined'){\n\tmodule.exports = new ImageTracer();\n}else if(typeof self !== 'undefined'){\n\tself.ImageTracer = new ImageTracer();\n}else window.ImageTracer = new ImageTracer();\n\n})();"
  },
  {
    "path": "lib/os-gui/$Window.js",
    "content": "/*eslint-disable*/\n((exports) => {\n\n// TODO: E\\(\"([a-z]+)\"\\) -> \"<$1>\" or get rid of jQuery as a dependency\n\nconst E = document.createElement.bind(document);\n\n/**\n * @param {Element | object | null | undefined} element \n * @returns {string}\n */\nfunction element_to_string(element) {\n\t// returns a CSS-selector-like string for the given element\n\t// if (element instanceof Element) { // doesn't work with different window.Element from iframes\n\tif (element && typeof element === \"object\" && \"tagName\" in element) {\n\t\treturn element.tagName.toLowerCase() +\n\t\t\t(element.id ? \"#\" + element.id : \"\") +\n\t\t\t(element.className ? \".\" + element.className.split(\" \").join(\".\") : \"\") +\n\t\t\t// @ts-ignore (duck typing is better here for cross-iframe code)\n\t\t\t(element.src ? `[src=\"${element.src}\"]` : \"\") + // Note: not escaped; may not actually work as a selector (but this is for debugging)\n\t\t\t// @ts-ignore (duck typing is better here for cross-iframe code)\n\t\t\t(element.srcdoc ? \"[srcdoc]\" : \"\") + // (srcdoc can be long)\n\t\t\t// @ts-ignore (duck typing is better here for cross-iframe code)\n\t\t\t(element.href ? `[href=\"${element.href}\"]` : \"\");\n\t} else if (element) {\n\t\treturn element.constructor.name;\n\t} else {\n\t\treturn `${element}`;\n\t}\n}\n\n/**\n * @param {Element} container_el\n * @returns {JQuery<HTMLElement>}\n */\nfunction find_tabstops(container_el) {\n\tconst $el = $(container_el);\n\t// This function finds focusable controls, but not necessarily all of them;\n\t// for radio elements, it only gives one: either the checked one, or the first one if none are checked.\n\n\t// Note: for audio[controls], Chrome at least has two tabstops (the audio element and three dots menu button).\n\t// It might be possible to detect this in the shadow DOM, I don't know, I haven't worked with the shadow DOM.\n\t// But it might be more reliable to make a dummy tabstop element to detect when you tab out of the first/last element.\n\t// Also for iframes!\n\t// Assuming that doesn't mess with screen readers.\n\t// Right now you can't tab to the three dots menu if it's the last element.\n\t// @TODO: see what ally.js does. Does it handle audio[controls]? https://allyjs.io/api/query/tabsequence.html\n\n\tlet $controls = $el.find(`\n\t\tinput:enabled,\n\t\ttextarea:enabled,\n\t\tselect:enabled,\n\t\tbutton:enabled,\n\t\ta[href],\n\t\t[tabIndex='0'],\n\t\tdetails summary,\n\t\tiframe,\n\t\tobject,\n\t\tembed,\n\t\tvideo[controls],\n\t\taudio[controls],\n\t\t[contenteditable]:not([contenteditable='false'])\n\t`).filter(\":visible\");\n\t// const $controls = $el.find(\":tabbable\"); // https://api.jqueryui.com/tabbable-selector/\n\n\t// Radio buttons should be treated as a group with one tabstop.\n\t// If there's no selected (\"checked\") radio, it should still visit the group,\n\t// but if there is a selected radio in the group, it should skip all unselected radios in the group.\n\t/** @type {Record<string, HTMLElement>} */\n\tconst radios = {}; // best radio found so far, per group\n\t/** @type {HTMLElement[]} */\n\tconst to_skip = [];\n\tfor (const el of $controls.toArray()) {\n\t\t// @ts-ignore\n\t\tif (el.nodeName.toLowerCase() === \"input\" && el.type === \"radio\") {\n\t\t\t// @ts-ignore\n\t\t\tif (radios[el.name]) {\n\t\t\t\t// @ts-ignore\n\t\t\t\tif (el.checked) {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tto_skip.push(radios[el.name]);\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tradios[el.name] = el;\n\t\t\t\t} else {\n\t\t\t\t\tto_skip.push(el);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// @ts-ignore\n\t\t\t\tradios[el.name] = el;\n\t\t\t}\n\t\t}\n\t}\n\tconst $tabstops = $controls.not(to_skip);\n\t// debug viz:\n\t// $tabstops.css({boxShadow: \"0 0 2px 2px green\"});\n\t// $(to_skip).css({boxShadow: \"0 0 2px 2px gray\"})\n\treturn $tabstops;\n}\nvar $G = $(window);\n\n\n$Window.Z_INDEX = 5;\n\n/** @type {(OSGUI$Window | null)[]} */\nvar minimize_slots = []; // for if there's no taskbar\n\n// @TODO: make this a class,\n// instead of a weird pseudo-class\n/**\n * @param {OSGUIWindowOptions} [options]\n * @returns {OSGUI$Window}\n */\nfunction $Window(options = {}) {\n\t// @TODO: handle all option defaults here\n\t// and validate options.\n\n\t// WOW, this is ugly. It's kind of impressive, almost.\n\tvar $w = /** @type {OSGUI$Window} */(\n\t\t$(\n\t\t\t/** @type {HTMLElement & { $window: OSGUI$Window; }}*/(\n\t\t\t\t/** @type {unknown} */(E(\"div\"))\n\t\t\t)\n\t\t).addClass(\"window os-window\").appendTo(\"body\"));\n\t// TODO: A $Window.fromElement (or similar) static method using a Map would be better for type checking.\n\t$w[0].$window = $w;\n\t$w.element = $w[0];\n\t$w[0].id = `os-window-${Math.random().toString(36).substr(2, 9)}`;\n\t$w.$titlebar = $(E(\"div\")).addClass(\"window-titlebar\").appendTo($w);\n\t$w.$title_area = $(E(\"div\")).addClass(\"window-title-area\").appendTo($w.$titlebar);\n\t$w.$title = $(E(\"span\")).addClass(\"window-title\").appendTo($w.$title_area);\n\tif (options.toolWindow) {\n\t\toptions.minimizeButton = false;\n\t\toptions.maximizeButton = false;\n\t}\n\tif (options.minimizeButton !== false) {\n\t\t$w.$minimize = $(E(\"button\")).addClass(\"window-minimize-button window-action-minimize window-button\").appendTo($w.$titlebar);\n\t\t$w.$minimize.attr(\"aria-label\", \"Minimize window\"); // @TODO: for taskbarless minimized windows, \"restore\"\n\t\t$w.$minimize.append(\"<span class='window-button-icon'></span>\");\n\t}\n\tif (options.maximizeButton !== false) {\n\t\t$w.$maximize = $(E(\"button\")).addClass(\"window-maximize-button window-action-maximize window-button\").appendTo($w.$titlebar);\n\t\t$w.$maximize.attr(\"aria-label\", \"Maximize or restore window\"); // @TODO: specific text for the state\n\t\tif (!options.resizable) {\n\t\t\t$w.$maximize.prop(\"disabled\", true);\n\t\t}\n\t\t$w.$maximize.append(\"<span class='window-button-icon'></span>\");\n\t}\n\tif (options.closeButton !== false) {\n\t\t$w.$x = $(E(\"button\")).addClass(\"window-close-button window-action-close window-button\").appendTo($w.$titlebar);\n\t\t$w.$x.attr(\"aria-label\", \"Close window\");\n\t\t$w.$x.append(\"<span class='window-button-icon'></span>\");\n\t}\n\t$w.$content = $(E(\"div\")).addClass(\"window-content\").appendTo($w);\n\t$w.$content.attr(\"tabIndex\", \"-1\");\n\t$w.$content.css(\"outline\", \"none\");\n\tif (options.toolWindow) {\n\t\t$w.addClass(\"tool-window\");\n\t}\n\tif (options.parentWindow) {\n\t\toptions.parentWindow.addChildWindow($w);\n\t\t// semantic parent logic is currently only suited for tool windows\n\t\t// for dialog windows, it would make the dialog window not show as focused\n\t\t// (alternatively, I could simply, when following the semantic parent chain, look for windows that are not tool windows)\n\t\tif (options.toolWindow) {\n\t\t\t$w[0].dataset.semanticParent = options.parentWindow[0].id;\n\t\t}\n\t}\n\n\tvar $component = options.$component;\n\tif (typeof options.icon === \"object\" && \"tagName\" in options.icon) {\n\t\toptions.icons = { any: options.icon };\n\t} else if (options.icon) {\n\t\t// old terrible API using globals that you have to define\n\t\tconsole.warn(\"DEPRECATED: use options.icons instead of options.icon, e.g. new $Window({icons: {16: 'app-16x16.png', any: 'app-icon.svg'}})\");\n\t\t// @ts-ignore\n\t\tif (typeof $Icon !== \"undefined\" && typeof TITLEBAR_ICON_SIZE !== \"undefined\") {\n\t\t\t// @ts-ignore\n\t\t\t$w.icon_name = options.icon;\n\t\t\t// @ts-ignore\n\t\t\t$w.$icon = $Icon(options.icon, TITLEBAR_ICON_SIZE).prependTo($w.$titlebar);\n\t\t} else {\n\t\t\tthrow new Error(\"Use {icon: img_element} or {icons: {16: url_or_img_element}} options\");\n\t\t}\n\t}\n\t$w.icons = options.icons || {};\n\tlet iconSize = 16;\n\t$w.setTitlebarIconSize = function (target_icon_size) {\n\t\tif ($w.icons) {\n\t\t\t$w.$icon?.remove();\n\t\t\tconst iconNode = $w.getIconAtSize(target_icon_size);\n\t\t\t$w.$icon = iconNode ? $(iconNode) : $();\n\t\t\t$w.$icon.prependTo($w.$titlebar);\n\t\t}\n\t\ticonSize = target_icon_size;\n\t\t$w.trigger(\"icon-change\");\n\t};\n\t$w.getTitlebarIconSize = function () {\n\t\treturn iconSize;\n\t};\n\t// @TODO: this could be a static method, like OSGUI.getIconAtSize(icons, targetSize)\n\t$w.getIconAtSize = function (target_icon_size) {\n\t\tlet icon_size;\n\t\tif ($w.icons[target_icon_size]) {\n\t\t\ticon_size = target_icon_size;\n\t\t} else if ($w.icons[\"any\"]) {\n\t\t\ticon_size = \"any\";\n\t\t} else {\n\t\t\t// isFinite(parseFloat(\"123xyz\")) // true\n\t\t\t// isFinite(\"123xyz\") // false\n\t\t\t// isFinite(parseFloat(null)) // false\n\t\t\t// isFinite(null) // true\n\t\t\t// @ts-ignore\n\t\t\tconst sizes = Object.keys($w.icons).filter(size => isFinite(size) && isFinite(parseFloat(size)));\n\t\t\tsizes.sort((a, b) => Math.abs(parseFloat(a) - target_icon_size) - Math.abs(parseFloat(b) - target_icon_size));\n\t\t\ticon_size = sizes[0];\n\t\t}\n\t\tif (icon_size) {\n\t\t\tconst icon = $w.icons[icon_size];\n\t\t\tlet icon_element;\n\t\t\tif (typeof icon === \"object\" && \"cloneNode\" in icon) {\n\t\t\t\ticon_element = icon.cloneNode(true);\n\t\t\t} else {\n\t\t\t\ticon_element = E(\"img\");\n\t\t\t\tconst $icon = $(icon_element);\n\t\t\t\tif (typeof icon === \"string\") {\n\t\t\t\t\t$icon.attr(\"src\", icon);\n\t\t\t\t} else if (\"srcset\" in icon) {\n\t\t\t\t\t$icon.attr(\"srcset\", icon.srcset);\n\t\t\t\t} else {\n\t\t\t\t\t$icon.attr(\"src\", icon.src);\n\t\t\t\t}\n\t\t\t\t$icon.attr({\n\t\t\t\t\twidth: icon_size,\n\t\t\t\t\theight: icon_size,\n\t\t\t\t\tdraggable: false,\n\t\t\t\t});\n\t\t\t\t$icon.css({\n\t\t\t\t\twidth: target_icon_size,\n\t\t\t\t\theight: target_icon_size,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn icon_element;\n\t\t}\n\t\treturn null;\n\t};\n\t// @TODO: automatically update icon size based on theme (with a CSS variable)\n\t$w.setTitlebarIconSize(iconSize);\n\n\t$w.getIconName = () => {\n\t\tconsole.warn(\"DEPRECATED: use $w.icons object instead of $w.icon_name\");\n\t\treturn $w.icon_name;\n\t};\n\t$w.setIconByID = (icon_name) => {\n\t\tconsole.warn(\"DEPRECATED: use $w.setIcons(icons) instead of $w.setIconByID(icon_name)\");\n\t\tvar old_$icon = $w.$icon;\n\t\t// @ts-ignore\n\t\t$w.$icon = $Icon(icon_name, TITLEBAR_ICON_SIZE);\n\t\told_$icon.replaceWith($w.$icon);\n\t\t$w.icon_name = icon_name;\n\t\t$w.task?.updateIcon();\n\t\t$w.trigger(\"icon-change\");\n\t\treturn $w;\n\t};\n\t$w.setIcons = (icons) => {\n\t\t$w.icons = icons;\n\t\t$w.setTitlebarIconSize(iconSize);\n\t\t$w.task?.updateIcon();\n\t\t// icon-change already sent by setTitlebarIconSize\n\t};\n\n\tif ($component) {\n\t\t$w.addClass(\"component-window\");\n\t}\n\n\tsetTimeout(() => {\n\t\tif (get_direction() == \"rtl\") {\n\t\t\t$w.addClass(\"rtl\"); // for reversing the titlebar gradient\n\t\t}\n\t}, 0);\n\n\t/**\n\t * @returns {\"ltr\" | \"rtl\"} writing/layout direction\n\t */\n\tfunction get_direction() {\n\t\treturn window.get_direction ? window.get_direction() : /** @type {\"ltr\" | \"rtl\"} */(getComputedStyle($w[0]).direction);\n\t}\n\n\t// This is very silly, using jQuery's event handling to implement simpler event handling.\n\t// But I'll implement it in a non-silly way at least when I remove jQuery. Maybe sooner.\n\tconst $event_target = $({});\n\tconst make_simple_listenable = (/** @type {string} */ name) => {\n\t\treturn (/** @type {() => void} */ callback) => {\n\t\t\tconst fn = () => {\n\t\t\t\tcallback();\n\t\t\t};\n\t\t\t$event_target.on(name, fn);\n\t\t\tconst dispose = () => {\n\t\t\t\t$event_target.off(name, fn);\n\t\t\t};\n\t\t\treturn dispose;\n\t\t};\n\t};\n\t$w.onFocus = make_simple_listenable(\"focus\");\n\t$w.onBlur = make_simple_listenable(\"blur\");\n\t$w.onClosed = make_simple_listenable(\"closed\");\n\n\t/**\n\t * @param {{ innerWidth?: number, innerHeight?: number, outerWidth?: number, outerHeight?: number }} options\n\t */\n\t$w.setDimensions = ({ innerWidth, innerHeight, outerWidth, outerHeight }) => {\n\t\tlet width_from_frame, height_from_frame;\n\t\t// It's good practice to make all measurements first, then update the DOM.\n\t\t// Once you update the DOM, the browser has to recalculate layout, which can be slow.\n\t\tif (innerWidth) {\n\t\t\twidth_from_frame = $w.outerWidth() - $w.$content.outerWidth();\n\t\t}\n\t\tif (innerHeight) {\n\t\t\theight_from_frame = $w.outerHeight() - $w.$content.outerHeight();\n\t\t\tconst $menu_bar = $w.$content.find(\".menus\"); // only if inside .content; might move to a slot outside .content later\n\t\t\tif ($menu_bar.length) {\n\t\t\t\t// maybe this isn't technically part of the frame, per se? but it's part of the non-client area, which is what I technically mean.\n\t\t\t\theight_from_frame += $menu_bar.outerHeight();\n\t\t\t}\n\t\t}\n\t\tif (outerWidth) {\n\t\t\t$w.outerWidth(outerWidth);\n\t\t}\n\t\tif (outerHeight) {\n\t\t\t$w.outerHeight(outerHeight);\n\t\t}\n\t\tif (innerWidth) {\n\t\t\t$w.outerWidth(innerWidth + width_from_frame);\n\t\t}\n\t\tif (innerHeight) {\n\t\t\t$w.outerHeight(innerHeight + height_from_frame);\n\t\t}\n\t};\n\t$w.setDimensions(options);\n\n\t/** @type {OSGUI$Window[]} */\n\tlet child_$windows = [];\n\t$w.addChildWindow = ($child_window) => {\n\t\tchild_$windows.push($child_window);\n\t};\n\tconst showAsFocused = () => {\n\t\tif ($w.hasClass(\"focused\")) {\n\t\t\treturn;\n\t\t}\n\t\t$w.addClass(\"focused\");\n\t\t$event_target.triggerHandler(\"focus\");\n\t};\n\tconst stopShowingAsFocused = () => {\n\t\tif (!$w.hasClass(\"focused\")) {\n\t\t\treturn;\n\t\t}\n\t\t$w.removeClass(\"focused\");\n\t\t$event_target.triggerHandler(\"blur\");\n\t};\n\t$w.focus = () => {\n\t\t// showAsFocused();\n\t\t$w.bringToFront();\n\t\trefocus();\n\t};\n\t$w.blur = () => {\n\t\tstopShowingAsFocused();\n\t\tif (document.activeElement && document.activeElement.closest(\".window\") == $w[0]) {\n\t\t\tdocument.activeElement.blur();\n\t\t}\n\t};\n\n\tif (options.toolWindow) {\n\t\tif (options.parentWindow) {\n\t\t\toptions.parentWindow.onFocus(showAsFocused);\n\t\t\toptions.parentWindow.onBlur(stopShowingAsFocused);\n\t\t\t// TODO: also show as focused if focus is within the window\n\n\t\t\t// initial state\n\t\t\t// might need a setTimeout, idk...\n\t\t\tif (document.activeElement && document.activeElement.closest(\".window\") == options.parentWindow[0]) {\n\t\t\t\tshowAsFocused();\n\t\t\t}\n\t\t} else {\n\t\t\t// the browser window is the parent window\n\t\t\t// show focus whenever the browser window is focused\n\t\t\t$(window).on(\"focus\", showAsFocused);\n\t\t\t$(window).on(\"blur\", stopShowingAsFocused);\n\t\t\t// initial state\n\t\t\tif (document.hasFocus()) {\n\t\t\t\tshowAsFocused();\n\t\t\t}\n\t\t}\n\t}\n\t/*else - PATCHED; I want focus tracking in a tool window; @TODO: dissolve the concept of a \"tool window\" */\n\t{\n\t\t// global focusout is needed, to continue showing as focused while child windows or menu popups are focused (@TODO: Is this redundant with focusin?)\n\t\t// global focusin is needed, to show as focused when a child window becomes focused (when perhaps nothing was focused before, so no focusout event)\n\t\t// global blur is needed, to show as focused when an iframe gets focus, because focusin/out doesn't fire at all in that case\n\t\t// global focus is needed, to stop showing as focused when an iframe loses focus\n\t\t// pretty ridiculous!!\n\t\t// but it still doesn't handle the case where the browser window is not focused, and the user clicks an iframe directly.\n\t\t// for that, we need to listen inside the iframe, because no events are fired at all outside in that case,\n\t\t// and :focus/:focus-within doesn't work with iframes so we can't even do a hack with transitionstart.\n\t\t// @TODO: simplify the strategy; I ended up piling a few strategies on top of each other, and the earlier ones may be redundant.\n\t\t// In particular, 1. I ended up making it proactively inject into iframes, rather than when focused since there's a case where focus can't be detected otherwise.\n\t\t// 2. I ended up simulating focusin events for iframes.\n\t\t// I may want to rely on that, or, I may want to remove that and set up a refocus chain directly instead,\n\t\t// avoiding refocus() which may interfere with drag operations in an iframe when focusing the iframe (e.g. clicking into Paint to draw or drag a sub-window).\n\n\t\t// console.log(\"adding global focusin/focusout/blur/focus for window\", $w[0].id);\n\t\tconst global_focus_update_handler = make_focus_in_out_handler($w[0], true); // must be $w and not $content so semantic parent chain works, with [data-semantic-parent] pointing to the window not the content\n\t\twindow.addEventListener(\"focusin\", global_focus_update_handler);\n\t\twindow.addEventListener(\"focusout\", global_focus_update_handler);\n\t\twindow.addEventListener(\"blur\", global_focus_update_handler);\n\t\twindow.addEventListener(\"focus\", global_focus_update_handler);\n\n\t\t/** @param {HTMLIFrameElement} iframe */\n\t\tfunction setupIframe(iframe) {\n\t\t\tif (!focus_update_handlers_by_container.has(iframe)) {\n\t\t\t\tconst iframe_update_focus = make_focus_in_out_handler(iframe, false);\n\t\t\t\t// this also operates as a flag to prevent multiple handlers from being added, or waiting for the iframe to load duplicately\n\t\t\t\tfocus_update_handlers_by_container.set(iframe, iframe_update_focus);\n\n\t\t\t\t// @TODO: try removing setTimeout(s)\n\t\t\t\tsetTimeout(() => { // for iframe src to be set? I forget.\n\t\t\t\t\t// Note: try must be INSIDE setTimeout, not outside, to work.\n\t\t\t\t\ttry {\n\t\t\t\t\t\t/** @param {() => void} callback */\n\t\t\t\t\t\tconst wait_for_iframe_load = (callback) => {\n\t\t\t\t\t\t\t// Note: error may occur accessing iframe.contentDocument; this must be handled by the caller.\n\t\t\t\t\t\t\t// To that end, this function must access it synchronously, to allow the caller to handle the error.\n\t\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\t\tif (iframe.contentDocument.readyState == \"complete\") {\n\t\t\t\t\t\t\t\tcallback();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// iframe.contentDocument.addEventListener(\"readystatechange\", () => {\n\t\t\t\t\t\t\t\t// \tif (iframe.contentDocument.readyState == \"complete\") {\n\t\t\t\t\t\t\t\t// \t\tcallback();\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\tsetTimeout(() => {\n\t\t\t\t\t\t\t\t\twait_for_iframe_load(callback);\n\t\t\t\t\t\t\t\t}, 100);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t\twait_for_iframe_load(() => {\n\t\t\t\t\t\t\t// console.log(\"adding focusin/focusout/blur/focus for iframe\", iframe);\n\t\t\t\t\t\t\tiframe.contentWindow.addEventListener(\"focusin\", iframe_update_focus);\n\t\t\t\t\t\t\tiframe.contentWindow.addEventListener(\"focusout\", iframe_update_focus);\n\t\t\t\t\t\t\tiframe.contentWindow.addEventListener(\"blur\", iframe_update_focus);\n\t\t\t\t\t\t\tiframe.contentWindow.addEventListener(\"focus\", iframe_update_focus);\n\t\t\t\t\t\t\tobserveIframes(iframe.contentDocument);\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\twarn_iframe_access(iframe, error);\n\t\t\t\t\t}\n\t\t\t\t}, 100);\n\t\t\t}\n\t\t}\n\n\t\t/** @param {Document | Element} container_node */\n\t\tfunction observeIframes(container_node) {\n\t\t\tconst observer = new MutationObserver((mutations) => {\n\t\t\t\tfor (const mutation of mutations) {\n\t\t\t\t\tfor (const node of mutation.addedNodes) {\n\t\t\t\t\t\t// @ts-ignore (this will ignore text nodes and such just fine)\n\t\t\t\t\t\tif (node.tagName == \"IFRAME\") {\n\t\t\t\t\t\t\t// @ts-ignore (not using instanceof for type narrowing, since this needs to work with across iframe contexts)\n\t\t\t\t\t\t\tsetupIframe(node);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tobserver.observe(container_node, { childList: true, subtree: true });\n\t\t\t// needed in recursive calls (for iframes inside iframes)\n\t\t\t// (for the window, it shouldn't be able to have iframes yet)\n\t\t\tfor (const iframe of container_node.querySelectorAll(\"iframe\")) {\n\t\t\t\tsetupIframe(iframe);\n\t\t\t}\n\t\t}\n\n\t\tobserveIframes($w.$content[0]);\n\n\t\t/**\n\t\t * @param {Element} logical_container_el \n\t\t * @param {boolean} is_root \n\t\t * @returns {(event: FocusEvent | null) => void}\n\t\t */\n\t\tfunction make_focus_in_out_handler(logical_container_el, is_root) {\n\t\t\t// In case of iframes, logical_container_el is the iframe, and container_node is the iframe's contentDocument.\n\t\t\t// container_node is not a parameter here because it can change over time, may be an empty document before the iframe is loaded.\n\n\t\t\treturn function handle_focus_in_out(event) {\n\t\t\t\t// @ts-ignore (not using instanceof for type narrowing, since this needs to work with across iframe contexts)\n\t\t\t\tconst container_node = logical_container_el.tagName == \"IFRAME\" ? logical_container_el.contentDocument : logical_container_el;\n\t\t\t\tconst document = container_node.ownerDocument ?? container_node;\n\t\t\t\t// is this equivalent?\n\t\t\t\t// const document = logical_container_el.tagName == \"IFRAME\" ? logical_container_el.contentDocument : logical_container_el.ownerDocument;\n\n\t\t\t\t// console.log(`handling ${event.type} for container`, container_el);\n\t\t\t\tlet newly_focused = event ? (event.type === \"focusout\" || event.type === \"blur\") ? event.relatedTarget : event.target : document.activeElement;\n\t\t\t\tif (event?.type === \"blur\") {\n\t\t\t\t\tnewly_focused = null; // only handle iframe\n\t\t\t\t}\n\n\t\t\t\t// console.log(`[${$w.title()}] (is_root=${is_root})`, `newly_focused is (preliminarily)`, element_to_string(newly_focused), `\\nlogical_container_el`, logical_container_el, `\\ncontainer_node`, container_node, `\\ndocument.activeElement`, document.activeElement, `\\ndocument.hasFocus()`, document.hasFocus(), `\\ndocument`, document);\n\n\t\t\t\t// Iframes are stingy about focus events, so we need to check if focus is actually within an iframe.\n\t\t\t\tif (\n\t\t\t\t\tdocument.activeElement &&\n\t\t\t\t\tdocument.activeElement.tagName === \"IFRAME\" &&\n\t\t\t\t\t(event?.type === \"focusout\" || event?.type === \"blur\") &&\n\t\t\t\t\t!newly_focused // doesn't exist for security reasons in this case\n\t\t\t\t) {\n\t\t\t\t\tnewly_focused = document.activeElement;\n\t\t\t\t\t// console.log(`[${$w.title()}] (is_root=${is_root})`, `newly_focused is (actually)`, element_to_string(newly_focused));\n\t\t\t\t}\n\n\t\t\t\tconst outside_or_at_exactly =\n\t\t\t\t\t!newly_focused ||\n\t\t\t\t\t// contains() only works with DOM nodes (elements and documents), not window objects.\n\t\t\t\t\t// Since container_node is a DOM node, it will never have a Window inside of it (ignoring iframes).\n\t\t\t\t\tnewly_focused.window === newly_focused || // is a Window object (cross-frame test)\n\t\t\t\t\t!container_node.contains(newly_focused); // Note: node.contains(node) === true\n\t\t\t\tconst firmly_outside = outside_or_at_exactly && container_node !== newly_focused;\n\n\t\t\t\t// console.log(`[${$w.title()}] (is_root=${is_root})`, `outside_or_at_exactly=${outside_or_at_exactly}`, `firmly_outside=${firmly_outside}`);\n\t\t\t\tif (firmly_outside && is_root) {\n\t\t\t\t\tif (!options.toolWindow) { // PATCHED\n\t\t\t\t\t\tstopShowingAsFocused();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\t!outside_or_at_exactly &&\n\t\t\t\t\tnewly_focused.tagName !== \"HTML\" &&\n\t\t\t\t\tnewly_focused.tagName !== \"BODY\" &&\n\t\t\t\t\tnewly_focused !== container_node &&\n\t\t\t\t\t!newly_focused.matches(\".window-content\") &&\n\t\t\t\t\t!newly_focused.closest(\".menus\") &&\n\t\t\t\t\t!newly_focused.closest(\".window-titlebar\")\n\t\t\t\t) {\n\t\t\t\t\tlast_focus_by_container.set(logical_container_el, newly_focused); // overwritten for iframes below\n\t\t\t\t\tdebug_focus_tracking(document, container_node, newly_focused, is_root);\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t!outside_or_at_exactly &&\n\t\t\t\t\tnewly_focused.tagName === \"IFRAME\"\n\t\t\t\t) {\n\t\t\t\t\tconst iframe = newly_focused;\n\t\t\t\t\t// console.log(\"iframe\", iframe, onfocusin_by_container.has(iframe));\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst focus_in_iframe = iframe.contentDocument.activeElement;\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tfocus_in_iframe &&\n\t\t\t\t\t\t\tfocus_in_iframe.tagName !== \"HTML\" &&\n\t\t\t\t\t\t\tfocus_in_iframe.tagName !== \"BODY\" &&\n\t\t\t\t\t\t\t!focus_in_iframe.closest(\".menus\")\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// last_focus_by_container.set(logical_container_el, iframe); // done above\n\t\t\t\t\t\t\tlast_focus_by_container.set(iframe, focus_in_iframe);\n\t\t\t\t\t\t\tdebug_focus_tracking(iframe.contentDocument, iframe.contentDocument, focus_in_iframe, is_root);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\twarn_iframe_access(iframe, e);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\n\t\t\t\t// For child windows and menu popups, follow \"semantic parent\" chain.\n\t\t\t\t// Menu popups and child windows aren't descendants of the window they belong to,\n\t\t\t\t// but should keep the window shown as focused.\n\t\t\t\t// (In principle this sort of feature could be useful for focus tracking*,\n\t\t\t\t// but right now it's only for child windows and menu popups, which should not be tracked for refocus,\n\t\t\t\t// so I'm doing this after last_focus_by_container.set, for now anyway.)\n\t\t\t\t// ((*: and it may even be surprising if it doesn't work, if one sees the attribute on menus and attempts to use it.\n\t\t\t\t// But who's going to see that? The menus close so it's a pain to see the DOM structure! :P **))\n\t\t\t\t// (((**: without window.debugKeepMenusOpen)))\n\t\t\t\tif (is_root) {\n\t\t\t\t\tdo {\n\t\t\t\t\t\t// if (!newly_focused?.closest) {\n\t\t\t\t\t\t// \tconsole.warn(\"what is this?\", newly_focused);\n\t\t\t\t\t\t// \tbreak;\n\t\t\t\t\t\t// }\n\t\t\t\t\t\tconst waypoint = newly_focused?.closest?.(\"[data-semantic-parent]\");\n\t\t\t\t\t\tif (waypoint) {\n\t\t\t\t\t\t\tconst id = waypoint.dataset.semanticParent;\n\t\t\t\t\t\t\tconst parent = waypoint.ownerDocument.getElementById(id);\n\t\t\t\t\t\t\t// console.log(\"following semantic parent, from\", newly_focused, \"\\nto\", parent, \"\\nvia\", waypoint);\n\t\t\t\t\t\t\tnewly_focused = parent;\n\t\t\t\t\t\t\tif (!parent) {\n\t\t\t\t\t\t\t\tconsole.warn(\"semantic parent not found with id\", id);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t} while (true);\n\t\t\t\t}\n\n\t\t\t\t// Note: allowing showing window as focused from listeners inside iframe (non-root) too,\n\t\t\t\t// in order to handle clicking an iframe when the browser window was not previously focused (e.g. after reload)\n\t\t\t\tif (\n\t\t\t\t\tnewly_focused &&\n\t\t\t\t\tnewly_focused.window !== newly_focused && // cross-frame test for Window object\n\t\t\t\t\tcontainer_node.contains(newly_focused)\n\t\t\t\t) {\n\t\t\t\t\tif (!options.toolWindow) { // PATCHED\n\t\t\t\t\t\tshowAsFocused();\n\t\t\t\t\t}\n\t\t\t\t\t$w.bringToFront();\n\t\t\t\t\tif (!is_root) {\n\t\t\t\t\t\t// trigger focusin events for iframes\n\t\t\t\t\t\t// @TODO: probably don't need showAsFocused() here since it'll be handled externally (on this simulated focusin),\n\t\t\t\t\t\t// and might not need a lot of other logic frankly if I'm simulating focusin events\n\t\t\t\t\t\t/** @type {Element | null | undefined} */\n\t\t\t\t\t\tlet el = logical_container_el;\n\t\t\t\t\t\twhile (el) {\n\t\t\t\t\t\t\t// console.log(\"dispatching focusin event for\", el);\n\t\t\t\t\t\t\tel.dispatchEvent(new Event(\"focusin\", {\n\t\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\t\ttarget: el,\n\t\t\t\t\t\t\t\tview: el.ownerDocument.defaultView,\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\tel = el.ownerDocument.defaultView?.frameElement;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (is_root) {\n\t\t\t\t\tif (!options.toolWindow) { // PATCHED\n\t\t\t\t\t\tstopShowingAsFocused();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// initial state is unfocused\n\t}\n\n\t$w.css(\"touch-action\", \"none\");\n\n\t/** @type {HTMLElement | null | undefined} */\n\tlet minimize_target_el = null; // taskbar button (optional)\n\t$w.setMinimizeTarget = function (new_taskbar_button_el) {\n\t\tminimize_target_el = new_taskbar_button_el;\n\t};\n\n\t/** @type {{$task: JQuery<HTMLElement>} | undefined} */\n\tlet task;\n\tObject.defineProperty($w, \"task\", {\n\t\tget() {\n\t\t\treturn task;\n\t\t},\n\t\tset(new_task) {\n\t\t\tconsole.warn(\"DEPRECATED: use $w.setMinimizeTarget(taskbar_button_el) instead of setting $window.task object\");\n\t\t\ttask = new_task;\n\t\t},\n\t});\n\n\t/** @type {{ position: string; left: string; top: string; width: string; height: string; }} */\n\tlet before_minimize;\n\t$w.minimize = () => {\n\t\tminimize_target_el = minimize_target_el || task?.$task[0];\n\t\tif (animating_titlebar) {\n\t\t\twhen_done_animating_titlebar.push($w.minimize);\n\t\t\treturn;\n\t\t}\n\t\tif ($w.is(\":visible\")) {\n\t\t\tif (minimize_target_el && !$w.hasClass(\"minimized-without-taskbar\")) {\n\t\t\t\tconst before_rect = $w.$titlebar[0].getBoundingClientRect();\n\t\t\t\tconst after_rect = minimize_target_el.getBoundingClientRect();\n\t\t\t\t$w.animateTitlebar(before_rect, after_rect, () => {\n\t\t\t\t\t$w.hide();\n\t\t\t\t\t$w.blur();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// no taskbar\n\n\t\t\t\t// @TODO: make this metrically similar to what Windows 98 does\n\t\t\t\t// @TODO: DRY! This is copied heavily from maximize()\n\t\t\t\t// @TODO: after minimize (without taskbar) and maximize, restore should restore original position before minimize\n\t\t\t\t// OR should it not maximize but restore the unmaximized state? I think I tested it but I forget.\n\n\t\t\t\tconst to_width = 150;\n\t\t\t\tconst spacing = 10;\n\t\t\t\tif ($w.hasClass(\"minimized-without-taskbar\")) {\n\t\t\t\t\t// unminimizing\n\t\t\t\t\tminimize_slots[$w._minimize_slot_index] = null;\n\t\t\t\t} else {\n\t\t\t\t\t// minimizing\n\t\t\t\t\tlet i = 0;\n\t\t\t\t\twhile (minimize_slots[i]) {\n\t\t\t\t\t\ti++;\n\t\t\t\t\t}\n\t\t\t\t\t$w._minimize_slot_index = i;\n\t\t\t\t\tminimize_slots[i] = $w;\n\t\t\t\t}\n\t\t\t\tconst to_x = $w._minimize_slot_index * (to_width + spacing) + 10;\n\t\t\t\tconst titlebar_height = $w.$titlebar.outerHeight() ?? 0;\n\t\t\t\t/** @type {{ position: string; left: string; top: string; width: string; height: string; }} */\n\t\t\t\tlet before_unminimize;\n\t\t\t\tconst instantly_minimize = () => {\n\t\t\t\t\tbefore_minimize = {\n\t\t\t\t\t\tposition: $w.css(\"position\"),\n\t\t\t\t\t\tleft: $w.css(\"left\"),\n\t\t\t\t\t\ttop: $w.css(\"top\"),\n\t\t\t\t\t\twidth: $w.css(\"width\"),\n\t\t\t\t\t\theight: $w.css(\"height\"),\n\t\t\t\t\t};\n\n\t\t\t\t\t$w.addClass(\"minimized-without-taskbar\");\n\t\t\t\t\tif ($w.hasClass(\"maximized\")) {\n\t\t\t\t\t\t$w.removeClass(\"maximized\");\n\t\t\t\t\t\t$w.addClass(\"was-maximized\");\n\t\t\t\t\t\t$w.$maximize.removeClass(\"window-action-restore\");\n\t\t\t\t\t\t$w.$maximize.addClass(\"window-action-maximize\");\n\t\t\t\t\t}\n\t\t\t\t\t$w.$minimize.removeClass(\"window-action-minimize\");\n\t\t\t\t\t$w.$minimize.addClass(\"window-action-restore\");\n\t\t\t\t\tif (before_unminimize) {\n\t\t\t\t\t\t$w.css({\n\t\t\t\t\t\t\tposition: before_unminimize.position,\n\t\t\t\t\t\t\tleft: before_unminimize.left,\n\t\t\t\t\t\t\ttop: before_unminimize.top,\n\t\t\t\t\t\t\twidth: before_unminimize.width,\n\t\t\t\t\t\t\theight: before_unminimize.height,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$w.css({\n\t\t\t\t\t\t\tposition: \"fixed\",\n\t\t\t\t\t\t\ttop: `calc(100% - ${titlebar_height + 5}px)`,\n\t\t\t\t\t\t\tleft: `${to_x}px`,\n\t\t\t\t\t\t\twidth: `${to_width}px`,\n\t\t\t\t\t\t\theight: `${titlebar_height}px`,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tconst instantly_unminimize = () => {\n\t\t\t\t\tbefore_unminimize = {\n\t\t\t\t\t\tposition: $w.css(\"position\"),\n\t\t\t\t\t\tleft: $w.css(\"left\"),\n\t\t\t\t\t\ttop: $w.css(\"top\"),\n\t\t\t\t\t\twidth: $w.css(\"width\"),\n\t\t\t\t\t\theight: $w.css(\"height\"),\n\t\t\t\t\t};\n\n\t\t\t\t\t$w.removeClass(\"minimized-without-taskbar\");\n\t\t\t\t\tif ($w.hasClass(\"was-maximized\")) {\n\t\t\t\t\t\t$w.removeClass(\"was-maximized\");\n\t\t\t\t\t\t$w.addClass(\"maximized\");\n\t\t\t\t\t\t$w.$maximize.removeClass(\"window-action-maximize\");\n\t\t\t\t\t\t$w.$maximize.addClass(\"window-action-restore\");\n\t\t\t\t\t}\n\t\t\t\t\t$w.$minimize.removeClass(\"window-action-restore\");\n\t\t\t\t\t$w.$minimize.addClass(\"window-action-minimize\");\n\t\t\t\t\t$w.css({ width: \"\", height: \"\" });\n\t\t\t\t\tif (before_minimize) {\n\t\t\t\t\t\t$w.css({\n\t\t\t\t\t\t\tposition: before_minimize.position,\n\t\t\t\t\t\t\tleft: before_minimize.left,\n\t\t\t\t\t\t\ttop: before_minimize.top,\n\t\t\t\t\t\t\twidth: before_minimize.width,\n\t\t\t\t\t\t\theight: before_minimize.height,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tconst before_rect = $w.$titlebar[0].getBoundingClientRect();\n\t\t\t\tlet after_rect;\n\t\t\t\t$w.css(\"transform\", \"\");\n\t\t\t\tif ($w.hasClass(\"minimized-without-taskbar\")) {\n\t\t\t\t\tinstantly_unminimize();\n\t\t\t\t\tafter_rect = $w.$titlebar[0].getBoundingClientRect();\n\t\t\t\t\tinstantly_minimize();\n\t\t\t\t} else {\n\t\t\t\t\tinstantly_minimize();\n\t\t\t\t\tafter_rect = $w.$titlebar[0].getBoundingClientRect();\n\t\t\t\t\tinstantly_unminimize();\n\t\t\t\t}\n\t\t\t\t$w.animateTitlebar(before_rect, after_rect, () => {\n\t\t\t\t\tif ($w.hasClass(\"minimized-without-taskbar\")) {\n\t\t\t\t\t\tinstantly_unminimize();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tinstantly_minimize();\n\t\t\t\t\t\t$w.blur();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t};\n\t$w.unminimize = () => {\n\t\tif (animating_titlebar) {\n\t\t\twhen_done_animating_titlebar.push($w.unminimize);\n\t\t\treturn;\n\t\t}\n\t\tif ($w.hasClass(\"minimized-without-taskbar\")) {\n\t\t\t$w.minimize(); // handles unminimization from this state\n\t\t\treturn;\n\t\t}\n\t\tif ($w.is(\":hidden\")) {\n\t\t\tconst before_rect = minimize_target_el.getBoundingClientRect();\n\t\t\t$w.show();\n\t\t\tconst after_rect = $w.$titlebar[0].getBoundingClientRect();\n\t\t\t$w.hide();\n\t\t\t$w.animateTitlebar(before_rect, after_rect, () => {\n\t\t\t\t$w.show();\n\t\t\t\t$w.bringToFront();\n\t\t\t\t$w.focus();\n\t\t\t});\n\t\t}\n\t};\n\n\t/** @type {{ position: string; left: string; top: string; width: string; height: string; }} */\n\tlet before_maximize;\n\t$w.maximize = () => {\n\t\tif (!options.resizable) {\n\t\t\treturn;\n\t\t}\n\t\tif (animating_titlebar) {\n\t\t\twhen_done_animating_titlebar.push($w.maximize);\n\t\t\treturn;\n\t\t}\n\t\tif ($w.hasClass(\"minimized-without-taskbar\")) {\n\t\t\t$w.minimize();\n\t\t\treturn;\n\t\t}\n\n\t\tconst instantly_maximize = () => {\n\t\t\tbefore_maximize = {\n\t\t\t\tposition: $w.css(\"position\"),\n\t\t\t\tleft: $w.css(\"left\"),\n\t\t\t\ttop: $w.css(\"top\"),\n\t\t\t\twidth: $w.css(\"width\"),\n\t\t\t\theight: $w.css(\"height\"),\n\t\t\t};\n\n\t\t\t$w.addClass(\"maximized\");\n\t\t\tconst $taskbar = $(\".taskbar\");\n\t\t\tconst scrollbar_width = window.innerWidth - $(window).width();\n\t\t\tconst scrollbar_height = window.innerHeight - $(window).height();\n\t\t\tconst taskbar_height = $taskbar.length ? $taskbar.outerHeight() + 1 : 0;\n\t\t\t$w.css({\n\t\t\t\tposition: \"fixed\",\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0,\n\t\t\t\twidth: `calc(100vw - ${scrollbar_width}px)`,\n\t\t\t\theight: `calc(100vh - ${scrollbar_height}px - ${taskbar_height}px)`,\n\t\t\t});\n\t\t};\n\t\tconst instantly_unmaximize = () => {\n\t\t\t$w.removeClass(\"maximized\");\n\t\t\t$w.css({ width: \"\", height: \"\" });\n\t\t\tif (before_maximize) {\n\t\t\t\t$w.css({\n\t\t\t\t\tposition: before_maximize.position,\n\t\t\t\t\tleft: before_maximize.left,\n\t\t\t\t\ttop: before_maximize.top,\n\t\t\t\t\twidth: before_maximize.width,\n\t\t\t\t\theight: before_maximize.height,\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tconst before_rect = $w.$titlebar[0].getBoundingClientRect();\n\t\tlet after_rect;\n\t\t$w.css(\"transform\", \"\");\n\t\tconst restoring = $w.hasClass(\"maximized\");\n\t\tif (restoring) {\n\t\t\tinstantly_unmaximize();\n\t\t\tafter_rect = $w.$titlebar[0].getBoundingClientRect();\n\t\t\tinstantly_maximize();\n\t\t} else {\n\t\t\tinstantly_maximize();\n\t\t\tafter_rect = $w.$titlebar[0].getBoundingClientRect();\n\t\t\tinstantly_unmaximize();\n\t\t}\n\t\t$w.animateTitlebar(before_rect, after_rect, () => {\n\t\t\tif (restoring) {\n\t\t\t\tinstantly_unmaximize(); // finalize in some way\n\t\t\t\t$w.$maximize.removeClass(\"window-action-restore\");\n\t\t\t\t$w.$maximize.addClass(\"window-action-maximize\");\n\t\t\t} else {\n\t\t\t\tinstantly_maximize(); // finalize in some way\n\t\t\t\t$w.$maximize.removeClass(\"window-action-maximize\");\n\t\t\t\t$w.$maximize.addClass(\"window-action-restore\");\n\t\t\t}\n\t\t});\n\t};\n\t$w.restore = () => {\n\t\tif ($w.is(\".minimized-without-taskbar, .minimized\")) {\n\t\t\t$w.unminimize();\n\t\t} else if ($w.is(\".maximized\")) {\n\t\t\t$w.maximize(); // toggles maximization\n\t\t}\n\t};\n\t// must not pass event to functions by accident; also methods may not be defined yet\n\t$w.$minimize?.on(\"click\", (e) => { $w.minimize(); });\n\t$w.$maximize?.on(\"click\", (e) => { $w.maximize(); });\n\t$w.$x?.on(\"click\", (e) => { $w.close(); });\n\t$w.$title_area.on(\"dblclick\", (e) => { $w.maximize(); });\n\n\t$w.css({\n\t\tposition: \"absolute\",\n\t\tzIndex: $Window.Z_INDEX++\n\t});\n\t$w.bringToFront = () => {\n\t\t$w.css({\n\t\t\tzIndex: $Window.Z_INDEX++\n\t\t});\n\t\tfor (const $childWindow of child_$windows) {\n\t\t\t$childWindow.bringToFront();\n\t\t}\n\t};\n\n\t// Keep track of last focused elements per container,\n\t// where containers include:\n\t// - window (global focus tracking)\n\t// - $w[0] (window-local, for restoring focus when refocusing window)\n\t// - any iframes that are same-origin (for restoring focus when refocusing window)\n\t// @TODO: should these be WeakMaps? probably.\n\t// @TODO: share this Map between all windows? but clean it up when destroying windows? or would a WeakMap take care of that?\n\tvar last_focus_by_container = new Map(); // element to restore focus to, by container\n\tvar focus_update_handlers_by_container = new Map(); // event handlers by container; note use as a flag to avoid adding multiple handlers\n\tvar debug_svg_by_container = new Map(); // visualization\n\t/** @type {SVGSVGElement[]} */\n\tvar debug_svgs_in_window = []; // visualization\n\tvar warned_iframes = new WeakSet(); // prevent spamming console\n\n\t/**\n\t * @param {HTMLIFrameElement} iframe \n\t * @param {Error | unknown} error \n\t */\n\tconst warn_iframe_access = (iframe, error) => {\n\t\t/** @param {string} message */\n\t\tconst log_template = (message) => [`OS-GUI.js failed to access an iframe (${element_to_string(iframe)}) for focus integration.\n${message}\nOriginal error:\n`, error];\n\n\t\tlet cross_origin;\n\t\tif (iframe.srcdoc) {\n\t\t\tcross_origin = false;\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tconst url = new URL(iframe.src);\n\t\t\t\tcross_origin = url.origin !== window.location.origin; // shouldn't need to use iframe.ownerDocument.location.origin because intermediate iframes must be same-origin\n\t\t\t} catch (parse_error) {\n\t\t\t\tconsole.error(...log_template(`This may be a bug in OS-GUI. Is this a cross-origin iframe? Failed to parse URL (${parse_error}).`));\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (cross_origin) {\n\t\t\tif (options.iframes?.ignoreCrossOrigin && !warned_iframes.has(iframe)) {\n\t\t\t\tconsole.warn(...log_template(`Only same-origin iframes can work with focus integration (showing window as focused, refocusing last focused controls).\nIf you can re-host the content on the same origin, you can resolve this and enable focus integration.\nYou can also disable this warning by passing {iframes: {ignoreCrossOrigin: true}} to $Window.`));\n\t\t\t\twarned_iframes.add(iframe);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.error(...log_template(`This may be a bug in OS-GUI, since it doesn't appear to be a cross-origin iframe.`));\n\t\t}\n\t};\n\n\t/**\n\t * @param {Document} document \n\t * @param {Element} container_el \n\t * @param {Element} descendant_el \n\t * @param {boolean} is_root \n\t */\n\tconst debug_focus_tracking = (document, container_el, descendant_el, is_root) => {\n\t\tif (!$Window.DEBUG_FOCUS) {\n\t\t\treturn;\n\t\t}\n\t\tlet svg = debug_svg_by_container.get(container_el);\n\t\tif (!svg) {\n\t\t\tsvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n\t\t\tsvg.style.position = \"fixed\";\n\t\t\tsvg.style.top = \"0\";\n\t\t\tsvg.style.left = \"0\";\n\t\t\tsvg.style.width = \"100%\";\n\t\t\tsvg.style.height = \"100%\";\n\t\t\tsvg.style.pointerEvents = \"none\";\n\t\t\tsvg.style.zIndex = \"100000000\";\n\t\t\tsvg.style.direction = \"ltr\"; // position labels correctly\n\t\t\tdebug_svg_by_container.set(container_el, svg);\n\t\t\tdebug_svgs_in_window.push(svg);\n\t\t\tdocument.body.appendChild(svg);\n\t\t}\n\t\tsvg._container_el = container_el;\n\t\tsvg._descendant_el = descendant_el;\n\t\tsvg._is_root = is_root;\n\t\tanimate_debug_focus_tracking();\n\t};\n\t/** @param {SVGSVGElement} svg */\n\tconst update_debug_focus_tracking = (svg) => {\n\t\tconst container_el = svg._container_el;\n\t\tconst descendant_el = svg._descendant_el;\n\t\tconst is_root = svg._is_root;\n\n\t\twhile (svg.lastChild) {\n\t\t\tsvg.removeChild(svg.lastChild);\n\t\t}\n\t\tconst descendant_rect = descendant_el.getBoundingClientRect?.() ?? { left: 0, top: 0, width: innerWidth, height: innerHeight, right: innerWidth, bottom: innerHeight };\n\t\tconst container_rect = container_el.getBoundingClientRect?.() ?? { left: 0, top: 0, width: innerWidth, height: innerHeight, right: innerWidth, bottom: innerHeight };\n\t\t// draw rectangles with labels\n\t\tfor (const rect of [descendant_rect, container_rect]) {\n\t\t\tconst rect_el = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n\t\t\trect_el.setAttribute(\"x\", rect.left);\n\t\t\trect_el.setAttribute(\"y\", rect.top);\n\t\t\trect_el.setAttribute(\"width\", rect.width);\n\t\t\trect_el.setAttribute(\"height\", rect.height);\n\t\t\trect_el.setAttribute(\"stroke\", rect === descendant_rect ? \"#f44\" : \"#f44\");\n\t\t\trect_el.setAttribute(\"stroke-width\", \"2\");\n\t\t\trect_el.setAttribute(\"fill\", \"none\");\n\t\t\tif (!is_root) {\n\t\t\t\trect_el.setAttribute(\"stroke-dasharray\", \"5,5\");\n\t\t\t}\n\t\t\tsvg.appendChild(rect_el);\n\t\t\tconst text_el = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n\t\t\ttext_el.setAttribute(\"x\", rect.left);\n\t\t\ttext_el.setAttribute(\"y\", rect.top + (rect === descendant_rect ? 20 : 0)); // align container text on outside, descendant text on inside\n\t\t\ttext_el.setAttribute(\"fill\", rect === descendant_rect ? \"#f44\" : \"aqua\");\n\t\t\ttext_el.setAttribute(\"font-size\", \"20\");\n\t\t\ttext_el.style.textShadow = \"1px 1px 1px black, 0 0 10px black\";\n\t\t\ttext_el.textContent = element_to_string(rect === descendant_rect ? descendant_el : container_el);\n\t\t\tsvg.appendChild(text_el);\n\t\t}\n\t\t// draw lines connecting the two rects\n\t\tconst lines = [\n\t\t\t[descendant_rect.left, descendant_rect.top, container_rect.left, container_rect.top],\n\t\t\t[descendant_rect.right, descendant_rect.top, container_rect.right, container_rect.top],\n\t\t\t[descendant_rect.left, descendant_rect.bottom, container_rect.left, container_rect.bottom],\n\t\t\t[descendant_rect.right, descendant_rect.bottom, container_rect.right, container_rect.bottom],\n\t\t];\n\t\tfor (const line of lines) {\n\t\t\tconst line_el = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n\t\t\tline_el.setAttribute(\"x1\", line[0]);\n\t\t\tline_el.setAttribute(\"y1\", line[1]);\n\t\t\tline_el.setAttribute(\"x2\", line[2]);\n\t\t\tline_el.setAttribute(\"y2\", line[3]);\n\t\t\tline_el.setAttribute(\"stroke\", \"green\");\n\t\t\tline_el.setAttribute(\"stroke-width\", \"2\");\n\t\t\tsvg.appendChild(line_el);\n\t\t}\n\t};\n\t/** @type {number} */\n\tlet debug_animation_frame_id;\n\tconst animate_debug_focus_tracking = () => {\n\t\tcancelAnimationFrame(debug_animation_frame_id);\n\t\tif (!$Window.DEBUG_FOCUS) {\n\t\t\tclean_up_debug_focus_tracking();\n\t\t\treturn;\n\t\t}\n\t\tdebug_animation_frame_id = requestAnimationFrame(animate_debug_focus_tracking);\n\t\tfor (const svg of debug_svgs_in_window) {\n\t\t\tupdate_debug_focus_tracking(svg);\n\t\t}\n\t};\n\tconst clean_up_debug_focus_tracking = () => {\n\t\tcancelAnimationFrame(debug_animation_frame_id);\n\t\tfor (const svg of debug_svgs_in_window) {\n\t\t\tsvg.remove();\n\t\t}\n\t\tdebug_svgs_in_window.length = 0;\n\t\tdebug_svg_by_container.clear();\n\t};\n\n\tconst refocus = (container_el = $w.$content[0]) => {\n\t\tconst logical_container_el = container_el.matches(\".window-content\") ? $w[0] : container_el;\n\t\tconst last_focus = last_focus_by_container.get(logical_container_el);\n\t\tif (last_focus) {\n\t\t\tlast_focus.focus({ preventScroll: true });\n\t\t\tif (last_focus.tagName === \"IFRAME\") {\n\t\t\t\ttry {\n\t\t\t\t\trefocus(last_focus);\n\t\t\t\t} catch (e) {\n\t\t\t\t\twarn_iframe_access(last_focus, e);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst $tabstops = find_tabstops(container_el);\n\t\tconst $default = $tabstops.filter(\".default\");\n\t\tif ($default.length) {\n\t\t\t$default[0].focus({ preventScroll: true });\n\t\t\treturn;\n\t\t}\n\t\tif ($tabstops.length) {\n\t\t\tif ($tabstops[0].tagName === \"IFRAME\") {\n\t\t\t\tconst iframe = /** @type {HTMLIFrameElement} */ ($tabstops[0]);\n\t\t\t\ttry {\n\t\t\t\t\trefocus(iframe); // not .contentDocument.body because we want the container tracked by last_focus_by_container\n\t\t\t\t} catch (e) {\n\t\t\t\t\twarn_iframe_access(iframe, e);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$tabstops[0].focus({ preventScroll: true });\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (options.toolWindow && options.parentWindow) {\n\t\t\toptions.parentWindow.triggerHandler(\"refocus-window\");\n\t\t\treturn;\n\t\t}\n\t\tcontainer_el.focus({ preventScroll: true });\n\t\tif (container_el.tagName === \"IFRAME\") {\n\t\t\tconst iframe = /** @type {HTMLIFrameElement} */ (container_el);\n\t\t\ttry {\n\t\t\t\t// @ts-ignore\n\t\t\t\trefocus(iframe.contentDocument.body);\n\t\t\t} catch (e) {\n\t\t\t\twarn_iframe_access(iframe, e);\n\t\t\t}\n\t\t}\n\t};\n\n\t$w.on(\"refocus-window\", () => {\n\t\trefocus();\n\t});\n\n\t// redundant events are for handling synthetic events,\n\t// which may be sent individually, rather than in tandem\n\t$w.on(\"pointerdown mousedown\", handle_pointer_activation);\n\t// Note that jQuery treats some events differently, and can't listen for some synthetic events\n\t// but pointerdown and mousedown seem to be supported. That said, if you trigger() either,\n\t// addEventListener() handlers will not be called. So if I remove the dependency on jQuery,\n\t// it will not be possible to listen for some .trigger() events.\n\t// https://jsfiddle.net/1j01/ndvwts9y/1/\n\n\t// Assumption: focusin comes after pointerdown/mousedown\n\t// This is probably guaranteed, because you can prevent the default of focusing from pointerdown/mousedown\n\t$G.on(\"focusin\", (e) => {\n\t\tlast_focus_by_container.set(window, e.target);\n\t\t// debug_focus_tracking(document, window, e.target);\n\t});\n\n\t/** @param {Event} event */\n\tfunction handle_pointer_activation(event) {\n\t\t// console.log(\"handle_pointer_activation\", event.type, event.target);\n\t\t$w.bringToFront();\n\t\t// Test cases where it should refocus the last focused control in the window:\n\t\t// - Click in the blank space of the window\n\t\t//   - Click in blank space again now that something's focused\n\t\t// - Click on the window title bar\n\t\t//   - Click on title bar buttons\n\t\t// - Closing a second window should focus the first window\n\t\t//   - Open a dialog window from an app window that has a tool window, then close the dialog window\n\t\t//     - @TODO: Even if the tool window has controls, it should focus the parent window, I think\n\t\t// - Clicking on a control in the window should focus said control\n\t\t// - Clicking on a disabled control in the window should focus the window\n\t\t//   - Make sure to test this with another window previously focused\n\t\t// - Simulated clicks (important for JS Paint's eye gaze and speech recognition modes)\n\t\t// - (@TODO: Should clicking a child window focus the parent window?)\n\t\t// - After potentially selecting text but not selecting anything\n\t\t// It should NOT refocus when:\n\t\t// - Clicking on a control in a different window\n\t\t// - When other event handlers set focus\n\t\t//   - Using the keyboard to focus something outside the window, such as a menu popup\n\t\t//   - Clicking a control that focuses something outside the window\n\t\t//     - Button that opens another window (e.g. Recursive Dialog button in tests)\n\t\t//     - Button that focuses a control in another window (e.g. Focus Other button in tests)\n\t\t// - Trying to select text\n\n\t\t// Wait for other pointerdown handlers and default behavior, and focusin events.\n\t\trequestAnimationFrame(() => {\n\t\t\tconst last_focus_global = last_focus_by_container.get(window);\n\t\t\t// const last_focus_in_window = last_focus_by_container.get($w.$content[0]);\n\t\t\t// console.log(\"a tick after\", event.type, { last_focus_in_window, last_focus_global, activeElement: document.activeElement, win_elem: $w[0] });\n\t\t\t// console.log(\"did focus change?\", document.activeElement !== last_focus_global);\n\n\t\t\t// If something programmatically got focus, don't refocus.\n\t\t\tif (\n\t\t\t\tdocument.activeElement &&\n\t\t\t\t// @ts-ignore (just in case)\n\t\t\t\tdocument.activeElement !== document &&\n\t\t\t\tdocument.activeElement !== document.body &&\n\t\t\t\tdocument.activeElement !== $w.$content[0] &&\n\t\t\t\tdocument.activeElement !== last_focus_global\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// If menus got focus, don't refocus.\n\t\t\tif (document.activeElement?.closest?.(\".menus, .menu-popup\")) {\n\t\t\t\t// console.log(\"click in menus\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If the element is selectable, wait until the click is done and see if anything was selected first.\n\t\t\t// This is a bit of a weird compromise, for now.\n\t\t\tconst target_style = getComputedStyle(event.target);\n\t\t\tif (target_style.userSelect !== \"none\") {\n\t\t\t\t// Immediately show the window as focused, just don't refocus a specific control.\n\t\t\t\t$w.$content.focus();\n\n\t\t\t\t$w.one(\"pointerup pointercancel\", () => {\n\t\t\t\t\trequestAnimationFrame(() => { // this seems to make it more reliable in regards to double clicking\n\t\t\t\t\t\tif (!getSelection()?.toString().trim()) {\n\t\t\t\t\t\t\trefocus();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Set focus to the last focused control, which should be updated if a click just occurred.\n\t\t\trefocus();\n\t\t});\n\t}\n\n\t$w.on(\"keydown\", (e) => {\n\t\tif (e.isDefaultPrevented()) {\n\t\t\treturn;\n\t\t}\n\t\tif (e.ctrlKey || e.altKey || e.metaKey) {\n\t\t\treturn;\n\t\t}\n\t\t// console.log(\"keydown\", e.key, e.target);\n\t\tif (e.target.closest(\".menus\")) {\n\t\t\t// console.log(\"keydown in menus\");\n\t\t\treturn;\n\t\t}\n\t\tconst $buttons = $w.$content.find(\"button\");\n\t\t// XXX: Lying a little bit here, but TS seems confused otherwise, giving the type as JQueryStatic\n\t\tconst $focused = $(/** @type {HTMLElement} */(document.activeElement));\n\t\tconst focused_index = $buttons.index($focused);\n\t\tswitch (e.keyCode) {\n\t\t\tcase 40: // Down\n\t\t\tcase 39: // Right\n\t\t\t\tif ($focused.is(\"button\") && !e.shiftKey) {\n\t\t\t\t\tif (focused_index < $buttons.length - 1) {\n\t\t\t\t\t\t$buttons[focused_index + 1].focus();\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 38: // Up\n\t\t\tcase 37: // Left\n\t\t\t\tif ($focused.is(\"button\") && !e.shiftKey) {\n\t\t\t\t\tif (focused_index > 0) {\n\t\t\t\t\t\t$buttons[focused_index - 1].focus();\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 32: // Space\n\t\t\tcase 13: // Enter (doesn't actually work in chrome because the button gets clicked immediately)\n\t\t\t\tif ($focused.is(\"button\") && !e.shiftKey) {\n\t\t\t\t\t$focused.addClass(\"pressed\");\n\t\t\t\t\tconst release = () => {\n\t\t\t\t\t\t$focused.removeClass(\"pressed\");\n\t\t\t\t\t\t$focused.off(\"focusout\", release);\n\t\t\t\t\t\t$(window).off(\"keyup\", keyup);\n\t\t\t\t\t};\n\t\t\t\t\tconst keyup = (/** @type {{ keyCode: number; }} */ e) => {\n\t\t\t\t\t\tif (e.keyCode === 32 || e.keyCode === 13) {\n\t\t\t\t\t\t\trelease();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t$focused.on(\"focusout\", release);\n\t\t\t\t\t$(window).on(\"keyup\", keyup);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 9: { // Tab\n\t\t\t\t// wrap around when tabbing through controls in a window\n\t\t\t\tconst $controls = find_tabstops($w.$content[0]);\n\t\t\t\tif ($controls.length > 0) {\n\t\t\t\t\tconst focused_control_index = $controls.index($focused);\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\tif (focused_control_index === 0) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t$controls[$controls.length - 1].focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (focused_control_index === $controls.length - 1) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t$controls[0].focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 27: // Escape\n\t\t\t\t// @TODO: make this optional, and probably default false\n\t\t\t\t$w.close();\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\t$w.applyBounds = () => {\n\t\t// TODO: outerWidth vs width? not sure\n\t\tconst bound_width = Math.max(document.body.scrollWidth, innerWidth);\n\t\tconst bound_height = Math.max(document.body.scrollHeight, innerHeight);\n\t\t$w.css({\n\t\t\tleft: Math.max(0, Math.min(bound_width - $w.width(), $w.position().left)),\n\t\t\ttop: Math.max(0, Math.min(bound_height - $w.height(), $w.position().top)),\n\t\t});\n\t};\n\n\t$w.bringTitleBarInBounds = () => {\n\t\t// Try to make the titlebar always accessible\n\t\tconst bound_width = Math.max(document.body.scrollWidth, innerWidth);\n\t\tconst bound_height = Math.max(document.body.scrollHeight, innerHeight);\n\t\tconst min_horizontal_pixels_on_screen = 40; // enough for space past a close button\n\t\t$w.css({\n\t\t\tleft: Math.max(\n\t\t\t\tmin_horizontal_pixels_on_screen - $w.outerWidth(),\n\t\t\t\tMath.min(\n\t\t\t\t\tbound_width - min_horizontal_pixels_on_screen,\n\t\t\t\t\t$w.position().left\n\t\t\t\t)\n\t\t\t),\n\t\t\ttop: Math.max(0, Math.min(\n\t\t\t\tbound_height - $w.$titlebar.outerHeight() - 5,\n\t\t\t\t$w.position().top\n\t\t\t)),\n\t\t});\n\t};\n\n\t$w.center = () => {\n\t\t$w.css({\n\t\t\tleft: (innerWidth - $w.width()) / 2 + window.scrollX,\n\t\t\ttop: (innerHeight - $w.height()) / 2 + window.scrollY,\n\t\t});\n\t\t$w.applyBounds();\n\t};\n\n\n\t$G.on(\"resize\", $w.bringTitleBarInBounds);\n\n\t/** @type {number} */\n\tvar drag_offset_x;\n\t/** @type {number} */\n\tvar drag_offset_y;\n\t/** @type {number} */\n\tvar drag_pointer_x;\n\t/** @type {number} */\n\tvar drag_pointer_y;\n\t/** @type {number} */\n\tvar drag_pointer_id;\n\t/** @param {JQuery.TriggeredEvent} e */\n\tvar update_drag = (e) => {\n\t\tconst pointerId = e.pointerId ?? e.originalEvent?.pointerId; // originalEvent doesn't exist for triggerHandler()\n\t\tif (\n\t\t\tdrag_pointer_id === pointerId ||\n\t\t\tpointerId === undefined || // (allowing synthetic events to affect the drag without pointerId)\n\t\t\tdrag_pointer_id === undefined || // (allowing real events to affect a drag started with a synthetic event without a pointerId, for jspaint's Eye Gaze Mode... uh...)\n\t\t\tdrag_pointer_id === 1234567890 // allowing real events to affect a drag started with a synthetic event with this fake pointerId, for jspaint's Eye Gaze Mode!!\n\t\t\t// @TODO: find a better way to support synthetic events (could make the fake pointerId a formal part of the API contract at least...)\n\t\t) {\n\t\t\tdrag_pointer_x = e.clientX ?? drag_pointer_x;\n\t\t\tdrag_pointer_y = e.clientY ?? drag_pointer_y;\n\t\t}\n\t\t$w.css({\n\t\t\tleft: drag_pointer_x + scrollX - drag_offset_x,\n\t\t\ttop: drag_pointer_y + scrollY - drag_offset_y,\n\t\t});\n\t};\n\t$w.$titlebar.css(\"touch-action\", \"none\");\n\t$w.$titlebar.on(\"selectstart\", (e) => { // preventing mousedown would break :active state, I'm not sure if just selectstart is enough...\n\t\te.preventDefault();\n\t});\n\t$w.$titlebar.on(\"mousedown\", \"button\", (e) => {\n\t\t// Prevent focus on titlebar buttons.\n\t\t// This can break the :active state. In Firefox, a setTimeout before any focus() was enough,\n\t\t// but now in Chrome 95, focus() breaks the :active state too, and setTimeout only delays the brokenness,\n\t\t// so I have to use a CSS class now for the pressed state.\n\t\trefocus();\n\t\t// Emulate :enabled:active:hover state with .pressing class\n\t\tconst button = e.currentTarget;\n\t\tif (!$(button).is(\":enabled\")) {\n\t\t\treturn;\n\t\t}\n\t\tbutton.classList.add(\"pressing\");\n\t\t/** @param {JQuery.TriggeredEvent} event */\n\t\tconst release = (event) => {\n\t\t\t// blur is just to handle the edge case of alt+tabbing/ctrl+tabbing away\n\t\t\tif (event && event.type === \"blur\") {\n\t\t\t\t// if (document.activeElement?.tagName === \"IFRAME\") {\n\t\t\t\tif (document.hasFocus()) {\n\t\t\t\t\treturn; // the window isn't really blurred; an iframe got focus\n\t\t\t\t}\n\t\t\t}\n\t\t\tbutton.classList.remove(\"pressing\");\n\t\t\t$G.off(\"mouseup blur\", release);\n\t\t\t$(button).off(\"mouseenter\", on_mouse_enter);\n\t\t\t$(button).off(\"mouseleave\", on_mouse_leave);\n\t\t};\n\t\tconst on_mouse_enter = () => { button.classList.add(\"pressing\"); };\n\t\tconst on_mouse_leave = () => { button.classList.remove(\"pressing\"); };\n\t\t$G.on(\"mouseup blur\", release);\n\t\t$(button).on(\"mouseenter\", on_mouse_enter);\n\t\t$(button).on(\"mouseleave\", on_mouse_leave);\n\t});\n\t$w.$titlebar.on(\"pointerdown\", (e) => {\n\t\tif ($(e.target).closest(\"button\").length) {\n\t\t\treturn;\n\t\t}\n\t\tif ($w.hasClass(\"maximized\")) {\n\t\t\treturn;\n\t\t}\n\t\tconst customEvent = $.Event(\"window-drag-start\");\n\t\t$w.trigger(customEvent);\n\t\tif (customEvent.isDefaultPrevented()) {\n\t\t\treturn; // allow custom drag behavior of component windows in jspaint (Tools / Colors)\n\t\t}\n\t\tdrag_offset_x = e.clientX + scrollX - $w.position().left;\n\t\tdrag_offset_y = e.clientY + scrollY - $w.position().top;\n\t\tdrag_pointer_x = e.clientX;\n\t\tdrag_pointer_y = e.clientY;\n\t\tdrag_pointer_id = (e.pointerId ?? e.originalEvent?.pointerId); // originalEvent doesn't exist for triggerHandler()\n\t\t$G.on(\"pointermove\", update_drag);\n\t\t$G.on(\"scroll\", update_drag);\n\t\t$(\"body\").addClass(\"dragging\"); // for when mouse goes over an iframe\n\t});\n\t$G.on(\"pointerup pointercancel\", (e) => {\n\t\tconst pointerId = e.pointerId ?? e.originalEvent?.pointerId; // originalEvent doesn't exist for triggerHandler()\n\t\tif (pointerId !== drag_pointer_id && pointerId !== undefined) { return; } // (allowing synthetic events to affect the drag without pointerId)\n\t\t$G.off(\"pointermove\", update_drag);\n\t\t$G.off(\"scroll\", update_drag);\n\t\t$(\"body\").removeClass(\"dragging\");\n\t\t// $w.applyBounds(); // Windows doesn't really try to keep windows on screen\n\t\t// but you also can't really drag off of the desktop, whereas here you can drag to way outside the web page.\n\t\t$w.bringTitleBarInBounds();\n\t\tdrag_pointer_id = -1; // prevent bringTitleBarInBounds from making the window go to top left when unminimizing window from taskbar after previously dragging it\n\t});\n\t$w.$titlebar.on(\"dblclick\", (e) => {\n\t\tif ($component) {\n\t\t\t$component.dock();\n\t\t}\n\t});\n\n\tif (options.resizable) {\n\n\t\tconst HANDLE_MIDDLE = 0;\n\t\tconst HANDLE_START = -1;\n\t\tconst HANDLE_END = 1;\n\t\tconst HANDLE_LEFT = HANDLE_START;\n\t\tconst HANDLE_RIGHT = HANDLE_END;\n\t\tconst HANDLE_TOP = HANDLE_START;\n\t\tconst HANDLE_BOTTOM = HANDLE_END;\n\n\t\t/** @type {[(0 | -1 | 1), (0 | -1 | 1)][]} */\n\t\tconst handle_positions = [\n\t\t\t[HANDLE_TOP, HANDLE_RIGHT], // ↗\n\t\t\t[HANDLE_TOP, HANDLE_MIDDLE], // ↑\n\t\t\t[HANDLE_TOP, HANDLE_LEFT], // ↖\n\t\t\t[HANDLE_MIDDLE, HANDLE_LEFT], // ←\n\t\t\t[HANDLE_BOTTOM, HANDLE_LEFT], // ↙\n\t\t\t[HANDLE_BOTTOM, HANDLE_MIDDLE], // ↓\n\t\t\t[HANDLE_BOTTOM, HANDLE_RIGHT], // ↘\n\t\t\t[HANDLE_MIDDLE, HANDLE_RIGHT], // →\n\t\t];\n\t\thandle_positions.forEach(([y_axis, x_axis]) => {\n\t\t\t// const resizes_height = y_axis !== HANDLE_MIDDLE;\n\t\t\t// const resizes_width = x_axis !== HANDLE_MIDDLE;\n\t\t\tconst $handle = $(\"<div>\").addClass(\"handle\").appendTo($w);\n\n\t\t\tlet cursor = \"\";\n\t\t\tif (y_axis === HANDLE_TOP) { cursor += \"n\"; }\n\t\t\tif (y_axis === HANDLE_BOTTOM) { cursor += \"s\"; }\n\t\t\tif (x_axis === HANDLE_LEFT) { cursor += \"w\"; }\n\t\t\tif (x_axis === HANDLE_RIGHT) { cursor += \"e\"; }\n\t\t\tcursor += \"-resize\";\n\n\t\t\t// Note: MISNOMER: innerWidth() is less \"inner\" than width(), because it includes padding!\n\t\t\t// Here's a little diagram of sorts:\n\t\t\t// outerWidth(true): margin, [ outerWidth(): border, [ innerWidth(): padding, [ width(): content ] ] ]\n\t\t\tconst handle_thickness = ($w.outerWidth() - $w.width()) / 2; // padding + border\n\t\t\tconst border_width = ($w.outerWidth() - $w.innerWidth()) / 2; // border; need to outset the handles by this amount so they overlap the border + padding, and not the content\n\t\t\tconst window_frame_height = $w.outerHeight() - $w.$content.outerHeight(); // includes titlebar and borders, padding, but not content\n\t\t\tconst window_frame_width = $w.outerWidth() - $w.$content.outerWidth(); // includes borders, padding, but not content\n\t\t\t$handle.css({\n\t\t\t\tposition: \"absolute\",\n\t\t\t\ttop: y_axis === HANDLE_TOP ? -border_width : y_axis === HANDLE_MIDDLE ? `calc(${handle_thickness}px - ${border_width}px)` : \"\",\n\t\t\t\tbottom: y_axis === HANDLE_BOTTOM ? -border_width : \"\",\n\t\t\t\tleft: x_axis === HANDLE_LEFT ? -border_width : x_axis === HANDLE_MIDDLE ? `calc(${handle_thickness}px - ${border_width}px)` : \"\",\n\t\t\t\tright: x_axis === HANDLE_RIGHT ? -border_width : \"\",\n\t\t\t\twidth: x_axis === HANDLE_MIDDLE ? `calc(100% - ${handle_thickness}px * 2 + ${border_width * 2}px)` : `${handle_thickness}px`,\n\t\t\t\theight: y_axis === HANDLE_MIDDLE ? `calc(100% - ${handle_thickness}px * 2 + ${border_width * 2}px)` : `${handle_thickness}px`,\n\t\t\t\t// background: x_axis === HANDLE_MIDDLE || y_axis === HANDLE_MIDDLE ? \"rgba(255,0,0,0.4)\" : \"rgba(0,255,0,0.8)\",\n\t\t\t\ttouchAction: \"none\",\n\t\t\t\tcursor,\n\t\t\t});\n\n\t\t\t/** @type {{ x: number, y: number, width: number, height: number }} */\n\t\t\tlet rect;\n\t\t\t/** @type {number} */\n\t\t\tlet resize_offset_x;\n\t\t\t/** @type {number} */\n\t\t\tlet resize_offset_y;\n\t\t\t/** @type {number} */\n\t\t\tlet resize_pointer_x;\n\t\t\t/** @type {number} */\n\t\t\tlet resize_pointer_y;\n\t\t\t/** @type {number} */\n\t\t\tlet resize_pointer_id;\n\t\t\t$handle.on(\"pointerdown\", (e) => {\n\t\t\t\te.preventDefault();\n\n\t\t\t\t$G.on(\"pointermove\", handle_pointermove);\n\t\t\t\t$G.on(\"scroll\", update_resize); // scroll doesn't have clientX/Y, so we have to remember it\n\t\t\t\t$(\"body\").addClass(\"dragging\"); // for when mouse goes over an iframe\n\t\t\t\t$G.on(\"pointerup pointercancel\", end_resize);\n\n\t\t\t\trect = {\n\t\t\t\t\tx: $w.position().left,\n\t\t\t\t\ty: $w.position().top,\n\t\t\t\t\twidth: $w.outerWidth(),\n\t\t\t\t\theight: $w.outerHeight(),\n\t\t\t\t};\n\n\t\t\t\tresize_offset_x = e.clientX + scrollX - rect.x - (x_axis === HANDLE_RIGHT ? rect.width : 0);\n\t\t\t\tresize_offset_y = e.clientY + scrollY - rect.y - (y_axis === HANDLE_BOTTOM ? rect.height : 0);\n\t\t\t\tresize_pointer_x = e.clientX;\n\t\t\t\tresize_pointer_y = e.clientY;\n\t\t\t\tresize_pointer_id = (e.pointerId ?? e.originalEvent?.pointerId); // originalEvent doesn't exist for triggerHandler()\n\n\t\t\t\ttry {\n\t\t\t\t\t$handle[0].setPointerCapture(resize_pointer_id); // keeps cursor consistent when mouse moves over other elements\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Prevent error from failing test; Cypress sends synthetic events that aren't trusted; I could pass a pointerId but not an active pointer id\n\t\t\t\t\t// NotFoundError: Failed to execute 'setPointerCapture' on 'Element': No active pointer with the given id is found.\n\t\t\t\t\tconsole.warn(\"Failed to capture pointer for resize handle drag:\", error);\n\t\t\t\t}\n\n\t\t\t\t// handle_pointermove(e); // was useful for checking that the offset is correct (should not do anything, if it's correct!)\n\t\t\t});\n\t\t\tfunction handle_pointermove(/** @type {JQuery.TriggeredEvent} */ e) {\n\t\t\t\tconst pointerId = e.pointerId ?? e.originalEvent?.pointerId; // originalEvent doesn't exist for triggerHandler()\n\t\t\t\tif (pointerId !== resize_pointer_id && pointerId !== undefined) { return; } // (allowing synthetic events to affect the drag without pointerId)\n\t\t\t\tresize_pointer_x = e.clientX;\n\t\t\t\tresize_pointer_y = e.clientY;\n\t\t\t\tupdate_resize();\n\t\t\t}\n\t\t\tfunction end_resize(/** @type {JQuery.TriggeredEvent} */ e) {\n\t\t\t\tconst pointerId = e.pointerId ?? e.originalEvent?.pointerId; // originalEvent doesn't exist for triggerHandler()\n\t\t\t\tif (pointerId !== resize_pointer_id && pointerId !== undefined) { return; } // (allowing synthetic events to affect the drag without pointerId)\n\t\t\t\t$G.off(\"pointermove\", handle_pointermove);\n\t\t\t\t$(\"body\").removeClass(\"dragging\");\n\t\t\t\t$G.off(\"pointerup pointercancel\", end_resize);\n\t\t\t\t$w.bringTitleBarInBounds();\n\t\t\t}\n\t\t\tfunction update_resize() {\n\t\t\t\tconst mouse_x = resize_pointer_x + scrollX - resize_offset_x;\n\t\t\t\tconst mouse_y = resize_pointer_y + scrollY - resize_offset_y;\n\t\t\t\tlet delta_x = 0;\n\t\t\t\tlet delta_y = 0;\n\t\t\t\tlet width, height;\n\t\t\t\tif (x_axis === HANDLE_RIGHT) {\n\t\t\t\t\tdelta_x = 0;\n\t\t\t\t\twidth = ~~(mouse_x - rect.x);\n\t\t\t\t} else if (x_axis === HANDLE_LEFT) {\n\t\t\t\t\tdelta_x = ~~(mouse_x - rect.x);\n\t\t\t\t\twidth = ~~(rect.x + rect.width - mouse_x);\n\t\t\t\t} else {\n\t\t\t\t\twidth = ~~(rect.width);\n\t\t\t\t}\n\t\t\t\tif (y_axis === HANDLE_BOTTOM) {\n\t\t\t\t\tdelta_y = 0;\n\t\t\t\t\theight = ~~(mouse_y - rect.y);\n\t\t\t\t} else if (y_axis === HANDLE_TOP) {\n\t\t\t\t\tdelta_y = ~~(mouse_y - rect.y);\n\t\t\t\t\theight = ~~(rect.y + rect.height - mouse_y);\n\t\t\t\t} else {\n\t\t\t\t\theight = ~~(rect.height);\n\t\t\t\t}\n\t\t\t\tlet new_rect = {\n\t\t\t\t\tx: rect.x + delta_x,\n\t\t\t\t\ty: rect.y + delta_y,\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t};\n\n\t\t\t\tnew_rect.width = Math.max(1, new_rect.width);\n\t\t\t\tnew_rect.height = Math.max(1, new_rect.height);\n\n\t\t\t\t// Constraints\n\t\t\t\tif (options.constrainRect) {\n\t\t\t\t\tnew_rect = options.constrainRect(new_rect, x_axis, y_axis);\n\t\t\t\t}\n\t\t\t\tnew_rect.width = Math.max(new_rect.width, options.minOuterWidth ?? 100);\n\t\t\t\tnew_rect.height = Math.max(new_rect.height, options.minOuterHeight ?? 0);\n\t\t\t\tnew_rect.width = Math.max(new_rect.width, (options.minInnerWidth ?? 0) + window_frame_width);\n\t\t\t\tnew_rect.height = Math.max(new_rect.height, (options.minInnerHeight ?? 0) + window_frame_height);\n\t\t\t\t// prevent free movement via resize past minimum size\n\t\t\t\tif (x_axis === HANDLE_LEFT) {\n\t\t\t\t\tnew_rect.x = Math.min(new_rect.x, rect.x + rect.width - new_rect.width);\n\t\t\t\t}\n\t\t\t\tif (y_axis === HANDLE_TOP) {\n\t\t\t\t\tnew_rect.y = Math.min(new_rect.y, rect.y + rect.height - new_rect.height);\n\t\t\t\t}\n\n\t\t\t\t$w.css({\n\t\t\t\t\ttop: new_rect.y,\n\t\t\t\t\tleft: new_rect.x,\n\t\t\t\t});\n\t\t\t\t$w.outerWidth(new_rect.width);\n\t\t\t\t$w.outerHeight(new_rect.height);\n\t\t\t}\n\t\t});\n\t}\n\n\t$w.$Button = (text, handler) => {\n\t\tvar $b = $(E(\"button\"))\n\t\t\t.appendTo($w.$content)\n\t\t\t.text(text)\n\t\t\t.on(\"click\", () => {\n\t\t\t\tif (handler) {\n\t\t\t\t\thandler();\n\t\t\t\t}\n\t\t\t\t$w.close();\n\t\t\t});\n\t\treturn $b;\n\t};\n\t/**\n\t * @typedef {{\n\t * \t(text: string): OSGUI$Window;\n\t * \t(): string;\n\t * }} titleMethodOverloads\n\t*/\n\t// https://github.com/Microsoft/TypeScript/issues/25590#issuecomment-968906682\n\t$w.title = /** @type {titleMethodOverloads} */ ((title) => {\n\t\t// title(\"\") should clear the title\n\t\t// title(5) should set the title to \"5\"\n\t\t// title() should return the title\n\t\tif (typeof title !== \"undefined\") {\n\t\t\t$w.$title.text(title);\n\t\t\t$w.trigger(\"title-change\");\n\t\t\tif ($w.task) {\n\t\t\t\t$w.task.updateTitle();\n\t\t\t}\n\t\t\treturn $w;\n\t\t} else {\n\t\t\treturn $w.$title.text();\n\t\t}\n\t});\n\n\t$w.getTitle = () => {\n\t\treturn $w.title();\n\t};\n\tlet animating_titlebar = false;\n\t/**\n\t * queue of functions to call when done animating,\n\t * so maximize() / minimize() / restore() eventually gives the same result as if there was no animation\n\t * @type {(() => void)[]}\n\t */\n\tlet when_done_animating_titlebar = [];\n\t$w.animateTitlebar = (from, to, callback = () => { }) => {\n\t\t// flying titlebar animation\n\t\tanimating_titlebar = true;\n\t\tconst $eye_leader = $w.$titlebar.clone(true);\n\t\t$eye_leader.find(\"button\").remove();\n\t\t$eye_leader.appendTo(\"body\");\n\t\tconst duration_ms = $Window.OVERRIDE_TRANSITION_DURATION ?? 200; // TODO: how long?\n\t\tconst duration_str = `${duration_ms}ms`;\n\t\t$eye_leader.css({\n\t\t\ttransition: `left ${duration_str} linear, top ${duration_str} linear, width ${duration_str} linear, height ${duration_str} linear`,\n\t\t\tposition: \"fixed\",\n\t\t\tzIndex: 10000000,\n\t\t\tpointerEvents: \"none\",\n\t\t\tleft: from.left,\n\t\t\ttop: from.top,\n\t\t\twidth: from.width,\n\t\t\theight: from.height,\n\t\t});\n\t\tsetTimeout(() => {\n\t\t\t$eye_leader.css({\n\t\t\t\tleft: to.left,\n\t\t\t\ttop: to.top,\n\t\t\t\twidth: to.width,\n\t\t\t\theight: to.height,\n\t\t\t});\n\t\t}, 5);\n\t\tlet handled_transition_completion = false;\n\t\tconst handle_transition_completion = () => {\n\t\t\tif (handled_transition_completion) {\n\t\t\t\treturn; // ignore multiple calls (an idempotency pattern)\n\t\t\t} else {\n\t\t\t\thandled_transition_completion = true;\n\t\t\t}\n\t\t\tanimating_titlebar = false;\n\t\t\t$eye_leader.remove();\n\t\t\tcallback();\n\t\t\twhen_done_animating_titlebar.shift()?.(); // relies on animating_titlebar = false;\n\t\t};\n\t\t$eye_leader.on(\"transitionend transitioncancel\", handle_transition_completion);\n\t\tsetTimeout(handle_transition_completion, duration_ms * 1.2);\n\t};\n\t/** @param {boolean} [force] */\n\t$w.close = (force) => {\n\t\tif (force && force !== true) {\n\t\t\tthrow new TypeError(\"force must be a boolean or undefined, not \" + Object.prototype.toString.call(force));\n\t\t}\n\t\tif (!force) {\n\t\t\tvar e = $.Event(\"close\");\n\t\t\t$w.trigger(e);\n\t\t\tif (e.isDefaultPrevented()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif ($component) {\n\t\t\t$component.detach();\n\t\t}\n\t\t$w.closed = true;\n\t\tminimize_slots[$w._minimize_slot_index] = null;\n\n\t\t$event_target.triggerHandler(\"closed\");\n\t\t$w.trigger(\"closed\");\n\t\t// TODO: change usages of \"close\" to \"closed\" where appropriate\n\t\t// and probably rename the \"close\" event (\"before[-]close\"? \"may-close\"? \"close-request\"?)\n\n\t\t// MUST be after any events are triggered!\n\t\t$w.remove();\n\n\t\t// TODO: support modals, which should focus what was focused before the modal was opened.\n\t\t// (Note: must consider the element being removed from the DOM, or hidden, or made un-focusable)\n\t\t// (Also: modals should steal focus / be brought to the front when focusing the parent window, and the parent window's content should be inert/uninteractive)\n\n\t\t// Focus next-topmost window\n\t\tvar $next_topmost = $($(\".window:visible\").toArray().sort((a, b) => b.style.zIndex - a.style.zIndex)[0]);\n\t\t$next_topmost.triggerHandler(\"refocus-window\");\n\n\t\t// Cleanup\n\t\tclean_up_debug_focus_tracking();\n\t};\n\t$w.closed = false;\n\n\t/** @type {MenuBar | null} */\n\tlet current_menu_bar;\n\t// @TODO: should this be like setMenus(menu_definitions)?\n\t// It seems like setMenuBar(menu_bar) might be prone to bugs\n\t// trying to set the same menu bar on multiple windows.\n\t$w.setMenuBar = (menu_bar) => {\n\t\t// $w.find(\".menus\").remove(); // ugly, if only because of the class name haha\n\t\tif (current_menu_bar) {\n\t\t\tcurrent_menu_bar.element.remove();\n\t\t}\n\t\tif (menu_bar) {\n\t\t\t$w.$titlebar.after(menu_bar.element);\n\t\t\tmenu_bar.setKeyboardScope($w[0]);\n\t\t\tcurrent_menu_bar = menu_bar;\n\t\t}\n\t};\n\n\tif (options.title) {\n\t\t$w.title(options.title);\n\t}\n\n\tif (!$component) {\n\t\t$w.center();\n\t}\n\n\t// mustHaveMethods($w, windowInterfaceMethods);\n\n\treturn $w;\n}\n\n/**\n * @param {string} title\n * @returns {OSGUI$FormWindow}\n */\nfunction $FormWindow(title) {\n\tvar $w = /** @type {OSGUI$FormWindow} */($Window());\n\n\t$w.title(title);\n\t$w.$form = $(E(\"form\")).appendTo($w.$content);\n\t$w.$main = $(E(\"div\")).appendTo($w.$form);\n\t$w.$buttons = $(E(\"div\")).appendTo($w.$form).addClass(\"button-group\");\n\n\t$w.$Button = (label, action) => {\n\t\tvar $b = $(E(\"button\")).appendTo($w.$buttons).text(label);\n\t\t$b.on(\"click\", (e) => {\n\t\t\t// prevent the form from submitting\n\t\t\t// @TODO: instead, prevent the form's submit event\n\t\t\te.preventDefault();\n\n\t\t\taction();\n\t\t});\n\n\t\t$b.on(\"pointerdown\", () => {\n\t\t\t$b.focus();\n\t\t});\n\n\t\treturn $b;\n\t};\n\n\treturn $w;\n}\n\nexports.$Window = $Window;\nexports.$FormWindow = $FormWindow;\n\n})(window);\n"
  },
  {
    "path": "lib/os-gui/MenuBar.js",
    "content": "((exports) => {\n\n/**\n * @template {keyof HTMLElementTagNameMap} K\n * @param {K} tagName\n * @param {Record<string, string>} [attrs]\n * @returns {HTMLElementTagNameMap[K]}\n */\nfunction E(tagName, attrs) {\n\tconst el = document.createElement(tagName);\n\tif (attrs) {\n\t\tfor (const key in attrs) {\n\t\t\tif (key === \"class\") {\n\t\t\t\tel.className = attrs[key];\n\t\t\t} else {\n\t\t\t\tel.setAttribute(key, attrs[key]);\n\t\t\t}\n\t\t}\n\t}\n\treturn el;\n}\n\nlet uid_counter = 0;\nfunction uid() {\n\t// make id from counter (guaranteeing page-local uniqueness)\n\t// and random base 36 number (making it look random, so there's no temptation to use it as a sequence)\n\t// Note: Math.random().toString(36).slice(2) can give empty string\n\treturn (uid_counter++).toString(36) + Math.random().toString(36).slice(2);\n}\n\n// & defines access keys (contextual hotkeys) in menus and buttons and form labels, which get underlined in the UI.\n// & can be escaped by doubling it, e.g. \"&Taskbar && Start Menu\" for \"Taskbar & Start Menu\" with T as the access key.\n/** @type {AccessKeys} */\nconst AccessKeys = {\n\tescape: function (label) {\n\t\t// Escapes all ampersands in the label, so that they are not treated as access keys.\n\t\t// Useful for dynamic menus like a list of history entries, where page titles shouldn't be spuriously interpreted as having access keys.\n\t\t// Double ampersands are still escaped (\"&&\" becomes \"&&&&\"), so that \"&&\" isn't spuriously interpreted as \"&\".\n\t\treturn label.replace(/&/g, \"&&\");\n\t},\n\tunescape: function (label) {\n\t\t// Un-escapes all double ampersands in the label.\n\t\t// For rendering, use toHTML() or toFragment() instead.\n\t\treturn label.replace(/&&/g, \"&\");\n\t},\n\tindexOf: function (label) {\n\t\t// Returns the index of the ampersand that defines an access key, or -1 if not present.\n\n\t\t// return label.search(/(?<!&)&(?!&|\\s)/); // not enough browser support for negative lookbehind assertions\n\n\t\t// The space here handles beginning-of-string matching and counteracts the offset for the [^&] so it acts like a negative lookbehind\n\t\treturn ` ${label}`.search(/[^&]&[^&\\s]/);\n\t},\n\thas: function (label) {\n\t\t// Returns true if the label has an access key.\n\t\treturn this.indexOf(label) >= 0;\n\t},\n\tget: function (label) {\n\t\t// Returns the access key for the label, or null if none.\n\t\t// Used by MenuBar and MenuPopup to trigger the menu item with the access key.\n\t\t// Can be used for handling access keys in other UI, for example in form labels.\n\t\tconst index = this.indexOf(label);\n\t\tif (index >= 0) {\n\t\t\treturn label.charAt(index + 1).toUpperCase();\n\t\t}\n\t\treturn null;\n\t},\n\tremove: function (label) {\n\t\t// Removes the access key from the label.\n\t\t// Like toText() but with a special case to remove parentheticals like \" (&N)\".\n\t\tconst parentheticalRegex = /\\s?\\(&[^&]\\)/;\n\t\tif (parentheticalRegex.test(label)) {\n\t\t\treturn this.unescape(label.replace(parentheticalRegex, \"\"));\n\t\t}\n\t\treturn this.toText(label);\n\t},\n\ttoText: function (label) {\n\t\t// Removes the access key indicator from the label.\n\t\t// This is like toHTML() but for plain text.\n\t\t// Note: while often access keys are part of a word, like \"&New\",\n\t\t// in translations they are often indicated separately, like \"새로 만들기 (&N)\",\n\t\t// since the access key stays the same, but the letter is no longer part of the word (or even the alphabet).\n\t\t// This doesn't remove strings like \" (&N)\", it will just remove the \"&\" and leave \"새로 만들기 (N)\".\n\t\tconst index = this.indexOf(label);\n\t\tif (index >= 0) {\n\t\t\treturn this.unescape(label.substring(0, index)) + this.unescape(label.substring(index + 1));\n\t\t}\n\t\treturn this.unescape(label);\n\t\t// old version, not un-escaping:\n\t\t// return label.replace(/\\s?\\(&.\\)/, \"\").replace(/([^&]|^)&([^&\\s])/, \"$1$2\");\n\t},\n\ttoHTML: function (label) {\n\t\t// Returns the label with the access key underlined (or with whatever .menu-hotkey styling), HTML-escaped.\n\t\tconst fragment = this.toFragment(label);\n\t\tconst dummy = document.createElement(\"div\");\n\t\tdummy.appendChild(fragment);\n\t\treturn dummy.innerHTML;\n\n\t\t// old version, not escaping HTML:\n\t\t// return label.replace(/([^&]|^)&([^&\\s])/, \"$1<span class='menu-hotkey'>$2</span>\").replace(/&&/g, \"&\");\n\n\t\t// alternative version, building an HTML string:\n\t\t// const index = this.indexOf(label);\n\t\t// if (index >= 0) {\n\t\t// \treturn escapeHTML(this.unescape(label.substring(0, index))) + \"<u>\" + escapeHTML(label.charAt(index + 1)) + \"</u>\" + escapeHTML(this.unescape(label.substring(index + 2)));\n\t\t// } else {\n\t\t// \treturn escapeHTML(this.unescape(label));\n\t\t// }\n\t},\n\ttoFragment: function (label) {\n\t\t// Returns a DocumentFragment of the label with the access key underlined (or with whatever .menu-hotkey styling)\n\t\tconst fragment = document.createDocumentFragment();\n\t\tconst index = this.indexOf(label);\n\t\tif (index >= 0) {\n\t\t\tfragment.appendChild(document.createTextNode(this.unescape(label.substring(0, index))));\n\t\t\t// TODO: change class to .access-key, because they can appear outside menus, and \"hotkey\" is too generic\n\t\t\t// also, I could use the <u> tag, since that gives the default styling (but then it'd have to be reset if you don't want it...)\n\t\t\tconst span = E(\"span\", { class: \"menu-hotkey\" });\n\t\t\tspan.appendChild(document.createTextNode(label.charAt(index + 1)));\n\t\t\tfragment.appendChild(span);\n\t\t\tfragment.appendChild(document.createTextNode(this.unescape(label.substring(index + 2))));\n\t\t} else {\n\t\t\tfragment.appendChild(document.createTextNode(this.unescape(label)));\n\t\t}\n\t\treturn fragment;\n\t},\n};\n\n// @TODO: support dynamic menus (e.g. a list of history entries, contextually shown options, or a contextually named \"Undo <action>\" label; Explorer has all these things)\n\nconst MENU_DIVIDER = \"MENU_DIVIDER\";\n\nconst MAX_MENU_NESTING = 1000;\n\n/** @type {HTMLElement | null} */\nlet last_focus_outside_menus = null;\nfunction track_focus() {\n\tif (\n\t\tdocument.activeElement &&\n\t\tdocument.activeElement.tagName !== \"BODY\" &&\n\t\tdocument.activeElement.tagName !== \"HTML\" &&\n\t\t!document.activeElement.closest(\".menus, .menu-popup\")\n\t) {\n\t\tlast_focus_outside_menus = /** @type {HTMLElement} */(document.activeElement);\n\t}\n}\nif (typeof window !== \"undefined\") {\n\twindow.addEventListener(\"focusin\", track_focus);\n\twindow.addEventListener(\"focusout\", track_focus);\n}\n\nlet internal_z_counter = 1;\nfunction get_new_menu_z_index() {\n\t// integrate with the OS window z-indexes, if applicable\n\t// but don't depend on $Window existing, the modules should be independent\n\tif (typeof $Window !== \"undefined\") {\n\t\treturn ($Window.Z_INDEX++) + MAX_MENU_NESTING; // MAX_MENU_NESTING is needed because the window gets brought to the top\n\t}\n\treturn (++internal_z_counter) + MAX_MENU_NESTING;\n}\n\n/**\n * @param {OSGUITopLevelMenus} menus\n * @constructor\n */\nfunction MenuBar(menus) {\n\tif (!(this instanceof MenuBar)) {\n\t\treturn new MenuBar(menus);\n\t}\n\n\tconst menus_el = E(\"div\", {\n\t\tclass: \"menus\",\n\t\trole: \"menubar\",\n\t\t\"aria-label\": \"Application Menu\",\n\t});\n\tmenus_el.style.touchAction = \"none\";\n\n\t/**\n\t * @returns {\"ltr\" | \"rtl\"} writing/layout direction\n\t */\n\tfunction get_direction() {\n\t\treturn window.get_direction ? window.get_direction() : /** @type {\"ltr\" | \"rtl\"} */(getComputedStyle(menus_el).direction);\n\t}\n\n\tlet selecting_menus = false; // state where you can glide between menus without clicking\n\n\t/**\n\t * @type {{\n\t *\t\tmenu_button_el: HTMLElement,\n\t *\t\tmenu_popup_el: HTMLElement,\n\t *\t\tmenus_key: string,\n\t *\t\taccess_key: string | null,\n\t *\t\topen_top_level_menu: (source: \"click\" | \"keydown\") => void,\n\t *\t}[]}\n\t */\n\tconst top_level_menus = [];\n\t/** index of the top level menu that's most recently open, or highlighted */\n\tlet top_level_menu_index = -1;\n\t/** most nested open MenuPopup\n\t * @type {MenuPopup | undefined} */\n\tlet active_menu_popup;\n\n\t// There can be multiple menu bars instantiated from the same menu definitions,\n\t// so this can't be a map of menu item to submenu, it has to be of menu item ELEMENTS to submenu.\n\t// (or you know, it could work totally differently, this is just one way to do it)\n\t/** This is for entering submenus.\n\t * @type {WeakMap<HTMLElement, MenuPopup>} */\n\tconst submenu_popup_by_menu_item_el = new WeakMap();\n\n\t/** This is for exiting submenus.\n\t * @type {WeakMap<HTMLElement, HTMLElement>} */\n\tconst parent_item_el_by_popup_el = new WeakMap();\n\n\tconst close_menus = () => {\n\t\tfor (const { menu_button_el } of top_level_menus) {\n\t\t\tif (menu_button_el.getAttribute(\"aria-expanded\") === \"true\") {\n\t\t\t\tmenu_button_el.dispatchEvent(new CustomEvent(\"release\", {}));\n\t\t\t}\n\t\t}\n\t};\n\n\tconst refocus_outside_menus = () => {\n\t\tif (last_focus_outside_menus) {\n\t\t\tlast_focus_outside_menus.focus();\n\t\t\t// in case element was removed from DOM, or became unfocusable,\n\t\t\t// we should fallback to focusing the containing window\n\t\t\tif (document.activeElement === last_focus_outside_menus) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tconst window_el = menus_el.closest(\".window\");\n\t\tif (window_el) {\n\t\t\t// This will refocus the last focused element in the window,\n\t\t\t// or the first control in the window if there was no last focused element.\n\t\t\twindow_el.dispatchEvent(new CustomEvent(\"refocus-window\"));\n\t\t}\n\t};\n\n\t/** @param {number | string} new_index_or_menu_key */\n\tconst top_level_highlight = (new_index_or_menu_key) => {\n\t\tconst new_index = typeof new_index_or_menu_key === \"string\" ?\n\t\t\tObject.keys(menus).indexOf(new_index_or_menu_key) :\n\t\t\tnew_index_or_menu_key;\n\t\tif (top_level_menu_index !== -1 && top_level_menu_index !== new_index) {\n\t\t\ttop_level_menus[top_level_menu_index].menu_button_el.classList.remove(\"highlight\");\n\t\t\t// closing the menu is handled externally\n\t\t}\n\t\tif (new_index !== -1) {\n\t\t\ttop_level_menus[new_index].menu_button_el.classList.add(\"highlight\");\n\t\t}\n\t\ttop_level_menu_index = new_index;\n\t};\n\tmenus_el.addEventListener(\"pointerleave\", () => {\n\t\t// unhighlight unless a menu is open\n\t\tif (\n\t\t\ttop_level_menu_index !== -1 &&\n\t\t\ttop_level_menus[top_level_menu_index].menu_popup_el.style.display === \"none\"\n\t\t) {\n\t\t\ttop_level_highlight(-1);\n\t\t}\n\t});\n\n\t/** @param {OSGUIMenuItem} item */\n\tconst is_disabled = item => {\n\t\tif (typeof item.enabled === \"function\") {\n\t\t\treturn !item.enabled();\n\t\t} else if (typeof item.enabled === \"boolean\") {\n\t\t\treturn !item.enabled;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t/** @param {OSGUIMenuItem} [item] */\n\tfunction send_info_event(item) {\n\t\t// @TODO: in a future version, give the whole menu item definition (or null)\n\t\tconst description = item?.description || \"\";\n\t\tif (typeof jQuery !== \"undefined\") {\n\t\t\t// old API (using jQuery's \"extraParameters\"), made forwards compatible with new API (event.detail)\n\t\t\tconst event = new jQuery.Event(\"info\", { detail: { description } });\n\t\t\tconst extraParam = {\n\t\t\t\ttoString() {\n\t\t\t\t\tconsole.warn(\"jQuery extra parameter for info event is deprecated, use event.detail instead\");\n\t\t\t\t\treturn description;\n\t\t\t\t},\n\t\t\t};\n\t\t\tjQuery(menus_el).trigger(event, extraParam);\n\t\t} else {\n\t\t\tmenus_el.dispatchEvent(new CustomEvent(\"info\", { detail: { description } }));\n\t\t}\n\t}\n\n\n\t/**\n\t * attached to menu bar and floating popups (which are not descendants of the menu bar)\n\t * @param {KeyboardEvent} e\n\t */\n\tfunction handleKeyDown(e) {\n\t\tif (e.defaultPrevented) {\n\t\t\treturn;\n\t\t}\n\t\tconst active_menu_popup_el = active_menu_popup?.element;\n\t\tconst top_level_menu = top_level_menus[top_level_menu_index];\n\t\tconst { menu_button_el, open_top_level_menu } = top_level_menu || {};\n\t\tconst menu_popup_el = active_menu_popup_el || top_level_menu?.menu_popup_el;\n\t\tconst parent_item_el = active_menu_popup_el ? parent_item_el_by_popup_el.get(active_menu_popup_el) : undefined;\n\t\tconst highlighted_item_el = menu_popup_el?.querySelector(\".menu-item.highlight\");\n\t\tif (highlighted_item_el && !(highlighted_item_el instanceof HTMLElement)) {\n\t\t\t// type narrowing; should never happen; could use querySelector<HTMLElement>() instead if switching to TypeScript\n\t\t\tthrow new Error(\"Unexpected type for highlighted item element\");\n\t\t}\n\n\t\t// console.log(\"keydown\", e.key, { target: e.target, active_menu_popup_el, top_level_menu, menu_popup_el, parent_item_el, highlighted_item_el });\n\n\t\tswitch (e.key) {\n\t\t\tcase \"ArrowLeft\":\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tconst right = e.key === \"ArrowRight\";\n\t\t\t\tif (\n\t\t\t\t\thighlighted_item_el?.matches(\".has-submenu:not([aria-disabled='true'])\") &&\n\t\t\t\t\t(get_direction() === \"ltr\") === right\n\t\t\t\t) {\n\t\t\t\t\t// enter submenu\n\t\t\t\t\thighlighted_item_el.click();\n\t\t\t\t\te.preventDefault();\n\t\t\t\t} else if (\n\t\t\t\t\tactive_menu_popup &&\n\t\t\t\t\tactive_menu_popup.parentMenuPopup && // left/right doesn't make sense to close the top level menu\n\t\t\t\t\t(get_direction() === \"ltr\") !== right\n\t\t\t\t) {\n\t\t\t\t\t// exit submenu\n\t\t\t\t\tactive_menu_popup.close(true); // This changes the active_menu_popup_el to the parent menu!\n\t\t\t\t\tparent_item_el.setAttribute(\"aria-expanded\", \"false\");\n\t\t\t\t\tsend_info_event(active_menu_popup.menuItems[active_menu_popup.itemElements.indexOf(parent_item_el)]);\n\t\t\t\t\te.preventDefault();\n\t\t\t\t} else if (\n\t\t\t\t\t// basically any case except if you hover to open a submenu and then press right/left\n\t\t\t\t\t// in which case the menu is already open/focused\n\t\t\t\t\t// This is mimicking the behavior of Explorer's menus; most Windows 98 apps work differently; @TODO: make this configurable\n\t\t\t\t\thighlighted_item_el ||\n\t\t\t\t\t!active_menu_popup ||\n\t\t\t\t\t!active_menu_popup.parentMenuPopup\n\t\t\t\t) {\n\t\t\t\t\t// go to next/previous top level menu, wrapping around\n\t\t\t\t\t// and open a new menu only if a menu was already open\n\t\t\t\t\tconst menu_was_open = menu_popup_el && menu_popup_el.style.display !== \"none\";\n\t\t\t\t\tconst cycle_dir = ((get_direction() === \"ltr\") === right) ? 1 : -1;\n\t\t\t\t\tlet new_index;\n\t\t\t\t\tif (top_level_menu_index === -1) {\n\t\t\t\t\t\tnew_index = cycle_dir === 1 ? 0 : top_level_menus.length - 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnew_index = (top_level_menu_index + cycle_dir + top_level_menus.length) % top_level_menus.length;\n\t\t\t\t\t}\n\t\t\t\t\tconst new_top_level_menu = top_level_menus[new_index];\n\t\t\t\t\tconst target_button_el = new_top_level_menu.menu_button_el;\n\t\t\t\t\tif (menu_was_open) {\n\t\t\t\t\t\tnew_top_level_menu.open_top_level_menu(\"keydown\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmenu_button_el?.dispatchEvent(new CustomEvent(\"release\", {}));\n\t\t\t\t\t\ttarget_button_el.focus({ preventScroll: true });\n\t\t\t\t\t\t// Note case where menu is closed, menu button is hovered, then menu bar is unhovered,\n\t\t\t\t\t\t// rehovered (outside any buttons), and unhovered, and THEN you try to go to the next menu.\n\t\t\t\t\t\ttop_level_highlight(new_index);\n\t\t\t\t\t}\n\t\t\t\t\te.preventDefault();\n\t\t\t\t} // else:\n\t\t\t\t// if there's no highlighted item, the user may be expecting to enter the menu even though it's already open,\n\t\t\t\t// so it makes sense to do nothing (as Windows 98 does) and not go to the next/previous menu\n\t\t\t\t// (although highlighting the first item might be nicer...)\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tconst down = e.key === \"ArrowDown\";\n\t\t\t\t// if (menu_popup_el && menu_popup_el.style.display !== \"none\") && highlighted_item_el) {\n\t\t\t\tif (active_menu_popup) {\n\t\t\t\t\tconst cycle_dir = down ? 1 : -1;\n\t\t\t\t\tconst item_els = /** @type {HTMLElement[]} */([...menu_popup_el.querySelectorAll(\".menu-item\")]);\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tconst from_index = item_els.indexOf(highlighted_item_el);\n\t\t\t\t\tlet to_index = (from_index + cycle_dir + item_els.length) % item_els.length;\n\t\t\t\t\tif (from_index === -1) {\n\t\t\t\t\t\tif (down) {\n\t\t\t\t\t\t\tto_index = 0;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tto_index = item_els.length - 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// more fun way to do it:\n\t\t\t\t\t// const to_index = (Math.max(from_index, -down) + cycle_dir + item_els.length) % item_els.length;\n\n\t\t\t\t\tconst to_item_el = item_els[to_index];\n\t\t\t\t\t// active_menu_popup.highlight(to_index); // wouldn't work because to_index doesn't count separators\n\t\t\t\t\tactive_menu_popup.highlight(to_item_el);\n\t\t\t\t\tsend_info_event(active_menu_popup.menuItems[active_menu_popup.itemElements.indexOf(to_item_el)]);\n\t\t\t\t\te.preventDefault();\n\t\t\t\t} else {\n\t\t\t\t\topen_top_level_menu?.(\"keydown\");\n\t\t\t\t}\n\t\t\t\te.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase \"Escape\":\n\t\t\t\tif (active_menu_popup) {\n\t\t\t\t\t// (@TODO: doesn't parent_item_el always exist?)\n\t\t\t\t\tif (parent_item_el && parent_item_el !== menu_button_el) {\n\t\t\t\t\t\t// exit submenu (@TODO: DRY further by moving more logic into close()?)\n\t\t\t\t\t\tactive_menu_popup.close(true); // This changes the active_menu_popup to the parent menu!\n\t\t\t\t\t\tparent_item_el.setAttribute(\"aria-expanded\", \"false\");\n\t\t\t\t\t\tsend_info_event(active_menu_popup.menuItems[active_menu_popup.itemElements.indexOf(parent_item_el)]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// exit top level menu\n\t\t\t\t\t\t// close_menus takes care of releasing the pressed state of the button as well\n\t\t\t\t\t\tclose_menus();\n\t\t\t\t\t\tmenu_button_el.focus({ preventScroll: true });\n\t\t\t\t\t}\n\t\t\t\t\te.preventDefault();\n\t\t\t\t} else {\n\t\t\t\t\tconst window_el = menus_el.closest(\".window\");\n\t\t\t\t\tif (window_el) {\n\t\t\t\t\t\t// refocus last focused control in window\n\t\t\t\t\t\t// refocus-window should never focus the menu bar\n\t\t\t\t\t\t// it stores the last focused control in the window and specifically not in the menus\n\t\t\t\t\t\twindow_el.dispatchEvent(new CustomEvent(\"refocus-window\"));\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"Alt\":\n\t\t\t\t// close all menus and refocus the last focused control in the window\n\t\t\t\tclose_menus();\n\t\t\t\trefocus_outside_menus();\n\t\t\t\te.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase \"Space\":\n\t\t\t\t// opens system menu in Windows 98\n\t\t\t\t// (at top level)\n\t\t\t\tbreak;\n\t\t\tcase \"Enter\":\n\t\t\t\tif (menu_button_el === document.activeElement) {\n\t\t\t\t\topen_top_level_menu(\"keydown\");\n\t\t\t\t\te.preventDefault();\n\t\t\t\t} else {\n\t\t\t\t\thighlighted_item_el?.click();\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif (e.ctrlKey || e.metaKey) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// handle access keys and first-letter navigation\n\t\t\t\tconst key = e.key.toLowerCase();\n\t\t\t\tconst item_els = active_menu_popup ?\n\t\t\t\t\t[...menu_popup_el.querySelectorAll(\".menu-item\")] :\n\t\t\t\t\ttop_level_menus.map(top_level_menu => top_level_menu.menu_button_el);\n\t\t\t\tconst item_els_by_access_key = {};\n\t\t\t\tfor (const item_el of item_els) {\n\t\t\t\t\tconst access_key_el = item_el.querySelector(\".menu-hotkey\");\n\t\t\t\t\tconst access_key = (access_key_el ?\n\t\t\t\t\t\taccess_key_el.textContent :\n\t\t\t\t\t\t(item_el.querySelector(\".menu-item-label\") ?? item_el).textContent[0]\n\t\t\t\t\t).toLowerCase();\n\t\t\t\t\titem_els_by_access_key[access_key] = item_els_by_access_key[access_key] || [];\n\t\t\t\t\titem_els_by_access_key[access_key].push(item_el);\n\t\t\t\t}\n\t\t\t\tconst matching_item_els = item_els_by_access_key[key] || [];\n\t\t\t\t// console.log({ key, item_els, item_els_by_access_key, matching_item_els });\n\t\t\t\tif (matching_item_els.length) {\n\t\t\t\t\tif (matching_item_els.length === 1) {\n\t\t\t\t\t\t// it's not ambiguous, so go ahead and activate it\n\t\t\t\t\t\tconst menu_item_el = matching_item_els[0];\n\t\t\t\t\t\t// click() doesn't work for menu buttons at the moment,\n\t\t\t\t\t\t// and also we want to highlight the first item in the menu\n\t\t\t\t\t\t// in that case, which doesn't happen with the mouse\n\t\t\t\t\t\tconst top_level_menu = top_level_menus.find(top_level_menu => top_level_menu.menu_button_el === menu_item_el);\n\t\t\t\t\t\tif (top_level_menu) {\n\t\t\t\t\t\t\ttop_level_menu.open_top_level_menu(\"keydown\");\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmenu_item_el.click();\n\t\t\t\t\t\t}\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// cycle the menu items that match the key\n\t\t\t\t\t\tlet index = matching_item_els.indexOf(highlighted_item_el);\n\t\t\t\t\t\tif (index === -1) {\n\t\t\t\t\t\t\tindex = 0;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tindex = (index + 1) % matching_item_els.length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst menu_item_el = matching_item_els[index];\n\t\t\t\t\t\t// active_menu_popup.highlight(index); // would very much not work\n\t\t\t\t\t\tactive_menu_popup.highlight(menu_item_el);\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tmenus_el.addEventListener(\"keydown\", handleKeyDown);\n\n\t// TODO: expose API for context menus (i.e. floating menu popups)\n\t/**\n\t * A floating menu popup.\n\t * @param {OSGUIMenuFragment[]} menu_items \n\t * @param {{ parentMenuPopup?: MenuPopup }} [options]\n\t */\n\tfunction MenuPopup(menu_items, { parentMenuPopup } = {}) {\n\t\tthis.parentMenuPopup = parentMenuPopup;\n\t\tthis.menuItems = menu_items;\n\t\t/** one-to-one with menuItems\n\t\t * @type {HTMLElement[]} */\n\t\tthis.itemElements = [];\n\t\t// @TODO: unify terminology: separators are in itemElements but don't have class .menu-item; are they menu items?\n\n\t\tconst menu_popup_el = E(\"div\", {\n\t\t\tclass: \"menu-popup\",\n\t\t\tid: `menu-popup-${uid()}`,\n\t\t\ttabIndex: \"-1\",\n\t\t\trole: \"menu\",\n\t\t});\n\t\tmenu_popup_el.style.touchAction = \"pan-y\"; // allow for scrolling overflowing menus (in the future), but prevent event delay and double tap to zoom\n\t\tmenu_popup_el.style.outline = \"none\";\n\t\tconst menu_popup_table_el = E(\"table\", { class: \"menu-popup-table\", role: \"presentation\" });\n\t\tmenu_popup_el.appendChild(menu_popup_table_el);\n\n\t\tthis.element = menu_popup_el;\n\n\t\t/**\n\t\t * @type {{\n\t\t * \titem_el: HTMLElement,\n\t\t * \tsubmenu_popup_el: HTMLElement,\n\t\t * \tsubmenu_popup: MenuPopup,\n\t\t * }[]}\n\t\t */\n\t\tlet submenus = [];\n\n\t\tmenu_popup_el.addEventListener(\"keydown\", handleKeyDown);\n\n\t\tmenu_popup_el.addEventListener(\"pointerleave\", () => {\n\t\t\t// If there's a submenu popup, highlight the item for that, otherwise nothing.\n\n\t\t\t// (could querySelector on aria-expanded instead of looping here, alternatively)\n\t\t\tfor (const submenu of submenus) {\n\t\t\t\tif (submenu.submenu_popup_el.style.display !== \"none\") {\n\t\t\t\t\tthis.highlight(submenu.item_el);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.highlight(-1);\n\t\t});\n\n\t\tmenu_popup_el.addEventListener(\"focusin\", (e) => {\n\t\t\t// Prevent focus going to menu items. As designed, it works with aria-activedescendant and focus on the menu popup itself.\n\t\t\t// (on desktop when clicking (and dragging out) then pressing a key, or on mobile when tapping, a focus ring was visible,\n\t\t\t// and it wouldn't go away with keyboard navigation either (because it was only changing aria-activedescendant presumably?))\n\t\t\tmenu_popup_el.focus({ preventScroll: true });\n\t\t});\n\n\t\t/** @type {HTMLElement | null} */\n\t\tlet last_item_el;\n\t\t/** @param {number | HTMLElement} index_or_element */\n\t\tthis.highlight = (index_or_element) => { // index includes separators\n\t\t\tlet item_el;\n\t\t\tif (typeof index_or_element === \"number\") {\n\t\t\t\titem_el = this.itemElements[index_or_element];\n\t\t\t} else {\n\t\t\t\titem_el = index_or_element;\n\t\t\t}\n\t\t\tif (last_item_el && last_item_el !== item_el) {\n\t\t\t\tlast_item_el.classList.remove(\"highlight\");\n\t\t\t}\n\t\t\tif (item_el) {\n\t\t\t\titem_el.classList.add(\"highlight\");\n\t\t\t\tmenu_popup_el.setAttribute(\"aria-activedescendant\", item_el.id);\n\t\t\t\tlast_item_el = item_el;\n\t\t\t} else {\n\t\t\t\tmenu_popup_el.removeAttribute(\"aria-activedescendant\");\n\t\t\t\tlast_item_el = null;\n\t\t\t}\n\t\t};\n\n\t\tthis.close = (focus_parent_menu_popup = true) => { // Note: won't focus menu bar buttons.\n\t\t\t// idempotent\n\t\t\tfor (const submenu of submenus) {\n\t\t\t\tsubmenu.submenu_popup.close(false);\n\t\t\t}\n\t\t\tif (focus_parent_menu_popup) {\n\t\t\t\tthis.parentMenuPopup?.element.focus({ preventScroll: true });\n\t\t\t}\n\t\t\tmenu_popup_el.style.display = \"none\";\n\t\t\tthis.highlight(-1);\n\t\t\t// after closing submenus, which should move the active_menu_popup to this level, move it up to the parent level\n\t\t\tif (active_menu_popup === this) {\n\t\t\t\tactive_menu_popup = this.parentMenuPopup;\n\t\t\t}\n\t\t};\n\n\t\t/**\n\t\t * @param {HTMLElement} parent_element \n\t\t * @param {OSGUIMenuItem | \"MENU_DIVIDER\"} item \n\t\t * @param {number} item_index \n\t\t */\n\t\tconst add_menu_item = (parent_element, item, item_index) => {\n\t\t\tconst row_el = E(\"tr\", { class: \"menu-row\" });\n\t\t\tthis.itemElements.push(row_el);\n\t\t\tparent_element.appendChild(row_el);\n\t\t\tif (item === MENU_DIVIDER) {\n\t\t\t\tconst td_el = E(\"td\", { colspan: \"4\" });\n\t\t\t\tconst hr_el = E(\"hr\", { class: \"menu-hr\" });\n\t\t\t\t// hr_el.setAttribute(\"role\", \"separator\"); // this is the implicit ARIA role for <hr>\n\t\t\t\t// and setting it on the <tr> might cause problems due to multiple elements with the role\n\t\t\t\t// hopefully it's fine that the semantic <hr> is nested?\n\t\t\t\ttd_el.appendChild(hr_el);\n\t\t\t\trow_el.appendChild(td_el);\n\t\t\t\t// Favorites menu behavior:\n\t\t\t\t// hr_el.addEventListener(\"click\", () => {\n\t\t\t\t// \tthis.highlight(-1);\n\t\t\t\t// });\n\t\t\t\t// Normal menu behavior:\n\t\t\t\thr_el.addEventListener(\"pointerenter\", () => {\n\t\t\t\t\tthis.highlight(-1);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst item_el = row_el;\n\t\t\t\titem_el.classList.add(\"menu-item\");\n\t\t\t\titem_el.id = `menu-item-${uid()}`;\n\t\t\t\titem_el.tabIndex = -1; // may be needed for aria-activedescendant in some browsers?\n\t\t\t\titem_el.setAttribute(\"role\", item.checkbox ? item.checkbox.type === \"radio\" ? \"menuitemradio\" : \"menuitemcheckbox\" : \"menuitem\");\n\t\t\t\t// By default a screen reader will read the label of the menu item and its shortcut.\n\t\t\t\t// The shortcut is noisy (albeit potentially useful), so I'm disabling it to match system behavior (at least with Orca).\n\t\t\t\t// The access key is not read if it's part of a word like \"&New\", as it's just an underlined letter,\n\t\t\t\t// but it is read in translated labels like \"새로 만들기 (&N)\".\n\t\t\t\t// The AccessKeys.toText() is so it doesn't announce an ampersand from the access key.\n\t\t\t\tif (item.label || item.item) {\n\t\t\t\t\t// deprecation notice for item.item is handled below, don't need to duplicate the warning\n\t\t\t\t\titem_el.setAttribute(\"aria-label\", AccessKeys.toText(item.label || item.item));\n\t\t\t\t}\n\t\t\t\t// Include the shortcut semantically.\n\t\t\t\t// TODO: automatically include the access key, while the specific menu (or menu bar) is focused, and update docs to note this\n\t\t\t\titem_el.setAttribute(\"aria-keyshortcuts\", item.ariaKeyShortcuts || \"\");\n\n\t\t\t\tif (item.description) {\n\t\t\t\t\titem_el.setAttribute(\"aria-description\", item.description);\n\t\t\t\t}\n\t\t\t\tconst checkbox_area_el = E(\"td\", { class: \"menu-item-checkbox-area\" });\n\t\t\t\tconst label_el = E(\"td\", { class: \"menu-item-label\" });\n\t\t\t\tconst shortcut_el = E(\"td\", { class: \"menu-item-shortcut\" });\n\t\t\t\tconst submenu_area_el = E(\"td\", { class: \"menu-item-submenu-area\" });\n\n\t\t\t\titem_el.appendChild(checkbox_area_el);\n\t\t\t\titem_el.appendChild(label_el);\n\t\t\t\titem_el.appendChild(shortcut_el);\n\t\t\t\titem_el.appendChild(submenu_area_el);\n\n\t\t\t\tif (item.label) {\n\t\t\t\t\tlabel_el.appendChild(AccessKeys.toFragment(item.label));\n\t\t\t\t} else if (item.item) {\n\t\t\t\t\t// I originally called it `item` because it's not \"just\" a label (it defines the access key, and also IDs),\n\t\t\t\t\t// but `item` is a kinda wacky name (an \"item's item\" doesn't make sense)\n\t\t\t\t\tlabel_el.appendChild(AccessKeys.toFragment(item.item));\n\t\t\t\t\tconsole.warn(\"Menu item option `item` is deprecated; use `label` instead.\");\n\t\t\t\t}\n\n\t\t\t\tif (item.shortcutLabel) {\n\t\t\t\t\tshortcut_el.textContent = item.shortcutLabel;\n\t\t\t\t} else if (item.shortcut) {\n\t\t\t\t\tshortcut_el.textContent = item.shortcut;\n\t\t\t\t\tconsole.warn(\"Menu item option `shortcut` is deprecated; use `shortcutLabel` instead (and ideally provide `ariaKeyShortcuts` as well)\");\n\t\t\t\t}\n\n\t\t\t\tmenu_popup_el.addEventListener(\"update\", () => {\n\t\t\t\t\t// item_el.disabled = is_disabled(item); // doesn't work, probably because it's a <tr>\n\t\t\t\t\tif (is_disabled(item)) {\n\t\t\t\t\t\titem_el.setAttribute(\"disabled\", \"\");\n\t\t\t\t\t\titem_el.setAttribute(\"aria-disabled\", \"true\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\titem_el.removeAttribute(\"disabled\");\n\t\t\t\t\t\titem_el.removeAttribute(\"aria-disabled\");\n\t\t\t\t\t}\n\t\t\t\t\tif (item.checkbox && item.checkbox.check) {\n\t\t\t\t\t\tconst checked = item.checkbox.check();\n\t\t\t\t\t\titem_el.setAttribute(\"aria-checked\", checked ? \"true\" : \"false\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// Why not call `send_info_event` in `highlight`?\n\t\t\t\t// Consider the case where you hover to open a submenu: it highlights nothing,\n\t\t\t\t// but it shouldn't reset the status bar.\n\t\t\t\t// So it needs to be more directly based on the pointer and keyboard interactions.\n\t\t\t\t// *Maybe* it could be a parameter (to `highlight`) if that's really helpful, but it's probably not.\n\t\t\t\t// *Maybe* it could look at more of the overall state within `highlight`,\n\t\t\t\t// but could it distinguish hovering an outer vs an inner item if two are highlighted?\n\t\t\t\titem_el.addEventListener(\"pointerenter\", () => {\n\t\t\t\t\tthis.highlight(item_index);\n\t\t\t\t\tsend_info_event(item);\n\t\t\t\t});\n\t\t\t\titem_el.addEventListener(\"pointerleave\", (event) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tmenu_popup_el.style.display !== \"none\" && // pointer hasn't \"left\" due to closing\n\t\t\t\t\t\tevent.pointerType !== \"touch\" // pointer hasn't \"left\" as in finger lifting off\n\t\t\t\t\t) {\n\t\t\t\t\t\tsend_info_event();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (item.checkbox?.type === \"radio\") {\n\t\t\t\t\tcheckbox_area_el.classList.add(\"radio\");\n\t\t\t\t} else if (item.checkbox) {\n\t\t\t\t\tcheckbox_area_el.classList.add(\"checkbox\");\n\t\t\t\t}\n\n\t\t\t\t/** @type {(highlight_first?: boolean) => void} */\n\t\t\t\tlet open_submenu;\n\t\t\t\t/** @type {HTMLDivElement} */\n\t\t\t\tlet submenu_popup_el;\n\t\t\t\tif (item.submenu) {\n\t\t\t\t\titem_el.classList.add(\"has-submenu\"); // @TODO: remove this, and use [aria-haspopup] instead (note true = menu)\n\t\t\t\t\tsubmenu_area_el.classList.toggle(\"point-right\", get_direction() === \"rtl\");\n\n\t\t\t\t\tconst submenu_popup = new MenuPopup(item.submenu, { parentMenuPopup: this });\n\t\t\t\t\tsubmenu_popup_el = submenu_popup.element;\n\t\t\t\t\tdocument.body?.appendChild(submenu_popup_el);\n\t\t\t\t\tsubmenu_popup_el.style.display = \"none\";\n\n\t\t\t\t\titem_el.setAttribute(\"aria-haspopup\", \"true\");\n\t\t\t\t\titem_el.setAttribute(\"aria-expanded\", \"false\");\n\t\t\t\t\titem_el.setAttribute(\"aria-controls\", submenu_popup_el.id);\n\n\t\t\t\t\tsubmenu_popup_by_menu_item_el.set(item_el, submenu_popup);\n\t\t\t\t\tparent_item_el_by_popup_el.set(submenu_popup_el, item_el);\n\t\t\t\t\tsubmenu_popup_el.dataset.semanticParent = menu_popup_el.id; // for $Window to understand the popup belongs to its window\n\t\t\t\t\tmenu_popup_el.setAttribute(\"aria-owns\", `${menu_popup_el.getAttribute(\"aria-owns\") || \"\"} ${submenu_popup_el.id}`);\n\t\t\t\t\tsubmenu_popup_el.setAttribute(\"aria-labelledby\", item_el.id);\n\n\n\t\t\t\t\topen_submenu = (highlight_first = true) => {\n\t\t\t\t\t\tif (submenu_popup_el.style.display !== \"none\") {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (item_el.getAttribute(\"aria-disabled\") === \"true\") {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclose_submenus_at_this_level();\n\n\t\t\t\t\t\titem_el.setAttribute(\"aria-expanded\", \"true\");\n\n\t\t\t\t\t\tsubmenu_popup_el.style.display = \"\";\n\t\t\t\t\t\tsubmenu_popup_el.style.zIndex = `${get_new_menu_z_index()}`;\n\t\t\t\t\t\tsubmenu_popup_el.setAttribute(\"dir\", get_direction());\n\t\t\t\t\t\tif (window.inheritTheme) {\n\t\t\t\t\t\t\twindow.inheritTheme(submenu_popup_el, menu_popup_el);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!submenu_popup_el.parentElement) {\n\t\t\t\t\t\t\tdocument.body.appendChild(submenu_popup_el);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// console.log(\"open_submenu — submenu_popup_el.style.zIndex\", submenu_popup_el.style.zIndex, \"$Window.Z_INDEX\", $Window.Z_INDEX, \"menus_el.closest('.window').style.zIndex\", menus_el.closest(\".window\").style.zIndex);\n\t\t\t\t\t\t// setTimeout(() => { console.log(\"after timeout, menus_el.closest('.window').style.zIndex\", menus_el.closest(\".window\").style.zIndex); }, 0);\n\t\t\t\t\t\tsubmenu_popup_el.dispatchEvent(new CustomEvent(\"update\", {}));\n\t\t\t\t\t\tif (highlight_first) {\n\t\t\t\t\t\t\tsubmenu_popup.highlight(0);\n\t\t\t\t\t\t\tsend_info_event(submenu_popup.menuItems[0]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsubmenu_popup.highlight(-1);\n\t\t\t\t\t\t\t// send_info_event(); // no, keep the status bar text!\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst rect = item_el.getBoundingClientRect();\n\t\t\t\t\t\tlet submenu_popup_rect = submenu_popup_el.getBoundingClientRect();\n\t\t\t\t\t\tsubmenu_popup_el.style.position = \"absolute\";\n\t\t\t\t\t\tsubmenu_popup_el.style.left = `${(get_direction() === \"rtl\" ? rect.left - submenu_popup_rect.width : rect.right) + window.scrollX}px`;\n\t\t\t\t\t\tsubmenu_popup_el.style.top = `${rect.top + window.scrollY}px`;\n\n\t\t\t\t\t\tsubmenu_popup_rect = submenu_popup_el.getBoundingClientRect();\n\t\t\t\t\t\t// This is surely not the cleanest way of doing this,\n\t\t\t\t\t\t// and the logic is not very robust in the first place,\n\t\t\t\t\t\t// but I want to get RTL support done and so I'm mirroring this in the simplest way possible.\n\t\t\t\t\t\tif (get_direction() === \"rtl\") {\n\t\t\t\t\t\t\tif (submenu_popup_rect.left < 0) {\n\t\t\t\t\t\t\t\tsubmenu_popup_el.style.left = `${rect.right}px`;\n\t\t\t\t\t\t\t\tsubmenu_popup_rect = submenu_popup_el.getBoundingClientRect();\n\t\t\t\t\t\t\t\tif (submenu_popup_rect.right > innerWidth) {\n\t\t\t\t\t\t\t\t\tsubmenu_popup_el.style.left = `${innerWidth - submenu_popup_rect.width}px`;\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 {\n\t\t\t\t\t\t\tif (submenu_popup_rect.right > innerWidth) {\n\t\t\t\t\t\t\t\tsubmenu_popup_el.style.left = `${rect.left - submenu_popup_rect.width}px`;\n\t\t\t\t\t\t\t\tsubmenu_popup_rect = submenu_popup_el.getBoundingClientRect();\n\t\t\t\t\t\t\t\tif (submenu_popup_rect.left < 0) {\n\t\t\t\t\t\t\t\t\tsubmenu_popup_el.style.left = \"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\n\t\t\t\t\t\tsubmenu_popup_el.focus({ preventScroll: true });\n\t\t\t\t\t\tactive_menu_popup = submenu_popup;\n\t\t\t\t\t};\n\n\t\t\t\t\tsubmenus.push({\n\t\t\t\t\t\titem_el,\n\t\t\t\t\t\tsubmenu_popup_el,\n\t\t\t\t\t\tsubmenu_popup,\n\t\t\t\t\t});\n\n\t\t\t\t\tfunction close_submenus_at_this_level() {\n\t\t\t\t\t\tfor (const { submenu_popup, item_el } of submenus) {\n\t\t\t\t\t\t\tsubmenu_popup.close(false);\n\t\t\t\t\t\t\titem_el.setAttribute(\"aria-expanded\", \"false\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmenu_popup_el.focus({ preventScroll: true });\n\t\t\t\t\t}\n\n\t\t\t\t\t// It should close when hovering a different higher level menu\n\t\t\t\t\t// after a delay, unless the mouse returns to the submenu.\n\t\t\t\t\t// If you return the mouse from a submenu into its parent\n\t\t\t\t\t// *directly onto the parent menu item*, it stays open, but if you cross other menu items\n\t\t\t\t\t// in the parent menu, (@TODO:) it'll close after the delay even if you land on the parent menu item.\n\t\t\t\t\t// Once a submenu opens (completing its animation if it has one),\n\t\t\t\t\t// - up/down should navigate the submenu (although it should not show as focused right away)\n\t\t\t\t\t//   (i.e. up/down always navigate the most-nested open submenu, as long as it's not animating, in which case nothing happens)\n\t\t\t\t\t// - @TODO: the submenu cancels its closing timeout (if you've moved outside all menus, say)\n\t\t\t\t\t//   (but if you move outside menus AFTER the submenu has opened, it should start the closing timeout)\n\t\t\t\t\t// @TODO: make this more robust in general! Make some automated tests.\n\n\t\t\t\t\t/** @type {number | null} */\n\t\t\t\t\tlet open_tid;\n\t\t\t\t\t/** @type {number | null} */\n\t\t\t\t\tlet close_tid;\n\t\t\t\t\tsubmenu_popup_el.addEventListener(\"pointerenter\", () => {\n\t\t\t\t\t\tif (open_tid) { clearTimeout(open_tid); open_tid = null; }\n\t\t\t\t\t\tif (close_tid) { clearTimeout(close_tid); close_tid = null; }\n\t\t\t\t\t});\n\t\t\t\t\titem_el.addEventListener(\"pointerenter\", () => {\n\t\t\t\t\t\t// @TODO: don't cancel close timer? in Windows 98 it'll still close after a delay if you hover the submenu's parent item\n\t\t\t\t\t\tif (open_tid) { clearTimeout(open_tid); open_tid = null; }\n\t\t\t\t\t\tif (close_tid) { clearTimeout(close_tid); close_tid = null; }\n\t\t\t\t\t\topen_tid = setTimeout(() => {\n\t\t\t\t\t\t\topen_submenu(false);\n\t\t\t\t\t\t}, 501); // @HACK: slightly longer than close timer so it doesn't close immediately\n\t\t\t\t\t});\n\t\t\t\t\titem_el.addEventListener(\"pointerleave\", () => {\n\t\t\t\t\t\tif (open_tid) { clearTimeout(open_tid); open_tid = null; }\n\t\t\t\t\t});\n\t\t\t\t\tmenu_popup_el.addEventListener(\"pointerenter\", (event) => {\n\t\t\t\t\t\t// console.log(event.target.closest(\".menu-item\"));\n\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\tif (event.target.closest(\".menu-item\") === item_el) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!close_tid) {\n\t\t\t\t\t\t\t// This is a little confusing, with timers per-item...\n\t\t\t\t\t\t\t// @TODO: try doing this with just one or two timers.\n\t\t\t\t\t\t\t// if (submenus.some(submenu => submenu.submenu_popup_el.style.display !== \"none\")) {\n\t\t\t\t\t\t\tif (submenu_popup_el.style.display !== \"none\") {\n\t\t\t\t\t\t\t\tclose_tid = setTimeout(() => {\n\t\t\t\t\t\t\t\t\tif (!window.debugKeepMenusOpen) {\n\t\t\t\t\t\t\t\t\t\t// close_submenu();\n\t\t\t\t\t\t\t\t\t\tclose_submenus_at_this_level();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}, 500);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t// keep submenu open while mouse is outside any parent menus\n\t\t\t\t\t// (@TODO: what if it goes to another parent menu though?)\n\t\t\t\t\tmenu_popup_el.addEventListener(\"pointerleave\", () => {\n\t\t\t\t\t\tif (close_tid) { clearTimeout(close_tid); close_tid = null; }\n\t\t\t\t\t});\n\n\t\t\t\t\titem_el.addEventListener(\"pointerdown\", () => { open_submenu(false); });\n\t\t\t\t}\n\n\t\t\t\tlet just_activated = false; // to prevent double-activation from pointerup + click\n\t\t\t\tconst item_action = () => {\n\t\t\t\t\tif (just_activated) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tjust_activated = true;\n\t\t\t\t\tsetTimeout(() => { just_activated = false; }, 10);\n\n\t\t\t\t\tif (item.checkbox) {\n\t\t\t\t\t\tif (item.checkbox.toggle) {\n\t\t\t\t\t\t\titem.checkbox.toggle();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmenu_popup_el.dispatchEvent(new CustomEvent(\"update\", {}));\n\t\t\t\t\t} else if (item.action) {\n\t\t\t\t\t\tclose_menus();\n\t\t\t\t\t\t// refocus_outside_menus is before action, so that things like copy/paste can work\n\t\t\t\t\t\t// (using the original focused textarea/input/etc.)\n\t\t\t\t\t\t// and so the action can focus things, like a new dialog box\n\t\t\t\t\t\trefocus_outside_menus();\n\t\t\t\t\t\titem.action();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t// pointerup is for gliding to menu items to activate\n\t\t\t\titem_el.addEventListener(\"pointerup\", e => {\n\t\t\t\t\tif (e.pointerType === \"mouse\" && e.button !== 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (e.pointerType === \"touch\") {\n\t\t\t\t\t\t// Will use click instead; otherwise focus is lost on a delay: if it opens a dialog for example,\n\t\t\t\t\t\t// you have to hold down on the menu item for a bit otherwise it'll blur the dialog after opening.\n\t\t\t\t\t\t// I think this is caused by the pointer falling through to elements without touch-action defined.\n\t\t\t\t\t\t// RIGHT NOW, gliding to menu items isn't supported for touch anyways,\n\t\t\t\t\t\t// although I'd like to support it in the future.\n\t\t\t\t\t\t// Well, it might have accessibility problems, so maybe not. I think this is fine.\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\titem_el.click();\n\t\t\t\t});\n\t\t\t\titem_el.addEventListener(\"click\", e => {\n\t\t\t\t\tif (item.submenu) {\n\t\t\t\t\t\topen_submenu(true);\n\t\t\t\t\t} else {\n\t\t\t\t\t\titem_action();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tif (menu_items.length === 0) {\n\t\t\tmenu_items = [{\n\t\t\t\tlabel: \"(Empty)\",\n\t\t\t\tenabled: false,\n\t\t\t}];\n\t\t}\n\t\tlet init_index = 0;\n\t\tfor (const item of menu_items) {\n\t\t\tif (typeof item === \"object\" && \"radioItems\" in item) {\n\t\t\t\tconst tbody = E(\"tbody\", { role: \"group\" }); // multiple tbody elements are allowed, can be used for grouping rows,\n\t\t\t\t// and in this case providing an ARIA role for the radio group.\n\t\t\t\tif (item.ariaLabel) {\n\t\t\t\t\ttbody.setAttribute(\"aria-label\", item.ariaLabel);\n\t\t\t\t}\n\n\t\t\t\tfor (const radio_item of item.radioItems) {\n\t\t\t\t\tradio_item.checkbox = {\n\t\t\t\t\t\ttype: \"radio\",\n\t\t\t\t\t\tcheck: () => radio_item.value === item.getValue(),\n\t\t\t\t\t\ttoggle: () => {\n\t\t\t\t\t\t\titem.setValue(radio_item.value);\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\tadd_menu_item(tbody, radio_item, init_index++);\n\t\t\t\t}\n\t\t\t\tmenu_popup_table_el.appendChild(tbody);\n\t\t\t} else {\n\t\t\t\tadd_menu_item(menu_popup_table_el, item, init_index++);\n\t\t\t}\n\t\t}\n\t}\n\n\t// let this_click_opened_the_menu = false;\n\tconst make_menu_button = (menus_key, menu_items) => {\n\t\tconst menu_button_el = E(\"div\", {\n\t\t\tclass: \"menu-button\",\n\t\t\t\"aria-expanded\": \"false\",\n\t\t\t\"aria-haspopup\": \"true\",\n\t\t\trole: \"menuitem\",\n\t\t});\n\n\t\tmenus_el.appendChild(menu_button_el);\n\n\t\tconst menu_popup = new MenuPopup(menu_items);\n\t\tconst menu_popup_el = menu_popup.element;\n\t\tdocument.body?.appendChild(menu_popup_el);\n\t\tsubmenu_popup_by_menu_item_el.set(menu_button_el, menu_popup);\n\t\tparent_item_el_by_popup_el.set(menu_popup_el, menu_button_el);\n\t\tmenu_button_el.id = `menu-button-${menus_key}-${uid()}`;\n\t\tmenu_popup_el.dataset.semanticParent = menu_button_el.id; // for $Window to understand the popup belongs to its window\n\t\tmenu_button_el.setAttribute(\"aria-controls\", menu_popup_el.id);\n\t\tmenu_popup_el.setAttribute(\"aria-labelledby\", menu_button_el.id);\n\t\tmenus_el.setAttribute(\"aria-owns\", `${menus_el.getAttribute(\"aria-owns\") || \"\"} ${menu_popup_el.id}`);\n\n\t\tconst update_position_from_containing_bounds = () => {\n\t\t\tconst rect = menu_button_el.getBoundingClientRect();\n\t\t\tlet popup_rect = menu_popup_el.getBoundingClientRect();\n\t\t\tmenu_popup_el.style.position = \"absolute\";\n\t\t\tmenu_popup_el.style.left = `${(get_direction() === \"rtl\" ? rect.right - popup_rect.width : rect.left) + window.scrollX}px`;\n\t\t\tmenu_popup_el.style.top = `${rect.bottom + window.scrollY}px`;\n\n\t\t\tconst uncorrected_rect = menu_popup_el.getBoundingClientRect();\n\t\t\t// rounding down is needed for RTL layout for the rightmost menu, to prevent a scrollbar\n\t\t\tif (Math.floor(uncorrected_rect.right) > innerWidth) {\n\t\t\t\tmenu_popup_el.style.left = `${innerWidth - uncorrected_rect.width}px`;\n\t\t\t}\n\t\t\tif (Math.ceil(uncorrected_rect.left) < 0) {\n\t\t\t\tmenu_popup_el.style.left = \"0px\";\n\t\t\t}\n\t\t};\n\t\twindow.addEventListener(\"resize\", update_position_from_containing_bounds);\n\t\tmenu_popup_el.addEventListener(\"update\", update_position_from_containing_bounds);\n\t\t// update_position_from_containing_bounds(); // will be called when the menu is opened\n\n\t\tconst menu_id = menus_key.replace(\"&\", \"\").replace(/ /g, \"-\").toLowerCase();\n\t\tmenu_button_el.classList.add(`${menu_id}-menu-button`);\n\t\t// menu_popup_el.id = `${menu_id}-menu-popup-${uid()}`; // id is set by MenuPopup and changing it breaks the `data-semantic-parent` relationship\n\t\tmenu_popup_el.style.display = \"none\";\n\t\tmenu_button_el.innerHTML = `<span>${AccessKeys.toHTML(menus_key)}</span>`; // span is for button offset effect on press\n\t\tmenu_button_el.tabIndex = -1;\n\n\t\tmenu_button_el.setAttribute(\"aria-haspopup\", \"true\");\n\t\tmenu_button_el.setAttribute(\"aria-controls\", menu_popup_el.id);\n\n\t\tmenu_button_el.addEventListener(\"focus\", () => {\n\t\t\ttop_level_highlight(menus_key);\n\t\t});\n\t\tmenu_button_el.addEventListener(\"pointerdown\", e => {\n\t\t\tif (menu_button_el.classList.contains(\"active\")) {\n\t\t\t\tmenu_button_el.dispatchEvent(new CustomEvent(\"release\", {}));\n\t\t\t\trefocus_outside_menus();\n\t\t\t\te.preventDefault(); // needed for refocus_outside_menus() to work\n\t\t\t} else {\n\t\t\t\topen_top_level_menu(e.type);\n\t\t\t}\n\t\t});\n\t\tmenu_button_el.addEventListener(\"pointermove\", e => {\n\t\t\ttop_level_highlight(menus_key);\n\t\t\tif (e.pointerType === \"touch\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (selecting_menus) {\n\t\t\t\topen_top_level_menu(e.type);\n\t\t\t}\n\t\t});\n\t\tfunction open_top_level_menu(type = \"other\") {\n\n\t\t\tconst new_index = Object.keys(menus).indexOf(menus_key);\n\t\t\tif (new_index === top_level_menu_index && menu_button_el.getAttribute(\"aria-expanded\") === \"true\") {\n\t\t\t\treturn; // already open\n\t\t\t}\n\n\t\t\tclose_menus();\n\n\t\t\tmenu_button_el.classList.add(\"active\");\n\t\t\tmenu_button_el.setAttribute(\"aria-expanded\", \"true\");\n\t\t\tmenu_popup_el.style.display = \"\";\n\t\t\tmenu_popup_el.style.zIndex = `${get_new_menu_z_index()}`;\n\t\t\tmenu_popup_el.setAttribute(\"dir\", get_direction());\n\t\t\tif (window.inheritTheme) {\n\t\t\t\twindow.inheritTheme(menu_popup_el, menus_el);\n\t\t\t}\n\t\t\tif (!menu_popup_el.parentElement) {\n\t\t\t\tdocument.body.appendChild(menu_popup_el);\n\t\t\t}\n\t\t\t// console.log(\"pointerdown (possibly simulated) — menu_popup_el.style.zIndex\", menu_popup_el.style.zIndex, \"$Window.Z_INDEX\", $Window.Z_INDEX, \"menus_el.closest('.window').style.zIndex\", menus_el.closest(\".window\").style.zIndex);\n\t\t\t// setTimeout(() => { console.log(\"after timeout, menus_el.closest('.window').style.zIndex\", menus_el.closest(\".window\").style.zIndex); }, 0);\n\t\t\ttop_level_highlight(menus_key);\n\n\t\t\tmenu_popup_el.dispatchEvent(new CustomEvent(\"update\", {}));\n\n\t\t\tselecting_menus = true;\n\n\t\t\tmenu_popup_el.focus({ preventScroll: true });\n\t\t\tactive_menu_popup = menu_popup;\n\n\t\t\tif (type === \"keydown\") {\n\t\t\t\tmenu_popup.highlight(0);\n\t\t\t\tsend_info_event(menu_popup.menuItems[0]);\n\t\t\t} else {\n\t\t\t\tsend_info_event(); // @TODO: allow descriptions on top level menus\n\t\t\t}\n\t\t};\n\t\tmenu_button_el.addEventListener(\"release\", () => {\n\t\t\tselecting_menus = false;\n\n\t\t\tmenu_button_el.classList.remove(\"active\");\n\t\t\tif (!window.debugKeepMenusOpen) {\n\t\t\t\tmenu_popup.close(true);\n\t\t\t\tmenu_button_el.setAttribute(\"aria-expanded\", \"false\");\n\t\t\t}\n\n\t\t\tmenus_el.dispatchEvent(new CustomEvent(\"default-info\", {}));\n\t\t});\n\t\ttop_level_menus.push({\n\t\t\tmenu_button_el,\n\t\t\tmenu_popup_el,\n\t\t\tmenus_key,\n\t\t\taccess_key: AccessKeys.get(menus_key),\n\t\t\topen_top_level_menu,\n\t\t});\n\t};\n\tfor (const menu_key in menus) {\n\t\tmake_menu_button(menu_key, menus[menu_key]);\n\t}\n\n\twindow.addEventListener(\"keydown\", e => {\n\t\t// close any errant menus\n\t\t// taking care not to interfere with regular Escape key behavior\n\t\t// @TODO: listen for menus_el removed from DOM, and close menus there\n\t\tif (\n\t\t\t!document.activeElement ||\n\t\t\t!document.activeElement.closest || // window or document\n\t\t\t!document.activeElement.closest(\".menus, .menu-popup\")\n\t\t) {\n\t\t\tif (e.key === \"Escape\") {\n\t\t\t\tif (active_menu_popup) {\n\t\t\t\t\tclose_menus();\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// window.addEventListener(\"blur\", close_menus);\n\twindow.addEventListener(\"blur\", (event) => {\n\t\t// hack for Pinball (in 98.js.org) where it triggers fake blur events\n\t\t// in order to pause the game\n\t\tif (!event.isTrusted) {\n\t\t\treturn;\n\t\t}\n\t\tclose_menus();\n\t});\n\t/**\n\t * @param {PointerEvent} event\n\t */\n\tfunction close_menus_on_click_outside(event) {\n\t\tif (event.target?.closest?.(\".menus\") === menus_el || event.target?.closest?.(\".menu-popup\")) {\n\t\t\treturn;\n\t\t}\n\t\t// window.console && console.log(event.type, \"occurred outside of menus (on \", event.target, \") so...\");\n\t\tclose_menus();\n\t\ttop_level_highlight(-1);\n\t}\n\twindow.addEventListener(\"pointerdown\", close_menus_on_click_outside);\n\twindow.addEventListener(\"pointerup\", close_menus_on_click_outside);\n\n\twindow.addEventListener(\"focusout\", (event) => {\n\t\t// if not still in menus, unhighlight (e.g. if you hit Escape to unfocus the menus)\n\t\tif (event.relatedTarget?.closest?.(\".menus\") === menus_el || event.relatedTarget?.closest?.(\".menu-popup\")) {\n\t\t\treturn;\n\t\t}\n\t\tclose_menus();\n\t\t// Top level buttons should no longer be highlighted due to focus, but still may be highlighted due to hover.\n\t\ttop_level_highlight(top_level_menus.findIndex(({ menu_button_el }) => menu_button_el.matches(\":hover\")));\n\t});\n\n\tlet keyboard_scope_elements = [];\n\t/**\n\t * @param {...EventTarget} elements\n\t */\n\tfunction set_keyboard_scope(...elements) {\n\t\tfor (const el of keyboard_scope_elements) {\n\t\t\tel.removeEventListener(\"keydown\", keyboard_scope_keydown);\n\t\t}\n\t\tkeyboard_scope_elements = elements;\n\t\tfor (const el of keyboard_scope_elements) {\n\t\t\tel.addEventListener(\"keydown\", keyboard_scope_keydown);\n\t\t}\n\t}\n\t/**\n\t * @param {KeyboardEvent} e\n\t */\n\tfunction keyboard_scope_keydown(e) {\n\t\t// Close menus if the user presses almost any key combination\n\t\t// e.g. if you look in the menu to remember a shortcut,\n\t\t// and then use the shortcut.\n\t\tif (\n\t\t\t(e.ctrlKey || e.metaKey) && // Ctrl or Command held down\n\t\t\t// and anything then pressed other than Ctrl or Command\n\t\t\te.key !== \"Control\" &&\n\t\t\te.key !== \"Meta\"\n\t\t) {\n\t\t\tclose_menus();\n\t\t\treturn;\n\t\t}\n\t\tif (e.defaultPrevented) {\n\t\t\treturn; // closing menus above is meant to be done when activating unrelated shortcuts\n\t\t\t// but stuff after this is should not be handled at the same time as something else\n\t\t}\n\t\tif (e.altKey && !e.shiftKey && !e.ctrlKey && !e.metaKey) { // Alt held\n\t\t\t// Should the access key for top level menus default to the first letter, like menu items?\n\t\t\tconst menu = top_level_menus.find((menu) =>\n\t\t\t\tmenu.access_key?.toLowerCase() === e.key.toLowerCase()\n\t\t\t);\n\t\t\tif (menu) {\n\t\t\t\te.preventDefault();\n\t\t\t\tmenu.open_top_level_menu(\"keydown\");\n\t\t\t}\n\t\t}\n\t}\n\n\tset_keyboard_scope(window);\n\n\t/** @type {HTMLElement} */\n\tthis.element = menus_el;\n\t/** @type {() => void} */\n\tthis.closeMenus = close_menus;\n\t/** @type {(...elements: EventTarget[]) => void} */\n\tthis.setKeyboardScope = set_keyboard_scope;\n}\n\nexports.MenuBar = MenuBar;\nexports.AccessKeys = AccessKeys;\nexports.MENU_DIVIDER = MENU_DIVIDER;\n\n// @ts-ignore\n})(typeof module !== \"undefined\" ? module.exports : window);\n"
  },
  {
    "path": "lib/os-gui/build/blue.css",
    "content": "/* Source: https://www.deviantart.com/tpenguinltg/art/Blue-525167751 */\n/* License: https://creativecommons.org/licenses/by-sa/3.0/ */\n/* This is a generated file. */\n/* spell-checker: disable */\n:root {\n\t--checker: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAG0lEQVQYV2O8/OTH/8vPfjAwLjv14b+uFAcDAG90ChC/AKc5AAAAAElFTkSuQmCC\");\n\t--button-active-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h192v192h-192v-192z%22%20fill%3D%22rgb(49%2C%20131%2C%20221)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22rgb(166%2C%20202%2C%20240)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--button-normal-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22rgb(211%2C%20228%2C%20248)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22rgb(166%2C%20202%2C%20240)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22rgb(49%2C%20131%2C%20221)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22rgb(166%2C%20202%2C%20240)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--inset-deep-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22rgb(211%2C%20228%2C%20248)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22rgb(49%2C%20131%2C%20221)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22rgb(166%2C%20202%2C%20240)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22rgb(166%2C%20202%2C%20240)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--button-default-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22rgb(211%2C%20228%2C%20248)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h96v32h-64v64h-32v-96z%22%20fill%3D%22rgb(166%2C%20202%2C%20240)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M160%2064h32v128h-128v-32h96v-96z%22%20fill%3D%22rgb(49%2C%20131%2C%20221)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M96%2096h64v64h-64v-64z%22%20fill%3D%22rgb(166%2C%20202%2C%20240)%22%2F%3E%0A%09%09%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%22256%22%20height%3D%22256%22%20stroke-width%3D%2264%22%20stroke%3D%22rgb(0%2C%200%2C%200)%22%20fill%3D%22none%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 96 / 3px;\n\t--button-default-active-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h192v192h-192v-192z%22%20fill%3D%22rgb(49%2C%20131%2C%20221)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22rgb(166%2C%20202%2C%20240)%22%2F%3E%0A%09%09%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%22256%22%20height%3D%22256%22%20stroke-width%3D%2264%22%20stroke%3D%22rgb(0%2C%200%2C%200)%22%20fill%3D%22none%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--scrollbar-arrows-ButtonText: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAW0lEQVQ4T2NkGGSAcZC5h4FWDvrPwEC02ShqkR0EkkAHuBxMyEKYWYQ8jKEOXQOyo/A5BuZwqqvBZiA+3xMbilQLIWqlcUJRimwPzjRELcdQZA6hREeR4eRoBgBoXhAK6oiMhwAAAABJRU5ErkJggg==\");\n\t--scrollbar-arrows-GrayText: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAYElEQVQ4T2NkGGSAcZC5h4EmDjJsvvv/fK0yUWajq4VrAkmghxYuQwlZCDOLkKOwqUPxBbKj8DkG5nBaqMEIVny+JzYUqRZC1ErghKIU2R6caYhajqHUHKJyAqWWkKIfANj2QArAsbtdAAAAAElFTkSuQmCC\");\n\t--scrollbar-arrows-ButtonHilight: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAYElEQVQ4T2NkGGSAcZC5h4EmDrr85Md/XRkOosxGVwvXBJJADy1chhKyEGYWIUdhU4fiC2RH4XMMzOG0UIMRrPh8T2woUi2EqJXACUUpsj040xC1HEOpOUTlBEotIUU/AHnlQApCJ0jDAAAAAElFTkSuQmCC\");\n\t--scrollbar-size: 13px;\n\t--scrollbar-button-inner-size: 9px;\n\t--ActiveTitle: rgb(0, 0, 128);\n\t--Background: rgb(58, 110, 165);\n\t--Hilight: rgb(51, 153, 255);\n\t--HilightText: rgb(255, 255, 255);\n\t--TitleText: rgb(255, 255, 255);\n\t--Window: rgb(255, 255, 255);\n\t--WindowText: rgb(0, 0, 0);\n\t--Scrollbar: rgb(211, 228, 248);\n\t--InactiveTitle: rgb(49, 131, 221);\n\t--Menu: rgb(166, 202, 240);\n\t--WindowFrame: rgb(0, 0, 0);\n\t--MenuText: rgb(0, 0, 0);\n\t--ActiveBorder: rgb(166, 202, 240);\n\t--InactiveBorder: rgb(166, 202, 240);\n\t--AppWorkspace: rgb(49, 131, 221);\n\t--ButtonFace: rgb(166, 202, 240);\n\t--ButtonShadow: rgb(49, 131, 221);\n\t--GrayText: rgb(49, 131, 221);\n\t--ButtonText: rgb(0, 0, 0);\n\t--InactiveTitleText: rgb(0, 0, 128);\n\t--ButtonHilight: rgb(211, 228, 248);\n\t--ButtonDkShadow: rgb(0, 0, 0);\n\t--ButtonLight: rgb(166, 202, 240);\n\t--InfoText: rgb(0, 0, 0);\n\t--InfoWindow: rgb(225, 225, 255);\n\t--GradientActiveTitle: rgb(16, 132, 208);\n\t--GradientInactiveTitle: rgb(49, 131, 221);\n\t--ButtonAlternateFace: rgb(192, 192, 192);\n\t--HotTrackingColor: rgb(0, 0, 128);\n\t--MenuHilight: rgb(0, 0, 128);\n\t--MenuBar: rgb(166, 202, 240);\n}\n\n/*# sourceMappingURL=blue.css.map */"
  },
  {
    "path": "lib/os-gui/build/layout.css",
    "content": ".menus,\n.menu-popup,\n.os-window,\n.os-window .window-titlebar,\n.os-window .window-title {\n\tcursor: default;\n\t-webkit-user-select: none;\n\t   -moz-user-select: none;\n\t        user-select: none;\n}\n\n.os-window {\n\tcontain: layout; /* contain: paint; seems to clip children to the padding-box, including for interaction, not just painting; it breaks being able to grab resize handles over the border */\n\t/* overflow: hidden; is also not usable for the same reason */\n\t/* I might be able to do either with overflow-clip-margin however (@TODO) */\n\tdisplay: flex;\n\tflex-direction: column;\n\t/* will-change: width height left top; */\n}\n.window-content {\n\tflex: 1;\n\tmin-height: 0px;\n\t/* Text overflowing the window frame is really ugly!\n\toverflow: hidden; would make it harder to enable scrollbars (overflow: auto !important)\n\tWe want to allow scrollbars to be enabled easily (but not enable them),\n\tand we want to clip to the border of the window, without contents overlapping the border at all. */\n    contain: layout paint;\n}\n\n.os-window .window-titlebar,\nbody > .window-titlebar {\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: center;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\tflex-shrink: 0;\n}\n.os-window .window-title-area {\n\tposition: relative;\n\tflex: 1;\n}\n\n.os-window .window-titlebar .icon {\n\tvertical-align: bottom;\n}\n\n.os-window.maximized .handle,\n.os-window.minimized-without-taskbar .handle {\n\tdisplay: none; /* prevent resizing when window is minimized */\n}\n\n.os-window.minimized-without-taskbar .menus {\n\tdisplay: none; /* hide menubar when window is minimized */\n}\n\n\n/* Fix dragging things (like windows) over iframes */\n.dragging iframe {\n\tpointer-events: none;\n}\n\n.menus {\n\tdisplay: flex;\n\tflex: 0 0 auto;\n\tflex-wrap: wrap;\n}\n.menu-popup {\n\tposition: absolute;\n\tbox-sizing: border-box;\n}\n.menu-popup-table {\n\tborder-collapse: collapse;\n}\n.menu-button,\n.menu-item {\n\twhite-space: nowrap;\n    max-width: 100%;\n    overflow: hidden;\n    /* text-overflow: ellipsis; might imply a dialog */\n}\n.menu-hr {\n\tdisplay: block !important;\n\theight: 0;\n\twidth: auto;\n}\n/* @TODO: rename .access-key */\n/* @TODO: what are these !important flags about? */\n.menu-hotkey {\n\tdisplay: inline !important;\n}\n.menu-item-checkbox-area,\n.menu-item-submenu-area {\n\tmin-width: 16px;\n}\n.menu-item-checkbox-area,\n.menu-item-submenu-area {\n\ttext-align: center;\n}\n\n/* .window-content .button-group {\n\twidth: 85px;\n}\n.window-content .button-group > button {\n\twidth: 95%;\n\tpadding: 3px 5px;\n} */\n\n::before,\n::after {\n\tpointer-events: none;\n}\n\n/*# sourceMappingURL=layout.css.map */"
  },
  {
    "path": "lib/os-gui/build/layout.rtl.css",
    "content": ".menus,\n.menu-popup,\n.os-window,\n.os-window .window-titlebar,\n.os-window .window-title {\n\tcursor: default;\n\t-webkit-user-select: none;\n\t   -moz-user-select: none;\n\t        user-select: none;\n}\n\n.os-window {\n\tcontain: layout; /* contain: paint; seems to clip children to the padding-box, including for interaction, not just painting; it breaks being able to grab resize handles over the border */\n\t/* overflow: hidden; is also not usable for the same reason */\n\t/* I might be able to do either with overflow-clip-margin however (@TODO) */\n\tdisplay: flex;\n\tflex-direction: column;\n\t/* will-change: width height left top; */\n}\n.window-content {\n\tflex: 1;\n\tmin-height: 0px;\n\t/* Text overflowing the window frame is really ugly!\n\toverflow: hidden; would make it harder to enable scrollbars (overflow: auto !important)\n\tWe want to allow scrollbars to be enabled easily (but not enable them),\n\tand we want to clip to the border of the window, without contents overlapping the border at all. */\n    contain: layout paint;\n}\n\n.os-window .window-titlebar,\nbody > .window-titlebar {\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: center;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\tflex-shrink: 0;\n}\n.os-window .window-title-area {\n\tposition: relative;\n\tflex: 1;\n}\n\n.os-window .window-titlebar .icon {\n\tvertical-align: bottom;\n}\n\n.os-window.maximized .handle,\n.os-window.minimized-without-taskbar .handle {\n\tdisplay: none; /* prevent resizing when window is minimized */\n}\n\n.os-window.minimized-without-taskbar .menus {\n\tdisplay: none; /* hide menubar when window is minimized */\n}\n\n\n/* Fix dragging things (like windows) over iframes */\n.dragging iframe {\n\tpointer-events: none;\n}\n\n.menus {\n\tdisplay: flex;\n\tflex: 0 0 auto;\n\tflex-wrap: wrap;\n}\n.menu-popup {\n\tposition: absolute;\n\tbox-sizing: border-box;\n}\n.menu-popup-table {\n\tborder-collapse: collapse;\n}\n.menu-button,\n.menu-item {\n\twhite-space: nowrap;\n    max-width: 100%;\n    overflow: hidden;\n    /* text-overflow: ellipsis; might imply a dialog */\n}\n.menu-hr {\n\tdisplay: block !important;\n\theight: 0;\n\twidth: auto;\n}\n/* @TODO: rename .access-key */\n/* @TODO: what are these !important flags about? */\n.menu-hotkey {\n\tdisplay: inline !important;\n}\n.menu-item-checkbox-area,\n.menu-item-submenu-area {\n\tmin-width: 16px;\n}\n.menu-item-checkbox-area,\n.menu-item-submenu-area {\n\ttext-align: center;\n}\n\n/* .window-content .button-group {\n\twidth: 85px;\n}\n.window-content .button-group > button {\n\twidth: 95%;\n\tpadding: 3px 5px;\n} */\n\n::before,\n::after {\n\tpointer-events: none;\n}"
  },
  {
    "path": "lib/os-gui/build/peggys-pastels.css",
    "content": "/* Source: https://www.deviantart.com/tpenguinltg/art/Peggy-s-Pastels-505540096 */\n/* License: https://creativecommons.org/licenses/by-sa/3.0/ */\n/* This is a generated file. */\n/* spell-checker: disable */\n:root {\n\t--checker: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAG0lEQVQYV2P89eDJ/18PnzEwfjl46j+bvBQDAHJ8Cj5el2f8AAAAAElFTkSuQmCC\");\n\t--button-active-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22rgb(64%2C%2064%2C%2064)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h192v192h-192v-192z%22%20fill%3D%22rgb(222%2C%2069%2C%2096)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22rgb(244%2C%20193%2C%20202)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--button-normal-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22rgb(250%2C%20224%2C%20228)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22rgb(64%2C%2064%2C%2064)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22rgb(247%2C%20219%2C%20215)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22rgb(222%2C%2069%2C%2096)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22rgb(244%2C%20193%2C%20202)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--inset-deep-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22rgb(64%2C%2064%2C%2064)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22rgb(250%2C%20224%2C%20228)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22rgb(222%2C%2069%2C%2096)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22rgb(247%2C%20219%2C%20215)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22rgb(244%2C%20193%2C%20202)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--button-default-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22rgb(64%2C%2064%2C%2064)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22rgb(250%2C%20224%2C%20228)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h96v32h-64v64h-32v-96z%22%20fill%3D%22rgb(247%2C%20219%2C%20215)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M160%2064h32v128h-128v-32h96v-96z%22%20fill%3D%22rgb(222%2C%2069%2C%2096)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M96%2096h64v64h-64v-64z%22%20fill%3D%22rgb(244%2C%20193%2C%20202)%22%2F%3E%0A%09%09%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%22256%22%20height%3D%22256%22%20stroke-width%3D%2264%22%20stroke%3D%22rgb(0%2C%200%2C%200)%22%20fill%3D%22none%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 96 / 3px;\n\t--button-default-active-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22rgb(64%2C%2064%2C%2064)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h192v192h-192v-192z%22%20fill%3D%22rgb(222%2C%2069%2C%2096)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22rgb(244%2C%20193%2C%20202)%22%2F%3E%0A%09%09%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%22256%22%20height%3D%22256%22%20stroke-width%3D%2264%22%20stroke%3D%22rgb(0%2C%200%2C%200)%22%20fill%3D%22none%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--scrollbar-arrows-ButtonText: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAW0lEQVQ4T2NkGGSAcZC5h4FWDvrPwEC02ShqkR0EkkAHuBxMyEKYWYQ8jKEOXQOyo/A5BuZwqqvBZiA+3xMbilQLIWqlcUJRimwPzjRELcdQZA6hREeR4eRoBgBoXhAK6oiMhwAAAABJRU5ErkJggg==\");\n\t--scrollbar-arrows-GrayText: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAYElEQVQ4T2NkGGSAcZC5h4EmDrrnmvBfafcCosxGVwvXBJJADy1chhKyEGYWIUdhU4fiC2RH4XMMzOG0UIMRrPh8T2woUi2EqJXACUUpsj040xC1HEOpOUTlBEotIUU/ANEWQAoG78U6AAAAAElFTkSuQmCC\");\n\t--scrollbar-arrows-ButtonHilight: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAYElEQVQ4T2NkGGSAcZC5h4EmDvr14Ml/NgUZosxGVwvXBJJADy1chhKyEGYWIUdhU4fiC2RH4XMMzOG0UIMRrPh8T2woUi2EqJXACUUpsj040xC1HEOpOUTlBEotIUU/AIJVQAqPLmKjAAAAAElFTkSuQmCC\");\n\t--scrollbar-size: 13px;\n\t--scrollbar-button-inner-size: 9px;\n\t--Scrollbar: rgb(250, 224, 228);\n\t--Background: rgb(162, 219, 210);\n\t--ActiveTitle: rgb(0, 191, 188);\n\t--InactiveTitle: rgb(0, 187, 169);\n\t--Menu: rgb(244, 193, 202);\n\t--Window: rgb(244, 255, 255);\n\t--WindowFrame: rgb(0, 0, 0);\n\t--MenuText: rgb(0, 0, 0);\n\t--WindowText: rgb(0, 0, 0);\n\t--TitleText: rgb(255, 255, 255);\n\t--ActiveBorder: rgb(244, 193, 202);\n\t--InactiveBorder: rgb(244, 193, 202);\n\t--AppWorkspace: rgb(255, 184, 182);\n\t--Hilight: rgb(162, 219, 210);\n\t--HilightText: rgb(0, 0, 0);\n\t--ButtonFace: rgb(244, 193, 202);\n\t--ButtonShadow: rgb(222, 69, 96);\n\t--GrayText: rgb(222, 69, 96);\n\t--ButtonText: rgb(0, 0, 0);\n\t--InactiveTitleText: rgb(0, 85, 77);\n\t--ButtonHilight: rgb(250, 224, 228);\n\t--ButtonDkShadow: rgb(64, 64, 64);\n\t--ButtonLight: rgb(247, 219, 215);\n\t--InfoText: rgb(0, 0, 0);\n\t--InfoWindow: rgb(204, 255, 255);\n\t--ButtonAlternateFace: rgb(181, 181, 181);\n\t--HotTrackingColor: rgb(0, 128, 128);\n\t--GradientActiveTitle: rgb(202, 156, 185);\n\t--GradientInactiveTitle: rgb(236, 145, 162);\n\t--MenuHilight: rgb(162, 219, 210);\n\t--MenuBar: rgb(244, 193, 202);\n}\n\n/*# sourceMappingURL=peggys-pastels.css.map */"
  },
  {
    "path": "lib/os-gui/build/windows-98.css",
    "content": ":root {\n\t/* These resources are generated. */\n\t/* JS: makeThemeCSSFile(renderThemeGraphics(getComputedStyle(document.documentElement))) */\n\t/* spell-checker: disable */\n\t--checker: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAG0lEQVQYV2P8/////4MHDzIwHjhw4L+9vT0DAHAFCj6esq3FAAAAAElFTkSuQmCC\");\n\t--button-active-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h192v192h-192v-192z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--button-normal-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--inset-deep-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--button-default-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h96v32h-64v64h-32v-96z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M160%2064h32v128h-128v-32h96v-96z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M96%2096h64v64h-64v-64z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%09%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%22256%22%20height%3D%22256%22%20stroke-width%3D%2264%22%20stroke%3D%22%20rgb(0%2C%200%2C%200)%22%20fill%3D%22none%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 96 / 3px;\n\t--button-default-active-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h192v192h-192v-192z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%09%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%22256%22%20height%3D%22256%22%20stroke-width%3D%2264%22%20stroke%3D%22%20rgb(0%2C%200%2C%200)%22%20fill%3D%22none%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--scrollbar-arrows-ButtonText: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAW0lEQVQ4T2NkGGSAcZC5h4FWDvrPwEC02ShqkR0EkkAHuBxMyEKYWYQ8jKEOXQOyo/A5BuZwqqvBZiA+3xMbilQLIWqlcUJRimwPzjRELcdQZA6hREeR4eRoBgBoXhAK6oiMhwAAAABJRU5ErkJggg==\");\n\t--scrollbar-arrows-GrayText: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAYElEQVQ4T2NkGGSAcZC5h4EmDmpoaPjf0NBAlNnoauGaQBLooYXLUEIWwswi5Chs6lB8gewofI6BOZwWajCCFZ/viQ1FqoUQtRI4oShFtgdnGqKWYyg1h6icQKklpOgHAM9mQArEvm5+AAAAAElFTkSuQmCC\");\n\t--scrollbar-arrows-ButtonHilight: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAYElEQVQ4T2NkGGSAcZC5h4EmDvr///9/RkZGosxGVwvXBJJADy1chhKyEGYWIUdhU4fiC2RH4XMMzOG0UIMRrPh8T2woUi2EqJXACUUpsj040xC1HEOpOUTlBEotIUU/AKXFQAqyTJ6DAAAAAElFTkSuQmCC\");\n\t/* spell-checker: enable */\n\t--scrollbar-size: 13px;\n\t--scrollbar-button-inner-size: 9px;\n\n\t/* Colors */\n\t--ActiveBorder: rgb(192, 192, 192);\n\t--ActiveTitle: rgb(0, 0, 128);\n\t--AppWorkspace: rgb(128, 128, 128);\n\t--Background: rgb(0, 128, 128);\n\t--ButtonAlternateFace: rgb(180, 180, 180);\n\t--ButtonDkShadow: rgb(0, 0, 0);\n\t--ButtonFace: rgb(192, 192, 192);\n\t--ButtonHilight: rgb(255, 255, 255);\n\t--ButtonLight: rgb(223, 223, 223);\n\t--ButtonShadow: rgb(128, 128, 128);\n\t--ButtonText: rgb(0, 0, 0);\n\t--GradientActiveTitle: rgb(16, 132, 208);\n\t--GradientInactiveTitle: rgb(181, 181, 181);\n\t--GrayText: rgb(128, 128, 128);\n\t--Hilight: rgb(0, 0, 128);\n\t--HilightText: rgb(255, 255, 255);\n\t--HotTrackingColor: rgb(0, 0, 255);\n\t--InactiveBorder: rgb(192, 192, 192);\n\t--InactiveTitle: rgb(128, 128, 128);\n\t--InactiveTitleText: rgb(192, 192, 192);\n\t--InfoText: rgb(0, 0, 0);\n\t--InfoWindow: rgb(255, 255, 225);\n\t--Menu: rgb(192, 192, 192);\n\t--MenuText: rgb(0, 0, 0);\n\t--Scrollbar: rgb(192, 192, 192);\n\t--TitleText: rgb(255, 255, 255);\n\t--Window: rgb(255, 255, 255);\n\t--WindowFrame: rgb(0, 0, 0);\n\t--WindowText: rgb(0, 0, 0);\n}\n\n.inset-deep {\n\tborder-style: solid;\n\tborder-width: 1px;\n\tborder-color: rgb(128, 128, 128) rgb(255, 255, 255) rgb(255, 255, 255) rgb(128, 128, 128);\n\tborder-color: var(--ButtonShadow) var(--ButtonHilight) var(--ButtonHilight) var(--ButtonShadow);\n\tbackground-color: rgb(192, 192, 192);\n\tbackground-color: var(--ButtonFace);\n\tcolor: rgb(0, 0, 0);\n\tcolor: var(--ButtonText);\n\t/* as fallback */\n\tposition: relative;\n\t/* for pseudo element(s) */\n\t-o-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t   border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t-o-border-image: var(--inset-deep-border-image);\n\t   border-image: var(--inset-deep-border-image);\n\tborder-color: rgb(128, 128, 128);\n\tborder-color: var(--ButtonShadow);\n\tborder-style: solid;\n\tborder-width: 2px 2px;\n}\n.outset-deep {\n\tborder-style: solid;\n\tborder-width: 1px;\n\tborder-color: rgb(255, 255, 255) rgb(128, 128, 128) rgb(128, 128, 128) rgb(255, 255, 255);\n\tborder-color: var(--ButtonHilight) var(--ButtonShadow) var(--ButtonShadow) var(--ButtonHilight);\n\tbackground-color: rgb(192, 192, 192);\n\tbackground-color: var(--ButtonFace);\n\tcolor: rgb(0, 0, 0);\n\tcolor: var(--ButtonText);\n\t/* as fallback */\n\tposition: relative;\n\t/* for pseudo element(s) */\n\t-o-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t   border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t-o-border-image: var(--button-normal-border-image);\n\t   border-image: var(--button-normal-border-image);\n\tborder-color: rgb(223, 223, 223) rgb(128, 128, 128) rgb(128, 128, 128) rgb(223, 223, 223);\n\tborder-color: var(--ButtonLight) var(--ButtonShadow) var(--ButtonShadow) var(--ButtonLight);\n\tborder-style: solid;\n\tborder-width: 2px 2px;\n}\n.inset-shallow {\n\tborder-style: solid;\n\tborder-width: 1px;\n\tborder-color: rgb(128, 128, 128) rgb(255, 255, 255) rgb(255, 255, 255) rgb(128, 128, 128);\n\tborder-color: var(--ButtonShadow) var(--ButtonHilight) var(--ButtonHilight) var(--ButtonShadow);\n\tbackground-color: rgb(192, 192, 192);\n\tbackground-color: var(--ButtonFace);\n\tcolor: rgb(0, 0, 0);\n\tcolor: var(--ButtonText);\n}\n.outset-shallow {\n\tborder-style: solid;\n\tborder-width: 1px;\n\tborder-color: rgb(255, 255, 255) rgb(128, 128, 128) rgb(128, 128, 128) rgb(255, 255, 255);\n\tborder-color: var(--ButtonHilight) var(--ButtonShadow) var(--ButtonShadow) var(--ButtonHilight);\n\tbackground-color: rgb(192, 192, 192);\n\tbackground-color: var(--ButtonFace);\n\tcolor: rgb(0, 0, 0);\n\tcolor: var(--ButtonText);\n}\n\nbutton {\n\tbackground-color: rgb(192, 192, 192);\n\tbackground-color: var(--ButtonFace);\n\tcolor: rgb(0, 0, 0);\n\tcolor: var(--ButtonText);\n}\nbutton:not(.lightweight) {\n\toutline: none; /* replaced with inner dotted focus ring (which is admittedly not so prominent...) */ border-style: solid; border-width: 1px; border-color: rgb(255, 255, 255) rgb(128, 128, 128) rgb(128, 128, 128) rgb(255, 255, 255); border-color: var(--ButtonHilight) var(--ButtonShadow) var(--ButtonShadow) var(--ButtonHilight); background-color: rgb(192, 192, 192); background-color: var(--ButtonFace); color: rgb(0, 0, 0); color: var(--ButtonText); /* as fallback */ position: relative; /* for pseudo element(s) */ -o-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px; border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px; -o-border-image: var(--button-normal-border-image); border-image: var(--button-normal-border-image); border-color: rgb(223, 223, 223) rgb(128, 128, 128) rgb(128, 128, 128) rgb(223, 223, 223); border-color: var(--ButtonLight) var(--ButtonShadow) var(--ButtonShadow) var(--ButtonLight); border-style: solid; border-width: 2px 2px; border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px; border-image: var(--button-normal-border-image);\n}\nbutton:not(.lightweight).default {\n\t-o-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h96v32h-64v64h-32v-96z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M160%2064h32v128h-128v-32h96v-96z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M96%2096h64v64h-64v-64z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%09%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%22256%22%20height%3D%22256%22%20stroke-width%3D%2264%22%20stroke%3D%22%20rgb(0%2C%200%2C%200)%22%20fill%3D%22none%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 96 / 3px;\n\t   border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h96v32h-64v64h-32v-96z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M160%2064h32v128h-128v-32h96v-96z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M96%2096h64v64h-64v-64z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%09%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%22256%22%20height%3D%22256%22%20stroke-width%3D%2264%22%20stroke%3D%22%20rgb(0%2C%200%2C%200)%22%20fill%3D%22none%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 96 / 3px;\n\t-o-border-image: var(--button-default-border-image);\n\t   border-image: var(--button-default-border-image);\n}\nbutton:not(.lightweight):enabled:hover:active {\n\t-o-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h192v192h-192v-192z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t   border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h192v192h-192v-192z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t-o-border-image: var(--button-active-border-image);\n\t   border-image: var(--button-active-border-image);\n}\nbutton:not(.lightweight).default:enabled:hover:active {\n\t-o-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h192v192h-192v-192z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%09%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%22256%22%20height%3D%22256%22%20stroke-width%3D%2264%22%20stroke%3D%22%20rgb(0%2C%200%2C%200)%22%20fill%3D%22none%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t   border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h192v192h-192v-192z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%09%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%22256%22%20height%3D%22256%22%20stroke-width%3D%2264%22%20stroke%3D%22%20rgb(0%2C%200%2C%200)%22%20fill%3D%22none%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t-o-border-image: var(--button-default-active-border-image);\n\t   border-image: var(--button-default-active-border-image);\n}\n\n/* TODO: offset content on press! */\n/* (this would need a child ELEMENT, wouldn't work with text nodes as direct descendants:) */\n/*button:active > * {\n\tposition: relative;\n\tleft: 1px;\n\ttop: 1px;\n}\n*/\n/* also, this is more complicated; see Paint; the tool buttons translate when being pushed and when depressed, and these add together */\n/* omg, a thought... what if I used feDisplacementMap SVG filter... */\n\nbutton:not(.lightweight):focus::before {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\tleft: 2px;\n\ttop: 2px;\n\tright: 2px;\n\tbottom: 2px;\n\tborder: 1px dotted rgb(0, 0, 0);\n\tborder: 1px dotted var(--ButtonDkShadow); /* ?? */\n\t/* TODO: get exact inset dimensions, and have corners without dots ideally */\n\t/* (could use outline instead of ::before at this point) */\n}\nbutton.lightweight {\n\toutline: none; /* these buttons are not usually keyboard accessible, or the focus it shown just by inset (menu buttons) */\n\n\tborder-style: solid;\n\tborder-width: 1px;\n\tborder-color: transparent;\n}\n/* TODO: recommend preventing focus on click for lightweight buttons */\nbutton.lightweight:enabled:hover {\n\tborder-style: solid;\n\tborder-width: 1px;\n\tborder-color: rgb(255, 255, 255) rgb(128, 128, 128) rgb(128, 128, 128) rgb(255, 255, 255);\n\tborder-color: var(--ButtonHilight) var(--ButtonShadow) var(--ButtonShadow) var(--ButtonHilight);\n\tbackground-color: rgb(192, 192, 192);\n\tbackground-color: var(--ButtonFace);\n\tcolor: rgb(0, 0, 0);\n\tcolor: var(--ButtonText);\n}\nbutton.lightweight:enabled:hover:active, button.lightweight.pressing, button.lightweight.pressed {\n\tborder-style: solid;\n\tborder-width: 1px;\n\tborder-color: rgb(128, 128, 128) rgb(255, 255, 255) rgb(255, 255, 255) rgb(128, 128, 128);\n\tborder-color: var(--ButtonShadow) var(--ButtonHilight) var(--ButtonHilight) var(--ButtonShadow);\n\tbackground-color: rgb(192, 192, 192);\n\tbackground-color: var(--ButtonFace);\n\tcolor: rgb(0, 0, 0);\n\tcolor: var(--ButtonText);\n}\nbutton:disabled {\n\tcolor: rgb(128, 128, 128);\n\tcolor: var(--GrayText);\n\ttext-shadow: 1px 1px 0px rgb(255, 255, 255);\n\ttext-shadow: 1px 1px 0px var(--ButtonHilight);\n}\nbutton:not(.lightweight).toggle:enabled:hover:active, button:not(.lightweight).pressing {\n\tborder-style: solid;\n\tborder-width: 1px;\n\tborder-color: rgb(128, 128, 128) rgb(255, 255, 255) rgb(255, 255, 255) rgb(128, 128, 128);\n\tborder-color: var(--ButtonShadow) var(--ButtonHilight) var(--ButtonHilight) var(--ButtonShadow);\n\tbackground-color: rgb(192, 192, 192);\n\tbackground-color: var(--ButtonFace);\n\tcolor: rgb(0, 0, 0);\n\tcolor: var(--ButtonText);\n\t/* as fallback */\n\tposition: relative;\n\t/* for pseudo element(s) */\n\t-o-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t   border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t-o-border-image: var(--inset-deep-border-image);\n\t   border-image: var(--inset-deep-border-image);\n}\nbutton:not(.lightweight).toggle:enabled:hover:active, button:not(.lightweight).pressing {\n\tborder-color: rgb(128, 128, 128);\n\tborder-color: var(--ButtonShadow);\n\tborder-style: solid;\n\tborder-width: 2px 2px;\n}\nbutton:not(.lightweight).toggle.selected, button:not(.lightweight).pressed {\n\tborder-style: solid;\n\tborder-width: 1px;\n\tborder-color: rgb(128, 128, 128) rgb(255, 255, 255) rgb(255, 255, 255) rgb(128, 128, 128);\n\tborder-color: var(--ButtonShadow) var(--ButtonHilight) var(--ButtonHilight) var(--ButtonShadow);\n\tbackground-color: rgb(192, 192, 192);\n\tbackground-color: var(--ButtonFace);\n\tcolor: rgb(0, 0, 0);\n\tcolor: var(--ButtonText);\n\t/* as fallback */\n\tposition: relative;\n\t/* for pseudo element(s) */\n\t-o-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t   border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t-o-border-image: var(--inset-deep-border-image);\n\t   border-image: var(--inset-deep-border-image);\n}\nbutton:not(.lightweight).toggle.selected, button:not(.lightweight).pressed {\n\tborder-color: rgb(128, 128, 128);\n\tborder-color: var(--ButtonShadow);\n\tborder-style: solid;\n\tborder-width: 2px 2px;\n}\nbutton:not(.lightweight).toggle.selected, button:not(.lightweight).pressed {\n\tbackground: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAG0lEQVQYV2P8/////4MHDzIwHjhw4L+9vT0DAHAFCj6esq3FAAAAAElFTkSuQmCC\") repeat;\n\tbackground: var(--checker) repeat;\n\timage-rendering: pixelated;\n}\n\n.os-window .window-titlebar,\nbody > .window-titlebar {\n\tbackground: rgb(0, 0, 128);\n\tbackground: var(--ActiveTitle);\n\tbackground: linear-gradient(to right, rgb(0, 0, 128) 0%, rgb(16, 132, 208) 100%);\n\tbackground: linear-gradient(to right, var(--ActiveTitle) 0%, var(--GradientActiveTitle) 100%);\n\t\n\tcolor: rgb(255, 255, 255);\n\t\n\tcolor: var(--TitleText);\n}\n\n.os-window .window-titlebar, body > .window-titlebar {\n\tfont-family: 'Segoe UI', sans-serif;\n\tfont-size: 12px;\n}\n.os-window.rtl .window-titlebar {\n\tbackground: linear-gradient(to left, rgb(0, 0, 128) 0%, rgb(16, 132, 208) 100%);\n\tbackground: linear-gradient(to left, var(--ActiveTitle) 0%, var(--GradientActiveTitle) 100%);\n}\n.os-window:not(.tool-window) .window-titlebar,\nbody > .window-titlebar {\n\tfont-weight: bold;\n}\n.os-window:not(.focused) .window-titlebar {\n\tbackground: darkgray;\n\tbackground: linear-gradient(to right, rgb(128, 128, 128) 0%, rgb(181, 181, 181) 100%);\n\tbackground: linear-gradient(to right, var(--InactiveTitle) 0%, var(--GradientInactiveTitle) 100%);\n\n\tcolor: rgb(192, 192, 192);\n\n\tcolor: var(--InactiveTitleText);\n}\n.os-window.rtl:not(.focused) .window-titlebar {\n\tbackground: linear-gradient(to left, rgb(128, 128, 128) 0%, rgb(181, 181, 181) 100%);\n\tbackground: linear-gradient(to left, var(--InactiveTitle) 0%, var(--GradientInactiveTitle) 100%);\n}\n.os-window {\n\t/* Needed for when maximized, otherwise would be provided by %outset-deep */\n\tbackground: rgb(192, 192, 192);\n\tbackground: var(--ButtonFace);\n\n\t/* background: var(--Window); */\n\t/*color: var(--WindowText);*/\n\t/*border: 1px solid var(--WindowFrame);*/\n\t/* TODO: use window-specific theme colors; also different types of windows */\n}\n.os-window:not(.maximized) {\n\tborder-style: solid;\n\tborder-width: 1px;\n\tborder-color: rgb(255, 255, 255) rgb(128, 128, 128) rgb(128, 128, 128) rgb(255, 255, 255);\n\tborder-color: var(--ButtonHilight) var(--ButtonShadow) var(--ButtonShadow) var(--ButtonHilight);\n\tbackground-color: rgb(192, 192, 192);\n\tbackground-color: var(--ButtonFace);\n\tcolor: rgb(0, 0, 0);\n\tcolor: var(--ButtonText);\n\t/* as fallback */\n\tposition: relative;\n\t/* for pseudo element(s) */\n\t-o-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t   border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t-o-border-image: var(--button-normal-border-image);\n\t   border-image: var(--button-normal-border-image);\n\tborder-color: rgb(223, 223, 223) rgb(128, 128, 128) rgb(128, 128, 128) rgb(223, 223, 223);\n\tborder-color: var(--ButtonLight) var(--ButtonShadow) var(--ButtonShadow) var(--ButtonLight);\n\tborder-style: solid;\n\tborder-width: 2px 2px;\n\tpadding: 2px;\n}\n\n.window-button {\n\tdisplay: block;\n\twidth: 16px;\n\theight: 14px;\n\tpadding: 0;\n\tmargin: 2px 0;\n}\n.window-button-icon {\n\tdisplay: block;\n\t/* background-image: url(\"images/titlebar-buttons.png\"); */\n\t--sprite-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAKCAYAAADo3z3CAAAAoUlEQVRIS9VVWw7AIAib9z/0FpZgCOFRgpluf9MClhYdV++7gfDhYLxYDw+UyiHd5F8S5lr6zNa6Xpv/KwhHOahQpLB1+CwfycgYrwmE0WK8MTsIR1aOGsR+NYkkYzN5/pGwVA9xA/diq8LeHCKuQxQ+aoYt2yJWtpSNZth0edRpGVC5eGQcSg4hXLml3fdpBeHs8evWyPKX9ruXVqnYCeAHA8IyC9K2kmkAAAAASUVORK5CYII=\");\n\t--sprite-y: 0;\n\timage-rendering: pixelated;\n\twidth: 12px;\n\theight: 10px;\n\tposition: relative;\n\tpointer-events: none;\n}\n.os-window .window-button:enabled:hover:active .window-button-icon,\n.os-window .window-button.pressing .window-button-icon {\n\ttop: 1px;\n\tleft: 1px;\n}\n.window-button:disabled .window-button-icon {\n\t/* filter: saturate(0%) opacity(50%); fallback */\n\t/* filter: url(\"#os-gui-black-to-inset-filter\"); */\n}\n.window-button .window-button-icon::before,\n.window-button .window-button-icon::after {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tmask-image: var(--sprite-image);\n\tmask-position: var(--sprite-x) var(--sprite-y);\n\t-webkit-mask-image: var(--sprite-image);\n\t-webkit-mask-position: var(--sprite-x) var(--sprite-y);\n\tbackground-color: rgb(0, 0, 0);\n\tbackground-color: var(--ButtonText);\n}\n.window-button:disabled .window-button-icon::before {\n\tbackground-color: rgb(255, 255, 255);\n\tbackground-color: var(--ButtonHilight);\n\tleft: 1px;\n\ttop: 1px;\n}\n.window-button:enabled .window-button-icon::after {\n\tdisplay: none;\n}\n.window-button:disabled .window-button-icon::after {\n\tbackground-color: rgb(128, 128, 128);\n\tbackground-color: var(--GrayText);\n}\n.window-action-close .window-button-icon  {\n\t--sprite-x: calc(-3 * 13px - 1px);\n}\n.window-action-maximize .window-button-icon  {\n\t--sprite-x: calc(-1 * 13px - 1px);\n}\n.window-action-restore .window-button-icon  {\n\t--sprite-x: calc(-2 * 13px - 1px);\n}\n.window-action-minimize .window-button-icon  {\n\t--sprite-x: calc(-0 * 13px - 1px);\n}\n.window-close-button {\n\tmargin-left: 2px;\n\tmargin-right: 2px;\n}\n.os-window.tool-window .window-close-button {\n\twidth: 11px;\n\theight: 11px;\n}\n.os-window.tool-window .window-close-button .window-button-icon {\n\twidth: 7px;\n\theight: 7px;\n\t--sprite-x: 7px;\n}\n.os-window .window-title-area {\n\theight: 16px;\n}\n.os-window.tool-window .window-title-area {\n\theight: 14px;\n}\n.os-window .window-titlebar {\n\theight: 18px;\n}\n.os-window.tool-window .window-titlebar {\n\theight: 15px;\n}\n.os-window .window-title {\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tdisplay: inline-block !important;\n\tmargin: 0;\n\tpadding: 0;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tpadding-left: 2px;\n}\n\n.menus {\n\tbackground: rgb(192, 192, 192);\n\tbackground: var(--Menu);\n\tcolor: rgb(0, 0, 0);\n\tcolor: var(--MenuText);\n}\n.os-window:not(.focused) .menus {\n\tcolor: rgb(128, 128, 128);\n\tcolor: var(--GrayText);\n}\n.menus *, .menu-popup * {\n\tfont-family: 'Segoe UI', sans-serif;\n\tfont-size: 12px;\n}\n.menu-button {\n\tbox-sizing: border-box;\n\theight: 18px;\n\tline-height: 1;\n\tmargin-top: 1px;\n\tmargin-bottom: 1px;\n\tpadding: 2px 5px;\n\toutline: 0;\n\t/* @extend button.lightweight; */\n\tbackground: rgb(192, 192, 192);\n\tbackground: var(--Menu);\n}\n/* Note: In Windows 98, normal menu bars have an inset highlight if you use Esc and then the arrow keys,\nwhereas Explorer's menu bars are outset and match the hover effect, which I feel makes more sense,\nso I think I'll imitate that. (I might change it later) */\n/* Also, to prevent duplicate highlight (via keyboard + mouse), and lingering highlight with touch, I'm using a class, rather than :hover/:focus/:active */\n.menu-button.highlight {\n\tbox-shadow: 1px 1px 0 rgb(255, 255, 255) inset, -1px -1px 0 rgb(128, 128, 128) inset;\n\tbox-shadow: 1px 1px 0 var(--ButtonHilight) inset, -1px -1px 0 var(--ButtonShadow) inset;\n}\n.menu-button.highlight.active {\n\tbox-shadow: 1px 1px 0 rgb(128, 128, 128) inset, -1px -1px 0 rgb(255, 255, 255) inset;\n\tbox-shadow: 1px 1px 0 var(--ButtonShadow) inset, -1px -1px 0 var(--ButtonHilight) inset;\n}\n.menu-button.highlight.active > span {\n\tposition: relative;\n\ttop: 1px;\n\tleft: 1px;\n}\n\n.menu-popup {\n\tdisplay: block;\n\tpadding: 2px;\n\tbackground-color: rgb(192, 192, 192);\n\tbackground-color: var(--ButtonFace);\n\tborder-top: 1px solid rgb(192, 192, 192);\n\tborder-top: 1px solid var(--ButtonFace);\n\tborder-left: 1px solid rgb(192, 192, 192);\n\tborder-left: 1px solid var(--ButtonFace);\n\tborder-right: 1px solid rgb(0, 0, 0);\n\tborder-right: 1px solid var(--ButtonDkShadow);\n\tborder-bottom: 1px solid rgb(0, 0, 0);\n\tborder-bottom: 1px solid var(--ButtonDkShadow);\n\tbox-shadow: 1px 1px 0 rgb(255, 255, 255) inset, -1px -1px 0 rgb(128, 128, 128) inset;\n\tbox-shadow: 1px 1px 0 var(--ButtonHilight) inset, -1px -1px 0 var(--ButtonShadow) inset;\n\tbackground: rgb(192, 192, 192);\n\tbackground: var(--Menu);\n\tcolor: rgb(0, 0, 0);\n\tcolor: var(--MenuText);\n}\n.menu-popup td {\n    padding: 0 1px;\n}\n.menu-item {\n\tpadding: 1px 3px;\n\tmargin: 2px;\n\theight: 17px;\n}\n.menu-item[disabled] {\n\tcolor: rgb(128, 128, 128);\n\tcolor: var(--GrayText);\n\ttext-shadow: 0.8px 0.8px 0px rgb(255, 255, 255);\n\ttext-shadow: 0.8px 0.8px 0px var(--ButtonHilight);\n}\n.menu-item.highlight:not([disabled]),\n.menu-item.active:not([disabled]) {\n\tcolor: rgb(255, 255, 255);\n\tcolor: var(--HilightText);\n}\n.menu-item.highlight,\n.menu-item.active {\n\tbackground: rgb(0, 0, 128);\n\tbackground: var(--Hilight);\n\ttext-shadow: none;\n\toutline: 0;\n}\n.menu-item .menu-item-shortcut {\n\tpadding-left: 10px;\n}\n/* Note: viewBox is needed for scaling the SVG, used in JS Paint's Eye Gaze Mode */\n.menu-item-checkbox-area::after {\n\t/* spell-checker: disable */\n\tmask-image: url(\"data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg' style='fill:currentColor;display:inline-block;vertical-align:middle' %3E%3Cpath d='M5 7v3l2 2 5-5V4L7 9Z'/%3E%3C/svg%3E\");\n\t-webkit-mask-image: url(\"data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg' style='fill:currentColor;display:inline-block;vertical-align:middle' %3E%3Cpath d='M5 7v3l2 2 5-5V4L7 9Z'/%3E%3C/svg%3E\");\n\t/* spell-checker: enable */\n}\n.menu-item-checkbox-area.radio::after {\n\t/* spell-checker: disable */\n\tmask-image: url(\"data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg' style='fill:currentColor;display:inline-block;vertical-align:middle' %3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E\");\n\t-webkit-mask-image: url(\"data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg' style='fill:currentColor;display:inline-block;vertical-align:middle' %3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E\");\n\t/* spell-checker: enable */\n}\n.has-submenu .menu-item-submenu-area::after {\n\t/* spell-checker: disable */\n\tmask-image: url(\"data:image/svg+xml, %3Csvg width='16' height='16' viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg' style='fill:currentColor;display:inline-block;vertical-align:middle' %3E%3Cpath d='m6 4 4 4-4 4z'/%3E%3C/svg%3E\");\n\t-webkit-mask-image: url(\"data:image/svg+xml, %3Csvg width='16' height='16' viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg' style='fill:currentColor;display:inline-block;vertical-align:middle' %3E%3Cpath d='m6 4 4 4-4 4z'/%3E%3C/svg%3E\");\n\t/* spell-checker: enable */\n}\n.has-submenu .menu-item-submenu-area.point-right::after {\n\ttransform: scaleX(-1);\n}\n.menu-item-checkbox-area::after,\n.menu-item-submenu-area::after {\n\tcontent: \"\";\n\tdisplay: block;\n\twidth: 16px;\n\theight: 16px;\n\t/* no background means it's invisible by default here (masking transparent gives transparent, i.e. nothing) */\n}\n.menu-item[aria-checked=true] .menu-item-checkbox-area::after,\n.menu-item.has-submenu .menu-item-submenu-area::after {\n\t/* makes it visible */\n\tbackground: currentColor;\n}\n\n.menu-hr {\n\tborder: 0;\n\tborder-top: 1px solid rgb(128, 128, 128);\n\tborder-top: 1px solid var(--ButtonShadow);\n\tborder-bottom: 1px solid rgb(255, 255, 255);\n\tborder-bottom: 1px solid var(--ButtonHilight);\n\tmargin: 0;\n\tmargin-top: 3px;\n\tmargin-bottom: 4px;\n}\n/* @TODO: rename .access-key (could also make it a <u> element, in which case this rule isn't needed) */\n.menu-hotkey {\n\ttext-decoration: underline;\n}\n.menu-hotkey::-moz-selection {\n\t/* prevent weird looking white underlines if menubar is contained in a selection, possible in the demo (minute edge case) */\n    text-decoration-color: rgb(0, 0, 0) !important;\n    text-decoration-color: var(--MenuText) !important;\n}\n.menu-hotkey::selection {\n\t/* prevent weird looking white underlines if menubar is contained in a selection, possible in the demo (minute edge case) */\n    -webkit-text-decoration-color: rgb(0, 0, 0) !important;\n            text-decoration-color: rgb(0, 0, 0) !important;\n    -webkit-text-decoration-color: var(--MenuText) !important;\n            text-decoration-color: var(--MenuText) !important;\n}\n\n\n::-moz-selection {\n\tbackground-color: rgb(0, 0, 128);\n\tbackground-color: var(--Hilight);\n\tcolor: rgb(255, 255, 255);\n\tcolor: var(--HilightText);\n}\n\n\n::selection {\n\tbackground-color: rgb(0, 0, 128);\n\tbackground-color: var(--Hilight);\n\tcolor: rgb(255, 255, 255);\n\tcolor: var(--HilightText);\n}\n\n.scrollbar {\n\tbackground: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAG0lEQVQYV2P8/////4MHDzIwHjhw4L+9vT0DAHAFCj6esq3FAAAAAElFTkSuQmCC\") repeat;\n\tbackground: var(--checker) repeat;\n\timage-rendering: pixelated;\n}\n.scrollbar-thumb {\n\tbackground-color: rgb(192, 192, 192);\n\tbackground-color: var(--ButtonFace);\n\tborder-top: 1px solid rgb(192, 192, 192);\n\tborder-top: 1px solid var(--ButtonFace);\n\tborder-left: 1px solid rgb(192, 192, 192);\n\tborder-left: 1px solid var(--ButtonFace);\n\tborder-right: 1px solid rgb(0, 0, 0);\n\tborder-right: 1px solid var(--ButtonDkShadow);\n\tborder-bottom: 1px solid rgb(0, 0, 0);\n\tborder-bottom: 1px solid var(--ButtonDkShadow);\n\tbox-shadow: 1px 1px 0 rgb(255, 255, 255) inset, -1px -1px 0 rgb(128, 128, 128) inset;\n\tbox-shadow: 1px 1px 0 var(--ButtonHilight) inset, -1px -1px 0 var(--ButtonShadow) inset;\n}\n.scrollbar-track-piece:hover:active {\n\tbackground: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAG0lEQVQYV2P8/////4MHDzIwHjhw4L+9vT0DAHAFCj6esq3FAAAAAElFTkSuQmCC\") repeat;\n\tbackground: var(--checker) repeat;\n\timage-rendering: pixelated;\n\tbackground-color: white;\n\tbackground-blend-mode: difference;\n\t/* background-attachment: fixed; breaks the checkered background in chrome */\n}\n.scrollbar-track-piece.increment {\n\tbackground-position: bottom;\n}\n.scrollbar-corner {\n\tbackground-color: rgb(192, 192, 192);\n\tbackground-color: var(--ButtonFace);\n}\n\n.scrollbar-button {\n\tbackground-color: rgb(192, 192, 192);\n\tbackground-color: var(--ButtonFace);\n\tborder-top: 1px solid rgb(192, 192, 192);\n\tborder-top: 1px solid var(--ButtonFace);\n\tborder-left: 1px solid rgb(192, 192, 192);\n\tborder-left: 1px solid var(--ButtonFace);\n\tborder-right: 1px solid rgb(0, 0, 0);\n\tborder-right: 1px solid var(--ButtonDkShadow);\n\tborder-bottom: 1px solid rgb(0, 0, 0);\n\tborder-bottom: 1px solid var(--ButtonDkShadow);\n\tbox-shadow: 1px 1px 0 rgb(255, 255, 255) inset, -1px -1px 0 rgb(128, 128, 128) inset;\n\tbox-shadow: 1px 1px 0 var(--ButtonHilight) inset, -1px -1px 0 var(--ButtonShadow) inset;\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAW0lEQVQ4T2NkGGSAcZC5h4FWDvrPwEC02ShqkR0EkkAHuBxMyEKYWYQ8jKEOXQOyo/A5BuZwqqvBZiA+3xMbilQLIWqlcUJRimwPzjRELcdQZA6hREeR4eRoBgBoXhAK6oiMhwAAAABJRU5ErkJggg==\");\n\tbackground-image: var(--scrollbar-arrows-ButtonText);\n\timage-rendering: pixelated;\n\twidth: 13px;\n\twidth: var(--scrollbar-size);\n\theight: 13px;\n\theight: var(--scrollbar-size);\n\tbox-sizing: border-box;\n}\n.scrollbar-button:not(.disabled):hover:active {\n\tborder: 1px solid rgb(128, 128, 128);\n\tborder: 1px solid var(--ButtonShadow);\n\tbox-shadow: none;\n}\n.scrollbar-button.disabled {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAYElEQVQ4T2NkGGSAcZC5h4EmDmpoaPjf0NBAlNnoauGaQBLooYXLUEIWwswi5Chs6lB8gewofI6BOZwWajCCFZ/viQ1FqoUQtRI4oShFtgdnGqKWYyg1h6icQKklpOgHAM9mQArEvm5+AAAAAElFTkSuQmCC\"), url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAYElEQVQ4T2NkGGSAcZC5h4EmDvr///9/RkZGosxGVwvXBJJADy1chhKyEGYWIUdhU4fiC2RH4XMMzOG0UIMRrPh8T2woUi2EqJXACUUpsj040xC1HEOpOUTlBEotIUU/AKXFQAqyTJ6DAAAAAElFTkSuQmCC\");\n\tbackground-image: var(--scrollbar-arrows-GrayText), var(--scrollbar-arrows-ButtonHilight);\n}\n\n.scrollbar-button.horizontal.decrement.disabled {\n\tbackground-position: /* left arrow */\n\t\tcalc(9px * -3 + 1px) 1px,\n\t\tcalc(9px * -3 + 2px) 2px;\n\tbackground-position: /* left arrow */\n\t\tcalc(var(--scrollbar-button-inner-size) * -3 + 1px) 1px,\n\t\tcalc(var(--scrollbar-button-inner-size) * -3 + 2px) 2px;\n}\n.scrollbar-button.horizontal.increment.disabled {\n\tbackground-position: /* right arrow */\n\t\tcalc(9px * -2 + 1px) 1px,\n\t\tcalc(9px * -2 + 2px) 2px;\n\tbackground-position: /* right arrow */\n\t\tcalc(var(--scrollbar-button-inner-size) * -2 + 1px) 1px,\n\t\tcalc(var(--scrollbar-button-inner-size) * -2 + 2px) 2px;\n}\n.scrollbar-button.vertical.decrement.disabled {\n\tbackground-position: /* up arrow */\n\t\tcalc(9px * -1 + 1px) 1px,\n\t\tcalc(9px * -1 + 2px) 2px;\n\tbackground-position: /* up arrow */\n\t\tcalc(var(--scrollbar-button-inner-size) * -1 + 1px) 1px,\n\t\tcalc(var(--scrollbar-button-inner-size) * -1 + 2px) 2px;\n}\n.scrollbar-button.vertical.increment.disabled {\n\tbackground-position: /* down arrow */\n\t\tcalc(9px * -0 + 1px) 1px,\n\t\tcalc(9px * -0 + 2px) 2px;\n\tbackground-position: /* down arrow */\n\t\tcalc(var(--scrollbar-button-inner-size) * -0 + 1px) 1px,\n\t\tcalc(var(--scrollbar-button-inner-size) * -0 + 2px) 2px;\n}\n\n.scrollbar-button.horizontal.decrement {\n\tbackground-position: calc(9px * -3 + 1px) 1px;\n\tbackground-position: calc(var(--scrollbar-button-inner-size) * -3 + 1px) 1px; /* left */\n}\n.scrollbar-button.horizontal.increment {\n\tbackground-position: calc(9px * -2 + 1px) 1px;\n\tbackground-position: calc(var(--scrollbar-button-inner-size) * -2 + 1px) 1px; /* right */\n}\n.scrollbar-button.vertical.decrement {\n\tbackground-position: calc(9px * -1 + 1px) 1px;\n\tbackground-position: calc(var(--scrollbar-button-inner-size) * -1 + 1px) 1px; /* up */\n}\n.scrollbar-button.vertical.increment {\n\tbackground-position: calc(9px * -0 + 1px) 1px;\n\tbackground-position: calc(var(--scrollbar-button-inner-size) * -0 + 1px) 1px; /* down */\n}\n\n::-webkit-scrollbar,\n::-webkit-scrollbar-thumb,\n::-webkit-scrollbar-button {\n\twidth: 13px;\n\twidth: var(--scrollbar-size);\n\theight: 13px;\n\theight: var(--scrollbar-size);\n}\n\n::-webkit-scrollbar {\n\tbackground: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAG0lEQVQYV2P8/////4MHDzIwHjhw4L+9vT0DAHAFCj6esq3FAAAAAElFTkSuQmCC\") repeat;\n\tbackground: var(--checker) repeat;\n\timage-rendering: pixelated;\n}\n::-webkit-scrollbar-thumb {\n\tbackground-color: rgb(192, 192, 192);\n\tbackground-color: var(--ButtonFace);\n\tborder-top: 1px solid rgb(192, 192, 192);\n\tborder-top: 1px solid var(--ButtonFace);\n\tborder-left: 1px solid rgb(192, 192, 192);\n\tborder-left: 1px solid var(--ButtonFace);\n\tborder-right: 1px solid rgb(0, 0, 0);\n\tborder-right: 1px solid var(--ButtonDkShadow);\n\tborder-bottom: 1px solid rgb(0, 0, 0);\n\tborder-bottom: 1px solid var(--ButtonDkShadow);\n\tbox-shadow: 1px 1px 0 rgb(255, 255, 255) inset, -1px -1px 0 rgb(128, 128, 128) inset;\n\tbox-shadow: 1px 1px 0 var(--ButtonHilight) inset, -1px -1px 0 var(--ButtonShadow) inset;\n}\n::-webkit-scrollbar-corner {\n\tbackground-color: rgb(192, 192, 192);\n\tbackground-color: var(--ButtonFace);\n}\n\n::-webkit-scrollbar-button {\n\tbackground-color: rgb(192, 192, 192);\n\tbackground-color: var(--ButtonFace);\n\tborder-top: 1px solid rgb(192, 192, 192);\n\tborder-top: 1px solid var(--ButtonFace);\n\tborder-left: 1px solid rgb(192, 192, 192);\n\tborder-left: 1px solid var(--ButtonFace);\n\tborder-right: 1px solid rgb(0, 0, 0);\n\tborder-right: 1px solid var(--ButtonDkShadow);\n\tborder-bottom: 1px solid rgb(0, 0, 0);\n\tborder-bottom: 1px solid var(--ButtonDkShadow);\n\tbox-shadow: 1px 1px 0 rgb(255, 255, 255) inset, -1px -1px 0 rgb(128, 128, 128) inset;\n\tbox-shadow: 1px 1px 0 var(--ButtonHilight) inset, -1px -1px 0 var(--ButtonShadow) inset;\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAW0lEQVQ4T2NkGGSAcZC5h4FWDvrPwEC02ShqkR0EkkAHuBxMyEKYWYQ8jKEOXQOyo/A5BuZwqqvBZiA+3xMbilQLIWqlcUJRimwPzjRELcdQZA6hREeR4eRoBgBoXhAK6oiMhwAAAABJRU5ErkJggg==\");\n\tbackground-image: var(--scrollbar-arrows-ButtonText);\n\timage-rendering: pixelated;\n\twidth: 13px;\n\twidth: var(--scrollbar-size);\n\theight: 13px;\n\theight: var(--scrollbar-size);\n\tbox-sizing: border-box;\n}\n\n::-webkit-scrollbar-button:not(.disabled):hover:active {\n\tborder: 1px solid rgb(128, 128, 128);\n\tborder: 1px solid var(--ButtonShadow);\n\tbox-shadow: none;\n}\n\n::-webkit-scrollbar-button.disabled {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAYElEQVQ4T2NkGGSAcZC5h4EmDmpoaPjf0NBAlNnoauGaQBLooYXLUEIWwswi5Chs6lB8gewofI6BOZwWajCCFZ/viQ1FqoUQtRI4oShFtgdnGqKWYyg1h6icQKklpOgHAM9mQArEvm5+AAAAAElFTkSuQmCC\"), url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAYElEQVQ4T2NkGGSAcZC5h4EmDvr///9/RkZGosxGVwvXBJJADy1chhKyEGYWIUdhU4fiC2RH4XMMzOG0UIMRrPh8T2woUi2EqJXACUUpsj040xC1HEOpOUTlBEotIUU/AKXFQAqyTJ6DAAAAAElFTkSuQmCC\");\n\tbackground-image: var(--scrollbar-arrows-GrayText), var(--scrollbar-arrows-ButtonHilight);\n}\n\n::-webkit-scrollbar-button.horizontal.decrement.disabled {\n\tbackground-position: /* left arrow */\n\t\tcalc(9px * -3 + 1px) 1px,\n\t\tcalc(9px * -3 + 2px) 2px;\n\tbackground-position: /* left arrow */\n\t\tcalc(var(--scrollbar-button-inner-size) * -3 + 1px) 1px,\n\t\tcalc(var(--scrollbar-button-inner-size) * -3 + 2px) 2px;\n}\n\n::-webkit-scrollbar-button.horizontal.increment.disabled {\n\tbackground-position: /* right arrow */\n\t\tcalc(9px * -2 + 1px) 1px,\n\t\tcalc(9px * -2 + 2px) 2px;\n\tbackground-position: /* right arrow */\n\t\tcalc(var(--scrollbar-button-inner-size) * -2 + 1px) 1px,\n\t\tcalc(var(--scrollbar-button-inner-size) * -2 + 2px) 2px;\n}\n\n::-webkit-scrollbar-button.vertical.decrement.disabled {\n\tbackground-position: /* up arrow */\n\t\tcalc(9px * -1 + 1px) 1px,\n\t\tcalc(9px * -1 + 2px) 2px;\n\tbackground-position: /* up arrow */\n\t\tcalc(var(--scrollbar-button-inner-size) * -1 + 1px) 1px,\n\t\tcalc(var(--scrollbar-button-inner-size) * -1 + 2px) 2px;\n}\n\n::-webkit-scrollbar-button.vertical.increment.disabled {\n\tbackground-position: /* down arrow */\n\t\tcalc(9px * -0 + 1px) 1px,\n\t\tcalc(9px * -0 + 2px) 2px;\n\tbackground-position: /* down arrow */\n\t\tcalc(var(--scrollbar-button-inner-size) * -0 + 1px) 1px,\n\t\tcalc(var(--scrollbar-button-inner-size) * -0 + 2px) 2px;\n}\n\n::-webkit-scrollbar-button.horizontal.decrement {\n\tbackground-position: calc(9px * -3 + 1px) 1px;\n\tbackground-position: calc(var(--scrollbar-button-inner-size) * -3 + 1px) 1px;\n\t/* left */\n}\n\n::-webkit-scrollbar-button.horizontal.increment {\n\tbackground-position: calc(9px * -2 + 1px) 1px;\n\tbackground-position: calc(var(--scrollbar-button-inner-size) * -2 + 1px) 1px;\n\t/* right */\n}\n\n::-webkit-scrollbar-button.vertical.decrement {\n\tbackground-position: calc(9px * -1 + 1px) 1px;\n\tbackground-position: calc(var(--scrollbar-button-inner-size) * -1 + 1px) 1px;\n\t/* up */\n}\n\n::-webkit-scrollbar-button.vertical.increment {\n\tbackground-position: calc(9px * -0 + 1px) 1px;\n\tbackground-position: calc(var(--scrollbar-button-inner-size) * -0 + 1px) 1px;\n\t/* down */\n}\n::-webkit-scrollbar-button:hover:active {\n\tborder: 1px solid rgb(128, 128, 128);\n\tborder: 1px solid var(--ButtonShadow);\n\tbox-shadow: none;\n}\n::-webkit-scrollbar-button:disabled {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAYElEQVQ4T2NkGGSAcZC5h4EmDmpoaPjf0NBAlNnoauGaQBLooYXLUEIWwswi5Chs6lB8gewofI6BOZwWajCCFZ/viQ1FqoUQtRI4oShFtgdnGqKWYyg1h6icQKklpOgHAM9mQArEvm5+AAAAAElFTkSuQmCC\"), url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAYElEQVQ4T2NkGGSAcZC5h4EmDvr///9/RkZGosxGVwvXBJJADy1chhKyEGYWIUdhU4fiC2RH4XMMzOG0UIMRrPh8T2woUi2EqJXACUUpsj040xC1HEOpOUTlBEotIUU/AKXFQAqyTJ6DAAAAAElFTkSuQmCC\");\n\tbackground-image: var(--scrollbar-arrows-GrayText), var(--scrollbar-arrows-ButtonHilight);\n}\n\n::-webkit-scrollbar-button:horizontal:decrement:disabled {\n\tbackground-position: /* left arrow */\n\t\tcalc(9px * -3 + 1px) 1px,\n\t\tcalc(9px * -3 + 2px) 2px;\n\tbackground-position: /* left arrow */\n\t\tcalc(var(--scrollbar-button-inner-size) * -3 + 1px) 1px,\n\t\tcalc(var(--scrollbar-button-inner-size) * -3 + 2px) 2px;\n}\n::-webkit-scrollbar-button:horizontal:increment:disabled {\n\tbackground-position: /* right arrow */\n\t\tcalc(9px * -2 + 1px) 1px,\n\t\tcalc(9px * -2 + 2px) 2px;\n\tbackground-position: /* right arrow */\n\t\tcalc(var(--scrollbar-button-inner-size) * -2 + 1px) 1px,\n\t\tcalc(var(--scrollbar-button-inner-size) * -2 + 2px) 2px;\n}\n::-webkit-scrollbar-button:vertical:decrement:disabled {\n\tbackground-position: /* up arrow */\n\t\tcalc(9px * -1 + 1px) 1px,\n\t\tcalc(9px * -1 + 2px) 2px;\n\tbackground-position: /* up arrow */\n\t\tcalc(var(--scrollbar-button-inner-size) * -1 + 1px) 1px,\n\t\tcalc(var(--scrollbar-button-inner-size) * -1 + 2px) 2px;\n}\n::-webkit-scrollbar-button:vertical:increment:disabled {\n\tbackground-position: /* down arrow */\n\t\tcalc(9px * -0 + 1px) 1px,\n\t\tcalc(9px * -0 + 2px) 2px;\n\tbackground-position: /* down arrow */\n\t\tcalc(var(--scrollbar-button-inner-size) * -0 + 1px) 1px,\n\t\tcalc(var(--scrollbar-button-inner-size) * -0 + 2px) 2px;\n}\n\n::-webkit-scrollbar-button:horizontal:decrement.disabled {\n\tbackground-position: /* left arrow */\n\t\tcalc(9px * -3 + 1px) 1px,\n\t\tcalc(9px * -3 + 2px) 2px;\n\tbackground-position: /* left arrow */\n\t\tcalc(var(--scrollbar-button-inner-size) * -3 + 1px) 1px,\n\t\tcalc(var(--scrollbar-button-inner-size) * -3 + 2px) 2px;\n}\n\n::-webkit-scrollbar-button:horizontal:decrement {\n\tbackground-position: calc(9px * -3 + 1px) 1px;\n\tbackground-position: calc(var(--scrollbar-button-inner-size) * -3 + 1px) 1px;\n\t/* left */\n}\n::-webkit-scrollbar-button:horizontal:increment.disabled {\n\tbackground-position: /* right arrow */\n\t\tcalc(9px * -2 + 1px) 1px,\n\t\tcalc(9px * -2 + 2px) 2px;\n\tbackground-position: /* right arrow */\n\t\tcalc(var(--scrollbar-button-inner-size) * -2 + 1px) 1px,\n\t\tcalc(var(--scrollbar-button-inner-size) * -2 + 2px) 2px;\n}\n::-webkit-scrollbar-button:horizontal:increment {\n\tbackground-position: calc(9px * -2 + 1px) 1px;\n\tbackground-position: calc(var(--scrollbar-button-inner-size) * -2 + 1px) 1px;\n\t/* right */\n}\n::-webkit-scrollbar-button:vertical:decrement.disabled {\n\tbackground-position: /* up arrow */\n\t\tcalc(9px * -1 + 1px) 1px,\n\t\tcalc(9px * -1 + 2px) 2px;\n\tbackground-position: /* up arrow */\n\t\tcalc(var(--scrollbar-button-inner-size) * -1 + 1px) 1px,\n\t\tcalc(var(--scrollbar-button-inner-size) * -1 + 2px) 2px;\n}\n::-webkit-scrollbar-button:vertical:decrement {\n\tbackground-position: calc(9px * -1 + 1px) 1px;\n\tbackground-position: calc(var(--scrollbar-button-inner-size) * -1 + 1px) 1px;\n\t/* up */\n}\n::-webkit-scrollbar-button:vertical:increment.disabled {\n\tbackground-position: /* down arrow */\n\t\tcalc(9px * -0 + 1px) 1px,\n\t\tcalc(9px * -0 + 2px) 2px;\n\tbackground-position: /* down arrow */\n\t\tcalc(var(--scrollbar-button-inner-size) * -0 + 1px) 1px,\n\t\tcalc(var(--scrollbar-button-inner-size) * -0 + 2px) 2px;\n}\n::-webkit-scrollbar-button:vertical:increment {\n\tbackground-position: calc(9px * -0 + 1px) 1px;\n\tbackground-position: calc(var(--scrollbar-button-inner-size) * -0 + 1px) 1px;\n\t/* down */\n}\n\n::-webkit-scrollbar-track-piece:hover:active {\n\tbackground: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAG0lEQVQYV2P8/////4MHDzIwHjhw4L+9vT0DAHAFCj6esq3FAAAAAElFTkSuQmCC\") repeat;\n\tbackground: var(--checker) repeat;\n\timage-rendering: pixelated;\n\tbackground-color: white;\n\tbackground-blend-mode: difference;\n\t/* background-attachment: fixed; breaks the checkered background in chrome */\n}\n\n::-webkit-scrollbar-track-piece.increment {\n\tbackground-position: bottom;\n}\n::-webkit-scrollbar-track-piece:increment {\n\tbackground-position: bottom;\n}\n\n/* turn off double buttons */\n::-webkit-scrollbar-button:start:increment,\n::-webkit-scrollbar-button:end:decrement {\n\tdisplay: none;\n}\n\n/*# sourceMappingURL=windows-98.css.map */"
  },
  {
    "path": "lib/os-gui/build/windows-default.css",
    "content": ":root {\n\t/* These resources are generated. */\n\t/* JS: makeThemeCSSFile(renderThemeGraphics(getComputedStyle(document.documentElement))) */\n\t/* spell-checker: disable */\n\t--checker: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAG0lEQVQYV2P8/////4MHDzIwHjhw4L+9vT0DAHAFCj6esq3FAAAAAElFTkSuQmCC\");\n\t--button-active-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h192v192h-192v-192z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--button-normal-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--inset-deep-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--button-default-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22%20rgb(255%2C%20255%2C%20255)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h96v32h-64v64h-32v-96z%22%20fill%3D%22%20rgb(223%2C%20223%2C%20223)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M160%2064h32v128h-128v-32h96v-96z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M96%2096h64v64h-64v-64z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%09%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%22256%22%20height%3D%22256%22%20stroke-width%3D%2264%22%20stroke%3D%22%20rgb(0%2C%200%2C%200)%22%20fill%3D%22none%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 96 / 3px;\n\t--button-default-active-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22%20rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h192v192h-192v-192z%22%20fill%3D%22%20rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22%20rgb(192%2C%20192%2C%20192)%22%2F%3E%0A%09%09%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%22256%22%20height%3D%22256%22%20stroke-width%3D%2264%22%20stroke%3D%22%20rgb(0%2C%200%2C%200)%22%20fill%3D%22none%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--scrollbar-arrows-ButtonText: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAW0lEQVQ4T2NkGGSAcZC5h4FWDvrPwEC02ShqkR0EkkAHuBxMyEKYWYQ8jKEOXQOyo/A5BuZwqqvBZiA+3xMbilQLIWqlcUJRimwPzjRELcdQZA6hREeR4eRoBgBoXhAK6oiMhwAAAABJRU5ErkJggg==\");\n\t--scrollbar-arrows-GrayText: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAYElEQVQ4T2NkGGSAcZC5h4EmDmpoaPjf0NBAlNnoauGaQBLooYXLUEIWwswi5Chs6lB8gewofI6BOZwWajCCFZ/viQ1FqoUQtRI4oShFtgdnGqKWYyg1h6icQKklpOgHAM9mQArEvm5+AAAAAElFTkSuQmCC\");\n\t--scrollbar-arrows-ButtonHilight: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAYElEQVQ4T2NkGGSAcZC5h4EmDvr///9/RkZGosxGVwvXBJJADy1chhKyEGYWIUdhU4fiC2RH4XMMzOG0UIMRrPh8T2woUi2EqJXACUUpsj040xC1HEOpOUTlBEotIUU/AKXFQAqyTJ6DAAAAAElFTkSuQmCC\");\n\t/* spell-checker: enable */\n\t--scrollbar-size: 13px;\n\t--scrollbar-button-inner-size: 9px;\n\n\t/* Colors */\n\t--ActiveBorder: rgb(192, 192, 192);\n\t--ActiveTitle: rgb(0, 0, 128);\n\t--AppWorkspace: rgb(128, 128, 128);\n\t--Background: rgb(0, 128, 128);\n\t--ButtonAlternateFace: rgb(180, 180, 180);\n\t--ButtonDkShadow: rgb(0, 0, 0);\n\t--ButtonFace: rgb(192, 192, 192);\n\t--ButtonHilight: rgb(255, 255, 255);\n\t--ButtonLight: rgb(223, 223, 223);\n\t--ButtonShadow: rgb(128, 128, 128);\n\t--ButtonText: rgb(0, 0, 0);\n\t--GradientActiveTitle: rgb(16, 132, 208);\n\t--GradientInactiveTitle: rgb(181, 181, 181);\n\t--GrayText: rgb(128, 128, 128);\n\t--Hilight: rgb(0, 0, 128);\n\t--HilightText: rgb(255, 255, 255);\n\t--HotTrackingColor: rgb(0, 0, 255);\n\t--InactiveBorder: rgb(192, 192, 192);\n\t--InactiveTitle: rgb(128, 128, 128);\n\t--InactiveTitleText: rgb(192, 192, 192);\n\t--InfoText: rgb(0, 0, 0);\n\t--InfoWindow: rgb(255, 255, 225);\n\t--Menu: rgb(192, 192, 192);\n\t--MenuText: rgb(0, 0, 0);\n\t--Scrollbar: rgb(192, 192, 192);\n\t--TitleText: rgb(255, 255, 255);\n\t--Window: rgb(255, 255, 255);\n\t--WindowFrame: rgb(0, 0, 0);\n\t--WindowText: rgb(0, 0, 0);\n}\n\n/*# sourceMappingURL=windows-default.css.map */"
  },
  {
    "path": "lib/os-gui/os-gui.d.ts",
    "content": "interface OSGUIWindow {\n\t/**\n\t * Sets the title, or if `text` isn't passed, returns the current title of the window.\n\t * \n\t * Uses jQuery getter/setter function idiom.\n\t */\n\ttitle(text: string): OSGUI$Window;\n\ttitle(): string;\n\t// title(text?: string): OSGUI$Window | string; // union of overloads isn't helping\n\n\t/**\n\t * Returns the current title of the window. Alternative to `title()`.\n\t */\n\tgetTitle(): string;\n\n\t/**\n\t * Closes the window.\n\t */\n\tclose(force?: boolean): void;\n\n\t/**\n\t * Tries to focus something within the window, in this order of priority:\n\t * - The last focused control within the window\n\t * - A control with `class=\"default\"`\n\t * - If it's a tool window, the parent window\n\t * - and otherwise the window itself (specifically `$window.$content`)\n\t */\n\tfocus(): void;\n\n\t/**\n\t * Removes focus from the window. If focus is outside the window, it is left unchanged.\n\t */\n\tblur(): void;\n\n\t/**\n\t * Minimizes the window. If `$window.task.$task` is defined it will use that as a target for minimizing, otherwise the window will minimize to the bottom of the screen.\n\t */\n\tminimize(): void;\n\n\t/**\n\t * Restores the window from minimized state.\n\t */\n\tprivate unminimize(): void;\n\n\t/**\n\t * Maximizes the window. While maximized, the window will use `position: fixed`, so it will not scroll with the page.\n\t */\n\tmaximize(): void;\n\n\t/**\n\t * Restores the window from minimized or maximized state. If the window is not minimized or maximized, this method does nothing.\n\t */\n\trestore(): void;\n\n\t/**\n\t * Centers the window in the page.\n\t * You should call this after the contents of the window is fully rendered, or you've set a fixed size for the window.\n\t * If you have images in the window, wait for them to load before showing and centering the window, or define a fixed size for the images.\n\t */\n\tcenter(): void;\n\n\t/**\n\t * Fits the window within the page if it's partially offscreen.\n\t * (Doesn't resize the window if it's too large; it'll go off the right and bottom of the screen.)\n\t */\n\tapplyBounds(): void;\n\n\t/**\n\t * Repositions the window so that the title bar is within the bounds of the page, so it can be dragged.\n\t */\n\tbringTitleBarInBounds(): void;\n\n\t/**\n\t * Brings the window to the front by setting its `z-index` to larger than any `z-index` yet used by the windowing system.\n\t */\n\tbringToFront(): void;\n\n\t/**\n\t * Sets the size of the window. Pass `{ innerWidth, innerHeight }` to specify the size in terms of the window content, or `{ outerWidth, outerHeight }` to specify the size including the window frame.\n\t * (This may be expanded in the future to allow setting the position as well...)\n\t * (Also, the types could be loosened to allow mixing outer/inner for width/height, although that's a LITTLE bit questionable. Might have a use case, not sure.)\n\t */\n\tsetDimensions(dimensions: { innerWidth?: number; innerHeight?: number } | { outerWidth?: number; outerHeight?: number }): void;\n\t// setDimensions(dimensions: ({ innerWidth?: number } | { outerWidth?: number }) & ({ innerHeight?: number } | { outerHeight?: number })): void;\n\n\t/**\n\t * Changes the icon(s) of the window. `icons` is in the same format as `options.icons`.\n\t */\n\tsetIcons(icons: OSGUIIcons): void;\n\n\t/**\n\t * Sets the size of the window's title bar icon, picking the closest size that's available.\n\t */\n\tsetTitlebarIconSize(size: number): void;\n\n\t/**\n\t * Returns the size of the window's title bar icon.\n\t */\n\tgetTitlebarIconSize(): number;\n\n\t/**\n\t * Picks the closest icon size that's available, and returns a unique DOM node (i.e. cloned).\n\t * This can be used for representing the window in the taskbar.\n\t */\n\tgetIconAtSize(size: number): Node | null;\n\n\t/**\n\t * Appends the menu bar to the window, and sets the keyboard scope for the menu bar's hotkeys to the window.\n\t * Can be called with `null` to remove the menu bar.\n\t */\n\tsetMenuBar(menuBar: MenuBar | null): void;\n\n\t/**\n\t * The minimize target (taskbar button) represents the window when minimized, and is used for animating minimize and restore.\n\t * If `minimizeTargetElement` is `null`, the window will minimize to the bottom of the screen (the default).\n\t */\n\tsetMinimizeTarget(minimizeTargetElement: HTMLElement | null): void;\n\n\t/**\n\t * Creates a button in the window's content area.\n\t * It automatically closes the window when clicked. There's no (good) way to prevent this, as it's intended only for dialogs.\n\t * If you need any other behavior, just create a `<button>` and add it to the window's content area.\n\t * Returns a jQuery object.\n\t */\n\t$Button(text: string, action?: () => void): JQuery<HTMLButtonElement>;\n\n\t/**\n\t * Defines a window as a child. For tool windows, the focus state will be shared with the parent window.\n\t * \n\t * This is used internally when you set `options.parentWindow` when creating a window.\n\t */\n\tprivate addChildWindow(childWindow: OSGUI$Window): void;\n\n\t/**\n\t * Flying titlebar animation.\n\t */\n\tprivate animateTitlebar(from: DOMRect, to: DOMRect, callback: () => void): void;\n\n\t/**\n\t * Calls the listener when the window is (visually?) focused.\n\t * Returns a function to remove the listener.\n\t */\n\tprivate onFocus(listener: () => void): () => void;\n\n\n\t/**\n\t * Calls the listener when the window (visually?) loses focus.\n\t * Returns a function to remove the listener.\n\t */\n\tprivate onBlur(listener: () => void): () => void;\n\n\n\t/**\n\t * Calls the listener when the window is closed (after the close event is emitted, and if it wasn't prevented).\n\t * Returns a function to remove the listener.\n\t */\n\tprivate onClosed(listener: () => void): () => void;\n\n\t/**\n\t * *jQuery object.*  \n\t * Where you can append contents to the window.\n\t */\n\t$content: JQuery<HTMLElement>;\n\n\t/**\n\t * *jQuery object.*  \n\t * The titlebar of the window, including the title, window buttons, and possibly an icon.\n\t */\n\t$titlebar: JQuery<HTMLElement>;\n\n\t/**\n\t * *jQuery object.*  \n\t * Wrapper around the title. Don't use this. Use `$title` or `$titlebar` instead, if possible.\n\t */\n\tprivate $title_area: JQuery<HTMLElement>;\n\n\t/**\n\t * *jQuery object.*  \n\t * The title portion of the titlebar.\n\t */\n\t$title: JQuery<HTMLElement>;\n\n\t/**\n\t * *jQuery object.*  \n\t * The close button.\n\t */\n\t$x: JQuery<HTMLButtonElement>;\n\n\t/**\n\t * *jQuery object.*  \n\t * The minimize button.\n\t */\n\t$minimize: JQuery<HTMLButtonElement>;\n\n\t/**\n\t * *jQuery object.*  \n\t * The maximize button.\n\t */\n\t$maximize: JQuery<HTMLButtonElement>;\n\n\t/**\n\t * The DOM element that represents the window.\n\t */\n\telement: HTMLElement;\n\n\t/**\n\t * Whether the window has been closed.\n\t */\n\tclosed: boolean;\n\n\t/**\n\t * Icons representing the window at different sizes.\n\t */\n\ticons: OSGUIIcons;\n\n\t/**\n\t * The titlebar icon.\n\t */\n\tprivate $icon: JQuery<Node>;\n\n\t/**\n\t * @deprecated The titlebar icon name/ID.\n\t */\n\tprivate icon_name: string;\n\n\t/**\n\t * @deprecated Returns the titlebar icon name/ID.\n\t */\n\tgetIconName(): string;\n\n\t/**\n\t * @deprecated Sets the titlebar icon name/ID.\n\t */\n\tsetIconByID(id: string): void;\n\n\t/**\n\t * @deprecated Taskbar item.\n\t */\n\ttask: {\n\t\tupdateIcon(): void;\n\t\tupdateTitle(): void;\n\t};\n\n\tprivate _minimize_slot_index: number;\n}\n\n/**\n * A jQuery object extended with OS-GUI.js window methods and properties.\n * \n * This was a bad design decision.\n */\ntype OSGUI$Window = JQuery<HTMLElement & { $window: OSGUI$Window }> & OSGUIWindow;\n\n/**\n * A window with a form, for some kinds of dialogs.\n */\ninterface OSGUIFormWindow extends OSGUIWindow {\n\t$form: JQuery<HTMLFormElement>;\n\t$main: JQuery<HTMLDivElement>;\n\t$buttons: JQuery<HTMLDivElement>;\n\t/** @override This version of $Button() prevents the form from submitting and the window from closing. */\n\t$Button(text: string, action: () => void): JQuery<HTMLButtonElement>;\n}\n\n/**\n * A jQuery object extended with OS-GUI.js form form window methods and properties.\n * \n * This was a bad design decision.\n */\ntype OSGUI$FormWindow = JQuery<HTMLElement & { $window: OSGUI$FormWindow }> & OSGUIFormWindow;\n\n/**\n * Creates a new window.\n */\ninterface $WindowConstructor {\n\tnew(options?: OSGUIWindowOptions): OSGUI$Window;\n\t(options?: OSGUIWindowOptions): OSGUI$Window;\n\n\tDEBUG_FOCUS?: boolean;\n\tOVERRIDE_TRANSITION_DURATION?: number;\n\tZ_INDEX: number;\n}\n\n/**\n * Creates a new form window.\n */\nfunction $FormWindow(title: string): OSGUI$FormWindow;\n\ninterface OSGUIWindowOptions {\n\n\t/** Sets the initial window caption. */\n\ttitle?: string;\n\n\t/** Specifies the icon of the window at different sizes. Pass an object with keys that are sizes in pixels (or \"any\"), and values that are the URL of an image, or an object with `srcset` if you want support different pixel densities, or a DOM node if you want full control (e.g. to use an `<svg>` or a font icon or an emoji). */\n\ticons?: OSGUIIcons;\n\n\t/** If `true`, the window will be a tool window, which means it will not have a minimize or maximize button, and it will be shown as always focused by default. It will also have a smaller close button in the default styles. */\n\ttoolWindow?: boolean;\n\n\t/** If specified, the window will be a child of this window. For tool windows, the focus state will be shared with the parent window. */\n\tparentWindow?: OSGUI$Window;\n\n\t/** If set to `false`, the window will not have a maximize button. You cannot enable this if `toolWindow` is `true`. */\n\tmaximizeButton?: boolean;\n\n\t/** If set to `false`, the window will not have a minimize button. You cannot enable this if `toolWindow` is `true`. */\n\tminimizeButton?: boolean;\n\n\t/** If set to `false`, the window will not have a close button. */\n\tcloseButton?: boolean;\n\n\t/** If set to `true`, the window can be resized by the edges and corners. */\n\tresizable?: boolean;\n\n\t/** Specifies the initial width of the window, including borders. */\n\touterWidth?: number;\n\n\t/** Specifies the initial height of the window, including title bar, menu bar, and borders. */\n\touterHeight?: number;\n\n\t/** Specifies the initial width of the window contents, excluding borders. */\n\tinnerWidth?: number;\n\n\t/** Specifies the initial height of the window contents, excluding title bar, menu bar, and borders */\n\tinnerHeight?: number;\n\n\t/** The minimum outer width of the window (when resizing), in pixels. */\n\tminOuterWidth?: number;\n\n\t/** The minimum outer height of the window (when resizing), in pixels. */\n\tminOuterHeight?: number;\n\n\t/** The minimum width of the window contents (when resizing), in pixels. */\n\tminInnerWidth?: number;\n\n\t/** The minimum height of the window contents (when resizing), in pixels. */\n\tminInnerHeight?: number;\n\n\t/**\n\t * A function that can be used to constrain the window to a particular rectangle.\n\t * Takes and returns a rectangle object with `x`, `y`, `width`, and `height` properties.\n\t * `x_axis` and `y_axis` define what is being dragged `-1` for left and top, `1` for right and bottom,\n\t * and `0` for middle. Note that the window will always be constrained to not move past the minimum width and height.\n\t */\n\tconstrainRect?: (rect: { x: number; y: number; width: number; height: number }, x_axis: -1 | 0 | 1, y_axis: -1 | 0 | 1) => { x: number; y: number; width: number; height: number };\n\n\t/**\n\t * Contains options for controlling iframe integration.\n\t * \n\t * By default OS-GUI will try to enhance iframes with logic to:\n\t * - Show the window as focused when the iframe has focus (this even works for nested iframes!)\n\t * - Restore focus to controls in the iframe when refocusing the window (e.g. clicking the titlebar) (this even works for nested iframes!)\n\t */\n\tiframes?: {\n\n\t\t/** Set to true to silence cross-origin warnings for iframes within the window. Focus integration can't fully work with cross-origin iframes. There will be cases where the window is not shown as focused when clicking into the iframe, and focus can't be restored to controls within the iframe. */\n\t\tignoreCrossOrigin: boolean;\n\n\t};\n\n\t/** @deprecated */\n\t$component?: JQuery<HTMLElement> & { dock: () => void };\n\t/** @deprecated */\n\ticon?: string | { srcset: string } | Node;\n}\n\n/**\n * Specifies the icon of the window at different sizes.\n * \n * Pass an object with keys that are sizes in pixels (or \"any\"),\n * and values that are either:\n * - the URL of an image,\n * - or an object with `srcset` if you want support different pixel densities,\n * - or a DOM node if you want full control (e.g. to use an `<svg>` or a font icon or an emoji).\n */\ntype OSGUIIcons = { [size: string]: OSGUIIcon };\ntype OSGUIIcon = string | { src: string } | { srcset: string } | Node;\n\nconst MENU_DIVIDER = \"MENU_DIVIDER\";\n\ninterface OSGUICheckbox {\n\t/** A function to check whether the checkbox is checked. */\n\tcheck: () => boolean;\n\t/** A function to toggle something application-specific. */\n\ttoggle?: () => void;\n\t/** To create radio items, see the documentation on radio groups. Don't use this directly. */\n\tprivate type?: \"checkbox\" | \"radio\";\n}\n\ninterface OSGUIMenuItem {\n\t/** A label for the item; ampersands define access keys (to use a literal ampersand, use `&&`) */\n\tlabel: string;\n\t/**\n\t * A keyboard shortcut to show for the item, like \"Ctrl+A\"\n\t * (Note: you need to listen for the shortcut yourself, unlike access keys)\n\t */\n\tshortcutLabel?: string;\n\t/**\n\t * `aria-keyshortcuts` for the item, like \"Control+A Meta+A\", for screen readers.\n\t * \"Ctrl\" is not valid (you must spell it out), and it's best to provide an alternative for macOS,\n\t * usually with the equivalent Command key, using \"Meta\" (and `event.metaKey`).\n\t * https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-keyshortcuts\n\t */\n\tariaKeyShortcuts?: string;\n\t/** A function to execute when the item is clicked (exclusive with `checkbox`) */\n\taction?: () => void;\n\t/** An object defining checkbox behavior for the item (exclusive with `action`) */\n\tcheckbox?: OSGUICheckbox;\n\t/**\n\t * Can be `false` to unconditionally disable the item, or a function\n\t * that determines whether the item should be enabled, returning `true` to enable the item, `false` to disable.\n\t */\n\tenabled?: boolean | (() => boolean);\n\t/** An array of menu item specifications to create a submenu */\n\tsubmenu?: OSGUIMenuFragment[];\n\t/** For implementing a status bar. An `info` event is emitted when rolling over the item with this description. */\n\tdescription?: string;\n\n\t/** @deprecated A label for the item. Use `label` instead. */\n\titem?: string;\n\t/** @deprecated */\n\tshortcut?: string;\n}\n\ninterface OSGUIRadioItem extends OSGUIMenuItem {\n\t/** A value associated with the radio option; can be any type, but `===` is used to determine whether the item is checked. */\n\tvalue: any;\n}\n\ninterface OSGUIRadioGroup {\n\t/** an array of menu item specifications to create a radio button group. Unlike `submenu`, the items are included directly in this menu. It is recommended to separate the radio group from other menu items with a `MENU_DIVIDER`. */\n\tradioItems: OSGUIRadioItem[];\n\t/** a function that should return the value of the selected radio item. */\n\tgetValue: () => any;\n\t/** a function that should change the state to the given value, in an application-specific way. */\n\tsetValue: (value: any) => void;\n\t/** a string to use as the `aria-label` for the radio group (for screen reader accessibility) */\n\tariaLabel?: string;\n}\n\ninterface MenuBar {\n\t/** The DOM element that represents the menu bar. */\n\telement: HTMLElement;\n\t/** Closes any menus that are open. */\n\tcloseMenus(): void;\n\t/** Hotkeys like Alt will be handled at the level of the given element(s) or event target(s). */\n\tsetKeyboardScope(...elements: EventTarget[]): void;\n}\n\ntype OSGUIMenuFragment = OSGUIMenuItem | OSGUIRadioGroup | typeof MENU_DIVIDER;\n// I wish I didn't make the top level special, but it's an object instead of an array.\ntype OSGUITopLevelMenus = Record<string, OSGUIMenuFragment[]>;\n\ninterface MenuBarConstructor {\n\tnew(menus: OSGUITopLevelMenus): MenuBar;\n\t(menus: OSGUITopLevelMenus): MenuBar;\n}\n\n/** @deprecated use MenuBar instead of $MenuBar; jQuery is no longer required for menus. */\nfunction $MenuBar(menus: OSGUITopLevelMenus): JQuery<HTMLElement>;\n\nconst AccessKeys: AccessKeys;\ninterface AccessKeys {\n\t/** Escapes ampersands in a label by doubling them. */\n\tescape(label: string): string;\n\t/** Unescapes ampersands in a label by removing one of each pair. */\n\tunescape(label: string): string;\n\t/** Returns whether the label has an access key. */\n\thas(label: string): boolean;\n\t/** Returns the access key character, or `null` if there isn't one. */\n\tget(label: string): string | null;\n\t/** Returns plain text without access key indicator, like toText() but with a special case to remove parentheticals such as \" (&N)\" rather than just the ampersand. */\n\tremove(label: string): string;\n\t/** Returns plain text without access key syntax. Leaves the access key letter even if it's a separate part of the label like \"Foo (&1)\" which becomes \"Foo (1)\". */\n\ttoText(label: string): string;\n\t/** Returns HTML with `<span class=\"menu-hotkey\">` around the access key (uses `AccessKeys.toFragment` for security). */\n\ttoHTML(label: string): string;\n\t/** Returns a `DocumentFragment` with `<span class=\"menu-hotkey\">` wrapping the access key character. */\n\ttoFragment(label: string): DocumentFragment;\n\t/** Returns the index of the ampersand that defines an access key, or -1 if not present. */\n\tprivate indexOf(label: string): number;\n}\n\n\n// TODO: does CSSStyleDeclaration already satisfy the Record<string, string> type?\ntype CSSProps = Record<string, string> | CSSStyleDeclaration;\n\n/**\n * Parses an INI file string into CSS properties.\n * \n * Automatically renders dynamic theme graphics, and includes them in the CSS properties.\n */\nfunction parseThemeFileString(themeString: string): Record<string, string>;\n\n/**\n * Applies CSS properties to the DOM tree.\n * \n * `cssProperties` is an object with CSS properties and values. It can also be a `CSSStyleDeclaration` object.\n * \n * `element` is the element to apply the properties to.\n * \n * If `recurseIntoIframes` is true, then the properties will be applied to all `<iframe>` elements within the element as well.\n * This only works with same-origin iframes.\n */\nfunction applyCSSProperties(cssProperties: CSSProps, options?: { element?: HTMLElement, recurseIntoIframes?: boolean });\n\n/**\n * Can be used to update theme graphics (scrollbar icons, etc.) for a specific section of the page. Used by the demo to show variations.\n * \n * Returns CSS properties representing the rendered theme graphics.\n * \n * @example\n * ```js\n * element.style.setProperty('--scrollbar-size', '30px');\n * applyCSSProperties(renderThemeGraphics(getComputedStyle(element)), { element });\n * ```\n */\nfunction renderThemeGraphics(cssProperties: CSSProps): Record<string, string>;\n\n/**\n * Exports a CSS file for a theme. Assumes that the theme graphics are already rendered.\n * Includes a \"generated file\" comment.\n */\nfunction makeThemeCSSFile(cssProperties: CSSProps): string;\n\n/**\n * Initializes an SVG filter that can be used to make icons appear disabled.\n * It may not work with all icons, since it uses the black parts of the image to form a shape.\n * \n * @example Usage from CSS:\n * ```css\n * button:disabled .icon {\n * \tfilter: saturate(0%) opacity(50%); /* fallback until SVG filter is initialized *\\/\n * \tfilter: url(\"#os-gui-black-to-inset-filter\");\n * }\n * ```\n */\n\nfunction makeBlackToInsetFilter();\n\n\n// ESM when? maybe next major version\nconst MenuBar: MenuBarConstructor;\nconst $Window: $WindowConstructor;\ninterface Window {\n\t$Window: $WindowConstructor;\n\t$FormWindow: typeof $FormWindow;\n\tMenuBar: MenuBarConstructor;\n\t$MenuBar: typeof $MenuBar;\n\tMENU_DIVIDER: typeof MENU_DIVIDER;\n\tAccessKeys: typeof AccessKeys;\n\tparseThemeFileString: typeof parseThemeFileString;\n\tapplyCSSProperties: typeof applyCSSProperties;\n\trenderThemeGraphics: typeof renderThemeGraphics;\n\tmakeThemeCSSFile: typeof makeThemeCSSFile;\n\tmakeBlackToInsetFilter: typeof makeBlackToInsetFilter;\n\t// Provided by user (used by the library if present)\n\tget_direction?: () => \"ltr\" | \"rtl\";\n\tdebugKeepMenusOpen?: boolean;\n}"
  },
  {
    "path": "lib/os-gui/parse-theme.js",
    "content": "/**\n * @param {string} data \n * @returns {Record<string, string | Record<string, string>>}\n * @private\n */\nfunction parseINIString(data) {\n\tvar regex = {\n\t\tsection: /^\\s*\\[\\s*([^\\]]*)\\s*\\]\\s*$/,\n\t\tparam: /^\\s*([^=]+?)\\s*=\\s*(.*?)\\s*$/,\n\t\tcomment: /^\\s*;.*$/\n\t};\n\t/** @type {Record<string, string | Record<string, string>>} */\n\tvar value = {};\n\tvar lines = data.split(/[\\r\\n]+/);\n\t/** @type {string | null} */\n\tvar section = null;\n\tlines.forEach(function (line) {\n\t\tif (regex.comment.test(line)) {\n\t\t\treturn;\n\t\t} else if (regex.param.test(line)) {\n\t\t\tvar match = line.match(regex.param);\n\t\t\tif (section) {\n\t\t\t\t// @ts-ignore (could refactor to store section as an object, and use match result instead of test)\n\t\t\t\tvalue[section][match[1]] = match[2];\n\t\t\t} else {\n\t\t\t\t// @ts-ignore (could refactor to use match result instead of test)\n\t\t\t\tvalue[match[1]] = match[2];\n\t\t\t}\n\t\t} else if (regex.section.test(line)) {\n\t\t\tvar match = line.match(regex.section);\n\t\t\t// @ts-ignore (could refactor to use match result instead of test)\n\t\t\tvalue[match[1]] = {};\n\t\t\t// @ts-ignore (could refactor to use match result instead of test)\n\t\t\tsection = match[1];\n\t\t} else if (line.length == 0 && section) {\n\t\t\t// REALLY?? An empty line resets the section?? Dubious!\n\t\t\t// What does Windows do?\n\t\t\tsection = null;\n\t\t};\n\t});\n\treturn value;\n}\n\n/**\n * @param {Record<string, string> | CSSStyleDeclaration} cssProperties\n * @returns {Record<string, string>}\n */\nfunction renderThemeGraphics(cssProperties) {\n\t/**\n\t * @param {string} propName \n\t * @returns {string}\n\t */\n\tvar getProp = (propName) => typeof cssProperties.getPropertyValue === \"function\" ? cssProperties.getPropertyValue(propName) : /** @type {Record<string, string>} */(cssProperties)[propName];\n\n\tvar canvas = document.createElement(\"canvas\");\n\tcanvas.width = canvas.height = 2;\n\tvar ctx = canvas.getContext(\"2d\");\n\tif (!ctx) {\n\t\tconsole.error(\"Failed to get 2d context for canvas to render theme graphics\");\n\t\treturn {};\n\t}\n\tctx.fillStyle = getProp(\"--ButtonFace\");\n\tctx.fillRect(0, 1, 1, 1);\n\tctx.fillRect(1, 0, 1, 1);\n\tctx.fillStyle = getProp(\"--ButtonHilight\");\n\tctx.fillRect(0, 0, 1, 1);\n\tctx.fillRect(1, 1, 1, 1);\n\tvar checker = `url(\"${canvas.toDataURL()}\")`;\n\n\tvar scrollbar_size = parseInt(getProp(\"--scrollbar-size\"));\n\tif (!isFinite(scrollbar_size)) {\n\t\tscrollbar_size = 13;\n\t}\n\tvar scrollbar_button_inner_size = scrollbar_size - 4;\n\n\t// I don't know the exact formula, so approximate and special-case it for now\n\t// (It may very well *be* special cased, tho)\n\tvar arrow_size = Math.floor(0.3 * scrollbar_size);\n\tif (scrollbar_size < 16 && scrollbar_size > 13) arrow_size -= 1;\n\n\tvar arrow_width = arrow_size * 2 - 1;\n\n\tvar arrow_canvas = document.createElement(\"canvas\");\n\tvar arrow_ctx = arrow_canvas.getContext(\"2d\");\n\tif (!arrow_ctx) {\n\t\tconsole.error(\"Failed to get 2d context for canvas to render arrow graphics for theme\");\n\t\treturn {};\n\t}\n\tarrow_canvas.width = arrow_width;\n\tarrow_canvas.height = arrow_size;\n\tarrow_ctx.fillStyle = \"white\";\n\tfor (let y = 0; y < arrow_size; y += 1) {\n\t\tfor (let x = y; x < arrow_width - y; x += 1) {\n\t\t\tarrow_ctx.fillRect(x, y, 1, 1);\n\t\t}\n\t}\n\n\tcanvas.width = scrollbar_button_inner_size * 4;\n\tcanvas.height = scrollbar_button_inner_size;\n\tlet i = 0;\n\tfor (let horizontal = 0; horizontal < 2; horizontal += 1) {\n\t\tfor (let decrement = 0; decrement < 2; decrement += 1) {\n\t\t\tctx.save();\n\t\t\tctx.translate(i * scrollbar_button_inner_size, 0);\n\t\t\tctx.translate(scrollbar_button_inner_size / 2, scrollbar_button_inner_size / 2);\n\t\t\t// ctx.rotate(i * Math.PI / 2);\n\t\t\tif (horizontal) {\n\t\t\t\tctx.rotate(-Math.PI / 2);\n\t\t\t}\n\t\t\tif (decrement) {\n\t\t\t\tctx.scale(1, -1);\n\t\t\t}\n\t\t\tctx.translate(-scrollbar_button_inner_size / 2, -scrollbar_button_inner_size / 2);\n\t\t\tctx.drawImage(arrow_canvas, ~~(scrollbar_button_inner_size / 2 - arrow_width / 2), ~~(scrollbar_button_inner_size / 2 - arrow_size / 2));\n\t\t\tctx.restore();\n\t\t\ti += 1;\n\t\t}\n\t}\n\n\tctx.save();\n\tctx.globalCompositeOperation = \"source-in\";\n\tctx.fillStyle = getProp(\"--ButtonText\");\n\tctx.fillRect(0, 0, canvas.width, canvas.height);\n\tvar scrollbar_arrows_ButtonText = `url(\"${canvas.toDataURL()}\")`;\n\tctx.fillStyle = getProp(\"--GrayText\");\n\tctx.fillRect(0, 0, canvas.width, canvas.height);\n\tvar scrollbar_arrows_GrayText = `url(\"${canvas.toDataURL()}\")`;\n\tctx.fillStyle = getProp(\"--ButtonHilight\");\n\tctx.fillRect(0, 0, canvas.width, canvas.height);\n\tvar scrollbar_arrows_ButtonHilight = `url(\"${canvas.toDataURL()}\")`;\n\t// ctx.fillStyle = \"red\";\n\t// ctx.fillRect(0, 0, canvas.width, canvas.height);\n\t// canvas.style.background = \"rgba(0, 0, 0, 0.2)\";\n\t// $(\"h1\").append(arrow_canvas).append(canvas);\n\tctx.restore();\n\n\t/**\n\t * @param {number} border_size \n\t * @param {string} svg_contents\n\t * @returns {string}\n\t */\n\tfunction border_image(border_size, svg_contents) {\n\t\tvar base_size = 8;\n\t\tvar border_size = border_size;\n\t\tvar scale = 32;\n\t\tvar slice_size = border_size * scale;\n\t\tvar view_size = base_size * scale;\n\t\t// transform causes janky buggy garbage\n\t\t// var svg = `<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"${view_size}px\" height=\"${view_size}px\" viewBox=\"0 0 ${view_size} ${view_size}\">\n\t\t// \t<g transform=\"scale(${scale})\">\n\t\t// \t\t${svg_contents}\n\t\t// \t</g>\n\t\t// </svg>`;\n\t\tvar svg = `<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"${view_size}px\" height=\"${view_size}px\" viewBox=\"0 0 ${view_size} ${view_size}\">\n\t\t\t${svg_contents.replace(/(d|x|y|width|height|stroke-width)=\"[^\"]*\"/g, (attr) => attr.replace(/\\d+/g, (n) => `${Number(n) * scale}`))}\n\t\t</svg>`;\n\t\tvar url = `data:image/svg+xml,${encodeURIComponent(svg)}`;\n\t\treturn `url(\"${url}\") ${slice_size} / ${border_size}px`;\n\t}\n\n\tvar button_active_border_image = border_image(2, `\n\t\t<path d=\"M0 0h8v8h-8v-8z\" fill=\"${getProp(\"--ButtonDkShadow\")}\"/>\n\t\t<path d=\"M1 1h6v6h-6v-6z\" fill=\"${getProp(\"--ButtonShadow\")}\"/>\n\t\t<path d=\"M2 2h4v4h-4v-4z\" fill=\"${getProp(\"--ButtonFace\")}\"/>\n\t`);\n\tvar button_default_active_border_image = border_image(2, `\n\t\t<path d=\"M0 0h8v8h-8v-8z\" fill=\"${getProp(\"--ButtonDkShadow\")}\"/>\n\t\t<path d=\"M1 1h6v6h-6v-6z\" fill=\"${getProp(\"--ButtonShadow\")}\"/>\n\t\t<path d=\"M2 2h4v4h-4v-4z\" fill=\"${getProp(\"--ButtonFace\")}\"/>\n\t\t<rect x=\"0\" y=\"0\" width=\"8\" height=\"8\" stroke-width=\"2\" stroke=\"${getProp(\"--WindowFrame\")}\" fill=\"none\"/>\n\t`);\n\t// TODO: rename\n\tvar button_normal_border_image = border_image(2, `\n\t\t<path d=\"M0 0h7v1h-6v6h-1v-7z\" fill=\"${getProp(\"--ButtonHilight\")}\"/>\n\t\t<path d=\"M7 0h1v8h-8v-1h7v-7z\" fill=\"${getProp(\"--ButtonDkShadow\")}\"/>\n\t\t<path d=\"M1 1h5v1h-4v4h-1v-5z\" fill=\"${getProp(\"--ButtonLight\")}\"/>\n\t\t<path d=\"M6 1h1v6h-6v-1h5v-5z\" fill=\"${getProp(\"--ButtonShadow\")}\"/>\n\t\t<path d=\"M2 2h4v4h-4v-4z\" fill=\"${getProp(\"--ButtonFace\")}\"/>\n\t`);\n\tvar inset_deep_border_image = border_image(2, `\n\t\t<path d=\"M0 0h7v1h-6v6h-1v-7z\" fill=\"${getProp(\"--ButtonDkShadow\")}\"/>\n\t\t<path d=\"M7 0h1v8h-8v-1h7v-7z\" fill=\"${getProp(\"--ButtonHilight\")}\"/>\n\t\t<path d=\"M1 1h5v1h-4v4h-1v-5z\" fill=\"${getProp(\"--ButtonShadow\")}\"/>\n\t\t<path d=\"M6 1h1v6h-6v-1h5v-5z\" fill=\"${getProp(\"--ButtonLight\")}\"/>\n\t\t<path d=\"M2 2h4v4h-4v-4z\" fill=\"${getProp(\"--ButtonFace\")}\"/>\n\t`);\n\tvar button_default_border_image = border_image(3, `\n\t\t<path d=\"M0 0h8v8h-8v-8z\" fill=\"${getProp(\"--ButtonDkShadow\")}\"/>\n\t\t<path d=\"M1 1h5v1h-4v4h-1v-5z\" fill=\"${getProp(\"--ButtonHilight\")}\"/>\n\t\t<path d=\"M2 2h3v1h-2v2h-1v-3z\" fill=\"${getProp(\"--ButtonLight\")}\"/>\n\t\t<path d=\"M5 2h1v4h-4v-1h3v-3z\" fill=\"${getProp(\"--ButtonShadow\")}\"/>\n\t\t<path d=\"M3 3h2v2h-2v-2z\" fill=\"${getProp(\"--ButtonFace\")}\"/>\n\t\t<rect x=\"0\" y=\"0\" width=\"8\" height=\"8\" stroke-width=\"2\" stroke=\"${getProp(\"--WindowFrame\")}\" fill=\"none\"/>\n\t`);\n\n\treturn {\n\t\t\"--checker\": checker,\n\t\t\"--button-active-border-image\": button_active_border_image,\n\t\t\"--button-normal-border-image\": button_normal_border_image,\n\t\t\"--inset-deep-border-image\": inset_deep_border_image,\n\t\t\"--button-default-border-image\": button_default_border_image,\n\t\t\"--button-default-active-border-image\": button_default_active_border_image,\n\t\t\"--scrollbar-arrows-ButtonText\": scrollbar_arrows_ButtonText,\n\t\t\"--scrollbar-arrows-GrayText\": scrollbar_arrows_GrayText,\n\t\t\"--scrollbar-arrows-ButtonHilight\": scrollbar_arrows_ButtonHilight,\n\t\t\"--scrollbar-size\": `${scrollbar_size}px`,\n\t\t\"--scrollbar-button-inner-size\": `${scrollbar_button_inner_size}px`,\n\t};\n}\n\n/**\n * @param {HTMLElement} element \n * @returns {Record<string, string>}\n * @private\n */\nfunction getThemeCSSProperties(element) {\n\tconst keys = [\n\t\t\"--checker\",\n\t\t\"--button-active-border-image\",\n\t\t\"--button-normal-border-image\",\n\t\t\"--inset-deep-border-image\",\n\t\t\"--button-default-border-image\",\n\t\t\"--button-default-active-border-image\",\n\t\t\"--scrollbar-arrows-ButtonText\",\n\t\t\"--scrollbar-arrows-GrayText\",\n\t\t\"--scrollbar-arrows-ButtonHilight\",\n\t\t\"--scrollbar-size\",\n\t\t\"--scrollbar-button-inner-size\",\n\t\t\"--ActiveBorder\",\n\t\t\"--ActiveTitle\",\n\t\t\"--AppWorkspace\",\n\t\t\"--Background\",\n\t\t\"--ButtonAlternateFace\",\n\t\t\"--ButtonDkShadow\",\n\t\t\"--ButtonFace\",\n\t\t\"--ButtonHilight\",\n\t\t\"--ButtonLight\",\n\t\t\"--ButtonShadow\",\n\t\t\"--ButtonText\",\n\t\t\"--GradientActiveTitle\",\n\t\t\"--GradientInactiveTitle\",\n\t\t\"--GrayText\",\n\t\t\"--Hilight\",\n\t\t\"--HilightText\",\n\t\t\"--HotTrackingColor\",\n\t\t\"--InactiveBorder\",\n\t\t\"--InactiveTitle\",\n\t\t\"--InactiveTitleText\",\n\t\t\"--InfoText\",\n\t\t\"--InfoWindow\",\n\t\t\"--Menu\",\n\t\t\"--MenuText\",\n\t\t\"--Scrollbar\",\n\t\t\"--TitleText\",\n\t\t\"--Window\",\n\t\t\"--WindowFrame\",\n\t\t\"--WindowText\",\n\t];\n\tconst style = window.getComputedStyle(element);\n\t/** @type {Record<string, string>} */\n\tconst result = {};\n\tfor (const key of keys) {\n\t\tresult[key] = style.getPropertyValue(key);\n\t}\n\treturn result;\n}\n\n/**\n * @param {HTMLElement} target \n * @param {HTMLElement} source \n * @private\n */\nfunction inheritTheme(target, source) {\n\tapplyCSSProperties(getThemeCSSProperties(source), { element: target, recurseIntoIframes: true });\n}\n\n// Parse NonClientMetrics\n// https://docs.microsoft.com/en-us/windows/win32/controls/themesfileformat-overview?redirectedfrom=MSDN#metrics-section\n// https://docs.microsoft.com/en-us/windows/win32/winprog/windows-data-types\n\n// using https://github.com/toji/js-struct\n\n// var NonClientMetricsStruct = Struct.create(\n//     Struct.uint32(\"cbSize\"),\n//     Struct.int32(\"iBorderWidth\"),\n//     Struct.int32(\"iScrollWidth\"),\n//     Struct.int32(\"iScrollHeight\"),\n//     Struct.int32(\"iCaptionWidth\"),\n//     Struct.int32(\"iCaptionHeight\"),\n// \t// after that, it may be W or A\n// //   LOGFONTW lfCaptionFont;\n// //   int      iSmCaptionWidth;\n// //   int      iSmCaptionHeight;\n// //   LOGFONTW lfSmCaptionFont;\n// //   int      iMenuWidth;\n// //   int      iMenuHeight;\n// //   LOGFONTW lfMenuFont;\n// //   LOGFONTW lfStatusFont;\n// //   LOGFONTW lfMessageFont;\n// //   int      iPaddedBorderWidth;\n// );\n\n// var NonClientMetrics_buffer = new Uint8Array(NonClientMetrics_string.split(\" \").map((str)=> parseInt(str))).buffer;\n\n// NonClientMetricsStruct.readStructs(NonClientMetrics_buffer, 0, 1)[0];\n\n/**\n * @param {string} themeIni \n * @returns {Record<string, string> | undefined}\n */\nfunction parseThemeFileString(themeIni) {\n\t// .theme is a renamed .ini text file\n\t// .themepack is a renamed .cab file, and parsing it as .ini seems to work well enough for the most part, as the .ini data appears in plain,\n\t// but it may not if compression is enabled for the .cab file\n\tvar theme = parseINIString(themeIni);\n\tvar colors = theme[\"Control Panel\\\\Colors\"];\n\tif (!colors) {\n\t\talert(\"Invalid theme file, no [Control Panel\\\\Colors] section\");\n\t\tconsole.log(theme);\n\t\treturn;\n\t}\n\tif (typeof colors !== \"object\") {\n\t\talert(\"Invalid theme file, 'Control Panel\\\\Colors' is not a section\");\n\t\tconsole.log(theme);\n\t\treturn;\n\t}\n\tfor (var k in colors) {\n\t\t// for .themepack file support, just ignore bad keys that were parsed\n\t\tif (k.match(/\\W/)) {\n\t\t\tdelete colors[k];\n\t\t} else {\n\t\t\tcolors[k] = `rgb(${colors[k].split(\" \").join(\", \")})`;\n\t\t}\n\t}\n\n\t/** @type {Record<string, string>} */\n\tvar cssProperties = {};\n\tfor (var k in colors) {\n\t\tcssProperties[`--${k}`] = colors[k];\n\t}\n\n\tcssProperties = Object.assign(renderThemeGraphics(cssProperties), cssProperties);\n\n\treturn cssProperties;\n}\n\n/**\n * @param {Record<string, string> | CSSStyleDeclaration} cssProperties\n * @param {{ element?: HTMLElement, recurseIntoIframes?: boolean } | HTMLElement} [options]\n */\nfunction applyCSSProperties(cssProperties, options = {}) {\n\t// @TODO: clean up deprecated argument handling\n\t/** @type {HTMLElement} */\n\tlet element;\n\t/** @type {boolean} */\n\tlet recurseIntoIframes;\n\tif (\"tagName\" in options) {\n\t\tconsole.warn(\"deprecated: use options argument to applyCSSProperties, e.g. applyCSSProperties(cssProperties, { element: document.documentElement, recurseIntoIframes: true })\");\n\t\telement = options;\n\t\trecurseIntoIframes = false;\n\t} else {\n\t\t({ element = document.documentElement, recurseIntoIframes = false } = options);\n\t}\n\n\t/**\n\t * @param {string} propName \n\t * @returns {string}\n\t */\n\tvar getProp = (propName) => typeof cssProperties.getPropertyValue === \"function\" ? cssProperties.getPropertyValue(propName) : /** @type {Record<string, string>} */(cssProperties)[propName];\n\tfor (var k in cssProperties) {\n\t\telement.style.setProperty(k, getProp(k));\n\t}\n\t// iframe theme propagation\n\tif (recurseIntoIframes) {\n\t\tvar iframes = element.querySelectorAll(\"iframe\");\n\t\tfor (var i = 0; i < iframes.length; i++) {\n\t\t\ttry {\n\t\t\t\tapplyCSSProperties(cssProperties, { element: iframes[i].contentDocument?.documentElement, recurseIntoIframes: true });\n\t\t\t} catch (error) {\n\t\t\t\t// ignore\n\t\t\t\t// @TODO: share warning with $Window's iframe handling\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * @param {Record<string, string>} cssProperties\n * @returns {string}\n */\nfunction makeThemeCSSFile(cssProperties) {\n\tvar css = `\n/* This is a generated file. */\n/* spell-checker: disable */\n:root {\n`;\n\tfor (var k in cssProperties) {\n\t\tcss += `\\t${k}: ${cssProperties[k]};\\n`;\n\t}\n\tcss += `}\n`;\n\treturn css;\n}\n\n// @TODO: should this be part of theme graphics generation?\n// I want to figure out a better way to do dynamic theme features,\n// where it works with the CSS cascade as much as possible\nfunction makeBlackToInsetFilter() {\n\tif (document.getElementById(\"os-gui-black-to-inset-filter\")) {\n\t\treturn;\n\t}\n\tconst svg_xml = `\n\t\t<svg style=\"position: absolute; pointer-events: none; bottom: 100%;\">\n\t\t\t<defs>\n\t\t\t\t<filter id=\"os-gui-black-to-inset-filter\" x=\"0\" y=\"0\" width=\"1px\" height=\"1px\">\n\t\t\t\t\t<feColorMatrix\n\t\t\t\t\t\tin=\"SourceGraphic\"\n\t\t\t\t\t\ttype=\"matrix\"\n\t\t\t\t\t\tvalues=\"\n\t\t\t\t\t\t\t1 0 0 0 0\n\t\t\t\t\t\t\t0 1 0 0 0\n\t\t\t\t\t\t\t0 0 1 0 0\n\t\t\t\t\t\t\t-1000 -1000 -1000 1 0\n\t\t\t\t\t\t\"\n\t\t\t\t\t\tresult=\"black-parts-isolated\"\n\t\t\t\t\t/>\n\t\t\t\t\t<feFlood result=\"shadow-color\" flood-color=\"var(--ButtonShadow)\"/>\n\t\t\t\t\t<feFlood result=\"hilight-color\" flood-color=\"var(--ButtonHilight)\"/>\n\t\t\t\t\t<feOffset in=\"black-parts-isolated\" dx=\"1\" dy=\"1\" result=\"offset\"/>\n\t\t\t\t\t<feComposite in=\"hilight-color\" in2=\"offset\" operator=\"in\" result=\"hilight-colored-offset\"/>\n\t\t\t\t\t<feComposite in=\"shadow-color\" in2=\"black-parts-isolated\" operator=\"in\" result=\"shadow-colored\"/>\n\t\t\t\t\t<feMerge>\n\t\t\t\t\t\t<feMergeNode in=\"hilight-colored-offset\"/>\n\t\t\t\t\t\t<feMergeNode in=\"shadow-colored\"/>\n\t\t\t\t\t</feMerge>\n\t\t\t\t</filter>\n\t\t\t</defs>\n\t\t</svg>\n\t`;\n\tconst $svg = $(svg_xml);\n\t$svg.appendTo(\"body\");\n}\n"
  },
  {
    "path": "lib/os-gui.patch",
    "content": "diff --git a/lib/os-gui/$Window.js b/lib/os-gui/$Window.js\nindex 7c785c54..bb776126 100644\n--- a/lib/os-gui/$Window.js\n+++ b/lib/os-gui/$Window.js\n@@ -1,3 +1,4 @@\n+/*eslint-disable*/\n ((exports) => {\n \n // TODO: E\\(\"([a-z]+)\"\\) -> \"<$1>\" or get rid of jQuery as a dependency\n@@ -341,7 +342,9 @@ function $Window(options) {\n \t\t\t\tshowAsFocused();\n \t\t\t}\n \t\t}\n-\t} else {\n+\t}\n+\t/*else - PATCHED; I want focus tracking in a tool window; @TODO: dissolve the concept of a \"tool window\" */\n+\t{\n \t\t// global focusout is needed, to continue showing as focused while child windows or menu popups are focused (@TODO: Is this redundant with focusin?)\n \t\t// global focusin is needed, to show as focused when a child window becomes focused (when perhaps nothing was focused before, so no focusout event)\n \t\t// global blur is needed, to show as focused when an iframe gets focus, because focusin/out doesn't fire at all in that case\n@@ -463,7 +466,9 @@ function $Window(options) {\n \n \t\t\t\t// console.log(`[${$w.title()}] (is_root=${is_root})`, `outside_or_at_exactly=${outside_or_at_exactly}`, `firmly_outside=${firmly_outside}`);\n \t\t\t\tif (firmly_outside && is_root) {\n-\t\t\t\t\tstopShowingAsFocused();\n+\t\t\t\t\tif (!options.toolWindow) { // PATCHED\n+\t\t\t\t\t\tstopShowingAsFocused();\n+\t\t\t\t\t}\n \t\t\t\t}\n \t\t\t\tif (\n \t\t\t\t\t!outside_or_at_exactly &&\n@@ -540,7 +545,9 @@ function $Window(options) {\n \t\t\t\t\tnewly_focused.window !== newly_focused && // cross-frame test for Window object\n \t\t\t\t\tcontainer_node.contains(newly_focused)\n \t\t\t\t) {\n-\t\t\t\t\tshowAsFocused();\n+\t\t\t\t\tif (!options.toolWindow) { // PATCHED\n+\t\t\t\t\t\tshowAsFocused();\n+\t\t\t\t\t}\n \t\t\t\t\t$w.bringToFront();\n \t\t\t\t\tif (!is_root) {\n \t\t\t\t\t\t// trigger focusin events for iframes\n@@ -558,7 +565,9 @@ function $Window(options) {\n \t\t\t\t\t\t}\n \t\t\t\t\t}\n \t\t\t\t} else if (is_root) {\n-\t\t\t\t\tstopShowingAsFocused();\n+\t\t\t\t\tif (!options.toolWindow) { // PATCHED\n+\t\t\t\t\t\tstopShowingAsFocused();\n+\t\t\t\t\t}\n \t\t\t\t}\n \t\t\t}\n \t\t}\n"
  },
  {
    "path": "lib/pdf.js/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n"
  },
  {
    "path": "lib/pdf.js/build/pdf.js",
    "content": "/**\n * @licstart The following is the entire license notice for the\n * Javascript code in this page\n *\n * Copyright 2021 Mozilla Foundation\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 * @licend The above is the entire license notice for the\n * Javascript code in this page\n */\n\n(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(\"pdfjs-dist/build/pdf\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"pdfjs-dist/build/pdf\"] = factory();\n\telse\n\t\troot[\"pdfjs-dist/build/pdf\"] = root.pdfjsLib = factory();\n})(this, function() {\nreturn /******/ (() => { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \tvar __webpack_modules__ = ([\n/* 0 */,\n/* 1 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.addLinkAttributes = addLinkAttributes;\nexports.deprecated = deprecated;\nexports.getFilenameFromUrl = getFilenameFromUrl;\nexports.getPdfFilenameFromUrl = getPdfFilenameFromUrl;\nexports.isDataScheme = isDataScheme;\nexports.isFetchSupported = isFetchSupported;\nexports.isPdfFile = isPdfFile;\nexports.isValidFetchUrl = isValidFetchUrl;\nexports.loadScript = loadScript;\nexports.StatTimer = exports.RenderingCancelledException = exports.PDFDateString = exports.PageViewport = exports.LinkTarget = exports.DOMSVGFactory = exports.DOMCMapReaderFactory = exports.DOMCanvasFactory = exports.DEFAULT_LINK_REL = exports.BaseCMapReaderFactory = exports.BaseCanvasFactory = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nconst DEFAULT_LINK_REL = \"noopener noreferrer nofollow\";\nexports.DEFAULT_LINK_REL = DEFAULT_LINK_REL;\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nclass BaseCanvasFactory {\n  constructor() {\n    if (this.constructor === BaseCanvasFactory) {\n      (0, _util.unreachable)(\"Cannot initialize BaseCanvasFactory.\");\n    }\n  }\n\n  create(width, height) {\n    (0, _util.unreachable)(\"Abstract method `create` called.\");\n  }\n\n  reset(canvasAndContext, width, height) {\n    if (!canvasAndContext.canvas) {\n      throw new Error(\"Canvas is not specified\");\n    }\n\n    if (width <= 0 || height <= 0) {\n      throw new Error(\"Invalid canvas size\");\n    }\n\n    canvasAndContext.canvas.width = width;\n    canvasAndContext.canvas.height = height;\n  }\n\n  destroy(canvasAndContext) {\n    if (!canvasAndContext.canvas) {\n      throw new Error(\"Canvas is not specified\");\n    }\n\n    canvasAndContext.canvas.width = 0;\n    canvasAndContext.canvas.height = 0;\n    canvasAndContext.canvas = null;\n    canvasAndContext.context = null;\n  }\n\n}\n\nexports.BaseCanvasFactory = BaseCanvasFactory;\n\nclass DOMCanvasFactory extends BaseCanvasFactory {\n  constructor({\n    ownerDocument = globalThis.document\n  } = {}) {\n    super();\n    this._document = ownerDocument;\n  }\n\n  create(width, height) {\n    if (width <= 0 || height <= 0) {\n      throw new Error(\"Invalid canvas size\");\n    }\n\n    const canvas = this._document.createElement(\"canvas\");\n\n    const context = canvas.getContext(\"2d\");\n    canvas.width = width;\n    canvas.height = height;\n    return {\n      canvas,\n      context\n    };\n  }\n\n}\n\nexports.DOMCanvasFactory = DOMCanvasFactory;\n\nclass BaseCMapReaderFactory {\n  constructor({\n    baseUrl = null,\n    isCompressed = false\n  }) {\n    if (this.constructor === BaseCMapReaderFactory) {\n      (0, _util.unreachable)(\"Cannot initialize BaseCMapReaderFactory.\");\n    }\n\n    this.baseUrl = baseUrl;\n    this.isCompressed = isCompressed;\n  }\n\n  async fetch({\n    name\n  }) {\n    if (!this.baseUrl) {\n      throw new Error('The CMap \"baseUrl\" parameter must be specified, ensure that ' + 'the \"cMapUrl\" and \"cMapPacked\" API parameters are provided.');\n    }\n\n    if (!name) {\n      throw new Error(\"CMap name must be specified.\");\n    }\n\n    const url = this.baseUrl + name + (this.isCompressed ? \".bcmap\" : \"\");\n    const compressionType = this.isCompressed ? _util.CMapCompressionType.BINARY : _util.CMapCompressionType.NONE;\n    return this._fetchData(url, compressionType).catch(reason => {\n      throw new Error(`Unable to load ${this.isCompressed ? \"binary \" : \"\"}CMap at: ${url}`);\n    });\n  }\n\n  _fetchData(url, compressionType) {\n    (0, _util.unreachable)(\"Abstract method `_fetchData` called.\");\n  }\n\n}\n\nexports.BaseCMapReaderFactory = BaseCMapReaderFactory;\n\nclass DOMCMapReaderFactory extends BaseCMapReaderFactory {\n  _fetchData(url, compressionType) {\n    if (isFetchSupported() && isValidFetchUrl(url, document.baseURI)) {\n      return fetch(url).then(async response => {\n        if (!response.ok) {\n          throw new Error(response.statusText);\n        }\n\n        let cMapData;\n\n        if (this.isCompressed) {\n          cMapData = new Uint8Array(await response.arrayBuffer());\n        } else {\n          cMapData = (0, _util.stringToBytes)(await response.text());\n        }\n\n        return {\n          cMapData,\n          compressionType\n        };\n      });\n    }\n\n    return new Promise((resolve, reject) => {\n      const request = new XMLHttpRequest();\n      request.open(\"GET\", url, true);\n\n      if (this.isCompressed) {\n        request.responseType = \"arraybuffer\";\n      }\n\n      request.onreadystatechange = () => {\n        if (request.readyState !== XMLHttpRequest.DONE) {\n          return;\n        }\n\n        if (request.status === 200 || request.status === 0) {\n          let cMapData;\n\n          if (this.isCompressed && request.response) {\n            cMapData = new Uint8Array(request.response);\n          } else if (!this.isCompressed && request.responseText) {\n            cMapData = (0, _util.stringToBytes)(request.responseText);\n          }\n\n          if (cMapData) {\n            resolve({\n              cMapData,\n              compressionType\n            });\n            return;\n          }\n        }\n\n        reject(new Error(request.statusText));\n      };\n\n      request.send(null);\n    });\n  }\n\n}\n\nexports.DOMCMapReaderFactory = DOMCMapReaderFactory;\n\nclass DOMSVGFactory {\n  create(width, height) {\n    (0, _util.assert)(width > 0 && height > 0, \"Invalid SVG dimensions\");\n    const svg = document.createElementNS(SVG_NS, \"svg:svg\");\n    svg.setAttribute(\"version\", \"1.1\");\n    svg.setAttribute(\"width\", width + \"px\");\n    svg.setAttribute(\"height\", height + \"px\");\n    svg.setAttribute(\"preserveAspectRatio\", \"none\");\n    svg.setAttribute(\"viewBox\", \"0 0 \" + width + \" \" + height);\n    return svg;\n  }\n\n  createElement(type) {\n    (0, _util.assert)(typeof type === \"string\", \"Invalid SVG element type\");\n    return document.createElementNS(SVG_NS, type);\n  }\n\n}\n\nexports.DOMSVGFactory = DOMSVGFactory;\n\nclass PageViewport {\n  constructor({\n    viewBox,\n    scale,\n    rotation,\n    offsetX = 0,\n    offsetY = 0,\n    dontFlip = false\n  }) {\n    this.viewBox = viewBox;\n    this.scale = scale;\n    this.rotation = rotation;\n    this.offsetX = offsetX;\n    this.offsetY = offsetY;\n    const centerX = (viewBox[2] + viewBox[0]) / 2;\n    const centerY = (viewBox[3] + viewBox[1]) / 2;\n    let rotateA, rotateB, rotateC, rotateD;\n    rotation %= 360;\n\n    if (rotation < 0) {\n      rotation += 360;\n    }\n\n    switch (rotation) {\n      case 180:\n        rotateA = -1;\n        rotateB = 0;\n        rotateC = 0;\n        rotateD = 1;\n        break;\n\n      case 90:\n        rotateA = 0;\n        rotateB = 1;\n        rotateC = 1;\n        rotateD = 0;\n        break;\n\n      case 270:\n        rotateA = 0;\n        rotateB = -1;\n        rotateC = -1;\n        rotateD = 0;\n        break;\n\n      case 0:\n        rotateA = 1;\n        rotateB = 0;\n        rotateC = 0;\n        rotateD = -1;\n        break;\n\n      default:\n        throw new Error(\"PageViewport: Invalid rotation, must be a multiple of 90 degrees.\");\n    }\n\n    if (dontFlip) {\n      rotateC = -rotateC;\n      rotateD = -rotateD;\n    }\n\n    let offsetCanvasX, offsetCanvasY;\n    let width, height;\n\n    if (rotateA === 0) {\n      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;\n      width = Math.abs(viewBox[3] - viewBox[1]) * scale;\n      height = Math.abs(viewBox[2] - viewBox[0]) * scale;\n    } else {\n      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;\n      width = Math.abs(viewBox[2] - viewBox[0]) * scale;\n      height = Math.abs(viewBox[3] - viewBox[1]) * scale;\n    }\n\n    this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY];\n    this.width = width;\n    this.height = height;\n  }\n\n  clone({\n    scale = this.scale,\n    rotation = this.rotation,\n    offsetX = this.offsetX,\n    offsetY = this.offsetY,\n    dontFlip = false\n  } = {}) {\n    return new PageViewport({\n      viewBox: this.viewBox.slice(),\n      scale,\n      rotation,\n      offsetX,\n      offsetY,\n      dontFlip\n    });\n  }\n\n  convertToViewportPoint(x, y) {\n    return _util.Util.applyTransform([x, y], this.transform);\n  }\n\n  convertToViewportRectangle(rect) {\n    const topLeft = _util.Util.applyTransform([rect[0], rect[1]], this.transform);\n\n    const bottomRight = _util.Util.applyTransform([rect[2], rect[3]], this.transform);\n\n    return [topLeft[0], topLeft[1], bottomRight[0], bottomRight[1]];\n  }\n\n  convertToPdfPoint(x, y) {\n    return _util.Util.applyInverseTransform([x, y], this.transform);\n  }\n\n}\n\nexports.PageViewport = PageViewport;\n\nclass RenderingCancelledException extends _util.BaseException {\n  constructor(msg, type) {\n    super(msg);\n    this.type = type;\n  }\n\n}\n\nexports.RenderingCancelledException = RenderingCancelledException;\nconst LinkTarget = {\n  NONE: 0,\n  SELF: 1,\n  BLANK: 2,\n  PARENT: 3,\n  TOP: 4\n};\nexports.LinkTarget = LinkTarget;\n\nfunction addLinkAttributes(link, {\n  url,\n  target,\n  rel,\n  enabled = true\n} = {}) {\n  (0, _util.assert)(url && typeof url === \"string\", 'addLinkAttributes: A valid \"url\" parameter must provided.');\n  const urlNullRemoved = (0, _util.removeNullCharacters)(url);\n\n  if (enabled) {\n    link.href = link.title = urlNullRemoved;\n  } else {\n    link.href = \"\";\n    link.title = `Disabled: ${urlNullRemoved}`;\n\n    link.onclick = () => {\n      return false;\n    };\n  }\n\n  let targetStr = \"\";\n\n  switch (target) {\n    case LinkTarget.NONE:\n      break;\n\n    case LinkTarget.SELF:\n      targetStr = \"_self\";\n      break;\n\n    case LinkTarget.BLANK:\n      targetStr = \"_blank\";\n      break;\n\n    case LinkTarget.PARENT:\n      targetStr = \"_parent\";\n      break;\n\n    case LinkTarget.TOP:\n      targetStr = \"_top\";\n      break;\n  }\n\n  link.target = targetStr;\n  link.rel = typeof rel === \"string\" ? rel : DEFAULT_LINK_REL;\n}\n\nfunction isDataScheme(url) {\n  const ii = url.length;\n  let i = 0;\n\n  while (i < ii && url[i].trim() === \"\") {\n    i++;\n  }\n\n  return url.substring(i, i + 5).toLowerCase() === \"data:\";\n}\n\nfunction isPdfFile(filename) {\n  return typeof filename === \"string\" && /\\.pdf$/i.test(filename);\n}\n\nfunction getFilenameFromUrl(url) {\n  const anchor = url.indexOf(\"#\");\n  const query = url.indexOf(\"?\");\n  const end = Math.min(anchor > 0 ? anchor : url.length, query > 0 ? query : url.length);\n  return url.substring(url.lastIndexOf(\"/\", end) + 1, end);\n}\n\nfunction getPdfFilenameFromUrl(url, defaultFilename = \"document.pdf\") {\n  if (typeof url !== \"string\") {\n    return defaultFilename;\n  }\n\n  if (isDataScheme(url)) {\n    (0, _util.warn)('getPdfFilenameFromUrl: ignore \"data:\"-URL for performance reasons.');\n    return defaultFilename;\n  }\n\n  const reURI = /^(?:(?:[^:]+:)?\\/\\/[^/]+)?([^?#]*)(\\?[^#]*)?(#.*)?$/;\n  const reFilename = /[^/?#=]+\\.pdf\\b(?!.*\\.pdf\\b)/i;\n  const splitURI = reURI.exec(url);\n  let suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]);\n\n  if (suggestedFilename) {\n    suggestedFilename = suggestedFilename[0];\n\n    if (suggestedFilename.includes(\"%\")) {\n      try {\n        suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0];\n      } catch (ex) {}\n    }\n  }\n\n  return suggestedFilename || defaultFilename;\n}\n\nclass StatTimer {\n  constructor() {\n    this.started = Object.create(null);\n    this.times = [];\n  }\n\n  time(name) {\n    if (name in this.started) {\n      (0, _util.warn)(`Timer is already running for ${name}`);\n    }\n\n    this.started[name] = Date.now();\n  }\n\n  timeEnd(name) {\n    if (!(name in this.started)) {\n      (0, _util.warn)(`Timer has not been started for ${name}`);\n    }\n\n    this.times.push({\n      name,\n      start: this.started[name],\n      end: Date.now()\n    });\n    delete this.started[name];\n  }\n\n  toString() {\n    const outBuf = [];\n    let longest = 0;\n\n    for (const time of this.times) {\n      const name = time.name;\n\n      if (name.length > longest) {\n        longest = name.length;\n      }\n    }\n\n    for (const time of this.times) {\n      const duration = time.end - time.start;\n      outBuf.push(`${time.name.padEnd(longest)} ${duration}ms\\n`);\n    }\n\n    return outBuf.join(\"\");\n  }\n\n}\n\nexports.StatTimer = StatTimer;\n\nfunction isFetchSupported() {\n  return typeof fetch !== \"undefined\" && typeof Response !== \"undefined\" && \"body\" in Response.prototype && typeof ReadableStream !== \"undefined\";\n}\n\nfunction isValidFetchUrl(url, baseUrl) {\n  try {\n    const {\n      protocol\n    } = baseUrl ? new URL(url, baseUrl) : new URL(url);\n    return protocol === \"http:\" || protocol === \"https:\";\n  } catch (ex) {\n    return false;\n  }\n}\n\nfunction loadScript(src, removeScriptElement = false) {\n  return new Promise((resolve, reject) => {\n    const script = document.createElement(\"script\");\n    script.src = src;\n\n    script.onload = function (evt) {\n      if (removeScriptElement) {\n        script.remove();\n      }\n\n      resolve(evt);\n    };\n\n    script.onerror = function () {\n      reject(new Error(`Cannot load script at: ${script.src}`));\n    };\n\n    (document.head || document.documentElement).appendChild(script);\n  });\n}\n\nfunction deprecated(details) {\n  console.log(\"Deprecated API usage: \" + details);\n}\n\nlet pdfDateStringRegex;\n\nclass PDFDateString {\n  static toDateObject(input) {\n    if (!input || !(0, _util.isString)(input)) {\n      return null;\n    }\n\n    if (!pdfDateStringRegex) {\n      pdfDateStringRegex = new RegExp(\"^D:\" + \"(\\\\d{4})\" + \"(\\\\d{2})?\" + \"(\\\\d{2})?\" + \"(\\\\d{2})?\" + \"(\\\\d{2})?\" + \"(\\\\d{2})?\" + \"([Z|+|-])?\" + \"(\\\\d{2})?\" + \"'?\" + \"(\\\\d{2})?\" + \"'?\");\n    }\n\n    const matches = pdfDateStringRegex.exec(input);\n\n    if (!matches) {\n      return null;\n    }\n\n    const year = parseInt(matches[1], 10);\n    let month = parseInt(matches[2], 10);\n    month = month >= 1 && month <= 12 ? month - 1 : 0;\n    let day = parseInt(matches[3], 10);\n    day = day >= 1 && day <= 31 ? day : 1;\n    let hour = parseInt(matches[4], 10);\n    hour = hour >= 0 && hour <= 23 ? hour : 0;\n    let minute = parseInt(matches[5], 10);\n    minute = minute >= 0 && minute <= 59 ? minute : 0;\n    let second = parseInt(matches[6], 10);\n    second = second >= 0 && second <= 59 ? second : 0;\n    const universalTimeRelation = matches[7] || \"Z\";\n    let offsetHour = parseInt(matches[8], 10);\n    offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0;\n    let offsetMinute = parseInt(matches[9], 10) || 0;\n    offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0;\n\n    if (universalTimeRelation === \"-\") {\n      hour += offsetHour;\n      minute += offsetMinute;\n    } else if (universalTimeRelation === \"+\") {\n      hour -= offsetHour;\n      minute -= offsetMinute;\n    }\n\n    return new Date(Date.UTC(year, month, day, hour, minute, second));\n  }\n\n}\n\nexports.PDFDateString = PDFDateString;\n\n/***/ }),\n/* 2 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.arrayByteLength = arrayByteLength;\nexports.arraysToBytes = arraysToBytes;\nexports.assert = assert;\nexports.bytesToString = bytesToString;\nexports.createObjectURL = createObjectURL;\nexports.createPromiseCapability = createPromiseCapability;\nexports.createValidAbsoluteUrl = createValidAbsoluteUrl;\nexports.escapeString = escapeString;\nexports.getModificationDate = getModificationDate;\nexports.getVerbosityLevel = getVerbosityLevel;\nexports.info = info;\nexports.isArrayBuffer = isArrayBuffer;\nexports.isArrayEqual = isArrayEqual;\nexports.isAscii = isAscii;\nexports.isBool = isBool;\nexports.isNum = isNum;\nexports.isSameOrigin = isSameOrigin;\nexports.isString = isString;\nexports.objectFromMap = objectFromMap;\nexports.objectSize = objectSize;\nexports.removeNullCharacters = removeNullCharacters;\nexports.setVerbosityLevel = setVerbosityLevel;\nexports.shadow = shadow;\nexports.string32 = string32;\nexports.stringToBytes = stringToBytes;\nexports.stringToPDFString = stringToPDFString;\nexports.stringToUTF16BEString = stringToUTF16BEString;\nexports.stringToUTF8String = stringToUTF8String;\nexports.unreachable = unreachable;\nexports.utf8StringToString = utf8StringToString;\nexports.warn = warn;\nexports.VerbosityLevel = exports.Util = exports.UNSUPPORTED_FEATURES = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.TextRenderingMode = exports.StreamType = exports.PermissionFlag = exports.PasswordResponses = exports.PasswordException = exports.PageActionEventType = exports.OPS = exports.MissingPDFException = exports.IsLittleEndianCached = exports.IsEvalSupportedCached = exports.InvalidPDFException = exports.ImageKind = exports.IDENTITY_MATRIX = exports.FormatError = exports.FontType = exports.FONT_IDENTITY_MATRIX = exports.DocumentActionEventType = exports.CMapCompressionType = exports.BaseException = exports.AnnotationType = exports.AnnotationStateModelType = exports.AnnotationReviewState = exports.AnnotationReplyType = exports.AnnotationMarkedState = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationBorderStyleType = exports.AnnotationActionEventType = exports.AbortException = void 0;\n\n__w_pdfjs_require__(3);\n\nconst IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];\nexports.IDENTITY_MATRIX = IDENTITY_MATRIX;\nconst FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];\nexports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX;\nconst PermissionFlag = {\n  PRINT: 0x04,\n  MODIFY_CONTENTS: 0x08,\n  COPY: 0x10,\n  MODIFY_ANNOTATIONS: 0x20,\n  FILL_INTERACTIVE_FORMS: 0x100,\n  COPY_FOR_ACCESSIBILITY: 0x200,\n  ASSEMBLE: 0x400,\n  PRINT_HIGH_QUALITY: 0x800\n};\nexports.PermissionFlag = PermissionFlag;\nconst TextRenderingMode = {\n  FILL: 0,\n  STROKE: 1,\n  FILL_STROKE: 2,\n  INVISIBLE: 3,\n  FILL_ADD_TO_PATH: 4,\n  STROKE_ADD_TO_PATH: 5,\n  FILL_STROKE_ADD_TO_PATH: 6,\n  ADD_TO_PATH: 7,\n  FILL_STROKE_MASK: 3,\n  ADD_TO_PATH_FLAG: 4\n};\nexports.TextRenderingMode = TextRenderingMode;\nconst ImageKind = {\n  GRAYSCALE_1BPP: 1,\n  RGB_24BPP: 2,\n  RGBA_32BPP: 3\n};\nexports.ImageKind = ImageKind;\nconst AnnotationType = {\n  TEXT: 1,\n  LINK: 2,\n  FREETEXT: 3,\n  LINE: 4,\n  SQUARE: 5,\n  CIRCLE: 6,\n  POLYGON: 7,\n  POLYLINE: 8,\n  HIGHLIGHT: 9,\n  UNDERLINE: 10,\n  SQUIGGLY: 11,\n  STRIKEOUT: 12,\n  STAMP: 13,\n  CARET: 14,\n  INK: 15,\n  POPUP: 16,\n  FILEATTACHMENT: 17,\n  SOUND: 18,\n  MOVIE: 19,\n  WIDGET: 20,\n  SCREEN: 21,\n  PRINTERMARK: 22,\n  TRAPNET: 23,\n  WATERMARK: 24,\n  THREED: 25,\n  REDACT: 26\n};\nexports.AnnotationType = AnnotationType;\nconst AnnotationStateModelType = {\n  MARKED: \"Marked\",\n  REVIEW: \"Review\"\n};\nexports.AnnotationStateModelType = AnnotationStateModelType;\nconst AnnotationMarkedState = {\n  MARKED: \"Marked\",\n  UNMARKED: \"Unmarked\"\n};\nexports.AnnotationMarkedState = AnnotationMarkedState;\nconst AnnotationReviewState = {\n  ACCEPTED: \"Accepted\",\n  REJECTED: \"Rejected\",\n  CANCELLED: \"Cancelled\",\n  COMPLETED: \"Completed\",\n  NONE: \"None\"\n};\nexports.AnnotationReviewState = AnnotationReviewState;\nconst AnnotationReplyType = {\n  GROUP: \"Group\",\n  REPLY: \"R\"\n};\nexports.AnnotationReplyType = AnnotationReplyType;\nconst AnnotationFlag = {\n  INVISIBLE: 0x01,\n  HIDDEN: 0x02,\n  PRINT: 0x04,\n  NOZOOM: 0x08,\n  NOROTATE: 0x10,\n  NOVIEW: 0x20,\n  READONLY: 0x40,\n  LOCKED: 0x80,\n  TOGGLENOVIEW: 0x100,\n  LOCKEDCONTENTS: 0x200\n};\nexports.AnnotationFlag = AnnotationFlag;\nconst AnnotationFieldFlag = {\n  READONLY: 0x0000001,\n  REQUIRED: 0x0000002,\n  NOEXPORT: 0x0000004,\n  MULTILINE: 0x0001000,\n  PASSWORD: 0x0002000,\n  NOTOGGLETOOFF: 0x0004000,\n  RADIO: 0x0008000,\n  PUSHBUTTON: 0x0010000,\n  COMBO: 0x0020000,\n  EDIT: 0x0040000,\n  SORT: 0x0080000,\n  FILESELECT: 0x0100000,\n  MULTISELECT: 0x0200000,\n  DONOTSPELLCHECK: 0x0400000,\n  DONOTSCROLL: 0x0800000,\n  COMB: 0x1000000,\n  RICHTEXT: 0x2000000,\n  RADIOSINUNISON: 0x2000000,\n  COMMITONSELCHANGE: 0x4000000\n};\nexports.AnnotationFieldFlag = AnnotationFieldFlag;\nconst AnnotationBorderStyleType = {\n  SOLID: 1,\n  DASHED: 2,\n  BEVELED: 3,\n  INSET: 4,\n  UNDERLINE: 5\n};\nexports.AnnotationBorderStyleType = AnnotationBorderStyleType;\nconst AnnotationActionEventType = {\n  E: \"Mouse Enter\",\n  X: \"Mouse Exit\",\n  D: \"Mouse Down\",\n  U: \"Mouse Up\",\n  Fo: \"Focus\",\n  Bl: \"Blur\",\n  PO: \"PageOpen\",\n  PC: \"PageClose\",\n  PV: \"PageVisible\",\n  PI: \"PageInvisible\",\n  K: \"Keystroke\",\n  F: \"Format\",\n  V: \"Validate\",\n  C: \"Calculate\"\n};\nexports.AnnotationActionEventType = AnnotationActionEventType;\nconst DocumentActionEventType = {\n  WC: \"WillClose\",\n  WS: \"WillSave\",\n  DS: \"DidSave\",\n  WP: \"WillPrint\",\n  DP: \"DidPrint\"\n};\nexports.DocumentActionEventType = DocumentActionEventType;\nconst PageActionEventType = {\n  O: \"PageOpen\",\n  C: \"PageClose\"\n};\nexports.PageActionEventType = PageActionEventType;\nconst StreamType = {\n  UNKNOWN: \"UNKNOWN\",\n  FLATE: \"FLATE\",\n  LZW: \"LZW\",\n  DCT: \"DCT\",\n  JPX: \"JPX\",\n  JBIG: \"JBIG\",\n  A85: \"A85\",\n  AHX: \"AHX\",\n  CCF: \"CCF\",\n  RLX: \"RLX\"\n};\nexports.StreamType = StreamType;\nconst FontType = {\n  UNKNOWN: \"UNKNOWN\",\n  TYPE1: \"TYPE1\",\n  TYPE1C: \"TYPE1C\",\n  CIDFONTTYPE0: \"CIDFONTTYPE0\",\n  CIDFONTTYPE0C: \"CIDFONTTYPE0C\",\n  TRUETYPE: \"TRUETYPE\",\n  CIDFONTTYPE2: \"CIDFONTTYPE2\",\n  TYPE3: \"TYPE3\",\n  OPENTYPE: \"OPENTYPE\",\n  TYPE0: \"TYPE0\",\n  MMTYPE1: \"MMTYPE1\"\n};\nexports.FontType = FontType;\nconst VerbosityLevel = {\n  ERRORS: 0,\n  WARNINGS: 1,\n  INFOS: 5\n};\nexports.VerbosityLevel = VerbosityLevel;\nconst CMapCompressionType = {\n  NONE: 0,\n  BINARY: 1,\n  STREAM: 2\n};\nexports.CMapCompressionType = CMapCompressionType;\nconst OPS = {\n  dependency: 1,\n  setLineWidth: 2,\n  setLineCap: 3,\n  setLineJoin: 4,\n  setMiterLimit: 5,\n  setDash: 6,\n  setRenderingIntent: 7,\n  setFlatness: 8,\n  setGState: 9,\n  save: 10,\n  restore: 11,\n  transform: 12,\n  moveTo: 13,\n  lineTo: 14,\n  curveTo: 15,\n  curveTo2: 16,\n  curveTo3: 17,\n  closePath: 18,\n  rectangle: 19,\n  stroke: 20,\n  closeStroke: 21,\n  fill: 22,\n  eoFill: 23,\n  fillStroke: 24,\n  eoFillStroke: 25,\n  closeFillStroke: 26,\n  closeEOFillStroke: 27,\n  endPath: 28,\n  clip: 29,\n  eoClip: 30,\n  beginText: 31,\n  endText: 32,\n  setCharSpacing: 33,\n  setWordSpacing: 34,\n  setHScale: 35,\n  setLeading: 36,\n  setFont: 37,\n  setTextRenderingMode: 38,\n  setTextRise: 39,\n  moveText: 40,\n  setLeadingMoveText: 41,\n  setTextMatrix: 42,\n  nextLine: 43,\n  showText: 44,\n  showSpacedText: 45,\n  nextLineShowText: 46,\n  nextLineSetSpacingShowText: 47,\n  setCharWidth: 48,\n  setCharWidthAndBounds: 49,\n  setStrokeColorSpace: 50,\n  setFillColorSpace: 51,\n  setStrokeColor: 52,\n  setStrokeColorN: 53,\n  setFillColor: 54,\n  setFillColorN: 55,\n  setStrokeGray: 56,\n  setFillGray: 57,\n  setStrokeRGBColor: 58,\n  setFillRGBColor: 59,\n  setStrokeCMYKColor: 60,\n  setFillCMYKColor: 61,\n  shadingFill: 62,\n  beginInlineImage: 63,\n  beginImageData: 64,\n  endInlineImage: 65,\n  paintXObject: 66,\n  markPoint: 67,\n  markPointProps: 68,\n  beginMarkedContent: 69,\n  beginMarkedContentProps: 70,\n  endMarkedContent: 71,\n  beginCompat: 72,\n  endCompat: 73,\n  paintFormXObjectBegin: 74,\n  paintFormXObjectEnd: 75,\n  beginGroup: 76,\n  endGroup: 77,\n  beginAnnotations: 78,\n  endAnnotations: 79,\n  beginAnnotation: 80,\n  endAnnotation: 81,\n  paintJpegXObject: 82,\n  paintImageMaskXObject: 83,\n  paintImageMaskXObjectGroup: 84,\n  paintImageXObject: 85,\n  paintInlineImageXObject: 86,\n  paintInlineImageXObjectGroup: 87,\n  paintImageXObjectRepeat: 88,\n  paintImageMaskXObjectRepeat: 89,\n  paintSolidColorImageMask: 90,\n  constructPath: 91\n};\nexports.OPS = OPS;\nconst UNSUPPORTED_FEATURES = {\n  unknown: \"unknown\",\n  forms: \"forms\",\n  javaScript: \"javaScript\",\n  smask: \"smask\",\n  shadingPattern: \"shadingPattern\",\n  font: \"font\",\n  errorTilingPattern: \"errorTilingPattern\",\n  errorExtGState: \"errorExtGState\",\n  errorXObject: \"errorXObject\",\n  errorFontLoadType3: \"errorFontLoadType3\",\n  errorFontState: \"errorFontState\",\n  errorFontMissing: \"errorFontMissing\",\n  errorFontTranslate: \"errorFontTranslate\",\n  errorColorSpace: \"errorColorSpace\",\n  errorOperatorList: \"errorOperatorList\",\n  errorFontToUnicode: \"errorFontToUnicode\",\n  errorFontLoadNative: \"errorFontLoadNative\",\n  errorFontGetPath: \"errorFontGetPath\",\n  errorMarkedContent: \"errorMarkedContent\"\n};\nexports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES;\nconst PasswordResponses = {\n  NEED_PASSWORD: 1,\n  INCORRECT_PASSWORD: 2\n};\nexports.PasswordResponses = PasswordResponses;\nlet verbosity = VerbosityLevel.WARNINGS;\n\nfunction setVerbosityLevel(level) {\n  if (Number.isInteger(level)) {\n    verbosity = level;\n  }\n}\n\nfunction getVerbosityLevel() {\n  return verbosity;\n}\n\nfunction info(msg) {\n  if (verbosity >= VerbosityLevel.INFOS) {\n    console.log(`Info: ${msg}`);\n  }\n}\n\nfunction warn(msg) {\n  if (verbosity >= VerbosityLevel.WARNINGS) {\n    console.log(`Warning: ${msg}`);\n  }\n}\n\nfunction unreachable(msg) {\n  throw new Error(msg);\n}\n\nfunction assert(cond, msg) {\n  if (!cond) {\n    unreachable(msg);\n  }\n}\n\nfunction isSameOrigin(baseUrl, otherUrl) {\n  let base;\n\n  try {\n    base = new URL(baseUrl);\n\n    if (!base.origin || base.origin === \"null\") {\n      return false;\n    }\n  } catch (e) {\n    return false;\n  }\n\n  const other = new URL(otherUrl, base);\n  return base.origin === other.origin;\n}\n\nfunction _isValidProtocol(url) {\n  if (!url) {\n    return false;\n  }\n\n  switch (url.protocol) {\n    case \"http:\":\n    case \"https:\":\n    case \"ftp:\":\n    case \"mailto:\":\n    case \"tel:\":\n      return true;\n\n    default:\n      return false;\n  }\n}\n\nfunction createValidAbsoluteUrl(url, baseUrl) {\n  if (!url) {\n    return null;\n  }\n\n  try {\n    const absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url);\n\n    if (_isValidProtocol(absoluteUrl)) {\n      return absoluteUrl;\n    }\n  } catch (ex) {}\n\n  return null;\n}\n\nfunction shadow(obj, prop, value) {\n  Object.defineProperty(obj, prop, {\n    value,\n    enumerable: true,\n    configurable: true,\n    writable: false\n  });\n  return value;\n}\n\nconst BaseException = function BaseExceptionClosure() {\n  function BaseException(message) {\n    if (this.constructor === BaseException) {\n      unreachable(\"Cannot initialize BaseException.\");\n    }\n\n    this.message = message;\n    this.name = this.constructor.name;\n  }\n\n  BaseException.prototype = new Error();\n  BaseException.constructor = BaseException;\n  return BaseException;\n}();\n\nexports.BaseException = BaseException;\n\nclass PasswordException extends BaseException {\n  constructor(msg, code) {\n    super(msg);\n    this.code = code;\n  }\n\n}\n\nexports.PasswordException = PasswordException;\n\nclass UnknownErrorException extends BaseException {\n  constructor(msg, details) {\n    super(msg);\n    this.details = details;\n  }\n\n}\n\nexports.UnknownErrorException = UnknownErrorException;\n\nclass InvalidPDFException extends BaseException {}\n\nexports.InvalidPDFException = InvalidPDFException;\n\nclass MissingPDFException extends BaseException {}\n\nexports.MissingPDFException = MissingPDFException;\n\nclass UnexpectedResponseException extends BaseException {\n  constructor(msg, status) {\n    super(msg);\n    this.status = status;\n  }\n\n}\n\nexports.UnexpectedResponseException = UnexpectedResponseException;\n\nclass FormatError extends BaseException {}\n\nexports.FormatError = FormatError;\n\nclass AbortException extends BaseException {}\n\nexports.AbortException = AbortException;\nconst NullCharactersRegExp = /\\x00/g;\n\nfunction removeNullCharacters(str) {\n  if (typeof str !== \"string\") {\n    warn(\"The argument for removeNullCharacters must be a string.\");\n    return str;\n  }\n\n  return str.replace(NullCharactersRegExp, \"\");\n}\n\nfunction bytesToString(bytes) {\n  assert(bytes !== null && typeof bytes === \"object\" && bytes.length !== undefined, \"Invalid argument for bytesToString\");\n  const length = bytes.length;\n  const MAX_ARGUMENT_COUNT = 8192;\n\n  if (length < MAX_ARGUMENT_COUNT) {\n    return String.fromCharCode.apply(null, bytes);\n  }\n\n  const strBuf = [];\n\n  for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) {\n    const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);\n    const chunk = bytes.subarray(i, chunkEnd);\n    strBuf.push(String.fromCharCode.apply(null, chunk));\n  }\n\n  return strBuf.join(\"\");\n}\n\nfunction stringToBytes(str) {\n  assert(typeof str === \"string\", \"Invalid argument for stringToBytes\");\n  const length = str.length;\n  const bytes = new Uint8Array(length);\n\n  for (let i = 0; i < length; ++i) {\n    bytes[i] = str.charCodeAt(i) & 0xff;\n  }\n\n  return bytes;\n}\n\nfunction arrayByteLength(arr) {\n  if (arr.length !== undefined) {\n    return arr.length;\n  }\n\n  assert(arr.byteLength !== undefined, \"arrayByteLength - invalid argument.\");\n  return arr.byteLength;\n}\n\nfunction arraysToBytes(arr) {\n  const length = arr.length;\n\n  if (length === 1 && arr[0] instanceof Uint8Array) {\n    return arr[0];\n  }\n\n  let resultLength = 0;\n\n  for (let i = 0; i < length; i++) {\n    resultLength += arrayByteLength(arr[i]);\n  }\n\n  let pos = 0;\n  const data = new Uint8Array(resultLength);\n\n  for (let i = 0; i < length; i++) {\n    let item = arr[i];\n\n    if (!(item instanceof Uint8Array)) {\n      if (typeof item === \"string\") {\n        item = stringToBytes(item);\n      } else {\n        item = new Uint8Array(item);\n      }\n    }\n\n    const itemLength = item.byteLength;\n    data.set(item, pos);\n    pos += itemLength;\n  }\n\n  return data;\n}\n\nfunction string32(value) {\n  return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff);\n}\n\nfunction objectSize(obj) {\n  return Object.keys(obj).length;\n}\n\nfunction objectFromMap(map) {\n  const obj = Object.create(null);\n\n  for (const [key, value] of map) {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction isLittleEndian() {\n  const buffer8 = new Uint8Array(4);\n  buffer8[0] = 1;\n  const view32 = new Uint32Array(buffer8.buffer, 0, 1);\n  return view32[0] === 1;\n}\n\nconst IsLittleEndianCached = {\n  get value() {\n    return shadow(this, \"value\", isLittleEndian());\n  }\n\n};\nexports.IsLittleEndianCached = IsLittleEndianCached;\n\nfunction isEvalSupported() {\n  try {\n    new Function(\"\");\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\nconst IsEvalSupportedCached = {\n  get value() {\n    return shadow(this, \"value\", isEvalSupported());\n  }\n\n};\nexports.IsEvalSupportedCached = IsEvalSupportedCached;\nconst hexNumbers = [...Array(256).keys()].map(n => n.toString(16).padStart(2, \"0\"));\n\nclass Util {\n  static makeHexColor(r, g, b) {\n    return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`;\n  }\n\n  static transform(m1, m2) {\n    return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]];\n  }\n\n  static applyTransform(p, m) {\n    const xt = p[0] * m[0] + p[1] * m[2] + m[4];\n    const yt = p[0] * m[1] + p[1] * m[3] + m[5];\n    return [xt, yt];\n  }\n\n  static applyInverseTransform(p, m) {\n    const d = m[0] * m[3] - m[1] * m[2];\n    const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;\n    const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;\n    return [xt, yt];\n  }\n\n  static getAxialAlignedBoundingBox(r, m) {\n    const p1 = Util.applyTransform(r, m);\n    const p2 = Util.applyTransform(r.slice(2, 4), m);\n    const p3 = Util.applyTransform([r[0], r[3]], m);\n    const p4 = Util.applyTransform([r[2], r[1]], m);\n    return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])];\n  }\n\n  static inverseTransform(m) {\n    const d = m[0] * m[3] - m[1] * m[2];\n    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];\n  }\n\n  static apply3dTransform(m, v) {\n    return [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2]];\n  }\n\n  static singularValueDecompose2dScale(m) {\n    const transpose = [m[0], m[2], m[1], m[3]];\n    const a = m[0] * transpose[0] + m[1] * transpose[2];\n    const b = m[0] * transpose[1] + m[1] * transpose[3];\n    const c = m[2] * transpose[0] + m[3] * transpose[2];\n    const d = m[2] * transpose[1] + m[3] * transpose[3];\n    const first = (a + d) / 2;\n    const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2;\n    const sx = first + second || 1;\n    const sy = first - second || 1;\n    return [Math.sqrt(sx), Math.sqrt(sy)];\n  }\n\n  static normalizeRect(rect) {\n    const r = rect.slice(0);\n\n    if (rect[0] > rect[2]) {\n      r[0] = rect[2];\n      r[2] = rect[0];\n    }\n\n    if (rect[1] > rect[3]) {\n      r[1] = rect[3];\n      r[3] = rect[1];\n    }\n\n    return r;\n  }\n\n  static intersect(rect1, rect2) {\n    function compare(a, b) {\n      return a - b;\n    }\n\n    const orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare);\n    const orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare);\n    const result = [];\n    rect1 = Util.normalizeRect(rect1);\n    rect2 = Util.normalizeRect(rect2);\n\n    if (orderedX[0] === rect1[0] && orderedX[1] === rect2[0] || orderedX[0] === rect2[0] && orderedX[1] === rect1[0]) {\n      result[0] = orderedX[1];\n      result[2] = orderedX[2];\n    } else {\n      return null;\n    }\n\n    if (orderedY[0] === rect1[1] && orderedY[1] === rect2[1] || orderedY[0] === rect2[1] && orderedY[1] === rect1[1]) {\n      result[1] = orderedY[1];\n      result[3] = orderedY[2];\n    } else {\n      return null;\n    }\n\n    return result;\n  }\n\n}\n\nexports.Util = Util;\nconst PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC];\n\nfunction stringToPDFString(str) {\n  const length = str.length,\n        strBuf = [];\n\n  if (str[0] === \"\\xFE\" && str[1] === \"\\xFF\") {\n    for (let i = 2; i < length; i += 2) {\n      strBuf.push(String.fromCharCode(str.charCodeAt(i) << 8 | str.charCodeAt(i + 1)));\n    }\n  } else if (str[0] === \"\\xFF\" && str[1] === \"\\xFE\") {\n    for (let i = 2; i < length; i += 2) {\n      strBuf.push(String.fromCharCode(str.charCodeAt(i + 1) << 8 | str.charCodeAt(i)));\n    }\n  } else {\n    for (let i = 0; i < length; ++i) {\n      const code = PDFStringTranslateTable[str.charCodeAt(i)];\n      strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));\n    }\n  }\n\n  return strBuf.join(\"\");\n}\n\nfunction escapeString(str) {\n  return str.replace(/([()\\\\\\n\\r])/g, match => {\n    if (match === \"\\n\") {\n      return \"\\\\n\";\n    } else if (match === \"\\r\") {\n      return \"\\\\r\";\n    }\n\n    return `\\\\${match}`;\n  });\n}\n\nfunction isAscii(str) {\n  return /^[\\x00-\\x7F]*$/.test(str);\n}\n\nfunction stringToUTF16BEString(str) {\n  const buf = [\"\\xFE\\xFF\"];\n\n  for (let i = 0, ii = str.length; i < ii; i++) {\n    const char = str.charCodeAt(i);\n    buf.push(String.fromCharCode(char >> 8 & 0xff));\n    buf.push(String.fromCharCode(char & 0xff));\n  }\n\n  return buf.join(\"\");\n}\n\nfunction stringToUTF8String(str) {\n  return decodeURIComponent(escape(str));\n}\n\nfunction utf8StringToString(str) {\n  return unescape(encodeURIComponent(str));\n}\n\nfunction isBool(v) {\n  return typeof v === \"boolean\";\n}\n\nfunction isNum(v) {\n  return typeof v === \"number\";\n}\n\nfunction isString(v) {\n  return typeof v === \"string\";\n}\n\nfunction isArrayBuffer(v) {\n  return typeof v === \"object\" && v !== null && v.byteLength !== undefined;\n}\n\nfunction isArrayEqual(arr1, arr2) {\n  if (arr1.length !== arr2.length) {\n    return false;\n  }\n\n  for (let i = 0, ii = arr1.length; i < ii; i++) {\n    if (arr1[i] !== arr2[i]) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction getModificationDate(date = new Date()) {\n  const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, \"0\"), date.getUTCDate().toString().padStart(2, \"0\"), date.getUTCHours().toString().padStart(2, \"0\"), date.getUTCMinutes().toString().padStart(2, \"0\"), date.getUTCSeconds().toString().padStart(2, \"0\")];\n  return buffer.join(\"\");\n}\n\nfunction createPromiseCapability() {\n  const capability = Object.create(null);\n  let isSettled = false;\n  Object.defineProperty(capability, \"settled\", {\n    get() {\n      return isSettled;\n    }\n\n  });\n  capability.promise = new Promise(function (resolve, reject) {\n    capability.resolve = function (data) {\n      isSettled = true;\n      resolve(data);\n    };\n\n    capability.reject = function (reason) {\n      isSettled = true;\n      reject(reason);\n    };\n  });\n  return capability;\n}\n\nfunction createObjectURL(data, contentType = \"\", forceDataSchema = false) {\n  if (URL.createObjectURL && !forceDataSchema) {\n    return URL.createObjectURL(new Blob([data], {\n      type: contentType\n    }));\n  }\n\n  const digits = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n  let buffer = `data:${contentType};base64,`;\n\n  for (let i = 0, ii = data.length; i < ii; i += 3) {\n    const b1 = data[i] & 0xff;\n    const b2 = data[i + 1] & 0xff;\n    const b3 = data[i + 2] & 0xff;\n    const d1 = b1 >> 2,\n          d2 = (b1 & 3) << 4 | b2 >> 4;\n    const d3 = i + 1 < ii ? (b2 & 0xf) << 2 | b3 >> 6 : 64;\n    const d4 = i + 2 < ii ? b3 & 0x3f : 64;\n    buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];\n  }\n\n  return buffer;\n}\n\n/***/ }),\n/* 3 */\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => {\n\n\n\nvar _is_node = __w_pdfjs_require__(4);\n\n;\n\n/***/ }),\n/* 4 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.isNodeJS = void 0;\nconst isNodeJS = typeof process === \"object\" && process + \"\" === \"[object process]\" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== \"browser\");\nexports.isNodeJS = isNodeJS;\n\n/***/ }),\n/* 5 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.getDocument = getDocument;\nexports.setPDFNetworkStreamFactory = setPDFNetworkStreamFactory;\nexports.version = exports.PDFWorker = exports.PDFPageProxy = exports.PDFDocumentProxy = exports.PDFDataRangeTransport = exports.LoopbackPort = exports.DefaultCMapReaderFactory = exports.DefaultCanvasFactory = exports.build = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _display_utils = __w_pdfjs_require__(1);\n\nvar _font_loader = __w_pdfjs_require__(6);\n\nvar _node_utils = __w_pdfjs_require__(7);\n\nvar _annotation_storage = __w_pdfjs_require__(8);\n\nvar _api_compatibility = __w_pdfjs_require__(9);\n\nvar _canvas = __w_pdfjs_require__(10);\n\nvar _worker_options = __w_pdfjs_require__(12);\n\nvar _is_node = __w_pdfjs_require__(4);\n\nvar _message_handler = __w_pdfjs_require__(13);\n\nvar _metadata = __w_pdfjs_require__(14);\n\nvar _optional_content_config = __w_pdfjs_require__(15);\n\nvar _transport_stream = __w_pdfjs_require__(16);\n\nvar _webgl = __w_pdfjs_require__(17);\n\nconst DEFAULT_RANGE_CHUNK_SIZE = 65536;\nconst RENDERING_CANCELLED_TIMEOUT = 100;\nconst DefaultCanvasFactory = _is_node.isNodeJS ? _node_utils.NodeCanvasFactory : _display_utils.DOMCanvasFactory;\nexports.DefaultCanvasFactory = DefaultCanvasFactory;\nconst DefaultCMapReaderFactory = _is_node.isNodeJS ? _node_utils.NodeCMapReaderFactory : _display_utils.DOMCMapReaderFactory;\nexports.DefaultCMapReaderFactory = DefaultCMapReaderFactory;\nlet createPDFNetworkStream;\n\nfunction setPDFNetworkStreamFactory(pdfNetworkStreamFactory) {\n  createPDFNetworkStream = pdfNetworkStreamFactory;\n}\n\nfunction getDocument(src) {\n  const task = new PDFDocumentLoadingTask();\n  let source;\n\n  if (typeof src === \"string\" || src instanceof URL) {\n    source = {\n      url: src\n    };\n  } else if ((0, _util.isArrayBuffer)(src)) {\n    source = {\n      data: src\n    };\n  } else if (src instanceof PDFDataRangeTransport) {\n    source = {\n      range: src\n    };\n  } else {\n    if (typeof src !== \"object\") {\n      throw new Error(\"Invalid parameter in getDocument, \" + \"need either string, URL, Uint8Array, or parameter object.\");\n    }\n\n    if (!src.url && !src.data && !src.range) {\n      throw new Error(\"Invalid parameter object: need either .data, .range or .url\");\n    }\n\n    source = src;\n  }\n\n  const params = Object.create(null);\n  let rangeTransport = null,\n      worker = null;\n\n  for (const key in source) {\n    const value = source[key];\n\n    switch (key) {\n      case \"url\":\n        if (typeof window !== \"undefined\") {\n          try {\n            params[key] = new URL(value, window.location).href;\n            continue;\n          } catch (ex) {\n            (0, _util.warn)(`Cannot create valid URL: \"${ex}\".`);\n          }\n        } else if (typeof value === \"string\" || value instanceof URL) {\n          params[key] = value.toString();\n          continue;\n        }\n\n        throw new Error(\"Invalid PDF url data: \" + \"either string or URL-object is expected in the url property.\");\n\n      case \"range\":\n        rangeTransport = value;\n        continue;\n\n      case \"worker\":\n        worker = value;\n        continue;\n\n      case \"data\":\n        if (_is_node.isNodeJS && typeof Buffer !== \"undefined\" && value instanceof Buffer) {\n          params[key] = new Uint8Array(value);\n        } else if (value instanceof Uint8Array) {\n          break;\n        } else if (typeof value === \"string\") {\n          params[key] = (0, _util.stringToBytes)(value);\n        } else if (typeof value === \"object\" && value !== null && !isNaN(value.length)) {\n          params[key] = new Uint8Array(value);\n        } else if ((0, _util.isArrayBuffer)(value)) {\n          params[key] = new Uint8Array(value);\n        } else {\n          throw new Error(\"Invalid PDF binary data: either typed array, \" + \"string, or array-like object is expected in the data property.\");\n        }\n\n        continue;\n    }\n\n    params[key] = value;\n  }\n\n  params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE;\n  params.CMapReaderFactory = params.CMapReaderFactory || DefaultCMapReaderFactory;\n  params.ignoreErrors = params.stopAtErrors !== true;\n  params.fontExtraProperties = params.fontExtraProperties === true;\n  params.pdfBug = params.pdfBug === true;\n  params.enableXfa = params.enableXfa === true;\n\n  if (typeof params.docBaseUrl !== \"string\" || (0, _display_utils.isDataScheme)(params.docBaseUrl)) {\n    params.docBaseUrl = null;\n  }\n\n  if (!Number.isInteger(params.maxImageSize)) {\n    params.maxImageSize = -1;\n  }\n\n  if (typeof params.isEvalSupported !== \"boolean\") {\n    params.isEvalSupported = true;\n  }\n\n  if (typeof params.disableFontFace !== \"boolean\") {\n    params.disableFontFace = _api_compatibility.apiCompatibilityParams.disableFontFace || false;\n  }\n\n  if (typeof params.ownerDocument === \"undefined\") {\n    params.ownerDocument = globalThis.document;\n  }\n\n  if (typeof params.disableRange !== \"boolean\") {\n    params.disableRange = false;\n  }\n\n  if (typeof params.disableStream !== \"boolean\") {\n    params.disableStream = false;\n  }\n\n  if (typeof params.disableAutoFetch !== \"boolean\") {\n    params.disableAutoFetch = false;\n  }\n\n  (0, _util.setVerbosityLevel)(params.verbosity);\n\n  if (!worker) {\n    const workerParams = {\n      verbosity: params.verbosity,\n      port: _worker_options.GlobalWorkerOptions.workerPort\n    };\n    worker = workerParams.port ? PDFWorker.fromPort(workerParams) : new PDFWorker(workerParams);\n    task._worker = worker;\n  }\n\n  const docId = task.docId;\n  worker.promise.then(function () {\n    if (task.destroyed) {\n      throw new Error(\"Loading aborted\");\n    }\n\n    const workerIdPromise = _fetchDocument(worker, params, rangeTransport, docId);\n\n    const networkStreamPromise = new Promise(function (resolve) {\n      let networkStream;\n\n      if (rangeTransport) {\n        networkStream = new _transport_stream.PDFDataTransportStream({\n          length: params.length,\n          initialData: params.initialData,\n          progressiveDone: params.progressiveDone,\n          contentDispositionFilename: params.contentDispositionFilename,\n          disableRange: params.disableRange,\n          disableStream: params.disableStream\n        }, rangeTransport);\n      } else if (!params.data) {\n        networkStream = createPDFNetworkStream({\n          url: params.url,\n          length: params.length,\n          httpHeaders: params.httpHeaders,\n          withCredentials: params.withCredentials,\n          rangeChunkSize: params.rangeChunkSize,\n          disableRange: params.disableRange,\n          disableStream: params.disableStream\n        });\n      }\n\n      resolve(networkStream);\n    });\n    return Promise.all([workerIdPromise, networkStreamPromise]).then(function ([workerId, networkStream]) {\n      if (task.destroyed) {\n        throw new Error(\"Loading aborted\");\n      }\n\n      const messageHandler = new _message_handler.MessageHandler(docId, workerId, worker.port);\n      messageHandler.postMessageTransfers = worker.postMessageTransfers;\n      const transport = new WorkerTransport(messageHandler, task, networkStream, params);\n      task._transport = transport;\n      messageHandler.send(\"Ready\", null);\n    });\n  }).catch(task._capability.reject);\n  return task;\n}\n\nfunction _fetchDocument(worker, source, pdfDataRangeTransport, docId) {\n  if (worker.destroyed) {\n    return Promise.reject(new Error(\"Worker was destroyed\"));\n  }\n\n  if (pdfDataRangeTransport) {\n    source.length = pdfDataRangeTransport.length;\n    source.initialData = pdfDataRangeTransport.initialData;\n    source.progressiveDone = pdfDataRangeTransport.progressiveDone;\n    source.contentDispositionFilename = pdfDataRangeTransport.contentDispositionFilename;\n  }\n\n  return worker.messageHandler.sendWithPromise(\"GetDocRequest\", {\n    docId,\n    apiVersion: '2.8.335',\n    source: {\n      data: source.data,\n      url: source.url,\n      password: source.password,\n      disableAutoFetch: source.disableAutoFetch,\n      rangeChunkSize: source.rangeChunkSize,\n      length: source.length\n    },\n    maxImageSize: source.maxImageSize,\n    disableFontFace: source.disableFontFace,\n    postMessageTransfers: worker.postMessageTransfers,\n    docBaseUrl: source.docBaseUrl,\n    ignoreErrors: source.ignoreErrors,\n    isEvalSupported: source.isEvalSupported,\n    fontExtraProperties: source.fontExtraProperties,\n    enableXfa: source.enableXfa\n  }).then(function (workerId) {\n    if (worker.destroyed) {\n      throw new Error(\"Worker was destroyed\");\n    }\n\n    return workerId;\n  });\n}\n\nconst PDFDocumentLoadingTask = function PDFDocumentLoadingTaskClosure() {\n  let nextDocumentId = 0;\n\n  class PDFDocumentLoadingTask {\n    constructor() {\n      this._capability = (0, _util.createPromiseCapability)();\n      this._transport = null;\n      this._worker = null;\n      this.docId = \"d\" + nextDocumentId++;\n      this.destroyed = false;\n      this.onPassword = null;\n      this.onProgress = null;\n      this.onUnsupportedFeature = null;\n    }\n\n    get promise() {\n      return this._capability.promise;\n    }\n\n    destroy() {\n      this.destroyed = true;\n      const transportDestroyed = !this._transport ? Promise.resolve() : this._transport.destroy();\n      return transportDestroyed.then(() => {\n        this._transport = null;\n\n        if (this._worker) {\n          this._worker.destroy();\n\n          this._worker = null;\n        }\n      });\n    }\n\n  }\n\n  return PDFDocumentLoadingTask;\n}();\n\nclass PDFDataRangeTransport {\n  constructor(length, initialData, progressiveDone = false, contentDispositionFilename = null) {\n    this.length = length;\n    this.initialData = initialData;\n    this.progressiveDone = progressiveDone;\n    this.contentDispositionFilename = contentDispositionFilename;\n    this._rangeListeners = [];\n    this._progressListeners = [];\n    this._progressiveReadListeners = [];\n    this._progressiveDoneListeners = [];\n    this._readyCapability = (0, _util.createPromiseCapability)();\n  }\n\n  addRangeListener(listener) {\n    this._rangeListeners.push(listener);\n  }\n\n  addProgressListener(listener) {\n    this._progressListeners.push(listener);\n  }\n\n  addProgressiveReadListener(listener) {\n    this._progressiveReadListeners.push(listener);\n  }\n\n  addProgressiveDoneListener(listener) {\n    this._progressiveDoneListeners.push(listener);\n  }\n\n  onDataRange(begin, chunk) {\n    for (const listener of this._rangeListeners) {\n      listener(begin, chunk);\n    }\n  }\n\n  onDataProgress(loaded, total) {\n    this._readyCapability.promise.then(() => {\n      for (const listener of this._progressListeners) {\n        listener(loaded, total);\n      }\n    });\n  }\n\n  onDataProgressiveRead(chunk) {\n    this._readyCapability.promise.then(() => {\n      for (const listener of this._progressiveReadListeners) {\n        listener(chunk);\n      }\n    });\n  }\n\n  onDataProgressiveDone() {\n    this._readyCapability.promise.then(() => {\n      for (const listener of this._progressiveDoneListeners) {\n        listener();\n      }\n    });\n  }\n\n  transportReady() {\n    this._readyCapability.resolve();\n  }\n\n  requestDataRange(begin, end) {\n    (0, _util.unreachable)(\"Abstract method PDFDataRangeTransport.requestDataRange\");\n  }\n\n  abort() {}\n\n}\n\nexports.PDFDataRangeTransport = PDFDataRangeTransport;\n\nclass PDFDocumentProxy {\n  constructor(pdfInfo, transport) {\n    this._pdfInfo = pdfInfo;\n    this._transport = transport;\n  }\n\n  get annotationStorage() {\n    return (0, _util.shadow)(this, \"annotationStorage\", new _annotation_storage.AnnotationStorage());\n  }\n\n  get numPages() {\n    return this._pdfInfo.numPages;\n  }\n\n  get fingerprint() {\n    return this._pdfInfo.fingerprint;\n  }\n\n  get isPureXfa() {\n    return this._pdfInfo.isPureXfa;\n  }\n\n  getPage(pageNumber) {\n    return this._transport.getPage(pageNumber);\n  }\n\n  getPageIndex(ref) {\n    return this._transport.getPageIndex(ref);\n  }\n\n  getDestinations() {\n    return this._transport.getDestinations();\n  }\n\n  getDestination(id) {\n    return this._transport.getDestination(id);\n  }\n\n  getPageLabels() {\n    return this._transport.getPageLabels();\n  }\n\n  getPageLayout() {\n    return this._transport.getPageLayout();\n  }\n\n  getPageMode() {\n    return this._transport.getPageMode();\n  }\n\n  getViewerPreferences() {\n    return this._transport.getViewerPreferences();\n  }\n\n  getOpenAction() {\n    return this._transport.getOpenAction();\n  }\n\n  getAttachments() {\n    return this._transport.getAttachments();\n  }\n\n  getJavaScript() {\n    return this._transport.getJavaScript();\n  }\n\n  getJSActions() {\n    return this._transport.getDocJSActions();\n  }\n\n  getOutline() {\n    return this._transport.getOutline();\n  }\n\n  getOptionalContentConfig() {\n    return this._transport.getOptionalContentConfig();\n  }\n\n  getPermissions() {\n    return this._transport.getPermissions();\n  }\n\n  getMetadata() {\n    return this._transport.getMetadata();\n  }\n\n  getMarkInfo() {\n    return this._transport.getMarkInfo();\n  }\n\n  getData() {\n    return this._transport.getData();\n  }\n\n  getDownloadInfo() {\n    return this._transport.downloadInfoCapability.promise;\n  }\n\n  getStats() {\n    return this._transport.getStats();\n  }\n\n  cleanup(keepLoadedFonts = false) {\n    return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa);\n  }\n\n  destroy() {\n    return this.loadingTask.destroy();\n  }\n\n  get loadingParams() {\n    return this._transport.loadingParams;\n  }\n\n  get loadingTask() {\n    return this._transport.loadingTask;\n  }\n\n  saveDocument(annotationStorage) {\n    return this._transport.saveDocument(annotationStorage);\n  }\n\n  getFieldObjects() {\n    return this._transport.getFieldObjects();\n  }\n\n  hasJSActions() {\n    return this._transport.hasJSActions();\n  }\n\n  getCalculationOrderIds() {\n    return this._transport.getCalculationOrderIds();\n  }\n\n}\n\nexports.PDFDocumentProxy = PDFDocumentProxy;\n\nclass PDFPageProxy {\n  constructor(pageIndex, pageInfo, transport, ownerDocument, pdfBug = false) {\n    this._pageIndex = pageIndex;\n    this._pageInfo = pageInfo;\n    this._ownerDocument = ownerDocument;\n    this._transport = transport;\n    this._stats = pdfBug ? new _display_utils.StatTimer() : null;\n    this._pdfBug = pdfBug;\n    this.commonObjs = transport.commonObjs;\n    this.objs = new PDFObjects();\n    this.cleanupAfterRender = false;\n    this.pendingCleanup = false;\n    this._intentStates = new Map();\n    this.destroyed = false;\n  }\n\n  get pageNumber() {\n    return this._pageIndex + 1;\n  }\n\n  get rotate() {\n    return this._pageInfo.rotate;\n  }\n\n  get ref() {\n    return this._pageInfo.ref;\n  }\n\n  get userUnit() {\n    return this._pageInfo.userUnit;\n  }\n\n  get view() {\n    return this._pageInfo.view;\n  }\n\n  getViewport({\n    scale,\n    rotation = this.rotate,\n    offsetX = 0,\n    offsetY = 0,\n    dontFlip = false\n  } = {}) {\n    return new _display_utils.PageViewport({\n      viewBox: this.view,\n      scale,\n      rotation,\n      offsetX,\n      offsetY,\n      dontFlip\n    });\n  }\n\n  getAnnotations({\n    intent = null\n  } = {}) {\n    if (!this._annotationsPromise || this._annotationsIntent !== intent) {\n      this._annotationsPromise = this._transport.getAnnotations(this._pageIndex, intent);\n      this._annotationsIntent = intent;\n    }\n\n    return this._annotationsPromise;\n  }\n\n  getJSActions() {\n    return this._jsActionsPromise || (this._jsActionsPromise = this._transport.getPageJSActions(this._pageIndex));\n  }\n\n  getXfa() {\n    return this._xfaPromise || (this._xfaPromise = this._transport.getPageXfa(this._pageIndex));\n  }\n\n  render({\n    canvasContext,\n    viewport,\n    intent = \"display\",\n    enableWebGL = false,\n    renderInteractiveForms = false,\n    transform = null,\n    imageLayer = null,\n    canvasFactory = null,\n    background = null,\n    annotationStorage = null,\n    optionalContentConfigPromise = null\n  }) {\n    var _intentState;\n\n    if (this._stats) {\n      this._stats.time(\"Overall\");\n    }\n\n    const renderingIntent = intent === \"print\" ? \"print\" : \"display\";\n    this.pendingCleanup = false;\n\n    if (!optionalContentConfigPromise) {\n      optionalContentConfigPromise = this._transport.getOptionalContentConfig();\n    }\n\n    let intentState = this._intentStates.get(renderingIntent);\n\n    if (!intentState) {\n      intentState = Object.create(null);\n\n      this._intentStates.set(renderingIntent, intentState);\n    }\n\n    if (intentState.streamReaderCancelTimeout) {\n      clearTimeout(intentState.streamReaderCancelTimeout);\n      intentState.streamReaderCancelTimeout = null;\n    }\n\n    const canvasFactoryInstance = canvasFactory || new DefaultCanvasFactory({\n      ownerDocument: this._ownerDocument\n    });\n    const webGLContext = new _webgl.WebGLContext({\n      enable: enableWebGL\n    });\n\n    if (!intentState.displayReadyCapability) {\n      intentState.displayReadyCapability = (0, _util.createPromiseCapability)();\n      intentState.operatorList = {\n        fnArray: [],\n        argsArray: [],\n        lastChunk: false\n      };\n\n      if (this._stats) {\n        this._stats.time(\"Page Request\");\n      }\n\n      this._pumpOperatorList({\n        pageIndex: this._pageIndex,\n        intent: renderingIntent,\n        renderInteractiveForms: renderInteractiveForms === true,\n        annotationStorage: annotationStorage?.serializable || null\n      });\n    }\n\n    const complete = error => {\n      intentState.renderTasks.delete(internalRenderTask);\n\n      if (this.cleanupAfterRender || renderingIntent === \"print\") {\n        this.pendingCleanup = true;\n      }\n\n      this._tryCleanup();\n\n      if (error) {\n        internalRenderTask.capability.reject(error);\n\n        this._abortOperatorList({\n          intentState,\n          reason: error\n        });\n      } else {\n        internalRenderTask.capability.resolve();\n      }\n\n      if (this._stats) {\n        this._stats.timeEnd(\"Rendering\");\n\n        this._stats.timeEnd(\"Overall\");\n      }\n    };\n\n    const internalRenderTask = new InternalRenderTask({\n      callback: complete,\n      params: {\n        canvasContext,\n        viewport,\n        transform,\n        imageLayer,\n        background\n      },\n      objs: this.objs,\n      commonObjs: this.commonObjs,\n      operatorList: intentState.operatorList,\n      pageIndex: this._pageIndex,\n      canvasFactory: canvasFactoryInstance,\n      webGLContext,\n      useRequestAnimationFrame: renderingIntent !== \"print\",\n      pdfBug: this._pdfBug\n    });\n    ((_intentState = intentState).renderTasks || (_intentState.renderTasks = new Set())).add(internalRenderTask);\n    const renderTask = internalRenderTask.task;\n    Promise.all([intentState.displayReadyCapability.promise, optionalContentConfigPromise]).then(([transparency, optionalContentConfig]) => {\n      if (this.pendingCleanup) {\n        complete();\n        return;\n      }\n\n      if (this._stats) {\n        this._stats.time(\"Rendering\");\n      }\n\n      internalRenderTask.initializeGraphics({\n        transparency,\n        optionalContentConfig\n      });\n      internalRenderTask.operatorListChanged();\n    }).catch(complete);\n    return renderTask;\n  }\n\n  getOperatorList() {\n    function operatorListChanged() {\n      if (intentState.operatorList.lastChunk) {\n        intentState.opListReadCapability.resolve(intentState.operatorList);\n        intentState.renderTasks.delete(opListTask);\n      }\n    }\n\n    const renderingIntent = \"oplist\";\n\n    let intentState = this._intentStates.get(renderingIntent);\n\n    if (!intentState) {\n      intentState = Object.create(null);\n\n      this._intentStates.set(renderingIntent, intentState);\n    }\n\n    let opListTask;\n\n    if (!intentState.opListReadCapability) {\n      var _intentState2;\n\n      opListTask = Object.create(null);\n      opListTask.operatorListChanged = operatorListChanged;\n      intentState.opListReadCapability = (0, _util.createPromiseCapability)();\n      ((_intentState2 = intentState).renderTasks || (_intentState2.renderTasks = new Set())).add(opListTask);\n      intentState.operatorList = {\n        fnArray: [],\n        argsArray: [],\n        lastChunk: false\n      };\n\n      if (this._stats) {\n        this._stats.time(\"Page Request\");\n      }\n\n      this._pumpOperatorList({\n        pageIndex: this._pageIndex,\n        intent: renderingIntent\n      });\n    }\n\n    return intentState.opListReadCapability.promise;\n  }\n\n  streamTextContent({\n    normalizeWhitespace = false,\n    disableCombineTextItems = false\n  } = {}) {\n    const TEXT_CONTENT_CHUNK_SIZE = 100;\n    return this._transport.messageHandler.sendWithStream(\"GetTextContent\", {\n      pageIndex: this._pageIndex,\n      normalizeWhitespace: normalizeWhitespace === true,\n      combineTextItems: disableCombineTextItems !== true\n    }, {\n      highWaterMark: TEXT_CONTENT_CHUNK_SIZE,\n\n      size(textContent) {\n        return textContent.items.length;\n      }\n\n    });\n  }\n\n  getTextContent(params = {}) {\n    const readableStream = this.streamTextContent(params);\n    return new Promise(function (resolve, reject) {\n      function pump() {\n        reader.read().then(function ({\n          value,\n          done\n        }) {\n          if (done) {\n            resolve(textContent);\n            return;\n          }\n\n          Object.assign(textContent.styles, value.styles);\n          textContent.items.push(...value.items);\n          pump();\n        }, reject);\n      }\n\n      const reader = readableStream.getReader();\n      const textContent = {\n        items: [],\n        styles: Object.create(null)\n      };\n      pump();\n    });\n  }\n\n  _destroy() {\n    this.destroyed = true;\n    this._transport.pageCache[this._pageIndex] = null;\n    const waitOn = [];\n\n    for (const [intent, intentState] of this._intentStates) {\n      this._abortOperatorList({\n        intentState,\n        reason: new Error(\"Page was destroyed.\"),\n        force: true\n      });\n\n      if (intent === \"oplist\") {\n        continue;\n      }\n\n      for (const internalRenderTask of intentState.renderTasks) {\n        waitOn.push(internalRenderTask.completed);\n        internalRenderTask.cancel();\n      }\n    }\n\n    this.objs.clear();\n    this._annotationsPromise = null;\n    this._jsActionsPromise = null;\n    this._xfaPromise = null;\n    this.pendingCleanup = false;\n    return Promise.all(waitOn);\n  }\n\n  cleanup(resetStats = false) {\n    this.pendingCleanup = true;\n    return this._tryCleanup(resetStats);\n  }\n\n  _tryCleanup(resetStats = false) {\n    if (!this.pendingCleanup) {\n      return false;\n    }\n\n    for (const {\n      renderTasks,\n      operatorList\n    } of this._intentStates.values()) {\n      if (renderTasks.size > 0 || !operatorList.lastChunk) {\n        return false;\n      }\n    }\n\n    this._intentStates.clear();\n\n    this.objs.clear();\n    this._annotationsPromise = null;\n    this._jsActionsPromise = null;\n    this._xfaPromise = null;\n\n    if (resetStats && this._stats) {\n      this._stats = new _display_utils.StatTimer();\n    }\n\n    this.pendingCleanup = false;\n    return true;\n  }\n\n  _startRenderPage(transparency, intent) {\n    const intentState = this._intentStates.get(intent);\n\n    if (!intentState) {\n      return;\n    }\n\n    if (this._stats) {\n      this._stats.timeEnd(\"Page Request\");\n    }\n\n    if (intentState.displayReadyCapability) {\n      intentState.displayReadyCapability.resolve(transparency);\n    }\n  }\n\n  _renderPageChunk(operatorListChunk, intentState) {\n    for (let i = 0, ii = operatorListChunk.length; i < ii; i++) {\n      intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);\n      intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]);\n    }\n\n    intentState.operatorList.lastChunk = operatorListChunk.lastChunk;\n\n    for (const internalRenderTask of intentState.renderTasks) {\n      internalRenderTask.operatorListChanged();\n    }\n\n    if (operatorListChunk.lastChunk) {\n      this._tryCleanup();\n    }\n  }\n\n  _pumpOperatorList(args) {\n    (0, _util.assert)(args.intent, 'PDFPageProxy._pumpOperatorList: Expected \"intent\" argument.');\n\n    const readableStream = this._transport.messageHandler.sendWithStream(\"GetOperatorList\", args);\n\n    const reader = readableStream.getReader();\n\n    const intentState = this._intentStates.get(args.intent);\n\n    intentState.streamReader = reader;\n\n    const pump = () => {\n      reader.read().then(({\n        value,\n        done\n      }) => {\n        if (done) {\n          intentState.streamReader = null;\n          return;\n        }\n\n        if (this._transport.destroyed) {\n          return;\n        }\n\n        this._renderPageChunk(value, intentState);\n\n        pump();\n      }, reason => {\n        intentState.streamReader = null;\n\n        if (this._transport.destroyed) {\n          return;\n        }\n\n        if (intentState.operatorList) {\n          intentState.operatorList.lastChunk = true;\n\n          for (const internalRenderTask of intentState.renderTasks) {\n            internalRenderTask.operatorListChanged();\n          }\n\n          this._tryCleanup();\n        }\n\n        if (intentState.displayReadyCapability) {\n          intentState.displayReadyCapability.reject(reason);\n        } else if (intentState.opListReadCapability) {\n          intentState.opListReadCapability.reject(reason);\n        } else {\n          throw reason;\n        }\n      });\n    };\n\n    pump();\n  }\n\n  _abortOperatorList({\n    intentState,\n    reason,\n    force = false\n  }) {\n    (0, _util.assert)(reason instanceof Error || typeof reason === \"object\" && reason !== null, 'PDFPageProxy._abortOperatorList: Expected \"reason\" argument.');\n\n    if (!intentState.streamReader) {\n      return;\n    }\n\n    if (!force) {\n      if (intentState.renderTasks.size > 0) {\n        return;\n      }\n\n      if (reason instanceof _display_utils.RenderingCancelledException) {\n        intentState.streamReaderCancelTimeout = setTimeout(() => {\n          this._abortOperatorList({\n            intentState,\n            reason,\n            force: true\n          });\n\n          intentState.streamReaderCancelTimeout = null;\n        }, RENDERING_CANCELLED_TIMEOUT);\n        return;\n      }\n    }\n\n    intentState.streamReader.cancel(new _util.AbortException(reason?.message));\n    intentState.streamReader = null;\n\n    if (this._transport.destroyed) {\n      return;\n    }\n\n    for (const [intent, curIntentState] of this._intentStates) {\n      if (curIntentState === intentState) {\n        this._intentStates.delete(intent);\n\n        break;\n      }\n    }\n\n    this.cleanup();\n  }\n\n  get stats() {\n    return this._stats;\n  }\n\n}\n\nexports.PDFPageProxy = PDFPageProxy;\n\nclass LoopbackPort {\n  constructor() {\n    this._listeners = [];\n    this._deferred = Promise.resolve(undefined);\n  }\n\n  postMessage(obj, transfers) {\n    function cloneValue(value) {\n      if (typeof value !== \"object\" || value === null) {\n        return value;\n      }\n\n      if (cloned.has(value)) {\n        return cloned.get(value);\n      }\n\n      let buffer, result;\n\n      if ((buffer = value.buffer) && (0, _util.isArrayBuffer)(buffer)) {\n        if (transfers?.includes(buffer)) {\n          result = new value.constructor(buffer, value.byteOffset, value.byteLength);\n        } else {\n          result = new value.constructor(value);\n        }\n\n        cloned.set(value, result);\n        return result;\n      }\n\n      if (value instanceof Map) {\n        result = new Map();\n        cloned.set(value, result);\n\n        for (const [key, val] of value) {\n          result.set(key, cloneValue(val));\n        }\n\n        return result;\n      }\n\n      if (value instanceof Set) {\n        result = new Set();\n        cloned.set(value, result);\n\n        for (const val of value) {\n          result.add(cloneValue(val));\n        }\n\n        return result;\n      }\n\n      result = Array.isArray(value) ? [] : {};\n      cloned.set(value, result);\n\n      for (const i in value) {\n        let desc,\n            p = value;\n\n        while (!(desc = Object.getOwnPropertyDescriptor(p, i))) {\n          p = Object.getPrototypeOf(p);\n        }\n\n        if (typeof desc.value === \"undefined\") {\n          continue;\n        }\n\n        if (typeof desc.value === \"function\") {\n          if (value.hasOwnProperty?.(i)) {\n            throw new Error(`LoopbackPort.postMessage - cannot clone: ${value[i]}`);\n          }\n\n          continue;\n        }\n\n        result[i] = cloneValue(desc.value);\n      }\n\n      return result;\n    }\n\n    const cloned = new WeakMap();\n    const event = {\n      data: cloneValue(obj)\n    };\n\n    this._deferred.then(() => {\n      for (const listener of this._listeners) {\n        listener.call(this, event);\n      }\n    });\n  }\n\n  addEventListener(name, listener) {\n    this._listeners.push(listener);\n  }\n\n  removeEventListener(name, listener) {\n    const i = this._listeners.indexOf(listener);\n\n    this._listeners.splice(i, 1);\n  }\n\n  terminate() {\n    this._listeners.length = 0;\n  }\n\n}\n\nexports.LoopbackPort = LoopbackPort;\n\nconst PDFWorker = function PDFWorkerClosure() {\n  const pdfWorkerPorts = new WeakMap();\n  let isWorkerDisabled = false;\n  let fallbackWorkerSrc;\n  let nextFakeWorkerId = 0;\n  let fakeWorkerCapability;\n\n  if (_is_node.isNodeJS && typeof require === \"function\") {\n    isWorkerDisabled = true;\n    fallbackWorkerSrc = \"./pdf.worker.js\";\n  } else if (typeof document === \"object\" && \"currentScript\" in document) {\n    const pdfjsFilePath = document.currentScript?.src;\n\n    if (pdfjsFilePath) {\n      fallbackWorkerSrc = pdfjsFilePath.replace(/(\\.(?:min\\.)?js)(\\?.*)?$/i, \".worker$1$2\");\n    }\n  }\n\n  function getWorkerSrc() {\n    if (_worker_options.GlobalWorkerOptions.workerSrc) {\n      return _worker_options.GlobalWorkerOptions.workerSrc;\n    }\n\n    if (typeof fallbackWorkerSrc !== \"undefined\") {\n      if (!_is_node.isNodeJS) {\n        (0, _display_utils.deprecated)('No \"GlobalWorkerOptions.workerSrc\" specified.');\n      }\n\n      return fallbackWorkerSrc;\n    }\n\n    throw new Error('No \"GlobalWorkerOptions.workerSrc\" specified.');\n  }\n\n  function getMainThreadWorkerMessageHandler() {\n    let mainWorkerMessageHandler;\n\n    try {\n      mainWorkerMessageHandler = globalThis.pdfjsWorker?.WorkerMessageHandler;\n    } catch (ex) {}\n\n    return mainWorkerMessageHandler || null;\n  }\n\n  function setupFakeWorkerGlobal() {\n    if (fakeWorkerCapability) {\n      return fakeWorkerCapability.promise;\n    }\n\n    fakeWorkerCapability = (0, _util.createPromiseCapability)();\n\n    const loader = async function () {\n      const mainWorkerMessageHandler = getMainThreadWorkerMessageHandler();\n\n      if (mainWorkerMessageHandler) {\n        return mainWorkerMessageHandler;\n      }\n\n      if (_is_node.isNodeJS && typeof require === \"function\") {\n        const worker = eval(\"require\")(getWorkerSrc());\n        return worker.WorkerMessageHandler;\n      }\n\n      await (0, _display_utils.loadScript)(getWorkerSrc());\n      return window.pdfjsWorker.WorkerMessageHandler;\n    };\n\n    loader().then(fakeWorkerCapability.resolve, fakeWorkerCapability.reject);\n    return fakeWorkerCapability.promise;\n  }\n\n  function createCDNWrapper(url) {\n    const wrapper = \"importScripts('\" + url + \"');\";\n    return URL.createObjectURL(new Blob([wrapper]));\n  }\n\n  class PDFWorker {\n    constructor({\n      name = null,\n      port = null,\n      verbosity = (0, _util.getVerbosityLevel)()\n    } = {}) {\n      if (port && pdfWorkerPorts.has(port)) {\n        throw new Error(\"Cannot use more than one PDFWorker per port\");\n      }\n\n      this.name = name;\n      this.destroyed = false;\n      this.postMessageTransfers = true;\n      this.verbosity = verbosity;\n      this._readyCapability = (0, _util.createPromiseCapability)();\n      this._port = null;\n      this._webWorker = null;\n      this._messageHandler = null;\n\n      if (port) {\n        pdfWorkerPorts.set(port, this);\n\n        this._initializeFromPort(port);\n\n        return;\n      }\n\n      this._initialize();\n    }\n\n    get promise() {\n      return this._readyCapability.promise;\n    }\n\n    get port() {\n      return this._port;\n    }\n\n    get messageHandler() {\n      return this._messageHandler;\n    }\n\n    _initializeFromPort(port) {\n      this._port = port;\n      this._messageHandler = new _message_handler.MessageHandler(\"main\", \"worker\", port);\n\n      this._messageHandler.on(\"ready\", function () {});\n\n      this._readyCapability.resolve();\n    }\n\n    _initialize() {\n      if (typeof Worker !== \"undefined\" && !isWorkerDisabled && !getMainThreadWorkerMessageHandler()) {\n        let workerSrc = getWorkerSrc();\n\n        try {\n          if (!(0, _util.isSameOrigin)(window.location.href, workerSrc)) {\n            workerSrc = createCDNWrapper(new URL(workerSrc, window.location).href);\n          }\n\n          const worker = new Worker(workerSrc);\n          const messageHandler = new _message_handler.MessageHandler(\"main\", \"worker\", worker);\n\n          const terminateEarly = () => {\n            worker.removeEventListener(\"error\", onWorkerError);\n            messageHandler.destroy();\n            worker.terminate();\n\n            if (this.destroyed) {\n              this._readyCapability.reject(new Error(\"Worker was destroyed\"));\n            } else {\n              this._setupFakeWorker();\n            }\n          };\n\n          const onWorkerError = () => {\n            if (!this._webWorker) {\n              terminateEarly();\n            }\n          };\n\n          worker.addEventListener(\"error\", onWorkerError);\n          messageHandler.on(\"test\", data => {\n            worker.removeEventListener(\"error\", onWorkerError);\n\n            if (this.destroyed) {\n              terminateEarly();\n              return;\n            }\n\n            if (data) {\n              this._messageHandler = messageHandler;\n              this._port = worker;\n              this._webWorker = worker;\n\n              if (!data.supportTransfers) {\n                this.postMessageTransfers = false;\n              }\n\n              this._readyCapability.resolve();\n\n              messageHandler.send(\"configure\", {\n                verbosity: this.verbosity\n              });\n            } else {\n              this._setupFakeWorker();\n\n              messageHandler.destroy();\n              worker.terminate();\n            }\n          });\n          messageHandler.on(\"ready\", data => {\n            worker.removeEventListener(\"error\", onWorkerError);\n\n            if (this.destroyed) {\n              terminateEarly();\n              return;\n            }\n\n            try {\n              sendTest();\n            } catch (e) {\n              this._setupFakeWorker();\n            }\n          });\n\n          const sendTest = () => {\n            const testObj = new Uint8Array([this.postMessageTransfers ? 255 : 0]);\n\n            try {\n              messageHandler.send(\"test\", testObj, [testObj.buffer]);\n            } catch (ex) {\n              (0, _util.warn)(\"Cannot use postMessage transfers.\");\n              testObj[0] = 0;\n              messageHandler.send(\"test\", testObj);\n            }\n          };\n\n          sendTest();\n          return;\n        } catch (e) {\n          (0, _util.info)(\"The worker has been disabled.\");\n        }\n      }\n\n      this._setupFakeWorker();\n    }\n\n    _setupFakeWorker() {\n      if (!isWorkerDisabled) {\n        (0, _util.warn)(\"Setting up fake worker.\");\n        isWorkerDisabled = true;\n      }\n\n      setupFakeWorkerGlobal().then(WorkerMessageHandler => {\n        if (this.destroyed) {\n          this._readyCapability.reject(new Error(\"Worker was destroyed\"));\n\n          return;\n        }\n\n        const port = new LoopbackPort();\n        this._port = port;\n        const id = \"fake\" + nextFakeWorkerId++;\n        const workerHandler = new _message_handler.MessageHandler(id + \"_worker\", id, port);\n        WorkerMessageHandler.setup(workerHandler, port);\n        const messageHandler = new _message_handler.MessageHandler(id, id + \"_worker\", port);\n        this._messageHandler = messageHandler;\n\n        this._readyCapability.resolve();\n\n        messageHandler.send(\"configure\", {\n          verbosity: this.verbosity\n        });\n      }).catch(reason => {\n        this._readyCapability.reject(new Error(`Setting up fake worker failed: \"${reason.message}\".`));\n      });\n    }\n\n    destroy() {\n      this.destroyed = true;\n\n      if (this._webWorker) {\n        this._webWorker.terminate();\n\n        this._webWorker = null;\n      }\n\n      pdfWorkerPorts.delete(this._port);\n      this._port = null;\n\n      if (this._messageHandler) {\n        this._messageHandler.destroy();\n\n        this._messageHandler = null;\n      }\n    }\n\n    static fromPort(params) {\n      if (!params || !params.port) {\n        throw new Error(\"PDFWorker.fromPort - invalid method signature.\");\n      }\n\n      if (pdfWorkerPorts.has(params.port)) {\n        return pdfWorkerPorts.get(params.port);\n      }\n\n      return new PDFWorker(params);\n    }\n\n    static getWorkerSrc() {\n      return getWorkerSrc();\n    }\n\n  }\n\n  return PDFWorker;\n}();\n\nexports.PDFWorker = PDFWorker;\n\nclass WorkerTransport {\n  constructor(messageHandler, loadingTask, networkStream, params) {\n    this.messageHandler = messageHandler;\n    this.loadingTask = loadingTask;\n    this.commonObjs = new PDFObjects();\n    this.fontLoader = new _font_loader.FontLoader({\n      docId: loadingTask.docId,\n      onUnsupportedFeature: this._onUnsupportedFeature.bind(this),\n      ownerDocument: params.ownerDocument\n    });\n    this._params = params;\n    this.CMapReaderFactory = new params.CMapReaderFactory({\n      baseUrl: params.cMapUrl,\n      isCompressed: params.cMapPacked\n    });\n    this.destroyed = false;\n    this.destroyCapability = null;\n    this._passwordCapability = null;\n    this._networkStream = networkStream;\n    this._fullReader = null;\n    this._lastProgress = null;\n    this.pageCache = [];\n    this.pagePromises = [];\n    this.downloadInfoCapability = (0, _util.createPromiseCapability)();\n    this.setupMessageHandler();\n  }\n\n  get loadingTaskSettled() {\n    return this.loadingTask._capability.settled;\n  }\n\n  destroy() {\n    if (this.destroyCapability) {\n      return this.destroyCapability.promise;\n    }\n\n    this.destroyed = true;\n    this.destroyCapability = (0, _util.createPromiseCapability)();\n\n    if (this._passwordCapability) {\n      this._passwordCapability.reject(new Error(\"Worker was destroyed during onPassword callback\"));\n    }\n\n    const waitOn = [];\n    this.pageCache.forEach(function (page) {\n      if (page) {\n        waitOn.push(page._destroy());\n      }\n    });\n    this.pageCache.length = 0;\n    this.pagePromises.length = 0;\n    const terminated = this.messageHandler.sendWithPromise(\"Terminate\", null);\n    waitOn.push(terminated);\n\n    if (this.loadingTaskSettled) {\n      const annotationStorageResetModified = this.loadingTask.promise.then(pdfDocument => {\n        if (pdfDocument.hasOwnProperty(\"annotationStorage\")) {\n          pdfDocument.annotationStorage.resetModified();\n        }\n      }).catch(() => {});\n      waitOn.push(annotationStorageResetModified);\n    }\n\n    Promise.all(waitOn).then(() => {\n      this.commonObjs.clear();\n      this.fontLoader.clear();\n      this._hasJSActionsPromise = null;\n\n      if (this._networkStream) {\n        this._networkStream.cancelAllRequests(new _util.AbortException(\"Worker was terminated.\"));\n      }\n\n      if (this.messageHandler) {\n        this.messageHandler.destroy();\n        this.messageHandler = null;\n      }\n\n      this.destroyCapability.resolve();\n    }, this.destroyCapability.reject);\n    return this.destroyCapability.promise;\n  }\n\n  setupMessageHandler() {\n    const {\n      messageHandler,\n      loadingTask\n    } = this;\n    messageHandler.on(\"GetReader\", (data, sink) => {\n      (0, _util.assert)(this._networkStream, \"GetReader - no `IPDFStream` instance available.\");\n      this._fullReader = this._networkStream.getFullReader();\n\n      this._fullReader.onProgress = evt => {\n        this._lastProgress = {\n          loaded: evt.loaded,\n          total: evt.total\n        };\n      };\n\n      sink.onPull = () => {\n        this._fullReader.read().then(function ({\n          value,\n          done\n        }) {\n          if (done) {\n            sink.close();\n            return;\n          }\n\n          (0, _util.assert)((0, _util.isArrayBuffer)(value), \"GetReader - expected an ArrayBuffer.\");\n          sink.enqueue(new Uint8Array(value), 1, [value]);\n        }).catch(reason => {\n          sink.error(reason);\n        });\n      };\n\n      sink.onCancel = reason => {\n        this._fullReader.cancel(reason);\n\n        sink.ready.catch(readyReason => {\n          if (this.destroyed) {\n            return;\n          }\n\n          throw readyReason;\n        });\n      };\n    });\n    messageHandler.on(\"ReaderHeadersReady\", data => {\n      const headersCapability = (0, _util.createPromiseCapability)();\n      const fullReader = this._fullReader;\n      fullReader.headersReady.then(() => {\n        if (!fullReader.isStreamingSupported || !fullReader.isRangeSupported) {\n          if (this._lastProgress && loadingTask.onProgress) {\n            loadingTask.onProgress(this._lastProgress);\n          }\n\n          fullReader.onProgress = evt => {\n            if (loadingTask.onProgress) {\n              loadingTask.onProgress({\n                loaded: evt.loaded,\n                total: evt.total\n              });\n            }\n          };\n        }\n\n        headersCapability.resolve({\n          isStreamingSupported: fullReader.isStreamingSupported,\n          isRangeSupported: fullReader.isRangeSupported,\n          contentLength: fullReader.contentLength\n        });\n      }, headersCapability.reject);\n      return headersCapability.promise;\n    });\n    messageHandler.on(\"GetRangeReader\", (data, sink) => {\n      (0, _util.assert)(this._networkStream, \"GetRangeReader - no `IPDFStream` instance available.\");\n\n      const rangeReader = this._networkStream.getRangeReader(data.begin, data.end);\n\n      if (!rangeReader) {\n        sink.close();\n        return;\n      }\n\n      sink.onPull = () => {\n        rangeReader.read().then(function ({\n          value,\n          done\n        }) {\n          if (done) {\n            sink.close();\n            return;\n          }\n\n          (0, _util.assert)((0, _util.isArrayBuffer)(value), \"GetRangeReader - expected an ArrayBuffer.\");\n          sink.enqueue(new Uint8Array(value), 1, [value]);\n        }).catch(reason => {\n          sink.error(reason);\n        });\n      };\n\n      sink.onCancel = reason => {\n        rangeReader.cancel(reason);\n        sink.ready.catch(readyReason => {\n          if (this.destroyed) {\n            return;\n          }\n\n          throw readyReason;\n        });\n      };\n    });\n    messageHandler.on(\"GetDoc\", ({\n      pdfInfo\n    }) => {\n      this._numPages = pdfInfo.numPages;\n\n      loadingTask._capability.resolve(new PDFDocumentProxy(pdfInfo, this));\n    });\n    messageHandler.on(\"DocException\", function (ex) {\n      let reason;\n\n      switch (ex.name) {\n        case \"PasswordException\":\n          reason = new _util.PasswordException(ex.message, ex.code);\n          break;\n\n        case \"InvalidPDFException\":\n          reason = new _util.InvalidPDFException(ex.message);\n          break;\n\n        case \"MissingPDFException\":\n          reason = new _util.MissingPDFException(ex.message);\n          break;\n\n        case \"UnexpectedResponseException\":\n          reason = new _util.UnexpectedResponseException(ex.message, ex.status);\n          break;\n\n        case \"UnknownErrorException\":\n          reason = new _util.UnknownErrorException(ex.message, ex.details);\n          break;\n      }\n\n      if (!(reason instanceof Error)) {\n        const msg = \"DocException - expected a valid Error.\";\n        (0, _util.warn)(msg);\n      }\n\n      loadingTask._capability.reject(reason);\n    });\n    messageHandler.on(\"PasswordRequest\", exception => {\n      this._passwordCapability = (0, _util.createPromiseCapability)();\n\n      if (loadingTask.onPassword) {\n        const updatePassword = password => {\n          this._passwordCapability.resolve({\n            password\n          });\n        };\n\n        try {\n          loadingTask.onPassword(updatePassword, exception.code);\n        } catch (ex) {\n          this._passwordCapability.reject(ex);\n        }\n      } else {\n        this._passwordCapability.reject(new _util.PasswordException(exception.message, exception.code));\n      }\n\n      return this._passwordCapability.promise;\n    });\n    messageHandler.on(\"DataLoaded\", data => {\n      if (loadingTask.onProgress) {\n        loadingTask.onProgress({\n          loaded: data.length,\n          total: data.length\n        });\n      }\n\n      this.downloadInfoCapability.resolve(data);\n    });\n    messageHandler.on(\"StartRenderPage\", data => {\n      if (this.destroyed) {\n        return;\n      }\n\n      const page = this.pageCache[data.pageIndex];\n\n      page._startRenderPage(data.transparency, data.intent);\n    });\n    messageHandler.on(\"commonobj\", data => {\n      if (this.destroyed) {\n        return;\n      }\n\n      const [id, type, exportedData] = data;\n\n      if (this.commonObjs.has(id)) {\n        return;\n      }\n\n      switch (type) {\n        case \"Font\":\n          const params = this._params;\n\n          if (\"error\" in exportedData) {\n            const exportedError = exportedData.error;\n            (0, _util.warn)(`Error during font loading: ${exportedError}`);\n            this.commonObjs.resolve(id, exportedError);\n            break;\n          }\n\n          let fontRegistry = null;\n\n          if (params.pdfBug && globalThis.FontInspector?.enabled) {\n            fontRegistry = {\n              registerFont(font, url) {\n                globalThis.FontInspector.fontAdded(font, url);\n              }\n\n            };\n          }\n\n          const font = new _font_loader.FontFaceObject(exportedData, {\n            isEvalSupported: params.isEvalSupported,\n            disableFontFace: params.disableFontFace,\n            ignoreErrors: params.ignoreErrors,\n            onUnsupportedFeature: this._onUnsupportedFeature.bind(this),\n            fontRegistry\n          });\n          this.fontLoader.bind(font).catch(reason => {\n            return messageHandler.sendWithPromise(\"FontFallback\", {\n              id\n            });\n          }).finally(() => {\n            if (!params.fontExtraProperties && font.data) {\n              font.data = null;\n            }\n\n            this.commonObjs.resolve(id, font);\n          });\n          break;\n\n        case \"FontPath\":\n        case \"Image\":\n          this.commonObjs.resolve(id, exportedData);\n          break;\n\n        default:\n          throw new Error(`Got unknown common object type ${type}`);\n      }\n    });\n    messageHandler.on(\"obj\", data => {\n      if (this.destroyed) {\n        return undefined;\n      }\n\n      const [id, pageIndex, type, imageData] = data;\n      const pageProxy = this.pageCache[pageIndex];\n\n      if (pageProxy.objs.has(id)) {\n        return undefined;\n      }\n\n      switch (type) {\n        case \"Image\":\n          pageProxy.objs.resolve(id, imageData);\n          const MAX_IMAGE_SIZE_TO_STORE = 8000000;\n\n          if (imageData?.data?.length > MAX_IMAGE_SIZE_TO_STORE) {\n            pageProxy.cleanupAfterRender = true;\n          }\n\n          break;\n\n        default:\n          throw new Error(`Got unknown object type ${type}`);\n      }\n\n      return undefined;\n    });\n    messageHandler.on(\"DocProgress\", data => {\n      if (this.destroyed) {\n        return;\n      }\n\n      if (loadingTask.onProgress) {\n        loadingTask.onProgress({\n          loaded: data.loaded,\n          total: data.total\n        });\n      }\n    });\n    messageHandler.on(\"UnsupportedFeature\", this._onUnsupportedFeature.bind(this));\n    messageHandler.on(\"FetchBuiltInCMap\", (data, sink) => {\n      if (this.destroyed) {\n        sink.error(new Error(\"Worker was destroyed\"));\n        return;\n      }\n\n      let fetched = false;\n\n      sink.onPull = () => {\n        if (fetched) {\n          sink.close();\n          return;\n        }\n\n        fetched = true;\n        this.CMapReaderFactory.fetch(data).then(function (builtInCMap) {\n          sink.enqueue(builtInCMap, 1, [builtInCMap.cMapData.buffer]);\n        }).catch(function (reason) {\n          sink.error(reason);\n        });\n      };\n    });\n  }\n\n  _onUnsupportedFeature({\n    featureId\n  }) {\n    if (this.destroyed) {\n      return;\n    }\n\n    if (this.loadingTask.onUnsupportedFeature) {\n      this.loadingTask.onUnsupportedFeature(featureId);\n    }\n  }\n\n  getData() {\n    return this.messageHandler.sendWithPromise(\"GetData\", null);\n  }\n\n  getPage(pageNumber) {\n    if (!Number.isInteger(pageNumber) || pageNumber <= 0 || pageNumber > this._numPages) {\n      return Promise.reject(new Error(\"Invalid page request\"));\n    }\n\n    const pageIndex = pageNumber - 1;\n\n    if (pageIndex in this.pagePromises) {\n      return this.pagePromises[pageIndex];\n    }\n\n    const promise = this.messageHandler.sendWithPromise(\"GetPage\", {\n      pageIndex\n    }).then(pageInfo => {\n      if (this.destroyed) {\n        throw new Error(\"Transport destroyed\");\n      }\n\n      const page = new PDFPageProxy(pageIndex, pageInfo, this, this._params.ownerDocument, this._params.pdfBug);\n      this.pageCache[pageIndex] = page;\n      return page;\n    });\n    this.pagePromises[pageIndex] = promise;\n    return promise;\n  }\n\n  getPageIndex(ref) {\n    return this.messageHandler.sendWithPromise(\"GetPageIndex\", {\n      ref\n    }).catch(function (reason) {\n      return Promise.reject(new Error(reason));\n    });\n  }\n\n  getAnnotations(pageIndex, intent) {\n    return this.messageHandler.sendWithPromise(\"GetAnnotations\", {\n      pageIndex,\n      intent\n    });\n  }\n\n  saveDocument(annotationStorage) {\n    return this.messageHandler.sendWithPromise(\"SaveDocument\", {\n      numPages: this._numPages,\n      annotationStorage: annotationStorage?.serializable || null,\n      filename: this._fullReader?.filename ?? null\n    }).finally(() => {\n      if (annotationStorage) {\n        annotationStorage.resetModified();\n      }\n    });\n  }\n\n  getFieldObjects() {\n    return this.messageHandler.sendWithPromise(\"GetFieldObjects\", null);\n  }\n\n  hasJSActions() {\n    return this._hasJSActionsPromise || (this._hasJSActionsPromise = this.messageHandler.sendWithPromise(\"HasJSActions\", null));\n  }\n\n  getCalculationOrderIds() {\n    return this.messageHandler.sendWithPromise(\"GetCalculationOrderIds\", null);\n  }\n\n  getDestinations() {\n    return this.messageHandler.sendWithPromise(\"GetDestinations\", null);\n  }\n\n  getDestination(id) {\n    if (typeof id !== \"string\") {\n      return Promise.reject(new Error(\"Invalid destination request.\"));\n    }\n\n    return this.messageHandler.sendWithPromise(\"GetDestination\", {\n      id\n    });\n  }\n\n  getPageLabels() {\n    return this.messageHandler.sendWithPromise(\"GetPageLabels\", null);\n  }\n\n  getPageLayout() {\n    return this.messageHandler.sendWithPromise(\"GetPageLayout\", null);\n  }\n\n  getPageMode() {\n    return this.messageHandler.sendWithPromise(\"GetPageMode\", null);\n  }\n\n  getViewerPreferences() {\n    return this.messageHandler.sendWithPromise(\"GetViewerPreferences\", null);\n  }\n\n  getOpenAction() {\n    return this.messageHandler.sendWithPromise(\"GetOpenAction\", null);\n  }\n\n  getAttachments() {\n    return this.messageHandler.sendWithPromise(\"GetAttachments\", null);\n  }\n\n  getJavaScript() {\n    return this.messageHandler.sendWithPromise(\"GetJavaScript\", null);\n  }\n\n  getDocJSActions() {\n    return this.messageHandler.sendWithPromise(\"GetDocJSActions\", null);\n  }\n\n  getPageJSActions(pageIndex) {\n    return this.messageHandler.sendWithPromise(\"GetPageJSActions\", {\n      pageIndex\n    });\n  }\n\n  getPageXfa(pageIndex) {\n    return this.messageHandler.sendWithPromise(\"GetPageXfa\", {\n      pageIndex\n    });\n  }\n\n  getOutline() {\n    return this.messageHandler.sendWithPromise(\"GetOutline\", null);\n  }\n\n  getOptionalContentConfig() {\n    return this.messageHandler.sendWithPromise(\"GetOptionalContentConfig\", null).then(results => {\n      return new _optional_content_config.OptionalContentConfig(results);\n    });\n  }\n\n  getPermissions() {\n    return this.messageHandler.sendWithPromise(\"GetPermissions\", null);\n  }\n\n  getMetadata() {\n    return this.messageHandler.sendWithPromise(\"GetMetadata\", null).then(results => {\n      return {\n        info: results[0],\n        metadata: results[1] ? new _metadata.Metadata(results[1]) : null,\n        contentDispositionFilename: this._fullReader?.filename ?? null,\n        contentLength: this._fullReader?.contentLength ?? null\n      };\n    });\n  }\n\n  getMarkInfo() {\n    return this.messageHandler.sendWithPromise(\"GetMarkInfo\", null);\n  }\n\n  getStats() {\n    return this.messageHandler.sendWithPromise(\"GetStats\", null);\n  }\n\n  async startCleanup(keepLoadedFonts = false) {\n    await this.messageHandler.sendWithPromise(\"Cleanup\", null);\n\n    if (this.destroyed) {\n      return;\n    }\n\n    for (let i = 0, ii = this.pageCache.length; i < ii; i++) {\n      const page = this.pageCache[i];\n\n      if (!page) {\n        continue;\n      }\n\n      const cleanupSuccessful = page.cleanup();\n\n      if (!cleanupSuccessful) {\n        throw new Error(`startCleanup: Page ${i + 1} is currently rendering.`);\n      }\n    }\n\n    this.commonObjs.clear();\n\n    if (!keepLoadedFonts) {\n      this.fontLoader.clear();\n    }\n\n    this._hasJSActionsPromise = null;\n  }\n\n  get loadingParams() {\n    const params = this._params;\n    return (0, _util.shadow)(this, \"loadingParams\", {\n      disableAutoFetch: params.disableAutoFetch,\n      disableFontFace: params.disableFontFace\n    });\n  }\n\n}\n\nclass PDFObjects {\n  constructor() {\n    this._objs = Object.create(null);\n  }\n\n  _ensureObj(objId) {\n    if (this._objs[objId]) {\n      return this._objs[objId];\n    }\n\n    return this._objs[objId] = {\n      capability: (0, _util.createPromiseCapability)(),\n      data: null,\n      resolved: false\n    };\n  }\n\n  get(objId, callback = null) {\n    if (callback) {\n      this._ensureObj(objId).capability.promise.then(callback);\n\n      return null;\n    }\n\n    const obj = this._objs[objId];\n\n    if (!obj || !obj.resolved) {\n      throw new Error(`Requesting object that isn't resolved yet ${objId}.`);\n    }\n\n    return obj.data;\n  }\n\n  has(objId) {\n    const obj = this._objs[objId];\n    return obj?.resolved || false;\n  }\n\n  resolve(objId, data) {\n    const obj = this._ensureObj(objId);\n\n    obj.resolved = true;\n    obj.data = data;\n    obj.capability.resolve(data);\n  }\n\n  clear() {\n    this._objs = Object.create(null);\n  }\n\n}\n\nclass RenderTask {\n  constructor(internalRenderTask) {\n    this._internalRenderTask = internalRenderTask;\n    this.onContinue = null;\n  }\n\n  get promise() {\n    return this._internalRenderTask.capability.promise;\n  }\n\n  cancel() {\n    this._internalRenderTask.cancel();\n  }\n\n}\n\nconst InternalRenderTask = function InternalRenderTaskClosure() {\n  const canvasInRendering = new WeakSet();\n\n  class InternalRenderTask {\n    constructor({\n      callback,\n      params,\n      objs,\n      commonObjs,\n      operatorList,\n      pageIndex,\n      canvasFactory,\n      webGLContext,\n      useRequestAnimationFrame = false,\n      pdfBug = false\n    }) {\n      this.callback = callback;\n      this.params = params;\n      this.objs = objs;\n      this.commonObjs = commonObjs;\n      this.operatorListIdx = null;\n      this.operatorList = operatorList;\n      this._pageIndex = pageIndex;\n      this.canvasFactory = canvasFactory;\n      this.webGLContext = webGLContext;\n      this._pdfBug = pdfBug;\n      this.running = false;\n      this.graphicsReadyCallback = null;\n      this.graphicsReady = false;\n      this._useRequestAnimationFrame = useRequestAnimationFrame === true && typeof window !== \"undefined\";\n      this.cancelled = false;\n      this.capability = (0, _util.createPromiseCapability)();\n      this.task = new RenderTask(this);\n      this._cancelBound = this.cancel.bind(this);\n      this._continueBound = this._continue.bind(this);\n      this._scheduleNextBound = this._scheduleNext.bind(this);\n      this._nextBound = this._next.bind(this);\n      this._canvas = params.canvasContext.canvas;\n    }\n\n    get completed() {\n      return this.capability.promise.catch(function () {});\n    }\n\n    initializeGraphics({\n      transparency = false,\n      optionalContentConfig\n    }) {\n      if (this.cancelled) {\n        return;\n      }\n\n      if (this._canvas) {\n        if (canvasInRendering.has(this._canvas)) {\n          throw new Error(\"Cannot use the same canvas during multiple render() operations. \" + \"Use different canvas or ensure previous operations were \" + \"cancelled or completed.\");\n        }\n\n        canvasInRendering.add(this._canvas);\n      }\n\n      if (this._pdfBug && globalThis.StepperManager?.enabled) {\n        this.stepper = globalThis.StepperManager.create(this._pageIndex);\n        this.stepper.init(this.operatorList);\n        this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();\n      }\n\n      const {\n        canvasContext,\n        viewport,\n        transform,\n        imageLayer,\n        background\n      } = this.params;\n      this.gfx = new _canvas.CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, this.webGLContext, imageLayer, optionalContentConfig);\n      this.gfx.beginDrawing({\n        transform,\n        viewport,\n        transparency,\n        background\n      });\n      this.operatorListIdx = 0;\n      this.graphicsReady = true;\n\n      if (this.graphicsReadyCallback) {\n        this.graphicsReadyCallback();\n      }\n    }\n\n    cancel(error = null) {\n      this.running = false;\n      this.cancelled = true;\n\n      if (this.gfx) {\n        this.gfx.endDrawing();\n      }\n\n      if (this._canvas) {\n        canvasInRendering.delete(this._canvas);\n      }\n\n      this.callback(error || new _display_utils.RenderingCancelledException(`Rendering cancelled, page ${this._pageIndex + 1}`, \"canvas\"));\n    }\n\n    operatorListChanged() {\n      if (!this.graphicsReady) {\n        if (!this.graphicsReadyCallback) {\n          this.graphicsReadyCallback = this._continueBound;\n        }\n\n        return;\n      }\n\n      if (this.stepper) {\n        this.stepper.updateOperatorList(this.operatorList);\n      }\n\n      if (this.running) {\n        return;\n      }\n\n      this._continue();\n    }\n\n    _continue() {\n      this.running = true;\n\n      if (this.cancelled) {\n        return;\n      }\n\n      if (this.task.onContinue) {\n        this.task.onContinue(this._scheduleNextBound);\n      } else {\n        this._scheduleNext();\n      }\n    }\n\n    _scheduleNext() {\n      if (this._useRequestAnimationFrame) {\n        window.requestAnimationFrame(() => {\n          this._nextBound().catch(this._cancelBound);\n        });\n      } else {\n        Promise.resolve().then(this._nextBound).catch(this._cancelBound);\n      }\n    }\n\n    async _next() {\n      if (this.cancelled) {\n        return;\n      }\n\n      this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper);\n\n      if (this.operatorListIdx === this.operatorList.argsArray.length) {\n        this.running = false;\n\n        if (this.operatorList.lastChunk) {\n          this.gfx.endDrawing();\n\n          if (this._canvas) {\n            canvasInRendering.delete(this._canvas);\n          }\n\n          this.callback();\n        }\n      }\n    }\n\n  }\n\n  return InternalRenderTask;\n}();\n\nconst version = '2.8.335';\nexports.version = version;\nconst build = '228adbf67';\nexports.build = build;\n\n/***/ }),\n/* 6 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.FontLoader = exports.FontFaceObject = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nclass BaseFontLoader {\n  constructor({\n    docId,\n    onUnsupportedFeature,\n    ownerDocument = globalThis.document\n  }) {\n    if (this.constructor === BaseFontLoader) {\n      (0, _util.unreachable)(\"Cannot initialize BaseFontLoader.\");\n    }\n\n    this.docId = docId;\n    this._onUnsupportedFeature = onUnsupportedFeature;\n    this._document = ownerDocument;\n    this.nativeFontFaces = [];\n    this.styleElement = null;\n  }\n\n  addNativeFontFace(nativeFontFace) {\n    this.nativeFontFaces.push(nativeFontFace);\n\n    this._document.fonts.add(nativeFontFace);\n  }\n\n  insertRule(rule) {\n    let styleElement = this.styleElement;\n\n    if (!styleElement) {\n      styleElement = this.styleElement = this._document.createElement(\"style\");\n      styleElement.id = `PDFJS_FONT_STYLE_TAG_${this.docId}`;\n\n      this._document.documentElement.getElementsByTagName(\"head\")[0].appendChild(styleElement);\n    }\n\n    const styleSheet = styleElement.sheet;\n    styleSheet.insertRule(rule, styleSheet.cssRules.length);\n  }\n\n  clear() {\n    this.nativeFontFaces.forEach(nativeFontFace => {\n      this._document.fonts.delete(nativeFontFace);\n    });\n    this.nativeFontFaces.length = 0;\n\n    if (this.styleElement) {\n      this.styleElement.remove();\n      this.styleElement = null;\n    }\n  }\n\n  async bind(font) {\n    if (font.attached || font.missingFile) {\n      return;\n    }\n\n    font.attached = true;\n\n    if (this.isFontLoadingAPISupported) {\n      const nativeFontFace = font.createNativeFontFace();\n\n      if (nativeFontFace) {\n        this.addNativeFontFace(nativeFontFace);\n\n        try {\n          await nativeFontFace.loaded;\n        } catch (ex) {\n          this._onUnsupportedFeature({\n            featureId: _util.UNSUPPORTED_FEATURES.errorFontLoadNative\n          });\n\n          (0, _util.warn)(`Failed to load font '${nativeFontFace.family}': '${ex}'.`);\n          font.disableFontFace = true;\n          throw ex;\n        }\n      }\n\n      return;\n    }\n\n    const rule = font.createFontFaceRule();\n\n    if (rule) {\n      this.insertRule(rule);\n\n      if (this.isSyncFontLoadingSupported) {\n        return;\n      }\n\n      await new Promise(resolve => {\n        const request = this._queueLoadingCallback(resolve);\n\n        this._prepareFontLoadEvent([rule], [font], request);\n      });\n    }\n  }\n\n  _queueLoadingCallback(callback) {\n    (0, _util.unreachable)(\"Abstract method `_queueLoadingCallback`.\");\n  }\n\n  get isFontLoadingAPISupported() {\n    return (0, _util.shadow)(this, \"isFontLoadingAPISupported\", !!this._document?.fonts);\n  }\n\n  get isSyncFontLoadingSupported() {\n    (0, _util.unreachable)(\"Abstract method `isSyncFontLoadingSupported`.\");\n  }\n\n  get _loadTestFont() {\n    (0, _util.unreachable)(\"Abstract method `_loadTestFont`.\");\n  }\n\n  _prepareFontLoadEvent(rules, fontsToLoad, request) {\n    (0, _util.unreachable)(\"Abstract method `_prepareFontLoadEvent`.\");\n  }\n\n}\n\nlet FontLoader;\nexports.FontLoader = FontLoader;\n{\n  exports.FontLoader = FontLoader = class GenericFontLoader extends BaseFontLoader {\n    constructor(params) {\n      super(params);\n      this.loadingContext = {\n        requests: [],\n        nextRequestId: 0\n      };\n      this.loadTestFontId = 0;\n    }\n\n    get isSyncFontLoadingSupported() {\n      let supported = false;\n\n      if (typeof navigator === \"undefined\") {\n        supported = true;\n      } else {\n        const m = /Mozilla\\/5.0.*?rv:(\\d+).*? Gecko/.exec(navigator.userAgent);\n\n        if (m?.[1] >= 14) {\n          supported = true;\n        }\n      }\n\n      return (0, _util.shadow)(this, \"isSyncFontLoadingSupported\", supported);\n    }\n\n    _queueLoadingCallback(callback) {\n      function completeRequest() {\n        (0, _util.assert)(!request.done, \"completeRequest() cannot be called twice.\");\n        request.done = true;\n\n        while (context.requests.length > 0 && context.requests[0].done) {\n          const otherRequest = context.requests.shift();\n          setTimeout(otherRequest.callback, 0);\n        }\n      }\n\n      const context = this.loadingContext;\n      const request = {\n        id: `pdfjs-font-loading-${context.nextRequestId++}`,\n        done: false,\n        complete: completeRequest,\n        callback\n      };\n      context.requests.push(request);\n      return request;\n    }\n\n    get _loadTestFont() {\n      const getLoadTestFont = function () {\n        return atob(\"T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA\" + \"FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA\" + \"ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA\" + \"AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1\" + \"AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD\" + \"6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM\" + \"AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D\" + \"IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA\" + \"AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA\" + \"AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB\" + \"AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY\" + \"AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA\" + \"AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" + \"AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" + \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" + \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" + \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" + \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA\" + \"AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC\" + \"AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3\" + \"Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj\" + \"FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA==\");\n      };\n\n      return (0, _util.shadow)(this, \"_loadTestFont\", getLoadTestFont());\n    }\n\n    _prepareFontLoadEvent(rules, fonts, request) {\n      function int32(data, offset) {\n        return data.charCodeAt(offset) << 24 | data.charCodeAt(offset + 1) << 16 | data.charCodeAt(offset + 2) << 8 | data.charCodeAt(offset + 3) & 0xff;\n      }\n\n      function spliceString(s, offset, remove, insert) {\n        const chunk1 = s.substring(0, offset);\n        const chunk2 = s.substring(offset + remove);\n        return chunk1 + insert + chunk2;\n      }\n\n      let i, ii;\n\n      const canvas = this._document.createElement(\"canvas\");\n\n      canvas.width = 1;\n      canvas.height = 1;\n      const ctx = canvas.getContext(\"2d\");\n      let called = 0;\n\n      function isFontReady(name, callback) {\n        called++;\n\n        if (called > 30) {\n          (0, _util.warn)(\"Load test font never loaded.\");\n          callback();\n          return;\n        }\n\n        ctx.font = \"30px \" + name;\n        ctx.fillText(\".\", 0, 20);\n        const imageData = ctx.getImageData(0, 0, 1, 1);\n\n        if (imageData.data[3] > 0) {\n          callback();\n          return;\n        }\n\n        setTimeout(isFontReady.bind(null, name, callback));\n      }\n\n      const loadTestFontId = `lt${Date.now()}${this.loadTestFontId++}`;\n      let data = this._loadTestFont;\n      const COMMENT_OFFSET = 976;\n      data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId);\n      const CFF_CHECKSUM_OFFSET = 16;\n      const XXXX_VALUE = 0x58585858;\n      let checksum = int32(data, CFF_CHECKSUM_OFFSET);\n\n      for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) {\n        checksum = checksum - XXXX_VALUE + int32(loadTestFontId, i) | 0;\n      }\n\n      if (i < loadTestFontId.length) {\n        checksum = checksum - XXXX_VALUE + int32(loadTestFontId + \"XXX\", i) | 0;\n      }\n\n      data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, (0, _util.string32)(checksum));\n      const url = `url(data:font/opentype;base64,${btoa(data)});`;\n      const rule = `@font-face {font-family:\"${loadTestFontId}\";src:${url}}`;\n      this.insertRule(rule);\n      const names = [];\n\n      for (i = 0, ii = fonts.length; i < ii; i++) {\n        names.push(fonts[i].loadedName);\n      }\n\n      names.push(loadTestFontId);\n\n      const div = this._document.createElement(\"div\");\n\n      div.style.visibility = \"hidden\";\n      div.style.width = div.style.height = \"10px\";\n      div.style.position = \"absolute\";\n      div.style.top = div.style.left = \"0px\";\n\n      for (i = 0, ii = names.length; i < ii; ++i) {\n        const span = this._document.createElement(\"span\");\n\n        span.textContent = \"Hi\";\n        span.style.fontFamily = names[i];\n        div.appendChild(span);\n      }\n\n      this._document.body.appendChild(div);\n\n      isFontReady(loadTestFontId, () => {\n        this._document.body.removeChild(div);\n\n        request.complete();\n      });\n    }\n\n  };\n}\n\nclass FontFaceObject {\n  constructor(translatedData, {\n    isEvalSupported = true,\n    disableFontFace = false,\n    ignoreErrors = false,\n    onUnsupportedFeature,\n    fontRegistry = null\n  }) {\n    this.compiledGlyphs = Object.create(null);\n\n    for (const i in translatedData) {\n      this[i] = translatedData[i];\n    }\n\n    this.isEvalSupported = isEvalSupported !== false;\n    this.disableFontFace = disableFontFace === true;\n    this.ignoreErrors = ignoreErrors === true;\n    this._onUnsupportedFeature = onUnsupportedFeature;\n    this.fontRegistry = fontRegistry;\n  }\n\n  createNativeFontFace() {\n    if (!this.data || this.disableFontFace) {\n      return null;\n    }\n\n    const nativeFontFace = new FontFace(this.loadedName, this.data, {});\n\n    if (this.fontRegistry) {\n      this.fontRegistry.registerFont(this);\n    }\n\n    return nativeFontFace;\n  }\n\n  createFontFaceRule() {\n    if (!this.data || this.disableFontFace) {\n      return null;\n    }\n\n    const data = (0, _util.bytesToString)(new Uint8Array(this.data));\n    const url = `url(data:${this.mimetype};base64,${btoa(data)});`;\n    const rule = `@font-face {font-family:\"${this.loadedName}\";src:${url}}`;\n\n    if (this.fontRegistry) {\n      this.fontRegistry.registerFont(this, url);\n    }\n\n    return rule;\n  }\n\n  getPathGenerator(objs, character) {\n    if (this.compiledGlyphs[character] !== undefined) {\n      return this.compiledGlyphs[character];\n    }\n\n    let cmds, current;\n\n    try {\n      cmds = objs.get(this.loadedName + \"_path_\" + character);\n    } catch (ex) {\n      if (!this.ignoreErrors) {\n        throw ex;\n      }\n\n      this._onUnsupportedFeature({\n        featureId: _util.UNSUPPORTED_FEATURES.errorFontGetPath\n      });\n\n      (0, _util.warn)(`getPathGenerator - ignoring character: \"${ex}\".`);\n      return this.compiledGlyphs[character] = function (c, size) {};\n    }\n\n    if (this.isEvalSupported && _util.IsEvalSupportedCached.value) {\n      let args,\n          js = \"\";\n\n      for (let i = 0, ii = cmds.length; i < ii; i++) {\n        current = cmds[i];\n\n        if (current.args !== undefined) {\n          args = current.args.join(\",\");\n        } else {\n          args = \"\";\n        }\n\n        js += \"c.\" + current.cmd + \"(\" + args + \");\\n\";\n      }\n\n      return this.compiledGlyphs[character] = new Function(\"c\", \"size\", js);\n    }\n\n    return this.compiledGlyphs[character] = function (c, size) {\n      for (let i = 0, ii = cmds.length; i < ii; i++) {\n        current = cmds[i];\n\n        if (current.cmd === \"scale\") {\n          current.args = [size, -size];\n        }\n\n        c[current.cmd].apply(c, current.args);\n      }\n    };\n  }\n\n}\n\nexports.FontFaceObject = FontFaceObject;\n\n/***/ }),\n/* 7 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.NodeCMapReaderFactory = exports.NodeCanvasFactory = void 0;\n\nvar _display_utils = __w_pdfjs_require__(1);\n\nvar _is_node = __w_pdfjs_require__(4);\n\nvar _util = __w_pdfjs_require__(2);\n\nlet NodeCanvasFactory = class {\n  constructor() {\n    (0, _util.unreachable)(\"Not implemented: NodeCanvasFactory\");\n  }\n\n};\nexports.NodeCanvasFactory = NodeCanvasFactory;\nlet NodeCMapReaderFactory = class {\n  constructor() {\n    (0, _util.unreachable)(\"Not implemented: NodeCMapReaderFactory\");\n  }\n\n};\nexports.NodeCMapReaderFactory = NodeCMapReaderFactory;\n\nif (_is_node.isNodeJS) {\n  exports.NodeCanvasFactory = NodeCanvasFactory = class extends _display_utils.BaseCanvasFactory {\n    create(width, height) {\n      if (width <= 0 || height <= 0) {\n        throw new Error(\"Invalid canvas size\");\n      }\n\n      const Canvas = require(\"canvas\");\n\n      const canvas = Canvas.createCanvas(width, height);\n      return {\n        canvas,\n        context: canvas.getContext(\"2d\")\n      };\n    }\n\n  };\n  exports.NodeCMapReaderFactory = NodeCMapReaderFactory = class extends _display_utils.BaseCMapReaderFactory {\n    _fetchData(url, compressionType) {\n      return new Promise((resolve, reject) => {\n        const fs = require(\"fs\");\n\n        fs.readFile(url, (error, data) => {\n          if (error || !data) {\n            reject(new Error(error));\n            return;\n          }\n\n          resolve({\n            cMapData: new Uint8Array(data),\n            compressionType\n          });\n        });\n      });\n    }\n\n  };\n}\n\n/***/ }),\n/* 8 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.AnnotationStorage = void 0;\n\nvar _display_utils = __w_pdfjs_require__(1);\n\nvar _util = __w_pdfjs_require__(2);\n\nclass AnnotationStorage {\n  constructor() {\n    this._storage = new Map();\n    this._modified = false;\n    this.onSetModified = null;\n    this.onResetModified = null;\n  }\n\n  getValue(key, defaultValue) {\n    const obj = this._storage.get(key);\n\n    return obj !== undefined ? obj : defaultValue;\n  }\n\n  getOrCreateValue(key, defaultValue) {\n    (0, _display_utils.deprecated)(\"Use getValue instead.\");\n\n    if (this._storage.has(key)) {\n      return this._storage.get(key);\n    }\n\n    this._storage.set(key, defaultValue);\n\n    return defaultValue;\n  }\n\n  setValue(key, value) {\n    const obj = this._storage.get(key);\n\n    let modified = false;\n\n    if (obj !== undefined) {\n      for (const [entry, val] of Object.entries(value)) {\n        if (obj[entry] !== val) {\n          modified = true;\n          obj[entry] = val;\n        }\n      }\n    } else {\n      this._storage.set(key, value);\n\n      modified = true;\n    }\n\n    if (modified) {\n      this._setModified();\n    }\n  }\n\n  getAll() {\n    return this._storage.size > 0 ? (0, _util.objectFromMap)(this._storage) : null;\n  }\n\n  get size() {\n    return this._storage.size;\n  }\n\n  _setModified() {\n    if (!this._modified) {\n      this._modified = true;\n\n      if (typeof this.onSetModified === \"function\") {\n        this.onSetModified();\n      }\n    }\n  }\n\n  resetModified() {\n    if (this._modified) {\n      this._modified = false;\n\n      if (typeof this.onResetModified === \"function\") {\n        this.onResetModified();\n      }\n    }\n  }\n\n  get serializable() {\n    return this._storage.size > 0 ? this._storage : null;\n  }\n\n}\n\nexports.AnnotationStorage = AnnotationStorage;\n\n/***/ }),\n/* 9 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.apiCompatibilityParams = void 0;\n\nvar _is_node = __w_pdfjs_require__(4);\n\nconst compatibilityParams = Object.create(null);\n{\n  (function checkFontFace() {\n    if (_is_node.isNodeJS) {\n      compatibilityParams.disableFontFace = true;\n    }\n  })();\n}\nconst apiCompatibilityParams = Object.freeze(compatibilityParams);\nexports.apiCompatibilityParams = apiCompatibilityParams;\n\n/***/ }),\n/* 10 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.CanvasGraphics = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _pattern_helper = __w_pdfjs_require__(11);\n\nconst MIN_FONT_SIZE = 16;\nconst MAX_FONT_SIZE = 100;\nconst MAX_GROUP_SIZE = 4096;\nconst COMPILE_TYPE3_GLYPHS = true;\nconst MAX_SIZE_TO_COMPILE = 1000;\nconst FULL_CHUNK_HEIGHT = 16;\nconst LINEWIDTH_SCALE_FACTOR = 1.000001;\n\nfunction addContextCurrentTransform(ctx) {\n  if (!ctx.mozCurrentTransform) {\n    ctx._originalSave = ctx.save;\n    ctx._originalRestore = ctx.restore;\n    ctx._originalRotate = ctx.rotate;\n    ctx._originalScale = ctx.scale;\n    ctx._originalTranslate = ctx.translate;\n    ctx._originalTransform = ctx.transform;\n    ctx._originalSetTransform = ctx.setTransform;\n    ctx._originalResetTransform = ctx.resetTransform;\n    ctx._transformMatrix = ctx._transformMatrix || [1, 0, 0, 1, 0, 0];\n    ctx._transformStack = [];\n\n    try {\n      const desc = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(ctx), \"lineWidth\");\n      ctx._setLineWidth = desc.set;\n      ctx._getLineWidth = desc.get;\n      Object.defineProperty(ctx, \"lineWidth\", {\n        set: function setLineWidth(width) {\n          this._setLineWidth(width * LINEWIDTH_SCALE_FACTOR);\n        },\n        get: function getLineWidth() {\n          return this._getLineWidth();\n        }\n      });\n    } catch (_) {}\n\n    Object.defineProperty(ctx, \"mozCurrentTransform\", {\n      get: function getCurrentTransform() {\n        return this._transformMatrix;\n      }\n    });\n    Object.defineProperty(ctx, \"mozCurrentTransformInverse\", {\n      get: function getCurrentTransformInverse() {\n        const m = this._transformMatrix;\n        const a = m[0],\n              b = m[1],\n              c = m[2],\n              d = m[3],\n              e = m[4],\n              f = m[5];\n        const ad_bc = a * d - b * c;\n        const bc_ad = b * c - a * d;\n        return [d / ad_bc, b / bc_ad, c / bc_ad, a / ad_bc, (d * e - c * f) / bc_ad, (b * e - a * f) / ad_bc];\n      }\n    });\n\n    ctx.save = function ctxSave() {\n      const old = this._transformMatrix;\n\n      this._transformStack.push(old);\n\n      this._transformMatrix = old.slice(0, 6);\n\n      this._originalSave();\n    };\n\n    ctx.restore = function ctxRestore() {\n      const prev = this._transformStack.pop();\n\n      if (prev) {\n        this._transformMatrix = prev;\n\n        this._originalRestore();\n      }\n    };\n\n    ctx.translate = function ctxTranslate(x, y) {\n      const m = this._transformMatrix;\n      m[4] = m[0] * x + m[2] * y + m[4];\n      m[5] = m[1] * x + m[3] * y + m[5];\n\n      this._originalTranslate(x, y);\n    };\n\n    ctx.scale = function ctxScale(x, y) {\n      const m = this._transformMatrix;\n      m[0] = m[0] * x;\n      m[1] = m[1] * x;\n      m[2] = m[2] * y;\n      m[3] = m[3] * y;\n\n      this._originalScale(x, y);\n    };\n\n    ctx.transform = function ctxTransform(a, b, c, d, e, f) {\n      const m = this._transformMatrix;\n      this._transformMatrix = [m[0] * a + m[2] * b, m[1] * a + m[3] * b, m[0] * c + m[2] * d, m[1] * c + m[3] * d, m[0] * e + m[2] * f + m[4], m[1] * e + m[3] * f + m[5]];\n\n      ctx._originalTransform(a, b, c, d, e, f);\n    };\n\n    ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {\n      this._transformMatrix = [a, b, c, d, e, f];\n\n      ctx._originalSetTransform(a, b, c, d, e, f);\n    };\n\n    ctx.resetTransform = function ctxResetTransform() {\n      this._transformMatrix = [1, 0, 0, 1, 0, 0];\n\n      ctx._originalResetTransform();\n    };\n\n    ctx.rotate = function ctxRotate(angle) {\n      const cosValue = Math.cos(angle);\n      const sinValue = Math.sin(angle);\n      const m = this._transformMatrix;\n      this._transformMatrix = [m[0] * cosValue + m[2] * sinValue, m[1] * cosValue + m[3] * sinValue, m[0] * -sinValue + m[2] * cosValue, m[1] * -sinValue + m[3] * cosValue, m[4], m[5]];\n\n      this._originalRotate(angle);\n    };\n  }\n}\n\nconst CachedCanvases = function CachedCanvasesClosure() {\n  function CachedCanvases(canvasFactory) {\n    this.canvasFactory = canvasFactory;\n    this.cache = Object.create(null);\n  }\n\n  CachedCanvases.prototype = {\n    getCanvas: function CachedCanvases_getCanvas(id, width, height, trackTransform) {\n      let canvasEntry;\n\n      if (this.cache[id] !== undefined) {\n        canvasEntry = this.cache[id];\n        this.canvasFactory.reset(canvasEntry, width, height);\n        canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0);\n      } else {\n        canvasEntry = this.canvasFactory.create(width, height);\n        this.cache[id] = canvasEntry;\n      }\n\n      if (trackTransform) {\n        addContextCurrentTransform(canvasEntry.context);\n      }\n\n      return canvasEntry;\n    },\n\n    clear() {\n      for (const id in this.cache) {\n        const canvasEntry = this.cache[id];\n        this.canvasFactory.destroy(canvasEntry);\n        delete this.cache[id];\n      }\n    }\n\n  };\n  return CachedCanvases;\n}();\n\nfunction compileType3Glyph(imgData) {\n  const POINT_TO_PROCESS_LIMIT = 1000;\n  const width = imgData.width,\n        height = imgData.height,\n        width1 = width + 1;\n  let i, ii, j, j0;\n  const points = new Uint8Array(width1 * (height + 1));\n  const POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]);\n  const lineSize = width + 7 & ~7,\n        data0 = imgData.data;\n  const data = new Uint8Array(lineSize * height);\n  let pos = 0;\n\n  for (i = 0, ii = data0.length; i < ii; i++) {\n    const elem = data0[i];\n    let mask = 128;\n\n    while (mask > 0) {\n      data[pos++] = elem & mask ? 0 : 255;\n      mask >>= 1;\n    }\n  }\n\n  let count = 0;\n  pos = 0;\n\n  if (data[pos] !== 0) {\n    points[0] = 1;\n    ++count;\n  }\n\n  for (j = 1; j < width; j++) {\n    if (data[pos] !== data[pos + 1]) {\n      points[j] = data[pos] ? 2 : 1;\n      ++count;\n    }\n\n    pos++;\n  }\n\n  if (data[pos] !== 0) {\n    points[j] = 2;\n    ++count;\n  }\n\n  for (i = 1; i < height; i++) {\n    pos = i * lineSize;\n    j0 = i * width1;\n\n    if (data[pos - lineSize] !== data[pos]) {\n      points[j0] = data[pos] ? 1 : 8;\n      ++count;\n    }\n\n    let sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);\n\n    for (j = 1; j < width; j++) {\n      sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) + (data[pos - lineSize + 1] ? 8 : 0);\n\n      if (POINT_TYPES[sum]) {\n        points[j0 + j] = POINT_TYPES[sum];\n        ++count;\n      }\n\n      pos++;\n    }\n\n    if (data[pos - lineSize] !== data[pos]) {\n      points[j0 + j] = data[pos] ? 2 : 4;\n      ++count;\n    }\n\n    if (count > POINT_TO_PROCESS_LIMIT) {\n      return null;\n    }\n  }\n\n  pos = lineSize * (height - 1);\n  j0 = i * width1;\n\n  if (data[pos] !== 0) {\n    points[j0] = 8;\n    ++count;\n  }\n\n  for (j = 1; j < width; j++) {\n    if (data[pos] !== data[pos + 1]) {\n      points[j0 + j] = data[pos] ? 4 : 8;\n      ++count;\n    }\n\n    pos++;\n  }\n\n  if (data[pos] !== 0) {\n    points[j0 + j] = 4;\n    ++count;\n  }\n\n  if (count > POINT_TO_PROCESS_LIMIT) {\n    return null;\n  }\n\n  const steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);\n  const outlines = [];\n\n  for (i = 0; count && i <= height; i++) {\n    let p = i * width1;\n    const end = p + width;\n\n    while (p < end && !points[p]) {\n      p++;\n    }\n\n    if (p === end) {\n      continue;\n    }\n\n    const coords = [p % width1, i];\n    const p0 = p;\n    let type = points[p];\n\n    do {\n      const step = steps[type];\n\n      do {\n        p += step;\n      } while (!points[p]);\n\n      const pp = points[p];\n\n      if (pp !== 5 && pp !== 10) {\n        type = pp;\n        points[p] = 0;\n      } else {\n        type = pp & 0x33 * type >> 4;\n        points[p] &= type >> 2 | type << 2;\n      }\n\n      coords.push(p % width1);\n      coords.push(p / width1 | 0);\n\n      if (!points[p]) {\n        --count;\n      }\n    } while (p0 !== p);\n\n    outlines.push(coords);\n    --i;\n  }\n\n  const drawOutline = function (c) {\n    c.save();\n    c.scale(1 / width, -1 / height);\n    c.translate(0, -height);\n    c.beginPath();\n\n    for (let k = 0, kk = outlines.length; k < kk; k++) {\n      const o = outlines[k];\n      c.moveTo(o[0], o[1]);\n\n      for (let l = 2, ll = o.length; l < ll; l += 2) {\n        c.lineTo(o[l], o[l + 1]);\n      }\n    }\n\n    c.fill();\n    c.beginPath();\n    c.restore();\n  };\n\n  return drawOutline;\n}\n\nconst CanvasExtraState = function CanvasExtraStateClosure() {\n  function CanvasExtraState() {\n    this.alphaIsShape = false;\n    this.fontSize = 0;\n    this.fontSizeScale = 1;\n    this.textMatrix = _util.IDENTITY_MATRIX;\n    this.textMatrixScale = 1;\n    this.fontMatrix = _util.FONT_IDENTITY_MATRIX;\n    this.leading = 0;\n    this.x = 0;\n    this.y = 0;\n    this.lineX = 0;\n    this.lineY = 0;\n    this.charSpacing = 0;\n    this.wordSpacing = 0;\n    this.textHScale = 1;\n    this.textRenderingMode = _util.TextRenderingMode.FILL;\n    this.textRise = 0;\n    this.fillColor = \"#000000\";\n    this.strokeColor = \"#000000\";\n    this.patternFill = false;\n    this.fillAlpha = 1;\n    this.strokeAlpha = 1;\n    this.lineWidth = 1;\n    this.activeSMask = null;\n    this.resumeSMaskCtx = null;\n    this.transferMaps = null;\n  }\n\n  CanvasExtraState.prototype = {\n    clone: function CanvasExtraState_clone() {\n      return Object.create(this);\n    },\n    setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {\n      this.x = x;\n      this.y = y;\n    }\n  };\n  return CanvasExtraState;\n}();\n\nconst CanvasGraphics = function CanvasGraphicsClosure() {\n  const EXECUTION_TIME = 15;\n  const EXECUTION_STEPS = 10;\n\n  function CanvasGraphics(canvasCtx, commonObjs, objs, canvasFactory, webGLContext, imageLayer, optionalContentConfig) {\n    this.ctx = canvasCtx;\n    this.current = new CanvasExtraState();\n    this.stateStack = [];\n    this.pendingClip = null;\n    this.pendingEOFill = false;\n    this.res = null;\n    this.xobjs = null;\n    this.commonObjs = commonObjs;\n    this.objs = objs;\n    this.canvasFactory = canvasFactory;\n    this.webGLContext = webGLContext;\n    this.imageLayer = imageLayer;\n    this.groupStack = [];\n    this.processingType3 = null;\n    this.baseTransform = null;\n    this.baseTransformStack = [];\n    this.groupLevel = 0;\n    this.smaskStack = [];\n    this.smaskCounter = 0;\n    this.tempSMask = null;\n    this.contentVisible = true;\n    this.markedContentStack = [];\n    this.optionalContentConfig = optionalContentConfig;\n    this.cachedCanvases = new CachedCanvases(this.canvasFactory);\n\n    if (canvasCtx) {\n      addContextCurrentTransform(canvasCtx);\n    }\n\n    this._cachedGetSinglePixelWidth = null;\n  }\n\n  function putBinaryImageData(ctx, imgData, transferMaps = null) {\n    if (typeof ImageData !== \"undefined\" && imgData instanceof ImageData) {\n      ctx.putImageData(imgData, 0, 0);\n      return;\n    }\n\n    const height = imgData.height,\n          width = imgData.width;\n    const partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n    const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n    const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n    const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n    let srcPos = 0,\n        destPos;\n    const src = imgData.data;\n    const dest = chunkImgData.data;\n    let i, j, thisChunkHeight, elemsInThisChunk;\n    let transferMapRed, transferMapGreen, transferMapBlue, transferMapGray;\n\n    if (transferMaps) {\n      switch (transferMaps.length) {\n        case 1:\n          transferMapRed = transferMaps[0];\n          transferMapGreen = transferMaps[0];\n          transferMapBlue = transferMaps[0];\n          transferMapGray = transferMaps[0];\n          break;\n\n        case 4:\n          transferMapRed = transferMaps[0];\n          transferMapGreen = transferMaps[1];\n          transferMapBlue = transferMaps[2];\n          transferMapGray = transferMaps[3];\n          break;\n      }\n    }\n\n    if (imgData.kind === _util.ImageKind.GRAYSCALE_1BPP) {\n      const srcLength = src.byteLength;\n      const dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2);\n      const dest32DataLength = dest32.length;\n      const fullSrcDiff = width + 7 >> 3;\n      let white = 0xffffffff;\n      let black = _util.IsLittleEndianCached.value ? 0xff000000 : 0x000000ff;\n\n      if (transferMapGray) {\n        if (transferMapGray[0] === 0xff && transferMapGray[0xff] === 0) {\n          [white, black] = [black, white];\n        }\n      }\n\n      for (i = 0; i < totalChunks; i++) {\n        thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n        destPos = 0;\n\n        for (j = 0; j < thisChunkHeight; j++) {\n          const srcDiff = srcLength - srcPos;\n          let k = 0;\n          const kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7;\n          const kEndUnrolled = kEnd & ~7;\n          let mask = 0;\n          let srcByte = 0;\n\n          for (; k < kEndUnrolled; k += 8) {\n            srcByte = src[srcPos++];\n            dest32[destPos++] = srcByte & 128 ? white : black;\n            dest32[destPos++] = srcByte & 64 ? white : black;\n            dest32[destPos++] = srcByte & 32 ? white : black;\n            dest32[destPos++] = srcByte & 16 ? white : black;\n            dest32[destPos++] = srcByte & 8 ? white : black;\n            dest32[destPos++] = srcByte & 4 ? white : black;\n            dest32[destPos++] = srcByte & 2 ? white : black;\n            dest32[destPos++] = srcByte & 1 ? white : black;\n          }\n\n          for (; k < kEnd; k++) {\n            if (mask === 0) {\n              srcByte = src[srcPos++];\n              mask = 128;\n            }\n\n            dest32[destPos++] = srcByte & mask ? white : black;\n            mask >>= 1;\n          }\n        }\n\n        while (destPos < dest32DataLength) {\n          dest32[destPos++] = 0;\n        }\n\n        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n      }\n    } else if (imgData.kind === _util.ImageKind.RGBA_32BPP) {\n      const hasTransferMaps = !!(transferMapRed || transferMapGreen || transferMapBlue);\n      j = 0;\n      elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;\n\n      for (i = 0; i < fullChunks; i++) {\n        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n        srcPos += elemsInThisChunk;\n\n        if (hasTransferMaps) {\n          for (let k = 0; k < elemsInThisChunk; k += 4) {\n            if (transferMapRed) {\n              dest[k + 0] = transferMapRed[dest[k + 0]];\n            }\n\n            if (transferMapGreen) {\n              dest[k + 1] = transferMapGreen[dest[k + 1]];\n            }\n\n            if (transferMapBlue) {\n              dest[k + 2] = transferMapBlue[dest[k + 2]];\n            }\n          }\n        }\n\n        ctx.putImageData(chunkImgData, 0, j);\n        j += FULL_CHUNK_HEIGHT;\n      }\n\n      if (i < totalChunks) {\n        elemsInThisChunk = width * partialChunkHeight * 4;\n        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n\n        if (hasTransferMaps) {\n          for (let k = 0; k < elemsInThisChunk; k += 4) {\n            if (transferMapRed) {\n              dest[k + 0] = transferMapRed[dest[k + 0]];\n            }\n\n            if (transferMapGreen) {\n              dest[k + 1] = transferMapGreen[dest[k + 1]];\n            }\n\n            if (transferMapBlue) {\n              dest[k + 2] = transferMapBlue[dest[k + 2]];\n            }\n          }\n        }\n\n        ctx.putImageData(chunkImgData, 0, j);\n      }\n    } else if (imgData.kind === _util.ImageKind.RGB_24BPP) {\n      const hasTransferMaps = !!(transferMapRed || transferMapGreen || transferMapBlue);\n      thisChunkHeight = FULL_CHUNK_HEIGHT;\n      elemsInThisChunk = width * thisChunkHeight;\n\n      for (i = 0; i < totalChunks; i++) {\n        if (i >= fullChunks) {\n          thisChunkHeight = partialChunkHeight;\n          elemsInThisChunk = width * thisChunkHeight;\n        }\n\n        destPos = 0;\n\n        for (j = elemsInThisChunk; j--;) {\n          dest[destPos++] = src[srcPos++];\n          dest[destPos++] = src[srcPos++];\n          dest[destPos++] = src[srcPos++];\n          dest[destPos++] = 255;\n        }\n\n        if (hasTransferMaps) {\n          for (let k = 0; k < destPos; k += 4) {\n            if (transferMapRed) {\n              dest[k + 0] = transferMapRed[dest[k + 0]];\n            }\n\n            if (transferMapGreen) {\n              dest[k + 1] = transferMapGreen[dest[k + 1]];\n            }\n\n            if (transferMapBlue) {\n              dest[k + 2] = transferMapBlue[dest[k + 2]];\n            }\n          }\n        }\n\n        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n      }\n    } else {\n      throw new Error(`bad image kind: ${imgData.kind}`);\n    }\n  }\n\n  function putBinaryImageMask(ctx, imgData) {\n    const height = imgData.height,\n          width = imgData.width;\n    const partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n    const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n    const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n    const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n    let srcPos = 0;\n    const src = imgData.data;\n    const dest = chunkImgData.data;\n\n    for (let i = 0; i < totalChunks; i++) {\n      const thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n      let destPos = 3;\n\n      for (let j = 0; j < thisChunkHeight; j++) {\n        let elem,\n            mask = 0;\n\n        for (let k = 0; k < width; k++) {\n          if (!mask) {\n            elem = src[srcPos++];\n            mask = 128;\n          }\n\n          dest[destPos] = elem & mask ? 0 : 255;\n          destPos += 4;\n          mask >>= 1;\n        }\n      }\n\n      ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n    }\n  }\n\n  function copyCtxState(sourceCtx, destCtx) {\n    const properties = [\"strokeStyle\", \"fillStyle\", \"fillRule\", \"globalAlpha\", \"lineWidth\", \"lineCap\", \"lineJoin\", \"miterLimit\", \"globalCompositeOperation\", \"font\"];\n\n    for (let i = 0, ii = properties.length; i < ii; i++) {\n      const property = properties[i];\n\n      if (sourceCtx[property] !== undefined) {\n        destCtx[property] = sourceCtx[property];\n      }\n    }\n\n    if (sourceCtx.setLineDash !== undefined) {\n      destCtx.setLineDash(sourceCtx.getLineDash());\n      destCtx.lineDashOffset = sourceCtx.lineDashOffset;\n    }\n  }\n\n  function resetCtxToDefault(ctx) {\n    ctx.strokeStyle = \"#000000\";\n    ctx.fillStyle = \"#000000\";\n    ctx.fillRule = \"nonzero\";\n    ctx.globalAlpha = 1;\n    ctx.lineWidth = 1;\n    ctx.lineCap = \"butt\";\n    ctx.lineJoin = \"miter\";\n    ctx.miterLimit = 10;\n    ctx.globalCompositeOperation = \"source-over\";\n    ctx.font = \"10px sans-serif\";\n\n    if (ctx.setLineDash !== undefined) {\n      ctx.setLineDash([]);\n      ctx.lineDashOffset = 0;\n    }\n  }\n\n  function composeSMaskBackdrop(bytes, r0, g0, b0) {\n    const length = bytes.length;\n\n    for (let i = 3; i < length; i += 4) {\n      const alpha = bytes[i];\n\n      if (alpha === 0) {\n        bytes[i - 3] = r0;\n        bytes[i - 2] = g0;\n        bytes[i - 1] = b0;\n      } else if (alpha < 255) {\n        const alpha_ = 255 - alpha;\n        bytes[i - 3] = bytes[i - 3] * alpha + r0 * alpha_ >> 8;\n        bytes[i - 2] = bytes[i - 2] * alpha + g0 * alpha_ >> 8;\n        bytes[i - 1] = bytes[i - 1] * alpha + b0 * alpha_ >> 8;\n      }\n    }\n  }\n\n  function composeSMaskAlpha(maskData, layerData, transferMap) {\n    const length = maskData.length;\n    const scale = 1 / 255;\n\n    for (let i = 3; i < length; i += 4) {\n      const alpha = transferMap ? transferMap[maskData[i]] : maskData[i];\n      layerData[i] = layerData[i] * alpha * scale | 0;\n    }\n  }\n\n  function composeSMaskLuminosity(maskData, layerData, transferMap) {\n    const length = maskData.length;\n\n    for (let i = 3; i < length; i += 4) {\n      const y = maskData[i - 3] * 77 + maskData[i - 2] * 152 + maskData[i - 1] * 28;\n      layerData[i] = transferMap ? layerData[i] * transferMap[y >> 8] >> 8 : layerData[i] * y >> 16;\n    }\n  }\n\n  function genericComposeSMask(maskCtx, layerCtx, width, height, subtype, backdrop, transferMap) {\n    const hasBackdrop = !!backdrop;\n    const r0 = hasBackdrop ? backdrop[0] : 0;\n    const g0 = hasBackdrop ? backdrop[1] : 0;\n    const b0 = hasBackdrop ? backdrop[2] : 0;\n    let composeFn;\n\n    if (subtype === \"Luminosity\") {\n      composeFn = composeSMaskLuminosity;\n    } else {\n      composeFn = composeSMaskAlpha;\n    }\n\n    const PIXELS_TO_PROCESS = 1048576;\n    const chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width));\n\n    for (let row = 0; row < height; row += chunkSize) {\n      const chunkHeight = Math.min(chunkSize, height - row);\n      const maskData = maskCtx.getImageData(0, row, width, chunkHeight);\n      const layerData = layerCtx.getImageData(0, row, width, chunkHeight);\n\n      if (hasBackdrop) {\n        composeSMaskBackdrop(maskData.data, r0, g0, b0);\n      }\n\n      composeFn(maskData.data, layerData.data, transferMap);\n      maskCtx.putImageData(layerData, 0, row);\n    }\n  }\n\n  function composeSMask(ctx, smask, layerCtx, webGLContext) {\n    const mask = smask.canvas;\n    const maskCtx = smask.context;\n    ctx.setTransform(smask.scaleX, 0, 0, smask.scaleY, smask.offsetX, smask.offsetY);\n    const backdrop = smask.backdrop || null;\n\n    if (!smask.transferMap && webGLContext.isEnabled) {\n      const composed = webGLContext.composeSMask({\n        layer: layerCtx.canvas,\n        mask,\n        properties: {\n          subtype: smask.subtype,\n          backdrop\n        }\n      });\n      ctx.setTransform(1, 0, 0, 1, 0, 0);\n      ctx.drawImage(composed, smask.offsetX, smask.offsetY);\n      return;\n    }\n\n    genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height, smask.subtype, backdrop, smask.transferMap);\n    ctx.drawImage(mask, 0, 0);\n  }\n\n  const LINE_CAP_STYLES = [\"butt\", \"round\", \"square\"];\n  const LINE_JOIN_STYLES = [\"miter\", \"round\", \"bevel\"];\n  const NORMAL_CLIP = {};\n  const EO_CLIP = {};\n  CanvasGraphics.prototype = {\n    beginDrawing({\n      transform,\n      viewport,\n      transparency = false,\n      background = null\n    }) {\n      const width = this.ctx.canvas.width;\n      const height = this.ctx.canvas.height;\n      this.ctx.save();\n      this.ctx.fillStyle = background || \"rgb(255, 255, 255)\";\n      this.ctx.fillRect(0, 0, width, height);\n      this.ctx.restore();\n\n      if (transparency) {\n        const transparentCanvas = this.cachedCanvases.getCanvas(\"transparent\", width, height, true);\n        this.compositeCtx = this.ctx;\n        this.transparentCanvas = transparentCanvas.canvas;\n        this.ctx = transparentCanvas.context;\n        this.ctx.save();\n        this.ctx.transform.apply(this.ctx, this.compositeCtx.mozCurrentTransform);\n      }\n\n      this.ctx.save();\n      resetCtxToDefault(this.ctx);\n\n      if (transform) {\n        this.ctx.transform.apply(this.ctx, transform);\n      }\n\n      this.ctx.transform.apply(this.ctx, viewport.transform);\n      this.baseTransform = this.ctx.mozCurrentTransform.slice();\n      this._combinedScaleFactor = Math.hypot(this.baseTransform[0], this.baseTransform[2]);\n\n      if (this.imageLayer) {\n        this.imageLayer.beginLayout();\n      }\n    },\n\n    executeOperatorList: function CanvasGraphics_executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper) {\n      const argsArray = operatorList.argsArray;\n      const fnArray = operatorList.fnArray;\n      let i = executionStartIdx || 0;\n      const argsArrayLen = argsArray.length;\n\n      if (argsArrayLen === i) {\n        return i;\n      }\n\n      const chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === \"function\";\n      const endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;\n      let steps = 0;\n      const commonObjs = this.commonObjs;\n      const objs = this.objs;\n      let fnId;\n\n      while (true) {\n        if (stepper !== undefined && i === stepper.nextBreakPoint) {\n          stepper.breakIt(i, continueCallback);\n          return i;\n        }\n\n        fnId = fnArray[i];\n\n        if (fnId !== _util.OPS.dependency) {\n          this[fnId].apply(this, argsArray[i]);\n        } else {\n          for (const depObjId of argsArray[i]) {\n            const objsPool = depObjId.startsWith(\"g_\") ? commonObjs : objs;\n\n            if (!objsPool.has(depObjId)) {\n              objsPool.get(depObjId, continueCallback);\n              return i;\n            }\n          }\n        }\n\n        i++;\n\n        if (i === argsArrayLen) {\n          return i;\n        }\n\n        if (chunkOperations && ++steps > EXECUTION_STEPS) {\n          if (Date.now() > endTime) {\n            continueCallback();\n            return i;\n          }\n\n          steps = 0;\n        }\n      }\n    },\n    endDrawing: function CanvasGraphics_endDrawing() {\n      while (this.stateStack.length || this.current.activeSMask !== null) {\n        this.restore();\n      }\n\n      this.ctx.restore();\n\n      if (this.transparentCanvas) {\n        this.ctx = this.compositeCtx;\n        this.ctx.save();\n        this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n        this.ctx.drawImage(this.transparentCanvas, 0, 0);\n        this.ctx.restore();\n        this.transparentCanvas = null;\n      }\n\n      this.cachedCanvases.clear();\n      this.webGLContext.clear();\n\n      if (this.imageLayer) {\n        this.imageLayer.endLayout();\n      }\n    },\n    setLineWidth: function CanvasGraphics_setLineWidth(width) {\n      this.current.lineWidth = width;\n      this.ctx.lineWidth = width;\n    },\n    setLineCap: function CanvasGraphics_setLineCap(style) {\n      this.ctx.lineCap = LINE_CAP_STYLES[style];\n    },\n    setLineJoin: function CanvasGraphics_setLineJoin(style) {\n      this.ctx.lineJoin = LINE_JOIN_STYLES[style];\n    },\n    setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {\n      this.ctx.miterLimit = limit;\n    },\n    setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {\n      const ctx = this.ctx;\n\n      if (ctx.setLineDash !== undefined) {\n        ctx.setLineDash(dashArray);\n        ctx.lineDashOffset = dashPhase;\n      }\n    },\n\n    setRenderingIntent(intent) {},\n\n    setFlatness(flatness) {},\n\n    setGState: function CanvasGraphics_setGState(states) {\n      for (let i = 0, ii = states.length; i < ii; i++) {\n        const state = states[i];\n        const key = state[0];\n        const value = state[1];\n\n        switch (key) {\n          case \"LW\":\n            this.setLineWidth(value);\n            break;\n\n          case \"LC\":\n            this.setLineCap(value);\n            break;\n\n          case \"LJ\":\n            this.setLineJoin(value);\n            break;\n\n          case \"ML\":\n            this.setMiterLimit(value);\n            break;\n\n          case \"D\":\n            this.setDash(value[0], value[1]);\n            break;\n\n          case \"RI\":\n            this.setRenderingIntent(value);\n            break;\n\n          case \"FL\":\n            this.setFlatness(value);\n            break;\n\n          case \"Font\":\n            this.setFont(value[0], value[1]);\n            break;\n\n          case \"CA\":\n            this.current.strokeAlpha = state[1];\n            break;\n\n          case \"ca\":\n            this.current.fillAlpha = state[1];\n            this.ctx.globalAlpha = state[1];\n            break;\n\n          case \"BM\":\n            this.ctx.globalCompositeOperation = value;\n            break;\n\n          case \"SMask\":\n            if (this.current.activeSMask) {\n              if (this.stateStack.length > 0 && this.stateStack[this.stateStack.length - 1].activeSMask === this.current.activeSMask) {\n                this.suspendSMaskGroup();\n              } else {\n                this.endSMaskGroup();\n              }\n            }\n\n            this.current.activeSMask = value ? this.tempSMask : null;\n\n            if (this.current.activeSMask) {\n              this.beginSMaskGroup();\n            }\n\n            this.tempSMask = null;\n            break;\n\n          case \"TR\":\n            this.current.transferMaps = value;\n        }\n      }\n    },\n    beginSMaskGroup: function CanvasGraphics_beginSMaskGroup() {\n      const activeSMask = this.current.activeSMask;\n      const drawnWidth = activeSMask.canvas.width;\n      const drawnHeight = activeSMask.canvas.height;\n      const cacheId = \"smaskGroupAt\" + this.groupLevel;\n      const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight, true);\n      const currentCtx = this.ctx;\n      const currentTransform = currentCtx.mozCurrentTransform;\n      this.ctx.save();\n      const groupCtx = scratchCanvas.context;\n      groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY);\n      groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY);\n      groupCtx.transform.apply(groupCtx, currentTransform);\n      activeSMask.startTransformInverse = groupCtx.mozCurrentTransformInverse;\n      copyCtxState(currentCtx, groupCtx);\n      this.ctx = groupCtx;\n      this.setGState([[\"BM\", \"source-over\"], [\"ca\", 1], [\"CA\", 1]]);\n      this.groupStack.push(currentCtx);\n      this.groupLevel++;\n    },\n    suspendSMaskGroup: function CanvasGraphics_endSMaskGroup() {\n      const groupCtx = this.ctx;\n      this.groupLevel--;\n      this.ctx = this.groupStack.pop();\n      composeSMask(this.ctx, this.current.activeSMask, groupCtx, this.webGLContext);\n      this.ctx.restore();\n      this.ctx.save();\n      copyCtxState(groupCtx, this.ctx);\n      this.current.resumeSMaskCtx = groupCtx;\n\n      const deltaTransform = _util.Util.transform(this.current.activeSMask.startTransformInverse, groupCtx.mozCurrentTransform);\n\n      this.ctx.transform.apply(this.ctx, deltaTransform);\n      groupCtx.save();\n      groupCtx.setTransform(1, 0, 0, 1, 0, 0);\n      groupCtx.clearRect(0, 0, groupCtx.canvas.width, groupCtx.canvas.height);\n      groupCtx.restore();\n    },\n    resumeSMaskGroup: function CanvasGraphics_resumeSMaskGroup() {\n      const groupCtx = this.current.resumeSMaskCtx;\n      const currentCtx = this.ctx;\n      this.ctx = groupCtx;\n      this.groupStack.push(currentCtx);\n      this.groupLevel++;\n    },\n    endSMaskGroup: function CanvasGraphics_endSMaskGroup() {\n      const groupCtx = this.ctx;\n      this.groupLevel--;\n      this.ctx = this.groupStack.pop();\n      composeSMask(this.ctx, this.current.activeSMask, groupCtx, this.webGLContext);\n      this.ctx.restore();\n      copyCtxState(groupCtx, this.ctx);\n\n      const deltaTransform = _util.Util.transform(this.current.activeSMask.startTransformInverse, groupCtx.mozCurrentTransform);\n\n      this.ctx.transform.apply(this.ctx, deltaTransform);\n    },\n    save: function CanvasGraphics_save() {\n      this.ctx.save();\n      const old = this.current;\n      this.stateStack.push(old);\n      this.current = old.clone();\n      this.current.resumeSMaskCtx = null;\n    },\n    restore: function CanvasGraphics_restore() {\n      if (this.current.resumeSMaskCtx) {\n        this.resumeSMaskGroup();\n      }\n\n      if (this.current.activeSMask !== null && (this.stateStack.length === 0 || this.stateStack[this.stateStack.length - 1].activeSMask !== this.current.activeSMask)) {\n        this.endSMaskGroup();\n      }\n\n      if (this.stateStack.length !== 0) {\n        this.current = this.stateStack.pop();\n        this.ctx.restore();\n        this.pendingClip = null;\n        this._cachedGetSinglePixelWidth = null;\n      } else {\n        this.current.activeSMask = null;\n      }\n    },\n    transform: function CanvasGraphics_transform(a, b, c, d, e, f) {\n      this.ctx.transform(a, b, c, d, e, f);\n      this._cachedGetSinglePixelWidth = null;\n    },\n    constructPath: function CanvasGraphics_constructPath(ops, args) {\n      const ctx = this.ctx;\n      const current = this.current;\n      let x = current.x,\n          y = current.y;\n\n      for (let i = 0, j = 0, ii = ops.length; i < ii; i++) {\n        switch (ops[i] | 0) {\n          case _util.OPS.rectangle:\n            x = args[j++];\n            y = args[j++];\n            const width = args[j++];\n            const height = args[j++];\n            const xw = x + width;\n            const yh = y + height;\n            ctx.moveTo(x, y);\n\n            if (width === 0 || height === 0) {\n              ctx.lineTo(xw, yh);\n            } else {\n              ctx.lineTo(xw, y);\n              ctx.lineTo(xw, yh);\n              ctx.lineTo(x, yh);\n            }\n\n            ctx.closePath();\n            break;\n\n          case _util.OPS.moveTo:\n            x = args[j++];\n            y = args[j++];\n            ctx.moveTo(x, y);\n            break;\n\n          case _util.OPS.lineTo:\n            x = args[j++];\n            y = args[j++];\n            ctx.lineTo(x, y);\n            break;\n\n          case _util.OPS.curveTo:\n            x = args[j + 4];\n            y = args[j + 5];\n            ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], x, y);\n            j += 6;\n            break;\n\n          case _util.OPS.curveTo2:\n            ctx.bezierCurveTo(x, y, args[j], args[j + 1], args[j + 2], args[j + 3]);\n            x = args[j + 2];\n            y = args[j + 3];\n            j += 4;\n            break;\n\n          case _util.OPS.curveTo3:\n            x = args[j + 2];\n            y = args[j + 3];\n            ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y);\n            j += 4;\n            break;\n\n          case _util.OPS.closePath:\n            ctx.closePath();\n            break;\n        }\n      }\n\n      current.setCurrentPoint(x, y);\n    },\n    closePath: function CanvasGraphics_closePath() {\n      this.ctx.closePath();\n    },\n    stroke: function CanvasGraphics_stroke(consumePath) {\n      consumePath = typeof consumePath !== \"undefined\" ? consumePath : true;\n      const ctx = this.ctx;\n      const strokeColor = this.current.strokeColor;\n      ctx.globalAlpha = this.current.strokeAlpha;\n\n      if (this.contentVisible) {\n        if (typeof strokeColor === \"object\" && strokeColor?.getPattern) {\n          ctx.save();\n          const transform = ctx.mozCurrentTransform;\n\n          const scale = _util.Util.singularValueDecompose2dScale(transform)[0];\n\n          ctx.strokeStyle = strokeColor.getPattern(ctx, this);\n          const lineWidth = this.getSinglePixelWidth();\n          const scaledLineWidth = this.current.lineWidth * scale;\n\n          if (lineWidth < 0 && -lineWidth >= scaledLineWidth) {\n            ctx.resetTransform();\n            ctx.lineWidth = Math.round(this._combinedScaleFactor);\n          } else {\n            ctx.lineWidth = Math.max(lineWidth, scaledLineWidth);\n          }\n\n          ctx.stroke();\n          ctx.restore();\n        } else {\n          const lineWidth = this.getSinglePixelWidth();\n\n          if (lineWidth < 0 && -lineWidth >= this.current.lineWidth) {\n            ctx.save();\n            ctx.resetTransform();\n            ctx.lineWidth = Math.round(this._combinedScaleFactor);\n            ctx.stroke();\n            ctx.restore();\n          } else {\n            ctx.lineWidth = Math.max(lineWidth, this.current.lineWidth);\n            ctx.stroke();\n          }\n        }\n      }\n\n      if (consumePath) {\n        this.consumePath();\n      }\n\n      ctx.globalAlpha = this.current.fillAlpha;\n    },\n    closeStroke: function CanvasGraphics_closeStroke() {\n      this.closePath();\n      this.stroke();\n    },\n    fill: function CanvasGraphics_fill(consumePath) {\n      consumePath = typeof consumePath !== \"undefined\" ? consumePath : true;\n      const ctx = this.ctx;\n      const fillColor = this.current.fillColor;\n      const isPatternFill = this.current.patternFill;\n      let needRestore = false;\n\n      if (isPatternFill) {\n        ctx.save();\n\n        if (this.baseTransform) {\n          ctx.setTransform.apply(ctx, this.baseTransform);\n        }\n\n        ctx.fillStyle = fillColor.getPattern(ctx, this);\n        needRestore = true;\n      }\n\n      if (this.contentVisible) {\n        if (this.pendingEOFill) {\n          ctx.fill(\"evenodd\");\n          this.pendingEOFill = false;\n        } else {\n          ctx.fill();\n        }\n      }\n\n      if (needRestore) {\n        ctx.restore();\n      }\n\n      if (consumePath) {\n        this.consumePath();\n      }\n    },\n    eoFill: function CanvasGraphics_eoFill() {\n      this.pendingEOFill = true;\n      this.fill();\n    },\n    fillStroke: function CanvasGraphics_fillStroke() {\n      this.fill(false);\n      this.stroke(false);\n      this.consumePath();\n    },\n    eoFillStroke: function CanvasGraphics_eoFillStroke() {\n      this.pendingEOFill = true;\n      this.fillStroke();\n    },\n    closeFillStroke: function CanvasGraphics_closeFillStroke() {\n      this.closePath();\n      this.fillStroke();\n    },\n    closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {\n      this.pendingEOFill = true;\n      this.closePath();\n      this.fillStroke();\n    },\n    endPath: function CanvasGraphics_endPath() {\n      this.consumePath();\n    },\n    clip: function CanvasGraphics_clip() {\n      this.pendingClip = NORMAL_CLIP;\n    },\n    eoClip: function CanvasGraphics_eoClip() {\n      this.pendingClip = EO_CLIP;\n    },\n    beginText: function CanvasGraphics_beginText() {\n      this.current.textMatrix = _util.IDENTITY_MATRIX;\n      this.current.textMatrixScale = 1;\n      this.current.x = this.current.lineX = 0;\n      this.current.y = this.current.lineY = 0;\n    },\n    endText: function CanvasGraphics_endText() {\n      const paths = this.pendingTextPaths;\n      const ctx = this.ctx;\n\n      if (paths === undefined) {\n        ctx.beginPath();\n        return;\n      }\n\n      ctx.save();\n      ctx.beginPath();\n\n      for (let i = 0; i < paths.length; i++) {\n        const path = paths[i];\n        ctx.setTransform.apply(ctx, path.transform);\n        ctx.translate(path.x, path.y);\n        path.addToPath(ctx, path.fontSize);\n      }\n\n      ctx.restore();\n      ctx.clip();\n      ctx.beginPath();\n      delete this.pendingTextPaths;\n    },\n    setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {\n      this.current.charSpacing = spacing;\n    },\n    setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {\n      this.current.wordSpacing = spacing;\n    },\n    setHScale: function CanvasGraphics_setHScale(scale) {\n      this.current.textHScale = scale / 100;\n    },\n    setLeading: function CanvasGraphics_setLeading(leading) {\n      this.current.leading = -leading;\n    },\n    setFont: function CanvasGraphics_setFont(fontRefName, size) {\n      const fontObj = this.commonObjs.get(fontRefName);\n      const current = this.current;\n\n      if (!fontObj) {\n        throw new Error(`Can't find font for ${fontRefName}`);\n      }\n\n      current.fontMatrix = fontObj.fontMatrix || _util.FONT_IDENTITY_MATRIX;\n\n      if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) {\n        (0, _util.warn)(\"Invalid font matrix for font \" + fontRefName);\n      }\n\n      if (size < 0) {\n        size = -size;\n        current.fontDirection = -1;\n      } else {\n        current.fontDirection = 1;\n      }\n\n      this.current.font = fontObj;\n      this.current.fontSize = size;\n\n      if (fontObj.isType3Font) {\n        return;\n      }\n\n      const name = fontObj.loadedName || \"sans-serif\";\n      let bold = \"normal\";\n\n      if (fontObj.black) {\n        bold = \"900\";\n      } else if (fontObj.bold) {\n        bold = \"bold\";\n      }\n\n      const italic = fontObj.italic ? \"italic\" : \"normal\";\n      const typeface = `\"${name}\", ${fontObj.fallbackName}`;\n      let browserFontSize = size;\n\n      if (size < MIN_FONT_SIZE) {\n        browserFontSize = MIN_FONT_SIZE;\n      } else if (size > MAX_FONT_SIZE) {\n        browserFontSize = MAX_FONT_SIZE;\n      }\n\n      this.current.fontSizeScale = size / browserFontSize;\n      this.ctx.font = `${italic} ${bold} ${browserFontSize}px ${typeface}`;\n    },\n    setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) {\n      this.current.textRenderingMode = mode;\n    },\n    setTextRise: function CanvasGraphics_setTextRise(rise) {\n      this.current.textRise = rise;\n    },\n    moveText: function CanvasGraphics_moveText(x, y) {\n      this.current.x = this.current.lineX += x;\n      this.current.y = this.current.lineY += y;\n    },\n    setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {\n      this.setLeading(-y);\n      this.moveText(x, y);\n    },\n    setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) {\n      this.current.textMatrix = [a, b, c, d, e, f];\n      this.current.textMatrixScale = Math.hypot(a, b);\n      this.current.x = this.current.lineX = 0;\n      this.current.y = this.current.lineY = 0;\n    },\n    nextLine: function CanvasGraphics_nextLine() {\n      this.moveText(0, this.current.leading);\n    },\n\n    paintChar(character, x, y, patternTransform, resetLineWidthToOne) {\n      const ctx = this.ctx;\n      const current = this.current;\n      const font = current.font;\n      const textRenderingMode = current.textRenderingMode;\n      const fontSize = current.fontSize / current.fontSizeScale;\n      const fillStrokeMode = textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK;\n      const isAddToPathSet = !!(textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG);\n      const patternFill = current.patternFill && !font.missingFile;\n      let addToPath;\n\n      if (font.disableFontFace || isAddToPathSet || patternFill) {\n        addToPath = font.getPathGenerator(this.commonObjs, character);\n      }\n\n      if (font.disableFontFace || patternFill) {\n        ctx.save();\n        ctx.translate(x, y);\n        ctx.beginPath();\n        addToPath(ctx, fontSize);\n\n        if (patternTransform) {\n          ctx.setTransform.apply(ctx, patternTransform);\n        }\n\n        if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {\n          ctx.fill();\n        }\n\n        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {\n          if (resetLineWidthToOne) {\n            ctx.resetTransform();\n            ctx.lineWidth = Math.round(this._combinedScaleFactor);\n          }\n\n          ctx.stroke();\n        }\n\n        ctx.restore();\n      } else {\n        if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {\n          ctx.fillText(character, x, y);\n        }\n\n        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {\n          if (resetLineWidthToOne) {\n            ctx.save();\n            ctx.moveTo(x, y);\n            ctx.resetTransform();\n            ctx.lineWidth = Math.round(this._combinedScaleFactor);\n            ctx.strokeText(character, 0, 0);\n            ctx.restore();\n          } else {\n            ctx.strokeText(character, x, y);\n          }\n        }\n      }\n\n      if (isAddToPathSet) {\n        const paths = this.pendingTextPaths || (this.pendingTextPaths = []);\n        paths.push({\n          transform: ctx.mozCurrentTransform,\n          x,\n          y,\n          fontSize,\n          addToPath\n        });\n      }\n    },\n\n    get isFontSubpixelAAEnabled() {\n      const {\n        context: ctx\n      } = this.cachedCanvases.getCanvas(\"isFontSubpixelAAEnabled\", 10, 10);\n      ctx.scale(1.5, 1);\n      ctx.fillText(\"I\", 0, 10);\n      const data = ctx.getImageData(0, 0, 10, 10).data;\n      let enabled = false;\n\n      for (let i = 3; i < data.length; i += 4) {\n        if (data[i] > 0 && data[i] < 255) {\n          enabled = true;\n          break;\n        }\n      }\n\n      return (0, _util.shadow)(this, \"isFontSubpixelAAEnabled\", enabled);\n    },\n\n    showText: function CanvasGraphics_showText(glyphs) {\n      const current = this.current;\n      const font = current.font;\n\n      if (font.isType3Font) {\n        return this.showType3Text(glyphs);\n      }\n\n      const fontSize = current.fontSize;\n\n      if (fontSize === 0) {\n        return undefined;\n      }\n\n      const ctx = this.ctx;\n      const fontSizeScale = current.fontSizeScale;\n      const charSpacing = current.charSpacing;\n      const wordSpacing = current.wordSpacing;\n      const fontDirection = current.fontDirection;\n      const textHScale = current.textHScale * fontDirection;\n      const glyphsLength = glyphs.length;\n      const vertical = font.vertical;\n      const spacingDir = vertical ? 1 : -1;\n      const defaultVMetrics = font.defaultVMetrics;\n      const widthAdvanceScale = fontSize * current.fontMatrix[0];\n      const simpleFillText = current.textRenderingMode === _util.TextRenderingMode.FILL && !font.disableFontFace && !current.patternFill;\n      ctx.save();\n      let patternTransform;\n\n      if (current.patternFill) {\n        ctx.save();\n        const pattern = current.fillColor.getPattern(ctx, this);\n        patternTransform = ctx.mozCurrentTransform;\n        ctx.restore();\n        ctx.fillStyle = pattern;\n      }\n\n      ctx.transform.apply(ctx, current.textMatrix);\n      ctx.translate(current.x, current.y + current.textRise);\n\n      if (fontDirection > 0) {\n        ctx.scale(textHScale, -1);\n      } else {\n        ctx.scale(textHScale, 1);\n      }\n\n      let lineWidth = current.lineWidth;\n      let resetLineWidthToOne = false;\n      const scale = current.textMatrixScale;\n\n      if (scale === 0 || lineWidth === 0) {\n        const fillStrokeMode = current.textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK;\n\n        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {\n          this._cachedGetSinglePixelWidth = null;\n          lineWidth = this.getSinglePixelWidth();\n          resetLineWidthToOne = lineWidth < 0;\n        }\n      } else {\n        lineWidth /= scale;\n      }\n\n      if (fontSizeScale !== 1.0) {\n        ctx.scale(fontSizeScale, fontSizeScale);\n        lineWidth /= fontSizeScale;\n      }\n\n      ctx.lineWidth = lineWidth;\n      let x = 0,\n          i;\n\n      for (i = 0; i < glyphsLength; ++i) {\n        const glyph = glyphs[i];\n\n        if ((0, _util.isNum)(glyph)) {\n          x += spacingDir * glyph * fontSize / 1000;\n          continue;\n        }\n\n        let restoreNeeded = false;\n        const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n        const character = glyph.fontChar;\n        const accent = glyph.accent;\n        let scaledX, scaledY;\n        let width = glyph.width;\n\n        if (vertical) {\n          const vmetric = glyph.vmetric || defaultVMetrics;\n          const vx = -(glyph.vmetric ? vmetric[1] : width * 0.5) * widthAdvanceScale;\n          const vy = vmetric[2] * widthAdvanceScale;\n          width = vmetric ? -vmetric[0] : width;\n          scaledX = vx / fontSizeScale;\n          scaledY = (x + vy) / fontSizeScale;\n        } else {\n          scaledX = x / fontSizeScale;\n          scaledY = 0;\n        }\n\n        if (font.remeasure && width > 0) {\n          const measuredWidth = ctx.measureText(character).width * 1000 / fontSize * fontSizeScale;\n\n          if (width < measuredWidth && this.isFontSubpixelAAEnabled) {\n            const characterScaleX = width / measuredWidth;\n            restoreNeeded = true;\n            ctx.save();\n            ctx.scale(characterScaleX, 1);\n            scaledX /= characterScaleX;\n          } else if (width !== measuredWidth) {\n            scaledX += (width - measuredWidth) / 2000 * fontSize / fontSizeScale;\n          }\n        }\n\n        if (this.contentVisible && (glyph.isInFont || font.missingFile)) {\n          if (simpleFillText && !accent) {\n            ctx.fillText(character, scaledX, scaledY);\n          } else {\n            this.paintChar(character, scaledX, scaledY, patternTransform, resetLineWidthToOne);\n\n            if (accent) {\n              const scaledAccentX = scaledX + fontSize * accent.offset.x / fontSizeScale;\n              const scaledAccentY = scaledY - fontSize * accent.offset.y / fontSizeScale;\n              this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY, patternTransform, resetLineWidthToOne);\n            }\n          }\n        }\n\n        let charWidth;\n\n        if (vertical) {\n          charWidth = width * widthAdvanceScale - spacing * fontDirection;\n        } else {\n          charWidth = width * widthAdvanceScale + spacing * fontDirection;\n        }\n\n        x += charWidth;\n\n        if (restoreNeeded) {\n          ctx.restore();\n        }\n      }\n\n      if (vertical) {\n        current.y -= x;\n      } else {\n        current.x += x * textHScale;\n      }\n\n      ctx.restore();\n    },\n    showType3Text: function CanvasGraphics_showType3Text(glyphs) {\n      const ctx = this.ctx;\n      const current = this.current;\n      const font = current.font;\n      const fontSize = current.fontSize;\n      const fontDirection = current.fontDirection;\n      const spacingDir = font.vertical ? 1 : -1;\n      const charSpacing = current.charSpacing;\n      const wordSpacing = current.wordSpacing;\n      const textHScale = current.textHScale * fontDirection;\n      const fontMatrix = current.fontMatrix || _util.FONT_IDENTITY_MATRIX;\n      const glyphsLength = glyphs.length;\n      const isTextInvisible = current.textRenderingMode === _util.TextRenderingMode.INVISIBLE;\n      let i, glyph, width, spacingLength;\n\n      if (isTextInvisible || fontSize === 0) {\n        return;\n      }\n\n      this._cachedGetSinglePixelWidth = null;\n      ctx.save();\n      ctx.transform.apply(ctx, current.textMatrix);\n      ctx.translate(current.x, current.y);\n      ctx.scale(textHScale, fontDirection);\n\n      for (i = 0; i < glyphsLength; ++i) {\n        glyph = glyphs[i];\n\n        if ((0, _util.isNum)(glyph)) {\n          spacingLength = spacingDir * glyph * fontSize / 1000;\n          this.ctx.translate(spacingLength, 0);\n          current.x += spacingLength * textHScale;\n          continue;\n        }\n\n        const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n        const operatorList = font.charProcOperatorList[glyph.operatorListId];\n\n        if (!operatorList) {\n          (0, _util.warn)(`Type3 character \"${glyph.operatorListId}\" is not available.`);\n          continue;\n        }\n\n        if (this.contentVisible) {\n          this.processingType3 = glyph;\n          this.save();\n          ctx.scale(fontSize, fontSize);\n          ctx.transform.apply(ctx, fontMatrix);\n          this.executeOperatorList(operatorList);\n          this.restore();\n        }\n\n        const transformed = _util.Util.applyTransform([glyph.width, 0], fontMatrix);\n\n        width = transformed[0] * fontSize + spacing;\n        ctx.translate(width, 0);\n        current.x += width * textHScale;\n      }\n\n      ctx.restore();\n      this.processingType3 = null;\n    },\n    setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {},\n    setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) {\n      this.ctx.rect(llx, lly, urx - llx, ury - lly);\n      this.clip();\n      this.endPath();\n    },\n    getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) {\n      let pattern;\n\n      if (IR[0] === \"TilingPattern\") {\n        const color = IR[1];\n        const baseTransform = this.baseTransform || this.ctx.mozCurrentTransform.slice();\n        const canvasGraphicsFactory = {\n          createCanvasGraphics: ctx => {\n            return new CanvasGraphics(ctx, this.commonObjs, this.objs, this.canvasFactory, this.webGLContext);\n          }\n        };\n        pattern = new _pattern_helper.TilingPattern(IR, color, this.ctx, canvasGraphicsFactory, baseTransform);\n      } else {\n        pattern = (0, _pattern_helper.getShadingPatternFromIR)(IR);\n      }\n\n      return pattern;\n    },\n    setStrokeColorN: function CanvasGraphics_setStrokeColorN() {\n      this.current.strokeColor = this.getColorN_Pattern(arguments);\n    },\n    setFillColorN: function CanvasGraphics_setFillColorN() {\n      this.current.fillColor = this.getColorN_Pattern(arguments);\n      this.current.patternFill = true;\n    },\n    setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {\n      const color = _util.Util.makeHexColor(r, g, b);\n\n      this.ctx.strokeStyle = color;\n      this.current.strokeColor = color;\n    },\n    setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {\n      const color = _util.Util.makeHexColor(r, g, b);\n\n      this.ctx.fillStyle = color;\n      this.current.fillColor = color;\n      this.current.patternFill = false;\n    },\n    shadingFill: function CanvasGraphics_shadingFill(patternIR) {\n      if (!this.contentVisible) {\n        return;\n      }\n\n      const ctx = this.ctx;\n      this.save();\n      const pattern = (0, _pattern_helper.getShadingPatternFromIR)(patternIR);\n      ctx.fillStyle = pattern.getPattern(ctx, this, true);\n      const inv = ctx.mozCurrentTransformInverse;\n\n      if (inv) {\n        const canvas = ctx.canvas;\n        const width = canvas.width;\n        const height = canvas.height;\n\n        const bl = _util.Util.applyTransform([0, 0], inv);\n\n        const br = _util.Util.applyTransform([0, height], inv);\n\n        const ul = _util.Util.applyTransform([width, 0], inv);\n\n        const ur = _util.Util.applyTransform([width, height], inv);\n\n        const x0 = Math.min(bl[0], br[0], ul[0], ur[0]);\n        const y0 = Math.min(bl[1], br[1], ul[1], ur[1]);\n        const x1 = Math.max(bl[0], br[0], ul[0], ur[0]);\n        const y1 = Math.max(bl[1], br[1], ul[1], ur[1]);\n        this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);\n      } else {\n        this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);\n      }\n\n      this.restore();\n    },\n    beginInlineImage: function CanvasGraphics_beginInlineImage() {\n      (0, _util.unreachable)(\"Should not call beginInlineImage\");\n    },\n    beginImageData: function CanvasGraphics_beginImageData() {\n      (0, _util.unreachable)(\"Should not call beginImageData\");\n    },\n    paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix, bbox) {\n      if (!this.contentVisible) {\n        return;\n      }\n\n      this.save();\n      this.baseTransformStack.push(this.baseTransform);\n\n      if (Array.isArray(matrix) && matrix.length === 6) {\n        this.transform.apply(this, matrix);\n      }\n\n      this.baseTransform = this.ctx.mozCurrentTransform;\n\n      if (bbox) {\n        const width = bbox[2] - bbox[0];\n        const height = bbox[3] - bbox[1];\n        this.ctx.rect(bbox[0], bbox[1], width, height);\n        this.clip();\n        this.endPath();\n      }\n    },\n    paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {\n      if (!this.contentVisible) {\n        return;\n      }\n\n      this.restore();\n      this.baseTransform = this.baseTransformStack.pop();\n    },\n    beginGroup: function CanvasGraphics_beginGroup(group) {\n      if (!this.contentVisible) {\n        return;\n      }\n\n      this.save();\n      const currentCtx = this.ctx;\n\n      if (!group.isolated) {\n        (0, _util.info)(\"TODO: Support non-isolated groups.\");\n      }\n\n      if (group.knockout) {\n        (0, _util.warn)(\"Knockout groups not supported.\");\n      }\n\n      const currentTransform = currentCtx.mozCurrentTransform;\n\n      if (group.matrix) {\n        currentCtx.transform.apply(currentCtx, group.matrix);\n      }\n\n      if (!group.bbox) {\n        throw new Error(\"Bounding box is required.\");\n      }\n\n      let bounds = _util.Util.getAxialAlignedBoundingBox(group.bbox, currentCtx.mozCurrentTransform);\n\n      const canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height];\n      bounds = _util.Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];\n      const offsetX = Math.floor(bounds[0]);\n      const offsetY = Math.floor(bounds[1]);\n      let drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);\n      let drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);\n      let scaleX = 1,\n          scaleY = 1;\n\n      if (drawnWidth > MAX_GROUP_SIZE) {\n        scaleX = drawnWidth / MAX_GROUP_SIZE;\n        drawnWidth = MAX_GROUP_SIZE;\n      }\n\n      if (drawnHeight > MAX_GROUP_SIZE) {\n        scaleY = drawnHeight / MAX_GROUP_SIZE;\n        drawnHeight = MAX_GROUP_SIZE;\n      }\n\n      let cacheId = \"groupAt\" + this.groupLevel;\n\n      if (group.smask) {\n        cacheId += \"_smask_\" + this.smaskCounter++ % 2;\n      }\n\n      const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight, true);\n      const groupCtx = scratchCanvas.context;\n      groupCtx.scale(1 / scaleX, 1 / scaleY);\n      groupCtx.translate(-offsetX, -offsetY);\n      groupCtx.transform.apply(groupCtx, currentTransform);\n\n      if (group.smask) {\n        this.smaskStack.push({\n          canvas: scratchCanvas.canvas,\n          context: groupCtx,\n          offsetX,\n          offsetY,\n          scaleX,\n          scaleY,\n          subtype: group.smask.subtype,\n          backdrop: group.smask.backdrop,\n          transferMap: group.smask.transferMap || null,\n          startTransformInverse: null\n        });\n      } else {\n        currentCtx.setTransform(1, 0, 0, 1, 0, 0);\n        currentCtx.translate(offsetX, offsetY);\n        currentCtx.scale(scaleX, scaleY);\n      }\n\n      copyCtxState(currentCtx, groupCtx);\n      this.ctx = groupCtx;\n      this.setGState([[\"BM\", \"source-over\"], [\"ca\", 1], [\"CA\", 1]]);\n      this.groupStack.push(currentCtx);\n      this.groupLevel++;\n      this.current.activeSMask = null;\n    },\n    endGroup: function CanvasGraphics_endGroup(group) {\n      if (!this.contentVisible) {\n        return;\n      }\n\n      this.groupLevel--;\n      const groupCtx = this.ctx;\n      this.ctx = this.groupStack.pop();\n\n      if (this.ctx.imageSmoothingEnabled !== undefined) {\n        this.ctx.imageSmoothingEnabled = false;\n      } else {\n        this.ctx.mozImageSmoothingEnabled = false;\n      }\n\n      if (group.smask) {\n        this.tempSMask = this.smaskStack.pop();\n      } else {\n        this.ctx.drawImage(groupCtx.canvas, 0, 0);\n      }\n\n      this.restore();\n    },\n    beginAnnotations: function CanvasGraphics_beginAnnotations() {\n      this.save();\n\n      if (this.baseTransform) {\n        this.ctx.setTransform.apply(this.ctx, this.baseTransform);\n      }\n    },\n    endAnnotations: function CanvasGraphics_endAnnotations() {\n      this.restore();\n    },\n    beginAnnotation: function CanvasGraphics_beginAnnotation(rect, transform, matrix) {\n      this.save();\n      resetCtxToDefault(this.ctx);\n      this.current = new CanvasExtraState();\n\n      if (Array.isArray(rect) && rect.length === 4) {\n        const width = rect[2] - rect[0];\n        const height = rect[3] - rect[1];\n        this.ctx.rect(rect[0], rect[1], width, height);\n        this.clip();\n        this.endPath();\n      }\n\n      this.transform.apply(this, transform);\n      this.transform.apply(this, matrix);\n    },\n    endAnnotation: function CanvasGraphics_endAnnotation() {\n      this.restore();\n    },\n    paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(img) {\n      if (!this.contentVisible) {\n        return;\n      }\n\n      const ctx = this.ctx;\n      const width = img.width,\n            height = img.height;\n      const fillColor = this.current.fillColor;\n      const isPatternFill = this.current.patternFill;\n      const glyph = this.processingType3;\n\n      if (COMPILE_TYPE3_GLYPHS && glyph && glyph.compiled === undefined) {\n        if (width <= MAX_SIZE_TO_COMPILE && height <= MAX_SIZE_TO_COMPILE) {\n          glyph.compiled = compileType3Glyph({\n            data: img.data,\n            width,\n            height\n          });\n        } else {\n          glyph.compiled = null;\n        }\n      }\n\n      if (glyph?.compiled) {\n        glyph.compiled(ctx);\n        return;\n      }\n\n      const maskCanvas = this.cachedCanvases.getCanvas(\"maskCanvas\", width, height);\n      const maskCtx = maskCanvas.context;\n      maskCtx.save();\n      putBinaryImageMask(maskCtx, img);\n      maskCtx.globalCompositeOperation = \"source-in\";\n      maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor;\n      maskCtx.fillRect(0, 0, width, height);\n      maskCtx.restore();\n      this.paintInlineImageXObject(maskCanvas.canvas);\n    },\n\n    paintImageMaskXObjectRepeat(imgData, scaleX, skewX = 0, skewY = 0, scaleY, positions) {\n      if (!this.contentVisible) {\n        return;\n      }\n\n      const width = imgData.width;\n      const height = imgData.height;\n      const fillColor = this.current.fillColor;\n      const isPatternFill = this.current.patternFill;\n      const maskCanvas = this.cachedCanvases.getCanvas(\"maskCanvas\", width, height);\n      const maskCtx = maskCanvas.context;\n      maskCtx.save();\n      putBinaryImageMask(maskCtx, imgData);\n      maskCtx.globalCompositeOperation = \"source-in\";\n      maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor;\n      maskCtx.fillRect(0, 0, width, height);\n      maskCtx.restore();\n      const ctx = this.ctx;\n\n      for (let i = 0, ii = positions.length; i < ii; i += 2) {\n        ctx.save();\n        ctx.transform(scaleX, skewX, skewY, scaleY, positions[i], positions[i + 1]);\n        ctx.scale(1, -1);\n        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1);\n        ctx.restore();\n      }\n    },\n\n    paintImageMaskXObjectGroup: function CanvasGraphics_paintImageMaskXObjectGroup(images) {\n      if (!this.contentVisible) {\n        return;\n      }\n\n      const ctx = this.ctx;\n      const fillColor = this.current.fillColor;\n      const isPatternFill = this.current.patternFill;\n\n      for (let i = 0, ii = images.length; i < ii; i++) {\n        const image = images[i];\n        const width = image.width,\n              height = image.height;\n        const maskCanvas = this.cachedCanvases.getCanvas(\"maskCanvas\", width, height);\n        const maskCtx = maskCanvas.context;\n        maskCtx.save();\n        putBinaryImageMask(maskCtx, image);\n        maskCtx.globalCompositeOperation = \"source-in\";\n        maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor;\n        maskCtx.fillRect(0, 0, width, height);\n        maskCtx.restore();\n        ctx.save();\n        ctx.transform.apply(ctx, image.transform);\n        ctx.scale(1, -1);\n        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1);\n        ctx.restore();\n      }\n    },\n    paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {\n      if (!this.contentVisible) {\n        return;\n      }\n\n      const imgData = objId.startsWith(\"g_\") ? this.commonObjs.get(objId) : this.objs.get(objId);\n\n      if (!imgData) {\n        (0, _util.warn)(\"Dependent image isn't ready yet\");\n        return;\n      }\n\n      this.paintInlineImageXObject(imgData);\n    },\n    paintImageXObjectRepeat: function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY, positions) {\n      if (!this.contentVisible) {\n        return;\n      }\n\n      const imgData = objId.startsWith(\"g_\") ? this.commonObjs.get(objId) : this.objs.get(objId);\n\n      if (!imgData) {\n        (0, _util.warn)(\"Dependent image isn't ready yet\");\n        return;\n      }\n\n      const width = imgData.width;\n      const height = imgData.height;\n      const map = [];\n\n      for (let i = 0, ii = positions.length; i < ii; i += 2) {\n        map.push({\n          transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]],\n          x: 0,\n          y: 0,\n          w: width,\n          h: height\n        });\n      }\n\n      this.paintInlineImageXObjectGroup(imgData, map);\n    },\n    paintInlineImageXObject: function CanvasGraphics_paintInlineImageXObject(imgData) {\n      if (!this.contentVisible) {\n        return;\n      }\n\n      const width = imgData.width;\n      const height = imgData.height;\n      const ctx = this.ctx;\n      this.save();\n      ctx.scale(1 / width, -1 / height);\n      const currentTransform = ctx.mozCurrentTransformInverse;\n      let widthScale = Math.max(Math.hypot(currentTransform[0], currentTransform[1]), 1);\n      let heightScale = Math.max(Math.hypot(currentTransform[2], currentTransform[3]), 1);\n      let imgToPaint, tmpCanvas, tmpCtx;\n\n      if (typeof HTMLElement === \"function\" && imgData instanceof HTMLElement || !imgData.data) {\n        imgToPaint = imgData;\n      } else {\n        tmpCanvas = this.cachedCanvases.getCanvas(\"inlineImage\", width, height);\n        tmpCtx = tmpCanvas.context;\n        putBinaryImageData(tmpCtx, imgData, this.current.transferMaps);\n        imgToPaint = tmpCanvas.canvas;\n      }\n\n      let paintWidth = width,\n          paintHeight = height;\n      let tmpCanvasId = \"prescale1\";\n\n      while (widthScale > 2 && paintWidth > 1 || heightScale > 2 && paintHeight > 1) {\n        let newWidth = paintWidth,\n            newHeight = paintHeight;\n\n        if (widthScale > 2 && paintWidth > 1) {\n          newWidth = Math.ceil(paintWidth / 2);\n          widthScale /= paintWidth / newWidth;\n        }\n\n        if (heightScale > 2 && paintHeight > 1) {\n          newHeight = Math.ceil(paintHeight / 2);\n          heightScale /= paintHeight / newHeight;\n        }\n\n        tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight);\n        tmpCtx = tmpCanvas.context;\n        tmpCtx.clearRect(0, 0, newWidth, newHeight);\n        tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight);\n        imgToPaint = tmpCanvas.canvas;\n        paintWidth = newWidth;\n        paintHeight = newHeight;\n        tmpCanvasId = tmpCanvasId === \"prescale1\" ? \"prescale2\" : \"prescale1\";\n      }\n\n      ctx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight, 0, -height, width, height);\n\n      if (this.imageLayer) {\n        const position = this.getCanvasPosition(0, -height);\n        this.imageLayer.appendImage({\n          imgData,\n          left: position[0],\n          top: position[1],\n          width: width / currentTransform[0],\n          height: height / currentTransform[3]\n        });\n      }\n\n      this.restore();\n    },\n    paintInlineImageXObjectGroup: function CanvasGraphics_paintInlineImageXObjectGroup(imgData, map) {\n      if (!this.contentVisible) {\n        return;\n      }\n\n      const ctx = this.ctx;\n      const w = imgData.width;\n      const h = imgData.height;\n      const tmpCanvas = this.cachedCanvases.getCanvas(\"inlineImage\", w, h);\n      const tmpCtx = tmpCanvas.context;\n      putBinaryImageData(tmpCtx, imgData, this.current.transferMaps);\n\n      for (let i = 0, ii = map.length; i < ii; i++) {\n        const entry = map[i];\n        ctx.save();\n        ctx.transform.apply(ctx, entry.transform);\n        ctx.scale(1, -1);\n        ctx.drawImage(tmpCanvas.canvas, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1);\n\n        if (this.imageLayer) {\n          const position = this.getCanvasPosition(entry.x, entry.y);\n          this.imageLayer.appendImage({\n            imgData,\n            left: position[0],\n            top: position[1],\n            width: w,\n            height: h\n          });\n        }\n\n        ctx.restore();\n      }\n    },\n    paintSolidColorImageMask: function CanvasGraphics_paintSolidColorImageMask() {\n      if (!this.contentVisible) {\n        return;\n      }\n\n      this.ctx.fillRect(0, 0, 1, 1);\n    },\n    markPoint: function CanvasGraphics_markPoint(tag) {},\n    markPointProps: function CanvasGraphics_markPointProps(tag, properties) {},\n    beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {\n      this.markedContentStack.push({\n        visible: true\n      });\n    },\n    beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(tag, properties) {\n      if (tag === \"OC\") {\n        this.markedContentStack.push({\n          visible: this.optionalContentConfig.isVisible(properties)\n        });\n      } else {\n        this.markedContentStack.push({\n          visible: true\n        });\n      }\n\n      this.contentVisible = this.isContentVisible();\n    },\n    endMarkedContent: function CanvasGraphics_endMarkedContent() {\n      this.markedContentStack.pop();\n      this.contentVisible = this.isContentVisible();\n    },\n    beginCompat: function CanvasGraphics_beginCompat() {},\n    endCompat: function CanvasGraphics_endCompat() {},\n    consumePath: function CanvasGraphics_consumePath() {\n      const ctx = this.ctx;\n\n      if (this.pendingClip) {\n        if (this.pendingClip === EO_CLIP) {\n          ctx.clip(\"evenodd\");\n        } else {\n          ctx.clip();\n        }\n\n        this.pendingClip = null;\n      }\n\n      ctx.beginPath();\n    },\n\n    getSinglePixelWidth() {\n      if (this._cachedGetSinglePixelWidth === null) {\n        const m = this.ctx.mozCurrentTransform;\n        const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]);\n        const sqNorm1 = m[0] ** 2 + m[2] ** 2;\n        const sqNorm2 = m[1] ** 2 + m[3] ** 2;\n        const pixelHeight = Math.sqrt(Math.max(sqNorm1, sqNorm2)) / absDet;\n\n        if (sqNorm1 !== sqNorm2 && this._combinedScaleFactor * pixelHeight > 1) {\n          this._cachedGetSinglePixelWidth = -(this._combinedScaleFactor * pixelHeight);\n        } else if (absDet > Number.EPSILON) {\n          this._cachedGetSinglePixelWidth = pixelHeight;\n        } else {\n          this._cachedGetSinglePixelWidth = 1;\n        }\n      }\n\n      return this._cachedGetSinglePixelWidth;\n    },\n\n    getCanvasPosition: function CanvasGraphics_getCanvasPosition(x, y) {\n      const transform = this.ctx.mozCurrentTransform;\n      return [transform[0] * x + transform[2] * y + transform[4], transform[1] * x + transform[3] * y + transform[5]];\n    },\n    isContentVisible: function CanvasGraphics_isContentVisible() {\n      for (let i = this.markedContentStack.length - 1; i >= 0; i--) {\n        if (!this.markedContentStack[i].visible) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n  };\n\n  for (const op in _util.OPS) {\n    CanvasGraphics.prototype[_util.OPS[op]] = CanvasGraphics.prototype[op];\n  }\n\n  return CanvasGraphics;\n}();\n\nexports.CanvasGraphics = CanvasGraphics;\n\n/***/ }),\n/* 11 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.getShadingPatternFromIR = getShadingPatternFromIR;\nexports.TilingPattern = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nconst ShadingIRs = {};\n\nfunction applyBoundingBox(ctx, bbox) {\n  if (!bbox || typeof Path2D === \"undefined\") {\n    return;\n  }\n\n  const width = bbox[2] - bbox[0];\n  const height = bbox[3] - bbox[1];\n  const region = new Path2D();\n  region.rect(bbox[0], bbox[1], width, height);\n  ctx.clip(region);\n}\n\nShadingIRs.RadialAxial = {\n  fromIR: function RadialAxial_fromIR(raw) {\n    const type = raw[1];\n    const bbox = raw[2];\n    const colorStops = raw[3];\n    const p0 = raw[4];\n    const p1 = raw[5];\n    const r0 = raw[6];\n    const r1 = raw[7];\n    return {\n      getPattern: function RadialAxial_getPattern(ctx) {\n        applyBoundingBox(ctx, bbox);\n        let grad;\n\n        if (type === \"axial\") {\n          grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);\n        } else if (type === \"radial\") {\n          grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);\n        }\n\n        for (let i = 0, ii = colorStops.length; i < ii; ++i) {\n          const c = colorStops[i];\n          grad.addColorStop(c[0], c[1]);\n        }\n\n        return grad;\n      }\n    };\n  }\n};\n\nconst createMeshCanvas = function createMeshCanvasClosure() {\n  function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {\n    const coords = context.coords,\n          colors = context.colors;\n    const bytes = data.data,\n          rowSize = data.width * 4;\n    let tmp;\n\n    if (coords[p1 + 1] > coords[p2 + 1]) {\n      tmp = p1;\n      p1 = p2;\n      p2 = tmp;\n      tmp = c1;\n      c1 = c2;\n      c2 = tmp;\n    }\n\n    if (coords[p2 + 1] > coords[p3 + 1]) {\n      tmp = p2;\n      p2 = p3;\n      p3 = tmp;\n      tmp = c2;\n      c2 = c3;\n      c3 = tmp;\n    }\n\n    if (coords[p1 + 1] > coords[p2 + 1]) {\n      tmp = p1;\n      p1 = p2;\n      p2 = tmp;\n      tmp = c1;\n      c1 = c2;\n      c2 = tmp;\n    }\n\n    const x1 = (coords[p1] + context.offsetX) * context.scaleX;\n    const y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY;\n    const x2 = (coords[p2] + context.offsetX) * context.scaleX;\n    const y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY;\n    const x3 = (coords[p3] + context.offsetX) * context.scaleX;\n    const y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY;\n\n    if (y1 >= y3) {\n      return;\n    }\n\n    const c1r = colors[c1],\n          c1g = colors[c1 + 1],\n          c1b = colors[c1 + 2];\n    const c2r = colors[c2],\n          c2g = colors[c2 + 1],\n          c2b = colors[c2 + 2];\n    const c3r = colors[c3],\n          c3g = colors[c3 + 1],\n          c3b = colors[c3 + 2];\n    const minY = Math.round(y1),\n          maxY = Math.round(y3);\n    let xa, car, cag, cab;\n    let xb, cbr, cbg, cbb;\n\n    for (let y = minY; y <= maxY; y++) {\n      if (y < y2) {\n        let k;\n\n        if (y < y1) {\n          k = 0;\n        } else if (y1 === y2) {\n          k = 1;\n        } else {\n          k = (y1 - y) / (y1 - y2);\n        }\n\n        xa = x1 - (x1 - x2) * k;\n        car = c1r - (c1r - c2r) * k;\n        cag = c1g - (c1g - c2g) * k;\n        cab = c1b - (c1b - c2b) * k;\n      } else {\n        let k;\n\n        if (y > y3) {\n          k = 1;\n        } else if (y2 === y3) {\n          k = 0;\n        } else {\n          k = (y2 - y) / (y2 - y3);\n        }\n\n        xa = x2 - (x2 - x3) * k;\n        car = c2r - (c2r - c3r) * k;\n        cag = c2g - (c2g - c3g) * k;\n        cab = c2b - (c2b - c3b) * k;\n      }\n\n      let k;\n\n      if (y < y1) {\n        k = 0;\n      } else if (y > y3) {\n        k = 1;\n      } else {\n        k = (y1 - y) / (y1 - y3);\n      }\n\n      xb = x1 - (x1 - x3) * k;\n      cbr = c1r - (c1r - c3r) * k;\n      cbg = c1g - (c1g - c3g) * k;\n      cbb = c1b - (c1b - c3b) * k;\n      const x1_ = Math.round(Math.min(xa, xb));\n      const x2_ = Math.round(Math.max(xa, xb));\n      let j = rowSize * y + x1_ * 4;\n\n      for (let x = x1_; x <= x2_; x++) {\n        k = (xa - x) / (xa - xb);\n\n        if (k < 0) {\n          k = 0;\n        } else if (k > 1) {\n          k = 1;\n        }\n\n        bytes[j++] = car - (car - cbr) * k | 0;\n        bytes[j++] = cag - (cag - cbg) * k | 0;\n        bytes[j++] = cab - (cab - cbb) * k | 0;\n        bytes[j++] = 255;\n      }\n    }\n  }\n\n  function drawFigure(data, figure, context) {\n    const ps = figure.coords;\n    const cs = figure.colors;\n    let i, ii;\n\n    switch (figure.type) {\n      case \"lattice\":\n        const verticesPerRow = figure.verticesPerRow;\n        const rows = Math.floor(ps.length / verticesPerRow) - 1;\n        const cols = verticesPerRow - 1;\n\n        for (i = 0; i < rows; i++) {\n          let q = i * verticesPerRow;\n\n          for (let j = 0; j < cols; j++, q++) {\n            drawTriangle(data, context, ps[q], ps[q + 1], ps[q + verticesPerRow], cs[q], cs[q + 1], cs[q + verticesPerRow]);\n            drawTriangle(data, context, ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]);\n          }\n        }\n\n        break;\n\n      case \"triangles\":\n        for (i = 0, ii = ps.length; i < ii; i += 3) {\n          drawTriangle(data, context, ps[i], ps[i + 1], ps[i + 2], cs[i], cs[i + 1], cs[i + 2]);\n        }\n\n        break;\n\n      default:\n        throw new Error(\"illegal figure\");\n    }\n  }\n\n  function createMeshCanvas(bounds, combinesScale, coords, colors, figures, backgroundColor, cachedCanvases, webGLContext) {\n    const EXPECTED_SCALE = 1.1;\n    const MAX_PATTERN_SIZE = 3000;\n    const BORDER_SIZE = 2;\n    const offsetX = Math.floor(bounds[0]);\n    const offsetY = Math.floor(bounds[1]);\n    const boundsWidth = Math.ceil(bounds[2]) - offsetX;\n    const boundsHeight = Math.ceil(bounds[3]) - offsetY;\n    const width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE);\n    const height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE);\n    const scaleX = boundsWidth / width;\n    const scaleY = boundsHeight / height;\n    const context = {\n      coords,\n      colors,\n      offsetX: -offsetX,\n      offsetY: -offsetY,\n      scaleX: 1 / scaleX,\n      scaleY: 1 / scaleY\n    };\n    const paddedWidth = width + BORDER_SIZE * 2;\n    const paddedHeight = height + BORDER_SIZE * 2;\n    let canvas, tmpCanvas, i, ii;\n\n    if (webGLContext.isEnabled) {\n      canvas = webGLContext.drawFigures({\n        width,\n        height,\n        backgroundColor,\n        figures,\n        context\n      });\n      tmpCanvas = cachedCanvases.getCanvas(\"mesh\", paddedWidth, paddedHeight, false);\n      tmpCanvas.context.drawImage(canvas, BORDER_SIZE, BORDER_SIZE);\n      canvas = tmpCanvas.canvas;\n    } else {\n      tmpCanvas = cachedCanvases.getCanvas(\"mesh\", paddedWidth, paddedHeight, false);\n      const tmpCtx = tmpCanvas.context;\n      const data = tmpCtx.createImageData(width, height);\n\n      if (backgroundColor) {\n        const bytes = data.data;\n\n        for (i = 0, ii = bytes.length; i < ii; i += 4) {\n          bytes[i] = backgroundColor[0];\n          bytes[i + 1] = backgroundColor[1];\n          bytes[i + 2] = backgroundColor[2];\n          bytes[i + 3] = 255;\n        }\n      }\n\n      for (i = 0; i < figures.length; i++) {\n        drawFigure(data, figures[i], context);\n      }\n\n      tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE);\n      canvas = tmpCanvas.canvas;\n    }\n\n    return {\n      canvas,\n      offsetX: offsetX - BORDER_SIZE * scaleX,\n      offsetY: offsetY - BORDER_SIZE * scaleY,\n      scaleX,\n      scaleY\n    };\n  }\n\n  return createMeshCanvas;\n}();\n\nShadingIRs.Mesh = {\n  fromIR: function Mesh_fromIR(raw) {\n    const coords = raw[2];\n    const colors = raw[3];\n    const figures = raw[4];\n    const bounds = raw[5];\n    const matrix = raw[6];\n    const bbox = raw[7];\n    const background = raw[8];\n    return {\n      getPattern: function Mesh_getPattern(ctx, owner, shadingFill) {\n        applyBoundingBox(ctx, bbox);\n        let scale;\n\n        if (shadingFill) {\n          scale = _util.Util.singularValueDecompose2dScale(ctx.mozCurrentTransform);\n        } else {\n          scale = _util.Util.singularValueDecompose2dScale(owner.baseTransform);\n\n          if (matrix) {\n            const matrixScale = _util.Util.singularValueDecompose2dScale(matrix);\n\n            scale = [scale[0] * matrixScale[0], scale[1] * matrixScale[1]];\n          }\n        }\n\n        const temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords, colors, figures, shadingFill ? null : background, owner.cachedCanvases, owner.webGLContext);\n\n        if (!shadingFill) {\n          ctx.setTransform.apply(ctx, owner.baseTransform);\n\n          if (matrix) {\n            ctx.transform.apply(ctx, matrix);\n          }\n        }\n\n        ctx.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY);\n        ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY);\n        return ctx.createPattern(temporaryPatternCanvas.canvas, \"no-repeat\");\n      }\n    };\n  }\n};\nShadingIRs.Dummy = {\n  fromIR: function Dummy_fromIR() {\n    return {\n      getPattern: function Dummy_fromIR_getPattern() {\n        return \"hotpink\";\n      }\n    };\n  }\n};\n\nfunction getShadingPatternFromIR(raw) {\n  const shadingIR = ShadingIRs[raw[0]];\n\n  if (!shadingIR) {\n    throw new Error(`Unknown IR type: ${raw[0]}`);\n  }\n\n  return shadingIR.fromIR(raw);\n}\n\nconst TilingPattern = function TilingPatternClosure() {\n  const PaintType = {\n    COLORED: 1,\n    UNCOLORED: 2\n  };\n  const MAX_PATTERN_SIZE = 3000;\n\n  function TilingPattern(IR, color, ctx, canvasGraphicsFactory, baseTransform) {\n    this.operatorList = IR[2];\n    this.matrix = IR[3] || [1, 0, 0, 1, 0, 0];\n    this.bbox = IR[4];\n    this.xstep = IR[5];\n    this.ystep = IR[6];\n    this.paintType = IR[7];\n    this.tilingType = IR[8];\n    this.color = color;\n    this.canvasGraphicsFactory = canvasGraphicsFactory;\n    this.baseTransform = baseTransform;\n    this.ctx = ctx;\n  }\n\n  TilingPattern.prototype = {\n    createPatternCanvas: function TilinPattern_createPatternCanvas(owner) {\n      const operatorList = this.operatorList;\n      const bbox = this.bbox;\n      const xstep = this.xstep;\n      const ystep = this.ystep;\n      const paintType = this.paintType;\n      const tilingType = this.tilingType;\n      const color = this.color;\n      const canvasGraphicsFactory = this.canvasGraphicsFactory;\n      (0, _util.info)(\"TilingType: \" + tilingType);\n      const x0 = bbox[0],\n            y0 = bbox[1],\n            x1 = bbox[2],\n            y1 = bbox[3];\n\n      const matrixScale = _util.Util.singularValueDecompose2dScale(this.matrix);\n\n      const curMatrixScale = _util.Util.singularValueDecompose2dScale(this.baseTransform);\n\n      const combinedScale = [matrixScale[0] * curMatrixScale[0], matrixScale[1] * curMatrixScale[1]];\n      const dimx = this.getSizeAndScale(xstep, this.ctx.canvas.width, combinedScale[0]);\n      const dimy = this.getSizeAndScale(ystep, this.ctx.canvas.height, combinedScale[1]);\n      const tmpCanvas = owner.cachedCanvases.getCanvas(\"pattern\", dimx.size, dimy.size, true);\n      const tmpCtx = tmpCanvas.context;\n      const graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx);\n      graphics.groupLevel = owner.groupLevel;\n      this.setFillAndStrokeStyleToContext(graphics, paintType, color);\n      graphics.transform(dimx.scale, 0, 0, dimy.scale, 0, 0);\n      graphics.transform(1, 0, 0, 1, -x0, -y0);\n      this.clipBbox(graphics, bbox, x0, y0, x1, y1);\n      graphics.executeOperatorList(operatorList);\n      this.ctx.transform(1, 0, 0, 1, x0, y0);\n      this.ctx.scale(1 / dimx.scale, 1 / dimy.scale);\n      return tmpCanvas.canvas;\n    },\n    getSizeAndScale: function TilingPattern_getSizeAndScale(step, realOutputSize, scale) {\n      step = Math.abs(step);\n      const maxSize = Math.max(MAX_PATTERN_SIZE, realOutputSize);\n      let size = Math.ceil(step * scale);\n\n      if (size >= maxSize) {\n        size = maxSize;\n      } else {\n        scale = size / step;\n      }\n\n      return {\n        scale,\n        size\n      };\n    },\n    clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) {\n      if (Array.isArray(bbox) && bbox.length === 4) {\n        const bboxWidth = x1 - x0;\n        const bboxHeight = y1 - y0;\n        graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);\n        graphics.clip();\n        graphics.endPath();\n      }\n    },\n    setFillAndStrokeStyleToContext: function setFillAndStrokeStyleToContext(graphics, paintType, color) {\n      const context = graphics.ctx,\n            current = graphics.current;\n\n      switch (paintType) {\n        case PaintType.COLORED:\n          const ctx = this.ctx;\n          context.fillStyle = ctx.fillStyle;\n          context.strokeStyle = ctx.strokeStyle;\n          current.fillColor = ctx.fillStyle;\n          current.strokeColor = ctx.strokeStyle;\n          break;\n\n        case PaintType.UNCOLORED:\n          const cssColor = _util.Util.makeHexColor(color[0], color[1], color[2]);\n\n          context.fillStyle = cssColor;\n          context.strokeStyle = cssColor;\n          current.fillColor = cssColor;\n          current.strokeColor = cssColor;\n          break;\n\n        default:\n          throw new _util.FormatError(`Unsupported paint type: ${paintType}`);\n      }\n    },\n    getPattern: function TilingPattern_getPattern(ctx, owner) {\n      ctx = this.ctx;\n      ctx.setTransform.apply(ctx, this.baseTransform);\n      ctx.transform.apply(ctx, this.matrix);\n      const temporaryPatternCanvas = this.createPatternCanvas(owner);\n      return ctx.createPattern(temporaryPatternCanvas, \"repeat\");\n    }\n  };\n  return TilingPattern;\n}();\n\nexports.TilingPattern = TilingPattern;\n\n/***/ }),\n/* 12 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.GlobalWorkerOptions = void 0;\nconst GlobalWorkerOptions = Object.create(null);\nexports.GlobalWorkerOptions = GlobalWorkerOptions;\nGlobalWorkerOptions.workerPort = GlobalWorkerOptions.workerPort === undefined ? null : GlobalWorkerOptions.workerPort;\nGlobalWorkerOptions.workerSrc = GlobalWorkerOptions.workerSrc === undefined ? \"\" : GlobalWorkerOptions.workerSrc;\n\n/***/ }),\n/* 13 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.MessageHandler = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nconst CallbackKind = {\n  UNKNOWN: 0,\n  DATA: 1,\n  ERROR: 2\n};\nconst StreamKind = {\n  UNKNOWN: 0,\n  CANCEL: 1,\n  CANCEL_COMPLETE: 2,\n  CLOSE: 3,\n  ENQUEUE: 4,\n  ERROR: 5,\n  PULL: 6,\n  PULL_COMPLETE: 7,\n  START_COMPLETE: 8\n};\n\nfunction wrapReason(reason) {\n  if (typeof reason !== \"object\" || reason === null) {\n    return reason;\n  }\n\n  switch (reason.name) {\n    case \"AbortException\":\n      return new _util.AbortException(reason.message);\n\n    case \"MissingPDFException\":\n      return new _util.MissingPDFException(reason.message);\n\n    case \"UnexpectedResponseException\":\n      return new _util.UnexpectedResponseException(reason.message, reason.status);\n\n    case \"UnknownErrorException\":\n      return new _util.UnknownErrorException(reason.message, reason.details);\n\n    default:\n      return new _util.UnknownErrorException(reason.message, reason.toString());\n  }\n}\n\nclass MessageHandler {\n  constructor(sourceName, targetName, comObj) {\n    this.sourceName = sourceName;\n    this.targetName = targetName;\n    this.comObj = comObj;\n    this.callbackId = 1;\n    this.streamId = 1;\n    this.postMessageTransfers = true;\n    this.streamSinks = Object.create(null);\n    this.streamControllers = Object.create(null);\n    this.callbackCapabilities = Object.create(null);\n    this.actionHandler = Object.create(null);\n\n    this._onComObjOnMessage = event => {\n      const data = event.data;\n\n      if (data.targetName !== this.sourceName) {\n        return;\n      }\n\n      if (data.stream) {\n        this._processStreamMessage(data);\n\n        return;\n      }\n\n      if (data.callback) {\n        const callbackId = data.callbackId;\n        const capability = this.callbackCapabilities[callbackId];\n\n        if (!capability) {\n          throw new Error(`Cannot resolve callback ${callbackId}`);\n        }\n\n        delete this.callbackCapabilities[callbackId];\n\n        if (data.callback === CallbackKind.DATA) {\n          capability.resolve(data.data);\n        } else if (data.callback === CallbackKind.ERROR) {\n          capability.reject(wrapReason(data.reason));\n        } else {\n          throw new Error(\"Unexpected callback case\");\n        }\n\n        return;\n      }\n\n      const action = this.actionHandler[data.action];\n\n      if (!action) {\n        throw new Error(`Unknown action from worker: ${data.action}`);\n      }\n\n      if (data.callbackId) {\n        const cbSourceName = this.sourceName;\n        const cbTargetName = data.sourceName;\n        new Promise(function (resolve) {\n          resolve(action(data.data));\n        }).then(function (result) {\n          comObj.postMessage({\n            sourceName: cbSourceName,\n            targetName: cbTargetName,\n            callback: CallbackKind.DATA,\n            callbackId: data.callbackId,\n            data: result\n          });\n        }, function (reason) {\n          comObj.postMessage({\n            sourceName: cbSourceName,\n            targetName: cbTargetName,\n            callback: CallbackKind.ERROR,\n            callbackId: data.callbackId,\n            reason: wrapReason(reason)\n          });\n        });\n        return;\n      }\n\n      if (data.streamId) {\n        this._createStreamSink(data);\n\n        return;\n      }\n\n      action(data.data);\n    };\n\n    comObj.addEventListener(\"message\", this._onComObjOnMessage);\n  }\n\n  on(actionName, handler) {\n    const ah = this.actionHandler;\n\n    if (ah[actionName]) {\n      throw new Error(`There is already an actionName called \"${actionName}\"`);\n    }\n\n    ah[actionName] = handler;\n  }\n\n  send(actionName, data, transfers) {\n    this._postMessage({\n      sourceName: this.sourceName,\n      targetName: this.targetName,\n      action: actionName,\n      data\n    }, transfers);\n  }\n\n  sendWithPromise(actionName, data, transfers) {\n    const callbackId = this.callbackId++;\n    const capability = (0, _util.createPromiseCapability)();\n    this.callbackCapabilities[callbackId] = capability;\n\n    try {\n      this._postMessage({\n        sourceName: this.sourceName,\n        targetName: this.targetName,\n        action: actionName,\n        callbackId,\n        data\n      }, transfers);\n    } catch (ex) {\n      capability.reject(ex);\n    }\n\n    return capability.promise;\n  }\n\n  sendWithStream(actionName, data, queueingStrategy, transfers) {\n    const streamId = this.streamId++;\n    const sourceName = this.sourceName;\n    const targetName = this.targetName;\n    const comObj = this.comObj;\n    return new ReadableStream({\n      start: controller => {\n        const startCapability = (0, _util.createPromiseCapability)();\n        this.streamControllers[streamId] = {\n          controller,\n          startCall: startCapability,\n          pullCall: null,\n          cancelCall: null,\n          isClosed: false\n        };\n\n        this._postMessage({\n          sourceName,\n          targetName,\n          action: actionName,\n          streamId,\n          data,\n          desiredSize: controller.desiredSize\n        }, transfers);\n\n        return startCapability.promise;\n      },\n      pull: controller => {\n        const pullCapability = (0, _util.createPromiseCapability)();\n        this.streamControllers[streamId].pullCall = pullCapability;\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.PULL,\n          streamId,\n          desiredSize: controller.desiredSize\n        });\n        return pullCapability.promise;\n      },\n      cancel: reason => {\n        (0, _util.assert)(reason instanceof Error, \"cancel must have a valid reason\");\n        const cancelCapability = (0, _util.createPromiseCapability)();\n        this.streamControllers[streamId].cancelCall = cancelCapability;\n        this.streamControllers[streamId].isClosed = true;\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.CANCEL,\n          streamId,\n          reason: wrapReason(reason)\n        });\n        return cancelCapability.promise;\n      }\n    }, queueingStrategy);\n  }\n\n  _createStreamSink(data) {\n    const self = this;\n    const action = this.actionHandler[data.action];\n    const streamId = data.streamId;\n    const sourceName = this.sourceName;\n    const targetName = data.sourceName;\n    const comObj = this.comObj;\n    const streamSink = {\n      enqueue(chunk, size = 1, transfers) {\n        if (this.isCancelled) {\n          return;\n        }\n\n        const lastDesiredSize = this.desiredSize;\n        this.desiredSize -= size;\n\n        if (lastDesiredSize > 0 && this.desiredSize <= 0) {\n          this.sinkCapability = (0, _util.createPromiseCapability)();\n          this.ready = this.sinkCapability.promise;\n        }\n\n        self._postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.ENQUEUE,\n          streamId,\n          chunk\n        }, transfers);\n      },\n\n      close() {\n        if (this.isCancelled) {\n          return;\n        }\n\n        this.isCancelled = true;\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.CLOSE,\n          streamId\n        });\n        delete self.streamSinks[streamId];\n      },\n\n      error(reason) {\n        (0, _util.assert)(reason instanceof Error, \"error must have a valid reason\");\n\n        if (this.isCancelled) {\n          return;\n        }\n\n        this.isCancelled = true;\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.ERROR,\n          streamId,\n          reason: wrapReason(reason)\n        });\n      },\n\n      sinkCapability: (0, _util.createPromiseCapability)(),\n      onPull: null,\n      onCancel: null,\n      isCancelled: false,\n      desiredSize: data.desiredSize,\n      ready: null\n    };\n    streamSink.sinkCapability.resolve();\n    streamSink.ready = streamSink.sinkCapability.promise;\n    this.streamSinks[streamId] = streamSink;\n    new Promise(function (resolve) {\n      resolve(action(data.data, streamSink));\n    }).then(function () {\n      comObj.postMessage({\n        sourceName,\n        targetName,\n        stream: StreamKind.START_COMPLETE,\n        streamId,\n        success: true\n      });\n    }, function (reason) {\n      comObj.postMessage({\n        sourceName,\n        targetName,\n        stream: StreamKind.START_COMPLETE,\n        streamId,\n        reason: wrapReason(reason)\n      });\n    });\n  }\n\n  _processStreamMessage(data) {\n    const streamId = data.streamId;\n    const sourceName = this.sourceName;\n    const targetName = data.sourceName;\n    const comObj = this.comObj;\n\n    switch (data.stream) {\n      case StreamKind.START_COMPLETE:\n        if (data.success) {\n          this.streamControllers[streamId].startCall.resolve();\n        } else {\n          this.streamControllers[streamId].startCall.reject(wrapReason(data.reason));\n        }\n\n        break;\n\n      case StreamKind.PULL_COMPLETE:\n        if (data.success) {\n          this.streamControllers[streamId].pullCall.resolve();\n        } else {\n          this.streamControllers[streamId].pullCall.reject(wrapReason(data.reason));\n        }\n\n        break;\n\n      case StreamKind.PULL:\n        if (!this.streamSinks[streamId]) {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.PULL_COMPLETE,\n            streamId,\n            success: true\n          });\n          break;\n        }\n\n        if (this.streamSinks[streamId].desiredSize <= 0 && data.desiredSize > 0) {\n          this.streamSinks[streamId].sinkCapability.resolve();\n        }\n\n        this.streamSinks[streamId].desiredSize = data.desiredSize;\n        const {\n          onPull\n        } = this.streamSinks[data.streamId];\n        new Promise(function (resolve) {\n          resolve(onPull && onPull());\n        }).then(function () {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.PULL_COMPLETE,\n            streamId,\n            success: true\n          });\n        }, function (reason) {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.PULL_COMPLETE,\n            streamId,\n            reason: wrapReason(reason)\n          });\n        });\n        break;\n\n      case StreamKind.ENQUEUE:\n        (0, _util.assert)(this.streamControllers[streamId], \"enqueue should have stream controller\");\n\n        if (this.streamControllers[streamId].isClosed) {\n          break;\n        }\n\n        this.streamControllers[streamId].controller.enqueue(data.chunk);\n        break;\n\n      case StreamKind.CLOSE:\n        (0, _util.assert)(this.streamControllers[streamId], \"close should have stream controller\");\n\n        if (this.streamControllers[streamId].isClosed) {\n          break;\n        }\n\n        this.streamControllers[streamId].isClosed = true;\n        this.streamControllers[streamId].controller.close();\n\n        this._deleteStreamController(streamId);\n\n        break;\n\n      case StreamKind.ERROR:\n        (0, _util.assert)(this.streamControllers[streamId], \"error should have stream controller\");\n        this.streamControllers[streamId].controller.error(wrapReason(data.reason));\n\n        this._deleteStreamController(streamId);\n\n        break;\n\n      case StreamKind.CANCEL_COMPLETE:\n        if (data.success) {\n          this.streamControllers[streamId].cancelCall.resolve();\n        } else {\n          this.streamControllers[streamId].cancelCall.reject(wrapReason(data.reason));\n        }\n\n        this._deleteStreamController(streamId);\n\n        break;\n\n      case StreamKind.CANCEL:\n        if (!this.streamSinks[streamId]) {\n          break;\n        }\n\n        const {\n          onCancel\n        } = this.streamSinks[data.streamId];\n        new Promise(function (resolve) {\n          resolve(onCancel && onCancel(wrapReason(data.reason)));\n        }).then(function () {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.CANCEL_COMPLETE,\n            streamId,\n            success: true\n          });\n        }, function (reason) {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.CANCEL_COMPLETE,\n            streamId,\n            reason: wrapReason(reason)\n          });\n        });\n        this.streamSinks[streamId].sinkCapability.reject(wrapReason(data.reason));\n        this.streamSinks[streamId].isCancelled = true;\n        delete this.streamSinks[streamId];\n        break;\n\n      default:\n        throw new Error(\"Unexpected stream case\");\n    }\n  }\n\n  async _deleteStreamController(streamId) {\n    await Promise.allSettled([this.streamControllers[streamId].startCall, this.streamControllers[streamId].pullCall, this.streamControllers[streamId].cancelCall].map(function (capability) {\n      return capability && capability.promise;\n    }));\n    delete this.streamControllers[streamId];\n  }\n\n  _postMessage(message, transfers) {\n    if (transfers && this.postMessageTransfers) {\n      this.comObj.postMessage(message, transfers);\n    } else {\n      this.comObj.postMessage(message);\n    }\n  }\n\n  destroy() {\n    this.comObj.removeEventListener(\"message\", this._onComObjOnMessage);\n  }\n\n}\n\nexports.MessageHandler = MessageHandler;\n\n/***/ }),\n/* 14 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.Metadata = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nclass Metadata {\n  constructor({\n    parsedData,\n    rawData\n  }) {\n    this._metadataMap = parsedData;\n    this._data = rawData;\n  }\n\n  getRaw() {\n    return this._data;\n  }\n\n  get(name) {\n    return this._metadataMap.get(name) ?? null;\n  }\n\n  getAll() {\n    return (0, _util.objectFromMap)(this._metadataMap);\n  }\n\n  has(name) {\n    return this._metadataMap.has(name);\n  }\n\n}\n\nexports.Metadata = Metadata;\n\n/***/ }),\n/* 15 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.OptionalContentConfig = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nclass OptionalContentGroup {\n  constructor(name, intent) {\n    this.visible = true;\n    this.name = name;\n    this.intent = intent;\n  }\n\n}\n\nclass OptionalContentConfig {\n  constructor(data) {\n    this.name = null;\n    this.creator = null;\n    this._order = null;\n    this._groups = new Map();\n\n    if (data === null) {\n      return;\n    }\n\n    this.name = data.name;\n    this.creator = data.creator;\n    this._order = data.order;\n\n    for (const group of data.groups) {\n      this._groups.set(group.id, new OptionalContentGroup(group.name, group.intent));\n    }\n\n    if (data.baseState === \"OFF\") {\n      for (const group of this._groups) {\n        group.visible = false;\n      }\n    }\n\n    for (const on of data.on) {\n      this._groups.get(on).visible = true;\n    }\n\n    for (const off of data.off) {\n      this._groups.get(off).visible = false;\n    }\n  }\n\n  isVisible(group) {\n    if (group.type === \"OCG\") {\n      if (!this._groups.has(group.id)) {\n        (0, _util.warn)(`Optional content group not found: ${group.id}`);\n        return true;\n      }\n\n      return this._groups.get(group.id).visible;\n    } else if (group.type === \"OCMD\") {\n      if (group.expression) {\n        (0, _util.warn)(\"Visibility expression not supported yet.\");\n      }\n\n      if (!group.policy || group.policy === \"AnyOn\") {\n        for (const id of group.ids) {\n          if (!this._groups.has(id)) {\n            (0, _util.warn)(`Optional content group not found: ${id}`);\n            return true;\n          }\n\n          if (this._groups.get(id).visible) {\n            return true;\n          }\n        }\n\n        return false;\n      } else if (group.policy === \"AllOn\") {\n        for (const id of group.ids) {\n          if (!this._groups.has(id)) {\n            (0, _util.warn)(`Optional content group not found: ${id}`);\n            return true;\n          }\n\n          if (!this._groups.get(id).visible) {\n            return false;\n          }\n        }\n\n        return true;\n      } else if (group.policy === \"AnyOff\") {\n        for (const id of group.ids) {\n          if (!this._groups.has(id)) {\n            (0, _util.warn)(`Optional content group not found: ${id}`);\n            return true;\n          }\n\n          if (!this._groups.get(id).visible) {\n            return true;\n          }\n        }\n\n        return false;\n      } else if (group.policy === \"AllOff\") {\n        for (const id of group.ids) {\n          if (!this._groups.has(id)) {\n            (0, _util.warn)(`Optional content group not found: ${id}`);\n            return true;\n          }\n\n          if (this._groups.get(id).visible) {\n            return false;\n          }\n        }\n\n        return true;\n      }\n\n      (0, _util.warn)(`Unknown optional content policy ${group.policy}.`);\n      return true;\n    }\n\n    (0, _util.warn)(`Unknown group type ${group.type}.`);\n    return true;\n  }\n\n  setVisibility(id, visible = true) {\n    if (!this._groups.has(id)) {\n      (0, _util.warn)(`Optional content group not found: ${id}`);\n      return;\n    }\n\n    this._groups.get(id).visible = !!visible;\n  }\n\n  getOrder() {\n    if (!this._groups.size) {\n      return null;\n    }\n\n    if (this._order) {\n      return this._order.slice();\n    }\n\n    return Array.from(this._groups.keys());\n  }\n\n  getGroups() {\n    return this._groups.size > 0 ? (0, _util.objectFromMap)(this._groups) : null;\n  }\n\n  getGroup(id) {\n    return this._groups.get(id) || null;\n  }\n\n}\n\nexports.OptionalContentConfig = OptionalContentConfig;\n\n/***/ }),\n/* 16 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFDataTransportStream = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _display_utils = __w_pdfjs_require__(1);\n\nclass PDFDataTransportStream {\n  constructor(params, pdfDataRangeTransport) {\n    (0, _util.assert)(pdfDataRangeTransport, 'PDFDataTransportStream - missing required \"pdfDataRangeTransport\" argument.');\n    this._queuedChunks = [];\n    this._progressiveDone = params.progressiveDone || false;\n    this._contentDispositionFilename = params.contentDispositionFilename || null;\n    const initialData = params.initialData;\n\n    if (initialData?.length > 0) {\n      const buffer = new Uint8Array(initialData).buffer;\n\n      this._queuedChunks.push(buffer);\n    }\n\n    this._pdfDataRangeTransport = pdfDataRangeTransport;\n    this._isStreamingSupported = !params.disableStream;\n    this._isRangeSupported = !params.disableRange;\n    this._contentLength = params.length;\n    this._fullRequestReader = null;\n    this._rangeReaders = [];\n\n    this._pdfDataRangeTransport.addRangeListener((begin, chunk) => {\n      this._onReceiveData({\n        begin,\n        chunk\n      });\n    });\n\n    this._pdfDataRangeTransport.addProgressListener((loaded, total) => {\n      this._onProgress({\n        loaded,\n        total\n      });\n    });\n\n    this._pdfDataRangeTransport.addProgressiveReadListener(chunk => {\n      this._onReceiveData({\n        chunk\n      });\n    });\n\n    this._pdfDataRangeTransport.addProgressiveDoneListener(() => {\n      this._onProgressiveDone();\n    });\n\n    this._pdfDataRangeTransport.transportReady();\n  }\n\n  _onReceiveData(args) {\n    const buffer = new Uint8Array(args.chunk).buffer;\n\n    if (args.begin === undefined) {\n      if (this._fullRequestReader) {\n        this._fullRequestReader._enqueue(buffer);\n      } else {\n        this._queuedChunks.push(buffer);\n      }\n    } else {\n      const found = this._rangeReaders.some(function (rangeReader) {\n        if (rangeReader._begin !== args.begin) {\n          return false;\n        }\n\n        rangeReader._enqueue(buffer);\n\n        return true;\n      });\n\n      (0, _util.assert)(found, \"_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found.\");\n    }\n  }\n\n  get _progressiveDataLength() {\n    return this._fullRequestReader?._loaded ?? 0;\n  }\n\n  _onProgress(evt) {\n    if (evt.total === undefined) {\n      const firstReader = this._rangeReaders[0];\n\n      if (firstReader?.onProgress) {\n        firstReader.onProgress({\n          loaded: evt.loaded\n        });\n      }\n    } else {\n      const fullReader = this._fullRequestReader;\n\n      if (fullReader?.onProgress) {\n        fullReader.onProgress({\n          loaded: evt.loaded,\n          total: evt.total\n        });\n      }\n    }\n  }\n\n  _onProgressiveDone() {\n    if (this._fullRequestReader) {\n      this._fullRequestReader.progressiveDone();\n    }\n\n    this._progressiveDone = true;\n  }\n\n  _removeRangeReader(reader) {\n    const i = this._rangeReaders.indexOf(reader);\n\n    if (i >= 0) {\n      this._rangeReaders.splice(i, 1);\n    }\n  }\n\n  getFullReader() {\n    (0, _util.assert)(!this._fullRequestReader, \"PDFDataTransportStream.getFullReader can only be called once.\");\n    const queuedChunks = this._queuedChunks;\n    this._queuedChunks = null;\n    return new PDFDataTransportStreamReader(this, queuedChunks, this._progressiveDone, this._contentDispositionFilename);\n  }\n\n  getRangeReader(begin, end) {\n    if (end <= this._progressiveDataLength) {\n      return null;\n    }\n\n    const reader = new PDFDataTransportStreamRangeReader(this, begin, end);\n\n    this._pdfDataRangeTransport.requestDataRange(begin, end);\n\n    this._rangeReaders.push(reader);\n\n    return reader;\n  }\n\n  cancelAllRequests(reason) {\n    if (this._fullRequestReader) {\n      this._fullRequestReader.cancel(reason);\n    }\n\n    const readers = this._rangeReaders.slice(0);\n\n    readers.forEach(function (rangeReader) {\n      rangeReader.cancel(reason);\n    });\n\n    this._pdfDataRangeTransport.abort();\n  }\n\n}\n\nexports.PDFDataTransportStream = PDFDataTransportStream;\n\nclass PDFDataTransportStreamReader {\n  constructor(stream, queuedChunks, progressiveDone = false, contentDispositionFilename = null) {\n    this._stream = stream;\n    this._done = progressiveDone || false;\n    this._filename = (0, _display_utils.isPdfFile)(contentDispositionFilename) ? contentDispositionFilename : null;\n    this._queuedChunks = queuedChunks || [];\n    this._loaded = 0;\n\n    for (const chunk of this._queuedChunks) {\n      this._loaded += chunk.byteLength;\n    }\n\n    this._requests = [];\n    this._headersReady = Promise.resolve();\n    stream._fullRequestReader = this;\n    this.onProgress = null;\n  }\n\n  _enqueue(chunk) {\n    if (this._done) {\n      return;\n    }\n\n    if (this._requests.length > 0) {\n      const requestCapability = this._requests.shift();\n\n      requestCapability.resolve({\n        value: chunk,\n        done: false\n      });\n    } else {\n      this._queuedChunks.push(chunk);\n    }\n\n    this._loaded += chunk.byteLength;\n  }\n\n  get headersReady() {\n    return this._headersReady;\n  }\n\n  get filename() {\n    return this._filename;\n  }\n\n  get isRangeSupported() {\n    return this._stream._isRangeSupported;\n  }\n\n  get isStreamingSupported() {\n    return this._stream._isStreamingSupported;\n  }\n\n  get contentLength() {\n    return this._stream._contentLength;\n  }\n\n  async read() {\n    if (this._queuedChunks.length > 0) {\n      const chunk = this._queuedChunks.shift();\n\n      return {\n        value: chunk,\n        done: false\n      };\n    }\n\n    if (this._done) {\n      return {\n        value: undefined,\n        done: true\n      };\n    }\n\n    const requestCapability = (0, _util.createPromiseCapability)();\n\n    this._requests.push(requestCapability);\n\n    return requestCapability.promise;\n  }\n\n  cancel(reason) {\n    this._done = true;\n\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.resolve({\n        value: undefined,\n        done: true\n      });\n    });\n\n    this._requests = [];\n  }\n\n  progressiveDone() {\n    if (this._done) {\n      return;\n    }\n\n    this._done = true;\n  }\n\n}\n\nclass PDFDataTransportStreamRangeReader {\n  constructor(stream, begin, end) {\n    this._stream = stream;\n    this._begin = begin;\n    this._end = end;\n    this._queuedChunk = null;\n    this._requests = [];\n    this._done = false;\n    this.onProgress = null;\n  }\n\n  _enqueue(chunk) {\n    if (this._done) {\n      return;\n    }\n\n    if (this._requests.length === 0) {\n      this._queuedChunk = chunk;\n    } else {\n      const requestsCapability = this._requests.shift();\n\n      requestsCapability.resolve({\n        value: chunk,\n        done: false\n      });\n\n      this._requests.forEach(function (requestCapability) {\n        requestCapability.resolve({\n          value: undefined,\n          done: true\n        });\n      });\n\n      this._requests = [];\n    }\n\n    this._done = true;\n\n    this._stream._removeRangeReader(this);\n  }\n\n  get isStreamingSupported() {\n    return false;\n  }\n\n  async read() {\n    if (this._queuedChunk) {\n      const chunk = this._queuedChunk;\n      this._queuedChunk = null;\n      return {\n        value: chunk,\n        done: false\n      };\n    }\n\n    if (this._done) {\n      return {\n        value: undefined,\n        done: true\n      };\n    }\n\n    const requestCapability = (0, _util.createPromiseCapability)();\n\n    this._requests.push(requestCapability);\n\n    return requestCapability.promise;\n  }\n\n  cancel(reason) {\n    this._done = true;\n\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.resolve({\n        value: undefined,\n        done: true\n      });\n    });\n\n    this._requests = [];\n\n    this._stream._removeRangeReader(this);\n  }\n\n}\n\n/***/ }),\n/* 17 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.WebGLContext = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nclass WebGLContext {\n  constructor({\n    enable = false\n  }) {\n    this._enabled = enable === true;\n  }\n\n  get isEnabled() {\n    let enabled = this._enabled;\n\n    if (enabled) {\n      enabled = WebGLUtils.tryInitGL();\n    }\n\n    return (0, _util.shadow)(this, \"isEnabled\", enabled);\n  }\n\n  composeSMask({\n    layer,\n    mask,\n    properties\n  }) {\n    return WebGLUtils.composeSMask(layer, mask, properties);\n  }\n\n  drawFigures({\n    width,\n    height,\n    backgroundColor,\n    figures,\n    context\n  }) {\n    return WebGLUtils.drawFigures(width, height, backgroundColor, figures, context);\n  }\n\n  clear() {\n    WebGLUtils.cleanup();\n  }\n\n}\n\nexports.WebGLContext = WebGLContext;\n\nconst WebGLUtils = function WebGLUtilsClosure() {\n  function loadShader(gl, code, shaderType) {\n    const shader = gl.createShader(shaderType);\n    gl.shaderSource(shader, code);\n    gl.compileShader(shader);\n    const compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\n    if (!compiled) {\n      const errorMsg = gl.getShaderInfoLog(shader);\n      throw new Error(\"Error during shader compilation: \" + errorMsg);\n    }\n\n    return shader;\n  }\n\n  function createVertexShader(gl, code) {\n    return loadShader(gl, code, gl.VERTEX_SHADER);\n  }\n\n  function createFragmentShader(gl, code) {\n    return loadShader(gl, code, gl.FRAGMENT_SHADER);\n  }\n\n  function createProgram(gl, shaders) {\n    const program = gl.createProgram();\n\n    for (let i = 0, ii = shaders.length; i < ii; ++i) {\n      gl.attachShader(program, shaders[i]);\n    }\n\n    gl.linkProgram(program);\n    const linked = gl.getProgramParameter(program, gl.LINK_STATUS);\n\n    if (!linked) {\n      const errorMsg = gl.getProgramInfoLog(program);\n      throw new Error(\"Error during program linking: \" + errorMsg);\n    }\n\n    return program;\n  }\n\n  function createTexture(gl, image, textureId) {\n    gl.activeTexture(textureId);\n    const texture = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n    return texture;\n  }\n\n  let currentGL, currentCanvas;\n\n  function generateGL() {\n    if (currentGL) {\n      return;\n    }\n\n    currentCanvas = document.createElement(\"canvas\");\n    currentGL = currentCanvas.getContext(\"webgl\", {\n      premultipliedalpha: false\n    });\n  }\n\n  const smaskVertexShaderCode = \"\\\n  attribute vec2 a_position;                                    \\\n  attribute vec2 a_texCoord;                                    \\\n                                                                \\\n  uniform vec2 u_resolution;                                    \\\n                                                                \\\n  varying vec2 v_texCoord;                                      \\\n                                                                \\\n  void main() {                                                 \\\n    vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0;   \\\n    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \\\n                                                                \\\n    v_texCoord = a_texCoord;                                    \\\n  }                                                             \";\n  const smaskFragmentShaderCode = \"\\\n  precision mediump float;                                      \\\n                                                                \\\n  uniform vec4 u_backdrop;                                      \\\n  uniform int u_subtype;                                        \\\n  uniform sampler2D u_image;                                    \\\n  uniform sampler2D u_mask;                                     \\\n                                                                \\\n  varying vec2 v_texCoord;                                      \\\n                                                                \\\n  void main() {                                                 \\\n    vec4 imageColor = texture2D(u_image, v_texCoord);           \\\n    vec4 maskColor = texture2D(u_mask, v_texCoord);             \\\n    if (u_backdrop.a > 0.0) {                                   \\\n      maskColor.rgb = maskColor.rgb * maskColor.a +             \\\n                      u_backdrop.rgb * (1.0 - maskColor.a);     \\\n    }                                                           \\\n    float lum;                                                  \\\n    if (u_subtype == 0) {                                       \\\n      lum = maskColor.a;                                        \\\n    } else {                                                    \\\n      lum = maskColor.r * 0.3 + maskColor.g * 0.59 +            \\\n            maskColor.b * 0.11;                                 \\\n    }                                                           \\\n    imageColor.a *= lum;                                        \\\n    imageColor.rgb *= imageColor.a;                             \\\n    gl_FragColor = imageColor;                                  \\\n  }                                                             \";\n  let smaskCache = null;\n\n  function initSmaskGL() {\n    generateGL();\n    const canvas = currentCanvas;\n    currentCanvas = null;\n    const gl = currentGL;\n    currentGL = null;\n    const vertexShader = createVertexShader(gl, smaskVertexShaderCode);\n    const fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode);\n    const program = createProgram(gl, [vertexShader, fragmentShader]);\n    gl.useProgram(program);\n    const cache = {};\n    cache.gl = gl;\n    cache.canvas = canvas;\n    cache.resolutionLocation = gl.getUniformLocation(program, \"u_resolution\");\n    cache.positionLocation = gl.getAttribLocation(program, \"a_position\");\n    cache.backdropLocation = gl.getUniformLocation(program, \"u_backdrop\");\n    cache.subtypeLocation = gl.getUniformLocation(program, \"u_subtype\");\n    const texCoordLocation = gl.getAttribLocation(program, \"a_texCoord\");\n    const texLayerLocation = gl.getUniformLocation(program, \"u_image\");\n    const texMaskLocation = gl.getUniformLocation(program, \"u_mask\");\n    const texCoordBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0]), gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(texCoordLocation);\n    gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);\n    gl.uniform1i(texLayerLocation, 0);\n    gl.uniform1i(texMaskLocation, 1);\n    smaskCache = cache;\n  }\n\n  function composeSMask(layer, mask, properties) {\n    const width = layer.width,\n          height = layer.height;\n\n    if (!smaskCache) {\n      initSmaskGL();\n    }\n\n    const cache = smaskCache,\n          canvas = cache.canvas,\n          gl = cache.gl;\n    canvas.width = width;\n    canvas.height = height;\n    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n    gl.uniform2f(cache.resolutionLocation, width, height);\n\n    if (properties.backdrop) {\n      gl.uniform4f(cache.resolutionLocation, properties.backdrop[0], properties.backdrop[1], properties.backdrop[2], 1);\n    } else {\n      gl.uniform4f(cache.resolutionLocation, 0, 0, 0, 0);\n    }\n\n    gl.uniform1i(cache.subtypeLocation, properties.subtype === \"Luminosity\" ? 1 : 0);\n    const texture = createTexture(gl, layer, gl.TEXTURE0);\n    const maskTexture = createTexture(gl, mask, gl.TEXTURE1);\n    const buffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 0, width, 0, 0, height, 0, height, width, 0, width, height]), gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(cache.positionLocation);\n    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);\n    gl.clearColor(0, 0, 0, 0);\n    gl.enable(gl.BLEND);\n    gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n    gl.clear(gl.COLOR_BUFFER_BIT);\n    gl.drawArrays(gl.TRIANGLES, 0, 6);\n    gl.flush();\n    gl.deleteTexture(texture);\n    gl.deleteTexture(maskTexture);\n    gl.deleteBuffer(buffer);\n    return canvas;\n  }\n\n  const figuresVertexShaderCode = \"\\\n  attribute vec2 a_position;                                    \\\n  attribute vec3 a_color;                                       \\\n                                                                \\\n  uniform vec2 u_resolution;                                    \\\n  uniform vec2 u_scale;                                         \\\n  uniform vec2 u_offset;                                        \\\n                                                                \\\n  varying vec4 v_color;                                         \\\n                                                                \\\n  void main() {                                                 \\\n    vec2 position = (a_position + u_offset) * u_scale;          \\\n    vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0;     \\\n    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \\\n                                                                \\\n    v_color = vec4(a_color / 255.0, 1.0);                       \\\n  }                                                             \";\n  const figuresFragmentShaderCode = \"\\\n  precision mediump float;                                      \\\n                                                                \\\n  varying vec4 v_color;                                         \\\n                                                                \\\n  void main() {                                                 \\\n    gl_FragColor = v_color;                                     \\\n  }                                                             \";\n  let figuresCache = null;\n\n  function initFiguresGL() {\n    generateGL();\n    const canvas = currentCanvas;\n    currentCanvas = null;\n    const gl = currentGL;\n    currentGL = null;\n    const vertexShader = createVertexShader(gl, figuresVertexShaderCode);\n    const fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode);\n    const program = createProgram(gl, [vertexShader, fragmentShader]);\n    gl.useProgram(program);\n    const cache = {};\n    cache.gl = gl;\n    cache.canvas = canvas;\n    cache.resolutionLocation = gl.getUniformLocation(program, \"u_resolution\");\n    cache.scaleLocation = gl.getUniformLocation(program, \"u_scale\");\n    cache.offsetLocation = gl.getUniformLocation(program, \"u_offset\");\n    cache.positionLocation = gl.getAttribLocation(program, \"a_position\");\n    cache.colorLocation = gl.getAttribLocation(program, \"a_color\");\n    figuresCache = cache;\n  }\n\n  function drawFigures(width, height, backgroundColor, figures, context) {\n    if (!figuresCache) {\n      initFiguresGL();\n    }\n\n    const cache = figuresCache,\n          canvas = cache.canvas,\n          gl = cache.gl;\n    canvas.width = width;\n    canvas.height = height;\n    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n    gl.uniform2f(cache.resolutionLocation, width, height);\n    let count = 0;\n\n    for (let i = 0, ii = figures.length; i < ii; i++) {\n      switch (figures[i].type) {\n        case \"lattice\":\n          const rows = figures[i].coords.length / figures[i].verticesPerRow | 0;\n          count += (rows - 1) * (figures[i].verticesPerRow - 1) * 6;\n          break;\n\n        case \"triangles\":\n          count += figures[i].coords.length;\n          break;\n      }\n    }\n\n    const coords = new Float32Array(count * 2);\n    const colors = new Uint8Array(count * 3);\n    const coordsMap = context.coords,\n          colorsMap = context.colors;\n    let pIndex = 0,\n        cIndex = 0;\n\n    for (let i = 0, ii = figures.length; i < ii; i++) {\n      const figure = figures[i],\n            ps = figure.coords,\n            cs = figure.colors;\n\n      switch (figure.type) {\n        case \"lattice\":\n          const cols = figure.verticesPerRow;\n          const rows = ps.length / cols | 0;\n\n          for (let row = 1; row < rows; row++) {\n            let offset = row * cols + 1;\n\n            for (let col = 1; col < cols; col++, offset++) {\n              coords[pIndex] = coordsMap[ps[offset - cols - 1]];\n              coords[pIndex + 1] = coordsMap[ps[offset - cols - 1] + 1];\n              coords[pIndex + 2] = coordsMap[ps[offset - cols]];\n              coords[pIndex + 3] = coordsMap[ps[offset - cols] + 1];\n              coords[pIndex + 4] = coordsMap[ps[offset - 1]];\n              coords[pIndex + 5] = coordsMap[ps[offset - 1] + 1];\n              colors[cIndex] = colorsMap[cs[offset - cols - 1]];\n              colors[cIndex + 1] = colorsMap[cs[offset - cols - 1] + 1];\n              colors[cIndex + 2] = colorsMap[cs[offset - cols - 1] + 2];\n              colors[cIndex + 3] = colorsMap[cs[offset - cols]];\n              colors[cIndex + 4] = colorsMap[cs[offset - cols] + 1];\n              colors[cIndex + 5] = colorsMap[cs[offset - cols] + 2];\n              colors[cIndex + 6] = colorsMap[cs[offset - 1]];\n              colors[cIndex + 7] = colorsMap[cs[offset - 1] + 1];\n              colors[cIndex + 8] = colorsMap[cs[offset - 1] + 2];\n              coords[pIndex + 6] = coords[pIndex + 2];\n              coords[pIndex + 7] = coords[pIndex + 3];\n              coords[pIndex + 8] = coords[pIndex + 4];\n              coords[pIndex + 9] = coords[pIndex + 5];\n              coords[pIndex + 10] = coordsMap[ps[offset]];\n              coords[pIndex + 11] = coordsMap[ps[offset] + 1];\n              colors[cIndex + 9] = colors[cIndex + 3];\n              colors[cIndex + 10] = colors[cIndex + 4];\n              colors[cIndex + 11] = colors[cIndex + 5];\n              colors[cIndex + 12] = colors[cIndex + 6];\n              colors[cIndex + 13] = colors[cIndex + 7];\n              colors[cIndex + 14] = colors[cIndex + 8];\n              colors[cIndex + 15] = colorsMap[cs[offset]];\n              colors[cIndex + 16] = colorsMap[cs[offset] + 1];\n              colors[cIndex + 17] = colorsMap[cs[offset] + 2];\n              pIndex += 12;\n              cIndex += 18;\n            }\n          }\n\n          break;\n\n        case \"triangles\":\n          for (let j = 0, jj = ps.length; j < jj; j++) {\n            coords[pIndex] = coordsMap[ps[j]];\n            coords[pIndex + 1] = coordsMap[ps[j] + 1];\n            colors[cIndex] = colorsMap[cs[j]];\n            colors[cIndex + 1] = colorsMap[cs[j] + 1];\n            colors[cIndex + 2] = colorsMap[cs[j] + 2];\n            pIndex += 2;\n            cIndex += 3;\n          }\n\n          break;\n      }\n    }\n\n    if (backgroundColor) {\n      gl.clearColor(backgroundColor[0] / 255, backgroundColor[1] / 255, backgroundColor[2] / 255, 1.0);\n    } else {\n      gl.clearColor(0, 0, 0, 0);\n    }\n\n    gl.clear(gl.COLOR_BUFFER_BIT);\n    const coordsBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, coordsBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, coords, gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(cache.positionLocation);\n    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);\n    const colorsBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, colorsBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(cache.colorLocation);\n    gl.vertexAttribPointer(cache.colorLocation, 3, gl.UNSIGNED_BYTE, false, 0, 0);\n    gl.uniform2f(cache.scaleLocation, context.scaleX, context.scaleY);\n    gl.uniform2f(cache.offsetLocation, context.offsetX, context.offsetY);\n    gl.drawArrays(gl.TRIANGLES, 0, count);\n    gl.flush();\n    gl.deleteBuffer(coordsBuffer);\n    gl.deleteBuffer(colorsBuffer);\n    return canvas;\n  }\n\n  return {\n    tryInitGL() {\n      try {\n        generateGL();\n        return !!currentGL;\n      } catch (ex) {}\n\n      return false;\n    },\n\n    composeSMask,\n    drawFigures,\n\n    cleanup() {\n      if (smaskCache?.canvas) {\n        smaskCache.canvas.width = 0;\n        smaskCache.canvas.height = 0;\n      }\n\n      if (figuresCache?.canvas) {\n        figuresCache.canvas.width = 0;\n        figuresCache.canvas.height = 0;\n      }\n\n      smaskCache = null;\n      figuresCache = null;\n    }\n\n  };\n}();\n\n/***/ }),\n/* 18 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.AnnotationLayer = void 0;\n\nvar _display_utils = __w_pdfjs_require__(1);\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _annotation_storage = __w_pdfjs_require__(8);\n\nvar _scripting_utils = __w_pdfjs_require__(19);\n\nclass AnnotationElementFactory {\n  static create(parameters) {\n    const subtype = parameters.data.annotationType;\n\n    switch (subtype) {\n      case _util.AnnotationType.LINK:\n        return new LinkAnnotationElement(parameters);\n\n      case _util.AnnotationType.TEXT:\n        return new TextAnnotationElement(parameters);\n\n      case _util.AnnotationType.WIDGET:\n        const fieldType = parameters.data.fieldType;\n\n        switch (fieldType) {\n          case \"Tx\":\n            return new TextWidgetAnnotationElement(parameters);\n\n          case \"Btn\":\n            if (parameters.data.radioButton) {\n              return new RadioButtonWidgetAnnotationElement(parameters);\n            } else if (parameters.data.checkBox) {\n              return new CheckboxWidgetAnnotationElement(parameters);\n            }\n\n            return new PushButtonWidgetAnnotationElement(parameters);\n\n          case \"Ch\":\n            return new ChoiceWidgetAnnotationElement(parameters);\n        }\n\n        return new WidgetAnnotationElement(parameters);\n\n      case _util.AnnotationType.POPUP:\n        return new PopupAnnotationElement(parameters);\n\n      case _util.AnnotationType.FREETEXT:\n        return new FreeTextAnnotationElement(parameters);\n\n      case _util.AnnotationType.LINE:\n        return new LineAnnotationElement(parameters);\n\n      case _util.AnnotationType.SQUARE:\n        return new SquareAnnotationElement(parameters);\n\n      case _util.AnnotationType.CIRCLE:\n        return new CircleAnnotationElement(parameters);\n\n      case _util.AnnotationType.POLYLINE:\n        return new PolylineAnnotationElement(parameters);\n\n      case _util.AnnotationType.CARET:\n        return new CaretAnnotationElement(parameters);\n\n      case _util.AnnotationType.INK:\n        return new InkAnnotationElement(parameters);\n\n      case _util.AnnotationType.POLYGON:\n        return new PolygonAnnotationElement(parameters);\n\n      case _util.AnnotationType.HIGHLIGHT:\n        return new HighlightAnnotationElement(parameters);\n\n      case _util.AnnotationType.UNDERLINE:\n        return new UnderlineAnnotationElement(parameters);\n\n      case _util.AnnotationType.SQUIGGLY:\n        return new SquigglyAnnotationElement(parameters);\n\n      case _util.AnnotationType.STRIKEOUT:\n        return new StrikeOutAnnotationElement(parameters);\n\n      case _util.AnnotationType.STAMP:\n        return new StampAnnotationElement(parameters);\n\n      case _util.AnnotationType.FILEATTACHMENT:\n        return new FileAttachmentAnnotationElement(parameters);\n\n      default:\n        return new AnnotationElement(parameters);\n    }\n  }\n\n}\n\nclass AnnotationElement {\n  constructor(parameters, {\n    isRenderable = false,\n    ignoreBorder = false,\n    createQuadrilaterals = false\n  } = {}) {\n    this.isRenderable = isRenderable;\n    this.data = parameters.data;\n    this.layer = parameters.layer;\n    this.page = parameters.page;\n    this.viewport = parameters.viewport;\n    this.linkService = parameters.linkService;\n    this.downloadManager = parameters.downloadManager;\n    this.imageResourcesPath = parameters.imageResourcesPath;\n    this.renderInteractiveForms = parameters.renderInteractiveForms;\n    this.svgFactory = parameters.svgFactory;\n    this.annotationStorage = parameters.annotationStorage;\n    this.enableScripting = parameters.enableScripting;\n    this.hasJSActions = parameters.hasJSActions;\n    this._mouseState = parameters.mouseState;\n\n    if (isRenderable) {\n      this.container = this._createContainer(ignoreBorder);\n    }\n\n    if (createQuadrilaterals) {\n      this.quadrilaterals = this._createQuadrilaterals(ignoreBorder);\n    }\n  }\n\n  _createContainer(ignoreBorder = false) {\n    const data = this.data,\n          page = this.page,\n          viewport = this.viewport;\n    const container = document.createElement(\"section\");\n    let width = data.rect[2] - data.rect[0];\n    let height = data.rect[3] - data.rect[1];\n    container.setAttribute(\"data-annotation-id\", data.id);\n\n    const rect = _util.Util.normalizeRect([data.rect[0], page.view[3] - data.rect[1] + page.view[1], data.rect[2], page.view[3] - data.rect[3] + page.view[1]]);\n\n    container.style.transform = `matrix(${viewport.transform.join(\",\")})`;\n    container.style.transformOrigin = `${-rect[0]}px ${-rect[1]}px`;\n\n    if (!ignoreBorder && data.borderStyle.width > 0) {\n      container.style.borderWidth = `${data.borderStyle.width}px`;\n\n      if (data.borderStyle.style !== _util.AnnotationBorderStyleType.UNDERLINE) {\n        width = width - 2 * data.borderStyle.width;\n        height = height - 2 * data.borderStyle.width;\n      }\n\n      const horizontalRadius = data.borderStyle.horizontalCornerRadius;\n      const verticalRadius = data.borderStyle.verticalCornerRadius;\n\n      if (horizontalRadius > 0 || verticalRadius > 0) {\n        const radius = `${horizontalRadius}px / ${verticalRadius}px`;\n        container.style.borderRadius = radius;\n      }\n\n      switch (data.borderStyle.style) {\n        case _util.AnnotationBorderStyleType.SOLID:\n          container.style.borderStyle = \"solid\";\n          break;\n\n        case _util.AnnotationBorderStyleType.DASHED:\n          container.style.borderStyle = \"dashed\";\n          break;\n\n        case _util.AnnotationBorderStyleType.BEVELED:\n          (0, _util.warn)(\"Unimplemented border style: beveled\");\n          break;\n\n        case _util.AnnotationBorderStyleType.INSET:\n          (0, _util.warn)(\"Unimplemented border style: inset\");\n          break;\n\n        case _util.AnnotationBorderStyleType.UNDERLINE:\n          container.style.borderBottomStyle = \"solid\";\n          break;\n\n        default:\n          break;\n      }\n\n      if (data.color) {\n        container.style.borderColor = _util.Util.makeHexColor(data.color[0] | 0, data.color[1] | 0, data.color[2] | 0);\n      } else {\n        container.style.borderWidth = 0;\n      }\n    }\n\n    container.style.left = `${rect[0]}px`;\n    container.style.top = `${rect[1]}px`;\n    container.style.width = `${width}px`;\n    container.style.height = `${height}px`;\n    return container;\n  }\n\n  _createQuadrilaterals(ignoreBorder = false) {\n    if (!this.data.quadPoints) {\n      return null;\n    }\n\n    const quadrilaterals = [];\n    const savedRect = this.data.rect;\n\n    for (const quadPoint of this.data.quadPoints) {\n      this.data.rect = [quadPoint[2].x, quadPoint[2].y, quadPoint[1].x, quadPoint[1].y];\n      quadrilaterals.push(this._createContainer(ignoreBorder));\n    }\n\n    this.data.rect = savedRect;\n    return quadrilaterals;\n  }\n\n  _createPopup(trigger, data) {\n    let container = this.container;\n\n    if (this.quadrilaterals) {\n      trigger = trigger || this.quadrilaterals;\n      container = this.quadrilaterals[0];\n    }\n\n    if (!trigger) {\n      trigger = document.createElement(\"div\");\n      trigger.style.height = container.style.height;\n      trigger.style.width = container.style.width;\n      container.appendChild(trigger);\n    }\n\n    const popupElement = new PopupElement({\n      container,\n      trigger,\n      color: data.color,\n      title: data.title,\n      modificationDate: data.modificationDate,\n      contents: data.contents,\n      hideWrapper: true\n    });\n    const popup = popupElement.render();\n    popup.style.left = container.style.width;\n    container.appendChild(popup);\n  }\n\n  _renderQuadrilaterals(className) {\n    this.quadrilaterals.forEach(quadrilateral => {\n      quadrilateral.className = className;\n    });\n    return this.quadrilaterals;\n  }\n\n  render() {\n    (0, _util.unreachable)(\"Abstract method `AnnotationElement.render` called\");\n  }\n\n}\n\nclass LinkAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    const isRenderable = !!(parameters.data.url || parameters.data.dest || parameters.data.action || parameters.data.isTooltipOnly || parameters.data.actions && (parameters.data.actions.Action || parameters.data.actions[\"Mouse Up\"] || parameters.data.actions[\"Mouse Down\"]));\n    super(parameters, {\n      isRenderable,\n      createQuadrilaterals: true\n    });\n  }\n\n  render() {\n    const {\n      data,\n      linkService\n    } = this;\n    const link = document.createElement(\"a\");\n\n    if (data.url) {\n      (0, _display_utils.addLinkAttributes)(link, {\n        url: data.url,\n        target: data.newWindow ? _display_utils.LinkTarget.BLANK : linkService.externalLinkTarget,\n        rel: linkService.externalLinkRel,\n        enabled: linkService.externalLinkEnabled\n      });\n    } else if (data.action) {\n      this._bindNamedAction(link, data.action);\n    } else if (data.dest) {\n      this._bindLink(link, data.dest);\n    } else if (data.actions && (data.actions.Action || data.actions[\"Mouse Up\"] || data.actions[\"Mouse Down\"]) && this.enableScripting && this.hasJSActions) {\n      this._bindJSAction(link, data);\n    } else {\n      this._bindLink(link, \"\");\n    }\n\n    if (this.quadrilaterals) {\n      return this._renderQuadrilaterals(\"linkAnnotation\").map((quadrilateral, index) => {\n        const linkElement = index === 0 ? link : link.cloneNode();\n        quadrilateral.appendChild(linkElement);\n        return quadrilateral;\n      });\n    }\n\n    this.container.className = \"linkAnnotation\";\n    this.container.appendChild(link);\n    return this.container;\n  }\n\n  _bindLink(link, destination) {\n    link.href = this.linkService.getDestinationHash(destination);\n\n    link.onclick = () => {\n      if (destination) {\n        this.linkService.goToDestination(destination);\n      }\n\n      return false;\n    };\n\n    if (destination || destination === \"\") {\n      link.className = \"internalLink\";\n    }\n  }\n\n  _bindNamedAction(link, action) {\n    link.href = this.linkService.getAnchorUrl(\"\");\n\n    link.onclick = () => {\n      this.linkService.executeNamedAction(action);\n      return false;\n    };\n\n    link.className = \"internalLink\";\n  }\n\n  _bindJSAction(link, data) {\n    link.href = this.linkService.getAnchorUrl(\"\");\n    const map = new Map([[\"Action\", \"onclick\"], [\"Mouse Up\", \"onmouseup\"], [\"Mouse Down\", \"onmousedown\"]]);\n\n    for (const name of Object.keys(data.actions)) {\n      const jsName = map.get(name);\n\n      if (!jsName) {\n        continue;\n      }\n\n      link[jsName] = () => {\n        this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n          source: this,\n          detail: {\n            id: data.id,\n            name\n          }\n        });\n        return false;\n      };\n    }\n\n    link.className = \"internalLink\";\n  }\n\n}\n\nclass TextAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    super(parameters, {\n      isRenderable\n    });\n  }\n\n  render() {\n    this.container.className = \"textAnnotation\";\n    const image = document.createElement(\"img\");\n    image.style.height = this.container.style.height;\n    image.style.width = this.container.style.width;\n    image.src = this.imageResourcesPath + \"annotation-\" + this.data.name.toLowerCase() + \".svg\";\n    image.alt = \"[{{type}} Annotation]\";\n    image.dataset.l10nId = \"text_annotation_type\";\n    image.dataset.l10nArgs = JSON.stringify({\n      type: this.data.name\n    });\n\n    if (!this.data.hasPopup) {\n      this._createPopup(image, this.data);\n    }\n\n    this.container.appendChild(image);\n    return this.container;\n  }\n\n}\n\nclass WidgetAnnotationElement extends AnnotationElement {\n  render() {\n    if (this.data.alternativeText) {\n      this.container.title = this.data.alternativeText;\n    }\n\n    return this.container;\n  }\n\n  _getKeyModifier(event) {\n    return navigator.platform.includes(\"Win\") && event.ctrlKey || navigator.platform.includes(\"Mac\") && event.metaKey;\n  }\n\n  _setEventListener(element, baseName, eventName, valueGetter) {\n    if (baseName.includes(\"mouse\")) {\n      element.addEventListener(baseName, event => {\n        this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n          source: this,\n          detail: {\n            id: this.data.id,\n            name: eventName,\n            value: valueGetter(event),\n            shift: event.shiftKey,\n            modifier: this._getKeyModifier(event)\n          }\n        });\n      });\n    } else {\n      element.addEventListener(baseName, event => {\n        this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n          source: this,\n          detail: {\n            id: this.data.id,\n            name: eventName,\n            value: event.target.checked\n          }\n        });\n      });\n    }\n  }\n\n  _setEventListeners(element, names, getter) {\n    for (const [baseName, eventName] of names) {\n      if (eventName === \"Action\" || this.data.actions?.[eventName]) {\n        this._setEventListener(element, baseName, eventName, getter);\n      }\n    }\n  }\n\n  _setColor(event) {\n    const {\n      detail,\n      target\n    } = event;\n    const {\n      style\n    } = target;\n\n    for (const name of [\"bgColor\", \"fillColor\", \"fgColor\", \"textColor\", \"borderColor\", \"strokeColor\"]) {\n      let color = detail[name];\n\n      if (!color) {\n        continue;\n      }\n\n      color = _scripting_utils.ColorConverters[`${color[0]}_HTML`](color.slice(1));\n\n      switch (name) {\n        case \"bgColor\":\n        case \"fillColor\":\n          style.backgroundColor = color;\n          break;\n\n        case \"fgColor\":\n        case \"textColor\":\n          style.color = color;\n          break;\n\n        case \"borderColor\":\n        case \"strokeColor\":\n          style.borderColor = color;\n          break;\n      }\n    }\n  }\n\n}\n\nclass TextWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    const isRenderable = parameters.renderInteractiveForms || !parameters.data.hasAppearance && !!parameters.data.fieldValue;\n    super(parameters, {\n      isRenderable\n    });\n  }\n\n  render() {\n    const storage = this.annotationStorage;\n    const id = this.data.id;\n    this.container.className = \"textWidgetAnnotation\";\n    let element = null;\n\n    if (this.renderInteractiveForms) {\n      const storedData = storage.getValue(id, {\n        value: this.data.fieldValue,\n        valueAsString: this.data.fieldValue\n      });\n      const textContent = storedData.valueAsString || storedData.value || \"\";\n      const elementData = {\n        userValue: null,\n        formattedValue: null,\n        beforeInputSelectionRange: null,\n        beforeInputValue: null\n      };\n\n      if (this.data.multiLine) {\n        element = document.createElement(\"textarea\");\n        element.textContent = textContent;\n      } else {\n        element = document.createElement(\"input\");\n        element.type = \"text\";\n        element.setAttribute(\"value\", textContent);\n      }\n\n      elementData.userValue = textContent;\n      element.setAttribute(\"id\", id);\n      element.addEventListener(\"input\", function (event) {\n        storage.setValue(id, {\n          value: event.target.value\n        });\n      });\n\n      let blurListener = event => {\n        if (elementData.formattedValue) {\n          event.target.value = elementData.formattedValue;\n        }\n\n        event.target.setSelectionRange(0, 0);\n        elementData.beforeInputSelectionRange = null;\n      };\n\n      if (this.enableScripting && this.hasJSActions) {\n        element.addEventListener(\"focus\", event => {\n          if (elementData.userValue) {\n            event.target.value = elementData.userValue;\n          }\n        });\n        element.addEventListener(\"updatefromsandbox\", event => {\n          const {\n            detail\n          } = event;\n          const actions = {\n            value() {\n              elementData.userValue = detail.value || \"\";\n              storage.setValue(id, {\n                value: elementData.userValue.toString()\n              });\n\n              if (!elementData.formattedValue) {\n                event.target.value = elementData.userValue;\n              }\n            },\n\n            valueAsString() {\n              elementData.formattedValue = detail.valueAsString || \"\";\n\n              if (event.target !== document.activeElement) {\n                event.target.value = elementData.formattedValue;\n              }\n\n              storage.setValue(id, {\n                formattedValue: elementData.formattedValue\n              });\n            },\n\n            focus() {\n              setTimeout(() => event.target.focus({\n                preventScroll: false\n              }), 0);\n            },\n\n            userName() {\n              event.target.title = detail.userName;\n            },\n\n            hidden() {\n              event.target.style.visibility = detail.hidden ? \"hidden\" : \"visible\";\n              storage.setValue(id, {\n                hidden: detail.hidden\n              });\n            },\n\n            editable() {\n              event.target.disabled = !detail.editable;\n            },\n\n            selRange() {\n              const [selStart, selEnd] = detail.selRange;\n\n              if (selStart >= 0 && selEnd < event.target.value.length) {\n                event.target.setSelectionRange(selStart, selEnd);\n              }\n            }\n\n          };\n          Object.keys(detail).filter(name => name in actions).forEach(name => actions[name]());\n\n          this._setColor(event);\n        });\n        element.addEventListener(\"keydown\", event => {\n          elementData.beforeInputValue = event.target.value;\n          let commitKey = -1;\n\n          if (event.key === \"Escape\") {\n            commitKey = 0;\n          } else if (event.key === \"Enter\") {\n            commitKey = 2;\n          } else if (event.key === \"Tab\") {\n            commitKey = 3;\n          }\n\n          if (commitKey === -1) {\n            return;\n          }\n\n          elementData.userValue = event.target.value;\n          this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n            source: this,\n            detail: {\n              id,\n              name: \"Keystroke\",\n              value: event.target.value,\n              willCommit: true,\n              commitKey,\n              selStart: event.target.selectionStart,\n              selEnd: event.target.selectionEnd\n            }\n          });\n        });\n        const _blurListener = blurListener;\n        blurListener = null;\n        element.addEventListener(\"blur\", event => {\n          if (this._mouseState.isDown) {\n            elementData.userValue = event.target.value;\n            this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n              source: this,\n              detail: {\n                id,\n                name: \"Keystroke\",\n                value: event.target.value,\n                willCommit: true,\n                commitKey: 1,\n                selStart: event.target.selectionStart,\n                selEnd: event.target.selectionEnd\n              }\n            });\n          }\n\n          _blurListener(event);\n        });\n        element.addEventListener(\"mousedown\", event => {\n          elementData.beforeInputValue = event.target.value;\n          elementData.beforeInputSelectionRange = null;\n        });\n        element.addEventListener(\"keyup\", event => {\n          if (event.target.selectionStart === event.target.selectionEnd) {\n            elementData.beforeInputSelectionRange = null;\n          }\n        });\n        element.addEventListener(\"select\", event => {\n          elementData.beforeInputSelectionRange = [event.target.selectionStart, event.target.selectionEnd];\n        });\n\n        if (this.data.actions?.Keystroke) {\n          element.addEventListener(\"input\", event => {\n            let selStart = -1;\n            let selEnd = -1;\n\n            if (elementData.beforeInputSelectionRange) {\n              [selStart, selEnd] = elementData.beforeInputSelectionRange;\n            }\n\n            this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n              source: this,\n              detail: {\n                id,\n                name: \"Keystroke\",\n                value: elementData.beforeInputValue,\n                change: event.data,\n                willCommit: false,\n                selStart,\n                selEnd\n              }\n            });\n          });\n        }\n\n        this._setEventListeners(element, [[\"focus\", \"Focus\"], [\"blur\", \"Blur\"], [\"mousedown\", \"Mouse Down\"], [\"mouseenter\", \"Mouse Enter\"], [\"mouseleave\", \"Mouse Exit\"], [\"mouseup\", \"Mouse Up\"]], event => event.target.value);\n      }\n\n      if (blurListener) {\n        element.addEventListener(\"blur\", blurListener);\n      }\n\n      element.disabled = this.data.readOnly;\n      element.name = this.data.fieldName;\n\n      if (this.data.maxLen !== null) {\n        element.maxLength = this.data.maxLen;\n      }\n\n      if (this.data.comb) {\n        const fieldWidth = this.data.rect[2] - this.data.rect[0];\n        const combWidth = fieldWidth / this.data.maxLen;\n        element.classList.add(\"comb\");\n        element.style.letterSpacing = `calc(${combWidth}px - 1ch)`;\n      }\n    } else {\n      element = document.createElement(\"div\");\n      element.textContent = this.data.fieldValue;\n      element.style.verticalAlign = \"middle\";\n      element.style.display = \"table-cell\";\n    }\n\n    this._setTextStyle(element);\n\n    this.container.appendChild(element);\n    return this.container;\n  }\n\n  _setTextStyle(element) {\n    const TEXT_ALIGNMENT = [\"left\", \"center\", \"right\"];\n    const {\n      fontSize,\n      fontColor\n    } = this.data.defaultAppearanceData;\n    const style = element.style;\n\n    if (fontSize) {\n      style.fontSize = `${fontSize}px`;\n    }\n\n    style.color = _util.Util.makeHexColor(fontColor[0], fontColor[1], fontColor[2]);\n\n    if (this.data.textAlignment !== null) {\n      style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment];\n    }\n  }\n\n}\n\nclass CheckboxWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: parameters.renderInteractiveForms\n    });\n  }\n\n  render() {\n    const storage = this.annotationStorage;\n    const data = this.data;\n    const id = data.id;\n    const value = storage.getValue(id, {\n      value: data.fieldValue && (data.exportValue && data.exportValue === data.fieldValue || !data.exportValue && data.fieldValue !== \"Off\")\n    }).value;\n    this.container.className = \"buttonWidgetAnnotation checkBox\";\n    const element = document.createElement(\"input\");\n    element.disabled = data.readOnly;\n    element.type = \"checkbox\";\n    element.name = this.data.fieldName;\n\n    if (value) {\n      element.setAttribute(\"checked\", true);\n    }\n\n    element.setAttribute(\"id\", id);\n    element.addEventListener(\"change\", function (event) {\n      const name = event.target.name;\n\n      for (const checkbox of document.getElementsByName(name)) {\n        if (checkbox !== event.target) {\n          checkbox.checked = false;\n          storage.setValue(checkbox.parentNode.getAttribute(\"data-annotation-id\"), {\n            value: false\n          });\n        }\n      }\n\n      storage.setValue(id, {\n        value: event.target.checked\n      });\n    });\n\n    if (this.enableScripting && this.hasJSActions) {\n      element.addEventListener(\"updatefromsandbox\", event => {\n        const {\n          detail\n        } = event;\n        const actions = {\n          value() {\n            event.target.checked = detail.value !== \"Off\";\n            storage.setValue(id, {\n              value: event.target.checked\n            });\n          },\n\n          focus() {\n            setTimeout(() => event.target.focus({\n              preventScroll: false\n            }), 0);\n          },\n\n          hidden() {\n            event.target.style.visibility = detail.hidden ? \"hidden\" : \"visible\";\n            storage.setValue(id, {\n              hidden: detail.hidden\n            });\n          },\n\n          editable() {\n            event.target.disabled = !detail.editable;\n          }\n\n        };\n        Object.keys(detail).filter(name => name in actions).forEach(name => actions[name]());\n\n        this._setColor(event);\n      });\n\n      this._setEventListeners(element, [[\"change\", \"Validate\"], [\"change\", \"Action\"], [\"focus\", \"Focus\"], [\"blur\", \"Blur\"], [\"mousedown\", \"Mouse Down\"], [\"mouseenter\", \"Mouse Enter\"], [\"mouseleave\", \"Mouse Exit\"], [\"mouseup\", \"Mouse Up\"]], event => event.target.checked);\n    }\n\n    this.container.appendChild(element);\n    return this.container;\n  }\n\n}\n\nclass RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: parameters.renderInteractiveForms\n    });\n  }\n\n  render() {\n    this.container.className = \"buttonWidgetAnnotation radioButton\";\n    const storage = this.annotationStorage;\n    const data = this.data;\n    const id = data.id;\n    const value = storage.getValue(id, {\n      value: data.fieldValue === data.buttonValue\n    }).value;\n    const element = document.createElement(\"input\");\n    element.disabled = data.readOnly;\n    element.type = \"radio\";\n    element.name = data.fieldName;\n\n    if (value) {\n      element.setAttribute(\"checked\", true);\n    }\n\n    element.setAttribute(\"id\", id);\n    element.addEventListener(\"change\", function (event) {\n      const {\n        target\n      } = event;\n\n      for (const radio of document.getElementsByName(target.name)) {\n        if (radio !== target) {\n          storage.setValue(radio.getAttribute(\"id\"), {\n            value: false\n          });\n        }\n      }\n\n      storage.setValue(id, {\n        value: target.checked\n      });\n    });\n\n    if (this.enableScripting && this.hasJSActions) {\n      const pdfButtonValue = data.buttonValue;\n      element.addEventListener(\"updatefromsandbox\", event => {\n        const {\n          detail\n        } = event;\n        const actions = {\n          value() {\n            const checked = pdfButtonValue === detail.value;\n\n            for (const radio of document.getElementsByName(event.target.name)) {\n              const radioId = radio.getAttribute(\"id\");\n              radio.checked = radioId === id && checked;\n              storage.setValue(radioId, {\n                value: radio.checked\n              });\n            }\n          },\n\n          focus() {\n            setTimeout(() => event.target.focus({\n              preventScroll: false\n            }), 0);\n          },\n\n          hidden() {\n            event.target.style.visibility = detail.hidden ? \"hidden\" : \"visible\";\n            storage.setValue(id, {\n              hidden: detail.hidden\n            });\n          },\n\n          editable() {\n            event.target.disabled = !detail.editable;\n          }\n\n        };\n        Object.keys(detail).filter(name => name in actions).forEach(name => actions[name]());\n\n        this._setColor(event);\n      });\n\n      this._setEventListeners(element, [[\"change\", \"Validate\"], [\"change\", \"Action\"], [\"focus\", \"Focus\"], [\"blur\", \"Blur\"], [\"mousedown\", \"Mouse Down\"], [\"mouseenter\", \"Mouse Enter\"], [\"mouseleave\", \"Mouse Exit\"], [\"mouseup\", \"Mouse Up\"]], event => event.target.checked);\n    }\n\n    this.container.appendChild(element);\n    return this.container;\n  }\n\n}\n\nclass PushButtonWidgetAnnotationElement extends LinkAnnotationElement {\n  render() {\n    const container = super.render();\n    container.className = \"buttonWidgetAnnotation pushButton\";\n\n    if (this.data.alternativeText) {\n      container.title = this.data.alternativeText;\n    }\n\n    return container;\n  }\n\n}\n\nclass ChoiceWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: parameters.renderInteractiveForms\n    });\n  }\n\n  render() {\n    this.container.className = \"choiceWidgetAnnotation\";\n    const storage = this.annotationStorage;\n    const id = this.data.id;\n    storage.getValue(id, {\n      value: this.data.fieldValue.length > 0 ? this.data.fieldValue[0] : undefined\n    });\n    const selectElement = document.createElement(\"select\");\n    selectElement.disabled = this.data.readOnly;\n    selectElement.name = this.data.fieldName;\n    selectElement.setAttribute(\"id\", id);\n\n    if (!this.data.combo) {\n      selectElement.size = this.data.options.length;\n\n      if (this.data.multiSelect) {\n        selectElement.multiple = true;\n      }\n    }\n\n    for (const option of this.data.options) {\n      const optionElement = document.createElement(\"option\");\n      optionElement.textContent = option.displayValue;\n      optionElement.value = option.exportValue;\n\n      if (this.data.fieldValue.includes(option.exportValue)) {\n        optionElement.setAttribute(\"selected\", true);\n      }\n\n      selectElement.appendChild(optionElement);\n    }\n\n    const getValue = (event, isExport) => {\n      const name = isExport ? \"value\" : \"textContent\";\n      const options = event.target.options;\n\n      if (!event.target.multiple) {\n        return options.selectedIndex === -1 ? null : options[options.selectedIndex][name];\n      }\n\n      return Array.prototype.filter.call(options, option => option.selected).map(option => option[name]);\n    };\n\n    const getItems = event => {\n      const options = event.target.options;\n      return Array.prototype.map.call(options, option => {\n        return {\n          displayValue: option.textContent,\n          exportValue: option.value\n        };\n      });\n    };\n\n    if (this.enableScripting && this.hasJSActions) {\n      selectElement.addEventListener(\"updatefromsandbox\", event => {\n        const {\n          detail\n        } = event;\n        const actions = {\n          value() {\n            const options = selectElement.options;\n            const value = detail.value;\n            const values = new Set(Array.isArray(value) ? value : [value]);\n            Array.prototype.forEach.call(options, option => {\n              option.selected = values.has(option.value);\n            });\n            storage.setValue(id, {\n              value: getValue(event, true)\n            });\n          },\n\n          multipleSelection() {\n            selectElement.multiple = true;\n          },\n\n          remove() {\n            const options = selectElement.options;\n            const index = detail.remove;\n            options[index].selected = false;\n            selectElement.remove(index);\n\n            if (options.length > 0) {\n              const i = Array.prototype.findIndex.call(options, option => option.selected);\n\n              if (i === -1) {\n                options[0].selected = true;\n              }\n            }\n\n            storage.setValue(id, {\n              value: getValue(event, true),\n              items: getItems(event)\n            });\n          },\n\n          clear() {\n            while (selectElement.length !== 0) {\n              selectElement.remove(0);\n            }\n\n            storage.setValue(id, {\n              value: null,\n              items: []\n            });\n          },\n\n          insert() {\n            const {\n              index,\n              displayValue,\n              exportValue\n            } = detail.insert;\n            const optionElement = document.createElement(\"option\");\n            optionElement.textContent = displayValue;\n            optionElement.value = exportValue;\n            selectElement.insertBefore(optionElement, selectElement.children[index]);\n            storage.setValue(id, {\n              value: getValue(event, true),\n              items: getItems(event)\n            });\n          },\n\n          items() {\n            const {\n              items\n            } = detail;\n\n            while (selectElement.length !== 0) {\n              selectElement.remove(0);\n            }\n\n            for (const item of items) {\n              const {\n                displayValue,\n                exportValue\n              } = item;\n              const optionElement = document.createElement(\"option\");\n              optionElement.textContent = displayValue;\n              optionElement.value = exportValue;\n              selectElement.appendChild(optionElement);\n            }\n\n            if (selectElement.options.length > 0) {\n              selectElement.options[0].selected = true;\n            }\n\n            storage.setValue(id, {\n              value: getValue(event, true),\n              items: getItems(event)\n            });\n          },\n\n          indices() {\n            const indices = new Set(detail.indices);\n            const options = event.target.options;\n            Array.prototype.forEach.call(options, (option, i) => {\n              option.selected = indices.has(i);\n            });\n            storage.setValue(id, {\n              value: getValue(event, true)\n            });\n          },\n\n          focus() {\n            setTimeout(() => event.target.focus({\n              preventScroll: false\n            }), 0);\n          },\n\n          hidden() {\n            event.target.style.visibility = detail.hidden ? \"hidden\" : \"visible\";\n            storage.setValue(id, {\n              hidden: detail.hidden\n            });\n          },\n\n          editable() {\n            event.target.disabled = !detail.editable;\n          }\n\n        };\n        Object.keys(detail).filter(name => name in actions).forEach(name => actions[name]());\n\n        this._setColor(event);\n      });\n      selectElement.addEventListener(\"input\", event => {\n        const exportValue = getValue(event, true);\n        const value = getValue(event, false);\n        storage.setValue(id, {\n          value: exportValue\n        });\n        this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n          source: this,\n          detail: {\n            id,\n            name: \"Keystroke\",\n            value,\n            changeEx: exportValue,\n            willCommit: true,\n            commitKey: 1,\n            keyDown: false\n          }\n        });\n      });\n\n      this._setEventListeners(selectElement, [[\"focus\", \"Focus\"], [\"blur\", \"Blur\"], [\"mousedown\", \"Mouse Down\"], [\"mouseenter\", \"Mouse Enter\"], [\"mouseleave\", \"Mouse Exit\"], [\"mouseup\", \"Mouse Up\"], [\"input\", \"Action\"]], event => event.target.checked);\n    } else {\n      selectElement.addEventListener(\"input\", function (event) {\n        storage.setValue(id, {\n          value: getValue(event)\n        });\n      });\n    }\n\n    this.container.appendChild(selectElement);\n    return this.container;\n  }\n\n}\n\nclass PopupAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    const isRenderable = !!(parameters.data.title || parameters.data.contents);\n    super(parameters, {\n      isRenderable\n    });\n  }\n\n  render() {\n    const IGNORE_TYPES = [\"Line\", \"Square\", \"Circle\", \"PolyLine\", \"Polygon\", \"Ink\"];\n    this.container.className = \"popupAnnotation\";\n\n    if (IGNORE_TYPES.includes(this.data.parentType)) {\n      return this.container;\n    }\n\n    const selector = `[data-annotation-id=\"${this.data.parentId}\"]`;\n    const parentElements = this.layer.querySelectorAll(selector);\n\n    if (parentElements.length === 0) {\n      return this.container;\n    }\n\n    const popup = new PopupElement({\n      container: this.container,\n      trigger: Array.from(parentElements),\n      color: this.data.color,\n      title: this.data.title,\n      modificationDate: this.data.modificationDate,\n      contents: this.data.contents\n    });\n    const page = this.page;\n\n    const rect = _util.Util.normalizeRect([this.data.parentRect[0], page.view[3] - this.data.parentRect[1] + page.view[1], this.data.parentRect[2], page.view[3] - this.data.parentRect[3] + page.view[1]]);\n\n    const popupLeft = rect[0] + this.data.parentRect[2] - this.data.parentRect[0];\n    const popupTop = rect[1];\n    this.container.style.transformOrigin = `${-popupLeft}px ${-popupTop}px`;\n    this.container.style.left = `${popupLeft}px`;\n    this.container.style.top = `${popupTop}px`;\n    this.container.appendChild(popup.render());\n    return this.container;\n  }\n\n}\n\nclass PopupElement {\n  constructor(parameters) {\n    this.container = parameters.container;\n    this.trigger = parameters.trigger;\n    this.color = parameters.color;\n    this.title = parameters.title;\n    this.modificationDate = parameters.modificationDate;\n    this.contents = parameters.contents;\n    this.hideWrapper = parameters.hideWrapper || false;\n    this.pinned = false;\n  }\n\n  render() {\n    const BACKGROUND_ENLIGHT = 0.7;\n    const wrapper = document.createElement(\"div\");\n    wrapper.className = \"popupWrapper\";\n    this.hideElement = this.hideWrapper ? wrapper : this.container;\n    this.hideElement.hidden = true;\n    const popup = document.createElement(\"div\");\n    popup.className = \"popup\";\n    const color = this.color;\n\n    if (color) {\n      const r = BACKGROUND_ENLIGHT * (255 - color[0]) + color[0];\n      const g = BACKGROUND_ENLIGHT * (255 - color[1]) + color[1];\n      const b = BACKGROUND_ENLIGHT * (255 - color[2]) + color[2];\n      popup.style.backgroundColor = _util.Util.makeHexColor(r | 0, g | 0, b | 0);\n    }\n\n    const title = document.createElement(\"h1\");\n    title.textContent = this.title;\n    popup.appendChild(title);\n\n    const dateObject = _display_utils.PDFDateString.toDateObject(this.modificationDate);\n\n    if (dateObject) {\n      const modificationDate = document.createElement(\"span\");\n      modificationDate.textContent = \"{{date}}, {{time}}\";\n      modificationDate.dataset.l10nId = \"annotation_date_string\";\n      modificationDate.dataset.l10nArgs = JSON.stringify({\n        date: dateObject.toLocaleDateString(),\n        time: dateObject.toLocaleTimeString()\n      });\n      popup.appendChild(modificationDate);\n    }\n\n    const contents = this._formatContents(this.contents);\n\n    popup.appendChild(contents);\n\n    if (!Array.isArray(this.trigger)) {\n      this.trigger = [this.trigger];\n    }\n\n    this.trigger.forEach(element => {\n      element.addEventListener(\"click\", this._toggle.bind(this));\n      element.addEventListener(\"mouseover\", this._show.bind(this, false));\n      element.addEventListener(\"mouseout\", this._hide.bind(this, false));\n    });\n    popup.addEventListener(\"click\", this._hide.bind(this, true));\n    wrapper.appendChild(popup);\n    return wrapper;\n  }\n\n  _formatContents(contents) {\n    const p = document.createElement(\"p\");\n    const lines = contents.split(/(?:\\r\\n?|\\n)/);\n\n    for (let i = 0, ii = lines.length; i < ii; ++i) {\n      const line = lines[i];\n      p.appendChild(document.createTextNode(line));\n\n      if (i < ii - 1) {\n        p.appendChild(document.createElement(\"br\"));\n      }\n    }\n\n    return p;\n  }\n\n  _toggle() {\n    if (this.pinned) {\n      this._hide(true);\n    } else {\n      this._show(true);\n    }\n  }\n\n  _show(pin = false) {\n    if (pin) {\n      this.pinned = true;\n    }\n\n    if (this.hideElement.hidden) {\n      this.hideElement.hidden = false;\n      this.container.style.zIndex += 1;\n    }\n  }\n\n  _hide(unpin = true) {\n    if (unpin) {\n      this.pinned = false;\n    }\n\n    if (!this.hideElement.hidden && !this.pinned) {\n      this.hideElement.hidden = true;\n      this.container.style.zIndex -= 1;\n    }\n  }\n\n}\n\nclass FreeTextAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    super(parameters, {\n      isRenderable,\n      ignoreBorder: true\n    });\n  }\n\n  render() {\n    this.container.className = \"freeTextAnnotation\";\n\n    if (!this.data.hasPopup) {\n      this._createPopup(null, this.data);\n    }\n\n    return this.container;\n  }\n\n}\n\nclass LineAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    super(parameters, {\n      isRenderable,\n      ignoreBorder: true\n    });\n  }\n\n  render() {\n    this.container.className = \"lineAnnotation\";\n    const data = this.data;\n    const width = data.rect[2] - data.rect[0];\n    const height = data.rect[3] - data.rect[1];\n    const svg = this.svgFactory.create(width, height);\n    const line = this.svgFactory.createElement(\"svg:line\");\n    line.setAttribute(\"x1\", data.rect[2] - data.lineCoordinates[0]);\n    line.setAttribute(\"y1\", data.rect[3] - data.lineCoordinates[1]);\n    line.setAttribute(\"x2\", data.rect[2] - data.lineCoordinates[2]);\n    line.setAttribute(\"y2\", data.rect[3] - data.lineCoordinates[3]);\n    line.setAttribute(\"stroke-width\", data.borderStyle.width || 1);\n    line.setAttribute(\"stroke\", \"transparent\");\n    svg.appendChild(line);\n    this.container.append(svg);\n\n    this._createPopup(line, data);\n\n    return this.container;\n  }\n\n}\n\nclass SquareAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    super(parameters, {\n      isRenderable,\n      ignoreBorder: true\n    });\n  }\n\n  render() {\n    this.container.className = \"squareAnnotation\";\n    const data = this.data;\n    const width = data.rect[2] - data.rect[0];\n    const height = data.rect[3] - data.rect[1];\n    const svg = this.svgFactory.create(width, height);\n    const borderWidth = data.borderStyle.width;\n    const square = this.svgFactory.createElement(\"svg:rect\");\n    square.setAttribute(\"x\", borderWidth / 2);\n    square.setAttribute(\"y\", borderWidth / 2);\n    square.setAttribute(\"width\", width - borderWidth);\n    square.setAttribute(\"height\", height - borderWidth);\n    square.setAttribute(\"stroke-width\", borderWidth || 1);\n    square.setAttribute(\"stroke\", \"transparent\");\n    square.setAttribute(\"fill\", \"none\");\n    svg.appendChild(square);\n    this.container.append(svg);\n\n    this._createPopup(square, data);\n\n    return this.container;\n  }\n\n}\n\nclass CircleAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    super(parameters, {\n      isRenderable,\n      ignoreBorder: true\n    });\n  }\n\n  render() {\n    this.container.className = \"circleAnnotation\";\n    const data = this.data;\n    const width = data.rect[2] - data.rect[0];\n    const height = data.rect[3] - data.rect[1];\n    const svg = this.svgFactory.create(width, height);\n    const borderWidth = data.borderStyle.width;\n    const circle = this.svgFactory.createElement(\"svg:ellipse\");\n    circle.setAttribute(\"cx\", width / 2);\n    circle.setAttribute(\"cy\", height / 2);\n    circle.setAttribute(\"rx\", width / 2 - borderWidth / 2);\n    circle.setAttribute(\"ry\", height / 2 - borderWidth / 2);\n    circle.setAttribute(\"stroke-width\", borderWidth || 1);\n    circle.setAttribute(\"stroke\", \"transparent\");\n    circle.setAttribute(\"fill\", \"none\");\n    svg.appendChild(circle);\n    this.container.append(svg);\n\n    this._createPopup(circle, data);\n\n    return this.container;\n  }\n\n}\n\nclass PolylineAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    super(parameters, {\n      isRenderable,\n      ignoreBorder: true\n    });\n    this.containerClassName = \"polylineAnnotation\";\n    this.svgElementName = \"svg:polyline\";\n  }\n\n  render() {\n    this.container.className = this.containerClassName;\n    const data = this.data;\n    const width = data.rect[2] - data.rect[0];\n    const height = data.rect[3] - data.rect[1];\n    const svg = this.svgFactory.create(width, height);\n    let points = [];\n\n    for (const coordinate of data.vertices) {\n      const x = coordinate.x - data.rect[0];\n      const y = data.rect[3] - coordinate.y;\n      points.push(x + \",\" + y);\n    }\n\n    points = points.join(\" \");\n    const polyline = this.svgFactory.createElement(this.svgElementName);\n    polyline.setAttribute(\"points\", points);\n    polyline.setAttribute(\"stroke-width\", data.borderStyle.width || 1);\n    polyline.setAttribute(\"stroke\", \"transparent\");\n    polyline.setAttribute(\"fill\", \"none\");\n    svg.appendChild(polyline);\n    this.container.append(svg);\n\n    this._createPopup(polyline, data);\n\n    return this.container;\n  }\n\n}\n\nclass PolygonAnnotationElement extends PolylineAnnotationElement {\n  constructor(parameters) {\n    super(parameters);\n    this.containerClassName = \"polygonAnnotation\";\n    this.svgElementName = \"svg:polygon\";\n  }\n\n}\n\nclass CaretAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    super(parameters, {\n      isRenderable,\n      ignoreBorder: true\n    });\n  }\n\n  render() {\n    this.container.className = \"caretAnnotation\";\n\n    if (!this.data.hasPopup) {\n      this._createPopup(null, this.data);\n    }\n\n    return this.container;\n  }\n\n}\n\nclass InkAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    super(parameters, {\n      isRenderable,\n      ignoreBorder: true\n    });\n    this.containerClassName = \"inkAnnotation\";\n    this.svgElementName = \"svg:polyline\";\n  }\n\n  render() {\n    this.container.className = this.containerClassName;\n    const data = this.data;\n    const width = data.rect[2] - data.rect[0];\n    const height = data.rect[3] - data.rect[1];\n    const svg = this.svgFactory.create(width, height);\n\n    for (const inkList of data.inkLists) {\n      let points = [];\n\n      for (const coordinate of inkList) {\n        const x = coordinate.x - data.rect[0];\n        const y = data.rect[3] - coordinate.y;\n        points.push(`${x},${y}`);\n      }\n\n      points = points.join(\" \");\n      const polyline = this.svgFactory.createElement(this.svgElementName);\n      polyline.setAttribute(\"points\", points);\n      polyline.setAttribute(\"stroke-width\", data.borderStyle.width || 1);\n      polyline.setAttribute(\"stroke\", \"transparent\");\n      polyline.setAttribute(\"fill\", \"none\");\n\n      this._createPopup(polyline, data);\n\n      svg.appendChild(polyline);\n    }\n\n    this.container.append(svg);\n    return this.container;\n  }\n\n}\n\nclass HighlightAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    super(parameters, {\n      isRenderable,\n      ignoreBorder: true,\n      createQuadrilaterals: true\n    });\n  }\n\n  render() {\n    if (!this.data.hasPopup) {\n      this._createPopup(null, this.data);\n    }\n\n    if (this.quadrilaterals) {\n      return this._renderQuadrilaterals(\"highlightAnnotation\");\n    }\n\n    this.container.className = \"highlightAnnotation\";\n    return this.container;\n  }\n\n}\n\nclass UnderlineAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    super(parameters, {\n      isRenderable,\n      ignoreBorder: true,\n      createQuadrilaterals: true\n    });\n  }\n\n  render() {\n    if (!this.data.hasPopup) {\n      this._createPopup(null, this.data);\n    }\n\n    if (this.quadrilaterals) {\n      return this._renderQuadrilaterals(\"underlineAnnotation\");\n    }\n\n    this.container.className = \"underlineAnnotation\";\n    return this.container;\n  }\n\n}\n\nclass SquigglyAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    super(parameters, {\n      isRenderable,\n      ignoreBorder: true,\n      createQuadrilaterals: true\n    });\n  }\n\n  render() {\n    if (!this.data.hasPopup) {\n      this._createPopup(null, this.data);\n    }\n\n    if (this.quadrilaterals) {\n      return this._renderQuadrilaterals(\"squigglyAnnotation\");\n    }\n\n    this.container.className = \"squigglyAnnotation\";\n    return this.container;\n  }\n\n}\n\nclass StrikeOutAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    super(parameters, {\n      isRenderable,\n      ignoreBorder: true,\n      createQuadrilaterals: true\n    });\n  }\n\n  render() {\n    if (!this.data.hasPopup) {\n      this._createPopup(null, this.data);\n    }\n\n    if (this.quadrilaterals) {\n      return this._renderQuadrilaterals(\"strikeoutAnnotation\");\n    }\n\n    this.container.className = \"strikeoutAnnotation\";\n    return this.container;\n  }\n\n}\n\nclass StampAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    super(parameters, {\n      isRenderable,\n      ignoreBorder: true\n    });\n  }\n\n  render() {\n    this.container.className = \"stampAnnotation\";\n\n    if (!this.data.hasPopup) {\n      this._createPopup(null, this.data);\n    }\n\n    return this.container;\n  }\n\n}\n\nclass FileAttachmentAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true\n    });\n    const {\n      filename,\n      content\n    } = this.data.file;\n    this.filename = (0, _display_utils.getFilenameFromUrl)(filename);\n    this.content = content;\n    this.linkService.eventBus?.dispatch(\"fileattachmentannotation\", {\n      source: this,\n      id: (0, _util.stringToPDFString)(filename),\n      filename,\n      content\n    });\n  }\n\n  render() {\n    this.container.className = \"fileAttachmentAnnotation\";\n    const trigger = document.createElement(\"div\");\n    trigger.style.height = this.container.style.height;\n    trigger.style.width = this.container.style.width;\n    trigger.addEventListener(\"dblclick\", this._download.bind(this));\n\n    if (!this.data.hasPopup && (this.data.title || this.data.contents)) {\n      this._createPopup(trigger, this.data);\n    }\n\n    this.container.appendChild(trigger);\n    return this.container;\n  }\n\n  _download() {\n    this.downloadManager?.openOrDownloadData(this.container, this.content, this.filename);\n  }\n\n}\n\nclass AnnotationLayer {\n  static render(parameters) {\n    const sortedAnnotations = [],\n          popupAnnotations = [];\n\n    for (const data of parameters.annotations) {\n      if (!data) {\n        continue;\n      }\n\n      if (data.annotationType === _util.AnnotationType.POPUP) {\n        popupAnnotations.push(data);\n        continue;\n      }\n\n      sortedAnnotations.push(data);\n    }\n\n    if (popupAnnotations.length) {\n      sortedAnnotations.push(...popupAnnotations);\n    }\n\n    for (const data of sortedAnnotations) {\n      const element = AnnotationElementFactory.create({\n        data,\n        layer: parameters.div,\n        page: parameters.page,\n        viewport: parameters.viewport,\n        linkService: parameters.linkService,\n        downloadManager: parameters.downloadManager,\n        imageResourcesPath: parameters.imageResourcesPath || \"\",\n        renderInteractiveForms: parameters.renderInteractiveForms !== false,\n        svgFactory: new _display_utils.DOMSVGFactory(),\n        annotationStorage: parameters.annotationStorage || new _annotation_storage.AnnotationStorage(),\n        enableScripting: parameters.enableScripting,\n        hasJSActions: parameters.hasJSActions,\n        mouseState: parameters.mouseState || {\n          isDown: false\n        }\n      });\n\n      if (element.isRenderable) {\n        const rendered = element.render();\n\n        if (data.hidden) {\n          rendered.style.visibility = \"hidden\";\n        }\n\n        if (Array.isArray(rendered)) {\n          for (const renderedElement of rendered) {\n            parameters.div.appendChild(renderedElement);\n          }\n        } else {\n          if (element instanceof PopupAnnotationElement) {\n            parameters.div.prepend(rendered);\n          } else {\n            parameters.div.appendChild(rendered);\n          }\n        }\n      }\n    }\n  }\n\n  static update(parameters) {\n    const transform = `matrix(${parameters.viewport.transform.join(\",\")})`;\n\n    for (const data of parameters.annotations) {\n      const elements = parameters.div.querySelectorAll(`[data-annotation-id=\"${data.id}\"]`);\n\n      if (elements) {\n        elements.forEach(element => {\n          element.style.transform = transform;\n        });\n      }\n    }\n\n    parameters.div.hidden = false;\n  }\n\n}\n\nexports.AnnotationLayer = AnnotationLayer;\n\n/***/ }),\n/* 19 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.ColorConverters = void 0;\n\nfunction makeColorComp(n) {\n  return Math.floor(Math.max(0, Math.min(1, n)) * 255).toString(16).padStart(2, \"0\");\n}\n\nclass ColorConverters {\n  static CMYK_G([c, y, m, k]) {\n    return [\"G\", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)];\n  }\n\n  static G_CMYK([g]) {\n    return [\"CMYK\", 0, 0, 0, 1 - g];\n  }\n\n  static G_RGB([g]) {\n    return [\"RGB\", g, g, g];\n  }\n\n  static G_HTML([g]) {\n    const G = makeColorComp(g);\n    return `#${G}${G}${G}`;\n  }\n\n  static RGB_G([r, g, b]) {\n    return [\"G\", 0.3 * r + 0.59 * g + 0.11 * b];\n  }\n\n  static RGB_HTML([r, g, b]) {\n    const R = makeColorComp(r);\n    const G = makeColorComp(g);\n    const B = makeColorComp(b);\n    return `#${R}${G}${B}`;\n  }\n\n  static T_HTML() {\n    return \"#00000000\";\n  }\n\n  static CMYK_RGB([c, y, m, k]) {\n    return [\"RGB\", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)];\n  }\n\n  static CMYK_HTML(components) {\n    return this.RGB_HTML(this.CMYK_RGB(components));\n  }\n\n  static RGB_CMYK([r, g, b]) {\n    const c = 1 - r;\n    const m = 1 - g;\n    const y = 1 - b;\n    const k = Math.min(c, m, y);\n    return [\"CMYK\", c, m, y, k];\n  }\n\n}\n\nexports.ColorConverters = ColorConverters;\n\n/***/ }),\n/* 20 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.renderTextLayer = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nconst renderTextLayer = function renderTextLayerClosure() {\n  const MAX_TEXT_DIVS_TO_RENDER = 100000;\n  const DEFAULT_FONT_SIZE = 30;\n  const DEFAULT_FONT_ASCENT = 0.8;\n  const ascentCache = new Map();\n  const NonWhitespaceRegexp = /\\S/;\n\n  function isAllWhitespace(str) {\n    return !NonWhitespaceRegexp.test(str);\n  }\n\n  function getAscent(fontFamily, ctx) {\n    const cachedAscent = ascentCache.get(fontFamily);\n\n    if (cachedAscent) {\n      return cachedAscent;\n    }\n\n    ctx.save();\n    ctx.font = `${DEFAULT_FONT_SIZE}px ${fontFamily}`;\n    const metrics = ctx.measureText(\"\");\n    let ascent = metrics.fontBoundingBoxAscent;\n    let descent = Math.abs(metrics.fontBoundingBoxDescent);\n\n    if (ascent) {\n      ctx.restore();\n      const ratio = ascent / (ascent + descent);\n      ascentCache.set(fontFamily, ratio);\n      return ratio;\n    }\n\n    ctx.strokeStyle = \"red\";\n    ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE);\n    ctx.strokeText(\"g\", 0, 0);\n    let pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data;\n    descent = 0;\n\n    for (let i = pixels.length - 1 - 3; i >= 0; i -= 4) {\n      if (pixels[i] > 0) {\n        descent = Math.ceil(i / 4 / DEFAULT_FONT_SIZE);\n        break;\n      }\n    }\n\n    ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE);\n    ctx.strokeText(\"A\", 0, DEFAULT_FONT_SIZE);\n    pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data;\n    ascent = 0;\n\n    for (let i = 0, ii = pixels.length; i < ii; i += 4) {\n      if (pixels[i] > 0) {\n        ascent = DEFAULT_FONT_SIZE - Math.floor(i / 4 / DEFAULT_FONT_SIZE);\n        break;\n      }\n    }\n\n    ctx.restore();\n\n    if (ascent) {\n      const ratio = ascent / (ascent + descent);\n      ascentCache.set(fontFamily, ratio);\n      return ratio;\n    }\n\n    ascentCache.set(fontFamily, DEFAULT_FONT_ASCENT);\n    return DEFAULT_FONT_ASCENT;\n  }\n\n  function appendText(task, geom, styles, ctx) {\n    const textDiv = document.createElement(\"span\");\n    const textDivProperties = {\n      angle: 0,\n      canvasWidth: 0,\n      isWhitespace: false,\n      originalTransform: null,\n      paddingBottom: 0,\n      paddingLeft: 0,\n      paddingRight: 0,\n      paddingTop: 0,\n      scale: 1\n    };\n\n    task._textDivs.push(textDiv);\n\n    if (isAllWhitespace(geom.str)) {\n      textDivProperties.isWhitespace = true;\n\n      task._textDivProperties.set(textDiv, textDivProperties);\n\n      return;\n    }\n\n    const tx = _util.Util.transform(task._viewport.transform, geom.transform);\n\n    let angle = Math.atan2(tx[1], tx[0]);\n    const style = styles[geom.fontName];\n\n    if (style.vertical) {\n      angle += Math.PI / 2;\n    }\n\n    const fontHeight = Math.hypot(tx[2], tx[3]);\n    const fontAscent = fontHeight * getAscent(style.fontFamily, ctx);\n    let left, top;\n\n    if (angle === 0) {\n      left = tx[4];\n      top = tx[5] - fontAscent;\n    } else {\n      left = tx[4] + fontAscent * Math.sin(angle);\n      top = tx[5] - fontAscent * Math.cos(angle);\n    }\n\n    textDiv.style.left = `${left}px`;\n    textDiv.style.top = `${top}px`;\n    textDiv.style.fontSize = `${fontHeight}px`;\n    textDiv.style.fontFamily = style.fontFamily;\n    textDiv.textContent = geom.str;\n    textDiv.dir = geom.dir;\n\n    if (task._fontInspectorEnabled) {\n      textDiv.dataset.fontName = geom.fontName;\n    }\n\n    if (angle !== 0) {\n      textDivProperties.angle = angle * (180 / Math.PI);\n    }\n\n    let shouldScaleText = false;\n\n    if (geom.str.length > 1) {\n      shouldScaleText = true;\n    } else if (geom.transform[0] !== geom.transform[3]) {\n      const absScaleX = Math.abs(geom.transform[0]),\n            absScaleY = Math.abs(geom.transform[3]);\n\n      if (absScaleX !== absScaleY && Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5) {\n        shouldScaleText = true;\n      }\n    }\n\n    if (shouldScaleText) {\n      if (style.vertical) {\n        textDivProperties.canvasWidth = geom.height * task._viewport.scale;\n      } else {\n        textDivProperties.canvasWidth = geom.width * task._viewport.scale;\n      }\n    }\n\n    task._textDivProperties.set(textDiv, textDivProperties);\n\n    if (task._textContentStream) {\n      task._layoutText(textDiv);\n    }\n\n    if (task._enhanceTextSelection) {\n      let angleCos = 1,\n          angleSin = 0;\n\n      if (angle !== 0) {\n        angleCos = Math.cos(angle);\n        angleSin = Math.sin(angle);\n      }\n\n      const divWidth = (style.vertical ? geom.height : geom.width) * task._viewport.scale;\n      const divHeight = fontHeight;\n      let m, b;\n\n      if (angle !== 0) {\n        m = [angleCos, angleSin, -angleSin, angleCos, left, top];\n        b = _util.Util.getAxialAlignedBoundingBox([0, 0, divWidth, divHeight], m);\n      } else {\n        b = [left, top, left + divWidth, top + divHeight];\n      }\n\n      task._bounds.push({\n        left: b[0],\n        top: b[1],\n        right: b[2],\n        bottom: b[3],\n        div: textDiv,\n        size: [divWidth, divHeight],\n        m\n      });\n    }\n  }\n\n  function render(task) {\n    if (task._canceled) {\n      return;\n    }\n\n    const textDivs = task._textDivs;\n    const capability = task._capability;\n    const textDivsLength = textDivs.length;\n\n    if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) {\n      task._renderingDone = true;\n      capability.resolve();\n      return;\n    }\n\n    if (!task._textContentStream) {\n      for (let i = 0; i < textDivsLength; i++) {\n        task._layoutText(textDivs[i]);\n      }\n    }\n\n    task._renderingDone = true;\n    capability.resolve();\n  }\n\n  function findPositiveMin(ts, offset, count) {\n    let result = 0;\n\n    for (let i = 0; i < count; i++) {\n      const t = ts[offset++];\n\n      if (t > 0) {\n        result = result ? Math.min(t, result) : t;\n      }\n    }\n\n    return result;\n  }\n\n  function expand(task) {\n    const bounds = task._bounds;\n    const viewport = task._viewport;\n    const expanded = expandBounds(viewport.width, viewport.height, bounds);\n\n    for (let i = 0; i < expanded.length; i++) {\n      const div = bounds[i].div;\n\n      const divProperties = task._textDivProperties.get(div);\n\n      if (divProperties.angle === 0) {\n        divProperties.paddingLeft = bounds[i].left - expanded[i].left;\n        divProperties.paddingTop = bounds[i].top - expanded[i].top;\n        divProperties.paddingRight = expanded[i].right - bounds[i].right;\n        divProperties.paddingBottom = expanded[i].bottom - bounds[i].bottom;\n\n        task._textDivProperties.set(div, divProperties);\n\n        continue;\n      }\n\n      const e = expanded[i],\n            b = bounds[i];\n      const m = b.m,\n            c = m[0],\n            s = m[1];\n      const points = [[0, 0], [0, b.size[1]], [b.size[0], 0], b.size];\n      const ts = new Float64Array(64);\n      points.forEach(function (p, j) {\n        const t = _util.Util.applyTransform(p, m);\n\n        ts[j + 0] = c && (e.left - t[0]) / c;\n        ts[j + 4] = s && (e.top - t[1]) / s;\n        ts[j + 8] = c && (e.right - t[0]) / c;\n        ts[j + 12] = s && (e.bottom - t[1]) / s;\n        ts[j + 16] = s && (e.left - t[0]) / -s;\n        ts[j + 20] = c && (e.top - t[1]) / c;\n        ts[j + 24] = s && (e.right - t[0]) / -s;\n        ts[j + 28] = c && (e.bottom - t[1]) / c;\n        ts[j + 32] = c && (e.left - t[0]) / -c;\n        ts[j + 36] = s && (e.top - t[1]) / -s;\n        ts[j + 40] = c && (e.right - t[0]) / -c;\n        ts[j + 44] = s && (e.bottom - t[1]) / -s;\n        ts[j + 48] = s && (e.left - t[0]) / s;\n        ts[j + 52] = c && (e.top - t[1]) / -c;\n        ts[j + 56] = s && (e.right - t[0]) / s;\n        ts[j + 60] = c && (e.bottom - t[1]) / -c;\n      });\n      const boxScale = 1 + Math.min(Math.abs(c), Math.abs(s));\n      divProperties.paddingLeft = findPositiveMin(ts, 32, 16) / boxScale;\n      divProperties.paddingTop = findPositiveMin(ts, 48, 16) / boxScale;\n      divProperties.paddingRight = findPositiveMin(ts, 0, 16) / boxScale;\n      divProperties.paddingBottom = findPositiveMin(ts, 16, 16) / boxScale;\n\n      task._textDivProperties.set(div, divProperties);\n    }\n  }\n\n  function expandBounds(width, height, boxes) {\n    const bounds = boxes.map(function (box, i) {\n      return {\n        x1: box.left,\n        y1: box.top,\n        x2: box.right,\n        y2: box.bottom,\n        index: i,\n        x1New: undefined,\n        x2New: undefined\n      };\n    });\n    expandBoundsLTR(width, bounds);\n    const expanded = new Array(boxes.length);\n    bounds.forEach(function (b) {\n      const i = b.index;\n      expanded[i] = {\n        left: b.x1New,\n        top: 0,\n        right: b.x2New,\n        bottom: 0\n      };\n    });\n    boxes.map(function (box, i) {\n      const e = expanded[i],\n            b = bounds[i];\n      b.x1 = box.top;\n      b.y1 = width - e.right;\n      b.x2 = box.bottom;\n      b.y2 = width - e.left;\n      b.index = i;\n      b.x1New = undefined;\n      b.x2New = undefined;\n    });\n    expandBoundsLTR(height, bounds);\n    bounds.forEach(function (b) {\n      const i = b.index;\n      expanded[i].top = b.x1New;\n      expanded[i].bottom = b.x2New;\n    });\n    return expanded;\n  }\n\n  function expandBoundsLTR(width, bounds) {\n    bounds.sort(function (a, b) {\n      return a.x1 - b.x1 || a.index - b.index;\n    });\n    const fakeBoundary = {\n      x1: -Infinity,\n      y1: -Infinity,\n      x2: 0,\n      y2: Infinity,\n      index: -1,\n      x1New: 0,\n      x2New: 0\n    };\n    const horizon = [{\n      start: -Infinity,\n      end: Infinity,\n      boundary: fakeBoundary\n    }];\n    bounds.forEach(function (boundary) {\n      let i = 0;\n\n      while (i < horizon.length && horizon[i].end <= boundary.y1) {\n        i++;\n      }\n\n      let j = horizon.length - 1;\n\n      while (j >= 0 && horizon[j].start >= boundary.y2) {\n        j--;\n      }\n\n      let horizonPart, affectedBoundary;\n      let q,\n          k,\n          maxXNew = -Infinity;\n\n      for (q = i; q <= j; q++) {\n        horizonPart = horizon[q];\n        affectedBoundary = horizonPart.boundary;\n        let xNew;\n\n        if (affectedBoundary.x2 > boundary.x1) {\n          xNew = affectedBoundary.index > boundary.index ? affectedBoundary.x1New : boundary.x1;\n        } else if (affectedBoundary.x2New === undefined) {\n          xNew = (affectedBoundary.x2 + boundary.x1) / 2;\n        } else {\n          xNew = affectedBoundary.x2New;\n        }\n\n        if (xNew > maxXNew) {\n          maxXNew = xNew;\n        }\n      }\n\n      boundary.x1New = maxXNew;\n\n      for (q = i; q <= j; q++) {\n        horizonPart = horizon[q];\n        affectedBoundary = horizonPart.boundary;\n\n        if (affectedBoundary.x2New === undefined) {\n          if (affectedBoundary.x2 > boundary.x1) {\n            if (affectedBoundary.index > boundary.index) {\n              affectedBoundary.x2New = affectedBoundary.x2;\n            }\n          } else {\n            affectedBoundary.x2New = maxXNew;\n          }\n        } else if (affectedBoundary.x2New > maxXNew) {\n          affectedBoundary.x2New = Math.max(maxXNew, affectedBoundary.x2);\n        }\n      }\n\n      const changedHorizon = [];\n      let lastBoundary = null;\n\n      for (q = i; q <= j; q++) {\n        horizonPart = horizon[q];\n        affectedBoundary = horizonPart.boundary;\n        const useBoundary = affectedBoundary.x2 > boundary.x2 ? affectedBoundary : boundary;\n\n        if (lastBoundary === useBoundary) {\n          changedHorizon[changedHorizon.length - 1].end = horizonPart.end;\n        } else {\n          changedHorizon.push({\n            start: horizonPart.start,\n            end: horizonPart.end,\n            boundary: useBoundary\n          });\n          lastBoundary = useBoundary;\n        }\n      }\n\n      if (horizon[i].start < boundary.y1) {\n        changedHorizon[0].start = boundary.y1;\n        changedHorizon.unshift({\n          start: horizon[i].start,\n          end: boundary.y1,\n          boundary: horizon[i].boundary\n        });\n      }\n\n      if (boundary.y2 < horizon[j].end) {\n        changedHorizon[changedHorizon.length - 1].end = boundary.y2;\n        changedHorizon.push({\n          start: boundary.y2,\n          end: horizon[j].end,\n          boundary: horizon[j].boundary\n        });\n      }\n\n      for (q = i; q <= j; q++) {\n        horizonPart = horizon[q];\n        affectedBoundary = horizonPart.boundary;\n\n        if (affectedBoundary.x2New !== undefined) {\n          continue;\n        }\n\n        let used = false;\n\n        for (k = i - 1; !used && k >= 0 && horizon[k].start >= affectedBoundary.y1; k--) {\n          used = horizon[k].boundary === affectedBoundary;\n        }\n\n        for (k = j + 1; !used && k < horizon.length && horizon[k].end <= affectedBoundary.y2; k++) {\n          used = horizon[k].boundary === affectedBoundary;\n        }\n\n        for (k = 0; !used && k < changedHorizon.length; k++) {\n          used = changedHorizon[k].boundary === affectedBoundary;\n        }\n\n        if (!used) {\n          affectedBoundary.x2New = maxXNew;\n        }\n      }\n\n      Array.prototype.splice.apply(horizon, [i, j - i + 1].concat(changedHorizon));\n    });\n    horizon.forEach(function (horizonPart) {\n      const affectedBoundary = horizonPart.boundary;\n\n      if (affectedBoundary.x2New === undefined) {\n        affectedBoundary.x2New = Math.max(width, affectedBoundary.x2);\n      }\n    });\n  }\n\n  function TextLayerRenderTask({\n    textContent,\n    textContentStream,\n    container,\n    viewport,\n    textDivs,\n    textContentItemsStr,\n    enhanceTextSelection\n  }) {\n    this._textContent = textContent;\n    this._textContentStream = textContentStream;\n    this._container = container;\n    this._document = container.ownerDocument;\n    this._viewport = viewport;\n    this._textDivs = textDivs || [];\n    this._textContentItemsStr = textContentItemsStr || [];\n    this._enhanceTextSelection = !!enhanceTextSelection;\n    this._fontInspectorEnabled = !!globalThis.FontInspector?.enabled;\n    this._reader = null;\n    this._layoutTextLastFontSize = null;\n    this._layoutTextLastFontFamily = null;\n    this._layoutTextCtx = null;\n    this._textDivProperties = new WeakMap();\n    this._renderingDone = false;\n    this._canceled = false;\n    this._capability = (0, _util.createPromiseCapability)();\n    this._renderTimer = null;\n    this._bounds = [];\n\n    this._capability.promise.finally(() => {\n      if (this._layoutTextCtx) {\n        this._layoutTextCtx.canvas.width = 0;\n        this._layoutTextCtx.canvas.height = 0;\n        this._layoutTextCtx = null;\n      }\n    }).catch(() => {});\n  }\n\n  TextLayerRenderTask.prototype = {\n    get promise() {\n      return this._capability.promise;\n    },\n\n    cancel: function TextLayer_cancel() {\n      this._canceled = true;\n\n      if (this._reader) {\n        this._reader.cancel(new _util.AbortException(\"TextLayer task cancelled.\"));\n\n        this._reader = null;\n      }\n\n      if (this._renderTimer !== null) {\n        clearTimeout(this._renderTimer);\n        this._renderTimer = null;\n      }\n\n      this._capability.reject(new Error(\"TextLayer task cancelled.\"));\n    },\n\n    _processItems(items, styleCache) {\n      for (let i = 0, len = items.length; i < len; i++) {\n        this._textContentItemsStr.push(items[i].str);\n\n        appendText(this, items[i], styleCache, this._layoutTextCtx);\n      }\n    },\n\n    _layoutText(textDiv) {\n      const textDivProperties = this._textDivProperties.get(textDiv);\n\n      if (textDivProperties.isWhitespace) {\n        return;\n      }\n\n      let transform = \"\";\n\n      if (textDivProperties.canvasWidth !== 0) {\n        const {\n          fontSize,\n          fontFamily\n        } = textDiv.style;\n\n        if (fontSize !== this._layoutTextLastFontSize || fontFamily !== this._layoutTextLastFontFamily) {\n          this._layoutTextCtx.font = `${fontSize} ${fontFamily}`;\n          this._layoutTextLastFontSize = fontSize;\n          this._layoutTextLastFontFamily = fontFamily;\n        }\n\n        const {\n          width\n        } = this._layoutTextCtx.measureText(textDiv.textContent);\n\n        if (width > 0) {\n          textDivProperties.scale = textDivProperties.canvasWidth / width;\n          transform = `scaleX(${textDivProperties.scale})`;\n        }\n      }\n\n      if (textDivProperties.angle !== 0) {\n        transform = `rotate(${textDivProperties.angle}deg) ${transform}`;\n      }\n\n      if (transform.length > 0) {\n        if (this._enhanceTextSelection) {\n          textDivProperties.originalTransform = transform;\n        }\n\n        textDiv.style.transform = transform;\n      }\n\n      this._textDivProperties.set(textDiv, textDivProperties);\n\n      this._container.appendChild(textDiv);\n    },\n\n    _render: function TextLayer_render(timeout) {\n      const capability = (0, _util.createPromiseCapability)();\n      let styleCache = Object.create(null);\n\n      const canvas = this._document.createElement(\"canvas\");\n\n      canvas.height = canvas.width = DEFAULT_FONT_SIZE;\n      canvas.mozOpaque = true;\n      this._layoutTextCtx = canvas.getContext(\"2d\", {\n        alpha: false\n      });\n\n      if (this._textContent) {\n        const textItems = this._textContent.items;\n        const textStyles = this._textContent.styles;\n\n        this._processItems(textItems, textStyles);\n\n        capability.resolve();\n      } else if (this._textContentStream) {\n        const pump = () => {\n          this._reader.read().then(({\n            value,\n            done\n          }) => {\n            if (done) {\n              capability.resolve();\n              return;\n            }\n\n            Object.assign(styleCache, value.styles);\n\n            this._processItems(value.items, styleCache);\n\n            pump();\n          }, capability.reject);\n        };\n\n        this._reader = this._textContentStream.getReader();\n        pump();\n      } else {\n        throw new Error('Neither \"textContent\" nor \"textContentStream\"' + \" parameters specified.\");\n      }\n\n      capability.promise.then(() => {\n        styleCache = null;\n\n        if (!timeout) {\n          render(this);\n        } else {\n          this._renderTimer = setTimeout(() => {\n            render(this);\n            this._renderTimer = null;\n          }, timeout);\n        }\n      }, this._capability.reject);\n    },\n    expandTextDivs: function TextLayer_expandTextDivs(expandDivs) {\n      if (!this._enhanceTextSelection || !this._renderingDone) {\n        return;\n      }\n\n      if (this._bounds !== null) {\n        expand(this);\n        this._bounds = null;\n      }\n\n      const transformBuf = [],\n            paddingBuf = [];\n\n      for (let i = 0, ii = this._textDivs.length; i < ii; i++) {\n        const div = this._textDivs[i];\n\n        const divProps = this._textDivProperties.get(div);\n\n        if (divProps.isWhitespace) {\n          continue;\n        }\n\n        if (expandDivs) {\n          transformBuf.length = 0;\n          paddingBuf.length = 0;\n\n          if (divProps.originalTransform) {\n            transformBuf.push(divProps.originalTransform);\n          }\n\n          if (divProps.paddingTop > 0) {\n            paddingBuf.push(`${divProps.paddingTop}px`);\n            transformBuf.push(`translateY(${-divProps.paddingTop}px)`);\n          } else {\n            paddingBuf.push(0);\n          }\n\n          if (divProps.paddingRight > 0) {\n            paddingBuf.push(`${divProps.paddingRight / divProps.scale}px`);\n          } else {\n            paddingBuf.push(0);\n          }\n\n          if (divProps.paddingBottom > 0) {\n            paddingBuf.push(`${divProps.paddingBottom}px`);\n          } else {\n            paddingBuf.push(0);\n          }\n\n          if (divProps.paddingLeft > 0) {\n            paddingBuf.push(`${divProps.paddingLeft / divProps.scale}px`);\n            transformBuf.push(`translateX(${-divProps.paddingLeft / divProps.scale}px)`);\n          } else {\n            paddingBuf.push(0);\n          }\n\n          div.style.padding = paddingBuf.join(\" \");\n\n          if (transformBuf.length) {\n            div.style.transform = transformBuf.join(\" \");\n          }\n        } else {\n          div.style.padding = null;\n          div.style.transform = divProps.originalTransform;\n        }\n      }\n    }\n  };\n\n  function renderTextLayer(renderParameters) {\n    const task = new TextLayerRenderTask({\n      textContent: renderParameters.textContent,\n      textContentStream: renderParameters.textContentStream,\n      container: renderParameters.container,\n      viewport: renderParameters.viewport,\n      textDivs: renderParameters.textDivs,\n      textContentItemsStr: renderParameters.textContentItemsStr,\n      enhanceTextSelection: renderParameters.enhanceTextSelection\n    });\n\n    task._render(renderParameters.timeout);\n\n    return task;\n  }\n\n  return renderTextLayer;\n}();\n\nexports.renderTextLayer = renderTextLayer;\n\n/***/ }),\n/* 21 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.SVGGraphics = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _display_utils = __w_pdfjs_require__(1);\n\nvar _is_node = __w_pdfjs_require__(4);\n\nlet SVGGraphics = function () {\n  throw new Error(\"Not implemented: SVGGraphics\");\n};\n\nexports.SVGGraphics = SVGGraphics;\n{\n  const SVG_DEFAULTS = {\n    fontStyle: \"normal\",\n    fontWeight: \"normal\",\n    fillColor: \"#000000\"\n  };\n  const XML_NS = \"http://www.w3.org/XML/1998/namespace\";\n  const XLINK_NS = \"http://www.w3.org/1999/xlink\";\n  const LINE_CAP_STYLES = [\"butt\", \"round\", \"square\"];\n  const LINE_JOIN_STYLES = [\"miter\", \"round\", \"bevel\"];\n\n  const convertImgDataToPng = function () {\n    const PNG_HEADER = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);\n    const CHUNK_WRAPPER_SIZE = 12;\n    const crcTable = new Int32Array(256);\n\n    for (let i = 0; i < 256; i++) {\n      let c = i;\n\n      for (let h = 0; h < 8; h++) {\n        if (c & 1) {\n          c = 0xedb88320 ^ c >> 1 & 0x7fffffff;\n        } else {\n          c = c >> 1 & 0x7fffffff;\n        }\n      }\n\n      crcTable[i] = c;\n    }\n\n    function crc32(data, start, end) {\n      let crc = -1;\n\n      for (let i = start; i < end; i++) {\n        const a = (crc ^ data[i]) & 0xff;\n        const b = crcTable[a];\n        crc = crc >>> 8 ^ b;\n      }\n\n      return crc ^ -1;\n    }\n\n    function writePngChunk(type, body, data, offset) {\n      let p = offset;\n      const len = body.length;\n      data[p] = len >> 24 & 0xff;\n      data[p + 1] = len >> 16 & 0xff;\n      data[p + 2] = len >> 8 & 0xff;\n      data[p + 3] = len & 0xff;\n      p += 4;\n      data[p] = type.charCodeAt(0) & 0xff;\n      data[p + 1] = type.charCodeAt(1) & 0xff;\n      data[p + 2] = type.charCodeAt(2) & 0xff;\n      data[p + 3] = type.charCodeAt(3) & 0xff;\n      p += 4;\n      data.set(body, p);\n      p += body.length;\n      const crc = crc32(data, offset + 4, p);\n      data[p] = crc >> 24 & 0xff;\n      data[p + 1] = crc >> 16 & 0xff;\n      data[p + 2] = crc >> 8 & 0xff;\n      data[p + 3] = crc & 0xff;\n    }\n\n    function adler32(data, start, end) {\n      let a = 1;\n      let b = 0;\n\n      for (let i = start; i < end; ++i) {\n        a = (a + (data[i] & 0xff)) % 65521;\n        b = (b + a) % 65521;\n      }\n\n      return b << 16 | a;\n    }\n\n    function deflateSync(literals) {\n      if (!_is_node.isNodeJS) {\n        return deflateSyncUncompressed(literals);\n      }\n\n      try {\n        let input;\n\n        if (parseInt(process.versions.node) >= 8) {\n          input = literals;\n        } else {\n          input = Buffer.from(literals);\n        }\n\n        const output = require(\"zlib\").deflateSync(input, {\n          level: 9\n        });\n\n        return output instanceof Uint8Array ? output : new Uint8Array(output);\n      } catch (e) {\n        (0, _util.warn)(\"Not compressing PNG because zlib.deflateSync is unavailable: \" + e);\n      }\n\n      return deflateSyncUncompressed(literals);\n    }\n\n    function deflateSyncUncompressed(literals) {\n      let len = literals.length;\n      const maxBlockLength = 0xffff;\n      const deflateBlocks = Math.ceil(len / maxBlockLength);\n      const idat = new Uint8Array(2 + len + deflateBlocks * 5 + 4);\n      let pi = 0;\n      idat[pi++] = 0x78;\n      idat[pi++] = 0x9c;\n      let pos = 0;\n\n      while (len > maxBlockLength) {\n        idat[pi++] = 0x00;\n        idat[pi++] = 0xff;\n        idat[pi++] = 0xff;\n        idat[pi++] = 0x00;\n        idat[pi++] = 0x00;\n        idat.set(literals.subarray(pos, pos + maxBlockLength), pi);\n        pi += maxBlockLength;\n        pos += maxBlockLength;\n        len -= maxBlockLength;\n      }\n\n      idat[pi++] = 0x01;\n      idat[pi++] = len & 0xff;\n      idat[pi++] = len >> 8 & 0xff;\n      idat[pi++] = ~len & 0xffff & 0xff;\n      idat[pi++] = (~len & 0xffff) >> 8 & 0xff;\n      idat.set(literals.subarray(pos), pi);\n      pi += literals.length - pos;\n      const adler = adler32(literals, 0, literals.length);\n      idat[pi++] = adler >> 24 & 0xff;\n      idat[pi++] = adler >> 16 & 0xff;\n      idat[pi++] = adler >> 8 & 0xff;\n      idat[pi++] = adler & 0xff;\n      return idat;\n    }\n\n    function encode(imgData, kind, forceDataSchema, isMask) {\n      const width = imgData.width;\n      const height = imgData.height;\n      let bitDepth, colorType, lineSize;\n      const bytes = imgData.data;\n\n      switch (kind) {\n        case _util.ImageKind.GRAYSCALE_1BPP:\n          colorType = 0;\n          bitDepth = 1;\n          lineSize = width + 7 >> 3;\n          break;\n\n        case _util.ImageKind.RGB_24BPP:\n          colorType = 2;\n          bitDepth = 8;\n          lineSize = width * 3;\n          break;\n\n        case _util.ImageKind.RGBA_32BPP:\n          colorType = 6;\n          bitDepth = 8;\n          lineSize = width * 4;\n          break;\n\n        default:\n          throw new Error(\"invalid format\");\n      }\n\n      const literals = new Uint8Array((1 + lineSize) * height);\n      let offsetLiterals = 0,\n          offsetBytes = 0;\n\n      for (let y = 0; y < height; ++y) {\n        literals[offsetLiterals++] = 0;\n        literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize), offsetLiterals);\n        offsetBytes += lineSize;\n        offsetLiterals += lineSize;\n      }\n\n      if (kind === _util.ImageKind.GRAYSCALE_1BPP && isMask) {\n        offsetLiterals = 0;\n\n        for (let y = 0; y < height; y++) {\n          offsetLiterals++;\n\n          for (let i = 0; i < lineSize; i++) {\n            literals[offsetLiterals++] ^= 0xff;\n          }\n        }\n      }\n\n      const ihdr = new Uint8Array([width >> 24 & 0xff, width >> 16 & 0xff, width >> 8 & 0xff, width & 0xff, height >> 24 & 0xff, height >> 16 & 0xff, height >> 8 & 0xff, height & 0xff, bitDepth, colorType, 0x00, 0x00, 0x00]);\n      const idat = deflateSync(literals);\n      const pngLength = PNG_HEADER.length + CHUNK_WRAPPER_SIZE * 3 + ihdr.length + idat.length;\n      const data = new Uint8Array(pngLength);\n      let offset = 0;\n      data.set(PNG_HEADER, offset);\n      offset += PNG_HEADER.length;\n      writePngChunk(\"IHDR\", ihdr, data, offset);\n      offset += CHUNK_WRAPPER_SIZE + ihdr.length;\n      writePngChunk(\"IDATA\", idat, data, offset);\n      offset += CHUNK_WRAPPER_SIZE + idat.length;\n      writePngChunk(\"IEND\", new Uint8Array(0), data, offset);\n      return (0, _util.createObjectURL)(data, \"image/png\", forceDataSchema);\n    }\n\n    return function convertImgDataToPng(imgData, forceDataSchema, isMask) {\n      const kind = imgData.kind === undefined ? _util.ImageKind.GRAYSCALE_1BPP : imgData.kind;\n      return encode(imgData, kind, forceDataSchema, isMask);\n    };\n  }();\n\n  class SVGExtraState {\n    constructor() {\n      this.fontSizeScale = 1;\n      this.fontWeight = SVG_DEFAULTS.fontWeight;\n      this.fontSize = 0;\n      this.textMatrix = _util.IDENTITY_MATRIX;\n      this.fontMatrix = _util.FONT_IDENTITY_MATRIX;\n      this.leading = 0;\n      this.textRenderingMode = _util.TextRenderingMode.FILL;\n      this.textMatrixScale = 1;\n      this.x = 0;\n      this.y = 0;\n      this.lineX = 0;\n      this.lineY = 0;\n      this.charSpacing = 0;\n      this.wordSpacing = 0;\n      this.textHScale = 1;\n      this.textRise = 0;\n      this.fillColor = SVG_DEFAULTS.fillColor;\n      this.strokeColor = \"#000000\";\n      this.fillAlpha = 1;\n      this.strokeAlpha = 1;\n      this.lineWidth = 1;\n      this.lineJoin = \"\";\n      this.lineCap = \"\";\n      this.miterLimit = 0;\n      this.dashArray = [];\n      this.dashPhase = 0;\n      this.dependencies = [];\n      this.activeClipUrl = null;\n      this.clipGroup = null;\n      this.maskId = \"\";\n    }\n\n    clone() {\n      return Object.create(this);\n    }\n\n    setCurrentPoint(x, y) {\n      this.x = x;\n      this.y = y;\n    }\n\n  }\n\n  function opListToTree(opList) {\n    let opTree = [];\n    const tmp = [];\n\n    for (const opListElement of opList) {\n      if (opListElement.fn === \"save\") {\n        opTree.push({\n          fnId: 92,\n          fn: \"group\",\n          items: []\n        });\n        tmp.push(opTree);\n        opTree = opTree[opTree.length - 1].items;\n        continue;\n      }\n\n      if (opListElement.fn === \"restore\") {\n        opTree = tmp.pop();\n      } else {\n        opTree.push(opListElement);\n      }\n    }\n\n    return opTree;\n  }\n\n  function pf(value) {\n    if (Number.isInteger(value)) {\n      return value.toString();\n    }\n\n    const s = value.toFixed(10);\n    let i = s.length - 1;\n\n    if (s[i] !== \"0\") {\n      return s;\n    }\n\n    do {\n      i--;\n    } while (s[i] === \"0\");\n\n    return s.substring(0, s[i] === \".\" ? i : i + 1);\n  }\n\n  function pm(m) {\n    if (m[4] === 0 && m[5] === 0) {\n      if (m[1] === 0 && m[2] === 0) {\n        if (m[0] === 1 && m[3] === 1) {\n          return \"\";\n        }\n\n        return `scale(${pf(m[0])} ${pf(m[3])})`;\n      }\n\n      if (m[0] === m[3] && m[1] === -m[2]) {\n        const a = Math.acos(m[0]) * 180 / Math.PI;\n        return `rotate(${pf(a)})`;\n      }\n    } else {\n      if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) {\n        return `translate(${pf(m[4])} ${pf(m[5])})`;\n      }\n    }\n\n    return `matrix(${pf(m[0])} ${pf(m[1])} ${pf(m[2])} ${pf(m[3])} ${pf(m[4])} ` + `${pf(m[5])})`;\n  }\n\n  let clipCount = 0;\n  let maskCount = 0;\n  let shadingCount = 0;\n  exports.SVGGraphics = SVGGraphics = class SVGGraphics {\n    constructor(commonObjs, objs, forceDataSchema = false) {\n      this.svgFactory = new _display_utils.DOMSVGFactory();\n      this.current = new SVGExtraState();\n      this.transformMatrix = _util.IDENTITY_MATRIX;\n      this.transformStack = [];\n      this.extraStack = [];\n      this.commonObjs = commonObjs;\n      this.objs = objs;\n      this.pendingClip = null;\n      this.pendingEOFill = false;\n      this.embedFonts = false;\n      this.embeddedFonts = Object.create(null);\n      this.cssStyle = null;\n      this.forceDataSchema = !!forceDataSchema;\n      this._operatorIdMapping = [];\n\n      for (const op in _util.OPS) {\n        this._operatorIdMapping[_util.OPS[op]] = op;\n      }\n    }\n\n    save() {\n      this.transformStack.push(this.transformMatrix);\n      const old = this.current;\n      this.extraStack.push(old);\n      this.current = old.clone();\n    }\n\n    restore() {\n      this.transformMatrix = this.transformStack.pop();\n      this.current = this.extraStack.pop();\n      this.pendingClip = null;\n      this.tgrp = null;\n    }\n\n    group(items) {\n      this.save();\n      this.executeOpTree(items);\n      this.restore();\n    }\n\n    loadDependencies(operatorList) {\n      const fnArray = operatorList.fnArray;\n      const argsArray = operatorList.argsArray;\n\n      for (let i = 0, ii = fnArray.length; i < ii; i++) {\n        if (fnArray[i] !== _util.OPS.dependency) {\n          continue;\n        }\n\n        for (const obj of argsArray[i]) {\n          const objsPool = obj.startsWith(\"g_\") ? this.commonObjs : this.objs;\n          const promise = new Promise(resolve => {\n            objsPool.get(obj, resolve);\n          });\n          this.current.dependencies.push(promise);\n        }\n      }\n\n      return Promise.all(this.current.dependencies);\n    }\n\n    transform(a, b, c, d, e, f) {\n      const transformMatrix = [a, b, c, d, e, f];\n      this.transformMatrix = _util.Util.transform(this.transformMatrix, transformMatrix);\n      this.tgrp = null;\n    }\n\n    getSVG(operatorList, viewport) {\n      this.viewport = viewport;\n\n      const svgElement = this._initialize(viewport);\n\n      return this.loadDependencies(operatorList).then(() => {\n        this.transformMatrix = _util.IDENTITY_MATRIX;\n        this.executeOpTree(this.convertOpList(operatorList));\n        return svgElement;\n      });\n    }\n\n    convertOpList(operatorList) {\n      const operatorIdMapping = this._operatorIdMapping;\n      const argsArray = operatorList.argsArray;\n      const fnArray = operatorList.fnArray;\n      const opList = [];\n\n      for (let i = 0, ii = fnArray.length; i < ii; i++) {\n        const fnId = fnArray[i];\n        opList.push({\n          fnId,\n          fn: operatorIdMapping[fnId],\n          args: argsArray[i]\n        });\n      }\n\n      return opListToTree(opList);\n    }\n\n    executeOpTree(opTree) {\n      for (const opTreeElement of opTree) {\n        const fn = opTreeElement.fn;\n        const fnId = opTreeElement.fnId;\n        const args = opTreeElement.args;\n\n        switch (fnId | 0) {\n          case _util.OPS.beginText:\n            this.beginText();\n            break;\n\n          case _util.OPS.dependency:\n            break;\n\n          case _util.OPS.setLeading:\n            this.setLeading(args);\n            break;\n\n          case _util.OPS.setLeadingMoveText:\n            this.setLeadingMoveText(args[0], args[1]);\n            break;\n\n          case _util.OPS.setFont:\n            this.setFont(args);\n            break;\n\n          case _util.OPS.showText:\n            this.showText(args[0]);\n            break;\n\n          case _util.OPS.showSpacedText:\n            this.showText(args[0]);\n            break;\n\n          case _util.OPS.endText:\n            this.endText();\n            break;\n\n          case _util.OPS.moveText:\n            this.moveText(args[0], args[1]);\n            break;\n\n          case _util.OPS.setCharSpacing:\n            this.setCharSpacing(args[0]);\n            break;\n\n          case _util.OPS.setWordSpacing:\n            this.setWordSpacing(args[0]);\n            break;\n\n          case _util.OPS.setHScale:\n            this.setHScale(args[0]);\n            break;\n\n          case _util.OPS.setTextMatrix:\n            this.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);\n            break;\n\n          case _util.OPS.setTextRise:\n            this.setTextRise(args[0]);\n            break;\n\n          case _util.OPS.setTextRenderingMode:\n            this.setTextRenderingMode(args[0]);\n            break;\n\n          case _util.OPS.setLineWidth:\n            this.setLineWidth(args[0]);\n            break;\n\n          case _util.OPS.setLineJoin:\n            this.setLineJoin(args[0]);\n            break;\n\n          case _util.OPS.setLineCap:\n            this.setLineCap(args[0]);\n            break;\n\n          case _util.OPS.setMiterLimit:\n            this.setMiterLimit(args[0]);\n            break;\n\n          case _util.OPS.setFillRGBColor:\n            this.setFillRGBColor(args[0], args[1], args[2]);\n            break;\n\n          case _util.OPS.setStrokeRGBColor:\n            this.setStrokeRGBColor(args[0], args[1], args[2]);\n            break;\n\n          case _util.OPS.setStrokeColorN:\n            this.setStrokeColorN(args);\n            break;\n\n          case _util.OPS.setFillColorN:\n            this.setFillColorN(args);\n            break;\n\n          case _util.OPS.shadingFill:\n            this.shadingFill(args[0]);\n            break;\n\n          case _util.OPS.setDash:\n            this.setDash(args[0], args[1]);\n            break;\n\n          case _util.OPS.setRenderingIntent:\n            this.setRenderingIntent(args[0]);\n            break;\n\n          case _util.OPS.setFlatness:\n            this.setFlatness(args[0]);\n            break;\n\n          case _util.OPS.setGState:\n            this.setGState(args[0]);\n            break;\n\n          case _util.OPS.fill:\n            this.fill();\n            break;\n\n          case _util.OPS.eoFill:\n            this.eoFill();\n            break;\n\n          case _util.OPS.stroke:\n            this.stroke();\n            break;\n\n          case _util.OPS.fillStroke:\n            this.fillStroke();\n            break;\n\n          case _util.OPS.eoFillStroke:\n            this.eoFillStroke();\n            break;\n\n          case _util.OPS.clip:\n            this.clip(\"nonzero\");\n            break;\n\n          case _util.OPS.eoClip:\n            this.clip(\"evenodd\");\n            break;\n\n          case _util.OPS.paintSolidColorImageMask:\n            this.paintSolidColorImageMask();\n            break;\n\n          case _util.OPS.paintImageXObject:\n            this.paintImageXObject(args[0]);\n            break;\n\n          case _util.OPS.paintInlineImageXObject:\n            this.paintInlineImageXObject(args[0]);\n            break;\n\n          case _util.OPS.paintImageMaskXObject:\n            this.paintImageMaskXObject(args[0]);\n            break;\n\n          case _util.OPS.paintFormXObjectBegin:\n            this.paintFormXObjectBegin(args[0], args[1]);\n            break;\n\n          case _util.OPS.paintFormXObjectEnd:\n            this.paintFormXObjectEnd();\n            break;\n\n          case _util.OPS.closePath:\n            this.closePath();\n            break;\n\n          case _util.OPS.closeStroke:\n            this.closeStroke();\n            break;\n\n          case _util.OPS.closeFillStroke:\n            this.closeFillStroke();\n            break;\n\n          case _util.OPS.closeEOFillStroke:\n            this.closeEOFillStroke();\n            break;\n\n          case _util.OPS.nextLine:\n            this.nextLine();\n            break;\n\n          case _util.OPS.transform:\n            this.transform(args[0], args[1], args[2], args[3], args[4], args[5]);\n            break;\n\n          case _util.OPS.constructPath:\n            this.constructPath(args[0], args[1]);\n            break;\n\n          case _util.OPS.endPath:\n            this.endPath();\n            break;\n\n          case 92:\n            this.group(opTreeElement.items);\n            break;\n\n          default:\n            (0, _util.warn)(`Unimplemented operator ${fn}`);\n            break;\n        }\n      }\n    }\n\n    setWordSpacing(wordSpacing) {\n      this.current.wordSpacing = wordSpacing;\n    }\n\n    setCharSpacing(charSpacing) {\n      this.current.charSpacing = charSpacing;\n    }\n\n    nextLine() {\n      this.moveText(0, this.current.leading);\n    }\n\n    setTextMatrix(a, b, c, d, e, f) {\n      const current = this.current;\n      current.textMatrix = current.lineMatrix = [a, b, c, d, e, f];\n      current.textMatrixScale = Math.hypot(a, b);\n      current.x = current.lineX = 0;\n      current.y = current.lineY = 0;\n      current.xcoords = [];\n      current.ycoords = [];\n      current.tspan = this.svgFactory.createElement(\"svg:tspan\");\n      current.tspan.setAttributeNS(null, \"font-family\", current.fontFamily);\n      current.tspan.setAttributeNS(null, \"font-size\", `${pf(current.fontSize)}px`);\n      current.tspan.setAttributeNS(null, \"y\", pf(-current.y));\n      current.txtElement = this.svgFactory.createElement(\"svg:text\");\n      current.txtElement.appendChild(current.tspan);\n    }\n\n    beginText() {\n      const current = this.current;\n      current.x = current.lineX = 0;\n      current.y = current.lineY = 0;\n      current.textMatrix = _util.IDENTITY_MATRIX;\n      current.lineMatrix = _util.IDENTITY_MATRIX;\n      current.textMatrixScale = 1;\n      current.tspan = this.svgFactory.createElement(\"svg:tspan\");\n      current.txtElement = this.svgFactory.createElement(\"svg:text\");\n      current.txtgrp = this.svgFactory.createElement(\"svg:g\");\n      current.xcoords = [];\n      current.ycoords = [];\n    }\n\n    moveText(x, y) {\n      const current = this.current;\n      current.x = current.lineX += x;\n      current.y = current.lineY += y;\n      current.xcoords = [];\n      current.ycoords = [];\n      current.tspan = this.svgFactory.createElement(\"svg:tspan\");\n      current.tspan.setAttributeNS(null, \"font-family\", current.fontFamily);\n      current.tspan.setAttributeNS(null, \"font-size\", `${pf(current.fontSize)}px`);\n      current.tspan.setAttributeNS(null, \"y\", pf(-current.y));\n    }\n\n    showText(glyphs) {\n      const current = this.current;\n      const font = current.font;\n      const fontSize = current.fontSize;\n\n      if (fontSize === 0) {\n        return;\n      }\n\n      const fontSizeScale = current.fontSizeScale;\n      const charSpacing = current.charSpacing;\n      const wordSpacing = current.wordSpacing;\n      const fontDirection = current.fontDirection;\n      const textHScale = current.textHScale * fontDirection;\n      const vertical = font.vertical;\n      const spacingDir = vertical ? 1 : -1;\n      const defaultVMetrics = font.defaultVMetrics;\n      const widthAdvanceScale = fontSize * current.fontMatrix[0];\n      let x = 0;\n\n      for (const glyph of glyphs) {\n        if (glyph === null) {\n          x += fontDirection * wordSpacing;\n          continue;\n        } else if ((0, _util.isNum)(glyph)) {\n          x += spacingDir * glyph * fontSize / 1000;\n          continue;\n        }\n\n        const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n        const character = glyph.fontChar;\n        let scaledX, scaledY;\n        let width = glyph.width;\n\n        if (vertical) {\n          let vx;\n          const vmetric = glyph.vmetric || defaultVMetrics;\n          vx = glyph.vmetric ? vmetric[1] : width * 0.5;\n          vx = -vx * widthAdvanceScale;\n          const vy = vmetric[2] * widthAdvanceScale;\n          width = vmetric ? -vmetric[0] : width;\n          scaledX = vx / fontSizeScale;\n          scaledY = (x + vy) / fontSizeScale;\n        } else {\n          scaledX = x / fontSizeScale;\n          scaledY = 0;\n        }\n\n        if (glyph.isInFont || font.missingFile) {\n          current.xcoords.push(current.x + scaledX);\n\n          if (vertical) {\n            current.ycoords.push(-current.y + scaledY);\n          }\n\n          current.tspan.textContent += character;\n        } else {}\n\n        let charWidth;\n\n        if (vertical) {\n          charWidth = width * widthAdvanceScale - spacing * fontDirection;\n        } else {\n          charWidth = width * widthAdvanceScale + spacing * fontDirection;\n        }\n\n        x += charWidth;\n      }\n\n      current.tspan.setAttributeNS(null, \"x\", current.xcoords.map(pf).join(\" \"));\n\n      if (vertical) {\n        current.tspan.setAttributeNS(null, \"y\", current.ycoords.map(pf).join(\" \"));\n      } else {\n        current.tspan.setAttributeNS(null, \"y\", pf(-current.y));\n      }\n\n      if (vertical) {\n        current.y -= x;\n      } else {\n        current.x += x * textHScale;\n      }\n\n      current.tspan.setAttributeNS(null, \"font-family\", current.fontFamily);\n      current.tspan.setAttributeNS(null, \"font-size\", `${pf(current.fontSize)}px`);\n\n      if (current.fontStyle !== SVG_DEFAULTS.fontStyle) {\n        current.tspan.setAttributeNS(null, \"font-style\", current.fontStyle);\n      }\n\n      if (current.fontWeight !== SVG_DEFAULTS.fontWeight) {\n        current.tspan.setAttributeNS(null, \"font-weight\", current.fontWeight);\n      }\n\n      const fillStrokeMode = current.textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK;\n\n      if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {\n        if (current.fillColor !== SVG_DEFAULTS.fillColor) {\n          current.tspan.setAttributeNS(null, \"fill\", current.fillColor);\n        }\n\n        if (current.fillAlpha < 1) {\n          current.tspan.setAttributeNS(null, \"fill-opacity\", current.fillAlpha);\n        }\n      } else if (current.textRenderingMode === _util.TextRenderingMode.ADD_TO_PATH) {\n        current.tspan.setAttributeNS(null, \"fill\", \"transparent\");\n      } else {\n        current.tspan.setAttributeNS(null, \"fill\", \"none\");\n      }\n\n      if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {\n        const lineWidthScale = 1 / (current.textMatrixScale || 1);\n\n        this._setStrokeAttributes(current.tspan, lineWidthScale);\n      }\n\n      let textMatrix = current.textMatrix;\n\n      if (current.textRise !== 0) {\n        textMatrix = textMatrix.slice();\n        textMatrix[5] += current.textRise;\n      }\n\n      current.txtElement.setAttributeNS(null, \"transform\", `${pm(textMatrix)} scale(${pf(textHScale)}, -1)`);\n      current.txtElement.setAttributeNS(XML_NS, \"xml:space\", \"preserve\");\n      current.txtElement.appendChild(current.tspan);\n      current.txtgrp.appendChild(current.txtElement);\n\n      this._ensureTransformGroup().appendChild(current.txtElement);\n    }\n\n    setLeadingMoveText(x, y) {\n      this.setLeading(-y);\n      this.moveText(x, y);\n    }\n\n    addFontStyle(fontObj) {\n      if (!fontObj.data) {\n        throw new Error(\"addFontStyle: No font data available, \" + 'ensure that the \"fontExtraProperties\" API parameter is set.');\n      }\n\n      if (!this.cssStyle) {\n        this.cssStyle = this.svgFactory.createElement(\"svg:style\");\n        this.cssStyle.setAttributeNS(null, \"type\", \"text/css\");\n        this.defs.appendChild(this.cssStyle);\n      }\n\n      const url = (0, _util.createObjectURL)(fontObj.data, fontObj.mimetype, this.forceDataSchema);\n      this.cssStyle.textContent += `@font-face { font-family: \"${fontObj.loadedName}\";` + ` src: url(${url}); }\\n`;\n    }\n\n    setFont(details) {\n      const current = this.current;\n      const fontObj = this.commonObjs.get(details[0]);\n      let size = details[1];\n      current.font = fontObj;\n\n      if (this.embedFonts && !fontObj.missingFile && !this.embeddedFonts[fontObj.loadedName]) {\n        this.addFontStyle(fontObj);\n        this.embeddedFonts[fontObj.loadedName] = fontObj;\n      }\n\n      current.fontMatrix = fontObj.fontMatrix || _util.FONT_IDENTITY_MATRIX;\n      let bold = \"normal\";\n\n      if (fontObj.black) {\n        bold = \"900\";\n      } else if (fontObj.bold) {\n        bold = \"bold\";\n      }\n\n      const italic = fontObj.italic ? \"italic\" : \"normal\";\n\n      if (size < 0) {\n        size = -size;\n        current.fontDirection = -1;\n      } else {\n        current.fontDirection = 1;\n      }\n\n      current.fontSize = size;\n      current.fontFamily = fontObj.loadedName;\n      current.fontWeight = bold;\n      current.fontStyle = italic;\n      current.tspan = this.svgFactory.createElement(\"svg:tspan\");\n      current.tspan.setAttributeNS(null, \"y\", pf(-current.y));\n      current.xcoords = [];\n      current.ycoords = [];\n    }\n\n    endText() {\n      const current = this.current;\n\n      if (current.textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG && current.txtElement?.hasChildNodes()) {\n        current.element = current.txtElement;\n        this.clip(\"nonzero\");\n        this.endPath();\n      }\n    }\n\n    setLineWidth(width) {\n      if (width > 0) {\n        this.current.lineWidth = width;\n      }\n    }\n\n    setLineCap(style) {\n      this.current.lineCap = LINE_CAP_STYLES[style];\n    }\n\n    setLineJoin(style) {\n      this.current.lineJoin = LINE_JOIN_STYLES[style];\n    }\n\n    setMiterLimit(limit) {\n      this.current.miterLimit = limit;\n    }\n\n    setStrokeAlpha(strokeAlpha) {\n      this.current.strokeAlpha = strokeAlpha;\n    }\n\n    setStrokeRGBColor(r, g, b) {\n      this.current.strokeColor = _util.Util.makeHexColor(r, g, b);\n    }\n\n    setFillAlpha(fillAlpha) {\n      this.current.fillAlpha = fillAlpha;\n    }\n\n    setFillRGBColor(r, g, b) {\n      this.current.fillColor = _util.Util.makeHexColor(r, g, b);\n      this.current.tspan = this.svgFactory.createElement(\"svg:tspan\");\n      this.current.xcoords = [];\n      this.current.ycoords = [];\n    }\n\n    setStrokeColorN(args) {\n      this.current.strokeColor = this._makeColorN_Pattern(args);\n    }\n\n    setFillColorN(args) {\n      this.current.fillColor = this._makeColorN_Pattern(args);\n    }\n\n    shadingFill(args) {\n      const width = this.viewport.width;\n      const height = this.viewport.height;\n\n      const inv = _util.Util.inverseTransform(this.transformMatrix);\n\n      const bl = _util.Util.applyTransform([0, 0], inv);\n\n      const br = _util.Util.applyTransform([0, height], inv);\n\n      const ul = _util.Util.applyTransform([width, 0], inv);\n\n      const ur = _util.Util.applyTransform([width, height], inv);\n\n      const x0 = Math.min(bl[0], br[0], ul[0], ur[0]);\n      const y0 = Math.min(bl[1], br[1], ul[1], ur[1]);\n      const x1 = Math.max(bl[0], br[0], ul[0], ur[0]);\n      const y1 = Math.max(bl[1], br[1], ul[1], ur[1]);\n      const rect = this.svgFactory.createElement(\"svg:rect\");\n      rect.setAttributeNS(null, \"x\", x0);\n      rect.setAttributeNS(null, \"y\", y0);\n      rect.setAttributeNS(null, \"width\", x1 - x0);\n      rect.setAttributeNS(null, \"height\", y1 - y0);\n      rect.setAttributeNS(null, \"fill\", this._makeShadingPattern(args));\n\n      if (this.current.fillAlpha < 1) {\n        rect.setAttributeNS(null, \"fill-opacity\", this.current.fillAlpha);\n      }\n\n      this._ensureTransformGroup().appendChild(rect);\n    }\n\n    _makeColorN_Pattern(args) {\n      if (args[0] === \"TilingPattern\") {\n        return this._makeTilingPattern(args);\n      }\n\n      return this._makeShadingPattern(args);\n    }\n\n    _makeTilingPattern(args) {\n      const color = args[1];\n      const operatorList = args[2];\n      const matrix = args[3] || _util.IDENTITY_MATRIX;\n      const [x0, y0, x1, y1] = args[4];\n      const xstep = args[5];\n      const ystep = args[6];\n      const paintType = args[7];\n      const tilingId = `shading${shadingCount++}`;\n\n      const [tx0, ty0] = _util.Util.applyTransform([x0, y0], matrix);\n\n      const [tx1, ty1] = _util.Util.applyTransform([x1, y1], matrix);\n\n      const [xscale, yscale] = _util.Util.singularValueDecompose2dScale(matrix);\n\n      const txstep = xstep * xscale;\n      const tystep = ystep * yscale;\n      const tiling = this.svgFactory.createElement(\"svg:pattern\");\n      tiling.setAttributeNS(null, \"id\", tilingId);\n      tiling.setAttributeNS(null, \"patternUnits\", \"userSpaceOnUse\");\n      tiling.setAttributeNS(null, \"width\", txstep);\n      tiling.setAttributeNS(null, \"height\", tystep);\n      tiling.setAttributeNS(null, \"x\", `${tx0}`);\n      tiling.setAttributeNS(null, \"y\", `${ty0}`);\n      const svg = this.svg;\n      const transformMatrix = this.transformMatrix;\n      const fillColor = this.current.fillColor;\n      const strokeColor = this.current.strokeColor;\n      const bbox = this.svgFactory.create(tx1 - tx0, ty1 - ty0);\n      this.svg = bbox;\n      this.transformMatrix = matrix;\n\n      if (paintType === 2) {\n        const cssColor = _util.Util.makeHexColor(...color);\n\n        this.current.fillColor = cssColor;\n        this.current.strokeColor = cssColor;\n      }\n\n      this.executeOpTree(this.convertOpList(operatorList));\n      this.svg = svg;\n      this.transformMatrix = transformMatrix;\n      this.current.fillColor = fillColor;\n      this.current.strokeColor = strokeColor;\n      tiling.appendChild(bbox.childNodes[0]);\n      this.defs.appendChild(tiling);\n      return `url(#${tilingId})`;\n    }\n\n    _makeShadingPattern(args) {\n      switch (args[0]) {\n        case \"RadialAxial\":\n          const shadingId = `shading${shadingCount++}`;\n          const colorStops = args[3];\n          let gradient;\n\n          switch (args[1]) {\n            case \"axial\":\n              const point0 = args[4];\n              const point1 = args[5];\n              gradient = this.svgFactory.createElement(\"svg:linearGradient\");\n              gradient.setAttributeNS(null, \"id\", shadingId);\n              gradient.setAttributeNS(null, \"gradientUnits\", \"userSpaceOnUse\");\n              gradient.setAttributeNS(null, \"x1\", point0[0]);\n              gradient.setAttributeNS(null, \"y1\", point0[1]);\n              gradient.setAttributeNS(null, \"x2\", point1[0]);\n              gradient.setAttributeNS(null, \"y2\", point1[1]);\n              break;\n\n            case \"radial\":\n              const focalPoint = args[4];\n              const circlePoint = args[5];\n              const focalRadius = args[6];\n              const circleRadius = args[7];\n              gradient = this.svgFactory.createElement(\"svg:radialGradient\");\n              gradient.setAttributeNS(null, \"id\", shadingId);\n              gradient.setAttributeNS(null, \"gradientUnits\", \"userSpaceOnUse\");\n              gradient.setAttributeNS(null, \"cx\", circlePoint[0]);\n              gradient.setAttributeNS(null, \"cy\", circlePoint[1]);\n              gradient.setAttributeNS(null, \"r\", circleRadius);\n              gradient.setAttributeNS(null, \"fx\", focalPoint[0]);\n              gradient.setAttributeNS(null, \"fy\", focalPoint[1]);\n              gradient.setAttributeNS(null, \"fr\", focalRadius);\n              break;\n\n            default:\n              throw new Error(`Unknown RadialAxial type: ${args[1]}`);\n          }\n\n          for (const colorStop of colorStops) {\n            const stop = this.svgFactory.createElement(\"svg:stop\");\n            stop.setAttributeNS(null, \"offset\", colorStop[0]);\n            stop.setAttributeNS(null, \"stop-color\", colorStop[1]);\n            gradient.appendChild(stop);\n          }\n\n          this.defs.appendChild(gradient);\n          return `url(#${shadingId})`;\n\n        case \"Mesh\":\n          (0, _util.warn)(\"Unimplemented pattern Mesh\");\n          return null;\n\n        case \"Dummy\":\n          return \"hotpink\";\n\n        default:\n          throw new Error(`Unknown IR type: ${args[0]}`);\n      }\n    }\n\n    setDash(dashArray, dashPhase) {\n      this.current.dashArray = dashArray;\n      this.current.dashPhase = dashPhase;\n    }\n\n    constructPath(ops, args) {\n      const current = this.current;\n      let x = current.x,\n          y = current.y;\n      let d = [];\n      let j = 0;\n\n      for (const op of ops) {\n        switch (op | 0) {\n          case _util.OPS.rectangle:\n            x = args[j++];\n            y = args[j++];\n            const width = args[j++];\n            const height = args[j++];\n            const xw = x + width;\n            const yh = y + height;\n            d.push(\"M\", pf(x), pf(y), \"L\", pf(xw), pf(y), \"L\", pf(xw), pf(yh), \"L\", pf(x), pf(yh), \"Z\");\n            break;\n\n          case _util.OPS.moveTo:\n            x = args[j++];\n            y = args[j++];\n            d.push(\"M\", pf(x), pf(y));\n            break;\n\n          case _util.OPS.lineTo:\n            x = args[j++];\n            y = args[j++];\n            d.push(\"L\", pf(x), pf(y));\n            break;\n\n          case _util.OPS.curveTo:\n            x = args[j + 4];\n            y = args[j + 5];\n            d.push(\"C\", pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), pf(args[j + 3]), pf(x), pf(y));\n            j += 6;\n            break;\n\n          case _util.OPS.curveTo2:\n            d.push(\"C\", pf(x), pf(y), pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), pf(args[j + 3]));\n            x = args[j + 2];\n            y = args[j + 3];\n            j += 4;\n            break;\n\n          case _util.OPS.curveTo3:\n            x = args[j + 2];\n            y = args[j + 3];\n            d.push(\"C\", pf(args[j]), pf(args[j + 1]), pf(x), pf(y), pf(x), pf(y));\n            j += 4;\n            break;\n\n          case _util.OPS.closePath:\n            d.push(\"Z\");\n            break;\n        }\n      }\n\n      d = d.join(\" \");\n\n      if (current.path && ops.length > 0 && ops[0] !== _util.OPS.rectangle && ops[0] !== _util.OPS.moveTo) {\n        d = current.path.getAttributeNS(null, \"d\") + d;\n      } else {\n        current.path = this.svgFactory.createElement(\"svg:path\");\n\n        this._ensureTransformGroup().appendChild(current.path);\n      }\n\n      current.path.setAttributeNS(null, \"d\", d);\n      current.path.setAttributeNS(null, \"fill\", \"none\");\n      current.element = current.path;\n      current.setCurrentPoint(x, y);\n    }\n\n    endPath() {\n      const current = this.current;\n      current.path = null;\n\n      if (!this.pendingClip) {\n        return;\n      }\n\n      if (!current.element) {\n        this.pendingClip = null;\n        return;\n      }\n\n      const clipId = `clippath${clipCount++}`;\n      const clipPath = this.svgFactory.createElement(\"svg:clipPath\");\n      clipPath.setAttributeNS(null, \"id\", clipId);\n      clipPath.setAttributeNS(null, \"transform\", pm(this.transformMatrix));\n      const clipElement = current.element.cloneNode(true);\n\n      if (this.pendingClip === \"evenodd\") {\n        clipElement.setAttributeNS(null, \"clip-rule\", \"evenodd\");\n      } else {\n        clipElement.setAttributeNS(null, \"clip-rule\", \"nonzero\");\n      }\n\n      this.pendingClip = null;\n      clipPath.appendChild(clipElement);\n      this.defs.appendChild(clipPath);\n\n      if (current.activeClipUrl) {\n        current.clipGroup = null;\n        this.extraStack.forEach(function (prev) {\n          prev.clipGroup = null;\n        });\n        clipPath.setAttributeNS(null, \"clip-path\", current.activeClipUrl);\n      }\n\n      current.activeClipUrl = `url(#${clipId})`;\n      this.tgrp = null;\n    }\n\n    clip(type) {\n      this.pendingClip = type;\n    }\n\n    closePath() {\n      const current = this.current;\n\n      if (current.path) {\n        const d = `${current.path.getAttributeNS(null, \"d\")}Z`;\n        current.path.setAttributeNS(null, \"d\", d);\n      }\n    }\n\n    setLeading(leading) {\n      this.current.leading = -leading;\n    }\n\n    setTextRise(textRise) {\n      this.current.textRise = textRise;\n    }\n\n    setTextRenderingMode(textRenderingMode) {\n      this.current.textRenderingMode = textRenderingMode;\n    }\n\n    setHScale(scale) {\n      this.current.textHScale = scale / 100;\n    }\n\n    setRenderingIntent(intent) {}\n\n    setFlatness(flatness) {}\n\n    setGState(states) {\n      for (const [key, value] of states) {\n        switch (key) {\n          case \"LW\":\n            this.setLineWidth(value);\n            break;\n\n          case \"LC\":\n            this.setLineCap(value);\n            break;\n\n          case \"LJ\":\n            this.setLineJoin(value);\n            break;\n\n          case \"ML\":\n            this.setMiterLimit(value);\n            break;\n\n          case \"D\":\n            this.setDash(value[0], value[1]);\n            break;\n\n          case \"RI\":\n            this.setRenderingIntent(value);\n            break;\n\n          case \"FL\":\n            this.setFlatness(value);\n            break;\n\n          case \"Font\":\n            this.setFont(value);\n            break;\n\n          case \"CA\":\n            this.setStrokeAlpha(value);\n            break;\n\n          case \"ca\":\n            this.setFillAlpha(value);\n            break;\n\n          default:\n            (0, _util.warn)(`Unimplemented graphic state operator ${key}`);\n            break;\n        }\n      }\n    }\n\n    fill() {\n      const current = this.current;\n\n      if (current.element) {\n        current.element.setAttributeNS(null, \"fill\", current.fillColor);\n        current.element.setAttributeNS(null, \"fill-opacity\", current.fillAlpha);\n        this.endPath();\n      }\n    }\n\n    stroke() {\n      const current = this.current;\n\n      if (current.element) {\n        this._setStrokeAttributes(current.element);\n\n        current.element.setAttributeNS(null, \"fill\", \"none\");\n        this.endPath();\n      }\n    }\n\n    _setStrokeAttributes(element, lineWidthScale = 1) {\n      const current = this.current;\n      let dashArray = current.dashArray;\n\n      if (lineWidthScale !== 1 && dashArray.length > 0) {\n        dashArray = dashArray.map(function (value) {\n          return lineWidthScale * value;\n        });\n      }\n\n      element.setAttributeNS(null, \"stroke\", current.strokeColor);\n      element.setAttributeNS(null, \"stroke-opacity\", current.strokeAlpha);\n      element.setAttributeNS(null, \"stroke-miterlimit\", pf(current.miterLimit));\n      element.setAttributeNS(null, \"stroke-linecap\", current.lineCap);\n      element.setAttributeNS(null, \"stroke-linejoin\", current.lineJoin);\n      element.setAttributeNS(null, \"stroke-width\", pf(lineWidthScale * current.lineWidth) + \"px\");\n      element.setAttributeNS(null, \"stroke-dasharray\", dashArray.map(pf).join(\" \"));\n      element.setAttributeNS(null, \"stroke-dashoffset\", pf(lineWidthScale * current.dashPhase) + \"px\");\n    }\n\n    eoFill() {\n      if (this.current.element) {\n        this.current.element.setAttributeNS(null, \"fill-rule\", \"evenodd\");\n      }\n\n      this.fill();\n    }\n\n    fillStroke() {\n      this.stroke();\n      this.fill();\n    }\n\n    eoFillStroke() {\n      if (this.current.element) {\n        this.current.element.setAttributeNS(null, \"fill-rule\", \"evenodd\");\n      }\n\n      this.fillStroke();\n    }\n\n    closeStroke() {\n      this.closePath();\n      this.stroke();\n    }\n\n    closeFillStroke() {\n      this.closePath();\n      this.fillStroke();\n    }\n\n    closeEOFillStroke() {\n      this.closePath();\n      this.eoFillStroke();\n    }\n\n    paintSolidColorImageMask() {\n      const rect = this.svgFactory.createElement(\"svg:rect\");\n      rect.setAttributeNS(null, \"x\", \"0\");\n      rect.setAttributeNS(null, \"y\", \"0\");\n      rect.setAttributeNS(null, \"width\", \"1px\");\n      rect.setAttributeNS(null, \"height\", \"1px\");\n      rect.setAttributeNS(null, \"fill\", this.current.fillColor);\n\n      this._ensureTransformGroup().appendChild(rect);\n    }\n\n    paintImageXObject(objId) {\n      const imgData = objId.startsWith(\"g_\") ? this.commonObjs.get(objId) : this.objs.get(objId);\n\n      if (!imgData) {\n        (0, _util.warn)(`Dependent image with object ID ${objId} is not ready yet`);\n        return;\n      }\n\n      this.paintInlineImageXObject(imgData);\n    }\n\n    paintInlineImageXObject(imgData, mask) {\n      const width = imgData.width;\n      const height = imgData.height;\n      const imgSrc = convertImgDataToPng(imgData, this.forceDataSchema, !!mask);\n      const cliprect = this.svgFactory.createElement(\"svg:rect\");\n      cliprect.setAttributeNS(null, \"x\", \"0\");\n      cliprect.setAttributeNS(null, \"y\", \"0\");\n      cliprect.setAttributeNS(null, \"width\", pf(width));\n      cliprect.setAttributeNS(null, \"height\", pf(height));\n      this.current.element = cliprect;\n      this.clip(\"nonzero\");\n      const imgEl = this.svgFactory.createElement(\"svg:image\");\n      imgEl.setAttributeNS(XLINK_NS, \"xlink:href\", imgSrc);\n      imgEl.setAttributeNS(null, \"x\", \"0\");\n      imgEl.setAttributeNS(null, \"y\", pf(-height));\n      imgEl.setAttributeNS(null, \"width\", pf(width) + \"px\");\n      imgEl.setAttributeNS(null, \"height\", pf(height) + \"px\");\n      imgEl.setAttributeNS(null, \"transform\", `scale(${pf(1 / width)} ${pf(-1 / height)})`);\n\n      if (mask) {\n        mask.appendChild(imgEl);\n      } else {\n        this._ensureTransformGroup().appendChild(imgEl);\n      }\n    }\n\n    paintImageMaskXObject(imgData) {\n      const current = this.current;\n      const width = imgData.width;\n      const height = imgData.height;\n      const fillColor = current.fillColor;\n      current.maskId = `mask${maskCount++}`;\n      const mask = this.svgFactory.createElement(\"svg:mask\");\n      mask.setAttributeNS(null, \"id\", current.maskId);\n      const rect = this.svgFactory.createElement(\"svg:rect\");\n      rect.setAttributeNS(null, \"x\", \"0\");\n      rect.setAttributeNS(null, \"y\", \"0\");\n      rect.setAttributeNS(null, \"width\", pf(width));\n      rect.setAttributeNS(null, \"height\", pf(height));\n      rect.setAttributeNS(null, \"fill\", fillColor);\n      rect.setAttributeNS(null, \"mask\", `url(#${current.maskId})`);\n      this.defs.appendChild(mask);\n\n      this._ensureTransformGroup().appendChild(rect);\n\n      this.paintInlineImageXObject(imgData, mask);\n    }\n\n    paintFormXObjectBegin(matrix, bbox) {\n      if (Array.isArray(matrix) && matrix.length === 6) {\n        this.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);\n      }\n\n      if (bbox) {\n        const width = bbox[2] - bbox[0];\n        const height = bbox[3] - bbox[1];\n        const cliprect = this.svgFactory.createElement(\"svg:rect\");\n        cliprect.setAttributeNS(null, \"x\", bbox[0]);\n        cliprect.setAttributeNS(null, \"y\", bbox[1]);\n        cliprect.setAttributeNS(null, \"width\", pf(width));\n        cliprect.setAttributeNS(null, \"height\", pf(height));\n        this.current.element = cliprect;\n        this.clip(\"nonzero\");\n        this.endPath();\n      }\n    }\n\n    paintFormXObjectEnd() {}\n\n    _initialize(viewport) {\n      const svg = this.svgFactory.create(viewport.width, viewport.height);\n      const definitions = this.svgFactory.createElement(\"svg:defs\");\n      svg.appendChild(definitions);\n      this.defs = definitions;\n      const rootGroup = this.svgFactory.createElement(\"svg:g\");\n      rootGroup.setAttributeNS(null, \"transform\", pm(viewport.transform));\n      svg.appendChild(rootGroup);\n      this.svg = rootGroup;\n      return svg;\n    }\n\n    _ensureClipGroup() {\n      if (!this.current.clipGroup) {\n        const clipGroup = this.svgFactory.createElement(\"svg:g\");\n        clipGroup.setAttributeNS(null, \"clip-path\", this.current.activeClipUrl);\n        this.svg.appendChild(clipGroup);\n        this.current.clipGroup = clipGroup;\n      }\n\n      return this.current.clipGroup;\n    }\n\n    _ensureTransformGroup() {\n      if (!this.tgrp) {\n        this.tgrp = this.svgFactory.createElement(\"svg:g\");\n        this.tgrp.setAttributeNS(null, \"transform\", pm(this.transformMatrix));\n\n        if (this.current.activeClipUrl) {\n          this._ensureClipGroup().appendChild(this.tgrp);\n        } else {\n          this.svg.appendChild(this.tgrp);\n        }\n      }\n\n      return this.tgrp;\n    }\n\n  };\n}\n\n/***/ }),\n/* 22 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.XfaLayer = void 0;\n\nclass XfaLayer {\n  static setAttributes(html, attrs) {\n    for (const [key, value] of Object.entries(attrs)) {\n      if (value === null || value === undefined) {\n        continue;\n      }\n\n      if (key !== \"style\") {\n        html.setAttribute(key, value);\n      } else {\n        Object.assign(html.style, value);\n      }\n    }\n  }\n\n  static render(parameters) {\n    const root = parameters.xfa;\n    const rootHtml = document.createElement(root.name);\n\n    if (root.attributes) {\n      XfaLayer.setAttributes(rootHtml, root.attributes);\n    }\n\n    const stack = [[root, -1, rootHtml]];\n    const rootDiv = parameters.div;\n    rootDiv.appendChild(rootHtml);\n    const coeffs = parameters.viewport.transform.join(\",\");\n    rootDiv.style.transform = `matrix(${coeffs})`;\n    rootDiv.setAttribute(\"class\", \"xfaLayer xfaFont\");\n\n    while (stack.length > 0) {\n      const [parent, i, html] = stack[stack.length - 1];\n\n      if (i + 1 === parent.children.length) {\n        stack.pop();\n        continue;\n      }\n\n      const child = parent.children[++stack[stack.length - 1][1]];\n\n      if (child === null) {\n        continue;\n      }\n\n      const {\n        name\n      } = child;\n\n      if (name === \"#text\") {\n        html.appendChild(document.createTextNode(child.value));\n        continue;\n      }\n\n      const childHtml = document.createElement(name);\n      html.appendChild(childHtml);\n\n      if (child.attributes) {\n        XfaLayer.setAttributes(childHtml, child.attributes);\n      }\n\n      if (child.children && child.children.length > 0) {\n        stack.push([child, -1, childHtml]);\n      } else if (child.value) {\n        childHtml.appendChild(document.createTextNode(child.value));\n      }\n    }\n  }\n\n  static update(parameters) {\n    const transform = `matrix(${parameters.viewport.transform.join(\",\")})`;\n    parameters.div.style.transform = transform;\n    parameters.div.hidden = false;\n  }\n\n}\n\nexports.XfaLayer = XfaLayer;\n\n/***/ }),\n/* 23 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFNodeStream = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _network_utils = __w_pdfjs_require__(24);\n\n;\n\nconst fs = require(\"fs\");\n\nconst http = require(\"http\");\n\nconst https = require(\"https\");\n\nconst url = require(\"url\");\n\nconst fileUriRegex = /^file:\\/\\/\\/[a-zA-Z]:\\//;\n\nfunction parseUrl(sourceUrl) {\n  const parsedUrl = url.parse(sourceUrl);\n\n  if (parsedUrl.protocol === \"file:\" || parsedUrl.host) {\n    return parsedUrl;\n  }\n\n  if (/^[a-z]:[/\\\\]/i.test(sourceUrl)) {\n    return url.parse(`file:///${sourceUrl}`);\n  }\n\n  if (!parsedUrl.host) {\n    parsedUrl.protocol = \"file:\";\n  }\n\n  return parsedUrl;\n}\n\nclass PDFNodeStream {\n  constructor(source) {\n    this.source = source;\n    this.url = parseUrl(source.url);\n    this.isHttp = this.url.protocol === \"http:\" || this.url.protocol === \"https:\";\n    this.isFsUrl = this.url.protocol === \"file:\";\n    this.httpHeaders = this.isHttp && source.httpHeaders || {};\n    this._fullRequestReader = null;\n    this._rangeRequestReaders = [];\n  }\n\n  get _progressiveDataLength() {\n    return this._fullRequestReader?._loaded ?? 0;\n  }\n\n  getFullReader() {\n    (0, _util.assert)(!this._fullRequestReader, \"PDFNodeStream.getFullReader can only be called once.\");\n    this._fullRequestReader = this.isFsUrl ? new PDFNodeStreamFsFullReader(this) : new PDFNodeStreamFullReader(this);\n    return this._fullRequestReader;\n  }\n\n  getRangeReader(start, end) {\n    if (end <= this._progressiveDataLength) {\n      return null;\n    }\n\n    const rangeReader = this.isFsUrl ? new PDFNodeStreamFsRangeReader(this, start, end) : new PDFNodeStreamRangeReader(this, start, end);\n\n    this._rangeRequestReaders.push(rangeReader);\n\n    return rangeReader;\n  }\n\n  cancelAllRequests(reason) {\n    if (this._fullRequestReader) {\n      this._fullRequestReader.cancel(reason);\n    }\n\n    const readers = this._rangeRequestReaders.slice(0);\n\n    readers.forEach(function (reader) {\n      reader.cancel(reason);\n    });\n  }\n\n}\n\nexports.PDFNodeStream = PDFNodeStream;\n\nclass BaseFullReader {\n  constructor(stream) {\n    this._url = stream.url;\n    this._done = false;\n    this._storedError = null;\n    this.onProgress = null;\n    const source = stream.source;\n    this._contentLength = source.length;\n    this._loaded = 0;\n    this._filename = null;\n    this._disableRange = source.disableRange || false;\n    this._rangeChunkSize = source.rangeChunkSize;\n\n    if (!this._rangeChunkSize && !this._disableRange) {\n      this._disableRange = true;\n    }\n\n    this._isStreamingSupported = !source.disableStream;\n    this._isRangeSupported = !source.disableRange;\n    this._readableStream = null;\n    this._readCapability = (0, _util.createPromiseCapability)();\n    this._headersCapability = (0, _util.createPromiseCapability)();\n  }\n\n  get headersReady() {\n    return this._headersCapability.promise;\n  }\n\n  get filename() {\n    return this._filename;\n  }\n\n  get contentLength() {\n    return this._contentLength;\n  }\n\n  get isRangeSupported() {\n    return this._isRangeSupported;\n  }\n\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  }\n\n  async read() {\n    await this._readCapability.promise;\n\n    if (this._done) {\n      return {\n        value: undefined,\n        done: true\n      };\n    }\n\n    if (this._storedError) {\n      throw this._storedError;\n    }\n\n    const chunk = this._readableStream.read();\n\n    if (chunk === null) {\n      this._readCapability = (0, _util.createPromiseCapability)();\n      return this.read();\n    }\n\n    this._loaded += chunk.length;\n\n    if (this.onProgress) {\n      this.onProgress({\n        loaded: this._loaded,\n        total: this._contentLength\n      });\n    }\n\n    const buffer = new Uint8Array(chunk).buffer;\n    return {\n      value: buffer,\n      done: false\n    };\n  }\n\n  cancel(reason) {\n    if (!this._readableStream) {\n      this._error(reason);\n\n      return;\n    }\n\n    this._readableStream.destroy(reason);\n  }\n\n  _error(reason) {\n    this._storedError = reason;\n\n    this._readCapability.resolve();\n  }\n\n  _setReadableStream(readableStream) {\n    this._readableStream = readableStream;\n    readableStream.on(\"readable\", () => {\n      this._readCapability.resolve();\n    });\n    readableStream.on(\"end\", () => {\n      readableStream.destroy();\n      this._done = true;\n\n      this._readCapability.resolve();\n    });\n    readableStream.on(\"error\", reason => {\n      this._error(reason);\n    });\n\n    if (!this._isStreamingSupported && this._isRangeSupported) {\n      this._error(new _util.AbortException(\"streaming is disabled\"));\n    }\n\n    if (this._storedError) {\n      this._readableStream.destroy(this._storedError);\n    }\n  }\n\n}\n\nclass BaseRangeReader {\n  constructor(stream) {\n    this._url = stream.url;\n    this._done = false;\n    this._storedError = null;\n    this.onProgress = null;\n    this._loaded = 0;\n    this._readableStream = null;\n    this._readCapability = (0, _util.createPromiseCapability)();\n    const source = stream.source;\n    this._isStreamingSupported = !source.disableStream;\n  }\n\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  }\n\n  async read() {\n    await this._readCapability.promise;\n\n    if (this._done) {\n      return {\n        value: undefined,\n        done: true\n      };\n    }\n\n    if (this._storedError) {\n      throw this._storedError;\n    }\n\n    const chunk = this._readableStream.read();\n\n    if (chunk === null) {\n      this._readCapability = (0, _util.createPromiseCapability)();\n      return this.read();\n    }\n\n    this._loaded += chunk.length;\n\n    if (this.onProgress) {\n      this.onProgress({\n        loaded: this._loaded\n      });\n    }\n\n    const buffer = new Uint8Array(chunk).buffer;\n    return {\n      value: buffer,\n      done: false\n    };\n  }\n\n  cancel(reason) {\n    if (!this._readableStream) {\n      this._error(reason);\n\n      return;\n    }\n\n    this._readableStream.destroy(reason);\n  }\n\n  _error(reason) {\n    this._storedError = reason;\n\n    this._readCapability.resolve();\n  }\n\n  _setReadableStream(readableStream) {\n    this._readableStream = readableStream;\n    readableStream.on(\"readable\", () => {\n      this._readCapability.resolve();\n    });\n    readableStream.on(\"end\", () => {\n      readableStream.destroy();\n      this._done = true;\n\n      this._readCapability.resolve();\n    });\n    readableStream.on(\"error\", reason => {\n      this._error(reason);\n    });\n\n    if (this._storedError) {\n      this._readableStream.destroy(this._storedError);\n    }\n  }\n\n}\n\nfunction createRequestOptions(parsedUrl, headers) {\n  return {\n    protocol: parsedUrl.protocol,\n    auth: parsedUrl.auth,\n    host: parsedUrl.hostname,\n    port: parsedUrl.port,\n    path: parsedUrl.path,\n    method: \"GET\",\n    headers\n  };\n}\n\nclass PDFNodeStreamFullReader extends BaseFullReader {\n  constructor(stream) {\n    super(stream);\n\n    const handleResponse = response => {\n      if (response.statusCode === 404) {\n        const error = new _util.MissingPDFException(`Missing PDF \"${this._url}\".`);\n        this._storedError = error;\n\n        this._headersCapability.reject(error);\n\n        return;\n      }\n\n      this._headersCapability.resolve();\n\n      this._setReadableStream(response);\n\n      const getResponseHeader = name => {\n        return this._readableStream.headers[name.toLowerCase()];\n      };\n\n      const {\n        allowRangeRequests,\n        suggestedLength\n      } = (0, _network_utils.validateRangeRequestCapabilities)({\n        getResponseHeader,\n        isHttp: stream.isHttp,\n        rangeChunkSize: this._rangeChunkSize,\n        disableRange: this._disableRange\n      });\n      this._isRangeSupported = allowRangeRequests;\n      this._contentLength = suggestedLength || this._contentLength;\n      this._filename = (0, _network_utils.extractFilenameFromHeader)(getResponseHeader);\n    };\n\n    this._request = null;\n\n    if (this._url.protocol === \"http:\") {\n      this._request = http.request(createRequestOptions(this._url, stream.httpHeaders), handleResponse);\n    } else {\n      this._request = https.request(createRequestOptions(this._url, stream.httpHeaders), handleResponse);\n    }\n\n    this._request.on(\"error\", reason => {\n      this._storedError = reason;\n\n      this._headersCapability.reject(reason);\n    });\n\n    this._request.end();\n  }\n\n}\n\nclass PDFNodeStreamRangeReader extends BaseRangeReader {\n  constructor(stream, start, end) {\n    super(stream);\n    this._httpHeaders = {};\n\n    for (const property in stream.httpHeaders) {\n      const value = stream.httpHeaders[property];\n\n      if (typeof value === \"undefined\") {\n        continue;\n      }\n\n      this._httpHeaders[property] = value;\n    }\n\n    this._httpHeaders.Range = `bytes=${start}-${end - 1}`;\n\n    const handleResponse = response => {\n      if (response.statusCode === 404) {\n        const error = new _util.MissingPDFException(`Missing PDF \"${this._url}\".`);\n        this._storedError = error;\n        return;\n      }\n\n      this._setReadableStream(response);\n    };\n\n    this._request = null;\n\n    if (this._url.protocol === \"http:\") {\n      this._request = http.request(createRequestOptions(this._url, this._httpHeaders), handleResponse);\n    } else {\n      this._request = https.request(createRequestOptions(this._url, this._httpHeaders), handleResponse);\n    }\n\n    this._request.on(\"error\", reason => {\n      this._storedError = reason;\n    });\n\n    this._request.end();\n  }\n\n}\n\nclass PDFNodeStreamFsFullReader extends BaseFullReader {\n  constructor(stream) {\n    super(stream);\n    let path = decodeURIComponent(this._url.path);\n\n    if (fileUriRegex.test(this._url.href)) {\n      path = path.replace(/^\\//, \"\");\n    }\n\n    fs.lstat(path, (error, stat) => {\n      if (error) {\n        if (error.code === \"ENOENT\") {\n          error = new _util.MissingPDFException(`Missing PDF \"${path}\".`);\n        }\n\n        this._storedError = error;\n\n        this._headersCapability.reject(error);\n\n        return;\n      }\n\n      this._contentLength = stat.size;\n\n      this._setReadableStream(fs.createReadStream(path));\n\n      this._headersCapability.resolve();\n    });\n  }\n\n}\n\nclass PDFNodeStreamFsRangeReader extends BaseRangeReader {\n  constructor(stream, start, end) {\n    super(stream);\n    let path = decodeURIComponent(this._url.path);\n\n    if (fileUriRegex.test(this._url.href)) {\n      path = path.replace(/^\\//, \"\");\n    }\n\n    this._setReadableStream(fs.createReadStream(path, {\n      start,\n      end: end - 1\n    }));\n  }\n\n}\n\n/***/ }),\n/* 24 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.createResponseStatusError = createResponseStatusError;\nexports.extractFilenameFromHeader = extractFilenameFromHeader;\nexports.validateRangeRequestCapabilities = validateRangeRequestCapabilities;\nexports.validateResponseStatus = validateResponseStatus;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _content_disposition = __w_pdfjs_require__(25);\n\nvar _display_utils = __w_pdfjs_require__(1);\n\nfunction validateRangeRequestCapabilities({\n  getResponseHeader,\n  isHttp,\n  rangeChunkSize,\n  disableRange\n}) {\n  (0, _util.assert)(rangeChunkSize > 0, \"Range chunk size must be larger than zero\");\n  const returnValues = {\n    allowRangeRequests: false,\n    suggestedLength: undefined\n  };\n  const length = parseInt(getResponseHeader(\"Content-Length\"), 10);\n\n  if (!Number.isInteger(length)) {\n    return returnValues;\n  }\n\n  returnValues.suggestedLength = length;\n\n  if (length <= 2 * rangeChunkSize) {\n    return returnValues;\n  }\n\n  if (disableRange || !isHttp) {\n    return returnValues;\n  }\n\n  if (getResponseHeader(\"Accept-Ranges\") !== \"bytes\") {\n    return returnValues;\n  }\n\n  const contentEncoding = getResponseHeader(\"Content-Encoding\") || \"identity\";\n\n  if (contentEncoding !== \"identity\") {\n    return returnValues;\n  }\n\n  returnValues.allowRangeRequests = true;\n  return returnValues;\n}\n\nfunction extractFilenameFromHeader(getResponseHeader) {\n  const contentDisposition = getResponseHeader(\"Content-Disposition\");\n\n  if (contentDisposition) {\n    let filename = (0, _content_disposition.getFilenameFromContentDispositionHeader)(contentDisposition);\n\n    if (filename.includes(\"%\")) {\n      try {\n        filename = decodeURIComponent(filename);\n      } catch (ex) {}\n    }\n\n    if ((0, _display_utils.isPdfFile)(filename)) {\n      return filename;\n    }\n  }\n\n  return null;\n}\n\nfunction createResponseStatusError(status, url) {\n  if (status === 404 || status === 0 && url.startsWith(\"file:\")) {\n    return new _util.MissingPDFException('Missing PDF \"' + url + '\".');\n  }\n\n  return new _util.UnexpectedResponseException(`Unexpected server response (${status}) while retrieving PDF \"${url}\".`, status);\n}\n\nfunction validateResponseStatus(status) {\n  return status === 200 || status === 206;\n}\n\n/***/ }),\n/* 25 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.getFilenameFromContentDispositionHeader = getFilenameFromContentDispositionHeader;\n\nfunction getFilenameFromContentDispositionHeader(contentDisposition) {\n  let needsEncodingFixup = true;\n  let tmp = toParamRegExp(\"filename\\\\*\", \"i\").exec(contentDisposition);\n\n  if (tmp) {\n    tmp = tmp[1];\n    let filename = rfc2616unquote(tmp);\n    filename = unescape(filename);\n    filename = rfc5987decode(filename);\n    filename = rfc2047decode(filename);\n    return fixupEncoding(filename);\n  }\n\n  tmp = rfc2231getparam(contentDisposition);\n\n  if (tmp) {\n    const filename = rfc2047decode(tmp);\n    return fixupEncoding(filename);\n  }\n\n  tmp = toParamRegExp(\"filename\", \"i\").exec(contentDisposition);\n\n  if (tmp) {\n    tmp = tmp[1];\n    let filename = rfc2616unquote(tmp);\n    filename = rfc2047decode(filename);\n    return fixupEncoding(filename);\n  }\n\n  function toParamRegExp(attributePattern, flags) {\n    return new RegExp(\"(?:^|;)\\\\s*\" + attributePattern + \"\\\\s*=\\\\s*\" + \"(\" + '[^\";\\\\s][^;\\\\s]*' + \"|\" + '\"(?:[^\"\\\\\\\\]|\\\\\\\\\"?)+\"?' + \")\", flags);\n  }\n\n  function textdecode(encoding, value) {\n    if (encoding) {\n      if (!/^[\\x00-\\xFF]+$/.test(value)) {\n        return value;\n      }\n\n      try {\n        const decoder = new TextDecoder(encoding, {\n          fatal: true\n        });\n        const bytes = Array.from(value, function (ch) {\n          return ch.charCodeAt(0) & 0xff;\n        });\n        value = decoder.decode(new Uint8Array(bytes));\n        needsEncodingFixup = false;\n      } catch (e) {\n        if (/^utf-?8$/i.test(encoding)) {\n          try {\n            value = decodeURIComponent(escape(value));\n            needsEncodingFixup = false;\n          } catch (err) {}\n        }\n      }\n    }\n\n    return value;\n  }\n\n  function fixupEncoding(value) {\n    if (needsEncodingFixup && /[\\x80-\\xff]/.test(value)) {\n      value = textdecode(\"utf-8\", value);\n\n      if (needsEncodingFixup) {\n        value = textdecode(\"iso-8859-1\", value);\n      }\n    }\n\n    return value;\n  }\n\n  function rfc2231getparam(contentDispositionStr) {\n    const matches = [];\n    let match;\n    const iter = toParamRegExp(\"filename\\\\*((?!0\\\\d)\\\\d+)(\\\\*?)\", \"ig\");\n\n    while ((match = iter.exec(contentDispositionStr)) !== null) {\n      let [, n, quot, part] = match;\n      n = parseInt(n, 10);\n\n      if (n in matches) {\n        if (n === 0) {\n          break;\n        }\n\n        continue;\n      }\n\n      matches[n] = [quot, part];\n    }\n\n    const parts = [];\n\n    for (let n = 0; n < matches.length; ++n) {\n      if (!(n in matches)) {\n        break;\n      }\n\n      let [quot, part] = matches[n];\n      part = rfc2616unquote(part);\n\n      if (quot) {\n        part = unescape(part);\n\n        if (n === 0) {\n          part = rfc5987decode(part);\n        }\n      }\n\n      parts.push(part);\n    }\n\n    return parts.join(\"\");\n  }\n\n  function rfc2616unquote(value) {\n    if (value.startsWith('\"')) {\n      const parts = value.slice(1).split('\\\\\"');\n\n      for (let i = 0; i < parts.length; ++i) {\n        const quotindex = parts[i].indexOf('\"');\n\n        if (quotindex !== -1) {\n          parts[i] = parts[i].slice(0, quotindex);\n          parts.length = i + 1;\n        }\n\n        parts[i] = parts[i].replace(/\\\\(.)/g, \"$1\");\n      }\n\n      value = parts.join('\"');\n    }\n\n    return value;\n  }\n\n  function rfc5987decode(extvalue) {\n    const encodingend = extvalue.indexOf(\"'\");\n\n    if (encodingend === -1) {\n      return extvalue;\n    }\n\n    const encoding = extvalue.slice(0, encodingend);\n    const langvalue = extvalue.slice(encodingend + 1);\n    const value = langvalue.replace(/^[^']*'/, \"\");\n    return textdecode(encoding, value);\n  }\n\n  function rfc2047decode(value) {\n    if (!value.startsWith(\"=?\") || /[\\x00-\\x19\\x80-\\xff]/.test(value)) {\n      return value;\n    }\n\n    return value.replace(/=\\?([\\w-]*)\\?([QqBb])\\?((?:[^?]|\\?(?!=))*)\\?=/g, function (matches, charset, encoding, text) {\n      if (encoding === \"q\" || encoding === \"Q\") {\n        text = text.replace(/_/g, \" \");\n        text = text.replace(/=([0-9a-fA-F]{2})/g, function (match, hex) {\n          return String.fromCharCode(parseInt(hex, 16));\n        });\n        return textdecode(charset, text);\n      }\n\n      try {\n        text = atob(text);\n      } catch (e) {}\n\n      return textdecode(charset, text);\n    });\n  }\n\n  return \"\";\n}\n\n/***/ }),\n/* 26 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFNetworkStream = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _network_utils = __w_pdfjs_require__(24);\n\n;\nconst OK_RESPONSE = 200;\nconst PARTIAL_CONTENT_RESPONSE = 206;\n\nfunction getArrayBuffer(xhr) {\n  const data = xhr.response;\n\n  if (typeof data !== \"string\") {\n    return data;\n  }\n\n  const array = (0, _util.stringToBytes)(data);\n  return array.buffer;\n}\n\nclass NetworkManager {\n  constructor(url, args) {\n    this.url = url;\n    args = args || {};\n    this.isHttp = /^https?:/i.test(url);\n    this.httpHeaders = this.isHttp && args.httpHeaders || {};\n    this.withCredentials = args.withCredentials || false;\n\n    this.getXhr = args.getXhr || function NetworkManager_getXhr() {\n      return new XMLHttpRequest();\n    };\n\n    this.currXhrId = 0;\n    this.pendingRequests = Object.create(null);\n  }\n\n  requestRange(begin, end, listeners) {\n    const args = {\n      begin,\n      end\n    };\n\n    for (const prop in listeners) {\n      args[prop] = listeners[prop];\n    }\n\n    return this.request(args);\n  }\n\n  requestFull(listeners) {\n    return this.request(listeners);\n  }\n\n  request(args) {\n    const xhr = this.getXhr();\n    const xhrId = this.currXhrId++;\n    const pendingRequest = this.pendingRequests[xhrId] = {\n      xhr\n    };\n    xhr.open(\"GET\", this.url);\n    xhr.withCredentials = this.withCredentials;\n\n    for (const property in this.httpHeaders) {\n      const value = this.httpHeaders[property];\n\n      if (typeof value === \"undefined\") {\n        continue;\n      }\n\n      xhr.setRequestHeader(property, value);\n    }\n\n    if (this.isHttp && \"begin\" in args && \"end\" in args) {\n      xhr.setRequestHeader(\"Range\", `bytes=${args.begin}-${args.end - 1}`);\n      pendingRequest.expectedStatus = PARTIAL_CONTENT_RESPONSE;\n    } else {\n      pendingRequest.expectedStatus = OK_RESPONSE;\n    }\n\n    xhr.responseType = \"arraybuffer\";\n\n    if (args.onError) {\n      xhr.onerror = function (evt) {\n        args.onError(xhr.status);\n      };\n    }\n\n    xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);\n    xhr.onprogress = this.onProgress.bind(this, xhrId);\n    pendingRequest.onHeadersReceived = args.onHeadersReceived;\n    pendingRequest.onDone = args.onDone;\n    pendingRequest.onError = args.onError;\n    pendingRequest.onProgress = args.onProgress;\n    xhr.send(null);\n    return xhrId;\n  }\n\n  onProgress(xhrId, evt) {\n    const pendingRequest = this.pendingRequests[xhrId];\n\n    if (!pendingRequest) {\n      return;\n    }\n\n    if (pendingRequest.onProgress) {\n      pendingRequest.onProgress(evt);\n    }\n  }\n\n  onStateChange(xhrId, evt) {\n    const pendingRequest = this.pendingRequests[xhrId];\n\n    if (!pendingRequest) {\n      return;\n    }\n\n    const xhr = pendingRequest.xhr;\n\n    if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {\n      pendingRequest.onHeadersReceived();\n      delete pendingRequest.onHeadersReceived;\n    }\n\n    if (xhr.readyState !== 4) {\n      return;\n    }\n\n    if (!(xhrId in this.pendingRequests)) {\n      return;\n    }\n\n    delete this.pendingRequests[xhrId];\n\n    if (xhr.status === 0 && this.isHttp) {\n      if (pendingRequest.onError) {\n        pendingRequest.onError(xhr.status);\n      }\n\n      return;\n    }\n\n    const xhrStatus = xhr.status || OK_RESPONSE;\n    const ok_response_on_range_request = xhrStatus === OK_RESPONSE && pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;\n\n    if (!ok_response_on_range_request && xhrStatus !== pendingRequest.expectedStatus) {\n      if (pendingRequest.onError) {\n        pendingRequest.onError(xhr.status);\n      }\n\n      return;\n    }\n\n    const chunk = getArrayBuffer(xhr);\n\n    if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {\n      const rangeHeader = xhr.getResponseHeader(\"Content-Range\");\n      const matches = /bytes (\\d+)-(\\d+)\\/(\\d+)/.exec(rangeHeader);\n      pendingRequest.onDone({\n        begin: parseInt(matches[1], 10),\n        chunk\n      });\n    } else if (chunk) {\n      pendingRequest.onDone({\n        begin: 0,\n        chunk\n      });\n    } else if (pendingRequest.onError) {\n      pendingRequest.onError(xhr.status);\n    }\n  }\n\n  getRequestXhr(xhrId) {\n    return this.pendingRequests[xhrId].xhr;\n  }\n\n  isPendingRequest(xhrId) {\n    return xhrId in this.pendingRequests;\n  }\n\n  abortRequest(xhrId) {\n    const xhr = this.pendingRequests[xhrId].xhr;\n    delete this.pendingRequests[xhrId];\n    xhr.abort();\n  }\n\n}\n\nclass PDFNetworkStream {\n  constructor(source) {\n    this._source = source;\n    this._manager = new NetworkManager(source.url, {\n      httpHeaders: source.httpHeaders,\n      withCredentials: source.withCredentials\n    });\n    this._rangeChunkSize = source.rangeChunkSize;\n    this._fullRequestReader = null;\n    this._rangeRequestReaders = [];\n  }\n\n  _onRangeRequestReaderClosed(reader) {\n    const i = this._rangeRequestReaders.indexOf(reader);\n\n    if (i >= 0) {\n      this._rangeRequestReaders.splice(i, 1);\n    }\n  }\n\n  getFullReader() {\n    (0, _util.assert)(!this._fullRequestReader, \"PDFNetworkStream.getFullReader can only be called once.\");\n    this._fullRequestReader = new PDFNetworkStreamFullRequestReader(this._manager, this._source);\n    return this._fullRequestReader;\n  }\n\n  getRangeReader(begin, end) {\n    const reader = new PDFNetworkStreamRangeRequestReader(this._manager, begin, end);\n    reader.onClosed = this._onRangeRequestReaderClosed.bind(this);\n\n    this._rangeRequestReaders.push(reader);\n\n    return reader;\n  }\n\n  cancelAllRequests(reason) {\n    if (this._fullRequestReader) {\n      this._fullRequestReader.cancel(reason);\n    }\n\n    const readers = this._rangeRequestReaders.slice(0);\n\n    readers.forEach(function (reader) {\n      reader.cancel(reason);\n    });\n  }\n\n}\n\nexports.PDFNetworkStream = PDFNetworkStream;\n\nclass PDFNetworkStreamFullRequestReader {\n  constructor(manager, source) {\n    this._manager = manager;\n    const args = {\n      onHeadersReceived: this._onHeadersReceived.bind(this),\n      onDone: this._onDone.bind(this),\n      onError: this._onError.bind(this),\n      onProgress: this._onProgress.bind(this)\n    };\n    this._url = source.url;\n    this._fullRequestId = manager.requestFull(args);\n    this._headersReceivedCapability = (0, _util.createPromiseCapability)();\n    this._disableRange = source.disableRange || false;\n    this._contentLength = source.length;\n    this._rangeChunkSize = source.rangeChunkSize;\n\n    if (!this._rangeChunkSize && !this._disableRange) {\n      this._disableRange = true;\n    }\n\n    this._isStreamingSupported = false;\n    this._isRangeSupported = false;\n    this._cachedChunks = [];\n    this._requests = [];\n    this._done = false;\n    this._storedError = undefined;\n    this._filename = null;\n    this.onProgress = null;\n  }\n\n  _onHeadersReceived() {\n    const fullRequestXhrId = this._fullRequestId;\n\n    const fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId);\n\n    const getResponseHeader = name => {\n      return fullRequestXhr.getResponseHeader(name);\n    };\n\n    const {\n      allowRangeRequests,\n      suggestedLength\n    } = (0, _network_utils.validateRangeRequestCapabilities)({\n      getResponseHeader,\n      isHttp: this._manager.isHttp,\n      rangeChunkSize: this._rangeChunkSize,\n      disableRange: this._disableRange\n    });\n\n    if (allowRangeRequests) {\n      this._isRangeSupported = true;\n    }\n\n    this._contentLength = suggestedLength || this._contentLength;\n    this._filename = (0, _network_utils.extractFilenameFromHeader)(getResponseHeader);\n\n    if (this._isRangeSupported) {\n      this._manager.abortRequest(fullRequestXhrId);\n    }\n\n    this._headersReceivedCapability.resolve();\n  }\n\n  _onDone(args) {\n    if (args) {\n      if (this._requests.length > 0) {\n        const requestCapability = this._requests.shift();\n\n        requestCapability.resolve({\n          value: args.chunk,\n          done: false\n        });\n      } else {\n        this._cachedChunks.push(args.chunk);\n      }\n    }\n\n    this._done = true;\n\n    if (this._cachedChunks.length > 0) {\n      return;\n    }\n\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.resolve({\n        value: undefined,\n        done: true\n      });\n    });\n\n    this._requests = [];\n  }\n\n  _onError(status) {\n    const url = this._url;\n    const exception = (0, _network_utils.createResponseStatusError)(status, url);\n    this._storedError = exception;\n\n    this._headersReceivedCapability.reject(exception);\n\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.reject(exception);\n    });\n\n    this._requests = [];\n    this._cachedChunks = [];\n  }\n\n  _onProgress(data) {\n    if (this.onProgress) {\n      this.onProgress({\n        loaded: data.loaded,\n        total: data.lengthComputable ? data.total : this._contentLength\n      });\n    }\n  }\n\n  get filename() {\n    return this._filename;\n  }\n\n  get isRangeSupported() {\n    return this._isRangeSupported;\n  }\n\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  }\n\n  get contentLength() {\n    return this._contentLength;\n  }\n\n  get headersReady() {\n    return this._headersReceivedCapability.promise;\n  }\n\n  async read() {\n    if (this._storedError) {\n      throw this._storedError;\n    }\n\n    if (this._cachedChunks.length > 0) {\n      const chunk = this._cachedChunks.shift();\n\n      return {\n        value: chunk,\n        done: false\n      };\n    }\n\n    if (this._done) {\n      return {\n        value: undefined,\n        done: true\n      };\n    }\n\n    const requestCapability = (0, _util.createPromiseCapability)();\n\n    this._requests.push(requestCapability);\n\n    return requestCapability.promise;\n  }\n\n  cancel(reason) {\n    this._done = true;\n\n    this._headersReceivedCapability.reject(reason);\n\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.resolve({\n        value: undefined,\n        done: true\n      });\n    });\n\n    this._requests = [];\n\n    if (this._manager.isPendingRequest(this._fullRequestId)) {\n      this._manager.abortRequest(this._fullRequestId);\n    }\n\n    this._fullRequestReader = null;\n  }\n\n}\n\nclass PDFNetworkStreamRangeRequestReader {\n  constructor(manager, begin, end) {\n    this._manager = manager;\n    const args = {\n      onDone: this._onDone.bind(this),\n      onProgress: this._onProgress.bind(this)\n    };\n    this._requestId = manager.requestRange(begin, end, args);\n    this._requests = [];\n    this._queuedChunk = null;\n    this._done = false;\n    this.onProgress = null;\n    this.onClosed = null;\n  }\n\n  _close() {\n    if (this.onClosed) {\n      this.onClosed(this);\n    }\n  }\n\n  _onDone(data) {\n    const chunk = data.chunk;\n\n    if (this._requests.length > 0) {\n      const requestCapability = this._requests.shift();\n\n      requestCapability.resolve({\n        value: chunk,\n        done: false\n      });\n    } else {\n      this._queuedChunk = chunk;\n    }\n\n    this._done = true;\n\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.resolve({\n        value: undefined,\n        done: true\n      });\n    });\n\n    this._requests = [];\n\n    this._close();\n  }\n\n  _onProgress(evt) {\n    if (!this.isStreamingSupported && this.onProgress) {\n      this.onProgress({\n        loaded: evt.loaded\n      });\n    }\n  }\n\n  get isStreamingSupported() {\n    return false;\n  }\n\n  async read() {\n    if (this._queuedChunk !== null) {\n      const chunk = this._queuedChunk;\n      this._queuedChunk = null;\n      return {\n        value: chunk,\n        done: false\n      };\n    }\n\n    if (this._done) {\n      return {\n        value: undefined,\n        done: true\n      };\n    }\n\n    const requestCapability = (0, _util.createPromiseCapability)();\n\n    this._requests.push(requestCapability);\n\n    return requestCapability.promise;\n  }\n\n  cancel(reason) {\n    this._done = true;\n\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.resolve({\n        value: undefined,\n        done: true\n      });\n    });\n\n    this._requests = [];\n\n    if (this._manager.isPendingRequest(this._requestId)) {\n      this._manager.abortRequest(this._requestId);\n    }\n\n    this._close();\n  }\n\n}\n\n/***/ }),\n/* 27 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFFetchStream = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _network_utils = __w_pdfjs_require__(24);\n\n;\n\nfunction createFetchOptions(headers, withCredentials, abortController) {\n  return {\n    method: \"GET\",\n    headers,\n    signal: abortController?.signal,\n    mode: \"cors\",\n    credentials: withCredentials ? \"include\" : \"same-origin\",\n    redirect: \"follow\"\n  };\n}\n\nfunction createHeaders(httpHeaders) {\n  const headers = new Headers();\n\n  for (const property in httpHeaders) {\n    const value = httpHeaders[property];\n\n    if (typeof value === \"undefined\") {\n      continue;\n    }\n\n    headers.append(property, value);\n  }\n\n  return headers;\n}\n\nclass PDFFetchStream {\n  constructor(source) {\n    this.source = source;\n    this.isHttp = /^https?:/i.test(source.url);\n    this.httpHeaders = this.isHttp && source.httpHeaders || {};\n    this._fullRequestReader = null;\n    this._rangeRequestReaders = [];\n  }\n\n  get _progressiveDataLength() {\n    return this._fullRequestReader?._loaded ?? 0;\n  }\n\n  getFullReader() {\n    (0, _util.assert)(!this._fullRequestReader, \"PDFFetchStream.getFullReader can only be called once.\");\n    this._fullRequestReader = new PDFFetchStreamReader(this);\n    return this._fullRequestReader;\n  }\n\n  getRangeReader(begin, end) {\n    if (end <= this._progressiveDataLength) {\n      return null;\n    }\n\n    const reader = new PDFFetchStreamRangeReader(this, begin, end);\n\n    this._rangeRequestReaders.push(reader);\n\n    return reader;\n  }\n\n  cancelAllRequests(reason) {\n    if (this._fullRequestReader) {\n      this._fullRequestReader.cancel(reason);\n    }\n\n    const readers = this._rangeRequestReaders.slice(0);\n\n    readers.forEach(function (reader) {\n      reader.cancel(reason);\n    });\n  }\n\n}\n\nexports.PDFFetchStream = PDFFetchStream;\n\nclass PDFFetchStreamReader {\n  constructor(stream) {\n    this._stream = stream;\n    this._reader = null;\n    this._loaded = 0;\n    this._filename = null;\n    const source = stream.source;\n    this._withCredentials = source.withCredentials || false;\n    this._contentLength = source.length;\n    this._headersCapability = (0, _util.createPromiseCapability)();\n    this._disableRange = source.disableRange || false;\n    this._rangeChunkSize = source.rangeChunkSize;\n\n    if (!this._rangeChunkSize && !this._disableRange) {\n      this._disableRange = true;\n    }\n\n    if (typeof AbortController !== \"undefined\") {\n      this._abortController = new AbortController();\n    }\n\n    this._isStreamingSupported = !source.disableStream;\n    this._isRangeSupported = !source.disableRange;\n    this._headers = createHeaders(this._stream.httpHeaders);\n    const url = source.url;\n    fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(response => {\n      if (!(0, _network_utils.validateResponseStatus)(response.status)) {\n        throw (0, _network_utils.createResponseStatusError)(response.status, url);\n      }\n\n      this._reader = response.body.getReader();\n\n      this._headersCapability.resolve();\n\n      const getResponseHeader = name => {\n        return response.headers.get(name);\n      };\n\n      const {\n        allowRangeRequests,\n        suggestedLength\n      } = (0, _network_utils.validateRangeRequestCapabilities)({\n        getResponseHeader,\n        isHttp: this._stream.isHttp,\n        rangeChunkSize: this._rangeChunkSize,\n        disableRange: this._disableRange\n      });\n      this._isRangeSupported = allowRangeRequests;\n      this._contentLength = suggestedLength || this._contentLength;\n      this._filename = (0, _network_utils.extractFilenameFromHeader)(getResponseHeader);\n\n      if (!this._isStreamingSupported && this._isRangeSupported) {\n        this.cancel(new _util.AbortException(\"Streaming is disabled.\"));\n      }\n    }).catch(this._headersCapability.reject);\n    this.onProgress = null;\n  }\n\n  get headersReady() {\n    return this._headersCapability.promise;\n  }\n\n  get filename() {\n    return this._filename;\n  }\n\n  get contentLength() {\n    return this._contentLength;\n  }\n\n  get isRangeSupported() {\n    return this._isRangeSupported;\n  }\n\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  }\n\n  async read() {\n    await this._headersCapability.promise;\n    const {\n      value,\n      done\n    } = await this._reader.read();\n\n    if (done) {\n      return {\n        value,\n        done\n      };\n    }\n\n    this._loaded += value.byteLength;\n\n    if (this.onProgress) {\n      this.onProgress({\n        loaded: this._loaded,\n        total: this._contentLength\n      });\n    }\n\n    const buffer = new Uint8Array(value).buffer;\n    return {\n      value: buffer,\n      done: false\n    };\n  }\n\n  cancel(reason) {\n    if (this._reader) {\n      this._reader.cancel(reason);\n    }\n\n    if (this._abortController) {\n      this._abortController.abort();\n    }\n  }\n\n}\n\nclass PDFFetchStreamRangeReader {\n  constructor(stream, begin, end) {\n    this._stream = stream;\n    this._reader = null;\n    this._loaded = 0;\n    const source = stream.source;\n    this._withCredentials = source.withCredentials || false;\n    this._readCapability = (0, _util.createPromiseCapability)();\n    this._isStreamingSupported = !source.disableStream;\n\n    if (typeof AbortController !== \"undefined\") {\n      this._abortController = new AbortController();\n    }\n\n    this._headers = createHeaders(this._stream.httpHeaders);\n\n    this._headers.append(\"Range\", `bytes=${begin}-${end - 1}`);\n\n    const url = source.url;\n    fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(response => {\n      if (!(0, _network_utils.validateResponseStatus)(response.status)) {\n        throw (0, _network_utils.createResponseStatusError)(response.status, url);\n      }\n\n      this._readCapability.resolve();\n\n      this._reader = response.body.getReader();\n    }).catch(reason => {\n      if (reason?.name === \"AbortError\") {\n        return;\n      }\n\n      throw reason;\n    });\n    this.onProgress = null;\n  }\n\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  }\n\n  async read() {\n    await this._readCapability.promise;\n    const {\n      value,\n      done\n    } = await this._reader.read();\n\n    if (done) {\n      return {\n        value,\n        done\n      };\n    }\n\n    this._loaded += value.byteLength;\n\n    if (this.onProgress) {\n      this.onProgress({\n        loaded: this._loaded\n      });\n    }\n\n    const buffer = new Uint8Array(value).buffer;\n    return {\n      value: buffer,\n      done: false\n    };\n  }\n\n  cancel(reason) {\n    if (this._reader) {\n      this._reader.cancel(reason);\n    }\n\n    if (this._abortController) {\n      this._abortController.abort();\n    }\n  }\n\n}\n\n/***/ })\n/******/ \t]);\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __w_pdfjs_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __w_pdfjs_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.\n(() => {\nvar exports = __webpack_exports__;\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nObject.defineProperty(exports, \"addLinkAttributes\", ({\n  enumerable: true,\n  get: function () {\n    return _display_utils.addLinkAttributes;\n  }\n}));\nObject.defineProperty(exports, \"getFilenameFromUrl\", ({\n  enumerable: true,\n  get: function () {\n    return _display_utils.getFilenameFromUrl;\n  }\n}));\nObject.defineProperty(exports, \"getPdfFilenameFromUrl\", ({\n  enumerable: true,\n  get: function () {\n    return _display_utils.getPdfFilenameFromUrl;\n  }\n}));\nObject.defineProperty(exports, \"isPdfFile\", ({\n  enumerable: true,\n  get: function () {\n    return _display_utils.isPdfFile;\n  }\n}));\nObject.defineProperty(exports, \"LinkTarget\", ({\n  enumerable: true,\n  get: function () {\n    return _display_utils.LinkTarget;\n  }\n}));\nObject.defineProperty(exports, \"loadScript\", ({\n  enumerable: true,\n  get: function () {\n    return _display_utils.loadScript;\n  }\n}));\nObject.defineProperty(exports, \"PDFDateString\", ({\n  enumerable: true,\n  get: function () {\n    return _display_utils.PDFDateString;\n  }\n}));\nObject.defineProperty(exports, \"RenderingCancelledException\", ({\n  enumerable: true,\n  get: function () {\n    return _display_utils.RenderingCancelledException;\n  }\n}));\nObject.defineProperty(exports, \"build\", ({\n  enumerable: true,\n  get: function () {\n    return _api.build;\n  }\n}));\nObject.defineProperty(exports, \"getDocument\", ({\n  enumerable: true,\n  get: function () {\n    return _api.getDocument;\n  }\n}));\nObject.defineProperty(exports, \"LoopbackPort\", ({\n  enumerable: true,\n  get: function () {\n    return _api.LoopbackPort;\n  }\n}));\nObject.defineProperty(exports, \"PDFDataRangeTransport\", ({\n  enumerable: true,\n  get: function () {\n    return _api.PDFDataRangeTransport;\n  }\n}));\nObject.defineProperty(exports, \"PDFWorker\", ({\n  enumerable: true,\n  get: function () {\n    return _api.PDFWorker;\n  }\n}));\nObject.defineProperty(exports, \"version\", ({\n  enumerable: true,\n  get: function () {\n    return _api.version;\n  }\n}));\nObject.defineProperty(exports, \"CMapCompressionType\", ({\n  enumerable: true,\n  get: function () {\n    return _util.CMapCompressionType;\n  }\n}));\nObject.defineProperty(exports, \"createObjectURL\", ({\n  enumerable: true,\n  get: function () {\n    return _util.createObjectURL;\n  }\n}));\nObject.defineProperty(exports, \"createPromiseCapability\", ({\n  enumerable: true,\n  get: function () {\n    return _util.createPromiseCapability;\n  }\n}));\nObject.defineProperty(exports, \"createValidAbsoluteUrl\", ({\n  enumerable: true,\n  get: function () {\n    return _util.createValidAbsoluteUrl;\n  }\n}));\nObject.defineProperty(exports, \"InvalidPDFException\", ({\n  enumerable: true,\n  get: function () {\n    return _util.InvalidPDFException;\n  }\n}));\nObject.defineProperty(exports, \"MissingPDFException\", ({\n  enumerable: true,\n  get: function () {\n    return _util.MissingPDFException;\n  }\n}));\nObject.defineProperty(exports, \"OPS\", ({\n  enumerable: true,\n  get: function () {\n    return _util.OPS;\n  }\n}));\nObject.defineProperty(exports, \"PasswordResponses\", ({\n  enumerable: true,\n  get: function () {\n    return _util.PasswordResponses;\n  }\n}));\nObject.defineProperty(exports, \"PermissionFlag\", ({\n  enumerable: true,\n  get: function () {\n    return _util.PermissionFlag;\n  }\n}));\nObject.defineProperty(exports, \"removeNullCharacters\", ({\n  enumerable: true,\n  get: function () {\n    return _util.removeNullCharacters;\n  }\n}));\nObject.defineProperty(exports, \"shadow\", ({\n  enumerable: true,\n  get: function () {\n    return _util.shadow;\n  }\n}));\nObject.defineProperty(exports, \"UnexpectedResponseException\", ({\n  enumerable: true,\n  get: function () {\n    return _util.UnexpectedResponseException;\n  }\n}));\nObject.defineProperty(exports, \"UNSUPPORTED_FEATURES\", ({\n  enumerable: true,\n  get: function () {\n    return _util.UNSUPPORTED_FEATURES;\n  }\n}));\nObject.defineProperty(exports, \"Util\", ({\n  enumerable: true,\n  get: function () {\n    return _util.Util;\n  }\n}));\nObject.defineProperty(exports, \"VerbosityLevel\", ({\n  enumerable: true,\n  get: function () {\n    return _util.VerbosityLevel;\n  }\n}));\nObject.defineProperty(exports, \"AnnotationLayer\", ({\n  enumerable: true,\n  get: function () {\n    return _annotation_layer.AnnotationLayer;\n  }\n}));\nObject.defineProperty(exports, \"apiCompatibilityParams\", ({\n  enumerable: true,\n  get: function () {\n    return _api_compatibility.apiCompatibilityParams;\n  }\n}));\nObject.defineProperty(exports, \"GlobalWorkerOptions\", ({\n  enumerable: true,\n  get: function () {\n    return _worker_options.GlobalWorkerOptions;\n  }\n}));\nObject.defineProperty(exports, \"renderTextLayer\", ({\n  enumerable: true,\n  get: function () {\n    return _text_layer.renderTextLayer;\n  }\n}));\nObject.defineProperty(exports, \"SVGGraphics\", ({\n  enumerable: true,\n  get: function () {\n    return _svg.SVGGraphics;\n  }\n}));\nObject.defineProperty(exports, \"XfaLayer\", ({\n  enumerable: true,\n  get: function () {\n    return _xfa_layer.XfaLayer;\n  }\n}));\n\nvar _display_utils = __w_pdfjs_require__(1);\n\nvar _api = __w_pdfjs_require__(5);\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _annotation_layer = __w_pdfjs_require__(18);\n\nvar _api_compatibility = __w_pdfjs_require__(9);\n\nvar _worker_options = __w_pdfjs_require__(12);\n\nvar _text_layer = __w_pdfjs_require__(20);\n\nvar _svg = __w_pdfjs_require__(21);\n\nvar _xfa_layer = __w_pdfjs_require__(22);\n\nconst pdfjsVersion = '2.8.335';\nconst pdfjsBuild = '228adbf67';\n{\n  const {\n    isNodeJS\n  } = __w_pdfjs_require__(4);\n\n  if (isNodeJS) {\n    const PDFNodeStream = __w_pdfjs_require__(23).PDFNodeStream;\n\n    (0, _api.setPDFNetworkStreamFactory)(params => {\n      return new PDFNodeStream(params);\n    });\n  } else {\n    const PDFNetworkStream = __w_pdfjs_require__(26).PDFNetworkStream;\n\n    let PDFFetchStream;\n\n    if ((0, _display_utils.isFetchSupported)()) {\n      PDFFetchStream = __w_pdfjs_require__(27).PDFFetchStream;\n    }\n\n    (0, _api.setPDFNetworkStreamFactory)(params => {\n      if (PDFFetchStream && (0, _display_utils.isValidFetchUrl)(params.url)) {\n        return new PDFFetchStream(params);\n      }\n\n      return new PDFNetworkStream(params);\n    });\n  }\n}\n})();\n\n/******/ \treturn __webpack_exports__;\n/******/ })()\n;\n});\n//# sourceMappingURL=pdf.js.map"
  },
  {
    "path": "lib/pdf.js/build/pdf.sandbox.js",
    "content": "/**\n * @licstart The following is the entire license notice for the\n * Javascript code in this page\n *\n * Copyright 2021 Mozilla Foundation\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 * @licend The above is the entire license notice for the\n * Javascript code in this page\n */\n\n(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(\"pdfjs-dist/build/pdf.sandbox\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"pdfjs-dist/build/pdf.sandbox\"] = factory();\n\telse\n\t\troot[\"pdfjs-dist/build/pdf.sandbox\"] = root.pdfjsSandbox = factory();\n})(this, function() {\nreturn /******/ (() => { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \tvar __webpack_modules__ = ([\n/* 0 */,\n/* 1 */\n/***/ ((__unused_webpack_module, exports) => {\n\nObject.defineProperty(exports, \"__esModule\", ({value:true}));exports.default=void 0;var Module=function(){var _scriptDir=typeof document!=='undefined'&&document.currentScript?document.currentScript.src:undefined;return function(Module){Module=Module||{};var b;b||(b=typeof Module!=='undefined'?Module:{});var h,n;b.ready=new Promise(function(a,c){h=a;n=c;});var q={},r;for(r in b)b.hasOwnProperty(r)&&(q[r]=b[r]);var t=\"\";\"undefined\"!==typeof document&&document.currentScript&&(t=document.currentScript.src);_scriptDir&&(t=_scriptDir);0!==t.indexOf(\"blob:\")?t=t.substr(0,t.lastIndexOf(\"/\")+1):t=\"\";var aa=b.print||console.log.bind(console),u=b.printErr||console.warn.bind(console);for(r in q)q.hasOwnProperty(r)&&(b[r]=q[r]);q=null;var v;b.wasmBinary&&(v=b.wasmBinary);var noExitRuntime;b.noExitRuntime&&(noExitRuntime=b.noExitRuntime);\"object\"!==typeof WebAssembly&&w(\"no native wasm support detected\");var x,y=!1;function A(a){var c=b[\"_\"+a];c||w(\"Assertion failed: Cannot call unknown function \"+(a+\", make sure it is exported\"));return c;}function B(a,c,d,e){var f={string:function(l){var p=0;if(null!==l&&void 0!==l&&0!==l){var W=(l.length<<2)+1;p=C(W);D(l,E,p,W);}return p;},array:function(l){var p=C(l.length);F.set(l,p);return p;}},g=A(a),k=[];a=0;if(e)for(var m=0;m<e.length;m++){var z=f[d[m]];z?(0===a&&(a=G()),k[m]=z(e[m])):k[m]=e[m];}d=g.apply(null,k);d=function(l){return\"string\"===c?H(l):\"boolean\"===c?!!l:l;}(d);0!==a&&I(a);return d;}var J=\"undefined\"!==typeof TextDecoder?new TextDecoder(\"utf8\"):void 0;function ba(a,c,d){var e=c+d;for(d=c;a[d]&&!(d>=e);)++d;if(16<d-c&&a.subarray&&J)return J.decode(a.subarray(c,d));for(e=\"\";c<d;){var f=a[c++];if(f&128){var g=a[c++]&63;if(192==(f&224))e+=String.fromCharCode((f&31)<<6|g);else{var k=a[c++]&63;f=224==(f&240)?(f&15)<<12|g<<6|k:(f&7)<<18|g<<12|k<<6|a[c++]&63;65536>f?e+=String.fromCharCode(f):(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023));}}else e+=String.fromCharCode(f);}return e;}function H(a){return a?ba(E,a,void 0):\"\";}function D(a,c,d,e){if(0<e){e=d+e-1;for(var f=0;f<a.length;++f){var g=a.charCodeAt(f);if(55296<=g&&57343>=g){var k=a.charCodeAt(++f);g=65536+((g&1023)<<10)|k&1023;}if(127>=g){if(d>=e)break;c[d++]=g;}else{if(2047>=g){if(d+1>=e)break;c[d++]=192|g>>6;}else{if(65535>=g){if(d+2>=e)break;c[d++]=224|g>>12;}else{if(d+3>=e)break;c[d++]=240|g>>18;c[d++]=128|g>>12&63;}c[d++]=128|g>>6&63;}c[d++]=128|g&63;}}c[d]=0;}}function ca(a){for(var c=0,d=0;d<a.length;++d){var e=a.charCodeAt(d);55296<=e&&57343>=e&&(e=65536+((e&1023)<<10)|a.charCodeAt(++d)&1023);127>=e?++c:c=2047>=e?c+2:65535>=e?c+3:c+4;}return c;}function da(a){var c=ca(a)+1,d=K(c);d&&D(a,F,d,c);return d;}var L,F,E,M,N=b.INITIAL_MEMORY||16777216;b.wasmMemory?x=b.wasmMemory:x=new WebAssembly.Memory({initial:N/65536,maximum:N/65536});x&&(L=x.buffer);N=L.byteLength;var O=L;L=O;b.HEAP8=F=new Int8Array(O);b.HEAP16=new Int16Array(O);b.HEAP32=M=new Int32Array(O);b.HEAPU8=E=new Uint8Array(O);b.HEAPU16=new Uint16Array(O);b.HEAPU32=new Uint32Array(O);b.HEAPF32=new Float32Array(O);b.HEAPF64=new Float64Array(O);var P,ea=[],fa=[],ha=[],ia=[];function ja(){var a=b.preRun.shift();ea.unshift(a);}var Q=0,R=null,S=null;b.preloadedImages={};b.preloadedAudios={};function w(a){if(b.onAbort)b.onAbort(a);u(a);y=!0;a=new WebAssembly.RuntimeError(\"abort(\"+a+\"). Build with -s ASSERTIONS=1 for more info.\");n(a);throw a;}function T(a){return String.prototype.startsWith?a.startsWith(\"data:application/octet-stream;base64,\"):0===a.indexOf(\"data:application/octet-stream;base64,\");}var U=\"data:application/octet-stream;base64,AGFzbQEAAAABmwd4YAN/f38Bf2ACf38Bf2AEf35/fwF+YAJ/fwBgAX8Bf2ADf39/AGAFf35/f38BfmABfwBgAn9+AX5gBH9/f38Bf2ACf34Bf2ABfAF8YAJ/fwF+YAJ/fgBgA39/fgF/YAF+AX9gA39+fwF+YAN/fn8AYAN/fn8Bf2AFf39/f38Bf2AGf35/f39/AX5gA39/fwF+YAN/fn4BfmAGf35+f39/AX5gBH9/fn8Bf2AGf39/f39/AX9gAX8BfmACfHwBfGAEf39/fwBgBH9/f38BfmADf35+AX9gBX9/f39/AGAFf35+fn4AYAd/f39/f39/AX9gBH9+fn8BfmAFf35+f38BfmABfgF+YAABf2AFf35/fn8Bf2AHf35/fn5+fwF/YAAAYAN/f34AYAN/fn4AYAR/fn5/AGAGf35/fn5/AX9gBH9+fn8Bf2AEf35+fgF/YAV/fn5+fwF/YAJ+fwF/YAR/fn9/AGAFf35+f38AYAJ+fwBgCX9/f39/f39/fwF/YAR/fn9/AX9gA35/fwF/YAZ/f39/f38BfmAHf35/f39/fwF+YAR/fn9+AX5gBH9+fn4BfmAGf39/f39/AGAHf39/f39/fwBgBH9/fn8AYAh/f39/f39/fwF/YAR/f39+AX9gBH9+f34Bf2AGf3x/f39/AX9gBX9/f39/AX5gAn5+AX5gAnx/AXxgA3x8fwF8YAN/f3wAYAV/fn9/fwBgBH9+f34AYAZ/fn9+fn8AYAJ/fQBgAn98AGADf3x/AGAFf3x/f38AYAF+AGAHfH9/f39/fwBgCn9/f39/f39/f38Bf2AHf39/fn5+fwF/YAV/f35/fwF/YAR/f35+AX9gBX9/fn5/AX9gBn9/fn5/fwF/YAZ/f35+fn4Bf2AFf35/f38Bf2AGf35/f39/AX9gBX9+f39+AX9gBX9+fn5+AX9gBn9+fn5+fwF/YAR/fH9/AX9gAn5+AX9gA35+fgF/YAR+fn5+AX9gAXwBf2ACfH8Bf2AGfH9/f39/AX9gAnx8AX9gAAF+YAd/f39/f39+AX5gBX9/f39+AX5gBH9/f34BfmADf39+AX5gBH9/fn8BfmAEf39+fgF+YAV/f35+fgF+YAV/fn9+fwF+YAV/fn5+fwF+YAd/fn5+f39/AX5gCH9+fn5+f35+AX5gA39+fAF+YAV/fH9/fwF+YAF8AX5gAX8BfGACf38BfGADf39/AXxgAX4BfGACfn4BfAJNDAFhAWIAHAFhAWMAKAFhAWQAAQFhAWUACQFhAWYAAAFhAWcABAFhAWgAAwFhAWkAAAFhAWoAAQFhAWsABwFhAWwAHAFhAWECAYACgAIDwgrACg0PAyQDBA8DbAUFcgMBAyYDAAMDKQMPESMAMQ0PBAcIAAgKAQEBAwwgBQQjAxoDCgoBGggFDjAFAAQHBAcOQHYBAAMDGgEQCAkPCQcACR4OBAMEBAgWUgUFAwAMBQoSAwEDEC4HAAcMHwAnABIQBCArE1YECQMBAAQPGAEtMwEKCg8uExoNBAEFAAAKBAQSHQ8mCBYKMwwFBzQEAAc7CQMvIg4EAhIBDwAJKksFCgE+BAVpAQQKEA4ODg4FBwFENwBIZhMSPBkHBBMAFgEOEjUtAC8DbgABNwUABQEBASo8AQcHARYEBAMQDwQKAwQIABwVBAdfAAAmA1ABBBMhZQYKNgMOAwAOHgFAJgoILQAAAQMHBAQDMAsBBTIIFgUTAAQBBQAEAwAOBjUDTwEBBGgMQgQGRwAWHAdxLxgQAxMFBQEAAQAVKwkLG0ULBAQZAQcFHwQ3FR0JAAEJBQkABAMEAAQAAQMAQz0OJAJbEAQDXAQMHAcDFgN0CwoMFRkjWAUQAAAFIwYQAwoDCQEBVAEBDAAPMDEJAwAHCwsBMwQEAQEJAAQBBAEFCgIAAwIBAwAJATQABwABAQETCgAJAQkJARwkD1cpAxIDDwQBFg4HGRwTAQQFEQMEWiIVDwMSGQhTa1UCOh0BGhoKFgABCiwqCQ4XAg42AwQBAAlRGAgKDwQEFQgDBRAYAQMBAQMAIAcFIRMEZwthCwEBAAAFCQQABD4BBQMIEwQAAgJvJAgGAgYmHhkZAAMCAzQAAwEBAQ0AAwEEAAEABwEEEwAPEwQEBAAAJEMMBnA1PQMIAwUADjkDCAkHDAIDJAAFDRcIDx4bKAYMDwMQBQYJHAABBxEHDAZkAg4DAwMrBgYGHwEdOAwBASMBAAQBAwUAAS8eEgwYOgMBBw4OBQgJAQAKDhgMByUeHh8ADwMEFQAVBAABAQEAAwIEBQcEIBsDAXcgXnMaKyAEAAYqHAREAQRFG0YLAwQZAQEBHAIEBwQJBAEAAQEEAAEhIQEAYxAQAgAACggoBgICAgICAgICAQYGAgICAgIGAgYPBgACAgIGAgIGAgYGCgICCAgCAgICBgYWCAICAgICAgIGAgICBgYCAgIGAgIGAgIAIQQHKAEFGQcBAwQHAQEBBAAHAAEHBAQHBAAHBwMAAAQDAAQEAAEBAQMCAgEDABoCAgIGAgICFCkpBhQMBgICFAYUFBQCAgIAAhUDEQ0RDQ0NARENFBQDBgYQBwYGBgYOBhQIAiw5Em0nEj8EGBENAgIUCAICAgIKFgoCAgIHAhAICBUOAgcnEhgHARIAAAEIFRQIFSdiTBJ1CQATAQAMHR0dBAUFAwMDAwMAAAADEQ0RDQ0NEQ0RDQ0NEQ0RDRENEQ0NEQ0RDSIiCgUiCAQJBxUaIwAdMQAAAAwZAQEBCg8SAQEBAQEAAAEhWS4uFgEACQEBAAUYAAAJFQEIHh4dGkIVCk0EDk4PFwNJFxcJDxcIBAoKCgAILQUDAwMDAwcHAQEBAAQHJQcQABddCwsbGxcBBBdKJRclJQM7HwMCBAQEBAAQBANBMDYBAwMCAAcHCwsCCwsLCwsLGxsLCQILCwsLCwsLBgsDAQEBAAEAAQMTARcJAAQBAQECATgBGQIFBQUFBQUFBQIFBRMfAQMGBmoCAgAMAAwADAAMAAwADAAMAAwCBgYAAgICAgYCAgcIBjoCEAgCBhAUAgIIAgICAgICAgICAgICAgILGgICCwsbGwYUAQYBBgICCAIGBgYCAgICAgYGBgICAgICAgICAmACAgICAgoGAwQHAXAB9wL3AgYJAX8BQYC0xAILB0YOAW0BAAFuAIwGAW8AygoBcAD9BAFxAKMHAXIA8gYBcwDVBgF0AJ8CAXUAigkBdgCJCQF3AIcJAXgA+AgBeQD3CAF6APYICfMFAQBBAQv2AowE4QjeCN0I2gjvCO4I7QiaB8MEzAawBqAGyQq1A5sKkAqHBvUJ2QnQCc0JywnECfMFtwmvCaQJngnhBY8JiAmFCYIJ/AjPBfYDogjnCOUH/gTjB+QBpgebB5wI7wfyBLMHlQeUB5MHkQeMB4gHowb4CZgIlwiWCJUIlAiKBZMIkgiRCJAIjwiOCI0IjAiLCIoIiQiICIcIhgiFCOEDhAjhA4MIggiBCIAI5gfaB9kH2AfdB4gF/wf+B8AHvwe+B7wHuwe6B7gHtwe2B6UHpAeiB+EDoQeKBaAHnweeB50H8wfyB/EH1gfTB9IH0QfQB84HzQfMB8gHxwfGB8UHxAfDB8IHwQe1B7IHsAevB64HrQerB6oHqQenB5gHlweWB4oCkgeQB48HjgeLB4cHjQWGB4UHhAeDB+IEggeBB/wGjwX7BtAGzwbOBs0GywbKBskGyAaWBccGxga8BMUGxAbDBroEwgbBBsAGuwS/Br4GvQa8BrsGuga5BrgGtwa2BpEDtQa0BrMGsgaxBq8GrQasBqsGqgapBqgG7wOnBqYGlQWXBaUGpAaiBp8GngadBpwGmwaaBpkGtgS1BJgGlwaVBpQGkwaSBpEGkAaPBo4GjQbHCsYKxQrECsMKwQrACr8Kvgq9CrwKuwq6CrkKuAq3CrYKtQq0CrMKsgqxCrAKrwquCq0KqwqqCqkKpwqlCqQKswmnCakJoQq0CbAJpQmhBKwJrQmjBNMC/ASjCaoJogmgCqgJsgm1CaYJuAmxCaICpgP/CP4ItgmfCp4KnAqaCpkKmAqXCpYKlQqUCpMKkgqRCo8KjgqNCowKiwqKCokKiAqHCoYKhgaFCoUGhAqCCoEK/wn+Cf0J/An7CfoJ+Qn3CfYJ5AnjCeEJ4AnyCfQJ8AnuCewJ6gnoCeYJ8QnzCe8J7QnrCekJ5wnlCYMG2wnaCdgJ1wnWCdUJ1AnTCdIJ0Qn3A4MGnwmYCZcJlQngBZQJjASMBPsI+ggKm+oSwAo1AQF/AkAgAUIgiKdBdUkNACABpyICIAIoAgAiAkF/ajYCACACQQFKDQAgACgCECABEPcECwsTACAAQoCAgIBwg0KAgICA4ABRC00BAn8gACgCQCICQYACaiEDIAIoApwCIAAoAgRHBEAgA0HAARAPIAMgACgCBBAdIAIgACgCBDYCnAILIAIgAigChAI2ApgCIAMgARAPCyIBAX8gAEIgiKdBdU8EQCAApyIBIAEoAgBBAWo2AgALIAALKAEBfyMAQRBrIgIkACACIAE6AA8gACACQQ9qQQEQlAEaIAJBEGokAAufFgIGfwF+IwBBEGsiAiQAIAAgAEEQaiIEEI0CIAAgACgCOCIBNgI0IAIgATYCDCAAQQA2AjAgACAAKAIUNgIEA0AgACABNgIYIAAgACgCCCIDNgIUAkACQAJ/AkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEsAAAiBUH/AXEiBg59ABcXFxcXFxcXBAMEBAIXFxcXFxcXFxcXFxcXFxcXFxcEEhgIBwwTGBcXCw0XDgkFChwcHBwcHBwcHBcXDxEQFhcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBxcGFxQHAQcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHFxUXCyABIAAoAjxJDRogBEGqfzYCAAwfCyAAIAFBAWoQzAMNHCACIAAoAjg2AgwMHgsgAUEBaiABIAEtAAFBCkYbIQELIAIgAUEBajYCDAweCyACIAFBAWo2AgwMHgsCQAJAIAEtAAEiA0EqRwRAIANBL0YNASADQT1HDQIgAiABQQJqNgIMIARBhn82AgAMHQsgAiABQQJqIgE2AgwDQAJAAkACQAJAAkACQCABLQAAIgNBdmoOBAEDAwIACyADQSpHBEAgAw0DIAEgACgCPEkNBCAAQdDUAEEAEBQMIQsgAS0AAUEvRw0DIAIgAUECajYCDAwlCyAAQQE2AjAgACAAKAIIQQFqNgIIIAIgAUEBajYCDAwDCyAAQQE2AjAgAiABQQFqNgIMDAILIANBGHRBGHVBf0oNACABQQYgAkEMahBlIgFBfnFBqMAARgRAIABBATYCMAwCCyABQX9HDQEgAiACKAIMQQFqNgIMDAELIAIgAUEBajYCDAsgAigCDCEBDAALAAsgAUECaiEBQQAMFQsgAiABQQFqNgIMIARBLzYCAAwaCyABLQABQfUARw0UIAIgAUEBajYCBAJAIAJBBGpBARCjAiIBQQBOBEAgARC9Ag0BCyACKAIMIQEMFQsgAiACKAIENgIMIAJBATYCCAwWCyACQQA2AgggAiABQQFqNgIMIAYhAQwVCyACIAFBAWoiBTYCDCACIAFBAmo2AgRB3AAhAwJAIAEtAAEiBkHcAEYEQCABLQACQfUARw0BIAJBBGpBARCjAiEDDAELIAYiA0EYdEEYdUF/Sg0AIAVBBiACQQRqEGUhAwsgAxC9AkUEQCAAQdD5AEEAEBQMFgsgAiACKAIENgIMIAJBADYCCCAAIAJBDGogAkEIaiADQQEQ2QQiAUUNFSAAQal/NgIQIAAgATYCIAwXCyABLQABIgNBLkYEQCABLQACQS5HDRIgAiABQQNqNgIMIARBpX82AgAMFwsgA0FQakH/AXFBCk8NEQwSCyABLQABEEZFDREgACgCQC0AbkEBcUUNESAAQfj5AEEAEBQMEwsgAS0AASIDQSpHBEAgA0E9Rw0QIAIgAUECajYCDCAEQYV/NgIADBULIAEtAAJBPUYEQCACIAFBA2o2AgwgBEGQfzYCAAwVCyACIAFBAmo2AgwgBEGjfzYCAAwUCyABLQABQT1HDQ4gAiABQQJqNgIMIARBh382AgAMEwsgAS0AASIDQStHBEAgA0E9Rw0OIAIgAUECajYCDCAEQYh/NgIADBMLIAIgAUECajYCDCAEQZV/NgIADBILIAEtAAEiBUEtRwRAIAVBPUcNDSACIAFBAmo2AgwgBEGJfzYCAAwSCwJAIAAoAkhFDQAgAS0AAkE+Rw0AIAAoAgQgA0cNCwsgAiABQQJqNgIMIARBlH82AgAMEQsCQAJAAkAgAS0AASIDQURqDgIBAAILIAIgAUECajYCDCAEQZp/NgIADBILIAEtAAJBPUYEQCACIAFBA2o2AgwgBEGKfzYCAAwSCyACIAFBAmo2AgwgBEGWfzYCAAwRCyADQSFHDQsgACgCSEUNCyABLQACQS1HDQsgAS0AA0EtRg0JDAsLAkACQCABLQABQUNqDgIAAQwLIAIgAUECajYCDCAEQZx/NgIADBALAkACQAJAIAEtAAJBQ2oOAgEAAgsgAS0AA0E9RgRAIAIgAUEEajYCDCAEQYx/NgIADBILIAIgAUEDajYCDCAEQZh/NgIADBELIAIgAUEDajYCDCAEQYt/NgIADBALIAIgAUECajYCDCAEQZd/NgIADA8LAkACQCABLQABQUNqDgIAAQsLIAEtAAJBPUYEQCACIAFBA2o2AgwgBEGefzYCAAwQCyACIAFBAmo2AgwgBEGdfzYCAAwPCyACIAFBAmo2AgwgBEGkfzYCAAwOCyABLQABQT1HDQggAS0AAkE9RgRAIAIgAUEDajYCDCAEQaB/NgIADA4LIAIgAUECajYCDCAEQZ9/NgIADA0LIAEtAAEiA0EmRwRAIANBPUcNCCACIAFBAmo2AgwgBEGNfzYCAAwNCyABLQACQT1GBEAgAiABQQNqNgIMIARBkX82AgAMDQsgAiABQQJqNgIMIARBoX82AgAMDAsgAS0AAUE9Rw0GIAIgAUECajYCDCAEQY5/NgIADAsLIAEtAAEiA0H8AEcEQCADQT1HDQYgAiABQQJqNgIMIARBj382AgAMCwsgAS0AAkE9RgRAIAIgAUEDajYCDCAEQZJ/NgIADAsLIAIgAUECajYCDCAEQaJ/NgIADAoLIAEtAAEiA0EuRwRAIANBP0cNBSABLQACQT1GBEAgAiABQQNqNgIMIARBk382AgAMCwsgAiABQQJqNgIMIARBpn82AgAMCgsgAS0AAkFQakH/AXFBCkkNBCACIAFBAmo2AgwgBEGnfzYCAAwJCyAFQX9KDQMgAUEGIAJBDGoQZSIBQX5xQajAAEYEQCAAKAIIIQMMCwsgARCxAw0LIAEQvQIEQCACQQA2AggMBgsgAEHq1ABBABAUDAYLIAAgBkEBIAFBAWogBCACQQxqEIgDRQ0HDAULQQELIQMDQAJ/AkACQAJAAkAgA0UEQCACIAE2AgwMAQsgAS0AACIDRQ0CAkAgA0F2ag4EDwAADwALIANBGHRBGHVBf0oNAyABQQYgAkEMahBlIgNBfnFBqMAARg0OIAIoAgwhASADQX9GDQELQQEhAwwECyABQQFqDAILIAEgACgCPE8NCwsgAUEBagshAUEAIQMMAAsACyAEIAY2AgAgAiABQQFqNgIMDAQLIAAoAgAgASACQQxqQQBBNBC8AiIHEAwNAQJAIAdCgICAgHCDQoCAgIDAflIEQCACKAIMQQYgAkEIahBlEL8BRQ0BCyAAKAIAIAcQCyAAQaX6AEEAEBQMAgsgAEGAfzYCECAAIAc3AyAMAwsgACACQQxqIAJBCGogAUEAENkEIgFFDQAgACABNgIgIAIoAgghBiAAQQA2AiggACAGNgIkAkAgAUElSQ0AIAFBLU0EQCAAKAJAIgMtAG5BAXENASABQS1HDQMgAy8BbCIFQQFxDQEgBUGA/gNxQYAGRw0DIAMoAmQNAyADKAIEIgNFDQMgAy0AbEEBcQ0BDAMLIAFBLkcNAiAAKAJEDQAgACgCQCIDLwFsIgVBAnENACAFQYD+A3FBgAZHDQIgAygCZA0CIAMoAgQiA0UNAiADLQBsQQJxRQ0CCyAGBEAgAEGDfzYCECAAQQE2AigMAwsgBCABQap/ajYCAAwCCyAEQah/NgIAQX8MAgsgBEGDfzYCAAsgACACKAIMNgI4QQALIQAgAkEQaiQAIAAPCyAAQQE2AjAgACADQQFqNgIICyACKAIMIQEMAAsACxIAIABCgICAgHCDQoCAgIAwUQsVACABEPABRQRAIAAoAhAgARDtBAsLwQYCBX8BfiMAQSBrIggkAEKAgICA4AAhCgJAAkACQAJAAkACQAJAAkACQAJAIAFCIIinIgZBAWoOCAMFBQABBQUJAgsgACACQZwVEMYBDAYLIAAgAkG/FRDGAQwFCyAGQXlGDQEMAgsgAachBgwCCyABpyEGIAIQXQRAIAIQeSIFIAYoAgQiB0H/////B3FPDQEgAAJ/IAdBf0wEQCAGIAVBAXRqLwEQDAELIAUgBmotABALQf//A3EQnAMhCgwFCyACQTBHDQAgBikCBEL/////B4MhCgwECyAAIAEQjwSnIgZFDQILA0AgBigCECIHIAcoAhggAnFBf3NBAnRqKAIAIQUgBxAoIQkCQANAIAVFDQEgAiAJIAVBf2pBA3QiBWoiBygCBEcEQCAHKAIAQf///x9xIQUMAQsLIAYoAhQgBWohBQJAAkACQAJAIAcoAgBBHnZBAWsOAwABAgMLIAUoAgAiAkUNBiAAIAKtQoCAgIBwhBAOIANBAEEAEDYhCgwHCyAFKAIAKAIQKQMAIgEQhAEEQCAAIAIQ3gEMBQsgARAOIQoMBgsgACAGIAIgBSAHEMkCRQ0CDAMLIAUpAwAQDiEKDAQLAkAgBi0ABSIFQQRxRQ0AIAVBCHEEQCACEF0EQCACEHkiBSAGKAIoSQRAIAAgBq1CgICAgHCEIAUQeCEKDAcLIAYvAQZBa2pB//8DcUEJSQ0FDAILIAYvAQZBa2pB//8DcUEISw0BIAAgAhCbAyIFRQ0BQoCAgIDgAEKAgICAMCAFQQBIGyEKDAULIAAoAhAoAkQgBi8BBkEYbGooAhQiBUUNACAFKAIUBEAgACAGrUKAgICAcIQQDiIBIAIgAyAFKAIUETkAIQogACABEAsMBQsgBSgCAEUNACAAIAggBq1CgICAgHCEEA4iASACIAUoAgARGAAhBSAAIAEQCyAFQQBIDQIgBUUNACAILQAAQRBxBEAgACAIKQMYEAsgACAIKQMQIANBAEEAEDYhCgwFCyAIKQMIIQoMBAsgBigCECgCLCIGDQALQoCAgIAwIQogBEUNAiAAIAIQyAILQoCAgIDgACEKDAELQoCAgIAwIQoLIAhBIGokACAKC18BAn8jAEEQayIEJAAgACgCACEDIAQgAjYCDCADQQMgASACQQAQwAUgAyADKAIQKQOAASAAKAIMIAAoAgggACgCQCIABH8gACgCaEEAR0EBdAVBAAsQvwIgBEEQaiQACyYBAX8jAEEQayIDJAAgAyACNgIMIABBBCABIAIQ+wEgA0EQaiQACzcBAX5CgICAgMB+IAC9IgFCgICAgMD+/4OAf3wgAUL///////////8Ag0KAgICAgICA+P8AVhsLDwAgACgCQEGAAmogARAxCysAIAEQ8AFFBEAgACgCECgCOCABQQJ0aigCACIAIAAoAgBBAWo2AgALIAELCwAgACgCECABECALKQAgACABIAIgA0KAgICAMEKAgICAMCAEQYDOAHIQdSECIAAgAxALIAILDwAgACAAKAIAIAEQGBA5C0oAIAAQ6QJFBEBBfw8LIAJBf0wEQCAAEDUhAgsgACABQf8BcRANIAAgAhA5IAAoAkAoAqQCIAJBFGxqIgAgACgCAEEBajYCACACCygBAX8jAEEQayICJAAgAiABNgIMIAAgAkEMakEEEJQBGiACQRBqJAALMQAgAUEATgRAIABBtAEQDSAAIAEQOSAAKAJAIgAoAqQCIAFBFGxqIAAoAoQCNgIECwsYAQF+IAEpAwAhAyABIAI3AwAgACADEAsLEQAgAEEQaiABIAAoAgQRAwALCwAgAEL/////b1YLGAAgAUIgiKdBfk8EQCAAIAGnIAIRAwALCxcAIAAgASACQoCAgIAwIAMgBEECEN8BC4IEAQN/IAJBgARPBEAgACABIAIQBBogAA8LIAAgAmohAwJAIAAgAXNBA3FFBEACQCACQQFIBEAgACECDAELIABBA3FFBEAgACECDAELIAAhAgNAIAIgAS0AADoAACABQQFqIQEgAkEBaiICIANPDQEgAkEDcQ0ACwsCQCADQXxxIgRBwABJDQAgAiAEQUBqIgVLDQADQCACIAEoAgA2AgAgAiABKAIENgIEIAIgASgCCDYCCCACIAEoAgw2AgwgAiABKAIQNgIQIAIgASgCFDYCFCACIAEoAhg2AhggAiABKAIcNgIcIAIgASgCIDYCICACIAEoAiQ2AiQgAiABKAIoNgIoIAIgASgCLDYCLCACIAEoAjA2AjAgAiABKAI0NgI0IAIgASgCODYCOCACIAEoAjw2AjwgAUFAayEBIAJBQGsiAiAFTQ0ACwsgAiAETw0BA0AgAiABKAIANgIAIAFBBGohASACQQRqIgIgBEkNAAsMAQsgA0EESQRAIAAhAgwBCyADQXxqIgQgAEkEQCAAIQIMAQsgACECA0AgAiABLQAAOgAAIAIgAS0AAToAASACIAEtAAI6AAIgAiABLQADOgADIAFBBGohASACQQRqIgIgBE0NAAsLIAIgA0kEQANAIAIgAS0AADoAACABQQFqIQEgAkEBaiICIANHDQALCyAAC0gBA38gA0EAIANBAEobIQMDQCADIARGRQRAIAAgASAAIAIgBEEEdGoiBSgCABCZBSIGIAUQpwggACAGEBIgBEEBaiEEDAELCwsyAQF/AkAgAUIgiKdBdUkNACABpyICIAIoAgAiAkF/ajYCACACQQFKDQAgACABEPcECwsSACAAQoCAgIBwg0KAgICAIFELBwAgAEEwagsLACAAQZQXQQAQFQufAQEBfgJAAkACQAJAAkACQAJAIAEQVEEIag4QBQMAAAAAAAECBAAAAAABAgALIABBk84AQQAQFUKAgICA4AAPCyABEA4PCyAAQQQQoQEhAgwDCyAAIABBBRChASICQTAgAacpAgRC/////weDQQAQGhoMAgsgAEEGEKEBIQIMAQsgAEEHEKEBIQILIAIQDEUEQCAAIAIgARAOEOkBCyACC7MEAQt/IwBBEGsiCCQAIAAoAgAhBSAIIAI2AgxBfyEJAkADQAJAIAggAiIDQQRqIgI2AgwgAygCACIHQX9GDQAgACgCBCEKA0AgASIEIApODQMgBCAEIAVqIgstAAAiBkECdCIMQZAxai0AAGoiASAKSg0DIAZBwAFGBEAgCygAASEJDAELCyAGIAdHBEAgBkUgB0GAAklyIAdB/wFxIAZGIAdBCHZB/wFxIAZGciAHQRB2Qf8BcSAGRnJFQQAgB0EYdiAGRxtyDQMgACAGNgIQCyAEQQFqIQQCQAJAAkACQAJAAkACQAJAIAxBkzFqLQAAQXtqDhgACQAJCQEJCQEJCQEBAQICAgIEBQYHCQMJCyAEIAVqLQAAIQQgCCADQQhqIgI2AgwgAygCBCIDQX9GBEAgACAENgIUDAkLIAMgBEYNCAwJCyAEIAVqLwAAIQQgCCADQQhqIgI2AgwgAygCBCIDQX9GBEAgACAENgIUDAgLIAMgBEYNBwwICyAAIAQgBWooAAA2AhgMBgsgACAEIAVqIgMoAAA2AhggACADLwAENgIcDAULIAAgBCAFaigAADYCIAwECyAAIAQgBWoiAygAADYCICAAIAMtAAQ2AhwMAwsgACAEIAVqIgMoAAA2AiAgACADLwAENgIcDAILIAAgBCAFaiIDKAAANgIgIAAgAygABDYCGCAAIAMtAAg2AhwMAQsLIAAgCTYCDCAAIAE2AghBASENCyAIQRBqJAAgDQsLACAAIAFBABCSBAu/AQMCfwF+AXxBfyECAkACQAJAAkACQAJAIAFCIIinIgNBB2oODgIEBAQEBAMAAQEBBAQFBAsgAadBAEcPCyABpw8LIAGnKQIEIQQgACABEAsgBEL/////B4NCAFIPCyABpy0ABSECIAAgARALIAJBf3NBgAFxQQd2DwsgA0ELakESTwRAIAEQSiIFRAAAAAAAAAAAYiAFvUL///////////8Ag0KBgICAgICA+P8AVHEPCyAAIAEQC0EBIQILIAILGQAgACgCECABEOgBIgFFBEAgABDHAQsgAQs/AQF/IwBBEGsiAiQAAn8gASAAKAIQRwRAIAIgATYCACAAQf3WACACEBRBfwwBCyAAEBALIQAgAkEQaiQAIAALIQAgACgCBEF/TARAIAAgAUEBdGovARAPCyAAIAFqLQAQCygBAX8jAEEQayICJAAgAiABOwEOIAAgAkEOakECEJQBGiACQRBqJAALCwAgACABQQEQxwULpAsCBX8JfiMAQeAAayIFJAAgAkIghiABQiCIhCERIARCL4YgA0IRiIQhDSAEQv///////z+DIg5CD4YgA0IxiIQhDyACIASFQoCAgICAgICAgH+DIQogAkL///////8/gyILQiCIIRAgDkIRiCESIARCMIinQf//AXEhBwJAAn8gAkIwiKdB//8BcSIJQX9qQf3/AU0EQEEAIAdBf2pB/v8BSQ0BGgsgAVAgAkL///////////8AgyIMQoCAgICAgMD//wBUIAxCgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhCgwCCyADUCAEQv///////////wCDIgJCgICAgICAwP//AFQgAkKAgICAgIDA//8AURtFBEAgBEKAgICAgIAghCEKIAMhAQwCCyABIAxCgICAgICAwP//AIWEUARAIAIgA4RQBEBCgICAgICA4P//ACEKQgAhAQwDCyAKQoCAgICAgMD//wCEIQpCACEBDAILIAMgAkKAgICAgIDA//8AhYRQBEAgASAMhCECQgAhASACUARAQoCAgICAgOD//wAhCgwDCyAKQoCAgICAgMD//wCEIQoMAgsgASAMhFAEQEIAIQEMAgsgAiADhFAEQEIAIQEMAgsgDEL///////8/WARAIAVB0ABqIAEgCyABIAsgC1AiBht5IAZBBnStfKciBkFxahB7IAUpA1giC0IghiAFKQNQIgFCIIiEIREgC0IgiCEQQRAgBmshBgsgBiACQv///////z9WDQAaIAVBQGsgAyAOIAMgDiAOUCIIG3kgCEEGdK18pyIIQXFqEHsgBSkDSCICQg+GIAUpA0AiA0IxiIQhDyACQi+GIANCEYiEIQ0gAkIRiCESIAYgCGtBEGoLIQYgD0L/////D4MiAiALQv////8PgyIEfiIOIA1C/////w+DIgsgEEKAgASEIgx+fCINIA5UrSANIBJC/////weDQoCAgIAIhCIOIBFC/////w+DIhF+fCIPIA1UrXwgDyALIBF+IhAgA0IPhkKAgP7/D4MiAyAEfnwiDSAQVK0gDSACIAFC/////w+DIgF+fCIQIA1UrXx8Ig0gD1StfCAMIA5+fCAEIA5+IhIgAiAMfnwiDyASVK1CIIYgD0IgiIR8IA0gD0IghnwiDyANVK18IA8gBCALfiINIAMgDH58IgQgAiARfnwiAiABIA5+fCIMQiCIIAwgAlStIAQgDVStIAIgBFStfHxCIIaEfCICIA9UrXwgAiAQIAEgC34iBCADIBF+fCIOQiCIIA4gBFStQiCGhHwiBCAQVK0gBCAMQiCGfCIMIARUrXx8IgQgAlStfCICQoCAgICAgMAAgyILQjCIpyIIIAcgCWogBmpqQYGAf2oiBkH//wFOBEAgCkKAgICAgIDA//8AhCEKQgAhAQwBCyACQgGGIARCP4iEIAIgC1AiBxshCyAOQiCGIgIgASADfnwiASACVK0gDHwiAyAIQQFzrSIMhiABQgGIIAhBPnKtiIQhAiAEQgGGIANCP4iEIAQgBxshBCABIAyGIQECfiAGQQBMBEBBASAGayIHQYABTwRAQgAhAQwDCyAFQTBqIAEgAiAGQf8AaiIGEHsgBUEgaiAEIAsgBhB7IAVBEGogASACIAcQ0QIgBSAEIAsgBxDRAiAFKQMwIAUpAziEQgBSrSAFKQMgIAUpAxCEhCEBIAUpAyggBSkDGIQhAiAFKQMAIQQgBSkDCAwBCyALQv///////z+DIAatQjCGhAsgCoQhCiABUCACQn9VIAJCgICAgICAgICAf1EbRQRAIAogBEIBfCIBIARUrXwhCgwBCyABIAJCgICAgICAgICAf4WEUEUEQCAEIQEMAQsgCiAEIARCAYN8IgEgBFStfCEKCyAAIAE3AwAgACAKNwMIIAVB4ABqJAALagECfwJAIAAoAtgCIgNFDQAgACgC4AIiBCAAKALcAk4NACAAKALoAiABSw0AIAAoAuQCIAJGDQAgAyAEQQN0aiIDIAI2AgQgAyABNgIAIAAgATYC6AIgACAEQQFqNgLgAiAAIAI2AuQCCwsMACAAKAJAQX8QwwMLIQAgACABIAJCgICAgDAgAyAEQQIQ3wEhAiAAIAEQCyACCxkAIAEEQCAAIAFBcGqtQoCAgICQf4QQCwsL6wECAn8BfkKAgICA4AAhAyAAKAIUBH5CgICAgOAABSAAKAIEIQEgACgCCCICRQRAIAAoAgAgARAZIABBADYCBCAAKAIAQS8QMg8LIAIgACgCDEgEQCAAKAIAKAIQIAEgAiAAKAIQIgF0IAFrQRFqEOQBIgFFBEAgACgCBCEBCyAAIAE2AgQLIAEgACgCECICBH8gAgUgASAAKAIIakEAOgAQIAAoAhALQR90rSABKQIEQv////93g4QiAzcCBCABIANCgICAgHiDIAA1AghC/////weDhDcCBCAAQQA2AgQgAa1CgICAgJB/hAsLDwAgACgCQEGAAmogARAdC3IBAX8CQCABQiCIpyICQXhHBEAgAg0BIAGnIgJBAEgNASACEJEBDwsgACAAKAIQIAGnEM4CEBgPC0EAIQIgACABEIkEIgEQDAR/QQAFIAFCgICAgHCDQoCAgICAf1EEQCAAIAEQlgIPCyAAIAGnEJYECwtLAQJ/IAFCgICAgHBaBH8gAaciAy8BBiICQQ1GBEBBAQ8LIAJBKUYEQCADKAIgLQAQDwsgACgCECgCRCACQRhsaigCEEEARwVBAAsLcgEBfwJ/IAAoAggiAiAAKAIMTgRAQX8gACACQQFqIAEQzQINARoLAkAgACgCEARAIAAgACgCCCICQQFqNgIIIAAoAgQgAkEBdGogATsBEAwBCyAAIAAoAggiAkEBajYCCCACIAAoAgRqIAE6ABALQQALCxAAIAAgACgCKCkDCEEBEFELFAEBfiAAIAEQLCECIAAgARALIAILLAEBfyMAQRBrIgMkACADIAI2AgwgAEHcAGpBgAEgASACENICGiADQRBqJAALKAAgACACQTAgAkEAEBMiAhAMBEAgAUIANwMAQX8PCyAAIAEgAhCtAQsoAQF/AkAgAEKAgICAcFQNACABIACnIgEvAQZHDQAgASgCICECCyACCyYBAX8jAEEQayIDJAAgAyACNgIMIABBBiABIAIQ+wEgA0EQaiQACw0AIAAgASACQQAQoQMLkAEBA38gACEBAkACQCAAQQNxRQ0AIAAtAABFBEBBAA8LA0AgAUEBaiIBQQNxRQ0BIAEtAAANAAsMAQsDQCABIgJBBGohASACKAIAIgNBf3MgA0H//ft3anFBgIGChHhxRQ0ACyADQf8BcUUEQCACIABrDwsDQCACLQABIQMgAkEBaiIBIQIgAw0ACwsgASAAawsVACAAKAIAIAAoAgQQGSAAQQA2AgQLCgAgAEFQakEKSQsjAQJ/IAAoAgAiASAAKAIEIgI2AgQgAiABNgIAIABCADcCAAsMACAAIAEgAhAOEFoLEQAgACABIAIgA0GAgAEQlQILEQAgAEKAgICAwIGA/P8AfL8LDAAgACABIAAgAUobC/MCAgJ/AX4CQCACRQ0AIAAgAmoiA0F/aiABOgAAIAAgAToAACACQQNJDQAgA0F+aiABOgAAIAAgAToAASADQX1qIAE6AAAgACABOgACIAJBB0kNACADQXxqIAE6AAAgACABOgADIAJBCUkNACAAQQAgAGtBA3EiBGoiAyABQf8BcUGBgoQIbCIBNgIAIAMgAiAEa0F8cSIEaiICQXxqIAE2AgAgBEEJSQ0AIAMgATYCCCADIAE2AgQgAkF4aiABNgIAIAJBdGogATYCACAEQRlJDQAgAyABNgIYIAMgATYCFCADIAE2AhAgAyABNgIMIAJBcGogATYCACACQWxqIAE2AgAgAkFoaiABNgIAIAJBZGogATYCACAEIANBBHFBGHIiBGsiAkEgSQ0AIAGtIgVCIIYgBYQhBSADIARqIQEDQCABIAU3AxggASAFNwMQIAEgBTcDCCABIAU3AwAgAUEgaiEBIAJBYGoiAkEfSw0ACwsgAAsOACAAIAEoAgAgARCDBQsdACAAIAEpAxAQCyAAIAEpAxgQCyAAIAEpAwgQCwsRACAAIAAoAiQQngJBAhDFBQsmAQF/AkAgACgCEEGDf0cNACAAKAIgIAFHDQAgACgCJEUhAgsgAgtCAQJ/AkAgACgCECABENgEIgMQ8ggiBARAIAQQngIhAwwBCyAAIANBAhDXBCIDDQBCgICAgOAADwsgACADIAIQxQULCgAgACABQQEQUQuwBAIDfwF+AkACQAJAAkACQANAIAIoAhAiBSAFKAIYIANxQX9zQQJ0aigCACEEIAUQKCEGA0AgBEUNBCADIAYgBEF/akEDdCIEaiIFKAIERwRAIAUoAgBB////H3EhBAwBCwsgAigCFCAEaiEEIAUoAgAhBiABRQ0BIAFCgICAgDA3AxggAUKAgICAMDcDECABQoCAgIAwNwMIIAEgBkEadkEHcSIGNgIAAkACQAJAAkAgBSgCAEEedkEBaw4DAAECAwsgASAGQRByNgIAIAQoAgAiAARAIAEgAK1CgICAgHCEEA43AxALQQEhBSAEKAIEIgBFDQcgASAArUKAgICAcIQQDjcDGEEBDwsgBCgCACgCECkDACIHEIQBDQQgASAHEA43AwhBAQ8LIAAgAiADIAQgBRDJAkUNAQwGCwsgASAEKQMAEA43AwhBAQ8LQQEhBSAGQYCAgIB8cUGAgICAeEcNAiAEKAIAKAIQKQMAEIQBRQ0CCyAAIAMQ3gEMAgtBACEFIAItAAUiBEEEcUUNACAEQQhxBEAgAxBdRQ0BIAMQeSIDIAIoAigiBEkhBSABRSADIARPcg0BIAFCgICAgDA3AxggAUKAgICAMDcDECABQQc2AgAgASAAIAKtQoCAgIBwhCADEHg3AwhBAQ8LIAAoAhAoAkQgAi8BBkEYbGooAhQiBEUNACAEKAIAIgRFDQAgACABIAKtQoCAgIBwhCADIAQRGAAhBQsgBQ8LQX8LFwEBf0EHIABCIIinIgEgAUELakERSxsLKgEBfyMAQRBrIgQkACAEIAM2AgwgACABIAIgAxDSAiEAIARBEGokACAACxcAIAAoAgwgACgCCEEAIAAoAhARAAAaC40BAQJ/IAEoAnwiBEGAgAROBEAgAEHW+gBBABBCQX8PC0F/IQMgACABQfQAakEQIAFB+ABqIARBAWoQfAR/QX8FIAEgASgCfCIDQQFqNgJ8IAEoAnQgA0EEdGoiA0IANwIAIANCADcCCCADIAAgAhAYNgIAIAMgAygCDEGA////B3I2AgwgASgCfEF/agsLQgEBfyADIAJLBH8gASgCBEF/TARAIAAgASACQQF0akEQaiADIAJrEN8HDwsgACABIAJqQRBqIAMgAmsQmgIFQQALCxEAIAAgARAOIAIQDkEBENsBCz4BAX8gAkIgiKciA0ECTQRAIAEgAqe3OQMAQQAPCyADQQtqQRJPBEAgASACEEo5AwBBAA8LIAAgASACENcIC68BAgN/AX4CQAJAIAApA3AiBFBFBEAgACkDeCAEWQ0BCyAAEJAJIgNBf0oNAQsgAEEANgJoQX8PCyAAAn8gACgCCCIBIAApA3AiBFANABogASAEIAApA3hCf4V8IgQgASAAKAIEIgJrrFkNABogAiAEp2oLNgJoIAAoAgQhAiABBEAgACAAKQN4IAEgAmtBAWqsfDcDeAsgAkF/aiIALQAAIANHBEAgACADOgAACyADCwkAIAAgATYAAAsHACAAQR92CwkAIABBARC5AQstACABQoCAgIBgg0KAgICAIFEEQCAAQZTMAEEAEBVCgICAgOAADwsgACABECwLRQEBfyACQv////8HWARAIAAgASACEJ4BDwsgACACEJQDIgNFBEBCgICAgOAADwsgACABIAMgAUEAEBMhASAAIAMQEiABC0wBAX8CQAJAIAAgASACEA4QsgUiBQ0AIAEoAgAiAEEASA0BIAAgA0wNACABIAM2AgALIAUPCyABQQAgACAEaiIAIABBAEgbNgIAQQALMwEBfyABBEADQCACIANGRQRAIAAgASADQQN0aigCBBASIANBAWohAwwBCwsgACABEBkLCxgAIAAtAABBIHFFBEAgASACIAAQmQQaCwsMACAAIAFB/wFxEA8L3QEBBn8gAEEBaiEGIAAtAAAiA0EYdEEYdSIFQQBOBEAgAiAGNgIAIAMPC0F/IQMCQCAFQUBrIgRB/wFxQT1LDQAgBEEYdEEYdUECdEGk3QFqKAIAIgQgAU4NACAEQX9qIQcgACAEakEBaiEIIAUgBEGD3QFqLQAAcSEBQQAhAANAIAAgBEcEQCAGLAAAIgVBf0ogBUH/AXFBvwFLcg0CIAVBP3EgAUEGdHIhASAAQQFqIQAgBkEBaiEGDAELCyABIAdBAnRBkN0BaigCAEkNACACIAg2AgAgASEDCyADCwsAIAAgAUEAEMcFC64CAAJAAkACQAJAIAJBA0wEQAJAAkACQAJAAkACQAJAAkACQCABQah/ag4JAAECAwQFBgcICgsgACACQUNqQf8BcRAPDwsgACACQUdqQf8BcRAPDwsgACACQUtqQf8BcRAPDwsgACACQU9qQf8BcRAPDwsgACACQVNqQf8BcRAPDwsgACACQVdqQf8BcRAPDwsgACACQVtqQf8BcRAPDwsgACACQV9qQf8BcRAPDwsgACACQWNqQf8BcRAPDwsgAkH/AUoNAQJAAkACQCABQah/ag4DAAECBAsgAEHAARAPDAULIABBwQEQDwwECyAAQcIBEA8MAwsgAUEiRg0BCyAAIAFB/wFxEA8gACACQf//A3EQMQ8LIAAgAkFsakH/AXEQDw8LIAAgAkH/AXEQDwscAQF/IAAgARA7BH9BAAUgAEGPxABBABAVQX8LCxkBAX8gASACEEEiA0UEQCAAIAIQkwMLIAMLJgEBfyMAQRBrIgIkACACQQA2AgwgAEEBIAFBABD7ASACQRBqJAALGQAgACgCECABEJsCIgFFBEAgABDHAQsgAQsPACAAKAJAQYACaiABEA8LbwIBfwF+IAAhAwJAAkAgARARDQAgACABQTsgAUEAEBMiBBAMBEAgBA8LIAQQIQ0BIAAgBBALIAAgARCFAyIDDQBCgICAgOAADwsgAygCKCACQQN0aikDABAOIQQLIAAgBCACEFEhASAAIAQQCyABCzEAIAAgASACQoCAgIAIfEL/////D1gEfiACQv////8PgwUgArkQFgsgA0GHgAEQxQILEAAgACAANgIEIAAgADYCAAtjAAJAAkAgAUEASA0AIAAoAqwCIAFMDQAgACgCpAIgAUEUbGoiACAAKAIAIAJqIgA2AgAgAEF/TA0BIAAPC0GeigFBoQ1ByKgBQcOKARAAAAtB0IoBQaENQcuoAUHDigEQAAALDAAgAEG80AFBABAVCw0AIAAgASABEEQQ/AELbQEBfyMAQYACayIFJAAgBEGAwARxIAIgA0xyRQRAIAUgAUH/AXEgAiADayICQYACIAJBgAJJIgEbEEwaIAFFBEADQCAAIAVBgAIQYyACQYB+aiICQf8BSw0ACwsgACAFIAIQYwsgBUGAAmokAAtDAQN/AkAgAkUNAANAIAAtAAAiBCABLQAAIgVGBEAgAUEBaiEBIABBAWohACACQX9qIgINAQwCCwsgBCAFayEDCyADC/0MAQh/IwBBEGsiCiQAAkACQCABQv////9vWARAIAAQKQwBCyAGQYDAAHEhDCAGQYAwcSEOIAGnIQkCQAJAAkACQAJAA0AgCSgCECIHIAcoAhggAnFBf3NBAnRqKAIAIQsgBxAoIQgCQANAIAtFDQEgAiAIIAtBf2pBA3QiC2oiBygCBEcEQCAHKAIAQf///x9xIQsMAQsLIAkoAhQgC2ohCCAKIAc2AgwCfyAMRSAHKAIAIgtBgICAgAJxRXJFBEAgACAKQQhqIAMQDkEAEMYCDQkCfiAKKAIIIgdBAE4EQCAHrQwBCyAHuBAWCyEDIAkoAhAiCCAIKAIYIAJxQX9zQQJ0aigCACEHIAgQKCEIAkADQCAHBEAgCCAHQX9qQQN0IgtqIgcoAgQgAkYNAiAHKAIAQf///x9xIQcMAQsLQbsXQaENQdjGAEHHFxAAAAsgCSgCFCALaiEIIAogBzYCDCAHKAIAIQsLIAtBGnYiDQsgBhCYA0UNBiANQTBxIg1BMEYEQCAAIAkgAiAIIAcQyQJFDQIMCAsgBkGA9ABxRQ0FIA4EQCAEp0EAIAAgBBA7GyECIAWnQQAgACAFEDsbIQwCQCALQYCAgIB8cUGAgICABEcEQEF/IQcgACAJIApBDGoQ4AENCwJAIAooAgwoAgBBgICAgHxxQYCAgIB4RgRAIAAoAhAgCCgCABD3AQwBCyAAIAgpAwAQCwsgCigCDCIHIAcoAgBB////vwFxQYCAgIAEcjYCACAIQgA3AwAMAQsgC0GAgIAgcQ0AIAZBgBBxBEAgAiAIKAIARw0JCyAGQYAgcUUNACAMIAgoAgRHDQgLIAZBgBBxBEAgCCgCACIHBEAgACAHrUKAgICAcIQQCwsgAgRAIAQQDhoLIAggAjYCAAsgBkGAIHFFDQYgCCgCBCICBEAgACACrUKAgICAcIQQCwsgDARAIAUQDhoLIAggDDYCBAwGCyANQSBGDQQgDUEQRgRAQX8hByAAIAkgCkEMahDgAQ0JIAgoAgAiAgRAIAAgAq1CgICAgHCEEAsLIAgoAgQiAgRAIAAgAq1CgICAgHCEEAsLIAooAgwiAiACKAIAQf///78DcTYCACAIQoCAgIAwNwMAIAooAgwoAgAhCwwFCyAMRSALQYCAgOAAcXINBEEBIQcgACADIAgpAwAQWUUNBgwICyAKQQA2AgwgCS0ABUEIcUUNAiAJLwEGIgdBAkcNASACEF1FDQIgAhB5IgggCSgCKE8NAiAORUEAIAZBBxCEBEEHRhtFBEAgACAJEJcDRQ0BDAcLC0EBIQcgDEUNBiAAIAkoAiQgCEEDdGogAxAOEB8MBgsgB0FrakH//wNxQQhLDQACQAJAIAIQXUUEQCAAIAIQuwUiARARDQNBfyEHIAEQDA0IIAAgARC4BSICQX9MBEAgACABEAsMCQsgAkUEQCAAIAEQCyAAIAZB9hcQdiEHDAkLIAEQ4AghAiAAIAEQCyACRQ0BIAAgBkGXGBB2IQcMCAsgAhB5IgIgCRCDBEkNAQsgACAGQbUYEHYhBwwGCyAORUEAIAZBBxCEBEEHRhtFBEAgACAGQdcYEHYhBwwGC0EBIQcgDEUNBSAAIAEgAq0gAxAOIAYQ3QEhBwwFCyAAIAkgAiADIAQgBSAGEIcEIQcMBAsgC0GAgICAfHFBgICAgHhGBEAgDARAIAkvAQZBC0YEQCAAIAMgCCgCACgCECkDABBZRQ0ECyAAIAgoAgAoAhAgAxAOEB8LIAZBggRxQYAERw0BQX8hByAAIAkgCkEMahDgAQ0EIAgoAgAoAhApAwAQDiEBIAAoAhAgCCgCABD3ASAIIAE3AwAgCigCDCICIAIoAgBB////vwNxNgIADAELIAtBgICAgAJxBEBBASECIAwEQCAAIAkgAxAOIAYQugUhAgsgBkGCBHFBgARGBEAgCiAJKAIQECgiBjYCDEF/IQcgACAJIApBDGogBigCAEEadkE9cRCWAw0FCyACIQcMBAsgDARAIAAgCCkDABALIAggAxAONwMACyAGQYAEcUUNAEF/IQcgACAJIApBDGogCigCDCgCAEEadkE9cSAGQQJxchCWAw0DC0F/QQEgACAJIApBDGogBkEIdkEFcSIAQX9zIAooAgwoAgBBGnZxIAAgBnFyEJYDGyEHDAILIAAgBkHZFxB2IQcMAQtBfyEHCyAKQRBqJAAgBwtMAQJ/IwBBEGsiAyQAAkAgAUGAgAFxRQRAIAFBgIACcUUNASAAEPgBRQ0BCyADQQA2AgwgAEEEIAJBABD7AUF/IQQLIANBEGokACAEC8wBAQJ/AkACQCABQoCAgIBwWgRAIAGnIQMDQAJAIAMtAAVBBHFFDQAgACgCECgCRCADLwEGQRhsaigCFCIERQ0AIAQoAhBFDQAgACADrUKAgICAcIQQDiIBIAIgBCgCEBESACECIAAgARALIAIPCyADrUKAgICAcIQQDiEBIABBACADIAIQUyEEIAAgARALIAQNAiADLwEGQWtqQf//A3FBCE0EQCAAIAIQmwMiBA0ECyADKAIQKAIsIgMNAAsLQQAhBAsgBA8LIARBH3ULGgAgACABIAJBAE4EfiACrQUgArgQFgsQngELCwAgAEH/////B3EL0wkCBH8EfiMAQfAAayIFJAAgBEL///////////8AgyEKAkACQCABQn98IgtCf1EgAkL///////////8AgyIJIAsgAVStfEJ/fCILQv///////7///wBWIAtC////////v///AFEbRQRAIANCf3wiC0J/UiAKIAsgA1StfEJ/fCILQv///////7///wBUIAtC////////v///AFEbDQELIAFQIAlCgICAgICAwP//AFQgCUKAgICAgIDA//8AURtFBEAgAkKAgICAgIAghCEEIAEhAwwCCyADUCAKQoCAgICAgMD//wBUIApCgICAgICAwP//AFEbRQRAIARCgICAgICAIIQhBAwCCyABIAlCgICAgICAwP//AIWEUARAQoCAgICAgOD//wAgAiABIAOFIAIgBIVCgICAgICAgICAf4WEUCIGGyEEQgAgASAGGyEDDAILIAMgCkKAgICAgIDA//8AhYRQDQEgASAJhFAEQCADIAqEQgBSDQIgASADgyEDIAIgBIMhBAwCCyADIAqEUEUNACABIQMgAiEEDAELIAMgASADIAFWIAogCVYgCSAKURsiBxshCiAEIAIgBxsiC0L///////8/gyEJIAIgBCAHGyICQjCIp0H//wFxIQggC0IwiKdB//8BcSIGRQRAIAVB4ABqIAogCSAKIAkgCVAiBht5IAZBBnStfKciBkFxahB7IAUpA2ghCSAFKQNgIQpBECAGayEGCyABIAMgBxshAyACQv///////z+DIQQgCEUEQCAFQdAAaiADIAQgAyAEIARQIgcbeSAHQQZ0rXynIgdBcWoQe0EQIAdrIQggBSkDWCEEIAUpA1AhAwsgBEIDhiADQj2IhEKAgICAgICABIQhBCAJQgOGIApCPYiEIQkgAiALhSEMAn4gA0IDhiIBIAYgCGsiB0UNABogB0H/AEsEQEIAIQRCAQwBCyAFQUBrIAEgBEGAASAHaxB7IAVBMGogASAEIAcQ0QIgBSkDOCEEIAUpAzAgBSkDQCAFKQNIhEIAUq2ECyECIAlCgICAgICAgASEIQkgCkIDhiEDAkAgDEJ/VwRAIAMgAn0iASAJIAR9IAMgAlStfSIEhFAEQEIAIQNCACEEDAMLIARC/////////wNWDQEgBUEgaiABIAQgASAEIARQIgcbeSAHQQZ0rXynQXRqIgcQeyAGIAdrIQYgBSkDKCEEIAUpAyAhAQwBCyACIAN8IgEgAlStIAQgCXx8IgRCgICAgICAgAiDUA0AIAFCAYMgBEI/hiABQgGIhIQhASAGQQFqIQYgBEIBiCEECyALQoCAgICAgICAgH+DIQIgBkH//wFOBEAgAkKAgICAgIDA//8AhCEEQgAhAwwBC0EAIQcCQCAGQQBKBEAgBiEHDAELIAVBEGogASAEIAZB/wBqEHsgBSABIARBASAGaxDRAiAFKQMAIAUpAxAgBSkDGIRCAFKthCEBIAUpAwghBAsgAadBB3EiBkEES60gBEI9hiABQgOIhCIBfCIDIAFUrSAEQgOIQv///////z+DIAKEIAetQjCGhHwhBAJAIAZBBEYEQCAEIAMgA0IBgyIBfCIDIAFUrXwhBAwBCyAGRQ0BCwsgACADNwMAIAAgBDcDCCAFQfAAaiQAC1ABAX4CQCADQcAAcQRAIAEgA0FAaq2GIQJCACEBDAELIANFDQAgAiADrSIEhiABQcAAIANrrYiEIQIgASAEhiEBCyAAIAE3AwAgACACNwMICx8BAX8gAygCACAESAR/IAAgASACIAMgBBDtBwVBAAsLTwACQCAAIAEgAhAOELEFIgANACABKQMAIgJCf1cEQCABIAIgBXwiAjcDAAsgAiADUwRAIAEgAzcDACAADwsgAiAEVw0AIAEgBDcDAAsgAAslAQJ/IAAgACgC2AEiAUF/ajYC2AEgAUEBTAR/IAAQ9AcFQQALC4kCAQN/IAFBEGohBQJAAkAgASgCECIELQAQRQ0AIAAoAhAgBCACIAMQ3wgiBgRAIAYoAhwiAiAEKAIcRwRAIAAgASgCFCACQQN0EJkCIgJFDQMgASACNgIUCyABIAYQngIiAjYCECAAKAIQIAQQnAIgASgCFCACKAIgQQN0akF4ag8LIAQoAgBBAUYNACAAIAQQtgUiBEUNASAEQQE6ABAgACgCECAEEJUDIAAoAhAgBSgCABCcAiAFIAQ2AgALIAQoAgBBAUYEQEEAIQQgACAFIAEgAiADENYEBH9BAAUgASgCFCABKAIQKAIgQQN0akF4agsPC0HUwABBoQ1BzD5B9MAAEAAAC0EAC34CAn8BfiMAQRBrIgMkACAAAn4gAUUEQEIADAELIAMgASABQR91IgJqIAJzIgKtQgAgAmciAkHRAGoQeyADKQMIQoCAgICAgMAAhUGegAEgAmutQjCGfCABQYCAgIB4ca1CIIaEIQQgAykDAAs3AwAgACAENwMIIANBEGokAAuqBQEFfyMAQeAAayIEJAAgBCABNgJcQQAhAQJAAkACQAJAAkACQAJAAkACQAJAAkADQCABQRRsIgMgBGpBbGohBQNAAkAgBCAEKAJcIgJBBGo2AlwCQAJAAkACQAJAIAIoAgAiBg4IAAECAwMDBAgFCyABQQRODRAgBCACQQhqNgJcIAIoAgQhAiADIARqIgMgACgCDCAAKAIQEJMBIAFBAWohASADIAIQ8AVFDQYMCQsgAUEETg0OIAQgAkEIajYCXCACKAIEIQIgAyAEaiIDIAAoAgwgACgCEBCTASABQQFqIQEgAyACEO8FRQ0FDAgLIAFBBE4NDCAEIAJBCGo2AlwgAigCBCECIAMgBGoiAyAAKAIMIAAoAhAQkwEgAUEBaiEBIAMgAhCrA0UNBAwHCyABQQFMDQogAUEETg0JIAMgBGoiAiAAKAIMIAAoAhAQkwEgAiACQVhqIgMoAgggAygCACACQWxqIgUoAgggBSgCACAGQX1qENkCDQUgAUF/aiEBIAMQViAFEFYgAyACKAIQNgIQIAMgAikCCDcCCCADIAIpAgA3AgAMAwsgAUEATA0HIAUQ2AJFDQEMBQsLCxABAAsgAUEBRw0CIAAgBBDDCSEBIAQQVgwJCyABQQFqIQELQQAhACABQQAgAUEAShshAQNAIAAgAUYEQEF/IQEMCQUgBCAAQRRsahBWIABBAWohAAwBCwALAAtBxeQDQfzjA0GmCkGW5AMQAAALQbbkA0H84wNBmwpBluQDEAAAC0He4wNB/OMDQYwKQZbkAxAAAAtBp+QDQfzjA0GLCkGW5AMQAAALQd7jA0H84wNBgApBluQDEAAAC0He4wNB/OMDQfkJQZbkAxAAAAtB3uMDQfzjA0HyCUGW5AMQAAALIARB4ABqJAAgAQtpAQJ/An8gACgCACIDQQJqIgQgACgCBEoEQEF/IAAgBBCsAw0BGiAAKAIAIQMLIAAgA0EBajYCACAAKAIIIgQgA0ECdGogATYCACAAIAAoAgAiAEEBajYCACAEIABBAnRqIAI2AgBBAAsLpQIBBn8jAEEQayIFJAACQCAAKAJAIgFFBEAMAQsCQCABAn8gASgCyAEiAiABKALEASIESARAIAEoAswBIQMgAgwBCyACQQFqIARBA2xBAm0QSyEEIAAoAgAhAwJAIAEoAswBIgYgAUHQAWpGBEAgA0EAIARBA3QgBUEMahC0ASIDRQ0DIAMgASgCzAEgASgCyAFBA3QQJBoMAQsgAyAGIARBA3QgBUEMahC0ASIDRQ0CCyAFKAIMIQYgASADNgLMASABIAZBA3YgBGo2AsQBIAEoAsgBC0EBajYCyAEgAyACQQN0aiIEIAEoArwBNgIAIAQgASgCwAE2AgQgAEGyARANIAAgAkH//wNxEBcgASACNgK8AQwBC0F/IQILIAVBEGokACACCxMAIABCgICAgHCDQoCAgIDAAFELSQECfyACQSkQQSIELQARBEAgABDDAkEADwsgACAEKQMIIgIgAyACQQAQEyICEAwEf0EABSABQoCAgIAwIAIgAhAnGzcDACAECwssAQF/IwBBEGsiAiQAIAIgACgCODYCDCACQQxqIAEQrgghACACQRBqJAAgAAufAQECfwJAAkAgAkL/////B1gEQCAAIAEgAqcQkQEQdyIEQQFIDQFBfyAEIAAgASACEJ4BIgIQDBshBAwCCyAAIAIQlAMiBUUEQEF/IQQMAQsCQCAAIAEgBRB3IgRBAUgEQEKAgICAMCECDAELQX8gBCAAIAEgBSABQQAQEyICEAwbIQQLIAAgBRASDAELQoCAgIAwIQILIAMgAjcDACAECxYAIABCgICAgHBaBEAgAKcgATYCIAsLDQAgACABIAEQRBCaAgt7AQF/QX8hAiAAKAIUBH9BfwUgAUKAgICAcINCgICAgJB/UgRAIAAoAgAgARAsIgEQDARAIAAQ/wJBfw8LIAAgAaciAkEAIAIoAgRB/////wdxEFghAiAAKAIAIAEQCyACDwsgACABpyIAQQAgACgCBEH/////B3EQWAsLagEBfyAAKAIUBEAgACgCACABEAtBfw8LAkAgAUKAgICAcINCgICAgJB/UQ0AIAAoAgAgARA+IgEQDEUNACAAEP8CQX8PCyAAIAGnIgJBACACKAIEQf////8HcRBYIQIgACgCACABEAsgAgsWAQF/IABCIIinIgFFIAFBC2pBEUtyC0oBAn8gAkL/////B1gEQCAAIAEgAiADQYCAARDdAQ8LIAAgAhCUAyIERQRAIAAgAxALQX8PCyAAIAEgBCADEEkhBSAAIAQQEiAFC4IKARJ/IwBBMGsiByQAIAFBADYCACACQQA2AgAgB0EANgIsIAdBADYCKCAEQTBxIQ4gBEEQcSERIAMoAhAiCRAoIQUCQAJAAkACfwNAIAggCSgCIEgEQAJAIAUoAgQiDUUNAEEAIBEgBSgCAEGAgICAAXEbIAQgACANEJoDIgt2QQFxRXINAAJAIA5FDQAgBSgCAEGAgICAfHFBgICAgHhHDQAgAygCFCAIQQN0aigCACgCECkDABCEAUUNACAAIAUoAgQQ3gFBfwwECyAAIAdBJGogDRCzAQRAIAxBAWohDAwBCyALRQRAIA9BAWohDwwBCyAKQQFqIQoLIAVBCGohBSAIQQFqIQgMAQsLQQAhBQJAIAMtAAUiBkEEcUUNACAGQQhxBEAgBEEBcUUNASADKAIoIAxqIQwMAQsgAy8BBiIGQQVGBEAgBEEBcUUNASADrUKAgICAcIQQiwQgDGohDAwBCyAAKAIQKAJEIAZBGGxqKAIUIgZFDQAgBigCBCIGRQ0AQX8gACAHQSxqIAdBKGogA61CgICAgHCEIAYRPwANARogBEEEdkF/c0EBcSELQQAhCANAIAggBygCKE8NASAEIAAgCEEDdCIJIAcoAixqKAIEIgYQmgN2QQFxBEACQCAORQRAQQAhBgwBCyAAIAcgAyAGEFMiBkF/TARAIAAgBygCLCAHKAIoEGJBfwwFCyAGBH8gBygCACEGIAAgBxBOIAZBAnZBAXEFQQALIQYgBygCLCAJaiAGNgIACyAGIAtyIAVqIQULIAhBAWohCAwACwALIAAgDCAPaiIPIApqIAVqIhNBARBLQQN0EC4iEEUEQCAAIAcoAiwgBygCKBBiQX8MAQtBACEJIAMoAhAiFRAoIQUgDCEGIA8hCkEBIRRBACEIA0AgCCAVKAIgTkUEQAJAIAUoAgQiEkUNAEEAIBEgBSgCAEGAgICAAXEiDRsgBCAAIBIQmgMiC3ZBAXFFcg0AIA1BHHYhFgJ/IAAgB0EkaiASELMBBEAgCUEBaiEOQQAhFCAGIQ0gCgwBCyALRQRAIAZBAWohDSAJIQ4gBiEJIAoMAQsgCSEOIAYhDSAKIQkgCkEBagshCyAAIBIQGCEKIBAgCUEDdGoiBiAWNgIAIAYgCjYCBCAOIQkgDSEGIAshCgsgBUEIaiEFIAhBAWohCAwBCwsCQCADLQAFIgtBBHFFDQACfyALQQhxBEAgBEEBcUUNAiADKAIoDAELIAMvAQZBBUcEQEEAIQUDQCAFIAcoAihPRQRAAkBBACARIAcoAiwgBUEDdGoiAygCACINGyAEIAAgAygCBCILEJoDdkEBcUVyRQRAIBAgCkEDdGoiAyANNgIAIAMgCzYCBCAKQQFqIQoMAQsgACALEBILIAVBAWohBQwBCwsgACAHKAIsEBkMAgsgBEEBcUUNASADrUKAgICAcIQQiwQLIQhBACEFIAhBACAIQQBKGyEEA0AgBCAFRg0BIBAgCUEDdGoiA0EBNgIAIAMgBRCRATYCBCAFQQFqIQUgCUEBaiEJDAALAAsgCSAMRw0BIAYgD0cNAiAKIBNHDQMgDEUgFHJFBEAgECAMQQhBJyAAEN0CCyABIBA2AgAgAiATNgIAQQALIQUgB0EwaiQAIAUPC0HCPkGhDUHKO0HePhAAAAtB/T5BoQ1ByztB3j4QAAALQao/QaENQcw7Qd4+EAAACx8BAX4gACgCECIAKQOAASEBIABCgICAgCA3A4ABIAELGQAgACAAKAIQIgApA4ABEAsgACABNwOAAQsLACAAQYCAgIB4cgtkAQF/AkAgACgCCCICIAAoAgxODQAgACgCEARAIAAgAkEBajYCCCAAKAIEIAJBAXRqIAE7ARBBAA8LIAFB/wFLDQAgACACQQFqNgIIIAAoAgQgAmogAToAEEEADwsgACABEPMICyQAIAAgATYCDCAAQQA2AgggAEIANwIAIAAgAkHsAiACGzYCEAtMAQJ/An8gACgCBCIDIAJqIgQgACgCCEsEf0F/IAAgBBDnAQ0BGiAAKAIEBSADCyAAKAIAaiABIAIQJBogACAAKAIEIAJqNgIEQQALCw4AIAAoAhAgASACEMEFCy0BAn9BfyEDIAAgAUEAEJkBIgIEfyACEJgBBEAgABBxQX8PCyACKAIoBUF/CwsJACAAQQEQ1AQLEAAgACgCICgCDCgCIC0ABAtqAQN/IwBBEGsiAyQAAkACQCABQoCAgIBwVA0AIAGnIgQvAQYhBSACBEAgBUEeRw0BDAILIAVBa2pB//8DcUEJSQ0BCyADQfIeQdUeIAIbNgIAIABB1NABIAMQFUEAIQQLIANBEGokACAEC4UCAQN/IAIgASgCBCIEQf////8HcSADR3JFBEAgAa1CgICAgJB/hBAODwsgAyACayIFQQFIIARBf0pyRQRAIAMgAiADIAJKGyEGQQAhBCACIQMDQCADIAZGRQRAIAQgASADQQF0ai8BEHIhBCADQQFqIQMMAQsLIARBgAJOBEAgACABIAJBAXRqQRBqIAUQjgQPC0EAIQMgACAFQQAQ+gEiAEUEQEKAgICA4AAPCyAAQRBqIQQDQCADIAVGRQRAIAMgBGogASACIANqQQF0ai0AEDoAACADQQFqIQMMAQsLIAQgBWpBADoAACAArUKAgICAkH+EDwsgACABIAJqQRBqIAUQ0AILEwAgAEKAgICAcINCgICAgJB/UQseACAAIAEgAkEATgR+IAKtBSACuBAWCyADIAQQxQILCQAgACABEOIIC80CAQN/AkAgAUKAgICAcFQgAkL/////D1ZyDQAgAaciAygCKCACpyIETQ0AAkACQAJAAkACQAJAAkACQAJAAkAgAy8BBiIFQXhqDhYBCgoKCgoKCgoKCgoKAwIDBAUGBwgJAAsgBUECRw0JCyADKAIkIARBA3RqKQMAEA4PCyADKAIkIARqMAAAQv////8Pgw8LIAMoAiQgBGoxAAAPCyADKAIkIARBAXRqMgEAQv////8Pgw8LIAMoAiQgBEEBdGozAQAPCyADKAIkIARBAnRqNQIADwsgAygCJCAEQQJ0aigCACIAQQBOBEAgAK0PCyAAuBAWDwsgAygCJCAEQQJ0aioCALsQFg8LIAMoAiQgBEEDdGorAwAQFg8LIAAgAhA6IQMgACACEAsgA0UEQEKAgICA4AAPCyAAIAEgAyABQQAQEyEBIAAgAxASIAELMQEBfyABQoCAgIBwVARAQQAPCyABpyICLwEGQSlGBEAgACABEOUIDwsgAi0ABUEBcQseACAAQoCAgIBwg0KAgICAkH9RBEAgAKcgARCQBAsLFgAgACAAKAIoIAFBA3RqKQMAIAEQUQskAQF/IwBBEGsiAyQAIAMgAjYCDCAAIAEgAhCcBCADQRBqJAALNQEBfyAAKAIAIgEEQCAAKAIUIAFBACAAKAIQEQAAGgsgAEIANwIAIABCADcCECAAQgA3AggLGQAgACABIAJBASADIAQgBSAGIAcgCBCEAgshAQJ/IAAoApgCIgJBAE4EfyAAKAKAAiACai0AAAVBAAsL7AQBB38jAEGQAmsiBSQAIAVBADoAECAAIAUQ8AIgAEEQaiEJQQEhBAJAAkADQEF+IQgCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgCSgCACIDQf4Aag4FAQoKCgYACwJAAkACQAJAAkAgA0FYag4CAQIACwJAIANBRWoOAwYOCAALAkAgA0Glf2oOAwEOAwALAkAgA0GFf2oOAwEOBAALIANBpX9GDQYgA0EvRg0IIANBqn9HDQ0MEQsgBEH/AU0NCQwPCyAEQX9qIgQgBUEQamotAABBKEcNDgwKCyAEQX9qIgQgBUEQamotAABB2wBHDQ0MCQtB/QAhBiAEQX9qIgQgBUEQamotAAAiCEH7AEYNCkGqfyEDIAhB4ABHDQ0gACAJEI0CIABBADYCMCAAIAAoAhQ2AgQgACAAKAI4EMwDDQ0LIAAoAihB4ABGDQcgBEH/AUsNCyAFQRBqIARqQeAAOgAADAYLIAcgBEECRnIhB0E7IQYMCAsgB0ECciAHIARBAkYbIQdBpX8hBgwHCyAHQQRyIQdBPSEGDAYLQX8hCAsgBhDqBkUNAiAAIAAoAjggCGo2AjggABDPBA0GDAILIAVBEGogBGogAzoAAAsgBEEBaiEECyAJKAIAIQMLIANBg39HBEAgAyEGDAELQVkhBiAAQcMAEFANACAAQS0QUA0AQYN/IQYLIAAQEA0BIARBAUsNAAtBWSAAKAIQIABBwwAQUBshAyACRQ0BIANBCiAAKAIEIAAoAhRGGyEDDAELQap/IQMLIAEEQCABIAc2AgALIAAgBRDvAiEAIAVBkAJqJABBfyADIAAbCxEAIAAgACgCsAIoAgA2ArACC04AIAEgACgCsAI2AgAgACABNgKwAiABQX82AhQgASAFNgIQIAEgBDYCDCABIAM2AgggASACNgIEIAAoArwBIQAgAUEANgIcIAEgADYCGAvLBQEGfyAAKAIAIQQCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAw4HBAAAAAABAgMLIAEgAiABKALAAUEBEMgDIgZBAEgNBQJAIAZB/////wNMBEAgASgCdCIHIAZBBHRqIggoAgQiBSABKAK8ASIJRgRAIANBA0cNAiABLQBuQQFxDQIgByAGQQR0aigCDEH4AHFBCEcNAgwJCyAFQQJqIAlHDQcgCCgCDEH4AHFBGEYNAQwHCyABKAK8ASABKALwAUcNBgsgAEHR/ABBABAUDAcLIAQgASACQQMQ5wIPCyABIAIgASgCwAFBABDIA0EATg0CIAEoAigEQAJAIAEgAhCsAiIDRQ0AIAMtAARBAnFFDQAgAygCCCABKAK8AUcNACABKAIkQQFGDQQLQYCAgIAEQX8gBCABIAIQ6AIbDwsgASACEIUCIgBBf0oNCCAEIAEgAhBXIgBBAEgNCAJAIAJBzQBHDQAgASgCSEUNACABIAA2ApgBCyABKAJ0IABBBHRqIAEoArwBNgIIIAAPCxABAAsgBCABIAJBABDnAiEADAYLIABB0fwAQQAQFAwCCyABKAK8ASEFIANBfWpBAkkNACAFIAEoAvABRw0AIAEgAhDRBEEASA0AIABB/PwAQQAQFAwBCyABIAIgBRDrBkEATgRAIABBo/0AQQAQFAwBCwJAIAEoAihFDQAgASACEKwCIgZFDQAgASAGKAIIIAUQ0ARFDQAgAEG/+wBBABAUDAELIAEoAiBFDQIgASgCJEEBSw0CIAUgASgC8AFHDQIgBCABIAIQ6AIiAA0BC0F/DwsgACAALQAEQfkBcUEGQQIgA0ECRhtyOgAEQYCAgIAEDwsgBCABIAJBASADQQRGQQF0IANBA0YbEOcCIgBBAEgNACABKAJ0IABBBHRqIgEgASgCDEF8cSADQQJGckECcjYCDCAADwsgAAuzAQEDfwJAAkAgACgCQCICEKUBIgNBvwFHBEAgA0HNAEcNASACKAKYAiEDIAJBfzYCmAIgAiADNgKEAiAAQc0AEA0gACABEBsPCyACKAKYAiIDIAMgAigCgAIiBGooAAFrQQFqIgMgBGoiBC0AAEHWAEcNASAAKAIAIAQoAAEQEiACKAKAAiADakEBaiAAKAIAIAEQGBBcIAJBfzYCmAILDwtB04UBQaENQdOwAUHfjAEQAAALMgAgACABIAJCgICAgAh8Qv////8PWAR+IAJC/////w+DBSACuRAWCyADIARBB3IQxQILqQEBAn8jAEEQayIEJAACQAJAIAAgASACQQBBACAEQQxqEPgEIgEQDA0AIAQoAgwiBUECRwRAIAMgBTYCACABIQIMAgsgACABQekAIAFBABATIgIQDA0AIAMgACACEC0iAzYCAEKAgICAMCECIANFBEAgACABQcAAIAFBABATIQILIAAgARALDAELIAAgARALIANBADYCAEKAgICA4AAhAgsgBEEQaiQAIAILIQAgACABIAJCAEL/////////D0IAEH0hASAAIAIQCyABC7YHAgd/AX4jAEEQayICJAAgACAAQRBqIgQQjQIgACAAKAI4IgE2AjQgAiABNgIMIAAgACgCFDYCBAJ/A0ACQCAAIAE2AhggACAAKAIIIgY2AhRBIiEDAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABLAAAIgdB/wFxIgUOewAJCQkJCQkJCQYEBQUDCQkJCQkJCQkJCQkJCQkJCQkJBgkCCQ4JCQEJCQkLCQoJBwgMDAwMDAwMDAwJCQkJCQkJDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4JCQkJDgkODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODgkLIAEgACgCPEkNDCAEQap/NgIADA4LQSchAyAAKAJMRQ0LCyAAIANBASABQQFqIAQgAkEMahCIAw0ODAwLIAFBAWogASABLQABQQpGGyEBCyACIAFBAWoiATYCDCAAIAZBAWo2AggMDQsgACgCTEUNBwsgAiABQQFqIgE2AgwMCwsgACgCTEUNBSABLQABIgNBL0YNCCADQSpHDQUgAUECaiEBA0AgAiABNgIMA0ACQAJAAkACQCABLQAAIgNBdmoOBAECAgMACyADQSpHBEAgAw0CIAEgACgCPEkNAyAAQdDUAEEAEBQMDwsgAS0AAUEvRw0CIAIgAUECaiIBNgIMDA8LIAAgACgCCEEBajYCCAwBCyADQRh0QRh1QX9KDQAgAUEGIAJBDGoQZSEDIAIoAgwhASADQX9HDQELCyABQQFqIQEMAAsACyABLQABEEZFDQMMBAsgB0F/Sg0DIABB6tQAQQAQFAwHCyABLQABEEZFDQIMAQsgACgCTEUNASABLQABEEZFDQELIAAoAgAgASACQQxqQQBBCiAAKAJMIgEbIAFBAEdBAnQQvAIiCBAMDQQgAEGAfzYCECAAIAg3AyAMAgsgBCAFNgIAIAIgAUEBajYCDAwBCyACIAFBAWo2AgwgACACQQxqIAUQpQgiAUUNAiAAQYN/NgIQIABCADcCJCAAIAE2AiALIAAgAigCDDYCOEEADAMLIAFBAmohAQNAIAIgATYCDANAAkACQCABLQAAIgMEQCADQXZqDgQGAQEGAQsgASAAKAI8Tw0FDAELIANBGHRBGHVBf0oNACABQQYgAkEMahBlIgNBfnFBqMAARgRAIAIoAgwhAQwFCyACKAIMIQEgA0F/Rw0BCwsgAUEBaiEBDAALAAsLIARBqH82AgBBfwshASACQRBqJAAgAQsRACAAIAEgASACIANBAhD+AwusAQICfwJ+An8gAkUEQEKAgICAMCEGQQAMAQsgACgCECIDKQOAASEGIANCgICAgCA3A4ABQX8LIQNBfyEEAkAgACABQQYgAUEAEBMiBRAMDQACQCAFEBENACAFECcNACAAIAUgAUEAQQAQNiEBAn8gAyACDQAaQX8gARAMDQAaIAMgARAhDQAaIAAQKUF/CyEEIAAgARALDAELIAMhBAsgAgRAIAAgBhCQAQsgBAsMACAAIAEgACABSBsLHQAgAEKAgICAcFoEfyAApy0ABUEEdkEBcQVBAAsLrgEBAX8jAEEQayIDJAACQAJAIAIQXQRAIAEgAhB5NgIAQQEhAgwBCyAAKAIQIgAoAiwgAk0NAQJ/AkAgACgCOCACQQJ0aigCACIAKQIEQoCAgICAgICAQINCgICAgICAgIDAAFINACADQQxqIAAQzAVFDQBBASADKAIMIgBBf0cNARoLQQAhAEEACyECIAEgADYCAAsgA0EQaiQAIAIPC0HKL0GhDUG/GEHCPxAAAAtFACAAKAIQIAEgAhDkASIBIAJFckUEQCAAEMcBIAEPCyADBEAgA0EAIAAoAhAgARCXBCIAIAJrIgIgAiAASxs2AgALIAELaQEDfiAAIAJCIIgiAyABQiCIIgR+IAJC/////w+DIgIgAUL/////D4MiAX4iBUIgiCACIAR+fCICQiCIfCABIAN+IAJC/////w+DfCIBQiCIfDcDCCAAIAVC/////w+DIAFCIIaENwMAC/kBAgJ/A34jAEEQayICJAACfiABvSIFQv///////////wCDIgRCgICAgICAgHh8Qv/////////v/wBYBEAgBEI8hiEGIARCBIhCgICAgICAgIA8fAwBCyAEQoCAgICAgID4/wBaBEAgBUI8hiEGIAVCBIhCgICAgICAwP//AIQMAQsgBFAEQEIADAELIAIgBEIAIAWnZ0EgaiAEQiCIp2cgBEKAgICAEFQbIgNBMWoQeyACKQMAIQYgAikDCEKAgICAgIDAAIVBjPgAIANrrUIwhoQLIQQgACAGNwMAIAAgBCAFQoCAgICAgICAgH+DhDcDCCACQRBqJAALKgEBfyMAQRBrIgMkACADIAI2AgwgACABIAJB7gJBABCeBBogA0EQaiQACw0AIABBACABQQAQkwQLxwoBBn8jAEEgayICJAACQAJAAkACQAJAAkACQAJ/IAAoAhAiA0GDf0cEQEEAIANBV0cNARogACgCQCIDLQBsQQFxRQRAIABB44YBQQAQFAwDCyADKAJkRQRAIABB/oYBQQAQFAwDC0F/IQMgABAQDQgCQAJAAkACQCAAKAIQIgVBV2oOBAIBAQIACyAFQd0ARiAFQUZqQQJJciAFQf0ARnINAQsgACgCMA0AIAVBKkYEQCAAEBANC0EBIQQLIAAgARC5AUUNAQwKCyAAQQYQDQsgACgCQC0AbCEBIAQEQCAAEDUhBCAAEDUhAyAAQf4AQf0AIAFBA0YbEA0gAEEOEA0gAEEGEA0gAEEGEA0gACAEEB4gAEGFARANIAFBA0ciB0UEQCAAQYsBEA0LIABBgQEQDSAAQcIAEA0gAEHpABAbIABB6gBBfxAcIQUgACADEB5BiQEhBiAAIAcEf0GJAQUgAEHBABANIABBwAAQGyAAQYsBEA1BigELEA0gAEEREA0gAEHqAEF/EBwhBiAAQQ4QDSAAQesAIAQQHBogACAGEB4gAEEBEA0gAEECEDkgAEGrARANIABB6gBBfxAcIQQgAUEDRyIGRQRAIABBiwEQDQsgAEGGARANIABBABBsIABB6gBBfxAcIQcgBkUEQCAAQYsBEA0LIABBgQEQDSAAQcIAEA0gAEHpABAbIABB6QAgAxAcGiAAQcEAEA0gAEHAABAbIAAgBxAeIABBDxANIABBDxANIABBDxANIABBARDqAiAAIAQQHiAAQYYBEA0gAEEBEGwgAEHqAEF/EBwhBCABQQNHIgFFBEAgAEGLARANCyAAQYEBEA0gAEHCABANIABB6QAQGyAAQekAIAMQHBogAEHrACAFEBwaIAAgBBAeIABBhgEQDSAAQQIQbCAAQeoAQX8QHCEDIAFFBEAgAEGLARANCyAAIAMQHiAAQTAQDUEAIQMgAEEAEBsgAEEEEGwgACAFEB4gAEHBABANIABBwAAQGyAAQQ8QDSAAQQ8QDSAAQQ8QDQwJCyABQQNGBEAgAEGLARANCyAAQYgBEA0gAEHpAEF/EBwhASAAQQEQ6gIMBAsgACgCIAshBEF/IQMgACABQQRyEN8GDQYgACgCECIFQfsAaiEDIAVBPUdBACADQQtLG0UEQCAAEBANASAAIAJBHGogAkEYaiACQRRqIAJBEGpBACAFQT1HIAUQugFBAEgNASAAIAEQuQEEQCAAKAIAIAIoAhQQEgwCCyAFQT1GBEAgAigCHCIBQTxHDQcgAigCFCAERw0GIAAgBBCqAQwGCyAAIANBmocBai0AABANIAIoAhwhAQwGC0EAIQMgBUHvAGpBAksNBiAAEBANACAAIAJBHGogAkEYaiACQRRqIAJBEGogAkEMakEBIAUQugFBAEgNACAAQREQDSAFQZN/RgRAIABBsAEQDQsgAEHqAEHpACAFQZJ/RhtBfxAcIQMgAEEOEA0gACABELkBRQ0BIAAoAgAgAigCFBASC0F/IQMMBQsCQCACKAIcIgFBPEcNACACKAIUIARHDQAgACAEEKoBCyACKAIMQX9qIgRBA08NASAAIARBFWpB/wFxEA0gACABIAIoAhggAigCFCACKAIQQQFBABDQASAAQesAQX8QHCEBIAAgAxAeIAIoAgwhAwNAIAMEQCAAQQ8QDSACIAIoAgxBf2oiAzYCDAwBCwsLIAAgARAeQQAhAwwDCxABAAtBPCEBC0EAIQMgACABIAIoAhggAigCFCACKAIQQQJBABDQAQsgAkEgaiQAIAMLrAUBBn9BAiEMAkACQAJAAkACQCAAKAJAIgkQpQEiCEG5f2oOBAQCAgEACyAIQcEARg0CIAhBvAFHBEAgCEG2AUcNAiAJKAKAAiAJKAKYAmoiCygAASEKIAsvAAUhCyAKQQhGDQIgCkE6RwRAIApB8QBGDQMgCkHNAEcNBQsgCS0AbkEBcUUNBCAAQZmJAUEAEBRBfw8LQQEhDCAJKAKAAiAJKAKYAmoiBygAASEKIAcvAAUhCwwDC0EDIQwMAgsgB0G7f0YEQCAAQbeJAUEAEBRBfw8LIAdBfnFBlH9GBEAgAEHYiQFBABAUQX8PCyAHQV9xQdsARgRAIABBxP4AQQAQFEF/DwsgAEH8iQFBABAUQX8PC0EBIQwgCSgCgAIgCSgCmAJqKAABIQoLIAkoApgCIQ1BfyEHIAlBfzYCmAIgCSANNgKEAgJAAkAgBgRAAkACQAJAAkAgCEG5f2oOBAEDAwIACwJAIAhBwQBHBEAgCEG8AUYNASAIQbYBRw0EIAAQNSEHIABBuQEQDSAAIAoQGyAAIAcQOSAAIAsQFyAJIAdBARBwGkE8IQggAEE8EA0MBwsgAEHCABANIAAgChAbQcEAIQgMBgsgAEG9ARANIAAgChAbIAAgCxAXQbwBIQgMBQsgAEHxABANIABBExANQccAIQgMAwsgAEHwABANIABBFBANQcoAIQgMAgsQAQALAkACQAJAIAhBuX9qDgQBBAQCAAsgCEG2AUcNAyAAEDUhByAAQbkBEA0gACAKEBsgACAHEDkgACALEBcgCSAHQQEQcBpBPCEIDAMLIABB8QAQDUHHACEIDAILIABB8AAQDUHKACEIDAELIAAgCBANCyABIAg2AgAgAiALNgIAIAMgCjYCACAEIAc2AgAgBQRAIAUgDDYCAAtBAAtaAQN/IwBBEGsiASQAAkAgACgCECIDQap/Rg0AIANBO0cEQCADQf0ARg0BIAAoAjANASABQTs2AgAgAEH91gAgARAUQX8hAgwBCyAAEBAhAgsgAUEQaiQAIAILGQAgASACQQ9xOgAEIAFBCGogAEHQAGoQTQu8AQEFfyMAQSBrIgQkAAJ+AkAgAkKAgICAcINCgICAgJB/UgRAIAAgAhA+IgIQDA0BCyAAIARBCGogARBEIgYgAxBEIgdqIAKnIgUoAgQiCEH/////B3FqIAhBH3YQoQMNACAEQQhqIAEgBhCaAhogBEEIaiAFQQAgBSgCBEH/////B3EQWBogBEEIaiADIAcQmgIaIAAgAhALIARBCGoQOAwBCyAAIAIQC0KAgICA4AALIQIgBEEgaiQAIAILPQACfyAAIAFBgIAETwR/QX8gACABQYCAfGoiAUEKdkGAsANqEJIBDQEaIAFB/wdxQYC4A3IFIAELEJIBCwtRACAAQf8ATQRAIABBA3ZB/P///wFxQeDfAWooAgAgAHZBAXEPCyAAQX5xQYzAAEYgABD0BQR/QQEFIABB0IcCQdCMAkEUEK0DQQBHC0EAR3ILLgEBfyABQoCAgIBwWgR/IAGnLwEGIgJBKUYEQCAAIAEQ1AgPCyACQQJGBUEACwvJAgICfwF+IwBBEGsiBCQAAkAgAUKAgICAcFQEQCABIQUMAQsgAkFvcSEDAkACQAJAIAJBEHENACAAIAFBwgEgAUEAEBMiBRAMDQEgBRARDQAgBRAnDQAgBCAAQcYAQRYgA0EBRhtByAAgAxsQMjcDCCAAIAUgAUEBIARBCGoQNiEFIAAgBCkDCBALIAUQDA0BIAAgARALIAVCgICAgHBUDQMgACAFEAsgAEGowwBBABAVDAILIANBAEchA0EAIQIDQCACQQJHBEAgACABQTdBOSACIANGGyABQQAQEyIFEAwNAgJAIAAgBRA7RQ0AIAAgBSABQQBBABA2IgUQDA0DIAVC/////29WDQAgACABEAsMBQsgACAFEAsgAkEBaiECDAELCyAAQajDAEEAEBULIAAgARALC0KAgICA4AAhBQsgBEEQaiQAIAULVwECfyMAQRBrIgMkAEF/IQQgACADQQhqIAIQgARFBEBBACEEIAEgAykDCCICQoCAgICAgIAQWgR+IABBihkQakF/IQRCAAUgAgs3AwALIANBEGokACAECw0AIAAgASACEA4QsgULzAECAX8BfAJ/A0ACQAJAAn8CQAJAIAIQVA4IAAAAAAQEBAEECyACpwwBCyACEEoiBL0iAkI0iKdB/w9xIgNBnQhLDQEgBJlEAAAAAAAA4EFjBEAgBKoMAQtBgICAgHgLIQBBAAwDC0EAIQBBACADQdIISw0CGiACQv////////8Hg0KAgICAgICACIQgA0Htd2qthkIgiKciAEEAIABrIAJCf1UbIQBBAAwCCyAAIAIQnQEiAhAMRQ0AC0EAIQBBfwshAyABIAA2AgAgAwsLACAAIAEgAhCRAgsvAQF/IwBB0ABrIgMkACADIAAgA0EQaiABEJUBNgIAIAAgAiADEBUgA0HQAGokAAssAQF/IAAoAhAiAS0AiAFFBEAgAUEBOgCIASAAQesUQQAQQiABQQA6AIgBCwsNACAAIAEgARBEEKMDC6gBAAJAIAFBgAhOBEAgAEQAAAAAAADgf6IhACABQf8PSARAIAFBgXhqIQEMAgsgAEQAAAAAAADgf6IhACABQf0XIAFB/RdIG0GCcGohAQwBCyABQYF4Sg0AIABEAAAAAAAAEACiIQAgAUGDcEoEQCABQf4HaiEBDAELIABEAAAAAAAAEACiIQAgAUGGaCABQYZoShtB/A9qIQELIAAgAUH/B2qtQjSGv6ILFgAgACABIAIgAyAEIAUgACkDMBCJAgsbACAAIAFB/wFxEA8gACgCBCEBIAAgAhAdIAELJwAgACAAKQPAASACIAEQDiIBQQMQggIaIAAgASADEOIFIAAgARALCyABAX4gACAAIAIgASADQQRBABDKASIFIAEgBBDMASAFC40CAQJ/IwBBMGsiBSQAAn8gASgCACACTQRAIAUgAjYCJCAFIAM2AiAgAEHEmgEgBUEgahBCQX8MAQsCQCABKAIEIARODQAgASAENgIEIARB//8DSA0AIAUgAjYCBCAFIAM2AgAgAEGLmwEgBRBCQX8MAQsgASgCCCACQQF0aiIDLwEAIgZB//8DRwRAQQAgBCAGRg0BGiAFIAI2AhggBSAENgIUIAUgBjYCECAAQambASAFQRBqEEJBfwwBCyADIAQ7AQBBfyAAIAFBDGpBBCABQRRqIAEoAhBBAWoQfA0AGiABIAEoAhAiAEEBajYCECABKAIMIABBAnRqIAI2AgBBAAshAyAFQTBqJAAgAwtrAQF+AkAgAkUgAUKAgICAcINCgICAgJB/UnINACABEA4hAyAAKAIAIAOnEJYEIgJFDQAgAhBdDQAgAEEEEA0gACACEDlBAA8LIAAgARAOEMYDIgJBAEgEQEF/DwsgAEECEA0gACACEDlBAAuIAwACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUG5f2oOBAELCwIACyABQTxHBEAgAUG8AUcEQCABQbYBRg0GIAFBwQBHDQwLAkACQCAFDgUGBgUAAQ0LIABBGBANDAULIABBGxANDAQLIAAoAgAgAxASIAAgBBAeCwJAAkACQAJAIAUOBQAGAQIDDQsgAEGxARANDAULIABBFhANDAQLIABBGRANDAMLIABBHRANDAILAkACQCAFDgUJCQgAAQoLIABBGhANDAgLIABBHxANDAcLIABBFRANCwJAIAFBuX9qDgQDBwcGAAsgAUE8Rg0DIAFBwQBGDQcgAUG8AUYNASABQbYBRw0GCyAFQQJPDQcgAEG7AUG3ASAGGxANDAgLIABBvgEQDQwHCyAAQckAEA0PCyAAQT0QDQ8LIABBFxANCyAAQcsAEA0PCxABAAsgAEHDABANIAAgAxA5DwtBkYwBQaENQbe5AUHUjAEQAAALIAAgAxA5IAAgAkH//wNxEBcL2RIBCn8jAEFAaiIGJAAgBEF/TARAIAAgBkEoakEAEKYBGiAGKAIoQQJxIQQLIAAQNSEJIAAQNSEKIAAoAkAoAoQCIQwCQCADBEAgAEEREA0gAEEGEA0gAEGrARANIABB6gAgCRAcGiAAIAoQHgwBCyAAQesAIAkQHBogACAKEB4gAEEREA0LIAAoAkAoAoQCIQ0CQAJAAkACQCAAKAIQIgdB2wBHBEAgB0H7AEYEQEF/IQcgABAQDQUgAEHvABANIAQEQCAAQQsQDSAAQRsQDQsgAUFJRiABQVFGciELIAFBsX9HIQ4DQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCECIHQaV/RwRAIAdB/QBGDQsgACAGQThqQQBBAUEAEMUDIghBAEgNESAGQbYBNgIwIAZBADYCNCAAKAJAIgcoArwBIQ8gBkF/NgI8IAYgDzYCLCAGQQA2AgggCA0CIAAQEEUNASAGKAI4IQcMBgsgBEUEQCAAKAIAQYT+AEEAEEIMEQtBfyEHIAAQEA0RAkAgAQRAIAYgACACEMQDIgg2AjQgCEUNEyAGQbYBNgIwIAAoAkAoArwBIQcgBkF/NgI8IAYgBzYCLCAGQQA2AggMAQsgABCrAg0SIAAgBkEwaiAGQSxqIAZBNGogBkE8aiAGQQhqQQBB+wAQugENEgsgACgCEEH9AEYNAiAAQZ7+AEEAEBQMDwsCQCAAKAIQQSByQfsARw0AIAAgBkEoakEAEKYBIgdBLEYgB0H9AEZyRUEAIAdBPUcbDQACQCAGKAI4IgdFBEAgBARAIABB8AAQDSAAQRgQDSAAQQcQDSAAQdEAEA0gAEEYEA0LIABByAAQDQwBCyAEBEAgAEEbEA0gAEEHEA0gAEHMABANIAAgBxAbIABBGxANCyAAQcIAEA0gACAHEDkLQX8hByAAIAEgAkEBQX9BARDRAUEASA0RIAAoAhBB/QBGDQogAEEsEC9FDQsMEQsCQCAGKAI4IgdFBEAgAEHxABANQRIhCCAERQ0BIABBGBANIABBBxANIABB0QAQDSAAQRgQDQwBC0ERIQggBEUNACAAQRsQDSAAQQcQDSAAQcwAEA0gACAHEBsgAEEbEA0LIAAgCBANIAEEQCAGIAAgAhDEAyIINgI0IAhFDQUgBw0EDAYLIAAQqwINBAwCCwJAIAIEfyAAIAYoAjgiBxDOBA0FIAAoAkAFIAcLLQBuQQFxRQ0AIAYoAjgiB0HNAEdBACAHQTpHGw0AIABBxP4AQQAQFAwECyAEBEAgAEEbEA0gAEEHEA0gAEHMABANIAAgBigCOBAbIABBGxANCyABQQAgDhtFBEAgAEEREA0gAEG2ARANIAAgBigCOCIHEBsgACAAKAJALwG8ARAXDAILIAYgACgCACAGKAI4EBgiBzYCNCAAQcIAEA0gACAHEDkMBgsgAEELEA0gAEHTABANIAAgBigCCCIHQQJ0QQRqIAdBBXRBQGtyQfwBcRBsDAQLIAAgBkEwaiAGQSxqIAZBNGogBkE8aiAGQQhqQQBB+wAQugENASAGKAIIIQggB0UEQAJAAkACQCAIQX9qDgMAAQIGCyAAQR4QDQwFCyAAQRwQDQwECyAAQSAQDSAAQSAQDQwDCwJAAkACQCAIQX9qDgMCAAEDCyAAQR0QDQwCCyAAQR8QDQwBCyAAQRsQDQsgAEHBABANIAAgBxA5DAILIAAoAgAgBxASDAkLIABBxwAQDQsgAUUNASAGKAI0IQcLIAAgByABEK4CDQYgBiAAKAJAKAK8ATYCLAsCQCAAKAIQQT1HBEAgBigCMCEHDAELIABBERANIABBBhANIABBqwEQDSAAQekAQX8QHCEIIAAQEA0GIABBDhANIAAQXg0GIAYoAjAiB0G2AUdBACAHQTxHG0UEQCAAIAYoAjQQqgELIAAgCBAeCyAAIAcgBigCLCAGKAI0IAYoAjxBASALENABIAAoAhBB/QBGDQBBfyEHIABBLBAvRQ0BDAcLCyAAQQ4QDSAEBEAgAEEOEA0LQX8hByAAEBBFDQIMBQsgAEHH/wBBABAUDAMLIAAQEA0CIAAoAkAgBkEIakEAQX9Bf0ECEKgBIAZBATYCJCAAQf0AEA0gAUFJRiABQVFGciEIA0ACQCAAKAIQIgRB3QBGDQACQCAEQaV/RyIHDQAgABAQDQUgACgCECIEQd0AR0EAIARBLEcbDQAgAEHh/gBBABAUDAULAkACQCAEQfsARiAEQdsARnJFBEAgBEEsRw0BIABBgAEQDSAAQQAQbCAAQQ4QDSAAQQ4QDQwCCyAAIAZBKGpBABCmASIEQSxGIARB3QBGckVBACAEQT1HGw0AAkAgB0UEQCAEQT1GBEAgAEH8/gBBABAUDAkLIABBABDNBAwBCyAAQYABEA0gAEEAEGwgAEEOEA0LIAAgASACQQEgBigCKEECcUEBENEBQQBIDQYMAQsgBkEANgI4IAZBADYCNAJAIAEEQCAGIAAgAhDEAyIENgI0IARFDQYgACAEIAEQrgINBiAGQbYBNgIwIAYgACgCQCgCvAE2AiwMAQsgABCrAg0GIAAgBkEwaiAGQSxqIAZBNGogBkE8aiAGQThqQQBB2wAQugENBgsCQCAHRQRAIAAgBigCOBDNBAwBCyAAQYABEA0gACAGLQA4EGwgAEEOEA0gACgCEEE9Rw0AIABBERANIABBBhANIABBqwEQDSAAQekAQX8QHCEEIAAQEA0FIABBDhANIAAQXg0FIAYoAjAiC0G2AUdBACALQTxHG0UEQCAAIAYoAjQQqgELIAAgBBAeCyAAIAYoAjAgBigCLCAGKAI0IAYoAjxBASAIENABCyAAKAIQQd0ARg0AIAdFBEAgAEGl/wBBABAUDAULIABBLBAvRQ0BDAQLCyAAQYMBEA0gACgCQBCnASAAEBANAgsCQCAFRQ0AIAAoAhBBPUcNAEF/IQcgAEHrAEF/EBwhASAAEBANAyAAIAkQHiADBEAgAEEOEA0LIAAQXg0DIABB6wAgChAcGiAAIAEQHkEBIQcMAwsgA0UEQCAAQeH/AEEAEBQMAgsgACgCQCgCgAIgDGpBsQEgDSAMaxBMGiAAKAJAKAKkAiAJQRRsaiIAIAAoAgBBf2o2AgBBACEHDAILIAAoAgAgBigCNBASC0F/IQcLIAZBQGskACAHCysAIAAoAkAoAqQBQQBOBEAgAEEGEA0gAEHZABANIAAgACgCQC8BpAEQFwsLEgAgAEGDf0YgAEHVAGpBLklyCxMAIAAgASACIAMgBEEAQQAQiAILnAEBAn8gACgCBCIEQf////8HcSEDAkACQCAEQX9MBEAgAiADIAMgAkgbIQMDQCACIANGDQIgACACQQF0ai8BECABRg0DIAJBAWohAgwACwALIAFB/wFLDQAgAiADIAMgAkgbIQMgAEEQaiEAIAFB/wFxIQEDQCACIANGDQEgACACai0AACABRg0CIAJBAWohAgwACwALQX8hAgsgAguOAQEBfyMAQRBrIgMkACADIAI3AwgCQCAAIAFBhgEgAUEAEBMiAhAMDQAgACACEDsEQCAAIAIgAUEBIANBCGoQNiICEAwNASACECENASACECcNASAAIAIQCyAAQY/TAEEAEBVCgICAgOAAIQIMAQsgACACEAsgACABQQEgA0EIahDyBCECCyADQRBqJAAgAguaAQEEfyABKAIAIQICQCAAKAIEIgVBf0wEQCAAIAJBAXRqLwEQIgNBgPgDcUGAsANHIAJBAWoiBCAFQf////8HcU5yDQEgACAEQQF0ai8BECIAQYD4A3FBgLgDRw0BIANBCnRBgPg/cSAAQf8HcXJBgIAEaiEDIAJBAmohBAwBCyACQQFqIQQgACACai0AECEDCyABIAQ2AgAgAwsoACAAIAJBMCACQQAQEyICEAwEQCABQQA2AgBBfw8LIAAgASACENkDCzMBAX8CQCABQoCAgIBwVA0AIAGnIgMvAQZBEkcNACADQSBqDwsgAgRAIABBEhCTAwtBAAtdAQF/QX8hBAJAIAAgARAqIgEQDA0AIAAgAacgAhCFBCEEIAAgARALIAQNACADQYCAAXFFBEBBACEEIANBgIACcUUNASAAEPgBRQ0BCyAAQfAYQQAQFUF/IQQLIAQL2AICA38CfCABEFQhBiACEFQhBAJAAkACfAJAAkACQAJAAkACQAJAAkAgBkEIag4QAgEKCgoKCgMEAAkJCgoKBQoLIARBAUcNCSABpyACp0YPCyAEQXlHDQggAacgAqcQkwJFIQUMCAsgAacgAqdGIARBeEZxIQUMBwsgBEF/Rw0GIAGnIAKnRiEFDAYLIAGntyEHIARBB0YNASAEDQUgAqe3DAMLIAEQSiEHIARFDQEgBEEHRw0ECyACEEoMAQsgAqe3CyEIAkAgAwRAIAe9Qv///////////wCDIgFCgICAgICAgPj/AFhBACAIvUL///////////8AgyICQoGAgICAgID4/wBUG0UEQCABQoGAgICAgID4/wBUIAJCgICAgICAgPj/AFZzDwsgA0ECRw0BCyAHIAhhDwsgB70gCL1RDwsgBCAGRiEFCyAAIAEQCyAAIAIQCyAFCzUBAX8CQCABQYCAAXFFBEAgAUGAgAJxRQ0BIAAQ+AFFDQELIAAgAkHCwAAQxgFBfyEDCyADC5oFAQZ/IwBBEGsiByQAAkAgAUKAgICAcFQgAkL/////D1ZyRQRAIAKnIQYCQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAIAGnIgUvAQYiCkF4ag4WAQ0NDQ0NDQ0NDQ0NDQIDAwQEBQUGBwALIApBAkcNDCAFKAIoIgggBk0EQCAGIAhHDQ0gBS0ABUEJcUEJRw0NIAUoAhAhBgNAIAYoAiwiCgRAIAooAhAhBgJAAkAgCi8BBkF/ag4CAQARCyAKLQAFQQhxDQIMEAsgBi0AEUUNAQwPCwtBASEJIAAgBSADIAQQiAQhCAwNCyAAIAUoAiQgBkEDdGogAxAfDAkLIAUoAiggBk0EQAwMCyAAIAUoAiQgBkEDdGogAxAfDAgLIAAgB0EEaiADELkFDQkgBSgCKCAGTQ0FIAUoAiQgBmogBygCBDoAAAwHCyAAIAdBBGogAxDEAQ0IIAUoAiggBk0NBCAFKAIkIAZqIAcoAgQ6AAAMBgsgACAHQQRqIAMQxAENByAFKAIoIAZNDQMgBSgCJCAGQQF0aiAHKAIEOwEAQQEMBgsgACAHQQRqIAMQxAENBiAFKAIoIAZNDQIgBSgCJCAGQQJ0aiAHKAIENgIADAQLIAAgB0EIaiADEFoNBSAFKAIoIAZNDQEgBSgCJCAGQQJ0aiAHKwMItjgCAAwDCyAAIAdBCGogAxBaDQQgBSgCKCAGSw0BC0EBIQkgACAEQfkWEHYhCAwECyAFKAIkIAZBA3RqIAcrAwg5AwALQQELIQlBASEIDAELQX8hCEEBIQkLIAkNAQsgACACEDohBSAAIAIQCyAFRQRAIAAgAxALQX8hCAwBCyAAIAEgBSADIAQQlQIhCCAAIAUQEgsgB0EQaiQAIAgLOgEBfyMAQdAAayICJAAgAiABBH8gACACQRBqIAEQlQEFQcE8CzYCACAAQas8IAIQygIgAkHQAGokAAuucAMefwR+AXwjAEHgAGsiByENIAckACAAKAIQIRVCgICAgOAAISUCQCAAEH4NAAJ/AkACQAJAAkACQAJAIAFC/////29YBEAgBkEEcUUNASABpyIIIgkoAjwhByAIKAIYIhcoAiQhECAXKAIgIg4oAjAhBiAOLwEqIRQgCUEANgI8IAggFSgCjAE2AhAgCCgCICETIAgoAjAhCyAIKAIkIREgFSAIQRBqIhI2AowBIBEgFEEDdGohGCATIRQgCyEJIAgoAgxFDQYMBAsgAaciFy8BBiIIQQ1GDQIgFSgCRCAIQRhsaigCECIHDQELIABBj8QAQQAQFQwGCyAAIAEgAiAEIAUgBiAHERcAISUMBQsgFygCICIOLwEuIRMgDi8BKiEUIA4vASghCyANIA4tABA2AlggDSABNwM4IA0gBDYCVCANQcgAahBvQQAhCCAXKAIkIRAgByALQQAgBkEBdkEBcSALIARKchsiBiATIBRqakEDdEEPakHw//8BcWsiFCQAIAUhEyAGRQ0BIAQgDi8BKBCxASIHQQAgB0EAShshBwNAIAcgCEYEQCAHIA4vASgiCCAHIAhLGyELA0AgByALRwRAIBQgB0EDdGpCgICAgDA3AwAgB0EBaiEHDAELCyANIAg2AlQgFCETDAMFIBQgCEEDdCILaiAFIAtqKQMAEA43AwAgCEEBaiEIDAELAAsAC0EBDAILIA0gEzYCQCANIBQgBkEDdGoiETYCRCAOLwEqIQhBACEHA0AgByAIRwRAIBEgB0EDdGpCgICAgDA3AwAgB0EBaiEHDAELCyAOKAIUIQsgDSAVKAKMATYCMCAVIA1BMGo2AowBIA4oAjAhBiANQTBqIRIgESAIQQN0aiIHIRgLQQALIQgDQAJAAkACQAJAIAhFBEAgEUEIaiEZIBFBEGohGiARQRhqIRsgE0EIaiEcIBNBEGohHSATQRhqIR4gGEEYaiEgIAJCIIinIiFBfnEhIiANQTBqISMgDUEgaiEfIAchCAJAA0ACQCALQQFqIQlCASElQoCAgIAwIQECfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgCy0AACIMQX9qDvMB1AEAJAiRAQkKCwwNDg8QERITFBcVFhgZGhsgISIjHB8dHigmJikpKivYAeMBLC0uL9YBMDEyMzQ1Njc4ODk5Op4BoQE8Oz2OAY8BkAGSAZMBlAGcAZ0BoAGfAaIBlQGWAZcBmAGZAaMBpAGlAZoBmgGbAZsBPj9AQUJDa2xtcXJzdG5vcHV8e3h/gAGBAcgByQHKAcsBywHLAcsBywHLAXZ2dneCAYQBhgGDAYUBiAGHAYkBigGLAYwB1gHiAdUB1QHXAa4BrQGwAa8BsQGxAbMBsgGnAbQBjQHFAcYBxwGpAaoBqwGmAagBrAG1AbcBtgG7AbwBvQG+AcQBwwG/AcABwQHCAbgBugG5AdEB3AEBAQEBAQEBAQECAwQFBkRFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpagd+fXp5JSUlJcwBzQHOAc8B0wELIAcgDigCNCAJKAAAQQN0aikDABAONwMAIAtBBWohCSAHQQhqIQgM2wELIAcgDEHNfmqtNwMAIAdBCGohCAzaAQsgByAJLAAArTcDACALQQJqIQkgB0EIaiEIDNkBCyAHIAkuAACtNwMAIAtBA2ohCSAHQQhqIQgM2AELIAcgDigCNCALLQABQQN0aikDABAONwMAIAdBCGohCCALQQJqIQkM1wELIAcgBiAOKAI0IAstAAFBA3RqKQMAEA4gECASEP8DIgE3AwAgB0EIaiEIIAtBAmohCSABEAxFDdYBDNgBCyAHIAZBLxAyNwMAIAdBCGohCAzVAQsgBiAHQXhqIggpAwAiAUEwIAFBABATIgEQDA3YASAGIAgpAwAQCyAIIAE3AwAM0wELIAcgBiAJKAAAEGY3AwAgC0EFaiEJIAdBCGohCAzTAQsgB0KAgICAMDcDACAHQQhqIQgM0gELIAdCgICAgCA3AwAgB0EIaiEIDNEBCwJAAkACfiACIA4tABBBAXENABogAiAhQX9GDQAaICJBAkcNASAGKQPAAQsQDiElDAELIAYgAhAqIiUQDA3VAQsgByAlNwMAIAdBCGohCAzQAQsgB0KAgICAEDcDACAHQQhqIQgMzwELIAdCgYCAgBA3AwAgB0EIaiEIDM4BCyAHIAYQPSIBNwMAIAdBCGohCCABEAxFDc0BDM8BCyALQQJqIQkCQAJAAkACQAJAAkACQAJAIAstAAEOBwABAgMEBQYHCyAHIAYgBCAFENMIIgE3AwAgB0EIaiEIIAEQDEUN0wEM1QELIAcgBiAEIAUgEiAEIA4vASgQsQEQ0ggiATcDACAHQQhqIQggARAMRQ3SAQzUAQsgByASKQMIEA43AwAgB0EIaiEIDNEBCyAHIAMQDjcDACAHQQhqIQgM0AELIAcCfkKAgICAMCAXKAIoIghFDQAaIAitQoCAgIBwhBAOCzcDACAHQQhqIQgMzwELIAcgBkKAgICAIBBSIgE3AwAgB0EIaiEIIAEQDEUNzgEM0AELIAcgBhDRCCIBNwMAIAdBCGohCCABEAxFDc0BDM8BCxABAAsgByAGIAkvAAAgBCAFENAIIgE3AwAgB0EIaiEIIAtBA2ohCSABEAxFDcsBDM0BCyAGIAdBeGoiCCkDABALDMoBCyAGIAdBcGoiCCkDABALIAggB0F4aiIIKQMANwMADMkBCyAGIAdBaGoiCCkDABALIAggB0FwaiIIKQMANwMAIAggB0F4aiIIKQMANwMADMgBCyAHIAdBeGopAwAQDjcDACAHQQhqIQgMxwELIAcgB0FwaikDABAONwMAIAcgB0F4aikDABAONwMIIAdBEGohCAzGAQsgByAHQWhqKQMAEA43AwAgByAHQXBqKQMAEA43AwggByAHQXhqKQMAEA43AxAgB0EYaiEIDMUBCyAHIAdBeGoiCCkDADcDACAIIAdBcGopAwAQDjcDACAHQQhqIQgMxAELIAcgB0F4aiIIKQMAIgE3AwAgCCAHQXBqIggpAwA3AwAgCCABEA43AwAgB0EIaiEIDMMBCyAHIAdBeGoiCCkDACIBNwMAIAdBcGoiCykDACElIAsgB0FoaiILKQMANwMAIAggJTcDACALIAEQDjcDACAHQQhqIQgMwgELIAcgB0F4aiIIKQMAIgE3AwAgB0FwaiILKQMAISUgCyAHQWhqIgspAwA3AwAgCCAlNwMAIAsgB0FgaiIIKQMANwMAIAggARAONwMAIAdBCGohCAzBAQsgB0FwaiIIKQMAIQEgCCAHQWhqIggpAwA3AwAgCCABNwMADL8BCyAHQWhqIggpAwAhASAIIAdBcGoiCCkDADcDACAHQXhqIgspAwAhJSALIAE3AwAgCCAlNwMADL4BCyAHQWBqIggpAwAhASAIIAdBaGoiCCkDADcDACAHQXBqIgspAwAhJSALIAdBeGoiCykDADcDACAIICU3AwAgCyABNwMADL0BCyAHQVhqIggpAwAhASAIIAdBYGoiCCkDADcDACAHQWhqIgspAwAhJSALIAdBcGoiCykDADcDACAIICU3AwAgCyAHQXhqIggpAwA3AwAgCCABNwMADLwBCyAHQXhqIggpAwAhASAIIAdBcGoiCCkDADcDACAHQWhqIgspAwAhJSALIAE3AwAgCCAlNwMADLsBCyAHQXBqIggpAwAhASAIIAdBaGoiCCkDADcDACAHQWBqIgspAwAhJSALIAE3AwAgCCAlNwMADLoBCyAHQXBqIggpAwAhASAIIAdBaGoiCCkDADcDACAHQWBqIgspAwAhJSALIAdBWGoiCykDADcDACAIICU3AwAgCyABNwMADLkBCyAHQXhqIggpAwAhASAIIAdBcGoiCCkDADcDACAIIAE3AwAMuAELIAdBYGoiCCkDACEBIAggB0FwaiIIKQMANwMAIAdBeGoiCykDACElIAsgB0FoaiILKQMANwMAIAggATcDACALICU3AwAMtwELIAcgBiAOKAI0IAkoAABBA3RqKQMAEA4gECASEP8DIgE3AwAgB0EIaiEIIAtBBWohCSABEAxFDbcBDLkBCyAMQZR+aiEKDAELIAkvAAAhCiALQQNqIQkLIBIgCTYCICAGIAcgCkEDdGsiCEF4aikDAEKAgICAMEKAgICAMCAKIAhBABDfASIBEAwNuAEgDEEjRg27AUF/IQsgCkF/IApBf0obIQwDQCALIAxHBEAgBiAIIAtBA3RqKQMAEAsgC0EBaiELDAELCyAHIApBf3NBA3RqIgcgATcDACAHQQhqIQgMtAELIAkvAAAhCCASIAtBA2oiCTYCICAGIAcgCEEDdGsiCkFwaikDACAKQXhqKQMAIAggCkEAEP4DIgEQDA23AUF+IQsgCEF+IAhBfkobIQwDQCALIAxHBEAgBiAKIAtBA3RqKQMAEAsgC0EBaiELDAELCyAHQX4gCGtBA3RqIgcgATcDACAHQQhqIQgMswELIAkvAAAhCCASIAtBA2oiCTYCICAGIAcgCEEDdGsiCkF4aikDACAKQXBqKQMAQoCAgIAwIAggCkEAEN8BIgEQDA22ASAMQSVGDbkBQX4hCyAIQX4gCEF+ShshDANAIAsgDEcEQCAGIAogC0EDdGopAwAQCyALQQFqIQsMAQsLIAdBfiAIa0EDdGoiByABNwMAIAdBCGohCAyyAQsgC0EDaiEKIAkvAAAhCAJAIAYQTyIBEAxFBEBBACEJIAhBACAIQQBLGyEMIAcgCEEDdGshCANAIAkgDEYNAiAGIAEgCRCRASAIIAlBA3RqIg8pAwBBh4ABEBohFiAPQoCAgIAwNwMAIAlBAWohCSAWQX9KDQALIAYgARALCyAKIQkMtgELIAggATcDACAIQQhqIQggCiEJDLEBCyALQQNqIQogBiAHQWhqIgwpAwBBAiAHQXBqIgggCS8AABCRAyIBEAwEQCAKIQkMtQELIAYgDCkDABALIAYgCCkDABALIAYgB0F4aikDABALIAwgATcDACAKIQkMsAELQoCAgIAQISUCQCAHQXhqKQMAIgEQIQ0AQoGAgIAQISUgARARDQAgAEGexABBABAVDLQBCyAHICU3AwAgB0EIaiEIDK8BCyADEBFFDa0BIAZB28QAQQAQFQyyAQsgByEIIAYgB0FwaikDACAHQXhqKQMAEM8IQQBODa0BDLEBCyAGIAdBcGoiCCkDACAHQXhqIgopAwAQzghBAEgNsAEgBiAIKQMAEAsgBiAKKQMAEAsMrAELIAYgB0F4aiIHKQMAEJABDK8BCyAJKAAAIQggC0EGaiEJAkACQAJAAkACQAJAIAstAAUiCg4FAAECAwQFCyAGQYCAASAIENwBGgyzAQsgBiAIEK4FDLIBCyAGIAgQ3gEMsQELIAZBicUAQQAQygIMsAELIAZBqsUAQQAQFQyvAQsgDSAKNgIQIAZB0MUAIA1BEGoQQgyuAQsgCS8AACEIIAsvAAMhDCASIAtBBWoiCTYCIAJ+IAYgByAIQQN0ayIKQXhqIg8pAwAgBikDuAEQWQRAIAZCgICAgDAgCEEBTwR+IAopAwAFQoCAgIAwC0ECIAxBf2oQkAMMAQsgBiAPKQMAQoCAgIAwQoCAgIAwIAggCkEAEN8BCyIBEAwNrQFBfyELIAhBfyAIQX9KGyEMA0AgCyAMRwRAIAYgCiALQQN0aikDABALIAtBAWohCwwBCwsgByAIQX9zQQN0aiIHIAE3AwAgB0EIaiEIDKkBCyALQQNqIQogCS8AACEWAkAgBiANQRhqIAdBeGoiCCkDABD9AyIJBEACfiAGIAdBcGoiDCkDACAGKQO4ARBZBEAgBkKAgICAMCANKAIYIg8EfiAJKQMABUKAgICAMAtBAiAWQX9qEJADDAELIAYgDCkDAEKAgICAMCANKAIYIg8gCRAjCyEBIAYgCSAPEI8DIAEQDEUNAQsgCiEJDK0BCyAGIAwpAwAQCyAGIAgpAwAQCyAMIAE3AwAgCiEJDKgBCyAHQXBqIgggBkKAgICAMCAIKQMAIAdBeGoiCCkDABCtBTcDAAynAQsgBiAHQXhqIggpAwAQ+QEiARAMDaoBIAYgCCkDABALIAggATcDAAylAQsgBiAHQXhqIggpAwAQzQgiARAMDakBIAYgCCkDABALIAggATcDAAykAQsgC0EFaiEKIAYgCSgAABDMCCIIQQBIBEAgCiEJDKkBCyAHIAhBAEetQoCAgIAQhDcDACAHQQhqIQggCiEJDKQBCyALQQVqIQogBiAJKAAAIAxBSWoQywgiARAMBEAgCiEJDKgBCyAHIAE3AwAgB0EIaiEIIAohCQyjAQsgCSgAACEIIAtBBWohCSAGIAggB0F4aiIIKQMAIAxBR2oQrAVBf0oNogEMpAELIAtBBWohCiAJKAAAIQwgB0FwaiIIKAIARQRAIAYgDBDIAiAKIQkMpgELIAohCSAGIAwgB0F4aikDAEECEKwFQX9KDaEBIAghBwylAQsgCSgAACEMIAchCCALQQZqIgohCSAGIAwgCy0ABRDJCEUNoAEgCiEJDKQBCyAJKAAAIQwgByEIIAtBBmoiCiEJIAYgDCALLQAFEMgIRQ2fASAKIQkMowELIAtBBmohCiAGIAkoAAAgB0F4aiIIKQMAIAstAAUQxwgEQCAKIQkMowELIAYgCCkDABALIAohCQyeAQsgByARIAkvAABBA3RqKQMAEA43AwAgC0EDaiEJIAdBCGohCAydAQsgBiARIAkvAABBA3RqIAdBeGoiCCkDABAfIAtBA2ohCQycAQsgBiARIAkvAABBA3RqIAdBeGopAwAQDhAfIAtBA2ohCQyaAQsgByATIAkvAABBA3RqKQMAEA43AwAgC0EDaiEJIAdBCGohCAyaAQsgBiATIAkvAABBA3RqIAdBeGoiCCkDABAfIAtBA2ohCQyZAQsgBiATIAkvAABBA3RqIAdBeGopAwAQDhAfIAtBA2ohCQyXAQsgByARIAstAAFBA3RqKQMAEA43AwAgC0ECaiEJIAdBCGohCAyXAQsgBiARIAstAAFBA3RqIAdBeGoiCCkDABAfIAtBAmohCQyWAQsgBiARIAstAAFBA3RqIAdBeGopAwAQDhAfIAtBAmohCQyUAQsgByARKQMAEA43AwAgB0EIaiEIDJQBCyAHIBkpAwAQDjcDACAHQQhqIQgMkwELIAcgGikDABAONwMAIAdBCGohCAySAQsgByAbKQMAEA43AwAgB0EIaiEIDJEBCyAGIBEgB0F4aiIIKQMAEB8MkAELIAYgGSAHQXhqIggpAwAQHwyPAQsgBiAaIAdBeGoiCCkDABAfDI4BCyAGIBsgB0F4aiIIKQMAEB8MjQELIAYgESAHQXhqKQMAEA4QHyAHIQgMjAELIAYgGSAHQXhqKQMAEA4QHyAHIQgMiwELIAYgGiAHQXhqKQMAEA4QHyAHIQgMigELIAYgGyAHQXhqKQMAEA4QHyAHIQgMiQELIAcgEykDABAONwMAIAdBCGohCAyIAQsgByAcKQMAEA43AwAgB0EIaiEIDIcBCyAHIB0pAwAQDjcDACAHQQhqIQgMhgELIAcgHikDABAONwMAIAdBCGohCAyFAQsgBiATIAdBeGoiCCkDABAfDIQBCyAGIBwgB0F4aiIIKQMAEB8MgwELIAYgHSAHQXhqIggpAwAQHwyCAQsgBiAeIAdBeGoiCCkDABAfDIEBCyAGIBMgB0F4aikDABAOEB8gByEIDIABCyAGIBwgB0F4aikDABAOEB8gByEIDH8LIAYgHSAHQXhqKQMAEA4QHyAHIQgMfgsgBiAeIAdBeGopAwAQDhAfIAchCAx9CyAHIBAoAgAoAhApAwAQDjcDACAHQQhqIQgMfAsgByAQKAIEKAIQKQMAEA43AwAgB0EIaiEIDHsLIAcgECgCCCgCECkDABAONwMAIAdBCGohCAx6CyAHIBAoAgwoAhApAwAQDjcDACAHQQhqIQgMeQsgBiAQKAIAKAIQIAdBeGoiCCkDABAfDHgLIAYgECgCBCgCECAHQXhqIggpAwAQHwx3CyAGIBAoAggoAhAgB0F4aiIIKQMAEB8MdgsgBiAQKAIMKAIQIAdBeGoiCCkDABAfDHULIAYgECgCACgCECAHQXhqKQMAEA4QHyAHIQgMdAsgBiAQKAIEKAIQIAdBeGopAwAQDhAfIAchCAxzCyAGIBAoAggoAhAgB0F4aikDABAOEB8gByEIDHILIAYgECgCDCgCECAHQXhqKQMAEA4QHyAHIQgMcQsgByAQIAkvAABBAnRqKAIAKAIQKQMAEA43AwAgC0EDaiEJIAdBCGohCAxwCyAGIBAgCS8AAEECdGooAgAoAhAgB0F4aiIIKQMAEB8gC0EDaiEJDG8LIAYgECAJLwAAQQJ0aigCACgCECAHQXhqKQMAEA4QHyALQQNqIQkgByEIDG4LIAtBA2ohCiAQIAkvAAAiCEECdGooAgAoAhApAwAiARCEAUUEQCAHIAEQDjcDACAHQQhqIQggCiEJDG4LIAYgDiAIQQEQwgIgCiEJDHELIAtBA2ohCiAQIAkvAAAiCEECdGooAgAoAhAiCSkDABCEAUUEQCAGIAkgB0F4aiIIKQMAEB8gCiEJDG0LIAYgDiAIQQEQwgIgCiEJDHALIAtBA2ohCiAQIAkvAAAiCEECdGooAgAoAhAiCSkDABCEAUUEQCAGIA4gCEEBEMICIAohCQxwCyAGIAkgB0F4aiIIKQMAEB8gCiEJDGsLIAYgESAJLwAAQQN0akKAgICAwAAQHyALQQNqIQkgByEIDGoLIAtBA2ohCiARIAkvAAAiCEEDdGopAwAiARCEAUUEQCAHIAEQDjcDACAHQQhqIQggCiEJDGoLIAYgDiAIQQAQwgIgCiEJDG0LIAtBA2ohCiARIAkvAAAiCEEDdGoiCSkDABCEAUUEQCAGIAkgB0F4aiIIKQMAEB8gCiEJDGkLIAYgDiAIQQAQwgIgCiEJDGwLIAtBA2ohCiARIAkvAABBA3RqIggpAwAQhAFFBEAgBkHqxQBBABDKAiAKIQkMbAsgBiAIIAdBeGoiCCkDABAfIAohCQxnCyAGIBIgCS8AABDGCCALQQNqIQkgByEIDGYLIAkoAAAhDyALLwAFIQogByAGQoCAgIAgEFIiATcDACAHQQhqIQggC0EHaiEJAkACQCABEAwNAAJAIAxB+gBGBEAgECAKQQJ0aigCACIKIAooAgBBAWo2AgAMAQsgBiASIAogDEH5AEYQ/AMiCkUNAQsgBiAHKAIAIA9BIhB/IgwNASAVIAoQ9wELIAghBwxqCyAMIAo2AgAgByAGIA8QZjcDCCAHQRBqIQgMZQsgC0EFaiEKIAYgCSgAACAHEMUIBEAgCiEJDGkLIAdBEGohCCAKIQkMZAsgCSAJKAAAaiEJIAchCCAGEH5FDWMMZwsgCSAJLgAAaiEJIAchCCAGEH5FDWIMZgsgCSAJLAAAaiEJIAchCCAGEH5FDWEMZQsCfyALQQVqIgoCfyAHQXhqIggpAwAiAUIgiKdBA00EQCABpwwBCyAGIAEQLQtFDQAaIAogCSgAAGpBfGoLIQkgBhB+RQ1gDGILAn8gC0EFaiIKAn8gB0F4aiIIKQMAIgFCIIinQQNNBEAgAacMAQsgBiABEC0LDQAaIAogCSgAAGpBfGoLIQkgBhB+RQ1fDGELAn8gC0ECaiIKAn8gB0F4aiIIKQMAIgFCIIinQQNNBEAgAacMAQsgBiABEC0LRQ0AGiAJLAAAIApqQX9qCyEJIAYQfkUNXgxgCwJ/IAtBAmoiCgJ/IAdBeGoiCCkDACIBQiCIp0EDTQRAIAGnDAELIAYgARAtCw0AGiAJLAAAIApqQX9qCyEJIAYQfkUNXQxfCyAHIAkgCSgAAGogDigCFGutQoCAgIDQAIQ3AwAgC0EFaiEJIAdBCGohCAxcCyAJKAAAIQggByALIA4oAhRrQQVqrTcDACAIIAlqIQkgB0EIaiEIDFsLAkAgB0F4aiIIKQMAIgFC/////w9WDQAgDigCGCABpyIKTQ0AIA4oAhQgCmohCQxbCyAGQY7GAEEAEEIMXgsgByEIIAYgBxDECEUNWQxdCyAGIAcQwwgNXCAHQRBqIQgMWAsgBiAHQQAQjgMNWyAHQoCAgIDQADcDCCAHQRBqIQgMVwsgC0ECaiEJIAYgB0F9IAstAAFrEMEIDVogB0EQaiEIDFYLIAYgB0EBEI4DDVkgB0KAgICA0AA3AwggB0EQaiEIDFULIAYgBxDACA1YIAdBCGohCAxUCyAHQXhqKQMAECENUiAGQaDGAEEAEBUMVwsgBiAHQXBqIgopAwAQCyAHQWhqIggpAwAiARARDVIgBiABQQAQsAEEQCAKIQcMVwsgBiAIKQMAEAsMUgsgB0F4aiIHKQMAIQEDQAJAIAcgGE0NACAHQXhqIggpAwAiJUKAgICAcINCgICAgNAAUQ0AIAYgJRALIAghBwwBCwsgByAgSQRAIAZBv8YAQQAQQiAGIAEQCwxWCyAHIAdBeGoiCCkDADcDACAHQXBqIgspAwAhJSALIAdBaGoiCykDADcDACAIICU3AwAgCyABNwMAIAdBCGohCAxRCyAGIAdBaGopAwAgB0FgaikDAEEBIAdBeGoiCBAjIgEQDA1UIAYgCCkDABALIAggATcDACAHIQgMUAsgC0ECaiEJIAYgB0FgaiIIKQMAIgFBF0EGIAstAAEiCkEBcRsgAUEAEBMiJRAMDVNCgYCAgBAhAQJAICUQEQ0AICUQJw0AIAgpAwAhAQJ+IApBAnEEQCAGICUgAUEAQQAQNgwBCyAGICUgAUEBIAdBeGoQNgsiARAMDVQgBiAHQXhqIggpAwAQCyAIIAE3AwBCgICAgBAhAQsgByABNwMAIAdBCGohCAxPCwJ/IAdBeGoiCCkDACIBQiCIp0EDTQRAIAGnQQBHDAELIAYgARAtCyELIAggC0WtQoCAgIAQhDcDACAHIQgMTgsgC0EFaiEKIAYgB0F4aiIIKQMAIgEgCSgAACABQQAQEyIBEAwEQCAKIQkMUgsgBiAIKQMAEAsgCCABNwMAIAchCCAKIQkMTQsgC0EFaiEKIAYgB0F4aikDACIBIAkoAAAgAUEAEBMiARAMBEAgCiEJDFELIAcgATcDACAHQQhqIQggCiEJDEwLIAYgB0FwaiIIKQMAIAkoAAAgB0F4aikDAEGAgAIQlQIhByAGIAgpAwAQCyALQQVqIQkgB0F/Sg1LDE0LIAtBBWohCiAGIAkoAAAQqwUiARAMBEAgCiEJDE8LIAcgATcDACAHQQhqIQggCiEJDEoLIAYgB0FwaiIKKQMAIAdBeGoiCCkDABC/CCEBIAYgCCkDABALIAYgCikDABALIAogATcDACABEAxFDUkMSwsgBiAHQWhqIggpAwAgB0F4aiIKKQMAIAdBcGopAwAQvgghByAGIAgpAwAQCyAGIAopAwAQCyAHQX9KDUgMSgsgBiAHQWhqKQMAIAdBcGoiCCkDACAHQXhqKQMAEL0IIQcgBiAIKQMAEAsgB0F/Sg1HDEkLIAkoAAAhCCALQQVqIQkgBiAHQXBqKQMAIAggB0F4aiIIKQMAQYeAARAaQX9KDUYMSAsgCSgAACEMIAchCCALQQVqIgohCSAGIAdBeGopAwAgDBCqBUF/Sg1FIAohCQxJCyAHIQggBiAHQXhqKQMAIAdBcGopAwAQqQVBf0oNRAxICwJAIAdBeGoiCCkDACIBECFFBEAgARAnRQ0BCyAGIAdBcGopAwAgAUEBEJgCQQBIDUgLIAYgARALDEMLIAYgB0F4aikDACAHQXBqKQMAEPsDIAchCAxCCwJ/IAxB1QBGBEBBfSAGIAdBcGopAwAQOiIIDQEaDEcLIAkoAAAhCCALQQVqIQlBfgshCiAJLQAAIg9BBHEhFiAHIApBA3RqKQMAIScCfgJ+AkACQAJAIA9BA3EOAgABAgtBg84BIQogB0F4aikDACIBISZCgICAgDAMAgtCgICAgDAhJkGBmgEhCkKAgICAMCElIAdBeGopAwAiAQwCC0KAgICAMCEmQYGqASEKIAdBeGopAwAiAQshJUKAgICAMAshKCAGIAEgCCAKIBZyIg8gJxC8CCIKQQBOBEAgBiAnIAggJiAoICUgDxB1IQoLIAYgB0F4aikDABALIAlBAWohCSAHIAxB1QBGBH8gBiAIEBIgBiAHQXBqKQMAEAtBfgVBfwtBA3RqIQggCkF/Sg1BDEMLIAkoAAAhDyAHIQggC0EGaiIKIQkgBiAHIA8gCy0ABSAQIBIgDEHXAEYQuwhBAE4NQCAKIQkMRAsgBiAHQXBqIgopAwAgB0F4aiIIKQMAEJ4BIQEgBiAKKQMAEAsgCiABNwMAIAEQDEUNPwxBCyAHQXhqIgggBiAHQXBqKQMAIAgpAwAQngEiATcDACAHIQggARAMRQ0+DEILIAdBeGopAwAhASAHQXBqKQMAIiUQEQRAIAYgARA6IghFDUIgBiAIEMgCIAYgCBASDEILIAYgJSABEA4QngEiARAMDUEgByABNwMAIAdBCGohCAw9CyAGIAdBeGoiDykDABA6IgpFDUAgBiAHQXBqIggpAwAgCiAHQWhqIgwpAwBBABATIQEgBiAKEBIgARAMDUAgBiAPKQMAEAsgBiAIKQMAEAsgBiAMKQMAEAsgDCABNwMADDwLIAYgB0FoaiIIKQMAIAdBcGopAwAgB0F4aikDAEGAgAIQ3QEhByAGIAgpAwAQCyAHQX9KDTsMPQsgB0FoaiIIKQMAIiUQESEMIAYQ+AEhCgJ/IAwEQCAKBEAgBiAHQXBqKQMAEDoiCEUNQSAGIAgQyAIgBiAIEBIMQQsgCCAGKQPAARAOIiU3AwBBgIACDAELQYCABkGAgAIgChsLIQogBiAlIAdBcGopAwAgB0F4aikDACAKEN0BIQcgBiAIKQMAEAsgB0F/Sg06DDwLIAdBaGoiCikDAEL/////b1gEQCAGECkMPgsgBiAHQXBqIg8pAwAQOiIMRQ09IAYgCikDACAMIAdBeGopAwAgB0FgaiIIKQMAQYCAAhD6AyEHIAYgDBASIAYgCCkDABALIAYgCikDABALIAYgDykDABALIAdBAE4NOSAHQR52QQJxDDoLIAYgB0FoaikDACAHQXBqKQMAEA4gB0F4aiIIKQMAQYeAARDFAkF/Sg04DDoLIAYgBxC6CA07IAYgB0F4aiIIKQMAEAsMNwsgC0ECaiEJIAchCCAGIAcgCy0AASIKQX9zQQN0QWByaikDACAHIApBAnZBf3NBA3RBQHJqKQMAIAcgCkEFdkF/c0EDdGopAwBBABCoBUUNNgw6CwJAIAdBeGoiCCkDACIBQiCIIiYgB0FwaiIKKQMAIiVCIIgiJ4RQBEAgAaciDEEASCAMICWnIg9qIgwgD0hzDQEgCiAMrTcDAAw3CyAnp0ELakESSSAmp0ELakESSXINACAKICUQSiABEEqgEBY3AwAMNgsgBiAHEKcFRQ01DDkLIAtBAmohCQJAIBEgCy0AAUEDdGoiCCkDACIBQiCIIiYgB0F4aiIHKQMAIiVCIIiEUARAICWnIgpBAEggCiABpyIMaiIKIAxIcw0BIAggCq03AwAgByEIDDYLICZC+f///w9SDQAgBiAlQQIQwQEiARAMDTkgBiAIKQMAEA4gARDBAiIBEAwNOSAGIAggARAfIAchCAw1CyANIAEQDjcDICANIAcpAwA3AyggBiAjEKcFDTggBiAIIA0pAyAQHyAHIQgMNAsgB0F4aiIIKQMAIgFCIIgiJiAHQXBqIgopAwAiJUIgiCInhFAEQCAlQiCGQiCHIAFCIIZCIId9IgFCgICAgAh8Qv////8PVg0EIAogAUL/////D4M3AwAMNAsgJ6dBC2pBEkkgJqdBC2pBEklyDQMgCiAlEEogARBKoRAWNwMADDMLAnwgB0F4aiIIKQMAIgFCIIgiJiAHQXBqIgopAwAiJUIgiCInhFAEQCABQiCGQiCHICVCIIZCIId+IiZCgICAgAh8QoCAgIAQWgRAICa5DAILRAAAAAAAAACAICZQRSABICWEp0F/SnJFDQEaIAogJkL/////D4M3AwAMNAsgJ6dBC2pBEkkgJqdBC2pBEklyDQMgJRBKIAEQSqILISkgCiApEBY3AwAMMgsgB0F4aiIIKQMAIgEgB0FwaiIKKQMAIiWEQv////8PVg0BIBItAChBBHENASAKAn4gJae3IAGnt6MiKb0CfyApmUQAAAAAAADgQWMEQCApqgwBC0GAgICAeAsiB7e9UQRAIAetDAELICkQFgs3AwAMMQsgB0F4aiIIKQMAIgEgB0FwaiIKKQMAIiWEQv////8PVg0AICWnIg9BH3YgAaciFkEBSHINACAKIA8gFm+tNwMADDALIAYgByAMELkIDTMgB0F4aiEIDC8LIAdBfGooAgAiCEUgCEELakERS3INLSAHIQggBiAHQY0BEJACRQ0uDDILAkACfCAHQXhqIggpAwAiAUIgiKciCkUEQEQAAAAAAAAAgCABpyILRQ0BGkQAAAAAAADgQSALQYCAgIB4Rg0BGiAIQgAgAX1C/////w+DNwMAIAchCAwwCyAKQQtqQRJJDQEgARBKmgshKSAIICkQFjcDACAHIQgMLgsgByEIIAYgB0GMARCQAkUNLQwxCyAHQXhqIggpAwAiAUL/////D1YgAadB/////wdGckUEQCAIIAFCAXxC/////w+DNwMAIAchCAwtCyAHIQggBiAHQY8BEJACRQ0sDDALIAdBeGoiCCkDACIBQv////8PViABp0GAgICAeEZyRQRAIAggAUJ/fEL/////D4M3AwAgByEIDCwLIAchCCAGIAdBjgEQkAJFDSsMLwsgBiAHIAwQuAgNLiAHQQhqIQgMKgsgC0ECaiEJIBEgCy0AAUEDdGoiCCkDACIBQv////8PViABp0H/////B0ZyRQRAIAggAUIBfEL/////D4M3AwAMKQsgDSABEA43AxggBiAfQY8BEJACDS0gBiAIIA0pAxgQHwwoCyALQQJqIQkgESALLQABQQN0aiIIKQMAIgFC/////w9WIAGnQYCAgIB4RnJFBEAgCCABQn98Qv////8PgzcDAAwoCyANIAEQDjcDGCAGIB9BjgEQkAINLCAGIAggDSkDGBAfDCcLIAdBeGoiCCkDACIBQv////8PWARAIAggAUL/////D4U3AwAgByEIDCgLIAchCCAGIAcQtwhFDScMKwsgB0F4aiIIKQMAIgEgB0FwaiIKKQMAIiWEQv////8PWARAIAogJacgAad0rTcDAAwnCyAGIAdBoAEQwAJFDSYMKgsgB0F4aiIIKQMAIgEgB0FwaiIKKQMAIiWEQv////8PWARAIAoCfiAlpyABp3YiB0EATgRAIAetDAELIAe4EBYLNwMADCYLIAYgBxC2CEUNJQwpCyAHQXhqIggpAwAiASAHQXBqIgopAwAiJYRC/////w9YBEAgCiAlpyABp3WtNwMADCULIAYgB0GhARDAAkUNJAwoCyAHQXhqIggpAwAiASAHQXBqIgopAwAiJYRC/////w9YBEAgCiABICWDNwMADCQLIAYgB0GtARDAAkUNIwwnCyAHQXhqIggpAwAgB0FwaiIKKQMAhCIBQv////8PWARAIAogATcDAAwjCyAGIAdBrwEQwAJFDSIMJgsgB0F4aiIIKQMAIgEgB0FwaiIKKQMAIiWEQv////8PWARAIAogASAlhUL/////D4M3AwAMIgsgBiAHQa4BEMACRQ0hDCULIAdBeGoiCCkDACIBIAdBcGoiCikDACIlhEL/////D1gEQCAKICWnIAGnSK1CgICAgBCENwMADCELIAYgB0GjARCNA0UNIAwkCyAHQXhqIggpAwAiASAHQXBqIgopAwAiJYRC/////w9YBEAgCiAlpyABp0ytQoCAgIAQhDcDAAwgCyAGIAdBpAEQjQNFDR8MIwsgB0F4aiIIKQMAIgEgB0FwaiIKKQMAIiWEQv////8PWARAIAogJacgAadKrUKAgICAEIQ3AwAMHwsgBiAHQaUBEI0DRQ0eDCILIAdBeGoiCCkDACIBIAdBcGoiCikDACIlhEL/////D1gEQCAKICWnIAGnTq1CgICAgBCENwMADB4LIAYgB0GmARCNA0UNHQwhCyAHQXhqIggpAwAiASAHQXBqIgopAwAiJYRC/////w9YBEAgCiAlpyABp0atQoCAgIAQhDcDAAwdCyAGIAdBABCmBUUNHAwgCyAHQXhqIggpAwAiASAHQXBqIgopAwAiJYRC/////w9YBEAgCiAlpyABp0etQoCAgIAQhDcDAAwcCyAGIAdBARCmBUUNGwwfCyAHQXhqIggpAwAiASAHQXBqIgspAwAiJYRC/////w9YBEAgCyAlpyABp0atQoCAgIAQhDcDAAwbCyAGIAdBABClBQwaCyAHQXhqIggpAwAiASAHQXBqIgspAwAiJYRC/////w9YBEAgCyAlpyABp0etQoCAgIAQhDcDAAwaCyAGIAdBARClBQwZCyAGIAcQtQgNHCAHQXhqIQgMGAsgBiAHELQIDRsgB0F4aiEIDBcLIAYgB0F4aiIIKQMAIgEQ+QMhCyAGIAEQCyAIIAYgCxAyNwMAIAchCAwWCyAGIAcQswgNGSAHQXhqIQgMFQsgCSgAACEIIAtBBWohCSAGIAYpA8ABIAhBABDaASIIQQBIDRggByAIQQBHrUKAgICAEIQ3AwAgB0EIaiEIDBQLIAdBeGoiCCkDACIBQv////9vVg0SIAYgARAqIgEQDA0XIAYgCCkDABALIAggATcDACAHIQgMEwsgB0F4aiIIKQMAIgFCIIinQQhqIgpBCE1BAEEBIAp0QYMCcRsNESAGIAEQiQQiARAMDRYgBiAIKQMAEAsgCCABNwMAIAchCAwSCwJAIAdBcGopAwAiARARRQRAIAEQJ0UNAQsgBkHVxgBBABAVDBYLIAdBeGoiCCkDACIBQiCIp0EIaiIKQQhNQQBBASAKdEGDAnEbDRAgBiABEIkEIgEQDA0VIAYgCCkDABALIAggATcDACAHIQgMEQsgC0EKaiEKIAsoAAUhDyALLQAJIRYgBiAHQXhqIggpAwAiASAJKAAAIgkQdyIkQQBIDQ4CQCAkRQ0AIBYEQCAGIAEgCRCyCCIWQQBIDRAgFg0BCwJAAkACQAJAAkACQAJAIAxBjn9qDgYAAQIDBAUGCyAGIAEgCSABQQAQEyIBEAwNFSAGIAggARAfDAULIAYgASAJIAdBcGoiBykDAEGAgAIQlQIhCSAGIAgpAwAQCyAJQX9MDRQMBAsgBiABIAlBABDaASIJQQBIDRMgBiAIKQMAEAsgCCAJQQBHrUKAgICAEIQ3AwAMAwsgByAGIAkQZjcDACAHQQhqIQcMAgsgBiABIAkgAUEAEBMiARAMDREgByABNwMAIAdBCGohBwwBCyAGIAEgCSABQQAQEyIBEAwNECAGIAgpAwAQCyAIQoCAgIAwNwMAIAcgATcDACAHQQhqIQcLIAogD2pBe2ohCSAHIQgMEQsgBiAIKQMAEAsgCiEJDBALIAdBeGopAwAiJUKAgICAcINCgICAgDBRDQwMBQsgB0F4aikDACIlQoCAgIBwg0KAgICAIFENCwwECyAGIAdBeGopAwAiJRD5A0HFAEYNAQwDCyAGIAdBeGopAwAiJRD5A0EbRw0CCyAGICUQCwwICyAHQXhqKQMAIiVCgICAgGCDQoCAgIAgUQ0HCyAGICUQCyAHQXhqQoCAgIAQNwMAIAchCAwJCyAOKAIUIQggDSAMNgIEIA0gCEF/cyAJajYCACAGQevGACANEEIMDAsgByAJKAAArTcDACALQQVqIQkgB0EIaiEIDAcLQgIhJQwMC0KAgICAMCElDAsLQgAhJQwKCyAHQXhqIgcpAwAhAQwKCyAHQXhqQoGAgIAQNwMAIAchCAwCCyAKIQkMBQsgByEIC0EACyEKIAghByAJIQsgCkUNAQsLIAghBwtBASEIDAULAkAgFSkDgAEiARCxCAR+IBIgCTYCICAGIAFBAEEAQQAQvwIgFSkDgAEFIAELENkIDQAgByELA0AgCyIHIBhNDQEgBiAHQXhqIgspAwAiARALIAFCgICAgHCDQoCAgIDQAFINACABpyIIDQUgBiAHQXBqIgspAwAQCyAGIAdBaGopAwBBARCwARoMAAsAC0KAgICA4AAhJUKAgICA4AAhASAOLQARQTBxRQ0BCyASIAc2AiwgEiAJNgIgDAELIBJBGGoQ4wNFBEAgFSASEKQFCwN+IBQgB08EfiABBSAGIBQpAwAQCyAUQQhqIRQMAQsLISULIBUgEigCADYCjAEMAgsgCyAVKQOAATcDACAVQoCAgIAgNwOAASAOKAIUIAhqIQtBACEIDAALAAsgDUHgAGokACAlC4gBAQJ/IAEoAhAiAy0AEEUEQEEADwsCQCADKAIAQQFHBEAgAgR/IAIoAgAgAxAoa0EDdQVBAAshBCAAIAMQtgUiA0UEQEF/DwsgACgCECABKAIQEJwCIAEgAzYCECACRQ0BIAIgAxAoIARBA3RqNgIAQQAPCyAAKAIQIAMQggQgA0EAOgAQC0EACxAAIABBAnQgAUEDdGpBMGoLrAECAn8BfiAAIAApAzBBDxBRIggQDEUEQCAAIARBA3RBCGoQLiIGRQRAIAAgCBALQoCAgIDgAA8LIAYgAzsBBiAGIAQ6AAUgBiACOgAEIAYgATYCAEEAIQEgBEEAIARBAEobIQMgBkEIaiEEA0AgASADRkUEQCAEIAFBA3QiB2ogBSAHaikDABAONwMAIAFBAWohAQwBCwsgCCAGEIgBIAAgCEEvIAIQoAMLIAgL1gIBAX8CQCAAIAFGDQAgASAAayACa0EAIAJBAXRrTQRAIAAgASACECQaDwsgACABc0EDcSEDAkACQCAAIAFJBEAgAw0CIABBA3FFDQEDQCACRQ0EIAAgAS0AADoAACABQQFqIQEgAkF/aiECIABBAWoiAEEDcQ0ACwwBCwJAIAMNACAAIAJqQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AA0AgACABKAIANgIAIAFBBGohASAAQQRqIQAgAkF8aiICQQNLDQALCyACRQ0AA0AgACABLQAAOgAAIABBAWohACABQQFqIQEgAkF/aiICDQALCwsTACAAQRBqIAEgAiAAKAIIEQAACxsAIAAgAUH/AXEQDyAAIAIgACgCBGtBfGoQHQuTAQEBfyMAQRBrIgIkAAJAIAEEQCAAQf8ATQRAIABBIGogACAAQb9/akEaSRshAAwCCyACQQRqIABBAhCnBBogAigCBCEADAELIABB/wBNBEAgAEFgaiAAIABBn39qQRpJGyEADAELIAJBBGogAEEAEKcEQQFHDQAgAigCBCIBIAAgAUH/AEsbIQALIAJBEGokACAAC2YBAX8Cf0EAIAAoAggiAiABTw0AGkF/IAAoAgwNABogACgCFCAAKAIAIAJBA2xBAXYiAiABIAIgAUsbIgEgACgCEBEAACICRQRAIABBATYCDEF/DwsgACABNgIIIAAgAjYCAEEACwsRACAAQRBqIAEgACgCABEBAAtVAQJ/AkAgAUKAgICAcFQNACABpyIDLwEGIgRBCktBASAEdEHwCXFFcg0AIAAgAykDIBALIAMgAjcDIA8LIAAgAhALIAEQDEUEQCAAQZ2zAUEAEBULC2AAIARB8gAgA0G8f2ogA0G1AUYbQf8BcRAPIAQgACACEBgQHSAFIAEgBSgCABDDAyIANgIAIAQgABAdIAQgBkH/AXEQDyABIAUoAgBBARBwGiABIAEoAtACQQFqNgLQAguqBQEDfyMAQRBrIgIkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIQIgRBzQBqDgMEAQMACyAEQewAakECSQ0BAkAgBEFVag4DAQYBAAsgBEFYRg0EIARB/gBGDQAgBEEhRw0FC0F/IQMgABAQDQwgAEEQEOsBDQxBjAEhAwJAAkAgBEFVag4DBwEJAAsgBEG0f0cEQCAEQSFGDQggBEH+AEcNAUGVASEDDAkLIABBDhANQQYhAwwICxABAAsgABAQDQggAEEAEOsBDQggACACQQxqIAJBCGogAiACQQRqQQBBASAEELoBDQggACAEQXpqQf8BcRANIAAgAigCDCACKAIIIAIoAgAgAigCBEECQQAQ0AEMBwtBfyEDIAAQEA0KIABBEBDrAQ0KQZcBIQMgACgCQCIBEKUBQbYBRw0FIAEoAoACIAEoApgCakG1AToAAAwFC0F/IQMgABDcBkUNCAwJCyAAKAJAIgEtAGxBAnFFBEAgAEHChwFBABAUDAYLIAEoAmRFBEAgAEHdhwFBABAUDAYLQX8hAyAAEBANCCAAQRAQ6wENCEGLASEDDAMLQX8hAyAAIAFBBHFBAnIQwgMNByAAKAIwDQMgACgCECIEQX5xQZR/Rw0DIAAgAkEMaiACQQhqIAIgAkEEakEAQQEgBBC6AQ0HIAAgBEF8akH/AXEQDSAAIAIoAgwgAigCCCACKAIAIAIoAgRBA0EAENABIAAQEEUNAwwHC0GNASEDDAELQZYBIQMLIAAgAxANDAMLQQAhAyABQRhxRQ0DIAAoAhBBo39HDQMgAUEQcUUNASAAKAIAQfmHAUEAEMsCC0F/IQMMAgtBfyEDIAAQEA0BIABBCBDrAQ0BIABBnwEQDQtBACEDCyACQRBqJAAgAwtMAQJ/IAAoAkAiAQRAIAEoArwBIQIgAEGzARANIAAgAkH//wNxEBcgASABKALMASACQQN0aigCACIANgK8ASABIAEgABDgBjYCwAELCzcBAX8jAEHQAGsiASQAIAEgACgCACABQRBqIAAoAiAQlQE2AgAgAEGz/AAgARAUIAFB0ABqJAAL2RkBC38jAEEwayIFJAAgACgCACEIAkACQAJAAkACQCAAEPEGRQRAIAAoAhAhAgwBCyAIIAAoAiAQGCEGIAAoAkBBsAJqIQMCQANAIAMoAgAiA0UNASADKAIEIAZHDQALIABBupABQQAQFAwCCyAAEBANASAAQToQLw0BIAAoAhAiAkHHAGpBA0kNACAAEDUhAkEAIQMgACgCQCAFQRBqIAYgAkF/QQAQqAEgACABQR50QR91QQBBAyAAKAJALQBuQQFxG3EQ7gENASAAIAIQHiAAKAJAEKcBDAMLAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAJB0gBqDiQDEQEdEREREREREQUEBgcHCBERAgkREQwQCw8cEhISERERERwACyACQYN/Rg0MIAJBO0YNCSACQfsARw0QIAAQ6wINHQweCyAAKAJAKAIgBEAgAEHPkAFBABAUDB0LIAAQEA0cQQAhAyAAAn9BACAAKAIQIgJBO0YNABpBACACQf0ARg0AGkEAIAAoAjANABogABCXAQ0dQQELEOoCIAAQuwENHAweCyAAEBANGyAAKAIwBEAgAEHokAFBABAUDBwLIAAQlwENGyAAQS8QDSAAELsBRQ0cDBsLIAAQEA0aIAAQgwEaIAAQ0gEgABCGAg0aIABB6QBBfxAcIQEgACAAKAJALQBuQX9zQQFxIgMQ7gENGgJAIAAoAhBBr39HBEAgASECDAELIABB6wBBfxAcIQIgABAQDRsgACABEB4gACADEO4BDRsLIAAgAhAeDBcLIAAQNSEBIAAQNSECIAAoAkAgBUEQaiAGIAIgAUEAEKgBIAAQEA0ZIAAQ0gEgACABEB4gABCGAg0ZIABB6QAgAhAcGiAAEK8CDRkgAEHrACABEBwaIAAgAhAeIAAoAkAQpwEMGgsgABA1IQEgABA1IQIgABA1IQMgACgCQCAFQRBqIAYgAiABQQAQqAEgABAQDRggACADEB4gABDSASAAEK8CDRggACABEB4gAEG6fxAvDRggABCGAg0YIAAoAhBBO0YEQCAAEBANGQsgAEHqACADEBwaIAAgAhAeIAAoAkAQpwEMGQsgABAQDRcgABDSAUEAIQEgBUEANgIMAkAgACgCECICQVhHBEAgAkEoRw0BIAAgBUEMakEAEKYBGgwBCyAAKAJALQBsQQJxRQRAIABBzpEBQQAQFAwZCyAAEBANGEEBIQELIABBKBAvDRcgBS0ADEEBcUUEQCAAIAYgARDwBkUNGQwYCyAAKAJAKAK8ASEHIAAQgwEaIAAoAhAiAUE7Rg0TQVEhAgJAIABBBBDJAw4CABIYCyABQbF/RiABQVFGcg0QIAEiAkFJRg0RIABBABDUBA0XIABBDhANDBILIAAQEA0WIAJBxABqIQFBACEDAkAgACgCMA0AIAAoAhBBg39HDQAgACgCKA0AIAAoAiAhAwsgACADIAEQ7wYNFiADBEAgABAQDRcLIAAQuwFFDRcMFgsgABAQDRUgABDSASAAEIYCDRUgABCDARogABA1IQRBfyEBIAAoAkAgBUEQaiAGIARBf0EBEKgBIABB+wAQLw0VQX8hAgJAA0ACQAJAAkAgACgCECIDQcEAag4CAAECCyABQQBIBH9BfwUgAEHrAEF/EBwLIQMgACABEB4DQCAAEBANGiAAQREQDSAAEJcBDRogAEE6EC8NGiAAQasBEA0gACgCEEG/f0YEQCAAQeoAIAMQHCEDDAELCyAAQekAQX8QHCEBIAAgAxAeDAILIAAQEA0YIABBOhAvDRggAkEATgRAIABBgJIBQQAQFAwZCyABQX9MBEAgAEHrAEF/EBwhAQsgAEG0ARANIABBABA5IAAoAkAoAoQCQXxqIQIMAQsCQAJAIANB/QBHBEAgAUF/Sg0BIABBkpIBQQAQFAwaCyAAQf0AEC8NGSACQQBIDQEgACgCQCgCgAIgAmogARBcIAAoAkAoAqQCIAFBFGxqIAJBBGo2AgQMAwsgAEEHEO4BRQ0BDBgLCyAAIAEQHgsgACAEEB4gAEEOEA0gACgCQBCnAQwSCyAAENIBIAAQEA0UIAAQNSEBIAAQNSECIAAQNSEDIAAQNSEEIABB7AAgARAcGiAAKAJAIAVBEGpBAEF/QX9BARCoASAFIAM2AiQgABDrAg0UIAAoAkAQpwEgABDpAgRAIABBDhANIABBBhANIABB7QAgAxAcGiAAQQ4QDSAAQesAIAQQHBoLAkACQAJAIAAoAhBBPWoOAgAPAQsgABAQDRYgABCDARogACABEB4gACgCEEH7AEYEQCAAQQ4QDQwOCyAAQSgQLw0WIAAoAhAiAUH7AEYgAUHbAEZyDQECQCABQYN/RgRAIAAoAihFDQELIABBu44BQQAQFAwXCyAIIAAoAiAQGCEBAkAgABAQRQRAIAAgAUFDEK4CQX9KDQELIAggARASDBcLIABBtwEQDSAAIAEQOSAAIAAoAkAvAbwBEBcMDAsgAEGrkgFBABAUDBULIABBUUEAQQFBf0EBENEBQQBODQoMFAsgABAQRQ0UDBMLIAAoAkAtAG5BAXEEQCAAQcaSAUEAEBQMEwsgABAQDRIgABCGAg0SIAAQgwEaIAAgACgCQEHUAEEAEKkBIgFBAEgNEiAAQe8AEA0gAEHZABANIAAgAUH//wNxEBcgABDSASAAEK8CDRIMDwsgAUEBcUUNASABQQRxDQYgAEEAEIYBQSpGDQEMBgsgACgCKARAIAAQ7QEMEQtBUSECAkAgACABEMkDDgIADxELIABBhQEQUEUNAyAAQQEQhgFBRUcNAyABQQRxDQULIABB3JIBQQAQFAwPCyABQQRxRQRAIABBm5MBQQAQFAwPC0F/IQFBACEDIABBAEEAEO4CRQ0QDBELIAAQEA0NIAAQuwFFDQ4MDQsgABCXAQ0MAkAgACgCQCgCpAFBAE4EQCAAQdkAEA0gACAAKAJALwGkARAXDAELIABBDhANCyAAELsBRQ0NDAwLIAAgACgCIBDuBgwLC0EAIQMgAEEBQQAgACgCGCAAKAIUENQBDQoMDAsgAEEpEC8NCQsgAEHsACACEBwaIAAQgwEaIAAoAkAgBUEQakEAQX9Bf0EBEKgBIAUgAzYCJCAAEOsCDQggACgCQBCnASAAEOwBIAAQ7AEgABDpAgRAIABBDhANIABBBhANIABB7QAgAxAcGiAAQQ4QDSAAQesAIAQQHBoLIAIhAQsgACABEB4gAEHtACADEBwaIABBLxANIAAgAxAeIAAoAhBBREYEQCAAEBANCEEAIQMgACgCQCAFQRBqQQBBf0F/QQIQqAEgACgCQCIBKAKkAUEATgRAIAAoAgAgAUHRABBXIgNBAEgNCSAAQdgAEA0gACAAKAJALwGkARAXIABB2QAQDSAAIANB//8DcRAXIAAQ0gELIAAQ6wINCCAAKAJAIgEoAqQBQQBOBH8gAEHYABANIAAgA0H//wNxEBcgAEHZABANIAAgACgCQC8BpAEQFyAAKAJABSABCxCnAQsgAEHuABANIAAgBBAeDAgLIAEhAgsgABAQDQUgAEEAIAJBABDLAw0FCyAAIAAoAkAoArwBIAcQrQILIABBOxAvDQMgABA1IQQgABA1IQMgABA1IQIgABA1IQkgACgCQCAFQRBqIAYgCSADQQAQqAEgAiEBIAAoAhBBO0cEQCAAIAQQHiAAEJcBDQQgAEHpACAJEBwaIAQhAQsgAEE7EC8NAwJAIAAoAhBBKUYEQCAFIAE2AhxBACEEIAEhAwwBCyAAQesAIAIQHBogACgCQCgChAIhBCAAIAMQHiAAEJcBDQQgAEEOEA0gASACRg0AIABB6wAgARAcGgsgAEEpEC8NAyAAKAJAKAKEAiELIAAgAhAeIAAQrwINAyAAIAAoAkAoArwBIAcQrQICQCABIAJGIAEgA0ZyRQRAIAAoAkAiAUGAAmoiByABKAKEAiIKIAsgBGsiAmoQ5wEaIAcgASgCgAIgBGogAhCUARogASgCgAIgBGpBsQEgAhBMGiAAKAJAIgIgASgChAJBe2o2ApgCIAMgAigCrAIiASADIAFKGyEHIAogBGshCgNAIAMgB0YNAiACKAKkAiADQRRsaiIMKAIEIgEgBEggASALTnJFBEAgDCABIApqNgIECyADQQFqIQMMAAsACyAAQesAIAMQHBoLIAAgCRAeIAAoAkAQpwELIAAQ7AEMAwsgAUEEcQ0AIABBkJEBQQAQFAwBCyAAEBANAEEAIQMgAEEBIAJBABDLAw0AIAAQuwFFDQILQX8hAwwBC0EAIQMLIAggBhASIAMhAQsgBUEwaiQAIAELmQEBAX4CQAJAAkAgARAhRQ0AIAAgAUE8IAFBABATIgEQDA0CAkAgARARDQAgARAhRQRAIAAgARALDAILIAAgAUHMASABQQAQEyEDIAAgARALAkAgAxAMDQAgAxARDQEgAxAnDQEgAxCyAQ0AIAAgAxALIABBycwAQQAQFQwDCyADDwsgAhAODwsgABApC0KAgICA4AAhAQsgAQsIACAAQc8BSAs6AQF/AkAgAEFQaiIBQQpPBH8gAEG/f2pBGUsNASAAQUlqBSABCw8LIABBqX9qQSQgAEGff2pBGkkbCxIAIAEQ8AFFBEAgACABEO0ECwu9AQEBfgJAAkAgAgRAIAAgAUHOASABQQAQEyIDEAwNAiADEBFFBEAgAxAnRQ0CCyAAIAFBwwEgAUEAEBMiAxAMDQIgACABIAMQ2AMhASAAIAMQCyABEAwEQCABDwsgACABEOEHIQMgACABEAsgAw8LIAAgAUHDASABQQAQEyIDEAwNAQsgACADEDtFBEAgACADEAsgAEGGyQBBABAVQoCAgIDgAA8LIAAgASADENgDIQEgACADEAsgASEDCyADCykBAX8gAEKAgICAcINCgICAgJB/UQR/IACnKAIEQf////8HcUUFQQALCy0BAX9BASEBAkACQAJAIABBc2oOBAIBAQIACyAAQS1GDQELIABBMUYhAQsgAQsKACAAIAEQDhAtC2gBAX8CQAJAIAFFDQAgASgCACICQQBMDQEgASACQX9qIgI2AgAgAg0AAkAgAS0ABUEBcQRAIAAgASkDGBAmIAEQnQIMAQsgAUEIahBHCyAAIAEQIAsPC0GxwQBBoQ1B9ChBz8EAEAAACxwAIAAoAhAoAowBIgBFBEBBAA8LIAAoAihBAXELUQEBfyABQoCAgIBwWgRAIAGnIgIvAQZBKUYEQCAAIAEQ6AgPCyACKAIQKAIsIgBFBEBCgICAgCAPCyAArUKAgICAcIQQDg8LIAAgARCPBBAOCxsAIAAoAhAgASACEMYFIgFFBEAgABDHAQsgAQs3ACAAIAEgAiADAn9BACAAKAIQIgAtAIgBDQAaQQEgACgCjAEiAEUNABogACkDCBCeA0ULEMAFC7UDAgR/AX4jAEEgayIEJAAgASABIAJqIgUgBSABSRshAyABIQYCfgJAA0ACQAJAAn8gBiAFSQRAIAYsAABBAE4NAiAGIQMLIAMgAWsiBkGAgICABE8LBEAgAEH0DUEAEEIMBAsgAyAFRgRAIAAgASACENACDAULIAAgBCACEEMNASAEIAEgBhCaAhoDQAJAAkAgAyAFSQRAIAMsAAAiAEEATgRAIAQgAEH/AXEQPBogA0EBaiEDDAQLIAMgBSADayAEQRxqEGUiAUH//wNNBEAgBCgCHCEDDAMLIAFBgIDEAEkNASADIAUgAyAFSxshAANAQf3/AyEBIAMgBU8EQCAAIQMMBAsgAywAACICQX9KIAJB/wFxQb8BS3JFBEAgA0EBaiEDDAELCwNAIANBAWoiAyAFTw0DIAMsAAAiAEF/Sg0DIABB/wFxQcABSQ0ACwwCCyAEEDgMBwsgBCgCHCEDIAQgAUGAgHxqIgBBCnZBgLADahCSARogAEH/B3FBgLgDciEBCyAEIAEQkgEaDAALAAsgBkEBaiEGDAELCyAEEEULQoCAgIDgAAshByAEQSBqJAAgBwtVAQJ/QdilBCgCACIBIABBA2pBfHEiAmohAAJAIAJBAU5BACAAIAFNGw0AIAA/AEEQdEsEQCAAEAVFDQELQdilBCAANgIAIAEPC0GUpwRBMDYCAEF/C6MNAQd/AkAgAEUNACAAQXhqIgMgAEF8aigCACIBQXhxIgBqIQUCQCABQQFxDQAgAUEDcUUNASADIAMoAgAiAmsiA0GEqAQoAgAiBEkNASAAIAJqIQAgA0GIqAQoAgBHBEAgAkH/AU0EQCADKAIIIgQgAkEDdiICQQN0QZyoBGpHGiAEIAMoAgwiAUYEQEH0pwRB9KcEKAIAQX4gAndxNgIADAMLIAQgATYCDCABIAQ2AggMAgsgAygCGCEGAkAgAyADKAIMIgFHBEAgBCADKAIIIgJNBEAgAigCDBoLIAIgATYCDCABIAI2AggMAQsCQCADQRRqIgIoAgAiBA0AIANBEGoiAigCACIEDQBBACEBDAELA0AgAiEHIAQiAUEUaiICKAIAIgQNACABQRBqIQIgASgCECIEDQALIAdBADYCAAsgBkUNAQJAIAMgAygCHCICQQJ0QaSqBGoiBCgCAEYEQCAEIAE2AgAgAQ0BQfinBEH4pwQoAgBBfiACd3E2AgAMAwsgBkEQQRQgBigCECADRhtqIAE2AgAgAUUNAgsgASAGNgIYIAMoAhAiAgRAIAEgAjYCECACIAE2AhgLIAMoAhQiAkUNASABIAI2AhQgAiABNgIYDAELIAUoAgQiAUEDcUEDRw0AQfynBCAANgIAIAUgAUF+cTYCBCADIABBAXI2AgQgACADaiAANgIADwsgBSADTQ0AIAUoAgQiAUEBcUUNAAJAIAFBAnFFBEAgBUGMqAQoAgBGBEBBjKgEIAM2AgBBgKgEQYCoBCgCACAAaiIANgIAIAMgAEEBcjYCBCADQYioBCgCAEcNA0H8pwRBADYCAEGIqARBADYCAA8LIAVBiKgEKAIARgRAQYioBCADNgIAQfynBEH8pwQoAgAgAGoiADYCACADIABBAXI2AgQgACADaiAANgIADwsgAUF4cSAAaiEAAkAgAUH/AU0EQCAFKAIMIQIgBSgCCCIEIAFBA3YiAUEDdEGcqARqIgdHBEBBhKgEKAIAGgsgAiAERgRAQfSnBEH0pwQoAgBBfiABd3E2AgAMAgsgAiAHRwRAQYSoBCgCABoLIAQgAjYCDCACIAQ2AggMAQsgBSgCGCEGAkAgBSAFKAIMIgFHBEBBhKgEKAIAIAUoAggiAk0EQCACKAIMGgsgAiABNgIMIAEgAjYCCAwBCwJAIAVBFGoiAigCACIEDQAgBUEQaiICKAIAIgQNAEEAIQEMAQsDQCACIQcgBCIBQRRqIgIoAgAiBA0AIAFBEGohAiABKAIQIgQNAAsgB0EANgIACyAGRQ0AAkAgBSAFKAIcIgJBAnRBpKoEaiIEKAIARgRAIAQgATYCACABDQFB+KcEQfinBCgCAEF+IAJ3cTYCAAwCCyAGQRBBFCAGKAIQIAVGG2ogATYCACABRQ0BCyABIAY2AhggBSgCECICBEAgASACNgIQIAIgATYCGAsgBSgCFCICRQ0AIAEgAjYCFCACIAE2AhgLIAMgAEEBcjYCBCAAIANqIAA2AgAgA0GIqAQoAgBHDQFB/KcEIAA2AgAPCyAFIAFBfnE2AgQgAyAAQQFyNgIEIAAgA2ogADYCAAsgAEH/AU0EQCAAQQN2IgFBA3RBnKgEaiEAAn9B9KcEKAIAIgJBASABdCIBcUUEQEH0pwQgASACcjYCACAADAELIAAoAggLIQIgACADNgIIIAIgAzYCDCADIAA2AgwgAyACNgIIDwtBHyECIANCADcCECAAQf///wdNBEAgAEEIdiIBIAFBgP4/akEQdkEIcSIBdCICIAJBgOAfakEQdkEEcSICdCIEIARBgIAPakEQdkECcSIEdEEPdiABIAJyIARyayIBQQF0IAAgAUEVanZBAXFyQRxqIQILIAMgAjYCHCACQQJ0QaSqBGohAQJAAkACQEH4pwQoAgAiBEEBIAJ0IgdxRQRAQfinBCAEIAdyNgIAIAEgAzYCACADIAE2AhgMAQsgAEEAQRkgAkEBdmsgAkEfRht0IQIgASgCACEBA0AgASIEKAIEQXhxIABGDQIgAkEddiEBIAJBAXQhAiAEIAFBBHFqIgdBEGooAgAiAQ0ACyAHIAM2AhAgAyAENgIYCyADIAM2AgwgAyADNgIIDAELIAQoAggiACADNgIMIAQgAzYCCCADQQA2AhggAyAENgIMIAMgADYCCAtBlKgEQZSoBCgCAEF/aiIANgIAIAANAEG8qwQhAwNAIAMoAgAiAEEIaiEDIAANAAtBlKgEQX82AgALC9sBAgF/An5BASEEAkAgAEIAUiABQv///////////wCDIgVCgICAgICAwP//AFYgBUKAgICAgIDA//8AURsNACACQgBSIANC////////////AIMiBkKAgICAgIDA//8AViAGQoCAgICAgMD//wBRGw0AIAAgAoQgBSAGhIRQBEBBAA8LIAEgA4NCAFkEQEF/IQQgACACVCABIANTIAEgA1EbDQEgACAChSABIAOFhEIAUg8LQX8hBCAAIAJWIAEgA1UgASADURsNACAAIAKFIAEgA4WEQgBSIQQLIAQL4wEBAn8gAkEARyEDAkACQAJAIAJFIABBA3FFcg0AIAFB/wFxIQQDQCAALQAAIARGDQIgAEEBaiEAIAJBf2oiAkEARyEDIAJFDQEgAEEDcQ0ACwsgA0UNAQsCQCAALQAAIAFB/wFxRiACQQRJcg0AIAFB/wFxQYGChAhsIQMDQCAAKAIAIANzIgRBf3MgBEH//ft3anFBgIGChHhxDQEgAEEEaiEAIAJBfGoiAkEDSw0ACwsgAkUNACABQf8BcSEBA0AgASAALQAARgRAIAAPCyAAQQFqIQAgAkF/aiICDQALC0EAC0QBAX9BfyEDIAAgACgCBCACahDnAQR/QX8FIAAoAgAgAWoiAyACaiADIAAoAgQgAWsQ4wEgACAAKAIEIAJqNgIEQQALCx8AIAAgASAAIAIQyAEiAiADIAQQGiEEIAAgAhASIAQLnQEBA38jAEEQayICJAAgAkElOgAKQQEhAyABQYACTgRAIAJB9QA6AAsgAiABQQh2QQ9xQaKyAWotAAA6AA0gAiABQQx2QQ9xQaKyAWotAAA6AAxBBCEDCyACQQpqIANqIgQgAUEPcUGisgFqLQAAOgABIAQgAUEEdkEPcUGisgFqLQAAOgAAIAAgAkEKaiADQQJyEJoCGiACQRBqJAALtgEBAn8CQCACIAEoAgQiCkYEQCADIQsMAQsgACAKIAIgAyAEIAUgBiAHIAggCRCEAiIFQQBODQBBfw8LQQAhAiABKALAAiIDQQAgA0EAShshAwJAA0AgAiADRwRAAkAgBSABKALIAiACQQN0aiIKLwECRw0AIAotAAAiCkEBdkEBcSAERw0AIAsgCkEBcUYNAwsgAkEBaiECDAELCyAAIAEgCyAEIAUgBiAHIAggCRC+AyECCyACC0cBAn8gACgCfCECAkADQCACQQFOBEAgACgCdCACQX9qIgJBBHRqIgMoAgAgAUcNASADKAIEDQEMAgsLIAAgARDRBCECCyACCyIAAkAgAEEoEC8NACAAEJcBDQBBf0EAIABBKRAvGw8LQX8LFAAgACgCACAAIAEgAiADIAQQrAgL9xUBCn8jAEEQayIPJAAgACgCQCEHIAAoAgAhCwJAAkACQAJAIAFBAk0EQAJAIAINAEEAIQIgAEGFARBQRQ0AIABBARCGAUEKRg0AQX8hCCAAEBANBUECIQILQX8hCCAAEBANBCAAKAIQIgpBKkYEQCAAEBANBSAAKAIQIQogAkEBciECCwJAAkACQAJAIApBKWoOAgECAAsgCkGDf0cNBAJAIAAoAigNACACQQFxRSABQQJHckVBACAAKAIgIgpBLUYbDQAgAkECcUUgAUECR3IgCkEuR3INAwsgABDtAQwHCyAHLQBuQQFxDQMgAUECRg0BDAMLIAAoAkQgAUECR3INAgsgCyAAKAIgEBghCiAAEBBFDQIMAwsgAUEDRg0BIAtBABAYGgwBC0EAIQogAUECRiAFQQJGcg0AIABB7/oAQQAQFAwCCwJAAkACQCAHKAIgIghFIAFBAUtyDQAgBygCJEEBRw0AIAcgChCsAiIJRQ0AIAkoAgggBygCvAFHDQAgAEGG+wBBABAUDAELQX8hEAJAIAFBAUcEQAwBCwJAIAINACAHLQBuQQFxDQAgByAKIAcoAsABQQAQyANBf0oNACAHIAoQhQJBgICAgHpxQYCAgIACRg0AIApBzQBGBEAgBygCSA0BC0EBIQ0LAkAgCEUNACAHKAIkQQFLDQAgBygCvAEiCCAHKALwAUcNACAHIAoQrAIiCUUNASAJKAIIIAhHDQEgAEG/+wBBABAUDAILQX8hCCAAIAcgCkEEQQMgAhsQqQEiEEF/TA0DCyALIAdBACABQQFLIAAoAgwgBBDqAyIHDQELIAsgChASQX8hCAwCCyAGBEAgBiAHNgIACyAAIAc2AkAgByAKNgJwIAcgAUEIRiIENgJgIAcgAUEDRyIINgJMIAcgCDYCSCAHIAJFIAFBA0lxNgI0IAcgAUF8akEFSSIJNgIwQQEhDEEBIQ4gCEUEQCAHKAIEIggoAlwhDiAIKAJYIQkgCCgCUCEMIAgoAlQhBAsgByAONgJcIAcgCTYCWCAHIAQ2AlQgByAMNgJQIAcgAkH/AXEgAUEIdHI7AWwgAUF5aiIOQQFNBEAgAEErEA0LIAFBB0YEQCAAENMECyAHQgE3AjgCQAJAAkACQCABQQNHIAAoAhAiBEGDf0dyRQRAIAAoAigNAyALIAcgACgCIBDHA0EASA0EIAdBATYCjAEMAQsCQCAEQShGBEAgACAPQQxqQQAQpgEaIA8tAAxBBHEEQCAHQQE2AjwLIAAQEEUNAQwFCyAAQSgQLw0ECyAHKAI8BEBBfyEIIAdBfzYCvAEgABCDAUEASA0GC0EAIQkCQANAIAAoAhAiCEEpRg0BAkACQAJAAkACfyAIQaV/RyIMRQRAIAdBADYCOCAAEBANCyAAKAIQIQgLIAhBg39HCwRAIAhB+wBHQQAgCEHbAEcbDQQgB0EANgI4AkAgDEUEQCAAQQ0QDSAHKAKIASEIDAELIAsgB0EAEMcDIQggAEHbABANCyAAIAhB//8DcRAXIABBUUGxfyAHKAI8G0EBQQFBf0EBENEBIgRBAEgNCiAEIAlyIQRBASEJIARFBEAgByAHKAKMAUEBajYCjAFBACEJCyAMRQ0BDAMLIAAoAigNCCAAKAIgIgRBLUYEQCAHLQBsQQFGDQkLIAcoAjwEQCAAIAcgBEEBEKkBQQBIDQoLIAsgByAEEMcDIghBAEgNCSAAEBANCSAMDQEgAEENEA0gACAIQf//A3EiCBAXIAcoAjwEQCAAQREQDSAAQbsBEA0gACAEEBsgACAHLwG8ARAXCyAAQdwAEA0gACAIEBcgB0EANgI4CyAAKAIQQSlGDQQgAEEpEC8aDAgLIAAoAhBBPUYEQCAHQQA2AjggABAQDQggABA1IQkgAEHbABANIAAgCEH//wNxIggQFyAAQREQDSAAQQYQDSAAQasBEA0gAEHpACAJEBwaIABBDhANIAAQXg0IIAAgBBCqASAAQREQDSAAQdwAEA0gACAIEBcgACAJEB4gAEG7ARANIAAgBBAbIAAgBy8BvAEQF0EBIQkMAQsgCUUEQCAHIAcoAowBQQFqNgKMAQsgBygCPEUNACAAQdsAEA0gACAIQf//A3EQFyAAQbsBEA0gACAEEBsgACAHLwG8ARAXCyAAKAIQQSlGDQIgAEEsEC9FDQEMBgsLIABB6fsAQQAQFAwECwJAAkAgAUF8ag4CAQACCyAHKAKIAUEBRg0BDAILIAcoAogBDQELIAcoAjwEQCAHKALMASAHKAK8AUEDdGpBBGohCANAAkAgCCgCACIEQQBIDQAgBygCdCIIIARBBHQiBGoiCSgCBCAHKAK8AUcNACAHIAkoAgAiCRCFAkF/TARAIAsgByAJEFdBAEgNBiAHKAJ0IQggAEG2ARANIAAgBCAIaiIJKAIAEBsgACAHLwG8ARAXIABBtwEQDSAAIAkoAgAQGyAAQQAQFwsgBCAIakEIaiEIDAELCyAAQbMBEA0gACAHLwG8ARAXIAdBADYCvAEgByAHKALMASgCBDYCwAELIAAQEA0CIAJBfXFBAUYEQCAAQYcBEA0LIAdBATYCZCAAEIMBGiAHIAcoArwBNgLwAQJAAkAgACgCEEGkf0cNACAAEBANBCAAKAIQQfsARg0AIAAgByAKENIEDQQgABBeDQQgAEEuQSggAhsQDSAHLQBuQQJxDQEgByAAKAI0IANrIgI2ApADIAcgCyADIAIQnQMiAjYCjAMgAg0BDAQLIABB+wAQLw0DIAAQ2wQNAyAAIAcgChDSBA0DA0AgACgCEEH9AEcEQCAAENoERQ0BDAULCyAHLQBuQQJxRQRAIAcgACgCOCADayICNgKQAyAHIAsgAyACEJ0DIgI2AowDIAJFDQQLIAAQEA0DIAAQ6QJFDQAgAEEAEOoCCyAAIAcoAgQ2AkAgBygCcCECIAcgAEKAgICAIBDGAyIDNgIIIAFBAk8EQEEAIQggDkECSQ0FIABBAxANIAAgAxA5IAINBSAAQc0AEA0gAEEAEDkMBQsgAUEBRgRAIABBAxANIAAgAxA5IA0EQAJAIAAoAkAiASgCKARAIAsgASACEOgCIgFFDQYgAUEANgIIIAEgAS0ABEH+AXEgACgCQC0AbkEBcXI6AAQMAQsgASACEIUCQX9KDQAgCyABIAIQV0EASA0FCyAAQREQDSAAQbcBEA0gACACEBsgAEEAEBcLQQAhCCAQQQBOBEAgACgCQCgCdCAQQQR0aiIBIAEoAgxB/4CAgHhxIANBB3RBgP///wdxcjYCDCAAQQ4QDQwGCyAAQbsBEA0gACACEBsgACAAKAJALwG8ARAXDAULAkACQCAAKAJAIgEoAihFBEAgACABIAJBBhCpASIBQQBIDQUgACgCQCEAIAFBgICAgAJxBEAgACgCgAEgAUEEdGoiACAAKAIMQf+AgIB4cSADQQd0QYD///8HcXI2AgwMAgsgACgCdCABQQR0aiIAIAAoAgxB/4CAgHhxIANBB3RBgP///wdxcjYCDAwBCyALIAEgAkH8ACACGyIBEOgCIgJFDQQgAiADNgIAIAUNAQtBACEIDAULQQAhCCAAIAAoAkAoApQDIAEgAUEWIAVBAUYbQQAQhwINBAwCCyAAQYL8AEEAEBQMAQsgABDtAQsgACAHKAIENgJAIAsgBxCCA0F/IQggBkUNASAGQQA2AgAMAQsgCyAKEBILIA9BEGokACAIC3kBAX8gACAGQQwQUSIGEAxFBEAgBqciByAAEJ4CIgA2AiAgByAFOwEqIAcgBDoAKSAHIAM6ACggByABNgIkIAcgBy0ABUHvAXEgBEF+akEESUEEdHI6AAUgACAGIAAgAkG+FSACGxDIASIBIAMQoAMgACABEBILIAYL0AECAX8BfiMAQRBrIgIkAAJAIAEQIUUEQCAAEClCgICAgOAAIQYMAQsCQCAEDQAgAykDACIGQSoQQUUNACAAIAZBPCAGQQAQEyIGEAwNASAAIAYgARBZIQUgACAGEAsgBUUNACADKQMAEA4hBgwBCyAAIAIgARC6AiIBEAxFBEAgACACIARBA3RqKQMAQoCAgIAwQQEgAxAjIQYgACACKQMAEAsgACACKQMIEAsgBhAMBEAgACABEAsMAgsgACAGEAsLIAEhBgsgAkEQaiQAIAYLDAAgACABEAsgARAMC0QBAn8CQCAAQoCAgIBwVA0AIACnIgMvAQZBAkcNACADLQAFQQhxRQ0AIAIgAygCKDYCACABIAMoAiQ2AgBBASEECyAEC3gBAX8CQAJAAkACQAJAIAEoAgAiAkH/AGoOBAAAAwECCyAAKAIAIAEpAxAQCw8LIAAoAgAgASkDEBALIAAoAgAgASkDGBALDwsgAkGpf0cNAQsgACgCACABKAIQEBIPCyACQdUAakEtTQRAIAAoAgAgASgCEBASCwsNACAAIAEgAkEAEJMECw4AIAEgACgCEEErELMDC9MBAwF/AX4BfCMAQRBrIgMkAAJ/IAAgA0EIaiABQXhqIgEpAwAQWgRAQoCAgIAwIQRBfwwBCwJ8AkACQAJAAkACQCACQfR+ag4EAgQBAAMLIAMrAwhEAAAAAAAA8D+gDAQLIAMrAwhEAAAAAAAA8L+gDAMLIAMrAwiaDAILEAEACyADKwMICyIFvQJ/IAWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyIAt71RBEAgAK0hBEEADAELIAUQFiEEQQALIQAgASAENwMAIANBEGokACAACw0AIAAgASACEA4QxAELSQECfyACQv////8HWARAIAAgASACpxCRAUGAgAEQ2gEPCyAAIAIQlAMiA0UEQEF/DwsgACABIANBgIABENoBIQQgACADEBIgBAtDAQF/IAAgASAAKAIEQf////8HcSIAIAEoAgRB/////wdxIgEQsQEQyQUiAiAAIAFGckUEQEF/QQEgACABSRsPCyACCyAAIAAgASACQQBOBH4gAq0FIAK4EBYLIANBgIABEN0BC8EKAgd/AX4jAEEgayIJJAACQAJAAkACQAJAAkACfwJAAkACQAJAAkAgAUIgiKdBAWoOBQMCAgABAgsgACADEAsgACACQeYVEMYBQX8hBQwKCyAAIAMQCyAAIAJBhxYQxgFBfyEFDAkLIAAgARCPBKchBgwBCyABpyEGAkADQCAGKAIQIgcgBygCGCACcUF/c0ECdGooAgAhBSAHECghBwNAIAVFBEAgBiEHQQAMBQsgAiAHIAVBf2pBA3QiCGoiBSgCBEcEQCAFKAIAQf///x9xIQUMAQsLIAYoAhQgCGohByAFKAIAIghBgICAwH5xQYCAgMAARgRAIAAgByADEB8MBQsCQCAIQYCAgIACcQRAIAYvAQZBAkcNASACQTBHDQMgACAGIAMgBBC6BSEFDAsLIAhBGnZBMHEiCEEwRwRAIAhBIEcEQCAIQRBHDQggACAHKAIEIAEgAyAEEJkDIQUMDAsgBi8BBkELRg0HIAAgBygCACgCECADEB8MBgsgACAGIAIgByAFEMkCRQ0BDAkLC0GtFkGhDUGPwgBByxYQAAALQeIWQaENQZDCAEHLFhAAAAtBAQshBQNAAkACQCAFRQRAAkAgBi0ABSIFQQRxRQ0AAkAgBUEIcQRAIAIQXQRAIAIQeSIFIAYoAihPDQIgBiAHRw0FIAAgASAFrSADIAQQ3QEhBQwNCyAGLwEGQWtqQf//A3FBCEsNAiAAIAIQmwMiCEUNAkF/IQUgCEF/Sg0JDAoLIAAoAhAoAkQgBi8BBkEYbGooAhQiBUUNASAFKAIYBEAgACAGrUKAgICAcIQQDiIMIAIgAyABIAQgBSgCGBEsACEFIAAgDBALDAoLIAUoAgBFDQEgACAJIAatQoCAgIBwhBAOIgwgAiAFKAIAERgAIQUgACAMEAsgBUF/TA0JIAVFDQEgCS0AAEEQcQRAIABBACAJKQMYIgynIAwQERsgASADIAQQmQMhBSAAIAkpAxAQCyAAIAkpAxgQCwwMCyAAIAkpAwgQCyAJLQAAQQJxRQ0HIAYgB0cNAyAAIAEgAiADQoCAgIAwQoCAgIAwQYDAABB1IQUMCQsgBi8BBkFrakH//wNxQQlJDQcLIAYoAhAoAiwhBkEBIQUMAwsgBkUNAANAIAYoAhAiCCAIKAIYIAJxQX9zQQJ0aigCACEFIAgQKCEKA0AgBUUNAyACIAogBUF/akEDdCIFaiIIKAIERwRAIAgoAgBB////H3EhBQwBCwsgBigCFCAFaiEKAkAgCCgCACIFQRp2QTBxIgtBMEcEQCALQRBHDQEgACAKKAIEIAEgAyAEEJkDIQUMCwtBfyEFIAAgBiACIAogCBDJAkUNAQwKCwsgBUGAgIDAAHENAQwECyAEQYCABHEEQCAAIAMQCyAAIAIQyAJBfyEFDAgLIAdFBEAgACADEAsgACAEQZQXEHYhBQwICyAHLQAFIgZBAXFFBEAgACADEAsgACAEQaIXEHYhBQwICyAGQQRxBEACQCAGQQhxRQ0AIAcvAQZBAkcNACACEF1FDQAgAhB5IAcoAihHDQAgACAHIAMgBBCIBCEFDAkLIAAgByACIANCgICAgDBCgICAgDAgBEGHzgByEIcEIQUMBgsgACAHIAJBBxB/IgJFDQYgAiADNwMADAILQQAhBQwACwALQQEhBQwECyAAIAMQCyAAIAQgAhDcASEFDAMLIAAgACADEJ0BIgEQC0F/IQUgARAMDQIgACAEQfkWEHYhBQwCCyAAIAMQCwwBCyAAIAMQC0F/IQULIAlBIGokACAFCw0AIAAoAhAgAacQzgILFQEBfiAAIAEQ+QEhAiAAIAEQCyACC6ACAQN/AkACQCADBEAgAUKAgICAYINCgICAgCBSDQEMAgsgAUKAgICAcFQNAQtBASEEAkACQCACQiCIp0EBag4EAAICAQILIAKnIQULAkACQCABQv////9vWEEAIAMbDQAgAaciBi8BBkEpRgRAIAAgASACIAMQ6QgPCyAGKAIQKAIsIAVGDQAgBi0ABUEBcUUEQCADRQ0CIABBohdBABAVQX8PCyAFBEAgBSEEA0AgBCAGRgRAIANFDQQgAEGXO0EAEBVBfw8LIAQoAhAoAiwiBA0ACyACEA4aC0F/IQQgACAGQQAQ4AENACAGKAIQIgQoAiwiAwRAIAAgA61CgICAgHCEEAsLIAQgBTYCLEEBIQQLIAQPC0EADwsgABApQX8LHwAgACgCECABIAIQ5AEiASACRXJFBEAgABDHAQsgAQuTAQECfwJ/IAAoAgggAmoiBCAAKAIMSgRAQX8gACAEQQAQzQINARoLAkAgACgCEARAIAJBACACQQBKGyEEA0AgAyAERg0CIAAoAgQgACgCCCADakEBdGogASADai0AADsBECADQQFqIQMMAAsACyAAKAIEIAAoAghqQRBqIAEgAhAkGgsgACAAKAIIIAJqNgIIQQALCxkAIAAgARDoASIABEAgAEEAIAEQTBoLIAALIgEBfyABIAEoAgAiAkF/ajYCACACQQFMBEAgACABEPsHCwsJACAAQQhqEEcLEQAgACAAKAIAQQFqNgIAIAALxy4BDH8jAEEQayIMJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAEH0AU0EQEH0pwQoAgAiB0EQIABBC2pBeHEgAEELSRsiBUEDdiIAdiIBQQNxBEAgAUF/c0EBcSAAaiICQQN0IgVBpKgEaigCACIBQQhqIQACQCABKAIIIgMgBUGcqARqIgVGBEBB9KcEIAdBfiACd3E2AgAMAQtBhKgEKAIAGiADIAU2AgwgBSADNgIICyABIAJBA3QiAkEDcjYCBCABIAJqIgEgASgCBEEBcjYCBAwNCyAFQfynBCgCACIITQ0BIAEEQAJAQQIgAHQiAkEAIAJrciABIAB0cSIAQQAgAGtxQX9qIgAgAEEMdkEQcSIAdiIBQQV2QQhxIgIgAHIgASACdiIAQQJ2QQRxIgFyIAAgAXYiAEEBdkECcSIBciAAIAF2IgBBAXZBAXEiAXIgACABdmoiAkEDdCIDQaSoBGooAgAiASgCCCIAIANBnKgEaiIDRgRAQfSnBCAHQX4gAndxIgc2AgAMAQtBhKgEKAIAGiAAIAM2AgwgAyAANgIICyABQQhqIQAgASAFQQNyNgIEIAEgBWoiBCACQQN0IgIgBWsiA0EBcjYCBCABIAJqIAM2AgAgCARAIAhBA3YiBUEDdEGcqARqIQFBiKgEKAIAIQICfyAHQQEgBXQiBXFFBEBB9KcEIAUgB3I2AgAgAQwBCyABKAIICyEFIAEgAjYCCCAFIAI2AgwgAiABNgIMIAIgBTYCCAtBiKgEIAQ2AgBB/KcEIAM2AgAMDQtB+KcEKAIAIgpFDQEgCkEAIAprcUF/aiIAIABBDHZBEHEiAHYiAUEFdkEIcSICIAByIAEgAnYiAEECdkEEcSIBciAAIAF2IgBBAXZBAnEiAXIgACABdiIAQQF2QQFxIgFyIAAgAXZqQQJ0QaSqBGooAgAiASgCBEF4cSAFayEEIAEhAgNAAkAgAigCECIARQRAIAIoAhQiAEUNAQsgACgCBEF4cSAFayICIAQgAiAESSICGyEEIAAgASACGyEBIAAhAgwBCwsgASAFaiILIAFNDQIgASgCGCEJIAEgASgCDCIDRwRAQYSoBCgCACABKAIIIgBNBEAgACgCDBoLIAAgAzYCDCADIAA2AggMDAsgAUEUaiICKAIAIgBFBEAgASgCECIARQ0EIAFBEGohAgsDQCACIQYgACIDQRRqIgIoAgAiAA0AIANBEGohAiADKAIQIgANAAsgBkEANgIADAsLQX8hBSAAQb9/Sw0AIABBC2oiAEF4cSEFQfinBCgCACIIRQ0AQR8hBkEAIAVrIQQCQAJAAkACfyAFQf///wdNBEAgAEEIdiIAIABBgP4/akEQdkEIcSIAdCIBIAFBgOAfakEQdkEEcSIBdCICIAJBgIAPakEQdkECcSICdEEPdiAAIAFyIAJyayIAQQF0IAUgAEEVanZBAXFyQRxqIQYLIAZBAnRBpKoEaigCACICRQsEQEEAIQAMAQtBACEAIAVBAEEZIAZBAXZrIAZBH0YbdCEBA0ACQCACKAIEQXhxIAVrIgcgBE8NACACIQMgByIEDQBBACEEIAIhAAwDCyAAIAIoAhQiByAHIAIgAUEddkEEcWooAhAiAkYbIAAgBxshACABQQF0IQEgAg0ACwsgACADckUEQEECIAZ0IgBBACAAa3IgCHEiAEUNAyAAQQAgAGtxQX9qIgAgAEEMdkEQcSIAdiIBQQV2QQhxIgIgAHIgASACdiIAQQJ2QQRxIgFyIAAgAXYiAEEBdkECcSIBciAAIAF2IgBBAXZBAXEiAXIgACABdmpBAnRBpKoEaigCACEACyAARQ0BCwNAIAAoAgRBeHEgBWsiAiAESSEBIAIgBCABGyEEIAAgAyABGyEDIAAoAhAiAQR/IAEFIAAoAhQLIgANAAsLIANFDQAgBEH8pwQoAgAgBWtPDQAgAyAFaiIGIANNDQEgAygCGCEJIAMgAygCDCIBRwRAQYSoBCgCACADKAIIIgBNBEAgACgCDBoLIAAgATYCDCABIAA2AggMCgsgA0EUaiICKAIAIgBFBEAgAygCECIARQ0EIANBEGohAgsDQCACIQcgACIBQRRqIgIoAgAiAA0AIAFBEGohAiABKAIQIgANAAsgB0EANgIADAkLQfynBCgCACIBIAVPBEBBiKgEKAIAIQACQCABIAVrIgJBEE8EQEH8pwQgAjYCAEGIqAQgACAFaiIDNgIAIAMgAkEBcjYCBCAAIAFqIAI2AgAgACAFQQNyNgIEDAELQYioBEEANgIAQfynBEEANgIAIAAgAUEDcjYCBCAAIAFqIgEgASgCBEEBcjYCBAsgAEEIaiEADAsLQYCoBCgCACIBIAVLBEBBgKgEIAEgBWsiATYCAEGMqARBjKgEKAIAIgAgBWoiAjYCACACIAFBAXI2AgQgACAFQQNyNgIEIABBCGohAAwLC0EAIQAgBUEvaiIEAn9BzKsEKAIABEBB1KsEKAIADAELQdirBEJ/NwIAQdCrBEKAoICAgIAENwIAQcyrBCAMQQxqQXBxQdiq1aoFczYCAEHgqwRBADYCAEGwqwRBADYCAEGAIAsiAmoiB0EAIAJrIgZxIgIgBU0NCkGsqwQoAgAiAwRAQaSrBCgCACIIIAJqIgkgCE0gCSADS3INCwtBsKsELQAAQQRxDQUCQAJAQYyoBCgCACIDBEBBtKsEIQADQCAAKAIAIgggA00EQCAIIAAoAgRqIANLDQMLIAAoAggiAA0ACwtBABD9ASIBQX9GDQYgAiEHQdCrBCgCACIAQX9qIgMgAXEEQCACIAFrIAEgA2pBACAAa3FqIQcLIAcgBU0gB0H+////B0tyDQZBrKsEKAIAIgAEQEGkqwQoAgAiAyAHaiIGIANNIAYgAEtyDQcLIAcQ/QEiACABRw0BDAgLIAcgAWsgBnEiB0H+////B0sNBSAHEP0BIgEgACgCACAAKAIEakYNBCABIQALIABBf0YgBUEwaiAHTXJFBEBB1KsEKAIAIgEgBCAHa2pBACABa3EiAUH+////B0sEQCAAIQEMCAsgARD9AUF/RwRAIAEgB2ohByAAIQEMCAtBACAHaxD9ARoMBQsgACIBQX9HDQYMBAsAC0EAIQMMBwtBACEBDAULIAFBf0cNAgtBsKsEQbCrBCgCAEEEcjYCAAsgAkH+////B0sNASACEP0BIgFBABD9ASIATyABQX9GciAAQX9Gcg0BIAAgAWsiByAFQShqTQ0BC0GkqwRBpKsEKAIAIAdqIgA2AgAgAEGoqwQoAgBLBEBBqKsEIAA2AgALAkACQAJAQYyoBCgCACIEBEBBtKsEIQADQCABIAAoAgAiAiAAKAIEIgNqRg0CIAAoAggiAA0ACwwCC0GEqAQoAgAiAEEAIAEgAE8bRQRAQYSoBCABNgIAC0EAIQBBuKsEIAc2AgBBtKsEIAE2AgBBlKgEQX82AgBBmKgEQcyrBCgCADYCAEHAqwRBADYCAANAIABBA3QiAkGkqARqIAJBnKgEaiIDNgIAIAJBqKgEaiADNgIAIABBAWoiAEEgRw0AC0GAqAQgB0FYaiIAQXggAWtBB3FBACABQQhqQQdxGyICayIDNgIAQYyoBCABIAJqIgI2AgAgAiADQQFyNgIEIAAgAWpBKDYCBEGQqARB3KsEKAIANgIADAILIAAtAAxBCHEgASAETXIgAiAES3INACAAIAMgB2o2AgRBjKgEIARBeCAEa0EHcUEAIARBCGpBB3EbIgBqIgE2AgBBgKgEQYCoBCgCACAHaiICIABrIgA2AgAgASAAQQFyNgIEIAIgBGpBKDYCBEGQqARB3KsEKAIANgIADAELIAFBhKgEKAIAIgNJBEBBhKgEIAE2AgAgASEDCyABIAdqIQJBtKsEIQACQAJAAkACQAJAAkADQCACIAAoAgBHBEAgACgCCCIADQEMAgsLIAAtAAxBCHFFDQELQbSrBCEAA0AgACgCACICIARNBEAgAiAAKAIEaiIDIARLDQMLIAAoAgghAAwACwALIAAgATYCACAAIAAoAgQgB2o2AgQgAUF4IAFrQQdxQQAgAUEIakEHcRtqIgkgBUEDcjYCBCACQXggAmtBB3FBACACQQhqQQdxG2oiASAJayAFayEAIAUgCWohBiABIARGBEBBjKgEIAY2AgBBgKgEQYCoBCgCACAAaiIANgIAIAYgAEEBcjYCBAwDCyABQYioBCgCAEYEQEGIqAQgBjYCAEH8pwRB/KcEKAIAIABqIgA2AgAgBiAAQQFyNgIEIAAgBmogADYCAAwDCyABKAIEIgJBA3FBAUYEQCACQXhxIQoCQCACQf8BTQRAIAEoAggiAyACQQN2IgVBA3RBnKgEakcaIAMgASgCDCICRgRAQfSnBEH0pwQoAgBBfiAFd3E2AgAMAgsgAyACNgIMIAIgAzYCCAwBCyABKAIYIQgCQCABIAEoAgwiB0cEQCADIAEoAggiAk0EQCACKAIMGgsgAiAHNgIMIAcgAjYCCAwBCwJAIAFBFGoiBCgCACIFDQAgAUEQaiIEKAIAIgUNAEEAIQcMAQsDQCAEIQIgBSIHQRRqIgQoAgAiBQ0AIAdBEGohBCAHKAIQIgUNAAsgAkEANgIACyAIRQ0AAkAgASABKAIcIgJBAnRBpKoEaiIDKAIARgRAIAMgBzYCACAHDQFB+KcEQfinBCgCAEF+IAJ3cTYCAAwCCyAIQRBBFCAIKAIQIAFGG2ogBzYCACAHRQ0BCyAHIAg2AhggASgCECICBEAgByACNgIQIAIgBzYCGAsgASgCFCICRQ0AIAcgAjYCFCACIAc2AhgLIAEgCmohASAAIApqIQALIAEgASgCBEF+cTYCBCAGIABBAXI2AgQgACAGaiAANgIAIABB/wFNBEAgAEEDdiIBQQN0QZyoBGohAAJ/QfSnBCgCACICQQEgAXQiAXFFBEBB9KcEIAEgAnI2AgAgAAwBCyAAKAIICyEBIAAgBjYCCCABIAY2AgwgBiAANgIMIAYgATYCCAwDC0EfIQQgAEH///8HTQRAIABBCHYiASABQYD+P2pBEHZBCHEiAXQiAiACQYDgH2pBEHZBBHEiAnQiAyADQYCAD2pBEHZBAnEiA3RBD3YgASACciADcmsiAUEBdCAAIAFBFWp2QQFxckEcaiEECyAGIAQ2AhwgBkIANwIQIARBAnRBpKoEaiEBAkBB+KcEKAIAIgJBASAEdCIDcUUEQEH4pwQgAiADcjYCACABIAY2AgAgBiABNgIYDAELIABBAEEZIARBAXZrIARBH0YbdCEEIAEoAgAhAQNAIAEiAigCBEF4cSAARg0DIARBHXYhASAEQQF0IQQgAiABQQRxaiIDKAIQIgENAAsgAyAGNgIQIAYgAjYCGAsgBiAGNgIMIAYgBjYCCAwCC0GAqAQgB0FYaiIAQXggAWtBB3FBACABQQhqQQdxGyICayIGNgIAQYyoBCABIAJqIgI2AgAgAiAGQQFyNgIEIAAgAWpBKDYCBEGQqARB3KsEKAIANgIAIAQgA0EnIANrQQdxQQAgA0FZakEHcRtqQVFqIgAgACAEQRBqSRsiAkEbNgIEIAJBvKsEKQIANwIQIAJBtKsEKQIANwIIQbyrBCACQQhqNgIAQbirBCAHNgIAQbSrBCABNgIAQcCrBEEANgIAIAJBGGohAANAIABBBzYCBCAAQQhqIQEgAEEEaiEAIAMgAUsNAAsgAiAERg0DIAIgAigCBEF+cTYCBCAEIAIgBGsiA0EBcjYCBCACIAM2AgAgA0H/AU0EQCADQQN2IgFBA3RBnKgEaiEAAn9B9KcEKAIAIgJBASABdCIBcUUEQEH0pwQgASACcjYCACAADAELIAAoAggLIQEgACAENgIIIAEgBDYCDCAEIAA2AgwgBCABNgIIDAQLQR8hACAEQgA3AhAgA0H///8HTQRAIANBCHYiACAAQYD+P2pBEHZBCHEiAHQiASABQYDgH2pBEHZBBHEiAXQiAiACQYCAD2pBEHZBAnEiAnRBD3YgACABciACcmsiAEEBdCADIABBFWp2QQFxckEcaiEACyAEIAA2AhwgAEECdEGkqgRqIQECQEH4pwQoAgAiAkEBIAB0IgdxRQRAQfinBCACIAdyNgIAIAEgBDYCACAEIAE2AhgMAQsgA0EAQRkgAEEBdmsgAEEfRht0IQAgASgCACEBA0AgASICKAIEQXhxIANGDQQgAEEddiEBIABBAXQhACACIAFBBHFqIgcoAhAiAQ0ACyAHIAQ2AhAgBCACNgIYCyAEIAQ2AgwgBCAENgIIDAMLIAIoAggiACAGNgIMIAIgBjYCCCAGQQA2AhggBiACNgIMIAYgADYCCAsgCUEIaiEADAULIAIoAggiACAENgIMIAIgBDYCCCAEQQA2AhggBCACNgIMIAQgADYCCAtBgKgEKAIAIgAgBU0NAEGAqAQgACAFayIBNgIAQYyoBEGMqAQoAgAiACAFaiICNgIAIAIgAUEBcjYCBCAAIAVBA3I2AgQgAEEIaiEADAMLQZSnBEEwNgIAQQAhAAwCCwJAIAlFDQACQCADKAIcIgBBAnRBpKoEaiICKAIAIANGBEAgAiABNgIAIAENAUH4pwQgCEF+IAB3cSIINgIADAILIAlBEEEUIAkoAhAgA0YbaiABNgIAIAFFDQELIAEgCTYCGCADKAIQIgAEQCABIAA2AhAgACABNgIYCyADKAIUIgBFDQAgASAANgIUIAAgATYCGAsCQCAEQQ9NBEAgAyAEIAVqIgBBA3I2AgQgACADaiIAIAAoAgRBAXI2AgQMAQsgAyAFQQNyNgIEIAYgBEEBcjYCBCAEIAZqIAQ2AgAgBEH/AU0EQCAEQQN2IgFBA3RBnKgEaiEAAn9B9KcEKAIAIgJBASABdCIBcUUEQEH0pwQgASACcjYCACAADAELIAAoAggLIQEgACAGNgIIIAEgBjYCDCAGIAA2AgwgBiABNgIIDAELQR8hACAEQf///wdNBEAgBEEIdiIAIABBgP4/akEQdkEIcSIAdCIBIAFBgOAfakEQdkEEcSIBdCICIAJBgIAPakEQdkECcSICdEEPdiAAIAFyIAJyayIAQQF0IAQgAEEVanZBAXFyQRxqIQALIAYgADYCHCAGQgA3AhAgAEECdEGkqgRqIQECQAJAIAhBASAAdCICcUUEQEH4pwQgAiAIcjYCACABIAY2AgAMAQsgBEEAQRkgAEEBdmsgAEEfRht0IQAgASgCACEFA0AgBSIBKAIEQXhxIARGDQIgAEEddiECIABBAXQhACABIAJBBHFqIgIoAhAiBQ0ACyACIAY2AhALIAYgATYCGCAGIAY2AgwgBiAGNgIIDAELIAEoAggiACAGNgIMIAEgBjYCCCAGQQA2AhggBiABNgIMIAYgADYCCAsgA0EIaiEADAELAkAgCUUNAAJAIAEoAhwiAEECdEGkqgRqIgIoAgAgAUYEQCACIAM2AgAgAw0BQfinBCAKQX4gAHdxNgIADAILIAlBEEEUIAkoAhAgAUYbaiADNgIAIANFDQELIAMgCTYCGCABKAIQIgAEQCADIAA2AhAgACADNgIYCyABKAIUIgBFDQAgAyAANgIUIAAgAzYCGAsCQCAEQQ9NBEAgASAEIAVqIgBBA3I2AgQgACABaiIAIAAoAgRBAXI2AgQMAQsgASAFQQNyNgIEIAsgBEEBcjYCBCAEIAtqIAQ2AgAgCARAIAhBA3YiA0EDdEGcqARqIQBBiKgEKAIAIQICf0EBIAN0IgMgB3FFBEBB9KcEIAMgB3I2AgAgAAwBCyAAKAIICyEDIAAgAjYCCCADIAI2AgwgAiAANgIMIAIgAzYCCAtBiKgEIAs2AgBB/KcEIAQ2AgALIAFBCGohAAsgDEEQaiQAIAALQAAgAEIANwMAIAAgAQR+IAGtIAFnIgFBIHJB8QBqQT9xrYZCgICAgICAwACFQZ6AASABa61CMIZ8BUIACzcDCAuDAQIDfwF+AkAgAEKAgICAEFQEQCAAIQUMAQsDQCABQX9qIgEgACAAQgqAIgVCCn59p0EwcjoAACAAQv////+fAVYhAiAFIQAgAg0ACwsgBaciAgRAA0AgAUF/aiIBIAIgAkEKbiIDQQpsa0EwcjoAACACQQlLIQQgAyECIAQNAAsLIAEL7wUDAX8BfgR8AkACQAJAAnwCQCAAvSICQiCIp0H/////B3EiAUH60I2CBE8EQCAAvUL///////////8Ag0KAgICAgICA+P8AVg0FIAJCAFMEQEQAAAAAAADwvw8LIABE7zn6/kIuhkBkQQFzDQEgAEQAAAAAAADgf6IPCyABQcPc2P4DSQ0CIAFBscXC/wNLDQAgAkIAWQRAQQEhAUR2PHk17znqPSEDIABEAADg/kIu5r+gDAILQX8hAUR2PHk17znqvSEDIABEAADg/kIu5j+gDAELAn8gAET+gitlRxX3P6JEAAAAAAAA4D8gAKagIgOZRAAAAAAAAOBBYwRAIAOqDAELQYCAgIB4CyIBtyIERHY8eTXvOeo9oiEDIAAgBEQAAOD+Qi7mv6KgCyIAIAAgA6EiAKEgA6EhAwwBCyABQYCAwOQDSQ0BQQAhAQsgACAARAAAAAAAAOA/oiIFoiIEIAQgBCAEIAQgBEQtwwlut/2KvqJEOVLmhsrP0D6gokS326qeGc4Uv6CiRIVV/hmgAVo/oKJE9BARERERob+gokQAAAAAAADwP6AiBkQAAAAAAAAIQCAFIAaioSIFoUQAAAAAAAAYQCAAIAWioaOiIQUgAUUEQCAAIAAgBaIgBKGhDwsgACAFIAOhoiADoSAEoSEDAkACQAJAIAFBAWoOAwACAQILIAAgA6FEAAAAAAAA4D+iRAAAAAAAAOC/oA8LIABEAAAAAAAA0L9jQQFzRQRAIAMgAEQAAAAAAADgP6ChRAAAAAAAAADAog8LIAAgA6EiACAAoEQAAAAAAADwP6APCyABQf8Haq1CNIa/IQQgAUE5TwRAIAAgA6FEAAAAAAAA8D+gIgAgAKBEAAAAAAAA4H+iIAAgBKIgAUGACEYbRAAAAAAAAPC/oA8LRAAAAAAAAPA/Qf8HIAFrrUI0hr8iBaEgACADIAWgoSABQRRIIgEbIAAgA6FEAAAAAAAA8D8gARugIASiIQALIAAL3QQBBn8gACgCACIEQQFqIQJBCCEDAkACQAJAIAQtAAAiBkFQaiIHQQhPBEBBfiEFAkACQAJAAkACQAJAIAZBkn9qDgsBCQkJAgkDBQQJBQALAkAgBkGef2oOBQgJCQkACQtBDCEDDAcLQQohAwwGC0ENIQMMBQtBCSEDDAQLQQshAwwDCwJAIAFFDQAgAi0AAEH7AEcNACAEQQJqIQIgBC0AAiEEQQAhAwNAIAIhAUF/IQUgBBDeAiICQQBIDQUgAiADQQR0ciIDQf//wwBLDQUgAUEBaiICLQAAIgRB/QBHDQALIAFBAmohAgwDCyAEQQJBBCAGQfgARhsiB0EBcmohBEEAIQNBACEFA0AgBSAHRwRAIAItAAAQ3gIiBkEASARAQX8PBSAFQQFqIQUgAkEBaiECIAYgA0EEdHIhAwwCCwALCyABQQJHIANBgHhxQYCwA0dyDQEgBC0AAEHcAEcNASAELQABQfUARw0BQQAhAkEAIQUDQAJAIAJBBEYNACACIARqLQACEN4CIgFBAEgNACACQQFqIQIgASAFQQR0ciEFDAELCyACQQRHIAVBgHhxQYC4A0dyDQEgBUH/B3EgA0EKdEGA+D9xckGAgARqIQMgBEEGaiECDAILIAFBAkYEQEF/IQUgBw0DIAItAAAQRg0DQQAhAwwCCyACLQAAQVBqIgFBB0sEQCAHIQMMAgsgBEECaiECIAEgB0EDdHIiA0EfSw0BIAQtAAJBUGoiAUEHSw0BIARBA2ohAiABIANBA3RyIQMMAQsgBCECCyAAIAI2AgAgAyEFCyAFC4sBAQN/IwBBkAFrIgMkACADIAI2AowBAn8gA0GAASABIAIQ0gIiBEH/AE0EQCAAIAMgBBCUAQwBC0F/IAAgBCAAKAIEakEBahDnAQ0AGiADIAI2AowBIAAoAgQiBSAAKAIAaiAAKAIIIAVrIAEgAhDSAhogACAAKAIEIARqNgIEQQALGiADQZABaiQACyIAIAAgAUE7IAIQDiICIAMQGhogACACQTwgARAOIAQQGhoLTwEBfyABEIwBBEAgARAODwsCQCABQoCAgIBwVA0AIAGnIgIvAQZBBEcNACACKQMgIgEQjAFFDQAgARAODwsgAEHZtAFBABAVQoCAgIDgAAuQAgECfyMAQRBrIgMkACADIAI3AwhCgICAgOAAIQICQCAAIAEQwAEiBEEASA0AIARFBEAgAEKAgICAMEEBIANBCGoQtQMhAgwBCyAAIAFBPCABQQAQEyIBEAwEQCABIQIMAQsCQAJAIAEQsgFFDQAgACABEIUDIgRFDQEgACAERg0AIAAgASAEKQNAEFlFDQAgACABEAtCgICAgDAhAQsCfiABECEEQCAAIAFBzAEgAUEAEBMhAiAAIAEQCyACEAwNA0KAgICAMCACIAIQJxshAQsgAQsQEQRAIABCgICAgDBBASADQQhqELUDIQIMAgsgACABQQEgA0EIahCvASECCyAAIAEQCwsgA0EQaiQAIAILGgAgAEHeAEHYACABGxAPIAAgAkH//wNxEDEL7QEBA38DQAJAIAMgAk4NACABIANqIgUtAAAiBkECdCEHAkACQCAGQbQBRwRAIAZBwAFHDQEgBCAFKAABNgIADAILIAAgBSgAASIFQQAQcEEASg0CIAAoAqQCIAVBFGxqKAIQRQ0BQfCYAUGhDUGI8AFBmpkBEAAACyAHQZMxai0AACIGQRxLDQBBASAGdCIGQYCAgBxxRQRAIAZBgICA4ABxRQRAIAZBgICAggFxRQ0CIAAgBSgAAUF/EHAaDAILIAAgBSgABUF/EHAaCyAAKAIAIAUoAAEQEgsgAyAHQZAxai0AAGohAwwBCwsgAwuzAwEFfyABRQRAIAAgAkEEcUEIchDrAQ8LQX8hAwJAAkAgACABQX9qIgQgAhCqAg0AIAJBe3EhBSACQQFxIQYgAUF/aiEHA0AgACgCECEBAkACQAJAAkACQAJAAkACQAJAAkACQCAHDggAAQIDBAUGBwgLIAFBJUcEQEGaASECIAFBKkYNCiABQS9HDQ1BmwEhAgwKC0GcASECDAkLQZ0BIQJBACEDAkAgAUFVag4DCQsACwtBngEhAgwICyABQeoAaiIBQQNPDQogAUGgf2ohAgwHC0EAIQMCQAJAAkACQCABQeYAag4DAQwCAAsCQCABQckAag4CCQMAC0GjASECAkAgAUFEag4DCgwADAtBpQEhAgwJC0GkASECDAgLQaYBIQIMBwtBpwEhAgwGCyABQeMAaiIBQQRPDQhBqdeq5XogAUEDdHYhAgwFC0GtASECIAFBJkcNBwwEC0GuASECIAFB3gBHDQYMAwtBrwEhAiABQfwARw0FDAILEAEAC0GoASECIAZFDQILQX8hAyAAEBANASAAIAQgBRCqAg0BIAAgAkH/AXEQDQwACwALIAMPC0EACwkAIABBAhDCAwtSAQV/IAAoAvQBIgJBACACQQBKGyEFQQAhAgJAA0AgAiIDIAVGDQEgA0EBaiECIAAoAvwBIgYgA0EEdGooAgwgAUcNAAsgBiADQQR0aiEECyAECzYAA0AgASACTEUEQCAAQbMBEA0gACABQf//A3EQFyAAKAJAKALMASABQQN0aigCACEBDAELCwvVAQECfyAAIAAoAkAiBCABAn8CQAJAAkACQAJAAkAgAUEnRg0AIAFBzQBGIAFBOkZyRQRAIAFBxQBGDQEgAUEtRw0DQa+LASEDIAQtAGxBAUYNAgwDC0HOiwEhAyAELQBuQQFxDQEgAUHFAEcNAgsgAkGxf0YNAyACQUNGDQRB84sBIQMgAkFJRg0AIAJBUUcNAgsgACADQQAQFEF/DwsgAkGxf0YNASACQUNGDQJBASACQVFGDQMaIAJBSUcNAEECDAMLEAEAC0EGDAELQQULEKkBQR91CwkAIABBABDuAQs7AQF/IAEoAgAhAgNAAkAgAiAAKAIEQf////8HcU4NACAAIAIQMEEgRw0AIAEgAkEBaiICNgIADAELCwuFAQIFfwF+QX8hBAJAIAEoAgAiBSAAKAIEQf////8HcSIGTg0AIAUhAwNAAkACQCADIAZGBEAgBiEDDAELIAAgAxAwIgdBUGpBCkkNASADIAVGDQMLIAIgCDcDACABIAM2AgBBACEEDAILIANBAWohAyAHrSAIQgp+fEJQfCEIDAALAAsgBAtBAQF/AkAgAkKAgICAcFQNACACpyIDLwEGQQpHDQAgAykDICICEIwBRQ0AIAAgASACEEgPCyAAQaD1AEEAEBVBfwsbAQF+IAAgASACIAMgBBC+AiEFIAAgARALIAUL5QMCB38BfiMAQTBrIgUkACABQSoQQSEGIAVCADcCKAJAA0AgB0ECRwRAAkAgAEEgEGsiCARAIAhBCGohCUEAIQQDQCAEQQJGDQIgCSAEQQN0IgpqIAMgCmopAwAQDjcDACAEQQFqIQQMAAsAC0F/IQQgB0EBRw0DIAAoAhAgBSgCKBC1AgwDCyAIIAIgB0EDdGopAwAiC0KAgICAMCAAIAsQOxsQDjcDGCAFQShqIAdBAnRqIAg2AgAgB0EBaiEHDAELCwJAIAYoAgAiBEUEQCAGQQRqIQBBACEEA0AgBEECRg0CIAVBKGogBEECdGooAgAgACAEQQN0ahBNIARBAWohBAwACwALAkAgBEECRw0AQQIhBCAGKAIUDQAgACgCECICKAKYASIDRQ0AIAAgASAGKQMYQQEgAigCnAEgAxEyACAGKAIAIQQLIAUgBUEoaiAEQX9qIgNBAnRqKAIAIgIpAwg3AwAgBSACKQMQNwMIIAUgAikDGDcDEEEAIQQgBSADQQBHrUKAgICAEIQ3AxggBSAGKQMYNwMgIABBLUEFIAUQ/gIDQCAEQQJGDQEgACgCECAFQShqIARBAnRqKAIAELUCIARBAWohBAwACwALIAZBATYCFEEAIQQLIAVBMGokACAECyMAIAAgASkDCBAmIAAgASkDEBAmIAAgASkDGBAmIAAgARAgC4YBAQF/IwBBEGsiBSQAIAUgADkDCCAFIAFBf2oiBzYCACAGQYABQfHDACAFEFUaIAMgBi0AAEEtRjYCACAEIAYtAAE6AAAgAUECTgRAIARBAWogBkEDaiAHECQaCyABIARqQQA6AAAgAiABIAZqIAFBAUpqQQJqEJIJQQFqNgIAIAVBEGokAAsKACAAIAFBAnRqCw4AIAAgAWpBgYDc8XlsCxAAIAAoAhhBf3NBAnQgAGoL6AECBX8CfiMAQRBrIgMkACADIAAQowgiCDcDCCAIEAxFBEACfgJ+IAIQEQRAIAAgAkEBIANBCGoQzwUMAQsgACACQQEgA0EIahCvAQsiAhAMRQRAIAMpAwhBDxBBQQhqIQYDQCAEQQJGBEADQCAFQQJGRQRAIAEgBUEDdCIEaiAEIAZqKQMAEA43AwAgBUEBaiEFDAELCyADKQMIIQkgAgwDCyAEQQN0IQcgBEEBaiEEIAAgBiAHaikDABBoRQ0ACwsgACADKQMIEAsgAiEJQoCAgIDgAAshCCAAIAkQCwsgA0EQaiQAIAgLIQAgACABrSABKQMAQoCAgIAwIAEoAgggASgCIEEEEN8BC7oKAwl/AX4BfCMAQdAAayIHJAAgByABNgJMQd8AQYACIARBIHEbIQkCQAJAAkACQAJAAkACQAJAAkAgAS0AACIIQVVqDgMBAwADC0EBIQwgByABQQFqIgE2AkwMAQsgByABQQFqIgE2AkwLIARBgAhxRQ0BIAEtAAAhCAsgCEH/AXFBMEcNAAJ/AkACQCABLQABIgVBwgBGDQAgBUEYdEEYdSEGAkAgBUHPAEYNACAFQfgARwRAIAVB4gBGDQIgBUHvAEYNASAFQdgARw0DCyADQW9xRQRAIAcgAUECaiIFNgJMQRAMBAsgBUHiAEYNASAFQe8ARw0FCyADIARBBHFFckUEQCAHIAFBAmoiBTYCTEEIDAMLIAZB4gBHDQQLIAMgBEEEcUVyDQMgByABQQJqIgU2AkxBAgwBCyAGQTBIIANyIAZBOUpyDQIgBEEQcUUNAyABQQFqIQVBASEIA0AgBkH4AXFBMEdFBEAgASAIQQFqIghqLQAAIQYMAQsLQYACIQkgBkH+AXFBOEYNAyAHIAU2AkxBCAshA0KAgICAwH4hDiAFLQAAEPEBIANIDQMMBAsgBEGBAXENACABIAdBzABqEN4JRQ0ARAAAAAAAAPD/RAAAAAAAAPB/IAwbIg+9An8gD5lEAAAAAAAA4EFjBEAgD6oMAQtBgICAgHgLIgG3vVEEQCABrSEODAQLIA8QFiEODAMLIAMNAQtBCiEDCyAHKAJMIgpBAWohCEEAIQEgA0EKRyENAkADQAJAIAEgCmoiBS0AACIGQRh0QRh1IQsgBhDxASADTgRAIAkgC0cNASANIAFBAUdyRQRAIAotAABBMEYNBAsgBS0AARDxASADTg0BCyAHIAogAUEBaiIBajYCTAwBCwsgBSEIC0EAIQsCQCAEQQFxDQACQCAGQS5HDQAgCCAKTQRAQS4hBiAILQABEPEBIANODQELIAcgCEEBaiIFNgJMQoCAgIDAfiEOIAkgCCwAASIGRg0CA0AgBkH/AXEQ8QEgA04EQEEBIQsgCSAGQRh0QRh1Rw0CIAUtAAEQ8QEgA04NAgsgByAFQQFqIgE2AkwgBS0AASEGIAEhBQwACwALIAUgCk0NAAJAAkAgBkH/AXEiAUHFAEcEQCABQdAARiABQfAARnINASABQeUARw0DCyADQQpGDQEgBkH/AXFB0ABHDQILQQEgA3RBhIIEcUUgA0EQS3INAQtBASELIAVBAWohAQJAAkACQCAFLQABQVVqDgMAAgECCyAFQQJqIQEMAQsgBUECaiEBCyABLQAAEEZFDQAgASEFA0AgByAFIgFBAWoiBTYCTCABLQABIghBGHRBGHUhBCAIEEYNACAEIAlHDQEgAS0AAhBGDQALCyAFIApGBEBCgICAgMB+IQ4MAQsgByEJAkAgBSAKayIEQQJqIghBwQBPBEAgACgCECAIEOgBIglFDQELQQAhAUEAIQYgDARAIAlBLToAAEEBIQYLIARBACAEQQBKGyEFA0AgASAFRkUEQCABIApqLQAAIgRB3wBHBEAgBiAJaiAEOgAAIAZBAWohBgsgAUEBaiEBDAELCyAGIAlqQQA6AAACfiADQQpHBEBCgICAgMB+IAsNARoLIAkgAyALEOoHIg+9An8gD5lEAAAAAAAA4EFjBEAgD6oMAQtBgICAgHgLIgG3vVEEQCABrQwBCyAPEBYLIQ4gCEHBAEkNASAAKAIQIAkQIAwBCyAAEMcBQoCAgIDgACEOCyACBEAgAiAHKAJMNgIACyAHQdAAaiQAIA4LKwAgAEH/AE0EQCAAQQN2Qfz///8BcUHQ3wFqKAIAIAB2QQFxDwsgABD0BQsmAQF+IAAgASACIAFBABATIgUQDAR+IAUFIAAgBSABIAMgBBA2CwuABAIDfwF+IwBB4ABrIgUkACAAIAVByABqEI8CAkAgAgRAIAUgAjYCQCAFQcgAakHbzAAgBUFAaxCkAiADQX9HBEAgBSADNgIwIAVByABqQeXMACAFQTBqEKQCCyAFQcgAakEKEA8gACABQTEgACACEHJBAxAaGiAAIAFBMiADrUEDEBoaIARBAnENAQsgACgCEEGMAWohAgNAIAIoAgAiAkUNAUEAIQMgBEEBcUUEQCAFAn9B6cwAIAAgAikDCBCwCCIDRQ0AGiADQenMACADLQAAGws2AiAgBUHIAGpB28wAIAVBIGoQpAIgACADEDcCQCACKAIIIgMvAQYQ9QEEQCADKAIgIgMvABEiBkELdkEBcSEHIAZBgAhxRQ0BIAMgAigCICADKAIUQX9zahCvCCEGIAUgACADKAJAEJQEIgNB/zogAxs2AhAgBUHIAGpB9cwAIAVBEGoQpAIgACADEDcgBkF/RwRAIAUgBjYCACAFQcgAakHlzAAgBRCkAgsgBUHIAGpBKRAPDAELQQAhByAFQcgAakH6zABBABCkAgsgBUHIAGpBChAPIAQhAyAHDQILIAMhBAwACwALIAVByABqQQAQD0KAgICAICEIIAUoAlRFBEAgACAFKAJIEHIhCAsgBUHIAGoQowEgACABQTUgCEEDEBoaIAVB4ABqJAAL7AECAn8BfiMAQRBrIgMkACABQXhqIgQpAwAhBQJ/AkAgACADQQxqIAFBcGoiASkDABDEAQRAIAAgBRALDAELIAAgA0EIaiAFEMQBDQAgAQJ/AkACQAJAAkACQAJAIAJB035qDgMBAwIACwJAIAJB4H5qDgIFAAQLIAMoAgwgAygCCHUMBQsgAygCCCADKAIMcQwECyADKAIIIAMoAgxyDAMLIAMoAgggAygCDHMMAgsQAQALIAMoAgwgAygCCHQLrTcDAEEADAELIAFCgICAgDA3AwAgBEKAgICAMDcDAEF/CyEAIANBEGokACAAC/gCAgZ/An4CQCABQoCAgIBwg0KAgICAkH9SBEBCgICAgOAAIQkgACABED4iARAMDQELAkAgAkKAgICAcINCgICAgJB/UQ0AQoCAgIDgACEJIAAgAhA+IgIQDEUNACABIQIMAQsCQCACpyIEKQIEIglC/////weDUA0AAkAgAaciAygCAEEBRw0AIAMpAgQgCYWnQQBIDQAgACgCECADEJcEIAQoAgQiBUH/////B3EiCCADKQIEIgmnIgZB/////wdxIgdqIAVBH3Z0IAZBH3YiBmtBEWpJDQAgBgRAIAMgB0EBdGpBEGogBEEQaiAFQQF0ECQaIAMgBCkCBCAJfEL/////B4MgCUKAgICAeIOENwIEDAILIANBEGoiBSAHaiAEQRBqIAgQJBogAyAEKQIEIAl8Qv////8HgyIKIAlCgICAgHiDhDcCBCAFIAqnakEAOgAADAELIAAgAyAEEOIHIQkgACABEAsMAQsgASEJCyAAIAIQCyAJC0AAIAACfwJ/IAMEQCABKAIkIAJBA3RqQQRqDAELQQAgASgCICIDRQ0BGiADIAEvASggAmpBBHRqCygCAAsQ3gELCwAgAEHjO0EAEBULLwIBfwF+IwBBgAFrIgUkACAFIAEgAiADIAQQ1QggACAFEHIhBiAFQYABaiQAIAYLNwEBfyAAIAIQOiEFIAAgAhALIAVFBEAgACADEAtBfw8LIAAgASAFIAMgBBAaIQQgACAFEBIgBAuTAgICfwF8IwBBEGsiBCQAAkACQAJAAkAgAkIgiKciBUECTQRAIAKnIgNBAE4NAwwBCyAFQQtqQRJPBEAgBAJ/IAIQSiIGRAAAAAAAAPBBYyAGRAAAAAAAAAAAZnEEQCAGqwwBC0EACyIDNgIMIAYgA7hhDQMMAQsgAwRAQX8hAyAAIAIQnQEiAhAMDQQgACAEQQxqIAJBARDGAg0EIAQoAgwhAwwDCyAAIARBDGogAhDFAQRAIAAgAhALDAILQX8hAyAAIAIQnQEiAhAMDQMgACAEQQhqIAJBABDGAg0DIAQoAggiAyAEKAIMRg0CCyAAQb3DABBqC0F/IQMMAQsgASADNgIAQQAhAwsgBEEQaiQAIAMLHwAgACABIAAgAhDIASICIAFBABATIQEgACACEBIgAQsxAQF/IwBB0ABrIgIkACACIAAgAkEQaiABEJUBNgIAIABBrj4gAhDKAiACQdAAaiQAC5IBAgF/AX4jAEEQayIFJAAgBSAENgIMIAAgASAFQQxqEOABRQRAIAMQjQQgASACIAMoAgQgAygCAEEDcUECdEHUPGooAgARHQAhBiADELwFIAUoAgwiACAAKAIAQf////8DcTYCACADQoCAgIAwIAYgBhAMIgAbNwMAIAVBEGokAEF/QQAgABsPCyAFQRBqJABBfwsmAQF/IwBBEGsiAyQAIAMgAjYCDCAAQQIgASACEPsBIANBEGokAAsmAQF/IwBBEGsiAyQAIAMgAjYCDCAAQQMgASACEPsBIANBEGokAAsKACAAQSAgAWt2C9IBAQN/IwBBEGsiBSQAQX8hAwJAIAAoAhQNAAJAAkAgAUGAgICABE4EQCAAKAIAQfQNQQAQQgwBCyABIAAoAgxBA2xBAm0QS0H/////AxCxASEBIAAoAhAiBCACQYACSHJFBEAgACABEN4DIQMMAwsgACgCACAAKAIEIAEgBHQgBGtBEWogBUEMahC0ASICDQELIAAQ/wIMAQsgACgCECEDIAUoAgwhBCAAIAI2AgQgACAEIAN2IAFqQf////8DELEBNgIMQQAhAwsgBUEQaiQAIAMLgAECAn8BfgJAIAEpAgQiBEL//////////79/VgRAIAEoAgwhAAwBCyAAKAI0IARCIIinIAAoAiRBf2pxQQJ0aiECIAAoAjghAwNAIAMgAigCACIAQQJ0aigCACICIAFGDQEgAkEMaiECIAANAAtBmTBBoQ1B+BRBiMAAEAAACyAAC/EGAgZ/AX4CQAJAAkACfyACQQJMBEAgAiABKQIEIglCPoinRgRAIAAgARDOAiIDEPABRQ0FIAEgASgCAEF/ajYCACADDwsgACgCNCAAKAIkQX9qIAEgAhDKBUH/////A3EiB3EiCEECdGohAyAJp0H/////B3EhBQNAIAIgAygCACIDRQ0CGgJAIAAoAjggA0ECdGooAgAiBCkCBCIJQiCIp0H/////A3EgB0cgCUI+iKcgAkdyIAmnQf////8HcSAFR3INACAEIAEgBRDJBQ0AIAMQ8AENBCAEIAQoAgBBAWo2AgAMBAsgBEEMaiEDDAALAAsgAkEDRyEHQQMLIQUCQCAAKAI8DQBBACEDQdMBIAAoAixBA2xBAm0QSyIEQf////8DSw0BIAAgACgCOCAEQQJ0EOQBIgZFDQEgACgCLCICRQRAIABBEBCbAiICRQRAIAAgBhAgDAMLIAJBATYCACACIAIpAgRCgICAgICAgIBAhDcCBCAGIAI2AgAgACAAKAIoQQFqNgIoQQEhAgsgACACNgI8IAAgBjYCOCAAIAQ2AiwgBEF/aiEGA0AgAiAETw0BIAAoAjggAkECdGpBACACQQFqIgMgAiAGRhsQyAU2AgAgAyECDAALAAsCQCABBEAgASkCBCIJQv//////////P1gEQCABIAkgBa1CPoaENwIEDAILIAAgCaciAkH/////B3EgAkEfdiICdCACa0ERahDoASICRQRAQQAhAwwECyACQQE2AgAgAiACKQIEQv////93gyABKQIEQoCAgIAIg4QiCTcCBCACIAlCgICAgHiDIAEpAgRC/////weDhDcCBCACQRBqIAFBEGogASgCBCIDQR92IgRBAXMgA0H/////B3EgBHRqECQaIAAgARCVBCACIQEMAQsgAEEQEOgBIgFFBEBBAA8LIAFCgYCAgICAgICAfzcCAAsgACAAKAI4IAAoAjwiA0ECdGoiAigCAEEBdjYCPCACIAE2AgAgASADNgIMIAEgATUCBCAHrUIghoQgBa1CPoaENwIEIAAgACgCKEEBajYCKCAFQQNGDQIgASAAKAI0IAhBAnRqIgEoAgA2AgwgASADNgIAIAAoAiggACgCMEgNAiAAIAAoAiRBAXQQrwUaDAILIAFFDQELIAAgARCVBCADDwsgAwtGACACQQBMBEAgAEEvEDIPCyAAIAJBABD6ASIARQRAQoCAgIDgAA8LIABBEGogASACECQgAmpBADoAACAArUKAgICAkH+EC1ABAX4CQCADQcAAcQRAIAIgA0FAaq2IIQFCACECDAELIANFDQAgAkHAACADa62GIAEgA60iBIiEIQEgAiAEiCECCyAAIAE3AwAgACACNwMIC8ABAQJ/IwBBoAFrIgQkACAEQQhqQdCdBEGQARAkGgJAAkAgAUF/akH/////B08EQCABDQFBASEBIARBnwFqIQALIAQgADYCNCAEIAA2AhwgBEF+IABrIgUgASABIAVLGyIBNgI4IAQgACABaiIANgIkIAQgADYCGCAEQQhqIAIgA0HuAkHvAhCeBCEAIAFFDQEgBCgCHCIBIAEgBCgCGEZrQQA6AAAMAQtBlKcEQT02AgBBfyEACyAEQaABaiQAIAALnQMDA38BfgJ8AkACQAJAAkAgAL0iBEIAWQRAIARCIIinIgFB//8/Sw0BCyAEQv///////////wCDUARARAAAAAAAAPC/IAAgAKKjDwsgBEJ/VQ0BIAAgAKFEAAAAAAAAAACjDwsgAUH//7//B0sNAkGAgMD/AyECQYF4IQMgAUGAgMD/A0cEQCABIQIMAgsgBKcNAUQAAAAAAAAAAA8LIABEAAAAAAAAUEOivSIEQiCIpyECQct3IQMLIAMgAkHiviVqIgFBFHZqtyIFRAAA4P5CLuY/oiAEQv////8PgyABQf//P3FBnsGa/wNqrUIghoS/RAAAAAAAAPC/oCIAIAVEdjx5Ne856j2iIAAgAEQAAAAAAAAAQKCjIgUgACAARAAAAAAAAOA/oqIiBiAFIAWiIgUgBaIiACAAIABEn8Z40Amawz+iRK94jh3Fccw/oKJEBPqXmZmZ2T+goiAFIAAgACAARERSPt8S8cI/okTeA8uWZEbHP6CiRFmTIpQkSdI/oKJEk1VVVVVV5T+goqCgoqAgBqGgoCEACyAAC5IBAQN8RAAAAAAAAPA/IAAgAKIiAkQAAAAAAADgP6IiA6EiBEQAAAAAAADwPyAEoSADoSACIAIgAiACRJAVyxmgAfo+okR3UcEWbMFWv6CiRExVVVVVVaU/oKIgAiACoiIDIAOiIAIgAkTUOIi+6fqovaJExLG0vZ7uIT6gokStUpyAT36SvqCioKIgACABoqGgoAuZAQEDfCAAIACiIgMgAyADoqIgA0R81c9aOtnlPaJE65wriublWr6goiADIANEff6xV+Mdxz6iRNVhwRmgASq/oKJEpvgQERERgT+goCEFIAMgAKIhBCACRQRAIAQgAyAFokRJVVVVVVXFv6CiIACgDwsgACADIAFEAAAAAAAA4D+iIAQgBaKhoiABoSAERElVVVVVVcU/oqChC40BACAARAn3/Q3hPQI/okSIsgF14O9JP6AgAKJEO49otSiCpL+gIACiRFVEiA5Vwck/oCAAokR9b+sDEtbUv6AgAKJEVVVVVVVVxT+gIACiIABEgpIuscW4sz+iRFkBjRtsBua/oCAAokTIilmc5SoAQKAgAKJESy2KHCc6A8CgIACiRAAAAAAAAPA/oKMLpQIBB38jAEEQayIFJAACQCAFQQxqIABB4K8DQRsQ9wUiA0EASA0AIANBwLADaiEBA0AgAUEBaiEDIAEtAAAiAkEYdEEYdSEHAkAgAkE/cSIEQTBJBEAgAyEBDAELIARBCHQhAgJ/IARBN00EQCACQYCgf2ohBEEwIQJBAgwBCyACQYCQf2ogAS0AAUEIdHIhBCABQQJqIQNBsBAhAkEDCyABaiEBIAQgAy0AAHIgAmohBAsgAUEBaiABIAdBf0obIQECQCAEIAUoAgwiAmpBAWoiAyAASwRAAkACQCAHQcABcUEGdg4DAwAFAQsgAUF/ai0AACAAIAJraiEGDAQLQeYBIQYMAwsgBSADNgIMDAELCyABQX9qLQAAIQYLIAVBEGokACAGC1kBA39BfyEBIAAgACgCACICQQJqIgMQrAMEf0F/BSAAKAIIIgFBBGogASACQQJ0IgIQ4wEgACgCCCIBQQA2AgAgASACakF/NgIEIAAgAzYCACAAEPUFQQALC/IBAQR/AkADQAJAAkACQAJ/IAcgAk4iCCAGIAROckUEQCABIAdBAnRqKAIAIgkgAyAGQQJ0aigCACIISQRAIAkMAgsgCCAJRw0DIAZBAWohBiAHQQFqIQcgCSEIDAQLIAgNASABIAdBAnRqKAIACyEIIAdBAWohBwwCCyAGIARODQMgAyAGQQJ0aigCACEICyAGQQFqIQYLAn8CQAJAAkACQCAFDgMDAAECCyAGIAdxQQFxDAMLIAYgB3NBAXEMAgsQAQALIAYgB3JBAXELIQkgCSAAKAIAQQFxRg0AIAAgCBD5BUUNAAtBfw8LIAAQ9QVBAAtqAgJ/AX4gACgCACECA0AgAi0AACIDQVBqQf8BcUEJTQRAIARCCn4gA61C/wGDfEJQfCIEQv////8HVCIDIAFyBEAgBEL/////ByADGyEEIAJBAWohAgwCBUF/DwsACwsgACACNgIAIASnCwwAIABB/eUBQQAQPwsWACAAIAFB/wFxEA8gACACQf8BcRAPC5UFAQ9/IwBB4ARrIgokACAAIAIQrgQhCyAAIAJBgAFyEK4EIRICQCACRSABQQJJcg0AIAogATYCBCAKIAA2AgAgCkEANgIIQQAgAmshECAKQQxyIQgDQCAIIApNDQEgCEF0aiIIKAIIIgxBMiAMQTJKGyETIAgoAgQhBiAIKAIAIQUDQAJAIAUgBkEHTwR/IAwgE0cNASAFIAYgAiADIAQQ3QlBAAUgBgsgAmxqIQkgBSEHA0AgAiAHaiIHIQAgByAJTw0DA0AgACAFTQ0BIAAgEGoiASAAIAQgAxEAAEEBSA0BIAAgASACIAsRBQAgASEADAALAAsACyAMQQFqIQxBASEHIAUgBSAGQQJ2IAJsIgBqIAUgAEEBdGogBSAAQQNsaiADIAQQ3AkgAiALEQUAIAUgAiAGbGoiDyEBIA8hCSACIAVqIg0hAEEBIREDQAJAAkAgACABTw0AIAUgACAEIAMRAAAiDkF/TA0AIA4NASANIAAgAiALEQUAIAIgDWohDSARQQFqIREMAQsCQANAIAAgASAQaiIBTw0BIAUgASAEIAMRAAAiDkEATARAIA4NASAJIBBqIgkgASACIAsRBQAgBkF/aiEGDAELCyAAIAEgAiALEQUADAELIAUgACAAIA1rIg4gDSAFayIBIAEgDksbIgFrIAEgEhEFACAAIA8gCSAAayIBIA8gCWsiACAAIAFLGyIAayAAIBIRBQAgBiAHayEJIA8gAWshAQJAIAcgEWsiBiAJSwRAIAUhByAGIQAgASEFIAkhBgwBCyABIQcgCSEACyAIIAw2AgggCCAANgIEIAggBzYCACAIQQxqIQgMAgsgACACaiEAIAdBAWohBwwACwALAAsACyAKQeAEaiQACzoBAX8CQCAAQVBqIgFBCk8EfyAAQb9/akEFSw0BIABBSWoFIAELDwsgAEGpf2pBfyAAQZ9/akEGSRsLEQAgACABIAIgAyAEIAUQygELfAIBfwJ+IAAgAikDACIEQQAQmQEiA0UEQEKAgICA4AAPCyAAIARCgICAgDAQ7wEiBBAMBEAgBA8LIAJBCGohAiABQX9qQQAQSyEBIAQQEQRAIABCgICAgDAgASACIAMvAQYQ4QUPCyAAIAQgASACELgDIQUgACAEEAsgBQsRACAAIAEgAiADQQBBABDKAQsyACAAQQwQLiIARQRAQQAPCyAAIAM2AgggACACNgIEIAAgASgCEDYCACABIAA2AhAgAAtrAQF/AkAgASgCoAEiA0F/Sg0AIAAgASACEFciA0EASA0AIAEgAzYCoAEgA0EEdCIAIAEoAnRqIgIgAigCDEGHf3FBIHI2AgwgAS0AbkEBcUUNACABKAJ0IABqIgAgACgCDEEBcjYCDAsgAwsuAQF/AkAgASgCmAEiAkF/Sg0AIAAgAUHNABBXIgJBAEgNACABIAI2ApgBCyACCzIAIAAoAgAgASACIAMQ5wIiAEEATgRAIAEoAnQgAEEEdGoiASABKAIMQQNyNgIMCyAAC3ABAn8gASgCAEF/TARAIAEgABA1NgIACyAAQREQDSAAQbABEA0gAkEAIAJBAEobIQIgAEHpAEF/EBwhBANAIAIgA0ZFBEAgAEEOEA0gA0EBaiEDDAELCyAAQQYQDSAAQesAIAEoAgAQHBogACAEEB4LaAAgACABIAIQVyIAQQBOBEAgASgCdCAAQQR0aiICIAIoAgxBh39xIANBA3RB+ABxcjYCDCACIAEoArwBIgM2AgQgAiABKALAATYCCCABKALMASADQQN0aiAANgIEIAEgADYCwAELIAALbQEBfyAAIAFB/AFqQRAgAUH4AWogASgC9AFBAWoQfEUEQCABIAEoAvQBIgNBAWo2AvQBIAEoAvwBIANBBHRqIgNBfzYCACADIAMtAARB+AFxOgAEIAMgASgCvAE2AgggAyAAIAIQGDYCDAsgAwtMAQJ/AkAgACgCQBClASIAQV1qIgJBDU1BAEEBIAJ0QeXwAHEbDQACQAJAIABBlX9qDgQCAQECAAsgAEGWfmpBAkkNAQtBASEBCyABC7EDAQN/IAAoAkBBsAJqIQMDQEEAIQICQANAIAMoAgAiA0UNASADKAIcBEAgAUUEQCAAQQYQDQsgAEGEARANQYMBIQIgACAAKAJALQBsQQNGBH8gAEEOEA0gAEEOEA0gAEHCABANIABBBhAbIABBERANIABBsAEQDSAAQeoAQX8QHCEBIABBJBANIABBABAXIABBgQEQDSAAQYsBEA0gAEHrAEF/EBwhBCAAIAEQHiAAQQ4QDSAAIAQQHkEOBUGDAQsQDUF9IQJBASEBCyADKAIQIAJqIQIgAygCFEF/Rg0AC0EPQQ4gARshBANAIAIEQCAAIAQQDSACQX9qIQIMAQsLIAFFBEAgAEEGEA0LIABB7QAgAygCFBAcGkEBIQEMAQsLIAACfyAAKAJAIgIoAmAEQAJAIAFFBEBBfyECDAELIABBKhANIABB6QBBfxAcIQIgAEEOEA0LIABBtgEQDSAAQQgQGyAAQQAQFyAAIAIQHkEoDAELIAItAGwiBARAAkAgAUUEQEEGIQMMAQtBiwEhA0EuIARBA0cNAhoLIAAgAxANQS4MAQtBKEEpIAEbCxANC0gAAkAgAEH7ABAvDQAgACgCEEH9AEcEQCAAEIMBGgNAIABBBxDuAQ0CIAAoAhBB/QBHDQALIAAQ7AELQX9BACAAEBAbDwtBfwuYAQEEfyABKAIUIgVBACAFQQBKGyEGIAFBEGohBAJAA0AgAyAGRwRAIAQoAgAgA0EDdGooAgAgAkYNAiADQQFqIQMMAQsLQX8hAyAAIARBCCABQRhqIAVBAWoQfA0AIAEgASgCFCIEQQFqNgIUIAEoAhAhAyAAIAIQGCEBIAMgBEEDdGoiAEEANgIEIAAgATYCACAGIQMLIAMLZQEBfyAAQfoAEFBFBEAgAEHljgFBABAUQQAPCwJAIAAQEA0AIAAoAhBBgX9HBEAgAEG4yABBABAUQQAPCyAAKAIAIAApAyAQOiIBRQ0AIAAQEEUEQCABDwsgACgCACABEBILQQAL4hEBFX8jAEFAaiIDJAAgACgCACEGIAAoAkAhBCADQQA2AjwgACgCGCERIAQgBC0AbiITQQFyOgBuAn8CQAJAIAAQEA0AAkACQCAAKAIQQYN/RgRAIAAoAihFDQEgABDtAQwDCyABIAJBAkZyDQEgAEGzhAFBABAUDAILIAYgACgCIBAYIQcgABAQDQILIAFFBEAgBiAHQfwAIAcbEBghCAsgABCDARoCfyAAKAIQIgVBTEYEQCAAEBANAyAAEKsCDQNBAQwBCyAAQQYQDUEACyESIAcEQCAAIAQgB0ECEKkBQQBIDQILIABB+wAQLw0BIAAQgwEaIABBAhANIAQoAoQCIRQgAEEAEDkgAEHWABANIAAgB0EWQS8gCBsgBxsQGyAAIBIQbCAEKAKYAiEVQQAhAQNAIAFBAkZFBEAgA0EQaiABQQR0aiIJQQA2AgggCUIANwMAIAFBAWohAQwBCwsgA0EANgI0IAVBTEYhFgNAAkACfwJ/AkACQCAAKAIQIgFBO0cEQCABQf0ARg0FQQAgAUFWRw0DGiAAEBANCCAAKAIQQUVqDgMBAgECCyAAEBBFDQUMBwsgBkEsEBgaIANBLDYCPCAAKAIYIQ9BACEMQQAhDUEAIQVBLAwCCyAAQRsQDUEBCyENIAAoAhghDyAAIANBPGpBAUEAQQEQxQMiBUEASA0EIAFBVkYhDCADKAI8CyEBQQAgAUH4AEZBACAFQW9xIgsgDCABQTxHciIXG3JFIAwgAUE7RnEbRQRAIABB04QBQQAQFAwECyAFQRBxIQkCQAJAAkACQCAFQW5xQQJGBEAgCQRAAkAgBCABIAQoArwBEMEDIgVBAE4EQCAEKAJ0IAVBBHRqIgUoAgwiCkEDdkEPcSIBQQlNQQBBASABdEHgBHEbIAEgC0EFakZyDQQgBSAKQYd/cUHIAHI2AgwMAQsgACAEIAEgC0EFahDlAkF/TA0KCyAAIANBEGogDUEEdGoQygRBAEgNCQsgACALQQJqQQAgDyAAKAIUQQAgA0EMahCIAg0IIAkEQCADKAIMQQE2ArgBIABB0AAQDSAAQbsBEA0gAygCPCEBAkAgC0ECRwRAIAYgARDJBCIBRQ0LIAAgARAbIAAgBCABQQgQ5QIhBSAGIAEQEiAFQQBODQEMCwsgACABEBsLIAAgACgCQC8BvAEQFwwFCwJAIAMoAjxFBEAgAEHVABANDAELIABB1AAQDSAAIAMoAjwQGwsgACALQX9qQf8BcRBsDAQLQQYhEEEBIQVBACEOQQAhCgJAAkACQAJAAkAgCw4HAAMDAwQBAgMLIAAoAhBBKEYNAiABQUVqQQFNBEAgAEHnhAFBABAUDAwLIAkEQCAEIAEgBCgCvAEQwQNBf0oNBSAAIAQgAUEFEOUCQQBIDQwgAEEFEA0gACADKAI8EBsgAEG7ARANIAAgAygCPBAbIAAgACgCQC8BvAEQFwsgA0EQaiANQQR0aiIBKAIARQRAIAAgARDIBA0MC0EAIQUgAygCPEUEQCAGQfUAQfQAIAwbIAEoAgQQ5AYiBUUNDCAAIAQgBUECEKkBQX9MBEAgBiAFEBIMDQsgAEHwABANIABBuwEQDSAAIAUQGyAAIAAoAkAvAbwBEBcLIAAgASgCADYCQCAAQbYBEA0gAEEIEBsgAEEAEBcCQCADKAI8RQRAIABBtgEQDSAAIAUQGyAAIAAoAkAvAbwBEBcgASABKAIEQQFqNgIEIAYgBRASDAELIAlFDQAgAEG2ARANIAAgAygCPBAbIAAgACgCQC8BvAEQFwsCQCAAKAIQQT1GBEAgABAQDQ0gABBeRQ0BDA0LIABBBhANCwJAIAkEQCAAEMADIABBxgAQDQwBCyADKAI8IgFFBEAgABDAAyAAQdEAEA0gAEEOEA0MAQsgACABEKoBIABBzAAQDSAAIAMoAjwQGwsgACAAKAJAKAIENgJAIAAQuwFFDQcMCwtBAiEFDAILQQMhBQwBC0EAIQUgFw0AIAMoAjQEQCAAQfqEAUEAEBQMCQsCfyAWBEBBCCEQQQEhDkEADAELQQchEEEBCyEKCyAJBEAgACADQRBqIA1BBHRqEMoEQQBIDQgLIAAgECAFIA8gACgCFEEAIANBOGoQiAINByAKIA5yBEAgAyADKAI4NgI0DAQLIAlFDQIgAygCOEEBNgK4ASAEIAMoAjwiASAEKAK8ARDBA0EASA0BCyAAQaaFAUEAEBQMBgsgACAEIAFBBhDlAkEASA0FIABB0AAQDSAAQc0AEA0gACADKAI8EBsgAEG7ARANIAAgAygCPBAbIAAgACgCQC8BvAEQFwwBCwJAIAMoAjxFBEAgAEHVABANDAELIABB1AAQDSAAIAMoAjwQGwsgAEEAEGwLIAwEQCAAQRsQDQsgBiADKAI8EBIgA0EANgI8DAELCyADKAI0IgFFBEAgACASIANBNGoQ4gYNAiADKAI0IQELIAQoAoACIBRqIAEoAggQXCAELQBuQQJxRQRAIAYgAygCNCgCjAMQGSADKAI0IAAoAjggEWsiATYCkAMgBiARIAEQnQMhASADKAI0IAE2AowDIAFFDQILIAAQEA0BIAAgBEH2AEECEKkBQQBIDQECQCADKAIQBEAgACADQRBqEMcEDAELIABBBhANCyAAQbsBEA0gAEH2ABAbIAAgACgCQC8BvAEQFyAAQQ4QDSADKAIgBEAgAEEREA0gACADQSBqEMcEIABBJBANIABBABAXIABBDhANCyAHBEAgAEEREA0gAEG7ARANIAAgBxAbIAAgBC8BvAEQFwsgABDsASAAEOwBAkAgCARAIAAgBCAIQQEQqQFBAEgNAyAAQbsBEA0gACAIEBsgACAELwG8ARAXDAELIAcNACAAQb8BEA0gACAEKAKYAiAVa0EBahA5C0EAIAJFDQIaQQAgACAEKAKUAyAIIAhBFiACQQFGG0EAEIcCDQIaDAELCyAGIAMoAjwQEkF/CyEBIAYgBxASIAYgCBASIAQgEzoAbiADQUBrJAAgAQsuACAAIAEoAgA2AhQgACABKAIENgIIIAAgASgCDDYCOCAAIAEoAgg2AjAgABAQCyoAIAEgACgCBDYCACABIAAoAhQ2AgQgASAAKAIYNgIMIAEgACgCMDYCCAuIAQIGfwF+QQAgACgCBEH/////B3EiBSABKAIAIgNrIAUgA0gbIQYgA0ECaiEHAkADQCAEQQJHBEBBfyEFIAQgBkYNAiAAIAMQMCIIQVBqQQlLDQIgBEEBaiEEIANBAWohAyAIrSAJQgp+fEJQfCEJDAELCyACIAk3AwAgASAHNgIAQQAhBQsgBQsYACAAIAAgAYEiAH0gAEI/hyABg30gAX8LHgAgACABIAAgAhAOIAMQjAMiAkEAEOUEIAAgAhALC2UBA38gASgCECIEIAEoAhRBf2ogAhDVA3FBA3QiBWpBBGohAwN/IAMoAgAiAyAEIAVqRgRAQQAPCyAAIAMpAwgQDiACEA5BAhDbAQR/IANBaGoFIANBBGohAyABKAIQIQQMAQsLCykAAkAgAEIgiKdBC2pBEkkNACAAEEpEAAAAAAAAAABiDQBCACEACyAAC9kDAgh/A34jAEEwayIEJABCgICAgOAAIQwCQCAAIAEQKiINEAwNAEKAgICAMCEMAkACQCAAIARBLGogBEEoaiANpyIJIAJBb3EQjgENACAAEE8iDBAMDQAgAkEQcSEKQoCAgIAwIQEgBCgCLCEGIAQoAighByADQX9qIQtBACECA0AgAiAHRg0CIAYgAkEDdGooAgQhAwJAAkACQCAKBEAgACAEQQhqIAkgAxBTIgVBAEgEQEECIQUMAgsgBUUEQEEFIQUMAgsgACAEQQhqEE5BBSEFIAQoAghBBHFFDQELAkACQAJAAkAgCw4CAQIACyAAIAMQZiIBEAxFDQIMBwsgACANIAMgDUEAEBMiARAMRQ0BDAYLIAAQTyIBEAwNBSAAIAMQZiIOEAwNAyAAIAFCACAOQYCAARCrAUEASA0DIAAgDSADIA1BABATIg4QDA0DIAAgAUIBIA5BgIABEKsBQQBIDQMLIAAgDCAIrSABQQAQqwFBAEgNBCAIQQFqIQgMAQsgBQ4IAAUDBQUABQEFCyACQQFqIQIMAQsLIAAgARALCyAAIAwQC0KAgICA4AAhDCAEKAIoIQcgBCgCLCEGCyAAIAYgBxBiIAAgDRALCyAEQTBqJAAgDAujAQIDfwN+IwBBEGsiBiQAIARCACAEQgBVGyELIAVBAEghBwNAAkAgCSALUQRAQQAhBQwBC0F/IQUgACABIAlCf4UgBHwgCSAHGyIKIAN8IAZBCGoQhwEiCEEASA0AIAIgCnwhCgJAIAgEQCAAIAEgCiAGKQMIEI0BQQBODQEMAgsgACABIAoQkgJBAEgNAQsgCUIBfCEJDAELCyAGQRBqJAAgBQthAgF/AX4jAEEQayIDJAACfgJAAkAgAkUNACAAKQIEIgRC/////weDIAFXDQAgBKdBAEgNAQsgAUIBfAwBCyADIAE+AgwgACADQQxqENcBGiADNAIMCyEBIANBEGokACABCyQAIABBCHRBgID8B3EgAEEYdHIgAEEIdkGA/gNxIABBGHZycgsJACAAIAE7AAALSgAjAEEQayIDJAAgAyABOQMIIAMgAjYCACAAQYABQdbDACADEFUiAEGAAU4EQEHbwwBBoQ1Bg9kAQejDABAAAAsgA0EQaiQAIAALcAEDfyMAQRBrIgIkACAAIQEDQAJAIAEsAAAiA0EATgRAIANB/wFxQXdqIgNBF0tBASADdEGfgIAEcUVyDQEgAUEBaiEBDAILIAFBBiACQQxqEGUQsQNFDQAgAigCDCEBDAELCyACQRBqJAAgASAAawszAQF+An4gASkDQCICEBEEQEKAgICA4AAgACABEPAHIgIQDA0BGiABIAI3A0ALIAIQDgsLfwEDfyAAKAIQIQUgACACQQN0QRhqEC4iBEUEQA8LIAQgAjYCECAEIAE2AgwgBCAANgIIQQAhACACQQAgAkEAShshASAEQRhqIQIDQCAAIAFHBEAgAiAAQQN0IgZqIAMgBmopAwAQDjcDACAAQQFqIQAMAQsLIAQgBUGgAWoQTQsjACAAKAIAIAAoAgQQGSAAQQA2AgwgAEIANwIEIABBfzYCFAt2AQJ/IAAgAUEQahCkBQJAIAEoAiAiAgRAIAEoAjwiA0UNAQNAIAIgA09FBEAgACACKQMAECYgAkEIaiECIAEoAjwhAwwBCwsgACABKAIgECALIAAgASkDGBAmIAAgASkDABAmDwtBsx9BoQ1BiZQBQcYfEAAACw0AIAAgASACQRMQ5QML6AMBA38gAUEQaiEDIAEoAhQhAgNAIAIgA0ZFBEAgAkFoaiEEIAIoAgQhAiAAIAQQggMMAQsLIAAoAhAgASgCgAIgASgChAIgASgCoAIQhgUgAUGAAmoQowEgACABKALMAhAZIAAgASgCpAIQGSAAIAEoAtgCEBlBACECA0AgAiABKAK4Ak5FBEAgACABKAK0AiACQQN0aikDABALIAJBAWohAgwBCwsgACABKAK0AhAZIAAgASgCcBASQQAhAgNAIAIgASgCfE5FBEAgACABKAJ0IAJBBHRqKAIAEBIgAkEBaiECDAELCyAAIAEoAnQQGUEAIQIDQCACIAEoAogBTkUEQCAAIAEoAoABIAJBBHRqKAIAEBIgAkEBaiECDAELCyAAIAEoAoABEBlBACECA0AgAiABKAL0AU5FBEAgACABKAL8ASACQQR0aigCDBASIAJBAWohAgwBCwsgACABKAL8ARAZQQAhAgNAIAIgASgCwAJORQRAIAAgASgCyAIgAkEDdGooAgQQEiACQQFqIQIMAQsLIAAgASgCyAIQGSABKALMASICIAFB0AFqRwRAIAAgAhAZCyAAIAEoAuwCEBIgAUH0AmoQowEgACABKAKMAxAZIAEoAgQEQCABQRhqEEcLIAAgARAZC+UCAwN/AX4CfAJ/IAArAwgiBkQAAAAAAAAoQBDVBSIHmUQAAAAAAADgQWMEQCAHqgwBC0GAgICAeAsiAkEMaiACIAJBAEgbIgJBAEohBCACQQAgBBshBAJ+IAArAwAgBkQAAAAAAAAoQKOcoCIGmUQAAAAAAADgQ2MEQCAGsAwBC0KAgICAgICAgIB/CyIFEN8EuSEGA0AgAyAERkUEQCADQQJ0QcD3AGooAgAhAiADQQFGBEAgAiAFEM4Dp2pBk31qIQILIANBAWohAyAGIAK3oCEGDAELCyAGIAArAxBEAAAAAAAA8L+goEQAAAAAcJmUQaIgACsDMCAAKwMYRAAAAABAd0tBoiAAKwMgRAAAAAAATO1AoqAgACsDKEQAAAAAAECPQKKgoKAhBiABBHwgBgJ+IAaZRAAAAAAAAOBDYwRAIAawDAELQoCAgICAgICAgH8LEM8DQeDUA2y3oAUgBgsQhAMLOwAgAJ1EAAAAAAAAAACgRAAAAAAAAPh/IABEAADcwgiyPkNlG0QAAAAAAAD4fyAARAAA3MIIsj7DZhsLjAEBAn8CQANAIAFCgICAgHBUDQECQAJAAkACQAJAAkAgAaciAi8BBiIDQXRqDgUFAQMHAQALIANBKUYNASADQVNqDgUABgYGAAYLIAIoAiAoAjAPCyACKAIgIgJFDQQgAi0AEUUNASAAEMMCQQAPCyACKAIgIQILIAIpAwAhAQwBCwsgAigCICEACyAACw8AIAAgAUKAgICAMBC6AgttAgF/A34gABBPIgUQDEUEQCABQQAgAUEAShutIQZBACEBA0AgBCAGUQRAIAUPCyAAIAUgBCACIAFBA3RqKQMAEA5BABCrASEDIARCAXwhBCABQQFqIQEgA0F/Sg0ACyAAIAUQCwtCgICAgOAAC5sGAQZ/IwBBMGsiByQAIAcgAzYCLAJ/AkAgACgCACAHQRBqQSAQQw0AIAFB4ABHIQoCQANAIAMgACgCPCILTw0BAkAgAy0AACIGQR9LDQAgACgCQEUEQCACRQ0EIABB/9QAQQAQFAwECyAKRQRAIAZBDUcNAUEKIQYgA0EBaiADIAMtAAFBCkYbIQMMAQsgBkF2ag4EAgAAAgALIAcgA0EBaiIJNgIsAkACQAJAAkACQAJAIAEgBkcEQCAGQdwARg0BIAZBJEcNAkEkIQYgCg0FIAktAABB+wBHDQUgByADQQJqNgIsQSQhAQsgBEGBfzYCACAEIAE2AhggBCAHQRBqEDg3AxAgBSAHKAIsNgIAQQAMCQtBASEGAkACQAJAAkAgCS0AACIIQXZqDgQCAwMBAAsgCEHcAEYgCEEiRnIgCEEnRnINBCAIDQIgCSALTw0JIAcgA0ECajYCLEEAIQYMBgtBAkEBIAMtAAJBCkYbIQYLIAcgAyAGakEBaiIDNgIsIAFB4ABGDQYgACAAKAIIQQFqNgIIDAYLAkACQAJAIAhBUGpB/wFxQQlNBEAgACgCQCIGRQ0CIAFB4ABHBEAgBi0AbkEBcUUNAgsCQCAIQTBHDQAgAy0AAkFQakH/AXFBCkkNACAHIANBAmo2AixBACEGDAgLIAFB4ABGIAhBN0tyDQIgAkUNCyAAQaLVAEEAEBQMCwsgCEEYdEEYdUF/Sg0AIAlBBiAHQQxqEGUiBkGAgMQATw0HIAcgBygCDCIDNgIsIAZBfnFBqMAARg0IDAYLIAdBLGpBARCjAiIGQX9HDQELIAJFDQggAEHY1QBBABAUDAgLIAZBf0oNAyAHIAcoAixBAWo2AiwMAgsgBkEYdEEYdUF/Sg0CIANBBiAHQQxqEGUiBkH//8MASw0DIAcgBygCDDYCLAwCCyAHIANBAmo2AiwLIAghBgsgB0EQaiAGEL4BDQMgBygCLCEDDAELCyACRQ0BIABBhNYAQQAQFAwBCyACRQ0AIABBm9YAQQAQFAsgB0EQahBFQX8LIQYgB0EwaiQAIAYLEQAgACABIAIgAyAEQQIQ/gMLvQEBA38CQCABQoCAgIBwWgR/IAGnIggoAhAiByAHKAIYIAJxQX9zQQJ0aigCACEGIAcQKCEHAkADQCAGRQ0BIAIgByAGQX9qQQN0aiIGKAIERwRAIAYoAgBB////H3EhBgwBCwsQAQALIAAgCCACIAVBB3FBMHIQfyICRQRAQX8PCyACIAAQngIiADYCACAAQQNxDQEgAiAENgIEIAIgACADcjYCAEEBBUEACw8LQfE9QaENQd7IAEGUPhAAAAswAQF/IwBB0ABrIgMkACADIAAgA0EQaiABEJUBNgIAIAAgAiADEMsCIANB0ABqJAALagECfgJAAkAgABA9IgMQDARAIAMhBAwBC0KAgICA4AAhBCAAIANBwAAgAUEHEBpBAEgEQCADIQEMAQsgAyEBIAAgA0HpACACQQBHrUKAgICAEIRBBxAaQX9KDQELIAAgARALIAQhAwsgAwuPAwIDfwJ+IwBBEGsiAyQAIAFBeGoiBSkDACEGAn8CQAJAIAAgACABQXBqIgQpAwBBARDBASIHEAwEfiAGBSAAIAZBARDBASIGEAxFDQEgBwsQCwwBCwJAIAdCgICAgHCDQoCAgICQf1IgBkKAgICAcINCgICAgJB/UnJFBEAgB6cgBqcQkwIhASAAIAcQCyAAIAYQCwJAAkACQAJAIAJB3X5qDgMAAQIDCyABQR92IQIMBAsgAUEBSCECDAMLIAFBAEohAgwCCyABQX9KIQIMAQsCfwJAAkAgACADQQhqIAcQWgRAIAAgBhALDAELIAAgAyAGEFpFDQELQQAMAQsCfwJAAkACQAJAIAJB3X5qDgMAAQIDCyADKwMIIAMrAwBjDAMLIAMrAwggAysDAGUMAgsgAysDCCADKwMAZAwBCyADKwMIIAMrAwBmCyECQQELRQ0BCyAEIAJBAEetQoCAgIAQhDcDAEEADAELIARCgICAgDA3AwAgBUKAgICAMDcDAEF/CyEAIANBEGokACAAC1MCAn8CfkF/IQMCQCAAIAFBeGoiBCkDACIGIAIQ8wEiBRAMDQAgACAGEAsgBCAFNwMAIAAgBUHqACAFQQAQEyIFEAwNACABIAU3AwBBACEDCyADCy4BAX8DQCACIANGRQRAIAAgASADQQN0aikDABALIANBAWohAwwBCwsgACABEBkLZQECfyMAQRBrIgUkAAJAIAIQmwFFBEAgAhAOIQIMAQsgACAFQQxqIAIQjgIiBkUEQEKAgICA4AAhAgwBCyAAIAEgBiAFKAIMQZDIACADIAQQmwUhAiAAIAYQNwsgBUEQaiQAIAILqwECAX8DfiMAQRBrIgIkAEKAgICA4AAhBgJAIAAgARBoDQAgAykDACEHIARBAkYgAykDCCIIQoCAgIBgg0KAgICAIFJyRQRAIAAgASAHQQBBABAjIQYMAQsgACACQQxqIAgQ/QMiA0UNACACKAIMIQUCfiAEQQFxBEAgACABIAcgBSADEIkDDAELIAAgASAHIAUgAxAjCyEGIAAgAyAFEI8DCyACQRBqJAAgBgsNACAAIAEQDiACEMEBCxwAIAAgACgCECgCRCABQRhsaigCBEH1wgAQxgELZQEBfyMAQTBrIgIkAAJ/IAFC/////wdYBEAgAacQkQEMAQsgAiABNwMAIAJBEGpBGEGBwQAgAhBVGkEAIAAgAkEQahByIgEQDA0AGiAAKAIQIAGnQQEQzwILIQAgAkEwaiQAIAALPAEBfyABIAAoAtQBIAEoAhQgACgCyAEQzAJBAnRqIgIoAgA2AiggAiABNgIAIAAgACgC0AFBAWo2AtABC0MAAn9BACACKAIAKAIAQRp2IANGDQAaQX8gACABIAIQ4AENABogAigCACIAIAAoAgBB////H3EgA0EadHI2AgBBAAsLqgEBBH9BfyECAkAgACABQQAQ4AENACABKAIoIgQgASgCECIDKAIgaiIFIAMoAhxLBEAgACABQRBqIAEgBRC1BQ0BCyABKAIkIQNBACECA0AgAiAERkUEQCAAIAEgAhCRAUEHEH8gAykDADcDACACQQFqIQIgA0EIaiEDDAELCyAAIAEoAiQQGUEAIQIgAUEANgIoIAFCADcDICABIAEtAAVB9wFxOgAFCyACC30BA38CQAJAIABBAXEiAg0AIAFBgQJxQYECRg0BIAFBgAhxRQ0AIAAgAXNBBHENAQsCQCABQYD0AHFFIAJyDQAgAEEwcSICQRBGIAFBgDBxIgRBAEdzDQEgAEECcSABQYIEcUGCBEdyIAJBEEZyDQAgBEUNAQtBASEDCyADC5QBAQF/IwBBEGsiBSQAIAUgAzcDCAJAIAEEQCAAIAGtQoCAgIBwhBAOIAJBASAFQQhqEDYhAiAAIAUpAwgQC0F/IQEgAhAMDQEgACACEAtBASEBDAELIAAgAxALIARBgIABcUUEQEEAIQEgBEGAgAJxRQ0BIAAQ+AFFDQELIABBq8AAQQAQFUF/IQELIAVBEGokACABC2ACAX8BfgJAIAEQXQ0AAkACQAJAIAAoAhAoAjggAUECdGooAgApAgQiA0I+iKdBf2oOAwMCAAELQQEhAgJAIANCIIinQf////8DcQ4CAwABC0ECDwsQAQALQQEhAgsgAgsoAQF+An9BACAAIAEQuwUiAhARDQAaQX8gAhAMDQAaIAAgAhALQQELC04CAX8BfiMAQRBrIgIkAAJ+IAFB/wFNBEAgAiABOgAPIAAgAkEPakEBENACDAELIAIgATsBDCAAIAJBDGpBARCOBAshAyACQRBqJAAgAwsiACAAIAJBAWoQLiIABEAgACABIAIQJCACakEAOgAACyAACykBAn8CQCAAQoCAgIBwVA0AIACnIgIvAQYQ9QFFDQAgAigCICEBCyABC98BAQR/IAAQDAR/QYSnBCgCABCPASEAQYSnBCgCACAAQaYIEOkDIQJBhKcEKAIAIQMCQCACRQRAIAMgABALDAELIAMgAEGrCBDpAyEDQYSnBCgCACEEIANFBEAgBCACEDdBhKcEKAIAIAAQCwwBCyAEIABBsQgQ6QMhBEGEpwQoAgAhBSAERQRAIAUgAhA3QYSnBCgCACADEDdBhKcEKAIAIAAQCwwBCyAFIAAQCyACIAQgAyABEApBhKcEKAIAIAIQN0GEpwQoAgAgAxA3QYSnBCgCACAEEDcLQQEFQQALCyEAIAAgAUEwIAOtQQEQGhogACABQTYgACACEDJBARAaGgtPAQF/IAEgAjYCDCABIAA2AgAgAUEANgIUIAEgAzYCECABQQA2AgggASAAIAIgAxD6ASIANgIEIAAEf0EABSABQX82AhQgAUEANgIMQX8LC/gBAgV/AX4gASgCDCECAkACQAJAIAEpAgQiB0KAgICAgICAgEBaBEAgACgCOCEEDAELAkAgASAAKAI4IgQgACgCNCAHQiCIpyAAKAIkQX9qcUECdGoiAygCACIFQQJ0aigCACIGRgRAIAMgAjYCAAwBCwNAIAYhAyAFRQ0DIAQgAygCDCIFQQJ0aigCACIGIAFHDQALIAMgAjYCDAsgBSECCyAEIAJBAnRqIAAoAjwQyAU2AgAgACACNgI8IAAgARAgIAAgACgCKCIAQX9qNgIoIABBAEwNAQ8LQZkwQaENQdgWQaAwEAAAC0GyMEGhDUHsFkGgMBAAAAtJAgF/AX4CQAJAIAIEQCABLAAAEEYNAQsgACgCECABIAIQ9QgiAw0BC0EAIQMgACABIAIQ/AEiBBAMDQAgACAEpxCWBCEDCyADC8QCAQJ/IAAgACgCACIBQX9qIgI2AgACQCABQQFKDQAgAkUEQCAAKAIQIQJBACEBIABBABCYBCAAIAApA8ABEAsgACAAKQPIARALIAAgACkDsAEQCyAAIAApA7gBEAsgACAAKQOoARALA0AgAUEIRgRAQQAhAQNAIAEgAigCQEgEQCAAIAAoAiggAUEDdGopAwAQCyABQQFqIQEMAQsLIAIgACgCKBAgIAAgACkDmAEQCyAAIAApA6ABEAsgACAAKQNQEAsgACAAKQNAEAsgACAAKQNIEAsgACAAKQM4EAsgACAAKQMwEAsgACgCECEBIAAoAiQiAgRAIAEgAhCcAgsgAEEUahBHIAAQnQIgACgCECAAECAMAwUgACAAIAFBA3RqKQNYEAsgAUEBaiEBDAELAAsAC0HHDUGhDUHoEUHiDRAAAAsLsgEDAX8BfgF8IAC9IgJCNIinQf8PcSIBQbIITQR8IAFB/QdNBEAgAEQAAAAAAAAAAKIPCwJ8IAAgAJogAkJ/VRsiAEQAAAAAAAAwQ6BEAAAAAAAAMMOgIAChIgNEAAAAAAAA4D9kQQFzRQRAIAAgA6BEAAAAAAAA8L+gDAELIAAgA6AiACADRAAAAAAAAOC/ZUEBcw0AGiAARAAAAAAAAPA/oAsiACAAmiACQn9VGwUgAAsL1gMDAn8BfgJ8IAC9IgNCIIinIQECQAJ8AnwCQCADQgBZQQAgAUH5hOr+A0sbRQRAIAFBgIDA/3tPBEBEAAAAAAAA8P8gAEQAAAAAAADwv2ENBBogACAAoUQAAAAAAAAAAKMPCyABQQF0QYCAgMoHSQ0EIAFBxf3K/ntPDQFEAAAAAAAAAAAMAgsgAUH//7//B0sNAwsgAEQAAAAAAADwP6AiBL0iA0IgiKdB4r4laiIBQRR2QYF4aiECIAAgBKFEAAAAAAAA8D+gIAAgBEQAAAAAAADwv6ChIAFB//+/gARLGyAEo0QAAAAAAAAAACABQf//v5oETRshBSADQv////8PgyABQf//P3FBnsGa/wNqrUIghoS/RAAAAAAAAPC/oCEAIAK3CyIERAAA4P5CLuY/oiAAIAUgBER2PHk17znqPaKgIAAgAEQAAAAAAAAAQKCjIgQgACAARAAAAAAAAOA/oqIiBSAEIASiIgQgBKIiACAAIABEn8Z40Amawz+iRK94jh3Fccw/oKJEBPqXmZmZ2T+goiAEIAAgACAARERSPt8S8cI/okTeA8uWZEbHP6CiRFmTIpQkSdI/oKJEk1VVVVVV5T+goqCgoqAgBaGgoAsPCyAACxoAIAAgARC6CSIAQQAgAC0AACABQf8BcUYbCyoBAX8gAEKAgICAcFoEQCAApyICIAItAAVB7wFxIAFBBHRBEHFyOgAFCwsrACAAQYABTwR/IABBzwFNBEAgAEGABWoPCyAAQQF0Qa6sA2ovAQAFIAALCxAAIAAvAAAgAC0AAkEQdHILwgIBB38CQCABRQ0AA0AgAkEDRgRAIAFBAXEiBUUgAUEGcUVyIQcDQCAEQekCRg0DAkACQCADIARBAnRBwOcBaigCACICQQR2QQ9xIgZ2QQFxRQ0AIAJBD3YhASACQQh2Qf8AcSEIAkACQAJAIAZBfGoOAgABAgsgB0UNASABIAVqIQZBACECA0AgAiAITw0DIAIgBmohASACQQJqIQIgACABIAFBAWoQggFFDQALDAMLIAdFDQAgAUEBaiECIAVFBEAgACABIAIQggENAwsgACACIAFBAmoiAhCCAUUEQCAFRQ0CIAAgAiABQQNqEIIBRQ0CC0F/DwsgACABIAEgCGoQggENAQsgBEEBaiEEDAELC0F/DwUgASACdkEBcQRAIAJBAnRB1OQDaigCACADciEDCyACQQFqIQIMAQsACwALQQALTQEBfyAAKAIEIgIgAUgEQCAAKAIMIAAoAgggASACQQNsQQJtEEsiAUECdCAAKAIQEQAAIgJFBEBBfw8LIAAgATYCBCAAIAI2AggLQQALlAIBAn8jAEEQayIEJAACQCAEQQxqIAAgAiADEPcFIgJBAEgNACABIAJqIQIDQCACQQFqIQECQCACLQAAIgNBP00EQCAEKAIMIANBA3ZqQQFqIgIgAEsNAyAEIANBB3EgAmpBAWoiAzYCDCAFQQFzIQUMAQsgA0EYdEEYdUF/TARAIAQgAyAEKAIMakGBf2oiAzYCDAwBCyADQd8ATQRAIAQgBCgCDCACLQABIANBCHRyakGBgH9qIgM2AgwgAkECaiEBDAELIAQgBCgCDCACLQACIANBEHQgAi0AAUEIdHJyakGBgIB9aiIDNgIMIAJBA2ohAQsgAyAASw0BIAVBAXMhBSABIQIMAAsACyAEQRBqJAAgBQtMAQJ/IwBBEGsiAyQAAn8gAiABKAIAIgQtAABHBEAgAyACNgIAIABBy+IBIAMQP0F/DAELIAEgBEEBajYCAEEACyECIANBEGokACACCx4AIABBUGpBCkkgAEFfcUG/f2pBGklyIABB3wBGcgvBAQEDfwJAAn8gACgCQBpBAAsEQCAAQbHgAUEAED8MAQsgACgCBCEDIAAgARCCBg0AQQUgA2shBANAIAAoAhgiAi0AAEH8AEcEQEEADwsgACACQQFqNgIYIAAoAgQhAiAAIANBBRCBAgRAIAAQ2wJBfw8LIAAoAgAgA2pBCToAACAAKAIAIANqQQFqIAIgBGoQXCAAQQdBABDLASECIAAgARCCBg0BIAAoAgAgAmogACgCBCACa0F8ahBcDAALAAtBfwtLAQJ/AkADQCABQQpGDQEgAUECdEECckGg3wFqLwEAIABKDQEgAUEBdCECIAFBAWohASACQQF0QaTfAWovAQAgAEwNAAtBAQ8LQQALtwIBA38CfwJ/IAFB/wBNBEAgACABOgAAIABBAWoMAQsCfyABQf8PTQRAIAAhAyABQQZ2QUByDAELAn8gAUH//wNNBEAgAEEBaiEDIAAhBCABQQx2QWByDAELAn8gAUH///8ATQRAIAAhAiABQRJ2QXByDAELAn8gAUH///8fTQRAIAFBGHZBeHIhA0EBIQIgAAwBC0EAIAFBAEgNBRogACABQR52QfwBcjoAACABQRh2QT9xQYB/ciEDQQIhAiAAQQFqCyADOgAAIAAgAmohAiABQRJ2QT9xQYB/cgshAyACIAM6AAAgAkECaiEDIAJBAWohBCABQQx2QT9xQYB/cgshAiAEIAI6AAAgAUEGdkE/cUGAf3ILIQIgAyACOgAAIAMgAUE/cUGAAXI6AAEgA0ECagsgAGsLCyQAIABCADcCACAAIAE2AhQgAEIANwIIIAAgAkHgAiACGzYCEAsnAQJ/AkAgACABQQAQmQEiAwRAIAMQmAFFDQEgABBxC0F/IQILIAILyQECA38BfiMAQRBrIgUkAAJAIAAgAUECEG0iARAMDQACQAJAIAJBAUcNACADKQMAIgcQjAFFDQAgACAFQQxqIAcQDkEBEMYCDQEgACABQTACfiAFKAIMIgJBAE4EQCACrQwBCyACuBAWCxBJQX9MDQEMAgsgAkEAIAJBAEobIQIDQCACIARGDQIgACABIAQgAyAEQQN0aikDABAOEJQCIQYgBEEBaiEEIAZBf0oNAAsLIAAgARALQoCAgIDgACEBCyAFQRBqJAAgAQtDAQJ/A0ACQCACQQFOBH8gACABEDAQ3gIiBEEATg0BQX8FIAMLDwsgAkF/aiECIAFBAWohASAEIANBBHRyIQMMAAsACyYBAX8jAEEQayICJAAgAkEANgIMIABBBSABQQAQ+wEgAkEQaiQAC3kBAn8jAEEQayIEJAACQCAAIAEgAiADEK8BIgEQDA0AAkAgACABEJYBIgVBAEgNACACQQFHDQEgACAEQQhqIAMpAwAQDhCtAQ0AIAQpAwggBa1XDQEgAEHQrAFBABAVCyAAIAEQC0KAgICA4AAhAQsgBEEQaiQAIAELQgEBfwJAIAAgAWoiAC0AAUE9Rw0AQQEhAgJAAkAgAC0AACIAQWpqDgQCAQECAAsgAEGxAUYNAQsgAEEdRiECCyACC2kAIAFBAWpBCE0EQCAAIAFBs39qQf8BcRAPDwsgAUGAAWpB/wFNBEAgAEG7ARAPIAAgAUH/AXEQDw8LIAFBgIACakH//wNNBEAgAEG8ARAPIAAgAUH//wNxEDEPCyAAQQEQDyAAIAEQHQtpAQR/IAAoAgQhBQJAA0AgASAFTg0BAkACQCAAKAIAIAFqIgMtAAAiBEG0AUcEQCAEQcABRg0BIARB6wBHDQQgAiADKAABRw0EDAILIAIgAygAAUYNAQsgAUEFaiEBDAELC0EBIQYLIAYLgQIBBX8gACABQX8QcBoCQANAIAZBCkYEQEHrACEEDAILAkAgAUEASA0AIAEgACgCrAJODQAgACgCpAIgAUEUbGooAgghBSAAKAKAAiEHA0ACQAJAIAUgB2oiCC0AACIEQbQBRg0AIARBwAFHBEAgBEEORw0CQSkhBANAIAcgBUEBaiIFai0AACIDQQ5GDQALIANBKUYNBkEOIQQMBgsgA0UNACADIAgoAAE2AgALIAUgBEECdEGQMWotAABqIQUMAQsLIARB6wBHDQIgBkEBaiEGIAgoAAEhAQwBCwtBnooBQaENQf/zAUGVmgEQAAALIAIgBDYCACAAIAFBARBwGiABCzYAAkAgACABQQgQVyIAQQBIDQAgASgCYEUNACABKAJ0IABBBHRqIgEgASgCDEECcjYCDAsgAAulAQECfyABKALAAiIKQYCABE4EQCAAQZ+QAUEAEEJBfw8LQX8hCSAAIAFByAJqQQggAUHEAmogCkEBahB8BH9BfwUgASABKALAAiIJQQFqNgLAAiABKALIAiAJQQN0aiIJIAQ7AQIgCSAHQQN0QQhxIAZBAnRBBHEgA0EBdEECcSACQQFxcnJyIAhBBHRyOgAAIAkgACAFEBg2AgQgASgCwAJBf2oLC9UBAQN/AkACQCABQaF/RgRAQX8hAyAAQQggAhCqAkUNAQwCC0F/IQMgAEGhfyACEL8DDQELQQAhAyAAKAIQIAFHDQBB6QBB6gAgAUGhf0YbIQUgAkF7cSECIAAQNSEEA0BBfyEDIAAQEA0BIABBERANIAAgBSAEEBwaIABBDhANAkAgAUGhf0YEQCAAQQggAhCqAkUNAQwDCyAAQaF/IAIQvwMNAgsgACgCECIDIAFGDQALIANBpn9GBEAgAEGmhwFBABAUQX8PCyAAIAQQHkEAIQMLIAMLjQEBAn8CQAJAIAAoAkAiARClASICQb8BRwRAIAJBzQBHDQEgASgCmAIhAiABQX82ApgCIAEgAjYChAIgAEHOABANDwsgASgCmAIiACAAIAEoAoACIgJqKAABayACaiIALQABQdYARw0BIABB1wA6AAEgAUF/NgKYAgsPC0HThQFBoQ1B7bABQYqGARAAAAtZAQN/IAAoAswBIAJBA3RqQQRqIQMDQAJAQX8hBCADKAIAIgNBf0YNACAAKAJ0IANBBHRqIgUoAgQgAkcNACADIQQgBSgCACABRg0AIAVBCGohAwwBCwsgBAuLGQIJfwF+IwBBEGsiBCQAIAFBAnEiA0EBdiEJQX4hAgJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIQIgVBgAFqDgcCAxINAQEFAAsCQCAFQdUAag4MCQsMAQEBAQoBAQEPAAsCQCAFQTtqDgoHAQEIAQEBAREQAAsgBUEoRg0FIAVBL0YNAyAFQdsARiAFQfsARnINDQsgACgCOCEDIAQgACgCGCIBNgIEIAQgAyABazYCACAAQdqCASAEEBQMFAsCQCAAKQMgIgtC/////w9YBEAgAEEBEA0gACALpxA5DAELIAAgC0EAEM8BQQBIDRQLQX8hASAAEBANFAwRC0F/IQEgACAAKQMgQQEQzwENEyAAEBBFDRAMEwtBfyECCyAAIAAoAjggAmo2AjggACgCACgC6AFFBEAgAEGKgAFBABAUDBELQX8hASAAEM8EDRFBACECIAAgACkDIEEAEM8BGiAAKAIAIgMgACkDICAAKQMoIAMoAugBERYAIgsQDARAIAAoAkAiAwRAIAMoAmhBAEdBAXQhAgsgACgCACIDIAMoAhApA4ABIAAoAgwgACgCFCACEL8CDBILIAAgC0EAEM8BIQMgACgCACALEAsgAw0RIABBMxANIAAQEEUNDwwRCwJAIAFBBHFFDQBBACECIABBAEEBEKYBQaR/Rw0AQX8hASAAQQNBACAAKAIYIAAoAhQQ1AFFDQ8MEQtBfyEBIAAQhgJFDQ0MEAtBfyEBQQAhAiAAQQJBACAAKAIYIAAoAhQQ1AFFDQ0MDwtBfyEBQQAhAiAAQQFBABDuAkUNDAwOC0F/IQEgABAQDQ0gAEEHEA0MCgtBfyEBIAAQEA0MIABBtgEQDSAAQQgQGwwIC0F/IQEgABAQDQsgAEEJEA0MCAtBfyEBIAAQEA0KIABBChANDAcLIAAoAigEQCAAEO0BDAkLAkAgAUEEcSIDRQ0AIABBARCGAUGkf0cNAEF/IQFBACECIABBA0EAIAAoAhggACgCFBDUAUUNCAwKCwJAAkAgAEGFARBQRQ0AIABBARCGAUEKRg0AIAAoAhQhCCAAKAIYIQVBfyEBIAAQEA0LIAAoAhAiAkFFRgRAIABBAkECIAUgCBDUAUUNCQwMCwJAIANFDQACQCACQShGBH8gAEEAQQEQpgFBpH9GDQEgACgCEAUgAgtBg39HDQEgACgCKA0BIABBARCGAUGkf0cNAQsgAEEDQQIgBSAIENQBRQ0JDAwLQYUBIQIgACgCAEGFARAYGgwBCwJAIAAoAiAiA0HNAEcNACAAKAJAKAJcDQAgAEGjgAFBABAUDAoLQX8hASAAKAIAIAMQGCECIAAQEA0KCyAAQbYBEA0gACACEDkgACAAKAJALwG8ARAXDAYLIAAgBEEMakEAEKYBQT1GBEAgAEEAQQBBACAEKAIMQQJxQQEQ0QFBAE4NBgwICyAAKAIQQfsARgRAIAAQ6AZFDQYMCAsgABDnBkUNBQwHC0F/IQEgABAQDQcgACgCEEEuRgRAIAAQEA0IIABB1gAQUEUEQCAAQeSAAUEAEBQMCQsgACgCQCgCUEUEQCAAQfWAAUEAEBQMCQsgABAQDQggAEG2ARANIABB8QAQGwwECyAAQQAQwgMNB0EBIQkgACgCEEEoRgRAQQEhAgwGCyAAQREQDSAAQSEQDQwDC0F/IQEgABAQDQYCQCAAKAIQIgNB2wBGIANBLkZyRQRAIANBKEcNAUECIQIgACgCQCgCVA0GIABBnoEBQQAQFAwICyAAKAJAKAJYRQRAIABB04EBQQAQFAwICyAAQbYBEA0gAEEIEBtBACECIABBABAXIABBtgEQDSAAQfMAEBsgAEEAEBcgAEE0EA0MBQsgAEH1gQFBABAUDAYLQX8hASAAEBANBSAAKAIQQS5GBEAgABAQDQYgAEH7ABBQRQRAIABBjIIBQQAQFAwHCyAAKAJERQRAIABBmoIBQQAQFAwHCyAAEBANBiAAQQwQDSAAQQYQbAwDCyAAQSgQLw0FIANFBEAgAEHAggFBABAUDAYLIAAQXg0FIABBKRAvDQUgAEE1EA1BACECQQEhCQwDC0F/IQFBACECIABBAEEAEMwEDQQMAgtBACECIABBABAXDAELQQAhAgsgBEF/NgIMA0AgACgCQCEGAkACQAJAAkACQAJAAkACfwJAIAAoAhAiAUGnf0ciBUUEQCAAEBANCyAAKAIQIQEgCQRAQQEhCiABQShGDQILIAFB2wBHDQUMCQsgAiABQYJ/R3JFBEBBACEKIAQoAgxBAEgEQEEDIQNBAAwDCyAAQYGDAUEAEBQMCwsgCUUNA0EAIQogAUEoRw0DCyAAEBANCUEAIQMgAgRAQQAhByACIQMMAgtBAQshBUEBIQFBACEHAkACQAJAAkACQCAGEKUBIgJBuX9qDgQBBAQDAAsgAkG8AUcEQCACQbYBRg0CIAJBwQBHDQQgBigCgAIgBigCmAJqQcIAOgAAQQIhAUHBACEHDAQLIAYoAoACIAYoApgCakG9AToAAEECIQFBvAEhBwwDCyAGKAKAAiAGKAKYAmpByAA6AABBAiEBQccAIQcMAgsgBigCgAIgBigCmAJqIggoAAEhAiAKRQRAQTEhByAFIAJBOkZxDQMLIAYgCC8ABRDlBkUEQEG2ASEHDAILQboBIQcgCEG6AToAAAwBC0HHACEHIAYoAoACIAYoApgCakHHADoAAEECIQELIApFDQAgACAEQQxqIAEQ5gILAkAgA0EDRgRAIABBASAEQQhqEMwEDQkMAQsCQCADQQJHIgVFBEAgAEG2ARANIABB8gAQGyAAQQAQFyAAQTQQDSAAQbYBEA0gAEHxABAbIABBABAXDAELIANBAUcNACAAQREQDQtBACEBAkACQANAIAAoAhAiAkEpRg0CIAFB//8DRgRAIARB//8DNgIIIABBtYMBQQAQFAwMCyACQaV/Rg0BIAAQXkUEQCABQQFqIQEgACgCEEEpRg0DIABBLBAvRQ0BCwsgBCABNgIIDAoLIAQgATYCCCAAQSYQDSAAIAFB//8DcRAXIABBARANIAAgARA5A0ACQAJAIAAoAhAiAUGlf0cEQCABQSlGDQIgABBeDQ0gAEHRABANQY8BIQIMAQtBfyEBIAAQEA0NQdIAIQIgABBeDQ0LIAAgAhANIAAoAhBBKUYNAEF/IQEgAEEsEC9FDQEMDAsLIAAQEA0JIABBDhANAkACQAJAAkAgB0HGfmoOAwEDAQALIAdBMUYNASAHQccARg0AIAdBwQBHDQILIABBGBANIABBJxANIAAgA0EBRhAXQQAhAgwKCyAAQTIQDQwHCyAFRQRAIABBJxANIABBARAXDAYLIANBAUYEQCAAQRgQDSAAQScQDSAAQQEQF0EAIQIMCQsgAEEGEA0gAEEbEA0gAEEnEA1BACECIABBABAXDAgLIAQgATYCCCAAEBANCAsCQAJAAkACQCAHQcZ+ag4DAQMBAAsgB0ExRg0BIAdBxwBGDQAgB0HBAEcNAgsgAEEkEA0gACAELwEIEBdBACECDAgLIABBMRANIAAgBC8BCBAXDAULAkACQAJAIANBf2oOAgEAAgsgAEEhEA0gACAELwEIEBcMBQsgAEEhEA0gACAELwEIEBdBACECDAcLIABBIhANIAAgBC8BCBAXQQAhAgwGCyABQdsARg0EIAFBLkcNASAAEBANBiAAKAIQIQELAkAgAUGpf0YEQCAGEKUBQTRGBEAgAEHNgwFBABAUDAgLIAVFBEAgACAEQQxqQQEQ5gILIABBvAEQDSAAIAAoAiAQGyAAIAAoAkAvAbwBEBcMAQsgARDTAUUEQCAAQfeDAUEAEBQMBwsgBhClAUE0RgRAIAAgACgCACAAKAIgEGYiC0EBEM8BIQEgACgCACALEAsgAQ0HIABBygAQDQwBCyAFRQRAIAAgBEEMakEBEOYCCyAAQcEAEA0gACAAKAIgEBsLQX8hASAAEBBFDQQMBgtBACEBIAQoAgwiA0EASA0FIAAgAxAeDAULIABBERANIABBuwEQDSAAQQgQG0EAIQIgAEEAEBcgABDTBAwCCyAAIAYvAbwBEBcgBkEBNgJEQQAhAgwBCyAGEKUBIQMgBUUEQCAAIARBDGpBARDmAgtBfyEBIAAQEA0CIAAQlwENAiAAQd0AEC8NAiADQTRGBEAgAEHKABANBSAAQccAEA0LDAALAAtBfyEBCyAEQRBqJAAgAQtoAAJAIAFBf0oNAEF/IQEgACgCACAAQaQCakEUIABBqAJqIAAoAqwCQQFqEHwNACAAIAAoAqwCIgFBAWo2AqwCIAAoAqQCIAFBFGxqIgBBADYCECAAQn83AgggAEKAgICAcDcCAAsgAQuCAQEBfwJAAkAgACgCEEGDf0cNACAAKAIoDQAgACgCICECIAAoAkAtAG5BAXFFDQEgAkHNAEYNACACQTpHDQELIABBxP4AQQAQFEEADwsgACgCACACEBghAgJAAkAgAQRAIAAgAhDOBA0BCyAAEBBFDQELIAAoAgAgAhASQQAhAgsgAgvaBAEEfwJAAkACQAJ/AkACQAJAAkACQCACRQ0AAkAgAEHBABBQRQRAIABBwgAQUEUNAQsgACgCACAAKAIgEBghBSAAEBANBEEBIQcCQAJAIAAoAhAiCEFYag4FBAEBAQQACyAIQTpGIAhB/QBGcg0DCyAAKAIAIAUQEkEDQQIgBUHCAEYbIQYMAQsgACgCEEEqRgRAIAAQEA0IQQQhBgwBCyAAQYUBEFBFDQAgAEEBEIYBQQpGDQAgACgCACAAKAIgEBghBSAAEBANA0EBIQcCQAJAIAAoAhAiCEFYag4FAwEBAQMACyAIQTpGIAhB/QBGcg0CCyAAKAIAIAUQEkEFIQYgACgCEEEqRw0AIAAQEA0HQQYhBgsgACgCECIFENMBRQ0BQQAhByAFQYN/RgRAIAAoAihFIQcLIAAoAgAgACgCIBAYIQUgABAQDQILQQAgBiADRSAHRXJyDQMaIAAoAhAiAEE6RyACRSAAQShHcnEhBkEAIQQMBgsCQAJAAkAgBUGAAWoOAgEAAgsgACgCACAAKQMgEDoiBUUNBiAAEBANAgwDCyAAKAIAIAApAyAQOiIFRQ0FIAAQEEUNAgwBCyAFQdsARwRAIARFIAVBqX9Hcg0EIAAoAgAgACgCIBAYIQUgABAQDQFBEAwDCyAAEBANBCAAEJcBDQQgAEHdABAvDQRBACEFQQAMAgsgACgCACAFEBIMAwtBAAshBCAGQQJJDQIgACgCEEEoRg0CIAAoAgAgBRASCyAAQeOKAUEAEBQLIAFBADYCAEF/DwsgASAFNgIAIAQgBnILUwEBf0F/IQIgACgCACAAKAJAIgBBtAJqQQggAEG8AmogACgCuAJBAWoQfEUEQCAAIAAoArgCIgJBAWo2ArgCIAAoArQCIAJBA3RqIAE3AwALIAILkgEBAn8gASgCiAEiBEGAgAROBEAgAEGlyABBABBCQX8PC0F/IQMgACABQYABakEQIAFBhAFqIARBAWoQfAR/QX8FIAEgASgCiAEiA0EBajYCiAEgASgCgAEgA0EEdGoiA0IANwIAIANCADcCCCADIAAgAhAYNgIAIAMgAygCDEGA////B3I2AgwgASgCiAFBf2oLC5ABAQJ/AkADQCACQQBOBEACQCAAKAJ0IAJBBHRqIgQoAgAgAUcNACAEKAIMIgVBAnENAyADRQ0AIAVB+ABxQRhGDQMLIAQoAgghAgwBCwsCQCAAKAIgRQ0AIAAoAiQNAEGAgICABCECAkAgACABEKwCIgAEQCAALQAEQQJxDQELQQAhAAsgAA0BC0F/IQILIAILogEBA38jAEEQayICJAACf0EAIABBJxBQRQ0AGiAAIAIQ8AJBfwJ/QX8gABAQDQAaAkAgACgCECIDQS9qIgRBB01BAEEBIAR0QcEBcRsgA0H7AEZyRQRAQQEgA0HbAEYNAhogA0GDf0cNAUEAIAAoAigNAhoLIAFBAnZBAXEgACgCBCAAKAIURnIMAQtBAAsgACACEO8CGwshACACQRBqJAAgAAuCAgEFfwJAAkACQCACQc0ARiACQTpGckUEQCAAKAIAIQUgAkEWRw0BIAAoAkAhBgwCCyAAQe+PAUEAEBQMAgsgACgCQCIGKALAAiIHQQAgB0EAShshBwNAIAQgB0YNASAEQQN0IQggBEEBaiEEIAggBigCyAJqKAIEIAJHDQALIABBhpABQQAQFAwBCyAFIAYgA0H9AEZBACABKAI4IAJBAUEBQQAQvgMiAEEASA0AIAUgAUE0akEMIAFBPGogASgCOEEBahB8DQAgASABKAI4IgJBAWo2AjggASgCNCEBIAUgAxAYIQMgASACQQxsaiIBIAA2AgAgASADNgIEQQAPC0F/C6wEAQd/IwBBEGsiBCQAIAAoAkAhByAAKAIAIQYgAkGxf0chCUG7f0G7f0G3fyACQVFGIggbIAJBSUYbQf8BcSEKAn8CQANAAkACQCAAKAIQIgVBg39GBEAgACgCKARAIAAQ7QEMBQsgBiAAKAIgEBgiBUEnRyAIRUEAIAJBSUcbckUEQCAAQfqOAUEAEBQMAwsgABAQDQIgACAFIAIQrgINAiADBEAgACAAKAJAKAKUAyAFIAVBABCHAkUNAwsCQCAAKAIQQT1GBEAgABAQDQQgCUUEQCAAQbYBEA0gACAFEBsgACAHLwG8ARAXIAAgBEEMaiAEQQhqIAQgBEEEakEAQQBBPRC6AUEASA0FIAAgARC5AQRAIAYgBCgCABASDAYLIAAgBRCqASAAIAQoAgwgBCgCCCAEKAIAIAQoAgRBAEEAENABDAILIAAgARC5AQ0EIAAgBRCqASAAIAoQDSAAIAUQGyAAIAcvAbwBEBcMAQsgCEUEQCACQUlHDQEgAEGijwFBABAUDAQLIABBBhANIABBuwEQDSAAIAUQGyAAIAcvAbwBEBcLIAYgBRASDAELAkAgBUEgckH7AEcNACAAIARBDGpBABCmAUE9Rw0AIABBBhANIAAgAkEAQQEgBCgCDEECcUEBENEBQQBODQEMBAsgAEHJjwFBABAUDAMLQQAgACgCEEEsRw0DGiAAEBBFDQEMAgsLIAYgBRASC0F/CyEAIARBEGokACAAC/QCAgR/AX4jAEEgayICJAACfwJAIAAoAgAgAkEIakEgEEMNAAJAA0ACQCABIgQgACgCPE8NACAEQQFqIQFB4AAhAwJAAkACQAJAAkAgBC0AACIFQaR/ag4FAgMDAwEACyAFQSRHDQJBJCEDIAEtAABB+wBHDQMgBEECaiEBCyAAQYJ/NgIQIAAgAzYCKCACQQhqEDghBiAAIAE2AjggACAGNwMgQQAMBwsgAkEIakHcABA8DQUgASAAKAI8Tw0CIARBAmohASAELQABIQULAkACQAJAIAUiA0F2ag4EAQICAAILIAFBAWogASABLQAAQQpGGyEBCyAAIAAoAghBAWo2AghBCiEDDAELIANBGHRBGHVBf0oNACABQX9qQQYgAkEEahBlIgNB///DAEsNAyACKAIEIQELIAJBCGogAxC+AUUNAQwDCwsgAEGb1gBBABAUDAELIABBhNYAQQAQFAsgAkEIahBFQX8LIQEgAkEgaiQAIAELdgECfyABIAEtAABBfHFBAXIiBDoAACABIAItAAxBAnRBBHEgBEF5cXIiBDoAACABIARBdXEgAi0ADEECdEEIcXIiBDoAACACLQAMIQUgASADOwECIAEgBEENcSAFQQF0QfABcXI6AAAgASAAIAIoAgAQGDYCBAshACAAQpADgVCtQu4CQu0CIABCA4NQGyAAQuQAgVCtfXwLYwECfyMAQTBrIgEkAEGAgICAeCECIAEgAEKZ+P//v0FZBH9B/////wcgAELoB3+nIABC/////78+VRsFQYCAgIB4CzYCLCABQSxqIAEQCBogASgCJCECIAFBMGokACACQURtC7QDAwF/CH4BfCMAQRBrIgUkAAJ/QX8gACAFQQhqIAEQsgINABoCfCAFKwMIIg69Qv///////////wCDQoGAgICAgID4/wBaBEBEAAAAAAAAAAAgBA0BGkEADAILAn4gDplEAAAAAAAA4ENjBEAgDrAMAQtCgICAgICAgICAfwshBkQAAAAAAAAAACADRQ0AGkEAIAYQzwNrIgCsQuDUA34gBnwhBiAAtwshDiAGQoC4mSkQ4AQiASABQugHfyIHQugHfn0hCSABQoDd2wF/IQogAULg1AN/QjyBIQsgB0I8gSEMIAUgBiABfUKAuJkpfyIGNwMAQgAhASAGQgR8QgcQ4AQhDSAFEIAHIQggBSkDACEHA0ACQCABQgtRDQAgAadBAnRBwPcAajQCACEGIAFCAVEEQCAIEM4DIAZ8QpN9fCEGCyAHIAZTDQAgAUIBfCEBIAcgBn0hBwwBCwsgAiAOOQNAIAIgDbk5AzggAiAJuTkDMCACIAy5OQMoIAIgC7k5AyAgAiAKuTkDGCACIAG5OQMIIAIgCLk5AwAgAiAHQgF8uTkDEEEBCyEAIAVBEGokACAACw0AIAAgASACQQEQ5QQLIQAgASgCBEEFRwRAIAFBBTYCBCAAKAIQIAFBCGoQgAMLC1kCAn8BfiMAQRBrIgMkAEF/IQQCQCAAIAFBABB4IgUQDA0AIAAgA0EMaiAFEMQBDQAgACABQQAgAygCDCACaiIArRCUAkEASA0AIABFIQQLIANBEGokACAECxsAIAEoAiAEQCAAIAFBKGoQgAMgAUEANgIgCwugAQICfwF8AkACfAJAAkACQAJAAkAgABBUIgJBCGoOCgIBBgYGBgYCAwAECyAApyEBDAULIACnQQAQygUhAQwECyAAp0HbGGwhAQwDCyAAp0HbGGy3DAELIAJBB0cNAUQAAAAAAAD4fyAAEEoiAyADvUL///////////8Ag0KAgICAgICA+P8AVhsLvSIAQiCIIACFp0HbGGwhAQsgASACcwsQACAAQRh0IABBCHRyQRB2C1QBAX8gAEEgEC4iAkUEQEEADwsgAkEBNgIAIAJCgICAgMAAQoCAgIAwIAEbNwMYIAIgAkEYajYCECACIAItAAVBAXI6AAUgACgCECACQQMQvAEgAgsyAAJAIAAgAiABQQBBABAjIgIQDA0AIAIQIQ0AIAAgAhALIAAQKUKAgICA4AAhAgsgAgsLACAAIAEgAhDEAQsMACAAQeTJAEEAEBUL/AIBBX8jAEEQayIHJAAgAUEANgIAIAJBADYCAEECIQYCQCAFIAMgBBDsB0F/Sg0AQX8hBiAAIAUgAyAEEOsHQQBIDQACQCADIAQQowUiBgRAIAYoAghFDQEgBigCDCIEQf0ARg0BIAAgASACIAMoAhAgBigCAEEDdGooAgQgBCAFENsDIQYMAgsgBEEWRwRAA0AgCCADKAIsSARAIAYhCkEAIQkCQAJAAkAgACAHQQxqIAdBCGogAygCECADKAIoIAhBAnRqKAIAQQN0aigCBCAEIAUQ2wMiBkEBag4FAgABAQIBCyACKAIAIgYEQCABKAIAIAcoAgxGBEAgBygCCCgCDCAGKAIMRg0CCyABQQA2AgAgAkEANgIAQQMhBgwCCyABIAcoAgw2AgAgAiAHKAIINgIAC0EBIQkgCiEGCyAIQQFqIQggCQ0BDAQLC0EAIQYgAigCAA0CC0EBIQYMAQsgASADNgIAIAIgBjYCAEEAIQYLIAdBEGokACAGC3MBAn8jAEGQAWsiBCQAQeA8IQUCQAJAAkACQCABQQFqDgUDAgIAAQILQYo9IQUMAQtByT0hBQsgACAEQdAAaiADEJUBIQEgBCAAIARBEGogAigCBBCVATYCBCAEIAE2AgAgACAFIAQQywILIARBkAFqJAALaAECfyMAQRBrIgUkACAFQQA2AgggBUIANwMAIAAgASACIAMgBCAFENsDIQEDQCAGIAUoAghORQRAIAAgBSgCACAGQQN0aigCBBASIAZBAWohBgwBCwsgACAFKAIAEBkgBUEQaiQAIAELpQEBBX8jAEEQayIDJABBfyECAkAgACgCFA0AIAAoAgAgACgCBCABQQF0QRBqIANBDGoQtAEiBEUEQCAAEP8CDAELIARBEGohBSADKAIMQQF2IQYgACgCCCECA0AgAkEBSEUEQCAFIAJBf2oiAkEBdGogAiAFai0AADsBAAwBCwsgAEEBNgIQIAAgBDYCBCAAIAEgBmo2AgxBACECCyADQRBqJAAgAgsHACAAQQFxC1QBAn8gACABKQMYIAIQIiAAIAEpAwAgAhAiAkAgASgCPCIERQ0AIAEoAiAhAwNAIAMgBE8NASAAIAMpAwAgAhAiIANBCGohAyABKAI8IQQMAAsACwsaAQF/IAGnKAIgIgMEQCAAIAMpAwAgAhAiCwtCAQF/IAEgASgCAEF/aiICNgIAAkAgAkUEQCABKAIERQ0BIAFBEGoQRyAAIAEQIAsPC0GXH0GhDUHG5QJBoR8QAAALCgAgACgCBCAARgt8AQR/IAGnIgYvAQYhByAAQRgQLiIFRQRAIAAgAhALQX8PCyACpyIIKAIgIQAgBSAEIAdBmR5qMQAAhj4CFCAFIAOnIgc2AhAgBSAINgIMIAUgBjYCCCAFIABBDGoQTSAGIAQ+AiggBiAFNgIgIAYgACgCCCAHajYCJEEACw0AIAAgASACIAMQnQgLOwEBfyAAKAIQIgMgASACEM8CIgFFBEAgABDHAUKAgICA4AAPCyADKAI4IAFBAnRqNQIAQoCAgICAf4QLEwAgAEKAgICAcINCgICAgIB/UQseACABKAIAQQRHBEAgACABQQhqEIADIAFBBDYCAAsLLgEBfyAAIAAgASAAIAIQyAEiAiABQQAQEyIBELgBIQMgACABEAsgACACEBIgAwvuAQEBfyAAQZgDEGsiBkUEQEEADwsgBiAANgIAIAZBEGoQbyAGQX82AgggBiABNgIEIAEEQCAGQRhqIAFBEGoQTSAGIAEtAG46AG4gBiABKAK8ATYCDAsgBiADNgIsIAYgAjYCICAAIAZBgAJqEI8CIAZBADYCcCAGQX82ApgCIAZBkAFqQf8BQSgQTBogBkKEgICAEDcCxAEgBiAGQdABajYCzAEgBkJ/NwLQASAGQX82AvABIAZCgICAgHA3ArwBIAAgBBDIASEBIAYgBTYC8AIgBiABNgLsAiAAIAZB9AJqEI8CIAYgBTYCnAIgBgsVAQF+IAAgARDuBCECIAAgARALIAIL4QoCA38KfiMAQRBrIgQkACAEIAI3AwgCQAJAAkACQAJAAkACQAJAAkACQCACEFRBB2oODwMCAgICAgAEBAQCAgICAQILAkACQAJAAkACQAJAIAKnIgYvAQZBfGoOAwEABAULQoCAgIAwIQMgACACED4iAhAMDQEgBCAAIAIQ6wMiAjcDCCACEAwNASABKAIoIAIQiwEhBQwNCyAEIAAgAhCdASICNwMIQoCAgIAwIQMgAhAMRQ0BC0KAgICAMCELQoCAgIAwIQdCgICAgDAhCUKAgICAMCEMDAoLIAEoAiggAhCLASEFDAoLIAEoAiggBikDIBCKASEFIAAgAhALDAkLQoCAgIAwIQkgACABKQMIQQEgBEEIahDvAyIIEAwNBiAAIAgQLQRAIABB8s0AQQAQFQwHCyAAIAMQDiIOIAEpAxgQDhDBAiIMEAwEQEKAgICAMCEDQoCAgIAwIQsMBgsCQCABKQMYEPQBRQRAAkAgAEG0ECAMEA4iCEG+FRC9ASIDEAwEQEKAgICAMCELDAELIABBjNcAEHIiCxAMRQ0CC0KAgICAMCEHIAghDAwJCyABKQMgEA4hAyABKQMgEA4hCwsgACAAIAEpAwhBASAEQQhqQQAQlwUQiwINBSAAIAIQwAEiBkEASA0FIAYEQCAAIAQgAhBADQYgASgCKEHbABA8GiAEKQMAIg9CACAPQgBVGyEQA0AgByAQUgRAIAdQRQRAIAEoAihBLBA8GgsgASgCKCADEIoBGiAAIAIgBxBgIgoQDA0IIAAgByIIQoCAgIAIWgR+IAi5EBYFIAgLED4iDRAMBEBCgICAgDAhByANIQkMCwsgACABIAIgCiANEO0DIQogACANEAsgChAMDQggCEIBfCEHIAAgAUKAgICAICAKIAoQERsgDBDsA0UNAQwICwtCgICAgDAhB0HdACEGIA9CAVMNBSABKQMYEPQBDQUgASgCKEEKEDwaIAEoAiggDhCKARoMBQsCfiABKQMQIggQEUUEQCAIEA4MAQsgAEKAgICAMEEBIARBCGpBABCWBQsiBxAMDQcgACAEIAcQQA0HIAEoAihB+wAQPBogBCkDACIIQgAgCEIAVRshDQNAIAogDVIEQCAAIAkQCyAAIAcgChBgIgkQDA0JIAAgAiAJEA4iCRCeASIIEAwNCSAAIAEgAiAIIAkQ7QMiCBAMDQkgCBARRQRAIAUEQCABKAIoQSwQPBoLIAAgCRDrAyIJEAwEQCAAIAgQCwwLCyABKAIoIAMQigEaIAEoAiggCRCKARogASgCKEE6EDwaIAEoAiggCxCKARpBASEFIAAgASAIIAwQ7AMNCgsgCkIBfCEKDAELC0H9ACEGIAVFDQQgASgCGCgCBEH/////B3FFDQQgASgCKEEKEDwaIAEoAiggDhCKARoMBAsgAhBKvUKAgICAgICA+P8Ag0KAgICAgICA+P8AUg0CQoCAgIAgIQIgBEKAgICAIDcDCAwCCyAAIAIQCwwGCyAEIAAgAhDrAyICNwMIQoCAgIAwIQNCgICAgDAhC0KAgICAMCEHQoCAgIAwIQlCgICAgDAhDCACEAwNBAsgASgCKCACEIsBIQUMBAsgASgCKCAGEDwaQQAhBSAAIAAgASkDCEEAQQBBABCVBRCLAg0CIAAgAhALIAAgBxALIAAgAxALIAAgCxALIAAgDBALIAAgCRALDAMLQoCAgIAwIQcMAQtCgICAgDAhA0KAgICAMCELQoCAgIAwIQdCgICAgDAhDAsgACACEAsgACAHEAsgACADEAsgACALEAsgACAMEAsgACAJEAtBfyEFCyAEQRBqJAAgBQuKAgEBfyMAQSBrIgUkACAFIAQ3AxgCQAJAAkAgAxAhBEAgACADQYsBIANBABATIgQQDARAIAMhBAwDCyAAIAQQOwRAIAAgBCADQQEgBUEYahA2IQQgACADEAsgBBAMRQ0CDAMLIAAgBBALCyADIQQLAkAgASkDACIDEBEEQCAEIQMMAQsgBSAENwMIIAUgBSkDGDcDACAAIAMgAkECIAUQIyEDIAAgBBALIAMhBCADEAwNAQsCQCADEFRBB2oiAUEOSw0AQQEgAXRBgccBcQ0CIAFBBkcNACAAIAMQO0UNAgsgACADEAtCgICAgDAhAwwBCyAAIAQQC0KAgICA4AAhAwsgBUEgaiQAIAMLoAIBBH8gAUEoahBvIAEgAqcoAiAiBi0AEDYCOCABIAYoAhQ2AjAgASAAIAYvASggBBBLIgggBi8BKmogBi8BLmpBARBLQQN0EC4iADYCICAARQRAQX8PCyABIAIQDjcDGCADEA4hAiABIAg2AjQgASAENgIIIAEgAjcDACABIAEoAiAiByAIQQN0aiIANgIkIAEgACAGLwEqQQN0ajYCPEEAIQAgBEEAIARBAEobIQkDQCAAIAlGRQRAIAUgAEEDdCIHaikDABAOIQIgByABKAIgIgdqIAI3AwAgAEEBaiEADAELCyAEIAggBi8BKmoiACAAIARIGyEAA38gACAERgR/QQAFIAcgBEEDdGpCgICAgDA3AwAgBEEBaiEEDAELCwu+AgICfwR+IwBBIGsiBCQAQoCAgIDgACEIAkAgACAEQRhqIAAgARAqIgkQQA0AAkAgBCkDGCIHQgFTDQAgBEIANwMQIAJBAk4EQCAAIARBEGogAykDCEIAIAcgBxB9DQILAkACQCAJIARBDGogBEEIahCMAkUEQCAEKQMQIQEMAQsgBCkDECIGIAQ1AggiASAGIAFVGyEBIAQoAgwhAgNAIAEgBlIEQCAGpyEFIAZCAXwhBiAAIAMpAwAQDiACIAVBA3RqKQMAEA5BAhDbAUUNAQwDCwsgBCABNwMQCyABIAcgASAHVRshBgNAIAEgBlENAiAAIAkgARBgIgcQDA0DIAFCAXwhASAAIAMpAwAQDiAHQQIQ2wFFDQALC0KBgICAECEIDAELQoCAgIAQIQgLIAAgCRALIARBIGokACAIC/8FAgJ/B34jAEHgAGsiBCQAQoCAgIAwIQcgBEKAgICAMDcDMCAEQoCAgIAwNwMoIARCgICAgDA3AyAgBEKAgICAMDcDGCAEIARByABqNgJAIAQgAEEvEDI3AzggACAEQcgAakEAEEMaIAQgABBPIgY3AyBCgICAgOAAIQkCQAJAIAYQDA0AAkAgACACEDsEQCAEIAI3AxgMAQsgACACEMABIgVBAEgNASAFRQ0AIAQgABBPIgY3AyggBhAMDQEgACAEQQhqIAIQQA0BIAQpAwgiBkIAIAZCAFUbIQsDQCAIIAtRDQEgBCAAIAIgCBBgIgY3AxAgBhAMDQICQAJAAkAgBhAhBEAgBqcvAQZB/v8DcUEERw0CIAQgACAGED4iBjcDECAGEAxFDQEMBgsgBhCMAQRAIAQgACAGED4iBjcDECAGEAxFDQEMBgsgBhCbAUUNAQsgACAEKQMoQQEgBEEQahDvAyIMEAwEQCAAIAYQCwwFCyAAIAwQLQ0AIAAgBCkDKCAKIAYQjQEaIApCAXwhCgwBCyAAIAYQCwsgCEIBfCEIDAALAAsCQCADEA4iBhAhRQ0AAkACQAJAIAanLwEGQXxqDgIAAQILIAAgBhCdASEGDAELIAAgBhA+IQYLIAYQDEUNACAAIAYQCwwBCyAEAn4gBhCMAQRAIAAgBEEEaiAGQQpBABBhDQIgAEHbGiAEKAIEEPwBDAELIAYQmwEEQCAAIAanIgVBACAFKAIEQf////8HcUEKELEBEJoBDAELIAQpAzgQDgsiAjcDMCAAIAYQCyACEAwNACAAED0iBxAMDQAgACAHQS8gARAOIgFBBxAaQQBIDQAgACAEQRhqIAcgARAOIAQpAzgiAhDtAyIBEAwNACABEBEEQEKAgICAMCEJDAELIAAgBEEYaiABIAIQ7AMNACAEKAJAEDghCQwBCyAEKAJAEEULIAAgBxALIAAgBCkDOBALIAAgBCkDMBALIAAgBCkDKBALIAAgBCkDIBALIARB4ABqJAAgCQsNACAAIAEgAiADEKYIC0ABAX8jAEEQayICJAACfyABIAAoAhBHBEAgAiABNgIAIABB/dYAIAIQFEF/DAELIAAQrgELIQAgAkEQaiQAIAAL4QQCBH8CfiMAQRBrIgMkACAAKAIAIQICQAJAAkACQAJAAkACQAJAAkACQCAAKAIQIgFBgAFqDgQCAQUDAAsgAUGqf0YNAyABQdsARwRAIAFB+wBHDQVCgICAgCAhBSAAEK4BDQggAhA9IgUQDA0IAkAgACgCECIBQf0ARg0AA0ACQCABQYF/RgRAIAIgACkDIBA6IgENAQwMCyABQYN/Rw0KIAAoAkxFDQogAiAAKAIgEBghAQsCQAJAIAAQrgENACAAQToQ8gMNACAAEPMDIgYQDEUNAQsgAiABEBIMCwsgAiAFIAEgBkEHEBohBCACIAEQEiAEQQBIDQogACgCEEEsRw0BIAAQrgENCiAAKAJMRSAAKAIQIgFB/QBHcg0ACwsgAEH9ABDyAw0IDAkLQoCAgIAgIQUgABCuAQ0HIAIQTyIFEAwNBwJAIAAoAhBB3QBGDQBBACEBA0AgABDzAyIGEAwNCSACIAUgASAGQQcQnAFBAEgNCSAAKAIQQSxHDQEgABCuAQ0JIAFBAWohASAAKAJMRQ0AIAAoAhBB3QBHDQALCyAAQd0AEPIDDQcMCAsgACkDIBAOIQUgABCuAQ0GDAcLIAApAyAhBSAAEK4BDQUMBgsgACgCIEF/aiIBQQJLDQEgAUEDdEGA3AFqKQMAIQUgABCuAQ0EDAULIABBzNYAQQAQFAwBCyAAKAI4IQEgAyAAKAIYIgQ2AgQgAyABIARrNgIAIABB5NYAIAMQFAtCgICAgCAhBQwBCyAAQbTWAEEAEBQLIAIgBRALQoCAgIDgACEFCyADQRBqJAAgBQsOACAAKAIQKAKMASkDCAtHAgF/AX4gARAhRQRAQQAPC0F/IQIgACABQcQBIAFBABATIgMQDAR/QX8FIAMQEUUEQCAAIAMQLQ8LIAAgAUEAENkBQQBHCwuuAgIGfwF+IwBB4ABrIgMkAAJAIAIQEUUEQEKAgICA4AAhCSAAIANB3ABqIAIQjgIiB0UNASADKAJcIQgDQCAFIAhHBEACQCAFIAdqLAAAQZl/akEfdyIGQQlLQcsFIAZ2QQFxRXJFBEAgBkECdEHU2wFqKAIAIgYgBHFFDQELIAAgBxA3IABB584AQQAQywIMBAsgBUEBaiEFIAQgBnIhBAwBCwsgACAHEDcLQoCAgIDgACEJIAAgA0HcAGogASAEQQR2QX9zQQFxEJMEIgVFDQAgA0HYAGogA0EQaiAFIAMoAlwgBCAAEM8JIQQgACAFEDcgBEUEQCADIANBEGo2AgAgAEGIzwAgAxDLAgwBCyAAIAQgAygCWBDQAiEJIAAgBBAZCyADQeAAaiQAIAkLDgAgACgCECABIAIQ5AELegIDfwF+IAEpAlQiBUI4hkI4h6dFBEAgASAFQoB+g0IBhDcCVANAIAMgASgCFE4EQEEADwsgACABKAIEIAEoAhAgA0EDdGoiAigCABCoCCIERQRAQX8PCyACIAQ2AgQgA0EBaiEDQX8hAiAAIAQQ+ANBf0oNAAsLIAILcAEBf0HGACECAkACQAJAAkACQAJAAkACQAJAIAEQVEEIag4QBgEHBwcHBwIIAAUDBwcHCAcLQccADwtByAAPCyABpywABUEATg0BC0HFAA8LQRshAiAAIAEQOw0DC0HJAA8LQcoADwtBzAAhAgsgAgvrAwIDfwF+IwBBIGsiBiQAIAEQDiEBAkACQAJAAkACQANAAkACQAJAIAGnIgctAAVBBHFFDQAgACgCECgCRCAHLwEGQRhsaigCFCIIRQ0AIAgoAhgiCEUNACAAIAEgAiADIAQgBSAIESwAIQcMAQsgACAGIAcgAhBTIgdBf0oNAQsgACABEAsMBQsCQCAHBEAgBi0AAEEQcQRAIABBACAGKQMYIgmnIAkQERsgBCADIAUQmQMhByAAIAYpAxAQCyAAIAYpAxgQCyAAIAEQCwwICyAAIAYpAwgQCyAGLQAAQQJxDQEgACABEAsMAwsgACABEJcCIgEQJ0UNAQsLIAAgARALIAQQIUUEQCAAIAMQCyAAIAVBzcsAEHYhBwwFCyAAIAYgBKciCCACEFMiB0F/TA0DIAdFDQIgBi0AAEEQcQRAIAAgBikDEBALIAAgBikDGBALIAAgAxALIAAgBUHnywAQdiEHDAULIAAgBikDCBALIAYtAABBAnFFDQAgCC8BBkELRw0BCyAAIAMQCyAAIAUgAhDcASEHDAMLIAAgBCACIANCgICAgDBCgICAgDBBgMAAEHUhBwwBCyAAIAggAiADQoCAgIAwQoCAgIAwIAVBh84AchCHBCEHCyAAIAMQCwsgBkEgaiQAIAcLYwECfwJAIAFCgICAgHBUDQAgAaciAy8BBhD1AUUNACADKAIgLQARQQhxRQ0AIAMoAigiBARAIAAgBK1CgICAgHCEEAsLQQAhACADIAJCgICAgHBaBH8gAhAOpwVBAAs2AigLC8YBAQN/IAFBHGohBCABQRhqIQYDQCAGIAQoAgAiBEcEQAJAIARBfmovAQAgAkcNACAEQXhqIgUtAAVBAXZBAXEgA0cNACAFIAUoAgBBAWo2AgAgBQ8LIARBBGohBAwBCwsgAEEgEC4iAEUEQEEADwsgAEEBNgIAIAAgAjsBBiAAIAAtAAVB/AFxIANBAXRBAnFyOgAFIABBCGogBhBNIAFBEEEUIAMbaigCACEBIABCgICAgDA3AxggACABIAJBA3RqNgIQIAALpgICBX8BfiMAQRBrIgYkAAJAIAJC/////29YBEAgAEGYyABBABAVDAELIAAgBkEMaiACENgBDQAgBigCDCIEQYGABE8EQCAAQaXIAEEAEEIMAQsgAEEBIARBASAESxtBA3QQayIFRQ0AAkACQCACpyIHLwEGIgNBCEdBACADQQJHGw0AIActAAVBCHFFDQAgBCAHKAIoRw0AQQAhAwNAIAMgBEYNAiAFIANBA3QiAGogBygCJCAAaikDABAONwMAIANBAWohAwwACwALQQAhAwNAIAMgBEYNASAAIAIgAxB4IggQDARAIAAgBSADEI8DQQAhAwwDBSAFIANBA3RqIAg3AwAgA0EBaiEDDAELAAsACyABIAQ2AgAgBSEDCyAGQRBqJAAgAwuFAgICfwJ+QoCAgIDgACEJAkAgABB+DQACQAJAIAFCgICAgHBaBEAgAaciBi0ABUEQcUUEQCAAQcnMAEEAEBVCgICAgOAADwsgBUEBciEFIAYvAQYiB0ENRg0CIAAoAhAoAkQgB0EYbGooAhAiBg0BCyAAQY/EAEEAEBVCgICAgOAADwsgACABIAIgAyAEIAUgBhEXAA8LIAYoAiAtABFBBHEEQCAAIAFCgICAgDAgAiADIAQgBRDfAQ8LIAAgAkEBEG0iCBAMDQACQCAAIAEgCCACIAMgBCAFEN8BIgFC/////29YBEAgARAMRQ0BCyAAIAgQCyABDwsgACABEAsgCCEJCyAJC9ABAgF/AX4CQAJAIAAgAaciBC8AEUEDdkEGcUGQxwBqLwEAEKEBIgUQDARADAELAkAgACAFIAQgAiADEIQFIgEQDA0AIAAgASAEKAIcIgJBLyACGyAELwEsEKADIAQvABEiAkEQcQRAIAAgACgCKEGQA0HAAiACQTBxQTBGG2opAwAQUiIFEAwNASAAIAFBOyAFQQIQGhogAQ8LIAJBAXFFDQIgAUEBEKgDIAAgAUE7QQBBAEECEIoDGiABDwsLIAAgARALQoCAgIDgACEBCyABCw0AIAAgASACEA4QsQULNQECfwJAIABCgICAgHBUDQAgAKciBC8BBkEMRw0AIAQoAiQgAUcNACAELgEqIAJGIQMLIAMLTwEDfyAAKALUASABKAIUIAAoAsgBEMwCQQJ0aiECA0AgAiIDKAIAIgRBKGohAiABIARHDQALIAMgASgCKDYCACAAIAAoAtABQX9qNgLQAQsXACAAKAIgKAIUIAAvAQZBmR5qLQAAdgsYACAAIABBCHZBB3EiAHEgAEF/cyABcXIL2QQBB38jAEEQayIFJAACQAJAA0AgASgCECIEIAQoAhggAnFBf3MiCEECdGooAgAhBkEAIQMgBBAoIQcDQCAGBEAgBSAHIAZBf2oiCUEDdGoiBDYCDCAEKAIAIQYgAiAEKAIERgRAQQAhBCAGQYCAgCBxRQ0FQX8hBCAAIAEgBUEMahDgAQ0FIAEoAhAhAgJAIAMEQCACECggAyAHa0EDdUEAIAMbQQN0aiIDIAMoAgBBgICAYHEgBSgCDCgCAEH///8fcXI2AgAgBSgCDCEDDAELIAhBAnQgAmogBSgCDCIDKAIAQf///x9xNgIAC0EBIQQgAiACKAIkQQFqNgIkIAAoAhAgASgCFCAJQQN0aiIGIAMoAgBBGnYQswUgACAFKAIMKAIEEBIgBSgCDCIDIAMoAgBB////H3E2AgAgBSgCDEEANgIEIAZCgICAgDA3AwAgAigCJCIDQQhIDQUgAyACKAIgQQF2SQ0FIAAgARDbCAwFBSAGQf///x9xIQYgBCEDDAILAAsLQQEhBCABLQAFIgNBBHFFDQIgA0EIcUUNASAAIAVBCGogAhCzAUUNAiAFKAIIIgMgASgCKCIGTw0CIAEvAQYiBEEIRiAEQQJGckUEQEEAIQQMAwsgBkF/aiADRgRAIAAgASgCJCADQQN0aikDABALIAEgAzYCKEEBIQQMAwsgACABEJcDRQ0AC0F/IQQMAQsgACgCECgCRCABLwEGQRhsaigCFCIDRQ0AIAMoAggiA0UNACAAIAGtQoCAgIBwhCACIAMREgAhBAsgBUEQaiQAIAQLkwEBBX8jAEEgayIEJAAgA0EAIANBAEobIQdBACEDA0ACQCADIAdGBEBBACEFDAELIARBADYCGCAEQgA3AxAgBEIANwMIIAQgASADQQxsaiIGKAIENgIMIAQgBigCCDYCECACIANqIQhBfyEFIANBAWohAyAAIAggBEEIaiAGKAIAEMIIQX9KDQELCyAEQSBqJAAgBQv0BAIDfwF+IwBBEGsiCCQAAkACQAJAAkACQCABLQAFIgdBBHFFDQAgAS8BBiIJQQJGBEACQCAHQQhxBEACQCACEF0EQCAIIAIQeSIJNgIMIAkgASgCKEcNASAHQQFxRQ0GIAZBgDBxDQEgBkEAEIQEQQdHDQEgACABIAMQDiAGEIgEIQcMCQsgACAIQQxqIAIQswFFDQQLQX8hByAAIAEQlwNFDQEMBwsgACAIQQxqIAIQswFFDQILIAAgCEEIaiABKAIUIgkpAwAQxQEaIAgoAgxBAWoiByAIKAIITQ0BIAEoAhAQKC0AA0EIcUUEQCAAIAZBMBDcASEHDAYLIAggBzYCCCAAIAkgB0EATgR+IAetBSAHuBAWCxAfDAELIAlBa2pB//8DcUEITQRAIAAgAhCbAyIHRQ0BIAdBAEgNBCAAIAZBhsEAEHYhBwwFCyAGQYCACHENACAAKAIQKAJEIAlBGGxqKAIUIgdFDQAgAa1CgICAgHCEIQogBygCDCIHBEAgACAKIAIgAyAEIAUgBiAHEScAIQcMBQsgACAKEJ8BIgdBAEgNAyAHRQ0BCyABLQAFQQFxDQELIAAgBkGiFxB2IQcMAgsgACABIAIgBkEFcUEQciAGQQdxIAZBgDBxIgIbEH8iAUUNACACBEAgAUEANgIAAkAgBkGAEHFFDQAgACAEEDtFDQAgASAEEA4+AgALIAFBADYCBEEBIQcgBkGAIHFFDQIgACAFEDtFDQIgASAFEA4+AgQMAgsCQCAGQYDAAHEEQCABIAMQDjcDAAwBCyABQoCAgIAwNwMAC0EBIQcMAQtBfyEHCyAIQRBqJAAgBwuSAQIDfwF+IAEoAhQiBSkDACIHQv////8PViABKAIoIgZBAWoiBCAHp01yRQRAIAEoAhAQKC0AA0EIcUUEQCAAIAIQCyAAIANBMBDcAQ8LIAUgBK03AwALAkAgBCABKAIgTQ0AIAAgASAEELcFRQ0AIAAgAhALQX8PCyABKAIkIAZBA3RqIAI3AwAgASAENgIoQQELCwAgACABQQEQkgQLOQEBfyABQoCAgIBwVARAQQAPCyABpyICLwEGQSlGBEAgACABEOQIDwsgAiACLQAFQf4BcToABUEBCy4BAX8gAKcpAyAiAEKAgICAcINCgICAgJB/UQR/IACnKAIEQf////8HcQVBAAsLBABBAAsKACAAKAIAQXxxCzMAIAAgAkEBEPoBIgBFBEBCgICAgOAADwsgAEEQaiABIAJBAXQQJBogAK1CgICAgJB/hAtlAgJ/AX5BBCECQoCAgIAgIQQCQAJAAkACQAJAAkAgARBUIgNBCGoOCgMCBQUFBQUFBAEACyADQQdGDQMMBAtBBiECDAILQQUhAgwBC0EHIQILIAAoAiggAkEDdGopAwAhBAsgBAtfAQF8IAApAgRC//////////8/WARAIAEgASsDCEQAAAAAAADwPyAAKAIAtyICo6A5AwggASABKwMQIAAoAgQiAEH/////B3EgAEEfdiIAdCAAa0ERarggAqOgOQMQCwvaAwEFfwJAAkACQAJAAkACQAJAAkACQCABLQAEQQ9xDgYAAQQCAwYFCyAAIAEoAhAiBiACEQMAIAYQKCEFA0AgAyAGKAIgSARAAkAgBSgCBEUNACABKAIUIANBA3RqIQQCQAJAAkACQCAFKAIAQR52QQFrDgMAAQIDCyAEKAIAIgcEQCAAIAcgAhEDAAsgBCgCBCIERQ0DIAAgBCACEQMADAMLIAQoAgAiBC0ABUEBcUUNAiAAIAQgAhEDAAwCCyAAIAQQjQQgAhEDAAwBCyAAIAQpAwAgAhAiCyADQQFqIQMgBUEIaiEFDAELCyABLwEGIgNBAUYNBiAAKAJEIANBGGxqKAIMIgNFDQYgACABrUKAgICAcIQgAiADEREADwsDQCADIAEoAjhIBEAgACABKAI0IANBA3RqKQMAIAIQIiADQQFqIQMMAQsLIAEoAjAiAUUNBSAAIAEgAhEDAA8LIAEtAAVBAXFFDQUgACABKAIQKQMAIAIQIg8LIAEoAiAEQCAAIAFBKGogAhDgAwsgACABKQMQIAIQIiAAIAEpAxggAhAiDwsgASgCLCIBRQ0CIAAgASACEQMADwsQAQALIAAgASACEPYHCw8LQbM5QaENQY4sQcg5EAAAC4kCAgJ/AX4jAEEwayIDJABBoRkhBEKAgICA4AAhBQJAAkACQAJAAkACQAJAAkACQAJAAkACQCABEFRBCGoOEAUGCQkJCQoEAAECAwkJCwgJCyADIAE+AgAgA0EQakEgQZ4ZIAMQVRogA0EQaiEEDAkLIABBA0ECIAGnGxAyIQUMCQsgAEEBEDIhBQwICyAAQcUAEDIhBQwHCyAAIAFBABCSAyIBEAwEQCABIQUMBwsgACABIAIQkgQhBSAAIAEQCwwGCyACRQ0BCyABEA4hBQwECyAAQbUZQQAQFQwDCyAAIAEQSkEKQQBBABDEAiEFDAILQdUZIQQLIAAgBBByIQULIANBMGokACAFC6YEAQl/AkACQAJAIAJCgICAgHCDQoCAgICQf1IEQCAAIAIQLCICEAxFDQEMAgsgAhAOIQILIAKnIgooAgQiBUH/////B3EhBgJAIAVBAE4EQCAKQRBqIQVBACEDA0AgBCAGRkUEQCADIAQgBWotAABBB3ZqIQMgBEEBaiEEDAELCyADRQRAIAFFDQQgASAGNgIAIAUPCyAAIAMgBmpBABD6ASIHRQ0CQQAhAyAHQRBqIgshBANAIAMgBkYNAgJ/IAMgBWosAAAiCEEATgRAIAQgCDoAACAEQQFqDAELIAQgCEE/cUGAAXI6AAEgBCAIQcABcUEGdkHAAXI6AAAgBEECagshBCADQQFqIQMMAAsACyAAIAZBA2xBABD6ASIHRQ0BQQAhBSAHQRBqIgshBANAIAUiCCAGTg0BIAhBAWohBSAKIAhBAXRqLwEQIglB/wBNBEAgBCAJOgAAIARBAWohBAUCQCAJQYD4A3FBgLADRyADciAFIAZOcg0AIAogBUEBdGovARAiDEGA+ANxQYC4A0cNACAJQQp0QYD4P3EgDEH/B3FyQYCABGohCSAIQQJqIQULIAQgCRCyAyAEaiEECwwACwALIARBADoAACAHIAQgB2tBcGpB/////wdxrSAHKQIEQoCAgIB4g4Q3AgQgACACEAsgAQRAIAEgBygCBEH/////B3E2AgALIAsPCyABRQRAQQAPC0EAIQUgAUEANgIACyAFCyUCAX8BfiAAIAEQMiIDEAxFBEAgACADELgBIQIgACADEAsLIAILPQEBfyABIAEoAgAiAkF/ajYCACACQQFMBEAgASkCBEKAgICAgICAgMAAWgRAIAAgARCiAw8LIAAgARAgCwtVAQJ/IwBBEGsiAiQAIAAoAhAhAAJ/AkAgAkEMaiABEMwFRQ0AIAIoAgwiA0EASA0AIAAgARCVBCADEJEBDAELIAAgAUEBEM8CCyEBIAJBEGokACABCwwAIAEgACgCDBEEAAtcAQN/IABB4AFqIQQgACgC5AEhAwNAIAQgAyICRwRAIAIoAgQhAwJAAkACQCABDgMCAAEECyACLABMDQMMAQsgAikCTEIghkI4h6cNAgsgACACQXhqEM4FDAELCwvBAQEDfwJAIAIoAhAiAwR/IAMFIAIQ0wUNASACKAIQCyACKAIUIgVrIAFJBEAgAiAAIAEgAigCJBEAAA8LAkAgAiwAS0EASARAQQAhAwwBCyABIQQDQCAEIgNFBEBBACEDDAILIAAgA0F/aiIEai0AAEEKRw0ACyACIAAgAyACKAIkEQAAIgQgA0kNASAAIANqIQAgASADayEBIAIoAhQhBQsgBSAAIAEQJBogAiACKAIUIAFqNgIUIAEgA2ohBAsgBAtAAQF/IwBBEGsiBSQAIAUgASACIAMgBEKAgICAgICAgIB/hRB6IAAgBSkDADcDACAAIAUpAwg3AwggBUEQaiQACyUBAX8gAEIANwNwIAAgACgCCCIBIAAoAgRrrDcDeCAAIAE2AmgLEAAgACABIAJBAEEAEJ4EGgugEQIPfwF+IwBB0ABrIgckACAHIAE2AkwgB0E3aiEVIAdBOGohE0EAIQECQANAAkAgEEEASA0AIAFB/////wcgEGtKBEBBlKcEQT02AgBBfyEQDAELIAEgEGohEAsgBygCTCIMIQECQAJAAkAgDC0AACIIBEADQAJAAkAgCEH/AXEiCEUEQCABIQgMAQsgCEElRw0BIAEhCANAIAEtAAFBJUcNASAHIAFBAmoiCjYCTCAIQQFqIQggAS0AAiELIAohASALQSVGDQALCyAIIAxrIQEgAARAIAAgDCABEGMLIAENBiAHKAJMLAABEEYhASAHKAJMIQggBwJ/AkAgAUUNACAILQACQSRHDQAgCCwAAUFQaiESQQEhFCAIQQNqDAELQX8hEiAIQQFqCyIBNgJMQQAhEQJAIAEsAAAiDUFgaiIKQR9LBEAgASEIDAELIAEhCEEBIAp0IgtBidEEcUUNAANAIAcgAUEBaiIINgJMIAsgEXIhESABLAABIg1BYGoiCkEgTw0BIAghAUEBIAp0IgtBidEEcQ0ACwsCQCANQSpGBEAgBwJ/AkAgCCwAARBGRQ0AIAcoAkwiAS0AAkEkRw0AIAEsAAFBAnQgBGpBwH5qQQo2AgAgASwAAUEDdCADakGAfWooAgAhDkEBIRQgAUEDagwBCyAUDQZBACEUQQAhDiAABEAgAiACKAIAIgFBBGo2AgAgASgCACEOCyAHKAJMQQFqCyIBNgJMIA5Bf0oNAUEAIA5rIQ4gEUGAwAByIREMAQsgB0HMAGoQ5AUiDkEASA0EIAcoAkwhAQtBfyEJAkAgAS0AAEEuRw0AIAEtAAFBKkYEQAJAIAEsAAIQRkUNACAHKAJMIgEtAANBJEcNACABLAACQQJ0IARqQcB+akEKNgIAIAEsAAJBA3QgA2pBgH1qKAIAIQkgByABQQRqIgE2AkwMAgsgFA0FIAAEfyACIAIoAgAiAUEEajYCACABKAIABUEACyEJIAcgBygCTEECaiIBNgJMDAELIAcgAUEBajYCTCAHQcwAahDkBSEJIAcoAkwhAQtBACEIA0AgCCELQX8hDyABLAAAQb9/akE5Sw0IIAcgAUEBaiINNgJMIAEsAAAhCCANIQEgCCALQTpsakG/ngRqLQAAIghBf2pBCEkNAAsCQAJAIAhBE0cEQCAIRQ0KIBJBAE4EQCAEIBJBAnRqIAg2AgAgByADIBJBA3RqKQMANwNADAILIABFDQggB0FAayAIIAIgBhDjBSAHKAJMIQ0MAgsgEkF/Sg0JC0EAIQEgAEUNBwsgEUH//3txIgogESARQYDAAHEbIQhBACEPQeCeBCESIBMhEQJAAkACQAJ/AkACQAJAAkACfwJAAkACQAJAAkACQAJAIA1Bf2osAAAiAUFfcSABIAFBD3FBA0YbIAEgCxsiAUGof2oOIQQUFBQUFBQUFA4UDwYODg4UBhQUFBQCBQMUFAkUARQUBAALAkAgAUG/f2oOBw4UCxQODg4ACyABQdMARg0JDBMLIAcpA0AhFkHgngQMBQtBACEBAkACQAJAAkACQAJAAkAgC0H/AXEOCAABAgMEGgUGGgsgBygCQCAQNgIADBkLIAcoAkAgEDYCAAwYCyAHKAJAIBCsNwMADBcLIAcoAkAgEDsBAAwWCyAHKAJAIBA6AAAMFQsgBygCQCAQNgIADBQLIAcoAkAgEKw3AwAMEwsgCUEIIAlBCEsbIQkgCEEIciEIQfgAIQELIAcpA0AgEyABQSBxEJoJIQwgCEEIcUUNAyAHKQNAUA0DIAFBBHZB4J4EaiESQQIhDwwDCyAHKQNAIBMQmQkhDCAIQQhxRQ0CIAkgEyAMayIBQQFqIAkgAUobIQkMAgsgBykDQCIWQn9XBEAgB0IAIBZ9IhY3A0BBASEPQeCeBAwBCyAIQYAQcQRAQQEhD0HhngQMAQtB4p4EQeCeBCAIQQFxIg8bCyESIBYgExChAiEMCyAIQf//e3EgCCAJQX9KGyEIIAkgBykDQCIWUEVyRQRAQQAhCSATIQwMDAsgCSAWUCATIAxraiIBIAkgAUobIQkMCwsgBygCQCIBQeqeBCABGyIMQQAgCRCAAiIBIAkgDGogARshESAKIQggASAMayAJIAEbIQkMCgsgCQRAIAcoAkAMAgtBACEBIABBICAOQQAgCBBzDAILIAdBADYCDCAHIAcpA0A+AgggByAHQQhqNgJAQX8hCSAHQQhqCyELQQAhAQJAA0AgCygCACIKRQ0BIAdBBGogChDmBSIMQQBIIgogDCAJIAFrS3JFBEAgC0EEaiELIAkgASAMaiIBSw0BDAILC0F/IQ8gCg0LCyAAQSAgDiABIAgQcyABRQRAQQAhAQwBC0EAIQ0gBygCQCELA0AgCygCACIKRQ0BIAdBBGogChDmBSIKIA1qIg0gAUoNASAAIAdBBGogChBjIAtBBGohCyANIAFJDQALCyAAQSAgDiABIAhBgMAAcxBzIA4gASAOIAFKGyEBDAgLIAAgBysDQCAOIAkgCCABIAURQQAhAQwHCyAHIAcpA0A8ADdBASEJIBUhDCAKIQgMBAsgByABQQFqIgo2AkwgAS0AASEIIAohAQwACwALIBAhDyAADQQgFEUNAkEBIQEDQCAEIAFBAnRqKAIAIgAEQCADIAFBA3RqIAAgAiAGEOMFQQEhDyABQQFqIgFBCkcNAQwGCwtBASEPIAFBCk8NBANAIAQgAUECdGooAgANASABQQFqIgFBCkcNAAsMBAtBfyEPDAMLIABBICAPIBEgDGsiCyAJIAkgC0gbIgpqIg0gDiAOIA1IGyIBIA0gCBBzIAAgEiAPEGMgAEEwIAEgDSAIQYCABHMQcyAAQTAgCiALQQAQcyAAIAwgCxBjIABBICABIA0gCEGAwABzEHMMAQsLQQAhDwsgB0HQAGokACAPC/sCAQN/IwBB0AFrIgUkACAFIAI2AswBQQAhAiAFQaABakEAQSgQTBogBSAFKALMATYCyAECQEEAIAEgBUHIAWogBUHQAGogBUGgAWogAyAEEJ0EQQBIBEBBfyEBDAELIAAoAkxBAE4EQEEBIQILIAAoAgAhBiAALABKQQBMBEAgACAGQV9xNgIACyAGQSBxIQcCfyAAKAIwBEAgACABIAVByAFqIAVB0ABqIAVBoAFqIAMgBBCdBAwBCyAAQdAANgIwIAAgBUHQAGo2AhAgACAFNgIcIAAgBTYCFCAAKAIsIQYgACAFNgIsIAAgASAFQcgBaiAFQdAAaiAFQaABaiADIAQQnQQiASAGRQ0AGiAAQQBBACAAKAIkEQAAGiAAQQA2AjAgACAGNgIsIABBADYCHCAAQQA2AhAgACgCFCEDIABBADYCFCABQX8gAxsLIQEgACAAKAIAIgAgB3I2AgBBfyABIABBIHEbIQEgAkUNAAsgBUHQAWokACABC2kBAn8CQCAAKAIUIAAoAhxNDQAgAEEAQQAgACgCJBEAABogACgCFA0AQX8PCyAAKAIEIgEgACgCCCICSQRAIAAgASACa6xBASAAKAIoERAAGgsgAEEANgIcIABCADcDECAAQgA3AgRBAAsgAQF+IAAgACACIAFBAUECQQAQygEiBCABIAMQzAEgBAuFBAMCfwF+A3wgAL0iA0IgiKdB/////wdxIgFBgIDAoARJBEACQAJ/IAFB///v/gNNBEAgAUGAgIDyA0kNAkF/IQFBAQwBCyAAmSEAAnwgAUH//8v/A00EQCABQf//l/8DTQRAIAAgAKBEAAAAAAAA8L+gIABEAAAAAAAAAECgoyEAQQAhAUEADAMLQQEhASAARAAAAAAAAPC/oCAARAAAAAAAAPA/oKMMAQsgAUH//42ABE0EQEECIQEgAEQAAAAAAAD4v6AgAEQAAAAAAAD4P6JEAAAAAAAA8D+gowwBC0EDIQFEAAAAAAAA8L8gAKMLIQBBAAshAiAAIACiIgUgBaIiBCAEIAQgBCAERC9saixEtKK/okSa/d5SLd6tv6CiRG2adK/ysLO/oKJEcRYj/sZxvL+gokTE65iZmZnJv6CiIQYgBSAEIAQgBCAEIAREEdoi4zqtkD+iROsNdiRLe6k/oKJEUT3QoGYNsT+gokRuIEzFzUW3P6CiRP+DAJIkScI/oKJEDVVVVVVV1T+goiEEIAIEQCAAIAAgBiAEoKKhDwsgAUEDdCIBQeCcBGorAwAgACAGIASgoiABQYCdBGorAwChIAChoSIAIACaIANCf1UbIQALIAAPCyAARBgtRFT7Ifk/IACmIAC9Qv///////////wCDQoCAgICAgID4/wBWGwvMCQMFfwF+BHwjAEEwayIEJAACQAJAAkAgAL0iB0IgiKciAkH/////B3EiA0H61L2ABE0EQCACQf//P3FB+8MkRg0BIANB/LKLgARNBEAgB0IAWQRAIAEgAEQAAEBU+yH5v6AiAEQxY2IaYbTQvaAiCDkDACABIAAgCKFEMWNiGmG00L2gOQMIQQEhAgwFCyABIABEAABAVPsh+T+gIgBEMWNiGmG00D2gIgg5AwAgASAAIAihRDFjYhphtNA9oDkDCEF/IQIMBAsgB0IAWQRAIAEgAEQAAEBU+yEJwKAiAEQxY2IaYbTgvaAiCDkDACABIAAgCKFEMWNiGmG04L2gOQMIQQIhAgwECyABIABEAABAVPshCUCgIgBEMWNiGmG04D2gIgg5AwAgASAAIAihRDFjYhphtOA9oDkDCEF+IQIMAwsgA0G7jPGABE0EQCADQbz714AETQRAIANB/LLLgARGDQIgB0IAWQRAIAEgAEQAADB/fNkSwKAiAETKlJOnkQ7pvaAiCDkDACABIAAgCKFEypSTp5EO6b2gOQMIQQMhAgwFCyABIABEAAAwf3zZEkCgIgBEypSTp5EO6T2gIgg5AwAgASAAIAihRMqUk6eRDuk9oDkDCEF9IQIMBAsgA0H7w+SABEYNASAHQgBZBEAgASAARAAAQFT7IRnAoCIARDFjYhphtPC9oCIIOQMAIAEgACAIoUQxY2IaYbTwvaA5AwhBBCECDAQLIAEgAEQAAEBU+yEZQKAiAEQxY2IaYbTwPaAiCDkDACABIAAgCKFEMWNiGmG08D2gOQMIQXwhAgwDCyADQfrD5IkESw0BCyABIAAgAESDyMltMF/kP6JEAAAAAAAAOEOgRAAAAAAAADjDoCIJRAAAQFT7Ifm/oqAiCCAJRDFjYhphtNA9oiILoSIAOQMAIANBFHYiBSAAvUI0iKdB/w9xa0ERSCEDAn8gCZlEAAAAAAAA4EFjBEAgCaoMAQtBgICAgHgLIQICQCADDQAgASAIIAlEAABgGmG00D2iIgChIgogCURzcAMuihmjO6IgCCAKoSAAoaEiC6EiADkDACAFIAC9QjSIp0H/D3FrQTJIBEAgCiEIDAELIAEgCiAJRAAAAC6KGaM7oiIAoSIIIAlEwUkgJZqDezmiIAogCKEgAKGhIguhIgA5AwALIAEgCCAAoSALoTkDCAwBCyADQYCAwP8HTwRAIAEgACAAoSIAOQMAIAEgADkDCEEAIQIMAQsgB0L/////////B4NCgICAgICAgLDBAIS/IQBBACECQQEhBQNAIARBEGogAkEDdGoCfyAAmUQAAAAAAADgQWMEQCAAqgwBC0GAgICAeAu3Igg5AwAgACAIoUQAAAAAAABwQaIhAEEBIQIgBUEBcSEGQQAhBSAGDQALIAQgADkDIAJAIABEAAAAAAAAAABiBEBBAiECDAELQQEhBQNAIAUiAkF/aiEFIARBEGogAkEDdGorAwBEAAAAAAAAAABhDQALCyAEQRBqIAQgA0EUdkHqd2ogAkEBahCuCSECIAQrAwAhACAHQn9XBEAgASAAmjkDACABIAQrAwiaOQMIQQAgAmshAgwBCyABIAA5AwAgASAEKwMIOQMICyAEQTBqJAAgAgu5AwMCfwF+AnwgAL0iA0I/iKchAQJAAkACfAJAIAACfwJAAkAgA0IgiKdB/////wdxIgJBq8aYhARPBEAgAL1C////////////AINCgICAgICAgPj/AFYEQCAADwsgAETvOfr+Qi6GQGRBAXNFBEAgAEQAAAAAAADgf6IPCyAARFEwLdUQSYfAY0UgAETSvHrdKyOGwGNBAXNyDQEMBgsgAkHD3Nj+A0kNAyACQbLFwv8DSQ0BCyAARP6CK2VHFfc/oiABQQN0QfCFBGorAwCgIgCZRAAAAAAAAOBBYwRAIACqDAILQYCAgIB4DAELIAFBAXMgAWsLIgG3IgREAADg/kIu5r+ioCIAIAREdjx5Ne856j2iIgWhDAELIAJBgIDA8QNNDQJBACEBIAALIQQgACAEIAQgBCAEoiIAIAAgACAAIABE0KS+cmk3Zj6iRPFr0sVBvbu+oKJELN4lr2pWET+gokSTvb4WbMFmv6CiRD5VVVVVVcU/oKKhIgCiRAAAAAAAAABAIAChoyAFoaBEAAAAAAAA8D+gIQQgAUUNACAEIAEQyQEhBAsgBA8LIABEAAAAAAAA8D+gC0oBAn8CQCAALQAAIgJFIAIgAS0AACIDR3INAANAIAEtAAEhAyAALQABIgJFDQEgAUEBaiEBIABBAWohACACIANGDQALCyACIANrC2kBBH8gARBEIQMDQAJAIAAtAABFBEBBfyECDAELA0ACfyAAQSwQpwMiBEUEQCAAEEQMAQsgBCAAawsiBSADRgRAIAAgASADEHRFDQILIAAgBWpBAWohACAEDQALIAJBAWohAgwBCwsgAgtgAQF/IwBBIGsiAyQAIAMgACgCEDYCGCADIAApAgg3AxAgAyAAKQIANwMIIABBADYCCCAAQgA3AgAgACADKAIQIAMoAgggASACQQAQ2QIhACADQQhqEFYgA0EgaiQAIAALkgUBB38CQAJAIAFB/wBNBEAgAkUNASABQSBqIAEgAUG/f2pBGkkbIQEMAgsgAkEARyEIQegCIQUDQCADIAVKDQIgAyAFakEBdiIGQQJ0QcDnAWooAgAiB0EPdiIEIAFLBEAgBkF/aiEFDAELIAdBCHZB/wBxIARqIAFNBEAgBkEBaiEDDAELCyAHQQh0QYAecSIJIAZB8PIBai0AACIFciEDAkACQAJAAkACQAJAAkACQAJAIAdBBHYiB0EPcSIGDg0AAAAAAQIDBAUGBgcHCAsgAiAHQQFxR0EAIAJBAkcgBkECSXIbDQkgASAEayADQQJ0QcDnAWooAgBBD3ZqIQEMCQsgASAEayIDQQFxIAJBAEdGDQggA0EBcyAEaiEBDAgLIAEgBGsiBEEBRgRAQQFBfyACGyABaiEBDAgLIAQgAkVBAXRHDQdBAkF+IAIbIAFqIQEMBwsgASAEayEBIAJFBEAgAEGZBzYCBCAAIAEgA0EFdkH+AHFB4PUBai8BAGo2AgBBAg8LIAEgBUE/cUEBdEHg9QFqLwEAaiEBDAYLIAJBAUYNBSADIAJBAkZBBXRqIQEMBQsgAkEBRg0EIANBAXRB4PUBai8BACACQQJGaiEBDAQLIAZBd2ogCEcNAyADQQF0QeD1AWovAQAhAQwDCyAGQXVqIAJHDQIgACAFQT9xQQF0QeD1AWovAQA2AgQgACADQQV2Qf4AcUHg9QFqLwEAIAEgBGtqNgIAQQIPCyACDQEgACAJQQd2QeD1AWovAQA2AgAgACAFQQ9xQQF0QeD1AWovAQA2AgggACAFQQN2QR5xQeD1AWovAQA2AgRBAw8LIAFBYGogASABQZ9/akEaSRshAQsgACABNgIAQQELFwAgACABQf8BcRAPIAAgAkH//wNxEDEL7wQBBX8jAEEQayIFJAAgBSACKAIAIgY2AgwCQAJAAkACQAJAAkACQAJAIAYtAAAiBARAIARB3ABHDQUgBkEBaiIIIAAoAhxPDQEgBSAGQQJqNgIMAkACQAJAAkACQAJAAkACQAJAAkAgBi0AASIEQa1/ag4FBAEBAQYACwJAIARBnX9qDgIIBwALAkAgBEGNf2oOBQMBAQEFAAsgBEHEAEYNASAEQdAARiAEQfAARnINCAsgACgCKEEBdCEGDAsLQQEhBwwEC0ECIQcMAwtBAyEHDAILQQQhBwwBC0EFIQcLQX8hBCAAIAEgBxDGCQ0KDAQLAkAgBi0AAiIBQd8BcUG/f2pB/wFxQRpPBEAgACgCKCEEIANFIAFB3wBGIAFBUGpB/wFxQQpJckVyDQEgBA0HCyAFIAZBA2o2AgwgAUEfcSEEDAkLIAQNBSAFIAg2AgxB3AAhBAwICyAAKAIoRQRAQQAhBgwECyAEQdAARiEDQX8hBCAAIAEgBUEMaiADEMUJRQ0CDAgLQQAhBCAGIAAoAhxJDQULIABBrOMBQQAQP0F/IQQMBgtBgICAgAQhBAwECyAFIAg2AgwgBUEMaiAGEKMCIgFBf0oEQCABIQQMBAsCQCABQX5HDQAgBSgCDC0AACIBRQ0AQe7iASABQRAQgAINAgsgACgCKEUNAQsgAEH+4gFBABA/QX8hBAwDCyAFKAIMIQYgBEEYdEEYdUF/Sg0AIAZBBiAFQQxqEGUiBEGAgARJDQEgACgCKA0BIABBu+MBQQAQP0F/IQQMAgsgBSAGQQFqNgIMCyACIAUoAgw2AgALIAVBEGokACAECx8BAX8gACgCPCIBQX9MBH8gABD9BRogACgCPAUgAQsLpQIBBH8jAEEQayIEJAAgBCABKAIAIgU2AgwgAkEBdCEGIAAhAwJ/A0ACQAJAAkACfwJAAkAgBS0AACICQdwARwRAIAJBPkcNASAAIANGDQYgA0EAOgAAIAEgBCgCDEEBajYCAEEADAgLIAQgBUEBajYCDCAFLQABQfUARg0BDAULIAJBGHRBGHVBf0oNAiAFQQYgBEEMahBlDAELIARBDGogBhCjAgsiAkH//8MASw0CDAELIAQgBUEBajYCDAsCQCAAIANGBEAgAhC9AkUNAgwBCyACEL8BRQ0BCyADIABrQfkASg0AAn8gAkH/AE0EQCADIAI6AAAgA0EBagwBCyADIAIQsgMgA2oLIQMgBCgCDCEFDAELC0F/CyECIARBEGokACACCzEBAX9BASEBAkACQAJAIABBdmoOBAIBAQIACyAAQajAAEYNAQsgAEGpwABGIQELIAELqAIBA38CQAJAIAAoAjAiCUEBaiIKIAAoAiwiCE0EQCAAKAIoIQgMAQsgACgCICAAKAIoIAhBA2xBAXYiCEEIIAhBCEsbIgkgACgCJGwQ9wMiCEUEQEF/IQgMAgsgACAINgIoIAAgCTYCLCAAKAIwIglBAWohCgsgACAKNgIwIAggACgCJCAJbGoiCCAHNgIEIAggBjoAACAIIAQ2AgwgCCAFNgIIIAggAzoAASAIQRBqIQQgACgCDEEBdCEFQQAhAANAIAAgBUZFBEAgBCAAQQJ0IgZqIAEgBmooAgA2AgAgAEEBaiEADAELCyAEIAVBAnRqIQFBACEIQQAhAANAIAAgA0YNASABIABBAnQiBGogAiAEaigCADYCACAAQQFqIQAMAAsACyAIC2sAAkACQAJAAkACQCAAIAFyQQ9xDg8ABAMEAgQDBAEEAwQCBAMEC0HhAkHiAiABQRBGGw8LQeMCQeQCIAFBCEYbDwtB5QJB5gIgAUEERhsPC0HnAkHoAiABQQJGGw8LQekCQeoCIAFBAUYbC1IBAn8CfyAAKAIEIgMgAmoiBCAAKAIISwR/QX8gACAEEOcBDQEaIAAoAgQFIAMLIAAoAgAiA2ogASADaiACECQaIAAgACgCBCACajYCBEEACxoLDAAgACgCECABEOgDC1wBAX8CQCABQiCIpyICQX9HBEAgAkF4Rw0BIAEQDg8LIAGnIgIvAQZBB0cNACACKQMgIgFCgICAgHCDQoCAgICAf1INACABEA4PCyAAQeTJAEEAEBVCgICAgOAAC1IBBH8gBEEAIARBAEobIQhBACEEAkADQCAEIAhGDQEgAyAEaiEFIAIgBGohBiAEQQFqIQQgACAGEDAiBiABIAUQMCIFRg0ACyAGIAVrIQcLIAcLEABB4bEBIABBCxCAAkEARwteAQJ/QcCxASEDAkACQCABKAIEQf////8HcSIEIAJMDQAgASACEDBBJUcNAEHNsQEhAyACQQJqIARODQAgASACQQFqQQIQtgMiAkF/Sg0BCyAAIAMQtwNBfyECCyACC1cAIwBBEGsiAiQAAn5CgICAgOAAIAAgAkEIaiADKQMAEEgNABogAisDCL1CgICAgICAgPj/AINCgICAgICAgPj/AFKtQoCAgIAQhAshASACQRBqJAAgAQtXACMAQRBrIgIkAAJ+QoCAgIDgACAAIAJBCGogAykDABBIDQAaIAIrAwi9Qv///////////wCDQoCAgICAgID4/wBWrUKAgICAEIQLIQEgAkEQaiQAIAEL+AICA38DfiMAQTBrIggkACADQgAgA0IAVRshDSAFQX9qIQogBUEBSCEFQgAhAwNAAkAgAyANUQRAIAQhDAwBC0J/IQwgACACIAMgCEEoahCHASIJQQBIDQACQCAJRQ0AIAYQEUUEQCAIIAgpAyg3AwAgAyELIANCgICAgAhaBEAgA7kQFiELCyAIIAI3AxAgCCALNwMIIAggACAGIAdBAyAIECMiCzcDKCAAIAgpAwAQCyAAIAgpAwgQCyALEAwNAgsCQAJAAkAgBQ0AIAAgCCkDKCILEMABIglBAEgNASAJRQ0AIAAgCEEgaiALEEBBAEgNASAAIAEgCyAIKQMgIAQgCkKAgICAMEKAgICAMBC3BCIEQgBTDQEgACALEAsMAwsgBEL/////////D1MNASAAQfusAUEAEBUgCCkDKCELCyAAIAsQCwwCCyAAIAEgBCAIKQMoEG5BAEgNASAEQgF8IQQLIANCAXwhAwwBCwsgCEEwaiQAIAwLDAAgAEIAIABCAFUbCygAAkAgARARRQRAIAEQJ0UNAQsgACABED4PCyAAIAFBOEEAQQAQswILowICBn8BfiMAQTBrIgIkAAJAAkAgAykDACIBECFFDQBCgICAgOAAIQsgACABEIoEIgNBAEgNASADRQRAIABBq5wBQQAQFQwCCyAAIAJBLGogAkEoaiABpyIJQQMQjgENASACKAIsIQYgAigCKCEHQQAhAwJAA0AgAyAHRwRAIAYgA0EDdGooAgQhCEGAggEhBQJAIARFDQAgACACQQhqIAkgCBBTIgpBAEgNAyAKRQ0AIAIoAgghBSAAIAJBCGoQTkGAhgFBgIIBIAVBAnEbIQULIAAgASAIQoCAgIAwQoCAgIAwQoCAgIAwIAUQdUEASA0CIANBAWohAwwBCwsgACAGIAcQYgwBCyAAIAYgBxBiDAELIAEQDiELCyACQTBqJAAgCwvsAQEBfgJAAkAgARAnBEAgAEGApAEQciEEDAELIAEQEQRAIABBhaQBEHIhBAwBCyAAIAEQKiIBEAwNASAAIAEQwAEiA0F/TARAIAAgARALQoCAgIDgAA8LAn9BjQEgAw0AGkGXASAAIAEQOw0AGkGMASABpy8BBiIDQRJLQQEgA3RB+I4QcUVyDQAaIAAoAhAoAkQgA0EYbGooAgQLIQIgACABQckBIAFBABATIQQgACABEAtCgICAgOAAIQEgBBAMDQEgBBCbAQ0AIAAgBBALIAAgAhAyIQQLIABBj6QBIARBw8oAEL0BIQELIAELlgMBAX4jAEEgayICJAAgAykDACEBAkACQAJAIAQEQCABQv////9vWARAIAAQKQwDCyABEA4hBQwBCyAAIAEQKiIFIQEgBRAMDQILAkAgACADKQMIEDoiA0UNAEKAgICAMCEBAkACQCAFQoCAgIBwVA0AIAAgAiAFpyADEFMiBEEASA0CIARFDQAgABA9IgEQDA0BAkAgAi0AAEEQcQRAIAAgAUHBACACKQMQEA5Bh4ABEBpBAEgNAyAAIAFBwgAgAikDGBAOQYeAARAaQQBODQEMAwsgACABQcAAIAIpAwgQDkGHgAEQGkEASA0CIAAgAUE+IAI1AgBCAYhCAYNCgICAgBCEQYeAARAaQQBIDQILIAAgAUE/IAI1AgBCAohCAYNCgICAgBCEQYeAARAaQQBIDQEgACABQT0gAjUCAEIBg0KAgICAEIRBh4ABEBpBAEgNASAAIAIQTgsgACADEBIgACAFEAsMAwsgACACEE4gACABEAsLIAAgAxASIAAgBRALC0KAgICA4AAhAQsgAkEgaiQAIAELVQEBfyMAQSBrIgUkAAJAIAAgBSADEOsEQQBIBEBBfyECDAELIAAgASACIAUpAwggBSkDECAFKQMYIAUoAgAgBHIQdSECIAAgBRBOCyAFQSBqJAAgAgvxAQIGfwF+IwBBEGsiAyQAAkAgARAhRQRAIAAQKUF/IQQMAQtBfyEEIAAgAhAqIgkQDA0AAkAgACADQQxqIANBCGogCadBExCOAUF/TARAQoCAgIAwIQIgAygCCCEGIAMoAgwhBwwBC0EAIQRCgICAgDAhAiADKAIMIQcgAygCCCEGA0AgBSAGRg0BIAAgAhALIAAgCSAHIAVBA3RqIggoAgQgCUEAEBMiAhAMRQRAIAVBAWohBSAAIAEgCCgCBCACQYCAARC9BEF/Sg0BCwtBfyEECyAAIAcgBhBiIAAgCRALIAAgAhALCyADQRBqJAAgBAvKAgEEf0EBIQggAyEGAkADQAJAIAYgBCAFENEGIgVBAE4EQCAGKAJ0IAVBBHRqKAIMQQN2QQ9xIQlBASEHIAgEQEEAIQcMAgsgACADIAZBACAFIARBAUEBQQAQpAEiBUEATg0BDAMLIAYoAgQiBwRAIAYoAgwhBUEAIQggByEGDAIFAkAgBigCIEUNAEEAIQUgBigCwAIiB0EAIAdBAEobIQcDQCAFIAdGDQEgBCAGKALIAiIJIAVBA3RqKAIERgRAIAkgBUEDdGotAAAiCEEEdiEJIAMgBkYEQEEBIQcMBQtBASEHIAAgAyAGQQAgCEEBdkEBcSAFIAQgCEECdkEBcSAIQQN2QQFxIAkQhAIiBUEASA0GDAQFIAVBAWohBQwBCwALAAsgACAEQdOYARCLAwwDCwALCyABIAc2AgAgAiAJNgIAIAUPC0F/C8YBAQF/IAEgA2otAABBPEYEQCAAIARB/wFxEA8gACAFQf//A3EQMSADQQFqIQMLIAEgAigCBCIAQXtqIgJqIgYtAABBtAFGBEAgACABai0AAEEWRgRAIAZBEToAACAAQXxqIQILIABBAmohBiABIAJqIgAgBEEBajoAACAAQQFqIAVB//8DcRD6AiACQQNqIQADQCAAIAZORQRAIAAgAWpBsQE6AAAgAEEBaiEADAELCyADDwtBrJcBQaENQezlAUHElwEQAAALswEBAX9BfyEDAkAgASgCTEUNAAJAAkACQAJAIAJBj39qDgMCAQADCyABKAK0ASIDQX9KDQMgASAAIAFB8wAQVyIANgK0ASAADwsgASgCsAEiA0F/Sg0CIAEgACABQfIAEFciADYCsAEgAA8LIAEoAqwBIgNBf0oNASABIAAgAUHxABBXIgA2AqwBIAAPCyACQQhHDQAgASgCqAEiA0F/Sg0AIAEgACABEL0DIgM2AqgBCyADCwkAIAAgAToAAAsTACAAQZOcAUEAEBVCgICAgOAAC0UAIAAoAswBIAFBA3RqQQRqIQEDQCABKAIAIgFBAEhFBEAgACgCdCABQQR0aiIBIAEoAgxBBHI2AgwgAUEIaiEBDAELCwuAFQEIfyMAQRBrIgskACALQX82AgwCf0EBIAJBj39qQQNJDQAaQQEgAkEIRg0AGkEACyENIAEoAswBIANBA3RqQQRqIQMCQAJAAkACQAJAA0AgAygCACIDQQBOBEAgAiABKAJ0IgogA0EEdGoiCSgCACIMRgRAIAMhCQJAIARByX5qDgMABAAECyAKIAlBBHRqLQAMQQFxRQ0DIAVBMBAPIAUgACACEBgQHSAFQQAQDwwHCyANIAxB1ABHckUEQCAFQdgAEA8gBSADQf//A3EQMSAAIAEgAiAEIAUgC0EMakEBEOoBCyAJQQhqIQMMAQsLQX8hCQJAAn8CfyADQX5HBEAgASACEIUCIQkLIA1BAXMgCUF/SnJFCwRAIAAgASACEMEEIQkLIAJBzQBHIAlBf0pyRQsEQCABKAJIRQ0BIAAgARDkAiEJCyAJQX9KDQELAkAgASgCLARAIAEoAnAgAkYNAQsgA0F+Rw0DDAQLIAAgASACEOMCIglBAEgNAQsCQAJAAkACQCAEQct+ag4HAgIAAwABAgcLAkAgCUGAgICAAnEiAw0AIAEoAnQgCUEEdGotAAxBAXFFDQAgBUEwEA8gBSAAIAIQGBAdIAVBABAPDAcLAkAgBEHJfmoOAwIDAAcLAkAgAw0AIAEoAnQgCUEEdGooAgxB+ABxQSBHDQAgBUELEA8gBUHYABAPIAUgCUH//wNxEDEgBUHMABAPIAUgACACEBgiAhAdIAVBBBAPIAUgACACEBgQHQwHCwJAIAsoAgxBf0cNACAGIAcoAgQQuQNFDQAgBSAGIAcgCAJ/IAMEQCAJQYCAgIB+aiEJQdsADAELQeIAQdgAIAEoAnQgCUEEdGotAAxBAnEbCyAJEMAEIQgMBwsgAwRAIAVB+QAQDyAFIAAgAhAYEB0gBSAJQf//A3EQMQwHCyAFQfgAEA8gBSAAIAIQGBAdIAUgCUH//wNxEDEMBgsgBUEGEA8LIAlBgICAgAJxBEAgBUHcAEHcAEHbACAEQbsBRhsgBEG3AUYbEA8gBSAJQf//A3EQMQwFCwJAAkACQCAEQcl+ag4FAAEBAQABC0HjAEHZACABKAJ0IAlBBHRqLQAMQQJxIgAbIQMgAEUgBEG7AUdyDQFB5ABB2QAgAkEIRhshAwwBC0HiAEHYACABKAJ0IAlBBHRqLQAMQQJxGyEDCyAFIAMQDyAFIAlB//8DcRAxDAQLIAVBCRAPDAMLIANBfkYNAQsgDSABKAKQAUEASHINACAFQdgAEA8gBSABLwGQARAxIAAgASACIAQgBSALQQxqQQAQ6gELIA0gASgClAFBAEhyRQRAIAVB2AAQDyAFIAEvAZQBEDEgACABIAIgBCAFIAtBDGpBABDqAQsgAkHNAEchDiABIQMCQAJAAkACQANAIAMoAgQiCkUEQCADIQoMAgsgCigCzAEgAygCDEEDdGpBBGohAwNAIAMoAgAiA0EATgRAIAIgCigCdCIPIANBBHRqIgwoAgAiEEYEQCADIQkCQCAEQcl+ag4DAAYABgsgDyAJQQR0ai0ADEEBcUUNBSAFQTAQDyAFIAAgAhAYEB0gBUEAEA8MCAUCQCANIBBB1ABHcg0AIAwgDCgCDEEEcjYCDCAAIAEgCkEAIANB1ABBAEEAQQAQpAEiA0EASA0AIAVB3gAQDyAFIANB//8DcRAxIAAgASACIAQgBSALQQxqQQEQ6gELIAxBCGohAwwCCwALCyAJQX9KDQIgA0F+RiIDRQRAIAogAhCFAiIJQX9KDQMLIA0EQCAAIAogAhDBBCIJQX9KDQMLAkACQCAODQAgCigCSEUNACAAIAoQ5AIhCQwBCwJAIAooAixFDQAgCigCcCACRw0AIAAgCiACEOMCIQkMAQsCQCADDQAgDSAKKAKQASIDQQBIcg0AIAooAnQgA0EEdGoiAyADKAIMQQRyNgIMIAAgASAKQQAgCigCkAEgAygCAEEAQQBBABCkASEDIAVB3gAQDyAFIANB//8DcRAxIAAgASACIAQgBSALQQxqQQAQ6gELIA0gCigClAEiA0EASHJFBEAgCigCdCADQQR0aiIDIAMoAgxBBHI2AgwgACABIApBACAKKAKUASADKAIAQQBBAEEAEKQBIQMgBUHeABAPIAUgA0H//wNxEDEgACABIAIgBCAFIAtBDGpBABDqAQsgCiIDKAIgRQ0BDAILCyAJQX9KDQELIAooAiBFDQJBACEDA0AgAyAKKALAAkgEQCACIAooAsgCIANBA3RqIg8oAgQiDkYEQCABIApGDQQgACABIApBACAPLQAAIglBAXZBAXEgAyACIAlBAnZBAXEgCUEDdkEBcSAJQQR2EIQCIQMMBAsgDSAOQa5/akECS3JFBEAgAyEMIAEgCkcEQCAAIAEgCkEAIA8tAABBAXZBAXEgAyAOQQBBAEEAEIQCIQwLIAVB3gAQDyAFIAxB//8DcRAxIAAgASACIAQgBSALQQxqIA5B1ABGEOoBCyADQQFqIQMMAQsLIAlBAEgNAgsCfyAJQYCAgIACcQRAIAooAoABIAlBgICAgH5qIgNBBHRqIgkgCSgCDEEEcjYCDCAAIAEgCkEBIAMgAkEAQQBBABCkAQwBCyAJQQR0IgMgCigCdGoiDCAMKAIMQQRyNgIMIAAgASAKQQAgCSACIAooAnQgA2ooAgwiA0EBcSADQQF2QQFxIANBA3ZBD3EQpAELIgNBAEgNAQsCQAJAAkACQAJAAkACQCAEQct+ag4HAQEABgADAQgLIAEoAsgCIANBA3RqLQAAIglBBHEEQCAFQTAQDyAFIAAgAhAYEB0gBUEAEA8MCAtBACEKAkAgBEHJfmoOAwIGAAgLIAlB8AFxQcAARgRAIAVBCxAPIAVB3gAQDyAFIANB//8DcRAxIAVBzAAQDyAFIAAgAhAYIgIQHSAFQQQQDyAFIAAgAhAYEB0MCAsCQCALKAIMQX9HDQAgBiAHKAIEELkDRQ0AIAUgBiAHIAhB5QBB3gAgCUEIcRsgAxDABCEIDAgLIAVB+gAQDyAFIAAgAhAYEB0gBSADQf//A3EQMQwHCyAEQbsBRiEKIARByX5qDgUAAgICAAILQeYAQd8AIAEoAsgCIANBA3RqLQAAQQhxIgQbIQAgBEUgCkVyDQJB5wBB3wAgAkEIRhshAAwCCyAFQQYQDwtB5QBB3gAgASgCyAIgA0EDdGotAABBCHEbIQALIAUgABAPIAUgA0H//wNxEDEMAgsgBUEJEA8MAQsCQAJAAkACQAJAIARBy35qDgcCAgIEAAEDBQsCQCALKAIMQX9HDQAgBiAHKAIEELkDRQ0AIAAgASAFIAYgByAIIAIQ0gYhCAwFCyAFQfsAEA8gBSAAIAIQGBAdDAQLIAVBBhAPIAVBOBAPIAUgACACEBgQHQwDCyAFIARBgn9qQf8BcRAPIAUgACACEBgQHQwCCyAFQToQDyAFIAAgAhAYEB0MAQsgBUGZARAPIAUgACACEBgQHQsgCygCDCIAQQBOBEAgBUG0ARAPIAUgABAdIAEoAqQCIABBFGxqIAUoAgQ2AggLIAtBEGokACAIC64BAgN/AX4jAEEQayIDJAAgACABEDIiBhAMRQRAAkACQCAAIANBDGogBhCOAiIBRQ0AIAAgAhBEIgQgAygCDGpBAWoQLiIFRQ0AIAUgASADKAIMECQiBSADKAIMaiACIAQQJBogBSADKAIMIARqakEAOgAAIAAgBSADKAIMIARqEKMDIQQgACAFEBkgACABEDcMAQsgACABEDdBACEECyAAIAYQCwsgA0EQaiQAIAQLSwEBfyAAIAEoAgA2AkAgAEEpEA0gACAAKAJAKAIENgJAIABCgICAgCAQxgMhAiABKAIAIAI2AgggAEEDEA0gACACEDkgAEHQABANC4EBAQF/IAEgABDhBiICNgIAIAJFBEBBfw8LIAAgAjYCQCAAQQkQDSABIAEoAgAoApgCNgIMIABB6QBBfxAcIQEgAEG2ARANIABBCBAbIABBABAXIABBtgEQDSAAQfMAEBsgAEEAEBcgAEEtEA0gACABEB4gACAAKAJAKAIENgJAQQALDQAgACABQc2FARDGBAtHAQF/An9BACABKAIIDQAaIAEoAgAiAgR/IAIFQX8gACABEMgEDQEaIAEoAgALKAKAAiABKAIMakEKOgAAIAFBATYCCEEACwuhAQEFfyMAQRBrIgQkACABpyIFKAIQIgMgAygCGEF/c0ECdEG8fnJqKAIAIQIgAxAoIQMCQAJAA0AgAkUNASACQQN0IANqIgZBeGohAiAGQXxqKAIAQTBHBEAgAigCAEH///8fcSECDAELCyAEIAI2AgwgACAFIARBDGogAigCAEEadkE8cRCWAw0BCyAFIAUtAAVB/gFxOgAFCyAEQRBqJAAL/AQCBX8DfiMAQTBrIgQkACAAKAIAIQVCgICAgDAhCkKAgICAMCEJAkAgAQRAQX8hAyAFEE8iCRAMDQEgACAJQQAQzwEhBiAFIAkQCyAGDQEgBRBPIgoQDA0BIAUgCUHwACAKQYCAARAaQQBIDQELIABBEGohBkEAIQMCQAJAA0AgBigCAEGCf0YEQCAEIAAoAhhBAWoiBzYCDCAEIAYpAxg3AyggBCAGKQMQNwMgIAQgBikDCDcDGCAEIAYpAwA3AxAgACkDICEIAkACQAJAIAEEQCAFIAogAyAIEA5BhIABEJwBQQBIDQIgBSAJIAMCfiAAQeAAQQAgByAEQRBqIARBDGoQiANFBEAgBCkDIAwBCyAEQoCAgIAwNwMgQoCAgIAwC0GEgAEQnAFBAE4NAQwCCyAFIAgQCyAAQoCAgIAwNwMgIABB4ABBASAHIARBEGogBEEMahCIAw0BIAQpAyAhCAJAIAMEQCAIpykCBEL/////B4NQDQELIAAgCEEBEM8BIQcgACgCACAIEAsgBw0CIANFBEAgACgCKEHgAEYNCCAAQcIAEA0gAEHcABAbCyADQQFqIQMMAQsgACgCACAIEAsLIAAoAihB4ABGDQQgABAQDQAgABCXAQ0AIAYoAgBB/QBHBEAgAEGMhAFBABAUDAELIAAgBhCNAiAAQQA2AjAgACAAKAIUNgIEIAAgACgCOBDMA0UNAQtBfyEDDAULIANBAWohAwwBCwsgAEGCfxAvIQMMAgsgAQRAIAUgChDLBCAFIAkQywQgAiADQQFqNgIADAELIABBJBANIAAgA0F/akH//wNxEBcLIAAQECEDCyAEQTBqJAAgAwtvAQF/IABBJhANIABBABAXIABBARANIABBABA5IAAgABA1IgIQHiAAQYABEA0gACABQQJqQf8BcRBsIABB6gBBfxAcIQEgAEHRABANIABBjwEQDSAAQesAIAIQHBogACABEB4gAEEOEA0gAEEOEA0LngEBBX8gACgCQCIEKAKIASIDQQAgA0EAShshAwJAA0ACQCACIANGBEBBACEDIAQoAnwiAkEAIAJBAEobIQVBACECA0AgAiAFRg0EIAJBBHQhBiACQQFqIQIgBiAEKAJ0aigCACABRw0ACwwBCyACQQR0IQUgAkEBaiECIAUgBCgCgAFqKAIAIAFHDQELCyAAQfmKAUEAEBRBfyEDCyADC/kEAgh/AX4jAEFAaiICJAAgACgCOCEBQX8hCAJAIAAoAgAgAkEoakEgEEMNAAJAIAAoAgAgAkEQakEBEEMNACABQQFqIQNBACEBAkADQCADIgcgACgCPE8NASABIQZBASEBIAdBAWohA0HbACEEAkACQAJAAkACQAJAAkAgBy0AACIFQaV/ag4DBQMBAAsgBUEvRwRAIAVBdmoOBAYCAgYCC0EvIQQgBg0EA0AgAiADQQFqNgIMAkAgAywAACIBQX9KBEAgAUH/AXEhAQwBCyADQQYgAkEMahBlIgFBgIDEAE8NBQsgARC/AQRAIAJBEGogARC+AQ0KIAIoAgwhAwwBCwsgAEGEfzYCECAAIAJBKGoQODcDICACQRBqEDghCSAAIAM2AjggACAJNwMoQQAhCAwJC0HdACEEQQAhAQwDCyAFQRh0QRh1QX9KBEAgBiEBIAUhBAwDCyAHQQYgAkEIahBlIgRBgIDEAE8NASAEQX5xQajAAEYNAyACKAIIIQMgBiEBDAILIAJBKGpB3AAQPA0FIAdBAmohBQJAIActAAEiBARAIARBdmoOBAQBAQQBC0EAIQQgBiEBIAUiAyAAKAI8Tw0FDAILIARBGHRBGHVBf0oEQCAGIQEgBSEDDAILQQdBBkEAIANBBiACQQxqEGUiBEF+cUGowABGGyAEQf//wwBLIgEbIgNFBEAgBSACKAIMIAEbIQMgBiEBDAILIANBemoOAgIABgsgAEGE1gBBABAUDAQLIAJBKGogBBC+AUUNAQwDCwsgAEHf/QBBABAUDAELIABBxv0AQQAQFAsgAkEoahBFIAJBEGoQRQsgAkFAayQAIAgLMwEBfwNAAkAgAUEATgR/IAEgAkcNAUEBBUEACw8LIAAoAswBIAFBA3RqKAIAIQEMAAsACz4BAX8gACgCiAEhAgJ/A0BBfyACQQFIDQEaIAAoAoABIAJBf2oiAkEEdGooAgAgAUcNAAsgAkGAgICAAnILC5sDAQZ/IAEoAjghAwJAAkACQAJAIAEtAG5BAXEEQAJAIAMNACABKAJARQ0AIABB74wBQQAQFAwECyACQTpGIAJBzQBGcg0CQQAhAiABKAKIASIDQQAgA0EAShshAwNAIAIgA0YNAiABKAKAASACQQR0aigCACIEQc0AR0EAIARBOkcbBEAgAkEBaiECDAEFIABB4Y0BQQAQFAwFCwALAAsgA0UNACABLwFsIgJBggxGDQAgAkEIdkF9ag4EAAMDAAMLQQAhBCABKAKIASICQQAgAkEAShshCEEAIQMDQCADIAhGDQNBACECAkAgASgCgAEiBSADQQR0aigCACIHRQ0AA0ACQCACIANGBEBBACECIAEoAnwiBUEAIAVBAEobIQUDQCACIAVGDQQgByABKAJ0IAJBBHRqIgYoAgBGBEAgBigCBEUNAwsgAkEBaiECDAALAAsgAkEEdCEGIAJBAWohAiAFIAZqKAIAIAdHDQELCyAAQYaOAUEAEBQMAwsgA0EBaiEDDAALAAsgAEG8jQFBABAUC0F/IQQLIAQLYQEBfyAAQbYBEA0gAEH2ABAbIAAgACgCQC8BvAEQFyAAQREQDSAAQekAQX8QHCEBIABBtgEQDSAAQQgQGyAAQQAQFyAAQRsQDSAAQSQQDSAAQQAQFyAAIAEQHiAAQQ4QDQtRAQJ/QX8hAkEBIQMDQAJAIAAgARC5AQ0AIANFBEAgACgCQEF/NgKYAgsgACgCEEEsRwRAQQAhAgwBCyAAEBANACAAQQ4QDUEAIQMMAQsLIAILWwAgABC9ByIABEAgABDtBiAAEOwGIABBFjYC7AEgACAAKAIoKQMoQcDOAEEBECUgABDpBiAAIAApA8ABQbDXAEEBECUgABDmBiAAEOMGIAAQ3QYgABDZBgsgAAuTAgEEfyAAKAIQIQYCf0EAIAEoAgAiBS0AEEUNABogBiAFEIIEIAUoAhQgAxC4AiAEELgCCyEHAn8CfyAFKAIgIgggBSgCHE4EQCAAIAEgAiAIQQFqELUFBEBBfyAFLQAQRQ0DGiAGIAUQlQNBfw8LIAEoAgAhBQsgBS0AEAsEQCAFIAc2AhQgBiAFEJUDCyAFIAUoAiAiAUEBajYCICAFECggAUEDdGoiASAAIAMQGCIANgIEIAEgASgCAEH///8fcSAEQRp0cjYCACAFIAUtABEgABBdcjoAESABIAEoAgBBgICAYHEgACAFKAIYcUF/c0ECdCAFaiIAKAIAQf///x9xcjYCACAAIAUoAiA2AgBBAAsLtgEBAn8gACgCECIEKALQAUEBdEECaiAEKALMAUoEQCAEIAQoAsgBQQFqEPoHCyAAQQQgAhDhARAuIgNFBEBBAA8LIANBBBC3AiIDQQE2AgAgBCADQQIQvAEgAQRAIAGtQoCAgIBwhBAOGgsgAyABNgIsIANBcGoiBEIANwIAIARCADcCCCADQgA3AiAgAyACNgIcIANBAzYCGCADQQE7ARAgAyABEMQFNgIUIAAoAhAgAxCVAyADCxEAIACnQQAgAEL/////b1YbC9sCAQR/IwBBoAFrIgUkACABKAIAIQcgBUGAATYCCCAFIAVBEGo2AgwgBAR/IAVBIzoAEEEBBUEACyEEAn8CQANAIAUgBzYCnAECfyADQf8ATARAIAUoAgwiBiAEaiADOgAAIARBAWoMAQsgBSgCDCIGIARqIAMQsgMgBGoLIQQgBSAFKAKcASIDIghBAWo2ApwBAkAgAy0AACIDQdwARgRAQdwAIQMgCC0AAUH1AEcNASAFQZwBakEBEKMCIQMgAkEBNgIADAELIANBGHRBGHVBf0oNACAHQQYgBUGcAWoQZSEDCyADEL8BRQ0BIAUoApwBIQcgBCAFKAIIQXpqSQ0AIAAoAgAgBUEMaiAFQQhqIAVBEGoQ7wRFDQALIAUoAgwhBkEADAELIAAoAgAgBiAEEKMDCyEDIAVBEGogBkcEQCAAKAIAIAYQGQsgASAHNgIAIAVBoAFqJAAgAwvGAQECfwJAAkACQAJAIAAoAhAiAUFFRwRAIAAoAkAhAiAAQYUBEFBFDQIgAEEBEIYBQUVHDQELQX8hASAAQQBBACAAKAIYIAAoAhQQ1AFFDQIMAwsgACgCECEBCwJAAkACQCABQTVqDgMAAgECCyACKAKUA0UNAUF/IQEgABD1BkUNAgwDCyACKAKUA0UNACAAQQAQhgEiAUEoRiABQS5Gcg0AQX8hASAAEPQGRQ0BDAILQX8hASAAQQcQ7gENAQtBACEBCyABC+MCAQN/IwBBQGoiASQAAkAgACgCEEGBf0cNACAAIAFBEGoQ8AIDQAJAIAAoAhBBgX9HDQAgACgCOCECIAEgACgCGCIDQQFqNgIEIAEgAiADa0F+ajYCACABQSBqQRRBvPoAIAEQVRpBfyECIAAQEA0CAkACQAJAIAAoAhAiA0GAAWoOVwEBAQEBAwMDAwMDAwMDAwMDAwMDAQEDAwMDAwMDAwMDAwMDAwMDAwMDAwIBAQEBAwEBAQEDAQEDAwEBAQMDAQMDAQEDAwEBAQEBAQEDAQEDAQEBAQEBAQALIANB/QBGDQEgA0E7Rw0CIAAQEEUNAQwECyAAKAIwRQ0BCwJ/IAFBIGpBwfoAQQsQdEUEQCAAKAJAIgJBATYCQEEBDAELIAFBIGpBzPoAQQoQdA0CIAAoAkAhAkECCyEDIAIgAi0AbiADcjoAbgwBCwsgACABQRBqEO8CIQILIAFBQGskACACCzUBAn9BASECIAAoAgAiAUGPf2pBA0kgAUEIRnIgAUHTAEZyBH9BAQUgACgCDEH4AHFBIEYLCzYBAX8gACABELACIAAgASgCACIAEP0GIgNBAEgEQEF/DwsgAiADrTcDACABIABBA2o2AgBBAAuIAQEEfyMAQRBrIgMkACADIAEoAgAiBDYCDEF/IQUgBCAAKAIEQf////8HcUgEQAJAAkAgACAEEDAiBkFVag4DAAEAAQsgAyAEQQFqNgIMCyAAIANBDGogAhCxAiIFIAZBLUdyRQRAIAJCACACKQMAfTcDAAsgASADKAIMNgIACyADQRBqJAAgBQszACAAQs9wfEIEEPICIABC7QJ+fCAAQpNxfELkABDyAn0gAEK/c3xCkAMQ8gJ8QraOVHwLEgAgACABgSIAQj+HIAGDIAB8CykBAX4gACABEMgBIgFFBEBCgICAgOAADwsgACABEDIhAiAAIAEQEiACC4ICAwR/AX4CfCMAQeAAayIGJABCgICAgOAAIQkCQCAAIAEgBkEQaiAEQQ9xIgggBEEIdkEPcSIHRRDQAyIFQQBIDQBEAAAAAAAA+H8hCgJAIAVFIAJBAUhyDQBBACEFIAIgBEEEdkEPcSAHayIEIAQgAkobIgJBACACQQBKGyECA0AgAiAFRwRAIAAgBkEIaiADIAVBA3RqKQMAEEgNAyAGKwMIIgu9QoCAgICAgID4/wCDQoCAgICAgID4/wBRDQIgBkEQaiAFIAdqQQN0aiALnTkDACAFQQFqIQUMAQsLIAZBEGogCBCDAyEKCyAAIAEgChDjBCEJCyAGQeAAaiQAIAkLegEBfwJAIAFCgICAgHBUDQAgAaciAy8BBkEKRw0AIAAgAykDIBALIAMCfiACvQJ/IAKZRAAAAAAAAOBBYwRAIAKqDAELQYCAgIB4CyIAt71RBEAgAK0MAQsgAhAWCyIBNwMgIAEQDg8LIABBoPUAQQAQFUKAgICA4AALgAEBA38jAEEQayIEJAAgBCABNwMIIANBAXQhBkEAIQMDQAJAAkAgA0ECRg0AIABBN0EBIAMgBmpBASAEQQhqEOIBIgEQDEUNAUF/IQUgA0EBRw0AIAAgAikDABALCyAEQRBqJAAgBQ8LIAIgA0EDdGogATcDACADQQFqIQMMAAsAC3EBAX8jAEEQayIEJAAgBCACNwMIIAEoAkwiARBHIAAgACABQSBqIANBA3RqKQMAQoCAgIAwQQEgBEEIahAjEAsgACABKQMQEAsgACABKQMYEAsgACABKQMgEAsgACABKQMoEAsgACABEBkgBEEQaiQAC+kDAgR/An4gAUEIaiEDIAFByABqIQQCQAJAAkADQCAEEOMDDQIgASgCTCECAkACQAJ/AkACQAJAAkAgASgCBA4GAAICBQkBBgsgAigCCEUNAiAAIAEQ0gMMBgsCQAJAIAIoAggOAggAAQsgAUEENgIEIAAgASACKQMQEIoHDwsgACABIAIpAxAQ0QMPCyACKQMQEA4hBgJAIAIoAggiBUECRw0AIAEoAgRBAUcNACAAIAYQkAFBAQwCCyABKAJEIgIgBa03AwAgAkF4aiAGNwMAIAEgAkEIajYCRAtBAAshAiABQQM2AgQgASACNgIUCyAAIAMQuwIiBxAMBEAgABCPASEGIAAgARDSAyAAIAEgBhDRAyAAIAYQCwwCCyAHQv////8PWARAIAEoAkRBeGoiAikDACEGIAJCgICAgDA3AwACQAJAAkAgB6ciAg4DAgABBAtBASECCyABIAI2AgQgACABIAZBABDzAiAAIAYQCwwDCyAAIAEgBhCJByAAIAYQCw8LIAcQEUUNBCABKAJEQXhqIgIpAwAhBiACQoCAgIAwNwMAIAAgARDSAyAAIAEgBkEBEPMCIAAgBhALDAELCxABAAsgACABQoCAgIAwQQEQ8wILDwtB7egAQaENQbWZAUGG6QAQAAALKQEBfiAAIAApA5ABQQMQUSICEAxFBEAgACACQTQgARAOQQMQGhoLIAILHwEBfyABIAEoAgBBf2oiAjYCACACRQRAIAAgARAgCwuJAQEBfyACKAIERQRAIAJBGGoQRwJAIAEoAgAEQCACEIkFDAELIAAgAikDIBAmCyAAIAIpAygQJiACIAIoAgBBf2oiAzYCAAJAIANFBEAgAkEQahBHIAAgAhAgDAELIAJCgICAgDA3AyggAkKAgICAMDcDICACQQE2AgQLIAEgASgCDEF/ajYCDAsLPwEBfyABQQAgAUEAShshAQNAAkAgASADRgRAQX8hAwwBCyAAIANBA3RqKAIEIAJGDQAgA0EBaiEDDAELCyADC6wEAgF/BH4CQAJAIAIQIUUEQCAAECkMAQsCQAJ/QQAgACACQT0Qd0UNABpCgICAgDAhBEKAgICAMCEFQoCAgIAwIQYgACACQT0gAkEAEBMiBxAMDQFBgQJBgAIgACAHEC0bCyEDIAAgAkE+EHcEQEKAgICAMCEEQoCAgIAwIQVCgICAgDAhBiAAIAJBPiACQQAQEyIHEAwNAUGCBEGABCAAIAcQLRsgA3IhAwsgACACQT8QdwRAQoCAgIAwIQRCgICAgDAhBUKAgICAMCEGIAAgAkE/IAJBABATIgcQDA0BQYQIQYAIIAAgBxAtGyADciEDC0KAgICAMCEFAkAgACACQcAAEHdFBEBCgICAgDAhBgwBC0KAgICAMCEEIAAgAkHAACACQQAQEyIGEAwEQAwCCyADQYDAAHIhAwsCQCAAIAJBwQAQd0UNACAAIAJBwQAgAkEAEBMiBRAMRQRAIANBgBByIQMgBRARDQEgACAFEDsNAQsgAEH02ABBABAVQoCAgIAwIQQMAQsCQCAAIAJBwgAQd0UEQEKAgICAMCEEDAELIAAgAkHCACACQQAQEyIEEAxFBEAgA0GAIHIhAyAEEBENASAAIAQQOw0BCyAAQYPZAEEAEBUMAQsgA0GAMHFFIANBgMQAcUVyDQIgAEGS2QBBABAVCyAAIAYQCyAAIAUQCyAAIAQQCwtBfw8LIAEgBDcDGCABIAU3AxAgASAGNwMIIAEgAzYCAEEAC4gDAgd/An4jAEEgayIEJAAgBEEANgIMIARBADYCCAJAIAAgASACIAFBABATIgsQDARAIAshAQwBCwJAAkAgCxAhRQRADAELIAAgCxDAASIJQQBIDQECQCAJBEAgACAEQQxqIAsQ2AFFDQEMAwsgACAEQQhqIARBDGogC6dBERCOASEFIAQoAgghBiAFQQBIDQILIAQoAgwhCANAIAcgCEYNAQJAIAkEQCAAIAcQywUiBQ0BDAQLIAAgBiAHQQN0aigCBBAYIQULIAAgCyAFIAMQ7AQiDBAMBEAgACAFEBIMAwsCfyAMEBEEQCAAIAsgBUEAENoBDAELIAAgCyAFIAxBBxAaCyEKIAAgBRASIAdBAWohByAKQQBODQALDAELIAAgBiAIEGJBACEGIAAgAhBmIgwQDA0AIAQgCzcDGCAEIAw3AxAgACADIAFBAiAEQRBqECMhASAAIAwQCyAAIAsQCwwBCyAAIAYgBCgCDBBiIAAgCxALQoCAgIDgACEBCyAEQSBqJAAgAQswAQF/IAAoAjggAUECdGooAgAiASABKAIAIgJBf2o2AgAgAkEBTARAIAAgARCiAwsL7wIBA38jAEFAaiICJAACQCAAIAEQXyIBEAwNAAJAIAAgAkEgaiABpyIEKAIEQf////8HcUECahBDDQAgAkEgakEiEDwNACACQQA2AjwDQCADIAQoAgRB/////wdxSARAAkACQAJAAkACQAJAAkACQAJAAkAgBCACQTxqENcBIgNBeGoOBgUCBAEGAwALIANBIkYgA0HcAEZyDQYLIANBIE9BACADQYBwcUGAsANHGw0GIAIgAzYCACACQRBqQRBBjtcAIAIQVRogAkEgaiACQRBqEIkBDQoMBwtB9AAhAwwEC0HyACEDDAMLQe4AIQMMAgtB4gAhAwwBC0HmACEDCyACQSBqQdwAEDwNBCACQSBqIAMQPEUNAQwECyACQSBqIAMQvgENAwsgAigCPCEDDAELCyACQSBqQSIQPA0AIAAgARALIAJBIGoQOCEBDAELIAAgARALIAJBIGoQRUKAgICA4AAhAQsgAkFAayQAIAELbgEEf0F/IQZBfyACKAIAIgRBAXYgBGogBEGp1arVeksbIQUCQAJAIAMgASgCACIHRgRAIAAgBRAuIgBFDQIgACADIAQQJBoMAQsgACAHIAUQmQIiAEUNAQsgASAANgIAIAIgBTYCAEEAIQYLIAYLYQECfwNAIAAoAigiAUEBSEUEQCAAIAFBf2oiATYCKCAAKAIAIAAoAgQgAUEDdGopAwAQCwwBCwsgACgCBCIBIABBCGoiAkcEQCAAKAIAIAEQGQsgAEEENgIsIAAgAjYCBAuoBQIKfwV+IwBBMGsiAiQAIAEpAyAhDiABKQMYIQ0gASkDCCEMIAEpAwAhDwJ+AkACQCABKQMoIhAQmwEEQCAMEJsBDQELIABBwNMAQQAQFQwBCyAAIAJBCGpBABBDGiACQQA2AiQCQCANEBFFBEAgACACQSRqIA0Q2AENAQsgACACQShqIA8Q2AENACAAIAJBLGogASkDEBDFAUEASA0AIAynIQcgEKciBCgCBEH/////B3EhCCACKAIkIQkgAigCKCEKQQAhAQNAAkACQAJAIARBJCABENUBIgZBAEgNACAGQQFqIgMgCE8NACACQQhqIAQgASAGEFgaIAZBAmohAQJAAkACQAJAIAQgAxAwIgVBXGoOBAADBQECCyACQQhqQSQQPBoMBgsgAkEIaiAHIAogAigCLGogBygCBEH/////B3EQWBoMBQsgBUHgAEYNAwsCQCAFQVBqIgNBCU0EQAJAIAEgCE8NACAEIAEQMCIFQVBqQQlLDQAgBkEDaiABIAUgA0EKbGoiAUEwSiABQVBqIgUgCUlxIgsbIQEgBSADIAsbIQMLIANBAUggAyAJT3INASAAIA0gA60QYCIMEAwNBiAMEBENBSACQQhqIAwQiwFFDQUMBgsgBUE8Rw0AIA4QEQ0AIARBPiABENUBIgNBAEgNACAAIAQgASADEJoBIgwQDA0FIAAgDiAMEJ4BIgwQDA0FIAwQEUUEQCACQQhqIAwQiwENBgsgA0EBaiEBDAQLIAJBCGogBCAGIAEQWBoMAwsgAkEIaiAEIAEgBCgCBEH/////B3EQWBogAkEIahA4DAULIAJBCGogDxCKAUUNAQwCCyACQQhqIAdBACACKAIsEFgaDAALAAsgAkEIahBFC0KAgICA4AALIQ0gAkEwaiQAIA0L+AUCCH8FfiMAQRBrIggkAEKAgICA4AAhDwJAIAAgAUEBENkBIgJFDQAgACADKQMAECwiDRAMBEAgDSEPDAELAkAgACABQdUAIAFBABATIgwQDA0AIAAgCEEIaiAMEK0BDQAgAigCBEEQaiICLQAAQSFxIgRFBEAgCEIANwMICwJAIAItAAEiB0EBSQRAQQAhAwwBCyAAIAdBA3QQLiIDRQ0BCwJAAkACQAJAAkACQAJAAkAgCCkDCCIMIA2nIgopAgQiDkL/////B4NVDQAgAyACIApBEGoiCSAMpyAOpyIFQf////8HcSAFQR92IgUgABCBBiIGQQFGDQMgBkEASA0BIAQNACAGQQJHDQILIAAgAUHVAEIAEElBAE4NAQwECyAAQdXSAEEAEEIMAwsgACANEAtCgICAgCAhAQwBCyAEBEAgACABQdUAIAMoAgQgCWsgBXWtEElBAEgNAgtCgICAgDAhDCAAEE8iARAMDQIgAi0AAEGAAXEEfyACIAIoAANqQQdqBUEACyIEBEAgAEKAgICAIBBSIgwQDA0DCyAHQQAgB0EASxshB0EAIQIDQCACIAdHBEBCgICAgDAhDgJAIAMgAkEDdGooAgAiBkUNACADIAJBA3RBBHJqKAIAIgtFDQAgACAKIAYgCWsgBXUgCyAJayAFdRCaASIOEAwNBQsgAkUgBEVyRQRAAkAgBC0AAEUNACAAIAwgBCAOEA4iEEGHgAEQggJBf0oNACAAIBAQCwwGCyAEEEQgBGpBAWohBAsgACABIAIgDkGHgAEQnAEhBiACQQFqIQIgBkEATg0BDAQLCyAAIAFBhwEgDEGHgAEQGkEASA0CIAAgAUHXACADKAIAIAlrIAV1rUGHgAEQGkEASA0CIAAgAUHYACANQYeAARAaQQBIDQMLIAAgAxAZIAEhDwwEC0KAgICAICEBQoCAgIAwIQwLIAAgDBALIAAgDRALCyAAIAEQCyAAIAMQGQwBCyAAIA0QCwsgCEEQaiQAIA8LLwEBfwNAIAFBB3YiAgRAIAAgAUGAAXJB/wFxEA8gAiEBDAELCyAAIAFB/wBxEA8LXwAgAEIohkKAgICAgIDA/wCDIABCOIaEIABCGIZCgICAgIDgP4MgAEIIhkKAgICA8B+DhIQgAEIIiEKAgID4D4MgAEIYiEKAgPwHg4QgAEIoiEKA/gODIABCOIiEhIQLXQEEfyABIQMCQANAIARBBEsgAyACT3INASADLQAAIgZB/wBxIARBB2x0IAVyIQUgBEEBaiEEIANBAWohAyAGQYABcQ0ACyAAIAU2AgAgAyABaw8LIABBADYCAEF/C10BAX8CQCABKAIEQX9MBEAgACABQRBqIAJBAXQQJBoMAQsgAkEAIAJBAEobIQIgAUEQaiEBA0AgAiADRg0BIAAgA0EBdGogASADai0AADsBACADQQFqIQMMAAsACwuxAQECfyMAQRBrIgMkAAJAAkACQAJAAkACQAJAIAFCIIinIgJBCGoOCAIAAwMDBAEBAwsgAaciAikCBEKAgICAgICAgMAAVA0EIAAgAhCiAwwFCyAALQBoQQJGDQQgAadBCGoiAhBHIAIgAEHYAGoiAiACKAIEEIMFIAAtAGgNBCAAEPAIDAQLIAAgAacQogMMAwsgAyACNgIAIAMQ+QgLEAEACyAAIAIQIAsgA0EQaiQAC7EBAQJ/IwBBEGsiBiQAAkACQCACECFFDQAgAqciBy8BBkEMRw0AIActAClBDEcNACAAIAEgAyADBH8gBAUgBkKAgICAMDcDCCAGQQhqCyAFIAcuASogBygCJBEUACECDAELAkAgACACIAEgAyAEECMiAhAMRQRAIAIQIQ0BIAAgAhALIABBoMYAQQAQFQsgBUEANgIAQoCAgIDgACECDAELIAVBAjYCAAsgBkEQaiQAIAILFAEBfiAAIAEQKiECIAAgARALIAILHAEBfyAAQoCAgIBwWgR/IACnLQAFQQd2BUEACwsNACAAIAEgAkEAENsBC0IBAXxEAAAAAAAA+H8gACABEOkFIgIgAb1CgICAgICAgPj/AINCgICAgICAgPj/AFEbIAIgAJlEAAAAAAAA8D9hGwtNAQF+QYCnBCgCAARAQYinBCkDACIAUEUEQEGEpwQoAgAgABALC0GEpwQoAgAQpANBhKcEQQA2AgBBgKcEKAIAELAFQYCnBEEANgIACwt7AQF+AkACfiAEQQRxBEBBJiECIAAgARBfDAELQSUhAiAAIAEQKgsiARAMDQAgACACEKEBIgUQDA0AIABBEBAuIgIEQCACQQA2AgwgAiAEQQNxNgIIIAIgATcDACAFIAIQiAEgBQ8LIAAgBRALCyAAIAEQC0KAgICA4AALKAEBfiAAIAEQMiECIAAgARDgBwR+IABBwcoAIAJBw8oAEL0BBSACCwunAQEFfyAApyIDKAIQIgEgASgCGEF/c0ECdEGkfnJqKAIAIQIgARAoIQEDQCACRQRAQQAPCyABIAJBf2oiBEEDdGoiBSgCACECIAUoAgRBNkcEQCACQf///x9xIQIMAQsLQQEhAQJAIAJB/////wNLDQAgAygCFCAEQQN0aikDACIAQoCAgIBwg0KAgICAkH9SDQAgAKcoAgRB/////wdxQQBHIQELIAELDQAgACABQfHJABDGAQtQAgF/AX4CQCAAIAFB6QAgAUEAEBMiBBAMRQRAIAAgBBAtIQMgACABQcAAIAFBABATIgEQDEUNAQtCgICAgOAAIQFBACEDCyACIAM2AgAgAQseACABIAA2AgQgACACNgIEIAAgATYCACACIAA2AgALxAEBBH8gAaciBSACNgIgIAVCADcCJAJAIAIoAjwiBkUNAAJAIAAgBkECdBBrIghFDQAgBSAINgIkQQAhBQNAIAUgAigCPE4NAiACKAIkIAVBA3RqIgcvAQIhBgJAIActAAAiB0EBcQRAIAAgBCAGIAdBAXZBAXEQ/AMiBg0BDAMLIAMgBkECdGooAgAiBiAGKAIAQQFqNgIACyAIIAVBAnRqIAY2AgAgBUEBaiEFDAALAAsgACABEAtCgICAgOAAIQELIAELrgMBCH8gASgCCCIGQQAgBkEAShshBAJAAkADQCAEIAVGDQEgBUECdCEHIAVBAWohBSAHIAEoAgBqKAIAIAJHDQALQQAhBAwBC0F/IQQgACABQQQgAUEEaiAGQQFqEHwNACABIAEoAggiBUEBajYCCCABKAIAIAVBAnRqIAI2AgBBACEFIANBAEchCSABQRBqIQogAUEMaiEGA0ACQCAFIAIoAiBOBEBBACEEQQAhBQNAIAUgAigCLE4NBCAFQQJ0IQMgBUEBaiEFIAAgASACKAIQIAMgAigCKGooAgBBA3RqKAIEQQEQhQVFDQALDAELIAIoAhwiCCAFQRRsIgtqIgcoAhAiBEEWRiAJcUUEQAJAAn8gASAEEO4HIgRBf0wEQCAAIAZBDCAKIAEoAhRBAWoQfA0EIAEgASgCFCIEQQFqNgIUIAEoAgwgBEEMbGoiBCAIIAtqIggoAhA2AgACQCADRQRAIAgoAghFDQELIARBCGoMAgsgBEEIaiEEDAILIAYoAgAgBEEMbGpBCGoLIQRBACEHCyAEIAc2AgALIAVBAWohBQwBCwtBfw8LIAQLXwEEfwNAIAUgAkgEQCABIAVqIgYtAAAiBEEPaiAEIARBsQFLGyAEIAMbQQJ0IgRBkDFqLQAAIQcgBEGTMWotAABBaWpBBE0EQCAAIAYoAAEQ8gELIAUgB2ohBQwBCwsLSAEDfyACQQAgAkEAShshAgNAIAIgA0YEQEEADwsgASADaiEEIANBAXQhBSADQQFqIQMgACAFai8BACAELQAAayIERQ0ACyAEC1UBAn8gAQRAAkAgACgCBCIDIAFqIAAoAghLDQAgARCfAiIBRQ0AIAAgA0EIajYCBCAAIAAoAgBBAWo2AgAgASECCyACDwtB1h9BoQ1Bog1B4B8QAAALSQEDfyAAKAIgQRhqIQECQANAIAEiAygCACICRQ0BIAJBDGohASAAIAJHDQALIAMgACgCDDYCAA8LQfseQaENQaPlAkGHHxAAAAsYAQF/IAGnKAIgIgMEQCAAIAMgAhEDAAsLEQAgABDbByAAENcHIAAQzwcLng0CB38BfiMAQRBrIgYkACABKALIASIEQQAgBEEAShshAwNAIAIgA0ZFBEAgASgCzAEgAkEDdGpBfzYCBCACQQFqIQIMAQsLIAEoAjwEQCABKALMAUF+NgIMC0EAIQIgASgCfCIDQQAgA0EAShshAwJ+AkACQAJAA0AgAiADRgRAAkBBAiECIARBAiAEQQJKGyEFA0ACQCACIAVGBEBBACECA0AgAiADRg0CAkAgASgCdCACQQR0aiIEKAIIQX9KDQAgBCgCBCIFQQJIDQAgBCABKALMASIEIAQgBUEDdGooAgBBA3RqKAIENgIICyACQQFqIQIMAAsACyABKALMASIHIAJBA3RqIgQoAgRBf0wEQCAEIAcgBCgCAEEDdGooAgQ2AgQLIAJBAWohAgwBCwsgASgCRARAIAAgARD6BgsgASgClAMEQCAAIAEQ+QYNAQsgAUEQaiEFIAEoAhQhAgJAA0AgAiAFRwRAIAIoAgQhBCACQXBqKAIAIQMgACACQWhqEIwFIgkQDA0DIANBf0wNAiABKAK0AiADQQN0aiAJNwMAIAQhAgwBCwsgACABEPgGDQEgACABEPcGDQEgACABIAZBDGoQ9gZBAEgNAUHAAEHYACABLQBuQQJxIgQbIgcgASgCuAJBA3RqIQIgAAJ/IAQEQCACIAEoAkRFDQEaCyABKAJ8IAEoAogBakEEdCACagsiBCABKALAAkEDdGoiBSABKAKEAmoQayIDRQ0BIANBATYCACADIAMgBWoiBTYCFCADIAEoAoQCIgg2AhggBSABKAKAAiAIECQaIAAgASgCgAIQGSABQQA2AoACIAMgASgCcDYCHCABKAJ8IgUgASgCiAEiCGpBAUgNBiABLQBuQQJxRQ0EIAEoAkQNBEEAIQIDQCACIAVOBEBBACECA0AgAiABKAKIAU4EQEEAIQIDQCACIAEoAsACTg0KIAAgAkEDdCIFIAEoAsgCaigCBBASIAEoAsgCIAVqQQA2AgQgAkEBaiECDAALAAUgACABKAKAASACQQR0aigCABASIAJBAWohAgwBCwALAAUgACABKAJ0IAJBBHRqKAIAEBIgAkEBaiECIAEoAnwhBQwBCwALAAtB9JUBQaENQYP+AUGDlgEQAAALBSABKAJ0IAJBBHRqIgUgASgCzAEgBSgCBEEDdGoiBSgCBDYCCCAFIAI2AgQgAkEBaiECDAELCyAAIAEQggNCgICAgOAADAMLIAMgAiADaiICNgIgIAIgASgCgAEgCEEEdBAkGiADKAIgIAEoAogBQQR0aiABKAJ0IAEoAnxBBHQQJBoLIAMgASgCfDsBKiADIAEoAogBOwEoIAMgASgCjAE7ASwgACABKAKAARAZIAAgASgCdBAZCyADIAEoArgCIgI2AjggAgRAIAMgAyAHaiIFNgI0IAUgASgCtAIgAkEDdBAkGgsgACABKAK0AhAZIAFBADYCtAIgAyAGKAIMOwEuAkAgAS0AbkECcQRAIAAgASgC7AIQEiABQfQCahCjAQwBCyADIAMvABFBgAhyOwARIAMgASgC7AI2AkAgAyABKALwAjYCRCADIAAgASgC9AIgASgC+AIQmQIiAjYCUCACRQRAIAMgASgC9AI2AlALIAMgASgC+AI2AkwgAyABKAKMAzYCVCADIAEoApADNgJICyABKALMASICIAFB0AFqRwRAIAAgAhAZCyADIAEoAsACIgI2AjwgAgRAIAMgAyAEaiIENgIkIAQgASgCyAIgAkEDdBAkGgsgACABKALIAhAZIAFBADYCyAIgAyADLwARQX5xIAEvATRBAXFyIgI7ABEgAyABLwE4QQF0QQJxIAJBfXFyIgI7ABEgAyABLQBuOgAQIAMgAS8BYEECdEEEcSACQXtxciICOwARIAMgAkFPcSABLwFsQQR0QTBxciIEOwARQQghAiADIAEoArQBQX9MBH8gASgCuAFBAEdBA3QFQQgLIARBd3FyIgI7ABEgAyABLwFQQQZ0QcAAcSACQb9/cXIiAjsAESADIAJB/35xIAEvAVRBB3RBgAFxciICOwARIAMgAkH/fXEgAS8BWEEIdEGAAnFyIgI7ABEgAyACQf97cSABLwFcQQl0QYAEcXIiAjsAESADIAJB/+8DcSABLwFoQQt0QYAQcXI7ABEgAyAAEJ4CIgA2AjAgACgCECADQQEQvAEgASgCBARAIAFBGGoQRwsgACABEBkgA61CgICAgGCECyEJIAZBEGokACAJC/cJAwt/AX4BfCMAQdACayICJABCgICAgOAAIRACQCAAIAEgAkHAAWogBEEEdiIDQQFxQQAQ0AMiBUEASA0AIANBD3EhDCAFRQRAIAxBAkYEQCAAQbL1ABBqDAILIABBxPUAEHIhEAwBCwJ/IAIrA4ACIhGZRAAAAAAAAOBBYwRAIBGqDAELQYCAgIB4CyENAn8gAisD+AEiEZlEAAAAAAAA4EFjBEAgEaoMAQtBgICAgHgLIQ4CfyACKwPwASIRmUQAAAAAAADgQWMEQCARqgwBC0GAgICAeAshDwJ/IAIrA+gBIhGZRAAAAAAAAOBBYwRAIBGqDAELQYCAgIB4CyEHAn8gAisD4AEiEZlEAAAAAAAA4EFjBEAgEaoMAQtBgICAgHgLIQgCfyACKwPYASIRmUQAAAAAAADgQWMEQCARqgwBC0GAgICAeAshBgJ/IAIrA9ABIhGZRAAAAAAAAOBBYwRAIBGqDAELQYCAgIB4CyEJAn8gAisDyAEiEZlEAAAAAAAA4EFjBEAgEaoMAQtBgICAgHgLIQogBEEBcSELAn8gAisDwAEiEZlEAAAAAAAA4EFjBEAgEaoMAQtBgICAgHgLIQVBACEDAkAgC0UNACAEQQ9xIQsCQAJAAkACQCAMDgQAAQIDBAsgAiAFNgJgIAIgCTYCVCACIAVBH3ZBBHI2AlwgAiAKQQNsQZD2AGo2AlggAiAOQQNsQfD1AGo2AlAgAkGQAmpBwABB0fUAIAJB0ABqEFUhAwwDCyACIAU2AoABIAIgCTYCeCACIAVBH3ZBBHI2AnwgAiAKQQNsQZD2AGo2AnQgAiAOQQNsQfD1AGo2AnAgAkGQAmpBwABBtfYAIAJB8ABqEFUhAyALQQNHDQIgAkGQAmogA2pBIDoAACADQQFqIQMMAgsgAiAFNgKgASACQZACakHAAEHJ9gBBzvYAIAVBkM4ASRsgAkGgAWoQVSEDIAIgCTYClAEgAiAKQQFqNgKQASADIAJBkAJqakHAACADa0HU9gAgAkGQAWoQVSADaiEDDAELIAIgCTYCtAEgAiAKQQFqNgKwASACIAU2ArwBIAIgBUEfdkEEcjYCuAEgAkGQAmpBwABB4PYAIAJBsAFqEFUhAyALQQNHDQAgAkGQAmogA2pBrMAAOwAAIANBAmohAwsCQCAEQQJxRQ0AAkACQAJAAkAgDA4EAAECAwQLIAIgBzYCCCACIAg2AgQgAiAGNgIAIAJBkAJqIANqQcAAIANrQe/2ACACEFUgA2ohAwwDCyACIAc2AiggAiAINgIkIAIgBjYCICACQZACaiADakHAACADa0Hv9gAgAkEgahBVIANqIgMgAkGQAmpqQS1BKyANQQBIGzoAACACIA0gDUEfdSIEaiAEcyIEQTxuIgU2AhAgAiAEIAVBPGxrNgIUIANBAWoiBCACQZACampBPyADa0GC9wAgAkEQahBVIARqIQMMAgsgAiAPNgI8IAIgBzYCOCACIAg2AjQgAiAGNgIwIAJBkAJqIANqQcAAIANrQYv3ACACQTBqEFUgA2ohAwwBCyACIAc2AkggAiAINgJEIAJBwQBB0AAgBkEMSBs2AkwgAiAGQQFqQQxvQX9qNgJAIAJBkAJqIANqQcAAIANrQaD3ACACQUBrEFUgA2ohAwsgACACQZACaiADEPwBIRALIAJB0AJqJAAgEAs8AgJ/AX4jAEEQayIAJAAgAEEIakEAEAIaIAA0AgghAiAAKAIMIQEgAEEQaiQAIAFB6AdtrCACQugHfnwLjwkDBX8CfgF8IwBBoAFrIgIkACACQeAAakEAQTgQTBogAkIBNwNwIAJCATcDaEKAgICA4AAhASAAIAMpAwAQLCIKEAxFBEAgAkEANgIMAkACQAJAAkAgCqciAygCBEH/////B3FFDQACQCADQQAQMCIFQVBqQQpJDQAgBUFVag4DAAEAAQtCgICAgMB+IQEgAyACQQxqIAJB4ABqEN4EDQMgAkGQAWohB0EBIQQDQAJAIAIoAgwhBiAEQQdGDQAgBiADKAIEQf////8HcU4NACAEQX9qIghBBU0EQCAIQQJ0QZjcAWooAgAhBQsgAyAGEDAgBUcNACACIAZBAWo2AgwCQCAEQQZGBEAgAyACQQxqIAcQ/wZFDQEMBwsgAyACQQxqIAJB4ABqIARBA3RqELECDQYLIARBAWohBAwBCwsgAiACKQNoQn98NwNoIAYgAygCBEH/////B3EiBU4EQCAEQQNLIQYMAgsCfgJAAkAgAyAGEDAiBEFVag4DAQYBAAsgBEHaAEcNBSACIAZBAWoiAzYCDEIADAELIAIgBkEBaiIGNgIMIAUgBmsiBUF+cUEERw0EIAMgAkEMaiACQRhqEPECDQQgBUEFRgRAIAMgAigCDCIFEDBBOkcNBSACIAVBAWo2AgwLIAMgAkEMaiACQRBqEPECDQQgAygCBEH/////B3EhBSACKAIMIQNCACACKQMQIAIpAxhCPH58Igl9IAkgBEEtRhsLIQlBACEGIAMgBUYNAgwDCyADIAJBDGoQ/gYgAyACQQxqELACQoCAgIDAfiEBIAIoAgwiBiADKAIEQf////8HcU4NAiACQfAAaiEEIAJB4ABqQQhyIQUCQCADIAYQMEFQakEJTQRAIAMgAkEMaiAEELECDQQgAyACQQxqIAUQ3QRFDQEMBAsgAyACQQxqIAUQ3QQNAyADIAJBDGoQsAIgAyACQQxqIAQQsQINAwsgAyACQQxqELACIAMgAkEMaiACQeAAahDeBA0CIAMgAkEMahCwAkEAIQQDQCAEQQNGBEAgAygCBEH/////B3EhBSACKAIMIQQDQEEAIQYgBCAFTg0DAkACQCADIAQQMCIHQVVqDgMAAQABCyACIARBAWo2AgwgAyACQQxqIAJBGGoQ8QINBiADIAJBDGogAkEQahDxAg0GQgAgAikDECACKQMYQjx+fCIBfSABIAdBLUYbIQkMBQsgAiAEQQFqIgQ2AgwMAAsACyAEQX9qQQFNBEAgAigCDCIFIAMoAgRB/////wdxTg0EIAMgBRAwQTpHDQQgAiAFQQFqNgIMCyAEQQN0IQUgBEEBaiEEIAMgAkEMaiACIAVqQfgAahCxAkUNAAsMAgsLQQAhAwNAIANBB0ZFBEAgA0EDdCIEIAJBIGpqIAJB4ABqIARqKQMAuTkDACADQQFqIQMMAQsLIAJBIGogBhCDAyAJQuDUA365oSILvQJ/IAuZRAAAAAAAAOBBYwRAIAuqDAELQYCAgIB4CyIDt71RBEAgA60hAQwBCyALEBYhAQsgACAKEAsLIAJBoAFqJAAgAQu3AQIEfwF+IABBCBAuIgRFBEBBfw8LIARCATcCAANAAkACQCADQQJGDQAgACAAKQMwIANBK2oQUSIHEAxFBEAgAEEQEC4iBQ0CIAAgBxALC0F/IQYgA0UNACAAIAEpAwAQCwsgACgCECAEEOgEIAYPCyAEIAQoAgBBAWo2AgAgBSAENgIIIAUgAhAONwMAIAcgBRCIASAAIAdBL0EBEKADIAEgA0EDdGogBzcDACADQQFqIQMMAAsAC3QBA38gAUHIAGohAyABKAJMIQIDQCACIANGRQRAIAIoAgQhBCAAIAIpAxAQJiAAIAIpAxgQJiAAIAIpAyAQJiAAIAIpAygQJiAAIAIQICAEIQIMAQsLIAEoAgRBfnFBBEcEQCAAIAFBCGoQgAMLIAAgARAgCyABAX8gASABKAIAQX9qIgI2AgAgAkUEQCAAIAEQnAcLC+8CAgR/AX4jAEEwayICJAACQCAAIAFBKGoQuwIiBhAMRQRAIAIgASgCZEF4aiIDKQMANwMgIANCgICAgDA3AwAgBhARBEAgACAAIAEpAxBCgICAgDBBASACQSBqECMQCyAAIAIpAyAQCyAAKAIQIAEQ1AMMAgsgACAGEAtBACEDIAAgACkDUEEBIAJBIGpBABCKAiEGIAAgAikDIBALQQIhBAJAIAYQDA0AIAAgASACQRBqEJkHBEAgACAGEAsMAQsgAkKAgICAMDcDCCACQoCAgIAwNwMAIAAgBiACQRBqIAIQtAIhBSAAIAYQCwNAIANBAkZFBEAgACACQRBqIANBA3RqKQMAEAsgA0EBaiEDDAELCyAFQQBHQQF0IQQgBUUhAwsgAyAERXINAQsgAiAAEI8BNwMoIAAgASkDGEKAgICAMEEBIAJBKGoQIyEGIAAgAikDKBALIAAoAhAgARDUAyAAIAYQCwsgAkEwaiQAC7cCAgV/AX4jAEEwayIFJAACQCABQSoQQSIERQ0AIAQoAgANACAAIARBGGogAhAOIgIQHyAEIANBAWoiBjYCAAJAIAZBAkcNACAEKAIUDQAgACgCECIGKAKYASIHRQ0AIAAgASACQQAgBigCnAEgBxEyAAsgBEEEaiIHIANBA3RqIggoAgQhBCADQQBHrUKAgICAEIQhAQNAIAQgCEZFBEAgBCgCBCEGIAUgBCkDCDcDACAFIAQpAxA3AwggBCkDGCEJIAUgAjcDICAFIAE3AxggBSAJNwMQIABBLUEFIAUQ/gIgBBBHIAAoAhAgBBC1AiAGIQQMAQsLIAdBASADa0EDdGoiBigCBCEEA0AgBCAGRg0BIAQoAgQhAyAEEEcgACgCECAEELUCIAMhBAwACwALIAVBMGokAAvBAgICfwN+IwBBEGsiAiQAQoCAgIAwIQcCQAJAIAAgAkEIaiAAIAEQKiIBEEANAAJAIAIpAwgiCUIBUwRADAELIAlCf3whCAJAAkACQAJAIAEgAkEEaiACEIwCRQ0AIAkgAigCACIFrVINACABpyEGIAIoAgQhAyAERQ0BIAMpAwAhByADIANBCGogBUEDdEF4ahDjAQwCCwJAIAQEQCAAIAFCABBgIgcQDA0GIAAgAUIAQgEgCEEBEPcCRQ0BDAYLIAAgASAIEGAiBxAMDQULIAAgASAIEJICQQBODQIMBAsgBUEDdCADakF4aikDACEHCyAGIAYoAihBf2o2AigLIAlCgYCAgAhUDQAgCLkQFiEICyAAIAFBMCAIEElBf0oNAQsgACAHEAtCgICAgOAAIQcLIAAgARALIAJBEGokACAHCxAAIAAgAykDAEERIAQQ9gIL6gQCA38FfiMAQRBrIgYkAAJ+AkACQAJAIAAgARAqIglCgICAgHBUDQAgCaciBS8BBkECRw0AIAUtAAVBCXFBCUcNACAFKAIQECgtAANBCHFFDQAgBSgCFCkDACIKQv////8PVg0AIAYgCkIghkIghyIBNwMIIAEgBTUCKFINACABIAKsfCIIQv////8HVQ0AIAggBTUCIFUEQCAAIAUgCKcQtwUNAwsCfyAERSACQQFIckUEQCAFKAIkIgQgAkEDdGogBCAKp0EDdBDjAUEADAELIAGnCyEHQQAhBCACQQAgAkEAShshAgNAIAIgBEZFBEAgAyAEQQN0aikDABAOIQEgBSgCJCAEIAdqQQN0aiABNwMAIARBAWohBAwBCwsgBSAIPgIoIAUoAhQgCEL/////D4M3AwAgCEKAgICACHwhAQwBCyAAIAZBCGogCRBADQEgBikDCCIBIAKsIgt8IghCgICAgICAgBBZBEAgAEGV1wBBABAVDAILAkAgBEUgAkEBSHJFBEBCACEKIAAgCSALQgAgAUF/EPcCDQMMAQsgASEKCyACQQAgAkEAShutIQtCACEBQQAhBANAIAEgC1IEQCABIAp8IQwgBEEDdCECIARBAWohBCABQgF8IQEgACAJIAwgAiADaikDABAOEI0BQQBODQEMAwsLIAAgCUEwAn4gCEL/////D4MgCEKAgICACHwiAUL/////D1gNABogCLkQFgsQSUEASA0BCyAAIAkQCyAIQv////8PgyABQv////8PWA0BGiAIuRAWDAELIAAgCRALQoCAgIDgAAshASAGQRBqJAAgAQs8ACABQQBB0AAQTCIBIAQ2AgwgASAANgIAIAEgAiADajYCPCABIAI2AjggAUEBNgIIIAFCoICAgBA3AxALfwEEfyABLQAAQdsARgRAIAFBAWoiAxBEQX9qIQIgACgCECgCOCEEQcIBIQEDQCABQc8BRwRAAkAgBCABQQJ0aigCACIFKAIEQf////8HcSACRw0AIAVBEGogAyACEHQNACAAIAEQGA8LIAFBAWohAQwBCwsQAQALIAAgARDIAQsXACAAIAApA8ABIAEgAiADQQBBfxCbBQs1AQF/IAAoAuwBIgdFBEAgAEHczQBBABAVQoCAgIDgAA8LIAAgASACIAMgBCAFIAYgBxE4AAvGAgICfwJ+QoCAgIAwIQQCQAJAIAEpAlQiBUIYhkI4h6cNACAFQiCGQjiHpwRAIAVCEIZCOIenRQ0BIAAgASkDYBAOEJABQoCAgIDgAA8LIAEgBUL/////j2CDQoCAgIAQhDcCVANAIAIgASgCFEgEQCABKAIQIAJBA3RqKAIEIgMpAlRCGIZCOIenRQRAIAAgAxCcBSIEEAwNBCAAIAQQCwsgAkEBaiECDAELCwJAIAEoAlAiAgRAQoCAgIDgAEKAgICAMCAAIAEgAhEBAEEASBshBAwBCyAAIAEpA0hCgICAgDBBAEEAEDYhBCABQoCAgIAwNwNICyAEEAwEQCABQQE6AFkgASAAKAIQKQOAARAONwNgCyABIAEpAlRC////h4Bgg0KAgIAIhDcCVAsgBA8LIAEgASkCVEL/////j2CDNwJUIAQLywUCB38BfiMAQRBrIgYkAAJ/QQAgASkCVCIJQiiGQjiHpw0AGiABIAlC//+DeINCgIAEhDcCVAJAA0ACQCACIAEoAhROBEBBACECDAELIAJBA3QhAyACQQFqIQIgACADIAEoAhBqKAIEEJ0FQQBODQEMAgsLAkADQCACIAEoAiBODQECQAJAIAEoAhwiCCACQRRsaiIDKAIIQQFHDQAgAygCDCIFQf0ARg0AIAAgBkEIaiAGQQxqIAEoAhAgAygCAEEDdGooAgQgBRDdAyIDDQELIAJBAWohAgwBCwsgACADIAEgCCACQRRsaigCEBDcAwwBC0EAIAEoAlANARogASgCSCgCJCEIQQAhAkEAIQUDQAJAIAUgASgCOE4EQANAIAIgASgCIE4NAiABKAIcIAJBFGxqIgMoAghFBEAgCCADKAIAQQJ0aigCACIFIAUoAgBBAWo2AgAgAyAFNgIECyACQQFqIQIMAAsACyABKAIQIAEoAjQgBUEMbGoiAygCCEEDdGooAgQhBAJAIAMoAgQiB0H9AEYEQCAAIAQQ/QIiCRAMDQQgACAIIAMoAgBBAnRqKAIAQRhqIAkQHwwBCyAAIAZBCGogBkEMaiAEIAcQ3QMiBwRAIAAgByAEIAMoAgQQ3AMMBAsgBigCDCIHKAIMQf0ARgRAIAAgBigCCCgCECAHKAIAQQN0aigCBBD9AiIJEAwNBCAAQQEQ1wMiBEUEQCAAIAkQCwwFCyAAIARBGGogCRAfIAggAygCAEECdGogBDYCAAwBCyAHKAIEIgRFBEAgBigCCCgCSCgCJCAHKAIAQQJ0aigCACEECyAEIAQoAgBBAWo2AgAgCCADKAIAQQJ0aiAENgIACyAFQQFqIQUMAQsLQX8gACABKQNIQoGAgIAQQQBBABAjIgkQDA0BGiAAIAkQC0EADAELQX8LIQIgBkEQaiQAIAILtAEBA38CQCABKQJUQjCGQjiHpw0AAkAgASgCUARAA0AgAiABKAIgTg0CIAEoAhwgAkEUbGoiAygCCEUEQCAAQQAQ1wMiBEUEQEF/DwsgAyAENgIECyACQQFqIQIMAAsAC0F/IQMgACABENwHDQELIAFBAToAVUEAIQIDQCACIAEoAhROBEBBAA8LIAJBA3QhBEF/IQMgAkEBaiECIAAgBCABKAIQaigCBBCeBUF/Sg0ACwsgAwuLAQACQAJAAkACQAJAIAFCIIinQQNqDgIBAAILIAAgACABIAMgBBD/AyACQQBBABA2DwsgACABEAsCQCAAIAGnIgMQngVBAEgNACAAIAMQnQVBAEgNACAAIAMQnAUiARAMRQ0DCyAAQQIQmAQMAQsgACABEAsgAEHBzQBBABAVC0KAgICA4AAhAQsgAQtEAQF/IABB5AFqIQIgAEHgAWohAAN/IAAgAigCACICRgRAQQAPCyABIAJBfGooAgBGBH8gAkF4agUgAkEEaiECDAELCwu+AQEEfyMAQRBrIgQkAAJ/IAAoAhAiBSgCqAEiA0UEQCAAIAEgAhCpCAwBCyAAIAEgAiAFKAKwASADEQkACyEBQQAhAgJAIAFFDQACQCAAIAEQyAEiBkUNACAAIAYQoAUiAwRAIAAgARAZIAAgBhASIAMhAgwCCyAAIAYQEiAFKAKsASIDRQRAIAQgATYCACAAQaHNACAEEMoCDAELIAAgASAFKAKwASADEQAAIQILIAAgARAZCyAEQRBqJAAgAgtvAgN/AX4CQCAAKAIQKAKMASICRQ0AA0AgAUEBTgRAIAFBf2ohASACKAIAIgINAQwCCwsgAikDCCIEQoCAgIBwVA0AIASnIgEvAQYQ9QFFDQAgASgCICIBLQASQQRxRQ0AIAAgASgCQBAYIQMLIAMLUgEEfyAAKAIgIgJBACACQQBKGyEEQQAhAgNAAkAgAiAERwR/IAAoAhwiBSACQRRsaigCECABRw0BIAUgAkEUbGoFQQALDwsgAkEBaiECDAALAAuCAQIEfwF+IAFBGGohBCABKAIcIQIDQCACIARGRQRAIAIoAgQhBSABQRBBFCACQX1qIgMtAABBAnEbaigCACACQX5qLwEAQQN0aikDABAOIQYgAiACQRBqNgIIIAIgBjcDECADIAMtAABBAXI6AAAgACACQXhqQQMQvAEgBSECDAELCwsrAQF/IAFBcGoiAyAAIAMpAwAgAUF4aikDABD7BCACR61CgICAgBCENwMAC6UEAgV/An4jAEEQayIFJAAgAUF4aiIHKQMAIQggAUFwaiIGKQMAIQkCfwJAAkACQAJAAkADQCAIEFQhAwJAA0BBACAJEFQiASADRiABRSADQQdGcXJFIANFIAFBB0ZxG0UEQCAAIAkgCBD7BCEEDAYLQQEhBCABQQJGIANBA0ZxIAFBA0YgA0ECRnFyDQUCQAJAAkACQAJAAkACQAJAIAFBeUYEQEF5IQEgAyIEQQFqDgkKAQUNDQ0NDQENCyADQXlHDQFBeSEEIAFBAWoOCQYAAgwMDAwMAAwLIAAgBUEIaiAJEFoNDSAAIAUgCBBaDQ4gBSsDCCAFKwMAYSEEDAwLIAFBAUcNAQsgCUL/////D4MhCQwFCyADQQFHDQELIAhC/////w+DIQgMBQsgAUF/Rw0BQX8hASADQQhqIgRBD0tBASAEdEGBggJxRXINBQsgACAJQQIQwQEiCRAMRQ0BDAcLCyADQX9HDQJBfyEEIAFBCGoiA0EPS0EBIAN0QYOCAnFFcg0DCyAAIAhBAhDBASIIEAxFDQALIAAgCRALDAQLIAMhBAsgCRD6BCEDAn8gBEF+cUECRgRAQQEgAw0BGgsgAUF+cUECRiAIEPoEQQBHcQshBCAAIAkQCyAAIAgQCwsgBiACIARHrUKAgICAEIQ3AwBBAAwCCyAAIAgQCwsgBkKAgICAMDcDACAHQoCAgIAwNwMAQX8LIQEgBUEQaiQAIAEL0AIDA38CfgF8IwBBEGsiAiQAIAFBeGoiBCkDACEGAn8CQAJAAkACQCABQXBqIgEpAwAiBUIgiKciA0EAIANBC2pBEkkbRQRAIAZCIIinIgNFIANBC2pBEUtyDQELIAAgBUECEMEBIgUQDA0CIAAgBkECEMEBIgYQDARAIAAgBRALDAQLIAVCgICAgHCDQoCAgICQf1JBACAGQoCAgIBwg0KAgICAkH9SGw0AIAEgACAFIAYQwQIiBTcDACAFEAwNAwwBCyAAIAJBCGogBRBaDQEgACACIAYQWg0CIAECfiACKwMIIAIrAwCgIge9An8gB5lEAAAAAAAA4EFjBEAgB6oMAQtBgICAgHgLIgC3vVEEQCAArQwBCyAHEBYLNwMAC0EADAILIAAgBhALCyABQoCAgIAwNwMAIARCgICAgDA3AwBBfwshACACQRBqJAAgAAuDAwEJfyMAQTBrIgckAAJAIAJCgICAgHBUDQBBEyEFAkAgAqciCi0ABUEEcUUNACAAKAIQKAJEIAovAQZBGGxqKAIUIghFDQBBA0ETIAgoAgQbIQULQX8hCSAAIAdBLGogB0EoaiAKIAUQjgENACADp0EAIANC/////29WGyEMIAVBEHEhDSAHKAIsIQggBygCKCELQQAhBQJAA0AgBSALRwRAAkACQCAMRQ0AIABBACAMIAggBUEDdGooAgQQUyIGRQ0AIAZBAE4NAQwECyANRQRAIAAgB0EIaiAKIAggBUEDdGooAgQQUyIGQQBIDQQgBkUNASAHKAIIIQYgACAHQQhqEE4gBkEEcUUNAQsgACACIAggBUEDdGoiBigCBCACQQAQEyIDEAwNAyAGKAIEIQYCfyAEBEAgACABIAYgAxBJDAELIAAgASAGIANBBxAaC0EASA0DCyAFQQFqIQUMAQsLIAAgCCALEGJBACEJDAELIAAgCCALEGILIAdBMGokACAJC0sBAn8CQCABECFFDQAgARCABQ0AQX8hAyAAIAIQOiIERQ0AIAAgBBD/BCECIAAgBBASIAIQDA0AIAAgAUE2IAJBARAaQR91DwsgAwsyAAJAIAJFDQAgARAhRQ0AIAEQgAUNACAAIAFBNiAAIAIQMkEBEBpBAE4NAEF/DwtBAAtoAQF/IAAoAhAhAgJAIAEQXUUEQCACKAIsIAFNDQEgAigCOCABQQJ0aigCACIBrUKAgICAkH+EEA4aIAAgAUEEEOYDDwtBnMkAQaENQc4XQbnJABAAAAtBzskAQaENQc8XQbnJABAAAAvWAQEEfyAAKALIASIGKAIQIgQgBCgCGCABcUF/c0ECdGooAgAhBSAEECghBAJAA0AgBUUNASABIAQgBUF/aiIHQQN0aiIFKAIERwRAIAUoAgBB////H3EhBQwBCwsgBigCFCAHQQN0aiEEAkAgA0EBRg0AIAQpAwAQhAEEQCAAIAIQCyAAIAUoAgQQ3gFBfw8LIAUtAANBCHENACAAIAIQCyAAQYCAASABENwBDwsgACAEIAIQH0EADwsgACAAKQPAASABIAJBgIAGQYCAAiAAEPgBGxCVAgt/AQF/AkAgAkKAgICAcINCgICAgJB/UUEAIANCgICAgHCDQoCAgICQf1EbRQRAIABBuMgAQQAQFQwBCyAAIAFBEhBtIgEQDA0AIAGnIgQgAj4CICAEIAM+AiQgACABQdUAQgBBAhAaGiABDwsgACADEAsgACACEAtCgICAgOAACw0AIAAgAUH6xwAQiwML1QEBBn9BfyECIAEgAUF/anFFBEAgACABQQJ0EJsCIgUEfyABQf////8DakH/////A3EhBgNAIAMgACgCJE9FBEAgACgCNCADQQJ0aigCACECA0AgAgRAIAAoAjggAkECdGooAgAiBCgCDCEHIAQgBSAGIAQoAghxQQJ0aiIEKAIANgIMIAQgAjYCACAHIQIMAQsLIANBAWohAwwBCwsgACAAKAI0ECAgACABQQF0NgIwIAAgATYCJCAAIAU2AjRBAAVBfwsPC0GNL0GhDUGAFEG4LxAAAAvZAgEGfyMAQRBrIgMkACAAIAApA4ABECYgAEGgAWohBCAAKAKkASECA0AgAiAERkUEQCACKAIEIQUgAkEYaiEGQQAhAQNAIAEgAigCEE5FBEAgACAGIAFBA3RqKQMAECYgAUEBaiEBDAELCyAAIAIQICAFIQIMAQsLIAQQbyAAEIsFIABB0ABqEOMDBEBBACEBA0AgASAAKAJASARAIAAoAkQgAUEYbGoiAigCAARAIAAgAigCBBDyAQsgAUEBaiEBDAELCyAAIAAoAkQQIEEAIQEDQCABIAAoAixIBEAgACgCOCABQQJ0aigCACICEN8DRQRAIAAgAhAgCyABQQFqIQEMAQsLIAAgACgCOBAgIAAgACgCNBAgIAAgACgC1AEQICADIAApAhg3AwggAyAAKQIQNwMAIAMgACAAKAIEEQMAIANBEGokAA8LQYQNQaENQb8PQbgNEAAAC9IBAwF/AX4BfANAAkBBfyEDAkACQAJAIAIQVA4IAAAAAAICAwECCyACQiCGQiCHIQRBACEDDAILQQAhAyACEEoiBb1C////////////AINCgICAgICAgPj/AFYNAUKAgICAgICAgIB/IQQgBUQAAAAAAADgw2MNAUL///////////8AIQQgBUQAAAAAAADgQ2QNASAFmUQAAAAAAADgQ2MEQCAFsCEEDAILQoCAgICAgICAgH8hBAwBCyAAIAIQnQEiAhAMRQ0BCwsgASAENwMAIAMLvAECAn8BfANAAkBBfyEEAkACQAJAIAIQVA4IAAAAAAICAwECCyACpyEDQQAhBAwCC0EAIQQgAhBKIgW9Qv///////////wCDQoCAgICAgID4/wBWDQFBgICAgHghAyAFRAAAAAAAAODBYw0BQf////8HIQMgBUQAAMD////fQWQNASAFmUQAAAAAAADgQWMEQCAFqiEDDAILQYCAgIB4IQMMAQsgACACEJ0BIgIQDEUNAQsLIAEgAzYCACAEC20AAkACQAJAAkACQCACQQR2QQNxQQFrDgMAAQIDCyABKAIAIgIEQCAAIAKtQoCAgIBwhBAmCyABKAIEIgFFDQMgACABrUKAgICAcIQQJg8LIAAgASgCABD3AQ8LIAEQvAUPCyAAIAEpAwAQJgsLCwAgACABEA4QnQELmAMBBn8gAyABKAIAIgUoAhxBA2xBAm0QSyEGAkAgAgRAIAAgAigCFCAGQQN0EJkCIgNFDQEgAiADNgIUCyAFKAIYQQFqIgQhAwNAIAMiAkEBdCEDIAIgBkkNAAsCQCACIARHBEAgACACIAYQ4QEQLiIDRQ0CIAMgAhC3AiEHIAVBCGoQRyAHIAUgBSgCIEEDdEEwahAkIgRBCGogACgCEEHQAGoQTSAEIAJBf2oiCTYCGEEAIQMgBCACQQJ0IgJrQQAgAhBMGiAEQTBqIQIDQCADIAQoAiBJBEACQCACKAIEIghFBEAgA0EBaiEDDAELIAIgAigCAEGAgIBgcSAEIAggCXFBf3NBAnRqIggoAgBB////H3FyNgIAIAggA0EBaiIDNgIACyACQQhqIQIMAQsLIAAgBRC5AhAZDAELIAVBCGoiAhBHIAAgBRC5AiAEIAYQ4QEQmQIiA0UEQCACIAAoAhBB0ABqEE0MAgsgAyAEELcCIgdBCGogACgCEEHQAGoQTQsgASAHNgIAIAcgBjYCHEEADwtBfwugAQEDfwJAIAAgASgCGEEBaiICIAEoAhwQ4QEiAxAuIgRFBEBBACECDAELIAQgARC5AiADECQgAhC3AiICQQE2AgAgACgCECACQQIQvAFBACEBIAJBADoAECACKAIsIgMEQCADrUKAgICAcIQQDhoLIAIQKCEDA0AgASACKAIgTw0BIAAgAygCBBAYGiADQQhqIQMgAUEBaiEBDAALAAsgAgtjAQJ/IwBBEGsiAyQAAn9BfyAAIAEoAiQgAiABKAIgQQNsQQF2EEsiAEEDdCADQQxqELQBIgJFDQAaIAMoAgwhBCABIAI2AiQgASAEQQN2IABqNgIgQQALIQEgA0EQaiQAIAELXwIBfwF8IwBBEGsiAiQAAn9BACABEIwBRQ0AGkF/IAAgAkEIaiABEEgNABogAisDCCIDnCADYSADvUKAgICAgICA+P8Ag0KAgICAgICA+P8AUnELIQAgAkEQaiQAIAALuwEBAXwgAQJ/An8DQAJAAkACQCACEFQOCAAAAAACAgIBAgtBACEAQQBB/wEgAqcQsQEQSwwEC0EAIgAgAhBKIgO9Qv///////////wCDQoCAgICAgID4/wBWIANEAAAAAAAAAABjcg0CGkH/ASADRAAAAAAA4G9AZA0DGgJ/IAOeIgOZRAAAAAAAAOBBYwRAIAOqDAELQYCAgIB4CwwDCyAAIAIQnQEiAhAMRQ0AC0F/CyEAQQALNgIAIAAL1QQBCH8jAEEQayIEJAACf0F/IAAgBEEMaiACQQAQxgINABogASgCEC0AM0EIcUUEQCAAIANBMBDcAQwBCyABLQAFQQhxBEAgBCgCDCIDIAEoAigiBUkEQCADIQYDQCAFIAZGRQRAIAAgASgCJCAGQQN0aikDABALIAZBAWohBgwBCwsgASADNgIoCyADQQBOBH4gA60FIAO4EBYLIQIgASgCFCACNwMAQQEMAQsgACAEQQRqIAEoAhQpAwAQxQEaAkACQCAEKAIEIgUgBCgCDCIHSwRAIAUgB2sgASgCECIIKAIgIgZNBEADQCAFIAdNDQQgACABIAAgBUF/ahDLBSIGEIUEIQUgACAGEBIgBUUNAyAEIAQoAgRBf2oiBTYCBAwACwALIAQgBzYCBCAIECgiBSEKA0AgCyAGTgRAA0AgCSAGTg0EAkAgBSgCBCIGRQ0AIAAgBEEIaiAGELMBRQ0AIAQoAgggBCgCBEkNACAAIAEgBSgCBBCFBBogASgCECIIECggCUEDdGohBQsgBUEIaiEFIAlBAWohCSAIKAIgIQYMAAsABQJAIAooAgQiBkUNACAAIARBCGogBhCzAUUNACAEKAIIIgYgBCgCBEkNACAKLQADQQRxDQAgBCAGQQFqNgIECyAKQQhqIQogC0EBaiELIAgoAiAhBgwBCwALAAsgBCAHNgIEIAchBQwBCyAEKAIEIQULIAAgASgCFCAFQQBOBH4gBa0FIAW4EBYLEB9BASAEKAIEIAdNDQAaIAAgA0GawAAQdgshBiAEQRBqJAAgBgu/AwIFfwJ+IAAoAhAhAiABEF0EQCABEHmtDwsCQAJAAkACQCACKAIsIAFLBEAgAigCOCABQQJ0aigCACIEKQIEIgdCgICAgICAgIBAg0KAgICAgICAgMAAUg0DIAenIgFB/////wdxIQUCQCABQX9MBEAgBUUNBSAEQRBqIgMhAgJAIAMvAQAiAUEtRw0AIARBEmoiAi8BACEBIAVBAkcNACABQf//A3FBMEYNAgsgAUH//wNxIgEQRg0EIAFByQBHIAMgBUEBdGogAmtBEEdyDQUgAkECakH0wQBBDhB0DQUMBAsgBEEQaiIBIAVqIgYgAU0NBCABLQAAIgNBLUcNAiABQQFqIQIgAS0AASEDIAVBAkcEQCACIQEMAwsgAiEBIANBMEcNAgtEAAAAAAAAAIAQFg8LQcovQaENQdkYQdzBABAAAAsgAxBGDQAgA0HJAEcgBiABa0EIR3INASABQQFqQYLCAEEHEHQNAQsgACAErUKAgICAkH+EELQFIgcQDA0BIAAgBxAsIggQDARAIAAgBxALIAgPCyAEIAinEJMCIQEgACAIEAsgAUUNASAAIAcQCwtCgICAgDAPCyAHCwoAIAAQjQQQpAML2gIBBH8jAEEQayICJAAgAkEANgIMIAJCADcDACACQX82AggCQCACQeABQfQMKAIAEQEAIgMEQCADQQBB4AEQTCIAQfwMKQIANwIIIABB9AwpAgA3AgAgACgCDEUEQCAAQQE2AgwLIAAgAikDADcDECAAIAIpAwg3AxggAEGAgBA2AmwgAEHIAGoQbyAAQdAAahBvIABB2ABqEG8gAEEAOgBoIABBoAFqEG8CQCAAEOMIDQAgAEHACEEBQSgQhgRBAEgNACAAKAJEIgFBAjYC+AIgAUEDNgKwAiABQdgMNgKcAiABQbwMNgKMASABQaAMNgLUASABQQQ2ApADIAFBBTYC4AIgABDWCA0AIABBgIAQNgJwIABBADYCdCAAAn9BACAAKAJwIgFFDQAaIAAoAnQgAWsLNgJ4IABCgICAgCA3A4ABDAILIAAQsAULQQAhAwsgAkEQaiQAIAML9wEBA38CQCAAIAIQO0UNACACpyIELwEGQQ5GBEAgACABIAQoAiApAwAQvwUPCyABQoCAgIBwVA0AAkAgACACQTsgAkEAEBMiAkL/////b1gEQEF/IQMgAhAMDQEgAEHxO0EAEBUMAQsgAachAyACpyEFAkADQAJAIAMoAhAoAiwiBEUEQCADLwEGQSlHDQMgA61CgICAgHCEEA4hAQNAQX8hAyAAIAEQlwIiARAMDQUgARAnDQQgAacgBUYEQCAAIAEQCwwDCyAAEH5FDQALIAAgARALDAQLIAQiAyAFRw0BCwtBASEDDAELQQAhAwsgACACEAsLIAMLhgECAX8BfiMAQRBrIgMkACADIAE3AwgCfwJAIAIQIQRAQX8gACACQcsBIAJBABATIgQQDA0CGgJAIAQQJw0AIAQQEQ0AIAAgACAEIAJBASADQQhqEDYQLQwDCyAAIAIQOw0BCyAAQfkUQQAQFUF/DAELIAAgASACEL4FCyEAIANBEGokACAAC3QCAX8BfiMAQYACayIFJAAgBUGAAiACIAMQ0gIaAkAgACAAIAFBA3RqKQNYQQMQUSIGEAwEQEKAgICAICEGDAELIAAgBkEzIAAgBRByQQMQGhoLIAQEQCAAIAZBAEEAQQAQvwILIAAgBhCQASAFQYACaiQAC4MDAgV/AX4jAEEQayIGJAACQAJAAkAgAhBdBEAgBiACEHk2AgAgAUHAAEHxDSAGEFUaDAELIAAoAiwgAk0NASACRQRAIAFBgjsoAAA2AAMgAUH/OigAADYAAAwBCyAAKAI4IAJBAnRqKAIAIgQQ3wMNAiABIQICQAJAIARFDQBBACEAIAQpAgQiCKciB0EATgRAIARBEGohBUEAIQIDQCACIAdGRQRAIAMgAiAFai0AAHIhAyACQQFqIQIMAQsLIANBgAFIDQILIARBEGohBSABIQIDQCAAIAinIgNB/////wdxTw0BAn8gA0F/TARAIAQgAEEBdGovARAMAQsgACAFai0AAAshAyACIAFrQTlKDQECfyADQf8ATQRAIAIgAzoAACACQQFqDAELIAIgAxCyAyACagshAiAAQQFqIQAgBCkCBCEIDAALAAsgAkEAOgAADAELIAUhAQsgBkEQaiQAIAEPC0HKL0GhDUHfF0HvOhAAAAtBhjtBoQ1B6RdB7zoQAAALHAAgABAhRQRAQQAPCyAApy0ABUEBdkF/c0EBcQsqAAJAAkACQCABLQAEQQ9xDgICAAELIAAgARD5Bw8LEAEACyAAIAEQ+AcLCQBBASAAELgCC+ICAQJ/IAAoAhAQ8QgCQCAAQTAQLiIDBEAgA0EANgIgIANBADYCGCADQQE6AAUgAyACOwEGIAMgATYCECADIAAgASgCHEEDdBAuIgQ2AhQgBA0BIAAgAxAZCyAAKAIQIAEQnAJCgICAgOAADwsCQAJAAkACQAJAAkACQAJAIAJBf2oOHgcABgQEBAQCBgQGAQYGBgYGBQYGAgICAgICAgICAwYLIANBADYCKCADQgA3AyAgAyADLQAFQQxyOgAFIAEgACgCJEcEfyAAIANBMEEKEH8FIAQLQgA3AwAMBgsgBEKAgICAMDcDAAwFCyADQgA3AiQgAyADLQAFQQxyOgAFDAQLIANCADcCJAwDCyADQoCAgIAwNwMgDAELIANCADcDIAsgACgCECgCRCACQRhsaigCFEUNACADIAMtAAVBBHI6AAULIANBATYCACAAKAIQIANBABC8ASADrUKAgICAcIQLQAAgACABIAJ0IAJrQRFqEOgBIgBFBEBBAA8LIABBADYCDCAAQQE2AgAgACABQf////8HcSACQR90cq03AgQgAAvXAQIBfwF+IwBB0ABrIgMkAAJAAn4gARBdBEAgAyABEHk2AgAgA0EQakHAAEHxDSADEFUaIAAgA0EQahByDAELIAAoAhAiACgCLCABTQ0BAkACQCAAKAI4IgAgAUECdGooAgAiASkCBCIEQoCAgICAgICAQINCgICAgICAgIDAAFENACACRQ0BIASnQYCAgIB4Rw0AIAAoArwBIQELIAGtQoCAgICQf4QQDgwBCyABrUKAgICAgH+EEA4LIQQgA0HQAGokACAEDwtByi9BoQ1BmBhB3y8QAAALCgAgAEEBdEEBcgtoAQF/IAEoAgQhAyAAKAIEQQBOBEAgA0EATgRAIABBEGogAUEQaiACEHQPC0EAIAFBEGogAEEQaiACEIcFaw8LIABBEGohACADQQBOBEAgACABQRBqIAIQhwUPCyAAIAFBEGogAhD8BwsxAQF/IAAoAgQiAkF/TARAIABBEGogAkH/////B3EgARD9Bw8LIABBEGogAiABEM0FC2ACAn8BfiMAQRBrIgIkAAJAIAFBAE4EQCABEJEBIQMMAQsgAiABNgIAIAJBBWpBC0HxDSACEFUaIAAgAkEFahByIgQQDA0AIAAoAhAgBKdBARDPAiEDCyACQRBqJAAgAwvhAQIGfwF+AkAgASgCBCIEQf////8HcSICQX9qQQlLDQACfyAEQX9MBEAgAS8BEAwBCyABLQAQCyIDEEZFDQACfwJAIANBMEYEQEEAIgMgAkEBRw0CGgwBCyACQQEgAkEBSxshBSABQRBqIQYgA0FQaiEDIARBf0ohB0EBIQIDQCACIAVGDQECfyAHRQRAIAEgAkEBdGovARAMAQsgAiAGai0AAAsiBBBGRQ0DIARBUGqsIAOtQgp+fCIIpyEDIAJBAWohAiAIQoCAgIAQVA0ACwwCCyAAIAM2AgBBAQsPC0EACywBAX8DQCABIANGRQRAIAAgA2otAAAgAkGHAmxqIQIgA0EBaiEDDAELCyACC4gCAQJ/IAAgASgCBBASA0AgAiABKAIUTkUEQCAAIAEoAhAgAkEDdGooAgAQEiACQQFqIQIMAQsLIAAgASgCEBAZQQAhAgNAIAIgASgCIEgEQCABKAIcIAJBFGxqIgMoAghFBEAgACgCECADKAIEEPcBCyAAIAMoAhAQEiAAIAMoAgwQEiACQQFqIQIMAQsLIAAgASgCHBAZIAAgASgCKBAZQQAhAgNAIAIgASgCOE5FBEAgACABKAI0IAJBDGxqKAIEEBIgAkEBaiECDAELCyAAIAEoAjQQGSAAIAEpA0AQCyAAIAEpA0gQCyAAIAEpA2AQCyAAIAEpA2gQCyABQQhqEEcgACABEBkLrwICAn8DfiMAQSBrIgIkAEKAgICA4AAhBwJAIAAgAykDACIGEGgNACAAIAFBKhBtIgEQDA0AAkAgAEEgEGsiBEUNAEEAIQMgBEEANgIUIARBADYCACAEQQRqIQUDQCADQQJGRQRAIAUgA0EDdGoQbyADQQFqIQMMAQsLIARCgICAgDA3AxggASAEEIgBIAAgAkEQaiABEJAFDQACQCAAIAZCgICAgDBBAiACQRBqECMiCBAMBEAgAiAAEI8BNwMIIAAgAikDGEKAgICAMEEBIAJBCGoQIyEGIAAgAikDCBALIAYQDA0BIAAgBhALCyAAIAgQCyAAIAIpAxAQCyAAIAIpAxgQCyABIQcMAgsgACACKQMQEAsgACACKQMYEAsLIAAgARALCyACQSBqJAAgBwsWACAARQRAQQAPC0GUpwQgADYCAEF/CzMAIAECfyACKAJMQX9MBEAgACABIAIQmQQMAQsgACABIAIQmQQLIgBGBEAPCyAAIAFuGgt/AQN/IwBBEGsiASQAIAFBCjoADwJAIAAoAhAiAkUEQCAAENMFDQEgACgCECECCwJAIAAoAhQiAyACTw0AIAAsAEtBCkYNACAAIANBAWo2AhQgA0EKOgAADAELIAAgAUEPakEBIAAoAiQRAABBAUcNACABLQAPGgsgAUEQaiQAC1kBAX8gACAALQBKIgFBf2ogAXI6AEogACgCACIBQQhxBEAgACABQSByNgIAQX8PCyAAQgA3AgQgACAAKAIsIgE2AhwgACABNgIUIAAgASAAKAIwajYCEEEAC5UGAgR/A34jAEGAAWsiBSQAAkACQAJAIAMgBEIAQgAQ/wFFDQAgAyAEEP0IIQcgAkIwiKciCEH//wFxIgZB//8BRg0AIAcNAQsgBUEQaiABIAIgAyAEEDMgBSAFKQMQIgEgBSkDGCICIAEgAhDZBSAFKQMIIQIgBSkDACEEDAELIAEgAkL///////8/gyAGrUIwhoQiCiADIARC////////P4MgBEIwiKdB//8BcSIHrUIwhoQiCRD/AUEATARAIAEgCiADIAkQ/wEEQCABIQQMAgsgBUHwAGogASACQgBCABAzIAUpA3ghAiAFKQNwIQQMAQsgBgR+IAEFIAVB4ABqIAEgCkIAQoCAgICAgMC7wAAQMyAFKQNoIgpCMIinQYh/aiEGIAUpA2ALIQQgB0UEQCAFQdAAaiADIAlCAEKAgICAgIDAu8AAEDMgBSkDWCIJQjCIp0GIf2ohByAFKQNQIQMLIAlC////////P4NCgICAgICAwACEIQkgCkL///////8/g0KAgICAgIDAAIQhCiAGIAdKBEADQAJ+IAogCX0gBCADVK19IgtCAFkEQCALIAQgA30iBIRQBEAgBUEgaiABIAJCAEIAEDMgBSkDKCECIAUpAyAhBAwFCyALQgGGIARCP4iEDAELIApCAYYgBEI/iIQLIQogBEIBhiEEIAZBf2oiBiAHSg0ACyAHIQYLAkAgCiAJfSAEIANUrX0iCUIAUwRAIAohCQwBCyAJIAQgA30iBIRCAFINACAFQTBqIAEgAkIAQgAQMyAFKQM4IQIgBSkDMCEEDAELIAlC////////P1gEQANAIARCP4ghASAGQX9qIQYgBEIBhiEEIAEgCUIBhoQiCUKAgICAgIDAAFQNAAsLIAhBgIACcSEHIAZBAEwEQCAFQUBrIAQgCUL///////8/gyAGQfgAaiAHcq1CMIaEQgBCgICAgICAwMM/EDMgBSkDSCECIAUpA0AhBAwBCyAJQv///////z+DIAYgB3KtQjCGhCECCyAAIAQ3AwAgACACNwMIIAVBgAFqJAALiQQCAn8EfgJAIAG9IgZCAYYiBVAgBkL///////////8Ag0KAgICAgICA+P8AVnJFBEAgAL0iB0I0iKdB/w9xIgJB/w9HDQELIAAgAaIiACAAow8LIAdCAYYiBCAFVgRAIAZCNIinQf8PcSEDAn4gAkUEQEEAIQIgB0IMhiIEQgBZBEADQCACQX9qIQIgBEIBhiIEQn9VDQALCyAHQQEgAmuthgwBCyAHQv////////8Hg0KAgICAgICACIQLIQQCfiADRQRAQQAhAyAGQgyGIgVCAFkEQANAIANBf2ohAyAFQgGGIgVCf1UNAAsLIAZBASADa62GDAELIAZC/////////weDQoCAgICAgIAIhAshBiACIANKBEADQAJAIAQgBn0iBUIAUw0AIAUiBEIAUg0AIABEAAAAAAAAAACiDwsgBEIBhiEEIAJBf2oiAiADSg0ACyADIQILAkAgBCAGfSIFQgBTDQAgBSIEQgBSDQAgAEQAAAAAAAAAAKIPCwJAIARC/////////wdWBEAgBCEFDAELA0AgAkF/aiECIARCgICAgICAgARUIQMgBEIBhiIFIQQgAw0ACwsgB0KAgICAgICAgIB/gyEEIAJBAU4EfiAFQoCAgICAgIB4fCACrUI0hoQFIAVBASACa62ICyAEhL8PCyAARAAAAAAAAAAAoiAAIAQgBVEbC6MMAQZ/IAAgAWohBQJAAkAgACgCBCICQQFxDQAgAkEDcUUNASAAKAIAIgMgAWohASAAIANrIgBBiKgEKAIARwRAQYSoBCgCACEEIANB/wFNBEAgACgCCCIEIANBA3YiA0EDdEGcqARqRxogBCAAKAIMIgJGBEBB9KcEQfSnBCgCAEF+IAN3cTYCAAwDCyAEIAI2AgwgAiAENgIIDAILIAAoAhghBgJAIAAgACgCDCICRwRAIAQgACgCCCIDTQRAIAMoAgwaCyADIAI2AgwgAiADNgIIDAELAkAgAEEUaiIDKAIAIgQNACAAQRBqIgMoAgAiBA0AQQAhAgwBCwNAIAMhByAEIgJBFGoiAygCACIEDQAgAkEQaiEDIAIoAhAiBA0ACyAHQQA2AgALIAZFDQECQCAAIAAoAhwiA0ECdEGkqgRqIgQoAgBGBEAgBCACNgIAIAINAUH4pwRB+KcEKAIAQX4gA3dxNgIADAMLIAZBEEEUIAYoAhAgAEYbaiACNgIAIAJFDQILIAIgBjYCGCAAKAIQIgMEQCACIAM2AhAgAyACNgIYCyAAKAIUIgNFDQEgAiADNgIUIAMgAjYCGAwBCyAFKAIEIgJBA3FBA0cNAEH8pwQgATYCACAFIAJBfnE2AgQgACABQQFyNgIEIAUgATYCAA8LAkAgBSgCBCICQQJxRQRAIAVBjKgEKAIARgRAQYyoBCAANgIAQYCoBEGAqAQoAgAgAWoiATYCACAAIAFBAXI2AgQgAEGIqAQoAgBHDQNB/KcEQQA2AgBBiKgEQQA2AgAPCyAFQYioBCgCAEYEQEGIqAQgADYCAEH8pwRB/KcEKAIAIAFqIgE2AgAgACABQQFyNgIEIAAgAWogATYCAA8LQYSoBCgCACEDIAJBeHEgAWohAQJAIAJB/wFNBEAgBSgCCCIEIAJBA3YiAkEDdEGcqARqRxogBCAFKAIMIgNGBEBB9KcEQfSnBCgCAEF+IAJ3cTYCAAwCCyAEIAM2AgwgAyAENgIIDAELIAUoAhghBgJAIAUgBSgCDCICRwRAIAMgBSgCCCIDTQRAIAMoAgwaCyADIAI2AgwgAiADNgIIDAELAkAgBUEUaiIDKAIAIgQNACAFQRBqIgMoAgAiBA0AQQAhAgwBCwNAIAMhByAEIgJBFGoiAygCACIEDQAgAkEQaiEDIAIoAhAiBA0ACyAHQQA2AgALIAZFDQACQCAFIAUoAhwiA0ECdEGkqgRqIgQoAgBGBEAgBCACNgIAIAINAUH4pwRB+KcEKAIAQX4gA3dxNgIADAILIAZBEEEUIAYoAhAgBUYbaiACNgIAIAJFDQELIAIgBjYCGCAFKAIQIgMEQCACIAM2AhAgAyACNgIYCyAFKAIUIgNFDQAgAiADNgIUIAMgAjYCGAsgACABQQFyNgIEIAAgAWogATYCACAAQYioBCgCAEcNAUH8pwQgATYCAA8LIAUgAkF+cTYCBCAAIAFBAXI2AgQgACABaiABNgIACyABQf8BTQRAIAFBA3YiAkEDdEGcqARqIQECf0H0pwQoAgAiA0EBIAJ0IgJxRQRAQfSnBCACIANyNgIAIAEMAQsgASgCCAshAyABIAA2AgggAyAANgIMIAAgATYCDCAAIAM2AggPC0EfIQMgAEIANwIQIAFB////B00EQCABQQh2IgIgAkGA/j9qQRB2QQhxIgJ0IgMgA0GA4B9qQRB2QQRxIgN0IgQgBEGAgA9qQRB2QQJxIgR0QQ92IAIgA3IgBHJrIgJBAXQgASACQRVqdkEBcXJBHGohAwsgACADNgIcIANBAnRBpKoEaiECAkACQEH4pwQoAgAiBEEBIAN0IgdxRQRAQfinBCAEIAdyNgIAIAIgADYCACAAIAI2AhgMAQsgAUEAQRkgA0EBdmsgA0EfRht0IQMgAigCACECA0AgAiIEKAIEQXhxIAFGDQIgA0EddiECIANBAXQhAyAEIAJBBHFqIgdBEGooAgAiAg0ACyAHIAA2AhAgACAENgIYCyAAIAA2AgwgACAANgIIDwsgBCgCCCIBIAA2AgwgBCAANgIIIABBADYCGCAAIAQ2AgwgACABNgIICwuFAQECfyAARQRAIAEQnwIPCyABQUBPBEBBlKcEQTA2AgBBAA8LIABBeGpBECABQQtqQXhxIAFBC0kbEIMJIgIEQCACQQhqDwsgARCfAiICRQRAQQAPCyACIABBfEF4IABBfGooAgAiA0EDcRsgA0F4cWoiAyABIAMgAUkbECQaIAAQ/gEgAgvYAwICfwJ+IwBBIGsiAiQAAkAgAUL///////////8AgyIFQoCAgICAgMD/Q3wgBUKAgICAgIDAgLx/fFQEQCABQgSGIABCPIiEIQQgAEL//////////w+DIgBCgYCAgICAgIAIWgRAIARCgYCAgICAgIDAAHwhBAwCCyAEQoCAgICAgICAQH0hBCAAQoCAgICAgICACIVCAFINASAEQgGDIAR8IQQMAQsgAFAgBUKAgICAgIDA//8AVCAFQoCAgICAgMD//wBRG0UEQCABQgSGIABCPIiEQv////////8Dg0KAgICAgICA/P8AhCEEDAELQoCAgICAgID4/wAhBCAFQv///////7//wwBWDQBCACEEIAVCMIinIgNBkfcASQ0AIAJBEGogACABQv///////z+DQoCAgICAgMAAhCIEIANB/4h/ahB7IAIgACAEQYH4ACADaxDRAiACKQMIQgSGIAIpAwAiAEI8iIQhBCACKQMQIAIpAxiEQgBSrSAAQv//////////D4OEIgBCgYCAgICAgIAIWgRAIARCAXwhBAwBCyAAQoCAgICAgICACIVCAFINACAEQgGDIAR8IQQLIAJBIGokACAEIAFCgICAgICAgICAf4OEvwuGEQIFfwx+IwBBwAFrIgUkACAEQv///////z+DIRIgAkL///////8/gyELIAIgBIVCgICAgICAgICAf4MhESAEQjCIp0H//wFxIQcCQAJAAkAgAkIwiKdB//8BcSIJQX9qQf3/AU0EQCAHQX9qQf7/AUkNAQsgAVAgAkL///////////8AgyIMQoCAgICAgMD//wBUIAxCgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhEQwCCyADUCAEQv///////////wCDIgJCgICAgICAwP//AFQgAkKAgICAgIDA//8AURtFBEAgBEKAgICAgIAghCERIAMhAQwCCyABIAxCgICAgICAwP//AIWEUARAIAMgAkKAgICAgIDA//8AhYRQBEBCACEBQoCAgICAgOD//wAhEQwDCyARQoCAgICAgMD//wCEIRFCACEBDAILIAMgAkKAgICAgIDA//8AhYRQBEBCACEBDAILIAEgDIRQDQIgAiADhFAEQCARQoCAgICAgMD//wCEIRFCACEBDAILIAxC////////P1gEQCAFQbABaiABIAsgASALIAtQIgYbeSAGQQZ0rXynIgZBcWoQe0EQIAZrIQYgBSkDuAEhCyAFKQOwASEBCyACQv///////z9WDQAgBUGgAWogAyASIAMgEiASUCIIG3kgCEEGdK18pyIIQXFqEHsgBiAIakFwaiEGIAUpA6gBIRIgBSkDoAEhAwsgBUGQAWogEkKAgICAgIDAAIQiFEIPhiADQjGIhCICQoTJ+c6/5ryC9QAgAn0iBBC1ASAFQYABakIAIAUpA5gBfSAEELUBIAVB8ABqIAUpA4gBQgGGIAUpA4ABQj+IhCIEIAIQtQEgBUHgAGogBEIAIAUpA3h9ELUBIAVB0ABqIAUpA2hCAYYgBSkDYEI/iIQiBCACELUBIAVBQGsgBEIAIAUpA1h9ELUBIAVBMGogBSkDSEIBhiAFKQNAQj+IhCIEIAIQtQEgBUEgaiAEQgAgBSkDOH0QtQEgBUEQaiAFKQMoQgGGIAUpAyBCP4iEIgQgAhC1ASAFIARCACAFKQMYfRC1ASAGIAkgB2tqIQYCfkIAIAUpAwhCAYYgBSkDAEI/iIRCf3wiDEL/////D4MiBCACQiCIIgp+Ig0gDEIgiCIMIAJC/////w+DIhB+fCICQiCIIAIgDVStQiCGhCAKIAx+fCACQiCGIgogBCAQfnwiAiAKVK18IAIgBCADQhGIQv////8PgyINfiIQIAwgA0IPhkKAgP7/D4MiDn58IgpCIIYiDyAEIA5+fCAPVK0gDCANfiAKIBBUrUIghiAKQiCIhHx8fCIKIAJUrXwgCkIAUq18fSICQv////8PgyINIAR+IhAgDCANfiIOIAQgAkIgiCIPfnwiAkIghnwiDSAQVK0gDCAPfiACIA5UrUIghiACQiCIhHx8IA1CACAKfSICQiCIIgogBH4iECACQv////8PgyIOIAx+fCICQiCGIg8gBCAOfnwgD1StIAogDH4gAiAQVK1CIIYgAkIgiIR8fHwiAiANVK18IAJCfnwiECACVK18Qn98IgpC/////w+DIgIgC0IChiABQj6IhEL/////D4MiBH4iDSABQh6IQv////8PgyIMIApCIIgiCn58Ig4gDVStIA4gEEIgiCINIAtCHohC///v/w+DQoCAEIQiC358Ig8gDlStfCAKIAt+fCACIAt+IhMgBCAKfnwiDiATVK1CIIYgDkIgiIR8IA8gDkIghnwiDiAPVK18IA4gDCANfiITIBBC/////w+DIhAgBH58Ig8gE1StIA8gAiABQgKGQvz///8PgyITfnwiFSAPVK18fCIPIA5UrXwgDyAKIBN+IgogCyAQfnwiCyAEIA1+fCIEIAIgDH58IgJCIIggAiAEVK0gCyAKVK0gBCALVK18fEIghoR8IgsgD1StfCALIBUgDSATfiIEIAwgEH58IgxCIIggDCAEVK1CIIaEfCIEIBVUrSAEIAJCIIZ8IARUrXx8IgQgC1StfCICQv////////8AWARAIAFCMYYgBEL/////D4MiASADQv////8PgyIMfiILQgBSrX1CACALfSIQIARCIIgiCyAMfiIOIAEgA0IgiCIKfnwiDUIghiIPVK19IAJC/////w+DIAx+IAEgEkL/////D4N+fCAKIAt+fCANIA5UrUIghiANQiCIhHwgBCAUQiCIfiADIAJCIIh+fCACIAp+fCALIBJ+fEIghnx9IRIgBkF/aiEGIBAgD30MAQsgBEIhiCEKIAFCMIYgAkI/hiAEQgGIhCIEQv////8PgyIBIANC/////w+DIgx+IgtCAFKtfUIAIAt9Ig0gASADQiCIIgt+IhAgCiACQh+GhCIOQv////8PgyIPIAx+fCIKQiCGIhNUrX0gBCAUQiCIfiADIAJCIYh+fCACQgGIIgIgC358IA4gEn58QiCGIAsgD34gAkL/////D4MgDH58IAEgEkL/////D4N+fCAKIBBUrUIghiAKQiCIhHx8fSESIA0gE30LIQEgBkGAgAFOBEAgEUKAgICAgIDA//8AhCERQgAhAQwBCyAGQf//AGohByAGQYGAf0wEQAJAIAcNACAEIAFCAYYgA1YgEkIBhiABQj+IhCIBIBRWIAEgFFEbrXwiASAEVK0gAkL///////8/g3wiAkKAgICAgIDAAINQDQAgAiARhCERDAILQgAhAQwBCyAEIAFCAYYgA1ogEkIBhiABQj+IhCIBIBRaIAEgFFEbrXwiASAEVK0gAkL///////8/gyAHrUIwhoR8IBGEIRELIAAgATcDACAAIBE3AwggBUHAAWokAA8LIABCADcDACAAQoCAgICAgOD//wAgESACIAOEUBs3AwggBUHAAWokAAvHAQIBfwJ+QX8hAwJAIABCAFIgAUL///////////8AgyIEQoCAgICAgMD//wBWIARCgICAgICAwP//AFEbDQBBACACQv///////////wCDIgVCgICAgICAwP//AFYgBUKAgICAgIDA//8AURsNACAAIAQgBYSEUARAQQAPCyABIAKDQgBZBEAgAEIAVCABIAJTIAEgAlEbDQEgACABIAKFhEIAUg8LIABCAFYgASACVSABIAJRGw0AIAAgASAChYRCAFIhAwsgAwsuAgF/AXwjAEEQayIBJAAgASAAEIsJIAEpAwAgASkDCBDYBSECIAFBEGokACACC/ADAgR/AX4CQAJAAkACfyAAKAIEIgEgACgCaEkEQCAAIAFBAWo2AgQgAS0AAAwBCyAAEFsLIgFBVWoOAwEAAQALIAFBUGohAgwBCyABQS1GIQQCQAJ/IAAoAgQiASAAKAJoSQRAIAAgAUEBajYCBCABLQAADAELIAAQWwsiAUFQaiICQQpJDQAgACgCaEUNACAAIAAoAgRBf2o2AgQLCwJAIAJBCkkEQEEAIQIDQCABIAJBCmxqIQICfyAAKAIEIgEgACgCaEkEQCAAIAFBAWo2AgQgAS0AAAwBCyAAEFsLIgFBUGoiA0EJTUEAIAJBUGoiAkHMmbPmAEgbDQALIAKsIQUCQCADQQpPDQADQCABrSAFQgp+fEJQfCEFAn8gACgCBCIBIAAoAmhJBEAgACABQQFqNgIEIAEtAAAMAQsgABBbCyIBQVBqIgNBCUsNASAFQq6PhdfHwuujAVMNAAsLIANBCkkEQANAAn8gACgCBCIBIAAoAmhJBEAgACABQQFqNgIEIAEtAAAMAQsgABBbC0FQakEKSQ0ACwsgACgCaARAIAAgACgCBEF/ajYCBAtCACAFfSAFIAQbIQUMAQtCgICAgICAgICAfyEFIAAoAmhFDQAgACAAKAIEQX9qNgIEQoCAgICAgICAgH8PCyAFC78CAQF/IwBB0ABrIgQkAAJAIANBgIABTgRAIARBIGogASACQgBCgICAgICAgP//ABAzIAQpAyghAiAEKQMgIQEgA0H//wFIBEAgA0GBgH9qIQMMAgsgBEEQaiABIAJCAEKAgICAgICA//8AEDMgA0H9/wIgA0H9/wJIG0GCgH5qIQMgBCkDGCECIAQpAxAhAQwBCyADQYGAf0oNACAEQUBrIAEgAkIAQoCAgICAgMAAEDMgBCkDSCECIAQpA0AhASADQYOAfkoEQCADQf7/AGohAwwBCyAEQTBqIAEgAkIAQoCAgICAgMAAEDMgA0GGgH0gA0GGgH1KG0H8/wFqIQMgBCkDOCECIAQpAzAhAQsgBCABIAJCACADQf//AGqtQjCGEDMgACAEKQMINwMIIAAgBCkDADcDACAEQdAAaiQACzUAIAAgATcDACAAIAJC////////P4MgBEIwiKdBgIACcSACQjCIp0H//wFxcq1CMIaENwMICxAAIABBIEYgAEF3akEFSXIL2QEBBH8gACgCVCEDAkAgACgCFCAAKAIcIgVrIgYEQCAAIAU2AhQgACAFIAYQ4AUgBkkNAQsCQCADKAIQQeEARwRAIAMoAgAhBAwBCyADIAMoAgQiBDYCAAsgAygCDCAEaiABIAMoAgggBGsiASACIAEgAkkbIgQQJBogAyADKAIAIARqIgE2AgAgASADKAIETQ0AIAMgATYCBCABIAMoAggiAkkEQCADKAIMIAFqQQA6AAAgBA8LIAJFDQAgACgCAEEEcUUNACACIAMoAgxqQX9qQQA6AAALIAQLxQMCA38FfiMAQRBrIgIkACAEQZkeai0AACIGrSEKAkACQCADKQMAIghC/////29YBEBCgICAgOAAIQkgACACQQhqIAgQwgENAiAAQoCAgIAwIAIpAwgiCyAKhhCBAyIKEAwNAkIAIQggAkIANwMADAELAkACQCAIpyIFLwEGIgdBbWpB//8DcUEBTQRAIAUoAiAhBUKAgICA4AAhCSAAIAIgAykDCBDCAQ0EIAUtAAQNAgJAIAIpAwAiCEF/IAZ0QX9zIgasg1AEQCAIIAUoAgAiB6wiC1gNAQsgAEGg1wEQagwFCwJAIAMpAxAiDBARBEAgBiAHcQ0BIAIgCyAIfSAKiCILNwMIDAMLIAAgAkEIaiAMEMIBDQUgBS0ABA0DIAIpAwgiCyAKhiAIfCAFNAIAWA0CCyAAQa/XARBqDAQLIAdBa2pB//8DcUEITQRAIAAgASAIIAQQmgghCQwECyAAIAEgCCAEEJkIIQkMAwsgAykDABAOIQoMAQsgABBxDAELAkAgACABIAQQbSIJEAwEQCAAIAoQCwwBCyAAIAkgCiAIIAsQ5ANFDQEgACAJEAsLQoCAgIDgACEJCyACQRBqJAAgCQsPACAAIAEgAkEAQQMQpQILuwIAAkAgAUEUSw0AAkACQAJAAkACQAJAAkACQAJAAkAgAUF3ag4KAAECAwQFBgcICQoLIAIgAigCACIBQQRqNgIAIAAgASgCADYCAA8LIAIgAigCACIBQQRqNgIAIAAgATQCADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATUCADcDAA8LIAIgAigCAEEHakF4cSIBQQhqNgIAIAAgASkDADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATIBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATMBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATAAADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATEAADcDAA8LIAIgAigCAEEHakF4cSIBQQhqNgIAIAAgASsDADkDAA8LIAAgAiADEQMACwtCAQN/IAAoAgAsAAAQRgRAA0AgACgCACICLAAAIQMgACACQQFqNgIAIAMgAUEKbGpBUGohASACLAABEEYNAAsLIAELfwIBfwF+IAC9IgNCNIinQf8PcSICQf8PRwR8IAJFBEAgASAARAAAAAAAAAAAYQR/QQAFIABEAAAAAAAA8EOiIAEQ5QUhACABKAIAQUBqCzYCACAADwsgASACQYJ4ajYCACADQv////////+HgH+DQoCAgICAgIDwP4S/BSAACwsSACAARQRAQQAPCyAAIAEQmwkLeQEBfyAABEAgACgCTEF/TARAIAAQnwQPCyAAEJ8EDwtB8KYEKAIABEBB8KYEKAIAEOcFIQELQeCnBCgCACIABEADQCAAKAJMQQBOBH9BAQVBAAsaIAAoAhQgACgCHEsEQCAAEJ8EIAFyIQELIAAoAjgiAA0ACwsgAQusAwMCfwF+A3wgAL0iBUKAgICAgP////8Ag0KBgICA8ITl8j9UIgRFBEBEGC1EVPsh6T8gACAAmiAFQn9VIgMboUQHXBQzJqaBPCABIAGaIAMboaAhACAFQj+IpyEDRAAAAAAAAAAAIQELIAAgACAAIACiIgaiIgdEY1VVVVVV1T+iIAEgBiABIAcgBiAGoiIBIAEgASABIAFEc1Ng28t1876iRKaSN6CIfhQ/oKJEAWXy8thEQz+gokQoA1bJIm1tP6CiRDfWBoT0ZJY/oKJEev4QERERwT+gIAYgASABIAEgASABRNR6v3RwKvs+okTpp/AyD7gSP6CiRGgQjRr3JjA/oKJEFYPg/sjbVz+gokSThG7p4yaCP6CiRP5Bsxu6oas/oKKgoqCioKAiBqAhASAERQRAQQEgAkEBdGu3IgcgACAGIAEgAaIgASAHoKOhoCIAIACgoSIAmiAAIAMbDwsgAgR8RAAAAAAAAPC/IAGjIgcgAb1CgICAgHCDvyIIIAe9QoCAgIBwg78iAaJEAAAAAAAA8D+gIAYgCCAAoaEgAaKgoiABoAUgAQsLzw8DCH8Cfgh8RAAAAAAAAPA/IQwCQAJAAkAgAb0iCkIgiKciA0H/////B3EiAiAKpyIGckUNACAAvSILQiCIpyEFIAunIglFQQAgBUGAgMD/A0YbDQAgBUH/////B3EiBEGAgMD/B0sgBEGAgMD/B0YgCUEAR3FyIAJBgIDA/wdLckVBACAGRSACQYCAwP8HR3IbRQRAIAAgAaAPCwJAAkACfwJAIAVBf0oNAEECIAJB////mQRLDQEaIAJBgIDA/wNJDQAgAkEUdiEHIAJBgICAigRPBEBBACAGQbMIIAdrIgh2IgcgCHQgBkcNAhpBAiAHQQFxawwCCyAGDQMgAkGTCCAHayIGdiIHIAZ0IAJHDQJBAiAHQQFxayEIDAILQQALIQggBg0BCyACQYCAwP8HRgRAIARBgIDAgHxqIAlyRQ0CIARBgIDA/wNPBEAgAUQAAAAAAAAAACADQX9KGw8LRAAAAAAAAAAAIAGaIANBf0obDwsgAkGAgMD/A0YEQCADQX9KBEAgAA8LRAAAAAAAAPA/IACjDwsgA0GAgICABEYEQCAAIACiDwsgA0GAgID/A0cgBUEASHINACAAnw8LIACZIQwgBUH/////A3FBgIDA/wNHQQAgBBsgCXJFBEBEAAAAAAAA8D8gDKMgDCADQQBIGyEMIAVBf0oNASAIIARBgIDAgHxqckUEQCAMIAyhIgAgAKMPCyAMmiAMIAhBAUYbDwtEAAAAAAAA8D8hDQJAIAVBf0oNAAJAAkAgCA4CAAECCyAAIAChIgAgAKMPC0QAAAAAAADwvyENCwJ8IAJBgYCAjwRPBEAgAkGBgMCfBE8EQCAEQf//v/8DTQRARAAAAAAAAPB/RAAAAAAAAAAAIANBAEgbDwtEAAAAAAAA8H9EAAAAAAAAAAAgA0EAShsPCyAEQf7/v/8DTQRAIA1EnHUAiDzkN36iRJx1AIg85Dd+oiANRFnz+MIfbqUBokRZ8/jCH26lAaIgA0EASBsPCyAEQYGAwP8DTwRAIA1EnHUAiDzkN36iRJx1AIg85Dd+oiANRFnz+MIfbqUBokRZ8/jCH26lAaIgA0EAShsPCyAMRAAAAAAAAPC/oCIARAAAAGBHFfc/oiIMIABERN9d+AuuVD6iIAAgAKJEAAAAAAAA4D8gACAARAAAAAAAANC/okRVVVVVVVXVP6CioaJE/oIrZUcV97+ioCIPoL1CgICAgHCDvyIAIAyhDAELIAxEAAAAAAAAQEOiIgAgDCAEQYCAwABJIgIbIQwgAL1CIIinIAQgAhsiBEH//z9xIgVBgIDA/wNyIQMgBEEUdUHMd0GBeCACG2ohBEEAIQICQCAFQY+xDkkNACAFQfrsLkkEQEEBIQIMAQsgA0GAgEBqIQMgBEEBaiEECyACQQN0IgVBwJ0EaisDACIRIAy9Qv////8PgyADrUIghoS/Ig8gBUGgnQRqKwMAIg6hIhBEAAAAAAAA8D8gDiAPoKMiEqIiDL1CgICAgHCDvyIAIAAgAKIiE0QAAAAAAAAIQKAgDCAAoCASIBAgACADQQF1QYCAgIACciACQRJ0akGAgCBqrUIghr8iEKKhIAAgDyAQIA6hoaKhoiIPoiAMIAyiIgAgAKIgACAAIAAgACAARO9ORUoofso/okRl28mTSobNP6CiRAFBHalgdNE/oKJETSaPUVVV1T+gokT/q2/btm3bP6CiRAMzMzMzM+M/oKKgIg6gvUKAgICAcIO/IgCiIhAgDyAAoiAMIA4gAEQAAAAAAAAIwKAgE6GhoqAiDKC9QoCAgIBwg78iAEQAAADgCcfuP6IiDiAFQbCdBGorAwAgDCAAIBChoUT9AzrcCcfuP6IgAET1AVsU4C8+vqKgoCIPoKAgBLciDKC9QoCAgIBwg78iACAMoSARoSAOoQshDiAAIApCgICAgHCDvyIRoiIMIA8gDqEgAaIgASARoSAAoqAiAKAiAb0iCqchAgJAIApCIIinIgNBgIDAhAROBEAgA0GAgMD7e2ogAnINAyAARP6CK2VHFZc8oCABIAyhZEEBcw0BDAMLIANBgPj//wdxQYCYw4QESQ0AIANBgOi8+wNqIAJyDQMgACABIAyhZUEBcw0ADAMLQQAhAiANAnwgA0H/////B3EiBEGBgID/A08EfkEAQYCAwAAgBEEUdkGCeGp2IANqIgRB//8/cUGAgMAAckGTCCAEQRR2Qf8PcSIFa3YiAmsgAiADQQBIGyECIAAgDEGAgEAgBUGBeGp1IARxrUIghr+hIgygvQUgCgtCgICAgHCDvyIBRAAAAABDLuY/oiINIAAgASAMoaFE7zn6/kIu5j+iIAFEOWyoDGFcIL6ioCIMoCIAIAAgACAAIACiIgEgASABIAEgAUTQpL5yaTdmPqJE8WvSxUG9u76gokQs3iWvalYRP6CiRJO9vhZswWa/oKJEPlVVVVVVxT+goqEiAaIgAUQAAAAAAAAAwKCjIAwgACANoaEiASAAIAGioKGhRAAAAAAAAPA/oCIAvSIKQiCIpyACQRR0aiIDQf//P0wEQCAAIAIQyQEMAQsgCkL/////D4MgA61CIIaEvwuiIQwLIAwPCyANRJx1AIg85Dd+okScdQCIPOQ3fqIPCyANRFnz+MIfbqUBokRZ8/jCH26lAaILRQECfCAAIAIgAqIiBDkDACABIAIgAkQAAAACAACgQaIiAyACIAOhoCICoSIDIAOiIAIgAqIgBKEgAiACoCADoqCgOQMACyUAIABEi90aFWYglsCgEKMERAAAAAAAAMB/okQAAAAAAADAf6ILCQAgACABELkJCw4AIAAgABBEQQFqELsJC5oGAQV/QQEhCSACQQF0QZDdAmovAQAhAiAFRQRAIAAgAjYCAEEBDwsgAkGA6AJqIQZBEiEHAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBUF/ag4iAAAAAAAAAAEBAgICAgIEAwMDAwMDBQUFBQUFBQUGBwgJCQsLIAYgASADayAFbEEBdGohAUEAIQIDQCACIAVGBEAgBQ8LIAAgAkECdGogASACQQF0ai8AACIDNgIAIAJBAWohAiADDQALDAsLIAVBeWoiCCABIANrbCECIAQgCGxBAXQhAUEAIQcDQCAHIAhGDQogBiACQQJ2IAFqai0AACACQQF0IgNBBnF2QRB0QYCADHEgAyAGai8AAHIiA0UNCyAAIAdBAnRqIAM2AgAgB0EBaiEHIAJBAWohAgwACwALIAYgBUF3aiIIIAEgA2tsaiEBQQAhAgNAIAIgCEYNCSAAIAJBAnRqIAEgAmotAAAQqQMiAzYCACACQQFqIQIgAw0ACwwJCyAFQXBqIgJBAXEgAkEBdiICQQBHaiEKIAJBAmohCQsgASADayEBQQAhAgNAIAIgCUYEQCAJDwUgACACQQJ0aiAGIAJBAXRqLwAAIAFBACACIApGG2o2AgAgAkEBaiECDAELAAsACyAFQWtqIQcLIAcgASADa2wgBmpBAmohAUEAIQIgBi8AACEDA0AgAiAHRgRAIAcPBSAAIAJBAnRqQSAgASACai0AACIEIANqIARB/wFGGzYCACACQQFqIQIMAQsACwALIAAgBiABIANrQQNsaiIBLwAAIgI2AgAgAkUNAyAAIAEtAAIQqQM2AgQMAgsgACAGLwAANgIAIAAgBi8AAjYCCCAAIAEgA2tBAXQgBmovAAQ2AgRBAw8LIAEgA2shAiAAAn8gBUEhRgRAIAYgAkF+cWoiAUEBaiEHIAEtAAAQqQMMAQsgBiACQQF2QQNsaiIBQQJqIQcgAS8AAAsiAUEgQSBBASABQfB3akEgSRsgAUGAAkkbaiABIAJBAXEbNgIAIAAgBy0AABCpAzYCBAtBAiEICyAIDwtBAAuRAgEGfyABQQJ0QeDkA2ooAgAiAiABQQF0QbDmA2ovAQBqIQdBACEBAkADQCACIAdPDQEgAkEBaiEFAkACQCACLQAAIgNBP00EQCAEIANBA3ZqQQFqIQIgAQRAIAAgBCACEIIBDQMLIAFBAXMhASADQQdxIAJqQQFqIQMMAQsCfyADIARqQYF/aiADQRh0QRh1QX9MDQAaIANB3wBNBEAgAkECaiEFIAItAAEgA0EIdHIgBGpBgYB/agwBCyACQQNqIQUgAi0AAiADQRB0IAItAAFBCHRyciAEakGBgIB9agshAyAEIQILIAEEQCAAIAIgAxCCAQ0BCyABQQFzIQEgBSECIAMhBAwBCwtBfyEGCyAGC6UCAQh/IAFBBnEhBiABQQJ2QQFxIQhBkMYDIQMCQANAIANB3uMDTw0BIAIhBCADLQAAIgJBH3EhBQJ/IANBAWogAkEFdiICQQdHDQAaIAMsAAEiCUH/AXEhAiAJQQBOBEAgAkEHaiECIANBAmoMAQsgAkG/AU0EQCADLQACIAJBCHRyQYeBfmohAiADQQNqDAELIAMtAAMgAkEQdCADLQACQQh0cnJBh4GBemohAiADQQRqCyEDIAIgBGpBAWohAgJAAkAgBUEfRgRAIAZFDQMgBkEGRg0BIAQgCGohBANAIAQgAk8NBCAAIAQgBEEBahCCASEFIARBAmohBCAFRQ0ACwwCCyABIAV2QQFxRQ0CCyAAIAQgAhCCAUUNAQsLQX8hBwsgBws4AEHguQIgARClBCIBQQBIBEBBfg8LIAAgAUEdTAR/QgEgAa2GpwUgAUECdEGIvgJqKAIACxDwBQu9AQEFfyMAQdAAayIGJAAgAkEAIAJBAEobIQcDQCAEIAdGRQRAAkAgASAEQQJ0aigCACICQYCofWoiBUGj1wBNBEAgACAFQf//A3EiAkHMBG4iCEGAInIQHSAAIAUgCEHMBGxrQf//A3FBHG5B4SJqEB0gAkEccCICRQ0BIAAgAkGnI2oQHQwBCyAGIAIgAxC/CSIFBEAgACAGIAUgAxDyBQwBCyAAIAIQHQsgBEEBaiEEDAELCyAGQdAAaiQAC58BAQJ+AkAgAykDACIEQoCAgIBwWgRAIAMpAwgiBUL/////b1YNAQsgABApQoCAgIDgAA8LIABCgICAgCBBKRBRIgEQDEUEQCAAQRgQLiICRQRAIAAgARALQoCAgIDgAA8LIAIgBBAOIgQ3AwAgAiAFEA43AwggACAEEDshACACQQA6ABEgAiAAOgAQIAEgAhCIASABIAQQsgEQqAMLIAELEQAgAEHA/gFB4IYCQSEQrQMLtQEBB38gACgCACEFIAAoAgghAgNAIAFBAWoiAyAFTkUEQAJAIAIgAUECdGooAgAiByACIANBAnRqKAIARgRAIAEhAwwBCwNAAkAgASIDQQFqIQYgAUEDaiAFTg0AIAIgBkECdGooAgAgAiADQQJqIgFBAnRqKAIARg0BCwsgAiAEQQJ0aiIBIAc2AgAgASACIAZBAnRqKAIANgIEIARBAmohBAsgA0ECaiEBDAELCyAAIAQ2AgALEQAgAEGw+AFB8P0BQRYQrQMLpQEBA38gAhCqA0H///8AcSABSwRAIABBADYCAEEADwtBfyEEIAIgA0F/aiIFQQNsahCqAyABSwR/QQAhAwNAIAUgA2tBAkhFBEAgAyAFakECbSIEIAUgAiAEQQNsahCqA0H///8AcSABSyIGGyEFIAMgBCAGGyEDDAELCyAAIAIgA0EDbGoQqgMiAEH///8AcTYCACADQQV0IABBFXZqQSBqBUF/CwtuAQV/QegCIQEDQCACIAFMBEAgASACakEBdiIDQQJ0QcDnAWooAgAiBEEPdiIFIABLBEAgA0F/aiEBDAILIARBCHZB/wBxIAVqIABLBEBBAQ8FIANBAWohAgwCCwALCyAAQeD2AUGQ+AFBBhCtAwtJAQF/An8gACgCACICIAAoAgROBEBBfyAAIAJBAWoQrAMNARogACgCACECCyAAIAJBAWo2AgAgACgCCCACQQJ0aiABNgIAQQALCzUBAX8jAEEQayIDJAAgAyABNgIIIAMgAkEBajYCDCAAIANBCGpBAhCmBCEAIANBEGokACAACyMBAX8gACgCQCABSwR/IAAoAkQgAUEYbGooAgBBAEcFQQALC5MCAQN/IAEoAgAiAkH+/wdPBEAgAEHM5QFBABA/QX8PCwJAIAJBAXYiA0UEQCAAQQJBfxDLARoMAQsgASgCCCACQQJ0aiIEQXxqKAIAIgJBf0YEfyAEQXhqKAIABSACC0H//wNNBEAgAEEVIAMQqARBACECA0AgAiABKAIATg0CIAAgAkECdCIDIAEoAghqLwEAEDEgAEF/IAEoAgggA0EEcmooAgBBf2oiAyADQX5GG0H//wNxEDEgAkECaiECDAALAAsgAEEWIAMQqARBACECA0AgAiABKAIATg0BIAAgAkECdCIDIAEoAghqKAIAEB0gACABKAIIIANBBHJqKAIAQX9qEB0gAkECaiECDAALAAtBAAsmAQF/IAAoAjgiAUF/TARAIAAgACAAQTxqQQAQ/gUiATYCOAsgAQvgAgEFfyMAQZABayIEJAAgAUEANgIAIAAoAiAhA0EBIQYDQCAEIAM2AowBAkACQAJAIAMgACgCHCIHTwRAIAYhBQwBCwJAAkACQAJAIAMtAAAiBUGlf2oOAgECAAsgBUEoRw0FIAMtAAFBP0cNAiADLQACQTxHDQUgAy0AAyIFQSFGIAVBPUZyDQUgAUEBNgIAAkAgAkUNACAEIANBA2o2AowBIAQgBEGMAWogACgCKBCrBA0AIAQgAhCkBEUNBQsgBkEBaiEFIAZB/QFKDQMgBCgCjAEhAyAFIQYMBQsDQCAEIAMiBUEBaiIDNgKMASADIAdPDQUCQCADLQAAQaR/ag4CAAYBCyAEIAVBAmoiAzYCjAEMAAsACyAEIANBAWoiAzYCjAEMAwsgBkH9AUohByAGQQFqIgUhBiAHRQ0CC0F/IAUgAhshBgsgBEGQAWokACAGDwsgA0EBaiEDDAALAAtdAQR/IAEQRCEDIAAoAkQiAiAAKAJIaiEEQQEhAANAAkAgAiAETwRAQX8hAAwBCyADIAIQRCIFRgRAIAEgAiADEHRFDQELIABBAWohACACIAVqQQFqIQIMAQsLIAAL4RoBCH8gACgCBCEOIAAoAgghDANAAkAgBSEHIARBAWohCAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQCAELQAAIglBf2oOHAIBCQoHCAYEBAALCwwPDQ4SEhMTGhkFBRARGBcWC0EBIQkgBkUNHyAHIQkMIAtBBSEKIAgoAAAMAQtBAyEKIAgvAAALIQggByAOTw0bAkAgDEUEQCAHQQFqIQUgBy0AACEJDAELIAxBAkcgB0ECaiIFIA5PciAHLwEAIglBgPgDcUGAsANHcg0AIAUvAQAiC0GA+ANxQYC4A0cNACAJQQp0QYD4P3EgC0H/B3FyQYCABGohCSAHQQRqIQULIAQgCmohBCAAKAIYBH8gCSAAKAIcEOYBBSAJCyAIRg0eDBsLIARBBWoiCiAKIAgoAABqIgggCUEJRiIJGyEEIAAgASACIAMgCCAKIAkbIAdBAEEAEK0EQQBODR0MGQsgACABIAIgAyAEQQVqIgQgCCgAAGogByAJQWpqQQAQrQRBAE4NHAwYCyAIIAgoAABqQQRqIQQMFgsgCCEEIAUgACgCACIIRg0aIAAoAhRFDRcCQCAMRQRAIAVBf2otAAAhCgwBCyAMQQJHIAVBfGoiByAISXIgBUF+ai8BACIKQYD4A3FBgLgDR3INACAHLwEAIghBgPgDcUGAsANHDQAgCkH/B3EgCEH/B3FBCnRyQYCABGohCgsgChCsBA0aDBcLIAghBCAHIA4iBUYNGSAAKAIURQ0WAkAgDEUEQCAHLQAAIQkMAQsgDEECRyAHQQJqIA5PciAHLwEAIglBgPgDcUGAsANHcg0AIAcvAQIiBUGA+ANxQYC4A0cNACAJQQp0QYD4P3EgBUH/B3FyQYCABGohCQsgByEFIAkQrAQNGQwWCyAHIA5GDRUCQCAMRQRAIAdBAWohBSAHLQAAIQkMAQsgDEECRyAHQQJqIgUgDk9yIAcvAQAiCUGA+ANxQYCwA0dyDQAgBS8BACIEQYD4A3FBgLgDRw0AIAlBCnRBgPg/cSAEQf8HcXJBgIAEaiEJIAdBBGohBQsgCCEEIAkQrARFDRgMFQsgByAORg0UIAxFBEAgB0EBaiEFIAghBAwYCyAIIQQgDEECRyAHQQJqIgUgDk9yDRcgBy8BAEGAeHFBgLADRw0XIAdBBGogBSAHLwECQYD4A3FBgLgDRhshBQwXCyAAKAIMIAgtAAAiBU0NCSAJIAVBAXRqQQJ0IAFqQVRqIAc2AgAgBEECaiEEDBELIAAoAgwgBC0AAiIJTQ0HIARBA2ohBCAILQAAIQUDQCAFIAlLDREgASAFQQN0IghqQQA2AgAgASAIQQRyakEANgIAIAVBAWohBQwACwALIAIgA0ECdGogCCgAADYCACADQQFqIQMgBEEFaiEEDA8LIANBf2ohAwwNCyAIKAAAIQUgA0ECdCACakF8aiIIIAgoAgBBf2oiCDYCACAFIARBBWoiBGogBCAIGyEEDA0LIAIgA0ECdGogBzYCACADQQFqIQMMCwsgBEEFaiIEIAQgCCgAAGogAiADQX9qIgNBAnRqKAIAIAdGGyEEDAsLQQAhDUEAIQogACgCACIEIAdHBEACQCAMRQRAIAdBf2otAAAhBQwBCyAMQQJHIAdBfGoiCiAESXIgB0F+ai8BACIFQYD4A3FBgLgDR3INACAKLwEAIgRBgPgDcUGAsANHDQAgBUH/B3EgBEH/B3FBCnRyQYCABGohBQsgBRCvAyEKCyAHIA5JBEACQCAMRQRAIActAAAhBQwBCyAMQQJHIAdBAmogDk9yIAcvAQAiBUGA+ANxQYCwA0dyDQAgBy8BAiIEQYD4A3FBgLgDRw0AIAVBCnRBgPg/cSAEQf8HcXJBgIAEaiEFCyAFEK8DIQ0LIAchBSAIIQRBEiAJayAKIA1zRg0PDAwLIAAoAgwgBC0AASIITQ0LIARBAmohBCABIAhBA3QiCGooAgAiC0UNDiABIAhBBHJqKAIAIgpFDQ4gCUETRg0HA0AgCiALTQ0PIAUgACgCACIHRg0MAkACQAJAIAwEQCAKQX5qIggvAQAhCSAMQQJHIAggC01yIAlBgPgDcUGAuANHcg0BIApBfGoiCi8BACINQYD4A3FBgLADRw0BIAlB/wdxIA1B/wdxQQp0ckGAgARqIQkMAgsgBUF/aiIFLQAAIQ0gCkF/aiIKLQAAIQkMAgsgCCEKCyAFQX5qIggvAQAhDQJAIAxBAkcgCCAHTXIgDUGA+ANxQYC4A0dyDQAgBUF8aiIFLwEAIgdBgPgDcUGAsANHDQAgDUH/B3EgB0H/B3FBCnRyQYCABGohDQwBCyAIIQULIAAoAhgEfyAJIAAoAhwQ5gEhCSANIAAoAhwQ5gEFIA0LIAlGDQALDAsLQZ7nAUGf5gFB3RFBi+cBEAAAC0H05gFBn+YBQdQRQYvnARAAAAsQAQALIARBEWoiDSAIKAAAaiEHQQAhCiAEKAAFIQsgBCgACSEEA0ACQAJAIAAgASACIAMgDSAFQQEQgAYiCUEBag4CDAEACyAJIQUgBEH/////B0YgCkEBaiIKIARJcg0BCwsgCiALSQ0HIAchBCAKIAtNDQogACABIAIgAyAIIAVBAyAKIAtrEK0EQQBODQoMBgsgByAAKAIAIglGDQYgDEUEQCAHQX9qIQUgCCEEDAoLIAghBCAMQQJHIAdBfmoiBSAJTXINCSAFLwEAQYB4cUGAuANHDQkgB0F8aiIIIAUgCC8BAEGA+ANxQYCwA0YbIQUMCQsgCC8AACEIIAcgDk8NBQJAIAxFBEAgB0EBaiEFIActAAAhCwwBCyAMQQJHIAdBAmoiBSAOT3IgBy8BACILQYD4A3FBgLADR3INACAFLwEAIglBgPgDcUGAuANHDQAgC0EKdEGA+D9xIAlB/wdxckGAgARqIQsgB0EEaiEFCyAAKAIYBEAgCyAAKAIcEOYBIQsLIAsgBEEDaiIHKAAASQ0FQQAhDSALIAQgCEF/aiIJQQN0aigAB0sNBQNAIA0gCUsNBiALIAcgCSANakEBdiIEQQN0aiIKKAAASQRAIARBf2ohCQwBCyALIAooAARLBEAgBEEBaiENDAELCyAHIAhBA3RqIQQMCAsgCC8AACEIIAcgDk8NBAJAIAxFBEAgB0EBaiEFIActAAAhCwwBCyAMQQJHIAdBAmoiBSAOT3IgBy8BACILQYD4A3FBgLADR3INACAFLwEAIglBgPgDcUGAuANHDQAgC0EKdEGA+D9xIAlB/wdxckGAgARqIQsgB0EEaiEFCyAAKAIYBEAgCyAAKAIcEOYBIQsLIAsgBEEDaiIHLwAASQ0EAkAgC0H//wNPQQAgBCAIQX9qIglBAnRqLwAFIgpB//8DRhsNAEEAIQQgCyAKSw0FA0AgBCAJSw0GIAsgByAEIAlqQQF2IgpBAnRqIg0vAABJBEAgCkF/aiEJDAELIAsgDS8AAk0NASAKQQFqIQQMAAsACyAHIAhBAnRqIQQMBwsDQCALIApPDQcgBSAOTw0EAn8CfwJAIAwEQCAMQQJHIAtBAmoiCCAKT3IgCy8BACIJQYD4A3FBgLADR3INASAILwEAIgdBgPgDcUGAuANHDQEgCUEKdEGA+D9xIAdB/wdxckGAgARqIQkgC0EEagwCCyAFLQAAIQ0gCy0AACEJIAtBAWohCyAFQQFqDAILIAgLIQsCQCAMQQJHIAVBAmoiCCAOT3IgBS8BACINQYD4A3FBgLADR3INACAILwEAIgdBgPgDcUGAuANHDQAgDUEKdEGA+D9xIAdB/wdxckGAgARqIQ0gBUEEagwBCyAICyEFIAAoAhgEfyAJIAAoAhwQ5gEhCSANIAAoAhwQ5gEFIA0LIAlGDQALDAMLIAghBAwFCyAHIQUMBAtBfw8LQQAhCSAGDQELIAAoAjAhBQJAA0AgCSEDIAVFBEAgAw8LAkACQAJAAkACQCAAKAIoIAVBf2oiBSAAKAIkbGoiCC0AACIEDgQAAgIBAgsgAw0CDAMLIAMNASABIAhBEGoiAyAAKAIMQQN0ECQaIAIgAyAAKAIMQQN0aiAILQABIgNBAnQQJBogCCgCCCEFQQAhBCAIKAIMIgkoAAwhCgNAAn8CQCAEIApHBEAgBUF/aiAMRQ0CGiAFQX5qIQcgDEECRw0BIAcvAQBBgPgDcUGAuANHDQEgByAAKAIATQ0BIAVBfGoiBSAHIAUvAQBBgPgDcUGAsANGGwwCCyAJKAAAIQQgCCAFNgIIIAggCCgCBEF/aiIINgIEIAQgCWpBEGohBCAIDQkgACAAKAIwQX9qNgIwDAkLIAcLIQUgBEEBaiEEDAALAAsgA0EAIARBAUYbDQNBACEJIARBAkcNACADRQ0BCyAAIAU2AjAMAQsLIAEgCEEQaiAAKAIMQQN0ECQaCyAIKAIIIQUgCCgCDCEEIAIgCCAAKAIMQQN0akEQaiAILQABIgNBAnQQJBogACAAKAIwQX9qNgIwDAELCyAJC50CAQR/IwBBQGoiByQAIAcgAS0AACIIQQF2QQFxNgIgIAcgCEECdkEBcTYCHCAHIAhBBHZBAXEiCDYCJCAHIAEtAAEiCjYCFCABLQACIQkgB0EANgI4IAcgBjYCKCAHIAVBAiAFIAgbIAVBAUcbNgIQIAcgAiAEIAV0ajYCDCAHIAI2AgggByAJNgIYIAdCADcDMCAHIApBA3QgCUECdGpBEGo2AiwgCkEBdCEEQQAhBgNAIAQgBkZFBEAgACAGQQJ0akEANgIAIAZBAWohBgwBCwsgByAJQQJ0QQ9qQfAPcWsiBCQAIAdBCGogACAEQQAgAUEHaiACIAMgBXRqQQAQgAYhACAHKAIoIAcoAjBBABD3AxogB0FAayQAIAALnQEBBH8gACgCBCEEA0BBACEDAkACQCAAKAIYIgIgACgCHE8NACACLQAAIgJBKUYgAkH8AEZyDQAgACgCBCECIAAgARDMCSIDDQAgAUUNAiAAIAAoAgQiAyACayICIANqEOcBRQ0BQX8hAwsgAw8LIAAoAgAgBGoiBSACaiAFIAMgBGsQ4wEgACgCACIFIARqIAMgBWogAhAkGgwACwALCQAgASACENcFC5UBAQN+IAG9IgJC////////////AIMhAyAAvSIEQv///////////wCDQoGAgICAgID4/wBaBEAgA0KBgICAgICA+P8AVA8LAn9BfyADQoCAgICAgID4/wBWIAAgAWNyDQAaQQEgACABZA0AGkEAIABEAAAAAAAAAABiDQAaIARCf1cEQCACQj+Hp0F/cw8LIAJCP4inCwtKAgF/AX5CgICAgOAAIQQgACABIAIQmQEiAwR+IAMQmAEEQCACRQRAQgAPCyAAEHFCgICAgOAADwsgAygCIDUCEAVCgICAgOAACwsqACAAIAEgAhCZASIARQRAQoCAgIDgAA8LIAAoAiA1AgxCgICAgHCEEA4LowEBAX4CQAJAIAJFBEAgAEEvEDIhBCABEBEhAgwBCyADKQMAIQQCfgJAIAEQESICRQ0AIAQQ5wNFDQAgAEGOuAEgACAAKAIQIASnEM4CEDJBlrgBEL0BDAELIAAgBBAsCyIEEAwNAQsgAg0AIAAgAUEFEG0iARAMRQRAIAAgASAEEOkBIAAgAUEwIASnKQIEQv////8Hg0EAEBoaCyABIQQLIAQLRgEBfwJAIAAoAgggAmoiAyAAKAIMSgRAIAAgAyABEM0CDQELA0AgAkEBSARAQQAPCyACQX9qIQIgACABEJIBRQ0ACwtBfwt4AQV/IAEoAgRB/////wdxIgNFBEAgAg8LIAAoAgRB/////wdxIQUgA0F/aiEGIAFBABAwIQcCQANAIAIgA2ogBUoNASAAIAcgAhDVASIEQQBIIAMgBGogBUpyDQEgACABIARBAWoiAkEBIAYQsgQNAAsgBA8LQX8LjAEBAn8CQAJAIAAgARD1AyIDQQBIDQAgA0UNASAAIAFB7QAgAUEAEBMiARAMDQACQCABEBFFBEAgARAnRQ0BCyAAQZPOAEEAEBUMAQtBfyECIAAgARA+IgEQDA0BQQAhAiABp0HnAEEAENUBIQMgACABEAsgA0F/Sg0BIABBhsIBQQAQFQtBfyECCyACC10BAX8CQAJAAkACQCABQiCIp0EBag4DAQIAAgsgARAODwsgAaciAi8BBkEGRw0AIAIpAyAiAUKAgICAcINCgICAgBBRDQELIABBgLgBQQAQFUKAgICA4AAhAQsgAQsDAAELigECAX8BfiMAQRBrIgIkAAJ+IAAgARCmAiIGEAwEQCAGDAELQQohBQJAAkAgBA0AIAMpAwAiARARDQAgACABEMgKIgVBAEgNAQtCgICAgOAAIAAgAkEIaiAGEFoNARogACACKwMIIAVBAEEAEMQCDAELIAAgBhALQoCAgIDgAAshASACQRBqJAAgAQvDAQIBfgF8IwBBEGsiAiQAAkAgACABEKYCIgQQDARAIAQhAQwBC0KAgICA4AAhASAAIAIgBBBaDQACQAJAIAMpAwAiBBARBEAgAisDACEFDAELIAAgAkEMaiAEEMMBDQIgAisDACIFvUKAgICAgICA+P8Ag0KAgICAgICA+P8AUg0BCyAAIAUQFhA+IQEMAQsgAigCDCIDQX9qQeQATwRAIABBwLQBEGoMAQsgACAFQQogA0EBEMQCIQELIAJBEGokACABC58BAgF+AXwjAEEQayICJAACQCAAIAEQpgIiBBAMBEAgBCEBDAELQoCAgIDgACEBIAAgAiAEEFoNACAAIAJBDGogAykDABDDAQ0AIAIoAgwiA0HlAE8EQCAAQcC0ARBqDAELIAIrAwAiBZlEUO/i1uQaS0RmQQFzRQRAIAAgBRAWED4hAQwBCyAAIAVBCiADQQIQxAIhAQsgAkEQaiQAIAELxQEDAX8BfgF8IwBBEGsiAiQAAkAgACABEKYCIgUQDARAIAUhAQwBC0KAgICA4AAhASAAIAIgBRBaDQAgACACQQxqIAMpAwAQwwENACACKwMAIga9QoCAgICAgID4/wCDQoCAgICAgID4/wBRBEAgACAGEBYQPiEBDAELAn9BBCADKQMAEBENABogAigCDCIDQeUATwRAIABBwLQBEGoMAgsgA0EBaiEEQQULIQMgACAGQQogBCADEMQCIQELIAJBEGokACABC3sBAn9CgICAgDAhAQJAIAJBf2pBAUsNACAAIAMpAwBCgICAgDBCgICAgDAQ8AMiARAMDQAgACABELgBIQQgACABEAsgBEUEQEKAgICA4AAPCyAEIAJBAkYEfyAAIAMpAwgQ9gEFQQALEAYgACAEEDdCgICAgDAhAQsgAQubAgIDfwF+IwBBEGsiBCQAIARBADoAD0KAgICAMCEBAkAgAkF/akEBSw0AAkAgACADKQMAELgBIgVFDQACQCACQQJHDQAgACADKQMIQoCAgIAwQoCAgIAwEPADIgcQDARAIAAgBRA3IAchAQwDCyAAIAcQuAEhBiAAIAcQCyAGDQAgACAFEDcMAQsgBSAGIARBD2oQByECIAAgBRA3IAAgBhA3IAJFDQECfiAELQAPRQRAIAAgAiACEERBhrMBEPEDDAELAkAgAEEDEKEBIgEQDARAQoCAgIAgIQEMAQsgACABQTMgACACEHJBAxAaGgsgACABEJABQoCAgIDgAAshASACEP4BDAELQoCAgIDgACEBCyAEQRBqJAAgAQtWACMAQRBrIgAkACAAQQhqQQAQAhoCfiAANAIMIAA0AghCwIQ9fnwiAUKAgICACHxC/////w9YBEAgAUL/////D4MMAQsgAbkQFgshASAAQRBqJAAgAQvzAQEEfyMAQSBrIgIkACAAIAMpAwAQLCIBEAxFBEAgACACQQhqQQAQQxogAaciBSgCBEH/////B3EhBkEAIQMDQCADIAZORQRAAkAgBSADEDAiBEElRw0AAkAgA0EGaiAGSg0AIAUgA0EBahAwQfUARw0AIAUgA0ECakEEELYDIgRBAEgNACADQQVqIQMMAQtBJSEEIANBA2ogBkoNACAFIANBAWpBAhC2AyIEQSUgBEF/SiIHGyEEIANBAmogAyAHGyEDCyACQQhqIAQQkgEaIANBAWohAwwBCwsgACABEAsgAkEIahA4IQELIAJBIGokACABC7IBAQR/IwBBIGsiAiQAIAAgAykDABAsIgEQDEUEQCAAIAJBCGogAaciBCgCBEH/////B3EQQxogBCgCBEH/////B3EhBkEAIQMDQCADIAZHBEACQCAEIAMQMCIFIgdB/wFMBH9BwLIBIAdBxQAQgAIFQQALBEAgAkEIaiAFEJIBGgwBCyACQQhqIAUQgwILIANBAWohAwwBCwsgACABEAsgAkEIahA4IQELIAJBIGokACABC0sBAX8CQCAAQf8BSg0AQQEhAiAAQVBqQQpJIABBX3FBv39qQRpJcg0AQZiyASAAQQkQgAINAEEAIQIgAQ0AIAAQswRBAEchAgsgAguqAwEFfyMAQSBrIgYkAAJAIAAgAykDABAsIgEQDA0AIAAgBkEIaiABpyIIKAIEQf////8HcRBDGkEAIQMCQANAIAMgCCgCBEH/////B3EiCUgEQCADQQFqIQIgCCADEDAiBSAEEJYGBEAgBkEIaiAFEJIBGiACIQMMAgsCQCAFQYB4cSIHQYCwA0cEQCAHQYC4A0cNAUHtsQEhBwwEC0H/sQEhByACIAlODQMgCCACEDAiAkGAeHFBgLgDRw0DIAJB/wdxIAVBCnRBgPg/cXJBgIAEaiEFIANBAmohAgsgBUH/AEwEQCAGQQhqIAUQgwIgAiEDDAIFIAZBCGogBUH/D0wEfyAFQQZ2QcABcgUgBkEIaiAFQf//A0wEfyAFQQx2QeABcgUgBkEIaiAFQRJ2QfABchCDAiAFQQx2QT9xQYABcgsQgwIgBUEGdkE/cUGAAXILEIMCIAZBCGogBUE/cUGAAXIQgwIgAiEDDAILAAsLIAAgARALIAZBCGoQOCEBDAELIAAgBxC3AyAAIAEQCyAGQQhqEEVCgICAgOAAIQELIAZBIGokACABC80DAQV/IwBBIGsiByQAAkAgACADKQMAECwiARAMDQAgACAHQQhqQQAQQxogAachCEEAIQIDQAJAAkACQCACIAgoAgRB/////wdxSARAIAggAhAwIgNBJUYEQCAAIAggAhC0BCIDQQBIDQMgAkEDaiEFIANB/wBMBEAgBARAIAUhAgwGC0ElIAMgAxCzBCIGGyEDIAJBAWogBSAGGyECDAULAn8gA0FgcUHAAUYEQCADQR9xIQNBgAEhBkEBDAELIANBcHFB4AFGBEAgA0EPcSEDQYAQIQZBAgwBCyADQXhxQfABRwRAQQEhBkEAIQNBAAwBCyADQQdxIQNBgIAEIQZBAwshAgNAIAJBAUgNAyAAIAggBRC0BCIJQQBIDQQgBUEDaiEFIAlBwAFxQYABRwRAQQAhAwwEBSACQX9qIQIgCUE/cSADQQZ0ciEDDAELAAsACyACQQFqIQIMAwsgACABEAsgB0EIahA4IQEMBAsgBSECIAMgBkggA0H//8MASnJFQQAgA0GAcHFBgLADRxsNASAAQbCxARC3AwsgACABEAsgB0EIahBFQoCAgIDgACEBDAILIAdBCGogAxC+ARoMAAsACyAHQSBqJAAgAQs3ACAAIAMpAwAQuAEiAkUEQEKAgICA4AAPCyAAIAIQ/AIgAmpBAEEKQQAQvAIhASAAIAIQNyABC4sBAQF/IwBBEGsiAiQAAkAgACADKQMAELgBIgRFBEBCgICAgOAAIQEMAQsCfkKAgICA4AAgACACQQxqIAMpAwgQkQINABogAigCDCIDBEBCgICAgMB+IANBfmpBIksNARoLIAAgBBD8AiAEakEAIAIoAgxBgQgQvAILIQEgACAEEDcLIAJBEGokACABC80BAgN/A34jAEEQayIEJABCgICAgOAAIQgCQAJ+IAEQsgEEQCAEIAKtNwMIIAAgAUEBIARBCGoQrwEMAQsgABBPCyIHEAwNACACQQAgAkEAShutIQlCACEBAkADQCABIAlSBEAgACAHIAEgAyAFQQN0aikDABAOQYCAARCrASEGIAFCAXwhASAFQQFqIQUgBkEATg0BDAILCyAAIAdBMCACQQBOBH4gAq0FIAK4EBYLEElBf0wNACAHIQgMAQsgACAHEAsLIARBEGokACAIC78GAgJ/CH4jAEEwayIEJAAgAykDACEGQoCAgIAwIQogBEKAgICAMDcDGEEBIQUCQAJAAkACQAJ+IAJBAkgEQEKAgICAMCEMQoCAgIAwDAELAkAgAykDCCIMEBENACAAIAwQaA0CQQAhBSACQQNIDQAgAykDEAwBC0KAgICAMAshDSAAIAZBwwEgBkEAEBMiBxAMDQACQAJAAkACQCAHEBFFBEAgACAHEAsCfiABELIBBEAgACABQQBBABCvAQwBCyAAEE8LIggQDARAQoCAgIAwIQEMBwsgBCAGEA43AxAgACAEQRBqQQhyQQAQjgMhAiAEKQMYIQogBCkDECEBIAINBgNAIAAgASAKIARBCGoQrAEiBhAMDQIgBCgCCARAQoCAgIAwIQsMBgsCQCAFBEAgBiEHDAELIAQgBjcDICAEIAlC/////w+DNwMoIAAgDCANQQIgBEEgahAjIQcgACAGEAsgBxAMDQMLIAAgCCAJIAcQbkEASA0CIAlCAXwhCQwACwALIAAgBhAqIgsQDA0CIAAgBEEIaiALEEBBAEgNAiAEAn4gBCkDCCIGQoCAgIAIfEL/////D1gEQCAGQv////8PgwwBCyAGuRAWCyIJNwMgAn4gARCyAQRAIAAgAUEBIARBIGoQrwEMAQsgAEKAgICAMEEBIARBIGoQtQMLIQggACAJEAsgCBAMDQFCACEBIAZCACAGQgBVGyEJA0AgASAJUQRAQoCAgIAwIQEMBQsgACALIAEQYCIGEAwNAgJAIAUEQCAGIQcMAQsgBCAGNwMgIAQgAUL/////D4M3AyggACAMIA1BAiAEQSBqECMhByAAIAYQCyAHEAwNAwsgACAIIAEgBxBuIQIgAUIBfCEBIAJBAE4NAAsMAQsgARARDQQgACABQQEQsAEaDAQLQoCAgIAwIQEMBAtCgICAgDAhAUKAgICAMCEIDAMLIAAgCEEwAn4gCUL/////D4MgCaciAkEATg0AGiACuBAWCxBJQQBIDQIMAwtCgICAgDAhAUKAgICAMCEIC0KAgICAMCELCyAAIAgQC0KAgICA4AAhCAsgACALEAsgACABEAsgACAKEAsgBEEwaiQAIAgLJgBCgICAgOAAIAAgAykDABDAASIAQQBHrUKAgICAEIQgAEEASBsLggICAX8EfiMAQRBrIgUkAEKAgICAMCEGAkACQCAAIAVBCGogACABECoiCBBADQAgBUEBNgIEAkAgBARAIAMpAwAhCUKAgICAMCEHIAJBAk4EQCADKQMIIQcLIAAgCRBoRQ0BDAILQoCAgIAwIQkgAkEBSARAQoCAgIAwIQcMAQtCgICAgDAhByADKQMAIgEQEQ0AIAAgBUEEaiABEMMBQQBIDQELIAAgCEIAEKcCIgEQDARAIAEhBgwBCyABIQYgACABIAggBSkDCEIAIAUoAgQgCSAHELcEQn9XDQAgCCEGDAELIAAgCBALQoCAgIDgACEBCyAAIAYQCyAFQRBqJAAgAQvtAQIBfwR+IwBBIGsiBCQAAkACQCAAIARBGGogACABECoiARBADQAgACAEQQhqIAMpAwBCACAEKQMYIgUgBRB9DQAgACAEQRBqIAMpAwhCACAFIAUQfQ0AIAQgBTcDAAJ+IAUgAkEDSA0AGiAFIAMpAxAiBhARDQAaIAAgBCAGQgAgBSAFEH0NASAEKQMACyEHIAAgASAEKQMIIgYgBCkDECIIIAcgCH0iByAFIAZ9IgUgByAFUxsiBUF/QQEgBiAFIAh8UxtBASAIIAZTGxD3AkUNAQsgACABEAtCgICAgOAAIQELIARBIGokACABC8MDAgV/An4jAEEgayIFJAAgACAFQQhqQQAQQxogBUEIakEoEDwaIARBfnFBAkYEQCAFQQhqQbPmABCJARoLIAVBCGpBuuYAEIkBGiAEQX1xQQFGBEAgBUEIakEqEDwaCyAFQQhqQcPmABCJARogAkF/aiIHQQAgB0EAShshCAJAAkACQANAIAYgCEcEQCAGBEAgBUEIakEsEDwaCyAGQQN0IQkgBkEBaiEGIAVBCGogAyAJaikDABCKAUUNAQwCCwsgBUEIakHP5gAQiQEaIAJBAU4EQCAFQQhqIAMgB0EDdGopAwAQigENAQsgBUEIakHV5gAQiQEaQoCAgIAwIQsgBUEIahA4IgoQDA0BIAAgACkDwAEgCkEDQX8QkAMhCyAAIAoQCyALEAwNASABEBENAiAAIAFBOyABQQAQEyIKEAwNASAAIAsCfiAKECFFBEAgACAKEAsgACABEIUDIgJFDQMgAigCKCAEQQF0QZDHAGovAQBBA3RqKQMAEA4hCgsgCgtBARCYAiECIAAgChALIAJBAE4NAgwBCyAFQQhqEEVCgICAgDAhCwsgACALEAtCgICAgOAAIQsLIAVBIGokACALCzIBAX8Cf0EAIABCgICAgHBUDQAaIACnIgEvAQZBAkYEQEEBIAEtAAVBCHENARoLQQALC8YGAgJ/CH4jAEEwayIFJABCgICAgDAhBwJAAkAgACAFQSBqIAAgARAqIgwQQA0AIAAgBUEYaiADKQMAQgAgBSkDICIIIAgQfQ0AAkAgCAJ/AkAgBARAAkACQAJAIAIOAgABAgsMAwsgCCAFKQMYfSEKDAILIAAgBUEIaiADKQMIQgAgCCAFKQMYfUIAEH0NBCAFKQMIIQogAkF+agwCCyAFIAg3AxAgCCEBIAMpAwgiDRARRQRAIAAgBUEQaiANQgAgCCAIEH0NBCAFKQMQIQELQQAhAiABIAUpAxh9ELgEIQoMAgsgBSAKNwMIQQALIgKtfCAKfUKAgICAgICAEFMNACAAQZXXAEEAEBUMAQsgACAMIApCgICAgAh8Qv////8PWAR+IApC/////w+DBSAKuRAWCyIHEKcCIQEgACAHEAsCQCABEAwNACAFIAUpAxgiDSAKfCILNwMQAkAgDCAFQQRqIAUQjAJFBEAgDSEHDAELIA0hByABEKEGRQ0AIAUoAgQhBiAFNQIAIQ4DQCAHIAtZIAcgDllyDQEgACABIAkgBiAHp0EDdGopAwAQDkGAgAEQqwFBAEgNAiAJQgF8IQkgB0IBfCEHDAALAAsgByALIAcgC1UbIQsDQCAHIAtSBEAgACAMIAcgBUEoahCHASIGQQBIDQIgBgRAIAAgASAJIAUpAyhBgIABEKsBQQBIDQMLIAlCAXwhCSAHQgF8IQcMAQsLIAAgAUEwIAlCgICAgAhaBH4gCbkQFgUgCQsQSUEASA0AIAQEQCAIIAKtIgl8IAp9IQsCQCAJIApRDQAgACAMIAkgDXwgCiANfCIHIAggB31Bf0EBIAogCVMbEPcCQQBIDQIDQCAIIAtXDQEgACAMIAhCf3wiCBCSAkEATg0ACwwCC0IAIQcDQCAHIAlSBEAgByANfCEIIAenIQIgB0IBfCEHIAAgDCAIIAJBA3QgA2opAxAQDhCNAUEATg0BDAMLCyABIQcgACAMQTAgC0KAgICACHxC/////w9YBH4gC0L/////D4MFIAu5EBYLEElBf0wNAgsgDCEHDAILIAEhBwsgACAMEAtCgICAgOAAIQELIAAgBxALIAVBMGokACABC70CAwV/An4BfCMAQSBrIgMkAAJAIAIoAgQNACACKAIAIQQCQAJAAn8gAigCCARAIAApAAAgASkAAFENAiADIAApAwA3AxAgAyABKQMANwMYIAQgAikDEEKAgICAMEECIANBEGoQIyIIEAwNAyAIQv////8PWARAIAinIgJBH3UgAkEASmoMAgsgBCADQQhqIAgQWkEASA0DIAMrAwgiCkQAAAAAAAAAAGQgCkQAAAAAAAAAAGNrDAELIAAoAggiBkUEQCAEIAApAwAQLCIIEAwNAyAAIAinIgY2AggLIAEoAggiBwR/IAYFIAQgASkDABAsIggQDA0DIAEgCKciBzYCCCAAKAIICyAHEJMCCyIFDQILIAApAxAiCCABKQMQIglVIAggCVNrIQUMAQsgAkEBNgIECyADQSBqJAAgBQuQBQIEfwV+IwBBMGsiBSQAIAVCADcCHCAFIAA2AhggBSADKQMAIgg3AygCQAJAAn8CQAJAAkAgCBARRQRAIAAgCBBoBEBCgICAgDAhAUEAIQIMAgsgBUEBNgIgC0EAIQIgACAFQRBqIAAgARAqIgEQQEUNAQsMAQtCACEIA0AgCCAFKQMQIgtTBEAgBiAETwRAIAAgAiAEIARBAXZqQR9qQXBxIgRBGGwgBUEMahC0ASIDRQ0DIAUoAgxBGG4gBGohBCADIQILQQAgACABIAggAiAGQRhsaiIHEIcBIgNBAEgNAxoCQCADRQ0AIAcpAwAQEQRAIApCAXwhCgwBCyAHIAg3AxAgB0EANgIIIAZBAWohBgsgCEIBfCEIDAELCyACIAZBGEE4IAVBGGoQ3QJBACAFKAIcDQEaIAatIQlCACEIA0ACQCAIIAlSBEAgAiAIpyIEQRhsaiIDKAIIIgcEQCAAIAetQoCAgICQf4QQCwsgAykDACEMIAggAykDEFEEQCAAIAwQCwwCCyAAIAEgCCAMEI0BQX9KDQEgBEEBagwECyAAIAIQGSAKQgAgCkIAVRsgCXwhCANAIAggCVEEQCAIIAsgCCALVRshCQNAIAggCVENCCAAIAEgCBCSAiECIAhCAXwhCCACQQBODQALDAYLIAAgASAJQoCAgIAwEI0BIQIgCUIBfCEJIAJBAE4NAAsMBAsgCEIBfCEIDAALAAtBAAshAyAGIAMgBiADSxshBgNAIAMgBkcEQCAAIAIgA0EYbGoiBCkDABALIAQoAggiBARAIAAgBK1CgICAgJB/hBALCyADQQFqIQMMAQsLIAAgAhAZCyAAIAEQC0KAgICA4AAhAQsgBUEwaiQAIAELswMCAn8CfiMAQTBrIgIkACACQoCAgIAwNwMoAkACfkKAgICAMCAAIAJBEGogACABECoiARBADQAaAkACQAJAIAEgAkEcaiACQQxqEIwCRQRAIAIpAxAhBwwBCyACKQMQIgcgAigCDCIDrVENAQsDQCAGIAdCf3wiB1kNBAJAAkAgACABIAYgAkEoahCHASIDQQBIDQAgACABIAcgAkEgahCHASIEQQBIDQACQAJAIAQEQCAAIAEgBiACKQMgEI0BQQBIDQMgA0UNAiAAIAEgByACKQMoEI0BQQBODQEMBwsgA0UNAyAAIAEgBhCSAkEASA0CIAAgASAHIAIpAygQjQFBAEgNBgsgAkKAgICAMDcDKAwCCyAAIAEgBxCSAkEATg0BCyACKQMoDAQLIAZCAXwhBgwACwALIANBAkkNAkEAIQAgAigCHCEEA0AgACADQX9qIgNPDQMgBCAAQQN0aiIFKQMAIQYgBSAEIANBA3RqIgUpAwA3AwAgBSAGNwMAIABBAWohAAwACwALQoCAgIAwCyEGIAAgBhALIAAgARALQoCAgIDgACEBCyACQTBqJAAgAQtsAQF+QoCAgIDgACEEIAAgARAqIgEQDEUEQAJ+QoCAgIDgACAAIAFB2wAgAUEAEBMiBBAMDQAaIAAgBBA7RQRAIAAgBBALIAAgAUEAQQAQuwQMAQsgACAEIAFBAEEAEDYLIQQgACABEAsLIAQL1gICAn8EfiMAQSBrIgUkAAJ+AkAgACAFIAAgARAqIgkQQA0AQSwhBkKAgICAMCEIAkAgAkEBSCAEckUEQEEAIQIgAykDACIBEBENASAAIAEQLCIIEAwNAkF/IQYgCKciAigCBEEBRw0BIAItABAhBgwBC0EAIQILIAAgBUEIakEAEEMaQgAhASAFKQMAIgdCACAHQgBVGyEKAkADQCABIApSBEACQCABUA0AIAZBAE4EQCAFQQhqIAYQPBoMAQsgBUEIaiACQQAgAigCBEH/////B3EQWBoLIAAgCSABpxB4IgcQDA0CAkAgBxAnDQAgBxARDQAgBUEIaiAEBH4gACAHELkEBSAHCxCLAQ0DCyABQgF8IQEMAQsLIAAgCBALIAAgCRALIAVBCGoQOAwCCyAFQQhqEEUgACAIEAsLIAAgCRALQoCAgIDgAAshASAFQSBqJAAgAQvzAQIBfwJ+IwBBIGsiBCQAAn4CQAJAAkAgACAEQRBqIAAgARAqIgUQQA0AIAQpAxAiBkIBUw0BIAQgBkJ/fCIBNwMIIAJBAk4EQCAAIARBCGogAykDCEJ/IAEgBhB9DQEgBCkDCCEBCwNAIAFCAFMNAiAAIAUgASAEQRhqEIcBIgJBAEgNASACBEAgACADKQMAEA4gBCkDGEEAENsBDQQLIAFCf3whAQwACwALIAAgBRALQoCAgIDgAAwCC0J/IQELIAAgBRALIAFC/////w+DIAFCgICAgAh8Qv////8PWA0AGiABuRAWCyEBIARBIGokACABC/UCAgF/BH4jAEEgayIEJAACfgJAAkAgACAEQRBqIAAgARAqIgcQQA0AQn8hBiAEKQMQIghCAVMNASAEQgA3AwggAkECTgRAIAAgBEEIaiADKQMIQgAgCCAIEH0NAQsCQCAHIARBBGogBBCMAkUEQCAEKQMIIQEMAQsgBCkDCCIFIAQ1AgAiASAFIAFVGyEBIAQoAgQhAgNAIAEgBVIEQCAAIAMpAwAQDiACIAWnQQN0aikDABAOQQAQ2wEEQCAFIQYMBQUgBUIBfCEFDAILAAsLIAQgATcDCAsgASAIIAEgCFUbIQUDQCABIAVRDQIgACAHIAEgBEEYahCHASICQQBIDQECQCACRQ0AIAAgAykDABAOIAQpAxhBABDbAUUNACABIQYMAwsgAUIBfCEBDAALAAsgACAHEAtCgICAgOAADAELIAAgBxALIAZC/////w+DIAZCgICAgAh8Qv////8PWA0AGiAGuRAWCyEBIARBIGokACABC9wCAgF/CH4jAEEwayIFJABCgICAgDAhBwJAAkAgACAFQQhqIAAgARAqIggQQARAQoCAgIAwIQYMAQtCgICAgDAhBiAAIAMpAwAiCxBoDQBCgICAgDAhCiACQQJOBEAgAykDCCEKCyAFKQMIIgZCACAGQgBVGyEMA0AgCSAMUgRAAn4gCSIGQoCAgIAIWgRAIAm5EBYhBgsgBgsQDA0CIAAgCCAGEJ4BIgcQDA0CIAUgATcDICAFIAY3AxggBSAHNwMQIAAgCyAKQQMgBUEQahAjIg0QDA0CIAAgDRAtBEAgBARAIAAgBxALIAAgCBALDAULIAAgBhALIAAgCBALIAchBgwEBSAAIAcQCyAAIAYQCyAJQgF8IQkMAgsACwsgACAIEAtC/////w9CgICAgDAgBBshBgwBCyAAIAYQCyAAIAcQCyAAIAgQC0KAgICA4AAhBgsgBUEwaiQAIAYL9QECAX8CfiMAQSBrIgQkAAJAAkAgACAEQRhqIAAgARAqIgYQQA0AIARCADcDEAJAIAJBAUwEQCAEIAQpAxgiBTcDCAwBCyAEKQMYIQUgAykDCCIBEBFFBEAgACAEQRBqIAFCACAFIAUQfQ0CCyAEIAU3AwggAkEDSA0AIAMpAxAiARARDQAgACAEQQhqIAFCACAFIAUQfQ0BIAQpAwghBQsgBCkDECIBIAUgASAFVRshBQNAIAEgBVENAiAAIAYgASADKQMAEA4QjQEhAiABQgF8IQEgAkF/Sg0ACwsgACAGEAtCgICAgOAAIQYLIARBIGokACAGC9IEAgN/CH4jAEFAaiIFJABCgICAgDAhCiAFQoCAgIAwNwM4IAVCgICAgDA3AzACQAJAAkAgBEEIcSIGBEAgBSAAIAEQDiILEJYBIgesNwMIIAdBAE4NAQwCCyAAIAVBCGogACABECoiCxBADQELIAAgAykDACINEGgNAAJAIAJBAUwEQEIAIQEgBSkDCCIMQgAgDEIAVRshCSAEQQFxIQQDQCABIAlRBEAgAEHvrAFBABAVDAQLIAwgAUJ/hXwgASAEGyEIIAFCAXwhASAGBEAgBSAAIAsgCBBgIgg3AzAgCBAMDQQMAwsgACALIAggBUEwahCHASICQQBIDQMgAkUNAAsgBSkDMCEIDAELIARBAXEhBEIAIQEgAykDCBAOIQggBSkDCCEMCyABIAwgASAMVRshDgNAIAEgDlENAiAMIAFCf4V8IAEgBBshCQJAAkACQCAGBEAgBSAAIAsgCRBgIgo3AzggChAMRQ0BDAMLIAAgCyAJIAVBOGoQhwEiAkEASA0CIAJFDQELIAlCgICAgAh8Qv////8PWAR+IAlC/////w+DBSAJuRAWCyIKEAwNASAFIAg3AxAgBSALNwMoIAUgCjcDICAFIAUpAzgiDzcDGCAAIA1CgICAgDBBBCAFQRBqECMhCSAAIAoQCyAAIA8QCyAFQoCAgIAwNwM4IAkQDA0BIAAgCBALIAkhCAsgAUIBfCEBDAELCyAFIAg3AzAgBSkDOCEKCyAAIAUpAzAQCyAAIAoQC0KAgICA4AAhCAsgACALEAsgBUFAayQAIAgLsgYCA38JfiMAQTBrIgUkAEKAgICAMCEIIAVCgICAgDA3AygCQAJAAkAgBEEIcSIGBEAgBSAAIAEQDiIJEJYBIgesNwMIIAdBAE4NAQwCCyAAIAVBCGogACABECoiCRBADQELIAMpAwAhDkKAgICAMCENIAJBAk4EQCADKQMIIQ0LIAAgDhBoDQACQAJAAkACQAJAAkACQCAEDg0FAAYBAgYGBgUABgMEBgtCgICAgBAhCAwFCyAAIAkCfiAFKQMIIgFCgICAgAh8Qv////8PWARAIAFC/////w+DDAELIAG5EBYLEKcCIggQDA0FDAQLIAAgCUIAEKcCIggQDA0EDAMLIAUgCTcDECAFIAU1Agg3AxggAEECIAVBEGoQ4AIiCBAMDQMMAgsgABBPIggQDA0CDAELQoGAgIAQIQgLQgAhASAFKQMIIgpCACAKQgBVGyEQA0AgASAQUgRAAkACQCAGBEAgBSAAIAkgARBgIgo3AyggChAMDQUMAQsgACAJIAEgBUEoahCHASICQQBIDQQgAkUNAQsgASEKAn4gAUKAgICACFoEQCABuRAWIQoLIAoLEAwNAyAFIAk3AyAgBSAKNwMYIAUgBSkDKCIPNwMQIAAgDiANQQMgBUEQahAjIQsgACAKEAsgCxAMDQMCQAJAAkACQAJAAkACQCAEDg0AAQUCBAUFBQABBQMEBQsgACALEC0NBUKAgICAECEBDAoLIAAgCxAtRQ0EQoGAgIAQIQEMCQsgACAIIAEgCxBuQQBIDQcMAwsgACAIIAFC/////w+DIAtBgIABEN0BQQBIDQYMAgsgACALEC1FDQEgACAIIAwgDxAOEG5BAEgNBSAMQgF8IQwMAQsgACALEAsLIAAgDxALIAVCgICAgDA3AygLIAFCAXwhAQwBCwsgBEEMRwRAIAghAQwCCyAFIAk3AxAgBSAMQv////8PgzcDGCAAQQIgBUEQahDgAiIBEAwNACAFIAg3AxAgACAAIAFBwgBBASAFQRBqEL4CEIsCDQAgACAIEAsMAQsgACAIEAtCgICAgOAAIQELIAAgBSkDKBALIAAgCRALIAVBMGokACABC0ICAX8BfiABECFFBEBBAA8LQX8hAiAAIAFBygEgAUEAEBMiAxAMBH9BfwUgAxARRQRAIAAgAxAtDwsgACABEMABCwuUAwIDfwV+IwBBEGsiBCQAQoCAgIAwIQgCQAJAIAAgARAqIgsQDA0AIAAgC0IAEKcCIggQDA0AQX8hBSACQX8gAkF/ShshAgJAA0AgAiAFRwRAIAshCSAAAn4gBUEATgRAIAMgBUEDdGopAwAhCQsgCQsQrgYiBkEASA0DAkAgBgRAIAAgBCAJEEANBSAEKQMAIgogB3xC/////////w9VDQRCACEBIApCACAKQgBVGyEKA0AgASAKUQ0CIAAgCSABIARBCGoQhwEiBkEASA0GIAYEQCAAIAggByAEKQMIEG5BAEgNBwsgB0IBfCEHIAFCAXwhAQwACwALIAdC/////////w9ZBEAgAEGV1wBBABAVDAULIAAgCCAHIAkQDhBuQQBIDQQgB0IBfCEHCyAFQQFqIQUMAQsLIAAgCEEwIAdCgICAgAh8Qv////8PWAR+IAdC/////w+DBSAHuRAWCxBJQX9KDQIMAQsgAEGV1wBBABAVCyAAIAgQC0KAgICA4AAhCAsgACALEAsgBEEQaiQAIAgLPQACQCABEBENACABpyAAEPQDp0YNACAAIAFBARBtDwsgAykDACIBEFRBfnFBAkYEQCAAED0PCyAAIAEQKgstAQF+QoCAgIAwIQICQCABEJ4DIgBFDQAgAC0AEkEEcUUNACAANQJEIQILIAILMwIBfwF+QoCAgIAwIQMCQCABEJ4DIgJFDQAgAi0AEkEEcUUNACAAIAIoAkAQMiEDCyADCygAQoCAgIDgACAAIAMpAwAgARC+BSIAQQBHrUKAgICAEIQgAEEASBsLrAECAn8BfkKAgICA4AAhBiAAIAEQaAR+QoCAgIDgAAVB16UBIQICQCABpyIDLwEGEPUBRQ0AAkAgAygCICIDLwARIgRBgAhxRQ0AIAMoAlQiBUUNACAAIAUgAygCSBD8AQ8LIARBBHZBA3FBf2oiA0ECSw0AIANBAnRBsNwBaigCACECCyAAIAIgACABQTYgAUEAEBMiARARBH4gAEEvEDIFIAELQY2mARC9AQsL8gMDBX8DfgN8AkAgACABEGgNACAAIAApAzBBDhBRIgoQDA0AIAqnIgYgARCyAUEEdEEQcSAGLQAFQe8BcXI6AAUCQCAAQQAgAkF/ahBLIgJBA3RBGGoQLiIERQ0AIAQgARAOIgE3AwAgAykDABAOIQkgBCACNgIQIAQgCTcDCCACQQAgAkEAShshByAEQRhqIQgDQCAFIAdHBEAgCCAFQQN0aiADIAVBAWoiBUEDdGopAwAQDjcDAAwBCwsgBiAENgIgIAAgARDmCCIDQQBIDQACQCADRQ0AIAAgAUEwIAFBABATIgkQDA0BIAlC/////w9YBEAgCaciAyACa0EAIAMgAkobrSELDAELIAkQVEEHRgRAAkAgCRBKIg29Qv///////////wCDQoCAgICAgID4/wBWDQAgDZ0iDSACtyIOZQ0AIA0gDqEhDAsgDL0CfyAMmUQAAAAAAADgQWMEQCAMqgwBC0GAgICAeAsiAre9UQRAIAKtIQsMAgsgDBAWIQsMAQsgACAJEAsLIAAgCkEwIAtBARAaGiAAIAFBNiABQQAQEyIBEAwNACAAQdClASABEJsBBH4gAQUgACABEAsgAEEvEDILQb4VEL0BIgEQDA0AIAAgCkE2IAFBARAaGiAKDwsgACAKEAsLQoCAgIDgAAswACACQQBMBEAgACABQoCAgIAwQQBBABAjDwsgACABIAMpAwAgAkF/aiADQQhqECMLwQECAX8BfiMAQSBrIgIkAEKAgICA4AAhBgJAAkAgACABECoiARAMDQAgACADKQMAEDoiA0UNAANAIAAgAiABpyADEFMiBUEASA0CIAUEQEKAgICAMCEGIAItAABBEHEEQCACQRhqIAJBEGogBBspAwAQDiEGCyAAIAIQTgwDCyAAIAEQlwIiARAMDQIgARAnBEBCgICAgDAhBgwDCyAAEH5FDQALDAELQQAhAwsgACADEBIgACABEAsgAkEgaiQAIAYLlQEBAn4gAykDCCEFIAMpAwAhBgJAIAAgARAqIgEQDEUEQCAAIAUQaEUEQCAAIAYQOiICDQILIAAgARALC0KAgICA4AAPCyAAIAEgAkKAgICAMEKAgICAMCAFIAQbIAVCgICAgDAgBBtBhaoBQYWaASAEGxB1IQMgACABEAsgACACEBJCgICAgOAAQoCAgIAwIANBAEgbC1IAAkAgARARRQRAIAEQJ0UNAQsgABApQoCAgIDgAA8LAkAgAhAhDQAgAhAnDQBCgICAgDAPC0KAgICA4ABCgICAgDAgACABIAJBARCYAkEASBsLJQEBfiAAIAEQKiIBEAwEQCABDwsgACABEPkBIQIgACABEAsgAguTAQIBfwF+IwBBIGsiAiQAQoCAgIDgACEFAkACQCAAIAEQKiIBEAwNACAAIAMpAwAQOiIDRQ0AIAAgAiABpyADEFMiBEEASA0BIARFBEBCgICAgBAhBQwCCyACNQIAIQUgACACEE4gBUICiEIBg0KAgICAEIQhBQwBC0EAIQMLIAAgAxASIAAgARALIAJBIGokACAFC4cBAQJ+IAMpAwAiBRAhRQRAQoCAgIAQDwsCQCAAIAEQKiIEEAxFBEAgBKchAiAFEA4hAQNAIAAgARCXAiIBEAxFBEAgARAnIgMgAiABp0ZyDQMgABB+RQ0BCwsgACABEAsgACAEEAsLQoCAgIDgAA8LIAAgARALIAAgBBALIANFrUKAgICAEIQLZQEBfkKAgICA4AAhBAJAIAAgAykDABA6IgJFDQAgACABECoiARAMBEAgACACEBIgAQ8LIABBACABpyACEFMhAyAAIAIQEiAAIAEQCyADQQBIDQAgA0EAR61CgICAgBCEIQQLIAQLCAAgACABECoLDwAgACABQTdBAEEAEL4CC5wCAQV+IwBBEGsiAiQAIAMpAwAhBQJAIAAQPSIBEAwEQCABIQUMAQtCgICAgDAhBwJAAkAgACAFQQAQ8wEiBBAMDQAgACAEQeoAIARBABATIgcQDA0AA0AgACAEIAcgAkEMahCsASIGEAwNASACKAIMBEAgASEFDAMLAkACQCAGECFFBEAgABApDAELIAAgBkEAEHgiCBAMDQAgACAGQQEQeCIFEAwEQCAAIAgQCwwBCyAAIAEgCCAFQYeAARDFAkF/Sg0BCyAAIAYQCwwCCyAAIAYQCwwACwALQoCAgIDgACEFIAQQIQRAIAAgBEEBELABGgsgByEGIAQhByABIQQLIAAgBhALIAAgBxALIAAgBBALCyACQRBqJAAgBQtIAEEvIQIgACADKQMAIgEQVEF/RgR/IAGnLwEGIgJBKUYEQEENQSkgACABEDsbIQILIAAoAhAoAkQgAkEYbGooAgQFQS8LEDIL8wECBH8BfiMAQTBrIgIkAAJAIAMpAwAiCRAhRQRAQoGAgIAQIQEMAQtCgICAgOAAIQEgACACQSxqIAJBKGogCaciCEEDEI4BDQAgAigCLCEGIAIoAighB0EAIQMCQANAIAMgB0cEQCAAIAJBCGogCCAGIANBA3RqKAIEEFMiBUEASA0CAkAgBUUNACAAIAJBCGoQTiACKAIIIgVBAXFFQQAgBEUgBUECcUVyGw0AQoCAgIAQIQEMAwsgA0EBaiEDDAELCyAAIAkQnwEiA0EASA0BIANBAUetQoCAgIAQhCEBCyAAIAYgBxBiCyACQTBqJAAgAQudAQIBfwF+QoCAgIAwIQECQAJAIAAgAykDABAqIgUQDA0AIAJBASACQQFKGyEEQQEhAgNAIAIgBEYNAgJAIAMgAkEDdGopAwAiARAnDQAgARARDQAgACABECoiARAMDQIgACAFIAFCgICAgDBBARCoBQ0CIAAgARALCyACQQFqIQIMAAsACyAAIAUQCyAAIAEQC0KAgICA4AAhBQsgBQsbACAAIAMpAwAgAykDCBBZQQBHrUKAgICAEIQLmwICA38DfiMAQSBrIgIkAEKAgICA4AAhByAAIAMpAwAQKiIIEAxFBEBCgICAgDAhAQJ+AkAgACACQRxqIAJBGGogCKdBAxCOAQ0AIAAQPSIBEAwNACACKAIcIQQgAigCGCEFQQAhAwNAIAMgBUcEQCAAIAQgA0EDdGoiBigCBBBmIgkQDA0CIAIgCTcDCCACIAg3AwAgAEKAgICAMEECIAJBABC8BCEHIAAgCRALIAcQDA0CIAcQEUUEQCAAIAEgBigCBCAHQYeAARAaQX9MDQMLIANBAWohAwwBCwsgACAEIAUQYiABDAELIAAgAigCHCACKAIYEGIgACAIEAsgASEIQoCAgIDgAAshByAAIAgQCwsgAkEgaiQAIAcLbQACfgJAIAMpAwAiAUL/////b1gEQCAERQ0BIAAQKUKAgICA4AAPC0KAgICA4AAgACABEIoEIgJBAEgNARogBARAIAJBAEetQoCAgIAQhA8LIAINACAAQaucAUEAEBVCgICAgOAADwsgARAOCwtPAAJAAkAgAykDACIBQv////9vWARAIARFBEBCgICAgBAPCyAAECkMAQsgACABEJ8BIgBBAE4NAQtCgICAgOAADwsgAEEAR61CgICAgBCECxAAIAAgAykDAEECQQAQ9gILEAAgACADKQMAQQFBABD2AgstAQF+QoCAgIDgACEBIAAgAykDACIEIAMpAwgQvgQEfkKAgICA4AAFIAQQDgsLfQECfiADKQMAIgFC/////29YBEAgABApQoCAgIDgAA8LIAMpAxAhBkKAgICA4AAhBQJAIAAgAykDCBA6IgJFDQAgACABIAIgBiAERUEOdBC9BCEDIAAgAhASIANBAEgNACAEBEAgA0EAR61CgICAgBCEDwsgARAOIQULIAULQAACfgJAIAEQngMiAkUNACACLQAQQQFxDQBCgICAgDAgAi0AEUEBcQ0BGgsgACABQQBBABDDBBpCgICAgOAACwsnACAAIAMpAwAiASADKQMIQQEQmAJBAEgEQEKAgICA4AAPCyABEA4LOAAgAykDACIBQiCIpyICQX9GIARFQQAgAkF+cUECRxtyRQRAIAAQKUKAgICA4AAPCyAAIAEQ+QELYgEBfgJAIAMpAwAiARAhDQAgARAnDQAgAEHAoQFBABAVQoCAgIDgAA8LAkAgACABEFIiARAMRQRAIAMpAwgiBBARDQEgACABIAQQvgRFDQEgACABEAsLQoCAgIDgAA8LIAELuAEBAn4gARAhRQRAIAAQKUKAgICA4AAPC0KAgICA4AAhBQJ+IAAgAUE2IAFBABATIgQQEQRAIABBjgEQMgwBCyAAIAQQPgsiBBAMBH5CgICAgOAABQJ+IAAgAUEzIAFBABATIgEQEQRAIABBLxAyDAELIAAgARA+CyIBEAwEQCAAIAQQC0KAgICA4AAPCwJAIAQQ9AENACABEPQBDQAgAEG+FSAEQZCcARC9ASEECyAAIAQgARDBAgsLTgEBfyAAKALMASACQQN0akEEaiECA0ACQCACKAIAIgJBAEgEQEF/IQIMAQsgACgCdCACQQR0aiIDKAIAIAFGDQAgA0EIaiECDAELCyACC7QCAQN/IAEtAG5BAXEiBwRAIAJBNhAPIAIgACAGEBgQHQsgAyAFai0AAEE8RgRAIAJBOBAPIAIgACAGEBgQHSAFQQFqIQULAkACfwJAIAMgBCgCBCICQXtqIgFqIggtAABBtAFGBEAgAiADai0AACEEIAcEQEE7IQkCQAJAAkAgBEFnag4FAgEBAQUAC0EVIARBFkYNBRogBEGxAUYNBgsQAQALQRgMAwtBOSEJIARBFkcNAyAIQRE6AAAgAkF8aiEBDAMLQayXAUGhDUGd5gFB3JcBEAAAC0EbCyEHIAggBzoAACACQXxqIQELIAJBAmohBCABIANqIgIgCToAACACQQFqIAAgBhAYEFwgAUEFaiECA0AgAiAETkUEQCACIANqQbEBOgAAIAJBAWohAgwBCwsgBQtUAQN/IAAoAswBQQxqIQEDQAJAQX8hAiABKAIAIgFBAEgNACAAKAJ0IAFBBHRqIgMoAgRBAUcNACABIQIgAygCAEHNAEYNACADQQhqIQEMAQsLIAIL0wEBCH8CQCAALQBuQQJxDQAgACgC2AJFDQAgACgC8AIhASAAKAIAIABB9AJqIgIQjwIDQCADIAAoAuACTg0BAkAgACgC2AIgA0EDdGoiBCgCBCIHQQBIDQAgBCgCACIEIAhrIgVBAEgNACAHIAFrIgZFDQACQAJAIAVBMkoNACAGQQFqIgFBBEsNACACIAEgBUEFbGpBAWpB/wFxEA8MAQsgAkEAEA8gAiAFEPMEIAIgBkEBdCAGQR91cxDzBAsgBCEIIAchAQsgA0EBaiEDDAALAAsLVQEDfyMAQdABayIAJABBgKcEKAIABEBBgAgQnwIiARCWCSECQYCnBCgCACAAEOwIIAIgAEGApwQoAgAQ6gggAhCgCSABEAkgARD+AQsgAEHQAWokAAtxAQR/IAAoAoACIQMgACgCpAIhBANAAkAgAkEURg0AIAQgAUEUbGooAgQhAANAIAAgA2oiBS0AACIBQbQBRiABQcABRnIEQCAAQQVqIQAMAQUgAUHrAEcNAiACQQFqIQIgBSgAASEBDAMLAAsACwsgAAuxBgEJfwNAAkAgAyABKAKIAU4EQEEAIQMDQCADIAEoAnxODQICQCABKAJ0IANBBHRqIgQoAgQNACAELQAPQcAAcQ0AIAJBAxAPIAIgBCgCDEEBdEEIdRAdIAJB2QAQDyACIANB//8DcRAxCyADQQFqIQMMAAsACyABKAKAASADQQR0aiIELQAPQcAAcUUEQCACQQMQDyACIAQoAgxBAXRBCHUQHSACQdwAEA8gAiADQf//A3EQMQsgA0EBaiEDDAELC0F/IQYgASgClAMEQCABQX8QwwMhBiACQQgQDyACQekAEA8gAiAGEB0gASAGQQEQcBogASABKALQAkEBajYC0AILA0AgCCABKAL0AU5FBEBBACEDIAEoAsACIgRBACAEQQBKGyEEIAEoAvwBIAhBBHRqIgchBSAHLQAEIglBAXEhCwJAAn8DQCADIARHBEAgASgCyAIgA0EDdGooAgQiCiAFKAIMRgRAQQAhCyADIQRBAgwDCyAKQX5xQdIARgRAIAJB3gAQDyACIANB//8DcRAxQQEhCyADIQRBAQwDBSADQQFqIQMMAgsACwsgASgCJEEARyEKIAlBAnEiAyAHKAIAQQBIckUEQCACQQMQDyACIAcoAgAQHSACQcAAEA8gAiAAIAUoAgwQGBAdIAIgChAPDAILIAJBPhAPIAIgACAFKAIMEBgQHSACQYB/QYJ/IAlBBHEbQQAgAxsgCnJBgwFxEA9BAAshCSALRUEAIAcoAgAiA0EASBsNAAJAIANBAE4EQCACQQMQDyACIAcoAgAQHSAFKAIMQfwARw0BIAJBzQAQDyAAQRYQGBogAkEWEB0MAQsgAkEGEA8LAkACQAJAIAlBf2oOAgEAAgsgAkHfABAPIAIgBEH//wNxEDEMAgsgAkHMABAPIAIgACAFKAIMEBgQHSACQQ4QDwwBCyACQTkQDyACIAAgBSgCDBAYEB0LIAAgBSgCDBASIAhBAWohCAwBCwsgASgClAMEQCACQSkQDyACQbQBEA8gAiAGEB0gASgCpAIgBkEUbGogAigCBDYCCAsgACABKAL8ARAZIAFCADcC9AEgAUEANgL8AQv1AwEEfyMAQRBrIgYkAEF/IQcCQAJAAkAgACAGQQhqIAZBDGogASACIAMQvwQiCEEASA0AIAYoAgwiCUUNAQJAAkACQAJAIARBxH5qDgMAAAECCwJAAkACQCAJQXtqDgUAAQIFAgQLIARBvQFGBEAgBUEREA8LIAUgBigCCCAIEKgCIAVBxAAQD0EAIQcMBQsgBSAGKAIIIAgQqAIgBUEsEA9BACEHIARBvQFGDQQgBUEPEA8MBAsgBEG9AUYEQCAFQREQDwsgBSAGKAIIIAgQqAIgBUEsEA8gBUEkEA9BACEHIAVBABAxDAMLAkACQAJAIAlBe2oOBQABAQICAwsgBSAGKAIIIAgQqAIgBUHFABAPQQAhBwwECyAFQTAQDyAFIAAgAhAYEB1BACEHIAVBABAPDAMLIAAgAhDJBCICRQ0CIAAgBkEIaiAGQQxqIAEgAiADEL8EIQEgACACEBIgAUEASA0CIAYoAgxBCEcNBCAFIAYoAgggARCoAiAFQRsQDyAFQR4QDyAFQSwQDyAFQR0QDyAFQSQQDyAFQQEQMUEAIQcMAgsQAQALIAVBMBAPIAUgACACEBgQHUEAIQcgBUEAEA8LIAZBEGokACAHDwtB+5cBQaENQZvrAUGVmAEQAAALQbGYAUGhDUHY6wFBlZgBEAAAC+sDAgF/AX4gACgCECIBQSoQ+wVFBEAgAUHAG0EqQQkQhgQaIAEoAkQiAUGoCWpBIDYCACABQfgIakEhNgIAIAFB4AhqQSE2AgAgAUHICGpBIjYCACABQbAIakEjNgIAIAFBmAhqQSM2AgALIAAQPSECIAAoAiggAjcD0AIgACACQcDkAEEEECUgACAAQSRBrBxBAUECQQAQygEQDiICNwNQIAAgAkGw5QBBBxAlIAAgAkGsHCAAKAIoKQPQAhDMASAAIAApAzAQUiECIAAoAiggAjcD6AIgAEENQbQcQQFBBUECIAApAzgQiQIhAiAAIAAoAigpA+gCQeDmAEEBECUgACACIAAoAigpA+gCQQBBARClAiAAIAIQCyAAIAAQPSICNwOgASAAIAJBkOcAQQEQJSAAIAApA6ABEFIhAiAAKAIoIAI3A4ADIAAgAkGw5wBBAxAlIAAgACkDoAEQUiECIAAoAiggAjcDkAMgACACQZDoAEEEECUgACAAKQMwEFIhAiAAKAIoIAI3A4gDIABBDUHCHEEBQQVBAyAAKQM4EIkCIQIgACAAKAIoKQOIA0Hg6gBBARAlIAAgACgCKCIBKQOIAyABKQOQA0EBQQEQpQIgACACIAAoAigpA4gDQQBBARClAiAAIAIQCwtJAQJ/IAAoAsACIgNBACADQQBKGyEDA0ACQCACIANGBEBBfyECDAELIAAoAsgCIAJBA3RqKAIEIAFGDQAgAkEBaiECDAELCyACC20BAn8CQCABKAKcAUF/Sg0AIAEQ0wZBf0oNACAAIAFBzQAQVyIAQQBIDQAgASgCdCAAQQR0aiICIAEoAswBIgNBDGooAgA2AgggAyAANgIMIAJBATYCBCACIAIoAgxBAnI2AgwgASAANgKcAQsLzQICA38BfiAAKAJAIQJBfyEBAkAgABAQDQAgAEEQEOsBDQACQAJAAkACQAJAAkACQAJAIAIQpQEiAUG5f2oOBAEGBgUACyABQbwBRg0DIAFBtgFGDQIgAUHBAEcNBSACKAKYAiIBIAIoAoACaigAASEDIAJBfzYCmAIgAiABNgKEAiAAIAAoAgAgAxBmIgRBARDPASEBIAAoAgAgBBALIAAoAgAgAxASIAFFDQEMBwsgAigCmAIhASACQX82ApgCIAIgATYChAILIABBmAEQDQwECyACKAKAAiACKAKYAmoiASgAASIDQQhGIANB8QBGcg0CIAItAG5BAXEEQCAAQcWIAUEAEBRBfw8LIAFBuAE6AAAMAwsgAEH1iAFBABAUQX8PCyAAQTAQDSAAQQAQGyAAQQMQbEEADwsgAEEOEA0gAEEKEA0LQQAhAQsgAQunAwIEfwR+IwBBQGoiAiQAIAAQPSEFIAAoAiggBTcDmAEgACAFQfDQAUEDECUgACAAQbceQRsgACgCKCkDmAEQoARB8NEBQQIQJSAAED0hBSAAKAIoIAU3A6ABIAAgBUGQ0gFBAxAlIAAgAEHDHkEcIAAoAigpA6ABEKAEQcDSAUEBECUgACAAED0iBUHw0gFBHhAlIAAgBUE3IAAgACgCKCkDECIGQTcgBkEAEBNBAxAaGiAAIABBHUHVHkEAEOECIgZB8NYBQQMQJSAAIAYgBRDiBUEVIQEDQCABQR5GRQRAIAAgBRBSIQcgAUEDdCIDIAAoAihqIAc3AwAgACAHQeAeQQEgAUGZHmotAAB0rSIHQQAQggIaIAAgAEEeIAAgAiABQYgBahCVASIEQQNBAyABIAYQiQIiCCAEIAAoAiggA2opAwAQzAEgACAIQeAeIAdBABCCAhogAUEBaiEBDAELCyAAIAUQCyAAIAYQCyAAED0hBSAAKAIoIAU3A/ABIAAgBUHg2AFBFBAlIABB8h5BHyAAKAIoKQPwARCgBBogAkFAayQAC3MBAX8CQCAAQaJ/IAEQvwMNACAAKAIQQaZ/RgRAIAFBe3EhAiAAEDUhAQNAIAAQEA0CIABBERANIABBsAEQDSAAQekAIAEQHBogAEEOEA0gAEEIIAIQqgINAiAAKAIQQaZ/Rg0ACyAAIAEQHgtBAA8LQX8LZwEDf0F/IQICQCAAIAEQ3gYNACAAKAIQQT9GBEAgABAQDQEgAEHpAEF/EBwhAyAAEF4NASAAQToQLw0BIABB6wBBfxAcIQQgACADEB4gACABQQFxELkBDQEgACAEEB4LQQAhAgsgAgs7AQF/A0ACQCABQQBIBEBBfyEBDAELIAAoAswBIAFBA3RqIgIoAgQiAUF/Sg0AIAIoAgAhAQwBCwsgAQtXACAAKAIAIAAoAkBBAEEAIAAoAgxBABDqAyIABEAgAEEANgJwIABBADYCYCAAQoCAgIAQNwJIIABCATcCMCAAQYAMOwFsIABCATcCWCAAQgE3AlALIAALgwEBBX8jAEEQayIDJAAgACADEPACIABBo4YBQbyGASABGyIFNgI4IAAoAjwhBiAAIAVBGEEEIAEbajYCPCAAKAIUIQdBfyEEIAAQEEUEQCAAQQhBByABG0EAIAUgB0EAIAIQiAIhBAsgACAGNgI8IAAgAxDvAiEAIANBEGokACAAIARyC/sBAgR/AX4jAEFAaiICJAADQAJAIAFBBEYEQEEAIQEDQCABQQJGDQIgACAAKQOYARBSIQUgACgCKCABQQN0aiAFNwOYAiAAIAUgAUECdEGwG2ooAgAgAUG8G2otAAAQJSABQQFqIQEMAAsACyAAIAIgAUGnAWoQlQEhAyAAED0hBSABQR9qQQN0IgQgACgCKGogBTcDACAAIAUgAUECdEGgG2ooAgAgAUG4G2otAAAQJSAAQRogA0EAQQMgARDfAiEFIAFBAU0EQCAAIAVBkOMAQQEQJQsgACAFIAMgACgCKCAEaikDABDMASABQQFqIQEMAQsLIAJBQGskAAs6AQF/IwBBIGsiAyQAIAMgAjYCACADQRBqQRBB8Q0gAxBVGiAAIAEgA0EQahDGBCEAIANBIGokACAAC2oBAX8DQAJAIABFDQAgACgCzAEgAUEDdGpBBGohAQNAIAEoAgAiAUEATgRAIAAoAnQgAUEEdGoiASgCAEHUAEYEQEEBIQIMAwUgAUEIaiEBDAILAAsLIAAoAgwhASAAKAIEIQAMAQsLIAILbwIBfwF+IAAoAhAiAUEpEPsFRQRAIAFB6BpBKUEBEIYEGiABKAJEIgFBGDYC6AcgAUH0GjYC7AcLIABBGUGQG0ECQQJBABDKASICQQEQqAMgACACQeDcAEEBECUgACAAKQPAAUGQGyACQQMQggIaC80DAQR/QX8hBAJAIAAQEA0AAkADQAJAIAFBH0sNACAAKAIQIgJB3QBGIAJBpX9GciACQSxGcg0AIAAQXg0DIAFBAWohASAAKAIQIgJB3QBGDQEgAkEsRw0CIAAQEEUNAQwDCwsgAEEmEA0gACABQf//A3EQF0EAIQIDQCAAKAIQIQMCQAJAAkACQCABQf////8HRwRAIANBLEYNAyADQaV/Rg0CIANB3QBGDQEgABBeDQcgAEHMABANIAAgARCRARA5IAFBAWohAUEAIQIgACgCEEEsRw0FDAQLIANB3QBHDQELIAJFDQQgAEEREA0gAEEBEA0gACABEDkgAEHDABANIABBMBAbDAQLIABBARANIAAgARA5A0ACQAJAAkAgACgCECIBQaV/RwRAQY8BIQMgAUEsRw0BQQEhAgwCCyAAEBANCEHSACEDIAAQXkUNAQwICyABQd0ARg0BIAAQXg0HIABB0QAQDUEAIQILIAAgAxANIAAoAhBBLEcNACAAEBBFDQEMBgsLIAIEQCAAQRIQDSAAQcMAEA0gAEEwEBsMBAsgAEEOEA0MAwtBASECIAFBAWohAQsgABAQRQ0ACwwBCyAAQd0AEC8hBAsgBAuXBAEHfyMAQRBrIgIkACACQQA2AgwCQAJAIAAQEA0AIABBCxANAkADQCAAKAIQIgFB/QBGDQECQAJAIAFBpX9GBEBBfyEBIAAQEA0GIAAQXg0GIABBBxANIABB0wAQDSAAQQYQbCAAQQ4QDSAAQQ4QDQwBCyAAKAIUIQUgACgCGCEGIAAgAkEMakEBQQFBABDFAyIDQQBIDQECQAJAIANBAUYEQCAAQbYBEA0gACACKAIMIgEQGyAAIAAoAkAvAbwBEBcMAQsgACgCEEEoRgRAIAACfyADQX5xIgdBAkYEQEEAIQEgA0ECagwBCyADQX1qQQAgA0F8akEDSRshAUEGCyABIAYgBRDUAQ0EAkAgAigCDCIBRQRAIABB1QAQDQwBCyAAQdQAEA0gACABEBsLIAAgA0F/akEEckEEIAdBAkYbQf8BcRBsDAILIABBOhAvDQMgABBeDQMCQCACKAIMIgFBxABHBEAgAQ0BIAAQwAMgAEHRABANIABBDhANQQAhAQwDCyAEBEAgAEHBhgFBABAUQcQAIQEMCAsgAEHPABANQQEhBEHEACEBDAILIAAgARCqAQsgAEHMABANIAAgARAbCyAAKAIAIAEQEgsgAkEANgIMIAAoAhBBLEcNAiAAEBBFDQELCyACKAIMIQEMAQtBACEBIABB/QAQL0UNAQsgACgCACABEBJBfyEBCyACQRBqJAAgAQt2AQF+IABBJTYC6AEgABA9IQEgACgCKCABNwOQASAAIAFBwNAAQREQJSAAIABBuRpBF0ECIAAoAigpA5ABEM0BEA4iATcDSCAAIAFB4NMAQQEQJSAAIAApA5gBEFIhASAAKAIoIAE3A7gCIAAgAUGw1ABBAhAlC1QBAX8CQCAAQYABaiIBQRVNQQBBASABdEGbgMABcRsNACAAQSlGIABB3QBGciAAQdUAaiIBQQdNQQBBASABdEGHAXEbciAAQf0ARnINAEEBDwtBAAthAQN/IAAoAnwiBEEAIARBAEobIQUDQAJAIAMgBUYEQEF/IQMMAQsCQCAAKAJ0IANBBHRqIgQoAgAgAUcNACAEKAIEDQAgACAEKAIIIAIQ0AQNAQsgA0EBaiEDDAELCyADCz4BAX4gABA9IQEgACgCKCABNwNQIAAgAUGw7wBBLxAlIAAgAEHZHEEVQQcgACgCKCkDUBDNAUGw+ABBAxAlC5EKAgR/AX4jAEHQAGsiAyQAIAAgAEEKQQBBABDhAjcDsAEgAEELQQBBABDhAiEFIAAgACkDMEHPAEKAgICAMCAFIAApA7ABQYEyEHUaIAAgACkDMEHNAEKAgICAMCAFIAApA7ABQYEyEHUaIAAgBRALIAAgAEKAgICAMEEBIABBsAFqQQEQugQQCyAAIAAQPTcDwAEgACAAQoCAgIAgEFI3A8gBIAAgAEHeHEEMQQEgACgCKCkDCBDNAUHgngFBFhAlIAAgACgCKCkDCEHQogFBCxAlIAAgACkDMEHgpAFBBxAlIAAgAEENQeUcQQFBBUEAEN8CIgU3AzggACAFEA5B5RwgACkDMBDMASAAIABBDkHuHEEBQQVBfxDfAiIFQe4cIAAoAigpAxgQzAEDQCABQQhGRQRAIAAgAEEOIAFBAnRBgB1qKAIAIgJBAkEBIAFBB0YbQQUgASAFEIkCIAIgACABQQN0aikDWBDMASABQQFqIQEMAQsLIAAgABA9IgU3A5gBIAAgBUGQpwFBARAlIAAgACgCKCkDEEHQqAFBIBAlIAAgAEGgHUEPQQEgACgCKCkDEBDNARAOIgU3A0AgACAFQaCtAUEEECVB4wAhAiADQbAdQcoAECQiAyEBIABCgICAgCAQUiEFA0AgAgRAIAAgBSABQoGAgIAQQQcQggIaIAEQRCABakEBaiIBLQAAIQIMAQsLIAAgACgCKCkDEEHNASAFQQEQGhogACAAIAAoAigpAxAiBUHrACAFQQAQEzcDqAEgACAAKQOYARBSIQUgACgCKCAFNwOoAiAAIAVB8K0BQQIQJSAAIAApA8ABQbCvAUEQECUgACAAKAIoKQMIQQQQUSEFIAAoAiggBTcDICAAIAVCABDpASAAIAAoAigpAyBB4LMBQQYQJSAAIABB+h1BEEEBIAAoAigpAyAQzQFBgLYBQQ4QJSAAIAAoAigpAwhBBhBRIQUgACgCKCAFNwMwIAAgBUKAgICAEBDpASAAIAAoAigpAzBB4LcBQQIQJSAAQYEeQRFBASAAKAIoKQMwEM0BGiAAIAAoAigpAwhBBRBRIQUgACgCKCAFNwMoIAAgBSAAQS8QMhDpASAAIABBiR5BEkEBIAAoAigpAygQzQFBwLgBQQMQJSAAIAAoAigpAyhB4LsBQTEQJSAAIAApA5gBEFIhBSAAKAIoIAU3A7ACIAAgBUHgwwFBAhAlIAAQgAogACAAKQPAAUGQxAFBARAlIAAgACkDwAFB0MsBQQEQJSAAED0hBSAAKAIoIAU3AzggACAFQYDOAUEFECUgACAAQZAeQRNBACAAKAIoKQM4EM0BIgVB4M4BQQIQJUHCASEBA0AgAUHPAUZFBEAgACAFIAAgAyABEJUBIgJBLhCnAyIEQQFqIAIgBBsgACABEGZBABCCAhogAUEBaiEBDAELCyAAIAApA5gBEFIhBSAAKAIoIAU3A8ACIAAgBUGQzwFBBBAlIAAgACkDMBBSIQUgACgCKCAFNwOAASAAQQ1Blx5BAUEFQQEQ3wIhBSAAIAAoAigpA4ABQZDQAUEBECUgACAAKAIoIgEpA4ABIAEpA8ACQQFBARClAiAAIAUgACgCKCkDgAFBAEEBEKUCIAAgBRALIAAgAEEUQakeQQEQ4QIiBTcDuAEgACAAKQPAAUE6IAUQDkEDEBoaIAAgACkDwAEQDiIFQYoBIAVBAxAaGiADQdAAaiQACzQBAX8jAEHQAGsiAiQAIAIgACgCACACQRBqIAEQlQE2AgAgAEHclQEgAhAUIAJB0ABqJAALmQIBA38gACgCQCIEQbACaiEDIAQoArwBIQUCQANAIAMoAgAiAwRAIAAgBSADKAIYEK0CIAMoAhghBQJAIAIEQCADKAIMIgRBf0YNASABBEAgAygCBCABRw0CCwwECyADKAIIIgRBf0YNACABBEAgAygCBCABRw0BCwwDCwJ/QQAgAygCHEUNABogAEGDARANQQMLIQQDQCAEIAMoAhBORQRAIABBDhANIARBAWohBAwBCwsgAygCFEF/Rg0BIABBBhANIABB7QAgAygCFBAcGiAAQQ4QDQwBCwsCQCABRQRAIAIEQCAAQfyUAUEAEBQMAgsgAEGZlQFBABAUDAELIABBvZUBQQAQFAtBfw8LIABB6wAgBBAcGkEAC4MKARB/IwBBQGoiAyQAIAAoAgAhCiAAKAJAIgwoArwBIQ0gABA1IQkgABA1IQ4gABA1IQ8gABA1IRAgABCDARpBASEHIAAoAkAgA0EQaiABIA8gCUEBEKgBIAMgDTYCKCAAQesAQX8QHCESIAAoAkAoAoQCIQsgACAQEB4gACgCECEBQVEhBkF/IQUCQAJAAkACQAJAAkACQAJAAkAgAEEEEMkDDgIAAQgLIAFBSUYhCCABQVFGIQcgAUGxf0YgAUFRRnJFQQAgAUFJRxsNASABIQYLIAAQEA0EAkAgACgCECIBQfsARiABQdsARnJFBEAgAUGDf0YEQCAAKAIoRQ0CCyAAQcmPAUEAEBQMBgtBASEHIAAgBkEAQQFBf0EAENEBQQBIDQcgA0EANgI8DAMLIAMgCiAAKAIgEBgiBDYCPCAAEBAEQCAAKAIAIAQQEgwFCyAAIAQgBhCuAkUNASAAKAIAIAQQEgwECwJAAkAgACgCEEEgckH7AEcNACAAIANBDGpBABCmASIGQVlHQQAgBkG3f0cbDQAgAEEAQQBBASADKAIMQQJxQQEQ0QFBAE4NAQwFCyAAEKsCDQQgACADQThqIANBNGogA0E8aiADQQhqQQBBAEG7fxC6AQ0EIAAgAygCOCADKAI0IAMoAjwgAygCCEEEQQAQ0AELIANBADYCPEEAIQcMAgsgAEG7AUG7AUG3ASAHGyAIGxANIAAgBBAbIAAgDC8BvAEQF0EAIQcLIAYhAQsgAEHrACAOEBwaIAAoAkAoAoQCIREgACASEB5BASEFAkAgACgCEEE9Rw0AAkAgABAQRQRAQQAhBSAAQQAQuQFFDQELIAogBBASDAILIARFDQAgAEG3ARANIAAgBBAbIAAgDC8BvAEQFwsgCiAEEBICQAJAAkAgAEHDABBQBEAgA0EBNgIsIAMgAygCIEECajYCIEHGlAEhCEEAIQYgBUUNAQwDCyAAKAIQQbd/Rw0BIAIEQCAAQdeTAUEAEBQMBAtBASEGIAUNAkHJlAEhCCABQbF/Rw0AIAwtAG5BAXFFIAdBf3NxDQILIAMgCDYCACAAQYGUASADEBQMAgsgAEHMlAFBABAUDAELIAAQEA0AAkAgBkUEQCAAEF5FDQEMAgsgABCXAQ0BCyAAIAAoAkAoArwBIA0QrQIgAEH8AEH+AEH9ACACGyAGGxANIABB6wAgCRAcGiAAQSkQL0UNAQtBfyEFDAELIAAoAkAiAUGAAmoiBSABKAKEAiIHIBEgC2siBGoQ5wEaIAUgASgCgAIgC2ogBBCUARogASgCgAIgC2pBsQEgBBBMGiAAKAJAIgQgASgChAJBe2o2ApgCIAkgBCgCrAIiASAJIAFKGyEIIAcgC2shByAJIQEDQCABIAhHBEAgBCgCpAIgAUEUbGoiCigCBCIFIAtIIAUgEU5yRQRAIAogBSAHajYCBAsgAUEBaiEBDAELCyAAIA4QHkF/IQUgABCvAg0AIAAgACgCQCgCvAEgDRCtAiAAIAkQHgJ/IAZFBEAgAgRAIABBFBANIABBDhANIABBJBANIABBABAXIABBiwEQDSAAQYIBEA1BgwEMAgsgAEGAARANIABBABBsQYMBDAELIABB/wAQDUEOCyEBIABB6QAgEBAcGiAAQQ4QDSAAIA8QHiAAIAEQDSAAKAJAEKcBIAAQ7AFBACEFCyADQUBrJAAgBQsnAQF/AkAgACgCEEGDf0cNACAAKAIoDQAgAEEAEIYBQTpGIQELIAELzQECAX8CfiMAQRBrIgIkAAJAQYinBCkDAFANAEGEpwQoAgAgACAAEEQQ/AEhA0GEpwQoAgAgASABEERBmggQ8QMiBEGQpwQoAgAQnwMEQEGEpwQoAgAgBBALQYSnBCgCACADEAsMAQsgAiAENwMIIAIgAzcDAEGEpwQoAgBBiKcEKQMAQoCAgIAwQQIgAhAjIQNBhKcEKAIAIAIpAwAQC0GEpwQoAgAgAikDCBALIANBkKcEKAIAEJ8DGkGEpwQoAgAgAxALCyACQRBqJAALRwEBf0F/IQMgACABQShqQQQgAUEwaiABKAIsQQFqEHwEf0F/BSABIAEoAiwiAEEBajYCLCABKAIoIABBAnRqIAI2AgBBAAsL3QQBBn8gACgCACECIAAoAkAoApQDIQRBfyEGAkACQAJAIAAQEA0AIAQoAjghBQJAAkACQAJAAkAgACgCECIBQf8Aag4DAAIBAgsgAiAAKQMgEDoiA0UNBCAAEBBFDQMgAiADEBJBfw8LIAAoAigEQCAAEO0BQX8PC0EWIQMgAiAAKAIgEBghASAAEBANBCAAIAQgAUEWEMoDDQQgAiABEBIgACgCEEEsRw0BIAAQEA0DIAAoAhAhAQsgAUH7AEcEQCABQSpHDQEgABAQDQMgAEH5ABBQRQRAIABB4I8BQQAQFEF/DwsgABAQDQMgACgCEBDTAUUEQAwGC0H9ACEDIAIgACgCIBAYIQEgABAQDQQgACAEIAFB/QAQygMNBCACIAEQEgwBCyAAEBANAgNAAkAgACgCECIBQf0ARg0AIAEQ0wFFBEAMBwtBACEBIAIgACgCIBAYIQMgABAQDQUCQCAAQfkAEFAEQCAAEBANByAAKAIQENMBRQRAIABBu44BQQAQFAwICyACIAAoAiAQGCEBIAAQEEUNAQwHCyACIAMQGCEBCyAAIAQgASADEMoDDQUgAiABEBIgAiADEBIgACgCEEEsRw0AIAAQEEUNAQwECwsgAEH9ABAvDQILIAAQ7QIiA0UNAQsgAiAEIAMQ7AIhASACIAMQEiABQQBIDQAgBSAEKAI4IgIgBSACShshAgNAIAIgBUZFBEAgBCgCNCAFQQxsaiABNgIIIAVBAWohBQwBCwsgABC7ASEGCyAGDwsgAiABEBIgAiADEBJBfw8LIABBu44BQQAQFEF/C88GAQZ/IAAoAgAhAiAAKAJAKAKUAyEDAkACQAJAIAAQEA0AAkACQAJAAkAgACgCECIBQTtqDgQCAQEAAQsgAEEAQQEQ7gIPCyAAQYUBEFBFDQEgAEEBEIYBQUVHDQELIABBAEEAIAAoAhggACgCFEEBQQAQiAIPCyAAEBANAAJAAkAgAUGxf0YNAAJAIAFBQEcEQCABQUlGIAFBUUZyDQIgAUEqRwRAIAFB+wBHDQQgAygCICEEA0ACQCAAKAIQIgFB/QBGDQAgARDTAUUEQAwKC0EAIQEgAiAAKAIgEBghBQJAAkACQCAAEBANACAAQfkAEFBFDQEgABAQDQAgACgCEBDTAUUEQCAAQbuOAUEAEBQMAQsgAiAAKAIgEBghASAAEBBFDQILIAIgBRASDAoLIAIgBRAYIQELIAAgAyAFIAFBABCHAiEGIAIgBRASIAIgARASIAZFDQcgACgCEEEsRw0AIAAQEEUNAQwHCwsgAEH9ABAvDQUgAEH6ABBQRQ0CIAAQ7QIiAUUNBSACIAMgARDsAiEFIAIgARASIAVBAEgNBQNAIAQgAygCIE4NAyADKAIcIARBFGxqIgIgBTYCACACQQE2AgggBEEBaiEEDAALAAsgAEH5ABBQBEAgABAQDQUgACgCEBDTAUUEQAwICyACIAAoAiAQGCEBIAAQEA0GIAAQ7QIiBEUNBiACIAMgBBDsAiEFIAIgBBASIAVBAEgNBiAAIANB/QAgAUEBEIcCIQMgAiABEBIgA0UNBSADIAU2AgAMAgsgABDtAiIBRQ0EIAIgAyABEOwCIQQgAiABEBIgBEEASA0EIAIgAyAEEPMGQQBODQEMBAsCQAJAAkACQCAAKAIQQTtqDgQCAQEAAQsgAEEAQQIQ7gIPCyAAQYUBEFBFDQEgAEEBEIYBQUVHDQELIABBAEEAIAAoAhggACgCFEECQQAQiAIPCyAAEF4NAyAAQRYQqgEgACAAKAJAQfwAQQEQqQFBAEgNAyAAQbsBEA0gAEH8ABAbIABBABAXIAAgA0H8AEEWQQAQhwJFDQMLIAAQuwEPCyAAQQEgAUEBEMsDDwsgAEHPjgFBABAUC0F/DwsgAiABEBJBfw8LIABBu44BQQAQFEF/C7wHAQt/IwBB0ABrIgMkACABKAKAAiEJIAMgASgChAIiBDYCOCADIAAgBEEBdBAuIgU2AkACQCAFRQRAQX8hAQwBC0EAIQEgBEEAIARBAEobIQQDQCABIARHBEAgBSABQQF0akH//wM7AQAgAUEBaiEBDAELCyADQQA2AkwgA0IANwJEIANBADYCPAJ/AkAgACADQThqQQBBAEEAEM4BDQADQAJAIAMoAkgiAUEBTgRAIAMgAUF/aiIBNgJIIAkgAygCRCABQQJ0aigCACIEaiIGLQAAIgFBf2pB/wFxQfMBTwRAIAMgBDYCBCADIAE2AgAgAEGmmgEgAxBCDAQLIAQgAUEPaiABIAFBsQFLGyIHQQJ0IgpBkDFqLQAAaiIIIAMoAjhKBEAgAyAENgIUIAMgATYCECAAQcSaASADQRBqEEIMBAsgAygCQCAEQQF0ai8BACELIApBkTFqLQAAIQUCQCAHQV9qIgxBEEtBASAMdEG/gARxRXJFBEAgBSAGLwABaiEFDAELIAdBhX5qQQNLDQAgASAFakGUfmohBQsgBSALSgRAIAMgBDYCJCADIAE2AiAgAEHsmgEgA0EgahBCDAQLAkAgCkGSMWotAAAgBWsgC2oiBSADKAI8TA0AIAMgBTYCPCAFQf//A0gNACADIAQ2AjQgAyABNgIwIABBi5sBIANBMGoQQgwECyABQV1qIgdBDUsNAUEBIAd0QeXwAHENAgwBCyAAIAMoAkAQGSAAIAMoAkQQGSADKAI8IQ1BAAwDCwJAAkACQAJAAkACQAJAAkACQAJAAkAgAUGXf2oODwQEAQQFCwoKCgYIBgcHBwALIAFBmH5qDgQICAIBCQsgBCAGKAABakEBaiEIDAgLIAQgBi4AAWpBAWohCAwHCyAEQQFqIgQgBCAJaiwAAGohCAwGCyAAIANBOGogBCAGKAABakEBaiABIAUQzgFFDQUMBwsgACADQThqIAQgBigAAWpBAWogASAFQQFqEM4BRQ0EDAYLIAAgA0E4aiAEIAYoAAVqQQVqIAEgBUEBahDOAUUNAwwFCyAAIANBOGogBCAGKAAFakEFaiABIAVBAmoQzgFFDQIMBAsgACADQThqIAQgBigABWpBBWogASAFQX9qEM4BDQMMAQsgACADQThqIARBAWoiBCAEIAlqLAAAaiABIAUQzgENAgsgACADQThqIAggASAFEM4BRQ0ACwsgACADKAJAEBkgACADKAJEEBlBfwshASACIA02AgALIANB0ABqJAAgAQu4NwENfyMAQdAFayICJAAgASgCpAIhDCACIAEoAvACNgLIBSACIAEoAoACIgo2AogFIAIgASgChAIiCTYCjAUgACACQbAFahCPAgJAAn8CQCABKALQAiIDBEAgASABKAIAIANBBHQQayIDNgLMAiADRQ0BCwJAIAEoAtwCIgNFDQAgAS0AbkECcQ0AIAEgASgCACADQQN0EGsiAzYC2AIgA0UNASABQQA2AugCIAEgASgC8AI2AuQCCyABKAK0AUEATgRAIAJBsAVqQQwQDyACQbAFakEEEA8gAkGwBWpB2QAgASgCtAEQZwsgASgCsAFBAE4EQCACQbAFakEMEA8gAkGwBWpBAhAPIAJBsAVqQdkAIAEoArABEGcLIAEoAqwBQQBOBEAgAkGwBWpBDBAPIAJBsAVqQQMQDyACQbAFakHZACABKAKsARBnCwJAIAEoAqgBQQBIDQAgASgCYARAIAJBsAVqQeEAEA8gAkGwBWogAS8BqAEQMQwBCyACQbAFakEIEA8gAkGwBWpB2QAgASgCqAEQZwsgASgCmAFBAE4EQEEAIQMgAS0AbkEBcUUEQCABKAI4QQBHIQMLIAJBsAVqQQwQDyACQbAFaiADEA8gASgCnAEiA0EATgRAIAJBsAVqQdoAIAMQZwsgAkGwBWpB2QAgASgCmAEQZwsgASgCoAFBAE4EQCACQbAFakEMEA8gAkGwBWpBAhAPIAJBsAVqQdkAIAEoAqABEGcLIAEoApABQQBOBEAgAkGwBWpBDBAPIAJBsAVqQQUQDyACQbAFakHZACABKAKQARBnCyABKAKUAUEATgRAIAJBsAVqQQwQDyACQbAFakEFEA8gAkGwBWpB2QAgASgClAEQZwsgAUGAAmohDUEAIQMDQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADIAlOBEBBACEDIAEoAqwCIgRBACAEQQBKGyEEA0AgAyAERg0CIANBFGwhBiADQQFqIQMgBiAMaigCEEUNAAtB8pkBQaENQf36AUGpmQEQAAALIAMgAyAKaiIGLQAAIgVBAnRBkDFqLQAAIgtqIQQCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAVBqH9qDiAQEhoREhoREhoaGhoaGhoaGgQEAQMCGhoMDAUFBQUFBQALAkAgBUF/ag4VCQoKCxoNBxoICBoaGgYaGg8aGhoOAAsgBUFeaiIHQR9LDRhBASAHdCIIQcDhAXENEiAIQQVxRQRAIAdBH0cNGSAGKAABQTBHDRogAEEwEBIgASACKAK0BSACKALIBRA0IAJBsAVqQecBEA8gBCEDDCMLIAYvAAEhAyACQqiAgIBwNwMAIAJBiAVqIAQgAhArBEACQCACKAKUBSIEQX9MBEAgAigCyAUhBAwBCyACIAQ2AsgFCyABIAIoArQFIAQQNCACQbAFaiAFQQFqIAMQZyABIAogCSACKAKQBSACQcgFahCpAiEDDCMLIAEgAigCtAUgAigCyAUQNCACQbAFaiAFIAMQZyAEIQMMIgsgBigAASEFIAQhBgwWC0HtACEFIAYoAAEhBwwUC0HsACEFIAYoAAEhBwwTCyACQYgFaiAEIAEgBigAASACQcwFakEAELwDIgcQuwMEQCABIAdBfxBwGiACQbAFakEOEA8gBCEDDB8LIAJC64CAgHA3AxAgAkGIBWogBCACQRBqECtFDRIgAigClAUhCCACQYgFaiACKAKQBSIGIAcQuwNFDRIgCEEATgRAIAIgCDYCyAULIAEgB0F/EHAaIAVBA3MhBSACKAKgBSEHDBwLIAYoAAEhByAGLQAJIQggASAGKAAFIAJBzAVqQQAQvAMiA0EASA0PIAMgASgCrAJODQ8gASACKAK0BSACKALIBRA0IAEgASgC1AIiBkEBajYC1AIgASgCzAIgBkEEdGoiBkEENgIEIAYgBTYCACACKAK0BSELIAYgAzYCDCAGIAtBBWo2AgggAkGwBWogBRAPIAJBsAVqIAcQHSACQbAFaiAMIANBFGxqIgMoAgwgAigCtAVrEB0gAygCDEF/RgRAIAAgAyACKAK0BUF8akEEEOICRQ0dCyACQbAFaiAIEA8gBCEDDB0LIAJCqYCAgHA3AyAgAkGIBWogBCACQSBqECtFDRMgBCEDIAIoApQFIgRBAEgNHCACIAQ2AsgFDBwLIAJCq4GAgHA3A1AgAkGIBWogBCACQdAAahArBEACQCACKAKUBSIDQX9MBEAgAigCyAUhAwwBCyACIAM2AsgFCyABIAIoArQFIAMQNCACQbAFakHxARAPDBgLIAJBfzYCSCACQqyBgICQzRo3A0AgAkGIBWogBCACQUBrECtFDQACQCACKAKUBSIFQX9MBEAgAigCyAUhBQwBCyACIAU2AsgFCyABIAIoArQFIAUQNCACQbAFakHxARAPIAIoApgFQQNzIQUMGAsgAkLp1IGAcDcDMCACQYgFaiAEIAJBMGoQK0UNESAFQQpGIQgMDQsCQCAGKAABIgZB/////wdxRQ0AIAJCjIGAgHA3A5ABIAJBiAVqIAQgAkGQAWoQK0UNACACKAKUBSIDQQBOBEAgAiADNgLIBQsgAkKOgICAcDcDgAEgAkGIBWogAigCkAUgAkGAAWoQKwRAIAIoApQFIgNBAEgNFyACIAM2AsgFDBcLIAEgAigCtAUgAigCyAUQNCACQbAFakEAIAZrELoDDBYLIAJCjoCAgHA3A3AgAkGIBWogBCACQfAAahArBEAgAigClAUiA0EASA0WIAIgAzYCyAUMFgsgAkLp1IGAcDcDYCACQYgFaiAEIAJB4ABqECsEQCAGQQBHIQgMDQsgASACKAK0BSACKALIBRA0IAJBsAVqIAYQugMgBCEDDBkLIAYoAAEiA0H/AUoNDyABIAIoArQFIAIoAsgFEDQgAkGwBWogBUG7f2pB/wFxEA8gAkGwBWogA0H/AXEQDyAEIQMMGAsgBigAASEDIAJCjoCAgHA3A6ABIAJBiAVqIAQgAkGgAWoQKwRAIAAgAxASIAIoApQFIgNBAEgNFCACIAM2AsgFDBQLIANBL0cNDiAAQS8QEiABIAIoArQFIAIoAsgFEDQgAkGwBWpBvwEQDyAEIQMMFwsgAkLJgICAcDcD2AEgAkLYtvmCcDcD0AEgAkGIBWogBCIDIAJB0AFqECsNFiACQX82AsgBIAJCgYSQgJAJNwPAASACQYgFaiADIAJBwAFqECsNFiACQX82ArgBIAJCho6oyJAJNwOwASACQYgFaiAEIAJBsAFqECsNFgwNCyACQo6AgIBwNwOgAiACQYgFaiAEIAJBoAJqECsEQCACKAKUBSIDQQBIDRIgAiADNgLIBQwSCyACQqiAgIBwNwOQAiACQYgFaiAEIAJBkAJqECsEQAJAIAIoApQFIgNBf0wEQCACKALIBSEDDAELIAIgAzYCyAULIAEgAigCtAUgAxA0IAJBsAVqQSkQDwwSCyACQunUgYBwNwOAAkEAIQggAkGIBWogBCACQYACahArDQggAkKrgYCAcDcD8AEgAkGIBWogBCACQfABahArBEACQCACKAKUBSIDQX9MBEAgAigCyAUhAwwBCyACIAM2AsgFCyABIAIoArQFIAMQNCACQbAFakHwARAPDBILIAJBfzYC6AEgAkKsgYCAkM0aNwPgASACQYgFaiAEIAJB4AFqECtFDQwCQCACKAKUBSIFQX9MBEAgAigCyAUhBQwBCyACIAU2AsgFCyABIAIoArQFIAUQNCACQbAFakHwARAPIAIoApgFQQNzIQUMEgsgAkF/NgK4AiACQsP2gIDgATcDsAIgAkGIBWogBCACQbACahArRQ0LAkAgAigClAUiA0F/TARAIAIoAsgFIQMMAQsgAiADNgLIBQsgASACKAK0BSADEDQgAkGwBWogAi0AmAUQDyACQbAFaiACKAKoBRAdDBALIAJBfzYC6AIgAkLZuP2CcDcD4AIgAkGIBWogBCACQeACahArRQ0KIAIoApQFIgNBAE4EQCACIAM2AsgFCyACQo6AgIBwNwPQAiACKAKYBSIFQQFqIQYCQAJ/QX8gAkGIBWogAigCkAUiAyACQdACahArRQ0AGiACKAKUBSIDQQBOBEAgAiADNgLIBQsgAiACKAKcBTYCxAJBfyEEIAJBfzYCyAIgAiAFQX9qNgLAAiACQYgFaiACKAKQBSIDIAJBwAJqECtFDQEgAigCkAUhAyACKAKUBQshBCAGIQULIAEgAigCtAUgAigCyAUQNCACQbAFaiAFIAIoApwFEGcgBEEASA0TIAIgBDYCyAUMEwsgBi8AASIDQf8BSw0JIAJCjoCAgHA3AvwDIAIgAzYC+AMgAkKQo4KAkAs3A/ADAkAgAkGIBWogBCACQfADahArRQRAIAJCjoCAgHA3A+ADIAIgAzYC3AMgAkHZADYC2AMgAkKOn4KAkAI3A9ADIAJBiAVqIAQgAkHQA2oQK0UNAQsCQCACKAKUBSIFQX9MBEAgAigCyAUhBQwBCyACIAU2AsgFCyABIAIoArQFIAUQNCACQbAFakGTAUGTAUGSASACKAKYBSIEQZEBRhsgBEGPAUYbEA8gAkGwBWogA0H/AXEQDwwPCyACQo6AgIBwNwLEAyACIAM2AsADIAJCkYCAgJALNwO4AyACQoSAgIDQEzcDsAMgAkGIBWogBCACQbADahArBEACQCACKAKUBSIFQX9MBEAgAigCyAUhBQwBCyACIAU2AsgFCyABIAIoArQFIAUQNAJAIAIoAqgFQS9GBEAgAEEvEBIgAkGwBWpBvwEQDwwBCyACQbAFakEEEA8gAkGwBWogAigCqAUQHQsgAkGwBWpBlAEQDyACQbAFaiADQf8BcRAPDA8LIAJCjoCAgHA3AqQDIAIgAzYCoAMgAkKRgICAkAs3A5gDIAJCgYCAgNATNwOQAyACQYgFaiAEIAJBkANqECsEQAJAIAIoApQFIgVBf0wEQCACKALIBSEFDAELIAIgBTYCyAULIAEgAigCtAUgBRA0IAJBsAVqIAIoAqAFELoDIAJBsAVqQZQBEA8gAkGwBWogA0H/AXEQDwwPCyACQo6AgIBwNwOIAyACIAM2AoQDIAJB2QA2AoADIAJCnYGAgJACNwP4AiACQti2+YJwNwPwAiACQYgFaiAEIAJB8AJqECsEQAJAIAIoApQFIgVBf0wEQCACKALIBSEFDAELIAIgBTYCyAULIAEgAigCtAUgBRA0IAJBsAVqIAIoApgFIAIoApwFEGcgAkGwBWpBlAEQDyACQbAFaiADQf8BcRAPDA8LIAEgAigCtAUgAigCyAUQNCACQbAFakHYACADEGcgBCEDDBILIAYvAAEhAyABIAIoArQFIAIoAsgFEDQgAkGwBWogBSADEGcgBCEDDBELIAIgBi8AASIDNgKUBCACQX82ApgEIAIgBUF/ajYCkAQgAkGIBWogBCACQZAEahArBEACQCACKAKUBSIEQX9MBEAgAigCyAUhBAwBCyACIAQ2AsgFCyABIAIoArQFIAQQNCACQbAFaiAFQQFqIAMQZwwNCyABIAIoArQFIAIoAsgFEDQgAkGwBWogBSADEGcgBCEDDBALIAEgCiAJIAQgAkHIBWoQqQIhBAwGCyABKALUAiEJIAEoAswCIQZBACEIQQAhDANAAkACQAJAIAggCUgEQEEDIQUgBigCACIDQZd/akEDTwRAIANB6wFHDQRBASEFCyABKAKkAiAGKAIMQRRsaigCDCAGKAIIIgprIgRBgH9IIAQgBUH/AGpKckUEQCAGQQE2AgQgA0HrAUYEQEHqASEDDAMLIANB/wBqIQMMAgsgA0HrAEcgBEGAgAJqQf//A0tyDQMgBkLrgYCAIDcCAEECIQVB6wEhAwwCCwJAIAxFDQAgASgCzAIhA0EAIQUDQCAFIAlODQEgASgCpAIgAygCDEEUbGooAgwgAygCCCIEayEGAkACQAJAAkAgAygCBEF/ag4EAAEDAgMLIAIoArAFIARqIAZB/wFxEMIEDAILIAIoArAFIARqIAZB//8DcRD6AgwBCyACKAKwBSAEaiAGEFwLIANBEGohAyAFQQFqIQUgASgC1AIhCQwACwALIAAgASgCzAIQGSABQQA2AswCIAAgASgCpAIQGSABQQA2AqQCIAEQ1AYgACABKALYAhAZIAFBADYC2AIgDRCjASANIAIpA8AFNwIQIA0gAikDuAU3AgggDSACKQOwBTcCACABQQE2AqACQQAgDSgCDEUNFBogABDHAQwTCyAGIAM2AgALIAogAigCsAVqQX9qIAM6AAAgBigCBCIDIAIoArAFIApqaiIEIAQgBWogAigCtAUgBSAKaiADamsQ4wEgAiACKAK0BSAFazYCtAVBACEEIAEoAqwCIgNBACADQQBKGyEHIAEoAqQCIQMDQCAEIAdGBEAgASgC1AIhCSAGIQcgCCEEA0ACQCAEQQFqIgQgCU4EQEEAIQMgASgC4AIiBEEAIARBAEobIQQDQCADIARGDQIgASgC2AIgA0EDdGoiBygCACILIApLBEAgByALIAVrNgIACyADQQFqIQMMAAsACyAHIgNBEGohByADKAIYIgsgCkwNASADIAsgBWs2AhgMAQsLIAxBAWohDAwCCyADKAIMIgkgCkoEQCADIAkgBWs2AgwLIANBFGohAyAEQQFqIQQMAAsACyAGQRBqIQYgCEEBaiEIDAALAAtBnooBQaENQaz3AUGpmQEQAAALIAIoApQFIgRBAE4EQCACIAQ2AsgFCyACKAKgBSEFIAIoApAFIQYgAigCmAVBl39qIAhGDQEgASAFQX8QcBogBiEDDAwLIAQhBgwJCyACQX82AoQFIAJBiAVqIAYgASAFIAJBzAVqIAJBhAVqELwDIgcQuwMEQCABIAdBfxBwGiAGIQMMCwsgAigCzAUiBEFYaiIFQQdLQQEgBXRBgwFxRXJFBEAgASAHQX8QcBogASACKAK0BSACKALIBRA0IAJBsAVqIARB/wFxEA8gASAKIAkgBiACQcgFahCpAiEDDAsLQesAIQUMCAsCQCAFQfB+akECTwRAIAVBlwFGDQEgBUG0AUcEQCAFQcABRw0DIAIgBigAATYCyAUgBCEDDAwLIAYoAAEiA0EASA0DIAMgASgCrAJODQMgDCADQRRsaiIFKAIMQX9HDQQgBSACKAK0BTYCDCAFKAIQIQcDQCAHIgMEQCAFKAIMIAMoAgQiCGshBiADKAIAIQcCQAJAAkACQCADKAIIQX9qDgQCAQMAAwsgAigCsAUgCGogBhBcDAILIAZBgIACakGAgARPDQkgAigCsAUgCGogBkH//wNxEPoCDAELIAZBgAFqQYACTw0JIAIoArAFIAhqIAZB/wFxEMIECyAAIAMQGQwBCwsgBUEANgIQIAQhAwwLCyACQo6AgIBwNwPYBCACQtm4/YJwNwPQBCACQYgFaiAEIAJB0ARqECsEQCACKAKUBSIDQQBOBEAgAiADNgLIBQsgAiACKAKcBSIGNgLEBCACQX82AsgEIAIgAigCmAUiBEF/ajYCwAQgAkGIBWogAigCkAUiAyACQcAEahArBEAgAigClAUiA0EATgRAIAIgAzYCyAULIARBAWohBCACKAKQBSEDCyABIAIoArQFIAIoAsgFEDQgAkGwBWogBUF+akH/AXEQDyACQbAFaiAEIAYQZwwLCyACQo6AgIBwNwO4BCACQpiAgICw6A43A7AEIAJBiAVqIAQgAkGwBGoQKwRAAkAgAigClAUiA0F/TARAIAIoAsgFIQMMAQsgAiADNgLIBQsgASACKAK0BSADEDQgAkGwBWogBUF+akH/AXEQDyACQbAFaiACLQCYBRAPIAJBsAVqIAIoAqgFEB0MBwsgAkKOgICAcDcDqAQgAkKZgICAkAk3A6AEIAJBiAVqIAQgAkGgBGoQK0UNAQJAIAIoApQFIgNBf0wEQCACKALIBSEDDAELIAIgAzYCyAULIAEgAigCtAUgAxA0IAJBsAVqIAVBfmpB/wFxEA8gAkGwBWpByQAQDwwGCyACQX82AvgEIAJChICAgLCV69SqfzcD8AQgAkGIBWogBCACQfAEahArRQ0AIAIoApQFIgdBAE4EQCACIAc2AsgFCyACKAKYBSEFAn9B8gEgAigCqAUiB0HFAEYNABogB0EbRw0BQfMBCyEHIAVBfXFBqQFGBEAgASACKAK0BSACKALIBRA0IAJBsAVqIAcQDyAAIAIoAqgFEBIMBgsgAkLpgICAcDcD4AQgAkGIBWogAigCkAUgAkHgBGoQK0UNAAJAIAIoApQFIgVBf0wEQCACKALIBSEFDAELIAIgBTYCyAULIAEgAigCtAUgBRA0IAJBsAVqIAcQDyAAIAIoAqgFEBJB6gAhBQwGCyABIAIoArQFIAIoAsgFEDQgAkGwBWogBiALEJQBGiAEIQMMCAtBnooBQaENQeP1AUGpmQEQAAALQbiZAUGhDUHl9QFBqZkBEAAAC0HHmQFBoQ1B8PUBQamZARAAAAtB3ZkBQaENQfT1AUGpmQEQAAALIAIoApAFIQMMAwsgAigCoAUhByACKAKQBSEGCyABIAIoArQFIAIoAsgFEDQgBUHrAEciCEUEQCABIAogCSAGIAJByAVqEKkCIQYLIAdBAEgNBCAHIAEoAqwCTg0EIAEgASgC1AIiBEEBajYC1AIgASgCzAIgBEEEdGoiBEEENgIEIAQgBTYCACACKAK0BSELIAQgBzYCDCAEIAtBAWo2AggCQCAMIAdBFGxqIgcoAgwiDkF/RgRAIAcoAgggA0F/c2oiA0H/AEogBUGXf2pBAktyRQRAIARBATYCBCAEIAVB/wBqIgM2AgAgAkGwBWogA0H/AXEQDyACQbAFakEAEA8gBiEDIAAgByACKAK0BUF/akEBEOICDQQMAwsgCCADQf//AUpyDQEgBEECNgIEIARB6wE2AgAgAkGwBWpB6wEQDyACQbAFakEAEDEgBiEDIAAgByACKAK0BUF+akECEOICDQMMAgsgBUGXf2pBAksgDiALQX9zaiIDQYABakH/AUtyRQRAIARBATYCBCAEIAVB/wBqIgQ2AgAgAkGwBWogBEH/AXEQDyACQbAFaiADQf8BcRAPIAYhAwwDCyAIIANBgIACakH//wNLcg0AIARBAjYCBCAEQesBNgIAIAJBsAVqQesBEA8gAkGwBWogA0H//wNxEDEgBiEDDAILIAJBsAVqIAVB/wFxEA8gAkGwBWogBygCDCACKAK0BWsQHSAGIQMgBygCDEF/Rw0BIAAgByACKAK0BUF8akEEEOICDQELCyACQbAFahCjAQtBfwshACACQdAFaiQAIAAPC0GeigFBoQ1B5fYBQamZARAAAAuaEAENfyMAQZABayICJAAgAiABKAKAAiIMNgJQIAIgASgChAIiDTYCVCAAIAJB+ABqEI8CIAFBgAJqIQkDfyAIIAEoAvQBTgR/QQAhBUEABUEAIQMgASgCwAIiBUEAIAVBAEobIQQgASgC/AEgCEEEdGoiCyEKAkADQCADIARHBEAgASgCyAIgA0EDdGoiBigCBCIFIAooAgxGBEAgASgCJEECRw0DIAYtAABBCHFFDQMgAkH4AGpBMBAPIAJB+ABqIAAgCigCDBAYEB0gAkH4AGpBARAPDAMLIAVBfnFB0gBGDQIgA0EBaiEDDAELCyACQfgAakE/EA8gAkH4AGogACAKKAIMEBgQHSACQfgAaiALLQAEQQZ0IgVBwAByIAVBgAFxIAsoAgBBf0obQcABcRAPCyAIQQFqIQgMAQsLIQgDQAJAAkACQAJAAkACQAJAAn8CQAJAIAUiAyANSARAIAMgAyAMaiIHLQAAIgRBAnRBkDFqLQAAIg5qIQUCQAJAAkACQAJAAkACQAJAAkAgBEHPfmoOEBQFBgQBAQEBAgEBAwMDFAgACyAEQW9qIgNBH0sNDkEBIAN0QYCA0Ix8cQ0PIANFDQYgA0EFRw0OIAJBfzYCGCACQsn6gIDgATcDECACQdAAaiAFIAJBEGoQK0UNESACQfgAaiACLQBgEA8gAigCWCEFIAIoAlwiA0F/RiADIAhGcg0TIAEgASgC3AJBAWo2AtwCIAJB+ABqQcABEA8gAkH4AGogAxAdIAMhCAwTCyAAIAEgBygAASIDIAcvAAUgBCACQfgAakEAQQAgBRDFBCEFIAAgAxASDBILIAcoAAEhBCAHLwAJIQMgASgCpAIgBygABUEUbGoiBiAGKAIAQX9qNgIAIAAgASAEIANBuQEgAkH4AGogDCAGIAUQxQQhBSAAIAQQEgwRCyAAIAEgBygAASIGIAcvAAUgBCACQfgAahDYBkEASARAA0AgAyANTg0IIAJB+ABqIAMgDGoiACAALQAAQQJ0QZAxai0AACIAEJQBGiAAIANqIQMMAAsACyAAIAYQEgwQCyAHKAABIgNBAEgNCCADIAEoAqwCTg0IIAEoAqQCIANBFGxqIAIoAnwgDmo2AggMDQsgBy8AASIGIAEoAvABRgRAIAAgASACQfgAahDXBgsgASgCzAEgBkEDdGpBBGohAwNAIAMoAgAiBEEASA0PIAEoAnQgBEEEdGoiAygCBCAGRw0PIAEoApwBIARHBEAgAkH4AGogAygCDEEDdkEPcUF/akEBTQR/IAJB+ABqQQMQDyACQfgAaiADKAIMQQF0QQh1EB1B2QAFQeEACxAPIAJB+ABqIARB//8DcRAxCyADQQhqIQMMAAsACyABKALMASAHLwABIgZBA3RqQQRqIQMDQCADKAIAIgRBAEgNDiABKAJ0IARBBHRqIgMoAgQgBkcNDiADLQAMQQRxBEAgAkH4AGpB6AAQDyACQfgAaiAEQf//A3EQMQsgA0EIaiEDDAALAAsgAkF/NgJIIAJC6dSBgOABNwNAIAJB0ABqIAUgAkFAaxArRQ0KIAIoAmgiC0EASA0GIAsgASgCrAJODQYgAigCXCEGIAIoAlghBCACKAJgIQogCyEDA0AgASADENYGIQMgAkKOgICAcDcDOCACIAo2AjQgAkERNgIwIAJB0ABqIAMgAkEwahArBEAgAigCaCEDDAELCyACQX82AiQgAiAKNgIgIAJB0ABqIAMgAkEgahArRQ0KIAEgASgC0AJBAWo2AtACIAEgC0F/EHAaIAEgAigCaCIFQQEQcBogAkH4AGogCkH/AXEQDyACQfgAaiAFEB0gBCEFIAZBf0YgBiAIRnINDCABIAEoAtwCQQFqNgLcAiACQfgAakHAARAPIAJB+ABqIAYQHSAGIQgMDAsgBygAASEIIAEgASgC3AJBAWo2AtwCDAkLIAkQowEgCSACKQOIATcCECAJIAIpA4ABNwIIIAkgAikDeDcCAEEAIAkoAgxFDQIaIAAQxwEMAQsgCRCjASAJIAIpA4gBNwIQIAkgAikDgAE3AgggCSACKQN4NwIAC0F/CyEAIAJBkAFqJAAgAA8LQZ6KAUGhDUGM8gFB95YBEAAAC0GJlwFBoQ1B3fIBQfeWARAAAAsCQAJAAkAgBEGXf2oOBgQEAgQBAwALIARBMUYEQCAHLwABIQYgASAHLwADIgMQxAQgAkH4AGpBMRAPIAJB+ABqIAYQMSACQfgAaiABKALMASADQQN0ai8BBEEBakH//wNxEDEMBwsgBEEyRwRAIARBzQBHDQUgBygAAUUNBwwFCyABIAcvAAEiAxDEBCACQfgAakEyEA8gAkH4AGogASgCzAEgA0EDdGovAQRBAWpB//8DcRAxDAYLIAEgASgC0AJBAWo2AtACIAcoAAEiA0EASA0EIAMgASgCrAJODQQgASgCpAIgA0EUbGoiBigCBCEDIAJC7oCAgHA3AwAgAkHQAGogAyACECtFDQMgBiAGKAIAQX9qNgIADAULIAEgASgC0AJBAWo2AtACCyACQX82AkwgAkH4AGogByAOEJQBGiABIAwgDSAFIAJBzABqEKkCIQUgCCACKAJMIgNGIAUgDU5yIANBAEhyDQMgASABKALcAkEBajYC3AIgAkH4AGpBwAEQDyACQfgAaiADEB0gAyEIDAMLIAEgASgC0AJBAWo2AtACCyACQfgAaiAHIA4QlAEaDAELC0GeigFBoQ1BvPEBQfeWARAAAAvHAQEGfyABKAKUAyEEAkADQAJAIAIgASgC9AFOBEBBACEDQQAhAgNAIAIgBCgCIE4NBCAEKAIcIAJBFGxqIgUoAghFBEAgASAFKAIMIgYQ2gYiB0F/TARAIAAgBkHRlgEQiwMMBAsgBSAHNgIACyACQQFqIQIMAAsACyAAIAFBAUEAIAIgASgC/AEgAkEEdGoiAygCDCADLQAEIgNBAnZBAXEgA0EBdkEBcUEAEL4DIQMgAkEBaiECIANBAE4NAQsLQX8hAwsgAwuJCAEGfwJAIAEoAiANACABLQBuQQFxDQAgASAAIAFB0gAQVzYCkAEgASgCPEUNACABIAAgAUHTABBXNgKUAQsCQCABKAJMIgZFDQAgASgCqAFBf0wEQCABIAAgARC9AzYCqAELIAEoAqwBQX9MBEAgASAAIAFB8QAQVzYCrAELAkAgASgCYEUNACABKAKwAUF/Sg0AIAEgACABQfIAEFc2ArABCyABKAIwRQ0AIAEoArQBQX9KDQAgASAAIAFB8wAQVzYCtAELAkAgASgCSCIHRQ0AIAAgARDkAhogASgCPEUNACABLQBuQQFxDQAgACABENsGCwJAIAEoAixFDQAgASgCcCICRQ0AIAAgASACEOMCGgsCQAJAIAEoAiAEQCABIQIMAQsgASECIAEoAsACDQELA0AgAigCBCIDBEAgAigCDCECAkAgBg0AIAMoAkxFBEBBACEGDAELIAMoAqgBQX9MBEAgAyAAIAMQvQM2AqgBCyADKAKsAUF/TARAIAMgACADQfEAEFc2AqwBCwJAIAMoAmBFDQAgAygCsAFBf0oNACADIAAgA0HyABBXNgKwAQtBASEGIAMoAjBFDQAgAygCtAFBf0oNACADIAAgA0HzABBXNgK0AQsCQCAHDQAgAygCSEUEQEEAIQcMAQsgACADEOQCGkEBIQcLAkAgAygCLEUNACADKAJwIgRFDQAgACADIAQQ4wIaCyADKALMASACQQN0akEEaiECA0AgAigCACICQQBIRQRAIAMoAnQgAkEEdGoiBCAEKAIMIgVBBHI2AgwgACABIANBACACIAQoAgAgBUEBcSAFQQF2QQFxIAVBA3ZBD3EQpAEaIARBCGohAgwBCwsCQCACQX5HBEBBACECA0AgAiADKAKIAU4EQEEAIQIDQCACIAMoAnxODQQCQCADKAJ0IAJBBHRqIgQoAgQNACAEKAIAIgRFIARB0QBGcg0AIAAgASADQQAgAiAEQQBBAEEAEKQBGgsgAkEBaiECDAALAAsgAygCgAEgAkEEdGooAgAiBARAIAAgASADQQEgAiAEQQBBAEEAEKQBGgsgAkEBaiECDAALAAtBACECA0AgAiADKAJ8Tg0BAkAgAygCdCACQQR0aiIEKAIEDQAgBBDcBEUNACAAIAEgA0EAIAIgBCgCAEEAQQBBABCkARoLIAJBAWohAgwACwALIAMhAiADKAIgRQ0BQQAhAgNAIAIgAygCwAJOBEAgAyECDAMFIAAgASADQQAgAygCyAIgAkEDdGoiBS0AACIEQQF2QQFxIAIgBSgCBCAEQQJ2QQFxIARBA3ZBAXEgBEEEdhCEAhogAkEBaiECDAELAAsACwsPC0GWlgFBoQ1BtewBQb6WARAAAAvCAgIDfwF8IwBB0ABrIgQkACAEQRBqQQBBOBBMGiAEQoCAgICAgID4PzcDIEKAgICAwH4hAQJAIAJFDQAgAkEHIAJBB0gbIgJBACACQQBKGyECA0AgAiAFRwRAIAAgBEEIaiADIAVBA3QiBmopAwAQSARAQoCAgIDgACEBDAMLIAQrAwgiB71CgICAgICAgPj/AINCgICAgICAgPj/AFENAiAEQRBqIAZqIAedOQMAAkAgBQ0AIAQrAxAiB0QAAAAAAAAAAGZBAXMgB0QAAAAAAABZQGNBAXNyDQAgBCAHRAAAAAAAsJ1AoDkDEAsgBUEBaiEFDAELCyAEQRBqQQAQgwMiB70CfyAHmUQAAAAAAADgQWMEQCAHqgwBC0GAgICAeAsiALe9UQRAIACtIQEMAQsgBxAWIQELIARB0ABqJAAgAQsnABCOBSIBQoCAgIAIfEL/////D1gEQCABQv////8Pgw8LIAG5EBYLeQEGf0F/IQQCQCABQQNqIAAoAgRB/////wdxSg0AA0AgAkEMRg0BIAJBA2whBUEAIQMDQCADQQNGBEAgAiEEDAMLIAMgBWohBiABIANqIQcgA0EBaiEDIAAgBxAwIAZBkPYAaiwAAEYNAAsgAkEBaiECDAALAAsgBAs7AQF/IAEoAgAhAgNAAkAgAiAAKAIEQf////8HcU4NACAAIAIQMEEgRg0AIAEgAkEBaiICNgIADAELCwucAQEJf0F/IQYCQCABKAIAIgcgACgCBEH/////B3EiCE4NAEHoByEEIAchAwNAAkACQCADIAhGBEAgCCEDDAELIAAgAxAwIglBUGoiCkEKSQ0BIAMgB0YNAwsgAiAFrDcDACABIAM2AgBBACEGDAILIARBAUYhCyAKIARBCm0iBGwgBWogCyAJQTRKcWohBSADQQFqIQMMAAsACyAGC10BBH4gACkDACIEQpDOAH5CyfbeARDyAkKyD3whAQNAAkACQCAEIAEQ3wR9IgJCAFMEQEJ/IQMMAQtCASEDIAIgARDOA1MNAQsgASADfCEBDAELCyAAIAI3AwAgAQvAAQECfiMAQRBrIgIkAAJ+AkAgACAAIAEQKiIBQQEQkgMiBRAMDQAgBRCMAQRAIAAgAkEIaiAFEEhBAEgNAUKAgICAICACKwMIvUKAgICAgICA+P8Ag0KAgICAgICA+P8AUQ0CGgsgACABQaXrABDHAiIEEAwNACAAIAQQO0UEQCAAQf33AEEAEBUgACAEEAsMAQsgACAEIAFBAEEAEDYMAQtCgICAgOAACyEEIAAgARALIAAgBRALIAJBEGokACAEC+4BAgF+AXwjAEEQayICJABCgICAgOAAIQQCQCAAIAJBCGogARCyAg0AIAAgAkEIaiADKQMAEEgNAAJAIAIrAwgiBb1CgICAgICAgPj/AINCgICAgICAgPj/AFENACACIAWdIgU5AwggBUQAAAAAAAAAAGZBAXMgBUQAAAAAAABZQGNBAXNyDQAgAiAFRAAAAAAAsJ1AoCIFOQMICyACAn4gBb0CfyAFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAsiA7e9UQRAIAOtDAELIAUQFgs3AwAgACABQQEgAkEREOIEIQQLIAJBEGokACAEC1EBAX4jAEEQayICJABCgICAgOAAIQQCQCAAIAJBCGogARCyAg0AIAAgAkEIaiADKQMAEEgNACAAIAEgAisDCBCEAxDjBCEECyACQRBqJAAgBAupAQEBfCMAQdAAayICJAACfkKAgICA4AAgACABIAIgBEEPcUEAENADIgBBAEgNABpCgICAgMB+IABFDQAaIARBgAJxBEAgAiACKwMARAAAAAAAsJ3AoDkDAAsgAiAEQQR2QQ9xQQN0aisDACIFvQJ/IAWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyIEt71RBEAgBK0MAQsgBRAWCyEBIAJB0ABqJAAgAQuFAQEBfCMAQRBrIgIkAAJ+QoCAgIDgACAAIAJBCGogARCyAg0AGkKAgICAwH4gAisDCCIEvUL///////////8Ag0KAgICAgICA+P8AVg0AGgJ+IASdIgSZRAAAAAAAAOBDYwRAIASwDAELQoCAgICAgICAgH8LEM8DrQshASACQRBqJAAgAQt1AQF+AkAgARAhRQRAIAAQKQwBCwJAIAMpAwAiBBCbAUUNACAAIAQQOiICRQ0BIAAgAhASQREhAwJAAkACQCACQbp/ag4DAgMBAAsgAkEWRw0CC0EQIQMLIAAgASADEJIDDwsgAEHw9wBBABAVC0KAgICA4AALaAEBfCMAQRBrIgIkAAJ+QoCAgIDgACAAIAJBCGogARCyAg0AGiACKwMIIgS9An8gBJlEAAAAAAAA4EFjBEAgBKoMAQtBgICAgHgLIgC3vVEEQCAArQwBCyAEEBYLIQEgAkEQaiQAIAELxQEBAX8gBEEBcSEGIAUpAwBBMhBBIgIoAgQhBSADKQMAIQECQAJAAkAgBEECTgRAIAVBfnFBBEcNAiACQQU2AgQgBgRAIAAgAiABENEDDAILIAAgAiABQQEQ8wIMAQsgBUEDRw0CIAIgBjYCFCABEA4hAQJAIAYEQCAAIAEQkAEMAQsgAigCREF4aiABNwMACyAAIAIQ5gQLQoCAgIAwDwtBpekAQaENQdOZAUGM6gAQAAALQbDqAEGhDUHcmQFBjOoAEAAAC68BAQF/IwBBMGsiAyQAIAMgAjcDKAJAIAAgACkDUEEBIANBKGpBABCKAiICEAwNACAAIAE1AgBCgICAgHCEIANBEGpBABDkBARAIAAgAhALDAELIANCgICAgDA3AwggA0KAgICAMDcDACAAIAIgA0EQaiADELQCGiAAIAIQC0EAIQEDQCABQQJGDQEgACADQRBqIAFBA3RqKQMAEAsgAUEBaiEBDAALAAsgA0EwaiQAC4wBAQF/IwBBMGsiAyQAIAMgAjcDKCAAIAApA1BBASADQShqQQAQigIiAhAMRQRAIAAgATUCAEKAgICAcIQgA0EBEOQERQRAIANCgICAgDA3AxggA0KAgICAMDcDECAAIAIgAyADQRBqELQCGiAAIAMpAwAQCyAAIAMpAwgQCwsgACACEAsLIANBMGokAAuEAgICfwJ+IwBBIGsiAiQAIAFBMhBBIQYCQCAAIAJBEGoQhgMiARAMRQRAIAZFBEAgAEHQ6ABBABAVIAIgABCPATcDCCAAIAIpAxgiB0KAgICAMEEBIAJBCGoQIyEIIAAgAikDCBALIAAgCBALIAAgAikDEBALIAAgBxALDAILIABBMBBrIgUEQCAFIAQ2AgggBSADKQMAEA43AxAgBSABEA4iATcDGCAFIAIpAxA3AyAgBSACKQMYNwMoIAUgBkHIAGoQTSAGKAIEQQNGDQIgACAGEOYEDAILIAAgAikDEBALIAAgAikDGBALIAAgARALC0KAgICA4AAhAQsgAkEgaiQAIAELGAAgACADKQMAEA4gACAFKQMAEPYBEIwDCz4CAX8BfiMAQRBrIgIkACACIAFBAEetQoCAgIAQhDcDCCAAQTZBAUEAQQEgAkEIahDiASEDIAJBEGokACADC6UEAgJ/An4jAEEwayIFJAACQAJAAkAgACAFQSBqEIYDIggQDEUEQCABQTAQQSIGRQRAIABB4OcAQQAQFQwCCwJAIARFBEAgBikDCBAOIQEMAQsgACAGKQMAIgFBBkEXIARBAUYbIAFBABATIgEQDA0CIAEQEUUEQCABECdFDQELQQEhAiADKQMAEA4hASAEQQFGBEAgBSAAIAFBARCMAzcDAEEAIQIMBAsgBSABNwMADAMLIAUgACAGKQMAIAEgAkEASiADIAVBFGoQ+AQiBzcDGCAAIAEQCyAHEAwNASAFKAIUQQJGBEAgBSAAIAcgBUEUahCCBTcDGCAAIAcQCyAFKQMYIgcQDA0CCyAHEAwNASAAIAApA1BBASAFQRhqQQAQigIiARAMBEAgACAFKQMYEAsMAgsgBSAAIAUoAhQQjQciBzcDAAJAIAcQDEUEQCAAIAUpAxgQCyAFQoCAgIAwNwMIIAAgASAFIAVBIGoQtAIhAiAAIAcQCyAAIAEQCyAAIAUpAyAQCyAAIAUpAygQCyACDQEMBQsgACABEAsgACAFKQMYEAsgACAFKQMgEAsgACAFKQMoEAsLIAAgCBALC0KAgICA4AAhCAwCCyAFIAAQjwE3AwBBASECCyAAIAVBIGogAkEDdHIpAwBCgICAgDBBASAFECMhASAAIAUpAwAQCyAAIAEQCyAAIAUpAyAQCyAAIAUpAygQCwsgBUEwaiQAIAgLBgAgARAOC/ECAQV+IwBBMGsiAiQAAkAgARAhRQRAIAAQKUKAgICA4AAhBQwBCyAAIAJBIGogARC6AiIFEAwNAEKAgICAMCEGQoCAgIAwIQQCQAJAIAAgAUGAASABQQAQEyIIEAwNACAAIAgQaA0AIAAgAykDAEEAEPMBIgQQDARADAELIAAgBEHqACAEQQAQEyIGEAwNAANAIAIgACAEIAYgAkEUahCsASIHNwMYIAcQDA0BIAIoAhQNAiAAIAggAUEBIAJBGGoQIyEHIAAgAikDGBALIAcQDEUEQCAAIAAgB0H/AEECIAJBIGoQswIQiwJFDQELCyAAIARBARCwARoLIAIgABCPATcDCCAAIAIpAyhCgICAgDBBASACQQhqECMhASAAIAIpAwgQCyAAIAUgASABEAwiAxsQC0KAgICA4AAgBSADGyEFCyAAIAgQCyAAIAYQCyAAIAQQCyAAIAIpAyAQCyAAIAIpAygQCwsgAkEwaiQAIAUL+QICAX8EfiMAQSBrIgIkACAAIAUpAwAQ9gEhBiACIAUpAxA3AxggBSkDICEKIAUpAxghCUKAgICA4AAhAQJAIAAgAkEUaiAFKQMIEJECDQACQCAGDQAgBUKBgICAEDcDAAJAIARBA3EiBUEBRgRAIAAQPSIHEAwNAwJAIABBoOYAQanmACAEQQRxIgQbEHIiCBAMDQAgACAHQYgBIAhBBxAaQQBIDQAgACAHQYkBQcAAIAQbIAMpAwAQDkEHEBpBf0oNAgsgACAHEAsMAwsgAykDABAOIQcLIAAgAikDGCIIIAIoAhQgB0EHEJwBQQBIDQEgACAKQX8Q0wMiA0EASA0BIANFDQACQCAFQQJGBEAgAiAAIAgQ5wQiBzcDCCAHEAwNAyAAIAlCgICAgDBBASACQQhqECMhASAAIAIpAwgQCwwBCyAAIAlCgICAgDBBASACQRhqECMhAQsgARAMDQEgACABEAsLQoCAgIAwIQELIAJBIGokACABC8kGAgF/DX4jAEHwAGsiAiQAIAJCgICAgDA3A1ACQCABECFFBEAgABApQoCAgIDgACEKDAELIAAgAkHgAGogARC6AiIKEAwNAEKAgICAMCEJQoCAgIAwIQdCgICAgDAhCAJAAkAgACABQYABIAFBABATIg8QDA0AIAAgDxBoDQACQCAAIAMpAwBBABDzASIIEAwEQAwBCyAAIAhB6gAgCEEAEBMiCRAMDQAgAiAAEE8iBjcDUCAGEAwNACAAEE8iBxAMDQEgACAHQQBCAUEHEJwBQQBIDQEgAkHgAGogBEECRkEDdHIhAyACKQNgIRIgAikDaCEQAkACQANAIAIgACAIIAkgAkEMahCsASIGNwNYIAYQDA0EIAIoAgxFBEAgACAPIAFBASACQdgAahAjIQwgACACKQNYEAsgDBAMDQMgAiALNwMYIAJCgICAgBA3AxAgAiACKQNQNwMgIAIgAykDADcDKCACIAc3AzAgAEE1QQEgBEEFIAJBEGoQ4gEiBhAMDQICQCAEQQFGBEAgAEE1QQFBBUEFIAJBEGoQ4gEiDRAMDQQMAQsCQCAEQQJHBEAgBiERIBAiDiEGDAELIBIiDiERIAAgAikDUCALp0KAgICAMEEHEJwBQQBIDQULIAYhDSAOEA4aIBEhBgsgACAHQQEQ0wNBf0wEQCAAIAwQCyAAIAYQCyAAIA0QCwwECyACIA03A0ggAiAGNwNAIAAgDEH/AEECIAJBQGsQswIhDiAAIAYQCyAAIA0QCyALQgF8IQsgACAOEIsCRQ0BDAMLCyAAIAdBfxDTAyIFQQBIDQMgBUUNBCAEQQJGBEAgACACKQNQEOcEIgEQDA0EIAAgAikDUBALIAIgATcDUAsgACAAIAMpAwBCgICAgDBBASACQdAAahAjEIsCDQMMBAsgACAMEAsLIAAgCEEBELABGgwBCwsgAiAAEI8BNwMAIAAgAikDaCIQQoCAgIAwQQEgAhAjIQEgACACKQMAEAsgARAMRQRAIAAgARALDAELIAAgChALQoCAgIDgACEKCyAAIA8QCyAAIAcQCyAAIAIpA1AQCyAAIAkQCyAAIAgQCyAAIAIpA2AQCyAAIBAQCwsgAkHwAGokACAKCwkAIAUpAwAQDgsVACAAIAUpAwAQDhCQAUKAgICA4AALqwEBAX4jAEEQayICJAAgBSkDACEGIAIgACAFKQMIQoCAgIAwQQBBABAjIgE3AwgCQCABEAwNACAAIAZBASACQQhqQQAQigIhASAAIAIpAwgQCyABEAwNACACIABBM0E0IAQbQQBBAEEBIAMQ4gEiBjcDACAGEAwEQCAAIAEQCyACKQMAIQEMAQsgACABQf8AQQEgAhCzAiEBIAAgAikDABALCyACQRBqJAAgAQvxAQECfiMAQSBrIgIkACADKQMAIQQCQCAAIAFCgICAgDAQ7wEiBRAMDQACQCAAIAQQO0UEQCACIAQQDiIENwMQIAIgBBAONwMYDAELIAIgBDcDCCACIAU3AwBBACEDA0AgA0ECRg0BIAJBEGogA0EDdGogAEEyQQEgA0ECIAIQ4gEiBDcDACAEEAwEQCADQQFGBEAgACACKQMQEAsLIAAgBRALQoCAgIDgACEFDAMFIANBAWohAwwBCwALAAsgACAFEAsgACABQf8AQQIgAkEQahC+AiEFIAAgAikDEBALIAAgAikDGBALCyACQSBqJAAgBQs5ACMAQRBrIgIkACACQoCAgIAwNwMAIAIgAykDADcDCCAAIAFB/wBBAiACEL4CIQEgAkEQaiQAIAELpQECAX8DfiMAQRBrIgIkAEKAgICA4AAhBQJAIAAgAUEqEGlFDQAgACABQoCAgIAwEO8BIgYQDARAIAYhBQwBCyAAIAIgBhC6AiEHIAAgBhALAkAgBxAMDQAgACABIAMgAhC0AiEDA0AgBEECRkUEQCAAIAIgBEEDdGopAwAQCyAEQQFqIQQMAQsLIANFDQAgACAHEAsMAQsgByEFCyACQRBqJAAgBQtuAgJ/AX4DQAJAAkAgA0ECRg0AIAIgA0EDdGogACAAKQMwIANBLmoQUSIFNwMAIAUQDEUNAUF/IQQgA0EBRw0AIAAgAikDABALCyAEDwsgASABKAIAQQFqNgIAIAWnIAE2AiAgA0EBaiEDDAALAAsIAEKAgICAMAvfAQIBfwN+IwBBEGsiAyQAIAFBBUYEQCACKQMQIQQgACACKQMYEPYBIQEgAyACKQMgIgU3AwggAwJ+IAQQEQRAIAUQDiIEIAFFDQEaIAAgBBCQAUKAgICA4AAMAQsgACAEQoCAgIAwQQEgA0EIahAjCyIENwMAIAQQDCIBBEAgAyAAEI8BIgQ3AwALQoCAgIAwIQUgACACIAFBA3RqKQMAIgYQEQR+IAQFIAAgBkKAgICAMEEBIAMQIyEFIAMpAwALEAsgA0EQaiQAIAUPC0HX4wBBoQ1B1+kCQeHjABAAAAsmACAAIAEQ1AMgACABKQMQECYgACABKQMYECYgARCdAiAAIAEQIAuBAQEDfwJAIAFBMhBBIgRFDQAgBEHMAGohAyAEQcgAaiEFA0AgAygCACIDIAVGRQRAIAAgAykDECACECIgACADKQMYIAIQIiAAIAMpAyAgAhAiIAAgAykDKCACECIgA0EEaiEDDAELCyAEKAIEQX5xQQRGDQAgACAEQQhqIAIQ4AMLCxYBAX8gAUEyEEEiAgRAIAAgAhCRBQsLJQEBfyABQTAQQSIDBEAgACADKQMAIAIQIiAAIAMpAwggAhAiCwsnAQF/IAFBMBBBIgIEQCAAIAIpAwAQJiAAIAIpAwgQJiAAIAIQIAsLFgEBfyABpygCICICBEAgACACEJIFCwsoAQF/IAGnKAIgIgIEQCAAIAIoAggQ6AQgACACKQMAECYgACACECALC2kCAX8BfkGApwQoAgAEQBD9BAtBgKcEEL0FIgI2AgAgAhDVBCECQZCnBCABNgIAQYSnBCACNgIAIAIgACAAEERBjQgQmgUiAyABEJ8DBEBBhKcEKAIAIAMQC0EADwtBiKcEIAM3AwBBAQuAAQEFfyABQSoQQSIFBEAgBUEEaiEGA0AgBEECRkUEQCAGIARBA3RqIgdBBGohAwNAIAMoAgAiAyAHRkUEQCAAIAMpAwggAhAiIAAgAykDECACECIgACADKQMYIAIQIiADQQRqIQMMAQsLIARBAWohBAwBCwsgACAFKQMYIAIQIgsLaQEGfyABQSoQQSIEBEAgBEEEaiEFA0AgAkECRkUEQCAFIAJBA3RqIgYoAgQhAwNAIAMgBkZFBEAgAygCBCEHIAAgAxC1AiAHIQMMAQsLIAJBAWohAgwBCwsgACAEKQMYECYgACAEECALC1gBAX9BACECA34gAkECRgRAQoCAgIAwDwsgBSACQQN0IgRqIgYpAwAQEQR+IAYgAyAEaikDABAONwMAIAJBAWohAgwBBSAAQaDjAEEAEBVCgICAgOAACwsLzwIBA38jAEEQayIHJAACfiAAIAEgBUEjahBpIgNFBEAgBEEANgIAQoCAgIDgAAwBCwJAIAMpAwAiARARDQAgASAFQR9qEEEiBgRAAkAgAygCDCIIRQRAIAYoAgghAgwBCyAIKAIUIQIgACgCECAIEOIDCyAGQQRqIQYDQCACIAZGBEAgA0EANgIMIAAgAykDABALIANCgICAgDA3AwAMAwsgAkF0aigCAARAIAIoAgQhAgwBCwsgAkFwaiIGIAYoAgBBAWo2AgAgAyAGNgIMIARBADYCACADKAIIIgNFBEAgAikDEBAODAMLIAcgAikDECIBNwMAIAVFBEAgAikDGCEBCyAHIAE3AwggA0EBRgRAIAEQDgwDCyAAQQIgBxCHAwwCC0Gg4gBBoQ1B/ecCQariABAAAAsgBEEBNgIAQoCAgIAwCyEBIAdBEGokACABC9kBAQV/IwBBEGsiAyQAIAAgASgCEEEEIAEoAhQiAEEBdCAAQQFGGyIAQQN0IANBDGoQtAEiBARAIAMoAgxBA3YgAGohAkEAIQADQCAAIAJGRQRAIAQgAEEDdGoQbyAAQQFqIQAMAQsLIAJBf2ohBSABQQhqIQAgAUEEaiEGA0AgBiAAKAIAIgBHBEAgAEF0aigCAEUEQCAAQQhqIAQgACkDEBDVAyAFcUEDdGoQTQsgAEEEaiEADAELCyABIAI2AhQgASAENgIQIAEgAkEBdDYCGAsgA0EQaiQAC3gBAn5CgICAgOAAIQYCQCAAIAEgBEEDcSICQR9qEGlFDQAgACACQSNqEKEBIgUQDA0AIABBEBAuIgJFBEAgACAFEAtCgICAgOAADwsgARAOIQEgAkEANgIMIAIgBEECdTYCCCACIAE3AwAgBSACEIgBIAUhBgsgBguTAgICfwN+IwBBIGsiBSQAQoCAgIDgACEHAkAgACABIARBH2oQaSIGRQ0AIAMpAwAhCUKAgICAMCEIIAJBAk4EQCADKQMIIQgLIAAgCRBoDQAgBkEEaiECIAYoAgghAwNAIAIgA0YEQEKAgICAMCEHDAILIANBdGooAgAEQCADKAIEIQMFIANBcGoiBiAGKAIAQQFqNgIAIAUgAykDEBAOIgc3AwggBEUEQCADKQMYEA4hBwsgBSABNwMQIAUgBzcDACAAIAkgCEEDIAUQIyEHIAAgBSkDABALIARFBEAgACAFKQMIEAsLIAMoAgQhAyAAKAIQIAYQ4gMgBxAMDQIgACAHEAsLDAALAAsgBUEgaiQAIAcLMQAgACABIAJBH2oQaSIARQRAQoCAgIDgAA8LIAAoAgwiAEEATgRAIACtDwsgALgQFgv5AQICfwF+IABCgICAgCAQUiEDIAAoAiggAzcDCCAAIABBCUG+FUEAQQBBACADEIkCIgM3AzAgAxAOIQMgACgCKCADNwNoIAAQPSEDIAAoAiggAzcDGCAAIANB4JsBQQMQJQNAIAAoAighAiABQQhGRQRAIAAgACACKQMYEFIiA0E2IAAgAUECdEGAHWooAgAQ4QRBAxAaGiAAIANBMyAAQS8QMkEDEBoaIAAgAUEDdGogAzcDWCABQQFqIQEMAQsLIAAgAikDCEECEFEhAyAAKAIoIAM3AxAgACAAIAMQ2ARBARDXBDYCJCAAIABBJGpBAEEwQQoQ1gQaC1kBAX8gACABIARBH2oQaSICRQRAQoCAgIDgAA8LIAJBBGohAyACKAIIIQQDfiADIARGBH5CgICAgDAFIARBcGohBSAEKAIEIQQgACgCECACIAUQ6QQMAQsLC0kAIAAgASAEQR9qEGkiAkUEQEKAgICA4AAPCyAAIAIgAykDABD1AhD0AiIDRQRAQoCAgIAQDwsgACgCECACIAMQ6QRCgYCAgBALNQAgACABIARBH2oQaSICRQRAQoCAgIDgAA8LIAAgAiADKQMAEPUCEPQCQQBHrUKAgICAEIQLPgAgACABIARBH2oQaSICRQRAQoCAgIDgAA8LIAAgAiADKQMAEPUCEPQCIgBFBEBCgICAgDAPCyAAKQMoEA4LmwEBAn8gAEEwEC4iA0UEQEEADwsgAyABNgIIIANCATcDAAJAIAEoAgAEQCADIAKnIgQoAhg2AgwgBCADNgIYDAELIAIQDhoLIAMgAjcDICADQRhqIAEoAhAgASgCFEF/aiACENUDcUEDdGoQTSADQRBqIAFBBGoQTSABIAEoAgxBAWoiBDYCDCAEIAEoAhhPBEAgACABEKgHCyADC5oBAQN+QoCAgIDgACEHAkAgACABIARBH2oQaSICRQ0AIAMpAwAQ9QIhBQJAIAIoAgBFDQAgBRAhDQAgABApQoCAgIDgAA8LQoCAgIAwIQYgBEEBcUUEQCADKQMIIQYLAkAgACACIAUQ9AIiBARAIAAgBCkDKBALDAELIAAgAiAFELEHIgRFDQELIAQgBhAONwMoIAEQDiEHCyAHCzAAIAUpAwAiAUEpEEEiAgRAIAJBAToAESAAIAEQCyAFQoCAgIAgNwMAC0KAgICAMAsxAQF/IwBBEGsiAiQAIAIgATcDCCAAQTFBAEEAQQEgAkEIahDiASEBIAJBEGokACABC20BAn5CgICAgDAhAQJAIABCgICAgDAgAiADEPMFIgQQDA0AIAAgBBC0ByIBEAwNACAAED0iBRAMDQAgACAFQYMBIARBBxAaGiAAIAVBhAEgAUEHEBoaIAUPCyAAIAQQCyAAIAEQC0KAgICA4AAL2gICA38CfiMAQdAAayIGJABBfyEHAkAgACAGQcgAaiABQcIAEIUBIghFDQAgBikDSCIBEBEEQCAAIAgpAwAgAiADEA4gBCAFEPoDIQcMAQsCQAJAIAAgAhBmIgkQDARAIAAgARALDAELIAgpAwAhCiAGIAQ3AzggBiADNwMwIAYgCTcDKCAGIAo3AyAgACABIAgpAwhBBCAGQSBqEDYhASAAIAkQCyABEAwNAiAAIAEQLSIHBEAgACAGIAgoAgAgAhBTIgJBAEgNASACRQ0DAkAgBigCACICQRNxRQRAIAAgBikDCCADEFlFDQEMBAsgAkERcUEQRw0DIAYpAxgQEUUNAwsgACAGEE4gAEGj3ABBABAVDAELIAVBgIABcUUEQEEAIQcgBUGAgAJxRQ0DIAAQ+AFFDQMLIABBu9wAQQAQFQtBfyEHDAELIAAgBhBOCyAGQdAAaiQAIAcLogICAn8CfiMAQUBqIgQkAAJAAkAgACAEQThqIAFBwQAQhQEiBUUNACAEKQM4IgEQEQRAIAAgBSkDACACIANBABATIQEMAgsgACACEGYiBhAMBEAgACABEAsMAQsgBSkDACEHIAQgAzcDMCAEIAY3AyggBCAHNwMgIAAgASAFKQMIQQMgBEEgahA2IQEgACAGEAsgARAMDQAgACAEIAUoAgAgAhBTIgJBAEgNACACRQ0BAkACQCAEKAIAIgJBE3FFBEAgACAEKQMIIAEQWUUNAQwCCyACQRFxQRBHDQEgBCkDEBARRQ0BIAEQEQ0BCyAAIAQQTiAAIAEQCyAAQYvcAEEAEBUMAQsgACAEEE4MAQtCgICAgOAAIQELIARBQGskACABC/YBAgN/An4jAEFAaiIDJABBfyEEAkAgACADQThqIAFB4wAQhQEiBUUNACADKQM4IgEQEQRAIAAgBSkDACACEHchBAwBCwJAAkAgACACEGYiBhAMBEAgACABEAsMAQsgBSkDACEHIAMgBjcDKCADIAc3AyAgACABIAUpAwhBAiADQSBqEDYhASAAIAYQCyABEAwNAiAAIAEQLSIEDQIgACADIAUoAgAiBCACEFMiAkEASA0AIAJFDQEgAygCACECIAAgAxBOIAJBAXEEQCAELQAFQQFxDQILIABB89sAQQAQFQtBfyEEDAELQQAhBAsgA0FAayQAIAQLyAEBAX4CQCAAED0iBRAMDQAgBEGAEHEEQCAAIAVBwQAgAhAOQQcQGhoLIARBgCBxBEAgACAFQcIAIAMQDkEHEBoaCyAEQYDAAHEEQCAAIAVBwAAgARAOQQcQGhoLIARBgARxBEAgACAFQT4gBEEBdkEBca1CgICAgBCEQQcQGhoLIARBgAhxBEAgACAFQT8gBEECdkEBca1CgICAgBCEQQcQGhoLIARBgAJxRQ0AIAAgBUE9IARBAXGtQoCAgIAQhEEHEBoaCyAFC4MEAgN/A34jAEFAaiIHJABBfyEIAkAgACAHQThqIAFB5QAQhQEiCUUNACAHKQM4IgoQEQRAIAAgCSkDACACIAMgBCAFIAYQdSEIDAELAkAgACACEGYiARAMDQAgACADIAQgBSAGELkHIgsQDARAIAAgARALDAELIAkpAwAhDCAHIAs3AzAgByABNwMoIAcgDDcDICAAIAogCSkDCEEDIAdBIGoQNiEKIAAgARALIAAgCxALIAoQDA0BIAAgChAtRQRAQQAhCCAGQYCAAXFFDQIgAEGw2wBBABAVQX8hCAwCCyAAIAcgCSgCACIJIAIQUyICQQBIDQEgBkGBAnEhCAJAAkAgAkUEQCAIQYACRg0BQQEhCCAJLQAFQQFxRQ0BDAQLAkAgBygCACICIAYQmANFIAhBgAJGQQAgAkEBcRtyDQACQCAGQYAwcQRAIAJBEXFBEEcNASAGQYAQcQRAIAAgBCAHKQMQEFlFDQMLIAZBgCBxRQ0BIAAgBSAHKQMYEFkNAQwCCyAGQYDAAHFFDQAgBkECcUVBACACQQNxIgJBAkYbDQEgAg0AIAAgAyAHKQMIEFlFDQELIAZBgARxRQ0CIAcoAgBBE3FBAkcNAgsgACAHEE4LIABB0NsAQQAQFUF/IQgMAgsgACAHEE5BASEIDAELIAAgChALCyAHQUBrJAAgCAuIAgIEfwJ+IwBBQGoiAyQAQX8hBQJAIAAgA0E4aiABQeQAEIUBIgRFDQAgAykDOCIBEBEEQCAAIAQpAwAgAkEAENoBIQUMAQsgACACEGYiBxAMBEAgACABEAsMAQsgBCkDACEIIAMgBzcDKCADIAg3AyAgACABIAQpAwhBAiADQSBqEDYhASAAIAcQCyABEAwNACAAIAEQLSIGRQRAQQAhBQwBCyAAIAMgBCgCACACEFMiAkEASA0AIAIEQAJAAkAgAy0AAEEBcQRAIAAgBCkDABCfASICQQBIDQEgAg0CCyAAQY3bAEEAEBULIAAgAxBODAILIAAgAxBOCyAGIQULIANBQGskACAFC+QFAgt/AX4jAEFAaiIFJABBfyELAkAgACAFQThqIANB5wAQhQEiBkUNACAFKQM4IgMQEQRAIAAgASACIAYoAgBBAxCOASELDAELIAAgAyAGKQMIQQEgBhA2Ig8QDA0AIAVBADYCLCAFQQA2AjQgBUEANgIwIAAgBUE0aiAPENgBIQcgBSgCNCEKAkAgBw0AAkAgCkUNACAAIApBA3QQayIJDQBBACEJDAELAn8CQANAAkAgBCAKRgRAIApBASAKQQFLGyEIQQEhBANAIAQgCEYNAiAJIAQgCSAEQQN0aigCBBDqBCEHIARBAWohBCAHQQBIDQALIABB79kAQQAQFUEADAQLIAAgDyAEEHgiAxAMDQICQCADEJsBDQAgAxDnAw0AIAAgAxALIABBwtkAQQAQFUEADAQLIAAgAxA6IQggACADEAsgCEUNAiAJIARBA3RqIgdBADYCACAHIAg2AgQgBEEBaiEEDAELC0EAIAAgBikDABCfASIMQQBIDQEaIAYtABEEQCAAEMMCDAELIAAgBUEsaiAFQTBqIAYoAgBBAxCOAQRAIAUoAjAhBCAFKAIsIQgMAwsgBSgCLCEIIAUoAjAhBEEAIQcDQCAEIAdHBEAgBi0AEQRAIAAQwwIMBQsgACAFQQhqIAYoAgAgCCAHQQN0aiINKAIEEFMiDkEASA0EAkAgDkUNACAAIAVBCGoQTiAMBEAgBSgCCEEBcQ0BCyAJIAogDSgCBBDqBCINQX9MBEAgAEGJ2gBBABAVDAYLIAwNACAJIA1BA3RqQQE2AgALIAdBAWohBwwBCwsCQCAMDQBBACEGA0AgBiAKRg0BIAZBA3QhByAGQQFqIQYgByAJaigCAA0ACyAAQcHaAEEAEBUMAwsgACAIIAQQYiAAIA8QCyABIAk2AgAgAiAKNgIAQQAhCwwDC0EACyEEQQAhCAsgACAIIAQQYiAAIAkgChBiIAAgDxALCyAFQUBrJAAgCwvJAQECfyAAQfgBEJsCIgEEfyABQQE2AgAgACABQQUQvAEgASAAIAAoAkBBA3QQ6AEiAjYCKCACRQRAIAAgARAgQQAPCyABIAA2AhAgAUEUaiAAQcgAahBNQQAhAiAAKAJAIgBBACAAQQBKGyEAA0AgACACRkUEQCABKAIoIAJBA3RqQoCAgIAgNwMAIAJBAWohAgwBCwsgAUKAgICAIDcDUCABQoCAgIAgNwNIIAFCgICAgCA3A0AgAUHgAWoQbyABEKwHIAEFQQALC+sDAgR/An4jAEHgAGsiBCQAQX8hBQJAIAAgBEHYAGogAkHmABCFASIGRQ0AIAYoAgAhByAEKQNYIgIQEQRAIAAgASAHIAMQUyEFDAELIAAgAxBmIggQDARAIAAgAhALDAELIAYpAwAhCSAEIAg3A0ggBCAJNwNAIAAgAiAGKQMIQQIgBEFAaxA2IQIgACAIEAsgAhAMDQACQAJAAkACQCACECENACACEBENACAAIAIQCwwBCyAAIAQgByADEFMiA0F/TA0CIAMEQCAAIAQQTgsgAhARBEBBACEFIANFDQQgBC0AAEEBcUUNASAHLQAFQQFxRQ0BDAQLIAAgBikDABCfASIGQX9MDQIgACAEQSBqIAIQ6wQhByAAIAIQCyAHQQBIDQMCQCADBEAgBCgCAEGAOkGAzgAgBCgCICIDQRBxGyADchCYA0UNASADQQFxDQMgBCgCACIFQQFxDQEgA0EScQ0DIAVBAnENAQwDCyAGRQ0AIAQtACBBAXENAgsgACAEQSBqEE4LIABBx9gAQQAQFUF/IQUMAgsCQCABBEAgASAEKQMgNwMAIAEgBCkDODcDGCABIAQpAzA3AxAgASAEKQMoNwMIDAELIAAgBEEgahBOC0EBIQUMAQsgACACEAsLIARB4ABqJAAgBQslAQF/IAFBKRBBIgMEQCAAIAMpAwAgAhAiIAAgAykDCCACECILCycBAX8gAUEpEEEiAgRAIAAgAikDABAmIAAgAikDCBAmIAAgAhAgCwsWACAAIAMpAwAgAykDCCADKQMQEPADC6sBAgJ/A34jAEEQayIEJABCgICAgOAAIQYCQCAAIARBDGogAykDABCOAiIFRQ0AIAAgBSAEKAIMQZDIABDxAyEBIAAgBRA3AkAgARAMIAJBAkhyDQAgACADKQMIIggQO0UNACAAED0iBxAMBEAgACABEAsMAgsgACAHQS8gAUEHEBpBf0oEQCAAIAdBLyAIEOwEIQYLIAAgBxALDAELIAEhBgsgBEEQaiQAIAYLvQIBA34jAEEQayIDJAAgBAJ/AkACQCAAIAFBJxBpIgJFBEBCgICAgDAhAUKAgICAMCEGDAELIAIoAhgEQEKAgICAMCEBQQEMAwtCgICAgDAhBiAAIAIpAwAiCCACKQMIIgcQ1gEiARAMDQAgARAnBEAgAkEBNgIYQoCAgIAwIQFBAQwDCyACKAIQBEAgACAAIAFCABBgED4iBhAMDQEgBhD0AQRAIAAgA0EIaiAAIAhB1QAgCEEAEBMQrQFBAEgNAiAAIAhB1QACfiAHpyADKQMIIAIoAhQQ+AIiB0KAgICACHxC/////w9YBEAgB0L/////D4MMAQsgB7kQFgsQSUF/TA0CCyAAIAYQCwwCCyACQQE2AhgMAQsgACABEAsgACAGEAtCgICAgOAAIQELQQALNgIAIANBEGokACABCwYAIAEQDgujBgIEfwp+IwBBMGsiBCQAAkAgARAhRQRAIAAQKUKAgICA4AAhAQwBC0KAgICAMCEJAkACQCAAIAMpAwAQLCIPEAwEQEKAgICAMCEKQoCAgIAwIQFCgICAgDAhDEKAgICAMCEQDAELIAAgASAAKQNIEO8BIhAQDARAQoCAgIAwIQpCgICAgDAhAUKAgICAMCEMDAELAkACQCAAIAAgAUHtACABQQAQExA+IgwQDA0AIAynIgJB9QBBABDVASEGIAJB+QBBABDVAUF/TARAIABBvhUgDEHN0wAQvQEiDBAMDQELIAQgDDcDKCAEIAE3AyAgACAQQQIgBEEgahCvASIKEAwNASAAEE8iARAMDQICQCADKQMIIggQEQRAIARBfzYCHAwBCyAAIARBHGogCBDFAUEASA0DIAQoAhwNAAwECwJAIA+nIgcoAgRB/////wdxIgUEQCAGQX9zQR92IQYgBa0hEUEAIQIDQCACrSELIAIhAwNAIAMgBU8NAyAAIApB1QAgA60iDhBJQQBIDQYgACAJEAsgACAKIA8Q1gEiCRAMDQYCQCAJECcNACAAIARBEGogACAKQdUAIApBABATEK0BDQcgBCkDECIIIBFVBEAgBCARNwMQIBEhCAsgCCALUQ0AIAAgByACIAMQmgEiCxAMDQcgACABIA0gCxBuQQBIDQcgDUIBfCILIAQ1AhxRDQggACAEQQhqIAkQQA0HIAinIQJCASEIIA0gBCkDCCIOQgEgDkIBVRt8IQ0DQCALIA1RDQMgACAAIAkgCBBgED4iDhAMDQggACABIAsgDhBuQQBIDQggCEIBfCEIIAtCAXwiCyAENQIcUg0ACwwICyAHIA4gBhD4AqchAwwACwALAAsgACAKIA8Q1gEiCRAMDQMgCRAnRQ0EQQAhAgsgACAHIAUgAiACIAVLGyAFEJoBIggQDA0CIAAgASANIAgQbkF/Sg0DDAILQoCAgIAwIQoLQoCAgIAwIQELIAAgARALQoCAgIDgACEBCyAAIA8QCyAAIBAQCyAAIAoQCyAAIAwQCyAAIAkQCwsgBEEwaiQAIAELmQIBBH4CfgJAIAEQIUUEQCAAECkMAQtCgICAgDAhBgJAAkAgACADKQMAECwiBxAMBEBCgICAgDAhBAwBCyAAIAFB1QAgAUEAEBMiBBAMDQAgACAEQgAQWUUEQCAAIAFB1QBCABBJQQBIDQELIAAgASAHENYBIgUQDA0BIAAgAUHVACABQQAQEyIGEAwNAQJAIAAgBiAEEFkEQCAAIAQQCwwBCyAAIAFB1QAgBBBJQQBODQBCgICAgDAhBAwCCyAAIAcQCyAAIAYQC0L/////DyAFECcNAxogACAFQdcAIAVBABATIQEgACAFEAsgAQ8LQoCAgIAwIQULIAAgBRALIAAgBxALIAAgBhALIAAgBBALC0KAgICA4AALC7QDAgF/BX4jAEEgayICJAACQAJAIAEQIUUEQCAAECkMAQtCgICAgDAhBgJAIAAgAykDABAsIgkQDARAQoCAgIAwIQVCgICAgDAhB0KAgICAMCEIDAELAkACQCAAIAEgACkDSBDvASIIEAwEQEKAgICAMCEFDAELIAAgACABQe0AIAFBABATED4iBRAMRQ0BC0KAgICAMCEHDAELIAIgBTcDGCACIAE3AxAgACAIQQIgAkEQahCvASIHEAwNACAAIAJBCGogACABQdUAIAFBABATEK0BDQAgACAHQdUAAn4gAikDCCIBQoCAgIAIfEL/////D1gEQCABQv////8PgwwBCyABuRAWCxBJQQBIDQAgAEEnEKEBIgYQDA0AIABBIBAuIgNFDQAgAyAJNwMIIAMgBzcDACADIAWnIgRB5wBBABDVAUF/c0EfdjYCECAEQfUAQQAQ1QEhBCADQQA2AhggAyAEQX9zQR92NgIUIAYgAxCIASAAIAgQCyAAIAUQCwwCCyAAIAkQCyAAIAgQCyAAIAUQCyAAIAcQCyAAIAYQCwtCgICAgOAAIQYLIAJBIGokACAGC6UDAgJ/BX4jAEEQayICJAACQAJAIAEQIUUEQCAAECkMAQtCgICAgDAhBgJAAkAgACADKQMAECwiCBAMDQAgACAAIAFB7gAgAUEAEBMQLSIDQQBIDQACQCADRQRAIAAgASAIENYBIQcMAQsgACAAIAFB7wAgAUEAEBMQLSIDQQBIDQEgACABQdUAQgAQSUEASA0BIAAQTyIHEAwNAiAIpyEEA0AgACAGEAsgACABIAgQ1gEiBhAMDQMgBhAnRQRAIAAgACAGQgAQYBA+IgkQDA0EIAkQ9AEhBSAAIAcgCiAJEI0BQQBIDQQgCkIBfCEKIAVFDQEgACACQQhqIAAgAUHVACABQQAQExCtAUEASA0EIAAgAUHVAAJ+IAQgAikDCCADEPgCIglCgICAgAh8Qv////8PWARAIAlC/////w+DDAELIAm5EBYLEElBf0wNBAwBCwsgCqcNACAAIAcQC0KAgICAICEHCyAAIAYQCyAAIAgQCwwDC0KAgICAMCEHCyAAIAcQCyAAIAYQCyAAIAgQCwtCgICAgOAAIQcLIAJBEGokACAHC7ACAQR/IwBBEGsiBCQAAn9BfyAAKAIwDQAaAkAgACgCKCICIAAoAixIBEAgACgCBCECDAELIAIgAkEBdWpBH2pBb3EhBSAAKAIAIQICQAJAIAAoAgQiAyAAQQhqRgRAIAJBACAFQQN0IARBDGoQtAEiAkUNASACIAMpAwA3AwAgAiADKQMYNwMYIAIgAykDEDcDECACIAMpAwg3AwggBCgCDCEDIAAgAjYCBCAAIANBA3YgBWo2AiwMAwsgAiADIAVBA3QgBEEMahC0ASICDQELIAAQ8AQgACgCACABEAsgAEF/NgIwQX8MAgsgBCgCDCEDIAAgAjYCBCAAIANBA3YgBWo2AiwLIAAgACgCKCIAQQFqNgIoIAIgAEEDdGogATcDAEEACyECIARBEGokACACC9cEAgx/A34jAEEwayIDJABCgICAgOAAIRECQCAAIAFBARDZASIERQ0AIAAgA0EIakEAEEMaAkAgACACECwiDxAMDQACQCAEKAIEQRBqIgstAAAiBUEhcSIMRQRAIANCADcDIAwBCyAAIAFB1QAgAUEAEBMiAhAMDQEgACADQSBqIAIQrQENAQtBACEEAkAgCy0AASIGQQFJDQAgACAGQQN0EC4iBw0AQQAhBwwBCyAFQRBxIQ0gBUEBcSEOIA+nIgZBEGohCSAGKQIEIgKnQR92IQogAykDICEQAkADQCAQIAJC/////weDVQ0BAkAgByALIAkgEKcgAqdB/////wdxIAogABCBBiIFQQFHBEAgBUEASA0BIAxFQQAgBUECRxsNAyAAIAFB1QBCABBJQQBIDQQMAwsgBygCACEIIAMgBygCBCAJayAKdSIFNgIsIAMgBaw3AyAgBCAIIAlrIAp1IghIBEAgA0EIaiAGIAQgCBBYDQQLIA5FBEAgACABQdUAIAUiBK0QSUEATg0DDAQLIAUhBAJAIAUgCEcNAAJAAkAgDUUNACAGKAIEIgRBf0oNACAIIARB/////wdxSQ0BCyADIAhBAWoiBDYCLAwBCyAGIANBLGoQ1wEaIAMoAiwhBAsgAyAErCIQNwMgIAYpAgQhAiAFIQQMAQsLIABB1dIAQQAQQgwBCyADQQhqIAYgBCAGKAIEQf////8HcRBYDQAgACAPEAsgACAHEBkgA0EIahA4IREMAQsgACAPEAsgACAHEBkgA0EIahBFCyADQTBqJAAgEQthAgJ/AX4gACABQTwgAUEAEBMiBBAMBEBBfw8LIAAgBCAAKQNIEFkhAyAAIAQQCwJAIANFDQBBfyECIAAgAUGGASABQQAQEyIBEAwNACABQTBBABCBBCECIAAgARALCyACC+AKAgV/DH4jAEGQAWsiAiQAIAMpAwghEwJAIAEQIUUEQCAAEClCgICAgOAAIREMAQsgACACQcgAakEAEEMaIAJBEGoiBEEANgIwIARCgICAgMAANwMoIAQgADYCACAEIARBCGo2AgRCgICAgDAhDUKAgICA4AAhEQJAAkAgACADKQMAECwiDhAMBEBCgICAgDAhDEKAgICAMCEKQoCAgIAwIQtCgICAgDAhEAwBC0KAgICAMCEQAkAgACATEDsiB0UEQCAAIBMQLCIQEAwNASAQpyEFCyAAIAAgAUHuACABQQAQExAtIgRBAEgNACAEBEAgACAAIAFB7wAgAUEAEBMQLSIGQQBIDQEgACABQdUAQgAQSUEASA0BCwJAIAVFIARFcg0AIAUpAgRC/////weDQgBSDQAgACABEMsHRQ0AIAAgASAOEMoHIREMAQsgDqchAyAERSEFQoCAgIAwIQsDQAJAAn8CQAJAAkAgACABIA4Q1gEiCRAMDQAgCRAnDQQgBSACQRBqIAkQyQdBAEgiBHIEQEECQQQgBBsMBAsgACALEAsgACAAIAlCABBgED4iCxAMDQAgCxD0AUUNAiAAIAJB4ABqIAAgAUHVACABQQAQExCtAUF/Sg0BC0KAgICAMCEMQoCAgIAwIQoMBgsgACABQdUAAn4gAyACKQNgIAYQ+AIiCUKAgICACHxC/////w9YBEAgCUL/////D4MMAQsgCbkQFgsQSSIEQQBODQAgBEEedkECcQwBC0EACyEEQoCAgIAwIQxCgICAgDAhCiAEDgUBBQMFAAULC0EAIQZBACEFQoCAgIAwIQxCgICAgDAhCgNAIAUgAigCOEgEQCAAIAJBDGogAigCFCAFQQN0aikDACIPENgBQQBIDQMgACALEAsgACAAIA9CABBgED4iCxAMDQMgACACIAAgD0HXACAPQQAQExCtAQ0DAkAgAikDACIJIAMpAgRC/////weDIgFVBEAgAiABNwMAIAEhCQwBCyAJQn9VDQBCACEJIAJCADcDAAsgACAKEAsgABBPIgoQDA0DIAAgCkIAIAsQDiILEG5BAEgNAyACKAIMIgRBASAEQQFLGyIErSEUQgEhAQNAIAEgFFIEQCAAIA8gARBgIhIQDA0FIBIQEUUEQCAAIBIQPiISEAwNBgsgACAKIAEgEhBuIQggAUIBfCEBIAhBAE4NAQwFCwsgACANEAsgACAPQYcBIA9BABATIg0QDA0DAkAgBwRAIAAgCiAUIAlC/////w+DEG5BAEgNBSAAIAogBEEBaq0gDhAOEG5BAEgNBQJAIA0QEQ0AIAAgCiAEQQJqrSANEA4iARBuQQBODQAgASENDAYLIAIgCjcDaCACQoCAgIAwNwNgIAAgDBALIAAgACATQQIgAkHgAGpBABCRAxA+IQwMAQtCgICAgDAhASANEBFFBEAgACANECoiARAMDQULIAIgEDcDiAEgAiABNwOAASACIAo3A3ggAiAONwNoIAIgCzcDYCACIAlC/////w+DNwNwIAAgDBALIAAgAkHgAGoQ8QQhDCAAIAEQCwsgDBAMDQMgCSAGrFkEQCACQcgAaiADIAYgCacQWBogAkHIAGogDBCKARogC6cpAgRC/////weDIAl8pyEGCyAFQQFqIQUMAQsLIAJByABqIAMgBiADKAIEQf////8HcRBYGiACQcgAahA4IREMAgtCgICAgDAhDEKAgICAMCEKQoCAgIAwIQsLIAJByABqEEULIAJBEGoQ8AQgACAQEAsgACALEAsgACAKEAsgACAMEAsgACANEAsgACAOEAsLIAJBkAFqJAAgEQuSAQAjAEEgayICJAACfgJAIAEQIUUEQCAAECkMAQsgACACQQhqQQAQQxogAkEIakEvEDwaAkAgAkEIaiAAIAFB7AAgAUEAEBMQiwENACACQQhqQS8QPBogAkEIaiAAIAFB7QAgAUEAEBMQiwENACACQQhqEDgMAgsgAkEIahBFC0KAgICA4AALIQEgAkEgaiQAIAELPwEBfkKAgICA4AAhBCAAIAEgAykDABDWASIBEAwEfkKAgICA4AAFIAEQJyECIAAgARALIAJFrUKAgICAEIQLC6YBAQN/IABBAjoAaCAAQdgAaiECIABB4ABqIQMDQCADIAAoAmQiAUcEQCABQXxqLQAAQQ5xBEAgARBHIAEgAhBNDAIFIAAgAUF4ahDDBQwCCwALCyAAQQA6AGggACgCXCEBAkADQCABIAJHBEAgAUF8ai0AAEEOcQ0CIAEoAgQhAyAAIAFBeGoQICADIQEMAQsLIAIQbw8LQf85QaENQZ0tQeA6EAAAC4ACAQN+AkAgACABQQEQ2QEiAkUNACADKQMIIQYCQAJAIAAgAykDACIEQQAQ2QEiAwRAIAYQEUUEQCAAQffSAEEAEBVCgICAgOAADwsgAzUCAEKAgICAkH+EEA4hBCADNQIEQoCAgICQf4QQDiEFDAELQoCAgIAwIQUCfiAEEBEEQCAAQS8QMgwBCyAAIAQQLAsiBBAMDQEgACAEIAYQ9gMiBRAMDQELIAAgAjUCAEKAgICAkH+EEAsgACACNQIEQoCAgICQf4QQCyACIAU+AgQgAiAEPgIAIAAgAUHVAEIAEElBAEgNASABEA4PCyAAIAQQCyAAIAUQCwtCgICAgOAAC2sBAX8gAUL/////b1gEQCAAEClCgICAgOAADwsCfiAAIAFBABDZASIDRQRAQoCAgIAwIAAgASAAKAIoKQOQARBZDQEaIABBEhCTA0KAgICA4AAPCyACIAMoAgQtABBxQQBHrUKAgICAEIQLC8cDAQd/IwBBIGsiBSQAAkACQAJAAkACQCABQv////9vWARAIAAQKQwBCyAAIAEgACgCKCkDkAEQWQ0CIAAgAUEBENkBIgINAQtCgICAgOAAIQEMAwsgAigCACIHKQIEpyICQf////8HcSIDDQELIABB0NIAEHIhAQwBCyAAIAVBCGogAyACQR92EKEDGiAHKAIEQf////8HcSEIQQAhAANAAkACQCAAIAhIBEAgAEEBaiECQX8hBgJAAn8CQAJAAkACQAJAAkACQCAHIAAQMCIDQaV/ag4DAwECAAsgAiEAAkAgA0F2ag4EBAsLBQALIANBL0cNByAERQ0FQQEhBEEvIQMMBwtB3AAhAyACIAhODQYgAEECaiEAIAcgAhAwIQYMCQtBACEEQd0AIQMMBQtB2wAhAyAEIAIgCE5yDQYgAEECaiACIAcgAhAwQd0ARiICGyEAQd0AQX8gAhshBkEBIQQMBwtB7gAMAgtB8gAMAQtBACEEQS8LIQZB3AAhAwsgAiEADAILIAVBCGoQOCEBDAMLIAIhAEEBIQQLIAVBCGogAxCSARogBkEASA0AIAVBCGogBhCSARoMAAsACyAFQSBqJAAgAQvYAgIDfwF+IwBBEGsiBCQAAkAgAUL/////b1gEQCAAEClCgICAgOAAIQUMAQtCgICAgOAAIQUgACAAIAFB7gAgAUEAEBMQLSICQQBIDQAgAgR/IARB5wA6AAggBEEJagUgBEEIagshAiAAIAAgAUGfzwAQxwIQLSIDQQBIDQAgAwRAIAJB6QA6AAAgAkEBaiECCyAAIAAgAUGqzwAQxwIQLSIDQQBIDQAgAwRAIAJB7QA6AAAgAkEBaiECCyAAIAAgAUG0zwAQxwIQLSIDQQBIDQAgAwRAIAJB8wA6AAAgAkEBaiECCyAAIAAgAUHvACABQQAQExAtIgNBAEgNACADBEAgAkH1ADoAACACQQFqIQILIAAgACABQcPPABDHAhAtIgNBAEgNACAAIARBCGogAwR/IAJB+QA6AAAgAkEBagUgAgsgBEEIamsQ/AEhBQsgBEEQaiQAIAULgQECAn8BfiMAQSBrIgMkAEKAgICA4AAhBQJAIAAgA0EIaiACEEMNAEEAIQAgAkEAIAJBAEobIQICQANAIAAgAkYNASAAQQJ0IQQgAEEBaiEAIANBCGogASAEaigCABC+AUUNAAsgA0EIahBFDAELIANBCGoQOCEFCyADQSBqJAAgBQujAQEGfyMAQRBrIgQkAEF/IQMCQCAAIAIQLCICEAwNACAAIAKnIgcoAgRB/////wdxIghBARBLQQJ0EC4iBUUEQCAAIAIQCyABQQA2AgAMAQsgBEEANgIMQQAhAwNAIAYgCE5FBEAgBSADQQJ0aiAHIARBDGoQ1wE2AgAgA0EBaiEDIAQoAgwhBgwBCwsgACACEAsgASAFNgIACyAEQRBqJAAgAwu2AgIDfwF+IwBBEGsiBCQAAkAgACABEF8iARAMDQAgACAEQQhqIAEQ1QchBiAAIAEQC0KAgICA4AAhASAGQQBIDQACQCACRQ0AIAMpAwAiBxARDQACQCAAIARBDGogBxCOAiICBEACQCACLQAAQc4ARw0AIAItAAFBxgBHDQAgAkEDQQIgAi0AAkHLAEYiAxtqLQAAIgVBvX9qQf8BcUEBSw0AIAQoAgwgAkEDaiACQQJqIAMbIAJrQQFqRg0CCyAAIAIQNyAAQdDOABBqCyAAIAQoAggQGQwCCyAAIAIQNyAFIANBAXRqQb1/aiEFCyAEQQRqIAQoAggiAyAGIAUgACgCEBDCCSECIAAgAxAZIAJBAEgNACAAIAQoAgQgAhDUByEBIAAgBCgCBBAZCyAEQRBqJAAgAQugAQEEfyAAQdQAaiEBIABB0ABqIQICQANAIAIgASgCACIBRwRAIAFBeGoiAygCAEEATA0CIAFBfGoiBCAELQAAQQ9xOgAAIAAgA0EHEJEEIAFBBGohAQwBCwsgAEHkAGohASAAQeAAaiECA0AgASgCACIBIAJGRQRAIAAgAUF4akEIEJEEIAFBBGohAQwBCwsPC0HWOUGhDUHnLEH3ORAAAAu6AQIDfwF+AkACQCACEF1FDQAgAhB5IQcgAacpAyAiCkKAgICAcINCgICAgJB/Ug0AIAcgCqciCCgCBEH/////B3FPDQACQEEEIAYQmANFDQBBASECIAZBgMAAcUUNAiADQoCAgIBwg0KAgICAkH9SDQAgA6ciCSkCBEL/////B4NCAVINACAIIAcQMCAJQQAQMEYNAgsgACAGQdkXEHYPCyAAIAEgAiADIAQgBSAGQYCACHIQdSECCyACCx0AAn8gAhBdBEBBACACEHkgARCLBEkNARoLQQELC6ABAQN/AkAgAxBdRQ0AIAKnKQMgIgJCgICAgHCDQoCAgICQf1INACADEHkiAyACpyIFKAIEIgZB/////wdxTw0AQQEhBCABRQ0AAn8gBkF/TARAIAUgA0EBdGovARAMAQsgAyAFai0AEAshAyABQQQ2AgAgACADQf//A3EQnAMhAiABQoCAgIAwNwMYIAFCgICAgDA3AxAgASACNwMICyAEC4QBAQZ/IABB4ABqIgQQbyAAQdAAaiEFIAAoAlQhAgJAA0AgBSACIgFHBEAgAUF8aiIDLQAAQRBPDQIgASgCBCECIAAgAUF4aiIGQQYQkQQgAyADLQAAQQ9xQRByOgAAIAYoAgANASABEEcgASAEEE0MAQsLDwtBnDlBoQ1BxCxBqTkQAAAL1gECBX8CfiABKQNIIQdBfyEFIAAgACkDMEENEFEiCBAMRQRAIAinIgIgB6ciAzYCICADIAMoAgBBAWo2AgAgAkIANwIkAkACQAJAIAMoAjwiBEUNACAAIARBAnQQayIERQ0BIAIgBDYCJEEAIQIDQCACIAMoAjxODQEgAygCJCACQQN0ai0AACIGQQFxBEAgACAGQQN2QQFxENcDIgZFDQMgBCACQQJ0aiAGNgIACyACQQFqIQIMAAsACyABIAg3A0hBACEFDAELIAghBwsgACAHEAsLIAULaAECfyABpygCECIDIAMoAhggAnFBf3NBAnRqKAIAIQAgAxAoIQMDQAJAIABFBEBBACEADAELIABBA3QgA2oiBEF4aiEAIARBfGooAgAgAkYNACAAKAIAQf///x9xIQAMAQsLIABBAEcLTwECfyMAQRBrIgMkAAJAIANBDGogASACEPUEIgFBAEgEQEF/IQEMAQsgAygCDCICQQF2QQAgAkEBcWtzIQQLIAAgBDYCACADQRBqJAAgAQvsAQEFfyACQQAgAkEAShshBQNAIAMgBUZFBEAgBCABIANBAXRqLwEAciEEIANBAWohAwwBCwsCQAJAIAAoAgggAmoiBiAAKAIMIgdKBEBBfyEDIAAgBiAEEM0CRQ0BDAILIARBgAJIDQAgACgCEA0AQX8hAyAAIAcQ3gMNAQsCQCAAKAIQRQRAQQAhAwNAIAMgBUYNAiAAKAIEIAAoAgggA2pqIAEgA0EBdGotAAA6ABAgA0EBaiEDDAALAAsgACgCBCAAKAIIQQF0akEQaiABIAJBAXQQJBoLIAAgACgCCCACajYCCEEAIQMLIAMLeAIBfwF+AkAgARBdDQBBACAAKAIQKAI4IAFBAnRqKAIAKQIEIgNCgICAgICAgIBAg0KAgICAgICAgIB/UiADQoCAgIDw////P4NQIANC//////////+/f1ZxGw0AIAOnQX9zQR92QQEgA0L/////B4NQGyECCyACC3gCAX8CfkKAgICA4AAhAyAAIAFB6gAgAUEAEBMiBBAMRQRAIABBMBChASIDEAwEQCAAIAQQCyADDwsgAEEQEGsiAkUEQCAAIAMQCyAAIAQQC0KAgICA4AAPCyABEA4hASACIAQ3AwggAiABNwMAIAMgAhCIAQsgAwvvAQICfwJ+AkACQCACKQIEIgWnQf////8HcSABKQIEIganQf////8HcWoiA0GAgICABE8EQCAAQfQNQQAQQgwBCyAAIAMgBSAGhKdBH3YiBBD6ASIADQELQoCAgIDgAA8LAkAgBEUEQCAAQRBqIAFBEGogASgCBEH/////B3EQJCIEIAEoAgRB/////wdxaiACQRBqIAIoAgRB/////wdxECQaIAMgBGpBADoAAAwBCyAAQRBqIgMgASABKAIEQf////8HcRD2BCADIAEoAgRBAXRqIAIgAigCBEH/////B3EQ9gQLIACtQoCAgICQf4QL4AICAX8CfiMAQSBrIgUkAAJAAkAgACABQSUQaSICRQ0AAkAgAikDACIBEBFFBEACQAJAIAGnIgMvAQZBa2pB//8DcUEITQRAIAMQmAFFDQEgABBxDAULIAAgBUEcaiABENgBDQQgBSgCHCEGDAELIAUgAygCKCIGNgIcCyACKAIMIgMgBkkNASAAIAIpAwAQCyACQoCAgIAwNwMACyAEQQE2AgBCgICAgDAhAQwCCyACIANBAWo2AgwgBEEANgIAIAIoAghFBEAgA0EATgRAIAOtIQEMAwsgA7gQFiEBDAILQoCAgIDgACEBIAAgAikDACADEHgiBxAMDQEgAigCCEEBRgRAIAchAQwCCyADQQBOBH4gA60FIAO4EBYLIQggBSAHNwMIIAUgCDcDACAAQQIgBRCHAyEBIAAgBxALIAAgCBALDAELIARBADYCAEKAgICA4AAhAQsgBUEgaiQAIAEL8QQCBn8CfiMAQRBrIgMkACABQiCIpyIEQQFqIgJBBE1BAEEBIAJ0QRlxG0UEQCAAIAEQ+QQhAQsCQAJAAkAgAEEYEC4iAkUNACAAQoCAgIAgQREQUSIIEAwEQCAAIAIQGQwBCyACQQA2AhAgAiABNwMAIAJBADYCCCAIpyACNgIgIARBfnFBAkYNAiABEA4iCSEBAkADQAJAAkAgACABEJcCIgEQJ0UEQCABEAwNBCAAIANBDGogA0EIaiABp0EREI4BDQIgACADKAIMIAMoAggiBBBiIARFDQEgACABEAsgCRAOIQEDQCAAIANBDGogA0EIaiABp0EhEI4BRQRAQQAhAiADKAIMIQQgAygCCCEFA0AgAiAFRkUEQCAAIAggBCACQQN0aiIGKAIEQoCAgIAgIAYoAgBBAEdBAnQQGhogAkEBaiECDAELCyAAIAQgBRBiIAAgARCXAiIBECcNCSABEAwNBiAAEH5FDQELCyAAIAEQCwwECwJAIAmnIgQtAAVBCHFFDQAgBCgCECIHECghBSAHKAIgIgdBACAHQQBKGyEHA0AgBiAHRwRAIAUtAANBEHENAiAFQQhqIQUgBkEBaiEGDAELCyACQQE2AgggAiAEKAIoNgIMDAcLIAAgA0EMaiADQQhqIARBERCOAQ0DIAMoAgwhBCADKAIIIQVBACECA0AgAiAFRkUEQCAAIAggBCACQQN0aigCBEKAgICAIEEAEJUCGiACQQFqIQIMAQsLIAAgBCAFEGIMBgsgABB+RQ0BCwsgACABEAsLIAAgCBALDAELIAAgARALC0KAgICA4AAhCAsgA0EQaiQAIAgL4QECA38CfiMAQRBrIgEkACACKQMYIQYCQAJAIAIpAxAiBxCbAUUEQCAAQcjIAEEAEBUMAQsgACAHELgBIgNFBEBBACEDDAELIAAgBhC4ASIERQ0AIAAgAyAEEKoIIQUgACAEEDcgBUUNACABIAAgBRD9AiIGNwMAIAYQDA0AIAAgACACKQMAQoCAgIAwQQEgARAjEAsgACABKQMAEAsMAQsgASAAEI8BNwMIIAAgACACKQMIQoCAgIAwQQEgAUEIahAjEAsgACABKQMIEAsLIAAgAxA3IAFBEGokAEKAgICAMAtpAQJ/IwBBEGsiByQAAn8CQCABpyIILQAFQQhxRQ0AIAAgB0EMaiACELMBRQ0AIAcoAgwgCCgCKE8NAEF/IAAgCBCXAw0BGgsgACABIAIgAyAEIAUgBkGAgAhyEHULIQAgB0EQaiQAIAAL2gIBBH8jAEGQA2siBiQAAkAgBUUEQEERIQFBASEIA0AgCCABTwRAQQAhBQwDCyAAIAEgCGpBAXYiBSACIAMgBEEAIAZBkAJqELYCIAZBkAJqENsFIABhBEAgBUEARyEHA0AgBUECSARAIAchAQwDCyAFIgFBf2oiCSEFIAQgCWotAABBMEYNAAsMAQUgBUEBaiEIDAELAAsAC0EAIQUgACABQQFqIgcgBkEMaiAGQQhqIAZBkAFqQQAgBkGQAmoQtgIgBkGQAWogAWotAABBNUcNACAAIAcgBkEMaiAGQQhqIAZBkAFqQYAIIAZBkAJqELYCIAAgByAGQQRqIAYgBkEQakGAECAGQZACahC2AiAGQZABaiAGQRBqIAcQdA0AIAYoAgwgBigCBEcNAEGACEGAECAGKAIIGyEFCyAAIAEgAiADIAQgBSAGQZACahC2AiAGQZADaiQAIAELhQEBBH8jAEGAAmsiAyQAAkAgA0GAAWogASACQQFqIgVBABD7AiADai0Af0E1Rw0AIANBgAFqIAEgBUGACBD7AiIGIAMgASAFQYAQEPsCRw0AIANBgAFqIAMgBhB0DQBBgAhBgBAgAy0AgAFBLUYbIQQLIAAgASACIAQQ+wIaIANBgAJqJAALdgIBfwN+IABBf2oiAEEAOgAAIAEgAUI/hyIFfCAFhSEEIAKtIQYDQCAAIgJBf2oiAEEwQdcAIAQgBCAGgCIFIAZ+faciA0EKSBsgA2o6AAAgBCAGWiEDIAUhBCADDQALIAFCf1cEQCACQX5qIgBBLToAAAsgAAvXAQMCfwN+AXwgAUEKRkEAIAIbRQRAIABBAWogACAALQAAIgRBLUYbIQIDQCACIgBBAWohAiAALQAAIgNBMEYNAAsCfiABQQpGBEBCCiEGQpiz5syZs+bMGQwBC0EAIAFrrCABrCIGgAshB0EAIQIDQAJAIANFDQAgAxDxASIDIAFODQAgBSADrCAFIAZ+fCAFIAdWIgMbIQUgAiADaiECIAAtAAEhAyAAQQFqIQAMAQsLIAG3IAK3EOkFIAW6IgiiIAggAhsiCJogCCAEQS1GGw8LIAAQ2wULUQEBf0F/IQQgACABQQggAUEEaiABKAIIQQFqEHwEf0F/BSABIAEoAggiBEEBajYCCCABKAIAIARBA3RqIgEgAjYCACABIAAgAxAYNgIEQQALC1QBA38gACgCCCIEQQAgBEEAShshBANAAkAgAyAERgRAQX8hAwwBCyABIAAoAgAgA0EDdGoiBSgCAEYEQCAFKAIEIAJGDQELIANBAWohAwwBCwsgAwtfAQF/IwBBEGsiBSQAAn9BfyAAIAEoAgAgBCADKAIAQQNsQQJtEEsiACACbCAFQQxqELQBIgRFDQAaIAMgBSgCDCACbiAAajYCACABIAQ2AgBBAAshASAFQRBqJAAgAQtHAQJ/IAAoAhQiA0EAIANBAEobIQMDQAJAIAIgA0YEQEF/IQIMAQsgACgCDCACQQxsaigCACABRg0AIAJBAWohAgwBCwsgAgtGAQJ+IAIgACgCABAyIQNBACEAIAIgASgCABAyIQQCQCADEAwNACAEEAwNACADpyAEpxCTAiEACyACIAMQCyACIAQQCyAAC64EAgl/AX4jAEEgayICJAACQCAAQQsQoQEiCxAMDQAgAkIANwMYIAJCADcDECACQgA3AwggACACQQhqIAFBABCFBSEEIAAgAigCCBAZAkAgBARAIAIoAhQhBgwBCyALpyEHIAIoAhwiCEEAIAhBAEobIQkgAigCFCEGQQAhBAJAA0AgBCAJRwRAAkACQCAGIARBDGxqIgMoAggiBQRAIAIgATYCAAwBCwJAAkAgACACIAJBBGogASADKAIAEN0DIgUOBAEGBgAGCyADQQA2AgQMAgsgAigCBCEFCyAFKAIMQf0ARgRAIANBAjYCBCADIAIoAgAoAhAgBSgCAEEDdGooAgQ2AggMAQsgA0EBNgIEIAUoAgQiCgRAIAMgCjYCCAwBCyADIAIoAgAoAkgoAiQgBSgCAEECdGooAgA2AggLIARBAWohBAwBCwsgBiAIQQxBLyAAEN0CQQAhBANAIAQgCUcEQAJAAkACQCAGIARBDGxqIgEoAgRBf2oOAgABAgsgASgCCCEDIAAgByABKAIAQSYQfyIBRQ0FIAMgAygCAEEBajYCACABIAM2AgAMAQsgACALIAEoAgBBASABKAIIQQYQigNBAEgNBAsgBEEBaiEEDAELCyAAIAYQGSAAIAtByQEgAEH+ABAyQQAQGhogByAHLQAFQf4BcToABQwCCyAAIAUgASADKAIAENwDCyAAIAYQGSAAIAsQC0KAgICA4AAhCwsgAkEgaiQAIAsLawEBfgJAAkACQAJAAkAgAy0ABSIBDgQDAgIAAQsgACADKAIIEOEEDwsgAUEIRg0CCxABAAsgACADKAIMIAMoAgAgAy0ACCADLQAJIAMuAQYQygEPCyAAIAAQPSIEIAMoAgggAygCDBAlIAQLCQAgACADEP0CCzwBAX4gABA9IgQQDEUEQCAAIARBPCABrUKAgICAcIQQDkEDEBpBf0oEQCAEDwsgACAEEAsLQoCAgIDgAAtMAQN/IABBkM4ANgLYAQJAIAAoAhAiAigCkAEiA0UNACACIAIoApQBIAMRAQBFDQAgAEGfPEEAEEIgACgCECkDgAEQ2AhBfyEBCyABC3ABAn8DQCADIAEoAiBORQRAAkAgASgCHCADQRRsaiIEKAIIDQAgBCgCBCIERQ0AIAAgBCACEQMACyADQQFqIQMMAQsLIAAgASkDQCACECIgACABKQNIIAIQIiAAIAEpA2AgAhAiIAAgASkDaCACECILsgIBAn8gAUHkAWohAyABQeABaiEEA0AgAygCACIDIARGRQRAIAAgA0F4aiACEPUHIANBBGohAwwBCwsgACABKQPAASACECIgACABKQPIASACECIgACABKQOwASACECIgACABKQO4ASACECIgACABKQOoASACECJBACEDA0AgA0EIRgRAQQAhAwNAIAMgACgCQE5FBEAgACABKAIoIANBA3RqKQMAIAIQIiADQQFqIQMMAQsLIAAgASkDmAEgAhAiIAAgASkDoAEgAhAiIAAgASkDUCACECIgACABKQNAIAIQIiAAIAEpA0ggAhAiIAAgASkDOCACECIgACABKQMwIAIQIiABKAIkIgEEQCAAIAEgAhEDAAsFIAAgASADQQN0aikDWCACECIgA0EBaiEDDAELCwucAQECfyABIgJBGGohAQJAAkADQCABKAIAIgEEQCABKAIIKAIARQ0CIAEoAgQNAyABQRhqEEcgAUEQahBHIAFBDGohAQwBCwsgAigCGCEBA0AgAQRAIAEoAgwhAyAAIAEpAygQJiAAIAEQICADIQEMAQsLIAJBADYCGA8LQeswQaENQdXlAkH2MBAAAAtBhTFBoQ1B1uUCQfYwEAAAC+MBAQN/IAEgAS0ABUECcjoABSABKAIQIgQQKCEDA0AgAiAEKAIgTkUEQCAAIAEoAhQgAkEDdGogAygCAEEadhCzBSACQQFqIQIgA0EIaiEDDAELCyAAIAEoAhQQICAAIAQQnAIgAUIANwMQIAEoAhgEQCAAIAEQ9wcLIAAoAkQgAS8BBkEYbGooAggiAgRAIAAgAa1CgICAgHCEIAIRDQALIAFCADcDICABQQA7AQYgAUEANgIoIAEQnQICQCAALQBoQQJHDQAgASgCAEUNACABQQhqIABB2ABqEE0PCyAAIAEQIAubAgEBfyAAIAEoAhQgASgCGEEBEIYFAkAgASgCIEUNAANAIAIgAS8BKiABLwEoak8NASAAIAEoAiAgAkEEdGooAgAQ8gEgAkEBaiECDAALAAtBACECA0AgAiABKAI4TgRAQQAhAgNAIAIgASgCPE5FBEAgACABKAIkIAJBA3RqKAIEEPIBIAJBAWohAgwBCwsgASgCMCICBEAgAhCkAwsgACABKAIcEPIBIAEtABJBBHEEQCAAIAEoAkAQ8gEgACABKAJQECAgACABKAJUECALIAEQnQICQCAALQBoQQJHDQAgASgCAEUNACABQQhqIABB2ABqEE0PCyAAIAEQIAUgACABKAI0IAJBA3RqKQMAECYgAkEBaiECDAELCwuoAQEHfyAAQQEgAXQiBkECdBCbAiIFBEAgACgCzAEiBEEAIARBAEobIQcDQCADIAdGRQRAIAAoAtQBIANBAnRqKAIAIQIDQCACBEAgAigCKCEEIAIgBSACKAIUIAEQzAJBAnRqIggoAgA2AiggCCACNgIAIAQhAgwBCwsgA0EBaiEDDAELCyAAIAAoAtQBECAgACAFNgLUASAAIAY2AswBIAAgATYCyAELC4UBAQJ/IAEoAgBFBEAgAS0AEARAIAAgARCCBAsgASgCLCICBEAgACACrUKAgICAcIQQJgtBACECIAEQKCEDA0AgAiABKAIgT0UEQCAAIAMoAgQQ8gEgAkEBaiECIANBCGohAwwBCwsgARCdAiAAIAEQuQIQIA8LQfAvQaENQcMiQYowEAAAC0QBAn8gAkEAIAJBAEobIQQDQCADIARGBEBBAA8LIANBAXQhAiADQQFqIQMgACACai8BACABIAJqLwEAayICRQ0ACyACCy8BAX8DQCABIANGRQRAIAAgA0EBdGovAQAgAkGHAmxqIQIgA0EBaiEDDAELCyACC2MAAkACfwJAIAFFBEAgAg0BDAMLIAJFBEAgACAAKAIAQX9qNgIAIAAgACgCBEF4ajYCBCABEP4BDAMLQQAgACgCBCACaiAAKAIISw0BGiABIAIQ1wUPCyAAIAIQiAULDwtBAAsmACABBEAgACAAKAIAQX9qNgIAIAAgACgCBEF4ajYCBCABEP4BCwsoAQF/AkAgAacoAiAiA0UNACADKAIAQQRGDQAgACADQQhqIAIQ4AMLCxwBAX8gAUEoEEEiAgRAIAAgAhDoAyAAIAIQIAsLJQEBfyABpygCICIDBEAgACADKQMAIAIQIiAAIAMpAwggAhAiCwsnAQF/IAGnKAIgIgIEQCAAIAIpAwAQJiAAIAIpAwgQJiAAIAIQIAsLHgEBfyABpygCICICBEAgACACKQMAECYgACACECALC0MBAn8gAacoAiAiAgRAAkAgAikDACIBEMIFRQ0AIAIoAgwiA0UNACAAIAMQ4gMgAikDACEBCyAAIAEQJiAAIAIQIAsLWAEDfwJAIAGnKAIgIgRFDQAgBEEIaiEDIARBBGohBQNAIAMoAgAiAyAFRg0BIAQoAgBFBEAgACADKQMQIAIQIgsgACADKQMYIAIQIiADQQRqIQMMAAsACwuBAQEFfyABpygCICIDBEAgA0EEaiEFIAMoAgghAgNAIAIgBUcEQCACKAIEIQYgAkFwaiEEIAJBdGooAgBFBEACQCADKAIABEAgBBCJBQwBCyAAIAIpAxAQJgsgACACKQMYECYLIAAgBBAgIAYhAgwBCwsgACADKAIQECAgACADECALCyEBAX8gAacoAiAiAwRAIAAgAzUCDEKAgICAcIQgAhAiCwtAAQF/IAGnKAIgIgIEQCAAIAI1AgxCgICAgHCEIgEQwgUEfiACEEcgAjUCDEKAgICAcIQFIAELECYgACACECALC1sBAn8gAacoAiAiAgRAAkACQCACLQAFRQ0AIAAoArwBIgNFDQAgACgCxAEgAigCCCADEQMADAELIAIoAhgiA0UNACAAIAIoAhQgAigCCCADEQUACyAAIAIQIAsLKQEBfyAAIAGnIgI1AiRCgICAgJB/hBAmIAAgAjUCIEKAgICAkH+EECYLEQAgACABpygCICkDACACECILGQEBfyAAIAGnKAIgIgIpAwAQJiAAIAIQIAtBAQN/AkAgAUEPEEEiBEUNACAEQQhqIQUDQCADIAQtAAVPDQEgACAFIANBA3RqKQMAIAIQIiADQQFqIQMMAAsACwtDAQN/IAFBDxBBIgMEQCADQQhqIQQDQCACIAMtAAVPRQRAIAAgBCACQQN0aikDABAmIAJBAWohAgwBCwsgACADECALC0kBAn8gACABpygCICIEKQMAIAIQIiAAIAQpAwggAhAiA0AgAyAEKAIQTkUEQCAAIAQgA0EDdGopAxggAhAiIANBAWohAwwBCwsLSQECfyAAIAGnKAIgIgIpAwAQJiAAIAIpAwgQJgNAIAMgAigCEE5FBEAgACACIANBA3RqKQMYECYgA0EBaiEDDAELCyAAIAIQIAuOAQEEfyABpyIDKAIkIQUgAygCICEEIAMoAigiAwRAIAAgA61CgICAgHCEIAIQIgsgBARAAkAgBUUNAEEAIQMDQCADIAQoAjxODQECQCAFIANBAnRqKAIAIgZFDQAgBi0ABUEBcUUNACAAIAYgAhEDAAsgA0EBaiEDDAALAAsgACAErUKAgICAYIQgAhAiCwtzAQN/IAGnIgIoAigiAwRAIAAgA61CgICAgHCEECYLIAIoAiAiAwRAIAIoAiQiBARAQQAhAgNAIAIgAygCPE5FBEAgACAEIAJBAnRqKAIAEPcBIAJBAWohAgwBCwsgACAEECALIAAgA61CgICAgGCEECYLCxIAIAGnKAIgIgAEQCAAEKQDCwsOACAAIAGnKQMgIAIQIgsZACAAIAGnIgApAyAQJiAAQoCAgIAwNwMgCzUBAn8gAachBANAIAMgBCgCKE9FBEAgACAEKAIkIANBA3RqKQMAIAIQIiADQQFqIQMMAQsLCzwBAn8gAachAwNAIAIgAygCKE9FBEAgACADKAIkIAJBA3RqKQMAECYgAkEBaiECDAELCyAAIAMoAiQQIAuoAgICfwJ+IwBBEGsiBCQAQoCAgIDgACEGIAAgASADEG0iBxAMRQRAQoCAgIAwIQECfgJAIAAgAkHDASACQQAQEyIGEAwNAAJAAkAgBhARDQAgBhAnDQAgACAEQQRqIAIgBhDiCSEBIAAgBhALIAEQDA0CIAQgBDUCBCIGNwMIDAELIAAgBEEIaiACEEANASACEA4hASAEKQMIIQYLIABCgICAgDAgBiADQZkeajEAAIYQgQMiAhAMDQAgACAHIAJCACAGEOQDDQBBACEDA0AgByAGIAOtVw0CGiAAIAEgAxB4IgIQDA0BIAAgByADIAIQlAIhBSADQQFqIQMgBUF/Sg0ACwsgACABEAsgByEBQoCAgIDgAAshBiAAIAEQCwsgBEEQaiQAIAYLqAICBX8DfgJAIAAgASADEG0iARAMDQACQAJAIAKnIgQQmAENACAEKAIoIQZCgICAgDAhCiAEKAIgIgcoAgwiBSgCICIILQAFRQRAIAAgBa1CgICAgHCEQoCAgIAwEO8BIgoQDA0CCyAAIAogBq0iCyADQZkeajEAAIYQgQMhCSAAIAoQCyAJEAwNASAEEJgBBEAgACAJEAsMAQsgCUETEEEhBSAAIAEgCUIAIAsQ5AMNASADIAQvAQZHBEBBACEDA0AgAyAGRg0EIAAgAiADEHgiCRAMDQMgACABIAMgCRCUAiEEIANBAWohAyAEQX9KDQALDAILIAUoAgggCCgCCCAHKAIQaiAFKAIAECQaIAEPCyAAEHELIAAgARALQoCAgIDgACEBCyABCzcBAX8CQCABQoCAgIBwWgRAIAGnIgIvAQZBbWpB//8DcUECSQ0BCyAAQRMQkwNBAA8LIAIoAiALCAAgACACECAL6QEBBH8gACgCECEFAkAgACABIAMQbSIBEAxFBEAgAkKAgICACFoEQCAAQaDQARBqDAILIABBHBAuIgRFBEBBACEEDAILIAQgAqciBjYCAAJAAkAgA0EURw0AIAUoArgBIgdFDQAgBCAFKALEASAGQQEQSyAHEQEAIgU2AgggBUUNAyAFQQAgBhBMGgwBCyAEIAAgBkEBEEsQayIGNgIIIAZFDQILIARBDGoQbyAEQS42AhggBEEANgIUIAQgA0EURjoABSAEQQA6AAQgASAEEIgBCyABDwsgACABEAsgACAEEBlCgICAgOAAC7wBAgJ/BH4jAEEQayICJABCgICAgDAhBAJAAkAgACABQQAQ8wEiARAMBEBCgICAgDAhBQwBCyAAIAFB6gAgAUEAEBMiBRAMDQAgABBPIgQQDA0AA0AgACABIAUgAkEMahCsASIHEAxFBEAgAigCDA0DIAAgBCAGIAcQbiEDIAZCAXwhBiADQQBODQELCyAAIAFBARCwARoLIAAgBBALQoCAgIDgACEECyAAIAUQCyAAIAEQCyACQRBqJAAgBAuvAQEDfyAAKAJAIQFBfyEDAkAgABAQDQAgABDbBA0AQQEhAiABIAEoAiRBAk8EfyABLQBuQX9zQQFxBUEBCzYCKCAAKAJERQRAIAEgACgCACABQdEAEFciAjYCpAEgAkEASA0BCwNAIAAoAhBBqn9HBEAgABDaBEUNAQwCCwsCQCAAKAJERQRAIABB2AAQDSAAIAEvAaQBEBcgAEEoEA0MAQsgAEEpEA0LQQAhAwsgAwuyBQEFfyACKAI8IQQgAi8BKiEFIAIvASghBiABQQA2AsACIAFBADYCyAIgASAEIAUgBmpqIgQ2AsQCAkAgBEUNACABIAAgBEEDdBAuIgQ2AsgCIARFBEBBfyEHDAELA0AgA0EATgRAIAIoAiAgAyACLwEoakEEdGoiBCgCBEEBTgRAIAEgASgCwAIiBUEBajYCwAIgACABKALIAiAFQQN0aiAEIAMQzQMLIAQoAgghAwwBCwtBACEEAkAgA0F+RgRAA0AgBCACLwEqTw0CAkAgAigCICAEIAIvAShqQQR0aiIDKAIEDQAgAxDcBEUNACABIAEoAsACIgVBAWo2AsACIAAgASgCyAIgBUEDdGogAyAEEM0DCyAEQQFqIQQMAAsACwNAIAQgAi8BKE8EQEEAIQQDQCAEIAIvASpPDQMCQCACKAIgIAQgAi8BKGpBBHRqIgMoAgQNACADKAIAQdEARg0AIAEgASgCwAIiBUEBajYCwAIgACABKALIAiAFQQN0aiADIAQQzQMLIARBAWohBAwACwAFIAEgASgCwAIiA0EBajYCwAIgAigCICEFIAEoAsgCIANBA3RqIgMgBDsBAiADQQM6AAAgAyAAIAUgBEEEdGooAgAQGDYCBCAEQQFqIQQMAQsACwALQQAhAwNAIAMgAigCPE4NASACKAIkIQUgASABKALAAiIEQQFqNgLAAiABKALIAiAEQQN0aiIEIAQtAAAiBkH+AXE6AAAgBCAFIANBA3RqIgUtAABBAnEgBkH8AXFyIgY6AAAgBCAGQfoBcSAFLQAAQQRxciIGOgAAIAQgBkH2AXEgBS0AAEEIcXIiBjoAACAFLQAAIQggBCADOwECIAQgBkEOcSAIQfABcXI6AAAgBCAAIAUoAgQQGDYCBCADQQFqIQMMAAsACyAHC74BAQN/IwBBEGsiAiQAIAIgACgCOCIBNgIMAkAgAS0AAEEjRw0AIAEtAAFBIUcNACACIAFBAmoiATYCDANAAkACQAJAIAEgACgCPE8NAAJAIAEtAAAiA0F2ag4EAQAAAQALIANBGHRBGHVBf0oNAiABQQYgAkEMahBlIgNBfnFBqMAARw0BIAIoAgwhAQsgACABNgI4DAMLIAIoAgwhASADQX9HDQELIAIgAUEBaiIBNgIMDAALAAsgAkEQaiQAC7cBAgF/An4jAEEgayIDJAAgAUEDRgRAIAIpAxAhBCACKQMIIQUCQCAAIANBEGogAikDABCQBUEASARAQoCAgIDgACEEDAELIAAgBCAFQQIgA0EQahAjIgQQDARAIAMgABCPATcDCCAAIAMpAxhCgICAgDBBASADQQhqECMhBCAAIAMpAwgQCwsgACADKQMQEAsgACADKQMYEAsLIANBIGokACAEDwtB9uMAQaENQbvqAkGA5AAQAAALPwIBfwF+IwBBEGsiASQAIAFCgICAgDA3AwggAUKAgICAMDcDACAAQSxBAkEAQQIgARDiASECIAFBEGokACACC9oBAgJ/A34jAEEgayIFJABCgICAgOAAIQcCQCAAIAVBGGogAUHeABCFASIGRQ0AIAYpAwAiARCyAUUEQCAAQcnMAEEAEBUMAQsgBSkDGCIIEBEEQCAAIAEgAiADIAQQiQMhBwwBCwJAIAAgAyAEEIcDIgkQDA0AIAYpAwAhASAFIAI3AxAgBSAJNwMIIAUgATcDACAAIAggBikDCEEDIAUQIyIBEAwgAUL/////b1ZyRQRAIAAgARALIAAQKQwBCyABIQcLIAAgCBALIAAgCRALCyAFQSBqJAAgBwvrAQEFfyMAQZABayIDJAAgASgCACEFIANBgAE2AgggAyADQRBqNgIMIANBEGohBgJ/A0AgAygCCEF6aiEHAkADQCAEIAZqIAI6AAAgBEEBaiEEIAUsAAAiAkEASA0BIAJB/wFxIgJBA3ZBHHFB4N8BaigCACACdkEBcUUNASAFQQFqIQUgBCAHSQ0AC0EAIAAoAgAgA0EMaiADQQhqIANBEGoQ7wQNAhogAygCDCEGDAELCyAAKAIAIAYgBBCjAwshBCADKAIMIgIgA0EQakcEQCAAKAIAIAIQGQsgASAFNgIAIANBkAFqJAAgBAt7AgF/AX4jAEHQAGsiBCQAIAAgBCABIAIgAxCYBSAEQQA2AkxCgICAgDAhBQJAAkAgBBCuAQ0AIAQQ8wMiBRAMDQAgBCgCEEGqf0YNASAEQcAaQQAQFAsgACAFEAsgBCAEQRBqEI0CQoCAgIDgACEFCyAEQdAAaiQAIAULnAQCA38CfiMAQeAAayIEJAAgAy0ABCEFQoCAgIAwIQcCQAJAAkACQAJAAkACQAJAAkACQCADLQAFDgoBAgIFBwMECAUABgsgACADKAIIEJkFIQYCfgJAAkACQCADKAIMQQFqDgMCAAEJCyAAIAApA8ABIgcgBiAHQQAQEwwCCyAAIAAoAigpAxAiByAGIAdBABATDAELIAAgASAGIAFBABATCyEHIAAgBhASIAJBwgFGBEBBASEFDAgLIAJBywFHDQdBACEFDAcLAkAgAkHCAUYEQEEBIQUMAQsgAkHLAUcNAEEAIQULIAAgASACQQIgAyAFEIoDGgwHC0KAgICAMCEIIAAgASACIAMoAggEfiAEIAMoAgA2AhAgBEEgakHAAEGFzgAgBEEQahBVGiAAIAMoAgggBEEgakEAQQpBCCADLQAFQQJGGyADLgEGEMoBBUKAgICAMAsgAygCDAR+IAQgAygCADYCACAEQSBqQcAAQYzOACAEEFUaIAAgAygCDCAEQSBqQQFBC0EJIAMtAAVBAkYbIAMuAQYQygEFQoCAgIAwCyAFENwIDAYLIAMpAwgiB0KAgICACHxC/////w9YBEAgB0L/////D4MhBwwFCyAHuRAWIQcMBAsgAysDCBAWIQcMAwsgACABIAJBAiADIAUQigMaDAMLEAEACyADNQIIIQcLIAAgASACIAcgBRAaGgsgBEHgAGokAAtDAQF/IAAgARCUBCIBRQRAQQAPCwJAIAAgAhCUBCICRQRADAELIAAgASACEKEFIQMgACABEDcgAiEBCyAAIAEQNyADC/gBAQF/IAItAABBLkcEQCAAIAIgAhBEEJ0DDwsgARDtBSEDIAAgAhBEIAMgAWtBACADGyIDakECahAuIgAEfyADIAAgASADECQiAGpBADoAAAJAA0ACQCACLQAAQS5HDQBBAiEBAkACQCACLQABQVJqDgIAAQILIAItAAJBL0cNASAALQAARQ0DIAAQ7QUiAUEBaiAAIAEbIgFBvM0AEKQERQ0BIAFBvs0AEKQERQ0BIAFBf2ogASABIABLG0EAOgAAQQMhAQsgASACaiECDAELCyAALQAARQ0AIAAQRCAAakEvOwAACyAAEEQgAGogAhDsBSAABUEACwtbAgF/AX4CQCAAIAEgAhChBSIBRQ0AIAAgARD4A0F/TARAIABBARCYBEEADwsgACABrUKAgICAUIQQDiAAKQPAAUEAQQAQnwUiBBAMDQAgACAEEAsgASEDCyADCzYBAX4CfiABKQNoIgIQEQRAQoCAgIDgACAAQoCAgIAgEFIiAhAMDQEaIAEgAjcDaAsgAhAOCwvPAQEBfyMAQdAAayIGJAACQCACIAQQowUEQAJAIAEEQCAGIAAgBkEQaiAEEJUBNgIAIAFBhM0AIAYQFAwBCyAAIARBhM0AEIsDC0EAIQEMAQtBACEBIAAgAkEcakEUIAJBJGogAigCIEEBahB8DQAgAiACKAIgIgFBAWo2AiAgAigCHCABQRRsaiIBQgA3AgAgAUEQakEANgIAIAFBCGpCADcCACABIAAgAxAYNgIMIAAgBBAYIQAgASAFNgIIIAEgADYCEAsgBkHQAGokACABC2MBAX8gAEHwABBrIgJFBEAgACABEBJBAA8LIAJCgICAgDA3A2ggAkKAgICAMDcDYCACQoCAgIAwNwNIIAJCgICAgDA3A0AgAiABNgIEIAJBATYCACACQQhqIABB4AFqEE0gAguEBQEEfyAAKAIAIQMCQAJAAn8DQCADIgJBAWohAwJAIAItAAAiBEF3aiIFQRdLDQBBASAFdCIFQY2AgARxDQEgBUEScUUNACABRQ0BDAMLAkAgBEEvRwRAQT0hASAEQT1HDQFBpH8gAy0AAEE+Rg0DGgwFCyADLQAAIgJBKkcEQCACQS9HBEBBLyEBDAYLQS8hAiABDQQDQAJAAkAgAkH/AXEiAkF2ag4EBQEBBQALIAJFDQQLIAMtAAEhAiADQQFqIQMMAAsACwNAIAMiAkEBaiEDAkACQAJAIAItAAEiBEF2ag4EAQMDAQALIARBKkYNASAERQ0EDAILIAENBQwBCyACLQACQS9HDQALIAJBA2ohAwwBCwsgBCIBEL0CRQ0CAkACQAJAAkACQCABQZt/ag4FAQIEBAADCyADLQAAIgFB7gBGBH8gAi0AAhC/AUUEQEG3fw8LIAMtAAAFIAELQf8BcUHtAEcNAyACLQACQfAARw0DIAItAANB7wBHDQMgAi0ABEHyAEcNAyACLQAFQfQARw0DIAItAAYQvwENAyAAIAJBBmo2AgBBTQ8LIAMtAABB+ABHDQIgAi0AAkHwAEcNAiACLQADQe8ARw0CIAItAARB8gBHDQIgAi0ABUH0AEcNAiACLQAGEL8BDQIgACACQQZqNgIAQUsPCyADLQAAQfUARw0BIAItAAJB7gBHDQEgAi0AA0HjAEcNASACLQAEQfQARw0BIAItAAVB6QBHDQEgAi0ABkHvAEcNASACLQAHQe4ARw0BIAItAAgQvwENAUFFDwsgAUHvAEcNACADLQAAQeYARw0AIAItAAIQvwENAEFZDwtBg38LDwtBCg8LIAEL5wEBCH8jAEEQayIDJABBfyEEAkAgAC0AEkEEcUUNACAAKAJQIgJFDQAgAiAAKAJMaiEGIAAoAkQhBwNAIAchBCACIAZPDQEgAkEBaiEFAn8gAi0AACICRQRAAkAgA0EIaiAFIAYQ9QQiAkEASA0AIAMoAgghCSADQQxqIAIgBWoiAiAGEN4HIgVBAEgNACADKAIMIARqIQcgAiAFagwCCyAAKAJEIQQMAwsgBCACQX9qIgIgAkH/AXFBBW4iCUEFbGtB/wFxakF/aiEHIAULIQIgCCAJaiIIIAFNDQALCyADQRBqJAAgBAuhAQEGfwJAIAFCgICAgHBUDQAgAaciBCgCECIDIAMoAhhBf3NBAnRBpH5yaigCACECIAMQKCEDA0AgAkUNASADIAJBf2oiBUEDdGoiBigCACECIAYoAgRBNkcEQCACQf///x9xIQIMAQsLIAJB/////wNLDQAgBCgCFCAFQQN0aikDACIBQoCAgIBwg0KAgICAkH9SDQAgACABELgBIQcLIAcLhQEBA38CQAJAIABCgICAgHBUDQAgAKciAS8BBkEDRw0AIAEoAhAiAiACKAIYQX9zQQJ0Qah+cmooAgAhASACECghAgNAIAFFBEBBACEBDAMLIAFBA3QgAmoiA0F4aiEBIANBfGooAgBBNUYNAiABKAIAQf///x9xIQEMAAsAC0EADwsgAUULQAECf0F/IQQgACABQc0BIAFBABATIgEQDAR/QX8FIAEQIQRAIAAgACABIAIgAUEAEBMQLSEDCyAAIAEQCyADCwtsAgN/An4gAUFwaiIEKQMAIQVBfyECAkAgACABQXhqKQMAIgYQOiIBRQ0AIAAgBSABQYCAAhDaASEDIAAgARASIANBAEgNACAAIAUQCyAAIAYQCyAEIANBAEetQoCAgIAQhDcDAEEAIQILIAILTAIBfwJ+IAAgAUFwaiICKQMAIgMgAUF4aikDACIEEL8FIgFBAEgEQCABDwsgACADEAsgACAEEAsgAiABQQBHrUKAgICAEIQ3AwBBAAt+AgN/An4gAUF4aikDACIFQv////9vWARAIABBtMwAQQAQFUF/DwtBfyECAkAgACABQXBqIgQpAwAiBhA6IgFFDQAgACAFIAEQdyEDIAAgARASIANBAEgNACAAIAYQCyAAIAUQCyAEIANBAEetQoCAgIAQhDcDAEEAIQILIAILmgECAn8BfiMAQRBrIgIkACABQXhqIgMpAwAhBAJ/AkAgACACQQxqIAFBcGoiASkDABDZAwRAIAAgBBALDAELIAAgAkEIaiAEENkDDQAgAQJ+IAIoAgwgAigCCHYiAEEATgRAIACtDAELIAC4EBYLNwMAQQAMAQsgAUKAgICAMDcDACADQoCAgIAwNwMAQX8LIQAgAkEQaiQAIAALSwEBfyMAQRBrIgIkACAAIAJBDGogAUF4aiIBKQMAEMQBIQAgAUKAgICAMCACNQIMQv////8PhSAAGzcDACACQRBqJABBf0EAIAAbC9gBAwJ/AX4CfCMAQRBrIgMkAAJ/IAAgA0EIaiABQXhqIgQpAwAQWgRAQoCAgIAwIQVBfwwBCyABAn4gAysDCCIGIAJBAXRB4H1quKBEAAAAAAAA8L+gIge9An8gB5lEAAAAAAAA4EFjBEAgB6oMAQtBgICAgHgLIgC3vVEEQCAArQwBCyAHEBYLNwMAIAa9An8gBplEAAAAAAAA4EFjBEAgBqoMAQtBgICAgHgLIgG3vVEEQCABrSEFQQAMAQsgBhAWIQVBAAshASAEIAU3AwAgA0EQaiQAIAELlgIDAn8BfgF8IwBBEGsiAyQAIAFBeGoiBCkDACEFAn8CQCAAIANBCGogAUFwaiIBKQMAEFoEQCAAIAUQCwwBCyAAIAMgBRBaDQAgAQJ+AnwCQAJAAkACQAJAAkAgAkHmfmoOBgABAgQFAwQLIAMrAwggAysDAKIMBQsgAysDCCADKwMAowwECyADKwMIIAMrAwAQ1QUMAwsgAysDCCADKwMAEPwEDAILEAEACyADKwMIIAMrAwChCyIGvQJ/IAaZRAAAAAAAAOBBYwRAIAaqDAELQYCAgIB4CyIAt71RBEAgAK0MAQsgBhAWCzcDAEEADAELIAFCgICAgDA3AwAgBEKAgICAMDcDAEF/CyEAIANBEGokACAAC7YDAgd/A34jAEEQayICJAACQCABQXBqIgcpAwAiC0KAgICAEFoEQCAAQfvLAEEAEEJBfyEFDAELQX8hBSAAIAFBeGoiBCkDACIJQcMBIAlBABATIgkQDA0AIAlBKUEBEIEEIQYgACAJEAsgACAEKQMAQQAQ8wEiCRAMDQAgACAJQeoAIAlBABATIgoQDARAIAAgCRALDAELIAunIQMCQAJAAkAgBkUNACAKQSpBABCBBEUNACAEKQMAIAJBDGogAkEIahCMAkUNACAAIAJBBGogBCkDABDYAQ0CIAIoAgQiBCACKAIIRw0AIAFBaGohBiACKAIMIQhBACEBA0AgASAERg0CIAAgBikDACADIAggAUEDdGopAwAQDkEHEJwBQQBIDQMgAUEBaiEBIANBAWohAwwACwALIAFBaGohAQNAIAAgCSAKIAJBBGoQrAEiCxAMDQIgAigCBA0BIAAgASkDACADIAtBBxCcAUF/TA0CIANBAWohAwwACwALIAcgA603AwAgACAJEAsgACAKEAtBACEFDAELIAAgCUEBELABGiAAIAkQCyAAIAoQCwsgAkEQaiQAIAUL8wMCAn8FfiABQXhqIggpAwAhDSABQXBqIQcCfgJAAkACQCADQQFxBEAgBykDACIKECcEQEKAgICAICELIAApAzAQDiEKDAILIAoQsgFFBEAgAEHPygBBABAVQoCAgIAwIQxCgICAgDAhCUKAgICAMCELDAQLQoCAgIAwIQwgACAKQTsgCkEAEBMiCxAMDQIgCxAnDQEgCxAhDQEgAEHwygBBABAVDAILIAAoAigpAwgQDiELIAApAzAQDiEKC0KAgICAMCEJIAAgCxBSIgwQDA0BIA2nIgMtABFBMHFFBEAgACAKQQ0QUSIJEAwNAkKAgICAMCENIAAgCSADIAQgBRCEBSIJEAwNAiAAIAkgDBD7AyAJQQEQqAMgACAJQTAgAzMBLEEBEBoaAkAgBgRAIAAgCSABQWhqKQMAEKkFQQBODQEMBAsgACAJIAIQqgVBAEgNAwtBACEBIAAgDEE8IAkQDiIJQYOAARAaQQBIDQIgCSAAIAlBOyAMEA4iDEGAgAEQGkF/Sg0DGgwCC0GbywBBoQ1BqPwAQbrLABAAAAtCgICAgDAhCQsgACAKEAsgACALEAsgACANEAtBfyEBIAwhCyAJIQpCgICAgDAhDEKAgICAMAshCSAAIAsQCyAAIAoQCyAHIAk3AwAgCCAMNwMAIAELbAIBfwF+QcXKACEFIAAgAhD/BCEGAkAgA0GAEHFFBEBBysoAIQUgA0GAIHFFDQELIAAgBSAGQb4VEL0BIQYLQX8hAwJAIAYQDA0AIAAgAUE2IAZBARAaQQBIDQAgACABIAQQ+wNBACEDCyADC8EBAQR/AkACQCABQv////9vWARAIAAQKQwBCyACQoCAgIBwg0KAgICAgH9SBEAgABDaAwwBCyAAIAIQlgIhBCABpyIHKAIQIgYgBCAGKAIYcUF/c0ECdGooAgAhBSAGECghBgJAA0AgBUUNASAEIAYgBUF/akEDdGoiBSgCBEcEQCAFKAIAQf///x9xIQUMAQsLIAAgBEGZygAQxgEMAQsgACAHIARBBxB/IgQNAQsgACADEAtBfw8LIAQgAzcDAEEAC7UBAQV/AkACQCABQv////9vWARAIAAQKQwBCyACQoCAgIBwg0KAgICAgH9SBEAgABDaAwwBCyAAIAIQlgIhBiABpyIHKAIQIgUgBiAFKAIYcUF/c0ECdGooAgAhBCAFECghBQNAIAQEQCAFIARBf2oiBEEDdGoiCCgCBCAGRg0DIAgoAgBB////H3EhBAwBCwsgACAGEIEFCyAAIAMQC0F/DwsgACAHKAIUIARBA3RqIAMQH0EAC7oBAQV/IAFC/////29YBEAgABApQoCAgIDgAA8LIAJCgICAgHCDQoCAgICAf1IEQCAAENoDQoCAgIDgAA8LIAAgAhCWAiEFIAGnIgYoAhAiBCAFIAQoAhhxQX9zQQJ0aigCACEDIAQQKCEEAkADQCADBEAgBCADQX9qIgNBA3RqIgcoAgQgBUYNAiAHKAIAQf///x9xIQMMAQsLIAAgBRCBBUKAgICA4AAPCyAGKAIUIANBA3RqKQMAEA4LdgICfwJ+IwBBEGsiAiQAAn8gAUF4aiIDKQMAIgQQIUUEQCAAQaDGAEEAEBVBfwwBC0F/IAAgBCACQQxqEIIFIgUQDA0AGiAAIAQQCyADIAU3AwAgASACKAIMQQBHrUKAgICAEIQ3AwBBAAshACACQRBqJAAgAAu1AQIDfwF+IwBBEGsiBCQAQQEhAyAEQQE2AgwCQAJAIAEgAkEDdGoiAikDACIGEBFFBEBBfyEFQX8hAwJAIAAgBiACKQMIIARBDGoQrAEiBhAMDQAgBCgCDCIDDQBBACEDDAILIAAgAikDABALIAJCgICAgDA3AwAgA0EASA0CIAAgBhALC0KAgICAMCEGCyABIAY3AwBBACEFIAEgA0EAR61CgICAgBCENwMICyAEQRBqJAAgBQvQAgEIf0F/IQcCQCABQf//A0sNAAJAIAAoAkAiBCABSwRAIAAoAkQiBCABQRhsaigCAEUNAQwCC0EzIAFBAWogBEEDbEECbRBLEEsiBUEDdCEJIABBzABqIQQgAEHIAGohCgNAIAogBCgCACIGRwRAIAAgBigCFCAJEOQBIghFDQMgBSAAKAJAIgQgBSAEShshCwNAIAQgC0ZFBEAgCCAEQQN0akKAgICAIDcDACAEQQFqIQQMAQsLIAYgCDYCFCAGQQRqIQQMAQsLIAAgACgCRCAFQRhsEOQBIgRFDQEgBCAAKAJAIgZBGGxqQQAgBSAGa0EYbBBMGiAAIAU2AkAgACAENgJECyAEIAFBGGxqIgQgATYCACAEIAAgAxD0CDYCBCAEIAIoAgQ2AgggBCACKAIINgIMIAQgAigCDDYCECAEIAIoAhA2AhRBACEHCyAHC+0BAgV/A35CgYCAgBAhB0KAgICAMCEIAkACQCABQXhqKQMAIglCgICAgHBUDQAgCaciBS8BBkERRw0AIAUoAiAhAwNAAkAgAygCCARAIAMoAhAiAiADKAIMTw0DIAIQkQEhBCADIAJBAWo2AhAMAQsgAygCECICIAUoAhAiBCgCIE8NAiAEECggAkEDdGoiBigCBCEEIAMgAkEBajYCECAERQ0BIAYtAANBEHFFDQELIAAgAykDACAEEHciAkEASA0CIAJFDQALQoCAgIAQIQcgACAEEGYhCAsgASAHNwMIIAEgCDcDAEEAIQILIAILIwEBfiABQXhqIgEgACABKQMAEOQHIgI3AwBBf0EAIAIQDBsL4QECBH8BfiAAKQPIASIHpyIFKAIQIgQgBCgCGCABcUF/c0ECdGooAgAhAyAEECghBCACAn4CQAJAAkACQANAIANFDQEgASAEIANBf2oiBkEDdGoiAygCBEcEQCADKAIAQf///x9xIQMMAQsLIAUoAhQgBkEDdGopAwAQhAEEQCAAIAEQ3gEMAgsgAy0AA0EIcQ0DIABBgIABIAEQ3AEPCyAAIAApA8ABIAEQdyIDQQBODQELQX8PC0KAgICAMCADRQ0BGiAAKQPAASEHCyAHEA4LNwMAIAIgACABEGY3AwhBAAuGAQIEfwF+IAFBGGohBiABKAIcIQUDQCAGIAUiA0cEQCADKAIEIQUgA0F+ai8BACACRw0BIANBeGoiBC0ABUECcQ0BIAEoAhQgAkEDdGopAwAQDiEHIAMgA0EQajYCCCADIAc3AxAgAxBHIAQgBC0ABUEBcjoABSAAKAIQIARBAxC8AQwBCwsLlQECAn8BfiAAKQPAASIGpygCECIFIAUoAhggAXFBf3NBAnRqKAIAIQQgBRAoIQUgACAGIAEgAkKAgICAMEKAgICAMAJ/AkADQCAERQ0BIARBA3QgBWpBeGoiBCgCACEAIAEgBCgCBEcEQCAAQf///x9xIQQMAQsLQYDAASAAQYCAgCBxRQ0BGgsgA0GGzgFyCxB1QR91C7kBAgR/AX4gAkECcUEFciACQQFxQQZyIAJBgAFxIgMbIQYgAEHIAUHAASADG2ooAgAiBCgCECIFIAUoAhggAXFBf3NBAnRqKAIAIQJCgICAgMAAQoCAgIAwIAMbIQcgBRAoIQMCQANAIAIEQCADIAJBf2pBA3RqIgIoAgQgAUYNAiACKAIAQf///x9xIQIMAQsLIAQtAAVBAXFFDQAgACAEIAEgBhB/IgBFBEBBfw8LIAAgBzcDAAtBAAu/AgEEfyAAKALAASIFKAIQIgQgBCgCGCABcUF/c0ECdGooAgAhAyAEECghBAJAAkACQAJAAkADQCADRQ0BIANBA3QgBGoiBkF4aiEDIAEgBkF8aigCAEcEQCADKAIAQf///x9xIQMMAQsLIAJBgAFxBEAgAy0AA0EEcQ0DDAQLIAJBwABxRQ0CIAMoAgAiAkGAgIAgcQ0CIAJBgICAgHxxQYCAgIAERg0BIAJBgICAwAFxQYCAgMABRg0CDAELIAJBgAFxDQEgBS0ABUEBcQ0BCyAAIAFB6sgAEMYBDAILIAAoAsgBKAIQIgIgAigCGCABcUF/c0ECdGooAgAhAyACECghAgNAIANFBEBBAA8LIAIgA0F/akEDdGoiAygCBCABRg0BIAMoAgBB////H3EhAwwACwALIAAgARCuBQtBfwsxAQJ/IAAgAkEAEMYFIgQEfyAEQRBqIAEgAhAkIAJqQQA6AAAgACAEIAMQzwIFQQALC5sBAgR/AX4gACgCyAEiBSgCECIEIAQoAhggAXFBf3NBAnRqKAIAIQMgBBAoIQQCQANAIANFDQEgASAEIANBf2oiA0EDdGoiBigCBEcEQCAGKAIAQf///x9xIQMMAQsLIAUoAhQgA0EDdGopAwAiBxCEAQRAIAAgARDeAUKAgICA4AAPCyAHEA4PCyAAIAApA8ABIgcgASAHIAIQEwt1AQN/IAAoAsgBKAIQIgIgAigCGCABcUF/c0ECdGooAgAhAyACECghBAJAA0AgAwRAQQEhAiAEIANBf2pBA3RqIgMoAgQgAUYNAiADKAIAQf///x9xIQMMAQsLIAAgACkDwAEgARB3IgJBAE4NAEF/IQILIAILpwECAn8DfiMAQTBrIgIkAAJ+QoCAgIAgIAAQogUiA0UNABogACADEGYLIQQgACADEBICQCAEEAwEQCAEIQUMAQsCQCAAIAJBIGoQhgMiBRAMBEAgBCEBDAELIAIgAikDICIGNwMAIAIgATcDGCACIAQ3AxAgAiACKQMoIgE3AwggAEEoQQQgAhD+AiAAIAQQCyAAIAYQCwsgACABEAsLIAJBMGokACAFC4sCAQR/An8CQAJAIAJC/////29YBEAgABApDAELIAKnIgQoAhAiBSAFKAIYQX9zQQJ0Qfh5cmooAgAhAyAFECghBQJAAkADQCADBEAgBSADQX9qIgNBA3RqIgYoAgRBwQFGDQIgBigCAEH///8fcSEDDAELC0F/IABB9wAQqwUiAhAMDQQaIAAgBEHBAUEHEH8iA0UEQCAAIAIQC0F/DwsgAyACEA4iAjcDAAwBCyAEKAIUIANBA3RqKQMAEA4hAgsgACACEJYCIQMgAUL/////b1gEQCAAECkgACADEBIMAQsgACABpyADQQcQfyEEIAAgAxASIAQNAQtBfw8LIARCgICAgDA3AwBBAAsLqAIBBH8CfwJAAkAgAkL/////b1gNACACpyIDLwEGEPUBRQ0AIAMoAigiBUUNACAFKAIQIgQgBCgCGEF/c0ECdEH4eXJqKAIAIQMgBBAoIQQCQANAIAMEQCAEIANBf2oiA0EDdGoiBigCBEHBAUYNAiAGKAIAQf///x9xIQMMAQsLIABBwscAQQAQFQwCCyABQoCAgIBwVA0AIAUoAhQgA0EDdGopAwAiAkKAgICAcINCgICAgIB/Ug0AIAAgAhCWAiEFIAGnKAIQIgQgBSAEKAIYcUF/c0ECdGooAgAhAyAEECghBANAIAMEQEEAIAQgA0F/akEDdGoiAygCBCAFRg0EGiADKAIAQf///x9xIQMMAQsLIABB4scAQQAQFQwBCyAAECkLQX8LC20CA38BfgJAIAAQTyIHEAwNACACIAEgAiABShshBCABIQIDQCACIARGDQEgAiABayEFIAJBA3QhBiACQQFqIQIgACAHIAUgAyAGaikDABAOQQcQnAFBf0oNAAsgACAHEAtCgICAgOAAIQcLIAcLPQECfwJAIAAQogUiAQRAIAAgARCgBSECIAAgARASIAINAQsgAEGYxwBBABAVQoCAgIDgAA8LIAAgAhCrCAuPAgIFfwF+AkAgACAAKAIoKQMIQQkQUSIKEAwNACAAIAqnIgdBMEEDEH8gAa03AwAgBEEAIARBAEobIQgDQAJAAkACQCAFIAhGBEAgBCABIAQgAUobIQEDQCABIARGDQQgACAKIAQgAiAEQQN0aikDABAOQQcQnAEhAyAEQQFqIQQgA0EATg0ACwwBCyAAIAMgBUEBEPwDIgZFDQAgACAHIAUQkQFBJxB/IgkNASAAKAIQIAYQ9wELIAAgChALQoCAgIDgACEKDAMLIAkgBjYCACAFQQFqIQUMAQsLIAAgCkHDASAAKQOoARAOQQMQGhogACAKQc4AIAAoAhAoAowBKQMIEA5BAxAaGiAKDwsgCgvEAQIEfwJ+IAAgACgCKCkDCEEIEFEiBxAMRQRAIAAgB6ciBUEwQQMQfyABrTcDAAJAIAFBAUgEQAwBCyAAIAFBA3QQLiIEBEADQCABIANGDQIgBCADQQN0IgZqIAIgBmopAwAQDjcDACADQQFqIQMMAAsACyAAIAcQC0KAgICA4AAPCyAFIAE2AiggBSAENgIkIAAgB0HDASAAKQOoARAOQQMQGhogACAHQc4AQoCAgIAwIAApA7ABIgggCEGAMBB1GgsgBwstAQF/IAFBKRBBIgJFBEBBAA8LIAItABEEQCAAEMMCQX8PCyAAIAIpAwAQwAELtgYCA38BfiMAQeABayIFJAACQCABvSIIQoCAgICAgID4/wCDQoCAgICAgID4/wBRBEAgCEL///////////8Ag0KBgICAgICA+P8AWgRAIABBzsK5AjYAAAwCCyABRAAAAAAAAAAAY0EBc0UEQCAAQS06AAAgAEEBaiEACyAAQbzDAC0AADoACCAAQbTDACkAADcAAAwBCwJAIARFBEACfiABmUQAAAAAAADgQ2MEQCABsAwBC0KAgICAgICAgIB/CyIIQv////////8PfEL+////////H1YgCLkgAWJyDQEgACAFQdYBaiAIIAIQ6QcQ7AUMAgtEAAAAAAAAAAAgASABRAAAAAAAAAAAYRshASAEQQJHDQAgACABIAMQ6AcMAQsgASADIAVBCGogBUEMaiAFQRBqIARBA3FBAUYiBxDnByEGIAUoAgghAiAFKAIMBEAgAEEtOgAAIABBAWohAAsCQCAEQQRxDQAgAkEBSCACIANBFSAHG0pyRQRAIAYgAkwEQEEAIQQgAiAGayICQQAgAkEAShshAiAAIAVBEGogBhAkIAZqIQADQCACIARHBEAgAEEwOgAAIARBAWohBCAAQQFqIQAMAQsLIABBADoAAAwDCyAAIAVBEGogAhAkIAJqIgRBLjoAAEEAIQAgBiACayIDQQAgA0EAShshAwNAIARBAWohBCAAIANHBEAgBCAFQRBqIAAgAmpqLQAAOgAAIABBAWohAAwBCwsgBEEAOgAADAILIAJBBWpBBUsNACAAQbDcADsAAEEAIQRBACACayACQR91cSECIABBAmohAANAIAIgBEcEQCAAQTA6AAAgBEEBaiEEIABBAWohAAwBCwsgACAFQRBqIAYQJCAGakEAOgAADAELIAAgBS0AEDoAAAJAIAZBAkgEQCAAQQFqIQQMAQsgAEEuOgABIABBAmohBEEBIQADQCAAIAZGDQEgBCAFQRBqIABqLQAAOgAAIABBAWohACAEQQFqIQQMAAsACyAEQeUAOgAAIAJBf2ohACACQQFIBH8gBEEBagUgBEErOgABIARBAmoLIQIgBSAANgIAIAIgBRCcCQsgBUHgAWokAAsuACAAQQA2AtABIABChICAgIACNwPIASAAIABBwAAQmwIiADYC1AFBAEF/IAAbC1YBAXwCfyAAIAIQnQEiAhAMBEBEAAAAAAAA+H8hA0F/DAELIAIQVCIAQQdHBEAgAEUEQCACp7chA0EADAILEAEACyACEEohA0EACyEAIAEgAzkDACAACzABAX8CQCAAQoCAgIBwVA0AIACnIgEvAQZBA0cNACABIAEtAAVB3wFxQSByOgAFCwsuAQJ/AkAgAEKAgICAcFQNACAApyICLwEGQQNHDQAgAi0ABUEFdkEBcSEBCyABC+gBAQh/IwAiByELIAGnKAIgIggoAhAiCUEAIAlBAEobIQwgByADIAlqIgpBA3RBD2pBcHFrIgckAAN+IAYgDEYEfkEAIQYgA0EAIANBAEobIQMDQCADIAZGRQRAIAcgBiAJakEDdGogBCAGQQN0aikDADcDACAGQQFqIQYMAQsLAn4gBUEBcQRAIAAgASACEFkhAyAAIAgpAwAiASABIAIgAxsgCiAHEIkDDAELIAAgCCkDACAIKQMIIAogBxAjCyEBIAskACABBSAHIAZBA3QiDWogCCANaikDGDcDACAGQQFqIQYMAQsLC9wDAQt/AkACQCABKAIQIgQtABBFBEBBAiAEKAIgIAQoAiRrEEsiCCAEKAIcSw0BIAQoAhhBAWohBQNAIAUiAkEBdiIFIAhPDQALAkAgACACIAgQ4QEQLiIDRQ0AIAJBf2ohCiADIAIQtwIhAyAEQQhqEEcgAyAEQTAQJCIDQQhqIAAoAhBB0ABqEE0gAyACQQJ0IgJrQQAgAhBMGiAEQTBqIQUgA0EwaiEGIAEoAhQhCwNAIAkgAygCICICSQRAIAUoAgQiAgRAIAYgAjYCBCAGIAUoAgBBgICAYHEiDCAGKAIAQf///x9xcjYCACAGIAwgAyAFKAIEIApxQX9zQQJ0aiICKAIAQf///x9xcjYCACACIAdBAWoiAjYCACALIAdBA3RqIAsgCUEDdGopAwA3AwAgBkEIaiEGIAIhBwsgCUEBaiEJIAVBCGohBQwBCwsgByACIAMoAiRrRw0DIANBADYCJCADIAg2AhwgAyAKNgIYIAMgBzYCICABIAM2AhAgACAEELkCEBkgACABKAIUIAhBA3QQmQIiAEUNACABIAA2AhQLDwtBisIAQaENQa0jQZnCABAAAAtBrMIAQaENQbEjQZnCABAAAAtBxsIAQaENQdYjQZnCABAAAAsnACAAIAEgAkKAgICAMCADIAQgBUGAOnIQdRogACADEAsgACAEEAsLhwECAX8BfkKAgICA4AAhBwJAIABByAAQayIFBEAgBUEANgIAIAAgBUEIaiIGIAEgAiADIAQQ7gMEQCAFQQQ2AgAMAgsgACAGELsCIgIQDA0BIAAgAhALIAAgAUEoEG0iBxAMDQEgByAFEIgBCyAHDwsgACgCECAFEOgDIAAgBRAZQoCAgIDgAAvrBQIJfwF8IwBBQGoiBiQAIAGnIggtACkhCyAILQAoIQkgBiAAKAIQIgwoAowBNgIQIAwgBkEQajYCjAEgCCgCICEHIAYgAzYCNCAGIAE3AxggBkEANgI4AkAgCSADTARAIAQhAAwBCyADQQAgA0EAShshDSAGIAlBA3RBD2pB8B9xayIAJAADQCAKIA1GBEAgAyEEA0AgBCAJRkUEQCAAIARBA3RqQoCAgIAwNwMAIARBAWohBAwBCwsgBiAJNgI0BSAAIApBA3QiDmogBCAOaikDADcDACAKQQFqIQoMAQsLCyAGIAA2AiAgCCgCJCEEAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAsODQsCAAEAAQcIAwQFBgkKCyAFQQFxDQpCgICAgDAhAiALQQJHDQoMCwsgBUEBcQ0AQoCAgIAwIQIgC0EDRg0KCyAHIAIgAyAAIAguASogBBEGACEBDAsLIAcgAiAEEQgAIQEMCgsgByACIAApAwAgBBEWACEBDAkLIAcgAiAILgEqIAQREAAhAQwICyAHIAIgACkDACAILgEqIAQRIgAhAQwHCyAHIAZBCGogACkDABBIDQUgBisDCCAEEQsAIg+9An8gD5lEAAAAAAAA4EFjBEAgD6oMAQtBgICAgHgLIgC3vVEEQCAArSEBDAcLIA8QFiEBDAYLQoCAgIDgACEBIAcgBkEIaiAAKQMAEEgNBSAHIAYgACkDCBBIDQUgBisDCCAGKwMAIAQRGwAiD70CfyAPmUQAAAAAAADgQWMEQCAPqgwBC0GAgICAeAsiALe9UQRAIACtIQEMBgsgDxAWIQEMBQsgByACIAMgACAGQQhqIAguASogBBEUACIBEAwNBCAGKAIIIgBBAkYNBCAHIAEgABCMAyEBDAQLEAEACyAHIAIgAyAAIAQRAgAhAQwCCyAHQffDAEEAEBULQoCAgIDgACEBCyAMIAYoAhA2AowBIAZBQGskACABC9cBAQV/IAAoAtQBIAEoAhQgAhC4AiADELgCIgcgACgCyAEQzAJBAnRqIQADQAJAIAAoAgAiBEUNAAJAIAQoAhQgB0cNACAEKAIsIAEoAixHDQBBACEAIAQoAiAgASgCICIGQQFqRw0AA0AgACAGRwRAIAQgAEEDdCIFaiIIKAI0IAEgBWoiBSgCNEcNAiAAQQFqIQAgBSgCMCAIKAIwc0H///8fTQ0BDAILCyAEIAZBA3RqIgAoAjQgAkcNACAAKAIwQRp2IANGDQELIARBKGohAAwBCwsgBAsqAQF/An8gABBUIgFBB0cEQEEAIAENARogAKdBH3YPCyAAEEq9Qj+IpwsLuQEBBX8jACIFIQggACACIAMgAUEPEEEiBi0ABCIHIANKBH9BACEAIANBACADQQBKGyEJIAUgB0EDdEEPakHwH3FrIgUkAAN/IAAgCUYEfyADIQQDfyAEIAdGBH8gBQUgBSAEQQN0akKAgICAMDcDACAEQQFqIQQMAQsLBSAFIABBA3QiCmogBCAKaikDADcDACAAQQFqIQAMAQsLBSAECyAGLwEGIAZBCGogBigCABEUACEBIAgkACABC7QCAgR/AX4jAEEQayICJAACQAJAAkACQAJAA0ACQEKAgICAwH4hBgJAAkAgARBUQQhqDhAEAgUFBQUFAQYAAAgFBQYGBQsgAUL/////D4MhBgwHCyAAIAFBARDBASIBEAxFDQEMBQsLIAAgAkEIaiABEI4CIQMgACABEAsgAwRAIAIgAzYCDCACIAMgAxD8AiIEaiIFNgIMQgAhBgJAIAQgAigCCEYNACAAIAUgAkEMakEAQQQQvAIiBhAMDQAgAiACKAIMEPwCIAIoAgxqIgQ2AgwgAigCCCAEIANrRg0AIAAgBhALQoCAgIDAfiEGCyAAIAMQNwsgA0UNAwwECyAAIAEQCyAAQYjDAEEAEBUMAgsgACABEAsMAgsgASEGDAELQoCAgIDgACEGCyACQRBqJAAgBguGAQEEfyAAQQA2AjQgAEIANwIkIABBADYCPCAAQQA2AixBfyEDAkAgAEGAAhCvBQ0AQfAfIQJBASEBA0AgAUHPAUYEQEEAIQMMAgsgACACIAIQRCIEQQRBA0EBIAFBwQFLGyABQcEBRhsQyghFDQEgAUEBaiEBIAIgBGpBAWohAgwACwALIAMLlQEBA38jAEEQayIEJAACQAJAIAAgBEEIaiABQeIAEIUBIgJFDQAgBCkDCCIBEBEEQCAAIAIpAwAQigQhAwwCCyAAIAEgAikDCEEBIAIQNiIBEAwNACAAIAEQLSIDRQRAQQAhAwwCCyAAIAIpAwAQnwEiAkEASA0AIAJFDQEgAEGh2ABBABAVC0F/IQMLIARBEGokACADC40BAQN/IwBBEGsiBCQAAkACQCAAIARBCGogAUHhABCFASICRQ0AIAQpAwgiARARBEAgACACKQMAEJ8BIQMMAgsgACABIAIpAwhBASACEDYiARAMDQAgACABEC0hAyAAIAIpAwAQnwEiAkEASA0AIAIgA0YNASAAQYDYAEEAEBULQX8hAwsgBEEQaiQAIAMLIAAgAUL/////b1gEQCAAEClBfw8LIABBACABp0EwEFMLZwEBfyMAQRBrIgMkACABKAIEIQEgAiADQQxqIAAoAgQQswFBACACIANBCGogARCzARtFBEBB1j9BoQ1BgzpB+z8QAAALIAMoAgghACADKAIMIQEgA0EQaiQAQX8gACABRyABIABJGwvUAQIDfwJ+IwBBEGsiAyQAQoCAgIDgACEFAkAgACADQQhqIAFB3wAQhQEiAkUNACADKQMIIgEQEQRAIAAgAikDABD5ASEFDAELAkAgACABIAIpAwhBASACEDYiARAMDQACQAJAAkAgAUIgiKdBAWoOBAABAQABCyAAIAIpAwAQnwEiBEF/TA0BIAQNAiAAIAIpAwAQ+QEiBhAMDQEgACAGEAsgBqcgAadGDQILIAAgARALIABBxTtBABAVDAILIAAgARALDAELIAEhBQsgA0EQaiQAIAUL3QECA38BfiMAQSBrIgQkAAJAAkAgACAEQRhqIAFB4AAQhQEiBUUNACAFKQMAIQEgBCkDGCIHEBEEQCAAIAEgAiADEJgCIQMMAgsgBCACNwMIIAQgATcDACAAIAcgBSkDCEECIAQQNiIBEAwNACAAIAEQLUUEQCADRQRAQQAhAwwDCyAAQbA7QQAQFQwBCyAAIAUpAwAQnwEiBkEASA0AQQEhAyAGDQEgACAFKQMAEPkBIgEQDA0AIAAgARALIAKnIAGnRg0BIABBxTtBABAVC0F/IQMLIARBIGokACADC80LAgd/A34jAEGwBmsiAyQAIAMgATQCCDcDmAQgA0EgNgKQBCAAQaQOIANBkARqEKIBIAIEQANAIARBBUcEQCACIARBA3QiCEH0DmooAgAiBRDoASIGBEAgAiAGEJcEIgkgBU8EQCADIAU2AoAEIAMgCSAFazYChAQgAyAIQfAOaigCADYCiAQgAEHRDyADQYAEahCiAUEBIQcLIAIgBhAgCyAEQQFqIQQMAQsLIAdFBEBB4w9BISAAENEFCyADQeAEakEAQdABEEwaIAJB1ABqIQQgAkHQAGohBQNAIAUgBCgCACIERwRAIARBfGotAABBD3FFBEAgA0HgBGogBEF+ai8BACIGQTMgBkEzSRtBAnRqIgYgBigCAEEBajYCAAsgBEEEaiEEDAELC0GFEEESIAAQ0QUgAygC4AQiBARAIANBqRA2AvgDIANBADYC9AMgAyAENgLwAyAAQZgQIANB8ANqEKIBC0EBIQQDQCAEQTNHBEAgA0HgBGogBEECdGooAgAiBQRAIAMgAiADQaAEaiAEQQxsQbQIaigCABDBBTYC6AMgAyAENgLkAyADIAU2AuADIABBmBAgA0HgA2oQogELIARBAWohBAwBCwsgAygCrAYiAgRAIANBrhA2AtgDIANBADYC1AMgAyACNgLQAyAAQZgQIANB0ANqEKIBCyAAEKEJCyADQdAQNgLIAyADQcoQNgLEAyADQcUQNgLAAyAAQbYQIANBwANqEKIBIAEpAxgiClBFBEAgAyABKQMAIgs3A7ADIAMgCjcDqAMgAyALuSAKuaM5A7gDIANB+xA2AqADIABB1RAgA0GgA2oQtwEgASkDICEKIAEpAwAhDCABKQMQIQsgA0EINgKIAyADIAs3A4ADIAMgDCALfbkgCrmjOQOQAyADIAo3A/gCIANBwxE2AvACIABBjBEgA0HwAmoQtwELIAEpAygiClBFBEAgAyABKQMwIgs3A+ACIAMgCjcD2AIgAyALuSAKuaM5A+gCIANB9BE2AtACIABBzxEgA0HQAmoQtwELIAEpAzgiClBFBEAgAyABKQNAIgs3A8ACIAMgCjcDuAIgAyALuSAKuaM5A8gCIANBoRI2ArACIABB+hEgA0GwAmoQtwELIAEpA0giClBFBEAgAyABKQNQIgs3A6ACIAMgCjcDmAIgAyALuSAKuaM5A6gCIANB0BI2ApACIABBqRIgA0GQAmoQtwEgASkDWCEKIAEpA0ghCyADIAEpA2A3A4ACIAMgCrkgC7mjOQOIAiADIAo3A/gBIANB2BI2AvABIABBqRIgA0HwAWoQtwEgASkDaCEKIAMgASkDcCILNwPgASADIAu5IAq5ozkD6AEgAyAKNwPYASADQYsTNgLQASAAQeUSIANB0AFqELcBCwJAIAEpA3giClANACADIAEpA4ABNwPAASADIAo3A7gBIANBpxM2ArABIABBlBMgA0GwAWoQogEgASkDeCEKIAMgASkDiAEiCzcDoAEgAyALuSAKuaM5A6gBIAMgCjcDmAEgA0HjEzYCkAEgAEG6EyADQZABahC3ASABKQOQASIKUA0AIAMgASkDmAEiCzcDgAEgAyAKNwN4IAMgC7kgCrmjOQOIASADQe4TNgJwIABBuhMgA0HwAGoQtwELIAEpA6ABIgpQRQRAIAMgCjcDaCADQYUUNgJgIABB+BMgA0HgAGoQogELAkAgASkDqAEiClANACADIAo3A1ggA0GRFDYCUCAAQfgTIANB0ABqEKIBIAEpA7ABIgpQDQAgAyAKNwNIIANBmBQ2AkAgAEH4EyADQUBrEKIBIAEpA7ABIQsgAyABKQO4ASIKQgOGNwMwIAMgCrkgC7mjOQM4IAMgCjcDKCADQdEUNgIgIABBphQgA0EgahC3AQsgASkDwAEiClBFBEAgAyABKQPIATcDECADIAo3AwggA0HcFDYCACAAQZQTIAMQogELIANBsAZqJAALvQIBBH8Cf0HAACAAKAIgRQ0AGiAALwEqIAAvAShqQQR0QUBrCyECIAAoAjQEQCAAKAI4IgRBA3QhBQNAIAMgBE5FBEAgACgCNCADQQN0aikDACABEKABIANBAWohAyAAKAI4IQQMAQsLIAIgBWohAgsgACgCJARAIAAoAjxBA3QgAmohAgsCQCAALwARIgRBgCBxDQAgACgCFEUNACABIAEpAyggADQCGHw3AyggAC8AESEEC0EAIQMCQCAEQYAIcUUNAAJ/IAAoAlRFBEAgAkEYagwBC0EBIQMgAiAAKAJIakEZagshAiAAKAJMIgBFDQAgASABKQMwQgF8NwMwIAEgASkDOCAArHw3AzggA0EBaiEDCyABIAErAyAgAregOQMgIAEgASkDGEIBfDcDGCABIAErAwAgA7egOQMAC/ISAwl/DH4CfCMAQUBqIgIkACACQQBBwAAQTCEGIAFBEGpBAEHAARBMGiABIAA1AhA3AxggASAANQIUNwMAIAA1AhghCyABQgI3AyAgASALNwMIIAEgACgCQEEDdEHgAWqtNwMQIABBzABqIQIgAEHIAGohCANAIAggAigCACIFRwRAIAUoAhAhAiABIAEpAyBCAnw3AyAgASABKQMQIAAoAkBBA3RB+AFqrXw3AxAgASABKQPAASAFMwEIfDcDwAEgASABKQPIASAFNAIMfDcDyAEgBUFsaiEDAkAgAkUNACACLQAQDQAgAigCGCEEIAEgASkDaEIBfDcDaCABIAEpA3AgBEEBaiACKAIcEOEBrXw3A3ALIANB5AFqIQIgA0HgAWohCQNAIAkgAigCACIDRwRAIAEgASkDICINQgF8Igw3AyAgASABKQMQQvAAfCILNwMQIAMoAggEQCABIA1CAnwiDDcDICABIAsgAygCDEEDdK18Igs3AxALAkAgAygCFEUNACABIAxCAXw3AyAgASALIAMoAhgiBEEUbK18NwMQQQAhAgNAIAIgBE4NAQJAIAMoAhQgAkEUbGoiBygCCA0AIAcoAgRFDQAgASABKQMgQgF8NwMgIAcoAgQpAxggBhCgASADKAIYIQQLIAJBAWohAgwACwALIAMoAiAEQCABIAEpAyBCAXw3AyAgASABKQMQIAMoAiRBAnStfDcDEAsgAygCLARAIAEgASkDIEIBfDcDICABIAEpAxAgAygCMEEMbK18NwMQCyADKQM4IAYQoAEgAykDQCAGEKABIANBBGohAgwBCwsgBUEEaiECDAELCyAAQdQAaiECIABB0ABqIQkDQCAJIAIoAgAiA0cEQCADQXhqIQgCQAJAAkAgA0F8ai0AAEEPcQ4CAQACCyAIIAYQ6wgMAQsgAygCCCEEIAEgASkDSEIBfDcDSAJAIAMoAgxFDQAgASABKQMgQgF8NwMgIAEgASkDYCAEKAIcQQN0rXw3A2AgASABKQNYIAQoAiAiBax8NwNYQQAhByAEECghAgNAIAcgBU4NAQJAIAIoAgRFDQAgAigCAEH/////A0sNACADKAIMIAdBA3RqKQMAIAYQoAEgBCgCICEFCyAHQQFqIQcgAkEIaiECDAALAAsgBC0AEEUEQCAEKAIYIQIgASABKQNoQgF8NwNoIAEgASkDcCACQQFqIAQoAhwQ4QGtfDcDcAsCQAJAAkACQAJAAkACQAJAAkACQCAILwEGQX5qDhMACQEBAQEACQEJAgMEBQkHBggICQsgASABKQOoAUIBfDcDqAEgCC0ABUEIcUUNCSABIAEpA7ABQgF8NwOwASADKAIcRQ0JIAEgASkDIEIBfDcDICABIAEpAxAgAygCIEEDdK18NwMQIAEgASkDuAEgAzUCIHw3A7gBQQAhAgNAIAIgAygCIE8NCiADKAIcIAJBA3RqKQMAIAYQoAEgAkEBaiECDAALAAsgAykDGCAGEKABDAgLIAEgASkDoAFCAXw3A6ABDAcLIAMoAhwiCEUNBiADKAIYIQcgASABKQMgQgF8NwMgIAEgASkDgAEgBygCPCIFQQJ0rXw3A4ABQQAhAgNAIAIgBU4NBwJAIAggAkECdGooAgAiBEUNACABAn5EAAAAAAAA8D8gBCgCALciF6MgASkDILmgIhiZRAAAAAAAAOBDYwRAIBiwDAELQoCAgICAgICAgH8LNwMgIAECfkQAAAAAAABAQCAXoyABKQOAAbmgIheZRAAAAAAAAOBDYwRAIBewDAELQoCAgICAgICAgH8LNwOAASAEKAIQIgogBEEYakcNACAKKQMAIAYQoAEgBygCPCEFCyACQQFqIQIMAAsACyADKAIYIQVBACECA0AgAiAFKAIQIgRORQRAIAUgAkEDdGopAxggBhCgASACQQFqIQIMAQsLIAEgASkDIEIBfDcDICABIAEpAxAgBEEDdEEYaq18NwMQDAULIAMoAhgiBUUNBEEAIQIDQCACIAUtAAUiBE9FBEAgBSACQQN0aikDCCAGEKABIAJBAWohAgwBCwsgASABKQMgQgF8NwMgIAEgASkDECAErUIDhnxCCHw3AxAMBAsgAygCGCAGEJAEIAMoAhwgBhCQBAwDCyADKAIYIgJFDQIgAikDACAGEKABIAEgASkDIEIBfDcDICABIAEpAxBCGHw3AxAMAgsgAygCGCICRQ0BIAEgASkDICILQgF8NwMgIAEgASkDEEIcfCIMNwMQIAIoAghFDQEgASALQgJ8NwMgIAEgDCACNAIAfDcDEAwBCyADKAIYRQ0AIAEgASkDIEIBfDcDIAsgA0EEaiECDAELCyABIAEpA1AgASkDSCIOQjB+fCIPNwNQIAEgASkDECAAKALMASICQQJ0rXwiEDcDEEEAIQUgAkEAIAJBAEobIQMgASkDICELA0AgAyAFRkUEQCAAKALUASAFQQJ0aiECA0AgAigCACICBEAgAigCGCEEIAEgASkDaEIBfDcDaCABIAEpA3AgBEEBaiACKAIcEOEBrXw3A3AgAkEoaiECDAELCyAFQQFqIQUMAQsLIAEgC0IDfCIRNwMgIAEgACgCKCIFrDcDKCABIAAoAiwiAyAAKAIkakECdK0iCzcDMEEAIQIgA0EAIANBAEobIQMDQCACIANHBEAgACgCOCACQQJ0aigCACIEEN8DRQRAIAEgCyAEKAIEIgRB/////wdxIARBH3YiBHQgBGtBEWqtfCILNwMwCyACQQFqIQIMAQsLIAECfiAGKwMIEKUDIheZRAAAAAAAAOBDYwRAIBewDAELQoCAgICAgICAgH8LIgw3AzggAQJ+IAYrAxAQpQMiF5lEAAAAAAAA4ENjBEAgF7AMAQtCgICAgICAgICAfwsiDTcDQCABIAYpAxgiEjcDeCABAn4gBisDIBClAyIXmUQAAAAAAADgQ2MEQCAXsAwBC0KAgICAgICAgIB/CyITNwOAASABIAYpAygiFDcDiAEgASAGKQMwIhU3A5ABIAEgBikDOCIWNwOYASAGKwMAIRcgASABKQNwIAEpA2AgFiAUIA8gEHwgDXwgE3x8fCALfHx8NwMQIAECfiAXEKUDIAW3oCAMuaAgDrmgIAEpA2i5oCASuaAgFbmgIBG5oCIXmUQAAAAAAADgQ2MEQCAXsAwBC0KAgICAgICAgIB/CzcDICAGQUBrJAALDwAgASABKAIAQQFqNgIACzkBAX8gASABKAIAIgJBAWo2AgAgAkUEQCABQQhqIgIQRyACIABB0ABqEE0gASABLQAEQQ9xOgAECwtVAQF/IAEoAgAiAkEASgRAIAEgAkF/aiICNgIAAkAgAg0AIAEtAARB8AFxQRBHDQAgAUEIaiIBEEcgASAAQeAAahBNCw8LQdY5QaENQbAsQec5EAAAC1IBAn8gAEEBOgBoIABB2ABqIQICQANAIAIgACgCXCIBRwRAIAFBeGoiASgCAA0CIAAgARDDBQwBCwsgAEEAOgBoDwtBxjBBoQ1B2ypB2DAQAAALKgAgACgCFEEwaiAAKAJsSwRAIAAQiwUgACAAKAIUIgBBAXYgAGo2AmwLC1oBAX8gACgC1AEgARDEBSICIAAoAsgBEMwCQQJ0aiEAA0ACQCAAKAIAIgBFDQACQCAAKAIUIAJHDQAgACgCLCABRw0AIAAoAiBFDQELIABBKGohAAwBCwsgAAurAQEBfwJ/IAAoAggiAiAAKAIMTgRAQX8gACACQQFqIAEQzQINARoLAkAgACgCEARAIAAgACgCCCICQQFqNgIIIAAoAgQgAkEBdGogATsBEAwBCyABQf8BTQRAIAAgACgCCCICQQFqNgIIIAIgACgCBGogAToAEAwBC0F/IAAgACgCDBDeAw0BGiAAIAAoAggiAkEBajYCCCAAKAIEIAJBAXRqIAE7ARALQQALCygAIAEQ8AFFBEAgACgCOCABQQJ0aigCACIAIAAoAgBBAWo2AgALIAELxwECBH8BfiABIAJBARDNBSIDQf////8DcSEFIAAoAjQgACgCJEF/aiADcUECdGohAwNAAkACQCADKAIAIgRFDQAgACgCOCAEQQJ0aigCACIDKQIEIgdCgICAgICAgIBAg0KAgICAgICAgMAAUiAHQiCIp0H/////A3EgBUdyDQEgB6ciBkEASCAGQf////8HcSACR3INASADQRBqIAEgAhB0DQEgBBDwAQ0AIAMgAygCAEEBajYCAAsgBA8LIANBDGohAwwACwALEAAjACAAa0FwcSIAJAAgAAsGACAAJAALBAAjAAsqAQF/IwBBEGsiASQAIAEgADYCDEHoowQoAgBBhA4gABCcBCABQRBqJAALBABCAAvUAgEHfyMAQSBrIgMkACADIAAoAhwiBDYCECAAKAIUIQUgAyACNgIcIAMgATYCGCADIAUgBGsiATYCFCABIAJqIQRBAiEHIANBEGohAQJ/AkACQCAAKAI8IANBEGpBAiADQQxqEAMQ0AVFBEADQCAEIAMoAgwiBUYNAiAFQX9MDQMgASAFIAEoAgQiCEsiBkEDdGoiCSAFIAhBACAGG2siCCAJKAIAajYCACABQQxBBCAGG2oiCSAJKAIAIAhrNgIAIAQgBWshBCAAKAI8IAFBCGogASAGGyIBIAcgBmsiByADQQxqEAMQ0AVFDQALCyAEQX9HDQELIAAgACgCLCIBNgIcIAAgATYCFCAAIAEgACgCMGo2AhAgAgwBCyAAQQA2AhwgAEIANwMQIAAgACgCAEEgcjYCAEEAIAdBAkYNABogAiABKAIEawshBCADQSBqJAAgBAuMAgIDfwF+IwBBIGsiBSQAAkAgAaciBygCICIGRQ0AIAYoAggiCCgCBA0AIAhBATYCBCAHLwEGQVVqIQcgA0EBSAR+QoCAgIAwBSAEKQMACyEBAkACQCAHDQAgARAhRQ0AAkACQCAAIAEgBikDABBZBEAgAEG/4wBBABAVDAELIAAgAUH/ACABQQAQEyICEAxFDQELIAAQjwEhASAAIAYpAwAgAUEBEJQFIAAgARALDAMLIAAgAhA7DQEgACACEAsLIAAgBikDACABIAcQlAUMAQsgBikDACEJIAUgAjcDECAFIAE3AwggBSAJNwMAIABBJkEDIAUQ/gIgACACEAsLIAVBIGokAEKAgICAMAtEAgF/AX4gAUL///////8/gyEDAn8gAUIwiKdB//8BcSICQf//AUcEQEEEIAINARpBAkEDIAAgA4RQGw8LIAAgA4RQCwvmAwMDfwF+BnwCQAJAAkACQCAAvSIEQgBZBEAgBEIgiKciAUH//z9LDQELIARC////////////AINQBEBEAAAAAAAA8L8gACAAoqMPCyAEQn9VDQEgACAAoUQAAAAAAAAAAKMPCyABQf//v/8HSw0CQYCAwP8DIQJBgXghAyABQYCAwP8DRwRAIAEhAgwCCyAEpw0BRAAAAAAAAAAADwsgAEQAAAAAAABQQ6K9IgRCIIinIQJBy3chAwsgAyACQeK+JWoiAUEUdmq3IgdEAGCfUBNE0z+iIgggBEL/////D4MgAUH//z9xQZ7Bmv8Daq1CIIaEv0QAAAAAAADwv6AiACAAIABEAAAAAAAA4D+ioiIFob1CgICAgHCDvyIGRAAAIBV7y9s/oiIJoCIKIAkgCCAKoaAgACAGoSAFoSAAIABEAAAAAAAAAECgoyIAIAUgACAAoiIFIAWiIgAgACAARJ/GeNAJmsM/okSveI4dxXHMP6CiRAT6l5mZmdk/oKIgBSAAIAAgAEREUj7fEvHCP6JE3gPLlmRGxz+gokRZkyKUJEnSP6CiRJNVVVVVVeU/oKKgoKKgIgBEAAAgFXvL2z+iIAdENivxEfP+WT2iIAAgBqBE1a2ayjiUuz2ioKCgoCEACyAAC80DAwN/AX4FfAJAAkACQAJAIAC9IgRCAFkEQCAEQiCIpyIBQf//P0sNAQsgBEL///////////8Ag1AEQEQAAAAAAADwvyAAIACiow8LIARCf1UNASAAIAChRAAAAAAAAAAAow8LIAFB//+//wdLDQJBgIDA/wMhAkGBeCEDIAFBgIDA/wNHBEAgASECDAILIASnDQFEAAAAAAAAAAAPCyAARAAAAAAAAFBDor0iBEIgiKchAkHLdyEDCyAEQv////8PgyACQeK+JWoiAUH//z9xQZ7Bmv8Daq1CIIaEv0QAAAAAAADwv6AiACAAIABEAAAAAAAA4D+ioiIFob1CgICAgHCDvyIGRAAAIGVHFfc/oiIHIAMgAUEUdmq3IgigIgkgByAIIAmhoCAAIAahIAWhIAAgAEQAAAAAAAAAQKCjIgAgBSAAIACiIgUgBaIiACAAIABEn8Z40Amawz+iRK94jh3Fccw/oKJEBPqXmZmZ2T+goiAFIAAgACAARERSPt8S8cI/okTeA8uWZEbHP6CiRFmTIpQkSdI/oKJEk1VVVVVV5T+goqCgoqAiAEQAACBlRxX3P6IgACAGoEQAou8u/AXnPaKgoKAhAAsgAAtGACAAvUL///////////8Ag0KAgICAgICA+P8AWARAIAAgACABpSABvUL///////////8Ag0KAgICAgICA+P8AVhsPCyABC0YAIAC9Qv///////////wCDQoCAgICAgID4/wBYBEAgACAAIAGkIAG9Qv///////////wCDQoCAgICAgID4/wBWGw8LIAELoQEBAX4gAEHoABBrIgVFBEBCgICAgOAADwsgBUEBNgIAIAAoAhAgBUEEELwBIAVCgICAgDA3AxggBUKAgICAMDcDECAFQQA2AiACQAJAIAAgBUEQahCGAyIGEAxFBEAgACAFQShqIAEgAiADIAQQ7gNFDQELIAAgBhALQoCAgIDgACEGDAELIAVBATYCICAAIAUQkwULIAAoAhAgBRCSBSAGC64HAQl/IAAoAgQiB0EDcSECIAAgB0F4cSIGaiEEQYSoBCgCACEFAkAgAkUEQEEAIQIgAUGAAkkNASAGIAFBBGpPBEAgACECIAYgAWtB1KsEKAIAQQF0TQ0CC0EADwsCQCAGIAFPBEAgBiABayICQRBJDQEgACAHQQFxIAFyQQJyNgIEIAAgAWoiASACQQNyNgIEIAQgBCgCBEEBcjYCBCABIAIQ1gUMAQtBACECIARBjKgEKAIARgRAQYCoBCgCACAGaiIFIAFNDQIgACAHQQFxIAFyQQJyNgIEIAAgAWoiAiAFIAFrIgFBAXI2AgRBgKgEIAE2AgBBjKgEIAI2AgAMAQsgBEGIqAQoAgBGBEBB/KcEKAIAIAZqIgUgAUkNAgJAIAUgAWsiAkEQTwRAIAAgB0EBcSABckECcjYCBCAAIAFqIgEgAkEBcjYCBCAAIAVqIgUgAjYCACAFIAUoAgRBfnE2AgQMAQsgACAHQQFxIAVyQQJyNgIEIAAgBWoiASABKAIEQQFyNgIEQQAhAkEAIQELQYioBCABNgIAQfynBCACNgIADAELIAQoAgQiA0ECcQ0BIANBeHEgBmoiCSABSQ0BIAkgAWshCgJAIANB/wFNBEAgBCgCCCIGIANBA3YiBUEDdEGcqARqRxogBiAEKAIMIghGBEBB9KcEQfSnBCgCAEF+IAV3cTYCAAwCCyAGIAg2AgwgCCAGNgIIDAELIAQoAhghCAJAIAQgBCgCDCIDRwRAIAUgBCgCCCICTQRAIAIoAgwaCyACIAM2AgwgAyACNgIIDAELAkAgBEEUaiICKAIAIgYNACAEQRBqIgIoAgAiBg0AQQAhAwwBCwNAIAIhBSAGIgNBFGoiAigCACIGDQAgA0EQaiECIAMoAhAiBg0ACyAFQQA2AgALIAhFDQACQCAEIAQoAhwiBUECdEGkqgRqIgIoAgBGBEAgAiADNgIAIAMNAUH4pwRB+KcEKAIAQX4gBXdxNgIADAILIAhBEEEUIAgoAhAgBEYbaiADNgIAIANFDQELIAMgCDYCGCAEKAIQIgIEQCADIAI2AhAgAiADNgIYCyAEKAIUIgJFDQAgAyACNgIUIAIgAzYCGAsgCkEPTQRAIAAgB0EBcSAJckECcjYCBCAAIAlqIgEgASgCBEEBcjYCBAwBCyAAIAdBAXEgAXJBAnI2AgQgACABaiICIApBA3I2AgQgACAJaiIBIAEoAgRBAXI2AgQgAiAKENYFCyAAIQILIAILVwIBfwF+AkACf0EAIABFDQAaIACtIgKnIgEgAEEBckGAgARJDQAaQX8gASACQiCIpxsLIgEQnwIiAEUNACAAQXxqLQAAQQNxRQ0AIABBACABEEwaCyAAC2YBAX8gAaciBS8BBkFSaiEGIAUoAiAhBSADQQFIBH5CgICAgDAFIAQpAwALIQEgBSAGNgI0IAEQDiEBAkAgBgRAIAAgARCQAQwBCyAFKAJkQXhqIAE3AwALIAAgBRCTBUKAgICAMAvGAQIDfwJ+IwBBEGsiAyQAAn4gAbwiBEH/////B3EiAkGAgIB8akH////3B00EQCACrUIZhkKAgICAgICAwD98DAELIAJBgICA/AdPBEAgBK1CGYZCgICAgICAwP//AIQMAQsgAkUEQEIADAELIAMgAq1CACACZyICQdEAahB7IAMpAwAhBSADKQMIQoCAgICAgMAAhUGJ/wAgAmutQjCGhAshBiAAIAU3AwAgACAGIARBgICAgHhxrUIghoQ3AwggA0EQaiQACwYAQfCnBAuQAQIBfwF+QoCAgIDgACEHAkAgAEHQABBrIgYEQCAGQQA2AgQgBkHIAGoQbyAAIAZBCGoiBSABIAIgAyAEEO4DBEAgBkEFNgIEDAILIAAgBRC7AiICEAwNASAAIAIQCyAAIAFBMhBtIgcQDA0BIAYgBz4CACAHIAYQiAELIAcPCyAAKAIQIAYQkQVCgICAgOAACwYAQeynBAsGAEHkpwQLawIBfwF+IwBBoAFrIgIkACACQRBqQQBBkAEQTBogAkF/NgJcIAIgATYCPCACQX82AhggAiABNgIUIAJBEGoQmwQgAiACQRBqEI4JIAIpAwghAyAAIAIpAwA3AwAgACADNwMIIAJBoAFqJAALghwDDX8GfgF8IwBBkMYAayIGJABBACADIARqIhFrIRICQAJ/A0AgAkEwRwRAAkAgAkEuRw0EIAEoAgQiAiABKAJoTw0AIAEgAkEBajYCBCACLQAADAMLBSABKAIEIgIgASgCaEkEf0EBIQcgASACQQFqNgIEIAItAAAFQQEhByABEFsLIQIMAQsLIAEQWwshAkEBIQkgAkEwRw0AA0AgE0J/fCETAn8gASgCBCICIAEoAmhJBEAgASACQQFqNgIEIAItAAAMAQsgARBbCyICQTBGDQALQQEhBwsgBkEANgKQBgJ+AkACQAJAAkAgAkEuRiIKIAJBUGoiCEEJTXIEQANAAkAgCkEBcQRAIAlFBEAgFCETQQEhCQwCCyAHRSEHDAQLIBRCAXwhFCALQfwPTARAIA0gFKcgAkEwRhshDSAGQZAGaiALQQJ0aiIHIAwEfyACIAcoAgBBCmxqQVBqBSAICzYCAEEBIQdBACAMQQFqIgIgAkEJRiICGyEMIAIgC2ohCwwBCyACQTBGDQAgBiAGKAKARkEBcjYCgEZB3I8BIQ0LAn8gASgCBCICIAEoAmhJBEAgASACQQFqNgIEIAItAAAMAQsgARBbCyICQS5GIgogAkFQaiIIQQpJcg0ACwsgEyAUIAkbIRMgB0UgAkFfcUHFAEdyRQRAAkAgARDcBSIVQoCAgICAgICAgH9SDQBCACEVIAEoAmhFDQAgASABKAIEQX9qNgIECyAHRQ0DIBMgFXwhEwwECyAHRSEHIAJBAEgNAQsgASgCaEUNACABIAEoAgRBf2o2AgQLIAdFDQELQZSnBEEcNgIAQgAhFCABEJsEQgAMAQsgBigCkAYiAUUEQCAGIAW3RAAAAAAAAAAAohC2ASAGKQMAIRQgBikDCAwBCyATIBRSIBRCCVVyIANBHkxBACABIAN2G3JFBEAgBkEwaiAFEIABIAZBIGogARCgAiAGQRBqIAYpAzAgBikDOCAGKQMgIAYpAygQMyAGKQMQIRQgBikDGAwBCyATIARBfm2tVQRAQZSnBEHEADYCACAGQeAAaiAFEIABIAZB0ABqIAYpA2AgBikDaEJ/Qv///////7///wAQMyAGQUBrIAYpA1AgBikDWEJ/Qv///////7///wAQMyAGKQNAIRQgBikDSAwBCyATIARBnn5qrFMEQEGUpwRBxAA2AgAgBkGQAWogBRCAASAGQYABaiAGKQOQASAGKQOYAUIAQoCAgICAgMAAEDMgBkHwAGogBikDgAEgBikDiAFCAEKAgICAgIDAABAzIAYpA3AhFCAGKQN4DAELIAwEQCAMQQhMBEAgBkGQBmogC0ECdGoiAigCACEBA0AgAUEKbCEBIAxBAWoiDEEJRw0ACyACIAE2AgALIAtBAWohCwsCQCANIBOnIglKIA1BCU5yIAlBEUpyDQAgCUEJRgRAIAZBwAFqIAUQgAEgBkGwAWogBigCkAYQoAIgBkGgAWogBikDwAEgBikDyAEgBikDsAEgBikDuAEQMyAGKQOgASEUIAYpA6gBDAILIAlBCEwEQCAGQZACaiAFEIABIAZBgAJqIAYoApAGEKACIAZB8AFqIAYpA5ACIAYpA5gCIAYpA4ACIAYpA4gCEDMgBkHgAWpBACAJa0ECdEHQowRqKAIAEIABIAZB0AFqIAYpA/ABIAYpA/gBIAYpA+ABIAYpA+gBENkFIAYpA9ABIRQgBikD2AEMAgsgAyAJQX1sakEbaiIBQR5MQQAgBigCkAYiAiABdhsNACAGQeACaiAFEIABIAZB0AJqIAIQoAIgBkHAAmogBikD4AIgBikD6AIgBikD0AIgBikD2AIQMyAGQbACaiAJQQJ0QYijBGooAgAQgAEgBkGgAmogBikDwAIgBikDyAIgBikDsAIgBikDuAIQMyAGKQOgAiEUIAYpA6gCDAELA0AgBkGQBmogCyICQX9qIgtBAnRqKAIARQ0AC0EAIQwCQCAJQQlvIgFFBEBBACEHDAELIAEgAUEJaiAJQX9KGyEIAkAgAkUEQEEAIQdBACECDAELQYCU69wDQQAgCGtBAnRB0KMEaigCACILbSENQQAhCkEAIQFBACEHA0AgBkGQBmogAUECdGoiDiAKIA4oAgAiDiALbiIPaiIKNgIAIAdBAWpB/w9xIAcgCkUgASAHRnEiChshByAJQXdqIAkgChshCSANIA4gCyAPbGtsIQogAUEBaiIBIAJHDQALIApFDQAgBkGQBmogAkECdGogCjYCACACQQFqIQILIAkgCGtBCWohCQsDQCAGQZAGaiAHQQJ0aiENAkADQCAJQSROBEAgCUEkRw0CIA0oAgBB0en5BE8NAgsgAkH/D2ohC0EAIQogAiEIA0AgCCECAn9BACAKrSAGQZAGaiALQf8PcSIBQQJ0aiIINQIAQh2GfCITQoGU69wDVA0AGiATIBNCgJTr3AOAIhRCgJTr3AN+fSETIBSnCyEKIAggE6ciCDYCACACIAIgAiABIAgbIAEgB0YbIAEgAkF/akH/D3FHGyEIIAFBf2ohCyABIAdHDQALIAxBY2ohDCAKRQ0ACyAIIAdBf2pB/w9xIgdGBEAgBkGQBmogCEH+D2pB/w9xQQJ0aiIBIAEoAgAgBkGQBmogCEF/akH/D3EiAkECdGooAgByNgIACyAJQQlqIQkgBkGQBmogB0ECdGogCjYCAAwBCwsCQANAIAJBAWpB/w9xIQsgBkGQBmogAkF/akH/D3FBAnRqIQ0DQEEJQQEgCUEtShshCgJAA0AgByEIQQAhAQJAA0ACQCABIAhqQf8PcSIHIAJGDQAgBkGQBmogB0ECdGooAgAiByABQQJ0QaCjBGooAgAiDkkNACAHIA5LDQIgAUEBaiIBQQRHDQELCyAJQSRHDQBCACETQQAhAUIAIRQDQCACIAEgCGpB/w9xIgdGBEAgAkEBakH/D3EiAkECdCAGakEANgKMBgsgBkGABmogEyAUQgBCgICAgOWat47AABAzIAZB8AVqIAZBkAZqIAdBAnRqKAIAEKACIAZB4AVqIAYpA4AGIAYpA4gGIAYpA/AFIAYpA/gFEHogBikD6AUhFCAGKQPgBSETIAFBAWoiAUEERw0ACyAGQdAFaiAFEIABIAZBwAVqIBMgFCAGKQPQBSAGKQPYBRAzIAYpA8gFIRRCACETIAYpA8AFIRUgDEHxAGoiByAEayIEQQAgBEEAShsgAyAEIANIIgsbIgFB8ABMDQIMBQsgCiAMaiEMIAIhByACIAhGDQALQYCU69wDIAp2IQ5BfyAKdEF/cyEPQQAhASAIIQcDQCAGQZAGaiAIQQJ0aiIQIAEgECgCACIQIAp2aiIBNgIAIAdBAWpB/w9xIAcgAUUgByAIRnEiARshByAJQXdqIAkgARshCSAPIBBxIA5sIQEgCEEBakH/D3EiCCACRw0ACyABRQ0BIAcgC0cEQCAGQZAGaiACQQJ0aiABNgIAIAshAgwDCyANIA0oAgBBAXI2AgAgCyEHDAELCwsgBkGQBWpEAAAAAAAA8D9B4QEgAWsQyQEQtgEgBkGwBWogBikDkAUgBikDmAUgFSAUEN4FIAYpA7gFIRcgBikDsAUhGCAGQYAFakQAAAAAAADwP0HxACABaxDJARC2ASAGQaAFaiAVIBQgBikDgAUgBikDiAUQ1AUgBkHwBGogFSAUIAYpA6AFIhMgBikDqAUiFhCaBCAGQeAEaiAYIBcgBikD8AQgBikD+AQQeiAGKQPoBCEUIAYpA+AEIRULAkAgCEEEakH/D3EiAyACRg0AAkAgBkGQBmogA0ECdGooAgAiA0H/ybXuAU0EQCADRUEAIAhBBWpB/w9xIAJGGw0BIAZB8ANqIAW3RAAAAAAAANA/ohC2ASAGQeADaiATIBYgBikD8AMgBikD+AMQeiAGKQPoAyEWIAYpA+ADIRMMAQsgA0GAyrXuAUcEQCAGQdAEaiAFt0QAAAAAAADoP6IQtgEgBkHABGogEyAWIAYpA9AEIAYpA9gEEHogBikDyAQhFiAGKQPABCETDAELIAW3IRkgAiAIQQVqQf8PcUYEQCAGQZAEaiAZRAAAAAAAAOA/ohC2ASAGQYAEaiATIBYgBikDkAQgBikDmAQQeiAGKQOIBCEWIAYpA4AEIRMMAQsgBkGwBGogGUQAAAAAAADoP6IQtgEgBkGgBGogEyAWIAYpA7AEIAYpA7gEEHogBikDqAQhFiAGKQOgBCETCyABQe8ASg0AIAZB0ANqIBMgFkIAQoCAgICAgMD/PxDUBSAGKQPQAyAGKQPYA0IAQgAQ/wENACAGQcADaiATIBZCAEKAgICAgIDA/z8QeiAGKQPIAyEWIAYpA8ADIRMLIAZBsANqIBUgFCATIBYQeiAGQaADaiAGKQOwAyAGKQO4AyAYIBcQmgQgBikDqAMhFCAGKQOgAyEVAkAgB0H/////B3FBfiARa0wNACAGIBRC////////////AIM3A5gDIAYgFTcDkAMgBkGAA2ogFSAUQgBCgICAgICAgP8/EDMgBikDkAMgBikDmANCgICAgICAgLjAABDaBSECIBQgBikDiAMgAkEASCIDGyEUIBUgBikDgAMgAxshFSALIAMgASAER3JxIBMgFkIAQgAQ/wFBAEdxRUEAIAwgAkF/SmoiDEHuAGogEkwbDQBBlKcEQcQANgIACyAGQfACaiAVIBQgDBDdBSAGKQPwAiEUIAYpA/gCCyETIAAgFDcDACAAIBM3AwggBkGQxgBqJAAL/gwCCH8HfiMAQbADayIFJAACfyABKAIEIgYgASgCaEkEQCABIAZBAWo2AgQgBi0AAAwBCyABEFsLIQYCQAJ/A0AgBkEwRwRAAkAgBkEuRw0EIAEoAgQiBiABKAJoTw0AIAEgBkEBajYCBCAGLQAADAMLBSABKAIEIgYgASgCaEkEf0EBIQggASAGQQFqNgIEIAYtAAAFQQEhCCABEFsLIQYMAQsLIAEQWwshBkEBIQkgBkEwRw0AA0AgEUJ/fCERAn8gASgCBCIGIAEoAmhJBEAgASAGQQFqNgIEIAYtAAAMAQsgARBbCyIGQTBGDQALQQEhCAtCgICAgICAwP8/IQ0DQAJAIAZBIHIhCgJAAkAgBkFQaiILQQpJDQAgBkEuR0EAIApBn39qQQVLGw0CIAZBLkcNACAJDQJBASEJIA8hEQwBCyAKQal/aiALIAZBOUobIQYCQCAPQgdXBEAgBiAHQQR0aiEHDAELIA9CHFcEQCAFQTBqIAYQgAEgBUEgaiASIA1CAEKAgICAgIDA/T8QMyAFQRBqIAUpAyAiEiAFKQMoIg0gBSkDMCAFKQM4EDMgBSAOIBAgBSkDECAFKQMYEHogBSkDCCEQIAUpAwAhDgwBCyAMIAZFcg0AIAVB0ABqIBIgDUIAQoCAgICAgID/PxAzIAVBQGsgDiAQIAUpA1AgBSkDWBB6IAUpA0ghEEEBIQwgBSkDQCEOCyAPQgF8IQ9BASEICyABKAIEIgYgASgCaEkEfyABIAZBAWo2AgQgBi0AAAUgARBbCyEGDAELCwJ+AkAgCEUEQCABKAJoRQ0BIAEgASgCBCICQX9qNgIEIAEgAkF+ajYCBCAJRQ0BIAEgAkF9ajYCBAwBCyAPQgdXBEAgDyENA0AgB0EEdCEHIA1CAXwiDUIIUg0ACwsCQCAGQV9xQdAARgRAIAEQ3AUiDUKAgICAgICAgIB/Ug0BQgAhDSABKAJoRQ0BIAEgASgCBEF/ajYCBAwBC0IAIQ0gASgCaEUNACABIAEoAgRBf2o2AgQLIAdFBEAgBUHwAGogBLdEAAAAAAAAAACiELYBIAUpA3AhDiAFKQN4DAILIBEgDyAJG0IChiANfEJgfCIPQQAgA2utVQRAQZSnBEHEADYCACAFQaABaiAEEIABIAVBkAFqIAUpA6ABIAUpA6gBQn9C////////v///ABAzIAVBgAFqIAUpA5ABIAUpA5gBQn9C////////v///ABAzIAUpA4ABIQ4gBSkDiAEMAgsgDyADQZ5+aqxZBEAgB0F/SgRAA0AgBUGgA2ogDiAQQgBCgICAgICAwP+/fxB6IA4gEEKAgICAgICA/z8Q2gUhASAFQZADaiAOIBAgDiAFKQOgAyABQQBIIgYbIBAgBSkDqAMgBhsQeiAPQn98IQ8gBSkDmAMhECAFKQOQAyEOIAdBAXQgAUF/SnIiB0F/Sg0ACwsCfiAPIAOsfUIgfCINpyIBQQAgAUEAShsgAiANIAKtUxsiAUHxAE4EQCAFQYADaiAEEIABIAUpA4gDIREgBSkDgAMhEkIADAELIAVB4AJqRAAAAAAAAPA/QZABIAFrEMkBELYBIAVB0AJqIAQQgAEgBUHwAmogBSkD4AIgBSkD6AIgBSkD0AIiEiAFKQPYAiIREN4FIAUpA/gCIRMgBSkD8AILIQ0gBUHAAmogByAHQQFxRSAOIBBCAEIAEP8BQQBHIAFBIEhxcSIBahCgAiAFQbACaiASIBEgBSkDwAIgBSkDyAIQMyAFQZACaiAFKQOwAiAFKQO4AiANIBMQeiAFQaACakIAIA4gARtCACAQIAEbIBIgERAzIAVBgAJqIAUpA6ACIAUpA6gCIAUpA5ACIAUpA5gCEHogBUHwAWogBSkDgAIgBSkDiAIgDSATEJoEIAUpA/ABIg0gBSkD+AEiEUIAQgAQ/wFFBEBBlKcEQcQANgIACyAFQeABaiANIBEgD6cQ3QUgBSkD4AEhDiAFKQPoAQwCC0GUpwRBxAA2AgAgBUHQAWogBBCAASAFQcABaiAFKQPQASAFKQPYAUIAQoCAgICAgMAAEDMgBUGwAWogBSkDwAEgBSkDyAFCAEKAgICAgIDAABAzIAUpA7ABIQ4gBSkDuAEMAQsgBUHgAGogBLdEAAAAAAAAAACiELYBIAUpA2AhDiAFKQNoCyEPIAAgDjcDACAAIA83AwggBUGwA2okAAvFBwIGfwJ+IwBBMGsiBCQAQeCjBCgCACEGQdSjBCgCACEHA0ACfyABKAIEIgIgASgCaEkEQCABIAJBAWo2AgQgAi0AAAwBCyABEFsLIgIQ3wUNAAtBASEFAkACQCACQVVqDgMAAQABC0F/QQEgAkEtRhshBSABKAIEIgIgASgCaEkEQCABIAJBAWo2AgQgAi0AACECDAELIAEQWyECCwJAAkACQANAIANBiaMEaiwAACACQSByRgRAAkAgA0EGSw0AIAEoAgQiAiABKAJoSQRAIAEgAkEBajYCBCACLQAAIQIMAQsgARBbIQILIANBAWoiA0EIRw0BDAILCyADQQNHBEAgA0EIRg0BIANBBEkNAiADQQhGDQELIAEoAmgiAgRAIAEgASgCBEF/ajYCBAsgA0EESQ0AA0AgAgRAIAEgASgCBEF/ajYCBAsgA0F/aiIDQQNLDQALCyAEIAWyQwAAgH+UEIYJIAQpAwghCCAEKQMAIQkMAQsCQAJAAkAgAw0AQQAhAwNAIANBkqMEaiwAACACQSByRw0BAkAgA0EBSw0AIAEoAgQiAiABKAJoSQRAIAEgAkEBajYCBCACLQAAIQIMAQsgARBbIQILIANBAWoiA0EDRw0ACwwBCwJAAkAgAw4EAAEBAgELAkAgAkEwRw0AAn8gASgCBCIDIAEoAmhJBEAgASADQQFqNgIEIAMtAAAMAQsgARBbC0FfcUHYAEYEQCAEQRBqIAEgByAGIAUQjQkgBCkDGCEIIAQpAxAhCQwFCyABKAJoRQ0AIAEgASgCBEF/ajYCBAsgBEEgaiABIAIgByAGIAUQjAkgBCkDKCEIIAQpAyAhCQwDCyABKAJoBEAgASABKAIEQX9qNgIECwwBCwJAAn8gASgCBCIDIAEoAmhJBEAgASADQQFqNgIEIAMtAAAMAQsgARBbC0EoRgRAQQEhAwwBC0KAgICAgIDg//8AIQggASgCaEUNAiABIAEoAgRBf2o2AgQMAgsDQAJ/IAEoAgQiAiABKAJoSQRAIAEgAkEBajYCBCACLQAADAELIAEQWwsiAkFQakEKSSACQb9/akEaSXIgAkHfAEZyRUEAIAJBn39qQRpPG0UEQCADQQFqIQMMAQsLQoCAgICAgOD//wAhCCACQSlGDQEgASgCaCICBEAgASABKAIEQX9qNgIECyADRQ0BA0AgA0F/aiEDIAIEQCABIAEoAgRBf2o2AgQLIAMNAAsMAQtBlKcEQRw2AgAgARCbBAsgACAJNwMAIAAgCDcDCCAEQTBqJAALtAICBH8DfiMAQRBrIgQkAEKAgICA4AAhCQJAIAAgAykDACIKEJsIIgZFDQAgBEIANwMIIAJBAk4EQCAAIARBCGogAykDCBDCAQ0BCyAGLQAEBEAgABBxDAELIAQpAwgiCCAGKAIAIgWsVgRAIABBrdsBEGoMAQsgBSAIpyIHayEFAkAgAkEDSA0AIAMpAxAiCBARDQAgACAEIAgQwgENASAEKQMAIgggBa1WBEAgAEHA2wEQagwCCyAIpyEFCyAAIAFBHhBtIgEQDA0AAkACQCAGLQAEBEAgABBxDAELIABBGBAuIgINAQsgACABEAsMAQsgAiABpyIANgIIIAoQDiEJIAIgBTYCFCACIAc2AhAgAiAJPgIMIAIgBkEMahBNIAAgAjYCICABIQkLIARBEGokACAJC0EBAn8jAEEQayIBJABBfyECAkAgABCRCQ0AIAAgAUEPakEBIAAoAiARAABBAUcNACABLQAPIQILIAFBEGokACACC3wBAn8gACAALQBKIgFBf2ogAXI6AEogACgCFCAAKAIcSwRAIABBAEEAIAAoAiQRAAAaCyAAQQA2AhwgAEIANwMQIAAoAgAiAUEEcQRAIAAgAUEgcjYCAEF/DwsgACAAKAIsIAAoAjBqIgI2AgggACACNgIEIAFBG3RBH3ULfgEFfwNAIAAiAUEBaiEAIAEsAAAQ3wUNAAsCQAJAAkAgASwAACIFQVVqDgMBAgACC0EBIQMLIAAsAAAhBSAAIQEgAyEECyAFEEYEQANAIAJBCmwgASwAAGtBMGohAiABLAABIQAgAUEBaiEBIAAQRg0ACwsgAkEAIAJrIAQbCy4BAX8gAEHgpwQoAgA2AjhB4KcEKAIAIgEEQCABIAA2AjQLQeCnBCAANgIAIAALoQEBBH9BACAAKAJUIgMoAgQiBCADKAIAIgVrIgYgBiAESxsiBCACSQRAIAAgACgCAEEQcjYCACAEIQILIAEgAygCDCAFaiACECQaIAMgAygCACACaiIFNgIAIAAgACgCLCIBNgIEIAAgASAAKAIwIgAgBCACayIEIAQgAEsbIgBqNgIIIAEgAygCDCAFaiAAECQaIAMgAygCACAAajYCACACC4sBAQF/IwBBEGsiAyQAAn4CQCACQQNPDQAgACgCVCEAIANBADYCBCADIAAoAgA2AgggAyAAKAIENgIMQQAgA0EEaiACQQJ0aigCACICa6wgAVUNACAAKAIIIAJrrCABUw0AIAAgAiABp2oiADYCACAArQwBC0GUpwRBHDYCAEJ/CyEBIANBEGokACABC8ECAQN/QYAIIQJBpAhBKxCnAyEDAkACQEGFowRBpAgsAAAQpwNFBEBBlKcEQRw2AgAMAQsgAEEBckUEQEGUpwRBMDYCAAwBC0GsCUGsESAAGxCECSIBDQELQQAPCyABQf8BOgBLIAFBfzYCPCABQYAINgIwIAFBgAg2ApgBIAEgAUGQAWo2AlQgASABQawBajYCLCABIAAgAUGsCWogABsiADYCnAEgAUGkCCwAADYCoAEgA0UEQCABQQhBBEGkCC0AAEHyAEYbNgIACwJAQaQILQAAIgNB8gBHBEAgA0HhAEcNASABIABBAEGACBCAAiICIABrQYAIIAIbIgI2ApABCyABIAI2ApQBCyABQfACNgIoIAFB8QI2AiQgAUHyAjYCICABQfMCNgIMQZynBCgCAEUEQCABQX82AkwLIAEQkwkLKQAgASABKAIAQQ9qQXBxIgFBEGo2AgAgACABKQMAIAEpAwgQ2AU5AwAL/hYDEn8CfgF8IwBBsARrIgkkACAJQQA2AiwCfyABvSIYQn9XBEBBASESIAGaIgG9IRhB4KIEDAELQQEhEkHjogQgBEGAEHENABpB5qIEIARBAXENABpBACESQQEhE0HhogQLIRUCQCAYQoCAgICAgID4/wCDQoCAgICAgID4/wBRBEAgAEEgIAIgEkEDaiINIARB//97cRBzIAAgFSASEGMgAEH7ogRB/6IEIAVBIHEiAxtB86IEQfeiBCADGyABIAFiG0EDEGMMAQsgCUEQaiEQAkACfwJAIAEgCUEsahDlBSIBIAGgIgFEAAAAAAAAAABiBEAgCSAJKAIsIgZBf2o2AiwgBUEgciIWQeEARw0BDAMLIAVBIHIiFkHhAEYNAiAJKAIsIQtBBiADIANBAEgbDAELIAkgBkFjaiILNgIsIAFEAAAAAAAAsEGiIQFBBiADIANBAEgbCyEKIAlBMGogCUHQAmogC0EASBsiDyEIA0AgCAJ/IAFEAAAAAAAA8EFjIAFEAAAAAAAAAABmcQRAIAGrDAELQQALIgM2AgAgCEEEaiEIIAEgA7ihRAAAAABlzc1BoiIBRAAAAAAAAAAAYg0ACwJAIAtBAUgEQCALIQMgCCEGIA8hBwwBCyAPIQcgCyEDA0AgA0EdIANBHUgbIQwCQCAIQXxqIgYgB0kNACAMrSEZQgAhGANAIAYgGEL/////D4MgBjUCACAZhnwiGCAYQoCU69wDgCIYQoCU69wDfn0+AgAgBkF8aiIGIAdPDQALIBinIgNFDQAgB0F8aiIHIAM2AgALA0AgCCIGIAdLBEAgBkF8aiIIKAIARQ0BCwsgCSAJKAIsIAxrIgM2AiwgBiEIIANBAEoNAAsLIANBf0wEQCAKQRlqQQltQQFqIREgFkHmAEYhDQNAQQlBACADayADQXdIGyEXAkAgByAGTwRAIAcgB0EEaiAHKAIAGyEHDAELQYCU69wDIBd2IRRBfyAXdEF/cyEOQQAhAyAHIQgDQCAIIAMgCCgCACIMIBd2ajYCACAMIA5xIBRsIQMgCEEEaiIIIAZJDQALIAcgB0EEaiAHKAIAGyEHIANFDQAgBiADNgIAIAZBBGohBgsgCSAJKAIsIBdqIgM2AiwgDyAHIA0bIgggEUECdGogBiAGIAhrQQJ1IBFKGyEGIANBAEgNAAsLQQAhCAJAIAcgBk8NACAPIAdrQQJ1QQlsIQhBCiEDIAcoAgAiDEEKSQ0AA0AgCEEBaiEIIAwgA0EKbCIDTw0ACwsgCkEAIAggFkHmAEYbayAWQecARiAKQQBHcWsiAyAGIA9rQQJ1QQlsQXdqSARAIANBgMgAaiIOQQltIgxBAnQgCUEwakEEciAJQdQCaiALQQBIG2pBgGBqIQ1BCiEDIA4gDEEJbGsiDkEHTARAA0AgA0EKbCEDIA5BAWoiDkEIRw0ACwsCQEEAIAYgDUEEaiIRRiANKAIAIg4gDiADbiIMIANsayIUGw0ARAAAAAAAAOA/RAAAAAAAAPA/RAAAAAAAAPg/IBQgA0EBdiILRhtEAAAAAAAA+D8gBiARRhsgFCALSRshGkQBAAAAAABAQ0QAAAAAAABAQyAMQQFxGyEBAkAgEw0AIBUtAABBLUcNACAamiEaIAGaIQELIA0gDiAUayILNgIAIAEgGqAgAWENACANIAMgC2oiAzYCACADQYCU69wDTwRAA0AgDUEANgIAIA1BfGoiDSAHSQRAIAdBfGoiB0EANgIACyANIA0oAgBBAWoiAzYCACADQf+T69wDSw0ACwsgDyAHa0ECdUEJbCEIQQohAyAHKAIAIgtBCkkNAANAIAhBAWohCCALIANBCmwiA08NAAsLIA1BBGoiAyAGIAYgA0sbIQYLA0AgBiILIAdNIgxFBEAgC0F8aiIGKAIARQ0BCwsCQCAWQecARwRAIARBCHEhEwwBCyAIQX9zQX8gCkEBIAobIgYgCEogCEF7SnEiAxsgBmohCkF/QX4gAxsgBWohBSAEQQhxIhMNAEF3IQYCQCAMDQAgC0F8aigCACIMRQ0AQQohDkEAIQYgDEEKcA0AA0AgBiIDQQFqIQYgDCAOQQpsIg5wRQ0ACyADQX9zIQYLIAsgD2tBAnVBCWwhAyAFQV9xQcYARgRAQQAhEyAKIAMgBmpBd2oiA0EAIANBAEobIgMgCiADSBshCgwBC0EAIRMgCiADIAhqIAZqQXdqIgNBACADQQBKGyIDIAogA0gbIQoLIAogE3IiFEEARyEOIABBICACAn8gCEEAIAhBAEobIAVBX3EiDEHGAEYNABogECAIIAhBH3UiA2ogA3OtIBAQoQIiBmtBAUwEQANAIAZBf2oiBkEwOgAAIBAgBmtBAkgNAAsLIAZBfmoiESAFOgAAIAZBf2pBLUErIAhBAEgbOgAAIBAgEWsLIAogEmogDmpqQQFqIg0gBBBzIAAgFSASEGMgAEEwIAIgDSAEQYCABHMQcwJAAkACQCAMQcYARgRAIAlBEGpBCHIhAyAJQRBqQQlyIQggDyAHIAcgD0sbIgUhBwNAIAc1AgAgCBChAiEGAkAgBSAHRwRAIAYgCUEQak0NAQNAIAZBf2oiBkEwOgAAIAYgCUEQaksNAAsMAQsgBiAIRw0AIAlBMDoAGCADIQYLIAAgBiAIIAZrEGMgB0EEaiIHIA9NDQALIBQEQCAAQYOjBEEBEGMLIApBAUggByALT3INAQNAIAc1AgAgCBChAiIGIAlBEGpLBEADQCAGQX9qIgZBMDoAACAGIAlBEGpLDQALCyAAIAYgCkEJIApBCUgbEGMgCkF3aiEGIAdBBGoiByALTw0DIApBCUohAyAGIQogAw0ACwwCCwJAIApBAEgNACALIAdBBGogCyAHSxshBSAJQRBqQQhyIQMgCUEQakEJciELIAchCANAIAsgCDUCACALEKECIgZGBEAgCUEwOgAYIAMhBgsCQCAHIAhHBEAgBiAJQRBqTQ0BA0AgBkF/aiIGQTA6AAAgBiAJQRBqSw0ACwwBCyAAIAZBARBjIAZBAWohBiATRUEAIApBAUgbDQAgAEGDowRBARBjCyAAIAYgCyAGayIGIAogCiAGShsQYyAKIAZrIQogCEEEaiIIIAVPDQEgCkF/Sg0ACwsgAEEwIApBEmpBEkEAEHMgACARIBAgEWsQYwwCCyAKIQYLIABBMCAGQQlqQQlBABBzCwwBCyAVQQlqIBUgBUEgcSILGyEKAkAgA0ELSw0AQQwgA2siBkUNAEQAAAAAAAAgQCEaA0AgGkQAAAAAAAAwQKIhGiAGQX9qIgYNAAsgCi0AAEEtRgRAIBogAZogGqGgmiEBDAELIAEgGqAgGqEhAQsgECAJKAIsIgYgBkEfdSIGaiAGc60gEBChAiIGRgRAIAlBMDoADyAJQQ9qIQYLIBJBAnIhDyAJKAIsIQggBkF+aiIMIAVBD2o6AAAgBkF/akEtQSsgCEEASBs6AAAgBEEIcSEIIAlBEGohBwNAIAciBQJ/IAGZRAAAAAAAAOBBYwRAIAGqDAELQYCAgIB4CyIGQdCiBGotAAAgC3I6AAAgBUEBaiIHIAlBEGprQQFHIAggA0EASnJFQQAgASAGt6FEAAAAAAAAMECiIgFEAAAAAAAAAABhG3JFBEAgBUEuOgABIAVBAmohBwsgAUQAAAAAAAAAAGINAAsgAEEgIAIgDyAQIAlBEGprIAxrIAdqIAMgEGogDGtBAmogA0UgByAJa0FuaiADTnIbIgNqIg0gBBBzIAAgCiAPEGMgAEEwIAIgDSAEQYCABHMQcyAAIAlBEGogByAJQRBqayIFEGMgAEEwIAMgBSAQIAxrIgNqa0EAQQAQcyAAIAwgAxBjCyAAQSAgAiANIARBgMAAcxBzIAlBsARqJAAgAiANIA0gAkgbCy0AIABQRQRAA0AgAUF/aiIBIACnQQdxQTByOgAAIABCA4giAEIAUg0ACwsgAQs1ACAAUEUEQANAIAFBf2oiASAAp0EPcUHQogRqLQAAIAJyOgAAIABCBIgiAEIAUg0ACwsgAQuLAgACQCAABH8gAUH/AE0NAQJAQaClBCgCACgCAEUEQCABQYB/cUGAvwNGDQMMAQsgAUH/D00EQCAAIAFBP3FBgAFyOgABIAAgAUEGdkHAAXI6AABBAg8LIAFBgLADT0EAIAFBgEBxQYDAA0cbRQRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMPCyABQYCAfGpB//8/TQRAIAAgAUE/cUGAAXI6AAMgACABQRJ2QfABcjoAACAAIAFBBnZBP3FBgAFyOgACIAAgAUEMdkE/cUGAAXI6AAFBBA8LC0GUpwRBGTYCAEF/BUEBCw8LIAAgAToAAEEBCyIBAX8jAEEQayICJAAgAiABNgIMIAAgARCdCSACQRBqJAALiwEBAn8jAEGgAWsiAiQAIAJBCGpB0J0EQZABECQaIAIgADYCNCACIAA2AhwgAkF+IABrIgNB/////wdB/////wcgA0sbIgM2AjggAiAAIANqIgA2AiQgAiAANgIYIAJBCGpBnhkgARCcBCADBEAgAigCHCIAIAAgAigCGEZrQQA6AAALIAJBoAFqJAALEwAgAEHQ1gFBABAVQoCAgIDgAAszAQF/IAAoAhQiAyABIAIgACgCECADayIBIAEgAksbIgEQJBogACAAKAIUIAFqNgIUIAILkQEBBH8gACgCTEEATgRAQQEhAgsgACgCAEEBcSIERQRAIAAoAjQiAQRAIAEgACgCODYCOAsgACgCOCIDBEAgAyABNgI0CyAAQeCnBCgCAEYEQEHgpwQgAzYCAAsLIAAQ5wUaIAAgACgCDBEEABogACgCYCIBBEAgARD+AQsCQCAERQRAIAAQ/gEMAQsgAkUNAAsLegEBfyAAKAJMQQBIBEACQCAALABLQQpGDQAgACgCFCIBIAAoAhBPDQAgACABQQFqNgIUIAFBCjoAAA8LIAAQ0gUPCwJAAkAgACwAS0EKRg0AIAAoAhQiASAAKAIQTw0AIAAgAUEBajYCFCABQQo6AAAMAQsgABDSBQsLBQAgAJ0LywEBAn8jAEEQayIBJAACQCAAvUIgiKdB/////wdxIgJB+8Ok/wNNBEAgAkGAgMDyA0kNASAARAAAAAAAAAAAQQAQ1QIhAAwBCyACQYCAwP8HTwRAIAAgAKEhAAwBCwJAAkACQAJAIAAgARCiBEEDcQ4DAAECAwsgASsDACABKwMIQQEQ1QIhAAwDCyABKwMAIAErAwgQ1AIhAAwCCyABKwMAIAErAwhBARDVApohAAwBCyABKwMAIAErAwgQ1AKaIQALIAFBEGokACAAC0IBAX4jAEEQayICJABCgICAgOAAIQQgACACQQhqIAMpAwAQwgFFBEAgACABIAIpAwhBFBDlAyEECyACQRBqJAAgBAu6AgMBfwF+A3wCQAJAIAC9IgJCIIinQf////8HcSIBQYCAwP8DTwRAIAKnIAFBgIDAgHxqcg0BIABEGC1EVPsh+T+iRAAAAAAAAHA4oA8LIAFB/////gNNBEAgAUGAgEBqQYCAgPIDSQ0CIAAgAKIQ1gIgAKIgAKAPC0QAAAAAAADwPyAAmaFEAAAAAAAA4D+iIgSfIQAgBBDWAiEFAnwgAUGz5rz/A08EQEQYLURU+yH5PyAAIAAgBaKgIgAgAKBEB1wUMyamkbygoQwBC0QYLURU+yHpPyAAvUKAgICAcIO/IgMgA6ChIAAgAKAgBaJEB1wUMyamkTwgBCADIAOioSAAIAOgoyIAIACgoaGhRBgtRFT7Iek/oAsiACAAmiACQn9VGw8LRAAAAAAAAAAAIAAgAKGjIQALIAALdgEBfyAAvUI0iKdB/w9xIgFB/wdNBEAgAEQAAAAAAADwv6AiACAAIACiIAAgAKCgn6AQpgMPCyABQZgITQRAIAAgAKBEAAAAAAAA8L8gACAAokQAAAAAAADwv6CfIACgo6AQ0wIPCyAAENMCRO85+v5CLuY/oAsFACAAnAubAQIBfwF+IAC9Qv///////////wCDIgK/IQACfCACQiCIpyIBQcHcmP8DTQRARAAAAAAAAPA/IAFBgIDA8gNJDQEaIAAQogIiACAAoiAARAAAAAAAAPA/oCIAIACgo0QAAAAAAADwP6APCyABQcHcmIQETQRAIAAQowQiAEQAAAAAAADwPyAAo6BEAAAAAAAA4D+iDwsgABDrBQsLBQAgAJsLhAEBAn8jAEEQayIBJAACQCAAvUIgiKdB/////wdxIgJB+8Ok/wNNBEAgAkGAgIDyA0kNASAARAAAAAAAAAAAQQAQ6AUhAAwBCyACQYCAwP8HTwRAIAAgAKEhAAwBCyAAIAEQogQhAiABKwMAIAErAwggAkEBcRDoBSEACyABQRBqJAAgAAu8AgMDfwN+AXwjAEEgayICJAAgAL1C////////////AIMiBSABvUL///////////8AgyIGIAUgBlQbIge/IQACQCAHQjSIpyIDQf8PRg0AIAUgBiAFIAZWGyIFvyEBAkAgB1ANACAFQjSIpyIEQf8PRg0AIAQgA2tBwQBOBEAgASAAoCEADAILAnwgBEH+C08EQCAARAAAAAAAADAUoiEAIAFEAAAAAAAAMBSiIQFEAAAAAAAAsGsMAQtEAAAAAAAA8D8gA0G8BEsNABogAEQAAAAAAACwa6IhACABRAAAAAAAALBroiEBRAAAAAAAADAUCyEIIAJBGGogAkEQaiABEOoFIAJBCGogAiAAEOoFIAggAisDACACKwMQoCACKwMIoCACKwMYoJ+iIQAMAQsgASEACyACQSBqJAAgAAutAwIFfwF+IAG9Qv///////////wCDQoCAgICAgID4/wBYQQAgAL1C////////////AINCgYCAgICAgPj/AFQbRQRAIAAgAaAPCyABvSIHQiCIpyICQYCAwIB8aiAHpyIFckUEQCAAEKEEDwsgB0I+iKdBAnEiBiAAvSIHQj+Ip3IhAwJAAkAgB0IgiKdB/////wdxIgQgB6dyRQRAAkAgA0ECaw4CAgADC0QYLURU+yEJwA8LIAJB/////wdxIgIgBXJFBEBEGC1EVPsh+T8gAKYPCwJAIAJBgIDA/wdGBEAgBEGAgMD/B0cNASADQQN0QaCcBGorAwAPCyAEQYCAwP8HR0EAIAJBgICAIGogBE8bRQRARBgtRFT7Ifk/IACmDwsCfCAGBEBEAAAAAAAAAAAgBEGAgIAgaiACSQ0BGgsgACABo5kQoQQLIQACQAJAAkAgAw4DBQABAgsgAJoPC0QYLURU+yEJQCAARAdcFDMmpqG8oKEPCyAARAdcFDMmpqG8oEQYLURU+yEJwKAPCyADQQN0QcCcBGorAwAPC0QYLURU+yEJQCEACyAAC8cBAQJ/IwBBEGsiASQAAnwgAL1CIIinQf////8HcSICQfvDpP8DTQRARAAAAAAAAPA/IAJBnsGa8gNJDQEaIABEAAAAAAAAAAAQ1AIMAQsgACAAoSACQYCAwP8HTw0AGgJAAkACQAJAIAAgARCiBEEDcQ4DAAECAwsgASsDACABKwMIENQCDAMLIAErAwAgASsDCEEBENUCmgwCCyABKwMAIAErAwgQ1AKaDAELIAErAwAgASsDCEEBENUCCyEAIAFBEGokACAAC7wOAhB/AnwjAEGwBGsiBiQAIAIgAkF9akEYbSIEQQAgBEEAShsiDUFobGohCEGEhgQoAgAiCSADQX9qIgdqQQBOBEAgAyAJaiEEIA0gB2shAgNAIAZBwAJqIAVBA3RqIAJBAEgEfEQAAAAAAAAAAAUgAkECdEGQhgRqKAIAtws5AwAgAkEBaiECIAVBAWoiBSAERw0ACwsgCEFoaiEKQQAhBCAJQQAgCUEAShshBSADQQFIIQsDQAJAIAsEQEQAAAAAAAAAACEUDAELIAQgB2ohDEEAIQJEAAAAAAAAAAAhFANAIBQgACACQQN0aisDACAGQcACaiAMIAJrQQN0aisDAKKgIRQgAkEBaiICIANHDQALCyAGIARBA3RqIBQ5AwAgBCAFRiECIARBAWohBCACRQ0AC0EvIAhrIRBBMCAIayEOIAhBZ2ohESAJIQQCQANAIAYgBEEDdGorAwAhFEEAIQIgBCEFIARBAUgiB0UEQANAIAZB4ANqIAJBAnRqAn8gFAJ/IBREAAAAAAAAcD6iIhSZRAAAAAAAAOBBYwRAIBSqDAELQYCAgIB4C7ciFEQAAAAAAABwwaKgIhWZRAAAAAAAAOBBYwRAIBWqDAELQYCAgIB4CzYCACAGIAVBf2oiBUEDdGorAwAgFKAhFCACQQFqIgIgBEcNAAsLAn8gFCAKEMkBIhQgFEQAAAAAAADAP6KcRAAAAAAAACDAoqAiFJlEAAAAAAAA4EFjBEAgFKoMAQtBgICAgHgLIQsgFCALt6EhFAJAAkACQAJ/IApBAUgiEkUEQCAEQQJ0IAZqIgIgAigC3AMiAiACIA51IgIgDnRrIgU2AtwDIAIgC2ohCyAFIBB1DAELIAoNASAEQQJ0IAZqKALcA0EXdQsiDEEBSA0CDAELQQIhDCAURAAAAAAAAOA/ZkEBc0UNAEEAIQwMAQtBACECQQAhBSAHRQRAA0AgBkHgA2ogAkECdGoiEygCACEPQf///wchBwJ/AkAgBQ0AQYCAgAghByAPDQBBAAwBCyATIAcgD2s2AgBBAQshBSACQQFqIgIgBEcNAAsLAkAgEg0AAkACQCARDgIAAQILIARBAnQgBmoiAiACKALcA0H///8DcTYC3AMMAQsgBEECdCAGaiICIAIoAtwDQf///wFxNgLcAwsgC0EBaiELIAxBAkcNAEQAAAAAAADwPyAUoSEUQQIhDCAFRQ0AIBREAAAAAAAA8D8gChDJAaEhFAsgFEQAAAAAAAAAAGEEQEEAIQUCQCAEIgIgCUwNAANAIAZB4ANqIAJBf2oiAkECdGooAgAgBXIhBSACIAlKDQALIAVFDQAgCiEIA0AgCEFoaiEIIAZB4ANqIARBf2oiBEECdGooAgBFDQALDAMLQQEhAgNAIAIiBUEBaiECIAZB4ANqIAkgBWtBAnRqKAIARQ0ACyAEIAVqIQUDQCAGQcACaiADIARqIgdBA3RqIARBAWoiBCANakECdEGQhgRqKAIAtzkDAEEAIQJEAAAAAAAAAAAhFCADQQFOBEADQCAUIAAgAkEDdGorAwAgBkHAAmogByACa0EDdGorAwCioCEUIAJBAWoiAiADRw0ACwsgBiAEQQN0aiAUOQMAIAQgBUgNAAsgBSEEDAELCwJAIBRBACAKaxDJASIURAAAAAAAAHBBZkEBc0UEQCAGQeADaiAEQQJ0agJ/IBQCfyAURAAAAAAAAHA+oiIUmUQAAAAAAADgQWMEQCAUqgwBC0GAgICAeAsiArdEAAAAAAAAcMGioCIUmUQAAAAAAADgQWMEQCAUqgwBC0GAgICAeAs2AgAgBEEBaiEEDAELAn8gFJlEAAAAAAAA4EFjBEAgFKoMAQtBgICAgHgLIQIgCiEICyAGQeADaiAEQQJ0aiACNgIAC0QAAAAAAADwPyAIEMkBIRQCQCAEQX9MDQAgBCECA0AgBiACQQN0aiAUIAZB4ANqIAJBAnRqKAIAt6I5AwAgFEQAAAAAAABwPqIhFCACQQBKIQAgAkF/aiECIAANAAtBACEHIARBAEgNACAJQQAgCUEAShshACAEIQUDQCAAIAcgACAHSRshAyAEIAVrIQhBACECRAAAAAAAAAAAIRQDQCAUIAJBA3RB4JsEaisDACAGIAIgBWpBA3RqKwMAoqAhFCACIANHIQogAkEBaiECIAoNAAsgBkGgAWogCEEDdGogFDkDACAFQX9qIQUgBCAHRyECIAdBAWohByACDQALC0QAAAAAAAAAACEUIARBAE4EQCAEIQIDQCAUIAZBoAFqIAJBA3RqKwMAoCEUIAJBAEohACACQX9qIQIgAA0ACwsgASAUmiAUIAwbOQMAIAYrA6ABIBShIRRBASECIARBAU4EQANAIBQgBkGgAWogAkEDdGorAwCgIRQgAiAERyEAIAJBAWohAiAADQALCyABIBSaIBQgDBs5AwggBkGwBGokACALQQdxC0ABAX4jAEEQayICJABCgICAgOAAIQQgACACQQhqIAMpAwAQwgFFBEAgACABIAIpAwgQgQMhBAsgAkEQaiQAIAQLsAIDAX8BfgF8AkAgAL0iAkIgiKdB/////wdxIgFBgIDA/wNPBEAgAqcgAUGAgMCAfGpyRQ0BRAAAAAAAAAAAIAAgAKGjDwsCfCABQf////4DTQRARBgtRFT7Ifk/IAFBgYCA4wNJDQEaRAdcFDMmppE8IAAgAKIQ1gIgAKKhIAChRBgtRFT7Ifk/oA8LIAJCf1cEQEQYLURU+yH5PyAARAAAAAAAAPA/oEQAAAAAAADgP6IiAJ8iAyADIAAQ1gKiRAdcFDMmppG8oKChIgAgAKAPC0QAAAAAAADwPyAAoUQAAAAAAADgP6IiAJ8iAyAAENYCoiAAIAO9QoCAgIBwg78iACAAoqEgAyAAoKOgIACgIgAgAKALDwtEAAAAAAAAAABEGC1EVPshCUAgAkJ/VRsLhwEDAX8BfgF8IAC9IgJC////////////AIO/IQACQAJ8IAJCNIinQf8PcSIBQf0HTQRAIAFB3wdJDQIgACAAoCIDIAMgAKJEAAAAAAAA8D8gAKGjoAwBCyAARAAAAAAAAPA/IAChoyIAIACgCxCmA0QAAAAAAADgP6IhAAsgACAAmiACQn9VGwueAQMBfwF+AnxEAAAAAAAA4D8gAKYhBCAAvUL///////////8AgyICvyEDAkAgAkIgiKciAUHB3JiEBE0EQCADEKICIQMgAUH//7//A00EQCABQYCAwPIDSQ0CIAQgAyADoCADIAOiIANEAAAAAAAA8D+go6GiDwsgBCADIAMgA0QAAAAAAADwP6CjoKIPCyAEIASgIAMQ6wWiIQALIAALBQAgAJkLBQAgAJ8L3gECAX8CfiAAvSICQv///////////wCDIgO/IQACQCADQiCIpyIBQeunhv8DTwRAIAFBgYDQgQRPBEBEAAAAAAAAAIAgAKNEAAAAAAAA8D+gIQAMAgtEAAAAAAAA8D9EAAAAAAAAAEAgACAAoBCiAkQAAAAAAAAAQKCjoSEADAELIAFBr7HB/gNPBEAgACAAoBCiAiIAIABEAAAAAAAAAECgoyEADAELIAFBgIDAAEkNACAARAAAAAAAAADAohCiAiIAmiAARAAAAAAAAABAoKMhAAsgACAAmiACQn9VGwuDAgMCfwF+AXwgAL0iA0IgiKdB/////wdxIgFBgIDA/wdPBEAgACAAoA8LQZPx/dQCIQICQCABQf//P00EQEGT8f3LAiECIABEAAAAAAAAUEOivSIDQiCIp0H/////B3EiAUUNAQsgACADQoCAgICAgICAgH+DIAFBA24gAmqtQiCGhL8iBCAEoiAEIACjoiIAIAAgAKKiIABE1+3k1ACwwj+iRNlR577LROi/oKIgACAARMLWSUpg8fk/okQgJPCS4Cj+v6CiRJLmYQ/mA/4/oKAgBKK9QoCAgIAIfEKAgICAfIO/IgAgAKKjIgQgAKEgACAAoCAEoKMgAKIgAKAhAAsgAAv2BAIDfwd+IwBBIGsiBSQAQoCAgIDgACENAkAgACABIARBH2oQbSIBEAwNAEKAgICAMCEIAkACQCAAQRwQayIGRQRAQoCAgIAwIQtCgICAgDAhCgwBCyAGQQRqEG8gBiAEQQF2QQFxNgIAIAEgBhCIASAGQQE2AhQgBiAAQQgQLiIHNgIQQoCAgIAwIQtCgICAgDAhCiAHRQ0AIAcQbyAGQQQ2AhggAkEBSAR+QoCAgIAwBSADKQMACyIIEBENASAIECcNAUEBIQICQAJAIAAgAUHoAEHCACAEQQFxIgMbIAFBABATIgoQDA0AIAAgChA7RQRAIABB8OIAQQAQFQwBCyAAIAhBABDzASIIEAwNASAAIAhB6gAgCEEAEBMiCxAMDQEDQCAFIAAgCCALIAVBFGoQrAEiCTcDGCAJEAwNAiAFKAIUBEAgACAJEAsgACALEAsgACAIEAsgACAKEAtBACECDAMLAkACQCADBEAgACAKIAFBASAFQRhqECMiDhAMRQ0BIAAgBSkDGBALDAULAkACQCAJECFFBEAgABApQoCAgIAwIQkMAQsgACAJQQAQeCIJEAxFDQELQoCAgIAwIQwMAgsgACAFKQMYQQEQeCIMEAwNASAFIAw3AwggBSAJNwMAIAAgCiABQQIgBRAjIg4QDA0BIAAgCRALIAAgDBALCyAAIA4QCyAAIAUpAxgQCwwBCwsgACAFKQMYEAsgACAJEAsgACAMEAsMAQtCgICAgDAhCAsgAkUNAQsgCBAhBEAgACAIQQEQsAEaCyAAIAsQCyAAIAgQCyAAIAoQCyAAIAEQCwwBCyABIQ0LIAVBIGokACANC7IBAwF/AX4BfCAAvSICQv///////////wCDvyEAAkAgAkI0iKdB/w9xIgFBmQhPBEAgABDTAkTvOfr+Qi7mP6AhAAwBCyABQYAITwRAIAAgAKBEAAAAAAAA8D8gACAAokQAAAAAAADwP6CfIACgo6AQ0wIhAAwBCyABQeUHSQ0AIAAgAKIiAyADRAAAAAAAAPA/oJ9EAAAAAAAA8D+goyAAoBCmAyEACyAAIACaIAJCf1UbC8gBAQF/AkACQCAAIAFzQQNxDQAgAUEDcQRAA0AgACABLQAAIgI6AAAgAkUNAyAAQQFqIQAgAUEBaiIBQQNxDQALCyABKAIAIgJBf3MgAkH//ft3anFBgIGChHhxDQADQCAAIAI2AgAgASgCBCECIABBBGohACABQQRqIQEgAkH//ft3aiACQX9zcUGAgYKEeHFFDQALCyAAIAEtAAAiAjoAACACRQ0AA0AgACABLQABIgI6AAEgAEEBaiEAIAFBAWohASACDQALCwvZAQECfwJAIAFB/wFxIgMEQCAAQQNxBEADQCAALQAAIgJFIAIgAUH/AXFGcg0DIABBAWoiAEEDcQ0ACwsCQCAAKAIAIgJBf3MgAkH//ft3anFBgIGChHhxDQAgA0GBgoQIbCEDA0AgAiADcyICQX9zIAJB//37d2pxQYCBgoR4cQ0BIAAoAgQhAiAAQQRqIQAgAkH//ft3aiACQX9zcUGAgYKEeHFFDQALCwNAIAAiAi0AACIDBEAgAkEBaiEAIAMgAUH/AXFHDQELCyACDwsgABBEIABqDwsgAAsmAQF/A0AgAUUEQEEADwsgACABQX9qIgFqIgItAABBL0cNAAsgAgvyCAECfyMAQaAEayICJABBfiEDAkBBoL8CIAEQpQQiAUEASA0AAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAFBXmoOEwAHAQIGEA4NEQ8MCAkSBAMFCwoTC0F/IQNBACAAQQBBgAEQggFFDRMaDBQLQX8hA0EAIABBAEGAgMQAEIIBRQ0SGgwTCyACQoaAgIDwADcDCCACQoCAgIAQNwMAIAAgAhCBAQwRCyACQoOAgIDwADcDICACQoGAgIAQNwMYIAJCgICAgICABDcDECAAIAJBEGoQgQEMEAsgAkFAa0KDgICA8AA3AwAgAkKBgICAMDcDOCACQoCAgIDAADcDMCAAIAJBMGoQgQEMDwsgAkKDgICA8AA3A2AgAkKBgICAwAA3A1ggAkKAgICAIDcDUCAAIAJB0ABqEIEBDA4LIAJBBzYCkAEgAkKDgICAMDcDiAEgAkKDgICAEDcDgAEgAkKBgICAwAA3A3ggAkKAgICA4AE3A3AgACACQfAAahCBAQwNCyACQoOAgIDwADcDyAEgAkKBgICAIDcDwAEgAkKDgICAMDcDuAEgAkKDgICAEDcDsAEgAkKBgICAwAA3A6gBIAJCgICAgOCHATcDoAEgACACQaABahCBAQwMCyACQQc2AugBIAJCg4CAgOAANwPgASACQoGAgIDQADcD2AEgAkKAgICAkKiAgD83A9ABIAAgAkHQAWoQgQEMCwsgAkKDgICA8AA3A4ACIAJCgYCAgNAANwP4ASACQoCAgICAKDcD8AEgACACQfABahCBAQwKCyACQoSAgIDwADcDyAIgAkKDgICA4AA3A8ACIAJCgYCAgLABNwO4AiACQp6AgIAwNwOwAiACQp2AgIAQNwOoAiACQoOAgIAQNwOgAiACQoGAgIDwADcDmAIgAkKAgICA4IcBNwOQAiAAIAJBkAJqEIEBDAkLIAJBBzYCmAMgAkKGgICAwAA3A5ADIAJCjICAgDA3A4gDIAJCg4CAgBA3A4ADIAJCgYCAgOADNwP4AiACQoGAgIDQAzcD8AIgAkKIgICAMDcD6AIgAkKDgICAEDcD4AIgAkKBgICA8AA3A9gCIAJCgICAgODfwQA3A9ACIAAgAkHQAmoQgQEMCAsgAEEBEKsDDAcLIABBAhCrAwwGCyAAQQcQqwMMBQsgAkKFgICA8AA3A7ADIAJCgYCAgNABNwOoAyACQoKAgIAQNwOgAyAAIAJBoANqEIEBDAQLIAJChYCAgPAANwPQAyACQoGAgIDgATcDyAMgAkKCgICAwAA3A8ADIAAgAkHAA2oQgQEMAwsgAkKFgICA8AA3A/ADIAJCgYCAgPABNwPoAyACQoKAgIDAADcD4AMgACACQeADahCBAQwCCyACQoWAgIDwADcDkAQgAkKBgICAoAE3A4gEIAJCgYCAgIAGNwOABCAAIAJBgARqEIEBDAELIAFBIUsNASAAIAFBEGoQ7wULIQMLIAJBoARqJAAgAwvQBQEMfyMAQTBrIgUkAAJAAkBBkI0CIAEQpQQiCUEASARAQX4hDAwBCyAAIQEgAgRAIAVBGGogACgCDCAAKAIQEJMBIAUgACgCDCAAKAIQEJMBIAVBGGohAQsgCUEBaiENQYCfAiEEA0AgBEGxswJJBEAgAyEHIARBAWohBgJAIAQtAAAiCkH/AHEiA0HgAEkEQCAGIQgMAQsCfyADQe8ATQRAIANBCHRBgMB+aiEDQeAAIQtBAgwBCyADQRB0IAQtAAFBCHRyQYCAwHxqIQMgBEECaiEGQeAgIQtBAwsgBGohCCADIAYtAAByIAtqIQMLIApBgAFxRQRAIAMgB2pBAWohAyAIIQQMAgsgCEEBaiEEIAMgB2pBAWohAyANIAgtAABHDQEgASAHIAMQggFFDQEMAwsLIAJFDQBBwLMCIQQgCUE2RiEOIAlBGEchC0EAIQYDQCAEQd+5AkkEQCAGIQogBEEBaiEHIAQsAAAiCEH/AXEhAyAIQX9KBH8gBwUCfyAIQf8BcUG/AU0EQCADQQh0QYCAfmohA0ECIQZBgAEMAQsgA0EQdCAELQABQQh0ckGAgIB6aiEDIARBAmohB0EDIQZBgIEBCyADIActAAByaiEDIAQgBmoLIgRBAWohByADIApqQQFqIQYgBC0AACEDAkACQCAORQRAQQAhBCALDQELIANFDQEgBSAKIAYQggFFDQEMBQsDQCADIARGDQEgBCAHaiEIIARBAWohBCANIAgtAABHDQALIAUgCiAGEIIBDQQLIAMgB2ohBAwBCwsCQCAJQTZHQQAgCUEYRxtFBEAgBRDYAg0DIAAgASgCCCABKAIAIAUoAgggBSgCAEEBENkCRQ0BDAMLIAAgASgCCCABKAIAIAUoAgggBSgCAEEAENkCDQILIAEQViAFEFYLIAVBMGokACAMDwsDQCACRQ0AIAEQViAFEFYMAAsAC7cBAQh/IwBBEGsiAyQAQbAHIQUDQAJAIAYgBUoEQEEAIQQMAQsgA0EIaiAFIAZqQQJtIgdBAXRBoLcDai8BACIEQQZ2IghBAnRBwMcCaigCACICQQ52IgkgBEE/cWoiBCAIIAkgAkEHdkH/AHEgAkEBdkE/cRDuBRogACADKAIIayICIAEgAygCDGsgAhsiAkF/TARAIAdBf2ohBQwCCyACRQ0AIAdBAWohBgwBCwsgA0EQaiQAIAQLgQEBBn9BsQUhBAJAA0AgAyAESg0BIAMgBGpBAm0iBUECdEHAxwJqKAIAIgZBDnYiCCABSwRAIAVBf2ohBAwBCyAGQQd2Qf8AcSIDIAhqIAFNBEAgBUEBaiEDDAELCyAGQQFxIAJLDQAgACABIAUgCCADIAZBAXZBP3EQ7gUhBwsgBwtmAQF/IABBgF5qQRJLIAFBn11qQRRLckUEQCAAQcwEbCABQRxsakHk8t5+ag8LAkAgAEGAqH1qIgJBo9cASw0AIAJB//8DcUEccCABQdlcaiICQRtLcg0AIAAgAmoPCyAAIAEQvgkLswEBB38gAUF/aiEGA0ACQCADIAFIBEAgACADIgJBAnRqKAIAENcCRQ0BA0AgAiAGRgRAIAEhAwwDCyAAIAJBAWoiBEECdGooAgAiBxDXAiIIBEADQAJAIAIgA0gNACAAIAJBAnRqIgUoAgAQ1wIgCEwNACAFIAUoAgA2AgQgAkF/aiECDAELCyACQQJ0IABqIAc2AgQgBCECDAEFIAQhAwwDCwALAAsPCyADQQFqIQMMAAsAC4sDAQZ/IwBBIGsiBSQAIAVBCGogBEErELMDAkACQAJAAkAgBUEIaiACQQJ0IgcQ5wFFBEAgA0UEQEEAIQQgAkEAIAJBAEobIQgDQCAEIAhGDQQgBEECdCEGIARBAWohBCABIAZqKAIAQf8BTQ0ACwsgBUEIaiABIAIgA0EBdhDyBSAFKAIURQ0BCyAAQQA2AgBBfyECDAMLIAUoAggiASAFKAIMIgRBAnYiAhDBCSADQQFxIARBCElyDQEgAkEBIAJBAUsbIQlBASEDQQEhAgNAIAMgCUYNAiABIANBAnRqIgcoAgAQ1wIhCCACIQQCQAJAA0AgBEEBSA0BIAEgBEF/aiIEQQJ0aiIGKAIAENcCIgoEQCAKIAhIIQZBgAIhCCAGDQEMAgsLIAYoAgAgBygCABDACSIERQ0AIAYgBDYCAAwBCyABIAJBAnRqIAcoAgA2AgAgAkEBaiECCyADQQFqIQMMAAsACyAAIAUoAgggASAHECQ2AgAMAQsgACABNgIACyAFQSBqJAAgAgs5AQF/QX8hAiAAIAEoAgAQrAMEf0F/BSAAKAIIIAEoAgggASgCAEECdBAkGiAAIAEoAgA2AgBBAAsL1wECAX8CfiMAQSBrIgYkAAJAIAVBAXEEQCAAIAEgAiADIAQQpAghBwwBC0KAgICA4AAhByAAIAZBGGogAUHaABCFASIFRQ0AIAYpAxghASAFLQAQRQRAIAAgARALIABBj8QAQQAQFQwBCyABEBEEQCAAIAUpAwAgAiADIAQQIyEHDAELIAAgAyAEEIcDIggQDEUEQCAFKQMAIQcgBiAINwMQIAYgAjcDCCAGIAc3AwAgACABIAUpAwhBAyAGECMhBwsgACABEAsgACAIEAsLIAZBIGokACAHC9kEAQV/IwBBgAFrIgUkAAJ/AkACQCACKAIAIggtAABB+wBGBEAgBUFAayEEAkACQANAAkAgCEEBaiEGIAgtAAEiBxCvA0UNACAEIAVBQGtrQT5LDQIgBCAHOgAAIARBAWohBCAGIQgMAQsLIARBADoAACAFIQQCQCAGLQAAIgdBPUcNACAIQQJqIQYDQCAGLQAAIgcQrwNFDQEgBCAFa0E/TwRAIABBmeQBQQAQPwwHBSAEIAc6AAAgBEEBaiEEIAZBAWohBgwBCwALAAsgBEEAOgAAIAdB/QBHBEAgAEG45AFBABA/DAULQQAhBAJAAkAgBUFAa0HG5AFBBxB0RQ0AIAVBQGtBzeQBQQMQdEUNAEEBIQQgBUFAa0HQ5AFBEhB0RQ0AIAUoAkBB88bhA0cNAQsgASAAKAJAQesCEJMBIAEgBSAEEL0JIgRFDQIgARBWIARBfkcNBCAAQeLkAUEAED8MBQsCQCAFQUBrQfnkAUEREHQEQCAFQUBrQYrlAUEDEHQNAQsgASAAKAJAQesCEJMBIAEgBRDxBSIERQ0CIAEQViAEQX5HDQQgAEGN5QFBABA/DAULIAUtAAANACABIAAoAkBB6wIQkwEgASAFQUBrEPEFIgRBf0YEQCABEFYMBAsgBEF/Sg0BIAEgBUFAaxC8CSIERQ0BIAEQViAEQX5HDQMLIABBruUBQQAQPwwDCwJAIANFDQAgARDYAkUNACABEFYMAwsgAiAGQQFqNgIAQQAMAwsgAEGC5AFBABA/DAELIAAQ2wILQX8LIQQgBUGAAWokACAEC40BAQN/IAJBAXRBfHFB1OMBaigCACIDLwEAIQQgASAAKAJAQesCEJMBIAJBAXEhACADQQJqIQMgBEEBdCEEQQAhAgJAAkADQCACIARHBEAgAkEBdCEFIAJBAWohAiABIAMgBWovAQAQ+QVFDQEMAgsLQQAhAiAARQ0BIAEQ2AJFDQELIAEQVkF/IQILIAILnAEBBH8jAEEgayIBJAAgAUEIaiAAKAIMQesCEJMBIAFC4YCAgLAPNwIAIAFBCGogACgCCCAAKAIAIAFBAkEBENkCIgJFBEBBACECIAEoAhAhBANAIAIgASgCCCIDTkUEQCAEIAJBAnRqIgMgAygCAEFgajYCACACQQFqIQIMAQsLIAAgBCADEKYEIQILIAFBCGoQViABQSBqJAAgAgvyAgEIfyMAQYACayICJAAgAkEAQf8BEEwhBUF+IQQDQCAHIAFIBEAgACAHaiIDLQAAIgJB4OUBai0AACEGAkACQAJAAkACQAJAAkACQCACQX9qDhsCAgICBwcGBgYGAwMEBgcHBwcFBQABBgYHBgcGCyADLwABQQJ0IAZqIQYMAQsgAy8AAUEDdCAGaiEGC0EBIAQgBEF+RhshBAwECyAFIAMtAAFqIgIgAi0AAEEBcjoAAAwDCyADLQABIgIgAy0AAiIDIAIgA0sbIQMDQCACIANGDQMgAiAFaiIIIAgtAABBAXI6AAAgAkEBaiECDAALAAtBASEJIAUgAy0AAWoiAiACLQAAQQJyOgAADAELQQAgBCAEQX5GGyEECyAGIAdqIQcMAQsLAn8CQCAJRQ0AQQAhAgNAIAJB/wFGDQEgAiAFaiEAIAJBAWohAiAALQAAQQNHDQALQX8MAQtBACAEIARBfkYbCyEAIAVBgAJqJAAgAAuKAQEGfwNAAkAgAyABTgRAIAQhBQwBC0F/IQUgACADaiIGLQAAIgdB4OUBai0AACECAkACQAJAAkAgB0F/ag4WAgICAgMDBAQEBAQEBAQEBAMDBAQAAQQLIAYvAAFBAnQgAmohAgwBCyAGLwABQQN0IAJqIQILIARBAWohBAsgAiADaiEDDAELCyAFC8QDAQV/IwBBQGoiAiQAIAJBKGogACgCQEHrAhCTASACIAEoAgAiA0EBaiIENgI8IAMtAAEiBkHeAEYEQCACIANBAmoiBDYCPAsCfwJAA0ACQAJAIAQtAABB3QBHBEAgACACQRBqIAJBPGpBARCpBCIDQQBIDQQCQAJAAkACQCACKAI8IgQtAABBLUcNACAELQABQd0ARg0AIAIgBEEBajYCDCADQYCAgIAETwRAIAAoAihFDQEgAkEQahBWDAMLIAAgAkEQaiACQQxqQQEQqQQiBUEASA0IIAVBgICAgARJDQEgAkEQahBWIAAoAigNAgsgA0GAgICABEkNAiACQShqIAIoAhggAigCEBCmBCEDIAJBEGoQViADRQ0GDAULIAIgAigCDCIENgI8IAUgA08NAwsgAEHa4gFBABA/DAULIAJBKGogAyADEPoFRQ0DDAILIAAoAiwEQCACQShqEMcJDQILIAZB3gBGBEAgAkEoahDYAg0CCyAAIAJBKGoQ/AUNAyACQShqEFYgASAEQQFqNgIAQQAMBAsgAkEoaiADIAUQ+gVFDQELCyAAENsCCyACQShqEFZBfwshACACQUBrJAAgAAvpAgEFfiADKQMIIQggACADKQMAIgUQ9QMiA0EATgRAAkAgARARRQ0AIAAQ9AMhASADRQ0AIAgQEUUNACAAIAVBPCAFQQAQEyIGEAwEQCAGDwsgACAGIAEQWSECIAAgBhALIAJFDQAgBRAODwsCQAJAAkACQCAAIAVBABDZASICBEAgAjUCAEKAgICAkH+EEA4hBCAIEBFFDQEgAjUCBEKAgICAkH+EEA4hBgwDCwJAAkAgAwRAQoCAgIAwIQcgACAFQewAIAVBABATIgQQDA0GIAgQEUUNASAAIAVB7QAgBUEAEBMiBxAMRQ0CDAYLIAUQDiEECyAIEA4hBwsgBBARBEAgAEEvEDIhBAwCCyAAIAQQLCEGIAAgBBALIAYiBBAMDQMMAQsgACAIECwiBxAMDQILIAAgBCAHEPYDIgYQDA0BIAAgBxALCyAAIAEgBCAGEK0FDwsgACAEEAsgACAHEAsLQoCAgIDgAAu5FwEHfyMAQSBrIgQkACAEIAAoAhgiAzYCHAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADLQAAIgJBXGoOCwEJCQkECRISCQkCAAsCQAJAIAJBpX9qDgQHBggBAAsgAkGFf2oOAwMJBwgLIAQgA0EBajYCHCAAQQUQZAwOCyAEIANBAWo2AhwgAEEGEGQMDQsgBCADQQFqNgIcIAAoAjQhByAAKAIEIQIgAUUNCSAAQRsQZCAAQQRBAyAAKAIwGxBkIABBGxBkDAsLIAAoAigEQCAAQcDgAUEAED8MEAsgAy0AARBGRQ0FIAQgA0EBajYCCCAEQQhqQQEQ2gIaAkAgBCgCCCICLQAAIgNBLEcNACAEIAJBAWo2AgggAi0AASIDEEZFDQAgBEEIakEBENoCGiAEKAIILQAAIQMLIANB/wFxQf0ARw0FDA4LAkAgAy0AAUE/RgRAQQMhBkEAIQICQAJAAkACQCADLQACIgVBRmoOBAADAQ4CCyAAIANBA2o2AhggACgCNCEHIAAoAgQhAkF/IQMgACABELADDRQgBCAAKAIYNgIcIAAgBEEcakEpEK4DRQ0ODBQLQQEhAkEEIQYgAy0AAyIFQT1GBEBBASEIDA0LQQEhCCAFQSFGDQwgBCADQQNqNgIcIABB3ABqIgIgBEEcaiAAKAIoEKsEBEAgAEHf4AFBABA/DBMLIAAgAhD/BUEBTgRAIABB8uABQQAQPwwTCyAAQcQAaiACIAIQREEBahCUARogAEEBNgI8DAMLIAVBIUYNCwsgAEGH4QFBABA/DBALIAQgA0EBajYCHCAAQcQAakEAEA8LIAAoAjQiB0H/AU4EQCAAQZXhAUEAED8MDwsgACAHQQFqNgI0IAAoAgQhAiAAIAFBC2ogBxDcAiAAIAQoAhw2AhhBfyEDIAAgARCwAw0PIAQgACgCGDYCHCAAQQwgAWsgBxDcAiAAIARBHGpBKRCuA0UNCQwPCwJAAkACQAJAAkACQAJAIAMtAAEiAkFQag4TAwQEBAQEBAQEBAoKCgoKCgoKAQALIAJB6wBGDQEgAkHiAEcNCQsgAEERQRIgAkHiAEYbEGQgBCADQQJqNgIcDA4LAkAgAy0AAkE8RwRAQafhASEDIAAoAigNASAAEKoEDQEMCQsgBCADQQNqNgIIIABB3ABqIgIgBEEIaiAAKAIoEKsEBEBB3+ABIQMgACgCKA0BIAAQqgQNAQwJCyAAIAIQ/wUiBUF/Sg0DIAAgBEEEaiACEP4FIgVBf0oNA0G84QEhAyAAKAIoDQAgABCqBEUNCAsgACADQQAQPwwRCyAEIANBAmo2AhwgAy0AAiECIAAoAigEQCACEEZFDQkgAEHT4QFBABA/DBELIAJB+AFxQTBHDQggBCADQQNqNgIcIAMtAAJBUGohBSADLQADQfgBcUEwRw0IIAQgA0EEajYCHCADLQADIAVBA3RqQVBqIQUMCAsgBCADQQFqIgI2AhwgBEEcakEAENoCIgVBAE4EQCAFIAAoAjRIDQIgBSAAEP0FSA0CCyAAKAIoRQRAIAQgAjYCHCACLQAAIgdBN0sNB0EAIQUgB0EzTQRAIAQgA0ECaiICNgIcIAMtAAIhByADLQABQVBqIQULIAdB+AFxQTBHDQggBCACQQFqNgIcIAItAAAgBUEDdGpBUGohBSACLQABQfgBcUEwRw0IIAQgAkECajYCHCACLQABIAVBA3RqQVBqIQUMCAsgAEGA4gFBABA/DA8LIAQgBCgCCDYCHAsgACgCNCEHIAAoAgQhAiAAIAFBE2ogBRDcAgwICyAAKAI0IQcgACgCBCECIAEEQCAAQRsQZAtBfyEDIAAgBEEcahDKCQ0NIAFFDQcgAEEbEGQMBwsgACgCKEUNASAAQcDgAUEAED8MCwsgAkE/Rg0JCyAAIARBCGogBEEcakEAEKkEIgVBAE4NAQwJCyAEIANBAmo2AhwgAy0AASEFCyAAKAI0IQcgACgCBCECIAEEQCAAQRsQZAsCQCAFQYCAgIAETgRAIAAgBEEIahD8BSEFIARBCGoQVkF/IQMgBUUNAQwKCwJ/IAAoAiwEQCAFIAAoAigQ5gEhBQsgBUH//wNMCwRAIABBASAFEKgEDAELIABBAiAFEMsBGgsgAUUNAiAAQRsQZAwCCyAAQQRBAyAAKAIwGxBkDAELIAMgBmohBkF/IQMCf0F/IAINABpBfyAAKAIoDQAaIAAoAjQhByAAKAIECyECIABBGEEXIAVBIUYbQQAQywEhASAAIAY2AhggACAIELADDQYgBCAAKAIYNgIcIAAgBEEcakEpEK4DDQYgAEEKEGQgACgCDA0GIAAoAgAgAWogACgCBCABa0F8ahBcCyACQQBIDQACQAJAAkACQAJAAkAgBCgCHCIDLQAAIgFBVmoOAgECAAsgAUE/Rg0CIAFB+wBHDQUgAy0AARBGDQMgACgCKEUNBQwHCyAEIANBAWoiAzYCHEEAIQVB/////wchAQwDC0EBIQUgBCADQQFqIgM2AhxB/////wchAQwCC0EBIQEgBCADQQFqIgM2AhxBACEFDAELIAQgA0EBajYCHCAEQRxqQQEQ2gIiBSEBAkAgBCgCHCIGLQAAIghBLEcNACAEIAZBAWo2AhwgBi0AASIIEEZFBEBB/////wchAQwBCyAEQRxqQQEQ2gIiASAFSA0EIAQoAhwtAAAhCAsCQCAIQf0ARg0AIAAoAigNACAEIAM2AhwMAgtBfyEDIAAgBEEcakH9ABCuAw0GIAQoAhwhAwsCfyADLQAAQT9GBEAgBCADQQFqNgIcIAAoAgQgAmshBkEAIQhBAAwBCwJAIAFBAUgNACAAKAIMDQMgACgCACACaiAAKAIEIAJrEMkJIgNBAUgNACAAQQoQZCAAIAJBERCBAg0DIAAoAgAgAmpBHDoAACACIAAoAgBqQQFqIAAoAgQgAmtBb2oQXCACIAAoAgBqQQVqIAUQXCACIAAoAgBqQQlqIAEQXCACIAAoAgBqQQ1qIAMQXAwCCyAAKAIMDQJBASEIIAAoAgAgAmogACgCBCACayIGEMgJRQshAwJAIAVFBEAgACgCNCAHRwRAIAAgAkEDEIECDQQgACgCACACakENOgAAIAIgACgCAGogBzoAASACIAAoAgBqIAAtADRBf2o6AAIgAkEDaiECCwJAAkACQCABDgIAAQILIAAgAjYCBAwECyAAIAJBBRCBAg0EIAAoAgAgAmogCEEIcjoAACAAKAIAIAJqQQFqIAYQXAwDCyABQf////8HRg0BIAAgAkEKEIECDQMgACgCACACakEPOgAAIAIgACgCAGpBAWogARBcIAJBBWoiASAAKAIAaiAIQQhyOgAAIAIgACgCAGpBBmogBkEFahBcIABBDiABEOUBIABBEBBkDAILIAMgAUH/////B0dyIAVBAUdyRQRAIABBCSAIayACEOUBDAILIAVBAUcEQCAAIAJBBRCBAg0DIAAoAgAgAmpBDzoAACAAKAIAIAJqQQFqIAUQXCAAQQ4gAkEFaiICEOUBIABBEBBkCyABQf////8HRgRAIAAoAgQhASAAIAhBCHIgAyAGakEFahDLARogAwRAIABBGRBkIAAgAiAGEK8EIABBGiABEOUBDAMLIAAgAiAGEK8EIABBByABEOUBDAILIAEgBUwNASAAQQ8gASAFaxDLARogACgCBCEBIAAgCEEIciAGQQVqEMsBGiAAIAIgBhCvBCAAQQ4gARDlASAAQRAQZAwBCyAAIAIgA0EFahCBAg0BIAAoAgAgAmogCEEIcjoAACAAKAIAIAJqQQFqIAMgBmpBBWoQXCADBEAgAiAAKAIAakEZOgAFIABBGiACEOUBDAELIABBByACEOUBCyAAIAQoAhw2AhhBACEDDAQLIAAQ2wIMAgsgAEGy4gFBABA/DAELIABBzeABQQAQPwtBfyEDCyAEQSBqJAAgAwuIBQIGfwF+IwBB0ABrIgckACAAIAcgAiADIAQQmAUgBxChCAJAAkACQAJAAkACQAJAAkAgBUEDcSIIQQJGBEAgACgCECgCjAEiCUUNAiAJKQMIIg1C/////29YDQMgDaciAi8BBhD1AUUNBCACKAIkIQogAigCICIDLQAQIQtBACECDAELIAVBA3YhAyAIQQFHBEAgA0EDcSELQQAhA0EAIQIMAQtCgICAgOAAIQ0gACAEEMgBIgJFDQcgACACEK0IIgJFDQcgA0ECcUEBciELQQAhAwsgAEEAQQFBACAEQQEQ6gMiBEUNAyAHIAQ2AkAgBCAIQQJHIgw2AkwgBCAINgIkIAQgBUEGdkEBcTYCaAJ/IAxFBEAgBCADLwARQQZ2QQFxNgJQIAQgAy8AEUEHdkEBcTYCVCAEIAMtABJBAXE2AlggAy8AEUEJdkEBcQwBCyAEQQA2AlggBEIANwJQQQELIQggBCALOgBuIAQgCDYCXCAAQdAAEBgaIARB0AA2AnACQAJAIAMEQCAAIAQgAyAGEKAIDQELIAQgAjYClAMgByACRTYCSCAHIAJBAEc2AkQgBxCDARogBCAEKAK8ATYC8AEgBxCfCEUNAQsgByAHQRBqEI0CIAAgBBCCAwwECyAAIAQQjAUiDRAMDQMgAgRAIAIgDTcDSCAAIAIQ+ANBAEgNBSACrUKAgICAUIQQDiENCyAFQSBxDQYgACANIAEgCiAJEJ8FIQ0MBgtB4PgAQaENQb2GAkHr+AAQAAALQf34AEGhDUG+hgJB6/gAEAAAC0Gt+QBBoQ1BwIYCQev4ABAAAAsgAkUNAQsgACACEM4FC0KAgICA4AAhDQsgB0HQAGokACANC48CAQZ/IAFBeWohBSAAQQdqIQdBACEBQQAhAAJAAkADQAJAAkACQAJAAkAgACAFSAR/IAAgB2oiAi0AACIEQR1PDQUgACAEQeDlAWotAAAiA2ogBUoNBwJAIARBcWoODAACBQUFBQMEBQUAAgULIAFBAWohAiABIAZIBEAgAiEBDAULIAFB/gFKIQQgAiIBIQYgBEUNBEF/BSAGCw8LIAFBAEwNBiABQX9qIQEMAgsgAi8AAUECdCADaiEDDAELIAIvAAFBA3QgA2ohAwsgACADaiEADAELC0GL5gFBn+YBQfoNQbjmARAAAAtBy+YBQZ/mAUH7DUG45gEQAAALQeXmAUGf5gFBiA5BuOYBEAAAC+ADAQF/IwBB4AFrIgYkACAGQQBB3AEQTCIGQX82AjwgBkKBgICAcDcCNCAGIAI2AiAgBiACIANqNgIcIAYgAjYCGCAGIAU2AkAgBiAENgIkIAYgBEEDdkEBcTYCMCAGIARBAXZBAXE2AiwgBiAEQQR2QQFxNgIoIAYgBUHrAhCzAyAGQcQAaiICIAVB6wIQswMgBiAEQf8BcRAPIAZBABAPIAZBABAPIAZBABAdIARBIHFFBEAgBkEIQQYQywEaIAZBBBBkIAZBB0F1EMsBGgsgBkELQQAQ3AICfwJAIAZBABCwAw0AIAZBDEEAENwCIAZBChBkIAYoAhgtAAAEQCAGQfDfAUEAED8MAQsgBigCDARAIAYQ2wIMAQsgBigCACAGKAIEEM4JIgNBf0wEQCAGQZHgAUEAED8MAQsgBigCACAGKAI0OgABIAYoAgAgAzoAAiAGKAIAQQNqIAYoAgRBeWoQXCAGKAJIIgMgBigCNEF/aksEQCAGIAYoAkQgAxCUARogBigCACIDIAMtAABBgAFyOgAACyACEKMBIAFBADoAACAAIAYoAgQ2AgAgBigCAAwBCyAGEKMBIAIQowEgASAGQdwAahDfCSAAQQA2AgBBAAshACAGQeABaiQAIAAL3QQDBn8CfgF8IwBB0ABrIgQkAAJAAkACQAJAAkACQEEAIAIgARARIggbIgIOAgIAAQsgBAJ8AkAgAykDACIKQoCAgIBwVA0AIAqnIgIvAQZBCkcNACACKQMgIgsQjAFFDQAgACAEQUBrIAsQSA0FIAQrA0AQhAMMAQsgBCAAIApBAhCSAyIKNwMAAkAgChCbAQRAIABCgICAgDBBASAEEI8FIQsgACAKEAsgCxAMDQYgACAEQUBrIAsQWkUNAQwGCyAAIARBQGsgChBaDQULIAQrA0AQhAMLOQNADAILIARBAEE4EEwiBUKAgICAgICA+D83AxAgAkEHIAJBB0gbIgdBACAHQQBKGyECA0ACQCAFIAIgBkcEfyAAIAVByABqIAMgBkEDdCIJaikDABBIDQUgBSsDSCIMvUKAgICAgICA+P8Ag0KAgICAgICA+P8AUg0BIAYFIAILIAdGBHwgBUEBEIMDBUQAAAAAAAD4fws5A0AMAwsgBSAJaiAMnTkDAAJAIAYNACAFKwMAIgxEAAAAAAAAAABmQQFzIAxEAAAAAAAAWUBjQQFzcg0AIAUgDEQAAAAAALCdQKA5AwALIAZBAWohBgwACwALIAQQjgW5OQNACwJAIAAgAUEKEG0iChAMDQAgACAKAn4gBCsDQCIMvQJ/IAyZRAAAAAAAAOBBYwRAIAyqDAELQYCAgIB4CyICt71RBEAgAq0MAQsgDBAWCxDpASAIRQ0AIAAgCkEAQQBBExCNBSEBIAAgChALDAILIAohAQwBC0KAgICA4AAhAQsgBEHQAGokACABCzsBAX8DQCACBEAgAC0AACEDIAAgAS0AADoAACABIAM6AAAgAUEBaiEBIABBAWohACACQX9qIQIMAQsLCxoAIAAtAAAhAiAAIAEtAAA6AAAgASACOgAAC0IBAX8gAkEBdiECA0AgAgRAIAAvAQAhAyAAIAEvAQA7AQAgASADOwEAIAFBAmohASAAQQJqIQAgAkF/aiECDAELCwsaACAALwEAIQIgACABLwEAOwEAIAEgAjsBAAtCAQF/IAJBAnYhAgNAIAIEQCAAKAIAIQMgACABKAIANgIAIAEgAzYCACABQQRqIQEgAEEEaiEAIAJBf2ohAgwBCwsLGgAgACgCACECIAAgASgCADYCACABIAI2AgALQgEBfiACQQN2IQIDQCACBEAgACkDACEDIAAgASkDADcDACABIAM3AwAgAUEIaiEBIABBCGohACACQX9qIQIMAQsLCxwBAX4gACkDACEDIAAgASkDADcDACABIAM3AwALFgAgACAAKQPAASADKQMAQQNBfxCQAwtaAQJ+IAJBBHYhAgNAIAIEQCAAKQMAIQMgACABKQMANwMAIAApAwghBCAAIAEpAwg3AwggASAENwMIIAEgAzcDACABQRBqIQEgAEEQaiEAIAJBf2ohAgwBCwsLNAECfiAAKQMAIQMgACABKQMANwMAIAApAwghBCAAIAEpAwg3AwggASAENwMIIAEgAzcDAAtiAQJ/IAAgASAEIAMRAAAhBiABIAIgBCADEQAAIQUCQCAGQX9MBEAgBUEASA0BIAIgACAAIAIgBCADEQAAQQBIGw8LIAVBAEoNACAAIAIgACACIAQgAxEAAEEASBshAQsgAQuxAgEGfyABIAJsIgYgAmshCCABQQF2IAJsIQcgACACEK4EIQkDQAJAIAdFBEADQCAGIAJrIgZFDQIgACAAIAZqIAIgCREFACAGIAJrIQdBACEFA0AgBUEBdCACaiIBIAZPDQEgACAFaiIFAn8gASAHSQRAIAFBACACIAAgAWoiASABIAJqIAQgAxEAAEEAShtqIQELIAAgAWoiCAsgBCADEQAAQQBKDQEgBSAIIAIgCREFACABIQUMAAsACwALIAcgAmsiByEFA0AgBUEBdCACaiIBIAZPDQIgACAFaiIFAn8gASAISQRAIAFBACACIAAgAWoiASABIAJqIAQgAxEAAEEAShtqIQELIAAgAWoiCgsgBCADEQAAQQBKDQIgBSAKIAIgCREFACABIQUMAAsACwsLRQECf0G0wwAhAgNAIAItAAAiAwRAIAMgAC0AAEcEQEEADwUgAkEBaiECIABBAWohAAwCCwALCyABBEAgASAANgIAC0EBCz4BAn8gAEE/aiECA0AgAS0AACIDRSAAIAJPckUEQCAAIAM6AAAgAEEBaiEAIAFBAWohAQwBCwsgAEEAOgAAC5sDAgN/An4jAEEgayIFJABCgICAgOAAIQgCQCAAIAFBHhBpIgdFDQAgACAFQRBqIAMpAwAQwgENACADKQMIIQEgBUEANgIcAn4CQCAEQRtMBEAgACAFQRxqIAEQxQENAwwBCyAAIAVBCGogARBIDQIgBEEcRgRAIAUgBSsDCLY4AhwMAQsgBSkDCAwBC0IACyEBQQEhBiACQQNOBEAgACADKQMQEPYBQQFzIQYLIAcoAgwoAiAiAi0ABARAIAAQcQwBCyAFKQMQIglBASAEQZkeai0AAHSsfCAHNQIUVgRAIABBoNsBEGoMAQsgCacgAigCCCAHKAIQamohAAJAAkACQAJAAkACQCAEQWpqDggEBAAAAQEBAgMLIAUoAhwhAyAGBEAgBSADQf//A3EQ1gMiAzYCHAsgACADQf//A3EQ+gIMBAsgBSgCHCEDIAYEQCAFIAMQ+QIiAzYCHAsgACADEFwMAwsgACAGBH4gARD0BAUgAQs3AAAMAgsQAQALIAAgBSgCHDoAAAtCgICAgDAhCAsgBUEgaiQAIAgLpwMCA38BfiMAQRBrIgYkAEKAgICA4AAhCAJAIAAgAUEeEGkiB0UNACAAIAZBCGogAykDABDCAQ0AQQEhBSACQQJOBEAgACADKQMIEPYBQQFzIQULIAcoAgwoAiAiAi0ABARAIAAQcQwBCyAGKQMIIgFBASAEQZkeai0AAHSsfCAHNQIUVgRAIABBoNsBEGoMAQsgAacgAigCCCAHKAIQamohAAJAAkACQAJAAkACQAJAAkACQCAEQWpqDggIAAECAwQFBgcLIAAxAAAhCAwICyAALwAAIQAgBQR/IAAQ1gMFIAALQRB0QRB1rSEIDAcLIAAvAAAhACAFBH8gABDWAwUgAAutIQgMBgsgACgAACEAIAUEfyAAEPkCBSAAC60hCAwFCyAAKAAAIQACfyAFBEAgABD5AiEACyAAQQBOCwRAIACtIQgMBQsgALgQFiEIDAQLIAAoAAAhACAFBH8gABD5AgUgAAu+uxAWIQgMAwsgACkAACEBIAUEfiABEPQEBSABC78QFiEIDAILEAEACyAAMAAAQv////8PgyEICyAGQRBqJAAgCAvNAQICfwJ+IwBBEGsiBSQAIAFBADYCAAJAIAAQTyIGEAwNAEKAgICAMCEHAkAgACACIAMQ2AMiAhAMDQAgACACQeoAIAJBABATIgcQDA0AA0AgACACIAcgBUEMahCsASIDEAwNASAFKAIMBEAgACADEAsgACAHEAsgACACEAsgASAENgIADAMLIAAgBiAErSADQYCAARCrAUEASA0BIARBAWohBAwACwALIAAgBxALIAAgAhALIAAgBhALQoCAgIDgACEGCyAFQRBqJAAgBguAAQEDfyMAQRBrIgUkACAFIAKtNwMIAkAgACABQQEgBUEIahC4AyIBEAwNACACQQAgAkEAShshAgNAIAIgBEYNASAAIAEgBCADIARBA3RqKQMAEA4QlAIhBiAEQQFqIQQgBkF/Sg0ACyAAIAEQC0KAgICA4AAhAQsgBUEQaiQAIAELpgUCAn8JfiMAQTBrIgQkACADKQMAIQdCgICAgDAhCCAEQoCAgIAwNwMYQQEhBQJAAkACQAJAAn4gAkECSARAQoCAgIAwIQxCgICAgDAMAQsCQCADKQMIIgwQEQ0AIAAgDBBoDQJBACEFIAJBA0gNACADKQMQDAELQoCAgIAwCyENIAAgB0HDASAHQQAQEyIGEAwNAAJAIAYQEUUEQCAAIAYQCyAAEE8iCRAMBEBCgICAgDAhC0KAgICAMCEGDAQLIAQgBxAONwMQIAAgBEEQakEIckEAEI4DIQIgBCkDGCELIAQpAxAhBiACDQNCACEHA0AgACAGIAsgBEEEahCsASIKEAxFBEAgBCgCBARAIAYhCgwECyAAIAkgByAKEG4hAiAHQgF8IQcgAkEATg0BCwsgBhARDQQgACAGQQEQsAEaDAMLQoCAgIAwIQtCgICAgDAhCkKAgICAMCEGIAAgBxAqIgkQDA0DCyAAIARBCGogCRBAQQBIBEAgCiEGDAILIAQCfiAEKQMIIgZCgICAgAh8Qv////8PWARAIAZC/////w+DDAELIAa5EBYLIgc3AyAgACABQQEgBEEgahC4AyEIIAAgBxALAkAgCBAMDQBCACEHIAZCACAGQgBVGyEOA0AgByAOUQRAIAohBgwGCyAAIAkgBxBgIgYQDA0BAkAgBQRAIAYhAQwBCyAEIAY3AyAgBCAHQv////8PgzcDKCAAIAwgDUECIARBIGoQIyEBIAAgBhALIAEQDA0CCyAAIAggByABEI0BIQIgB0IBfCEHIAJBAE4NAAsLIAohBgwCC0KAgICAMCELQoCAgIAwIQZCgICAgDAhCQsLIAAgCBALQoCAgIDgACEICyAAIAkQCyAAIAYQCyAAIAsQCyAEQTBqJAAgCAsPACAAKwMAIAErAwAQhAYLCQAgASsDABAWCxEAIAAqAgC7IAEqAgC7EIQGCwoAIAEqAgC7EBYLFwAgASgCACIBIAAoAgAiAEkgASAAS2sLGAAgASgCACIAQQBOBEAgAK0PCyAAuBAWCxcAIAEoAgAiASAAKAIAIgBIIAEgAEprCwcAIAE1AgALDQAgAC8BACABLwEAawsHACABMwEACw0AIAAuAQAgAS4BAGsLDgAgATIBAEL/////D4MLDQAgAC0AACABLQAAawsHACABMQAACw0AIAAsAAAgASwAAGsLDgAgATAAAEL/////D4MLVgEBfyABEBFFBEAgAEHJzABBABAVQoCAgIDgAA8LAn4CQCACRQ0AIAMpAwAiARARDQBCgICAgOAAIAAgARAsIgEQDA0BGiABpyEECyAAIARBAxDmAwsL5AkEBH8BfgF9AXwjAEEQayIGJABCgICAgOAAIQkCQCAAIAEQlgEiCEEASA0AQX8hBQJAAkACQCAIRQ0AQQEhBwJAAkAgBEEBRgRAQX8hByAGIAhBf2o2AgwgAkECSA0BIAAgBiADKQMIEEgNBiAGKwMAIgu9Qv///////////wCDQoGAgICAgID4/wBaBEAgBkEANgIMDAILIAtEAAAAAAAAAABmQQFzRQRAIAsgBigCDLdjQQFzDQIgBgJ/IAuZRAAAAAAAAOBBYwRAIAuqDAELQYCAgIB4CzYCDAwCCyAGIAsgCLegIgs5AwAgC0QAAAAAAAAAAGMNBCAGAn8gC5lEAAAAAAAA4EFjBEAgC6oMAQtBgICAgHgLNgIMDAELIAZBADYCDCACQQJIBEAgCCECDAILIAAgBkEMaiADKQMIIAgiAiACEGENBQwBC0F/IQILIAGnIgAQmAEEQCAEQX9HDQJBAEF/IAMpAwAQERshBQwDCwJ/IAMpAwAiARBUIgNBB0cEQCADDQIgBiABQiCGQiCHIgm5Igs5AwBBAQwBCyAGIAEQSiILOQMAIAsCfiALmUQAAAAAAADgQ2MEQCALsAwBC0KAgICAgICAgIB/CyIJuWELIQMCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAC8BBkFrag4JAQABAwQGBwkKDAsgA0UNCyAJQoABfEKAAlQNAQwLCyADRSAJQv8BVnINCgsgACgCJCEAIAmnIQMgBEEBRgRAIANB//8DcSEDIAYoAgwhBQNAIAIgBUYNCiADIAAgBWotAABGDQsgBiAFIAdqIgU2AgwMAAsACyAAIAYoAgwiAmogA0H//wNxIAggAmsQgAIiAkUNCSACIABrIQUMCQsgA0UNCCAJQoCAAnxCgIAEVA0BDAgLIANFIAlC//8DVnINBwsgACgCJCEAIAYoAgwhBSAJp0H//wNxIQMDQCACIAVGDQYgACAFQQF0ai8BACADRg0HIAYgBSAHaiIFNgIMDAALAAsgA0UNBSAJQoCAgIAIfEKAgICAEFQNAQwFCyADRSAJQv////8PVnINBAsgACgCJCEAIAmnIQMgBigCDCEFA0AgAiAFRg0DIAAgBUECdGooAgAgA0YNBCAGIAUgB2oiBTYCDAwACwALIAu9Qv///////////wCDQoGAgICAgID4/wBaBEAgBEF/Rw0EIAAoAiQhACAGKAIMIQUDQCACIAVGDQMgACAFQQJ0aioCALxB/////wdxQYCAgPwHSw0EIAYgBSAHaiIFNgIMDAALAAsgCyALtiIKu2INAiAAKAIkIQAgBigCDCEFA0AgAiAFRg0CIAAgBUECdGoqAgAgClsNAyAGIAUgB2oiBTYCDAwACwALIAAoAiQhACALvUL///////////8Ag0KBgICAgICA+P8AWgRAIARBf0cNAyAGKAIMIQUDQCACIAVGDQIgACAFQQN0aisDAL1C////////////AINCgICAgICAgPj/AFYNAyAGIAUgB2oiBTYCDAwACwALIAYoAgwhBQNAIAIgBUYNASAAIAVBA3RqKwMAIAthDQIgBiAFIAdqIgU2AgwMAAsAC0F/IQULIARBf0YNAQsgBa0hCQwBCyAFQX9zQR92rUKAgICAEIQhCQsgBkEQaiQAIAkLuAICBH8DfiMAQSBrIgUkAEKAgICA4AAhCwJAIAAgARCWASIIQQBIDQBBLCEHQoCAgIAwIQoCQCACQQFIIARyDQAgAykDACIJEBENACAAIAkQLCIKEAwNAUF/IQcgCqciBigCBEEBRw0AIAYtABAhBwsgACAFQQhqQQAQQxogCEEAIAhBAEobIQNBACECAkADQCACIANHBEACQCACRQ0AIAdBAE4EQCAFQQhqIAcQPEUNAQwECyAFQQhqIAZBACAGKAIEQf////8HcRBYDQMLAkAgACABIAIQeCIJECcNACAJEBENACAJEAwNAyAFQQhqIAQEfiAAIAkQuQQFIAkLEIsBDQMLIAJBAWohAgwBCwsgACAKEAsgBUEIahA4IQsMAQsgBUEIahBFIAAgChALCyAFQSBqJAAgCwurAgMDfwF+AXwjAEEgayIDJAAgAigCBEUEQCABKAIAIQUgAyACKAIAIgEgAigCHCAAKAIAIgAgAigCIGxqIAIoAhgRDAA3AxAgAyABIAIoAhwgBSACKAIgbGogAigCGBEMADcDGAJAIAEgAikDEEKAgICAMEECIANBEGoQIyIGEAwEQCACQQE2AgQMAQsCQAJ/IAZC/////w9YBEAgBqciBEEfdSAEQQBKagwBCyABIANBCGogBhBaQQBIDQEgAysDCCIHRAAAAAAAAAAAZCAHRAAAAAAAAAAAY2sLIgRFBEAgACAFSyAAIAVJayEECyABIAIpAwgQtANBf0oNASACQQE2AgQMAQsgAkEBNgIECyABIAMpAxAQCyABIAMpAxgQCwsgA0EgaiQAIAQL4QQCBn8CfiMAQTBrIgIkACACIAE3AxAgAiAANgIIIAJBADYCDCACIAMpAwAiCjcDGEKAgICA4AAhCwJAAkAgACABEJYBIgRBAEgNACAKEBEiBUUEQCAAIAoQaA0BCwJAIARBAkgNACABpyIDLwEGQWtqIgZB//8DcUEJTw0CIAIgBkEQdEEQdUECdCIHQbzcAWooAgA2AiBBASADLwEGQZkeai0AACIJdCEIIAMoAiQhBiAFRQRAIAAgBEECdBAuIgVFDQJBACEDA0AgAyAERkUEQCAFIANBAnRqIAM2AgAgA0EBaiEDDAELCyACIAg2AiggAiAGNgIkIAUgBEEEQTkgAkEIahDdAgJAIAIoAgxFBEAgACAEIAl0IgMQLiIHDQELIAAgBRAZDAMLIAcgBiADECQhB0EAIQMCQAJAAkACQAJAIAhBf2oOCAABCAIICAgDCAsDQCADIARGDQQgAyAGaiAHIAUgA0ECdGooAgBqLQAAOgAAIANBAWohAwwACwALA0AgAyAERg0DIAYgA0EBdGogByAFIANBAnRqKAIAQQF0ai8BADsBACADQQFqIQMMAAsACwNAIAMgBEYNAiAGIANBAnQiCGogByAFIAhqKAIAQQJ0aigCADYCACADQQFqIQMMAAsACwNAIAMgBEYNASAGIANBA3RqIAcgBSADQQJ0aigCAEEDdGopAwA3AwAgA0EBaiEDDAALAAsgACAHEBkgACAFEBkMAQsgBiAEIAggB0Hg3AFqKAIAIAJBCGoQ3QIgAigCDA0BCyABEA4hCwsgAkEwaiQAIAsPCxABAAvwAQICfwN+IwBBMGsiAiQAQoCAgIDgACEHAkAgACABQQAQmQEiBUUNACAAIAJBDGogAykDACAFKAIoIgQgBBBhDQAgAiAENgIIIAMpAwgiBhARBH8gBAUgACACQQhqIAYgBCAEEGENASACKAIICyACKAIMIgNrQQAQSyEEIAAgAUEAEIUGIgYQDA0AIAUvAQYhBSAAIAYQCyAAIAFBABCGBiIIEAwNACACIAg3AxggAiABNwMQIAIgBK03AyggAiAGpyADIAVBmR5qLQAAdGqtNwMgIABBBCACQRBqEOACIQcgACAIEAsLIAJBMGokACAHC/sCAgR/BH4jAEEgayICJABCgICAgDAhCAJAAkAgACABEJYBIgRBAEgNACAAIAJBDGogAykDACAEIAQQYQ0AIAIgBDYCCCADKQMIIgkQEQR/IAQFIAAgAkEIaiAJIAQgBBBhDQEgAigCCAsgAigCDCIFa0EAEEshAyAAIAFBABCZASIERQ0AIAQvAQYhByACIAOtIgo3AxggAiABNwMQIABBAiACQRBqEOACIggQDA0AIANBAUgNASAAIAEQtAMNACAAIAgQtAMNAAJAIAAgCEEAEJkBIgZFDQAgBC8BBiAGLwEGRw0AIAYQgwQgA0kNACAEEIMEIAMgBWpJDQAgBigCJCAEKAIkIAUgB0GZHmotAAAiAHRqIAMgAHQQJBoMAgtCACEJA0AgCSAKUQ0CIAAgASAFIAmnaq0QngEiCxAMDQEgACAIIAkgC0GAgAEQ3QEhAyAJQgF8IQkgA0F/Sg0ACwsgACAIEAtCgICAgOAAIQgLIAJBIGokACAIC8wCAQF+IAAgARCWASICQQBIBEBCgICAgOAADwsCQCACRQ0AAkACQAJAAkACQCABpyIALwEGQZkeai0AAA4EAAECAwQLIAAoAiQiACACaiECA0AgACACQX9qIgJPDQUgAC0AACEDIAAgAi0AADoAACACIAM6AAAgAEEBaiEADAALAAsgACgCJCIAIAJBAXRqIQIDQCAAIAJBfmoiAk8NBCAALwEAIQMgACACLwEAOwEAIAIgAzsBACAAQQJqIQAMAAsACyAAKAIkIgAgAkECdGohAgNAIAAgAkF8aiICTw0DIAAoAgAhAyAAIAIoAgA2AgAgAiADNgIAIABBBGohAAwACwALIAAoAiQiACACQQN0aiECA0AgACACQXhqIgJPDQIgACkDACEEIAAgAikDADcDACACIAQ3AwAgAEEIaiEADAALAAsQAQALIAEQDgv2AQICfwZ+IwBBIGsiBSQAQoCAgIAwIQgCQAJAIAAgARCWASIGQQBIDQAgACADKQMAIgoQaA0AQoCAgIAwIQkgAkECTgRAIAMpAwghCQsgBkEAIAZBAEobrSELA0AgByALUgRAIAAgASAHEJ4BIggQDA0CIAUgATcDECAFIAc3AwggBSAINwMAIAAgCiAJQQMgBRAjIgwQDA0CIAAgDBAtBEAgBEUEQCAIIQcMBQsgACAIEAsMBAUgACAIEAsgB0IBfCEHDAILAAsLQv////8PQoCAgIAwIAQbIQcMAQsgACAIEAtCgICAgOAAIQcLIAVBIGokACAHC7QEAgR/A34jAEEQayIEJABCgICAgOAAIQkCQCAAIAEQlgEiBkEASA0AAn4gAaciBS8BBiIHQRVGBEAgACAEIAMpAwAQDhC5BQ0CIAQ0AgAMAQsgB0EbTQRAIAAgBCADKQMAEMUBDQIgBDUCAAwBCyAAIAQgAykDABBIDQEgBS8BBkEcRgRAIAQrAwC2vK0MAQsgBCkDAAshCCAEQQA2AgACQCACQQFMBEAgBCAGNgIMDAELIAAgBCADKQMIIAYgBhBhDQEgBCAGNgIMIAJBA0gNACADKQMQIgoQEQ0AIAAgBEEMaiAKIAYgBhBhDQELIAUQmAEEQCAAEHEMAQsCQAJAAkACQAJAAkACQAJAAkAgBS8BBkGZHmotAAAOBAABAgMECyAEKAIMIgIgBCgCACIATA0HIAUoAiQgAGogCKcgAiAAaxBMGgwHCyAEKAIAIgAgBCgCDCICIAAgAkobIQIgCKchAwNAIAAgAkYNBCAFKAIkIABBAXRqIAM7AQAgAEEBaiEADAALAAsgBCgCACIAIAQoAgwiAiAAIAJKGyECIAinIQMDQCAAIAJGDQQgBSgCJCAAQQJ0aiADNgIAIABBAWohAAwACwALIAQoAgAiACAEKAIMIgIgACACShshAgNAIAAgAkYNBCAFKAIkIABBA3RqIAg3AwAgAEEBaiEADAALAAsQAQALIAQgAjYCAAwCCyAEIAI2AgAMAQsgBCACNgIACyABEA4hCQsgBEEQaiQAIAkL7wECA38CfiMAQRBrIgUkAEKAgICA4AAhBwJAIAAgARCWASIEQQBIDQAgACAFQQxqIAMpAwAgBCAEEGENACAAIAVBCGogAykDCCAEIAQQYQ0AIAUgBDYCBAJ/IAQgAkEDSA0AGiAEIAMpAxAiCBARDQAaIAAgBUEEaiAIIAQgBBBhDQEgBSgCBAsgBSgCCCIGayAEIAUoAgwiA2sQsQEiAkEBTgRAIAGnIgQQmAEEQCAAEHEMAgsgBCgCJCIAIAMgBC8BBkGZHmotAAAiA3RqIAAgBiADdGogAiADdBDjAQsgARAOIQcLIAVBEGokACAHCz4CAX8BfiMAQRBrIgEkACABQQhqQQAQAhogAEIBIAE0AgwgATQCCELAhD1+fCICIAJQGzcD0AEgAUEQaiQAC0oCAX8BfkKAgICAMCEDAkAgAUKAgICAcFQNACABpy8BBiICQWtqQf//A3FBCEsNACAAIAAoAhAoAkQgAkEYbGooAgQQMiEDCyADCywBAX5CgICAgOAAIQUgACABELQDBH5CgICAgOAABSAAIAEgAiADIAQQ/gQLC4MDAgh/An4jAEEQayIFJABCgICAgOAAIQ1CgICAgDAhDAJAIAAgAUEAEJkBIgRFDQAgACAFIAMQgAQNAAJAAkACQAJAIAUpAwAiA0IAUw0AIAQQmAENAyAAIAIQKiIMEAwNBCAMpyIGLwEGQWtqQf//A3FBCE0EQCAGKAIgIggoAgwoAiAiCS0ABA0EIAQvAQYhByAEKAIgIgooAgwoAiAhCyAFIAY1AigiAjcDCCADIAQ1AiggAn1VDQEgBi8BBiAHRw0CIAMgB0GZHmoxAAAiAYanIAsoAgggCigCEGpqIAkoAgggCCgCEGogAiABhqcQ4wEMAwsgACAFQQhqIAwQQA0EIAMgBDUCKCAFKQMIIgJ9Vw0BCyAAQb3DABBqDAMLIAOnIQZBACEEA0AgAiAErVcNASAAIAwgBBB4IgMQDA0DIAQgBmohByAEQQFqIQQgACABIAcgAxCUAkF/Sg0ACwwCC0KAgICAMCENDAELIAAQcQsgACAMEAsgBUEQaiQAIA0LLAEBfkKAgICAMCEEIAAgASADKQMAIAJBAk4EfiADKQMIBUKAgICAMAsQgwoLSgIBfwF+QoCAgIDgACEEIAAgASACEJkBIgMEfiADEJgBBEAgAkUEQEIADwsgABBxQoCAgIDgAA8LIAMoAiA1AhQFQoCAgIDgAAsLHgAgACABQQAQmQEiAEUEQEKAgICA4AAPCyAANQIoCz0BAX5CgICAgBAhASADKQMAIgRCgICAgHBaBH4gBKcvAQZBa2pB//8DcUEKSa1CgICAgBCEBUKAgICAEAsLkAMCAX8FfiMAQSBrIgIkAEKAgICA4AAhCQJAIAAgASAEEGkiBUUNACAFLQAEBEAgABBxDAELIAAgAkEYaiADKQMAQgAgBTQCACIGIAYQfQ0AIAIgBjcDECADKQMIIgcQEQR+IAYFIAAgAkEQaiAHQgAgBiAGEH0NASACKQMQCyACKQMYIgp9ELgEIQggACABQoCAgIAwEO8BIgcQDARAIAchCQwBCwJAIAcQEQRAIABCgICAgDAgCCAEEOUDIQYMAQsgAiAIQoCAgIAIfEL/////D1gEfiAIQv////8PgwUgCLkQFgs3AwggACAHQQEgAkEIahCvASEGIAAgBxALIAAgAikDCBALCwJAIAYQDA0AAkAgACAGIAQQaSIDRQ0AIAAgBiABEFkEQCAAQaDRAUEAEBUMAQsCQCADLQAEDQAgCCADNAIAVQRAIABBwdEBQQAQFQwCCyAFLQAEDQAgAygCCCAFKAIIIAqnaiAIpxAkGgwCCyAAEHELIAAgBhALDAELIAYhCQsgAkEgaiQAIAkLLgAgACABIAIQaSIARQRAQoCAgIDgAA8LIAAoAgAiAEEATgRAIACtDwsgALgQFgv2AgEBfiABQSgQQSECIARBATYCAAJAAkAgAkUEQCAAQdDPAUEAEBUMAQsCQAJAAkACQAJAAkACQAJAIAIoAgBBf2oOBAICBwEACyAFRQ0CIAAgAhCwBAtCgICAgDAhASAFQX9qDgIDBAcLIAMpAwAQDiEBAkAgBUECRw0AQQEhAyACKAIAQQFHDQAgACABEJABDAILIAIoAkQiAyAFrTcDACADQXhqIAE3AwAgAiADQQhqNgJEC0EAIQMLIAJBAzYCACACIAM2AhQgACACQQhqELsCIQEgAkEBNgIAIAEQDARAIAAgAhCwBCABDwsgAigCREF4aiIDKQMAIQYgA0KAgICAMDcDACABQv////8PWARAIAGnQQJGBEAgAkECNgIAIARBAjYCACAGDwsgBEEANgIAIAYPCyAAIAEQCyAAIAIQsAQgBg8LIAMpAwAQDg8LIAAgAykDABAOEJABDAELIABB4M8BQQAQFQtCgICAgOAAIQELIAELZgEBfiADKQMAIgEQ5wNFBEAgAEHkyQBBABAVQoCAgIDgAA8LQoCAgIAwIQQgAacpAgRCgICAgICAgIBAg0KAgICAgICAgIB/UQR+IAFC/////w+DQoCAgICQf4QQDgVCgICAgDALCy8BAX5CgICAgOAAIQEgACADKQMAECwiBBAMBH5CgICAgOAABSAAIASnQQIQ5gMLC0kCAX8BfiAAIAEQsQQiARAMBEAgAQ8LQoCAgIAwIQMgAaciAigCBEGAgICAeEcEQCAAIAAoAhAgAhDOAhAyIQMLIAAgARALIAMLCQAgACABELEEC04BAX4jAEEQayICJAAgAiAAIAEQsQQiATcDCAJAIAEQDARAIAEhBAwBCyAAQoCAgIAwQQEgAkEIahCHBiEEIAAgARALCyACQRBqJAAgBAtAAQF+IAAgAykDABD2AUEAR61CgICAgBCEIQQgARARBEAgBA8LIAAgAUEGEG0iARAMRQRAIAAgASAEEOkBCyABCy0AQoCAgIDgACAAIAMpAwAgAykDCEEAEJgCIgBBAEetQoCAgIAQhCAAQQBIGwuKAQEEfiADKQMQIQYgAykDCCEHIAMpAwAiASEEIAJBBE4EQCADKQMYIQQLIAFC/////29YBEAgABApQoCAgIDgAA8LQoCAgIDgACEFAkAgACAHEDoiAkUNACAAIAEgAiAGEA4gBEEAEPoDIQMgACACEBIgA0EASA0AIANBAEetQoCAgIAQhCEFCyAFCyoAIAMpAwAiAUL/////b1gEQCAAEClCgICAgOAADwsgACABQQNBABD2AgtjAQF+IAMpAwAiBEL/////b1gEQCAAEClCgICAgOAADwtCgICAgOAAIQECQCAAIAMpAwgQOiICRQ0AIAAgBCACEHchAyAAIAIQEiADQQBIDQAgA0EAR61CgICAgBCEIQELIAELYwECfgJAAkAgAykDACIBQv////9vWARAIAAQKQwBCyADKQMIIQUgASEEIAJBA04EQCADKQMQIQQLIAAgBRA6IgINAQtCgICAgOAADwsgACABIAIgBEEAEBMhASAAIAIQEiABC2YBAX4gAykDACIEQv////9vWARAIAAQKUKAgICA4AAPC0KAgICA4AAhAQJAIAAgAykDCBA6IgJFDQAgACAEIAJBABDaASEDIAAgAhASIANBAEgNACADQQBHrUKAgICAEIQhAQsgAQuLAQIBfwJ+IwBBEGsiBCQAIAMpAwghBSADKQMAIgYhAQJAAkACQAJAIAJBA0gNACADKQMQIgEQsgENACAAQcnMAEEAEBUMAQsgACAEQQxqIAUQ/QMiAg0BC0KAgICA4AAhAQwBCyAAIAYgASAEKAIMIgMgAhCJAyEBIAAgAiADEI8DCyAEQRBqJAAgAQscACAAIAMpAwBBACACQX9qEEsgA0EIakECEJEDC0MAIwBBEGsiAiQAAn5CgICAgOAAIAAgAkEMaiADKQMAEMUBDQAaQiAgAigCDCIARQ0AGiAAZ60LIQEgAkEQaiQAIAELUAAjAEEQayICJABCgICAgOAAIQECQCAAIAJBDGogAykDABCRAg0AIAAgAkEIaiADKQMIEJECDQAgAigCCCACKAIMbK0hAQsgAkEQaiQAIAELRwEBfgJAAkAgAkUEQAwBCyAAIAMpAwAQtAUiBBAMDQELIAEQEQ0AIAAgAUEEEG0iARAMRQRAIAAgASAEEOkBCyABIQQLIAQLBgAgALa7CzUBAX4gACAAKQMAIgFCDIggAYUiAUIZhiABhSIBQhuIIAGFIgE3AwAgAUKdurP7lJL9oiV+CyYAIABB0AFqEJ0KQgyIQoCAgICAgID4P4S/RAAAAAAAAPC/oBAWC9cBAgJ/AXwjAEEQayIEJAAgBEIANwMIAkACfEQAAAAAAAAAACACQQFIDQAaQoCAgIDgACEBIAAgBEEIaiADKQMAEEgNAUEBIQUgAkEBRwRAA0AgAiAFRwRAIAAgBCADIAVBA3RqKQMAEEgNBCAEIAQrAwggBCsDABCrCTkDCCAFQQFqIQUMAQsLIAQrAwgMAQsgBCsDCJkLIga9An8gBplEAAAAAAAA4EFjBEAgBqoMAQtBgICAgHgLIgW3vVEEQCAFrSEBDAELIAYQFiEBCyAEQRBqJAAgAQtbAQF/AkAgAL1C////////////AINCgICAgICAgPj/AFYgAEQAAAAAAAAAAGFyDQAgAEQAAAAAAAAAAGMhAUQAAAAAAADwvyEAIAENAEQAAAAAAADwPyEACyAAC4MBAgF/An4gAL0iAkI0iKdB/w9xIgFB/gdNBEAgAkKAgICAgICAgIB/gyEDIAFB/gdHIAJCgICAgICAgPC/f1FyRQRAIANCgICAgICAgPg/hL8PCyADvw8LIAFBsghNBHwgAkI/hyACfEIBQbMIIAFrrYYiAkIBiHxCACACfYO/BSAACwsvACAARAAAAAAAAAAAYiABRAAAAAAAAAAAYnJFBEAgAb0gAL2Evw8LIAAgARCBCQsvACAARAAAAAAAAAAAYiABRAAAAAAAAAAAYnJFBEAgAb0gAL2Dvw8LIAAgARCACQu6AwIFfwJ8IwBBEGsiBiQAAn4gAkUEQEQAAAAAAADw/0QAAAAAAADwfyAEGxAWDAELAkAgAykDACIBQv////8PWARAIAJBASACQQFKGyEJIAGnIQdBASEFA0AgBSAJRwRAIAMgBUEDdGopAwAiAUKAgICAEFoEQCAGIAe3OQMIDAQFIAGnIQgCfyAEBEAgByAIEEsMAQsgByAIELEBCyEHIAVBAWohBQwCCwALCyAHrQwCC0KAgICA4AAgACAGQQhqIAEQSA0BGkEBIQULIAUgAiAFIAJKGyECA0AgAiAFRwRAQoCAgIDgACAAIAYgAyAFQQN0aikDABBIDQIaAkAgBisDCCILvUL///////////8Ag0KAgICAgICA+P8AVg0AIAYrAwAiCr1C////////////AINCgYCAgICAgPj/AFoEQCAGIAo5AwgMAQsgBARAIAYgCyAKEKMKOQMIDAELIAYgCyAKEKIKOQMICyAFQQFqIQUMAQsLIAYrAwgiCr0CfyAKmUQAAAAAAADgQWMEQCAKqgwBC0GAgICAeAsiALe9UQRAIACtDAELIAoQFgshASAGQRBqJAAgAQvQAQECfyMAQRBrIgIkAAJ+IAAgAUEmEGkiA0UEQCAEQQA2AgBCgICAgOAADAELAkAgAykDACIBEBFFBEAgAiADKAIMIgU2AgwgBSABpyIGKAIEQf////8HcUkNASAAIAEQCyADQoCAgIAwNwMACyAEQQE2AgBCgICAgDAMAQsgBiACQQxqENcBIQcgAyACKAIMNgIMIARBADYCACAHQf//A00EQCAAIAdB//8DcRCcAwwBCyAAIAYgBUEBdGpBEGpBAhCOBAshASACQRBqJAAgAQudAQEDfyABKAIAIgJBAUgEQEEADwsgAkF/aiEEAkACQCAAKAIEQX9MBEAgACAEQQF0ai8BECIDQYD4A3FBgLgDRyACQQJIcg0BIAAgAkF+aiICQQF0ai8BECIAQYDQAGpB//8DcUGACEsNASADQf8HcSAAQf8HcUEKdHJBgIAEaiEDDAILIAAgBGotABAhAwsgBCECCyABIAI2AgAgAwvZAgICfwJ+IwBBIGsiAiQAQoCAgIDgACEHAkAgACABEF8iARAMDQAgACACQQhqQQcQQxogAkEIakE8EDwaIAJBCGogBEEDdCIFQcDCAWooAgAiBhCJARpBnj0gBHZBAXFFBEAgAkEIakEgEDwaIAJBCGogBUHEwgFqKAIAEIkBGiACQQhqQcHDARCJARogACADKQMAEF8iCBAMBEAgACABEAsgAkEIahBFDAILIAinIQNBACEEA0AgBCADKAIEQf////8HcU9FBEACQCADIAQQMCIFQSJGBEAgAkEIakHEwwEQiQEaDAELIAJBCGogBRCSARoLIARBAWohBAwBCwsgACAIEAsgAkEIakEiEDwaCyACQQhqQT4QPBogAkEIaiABEIsBGiACQQhqQcvDARCJARogAkEIaiAGEIkBGiACQQhqQT4QPBogAkEIahA4IQcLIAJBIGokACAHC4oBAQJ/IwBBEGsiAiQAIAIgATYCDANAIAAgAkEMahCmCiIDEPYFDQALAkAgAxD4BUUEQEEAIQMMAQtBASEDIAIgAUEBaiIBNgIMA0AgASAAKAIEQf////8HcU4NASAAIAJBDGoQ1wEiARD2BQRAIAIoAgwhAQwBCwsgARD4BUUhAwsgAkEQaiQAIAMLogIBA38jAEEwayICJAACQCAAIAEQXyIBEAwNACABpyIFKAIEQf////8HcSIDRQ0AAkAgACACQRhqIAMQQw0AQQAhAyACQQA2AhQDQAJAIAMgBSgCBEH/////B3FIBEACQAJAIARFIAUgAkEUahDXASIDQaMHR3INACAFIAIoAhRBf2oQqApFDQAgAkHCBzYCCEEBIQYMAQsgAkEIaiADIAQQpwQiBkEBTg0AQQAhBgtBACEDA0AgAyAGRg0CIANBAnQhByADQQFqIQMgAkEYaiAHIAJBCGpqKAIAEL4BRQ0ACwwDCyAAIAEQCyACQRhqEDghAQwDCyACKAIUIQMMAAsACyAAIAEQCyACQRhqEEVCgICAgOAAIQELIAJBMGokACABC1oBAX5CgICAgOAAIQQgACABEF8iARAMBH5CgICAgOAABSAAIAMpAwAQLCIEEAwEQCAAIAEQC0KAgICA4AAPCyABpyAEpxCTAiECIAAgARALIAAgBBALIAKtCwsJACAAIAEQ7gQLXAEBfwJAIAFCIIinIgJBf0cEQCACQXlHDQEgARAODwsgAaciAi8BBkEFRw0AIAIpAyAiAUKAgICAcINCgICAgJB/Ug0AIAEQDg8LIABBwNMAQQAQFUKAgICA4AALCQAgACABEKwKC6ABAgF/AX4gACABEF8iARAMBEAgAQ8LIAGnIgUoAgRB/////wdxIQJBACEDAkAgBEEBcUUNAANAIAIgA0YEQCACIQMMAgsgBSADEDAQsQNFDQEgA0EBaiEDDAALAAsCQCAEQQJxRQRAIAIhBAwBCwNAIAIiBCADTA0BIAUgBEF/aiICEDAQsQMNAAsLIAAgBSADIAQQmgEhBiAAIAEQCyAGC6cDAgZ/A34jAEEgayIFJABCgICAgOAAIQwCQCAAIAEQXyIBEAwNAAJAAkAgACAFQQRqIAMpAwAQwwENACAFKAIEIgcgAaciCSgCBEH/////B3EiCEwNAUEgIQpCgICAgDAhCwJAIAJBAkgNACADKQMIIg0QEQ0AIAAgDRAsIgsQDA0BAkACQCALpyIGKAIEQf////8HcQ4CAAECCyAAIAsQCwwDCyAGQQAQMCEKQQAhBgsgB0GAgICABE4EQCAAQfQNQQAQQgwBCyAAIAVBCGogBxBDRQRAAkAgBARAIAVBCGogCUEAIAgQWA0BCyAHIAhrIQMCQAJAAkAgBgRAA0AgA0EBSA0CIAVBCGogBkEAIAMgBigCBEH/////B3EQsQEiAhBYDQQgAyACayEDDAALAAsgBUEIaiAKIAMQiAZFDQEMAwsgBSADNgIECyAERQRAIAVBCGogCUEAIAgQWA0CCyAAIAsQCyAAIAEQCyAFQQhqEDghDAwFCyAFIAM2AgQLIAVBCGoQRQsgACALEAsLIAAgARALDAELIAEhDAsgBUEgaiQAIAwL9wQCBX8EfiMAQdAAayICJAAgAykDCCENIAMpAwAhCgJAAkACQCABEBFFBEAgARAnRQ0BCyAAQZPOAEEAEBUMAQsCQCAKEBENACAKECcNACAEBEAgACAKEIoGQQBIDQILQoCAgIDgACELIAAgCkHGASAKQQAQEyIMEAwNAiAMEBENACAMECcNACACIA03AyggAiABNwMgIAAgDCAKQQIgAkEgahA2IQsMAgsgACACQQhqQQAQQxpCgICAgDAhDAJAIAAgARAsIgsQDARAQoCAgIAwIQoMAQsgACAKECwiChAMDQAgACANEDsiCUUEQCAAIA0QLCIMEAwNAQsgC6chBiAKpyIIKQIEIQEDQAJAAkAgAUL/////B4NQBEBBACEDIAdFDQEgBSAGKAIEQf////8HcU4NAiAFQQFqIQMMAQsgBiAIIAUQiQYiA0F/Sg0AIAcNASACQQhqEEUgACAKEAsgACAMEAsMBQsgAiAKNwMgAn4gCQRAIAIgCzcDMCACIAOtNwMoIAAgACANQoCAgIAwQQMgAkEgahAjED4MAQsgAiAMNwNIIAJCgICAgDA3A0AgAkKAgICAMDcDOCACIAs3AyggAiADrTcDMCAAIAJBIGoQ8QQLIgEQDA0CIAJBCGogBiAFIAMQWBogAkEIaiABEIsBGiAIKQIEIgGnQf////8HcSADaiEFQQEhByAEDQELCyACQQhqIAYgBSAGKAIEQf////8HcRBYGiAAIAoQCyAAIAwQCyAAIAsQCyACQQhqEDghCwwCCyACQQhqEEUgACAKEAsgACAMEAsgACALEAsLQoCAgIDgACELCyACQdAAaiQAIAsLgwICA38BfiMAQSBrIgIkAAJAAkAgACABEF8iARAMDQAgACACIAMpAwAQgAQNACACKQMAIgdCgICAgAhaBEAgAEGkwgEQagwBCyAHpyIDQQFGDQEgAaciBSkCBKciBkH/////B3EiBEUNASAHIAStfkKAgICABFkEQCAAQfQNQQAQQgwBCyAAIAJBCGogAyAEbCAGQR92EKEDDQACQCAEQQFHBEADQCADQQFIDQIgAkEIaiAFQQAgBBBYGiADQX9qIQMMAAsACyACQQhqIAVBABAwIAMQiAYaCyAAIAEQCyACQQhqEDghAQwBCyAAIAEQC0KAgICA4AAhAQsgAkEgaiQAIAELpQECAn8CfiMAQRBrIgIkAAJAIAAgARBfIgEQDARAIAEhBgwBC0KAgICA4AAhBgJAIAAgAkEMaiADKQMAIAGnIgUoAgRB/////wdxIgQgBBBhDQAgAiAENgIIIAMpAwgiBxARRQRAIAAgAkEIaiAHIAQgBBBhDQEgAigCCCEECyAAIAUgAigCDCIDIAQgAxBLEJoBIQYLIAAgARALCyACQRBqJAAgBgunAQIDfwJ+IwBBEGsiAiQAAkAgACABEF8iARAMBEAgASEHDAELQoCAgIDgACEHAkAgACACQQxqIAMpAwAgAaciBigCBEH/////B3EiBCAEEGENACACIAQgAigCDCIFayIENgIIIAAgBiAFIAMpAwgiCBARBH8gBAUgACACQQhqIAggBEEAEGENASACKAIICyAFahCaASEHCyAAIAEQCwsgAkEQaiQAIAcLugECAn8CfiMAQRBrIgIkAAJAIAAgARBfIgEQDARAIAEhBgwBC0KAgICA4AAhBgJAIAAgAkEMaiADKQMAIAGnIgUoAgRB/////wdxQQAQYQ0AIAIgBSgCBEH/////B3EiBDYCCCADKQMIIgcQEUUEQCAAIAJBCGogByAEQQAQYQ0BIAIoAgghBAsgACAFIAIoAgwiAyAEIAMgBEgiBRsgBCADIAUbEJoBIQYLIAAgARALCyACQRBqJAAgBguGBAIEfwd+IwBBEGsiAiQAIAMpAwghCSADKQMAIQgCQAJAAkAgARARRQRAIAEQJ0UNAQsgAEGTzgBBABAVDAELAkAgCBARIgQNACAIECcNAEKAgICA4AAhCiAAIAhByAEgCEEAEBMiCxAMDQIgCxARDQAgCxAnDQAgAiAJNwMIIAIgATcDACAAIAsgCEECIAIQNiEKDAILQoCAgIAwIQsCQCAAIAEQLCIMEAwEQEKAgICAMCEKDAELIAAQTyIKEAwNAAJAIAkQEQRAIAJBfzYCAAwBCyAAIAIgCRDFAUEASA0BCyAMpyIFKQIEIQkgACAIECwiCxAMDQACQCACKAIARQ0AIAmnQf////8HcSEGQQAhA0IAIQECQCAEDQAgC6ciBykCBEL/////B4MhCCAGBEAgCUL/////B4MgCH0gCFCtIgl9IQ0DQCABIAl8Ig4gDVUNAiAFIAcgDqcQiQYiBEEASA0CIAAgBSABpyAEEJoBIgEQDA0EIAAgCiADrSABQQAQqwFBAEgNBCAIIASsfCEBIANBAWoiAyACKAIARw0ACwwCCyAIUA0BCyAAIAUgAacgBhCaASIBEAwNASAAIAogA60gAUEAEKsBQQBIDQELIAAgDBALIAAgCxALDAILIAAgChALIAAgDBALIAAgCxALC0KAgICA4AAhCgsgAkEQaiQAIAoL0wIBA34jAEEwayICJAAgAiABNwMoIAMpAwAhBQJAAkAgARARRQRAIAEQJ0UNAQsgAEGTzgBBABAVQoCAgIDgACEHDAELAkAgBRARDQAgBRAnDQBCgICAgOAAIQcgACAFIAQgBUEAEBMiBhAMDQECQCAEQcUBRw0AIAAgBRCKBkF/Sg0AIAAgBhALDAILIAYQEQ0AIAYQJw0AIAAgBiAFQQEgAkEoahA2IQcMAQsgAiAAIAEQLCIGNwMIQoCAgIDgACEHIAYQDA0AIAIgBTcDEAJAAkACfyAEQcUBRwRAQoCAgIAwIQFBAQwBCyAAQYTCARByIgEQDA0BIAIgATcDGEECCyEDIAAgACkDSCADIAJBEGoQrwEhBSAAIAEQCyAFEAxFDQELIAAgBhALDAELIAAgBSAEQQEgAkEIahCzAiEHIAAgAikDCBALCyACQTBqJAAgBwv5AgIFfwN+IwBBEGsiBSQAAkAgACABEF8iChAMBEAgCiEBDAELAkAgACADKQMAEPUDIgYEQEKAgICA4AAhAUKAgICAMCELIAZBAUgNASAAQfDBAUEAEBUMAQtCgICAgOAAIQEgACADKQMAECwiCxAMDQAgC6ciBygCBCEIIAUgCqciCSgCBEH/////B3EiBkEAIARBAkYbNgIMAkAgAkECSA0AIAMpAwgiDBARDQAgACAFQQxqIAwgBkEAEGENAQsgBiAIQf////8HcSIGayECAkACQAJAAkAgBA4CAAECCyAFKAIMIQMMAgsgBSgCDCIDIAJKIQRCgICAgBAhASADIQIgBEUNAQwCCyAFIAUoAgwgBmsiAzYCDCADIQILQoCAgIAQIQEgA0EASCADIAJKcg0AA0AgCSAHIANBACAGELIERQRAQoGAgIAQIQEMAgsgAiADRyEEIANBAWohAyAEDQALCyAAIAoQCyAAIAsQCwsgBUEQaiQAIAELmAMDB38BfgF8IwBBEGsiBSQAAkAgACABEF8iARAMDQACQAJAIAAgAykDABAsIgwQDA0AIAynIgooAgRB/////wdxIQYgAaciCygCBEH/////B3EhBwJAIAQEQCAFIAcgBmsiBDYCDEF/IQggAkECSA0BIAAgBSADKQMIEEgNAiAFKwMAIg29Qv///////////wCDQoCAgICAgID4/wBWDQEgBQJ/QQAgDUQAAAAAAAAAAGVBAXNFDQAaIA0gBLdjQQFzDQIgDZlEAAAAAAAA4EFjBEAgDaoMAQtBgICAgHgLIgQ2AgwMAQtBACEEIAVBADYCDCACQQJOBEAgACAFQQxqIAMpAwggB0EAEGENAiAFKAIMIQQLIAcgBmshCUEBIQgLQX8hAyAJIARrIAhsQQBIIAcgBklyDQEDQCALIAogBEEAIAYQsgRFBEAgBCEDDAMLIAQgCUYNAiAEIAhqIQQMAAsACyAAIAEQCyAAIAwQC0KAgICA4AAhAQwBCyAAIAEQCyAAIAwQCyADrSEBCyAFQRBqJAAgAQuEAQEBfiMAQRBrIgIkAAJAIAAgARBfIgQQDARAIAQhAQwBC0KAgICA4AAhAQJAIAAgAkEMaiADKQMAEMMBDQBCgICAgDAhASACKAIMIgNBAEgNACADIASnIgMoAgRB/////wdxTg0AIAMgAkEMahDXAa0hAQsgACAEEAsLIAJBEGokACABC0wBAX8gAkEAIAJBAEobIQIgACABEF8hAQNAAkAgAiAERg0AIAEQDA0AIAAgASADIARBA3RqKQMAEA4QwQIhASAEQQFqIQQMAQsLIAELrQECAn8BfiMAQRBrIgIkAAJAIAAgARBfIgYQDARAIAYhAQwBCwJ+QoCAgIDgACAAIAJBDGogAykDABDDAQ0AGgJAIAIoAgwiA0EATgRAIAMgBqciBCgCBCIFQf////8HcUgNAQsgAEEAQQAQ0AIMAQsgAAJ/IAVBf0wEQCAEIANBAXRqLwEQDAELIAMgBGotABALQf//A3EQnAMLIQEgACAGEAsLIAJBEGokACABC50BAgJ/AX4jAEEQayICJAACQCAAIAEQXyIGEAwEQCAGIQEMAQtCgICAgOAAIQECQCAAIAJBDGogAykDABDDAQ0AQoCAgIDAfiEBIAIoAgwiA0EASA0AIAMgBqciBCgCBCIFQf////8HcU4NACAFQX9MBEAgBCADQQF0ajMBECEBDAELIAMgBGoxABAhAQsgACAGEAsLIAJBEGokACABC5YCAgF/Bn4jAEEgayIEJAAgACAEQQhqQQAQQxpCgICAgDAhBgJ+AkACQCAAIAMpAwAQKiIHEAwNACAAIAAgB0HwACAHQQAQExD5BCIGEAwNACAAIAQgBhBAQQBIDQBCACEBIAQpAwAiBUIAIAVCAFUbIQggBUJ/fCEJIAKsIQoDQCABIAhRDQIgACAAIAYgARBgED4iBRAMDQEgBEEIaiAFEIsBGiABIAlZIQIgAUIBfCIFIQEgAg0AIAUiASAKWQ0AIARBCGogAyABp0EDdGopAwAQigFFDQALCyAAIAcQCyAAIAYQCyAEQQhqEEVCgICAgOAADAELIAAgBxALIAAgBhALIARBCGoQOAshASAEQSBqJAAgAQvsAQIDfwF8IwBBIGsiBCQAAn4CQCAAIAQgAhBDDQAgAkEAIAJBAEobIQYCQANAIAUgBkcEQAJAIAMgBUEDdGopAwAiAUL/////D1gEQCABpyICQf//wwBNDQEMBAsgACAEQRhqIAEQSA0EIAQrAxgiB0QAAAAAAAAAAGMgB0QAAAAA//8wQWRyDQMgBwJ/IAeZRAAAAAAAAOBBYwRAIAeqDAELQYCAgIB4CyICt2INAwsgBUEBaiEFIAQgAhC+AUUNAQwDCwsgBBA4DAILIABB8LgBEGoLIAQQRUKAgICA4AALIQEgBEEgaiQAIAELigEBAn8jAEEgayIEJAAgACAEQQhqIAIQQxogAkEAIAJBAEobIQICfgNAIAIgBUcEQAJAIAAgBEEEaiADIAVBA3RqKQMAEJECRQRAIARBCGogBC8BBBCSAUUNAQsgBEEIahBFQoCAgIDgAAwDCyAFQQFqIQUMAQsLIARBCGoQOAshASAEQSBqJAAgAQsJACAAIAEQiwYLHwAgACABEIsGIgEQDAR+IAEFIABBA0ECIAGnGxAyCwsyACAAvUKAgICAgICA+P8Ag0KAgICAgICA+P8AUiAAnCAAYXEgAJlE////////P0NlcQtVACMAQRBrIgIkAAJ+QoCAgIAQIAMpAwAiARCMAUUNABpCgICAgOAAIAAgAkEIaiABEEgNABogAisDCBDCCkEAR61CgICAgBCECyEBIAJBEGokACABCyYAQoCAgIDgACAAIAMpAwAQuAUiAEEAR61CgICAgBCEIABBAEgbCyAAIAMpAwAQjAFFBEBCgICAgBAPCyAAIAEgAiADELUECyAAIAMpAwAQjAFFBEBCgICAgBAPCyAAIAEgAiADELYECwkAIAAgARCmAgtGAQJ/IwBBEGsiAiQAQX8hAwJAIAAgAkEMaiABEMMBDQAgAigCDCIDQX5qQSNJDQAgAEHmtAEQakF/IQMLIAJBEGokACADC4QCAQF+IAACfiABEBEEQCAAEPQDIQELIAELQTsgAUEAEBMiBRAMBEAgBQ8LAkACQCAAAn4gBRAhRQRAIAAgBRALIAAgARCFAyICRQ0CAn8gBEF/TARAIAIoAihBGGoMAQsgAiAEQQN0akHYAGoLKQMAEA4hBQsgBQtBAxBRIQEgACAFEAsgARAMDQECQCADIARBB0ZBA3RqKQMAIgUQEUUEQCAAIAUQLCIFEAwNASAAIAFBMyAFQQMQGhoLIARBB0YEQCAAIAMpAwAQnggiBRAMDQEgACABQTQgBUEDEBoaCyAAIAFBAEEAQQEQvwIgAQ8LIAAgARALC0KAgICA4AAhAQsgAQtZAgF/AX4CQEGApwQoAgAEQEGEpwQoAgAhAgwBC0GApwQQvQUiAjYCAEGEpwQgAhDVBCICNgIACyACIAAgABBEQYAIEJoFIgMgARCfAxpBhKcEKAIAIAMQCwsLkZcEcABBgAgLQTxldmFsU2NyaXB0PgA8aW5pdFNjcmlwdD4APGNvbW1GdW4+AHcAbmFtZQBzdGFjawBtZXNzYWdlAAAAAAAAAACMAEHMCAsNjQAAADoAAAA7AAAAjgBB5AgLPY8AAAA8AAAAPQAAAJAAAAA8AAAAPQAAAJEAAAA8AAAAPQAAAJIAAAA8AAAAPQAAAJMAAAA6AAAAOwAAAJMAQawJCw2WAAAAPAAAAD0AAACMAEHECQvZApcAAAA+AAAAPwAAAJcAAABAAAAAQQAAAJcAAABCAAAAQwAAAJcAAABEAAAARQAAAJgAAABAAAAAQQAAAJkAAABGAAAARwAAAJoAAABIAAAAAAAAAJsAAABJAAAAAAAAAJwAAABJAAAAAAAAAJ0AAABKAAAASwAAAJ4AAABKAAAASwAAAJ8AAABKAAAASwAAAKAAAABKAAAASwAAAKEAAABKAAAASwAAAKIAAABKAAAASwAAAKMAAABKAAAASwAAAKQAAABKAAAASwAAAKUAAABKAAAASwAAAKYAAABKAAAASwAAAKcAAABMAAAATQAAAKgAAABMAAAATQAAAKkAAABMAAAATQAAAKoAAABMAAAATQAAAKsAAABOAAAATwAAAKwAAABOAAAATwAAAK0AAABQAAAAUQAAAK4AAABQAAAAUQAAAK8AAABSAAAAUwAAALAAAABUAAAAVQBBrAwLAVYAQbwMCw1XAAAAAAAAAFgAAABZAEHoDAsBWgBB9AwL8wFbAAAAXAAAAF0AAAAAAAAAbGlzdF9lbXB0eSgmcnQtPmdjX29ial9saXN0KQAvdG1wL3F1aWNranMvcXVpY2tqcy5jAEpTX0ZyZWVSdW50aW1lAGN0eC0+aGVhZGVyLnJlZl9jb3VudCA9PSAwAEpTX0ZyZWVDb250ZXh0ACV1AHN0cmluZyB0b28gbG9uZwBfX0pTX0ZyZWVWYWx1ZTogdW5rbm93biB0YWc9JWQKAFF1aWNrSlMgbWVtb3J5IHVzYWdlIC0tIDEuMC4wIHZlcnNpb24sICVkLWJpdCwgbWFsbG9jIGxpbWl0OiAlbGxkCgoAQfAOC6UMmAcAAOAAAACiBwAA+AAAAKwHAAAwAAAAtQcAABAAAAC+BwAAWAAAAEpTUnVudGltZQBKU0NvbnRleHQASlNPYmplY3QASlNTdHJpbmcASlNGdW5jdGlvbkJ5dGVjb2RlACAgJTN1ICsgJS0ydSAgJXMKACAgbWFsbG9jX3VzYWJsZV9zaXplIHVuYXZhaWxhYmxlCgAKSlNPYmplY3QgY2xhc3NlcwoAICAlNWQgICUyLjBkICVzCgBub25lAG90aGVyAAoAJS0yMHMgJThzICU4cwoATkFNRQBDT1VOVABTSVpFACUtMjBzICU4bGxkICU4bGxkICAoJTAuMWYgcGVyIGJsb2NrKQoAbWVtb3J5IGFsbG9jYXRlZAAlLTIwcyAlOGxsZCAlOGxsZCAgKCVkIG92ZXJoZWFkLCAlMC4xZiBhdmVyYWdlIHNsYWNrKQoAbWVtb3J5IHVzZWQAJS0yMHMgJThsbGQgJThsbGQgICglMC4xZiBwZXIgYXRvbSkKAGF0b21zACUtMjBzICU4bGxkICU4bGxkICAoJTAuMWYgcGVyIHN0cmluZykKAHN0cmluZ3MAJS0yMHMgJThsbGQgJThsbGQgICglMC4xZiBwZXIgb2JqZWN0KQoAb2JqZWN0cwAgIHByb3BlcnRpZXMAJS0yMHMgJThsbGQgJThsbGQgICglMC4xZiBwZXIgc2hhcGUpCgAgIHNoYXBlcwAlLTIwcyAlOGxsZCAlOGxsZAoAYnl0ZWNvZGUgZnVuY3Rpb25zACUtMjBzICU4bGxkICU4bGxkICAoJTAuMWYgcGVyIGZ1bmN0aW9uKQoAICBieXRlY29kZQAgIHBjMmxpbmUAJS0yMHMgJThsbGQKAEMgZnVuY3Rpb25zAGFycmF5cwAgIGZhc3QgYXJyYXlzACUtMjBzICU4bGxkICU4bGxkICAoJTAuMWYgcGVyIGZhc3QgYXJyYXkpCgAgIGVsZW1lbnRzAGJpbmFyeSBvYmplY3RzAG91dCBvZiBtZW1vcnkAaW52YWxpZCAnaW5zdGFuY2VvZicgcmlnaHQgb3BlcmFuZABjYW5ub3QgcmVhZCBwcm9wZXJ0eSAnJXMnIG9mIG51bGwAAGNhbm5vdCByZWFkIHByb3BlcnR5ICclcycgb2YgdW5kZWZpbmVkAGNhbm5vdCBzZXQgcHJvcGVydHkgJyVzJyBvZiBudWxsAGNhbm5vdCBzZXQgcHJvcGVydHkgJyVzJyBvZiB1bmRlZmluZWQAcC0+Y2xhc3NfaWQgPT0gSlNfQ0xBU1NfQVJSQVkASlNfU2V0UHJvcGVydHlJbnRlcm5hbABwcm9wID09IEpTX0FUT01fbGVuZ3RoAG91dC1vZi1ib3VuZCBudW1lcmljIGluZGV4AG5vdCBhbiBvYmplY3QAb2JqZWN0IGlzIG5vdCBleHRlbnNpYmxlAHBycyAhPSBOVUxMAEpTX0RlZmluZVByb3BlcnR5AHByb3BlcnR5IGlzIG5vdCBjb25maWd1cmFibGUAbm9uIGludGVnZXIgaW5kZXggaW4gdHlwZWQgYXJyYXkAbmVnYXRpdmUgaW5kZXggaW4gdHlwZWQgYXJyYXkAb3V0LW9mLWJvdW5kIGluZGV4IGluIHR5cGVkIGFycmF5AGludmFsaWQgZGVzY3JpcHRvciBmbGFncwBjb3VsZCBub3QgZGVsZXRlIHByb3BlcnR5AGludmFsaWQgYXJyYXkgaW5kZXgAJWQAW2Z1bmN0aW9uIGJ5dGVjb2RlXQBjYW5ub3QgY29udmVydCBzeW1ib2wgdG8gc3RyaW5nAFt1bnN1cHBvcnRlZCB0eXBlXQBldmFsX3R5cGUgPT0gSlNfRVZBTF9UWVBFX0dMT0JBTCB8fCBldmFsX3R5cGUgPT0gSlNfRVZBTF9UWVBFX01PRFVMRQBKU19FdmFsVGhpcwBSZWdFeHAAdW5leHBlY3RlZCBkYXRhIGF0IHRoZSBlbmQAICAgICAgICAgIAAAAIwAAABeAAAAXwAAAGAAAABhAAAAYgAAAGMAAABkAAAAZQAAAGYAAABQcm94eQBBoBsL0wHALgAAkC8AAFAwAACwMAAAADEAAFAxAAAMCwUEAgIAALIAAABnAAAAaAAAALMAAABpAAAAagAAALQAAABpAAAAagAAALUAAABAAAAAQQAAALYAAABrAAAAbAAAALcAAABrAAAAbAAAAC8AAABtAAAAbgAAALgAAABAAAAAQQAAALkAAABvAAAAcAAAAFByb21pc2UAQXN5bmNGdW5jdGlvbgBBc3luY0dlbmVyYXRvckZ1bmN0aW9uAERhdGUAT2JqZWN0AEZ1bmN0aW9uAEVycm9yAEGAHQslJlMAADBTAAA7UwAASlMAAFZTAABgUwAAaVMAAHdTAABBcnJheQBBsB0LhTFjb3B5V2l0aGluAGVudHJpZXMAZmlsbABmaW5kAGZpbmRJbmRleABmbGF0AGZsYXRNYXAAaW5jbHVkZXMAa2V5cwB2YWx1ZXMAAE51bWJlcgBCb29sZWFuAFN0cmluZwBTeW1ib2wAR2VuZXJhdG9yRnVuY3Rpb24AZXZhbAAAAAABAQICAgNBcnJheUJ1ZmZlcgBTaGFyZWRBcnJheUJ1ZmZlcgBUeXBlZEFycmF5AEJZVEVTX1BFUl9FTEVNRU5UAERhdGFWaWV3AG1yMSAhPSBOVUxMAGRlbGV0ZV93ZWFrX3JlZgBtci0+ZW1wdHkAbWFwX2RlY3JlZl9yZWNvcmQAc2YtPmN1cl9zcCAhPSBOVUxMAGFzeW5jX2Z1bmNfZnJlZQBzaXplICE9IDAAanNfZGVmX21hbGxvYwAAAG51bGwAZmFsc2UAdHJ1ZQBpZgBlbHNlAHJldHVybgB2YXIAdGhpcwBkZWxldGUAdm9pZAB0eXBlb2YAbmV3AGluAGluc3RhbmNlb2YAZG8Ad2hpbGUAZm9yAGJyZWFrAGNvbnRpbnVlAHN3aXRjaABjYXNlAGRlZmF1bHQAdGhyb3cAdHJ5AGNhdGNoAGZpbmFsbHkAZnVuY3Rpb24AZGVidWdnZXIAd2l0aABjbGFzcwBjb25zdABlbnVtAGV4cG9ydABleHRlbmRzAGltcG9ydABzdXBlcgBpbXBsZW1lbnRzAGludGVyZmFjZQBsZXQAcGFja2FnZQBwcml2YXRlAHByb3RlY3RlZABwdWJsaWMAc3RhdGljAHlpZWxkAGF3YWl0AABsZW5ndGgAZmlsZU5hbWUAbGluZU51bWJlcgBtZXNzYWdlAGVycm9ycwBzdGFjawBuYW1lAHRvU3RyaW5nAHRvTG9jYWxlU3RyaW5nAHZhbHVlT2YAZXZhbABwcm90b3R5cGUAY29uc3RydWN0b3IAY29uZmlndXJhYmxlAHdyaXRhYmxlAGVudW1lcmFibGUAdmFsdWUAZ2V0AHNldABvZgBfX3Byb3RvX18AdW5kZWZpbmVkAG51bWJlcgBib29sZWFuAHN0cmluZwBvYmplY3QAc3ltYm9sAGludGVnZXIAdW5rbm93bgBhcmd1bWVudHMAY2FsbGVlAGNhbGxlcgA8ZXZhbD4APHJldD4APHZhcj4APGFyZ192YXI+ADx3aXRoPgBsYXN0SW5kZXgAdGFyZ2V0AGluZGV4AGlucHV0AGRlZmluZVByb3BlcnRpZXMAYXBwbHkAam9pbgBjb25jYXQAc3BsaXQAY29uc3RydWN0AGdldFByb3RvdHlwZU9mAHNldFByb3RvdHlwZU9mAGlzRXh0ZW5zaWJsZQBwcmV2ZW50RXh0ZW5zaW9ucwBoYXMAZGVsZXRlUHJvcGVydHkAZGVmaW5lUHJvcGVydHkAZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yAG93bktleXMAYWRkAGRvbmUAbmV4dAB2YWx1ZXMAc291cmNlAGZsYWdzAGdsb2JhbAB1bmljb2RlAHJhdwBuZXcudGFyZ2V0AHRoaXMuYWN0aXZlX2Z1bmMAPGhvbWVfb2JqZWN0PgA8Y29tcHV0ZWRfZmllbGQ+ADxzdGF0aWNfY29tcHV0ZWRfZmllbGQ+ADxjbGFzc19maWVsZHNfaW5pdD4APGJyYW5kPgAjY29uc3RydWN0b3IAYXMAZnJvbQBtZXRhACpkZWZhdWx0KgAqAE1vZHVsZQB0aGVuAHJlc29sdmUAcmVqZWN0AHByb21pc2UAcHJveHkAcmV2b2tlAGFzeW5jAGV4ZWMAZ3JvdXBzAHN0YXR1cwByZWFzb24AZ2xvYmFsVGhpcwB0b0pTT04AT2JqZWN0AEFycmF5AEVycm9yAE51bWJlcgBTdHJpbmcAQm9vbGVhbgBTeW1ib2wAQXJndW1lbnRzAE1hdGgASlNPTgBEYXRlAEZ1bmN0aW9uAEdlbmVyYXRvckZ1bmN0aW9uAEZvckluSXRlcmF0b3IAUmVnRXhwAEFycmF5QnVmZmVyAFNoYXJlZEFycmF5QnVmZmVyAFVpbnQ4Q2xhbXBlZEFycmF5AEludDhBcnJheQBVaW50OEFycmF5AEludDE2QXJyYXkAVWludDE2QXJyYXkASW50MzJBcnJheQBVaW50MzJBcnJheQBGbG9hdDMyQXJyYXkARmxvYXQ2NEFycmF5AERhdGFWaWV3AE1hcABTZXQAV2Vha01hcABXZWFrU2V0AE1hcCBJdGVyYXRvcgBTZXQgSXRlcmF0b3IAQXJyYXkgSXRlcmF0b3IAU3RyaW5nIEl0ZXJhdG9yAFJlZ0V4cCBTdHJpbmcgSXRlcmF0b3IAR2VuZXJhdG9yAFByb3h5AFByb21pc2UAUHJvbWlzZVJlc29sdmVGdW5jdGlvbgBQcm9taXNlUmVqZWN0RnVuY3Rpb24AQXN5bmNGdW5jdGlvbgBBc3luY0Z1bmN0aW9uUmVzb2x2ZQBBc3luY0Z1bmN0aW9uUmVqZWN0AEFzeW5jR2VuZXJhdG9yRnVuY3Rpb24AQXN5bmNHZW5lcmF0b3IARXZhbEVycm9yAFJhbmdlRXJyb3IAUmVmZXJlbmNlRXJyb3IAU3ludGF4RXJyb3IAVHlwZUVycm9yAFVSSUVycm9yAEludGVybmFsRXJyb3IAPGJyYW5kPgBTeW1ib2wudG9QcmltaXRpdmUAU3ltYm9sLml0ZXJhdG9yAFN5bWJvbC5tYXRjaABTeW1ib2wubWF0Y2hBbGwAU3ltYm9sLnJlcGxhY2UAU3ltYm9sLnNlYXJjaABTeW1ib2wuc3BsaXQAU3ltYm9sLnRvU3RyaW5nVGFnAFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGUAU3ltYm9sLmhhc0luc3RhbmNlAFN5bWJvbC5zcGVjaWVzAFN5bWJvbC51bnNjb3BhYmxlcwBTeW1ib2wuYXN5bmNJdGVyYXRvcgAAKG5ld19oYXNoX3NpemUgJiAobmV3X2hhc2hfc2l6ZSAtIDEpKSA9PSAwAEpTX1Jlc2l6ZUF0b21IYXNoAGF0b20gPCBydC0+YXRvbV9zaXplAF9fSlNfQXRvbVRvVmFsdWUAc2gtPmhlYWRlci5yZWZfY291bnQgPT0gMABqc19mcmVlX3NoYXBlMABpICE9IDAASlNfRnJlZUF0b21TdHJ1Y3QAcnQtPmF0b21fY291bnQgPj0gMABwLT5yZWZfY291bnQgPT0gMABmcmVlX3plcm9fcmVmY291bnQAcy0+aXNfd2VhawByZXNldF93ZWFrX3JlZgAhbXItPmVtcHR5AAEAAAAFAAEUBQABFQUAARUFAAEXBQABFwEAAQABAAEAAQABAAEAAQABAAEAAQABAAIAAQUDAAEKAQEAAAECAQABAwIAAQECAAECAwABAgQAAQMGAAECAwABAwQAAQQFAAEDAwABBAQAAQUFAAECAgABBAQAAQMDAAEDAwABBAQAAQUFAAMCAQ0DAQENAwEADQMCAQ0DAgANAwABDQMDAQoBAQAAAQAAAAEBAgABAAAAAQICAAECAAABAQAAAQEAAAYAABgFAQEPAwIBCgECAQABAQEAAQEBAAUAARcFAAEXBQABFwUBABcFAQAXBQIAFwECAwABAwAABgAAGAYAABgGAQAYBQEBFwUBAhcFAgAXAQIBAAEDAAABAwEAAQIBAAECAgABAwAAAQMBAAEEAAAFAgEXBQEBFwECAgABAgEAAQICAAEDAgABAwIAAgMDBQYCARgCAwEFBgICGAYDAxgDAAEQAwEAEAMBARADAAERAwEAEQMBAREDAAESAwEAEgMBARIDAAAQAwABEAMBABADAQAQAwABEgMBABIDAQASAwAAEAUBABYFAQAWBQAAFgUAARYFAAAWAQEAAAEBAQABAQEAAQICAAoBABoKAgEaCgEAGgoBABoKAQAaCgEAGgcAAhkHAAIZBwACGQUAAhcBAQEAAQEDAAEBAwABAQMAAgMFBQEBAQABAQIAAQMAAAEEBAABBAQAAgQFBQEAAAABAQIAAQECAAEBAgABAQEAAQEBAAEBAQABAQEAAQEBAAEBAgABAQIAAgAABwIAAAcCAQAHAQEBAAEBAQABAQEAAQIBAAUAARcBAgEAAQIBAAECAQABAgEAAQIBAAECAQABAgEAAQIBAAECAQABAgEAAQIBAAECAQABAgEAAQIBAAECAQABAgEAAQIBAAECAQABAgEAAQIBAAECAQABAgEAAQEBAAEAAAADAAAKAwAACgUAABYHAAEZBwABGQcBABkHAAEZCwACGwcAAhkHAAIZBwEBGQcBAhkHAQEZBQEBEwUAABMBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQECAAEGAwABCwIAAQgCAAEIAQABAAIAAQcCAQAHAgEBBwEAAQIBAAECAQABAgEAAQIBAQACAQEAAgEBAAIBAQACAQEBAgEBAQIBAQECAQEBAgEAAQMBAAEDAQABAwEAAQMBAQADAQEAAwEBAAMBAQADAQEBAwEBAQMBAQEDAQEBAwEAAQQBAAEEAQABBAEAAQQBAQAEAQEABAEBAAQBAQAEAQEBBAEBAQQBAQEEAQEBBAEBAQACAQAJAgEACQIAAAkDAAAMAQEBDgEBAQ4BAQEOAQEBDgEBAQABAQEAAQEBAAEBAQBwLT5tYXJrID09IDAAZ2NfZGVjcmVmAHZhcl9yZWYtPmlzX2RldGFjaGVkAG1hcmtfY2hpbGRyZW4AcC0+cmVmX2NvdW50ID4gMABnY19kZWNyZWZfY2hpbGQAZ2Nfc2NhbgBwLT5nY19vYmpfdHlwZSA9PSBKU19HQ19PQkpfVFlQRV9KU19PQkpFQ1QgfHwgcC0+Z2Nfb2JqX3R5cGUgPT0gSlNfR0NfT0JKX1RZUEVfRlVOQ1RJT05fQllURUNPREUAZ2NfZnJlZV9jeWNsZXMASlNfQXRvbUdldFN0clJUADxudWxsPgAhYXRvbV9pc19mcmVlKHApAGNpcmN1bGFyIHByb3RvdHlwZSBjaGFpbgBwcm94eTogYmFkIHByb3RvdHlwZQBwcm94eTogaW5jb25zaXN0ZW50IHByb3RvdHlwZQByZXZva2VkIHByb3h5AG9wZXJhbmQgJ3Byb3RvdHlwZScgcHJvcGVydHkgaXMgbm90IGFuIG9iamVjdABpbnRlcnJ1cHRlZAAlcyBpcyBub3QgaW5pdGlhbGl6ZWQAbGV4aWNhbCB2YXJpYWJsZQAAAHEAAAByAAAAcwAAAENvdWxkIG5vdCBmaW5kIGV4cG9ydCAnJXMnIGluIG1vZHVsZSAnJXMnAGNpcmN1bGFyIHJlZmVyZW5jZSB3aGVuIGxvb2tpbmcgZm9yIGV4cG9ydCAnJXMnIGluIG1vZHVsZSAnJXMnAGV4cG9ydCAnJXMnIGluIG1vZHVsZSAnJXMnIGlzIGFtYmlndW91cwAocHItPnUuaW5pdC5yZWFsbV9hbmRfaWQgJiAzKSA9PSAwAEpTX0RlZmluZUF1dG9Jbml0UHJvcGVydHkAJyVzJyBpcyBub3QgZGVmaW5lZABudW1faW5kZXggPT0gbnVtX2tleXNfY291bnQASlNfR2V0T3duUHJvcGVydHlOYW1lc0ludGVybmFsAHN0cl9pbmRleCA9PSBudW1fa2V5c19jb3VudCArIHN0cl9rZXlzX2NvdW50AHN5bV9pbmRleCA9PSBhdG9tX2NvdW50AEpTX0F0b21Jc0FycmF5SW5kZXgAYXRvbTFfaXNfaW50ZWdlciAmJiBhdG9tMl9pc19pbnRlZ2VyAG51bV9rZXlzX2NtcABqc19nZXRfYXRvbV9pbmRleABub3QgY29uZmlndXJhYmxlAG5vIHNldHRlciBmb3IgcHJvcGVydHkAJyVzJyBpcyByZWFkLW9ubHkAcC0+c2hhcGUtPmhlYWRlci5yZWZfY291bnQgPT0gMQBhZGRfcHJvcGVydHkAJWxsZABjYW5ub3QgY3JlYXRlIG51bWVyaWMgaW5kZXggaW4gdHlwZWQgYXJyYXkAdmFyX3JlZi0+aGVhZGVyLnJlZl9jb3VudCA+IDAAZnJlZV92YXJfcmVmAEpTX0F0b21Jc051bWVyaWNJbmRleDEAAG4AZgBpAG4AaQB0AHkAbmZpbml0eQAhc2gtPmlzX2hhc2hlZABjb21wYWN0X3Byb3BlcnRpZXMAbmV3X3NpemUgPD0gc2gtPnByb3Bfc2l6ZQBqID09IChzaC0+cHJvcF9jb3VudCAtIHNoLT5kZWxldGVkX3Byb3BfY291bnQpACVzIG9iamVjdCBleHBlY3RlZABjYW5ub3QgY29udmVydCBzeW1ib2wgdG8gbnVtYmVyAHRvUHJpbWl0aXZlAEluZmluaXR5AGludmFsaWQgYXJyYXkgbGVuZ3RoAE5hTgAlLipmAG4gPCBidWZfc2l6ZQBqc19mY3Z0MQAlKy4qZQBtdXN0IGJlIGNhbGxlZCB3aXRoIG5ldwBub3QgYSBmdW5jdGlvbgBkZXJpdmVkIGNsYXNzIGNvbnN0cnVjdG9yIG11c3QgcmV0dXJuIGFuIG9iamVjdCBvciB1bmRlZmluZWQAY2xhc3MgY29uc3RydWN0b3JzIG11c3QgYmUgaW52b2tlZCB3aXRoICduZXcnAHVuc3VwcG9ydGVkIHJlZmVyZW5jZSB0byAnc3VwZXInAGl0ZXJhdG9yIGRvZXMgbm90IGhhdmUgYSB0aHJvdyBtZXRob2QAaW52YWxpZCB0aHJvdyB2YXIgdHlwZSAlZAAndGhpcycgY2FuIGJlIGluaXRpYWxpemVkIG9ubHkgb25jZQBpbnZhbGlkIHJldCB2YWx1ZQBpdGVyYXRvciBtdXN0IHJldHVybiBhbiBvYmplY3QAaXRlcmF0b3JfY2xvc2VfcmV0dXJuAHZhbHVlIGhhcyBubyBwcm9wZXJ0eQBpbnZhbGlkIG9wY29kZTogcGM9JXUgb3Bjb2RlPTB4JTAyeAAADQAQAC0AMQBpbXBvcnQubWV0YSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgY29udGV4dABleHBlY3RpbmcgPGJyYW5kPiBwcml2YXRlIGZpZWxkAGludmFsaWQgYnJhbmQgb24gb2JqZWN0AHJlZGVjbGFyYXRpb24gb2YgJyVzJwA8aW5wdXQ+AG5vdCBhIG9iamVjdAB0b28gbWFueSBhcmd1bWVudHMAc3RyaW5nIGV4cGVjdGVkAG5vIGZ1bmN0aW9uIGZpbGVuYW1lIGZvciBpbXBvcnQoKQBjYW5ub3QgZGVmaW5lIHZhcmlhYmxlICclcycAdmFsdWUgaXMgbm90IGl0ZXJhYmxlACFfX0pTX0F0b21Jc1RhZ2dlZEludChkZXNjcikASlNfTmV3U3ltYm9sRnJvbUF0b20AZGVzY3IgPCBydC0+YXRvbV9zaXplAG5vdCBhIHN5bWJvbABwcml2YXRlIGNsYXNzIGZpZWxkICclcycgZG9lcyBub3QgZXhpc3QAcHJpdmF0ZSBjbGFzcyBmaWVsZCAnJXMnIGFscmVhZHkgZXhpc3RzAFsAXQBnZXQgAHNldCAAcGFyZW50IGNsYXNzIG11c3QgYmUgY29uc3RydWN0b3IAcGFyZW50IHByb3RvdHlwZSBtdXN0IGJlIGFuIG9iamVjdCBvciBudWxsAGItPmZ1bmNfa2luZCA9PSBKU19GVU5DX05PUk1BTABqc19vcF9kZWZpbmVfY2xhc3MAcmVjZWl2ZXIgaXMgbm90IGFuIG9iamVjdABzZXR0ZXIgaXMgZm9yYmlkZGVuAGludmFsaWQgaW5kZXggZm9yIGFwcGVuZABudWxsIG9yIHVuZGVmaW5lZCBhcmUgZm9yYmlkZGVuAGludmFsaWQgJ2luJyBvcGVyYW5kAG5vdCBhIGNvbnN0cnVjdG9yACAgICBhdCAlcwA6JWQAPGFub255bW91cz4AICglcwAgKG5hdGl2ZSkAZHVwbGljYXRlIGV4cG9ydGVkIG5hbWUgJyVzJwBjb3VsZCBub3QgbG9hZCBtb2R1bGUgJyVzJwAuAC4uAGJ5dGVjb2RlIGZ1bmN0aW9uIGV4cGVjdGVkAGV2YWwgaXMgbm90IHN1cHBvcnRlZABjaXJjdWxhciByZWZlcmVuY2UAZ2V0ICVzAHNldCAlcwBjYW5ub3QgY29udmVydCB0byBvYmplY3QAbm9ybWFsaXplAEHAzgAL9QEsJwAAAwAAAAAAAAB0AAAAYmFkIG5vcm1hbGl6YXRpb24gZm9ybQBpbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiBmbGFncwAlcwBmbGFncwBzb3VyY2UAZ2xvYmFsAGlnbm9yZUNhc2UAbXVsdGlsaW5lAGRvdEFsbAB1bmljb2RlAHN0aWNreQBleGVjAGNvbXBpbGUAdGVzdAB0b1N0cmluZwBbU3ltYm9sLnJlcGxhY2VdAFtTeW1ib2wubWF0Y2hdAFtTeW1ib2wubWF0Y2hBbGxdAFtTeW1ib2wuc2VhcmNoXQBbU3ltYm9sLnNwbGl0XQBBwNAAC+ADiycAAAEBAAB1AAAAAAAAAJEnAAABAQAAdgAAAAAAAACYJwAAAQIBAHcAAAAAAAAAnycAAAECAgB3AAAAAAAAAKonAAABAgQAdwAAAAAAAAC0JwAAAQIIAHcAAAAAAAAAuycAAAECEAB3AAAAAAAAAMMnAAABAiAAdwAAAAAAAADKJwAAAwAAAAEAAAAwAAAAzycAAAMAAAACAAAAeAAAANcnAAADAAAAAQAAAHkAAADcJwAAAwAAAAAAAAB6AAAA5ScAAAMAAAACAAAAewAAAPYnAAADAAAAAQAAAHwAAAAFKAAAAwAAAAEAAAB9AAAAFygAAAMAAAABAAAAfgAAACcoAAADAAAAAgAAAH8AAAAoPzopAG91dCBvZiBtZW1vcnkgaW4gcmVnZXhwIGV4ZWN1dGlvbgBmbGFncyBtdXN0IGJlIHVuZGVmaW5lZABSZWdFeHAgZXhlYyBtZXRob2QgbXVzdCByZXR1cm4gYW4gb2JqZWN0IG9yIG51bGwAbm90IGEgc3RyaW5nAHkAW1N5bWJvbC5zcGVjaWVzXQDPKQAAAQEAAIAAAAAAAAAAbmV4dABbU3ltYm9sLnRvU3RyaW5nVGFnXQBSZWdFeHAgU3RyaW5nIEl0ZXJhdG9yAEGw1AAL1wrwKQAAAwAAAAAMAACBAAAA9SkAAAEDAAAKKgAAAAAAAHVuZXhwZWN0ZWQgZW5kIG9mIGNvbW1lbnQAdW5leHBlY3RlZCBjaGFyYWN0ZXIAaW52YWxpZCBjaGFyYWN0ZXIgaW4gYSBKU09OIHN0cmluZwBvY3RhbCBlc2NhcGUgc2VxdWVuY2VzIGFyZSBub3QgYWxsb3dlZCBpbiBzdHJpY3QgbW9kZQBtYWxmb3JtZWQgZXNjYXBlIHNlcXVlbmNlIGluIHN0cmluZyBsaXRlcmFsAGludmFsaWQgVVRGLTggc2VxdWVuY2UAdW5leHBlY3RlZCBlbmQgb2Ygc3RyaW5nAGV4cGVjdGluZyBwcm9wZXJ0eSBuYW1lAHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0AHVuZXhwZWN0ZWQgdG9rZW46ICclLipzJwBleHBlY3RpbmcgJyVjJwAgAFx1JTA0eABBcnJheSBsb28gbG9uZwBKU09OAAAAAAAAAACkKwAAAwgAANArAAADAAAAcGFyc2UAc3RyaW5naWZ5AMArAAADAAAAAgAAAIIAAADGKwAAAwAAAAMAAACDAAAA9SkAAAEDAACkKwAAAAAAAHByb3h5OiBpbmNvbnNpc3RlbnQgaXNFeHRlbnNpYmxlAHByb3h5OiBpbmNvbnNpc3RlbnQgcHJldmVudEV4dGVuc2lvbnMAcHJveHk6IGluY29uc2lzdGVudCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IAaW52YWxpZCBnZXR0ZXIAaW52YWxpZCBzZXR0ZXIAY2Fubm90IGhhdmUgc2V0dGVyL2dldHRlciBhbmQgdmFsdWUgb3Igd3JpdGFibGUAcHJveHk6IHByb3BlcnRpZXMgbXVzdCBiZSBzdHJpbmdzIG9yIHN5bWJvbHMAcHJveHk6IGR1cGxpY2F0ZSBwcm9wZXJ0eQBwcm94eTogdGFyZ2V0IHByb3BlcnR5IG11c3QgYmUgcHJlc2VudCBpbiBwcm94eSBvd25LZXlzAHByb3h5OiBwcm9wZXJ0eSBub3QgcHJlc2VudCBpbiB0YXJnZXQgd2VyZSByZXR1cm5lZCBieSBub24gZXh0ZW5zaWJsZSBwcm94eQBwcm94eTogaW5jb25zaXN0ZW50IGRlbGV0ZVByb3BlcnR5AHByb3h5OiBkZWZpbmVQcm9wZXJ0eSBleGNlcHRpb24AcHJveHk6IGluY29uc2lzdGVudCBkZWZpbmVQcm9wZXJ0eQBwcm94eTogaW5jb25zaXN0ZW50IGhhcwBwcm94eTogaW5jb25zaXN0ZW50IGdldABwcm94eTogaW5jb25zaXN0ZW50IHNldABwcm94eTogY2Fubm90IHNldCBwcm9wZXJ0eQByZXZvY2FibGUAVi4AAAMAAAACAAAAhAAAAHNldABnZXQAaGFzAGRlbGV0ZQBjbGVhcgBzaXplAGZvckVhY2gAdmFsdWVzAGtleXMAZW50cmllcwBbU3ltYm9sLml0ZXJhdG9yXQBNYXAAcC4AAAMAAAACAQAAhQAAAHQuAAADAAAAAQEAAIYAAAB4LgAAAwAAAAEBAACHAAAAfC4AAAMAAAABAQAAiAAAAIMuAAADAAAAAAEAAIkAAACJLgAAAQIAAIoAAAAAAAAAji4AAAMAAAABAQAAiwAAAJYuAAADAAQAAAEAAIwAAACdLgAAAwAAAAABAACMAAAAoi4AAAMACAAAAQAAjAAAAKouAAADCQAAoi4AAP/////1KQAAAQMAALwuAAAAAAAAYWRkAFNldABBkN8AC7cBgC8AAAMAAQABAQAAhQAAAHguAAADAAEAAQEAAIcAAAB8LgAAAwABAAEBAACIAAAAgy4AAAMAAQAAAQAAiQAAAIkuAAABAgEAigAAAAAAAACOLgAAAwABAAEBAACLAAAAli4AAAMAAQAAAQAAjAAAAJ0uAAADCQAAli4AAP////+qLgAAAwkAAJYuAAD/////oi4AAAMACQAAAQAAjAAAAPUpAAABAwAAhC8AAAAAAABXZWFrTWFwAEHQ4AALV3AuAAADAAIAAgEAAIUAAAB0LgAAAwACAAEBAACGAAAAeC4AAAMAAgABAQAAhwAAAHwuAAADAAIAAQEAAIgAAAD1KQAAAQMAAEAwAAAAAAAAV2Vha1NldABBsOEAC4IDgC8AAAMAAwABAQAAhQAAAHguAAADAAMAAQEAAIcAAAB8LgAAAwADAAEBAACIAAAA9SkAAAEDAACgMAAAAAAAAE1hcCBJdGVyYXRvcgAAAADwKQAAAwAAAAAMAACNAAAA9SkAAAEDAADwMAAAAAAAAHMgIT0gTlVMTABqc19tYXBfaXRlcmF0b3JfbmV4dABTZXQgSXRlcmF0b3IAAAAAAPApAAADAAEAAAwAAI0AAAD1KQAAAQMAAD8xAAAAAAAAc2V0L2FkZCBpcyBub3QgYSBmdW5jdGlvbgAAAAAAAADPKQAAAQEAAIAAAAAAAAAAcmVzb2x2aW5nIGZ1bmN0aW9uIGFscmVhZHkgc2V0AHByb21pc2Ugc2VsZiByZXNvbHV0aW9uAGFyZ2MgPT0gNQBwcm9taXNlX3JlYWN0aW9uX2pvYgBhcmdjID09IDMAanNfcHJvbWlzZV9yZXNvbHZlX3RoZW5hYmxlX2pvYgB0aGVuAGNhdGNoAGZpbmFsbHkAQcDkAAtmIDIAAAMAAAACAAAAjgAAACUyAAADAAAAAQAAAI8AAAArMgAAAwAAAAEAAACQAAAA9SkAAAEDAAAsDgAAAAAAAHJlc29sdmUAcmVqZWN0AGFsbABhbGxTZXR0bGVkAGFueQByYWNlAEGw5QAL1gGAMgAAAwAAAAEBAACRAAAAiDIAAAMAAQABAQAAkQAAAI8yAAADAAAAAQEAAJIAAACTMgAAAwABAAEBAACSAAAAnjIAAAMAAgABAQAAkgAAAKIyAAADAAAAAQAAAJMAAADPKQAAAQEAAIAAAAAAAAAAcmVqZWN0ZWQAZnVsZmlsbGVkAGFzeW5jIABmdW5jdGlvbgAgYW5vbnltb3VzKAAKKSB7CgAKfSkAAAAAAAAAAPUpAAABAwAANA4AAAAAAABbU3ltYm9sLmFzeW5jSXRlcmF0b3JdAEGQ5wALkwhwMwAAAwAAAAAAAACUAAAAcmV0dXJuAHRocm93AAAAAPApAAADAAAAAQEAAJUAAACgMwAAAwABAAEBAACVAAAApzMAAAMAAgABAQAAlQAAAG5vdCBhbiBBc3luYy1mcm9tLVN5bmMgSXRlcmF0b3IAQXN5bmNHZW5lcmF0b3IAAPApAAADAAAAAQEAAJYAAACgMwAAAwABAAEBAACWAAAApzMAAAMAAgABAQAAlgAAAPUpAAABAwAAADQAAAAAAABub3QgYW4gQXN5bmNHZW5lcmF0b3Igb2JqZWN0AEpTX0lzVW5kZWZpbmVkKGZ1bmNfcmV0KQBqc19hc3luY19nZW5lcmF0b3JfcmVzdW1lX25leHQAcy0+c3RhdGUgPT0gSlNfQVNZTkNfR0VORVJBVE9SX1NUQVRFX0FXQUlUSU5HX1JFVFVSTiB8fCBzLT5zdGF0ZSA9PSBKU19BU1lOQ19HRU5FUkFUT1JfU1RBVEVfQ09NUExFVEVEAGpzX2FzeW5jX2dlbmVyYXRvcl9yZXNvbHZlX2Z1bmN0aW9uAHMtPnN0YXRlID09IEpTX0FTWU5DX0dFTkVSQVRPUl9TVEFURV9FWEVDVVRJTkcAAPUpAAABAwAAQg4AAAAAAAB2YWx1ZU9mAFtTeW1ib2wudG9QcmltaXRpdmVdAHRvVVRDU3RyaW5nAHRvR01UU3RyaW5nAHRvSVNPU3RyaW5nAHRvRGF0ZVN0cmluZwB0b1RpbWVTdHJpbmcAdG9Mb2NhbGVTdHJpbmcAdG9Mb2NhbGVEYXRlU3RyaW5nAHRvTG9jYWxlVGltZVN0cmluZwBnZXRUaW1lem9uZU9mZnNldABnZXRUaW1lAGdldFllYXIAZ2V0RnVsbFllYXIAZ2V0VVRDRnVsbFllYXIAZ2V0TW9udGgAZ2V0VVRDTW9udGgAZ2V0RGF0ZQBnZXRVVENEYXRlAGdldEhvdXJzAGdldFVUQ0hvdXJzAGdldE1pbnV0ZXMAZ2V0VVRDTWludXRlcwBnZXRTZWNvbmRzAGdldFVUQ1NlY29uZHMAZ2V0TWlsbGlzZWNvbmRzAGdldFVUQ01pbGxpc2Vjb25kcwBnZXREYXkAZ2V0VVRDRGF5AHNldFRpbWUAc2V0TWlsbGlzZWNvbmRzAHNldFVUQ01pbGxpc2Vjb25kcwBzZXRTZWNvbmRzAHNldFVUQ1NlY29uZHMAc2V0TWludXRlcwBzZXRVVENNaW51dGVzAHNldEhvdXJzAHNldFVUQ0hvdXJzAHNldERhdGUAc2V0VVRDRGF0ZQBzZXRNb250aABzZXRVVENNb250aABzZXRZZWFyAHNldEZ1bGxZZWFyAHNldFVUQ0Z1bGxZZWFyAHRvSlNPTgBBsO8AC7YGcDUAAAMAAAAAAAAAlwAAANwnAAADABMAAAEAAJgAAAB4NQAAAwAAAAEAAACZAAAAjTUAAAMAAwAAAQAAmAAAAJk1AAADCQAAjTUAAP////+lNQAAAwAjAAABAACYAAAAsTUAAAMAEQAAAQAAmAAAAL41AAADABIAAAEAAJgAAADLNQAAAwAzAAABAACYAAAA2jUAAAMAMQAAAQAAmAAAAO01AAADADIAAAEAAJgAAAAANgAAAwAAAAAAAACaAAAAEjYAAAMAAAAAAAAAlwAAABo2AAADAAEBAAEAAJsAAAAiNgAAAwABAAABAACbAAAALjYAAAMAAAAAAQAAmwAAAD02AAADABEAAAEAAJsAAABGNgAAAwAQAAABAACbAAAAUjYAAAMAIQAAAQAAmwAAAFo2AAADACAAAAEAAJsAAABlNgAAAwAxAAABAACbAAAAbjYAAAMAMAAAAQAAmwAAAHo2AAADAEEAAAEAAJsAAACFNgAAAwBAAAABAACbAAAAkzYAAAMAUQAAAQAAmwAAAJ42AAADAFAAAAEAAJsAAACsNgAAAwBhAAABAACbAAAAvDYAAAMAYAAAAQAAmwAAAM82AAADAHEAAAEAAJsAAADWNgAAAwBwAAABAACbAAAA4DYAAAMAAAABAAAAnAAAAOg2AAADAHEGAQEAAJ0AAAD4NgAAAwBwBgEBAACdAAAACzcAAAMAcQUCAQAAnQAAABY3AAADAHAFAgEAAJ0AAAAkNwAAAwBxBAMBAACdAAAALzcAAAMAcAQDAQAAnQAAAD03AAADAHEDBAEAAJ0AAABGNwAAAwBwAwQBAACdAAAAUjcAAAMAMQIBAQAAnQAAAFo3AAADADACAQEAAJ0AAABlNwAAAwAxAQIBAACdAAAAbjcAAAMAMAECAQAAnQAAAHo3AAADAAAAAQAAAJ4AAACCNwAAAwAxAAMBAACdAAAAjjcAAAMAMAADAQAAnQAAAJ03AAADAAAAAQAAAJ8AAABub3QgYSBEYXRlIG9iamVjdABEYXRlIHZhbHVlIGlzIE5hTgBJbnZhbGlkIERhdGUAJS4zcywgJTAyZCAlLjNzICUwKmQgAEHw9QALFVN1bk1vblR1ZVdlZFRodUZyaVNhdABBkPYAC6IBSmFuRmViTWFyQXByTWF5SnVuSnVsQXVnU2VwT2N0Tm92RGVjACUuM3MgJS4zcyAlMDJkICUwKmQAJTA0ZAAlKzA3ZAAtJTAyZC0lMDJkVAAlMDJkLyUwMmQvJTAqZAAlMDJkOiUwMmQ6JTAyZCBHTVQAJTAyZCUwMmQAJTAyZDolMDJkOiUwMmQuJTAzZFoAJTAyZDolMDJkOiUwMmQgJWNNAEHA9wALZB8AAAAcAAAAHwAAAB4AAAAfAAAAHgAAAB8AAAAfAAAAHgAAAB8AAAAeAAAAHwAAAGludmFsaWQgaGludABvYmplY3QgbmVlZHMgdG9JU09TdHJpbmcgbWV0aG9kAG5vdwBVVEMAQbD4AAugLB08AAADAAAAAAAAAKAAAADAKwAAAwAAAAEAAAChAAAAITwAAAMAAAAHAAAAogAAAHNmICE9IE5VTEwAX19KU19FdmFsSW50ZXJuYWwASlNfVkFMVUVfR0VUX1RBRyhzZi0+Y3VyX2Z1bmMpID09IEpTX1RBR19PQkpFQ1QAanNfY2xhc3NfaGFzX2J5dGVjb2RlKHAtPmNsYXNzX2lkKQBpbnZhbGlkIGZpcnN0IGNoYXJhY3RlciBvZiBwcml2YXRlIG5hbWUAb2N0YWwgbGl0ZXJhbHMgYXJlIGRlcHJlY2F0ZWQgaW4gc3RyaWN0IG1vZGUAaW52YWxpZCBudW1iZXIgbGl0ZXJhbAAlLipzAHVzZSBzdHJpY3QAdXNlIHN0cmlwAHRvbyBtYW55IGxvY2FsIHZhcmlhYmxlcwBmdW5jdGlvbiBuYW1lIGV4cGVjdGVkAGludmFsaWQgcmVkZWZpbml0aW9uIG9mIGdsb2JhbCBpZGVudGlmaWVyIGluIG1vZHVsZSBjb2RlAGludmFsaWQgcmVkZWZpbml0aW9uIG9mIGdsb2JhbCBpZGVudGlmaWVyAG1pc3NpbmcgZm9ybWFsIHBhcmFtZXRlcgBpbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGdldHRlciBvciBzZXR0ZXIAJyVzJyBpcyBhIHJlc2VydmVkIGlkZW50aWZpZXIAaW52YWxpZCByZWRlZmluaXRpb24gb2YgbGV4aWNhbCBpZGVudGlmaWVyAGludmFsaWQgcmVkZWZpbml0aW9uIG9mIHBhcmFtZXRlciBuYW1lAGludmFsaWQgcmVkZWZpbml0aW9uIG9mIGEgdmFyaWFibGUAdW5leHBlY3RlZCBlbmQgb2YgcmVnZXhwAHVuZXhwZWN0ZWQgbGluZSB0ZXJtaW5hdG9yIGluIHJlZ2V4cAB1bmV4cGVjdGVkIGVsbGlwc2lzIHRva2VuAGFzc2lnbm1lbnQgcmVzdCBwcm9wZXJ0eSBtdXN0IGJlIGxhc3QAaW52YWxpZCBkZXN0cnVjdHVyaW5nIHRhcmdldABtaXNzaW5nIGJpbmRpbmcgcGF0dGVybi4uLgByZXN0IGVsZW1lbnQgY2Fubm90IGhhdmUgYSBkZWZhdWx0IHZhbHVlAHJlc3QgZWxlbWVudCBtdXN0IGJlIHRoZSBsYXN0IG9uZQBpbnZhbGlkIGFzc2lnbm1lbnQgc3ludGF4AHRvbyBjb21wbGljYXRlZCBkZXN0cnVjdHVyaW5nIGV4cHJlc3Npb24AUmVnRXhwIGFyZSBub3Qgc3VwcG9ydGVkACdhcmd1bWVudHMnIGlkZW50aWZpZXIgaXMgbm90IGFsbG93ZWQgaW4gY2xhc3MgZmllbGQgaW5pdGlhbGl6ZXIAZXhwZWN0aW5nIHRhcmdldABuZXcudGFyZ2V0IG9ubHkgYWxsb3dlZCB3aXRoaW4gZnVuY3Rpb25zAHN1cGVyKCkgaXMgb25seSB2YWxpZCBpbiBhIGRlcml2ZWQgY2xhc3MgY29uc3RydWN0b3IAJ3N1cGVyJyBpcyBvbmx5IHZhbGlkIGluIGEgbWV0aG9kAGludmFsaWQgdXNlIG9mICdzdXBlcicAbWV0YSBleHBlY3RlZABpbXBvcnQubWV0YSBvbmx5IHZhbGlkIGluIG1vZHVsZSBjb2RlAGludmFsaWQgdXNlIG9mICdpbXBvcnQoKScAdW5leHBlY3RlZCB0b2tlbiBpbiBleHByZXNzaW9uOiAnJS4qcycAdGVtcGxhdGUgbGl0ZXJhbCBjYW5ub3QgYXBwZWFyIGluIGFuIG9wdGlvbmFsIGNoYWluAFRvbyBtYW55IGNhbGwgYXJndW1lbnRzAHByaXZhdGUgY2xhc3MgZmllbGQgZm9yYmlkZGVuIGFmdGVyIHN1cGVyAGV4cGVjdGluZyBmaWVsZCBuYW1lAGV4cGVjdGVkICd9JyBhZnRlciB0ZW1wbGF0ZSBleHByZXNzaW9uAGNsYXNzIHN0YXRlbWVudCByZXF1aXJlcyBhIG5hbWUAaW52YWxpZCBtZXRob2QgbmFtZQBpbnZhbGlkIGZpZWxkIG5hbWUAcHJvcGVydHkgY29uc3RydWN0b3IgYXBwZWFycyBtb3JlIHRoYW4gb25jZQBwcml2YXRlIGNsYXNzIGZpZWxkIGlzIGFscmVhZHkgZGVmaW5lZAA8c2V0PgBmZC0+Ynl0ZV9jb2RlLmJ1ZltkZWZpbmVfY2xhc3NfcG9zXSA9PSBPUF9kZWZpbmVfY2xhc3MAc2V0X29iamVjdF9uYW1lX2NvbXB1dGVkACgpe3N1cGVyKC4uLmFyZ3VtZW50cyk7fQAoKXt9AGR1cGxpY2F0ZSBfX3Byb3RvX18gcHJvcGVydHkgbmFtZQB1bmV4cGVjdGVkICd5aWVsZCcga2V5d29yZAB5aWVsZCBpbiBkZWZhdWx0IGV4cHJlc3Npb24AmpucnZ6goaKtrq+fY2Fubm90IG1peCA/PyB3aXRoICYmIG9yIHx8AHVuZXhwZWN0ZWQgJ2F3YWl0JyBrZXl3b3JkAGF3YWl0IGluIGRlZmF1bHQgZXhwcmVzc2lvbgB1bnBhcmVudGhlc2l6ZWQgdW5hcnkgZXhwcmVzc2lvbiBjYW4ndCBhcHBlYXIgb24gdGhlIGxlZnQtaGFuZCBzaWRlIG9mICcqKicAY2Fubm90IGRlbGV0ZSBhIGRpcmVjdCByZWZlcmVuY2UgaW4gc3RyaWN0IG1vZGUAY2Fubm90IGRlbGV0ZSBhIHByaXZhdGUgY2xhc3MgZmllbGQAaW52YWxpZCBsdmFsdWUgaW4gc3RyaWN0IG1vZGUAaW52YWxpZCBmb3IgaW4vb2YgbGVmdCBoYW5kLXNpZGUAaW52YWxpZCBpbmNyZW1lbnQvZGVjcmVtZW50IG9wZXJhbmQAaW52YWxpZCBhc3NpZ25tZW50IGxlZnQtaGFuZCBzaWRlAGxhYmVsID49IDAgJiYgbGFiZWwgPCBzLT5sYWJlbF9jb3VudAB1cGRhdGVfbGFiZWwAbHMtPnJlZl9jb3VudCA+PSAwAGludmFsaWQgcHJvcGVydHkgbmFtZQBkdXBsaWNhdGUgcGFyYW1ldGVyIG5hbWVzIG5vdCBhbGxvd2VkIGluIHRoaXMgY29udGV4dAB5aWVsZCBpcyBhIHJlc2VydmVkIGlkZW50aWZpZXIAaW52YWxpZCB2YXJpYWJsZSBuYW1lIGluIHN0cmljdCBtb2RlAGludmFsaWQgbGV4aWNhbCB2YXJpYWJsZSBuYW1lAHNwZWNpYWwgPT0gUFVUX0xWQUxVRV9OT0tFRVAgfHwgc3BlY2lhbCA9PSBQVVRfTFZBTFVFX05PS0VFUF9ERVBUSABwdXRfbHZhbHVlAHNldF9vYmplY3RfbmFtZQAidXNlIHN0cmljdCIgbm90IGFsbG93ZWQgaW4gZnVuY3Rpb24gd2l0aCBkZWZhdWx0IG9yIGRlc3RydWN0dXJpbmcgcGFyYW1ldGVyAGludmFsaWQgZnVuY3Rpb24gbmFtZSBpbiBzdHJpY3QgY29kZQBpbnZhbGlkIGFyZ3VtZW50IG5hbWUgaW4gc3RyaWN0IGNvZGUAZHVwbGljYXRlIGFyZ3VtZW50IG5hbWVzIG5vdCBhbGxvd2VkIGluIHRoaXMgY29udGV4dABpZGVudGlmaWVyIGV4cGVjdGVkAGludmFsaWQgZXhwb3J0IHN5bnRheABmcm9tIGNsYXVzZSBleHBlY3RlZAAnbGV0JyBpcyBub3QgYSB2YWxpZCBsZXhpY2FsIGlkZW50aWZpZXIAbWlzc2luZyBpbml0aWFsaXplciBmb3IgY29uc3QgdmFyaWFibGUAdmFyaWFibGUgbmFtZSBleHBlY3RlZABleHBlY3RpbmcgJ2FzJwBpbnZhbGlkIGltcG9ydCBiaW5kaW5nAGR1cGxpY2F0ZSBpbXBvcnQgYmluZGluZwB0b28gbWFueSBjbG9zdXJlIHZhcmlhYmxlcwBkdXBsaWNhdGUgbGFiZWwgbmFtZQByZXR1cm4gbm90IGluIGEgZnVuY3Rpb24AbGluZSB0ZXJtaW5hdG9yIG5vdCBhbGxvd2VkIGFmdGVyIHRocm93AGxleGljYWwgZGVjbGFyYXRpb25zIGNhbid0IGFwcGVhciBpbiBzaW5nbGUtc3RhdGVtZW50IGNvbnRleHQAZm9yIGF3YWl0IGlzIG9ubHkgdmFsaWQgaW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9ucwBkdXBsaWNhdGUgZGVmYXVsdABpbnZhbGlkIHN3aXRjaCBzdGF0ZW1lbnQAZXhwZWN0aW5nIGNhdGNoIG9yIGZpbmFsbHkAaW52YWxpZCBrZXl3b3JkOiB3aXRoAGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBjYW4ndCBhcHBlYXIgaW4gc2luZ2xlLXN0YXRlbWVudCBjb250ZXh0AGNsYXNzIGRlY2xhcmF0aW9ucyBjYW4ndCBhcHBlYXIgaW4gc2luZ2xlLXN0YXRlbWVudCBjb250ZXh0ACdmb3IgYXdhaXQnIGxvb3Agc2hvdWxkIGJlIHVzZWQgd2l0aCAnb2YnAGEgZGVjbGFyYXRpb24gaW4gdGhlIGhlYWQgb2YgYSBmb3ItJXMgbG9vcCBjYW4ndCBoYXZlIGFuIGluaXRpYWxpemVyAG9mAGluAGV4cGVjdGVkICdvZicgb3IgJ2luJyBpbiBmb3IgY29udHJvbCBleHByZXNzaW9uAGNvbnRpbnVlIG11c3QgYmUgaW5zaWRlIGxvb3AAYnJlYWsgbXVzdCBiZSBpbnNpZGUgbG9vcCBvciBzd2l0Y2gAYnJlYWsvY29udGludWUgbGFiZWwgbm90IGZvdW5kAHVuc3VwcG9ydGVkIGtleXdvcmQ6ICVzAGNwb29sX2lkeCA+PSAwAGpzX2NyZWF0ZV9mdW5jdGlvbgBzLT5pc19ldmFsIHx8IHMtPmNsb3N1cmVfdmFyX2NvdW50ID09IDAAYWRkX2V2YWxfdmFyaWFibGVzAGV4cG9ydGVkIHZhcmlhYmxlICclcycgZG9lcyBub3QgZXhpc3QAcmVzb2x2ZV92YXJpYWJsZXMAbGFiMSA+PSAwICYmIGxhYjEgPCBzLT5sYWJlbF9jb3VudABiY19idWZbcG9zXSA9PSBPUF9sYWJlbABvcHRpbWl6ZV9zY29wZV9tYWtlX3JlZgBvcHRpbWl6ZV9zY29wZV9tYWtlX2dsb2JhbF9yZWYAdmFyX2tpbmQgIT0gSlNfVkFSX05PUk1BTAByZXNvbHZlX3Njb3BlX3ByaXZhdGVfZmllbGQAdmFyX2tpbmQgPT0gSlNfVkFSX1BSSVZBVEVfU0VUVEVSAHVuZGVmaW5lZCBwcml2YXRlIGZpZWxkICclcycAcy0+bGFiZWxfc2xvdHNbbGFiZWxdLmZpcnN0X3JlbG9jID09IE5VTEwAc2tpcF9kZWFkX2NvZGUAcmVzb2x2ZV9sYWJlbHMAbHMtPmFkZHIgPT0gLTEAZGlmZiA9PSAoaW50MTZfdClkaWZmAGRpZmYgPT0gKGludDhfdClkaWZmAGxhYmVsX3Nsb3RzW2ldLmZpcnN0X3JlbG9jID09IE5VTEwAZmluZF9qdW1wX3RhcmdldABpbnZhbGlkIG9wY29kZSAob3A9JWQsIHBjPSVkKQBieXRlY29kZSBidWZmZXIgb3ZlcmZsb3cgKG9wPSVkLCBwYz0lZCkAc3RhY2sgdW5kZXJmbG93IChvcD0lZCwgcGM9JWQpAHN0YWNrIG92ZXJmbG93IChvcD0lZCwgcGM9JWQpAHVuY29uc2lzdGVudCBzdGFjayBzaXplOiAlZCAlZCAocGM9JWQpAG5hbWUAbWVzc2FnZQAAAADcJwAAAwAAAAAAAACjAAAA0E0AAAMDAABuDgAAAAAAANVNAAADAwAAvgoAAAAAAAA6IABpbnZhbGlkIHByb3BlcnR5IGFjY2VzcwBwcm94eSBwcmV2ZW50RXh0ZW5zaW9ucyBoYW5kbGVyIHJldHVybmVkIGZhbHNlAGNyZWF0ZQBnZXRQcm90b3R5cGVPZgBzZXRQcm90b3R5cGVPZgBkZWZpbmVQcm9wZXJ0eQBkZWZpbmVQcm9wZXJ0aWVzAGdldE93blByb3BlcnR5TmFtZXMAZ2V0T3duUHJvcGVydHlTeW1ib2xzAGlzRXh0ZW5zaWJsZQBwcmV2ZW50RXh0ZW5zaW9ucwBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IAZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycwBpcwBhc3NpZ24Ac2VhbABmcmVlemUAaXNTZWFsZWQAaXNGcm96ZW4AX19nZXRDbGFzcwBmcm9tRW50cmllcwAAAAAAAABaTgAAAwAAAAIAAACkAAAAYU4AAAMAAAABAQAApQAAAHBOAAADAAAAAgAAAKYAAAB/TgAAAwAAAAMBAACnAAAAjk4AAAMAAAACAAAAqAAAAJ9OAAADAAAAAQAAAKkAAACzTgAAAwAAAAEAAACqAAAAnS4AAAMAAAABAQAAqwAAAJYuAAADAAEAAQEAAKsAAACiLgAAAwACAAEBAACrAAAAyU4AAAMAAAABAQAArAAAANZOAAADAAAAAQEAAK0AAADoTgAAAwAAAAIBAACuAAAAAU8AAAMAAAABAAAArwAAABtPAAADAAAAAgAAALAAAAAeTwAAAwAAAAIAAACxAAAAJU8AAAMAAAABAQAAsgAAACpPAAADAAEAAQEAALIAAAAxTwAAAwAAAAEBAACzAAAAOk8AAAMAAQABAQAAswAAAENPAAADAAAAAQAAALQAAABOTwAAAwAAAAEAAAC1AAAAbm90IGEgcHJvdG90eXBlAGhhc093blByb3BlcnR5AGlzUHJvdG90eXBlT2YAcHJvcGVydHlJc0VudW1lcmFibGUAX19wcm90b19fAF9fZGVmaW5lR2V0dGVyX18AX19kZWZpbmVTZXR0ZXJfXwBfX2xvb2t1cEdldHRlcl9fAF9fbG9va3VwU2V0dGVyX18A3CcAAAMAAAAAAAAAtgAAAMs1AAADAAAAAAAAALcAAABwNQAAAwAAAAAAAAC4AAAA0FAAAAMAAAABAAAAuQAAAN9QAAADAAAAAQAAALoAAADtUAAAAwAAAAEAAAC7AAAAAlEAAAEBAAC8AAAAvQAAAAxRAAADAAAAAgEAAL4AAAAdUQAAAwABAAIBAAC+AAAALlEAAAMAAAABAQAAvwAAAD9RAAADAAEAAQEAAL8AAABOdWxsAFVuZGVmaW5lZABbb2JqZWN0IABjYWxsAGFwcGx5AGJpbmQAW1N5bWJvbC5oYXNJbnN0YW5jZV0AZmlsZU5hbWUAbGluZU51bWJlcgBB4KQBC6UCGFIAAAMAAAABAAAAwAAAAB1SAAADAAAAAgEAAMEAAAAjUgAAAwAAAAEAAADCAAAA3CcAAAMAAAAAAAAAwwAAAChSAAADAAAAAQAAAMQAAAA9UgAAAQEAAMUAAAAAAAAARlIAAAEBAADGAAAAAAAAAGJvdW5kIABmdW5jdGlvbiAAZnVuY3Rpb24gKgBhc3luYyBmdW5jdGlvbiAAYXN5bmMgZnVuY3Rpb24gKgAoKSB7CiAgICBbbmF0aXZlIGNvZGVdCn0ARXZhbEVycm9yAFJhbmdlRXJyb3IAUmVmZXJlbmNlRXJyb3IAU3ludGF4RXJyb3IAVHlwZUVycm9yAFVSSUVycm9yAEludGVybmFsRXJyb3IAQWdncmVnYXRlRXJyb3IAQZCnAQuGBqouAAADAAAAAAAAAJQAAABjb25jYXQAZXZlcnkAc29tZQBtYXAAZmlsdGVyAHJlZHVjZQByZWR1Y2VSaWdodABmaWxsAGZpbmQAZmluZEluZGV4AGluZGV4T2YAbGFzdEluZGV4T2YAaW5jbHVkZXMAam9pbgBwb3AAcHVzaABzaGlmdAB1bnNoaWZ0AHJldmVyc2UAc29ydABzbGljZQBzcGxpY2UAY29weVdpdGhpbgBmbGF0TWFwAGZsYXQAAKBTAAADAAAAAQAAAMcAAACnUwAAAwAAAAEBAADIAAAArVMAAAMAAQABAQAAyAAAAI4uAAADAAIAAQEAAMgAAACyUwAAAwADAAEBAADIAAAAtlMAAAMABAABAQAAyAAAAL1TAAADAAAAAQEAAMkAAADEUwAAAwABAAEBAADJAAAA0FMAAAMAAAABAAAAygAAANVTAAADAAAAAQEAAMsAAADaUwAAAwABAAEBAADLAAAA5FMAAAMAAAABAAAAzAAAAOxTAAADAAAAAQAAAM0AAAD4UwAAAwAAAAEAAADOAAAAAVQAAAMAAAABAQAAzwAAANwnAAADAAAAAAAAANAAAADLNQAAAwABAAABAADPAAAABlQAAAMAAAAAAQAA0QAAAApUAAADAAAAAQEAANIAAAAPVAAAAwABAAABAADRAAAAFVQAAAMAAQABAQAA0gAAAB1UAAADAAAAAAAAANMAAAAlVAAAAwAAAAEAAADUAAAAKlQAAAMAAAACAQAA1QAAADBUAAADAAEAAgEAANUAAAA3VAAAAwAAAAIAAADWAAAAQlQAAAMAAQABAQAA1wAAAEpUAAADAAAAAAEAANcAAACWLgAAAwABAAABAAApAAAAqi4AAAMJAACWLgAA/////50uAAADAAAAAAEAACkAAACiLgAAAwACAAABAAApAAAAVHlwZWRBcnJheSBsZW5ndGggaXMgdG9vIHNtYWxsAGVtcHR5IGFycmF5AEFycmF5IHRvbyBsb25nAGlzQXJyYXkAZnJvbQBBoK0BC9YDilYAAAMAAAABAAAA2AAAAJJWAAADAAAAAQAAANkAAABGSgAAAwAAAAAAAADaAAAAzykAAAEBAACAAAAAAAAAAEFycmF5IEl0ZXJhdG9yAADwKQAAAwAAAAAMAAAqAAAA9SkAAAEDAADgVgAAAAAAAHBhcnNlSW50AHBhcnNlRmxvYXQAaXNOYU4AaXNGaW5pdGUAZGVjb2RlVVJJAGRlY29kZVVSSUNvbXBvbmVudABlbmNvZGVVUkkAZW5jb2RlVVJJQ29tcG9uZW50AGVzY2FwZQB1bmVzY2FwZQB1bmRlZmluZWQAX19kYXRlX2Nsb2NrAGNhbGxFeHRlcm5hbEZ1bmN0aW9uAGR1bXAAAAAQVwAAAwAAAAIAAADbAAAAGVcAAAMAAAABAAAA3AAAACRXAAADAAAAAQAAAN0AAAAqVwAAAwAAAAEAAADeAAAAM1cAAAMAAAABAQAA3wAAAD1XAAADAAEAAQEAAN8AAABQVwAAAwAAAAEBAADgAAAAWlcAAAMAAQABAQAA4AAAAG1XAAADAAAAAQAAAOEAAAB0VwAAAwAAAAEAAADiAAAAtCEAAAAGAAAAAAAAAADwf9IhAAAABgAAAAAAAAAA+H99VwAAAAcAQYCxAQuyAYdXAAADAAAAAAAAAOMAAACUVwAAAwAAAAIAAADkAAAAqVcAAAMAAAACAAAA5QAAAG1hbGZvcm1lZCBVVEYtOABleHBlY3RpbmcgJSUAZXhwZWN0aW5nIGhleCBkaWdpdAA7Lz86QCY9KyQsIwBpbnZhbGlkIGNoYXJhY3RlcgBleHBlY3Rpbmcgc3Vycm9nYXRlIHBhaXIALV8uIX4qJygpADAxMjM0NTY3ODlBQkNERUYAQcCyAQuSAUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5QCpfKy0uLwA8Y2FsbEV4dGVybmFsRnVuY3Rpb24+AGludmFsaWQgb2JqZWN0IHR5cGUAdG9FeHBvbmVudGlhbAB0b0ZpeGVkAHRvUHJlY2lzaW9uAEHgswEL1gSxWQAAAwAAAAEAAADmAAAAv1kAAAMAAAABAAAA5wAAAMdZAAADAAAAAQAAAOgAAADcJwAAAwAAAAEBAADpAAAAyzUAAAMAAQAAAQAA6QAAAHA1AAADAAAAAAAAAOoAAABpbnZhbGlkIG51bWJlciBvZiBkaWdpdHMAbm90IGEgbnVtYmVyAHJhZGl4IG11c3QgYmUgYmV0d2VlbiAyIGFuZCAzNgBpc0ludGVnZXIAaXNTYWZlSW50ZWdlcgBNQVhfVkFMVUUATUlOX1ZBTFVFAE5FR0FUSVZFX0lORklOSVRZAFBPU0lUSVZFX0lORklOSVRZAEVQU0lMT04ATUFYX1NBRkVfSU5URUdFUgBNSU5fU0FGRV9JTlRFR0VSAAAQVwAAAwkAABBXAAAAAAAAGVcAAAMJAAAZVwAAAAAAACRXAAADAAAAAQAAAOsAAAAqVwAAAwAAAAEAAADsAAAAhVoAAAMAAAABAAAA7QAAAI9aAAADAAAAAQAAAO4AAACdWgAAAAYAAP///////+9/p1oAAAAGAAABAAAAAAAAANIhAAAABgAAAAAAAAAA+H+xWgAAAAYAAAAAAAAAAPD/w1oAAAAGAAAAAAAAAADwf9VaAAAABgAAAAAAAAAAsDzdWgAAAAYAAP///////z9D7loAAAAGAAD///////8/w9wnAAADAAAAAAAAAO8AAABwNQAAAwAAAAAAAADwAAAAbm90IGEgYm9vbGVhbgBTeW1ib2woACkAZnJvbUNoYXJDb2RlAGZyb21Db2RlUG9pbnQAcmF3AEHAuAELpgMYXAAAAwAAAAEAAADxAAAAJVwAAAMAAAABAAAA8gAAADNcAAADAAAAAQAAAPMAAABpbnZhbGlkIGNvZGUgcG9pbnQAbGVuZ3RoAGNoYXJDb2RlQXQAY2hhckF0AGNvZGVQb2ludEF0AGVuZHNXaXRoAHN0YXJ0c1dpdGgAbWF0Y2gAbWF0Y2hBbGwAc2VhcmNoAHNwbGl0AHN1YnN0cmluZwBzdWJzdHIAcmVwZWF0AHJlcGxhY2UAcmVwbGFjZUFsbABwYWRFbmQAcGFkU3RhcnQAdHJpbQB0cmltRW5kAHRyaW1SaWdodAB0cmltU3RhcnQAdHJpbUxlZnQAX19xdW90ZQBsb2NhbGVDb21wYXJlAHRvTG93ZXJDYXNlAHRvVXBwZXJDYXNlAHRvTG9jYWxlTG93ZXJDYXNlAHRvTG9jYWxlVXBwZXJDYXNlAGFuY2hvcgBiaWcAYmxpbmsAYm9sZABmaXhlZABmb250Y29sb3IAZm9udHNpemUAaXRhbGljcwBsaW5rAHNtYWxsAHN0cmlrZQBzdWIAc3VwAINcAAABBABB8LsBC5QIilwAAAMAAAABAAAA9AAAAJVcAAADAAAAAQAAAPUAAACgUwAAAwAAAAEAAAD2AAAAnFwAAAMAAAABAAAA9wAAAORTAAADAAAAAQEAAPgAAADsUwAAAwABAAEBAAD4AAAA+FMAAAMAAAABAQAA+QAAAKhcAAADAAIAAQEAAPkAAACxXAAAAwABAAEBAAD5AAAAvFwAAAMAxAABAQAA+gAAAMJcAAADAMUAAQEAAPoAAADLXAAAAwDHAAEBAAD6AAAA0lwAAAMAAAACAAAA+wAAANhcAAADAAAAAgAAAPwAAADiXAAAAwAAAAIAAAD9AAAAKlQAAAMAAAACAAAA/gAAAOlcAAADAAAAAQAAAP8AAADwXAAAAwAAAAIBAAAAAQAA+FwAAAMAAQACAQAAAAEAAANdAAADAAEAAQEAAAEBAAAKXQAAAwAAAAEBAAABAQAAE10AAAMAAwAAAQAAAgEAABhdAAADAAIAAAEAAAIBAAAgXQAAAwkAABhdAAD/////Kl0AAAMAAQAAAQAAAgEAADRdAAADCQAAKl0AAP/////cJwAAAwAAAAAAAAADAQAAcDUAAAMAAAAAAAAAAwEAAD1dAAADAAAAAQAAAAQBAABFXQAAAwAAAAEAAAAFAQAAU10AAAMAAQAAAQAABgEAAF9dAAADAAAAAAEAAAYBAABrXQAAAwABAAABAAAGAQAAfV0AAAMAAAAAAQAABgEAAKouAAADAAUAAAEAACkAAACPXQAAAwAAAAEBAAAHAQAAll0AAAMAAQAAAQAABwEAAJpdAAADAAIAAAEAAAcBAACgXQAAAwADAAABAAAHAQAApV0AAAMABAAAAQAABwEAAKtdAAADAAUAAQEAAAcBAAC1XQAAAwAGAAEBAAAHAQAAvl0AAAMABwAAAQAABwEAAMZdAAADAAgAAQEAAAcBAADLXQAAAwAJAAABAAAHAQAA0V0AAAMACgAAAQAABwEAANhdAAADAAsAAAEAAAcBAADcXQAAAwAMAAABAAAHAQAAcmVnZXggbm90IHN1cHBvcnRlZABnAHJlZ2V4cCBtdXN0IGhhdmUgdGhlICdnJyBmbGFnAGludmFsaWQgcmVwZWF0IGNvdW50AAAAAAAAAACoYQAA0E0AAJZdAAAAAAAAml0AAAAAAACqYQAAAAAAAKxhAAAAAAAAr2EAALRhAACvYQAAiS4AALphAAAAAAAAqGEAALxhAADLXQAAAAAAANFdAAAAAAAA2F0AAAAAAADcXQAAAAAAAGEAYgB0dABmb250AGNvbG9yAGkAaHJlZgA9IgAmcXVvdDsAPC8AU3RyaW5nIEl0ZXJhdG9yAAAA8CkAAAMAAAAADAAACAEAAPUpAAABAwAAzmEAAAAAAABNYXRoAEGRxAELtgdiAAADCAAAAGMAACwAAABtaW4AbWF4AGFicwBmbG9vcgBjZWlsAHJvdW5kAHNxcnQAYWNvcwBhc2luAGF0YW4AYXRhbjIAY29zAGV4cABsb2cAcG93AHNpbgB0YW4AdHJ1bmMAc2lnbgBjb3NoAHNpbmgAdGFuaABhY29zaABhc2luaABhdGFuaABleHBtMQBsb2cxcABsb2cyAGxvZzEwAGNicnQAaHlwb3QAcmFuZG9tAGZyb3VuZABpbXVsAGNsejMyAEUATE4xMABMTjIATE9HMkUATE9HMTBFAFBJAFNRUlQxXzIAU1FSVDIAACBiAAADAAAAAgEAAAkBAAAkYgAAAwABAAIBAAAJAQAAKGIAAAMAAAABBgAACgEAACxiAAADAAAAAQYAAAsBAAAyYgAAAwAAAAEGAAAMAQAAN2IAAAMAAAABBgAADQEAAD1iAAADAAAAAQYAAA4BAABCYgAAAwAAAAEGAAAPAQAAR2IAAAMAAAABBgAAEAEAAExiAAADAAAAAQYAABEBAABRYgAAAwAAAAIHAAASAQAAV2IAAAMAAAABBgAAEwEAAFtiAAADAAAAAQYAABQBAABfYgAAAwAAAAEGAAAVAQAAY2IAAAMAAAACBwAAFgEAAGdiAAADAAAAAQYAABcBAABrYgAAAwAAAAEGAAAYAQAAb2IAAAMAAAABBgAAGQEAAHViAAADAAAAAQYAABoBAAB6YgAAAwAAAAEGAAAbAQAAf2IAAAMAAAABBgAAHAEAAIRiAAADAAAAAQYAAB0BAACJYgAAAwAAAAEGAAAeAQAAj2IAAAMAAAABBgAAHwEAAJViAAADAAAAAQYAACABAACbYgAAAwAAAAEGAAAhAQAAoWIAAAMAAAABBgAAIgEAAKdiAAADAAAAAQYAACMBAACsYgAAAwAAAAEGAAAkAQAAsmIAAAMAAAABBgAAJQEAALdiAAADAAAAAgAAACYBAAC9YgAAAwAAAAAAAAAnAQAAxGIAAAMAAAABBgAAKAEAAMtiAAADAAAAAgAAACkBAADQYgAAAwAAAAEAAAAqAQAA9SkAAAEDAAAAYgAAAAAAANZiAAAABgAAaVcUiwq/BUDYYgAAAAYAABZVtbuxawJA3WIAAAAGAADvOfr+Qi7mP+FiAAAABgAA/oIrZUcV9z/nYgAAAAYAAA7lJhV7y9s/7mIAAAAGAAAYLURU+yEJQPFiAAAABgAAzTt/Zp6g5j/5YgAAAAYAAM07f2aeoPY/UmVmbGVjdABB0MsBCzDAZQAAAwgAABBmAAAOAAAAY29uc3RydWN0AGRlbGV0ZVByb3BlcnR5AG93bktleXMAQZDMAQvxAx1SAAADAAAAAwAAACsBAADgZQAAAwAAAAIAAAAsAQAAf04AAAMAAQADAQAApwAAAOplAAADAAAAAgAAAC0BAAB0LgAAAwAAAAIAAAAuAQAA6E4AAAMAAQACAQAArgAAAGFOAAADAAEAAQEAAKUAAAB4LgAAAwAAAAIAAAAvAQAAyU4AAAMAAQABAQAArAAAAPllAAADAAAAAQAAADABAADWTgAAAwABAAEBAACtAAAAcC4AAAMAAAADAAAAMQEAAHBOAAADAAAAAgAAADIBAAD1KQAAAQMAAMBlAAAAAAAAZGVzY3JpcHRpb24AAAAAANwnAAADAAAAAAAAADMBAABwNQAAAwAAAAAAAAA0AQAAeDUAAAMAAAABAAAANAEAAPUpAAABAwAAEA8AAAAAAADwZgAAAQEAADUBAAAAAAAAZm9yAGtleUZvcgAAAAAAAFBnAAADAAAAAQAAADYBAABUZwAAAwAAAAEAAAA3AQAAR2VuZXJhdG9yAAAAAAAAAPApAAADAAAAAQwAADgBAACgMwAAAwABAAEMAAA4AQAApzMAAAMAAgABDAAAOAEAAPUpAAABAwAAgGcAAAAAAABub3QgYSBnZW5lcmF0b3IAY2Fubm90IGludm9rZSBhIHJ1bm5pbmcgZ2VuZXJhdG9yAEGQ0AELV/UpAAABAwAAFw8AAAAAAABpbnZhbGlkIGFycmF5IGJ1ZmZlciBsZW5ndGgAQXJyYXlCdWZmZXIgaXMgZGV0YWNoZWQAbm90IGEgJXMAYnl0ZUxlbmd0aABB8NABC3RdaAAAAQITADkBAAAAAAAAKlQAAAMAEwACAQAAOgEAAPUpAAABAwAANw8AAAAAAABjYW5ub3QgdXNlIGlkZW50aWNhbCBBcnJheUJ1ZmZlcgBuZXcgQXJyYXlCdWZmZXIgaXMgdG9vIHNtYWxsAGlzVmlldwBB8NEBC/AE3mgAAAMAAAABAAAAOwEAAM8pAAABAQAAgAAAAAAAAABdaAAAAQIUADkBAAAAAAAAKlQAAAMAFAACAQAAOgEAAPUpAAABAwAAQw8AAAAAAADPKQAAAQEAAIAAAAAAAAAAYnVmZmVyAGJ5dGVPZmZzZXQAc3ViYXJyYXkAAAAAAACDXAAAAQEAADwBAAAAAAAAUGkAAAECAAA9AQAAAAAAAF1oAAABAgAAPgEAAAAAAABXaQAAAQIAAD8BAAAAAAAAcC4AAAMAAAABAAAAQAEAAJYuAAADAAEAAAEAAEEBAACqLgAAAwkAAJYuAAD/////nS4AAAMAAAAAAQAAQQEAAKIuAAADAAIAAAEAAEEBAAD1KQAAAQEAAEIBAAAAAAAAN1QAAAMAAAACAAAAQwEAAKdTAAADAAgAAQEAAMgAAACtUwAAAwAJAAEBAADIAAAAji4AAAMACgABAQAAyAAAALJTAAADAAsAAQEAAMgAAAC2UwAAAwAMAAEBAADIAAAAvVMAAAMACAABAQAAyQAAAMRTAAADAAkAAQEAAMkAAADQUwAAAwAAAAEAAABEAQAA1VMAAAMAAAABAQAARQEAANpTAAADAAEAAQEAAEUBAAAdVAAAAwAAAAAAAABGAQAAKlQAAAMAAAACAAAARwEAAGJpAAADAAAAAgAAAEgBAAAlVAAAAwAAAAEAAABJAQAAAVQAAAMAAAABAQAASgEAAMs1AAADAAEAAAEAAEoBAADkUwAAAwAAAAEBAABLAQAA7FMAAAMAAQABAQAASwEAAPhTAAADAP//AQEAAEsBAABjYW5ub3QgYmUgY2FsbGVkAEHw1gEL5wGSVgAAAwAAAAEAAABMAQAARkoAAAMAAAAAAAAATQEAAM8pAAABAQAAgAAAAAAAAABpbnZhbGlkIG9mZnNldABpbnZhbGlkIGxlbmd0aABnZXRJbnQ4AGdldFVpbnQ4AGdldEludDE2AGdldFVpbnQxNgBnZXRJbnQzMgBnZXRVaW50MzIAZ2V0RmxvYXQzMgBnZXRGbG9hdDY0AHNldEludDgAc2V0VWludDgAc2V0SW50MTYAc2V0VWludDE2AHNldEludDMyAHNldFVpbnQzMgBzZXRGbG9hdDMyAHNldEZsb2F0NjQAQeDYAQuZA1BpAAABAgEAPQEAAAAAAABdaAAAAQIBAD4BAAAAAAAAV2kAAAECAQA/AQAAAAAAAL5rAAADABYAAQEAAE4BAADGawAAAwAXAAEBAABOAQAAz2sAAAMAGAABAQAATgEAANhrAAADABkAAQEAAE4BAADiawAAAwAaAAEBAABOAQAA62sAAAMAGwABAQAATgEAAPVrAAADABwAAQEAAE4BAAAAbAAAAwAdAAEBAABOAQAAC2wAAAMAFgACAQAATwEAABNsAAADABcAAgEAAE8BAAAcbAAAAwAYAAIBAABPAQAAJWwAAAMAGQACAQAATwEAAC9sAAADABoAAgEAAE8BAAA4bAAAAwAbAAIBAABPAQAAQmwAAAMAHAACAQAATwEAAE1sAAADAB0AAgEAAE8BAAD1KQAAAQMAAHIPAAAAAAAAb3V0IG9mIGJvdW5kAGludmFsaWQgYnl0ZU9mZnNldABpbnZhbGlkIGJ5dGVMZW5ndGgAAAEAAAACAAAAAQAAAAQAAAABAAAAAQAAAAgAAAAQAAAAAQAAACAAQYTcAQvGAwIAAAAAAAAAAQAAAAEAAAABAAAALQAAAC0AAABUAAAAOgAAADoAAAAuAAAA4VIAAOxSAAD8UgAAUAEAAFEBAABQAQAAUgEAAFMBAABUAQAAVQEAAFYBAABXAQAAWAEAAFkBAABYAQAAWgEAAFsBAABcAQAAXQEAAF4BAABfAQAAHw8HAwEAAAAAAAAAgAAAAAAIAAAAAAEAAAAgAAAAAAQBAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAQAAAAEAAAABAAAAAQAAAAFAAAABQAAAAAAAAAKAAkADgAgACEAoAChAIAWgRYAIAsgKCAqIC8gMCBfIGAgADABMP/+AP8AQdTfAQuRBBAAAAD+//+H/v//BwAAAAAQAP8D/v//h/7//wdleHRyYW5lb3VzIGNoYXJhY3RlcnMgYXQgdGhlIGVuZAB0b28gbWFueSBpbWJyaWNhdGVkIHF1YW50aWZpZXJzAHN0YWNrIG92ZXJmbG93AHN5bnRheCBlcnJvcgBub3RoaW5nIHRvIHJlcGVhdABpbnZhbGlkIGdyb3VwIG5hbWUAZHVwbGljYXRlIGdyb3VwIG5hbWUAaW52YWxpZCBncm91cAB0b28gbWFueSBjYXB0dXJlcwBleHBlY3RpbmcgZ3JvdXAgbmFtZQBncm91cCBuYW1lIG5vdCBkZWZpbmVkAGludmFsaWQgZGVjaW1hbCBlc2NhcGUgaW4gcmVndWxhciBleHByZXNzaW9uAGJhY2sgcmVmZXJlbmNlIG91dCBvZiByYW5nZSBpbiByZWd1bGFyIGV4cHJlc3Npb24AaW52YWxpZCByZXBldGl0aW9uIGNvdW50AGV4cGVjdGluZyAnJWMnAGludmFsaWQgY2xhc3MgcmFuZ2UAXiRcLiorPygpW117fXwvAGludmFsaWQgZXNjYXBlIHNlcXVlbmNlIGluIHJlZ3VsYXIgZXhwcmVzc2lvbgB1bmV4cGVjdGVkIGVuZABtYWxmb3JtZWQgdW5pY29kZSBjaGFyAAAA4HEAAKBvAADwcQAAAQAwADoAQfDjAQvFAwQAMAA6AEEAWwBfAGAAYQB7AGV4cGVjdGluZyAneycgYWZ0ZXIgXHAAdW5rbm93biB1bmljb2RlIHByb3BlcnR5IHZhbHVlAGV4cGVjdGluZyAnfScAU2NyaXB0AHNjAFNjcmlwdF9FeHRlbnNpb25zAHVua25vd24gdW5pY29kZSBzY3JpcHQAR2VuZXJhbF9DYXRlZ29yeQBnYwB1bmtub3duIHVuaWNvZGUgZ2VuZXJhbCBjYXRlZ29yeQB1bmtub3duIHVuaWNvZGUgcHJvcGVydHkgbmFtZQB0b28gbWFueSByYW5nZXMAAAAAAAEDBQEBAQEFBQUBAgIDBQUBAQECAgMDBQUBBQERb3V0IG9mIG1lbW9yeQBvcGNvZGUgPCBSRU9QX0NPVU5UAC90bXAvcXVpY2tqcy9saWJyZWdleHAuYwBjb21wdXRlX3N0YWNrX3NpemUAKHBvcyArIGxlbikgPD0gYmNfYnVmX2xlbgBzdGFja19zaXplID4gMAB2YWwgPCBzLT5jYXB0dXJlX2NvdW50AGxyZV9leGVjX2JhY2t0cmFjawB2YWwyIDwgcy0+Y2FwdHVyZV9jb3VudABBwOcBC6QLMJogAACaMABzgVoAMBdgADAHbACzgW8AABdwAAAHfAAAgX8AQDCAAMMBmACQgZgAQAaZAECQnAC0gaQAQC6lADABvABAhrwAcIG/AAABwAAwgcAAQATBADABwwBAgsMAMILEAECCxQAwAccAMIHHADAByABAgsgAMIHJADABygAAgcoAMAHLADCBywBAAswAAAHNADABzgAwgc4AAAHPADCBzwBABtAAMAHTAECC0wAwgdQAQALWADAB1wBAgtcAMILYAECE2QAwgdsAQALcAEAC3gAAgd8AUAPiAFCD4wBQA+UAQJDmAACB7gBAEu8AtAH4AFCD+ABAAvoAMAH7ADCB+wBAKPwAMAEQAUASEQExAR0BQIIdATCBHgExAR8BAYIfAUCCIAEwgSEBMAEiATCBIgFACiMBAQEoAQGBKAEBASkBAIEpAQABKgEAAisBAIEsAQCBLQEBAS4BAAEwAQGBMAEAgTEBAYEyAQEBMwEAATQBAIE0AQEBNQEBgTUBAQE2AQCBNwEBgTgBAAE5AQCBOgEBgT4BAAFAAQEBQQEAgUEBAYFDAQABRAEAgUQBAAJFAQABRgEAAUkBAYFOAQEBTwFzgaIBQAS4AUACuwEAg70BMIG/ATABwwEwA8QBMAHGATACxwHQAcgBMJHIATCJ0QEAAdYBAIPWAdMB2AEAkdgBcwHhAQCJ4QEAAeYBAILmATCB5wFzAegBc4HoAXOB6gFzAesBAIHrAUAY7AFzAfgBc4H4AQAB+QEAgfkBoAH6AXOB+gFAgvsBMIH8AUAC/QEwg/4BMBAAAjAgCAIAIBgCABAoAkAiMAJANkUCMAFgAkCOYAIAgWcCQGBoAjCmmAIAprACtYHDAjEmUAgxgWMIMYFmCAAraAgAg34IEVDQCRAG+AkgBvwJdAFADnSBQA50AUEOdIFBDnQBQg50gUIOdAFDDoCBQw6AAUQOMCtIDjCDXg4BgbwOAYG+DgEBxw5AfgAPQBg/D7UBSw+2gUsPtgFMD7aBTA+3AU0PgIFNDzABTw9AYFAPAAiADzAIhA8ABogPMAaMDwAIkA8wCJQPAAiYDzAInA8ABqAPMAakD7ABqA8AgagP0wGpDwCBqQ/TAaoPAIGqD9MBqw8AgasPMIGsDzCBrQ8wga4PMIGvDwAIsA8wCLQPAAK4DwAEuQ8AArsPAQK8DwECvQ8BAr4PtwjAD2cIxA+4CMgPaAjMD7gI0A9oCNQPAALYD7kB2Q+xgdkPuQHaD7EB2w/XgdsPMALcDzAC3Q9hAd4PcwHfD7kB4Q+ygeEPugHiD7IB4w/YgeMPMATkD2IB5g8AAugP0AHpD9CB6Q+wAesP0IHrDzAC7A8wAu0PAQLwD9MB8Q/TgfEPugHyDwGB8g+wAfMP04HzDzAC9A8wAvUPMQH2D7oB+Q+ygfkPuwH6D7IB+w/ZgfsPMAL8DzAC/Q9iAf4PoAGTEKABlRCggZUQMQGZEAEBpxAxELAQARC4EECCwRAxGlsSARpoEjEvABYBLxgWQAIwFjABMRYwgTEWMAEyFgCBMhYAATMWQIYzFjCBNhYwATcWMIE3FjABOBZAAjkWQII6FjACPxZAZEAWQIR1FkACeRYAJoAWAIGTFgCBlhZALiBTQBxAU0AOkVNAPplTQIS8UzCBvlNACr9TQILFUzCBxlNABMhTAQHKU0AUy1MwAdVTMIHVUzAB1lMwgdZTMAHXUzAB2FMwgdhTMAHZUzGB2VNADNpTQALhUzEB4lMwgeJTMAHjU0CE41NAgvpTAYGpVSBQuFWyAYB9soGAfbIBgX3agYF92gGCfbOBgn2zAYN9u4GJfbsBin27gYp9vAGLfbuBi30xmpB/AZqgfzEoAIIBKBSCMSRYggEkbIIxM0CGATNghjEgUIwBIGCMMSAgtwEgMLcxIoD0ASKR9ABB8PIBC+MDAQCcBgdNAwQQAI8LAAARAAgAU0pRAFIAUwA6VFUAV1k/XVwARmFjQmQAZgBoAGoAbABuAABAAAAAABoAkwAAIDUAJwAhACQiKgATa20AJiQnFBYYGxw+Hj8fOT0iIUEeQCUlJiggKkksQy5LMEwyREKZAACVj31+g4QSgIJ2dxJ7o3x4eYqSmKaghQCaoZN1M5UAjgB0mZiXlgAAngCcAKGgFS4vMLS1TqqpEhQeISIiKjQ1pqc2H0oAAJcBWtodNgUAxMPGxcjHysnMy8TVRdZC10bYztDS1NrZ7vb+DgcPgJ8AIYCj7QDAQMZg59vmmcAAAAZg3Cn9FRIGFvjdBhUShAjGFv/fA8BAAEZg3uBtNzg5FRQXFgAaGRwbAF+3ZURHAE9iTlAAAEgAAACjpKUAAAAAALYAAFoASABbVlhgXnBpb00AADtnuAAARaiKi4yrrFhYr5Swb7JcW15dYF9iYWRjZmVoZwAAAAAAAACZAwgDAQOlAxMDAANCA5EDlwOpA0YASQBMAFMAaQAHA7wCTgBKAAwDNQVSBUgAMQNUAFcACgNZAEEAvgIIH4AfKB+QH2gfoB+6H4YDsx/KH4kDwx+hA/ofjwPzH0QFRgU7BU4FPQW4A2IESqZgHskDawDlAEHg9gELwgFAqYCOgPyA04CMgI2BjQKA4YCRhZoBAAERAAEECAEIMAgBFSAAOZkxnYRAlIDWgqaAQWKApoBXdvgCgI+AsEDbCIBB0ICMgI+M5AMBiQAUKBARAgEYCyRLJgEBhuWAYHm2gUCRgb2IlAWAmIDHgkM0ogaAjGEoltSAxgEICQuAiwAGgMADDwaAmwMEABaAQVOBmICYgJ6AmICegJiAnoCYgJ6AmAdZY5mFmYWZAAAAALkC4KAeQJ6mQLrUAYnXAYrxAQBBsPgBC7QFpgWAioCiAIDGAwADAYFB9kC/GRiICIBA+oZAzgSAsKwAAQEAq4CKhYmKAKKAiZSPgOQ4iQOgAICdmtqKuYoYCJeXqoL2r7YAAzsChomBjICOgLkDH4CTgZkBgbgDCwkSgJ0KgIqBuAMgC4CTgZUogLkBAB8GgYqBnYC8gIuAsQKAuBQQHoGKgZyAuQEFBIGTgZuBuAsfgJOBnIDHBhCA2QGGiojhAYiIAIXJgZoAAIC2jQQBhIqAo4iA5RgoCYGYC4KPg4wBDYCOgN2AQl+CQ7GCnIKcgZ2Bvwg3AYoQIKyDs4DAgaGA9ROBiAWCQNoJgLkAMAABPYkIpgeQvoOvACAEgKeIi4GfGQiCtwAKAIK5OYG/hdEQjAYYKBGxvoyAod4EQbwAgoqCjIKMgoyBiyeBiQEBhLAgiQCMgI+MsqBLioHwgvyAjoDfn66AQdSAoxokgNyF3IJgbxWAROGFQQ2A4RiJAJuDz4GNoc2AloLsDwIDgJgMgECWgZmRjIClh5iKrYKvARmBkICUgcEpCYGLB4CigIqAsgARDAiAmoCNDAiA44SIgvgBA4BgTy+AQJKPQj2PEIuPoQGAQKgGBYCKgKIAgK6ArIHCgJSCQgCAQOGAQJSERoUQDIOnE4BApIFCPINBgoFAmIpAr4C1jreCsBkJgI6AsYKjIIe9gIuBs4iJGYDeEQANgECfAoeUgbgKgKQyhEDCORCAloDTKAMIgUDtHQiBmoHUOQCB6QABKIDkERiEQQKIAUD/CAOAQI8ZC4CfiacpH4CIKYKtjAFBlTAogNGVDgEB+SoACDCAxwoAgEFagVU6iGA2toS6hoiDRAqAvpC/CIFgTLcIg1TCgoiPDp2DQJOCR7q2g7E4jYCVII5FTzCQDgEEQQSNQa2DRd+G7IdKroRsDACAnd//QO8AQfD9AQtCvgUA/gcAUgogBQwgOw5AYRBADxggQxtgeR0A8SAADaZALqkg3qoAD/8g5wpBghEhxBRhRBkBSB0hpLwBPuEB8AEOAEHA/gELlQjAmYWZroCJAwSWgJ6AQcmDi40mAIBAgCAJGAUAEACTgNKAQIqHQKWApQiFqMaaG6yqogjiAI4OgYkRgI8AnZzYioCXoIgLBJUYiAKAlpiGirSUgJG7tRCRBomOjx8JgZUGABMQj4CMCIKNgYkHKwmVBgEBAZ4YgJKCj4gCgJUGAQQQkYCOgZaAijkJlQYBBBCdCIKOgJAAKhAaCAAKChKLlYCzOBCWgI8QmRSBnQM4EJaAiQQQnwCBjoGQiAKAqAiPBBeClyyRgpeAiAAOua8Bi4a5CAAglwCAiQGIASCAlIOfgL44o5qE8qqTgI8rGgIOE4yLgJClACCBqoBBTAMOAAOBqAOBoAMOAAOBjoC4A4HCpI+P1Q2CQmuBkICZhMqCioaMA42RjZGNjAKOs6IDgMLYhqgAhMWJnrCdDIqrg5m1loi00YDcrpCGtp2MgYmrmaOogomjgYiGqgqoGCgKBEC/v0EVDYGlDQ8AAACAnoG0BgASBhMNg4wiBvOAjICPjOQDAYkADSgAAICPCyQYkKhKdq6AroBAhCsRi6UAIIG3MI+WiDAwMDAwMDCGQiWCmIg0DIPVHIDZA4SqgN2Qn6+PQf9Zv79gUfyCRIzCrYFBDIKPiYGTro+egc+miIHmgbSBiKmMAgOAlpyzjbG9KgCBipuJlpichq6bgI8giYkgqJYQh5OWEIKxABEMCACXEYoyiykphYgwMKqAjYXynGAro4uWg7BgIQNBbYHppYaLJACJgIwEAAEBgOugQWqRv4G1p4vzIECGo5mFmYrYFQ0NCqKLgJmAkgGAjoGNofrEtEEKnIKwrp+MnYSliZ2Box8EqUCdkaODo4Onh7NAm0E2iJWJh0CXKQCrARCBlomWiJ7AkgGJlYmZxbcpv4COGBCcqZyCnKI4m5q1iZWJkoyR7ci2soyyjKNBW6kpzZyJB5XplJqWi7TKrJ+YmaOcAQeiEIuvjYOUAICikYCY0zAAGI6AiYaupTkJlQYBBBCRgIuEQJ20kYOTgp2vkwiAQLeuqIOjr5OAuqqMgMaaQOSr87+eOQE4CJeOAIDdOaaPAICbgImnMJSAiq2SgKG4QQaIgKSQgLCd7zAIpZSAmCgIn42AQUaSQLyAzkOZ5e6QQMNKu0QuT9BCRmAhuEI4hp7wnZGvj4OelISSQq+//8ogwYy/CICbV/eHRNWpiGAi9kEesIKQH0GLSQPqhIyCiIaJV2XUgMYBCAkLgIsABoDAAw8GgJsDBAAWgEFTgZiAmICegJiAnoCYgJ6AmICegJgHSTOsiYaPgEFwq0UTQMS6wzBEsxiaAQAIgIkDAAAoGAAAAgEACAAAAAABAAsGAwMAgImAkCIEgJBRQ2Cm3aFQNIpA3YFWgY1dMEweQh1F4VNKAEHghgILY/YDIKYHAKkJALQKALoLAD4NAOAOIFcSAOsWAMoZIMAdYIAgAC4tAMAxIImnIPCpAOOrAD79APsAITcHYQEKAR0PISwSAcgUIdEZIUcdATlqIQmNAbzUAanXITruAd6mIksTAwBB0IcCC/IEr4mkgNaAQkfvloBA+oRBCKwAAQEAx4qvnijkMSkIGYmWgJ2a2oqOiaCIiICXGIgCBKqC9o6AoLUQkQaJCYmQgrcAMQmCiICJCYmNAYK3ACMJEoCTixCKgrcAOBCCkwmJiSiCtwAxCRaCiQmJkYC6IhCDiICNiY+EuDAQHoGKCYmQgrcAMBAegYoJiY+DtggwEIOIgIkJiZCCxQMoAD2JCbwBhos4idYBiIopib0NiYoAAAOBsJMBhIqAo4iA45OAiYsbEBEyg4yLgI5CvoKIiEOfgpyCnIGdgb+fiAGJoBGJQI6A9YuDi4mJ/4q7hLiJgJyBioWJlY0BvoSukIqJkIiLgp2MgYmrja+Th4mFifUQlBgoCkDFuQRCPoGSgPqMGIKLS/2CQIyA359CKYXogWB1hInEA4mfgc+BQQ8CA4CWI4DSgbGRiYmFkYyKm4eYjKuDro2OiYqAiYmujYsHCYmggrEAEQwIgKgkgUDrOAmJYE8jgELgj4+PEZeCQL+JpIBCvIBA4YBAlIRBJIlFVhAMg6cTgECkgUI8H4lBcIFAmIpAroK0jp6JjoOsirSJKqONgIkhq4CLgq+NO4CL0YsoQJ+LhIkrtggxCYKIgIkJMoRAv5GIiRjQk4uJQNQxiJqB0ZCOidCMh4nSjoOJQPGOQKSJxSgJGACBi4n2MTKAm4mnMB+AiIqtj0GUOIePibeVgI35KgAIMAeJryAIJ4lBSINgS2iJQIWEuoaYiUP0ALYz0ICKgWBMqoFUxSIvOYadg0CTgkWIsUH/toOxOI2AlSCORU8wkA4BBEEEhoiJQaGNRdWG7DSJUpWJbAUFQO8AQdCMAgujEvoGAIQJAPAKAHAMAPQNAEoQIBoYIHQbIN0gAAyoAFqqIBr/AK0OATgSIcEVIeUZIaodIYzRQUrhIfABDgAAAABBZGxhbSxBZGxtAEFob20sQWhvbQBBbmF0b2xpYW5fSGllcm9nbHlwaHMsSGx1dwBBcmFiaWMsQXJhYgBBcm1lbmlhbixBcm1uAEF2ZXN0YW4sQXZzdABCYWxpbmVzZSxCYWxpAEJhbXVtLEJhbXUAQmFzc2FfVmFoLEJhc3MAQmF0YWssQmF0awBCZW5nYWxpLEJlbmcAQmhhaWtzdWtpLEJoa3MAQm9wb21vZm8sQm9wbwBCcmFobWksQnJhaABCcmFpbGxlLEJyYWkAQnVnaW5lc2UsQnVnaQBCdWhpZCxCdWhkAENhbmFkaWFuX0Fib3JpZ2luYWwsQ2FucwBDYXJpYW4sQ2FyaQBDYXVjYXNpYW5fQWxiYW5pYW4sQWdoYgBDaGFrbWEsQ2FrbQBDaGFtLENoYW0AQ2hlcm9rZWUsQ2hlcgBDaG9yYXNtaWFuLENocnMAQ29tbW9uLFp5eXkAQ29wdGljLENvcHQsUWFhYwBDdW5laWZvcm0sWHN1eABDeXByaW90LENwcnQAQ3lyaWxsaWMsQ3lybABEZXNlcmV0LERzcnQARGV2YW5hZ2FyaSxEZXZhAERpdmVzX0FrdXJ1LERpYWsARG9ncmEsRG9ncgBEdXBsb3lhbixEdXBsAEVneXB0aWFuX0hpZXJvZ2x5cGhzLEVneXAARWxiYXNhbixFbGJhAEVseW1haWMsRWx5bQBFdGhpb3BpYyxFdGhpAEdlb3JnaWFuLEdlb3IAR2xhZ29saXRpYyxHbGFnAEdvdGhpYyxHb3RoAEdyYW50aGEsR3JhbgBHcmVlayxHcmVrAEd1amFyYXRpLEd1anIAR3VuamFsYV9Hb25kaSxHb25nAEd1cm11a2hpLEd1cnUASGFuLEhhbmkASGFuZ3VsLEhhbmcASGFuaWZpX1JvaGluZ3lhLFJvaGcASGFudW5vbyxIYW5vAEhhdHJhbixIYXRyAEhlYnJldyxIZWJyAEhpcmFnYW5hLEhpcmEASW1wZXJpYWxfQXJhbWFpYyxBcm1pAEluaGVyaXRlZCxaaW5oLFFhYWkASW5zY3JpcHRpb25hbF9QYWhsYXZpLFBobGkASW5zY3JpcHRpb25hbF9QYXJ0aGlhbixQcnRpAEphdmFuZXNlLEphdmEAS2FpdGhpLEt0aGkAS2FubmFkYSxLbmRhAEthdGFrYW5hLEthbmEAS2F5YWhfTGksS2FsaQBLaGFyb3NodGhpLEtoYXIAS2htZXIsS2htcgBLaG9qa2ksS2hvagBLaGl0YW5fU21hbGxfU2NyaXB0LEtpdHMAS2h1ZGF3YWRpLFNpbmQATGFvLExhb28ATGF0aW4sTGF0bgBMZXBjaGEsTGVwYwBMaW1idSxMaW1iAExpbmVhcl9BLExpbmEATGluZWFyX0IsTGluYgBMaXN1LExpc3UATHljaWFuLEx5Y2kATHlkaWFuLEx5ZGkATWFrYXNhcixNYWthAE1haGFqYW5pLE1haGoATWFsYXlhbGFtLE1seW0ATWFuZGFpYyxNYW5kAE1hbmljaGFlYW4sTWFuaQBNYXJjaGVuLE1hcmMATWFzYXJhbV9Hb25kaSxHb25tAE1lZGVmYWlkcmluLE1lZGYATWVldGVpX01heWVrLE10ZWkATWVuZGVfS2lrYWt1aSxNZW5kAE1lcm9pdGljX0N1cnNpdmUsTWVyYwBNZXJvaXRpY19IaWVyb2dseXBocyxNZXJvAE1pYW8sUGxyZABNb2RpLE1vZGkATW9uZ29saWFuLE1vbmcATXJvLE1yb28ATXVsdGFuaSxNdWx0AE15YW5tYXIsTXltcgBOYWJhdGFlYW4sTmJhdABOYW5kaW5hZ2FyaSxOYW5kAE5ld19UYWlfTHVlLFRhbHUATmV3YSxOZXdhAE5rbyxOa29vAE51c2h1LE5zaHUATnlpYWtlbmdfUHVhY2h1ZV9IbW9uZyxIbW5wAE9naGFtLE9nYW0AT2xfQ2hpa2ksT2xjawBPbGRfSHVuZ2FyaWFuLEh1bmcAT2xkX0l0YWxpYyxJdGFsAE9sZF9Ob3J0aF9BcmFiaWFuLE5hcmIAT2xkX1Blcm1pYyxQZXJtAE9sZF9QZXJzaWFuLFhwZW8AT2xkX1NvZ2RpYW4sU29nbwBPbGRfU291dGhfQXJhYmlhbixTYXJiAE9sZF9UdXJraWMsT3JraABPcml5YSxPcnlhAE9zYWdlLE9zZ2UAT3NtYW55YSxPc21hAFBhaGF3aF9IbW9uZyxIbW5nAFBhbG15cmVuZSxQYWxtAFBhdV9DaW5fSGF1LFBhdWMAUGhhZ3NfUGEsUGhhZwBQaG9lbmljaWFuLFBobngAUHNhbHRlcl9QYWhsYXZpLFBobHAAUmVqYW5nLFJqbmcAUnVuaWMsUnVucgBTYW1hcml0YW4sU2FtcgBTYXVyYXNodHJhLFNhdXIAU2hhcmFkYSxTaHJkAFNoYXZpYW4sU2hhdwBTaWRkaGFtLFNpZGQAU2lnbldyaXRpbmcsU2dudwBTaW5oYWxhLFNpbmgAU29nZGlhbixTb2dkAFNvcmFfU29tcGVuZyxTb3JhAFNveW9tYm8sU295bwBTdW5kYW5lc2UsU3VuZABTeWxvdGlfTmFncmksU3lsbwBTeXJpYWMsU3lyYwBUYWdhbG9nLFRnbGcAVGFnYmFud2EsVGFnYgBUYWlfTGUsVGFsZQBUYWlfVGhhbSxMYW5hAFRhaV9WaWV0LFRhdnQAVGFrcmksVGFrcgBUYW1pbCxUYW1sAFRhbmd1dCxUYW5nAFRlbHVndSxUZWx1AFRoYWFuYSxUaGFhAFRoYWksVGhhaQBUaWJldGFuLFRpYnQAVGlmaW5hZ2gsVGZuZwBUaXJodXRhLFRpcmgAVWdhcml0aWMsVWdhcgBWYWksVmFpaQBXYW5jaG8sV2NobwBXYXJhbmdfQ2l0aSxXYXJhAFllemlkaSxZZXppAFlpLFlpaWkAWmFuYWJhemFyX1NxdWFyZSxaYW5iAEGAnwILsRTAGZlFhRmZRa4ZgEWOGYBFhBmWRYAZnkWAGeFgRaYZhEWEGYENkxngDzeDK4AZgisBgyuAGYArA4ArgBmAK4AZgisAgCsAkysAviuNGo8r4CQdgTfgSB0ApQUBsQUBggUAtjQHmjQDhTQKhASAGYUEgBmNBIAZgAQAgASAGZ8EgBmJBIo3mQSAN+ALBIAZoQSNhwC7hwGCh68EsZENumMBgmOtewGOewCbUAGAUACKhzSUBACRBAqOBIAZnATQH4M3jh+BGZkfgwsAhwsBgQsBlQsAhgsAgAsCgwsBiAsBgQsBgwsHgAsDgQsAhAsBmAsBgi4AhS4DgS4BlS4Ahi4AgS4AgS4AgS4BgC4AhC4DgS4Bgi4CgC4Ggy4AgC4GkC4JgiwAiCwAgiwAlSwAhiwAgSwAhCwBiSwAgiwAgiwBgCwOgywBiywGhiwAgnAAh3ABgXABlXAAhnAAgXAAhHABiHABgXABgnAGgnADgXAAhHABkXAJgY4AhY4Cgo4Ag44CgY4AgI4AgY4CgY4Cgo4Ci44DhI4Cgo4Ag44BgI4FgI4NlI4EjJAAgpAAlpAAj5ACh5AAgpAAg5AGgZAAgpAEg5ABiZAGiJCMPACCPACWPACJPACEPAGIPACCPACDPAaBPAaAPACDPAGJPACBPAyMTwCCTwCyTwCCTwCFTwOPTwGZTwCCgQCRgQKXgQCIgQCAgQGGgQKAgQOFgQCAgQCHgQWJgQGCgQu5kgOAGZuSJIFEAIBEAIREAJdEAIBEAJZEAYREAIBEAIVEAYlEAYNEH8eTAKOTA6aTAKOTAI6TAIaTgxmBkyTgP16lJwCAJwSAJwGqJ4AZgyfgnzDIJgCDJgGGJgCAJgCDJgGoJgCDJgGgJgCDJgGGJgCAJgCDJgGOJgC4JgCDJgHCJgGfJgKZJgXVFwGFFwHiHxKcZgLKeoIZinoGjIgAhogKlDKBGQiTEQuMiQCCiQCBiQvdQAGJQAWJQAWBW4EZgFuAGYhbAIlbBdhbBqpbBMUSCZ5HAItHA4tHA4BHAotHnYoBhIoKq2EDmWEFimECgWGfQJsQAYEQvosAnIsBiosFiYsFjYsBkDc+ywcDrAcCv4WzCgeDCrdGAo5GAoJGr2eIHQaqJwGCJ4eFB4I3gBmMN4AZhjeDGYA3hRmAN4IZgTeAGQSlRYQrgB2wRYQrg0WEK4xFgB3FRYAruTcAhDfgn0WVKwGFKwGlKwGFKwGHKwCAKwCAKwCAKwCeKwG0KwCOKwCNKwGFKwCSKwGCKwCIKwCLGYE31hkAihmARQGKGYBFjhkAjEUCnxkPoDcOpRmAK4IZgUWFGYBFmhmARZAZqEWCGQPiNhkYihkU4z8Z4J8P4hMZAZ8ZAOAIGa4oAK4oAJ9F4BMaBIYapScAgCcEgCcBt5QGgZQNgJSWJgiGJgCGJgCGJgCGJgCGJgCGJgCGJgCGJgCfHdIZLJkvANgvC+B1LxmLGQOEGYAvgBmAL5gZiC+DN4EwhxmDL4MZANU1AYE3gRmCNYAZ2T2BGYI9BKoNAN0wAI8Znw2jGQuPPZ4wAL8ZnjDQGa49gBnXPeBHGfAJXy+/GfBBnC8C5CybArabCK9K4MuXE98d1wgHoRngBUWCGbRFAYhFKYpFrIYCiRkFt3YHxXwHi3wFnx+tPoAZgD6jeQqAeZwwAs06AIAZiToDgTqeXgC2FgiNFgGJFgGDFp9ewowXhIyWVQmFJgGFJgGFJgiGJgCGJgCqRYAZiEWAK4NFgRkDzxetVQGJVQXwG0MwC5YwA7AwcBCj4Q0vAeAJLyWGRQuEBQSZNACENACANACBNACBNACJNOARBBDhCgSBGQ+/BAG1BCeNBAGPN4kZBY03gR2iGQCSGQCDGQOEBADgJgQBgBkAnxmZRYUZmUWKGYk9gBmsPYEZnjAChTABhTABhTABgjAChhkAhhkJhBkBi0kAmUkAkkkAgUkAjkkBjUkh4BpJBIIZA6wZAogZzisAjBkCgCsurBmAN2AhnEsCsBMOgDeaGQOjaQiCaZopBKprBJ2WAICWo2wDjWwpzx6vfp1yAYlyBaNxA6NxA6ckB7MUCoAUYC/g1kgIlUgJh0hgN4UcAYAcAKscAIEcAoAcAYAclTYAiDafdJ5fB4hfL5IzAIEzBIQzm3cCgHeZTASATD+fWJdXA5NXAa1Xgz8AgT8Ehz8Agj8AnD8Bgj8DiT8GiD8Gn26fah+mUQOLUQi1BgKGBpU5AYc5kjgEhziReAaDeAuGeE/IbzayaAyyaAaFaKcxB4kxYMWeBACpmgCCmgGBmk2nbQepglWbGBOWJQjNDgOdDg6ADsE7CoA7AZiDBomDBbQVAJEVB6ZOCN99AJOBCpFBAKtBQIZdAIBdAINdAI5dAIpdBbpDBIlDBYMqAIcqAYEqAZUqAIYqAIEqAIQqAIA3iCoBgSoBgioBgCoFgCoEhioBhioChCpgKttiAIRiHceVB4mVYEW1fwGlfyHEWgqJWgWMWxK4jQaJjTWaAgGOAgOPAmBfuyFgA9KZC4CZhiABgCABhyAAgSAAnSAAgSABiyAIiSBFh2ABrWABimAax5wH0oQcuHVgpogMAKwMAI0MCZwMAp9SAZVSAI1SSIZTAIFTAKtTAoBTAIFTAIhTB4lTBYUtAIEtAKQtAIEtAIUtBoktYNWYTWBWgEoOsY4MgI7jORtgBeAOGwCEGwrgYxtqW+POIwCII29m4eYDcBFY4dgIBp5cAIlcA4FcX50JAYUJCcVzCYlzAIZzAJRzBJJzYk/aVGAEylkDuFkGkFk/gI+AZIEZgEIKgS8N8AeXjwfin4/hdUIpiI9wEpaAPeC9NTCCNRCDPQfhK2Roo+AKIgSMIgKIIgaJIgGDIoMZcAL74JUZCaYZAb0ZgjeQGYc3gRmGN50Zgze6GRbFK2A5kxkL1hkImBlgJtQZAMYZAIEZAYAZAYEZAYMZAIsZAIAZAIYZAMAZAIMZAYcZAIYZAJsZAIMZAIQZAIAZAoYZAODzGQHgwxkBsRniK4AOhIAAjoBk74YoAJAoAYYoAIEoAIQoYHSsZQKNZQGJZQOBZWEPuZgEgJhkn+BkVgGPVijLAQOJAQOBAWKwwxlLvBlgYYMEAJoEAIEEAIAEAYAEAIkEAIMEAIAEAIAEBYAEA4AEAIAEAIAEAIIEAIEEAIAEAYAEAIAEAIAEAIAEAIAEAIEEAIAEAYMEAIYEAIMEAIMEAIAEAIkEAJAEBIIEAIQEAJAEM4EEYK2rGQPgAxkLjhkBjhkAjhkApBkJ4E0ZN5kZgDWBGQyrGQOIGQaBGQ2FGWA543cZB4wZAowZAuATGQvYGQaLGROLGQO3GQeJGQWnGQedGQGBGU3gGBkA0RkA4CYZC40ZAYQZAoIZBIYZCJgZBoYZCIIZDIYZKOAyGQC2GSSJGWOl8JZ9LyHv1C8K4H0vAfAGIS8N8AzQL2u+4b0vZYHwAuovetxVgBkd3xlgH+CPNwBBwLMCC7ILgsEAAAErAQAAASscAAwBRYCSAAACHWsAAh0oAQIdRQACHSiBAwAABQQxh5GaDQAABQQxh5GaAAMEh5EBAAAFBDGHkZofAAAIAQRQUXgxgocJAAoCBIcJAAkDBJGaBQAAAgSHYgAAAgQxgfsAAA0LHyosLjxFT3B9jpCVAAwLHyosLjxFT3COkJUQAAAUCx8hLVMqLC48Tk9gcEOBho2OkJUAFQsfIS1TKiwuPEdOT2BwQ4GGjY6QlQkEHyE7TnUACQMLFYZ1AAkCLl11AAkCLEGAdQANAiqOgHEACQI8YILPAAkDFV6KgDAAAAInRYW4AAEEETKJiIBKAAECW3YAAAACW3aESQAABAsfKjwAAR8ABAsfKjwAAh8qAAEfAQILHwACH30AAgsfAAIffQAGHzxPcI6QAAEfAQIffQEBHwACH30AAgsfBgEfAAIfYAACCx8BAR8AAgsfAwEfAAgLHyo8YHCQlQACHyoAAx8qPAECCx8AAQsBAh8qAAFggEQAAQErNQAAAh2HgbUAAAJFW4A/AAADHypFjNEAAAIdKIE8AAEGDTAvNT2bAAUNMC81PQEAAAEvAAAJBg0wLzU9mwAAAAUNMC81PQcGDTAvNT2bAwUNMC81PQkAAwINLwEAAAUNMC81PQQCNT0AAAAFDTAvNT0DAAEDLzU9AQEvWAADAjU9AgAAAjU9WQAABg0wLzU9mwACNT2AEgAPAS8fACMBLzsAJwEvNwAwAS8OAAsBLzIAAAEvVwAYAS8JAAQBL18AHgEvwDHvAAACHSiADwAHAi9FgKcAAg4fISwuQTw7Tk9aYEONlQINHyEsLkE8O05aYEONlQMLHyEsLkE7TlpDjZWANgAAAgsfAAAAAh+OOQAAAz5FXoAfAAACEDrAE6EAAAIEkQkAAAIEkUYAAQUNMC81PYCZAAQGDTAvNT2bCQAAAjU9LAABAjU9gN8AAgIcSQMALAMcSEkCAAgCHEmBHwAbAgQaj4QAAAIqjgAAAAIqjjYAAQIqjowSAAECKo4AAAACKo7AXEsAAwEiljsAEQEvnl0AAQEvzs0tAABDbixVbmFzc2lnbmVkAEx1LFVwcGVyY2FzZV9MZXR0ZXIATGwsTG93ZXJjYXNlX0xldHRlcgBMdCxUaXRsZWNhc2VfTGV0dGVyAExtLE1vZGlmaWVyX0xldHRlcgBMbyxPdGhlcl9MZXR0ZXIATW4sTm9uc3BhY2luZ19NYXJrAE1jLFNwYWNpbmdfTWFyawBNZSxFbmNsb3NpbmdfTWFyawBOZCxEZWNpbWFsX051bWJlcixkaWdpdABObCxMZXR0ZXJfTnVtYmVyAE5vLE90aGVyX051bWJlcgBTbSxNYXRoX1N5bWJvbABTYyxDdXJyZW5jeV9TeW1ib2wAU2ssTW9kaWZpZXJfU3ltYm9sAFNvLE90aGVyX1N5bWJvbABQYyxDb25uZWN0b3JfUHVuY3R1YXRpb24AUGQsRGFzaF9QdW5jdHVhdGlvbgBQcyxPcGVuX1B1bmN0dWF0aW9uAFBlLENsb3NlX1B1bmN0dWF0aW9uAFBpLEluaXRpYWxfUHVuY3R1YXRpb24AUGYsRmluYWxfUHVuY3R1YXRpb24AUG8sT3RoZXJfUHVuY3R1YXRpb24AWnMsU3BhY2VfU2VwYXJhdG9yAFpsLExpbmVfU2VwYXJhdG9yAFpwLFBhcmFncmFwaF9TZXBhcmF0b3IAQ2MsQ29udHJvbCxjbnRybABDZixGb3JtYXQAQ3MsU3Vycm9nYXRlAENvLFByaXZhdGVfVXNlAExDLENhc2VkX0xldHRlcgBMLExldHRlcgBNLE1hcmssQ29tYmluaW5nX01hcmsATixOdW1iZXIAUyxTeW1ib2wAUCxQdW5jdHVhdGlvbixwdW5jdABaLFNlcGFyYXRvcgBDLE90aGVyAEGAvwILsAgOAAAAPgAAAMABAAAADgAAAPAAAAAAfwAAAIADAQAAPEFTQ0lJX0hleF9EaWdpdCxBSGV4AEJpZGlfQ29udHJvbCxCaWRpX0MARGFzaABEZXByZWNhdGVkLERlcABEaWFjcml0aWMsRGlhAEV4dGVuZGVyLEV4dABIZXhfRGlnaXQsSGV4AElEU19CaW5hcnlfT3BlcmF0b3IsSURTQgBJRFNfVHJpbmFyeV9PcGVyYXRvcixJRFNUAElkZW9ncmFwaGljLElkZW8ASm9pbl9Db250cm9sLEpvaW5fQwBMb2dpY2FsX09yZGVyX0V4Y2VwdGlvbixMT0UATm9uY2hhcmFjdGVyX0NvZGVfUG9pbnQsTkNoYXIAUGF0dGVybl9TeW50YXgsUGF0X1N5bgBQYXR0ZXJuX1doaXRlX1NwYWNlLFBhdF9XUwBRdW90YXRpb25fTWFyayxRTWFyawBSYWRpY2FsAFJlZ2lvbmFsX0luZGljYXRvcixSSQBTZW50ZW5jZV9UZXJtaW5hbCxTVGVybQBTb2Z0X0RvdHRlZCxTRABUZXJtaW5hbF9QdW5jdHVhdGlvbixUZXJtAFVuaWZpZWRfSWRlb2dyYXBoLFVJZGVvAFZhcmlhdGlvbl9TZWxlY3RvcixWUwBXaGl0ZV9TcGFjZSxzcGFjZQBCaWRpX01pcnJvcmVkLEJpZGlfTQBFbW9qaQBFbW9qaV9Db21wb25lbnQsRUNvbXAARW1vamlfTW9kaWZpZXIsRU1vZABFbW9qaV9Nb2RpZmllcl9CYXNlLEVCYXNlAEVtb2ppX1ByZXNlbnRhdGlvbixFUHJlcwBFeHRlbmRlZF9QaWN0b2dyYXBoaWMsRXh0UGljdABEZWZhdWx0X0lnbm9yYWJsZV9Db2RlX1BvaW50LERJAElEX1N0YXJ0LElEUwBDYXNlX0lnbm9yYWJsZSxDSQBBU0NJSQBBbHBoYWJldGljLEFscGhhAEFueQBBc3NpZ25lZABDYXNlZABDaGFuZ2VzX1doZW5fQ2FzZWZvbGRlZCxDV0NGAENoYW5nZXNfV2hlbl9DYXNlbWFwcGVkLENXQ00AQ2hhbmdlc19XaGVuX0xvd2VyY2FzZWQsQ1dMAENoYW5nZXNfV2hlbl9ORktDX0Nhc2Vmb2xkZWQsQ1dLQ0YAQ2hhbmdlc19XaGVuX1RpdGxlY2FzZWQsQ1dUAENoYW5nZXNfV2hlbl9VcHBlcmNhc2VkLENXVQBHcmFwaGVtZV9CYXNlLEdyX0Jhc2UAR3JhcGhlbWVfRXh0ZW5kLEdyX0V4dABJRF9Db250aW51ZSxJREMATG93ZXJjYXNlLExvd2VyAE1hdGgAVXBwZXJjYXNlLFVwcGVyAFhJRF9Db250aW51ZSxYSURDAFhJRF9TdGFydCxYSURTAEHAxwILtCCBACgAlwAqAIGAKgCXwCsAFYEsAJcALQCBQC0AlwAuABVBLgCZAS8AFiAwAEIIQABCikQAQgRKAJYATAAXgUwAQgJNAEJDTgAvwU8AQsNQAL9AUgBCA1MAQglVAEIIWgCWAF4AQkNeAIHAXwBCAWgAQsFrAIUBcQAXw3EAREhzAESDdwBCg3kAvgJ7AJdBfABCAX0ARAR+AEIOgABCgYcARIeJAIMErAAXA7YAgwK4ABQC0ACWANEAgADdAJeA3gCAgN8AlwDhAD5B4QCAwOEAvgTiAK6D6gCugvIArQH0AC7B9AADQfUAAwP8AIFA/gA+AgABvsABAb4BAwG+QAYBvkAOAT4CFAG+wBUBvgEXAUSBHQFEQTABRAI0AUSBNQFEgzYBRIM4AUSGOgFEAT4BhcBhAa6CiAEvQp0BhAGwAYTAtAGEQEoChEBMAoQATQIuBFYCLsFyAiABdwKEwHcChMCMAoSAjQKuQZYChICXAoQA0gIuwdICIAHXAoQA5QKugfIChAASA4QAMAMiwTEDLoEyA66BUgOEgHYDrgF3A4XAjAOFwKwDLwG3A4EAwwOEwNADhEDTA4SA1AOEwNUDhADXA4RA2gOEwNwDLkHdA4XA3QOEAN4DhUDeA4RA4AOEwOQDhEDnA4SA6AOEwOkDhADrA4RA7gOEgAkEgQA/BISEwQaEgMQGhMHOBiAB0AaEwNAGgwNLBx/ETAeDF08HgQBeB4PSZgdEHYAHQomOB0QYkwdCDZ8HFoKlB4WApge+wKYHRA2oB0SgrgciAcAHRIPAByIBwgdEg8IHIgHEB0SCxAciAcYHRILGBz4RyAdEgtAHIgHSB0SC0gciAdQHRIPUBz5M1geAQNwHvoDcB4DA3Ae+AN0HgEDdB76A3QeAwN0HvgDeB4BA3ge+gN4HgMDeB74A3weAQN8HIAjgByAI5AcgCOgHvgXsB4DA7ge+AO8Hl0DvB4CA7wcXwe8HPkTwB4BA8ge+gPIHgMDyB74D8weAwPQHroL1B4DA9gc+Q/cHgMD4B64D+QeAwPoHPgH7BwKB+we+g/wHgED+B76A/geAwP4HvgD/B4BA/weXgP8HHgEACJWEAAiBQAQIl8AFCIEACQiXQAkImYAJCIHACwiFwAwIsQANCIWADQixwA0IlwEPCJfBEQizwBUIgcAXCJUFHAiBwB4IFQIfCB8FIAiDhSIIFUQlCJcAKggZAUAIgYBACL/AQAgZQUEIgcBBCL9AQggthUIIgUBFCJeARQiVQkYIlwBICJlASAiXgEgIgQBJCICASQiBAEoIAoFKCJUESwgfQk0IgUBOCJnATgiDAk8IlUJRCBkBVAibgFQIGcZUCJfAVwiBAFgIl0BYCJmAWAiXwFgIgQBZCJdAWQiZgFkIm8BZCJcAWgiBQFoIl4BaCJnAWgiVAlsIl0BcCJmAXAiXwFwIgQBdCJdAXQiZgF0Im8BdCJcAXgiBQF4Il4BeCJnAXggVAl8ImUBiCD6BZgi+gGsIvkFzCL4AgQi+QIIIvgCDCL4BiQiFAIsIsUCLCIXAiwixAIwIvkCQCL4AkQi+wZEIvgGYCL5CmwhEAZ0IRAGeCEQBoAhEAaEIRAGiCD4CqwhEArgIIIK6CB5BygifBBgJI0UaCZfAHAmlBB0JK0UfCZvAIQmhBCIJJUUkCZnAJgklDScJH40tCR8NNAmBgDoJswCDCpkAnQqXQJ0KmYCdCr4AtwoVAR8LgcBbC4HApwuBwLwLrQTAC61EwguthMQLg/PGCy2F4AsDHeMLLYjxC4EAAAyDgg0MhAsTDIRCGQwiARwMIsEcDCKBHQwiQR4MIgEfDIQAJQwjwSYMhIAnDIXAJwyECysMhEIxDCIBNAwiwTQMIoE1DCJBNgwiATcMhAA9DCDCPQyEgD8MhcA/DC1KTAwfRVEMn8pTDK0VWQwDh2QMQQeADImAgwwpwYMMqUGEDIkAhQwpQYUMqcKFDIkAhwyPQIcMjYCHDEESiAwDApEMmQCUDKNElAwjg5YMLQeYDK+Emwyhwp0MtQCfDLNAnwyFgJ8MgxigDCNCrAwjRa0Ml8CvDKEEsAylQbIMlwCzDJlAswyXgLMMmcCzDK0XtAyFwL8MswHADLHAwAyzAMEMMUHBDLXAwQyzAMIMsUHCDDMBwwwxgcMMhQDEDLFAxAwzgcQMhQDFDLVAxQy3gMUMtcDFDLEAxgw1QcYMs8DGDLEBxwyzwMcMtQDIDLNAyAyxgcgML0LJDDFBygy1wMoMsQDLDLNAywy1gMsMscDLDC8BzAy1gMwMs8DMDLUAzQyxQM0MtYDNDIXAzQyxAs4Ms0DPDLGAzwyFwM8MsQHQDLPA0AyxAdEMtcDRDLMA0gyFQNIMtYDSDIXA0gwzAdMMsYHTDLNA1AyFgNQMscDUDLMA1QyFQNUMtYDVDLHA1QwhBdYMJYXYDKUC2wyZQNwMF4HcDJkA3QyXQd0MJwHeDIWC3gyJwN8MPwTgDJkA4gybQOIMv4PiDBlC5AwFQuUMP0PmDDHB5wyFQOgMsYHoDIVA6QwHgekMiQDqDJdA6gwZguoMnYDrDI3A6ww/COwMBQHwDJuA8AyXwfAMm4DxDJnA8QwXBfIMmYD0DBfB9AwZQfUMl8D1DJsA9gyZQPYMF4L2DBmB9wyhBPgMJUX6DCXF/AwlQf8MmcD/DAMBpymBANwpAwH+KQMC1yqBQNoqghRAPoJ/Sj6CP2o+AqGKPhABmz6CL5w+kMWzPpcBwD4ZwcA+P0HBPq/CxD6EQcc+rQTIPoFAyj4Eg8o+oAPMPqACzj6EgM8+IAHQPiDB0D6uhNE+hcDTPi0x1D6ty/Q+L4n6Pi0C/z4vLwA/pYIXP7HAGD+vBxk/r/8cP6WBPD+vZD0/MSBUPzGbZD8xAXw/s4N8P7FAfj+9gH4/u8B+P7MAfz8DBYQ/rQGMPxXDjD8tRo4/A8yRP5XGlz+vAZw/hQCdPy+FnT+tOqA/L0S9Px9vwD8fwdc/rV/YP4EA6D8fT+g/H4PwPx+D8j8fg/Q/n4H2P4MH+D+SgSZEksAqRBKBS0QSwdJEEsIuRRKBbkWSAE5GkoNXdBLDbnQfDQB1H40GdR8NDXWfgxN1H4kVdR8NGnUfjSB1FRAndZ9DL3WfRTF1Hw00dR+NOnWVA0F1H0RDdZ+DRXUfjUd1lQdOdZ+DUnUfjVR1Hw1bdR+NYXUfDWh1H41udR8NdXUfjXt1Hw2CdR+NiHUfDY91H42VdR8NnHUfjaJ1AwGpdZ8IqnWBQK51n4OudYFAsHWfjLB1gcC2dS0Dt3WfiLh1gcC8dZ8DvXWBwL51nwy/dYFAxXUtg8V1nwjHdYFAy3Wfg8t1gUDNdZ+MzXWBwNN1LQPUdZ+I1XWBwNl1nwPadYHA23WfDNx1gUDidS2D4nWfCOR1gUDodZ+D6HWBQOp1n4zqdYHA8HUtBPF1H4XzdR8F9nUfhfh1HwX7dR+F/XUtAoB7rU2BewNCiHuBwIl7LUWKewMEjXuBgJB7A9yRey0FoHutyKJ7g0Soe63IqnuXAEB8IUVAfCUNRHyHgEp8FcFKfBdBS3wfDUx8F4JSfJmAU3yXwFN8l4FafJcAZHwvAYB8gYCAfAMWhHzBBJB8AwGUfB8F/H6sAQC+ENEAvqxHCb4QOQ2+LIcpviwCLb6QNy6+kP9JvhC8ab4AAAAAAAAAACAAAABhAAIABAAGALwDCAAKAAwAFQCVAKUAuQDBAMMAxwDLANEA1wDdAOAA5gD4AAgBCgFzABABEgEUASABLAFEAU0BUwFiAWgBagF2AZIBlAGpAbsBxwHRAdUBuQLXATsA2QHbAbcA4QH8AQwCGAIdAiMCJwKjAzMCPwJCAksCTgJRAl0CYAJpAmwCbwJ1AngCgQKKApwCnwKjAq8CuQLFAskCzQLRAtUC5wLtAvEC9QL5Av0CBQMJAw0DEwMXAxsDIwMnAysDLwM1Az0DQQNJA00DUQMLD1cDWwNfA2MDZwNrA28DcwN5A30DgQOFA4kDjQORA5UDmQOdA6ED3BClA8kDzQPZA90D4QPvA/EDPQRPBJkE8AQCBUoFZAVsBXAFcwWaBfoF/gUHBgsGFAYYBh4GIgYoBo4GlAaYBp4GogarBqwD8watA/YGrgP5Bq8D/AbMA/8GzQMCB84DBQcJBw0HEQeGAzIHNQe5AzcHOweIA1MHiQNWB5ADaweKA3cHsAOJB44DmQefB6MHjAO4B48Duwe0AL4HwAfCBxAgywcuAM0HzwcgANIH1gfbB98H5AfqB/AHIAD2BxIiAQgFCAcIHQglCCcIQwAtCDAIkAE2CDkITgBFCEcITAhOCFEIWgCpA1oAUwhXCGAIaQBiCGUIbwh0CHoIfgiiCEkApAimCKkIVgCrCK0IsAi0CFgAtgi4CLsIwAjCCMUIdgDHCMkIzAjQCHgA0gjUCNcI2wjeCOQI5wjwCPMI9gj5CAIJBgkLCQ8JFAkXCRoJIwksCTsJPglBCUQJRwlKCVYJXAlgCWIJZAloCWoJcAl4CXwJgAmGCYkJjwmRCTAAkwmZCZwJngmhCaQJYS3Na5+fpgmxCbwJxwmVCqEKFQsgACcLMQuNC6ELpQupC60LsQu1C7kLvQvBC8ULIQw1DDkMPQxBDEUMSQxNDFEMVQxZDG8McQxzDKAMvAzcDOQM7Az0DPwMBA0MDRQNIg0uDXoNgg2FDYkNjQ2dDbENtQ28DcINxg0oDiwOMA4yDjYOPA4+DkEOQw5GDncOew6JDo4OlA6cDqMOqQ60Dr4Oxg7KDs8O2Q7dDuQO7A7zDvgOBA8KDxUPGw8iDygPMw89D0UPTA9RD1cPXg9jD2kPcA92D30Pgg+JD40Png+kD6kPrQ+4D74PyQ/QD9YP2g/hD+UP7w/6DwAQBBAJEA8QExAaEB8QIxApEC8QMhA2EDkQPxBFEFkQYRB5EHwQgBCVEKEQsRDDEMsQzxDaEN4Q6hDyEPQQABEFERERQRFJEU0RUxFXEVoRbhFxEXURexF9EYERhBGMEZIRlhGcEaIRqBGrEW+nrxGzEY0CuxENEgsTCRSNFJIUUBVpFW8VdRV7FYcVkxUrAJ4VthW6Fb4VwhXGFcoV3hXiFUYWXxaFFosWSRdPF1QXdBd0GHoYDhnQGXQafBqaGp8asxq9GsMa1xrcGuIa8BogGy0bNRs5G08bxhvYG9ob3BtkMR0cHxwhHCMcJRwnHEUcUxxYHGEcahx8HIUcihyqHMUcxxzJHMsczRzPHNEc0xzzHPUc9xz5HPscAh0EHQYdCB0XHRkdGx0dHR8dIR0jHSUdJx0pHSsdLR0vHTEdMx03HfQDOR0HIjsdAiI9HUUd9ANHHQciSR0CIksdUx30A1UdByJXHQIiWR1hHfQDYx0HImUdAiJnHW8d9ANxHQcicx0CInUdfx2BHYMdhR2HHYkdjx2sHS0GtB3AHSwG0B1AHkweXx5xHoQehh6KHpAelh6YHpwenh6mHqkeqx6xHrMetTC5HhEfJx8rHy0fMh9/H5AfkSChIKcgoSG/IgBBgOgCC9JHIIgghDIzIIEgpzFvMdA0MdAyM9A0QYBBgUGCQYNBiEGKAABDp0WARYFFgkWISYBJgUmCSYgAAE6DT4BPgU+CT4NPiAAAAABVgFWBVYJViFmBAAAAAGGAYYFhgmGDYYhhigAAY6dlgGWBZYJliGmAaYFpgmmIAABug2+Ab4Fvgm+Db4gAAAAAdYB1gXWCdYh5gQAAeYhBhEGGQahDgUOCQ4dDjESMRYRFhkWHRahFjEeCR4ZHh0enSIJJg0mESYZJqEmHSUppakqCS6dMgUynTIxMAABrIGtOgU6nToy8Am5PhE+GT4tSgVKnUoxTgVOCU6dTjFSnVIxVg1WEVYZVilWLVahXglmCWYhagVqHWoxPm1WbRAB9AUQAfgFkAH4BTEpMamxqTkpOam5qQQCMSQCMTwCMVQCM3ACE3ACB3ACM3ACAxACEJgKExgCER4xLjE+o6gGE6wGEtwGMkgKMagCMRFpEemR6R4FOAIDFAIHGAIHYAIFBj0GRRY9FkUmPSZFPj0+RUo9SkVWPVZFTplSmSIxBAIdFAKfWAITVAIRPAIcuAoRZAIRoAGYCagByAHkCewKBAncAeQAghiCHIIogqCCDIItjAmwAcwB4AJUCgIEAk4iBIMUggagAgZEDgZUDgZcDgZkDgQAAAJ8DgQAAAKUDgakDgcoDgQEDmAekB7AAtAC2ALgAygABA7gHxAe+AMQAyAClAw0TAAED0QDRB8YDwAO6A8EDwgMAAJgDtQMVBIAVBIgAAAATBIEGBIgaBIEYBIAjBIYYBIY4BIY1BIA1BIgAAAAzBIFWBIg6BIE4BIBDBIZ0BI8WBIYQBIYQBIgVBIbYBIgWBIgXBIgYBIQYBIgeBIjoBIgtBIgjBIQjBIgjBIsnBIgrBIhlBYIFJwYALAAtIS0ALiMtJwYATSFNoE0jTdUGVAYAAAAAwQZUBtIGVAYoCTwJMAk8CTMJPAkVCQAnAScCJwcnDCcNJxYnGie+CQkACRmhCbwJrwm8CTIKPAo4CjwKFgoAJgEmBiYrCjwKRwtWCz4LCQAJGSELPAuSC9cLvgsIAAkACBlGDFYMvwzVDMYM1QzCDAQACBM+DQgACQAIGdkNyg3KDQ8FEgAPFU0OMg7NDrIOmQ4SABIIQg+3D0wPtw9RD7cPVg+3D1sPtw9AD7UPcQ9yD3EPAANBD7IPgQ+zD4APsw+BD3EPgA+SD7cPnA+3D6EPtw+mD7cPqw+3D5APtQ8lEC4QBRs1GwAAAAAHGzUbAAAAAAkbNRsAAAAACxs1GwAAAAANGzUbERs1GzobNRsAAAAAPBs1Gz4bNRtCGzUbQQDGAEIAAABEAEUAjgFHAE8AIgJQAFIAVABVAFcAYQBQAlECAh1iAGQAZQBZAlsCXAJnAAAAawBtAEsBbwBUAhYdFx1wAHQAdQAdHW8CdgAlHbIDswO0A8YDxwNpAHIAdQB2ALIDswPBA8YDxwNSAmMAVQLwAFwCZgBfAmECZQJoAmkCagJ7HZ0CbQKFHZ8CcQJwAnICcwJ0AnUCeAKCAoMCqwGJAooCHB2LAowCegCQApECkgK4A0EApUIAh0IAo0IAsccAgUQAh0QAo0QAsUQAp0QArRIBgBIBgUUArUUAsCgChkYAh0cAhEgAh0gAo0gAiEgAp0gArkkAsM8AgUsAgUsAo0sAsUwAozYehEyxTK1NgU2HTaNOh06jTrFOrdUAgdUAiEwBgEwBgVAAgVAAh1IAh1IAo1oehFIAsVMAh1MAo1oBh2ABh2Ieh1QAh1QAo1QAsVQArVUApFUAsFUArWgBgWoBiFaDVqNXgFeBV4hXh1ejWIdYiFmHWoJao1qxaLF0iHeKeYphAL4CfwGHQQCjQQCJwgCBwgCAwgCJwgCDoB6CAgGBAgGAAgGJAgGDoB6GRQCjRQCJRQCDygCBygCAygCJygCDuB6CSQCJSQCjTwCjTwCJ1ACB1ACA1ACJ1ACDzB6CoAGBoAGAoAGJoAGDoAGjVQCjVQCJrwGBrwGArwGJrwGDrwGjWQCAWQCjWQCJWQCDsQMTAwAfgAAfgQAfwpEDEwMIH4AIH4EIH8K1AxMDEB+AEB+BlQMTAxgfgBgfgbcDk7cDlCAfgCEfgCAfgSEfgSAfwiEfwpcDk5cDlCgfgCkfgCgfgSkfgSgfwikfwrkDk7kDlDAfgDEfgDAfgTEfgTAfwjEfwpkDk5kDlDgfgDkfgDgfgTkfgTgfwjkfwr8Dk78DlEAfgEAfgZ8DEwNIH4BIH4HFAxMDUB+AUB+BUB/CpQOUAAAAWR+AAAAAWR+BAAAAWR/CyQOTyQOUYB+AYR+AYB+BYR+BYB/CYR/CqQOTqQOUaB+AaR+AaB+BaR+BaB/CaR/CsQOAtQOAtwOAuQOAvwOAxQOAyQOAAB9FAyAfRQNgH0UDsQOGsQOEcB/FsQPFrAPFAAAAsQPCth/FkQOGkQOEkQOAkQPFIJMgkyDCqADCdB/FtwPFrgPFAAAAtwPCxh/FlQOAlwOAlwPFvx+Avx+Bvx/CuQOGuQOEygOAAAO5QspCmQaZBJkA/h+A/h+B/h/CxQOGxQOEywOAAAPBE8EUxULLQqUGpQSlAKEDlKgAgIUDYAB8H8XJA8XOA8UAAADJA8L2H8WfA4CpA4CpA8UglAIgICAgICAgICAgILMuLi4uLjIgMiAyIAAAADUgNSA1IAAAACEhAAAghT8/PyEhPzIgAAAAADBpAAA0NTY3ODkrPSgpbjAAKwASIj0AKAApAAAAYQBlAG8AeABZAmhrbG1ucHN0UnNhL2NhL3OwAENjL29jL3WwAEZIAB8AAAAg3wEBBCROb1BRUlJSU01URUxUTUsAxQBCQwBlRUYATW/QBUZBWMADswOTA6ADESJEZGVpajHQNzHQOTHQMTAx0DMy0DMx0DUy0DUz0DU00DUx0DY10DYx0Dgz0Dg10Dg30Dgx0ElJSUlJSVZWSVZJSVZJSUlJWFhJWElJTENETWlpaWlpaWl2dml2aWl2aWlpaXh4aXhpaWxjZG0w0DOQIbiSIbiUIbjQIbjUIbjSIbgDIrgIIrgLIrgjIrgAAAAlIrgrIisiKyIAAAAuIi4iLiIAAAA8IrhDIrhFIrgAAABIIrg9ALgAAABhIrhNIrg8ALg+ALhkIrhlIrhyIrh2Irh6IriCIriGIriiIrioIripIrirIrh8IriRIriyIjgDCDAxADEAMAAyMCgAMQApACgAMQAwACkAKDIwKTEALgAxADAALgAyMC4oAGEAKQBBAGEAKyIAAAAAOjo9PT09PT3dKrhqVgBOACg2P1mFjKC6P1EAJixDV2yhtsGbUgBeen+dpsHO57ZTyFPjU9dWH1frWAJZClkVWSdZc1lQW4Bb+FsPXCJcOFxuXHFc213lXfFd/l1yXnpef170Xv5eC18TX1BfYV9zX8NfCGI2YktiL2U0ZYdll2WkZbll4GXlZfBmCGcoZyBrYmt5a7Nry2vUa9trD2wUbDRsa3AqcjZyO3I/ckdyWXJbcqxyhHOJc9x05nQYdR91KHUwdYt1knV2dn12rna/du5223fid/N3Onm4eb55dHrLevl6c3z4fDZ/UX+Kf71/AYAMgBKAM4B/gImA44EABxAZKTg8i4+VTYZrhkCITIhjiH6Ji4nSiQCKN4xGjFWMeIydjGSNcI2zjauOyo6bj7CPtY+RkEmRxpHMkdGRd5WAlRyWtpa5luiWUZdel2KXaZfLl+2X85cBmKiY25jfmJaZmZmsmaia2JrfmiWbL5symzybWpvlnHWef56lngAWHigsVFhpbnuWpa3o9/sSMAAAQVNEU0VTSzCZMAAAAABNMJkwAAAAAE8wmTAAAAAAUTCZMAAAAABTMJkwAAAAAFUwmTAAAAAAVzCZMAAAAABZMJkwAAAAAFswmTAAAAAAXTCZMAAAAABfMJkwAAAAAGEwmTBkMJkwAAAAAGYwmTAAAAAAaDCZMG8wmTByMJkwdTCZMHgwmTB7MJkwRjCZMCAAmTCdMJkwiDCKMKswmTAAAAAArTCZMAAAAACvMJkwAAAAALEwmTAAAAAAszCZMAAAAAC1MJkwAAAAALcwmTAAAAAAuTCZMAAAAAC7MJkwAAAAAL0wmTAAAAAAvzCZMAAAAADBMJkwxDCZMAAAAADGMJkwAAAAAMgwmTDPMJkw0jCZMNUwmTDYMJkw2zCZMKYwmTDvMJkw/TCZMLMwyDAAEQABqgKsrQMEBbCxsrO0tRoGBwghCRFhERQRTAABs7S4ur/DxQjJywkKDA4PExUXGBkaGx4iLDM43d5DREVwcXR9foCKjQBOjE4JTttWCk4tTgtOMnVZThlOAU4pWTBXuk4oACkAABECEQMRBREGEQcRCRELEQwRDhEPERARERESESgAABFhESkAKAACEWERKQAoAAURYREpACgACRFhESkAKAALEWERKQAoAA4RYREpACgADBFuESkAKAALEWkRDBFlEasRKQAoAAsRaRESEW4RKQAoACkAAE6MTglO21aUTm1RA05rUV1OQVMIZ2twNGwoZ9GRH1flZSpoCWc+eQ1UeXKhjF15tFLjTnxUZlvjdgFPx4xUU215EU/qgfOBT1V8Xodlj3tQVEUyADEAMwAwAAARAAIDBQYHCQsMDg8QERIAEQBhAmEDYQVhBmEHYQlhC2EMYQ4RYREAEQ5htwBpCxEBYwBpCxFuEQBOjE4JTttWlE5tUQNOa1FdTkFTCGdrcDRsKGfRkR9X5WUqaAlnPnkNVHlyoYxdebRS2Hk3dXNZaZAqUXBT6GwFmBFPmVFjawpOLU4LTuZd81M7U5dbZlvjdgFPx4xUUxxZMwA2ADQAMAA1MDEACGcxADAACGdIZ2VyZ2VWTFREojAAAgQGCAkLDQ8RExUXGRsdHyIkJigpKissLTAzNjk8PT4/QEJERkdISUpLTU5PUOROjFShMAEwWycBSjQAAVI5AaIwAFpJpDAAJ08MpDAATx0CBU+oMAARB1QhqDAAVANUpDAGTxUGWDwHAEarMAA+GB0AQj9RrDAAQUcARzKuMKwwrjAAHU6tMAA4PU8BPhNPrTDtMK0wAEADPDOtMABANE8bPq0wAEBCFhuwMAA5MKQwDEU8JE8LRxgASa8wAD5NHrEwAEsIAjoZAksspDARAAtHtTAAPgxHK7AwBzpDALkwAjoIAjoPB0MAtzAQABI0ETwTF6QwKh8kKwAguzAWQQA4DcQwDTgA0DAALBwbojAyABcmSa8wJQA8szAhACA4oTA0AEgiKKMwMgBZJacwLxwQAETVMAAUHq8wKQAQTTzaML0wuDAiExogMwwiOwEiRAAhRAekMDkATyTIMBQjANsw8zDJMBQqABIzIhIzKqQwOgALSaQwOgBHOh8rOkcLtzAnPAAwPK8wMAA+RN8w6jDQMA8aACwb4TCsMKwwNQAcRzVQHD+iMEJaJ0JaSUQAUcMwJwAFKOow6TDUMBcAKNYwFSYAFeww4DCyMDpBFgBBwzAsAAUwALlwMQAwALlwMgAwALlwaFBhZGFBVWJhcm9WcGNkbWQAbQCyAEkAVQBzXhBiLWaMVCdZY2sOZrtsKmgPXxpPPnlwAEFuAEG8A0FtAEFrAEFLAEJNAEJHAEJjYWxrY2FscABGbgBGvANGvANnbQBnawBnSAB6a0h6TUh6R0h6VEh6vAMTIW0AEyFkABMhawATIWYAbW4AbbwDbW0AbWMAbWsAbWMACgpPAApPbQCyAGMACApPCgpQAApQbQCzAGsAbQCzAG0AFSJzAG0AFSJzALIAUGFrUGFNUGFHUGFyYWRyYWTRc3IAYQBkABUicwCyAHAAc24Ac7wDc20Ac3AAVm4AVrwDVm0AVmsAVk0AVnAAV24AV7wDV20AV2sAV00AV2sAqQNNAKkDYS5tLkJxY2NjZEPRa2dDby5kQkd5aGFIUGluS0tLTWt0bG1sbmxvZ2x4bWJtaWxtb2xQSHAubS5QUE1QUnNyU3ZXYlbRbUHRbTEA5WUxADAA5WUyADAA5WUzADAA5WVnYWxKBEwEJgFTASenN6trAlKrSIz0ZsqOyIzRbjJO5VOcn5yfUVnRkYdVSFn2YWl2hX8/hrqH+IiPkAJqG23ZcN5zPYRqkfGZgk51UwRrG3Ithh6eUF3rb82FZInJYtiBH4jKXhdnam38cs6Qhk+3Ud5SxGTTahBy53YBgAaGXIbvjTKXb5v6nYx4f3mgfcmDBJN/ntaK31gEX2B8foBicsp4woz3lthYYlwTatptD28vfTd+S5bSUouA3FHMURx6vn3xg3WWgIvPYgJq/oo5TudbEmCHc3B1F1P7eL9PqV8NTsxseGUifcNTXlgBd0mEqoq6a7CPiGz+YuWCoGNlda5OaVHJUYFo53xvgtKKz5H1UkJUc1nsXsVl/m8qea2VapqXns6em1LGZndrYo90XpBhAGKaZCNvSXGJdMp59H1vgCaP7oQjkEqTF1KjUr1UyHDCiKqKyV71X3tjrms+fHVz5E75Vudbul0cYLJzaXSaf0aANJL2lkiXGJiLT655tJG4luFghk7aUO5bP1yZZQJqznFCdvyEfJCNn4hmLpaJUntn82dBbZxuCXRZdWt4EH1emG1RLmJ4litQGV3qbSqPi19EYRdoh3OGlilSD1RlXBNmTmeoaOVsBnTidXl/z4jhiMyR4pY/U7puHVTQcZh0+oWjllecn56XZ8tt6IHLeiB7knzAcplwWIvATjaDOlIHUqZe02LWfIVbHm20ZjuPTIhNlouJ015AUcBVAAAAAFpYAAB0ZgAAAADeUSpzynY8eV55ZXmPeVaXvny9fwAAEoYAAPiKAAAAADiQ/ZDvmPyYKJm0nd6Qt5auT+dQTVHJUuRSUVOdVQZWaFZAWKhYZFxuXJRgaGGOYfJhT2XiZZFmhWh3bRpuIm9ucStyInSReD55SXlIeVB5VnldeY15jnlAeoF6wHv0fQl+QX5yfwWA7YF5gnmCV4QQiZaJAYs5i9OMCI22jziQ45b/lzuYdWDuQhiCAiZOtVFoUYBPRVGAUcdS+lKdVVVVmVXiVVpYs1hEWVRZYlooW9Je2V5pX61f2GBOYQhhjmFgYfJhNGLEYxxkUmRWZXRmF2cbZ1ZneWu6a0Ft227LbiJvHnBucad3NXKvcipzcXQGdTt1HXYfdsp223b0dkp3QHfMeLF6wHt7fFt99H0+fwWAUoPvg3mHQYmGiZaJv4r4isuKAYv+iu2KOYuKiwiNOI9ykJmRdpJ8luOWVpfbl/+XC5g7mBKbnJ9KKEQo1TOdOxhAOUBJUtBc035Dn46fKqACZmZmaWZsZmZpZmZsfwF0cwB0ZQUPEQ8ADwYZEQ8I2QW0BQAAAADyBbcF0AUSAAMECwwNGBrpBcEF6QXCBUn7wQVJ+8IF0AW3BdAFuAXQBbwF2AW8Bd4FvAXgBbwF4wW8BbkFLQMuAy8DMAMxAxwAGAYiBisG0AXcBXEGAAAKCgoKDQ0NDQ8PDw8JCQkJDg4ODggICAgzMzMzNTU1NRMTExMSEhISFRUVFRYWFhYcHBsbHR0XFycnICA4ODg4Pj4+PkJCQkJAQEBASUlKSkpKT09QUFBQTU1NTWFhYmJJBmRkZGR+fn19f38ugoJ8fICAh4eHhwAAJgYAAQABAK8ArwAiACIAoQChAKAAoACiAKIAqgCqAKoAIwAjACPMBgAAAAAmBgAGAAcAHwAjACQCBgIHAggCHwIjAiQEBgQHBAgEHwQjBCQFBgUfBSMFJAYHBh8HBgcfCAYIBwgfDQYNBw0IDR8PBw8fEAYQBxAIEB8RBxEfEh8TBhMfFAYUHxsGGwcbCBsfGyMbJBwHHB8cIxwkHQEdBh0HHQgdHh0fHSMdJB4GHgceCB4fHiMeJB8GHwcfCB8fHyMfJCAGIAcgCCAfICMgJCEGIR8hIyEkJAYkByQIJB8kIyQkCkoLSiNKIABMBlEGUQb/AB8mBgALAAwAHwAgACMAJAILAgwCHwIgAiMCJAQLBAwEHyYGBCAEIwQkBQsFDAUfBSAFIwUkGyMbJBwjHCQdAR0eHR8dIx0kHh8eIx4kHwEfHyALIAwgHyAgICMgJCNKJAskDCQfJCAkIyQkAAYABwAIAB8AIQIGAgcCCAIfAiEEBgQHBAgEHwQhBR8GBwYfBwYHHwgGCB8NBg0HDQgNHw8HDwgPHxAGEAcQCBAfEQcSHxMGEx8UBhQfGwYbBxsIGx8cBxwfHQYdBx0IHR4dHx4GHgceCB4fHiEfBh8HHwgfHyAGIAcgCCAfICEhBiEfIUokBiQHJAgkHyQhAB8AIQIfAiEEHwQhBR8FIQ0fDSEOHw4hHR4dHx4fIB8gISQfJCFABk4GUQYnBhAiECMSIhIjEyITIwwiDCMNIg0jBiIGIwUiBSMHIgcjDiIOIw8iDyMNBQ0GDQcNHg0KDAoOCg8KECIQIxIiEiMTIhMjDCIMIw0iDSMGIgYjBSIFIwciByMOIg4jDyIPIw0FDQYNBw0eDQoMCg4KDwoNBQ0GDQcNHgwgDSAQHgwFDAYMBw0FDQYNBxAeER4AJAAkKgYAAhsAAwIAAwIAAxsABBsAGwIAGwMAGwQCGwMCGwMDGyADGx8JAwIJAgMJAh8JGwMJGwMJGwIJGxsJGxsLAwMLAwMLGxsKAxsKAxsKAiAKGwQKGwQKGxsKGxsMAx8MBBsMBBsNGwMNGwMNGxsNGyAPAhsPGxsPGxsPGx8QGxsQGyAQGx8XBBsXBBsYGwMYGxsaAxsaAyAaAx8aAgIaAgIaBBsaBBsaGwMaGwMbAwIbAxsbAyAbAgMbAhsbBAIbBBsoBh0EBh8dBB8dHR4FHR4FIR4EHR4EHR4EIR4dIh4dISIdHSIdHQAGIgIEIgIEIQIGIgIGIQIdIgIdIQQdIgQFIQQdIQsGIQ0FIgwFIg4FIhwEIhwdIiIFIiIEIiIdIh0dIhodIh4FIhodBRwFHREdIhsdIh4EBR0GIhwEHRsdHRwEHR4EBQQFIgUEIh0EIhkdIgAFIhsdHREEHQ0dHQsGIh4EIjUGAA+dDQ+dJwYAHR0gABwBCh4GHggOHRIeCgwhHRIdIyAhDB0eNQYADxQnBg4dIv8AHR0g/xIdIyD/IQwdHicGBR3/BR0AHSAnBgqlAB0sAAEwAjA6ADsAIQA/ABYwFzAmIBMgEgEAX18oKXt9CDAMDQgJAgMAAQQFBgdbAF0APiA+ID4gPiBfAF8AXwAsAAEwLgAAADsAOgA/ACEAFCAoACkAewB9ABQwFTAjJiorLTw+PQBcJCVAQAb/CwAL/wwgAE0GQAb/DgAO/w8AD/8QABD/EQAR/xIAEiEGAAEBAgIDAwQEBQUFBQYGBwcHBwgICQkJCQoKCgoLCwsLDAwMDA0NDQ0ODg8PEBARERISEhITExMTFBQUFBUVFRUWFhYWFxcXFxgYGBgZGRkZICAgICEhISEiIiIiIyMjIyQkJCQlJSUlJiYmJicnKCgpKSkpIgYiACIAIgEiASIDIgMiBSIFIQCFKQEwAQsMAPrxoKKkpqji5ObC+6GjpaepqqyusLK0tri6vL7Aw8XHycrLzM3O0dTX2t3e3+Dh4+Xn6Onq6+zu8piZMTFPMVUxWzFhMaIAowCsAK8ApgClAKkgAAACJZAhkSGSIZMhoCXLJZkQuhAAAAAAmxC6EAUFpRC6EAUxEScRMhEnEVVHEz4TRxNXE1W5FLoUuRSwFAAAAAC5FL0UVVC4Fa8VuRWvFVU1GTAZBVfRZdFY0WXRX9Fu0V/Rb9Ff0XDRX9Fx0V/RctFVVVUFudFl0brRZdG70W7RvNFu0bvRb9G80W/RVVVVQQBhAEEAYQBpAEEAYQBBAENEAABHAABKSwAATk9QUQBTVFVWV1hZWmFiY2QAZmgAcABBAGEAQUIAREVGR0oAUwBhAEFCAERFRkcASUpLTE0AT1MAYQBBAGEAQQBhAEEAYQBBAGEAQQBhAEEAYQAxATcCkQOjA7ED0QMkAB8EIAWRA6MDsQPRAyQAHwQgBZEDowOxA9EDJAAfBCAFkQOjA7ED0QMkAB8EIAWRA6MDsQPRAyQAHwQgBQsMMAAwADAAMAAwACcGAAEFCCoGHggDDSAZGhscCQ8XCxgHCgABBAYMDhBEkHdFKAYsBgAARwYzBhcQERITAAYOAg80BioGKwYuBgAANgYAADoGLQYAAEoGAABEBgAARgYzBjkGAAA1BkIGAAA0BgAAAAAuBgAANgYAADoGAAC6BgAAbwYAACgGLAYAAEcGAAAAAC0GNwZKBkMGAABFBkYGMwY5BkEGNQZCBgAANAYqBisGLgYAADYGOAY6Bm4GAAChBicGAAEFCCAhCwYQIyoGGhscCQ8XCxgHCgABBAYMDhAoBiwGLwYAAEgGMgYtBjcGSgYqBhobHAkPFwsYBwoAAQQGDA4QMC4wACwAKABBACkAFDBTABUwQ1JDRFdaQQBIVk1WU0RTU1BQVldDTUNNRE1SREpLMDAAaGhLYldbzFPHMIxOGlnjiSlZpE4gZiFxmWVNUoxfjVGwZR1SQn0fdamM8Fg5VBRvlWJVYwBOCU5KkOZdLU7zUwdjcI1TYoF5enoIVIBuCWcIZzN1clK2VU2RFDAVMCxnCU6MTolbuXBTYtd23VJXZZdf71MwADhOBQAJIgFgT65Pu08CUHpQmVDnUM9QnjQ6Bk1RVFFkUXdRHAW5NGdRjVFLBZdRpFHMTqxRtVHfkfVRA1LfNDtSRlJyUndSFTUCACCAgAAIAADHUgACHTM+P1CCipOstri4uCwKcHDKU99TYwvrU/FTBlSeVDhUSFRoVKJU9lQQVVNVY1WEVYRVmVWrVbNVwlUWVwZWF1dRVnRWB1LuWM5X9FcNWItXMlgxWKxY5BTyWPdYBlkaWSJZYlmoFuoW7FkbWida2FlmWu42/DYIWz5bPlvIGcNb2FvnW/NbGBv/WwZcU18iXIE3YFxuXMBcjVzkHUNd5h1uXWtdfF3hXeJdLzj9XShePV5pXmI4gyF8OLBes162XspekqP+XjEjMSMBgiJfIl/HOLgy2mFiX2tf4ziaX81f11/5X4FgOjkcOZRg1CbHYAICAAAAAAAAAAgACgAAAggAgAgAAAiAKIACAAACSGEABAYEMkZqXGeWqq7I011iAFR38wwrPWP8Ymhjg2PkY/ErImTFY6ljLjppZH5knWR3ZGw6T2VsZQow42X4ZklmGTuRZgg75DqSUZVRAGecZq2A2UMXZxtnIWdeZ1NnwzNJO/pnhWdSaIVobTSOaB9oFGmdO0Jpo2nqaahqozbbahg8IWunOFRrTjxya59rumu7a406Cx36Ok5svDy/bM1sZ2wWbT5td21BbWlteG2FbR49NG0vbm5uMz3Lbsdu0T75bW5vXj+OP8ZvOXAecBtwlj1KcH1wd3CtcCUFRXFjQpxxq0MocjVyUHIIRoBylXI1RwIgAAAgAAAAAAiAAAACAoCKAAAgAAgKAICIgCAUSHpzi3OsPqVzuD64Pkd0XHRxdIV0ynQbPyR1Nkw+dZJMcHWfIRB2oU+4T0RQ/D8IQPR281DyUBlRM1Eedx93H3dKdzlAi3dGQJZAHVROeIx4zHjjQCZWVnmaVsVWj3nreS9BQHpKek96fFmnWqda7noCQqtbxnvJeydCgFzSfKBC6HzjfAB9hl9jfQFDx30CfkV+NEMoYkdiWUPZYnp/PmOVf/p/BYDaZCNlYICoZXCAXzPVQ7KAA4ELRD6BtVqnZ7VnkzOcMwGCBIKej2tEkYKLgp2Cs1KxgrOCvYLmgjxr5YIdg2ODrYMjg72D54NXhFODyoPMg9yDNmxrbQIAACAiKqAKACCAKACoICAAAoAiAooIAKoAAAACAAAo1WwrRfGE84QWhcpzZIUsb11FYUWxb9Jwa0VQhlyGZ4ZphqmGiIYOh+KGeYcoh2uHhofXReGHAYj5RWCIY4hndteI3og1RvqIuzSueGZ5vkbHRqCK7YqKi1WMqHyrjMGMG413jS9/BAjLjbyN8I3eCNSOOI/She2FlJDxkBGRLocbkTiS15LYknyS+ZMVlPqLi5WVSbeVd43mScOWsl0jl0WRGpJuSnZK4JcKlLJKlpQLmAuYKZi2leKYM0spmaeZwpn+mc5LMJsSm0Cc/ZzOTO1MZ53OoPhMBaEOopGiu55WTfme/p4Fnw+fFp87nwCmAoigAAAAAIAAKAAIoICggACAgAAKiIAAgAAgKgCAAEQgFSIAQeCvAwtRTQMAlwUgxgUA5wYARQcA4ggAUwkAzQsgOA4Acw8gXRMgYBogqhsA9BwA/h0gfy0g8KYAsqoA/gEBqw4BcxEhcBMBuBYBmhoBn7wBIuABS+kBAEHAsAML0wayz9QA6APcAOgA2ATcAcoD3AHKCtwEAQPcxwDwwALcwgHcgMID3MAA6AHcwEHpAOpB6QDqAOnMsOLEsNgA3MMA3MIA3gDcxQXcwQDcwQDeAOTASQpDE4AAF4BBGIDAANyAABKwF8dCHq9HG8EB3MQA3MEA3I8AI7A0xoHDANzAgcGAANzBANyiACSdwADcwQDcwQLcwAHcwADcwgDcwADcwADcwADcwbBvxgDcwIgA3JfDgMiAwoDEqgLcsEYA3M2AANzBANzBANzCAtxCG8IA3MEB3MSwCwAHjwAJgsAA3MGwNgAHjwAJr8CwDAAHjwAJsD0AB48ACbA9AAePAAmwTgAJsE4ACYYAVABbsDQAB48ACbA8AQmPAAmwSwAJsDwBZwAJjANrsDsBdgAJjAN6sBsB3JoA3IAA3IAA2LAGQYGAAISEA4KBAIKAwQAJgMGwDQDcsD8AB4ABCbAhANyynsKzgwAJngAJsGwACYnAsJoA5LBeAN7AANywqsAA3LAWAAmTx4EA3K/EBdzBANyAAdywQgAHjgAJpcAA3MawBQEJsAkAB4oBCbASAAewZ8JBAATcwQPcwEEABQGDANyFwILBsJXBANzGANzBAOoA1gDcAMrkAOgB5ADcgMAA6QDcwADcsp/BAQHDAgHBg8CCAQHAANzAAQED3MC4A83CsFwACbAv37H5ANoA5ADoAN4B4LA4AQi4baPAg8mfwbAfwbDjAAmkAAmwZgAJmtGwCALcpAAJsC4AB4sACbC+wIDBANyBwYTBgMCwAwAJsMUACbhG/wAastDGBtzBs5wA3LCxANywZMS2YQDcgMCnwAABANyDAAmwdMAA3LIMw7FSwbBoAdzCANzAA9ywxAAJsAcACbAIAAkAB7AUwq8BCbANAAewGwAJiAAHsDkACQAHsIEABwAJsB8BB48ACZfGgsSwnAAJggAHlsCwMgAJAAewygAJAAewTQAJsEUACQAHsEIACbDcAAkAB7DRAQmDAAewawAJsCIACZEACbAgAAmxdAAJsNEAB4ABCbAgAAm4RScEAbAKxrSIAQa4RHsAAbgMlQHYAgGCAOIE2IcH3IHEAdydw7BjwrgFisaA0IHGgMGAxLDUxrGEw7WvBtywPMUABwBBoLcDC+IOAUrASQJKgAKBAoICgwLAAsICAAqEAkIkhQLAB4AJgglAJIAixAKCIoQihiLGAsgCygLMAocCiiLOAowikCKSIo4iiAKJAooCgiQAAwIDBAOLAoAkCAOECYYJWCQCCgYDmCKaIp4iAAkKA6AiDAMOA0AIEAMSA6IipiLACaQiqCKqIowCjQKOAkADQgNEA4ADjwKOJMIHiAmKCZAkRgOsIgAEsCJCCLIiAgS0IkAERAS2IkIEwiLAIsQixiLIIkAJwASRAsoixATMIsIE0CLOIpICkwKUApUCQAVCBQgKlgKUJEQFxAeMCY4JwAaSJEQICCMKI4AFDCOEBZAJkgkOI4IFEiOGBYgFFCOMBRYjmAmKBR4jkAUgI5oJjgUkIyIjmQKaApsCwAXCBcQFnAKsJMYFyAXGB5QJlgkAB6okJiPKBSojKCNAI0IjRCNGI8wFSiNII0wjTiNQI7gknQLOBb4kDApSIwAGvCS6JEAGVCNCBkQGViNYI6ACoQKiAqMCwQLDAgEKpAJDJKUCwQeBCYMJQSSBIsUCgyKFIocixwLJAssCzQKnAosizwKNIpEikyKPIqgCqQKqAoMkAQMDAwUDqwKBJAkDhQmHCVkkAwoHA5kimyKfIgEJCwOhIg0DDwNBCBEDEwOjIqciwQmlIqkiqyKAI6wCrQKuAkEDQwNFA68CjyTDB4kJiwmRJEcDrSIBBIQIsSJDCLMiAwS1IkEERQS3IkMEwyLBIsUixyLJIkEJwQSxAssixQTNIsME0SLPIrICswK0ArUCQQVDBQkKtgKVJEUFxQeNCY8JwQaTJEUICSMLI4EFDSOFBZEJkwkPI4MFEyOHBYkFFSONBRcjmQmLBR8jgSORBSEjmwmPBSUjIyO5AroCuwLBBcMFxQW8Aq0kxwXJBccHlQmXCQEHqyQnI8sFKyMpI0EjQyNFI0cjzQVLI0kjgiNNI08jUSO5JL0CzwW/JA0KUyO/Ar0kgyO7JEEGVSNDBkUGVyNZIwExgAwALkYkRCRKJEgkAAhCCUQJBAiIIoYkhCSKJIgkriKYJJYknCSaJAAjBgoCIwQKRgnOB8oHyAfMB0ckRSRLJEkkAQhDCUUJBQiJIockhSSLJIkkryKZJJcknSSbJAEjBwoDIwUKRwnPB8sHyQfNB1AkTiRUJFIkUSRPJFUkUySUIpYilSKXIgQjBiMFIwcjGCMZIxojGyMsIy0jLiMvIwAkoiSgJKYkpCSoJKMkoSSnJKUkqSSwJK4ktCSyJLYksSSvJLUksyS3JIIIgAiBCAIIAwicIp0iCgoLCoMIQAuKLIEMiSyILEAlQSUALQcuAA1AJkEmgC4BDcgmySYAL4QvAg2DL4IvQA3YJtkmhjEEDUAnQScAMYYwBg2FMIQwQQ1AKAAyBw1PKFAogDKELAMuVyhCDYEsgCzAJMEkhiyDLMAoQw3AJcElQClEDcAmwSYFLgIuwClFDQUvBC+ADdAm0SaAL0Aqgg3gJuEmgDCBMMAqgw0EMAMwgQ3AJ8EngjBAK4QNRyhIKIQxgTEGLwgNgS8FMEYNgzCCMQAOAQ5AD4ARghEDDwAPwBEBD0ARAhIEEoEPQBLAD0ISgA9EEoQSgg+GEogSihLAEoISgRGDEUMQQBDBEUEQQREDEgUSwRBBEgAQQxLAEEUShRLCEIcSiRKLEsESgxKAEAARAREAEgESgBKBEkATQRNDE0ITRBPCEwAUwBNAFIAUwBRAFUEVQBcAF0EXwBcAGAIYARhAGIAYABnAGMEYARlAGUIZQRmAGcAZwhnBGYAcwBzAHYAfACACIAQgBiAIIEAggCCCIMAgwSAAIbgiuSIQIxEjHCMdI0wkViRNJFckjCSNJJ4knyQAJQIlBCXAKwElAyUFJcErwivDK8QrxSvGK8crgCWCJYQlyCuBJYMlhSXJK8oryyvMK80rzivPKwAmAiYBJgMmgCaCJoEmgybCJsQmxiYALMMmxSbHJgEsAiwDLAQsBSwGLAcsyibMJs4mCCzLJs0mzyYJLAosCywMLA0sDiwPLNIm1CbWJtMm1SbXJtom3CbeJtsm3SbfJgAnAicBJwMngCeCJ4EngycAKAIoBCgBKAMoBShCKEQoRihJKEsoTShALEooTChOKEEsQixDLEQsRSxGLEcsUShTKFUoSCxSKFQoVihJLEosSyxMLE0sTixPLIIsAS6AMYcsAS8CLwMvBi6FMQAwATACMEBGQUaARsBGwkbBRgBHQEeAR8BHwkcASUBJgEmCSQBKwkkDSgRKQEpBSoBKgUrASsFKwEvBSwBLAUtAS0FLwkvDS4BLgUuCS4NLAEwBTAJMA0wAVkBUQlREVEZUSFRKVExUTlRQVFJUVFRWVIBUglSEVMBUwVQAVQFVQFVBVYBVgVXAVcFVgFbAWABXAlcEVwZXCFcKVwxXDlcQVxJXFFcWV0BXQldEV4BXgVfAV8FXAFgBWEBYQViAWIFYAFkBWQJZA1lAWYCOgo7AjgCPAY9Aj0GPgY+Aj4OPwI/BjwCQAEGQxgMLliD6GBdWDVYSExYMFhE26QI2TDbhEhIWEw4QDuISEgwTDPoZFxZtDxYODwUUDBsPDg8MKw4CNg4LBRVLFuEPDMHiEAziAP8wAv8IAv8nvyIhAl9fISJhAiECQUIhAiECn38CX18hAl8/AgU/ImUBAwIBAwIBAwL/CAL/CgIBAwJfIQL/MqIhAiEiX0EC/wDiPAXiE+QKbuQE7gaEzgQOBO4J5mh/BA4/IARCFgFgLgEWQQABACEC4QkA4QHiGz8CQUL/EGI/DF8/AuEr4ij/Gg+GKP8v/wYC/1gA4R4gBLbiIRYRIC8NAOYlEQYWJhYmFgbgAOUTYGU24AO7TDYNNi/mAxYbADblGATlAuYN6QJ2JQblWxYFxhsPpiQmD2Yl6QJFLwX2BgAbBQblFuYTIOVR5gMF4AbpAuUZ5gEkD1YEIAYt5Q5mBOYBBEYEhiD2BwDlEUYgFgDlA+At5Q0A5QrgA+YHG+YYB+UuBgcGBUfmAGcGJwXG5QImNukCFgTlBwYnAOUAICUg5Q4AxQAFQGUgBgVHZiAnICcGBeAAB2AlAEUmIOkCJS2rDw0FFgYgJgcApWAlIOUOAMUAJQAlACUgBgBHJmAmIEZABsBlAAXA6QImRQYW4AImBwDlAQBFAOUOAMUAJQCFIAYFR4YAJgcAJwYgBeAHJSYg6QIWDcAFpgAGJwDlACAlIOUOAMUAJQCFIAYFBwYHZiAnICcGwCYHYCUARSYg6QIPBavgAgYFAKVARQBlQCUABQAlQCVARUDlBGAnBidARwBHBiAFoAfgBukCS68ND4AGRwblAABFAOUPAOUIQAVGZwBGAGbAJgBFgCUmIOkCwBbLDwUGJxblAABFAOUPAOUCAIUgBgUHBocABicAJybAJ8AFACUmIOkCACXgBSYn5QEARQDlISYFR2YARwBHBgUPYEUHy0UmIOkC6wEPpQAGJwDlCkDlEADlAQAFIMVABmBHRgAGAOcAoOkCICcW4ATlKAYlxmANpQTmABbpAjbgHSUABQCFAOUQAAUA5QIGJeYBBSCFAAQApiDpAiBl4BgFT/YHDxZPJq/pAusCDwYPBg8GEhMSEyflAADlHGDmBgeGFiaF5gMA5hwA7wAGrwAvlm824B3lIydmB6YHJicmBekCtqUnJmVGBUclx0Vm5QUGJyanBgUH6QJHBi/hHgABgAEg4iMWBELlgMEAZSDFAAUAZSDlIQBlIOUZAGUgxQAFAGUg5QcA5TEAZSDlOyBG9gHrDEDlCO8CoOFOIKIgEeWB5A8W5QkX5RISE0DlQ1ZK5QDA5QUAZUbgA+UKRjbgAeUKJuAE5QUARQAm4ATlLCYHxucABifmA1YEVg0FBiDpAqDrAqC2EXZGGwDpAqDlGwTlLcCFJuUaBgWA5T7gAuUXAEZnJkdgJwanRmAPQDbpAuUWIIXgA+UkYOUSoOkCC0DvGuUPJicGIDblLQcGB8YABgcGJ+YAp+YCIAbpAqDpAqDWBLYg5gYIJuA3ZgflJwYHhgcGhwYnxWDpAtbvAuYB7wFAJgflFgdmJyYHRiXpAuUkBgcmRwYHRifgAHblHOcA5gAnJkCW6QJARekC5RakNuIBwOEjIEH2AOAARhbmBQfGZQalBiUHJgWA4iTkN+IFBOIa5B3mMgCG/4AO4gD/WuIA4QCiIKEg4gDhAOIA4QCiIKEg4gAAAQABAAEAP8LhAOIGIOIA4wDiAOMA4gDjAIIAImEDDgJOQgAiYQNOYiAiYQBO4gCBTiBCACJhAy4A9wObsTYUFRI0FRIU9gAYGZsX9gEUFXYwVgwSE/YDDBYQ9gIXmwD7AgsEIKtMEhME6wJMEhMA5AVA7RjgCOYFaAZI5gTgBy8BbwEvAkEiQQIPAS8Mga8BDwEPAQ9hDwJhAmUCLyIhjD9CDwwvAg/rCOobP2oLL2CMjyxvDC8MLwzPDO8XLC8MDwzvF+yAhO8AEhMSE+8MLM8SE+9JDO8W7BHvIKzvPeAR7wPgDes070brDu+ALwzvAQzvLuwA72cM74BwEhMSExITEhMSExITEhPrFu8kjBIT7BcSExITEhMSExIT7AjvgHjsexITEhMSExITEhMSExITEhMSExITEhPsNxITEhPsGBIT7IB67yjsDS+s7x8g7xgA72HhJwDiJwBfISLfQQI/Aj+CJEEC/1oCr39GP4B2CzbiHgACgAIg5TDABBbgBgblD+ABxQDFAMUAxQDFAMUAxQDFAOYYNhQVFBVWFBUWFBX2ARE2ERYUFTYUFRITEhMSExITlgT2AjF2ERYS9gUvFuAl7xIA71HgBO+ATuAS7wRgF1YPBAUKEhMSExITEhMSEy8SExITEhMSExESMw/qAWYnEYQvSgQFFi8A5U4gJi4kBRHlUhZEBYDlIwDlVgAva+8C5RjvHOAE5QjvFwDrAu8W6wAP6wfvGOsC7x/rB++AuOWZOO845cARdUDlDQTlg+9A7y/gAeUgpDblgIQEVuUI6QIl4Az/JgUGSBbmAhYE/xQkJuU+6gImtuAA7g/kAS7/BiL/NgTiAJ//AgQufwV/Iv8NYQKBAv8CIF9BAj/gIj8FJALFBkUGZQblDycmB28GQKsvDQ+g5Sx24AAn5SrnCCbgADbpAqDmCqVWBRYlBukC5RTmADblD+YDJ+ADFuUVQEYH5ScGJ2YnJkf2BQAE6QJgNoUGBOUB6QKFAOUhpicmJybgAUUG5QAGByDpAiB25QgEpU8FBwYH5SoGBUYlJoUmBQYF4BAlBDblAwcmJzYFJAcG4AKlIKUgpeABxQDFAOIjDmTiAQQuYOJI5RsnBicGJxYHBiDpAqDlqxzgBOUPYOUpYPyHeP2YeOWA5iDlYuAewuAEgoAFBuUCDOUFAIUABQAlACUA5WTuCOAJ5YDjExLgCOU4IOUu4CDlBA0PIOYI1hITFqDmCBYxMBITEhMSExITEhMSExITEhM2EhN2UFYAdhESExITEhNWDBFMABYNNmCFAOV/IBsAVg1WEhMWDBYRNukCNkw24RISFhMOEA7iEhIMEwwSExYSEzblAgTlJSTlF0ClIKUgpSBFQC0MDg8tAA9sL+ACWy8g5QQA5RIA5QsAJQDlByDlBuAa5XOAVmDrJUDvAeota+8JK08A7wVAD+An7yUG4HrlFUDlKeAHBusTYOUYa+AB5QwK5QAKgOUehoDlFgAW5Rxg5QAWiuAi4SDiIOVGIOkCoOEcYOIcYOUg4ADlLOADFuCACOWAr+AB5Q7gAuUA4IAQpSAFAOUkACVABSDlDwAW6wDlDy/L5RfgAOsB4CjlCwAlgIvlDqtAFuUSgBbgOOUwYCsl6wgg6yYFRgAmgGZlAEUA5RUgRmAG6wHA9gHA5RUrFuUVS+AY5QAP5RQmYIvW4AHlLkDW5Q4g6wDlC4DrAOUKwHbgBMvgSOVB4C/hK+AF4ivAq+UcZuAA6QLggJ7rFwDlIgAmESAl4EblFesCBeAA5Q7mA2uW4E7lDcvgDOUP4AEHBgflLeYH1mDrDOkC4AdGB+UlR2YnJjYbduADGyDlEcDpAqBG5RyGB+YAAOkCdgUnBeAA5RsGNgXgASYH5ShH5gEnZXZmFgcG6QIFFgVWAOsM4APlCgDlEUdGJwYHJrYG4DnFAAUAZQDlBwDlAhag5ScGR+YAgOkCoCYnAOUAICUg5Q4AxQAlAIUAJgUnBmcgJyBHIAWgB4CFJyDGQIbggAPlLUfmACdGBwZllukCNgAWBkXgFuUoR6YHBmcmByYlFgXgAOkC4IAe5SdHZiBnJgcm9g9lJuAa5ShH5gAnBgcmVgXgA+kCoPYF4AvlIwYHBiemBwYFwOkC4C7lEyBGJ2YHhmDpAitWD+CAOOUkR+YBByYW4FzhGOIY6QLrAeAE5QAgBSDlAAAlAOUQpwAnICYHBgUHBQcGVuAB6QLgPuUAIOUfR2YgJmcGBRYFB+ATBeYC5SCmBwVm9gAG4AAFpidG5SbmBQcmVgWW4BXlMeCAf+UBAOUdB8YApgcGBZbgAukC6wtANuUWIOYOAAfGByYHJuBBxQAlAOUepkAGACYAxgUG4ADpAqClACUA5RiHACYAJwYHBgXA6QLggK7lCyYnNuCALwXgB+sN7wBt7wngBRblgxLgXupnAJbgA+WAPOCKNOWDpwD7AeCPP+WBv+ChMeWBscDlFwDpAmA24FjlFiCGFuAC5SjGlm9kFg/gAukCAMsA5Q2A5QvggijhGOIY6w924F3lQ2AGBecvwGbkBeA4JBYEBuADJ+AG5Zdw4ADlhE7gIuUB4KJv5YCX4ClF4All4ADlgQTgiHzlY4DlBUDlAcDlAiAPJhZ74JLU74Bu4ALvHyDvNCdGT6f7AOYAL8bvFmbvM+AP7zpGD+CAEusM4ATvT+AB6xHgf+ES4hLhEsIA4grhEuISAQAhIAEgISBhAOEAYgACAMIA4gPhEuISIQBhIOEAAMEA4hIhAGEAgQABQMEA4hLhEuIS4RLiEuES4hLhEuIS4RLiEuES4hQg4REM4hEMouERDOIRDKLhEQziEQyi4REM4hEMouERDOIRDKI/IOkq74F45i9v5irvAAbvBgYvluAHhgDmB+CEyMYA5gkgxgAmAIbggE3lJUDGxCDpAmAFD+CA6OUkZukCgA3ghHjlgD0g6wHG4CHhGuIaxgRg6QJgNuCCieszD0sNa+BE6yUP6wfggDplAOUTACUABSAFAOUCAGUABQAFoAVgBQAFAAUARQAlAAUgBQAFAAUABQAFACUABSBlAMUAZQBlAAUA5QIA5QmARQCFAOUJ4Cws4ICG7yRg71zgBO8HIO8HAO8HAO8d4ALrBe+AGeAw7xXgBe8kYO8BwC/gBq/ggBLvgHOO74JQ4ADvBUDvBUDvbOAE71HA7wTgDO8EYO8w4ADvAqDvIOAA7xYgL+BG73EA70oA73/gBO8GII9AT4DP4AHvEcDP4AFP4AXP4CHvgAsA7y/gHekC4IN+5cBmVuAa5Y+t4APlgFYg5ZX64AblnKngi5flgZbghVrlksPgyqwuG+AW+1jgeOaAaODAvYj9wL92IP3Av3Ygc3RhY2tfbGVuIDwgUE9QX1NUQUNLX0xFTl9NQVgAL3RtcC9xdWlja2pzL2xpYnVuaWNvZGUuYwB1bmljb2RlX3Byb3Bfb3BzAHN0YWNrX2xlbiA+PSAyAHN0YWNrX2xlbiA+PSAxAHN0YWNrX2xlbiA9PSAxAPUrAAB6FAAA/AUAAKDzAADA8wAAkPQAADD2AABj9gAAgPYAAND2AADw9gAA+/YAABD3AADQgwAAMPcAAFD3AABw9wAAkPcAAMD3AAB5+QAAfvkAAJD5AADQ+QAA8PkAAGD7AAC5+wAAxfsAAMr7AADQ+wAAEvwAABb8AAAw/AAAgPwAALr8AADQ/AAA7/wAAPj8AAAA/QAAwP0AABD+AAAQ/wAAOv8AAFD/AABw/wAAIAABABABAQAsAQEAMAEBAIABAQAQAgEAsAIBAEB/AAAwfABBsOYDC2QcAMgAmwEzAA8AQQAgAAsADAARAHICHwAXABYAIQC5AQUACgA1ABcAZgFZAAwABQAEAEIABAAPAEcAOgALAB8ACQAEALwARwDxACoADAAWAKsA7gAcAAQAQgCQAJwAMwAVBLQCAEGg5wML0gWsgP6ARNuAUnqASAiBTgSAQuKAYM1mgECogNaAAAAAAN2AQ3ARgJkJgVwfgJqCioCfg5eBjYHAjBgRHJEDAYkAFCgRCQIFEyTKIRgICAAhCwuRCQAGAClBIYNApwiAl4CQgEG8gYuIJCEJFI0AAYWXgbgAgJyDiIFBVYGeiUGSlb6Dn4Fg1GIAA4BA0gCAYNTA1IDGAQgJC4CLAAaAwAMPBoCbAwQAFoBBU4GYgJiAnoCYgJ6AmICegJiAnoCYB4GxVf8YmgEACICJAwAAKBgAAAIBAAgAAAAAAQALBgMDAICJgJAiBICQAAAAAAAAAABDRIBCaY0AAQEAx4qvjAaPgOQzGQuAooCdj+WK5AqIAgNAposWhZO1CY4BIomBnIK5MQmBiYCJgZyCuSMJC4CdCoCKgrk4EIGUgZUTgrkxCYGIgYmBnYC6IhCCiYCng7kwEBeBioGcgrkwEBeBioGbg7kwEIKJgImBnILKKACHkYG8AYaRgOIBKIGPgECikIqKgKPtiwALlhsQETKDjIsAiYNGc4GdgZ2BnYHBkkC7gaGA9YuDiEDdhLiJgZPJgb6Er467gp2ICbiKsZJBr41GwLNI9Z9geHOHoYFBYQeAloTXgbGPALiApYSbi6yDr4ukgMKNiweBrIKxABEMgKskgEDsh2BPMoBIVoRGhRAMg0MTg0GCgUFSgrSNu4CsiMaCo4uRgbiCr4yNgduICChAn4mWg7kxCYGJgImBQNCMAumRQOwxhpyB0Y4A6YrmjUEAjED2KAkKAIBAjTErgJuJqSCDkYqtjUGWOIbSlYCN+SoACBACgMEgCINBW4NgUFcAtjPcgWBMq4BgI2AwkA4BBEkbgEfnmYWZhZkAAAAAAECpgI6AQfSIMZ2E34CzgFmwvoyAoaRCsICMgI+MQNKPQ0+ZR5GBYHodgUDRgECGgUNhg2AhX49DRZlhzF+ZhZmFmQBBgO0DC0FJvYCXgEFlgJeA5YCXgEDpgJGB5oCXgPaAjoBNVIBE1YBQIIFgz22BU52Al4BBV4CLgEDwgEN/gGC4MweEbC6s3wBB0O0DCzdDToBODoFGUoFIroBQ/YBgzjqAzohtAAYAnd//QO9OD1iEgUiQgJSAT2uBQLaAQs6AT+CIRmeAAEGQ7gMLEUX/hUDWgLCAQdGAYQfZgI6AAEGw7gMLN0N5gEq3gP6AYCHmgWDLwIVBlYHzAAAAAAAAAIBBHoEAQ3mAYC0fgWDLwIVBlYHzAAAAAAAAAIAAQfDuAwsWQcMICIGkgU7cqgpOhz8/h4uAjoCugABBkO8DCyFA3oDPgJeARDyAWRGAQOQ/P4eJEQUCEYCpEYBg2weGi4QAQcDvAwuFBECfBgABAAESEIKfgM8BgIsHgPsBAYClgEC7iJ4phNoIgYmAowQCBAiAyYKcgEGTgECTgNeDQt6H+wiA0gGAoRGAQPyBQtSA/oCnga2AtYCIAwMDgIuAiAAmgJCAiAMDA4CLgEFBgOGBRlKB1INFHBCKgJGAm4yAoaRA2YBA1QAAAAAAAAE/P4eJEQQAKQQSgIgSgIgREQQIjwAgixIqCAsAB4KMBpKBmoCMioDWGBCKAQwKABARAgYFHIWPj4+IgEChCIFA94FBNNWZmkUggOaC5IBBnoFA8IBBLoDSgItA1amAtACC3wmA3oCw3YKN356Ap4eugEF/YHKbgUDRgECGgUNhg4iAYE2VQQ0IAIGJAAAJgsOB6aWGiyQAlwQAAQGA66BBapG/gbWnjIKZlZSBi4CSAxoAgECGCICfmUCDFQ0NChYGgIhgvKaDVLmGjYe/hUI+1IDGAQgJC4CLAAaAwAMPBoCbAwQAFoBBU4FBI4GxVf8YmgEACICJAwAAKBgAAAIBAAgAAAAAAQALBgMDAICJgJAiBICQQkOKhJ6An5mCooDugoyrg4gxSZ2JYPwFQh1rBeFP/6+JNZmFRhuAWfCBmYS2gwAAAAAAAAAArIBFW4CygE5AgEQEgEgIhbyApoCOgEGFgEwDAYCeC4BB2oCSgO6AYM2PgaSAiYBAqIBPnoAAQdDzAwsXQUiARSiASQIAgEgogUjEhUK4gW3c1YAAQfDzAwvmAt0AgMYFAwGBQfZAngclkAuAiIFA/IRA0IC2kICaAAEAQIU7gUCFCwqCwprairmKoYFAyJu8gI8Cg5uAyYCPgO2Aj4DtgI+AroK7gI8GgPaA/oDtgI+A7IGPgPuA+yiA6oCMhMqBmgAAA4HBEIG9gO8AgacLhJgwgImBQsCCRGiKiIBBWoJBODmAr431gI6ApYi1gUCJgb+F0ZgYKAqxvtiLpCKCQbwAgoqCjIKMgoyBTO+CQTyAQfmF6IPegGB1cYCLCICbgdGBjaHlguyBQMmAmpG4g6OA3oCLgKOAQJSCwIOygOOEiIL/gWBPL4BDAI9BDQCAroCsgcKAQvuASAOBQjqFQh2KQWeB94G9gMuAiILngUCxgdCAj4CXMoRAzAKA+oFA+oH9gPWB8oBBDIFBAQuAQJuA0oCRgNCAQaSAQQEAgdCAYE1XhLqGRFeQz4FgYXQSLzmGnYNPgYZBtINF34bsEIIAQeD2AwvFAUC2gEIXgUNtgEG4gENZgELvgP6ASUKAt4BCYoBBjYDDgFOIgKqE5oHcgmBvFYBF9YBDwYCVgECIgOuAlIFgVHqAU+uAQmeCRM6AYFCogUSbCIBgcVeBSAWCr4k1mYVg/qiJNZmFYC/vCYdgL/GBAABgMAWBmIiNgkPEWb+/YFH8YFkCQW2B6WB1CYCaV/eHRNWpiGAkZkGLYE0DYKbdoVA0ikDdgVaBjV0wTB5CHUXhU0pgIAuBTj+E+oRK7xGAYJD5CQCBAEGw+AMLR2D9z59CDYFg//2BYP/9gWD//YFg//2BYP/9gWD//YFg//2BYP/9gWD//YFg//2BYP/9gWD//YFg//2BYP/9gWD//YFg//2BAEGA+QMLRaCOiYaZGICZg6EwAAgACwMCgJaAnoBfF5eHjoGSgIlBMELPQJ9CdZ1Ea0H//0GAE5iOgGDNDIFBBIGIhJGA44Bfh4GXgQBB0PkDC7cCoQOAQIKAjoBfW4eYgU4GgEHIg4yCYM4gg0C8A4DZgWAuf5mA2ItA1WHx5ZkAAAAAoICLgI+ARUiAQJOBQLOAqoJA9YC8AAKBQSSBRuOBQxUDgUMEgEDFgUDLBIBBOYFBYYNArQmBQNqBwIFDu4GIgk3jgIyAQcSAYHT7gEENgUDiAoBBfYHVgd6AQJeBQJKCQI+BQPiAYFJlAoFAqICLgI+AwIBK84FE/IRA7IH0g/6CQIANgI+B1wiB64BBoIFBdAyO6IFA+IJCBACAQPqB1oFBo4FCs4FgS3SBQISAwIGKgENSgGBOBYBd54AAAAAA6IFAw4BBGICdgLOAk4BBP4DhAIBZCICygIwCgECDgECcgEGkgEDVgUsxgGGnpIGxgbGBsYGxgbGBsYGxgbGBsYGxgbGBsYEAQZD8AwvxAaCAiQCAigqAQz0HgEIAgLiAx4CNAYFAs4CqigBA6oG1jp6AQQSBRPOBQKsDhUE2gUMUh0MEgPuCxoFAnBKAphmBQTmBQWGDQK0IgkDahL2BQ7uBiIJN44CMA4CJAIFBsIFgdPqBQQyCQOKEQX2B1YHegECWgkCSgv6Aj4FA+IBgUmMQg0CogIkAgIoKgMABgEQ5gK+ARIWAQMaAQTWBQJeFw4XYg0O3hEDshu+D/oJAgA2Aj4HXhOuAQaCCi4FBZRqO6IFA+IJCBACAQPqB1guBQZ2CrIBChIFFdoRgRfiBQISAwIKJgENRgWBOBYBd5oMAQZD+Aws2YDP/Wb+/YFH8YFoQCACBiQAACYJhBdVgpt2hUDSKQN2BVoGNXTBUHlNKWAqCYOXxj20C70DvAEHQ/gMLFoiEkYDjgJmAVd6ASX6KnAyAroBPn4AAQfD+AwuCBKeBkQCAmwCAnACArICOgE59g0dcgUmbgYmBtYGNgUCwgEC/GioCChgYAAOIIICRI4gIADmeCyCICZIhiCELl4GPO5MOgUQ8jckBGAgUHBKNQZKVDYCNODUQHAEMGAIJiSmBi5IDCAAIAyEql4GKCxgJC6oPgKcgABQiGBQAQP+AQgIaCIGNCYlB3YkPYM48LIFAoYGRAICbAICcAAAIgWDXdoC4gLiAuIC4gAAAAAAAogUEie4DgF+MgIuAQNeAlYDZhY6BQW6Bi4BApYCYihpAxoBA5oGJgIiAuRiEiAEBCQMBAAkCAg8UAASLigkACICRAYGRKAAKDAELgYoMCQQIAIGTDCgZAwEBKAEAAAUCBYCJgY4BAwADEICKga+CiICNgI2AQXOBQc6CkoGyA4BE2YCLgEJYAIBhvWmAQMmAQJ+Bi4GNAYnKmQGWgJMBiJSBQK2hge8JAoHSCoBBBoC+iiiXMQ+LARkDgYwJB4GIBIKLFxEAAwUCBdWvxScKPRABEIGJQOKLQR+ugImAsYDRgLLvIhSGiJg2iIKMhgAAogUEiV/SgEDUgGDdKoBg89WZQfqERa+DbAZr32Hz+oRgJhyAQNqAj4NhzHaAuxEBgvQJipSSEBoCMACXgEDIC4CUA4FArRKE0oCPgoiAioBCPgEHPYCIiQq3gLwICICQEIwAQYCDBAvjAmAjGYFAzBoBgEIIgZSBsYuqgJKAjAeBkAwPBICUBggDAQYDgZuAogADEIC8gpeAjYBDWoGyA4BhxK2AQMmAQL0BicqZAJeAkwEggpSBQK2gi4iAxYCVi6oci5AQgsYAgEC6gb6MGJeRgJmBjIDV1K/FKBIKkg6IQOKLQR+ugImAsYDRgLLvIhSGiJg2iIKMhkCoA4BfjICLgEDXgJWA2YWOgUFugYuA3oDFgJiKGkDGgEDmgYmAiIC5GCiLgPGJ9YGKAAAoECiJgY4BAwADEICKhKyCiICNgI2AQXOBQc6CkoGyA4BE2YCLgEJYAIBhvWVA/4yCnoC7hYuBjQGJkbiajomAkwGIA4hBsYRBPYdBCa//84vUqouDt4eJhaeHndGLroCJgEG4QP9D/QAAAABArIBCoIBCy4BLQYFGUoHUg0f7hJmEsI9Q84BgzJqPQO6AQJ+AzohgvKaDVM6HbC6ET/8AQfaFBAvhFeA/AAAAAAAA4L8DAAAABAAAAAQAAAAGAAAAg/miAERObgD8KRUA0VcnAN009QBi28AAPJmVAEGQQwBjUf4Au96rALdhxQA6biQA0k1CAEkG4AAJ6i4AHJLRAOsd/gApsRwA6D6nAPU1ggBEuy4AnOmEALQmcABBfl8A1pE5AFODOQCc9DkAi1+EACj5vQD4HzsA3v+XAA+YBQARL+8AClqLAG0fbQDPfjYACcsnAEZPtwCeZj8ALepfALondQDl68cAPXvxAPc5BwCSUooA+2vqAB+xXwAIXY0AMANWAHv8RgDwq2sAILzPADb0mgDjqR0AXmGRAAgb5gCFmWUAoBRfAI1AaACA2P8AJ3NNAAYGMQDKVhUAyahzAHviYABrjMAAGcRHAM1nwwAJ6NwAWYMqAIt2xACmHJYARK/dABlX0QClPgUABQf/ADN+PwDCMugAmE/eALt9MgAmPcMAHmvvAJ/4XgA1HzoAf/LKAPGHHQB8kCEAaiR8ANVu+gAwLXcAFTtDALUUxgDDGZ0ArcTCACxNQQAMAF0Ahn1GAONxLQCbxpoAM2IAALTSfAC0p5cAN1XVANc+9gCjEBgATXb8AGSdKgBw16sAY3z4AHqwVwAXFecAwElWADvW2QCnhDgAJCPLANaKdwBaVCMAAB+5APEKGwAZzt8AnzH/AGYeagCZV2EArPtHAH5/2AAiZbcAMuiJAOa/YADvxM0AbDYJAF0/1AAW3tcAWDveAN6bkgDSIigAKIboAOJYTQDGyjIACOMWAOB9ywAXwFAA8x2nABjgWwAuEzQAgxJiAINIAQD1jlsArbB/AB7p8gBISkMAEGfTAKrd2ACuX0IAamHOAAoopADTmbQABqbyAFx3fwCjwoMAYTyIAIpzeACvjFoAb9e9AC2mYwD0v8sAjYHvACbBZwBVykUAytk2ACio0gDCYY0AEsl3AAQmFAASRpsAxFnEAMjFRABNspEAABfzANRDrQApSeUA/dUQAAC+/AAelMwAcM7uABM+9QDs8YAAs+fDAMf4KACTBZQAwXE+AC4JswALRfMAiBKcAKsgewAutZ8AR5LCAHsyLwAMVW0AcqeQAGvnHwAxy5YAeRZKAEF54gD034kA6JSXAOLmhACZMZcAiO1rAF9fNgC7/Q4ASJq0AGekbABxckIAjV0yAJ8VuAC85QkAjTElAPd0OQAwBRwADQwBAEsIaAAs7lgAR6qQAHTnAgC91iQA932mAG5IcgCfFu8AjpSmALSR9gDRU1EAzwryACCYMwD1S34AsmNoAN0+XwBAXQMAhYl/AFVSKQA3ZMAAbdgQADJIMgBbTHUATnHUAEVUbgALCcEAKvVpABRm1QAnB50AXQRQALQ72wDqdsUAh/kXAElrfQAdJ7oAlmkpAMbMrACtFFQAkOJqAIjZiQAsclAABKS+AHcHlADzMHAAAPwnAOpxqABmwkkAZOA9AJfdgwCjP5cAQ5T9AA2GjAAxQd4AkjmdAN1wjAAXt+cACN87ABU3KwBcgKAAWoCTABARkgAP6NgAbICvANv/SwA4kA8AWRh2AGKlFQBhy7sAx4m5ABBAvQDS8gQASXUnAOu29gDbIrsAChSqAIkmLwBkg3YACTszAA6UGgBROqoAHaPCAK/trgBcJhIAbcJNAC16nADAVpcAAz+DAAnw9gArQIwAbTGZADm0BwAMIBUA2MNbAPWSxADGrUsATsqlAKc3zQDmqTYAq5KUAN1CaAAZY94AdozvAGiLUgD82zcArqGrAN8VMQAArqEADPvaAGRNZgDtBbcAKWUwAFdWvwBH/zoAavm5AHW+8wAok98Aq4AwAGaM9gAEyxUA+iIGANnkHQA9s6QAVxuPADbNCQBOQukAE76kADMjtQDwqhoAT2WoANLBpQALPw8AW3jNACP5dgB7iwQAiRdyAMamUwBvbuIA7+sAAJtKWADE2rcAqma6AHbPzwDRAh0AsfEtAIyZwQDDrXcAhkjaAPddoADGgPQArPAvAN3smgA/XLwA0N5tAJDHHwAq27YAoyU6AACvmgCtU5MAtlcEACkttABLgH4A2genAHaqDgB7WaEAFhIqANy3LQD65f0Aidv+AIm+/QDkdmwABqn8AD6AcACFbhUA/Yf/ACg+BwBhZzMAKhiGAE296gCz568Aj21uAJVnOQAxv1sAhNdIADDfFgDHLUMAJWE1AMlwzgAwy7gAv2z9AKQAogAFbOQAWt2gACFvRwBiEtIAuVyEAHBhSQBrVuAAmVIBAFBVNwAe1bcAM/HEABNuXwBdMOQAhS6pAB2ywwChMjYACLekAOqx1AAW9yEAj2nkACf/dwAMA4AAjUAtAE/NoAAgpZkAs6LTAC9dCgC0+UIAEdrLAH2+0ACb28EAqxe9AMqigQAIalwALlUXACcAVQB/FPAA4QeGABQLZACWQY0Ah77eANr9KgBrJbYAe4k0AAXz/gC5v54AaGpPAEoqqABPxFoALfi8ANdamAD0x5UADU2NACA6pgCkV18AFD+xAIA4lQDMIAEAcd2GAMnetgC/YPUATWURAAEHawCMsKwAssDQAFFVSAAe+w4AlXLDAKMGOwDAQDUABtx7AOBFzABOKfoA1srIAOjzQQB8ZN4Am2TYANm+MQCkl8MAd1jUAGnjxQDw2hMAujo8AEYYRgBVdV8A0r31AG6SxgCsLl0ADkTtABw+QgBhxIcAKf3pAOfW8wAifMoAb5E1AAjgxQD/140AbmriALD9xgCTCMEAfF10AGutsgDNbp0APnJ7AMYRagD3z6kAKXPfALXJugC3AFEA4rINAHS6JADlfWAAdNiKAA0VLACBGAwAfmaUAAEpFgCfenYA/f2+AFZF7wDZfjYA7NkTAIu6uQDEl/wAMagnAPFuwwCUxTYA2KhWALSotQDPzA4AEoktAG9XNAAsVokAmc7jANYguQBrXqoAPiqcABFfzAD9C0oA4fT7AI47bQDihiwA6dSEAPy0qQDv7tEALjXJAC85YQA4IUQAG9nIAIH8CgD7SmoALxzYAFO0hABOmYwAVCLMACpV3ADAxtYACxmWABpwuABplWQAJlpgAD9S7gB/EQ8A9LURAPzL9QA0vC0ANLzuAOhdzADdXmAAZ46bAJIz7wDJF7gAYVibAOFXvABRg8YA2D4QAN1xSAAtHN0ArxihACEsRgBZ89cA2XqYAJ5UwABPhvoAVgb8AOV5rgCJIjYAOK0iAGeT3ABV6KoAgiY4AMrnmwBRDaQAmTOxAKnXDgBpBUgAZbLwAH+IpwCITJcA+dE2ACGSswB7gkoAmM8hAECf3ADcR1UA4XQ6AGfrQgD+nd8AXtRfAHtnpAC6rHoAVfaiACuIIwBBulUAWW4IACEqhgA5R4MAiePmAOWe1ABJ+0AA/1bpABwPygDFWYoAlPorANPBxQAPxc8A21quAEfFhgCFQ2IAIYY7ACx5lAAQYYcAKkx7AIAsGgBDvxIAiCaQAHg8iQCoxOQA5dt7AMQ6wgAm9OoA92eKAA2SvwBloysAPZOxAL18CwCkUdwAJ91jAGnh3QCalBkAqCmVAGjOKAAJ7bQARJ8gAE6YygBwgmMAfnwjAA+5MgCn9Y4AFFbnACHxCAC1nSoAb35NAKUZUQC1+asAgt/WAJbdYQAWNgIAxDqfAIOioQBy7W0AOY16AIK4qQBrMlwARidbAAA07QDSAHcA/PRVAAFZTQDgcYAAQeObBAtdQPsh+T8AAAAALUR0PgAAAICYRvg8AAAAYFHMeDsAAACAgxvwOQAAAEAgJXo4AAAAgCKC4zYAAAAAHfNpNRgtRFT7Iek/GC1EVPsh6b/SITN/fNkCQNIhM3982QLAAEHPnAQLcYAYLURU+yEJQBgtRFT7IQnAT7thBWes3T8YLURU+yHpP5v2gdILc+8/GC1EVPsh+T/iZS8ifyt6PAdcFDMmpoE8vcvweogHcDwHXBQzJqaRPAAAAAAAAPA/AAAAAAAA+D8AAAAAAAAAAAbQz0Pr/Uw+AEHLnQQLBUADuOI/AEH0nQQLAm0BAEGbngQLBf//////AEHgngQLEC0rICAgMFgweAAobnVsbCkAQYCfBAtBEQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAEACQsLAAAJBgsAAAsABhEAAAAREREAQdGfBAshCwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAEGLoAQLAQwAQZegBAsVDAAAAAAMAAAAAAkMAAAAAAAMAAAMAEHFoAQLAQ4AQdGgBAsVDQAAAAQNAAAAAAkOAAAAAAAOAAAOAEH/oAQLARAAQYuhBAseDwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAEHCoQQLDhIAAAASEhIAAAAAAAAJAEHzoQQLAQsAQf+hBAsVCgAAAAAKAAAAAAkLAAAAAAALAAALAEGtogQLAQwAQbmiBAtcDAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGLTBYKzBYIDBYLTB4KzB4IDB4AGluZgBJTkYAbmFuAE5BTgAuAHJ3YQBpbmZpbml0eQBuYW4AQaCjBAtL0XSeAFedvSqAcFIP//8+JwoAAABkAAAA6AMAABAnAACghgEAQEIPAICWmAAA4fUFGAAAADUAAABxAAAAa////877//+Sv///4BIBAEGgpQQLA8ATAQBB2aUECwgaUQAAAAAABQBB7KUECwJ0AQBBhKYECw51AQAAdgEAAPgVAQAABABBnKYECwEBAEGrpgQLBQr/////AEHwpgQLA+ASAQ==\";if(!T(U)){var ka=U;U=b.locateFile?b.locateFile(ka,t):t+ka;}function la(){try{if(v)return new Uint8Array(v);var a=U;if(T(a))try{var c=ma(a.slice(37)),d=new Uint8Array(c.length);for(a=0;a<c.length;++a)d[a]=c.charCodeAt(a);var e=d;}catch(g){throw Error(\"Converting base64 string to bytes failed.\");}else e=void 0;var f=e;if(f)return f;throw\"both async and sync fetching of the wasm failed\";}catch(g){w(g);}}function na(){return v||\"function\"!==typeof fetch?Promise.resolve().then(la):fetch(U,{credentials:\"same-origin\"}).then(function(a){if(!a.ok)throw\"failed to load wasm binary file at '\"+U+\"'\";return a.arrayBuffer();}).catch(function(){return la();});}function V(a){for(;0<a.length;){var c=a.shift();if(\"function\"==typeof c)c(b);else{var d=c.B;\"number\"===typeof d?void 0===c.A?P.get(d)():P.get(d)(c.A):d(void 0===c.A?null:c.A);}}}function oa(a){var c=ca(a)+1,d=K(c);D(a,E,d,c);return d;}function pa(){}var qa=[null,[],[]];function ra(){function a(k){return(k=k.toTimeString().match(/\\(([A-Za-z ]+)\\)$/))?k[1]:\"GMT\";}if(!sa){sa=!0;var c=new Date().getFullYear(),d=new Date(c,0,1),e=new Date(c,6,1);c=d.getTimezoneOffset();var f=e.getTimezoneOffset(),g=Math.max(c,f);M[ta()>>2]=60*g;M[ua()>>2]=Number(c!=f);d=a(d);e=a(e);d=da(d);e=da(e);f<c?(M[X()>>2]=d,M[X()+4>>2]=e):(M[X()>>2]=e,M[X()+4>>2]=d);}}var sa;pa=(a,c,d)=>{a=H(a);c=null!==c?JSON.parse(H(c)):[];try{const e=b.externalCall(a,c);return e?oa(e):null;}catch(e){return b.HEAPU8[d]=1,oa(e.message);}};var ma=\"function\"===typeof atob?atob:function(a){var c=\"\",d=0;a=a.replace(/[^A-Za-z0-9\\+\\/=]/g,\"\");do{var e=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(d++));var f=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(d++));var g=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(d++));var k=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(d++));e=e<<2|f>>4;f=(f&15)<<4|g>>2;var m=(g&3)<<6|k;c+=String.fromCharCode(e);64!==g&&(c+=String.fromCharCode(f));64!==k&&(c+=String.fromCharCode(m));}while(d<a.length);return c;};fa.push({B:function(){va();}});var wa={b:function(a,c,d,e){w(\"Assertion failed: \"+H(a)+\", at: \"+[c?H(c):\"unknown filename\",d,e?H(e):\"unknown function\"]);},c:function(){w();},i:pa,h:function(a,c){a=H(a);let d;try{d=window.JSON.parse(a);}catch(e){d=a;}0!==c?window.alert(a):window.console.log(\"DUMP\",d);},f:function(a,c,d){E.copyWithin(a,c,c+d);},g:function(){w(\"OOM\");},e:function(a,c,d,e){for(var f=0,g=0;g<d;g++){for(var k=M[c+8*g>>2],m=M[c+(8*g+4)>>2],z=0;z<m;z++){var l=E[k+z],p=qa[a];0===l||10===l?((1===a?aa:u)(ba(p,0)),p.length=0):p.push(l);}f+=m;}M[e>>2]=f;return 0;},d:function(a){var c=Date.now();M[a>>2]=c/1E3|0;M[a+4>>2]=c%1E3*1E3|0;return 0;},j:function(a,c){ra();a=new Date(1E3*M[a>>2]);M[c>>2]=a.getSeconds();M[c+4>>2]=a.getMinutes();M[c+8>>2]=a.getHours();M[c+12>>2]=a.getDate();M[c+16>>2]=a.getMonth();M[c+20>>2]=a.getFullYear()-1900;M[c+24>>2]=a.getDay();var d=new Date(a.getFullYear(),0,1);M[c+28>>2]=(a.getTime()-d.getTime())/864E5|0;M[c+36>>2]=-(60*a.getTimezoneOffset());var e=new Date(a.getFullYear(),6,1).getTimezoneOffset();d=d.getTimezoneOffset();a=(e!=d&&a.getTimezoneOffset()==Math.min(d,e))|0;M[c+32>>2]=a;a=M[X()+(a?4:0)>>2];M[c+40>>2]=a;return c;},k:function(a){a=H(a);window.console.log(a);},a:x,l:function(a,c,d,e){a=H(a);c=H(c);d=H(d);d=`Quickjs -- ${a}: ${c}\\n${d}`;0!==e?window.alert(d):window.console.error(d);}};(function(){function a(f){b.asm=f.exports;P=b.asm.m;Q--;b.monitorRunDependencies&&b.monitorRunDependencies(Q);0==Q&&(null!==R&&(clearInterval(R),R=null),S&&(f=S,S=null,f()));}function c(f){a(f.instance);}function d(f){return na().then(function(g){return WebAssembly.instantiate(g,e);}).then(f,function(g){u(\"failed to asynchronously prepare wasm: \"+g);w(g);});}var e={a:wa};Q++;b.monitorRunDependencies&&b.monitorRunDependencies(Q);if(b.instantiateWasm)try{return b.instantiateWasm(e,a);}catch(f){return u(\"Module.instantiateWasm callback failed with error: \"+f),!1;}(function(){return v||\"function\"!==typeof WebAssembly.instantiateStreaming||T(U)||\"function\"!==typeof fetch?d(c):fetch(U,{credentials:\"same-origin\"}).then(function(f){return WebAssembly.instantiateStreaming(f,e).then(c,function(g){u(\"wasm streaming compile failed: \"+g);u(\"falling back to ArrayBuffer instantiation\");return d(c);});});})().catch(n);return{};})();var va=b.___wasm_call_ctors=function(){return(va=b.___wasm_call_ctors=b.asm.n).apply(null,arguments);};b._evalInSandbox=function(){return(b._evalInSandbox=b.asm.o).apply(null,arguments);};b._nukeSandbox=function(){return(b._nukeSandbox=b.asm.p).apply(null,arguments);};b._init=function(){return(b._init=b.asm.q).apply(null,arguments);};b._commFun=function(){return(b._commFun=b.asm.r).apply(null,arguments);};b._dumpMemoryUse=function(){return(b._dumpMemoryUse=b.asm.s).apply(null,arguments);};var K=b._malloc=function(){return(K=b._malloc=b.asm.t).apply(null,arguments);},X=b.__get_tzname=function(){return(X=b.__get_tzname=b.asm.u).apply(null,arguments);},ua=b.__get_daylight=function(){return(ua=b.__get_daylight=b.asm.v).apply(null,arguments);},ta=b.__get_timezone=function(){return(ta=b.__get_timezone=b.asm.w).apply(null,arguments);},G=b.stackSave=function(){return(G=b.stackSave=b.asm.x).apply(null,arguments);},I=b.stackRestore=function(){return(I=b.stackRestore=b.asm.y).apply(null,arguments);},C=b.stackAlloc=function(){return(C=b.stackAlloc=b.asm.z).apply(null,arguments);};b.ccall=B;b.cwrap=function(a,c,d,e){d=d||[];var f=d.every(function(g){return\"number\"===g;});return\"string\"!==c&&f&&!e?A(a):function(){return B(a,c,d,arguments,e);};};var Y;S=function xa(){Y||Z();Y||(S=xa);};function Z(){function a(){if(!Y&&(Y=!0,b.calledRun=!0,!y)){V(fa);V(ha);h(b);if(b.onRuntimeInitialized)b.onRuntimeInitialized();if(b.postRun)for(\"function\"==typeof b.postRun&&(b.postRun=[b.postRun]);b.postRun.length;){var c=b.postRun.shift();ia.unshift(c);}V(ia);}}if(!(0<Q)){if(b.preRun)for(\"function\"==typeof b.preRun&&(b.preRun=[b.preRun]);b.preRun.length;)ja();V(ea);0<Q||(b.setStatus?(b.setStatus(\"Running...\"),setTimeout(function(){setTimeout(function(){b.setStatus(\"\");},1);a();},1)):a());}}b.run=Z;if(b.preInit)for(\"function\"==typeof b.preInit&&(b.preInit=[b.preInit]);0<b.preInit.length;)b.preInit.pop()();noExitRuntime=!0;Z();return Module.ready;};}();var _default=Module;exports.default=_default;\n\n/***/ }),\n/* 2 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nclass SandboxSupportBase {\n  constructor(win) {\n    this.win = win;\n    this.timeoutIds = new Map();\n    this.commFun = null;\n  }\n\n  destroy() {\n    this.commFunc = null;\n    this.timeoutIds.forEach(([_, id]) => this.win.clearTimeout(id));\n    this.timeoutIds = null;\n  }\n\n  exportValueToSandbox(val) {\n    throw new Error(\"Not implemented\");\n  }\n\n  importValueFromSandbox(val) {\n    throw new Error(\"Not implemented\");\n  }\n\n  createErrorForSandbox(errorMessage) {\n    throw new Error(\"Not implemented\");\n  }\n\n  callSandboxFunction(name, args) {\n    try {\n      args = this.exportValueToSandbox(args);\n      this.commFun(name, args);\n    } catch (e) {\n      this.win.console.error(e);\n    }\n  }\n\n  createSandboxExternals() {\n    const externals = {\n      setTimeout: (callbackId, nMilliseconds) => {\n        if (typeof callbackId !== \"number\" || typeof nMilliseconds !== \"number\") {\n          return;\n        }\n\n        const id = this.win.setTimeout(() => {\n          this.timeoutIds.delete(callbackId);\n          this.callSandboxFunction(\"timeoutCb\", {\n            callbackId,\n            interval: false\n          });\n        }, nMilliseconds);\n        this.timeoutIds.set(callbackId, id);\n      },\n      clearTimeout: id => {\n        this.win.clearTimeout(this.timeoutIds.get(id));\n        this.timeoutIds.delete(id);\n      },\n      setInterval: (callbackId, nMilliseconds) => {\n        if (typeof callbackId !== \"number\" || typeof nMilliseconds !== \"number\") {\n          return;\n        }\n\n        const id = this.win.setInterval(() => {\n          this.callSandboxFunction(\"timeoutCb\", {\n            callbackId,\n            interval: true\n          });\n        }, nMilliseconds);\n        this.timeoutIds.set(callbackId, id);\n      },\n      clearInterval: id => {\n        this.win.clearInterval(this.timeoutIds.get(id));\n        this.timeoutIds.delete(id);\n      },\n      alert: cMsg => {\n        if (typeof cMsg !== \"string\") {\n          return;\n        }\n\n        this.win.alert(cMsg);\n      },\n      prompt: (cQuestion, cDefault) => {\n        if (typeof cQuestion !== \"string\" || typeof cDefault !== \"string\") {\n          return null;\n        }\n\n        return this.win.prompt(cQuestion, cDefault);\n      },\n      parseURL: cUrl => {\n        const url = new this.win.URL(cUrl);\n        const props = [\"hash\", \"host\", \"hostname\", \"href\", \"origin\", \"password\", \"pathname\", \"port\", \"protocol\", \"search\", \"searchParams\", \"username\"];\n        return Object.fromEntries(props.map(name => [name, url[name].toString()]));\n      },\n      send: data => {\n        if (!data) {\n          return;\n        }\n\n        const event = new this.win.CustomEvent(\"updatefromsandbox\", {\n          detail: this.importValueFromSandbox(data)\n        });\n        this.win.dispatchEvent(event);\n      }\n    };\n    Object.setPrototypeOf(externals, null);\n    return (name, args) => {\n      try {\n        const result = externals[name](...args);\n        return this.exportValueToSandbox(result);\n      } catch (error) {\n        throw this.createErrorForSandbox(error?.toString() ?? \"\");\n      }\n    };\n  }\n\n}\n\n{\n  exports.SandboxSupportBase = SandboxSupportBase;\n}\n\n/***/ })\n/******/ \t]);\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __w_pdfjs_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __w_pdfjs_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.\n(() => {\nvar exports = __webpack_exports__;\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.QuickJSSandbox = QuickJSSandbox;\n\nvar _quickjsEval = _interopRequireDefault(__w_pdfjs_require__(1));\n\nvar _pdfSandboxExternal = __w_pdfjs_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst pdfjsVersion = '2.8.335';\nconst pdfjsBuild = '228adbf67';\nconst TESTING = false;\n\nclass SandboxSupport extends _pdfSandboxExternal.SandboxSupportBase {\n  exportValueToSandbox(val) {\n    return JSON.stringify(val);\n  }\n\n  importValueFromSandbox(val) {\n    return val;\n  }\n\n  createErrorForSandbox(errorMessage) {\n    return new Error(errorMessage);\n  }\n\n}\n\nclass Sandbox {\n  constructor(win, module) {\n    this.support = new SandboxSupport(win, this);\n    module.externalCall = this.support.createSandboxExternals();\n    this._module = module;\n    this._alertOnError = 0;\n  }\n\n  create(data) {\n    if (TESTING) {\n      this._module.ccall(\"nukeSandbox\", null, []);\n    }\n\n    const code = ['(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(\"pdfjs-dist/build/pdf.scripting\", [], factory);\\n\\telse if(typeof exports === \\'object\\')\\n\\t\\texports[\"pdfjs-dist/build/pdf.scripting\"] = factory();\\n\\telse\\n\\t\\troot.pdfjsScripting = factory();\\n})(this, function() {\\nreturn /******/ (() => { // webpackBootstrap\\n/******/ \\t\"use strict\";\\n/******/ \\tvar __webpack_modules__ = ([\\n/* 0 */,\\n/* 1 */\\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\\n\\n\\n\\nObject.defineProperty(exports, \"__esModule\", ({\\n  value: true\\n}));\\nexports.initSandbox = initSandbox;\\n\\nvar _constants = __w_pdfjs_require__(2);\\n\\nvar _field = __w_pdfjs_require__(3);\\n\\nvar _aform = __w_pdfjs_require__(8);\\n\\nvar _app = __w_pdfjs_require__(9);\\n\\nvar _color = __w_pdfjs_require__(5);\\n\\nvar _console = __w_pdfjs_require__(13);\\n\\nvar _doc = __w_pdfjs_require__(14);\\n\\nvar _proxy = __w_pdfjs_require__(16);\\n\\nvar _util = __w_pdfjs_require__(17);\\n\\nfunction initSandbox(params) {\\n  delete globalThis.pdfjsScripting;\\n  const externalCall = globalThis.callExternalFunction;\\n  delete globalThis.callExternalFunction;\\n\\n  const globalEval = code => globalThis.eval(code);\\n\\n  const send = data => externalCall(\"send\", [data]);\\n\\n  const proxyHandler = new _proxy.ProxyHandler();\\n  const {\\n    data\\n  } = params;\\n  const doc = new _doc.Doc({\\n    send,\\n    globalEval,\\n    ...data.docInfo\\n  });\\n  const _document = {\\n    obj: doc,\\n    wrapped: new Proxy(doc, proxyHandler)\\n  };\\n  const app = new _app.App({\\n    send,\\n    globalEval,\\n    externalCall,\\n    _document,\\n    calculationOrder: data.calculationOrder,\\n    proxyHandler,\\n    ...data.appInfo\\n  });\\n  const util = new _util.Util({\\n    externalCall\\n  });\\n  const appObjects = app._objects;\\n\\n  if (data.objects) {\\n    const annotations = [];\\n\\n    for (const [name, objs] of Object.entries(data.objects)) {\\n      annotations.length = 0;\\n      let container = null;\\n\\n      for (const obj of objs) {\\n        if (obj.type !== \"\") {\\n          annotations.push(obj);\\n        } else {\\n          container = obj;\\n        }\\n      }\\n\\n      let obj = container;\\n\\n      if (annotations.length > 0) {\\n        obj = annotations[0];\\n        obj.send = send;\\n      }\\n\\n      obj.globalEval = globalEval;\\n      obj.doc = _document;\\n      obj.fieldPath = name;\\n      obj.appObjects = appObjects;\\n      let field;\\n\\n      if (obj.type === \"radiobutton\") {\\n        const otherButtons = annotations.slice(1);\\n        field = new _field.RadioButtonField(otherButtons, obj);\\n      } else if (obj.type === \"checkbox\") {\\n        const otherButtons = annotations.slice(1);\\n        field = new _field.CheckboxField(otherButtons, obj);\\n      } else {\\n        field = new _field.Field(obj);\\n      }\\n\\n      const wrapped = new Proxy(field, proxyHandler);\\n\\n      doc._addField(name, wrapped);\\n\\n      const _object = {\\n        obj: field,\\n        wrapped\\n      };\\n\\n      for (const object of objs) {\\n        appObjects[object.id] = _object;\\n      }\\n\\n      if (container) {\\n        appObjects[container.id] = _object;\\n      }\\n    }\\n  }\\n\\n  const color = new _color.Color();\\n  globalThis.event = null;\\n  globalThis.global = Object.create(null);\\n  globalThis.app = new Proxy(app, proxyHandler);\\n  globalThis.color = new Proxy(color, proxyHandler);\\n  globalThis.console = new Proxy(new _console.Console({\\n    send\\n  }), proxyHandler);\\n  globalThis.util = new Proxy(util, proxyHandler);\\n  globalThis.border = _constants.Border;\\n  globalThis.cursor = _constants.Cursor;\\n  globalThis.display = _constants.Display;\\n  globalThis.font = _constants.Font;\\n  globalThis.highlight = _constants.Highlight;\\n  globalThis.position = _constants.Position;\\n  globalThis.scaleHow = _constants.ScaleHow;\\n  globalThis.scaleWhen = _constants.ScaleWhen;\\n  globalThis.style = _constants.Style;\\n  globalThis.trans = _constants.Trans;\\n  globalThis.zoomtype = _constants.ZoomType;\\n  globalThis.ADBE = {\\n    Reader_Value_Asked: true,\\n    Viewer_Value_Asked: true\\n  };\\n  const aform = new _aform.AForm(doc, app, util, color);\\n\\n  for (const name of Object.getOwnPropertyNames(_aform.AForm.prototype)) {\\n    if (name !== \"constructor\" && !name.startsWith(\"_\")) {\\n      globalThis[name] = aform[name].bind(aform);\\n    }\\n  }\\n\\n  for (const [name, value] of Object.entries(_constants.GlobalConstants)) {\\n    Object.defineProperty(globalThis, name, {\\n      value,\\n      writable: false\\n    });\\n  }\\n\\n  Object.defineProperties(globalThis, {\\n    ColorConvert: {\\n      value: color.convert.bind(color),\\n      writable: true\\n    },\\n    ColorEqual: {\\n      value: color.equal.bind(color),\\n      writable: true\\n    }\\n  });\\n  const properties = Object.create(null);\\n\\n  for (const name of Object.getOwnPropertyNames(_doc.Doc.prototype)) {\\n    if (name === \"constructor\" || name.startsWith(\"_\")) {\\n      continue;\\n    }\\n\\n    const descriptor = Object.getOwnPropertyDescriptor(_doc.Doc.prototype, name);\\n\\n    if (descriptor.get) {\\n      properties[name] = {\\n        get: descriptor.get.bind(doc),\\n        set: descriptor.set.bind(doc)\\n      };\\n    } else {\\n      properties[name] = {\\n        value: _doc.Doc.prototype[name].bind(doc)\\n      };\\n    }\\n  }\\n\\n  Object.defineProperties(globalThis, properties);\\n  const functions = {\\n    dispatchEvent: app._dispatchEvent.bind(app),\\n    timeoutCb: app._evalCallback.bind(app)\\n  };\\n  return (name, args) => {\\n    try {\\n      functions[name](args);\\n    } catch (error) {\\n      const value = `${error.toString()}\\\\n${error.stack}`;\\n      send({\\n        command: \"error\",\\n        value\\n      });\\n    }\\n  };\\n}\\n\\n/***/ }),\\n/* 2 */\\n/***/ ((__unused_webpack_module, exports) => {\\n\\n\\n\\nObject.defineProperty(exports, \"__esModule\", ({\\n  value: true\\n}));\\nexports.ZoomType = exports.Trans = exports.Style = exports.ScaleWhen = exports.ScaleHow = exports.Position = exports.Highlight = exports.GlobalConstants = exports.Font = exports.Display = exports.Cursor = exports.Border = void 0;\\nconst Border = Object.freeze({\\n  s: \"solid\",\\n  d: \"dashed\",\\n  b: \"beveled\",\\n  i: \"inset\",\\n  u: \"underline\"\\n});\\nexports.Border = Border;\\nconst Cursor = Object.freeze({\\n  visible: 0,\\n  hidden: 1,\\n  delay: 2\\n});\\nexports.Cursor = Cursor;\\nconst Display = Object.freeze({\\n  visible: 0,\\n  hidden: 1,\\n  noPrint: 2,\\n  noView: 3\\n});\\nexports.Display = Display;\\nconst Font = Object.freeze({\\n  Times: \"Times-Roman\",\\n  TimesB: \"Times-Bold\",\\n  TimesI: \"Times-Italic\",\\n  TimesBI: \"Times-BoldItalic\",\\n  Helv: \"Helvetica\",\\n  HelvB: \"Helvetica-Bold\",\\n  HelvI: \"Helvetica-Oblique\",\\n  HelvBI: \"Helvetica-BoldOblique\",\\n  Cour: \"Courier\",\\n  CourB: \"Courier-Bold\",\\n  CourI: \"Courier-Oblique\",\\n  CourBI: \"Courier-BoldOblique\",\\n  Symbol: \"Symbol\",\\n  ZapfD: \"ZapfDingbats\",\\n  KaGo: \"HeiseiKakuGo-W5-UniJIS-UCS2-H\",\\n  KaMi: \"HeiseiMin-W3-UniJIS-UCS2-H\"\\n});\\nexports.Font = Font;\\nconst Highlight = Object.freeze({\\n  n: \"none\",\\n  i: \"invert\",\\n  p: \"push\",\\n  o: \"outline\"\\n});\\nexports.Highlight = Highlight;\\nconst Position = Object.freeze({\\n  textOnly: 0,\\n  iconOnly: 1,\\n  iconTextV: 2,\\n  textIconV: 3,\\n  iconTextH: 4,\\n  textIconH: 5,\\n  overlay: 6\\n});\\nexports.Position = Position;\\nconst ScaleHow = Object.freeze({\\n  proportional: 0,\\n  anamorphic: 1\\n});\\nexports.ScaleHow = ScaleHow;\\nconst ScaleWhen = Object.freeze({\\n  always: 0,\\n  never: 1,\\n  tooBig: 2,\\n  tooSmall: 3\\n});\\nexports.ScaleWhen = ScaleWhen;\\nconst Style = Object.freeze({\\n  ch: \"check\",\\n  cr: \"cross\",\\n  di: \"diamond\",\\n  ci: \"circle\",\\n  st: \"star\",\\n  sq: \"square\"\\n});\\nexports.Style = Style;\\nconst Trans = Object.freeze({\\n  blindsH: \"BlindsHorizontal\",\\n  blindsV: \"BlindsVertical\",\\n  boxI: \"BoxIn\",\\n  boxO: \"BoxOut\",\\n  dissolve: \"Dissolve\",\\n  glitterD: \"GlitterDown\",\\n  glitterR: \"GlitterRight\",\\n  glitterRD: \"GlitterRightDown\",\\n  random: \"Random\",\\n  replace: \"Replace\",\\n  splitHI: \"SplitHorizontalIn\",\\n  splitHO: \"SplitHorizontalOut\",\\n  splitVI: \"SplitVerticalIn\",\\n  splitVO: \"SplitVerticalOut\",\\n  wipeD: \"WipeDown\",\\n  wipeL: \"WipeLeft\",\\n  wipeR: \"WipeRight\",\\n  wipeU: \"WipeUp\"\\n});\\nexports.Trans = Trans;\\nconst ZoomType = Object.freeze({\\n  none: \"NoVary\",\\n  fitP: \"FitPage\",\\n  fitW: \"FitWidth\",\\n  fitH: \"FitHeight\",\\n  fitV: \"FitVisibleWidth\",\\n  pref: \"Preferred\",\\n  refW: \"ReflowWidth\"\\n});\\nexports.ZoomType = ZoomType;\\nconst GlobalConstants = Object.freeze({\\n  IDS_GREATER_THAN: \"Invalid value: must be greater than or equal to % s.\",\\n  IDS_GT_AND_LT: \"Invalid value: must be greater than or equal to % s \" + \"and less than or equal to % s.\",\\n  IDS_LESS_THAN: \"Invalid value: must be less than or equal to % s.\",\\n  IDS_INVALID_MONTH: \"** Invalid **\",\\n  IDS_INVALID_DATE: \"Invalid date / time: please ensure that the date / time exists.Field\",\\n  IDS_INVALID_DATE2: \" should match format \",\\n  IDS_INVALID_VALUE: \"The value entered does not match the format of the field\",\\n  IDS_AM: \"am\",\\n  IDS_PM: \"pm\",\\n  IDS_MONTH_INFO: \"January[1] February[2] March[3] April[4] May[5] \" + \"June[6] July[7] August[8] September[9] October[10] \" + \"November[11] December[12] Sept[9] Jan[1] Feb[2] Mar[3] \" + \"Apr[4] Jun[6] Jul[7] Aug[8] Sep[9] Oct[10] Nov[11] Dec[12]\",\\n  IDS_STARTUP_CONSOLE_MSG: \"** ^ _ ^ **\",\\n  RE_NUMBER_ENTRY_DOT_SEP: [\"[+-]?\\\\\\\\d*\\\\\\\\.?\\\\\\\\d*\"],\\n  RE_NUMBER_COMMIT_DOT_SEP: [\"[+-]?\\\\\\\\d+(\\\\\\\\.\\\\\\\\d+)?\", \"[+-]?\\\\\\\\.\\\\\\\\d+\", \"[+-]?\\\\\\\\d+\\\\\\\\.\"],\\n  RE_NUMBER_ENTRY_COMMA_SEP: [\"[+-]?\\\\\\\\d*,?\\\\\\\\d*\"],\\n  RE_NUMBER_COMMIT_COMMA_SEP: [\"[+-]?\\\\\\\\d+([.,]\\\\\\\\d+)?\", \"[+-]?[.,]\\\\\\\\d+\", \"[+-]?\\\\\\\\d+[.,]\"],\\n  RE_ZIP_ENTRY: [\"\\\\\\\\d{0,5}\"],\\n  RE_ZIP_COMMIT: [\"\\\\\\\\d{5}\"],\\n  RE_ZIP4_ENTRY: [\"\\\\\\\\d{0,5}(\\\\\\\\.|[- ])?\\\\\\\\d{0,4}\"],\\n  RE_ZIP4_COMMIT: [\"\\\\\\\\d{5}(\\\\\\\\.|[- ])?\\\\\\\\d{4}\"],\\n  RE_PHONE_ENTRY: [\"\\\\\\\\d{0,3}(\\\\\\\\.|[- ])?\\\\\\\\d{0,3}(\\\\\\\\.|[- ])?\\\\\\\\d{0,4}\", \"\\\\\\\\(\\\\\\\\d{0,3}\", \"\\\\\\\\(\\\\\\\\d{0,3}\\\\\\\\)(\\\\\\\\.|[- ])?\\\\\\\\d{0,3}(\\\\\\\\.|[- ])?\\\\\\\\d{0,4}\", \"\\\\\\\\(\\\\\\\\d{0,3}(\\\\\\\\.|[- ])?\\\\\\\\d{0,3}(\\\\\\\\.|[- ])?\\\\\\\\d{0,4}\", \"\\\\\\\\d{0,3}\\\\\\\\)(\\\\\\\\.|[- ])?\\\\\\\\d{0,3}(\\\\\\\\.|[- ])?\\\\\\\\d{0,4}\", \"011(\\\\\\\\.|[- \\\\\\\\d])*\"],\\n  RE_PHONE_COMMIT: [\"\\\\\\\\d{3}(\\\\\\\\.|[- ])?\\\\\\\\d{4}\", \"\\\\\\\\d{3}(\\\\\\\\.|[- ])?\\\\\\\\d{3}(\\\\\\\\.|[- ])?\\\\\\\\d{4}\", \"\\\\\\\\(\\\\\\\\d{3}\\\\\\\\)(\\\\\\\\.|[- ])?\\\\\\\\d{3}(\\\\\\\\.|[- ])?\\\\\\\\d{4}\", \"011(\\\\\\\\.|[- \\\\\\\\d])*\"],\\n  RE_SSN_ENTRY: [\"\\\\\\\\d{0,3}(\\\\\\\\.|[- ])?\\\\\\\\d{0,2}(\\\\\\\\.|[- ])?\\\\\\\\d{0,4}\"],\\n  RE_SSN_COMMIT: [\"\\\\\\\\d{3}(\\\\\\\\.|[- ])?\\\\\\\\d{2}(\\\\\\\\.|[- ])?\\\\\\\\d{4}\"]\\n});\\nexports.GlobalConstants = GlobalConstants;\\n\\n/***/ }),\\n/* 3 */\\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\\n\\n\\n\\nObject.defineProperty(exports, \"__esModule\", ({\\n  value: true\\n}));\\nexports.RadioButtonField = exports.Field = exports.CheckboxField = void 0;\\n\\nvar _common = __w_pdfjs_require__(4);\\n\\nvar _color = __w_pdfjs_require__(5);\\n\\nvar _pdf_object = __w_pdfjs_require__(7);\\n\\nclass Field extends _pdf_object.PDFObject {\\n  constructor(data) {\\n    super(data);\\n    this.alignment = data.alignment || \"left\";\\n    this.borderStyle = data.borderStyle || \"\";\\n    this.buttonAlignX = data.buttonAlignX || 50;\\n    this.buttonAlignY = data.buttonAlignY || 50;\\n    this.buttonFitBounds = data.buttonFitBounds;\\n    this.buttonPosition = data.buttonPosition;\\n    this.buttonScaleHow = data.buttonScaleHow;\\n    this.ButtonScaleWhen = data.buttonScaleWhen;\\n    this.calcOrderIndex = data.calcOrderIndex;\\n    this.charLimit = data.charLimit;\\n    this.comb = data.comb;\\n    this.commitOnSelChange = data.commitOnSelChange;\\n    this.currentValueIndices = data.currentValueIndices;\\n    this.defaultStyle = data.defaultStyle;\\n    this.defaultValue = data.defaultValue;\\n    this.doNotScroll = data.doNotScroll;\\n    this.doNotSpellCheck = data.doNotSpellCheck;\\n    this.delay = data.delay;\\n    this.display = data.display;\\n    this.doc = data.doc.wrapped;\\n    this.editable = data.editable;\\n    this.exportValues = data.exportValues;\\n    this.fileSelect = data.fileSelect;\\n    this.hidden = data.hidden;\\n    this.highlight = data.highlight;\\n    this.lineWidth = data.lineWidth;\\n    this.multiline = data.multiline;\\n    this.multipleSelection = !!data.multipleSelection;\\n    this.name = data.name;\\n    this.page = data.page;\\n    this.password = data.password;\\n    this.print = data.print;\\n    this.radiosInUnison = data.radiosInUnison;\\n    this.readonly = data.readonly;\\n    this.rect = data.rect;\\n    this.required = data.required;\\n    this.richText = data.richText;\\n    this.richValue = data.richValue;\\n    this.rotation = data.rotation;\\n    this.style = data.style;\\n    this.submitName = data.submitName;\\n    this.textFont = data.textFont;\\n    this.textSize = data.textSize;\\n    this.type = data.type;\\n    this.userName = data.userName;\\n    this._actions = (0, _common.createActionsMap)(data.actions);\\n    this._browseForFileToSubmit = data.browseForFileToSubmit || null;\\n    this._buttonCaption = null;\\n    this._buttonIcon = null;\\n    this._children = null;\\n    this._currentValueIndices = data.currentValueIndices || 0;\\n    this._document = data.doc;\\n    this._fieldPath = data.fieldPath;\\n    this._fillColor = data.fillColor || [\"T\"];\\n    this._isChoice = Array.isArray(data.items);\\n    this._items = data.items || [];\\n    this._strokeColor = data.strokeColor || [\"G\", 0];\\n    this._textColor = data.textColor || [\"G\", 0];\\n    this._value = data.value || \"\";\\n    this._valueAsString = data.valueAsString;\\n    this._kidIds = data.kidIds || null;\\n    this._fieldType = (0, _common.getFieldType)(this._actions);\\n    this._globalEval = data.globalEval;\\n    this._appObjects = data.appObjects;\\n  }\\n\\n  get currentValueIndices() {\\n    if (!this._isChoice) {\\n      return 0;\\n    }\\n\\n    return this._currentValueIndices;\\n  }\\n\\n  set currentValueIndices(indices) {\\n    if (!this._isChoice) {\\n      return;\\n    }\\n\\n    if (!Array.isArray(indices)) {\\n      indices = [indices];\\n    }\\n\\n    if (!indices.every(i => typeof i === \"number\" && Number.isInteger(i) && i >= 0 && i < this.numItems)) {\\n      return;\\n    }\\n\\n    indices.sort();\\n\\n    if (this.multipleSelection) {\\n      this._currentValueIndices = indices;\\n      this._value = [];\\n      indices.forEach(i => {\\n        this._value.push(this._items[i].displayValue);\\n      });\\n    } else {\\n      if (indices.length > 0) {\\n        indices = indices.splice(1, indices.length - 1);\\n        this._currentValueIndices = indices[0];\\n        this._value = this._items[this._currentValueIndices];\\n      }\\n    }\\n\\n    this._send({\\n      id: this._id,\\n      indices\\n    });\\n  }\\n\\n  get fillColor() {\\n    return this._fillColor;\\n  }\\n\\n  set fillColor(color) {\\n    if (_color.Color._isValidColor(color)) {\\n      this._fillColor = color;\\n    }\\n  }\\n\\n  get bgColor() {\\n    return this.fillColor;\\n  }\\n\\n  set bgColor(color) {\\n    this.fillColor = color;\\n  }\\n\\n  get numItems() {\\n    if (!this._isChoice) {\\n      throw new Error(\"Not a choice widget\");\\n    }\\n\\n    return this._items.length;\\n  }\\n\\n  set numItems(_) {\\n    throw new Error(\"field.numItems is read-only\");\\n  }\\n\\n  get strokeColor() {\\n    return this._strokeColor;\\n  }\\n\\n  set strokeColor(color) {\\n    if (_color.Color._isValidColor(color)) {\\n      this._strokeColor = color;\\n    }\\n  }\\n\\n  get borderColor() {\\n    return this.strokeColor;\\n  }\\n\\n  set borderColor(color) {\\n    this.strokeColor = color;\\n  }\\n\\n  get textColor() {\\n    return this._textColor;\\n  }\\n\\n  set textColor(color) {\\n    if (_color.Color._isValidColor(color)) {\\n      this._textColor = color;\\n    }\\n  }\\n\\n  get fgColor() {\\n    return this.textColor;\\n  }\\n\\n  set fgColor(color) {\\n    this.textColor = color;\\n  }\\n\\n  get value() {\\n    return this._value;\\n  }\\n\\n  set value(value) {\\n    if (value === \"\") {\\n      this._value = \"\";\\n    } else if (typeof value === \"string\") {\\n      switch (this._fieldType) {\\n        case _common.FieldType.number:\\n        case _common.FieldType.percent:\\n          value = parseFloat(value);\\n\\n          if (!isNaN(value)) {\\n            this._value = value;\\n          }\\n\\n          break;\\n\\n        default:\\n          this._value = value;\\n      }\\n    } else {\\n      this._value = value;\\n    }\\n\\n    if (this._isChoice) {\\n      if (this.multipleSelection) {\\n        const values = new Set(value);\\n        this._currentValueIndices.length = 0;\\n\\n        this._items.forEach(({\\n          displayValue\\n        }, i) => {\\n          if (values.has(displayValue)) {\\n            this._currentValueIndices.push(i);\\n          }\\n        });\\n      } else {\\n        this._currentValueIndices = this._items.findIndex(({\\n          displayValue\\n        }) => value === displayValue);\\n      }\\n    }\\n  }\\n\\n  get valueAsString() {\\n    return this._valueAsString;\\n  }\\n\\n  set valueAsString(val) {\\n    this._valueAsString = val ? val.toString() : \"\";\\n  }\\n\\n  browseForFileToSubmit() {\\n    if (this._browseForFileToSubmit) {\\n      this._browseForFileToSubmit();\\n    }\\n  }\\n\\n  buttonGetCaption(nFace = 0) {\\n    if (this._buttonCaption) {\\n      return this._buttonCaption[nFace];\\n    }\\n\\n    return \"\";\\n  }\\n\\n  buttonGetIcon(nFace = 0) {\\n    if (this._buttonIcon) {\\n      return this._buttonIcon[nFace];\\n    }\\n\\n    return null;\\n  }\\n\\n  buttonImportIcon(cPath = null, nPave = 0) {}\\n\\n  buttonSetCaption(cCaption, nFace = 0) {\\n    if (!this._buttonCaption) {\\n      this._buttonCaption = [\"\", \"\", \"\"];\\n    }\\n\\n    this._buttonCaption[nFace] = cCaption;\\n  }\\n\\n  buttonSetIcon(oIcon, nFace = 0) {\\n    if (!this._buttonIcon) {\\n      this._buttonIcon = [null, null, null];\\n    }\\n\\n    this._buttonIcon[nFace] = oIcon;\\n  }\\n\\n  checkThisBox(nWidget, bCheckIt = true) {}\\n\\n  clearItems() {\\n    if (!this._isChoice) {\\n      throw new Error(\"Not a choice widget\");\\n    }\\n\\n    this._items = [];\\n\\n    this._send({\\n      id: this._id,\\n      clear: null\\n    });\\n  }\\n\\n  deleteItemAt(nIdx = null) {\\n    if (!this._isChoice) {\\n      throw new Error(\"Not a choice widget\");\\n    }\\n\\n    if (!this.numItems) {\\n      return;\\n    }\\n\\n    if (nIdx === null) {\\n      nIdx = Array.isArray(this._currentValueIndices) ? this._currentValueIndices[0] : this._currentValueIndices;\\n      nIdx = nIdx || 0;\\n    }\\n\\n    if (nIdx < 0 || nIdx >= this.numItems) {\\n      nIdx = this.numItems - 1;\\n    }\\n\\n    this._items.splice(nIdx, 1);\\n\\n    if (Array.isArray(this._currentValueIndices)) {\\n      let index = this._currentValueIndices.findIndex(i => i >= nIdx);\\n\\n      if (index !== -1) {\\n        if (this._currentValueIndices[index] === nIdx) {\\n          this._currentValueIndices.splice(index, 1);\\n        }\\n\\n        for (const ii = this._currentValueIndices.length; index < ii; index++) {\\n          --this._currentValueIndices[index];\\n        }\\n      }\\n    } else {\\n      if (this._currentValueIndices === nIdx) {\\n        this._currentValueIndices = this.numItems > 0 ? 0 : -1;\\n      } else if (this._currentValueIndices > nIdx) {\\n        --this._currentValueIndices;\\n      }\\n    }\\n\\n    this._send({\\n      id: this._id,\\n      remove: nIdx\\n    });\\n  }\\n\\n  getItemAt(nIdx = -1, bExportValue = false) {\\n    if (!this._isChoice) {\\n      throw new Error(\"Not a choice widget\");\\n    }\\n\\n    if (nIdx < 0 || nIdx >= this.numItems) {\\n      nIdx = this.numItems - 1;\\n    }\\n\\n    const item = this._items[nIdx];\\n    return bExportValue ? item.exportValue : item.displayValue;\\n  }\\n\\n  getArray() {\\n    if (this._kidIds) {\\n      return this._kidIds.map(id => this._appObjects[id].wrapped);\\n    }\\n\\n    if (this._children === null) {\\n      this._children = this._document.obj._getChildren(this._fieldPath);\\n    }\\n\\n    return this._children;\\n  }\\n\\n  getLock() {\\n    return undefined;\\n  }\\n\\n  isBoxChecked(nWidget) {\\n    return false;\\n  }\\n\\n  isDefaultChecked(nWidget) {\\n    return false;\\n  }\\n\\n  insertItemAt(cName, cExport = undefined, nIdx = 0) {\\n    if (!this._isChoice) {\\n      throw new Error(\"Not a choice widget\");\\n    }\\n\\n    if (!cName) {\\n      return;\\n    }\\n\\n    if (nIdx < 0 || nIdx > this.numItems) {\\n      nIdx = this.numItems;\\n    }\\n\\n    if (this._items.some(({\\n      displayValue\\n    }) => displayValue === cName)) {\\n      return;\\n    }\\n\\n    if (cExport === undefined) {\\n      cExport = cName;\\n    }\\n\\n    const data = {\\n      displayValue: cName,\\n      exportValue: cExport\\n    };\\n\\n    this._items.splice(nIdx, 0, data);\\n\\n    if (Array.isArray(this._currentValueIndices)) {\\n      let index = this._currentValueIndices.findIndex(i => i >= nIdx);\\n\\n      if (index !== -1) {\\n        for (const ii = this._currentValueIndices.length; index < ii; index++) {\\n          ++this._currentValueIndices[index];\\n        }\\n      }\\n    } else if (this._currentValueIndices >= nIdx) {\\n      ++this._currentValueIndices;\\n    }\\n\\n    this._send({\\n      id: this._id,\\n      insert: {\\n        index: nIdx,\\n        ...data\\n      }\\n    });\\n  }\\n\\n  setAction(cTrigger, cScript) {\\n    if (typeof cTrigger !== \"string\" || typeof cScript !== \"string\") {\\n      return;\\n    }\\n\\n    if (!(cTrigger in this._actions)) {\\n      this._actions[cTrigger] = [];\\n    }\\n\\n    this._actions[cTrigger].push(cScript);\\n  }\\n\\n  setFocus() {\\n    this._send({\\n      id: this._id,\\n      focus: true\\n    });\\n  }\\n\\n  setItems(oArray) {\\n    if (!this._isChoice) {\\n      throw new Error(\"Not a choice widget\");\\n    }\\n\\n    this._items.length = 0;\\n\\n    for (const element of oArray) {\\n      let displayValue, exportValue;\\n\\n      if (Array.isArray(element)) {\\n        displayValue = element[0]?.toString() || \"\";\\n        exportValue = element[1]?.toString() || \"\";\\n      } else {\\n        displayValue = exportValue = element?.toString() || \"\";\\n      }\\n\\n      this._items.push({\\n        displayValue,\\n        exportValue\\n      });\\n    }\\n\\n    this._currentValueIndices = 0;\\n\\n    this._send({\\n      id: this._id,\\n      items: this._items\\n    });\\n  }\\n\\n  setLock() {}\\n\\n  signatureGetModifications() {}\\n\\n  signatureGetSeedValue() {}\\n\\n  signatureInfo() {}\\n\\n  signatureSetSeedValue() {}\\n\\n  signatureSign() {}\\n\\n  signatureValidate() {}\\n\\n  _isButton() {\\n    return false;\\n  }\\n\\n  _runActions(event) {\\n    const eventName = event.name;\\n\\n    if (!this._actions.has(eventName)) {\\n      return false;\\n    }\\n\\n    const actions = this._actions.get(eventName);\\n\\n    try {\\n      for (const action of actions) {\\n        this._globalEval(action);\\n      }\\n    } catch (error) {\\n      event.rc = false;\\n      throw error;\\n    }\\n\\n    return true;\\n  }\\n\\n}\\n\\nexports.Field = Field;\\n\\nclass RadioButtonField extends Field {\\n  constructor(otherButtons, data) {\\n    super(data);\\n    this.exportValues = [this.exportValues];\\n    this._radioIds = [this._id];\\n    this._radioActions = [this._actions];\\n\\n    for (const radioData of otherButtons) {\\n      this.exportValues.push(radioData.exportValues);\\n\\n      this._radioIds.push(radioData.id);\\n\\n      this._radioActions.push((0, _common.createActionsMap)(radioData.actions));\\n\\n      if (this._value === radioData.exportValues) {\\n        this._id = radioData.id;\\n      }\\n    }\\n  }\\n\\n  get value() {\\n    return this._value;\\n  }\\n\\n  set value(value) {\\n    if (value === null) {\\n      this._value = \"\";\\n    }\\n\\n    const i = this.exportValues.indexOf(value);\\n\\n    if (0 <= i && i < this._radioIds.length) {\\n      this._id = this._radioIds[i];\\n      this._value = value;\\n    } else if (value === \"Off\" && this._radioIds.length === 2) {\\n      const nextI = (1 + this._radioIds.indexOf(this._id)) % 2;\\n      this._id = this._radioIds[nextI];\\n      this._value = this.exportValues[nextI];\\n    }\\n  }\\n\\n  checkThisBox(nWidget, bCheckIt = true) {\\n    if (nWidget < 0 || nWidget >= this._radioIds.length || !bCheckIt) {\\n      return;\\n    }\\n\\n    this._id = this._radioIds[nWidget];\\n    this._value = this.exportValues[nWidget];\\n\\n    this._send({\\n      id: this._id,\\n      value: this._value\\n    });\\n  }\\n\\n  isBoxChecked(nWidget) {\\n    return nWidget >= 0 && nWidget < this._radioIds.length && this._id === this._radioIds[nWidget];\\n  }\\n\\n  isDefaultChecked(nWidget) {\\n    return nWidget >= 0 && nWidget < this.exportValues.length && this.defaultValue === this.exportValues[nWidget];\\n  }\\n\\n  _getExportValue(state) {\\n    const i = this._radioIds.indexOf(this._id);\\n\\n    return this.exportValues[i];\\n  }\\n\\n  _runActions(event) {\\n    const i = this._radioIds.indexOf(this._id);\\n\\n    this._actions = this._radioActions[i];\\n    return super._runActions(event);\\n  }\\n\\n  _isButton() {\\n    return true;\\n  }\\n\\n}\\n\\nexports.RadioButtonField = RadioButtonField;\\n\\nclass CheckboxField extends RadioButtonField {\\n  get value() {\\n    return this._value;\\n  }\\n\\n  set value(value) {\\n    if (value === \"Off\") {\\n      this._value = \"Off\";\\n    } else {\\n      super.value = value;\\n    }\\n  }\\n\\n  _getExportValue(state) {\\n    return state ? super._getExportValue(state) : \"Off\";\\n  }\\n\\n  isBoxChecked(nWidget) {\\n    if (this._value === \"Off\") {\\n      return false;\\n    }\\n\\n    return super.isBoxChecked(nWidget);\\n  }\\n\\n  isDefaultChecked(nWidget) {\\n    if (this.defaultValue === \"Off\") {\\n      return this._value === \"Off\";\\n    }\\n\\n    return super.isDefaultChecked(nWidget);\\n  }\\n\\n  checkThisBox(nWidget, bCheckIt = true) {\\n    if (nWidget < 0 || nWidget >= this._radioIds.length) {\\n      return;\\n    }\\n\\n    this._id = this._radioIds[nWidget];\\n    this._value = bCheckIt ? this.exportValues[nWidget] : \"Off\";\\n\\n    this._send({\\n      id: this._id,\\n      value: this._value\\n    });\\n  }\\n\\n}\\n\\nexports.CheckboxField = CheckboxField;\\n\\n/***/ }),\\n/* 4 */\\n/***/ ((__unused_webpack_module, exports) => {\\n\\n\\n\\nObject.defineProperty(exports, \"__esModule\", ({\\n  value: true\\n}));\\nexports.createActionsMap = createActionsMap;\\nexports.getFieldType = getFieldType;\\nexports.FieldType = void 0;\\nconst FieldType = {\\n  none: 0,\\n  number: 1,\\n  percent: 2,\\n  date: 3,\\n  time: 4\\n};\\nexports.FieldType = FieldType;\\n\\nfunction createActionsMap(actions) {\\n  const actionsMap = new Map();\\n\\n  if (actions) {\\n    for (const [eventType, actionsForEvent] of Object.entries(actions)) {\\n      actionsMap.set(eventType, actionsForEvent);\\n    }\\n  }\\n\\n  return actionsMap;\\n}\\n\\nfunction getFieldType(actions) {\\n  let format = actions.get(\"Format\");\\n\\n  if (!format) {\\n    return FieldType.none;\\n  }\\n\\n  format = format[0];\\n  format = format.trim();\\n\\n  if (format.startsWith(\"AFNumber_\")) {\\n    return FieldType.number;\\n  }\\n\\n  if (format.startsWith(\"AFPercent_\")) {\\n    return FieldType.percent;\\n  }\\n\\n  if (format.startsWith(\"AFDate_\")) {\\n    return FieldType.date;\\n  }\\n\\n  if (format.startsWith(\"AFTime__\")) {\\n    return FieldType.time;\\n  }\\n\\n  return FieldType.none;\\n}\\n\\n/***/ }),\\n/* 5 */\\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\\n\\n\\n\\nObject.defineProperty(exports, \"__esModule\", ({\\n  value: true\\n}));\\nexports.Color = void 0;\\n\\nvar _scripting_utils = __w_pdfjs_require__(6);\\n\\nvar _pdf_object = __w_pdfjs_require__(7);\\n\\nclass Color extends _pdf_object.PDFObject {\\n  constructor() {\\n    super({});\\n    this.transparent = [\"T\"];\\n    this.black = [\"G\", 0];\\n    this.white = [\"G\", 1];\\n    this.red = [\"RGB\", 1, 0, 0];\\n    this.green = [\"RGB\", 0, 1, 0];\\n    this.blue = [\"RGB\", 0, 0, 1];\\n    this.cyan = [\"CMYK\", 1, 0, 0, 0];\\n    this.magenta = [\"CMYK\", 0, 1, 0, 0];\\n    this.yellow = [\"CMYK\", 0, 0, 1, 0];\\n    this.dkGray = [\"G\", 0.25];\\n    this.gray = [\"G\", 0.5];\\n    this.ltGray = [\"G\", 0.75];\\n  }\\n\\n  static _isValidSpace(cColorSpace) {\\n    return typeof cColorSpace === \"string\" && (cColorSpace === \"T\" || cColorSpace === \"G\" || cColorSpace === \"RGB\" || cColorSpace === \"CMYK\");\\n  }\\n\\n  static _isValidColor(colorArray) {\\n    if (!Array.isArray(colorArray) || colorArray.length === 0) {\\n      return false;\\n    }\\n\\n    const space = colorArray[0];\\n\\n    if (!Color._isValidSpace(space)) {\\n      return false;\\n    }\\n\\n    switch (space) {\\n      case \"T\":\\n        if (colorArray.length !== 1) {\\n          return false;\\n        }\\n\\n        break;\\n\\n      case \"G\":\\n        if (colorArray.length !== 2) {\\n          return false;\\n        }\\n\\n        break;\\n\\n      case \"RGB\":\\n        if (colorArray.length !== 4) {\\n          return false;\\n        }\\n\\n        break;\\n\\n      case \"CMYK\":\\n        if (colorArray.length !== 5) {\\n          return false;\\n        }\\n\\n        break;\\n\\n      default:\\n        return false;\\n    }\\n\\n    return colorArray.slice(1).every(c => typeof c === \"number\" && c >= 0 && c <= 1);\\n  }\\n\\n  static _getCorrectColor(colorArray) {\\n    return Color._isValidColor(colorArray) ? colorArray : [\"G\", 0];\\n  }\\n\\n  convert(colorArray, cColorSpace) {\\n    if (!Color._isValidSpace(cColorSpace)) {\\n      return this.black;\\n    }\\n\\n    if (cColorSpace === \"T\") {\\n      return [\"T\"];\\n    }\\n\\n    colorArray = Color._getCorrectColor(colorArray);\\n\\n    if (colorArray[0] === cColorSpace) {\\n      return colorArray;\\n    }\\n\\n    if (colorArray[0] === \"T\") {\\n      return this.convert(this.black, cColorSpace);\\n    }\\n\\n    return _scripting_utils.ColorConverters[`${colorArray[0]}_${cColorSpace}`](colorArray.slice(1));\\n  }\\n\\n  equal(colorArray1, colorArray2) {\\n    colorArray1 = Color._getCorrectColor(colorArray1);\\n    colorArray2 = Color._getCorrectColor(colorArray2);\\n\\n    if (colorArray1[0] === \"T\" || colorArray2[0] === \"T\") {\\n      return colorArray1[0] === \"T\" && colorArray2[0] === \"T\";\\n    }\\n\\n    if (colorArray1[0] !== colorArray2[0]) {\\n      colorArray2 = this.convert(colorArray2, colorArray1[0]);\\n    }\\n\\n    return colorArray1.slice(1).every((c, i) => c === colorArray2[i + 1]);\\n  }\\n\\n}\\n\\nexports.Color = Color;\\n\\n/***/ }),\\n/* 6 */\\n/***/ ((__unused_webpack_module, exports) => {\\n\\n\\n\\nObject.defineProperty(exports, \"__esModule\", ({\\n  value: true\\n}));\\nexports.ColorConverters = void 0;\\n\\nfunction makeColorComp(n) {\\n  return Math.floor(Math.max(0, Math.min(1, n)) * 255).toString(16).padStart(2, \"0\");\\n}\\n\\nclass ColorConverters {\\n  static CMYK_G([c, y, m, k]) {\\n    return [\"G\", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)];\\n  }\\n\\n  static G_CMYK([g]) {\\n    return [\"CMYK\", 0, 0, 0, 1 - g];\\n  }\\n\\n  static G_RGB([g]) {\\n    return [\"RGB\", g, g, g];\\n  }\\n\\n  static G_HTML([g]) {\\n    const G = makeColorComp(g);\\n    return `#${G}${G}${G}`;\\n  }\\n\\n  static RGB_G([r, g, b]) {\\n    return [\"G\", 0.3 * r + 0.59 * g + 0.11 * b];\\n  }\\n\\n  static RGB_HTML([r, g, b]) {\\n    const R = makeColorComp(r);\\n    const G = makeColorComp(g);\\n    const B = makeColorComp(b);\\n    return `#${R}${G}${B}`;\\n  }\\n\\n  static T_HTML() {\\n    return \"#00000000\";\\n  }\\n\\n  static CMYK_RGB([c, y, m, k]) {\\n    return [\"RGB\", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)];\\n  }\\n\\n  static CMYK_HTML(components) {\\n    return this.RGB_HTML(this.CMYK_RGB(components));\\n  }\\n\\n  static RGB_CMYK([r, g, b]) {\\n    const c = 1 - r;\\n    const m = 1 - g;\\n    const y = 1 - b;\\n    const k = Math.min(c, m, y);\\n    return [\"CMYK\", c, m, y, k];\\n  }\\n\\n}\\n\\nexports.ColorConverters = ColorConverters;\\n\\n/***/ }),\\n/* 7 */\\n/***/ ((__unused_webpack_module, exports) => {\\n\\n\\n\\nObject.defineProperty(exports, \"__esModule\", ({\\n  value: true\\n}));\\nexports.PDFObject = void 0;\\n\\nclass PDFObject {\\n  constructor(data) {\\n    this._expandos = Object.create(null);\\n    this._send = data.send || null;\\n    this._id = data.id || null;\\n  }\\n\\n}\\n\\nexports.PDFObject = PDFObject;\\n\\n/***/ }),\\n/* 8 */\\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\\n\\n\\n\\nObject.defineProperty(exports, \"__esModule\", ({\\n  value: true\\n}));\\nexports.AForm = void 0;\\n\\nvar _constants = __w_pdfjs_require__(2);\\n\\nclass AForm {\\n  constructor(document, app, util, color) {\\n    this._document = document;\\n    this._app = app;\\n    this._util = util;\\n    this._color = color;\\n    this._dateFormats = [\"m/d\", \"m/d/yy\", \"mm/dd/yy\", \"mm/yy\", \"d-mmm\", \"d-mmm-yy\", \"dd-mmm-yy\", \"yy-mm-dd\", \"mmm-yy\", \"mmmm-yy\", \"mmm d, yyyy\", \"mmmm d, yyyy\", \"m/d/yy h:MM tt\", \"m/d/yy HH:MM\"];\\n    this._timeFormats = [\"HH:MM\", \"h:MM tt\", \"HH:MM:ss\", \"h:MM:ss tt\"];\\n    this._emailRegex = new RegExp(\"^[a-zA-Z0-9.!#$%&\\'*+\\\\\\\\/=?^_`{|}~-]+\" + \"@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\" + \"(?:\\\\\\\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$\");\\n  }\\n\\n  _mkTargetName(event) {\\n    return event.target ? `[ ${event.target.name} ]` : \"\";\\n  }\\n\\n  _parseDate(cFormat, cDate) {\\n    const ddate = Date.parse(cDate);\\n\\n    if (isNaN(ddate)) {\\n      try {\\n        return this._util.scand(cFormat, cDate);\\n      } catch (error) {\\n        return null;\\n      }\\n    } else {\\n      return new Date(ddate);\\n    }\\n  }\\n\\n  AFMergeChange(event = globalThis.event) {\\n    if (event.willCommit) {\\n      return event.value.toString();\\n    }\\n\\n    return this._app._eventDispatcher.mergeChange(event);\\n  }\\n\\n  AFParseDateEx(cString, cOrder) {\\n    return this._parseDate(cOrder, cString);\\n  }\\n\\n  AFExtractNums(str) {\\n    if (typeof str === \"number\") {\\n      return [str];\\n    }\\n\\n    if (!str || typeof str !== \"string\") {\\n      return null;\\n    }\\n\\n    const first = str.charAt(0);\\n\\n    if (first === \".\" || first === \",\") {\\n      str = `0${str}`;\\n    }\\n\\n    const numbers = str.match(/([0-9]+)/g);\\n\\n    if (numbers.length === 0) {\\n      return null;\\n    }\\n\\n    return numbers;\\n  }\\n\\n  AFMakeNumber(str) {\\n    if (typeof str === \"number\") {\\n      return str;\\n    }\\n\\n    if (typeof str !== \"string\") {\\n      return null;\\n    }\\n\\n    str = str.trim().replace(\",\", \".\");\\n    const number = parseFloat(str);\\n\\n    if (isNaN(number) || !isFinite(number)) {\\n      return null;\\n    }\\n\\n    return number;\\n  }\\n\\n  AFMakeArrayFromList(string) {\\n    if (typeof string === \"string\") {\\n      return string.split(/, ?/g);\\n    }\\n\\n    return string;\\n  }\\n\\n  AFNumber_Format(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend) {\\n    const event = globalThis.event;\\n\\n    if (!event.value) {\\n      return;\\n    }\\n\\n    let value = this.AFMakeNumber(event.value);\\n\\n    if (value === null) {\\n      event.value = \"\";\\n      return;\\n    }\\n\\n    const sign = Math.sign(value);\\n    const buf = [];\\n    let hasParen = false;\\n\\n    if (sign === -1 && bCurrencyPrepend && negStyle === 0) {\\n      buf.push(\"-\");\\n    }\\n\\n    if ((negStyle === 2 || negStyle === 3) && sign === -1) {\\n      buf.push(\"(\");\\n      hasParen = true;\\n    }\\n\\n    if (bCurrencyPrepend) {\\n      buf.push(strCurrency);\\n    }\\n\\n    sepStyle = Math.min(Math.max(0, Math.floor(sepStyle)), 4);\\n    buf.push(\"%,\");\\n    buf.push(sepStyle);\\n    buf.push(\".\");\\n    buf.push(nDec.toString());\\n    buf.push(\"f\");\\n\\n    if (!bCurrencyPrepend) {\\n      buf.push(strCurrency);\\n    }\\n\\n    if (hasParen) {\\n      buf.push(\")\");\\n    }\\n\\n    if (negStyle === 1 || negStyle === 3) {\\n      event.target.textColor = sign === 1 ? this._color.black : this._color.red;\\n    }\\n\\n    if ((negStyle !== 0 || bCurrencyPrepend) && sign === -1) {\\n      value = -value;\\n    }\\n\\n    const formatStr = buf.join(\"\");\\n    event.value = this._util.printf(formatStr, value);\\n  }\\n\\n  AFNumber_Keystroke(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend) {\\n    const event = globalThis.event;\\n    let value = this.AFMergeChange(event);\\n\\n    if (!value) {\\n      return;\\n    }\\n\\n    value = value.trim();\\n    let pattern;\\n\\n    if (sepStyle > 1) {\\n      pattern = event.willCommit ? /^[+-]?([0-9]+(,[0-9]*)?|,[0-9]+)$/ : /^[+-]?[0-9]*,?[0-9]*$/;\\n    } else {\\n      pattern = event.willCommit ? /^[+-]?([0-9]+(\\\\.[0-9]*)?|\\\\.[0-9]+)$/ : /^[+-]?[0-9]*\\\\.?[0-9]*$/;\\n    }\\n\\n    if (!pattern.test(value)) {\\n      if (event.willCommit) {\\n        const err = `${_constants.GlobalConstants.IDS_INVALID_VALUE} ${this._mkTargetName(event)}`;\\n\\n        this._app.alert(err);\\n      }\\n\\n      event.rc = false;\\n    }\\n\\n    if (event.willCommit && sepStyle > 1) {\\n      event.value = parseFloat(value.replace(\",\", \".\"));\\n    }\\n  }\\n\\n  AFPercent_Format(nDec, sepStyle, percentPrepend = false) {\\n    if (typeof nDec !== \"number\") {\\n      return;\\n    }\\n\\n    if (typeof sepStyle !== \"number\") {\\n      return;\\n    }\\n\\n    if (nDec < 0) {\\n      throw new Error(\"Invalid nDec value in AFPercent_Format\");\\n    }\\n\\n    const event = globalThis.event;\\n\\n    if (nDec > 512) {\\n      event.value = \"%\";\\n      return;\\n    }\\n\\n    nDec = Math.floor(nDec);\\n    sepStyle = Math.min(Math.max(0, Math.floor(sepStyle)), 4);\\n    let value = this.AFMakeNumber(event.value);\\n\\n    if (value === null) {\\n      event.value = \"%\";\\n      return;\\n    }\\n\\n    const formatStr = `%,${sepStyle}.${nDec}f`;\\n    value = this._util.printf(formatStr, value * 100);\\n\\n    if (percentPrepend) {\\n      event.value = `%${value}`;\\n    } else {\\n      event.value = `${value}%`;\\n    }\\n  }\\n\\n  AFPercent_Keystroke(nDec, sepStyle) {\\n    this.AFNumber_Keystroke(nDec, sepStyle, 0, 0, \"\", true);\\n  }\\n\\n  AFDate_FormatEx(cFormat) {\\n    const event = globalThis.event;\\n    const value = event.value;\\n\\n    if (!value) {\\n      return;\\n    }\\n\\n    const date = this._parseDate(cFormat, value);\\n\\n    if (date !== null) {\\n      event.value = this._util.printd(cFormat, date);\\n    }\\n  }\\n\\n  AFDate_Format(pdf) {\\n    if (pdf >= 0 && pdf < this._dateFormats.length) {\\n      this.AFDate_FormatEx(this._dateFormats[pdf]);\\n    }\\n  }\\n\\n  AFDate_KeystrokeEx(cFormat) {\\n    const event = globalThis.event;\\n\\n    if (!event.willCommit) {\\n      return;\\n    }\\n\\n    const value = this.AFMergeChange(event);\\n\\n    if (!value) {\\n      return;\\n    }\\n\\n    if (this._parseDate(cFormat, value) === null) {\\n      const invalid = _constants.GlobalConstants.IDS_INVALID_DATE;\\n      const invalid2 = _constants.GlobalConstants.IDS_INVALID_DATE2;\\n      const err = `${invalid} ${this._mkTargetName(event)}${invalid2}${cFormat}`;\\n\\n      this._app.alert(err);\\n\\n      event.rc = false;\\n    }\\n  }\\n\\n  AFDate_Keystroke(pdf) {\\n    if (pdf >= 0 && pdf < this._dateFormats.length) {\\n      this.AFDate_KeystrokeEx(this._dateFormats[pdf]);\\n    }\\n  }\\n\\n  AFRange_Validate(bGreaterThan, nGreaterThan, bLessThan, nLessThan) {\\n    const event = globalThis.event;\\n\\n    if (!event.value) {\\n      return;\\n    }\\n\\n    const value = this.AFMakeNumber(event.value);\\n\\n    if (value === null) {\\n      return;\\n    }\\n\\n    bGreaterThan = !!bGreaterThan;\\n    bLessThan = !!bLessThan;\\n\\n    if (bGreaterThan) {\\n      nGreaterThan = this.AFMakeNumber(nGreaterThan);\\n\\n      if (nGreaterThan === null) {\\n        return;\\n      }\\n    }\\n\\n    if (bLessThan) {\\n      nLessThan = this.AFMakeNumber(nLessThan);\\n\\n      if (nLessThan === null) {\\n        return;\\n      }\\n    }\\n\\n    let err = \"\";\\n\\n    if (bGreaterThan && bLessThan) {\\n      if (value < nGreaterThan || value > nLessThan) {\\n        err = this._util.printf(_constants.GlobalConstants.IDS_GT_AND_LT, nGreaterThan, nLessThan);\\n      }\\n    } else if (bGreaterThan) {\\n      if (value < nGreaterThan) {\\n        err = this._util.printf(_constants.GlobalConstants.IDS_GREATER_THAN, nGreaterThan);\\n      }\\n    } else if (value > nLessThan) {\\n      err = this._util.printf(_constants.GlobalConstants.IDS_LESS_THAN, nLessThan);\\n    }\\n\\n    if (err) {\\n      this._app.alert(err);\\n\\n      event.rc = false;\\n    }\\n  }\\n\\n  AFSimple(cFunction, nValue1, nValue2) {\\n    const value1 = this.AFMakeNumber(nValue1);\\n\\n    if (value1 === null) {\\n      throw new Error(\"Invalid nValue1 in AFSimple\");\\n    }\\n\\n    const value2 = this.AFMakeNumber(nValue2);\\n\\n    if (value2 === null) {\\n      throw new Error(\"Invalid nValue2 in AFSimple\");\\n    }\\n\\n    switch (cFunction) {\\n      case \"AVG\":\\n        return (value1 + value2) / 2;\\n\\n      case \"SUM\":\\n        return value1 + value2;\\n\\n      case \"PRD\":\\n        return value1 * value2;\\n\\n      case \"MIN\":\\n        return Math.min(value1, value2);\\n\\n      case \"MAX\":\\n        return Math.max(value1, value2);\\n    }\\n\\n    throw new Error(\"Invalid cFunction in AFSimple\");\\n  }\\n\\n  AFSimple_Calculate(cFunction, cFields) {\\n    const actions = {\\n      AVG: args => args.reduce((acc, value) => acc + value, 0) / args.length,\\n      SUM: args => args.reduce((acc, value) => acc + value, 0),\\n      PRD: args => args.reduce((acc, value) => acc * value, 1),\\n      MIN: args => args.reduce((acc, value) => Math.min(acc, value), Number.MAX_VALUE),\\n      MAX: args => args.reduce((acc, value) => Math.max(acc, value), Number.MIN_VALUE)\\n    };\\n\\n    if (!(cFunction in actions)) {\\n      throw new TypeError(\"Invalid function in AFSimple_Calculate\");\\n    }\\n\\n    const event = globalThis.event;\\n    const values = [];\\n\\n    for (const cField of cFields) {\\n      const field = this._document.getField(cField);\\n\\n      const number = this.AFMakeNumber(field.value);\\n\\n      if (number !== null) {\\n        values.push(number);\\n      }\\n    }\\n\\n    if (values.length === 0) {\\n      event.value = cFunction === \"PRD\" ? 1 : 0;\\n      return;\\n    }\\n\\n    const res = actions[cFunction](values);\\n    event.value = Math.round(1e6 * res) / 1e6;\\n  }\\n\\n  AFSpecial_Format(psf) {\\n    const event = globalThis.event;\\n\\n    if (!event.value) {\\n      return;\\n    }\\n\\n    psf = this.AFMakeNumber(psf);\\n\\n    if (psf === null) {\\n      throw new Error(\"Invalid psf in AFSpecial_Format\");\\n    }\\n\\n    let formatStr = \"\";\\n\\n    switch (psf) {\\n      case 0:\\n        formatStr = \"99999\";\\n        break;\\n\\n      case 1:\\n        formatStr = \"99999-9999\";\\n        break;\\n\\n      case 2:\\n        if (this._util.printx(\"9999999999\", event.value).length >= 10) {\\n          formatStr = \"(999) 999-9999\";\\n        } else {\\n          formatStr = \"999-9999\";\\n        }\\n\\n        break;\\n\\n      case 3:\\n        formatStr = \"999-99-9999\";\\n        break;\\n\\n      default:\\n        throw new Error(\"Invalid psf in AFSpecial_Format\");\\n    }\\n\\n    event.value = this._util.printx(formatStr, event.value);\\n  }\\n\\n  AFSpecial_KeystrokeEx(cMask) {\\n    if (!cMask) {\\n      return;\\n    }\\n\\n    const event = globalThis.event;\\n    const value = this.AFMergeChange(event);\\n    const checkers = new Map([[\"9\", char => char >= \"0\" && char <= \"9\"], [\"A\", char => \"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\"], [\"O\", char => \"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\" || \"0\" <= char && char <= \"9\"], [\"X\", char => true]]);\\n\\n    function _checkValidity(_value, _cMask) {\\n      for (let i = 0, ii = value.length; i < ii; i++) {\\n        const mask = _cMask.charAt(i);\\n\\n        const char = _value.charAt(i);\\n\\n        const checker = checkers.get(mask);\\n\\n        if (checker) {\\n          if (!checker(char)) {\\n            return false;\\n          }\\n        } else if (mask !== char) {\\n          return false;\\n        }\\n      }\\n\\n      return true;\\n    }\\n\\n    if (!value) {\\n      return;\\n    }\\n\\n    const err = `${_constants.GlobalConstants.IDS_INVALID_VALUE} = \"${cMask}\"`;\\n\\n    if (value.length > cMask.length) {\\n      this._app.alert(err);\\n\\n      event.rc = false;\\n      return;\\n    }\\n\\n    if (event.willCommit) {\\n      if (value.length < cMask.length) {\\n        this._app.alert(err);\\n\\n        event.rc = false;\\n        return;\\n      }\\n\\n      if (!_checkValidity(value, cMask)) {\\n        this._app.alert(err);\\n\\n        event.rc = false;\\n        return;\\n      }\\n\\n      event.value += cMask.substring(value.length);\\n      return;\\n    }\\n\\n    if (value.length < cMask.length) {\\n      cMask = cMask.substring(0, value.length);\\n    }\\n\\n    if (!_checkValidity(value, cMask)) {\\n      this._app.alert(err);\\n\\n      event.rc = false;\\n    }\\n  }\\n\\n  AFSpecial_Keystroke(psf) {\\n    const event = globalThis.event;\\n\\n    if (!event.value) {\\n      return;\\n    }\\n\\n    psf = this.AFMakeNumber(psf);\\n\\n    if (psf === null) {\\n      throw new Error(\"Invalid psf in AFSpecial_Keystroke\");\\n    }\\n\\n    let formatStr;\\n\\n    switch (psf) {\\n      case 0:\\n        formatStr = \"99999\";\\n        break;\\n\\n      case 1:\\n        formatStr = \"99999-9999\";\\n        break;\\n\\n      case 2:\\n        const finalLen = event.value.length + event.change.length + event.selStart - event.selEnd;\\n\\n        if (finalLen >= 8) {\\n          formatStr = \"(999) 999-9999\";\\n        } else {\\n          formatStr = \"999-9999\";\\n        }\\n\\n        break;\\n\\n      case 3:\\n        formatStr = \"999-99-9999\";\\n        break;\\n\\n      default:\\n        throw new Error(\"Invalid psf in AFSpecial_Keystroke\");\\n    }\\n\\n    this.AFSpecial_KeystrokeEx(formatStr);\\n  }\\n\\n  AFTime_FormatEx(cFormat) {\\n    this.AFDate_FormatEx(cFormat);\\n  }\\n\\n  AFTime_Format(pdf) {\\n    if (pdf >= 0 && pdf < this._timeFormats.length) {\\n      this.AFDate_FormatEx(this._timeFormats[pdf]);\\n    }\\n  }\\n\\n  AFTime_KeystrokeEx(cFormat) {\\n    this.AFDate_KeystrokeEx(cFormat);\\n  }\\n\\n  AFTime_Keystroke(pdf) {\\n    if (pdf >= 0 && pdf < this._timeFormats.length) {\\n      this.AFDate_KeystrokeEx(this._timeFormats[pdf]);\\n    }\\n  }\\n\\n  eMailValidate(str) {\\n    return this._emailRegex.test(str);\\n  }\\n\\n}\\n\\nexports.AForm = AForm;\\n\\n/***/ }),\\n/* 9 */\\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\\n\\n\\n\\nObject.defineProperty(exports, \"__esModule\", ({\\n  value: true\\n}));\\nexports.App = void 0;\\n\\nvar _color = __w_pdfjs_require__(5);\\n\\nvar _event = __w_pdfjs_require__(10);\\n\\nvar _fullscreen = __w_pdfjs_require__(11);\\n\\nvar _pdf_object = __w_pdfjs_require__(7);\\n\\nvar _thermometer = __w_pdfjs_require__(12);\\n\\nconst VIEWER_TYPE = \"PDF.js\";\\nconst VIEWER_VARIATION = \"Full\";\\nconst VIEWER_VERSION = \"10.0\";\\nconst FORMS_VERSION = undefined;\\n\\nclass App extends _pdf_object.PDFObject {\\n  constructor(data) {\\n    super(data);\\n    this.calculate = true;\\n    this._constants = null;\\n    this._focusRect = true;\\n    this._fs = null;\\n    this._language = App._getLanguage(data.language);\\n    this._openInPlace = false;\\n    this._platform = App._getPlatform(data.platform);\\n    this._runtimeHighlight = false;\\n    this._runtimeHighlightColor = [\"T\"];\\n    this._thermometer = null;\\n    this._toolbar = false;\\n    this._document = data._document;\\n    this._proxyHandler = data.proxyHandler;\\n    this._objects = Object.create(null);\\n    this._eventDispatcher = new _event.EventDispatcher(this._document, data.calculationOrder, this._objects);\\n    this._timeoutIds = new WeakMap();\\n\\n    if (typeof FinalizationRegistry !== \"undefined\") {\\n      this._timeoutIdsRegistry = new FinalizationRegistry(this._cleanTimeout.bind(this));\\n    } else {\\n      this._timeoutIdsRegistry = null;\\n    }\\n\\n    this._timeoutCallbackIds = new Map();\\n    this._timeoutCallbackId = 0;\\n    this._globalEval = data.globalEval;\\n    this._externalCall = data.externalCall;\\n  }\\n\\n  _dispatchEvent(pdfEvent) {\\n    this._eventDispatcher.dispatch(pdfEvent);\\n  }\\n\\n  _registerTimeoutCallback(cExpr) {\\n    const id = this._timeoutCallbackId++;\\n\\n    this._timeoutCallbackIds.set(id, cExpr);\\n\\n    return id;\\n  }\\n\\n  _unregisterTimeoutCallback(id) {\\n    this._timeoutCallbackIds.delete(id);\\n  }\\n\\n  _evalCallback({\\n    callbackId,\\n    interval\\n  }) {\\n    const expr = this._timeoutCallbackIds.get(callbackId);\\n\\n    if (!interval) {\\n      this._unregisterTimeoutCallback(callbackId);\\n    }\\n\\n    if (expr) {\\n      this._globalEval(expr);\\n    }\\n  }\\n\\n  _registerTimeout(callbackId, interval) {\\n    const timeout = Object.create(null);\\n    const id = {\\n      callbackId,\\n      interval\\n    };\\n\\n    this._timeoutIds.set(timeout, id);\\n\\n    if (this._timeoutIdsRegistry) {\\n      this._timeoutIdsRegistry.register(timeout, id);\\n    }\\n\\n    return timeout;\\n  }\\n\\n  _unregisterTimeout(timeout) {\\n    if (this._timeoutIdsRegistry) {\\n      this._timeoutIdsRegistry.unregister(timeout);\\n    }\\n\\n    const data = this._timeoutIds.get(timeout);\\n\\n    if (!data) {\\n      return;\\n    }\\n\\n    this._timeoutIds.delete(timeout);\\n\\n    this._cleanTimeout(data);\\n  }\\n\\n  _cleanTimeout({\\n    callbackId,\\n    interval\\n  }) {\\n    this._unregisterTimeoutCallback(callbackId);\\n\\n    if (interval) {\\n      this._externalCall(\"clearInterval\", [callbackId]);\\n    } else {\\n      this._externalCall(\"clearTimeout\", [callbackId]);\\n    }\\n  }\\n\\n  static _getPlatform(platform) {\\n    if (typeof platform === \"string\") {\\n      platform = platform.toLowerCase();\\n\\n      if (platform.includes(\"win\")) {\\n        return \"WIN\";\\n      } else if (platform.includes(\"mac\")) {\\n        return \"MAC\";\\n      }\\n    }\\n\\n    return \"UNIX\";\\n  }\\n\\n  static _getLanguage(language) {\\n    const [main, sub] = language.toLowerCase().split(/[-_]/);\\n\\n    switch (main) {\\n      case \"zh\":\\n        if (sub === \"cn\" || sub === \"sg\") {\\n          return \"CHS\";\\n        }\\n\\n        return \"CHT\";\\n\\n      case \"da\":\\n        return \"DAN\";\\n\\n      case \"de\":\\n        return \"DEU\";\\n\\n      case \"es\":\\n        return \"ESP\";\\n\\n      case \"fr\":\\n        return \"FRA\";\\n\\n      case \"it\":\\n        return \"ITA\";\\n\\n      case \"ko\":\\n        return \"KOR\";\\n\\n      case \"ja\":\\n        return \"JPN\";\\n\\n      case \"nl\":\\n        return \"NLD\";\\n\\n      case \"no\":\\n        return \"NOR\";\\n\\n      case \"pt\":\\n        if (sub === \"br\") {\\n          return \"PTB\";\\n        }\\n\\n        return \"ENU\";\\n\\n      case \"fi\":\\n        return \"SUO\";\\n\\n      case \"SV\":\\n        return \"SVE\";\\n\\n      default:\\n        return \"ENU\";\\n    }\\n  }\\n\\n  get activeDocs() {\\n    return [this._document.wrapped];\\n  }\\n\\n  set activeDocs(_) {\\n    throw new Error(\"app.activeDocs is read-only\");\\n  }\\n\\n  get constants() {\\n    if (!this._constants) {\\n      this._constants = Object.freeze({\\n        align: Object.freeze({\\n          left: 0,\\n          center: 1,\\n          right: 2,\\n          top: 3,\\n          bottom: 4\\n        })\\n      });\\n    }\\n\\n    return this._constants;\\n  }\\n\\n  set constants(_) {\\n    throw new Error(\"app.constants is read-only\");\\n  }\\n\\n  get focusRect() {\\n    return this._focusRect;\\n  }\\n\\n  set focusRect(val) {\\n    this._focusRect = val;\\n  }\\n\\n  get formsVersion() {\\n    return FORMS_VERSION;\\n  }\\n\\n  set formsVersion(_) {\\n    throw new Error(\"app.formsVersion is read-only\");\\n  }\\n\\n  get fromPDFConverters() {\\n    return [];\\n  }\\n\\n  set fromPDFConverters(_) {\\n    throw new Error(\"app.fromPDFConverters is read-only\");\\n  }\\n\\n  get fs() {\\n    if (this._fs === null) {\\n      this._fs = new Proxy(new _fullscreen.FullScreen({\\n        send: this._send\\n      }), this._proxyHandler);\\n    }\\n\\n    return this._fs;\\n  }\\n\\n  set fs(_) {\\n    throw new Error(\"app.fs is read-only\");\\n  }\\n\\n  get language() {\\n    return this._language;\\n  }\\n\\n  set language(_) {\\n    throw new Error(\"app.language is read-only\");\\n  }\\n\\n  get media() {\\n    return undefined;\\n  }\\n\\n  set media(_) {\\n    throw new Error(\"app.media is read-only\");\\n  }\\n\\n  get monitors() {\\n    return [];\\n  }\\n\\n  set monitors(_) {\\n    throw new Error(\"app.monitors is read-only\");\\n  }\\n\\n  get numPlugins() {\\n    return 0;\\n  }\\n\\n  set numPlugins(_) {\\n    throw new Error(\"app.numPlugins is read-only\");\\n  }\\n\\n  get openInPlace() {\\n    return this._openInPlace;\\n  }\\n\\n  set openInPlace(val) {\\n    this._openInPlace = val;\\n  }\\n\\n  get platform() {\\n    return this._platform;\\n  }\\n\\n  set platform(_) {\\n    throw new Error(\"app.platform is read-only\");\\n  }\\n\\n  get plugins() {\\n    return [];\\n  }\\n\\n  set plugins(_) {\\n    throw new Error(\"app.plugins is read-only\");\\n  }\\n\\n  get printColorProfiles() {\\n    return [];\\n  }\\n\\n  set printColorProfiles(_) {\\n    throw new Error(\"app.printColorProfiles is read-only\");\\n  }\\n\\n  get printerNames() {\\n    return [];\\n  }\\n\\n  set printerNames(_) {\\n    throw new Error(\"app.printerNames is read-only\");\\n  }\\n\\n  get runtimeHighlight() {\\n    return this._runtimeHighlight;\\n  }\\n\\n  set runtimeHighlight(val) {\\n    this._runtimeHighlight = val;\\n  }\\n\\n  get runtimeHighlightColor() {\\n    return this._runtimeHighlightColor;\\n  }\\n\\n  set runtimeHighlightColor(val) {\\n    if (_color.Color._isValidColor(val)) {\\n      this._runtimeHighlightColor = val;\\n    }\\n  }\\n\\n  get thermometer() {\\n    if (this._thermometer === null) {\\n      this._thermometer = new Proxy(new _thermometer.Thermometer({\\n        send: this._send\\n      }), this._proxyHandler);\\n    }\\n\\n    return this._thermometer;\\n  }\\n\\n  set thermometer(_) {\\n    throw new Error(\"app.thermometer is read-only\");\\n  }\\n\\n  get toolbar() {\\n    return this._toolbar;\\n  }\\n\\n  set toolbar(val) {\\n    this._toolbar = val;\\n  }\\n\\n  get toolbarHorizontal() {\\n    return this.toolbar;\\n  }\\n\\n  set toolbarHorizontal(value) {\\n    this.toolbar = value;\\n  }\\n\\n  get toolbarVertical() {\\n    return this.toolbar;\\n  }\\n\\n  set toolbarVertical(value) {\\n    this.toolbar = value;\\n  }\\n\\n  get viewerType() {\\n    return VIEWER_TYPE;\\n  }\\n\\n  set viewerType(_) {\\n    throw new Error(\"app.viewerType is read-only\");\\n  }\\n\\n  get viewerVariation() {\\n    return VIEWER_VARIATION;\\n  }\\n\\n  set viewerVariation(_) {\\n    throw new Error(\"app.viewerVariation is read-only\");\\n  }\\n\\n  get viewerVersion() {\\n    return VIEWER_VERSION;\\n  }\\n\\n  set viewerVersion(_) {\\n    throw new Error(\"app.viewerVersion is read-only\");\\n  }\\n\\n  addMenuItem() {}\\n\\n  addSubMenu() {}\\n\\n  addToolButton() {}\\n\\n  alert(cMsg, nIcon = 0, nType = 0, cTitle = \"PDF.js\", oDoc = null, oCheckbox = null) {\\n    this._externalCall(\"alert\", [cMsg]);\\n  }\\n\\n  beep() {}\\n\\n  beginPriv() {}\\n\\n  browseForDoc() {}\\n\\n  clearInterval(oInterval) {\\n    this._unregisterTimeout(oInterval);\\n  }\\n\\n  clearTimeOut(oTime) {\\n    this._unregisterTimeout(oTime);\\n  }\\n\\n  endPriv() {}\\n\\n  execDialog() {}\\n\\n  execMenuItem() {}\\n\\n  getNthPlugInName() {}\\n\\n  getPath() {}\\n\\n  goBack() {}\\n\\n  goForward() {}\\n\\n  hideMenuItem() {}\\n\\n  hideToolbarButton() {}\\n\\n  launchURL() {}\\n\\n  listMenuItems() {}\\n\\n  listToolbarButtons() {}\\n\\n  loadPolicyFile() {}\\n\\n  mailGetAddrs() {}\\n\\n  mailMsg() {}\\n\\n  newDoc() {}\\n\\n  newCollection() {}\\n\\n  newFDF() {}\\n\\n  openDoc() {}\\n\\n  openFDF() {}\\n\\n  popUpMenu() {}\\n\\n  popUpMenuEx() {}\\n\\n  removeToolButton() {}\\n\\n  response(cQuestion, cTitle = \"\", cDefault = \"\", bPassword = \"\", cLabel = \"\") {\\n    return this._externalCall(\"prompt\", [cQuestion, cDefault || \"\"]);\\n  }\\n\\n  setInterval(cExpr, nMilliseconds) {\\n    if (typeof cExpr !== \"string\") {\\n      throw new TypeError(\"First argument of app.setInterval must be a string\");\\n    }\\n\\n    if (typeof nMilliseconds !== \"number\") {\\n      throw new TypeError(\"Second argument of app.setInterval must be a number\");\\n    }\\n\\n    const callbackId = this._registerTimeoutCallback(cExpr);\\n\\n    this._externalCall(\"setInterval\", [callbackId, nMilliseconds]);\\n\\n    return this._registerTimeout(callbackId, true);\\n  }\\n\\n  setTimeOut(cExpr, nMilliseconds) {\\n    if (typeof cExpr !== \"string\") {\\n      throw new TypeError(\"First argument of app.setTimeOut must be a string\");\\n    }\\n\\n    if (typeof nMilliseconds !== \"number\") {\\n      throw new TypeError(\"Second argument of app.setTimeOut must be a number\");\\n    }\\n\\n    const callbackId = this._registerTimeoutCallback(cExpr);\\n\\n    this._externalCall(\"setTimeout\", [callbackId, nMilliseconds]);\\n\\n    return this._registerTimeout(callbackId, false);\\n  }\\n\\n  trustedFunction() {}\\n\\n  trustPropagatorFunction() {}\\n\\n}\\n\\nexports.App = App;\\n\\n/***/ }),\\n/* 10 */\\n/***/ ((__unused_webpack_module, exports) => {\\n\\n\\n\\nObject.defineProperty(exports, \"__esModule\", ({\\n  value: true\\n}));\\nexports.EventDispatcher = exports.Event = void 0;\\n\\nclass Event {\\n  constructor(data) {\\n    this.change = data.change || \"\";\\n    this.changeEx = data.changeEx || null;\\n    this.commitKey = data.commitKey || 0;\\n    this.fieldFull = data.fieldFull || false;\\n    this.keyDown = data.keyDown || false;\\n    this.modifier = data.modifier || false;\\n    this.name = data.name;\\n    this.rc = true;\\n    this.richChange = data.richChange || [];\\n    this.richChangeEx = data.richChangeEx || [];\\n    this.richValue = data.richValue || [];\\n    this.selEnd = data.selEnd || -1;\\n    this.selStart = data.selStart || -1;\\n    this.shift = data.shift || false;\\n    this.source = data.source || null;\\n    this.target = data.target || null;\\n    this.targetName = \"\";\\n    this.type = \"Field\";\\n    this.value = data.value || \"\";\\n    this.willCommit = data.willCommit || false;\\n  }\\n\\n}\\n\\nexports.Event = Event;\\n\\nclass EventDispatcher {\\n  constructor(document, calculationOrder, objects) {\\n    this._document = document;\\n    this._calculationOrder = calculationOrder;\\n    this._objects = objects;\\n    this._document.obj._eventDispatcher = this;\\n  }\\n\\n  mergeChange(event) {\\n    let value = event.value;\\n\\n    if (typeof value !== \"string\") {\\n      value = value.toString();\\n    }\\n\\n    const prefix = event.selStart >= 0 ? value.substring(0, event.selStart) : \"\";\\n    const postfix = event.selEnd >= 0 && event.selEnd <= value.length ? value.substring(event.selEnd) : \"\";\\n    return `${prefix}${event.change}${postfix}`;\\n  }\\n\\n  dispatch(baseEvent) {\\n    const id = baseEvent.id;\\n\\n    if (!(id in this._objects)) {\\n      let event;\\n\\n      if (id === \"doc\" || id === \"page\") {\\n        event = globalThis.event = new Event(baseEvent);\\n        event.source = event.target = this._document.wrapped;\\n        event.name = baseEvent.name;\\n      }\\n\\n      if (id === \"doc\") {\\n        this._document.obj._dispatchDocEvent(event.name);\\n      } else if (id === \"page\") {\\n        this._document.obj._dispatchPageEvent(event.name, baseEvent.actions, baseEvent.pageNumber);\\n      }\\n\\n      return;\\n    }\\n\\n    const name = baseEvent.name;\\n    const source = this._objects[id];\\n    const event = globalThis.event = new Event(baseEvent);\\n    let savedChange;\\n\\n    if (source.obj._isButton()) {\\n      source.obj._id = id;\\n      event.value = source.obj._getExportValue(event.value);\\n\\n      if (name === \"Action\") {\\n        source.obj._value = event.value;\\n      }\\n    }\\n\\n    if (name === \"Keystroke\") {\\n      savedChange = {\\n        value: event.value,\\n        change: event.change,\\n        selStart: event.selStart,\\n        selEnd: event.selEnd\\n      };\\n    } else if (name === \"Blur\" || name === \"Focus\") {\\n      Object.defineProperty(event, \"value\", {\\n        configurable: false,\\n        writable: false,\\n        enumerable: true,\\n        value: event.value\\n      });\\n    } else if (name === \"Validate\") {\\n      this.runValidation(source, event);\\n      return;\\n    }\\n\\n    this.runActions(source, source, event, name);\\n\\n    if (name === \"Keystroke\") {\\n      if (event.rc) {\\n        if (event.willCommit) {\\n          this.runValidation(source, event);\\n        } else if (event.change !== savedChange.change || event.selStart !== savedChange.selStart || event.selEnd !== savedChange.selEnd) {\\n          source.wrapped.value = this.mergeChange(event);\\n        }\\n      } else if (!event.willCommit) {\\n        source.obj._send({\\n          id: source.obj._id,\\n          value: savedChange.value,\\n          selRange: [savedChange.selStart, savedChange.selEnd]\\n        });\\n      }\\n    }\\n  }\\n\\n  runValidation(source, event) {\\n    const hasRan = this.runActions(source, source, event, \"Validate\");\\n\\n    if (event.rc) {\\n      if (hasRan) {\\n        source.wrapped.value = event.value;\\n      } else {\\n        source.obj.value = event.value;\\n      }\\n\\n      if (this._document.obj.calculate) {\\n        this.runCalculate(source, event);\\n      }\\n\\n      event.value = source.obj.value;\\n      this.runActions(source, source, event, \"Format\");\\n      source.wrapped.valueAsString = event.value;\\n    }\\n  }\\n\\n  runActions(source, target, event, eventName) {\\n    event.source = source.wrapped;\\n    event.target = target.wrapped;\\n    event.name = eventName;\\n    event.targetName = target.obj.name;\\n    event.rc = true;\\n    return target.obj._runActions(event);\\n  }\\n\\n  calculateNow() {\\n    if (!this._calculationOrder) {\\n      return;\\n    }\\n\\n    const first = this._calculationOrder[0];\\n    const source = this._objects[first];\\n    globalThis.event = new Event({});\\n    this.runCalculate(source, globalThis.event);\\n  }\\n\\n  runCalculate(source, event) {\\n    if (!this._calculationOrder) {\\n      return;\\n    }\\n\\n    for (const targetId of this._calculationOrder) {\\n      if (!(targetId in this._objects)) {\\n        continue;\\n      }\\n\\n      event.value = null;\\n      const target = this._objects[targetId];\\n      this.runActions(source, target, event, \"Calculate\");\\n\\n      if (!event.rc) {\\n        continue;\\n      }\\n\\n      if (event.value !== null) {\\n        target.wrapped.value = event.value;\\n      }\\n\\n      event.value = target.obj.value;\\n      this.runActions(target, target, event, \"Validate\");\\n\\n      if (!event.rc) {\\n        continue;\\n      }\\n\\n      event.value = target.obj.value;\\n      this.runActions(target, target, event, \"Format\");\\n\\n      if (event.value !== null) {\\n        target.wrapped.valueAsString = event.value;\\n      }\\n    }\\n  }\\n\\n}\\n\\nexports.EventDispatcher = EventDispatcher;\\n\\n/***/ }),\\n/* 11 */\\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\\n\\n\\n\\nObject.defineProperty(exports, \"__esModule\", ({\\n  value: true\\n}));\\nexports.FullScreen = void 0;\\n\\nvar _constants = __w_pdfjs_require__(2);\\n\\nvar _pdf_object = __w_pdfjs_require__(7);\\n\\nclass FullScreen extends _pdf_object.PDFObject {\\n  constructor(data) {\\n    super(data);\\n    this._backgroundColor = [];\\n    this._clickAdvances = true;\\n    this._cursor = _constants.Cursor.hidden;\\n    this._defaultTransition = \"\";\\n    this._escapeExits = true;\\n    this._isFullScreen = true;\\n    this._loop = false;\\n    this._timeDelay = 3600;\\n    this._usePageTiming = false;\\n    this._useTimer = false;\\n  }\\n\\n  get backgroundColor() {\\n    return this._backgroundColor;\\n  }\\n\\n  set backgroundColor(_) {}\\n\\n  get clickAdvances() {\\n    return this._clickAdvances;\\n  }\\n\\n  set clickAdvances(_) {}\\n\\n  get cursor() {\\n    return this._cursor;\\n  }\\n\\n  set cursor(_) {}\\n\\n  get defaultTransition() {\\n    return this._defaultTransition;\\n  }\\n\\n  set defaultTransition(_) {}\\n\\n  get escapeExits() {\\n    return this._escapeExits;\\n  }\\n\\n  set escapeExits(_) {}\\n\\n  get isFullScreen() {\\n    return this._isFullScreen;\\n  }\\n\\n  set isFullScreen(_) {}\\n\\n  get loop() {\\n    return this._loop;\\n  }\\n\\n  set loop(_) {}\\n\\n  get timeDelay() {\\n    return this._timeDelay;\\n  }\\n\\n  set timeDelay(_) {}\\n\\n  get transitions() {\\n    return [\"Replace\", \"WipeRight\", \"WipeLeft\", \"WipeDown\", \"WipeUp\", \"SplitHorizontalIn\", \"SplitHorizontalOut\", \"SplitVerticalIn\", \"SplitVerticalOut\", \"BlindsHorizontal\", \"BlindsVertical\", \"BoxIn\", \"BoxOut\", \"GlitterRight\", \"GlitterDown\", \"GlitterRightDown\", \"Dissolve\", \"Random\"];\\n  }\\n\\n  set transitions(_) {\\n    throw new Error(\"fullscreen.transitions is read-only\");\\n  }\\n\\n  get usePageTiming() {\\n    return this._usePageTiming;\\n  }\\n\\n  set usePageTiming(_) {}\\n\\n  get useTimer() {\\n    return this._useTimer;\\n  }\\n\\n  set useTimer(_) {}\\n\\n}\\n\\nexports.FullScreen = FullScreen;\\n\\n/***/ }),\\n/* 12 */\\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\\n\\n\\n\\nObject.defineProperty(exports, \"__esModule\", ({\\n  value: true\\n}));\\nexports.Thermometer = void 0;\\n\\nvar _pdf_object = __w_pdfjs_require__(7);\\n\\nclass Thermometer extends _pdf_object.PDFObject {\\n  constructor(data) {\\n    super(data);\\n    this._cancelled = false;\\n    this._duration = 100;\\n    this._text = \"\";\\n    this._value = 0;\\n  }\\n\\n  get cancelled() {\\n    return this._cancelled;\\n  }\\n\\n  set cancelled(_) {\\n    throw new Error(\"thermometer.cancelled is read-only\");\\n  }\\n\\n  get duration() {\\n    return this._duration;\\n  }\\n\\n  set duration(val) {\\n    this._duration = val;\\n  }\\n\\n  get text() {\\n    return this._text;\\n  }\\n\\n  set text(val) {\\n    this._text = val;\\n  }\\n\\n  get value() {\\n    return this._value;\\n  }\\n\\n  set value(val) {\\n    this._value = val;\\n  }\\n\\n  begin() {}\\n\\n  end() {}\\n\\n}\\n\\nexports.Thermometer = Thermometer;\\n\\n/***/ }),\\n/* 13 */\\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\\n\\n\\n\\nObject.defineProperty(exports, \"__esModule\", ({\\n  value: true\\n}));\\nexports.Console = void 0;\\n\\nvar _pdf_object = __w_pdfjs_require__(7);\\n\\nclass Console extends _pdf_object.PDFObject {\\n  clear() {\\n    this._send({\\n      id: \"clear\"\\n    });\\n  }\\n\\n  hide() {}\\n\\n  println(msg) {\\n    if (typeof msg === \"string\") {\\n      this._send({\\n        command: \"println\",\\n        value: \"PDF.js Console:: \" + msg\\n      });\\n    }\\n  }\\n\\n  show() {}\\n\\n}\\n\\nexports.Console = Console;\\n\\n/***/ }),\\n/* 14 */\\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\\n\\n\\n\\nObject.defineProperty(exports, \"__esModule\", ({\\n  value: true\\n}));\\nexports.Doc = void 0;\\n\\nvar _common = __w_pdfjs_require__(4);\\n\\nvar _pdf_object = __w_pdfjs_require__(7);\\n\\nvar _print_params = __w_pdfjs_require__(15);\\n\\nvar _constants = __w_pdfjs_require__(2);\\n\\nclass InfoProxyHandler {\\n  static get(obj, prop) {\\n    return obj[prop.toLowerCase()];\\n  }\\n\\n  static set(obj, prop, value) {\\n    throw new Error(`doc.info.${prop} is read-only`);\\n  }\\n\\n}\\n\\nclass Doc extends _pdf_object.PDFObject {\\n  constructor(data) {\\n    super(data);\\n    this._expandos = globalThis;\\n    this._baseURL = data.baseURL || \"\";\\n    this._calculate = true;\\n    this._delay = false;\\n    this._dirty = false;\\n    this._disclosed = false;\\n    this._media = undefined;\\n    this._metadata = data.metadata || \"\";\\n    this._noautocomplete = undefined;\\n    this._nocache = undefined;\\n    this._spellDictionaryOrder = [];\\n    this._spellLanguageOrder = [];\\n    this._printParams = null;\\n    this._fields = new Map();\\n    this._fieldNames = [];\\n    this._event = null;\\n    this._author = data.Author || \"\";\\n    this._creator = data.Creator || \"\";\\n    this._creationDate = this._getDate(data.CreationDate) || null;\\n    this._docID = data.docID || [\"\", \"\"];\\n    this._documentFileName = data.filename || \"\";\\n    this._filesize = data.filesize || 0;\\n    this._keywords = data.Keywords || \"\";\\n    this._layout = data.layout || \"\";\\n    this._modDate = this._getDate(data.ModDate) || null;\\n    this._numFields = 0;\\n    this._numPages = data.numPages || 1;\\n    this._pageNum = data.pageNum || 0;\\n    this._producer = data.Producer || \"\";\\n    this._subject = data.Subject || \"\";\\n    this._title = data.Title || \"\";\\n    this._URL = data.URL || \"\";\\n    this._info = new Proxy({\\n      title: this._title,\\n      author: this._author,\\n      authors: data.authors || [this._author],\\n      subject: this._subject,\\n      keywords: this._keywords,\\n      creator: this._creator,\\n      producer: this._producer,\\n      creationdate: this._creationDate,\\n      moddate: this._modDate,\\n      trapped: data.Trapped || \"Unknown\"\\n    }, InfoProxyHandler);\\n    this._zoomType = _constants.ZoomType.none;\\n    this._zoom = data.zoom || 100;\\n    this._actions = (0, _common.createActionsMap)(data.actions);\\n    this._globalEval = data.globalEval;\\n    this._pageActions = new Map();\\n  }\\n\\n  _dispatchDocEvent(name) {\\n    if (name === \"Open\") {\\n      const dontRun = new Set([\"WillClose\", \"WillSave\", \"DidSave\", \"WillPrint\", \"DidPrint\", \"OpenAction\"]);\\n\\n      for (const actionName of this._actions.keys()) {\\n        if (!dontRun.has(actionName)) {\\n          this._runActions(actionName);\\n        }\\n      }\\n\\n      this._runActions(\"OpenAction\");\\n    } else {\\n      this._runActions(name);\\n    }\\n  }\\n\\n  _dispatchPageEvent(name, actions, pageNumber) {\\n    if (name === \"PageOpen\") {\\n      if (!this._pageActions.has(pageNumber)) {\\n        this._pageActions.set(pageNumber, (0, _common.createActionsMap)(actions));\\n      }\\n\\n      this._pageNum = pageNumber - 1;\\n    }\\n\\n    actions = this._pageActions.get(pageNumber)?.get(name);\\n\\n    if (actions) {\\n      for (const action of actions) {\\n        this._globalEval(action);\\n      }\\n    }\\n  }\\n\\n  _runActions(name) {\\n    const actions = this._actions.get(name);\\n\\n    if (actions) {\\n      for (const action of actions) {\\n        this._globalEval(action);\\n      }\\n    }\\n  }\\n\\n  _addField(name, field) {\\n    this._fields.set(name, field);\\n\\n    this._fieldNames.push(name);\\n\\n    this._numFields++;\\n  }\\n\\n  _getDate(date) {\\n    if (!date || date.length < 15 || !date.startsWith(\"D:\")) {\\n      return date;\\n    }\\n\\n    date = date.substring(2);\\n    const year = date.substring(0, 4);\\n    const month = date.substring(4, 6);\\n    const day = date.substring(6, 8);\\n    const hour = date.substring(8, 10);\\n    const minute = date.substring(10, 12);\\n    const o = date.charAt(12);\\n    let second, offsetPos;\\n\\n    if (o === \"Z\" || o === \"+\" || o === \"-\") {\\n      second = \"00\";\\n      offsetPos = 12;\\n    } else {\\n      second = date.substring(12, 14);\\n      offsetPos = 14;\\n    }\\n\\n    const offset = date.substring(offsetPos).replaceAll(\"\\'\", \"\");\\n    return new Date(`${year}-${month}-${day}T${hour}:${minute}:${second}${offset}`);\\n  }\\n\\n  get author() {\\n    return this._author;\\n  }\\n\\n  set author(_) {\\n    throw new Error(\"doc.author is read-only\");\\n  }\\n\\n  get baseURL() {\\n    return this._baseURL;\\n  }\\n\\n  set baseURL(baseURL) {\\n    this._baseURL = baseURL;\\n  }\\n\\n  get bookmarkRoot() {\\n    return undefined;\\n  }\\n\\n  set bookmarkRoot(_) {\\n    throw new Error(\"doc.bookmarkRoot is read-only\");\\n  }\\n\\n  get calculate() {\\n    return this._calculate;\\n  }\\n\\n  set calculate(calculate) {\\n    this._calculate = calculate;\\n  }\\n\\n  get creator() {\\n    return this._creator;\\n  }\\n\\n  set creator(_) {\\n    throw new Error(\"doc.creator is read-only\");\\n  }\\n\\n  get dataObjects() {\\n    return [];\\n  }\\n\\n  set dataObjects(_) {\\n    throw new Error(\"doc.dataObjects is read-only\");\\n  }\\n\\n  get delay() {\\n    return this._delay;\\n  }\\n\\n  set delay(delay) {\\n    this._delay = delay;\\n  }\\n\\n  get dirty() {\\n    return this._dirty;\\n  }\\n\\n  set dirty(dirty) {\\n    this._dirty = dirty;\\n  }\\n\\n  get disclosed() {\\n    return this._disclosed;\\n  }\\n\\n  set disclosed(disclosed) {\\n    this._disclosed = disclosed;\\n  }\\n\\n  get docID() {\\n    return this._docID;\\n  }\\n\\n  set docID(_) {\\n    throw new Error(\"doc.docID is read-only\");\\n  }\\n\\n  get documentFileName() {\\n    return this._documentFileName;\\n  }\\n\\n  set documentFileName(_) {\\n    throw new Error(\"doc.documentFileName is read-only\");\\n  }\\n\\n  get dynamicXFAForm() {\\n    return false;\\n  }\\n\\n  set dynamicXFAForm(_) {\\n    throw new Error(\"doc.dynamicXFAForm is read-only\");\\n  }\\n\\n  get external() {\\n    return true;\\n  }\\n\\n  set external(_) {\\n    throw new Error(\"doc.external is read-only\");\\n  }\\n\\n  get filesize() {\\n    return this._filesize;\\n  }\\n\\n  set filesize(_) {\\n    throw new Error(\"doc.filesize is read-only\");\\n  }\\n\\n  get hidden() {\\n    return false;\\n  }\\n\\n  set hidden(_) {\\n    throw new Error(\"doc.hidden is read-only\");\\n  }\\n\\n  get hostContainer() {\\n    return undefined;\\n  }\\n\\n  set hostContainer(_) {\\n    throw new Error(\"doc.hostContainer is read-only\");\\n  }\\n\\n  get icons() {\\n    return undefined;\\n  }\\n\\n  set icons(_) {\\n    throw new Error(\"doc.icons is read-only\");\\n  }\\n\\n  get info() {\\n    return this._info;\\n  }\\n\\n  set info(_) {\\n    throw new Error(\"doc.info is read-only\");\\n  }\\n\\n  get innerAppWindowRect() {\\n    return [0, 0, 0, 0];\\n  }\\n\\n  set innerAppWindowRect(_) {\\n    throw new Error(\"doc.innerAppWindowRect is read-only\");\\n  }\\n\\n  get innerDocWindowRect() {\\n    return [0, 0, 0, 0];\\n  }\\n\\n  set innerDocWindowRect(_) {\\n    throw new Error(\"doc.innerDocWindowRect is read-only\");\\n  }\\n\\n  get isModal() {\\n    return false;\\n  }\\n\\n  set isModal(_) {\\n    throw new Error(\"doc.isModal is read-only\");\\n  }\\n\\n  get keywords() {\\n    return this._keywords;\\n  }\\n\\n  set keywords(_) {\\n    throw new Error(\"doc.keywords is read-only\");\\n  }\\n\\n  get layout() {\\n    return this._layout;\\n  }\\n\\n  set layout(value) {\\n    if (typeof value !== \"string\") {\\n      return;\\n    }\\n\\n    if (value !== \"SinglePage\" && value !== \"OneColumn\" && value !== \"TwoColumnLeft\" && value !== \"TwoPageLeft\" && value !== \"TwoColumnRight\" && value !== \"TwoPageRight\") {\\n      value = \"SinglePage\";\\n    }\\n\\n    this._send({\\n      command: \"layout\",\\n      value\\n    });\\n\\n    this._layout = value;\\n  }\\n\\n  get media() {\\n    return this._media;\\n  }\\n\\n  set media(media) {\\n    this._media = media;\\n  }\\n\\n  get metadata() {\\n    return this._metadata;\\n  }\\n\\n  set metadata(metadata) {\\n    this._metadata = metadata;\\n  }\\n\\n  get modDate() {\\n    return this._modDate;\\n  }\\n\\n  set modDate(_) {\\n    throw new Error(\"doc.modDate is read-only\");\\n  }\\n\\n  get mouseX() {\\n    return 0;\\n  }\\n\\n  set mouseX(_) {\\n    throw new Error(\"doc.mouseX is read-only\");\\n  }\\n\\n  get mouseY() {\\n    return 0;\\n  }\\n\\n  set mouseY(_) {\\n    throw new Error(\"doc.mouseY is read-only\");\\n  }\\n\\n  get noautocomplete() {\\n    return this._noautocomplete;\\n  }\\n\\n  set noautocomplete(noautocomplete) {\\n    this._noautocomplete = noautocomplete;\\n  }\\n\\n  get nocache() {\\n    return this._nocache;\\n  }\\n\\n  set nocache(nocache) {\\n    this._nocache = nocache;\\n  }\\n\\n  get numFields() {\\n    return this._numFields;\\n  }\\n\\n  set numFields(_) {\\n    throw new Error(\"doc.numFields is read-only\");\\n  }\\n\\n  get numPages() {\\n    return this._numPages;\\n  }\\n\\n  set numPages(_) {\\n    throw new Error(\"doc.numPages is read-only\");\\n  }\\n\\n  get numTemplates() {\\n    return 0;\\n  }\\n\\n  set numTemplates(_) {\\n    throw new Error(\"doc.numTemplates is read-only\");\\n  }\\n\\n  get outerAppWindowRect() {\\n    return [0, 0, 0, 0];\\n  }\\n\\n  set outerAppWindowRect(_) {\\n    throw new Error(\"doc.outerAppWindowRect is read-only\");\\n  }\\n\\n  get outerDocWindowRect() {\\n    return [0, 0, 0, 0];\\n  }\\n\\n  set outerDocWindowRect(_) {\\n    throw new Error(\"doc.outerDocWindowRect is read-only\");\\n  }\\n\\n  get pageNum() {\\n    return this._pageNum;\\n  }\\n\\n  set pageNum(value) {\\n    if (typeof value !== \"number\" || value < 0 || value >= this._numPages) {\\n      return;\\n    }\\n\\n    this._send({\\n      command: \"page-num\",\\n      value\\n    });\\n\\n    this._pageNum = value;\\n  }\\n\\n  get pageWindowRect() {\\n    return [0, 0, 0, 0];\\n  }\\n\\n  set pageWindowRect(_) {\\n    throw new Error(\"doc.pageWindowRect is read-only\");\\n  }\\n\\n  get path() {\\n    return \"\";\\n  }\\n\\n  set path(_) {\\n    throw new Error(\"doc.path is read-only\");\\n  }\\n\\n  get permStatusReady() {\\n    return true;\\n  }\\n\\n  set permStatusReady(_) {\\n    throw new Error(\"doc.permStatusReady is read-only\");\\n  }\\n\\n  get producer() {\\n    return this._producer;\\n  }\\n\\n  set producer(_) {\\n    throw new Error(\"doc.producer is read-only\");\\n  }\\n\\n  get requiresFullSave() {\\n    return false;\\n  }\\n\\n  set requiresFullSave(_) {\\n    throw new Error(\"doc.requiresFullSave is read-only\");\\n  }\\n\\n  get securityHandler() {\\n    return null;\\n  }\\n\\n  set securityHandler(_) {\\n    throw new Error(\"doc.securityHandler is read-only\");\\n  }\\n\\n  get selectedAnnots() {\\n    return [];\\n  }\\n\\n  set selectedAnnots(_) {\\n    throw new Error(\"doc.selectedAnnots is read-only\");\\n  }\\n\\n  get sounds() {\\n    return [];\\n  }\\n\\n  set sounds(_) {\\n    throw new Error(\"doc.sounds is read-only\");\\n  }\\n\\n  get spellDictionaryOrder() {\\n    return this._spellDictionaryOrder;\\n  }\\n\\n  set spellDictionaryOrder(spellDictionaryOrder) {\\n    this._spellDictionaryOrder = spellDictionaryOrder;\\n  }\\n\\n  get spellLanguageOrder() {\\n    return this._spellLanguageOrder;\\n  }\\n\\n  set spellLanguageOrder(spellLanguageOrder) {\\n    this._spellLanguageOrder = spellLanguageOrder;\\n  }\\n\\n  get subject() {\\n    return this._subject;\\n  }\\n\\n  set subject(_) {\\n    throw new Error(\"doc.subject is read-only\");\\n  }\\n\\n  get templates() {\\n    return [];\\n  }\\n\\n  set templates(_) {\\n    throw new Error(\"doc.templates is read-only\");\\n  }\\n\\n  get title() {\\n    return this._title;\\n  }\\n\\n  set title(_) {\\n    throw new Error(\"doc.title is read-only\");\\n  }\\n\\n  get URL() {\\n    return this._URL;\\n  }\\n\\n  set URL(_) {\\n    throw new Error(\"doc.URL is read-only\");\\n  }\\n\\n  get viewState() {\\n    return undefined;\\n  }\\n\\n  set viewState(_) {\\n    throw new Error(\"doc.viewState is read-only\");\\n  }\\n\\n  get xfa() {\\n    return this._xfa;\\n  }\\n\\n  set xfa(_) {\\n    throw new Error(\"doc.xfa is read-only\");\\n  }\\n\\n  get XFAForeground() {\\n    return false;\\n  }\\n\\n  set XFAForeground(_) {\\n    throw new Error(\"doc.XFAForeground is read-only\");\\n  }\\n\\n  get zoomType() {\\n    return this._zoomType;\\n  }\\n\\n  set zoomType(type) {\\n    if (typeof type !== \"string\") {\\n      return;\\n    }\\n\\n    switch (type) {\\n      case _constants.ZoomType.none:\\n        this._send({\\n          command: \"zoom\",\\n          value: 1\\n        });\\n\\n        break;\\n\\n      case _constants.ZoomType.fitP:\\n        this._send({\\n          command: \"zoom\",\\n          value: \"page-fit\"\\n        });\\n\\n        break;\\n\\n      case _constants.ZoomType.fitW:\\n        this._send({\\n          command: \"zoom\",\\n          value: \"page-width\"\\n        });\\n\\n        break;\\n\\n      case _constants.ZoomType.fitH:\\n        this._send({\\n          command: \"zoom\",\\n          value: \"page-height\"\\n        });\\n\\n        break;\\n\\n      case _constants.ZoomType.fitV:\\n        this._send({\\n          command: \"zoom\",\\n          value: \"auto\"\\n        });\\n\\n        break;\\n\\n      case _constants.ZoomType.pref:\\n      case _constants.ZoomType.refW:\\n        break;\\n\\n      default:\\n        return;\\n    }\\n\\n    this._zoomType = type;\\n  }\\n\\n  get zoom() {\\n    return this._zoom;\\n  }\\n\\n  set zoom(value) {\\n    if (typeof value !== \"number\" || value < 8.33 || value > 6400) {\\n      return;\\n    }\\n\\n    this._send({\\n      command: \"zoom\",\\n      value: value / 100\\n    });\\n  }\\n\\n  addAnnot() {}\\n\\n  addField() {}\\n\\n  addIcon() {}\\n\\n  addLink() {}\\n\\n  addRecipientListCryptFilter() {}\\n\\n  addRequirement() {}\\n\\n  addScript() {}\\n\\n  addThumbnails() {}\\n\\n  addWatermarkFromFile() {}\\n\\n  addWatermarkFromText() {}\\n\\n  addWeblinks() {}\\n\\n  bringToFront() {}\\n\\n  calculateNow() {\\n    this._eventDispatcher.calculateNow();\\n  }\\n\\n  closeDoc() {}\\n\\n  colorConvertPage() {}\\n\\n  createDataObject() {}\\n\\n  createTemplate() {}\\n\\n  deletePages() {}\\n\\n  deleteSound() {}\\n\\n  embedDocAsDataObject() {}\\n\\n  embedOutputIntent() {}\\n\\n  encryptForRecipients() {}\\n\\n  encryptUsingPolicy() {}\\n\\n  exportAsFDF() {}\\n\\n  exportAsFDFStr() {}\\n\\n  exportAsText() {}\\n\\n  exportAsXFDF() {}\\n\\n  exportAsXFDFStr() {}\\n\\n  exportDataObject() {}\\n\\n  exportXFAData() {}\\n\\n  extractPages() {}\\n\\n  flattenPages() {}\\n\\n  getAnnot() {}\\n\\n  getAnnots() {}\\n\\n  getAnnot3D() {}\\n\\n  getAnnots3D() {}\\n\\n  getColorConvertAction() {}\\n\\n  getDataObject() {}\\n\\n  getDataObjectContents() {}\\n\\n  getField(cName) {\\n    if (typeof cName !== \"string\") {\\n      throw new TypeError(\"Invalid field name: must be a string\");\\n    }\\n\\n    const searchedField = this._fields.get(cName);\\n\\n    if (searchedField) {\\n      return searchedField;\\n    }\\n\\n    const parts = cName.split(\"#\");\\n    let childIndex = NaN;\\n\\n    if (parts.length === 2) {\\n      childIndex = Math.floor(parseFloat(parts[1]));\\n      cName = parts[0];\\n    }\\n\\n    for (const [name, field] of this._fields.entries()) {\\n      if (name.endsWith(cName)) {\\n        if (!isNaN(childIndex)) {\\n          const children = this._getChildren(name);\\n\\n          if (childIndex < 0 || childIndex >= children.length) {\\n            childIndex = 0;\\n          }\\n\\n          if (childIndex < children.length) {\\n            this._fields.set(cName, children[childIndex]);\\n\\n            return children[childIndex];\\n          }\\n        }\\n\\n        this._fields.set(cName, field);\\n\\n        return field;\\n      }\\n    }\\n\\n    return undefined;\\n  }\\n\\n  _getChildren(fieldName) {\\n    const len = fieldName.length;\\n    const children = [];\\n    const pattern = /^\\\\.[^.]+$/;\\n\\n    for (const [name, field] of this._fields.entries()) {\\n      if (name.startsWith(fieldName)) {\\n        const finalPart = name.slice(len);\\n\\n        if (finalPart.match(pattern)) {\\n          children.push(field);\\n        }\\n      }\\n    }\\n\\n    return children;\\n  }\\n\\n  getIcon() {}\\n\\n  getLegalWarnings() {}\\n\\n  getLinks() {}\\n\\n  getNthFieldName(nIndex) {\\n    if (typeof nIndex !== \"number\") {\\n      throw new TypeError(\"Invalid field index: must be a number\");\\n    }\\n\\n    if (0 <= nIndex && nIndex < this.numFields) {\\n      return this._fieldNames[Math.trunc(nIndex)];\\n    }\\n\\n    return null;\\n  }\\n\\n  getNthTemplate() {\\n    return null;\\n  }\\n\\n  getOCGs() {}\\n\\n  getOCGOrder() {}\\n\\n  getPageBox() {}\\n\\n  getPageLabel() {}\\n\\n  getPageNthWord() {}\\n\\n  getPageNthWordQuads() {}\\n\\n  getPageNumWords() {}\\n\\n  getPageRotation() {}\\n\\n  getPageTransition() {}\\n\\n  getPrintParams() {\\n    if (!this._printParams) {\\n      this._printParams = new _print_params.PrintParams({\\n        lastPage: this._numPages - 1\\n      });\\n    }\\n\\n    return this._printParams;\\n  }\\n\\n  getSound() {}\\n\\n  getTemplate() {}\\n\\n  getURL() {}\\n\\n  gotoNamedDest() {}\\n\\n  importAnFDF() {}\\n\\n  importAnXFDF() {}\\n\\n  importDataObject() {}\\n\\n  importIcon() {}\\n\\n  importSound() {}\\n\\n  importTextData() {}\\n\\n  importXFAData() {}\\n\\n  insertPages() {}\\n\\n  mailDoc() {}\\n\\n  mailForm() {}\\n\\n  movePage() {}\\n\\n  newPage() {}\\n\\n  openDataObject() {}\\n\\n  print(bUI = true, nStart = 0, nEnd = -1, bSilent = false, bShrinkToFit = false, bPrintAsImage = false, bReverse = false, bAnnotations = true, printParams = null) {\\n    if (printParams) {\\n      nStart = printParams.firstPage;\\n      nEnd = printParams.lastPage;\\n    }\\n\\n    if (typeof nStart === \"number\") {\\n      nStart = Math.max(0, Math.trunc(nStart));\\n    } else {\\n      nStart = 0;\\n    }\\n\\n    if (typeof nEnd === \"number\") {\\n      nEnd = Math.max(0, Math.trunc(nEnd));\\n    } else {\\n      nEnd = -1;\\n    }\\n\\n    this._send({\\n      command: \"print\",\\n      start: nStart,\\n      end: nEnd\\n    });\\n  }\\n\\n  removeDataObject() {}\\n\\n  removeField() {}\\n\\n  removeIcon() {}\\n\\n  removeLinks() {}\\n\\n  removeRequirement() {}\\n\\n  removeScript() {}\\n\\n  removeTemplate() {}\\n\\n  removeThumbnails() {}\\n\\n  removeWeblinks() {}\\n\\n  replacePages() {}\\n\\n  resetForm(aFields = null) {\\n    let mustCalculate = false;\\n\\n    if (aFields) {\\n      for (const fieldName of aFields) {\\n        const field = this.getField(fieldName);\\n\\n        if (field) {\\n          field.value = field.defaultValue;\\n          field.valueAsString = field.value;\\n          mustCalculate = true;\\n        }\\n      }\\n    } else {\\n      mustCalculate = this._fields.size !== 0;\\n\\n      for (const field of this._fields.values()) {\\n        field.value = field.defaultValue;\\n        field.valueAsString = field.value;\\n      }\\n    }\\n\\n    if (mustCalculate) {\\n      this.calculateNow();\\n    }\\n  }\\n\\n  saveAs() {}\\n\\n  scroll() {}\\n\\n  selectPageNthWord() {}\\n\\n  setAction() {}\\n\\n  setDataObjectContents() {}\\n\\n  setOCGOrder() {}\\n\\n  setPageAction() {}\\n\\n  setPageBoxes() {}\\n\\n  setPageLabels() {}\\n\\n  setPageRotations() {}\\n\\n  setPageTabOrder() {}\\n\\n  setPageTransitions() {}\\n\\n  spawnPageFromTemplate() {}\\n\\n  submitForm() {}\\n\\n  syncAnnotScan() {}\\n\\n}\\n\\nexports.Doc = Doc;\\n\\n/***/ }),\\n/* 15 */\\n/***/ ((__unused_webpack_module, exports) => {\\n\\n\\n\\nObject.defineProperty(exports, \"__esModule\", ({\\n  value: true\\n}));\\nexports.PrintParams = void 0;\\n\\nclass PrintParams {\\n  constructor(data) {\\n    this.binaryOk = true;\\n    this.bitmapDPI = 150;\\n    this.booklet = {\\n      binding: 0,\\n      duplexMode: 0,\\n      subsetFrom: 0,\\n      subsetTo: -1\\n    };\\n    this.colorOverride = 0;\\n    this.colorProfile = \"\";\\n    this.constants = Object.freeze({\\n      bookletBindings: Object.freeze({\\n        Left: 0,\\n        Right: 1,\\n        LeftTall: 2,\\n        RightTall: 3\\n      }),\\n      bookletDuplexMode: Object.freeze({\\n        BothSides: 0,\\n        FrontSideOnly: 1,\\n        BasicSideOnly: 2\\n      }),\\n      colorOverrides: Object.freeze({\\n        auto: 0,\\n        gray: 1,\\n        mono: 2\\n      }),\\n      fontPolicies: Object.freeze({\\n        everyPage: 0,\\n        jobStart: 1,\\n        pageRange: 2\\n      }),\\n      handling: Object.freeze({\\n        none: 0,\\n        fit: 1,\\n        shrink: 2,\\n        tileAll: 3,\\n        tileLarge: 4,\\n        nUp: 5,\\n        booklet: 6\\n      }),\\n      interactionLevel: Object.freeze({\\n        automatic: 0,\\n        full: 1,\\n        silent: 2\\n      }),\\n      nUpPageOrders: Object.freeze({\\n        Horizontal: 0,\\n        HorizontalReversed: 1,\\n        Vertical: 2\\n      }),\\n      printContents: Object.freeze({\\n        doc: 0,\\n        docAndComments: 1,\\n        formFieldsOnly: 2\\n      }),\\n      flagValues: Object.freeze({\\n        applyOverPrint: 1,\\n        applySoftProofSettings: 1 << 1,\\n        applyWorkingColorSpaces: 1 << 2,\\n        emitHalftones: 1 << 3,\\n        emitPostScriptXObjects: 1 << 4,\\n        emitFormsAsPSForms: 1 << 5,\\n        maxJP2KRes: 1 << 6,\\n        setPageSize: 1 << 7,\\n        suppressBG: 1 << 8,\\n        suppressCenter: 1 << 9,\\n        suppressCJKFontSubst: 1 << 10,\\n        suppressCropClip: 1 << 1,\\n        suppressRotate: 1 << 12,\\n        suppressTransfer: 1 << 13,\\n        suppressUCR: 1 << 14,\\n        useTrapAnnots: 1 << 15,\\n        usePrintersMarks: 1 << 16\\n      }),\\n      rasterFlagValues: Object.freeze({\\n        textToOutline: 1,\\n        strokesToOutline: 1 << 1,\\n        allowComplexClip: 1 << 2,\\n        preserveOverprint: 1 << 3\\n      }),\\n      subsets: Object.freeze({\\n        all: 0,\\n        even: 1,\\n        odd: 2\\n      }),\\n      tileMarks: Object.freeze({\\n        none: 0,\\n        west: 1,\\n        east: 2\\n      }),\\n      usages: Object.freeze({\\n        auto: 0,\\n        use: 1,\\n        noUse: 2\\n      })\\n    });\\n    this.downloadFarEastFonts = false;\\n    this.fileName = \"\";\\n    this.firstPage = 0;\\n    this.flags = 0;\\n    this.fontPolicy = 0;\\n    this.gradientDPI = 150;\\n    this.interactive = 1;\\n    this.lastPage = data.lastPage;\\n    this.npUpAutoRotate = false;\\n    this.npUpNumPagesH = 2;\\n    this.npUpNumPagesV = 2;\\n    this.npUpPageBorder = false;\\n    this.npUpPageOrder = 0;\\n    this.pageHandling = 0;\\n    this.pageSubset = 0;\\n    this.printAsImage = false;\\n    this.printContent = 0;\\n    this.printerName = \"\";\\n    this.psLevel = 0;\\n    this.rasterFlags = 0;\\n    this.reversePages = false;\\n    this.tileLabel = false;\\n    this.tileMark = 0;\\n    this.tileOverlap = 0;\\n    this.tileScale = 1.0;\\n    this.transparencyLevel = 75;\\n    this.usePrinterCRD = 0;\\n    this.useT1Conversion = 0;\\n  }\\n\\n}\\n\\nexports.PrintParams = PrintParams;\\n\\n/***/ }),\\n/* 16 */\\n/***/ ((__unused_webpack_module, exports) => {\\n\\n\\n\\nObject.defineProperty(exports, \"__esModule\", ({\\n  value: true\\n}));\\nexports.ProxyHandler = void 0;\\n\\nclass ProxyHandler {\\n  get(obj, prop) {\\n    if (prop in obj._expandos) {\\n      const val = obj._expandos[prop];\\n\\n      if (typeof val === \"function\") {\\n        return val.bind(obj);\\n      }\\n\\n      return val;\\n    }\\n\\n    if (typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj) {\\n      const val = obj[prop];\\n\\n      if (typeof val === \"function\") {\\n        return val.bind(obj);\\n      }\\n\\n      return val;\\n    }\\n\\n    return undefined;\\n  }\\n\\n  set(obj, prop, value) {\\n    if (typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj) {\\n      const old = obj[prop];\\n      obj[prop] = value;\\n\\n      if (obj._send && obj._id !== null && typeof old !== \"function\") {\\n        const data = {\\n          id: obj._id\\n        };\\n        data[prop] = obj[prop];\\n\\n        obj._send(data);\\n      }\\n    } else {\\n      obj._expandos[prop] = value;\\n    }\\n\\n    return true;\\n  }\\n\\n  has(obj, prop) {\\n    return prop in obj._expandos || typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj;\\n  }\\n\\n  getPrototypeOf(obj) {\\n    return null;\\n  }\\n\\n  setPrototypeOf(obj, proto) {\\n    return false;\\n  }\\n\\n  isExtensible(obj) {\\n    return true;\\n  }\\n\\n  preventExtensions(obj) {\\n    return false;\\n  }\\n\\n  getOwnPropertyDescriptor(obj, prop) {\\n    if (prop in obj._expandos) {\\n      return {\\n        configurable: true,\\n        enumerable: true,\\n        value: obj._expandos[prop]\\n      };\\n    }\\n\\n    if (typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj) {\\n      return {\\n        configurable: true,\\n        enumerable: true,\\n        value: obj[prop]\\n      };\\n    }\\n\\n    return undefined;\\n  }\\n\\n  defineProperty(obj, key, descriptor) {\\n    Object.defineProperty(obj._expandos, key, descriptor);\\n    return true;\\n  }\\n\\n  deleteProperty(obj, prop) {\\n    if (prop in obj._expandos) {\\n      delete obj._expandos[prop];\\n    }\\n  }\\n\\n  ownKeys(obj) {\\n    const fromExpandos = Reflect.ownKeys(obj._expandos);\\n    const fromObj = Reflect.ownKeys(obj).filter(k => !k.startsWith(\"_\"));\\n    return fromExpandos.concat(fromObj);\\n  }\\n\\n}\\n\\nexports.ProxyHandler = ProxyHandler;\\n\\n/***/ }),\\n/* 17 */\\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\\n\\n\\n\\nObject.defineProperty(exports, \"__esModule\", ({\\n  value: true\\n}));\\nexports.Util = void 0;\\n\\nvar _pdf_object = __w_pdfjs_require__(7);\\n\\nclass Util extends _pdf_object.PDFObject {\\n  constructor(data) {\\n    super(data);\\n    this._scandCache = new Map();\\n    this._months = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\\n    this._days = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\\n    this.MILLISECONDS_IN_DAY = 86400000;\\n    this.MILLISECONDS_IN_WEEK = 604800000;\\n    this._externalCall = data.externalCall;\\n  }\\n\\n  printf(...args) {\\n    if (args.length === 0) {\\n      throw new Error(\"Invalid number of params in printf\");\\n    }\\n\\n    if (typeof args[0] !== \"string\") {\\n      throw new TypeError(\"First argument of printf must be a string\");\\n    }\\n\\n    const pattern = /%(,[0-4])?([+ 0#]+)?([0-9]+)?(\\\\.[0-9]+)?(.)/g;\\n    const PLUS = 1;\\n    const SPACE = 2;\\n    const ZERO = 4;\\n    const HASH = 8;\\n    let i = 0;\\n    return args[0].replace(pattern, function (match, nDecSep, cFlags, nWidth, nPrecision, cConvChar) {\\n      if (cConvChar !== \"d\" && cConvChar !== \"f\" && cConvChar !== \"s\" && cConvChar !== \"x\") {\\n        const buf = [\"%\"];\\n\\n        for (const str of [nDecSep, cFlags, nWidth, nPrecision, cConvChar]) {\\n          if (str) {\\n            buf.push(str);\\n          }\\n        }\\n\\n        return buf.join(\"\");\\n      }\\n\\n      i++;\\n\\n      if (i === args.length) {\\n        throw new Error(\"Not enough arguments in printf\");\\n      }\\n\\n      const arg = args[i];\\n\\n      if (cConvChar === \"s\") {\\n        return arg.toString();\\n      }\\n\\n      let flags = 0;\\n\\n      if (cFlags) {\\n        for (const flag of cFlags) {\\n          switch (flag) {\\n            case \"+\":\\n              flags |= PLUS;\\n              break;\\n\\n            case \" \":\\n              flags |= SPACE;\\n              break;\\n\\n            case \"0\":\\n              flags |= ZERO;\\n              break;\\n\\n            case \"#\":\\n              flags |= HASH;\\n              break;\\n          }\\n        }\\n      }\\n\\n      cFlags = flags;\\n\\n      if (nWidth) {\\n        nWidth = parseInt(nWidth);\\n      }\\n\\n      let intPart = Math.trunc(arg);\\n\\n      if (cConvChar === \"x\") {\\n        let hex = Math.abs(intPart).toString(16).toUpperCase();\\n\\n        if (nWidth !== undefined) {\\n          hex = hex.padStart(nWidth, cFlags & ZERO ? \"0\" : \" \");\\n        }\\n\\n        if (cFlags & HASH) {\\n          hex = `0x${hex}`;\\n        }\\n\\n        return hex;\\n      }\\n\\n      if (nPrecision) {\\n        nPrecision = parseInt(nPrecision.substring(1));\\n      }\\n\\n      nDecSep = nDecSep ? nDecSep.substring(1) : \"0\";\\n      const separators = {\\n        0: [\",\", \".\"],\\n        1: [\"\", \".\"],\\n        2: [\".\", \",\"],\\n        3: [\"\", \",\"],\\n        4: [\"\\'\", \".\"]\\n      };\\n      const [thousandSep, decimalSep] = separators[nDecSep];\\n      let decPart = \"\";\\n\\n      if (cConvChar === \"f\") {\\n        if (nPrecision !== undefined) {\\n          decPart = Math.abs(arg - intPart).toFixed(nPrecision);\\n        } else {\\n          decPart = Math.abs(arg - intPart).toString();\\n        }\\n\\n        if (decPart.length > 2) {\\n          decPart = `${decimalSep}${decPart.substring(2)}`;\\n        } else if (cFlags & HASH) {\\n          decPart = \".\";\\n        } else {\\n          decPart = \"\";\\n        }\\n      }\\n\\n      let sign = \"\";\\n\\n      if (intPart < 0) {\\n        sign = \"-\";\\n        intPart = -intPart;\\n      } else if (cFlags & PLUS) {\\n        sign = \"+\";\\n      } else if (cFlags & SPACE) {\\n        sign = \" \";\\n      }\\n\\n      if (thousandSep && intPart >= 1000) {\\n        const buf = [];\\n\\n        while (true) {\\n          buf.push((intPart % 1000).toString().padStart(3, \"0\"));\\n          intPart = Math.trunc(intPart / 1000);\\n\\n          if (intPart < 1000) {\\n            buf.push(intPart.toString());\\n            break;\\n          }\\n        }\\n\\n        intPart = buf.reverse().join(thousandSep);\\n      } else {\\n        intPart = intPart.toString();\\n      }\\n\\n      let n = `${intPart}${decPart}`;\\n\\n      if (nWidth !== undefined) {\\n        n = n.padStart(nWidth - sign.length, cFlags & ZERO ? \"0\" : \" \");\\n      }\\n\\n      return `${sign}${n}`;\\n    });\\n  }\\n\\n  iconStreamFromIcon() {}\\n\\n  printd(cFormat, oDate) {\\n    switch (cFormat) {\\n      case 0:\\n        return this.printd(\"D:yyyymmddHHMMss\", oDate);\\n\\n      case 1:\\n        return this.printd(\"yyyy.mm.dd HH:MM:ss\", oDate);\\n\\n      case 2:\\n        return this.printd(\"m/d/yy h:MM:ss tt\", oDate);\\n    }\\n\\n    const handlers = {\\n      mmmm: data => {\\n        return this._months[data.month];\\n      },\\n      mmm: data => {\\n        return this._months[data.month].substring(0, 3);\\n      },\\n      mm: data => {\\n        return (data.month + 1).toString().padStart(2, \"0\");\\n      },\\n      m: data => {\\n        return (data.month + 1).toString();\\n      },\\n      dddd: data => {\\n        return this._days[data.dayOfWeek];\\n      },\\n      ddd: data => {\\n        return this._days[data.dayOfWeek].substring(0, 3);\\n      },\\n      dd: data => {\\n        return data.day.toString().padStart(2, \"0\");\\n      },\\n      d: data => {\\n        return data.day.toString();\\n      },\\n      yyyy: data => {\\n        return data.year.toString();\\n      },\\n      yy: data => {\\n        return (data.year % 100).toString().padStart(2, \"0\");\\n      },\\n      HH: data => {\\n        return data.hours.toString().padStart(2, \"0\");\\n      },\\n      H: data => {\\n        return data.hours.toString();\\n      },\\n      hh: data => {\\n        return (1 + (data.hours + 11) % 12).toString().padStart(2, \"0\");\\n      },\\n      h: data => {\\n        return (1 + (data.hours + 11) % 12).toString();\\n      },\\n      MM: data => {\\n        return data.minutes.toString().padStart(2, \"0\");\\n      },\\n      M: data => {\\n        return data.minutes.toString();\\n      },\\n      ss: data => {\\n        return data.seconds.toString().padStart(2, \"0\");\\n      },\\n      s: data => {\\n        return data.seconds.toString();\\n      },\\n      tt: data => {\\n        return data.hours < 12 ? \"am\" : \"pm\";\\n      },\\n      t: data => {\\n        return data.hours < 12 ? \"a\" : \"p\";\\n      }\\n    };\\n    const data = {\\n      year: oDate.getFullYear(),\\n      month: oDate.getMonth(),\\n      day: oDate.getDate(),\\n      dayOfWeek: oDate.getDay(),\\n      hours: oDate.getHours(),\\n      minutes: oDate.getMinutes(),\\n      seconds: oDate.getSeconds()\\n    };\\n    const patterns = /(mmmm|mmm|mm|m|dddd|ddd|dd|d|yyyy|yy|HH|H|hh|h|MM|M|ss|s|tt|t|\\\\\\\\.)/g;\\n    return cFormat.replace(patterns, function (match, pattern) {\\n      if (pattern in handlers) {\\n        return handlers[pattern](data);\\n      }\\n\\n      return pattern.charCodeAt(1);\\n    });\\n  }\\n\\n  printx(cFormat, cSource) {\\n    const handlers = [x => x, x => x.toUpperCase(), x => x.toLowerCase()];\\n    const buf = [];\\n    let i = 0;\\n    const ii = cSource.length;\\n    let currCase = handlers[0];\\n    let escaped = false;\\n\\n    for (const command of cFormat) {\\n      if (escaped) {\\n        buf.push(command);\\n        escaped = false;\\n        continue;\\n      }\\n\\n      if (i >= ii) {\\n        break;\\n      }\\n\\n      switch (command) {\\n        case \"?\":\\n          buf.push(currCase(cSource.charAt(i++)));\\n          break;\\n\\n        case \"X\":\\n          while (i < ii) {\\n            const char = cSource.charAt(i++);\\n\\n            if (\"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\" || \"0\" <= char && char <= \"9\") {\\n              buf.push(currCase(char));\\n              break;\\n            }\\n          }\\n\\n          break;\\n\\n        case \"A\":\\n          while (i < ii) {\\n            const char = cSource.charAt(i++);\\n\\n            if (\"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\") {\\n              buf.push(currCase(char));\\n              break;\\n            }\\n          }\\n\\n          break;\\n\\n        case \"9\":\\n          while (i < ii) {\\n            const char = cSource.charAt(i++);\\n\\n            if (\"0\" <= char && char <= \"9\") {\\n              buf.push(char);\\n              break;\\n            }\\n          }\\n\\n          break;\\n\\n        case \"*\":\\n          while (i < ii) {\\n            buf.push(currCase(cSource.charAt(i++)));\\n          }\\n\\n          break;\\n\\n        case \"\\\\\\\\\":\\n          escaped = true;\\n          break;\\n\\n        case \">\":\\n          currCase = handlers[1];\\n          break;\\n\\n        case \"<\":\\n          currCase = handlers[2];\\n          break;\\n\\n        case \"=\":\\n          currCase = handlers[0];\\n          break;\\n\\n        default:\\n          buf.push(command);\\n      }\\n    }\\n\\n    return buf.join(\"\");\\n  }\\n\\n  scand(cFormat, cDate) {\\n    if (cDate === \"\") {\\n      return new Date();\\n    }\\n\\n    switch (cFormat) {\\n      case 0:\\n        return this.scand(\"D:yyyymmddHHMMss\", cDate);\\n\\n      case 1:\\n        return this.scand(\"yyyy.mm.dd HH:MM:ss\", cDate);\\n\\n      case 2:\\n        return this.scand(\"m/d/yy h:MM:ss tt\", cDate);\\n    }\\n\\n    if (!this._scandCache.has(cFormat)) {\\n      const months = this._months;\\n      const days = this._days;\\n      const handlers = {\\n        mmmm: {\\n          pattern: `(${months.join(\"|\")})`,\\n          action: (value, data) => {\\n            data.month = months.indexOf(value);\\n          }\\n        },\\n        mmm: {\\n          pattern: `(${months.map(month => month.substring(0, 3)).join(\"|\")})`,\\n          action: (value, data) => {\\n            data.month = months.findIndex(month => month.substring(0, 3) === value);\\n          }\\n        },\\n        mm: {\\n          pattern: `([0-9]{2})`,\\n          action: (value, data) => {\\n            data.month = parseInt(value) - 1;\\n          }\\n        },\\n        m: {\\n          pattern: `([0-9]{1,2})`,\\n          action: (value, data) => {\\n            data.month = parseInt(value) - 1;\\n          }\\n        },\\n        dddd: {\\n          pattern: `(${days.join(\"|\")})`,\\n          action: (value, data) => {\\n            data.day = days.indexOf(value);\\n          }\\n        },\\n        ddd: {\\n          pattern: `(${days.map(day => day.substring(0, 3)).join(\"|\")})`,\\n          action: (value, data) => {\\n            data.day = days.findIndex(day => day.substring(0, 3) === value);\\n          }\\n        },\\n        dd: {\\n          pattern: \"([0-9]{2})\",\\n          action: (value, data) => {\\n            data.day = parseInt(value);\\n          }\\n        },\\n        d: {\\n          pattern: \"([0-9]{1,2})\",\\n          action: (value, data) => {\\n            data.day = parseInt(value);\\n          }\\n        },\\n        yyyy: {\\n          pattern: \"([0-9]{4})\",\\n          action: (value, data) => {\\n            data.year = parseInt(value);\\n          }\\n        },\\n        yy: {\\n          pattern: \"([0-9]{2})\",\\n          action: (value, data) => {\\n            data.year = 2000 + parseInt(value);\\n          }\\n        },\\n        HH: {\\n          pattern: \"([0-9]{2})\",\\n          action: (value, data) => {\\n            data.hours = parseInt(value);\\n          }\\n        },\\n        H: {\\n          pattern: \"([0-9]{1,2})\",\\n          action: (value, data) => {\\n            data.hours = parseInt(value);\\n          }\\n        },\\n        hh: {\\n          pattern: \"([0-9]{2})\",\\n          action: (value, data) => {\\n            data.hours = parseInt(value);\\n          }\\n        },\\n        h: {\\n          pattern: \"([0-9]{1,2})\",\\n          action: (value, data) => {\\n            data.hours = parseInt(value);\\n          }\\n        },\\n        MM: {\\n          pattern: \"([0-9]{2})\",\\n          action: (value, data) => {\\n            data.minutes = parseInt(value);\\n          }\\n        },\\n        M: {\\n          pattern: \"([0-9]{1,2})\",\\n          action: (value, data) => {\\n            data.minutes = parseInt(value);\\n          }\\n        },\\n        ss: {\\n          pattern: \"([0-9]{2})\",\\n          action: (value, data) => {\\n            data.seconds = parseInt(value);\\n          }\\n        },\\n        s: {\\n          pattern: \"([0-9]{1,2})\",\\n          action: (value, data) => {\\n            data.seconds = parseInt(value);\\n          }\\n        },\\n        tt: {\\n          pattern: \"([aApP][mM])\",\\n          action: (value, data) => {\\n            const char = value.charAt(0);\\n            data.am = char === \"a\" || char === \"A\";\\n          }\\n        },\\n        t: {\\n          pattern: \"([aApP])\",\\n          action: (value, data) => {\\n            data.am = value === \"a\" || value === \"A\";\\n          }\\n        }\\n      };\\n      const escapedFormat = cFormat.replace(/[.*+\\\\-?^${}()|[\\\\]\\\\\\\\]/g, \"\\\\\\\\$&\");\\n      const patterns = /(mmmm|mmm|mm|m|dddd|ddd|dd|d|yyyy|yy|HH|H|hh|h|MM|M|ss|s|tt|t)/g;\\n      const actions = [];\\n      const re = escapedFormat.replace(patterns, function (match, patternElement) {\\n        const {\\n          pattern,\\n          action\\n        } = handlers[patternElement];\\n        actions.push(action);\\n        return pattern;\\n      });\\n\\n      this._scandCache.set(cFormat, [re, actions]);\\n    }\\n\\n    const [re, actions] = this._scandCache.get(cFormat);\\n\\n    const matches = new RegExp(re, \"g\").exec(cDate);\\n\\n    if (!matches || matches.length !== actions.length + 1) {\\n      return null;\\n    }\\n\\n    const data = {\\n      year: 0,\\n      month: 0,\\n      day: 0,\\n      hours: 0,\\n      minutes: 0,\\n      seconds: 0,\\n      am: null\\n    };\\n    actions.forEach((action, i) => action(matches[i + 1], data));\\n\\n    if (data.am !== null) {\\n      data.hours = data.hours % 12 + (data.am ? 0 : 12);\\n    }\\n\\n    return new Date(data.year, data.month, data.day, data.hours, data.minutes, data.seconds);\\n  }\\n\\n  spansToXML() {}\\n\\n  stringFromStream() {}\\n\\n  xmlToSpans() {}\\n\\n}\\n\\nexports.Util = Util;\\n\\n/***/ })\\n/******/ \\t]);\\n/************************************************************************/\\n/******/ \\t// The module cache\\n/******/ \\tvar __webpack_module_cache__ = {};\\n/******/ \\t\\n/******/ \\t// The require function\\n/******/ \\tfunction __w_pdfjs_require__(moduleId) {\\n/******/ \\t\\t// Check if module is in cache\\n/******/ \\t\\tvar cachedModule = __webpack_module_cache__[moduleId];\\n/******/ \\t\\tif (cachedModule !== undefined) {\\n/******/ \\t\\t\\treturn cachedModule.exports;\\n/******/ \\t\\t}\\n/******/ \\t\\t// Create a new module (and put it into the cache)\\n/******/ \\t\\tvar module = __webpack_module_cache__[moduleId] = {\\n/******/ \\t\\t\\t// no module.id needed\\n/******/ \\t\\t\\t// no module.loaded needed\\n/******/ \\t\\t\\texports: {}\\n/******/ \\t\\t};\\n/******/ \\t\\n/******/ \\t\\t// Execute the module function\\n/******/ \\t\\t__webpack_modules__[moduleId](module, module.exports, __w_pdfjs_require__);\\n/******/ \\t\\n/******/ \\t\\t// Return the exports of the module\\n/******/ \\t\\treturn module.exports;\\n/******/ \\t}\\n/******/ \\t\\n/************************************************************************/\\nvar __webpack_exports__ = {};\\n// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.\\n(() => {\\nvar exports = __webpack_exports__;\\n\\n\\nObject.defineProperty(exports, \"__esModule\", ({\\n  value: true\\n}));\\nObject.defineProperty(exports, \"initSandbox\", ({\\n  enumerable: true,\\n  get: function () {\\n    return _initialization.initSandbox;\\n  }\\n}));\\n\\nvar _initialization = __w_pdfjs_require__(1);\\n\\nconst pdfjsVersion = \\'2.8.335\\';\\nconst pdfjsBuild = \\'228adbf67\\';\\n})();\\n\\n/******/ \\treturn __webpack_exports__;\\n/******/ })()\\n;\\n});'];\n\n    if (!TESTING) {\n      code.push(\"delete dump;\");\n    } else {\n      code.push(`globalThis.sendResultForTesting = callExternalFunction.bind(null, \"send\");`);\n    }\n\n    let success = false;\n\n    try {\n      const sandboxData = JSON.stringify(data);\n      code.push(`pdfjsScripting.initSandbox({ data: ${sandboxData} })`);\n      success = !!this._module.ccall(\"init\", \"number\", [\"string\", \"number\"], [code.join(\"\\n\"), this._alertOnError]);\n    } catch (error) {\n      console.error(error);\n    }\n\n    if (success) {\n      this.support.commFun = this._module.cwrap(\"commFun\", null, [\"string\", \"string\"]);\n    } else {\n      this.nukeSandbox();\n      throw new Error(\"Cannot start sandbox\");\n    }\n  }\n\n  dispatchEvent(event) {\n    this.support.callSandboxFunction(\"dispatchEvent\", event);\n  }\n\n  dumpMemoryUse() {\n    if (this._module) {\n      this._module.ccall(\"dumpMemoryUse\", null, []);\n    }\n  }\n\n  nukeSandbox() {\n    if (this._module !== null) {\n      this.support.destroy();\n      this.support = null;\n\n      this._module.ccall(\"nukeSandbox\", null, []);\n\n      this._module = null;\n    }\n  }\n\n  evalForTesting(code, key) {\n    if (TESTING) {\n      this._module.ccall(\"evalInSandbox\", null, [\"string\", \"int\"], [`try {\n             sendResultForTesting([{ id: \"${key}\", result: ${code} }]);\n          } catch (error) {\n             sendResultForTesting([{ id: \"${key}\", result: error.message }]);\n          }`, this._alertOnError]);\n    }\n  }\n\n}\n\nfunction QuickJSSandbox() {\n  return (0, _quickjsEval.default)().then(module => {\n    return new Sandbox(window, module);\n  });\n}\n})();\n\n/******/ \treturn __webpack_exports__;\n/******/ })()\n;\n});\n//# sourceMappingURL=pdf.sandbox.js.map"
  },
  {
    "path": "lib/pdf.js/build/pdf.worker.js",
    "content": "/**\n * @licstart The following is the entire license notice for the\n * Javascript code in this page\n *\n * Copyright 2021 Mozilla Foundation\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 * @licend The above is the entire license notice for the\n * Javascript code in this page\n */\n\n(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(\"pdfjs-dist/build/pdf.worker\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"pdfjs-dist/build/pdf.worker\"] = factory();\n\telse\n\t\troot[\"pdfjs-dist/build/pdf.worker\"] = root.pdfjsWorker = factory();\n})(this, function() {\nreturn /******/ (() => { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \tvar __webpack_modules__ = ([\n/* 0 */,\n/* 1 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.WorkerTask = exports.WorkerMessageHandler = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _primitives = __w_pdfjs_require__(5);\n\nvar _pdf_manager = __w_pdfjs_require__(6);\n\nvar _writer = __w_pdfjs_require__(48);\n\nvar _is_node = __w_pdfjs_require__(4);\n\nvar _message_handler = __w_pdfjs_require__(69);\n\nvar _worker_stream = __w_pdfjs_require__(70);\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nclass WorkerTask {\n  constructor(name) {\n    this.name = name;\n    this.terminated = false;\n    this._capability = (0, _util.createPromiseCapability)();\n  }\n\n  get finished() {\n    return this._capability.promise;\n  }\n\n  finish() {\n    this._capability.resolve();\n  }\n\n  terminate() {\n    this.terminated = true;\n  }\n\n  ensureNotTerminated() {\n    if (this.terminated) {\n      throw new Error(\"Worker task was terminated\");\n    }\n  }\n\n}\n\nexports.WorkerTask = WorkerTask;\n\nclass WorkerMessageHandler {\n  static setup(handler, port) {\n    var testMessageProcessed = false;\n    handler.on(\"test\", function wphSetupTest(data) {\n      if (testMessageProcessed) {\n        return;\n      }\n\n      testMessageProcessed = true;\n\n      if (!(data instanceof Uint8Array)) {\n        handler.send(\"test\", null);\n        return;\n      }\n\n      const supportTransfers = data[0] === 255;\n      handler.postMessageTransfers = supportTransfers;\n      handler.send(\"test\", {\n        supportTransfers\n      });\n    });\n    handler.on(\"configure\", function wphConfigure(data) {\n      (0, _util.setVerbosityLevel)(data.verbosity);\n    });\n    handler.on(\"GetDocRequest\", function wphSetupDoc(data) {\n      return WorkerMessageHandler.createDocumentHandler(data, port);\n    });\n  }\n\n  static createDocumentHandler(docParams, port) {\n    var pdfManager;\n    var terminated = false;\n    var cancelXHRs = null;\n    var WorkerTasks = [];\n    const verbosity = (0, _util.getVerbosityLevel)();\n    const apiVersion = docParams.apiVersion;\n    const workerVersion = '2.8.335';\n\n    if (apiVersion !== workerVersion) {\n      throw new Error(`The API version \"${apiVersion}\" does not match ` + `the Worker version \"${workerVersion}\".`);\n    }\n\n    const enumerableProperties = [];\n\n    for (const property in []) {\n      enumerableProperties.push(property);\n    }\n\n    if (enumerableProperties.length) {\n      throw new Error(\"The `Array.prototype` contains unexpected enumerable properties: \" + enumerableProperties.join(\", \") + \"; thus breaking e.g. `for...in` iteration of `Array`s.\");\n    }\n\n    if (typeof ReadableStream === \"undefined\") {\n      throw new Error(\"The browser/environment lacks native support for critical \" + \"functionality used by the PDF.js library (e.g. `ReadableStream`); \" + \"please use a `legacy`-build instead.\");\n    }\n\n    var docId = docParams.docId;\n    var docBaseUrl = docParams.docBaseUrl;\n    var workerHandlerName = docParams.docId + \"_worker\";\n    var handler = new _message_handler.MessageHandler(workerHandlerName, docId, port);\n    handler.postMessageTransfers = docParams.postMessageTransfers;\n\n    function ensureNotTerminated() {\n      if (terminated) {\n        throw new Error(\"Worker was terminated\");\n      }\n    }\n\n    function startWorkerTask(task) {\n      WorkerTasks.push(task);\n    }\n\n    function finishWorkerTask(task) {\n      task.finish();\n      var i = WorkerTasks.indexOf(task);\n      WorkerTasks.splice(i, 1);\n    }\n\n    async function loadDocument(recoveryMode) {\n      await pdfManager.ensureDoc(\"checkHeader\");\n      await pdfManager.ensureDoc(\"parseStartXRef\");\n      await pdfManager.ensureDoc(\"parse\", [recoveryMode]);\n\n      if (!recoveryMode) {\n        await pdfManager.ensureDoc(\"checkFirstPage\");\n      }\n\n      const [numPages, fingerprint, isPureXfa] = await Promise.all([pdfManager.ensureDoc(\"numPages\"), pdfManager.ensureDoc(\"fingerprint\"), pdfManager.ensureDoc(\"isPureXfa\")]);\n      return {\n        numPages,\n        fingerprint,\n        isPureXfa\n      };\n    }\n\n    function getPdfManager(data, evaluatorOptions, enableXfa) {\n      var pdfManagerCapability = (0, _util.createPromiseCapability)();\n      let newPdfManager;\n      var source = data.source;\n\n      if (source.data) {\n        try {\n          newPdfManager = new _pdf_manager.LocalPdfManager(docId, source.data, source.password, evaluatorOptions, enableXfa, docBaseUrl);\n          pdfManagerCapability.resolve(newPdfManager);\n        } catch (ex) {\n          pdfManagerCapability.reject(ex);\n        }\n\n        return pdfManagerCapability.promise;\n      }\n\n      var pdfStream,\n          cachedChunks = [];\n\n      try {\n        pdfStream = new _worker_stream.PDFWorkerStream(handler);\n      } catch (ex) {\n        pdfManagerCapability.reject(ex);\n        return pdfManagerCapability.promise;\n      }\n\n      var fullRequest = pdfStream.getFullReader();\n      fullRequest.headersReady.then(function () {\n        if (!fullRequest.isRangeSupported) {\n          return;\n        }\n\n        var disableAutoFetch = source.disableAutoFetch || fullRequest.isStreamingSupported;\n        newPdfManager = new _pdf_manager.NetworkPdfManager(docId, pdfStream, {\n          msgHandler: handler,\n          password: source.password,\n          length: fullRequest.contentLength,\n          disableAutoFetch,\n          rangeChunkSize: source.rangeChunkSize\n        }, evaluatorOptions, enableXfa, docBaseUrl);\n\n        for (let i = 0; i < cachedChunks.length; i++) {\n          newPdfManager.sendProgressiveData(cachedChunks[i]);\n        }\n\n        cachedChunks = [];\n        pdfManagerCapability.resolve(newPdfManager);\n        cancelXHRs = null;\n      }).catch(function (reason) {\n        pdfManagerCapability.reject(reason);\n        cancelXHRs = null;\n      });\n      var loaded = 0;\n\n      var flushChunks = function () {\n        var pdfFile = (0, _util.arraysToBytes)(cachedChunks);\n\n        if (source.length && pdfFile.length !== source.length) {\n          (0, _util.warn)(\"reported HTTP length is different from actual\");\n        }\n\n        try {\n          newPdfManager = new _pdf_manager.LocalPdfManager(docId, pdfFile, source.password, evaluatorOptions, enableXfa, docBaseUrl);\n          pdfManagerCapability.resolve(newPdfManager);\n        } catch (ex) {\n          pdfManagerCapability.reject(ex);\n        }\n\n        cachedChunks = [];\n      };\n\n      var readPromise = new Promise(function (resolve, reject) {\n        var readChunk = function ({\n          value,\n          done\n        }) {\n          try {\n            ensureNotTerminated();\n\n            if (done) {\n              if (!newPdfManager) {\n                flushChunks();\n              }\n\n              cancelXHRs = null;\n              return;\n            }\n\n            loaded += (0, _util.arrayByteLength)(value);\n\n            if (!fullRequest.isStreamingSupported) {\n              handler.send(\"DocProgress\", {\n                loaded,\n                total: Math.max(loaded, fullRequest.contentLength || 0)\n              });\n            }\n\n            if (newPdfManager) {\n              newPdfManager.sendProgressiveData(value);\n            } else {\n              cachedChunks.push(value);\n            }\n\n            fullRequest.read().then(readChunk, reject);\n          } catch (e) {\n            reject(e);\n          }\n        };\n\n        fullRequest.read().then(readChunk, reject);\n      });\n      readPromise.catch(function (e) {\n        pdfManagerCapability.reject(e);\n        cancelXHRs = null;\n      });\n\n      cancelXHRs = function (reason) {\n        pdfStream.cancelAllRequests(reason);\n      };\n\n      return pdfManagerCapability.promise;\n    }\n\n    function setupDoc(data) {\n      function onSuccess(doc) {\n        ensureNotTerminated();\n        handler.send(\"GetDoc\", {\n          pdfInfo: doc\n        });\n      }\n\n      function onFailure(ex) {\n        ensureNotTerminated();\n\n        if (ex instanceof _util.PasswordException) {\n          var task = new WorkerTask(`PasswordException: response ${ex.code}`);\n          startWorkerTask(task);\n          handler.sendWithPromise(\"PasswordRequest\", ex).then(function ({\n            password\n          }) {\n            finishWorkerTask(task);\n            pdfManager.updatePassword(password);\n            pdfManagerReady();\n          }).catch(function () {\n            finishWorkerTask(task);\n            handler.send(\"DocException\", ex);\n          });\n        } else if (ex instanceof _util.InvalidPDFException || ex instanceof _util.MissingPDFException || ex instanceof _util.UnexpectedResponseException || ex instanceof _util.UnknownErrorException) {\n          handler.send(\"DocException\", ex);\n        } else {\n          handler.send(\"DocException\", new _util.UnknownErrorException(ex.message, ex.toString()));\n        }\n      }\n\n      function pdfManagerReady() {\n        ensureNotTerminated();\n        loadDocument(false).then(onSuccess, function (reason) {\n          ensureNotTerminated();\n\n          if (!(reason instanceof _core_utils.XRefParseException)) {\n            onFailure(reason);\n            return;\n          }\n\n          pdfManager.requestLoadedStream();\n          pdfManager.onLoadedStream().then(function () {\n            ensureNotTerminated();\n            loadDocument(true).then(onSuccess, onFailure);\n          });\n        });\n      }\n\n      ensureNotTerminated();\n      var evaluatorOptions = {\n        maxImageSize: data.maxImageSize,\n        disableFontFace: data.disableFontFace,\n        ignoreErrors: data.ignoreErrors,\n        isEvalSupported: data.isEvalSupported,\n        fontExtraProperties: data.fontExtraProperties\n      };\n      getPdfManager(data, evaluatorOptions, data.enableXfa).then(function (newPdfManager) {\n        if (terminated) {\n          newPdfManager.terminate(new _util.AbortException(\"Worker was terminated.\"));\n          throw new Error(\"Worker was terminated\");\n        }\n\n        pdfManager = newPdfManager;\n        pdfManager.onLoadedStream().then(function (stream) {\n          handler.send(\"DataLoaded\", {\n            length: stream.bytes.byteLength\n          });\n        });\n      }).then(pdfManagerReady, onFailure);\n    }\n\n    handler.on(\"GetPage\", function wphSetupGetPage(data) {\n      return pdfManager.getPage(data.pageIndex).then(function (page) {\n        return Promise.all([pdfManager.ensure(page, \"rotate\"), pdfManager.ensure(page, \"ref\"), pdfManager.ensure(page, \"userUnit\"), pdfManager.ensure(page, \"view\")]).then(function ([rotate, ref, userUnit, view]) {\n          return {\n            rotate,\n            ref,\n            userUnit,\n            view\n          };\n        });\n      });\n    });\n    handler.on(\"GetPageIndex\", function wphSetupGetPageIndex({\n      ref\n    }) {\n      const pageRef = _primitives.Ref.get(ref.num, ref.gen);\n\n      return pdfManager.ensureCatalog(\"getPageIndex\", [pageRef]);\n    });\n    handler.on(\"GetDestinations\", function wphSetupGetDestinations(data) {\n      return pdfManager.ensureCatalog(\"destinations\");\n    });\n    handler.on(\"GetDestination\", function wphSetupGetDestination(data) {\n      return pdfManager.ensureCatalog(\"getDestination\", [data.id]);\n    });\n    handler.on(\"GetPageLabels\", function wphSetupGetPageLabels(data) {\n      return pdfManager.ensureCatalog(\"pageLabels\");\n    });\n    handler.on(\"GetPageLayout\", function wphSetupGetPageLayout(data) {\n      return pdfManager.ensureCatalog(\"pageLayout\");\n    });\n    handler.on(\"GetPageMode\", function wphSetupGetPageMode(data) {\n      return pdfManager.ensureCatalog(\"pageMode\");\n    });\n    handler.on(\"GetViewerPreferences\", function (data) {\n      return pdfManager.ensureCatalog(\"viewerPreferences\");\n    });\n    handler.on(\"GetOpenAction\", function (data) {\n      return pdfManager.ensureCatalog(\"openAction\");\n    });\n    handler.on(\"GetAttachments\", function wphSetupGetAttachments(data) {\n      return pdfManager.ensureCatalog(\"attachments\");\n    });\n    handler.on(\"GetJavaScript\", function wphSetupGetJavaScript(data) {\n      return pdfManager.ensureCatalog(\"javaScript\");\n    });\n    handler.on(\"GetDocJSActions\", function wphSetupGetDocJSActions(data) {\n      return pdfManager.ensureCatalog(\"jsActions\");\n    });\n    handler.on(\"GetPageJSActions\", function ({\n      pageIndex\n    }) {\n      return pdfManager.getPage(pageIndex).then(function (page) {\n        return page.jsActions;\n      });\n    });\n    handler.on(\"GetPageXfa\", function wphSetupGetXfa({\n      pageIndex\n    }) {\n      return pdfManager.getPage(pageIndex).then(function (page) {\n        return pdfManager.ensure(page, \"xfaData\");\n      });\n    });\n    handler.on(\"GetIsPureXfa\", function wphSetupGetIsPureXfa(data) {\n      return pdfManager.ensureDoc(\"isPureXfa\");\n    });\n    handler.on(\"GetOutline\", function wphSetupGetOutline(data) {\n      return pdfManager.ensureCatalog(\"documentOutline\");\n    });\n    handler.on(\"GetOptionalContentConfig\", function (data) {\n      return pdfManager.ensureCatalog(\"optionalContentConfig\");\n    });\n    handler.on(\"GetPermissions\", function (data) {\n      return pdfManager.ensureCatalog(\"permissions\");\n    });\n    handler.on(\"GetMetadata\", function wphSetupGetMetadata(data) {\n      return Promise.all([pdfManager.ensureDoc(\"documentInfo\"), pdfManager.ensureCatalog(\"metadata\")]);\n    });\n    handler.on(\"GetMarkInfo\", function wphSetupGetMarkInfo(data) {\n      return pdfManager.ensureCatalog(\"markInfo\");\n    });\n    handler.on(\"GetData\", function wphSetupGetData(data) {\n      pdfManager.requestLoadedStream();\n      return pdfManager.onLoadedStream().then(function (stream) {\n        return stream.bytes;\n      });\n    });\n    handler.on(\"GetStats\", function wphSetupGetStats(data) {\n      return pdfManager.ensureXRef(\"stats\");\n    });\n    handler.on(\"GetAnnotations\", function ({\n      pageIndex,\n      intent\n    }) {\n      return pdfManager.getPage(pageIndex).then(function (page) {\n        return page.getAnnotationsData(intent);\n      });\n    });\n    handler.on(\"GetFieldObjects\", function (data) {\n      return pdfManager.ensureDoc(\"fieldObjects\");\n    });\n    handler.on(\"HasJSActions\", function (data) {\n      return pdfManager.ensureDoc(\"hasJSActions\");\n    });\n    handler.on(\"GetCalculationOrderIds\", function (data) {\n      return pdfManager.ensureDoc(\"calculationOrderIds\");\n    });\n    handler.on(\"SaveDocument\", function ({\n      numPages,\n      annotationStorage,\n      filename\n    }) {\n      pdfManager.requestLoadedStream();\n      const promises = [pdfManager.onLoadedStream(), pdfManager.ensureCatalog(\"acroForm\"), pdfManager.ensureDoc(\"xref\"), pdfManager.ensureDoc(\"startXRef\")];\n\n      for (let pageIndex = 0; pageIndex < numPages; pageIndex++) {\n        promises.push(pdfManager.getPage(pageIndex).then(function (page) {\n          const task = new WorkerTask(`Save: page ${pageIndex}`);\n          startWorkerTask(task);\n          return page.save(handler, task, annotationStorage).finally(function () {\n            finishWorkerTask(task);\n          });\n        }));\n      }\n\n      return Promise.all(promises).then(function ([stream, acroForm, xref, startXRef, ...refs]) {\n        let newRefs = [];\n\n        for (const ref of refs) {\n          newRefs = ref.filter(x => x !== null).reduce((a, b) => a.concat(b), newRefs);\n        }\n\n        if (newRefs.length === 0) {\n          return stream.bytes;\n        }\n\n        const xfa = acroForm instanceof _primitives.Dict && acroForm.get(\"XFA\") || [];\n        let xfaDatasets = null;\n\n        if (Array.isArray(xfa)) {\n          for (let i = 0, ii = xfa.length; i < ii; i += 2) {\n            if (xfa[i] === \"datasets\") {\n              xfaDatasets = xfa[i + 1];\n            }\n          }\n        } else {\n          (0, _util.warn)(\"Unsupported XFA type.\");\n        }\n\n        let newXrefInfo = Object.create(null);\n\n        if (xref.trailer) {\n          const infoObj = Object.create(null);\n          const xrefInfo = xref.trailer.get(\"Info\") || null;\n\n          if (xrefInfo instanceof _primitives.Dict) {\n            xrefInfo.forEach((key, value) => {\n              if ((0, _util.isString)(key) && (0, _util.isString)(value)) {\n                infoObj[key] = (0, _util.stringToPDFString)(value);\n              }\n            });\n          }\n\n          newXrefInfo = {\n            rootRef: xref.trailer.getRaw(\"Root\") || null,\n            encrypt: xref.trailer.getRaw(\"Encrypt\") || null,\n            newRef: xref.getNewRef(),\n            infoRef: xref.trailer.getRaw(\"Info\") || null,\n            info: infoObj,\n            fileIds: xref.trailer.getRaw(\"ID\") || null,\n            startXRef,\n            filename\n          };\n        }\n\n        xref.resetNewRef();\n        return (0, _writer.incrementalUpdate)({\n          originalData: stream.bytes,\n          xrefInfo: newXrefInfo,\n          newRefs,\n          xref,\n          datasetsRef: xfaDatasets\n        });\n      });\n    });\n    handler.on(\"GetOperatorList\", function wphSetupRenderPage(data, sink) {\n      var pageIndex = data.pageIndex;\n      pdfManager.getPage(pageIndex).then(function (page) {\n        var task = new WorkerTask(`GetOperatorList: page ${pageIndex}`);\n        startWorkerTask(task);\n        const start = verbosity >= _util.VerbosityLevel.INFOS ? Date.now() : 0;\n        page.getOperatorList({\n          handler,\n          sink,\n          task,\n          intent: data.intent,\n          renderInteractiveForms: data.renderInteractiveForms,\n          annotationStorage: data.annotationStorage\n        }).then(function (operatorListInfo) {\n          finishWorkerTask(task);\n\n          if (start) {\n            (0, _util.info)(`page=${pageIndex + 1} - getOperatorList: time=` + `${Date.now() - start}ms, len=${operatorListInfo.length}`);\n          }\n\n          sink.close();\n        }, function (reason) {\n          finishWorkerTask(task);\n\n          if (task.terminated) {\n            return;\n          }\n\n          handler.send(\"UnsupportedFeature\", {\n            featureId: _util.UNSUPPORTED_FEATURES.errorOperatorList\n          });\n          sink.error(reason);\n        });\n      });\n    });\n    handler.on(\"GetTextContent\", function wphExtractText(data, sink) {\n      var pageIndex = data.pageIndex;\n\n      sink.onPull = function (desiredSize) {};\n\n      sink.onCancel = function (reason) {};\n\n      pdfManager.getPage(pageIndex).then(function (page) {\n        var task = new WorkerTask(\"GetTextContent: page \" + pageIndex);\n        startWorkerTask(task);\n        const start = verbosity >= _util.VerbosityLevel.INFOS ? Date.now() : 0;\n        page.extractTextContent({\n          handler,\n          task,\n          sink,\n          normalizeWhitespace: data.normalizeWhitespace,\n          combineTextItems: data.combineTextItems\n        }).then(function () {\n          finishWorkerTask(task);\n\n          if (start) {\n            (0, _util.info)(`page=${pageIndex + 1} - getTextContent: time=` + `${Date.now() - start}ms`);\n          }\n\n          sink.close();\n        }, function (reason) {\n          finishWorkerTask(task);\n\n          if (task.terminated) {\n            return;\n          }\n\n          sink.error(reason);\n        });\n      });\n    });\n    handler.on(\"FontFallback\", function (data) {\n      return pdfManager.fontFallback(data.id, handler);\n    });\n    handler.on(\"Cleanup\", function wphCleanup(data) {\n      return pdfManager.cleanup(true);\n    });\n    handler.on(\"Terminate\", function wphTerminate(data) {\n      terminated = true;\n      const waitOn = [];\n\n      if (pdfManager) {\n        pdfManager.terminate(new _util.AbortException(\"Worker was terminated.\"));\n        const cleanupPromise = pdfManager.cleanup();\n        waitOn.push(cleanupPromise);\n        pdfManager = null;\n      } else {\n        (0, _primitives.clearPrimitiveCaches)();\n      }\n\n      if (cancelXHRs) {\n        cancelXHRs(new _util.AbortException(\"Worker was terminated.\"));\n      }\n\n      WorkerTasks.forEach(function (task) {\n        waitOn.push(task.finished);\n        task.terminate();\n      });\n      return Promise.all(waitOn).then(function () {\n        handler.destroy();\n        handler = null;\n      });\n    });\n    handler.on(\"Ready\", function wphReady(data) {\n      setupDoc(docParams);\n      docParams = null;\n    });\n    return workerHandlerName;\n  }\n\n  static initializeFromPort(port) {\n    var handler = new _message_handler.MessageHandler(\"worker\", \"main\", port);\n    WorkerMessageHandler.setup(handler, port);\n    handler.send(\"ready\", null);\n  }\n\n}\n\nexports.WorkerMessageHandler = WorkerMessageHandler;\n\nfunction isMessagePort(maybePort) {\n  return typeof maybePort.postMessage === \"function\" && \"onmessage\" in maybePort;\n}\n\nif (typeof window === \"undefined\" && !_is_node.isNodeJS && typeof self !== \"undefined\" && isMessagePort(self)) {\n  WorkerMessageHandler.initializeFromPort(self);\n}\n\n/***/ }),\n/* 2 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.arrayByteLength = arrayByteLength;\nexports.arraysToBytes = arraysToBytes;\nexports.assert = assert;\nexports.bytesToString = bytesToString;\nexports.createObjectURL = createObjectURL;\nexports.createPromiseCapability = createPromiseCapability;\nexports.createValidAbsoluteUrl = createValidAbsoluteUrl;\nexports.escapeString = escapeString;\nexports.getModificationDate = getModificationDate;\nexports.getVerbosityLevel = getVerbosityLevel;\nexports.info = info;\nexports.isArrayBuffer = isArrayBuffer;\nexports.isArrayEqual = isArrayEqual;\nexports.isAscii = isAscii;\nexports.isBool = isBool;\nexports.isNum = isNum;\nexports.isSameOrigin = isSameOrigin;\nexports.isString = isString;\nexports.objectFromMap = objectFromMap;\nexports.objectSize = objectSize;\nexports.removeNullCharacters = removeNullCharacters;\nexports.setVerbosityLevel = setVerbosityLevel;\nexports.shadow = shadow;\nexports.string32 = string32;\nexports.stringToBytes = stringToBytes;\nexports.stringToPDFString = stringToPDFString;\nexports.stringToUTF16BEString = stringToUTF16BEString;\nexports.stringToUTF8String = stringToUTF8String;\nexports.unreachable = unreachable;\nexports.utf8StringToString = utf8StringToString;\nexports.warn = warn;\nexports.VerbosityLevel = exports.Util = exports.UNSUPPORTED_FEATURES = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.TextRenderingMode = exports.StreamType = exports.PermissionFlag = exports.PasswordResponses = exports.PasswordException = exports.PageActionEventType = exports.OPS = exports.MissingPDFException = exports.IsLittleEndianCached = exports.IsEvalSupportedCached = exports.InvalidPDFException = exports.ImageKind = exports.IDENTITY_MATRIX = exports.FormatError = exports.FontType = exports.FONT_IDENTITY_MATRIX = exports.DocumentActionEventType = exports.CMapCompressionType = exports.BaseException = exports.AnnotationType = exports.AnnotationStateModelType = exports.AnnotationReviewState = exports.AnnotationReplyType = exports.AnnotationMarkedState = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationBorderStyleType = exports.AnnotationActionEventType = exports.AbortException = void 0;\n\n__w_pdfjs_require__(3);\n\nconst IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];\nexports.IDENTITY_MATRIX = IDENTITY_MATRIX;\nconst FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];\nexports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX;\nconst PermissionFlag = {\n  PRINT: 0x04,\n  MODIFY_CONTENTS: 0x08,\n  COPY: 0x10,\n  MODIFY_ANNOTATIONS: 0x20,\n  FILL_INTERACTIVE_FORMS: 0x100,\n  COPY_FOR_ACCESSIBILITY: 0x200,\n  ASSEMBLE: 0x400,\n  PRINT_HIGH_QUALITY: 0x800\n};\nexports.PermissionFlag = PermissionFlag;\nconst TextRenderingMode = {\n  FILL: 0,\n  STROKE: 1,\n  FILL_STROKE: 2,\n  INVISIBLE: 3,\n  FILL_ADD_TO_PATH: 4,\n  STROKE_ADD_TO_PATH: 5,\n  FILL_STROKE_ADD_TO_PATH: 6,\n  ADD_TO_PATH: 7,\n  FILL_STROKE_MASK: 3,\n  ADD_TO_PATH_FLAG: 4\n};\nexports.TextRenderingMode = TextRenderingMode;\nconst ImageKind = {\n  GRAYSCALE_1BPP: 1,\n  RGB_24BPP: 2,\n  RGBA_32BPP: 3\n};\nexports.ImageKind = ImageKind;\nconst AnnotationType = {\n  TEXT: 1,\n  LINK: 2,\n  FREETEXT: 3,\n  LINE: 4,\n  SQUARE: 5,\n  CIRCLE: 6,\n  POLYGON: 7,\n  POLYLINE: 8,\n  HIGHLIGHT: 9,\n  UNDERLINE: 10,\n  SQUIGGLY: 11,\n  STRIKEOUT: 12,\n  STAMP: 13,\n  CARET: 14,\n  INK: 15,\n  POPUP: 16,\n  FILEATTACHMENT: 17,\n  SOUND: 18,\n  MOVIE: 19,\n  WIDGET: 20,\n  SCREEN: 21,\n  PRINTERMARK: 22,\n  TRAPNET: 23,\n  WATERMARK: 24,\n  THREED: 25,\n  REDACT: 26\n};\nexports.AnnotationType = AnnotationType;\nconst AnnotationStateModelType = {\n  MARKED: \"Marked\",\n  REVIEW: \"Review\"\n};\nexports.AnnotationStateModelType = AnnotationStateModelType;\nconst AnnotationMarkedState = {\n  MARKED: \"Marked\",\n  UNMARKED: \"Unmarked\"\n};\nexports.AnnotationMarkedState = AnnotationMarkedState;\nconst AnnotationReviewState = {\n  ACCEPTED: \"Accepted\",\n  REJECTED: \"Rejected\",\n  CANCELLED: \"Cancelled\",\n  COMPLETED: \"Completed\",\n  NONE: \"None\"\n};\nexports.AnnotationReviewState = AnnotationReviewState;\nconst AnnotationReplyType = {\n  GROUP: \"Group\",\n  REPLY: \"R\"\n};\nexports.AnnotationReplyType = AnnotationReplyType;\nconst AnnotationFlag = {\n  INVISIBLE: 0x01,\n  HIDDEN: 0x02,\n  PRINT: 0x04,\n  NOZOOM: 0x08,\n  NOROTATE: 0x10,\n  NOVIEW: 0x20,\n  READONLY: 0x40,\n  LOCKED: 0x80,\n  TOGGLENOVIEW: 0x100,\n  LOCKEDCONTENTS: 0x200\n};\nexports.AnnotationFlag = AnnotationFlag;\nconst AnnotationFieldFlag = {\n  READONLY: 0x0000001,\n  REQUIRED: 0x0000002,\n  NOEXPORT: 0x0000004,\n  MULTILINE: 0x0001000,\n  PASSWORD: 0x0002000,\n  NOTOGGLETOOFF: 0x0004000,\n  RADIO: 0x0008000,\n  PUSHBUTTON: 0x0010000,\n  COMBO: 0x0020000,\n  EDIT: 0x0040000,\n  SORT: 0x0080000,\n  FILESELECT: 0x0100000,\n  MULTISELECT: 0x0200000,\n  DONOTSPELLCHECK: 0x0400000,\n  DONOTSCROLL: 0x0800000,\n  COMB: 0x1000000,\n  RICHTEXT: 0x2000000,\n  RADIOSINUNISON: 0x2000000,\n  COMMITONSELCHANGE: 0x4000000\n};\nexports.AnnotationFieldFlag = AnnotationFieldFlag;\nconst AnnotationBorderStyleType = {\n  SOLID: 1,\n  DASHED: 2,\n  BEVELED: 3,\n  INSET: 4,\n  UNDERLINE: 5\n};\nexports.AnnotationBorderStyleType = AnnotationBorderStyleType;\nconst AnnotationActionEventType = {\n  E: \"Mouse Enter\",\n  X: \"Mouse Exit\",\n  D: \"Mouse Down\",\n  U: \"Mouse Up\",\n  Fo: \"Focus\",\n  Bl: \"Blur\",\n  PO: \"PageOpen\",\n  PC: \"PageClose\",\n  PV: \"PageVisible\",\n  PI: \"PageInvisible\",\n  K: \"Keystroke\",\n  F: \"Format\",\n  V: \"Validate\",\n  C: \"Calculate\"\n};\nexports.AnnotationActionEventType = AnnotationActionEventType;\nconst DocumentActionEventType = {\n  WC: \"WillClose\",\n  WS: \"WillSave\",\n  DS: \"DidSave\",\n  WP: \"WillPrint\",\n  DP: \"DidPrint\"\n};\nexports.DocumentActionEventType = DocumentActionEventType;\nconst PageActionEventType = {\n  O: \"PageOpen\",\n  C: \"PageClose\"\n};\nexports.PageActionEventType = PageActionEventType;\nconst StreamType = {\n  UNKNOWN: \"UNKNOWN\",\n  FLATE: \"FLATE\",\n  LZW: \"LZW\",\n  DCT: \"DCT\",\n  JPX: \"JPX\",\n  JBIG: \"JBIG\",\n  A85: \"A85\",\n  AHX: \"AHX\",\n  CCF: \"CCF\",\n  RLX: \"RLX\"\n};\nexports.StreamType = StreamType;\nconst FontType = {\n  UNKNOWN: \"UNKNOWN\",\n  TYPE1: \"TYPE1\",\n  TYPE1C: \"TYPE1C\",\n  CIDFONTTYPE0: \"CIDFONTTYPE0\",\n  CIDFONTTYPE0C: \"CIDFONTTYPE0C\",\n  TRUETYPE: \"TRUETYPE\",\n  CIDFONTTYPE2: \"CIDFONTTYPE2\",\n  TYPE3: \"TYPE3\",\n  OPENTYPE: \"OPENTYPE\",\n  TYPE0: \"TYPE0\",\n  MMTYPE1: \"MMTYPE1\"\n};\nexports.FontType = FontType;\nconst VerbosityLevel = {\n  ERRORS: 0,\n  WARNINGS: 1,\n  INFOS: 5\n};\nexports.VerbosityLevel = VerbosityLevel;\nconst CMapCompressionType = {\n  NONE: 0,\n  BINARY: 1,\n  STREAM: 2\n};\nexports.CMapCompressionType = CMapCompressionType;\nconst OPS = {\n  dependency: 1,\n  setLineWidth: 2,\n  setLineCap: 3,\n  setLineJoin: 4,\n  setMiterLimit: 5,\n  setDash: 6,\n  setRenderingIntent: 7,\n  setFlatness: 8,\n  setGState: 9,\n  save: 10,\n  restore: 11,\n  transform: 12,\n  moveTo: 13,\n  lineTo: 14,\n  curveTo: 15,\n  curveTo2: 16,\n  curveTo3: 17,\n  closePath: 18,\n  rectangle: 19,\n  stroke: 20,\n  closeStroke: 21,\n  fill: 22,\n  eoFill: 23,\n  fillStroke: 24,\n  eoFillStroke: 25,\n  closeFillStroke: 26,\n  closeEOFillStroke: 27,\n  endPath: 28,\n  clip: 29,\n  eoClip: 30,\n  beginText: 31,\n  endText: 32,\n  setCharSpacing: 33,\n  setWordSpacing: 34,\n  setHScale: 35,\n  setLeading: 36,\n  setFont: 37,\n  setTextRenderingMode: 38,\n  setTextRise: 39,\n  moveText: 40,\n  setLeadingMoveText: 41,\n  setTextMatrix: 42,\n  nextLine: 43,\n  showText: 44,\n  showSpacedText: 45,\n  nextLineShowText: 46,\n  nextLineSetSpacingShowText: 47,\n  setCharWidth: 48,\n  setCharWidthAndBounds: 49,\n  setStrokeColorSpace: 50,\n  setFillColorSpace: 51,\n  setStrokeColor: 52,\n  setStrokeColorN: 53,\n  setFillColor: 54,\n  setFillColorN: 55,\n  setStrokeGray: 56,\n  setFillGray: 57,\n  setStrokeRGBColor: 58,\n  setFillRGBColor: 59,\n  setStrokeCMYKColor: 60,\n  setFillCMYKColor: 61,\n  shadingFill: 62,\n  beginInlineImage: 63,\n  beginImageData: 64,\n  endInlineImage: 65,\n  paintXObject: 66,\n  markPoint: 67,\n  markPointProps: 68,\n  beginMarkedContent: 69,\n  beginMarkedContentProps: 70,\n  endMarkedContent: 71,\n  beginCompat: 72,\n  endCompat: 73,\n  paintFormXObjectBegin: 74,\n  paintFormXObjectEnd: 75,\n  beginGroup: 76,\n  endGroup: 77,\n  beginAnnotations: 78,\n  endAnnotations: 79,\n  beginAnnotation: 80,\n  endAnnotation: 81,\n  paintJpegXObject: 82,\n  paintImageMaskXObject: 83,\n  paintImageMaskXObjectGroup: 84,\n  paintImageXObject: 85,\n  paintInlineImageXObject: 86,\n  paintInlineImageXObjectGroup: 87,\n  paintImageXObjectRepeat: 88,\n  paintImageMaskXObjectRepeat: 89,\n  paintSolidColorImageMask: 90,\n  constructPath: 91\n};\nexports.OPS = OPS;\nconst UNSUPPORTED_FEATURES = {\n  unknown: \"unknown\",\n  forms: \"forms\",\n  javaScript: \"javaScript\",\n  smask: \"smask\",\n  shadingPattern: \"shadingPattern\",\n  font: \"font\",\n  errorTilingPattern: \"errorTilingPattern\",\n  errorExtGState: \"errorExtGState\",\n  errorXObject: \"errorXObject\",\n  errorFontLoadType3: \"errorFontLoadType3\",\n  errorFontState: \"errorFontState\",\n  errorFontMissing: \"errorFontMissing\",\n  errorFontTranslate: \"errorFontTranslate\",\n  errorColorSpace: \"errorColorSpace\",\n  errorOperatorList: \"errorOperatorList\",\n  errorFontToUnicode: \"errorFontToUnicode\",\n  errorFontLoadNative: \"errorFontLoadNative\",\n  errorFontGetPath: \"errorFontGetPath\",\n  errorMarkedContent: \"errorMarkedContent\"\n};\nexports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES;\nconst PasswordResponses = {\n  NEED_PASSWORD: 1,\n  INCORRECT_PASSWORD: 2\n};\nexports.PasswordResponses = PasswordResponses;\nlet verbosity = VerbosityLevel.WARNINGS;\n\nfunction setVerbosityLevel(level) {\n  if (Number.isInteger(level)) {\n    verbosity = level;\n  }\n}\n\nfunction getVerbosityLevel() {\n  return verbosity;\n}\n\nfunction info(msg) {\n  if (verbosity >= VerbosityLevel.INFOS) {\n    console.log(`Info: ${msg}`);\n  }\n}\n\nfunction warn(msg) {\n  if (verbosity >= VerbosityLevel.WARNINGS) {\n    console.log(`Warning: ${msg}`);\n  }\n}\n\nfunction unreachable(msg) {\n  throw new Error(msg);\n}\n\nfunction assert(cond, msg) {\n  if (!cond) {\n    unreachable(msg);\n  }\n}\n\nfunction isSameOrigin(baseUrl, otherUrl) {\n  let base;\n\n  try {\n    base = new URL(baseUrl);\n\n    if (!base.origin || base.origin === \"null\") {\n      return false;\n    }\n  } catch (e) {\n    return false;\n  }\n\n  const other = new URL(otherUrl, base);\n  return base.origin === other.origin;\n}\n\nfunction _isValidProtocol(url) {\n  if (!url) {\n    return false;\n  }\n\n  switch (url.protocol) {\n    case \"http:\":\n    case \"https:\":\n    case \"ftp:\":\n    case \"mailto:\":\n    case \"tel:\":\n      return true;\n\n    default:\n      return false;\n  }\n}\n\nfunction createValidAbsoluteUrl(url, baseUrl) {\n  if (!url) {\n    return null;\n  }\n\n  try {\n    const absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url);\n\n    if (_isValidProtocol(absoluteUrl)) {\n      return absoluteUrl;\n    }\n  } catch (ex) {}\n\n  return null;\n}\n\nfunction shadow(obj, prop, value) {\n  Object.defineProperty(obj, prop, {\n    value,\n    enumerable: true,\n    configurable: true,\n    writable: false\n  });\n  return value;\n}\n\nconst BaseException = function BaseExceptionClosure() {\n  function BaseException(message) {\n    if (this.constructor === BaseException) {\n      unreachable(\"Cannot initialize BaseException.\");\n    }\n\n    this.message = message;\n    this.name = this.constructor.name;\n  }\n\n  BaseException.prototype = new Error();\n  BaseException.constructor = BaseException;\n  return BaseException;\n}();\n\nexports.BaseException = BaseException;\n\nclass PasswordException extends BaseException {\n  constructor(msg, code) {\n    super(msg);\n    this.code = code;\n  }\n\n}\n\nexports.PasswordException = PasswordException;\n\nclass UnknownErrorException extends BaseException {\n  constructor(msg, details) {\n    super(msg);\n    this.details = details;\n  }\n\n}\n\nexports.UnknownErrorException = UnknownErrorException;\n\nclass InvalidPDFException extends BaseException {}\n\nexports.InvalidPDFException = InvalidPDFException;\n\nclass MissingPDFException extends BaseException {}\n\nexports.MissingPDFException = MissingPDFException;\n\nclass UnexpectedResponseException extends BaseException {\n  constructor(msg, status) {\n    super(msg);\n    this.status = status;\n  }\n\n}\n\nexports.UnexpectedResponseException = UnexpectedResponseException;\n\nclass FormatError extends BaseException {}\n\nexports.FormatError = FormatError;\n\nclass AbortException extends BaseException {}\n\nexports.AbortException = AbortException;\nconst NullCharactersRegExp = /\\x00/g;\n\nfunction removeNullCharacters(str) {\n  if (typeof str !== \"string\") {\n    warn(\"The argument for removeNullCharacters must be a string.\");\n    return str;\n  }\n\n  return str.replace(NullCharactersRegExp, \"\");\n}\n\nfunction bytesToString(bytes) {\n  assert(bytes !== null && typeof bytes === \"object\" && bytes.length !== undefined, \"Invalid argument for bytesToString\");\n  const length = bytes.length;\n  const MAX_ARGUMENT_COUNT = 8192;\n\n  if (length < MAX_ARGUMENT_COUNT) {\n    return String.fromCharCode.apply(null, bytes);\n  }\n\n  const strBuf = [];\n\n  for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) {\n    const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);\n    const chunk = bytes.subarray(i, chunkEnd);\n    strBuf.push(String.fromCharCode.apply(null, chunk));\n  }\n\n  return strBuf.join(\"\");\n}\n\nfunction stringToBytes(str) {\n  assert(typeof str === \"string\", \"Invalid argument for stringToBytes\");\n  const length = str.length;\n  const bytes = new Uint8Array(length);\n\n  for (let i = 0; i < length; ++i) {\n    bytes[i] = str.charCodeAt(i) & 0xff;\n  }\n\n  return bytes;\n}\n\nfunction arrayByteLength(arr) {\n  if (arr.length !== undefined) {\n    return arr.length;\n  }\n\n  assert(arr.byteLength !== undefined, \"arrayByteLength - invalid argument.\");\n  return arr.byteLength;\n}\n\nfunction arraysToBytes(arr) {\n  const length = arr.length;\n\n  if (length === 1 && arr[0] instanceof Uint8Array) {\n    return arr[0];\n  }\n\n  let resultLength = 0;\n\n  for (let i = 0; i < length; i++) {\n    resultLength += arrayByteLength(arr[i]);\n  }\n\n  let pos = 0;\n  const data = new Uint8Array(resultLength);\n\n  for (let i = 0; i < length; i++) {\n    let item = arr[i];\n\n    if (!(item instanceof Uint8Array)) {\n      if (typeof item === \"string\") {\n        item = stringToBytes(item);\n      } else {\n        item = new Uint8Array(item);\n      }\n    }\n\n    const itemLength = item.byteLength;\n    data.set(item, pos);\n    pos += itemLength;\n  }\n\n  return data;\n}\n\nfunction string32(value) {\n  return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff);\n}\n\nfunction objectSize(obj) {\n  return Object.keys(obj).length;\n}\n\nfunction objectFromMap(map) {\n  const obj = Object.create(null);\n\n  for (const [key, value] of map) {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction isLittleEndian() {\n  const buffer8 = new Uint8Array(4);\n  buffer8[0] = 1;\n  const view32 = new Uint32Array(buffer8.buffer, 0, 1);\n  return view32[0] === 1;\n}\n\nconst IsLittleEndianCached = {\n  get value() {\n    return shadow(this, \"value\", isLittleEndian());\n  }\n\n};\nexports.IsLittleEndianCached = IsLittleEndianCached;\n\nfunction isEvalSupported() {\n  try {\n    new Function(\"\");\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\nconst IsEvalSupportedCached = {\n  get value() {\n    return shadow(this, \"value\", isEvalSupported());\n  }\n\n};\nexports.IsEvalSupportedCached = IsEvalSupportedCached;\nconst hexNumbers = [...Array(256).keys()].map(n => n.toString(16).padStart(2, \"0\"));\n\nclass Util {\n  static makeHexColor(r, g, b) {\n    return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`;\n  }\n\n  static transform(m1, m2) {\n    return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]];\n  }\n\n  static applyTransform(p, m) {\n    const xt = p[0] * m[0] + p[1] * m[2] + m[4];\n    const yt = p[0] * m[1] + p[1] * m[3] + m[5];\n    return [xt, yt];\n  }\n\n  static applyInverseTransform(p, m) {\n    const d = m[0] * m[3] - m[1] * m[2];\n    const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;\n    const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;\n    return [xt, yt];\n  }\n\n  static getAxialAlignedBoundingBox(r, m) {\n    const p1 = Util.applyTransform(r, m);\n    const p2 = Util.applyTransform(r.slice(2, 4), m);\n    const p3 = Util.applyTransform([r[0], r[3]], m);\n    const p4 = Util.applyTransform([r[2], r[1]], m);\n    return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])];\n  }\n\n  static inverseTransform(m) {\n    const d = m[0] * m[3] - m[1] * m[2];\n    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];\n  }\n\n  static apply3dTransform(m, v) {\n    return [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2]];\n  }\n\n  static singularValueDecompose2dScale(m) {\n    const transpose = [m[0], m[2], m[1], m[3]];\n    const a = m[0] * transpose[0] + m[1] * transpose[2];\n    const b = m[0] * transpose[1] + m[1] * transpose[3];\n    const c = m[2] * transpose[0] + m[3] * transpose[2];\n    const d = m[2] * transpose[1] + m[3] * transpose[3];\n    const first = (a + d) / 2;\n    const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2;\n    const sx = first + second || 1;\n    const sy = first - second || 1;\n    return [Math.sqrt(sx), Math.sqrt(sy)];\n  }\n\n  static normalizeRect(rect) {\n    const r = rect.slice(0);\n\n    if (rect[0] > rect[2]) {\n      r[0] = rect[2];\n      r[2] = rect[0];\n    }\n\n    if (rect[1] > rect[3]) {\n      r[1] = rect[3];\n      r[3] = rect[1];\n    }\n\n    return r;\n  }\n\n  static intersect(rect1, rect2) {\n    function compare(a, b) {\n      return a - b;\n    }\n\n    const orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare);\n    const orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare);\n    const result = [];\n    rect1 = Util.normalizeRect(rect1);\n    rect2 = Util.normalizeRect(rect2);\n\n    if (orderedX[0] === rect1[0] && orderedX[1] === rect2[0] || orderedX[0] === rect2[0] && orderedX[1] === rect1[0]) {\n      result[0] = orderedX[1];\n      result[2] = orderedX[2];\n    } else {\n      return null;\n    }\n\n    if (orderedY[0] === rect1[1] && orderedY[1] === rect2[1] || orderedY[0] === rect2[1] && orderedY[1] === rect1[1]) {\n      result[1] = orderedY[1];\n      result[3] = orderedY[2];\n    } else {\n      return null;\n    }\n\n    return result;\n  }\n\n}\n\nexports.Util = Util;\nconst PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC];\n\nfunction stringToPDFString(str) {\n  const length = str.length,\n        strBuf = [];\n\n  if (str[0] === \"\\xFE\" && str[1] === \"\\xFF\") {\n    for (let i = 2; i < length; i += 2) {\n      strBuf.push(String.fromCharCode(str.charCodeAt(i) << 8 | str.charCodeAt(i + 1)));\n    }\n  } else if (str[0] === \"\\xFF\" && str[1] === \"\\xFE\") {\n    for (let i = 2; i < length; i += 2) {\n      strBuf.push(String.fromCharCode(str.charCodeAt(i + 1) << 8 | str.charCodeAt(i)));\n    }\n  } else {\n    for (let i = 0; i < length; ++i) {\n      const code = PDFStringTranslateTable[str.charCodeAt(i)];\n      strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));\n    }\n  }\n\n  return strBuf.join(\"\");\n}\n\nfunction escapeString(str) {\n  return str.replace(/([()\\\\\\n\\r])/g, match => {\n    if (match === \"\\n\") {\n      return \"\\\\n\";\n    } else if (match === \"\\r\") {\n      return \"\\\\r\";\n    }\n\n    return `\\\\${match}`;\n  });\n}\n\nfunction isAscii(str) {\n  return /^[\\x00-\\x7F]*$/.test(str);\n}\n\nfunction stringToUTF16BEString(str) {\n  const buf = [\"\\xFE\\xFF\"];\n\n  for (let i = 0, ii = str.length; i < ii; i++) {\n    const char = str.charCodeAt(i);\n    buf.push(String.fromCharCode(char >> 8 & 0xff));\n    buf.push(String.fromCharCode(char & 0xff));\n  }\n\n  return buf.join(\"\");\n}\n\nfunction stringToUTF8String(str) {\n  return decodeURIComponent(escape(str));\n}\n\nfunction utf8StringToString(str) {\n  return unescape(encodeURIComponent(str));\n}\n\nfunction isBool(v) {\n  return typeof v === \"boolean\";\n}\n\nfunction isNum(v) {\n  return typeof v === \"number\";\n}\n\nfunction isString(v) {\n  return typeof v === \"string\";\n}\n\nfunction isArrayBuffer(v) {\n  return typeof v === \"object\" && v !== null && v.byteLength !== undefined;\n}\n\nfunction isArrayEqual(arr1, arr2) {\n  if (arr1.length !== arr2.length) {\n    return false;\n  }\n\n  for (let i = 0, ii = arr1.length; i < ii; i++) {\n    if (arr1[i] !== arr2[i]) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction getModificationDate(date = new Date()) {\n  const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, \"0\"), date.getUTCDate().toString().padStart(2, \"0\"), date.getUTCHours().toString().padStart(2, \"0\"), date.getUTCMinutes().toString().padStart(2, \"0\"), date.getUTCSeconds().toString().padStart(2, \"0\")];\n  return buffer.join(\"\");\n}\n\nfunction createPromiseCapability() {\n  const capability = Object.create(null);\n  let isSettled = false;\n  Object.defineProperty(capability, \"settled\", {\n    get() {\n      return isSettled;\n    }\n\n  });\n  capability.promise = new Promise(function (resolve, reject) {\n    capability.resolve = function (data) {\n      isSettled = true;\n      resolve(data);\n    };\n\n    capability.reject = function (reason) {\n      isSettled = true;\n      reject(reason);\n    };\n  });\n  return capability;\n}\n\nfunction createObjectURL(data, contentType = \"\", forceDataSchema = false) {\n  if (URL.createObjectURL && !forceDataSchema) {\n    return URL.createObjectURL(new Blob([data], {\n      type: contentType\n    }));\n  }\n\n  const digits = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n  let buffer = `data:${contentType};base64,`;\n\n  for (let i = 0, ii = data.length; i < ii; i += 3) {\n    const b1 = data[i] & 0xff;\n    const b2 = data[i + 1] & 0xff;\n    const b3 = data[i + 2] & 0xff;\n    const d1 = b1 >> 2,\n          d2 = (b1 & 3) << 4 | b2 >> 4;\n    const d3 = i + 1 < ii ? (b2 & 0xf) << 2 | b3 >> 6 : 64;\n    const d4 = i + 2 < ii ? b3 & 0x3f : 64;\n    buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];\n  }\n\n  return buffer;\n}\n\n/***/ }),\n/* 3 */\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => {\n\n\n\nvar _is_node = __w_pdfjs_require__(4);\n\n;\n\n/***/ }),\n/* 4 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.isNodeJS = void 0;\nconst isNodeJS = typeof process === \"object\" && process + \"\" === \"[object process]\" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== \"browser\");\nexports.isNodeJS = isNodeJS;\n\n/***/ }),\n/* 5 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.clearPrimitiveCaches = clearPrimitiveCaches;\nexports.isCmd = isCmd;\nexports.isDict = isDict;\nexports.isEOF = isEOF;\nexports.isName = isName;\nexports.isRef = isRef;\nexports.isRefsEqual = isRefsEqual;\nexports.isStream = isStream;\nexports.RefSetCache = exports.RefSet = exports.Ref = exports.Name = exports.EOF = exports.Dict = exports.Cmd = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nconst EOF = {};\nexports.EOF = EOF;\n\nconst Name = function NameClosure() {\n  let nameCache = Object.create(null);\n\n  function Name(name) {\n    this.name = name;\n  }\n\n  Name.prototype = {};\n\n  Name.get = function Name_get(name) {\n    const nameValue = nameCache[name];\n    return nameValue ? nameValue : nameCache[name] = new Name(name);\n  };\n\n  Name._clearCache = function () {\n    nameCache = Object.create(null);\n  };\n\n  return Name;\n}();\n\nexports.Name = Name;\n\nconst Cmd = function CmdClosure() {\n  let cmdCache = Object.create(null);\n\n  function Cmd(cmd) {\n    this.cmd = cmd;\n  }\n\n  Cmd.prototype = {};\n\n  Cmd.get = function Cmd_get(cmd) {\n    const cmdValue = cmdCache[cmd];\n    return cmdValue ? cmdValue : cmdCache[cmd] = new Cmd(cmd);\n  };\n\n  Cmd._clearCache = function () {\n    cmdCache = Object.create(null);\n  };\n\n  return Cmd;\n}();\n\nexports.Cmd = Cmd;\n\nconst Dict = function DictClosure() {\n  const nonSerializable = function nonSerializableClosure() {\n    return nonSerializable;\n  };\n\n  function Dict(xref) {\n    this._map = Object.create(null);\n    this.xref = xref;\n    this.objId = null;\n    this.suppressEncryption = false;\n    this.__nonSerializable__ = nonSerializable;\n  }\n\n  Dict.prototype = {\n    assignXref: function Dict_assignXref(newXref) {\n      this.xref = newXref;\n    },\n\n    get size() {\n      return Object.keys(this._map).length;\n    },\n\n    get(key1, key2, key3) {\n      let value = this._map[key1];\n\n      if (value === undefined && key2 !== undefined) {\n        value = this._map[key2];\n\n        if (value === undefined && key3 !== undefined) {\n          value = this._map[key3];\n        }\n      }\n\n      if (value instanceof Ref && this.xref) {\n        return this.xref.fetch(value, this.suppressEncryption);\n      }\n\n      return value;\n    },\n\n    async getAsync(key1, key2, key3) {\n      let value = this._map[key1];\n\n      if (value === undefined && key2 !== undefined) {\n        value = this._map[key2];\n\n        if (value === undefined && key3 !== undefined) {\n          value = this._map[key3];\n        }\n      }\n\n      if (value instanceof Ref && this.xref) {\n        return this.xref.fetchAsync(value, this.suppressEncryption);\n      }\n\n      return value;\n    },\n\n    getArray(key1, key2, key3) {\n      let value = this.get(key1, key2, key3);\n\n      if (!Array.isArray(value) || !this.xref) {\n        return value;\n      }\n\n      value = value.slice();\n\n      for (let i = 0, ii = value.length; i < ii; i++) {\n        if (!(value[i] instanceof Ref)) {\n          continue;\n        }\n\n        value[i] = this.xref.fetch(value[i], this.suppressEncryption);\n      }\n\n      return value;\n    },\n\n    getRaw: function Dict_getRaw(key) {\n      return this._map[key];\n    },\n    getKeys: function Dict_getKeys() {\n      return Object.keys(this._map);\n    },\n    getRawValues: function Dict_getRawValues() {\n      return Object.values(this._map);\n    },\n    set: function Dict_set(key, value) {\n      this._map[key] = value;\n    },\n    has: function Dict_has(key) {\n      return this._map[key] !== undefined;\n    },\n    forEach: function Dict_forEach(callback) {\n      for (const key in this._map) {\n        callback(key, this.get(key));\n      }\n    }\n  };\n\n  Dict.empty = function () {\n    const emptyDict = new Dict(null);\n\n    emptyDict.set = (key, value) => {\n      (0, _util.unreachable)(\"Should not call `set` on the empty dictionary.\");\n    };\n\n    return emptyDict;\n  }();\n\n  Dict.merge = function ({\n    xref,\n    dictArray,\n    mergeSubDicts = false\n  }) {\n    const mergedDict = new Dict(xref);\n\n    if (!mergeSubDicts) {\n      for (const dict of dictArray) {\n        if (!(dict instanceof Dict)) {\n          continue;\n        }\n\n        for (const [key, value] of Object.entries(dict._map)) {\n          if (mergedDict._map[key] === undefined) {\n            mergedDict._map[key] = value;\n          }\n        }\n      }\n\n      return mergedDict.size > 0 ? mergedDict : Dict.empty;\n    }\n\n    const properties = new Map();\n\n    for (const dict of dictArray) {\n      if (!(dict instanceof Dict)) {\n        continue;\n      }\n\n      for (const [key, value] of Object.entries(dict._map)) {\n        let property = properties.get(key);\n\n        if (property === undefined) {\n          property = [];\n          properties.set(key, property);\n        }\n\n        property.push(value);\n      }\n    }\n\n    for (const [name, values] of properties) {\n      if (values.length === 1 || !(values[0] instanceof Dict)) {\n        mergedDict._map[name] = values[0];\n        continue;\n      }\n\n      const subDict = new Dict(xref);\n\n      for (const dict of values) {\n        if (!(dict instanceof Dict)) {\n          continue;\n        }\n\n        for (const [key, value] of Object.entries(dict._map)) {\n          if (subDict._map[key] === undefined) {\n            subDict._map[key] = value;\n          }\n        }\n      }\n\n      if (subDict.size > 0) {\n        mergedDict._map[name] = subDict;\n      }\n    }\n\n    properties.clear();\n    return mergedDict.size > 0 ? mergedDict : Dict.empty;\n  };\n\n  return Dict;\n}();\n\nexports.Dict = Dict;\n\nconst Ref = function RefClosure() {\n  let refCache = Object.create(null);\n\n  function Ref(num, gen) {\n    this.num = num;\n    this.gen = gen;\n  }\n\n  Ref.prototype = {\n    toString: function Ref_toString() {\n      if (this.gen === 0) {\n        return `${this.num}R`;\n      }\n\n      return `${this.num}R${this.gen}`;\n    }\n  };\n\n  Ref.get = function (num, gen) {\n    const key = gen === 0 ? `${num}R` : `${num}R${gen}`;\n    const refValue = refCache[key];\n    return refValue ? refValue : refCache[key] = new Ref(num, gen);\n  };\n\n  Ref._clearCache = function () {\n    refCache = Object.create(null);\n  };\n\n  return Ref;\n}();\n\nexports.Ref = Ref;\n\nclass RefSet {\n  constructor(parent = null) {\n    this._set = new Set(parent && parent._set);\n  }\n\n  has(ref) {\n    return this._set.has(ref.toString());\n  }\n\n  put(ref) {\n    this._set.add(ref.toString());\n  }\n\n  remove(ref) {\n    this._set.delete(ref.toString());\n  }\n\n  forEach(callback) {\n    for (const ref of this._set.values()) {\n      callback(ref);\n    }\n  }\n\n  clear() {\n    this._set.clear();\n  }\n\n}\n\nexports.RefSet = RefSet;\n\nclass RefSetCache {\n  constructor() {\n    this._map = new Map();\n  }\n\n  get size() {\n    return this._map.size;\n  }\n\n  get(ref) {\n    return this._map.get(ref.toString());\n  }\n\n  has(ref) {\n    return this._map.has(ref.toString());\n  }\n\n  put(ref, obj) {\n    this._map.set(ref.toString(), obj);\n  }\n\n  putAlias(ref, aliasRef) {\n    this._map.set(ref.toString(), this.get(aliasRef));\n  }\n\n  forEach(callback) {\n    for (const value of this._map.values()) {\n      callback(value);\n    }\n  }\n\n  clear() {\n    this._map.clear();\n  }\n\n}\n\nexports.RefSetCache = RefSetCache;\n\nfunction isEOF(v) {\n  return v === EOF;\n}\n\nfunction isName(v, name) {\n  return v instanceof Name && (name === undefined || v.name === name);\n}\n\nfunction isCmd(v, cmd) {\n  return v instanceof Cmd && (cmd === undefined || v.cmd === cmd);\n}\n\nfunction isDict(v, type) {\n  return v instanceof Dict && (type === undefined || isName(v.get(\"Type\"), type));\n}\n\nfunction isRef(v) {\n  return v instanceof Ref;\n}\n\nfunction isRefsEqual(v1, v2) {\n  return v1.num === v2.num && v1.gen === v2.gen;\n}\n\nfunction isStream(v) {\n  return typeof v === \"object\" && v !== null && v.getBytes !== undefined;\n}\n\nfunction clearPrimitiveCaches() {\n  Cmd._clearCache();\n\n  Name._clearCache();\n\n  Ref._clearCache();\n}\n\n/***/ }),\n/* 6 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.NetworkPdfManager = exports.LocalPdfManager = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _chunked_stream = __w_pdfjs_require__(7);\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nvar _document = __w_pdfjs_require__(9);\n\nvar _stream = __w_pdfjs_require__(12);\n\nfunction parseDocBaseUrl(url) {\n  if (url) {\n    const absoluteUrl = (0, _util.createValidAbsoluteUrl)(url);\n\n    if (absoluteUrl) {\n      return absoluteUrl.href;\n    }\n\n    (0, _util.warn)(`Invalid absolute docBaseUrl: \"${url}\".`);\n  }\n\n  return null;\n}\n\nclass BasePdfManager {\n  constructor() {\n    if (this.constructor === BasePdfManager) {\n      (0, _util.unreachable)(\"Cannot initialize BasePdfManager.\");\n    }\n  }\n\n  get docId() {\n    return this._docId;\n  }\n\n  get password() {\n    return this._password;\n  }\n\n  get docBaseUrl() {\n    return this._docBaseUrl;\n  }\n\n  onLoadedStream() {\n    (0, _util.unreachable)(\"Abstract method `onLoadedStream` called\");\n  }\n\n  ensureDoc(prop, args) {\n    return this.ensure(this.pdfDocument, prop, args);\n  }\n\n  ensureXRef(prop, args) {\n    return this.ensure(this.pdfDocument.xref, prop, args);\n  }\n\n  ensureCatalog(prop, args) {\n    return this.ensure(this.pdfDocument.catalog, prop, args);\n  }\n\n  getPage(pageIndex) {\n    return this.pdfDocument.getPage(pageIndex);\n  }\n\n  fontFallback(id, handler) {\n    return this.pdfDocument.fontFallback(id, handler);\n  }\n\n  cleanup(manuallyTriggered = false) {\n    return this.pdfDocument.cleanup(manuallyTriggered);\n  }\n\n  async ensure(obj, prop, args) {\n    (0, _util.unreachable)(\"Abstract method `ensure` called\");\n  }\n\n  requestRange(begin, end) {\n    (0, _util.unreachable)(\"Abstract method `requestRange` called\");\n  }\n\n  requestLoadedStream() {\n    (0, _util.unreachable)(\"Abstract method `requestLoadedStream` called\");\n  }\n\n  sendProgressiveData(chunk) {\n    (0, _util.unreachable)(\"Abstract method `sendProgressiveData` called\");\n  }\n\n  updatePassword(password) {\n    this._password = password;\n  }\n\n  terminate(reason) {\n    (0, _util.unreachable)(\"Abstract method `terminate` called\");\n  }\n\n}\n\nclass LocalPdfManager extends BasePdfManager {\n  constructor(docId, data, password, evaluatorOptions, enableXfa, docBaseUrl) {\n    super();\n    this._docId = docId;\n    this._password = password;\n    this._docBaseUrl = parseDocBaseUrl(docBaseUrl);\n    this.evaluatorOptions = evaluatorOptions;\n    this.enableXfa = enableXfa;\n    const stream = new _stream.Stream(data);\n    this.pdfDocument = new _document.PDFDocument(this, stream);\n    this._loadedStreamPromise = Promise.resolve(stream);\n  }\n\n  async ensure(obj, prop, args) {\n    const value = obj[prop];\n\n    if (typeof value === \"function\") {\n      return value.apply(obj, args);\n    }\n\n    return value;\n  }\n\n  requestRange(begin, end) {\n    return Promise.resolve();\n  }\n\n  requestLoadedStream() {}\n\n  onLoadedStream() {\n    return this._loadedStreamPromise;\n  }\n\n  terminate(reason) {}\n\n}\n\nexports.LocalPdfManager = LocalPdfManager;\n\nclass NetworkPdfManager extends BasePdfManager {\n  constructor(docId, pdfNetworkStream, args, evaluatorOptions, enableXfa, docBaseUrl) {\n    super();\n    this._docId = docId;\n    this._password = args.password;\n    this._docBaseUrl = parseDocBaseUrl(docBaseUrl);\n    this.msgHandler = args.msgHandler;\n    this.evaluatorOptions = evaluatorOptions;\n    this.enableXfa = enableXfa;\n    this.streamManager = new _chunked_stream.ChunkedStreamManager(pdfNetworkStream, {\n      msgHandler: args.msgHandler,\n      length: args.length,\n      disableAutoFetch: args.disableAutoFetch,\n      rangeChunkSize: args.rangeChunkSize\n    });\n    this.pdfDocument = new _document.PDFDocument(this, this.streamManager.getStream());\n  }\n\n  async ensure(obj, prop, args) {\n    try {\n      const value = obj[prop];\n\n      if (typeof value === \"function\") {\n        return value.apply(obj, args);\n      }\n\n      return value;\n    } catch (ex) {\n      if (!(ex instanceof _core_utils.MissingDataException)) {\n        throw ex;\n      }\n\n      await this.requestRange(ex.begin, ex.end);\n      return this.ensure(obj, prop, args);\n    }\n  }\n\n  requestRange(begin, end) {\n    return this.streamManager.requestRange(begin, end);\n  }\n\n  requestLoadedStream() {\n    this.streamManager.requestAllChunks();\n  }\n\n  sendProgressiveData(chunk) {\n    this.streamManager.onReceiveData({\n      chunk\n    });\n  }\n\n  onLoadedStream() {\n    return this.streamManager.onLoadedStream();\n  }\n\n  terminate(reason) {\n    this.streamManager.abort(reason);\n  }\n\n}\n\nexports.NetworkPdfManager = NetworkPdfManager;\n\n/***/ }),\n/* 7 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.ChunkedStreamManager = exports.ChunkedStream = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nclass ChunkedStream {\n  constructor(length, chunkSize, manager) {\n    this.bytes = new Uint8Array(length);\n    this.start = 0;\n    this.pos = 0;\n    this.end = length;\n    this.chunkSize = chunkSize;\n    this._loadedChunks = new Set();\n    this.numChunks = Math.ceil(length / chunkSize);\n    this.manager = manager;\n    this.progressiveDataLength = 0;\n    this.lastSuccessfulEnsureByteChunk = -1;\n  }\n\n  getMissingChunks() {\n    const chunks = [];\n\n    for (let chunk = 0, n = this.numChunks; chunk < n; ++chunk) {\n      if (!this._loadedChunks.has(chunk)) {\n        chunks.push(chunk);\n      }\n    }\n\n    return chunks;\n  }\n\n  getBaseStreams() {\n    return [this];\n  }\n\n  get numChunksLoaded() {\n    return this._loadedChunks.size;\n  }\n\n  allChunksLoaded() {\n    return this.numChunksLoaded === this.numChunks;\n  }\n\n  onReceiveData(begin, chunk) {\n    const chunkSize = this.chunkSize;\n\n    if (begin % chunkSize !== 0) {\n      throw new Error(`Bad begin offset: ${begin}`);\n    }\n\n    const end = begin + chunk.byteLength;\n\n    if (end % chunkSize !== 0 && end !== this.bytes.length) {\n      throw new Error(`Bad end offset: ${end}`);\n    }\n\n    this.bytes.set(new Uint8Array(chunk), begin);\n    const beginChunk = Math.floor(begin / chunkSize);\n    const endChunk = Math.floor((end - 1) / chunkSize) + 1;\n\n    for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) {\n      this._loadedChunks.add(curChunk);\n    }\n  }\n\n  onReceiveProgressiveData(data) {\n    let position = this.progressiveDataLength;\n    const beginChunk = Math.floor(position / this.chunkSize);\n    this.bytes.set(new Uint8Array(data), position);\n    position += data.byteLength;\n    this.progressiveDataLength = position;\n    const endChunk = position >= this.end ? this.numChunks : Math.floor(position / this.chunkSize);\n\n    for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) {\n      this._loadedChunks.add(curChunk);\n    }\n  }\n\n  ensureByte(pos) {\n    if (pos < this.progressiveDataLength) {\n      return;\n    }\n\n    const chunk = Math.floor(pos / this.chunkSize);\n\n    if (chunk === this.lastSuccessfulEnsureByteChunk) {\n      return;\n    }\n\n    if (!this._loadedChunks.has(chunk)) {\n      throw new _core_utils.MissingDataException(pos, pos + 1);\n    }\n\n    this.lastSuccessfulEnsureByteChunk = chunk;\n  }\n\n  ensureRange(begin, end) {\n    if (begin >= end) {\n      return;\n    }\n\n    if (end <= this.progressiveDataLength) {\n      return;\n    }\n\n    const chunkSize = this.chunkSize;\n    const beginChunk = Math.floor(begin / chunkSize);\n    const endChunk = Math.floor((end - 1) / chunkSize) + 1;\n\n    for (let chunk = beginChunk; chunk < endChunk; ++chunk) {\n      if (!this._loadedChunks.has(chunk)) {\n        throw new _core_utils.MissingDataException(begin, end);\n      }\n    }\n  }\n\n  nextEmptyChunk(beginChunk) {\n    const numChunks = this.numChunks;\n\n    for (let i = 0; i < numChunks; ++i) {\n      const chunk = (beginChunk + i) % numChunks;\n\n      if (!this._loadedChunks.has(chunk)) {\n        return chunk;\n      }\n    }\n\n    return null;\n  }\n\n  hasChunk(chunk) {\n    return this._loadedChunks.has(chunk);\n  }\n\n  get length() {\n    return this.end - this.start;\n  }\n\n  get isEmpty() {\n    return this.length === 0;\n  }\n\n  getByte() {\n    const pos = this.pos;\n\n    if (pos >= this.end) {\n      return -1;\n    }\n\n    if (pos >= this.progressiveDataLength) {\n      this.ensureByte(pos);\n    }\n\n    return this.bytes[this.pos++];\n  }\n\n  getUint16() {\n    const b0 = this.getByte();\n    const b1 = this.getByte();\n\n    if (b0 === -1 || b1 === -1) {\n      return -1;\n    }\n\n    return (b0 << 8) + b1;\n  }\n\n  getInt32() {\n    const b0 = this.getByte();\n    const b1 = this.getByte();\n    const b2 = this.getByte();\n    const b3 = this.getByte();\n    return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n  }\n\n  getBytes(length, forceClamped = false) {\n    const bytes = this.bytes;\n    const pos = this.pos;\n    const strEnd = this.end;\n\n    if (!length) {\n      if (strEnd > this.progressiveDataLength) {\n        this.ensureRange(pos, strEnd);\n      }\n\n      const subarray = bytes.subarray(pos, strEnd);\n      return forceClamped ? new Uint8ClampedArray(subarray) : subarray;\n    }\n\n    let end = pos + length;\n\n    if (end > strEnd) {\n      end = strEnd;\n    }\n\n    if (end > this.progressiveDataLength) {\n      this.ensureRange(pos, end);\n    }\n\n    this.pos = end;\n    const subarray = bytes.subarray(pos, end);\n    return forceClamped ? new Uint8ClampedArray(subarray) : subarray;\n  }\n\n  peekByte() {\n    const peekedByte = this.getByte();\n\n    if (peekedByte !== -1) {\n      this.pos--;\n    }\n\n    return peekedByte;\n  }\n\n  peekBytes(length, forceClamped = false) {\n    const bytes = this.getBytes(length, forceClamped);\n    this.pos -= bytes.length;\n    return bytes;\n  }\n\n  getByteRange(begin, end) {\n    if (begin < 0) {\n      begin = 0;\n    }\n\n    if (end > this.end) {\n      end = this.end;\n    }\n\n    if (end > this.progressiveDataLength) {\n      this.ensureRange(begin, end);\n    }\n\n    return this.bytes.subarray(begin, end);\n  }\n\n  skip(n) {\n    if (!n) {\n      n = 1;\n    }\n\n    this.pos += n;\n  }\n\n  reset() {\n    this.pos = this.start;\n  }\n\n  moveStart() {\n    this.start = this.pos;\n  }\n\n  makeSubStream(start, length, dict) {\n    if (length) {\n      if (start + length > this.progressiveDataLength) {\n        this.ensureRange(start, start + length);\n      }\n    } else {\n      if (start >= this.progressiveDataLength) {\n        this.ensureByte(start);\n      }\n    }\n\n    function ChunkedStreamSubstream() {}\n\n    ChunkedStreamSubstream.prototype = Object.create(this);\n\n    ChunkedStreamSubstream.prototype.getMissingChunks = function () {\n      const chunkSize = this.chunkSize;\n      const beginChunk = Math.floor(this.start / chunkSize);\n      const endChunk = Math.floor((this.end - 1) / chunkSize) + 1;\n      const missingChunks = [];\n\n      for (let chunk = beginChunk; chunk < endChunk; ++chunk) {\n        if (!this._loadedChunks.has(chunk)) {\n          missingChunks.push(chunk);\n        }\n      }\n\n      return missingChunks;\n    };\n\n    ChunkedStreamSubstream.prototype.allChunksLoaded = function () {\n      if (this.numChunksLoaded === this.numChunks) {\n        return true;\n      }\n\n      return this.getMissingChunks().length === 0;\n    };\n\n    const subStream = new ChunkedStreamSubstream();\n    subStream.pos = subStream.start = start;\n    subStream.end = start + length || this.end;\n    subStream.dict = dict;\n    return subStream;\n  }\n\n}\n\nexports.ChunkedStream = ChunkedStream;\n\nclass ChunkedStreamManager {\n  constructor(pdfNetworkStream, args) {\n    this.length = args.length;\n    this.chunkSize = args.rangeChunkSize;\n    this.stream = new ChunkedStream(this.length, this.chunkSize, this);\n    this.pdfNetworkStream = pdfNetworkStream;\n    this.disableAutoFetch = args.disableAutoFetch;\n    this.msgHandler = args.msgHandler;\n    this.currRequestId = 0;\n    this._chunksNeededByRequest = new Map();\n    this._requestsByChunk = new Map();\n    this._promisesByRequest = new Map();\n    this.progressiveDataLength = 0;\n    this.aborted = false;\n    this._loadedStreamCapability = (0, _util.createPromiseCapability)();\n  }\n\n  onLoadedStream() {\n    return this._loadedStreamCapability.promise;\n  }\n\n  sendRequest(begin, end) {\n    const rangeReader = this.pdfNetworkStream.getRangeReader(begin, end);\n\n    if (!rangeReader.isStreamingSupported) {\n      rangeReader.onProgress = this.onProgress.bind(this);\n    }\n\n    let chunks = [],\n        loaded = 0;\n    const promise = new Promise((resolve, reject) => {\n      const readChunk = chunk => {\n        try {\n          if (!chunk.done) {\n            const data = chunk.value;\n            chunks.push(data);\n            loaded += (0, _util.arrayByteLength)(data);\n\n            if (rangeReader.isStreamingSupported) {\n              this.onProgress({\n                loaded\n              });\n            }\n\n            rangeReader.read().then(readChunk, reject);\n            return;\n          }\n\n          const chunkData = (0, _util.arraysToBytes)(chunks);\n          chunks = null;\n          resolve(chunkData);\n        } catch (e) {\n          reject(e);\n        }\n      };\n\n      rangeReader.read().then(readChunk, reject);\n    });\n    promise.then(data => {\n      if (this.aborted) {\n        return;\n      }\n\n      this.onReceiveData({\n        chunk: data,\n        begin\n      });\n    });\n  }\n\n  requestAllChunks() {\n    const missingChunks = this.stream.getMissingChunks();\n\n    this._requestChunks(missingChunks);\n\n    return this._loadedStreamCapability.promise;\n  }\n\n  _requestChunks(chunks) {\n    const requestId = this.currRequestId++;\n    const chunksNeeded = new Set();\n\n    this._chunksNeededByRequest.set(requestId, chunksNeeded);\n\n    for (const chunk of chunks) {\n      if (!this.stream.hasChunk(chunk)) {\n        chunksNeeded.add(chunk);\n      }\n    }\n\n    if (chunksNeeded.size === 0) {\n      return Promise.resolve();\n    }\n\n    const capability = (0, _util.createPromiseCapability)();\n\n    this._promisesByRequest.set(requestId, capability);\n\n    const chunksToRequest = [];\n\n    for (const chunk of chunksNeeded) {\n      let requestIds = this._requestsByChunk.get(chunk);\n\n      if (!requestIds) {\n        requestIds = [];\n\n        this._requestsByChunk.set(chunk, requestIds);\n\n        chunksToRequest.push(chunk);\n      }\n\n      requestIds.push(requestId);\n    }\n\n    if (chunksToRequest.length > 0) {\n      const groupedChunksToRequest = this.groupChunks(chunksToRequest);\n\n      for (const groupedChunk of groupedChunksToRequest) {\n        const begin = groupedChunk.beginChunk * this.chunkSize;\n        const end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length);\n        this.sendRequest(begin, end);\n      }\n    }\n\n    return capability.promise.catch(reason => {\n      if (this.aborted) {\n        return;\n      }\n\n      throw reason;\n    });\n  }\n\n  getStream() {\n    return this.stream;\n  }\n\n  requestRange(begin, end) {\n    end = Math.min(end, this.length);\n    const beginChunk = this.getBeginChunk(begin);\n    const endChunk = this.getEndChunk(end);\n    const chunks = [];\n\n    for (let chunk = beginChunk; chunk < endChunk; ++chunk) {\n      chunks.push(chunk);\n    }\n\n    return this._requestChunks(chunks);\n  }\n\n  requestRanges(ranges = []) {\n    const chunksToRequest = [];\n\n    for (const range of ranges) {\n      const beginChunk = this.getBeginChunk(range.begin);\n      const endChunk = this.getEndChunk(range.end);\n\n      for (let chunk = beginChunk; chunk < endChunk; ++chunk) {\n        if (!chunksToRequest.includes(chunk)) {\n          chunksToRequest.push(chunk);\n        }\n      }\n    }\n\n    chunksToRequest.sort(function (a, b) {\n      return a - b;\n    });\n    return this._requestChunks(chunksToRequest);\n  }\n\n  groupChunks(chunks) {\n    const groupedChunks = [];\n    let beginChunk = -1;\n    let prevChunk = -1;\n\n    for (let i = 0, ii = chunks.length; i < ii; ++i) {\n      const chunk = chunks[i];\n\n      if (beginChunk < 0) {\n        beginChunk = chunk;\n      }\n\n      if (prevChunk >= 0 && prevChunk + 1 !== chunk) {\n        groupedChunks.push({\n          beginChunk,\n          endChunk: prevChunk + 1\n        });\n        beginChunk = chunk;\n      }\n\n      if (i + 1 === chunks.length) {\n        groupedChunks.push({\n          beginChunk,\n          endChunk: chunk + 1\n        });\n      }\n\n      prevChunk = chunk;\n    }\n\n    return groupedChunks;\n  }\n\n  onProgress(args) {\n    this.msgHandler.send(\"DocProgress\", {\n      loaded: this.stream.numChunksLoaded * this.chunkSize + args.loaded,\n      total: this.length\n    });\n  }\n\n  onReceiveData(args) {\n    const chunk = args.chunk;\n    const isProgressive = args.begin === undefined;\n    const begin = isProgressive ? this.progressiveDataLength : args.begin;\n    const end = begin + chunk.byteLength;\n    const beginChunk = Math.floor(begin / this.chunkSize);\n    const endChunk = end < this.length ? Math.floor(end / this.chunkSize) : Math.ceil(end / this.chunkSize);\n\n    if (isProgressive) {\n      this.stream.onReceiveProgressiveData(chunk);\n      this.progressiveDataLength = end;\n    } else {\n      this.stream.onReceiveData(begin, chunk);\n    }\n\n    if (this.stream.allChunksLoaded()) {\n      this._loadedStreamCapability.resolve(this.stream);\n    }\n\n    const loadedRequests = [];\n\n    for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) {\n      const requestIds = this._requestsByChunk.get(curChunk);\n\n      if (!requestIds) {\n        continue;\n      }\n\n      this._requestsByChunk.delete(curChunk);\n\n      for (const requestId of requestIds) {\n        const chunksNeeded = this._chunksNeededByRequest.get(requestId);\n\n        if (chunksNeeded.has(curChunk)) {\n          chunksNeeded.delete(curChunk);\n        }\n\n        if (chunksNeeded.size > 0) {\n          continue;\n        }\n\n        loadedRequests.push(requestId);\n      }\n    }\n\n    if (!this.disableAutoFetch && this._requestsByChunk.size === 0) {\n      let nextEmptyChunk;\n\n      if (this.stream.numChunksLoaded === 1) {\n        const lastChunk = this.stream.numChunks - 1;\n\n        if (!this.stream.hasChunk(lastChunk)) {\n          nextEmptyChunk = lastChunk;\n        }\n      } else {\n        nextEmptyChunk = this.stream.nextEmptyChunk(endChunk);\n      }\n\n      if (Number.isInteger(nextEmptyChunk)) {\n        this._requestChunks([nextEmptyChunk]);\n      }\n    }\n\n    for (const requestId of loadedRequests) {\n      const capability = this._promisesByRequest.get(requestId);\n\n      this._promisesByRequest.delete(requestId);\n\n      capability.resolve();\n    }\n\n    this.msgHandler.send(\"DocProgress\", {\n      loaded: this.stream.numChunksLoaded * this.chunkSize,\n      total: this.length\n    });\n  }\n\n  onError(err) {\n    this._loadedStreamCapability.reject(err);\n  }\n\n  getBeginChunk(begin) {\n    return Math.floor(begin / this.chunkSize);\n  }\n\n  getEndChunk(end) {\n    return Math.floor((end - 1) / this.chunkSize) + 1;\n  }\n\n  abort(reason) {\n    this.aborted = true;\n\n    if (this.pdfNetworkStream) {\n      this.pdfNetworkStream.cancelAllRequests(reason);\n    }\n\n    for (const capability of this._promisesByRequest.values()) {\n      capability.reject(reason);\n    }\n  }\n\n}\n\nexports.ChunkedStreamManager = ChunkedStreamManager;\n\n/***/ }),\n/* 8 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.collectActions = collectActions;\nexports.encodeToXmlString = encodeToXmlString;\nexports.escapePDFName = escapePDFName;\nexports.getArrayLookupTableFactory = getArrayLookupTableFactory;\nexports.getInheritableProperty = getInheritableProperty;\nexports.getLookupTableFactory = getLookupTableFactory;\nexports.isWhiteSpace = isWhiteSpace;\nexports.log2 = log2;\nexports.parseXFAPath = parseXFAPath;\nexports.readInt8 = readInt8;\nexports.readUint16 = readUint16;\nexports.readUint32 = readUint32;\nexports.toRomanNumerals = toRomanNumerals;\nexports.XRefParseException = exports.XRefEntryException = exports.MissingDataException = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _primitives = __w_pdfjs_require__(5);\n\nfunction getLookupTableFactory(initializer) {\n  let lookup;\n  return function () {\n    if (initializer) {\n      lookup = Object.create(null);\n      initializer(lookup);\n      initializer = null;\n    }\n\n    return lookup;\n  };\n}\n\nfunction getArrayLookupTableFactory(initializer) {\n  let lookup;\n  return function () {\n    if (initializer) {\n      let arr = initializer();\n      initializer = null;\n      lookup = Object.create(null);\n\n      for (let i = 0, ii = arr.length; i < ii; i += 2) {\n        lookup[arr[i]] = arr[i + 1];\n      }\n\n      arr = null;\n    }\n\n    return lookup;\n  };\n}\n\nclass MissingDataException extends _util.BaseException {\n  constructor(begin, end) {\n    super(`Missing data [${begin}, ${end})`);\n    this.begin = begin;\n    this.end = end;\n  }\n\n}\n\nexports.MissingDataException = MissingDataException;\n\nclass XRefEntryException extends _util.BaseException {}\n\nexports.XRefEntryException = XRefEntryException;\n\nclass XRefParseException extends _util.BaseException {}\n\nexports.XRefParseException = XRefParseException;\n\nfunction getInheritableProperty({\n  dict,\n  key,\n  getArray = false,\n  stopWhenFound = true\n}) {\n  let values;\n  const visited = new _primitives.RefSet();\n\n  while (dict instanceof _primitives.Dict && !(dict.objId && visited.has(dict.objId))) {\n    if (dict.objId) {\n      visited.put(dict.objId);\n    }\n\n    const value = getArray ? dict.getArray(key) : dict.get(key);\n\n    if (value !== undefined) {\n      if (stopWhenFound) {\n        return value;\n      }\n\n      if (!values) {\n        values = [];\n      }\n\n      values.push(value);\n    }\n\n    dict = dict.get(\"Parent\");\n  }\n\n  return values;\n}\n\nconst ROMAN_NUMBER_MAP = [\"\", \"C\", \"CC\", \"CCC\", \"CD\", \"D\", \"DC\", \"DCC\", \"DCCC\", \"CM\", \"\", \"X\", \"XX\", \"XXX\", \"XL\", \"L\", \"LX\", \"LXX\", \"LXXX\", \"XC\", \"\", \"I\", \"II\", \"III\", \"IV\", \"V\", \"VI\", \"VII\", \"VIII\", \"IX\"];\n\nfunction toRomanNumerals(number, lowerCase = false) {\n  (0, _util.assert)(Number.isInteger(number) && number > 0, \"The number should be a positive integer.\");\n  const romanBuf = [];\n  let pos;\n\n  while (number >= 1000) {\n    number -= 1000;\n    romanBuf.push(\"M\");\n  }\n\n  pos = number / 100 | 0;\n  number %= 100;\n  romanBuf.push(ROMAN_NUMBER_MAP[pos]);\n  pos = number / 10 | 0;\n  number %= 10;\n  romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]);\n  romanBuf.push(ROMAN_NUMBER_MAP[20 + number]);\n  const romanStr = romanBuf.join(\"\");\n  return lowerCase ? romanStr.toLowerCase() : romanStr;\n}\n\nfunction log2(x) {\n  if (x <= 0) {\n    return 0;\n  }\n\n  return Math.ceil(Math.log2(x));\n}\n\nfunction readInt8(data, offset) {\n  return data[offset] << 24 >> 24;\n}\n\nfunction readUint16(data, offset) {\n  return data[offset] << 8 | data[offset + 1];\n}\n\nfunction readUint32(data, offset) {\n  return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0;\n}\n\nfunction isWhiteSpace(ch) {\n  return ch === 0x20 || ch === 0x09 || ch === 0x0d || ch === 0x0a;\n}\n\nfunction parseXFAPath(path) {\n  const positionPattern = /(.+)\\[([0-9]+)\\]$/;\n  return path.split(\".\").map(component => {\n    const m = component.match(positionPattern);\n\n    if (m) {\n      return {\n        name: m[1],\n        pos: parseInt(m[2], 10)\n      };\n    }\n\n    return {\n      name: component,\n      pos: 0\n    };\n  });\n}\n\nfunction escapePDFName(str) {\n  const buffer = [];\n  let start = 0;\n\n  for (let i = 0, ii = str.length; i < ii; i++) {\n    const char = str.charCodeAt(i);\n\n    if (char < 0x21 || char > 0x7e || char === 0x23 || char === 0x28 || char === 0x29 || char === 0x3c || char === 0x3e || char === 0x5b || char === 0x5d || char === 0x7b || char === 0x7d || char === 0x2f || char === 0x25) {\n      if (start < i) {\n        buffer.push(str.substring(start, i));\n      }\n\n      buffer.push(`#${char.toString(16)}`);\n      start = i + 1;\n    }\n  }\n\n  if (buffer.length === 0) {\n    return str;\n  }\n\n  if (start < str.length) {\n    buffer.push(str.substring(start, str.length));\n  }\n\n  return buffer.join(\"\");\n}\n\nfunction _collectJS(entry, xref, list, parents) {\n  if (!entry) {\n    return;\n  }\n\n  let parent = null;\n\n  if ((0, _primitives.isRef)(entry)) {\n    if (parents.has(entry)) {\n      return;\n    }\n\n    parent = entry;\n    parents.put(parent);\n    entry = xref.fetch(entry);\n  }\n\n  if (Array.isArray(entry)) {\n    for (const element of entry) {\n      _collectJS(element, xref, list, parents);\n    }\n  } else if (entry instanceof _primitives.Dict) {\n    if ((0, _primitives.isName)(entry.get(\"S\"), \"JavaScript\") && entry.has(\"JS\")) {\n      const js = entry.get(\"JS\");\n      let code;\n\n      if ((0, _primitives.isStream)(js)) {\n        code = (0, _util.bytesToString)(js.getBytes());\n      } else {\n        code = js;\n      }\n\n      code = (0, _util.stringToPDFString)(code);\n\n      if (code) {\n        list.push(code);\n      }\n    }\n\n    _collectJS(entry.getRaw(\"Next\"), xref, list, parents);\n  }\n\n  if (parent) {\n    parents.remove(parent);\n  }\n}\n\nfunction collectActions(xref, dict, eventType) {\n  const actions = Object.create(null);\n  const additionalActionsDicts = getInheritableProperty({\n    dict,\n    key: \"AA\",\n    stopWhenFound: false\n  });\n\n  if (additionalActionsDicts) {\n    for (let i = additionalActionsDicts.length - 1; i >= 0; i--) {\n      const additionalActions = additionalActionsDicts[i];\n\n      if (!(additionalActions instanceof _primitives.Dict)) {\n        continue;\n      }\n\n      for (const key of additionalActions.getKeys()) {\n        const action = eventType[key];\n\n        if (!action) {\n          continue;\n        }\n\n        const actionDict = additionalActions.getRaw(key);\n        const parents = new _primitives.RefSet();\n        const list = [];\n\n        _collectJS(actionDict, xref, list, parents);\n\n        if (list.length > 0) {\n          actions[action] = list;\n        }\n      }\n    }\n  }\n\n  if (dict.has(\"A\")) {\n    const actionDict = dict.get(\"A\");\n    const parents = new _primitives.RefSet();\n    const list = [];\n\n    _collectJS(actionDict, xref, list, parents);\n\n    if (list.length > 0) {\n      actions.Action = list;\n    }\n  }\n\n  return (0, _util.objectSize)(actions) > 0 ? actions : null;\n}\n\nconst XMLEntities = {\n  0x3c: \"&lt;\",\n  0x3e: \"&gt;\",\n  0x26: \"&amp;\",\n  0x22: \"&quot;\",\n  0x27: \"&apos;\"\n};\n\nfunction encodeToXmlString(str) {\n  const buffer = [];\n  let start = 0;\n\n  for (let i = 0, ii = str.length; i < ii; i++) {\n    const char = str.codePointAt(i);\n\n    if (0x20 <= char && char <= 0x7e) {\n      const entity = XMLEntities[char];\n\n      if (entity) {\n        if (start < i) {\n          buffer.push(str.substring(start, i));\n        }\n\n        buffer.push(entity);\n        start = i + 1;\n      }\n    } else {\n      if (start < i) {\n        buffer.push(str.substring(start, i));\n      }\n\n      buffer.push(`&#x${char.toString(16).toUpperCase()};`);\n\n      if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) {\n        i++;\n      }\n\n      start = i + 1;\n    }\n  }\n\n  if (buffer.length === 0) {\n    return str;\n  }\n\n  if (start < str.length) {\n    buffer.push(str.substring(start, str.length));\n  }\n\n  return buffer.join(\"\");\n}\n\n/***/ }),\n/* 9 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFDocument = exports.Page = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _obj = __w_pdfjs_require__(10);\n\nvar _primitives = __w_pdfjs_require__(5);\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nvar _stream = __w_pdfjs_require__(12);\n\nvar _annotation = __w_pdfjs_require__(27);\n\nvar _crypto = __w_pdfjs_require__(22);\n\nvar _parser = __w_pdfjs_require__(11);\n\nvar _operator_list = __w_pdfjs_require__(46);\n\nvar _evaluator = __w_pdfjs_require__(29);\n\nvar _factory = __w_pdfjs_require__(49);\n\nconst DEFAULT_USER_UNIT = 1.0;\nconst LETTER_SIZE_MEDIABOX = [0, 0, 612, 792];\n\nfunction isAnnotationRenderable(annotation, intent) {\n  return intent === \"display\" && annotation.viewable || intent === \"print\" && annotation.printable;\n}\n\nclass Page {\n  constructor({\n    pdfManager,\n    xref,\n    pageIndex,\n    pageDict,\n    ref,\n    globalIdFactory,\n    fontCache,\n    builtInCMapCache,\n    globalImageCache,\n    nonBlendModesSet,\n    xfaFactory\n  }) {\n    this.pdfManager = pdfManager;\n    this.pageIndex = pageIndex;\n    this.pageDict = pageDict;\n    this.xref = xref;\n    this.ref = ref;\n    this.fontCache = fontCache;\n    this.builtInCMapCache = builtInCMapCache;\n    this.globalImageCache = globalImageCache;\n    this.nonBlendModesSet = nonBlendModesSet;\n    this.evaluatorOptions = pdfManager.evaluatorOptions;\n    this.resourcesPromise = null;\n    this.xfaFactory = xfaFactory;\n    const idCounters = {\n      obj: 0\n    };\n    this._localIdFactory = class extends globalIdFactory {\n      static createObjId() {\n        return `p${pageIndex}_${++idCounters.obj}`;\n      }\n\n    };\n  }\n\n  _getInheritableProperty(key, getArray = false) {\n    const value = (0, _core_utils.getInheritableProperty)({\n      dict: this.pageDict,\n      key,\n      getArray,\n      stopWhenFound: false\n    });\n\n    if (!Array.isArray(value)) {\n      return value;\n    }\n\n    if (value.length === 1 || !(0, _primitives.isDict)(value[0])) {\n      return value[0];\n    }\n\n    return _primitives.Dict.merge({\n      xref: this.xref,\n      dictArray: value\n    });\n  }\n\n  get content() {\n    return this.pageDict.get(\"Contents\");\n  }\n\n  get resources() {\n    return (0, _util.shadow)(this, \"resources\", this._getInheritableProperty(\"Resources\") || _primitives.Dict.empty);\n  }\n\n  _getBoundingBox(name) {\n    if (this.xfaData) {\n      const {\n        width,\n        height\n      } = this.xfaData.attributes.style;\n      return [0, 0, parseInt(width), parseInt(height)];\n    }\n\n    const box = this._getInheritableProperty(name, true);\n\n    if (Array.isArray(box) && box.length === 4) {\n      if (box[2] - box[0] !== 0 && box[3] - box[1] !== 0) {\n        return box;\n      }\n\n      (0, _util.warn)(`Empty /${name} entry.`);\n    }\n\n    return null;\n  }\n\n  get mediaBox() {\n    return (0, _util.shadow)(this, \"mediaBox\", this._getBoundingBox(\"MediaBox\") || LETTER_SIZE_MEDIABOX);\n  }\n\n  get cropBox() {\n    return (0, _util.shadow)(this, \"cropBox\", this._getBoundingBox(\"CropBox\") || this.mediaBox);\n  }\n\n  get userUnit() {\n    let obj = this.pageDict.get(\"UserUnit\");\n\n    if (!(0, _util.isNum)(obj) || obj <= 0) {\n      obj = DEFAULT_USER_UNIT;\n    }\n\n    return (0, _util.shadow)(this, \"userUnit\", obj);\n  }\n\n  get view() {\n    const {\n      cropBox,\n      mediaBox\n    } = this;\n    let view;\n\n    if (cropBox === mediaBox || (0, _util.isArrayEqual)(cropBox, mediaBox)) {\n      view = mediaBox;\n    } else {\n      const box = _util.Util.intersect(cropBox, mediaBox);\n\n      if (box && box[2] - box[0] !== 0 && box[3] - box[1] !== 0) {\n        view = box;\n      } else {\n        (0, _util.warn)(\"Empty /CropBox and /MediaBox intersection.\");\n      }\n    }\n\n    return (0, _util.shadow)(this, \"view\", view || mediaBox);\n  }\n\n  get rotate() {\n    let rotate = this._getInheritableProperty(\"Rotate\") || 0;\n\n    if (rotate % 90 !== 0) {\n      rotate = 0;\n    } else if (rotate >= 360) {\n      rotate = rotate % 360;\n    } else if (rotate < 0) {\n      rotate = (rotate % 360 + 360) % 360;\n    }\n\n    return (0, _util.shadow)(this, \"rotate\", rotate);\n  }\n\n  getContentStream() {\n    const content = this.content;\n    let stream;\n\n    if (Array.isArray(content)) {\n      const xref = this.xref;\n      const streams = [];\n\n      for (const subStream of content) {\n        streams.push(xref.fetchIfRef(subStream));\n      }\n\n      stream = new _stream.StreamsSequenceStream(streams);\n    } else if ((0, _primitives.isStream)(content)) {\n      stream = content;\n    } else {\n      stream = new _stream.NullStream();\n    }\n\n    return stream;\n  }\n\n  get xfaData() {\n    if (this.xfaFactory) {\n      return (0, _util.shadow)(this, \"xfaData\", this.xfaFactory.getPage(this.pageIndex));\n    }\n\n    return (0, _util.shadow)(this, \"xfaData\", null);\n  }\n\n  save(handler, task, annotationStorage) {\n    const partialEvaluator = new _evaluator.PartialEvaluator({\n      xref: this.xref,\n      handler,\n      pageIndex: this.pageIndex,\n      idFactory: this._localIdFactory,\n      fontCache: this.fontCache,\n      builtInCMapCache: this.builtInCMapCache,\n      globalImageCache: this.globalImageCache,\n      options: this.evaluatorOptions\n    });\n    return this._parsedAnnotations.then(function (annotations) {\n      const newRefsPromises = [];\n\n      for (const annotation of annotations) {\n        if (!isAnnotationRenderable(annotation, \"print\")) {\n          continue;\n        }\n\n        newRefsPromises.push(annotation.save(partialEvaluator, task, annotationStorage).catch(function (reason) {\n          (0, _util.warn)(\"save - ignoring annotation data during \" + `\"${task.name}\" task: \"${reason}\".`);\n          return null;\n        }));\n      }\n\n      return Promise.all(newRefsPromises);\n    });\n  }\n\n  loadResources(keys) {\n    if (!this.resourcesPromise) {\n      this.resourcesPromise = this.pdfManager.ensure(this, \"resources\");\n    }\n\n    return this.resourcesPromise.then(() => {\n      const objectLoader = new _obj.ObjectLoader(this.resources, keys, this.xref);\n      return objectLoader.load();\n    });\n  }\n\n  getOperatorList({\n    handler,\n    sink,\n    task,\n    intent,\n    renderInteractiveForms,\n    annotationStorage\n  }) {\n    const contentStreamPromise = this.pdfManager.ensure(this, \"getContentStream\");\n    const resourcesPromise = this.loadResources([\"ExtGState\", \"ColorSpace\", \"Pattern\", \"Shading\", \"XObject\", \"Font\"]);\n    const partialEvaluator = new _evaluator.PartialEvaluator({\n      xref: this.xref,\n      handler,\n      pageIndex: this.pageIndex,\n      idFactory: this._localIdFactory,\n      fontCache: this.fontCache,\n      builtInCMapCache: this.builtInCMapCache,\n      globalImageCache: this.globalImageCache,\n      options: this.evaluatorOptions\n    });\n    const dataPromises = Promise.all([contentStreamPromise, resourcesPromise]);\n    const pageListPromise = dataPromises.then(([contentStream]) => {\n      const opList = new _operator_list.OperatorList(intent, sink);\n      handler.send(\"StartRenderPage\", {\n        transparency: partialEvaluator.hasBlendModes(this.resources, this.nonBlendModesSet),\n        pageIndex: this.pageIndex,\n        intent\n      });\n      return partialEvaluator.getOperatorList({\n        stream: contentStream,\n        task,\n        resources: this.resources,\n        operatorList: opList\n      }).then(function () {\n        return opList;\n      });\n    });\n    return Promise.all([pageListPromise, this._parsedAnnotations]).then(function ([pageOpList, annotations]) {\n      if (annotations.length === 0) {\n        pageOpList.flush(true);\n        return {\n          length: pageOpList.totalLength\n        };\n      }\n\n      const opListPromises = [];\n\n      for (const annotation of annotations) {\n        if (isAnnotationRenderable(annotation, intent) && !annotation.isHidden(annotationStorage)) {\n          opListPromises.push(annotation.getOperatorList(partialEvaluator, task, renderInteractiveForms, annotationStorage).catch(function (reason) {\n            (0, _util.warn)(\"getOperatorList - ignoring annotation data during \" + `\"${task.name}\" task: \"${reason}\".`);\n            return null;\n          }));\n        }\n      }\n\n      return Promise.all(opListPromises).then(function (opLists) {\n        pageOpList.addOp(_util.OPS.beginAnnotations, []);\n\n        for (const opList of opLists) {\n          pageOpList.addOpList(opList);\n        }\n\n        pageOpList.addOp(_util.OPS.endAnnotations, []);\n        pageOpList.flush(true);\n        return {\n          length: pageOpList.totalLength\n        };\n      });\n    });\n  }\n\n  extractTextContent({\n    handler,\n    task,\n    normalizeWhitespace,\n    sink,\n    combineTextItems\n  }) {\n    const contentStreamPromise = this.pdfManager.ensure(this, \"getContentStream\");\n    const resourcesPromise = this.loadResources([\"ExtGState\", \"XObject\", \"Font\"]);\n    const dataPromises = Promise.all([contentStreamPromise, resourcesPromise]);\n    return dataPromises.then(([contentStream]) => {\n      const partialEvaluator = new _evaluator.PartialEvaluator({\n        xref: this.xref,\n        handler,\n        pageIndex: this.pageIndex,\n        idFactory: this._localIdFactory,\n        fontCache: this.fontCache,\n        builtInCMapCache: this.builtInCMapCache,\n        globalImageCache: this.globalImageCache,\n        options: this.evaluatorOptions\n      });\n      return partialEvaluator.getTextContent({\n        stream: contentStream,\n        task,\n        resources: this.resources,\n        normalizeWhitespace,\n        combineTextItems,\n        sink\n      });\n    });\n  }\n\n  getAnnotationsData(intent) {\n    return this._parsedAnnotations.then(function (annotations) {\n      const annotationsData = [];\n\n      for (let i = 0, ii = annotations.length; i < ii; i++) {\n        if (!intent || isAnnotationRenderable(annotations[i], intent)) {\n          annotationsData.push(annotations[i].data);\n        }\n      }\n\n      return annotationsData;\n    });\n  }\n\n  get annotations() {\n    const annots = this._getInheritableProperty(\"Annots\");\n\n    return (0, _util.shadow)(this, \"annotations\", Array.isArray(annots) ? annots : []);\n  }\n\n  get _parsedAnnotations() {\n    const parsedAnnotations = this.pdfManager.ensure(this, \"annotations\").then(() => {\n      const annotationPromises = [];\n\n      for (const annotationRef of this.annotations) {\n        annotationPromises.push(_annotation.AnnotationFactory.create(this.xref, annotationRef, this.pdfManager, this._localIdFactory, false).catch(function (reason) {\n          (0, _util.warn)(`_parsedAnnotations: \"${reason}\".`);\n          return null;\n        }));\n      }\n\n      return Promise.all(annotationPromises).then(function (annotations) {\n        return annotations.filter(annotation => !!annotation);\n      });\n    });\n    return (0, _util.shadow)(this, \"_parsedAnnotations\", parsedAnnotations);\n  }\n\n  get jsActions() {\n    const actions = (0, _core_utils.collectActions)(this.xref, this.pageDict, _util.PageActionEventType);\n    return (0, _util.shadow)(this, \"jsActions\", actions);\n  }\n\n}\n\nexports.Page = Page;\nconst PDF_HEADER_SIGNATURE = new Uint8Array([0x25, 0x50, 0x44, 0x46, 0x2d]);\nconst STARTXREF_SIGNATURE = new Uint8Array([0x73, 0x74, 0x61, 0x72, 0x74, 0x78, 0x72, 0x65, 0x66]);\nconst ENDOBJ_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64, 0x6f, 0x62, 0x6a]);\nconst FINGERPRINT_FIRST_BYTES = 1024;\nconst EMPTY_FINGERPRINT = \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\";\nconst PDF_HEADER_VERSION_REGEXP = /^[1-9]\\.[0-9]$/;\n\nfunction find(stream, signature, limit = 1024, backwards = false) {\n  const signatureLength = signature.length;\n  const scanBytes = stream.peekBytes(limit);\n  const scanLength = scanBytes.length - signatureLength;\n\n  if (scanLength <= 0) {\n    return false;\n  }\n\n  if (backwards) {\n    const signatureEnd = signatureLength - 1;\n    let pos = scanBytes.length - 1;\n\n    while (pos >= signatureEnd) {\n      let j = 0;\n\n      while (j < signatureLength && scanBytes[pos - j] === signature[signatureEnd - j]) {\n        j++;\n      }\n\n      if (j >= signatureLength) {\n        stream.pos += pos - signatureEnd;\n        return true;\n      }\n\n      pos--;\n    }\n  } else {\n    let pos = 0;\n\n    while (pos <= scanLength) {\n      let j = 0;\n\n      while (j < signatureLength && scanBytes[pos + j] === signature[j]) {\n        j++;\n      }\n\n      if (j >= signatureLength) {\n        stream.pos += pos;\n        return true;\n      }\n\n      pos++;\n    }\n  }\n\n  return false;\n}\n\nclass PDFDocument {\n  constructor(pdfManager, arg) {\n    let stream;\n\n    if ((0, _primitives.isStream)(arg)) {\n      stream = arg;\n    } else if ((0, _util.isArrayBuffer)(arg)) {\n      stream = new _stream.Stream(arg);\n    } else {\n      throw new Error(\"PDFDocument: Unknown argument type\");\n    }\n\n    if (stream.length <= 0) {\n      throw new _util.InvalidPDFException(\"The PDF file is empty, i.e. its size is zero bytes.\");\n    }\n\n    this.pdfManager = pdfManager;\n    this.stream = stream;\n    this.xref = new _obj.XRef(stream, pdfManager);\n    this._pagePromises = [];\n    this._version = null;\n    const idCounters = {\n      font: 0\n    };\n    this._globalIdFactory = class {\n      static getDocId() {\n        return `g_${pdfManager.docId}`;\n      }\n\n      static createFontId() {\n        return `f${++idCounters.font}`;\n      }\n\n      static createObjId() {\n        (0, _util.unreachable)(\"Abstract method `createObjId` called.\");\n      }\n\n    };\n  }\n\n  parse(recoveryMode) {\n    this.xref.parse(recoveryMode);\n    this.catalog = new _obj.Catalog(this.pdfManager, this.xref);\n\n    if (this.catalog.version) {\n      this._version = this.catalog.version;\n    }\n  }\n\n  get linearization() {\n    let linearization = null;\n\n    try {\n      linearization = _parser.Linearization.create(this.stream);\n    } catch (err) {\n      if (err instanceof _core_utils.MissingDataException) {\n        throw err;\n      }\n\n      (0, _util.info)(err);\n    }\n\n    return (0, _util.shadow)(this, \"linearization\", linearization);\n  }\n\n  get startXRef() {\n    const stream = this.stream;\n    let startXRef = 0;\n\n    if (this.linearization) {\n      stream.reset();\n\n      if (find(stream, ENDOBJ_SIGNATURE)) {\n        startXRef = stream.pos + 6 - stream.start;\n      }\n    } else {\n      const step = 1024;\n      const startXRefLength = STARTXREF_SIGNATURE.length;\n      let found = false,\n          pos = stream.end;\n\n      while (!found && pos > 0) {\n        pos -= step - startXRefLength;\n\n        if (pos < 0) {\n          pos = 0;\n        }\n\n        stream.pos = pos;\n        found = find(stream, STARTXREF_SIGNATURE, step, true);\n      }\n\n      if (found) {\n        stream.skip(9);\n        let ch;\n\n        do {\n          ch = stream.getByte();\n        } while ((0, _core_utils.isWhiteSpace)(ch));\n\n        let str = \"\";\n\n        while (ch >= 0x20 && ch <= 0x39) {\n          str += String.fromCharCode(ch);\n          ch = stream.getByte();\n        }\n\n        startXRef = parseInt(str, 10);\n\n        if (isNaN(startXRef)) {\n          startXRef = 0;\n        }\n      }\n    }\n\n    return (0, _util.shadow)(this, \"startXRef\", startXRef);\n  }\n\n  checkHeader() {\n    const stream = this.stream;\n    stream.reset();\n\n    if (!find(stream, PDF_HEADER_SIGNATURE)) {\n      return;\n    }\n\n    stream.moveStart();\n    const MAX_PDF_VERSION_LENGTH = 12;\n    let version = \"\",\n        ch;\n\n    while ((ch = stream.getByte()) > 0x20) {\n      if (version.length >= MAX_PDF_VERSION_LENGTH) {\n        break;\n      }\n\n      version += String.fromCharCode(ch);\n    }\n\n    if (!this._version) {\n      this._version = version.substring(5);\n    }\n  }\n\n  parseStartXRef() {\n    this.xref.setStartXRef(this.startXRef);\n  }\n\n  get numPages() {\n    if (this.xfaFactory) {\n      return (0, _util.shadow)(this, \"numPages\", this.xfaFactory.numberPages);\n    }\n\n    const linearization = this.linearization;\n    const num = linearization ? linearization.numPages : this.catalog.numPages;\n    return (0, _util.shadow)(this, \"numPages\", num);\n  }\n\n  _hasOnlyDocumentSignatures(fields, recursionDepth = 0) {\n    const RECURSION_LIMIT = 10;\n\n    if (!Array.isArray(fields)) {\n      return false;\n    }\n\n    return fields.every(field => {\n      field = this.xref.fetchIfRef(field);\n\n      if (!(field instanceof _primitives.Dict)) {\n        return false;\n      }\n\n      if (field.has(\"Kids\")) {\n        if (++recursionDepth > RECURSION_LIMIT) {\n          (0, _util.warn)(\"_hasOnlyDocumentSignatures: maximum recursion depth reached\");\n          return false;\n        }\n\n        return this._hasOnlyDocumentSignatures(field.get(\"Kids\"), recursionDepth);\n      }\n\n      const isSignature = (0, _primitives.isName)(field.get(\"FT\"), \"Sig\");\n      const rectangle = field.get(\"Rect\");\n      const isInvisible = Array.isArray(rectangle) && rectangle.every(value => value === 0);\n      return isSignature && isInvisible;\n    });\n  }\n\n  get xfaData() {\n    const acroForm = this.catalog.acroForm;\n\n    if (!acroForm) {\n      return null;\n    }\n\n    const xfa = acroForm.get(\"XFA\");\n    const entries = {\n      \"xdp:xdp\": \"\",\n      template: \"\",\n      datasets: \"\",\n      config: \"\",\n      connectionSet: \"\",\n      localeSet: \"\",\n      stylesheet: \"\",\n      \"/xdp:xdp\": \"\"\n    };\n\n    if ((0, _primitives.isStream)(xfa) && !xfa.isEmpty) {\n      try {\n        entries[\"xdp:xdp\"] = (0, _util.stringToUTF8String)((0, _util.bytesToString)(xfa.getBytes()));\n        return entries;\n      } catch (_) {\n        (0, _util.warn)(\"XFA - Invalid utf-8 string.\");\n        return null;\n      }\n    }\n\n    if (!Array.isArray(xfa) || xfa.length === 0) {\n      return null;\n    }\n\n    for (let i = 0, ii = xfa.length; i < ii; i += 2) {\n      let name;\n\n      if (i === 0) {\n        name = \"xdp:xdp\";\n      } else if (i === ii - 2) {\n        name = \"/xdp:xdp\";\n      } else {\n        name = xfa[i];\n      }\n\n      if (!entries.hasOwnProperty(name)) {\n        continue;\n      }\n\n      const data = this.xref.fetchIfRef(xfa[i + 1]);\n\n      if (!(0, _primitives.isStream)(data) || data.isEmpty) {\n        continue;\n      }\n\n      try {\n        entries[name] = (0, _util.stringToUTF8String)((0, _util.bytesToString)(data.getBytes()));\n      } catch (_) {\n        (0, _util.warn)(\"XFA - Invalid utf-8 string.\");\n        return null;\n      }\n    }\n\n    return entries;\n  }\n\n  get xfaFactory() {\n    if (this.pdfManager.enableXfa && this.formInfo.hasXfa && !this.formInfo.hasAcroForm) {\n      const data = this.xfaData;\n      return (0, _util.shadow)(this, \"xfaFactory\", data ? new _factory.XFAFactory(data) : null);\n    }\n\n    return (0, _util.shadow)(this, \"xfaFaxtory\", null);\n  }\n\n  get isPureXfa() {\n    return this.xfaFactory !== null;\n  }\n\n  get formInfo() {\n    const formInfo = {\n      hasFields: false,\n      hasAcroForm: false,\n      hasXfa: false\n    };\n    const acroForm = this.catalog.acroForm;\n\n    if (!acroForm) {\n      return (0, _util.shadow)(this, \"formInfo\", formInfo);\n    }\n\n    try {\n      const fields = acroForm.get(\"Fields\");\n      const hasFields = Array.isArray(fields) && fields.length > 0;\n      formInfo.hasFields = hasFields;\n      const xfa = acroForm.get(\"XFA\");\n      formInfo.hasXfa = Array.isArray(xfa) && xfa.length > 0 || (0, _primitives.isStream)(xfa) && !xfa.isEmpty;\n      const sigFlags = acroForm.get(\"SigFlags\");\n\n      const hasOnlyDocumentSignatures = !!(sigFlags & 0x1) && this._hasOnlyDocumentSignatures(fields);\n\n      formInfo.hasAcroForm = hasFields && !hasOnlyDocumentSignatures;\n    } catch (ex) {\n      if (ex instanceof _core_utils.MissingDataException) {\n        throw ex;\n      }\n\n      (0, _util.warn)(`Cannot fetch form information: \"${ex}\".`);\n    }\n\n    return (0, _util.shadow)(this, \"formInfo\", formInfo);\n  }\n\n  get documentInfo() {\n    const DocumentInfoValidators = {\n      Title: _util.isString,\n      Author: _util.isString,\n      Subject: _util.isString,\n      Keywords: _util.isString,\n      Creator: _util.isString,\n      Producer: _util.isString,\n      CreationDate: _util.isString,\n      ModDate: _util.isString,\n      Trapped: _primitives.isName\n    };\n    let version = this._version;\n\n    if (typeof version !== \"string\" || !PDF_HEADER_VERSION_REGEXP.test(version)) {\n      (0, _util.warn)(`Invalid PDF header version number: ${version}`);\n      version = null;\n    }\n\n    const docInfo = {\n      PDFFormatVersion: version,\n      IsLinearized: !!this.linearization,\n      IsAcroFormPresent: this.formInfo.hasAcroForm,\n      IsXFAPresent: this.formInfo.hasXfa,\n      IsCollectionPresent: !!this.catalog.collection\n    };\n    let infoDict;\n\n    try {\n      infoDict = this.xref.trailer.get(\"Info\");\n    } catch (err) {\n      if (err instanceof _core_utils.MissingDataException) {\n        throw err;\n      }\n\n      (0, _util.info)(\"The document information dictionary is invalid.\");\n    }\n\n    if ((0, _primitives.isDict)(infoDict)) {\n      for (const key of infoDict.getKeys()) {\n        const value = infoDict.get(key);\n\n        if (DocumentInfoValidators[key]) {\n          if (DocumentInfoValidators[key](value)) {\n            docInfo[key] = typeof value !== \"string\" ? value : (0, _util.stringToPDFString)(value);\n          } else {\n            (0, _util.info)(`Bad value in document info for \"${key}\".`);\n          }\n        } else if (typeof key === \"string\") {\n          let customValue;\n\n          if ((0, _util.isString)(value)) {\n            customValue = (0, _util.stringToPDFString)(value);\n          } else if ((0, _primitives.isName)(value) || (0, _util.isNum)(value) || (0, _util.isBool)(value)) {\n            customValue = value;\n          } else {\n            (0, _util.info)(`Unsupported value in document info for (custom) \"${key}\".`);\n            continue;\n          }\n\n          if (!docInfo.Custom) {\n            docInfo.Custom = Object.create(null);\n          }\n\n          docInfo.Custom[key] = customValue;\n        }\n      }\n    }\n\n    return (0, _util.shadow)(this, \"documentInfo\", docInfo);\n  }\n\n  get fingerprint() {\n    let hash;\n    const idArray = this.xref.trailer.get(\"ID\");\n\n    if (Array.isArray(idArray) && idArray[0] && (0, _util.isString)(idArray[0]) && idArray[0] !== EMPTY_FINGERPRINT) {\n      hash = (0, _util.stringToBytes)(idArray[0]);\n    } else {\n      hash = (0, _crypto.calculateMD5)(this.stream.getByteRange(0, FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES);\n    }\n\n    const fingerprintBuf = [];\n\n    for (let i = 0, ii = hash.length; i < ii; i++) {\n      const hex = hash[i].toString(16);\n      fingerprintBuf.push(hex.padStart(2, \"0\"));\n    }\n\n    return (0, _util.shadow)(this, \"fingerprint\", fingerprintBuf.join(\"\"));\n  }\n\n  _getLinearizationPage(pageIndex) {\n    const {\n      catalog,\n      linearization\n    } = this;\n\n    const ref = _primitives.Ref.get(linearization.objectNumberFirst, 0);\n\n    return this.xref.fetchAsync(ref).then(obj => {\n      if ((0, _primitives.isDict)(obj, \"Page\") || (0, _primitives.isDict)(obj) && !obj.has(\"Type\") && obj.has(\"Contents\")) {\n        if (ref && !catalog.pageKidsCountCache.has(ref)) {\n          catalog.pageKidsCountCache.put(ref, 1);\n        }\n\n        return [obj, ref];\n      }\n\n      throw new _util.FormatError(\"The Linearization dictionary doesn't point \" + \"to a valid Page dictionary.\");\n    }).catch(reason => {\n      (0, _util.info)(reason);\n      return catalog.getPageDict(pageIndex);\n    });\n  }\n\n  getPage(pageIndex) {\n    if (this._pagePromises[pageIndex] !== undefined) {\n      return this._pagePromises[pageIndex];\n    }\n\n    const {\n      catalog,\n      linearization\n    } = this;\n\n    if (this.xfaFactory) {\n      return Promise.resolve(new Page({\n        pdfManager: this.pdfManager,\n        xref: this.xref,\n        pageIndex,\n        pageDict: _primitives.Dict.empty,\n        ref: null,\n        globalIdFactory: this._globalIdFactory,\n        fontCache: catalog.fontCache,\n        builtInCMapCache: catalog.builtInCMapCache,\n        globalImageCache: catalog.globalImageCache,\n        nonBlendModesSet: catalog.nonBlendModesSet,\n        xfaFactory: this.xfaFactory\n      }));\n    }\n\n    const promise = linearization && linearization.pageFirst === pageIndex ? this._getLinearizationPage(pageIndex) : catalog.getPageDict(pageIndex);\n    return this._pagePromises[pageIndex] = promise.then(([pageDict, ref]) => {\n      return new Page({\n        pdfManager: this.pdfManager,\n        xref: this.xref,\n        pageIndex,\n        pageDict,\n        ref,\n        globalIdFactory: this._globalIdFactory,\n        fontCache: catalog.fontCache,\n        builtInCMapCache: catalog.builtInCMapCache,\n        globalImageCache: catalog.globalImageCache,\n        nonBlendModesSet: catalog.nonBlendModesSet,\n        xfaFactory: null\n      });\n    });\n  }\n\n  checkFirstPage() {\n    return this.getPage(0).catch(async reason => {\n      if (reason instanceof _core_utils.XRefEntryException) {\n        this._pagePromises.length = 0;\n        await this.cleanup();\n        throw new _core_utils.XRefParseException();\n      }\n    });\n  }\n\n  fontFallback(id, handler) {\n    return this.catalog.fontFallback(id, handler);\n  }\n\n  async cleanup(manuallyTriggered = false) {\n    return this.catalog ? this.catalog.cleanup(manuallyTriggered) : (0, _primitives.clearPrimitiveCaches)();\n  }\n\n  _collectFieldObjects(name, fieldRef, promises) {\n    const field = this.xref.fetchIfRef(fieldRef);\n\n    if (field.has(\"T\")) {\n      const partName = (0, _util.stringToPDFString)(field.get(\"T\"));\n\n      if (name === \"\") {\n        name = partName;\n      } else {\n        name = `${name}.${partName}`;\n      }\n    }\n\n    if (!promises.has(name)) {\n      promises.set(name, []);\n    }\n\n    promises.get(name).push(_annotation.AnnotationFactory.create(this.xref, fieldRef, this.pdfManager, this._localIdFactory, true).then(annotation => annotation && annotation.getFieldObject()).catch(function (reason) {\n      (0, _util.warn)(`_collectFieldObjects: \"${reason}\".`);\n      return null;\n    }));\n\n    if (field.has(\"Kids\")) {\n      const kids = field.get(\"Kids\");\n\n      for (const kid of kids) {\n        this._collectFieldObjects(name, kid, promises);\n      }\n    }\n  }\n\n  get fieldObjects() {\n    if (!this.formInfo.hasFields) {\n      return (0, _util.shadow)(this, \"fieldObjects\", Promise.resolve(null));\n    }\n\n    const allFields = Object.create(null);\n    const fieldPromises = new Map();\n\n    for (const fieldRef of this.catalog.acroForm.get(\"Fields\")) {\n      this._collectFieldObjects(\"\", fieldRef, fieldPromises);\n    }\n\n    const allPromises = [];\n\n    for (const [name, promises] of fieldPromises) {\n      allPromises.push(Promise.all(promises).then(fields => {\n        fields = fields.filter(field => !!field);\n\n        if (fields.length > 0) {\n          allFields[name] = fields;\n        }\n      }));\n    }\n\n    return (0, _util.shadow)(this, \"fieldObjects\", Promise.all(allPromises).then(() => allFields));\n  }\n\n  get hasJSActions() {\n    return (0, _util.shadow)(this, \"hasJSActions\", this.fieldObjects.then(fieldObjects => {\n      return fieldObjects !== null && Object.values(fieldObjects).some(fieldObject => fieldObject.some(object => object.actions !== null)) || !!this.catalog.jsActions;\n    }));\n  }\n\n  get calculationOrderIds() {\n    const acroForm = this.catalog.acroForm;\n\n    if (!acroForm || !acroForm.has(\"CO\")) {\n      return (0, _util.shadow)(this, \"calculationOrderIds\", null);\n    }\n\n    const calculationOrder = acroForm.get(\"CO\");\n\n    if (!Array.isArray(calculationOrder) || calculationOrder.length === 0) {\n      return (0, _util.shadow)(this, \"calculationOrderIds\", null);\n    }\n\n    const ids = calculationOrder.filter(_primitives.isRef).map(ref => ref.toString());\n\n    if (ids.length === 0) {\n      return (0, _util.shadow)(this, \"calculationOrderIds\", null);\n    }\n\n    return (0, _util.shadow)(this, \"calculationOrderIds\", ids);\n  }\n\n}\n\nexports.PDFDocument = PDFDocument;\n\n/***/ }),\n/* 10 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.XRef = exports.ObjectLoader = exports.FileSpec = exports.Catalog = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _primitives = __w_pdfjs_require__(5);\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nvar _parser = __w_pdfjs_require__(11);\n\nvar _crypto = __w_pdfjs_require__(22);\n\nvar _colorspace = __w_pdfjs_require__(23);\n\nvar _image_utils = __w_pdfjs_require__(24);\n\nvar _metadata_parser = __w_pdfjs_require__(25);\n\nfunction fetchDestination(dest) {\n  return (0, _primitives.isDict)(dest) ? dest.get(\"D\") : dest;\n}\n\nclass Catalog {\n  constructor(pdfManager, xref) {\n    this.pdfManager = pdfManager;\n    this.xref = xref;\n    this._catDict = xref.getCatalogObj();\n\n    if (!(0, _primitives.isDict)(this._catDict)) {\n      throw new _util.FormatError(\"Catalog object is not a dictionary.\");\n    }\n\n    this.fontCache = new _primitives.RefSetCache();\n    this.builtInCMapCache = new Map();\n    this.globalImageCache = new _image_utils.GlobalImageCache();\n    this.pageKidsCountCache = new _primitives.RefSetCache();\n    this.nonBlendModesSet = new _primitives.RefSet();\n  }\n\n  get version() {\n    const version = this._catDict.get(\"Version\");\n\n    if (!(0, _primitives.isName)(version)) {\n      return (0, _util.shadow)(this, \"version\", null);\n    }\n\n    return (0, _util.shadow)(this, \"version\", version.name);\n  }\n\n  get collection() {\n    let collection = null;\n\n    try {\n      const obj = this._catDict.get(\"Collection\");\n\n      if ((0, _primitives.isDict)(obj) && obj.size > 0) {\n        collection = obj;\n      }\n    } catch (ex) {\n      if (ex instanceof _core_utils.MissingDataException) {\n        throw ex;\n      }\n\n      (0, _util.info)(\"Cannot fetch Collection entry; assuming no collection is present.\");\n    }\n\n    return (0, _util.shadow)(this, \"collection\", collection);\n  }\n\n  get acroForm() {\n    let acroForm = null;\n\n    try {\n      const obj = this._catDict.get(\"AcroForm\");\n\n      if ((0, _primitives.isDict)(obj) && obj.size > 0) {\n        acroForm = obj;\n      }\n    } catch (ex) {\n      if (ex instanceof _core_utils.MissingDataException) {\n        throw ex;\n      }\n\n      (0, _util.info)(\"Cannot fetch AcroForm entry; assuming no forms are present.\");\n    }\n\n    return (0, _util.shadow)(this, \"acroForm\", acroForm);\n  }\n\n  get metadata() {\n    const streamRef = this._catDict.getRaw(\"Metadata\");\n\n    if (!(0, _primitives.isRef)(streamRef)) {\n      return (0, _util.shadow)(this, \"metadata\", null);\n    }\n\n    const suppressEncryption = !(this.xref.encrypt && this.xref.encrypt.encryptMetadata);\n    const stream = this.xref.fetch(streamRef, suppressEncryption);\n    let metadata = null;\n\n    if ((0, _primitives.isStream)(stream) && (0, _primitives.isDict)(stream.dict)) {\n      const type = stream.dict.get(\"Type\");\n      const subtype = stream.dict.get(\"Subtype\");\n\n      if ((0, _primitives.isName)(type, \"Metadata\") && (0, _primitives.isName)(subtype, \"XML\")) {\n        try {\n          const data = (0, _util.stringToUTF8String)((0, _util.bytesToString)(stream.getBytes()));\n\n          if (data) {\n            metadata = new _metadata_parser.MetadataParser(data).serializable;\n          }\n        } catch (e) {\n          if (e instanceof _core_utils.MissingDataException) {\n            throw e;\n          }\n\n          (0, _util.info)(\"Skipping invalid metadata.\");\n        }\n      }\n    }\n\n    return (0, _util.shadow)(this, \"metadata\", metadata);\n  }\n\n  get markInfo() {\n    let markInfo = null;\n\n    try {\n      markInfo = this._readMarkInfo();\n    } catch (ex) {\n      if (ex instanceof _core_utils.MissingDataException) {\n        throw ex;\n      }\n\n      (0, _util.warn)(\"Unable to read mark info.\");\n    }\n\n    return (0, _util.shadow)(this, \"markInfo\", markInfo);\n  }\n\n  _readMarkInfo() {\n    const obj = this._catDict.get(\"MarkInfo\");\n\n    if (!(0, _primitives.isDict)(obj)) {\n      return null;\n    }\n\n    const markInfo = Object.assign(Object.create(null), {\n      Marked: false,\n      UserProperties: false,\n      Suspects: false\n    });\n\n    for (const key in markInfo) {\n      if (!obj.has(key)) {\n        continue;\n      }\n\n      const value = obj.get(key);\n\n      if (!(0, _util.isBool)(value)) {\n        continue;\n      }\n\n      markInfo[key] = value;\n    }\n\n    return markInfo;\n  }\n\n  get toplevelPagesDict() {\n    const pagesObj = this._catDict.get(\"Pages\");\n\n    if (!(0, _primitives.isDict)(pagesObj)) {\n      throw new _util.FormatError(\"Invalid top-level pages dictionary.\");\n    }\n\n    return (0, _util.shadow)(this, \"toplevelPagesDict\", pagesObj);\n  }\n\n  get documentOutline() {\n    let obj = null;\n\n    try {\n      obj = this._readDocumentOutline();\n    } catch (ex) {\n      if (ex instanceof _core_utils.MissingDataException) {\n        throw ex;\n      }\n\n      (0, _util.warn)(\"Unable to read document outline.\");\n    }\n\n    return (0, _util.shadow)(this, \"documentOutline\", obj);\n  }\n\n  _readDocumentOutline() {\n    let obj = this._catDict.get(\"Outlines\");\n\n    if (!(0, _primitives.isDict)(obj)) {\n      return null;\n    }\n\n    obj = obj.getRaw(\"First\");\n\n    if (!(0, _primitives.isRef)(obj)) {\n      return null;\n    }\n\n    const root = {\n      items: []\n    };\n    const queue = [{\n      obj,\n      parent: root\n    }];\n    const processed = new _primitives.RefSet();\n    processed.put(obj);\n    const xref = this.xref,\n          blackColor = new Uint8ClampedArray(3);\n\n    while (queue.length > 0) {\n      const i = queue.shift();\n      const outlineDict = xref.fetchIfRef(i.obj);\n\n      if (outlineDict === null) {\n        continue;\n      }\n\n      if (!outlineDict.has(\"Title\")) {\n        throw new _util.FormatError(\"Invalid outline item encountered.\");\n      }\n\n      const data = {\n        url: null,\n        dest: null\n      };\n      Catalog.parseDestDictionary({\n        destDict: outlineDict,\n        resultObj: data,\n        docBaseUrl: this.pdfManager.docBaseUrl\n      });\n      const title = outlineDict.get(\"Title\");\n      const flags = outlineDict.get(\"F\") || 0;\n      const color = outlineDict.getArray(\"C\");\n      const count = outlineDict.get(\"Count\");\n      let rgbColor = blackColor;\n\n      if (Array.isArray(color) && color.length === 3 && (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)) {\n        rgbColor = _colorspace.ColorSpace.singletons.rgb.getRgb(color, 0);\n      }\n\n      const outlineItem = {\n        dest: data.dest,\n        url: data.url,\n        unsafeUrl: data.unsafeUrl,\n        newWindow: data.newWindow,\n        title: (0, _util.stringToPDFString)(title),\n        color: rgbColor,\n        count: Number.isInteger(count) ? count : undefined,\n        bold: !!(flags & 2),\n        italic: !!(flags & 1),\n        items: []\n      };\n      i.parent.items.push(outlineItem);\n      obj = outlineDict.getRaw(\"First\");\n\n      if ((0, _primitives.isRef)(obj) && !processed.has(obj)) {\n        queue.push({\n          obj,\n          parent: outlineItem\n        });\n        processed.put(obj);\n      }\n\n      obj = outlineDict.getRaw(\"Next\");\n\n      if ((0, _primitives.isRef)(obj) && !processed.has(obj)) {\n        queue.push({\n          obj,\n          parent: i.parent\n        });\n        processed.put(obj);\n      }\n    }\n\n    return root.items.length > 0 ? root.items : null;\n  }\n\n  get permissions() {\n    let permissions = null;\n\n    try {\n      permissions = this._readPermissions();\n    } catch (ex) {\n      if (ex instanceof _core_utils.MissingDataException) {\n        throw ex;\n      }\n\n      (0, _util.warn)(\"Unable to read permissions.\");\n    }\n\n    return (0, _util.shadow)(this, \"permissions\", permissions);\n  }\n\n  _readPermissions() {\n    const encrypt = this.xref.trailer.get(\"Encrypt\");\n\n    if (!(0, _primitives.isDict)(encrypt)) {\n      return null;\n    }\n\n    let flags = encrypt.get(\"P\");\n\n    if (!(0, _util.isNum)(flags)) {\n      return null;\n    }\n\n    flags += 2 ** 32;\n    const permissions = [];\n\n    for (const key in _util.PermissionFlag) {\n      const value = _util.PermissionFlag[key];\n\n      if (flags & value) {\n        permissions.push(value);\n      }\n    }\n\n    return permissions;\n  }\n\n  get optionalContentConfig() {\n    let config = null;\n\n    try {\n      const properties = this._catDict.get(\"OCProperties\");\n\n      if (!properties) {\n        return (0, _util.shadow)(this, \"optionalContentConfig\", null);\n      }\n\n      const defaultConfig = properties.get(\"D\");\n\n      if (!defaultConfig) {\n        return (0, _util.shadow)(this, \"optionalContentConfig\", null);\n      }\n\n      const groupsData = properties.get(\"OCGs\");\n\n      if (!Array.isArray(groupsData)) {\n        return (0, _util.shadow)(this, \"optionalContentConfig\", null);\n      }\n\n      const groups = [];\n      const groupRefs = [];\n\n      for (const groupRef of groupsData) {\n        if (!(0, _primitives.isRef)(groupRef)) {\n          continue;\n        }\n\n        groupRefs.push(groupRef);\n        const group = this.xref.fetchIfRef(groupRef);\n        groups.push({\n          id: groupRef.toString(),\n          name: (0, _util.isString)(group.get(\"Name\")) ? (0, _util.stringToPDFString)(group.get(\"Name\")) : null,\n          intent: (0, _util.isString)(group.get(\"Intent\")) ? (0, _util.stringToPDFString)(group.get(\"Intent\")) : null\n        });\n      }\n\n      config = this._readOptionalContentConfig(defaultConfig, groupRefs);\n      config.groups = groups;\n    } catch (ex) {\n      if (ex instanceof _core_utils.MissingDataException) {\n        throw ex;\n      }\n\n      (0, _util.warn)(`Unable to read optional content config: ${ex}`);\n    }\n\n    return (0, _util.shadow)(this, \"optionalContentConfig\", config);\n  }\n\n  _readOptionalContentConfig(config, contentGroupRefs) {\n    function parseOnOff(refs) {\n      const onParsed = [];\n\n      if (Array.isArray(refs)) {\n        for (const value of refs) {\n          if (!(0, _primitives.isRef)(value)) {\n            continue;\n          }\n\n          if (contentGroupRefs.includes(value)) {\n            onParsed.push(value.toString());\n          }\n        }\n      }\n\n      return onParsed;\n    }\n\n    function parseOrder(refs, nestedLevels = 0) {\n      if (!Array.isArray(refs)) {\n        return null;\n      }\n\n      const order = [];\n\n      for (const value of refs) {\n        if ((0, _primitives.isRef)(value) && contentGroupRefs.includes(value)) {\n          parsedOrderRefs.put(value);\n          order.push(value.toString());\n          continue;\n        }\n\n        const nestedOrder = parseNestedOrder(value, nestedLevels);\n\n        if (nestedOrder) {\n          order.push(nestedOrder);\n        }\n      }\n\n      if (nestedLevels > 0) {\n        return order;\n      }\n\n      const hiddenGroups = [];\n\n      for (const groupRef of contentGroupRefs) {\n        if (parsedOrderRefs.has(groupRef)) {\n          continue;\n        }\n\n        hiddenGroups.push(groupRef.toString());\n      }\n\n      if (hiddenGroups.length) {\n        order.push({\n          name: null,\n          order: hiddenGroups\n        });\n      }\n\n      return order;\n    }\n\n    function parseNestedOrder(ref, nestedLevels) {\n      if (++nestedLevels > MAX_NESTED_LEVELS) {\n        (0, _util.warn)(\"parseNestedOrder - reached MAX_NESTED_LEVELS.\");\n        return null;\n      }\n\n      const value = xref.fetchIfRef(ref);\n\n      if (!Array.isArray(value)) {\n        return null;\n      }\n\n      const nestedName = xref.fetchIfRef(value[0]);\n\n      if (typeof nestedName !== \"string\") {\n        return null;\n      }\n\n      const nestedOrder = parseOrder(value.slice(1), nestedLevels);\n\n      if (!nestedOrder || !nestedOrder.length) {\n        return null;\n      }\n\n      return {\n        name: (0, _util.stringToPDFString)(nestedName),\n        order: nestedOrder\n      };\n    }\n\n    const xref = this.xref,\n          parsedOrderRefs = new _primitives.RefSet(),\n          MAX_NESTED_LEVELS = 10;\n    return {\n      name: (0, _util.isString)(config.get(\"Name\")) ? (0, _util.stringToPDFString)(config.get(\"Name\")) : null,\n      creator: (0, _util.isString)(config.get(\"Creator\")) ? (0, _util.stringToPDFString)(config.get(\"Creator\")) : null,\n      baseState: (0, _primitives.isName)(config.get(\"BaseState\")) ? config.get(\"BaseState\").name : null,\n      on: parseOnOff(config.get(\"ON\")),\n      off: parseOnOff(config.get(\"OFF\")),\n      order: parseOrder(config.get(\"Order\")),\n      groups: null\n    };\n  }\n\n  get numPages() {\n    const obj = this.toplevelPagesDict.get(\"Count\");\n\n    if (!Number.isInteger(obj)) {\n      throw new _util.FormatError(\"Page count in top-level pages dictionary is not an integer.\");\n    }\n\n    return (0, _util.shadow)(this, \"numPages\", obj);\n  }\n\n  get destinations() {\n    const obj = this._readDests(),\n          dests = Object.create(null);\n\n    if (obj instanceof NameTree) {\n      const names = obj.getAll();\n\n      for (const name in names) {\n        dests[name] = fetchDestination(names[name]);\n      }\n    } else if (obj instanceof _primitives.Dict) {\n      obj.forEach(function (key, value) {\n        if (value) {\n          dests[key] = fetchDestination(value);\n        }\n      });\n    }\n\n    return (0, _util.shadow)(this, \"destinations\", dests);\n  }\n\n  getDestination(destinationId) {\n    const obj = this._readDests();\n\n    if (obj instanceof NameTree || obj instanceof _primitives.Dict) {\n      return fetchDestination(obj.get(destinationId) || null);\n    }\n\n    return null;\n  }\n\n  _readDests() {\n    const obj = this._catDict.get(\"Names\");\n\n    if (obj && obj.has(\"Dests\")) {\n      return new NameTree(obj.getRaw(\"Dests\"), this.xref);\n    } else if (this._catDict.has(\"Dests\")) {\n      return this._catDict.get(\"Dests\");\n    }\n\n    return undefined;\n  }\n\n  get pageLabels() {\n    let obj = null;\n\n    try {\n      obj = this._readPageLabels();\n    } catch (ex) {\n      if (ex instanceof _core_utils.MissingDataException) {\n        throw ex;\n      }\n\n      (0, _util.warn)(\"Unable to read page labels.\");\n    }\n\n    return (0, _util.shadow)(this, \"pageLabels\", obj);\n  }\n\n  _readPageLabels() {\n    const obj = this._catDict.getRaw(\"PageLabels\");\n\n    if (!obj) {\n      return null;\n    }\n\n    const pageLabels = new Array(this.numPages);\n    let style = null,\n        prefix = \"\";\n    const numberTree = new NumberTree(obj, this.xref);\n    const nums = numberTree.getAll();\n    let currentLabel = \"\",\n        currentIndex = 1;\n\n    for (let i = 0, ii = this.numPages; i < ii; i++) {\n      if (i in nums) {\n        const labelDict = nums[i];\n\n        if (!(0, _primitives.isDict)(labelDict)) {\n          throw new _util.FormatError(\"PageLabel is not a dictionary.\");\n        }\n\n        if (labelDict.has(\"Type\") && !(0, _primitives.isName)(labelDict.get(\"Type\"), \"PageLabel\")) {\n          throw new _util.FormatError(\"Invalid type in PageLabel dictionary.\");\n        }\n\n        if (labelDict.has(\"S\")) {\n          const s = labelDict.get(\"S\");\n\n          if (!(0, _primitives.isName)(s)) {\n            throw new _util.FormatError(\"Invalid style in PageLabel dictionary.\");\n          }\n\n          style = s.name;\n        } else {\n          style = null;\n        }\n\n        if (labelDict.has(\"P\")) {\n          const p = labelDict.get(\"P\");\n\n          if (!(0, _util.isString)(p)) {\n            throw new _util.FormatError(\"Invalid prefix in PageLabel dictionary.\");\n          }\n\n          prefix = (0, _util.stringToPDFString)(p);\n        } else {\n          prefix = \"\";\n        }\n\n        if (labelDict.has(\"St\")) {\n          const st = labelDict.get(\"St\");\n\n          if (!(Number.isInteger(st) && st >= 1)) {\n            throw new _util.FormatError(\"Invalid start in PageLabel dictionary.\");\n          }\n\n          currentIndex = st;\n        } else {\n          currentIndex = 1;\n        }\n      }\n\n      switch (style) {\n        case \"D\":\n          currentLabel = currentIndex;\n          break;\n\n        case \"R\":\n        case \"r\":\n          currentLabel = (0, _core_utils.toRomanNumerals)(currentIndex, style === \"r\");\n          break;\n\n        case \"A\":\n        case \"a\":\n          const LIMIT = 26;\n          const A_UPPER_CASE = 0x41,\n                A_LOWER_CASE = 0x61;\n          const baseCharCode = style === \"a\" ? A_LOWER_CASE : A_UPPER_CASE;\n          const letterIndex = currentIndex - 1;\n          const character = String.fromCharCode(baseCharCode + letterIndex % LIMIT);\n          const charBuf = [];\n\n          for (let j = 0, jj = letterIndex / LIMIT | 0; j <= jj; j++) {\n            charBuf.push(character);\n          }\n\n          currentLabel = charBuf.join(\"\");\n          break;\n\n        default:\n          if (style) {\n            throw new _util.FormatError(`Invalid style \"${style}\" in PageLabel dictionary.`);\n          }\n\n          currentLabel = \"\";\n      }\n\n      pageLabels[i] = prefix + currentLabel;\n      currentIndex++;\n    }\n\n    return pageLabels;\n  }\n\n  get pageLayout() {\n    const obj = this._catDict.get(\"PageLayout\");\n\n    let pageLayout = \"\";\n\n    if ((0, _primitives.isName)(obj)) {\n      switch (obj.name) {\n        case \"SinglePage\":\n        case \"OneColumn\":\n        case \"TwoColumnLeft\":\n        case \"TwoColumnRight\":\n        case \"TwoPageLeft\":\n        case \"TwoPageRight\":\n          pageLayout = obj.name;\n      }\n    }\n\n    return (0, _util.shadow)(this, \"pageLayout\", pageLayout);\n  }\n\n  get pageMode() {\n    const obj = this._catDict.get(\"PageMode\");\n\n    let pageMode = \"UseNone\";\n\n    if ((0, _primitives.isName)(obj)) {\n      switch (obj.name) {\n        case \"UseNone\":\n        case \"UseOutlines\":\n        case \"UseThumbs\":\n        case \"FullScreen\":\n        case \"UseOC\":\n        case \"UseAttachments\":\n          pageMode = obj.name;\n      }\n    }\n\n    return (0, _util.shadow)(this, \"pageMode\", pageMode);\n  }\n\n  get viewerPreferences() {\n    const ViewerPreferencesValidators = {\n      HideToolbar: _util.isBool,\n      HideMenubar: _util.isBool,\n      HideWindowUI: _util.isBool,\n      FitWindow: _util.isBool,\n      CenterWindow: _util.isBool,\n      DisplayDocTitle: _util.isBool,\n      NonFullScreenPageMode: _primitives.isName,\n      Direction: _primitives.isName,\n      ViewArea: _primitives.isName,\n      ViewClip: _primitives.isName,\n      PrintArea: _primitives.isName,\n      PrintClip: _primitives.isName,\n      PrintScaling: _primitives.isName,\n      Duplex: _primitives.isName,\n      PickTrayByPDFSize: _util.isBool,\n      PrintPageRange: Array.isArray,\n      NumCopies: Number.isInteger\n    };\n\n    const obj = this._catDict.get(\"ViewerPreferences\");\n\n    let prefs = null;\n\n    if ((0, _primitives.isDict)(obj)) {\n      for (const key in ViewerPreferencesValidators) {\n        if (!obj.has(key)) {\n          continue;\n        }\n\n        const value = obj.get(key);\n\n        if (!ViewerPreferencesValidators[key](value)) {\n          (0, _util.info)(`Bad value in ViewerPreferences for \"${key}\".`);\n          continue;\n        }\n\n        let prefValue;\n\n        switch (key) {\n          case \"NonFullScreenPageMode\":\n            switch (value.name) {\n              case \"UseNone\":\n              case \"UseOutlines\":\n              case \"UseThumbs\":\n              case \"UseOC\":\n                prefValue = value.name;\n                break;\n\n              default:\n                prefValue = \"UseNone\";\n            }\n\n            break;\n\n          case \"Direction\":\n            switch (value.name) {\n              case \"L2R\":\n              case \"R2L\":\n                prefValue = value.name;\n                break;\n\n              default:\n                prefValue = \"L2R\";\n            }\n\n            break;\n\n          case \"ViewArea\":\n          case \"ViewClip\":\n          case \"PrintArea\":\n          case \"PrintClip\":\n            switch (value.name) {\n              case \"MediaBox\":\n              case \"CropBox\":\n              case \"BleedBox\":\n              case \"TrimBox\":\n              case \"ArtBox\":\n                prefValue = value.name;\n                break;\n\n              default:\n                prefValue = \"CropBox\";\n            }\n\n            break;\n\n          case \"PrintScaling\":\n            switch (value.name) {\n              case \"None\":\n              case \"AppDefault\":\n                prefValue = value.name;\n                break;\n\n              default:\n                prefValue = \"AppDefault\";\n            }\n\n            break;\n\n          case \"Duplex\":\n            switch (value.name) {\n              case \"Simplex\":\n              case \"DuplexFlipShortEdge\":\n              case \"DuplexFlipLongEdge\":\n                prefValue = value.name;\n                break;\n\n              default:\n                prefValue = \"None\";\n            }\n\n            break;\n\n          case \"PrintPageRange\":\n            const length = value.length;\n\n            if (length % 2 !== 0) {\n              break;\n            }\n\n            const isValid = value.every((page, i, arr) => {\n              return Number.isInteger(page) && page > 0 && (i === 0 || page >= arr[i - 1]) && page <= this.numPages;\n            });\n\n            if (isValid) {\n              prefValue = value;\n            }\n\n            break;\n\n          case \"NumCopies\":\n            if (value > 0) {\n              prefValue = value;\n            }\n\n            break;\n\n          default:\n            if (typeof value !== \"boolean\") {\n              throw new _util.FormatError(`viewerPreferences - expected a boolean value for: ${key}`);\n            }\n\n            prefValue = value;\n        }\n\n        if (prefValue !== undefined) {\n          if (!prefs) {\n            prefs = Object.create(null);\n          }\n\n          prefs[key] = prefValue;\n        } else {\n          (0, _util.info)(`Bad value in ViewerPreferences for \"${key}\".`);\n        }\n      }\n    }\n\n    return (0, _util.shadow)(this, \"viewerPreferences\", prefs);\n  }\n\n  get openAction() {\n    const obj = this._catDict.get(\"OpenAction\");\n\n    const openAction = Object.create(null);\n\n    if ((0, _primitives.isDict)(obj)) {\n      const destDict = new _primitives.Dict(this.xref);\n      destDict.set(\"A\", obj);\n      const resultObj = {\n        url: null,\n        dest: null,\n        action: null\n      };\n      Catalog.parseDestDictionary({\n        destDict,\n        resultObj\n      });\n\n      if (Array.isArray(resultObj.dest)) {\n        openAction.dest = resultObj.dest;\n      } else if (resultObj.action) {\n        openAction.action = resultObj.action;\n      }\n    } else if (Array.isArray(obj)) {\n      openAction.dest = obj;\n    }\n\n    return (0, _util.shadow)(this, \"openAction\", (0, _util.objectSize)(openAction) > 0 ? openAction : null);\n  }\n\n  get attachments() {\n    const obj = this._catDict.get(\"Names\");\n\n    let attachments = null;\n\n    if (obj && obj.has(\"EmbeddedFiles\")) {\n      const nameTree = new NameTree(obj.getRaw(\"EmbeddedFiles\"), this.xref);\n      const names = nameTree.getAll();\n\n      for (const name in names) {\n        const fs = new FileSpec(names[name], this.xref);\n\n        if (!attachments) {\n          attachments = Object.create(null);\n        }\n\n        attachments[(0, _util.stringToPDFString)(name)] = fs.serializable;\n      }\n    }\n\n    return (0, _util.shadow)(this, \"attachments\", attachments);\n  }\n\n  _collectJavaScript() {\n    const obj = this._catDict.get(\"Names\");\n\n    let javaScript = null;\n\n    function appendIfJavaScriptDict(name, jsDict) {\n      const type = jsDict.get(\"S\");\n\n      if (!(0, _primitives.isName)(type, \"JavaScript\")) {\n        return;\n      }\n\n      let js = jsDict.get(\"JS\");\n\n      if ((0, _primitives.isStream)(js)) {\n        js = (0, _util.bytesToString)(js.getBytes());\n      } else if (!(0, _util.isString)(js)) {\n        return;\n      }\n\n      if (javaScript === null) {\n        javaScript = Object.create(null);\n      }\n\n      javaScript[name] = (0, _util.stringToPDFString)(js);\n    }\n\n    if (obj && obj.has(\"JavaScript\")) {\n      const nameTree = new NameTree(obj.getRaw(\"JavaScript\"), this.xref);\n      const names = nameTree.getAll();\n\n      for (const name in names) {\n        const jsDict = names[name];\n\n        if ((0, _primitives.isDict)(jsDict)) {\n          appendIfJavaScriptDict(name, jsDict);\n        }\n      }\n    }\n\n    const openAction = this._catDict.get(\"OpenAction\");\n\n    if ((0, _primitives.isDict)(openAction) && (0, _primitives.isName)(openAction.get(\"S\"), \"JavaScript\")) {\n      appendIfJavaScriptDict(\"OpenAction\", openAction);\n    }\n\n    return javaScript;\n  }\n\n  get javaScript() {\n    const javaScript = this._collectJavaScript();\n\n    return (0, _util.shadow)(this, \"javaScript\", javaScript ? Object.values(javaScript) : null);\n  }\n\n  get jsActions() {\n    const js = this._collectJavaScript();\n\n    let actions = (0, _core_utils.collectActions)(this.xref, this._catDict, _util.DocumentActionEventType);\n\n    if (!actions && js) {\n      actions = Object.create(null);\n    }\n\n    if (actions && js) {\n      for (const [key, val] of Object.entries(js)) {\n        if (key in actions) {\n          actions[key].push(val);\n        } else {\n          actions[key] = [val];\n        }\n      }\n    }\n\n    return (0, _util.shadow)(this, \"jsActions\", actions);\n  }\n\n  fontFallback(id, handler) {\n    const promises = [];\n    this.fontCache.forEach(function (promise) {\n      promises.push(promise);\n    });\n    return Promise.all(promises).then(translatedFonts => {\n      for (const translatedFont of translatedFonts) {\n        if (translatedFont.loadedName === id) {\n          translatedFont.fallback(handler);\n          return;\n        }\n      }\n    });\n  }\n\n  cleanup(manuallyTriggered = false) {\n    (0, _primitives.clearPrimitiveCaches)();\n    this.globalImageCache.clear(manuallyTriggered);\n    this.pageKidsCountCache.clear();\n    this.nonBlendModesSet.clear();\n    const promises = [];\n    this.fontCache.forEach(function (promise) {\n      promises.push(promise);\n    });\n    return Promise.all(promises).then(translatedFonts => {\n      for (const {\n        dict\n      } of translatedFonts) {\n        delete dict.cacheKey;\n      }\n\n      this.fontCache.clear();\n      this.builtInCMapCache.clear();\n    });\n  }\n\n  getPageDict(pageIndex) {\n    const capability = (0, _util.createPromiseCapability)();\n    const nodesToVisit = [this._catDict.getRaw(\"Pages\")];\n    const visitedNodes = new _primitives.RefSet();\n    const xref = this.xref,\n          pageKidsCountCache = this.pageKidsCountCache;\n    let count,\n        currentPageIndex = 0;\n\n    function next() {\n      while (nodesToVisit.length) {\n        const currentNode = nodesToVisit.pop();\n\n        if ((0, _primitives.isRef)(currentNode)) {\n          count = pageKidsCountCache.get(currentNode);\n\n          if (count > 0 && currentPageIndex + count < pageIndex) {\n            currentPageIndex += count;\n            continue;\n          }\n\n          if (visitedNodes.has(currentNode)) {\n            capability.reject(new _util.FormatError(\"Pages tree contains circular reference.\"));\n            return;\n          }\n\n          visitedNodes.put(currentNode);\n          xref.fetchAsync(currentNode).then(function (obj) {\n            if ((0, _primitives.isDict)(obj, \"Page\") || (0, _primitives.isDict)(obj) && !obj.has(\"Kids\")) {\n              if (pageIndex === currentPageIndex) {\n                if (currentNode && !pageKidsCountCache.has(currentNode)) {\n                  pageKidsCountCache.put(currentNode, 1);\n                }\n\n                capability.resolve([obj, currentNode]);\n              } else {\n                currentPageIndex++;\n                next();\n              }\n\n              return;\n            }\n\n            nodesToVisit.push(obj);\n            next();\n          }, capability.reject);\n          return;\n        }\n\n        if (!(0, _primitives.isDict)(currentNode)) {\n          capability.reject(new _util.FormatError(\"Page dictionary kid reference points to wrong type of object.\"));\n          return;\n        }\n\n        count = currentNode.get(\"Count\");\n\n        if (Number.isInteger(count) && count >= 0) {\n          const objId = currentNode.objId;\n\n          if (objId && !pageKidsCountCache.has(objId)) {\n            pageKidsCountCache.put(objId, count);\n          }\n\n          if (currentPageIndex + count <= pageIndex) {\n            currentPageIndex += count;\n            continue;\n          }\n        }\n\n        const kids = currentNode.get(\"Kids\");\n\n        if (!Array.isArray(kids)) {\n          if ((0, _primitives.isName)(currentNode.get(\"Type\"), \"Page\") || !currentNode.has(\"Type\") && currentNode.has(\"Contents\")) {\n            if (currentPageIndex === pageIndex) {\n              capability.resolve([currentNode, null]);\n              return;\n            }\n\n            currentPageIndex++;\n            continue;\n          }\n\n          capability.reject(new _util.FormatError(\"Page dictionary kids object is not an array.\"));\n          return;\n        }\n\n        for (let last = kids.length - 1; last >= 0; last--) {\n          nodesToVisit.push(kids[last]);\n        }\n      }\n\n      capability.reject(new Error(`Page index ${pageIndex} not found.`));\n    }\n\n    next();\n    return capability.promise;\n  }\n\n  getPageIndex(pageRef) {\n    const xref = this.xref;\n\n    function pagesBeforeRef(kidRef) {\n      let total = 0,\n          parentRef;\n      return xref.fetchAsync(kidRef).then(function (node) {\n        if ((0, _primitives.isRefsEqual)(kidRef, pageRef) && !(0, _primitives.isDict)(node, \"Page\") && !((0, _primitives.isDict)(node) && !node.has(\"Type\") && node.has(\"Contents\"))) {\n          throw new _util.FormatError(\"The reference does not point to a /Page dictionary.\");\n        }\n\n        if (!node) {\n          return null;\n        }\n\n        if (!(0, _primitives.isDict)(node)) {\n          throw new _util.FormatError(\"Node must be a dictionary.\");\n        }\n\n        parentRef = node.getRaw(\"Parent\");\n        return node.getAsync(\"Parent\");\n      }).then(function (parent) {\n        if (!parent) {\n          return null;\n        }\n\n        if (!(0, _primitives.isDict)(parent)) {\n          throw new _util.FormatError(\"Parent must be a dictionary.\");\n        }\n\n        return parent.getAsync(\"Kids\");\n      }).then(function (kids) {\n        if (!kids) {\n          return null;\n        }\n\n        const kidPromises = [];\n        let found = false;\n\n        for (let i = 0, ii = kids.length; i < ii; i++) {\n          const kid = kids[i];\n\n          if (!(0, _primitives.isRef)(kid)) {\n            throw new _util.FormatError(\"Kid must be a reference.\");\n          }\n\n          if ((0, _primitives.isRefsEqual)(kid, kidRef)) {\n            found = true;\n            break;\n          }\n\n          kidPromises.push(xref.fetchAsync(kid).then(function (obj) {\n            if (!(0, _primitives.isDict)(obj)) {\n              throw new _util.FormatError(\"Kid node must be a dictionary.\");\n            }\n\n            if (obj.has(\"Count\")) {\n              total += obj.get(\"Count\");\n            } else {\n              total++;\n            }\n          }));\n        }\n\n        if (!found) {\n          throw new _util.FormatError(\"Kid reference not found in parent's kids.\");\n        }\n\n        return Promise.all(kidPromises).then(function () {\n          return [total, parentRef];\n        });\n      });\n    }\n\n    let total = 0;\n\n    function next(ref) {\n      return pagesBeforeRef(ref).then(function (args) {\n        if (!args) {\n          return total;\n        }\n\n        const [count, parentRef] = args;\n        total += count;\n        return next(parentRef);\n      });\n    }\n\n    return next(pageRef);\n  }\n\n  static parseDestDictionary(params) {\n    function addDefaultProtocolToUrl(url) {\n      return url.startsWith(\"www.\") ? `http://${url}` : url;\n    }\n\n    function tryConvertUrlEncoding(url) {\n      try {\n        return (0, _util.stringToUTF8String)(url);\n      } catch (e) {\n        return url;\n      }\n    }\n\n    const destDict = params.destDict;\n\n    if (!(0, _primitives.isDict)(destDict)) {\n      (0, _util.warn)(\"parseDestDictionary: `destDict` must be a dictionary.\");\n      return;\n    }\n\n    const resultObj = params.resultObj;\n\n    if (typeof resultObj !== \"object\") {\n      (0, _util.warn)(\"parseDestDictionary: `resultObj` must be an object.\");\n      return;\n    }\n\n    const docBaseUrl = params.docBaseUrl || null;\n    let action = destDict.get(\"A\"),\n        url,\n        dest;\n\n    if (!(0, _primitives.isDict)(action)) {\n      if (destDict.has(\"Dest\")) {\n        action = destDict.get(\"Dest\");\n      } else {\n        action = destDict.get(\"AA\");\n\n        if ((0, _primitives.isDict)(action)) {\n          if (action.has(\"D\")) {\n            action = action.get(\"D\");\n          } else if (action.has(\"U\")) {\n            action = action.get(\"U\");\n          }\n        }\n      }\n    }\n\n    if ((0, _primitives.isDict)(action)) {\n      const actionType = action.get(\"S\");\n\n      if (!(0, _primitives.isName)(actionType)) {\n        (0, _util.warn)(\"parseDestDictionary: Invalid type in Action dictionary.\");\n        return;\n      }\n\n      const actionName = actionType.name;\n\n      switch (actionName) {\n        case \"URI\":\n          url = action.get(\"URI\");\n\n          if ((0, _primitives.isName)(url)) {\n            url = \"/\" + url.name;\n          } else if ((0, _util.isString)(url)) {\n            url = addDefaultProtocolToUrl(url);\n          }\n\n          break;\n\n        case \"GoTo\":\n          dest = action.get(\"D\");\n          break;\n\n        case \"Launch\":\n        case \"GoToR\":\n          const urlDict = action.get(\"F\");\n\n          if ((0, _primitives.isDict)(urlDict)) {\n            url = urlDict.get(\"F\") || null;\n          } else if ((0, _util.isString)(urlDict)) {\n            url = urlDict;\n          }\n\n          let remoteDest = action.get(\"D\");\n\n          if (remoteDest) {\n            if ((0, _primitives.isName)(remoteDest)) {\n              remoteDest = remoteDest.name;\n            }\n\n            if ((0, _util.isString)(url)) {\n              const baseUrl = url.split(\"#\")[0];\n\n              if ((0, _util.isString)(remoteDest)) {\n                url = baseUrl + \"#\" + remoteDest;\n              } else if (Array.isArray(remoteDest)) {\n                url = baseUrl + \"#\" + JSON.stringify(remoteDest);\n              }\n            }\n          }\n\n          const newWindow = action.get(\"NewWindow\");\n\n          if ((0, _util.isBool)(newWindow)) {\n            resultObj.newWindow = newWindow;\n          }\n\n          break;\n\n        case \"Named\":\n          const namedAction = action.get(\"N\");\n\n          if ((0, _primitives.isName)(namedAction)) {\n            resultObj.action = namedAction.name;\n          }\n\n          break;\n\n        case \"JavaScript\":\n          const jsAction = action.get(\"JS\");\n          let js;\n\n          if ((0, _primitives.isStream)(jsAction)) {\n            js = (0, _util.bytesToString)(jsAction.getBytes());\n          } else if ((0, _util.isString)(jsAction)) {\n            js = jsAction;\n          }\n\n          if (js) {\n            const URL_OPEN_METHODS = [\"app.launchURL\", \"window.open\"];\n            const regex = new RegExp(\"^\\\\s*(\" + URL_OPEN_METHODS.join(\"|\").split(\".\").join(\"\\\\.\") + \")\\\\((?:'|\\\")([^'\\\"]*)(?:'|\\\")(?:,\\\\s*(\\\\w+)\\\\)|\\\\))\", \"i\");\n            const jsUrl = regex.exec((0, _util.stringToPDFString)(js));\n\n            if (jsUrl && jsUrl[2]) {\n              url = jsUrl[2];\n\n              if (jsUrl[3] === \"true\" && jsUrl[1] === \"app.launchURL\") {\n                resultObj.newWindow = true;\n              }\n\n              break;\n            }\n          }\n\n        default:\n          if (actionName === \"JavaScript\" || actionName === \"ResetForm\" || actionName === \"SubmitForm\") {\n            break;\n          }\n\n          (0, _util.warn)(`parseDestDictionary - unsupported action: \"${actionName}\".`);\n          break;\n      }\n    } else if (destDict.has(\"Dest\")) {\n      dest = destDict.get(\"Dest\");\n    }\n\n    if ((0, _util.isString)(url)) {\n      url = tryConvertUrlEncoding(url);\n      const absoluteUrl = (0, _util.createValidAbsoluteUrl)(url, docBaseUrl);\n\n      if (absoluteUrl) {\n        resultObj.url = absoluteUrl.href;\n      }\n\n      resultObj.unsafeUrl = url;\n    }\n\n    if (dest) {\n      if ((0, _primitives.isName)(dest)) {\n        dest = dest.name;\n      }\n\n      if ((0, _util.isString)(dest) || Array.isArray(dest)) {\n        resultObj.dest = dest;\n      }\n    }\n  }\n\n}\n\nexports.Catalog = Catalog;\n\nvar XRef = function XRefClosure() {\n  function XRef(stream, pdfManager) {\n    this.stream = stream;\n    this.pdfManager = pdfManager;\n    this.entries = [];\n    this.xrefstms = Object.create(null);\n    this._cacheMap = new Map();\n    this.stats = {\n      streamTypes: Object.create(null),\n      fontTypes: Object.create(null)\n    };\n    this._newRefNum = null;\n  }\n\n  XRef.prototype = {\n    getNewRef: function XRef_getNewRef() {\n      if (this._newRefNum === null) {\n        this._newRefNum = this.entries.length;\n      }\n\n      return _primitives.Ref.get(this._newRefNum++, 0);\n    },\n    resetNewRef: function XRef_resetNewRef() {\n      this._newRefNum = null;\n    },\n    setStartXRef: function XRef_setStartXRef(startXRef) {\n      this.startXRefQueue = [startXRef];\n    },\n    parse: function XRef_parse(recoveryMode) {\n      var trailerDict;\n\n      if (!recoveryMode) {\n        trailerDict = this.readXRef();\n      } else {\n        (0, _util.warn)(\"Indexing all PDF objects\");\n        trailerDict = this.indexObjects();\n      }\n\n      trailerDict.assignXref(this);\n      this.trailer = trailerDict;\n      let encrypt;\n\n      try {\n        encrypt = trailerDict.get(\"Encrypt\");\n      } catch (ex) {\n        if (ex instanceof _core_utils.MissingDataException) {\n          throw ex;\n        }\n\n        (0, _util.warn)(`XRef.parse - Invalid \"Encrypt\" reference: \"${ex}\".`);\n      }\n\n      if ((0, _primitives.isDict)(encrypt)) {\n        var ids = trailerDict.get(\"ID\");\n        var fileId = ids && ids.length ? ids[0] : \"\";\n        encrypt.suppressEncryption = true;\n        this.encrypt = new _crypto.CipherTransformFactory(encrypt, fileId, this.pdfManager.password);\n      }\n\n      let root;\n\n      try {\n        root = trailerDict.get(\"Root\");\n      } catch (ex) {\n        if (ex instanceof _core_utils.MissingDataException) {\n          throw ex;\n        }\n\n        (0, _util.warn)(`XRef.parse - Invalid \"Root\" reference: \"${ex}\".`);\n      }\n\n      if ((0, _primitives.isDict)(root) && root.has(\"Pages\")) {\n        this.root = root;\n      } else {\n        if (!recoveryMode) {\n          throw new _core_utils.XRefParseException();\n        }\n\n        throw new _util.FormatError(\"Invalid root reference\");\n      }\n    },\n    processXRefTable: function XRef_processXRefTable(parser) {\n      if (!(\"tableState\" in this)) {\n        this.tableState = {\n          entryNum: 0,\n          streamPos: parser.lexer.stream.pos,\n          parserBuf1: parser.buf1,\n          parserBuf2: parser.buf2\n        };\n      }\n\n      var obj = this.readXRefTable(parser);\n\n      if (!(0, _primitives.isCmd)(obj, \"trailer\")) {\n        throw new _util.FormatError(\"Invalid XRef table: could not find trailer dictionary\");\n      }\n\n      var dict = parser.getObj();\n\n      if (!(0, _primitives.isDict)(dict) && dict.dict) {\n        dict = dict.dict;\n      }\n\n      if (!(0, _primitives.isDict)(dict)) {\n        throw new _util.FormatError(\"Invalid XRef table: could not parse trailer dictionary\");\n      }\n\n      delete this.tableState;\n      return dict;\n    },\n    readXRefTable: function XRef_readXRefTable(parser) {\n      var stream = parser.lexer.stream;\n      var tableState = this.tableState;\n      stream.pos = tableState.streamPos;\n      parser.buf1 = tableState.parserBuf1;\n      parser.buf2 = tableState.parserBuf2;\n      var obj;\n\n      while (true) {\n        if (!(\"firstEntryNum\" in tableState) || !(\"entryCount\" in tableState)) {\n          if ((0, _primitives.isCmd)(obj = parser.getObj(), \"trailer\")) {\n            break;\n          }\n\n          tableState.firstEntryNum = obj;\n          tableState.entryCount = parser.getObj();\n        }\n\n        var first = tableState.firstEntryNum;\n        var count = tableState.entryCount;\n\n        if (!Number.isInteger(first) || !Number.isInteger(count)) {\n          throw new _util.FormatError(\"Invalid XRef table: wrong types in subsection header\");\n        }\n\n        for (var i = tableState.entryNum; i < count; i++) {\n          tableState.streamPos = stream.pos;\n          tableState.entryNum = i;\n          tableState.parserBuf1 = parser.buf1;\n          tableState.parserBuf2 = parser.buf2;\n          var entry = {};\n          entry.offset = parser.getObj();\n          entry.gen = parser.getObj();\n          var type = parser.getObj();\n\n          if (type instanceof _primitives.Cmd) {\n            switch (type.cmd) {\n              case \"f\":\n                entry.free = true;\n                break;\n\n              case \"n\":\n                entry.uncompressed = true;\n                break;\n            }\n          }\n\n          if (!Number.isInteger(entry.offset) || !Number.isInteger(entry.gen) || !(entry.free || entry.uncompressed)) {\n            throw new _util.FormatError(`Invalid entry in XRef subsection: ${first}, ${count}`);\n          }\n\n          if (i === 0 && entry.free && first === 1) {\n            first = 0;\n          }\n\n          if (!this.entries[i + first]) {\n            this.entries[i + first] = entry;\n          }\n        }\n\n        tableState.entryNum = 0;\n        tableState.streamPos = stream.pos;\n        tableState.parserBuf1 = parser.buf1;\n        tableState.parserBuf2 = parser.buf2;\n        delete tableState.firstEntryNum;\n        delete tableState.entryCount;\n      }\n\n      if (this.entries[0] && !this.entries[0].free) {\n        throw new _util.FormatError(\"Invalid XRef table: unexpected first object\");\n      }\n\n      return obj;\n    },\n    processXRefStream: function XRef_processXRefStream(stream) {\n      if (!(\"streamState\" in this)) {\n        var streamParameters = stream.dict;\n        var byteWidths = streamParameters.get(\"W\");\n        var range = streamParameters.get(\"Index\");\n\n        if (!range) {\n          range = [0, streamParameters.get(\"Size\")];\n        }\n\n        this.streamState = {\n          entryRanges: range,\n          byteWidths,\n          entryNum: 0,\n          streamPos: stream.pos\n        };\n      }\n\n      this.readXRefStream(stream);\n      delete this.streamState;\n      return stream.dict;\n    },\n    readXRefStream: function XRef_readXRefStream(stream) {\n      var i, j;\n      var streamState = this.streamState;\n      stream.pos = streamState.streamPos;\n      var byteWidths = streamState.byteWidths;\n      var typeFieldWidth = byteWidths[0];\n      var offsetFieldWidth = byteWidths[1];\n      var generationFieldWidth = byteWidths[2];\n      var entryRanges = streamState.entryRanges;\n\n      while (entryRanges.length > 0) {\n        var first = entryRanges[0];\n        var n = entryRanges[1];\n\n        if (!Number.isInteger(first) || !Number.isInteger(n)) {\n          throw new _util.FormatError(`Invalid XRef range fields: ${first}, ${n}`);\n        }\n\n        if (!Number.isInteger(typeFieldWidth) || !Number.isInteger(offsetFieldWidth) || !Number.isInteger(generationFieldWidth)) {\n          throw new _util.FormatError(`Invalid XRef entry fields length: ${first}, ${n}`);\n        }\n\n        for (i = streamState.entryNum; i < n; ++i) {\n          streamState.entryNum = i;\n          streamState.streamPos = stream.pos;\n          var type = 0,\n              offset = 0,\n              generation = 0;\n\n          for (j = 0; j < typeFieldWidth; ++j) {\n            type = type << 8 | stream.getByte();\n          }\n\n          if (typeFieldWidth === 0) {\n            type = 1;\n          }\n\n          for (j = 0; j < offsetFieldWidth; ++j) {\n            offset = offset << 8 | stream.getByte();\n          }\n\n          for (j = 0; j < generationFieldWidth; ++j) {\n            generation = generation << 8 | stream.getByte();\n          }\n\n          var entry = {};\n          entry.offset = offset;\n          entry.gen = generation;\n\n          switch (type) {\n            case 0:\n              entry.free = true;\n              break;\n\n            case 1:\n              entry.uncompressed = true;\n              break;\n\n            case 2:\n              break;\n\n            default:\n              throw new _util.FormatError(`Invalid XRef entry type: ${type}`);\n          }\n\n          if (!this.entries[first + i]) {\n            this.entries[first + i] = entry;\n          }\n        }\n\n        streamState.entryNum = 0;\n        streamState.streamPos = stream.pos;\n        entryRanges.splice(0, 2);\n      }\n    },\n    indexObjects: function XRef_indexObjects() {\n      var TAB = 0x9,\n          LF = 0xa,\n          CR = 0xd,\n          SPACE = 0x20;\n      var PERCENT = 0x25,\n          LT = 0x3c;\n\n      function readToken(data, offset) {\n        var token = \"\",\n            ch = data[offset];\n\n        while (ch !== LF && ch !== CR && ch !== LT) {\n          if (++offset >= data.length) {\n            break;\n          }\n\n          token += String.fromCharCode(ch);\n          ch = data[offset];\n        }\n\n        return token;\n      }\n\n      function skipUntil(data, offset, what) {\n        var length = what.length,\n            dataLength = data.length;\n        var skipped = 0;\n\n        while (offset < dataLength) {\n          var i = 0;\n\n          while (i < length && data[offset + i] === what[i]) {\n            ++i;\n          }\n\n          if (i >= length) {\n            break;\n          }\n\n          offset++;\n          skipped++;\n        }\n\n        return skipped;\n      }\n\n      var objRegExp = /^(\\d+)\\s+(\\d+)\\s+obj\\b/;\n      const endobjRegExp = /\\bendobj[\\b\\s]$/;\n      const nestedObjRegExp = /\\s+(\\d+\\s+\\d+\\s+obj[\\b\\s<])$/;\n      const CHECK_CONTENT_LENGTH = 25;\n      var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);\n      var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114, 101, 102]);\n      const objBytes = new Uint8Array([111, 98, 106]);\n      var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);\n      this.entries.length = 0;\n      var stream = this.stream;\n      stream.pos = 0;\n      var buffer = stream.getBytes();\n      var position = stream.start,\n          length = buffer.length;\n      var trailers = [],\n          xrefStms = [];\n\n      while (position < length) {\n        var ch = buffer[position];\n\n        if (ch === TAB || ch === LF || ch === CR || ch === SPACE) {\n          ++position;\n          continue;\n        }\n\n        if (ch === PERCENT) {\n          do {\n            ++position;\n\n            if (position >= length) {\n              break;\n            }\n\n            ch = buffer[position];\n          } while (ch !== LF && ch !== CR);\n\n          continue;\n        }\n\n        var token = readToken(buffer, position);\n        var m;\n\n        if (token.startsWith(\"xref\") && (token.length === 4 || /\\s/.test(token[4]))) {\n          position += skipUntil(buffer, position, trailerBytes);\n          trailers.push(position);\n          position += skipUntil(buffer, position, startxrefBytes);\n        } else if (m = objRegExp.exec(token)) {\n          const num = m[1] | 0,\n                gen = m[2] | 0;\n\n          if (!this.entries[num] || this.entries[num].gen === gen) {\n            this.entries[num] = {\n              offset: position - stream.start,\n              gen,\n              uncompressed: true\n            };\n          }\n\n          let contentLength,\n              startPos = position + token.length;\n\n          while (startPos < buffer.length) {\n            const endPos = startPos + skipUntil(buffer, startPos, objBytes) + 4;\n            contentLength = endPos - position;\n            const checkPos = Math.max(endPos - CHECK_CONTENT_LENGTH, startPos);\n            const tokenStr = (0, _util.bytesToString)(buffer.subarray(checkPos, endPos));\n\n            if (endobjRegExp.test(tokenStr)) {\n              break;\n            } else {\n              const objToken = nestedObjRegExp.exec(tokenStr);\n\n              if (objToken && objToken[1]) {\n                (0, _util.warn)('indexObjects: Found new \"obj\" inside of another \"obj\", ' + 'caused by missing \"endobj\" -- trying to recover.');\n                contentLength -= objToken[1].length;\n                break;\n              }\n            }\n\n            startPos = endPos;\n          }\n\n          const content = buffer.subarray(position, position + contentLength);\n          var xrefTagOffset = skipUntil(content, 0, xrefBytes);\n\n          if (xrefTagOffset < contentLength && content[xrefTagOffset + 5] < 64) {\n            xrefStms.push(position - stream.start);\n            this.xrefstms[position - stream.start] = 1;\n          }\n\n          position += contentLength;\n        } else if (token.startsWith(\"trailer\") && (token.length === 7 || /\\s/.test(token[7]))) {\n          trailers.push(position);\n          position += skipUntil(buffer, position, startxrefBytes);\n        } else {\n          position += token.length + 1;\n        }\n      }\n\n      for (let i = 0, ii = xrefStms.length; i < ii; ++i) {\n        this.startXRefQueue.push(xrefStms[i]);\n        this.readXRef(true);\n      }\n\n      let trailerDict;\n\n      for (let i = 0, ii = trailers.length; i < ii; ++i) {\n        stream.pos = trailers[i];\n        const parser = new _parser.Parser({\n          lexer: new _parser.Lexer(stream),\n          xref: this,\n          allowStreams: true,\n          recoveryMode: true\n        });\n        var obj = parser.getObj();\n\n        if (!(0, _primitives.isCmd)(obj, \"trailer\")) {\n          continue;\n        }\n\n        const dict = parser.getObj();\n\n        if (!(0, _primitives.isDict)(dict)) {\n          continue;\n        }\n\n        try {\n          const rootDict = dict.get(\"Root\");\n\n          if (!(rootDict instanceof _primitives.Dict)) {\n            continue;\n          }\n\n          const pagesDict = rootDict.get(\"Pages\");\n\n          if (!(pagesDict instanceof _primitives.Dict)) {\n            continue;\n          }\n\n          const pagesCount = pagesDict.get(\"Count\");\n\n          if (!Number.isInteger(pagesCount)) {\n            continue;\n          }\n        } catch (ex) {\n          continue;\n        }\n\n        if (dict.has(\"ID\")) {\n          return dict;\n        }\n\n        trailerDict = dict;\n      }\n\n      if (trailerDict) {\n        return trailerDict;\n      }\n\n      throw new _util.InvalidPDFException(\"Invalid PDF structure.\");\n    },\n    readXRef: function XRef_readXRef(recoveryMode) {\n      var stream = this.stream;\n      const startXRefParsedCache = Object.create(null);\n\n      try {\n        while (this.startXRefQueue.length) {\n          var startXRef = this.startXRefQueue[0];\n\n          if (startXRefParsedCache[startXRef]) {\n            (0, _util.warn)(\"readXRef - skipping XRef table since it was already parsed.\");\n            this.startXRefQueue.shift();\n            continue;\n          }\n\n          startXRefParsedCache[startXRef] = true;\n          stream.pos = startXRef + stream.start;\n          const parser = new _parser.Parser({\n            lexer: new _parser.Lexer(stream),\n            xref: this,\n            allowStreams: true\n          });\n          var obj = parser.getObj();\n          var dict;\n\n          if ((0, _primitives.isCmd)(obj, \"xref\")) {\n            dict = this.processXRefTable(parser);\n\n            if (!this.topDict) {\n              this.topDict = dict;\n            }\n\n            obj = dict.get(\"XRefStm\");\n\n            if (Number.isInteger(obj)) {\n              var pos = obj;\n\n              if (!(pos in this.xrefstms)) {\n                this.xrefstms[pos] = 1;\n                this.startXRefQueue.push(pos);\n              }\n            }\n          } else if (Number.isInteger(obj)) {\n            if (!Number.isInteger(parser.getObj()) || !(0, _primitives.isCmd)(parser.getObj(), \"obj\") || !(0, _primitives.isStream)(obj = parser.getObj())) {\n              throw new _util.FormatError(\"Invalid XRef stream\");\n            }\n\n            dict = this.processXRefStream(obj);\n\n            if (!this.topDict) {\n              this.topDict = dict;\n            }\n\n            if (!dict) {\n              throw new _util.FormatError(\"Failed to read XRef stream\");\n            }\n          } else {\n            throw new _util.FormatError(\"Invalid XRef stream header\");\n          }\n\n          obj = dict.get(\"Prev\");\n\n          if (Number.isInteger(obj)) {\n            this.startXRefQueue.push(obj);\n          } else if ((0, _primitives.isRef)(obj)) {\n            this.startXRefQueue.push(obj.num);\n          }\n\n          this.startXRefQueue.shift();\n        }\n\n        return this.topDict;\n      } catch (e) {\n        if (e instanceof _core_utils.MissingDataException) {\n          throw e;\n        }\n\n        (0, _util.info)(\"(while reading XRef): \" + e);\n      }\n\n      if (recoveryMode) {\n        return undefined;\n      }\n\n      throw new _core_utils.XRefParseException();\n    },\n    getEntry: function XRef_getEntry(i) {\n      var xrefEntry = this.entries[i];\n\n      if (xrefEntry && !xrefEntry.free && xrefEntry.offset) {\n        return xrefEntry;\n      }\n\n      return null;\n    },\n    fetchIfRef: function XRef_fetchIfRef(obj, suppressEncryption) {\n      if (obj instanceof _primitives.Ref) {\n        return this.fetch(obj, suppressEncryption);\n      }\n\n      return obj;\n    },\n    fetch: function XRef_fetch(ref, suppressEncryption) {\n      if (!(ref instanceof _primitives.Ref)) {\n        throw new Error(\"ref object is not a reference\");\n      }\n\n      const num = ref.num;\n\n      const cacheEntry = this._cacheMap.get(num);\n\n      if (cacheEntry !== undefined) {\n        if (cacheEntry instanceof _primitives.Dict && !cacheEntry.objId) {\n          cacheEntry.objId = ref.toString();\n        }\n\n        return cacheEntry;\n      }\n\n      let xrefEntry = this.getEntry(num);\n\n      if (xrefEntry === null) {\n        this._cacheMap.set(num, xrefEntry);\n\n        return xrefEntry;\n      }\n\n      if (xrefEntry.uncompressed) {\n        xrefEntry = this.fetchUncompressed(ref, xrefEntry, suppressEncryption);\n      } else {\n        xrefEntry = this.fetchCompressed(ref, xrefEntry, suppressEncryption);\n      }\n\n      if ((0, _primitives.isDict)(xrefEntry)) {\n        xrefEntry.objId = ref.toString();\n      } else if ((0, _primitives.isStream)(xrefEntry)) {\n        xrefEntry.dict.objId = ref.toString();\n      }\n\n      return xrefEntry;\n    },\n\n    fetchUncompressed(ref, xrefEntry, suppressEncryption = false) {\n      var gen = ref.gen;\n      var num = ref.num;\n\n      if (xrefEntry.gen !== gen) {\n        throw new _core_utils.XRefEntryException(`Inconsistent generation in XRef: ${ref}`);\n      }\n\n      var stream = this.stream.makeSubStream(xrefEntry.offset + this.stream.start);\n      const parser = new _parser.Parser({\n        lexer: new _parser.Lexer(stream),\n        xref: this,\n        allowStreams: true\n      });\n      var obj1 = parser.getObj();\n      var obj2 = parser.getObj();\n      var obj3 = parser.getObj();\n\n      if (obj1 !== num || obj2 !== gen || !(obj3 instanceof _primitives.Cmd)) {\n        throw new _core_utils.XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`);\n      }\n\n      if (obj3.cmd !== \"obj\") {\n        if (obj3.cmd.startsWith(\"obj\")) {\n          num = parseInt(obj3.cmd.substring(3), 10);\n\n          if (!Number.isNaN(num)) {\n            return num;\n          }\n        }\n\n        throw new _core_utils.XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`);\n      }\n\n      if (this.encrypt && !suppressEncryption) {\n        xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, gen));\n      } else {\n        xrefEntry = parser.getObj();\n      }\n\n      if (!(0, _primitives.isStream)(xrefEntry)) {\n        this._cacheMap.set(num, xrefEntry);\n      }\n\n      return xrefEntry;\n    },\n\n    fetchCompressed(ref, xrefEntry, suppressEncryption = false) {\n      const tableOffset = xrefEntry.offset;\n      const stream = this.fetch(_primitives.Ref.get(tableOffset, 0));\n\n      if (!(0, _primitives.isStream)(stream)) {\n        throw new _util.FormatError(\"bad ObjStm stream\");\n      }\n\n      const first = stream.dict.get(\"First\");\n      const n = stream.dict.get(\"N\");\n\n      if (!Number.isInteger(first) || !Number.isInteger(n)) {\n        throw new _util.FormatError(\"invalid first and n parameters for ObjStm stream\");\n      }\n\n      let parser = new _parser.Parser({\n        lexer: new _parser.Lexer(stream),\n        xref: this,\n        allowStreams: true\n      });\n      const nums = new Array(n);\n      const offsets = new Array(n);\n\n      for (let i = 0; i < n; ++i) {\n        const num = parser.getObj();\n\n        if (!Number.isInteger(num)) {\n          throw new _util.FormatError(`invalid object number in the ObjStm stream: ${num}`);\n        }\n\n        const offset = parser.getObj();\n\n        if (!Number.isInteger(offset)) {\n          throw new _util.FormatError(`invalid object offset in the ObjStm stream: ${offset}`);\n        }\n\n        nums[i] = num;\n        offsets[i] = offset;\n      }\n\n      const start = (stream.start || 0) + first;\n      const entries = new Array(n);\n\n      for (let i = 0; i < n; ++i) {\n        const length = i < n - 1 ? offsets[i + 1] - offsets[i] : undefined;\n\n        if (length < 0) {\n          throw new _util.FormatError(\"Invalid offset in the ObjStm stream.\");\n        }\n\n        parser = new _parser.Parser({\n          lexer: new _parser.Lexer(stream.makeSubStream(start + offsets[i], length, stream.dict)),\n          xref: this,\n          allowStreams: true\n        });\n        const obj = parser.getObj();\n        entries[i] = obj;\n\n        if ((0, _primitives.isStream)(obj)) {\n          continue;\n        }\n\n        const num = nums[i],\n              entry = this.entries[num];\n\n        if (entry && entry.offset === tableOffset && entry.gen === i) {\n          this._cacheMap.set(num, obj);\n        }\n      }\n\n      xrefEntry = entries[xrefEntry.gen];\n\n      if (xrefEntry === undefined) {\n        throw new _core_utils.XRefEntryException(`Bad (compressed) XRef entry: ${ref}`);\n      }\n\n      return xrefEntry;\n    },\n\n    async fetchIfRefAsync(obj, suppressEncryption) {\n      if (obj instanceof _primitives.Ref) {\n        return this.fetchAsync(obj, suppressEncryption);\n      }\n\n      return obj;\n    },\n\n    async fetchAsync(ref, suppressEncryption) {\n      try {\n        return this.fetch(ref, suppressEncryption);\n      } catch (ex) {\n        if (!(ex instanceof _core_utils.MissingDataException)) {\n          throw ex;\n        }\n\n        await this.pdfManager.requestRange(ex.begin, ex.end);\n        return this.fetchAsync(ref, suppressEncryption);\n      }\n    },\n\n    getCatalogObj: function XRef_getCatalogObj() {\n      return this.root;\n    }\n  };\n  return XRef;\n}();\n\nexports.XRef = XRef;\n\nclass NameOrNumberTree {\n  constructor(root, xref, type) {\n    if (this.constructor === NameOrNumberTree) {\n      (0, _util.unreachable)(\"Cannot initialize NameOrNumberTree.\");\n    }\n\n    this.root = root;\n    this.xref = xref;\n    this._type = type;\n  }\n\n  getAll() {\n    const dict = Object.create(null);\n\n    if (!this.root) {\n      return dict;\n    }\n\n    const xref = this.xref;\n    const processed = new _primitives.RefSet();\n    processed.put(this.root);\n    const queue = [this.root];\n\n    while (queue.length > 0) {\n      const obj = xref.fetchIfRef(queue.shift());\n\n      if (!(0, _primitives.isDict)(obj)) {\n        continue;\n      }\n\n      if (obj.has(\"Kids\")) {\n        const kids = obj.get(\"Kids\");\n\n        for (let i = 0, ii = kids.length; i < ii; i++) {\n          const kid = kids[i];\n\n          if (processed.has(kid)) {\n            throw new _util.FormatError(`Duplicate entry in \"${this._type}\" tree.`);\n          }\n\n          queue.push(kid);\n          processed.put(kid);\n        }\n\n        continue;\n      }\n\n      const entries = obj.get(this._type);\n\n      if (Array.isArray(entries)) {\n        for (let i = 0, ii = entries.length; i < ii; i += 2) {\n          dict[xref.fetchIfRef(entries[i])] = xref.fetchIfRef(entries[i + 1]);\n        }\n      }\n    }\n\n    return dict;\n  }\n\n  get(key) {\n    if (!this.root) {\n      return null;\n    }\n\n    const xref = this.xref;\n    let kidsOrEntries = xref.fetchIfRef(this.root);\n    let loopCount = 0;\n    const MAX_LEVELS = 10;\n\n    while (kidsOrEntries.has(\"Kids\")) {\n      if (++loopCount > MAX_LEVELS) {\n        (0, _util.warn)(`Search depth limit reached for \"${this._type}\" tree.`);\n        return null;\n      }\n\n      const kids = kidsOrEntries.get(\"Kids\");\n\n      if (!Array.isArray(kids)) {\n        return null;\n      }\n\n      let l = 0,\n          r = kids.length - 1;\n\n      while (l <= r) {\n        const m = l + r >> 1;\n        const kid = xref.fetchIfRef(kids[m]);\n        const limits = kid.get(\"Limits\");\n\n        if (key < xref.fetchIfRef(limits[0])) {\n          r = m - 1;\n        } else if (key > xref.fetchIfRef(limits[1])) {\n          l = m + 1;\n        } else {\n          kidsOrEntries = xref.fetchIfRef(kids[m]);\n          break;\n        }\n      }\n\n      if (l > r) {\n        return null;\n      }\n    }\n\n    const entries = kidsOrEntries.get(this._type);\n\n    if (Array.isArray(entries)) {\n      let l = 0,\n          r = entries.length - 2;\n\n      while (l <= r) {\n        const tmp = l + r >> 1,\n              m = tmp + (tmp & 1);\n        const currentKey = xref.fetchIfRef(entries[m]);\n\n        if (key < currentKey) {\n          r = m - 2;\n        } else if (key > currentKey) {\n          l = m + 2;\n        } else {\n          return xref.fetchIfRef(entries[m + 1]);\n        }\n      }\n\n      (0, _util.info)(`Falling back to an exhaustive search, for key \"${key}\", ` + `in \"${this._type}\" tree.`);\n\n      for (let m = 0, mm = entries.length; m < mm; m += 2) {\n        const currentKey = xref.fetchIfRef(entries[m]);\n\n        if (currentKey === key) {\n          (0, _util.warn)(`The \"${key}\" key was found at an incorrect, ` + `i.e. out-of-order, position in \"${this._type}\" tree.`);\n          return xref.fetchIfRef(entries[m + 1]);\n        }\n      }\n    }\n\n    return null;\n  }\n\n}\n\nclass NameTree extends NameOrNumberTree {\n  constructor(root, xref) {\n    super(root, xref, \"Names\");\n  }\n\n}\n\nclass NumberTree extends NameOrNumberTree {\n  constructor(root, xref) {\n    super(root, xref, \"Nums\");\n  }\n\n}\n\nvar FileSpec = function FileSpecClosure() {\n  function FileSpec(root, xref) {\n    if (!root || !(0, _primitives.isDict)(root)) {\n      return;\n    }\n\n    this.xref = xref;\n    this.root = root;\n\n    if (root.has(\"FS\")) {\n      this.fs = root.get(\"FS\");\n    }\n\n    this.description = root.has(\"Desc\") ? (0, _util.stringToPDFString)(root.get(\"Desc\")) : \"\";\n\n    if (root.has(\"RF\")) {\n      (0, _util.warn)(\"Related file specifications are not supported\");\n    }\n\n    this.contentAvailable = true;\n\n    if (!root.has(\"EF\")) {\n      this.contentAvailable = false;\n      (0, _util.warn)(\"Non-embedded file specifications are not supported\");\n    }\n  }\n\n  function pickPlatformItem(dict) {\n    if (dict.has(\"UF\")) {\n      return dict.get(\"UF\");\n    } else if (dict.has(\"F\")) {\n      return dict.get(\"F\");\n    } else if (dict.has(\"Unix\")) {\n      return dict.get(\"Unix\");\n    } else if (dict.has(\"Mac\")) {\n      return dict.get(\"Mac\");\n    } else if (dict.has(\"DOS\")) {\n      return dict.get(\"DOS\");\n    }\n\n    return null;\n  }\n\n  FileSpec.prototype = {\n    get filename() {\n      if (!this._filename && this.root) {\n        var filename = pickPlatformItem(this.root) || \"unnamed\";\n        this._filename = (0, _util.stringToPDFString)(filename).replace(/\\\\\\\\/g, \"\\\\\").replace(/\\\\\\//g, \"/\").replace(/\\\\/g, \"/\");\n      }\n\n      return this._filename;\n    },\n\n    get content() {\n      if (!this.contentAvailable) {\n        return null;\n      }\n\n      if (!this.contentRef && this.root) {\n        this.contentRef = pickPlatformItem(this.root.get(\"EF\"));\n      }\n\n      var content = null;\n\n      if (this.contentRef) {\n        var xref = this.xref;\n        var fileObj = xref.fetchIfRef(this.contentRef);\n\n        if (fileObj && (0, _primitives.isStream)(fileObj)) {\n          content = fileObj.getBytes();\n        } else {\n          (0, _util.warn)(\"Embedded file specification points to non-existing/invalid \" + \"content\");\n        }\n      } else {\n        (0, _util.warn)(\"Embedded file specification does not have a content\");\n      }\n\n      return content;\n    },\n\n    get serializable() {\n      return {\n        filename: this.filename,\n        content: this.content\n      };\n    }\n\n  };\n  return FileSpec;\n}();\n\nexports.FileSpec = FileSpec;\n\nconst ObjectLoader = function () {\n  function mayHaveChildren(value) {\n    return value instanceof _primitives.Ref || value instanceof _primitives.Dict || Array.isArray(value) || (0, _primitives.isStream)(value);\n  }\n\n  function addChildren(node, nodesToVisit) {\n    if (node instanceof _primitives.Dict) {\n      node = node.getRawValues();\n    } else if ((0, _primitives.isStream)(node)) {\n      node = node.dict.getRawValues();\n    } else if (!Array.isArray(node)) {\n      return;\n    }\n\n    for (const rawValue of node) {\n      if (mayHaveChildren(rawValue)) {\n        nodesToVisit.push(rawValue);\n      }\n    }\n  }\n\n  function ObjectLoader(dict, keys, xref) {\n    this.dict = dict;\n    this.keys = keys;\n    this.xref = xref;\n    this.refSet = null;\n  }\n\n  ObjectLoader.prototype = {\n    async load() {\n      if (!this.xref.stream.allChunksLoaded || this.xref.stream.allChunksLoaded()) {\n        return undefined;\n      }\n\n      const {\n        keys,\n        dict\n      } = this;\n      this.refSet = new _primitives.RefSet();\n      const nodesToVisit = [];\n\n      for (let i = 0, ii = keys.length; i < ii; i++) {\n        const rawValue = dict.getRaw(keys[i]);\n\n        if (rawValue !== undefined) {\n          nodesToVisit.push(rawValue);\n        }\n      }\n\n      return this._walk(nodesToVisit);\n    },\n\n    async _walk(nodesToVisit) {\n      const nodesToRevisit = [];\n      const pendingRequests = [];\n\n      while (nodesToVisit.length) {\n        let currentNode = nodesToVisit.pop();\n\n        if (currentNode instanceof _primitives.Ref) {\n          if (this.refSet.has(currentNode)) {\n            continue;\n          }\n\n          try {\n            this.refSet.put(currentNode);\n            currentNode = this.xref.fetch(currentNode);\n          } catch (ex) {\n            if (!(ex instanceof _core_utils.MissingDataException)) {\n              (0, _util.warn)(`ObjectLoader._walk - requesting all data: \"${ex}\".`);\n              this.refSet = null;\n              const {\n                manager\n              } = this.xref.stream;\n              return manager.requestAllChunks();\n            }\n\n            nodesToRevisit.push(currentNode);\n            pendingRequests.push({\n              begin: ex.begin,\n              end: ex.end\n            });\n          }\n        }\n\n        if (currentNode && currentNode.getBaseStreams) {\n          const baseStreams = currentNode.getBaseStreams();\n          let foundMissingData = false;\n\n          for (let i = 0, ii = baseStreams.length; i < ii; i++) {\n            const stream = baseStreams[i];\n\n            if (stream.allChunksLoaded && !stream.allChunksLoaded()) {\n              foundMissingData = true;\n              pendingRequests.push({\n                begin: stream.start,\n                end: stream.end\n              });\n            }\n          }\n\n          if (foundMissingData) {\n            nodesToRevisit.push(currentNode);\n          }\n        }\n\n        addChildren(currentNode, nodesToVisit);\n      }\n\n      if (pendingRequests.length) {\n        await this.xref.stream.manager.requestRanges(pendingRequests);\n\n        for (let i = 0, ii = nodesToRevisit.length; i < ii; i++) {\n          const node = nodesToRevisit[i];\n\n          if (node instanceof _primitives.Ref) {\n            this.refSet.remove(node);\n          }\n        }\n\n        return this._walk(nodesToRevisit);\n      }\n\n      this.refSet = null;\n      return undefined;\n    }\n\n  };\n  return ObjectLoader;\n}();\n\nexports.ObjectLoader = ObjectLoader;\n\n/***/ }),\n/* 11 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.Parser = exports.Linearization = exports.Lexer = void 0;\n\nvar _stream = __w_pdfjs_require__(12);\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _primitives = __w_pdfjs_require__(5);\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nvar _ccitt_stream = __w_pdfjs_require__(13);\n\nvar _jbig2_stream = __w_pdfjs_require__(15);\n\nvar _jpeg_stream = __w_pdfjs_require__(18);\n\nvar _jpx_stream = __w_pdfjs_require__(20);\n\nconst MAX_LENGTH_TO_CACHE = 1000;\nconst MAX_ADLER32_LENGTH = 5552;\n\nfunction computeAdler32(bytes) {\n  const bytesLength = bytes.length;\n  let a = 1,\n      b = 0;\n\n  for (let i = 0; i < bytesLength; ++i) {\n    a += bytes[i] & 0xff;\n    b += a;\n  }\n\n  return b % 65521 << 16 | a % 65521;\n}\n\nclass Parser {\n  constructor({\n    lexer,\n    xref,\n    allowStreams = false,\n    recoveryMode = false\n  }) {\n    this.lexer = lexer;\n    this.xref = xref;\n    this.allowStreams = allowStreams;\n    this.recoveryMode = recoveryMode;\n    this.imageCache = Object.create(null);\n    this.refill();\n  }\n\n  refill() {\n    this.buf1 = this.lexer.getObj();\n    this.buf2 = this.lexer.getObj();\n  }\n\n  shift() {\n    if (this.buf2 instanceof _primitives.Cmd && this.buf2.cmd === \"ID\") {\n      this.buf1 = this.buf2;\n      this.buf2 = null;\n    } else {\n      this.buf1 = this.buf2;\n      this.buf2 = this.lexer.getObj();\n    }\n  }\n\n  tryShift() {\n    try {\n      this.shift();\n      return true;\n    } catch (e) {\n      if (e instanceof _core_utils.MissingDataException) {\n        throw e;\n      }\n\n      return false;\n    }\n  }\n\n  getObj(cipherTransform = null) {\n    const buf1 = this.buf1;\n    this.shift();\n\n    if (buf1 instanceof _primitives.Cmd) {\n      switch (buf1.cmd) {\n        case \"BI\":\n          return this.makeInlineImage(cipherTransform);\n\n        case \"[\":\n          const array = [];\n\n          while (!(0, _primitives.isCmd)(this.buf1, \"]\") && !(0, _primitives.isEOF)(this.buf1)) {\n            array.push(this.getObj(cipherTransform));\n          }\n\n          if ((0, _primitives.isEOF)(this.buf1)) {\n            if (!this.recoveryMode) {\n              throw new _util.FormatError(\"End of file inside array\");\n            }\n\n            return array;\n          }\n\n          this.shift();\n          return array;\n\n        case \"<<\":\n          const dict = new _primitives.Dict(this.xref);\n\n          while (!(0, _primitives.isCmd)(this.buf1, \">>\") && !(0, _primitives.isEOF)(this.buf1)) {\n            if (!(0, _primitives.isName)(this.buf1)) {\n              (0, _util.info)(\"Malformed dictionary: key must be a name object\");\n              this.shift();\n              continue;\n            }\n\n            const key = this.buf1.name;\n            this.shift();\n\n            if ((0, _primitives.isEOF)(this.buf1)) {\n              break;\n            }\n\n            dict.set(key, this.getObj(cipherTransform));\n          }\n\n          if ((0, _primitives.isEOF)(this.buf1)) {\n            if (!this.recoveryMode) {\n              throw new _util.FormatError(\"End of file inside dictionary\");\n            }\n\n            return dict;\n          }\n\n          if ((0, _primitives.isCmd)(this.buf2, \"stream\")) {\n            return this.allowStreams ? this.makeStream(dict, cipherTransform) : dict;\n          }\n\n          this.shift();\n          return dict;\n\n        default:\n          return buf1;\n      }\n    }\n\n    if (Number.isInteger(buf1)) {\n      if (Number.isInteger(this.buf1) && (0, _primitives.isCmd)(this.buf2, \"R\")) {\n        const ref = _primitives.Ref.get(buf1, this.buf1);\n\n        this.shift();\n        this.shift();\n        return ref;\n      }\n\n      return buf1;\n    }\n\n    if (typeof buf1 === \"string\") {\n      if (cipherTransform) {\n        return cipherTransform.decryptString(buf1);\n      }\n\n      return buf1;\n    }\n\n    return buf1;\n  }\n\n  findDefaultInlineStreamEnd(stream) {\n    const E = 0x45,\n          I = 0x49,\n          SPACE = 0x20,\n          LF = 0xa,\n          CR = 0xd,\n          NUL = 0x0;\n    const lexer = this.lexer,\n          startPos = stream.pos,\n          n = 10;\n    let state = 0,\n        ch,\n        maybeEIPos;\n\n    while ((ch = stream.getByte()) !== -1) {\n      if (state === 0) {\n        state = ch === E ? 1 : 0;\n      } else if (state === 1) {\n        state = ch === I ? 2 : 0;\n      } else {\n        (0, _util.assert)(state === 2, \"findDefaultInlineStreamEnd - invalid state.\");\n\n        if (ch === SPACE || ch === LF || ch === CR) {\n          maybeEIPos = stream.pos;\n          const followingBytes = stream.peekBytes(n);\n\n          for (let i = 0, ii = followingBytes.length; i < ii; i++) {\n            ch = followingBytes[i];\n\n            if (ch === NUL && followingBytes[i + 1] !== NUL) {\n              continue;\n            }\n\n            if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7f)) {\n              state = 0;\n              break;\n            }\n          }\n\n          if (state !== 2) {\n            continue;\n          }\n\n          if (lexer.knownCommands) {\n            const nextObj = lexer.peekObj();\n\n            if (nextObj instanceof _primitives.Cmd && !lexer.knownCommands[nextObj.cmd]) {\n              state = 0;\n            }\n          } else {\n            (0, _util.warn)(\"findDefaultInlineStreamEnd - `lexer.knownCommands` is undefined.\");\n          }\n\n          if (state === 2) {\n            break;\n          }\n        } else {\n          state = 0;\n        }\n      }\n    }\n\n    if (ch === -1) {\n      (0, _util.warn)(\"findDefaultInlineStreamEnd: \" + \"Reached the end of the stream without finding a valid EI marker\");\n\n      if (maybeEIPos) {\n        (0, _util.warn)('... trying to recover by using the last \"EI\" occurrence.');\n        stream.skip(-(stream.pos - maybeEIPos));\n      }\n    }\n\n    let endOffset = 4;\n    stream.skip(-endOffset);\n    ch = stream.peekByte();\n    stream.skip(endOffset);\n\n    if (!(0, _core_utils.isWhiteSpace)(ch)) {\n      endOffset--;\n    }\n\n    return stream.pos - endOffset - startPos;\n  }\n\n  findDCTDecodeInlineStreamEnd(stream) {\n    const startPos = stream.pos;\n    let foundEOI = false,\n        b,\n        markerLength;\n\n    while ((b = stream.getByte()) !== -1) {\n      if (b !== 0xff) {\n        continue;\n      }\n\n      switch (stream.getByte()) {\n        case 0x00:\n          break;\n\n        case 0xff:\n          stream.skip(-1);\n          break;\n\n        case 0xd9:\n          foundEOI = true;\n          break;\n\n        case 0xc0:\n        case 0xc1:\n        case 0xc2:\n        case 0xc3:\n        case 0xc5:\n        case 0xc6:\n        case 0xc7:\n        case 0xc9:\n        case 0xca:\n        case 0xcb:\n        case 0xcd:\n        case 0xce:\n        case 0xcf:\n        case 0xc4:\n        case 0xcc:\n        case 0xda:\n        case 0xdb:\n        case 0xdc:\n        case 0xdd:\n        case 0xde:\n        case 0xdf:\n        case 0xe0:\n        case 0xe1:\n        case 0xe2:\n        case 0xe3:\n        case 0xe4:\n        case 0xe5:\n        case 0xe6:\n        case 0xe7:\n        case 0xe8:\n        case 0xe9:\n        case 0xea:\n        case 0xeb:\n        case 0xec:\n        case 0xed:\n        case 0xee:\n        case 0xef:\n        case 0xfe:\n          markerLength = stream.getUint16();\n\n          if (markerLength > 2) {\n            stream.skip(markerLength - 2);\n          } else {\n            stream.skip(-2);\n          }\n\n          break;\n      }\n\n      if (foundEOI) {\n        break;\n      }\n    }\n\n    const length = stream.pos - startPos;\n\n    if (b === -1) {\n      (0, _util.warn)(\"Inline DCTDecode image stream: \" + \"EOI marker not found, searching for /EI/ instead.\");\n      stream.skip(-length);\n      return this.findDefaultInlineStreamEnd(stream);\n    }\n\n    this.inlineStreamSkipEI(stream);\n    return length;\n  }\n\n  findASCII85DecodeInlineStreamEnd(stream) {\n    const TILDE = 0x7e,\n          GT = 0x3e;\n    const startPos = stream.pos;\n    let ch;\n\n    while ((ch = stream.getByte()) !== -1) {\n      if (ch === TILDE) {\n        const tildePos = stream.pos;\n        ch = stream.peekByte();\n\n        while ((0, _core_utils.isWhiteSpace)(ch)) {\n          stream.skip();\n          ch = stream.peekByte();\n        }\n\n        if (ch === GT) {\n          stream.skip();\n          break;\n        }\n\n        if (stream.pos > tildePos) {\n          const maybeEI = stream.peekBytes(2);\n\n          if (maybeEI[0] === 0x45 && maybeEI[1] === 0x49) {\n            break;\n          }\n        }\n      }\n    }\n\n    const length = stream.pos - startPos;\n\n    if (ch === -1) {\n      (0, _util.warn)(\"Inline ASCII85Decode image stream: \" + \"EOD marker not found, searching for /EI/ instead.\");\n      stream.skip(-length);\n      return this.findDefaultInlineStreamEnd(stream);\n    }\n\n    this.inlineStreamSkipEI(stream);\n    return length;\n  }\n\n  findASCIIHexDecodeInlineStreamEnd(stream) {\n    const GT = 0x3e;\n    const startPos = stream.pos;\n    let ch;\n\n    while ((ch = stream.getByte()) !== -1) {\n      if (ch === GT) {\n        break;\n      }\n    }\n\n    const length = stream.pos - startPos;\n\n    if (ch === -1) {\n      (0, _util.warn)(\"Inline ASCIIHexDecode image stream: \" + \"EOD marker not found, searching for /EI/ instead.\");\n      stream.skip(-length);\n      return this.findDefaultInlineStreamEnd(stream);\n    }\n\n    this.inlineStreamSkipEI(stream);\n    return length;\n  }\n\n  inlineStreamSkipEI(stream) {\n    const E = 0x45,\n          I = 0x49;\n    let state = 0,\n        ch;\n\n    while ((ch = stream.getByte()) !== -1) {\n      if (state === 0) {\n        state = ch === E ? 1 : 0;\n      } else if (state === 1) {\n        state = ch === I ? 2 : 0;\n      } else if (state === 2) {\n        break;\n      }\n    }\n  }\n\n  makeInlineImage(cipherTransform) {\n    const lexer = this.lexer;\n    const stream = lexer.stream;\n    const dict = new _primitives.Dict(this.xref);\n    let dictLength;\n\n    while (!(0, _primitives.isCmd)(this.buf1, \"ID\") && !(0, _primitives.isEOF)(this.buf1)) {\n      if (!(0, _primitives.isName)(this.buf1)) {\n        throw new _util.FormatError(\"Dictionary key must be a name object\");\n      }\n\n      const key = this.buf1.name;\n      this.shift();\n\n      if ((0, _primitives.isEOF)(this.buf1)) {\n        break;\n      }\n\n      dict.set(key, this.getObj(cipherTransform));\n    }\n\n    if (lexer.beginInlineImagePos !== -1) {\n      dictLength = stream.pos - lexer.beginInlineImagePos;\n    }\n\n    const filter = dict.get(\"Filter\", \"F\");\n    let filterName;\n\n    if ((0, _primitives.isName)(filter)) {\n      filterName = filter.name;\n    } else if (Array.isArray(filter)) {\n      const filterZero = this.xref.fetchIfRef(filter[0]);\n\n      if ((0, _primitives.isName)(filterZero)) {\n        filterName = filterZero.name;\n      }\n    }\n\n    const startPos = stream.pos;\n    let length;\n\n    if (filterName === \"DCTDecode\" || filterName === \"DCT\") {\n      length = this.findDCTDecodeInlineStreamEnd(stream);\n    } else if (filterName === \"ASCII85Decode\" || filterName === \"A85\") {\n      length = this.findASCII85DecodeInlineStreamEnd(stream);\n    } else if (filterName === \"ASCIIHexDecode\" || filterName === \"AHx\") {\n      length = this.findASCIIHexDecodeInlineStreamEnd(stream);\n    } else {\n      length = this.findDefaultInlineStreamEnd(stream);\n    }\n\n    let imageStream = stream.makeSubStream(startPos, length, dict);\n    let cacheKey;\n\n    if (length < MAX_LENGTH_TO_CACHE && dictLength < MAX_ADLER32_LENGTH) {\n      const imageBytes = imageStream.getBytes();\n      imageStream.reset();\n      const initialStreamPos = stream.pos;\n      stream.pos = lexer.beginInlineImagePos;\n      const dictBytes = stream.getBytes(dictLength);\n      stream.pos = initialStreamPos;\n      cacheKey = computeAdler32(imageBytes) + \"_\" + computeAdler32(dictBytes);\n      const cacheEntry = this.imageCache[cacheKey];\n\n      if (cacheEntry !== undefined) {\n        this.buf2 = _primitives.Cmd.get(\"EI\");\n        this.shift();\n        cacheEntry.reset();\n        return cacheEntry;\n      }\n    }\n\n    if (cipherTransform) {\n      imageStream = cipherTransform.createStream(imageStream, length);\n    }\n\n    imageStream = this.filter(imageStream, dict, length);\n    imageStream.dict = dict;\n\n    if (cacheKey !== undefined) {\n      imageStream.cacheKey = `inline_${length}_${cacheKey}`;\n      this.imageCache[cacheKey] = imageStream;\n    }\n\n    this.buf2 = _primitives.Cmd.get(\"EI\");\n    this.shift();\n    return imageStream;\n  }\n\n  _findStreamLength(startPos, signature) {\n    const {\n      stream\n    } = this.lexer;\n    stream.pos = startPos;\n    const SCAN_BLOCK_LENGTH = 2048;\n    const signatureLength = signature.length;\n\n    while (stream.pos < stream.end) {\n      const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH);\n      const scanLength = scanBytes.length - signatureLength;\n\n      if (scanLength <= 0) {\n        break;\n      }\n\n      let pos = 0;\n\n      while (pos < scanLength) {\n        let j = 0;\n\n        while (j < signatureLength && scanBytes[pos + j] === signature[j]) {\n          j++;\n        }\n\n        if (j >= signatureLength) {\n          stream.pos += pos;\n          return stream.pos - startPos;\n        }\n\n        pos++;\n      }\n\n      stream.pos += scanLength;\n    }\n\n    return -1;\n  }\n\n  makeStream(dict, cipherTransform) {\n    const lexer = this.lexer;\n    let stream = lexer.stream;\n    lexer.skipToNextLine();\n    const startPos = stream.pos - 1;\n    let length = dict.get(\"Length\");\n\n    if (!Number.isInteger(length)) {\n      (0, _util.info)(`Bad length \"${length}\" in stream`);\n      length = 0;\n    }\n\n    stream.pos = startPos + length;\n    lexer.nextChar();\n\n    if (this.tryShift() && (0, _primitives.isCmd)(this.buf2, \"endstream\")) {\n      this.shift();\n    } else {\n      const ENDSTREAM_SIGNATURE = new Uint8Array([0x65, 0x6E, 0x64, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6D]);\n\n      let actualLength = this._findStreamLength(startPos, ENDSTREAM_SIGNATURE);\n\n      if (actualLength < 0) {\n        const MAX_TRUNCATION = 1;\n\n        for (let i = 1; i <= MAX_TRUNCATION; i++) {\n          const end = ENDSTREAM_SIGNATURE.length - i;\n          const TRUNCATED_SIGNATURE = ENDSTREAM_SIGNATURE.slice(0, end);\n\n          const maybeLength = this._findStreamLength(startPos, TRUNCATED_SIGNATURE);\n\n          if (maybeLength >= 0) {\n            const lastByte = stream.peekBytes(end + 1)[end];\n\n            if (!(0, _core_utils.isWhiteSpace)(lastByte)) {\n              break;\n            }\n\n            (0, _util.info)(`Found \"${(0, _util.bytesToString)(TRUNCATED_SIGNATURE)}\" when ` + \"searching for endstream command.\");\n            actualLength = maybeLength;\n            break;\n          }\n        }\n\n        if (actualLength < 0) {\n          throw new _util.FormatError(\"Missing endstream command.\");\n        }\n      }\n\n      length = actualLength;\n      lexer.nextChar();\n      this.shift();\n      this.shift();\n    }\n\n    this.shift();\n    stream = stream.makeSubStream(startPos, length, dict);\n\n    if (cipherTransform) {\n      stream = cipherTransform.createStream(stream, length);\n    }\n\n    stream = this.filter(stream, dict, length);\n    stream.dict = dict;\n    return stream;\n  }\n\n  filter(stream, dict, length) {\n    let filter = dict.get(\"Filter\", \"F\");\n    let params = dict.get(\"DecodeParms\", \"DP\");\n\n    if ((0, _primitives.isName)(filter)) {\n      if (Array.isArray(params)) {\n        (0, _util.warn)(\"/DecodeParms should not contain an Array, \" + \"when /Filter contains a Name.\");\n      }\n\n      return this.makeFilter(stream, filter.name, length, params);\n    }\n\n    let maybeLength = length;\n\n    if (Array.isArray(filter)) {\n      const filterArray = filter;\n      const paramsArray = params;\n\n      for (let i = 0, ii = filterArray.length; i < ii; ++i) {\n        filter = this.xref.fetchIfRef(filterArray[i]);\n\n        if (!(0, _primitives.isName)(filter)) {\n          throw new _util.FormatError(`Bad filter name \"${filter}\"`);\n        }\n\n        params = null;\n\n        if (Array.isArray(paramsArray) && i in paramsArray) {\n          params = this.xref.fetchIfRef(paramsArray[i]);\n        }\n\n        stream = this.makeFilter(stream, filter.name, maybeLength, params);\n        maybeLength = null;\n      }\n    }\n\n    return stream;\n  }\n\n  makeFilter(stream, name, maybeLength, params) {\n    if (maybeLength === 0) {\n      (0, _util.warn)(`Empty \"${name}\" stream.`);\n      return new _stream.NullStream();\n    }\n\n    try {\n      const xrefStreamStats = this.xref.stats.streamTypes;\n\n      if (name === \"FlateDecode\" || name === \"Fl\") {\n        xrefStreamStats[_util.StreamType.FLATE] = true;\n\n        if (params) {\n          return new _stream.PredictorStream(new _stream.FlateStream(stream, maybeLength), maybeLength, params);\n        }\n\n        return new _stream.FlateStream(stream, maybeLength);\n      }\n\n      if (name === \"LZWDecode\" || name === \"LZW\") {\n        xrefStreamStats[_util.StreamType.LZW] = true;\n        let earlyChange = 1;\n\n        if (params) {\n          if (params.has(\"EarlyChange\")) {\n            earlyChange = params.get(\"EarlyChange\");\n          }\n\n          return new _stream.PredictorStream(new _stream.LZWStream(stream, maybeLength, earlyChange), maybeLength, params);\n        }\n\n        return new _stream.LZWStream(stream, maybeLength, earlyChange);\n      }\n\n      if (name === \"DCTDecode\" || name === \"DCT\") {\n        xrefStreamStats[_util.StreamType.DCT] = true;\n        return new _jpeg_stream.JpegStream(stream, maybeLength, stream.dict, params);\n      }\n\n      if (name === \"JPXDecode\" || name === \"JPX\") {\n        xrefStreamStats[_util.StreamType.JPX] = true;\n        return new _jpx_stream.JpxStream(stream, maybeLength, stream.dict, params);\n      }\n\n      if (name === \"ASCII85Decode\" || name === \"A85\") {\n        xrefStreamStats[_util.StreamType.A85] = true;\n        return new _stream.Ascii85Stream(stream, maybeLength);\n      }\n\n      if (name === \"ASCIIHexDecode\" || name === \"AHx\") {\n        xrefStreamStats[_util.StreamType.AHX] = true;\n        return new _stream.AsciiHexStream(stream, maybeLength);\n      }\n\n      if (name === \"CCITTFaxDecode\" || name === \"CCF\") {\n        xrefStreamStats[_util.StreamType.CCF] = true;\n        return new _ccitt_stream.CCITTFaxStream(stream, maybeLength, params);\n      }\n\n      if (name === \"RunLengthDecode\" || name === \"RL\") {\n        xrefStreamStats[_util.StreamType.RLX] = true;\n        return new _stream.RunLengthStream(stream, maybeLength);\n      }\n\n      if (name === \"JBIG2Decode\") {\n        xrefStreamStats[_util.StreamType.JBIG] = true;\n        return new _jbig2_stream.Jbig2Stream(stream, maybeLength, stream.dict, params);\n      }\n\n      (0, _util.warn)(`Filter \"${name}\" is not supported.`);\n      return stream;\n    } catch (ex) {\n      if (ex instanceof _core_utils.MissingDataException) {\n        throw ex;\n      }\n\n      (0, _util.warn)(`Invalid stream: \"${ex}\"`);\n      return new _stream.NullStream();\n    }\n  }\n\n}\n\nexports.Parser = Parser;\nconst specialChars = [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 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, 0, 0, 0, 0, 0, 2, 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, 0, 0, 0, 0, 0, 0, 2, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n\nfunction toHexDigit(ch) {\n  if (ch >= 0x30 && ch <= 0x39) {\n    return ch & 0x0f;\n  }\n\n  if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) {\n    return (ch & 0x0f) + 9;\n  }\n\n  return -1;\n}\n\nclass Lexer {\n  constructor(stream, knownCommands = null) {\n    this.stream = stream;\n    this.nextChar();\n    this.strBuf = [];\n    this.knownCommands = knownCommands;\n    this._hexStringNumWarn = 0;\n    this.beginInlineImagePos = -1;\n  }\n\n  nextChar() {\n    return this.currentChar = this.stream.getByte();\n  }\n\n  peekChar() {\n    return this.stream.peekByte();\n  }\n\n  getNumber() {\n    let ch = this.currentChar;\n    let eNotation = false;\n    let divideBy = 0;\n    let sign = 0;\n\n    if (ch === 0x2d) {\n      sign = -1;\n      ch = this.nextChar();\n\n      if (ch === 0x2d) {\n        ch = this.nextChar();\n      }\n    } else if (ch === 0x2b) {\n      sign = 1;\n      ch = this.nextChar();\n    }\n\n    if (ch === 0x0a || ch === 0x0d) {\n      do {\n        ch = this.nextChar();\n      } while (ch === 0x0a || ch === 0x0d);\n    }\n\n    if (ch === 0x2e) {\n      divideBy = 10;\n      ch = this.nextChar();\n    }\n\n    if (ch < 0x30 || ch > 0x39) {\n      if (divideBy === 10 && sign === 0 && ((0, _core_utils.isWhiteSpace)(ch) || ch === -1)) {\n        (0, _util.warn)(\"Lexer.getNumber - treating a single decimal point as zero.\");\n        return 0;\n      }\n\n      throw new _util.FormatError(`Invalid number: ${String.fromCharCode(ch)} (charCode ${ch})`);\n    }\n\n    sign = sign || 1;\n    let baseValue = ch - 0x30;\n    let powerValue = 0;\n    let powerValueSign = 1;\n\n    while ((ch = this.nextChar()) >= 0) {\n      if (ch >= 0x30 && ch <= 0x39) {\n        const currentDigit = ch - 0x30;\n\n        if (eNotation) {\n          powerValue = powerValue * 10 + currentDigit;\n        } else {\n          if (divideBy !== 0) {\n            divideBy *= 10;\n          }\n\n          baseValue = baseValue * 10 + currentDigit;\n        }\n      } else if (ch === 0x2e) {\n        if (divideBy === 0) {\n          divideBy = 1;\n        } else {\n          break;\n        }\n      } else if (ch === 0x2d) {\n        (0, _util.warn)(\"Badly formatted number: minus sign in the middle\");\n      } else if (ch === 0x45 || ch === 0x65) {\n        ch = this.peekChar();\n\n        if (ch === 0x2b || ch === 0x2d) {\n          powerValueSign = ch === 0x2d ? -1 : 1;\n          this.nextChar();\n        } else if (ch < 0x30 || ch > 0x39) {\n          break;\n        }\n\n        eNotation = true;\n      } else {\n        break;\n      }\n    }\n\n    if (divideBy !== 0) {\n      baseValue /= divideBy;\n    }\n\n    if (eNotation) {\n      baseValue *= 10 ** (powerValueSign * powerValue);\n    }\n\n    return sign * baseValue;\n  }\n\n  getString() {\n    let numParen = 1;\n    let done = false;\n    const strBuf = this.strBuf;\n    strBuf.length = 0;\n    let ch = this.nextChar();\n\n    while (true) {\n      let charBuffered = false;\n\n      switch (ch | 0) {\n        case -1:\n          (0, _util.warn)(\"Unterminated string\");\n          done = true;\n          break;\n\n        case 0x28:\n          ++numParen;\n          strBuf.push(\"(\");\n          break;\n\n        case 0x29:\n          if (--numParen === 0) {\n            this.nextChar();\n            done = true;\n          } else {\n            strBuf.push(\")\");\n          }\n\n          break;\n\n        case 0x5c:\n          ch = this.nextChar();\n\n          switch (ch) {\n            case -1:\n              (0, _util.warn)(\"Unterminated string\");\n              done = true;\n              break;\n\n            case 0x6e:\n              strBuf.push(\"\\n\");\n              break;\n\n            case 0x72:\n              strBuf.push(\"\\r\");\n              break;\n\n            case 0x74:\n              strBuf.push(\"\\t\");\n              break;\n\n            case 0x62:\n              strBuf.push(\"\\b\");\n              break;\n\n            case 0x66:\n              strBuf.push(\"\\f\");\n              break;\n\n            case 0x5c:\n            case 0x28:\n            case 0x29:\n              strBuf.push(String.fromCharCode(ch));\n              break;\n\n            case 0x30:\n            case 0x31:\n            case 0x32:\n            case 0x33:\n            case 0x34:\n            case 0x35:\n            case 0x36:\n            case 0x37:\n              let x = ch & 0x0f;\n              ch = this.nextChar();\n              charBuffered = true;\n\n              if (ch >= 0x30 && ch <= 0x37) {\n                x = (x << 3) + (ch & 0x0f);\n                ch = this.nextChar();\n\n                if (ch >= 0x30 && ch <= 0x37) {\n                  charBuffered = false;\n                  x = (x << 3) + (ch & 0x0f);\n                }\n              }\n\n              strBuf.push(String.fromCharCode(x));\n              break;\n\n            case 0x0d:\n              if (this.peekChar() === 0x0a) {\n                this.nextChar();\n              }\n\n              break;\n\n            case 0x0a:\n              break;\n\n            default:\n              strBuf.push(String.fromCharCode(ch));\n              break;\n          }\n\n          break;\n\n        default:\n          strBuf.push(String.fromCharCode(ch));\n          break;\n      }\n\n      if (done) {\n        break;\n      }\n\n      if (!charBuffered) {\n        ch = this.nextChar();\n      }\n    }\n\n    return strBuf.join(\"\");\n  }\n\n  getName() {\n    let ch, previousCh;\n    const strBuf = this.strBuf;\n    strBuf.length = 0;\n\n    while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {\n      if (ch === 0x23) {\n        ch = this.nextChar();\n\n        if (specialChars[ch]) {\n          (0, _util.warn)(\"Lexer_getName: \" + \"NUMBER SIGN (#) should be followed by a hexadecimal number.\");\n          strBuf.push(\"#\");\n          break;\n        }\n\n        const x = toHexDigit(ch);\n\n        if (x !== -1) {\n          previousCh = ch;\n          ch = this.nextChar();\n          const x2 = toHexDigit(ch);\n\n          if (x2 === -1) {\n            (0, _util.warn)(`Lexer_getName: Illegal digit (${String.fromCharCode(ch)}) ` + \"in hexadecimal number.\");\n            strBuf.push(\"#\", String.fromCharCode(previousCh));\n\n            if (specialChars[ch]) {\n              break;\n            }\n\n            strBuf.push(String.fromCharCode(ch));\n            continue;\n          }\n\n          strBuf.push(String.fromCharCode(x << 4 | x2));\n        } else {\n          strBuf.push(\"#\", String.fromCharCode(ch));\n        }\n      } else {\n        strBuf.push(String.fromCharCode(ch));\n      }\n    }\n\n    if (strBuf.length > 127) {\n      (0, _util.warn)(`Name token is longer than allowed by the spec: ${strBuf.length}`);\n    }\n\n    return _primitives.Name.get(strBuf.join(\"\"));\n  }\n\n  _hexStringWarn(ch) {\n    const MAX_HEX_STRING_NUM_WARN = 5;\n\n    if (this._hexStringNumWarn++ === MAX_HEX_STRING_NUM_WARN) {\n      (0, _util.warn)(\"getHexString - ignoring additional invalid characters.\");\n      return;\n    }\n\n    if (this._hexStringNumWarn > MAX_HEX_STRING_NUM_WARN) {\n      return;\n    }\n\n    (0, _util.warn)(`getHexString - ignoring invalid character: ${ch}`);\n  }\n\n  getHexString() {\n    const strBuf = this.strBuf;\n    strBuf.length = 0;\n    let ch = this.currentChar;\n    let isFirstHex = true;\n    let firstDigit, secondDigit;\n    this._hexStringNumWarn = 0;\n\n    while (true) {\n      if (ch < 0) {\n        (0, _util.warn)(\"Unterminated hex string\");\n        break;\n      } else if (ch === 0x3e) {\n        this.nextChar();\n        break;\n      } else if (specialChars[ch] === 1) {\n        ch = this.nextChar();\n        continue;\n      } else {\n        if (isFirstHex) {\n          firstDigit = toHexDigit(ch);\n\n          if (firstDigit === -1) {\n            this._hexStringWarn(ch);\n\n            ch = this.nextChar();\n            continue;\n          }\n        } else {\n          secondDigit = toHexDigit(ch);\n\n          if (secondDigit === -1) {\n            this._hexStringWarn(ch);\n\n            ch = this.nextChar();\n            continue;\n          }\n\n          strBuf.push(String.fromCharCode(firstDigit << 4 | secondDigit));\n        }\n\n        isFirstHex = !isFirstHex;\n        ch = this.nextChar();\n      }\n    }\n\n    return strBuf.join(\"\");\n  }\n\n  getObj() {\n    let comment = false;\n    let ch = this.currentChar;\n\n    while (true) {\n      if (ch < 0) {\n        return _primitives.EOF;\n      }\n\n      if (comment) {\n        if (ch === 0x0a || ch === 0x0d) {\n          comment = false;\n        }\n      } else if (ch === 0x25) {\n        comment = true;\n      } else if (specialChars[ch] !== 1) {\n        break;\n      }\n\n      ch = this.nextChar();\n    }\n\n    switch (ch | 0) {\n      case 0x30:\n      case 0x31:\n      case 0x32:\n      case 0x33:\n      case 0x34:\n      case 0x35:\n      case 0x36:\n      case 0x37:\n      case 0x38:\n      case 0x39:\n      case 0x2b:\n      case 0x2d:\n      case 0x2e:\n        return this.getNumber();\n\n      case 0x28:\n        return this.getString();\n\n      case 0x2f:\n        return this.getName();\n\n      case 0x5b:\n        this.nextChar();\n        return _primitives.Cmd.get(\"[\");\n\n      case 0x5d:\n        this.nextChar();\n        return _primitives.Cmd.get(\"]\");\n\n      case 0x3c:\n        ch = this.nextChar();\n\n        if (ch === 0x3c) {\n          this.nextChar();\n          return _primitives.Cmd.get(\"<<\");\n        }\n\n        return this.getHexString();\n\n      case 0x3e:\n        ch = this.nextChar();\n\n        if (ch === 0x3e) {\n          this.nextChar();\n          return _primitives.Cmd.get(\">>\");\n        }\n\n        return _primitives.Cmd.get(\">\");\n\n      case 0x7b:\n        this.nextChar();\n        return _primitives.Cmd.get(\"{\");\n\n      case 0x7d:\n        this.nextChar();\n        return _primitives.Cmd.get(\"}\");\n\n      case 0x29:\n        this.nextChar();\n        throw new _util.FormatError(`Illegal character: ${ch}`);\n    }\n\n    let str = String.fromCharCode(ch);\n    const knownCommands = this.knownCommands;\n    let knownCommandFound = knownCommands && knownCommands[str] !== undefined;\n\n    while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {\n      const possibleCommand = str + String.fromCharCode(ch);\n\n      if (knownCommandFound && knownCommands[possibleCommand] === undefined) {\n        break;\n      }\n\n      if (str.length === 128) {\n        throw new _util.FormatError(`Command token too long: ${str.length}`);\n      }\n\n      str = possibleCommand;\n      knownCommandFound = knownCommands && knownCommands[str] !== undefined;\n    }\n\n    if (str === \"true\") {\n      return true;\n    }\n\n    if (str === \"false\") {\n      return false;\n    }\n\n    if (str === \"null\") {\n      return null;\n    }\n\n    if (str === \"BI\") {\n      this.beginInlineImagePos = this.stream.pos;\n    }\n\n    return _primitives.Cmd.get(str);\n  }\n\n  peekObj() {\n    const streamPos = this.stream.pos,\n          currentChar = this.currentChar,\n          beginInlineImagePos = this.beginInlineImagePos;\n    let nextObj;\n\n    try {\n      nextObj = this.getObj();\n    } catch (ex) {\n      if (ex instanceof _core_utils.MissingDataException) {\n        throw ex;\n      }\n\n      (0, _util.warn)(`peekObj: ${ex}`);\n    }\n\n    this.stream.pos = streamPos;\n    this.currentChar = currentChar;\n    this.beginInlineImagePos = beginInlineImagePos;\n    return nextObj;\n  }\n\n  skipToNextLine() {\n    let ch = this.currentChar;\n\n    while (ch >= 0) {\n      if (ch === 0x0d) {\n        ch = this.nextChar();\n\n        if (ch === 0x0a) {\n          this.nextChar();\n        }\n\n        break;\n      } else if (ch === 0x0a) {\n        this.nextChar();\n        break;\n      }\n\n      ch = this.nextChar();\n    }\n  }\n\n}\n\nexports.Lexer = Lexer;\n\nclass Linearization {\n  static create(stream) {\n    function getInt(linDict, name, allowZeroValue = false) {\n      const obj = linDict.get(name);\n\n      if (Number.isInteger(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) {\n        return obj;\n      }\n\n      throw new Error(`The \"${name}\" parameter in the linearization ` + \"dictionary is invalid.\");\n    }\n\n    function getHints(linDict) {\n      const hints = linDict.get(\"H\");\n      let hintsLength;\n\n      if (Array.isArray(hints) && ((hintsLength = hints.length) === 2 || hintsLength === 4)) {\n        for (let index = 0; index < hintsLength; index++) {\n          const hint = hints[index];\n\n          if (!(Number.isInteger(hint) && hint > 0)) {\n            throw new Error(`Hint (${index}) in the linearization dictionary is invalid.`);\n          }\n        }\n\n        return hints;\n      }\n\n      throw new Error(\"Hint array in the linearization dictionary is invalid.\");\n    }\n\n    const parser = new Parser({\n      lexer: new Lexer(stream),\n      xref: null\n    });\n    const obj1 = parser.getObj();\n    const obj2 = parser.getObj();\n    const obj3 = parser.getObj();\n    const linDict = parser.getObj();\n    let obj, length;\n\n    if (!(Number.isInteger(obj1) && Number.isInteger(obj2) && (0, _primitives.isCmd)(obj3, \"obj\") && (0, _primitives.isDict)(linDict) && (0, _util.isNum)(obj = linDict.get(\"Linearized\")) && obj > 0)) {\n      return null;\n    } else if ((length = getInt(linDict, \"L\")) !== stream.length) {\n      throw new Error('The \"L\" parameter in the linearization dictionary ' + \"does not equal the stream length.\");\n    }\n\n    return {\n      length,\n      hints: getHints(linDict),\n      objectNumberFirst: getInt(linDict, \"O\"),\n      endFirst: getInt(linDict, \"E\"),\n      numPages: getInt(linDict, \"N\"),\n      mainXRefEntriesOffset: getInt(linDict, \"T\"),\n      pageFirst: linDict.has(\"P\") ? getInt(linDict, \"P\", true) : 0\n    };\n  }\n\n}\n\nexports.Linearization = Linearization;\n\n/***/ }),\n/* 12 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.StringStream = exports.StreamsSequenceStream = exports.Stream = exports.RunLengthStream = exports.PredictorStream = exports.NullStream = exports.LZWStream = exports.FlateStream = exports.DecryptStream = exports.DecodeStream = exports.AsciiHexStream = exports.Ascii85Stream = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _primitives = __w_pdfjs_require__(5);\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nvar Stream = function StreamClosure() {\n  function Stream(arrayBuffer, start, length, dict) {\n    this.bytes = arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer);\n    this.start = start || 0;\n    this.pos = this.start;\n    this.end = start + length || this.bytes.length;\n    this.dict = dict;\n  }\n\n  Stream.prototype = {\n    get length() {\n      return this.end - this.start;\n    },\n\n    get isEmpty() {\n      return this.length === 0;\n    },\n\n    getByte: function Stream_getByte() {\n      if (this.pos >= this.end) {\n        return -1;\n      }\n\n      return this.bytes[this.pos++];\n    },\n    getUint16: function Stream_getUint16() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n\n      if (b0 === -1 || b1 === -1) {\n        return -1;\n      }\n\n      return (b0 << 8) + b1;\n    },\n    getInt32: function Stream_getInt32() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      var b2 = this.getByte();\n      var b3 = this.getByte();\n      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n    },\n\n    getBytes(length, forceClamped = false) {\n      var bytes = this.bytes;\n      var pos = this.pos;\n      var strEnd = this.end;\n\n      if (!length) {\n        const subarray = bytes.subarray(pos, strEnd);\n        return forceClamped ? new Uint8ClampedArray(subarray) : subarray;\n      }\n\n      var end = pos + length;\n\n      if (end > strEnd) {\n        end = strEnd;\n      }\n\n      this.pos = end;\n      const subarray = bytes.subarray(pos, end);\n      return forceClamped ? new Uint8ClampedArray(subarray) : subarray;\n    },\n\n    peekByte: function Stream_peekByte() {\n      var peekedByte = this.getByte();\n\n      if (peekedByte !== -1) {\n        this.pos--;\n      }\n\n      return peekedByte;\n    },\n\n    peekBytes(length, forceClamped = false) {\n      var bytes = this.getBytes(length, forceClamped);\n      this.pos -= bytes.length;\n      return bytes;\n    },\n\n    getByteRange(begin, end) {\n      if (begin < 0) {\n        begin = 0;\n      }\n\n      if (end > this.end) {\n        end = this.end;\n      }\n\n      return this.bytes.subarray(begin, end);\n    },\n\n    skip: function Stream_skip(n) {\n      if (!n) {\n        n = 1;\n      }\n\n      this.pos += n;\n    },\n    reset: function Stream_reset() {\n      this.pos = this.start;\n    },\n    moveStart: function Stream_moveStart() {\n      this.start = this.pos;\n    },\n    makeSubStream: function Stream_makeSubStream(start, length, dict) {\n      return new Stream(this.bytes.buffer, start, length, dict);\n    }\n  };\n  return Stream;\n}();\n\nexports.Stream = Stream;\n\nvar StringStream = function StringStreamClosure() {\n  function StringStream(str) {\n    const bytes = (0, _util.stringToBytes)(str);\n    Stream.call(this, bytes);\n  }\n\n  StringStream.prototype = Stream.prototype;\n  return StringStream;\n}();\n\nexports.StringStream = StringStream;\n\nvar DecodeStream = function DecodeStreamClosure() {\n  var emptyBuffer = new Uint8Array(0);\n\n  function DecodeStream(maybeMinBufferLength) {\n    this._rawMinBufferLength = maybeMinBufferLength || 0;\n    this.pos = 0;\n    this.bufferLength = 0;\n    this.eof = false;\n    this.buffer = emptyBuffer;\n    this.minBufferLength = 512;\n\n    if (maybeMinBufferLength) {\n      while (this.minBufferLength < maybeMinBufferLength) {\n        this.minBufferLength *= 2;\n      }\n    }\n  }\n\n  DecodeStream.prototype = {\n    get length() {\n      (0, _util.unreachable)(\"Should not access DecodeStream.length\");\n    },\n\n    get isEmpty() {\n      while (!this.eof && this.bufferLength === 0) {\n        this.readBlock();\n      }\n\n      return this.bufferLength === 0;\n    },\n\n    ensureBuffer: function DecodeStream_ensureBuffer(requested) {\n      var buffer = this.buffer;\n\n      if (requested <= buffer.byteLength) {\n        return buffer;\n      }\n\n      var size = this.minBufferLength;\n\n      while (size < requested) {\n        size *= 2;\n      }\n\n      var buffer2 = new Uint8Array(size);\n      buffer2.set(buffer);\n      return this.buffer = buffer2;\n    },\n    getByte: function DecodeStream_getByte() {\n      var pos = this.pos;\n\n      while (this.bufferLength <= pos) {\n        if (this.eof) {\n          return -1;\n        }\n\n        this.readBlock();\n      }\n\n      return this.buffer[this.pos++];\n    },\n    getUint16: function DecodeStream_getUint16() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n\n      if (b0 === -1 || b1 === -1) {\n        return -1;\n      }\n\n      return (b0 << 8) + b1;\n    },\n    getInt32: function DecodeStream_getInt32() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      var b2 = this.getByte();\n      var b3 = this.getByte();\n      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n    },\n\n    getBytes(length, forceClamped = false) {\n      var end,\n          pos = this.pos;\n\n      if (length) {\n        this.ensureBuffer(pos + length);\n        end = pos + length;\n\n        while (!this.eof && this.bufferLength < end) {\n          this.readBlock();\n        }\n\n        var bufEnd = this.bufferLength;\n\n        if (end > bufEnd) {\n          end = bufEnd;\n        }\n      } else {\n        while (!this.eof) {\n          this.readBlock();\n        }\n\n        end = this.bufferLength;\n      }\n\n      this.pos = end;\n      const subarray = this.buffer.subarray(pos, end);\n      return forceClamped && !(subarray instanceof Uint8ClampedArray) ? new Uint8ClampedArray(subarray) : subarray;\n    },\n\n    peekByte: function DecodeStream_peekByte() {\n      var peekedByte = this.getByte();\n\n      if (peekedByte !== -1) {\n        this.pos--;\n      }\n\n      return peekedByte;\n    },\n\n    peekBytes(length, forceClamped = false) {\n      var bytes = this.getBytes(length, forceClamped);\n      this.pos -= bytes.length;\n      return bytes;\n    },\n\n    makeSubStream: function DecodeStream_makeSubStream(start, length, dict) {\n      if (length === undefined) {\n        while (!this.eof) {\n          this.readBlock();\n        }\n      } else {\n        var end = start + length;\n\n        while (this.bufferLength <= end && !this.eof) {\n          this.readBlock();\n        }\n      }\n\n      return new Stream(this.buffer, start, length, dict);\n    },\n\n    getByteRange(begin, end) {\n      (0, _util.unreachable)(\"Should not call DecodeStream.getByteRange\");\n    },\n\n    skip: function DecodeStream_skip(n) {\n      if (!n) {\n        n = 1;\n      }\n\n      this.pos += n;\n    },\n    reset: function DecodeStream_reset() {\n      this.pos = 0;\n    },\n    getBaseStreams: function DecodeStream_getBaseStreams() {\n      if (this.str && this.str.getBaseStreams) {\n        return this.str.getBaseStreams();\n      }\n\n      return [];\n    }\n  };\n  return DecodeStream;\n}();\n\nexports.DecodeStream = DecodeStream;\n\nvar StreamsSequenceStream = function StreamsSequenceStreamClosure() {\n  function StreamsSequenceStream(streams) {\n    this.streams = streams;\n    let maybeLength = 0;\n\n    for (let i = 0, ii = streams.length; i < ii; i++) {\n      const stream = streams[i];\n\n      if (stream instanceof DecodeStream) {\n        maybeLength += stream._rawMinBufferLength;\n      } else {\n        maybeLength += stream.length;\n      }\n    }\n\n    DecodeStream.call(this, maybeLength);\n  }\n\n  StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype);\n\n  StreamsSequenceStream.prototype.readBlock = function streamSequenceStreamReadBlock() {\n    var streams = this.streams;\n\n    if (streams.length === 0) {\n      this.eof = true;\n      return;\n    }\n\n    var stream = streams.shift();\n    var chunk = stream.getBytes();\n    var bufferLength = this.bufferLength;\n    var newLength = bufferLength + chunk.length;\n    var buffer = this.ensureBuffer(newLength);\n    buffer.set(chunk, bufferLength);\n    this.bufferLength = newLength;\n  };\n\n  StreamsSequenceStream.prototype.getBaseStreams = function StreamsSequenceStream_getBaseStreams() {\n    var baseStreams = [];\n\n    for (var i = 0, ii = this.streams.length; i < ii; i++) {\n      var stream = this.streams[i];\n\n      if (stream.getBaseStreams) {\n        baseStreams.push(...stream.getBaseStreams());\n      }\n    }\n\n    return baseStreams;\n  };\n\n  return StreamsSequenceStream;\n}();\n\nexports.StreamsSequenceStream = StreamsSequenceStream;\n\nvar FlateStream = function FlateStreamClosure() {\n  var codeLenCodeMap = new Int32Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n  var lengthDecode = new Int32Array([0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102]);\n  var distDecode = new Int32Array([0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001]);\n  var fixedLitCodeTab = [new Int32Array([0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0, 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8, 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4, 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc, 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc, 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2, 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca, 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6, 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce, 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe, 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1, 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9, 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5, 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd, 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3, 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb, 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db, 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7, 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf, 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff]), 9];\n  var fixedDistCodeTab = [new Int32Array([0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000]), 5];\n\n  function FlateStream(str, maybeLength) {\n    this.str = str;\n    this.dict = str.dict;\n    var cmf = str.getByte();\n    var flg = str.getByte();\n\n    if (cmf === -1 || flg === -1) {\n      throw new _util.FormatError(`Invalid header in flate stream: ${cmf}, ${flg}`);\n    }\n\n    if ((cmf & 0x0f) !== 0x08) {\n      throw new _util.FormatError(`Unknown compression method in flate stream: ${cmf}, ${flg}`);\n    }\n\n    if (((cmf << 8) + flg) % 31 !== 0) {\n      throw new _util.FormatError(`Bad FCHECK in flate stream: ${cmf}, ${flg}`);\n    }\n\n    if (flg & 0x20) {\n      throw new _util.FormatError(`FDICT bit set in flate stream: ${cmf}, ${flg}`);\n    }\n\n    this.codeSize = 0;\n    this.codeBuf = 0;\n    DecodeStream.call(this, maybeLength);\n  }\n\n  FlateStream.prototype = Object.create(DecodeStream.prototype);\n\n  FlateStream.prototype.getBits = function FlateStream_getBits(bits) {\n    var str = this.str;\n    var codeSize = this.codeSize;\n    var codeBuf = this.codeBuf;\n    var b;\n\n    while (codeSize < bits) {\n      if ((b = str.getByte()) === -1) {\n        throw new _util.FormatError(\"Bad encoding in flate stream\");\n      }\n\n      codeBuf |= b << codeSize;\n      codeSize += 8;\n    }\n\n    b = codeBuf & (1 << bits) - 1;\n    this.codeBuf = codeBuf >> bits;\n    this.codeSize = codeSize -= bits;\n    return b;\n  };\n\n  FlateStream.prototype.getCode = function FlateStream_getCode(table) {\n    var str = this.str;\n    var codes = table[0];\n    var maxLen = table[1];\n    var codeSize = this.codeSize;\n    var codeBuf = this.codeBuf;\n    var b;\n\n    while (codeSize < maxLen) {\n      if ((b = str.getByte()) === -1) {\n        break;\n      }\n\n      codeBuf |= b << codeSize;\n      codeSize += 8;\n    }\n\n    var code = codes[codeBuf & (1 << maxLen) - 1];\n    var codeLen = code >> 16;\n    var codeVal = code & 0xffff;\n\n    if (codeLen < 1 || codeSize < codeLen) {\n      throw new _util.FormatError(\"Bad encoding in flate stream\");\n    }\n\n    this.codeBuf = codeBuf >> codeLen;\n    this.codeSize = codeSize - codeLen;\n    return codeVal;\n  };\n\n  FlateStream.prototype.generateHuffmanTable = function flateStreamGenerateHuffmanTable(lengths) {\n    var n = lengths.length;\n    var maxLen = 0;\n    var i;\n\n    for (i = 0; i < n; ++i) {\n      if (lengths[i] > maxLen) {\n        maxLen = lengths[i];\n      }\n    }\n\n    var size = 1 << maxLen;\n    var codes = new Int32Array(size);\n\n    for (var len = 1, code = 0, skip = 2; len <= maxLen; ++len, code <<= 1, skip <<= 1) {\n      for (var val = 0; val < n; ++val) {\n        if (lengths[val] === len) {\n          var code2 = 0;\n          var t = code;\n\n          for (i = 0; i < len; ++i) {\n            code2 = code2 << 1 | t & 1;\n            t >>= 1;\n          }\n\n          for (i = code2; i < size; i += skip) {\n            codes[i] = len << 16 | val;\n          }\n\n          ++code;\n        }\n      }\n    }\n\n    return [codes, maxLen];\n  };\n\n  FlateStream.prototype.readBlock = function FlateStream_readBlock() {\n    var buffer, len;\n    var str = this.str;\n    var hdr = this.getBits(3);\n\n    if (hdr & 1) {\n      this.eof = true;\n    }\n\n    hdr >>= 1;\n\n    if (hdr === 0) {\n      var b;\n\n      if ((b = str.getByte()) === -1) {\n        throw new _util.FormatError(\"Bad block header in flate stream\");\n      }\n\n      var blockLen = b;\n\n      if ((b = str.getByte()) === -1) {\n        throw new _util.FormatError(\"Bad block header in flate stream\");\n      }\n\n      blockLen |= b << 8;\n\n      if ((b = str.getByte()) === -1) {\n        throw new _util.FormatError(\"Bad block header in flate stream\");\n      }\n\n      var check = b;\n\n      if ((b = str.getByte()) === -1) {\n        throw new _util.FormatError(\"Bad block header in flate stream\");\n      }\n\n      check |= b << 8;\n\n      if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) {\n        throw new _util.FormatError(\"Bad uncompressed block length in flate stream\");\n      }\n\n      this.codeBuf = 0;\n      this.codeSize = 0;\n      const bufferLength = this.bufferLength,\n            end = bufferLength + blockLen;\n      buffer = this.ensureBuffer(end);\n      this.bufferLength = end;\n\n      if (blockLen === 0) {\n        if (str.peekByte() === -1) {\n          this.eof = true;\n        }\n      } else {\n        const block = str.getBytes(blockLen);\n        buffer.set(block, bufferLength);\n\n        if (block.length < blockLen) {\n          this.eof = true;\n        }\n      }\n\n      return;\n    }\n\n    var litCodeTable;\n    var distCodeTable;\n\n    if (hdr === 1) {\n      litCodeTable = fixedLitCodeTab;\n      distCodeTable = fixedDistCodeTab;\n    } else if (hdr === 2) {\n      var numLitCodes = this.getBits(5) + 257;\n      var numDistCodes = this.getBits(5) + 1;\n      var numCodeLenCodes = this.getBits(4) + 4;\n      var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);\n      var i;\n\n      for (i = 0; i < numCodeLenCodes; ++i) {\n        codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);\n      }\n\n      var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);\n      len = 0;\n      i = 0;\n      var codes = numLitCodes + numDistCodes;\n      var codeLengths = new Uint8Array(codes);\n      var bitsLength, bitsOffset, what;\n\n      while (i < codes) {\n        var code = this.getCode(codeLenCodeTab);\n\n        if (code === 16) {\n          bitsLength = 2;\n          bitsOffset = 3;\n          what = len;\n        } else if (code === 17) {\n          bitsLength = 3;\n          bitsOffset = 3;\n          what = len = 0;\n        } else if (code === 18) {\n          bitsLength = 7;\n          bitsOffset = 11;\n          what = len = 0;\n        } else {\n          codeLengths[i++] = len = code;\n          continue;\n        }\n\n        var repeatLength = this.getBits(bitsLength) + bitsOffset;\n\n        while (repeatLength-- > 0) {\n          codeLengths[i++] = what;\n        }\n      }\n\n      litCodeTable = this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));\n      distCodeTable = this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));\n    } else {\n      throw new _util.FormatError(\"Unknown block type in flate stream\");\n    }\n\n    buffer = this.buffer;\n    var limit = buffer ? buffer.length : 0;\n    var pos = this.bufferLength;\n\n    while (true) {\n      var code1 = this.getCode(litCodeTable);\n\n      if (code1 < 256) {\n        if (pos + 1 >= limit) {\n          buffer = this.ensureBuffer(pos + 1);\n          limit = buffer.length;\n        }\n\n        buffer[pos++] = code1;\n        continue;\n      }\n\n      if (code1 === 256) {\n        this.bufferLength = pos;\n        return;\n      }\n\n      code1 -= 257;\n      code1 = lengthDecode[code1];\n      var code2 = code1 >> 16;\n\n      if (code2 > 0) {\n        code2 = this.getBits(code2);\n      }\n\n      len = (code1 & 0xffff) + code2;\n      code1 = this.getCode(distCodeTable);\n      code1 = distDecode[code1];\n      code2 = code1 >> 16;\n\n      if (code2 > 0) {\n        code2 = this.getBits(code2);\n      }\n\n      var dist = (code1 & 0xffff) + code2;\n\n      if (pos + len >= limit) {\n        buffer = this.ensureBuffer(pos + len);\n        limit = buffer.length;\n      }\n\n      for (var k = 0; k < len; ++k, ++pos) {\n        buffer[pos] = buffer[pos - dist];\n      }\n    }\n  };\n\n  return FlateStream;\n}();\n\nexports.FlateStream = FlateStream;\n\nvar PredictorStream = function PredictorStreamClosure() {\n  function PredictorStream(str, maybeLength, params) {\n    if (!(0, _primitives.isDict)(params)) {\n      return str;\n    }\n\n    var predictor = this.predictor = params.get(\"Predictor\") || 1;\n\n    if (predictor <= 1) {\n      return str;\n    }\n\n    if (predictor !== 2 && (predictor < 10 || predictor > 15)) {\n      throw new _util.FormatError(`Unsupported predictor: ${predictor}`);\n    }\n\n    if (predictor === 2) {\n      this.readBlock = this.readBlockTiff;\n    } else {\n      this.readBlock = this.readBlockPng;\n    }\n\n    this.str = str;\n    this.dict = str.dict;\n    var colors = this.colors = params.get(\"Colors\") || 1;\n    var bits = this.bits = params.get(\"BitsPerComponent\") || 8;\n    var columns = this.columns = params.get(\"Columns\") || 1;\n    this.pixBytes = colors * bits + 7 >> 3;\n    this.rowBytes = columns * colors * bits + 7 >> 3;\n    DecodeStream.call(this, maybeLength);\n    return this;\n  }\n\n  PredictorStream.prototype = Object.create(DecodeStream.prototype);\n\n  PredictorStream.prototype.readBlockTiff = function predictorStreamReadBlockTiff() {\n    var rowBytes = this.rowBytes;\n    var bufferLength = this.bufferLength;\n    var buffer = this.ensureBuffer(bufferLength + rowBytes);\n    var bits = this.bits;\n    var colors = this.colors;\n    var rawBytes = this.str.getBytes(rowBytes);\n    this.eof = !rawBytes.length;\n\n    if (this.eof) {\n      return;\n    }\n\n    var inbuf = 0,\n        outbuf = 0;\n    var inbits = 0,\n        outbits = 0;\n    var pos = bufferLength;\n    var i;\n\n    if (bits === 1 && colors === 1) {\n      for (i = 0; i < rowBytes; ++i) {\n        var c = rawBytes[i] ^ inbuf;\n        c ^= c >> 1;\n        c ^= c >> 2;\n        c ^= c >> 4;\n        inbuf = (c & 1) << 7;\n        buffer[pos++] = c;\n      }\n    } else if (bits === 8) {\n      for (i = 0; i < colors; ++i) {\n        buffer[pos++] = rawBytes[i];\n      }\n\n      for (; i < rowBytes; ++i) {\n        buffer[pos] = buffer[pos - colors] + rawBytes[i];\n        pos++;\n      }\n    } else if (bits === 16) {\n      var bytesPerPixel = colors * 2;\n\n      for (i = 0; i < bytesPerPixel; ++i) {\n        buffer[pos++] = rawBytes[i];\n      }\n\n      for (; i < rowBytes; i += 2) {\n        var sum = ((rawBytes[i] & 0xff) << 8) + (rawBytes[i + 1] & 0xff) + ((buffer[pos - bytesPerPixel] & 0xff) << 8) + (buffer[pos - bytesPerPixel + 1] & 0xff);\n        buffer[pos++] = sum >> 8 & 0xff;\n        buffer[pos++] = sum & 0xff;\n      }\n    } else {\n      var compArray = new Uint8Array(colors + 1);\n      var bitMask = (1 << bits) - 1;\n      var j = 0,\n          k = bufferLength;\n      var columns = this.columns;\n\n      for (i = 0; i < columns; ++i) {\n        for (var kk = 0; kk < colors; ++kk) {\n          if (inbits < bits) {\n            inbuf = inbuf << 8 | rawBytes[j++] & 0xff;\n            inbits += 8;\n          }\n\n          compArray[kk] = compArray[kk] + (inbuf >> inbits - bits) & bitMask;\n          inbits -= bits;\n          outbuf = outbuf << bits | compArray[kk];\n          outbits += bits;\n\n          if (outbits >= 8) {\n            buffer[k++] = outbuf >> outbits - 8 & 0xff;\n            outbits -= 8;\n          }\n        }\n      }\n\n      if (outbits > 0) {\n        buffer[k++] = (outbuf << 8 - outbits) + (inbuf & (1 << 8 - outbits) - 1);\n      }\n    }\n\n    this.bufferLength += rowBytes;\n  };\n\n  PredictorStream.prototype.readBlockPng = function predictorStreamReadBlockPng() {\n    var rowBytes = this.rowBytes;\n    var pixBytes = this.pixBytes;\n    var predictor = this.str.getByte();\n    var rawBytes = this.str.getBytes(rowBytes);\n    this.eof = !rawBytes.length;\n\n    if (this.eof) {\n      return;\n    }\n\n    var bufferLength = this.bufferLength;\n    var buffer = this.ensureBuffer(bufferLength + rowBytes);\n    var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);\n\n    if (prevRow.length === 0) {\n      prevRow = new Uint8Array(rowBytes);\n    }\n\n    var i,\n        j = bufferLength,\n        up,\n        c;\n\n    switch (predictor) {\n      case 0:\n        for (i = 0; i < rowBytes; ++i) {\n          buffer[j++] = rawBytes[i];\n        }\n\n        break;\n\n      case 1:\n        for (i = 0; i < pixBytes; ++i) {\n          buffer[j++] = rawBytes[i];\n        }\n\n        for (; i < rowBytes; ++i) {\n          buffer[j] = buffer[j - pixBytes] + rawBytes[i] & 0xff;\n          j++;\n        }\n\n        break;\n\n      case 2:\n        for (i = 0; i < rowBytes; ++i) {\n          buffer[j++] = prevRow[i] + rawBytes[i] & 0xff;\n        }\n\n        break;\n\n      case 3:\n        for (i = 0; i < pixBytes; ++i) {\n          buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];\n        }\n\n        for (; i < rowBytes; ++i) {\n          buffer[j] = (prevRow[i] + buffer[j - pixBytes] >> 1) + rawBytes[i] & 0xff;\n          j++;\n        }\n\n        break;\n\n      case 4:\n        for (i = 0; i < pixBytes; ++i) {\n          up = prevRow[i];\n          c = rawBytes[i];\n          buffer[j++] = up + c;\n        }\n\n        for (; i < rowBytes; ++i) {\n          up = prevRow[i];\n          var upLeft = prevRow[i - pixBytes];\n          var left = buffer[j - pixBytes];\n          var p = left + up - upLeft;\n          var pa = p - left;\n\n          if (pa < 0) {\n            pa = -pa;\n          }\n\n          var pb = p - up;\n\n          if (pb < 0) {\n            pb = -pb;\n          }\n\n          var pc = p - upLeft;\n\n          if (pc < 0) {\n            pc = -pc;\n          }\n\n          c = rawBytes[i];\n\n          if (pa <= pb && pa <= pc) {\n            buffer[j++] = left + c;\n          } else if (pb <= pc) {\n            buffer[j++] = up + c;\n          } else {\n            buffer[j++] = upLeft + c;\n          }\n        }\n\n        break;\n\n      default:\n        throw new _util.FormatError(`Unsupported predictor: ${predictor}`);\n    }\n\n    this.bufferLength += rowBytes;\n  };\n\n  return PredictorStream;\n}();\n\nexports.PredictorStream = PredictorStream;\n\nvar DecryptStream = function DecryptStreamClosure() {\n  function DecryptStream(str, maybeLength, decrypt) {\n    this.str = str;\n    this.dict = str.dict;\n    this.decrypt = decrypt;\n    this.nextChunk = null;\n    this.initialized = false;\n    DecodeStream.call(this, maybeLength);\n  }\n\n  var chunkSize = 512;\n  DecryptStream.prototype = Object.create(DecodeStream.prototype);\n\n  DecryptStream.prototype.readBlock = function DecryptStream_readBlock() {\n    var chunk;\n\n    if (this.initialized) {\n      chunk = this.nextChunk;\n    } else {\n      chunk = this.str.getBytes(chunkSize);\n      this.initialized = true;\n    }\n\n    if (!chunk || chunk.length === 0) {\n      this.eof = true;\n      return;\n    }\n\n    this.nextChunk = this.str.getBytes(chunkSize);\n    var hasMoreData = this.nextChunk && this.nextChunk.length > 0;\n    var decrypt = this.decrypt;\n    chunk = decrypt(chunk, !hasMoreData);\n    var bufferLength = this.bufferLength;\n    var i,\n        n = chunk.length;\n    var buffer = this.ensureBuffer(bufferLength + n);\n\n    for (i = 0; i < n; i++) {\n      buffer[bufferLength++] = chunk[i];\n    }\n\n    this.bufferLength = bufferLength;\n  };\n\n  return DecryptStream;\n}();\n\nexports.DecryptStream = DecryptStream;\n\nvar Ascii85Stream = function Ascii85StreamClosure() {\n  function Ascii85Stream(str, maybeLength) {\n    this.str = str;\n    this.dict = str.dict;\n    this.input = new Uint8Array(5);\n\n    if (maybeLength) {\n      maybeLength = 0.8 * maybeLength;\n    }\n\n    DecodeStream.call(this, maybeLength);\n  }\n\n  Ascii85Stream.prototype = Object.create(DecodeStream.prototype);\n\n  Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() {\n    var TILDA_CHAR = 0x7e;\n    var Z_LOWER_CHAR = 0x7a;\n    var EOF = -1;\n    var str = this.str;\n    var c = str.getByte();\n\n    while ((0, _core_utils.isWhiteSpace)(c)) {\n      c = str.getByte();\n    }\n\n    if (c === EOF || c === TILDA_CHAR) {\n      this.eof = true;\n      return;\n    }\n\n    var bufferLength = this.bufferLength,\n        buffer;\n    var i;\n\n    if (c === Z_LOWER_CHAR) {\n      buffer = this.ensureBuffer(bufferLength + 4);\n\n      for (i = 0; i < 4; ++i) {\n        buffer[bufferLength + i] = 0;\n      }\n\n      this.bufferLength += 4;\n    } else {\n      var input = this.input;\n      input[0] = c;\n\n      for (i = 1; i < 5; ++i) {\n        c = str.getByte();\n\n        while ((0, _core_utils.isWhiteSpace)(c)) {\n          c = str.getByte();\n        }\n\n        input[i] = c;\n\n        if (c === EOF || c === TILDA_CHAR) {\n          break;\n        }\n      }\n\n      buffer = this.ensureBuffer(bufferLength + i - 1);\n      this.bufferLength += i - 1;\n\n      if (i < 5) {\n        for (; i < 5; ++i) {\n          input[i] = 0x21 + 84;\n        }\n\n        this.eof = true;\n      }\n\n      var t = 0;\n\n      for (i = 0; i < 5; ++i) {\n        t = t * 85 + (input[i] - 0x21);\n      }\n\n      for (i = 3; i >= 0; --i) {\n        buffer[bufferLength + i] = t & 0xff;\n        t >>= 8;\n      }\n    }\n  };\n\n  return Ascii85Stream;\n}();\n\nexports.Ascii85Stream = Ascii85Stream;\n\nvar AsciiHexStream = function AsciiHexStreamClosure() {\n  function AsciiHexStream(str, maybeLength) {\n    this.str = str;\n    this.dict = str.dict;\n    this.firstDigit = -1;\n\n    if (maybeLength) {\n      maybeLength = 0.5 * maybeLength;\n    }\n\n    DecodeStream.call(this, maybeLength);\n  }\n\n  AsciiHexStream.prototype = Object.create(DecodeStream.prototype);\n\n  AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() {\n    var UPSTREAM_BLOCK_SIZE = 8000;\n    var bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE);\n\n    if (!bytes.length) {\n      this.eof = true;\n      return;\n    }\n\n    var maxDecodeLength = bytes.length + 1 >> 1;\n    var buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength);\n    var bufferLength = this.bufferLength;\n    var firstDigit = this.firstDigit;\n\n    for (var i = 0, ii = bytes.length; i < ii; i++) {\n      var ch = bytes[i],\n          digit;\n\n      if (ch >= 0x30 && ch <= 0x39) {\n        digit = ch & 0x0f;\n      } else if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) {\n        digit = (ch & 0x0f) + 9;\n      } else if (ch === 0x3e) {\n        this.eof = true;\n        break;\n      } else {\n        continue;\n      }\n\n      if (firstDigit < 0) {\n        firstDigit = digit;\n      } else {\n        buffer[bufferLength++] = firstDigit << 4 | digit;\n        firstDigit = -1;\n      }\n    }\n\n    if (firstDigit >= 0 && this.eof) {\n      buffer[bufferLength++] = firstDigit << 4;\n      firstDigit = -1;\n    }\n\n    this.firstDigit = firstDigit;\n    this.bufferLength = bufferLength;\n  };\n\n  return AsciiHexStream;\n}();\n\nexports.AsciiHexStream = AsciiHexStream;\n\nvar RunLengthStream = function RunLengthStreamClosure() {\n  function RunLengthStream(str, maybeLength) {\n    this.str = str;\n    this.dict = str.dict;\n    DecodeStream.call(this, maybeLength);\n  }\n\n  RunLengthStream.prototype = Object.create(DecodeStream.prototype);\n\n  RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() {\n    var repeatHeader = this.str.getBytes(2);\n\n    if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) {\n      this.eof = true;\n      return;\n    }\n\n    var buffer;\n    var bufferLength = this.bufferLength;\n    var n = repeatHeader[0];\n\n    if (n < 128) {\n      buffer = this.ensureBuffer(bufferLength + n + 1);\n      buffer[bufferLength++] = repeatHeader[1];\n\n      if (n > 0) {\n        var source = this.str.getBytes(n);\n        buffer.set(source, bufferLength);\n        bufferLength += n;\n      }\n    } else {\n      n = 257 - n;\n      var b = repeatHeader[1];\n      buffer = this.ensureBuffer(bufferLength + n + 1);\n\n      for (var i = 0; i < n; i++) {\n        buffer[bufferLength++] = b;\n      }\n    }\n\n    this.bufferLength = bufferLength;\n  };\n\n  return RunLengthStream;\n}();\n\nexports.RunLengthStream = RunLengthStream;\n\nvar LZWStream = function LZWStreamClosure() {\n  function LZWStream(str, maybeLength, earlyChange) {\n    this.str = str;\n    this.dict = str.dict;\n    this.cachedData = 0;\n    this.bitsCached = 0;\n    var maxLzwDictionarySize = 4096;\n    var lzwState = {\n      earlyChange,\n      codeLength: 9,\n      nextCode: 258,\n      dictionaryValues: new Uint8Array(maxLzwDictionarySize),\n      dictionaryLengths: new Uint16Array(maxLzwDictionarySize),\n      dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),\n      currentSequence: new Uint8Array(maxLzwDictionarySize),\n      currentSequenceLength: 0\n    };\n\n    for (var i = 0; i < 256; ++i) {\n      lzwState.dictionaryValues[i] = i;\n      lzwState.dictionaryLengths[i] = 1;\n    }\n\n    this.lzwState = lzwState;\n    DecodeStream.call(this, maybeLength);\n  }\n\n  LZWStream.prototype = Object.create(DecodeStream.prototype);\n\n  LZWStream.prototype.readBits = function LZWStream_readBits(n) {\n    var bitsCached = this.bitsCached;\n    var cachedData = this.cachedData;\n\n    while (bitsCached < n) {\n      var c = this.str.getByte();\n\n      if (c === -1) {\n        this.eof = true;\n        return null;\n      }\n\n      cachedData = cachedData << 8 | c;\n      bitsCached += 8;\n    }\n\n    this.bitsCached = bitsCached -= n;\n    this.cachedData = cachedData;\n    this.lastCode = null;\n    return cachedData >>> bitsCached & (1 << n) - 1;\n  };\n\n  LZWStream.prototype.readBlock = function LZWStream_readBlock() {\n    var blockSize = 512;\n    var estimatedDecodedSize = blockSize * 2,\n        decodedSizeDelta = blockSize;\n    var i, j, q;\n    var lzwState = this.lzwState;\n\n    if (!lzwState) {\n      return;\n    }\n\n    var earlyChange = lzwState.earlyChange;\n    var nextCode = lzwState.nextCode;\n    var dictionaryValues = lzwState.dictionaryValues;\n    var dictionaryLengths = lzwState.dictionaryLengths;\n    var dictionaryPrevCodes = lzwState.dictionaryPrevCodes;\n    var codeLength = lzwState.codeLength;\n    var prevCode = lzwState.prevCode;\n    var currentSequence = lzwState.currentSequence;\n    var currentSequenceLength = lzwState.currentSequenceLength;\n    var decodedLength = 0;\n    var currentBufferLength = this.bufferLength;\n    var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);\n\n    for (i = 0; i < blockSize; i++) {\n      var code = this.readBits(codeLength);\n      var hasPrev = currentSequenceLength > 0;\n\n      if (code < 256) {\n        currentSequence[0] = code;\n        currentSequenceLength = 1;\n      } else if (code >= 258) {\n        if (code < nextCode) {\n          currentSequenceLength = dictionaryLengths[code];\n\n          for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {\n            currentSequence[j] = dictionaryValues[q];\n            q = dictionaryPrevCodes[q];\n          }\n        } else {\n          currentSequence[currentSequenceLength++] = currentSequence[0];\n        }\n      } else if (code === 256) {\n        codeLength = 9;\n        nextCode = 258;\n        currentSequenceLength = 0;\n        continue;\n      } else {\n        this.eof = true;\n        delete this.lzwState;\n        break;\n      }\n\n      if (hasPrev) {\n        dictionaryPrevCodes[nextCode] = prevCode;\n        dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;\n        dictionaryValues[nextCode] = currentSequence[0];\n        nextCode++;\n        codeLength = nextCode + earlyChange & nextCode + earlyChange - 1 ? codeLength : Math.min(Math.log(nextCode + earlyChange) / 0.6931471805599453 + 1, 12) | 0;\n      }\n\n      prevCode = code;\n      decodedLength += currentSequenceLength;\n\n      if (estimatedDecodedSize < decodedLength) {\n        do {\n          estimatedDecodedSize += decodedSizeDelta;\n        } while (estimatedDecodedSize < decodedLength);\n\n        buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);\n      }\n\n      for (j = 0; j < currentSequenceLength; j++) {\n        buffer[currentBufferLength++] = currentSequence[j];\n      }\n    }\n\n    lzwState.nextCode = nextCode;\n    lzwState.codeLength = codeLength;\n    lzwState.prevCode = prevCode;\n    lzwState.currentSequenceLength = currentSequenceLength;\n    this.bufferLength = currentBufferLength;\n  };\n\n  return LZWStream;\n}();\n\nexports.LZWStream = LZWStream;\n\nvar NullStream = function NullStreamClosure() {\n  function NullStream() {\n    Stream.call(this, new Uint8Array(0));\n  }\n\n  NullStream.prototype = Stream.prototype;\n  return NullStream;\n}();\n\nexports.NullStream = NullStream;\n\n/***/ }),\n/* 13 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.CCITTFaxStream = void 0;\n\nvar _primitives = __w_pdfjs_require__(5);\n\nvar _ccitt = __w_pdfjs_require__(14);\n\nvar _stream = __w_pdfjs_require__(12);\n\nconst CCITTFaxStream = function CCITTFaxStreamClosure() {\n  function CCITTFaxStream(str, maybeLength, params) {\n    this.str = str;\n    this.dict = str.dict;\n\n    if (!(0, _primitives.isDict)(params)) {\n      params = _primitives.Dict.empty;\n    }\n\n    const source = {\n      next() {\n        return str.getByte();\n      }\n\n    };\n    this.ccittFaxDecoder = new _ccitt.CCITTFaxDecoder(source, {\n      K: params.get(\"K\"),\n      EndOfLine: params.get(\"EndOfLine\"),\n      EncodedByteAlign: params.get(\"EncodedByteAlign\"),\n      Columns: params.get(\"Columns\"),\n      Rows: params.get(\"Rows\"),\n      EndOfBlock: params.get(\"EndOfBlock\"),\n      BlackIs1: params.get(\"BlackIs1\")\n    });\n\n    _stream.DecodeStream.call(this, maybeLength);\n  }\n\n  CCITTFaxStream.prototype = Object.create(_stream.DecodeStream.prototype);\n\n  CCITTFaxStream.prototype.readBlock = function () {\n    while (!this.eof) {\n      const c = this.ccittFaxDecoder.readNextChar();\n\n      if (c === -1) {\n        this.eof = true;\n        return;\n      }\n\n      this.ensureBuffer(this.bufferLength + 1);\n      this.buffer[this.bufferLength++] = c;\n    }\n  };\n\n  return CCITTFaxStream;\n}();\n\nexports.CCITTFaxStream = CCITTFaxStream;\n\n/***/ }),\n/* 14 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.CCITTFaxDecoder = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nconst CCITTFaxDecoder = function CCITTFaxDecoder() {\n  const ccittEOL = -2;\n  const ccittEOF = -1;\n  const twoDimPass = 0;\n  const twoDimHoriz = 1;\n  const twoDimVert0 = 2;\n  const twoDimVertR1 = 3;\n  const twoDimVertL1 = 4;\n  const twoDimVertR2 = 5;\n  const twoDimVertL2 = 6;\n  const twoDimVertR3 = 7;\n  const twoDimVertL3 = 8;\n  const twoDimTable = [[-1, -1], [-1, -1], [7, twoDimVertL3], [7, twoDimVertR3], [6, twoDimVertL2], [6, twoDimVertL2], [6, twoDimVertR2], [6, twoDimVertR2], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0]];\n  const whiteTable1 = [[-1, -1], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [12, 1984], [12, 2048], [12, 2112], [12, 2176], [12, 2240], [12, 2304], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [12, 2368], [12, 2432], [12, 2496], [12, 2560]];\n  const whiteTable2 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [8, 29], [8, 29], [8, 30], [8, 30], [8, 45], [8, 45], [8, 46], [8, 46], [7, 22], [7, 22], [7, 22], [7, 22], [7, 23], [7, 23], [7, 23], [7, 23], [8, 47], [8, 47], [8, 48], [8, 48], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [7, 20], [7, 20], [7, 20], [7, 20], [8, 33], [8, 33], [8, 34], [8, 34], [8, 35], [8, 35], [8, 36], [8, 36], [8, 37], [8, 37], [8, 38], [8, 38], [7, 19], [7, 19], [7, 19], [7, 19], [8, 31], [8, 31], [8, 32], [8, 32], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [8, 53], [8, 53], [8, 54], [8, 54], [7, 26], [7, 26], [7, 26], [7, 26], [8, 39], [8, 39], [8, 40], [8, 40], [8, 41], [8, 41], [8, 42], [8, 42], [8, 43], [8, 43], [8, 44], [8, 44], [7, 21], [7, 21], [7, 21], [7, 21], [7, 28], [7, 28], [7, 28], [7, 28], [8, 61], [8, 61], [8, 62], [8, 62], [8, 63], [8, 63], [8, 0], [8, 0], [8, 320], [8, 320], [8, 384], [8, 384], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [7, 27], [7, 27], [7, 27], [7, 27], [8, 59], [8, 59], [8, 60], [8, 60], [9, 1472], [9, 1536], [9, 1600], [9, 1728], [7, 18], [7, 18], [7, 18], [7, 18], [7, 24], [7, 24], [7, 24], [7, 24], [8, 49], [8, 49], [8, 50], [8, 50], [8, 51], [8, 51], [8, 52], [8, 52], [7, 25], [7, 25], [7, 25], [7, 25], [8, 55], [8, 55], [8, 56], [8, 56], [8, 57], [8, 57], [8, 58], [8, 58], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [8, 448], [8, 448], [8, 512], [8, 512], [9, 704], [9, 768], [8, 640], [8, 640], [8, 576], [8, 576], [9, 832], [9, 896], [9, 960], [9, 1024], [9, 1088], [9, 1152], [9, 1216], [9, 1280], [9, 1344], [9, 1408], [7, 256], [7, 256], [7, 256], [7, 256], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [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, 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], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7]];\n  const blackTable1 = [[-1, -1], [-1, -1], [12, ccittEOL], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [11, 1792], [11, 1792], [12, 1984], [12, 1984], [12, 2048], [12, 2048], [12, 2112], [12, 2112], [12, 2176], [12, 2176], [12, 2240], [12, 2240], [12, 2304], [12, 2304], [11, 1856], [11, 1856], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [11, 1920], [11, 1920], [12, 2368], [12, 2368], [12, 2432], [12, 2432], [12, 2496], [12, 2496], [12, 2560], [12, 2560], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [12, 52], [12, 52], [13, 640], [13, 704], [13, 768], [13, 832], [12, 55], [12, 55], [12, 56], [12, 56], [13, 1280], [13, 1344], [13, 1408], [13, 1472], [12, 59], [12, 59], [12, 60], [12, 60], [13, 1536], [13, 1600], [11, 24], [11, 24], [11, 24], [11, 24], [11, 25], [11, 25], [11, 25], [11, 25], [13, 1664], [13, 1728], [12, 320], [12, 320], [12, 384], [12, 384], [12, 448], [12, 448], [13, 512], [13, 576], [12, 53], [12, 53], [12, 54], [12, 54], [13, 896], [13, 960], [13, 1024], [13, 1088], [13, 1152], [13, 1216], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64]];\n  const blackTable2 = [[8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [11, 23], [11, 23], [12, 50], [12, 51], [12, 44], [12, 45], [12, 46], [12, 47], [12, 57], [12, 58], [12, 61], [12, 256], [10, 16], [10, 16], [10, 16], [10, 16], [10, 17], [10, 17], [10, 17], [10, 17], [12, 48], [12, 49], [12, 62], [12, 63], [12, 30], [12, 31], [12, 32], [12, 33], [12, 40], [12, 41], [11, 22], [11, 22], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [12, 128], [12, 192], [12, 26], [12, 27], [12, 28], [12, 29], [11, 19], [11, 19], [11, 20], [11, 20], [12, 34], [12, 35], [12, 36], [12, 37], [12, 38], [12, 39], [11, 21], [11, 21], [12, 42], [12, 43], [10, 0], [10, 0], [10, 0], [10, 0], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12]];\n  const blackTable3 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [6, 9], [6, 8], [5, 7], [5, 7], [4, 6], [4, 6], [4, 6], [4, 6], [4, 5], [4, 5], [4, 5], [4, 5], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 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]];\n\n  function CCITTFaxDecoder(source, options = {}) {\n    if (!source || typeof source.next !== \"function\") {\n      throw new Error('CCITTFaxDecoder - invalid \"source\" parameter.');\n    }\n\n    this.source = source;\n    this.eof = false;\n    this.encoding = options.K || 0;\n    this.eoline = options.EndOfLine || false;\n    this.byteAlign = options.EncodedByteAlign || false;\n    this.columns = options.Columns || 1728;\n    this.rows = options.Rows || 0;\n    let eoblock = options.EndOfBlock;\n\n    if (eoblock === null || eoblock === undefined) {\n      eoblock = true;\n    }\n\n    this.eoblock = eoblock;\n    this.black = options.BlackIs1 || false;\n    this.codingLine = new Uint32Array(this.columns + 1);\n    this.refLine = new Uint32Array(this.columns + 2);\n    this.codingLine[0] = this.columns;\n    this.codingPos = 0;\n    this.row = 0;\n    this.nextLine2D = this.encoding < 0;\n    this.inputBits = 0;\n    this.inputBuf = 0;\n    this.outputBits = 0;\n    this.rowsDone = false;\n    let code1;\n\n    while ((code1 = this._lookBits(12)) === 0) {\n      this._eatBits(1);\n    }\n\n    if (code1 === 1) {\n      this._eatBits(12);\n    }\n\n    if (this.encoding > 0) {\n      this.nextLine2D = !this._lookBits(1);\n\n      this._eatBits(1);\n    }\n  }\n\n  CCITTFaxDecoder.prototype = {\n    readNextChar() {\n      if (this.eof) {\n        return -1;\n      }\n\n      const refLine = this.refLine;\n      const codingLine = this.codingLine;\n      const columns = this.columns;\n      let refPos, blackPixels, bits, i;\n\n      if (this.outputBits === 0) {\n        if (this.rowsDone) {\n          this.eof = true;\n        }\n\n        if (this.eof) {\n          return -1;\n        }\n\n        this.err = false;\n        let code1, code2, code3;\n\n        if (this.nextLine2D) {\n          for (i = 0; codingLine[i] < columns; ++i) {\n            refLine[i] = codingLine[i];\n          }\n\n          refLine[i++] = columns;\n          refLine[i] = columns;\n          codingLine[0] = 0;\n          this.codingPos = 0;\n          refPos = 0;\n          blackPixels = 0;\n\n          while (codingLine[this.codingPos] < columns) {\n            code1 = this._getTwoDimCode();\n\n            switch (code1) {\n              case twoDimPass:\n                this._addPixels(refLine[refPos + 1], blackPixels);\n\n                if (refLine[refPos + 1] < columns) {\n                  refPos += 2;\n                }\n\n                break;\n\n              case twoDimHoriz:\n                code1 = code2 = 0;\n\n                if (blackPixels) {\n                  do {\n                    code1 += code3 = this._getBlackCode();\n                  } while (code3 >= 64);\n\n                  do {\n                    code2 += code3 = this._getWhiteCode();\n                  } while (code3 >= 64);\n                } else {\n                  do {\n                    code1 += code3 = this._getWhiteCode();\n                  } while (code3 >= 64);\n\n                  do {\n                    code2 += code3 = this._getBlackCode();\n                  } while (code3 >= 64);\n                }\n\n                this._addPixels(codingLine[this.codingPos] + code1, blackPixels);\n\n                if (codingLine[this.codingPos] < columns) {\n                  this._addPixels(codingLine[this.codingPos] + code2, blackPixels ^ 1);\n                }\n\n                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n\n                break;\n\n              case twoDimVertR3:\n                this._addPixels(refLine[refPos] + 3, blackPixels);\n\n                blackPixels ^= 1;\n\n                if (codingLine[this.codingPos] < columns) {\n                  ++refPos;\n\n                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                    refPos += 2;\n                  }\n                }\n\n                break;\n\n              case twoDimVertR2:\n                this._addPixels(refLine[refPos] + 2, blackPixels);\n\n                blackPixels ^= 1;\n\n                if (codingLine[this.codingPos] < columns) {\n                  ++refPos;\n\n                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                    refPos += 2;\n                  }\n                }\n\n                break;\n\n              case twoDimVertR1:\n                this._addPixels(refLine[refPos] + 1, blackPixels);\n\n                blackPixels ^= 1;\n\n                if (codingLine[this.codingPos] < columns) {\n                  ++refPos;\n\n                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                    refPos += 2;\n                  }\n                }\n\n                break;\n\n              case twoDimVert0:\n                this._addPixels(refLine[refPos], blackPixels);\n\n                blackPixels ^= 1;\n\n                if (codingLine[this.codingPos] < columns) {\n                  ++refPos;\n\n                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                    refPos += 2;\n                  }\n                }\n\n                break;\n\n              case twoDimVertL3:\n                this._addPixelsNeg(refLine[refPos] - 3, blackPixels);\n\n                blackPixels ^= 1;\n\n                if (codingLine[this.codingPos] < columns) {\n                  if (refPos > 0) {\n                    --refPos;\n                  } else {\n                    ++refPos;\n                  }\n\n                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                    refPos += 2;\n                  }\n                }\n\n                break;\n\n              case twoDimVertL2:\n                this._addPixelsNeg(refLine[refPos] - 2, blackPixels);\n\n                blackPixels ^= 1;\n\n                if (codingLine[this.codingPos] < columns) {\n                  if (refPos > 0) {\n                    --refPos;\n                  } else {\n                    ++refPos;\n                  }\n\n                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                    refPos += 2;\n                  }\n                }\n\n                break;\n\n              case twoDimVertL1:\n                this._addPixelsNeg(refLine[refPos] - 1, blackPixels);\n\n                blackPixels ^= 1;\n\n                if (codingLine[this.codingPos] < columns) {\n                  if (refPos > 0) {\n                    --refPos;\n                  } else {\n                    ++refPos;\n                  }\n\n                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                    refPos += 2;\n                  }\n                }\n\n                break;\n\n              case ccittEOF:\n                this._addPixels(columns, 0);\n\n                this.eof = true;\n                break;\n\n              default:\n                (0, _util.info)(\"bad 2d code\");\n\n                this._addPixels(columns, 0);\n\n                this.err = true;\n            }\n          }\n        } else {\n          codingLine[0] = 0;\n          this.codingPos = 0;\n          blackPixels = 0;\n\n          while (codingLine[this.codingPos] < columns) {\n            code1 = 0;\n\n            if (blackPixels) {\n              do {\n                code1 += code3 = this._getBlackCode();\n              } while (code3 >= 64);\n            } else {\n              do {\n                code1 += code3 = this._getWhiteCode();\n              } while (code3 >= 64);\n            }\n\n            this._addPixels(codingLine[this.codingPos] + code1, blackPixels);\n\n            blackPixels ^= 1;\n          }\n        }\n\n        let gotEOL = false;\n\n        if (this.byteAlign) {\n          this.inputBits &= ~7;\n        }\n\n        if (!this.eoblock && this.row === this.rows - 1) {\n          this.rowsDone = true;\n        } else {\n          code1 = this._lookBits(12);\n\n          if (this.eoline) {\n            while (code1 !== ccittEOF && code1 !== 1) {\n              this._eatBits(1);\n\n              code1 = this._lookBits(12);\n            }\n          } else {\n            while (code1 === 0) {\n              this._eatBits(1);\n\n              code1 = this._lookBits(12);\n            }\n          }\n\n          if (code1 === 1) {\n            this._eatBits(12);\n\n            gotEOL = true;\n          } else if (code1 === ccittEOF) {\n            this.eof = true;\n          }\n        }\n\n        if (!this.eof && this.encoding > 0 && !this.rowsDone) {\n          this.nextLine2D = !this._lookBits(1);\n\n          this._eatBits(1);\n        }\n\n        if (this.eoblock && gotEOL && this.byteAlign) {\n          code1 = this._lookBits(12);\n\n          if (code1 === 1) {\n            this._eatBits(12);\n\n            if (this.encoding > 0) {\n              this._lookBits(1);\n\n              this._eatBits(1);\n            }\n\n            if (this.encoding >= 0) {\n              for (i = 0; i < 4; ++i) {\n                code1 = this._lookBits(12);\n\n                if (code1 !== 1) {\n                  (0, _util.info)(\"bad rtc code: \" + code1);\n                }\n\n                this._eatBits(12);\n\n                if (this.encoding > 0) {\n                  this._lookBits(1);\n\n                  this._eatBits(1);\n                }\n              }\n            }\n\n            this.eof = true;\n          }\n        } else if (this.err && this.eoline) {\n          while (true) {\n            code1 = this._lookBits(13);\n\n            if (code1 === ccittEOF) {\n              this.eof = true;\n              return -1;\n            }\n\n            if (code1 >> 1 === 1) {\n              break;\n            }\n\n            this._eatBits(1);\n          }\n\n          this._eatBits(12);\n\n          if (this.encoding > 0) {\n            this._eatBits(1);\n\n            this.nextLine2D = !(code1 & 1);\n          }\n        }\n\n        if (codingLine[0] > 0) {\n          this.outputBits = codingLine[this.codingPos = 0];\n        } else {\n          this.outputBits = codingLine[this.codingPos = 1];\n        }\n\n        this.row++;\n      }\n\n      let c;\n\n      if (this.outputBits >= 8) {\n        c = this.codingPos & 1 ? 0 : 0xff;\n        this.outputBits -= 8;\n\n        if (this.outputBits === 0 && codingLine[this.codingPos] < columns) {\n          this.codingPos++;\n          this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1];\n        }\n      } else {\n        bits = 8;\n        c = 0;\n\n        do {\n          if (this.outputBits > bits) {\n            c <<= bits;\n\n            if (!(this.codingPos & 1)) {\n              c |= 0xff >> 8 - bits;\n            }\n\n            this.outputBits -= bits;\n            bits = 0;\n          } else {\n            c <<= this.outputBits;\n\n            if (!(this.codingPos & 1)) {\n              c |= 0xff >> 8 - this.outputBits;\n            }\n\n            bits -= this.outputBits;\n            this.outputBits = 0;\n\n            if (codingLine[this.codingPos] < columns) {\n              this.codingPos++;\n              this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1];\n            } else if (bits > 0) {\n              c <<= bits;\n              bits = 0;\n            }\n          }\n        } while (bits);\n      }\n\n      if (this.black) {\n        c ^= 0xff;\n      }\n\n      return c;\n    },\n\n    _addPixels(a1, blackPixels) {\n      const codingLine = this.codingLine;\n      let codingPos = this.codingPos;\n\n      if (a1 > codingLine[codingPos]) {\n        if (a1 > this.columns) {\n          (0, _util.info)(\"row is wrong length\");\n          this.err = true;\n          a1 = this.columns;\n        }\n\n        if (codingPos & 1 ^ blackPixels) {\n          ++codingPos;\n        }\n\n        codingLine[codingPos] = a1;\n      }\n\n      this.codingPos = codingPos;\n    },\n\n    _addPixelsNeg(a1, blackPixels) {\n      const codingLine = this.codingLine;\n      let codingPos = this.codingPos;\n\n      if (a1 > codingLine[codingPos]) {\n        if (a1 > this.columns) {\n          (0, _util.info)(\"row is wrong length\");\n          this.err = true;\n          a1 = this.columns;\n        }\n\n        if (codingPos & 1 ^ blackPixels) {\n          ++codingPos;\n        }\n\n        codingLine[codingPos] = a1;\n      } else if (a1 < codingLine[codingPos]) {\n        if (a1 < 0) {\n          (0, _util.info)(\"invalid code\");\n          this.err = true;\n          a1 = 0;\n        }\n\n        while (codingPos > 0 && a1 < codingLine[codingPos - 1]) {\n          --codingPos;\n        }\n\n        codingLine[codingPos] = a1;\n      }\n\n      this.codingPos = codingPos;\n    },\n\n    _findTableCode(start, end, table, limit) {\n      const limitValue = limit || 0;\n\n      for (let i = start; i <= end; ++i) {\n        let code = this._lookBits(i);\n\n        if (code === ccittEOF) {\n          return [true, 1, false];\n        }\n\n        if (i < end) {\n          code <<= end - i;\n        }\n\n        if (!limitValue || code >= limitValue) {\n          const p = table[code - limitValue];\n\n          if (p[0] === i) {\n            this._eatBits(i);\n\n            return [true, p[1], true];\n          }\n        }\n      }\n\n      return [false, 0, false];\n    },\n\n    _getTwoDimCode() {\n      let code = 0;\n      let p;\n\n      if (this.eoblock) {\n        code = this._lookBits(7);\n        p = twoDimTable[code];\n\n        if (p && p[0] > 0) {\n          this._eatBits(p[0]);\n\n          return p[1];\n        }\n      } else {\n        const result = this._findTableCode(1, 7, twoDimTable);\n\n        if (result[0] && result[2]) {\n          return result[1];\n        }\n      }\n\n      (0, _util.info)(\"Bad two dim code\");\n      return ccittEOF;\n    },\n\n    _getWhiteCode() {\n      let code = 0;\n      let p;\n\n      if (this.eoblock) {\n        code = this._lookBits(12);\n\n        if (code === ccittEOF) {\n          return 1;\n        }\n\n        if (code >> 5 === 0) {\n          p = whiteTable1[code];\n        } else {\n          p = whiteTable2[code >> 3];\n        }\n\n        if (p[0] > 0) {\n          this._eatBits(p[0]);\n\n          return p[1];\n        }\n      } else {\n        let result = this._findTableCode(1, 9, whiteTable2);\n\n        if (result[0]) {\n          return result[1];\n        }\n\n        result = this._findTableCode(11, 12, whiteTable1);\n\n        if (result[0]) {\n          return result[1];\n        }\n      }\n\n      (0, _util.info)(\"bad white code\");\n\n      this._eatBits(1);\n\n      return 1;\n    },\n\n    _getBlackCode() {\n      let code, p;\n\n      if (this.eoblock) {\n        code = this._lookBits(13);\n\n        if (code === ccittEOF) {\n          return 1;\n        }\n\n        if (code >> 7 === 0) {\n          p = blackTable1[code];\n        } else if (code >> 9 === 0 && code >> 7 !== 0) {\n          p = blackTable2[(code >> 1) - 64];\n        } else {\n          p = blackTable3[code >> 7];\n        }\n\n        if (p[0] > 0) {\n          this._eatBits(p[0]);\n\n          return p[1];\n        }\n      } else {\n        let result = this._findTableCode(2, 6, blackTable3);\n\n        if (result[0]) {\n          return result[1];\n        }\n\n        result = this._findTableCode(7, 12, blackTable2, 64);\n\n        if (result[0]) {\n          return result[1];\n        }\n\n        result = this._findTableCode(10, 13, blackTable1);\n\n        if (result[0]) {\n          return result[1];\n        }\n      }\n\n      (0, _util.info)(\"bad black code\");\n\n      this._eatBits(1);\n\n      return 1;\n    },\n\n    _lookBits(n) {\n      let c;\n\n      while (this.inputBits < n) {\n        if ((c = this.source.next()) === -1) {\n          if (this.inputBits === 0) {\n            return ccittEOF;\n          }\n\n          return this.inputBuf << n - this.inputBits & 0xffff >> 16 - n;\n        }\n\n        this.inputBuf = this.inputBuf << 8 | c;\n        this.inputBits += 8;\n      }\n\n      return this.inputBuf >> this.inputBits - n & 0xffff >> 16 - n;\n    },\n\n    _eatBits(n) {\n      if ((this.inputBits -= n) < 0) {\n        this.inputBits = 0;\n      }\n    }\n\n  };\n  return CCITTFaxDecoder;\n}();\n\nexports.CCITTFaxDecoder = CCITTFaxDecoder;\n\n/***/ }),\n/* 15 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.Jbig2Stream = void 0;\n\nvar _primitives = __w_pdfjs_require__(5);\n\nvar _stream = __w_pdfjs_require__(12);\n\nvar _jbig = __w_pdfjs_require__(16);\n\nvar _util = __w_pdfjs_require__(2);\n\nconst Jbig2Stream = function Jbig2StreamClosure() {\n  function Jbig2Stream(stream, maybeLength, dict, params) {\n    this.stream = stream;\n    this.maybeLength = maybeLength;\n    this.dict = dict;\n    this.params = params;\n\n    _stream.DecodeStream.call(this, maybeLength);\n  }\n\n  Jbig2Stream.prototype = Object.create(_stream.DecodeStream.prototype);\n  Object.defineProperty(Jbig2Stream.prototype, \"bytes\", {\n    get() {\n      return (0, _util.shadow)(this, \"bytes\", this.stream.getBytes(this.maybeLength));\n    },\n\n    configurable: true\n  });\n\n  Jbig2Stream.prototype.ensureBuffer = function (requested) {};\n\n  Jbig2Stream.prototype.readBlock = function () {\n    if (this.eof) {\n      return;\n    }\n\n    const jbig2Image = new _jbig.Jbig2Image();\n    const chunks = [];\n\n    if ((0, _primitives.isDict)(this.params)) {\n      const globalsStream = this.params.get(\"JBIG2Globals\");\n\n      if ((0, _primitives.isStream)(globalsStream)) {\n        const globals = globalsStream.getBytes();\n        chunks.push({\n          data: globals,\n          start: 0,\n          end: globals.length\n        });\n      }\n    }\n\n    chunks.push({\n      data: this.bytes,\n      start: 0,\n      end: this.bytes.length\n    });\n    const data = jbig2Image.parseChunks(chunks);\n    const dataLength = data.length;\n\n    for (let i = 0; i < dataLength; i++) {\n      data[i] ^= 0xff;\n    }\n\n    this.buffer = data;\n    this.bufferLength = dataLength;\n    this.eof = true;\n  };\n\n  return Jbig2Stream;\n}();\n\nexports.Jbig2Stream = Jbig2Stream;\n\n/***/ }),\n/* 16 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.Jbig2Image = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nvar _arithmetic_decoder = __w_pdfjs_require__(17);\n\nvar _ccitt = __w_pdfjs_require__(14);\n\nclass Jbig2Error extends _util.BaseException {\n  constructor(msg) {\n    super(`JBIG2 error: ${msg}`);\n  }\n\n}\n\nvar Jbig2Image = function Jbig2ImageClosure() {\n  function ContextCache() {}\n\n  ContextCache.prototype = {\n    getContexts(id) {\n      if (id in this) {\n        return this[id];\n      }\n\n      return this[id] = new Int8Array(1 << 16);\n    }\n\n  };\n\n  function DecodingContext(data, start, end) {\n    this.data = data;\n    this.start = start;\n    this.end = end;\n  }\n\n  DecodingContext.prototype = {\n    get decoder() {\n      var decoder = new _arithmetic_decoder.ArithmeticDecoder(this.data, this.start, this.end);\n      return (0, _util.shadow)(this, \"decoder\", decoder);\n    },\n\n    get contextCache() {\n      var cache = new ContextCache();\n      return (0, _util.shadow)(this, \"contextCache\", cache);\n    }\n\n  };\n\n  function decodeInteger(contextCache, procedure, decoder) {\n    var contexts = contextCache.getContexts(procedure);\n    var prev = 1;\n\n    function readBits(length) {\n      var v = 0;\n\n      for (var i = 0; i < length; i++) {\n        var bit = decoder.readBit(contexts, prev);\n        prev = prev < 256 ? prev << 1 | bit : (prev << 1 | bit) & 511 | 256;\n        v = v << 1 | bit;\n      }\n\n      return v >>> 0;\n    }\n\n    var sign = readBits(1);\n    var value = readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(32) + 4436 : readBits(12) + 340 : readBits(8) + 84 : readBits(6) + 20 : readBits(4) + 4 : readBits(2);\n\n    if (sign === 0) {\n      return value;\n    } else if (value > 0) {\n      return -value;\n    }\n\n    return null;\n  }\n\n  function decodeIAID(contextCache, decoder, codeLength) {\n    var contexts = contextCache.getContexts(\"IAID\");\n    var prev = 1;\n\n    for (var i = 0; i < codeLength; i++) {\n      var bit = decoder.readBit(contexts, prev);\n      prev = prev << 1 | bit;\n    }\n\n    if (codeLength < 31) {\n      return prev & (1 << codeLength) - 1;\n    }\n\n    return prev & 0x7fffffff;\n  }\n\n  var SegmentTypes = [\"SymbolDictionary\", null, null, null, \"IntermediateTextRegion\", null, \"ImmediateTextRegion\", \"ImmediateLosslessTextRegion\", null, null, null, null, null, null, null, null, \"PatternDictionary\", null, null, null, \"IntermediateHalftoneRegion\", null, \"ImmediateHalftoneRegion\", \"ImmediateLosslessHalftoneRegion\", null, null, null, null, null, null, null, null, null, null, null, null, \"IntermediateGenericRegion\", null, \"ImmediateGenericRegion\", \"ImmediateLosslessGenericRegion\", \"IntermediateGenericRefinementRegion\", null, \"ImmediateGenericRefinementRegion\", \"ImmediateLosslessGenericRefinementRegion\", null, null, null, null, \"PageInformation\", \"EndOfPage\", \"EndOfStripe\", \"EndOfFile\", \"Profiles\", \"Tables\", null, null, null, null, null, null, null, null, \"Extension\"];\n  var CodingTemplates = [[{\n    x: -1,\n    y: -2\n  }, {\n    x: 0,\n    y: -2\n  }, {\n    x: 1,\n    y: -2\n  }, {\n    x: -2,\n    y: -1\n  }, {\n    x: -1,\n    y: -1\n  }, {\n    x: 0,\n    y: -1\n  }, {\n    x: 1,\n    y: -1\n  }, {\n    x: 2,\n    y: -1\n  }, {\n    x: -4,\n    y: 0\n  }, {\n    x: -3,\n    y: 0\n  }, {\n    x: -2,\n    y: 0\n  }, {\n    x: -1,\n    y: 0\n  }], [{\n    x: -1,\n    y: -2\n  }, {\n    x: 0,\n    y: -2\n  }, {\n    x: 1,\n    y: -2\n  }, {\n    x: 2,\n    y: -2\n  }, {\n    x: -2,\n    y: -1\n  }, {\n    x: -1,\n    y: -1\n  }, {\n    x: 0,\n    y: -1\n  }, {\n    x: 1,\n    y: -1\n  }, {\n    x: 2,\n    y: -1\n  }, {\n    x: -3,\n    y: 0\n  }, {\n    x: -2,\n    y: 0\n  }, {\n    x: -1,\n    y: 0\n  }], [{\n    x: -1,\n    y: -2\n  }, {\n    x: 0,\n    y: -2\n  }, {\n    x: 1,\n    y: -2\n  }, {\n    x: -2,\n    y: -1\n  }, {\n    x: -1,\n    y: -1\n  }, {\n    x: 0,\n    y: -1\n  }, {\n    x: 1,\n    y: -1\n  }, {\n    x: -2,\n    y: 0\n  }, {\n    x: -1,\n    y: 0\n  }], [{\n    x: -3,\n    y: -1\n  }, {\n    x: -2,\n    y: -1\n  }, {\n    x: -1,\n    y: -1\n  }, {\n    x: 0,\n    y: -1\n  }, {\n    x: 1,\n    y: -1\n  }, {\n    x: -4,\n    y: 0\n  }, {\n    x: -3,\n    y: 0\n  }, {\n    x: -2,\n    y: 0\n  }, {\n    x: -1,\n    y: 0\n  }]];\n  var RefinementTemplates = [{\n    coding: [{\n      x: 0,\n      y: -1\n    }, {\n      x: 1,\n      y: -1\n    }, {\n      x: -1,\n      y: 0\n    }],\n    reference: [{\n      x: 0,\n      y: -1\n    }, {\n      x: 1,\n      y: -1\n    }, {\n      x: -1,\n      y: 0\n    }, {\n      x: 0,\n      y: 0\n    }, {\n      x: 1,\n      y: 0\n    }, {\n      x: -1,\n      y: 1\n    }, {\n      x: 0,\n      y: 1\n    }, {\n      x: 1,\n      y: 1\n    }]\n  }, {\n    coding: [{\n      x: -1,\n      y: -1\n    }, {\n      x: 0,\n      y: -1\n    }, {\n      x: 1,\n      y: -1\n    }, {\n      x: -1,\n      y: 0\n    }],\n    reference: [{\n      x: 0,\n      y: -1\n    }, {\n      x: -1,\n      y: 0\n    }, {\n      x: 0,\n      y: 0\n    }, {\n      x: 1,\n      y: 0\n    }, {\n      x: 0,\n      y: 1\n    }, {\n      x: 1,\n      y: 1\n    }]\n  }];\n  var ReusedContexts = [0x9b25, 0x0795, 0x00e5, 0x0195];\n  var RefinementReusedContexts = [0x0020, 0x0008];\n\n  function decodeBitmapTemplate0(width, height, decodingContext) {\n    var decoder = decodingContext.decoder;\n    var contexts = decodingContext.contextCache.getContexts(\"GB\");\n    var contextLabel,\n        i,\n        j,\n        pixel,\n        row,\n        row1,\n        row2,\n        bitmap = [];\n    var OLD_PIXEL_MASK = 0x7bf7;\n\n    for (i = 0; i < height; i++) {\n      row = bitmap[i] = new Uint8Array(width);\n      row1 = i < 1 ? row : bitmap[i - 1];\n      row2 = i < 2 ? row : bitmap[i - 2];\n      contextLabel = row2[0] << 13 | row2[1] << 12 | row2[2] << 11 | row1[0] << 7 | row1[1] << 6 | row1[2] << 5 | row1[3] << 4;\n\n      for (j = 0; j < width; j++) {\n        row[j] = pixel = decoder.readBit(contexts, contextLabel);\n        contextLabel = (contextLabel & OLD_PIXEL_MASK) << 1 | (j + 3 < width ? row2[j + 3] << 11 : 0) | (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel;\n      }\n    }\n\n    return bitmap;\n  }\n\n  function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, decodingContext) {\n    if (mmr) {\n      const input = new Reader(decodingContext.data, decodingContext.start, decodingContext.end);\n      return decodeMMRBitmap(input, width, height, false);\n    }\n\n    if (templateIndex === 0 && !skip && !prediction && at.length === 4 && at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 && at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) {\n      return decodeBitmapTemplate0(width, height, decodingContext);\n    }\n\n    var useskip = !!skip;\n    var template = CodingTemplates[templateIndex].concat(at);\n    template.sort(function (a, b) {\n      return a.y - b.y || a.x - b.x;\n    });\n    var templateLength = template.length;\n    var templateX = new Int8Array(templateLength);\n    var templateY = new Int8Array(templateLength);\n    var changingTemplateEntries = [];\n    var reuseMask = 0,\n        minX = 0,\n        maxX = 0,\n        minY = 0;\n    var c, k;\n\n    for (k = 0; k < templateLength; k++) {\n      templateX[k] = template[k].x;\n      templateY[k] = template[k].y;\n      minX = Math.min(minX, template[k].x);\n      maxX = Math.max(maxX, template[k].x);\n      minY = Math.min(minY, template[k].y);\n\n      if (k < templateLength - 1 && template[k].y === template[k + 1].y && template[k].x === template[k + 1].x - 1) {\n        reuseMask |= 1 << templateLength - 1 - k;\n      } else {\n        changingTemplateEntries.push(k);\n      }\n    }\n\n    var changingEntriesLength = changingTemplateEntries.length;\n    var changingTemplateX = new Int8Array(changingEntriesLength);\n    var changingTemplateY = new Int8Array(changingEntriesLength);\n    var changingTemplateBit = new Uint16Array(changingEntriesLength);\n\n    for (c = 0; c < changingEntriesLength; c++) {\n      k = changingTemplateEntries[c];\n      changingTemplateX[c] = template[k].x;\n      changingTemplateY[c] = template[k].y;\n      changingTemplateBit[c] = 1 << templateLength - 1 - k;\n    }\n\n    var sbb_left = -minX;\n    var sbb_top = -minY;\n    var sbb_right = width - maxX;\n    var pseudoPixelContext = ReusedContexts[templateIndex];\n    var row = new Uint8Array(width);\n    var bitmap = [];\n    var decoder = decodingContext.decoder;\n    var contexts = decodingContext.contextCache.getContexts(\"GB\");\n    var ltp = 0,\n        j,\n        i0,\n        j0,\n        contextLabel = 0,\n        bit,\n        shift;\n\n    for (var i = 0; i < height; i++) {\n      if (prediction) {\n        var sltp = decoder.readBit(contexts, pseudoPixelContext);\n        ltp ^= sltp;\n\n        if (ltp) {\n          bitmap.push(row);\n          continue;\n        }\n      }\n\n      row = new Uint8Array(row);\n      bitmap.push(row);\n\n      for (j = 0; j < width; j++) {\n        if (useskip && skip[i][j]) {\n          row[j] = 0;\n          continue;\n        }\n\n        if (j >= sbb_left && j < sbb_right && i >= sbb_top) {\n          contextLabel = contextLabel << 1 & reuseMask;\n\n          for (k = 0; k < changingEntriesLength; k++) {\n            i0 = i + changingTemplateY[k];\n            j0 = j + changingTemplateX[k];\n            bit = bitmap[i0][j0];\n\n            if (bit) {\n              bit = changingTemplateBit[k];\n              contextLabel |= bit;\n            }\n          }\n        } else {\n          contextLabel = 0;\n          shift = templateLength - 1;\n\n          for (k = 0; k < templateLength; k++, shift--) {\n            j0 = j + templateX[k];\n\n            if (j0 >= 0 && j0 < width) {\n              i0 = i + templateY[k];\n\n              if (i0 >= 0) {\n                bit = bitmap[i0][j0];\n\n                if (bit) {\n                  contextLabel |= bit << shift;\n                }\n              }\n            }\n          }\n        }\n\n        var pixel = decoder.readBit(contexts, contextLabel);\n        row[j] = pixel;\n      }\n    }\n\n    return bitmap;\n  }\n\n  function decodeRefinement(width, height, templateIndex, referenceBitmap, offsetX, offsetY, prediction, at, decodingContext) {\n    var codingTemplate = RefinementTemplates[templateIndex].coding;\n\n    if (templateIndex === 0) {\n      codingTemplate = codingTemplate.concat([at[0]]);\n    }\n\n    var codingTemplateLength = codingTemplate.length;\n    var codingTemplateX = new Int32Array(codingTemplateLength);\n    var codingTemplateY = new Int32Array(codingTemplateLength);\n    var k;\n\n    for (k = 0; k < codingTemplateLength; k++) {\n      codingTemplateX[k] = codingTemplate[k].x;\n      codingTemplateY[k] = codingTemplate[k].y;\n    }\n\n    var referenceTemplate = RefinementTemplates[templateIndex].reference;\n\n    if (templateIndex === 0) {\n      referenceTemplate = referenceTemplate.concat([at[1]]);\n    }\n\n    var referenceTemplateLength = referenceTemplate.length;\n    var referenceTemplateX = new Int32Array(referenceTemplateLength);\n    var referenceTemplateY = new Int32Array(referenceTemplateLength);\n\n    for (k = 0; k < referenceTemplateLength; k++) {\n      referenceTemplateX[k] = referenceTemplate[k].x;\n      referenceTemplateY[k] = referenceTemplate[k].y;\n    }\n\n    var referenceWidth = referenceBitmap[0].length;\n    var referenceHeight = referenceBitmap.length;\n    var pseudoPixelContext = RefinementReusedContexts[templateIndex];\n    var bitmap = [];\n    var decoder = decodingContext.decoder;\n    var contexts = decodingContext.contextCache.getContexts(\"GR\");\n    var ltp = 0;\n\n    for (var i = 0; i < height; i++) {\n      if (prediction) {\n        var sltp = decoder.readBit(contexts, pseudoPixelContext);\n        ltp ^= sltp;\n\n        if (ltp) {\n          throw new Jbig2Error(\"prediction is not supported\");\n        }\n      }\n\n      var row = new Uint8Array(width);\n      bitmap.push(row);\n\n      for (var j = 0; j < width; j++) {\n        var i0, j0;\n        var contextLabel = 0;\n\n        for (k = 0; k < codingTemplateLength; k++) {\n          i0 = i + codingTemplateY[k];\n          j0 = j + codingTemplateX[k];\n\n          if (i0 < 0 || j0 < 0 || j0 >= width) {\n            contextLabel <<= 1;\n          } else {\n            contextLabel = contextLabel << 1 | bitmap[i0][j0];\n          }\n        }\n\n        for (k = 0; k < referenceTemplateLength; k++) {\n          i0 = i + referenceTemplateY[k] - offsetY;\n          j0 = j + referenceTemplateX[k] - offsetX;\n\n          if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || j0 >= referenceWidth) {\n            contextLabel <<= 1;\n          } else {\n            contextLabel = contextLabel << 1 | referenceBitmap[i0][j0];\n          }\n        }\n\n        var pixel = decoder.readBit(contexts, contextLabel);\n        row[j] = pixel;\n      }\n    }\n\n    return bitmap;\n  }\n\n  function decodeSymbolDictionary(huffman, refinement, symbols, numberOfNewSymbols, numberOfExportedSymbols, huffmanTables, templateIndex, at, refinementTemplateIndex, refinementAt, decodingContext, huffmanInput) {\n    if (huffman && refinement) {\n      throw new Jbig2Error(\"symbol refinement with Huffman is not supported\");\n    }\n\n    var newSymbols = [];\n    var currentHeight = 0;\n    var symbolCodeLength = (0, _core_utils.log2)(symbols.length + numberOfNewSymbols);\n    var decoder = decodingContext.decoder;\n    var contextCache = decodingContext.contextCache;\n    let tableB1, symbolWidths;\n\n    if (huffman) {\n      tableB1 = getStandardTable(1);\n      symbolWidths = [];\n      symbolCodeLength = Math.max(symbolCodeLength, 1);\n    }\n\n    while (newSymbols.length < numberOfNewSymbols) {\n      var deltaHeight = huffman ? huffmanTables.tableDeltaHeight.decode(huffmanInput) : decodeInteger(contextCache, \"IADH\", decoder);\n      currentHeight += deltaHeight;\n      let currentWidth = 0,\n          totalWidth = 0;\n      const firstSymbol = huffman ? symbolWidths.length : 0;\n\n      while (true) {\n        var deltaWidth = huffman ? huffmanTables.tableDeltaWidth.decode(huffmanInput) : decodeInteger(contextCache, \"IADW\", decoder);\n\n        if (deltaWidth === null) {\n          break;\n        }\n\n        currentWidth += deltaWidth;\n        totalWidth += currentWidth;\n        var bitmap;\n\n        if (refinement) {\n          var numberOfInstances = decodeInteger(contextCache, \"IAAI\", decoder);\n\n          if (numberOfInstances > 1) {\n            bitmap = decodeTextRegion(huffman, refinement, currentWidth, currentHeight, 0, numberOfInstances, 1, symbols.concat(newSymbols), symbolCodeLength, 0, 0, 1, 0, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, 0, huffmanInput);\n          } else {\n            var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);\n            var rdx = decodeInteger(contextCache, \"IARDX\", decoder);\n            var rdy = decodeInteger(contextCache, \"IARDY\", decoder);\n            var symbol = symbolId < symbols.length ? symbols[symbolId] : newSymbols[symbolId - symbols.length];\n            bitmap = decodeRefinement(currentWidth, currentHeight, refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt, decodingContext);\n          }\n\n          newSymbols.push(bitmap);\n        } else if (huffman) {\n          symbolWidths.push(currentWidth);\n        } else {\n          bitmap = decodeBitmap(false, currentWidth, currentHeight, templateIndex, false, null, at, decodingContext);\n          newSymbols.push(bitmap);\n        }\n      }\n\n      if (huffman && !refinement) {\n        const bitmapSize = huffmanTables.tableBitmapSize.decode(huffmanInput);\n        huffmanInput.byteAlign();\n        let collectiveBitmap;\n\n        if (bitmapSize === 0) {\n          collectiveBitmap = readUncompressedBitmap(huffmanInput, totalWidth, currentHeight);\n        } else {\n          const originalEnd = huffmanInput.end;\n          const bitmapEnd = huffmanInput.position + bitmapSize;\n          huffmanInput.end = bitmapEnd;\n          collectiveBitmap = decodeMMRBitmap(huffmanInput, totalWidth, currentHeight, false);\n          huffmanInput.end = originalEnd;\n          huffmanInput.position = bitmapEnd;\n        }\n\n        const numberOfSymbolsDecoded = symbolWidths.length;\n\n        if (firstSymbol === numberOfSymbolsDecoded - 1) {\n          newSymbols.push(collectiveBitmap);\n        } else {\n          let i,\n              y,\n              xMin = 0,\n              xMax,\n              bitmapWidth,\n              symbolBitmap;\n\n          for (i = firstSymbol; i < numberOfSymbolsDecoded; i++) {\n            bitmapWidth = symbolWidths[i];\n            xMax = xMin + bitmapWidth;\n            symbolBitmap = [];\n\n            for (y = 0; y < currentHeight; y++) {\n              symbolBitmap.push(collectiveBitmap[y].subarray(xMin, xMax));\n            }\n\n            newSymbols.push(symbolBitmap);\n            xMin = xMax;\n          }\n        }\n      }\n    }\n\n    var exportedSymbols = [];\n    var flags = [],\n        currentFlag = false;\n    var totalSymbolsLength = symbols.length + numberOfNewSymbols;\n\n    while (flags.length < totalSymbolsLength) {\n      var runLength = huffman ? tableB1.decode(huffmanInput) : decodeInteger(contextCache, \"IAEX\", decoder);\n\n      while (runLength--) {\n        flags.push(currentFlag);\n      }\n\n      currentFlag = !currentFlag;\n    }\n\n    for (var i = 0, ii = symbols.length; i < ii; i++) {\n      if (flags[i]) {\n        exportedSymbols.push(symbols[i]);\n      }\n    }\n\n    for (var j = 0; j < numberOfNewSymbols; i++, j++) {\n      if (flags[i]) {\n        exportedSymbols.push(newSymbols[j]);\n      }\n    }\n\n    return exportedSymbols;\n  }\n\n  function decodeTextRegion(huffman, refinement, width, height, defaultPixelValue, numberOfSymbolInstances, stripSize, inputSymbols, symbolCodeLength, transposed, dsOffset, referenceCorner, combinationOperator, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, logStripSize, huffmanInput) {\n    if (huffman && refinement) {\n      throw new Jbig2Error(\"refinement with Huffman is not supported\");\n    }\n\n    var bitmap = [];\n    var i, row;\n\n    for (i = 0; i < height; i++) {\n      row = new Uint8Array(width);\n\n      if (defaultPixelValue) {\n        for (var j = 0; j < width; j++) {\n          row[j] = defaultPixelValue;\n        }\n      }\n\n      bitmap.push(row);\n    }\n\n    var decoder = decodingContext.decoder;\n    var contextCache = decodingContext.contextCache;\n    var stripT = huffman ? -huffmanTables.tableDeltaT.decode(huffmanInput) : -decodeInteger(contextCache, \"IADT\", decoder);\n    var firstS = 0;\n    i = 0;\n\n    while (i < numberOfSymbolInstances) {\n      var deltaT = huffman ? huffmanTables.tableDeltaT.decode(huffmanInput) : decodeInteger(contextCache, \"IADT\", decoder);\n      stripT += deltaT;\n      var deltaFirstS = huffman ? huffmanTables.tableFirstS.decode(huffmanInput) : decodeInteger(contextCache, \"IAFS\", decoder);\n      firstS += deltaFirstS;\n      var currentS = firstS;\n\n      do {\n        let currentT = 0;\n\n        if (stripSize > 1) {\n          currentT = huffman ? huffmanInput.readBits(logStripSize) : decodeInteger(contextCache, \"IAIT\", decoder);\n        }\n\n        var t = stripSize * stripT + currentT;\n        var symbolId = huffman ? huffmanTables.symbolIDTable.decode(huffmanInput) : decodeIAID(contextCache, decoder, symbolCodeLength);\n        var applyRefinement = refinement && (huffman ? huffmanInput.readBit() : decodeInteger(contextCache, \"IARI\", decoder));\n        var symbolBitmap = inputSymbols[symbolId];\n        var symbolWidth = symbolBitmap[0].length;\n        var symbolHeight = symbolBitmap.length;\n\n        if (applyRefinement) {\n          var rdw = decodeInteger(contextCache, \"IARDW\", decoder);\n          var rdh = decodeInteger(contextCache, \"IARDH\", decoder);\n          var rdx = decodeInteger(contextCache, \"IARDX\", decoder);\n          var rdy = decodeInteger(contextCache, \"IARDY\", decoder);\n          symbolWidth += rdw;\n          symbolHeight += rdh;\n          symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx, (rdh >> 1) + rdy, false, refinementAt, decodingContext);\n        }\n\n        var offsetT = t - (referenceCorner & 1 ? 0 : symbolHeight - 1);\n        var offsetS = currentS - (referenceCorner & 2 ? symbolWidth - 1 : 0);\n        var s2, t2, symbolRow;\n\n        if (transposed) {\n          for (s2 = 0; s2 < symbolHeight; s2++) {\n            row = bitmap[offsetS + s2];\n\n            if (!row) {\n              continue;\n            }\n\n            symbolRow = symbolBitmap[s2];\n            var maxWidth = Math.min(width - offsetT, symbolWidth);\n\n            switch (combinationOperator) {\n              case 0:\n                for (t2 = 0; t2 < maxWidth; t2++) {\n                  row[offsetT + t2] |= symbolRow[t2];\n                }\n\n                break;\n\n              case 2:\n                for (t2 = 0; t2 < maxWidth; t2++) {\n                  row[offsetT + t2] ^= symbolRow[t2];\n                }\n\n                break;\n\n              default:\n                throw new Jbig2Error(`operator ${combinationOperator} is not supported`);\n            }\n          }\n\n          currentS += symbolHeight - 1;\n        } else {\n          for (t2 = 0; t2 < symbolHeight; t2++) {\n            row = bitmap[offsetT + t2];\n\n            if (!row) {\n              continue;\n            }\n\n            symbolRow = symbolBitmap[t2];\n\n            switch (combinationOperator) {\n              case 0:\n                for (s2 = 0; s2 < symbolWidth; s2++) {\n                  row[offsetS + s2] |= symbolRow[s2];\n                }\n\n                break;\n\n              case 2:\n                for (s2 = 0; s2 < symbolWidth; s2++) {\n                  row[offsetS + s2] ^= symbolRow[s2];\n                }\n\n                break;\n\n              default:\n                throw new Jbig2Error(`operator ${combinationOperator} is not supported`);\n            }\n          }\n\n          currentS += symbolWidth - 1;\n        }\n\n        i++;\n        var deltaS = huffman ? huffmanTables.tableDeltaS.decode(huffmanInput) : decodeInteger(contextCache, \"IADS\", decoder);\n\n        if (deltaS === null) {\n          break;\n        }\n\n        currentS += deltaS + dsOffset;\n      } while (true);\n    }\n\n    return bitmap;\n  }\n\n  function decodePatternDictionary(mmr, patternWidth, patternHeight, maxPatternIndex, template, decodingContext) {\n    const at = [];\n\n    if (!mmr) {\n      at.push({\n        x: -patternWidth,\n        y: 0\n      });\n\n      if (template === 0) {\n        at.push({\n          x: -3,\n          y: -1\n        });\n        at.push({\n          x: 2,\n          y: -2\n        });\n        at.push({\n          x: -2,\n          y: -2\n        });\n      }\n    }\n\n    const collectiveWidth = (maxPatternIndex + 1) * patternWidth;\n    const collectiveBitmap = decodeBitmap(mmr, collectiveWidth, patternHeight, template, false, null, at, decodingContext);\n    const patterns = [];\n\n    for (let i = 0; i <= maxPatternIndex; i++) {\n      const patternBitmap = [];\n      const xMin = patternWidth * i;\n      const xMax = xMin + patternWidth;\n\n      for (let y = 0; y < patternHeight; y++) {\n        patternBitmap.push(collectiveBitmap[y].subarray(xMin, xMax));\n      }\n\n      patterns.push(patternBitmap);\n    }\n\n    return patterns;\n  }\n\n  function decodeHalftoneRegion(mmr, patterns, template, regionWidth, regionHeight, defaultPixelValue, enableSkip, combinationOperator, gridWidth, gridHeight, gridOffsetX, gridOffsetY, gridVectorX, gridVectorY, decodingContext) {\n    const skip = null;\n\n    if (enableSkip) {\n      throw new Jbig2Error(\"skip is not supported\");\n    }\n\n    if (combinationOperator !== 0) {\n      throw new Jbig2Error(\"operator \" + combinationOperator + \" is not supported in halftone region\");\n    }\n\n    const regionBitmap = [];\n    let i, j, row;\n\n    for (i = 0; i < regionHeight; i++) {\n      row = new Uint8Array(regionWidth);\n\n      if (defaultPixelValue) {\n        for (j = 0; j < regionWidth; j++) {\n          row[j] = defaultPixelValue;\n        }\n      }\n\n      regionBitmap.push(row);\n    }\n\n    const numberOfPatterns = patterns.length;\n    const pattern0 = patterns[0];\n    const patternWidth = pattern0[0].length,\n          patternHeight = pattern0.length;\n    const bitsPerValue = (0, _core_utils.log2)(numberOfPatterns);\n    const at = [];\n\n    if (!mmr) {\n      at.push({\n        x: template <= 1 ? 3 : 2,\n        y: -1\n      });\n\n      if (template === 0) {\n        at.push({\n          x: -3,\n          y: -1\n        });\n        at.push({\n          x: 2,\n          y: -2\n        });\n        at.push({\n          x: -2,\n          y: -2\n        });\n      }\n    }\n\n    const grayScaleBitPlanes = [];\n    let mmrInput, bitmap;\n\n    if (mmr) {\n      mmrInput = new Reader(decodingContext.data, decodingContext.start, decodingContext.end);\n    }\n\n    for (i = bitsPerValue - 1; i >= 0; i--) {\n      if (mmr) {\n        bitmap = decodeMMRBitmap(mmrInput, gridWidth, gridHeight, true);\n      } else {\n        bitmap = decodeBitmap(false, gridWidth, gridHeight, template, false, skip, at, decodingContext);\n      }\n\n      grayScaleBitPlanes[i] = bitmap;\n    }\n\n    let mg, ng, bit, patternIndex, patternBitmap, x, y, patternRow, regionRow;\n\n    for (mg = 0; mg < gridHeight; mg++) {\n      for (ng = 0; ng < gridWidth; ng++) {\n        bit = 0;\n        patternIndex = 0;\n\n        for (j = bitsPerValue - 1; j >= 0; j--) {\n          bit = grayScaleBitPlanes[j][mg][ng] ^ bit;\n          patternIndex |= bit << j;\n        }\n\n        patternBitmap = patterns[patternIndex];\n        x = gridOffsetX + mg * gridVectorY + ng * gridVectorX >> 8;\n        y = gridOffsetY + mg * gridVectorX - ng * gridVectorY >> 8;\n\n        if (x >= 0 && x + patternWidth <= regionWidth && y >= 0 && y + patternHeight <= regionHeight) {\n          for (i = 0; i < patternHeight; i++) {\n            regionRow = regionBitmap[y + i];\n            patternRow = patternBitmap[i];\n\n            for (j = 0; j < patternWidth; j++) {\n              regionRow[x + j] |= patternRow[j];\n            }\n          }\n        } else {\n          let regionX, regionY;\n\n          for (i = 0; i < patternHeight; i++) {\n            regionY = y + i;\n\n            if (regionY < 0 || regionY >= regionHeight) {\n              continue;\n            }\n\n            regionRow = regionBitmap[regionY];\n            patternRow = patternBitmap[i];\n\n            for (j = 0; j < patternWidth; j++) {\n              regionX = x + j;\n\n              if (regionX >= 0 && regionX < regionWidth) {\n                regionRow[regionX] |= patternRow[j];\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return regionBitmap;\n  }\n\n  function readSegmentHeader(data, start) {\n    var segmentHeader = {};\n    segmentHeader.number = (0, _core_utils.readUint32)(data, start);\n    var flags = data[start + 4];\n    var segmentType = flags & 0x3f;\n\n    if (!SegmentTypes[segmentType]) {\n      throw new Jbig2Error(\"invalid segment type: \" + segmentType);\n    }\n\n    segmentHeader.type = segmentType;\n    segmentHeader.typeName = SegmentTypes[segmentType];\n    segmentHeader.deferredNonRetain = !!(flags & 0x80);\n    var pageAssociationFieldSize = !!(flags & 0x40);\n    var referredFlags = data[start + 5];\n    var referredToCount = referredFlags >> 5 & 7;\n    var retainBits = [referredFlags & 31];\n    var position = start + 6;\n\n    if (referredFlags === 7) {\n      referredToCount = (0, _core_utils.readUint32)(data, position - 1) & 0x1fffffff;\n      position += 3;\n      var bytes = referredToCount + 7 >> 3;\n      retainBits[0] = data[position++];\n\n      while (--bytes > 0) {\n        retainBits.push(data[position++]);\n      }\n    } else if (referredFlags === 5 || referredFlags === 6) {\n      throw new Jbig2Error(\"invalid referred-to flags\");\n    }\n\n    segmentHeader.retainBits = retainBits;\n    let referredToSegmentNumberSize = 4;\n\n    if (segmentHeader.number <= 256) {\n      referredToSegmentNumberSize = 1;\n    } else if (segmentHeader.number <= 65536) {\n      referredToSegmentNumberSize = 2;\n    }\n\n    var referredTo = [];\n    var i, ii;\n\n    for (i = 0; i < referredToCount; i++) {\n      let number;\n\n      if (referredToSegmentNumberSize === 1) {\n        number = data[position];\n      } else if (referredToSegmentNumberSize === 2) {\n        number = (0, _core_utils.readUint16)(data, position);\n      } else {\n        number = (0, _core_utils.readUint32)(data, position);\n      }\n\n      referredTo.push(number);\n      position += referredToSegmentNumberSize;\n    }\n\n    segmentHeader.referredTo = referredTo;\n\n    if (!pageAssociationFieldSize) {\n      segmentHeader.pageAssociation = data[position++];\n    } else {\n      segmentHeader.pageAssociation = (0, _core_utils.readUint32)(data, position);\n      position += 4;\n    }\n\n    segmentHeader.length = (0, _core_utils.readUint32)(data, position);\n    position += 4;\n\n    if (segmentHeader.length === 0xffffffff) {\n      if (segmentType === 38) {\n        var genericRegionInfo = readRegionSegmentInformation(data, position);\n        var genericRegionSegmentFlags = data[position + RegionSegmentInformationFieldLength];\n        var genericRegionMmr = !!(genericRegionSegmentFlags & 1);\n        var searchPatternLength = 6;\n        var searchPattern = new Uint8Array(searchPatternLength);\n\n        if (!genericRegionMmr) {\n          searchPattern[0] = 0xff;\n          searchPattern[1] = 0xac;\n        }\n\n        searchPattern[2] = genericRegionInfo.height >>> 24 & 0xff;\n        searchPattern[3] = genericRegionInfo.height >> 16 & 0xff;\n        searchPattern[4] = genericRegionInfo.height >> 8 & 0xff;\n        searchPattern[5] = genericRegionInfo.height & 0xff;\n\n        for (i = position, ii = data.length; i < ii; i++) {\n          var j = 0;\n\n          while (j < searchPatternLength && searchPattern[j] === data[i + j]) {\n            j++;\n          }\n\n          if (j === searchPatternLength) {\n            segmentHeader.length = i + searchPatternLength;\n            break;\n          }\n        }\n\n        if (segmentHeader.length === 0xffffffff) {\n          throw new Jbig2Error(\"segment end was not found\");\n        }\n      } else {\n        throw new Jbig2Error(\"invalid unknown segment length\");\n      }\n    }\n\n    segmentHeader.headerEnd = position;\n    return segmentHeader;\n  }\n\n  function readSegments(header, data, start, end) {\n    var segments = [];\n    var position = start;\n\n    while (position < end) {\n      var segmentHeader = readSegmentHeader(data, position);\n      position = segmentHeader.headerEnd;\n      var segment = {\n        header: segmentHeader,\n        data\n      };\n\n      if (!header.randomAccess) {\n        segment.start = position;\n        position += segmentHeader.length;\n        segment.end = position;\n      }\n\n      segments.push(segment);\n\n      if (segmentHeader.type === 51) {\n        break;\n      }\n    }\n\n    if (header.randomAccess) {\n      for (var i = 0, ii = segments.length; i < ii; i++) {\n        segments[i].start = position;\n        position += segments[i].header.length;\n        segments[i].end = position;\n      }\n    }\n\n    return segments;\n  }\n\n  function readRegionSegmentInformation(data, start) {\n    return {\n      width: (0, _core_utils.readUint32)(data, start),\n      height: (0, _core_utils.readUint32)(data, start + 4),\n      x: (0, _core_utils.readUint32)(data, start + 8),\n      y: (0, _core_utils.readUint32)(data, start + 12),\n      combinationOperator: data[start + 16] & 7\n    };\n  }\n\n  var RegionSegmentInformationFieldLength = 17;\n\n  function processSegment(segment, visitor) {\n    var header = segment.header;\n    var data = segment.data,\n        position = segment.start,\n        end = segment.end;\n    var args, at, i, atLength;\n\n    switch (header.type) {\n      case 0:\n        var dictionary = {};\n        var dictionaryFlags = (0, _core_utils.readUint16)(data, position);\n        dictionary.huffman = !!(dictionaryFlags & 1);\n        dictionary.refinement = !!(dictionaryFlags & 2);\n        dictionary.huffmanDHSelector = dictionaryFlags >> 2 & 3;\n        dictionary.huffmanDWSelector = dictionaryFlags >> 4 & 3;\n        dictionary.bitmapSizeSelector = dictionaryFlags >> 6 & 1;\n        dictionary.aggregationInstancesSelector = dictionaryFlags >> 7 & 1;\n        dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256);\n        dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512);\n        dictionary.template = dictionaryFlags >> 10 & 3;\n        dictionary.refinementTemplate = dictionaryFlags >> 12 & 1;\n        position += 2;\n\n        if (!dictionary.huffman) {\n          atLength = dictionary.template === 0 ? 4 : 1;\n          at = [];\n\n          for (i = 0; i < atLength; i++) {\n            at.push({\n              x: (0, _core_utils.readInt8)(data, position),\n              y: (0, _core_utils.readInt8)(data, position + 1)\n            });\n            position += 2;\n          }\n\n          dictionary.at = at;\n        }\n\n        if (dictionary.refinement && !dictionary.refinementTemplate) {\n          at = [];\n\n          for (i = 0; i < 2; i++) {\n            at.push({\n              x: (0, _core_utils.readInt8)(data, position),\n              y: (0, _core_utils.readInt8)(data, position + 1)\n            });\n            position += 2;\n          }\n\n          dictionary.refinementAt = at;\n        }\n\n        dictionary.numberOfExportedSymbols = (0, _core_utils.readUint32)(data, position);\n        position += 4;\n        dictionary.numberOfNewSymbols = (0, _core_utils.readUint32)(data, position);\n        position += 4;\n        args = [dictionary, header.number, header.referredTo, data, position, end];\n        break;\n\n      case 6:\n      case 7:\n        var textRegion = {};\n        textRegion.info = readRegionSegmentInformation(data, position);\n        position += RegionSegmentInformationFieldLength;\n        var textRegionSegmentFlags = (0, _core_utils.readUint16)(data, position);\n        position += 2;\n        textRegion.huffman = !!(textRegionSegmentFlags & 1);\n        textRegion.refinement = !!(textRegionSegmentFlags & 2);\n        textRegion.logStripSize = textRegionSegmentFlags >> 2 & 3;\n        textRegion.stripSize = 1 << textRegion.logStripSize;\n        textRegion.referenceCorner = textRegionSegmentFlags >> 4 & 3;\n        textRegion.transposed = !!(textRegionSegmentFlags & 64);\n        textRegion.combinationOperator = textRegionSegmentFlags >> 7 & 3;\n        textRegion.defaultPixelValue = textRegionSegmentFlags >> 9 & 1;\n        textRegion.dsOffset = textRegionSegmentFlags << 17 >> 27;\n        textRegion.refinementTemplate = textRegionSegmentFlags >> 15 & 1;\n\n        if (textRegion.huffman) {\n          var textRegionHuffmanFlags = (0, _core_utils.readUint16)(data, position);\n          position += 2;\n          textRegion.huffmanFS = textRegionHuffmanFlags & 3;\n          textRegion.huffmanDS = textRegionHuffmanFlags >> 2 & 3;\n          textRegion.huffmanDT = textRegionHuffmanFlags >> 4 & 3;\n          textRegion.huffmanRefinementDW = textRegionHuffmanFlags >> 6 & 3;\n          textRegion.huffmanRefinementDH = textRegionHuffmanFlags >> 8 & 3;\n          textRegion.huffmanRefinementDX = textRegionHuffmanFlags >> 10 & 3;\n          textRegion.huffmanRefinementDY = textRegionHuffmanFlags >> 12 & 3;\n          textRegion.huffmanRefinementSizeSelector = !!(textRegionHuffmanFlags & 0x4000);\n        }\n\n        if (textRegion.refinement && !textRegion.refinementTemplate) {\n          at = [];\n\n          for (i = 0; i < 2; i++) {\n            at.push({\n              x: (0, _core_utils.readInt8)(data, position),\n              y: (0, _core_utils.readInt8)(data, position + 1)\n            });\n            position += 2;\n          }\n\n          textRegion.refinementAt = at;\n        }\n\n        textRegion.numberOfSymbolInstances = (0, _core_utils.readUint32)(data, position);\n        position += 4;\n        args = [textRegion, header.referredTo, data, position, end];\n        break;\n\n      case 16:\n        const patternDictionary = {};\n        const patternDictionaryFlags = data[position++];\n        patternDictionary.mmr = !!(patternDictionaryFlags & 1);\n        patternDictionary.template = patternDictionaryFlags >> 1 & 3;\n        patternDictionary.patternWidth = data[position++];\n        patternDictionary.patternHeight = data[position++];\n        patternDictionary.maxPatternIndex = (0, _core_utils.readUint32)(data, position);\n        position += 4;\n        args = [patternDictionary, header.number, data, position, end];\n        break;\n\n      case 22:\n      case 23:\n        const halftoneRegion = {};\n        halftoneRegion.info = readRegionSegmentInformation(data, position);\n        position += RegionSegmentInformationFieldLength;\n        const halftoneRegionFlags = data[position++];\n        halftoneRegion.mmr = !!(halftoneRegionFlags & 1);\n        halftoneRegion.template = halftoneRegionFlags >> 1 & 3;\n        halftoneRegion.enableSkip = !!(halftoneRegionFlags & 8);\n        halftoneRegion.combinationOperator = halftoneRegionFlags >> 4 & 7;\n        halftoneRegion.defaultPixelValue = halftoneRegionFlags >> 7 & 1;\n        halftoneRegion.gridWidth = (0, _core_utils.readUint32)(data, position);\n        position += 4;\n        halftoneRegion.gridHeight = (0, _core_utils.readUint32)(data, position);\n        position += 4;\n        halftoneRegion.gridOffsetX = (0, _core_utils.readUint32)(data, position) & 0xffffffff;\n        position += 4;\n        halftoneRegion.gridOffsetY = (0, _core_utils.readUint32)(data, position) & 0xffffffff;\n        position += 4;\n        halftoneRegion.gridVectorX = (0, _core_utils.readUint16)(data, position);\n        position += 2;\n        halftoneRegion.gridVectorY = (0, _core_utils.readUint16)(data, position);\n        position += 2;\n        args = [halftoneRegion, header.referredTo, data, position, end];\n        break;\n\n      case 38:\n      case 39:\n        var genericRegion = {};\n        genericRegion.info = readRegionSegmentInformation(data, position);\n        position += RegionSegmentInformationFieldLength;\n        var genericRegionSegmentFlags = data[position++];\n        genericRegion.mmr = !!(genericRegionSegmentFlags & 1);\n        genericRegion.template = genericRegionSegmentFlags >> 1 & 3;\n        genericRegion.prediction = !!(genericRegionSegmentFlags & 8);\n\n        if (!genericRegion.mmr) {\n          atLength = genericRegion.template === 0 ? 4 : 1;\n          at = [];\n\n          for (i = 0; i < atLength; i++) {\n            at.push({\n              x: (0, _core_utils.readInt8)(data, position),\n              y: (0, _core_utils.readInt8)(data, position + 1)\n            });\n            position += 2;\n          }\n\n          genericRegion.at = at;\n        }\n\n        args = [genericRegion, data, position, end];\n        break;\n\n      case 48:\n        var pageInfo = {\n          width: (0, _core_utils.readUint32)(data, position),\n          height: (0, _core_utils.readUint32)(data, position + 4),\n          resolutionX: (0, _core_utils.readUint32)(data, position + 8),\n          resolutionY: (0, _core_utils.readUint32)(data, position + 12)\n        };\n\n        if (pageInfo.height === 0xffffffff) {\n          delete pageInfo.height;\n        }\n\n        var pageSegmentFlags = data[position + 16];\n        (0, _core_utils.readUint16)(data, position + 17);\n        pageInfo.lossless = !!(pageSegmentFlags & 1);\n        pageInfo.refinement = !!(pageSegmentFlags & 2);\n        pageInfo.defaultPixelValue = pageSegmentFlags >> 2 & 1;\n        pageInfo.combinationOperator = pageSegmentFlags >> 3 & 3;\n        pageInfo.requiresBuffer = !!(pageSegmentFlags & 32);\n        pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64);\n        args = [pageInfo];\n        break;\n\n      case 49:\n        break;\n\n      case 50:\n        break;\n\n      case 51:\n        break;\n\n      case 53:\n        args = [header.number, data, position, end];\n        break;\n\n      case 62:\n        break;\n\n      default:\n        throw new Jbig2Error(`segment type ${header.typeName}(${header.type})` + \" is not implemented\");\n    }\n\n    var callbackName = \"on\" + header.typeName;\n\n    if (callbackName in visitor) {\n      visitor[callbackName].apply(visitor, args);\n    }\n  }\n\n  function processSegments(segments, visitor) {\n    for (var i = 0, ii = segments.length; i < ii; i++) {\n      processSegment(segments[i], visitor);\n    }\n  }\n\n  function parseJbig2Chunks(chunks) {\n    var visitor = new SimpleSegmentVisitor();\n\n    for (var i = 0, ii = chunks.length; i < ii; i++) {\n      var chunk = chunks[i];\n      var segments = readSegments({}, chunk.data, chunk.start, chunk.end);\n      processSegments(segments, visitor);\n    }\n\n    return visitor.buffer;\n  }\n\n  function parseJbig2(data) {\n    const end = data.length;\n    let position = 0;\n\n    if (data[position] !== 0x97 || data[position + 1] !== 0x4a || data[position + 2] !== 0x42 || data[position + 3] !== 0x32 || data[position + 4] !== 0x0d || data[position + 5] !== 0x0a || data[position + 6] !== 0x1a || data[position + 7] !== 0x0a) {\n      throw new Jbig2Error(\"parseJbig2 - invalid header.\");\n    }\n\n    const header = Object.create(null);\n    position += 8;\n    const flags = data[position++];\n    header.randomAccess = !(flags & 1);\n\n    if (!(flags & 2)) {\n      header.numberOfPages = (0, _core_utils.readUint32)(data, position);\n      position += 4;\n    }\n\n    const segments = readSegments(header, data, position, end);\n    const visitor = new SimpleSegmentVisitor();\n    processSegments(segments, visitor);\n    const {\n      width,\n      height\n    } = visitor.currentPageInfo;\n    const bitPacked = visitor.buffer;\n    const imgData = new Uint8ClampedArray(width * height);\n    let q = 0,\n        k = 0;\n\n    for (let i = 0; i < height; i++) {\n      let mask = 0,\n          buffer;\n\n      for (let j = 0; j < width; j++) {\n        if (!mask) {\n          mask = 128;\n          buffer = bitPacked[k++];\n        }\n\n        imgData[q++] = buffer & mask ? 0 : 255;\n        mask >>= 1;\n      }\n    }\n\n    return {\n      imgData,\n      width,\n      height\n    };\n  }\n\n  function SimpleSegmentVisitor() {}\n\n  SimpleSegmentVisitor.prototype = {\n    onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) {\n      this.currentPageInfo = info;\n      var rowSize = info.width + 7 >> 3;\n      var buffer = new Uint8ClampedArray(rowSize * info.height);\n\n      if (info.defaultPixelValue) {\n        for (var i = 0, ii = buffer.length; i < ii; i++) {\n          buffer[i] = 0xff;\n        }\n      }\n\n      this.buffer = buffer;\n    },\n    drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) {\n      var pageInfo = this.currentPageInfo;\n      var width = regionInfo.width,\n          height = regionInfo.height;\n      var rowSize = pageInfo.width + 7 >> 3;\n      var combinationOperator = pageInfo.combinationOperatorOverride ? regionInfo.combinationOperator : pageInfo.combinationOperator;\n      var buffer = this.buffer;\n      var mask0 = 128 >> (regionInfo.x & 7);\n      var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3);\n      var i, j, mask, offset;\n\n      switch (combinationOperator) {\n        case 0:\n          for (i = 0; i < height; i++) {\n            mask = mask0;\n            offset = offset0;\n\n            for (j = 0; j < width; j++) {\n              if (bitmap[i][j]) {\n                buffer[offset] |= mask;\n              }\n\n              mask >>= 1;\n\n              if (!mask) {\n                mask = 128;\n                offset++;\n              }\n            }\n\n            offset0 += rowSize;\n          }\n\n          break;\n\n        case 2:\n          for (i = 0; i < height; i++) {\n            mask = mask0;\n            offset = offset0;\n\n            for (j = 0; j < width; j++) {\n              if (bitmap[i][j]) {\n                buffer[offset] ^= mask;\n              }\n\n              mask >>= 1;\n\n              if (!mask) {\n                mask = 128;\n                offset++;\n              }\n            }\n\n            offset0 += rowSize;\n          }\n\n          break;\n\n        default:\n          throw new Jbig2Error(`operator ${combinationOperator} is not supported`);\n      }\n    },\n    onImmediateGenericRegion: function SimpleSegmentVisitor_onImmediateGenericRegion(region, data, start, end) {\n      var regionInfo = region.info;\n      var decodingContext = new DecodingContext(data, start, end);\n      var bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, region.template, region.prediction, null, region.at, decodingContext);\n      this.drawBitmap(regionInfo, bitmap);\n    },\n    onImmediateLosslessGenericRegion: function SimpleSegmentVisitor_onImmediateLosslessGenericRegion() {\n      this.onImmediateGenericRegion.apply(this, arguments);\n    },\n    onSymbolDictionary: function SimpleSegmentVisitor_onSymbolDictionary(dictionary, currentSegment, referredSegments, data, start, end) {\n      let huffmanTables, huffmanInput;\n\n      if (dictionary.huffman) {\n        huffmanTables = getSymbolDictionaryHuffmanTables(dictionary, referredSegments, this.customTables);\n        huffmanInput = new Reader(data, start, end);\n      }\n\n      var symbols = this.symbols;\n\n      if (!symbols) {\n        this.symbols = symbols = {};\n      }\n\n      var inputSymbols = [];\n\n      for (var i = 0, ii = referredSegments.length; i < ii; i++) {\n        const referredSymbols = symbols[referredSegments[i]];\n\n        if (referredSymbols) {\n          inputSymbols = inputSymbols.concat(referredSymbols);\n        }\n      }\n\n      var decodingContext = new DecodingContext(data, start, end);\n      symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, dictionary.numberOfExportedSymbols, huffmanTables, dictionary.template, dictionary.at, dictionary.refinementTemplate, dictionary.refinementAt, decodingContext, huffmanInput);\n    },\n    onImmediateTextRegion: function SimpleSegmentVisitor_onImmediateTextRegion(region, referredSegments, data, start, end) {\n      var regionInfo = region.info;\n      let huffmanTables, huffmanInput;\n      var symbols = this.symbols;\n      var inputSymbols = [];\n\n      for (var i = 0, ii = referredSegments.length; i < ii; i++) {\n        const referredSymbols = symbols[referredSegments[i]];\n\n        if (referredSymbols) {\n          inputSymbols = inputSymbols.concat(referredSymbols);\n        }\n      }\n\n      var symbolCodeLength = (0, _core_utils.log2)(inputSymbols.length);\n\n      if (region.huffman) {\n        huffmanInput = new Reader(data, start, end);\n        huffmanTables = getTextRegionHuffmanTables(region, referredSegments, this.customTables, inputSymbols.length, huffmanInput);\n      }\n\n      var decodingContext = new DecodingContext(data, start, end);\n      var bitmap = decodeTextRegion(region.huffman, region.refinement, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.numberOfSymbolInstances, region.stripSize, inputSymbols, symbolCodeLength, region.transposed, region.dsOffset, region.referenceCorner, region.combinationOperator, huffmanTables, region.refinementTemplate, region.refinementAt, decodingContext, region.logStripSize, huffmanInput);\n      this.drawBitmap(regionInfo, bitmap);\n    },\n    onImmediateLosslessTextRegion: function SimpleSegmentVisitor_onImmediateLosslessTextRegion() {\n      this.onImmediateTextRegion.apply(this, arguments);\n    },\n\n    onPatternDictionary(dictionary, currentSegment, data, start, end) {\n      let patterns = this.patterns;\n\n      if (!patterns) {\n        this.patterns = patterns = {};\n      }\n\n      const decodingContext = new DecodingContext(data, start, end);\n      patterns[currentSegment] = decodePatternDictionary(dictionary.mmr, dictionary.patternWidth, dictionary.patternHeight, dictionary.maxPatternIndex, dictionary.template, decodingContext);\n    },\n\n    onImmediateHalftoneRegion(region, referredSegments, data, start, end) {\n      const patterns = this.patterns[referredSegments[0]];\n      const regionInfo = region.info;\n      const decodingContext = new DecodingContext(data, start, end);\n      const bitmap = decodeHalftoneRegion(region.mmr, patterns, region.template, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.enableSkip, region.combinationOperator, region.gridWidth, region.gridHeight, region.gridOffsetX, region.gridOffsetY, region.gridVectorX, region.gridVectorY, decodingContext);\n      this.drawBitmap(regionInfo, bitmap);\n    },\n\n    onImmediateLosslessHalftoneRegion() {\n      this.onImmediateHalftoneRegion.apply(this, arguments);\n    },\n\n    onTables(currentSegment, data, start, end) {\n      let customTables = this.customTables;\n\n      if (!customTables) {\n        this.customTables = customTables = {};\n      }\n\n      customTables[currentSegment] = decodeTablesSegment(data, start, end);\n    }\n\n  };\n\n  function HuffmanLine(lineData) {\n    if (lineData.length === 2) {\n      this.isOOB = true;\n      this.rangeLow = 0;\n      this.prefixLength = lineData[0];\n      this.rangeLength = 0;\n      this.prefixCode = lineData[1];\n      this.isLowerRange = false;\n    } else {\n      this.isOOB = false;\n      this.rangeLow = lineData[0];\n      this.prefixLength = lineData[1];\n      this.rangeLength = lineData[2];\n      this.prefixCode = lineData[3];\n      this.isLowerRange = lineData[4] === \"lower\";\n    }\n  }\n\n  function HuffmanTreeNode(line) {\n    this.children = [];\n\n    if (line) {\n      this.isLeaf = true;\n      this.rangeLength = line.rangeLength;\n      this.rangeLow = line.rangeLow;\n      this.isLowerRange = line.isLowerRange;\n      this.isOOB = line.isOOB;\n    } else {\n      this.isLeaf = false;\n    }\n  }\n\n  HuffmanTreeNode.prototype = {\n    buildTree(line, shift) {\n      const bit = line.prefixCode >> shift & 1;\n\n      if (shift <= 0) {\n        this.children[bit] = new HuffmanTreeNode(line);\n      } else {\n        let node = this.children[bit];\n\n        if (!node) {\n          this.children[bit] = node = new HuffmanTreeNode(null);\n        }\n\n        node.buildTree(line, shift - 1);\n      }\n    },\n\n    decodeNode(reader) {\n      if (this.isLeaf) {\n        if (this.isOOB) {\n          return null;\n        }\n\n        const htOffset = reader.readBits(this.rangeLength);\n        return this.rangeLow + (this.isLowerRange ? -htOffset : htOffset);\n      }\n\n      const node = this.children[reader.readBit()];\n\n      if (!node) {\n        throw new Jbig2Error(\"invalid Huffman data\");\n      }\n\n      return node.decodeNode(reader);\n    }\n\n  };\n\n  function HuffmanTable(lines, prefixCodesDone) {\n    if (!prefixCodesDone) {\n      this.assignPrefixCodes(lines);\n    }\n\n    this.rootNode = new HuffmanTreeNode(null);\n\n    for (let i = 0, ii = lines.length; i < ii; i++) {\n      const line = lines[i];\n\n      if (line.prefixLength > 0) {\n        this.rootNode.buildTree(line, line.prefixLength - 1);\n      }\n    }\n  }\n\n  HuffmanTable.prototype = {\n    decode(reader) {\n      return this.rootNode.decodeNode(reader);\n    },\n\n    assignPrefixCodes(lines) {\n      const linesLength = lines.length;\n      let prefixLengthMax = 0;\n\n      for (let i = 0; i < linesLength; i++) {\n        prefixLengthMax = Math.max(prefixLengthMax, lines[i].prefixLength);\n      }\n\n      const histogram = new Uint32Array(prefixLengthMax + 1);\n\n      for (let i = 0; i < linesLength; i++) {\n        histogram[lines[i].prefixLength]++;\n      }\n\n      let currentLength = 1,\n          firstCode = 0,\n          currentCode,\n          currentTemp,\n          line;\n      histogram[0] = 0;\n\n      while (currentLength <= prefixLengthMax) {\n        firstCode = firstCode + histogram[currentLength - 1] << 1;\n        currentCode = firstCode;\n        currentTemp = 0;\n\n        while (currentTemp < linesLength) {\n          line = lines[currentTemp];\n\n          if (line.prefixLength === currentLength) {\n            line.prefixCode = currentCode;\n            currentCode++;\n          }\n\n          currentTemp++;\n        }\n\n        currentLength++;\n      }\n    }\n\n  };\n\n  function decodeTablesSegment(data, start, end) {\n    const flags = data[start];\n    const lowestValue = (0, _core_utils.readUint32)(data, start + 1) & 0xffffffff;\n    const highestValue = (0, _core_utils.readUint32)(data, start + 5) & 0xffffffff;\n    const reader = new Reader(data, start + 9, end);\n    const prefixSizeBits = (flags >> 1 & 7) + 1;\n    const rangeSizeBits = (flags >> 4 & 7) + 1;\n    const lines = [];\n    let prefixLength,\n        rangeLength,\n        currentRangeLow = lowestValue;\n\n    do {\n      prefixLength = reader.readBits(prefixSizeBits);\n      rangeLength = reader.readBits(rangeSizeBits);\n      lines.push(new HuffmanLine([currentRangeLow, prefixLength, rangeLength, 0]));\n      currentRangeLow += 1 << rangeLength;\n    } while (currentRangeLow < highestValue);\n\n    prefixLength = reader.readBits(prefixSizeBits);\n    lines.push(new HuffmanLine([lowestValue - 1, prefixLength, 32, 0, \"lower\"]));\n    prefixLength = reader.readBits(prefixSizeBits);\n    lines.push(new HuffmanLine([highestValue, prefixLength, 32, 0]));\n\n    if (flags & 1) {\n      prefixLength = reader.readBits(prefixSizeBits);\n      lines.push(new HuffmanLine([prefixLength, 0]));\n    }\n\n    return new HuffmanTable(lines, false);\n  }\n\n  const standardTablesCache = {};\n\n  function getStandardTable(number) {\n    let table = standardTablesCache[number];\n\n    if (table) {\n      return table;\n    }\n\n    let lines;\n\n    switch (number) {\n      case 1:\n        lines = [[0, 1, 4, 0x0], [16, 2, 8, 0x2], [272, 3, 16, 0x6], [65808, 3, 32, 0x7]];\n        break;\n\n      case 2:\n        lines = [[0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xe], [11, 5, 6, 0x1e], [75, 6, 32, 0x3e], [6, 0x3f]];\n        break;\n\n      case 3:\n        lines = [[-256, 8, 8, 0xfe], [0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xe], [11, 5, 6, 0x1e], [-257, 8, 32, 0xff, \"lower\"], [75, 7, 32, 0x7e], [6, 0x3e]];\n        break;\n\n      case 4:\n        lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xe], [12, 5, 6, 0x1e], [76, 5, 32, 0x1f]];\n        break;\n\n      case 5:\n        lines = [[-255, 7, 8, 0x7e], [1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xe], [12, 5, 6, 0x1e], [-256, 7, 32, 0x7f, \"lower\"], [76, 6, 32, 0x3e]];\n        break;\n\n      case 6:\n        lines = [[-2048, 5, 10, 0x1c], [-1024, 4, 9, 0x8], [-512, 4, 8, 0x9], [-256, 4, 7, 0xa], [-128, 5, 6, 0x1d], [-64, 5, 5, 0x1e], [-32, 4, 5, 0xb], [0, 2, 7, 0x0], [128, 3, 7, 0x2], [256, 3, 8, 0x3], [512, 4, 9, 0xc], [1024, 4, 10, 0xd], [-2049, 6, 32, 0x3e, \"lower\"], [2048, 6, 32, 0x3f]];\n        break;\n\n      case 7:\n        lines = [[-1024, 4, 9, 0x8], [-512, 3, 8, 0x0], [-256, 4, 7, 0x9], [-128, 5, 6, 0x1a], [-64, 5, 5, 0x1b], [-32, 4, 5, 0xa], [0, 4, 5, 0xb], [32, 5, 5, 0x1c], [64, 5, 6, 0x1d], [128, 4, 7, 0xc], [256, 3, 8, 0x1], [512, 3, 9, 0x2], [1024, 3, 10, 0x3], [-1025, 5, 32, 0x1e, \"lower\"], [2048, 5, 32, 0x1f]];\n        break;\n\n      case 8:\n        lines = [[-15, 8, 3, 0xfc], [-7, 9, 1, 0x1fc], [-5, 8, 1, 0xfd], [-3, 9, 0, 0x1fd], [-2, 7, 0, 0x7c], [-1, 4, 0, 0xa], [0, 2, 1, 0x0], [2, 5, 0, 0x1a], [3, 6, 0, 0x3a], [4, 3, 4, 0x4], [20, 6, 1, 0x3b], [22, 4, 4, 0xb], [38, 4, 5, 0xc], [70, 5, 6, 0x1b], [134, 5, 7, 0x1c], [262, 6, 7, 0x3c], [390, 7, 8, 0x7d], [646, 6, 10, 0x3d], [-16, 9, 32, 0x1fe, \"lower\"], [1670, 9, 32, 0x1ff], [2, 0x1]];\n        break;\n\n      case 9:\n        lines = [[-31, 8, 4, 0xfc], [-15, 9, 2, 0x1fc], [-11, 8, 2, 0xfd], [-7, 9, 1, 0x1fd], [-5, 7, 1, 0x7c], [-3, 4, 1, 0xa], [-1, 3, 1, 0x2], [1, 3, 1, 0x3], [3, 5, 1, 0x1a], [5, 6, 1, 0x3a], [7, 3, 5, 0x4], [39, 6, 2, 0x3b], [43, 4, 5, 0xb], [75, 4, 6, 0xc], [139, 5, 7, 0x1b], [267, 5, 8, 0x1c], [523, 6, 8, 0x3c], [779, 7, 9, 0x7d], [1291, 6, 11, 0x3d], [-32, 9, 32, 0x1fe, \"lower\"], [3339, 9, 32, 0x1ff], [2, 0x0]];\n        break;\n\n      case 10:\n        lines = [[-21, 7, 4, 0x7a], [-5, 8, 0, 0xfc], [-4, 7, 0, 0x7b], [-3, 5, 0, 0x18], [-2, 2, 2, 0x0], [2, 5, 0, 0x19], [3, 6, 0, 0x36], [4, 7, 0, 0x7c], [5, 8, 0, 0xfd], [6, 2, 6, 0x1], [70, 5, 5, 0x1a], [102, 6, 5, 0x37], [134, 6, 6, 0x38], [198, 6, 7, 0x39], [326, 6, 8, 0x3a], [582, 6, 9, 0x3b], [1094, 6, 10, 0x3c], [2118, 7, 11, 0x7d], [-22, 8, 32, 0xfe, \"lower\"], [4166, 8, 32, 0xff], [2, 0x2]];\n        break;\n\n      case 11:\n        lines = [[1, 1, 0, 0x0], [2, 2, 1, 0x2], [4, 4, 0, 0xc], [5, 4, 1, 0xd], [7, 5, 1, 0x1c], [9, 5, 2, 0x1d], [13, 6, 2, 0x3c], [17, 7, 2, 0x7a], [21, 7, 3, 0x7b], [29, 7, 4, 0x7c], [45, 7, 5, 0x7d], [77, 7, 6, 0x7e], [141, 7, 32, 0x7f]];\n        break;\n\n      case 12:\n        lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 1, 0x6], [5, 5, 0, 0x1c], [6, 5, 1, 0x1d], [8, 6, 1, 0x3c], [10, 7, 0, 0x7a], [11, 7, 1, 0x7b], [13, 7, 2, 0x7c], [17, 7, 3, 0x7d], [25, 7, 4, 0x7e], [41, 8, 5, 0xfe], [73, 8, 32, 0xff]];\n        break;\n\n      case 13:\n        lines = [[1, 1, 0, 0x0], [2, 3, 0, 0x4], [3, 4, 0, 0xc], [4, 5, 0, 0x1c], [5, 4, 1, 0xd], [7, 3, 3, 0x5], [15, 6, 1, 0x3a], [17, 6, 2, 0x3b], [21, 6, 3, 0x3c], [29, 6, 4, 0x3d], [45, 6, 5, 0x3e], [77, 7, 6, 0x7e], [141, 7, 32, 0x7f]];\n        break;\n\n      case 14:\n        lines = [[-2, 3, 0, 0x4], [-1, 3, 0, 0x5], [0, 1, 0, 0x0], [1, 3, 0, 0x6], [2, 3, 0, 0x7]];\n        break;\n\n      case 15:\n        lines = [[-24, 7, 4, 0x7c], [-8, 6, 2, 0x3c], [-4, 5, 1, 0x1c], [-2, 4, 0, 0xc], [-1, 3, 0, 0x4], [0, 1, 0, 0x0], [1, 3, 0, 0x5], [2, 4, 0, 0xd], [3, 5, 1, 0x1d], [5, 6, 2, 0x3d], [9, 7, 4, 0x7d], [-25, 7, 32, 0x7e, \"lower\"], [25, 7, 32, 0x7f]];\n        break;\n\n      default:\n        throw new Jbig2Error(`standard table B.${number} does not exist`);\n    }\n\n    for (let i = 0, ii = lines.length; i < ii; i++) {\n      lines[i] = new HuffmanLine(lines[i]);\n    }\n\n    table = new HuffmanTable(lines, true);\n    standardTablesCache[number] = table;\n    return table;\n  }\n\n  function Reader(data, start, end) {\n    this.data = data;\n    this.start = start;\n    this.end = end;\n    this.position = start;\n    this.shift = -1;\n    this.currentByte = 0;\n  }\n\n  Reader.prototype = {\n    readBit() {\n      if (this.shift < 0) {\n        if (this.position >= this.end) {\n          throw new Jbig2Error(\"end of data while reading bit\");\n        }\n\n        this.currentByte = this.data[this.position++];\n        this.shift = 7;\n      }\n\n      const bit = this.currentByte >> this.shift & 1;\n      this.shift--;\n      return bit;\n    },\n\n    readBits(numBits) {\n      let result = 0,\n          i;\n\n      for (i = numBits - 1; i >= 0; i--) {\n        result |= this.readBit() << i;\n      }\n\n      return result;\n    },\n\n    byteAlign() {\n      this.shift = -1;\n    },\n\n    next() {\n      if (this.position >= this.end) {\n        return -1;\n      }\n\n      return this.data[this.position++];\n    }\n\n  };\n\n  function getCustomHuffmanTable(index, referredTo, customTables) {\n    let currentIndex = 0;\n\n    for (let i = 0, ii = referredTo.length; i < ii; i++) {\n      const table = customTables[referredTo[i]];\n\n      if (table) {\n        if (index === currentIndex) {\n          return table;\n        }\n\n        currentIndex++;\n      }\n    }\n\n    throw new Jbig2Error(\"can't find custom Huffman table\");\n  }\n\n  function getTextRegionHuffmanTables(textRegion, referredTo, customTables, numberOfSymbols, reader) {\n    const codes = [];\n\n    for (let i = 0; i <= 34; i++) {\n      const codeLength = reader.readBits(4);\n      codes.push(new HuffmanLine([i, codeLength, 0, 0]));\n    }\n\n    const runCodesTable = new HuffmanTable(codes, false);\n    codes.length = 0;\n\n    for (let i = 0; i < numberOfSymbols;) {\n      const codeLength = runCodesTable.decode(reader);\n\n      if (codeLength >= 32) {\n        let repeatedLength, numberOfRepeats, j;\n\n        switch (codeLength) {\n          case 32:\n            if (i === 0) {\n              throw new Jbig2Error(\"no previous value in symbol ID table\");\n            }\n\n            numberOfRepeats = reader.readBits(2) + 3;\n            repeatedLength = codes[i - 1].prefixLength;\n            break;\n\n          case 33:\n            numberOfRepeats = reader.readBits(3) + 3;\n            repeatedLength = 0;\n            break;\n\n          case 34:\n            numberOfRepeats = reader.readBits(7) + 11;\n            repeatedLength = 0;\n            break;\n\n          default:\n            throw new Jbig2Error(\"invalid code length in symbol ID table\");\n        }\n\n        for (j = 0; j < numberOfRepeats; j++) {\n          codes.push(new HuffmanLine([i, repeatedLength, 0, 0]));\n          i++;\n        }\n      } else {\n        codes.push(new HuffmanLine([i, codeLength, 0, 0]));\n        i++;\n      }\n    }\n\n    reader.byteAlign();\n    const symbolIDTable = new HuffmanTable(codes, false);\n    let customIndex = 0,\n        tableFirstS,\n        tableDeltaS,\n        tableDeltaT;\n\n    switch (textRegion.huffmanFS) {\n      case 0:\n      case 1:\n        tableFirstS = getStandardTable(textRegion.huffmanFS + 6);\n        break;\n\n      case 3:\n        tableFirstS = getCustomHuffmanTable(customIndex, referredTo, customTables);\n        customIndex++;\n        break;\n\n      default:\n        throw new Jbig2Error(\"invalid Huffman FS selector\");\n    }\n\n    switch (textRegion.huffmanDS) {\n      case 0:\n      case 1:\n      case 2:\n        tableDeltaS = getStandardTable(textRegion.huffmanDS + 8);\n        break;\n\n      case 3:\n        tableDeltaS = getCustomHuffmanTable(customIndex, referredTo, customTables);\n        customIndex++;\n        break;\n\n      default:\n        throw new Jbig2Error(\"invalid Huffman DS selector\");\n    }\n\n    switch (textRegion.huffmanDT) {\n      case 0:\n      case 1:\n      case 2:\n        tableDeltaT = getStandardTable(textRegion.huffmanDT + 11);\n        break;\n\n      case 3:\n        tableDeltaT = getCustomHuffmanTable(customIndex, referredTo, customTables);\n        customIndex++;\n        break;\n\n      default:\n        throw new Jbig2Error(\"invalid Huffman DT selector\");\n    }\n\n    if (textRegion.refinement) {\n      throw new Jbig2Error(\"refinement with Huffman is not supported\");\n    }\n\n    return {\n      symbolIDTable,\n      tableFirstS,\n      tableDeltaS,\n      tableDeltaT\n    };\n  }\n\n  function getSymbolDictionaryHuffmanTables(dictionary, referredTo, customTables) {\n    let customIndex = 0,\n        tableDeltaHeight,\n        tableDeltaWidth;\n\n    switch (dictionary.huffmanDHSelector) {\n      case 0:\n      case 1:\n        tableDeltaHeight = getStandardTable(dictionary.huffmanDHSelector + 4);\n        break;\n\n      case 3:\n        tableDeltaHeight = getCustomHuffmanTable(customIndex, referredTo, customTables);\n        customIndex++;\n        break;\n\n      default:\n        throw new Jbig2Error(\"invalid Huffman DH selector\");\n    }\n\n    switch (dictionary.huffmanDWSelector) {\n      case 0:\n      case 1:\n        tableDeltaWidth = getStandardTable(dictionary.huffmanDWSelector + 2);\n        break;\n\n      case 3:\n        tableDeltaWidth = getCustomHuffmanTable(customIndex, referredTo, customTables);\n        customIndex++;\n        break;\n\n      default:\n        throw new Jbig2Error(\"invalid Huffman DW selector\");\n    }\n\n    let tableBitmapSize, tableAggregateInstances;\n\n    if (dictionary.bitmapSizeSelector) {\n      tableBitmapSize = getCustomHuffmanTable(customIndex, referredTo, customTables);\n      customIndex++;\n    } else {\n      tableBitmapSize = getStandardTable(1);\n    }\n\n    if (dictionary.aggregationInstancesSelector) {\n      tableAggregateInstances = getCustomHuffmanTable(customIndex, referredTo, customTables);\n    } else {\n      tableAggregateInstances = getStandardTable(1);\n    }\n\n    return {\n      tableDeltaHeight,\n      tableDeltaWidth,\n      tableBitmapSize,\n      tableAggregateInstances\n    };\n  }\n\n  function readUncompressedBitmap(reader, width, height) {\n    const bitmap = [];\n\n    for (let y = 0; y < height; y++) {\n      const row = new Uint8Array(width);\n      bitmap.push(row);\n\n      for (let x = 0; x < width; x++) {\n        row[x] = reader.readBit();\n      }\n\n      reader.byteAlign();\n    }\n\n    return bitmap;\n  }\n\n  function decodeMMRBitmap(input, width, height, endOfBlock) {\n    const params = {\n      K: -1,\n      Columns: width,\n      Rows: height,\n      BlackIs1: true,\n      EndOfBlock: endOfBlock\n    };\n    const decoder = new _ccitt.CCITTFaxDecoder(input, params);\n    const bitmap = [];\n    let currentByte,\n        eof = false;\n\n    for (let y = 0; y < height; y++) {\n      const row = new Uint8Array(width);\n      bitmap.push(row);\n      let shift = -1;\n\n      for (let x = 0; x < width; x++) {\n        if (shift < 0) {\n          currentByte = decoder.readNextChar();\n\n          if (currentByte === -1) {\n            currentByte = 0;\n            eof = true;\n          }\n\n          shift = 7;\n        }\n\n        row[x] = currentByte >> shift & 1;\n        shift--;\n      }\n    }\n\n    if (endOfBlock && !eof) {\n      const lookForEOFLimit = 5;\n\n      for (let i = 0; i < lookForEOFLimit; i++) {\n        if (decoder.readNextChar() === -1) {\n          break;\n        }\n      }\n    }\n\n    return bitmap;\n  }\n\n  function Jbig2Image() {}\n\n  Jbig2Image.prototype = {\n    parseChunks(chunks) {\n      return parseJbig2Chunks(chunks);\n    },\n\n    parse(data) {\n      const {\n        imgData,\n        width,\n        height\n      } = parseJbig2(data);\n      this.width = width;\n      this.height = height;\n      return imgData;\n    }\n\n  };\n  return Jbig2Image;\n}();\n\nexports.Jbig2Image = Jbig2Image;\n\n/***/ }),\n/* 17 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.ArithmeticDecoder = void 0;\nconst QeTable = [{\n  qe: 0x5601,\n  nmps: 1,\n  nlps: 1,\n  switchFlag: 1\n}, {\n  qe: 0x3401,\n  nmps: 2,\n  nlps: 6,\n  switchFlag: 0\n}, {\n  qe: 0x1801,\n  nmps: 3,\n  nlps: 9,\n  switchFlag: 0\n}, {\n  qe: 0x0ac1,\n  nmps: 4,\n  nlps: 12,\n  switchFlag: 0\n}, {\n  qe: 0x0521,\n  nmps: 5,\n  nlps: 29,\n  switchFlag: 0\n}, {\n  qe: 0x0221,\n  nmps: 38,\n  nlps: 33,\n  switchFlag: 0\n}, {\n  qe: 0x5601,\n  nmps: 7,\n  nlps: 6,\n  switchFlag: 1\n}, {\n  qe: 0x5401,\n  nmps: 8,\n  nlps: 14,\n  switchFlag: 0\n}, {\n  qe: 0x4801,\n  nmps: 9,\n  nlps: 14,\n  switchFlag: 0\n}, {\n  qe: 0x3801,\n  nmps: 10,\n  nlps: 14,\n  switchFlag: 0\n}, {\n  qe: 0x3001,\n  nmps: 11,\n  nlps: 17,\n  switchFlag: 0\n}, {\n  qe: 0x2401,\n  nmps: 12,\n  nlps: 18,\n  switchFlag: 0\n}, {\n  qe: 0x1c01,\n  nmps: 13,\n  nlps: 20,\n  switchFlag: 0\n}, {\n  qe: 0x1601,\n  nmps: 29,\n  nlps: 21,\n  switchFlag: 0\n}, {\n  qe: 0x5601,\n  nmps: 15,\n  nlps: 14,\n  switchFlag: 1\n}, {\n  qe: 0x5401,\n  nmps: 16,\n  nlps: 14,\n  switchFlag: 0\n}, {\n  qe: 0x5101,\n  nmps: 17,\n  nlps: 15,\n  switchFlag: 0\n}, {\n  qe: 0x4801,\n  nmps: 18,\n  nlps: 16,\n  switchFlag: 0\n}, {\n  qe: 0x3801,\n  nmps: 19,\n  nlps: 17,\n  switchFlag: 0\n}, {\n  qe: 0x3401,\n  nmps: 20,\n  nlps: 18,\n  switchFlag: 0\n}, {\n  qe: 0x3001,\n  nmps: 21,\n  nlps: 19,\n  switchFlag: 0\n}, {\n  qe: 0x2801,\n  nmps: 22,\n  nlps: 19,\n  switchFlag: 0\n}, {\n  qe: 0x2401,\n  nmps: 23,\n  nlps: 20,\n  switchFlag: 0\n}, {\n  qe: 0x2201,\n  nmps: 24,\n  nlps: 21,\n  switchFlag: 0\n}, {\n  qe: 0x1c01,\n  nmps: 25,\n  nlps: 22,\n  switchFlag: 0\n}, {\n  qe: 0x1801,\n  nmps: 26,\n  nlps: 23,\n  switchFlag: 0\n}, {\n  qe: 0x1601,\n  nmps: 27,\n  nlps: 24,\n  switchFlag: 0\n}, {\n  qe: 0x1401,\n  nmps: 28,\n  nlps: 25,\n  switchFlag: 0\n}, {\n  qe: 0x1201,\n  nmps: 29,\n  nlps: 26,\n  switchFlag: 0\n}, {\n  qe: 0x1101,\n  nmps: 30,\n  nlps: 27,\n  switchFlag: 0\n}, {\n  qe: 0x0ac1,\n  nmps: 31,\n  nlps: 28,\n  switchFlag: 0\n}, {\n  qe: 0x09c1,\n  nmps: 32,\n  nlps: 29,\n  switchFlag: 0\n}, {\n  qe: 0x08a1,\n  nmps: 33,\n  nlps: 30,\n  switchFlag: 0\n}, {\n  qe: 0x0521,\n  nmps: 34,\n  nlps: 31,\n  switchFlag: 0\n}, {\n  qe: 0x0441,\n  nmps: 35,\n  nlps: 32,\n  switchFlag: 0\n}, {\n  qe: 0x02a1,\n  nmps: 36,\n  nlps: 33,\n  switchFlag: 0\n}, {\n  qe: 0x0221,\n  nmps: 37,\n  nlps: 34,\n  switchFlag: 0\n}, {\n  qe: 0x0141,\n  nmps: 38,\n  nlps: 35,\n  switchFlag: 0\n}, {\n  qe: 0x0111,\n  nmps: 39,\n  nlps: 36,\n  switchFlag: 0\n}, {\n  qe: 0x0085,\n  nmps: 40,\n  nlps: 37,\n  switchFlag: 0\n}, {\n  qe: 0x0049,\n  nmps: 41,\n  nlps: 38,\n  switchFlag: 0\n}, {\n  qe: 0x0025,\n  nmps: 42,\n  nlps: 39,\n  switchFlag: 0\n}, {\n  qe: 0x0015,\n  nmps: 43,\n  nlps: 40,\n  switchFlag: 0\n}, {\n  qe: 0x0009,\n  nmps: 44,\n  nlps: 41,\n  switchFlag: 0\n}, {\n  qe: 0x0005,\n  nmps: 45,\n  nlps: 42,\n  switchFlag: 0\n}, {\n  qe: 0x0001,\n  nmps: 45,\n  nlps: 43,\n  switchFlag: 0\n}, {\n  qe: 0x5601,\n  nmps: 46,\n  nlps: 46,\n  switchFlag: 0\n}];\n\nclass ArithmeticDecoder {\n  constructor(data, start, end) {\n    this.data = data;\n    this.bp = start;\n    this.dataEnd = end;\n    this.chigh = data[start];\n    this.clow = 0;\n    this.byteIn();\n    this.chigh = this.chigh << 7 & 0xffff | this.clow >> 9 & 0x7f;\n    this.clow = this.clow << 7 & 0xffff;\n    this.ct -= 7;\n    this.a = 0x8000;\n  }\n\n  byteIn() {\n    const data = this.data;\n    let bp = this.bp;\n\n    if (data[bp] === 0xff) {\n      if (data[bp + 1] > 0x8f) {\n        this.clow += 0xff00;\n        this.ct = 8;\n      } else {\n        bp++;\n        this.clow += data[bp] << 9;\n        this.ct = 7;\n        this.bp = bp;\n      }\n    } else {\n      bp++;\n      this.clow += bp < this.dataEnd ? data[bp] << 8 : 0xff00;\n      this.ct = 8;\n      this.bp = bp;\n    }\n\n    if (this.clow > 0xffff) {\n      this.chigh += this.clow >> 16;\n      this.clow &= 0xffff;\n    }\n  }\n\n  readBit(contexts, pos) {\n    let cx_index = contexts[pos] >> 1,\n        cx_mps = contexts[pos] & 1;\n    const qeTableIcx = QeTable[cx_index];\n    const qeIcx = qeTableIcx.qe;\n    let d;\n    let a = this.a - qeIcx;\n\n    if (this.chigh < qeIcx) {\n      if (a < qeIcx) {\n        a = qeIcx;\n        d = cx_mps;\n        cx_index = qeTableIcx.nmps;\n      } else {\n        a = qeIcx;\n        d = 1 ^ cx_mps;\n\n        if (qeTableIcx.switchFlag === 1) {\n          cx_mps = d;\n        }\n\n        cx_index = qeTableIcx.nlps;\n      }\n    } else {\n      this.chigh -= qeIcx;\n\n      if ((a & 0x8000) !== 0) {\n        this.a = a;\n        return cx_mps;\n      }\n\n      if (a < qeIcx) {\n        d = 1 ^ cx_mps;\n\n        if (qeTableIcx.switchFlag === 1) {\n          cx_mps = d;\n        }\n\n        cx_index = qeTableIcx.nlps;\n      } else {\n        d = cx_mps;\n        cx_index = qeTableIcx.nmps;\n      }\n    }\n\n    do {\n      if (this.ct === 0) {\n        this.byteIn();\n      }\n\n      a <<= 1;\n      this.chigh = this.chigh << 1 & 0xffff | this.clow >> 15 & 1;\n      this.clow = this.clow << 1 & 0xffff;\n      this.ct--;\n    } while ((a & 0x8000) === 0);\n\n    this.a = a;\n    contexts[pos] = cx_index << 1 | cx_mps;\n    return d;\n  }\n\n}\n\nexports.ArithmeticDecoder = ArithmeticDecoder;\n\n/***/ }),\n/* 18 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.JpegStream = void 0;\n\nvar _stream = __w_pdfjs_require__(12);\n\nvar _primitives = __w_pdfjs_require__(5);\n\nvar _jpg = __w_pdfjs_require__(19);\n\nvar _util = __w_pdfjs_require__(2);\n\nconst JpegStream = function JpegStreamClosure() {\n  function JpegStream(stream, maybeLength, dict, params) {\n    let ch;\n\n    while ((ch = stream.getByte()) !== -1) {\n      if (ch === 0xff) {\n        stream.skip(-1);\n        break;\n      }\n    }\n\n    this.stream = stream;\n    this.maybeLength = maybeLength;\n    this.dict = dict;\n    this.params = params;\n\n    _stream.DecodeStream.call(this, maybeLength);\n  }\n\n  JpegStream.prototype = Object.create(_stream.DecodeStream.prototype);\n  Object.defineProperty(JpegStream.prototype, \"bytes\", {\n    get: function JpegStream_bytes() {\n      return (0, _util.shadow)(this, \"bytes\", this.stream.getBytes(this.maybeLength));\n    },\n    configurable: true\n  });\n\n  JpegStream.prototype.ensureBuffer = function (requested) {};\n\n  JpegStream.prototype.readBlock = function () {\n    if (this.eof) {\n      return;\n    }\n\n    const jpegOptions = {\n      decodeTransform: undefined,\n      colorTransform: undefined\n    };\n    const decodeArr = this.dict.getArray(\"Decode\", \"D\");\n\n    if (this.forceRGB && Array.isArray(decodeArr)) {\n      const bitsPerComponent = this.dict.get(\"BitsPerComponent\") || 8;\n      const decodeArrLength = decodeArr.length;\n      const transform = new Int32Array(decodeArrLength);\n      let transformNeeded = false;\n      const maxValue = (1 << bitsPerComponent) - 1;\n\n      for (let i = 0; i < decodeArrLength; i += 2) {\n        transform[i] = (decodeArr[i + 1] - decodeArr[i]) * 256 | 0;\n        transform[i + 1] = decodeArr[i] * maxValue | 0;\n\n        if (transform[i] !== 256 || transform[i + 1] !== 0) {\n          transformNeeded = true;\n        }\n      }\n\n      if (transformNeeded) {\n        jpegOptions.decodeTransform = transform;\n      }\n    }\n\n    if ((0, _primitives.isDict)(this.params)) {\n      const colorTransform = this.params.get(\"ColorTransform\");\n\n      if (Number.isInteger(colorTransform)) {\n        jpegOptions.colorTransform = colorTransform;\n      }\n    }\n\n    const jpegImage = new _jpg.JpegImage(jpegOptions);\n    jpegImage.parse(this.bytes);\n    const data = jpegImage.getData({\n      width: this.drawWidth,\n      height: this.drawHeight,\n      forceRGB: this.forceRGB,\n      isSourcePDF: true\n    });\n    this.buffer = data;\n    this.bufferLength = data.length;\n    this.eof = true;\n  };\n\n  return JpegStream;\n}();\n\nexports.JpegStream = JpegStream;\n\n/***/ }),\n/* 19 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.JpegImage = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nclass JpegError extends _util.BaseException {\n  constructor(msg) {\n    super(`JPEG error: ${msg}`);\n  }\n\n}\n\nclass DNLMarkerError extends _util.BaseException {\n  constructor(message, scanLines) {\n    super(message);\n    this.scanLines = scanLines;\n  }\n\n}\n\nclass EOIMarkerError extends _util.BaseException {}\n\nvar JpegImage = function JpegImageClosure() {\n  var dctZigZag = new Uint8Array([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]);\n  var dctCos1 = 4017;\n  var dctSin1 = 799;\n  var dctCos3 = 3406;\n  var dctSin3 = 2276;\n  var dctCos6 = 1567;\n  var dctSin6 = 3784;\n  var dctSqrt2 = 5793;\n  var dctSqrt1d2 = 2896;\n\n  function JpegImage({\n    decodeTransform = null,\n    colorTransform = -1\n  } = {}) {\n    this._decodeTransform = decodeTransform;\n    this._colorTransform = colorTransform;\n  }\n\n  function buildHuffmanTable(codeLengths, values) {\n    var k = 0,\n        code = [],\n        i,\n        j,\n        length = 16;\n\n    while (length > 0 && !codeLengths[length - 1]) {\n      length--;\n    }\n\n    code.push({\n      children: [],\n      index: 0\n    });\n    var p = code[0],\n        q;\n\n    for (i = 0; i < length; i++) {\n      for (j = 0; j < codeLengths[i]; j++) {\n        p = code.pop();\n        p.children[p.index] = values[k];\n\n        while (p.index > 0) {\n          p = code.pop();\n        }\n\n        p.index++;\n        code.push(p);\n\n        while (code.length <= i) {\n          code.push(q = {\n            children: [],\n            index: 0\n          });\n          p.children[p.index] = q.children;\n          p = q;\n        }\n\n        k++;\n      }\n\n      if (i + 1 < length) {\n        code.push(q = {\n          children: [],\n          index: 0\n        });\n        p.children[p.index] = q.children;\n        p = q;\n      }\n    }\n\n    return code[0].children;\n  }\n\n  function getBlockBufferOffset(component, row, col) {\n    return 64 * ((component.blocksPerLine + 1) * row + col);\n  }\n\n  function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive, parseDNLMarker = false) {\n    var mcusPerLine = frame.mcusPerLine;\n    var progressive = frame.progressive;\n    const startOffset = offset;\n    let bitsData = 0,\n        bitsCount = 0;\n\n    function readBit() {\n      if (bitsCount > 0) {\n        bitsCount--;\n        return bitsData >> bitsCount & 1;\n      }\n\n      bitsData = data[offset++];\n\n      if (bitsData === 0xff) {\n        var nextByte = data[offset++];\n\n        if (nextByte) {\n          if (nextByte === 0xdc && parseDNLMarker) {\n            offset += 2;\n            const scanLines = (0, _core_utils.readUint16)(data, offset);\n            offset += 2;\n\n            if (scanLines > 0 && scanLines !== frame.scanLines) {\n              throw new DNLMarkerError(\"Found DNL marker (0xFFDC) while parsing scan data\", scanLines);\n            }\n          } else if (nextByte === 0xd9) {\n            if (parseDNLMarker) {\n              const maybeScanLines = blockRow * (frame.precision === 8 ? 8 : 0);\n\n              if (maybeScanLines > 0 && Math.round(frame.scanLines / maybeScanLines) >= 10) {\n                throw new DNLMarkerError(\"Found EOI marker (0xFFD9) while parsing scan data, \" + \"possibly caused by incorrect `scanLines` parameter\", maybeScanLines);\n              }\n            }\n\n            throw new EOIMarkerError(\"Found EOI marker (0xFFD9) while parsing scan data\");\n          }\n\n          throw new JpegError(`unexpected marker ${(bitsData << 8 | nextByte).toString(16)}`);\n        }\n      }\n\n      bitsCount = 7;\n      return bitsData >>> 7;\n    }\n\n    function decodeHuffman(tree) {\n      var node = tree;\n\n      while (true) {\n        node = node[readBit()];\n\n        switch (typeof node) {\n          case \"number\":\n            return node;\n\n          case \"object\":\n            continue;\n        }\n\n        throw new JpegError(\"invalid huffman sequence\");\n      }\n    }\n\n    function receive(length) {\n      var n = 0;\n\n      while (length > 0) {\n        n = n << 1 | readBit();\n        length--;\n      }\n\n      return n;\n    }\n\n    function receiveAndExtend(length) {\n      if (length === 1) {\n        return readBit() === 1 ? 1 : -1;\n      }\n\n      var n = receive(length);\n\n      if (n >= 1 << length - 1) {\n        return n;\n      }\n\n      return n + (-1 << length) + 1;\n    }\n\n    function decodeBaseline(component, blockOffset) {\n      var t = decodeHuffman(component.huffmanTableDC);\n      var diff = t === 0 ? 0 : receiveAndExtend(t);\n      component.blockData[blockOffset] = component.pred += diff;\n      var k = 1;\n\n      while (k < 64) {\n        var rs = decodeHuffman(component.huffmanTableAC);\n        var s = rs & 15,\n            r = rs >> 4;\n\n        if (s === 0) {\n          if (r < 15) {\n            break;\n          }\n\n          k += 16;\n          continue;\n        }\n\n        k += r;\n        var z = dctZigZag[k];\n        component.blockData[blockOffset + z] = receiveAndExtend(s);\n        k++;\n      }\n    }\n\n    function decodeDCFirst(component, blockOffset) {\n      var t = decodeHuffman(component.huffmanTableDC);\n      var diff = t === 0 ? 0 : receiveAndExtend(t) << successive;\n      component.blockData[blockOffset] = component.pred += diff;\n    }\n\n    function decodeDCSuccessive(component, blockOffset) {\n      component.blockData[blockOffset] |= readBit() << successive;\n    }\n\n    var eobrun = 0;\n\n    function decodeACFirst(component, blockOffset) {\n      if (eobrun > 0) {\n        eobrun--;\n        return;\n      }\n\n      var k = spectralStart,\n          e = spectralEnd;\n\n      while (k <= e) {\n        var rs = decodeHuffman(component.huffmanTableAC);\n        var s = rs & 15,\n            r = rs >> 4;\n\n        if (s === 0) {\n          if (r < 15) {\n            eobrun = receive(r) + (1 << r) - 1;\n            break;\n          }\n\n          k += 16;\n          continue;\n        }\n\n        k += r;\n        var z = dctZigZag[k];\n        component.blockData[blockOffset + z] = receiveAndExtend(s) * (1 << successive);\n        k++;\n      }\n    }\n\n    var successiveACState = 0,\n        successiveACNextValue;\n\n    function decodeACSuccessive(component, blockOffset) {\n      var k = spectralStart;\n      var e = spectralEnd;\n      var r = 0;\n      var s;\n      var rs;\n\n      while (k <= e) {\n        const offsetZ = blockOffset + dctZigZag[k];\n        const sign = component.blockData[offsetZ] < 0 ? -1 : 1;\n\n        switch (successiveACState) {\n          case 0:\n            rs = decodeHuffman(component.huffmanTableAC);\n            s = rs & 15;\n            r = rs >> 4;\n\n            if (s === 0) {\n              if (r < 15) {\n                eobrun = receive(r) + (1 << r);\n                successiveACState = 4;\n              } else {\n                r = 16;\n                successiveACState = 1;\n              }\n            } else {\n              if (s !== 1) {\n                throw new JpegError(\"invalid ACn encoding\");\n              }\n\n              successiveACNextValue = receiveAndExtend(s);\n              successiveACState = r ? 2 : 3;\n            }\n\n            continue;\n\n          case 1:\n          case 2:\n            if (component.blockData[offsetZ]) {\n              component.blockData[offsetZ] += sign * (readBit() << successive);\n            } else {\n              r--;\n\n              if (r === 0) {\n                successiveACState = successiveACState === 2 ? 3 : 0;\n              }\n            }\n\n            break;\n\n          case 3:\n            if (component.blockData[offsetZ]) {\n              component.blockData[offsetZ] += sign * (readBit() << successive);\n            } else {\n              component.blockData[offsetZ] = successiveACNextValue << successive;\n              successiveACState = 0;\n            }\n\n            break;\n\n          case 4:\n            if (component.blockData[offsetZ]) {\n              component.blockData[offsetZ] += sign * (readBit() << successive);\n            }\n\n            break;\n        }\n\n        k++;\n      }\n\n      if (successiveACState === 4) {\n        eobrun--;\n\n        if (eobrun === 0) {\n          successiveACState = 0;\n        }\n      }\n    }\n\n    let blockRow = 0;\n\n    function decodeMcu(component, decode, mcu, row, col) {\n      var mcuRow = mcu / mcusPerLine | 0;\n      var mcuCol = mcu % mcusPerLine;\n      blockRow = mcuRow * component.v + row;\n      var blockCol = mcuCol * component.h + col;\n      const blockOffset = getBlockBufferOffset(component, blockRow, blockCol);\n      decode(component, blockOffset);\n    }\n\n    function decodeBlock(component, decode, mcu) {\n      blockRow = mcu / component.blocksPerLine | 0;\n      var blockCol = mcu % component.blocksPerLine;\n      const blockOffset = getBlockBufferOffset(component, blockRow, blockCol);\n      decode(component, blockOffset);\n    }\n\n    var componentsLength = components.length;\n    var component, i, j, k, n;\n    var decodeFn;\n\n    if (progressive) {\n      if (spectralStart === 0) {\n        decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;\n      } else {\n        decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;\n      }\n    } else {\n      decodeFn = decodeBaseline;\n    }\n\n    var mcu = 0,\n        fileMarker;\n    var mcuExpected;\n\n    if (componentsLength === 1) {\n      mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;\n    } else {\n      mcuExpected = mcusPerLine * frame.mcusPerColumn;\n    }\n\n    var h, v;\n\n    while (mcu <= mcuExpected) {\n      var mcuToRead = resetInterval ? Math.min(mcuExpected - mcu, resetInterval) : mcuExpected;\n\n      if (mcuToRead > 0) {\n        for (i = 0; i < componentsLength; i++) {\n          components[i].pred = 0;\n        }\n\n        eobrun = 0;\n\n        if (componentsLength === 1) {\n          component = components[0];\n\n          for (n = 0; n < mcuToRead; n++) {\n            decodeBlock(component, decodeFn, mcu);\n            mcu++;\n          }\n        } else {\n          for (n = 0; n < mcuToRead; n++) {\n            for (i = 0; i < componentsLength; i++) {\n              component = components[i];\n              h = component.h;\n              v = component.v;\n\n              for (j = 0; j < v; j++) {\n                for (k = 0; k < h; k++) {\n                  decodeMcu(component, decodeFn, mcu, j, k);\n                }\n              }\n            }\n\n            mcu++;\n          }\n        }\n      }\n\n      bitsCount = 0;\n      fileMarker = findNextFileMarker(data, offset);\n\n      if (!fileMarker) {\n        break;\n      }\n\n      if (fileMarker.invalid) {\n        const partialMsg = mcuToRead > 0 ? \"unexpected\" : \"excessive\";\n        (0, _util.warn)(`decodeScan - ${partialMsg} MCU data, current marker is: ${fileMarker.invalid}`);\n        offset = fileMarker.offset;\n      }\n\n      if (fileMarker.marker >= 0xffd0 && fileMarker.marker <= 0xffd7) {\n        offset += 2;\n      } else {\n        break;\n      }\n    }\n\n    return offset - startOffset;\n  }\n\n  function quantizeAndInverse(component, blockBufferOffset, p) {\n    var qt = component.quantizationTable,\n        blockData = component.blockData;\n    var v0, v1, v2, v3, v4, v5, v6, v7;\n    var p0, p1, p2, p3, p4, p5, p6, p7;\n    var t;\n\n    if (!qt) {\n      throw new JpegError(\"missing required Quantization Table.\");\n    }\n\n    for (var row = 0; row < 64; row += 8) {\n      p0 = blockData[blockBufferOffset + row];\n      p1 = blockData[blockBufferOffset + row + 1];\n      p2 = blockData[blockBufferOffset + row + 2];\n      p3 = blockData[blockBufferOffset + row + 3];\n      p4 = blockData[blockBufferOffset + row + 4];\n      p5 = blockData[blockBufferOffset + row + 5];\n      p6 = blockData[blockBufferOffset + row + 6];\n      p7 = blockData[blockBufferOffset + row + 7];\n      p0 *= qt[row];\n\n      if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {\n        t = dctSqrt2 * p0 + 512 >> 10;\n        p[row] = t;\n        p[row + 1] = t;\n        p[row + 2] = t;\n        p[row + 3] = t;\n        p[row + 4] = t;\n        p[row + 5] = t;\n        p[row + 6] = t;\n        p[row + 7] = t;\n        continue;\n      }\n\n      p1 *= qt[row + 1];\n      p2 *= qt[row + 2];\n      p3 *= qt[row + 3];\n      p4 *= qt[row + 4];\n      p5 *= qt[row + 5];\n      p6 *= qt[row + 6];\n      p7 *= qt[row + 7];\n      v0 = dctSqrt2 * p0 + 128 >> 8;\n      v1 = dctSqrt2 * p4 + 128 >> 8;\n      v2 = p2;\n      v3 = p6;\n      v4 = dctSqrt1d2 * (p1 - p7) + 128 >> 8;\n      v7 = dctSqrt1d2 * (p1 + p7) + 128 >> 8;\n      v5 = p3 << 4;\n      v6 = p5 << 4;\n      v0 = v0 + v1 + 1 >> 1;\n      v1 = v0 - v1;\n      t = v2 * dctSin6 + v3 * dctCos6 + 128 >> 8;\n      v2 = v2 * dctCos6 - v3 * dctSin6 + 128 >> 8;\n      v3 = t;\n      v4 = v4 + v6 + 1 >> 1;\n      v6 = v4 - v6;\n      v7 = v7 + v5 + 1 >> 1;\n      v5 = v7 - v5;\n      v0 = v0 + v3 + 1 >> 1;\n      v3 = v0 - v3;\n      v1 = v1 + v2 + 1 >> 1;\n      v2 = v1 - v2;\n      t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;\n      v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;\n      v7 = t;\n      t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;\n      v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;\n      v6 = t;\n      p[row] = v0 + v7;\n      p[row + 7] = v0 - v7;\n      p[row + 1] = v1 + v6;\n      p[row + 6] = v1 - v6;\n      p[row + 2] = v2 + v5;\n      p[row + 5] = v2 - v5;\n      p[row + 3] = v3 + v4;\n      p[row + 4] = v3 - v4;\n    }\n\n    for (var col = 0; col < 8; ++col) {\n      p0 = p[col];\n      p1 = p[col + 8];\n      p2 = p[col + 16];\n      p3 = p[col + 24];\n      p4 = p[col + 32];\n      p5 = p[col + 40];\n      p6 = p[col + 48];\n      p7 = p[col + 56];\n\n      if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {\n        t = dctSqrt2 * p0 + 8192 >> 14;\n\n        if (t < -2040) {\n          t = 0;\n        } else if (t >= 2024) {\n          t = 255;\n        } else {\n          t = t + 2056 >> 4;\n        }\n\n        blockData[blockBufferOffset + col] = t;\n        blockData[blockBufferOffset + col + 8] = t;\n        blockData[blockBufferOffset + col + 16] = t;\n        blockData[blockBufferOffset + col + 24] = t;\n        blockData[blockBufferOffset + col + 32] = t;\n        blockData[blockBufferOffset + col + 40] = t;\n        blockData[blockBufferOffset + col + 48] = t;\n        blockData[blockBufferOffset + col + 56] = t;\n        continue;\n      }\n\n      v0 = dctSqrt2 * p0 + 2048 >> 12;\n      v1 = dctSqrt2 * p4 + 2048 >> 12;\n      v2 = p2;\n      v3 = p6;\n      v4 = dctSqrt1d2 * (p1 - p7) + 2048 >> 12;\n      v7 = dctSqrt1d2 * (p1 + p7) + 2048 >> 12;\n      v5 = p3;\n      v6 = p5;\n      v0 = (v0 + v1 + 1 >> 1) + 4112;\n      v1 = v0 - v1;\n      t = v2 * dctSin6 + v3 * dctCos6 + 2048 >> 12;\n      v2 = v2 * dctCos6 - v3 * dctSin6 + 2048 >> 12;\n      v3 = t;\n      v4 = v4 + v6 + 1 >> 1;\n      v6 = v4 - v6;\n      v7 = v7 + v5 + 1 >> 1;\n      v5 = v7 - v5;\n      v0 = v0 + v3 + 1 >> 1;\n      v3 = v0 - v3;\n      v1 = v1 + v2 + 1 >> 1;\n      v2 = v1 - v2;\n      t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;\n      v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;\n      v7 = t;\n      t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;\n      v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;\n      v6 = t;\n      p0 = v0 + v7;\n      p7 = v0 - v7;\n      p1 = v1 + v6;\n      p6 = v1 - v6;\n      p2 = v2 + v5;\n      p5 = v2 - v5;\n      p3 = v3 + v4;\n      p4 = v3 - v4;\n\n      if (p0 < 16) {\n        p0 = 0;\n      } else if (p0 >= 4080) {\n        p0 = 255;\n      } else {\n        p0 >>= 4;\n      }\n\n      if (p1 < 16) {\n        p1 = 0;\n      } else if (p1 >= 4080) {\n        p1 = 255;\n      } else {\n        p1 >>= 4;\n      }\n\n      if (p2 < 16) {\n        p2 = 0;\n      } else if (p2 >= 4080) {\n        p2 = 255;\n      } else {\n        p2 >>= 4;\n      }\n\n      if (p3 < 16) {\n        p3 = 0;\n      } else if (p3 >= 4080) {\n        p3 = 255;\n      } else {\n        p3 >>= 4;\n      }\n\n      if (p4 < 16) {\n        p4 = 0;\n      } else if (p4 >= 4080) {\n        p4 = 255;\n      } else {\n        p4 >>= 4;\n      }\n\n      if (p5 < 16) {\n        p5 = 0;\n      } else if (p5 >= 4080) {\n        p5 = 255;\n      } else {\n        p5 >>= 4;\n      }\n\n      if (p6 < 16) {\n        p6 = 0;\n      } else if (p6 >= 4080) {\n        p6 = 255;\n      } else {\n        p6 >>= 4;\n      }\n\n      if (p7 < 16) {\n        p7 = 0;\n      } else if (p7 >= 4080) {\n        p7 = 255;\n      } else {\n        p7 >>= 4;\n      }\n\n      blockData[blockBufferOffset + col] = p0;\n      blockData[blockBufferOffset + col + 8] = p1;\n      blockData[blockBufferOffset + col + 16] = p2;\n      blockData[blockBufferOffset + col + 24] = p3;\n      blockData[blockBufferOffset + col + 32] = p4;\n      blockData[blockBufferOffset + col + 40] = p5;\n      blockData[blockBufferOffset + col + 48] = p6;\n      blockData[blockBufferOffset + col + 56] = p7;\n    }\n  }\n\n  function buildComponentData(frame, component) {\n    var blocksPerLine = component.blocksPerLine;\n    var blocksPerColumn = component.blocksPerColumn;\n    var computationBuffer = new Int16Array(64);\n\n    for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {\n      for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {\n        var offset = getBlockBufferOffset(component, blockRow, blockCol);\n        quantizeAndInverse(component, offset, computationBuffer);\n      }\n    }\n\n    return component.blockData;\n  }\n\n  function findNextFileMarker(data, currentPos, startPos = currentPos) {\n    const maxPos = data.length - 1;\n    var newPos = startPos < currentPos ? startPos : currentPos;\n\n    if (currentPos >= maxPos) {\n      return null;\n    }\n\n    var currentMarker = (0, _core_utils.readUint16)(data, currentPos);\n\n    if (currentMarker >= 0xffc0 && currentMarker <= 0xfffe) {\n      return {\n        invalid: null,\n        marker: currentMarker,\n        offset: currentPos\n      };\n    }\n\n    var newMarker = (0, _core_utils.readUint16)(data, newPos);\n\n    while (!(newMarker >= 0xffc0 && newMarker <= 0xfffe)) {\n      if (++newPos >= maxPos) {\n        return null;\n      }\n\n      newMarker = (0, _core_utils.readUint16)(data, newPos);\n    }\n\n    return {\n      invalid: currentMarker.toString(16),\n      marker: newMarker,\n      offset: newPos\n    };\n  }\n\n  JpegImage.prototype = {\n    parse(data, {\n      dnlScanLines = null\n    } = {}) {\n      function readDataBlock() {\n        const length = (0, _core_utils.readUint16)(data, offset);\n        offset += 2;\n        let endOffset = offset + length - 2;\n        var fileMarker = findNextFileMarker(data, endOffset, offset);\n\n        if (fileMarker && fileMarker.invalid) {\n          (0, _util.warn)(\"readDataBlock - incorrect length, current marker is: \" + fileMarker.invalid);\n          endOffset = fileMarker.offset;\n        }\n\n        var array = data.subarray(offset, endOffset);\n        offset += array.length;\n        return array;\n      }\n\n      function prepareComponents(frame) {\n        var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH);\n        var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV);\n\n        for (var i = 0; i < frame.components.length; i++) {\n          component = frame.components[i];\n          var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH);\n          var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / frame.maxV);\n          var blocksPerLineForMcu = mcusPerLine * component.h;\n          var blocksPerColumnForMcu = mcusPerColumn * component.v;\n          var blocksBufferSize = 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1);\n          component.blockData = new Int16Array(blocksBufferSize);\n          component.blocksPerLine = blocksPerLine;\n          component.blocksPerColumn = blocksPerColumn;\n        }\n\n        frame.mcusPerLine = mcusPerLine;\n        frame.mcusPerColumn = mcusPerColumn;\n      }\n\n      var offset = 0;\n      var jfif = null;\n      var adobe = null;\n      var frame, resetInterval;\n      let numSOSMarkers = 0;\n      var quantizationTables = [];\n      var huffmanTablesAC = [],\n          huffmanTablesDC = [];\n      let fileMarker = (0, _core_utils.readUint16)(data, offset);\n      offset += 2;\n\n      if (fileMarker !== 0xffd8) {\n        throw new JpegError(\"SOI not found\");\n      }\n\n      fileMarker = (0, _core_utils.readUint16)(data, offset);\n      offset += 2;\n\n      markerLoop: while (fileMarker !== 0xffd9) {\n        var i, j, l;\n\n        switch (fileMarker) {\n          case 0xffe0:\n          case 0xffe1:\n          case 0xffe2:\n          case 0xffe3:\n          case 0xffe4:\n          case 0xffe5:\n          case 0xffe6:\n          case 0xffe7:\n          case 0xffe8:\n          case 0xffe9:\n          case 0xffea:\n          case 0xffeb:\n          case 0xffec:\n          case 0xffed:\n          case 0xffee:\n          case 0xffef:\n          case 0xfffe:\n            var appData = readDataBlock();\n\n            if (fileMarker === 0xffe0) {\n              if (appData[0] === 0x4a && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) {\n                jfif = {\n                  version: {\n                    major: appData[5],\n                    minor: appData[6]\n                  },\n                  densityUnits: appData[7],\n                  xDensity: appData[8] << 8 | appData[9],\n                  yDensity: appData[10] << 8 | appData[11],\n                  thumbWidth: appData[12],\n                  thumbHeight: appData[13],\n                  thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])\n                };\n              }\n            }\n\n            if (fileMarker === 0xffee) {\n              if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6f && appData[3] === 0x62 && appData[4] === 0x65) {\n                adobe = {\n                  version: appData[5] << 8 | appData[6],\n                  flags0: appData[7] << 8 | appData[8],\n                  flags1: appData[9] << 8 | appData[10],\n                  transformCode: appData[11]\n                };\n              }\n            }\n\n            break;\n\n          case 0xffdb:\n            const quantizationTablesLength = (0, _core_utils.readUint16)(data, offset);\n            offset += 2;\n            var quantizationTablesEnd = quantizationTablesLength + offset - 2;\n            var z;\n\n            while (offset < quantizationTablesEnd) {\n              var quantizationTableSpec = data[offset++];\n              var tableData = new Uint16Array(64);\n\n              if (quantizationTableSpec >> 4 === 0) {\n                for (j = 0; j < 64; j++) {\n                  z = dctZigZag[j];\n                  tableData[z] = data[offset++];\n                }\n              } else if (quantizationTableSpec >> 4 === 1) {\n                for (j = 0; j < 64; j++) {\n                  z = dctZigZag[j];\n                  tableData[z] = (0, _core_utils.readUint16)(data, offset);\n                  offset += 2;\n                }\n              } else {\n                throw new JpegError(\"DQT - invalid table spec\");\n              }\n\n              quantizationTables[quantizationTableSpec & 15] = tableData;\n            }\n\n            break;\n\n          case 0xffc0:\n          case 0xffc1:\n          case 0xffc2:\n            if (frame) {\n              throw new JpegError(\"Only single frame JPEGs supported\");\n            }\n\n            offset += 2;\n            frame = {};\n            frame.extended = fileMarker === 0xffc1;\n            frame.progressive = fileMarker === 0xffc2;\n            frame.precision = data[offset++];\n            const sofScanLines = (0, _core_utils.readUint16)(data, offset);\n            offset += 2;\n            frame.scanLines = dnlScanLines || sofScanLines;\n            frame.samplesPerLine = (0, _core_utils.readUint16)(data, offset);\n            offset += 2;\n            frame.components = [];\n            frame.componentIds = {};\n            var componentsCount = data[offset++],\n                componentId;\n            var maxH = 0,\n                maxV = 0;\n\n            for (i = 0; i < componentsCount; i++) {\n              componentId = data[offset];\n              var h = data[offset + 1] >> 4;\n              var v = data[offset + 1] & 15;\n\n              if (maxH < h) {\n                maxH = h;\n              }\n\n              if (maxV < v) {\n                maxV = v;\n              }\n\n              var qId = data[offset + 2];\n              l = frame.components.push({\n                h,\n                v,\n                quantizationId: qId,\n                quantizationTable: null\n              });\n              frame.componentIds[componentId] = l - 1;\n              offset += 3;\n            }\n\n            frame.maxH = maxH;\n            frame.maxV = maxV;\n            prepareComponents(frame);\n            break;\n\n          case 0xffc4:\n            const huffmanLength = (0, _core_utils.readUint16)(data, offset);\n            offset += 2;\n\n            for (i = 2; i < huffmanLength;) {\n              var huffmanTableSpec = data[offset++];\n              var codeLengths = new Uint8Array(16);\n              var codeLengthSum = 0;\n\n              for (j = 0; j < 16; j++, offset++) {\n                codeLengthSum += codeLengths[j] = data[offset];\n              }\n\n              var huffmanValues = new Uint8Array(codeLengthSum);\n\n              for (j = 0; j < codeLengthSum; j++, offset++) {\n                huffmanValues[j] = data[offset];\n              }\n\n              i += 17 + codeLengthSum;\n              (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues);\n            }\n\n            break;\n\n          case 0xffdd:\n            offset += 2;\n            resetInterval = (0, _core_utils.readUint16)(data, offset);\n            offset += 2;\n            break;\n\n          case 0xffda:\n            const parseDNLMarker = ++numSOSMarkers === 1 && !dnlScanLines;\n            offset += 2;\n            var selectorsCount = data[offset++];\n            var components = [],\n                component;\n\n            for (i = 0; i < selectorsCount; i++) {\n              const index = data[offset++];\n              var componentIndex = frame.componentIds[index];\n              component = frame.components[componentIndex];\n              component.index = index;\n              var tableSpec = data[offset++];\n              component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];\n              component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];\n              components.push(component);\n            }\n\n            var spectralStart = data[offset++];\n            var spectralEnd = data[offset++];\n            var successiveApproximation = data[offset++];\n\n            try {\n              var processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15, parseDNLMarker);\n              offset += processed;\n            } catch (ex) {\n              if (ex instanceof DNLMarkerError) {\n                (0, _util.warn)(`${ex.message} -- attempting to re-parse the JPEG image.`);\n                return this.parse(data, {\n                  dnlScanLines: ex.scanLines\n                });\n              } else if (ex instanceof EOIMarkerError) {\n                (0, _util.warn)(`${ex.message} -- ignoring the rest of the image data.`);\n                break markerLoop;\n              }\n\n              throw ex;\n            }\n\n            break;\n\n          case 0xffdc:\n            offset += 4;\n            break;\n\n          case 0xffff:\n            if (data[offset] !== 0xff) {\n              offset--;\n            }\n\n            break;\n\n          default:\n            const nextFileMarker = findNextFileMarker(data, offset - 2, offset - 3);\n\n            if (nextFileMarker && nextFileMarker.invalid) {\n              (0, _util.warn)(\"JpegImage.parse - unexpected data, current marker is: \" + nextFileMarker.invalid);\n              offset = nextFileMarker.offset;\n              break;\n            }\n\n            if (!nextFileMarker || offset >= data.length - 1) {\n              (0, _util.warn)(\"JpegImage.parse - reached the end of the image data \" + \"without finding an EOI marker (0xFFD9).\");\n              break markerLoop;\n            }\n\n            throw new JpegError(\"JpegImage.parse - unknown marker: \" + fileMarker.toString(16));\n        }\n\n        fileMarker = (0, _core_utils.readUint16)(data, offset);\n        offset += 2;\n      }\n\n      this.width = frame.samplesPerLine;\n      this.height = frame.scanLines;\n      this.jfif = jfif;\n      this.adobe = adobe;\n      this.components = [];\n\n      for (i = 0; i < frame.components.length; i++) {\n        component = frame.components[i];\n        var quantizationTable = quantizationTables[component.quantizationId];\n\n        if (quantizationTable) {\n          component.quantizationTable = quantizationTable;\n        }\n\n        this.components.push({\n          index: component.index,\n          output: buildComponentData(frame, component),\n          scaleX: component.h / frame.maxH,\n          scaleY: component.v / frame.maxV,\n          blocksPerLine: component.blocksPerLine,\n          blocksPerColumn: component.blocksPerColumn\n        });\n      }\n\n      this.numComponents = this.components.length;\n      return undefined;\n    },\n\n    _getLinearizedBlockData(width, height, isSourcePDF = false) {\n      var scaleX = this.width / width,\n          scaleY = this.height / height;\n      var component, componentScaleX, componentScaleY, blocksPerScanline;\n      var x, y, i, j, k;\n      var index;\n      var offset = 0;\n      var output;\n      var numComponents = this.components.length;\n      var dataLength = width * height * numComponents;\n      var data = new Uint8ClampedArray(dataLength);\n      var xScaleBlockOffset = new Uint32Array(width);\n      var mask3LSB = 0xfffffff8;\n      let lastComponentScaleX;\n\n      for (i = 0; i < numComponents; i++) {\n        component = this.components[i];\n        componentScaleX = component.scaleX * scaleX;\n        componentScaleY = component.scaleY * scaleY;\n        offset = i;\n        output = component.output;\n        blocksPerScanline = component.blocksPerLine + 1 << 3;\n\n        if (componentScaleX !== lastComponentScaleX) {\n          for (x = 0; x < width; x++) {\n            j = 0 | x * componentScaleX;\n            xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7;\n          }\n\n          lastComponentScaleX = componentScaleX;\n        }\n\n        for (y = 0; y < height; y++) {\n          j = 0 | y * componentScaleY;\n          index = blocksPerScanline * (j & mask3LSB) | (j & 7) << 3;\n\n          for (x = 0; x < width; x++) {\n            data[offset] = output[index + xScaleBlockOffset[x]];\n            offset += numComponents;\n          }\n        }\n      }\n\n      let transform = this._decodeTransform;\n\n      if (!isSourcePDF && numComponents === 4 && !transform) {\n        transform = new Int32Array([-256, 255, -256, 255, -256, 255, -256, 255]);\n      }\n\n      if (transform) {\n        for (i = 0; i < dataLength;) {\n          for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) {\n            data[i] = (data[i] * transform[k] >> 8) + transform[k + 1];\n          }\n        }\n      }\n\n      return data;\n    },\n\n    get _isColorConversionNeeded() {\n      if (this.adobe) {\n        return !!this.adobe.transformCode;\n      }\n\n      if (this.numComponents === 3) {\n        if (this._colorTransform === 0) {\n          return false;\n        } else if (this.components[0].index === 0x52 && this.components[1].index === 0x47 && this.components[2].index === 0x42) {\n          return false;\n        }\n\n        return true;\n      }\n\n      if (this._colorTransform === 1) {\n        return true;\n      }\n\n      return false;\n    },\n\n    _convertYccToRgb: function convertYccToRgb(data) {\n      var Y, Cb, Cr;\n\n      for (var i = 0, length = data.length; i < length; i += 3) {\n        Y = data[i];\n        Cb = data[i + 1];\n        Cr = data[i + 2];\n        data[i] = Y - 179.456 + 1.402 * Cr;\n        data[i + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr;\n        data[i + 2] = Y - 226.816 + 1.772 * Cb;\n      }\n\n      return data;\n    },\n    _convertYcckToRgb: function convertYcckToRgb(data) {\n      var Y, Cb, Cr, k;\n      var offset = 0;\n\n      for (var i = 0, length = data.length; i < length; i += 4) {\n        Y = data[i];\n        Cb = data[i + 1];\n        Cr = data[i + 2];\n        k = data[i + 3];\n        data[offset++] = -122.67195406894 + Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - 0.154362151871126) + Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - 0.00477271405408747 * k + 1.53380253221734) + Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + 0.48357088451265) + k * (-0.000336197177618394 * k + 0.484791561490776);\n        data[offset++] = 107.268039397724 + Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + 0.000659397001245577 * Y + 0.000426105652938837 * k - 0.176491792462875) + Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + 0.000770482631801132 * k - 0.151051492775562) + Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + 0.25802910206845) + k * (-0.000318913117588328 * k - 0.213742400323665);\n        data[offset++] = -20.810012546947 + Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + 0.0020741088115012 * Y - 0.00288260236853442 * k + 0.814272968359295) + Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + 0.000560833691242812 * k - 0.195152027534049) + Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407);\n      }\n\n      return data.subarray(0, offset);\n    },\n    _convertYcckToCmyk: function convertYcckToCmyk(data) {\n      var Y, Cb, Cr;\n\n      for (var i = 0, length = data.length; i < length; i += 4) {\n        Y = data[i];\n        Cb = data[i + 1];\n        Cr = data[i + 2];\n        data[i] = 434.456 - Y - 1.402 * Cr;\n        data[i + 1] = 119.541 - Y + 0.344 * Cb + 0.714 * Cr;\n        data[i + 2] = 481.816 - Y - 1.772 * Cb;\n      }\n\n      return data;\n    },\n    _convertCmykToRgb: function convertCmykToRgb(data) {\n      var c, m, y, k;\n      var offset = 0;\n\n      for (var i = 0, length = data.length; i < length; i += 4) {\n        c = data[i];\n        m = data[i + 1];\n        y = data[i + 2];\n        k = data[i + 3];\n        data[offset++] = 255 + c * (-0.00006747147073602441 * c + 0.0008379262121013727 * m + 0.0002894718188643294 * y + 0.003264231057537806 * k - 1.1185611867203937) + m * (0.000026374107616089405 * m - 0.00008626949158638572 * y - 0.0002748769067499491 * k - 0.02155688794978967) + y * (-0.00003878099212869363 * y - 0.0003267808279485286 * k + 0.0686742238595345) - k * (0.0003361971776183937 * k + 0.7430659151342254);\n        data[offset++] = 255 + c * (0.00013596372813588848 * c + 0.000924537132573585 * m + 0.00010567359618683593 * y + 0.0004791864687436512 * k - 0.3109689587515875) + m * (-0.00023545346108370344 * m + 0.0002702845253534714 * y + 0.0020200308977307156 * k - 0.7488052167015494) + y * (0.00006834815998235662 * y + 0.00015168452363460973 * k - 0.09751927774728933) - k * (0.00031891311758832814 * k + 0.7364883807733168);\n        data[offset++] = 255 + c * (0.000013598650411385307 * c + 0.00012423956175490851 * m + 0.0004751985097583589 * y - 0.0000036729317476630422 * k - 0.05562186980264034) + m * (0.00016141380598724676 * m + 0.0009692239130725186 * y + 0.0007782692450036253 * k - 0.44015232367526463) + y * (5.068882914068769e-7 * y + 0.0017778369011375071 * k - 0.7591454649749609) - k * (0.0003435319965105553 * k + 0.7063770186160144);\n      }\n\n      return data.subarray(0, offset);\n    },\n\n    getData({\n      width,\n      height,\n      forceRGB = false,\n      isSourcePDF = false\n    }) {\n      if (this.numComponents > 4) {\n        throw new JpegError(\"Unsupported color mode\");\n      }\n\n      var data = this._getLinearizedBlockData(width, height, isSourcePDF);\n\n      if (this.numComponents === 1 && forceRGB) {\n        var dataLength = data.length;\n        var rgbData = new Uint8ClampedArray(dataLength * 3);\n        var offset = 0;\n\n        for (var i = 0; i < dataLength; i++) {\n          var grayColor = data[i];\n          rgbData[offset++] = grayColor;\n          rgbData[offset++] = grayColor;\n          rgbData[offset++] = grayColor;\n        }\n\n        return rgbData;\n      } else if (this.numComponents === 3 && this._isColorConversionNeeded) {\n        return this._convertYccToRgb(data);\n      } else if (this.numComponents === 4) {\n        if (this._isColorConversionNeeded) {\n          if (forceRGB) {\n            return this._convertYcckToRgb(data);\n          }\n\n          return this._convertYcckToCmyk(data);\n        } else if (forceRGB) {\n          return this._convertCmykToRgb(data);\n        }\n      }\n\n      return data;\n    }\n\n  };\n  return JpegImage;\n}();\n\nexports.JpegImage = JpegImage;\n\n/***/ }),\n/* 20 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.JpxStream = void 0;\n\nvar _stream = __w_pdfjs_require__(12);\n\nvar _jpx = __w_pdfjs_require__(21);\n\nvar _util = __w_pdfjs_require__(2);\n\nconst JpxStream = function JpxStreamClosure() {\n  function JpxStream(stream, maybeLength, dict, params) {\n    this.stream = stream;\n    this.maybeLength = maybeLength;\n    this.dict = dict;\n    this.params = params;\n\n    _stream.DecodeStream.call(this, maybeLength);\n  }\n\n  JpxStream.prototype = Object.create(_stream.DecodeStream.prototype);\n  Object.defineProperty(JpxStream.prototype, \"bytes\", {\n    get: function JpxStream_bytes() {\n      return (0, _util.shadow)(this, \"bytes\", this.stream.getBytes(this.maybeLength));\n    },\n    configurable: true\n  });\n\n  JpxStream.prototype.ensureBuffer = function (requested) {};\n\n  JpxStream.prototype.readBlock = function () {\n    if (this.eof) {\n      return;\n    }\n\n    const jpxImage = new _jpx.JpxImage();\n    jpxImage.parse(this.bytes);\n    const width = jpxImage.width;\n    const height = jpxImage.height;\n    const componentsCount = jpxImage.componentsCount;\n    const tileCount = jpxImage.tiles.length;\n\n    if (tileCount === 1) {\n      this.buffer = jpxImage.tiles[0].items;\n    } else {\n      const data = new Uint8ClampedArray(width * height * componentsCount);\n\n      for (let k = 0; k < tileCount; k++) {\n        const tileComponents = jpxImage.tiles[k];\n        const tileWidth = tileComponents.width;\n        const tileHeight = tileComponents.height;\n        const tileLeft = tileComponents.left;\n        const tileTop = tileComponents.top;\n        const src = tileComponents.items;\n        let srcPosition = 0;\n        let dataPosition = (width * tileTop + tileLeft) * componentsCount;\n        const imgRowSize = width * componentsCount;\n        const tileRowSize = tileWidth * componentsCount;\n\n        for (let j = 0; j < tileHeight; j++) {\n          const rowBytes = src.subarray(srcPosition, srcPosition + tileRowSize);\n          data.set(rowBytes, dataPosition);\n          srcPosition += tileRowSize;\n          dataPosition += imgRowSize;\n        }\n      }\n\n      this.buffer = data;\n    }\n\n    this.bufferLength = this.buffer.length;\n    this.eof = true;\n  };\n\n  return JpxStream;\n}();\n\nexports.JpxStream = JpxStream;\n\n/***/ }),\n/* 21 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.JpxImage = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nvar _arithmetic_decoder = __w_pdfjs_require__(17);\n\nclass JpxError extends _util.BaseException {\n  constructor(msg) {\n    super(`JPX error: ${msg}`);\n  }\n\n}\n\nvar JpxImage = function JpxImageClosure() {\n  var SubbandsGainLog2 = {\n    LL: 0,\n    LH: 1,\n    HL: 1,\n    HH: 2\n  };\n\n  function JpxImage() {\n    this.failOnCorruptedImage = false;\n  }\n\n  JpxImage.prototype = {\n    parse: function JpxImage_parse(data) {\n      var head = (0, _core_utils.readUint16)(data, 0);\n\n      if (head === 0xff4f) {\n        this.parseCodestream(data, 0, data.length);\n        return;\n      }\n\n      var position = 0,\n          length = data.length;\n\n      while (position < length) {\n        var headerSize = 8;\n        var lbox = (0, _core_utils.readUint32)(data, position);\n        var tbox = (0, _core_utils.readUint32)(data, position + 4);\n        position += headerSize;\n\n        if (lbox === 1) {\n          lbox = (0, _core_utils.readUint32)(data, position) * 4294967296 + (0, _core_utils.readUint32)(data, position + 4);\n          position += 8;\n          headerSize += 8;\n        }\n\n        if (lbox === 0) {\n          lbox = length - position + headerSize;\n        }\n\n        if (lbox < headerSize) {\n          throw new JpxError(\"Invalid box field size\");\n        }\n\n        var dataLength = lbox - headerSize;\n        var jumpDataLength = true;\n\n        switch (tbox) {\n          case 0x6a703268:\n            jumpDataLength = false;\n            break;\n\n          case 0x636f6c72:\n            var method = data[position];\n\n            if (method === 1) {\n              var colorspace = (0, _core_utils.readUint32)(data, position + 3);\n\n              switch (colorspace) {\n                case 16:\n                case 17:\n                case 18:\n                  break;\n\n                default:\n                  (0, _util.warn)(\"Unknown colorspace \" + colorspace);\n                  break;\n              }\n            } else if (method === 2) {\n              (0, _util.info)(\"ICC profile not supported\");\n            }\n\n            break;\n\n          case 0x6a703263:\n            this.parseCodestream(data, position, position + dataLength);\n            break;\n\n          case 0x6a502020:\n            if ((0, _core_utils.readUint32)(data, position) !== 0x0d0a870a) {\n              (0, _util.warn)(\"Invalid JP2 signature\");\n            }\n\n            break;\n\n          case 0x6a501a1a:\n          case 0x66747970:\n          case 0x72726571:\n          case 0x72657320:\n          case 0x69686472:\n            break;\n\n          default:\n            var headerType = String.fromCharCode(tbox >> 24 & 0xff, tbox >> 16 & 0xff, tbox >> 8 & 0xff, tbox & 0xff);\n            (0, _util.warn)(\"Unsupported header type \" + tbox + \" (\" + headerType + \")\");\n            break;\n        }\n\n        if (jumpDataLength) {\n          position += dataLength;\n        }\n      }\n    },\n    parseImageProperties: function JpxImage_parseImageProperties(stream) {\n      var newByte = stream.getByte();\n\n      while (newByte >= 0) {\n        var oldByte = newByte;\n        newByte = stream.getByte();\n        var code = oldByte << 8 | newByte;\n\n        if (code === 0xff51) {\n          stream.skip(4);\n          var Xsiz = stream.getInt32() >>> 0;\n          var Ysiz = stream.getInt32() >>> 0;\n          var XOsiz = stream.getInt32() >>> 0;\n          var YOsiz = stream.getInt32() >>> 0;\n          stream.skip(16);\n          var Csiz = stream.getUint16();\n          this.width = Xsiz - XOsiz;\n          this.height = Ysiz - YOsiz;\n          this.componentsCount = Csiz;\n          this.bitsPerComponent = 8;\n          return;\n        }\n      }\n\n      throw new JpxError(\"No size marker found in JPX stream\");\n    },\n    parseCodestream: function JpxImage_parseCodestream(data, start, end) {\n      var context = {};\n      var doNotRecover = false;\n\n      try {\n        var position = start;\n\n        while (position + 1 < end) {\n          var code = (0, _core_utils.readUint16)(data, position);\n          position += 2;\n          var length = 0,\n              j,\n              sqcd,\n              spqcds,\n              spqcdSize,\n              scalarExpounded,\n              tile;\n\n          switch (code) {\n            case 0xff4f:\n              context.mainHeader = true;\n              break;\n\n            case 0xffd9:\n              break;\n\n            case 0xff51:\n              length = (0, _core_utils.readUint16)(data, position);\n              var siz = {};\n              siz.Xsiz = (0, _core_utils.readUint32)(data, position + 4);\n              siz.Ysiz = (0, _core_utils.readUint32)(data, position + 8);\n              siz.XOsiz = (0, _core_utils.readUint32)(data, position + 12);\n              siz.YOsiz = (0, _core_utils.readUint32)(data, position + 16);\n              siz.XTsiz = (0, _core_utils.readUint32)(data, position + 20);\n              siz.YTsiz = (0, _core_utils.readUint32)(data, position + 24);\n              siz.XTOsiz = (0, _core_utils.readUint32)(data, position + 28);\n              siz.YTOsiz = (0, _core_utils.readUint32)(data, position + 32);\n              var componentsCount = (0, _core_utils.readUint16)(data, position + 36);\n              siz.Csiz = componentsCount;\n              var components = [];\n              j = position + 38;\n\n              for (var i = 0; i < componentsCount; i++) {\n                var component = {\n                  precision: (data[j] & 0x7f) + 1,\n                  isSigned: !!(data[j] & 0x80),\n                  XRsiz: data[j + 1],\n                  YRsiz: data[j + 2]\n                };\n                j += 3;\n                calculateComponentDimensions(component, siz);\n                components.push(component);\n              }\n\n              context.SIZ = siz;\n              context.components = components;\n              calculateTileGrids(context, components);\n              context.QCC = [];\n              context.COC = [];\n              break;\n\n            case 0xff5c:\n              length = (0, _core_utils.readUint16)(data, position);\n              var qcd = {};\n              j = position + 2;\n              sqcd = data[j++];\n\n              switch (sqcd & 0x1f) {\n                case 0:\n                  spqcdSize = 8;\n                  scalarExpounded = true;\n                  break;\n\n                case 1:\n                  spqcdSize = 16;\n                  scalarExpounded = false;\n                  break;\n\n                case 2:\n                  spqcdSize = 16;\n                  scalarExpounded = true;\n                  break;\n\n                default:\n                  throw new Error(\"Invalid SQcd value \" + sqcd);\n              }\n\n              qcd.noQuantization = spqcdSize === 8;\n              qcd.scalarExpounded = scalarExpounded;\n              qcd.guardBits = sqcd >> 5;\n              spqcds = [];\n\n              while (j < length + position) {\n                var spqcd = {};\n\n                if (spqcdSize === 8) {\n                  spqcd.epsilon = data[j++] >> 3;\n                  spqcd.mu = 0;\n                } else {\n                  spqcd.epsilon = data[j] >> 3;\n                  spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1];\n                  j += 2;\n                }\n\n                spqcds.push(spqcd);\n              }\n\n              qcd.SPqcds = spqcds;\n\n              if (context.mainHeader) {\n                context.QCD = qcd;\n              } else {\n                context.currentTile.QCD = qcd;\n                context.currentTile.QCC = [];\n              }\n\n              break;\n\n            case 0xff5d:\n              length = (0, _core_utils.readUint16)(data, position);\n              var qcc = {};\n              j = position + 2;\n              var cqcc;\n\n              if (context.SIZ.Csiz < 257) {\n                cqcc = data[j++];\n              } else {\n                cqcc = (0, _core_utils.readUint16)(data, j);\n                j += 2;\n              }\n\n              sqcd = data[j++];\n\n              switch (sqcd & 0x1f) {\n                case 0:\n                  spqcdSize = 8;\n                  scalarExpounded = true;\n                  break;\n\n                case 1:\n                  spqcdSize = 16;\n                  scalarExpounded = false;\n                  break;\n\n                case 2:\n                  spqcdSize = 16;\n                  scalarExpounded = true;\n                  break;\n\n                default:\n                  throw new Error(\"Invalid SQcd value \" + sqcd);\n              }\n\n              qcc.noQuantization = spqcdSize === 8;\n              qcc.scalarExpounded = scalarExpounded;\n              qcc.guardBits = sqcd >> 5;\n              spqcds = [];\n\n              while (j < length + position) {\n                spqcd = {};\n\n                if (spqcdSize === 8) {\n                  spqcd.epsilon = data[j++] >> 3;\n                  spqcd.mu = 0;\n                } else {\n                  spqcd.epsilon = data[j] >> 3;\n                  spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1];\n                  j += 2;\n                }\n\n                spqcds.push(spqcd);\n              }\n\n              qcc.SPqcds = spqcds;\n\n              if (context.mainHeader) {\n                context.QCC[cqcc] = qcc;\n              } else {\n                context.currentTile.QCC[cqcc] = qcc;\n              }\n\n              break;\n\n            case 0xff52:\n              length = (0, _core_utils.readUint16)(data, position);\n              var cod = {};\n              j = position + 2;\n              var scod = data[j++];\n              cod.entropyCoderWithCustomPrecincts = !!(scod & 1);\n              cod.sopMarkerUsed = !!(scod & 2);\n              cod.ephMarkerUsed = !!(scod & 4);\n              cod.progressionOrder = data[j++];\n              cod.layersCount = (0, _core_utils.readUint16)(data, j);\n              j += 2;\n              cod.multipleComponentTransform = data[j++];\n              cod.decompositionLevelsCount = data[j++];\n              cod.xcb = (data[j++] & 0xf) + 2;\n              cod.ycb = (data[j++] & 0xf) + 2;\n              var blockStyle = data[j++];\n              cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1);\n              cod.resetContextProbabilities = !!(blockStyle & 2);\n              cod.terminationOnEachCodingPass = !!(blockStyle & 4);\n              cod.verticallyStripe = !!(blockStyle & 8);\n              cod.predictableTermination = !!(blockStyle & 16);\n              cod.segmentationSymbolUsed = !!(blockStyle & 32);\n              cod.reversibleTransformation = data[j++];\n\n              if (cod.entropyCoderWithCustomPrecincts) {\n                var precinctsSizes = [];\n\n                while (j < length + position) {\n                  var precinctsSize = data[j++];\n                  precinctsSizes.push({\n                    PPx: precinctsSize & 0xf,\n                    PPy: precinctsSize >> 4\n                  });\n                }\n\n                cod.precinctsSizes = precinctsSizes;\n              }\n\n              var unsupported = [];\n\n              if (cod.selectiveArithmeticCodingBypass) {\n                unsupported.push(\"selectiveArithmeticCodingBypass\");\n              }\n\n              if (cod.resetContextProbabilities) {\n                unsupported.push(\"resetContextProbabilities\");\n              }\n\n              if (cod.terminationOnEachCodingPass) {\n                unsupported.push(\"terminationOnEachCodingPass\");\n              }\n\n              if (cod.verticallyStripe) {\n                unsupported.push(\"verticallyStripe\");\n              }\n\n              if (cod.predictableTermination) {\n                unsupported.push(\"predictableTermination\");\n              }\n\n              if (unsupported.length > 0) {\n                doNotRecover = true;\n                (0, _util.warn)(`JPX: Unsupported COD options (${unsupported.join(\", \")}).`);\n              }\n\n              if (context.mainHeader) {\n                context.COD = cod;\n              } else {\n                context.currentTile.COD = cod;\n                context.currentTile.COC = [];\n              }\n\n              break;\n\n            case 0xff90:\n              length = (0, _core_utils.readUint16)(data, position);\n              tile = {};\n              tile.index = (0, _core_utils.readUint16)(data, position + 2);\n              tile.length = (0, _core_utils.readUint32)(data, position + 4);\n              tile.dataEnd = tile.length + position - 2;\n              tile.partIndex = data[position + 8];\n              tile.partsCount = data[position + 9];\n              context.mainHeader = false;\n\n              if (tile.partIndex === 0) {\n                tile.COD = context.COD;\n                tile.COC = context.COC.slice(0);\n                tile.QCD = context.QCD;\n                tile.QCC = context.QCC.slice(0);\n              }\n\n              context.currentTile = tile;\n              break;\n\n            case 0xff93:\n              tile = context.currentTile;\n\n              if (tile.partIndex === 0) {\n                initializeTile(context, tile.index);\n                buildPackets(context);\n              }\n\n              length = tile.dataEnd - position;\n              parseTilePackets(context, data, position, length);\n              break;\n\n            case 0xff53:\n              (0, _util.warn)(\"JPX: Codestream code 0xFF53 (COC) is not implemented.\");\n\n            case 0xff55:\n            case 0xff57:\n            case 0xff58:\n            case 0xff64:\n              length = (0, _core_utils.readUint16)(data, position);\n              break;\n\n            default:\n              throw new Error(\"Unknown codestream code: \" + code.toString(16));\n          }\n\n          position += length;\n        }\n      } catch (e) {\n        if (doNotRecover || this.failOnCorruptedImage) {\n          throw new JpxError(e.message);\n        } else {\n          (0, _util.warn)(`JPX: Trying to recover from: \"${e.message}\".`);\n        }\n      }\n\n      this.tiles = transformComponents(context);\n      this.width = context.SIZ.Xsiz - context.SIZ.XOsiz;\n      this.height = context.SIZ.Ysiz - context.SIZ.YOsiz;\n      this.componentsCount = context.SIZ.Csiz;\n    }\n  };\n\n  function calculateComponentDimensions(component, siz) {\n    component.x0 = Math.ceil(siz.XOsiz / component.XRsiz);\n    component.x1 = Math.ceil(siz.Xsiz / component.XRsiz);\n    component.y0 = Math.ceil(siz.YOsiz / component.YRsiz);\n    component.y1 = Math.ceil(siz.Ysiz / component.YRsiz);\n    component.width = component.x1 - component.x0;\n    component.height = component.y1 - component.y0;\n  }\n\n  function calculateTileGrids(context, components) {\n    var siz = context.SIZ;\n    var tile,\n        tiles = [];\n    var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz);\n    var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz);\n\n    for (var q = 0; q < numYtiles; q++) {\n      for (var p = 0; p < numXtiles; p++) {\n        tile = {};\n        tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz);\n        tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz);\n        tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz);\n        tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz);\n        tile.width = tile.tx1 - tile.tx0;\n        tile.height = tile.ty1 - tile.ty0;\n        tile.components = [];\n        tiles.push(tile);\n      }\n    }\n\n    context.tiles = tiles;\n    var componentsCount = siz.Csiz;\n\n    for (var i = 0, ii = componentsCount; i < ii; i++) {\n      var component = components[i];\n\n      for (var j = 0, jj = tiles.length; j < jj; j++) {\n        var tileComponent = {};\n        tile = tiles[j];\n        tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz);\n        tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz);\n        tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz);\n        tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz);\n        tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0;\n        tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0;\n        tile.components[i] = tileComponent;\n      }\n    }\n  }\n\n  function getBlocksDimensions(context, component, r) {\n    var codOrCoc = component.codingStyleParameters;\n    var result = {};\n\n    if (!codOrCoc.entropyCoderWithCustomPrecincts) {\n      result.PPx = 15;\n      result.PPy = 15;\n    } else {\n      result.PPx = codOrCoc.precinctsSizes[r].PPx;\n      result.PPy = codOrCoc.precinctsSizes[r].PPy;\n    }\n\n    result.xcb_ = r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) : Math.min(codOrCoc.xcb, result.PPx);\n    result.ycb_ = r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) : Math.min(codOrCoc.ycb, result.PPy);\n    return result;\n  }\n\n  function buildPrecincts(context, resolution, dimensions) {\n    var precinctWidth = 1 << dimensions.PPx;\n    var precinctHeight = 1 << dimensions.PPy;\n    var isZeroRes = resolution.resLevel === 0;\n    var precinctWidthInSubband = 1 << dimensions.PPx + (isZeroRes ? 0 : -1);\n    var precinctHeightInSubband = 1 << dimensions.PPy + (isZeroRes ? 0 : -1);\n    var numprecinctswide = resolution.trx1 > resolution.trx0 ? Math.ceil(resolution.trx1 / precinctWidth) - Math.floor(resolution.trx0 / precinctWidth) : 0;\n    var numprecinctshigh = resolution.try1 > resolution.try0 ? Math.ceil(resolution.try1 / precinctHeight) - Math.floor(resolution.try0 / precinctHeight) : 0;\n    var numprecincts = numprecinctswide * numprecinctshigh;\n    resolution.precinctParameters = {\n      precinctWidth,\n      precinctHeight,\n      numprecinctswide,\n      numprecinctshigh,\n      numprecincts,\n      precinctWidthInSubband,\n      precinctHeightInSubband\n    };\n  }\n\n  function buildCodeblocks(context, subband, dimensions) {\n    var xcb_ = dimensions.xcb_;\n    var ycb_ = dimensions.ycb_;\n    var codeblockWidth = 1 << xcb_;\n    var codeblockHeight = 1 << ycb_;\n    var cbx0 = subband.tbx0 >> xcb_;\n    var cby0 = subband.tby0 >> ycb_;\n    var cbx1 = subband.tbx1 + codeblockWidth - 1 >> xcb_;\n    var cby1 = subband.tby1 + codeblockHeight - 1 >> ycb_;\n    var precinctParameters = subband.resolution.precinctParameters;\n    var codeblocks = [];\n    var precincts = [];\n    var i, j, codeblock, precinctNumber;\n\n    for (j = cby0; j < cby1; j++) {\n      for (i = cbx0; i < cbx1; i++) {\n        codeblock = {\n          cbx: i,\n          cby: j,\n          tbx0: codeblockWidth * i,\n          tby0: codeblockHeight * j,\n          tbx1: codeblockWidth * (i + 1),\n          tby1: codeblockHeight * (j + 1)\n        };\n        codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0);\n        codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0);\n        codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1);\n        codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1);\n        var pi = Math.floor((codeblock.tbx0_ - subband.tbx0) / precinctParameters.precinctWidthInSubband);\n        var pj = Math.floor((codeblock.tby0_ - subband.tby0) / precinctParameters.precinctHeightInSubband);\n        precinctNumber = pi + pj * precinctParameters.numprecinctswide;\n        codeblock.precinctNumber = precinctNumber;\n        codeblock.subbandType = subband.type;\n        codeblock.Lblock = 3;\n\n        if (codeblock.tbx1_ <= codeblock.tbx0_ || codeblock.tby1_ <= codeblock.tby0_) {\n          continue;\n        }\n\n        codeblocks.push(codeblock);\n        var precinct = precincts[precinctNumber];\n\n        if (precinct !== undefined) {\n          if (i < precinct.cbxMin) {\n            precinct.cbxMin = i;\n          } else if (i > precinct.cbxMax) {\n            precinct.cbxMax = i;\n          }\n\n          if (j < precinct.cbyMin) {\n            precinct.cbxMin = j;\n          } else if (j > precinct.cbyMax) {\n            precinct.cbyMax = j;\n          }\n        } else {\n          precincts[precinctNumber] = precinct = {\n            cbxMin: i,\n            cbyMin: j,\n            cbxMax: i,\n            cbyMax: j\n          };\n        }\n\n        codeblock.precinct = precinct;\n      }\n    }\n\n    subband.codeblockParameters = {\n      codeblockWidth: xcb_,\n      codeblockHeight: ycb_,\n      numcodeblockwide: cbx1 - cbx0 + 1,\n      numcodeblockhigh: cby1 - cby0 + 1\n    };\n    subband.codeblocks = codeblocks;\n    subband.precincts = precincts;\n  }\n\n  function createPacket(resolution, precinctNumber, layerNumber) {\n    var precinctCodeblocks = [];\n    var subbands = resolution.subbands;\n\n    for (var i = 0, ii = subbands.length; i < ii; i++) {\n      var subband = subbands[i];\n      var codeblocks = subband.codeblocks;\n\n      for (var j = 0, jj = codeblocks.length; j < jj; j++) {\n        var codeblock = codeblocks[j];\n\n        if (codeblock.precinctNumber !== precinctNumber) {\n          continue;\n        }\n\n        precinctCodeblocks.push(codeblock);\n      }\n    }\n\n    return {\n      layerNumber,\n      codeblocks: precinctCodeblocks\n    };\n  }\n\n  function LayerResolutionComponentPositionIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var maxDecompositionLevelsCount = 0;\n\n    for (var q = 0; q < componentsCount; q++) {\n      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount);\n    }\n\n    var l = 0,\n        r = 0,\n        i = 0,\n        k = 0;\n\n    this.nextPacket = function JpxImage_nextPacket() {\n      for (; l < layersCount; l++) {\n        for (; r <= maxDecompositionLevelsCount; r++) {\n          for (; i < componentsCount; i++) {\n            var component = tile.components[i];\n\n            if (r > component.codingStyleParameters.decompositionLevelsCount) {\n              continue;\n            }\n\n            var resolution = component.resolutions[r];\n            var numprecincts = resolution.precinctParameters.numprecincts;\n\n            for (; k < numprecincts;) {\n              var packet = createPacket(resolution, k, l);\n              k++;\n              return packet;\n            }\n\n            k = 0;\n          }\n\n          i = 0;\n        }\n\n        r = 0;\n      }\n\n      throw new JpxError(\"Out of packets\");\n    };\n  }\n\n  function ResolutionLayerComponentPositionIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var maxDecompositionLevelsCount = 0;\n\n    for (var q = 0; q < componentsCount; q++) {\n      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount);\n    }\n\n    var r = 0,\n        l = 0,\n        i = 0,\n        k = 0;\n\n    this.nextPacket = function JpxImage_nextPacket() {\n      for (; r <= maxDecompositionLevelsCount; r++) {\n        for (; l < layersCount; l++) {\n          for (; i < componentsCount; i++) {\n            var component = tile.components[i];\n\n            if (r > component.codingStyleParameters.decompositionLevelsCount) {\n              continue;\n            }\n\n            var resolution = component.resolutions[r];\n            var numprecincts = resolution.precinctParameters.numprecincts;\n\n            for (; k < numprecincts;) {\n              var packet = createPacket(resolution, k, l);\n              k++;\n              return packet;\n            }\n\n            k = 0;\n          }\n\n          i = 0;\n        }\n\n        l = 0;\n      }\n\n      throw new JpxError(\"Out of packets\");\n    };\n  }\n\n  function ResolutionPositionComponentLayerIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var l, r, c, p;\n    var maxDecompositionLevelsCount = 0;\n\n    for (c = 0; c < componentsCount; c++) {\n      const component = tile.components[c];\n      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, component.codingStyleParameters.decompositionLevelsCount);\n    }\n\n    var maxNumPrecinctsInLevel = new Int32Array(maxDecompositionLevelsCount + 1);\n\n    for (r = 0; r <= maxDecompositionLevelsCount; ++r) {\n      var maxNumPrecincts = 0;\n\n      for (c = 0; c < componentsCount; ++c) {\n        var resolutions = tile.components[c].resolutions;\n\n        if (r < resolutions.length) {\n          maxNumPrecincts = Math.max(maxNumPrecincts, resolutions[r].precinctParameters.numprecincts);\n        }\n      }\n\n      maxNumPrecinctsInLevel[r] = maxNumPrecincts;\n    }\n\n    l = 0;\n    r = 0;\n    c = 0;\n    p = 0;\n\n    this.nextPacket = function JpxImage_nextPacket() {\n      for (; r <= maxDecompositionLevelsCount; r++) {\n        for (; p < maxNumPrecinctsInLevel[r]; p++) {\n          for (; c < componentsCount; c++) {\n            const component = tile.components[c];\n\n            if (r > component.codingStyleParameters.decompositionLevelsCount) {\n              continue;\n            }\n\n            var resolution = component.resolutions[r];\n            var numprecincts = resolution.precinctParameters.numprecincts;\n\n            if (p >= numprecincts) {\n              continue;\n            }\n\n            for (; l < layersCount;) {\n              var packet = createPacket(resolution, p, l);\n              l++;\n              return packet;\n            }\n\n            l = 0;\n          }\n\n          c = 0;\n        }\n\n        p = 0;\n      }\n\n      throw new JpxError(\"Out of packets\");\n    };\n  }\n\n  function PositionComponentResolutionLayerIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var precinctsSizes = getPrecinctSizesInImageScale(tile);\n    var precinctsIterationSizes = precinctsSizes;\n    var l = 0,\n        r = 0,\n        c = 0,\n        px = 0,\n        py = 0;\n\n    this.nextPacket = function JpxImage_nextPacket() {\n      for (; py < precinctsIterationSizes.maxNumHigh; py++) {\n        for (; px < precinctsIterationSizes.maxNumWide; px++) {\n          for (; c < componentsCount; c++) {\n            var component = tile.components[c];\n            var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;\n\n            for (; r <= decompositionLevelsCount; r++) {\n              var resolution = component.resolutions[r];\n              var sizeInImageScale = precinctsSizes.components[c].resolutions[r];\n              var k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution);\n\n              if (k === null) {\n                continue;\n              }\n\n              for (; l < layersCount;) {\n                var packet = createPacket(resolution, k, l);\n                l++;\n                return packet;\n              }\n\n              l = 0;\n            }\n\n            r = 0;\n          }\n\n          c = 0;\n        }\n\n        px = 0;\n      }\n\n      throw new JpxError(\"Out of packets\");\n    };\n  }\n\n  function ComponentPositionResolutionLayerIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var precinctsSizes = getPrecinctSizesInImageScale(tile);\n    var l = 0,\n        r = 0,\n        c = 0,\n        px = 0,\n        py = 0;\n\n    this.nextPacket = function JpxImage_nextPacket() {\n      for (; c < componentsCount; ++c) {\n        var component = tile.components[c];\n        var precinctsIterationSizes = precinctsSizes.components[c];\n        var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;\n\n        for (; py < precinctsIterationSizes.maxNumHigh; py++) {\n          for (; px < precinctsIterationSizes.maxNumWide; px++) {\n            for (; r <= decompositionLevelsCount; r++) {\n              var resolution = component.resolutions[r];\n              var sizeInImageScale = precinctsIterationSizes.resolutions[r];\n              var k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution);\n\n              if (k === null) {\n                continue;\n              }\n\n              for (; l < layersCount;) {\n                var packet = createPacket(resolution, k, l);\n                l++;\n                return packet;\n              }\n\n              l = 0;\n            }\n\n            r = 0;\n          }\n\n          px = 0;\n        }\n\n        py = 0;\n      }\n\n      throw new JpxError(\"Out of packets\");\n    };\n  }\n\n  function getPrecinctIndexIfExist(pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) {\n    var posX = pxIndex * precinctIterationSizes.minWidth;\n    var posY = pyIndex * precinctIterationSizes.minHeight;\n\n    if (posX % sizeInImageScale.width !== 0 || posY % sizeInImageScale.height !== 0) {\n      return null;\n    }\n\n    var startPrecinctRowIndex = posY / sizeInImageScale.width * resolution.precinctParameters.numprecinctswide;\n    return posX / sizeInImageScale.height + startPrecinctRowIndex;\n  }\n\n  function getPrecinctSizesInImageScale(tile) {\n    var componentsCount = tile.components.length;\n    var minWidth = Number.MAX_VALUE;\n    var minHeight = Number.MAX_VALUE;\n    var maxNumWide = 0;\n    var maxNumHigh = 0;\n    var sizePerComponent = new Array(componentsCount);\n\n    for (var c = 0; c < componentsCount; c++) {\n      var component = tile.components[c];\n      var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;\n      var sizePerResolution = new Array(decompositionLevelsCount + 1);\n      var minWidthCurrentComponent = Number.MAX_VALUE;\n      var minHeightCurrentComponent = Number.MAX_VALUE;\n      var maxNumWideCurrentComponent = 0;\n      var maxNumHighCurrentComponent = 0;\n      var scale = 1;\n\n      for (var r = decompositionLevelsCount; r >= 0; --r) {\n        var resolution = component.resolutions[r];\n        var widthCurrentResolution = scale * resolution.precinctParameters.precinctWidth;\n        var heightCurrentResolution = scale * resolution.precinctParameters.precinctHeight;\n        minWidthCurrentComponent = Math.min(minWidthCurrentComponent, widthCurrentResolution);\n        minHeightCurrentComponent = Math.min(minHeightCurrentComponent, heightCurrentResolution);\n        maxNumWideCurrentComponent = Math.max(maxNumWideCurrentComponent, resolution.precinctParameters.numprecinctswide);\n        maxNumHighCurrentComponent = Math.max(maxNumHighCurrentComponent, resolution.precinctParameters.numprecinctshigh);\n        sizePerResolution[r] = {\n          width: widthCurrentResolution,\n          height: heightCurrentResolution\n        };\n        scale <<= 1;\n      }\n\n      minWidth = Math.min(minWidth, minWidthCurrentComponent);\n      minHeight = Math.min(minHeight, minHeightCurrentComponent);\n      maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent);\n      maxNumHigh = Math.max(maxNumHigh, maxNumHighCurrentComponent);\n      sizePerComponent[c] = {\n        resolutions: sizePerResolution,\n        minWidth: minWidthCurrentComponent,\n        minHeight: minHeightCurrentComponent,\n        maxNumWide: maxNumWideCurrentComponent,\n        maxNumHigh: maxNumHighCurrentComponent\n      };\n    }\n\n    return {\n      components: sizePerComponent,\n      minWidth,\n      minHeight,\n      maxNumWide,\n      maxNumHigh\n    };\n  }\n\n  function buildPackets(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var componentsCount = siz.Csiz;\n\n    for (var c = 0; c < componentsCount; c++) {\n      var component = tile.components[c];\n      var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;\n      var resolutions = [];\n      var subbands = [];\n\n      for (var r = 0; r <= decompositionLevelsCount; r++) {\n        var blocksDimensions = getBlocksDimensions(context, component, r);\n        var resolution = {};\n        var scale = 1 << decompositionLevelsCount - r;\n        resolution.trx0 = Math.ceil(component.tcx0 / scale);\n        resolution.try0 = Math.ceil(component.tcy0 / scale);\n        resolution.trx1 = Math.ceil(component.tcx1 / scale);\n        resolution.try1 = Math.ceil(component.tcy1 / scale);\n        resolution.resLevel = r;\n        buildPrecincts(context, resolution, blocksDimensions);\n        resolutions.push(resolution);\n        var subband;\n\n        if (r === 0) {\n          subband = {};\n          subband.type = \"LL\";\n          subband.tbx0 = Math.ceil(component.tcx0 / scale);\n          subband.tby0 = Math.ceil(component.tcy0 / scale);\n          subband.tbx1 = Math.ceil(component.tcx1 / scale);\n          subband.tby1 = Math.ceil(component.tcy1 / scale);\n          subband.resolution = resolution;\n          buildCodeblocks(context, subband, blocksDimensions);\n          subbands.push(subband);\n          resolution.subbands = [subband];\n        } else {\n          var bscale = 1 << decompositionLevelsCount - r + 1;\n          var resolutionSubbands = [];\n          subband = {};\n          subband.type = \"HL\";\n          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);\n          subband.tby0 = Math.ceil(component.tcy0 / bscale);\n          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);\n          subband.tby1 = Math.ceil(component.tcy1 / bscale);\n          subband.resolution = resolution;\n          buildCodeblocks(context, subband, blocksDimensions);\n          subbands.push(subband);\n          resolutionSubbands.push(subband);\n          subband = {};\n          subband.type = \"LH\";\n          subband.tbx0 = Math.ceil(component.tcx0 / bscale);\n          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);\n          subband.tbx1 = Math.ceil(component.tcx1 / bscale);\n          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);\n          subband.resolution = resolution;\n          buildCodeblocks(context, subband, blocksDimensions);\n          subbands.push(subband);\n          resolutionSubbands.push(subband);\n          subband = {};\n          subband.type = \"HH\";\n          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);\n          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);\n          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);\n          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);\n          subband.resolution = resolution;\n          buildCodeblocks(context, subband, blocksDimensions);\n          subbands.push(subband);\n          resolutionSubbands.push(subband);\n          resolution.subbands = resolutionSubbands;\n        }\n      }\n\n      component.resolutions = resolutions;\n      component.subbands = subbands;\n    }\n\n    var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder;\n\n    switch (progressionOrder) {\n      case 0:\n        tile.packetsIterator = new LayerResolutionComponentPositionIterator(context);\n        break;\n\n      case 1:\n        tile.packetsIterator = new ResolutionLayerComponentPositionIterator(context);\n        break;\n\n      case 2:\n        tile.packetsIterator = new ResolutionPositionComponentLayerIterator(context);\n        break;\n\n      case 3:\n        tile.packetsIterator = new PositionComponentResolutionLayerIterator(context);\n        break;\n\n      case 4:\n        tile.packetsIterator = new ComponentPositionResolutionLayerIterator(context);\n        break;\n\n      default:\n        throw new JpxError(`Unsupported progression order ${progressionOrder}`);\n    }\n  }\n\n  function parseTilePackets(context, data, offset, dataLength) {\n    var position = 0;\n    var buffer,\n        bufferSize = 0,\n        skipNextBit = false;\n\n    function readBits(count) {\n      while (bufferSize < count) {\n        var b = data[offset + position];\n        position++;\n\n        if (skipNextBit) {\n          buffer = buffer << 7 | b;\n          bufferSize += 7;\n          skipNextBit = false;\n        } else {\n          buffer = buffer << 8 | b;\n          bufferSize += 8;\n        }\n\n        if (b === 0xff) {\n          skipNextBit = true;\n        }\n      }\n\n      bufferSize -= count;\n      return buffer >>> bufferSize & (1 << count) - 1;\n    }\n\n    function skipMarkerIfEqual(value) {\n      if (data[offset + position - 1] === 0xff && data[offset + position] === value) {\n        skipBytes(1);\n        return true;\n      } else if (data[offset + position] === 0xff && data[offset + position + 1] === value) {\n        skipBytes(2);\n        return true;\n      }\n\n      return false;\n    }\n\n    function skipBytes(count) {\n      position += count;\n    }\n\n    function alignToByte() {\n      bufferSize = 0;\n\n      if (skipNextBit) {\n        position++;\n        skipNextBit = false;\n      }\n    }\n\n    function readCodingpasses() {\n      if (readBits(1) === 0) {\n        return 1;\n      }\n\n      if (readBits(1) === 0) {\n        return 2;\n      }\n\n      var value = readBits(2);\n\n      if (value < 3) {\n        return value + 3;\n      }\n\n      value = readBits(5);\n\n      if (value < 31) {\n        return value + 6;\n      }\n\n      value = readBits(7);\n      return value + 37;\n    }\n\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var sopMarkerUsed = context.COD.sopMarkerUsed;\n    var ephMarkerUsed = context.COD.ephMarkerUsed;\n    var packetsIterator = tile.packetsIterator;\n\n    while (position < dataLength) {\n      alignToByte();\n\n      if (sopMarkerUsed && skipMarkerIfEqual(0x91)) {\n        skipBytes(4);\n      }\n\n      var packet = packetsIterator.nextPacket();\n\n      if (!readBits(1)) {\n        continue;\n      }\n\n      var layerNumber = packet.layerNumber;\n      var queue = [],\n          codeblock;\n\n      for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) {\n        codeblock = packet.codeblocks[i];\n        var precinct = codeblock.precinct;\n        var codeblockColumn = codeblock.cbx - precinct.cbxMin;\n        var codeblockRow = codeblock.cby - precinct.cbyMin;\n        var codeblockIncluded = false;\n        var firstTimeInclusion = false;\n        var valueReady;\n\n        if (codeblock.included !== undefined) {\n          codeblockIncluded = !!readBits(1);\n        } else {\n          precinct = codeblock.precinct;\n          var inclusionTree, zeroBitPlanesTree;\n\n          if (precinct.inclusionTree !== undefined) {\n            inclusionTree = precinct.inclusionTree;\n          } else {\n            var width = precinct.cbxMax - precinct.cbxMin + 1;\n            var height = precinct.cbyMax - precinct.cbyMin + 1;\n            inclusionTree = new InclusionTree(width, height, layerNumber);\n            zeroBitPlanesTree = new TagTree(width, height);\n            precinct.inclusionTree = inclusionTree;\n            precinct.zeroBitPlanesTree = zeroBitPlanesTree;\n          }\n\n          if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) {\n            while (true) {\n              if (readBits(1)) {\n                valueReady = !inclusionTree.nextLevel();\n\n                if (valueReady) {\n                  codeblock.included = true;\n                  codeblockIncluded = firstTimeInclusion = true;\n                  break;\n                }\n              } else {\n                inclusionTree.incrementValue(layerNumber);\n                break;\n              }\n            }\n          }\n        }\n\n        if (!codeblockIncluded) {\n          continue;\n        }\n\n        if (firstTimeInclusion) {\n          zeroBitPlanesTree = precinct.zeroBitPlanesTree;\n          zeroBitPlanesTree.reset(codeblockColumn, codeblockRow);\n\n          while (true) {\n            if (readBits(1)) {\n              valueReady = !zeroBitPlanesTree.nextLevel();\n\n              if (valueReady) {\n                break;\n              }\n            } else {\n              zeroBitPlanesTree.incrementValue();\n            }\n          }\n\n          codeblock.zeroBitPlanes = zeroBitPlanesTree.value;\n        }\n\n        var codingpasses = readCodingpasses();\n\n        while (readBits(1)) {\n          codeblock.Lblock++;\n        }\n\n        var codingpassesLog2 = (0, _core_utils.log2)(codingpasses);\n        var bits = (codingpasses < 1 << codingpassesLog2 ? codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock;\n        var codedDataLength = readBits(bits);\n        queue.push({\n          codeblock,\n          codingpasses,\n          dataLength: codedDataLength\n        });\n      }\n\n      alignToByte();\n\n      if (ephMarkerUsed) {\n        skipMarkerIfEqual(0x92);\n      }\n\n      while (queue.length > 0) {\n        var packetItem = queue.shift();\n        codeblock = packetItem.codeblock;\n\n        if (codeblock.data === undefined) {\n          codeblock.data = [];\n        }\n\n        codeblock.data.push({\n          data,\n          start: offset + position,\n          end: offset + position + packetItem.dataLength,\n          codingpasses: packetItem.codingpasses\n        });\n        position += packetItem.dataLength;\n      }\n    }\n\n    return position;\n  }\n\n  function copyCoefficients(coefficients, levelWidth, levelHeight, subband, delta, mb, reversible, segmentationSymbolUsed) {\n    var x0 = subband.tbx0;\n    var y0 = subband.tby0;\n    var width = subband.tbx1 - subband.tbx0;\n    var codeblocks = subband.codeblocks;\n    var right = subband.type.charAt(0) === \"H\" ? 1 : 0;\n    var bottom = subband.type.charAt(1) === \"H\" ? levelWidth : 0;\n\n    for (var i = 0, ii = codeblocks.length; i < ii; ++i) {\n      var codeblock = codeblocks[i];\n      var blockWidth = codeblock.tbx1_ - codeblock.tbx0_;\n      var blockHeight = codeblock.tby1_ - codeblock.tby0_;\n\n      if (blockWidth === 0 || blockHeight === 0) {\n        continue;\n      }\n\n      if (codeblock.data === undefined) {\n        continue;\n      }\n\n      var bitModel, currentCodingpassType;\n      bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType, codeblock.zeroBitPlanes, mb);\n      currentCodingpassType = 2;\n      var data = codeblock.data,\n          totalLength = 0,\n          codingpasses = 0;\n      var j, jj, dataItem;\n\n      for (j = 0, jj = data.length; j < jj; j++) {\n        dataItem = data[j];\n        totalLength += dataItem.end - dataItem.start;\n        codingpasses += dataItem.codingpasses;\n      }\n\n      var encodedData = new Uint8Array(totalLength);\n      var position = 0;\n\n      for (j = 0, jj = data.length; j < jj; j++) {\n        dataItem = data[j];\n        var chunk = dataItem.data.subarray(dataItem.start, dataItem.end);\n        encodedData.set(chunk, position);\n        position += chunk.length;\n      }\n\n      var decoder = new _arithmetic_decoder.ArithmeticDecoder(encodedData, 0, totalLength);\n      bitModel.setDecoder(decoder);\n\n      for (j = 0; j < codingpasses; j++) {\n        switch (currentCodingpassType) {\n          case 0:\n            bitModel.runSignificancePropagationPass();\n            break;\n\n          case 1:\n            bitModel.runMagnitudeRefinementPass();\n            break;\n\n          case 2:\n            bitModel.runCleanupPass();\n\n            if (segmentationSymbolUsed) {\n              bitModel.checkSegmentationSymbol();\n            }\n\n            break;\n        }\n\n        currentCodingpassType = (currentCodingpassType + 1) % 3;\n      }\n\n      var offset = codeblock.tbx0_ - x0 + (codeblock.tby0_ - y0) * width;\n      var sign = bitModel.coefficentsSign;\n      var magnitude = bitModel.coefficentsMagnitude;\n      var bitsDecoded = bitModel.bitsDecoded;\n      var magnitudeCorrection = reversible ? 0 : 0.5;\n      var k, n, nb;\n      position = 0;\n      var interleave = subband.type !== \"LL\";\n\n      for (j = 0; j < blockHeight; j++) {\n        var row = offset / width | 0;\n        var levelOffset = 2 * row * (levelWidth - width) + right + bottom;\n\n        for (k = 0; k < blockWidth; k++) {\n          n = magnitude[position];\n\n          if (n !== 0) {\n            n = (n + magnitudeCorrection) * delta;\n\n            if (sign[position] !== 0) {\n              n = -n;\n            }\n\n            nb = bitsDecoded[position];\n            var pos = interleave ? levelOffset + (offset << 1) : offset;\n\n            if (reversible && nb >= mb) {\n              coefficients[pos] = n;\n            } else {\n              coefficients[pos] = n * (1 << mb - nb);\n            }\n          }\n\n          offset++;\n          position++;\n        }\n\n        offset += width - blockWidth;\n      }\n    }\n  }\n\n  function transformTile(context, tile, c) {\n    var component = tile.components[c];\n    var codingStyleParameters = component.codingStyleParameters;\n    var quantizationParameters = component.quantizationParameters;\n    var decompositionLevelsCount = codingStyleParameters.decompositionLevelsCount;\n    var spqcds = quantizationParameters.SPqcds;\n    var scalarExpounded = quantizationParameters.scalarExpounded;\n    var guardBits = quantizationParameters.guardBits;\n    var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed;\n    var precision = context.components[c].precision;\n    var reversible = codingStyleParameters.reversibleTransformation;\n    var transform = reversible ? new ReversibleTransform() : new IrreversibleTransform();\n    var subbandCoefficients = [];\n    var b = 0;\n\n    for (var i = 0; i <= decompositionLevelsCount; i++) {\n      var resolution = component.resolutions[i];\n      var width = resolution.trx1 - resolution.trx0;\n      var height = resolution.try1 - resolution.try0;\n      var coefficients = new Float32Array(width * height);\n\n      for (var j = 0, jj = resolution.subbands.length; j < jj; j++) {\n        var mu, epsilon;\n\n        if (!scalarExpounded) {\n          mu = spqcds[0].mu;\n          epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0);\n        } else {\n          mu = spqcds[b].mu;\n          epsilon = spqcds[b].epsilon;\n          b++;\n        }\n\n        var subband = resolution.subbands[j];\n        var gainLog2 = SubbandsGainLog2[subband.type];\n        var delta = reversible ? 1 : 2 ** (precision + gainLog2 - epsilon) * (1 + mu / 2048);\n        var mb = guardBits + epsilon - 1;\n        copyCoefficients(coefficients, width, height, subband, delta, mb, reversible, segmentationSymbolUsed);\n      }\n\n      subbandCoefficients.push({\n        width,\n        height,\n        items: coefficients\n      });\n    }\n\n    var result = transform.calculate(subbandCoefficients, component.tcx0, component.tcy0);\n    return {\n      left: component.tcx0,\n      top: component.tcy0,\n      width: result.width,\n      height: result.height,\n      items: result.items\n    };\n  }\n\n  function transformComponents(context) {\n    var siz = context.SIZ;\n    var components = context.components;\n    var componentsCount = siz.Csiz;\n    var resultImages = [];\n\n    for (var i = 0, ii = context.tiles.length; i < ii; i++) {\n      var tile = context.tiles[i];\n      var transformedTiles = [];\n      var c;\n\n      for (c = 0; c < componentsCount; c++) {\n        transformedTiles[c] = transformTile(context, tile, c);\n      }\n\n      var tile0 = transformedTiles[0];\n      var out = new Uint8ClampedArray(tile0.items.length * componentsCount);\n      var result = {\n        left: tile0.left,\n        top: tile0.top,\n        width: tile0.width,\n        height: tile0.height,\n        items: out\n      };\n      var shift, offset;\n      var pos = 0,\n          j,\n          jj,\n          y0,\n          y1,\n          y2;\n\n      if (tile.codingStyleDefaultParameters.multipleComponentTransform) {\n        var fourComponents = componentsCount === 4;\n        var y0items = transformedTiles[0].items;\n        var y1items = transformedTiles[1].items;\n        var y2items = transformedTiles[2].items;\n        var y3items = fourComponents ? transformedTiles[3].items : null;\n        shift = components[0].precision - 8;\n        offset = (128 << shift) + 0.5;\n        var component0 = tile.components[0];\n        var alpha01 = componentsCount - 3;\n        jj = y0items.length;\n\n        if (!component0.codingStyleParameters.reversibleTransformation) {\n          for (j = 0; j < jj; j++, pos += alpha01) {\n            y0 = y0items[j] + offset;\n            y1 = y1items[j];\n            y2 = y2items[j];\n            out[pos++] = y0 + 1.402 * y2 >> shift;\n            out[pos++] = y0 - 0.34413 * y1 - 0.71414 * y2 >> shift;\n            out[pos++] = y0 + 1.772 * y1 >> shift;\n          }\n        } else {\n          for (j = 0; j < jj; j++, pos += alpha01) {\n            y0 = y0items[j] + offset;\n            y1 = y1items[j];\n            y2 = y2items[j];\n            const g = y0 - (y2 + y1 >> 2);\n            out[pos++] = g + y2 >> shift;\n            out[pos++] = g >> shift;\n            out[pos++] = g + y1 >> shift;\n          }\n        }\n\n        if (fourComponents) {\n          for (j = 0, pos = 3; j < jj; j++, pos += 4) {\n            out[pos] = y3items[j] + offset >> shift;\n          }\n        }\n      } else {\n        for (c = 0; c < componentsCount; c++) {\n          var items = transformedTiles[c].items;\n          shift = components[c].precision - 8;\n          offset = (128 << shift) + 0.5;\n\n          for (pos = c, j = 0, jj = items.length; j < jj; j++) {\n            out[pos] = items[j] + offset >> shift;\n            pos += componentsCount;\n          }\n        }\n      }\n\n      resultImages.push(result);\n    }\n\n    return resultImages;\n  }\n\n  function initializeTile(context, tileIndex) {\n    var siz = context.SIZ;\n    var componentsCount = siz.Csiz;\n    var tile = context.tiles[tileIndex];\n\n    for (var c = 0; c < componentsCount; c++) {\n      var component = tile.components[c];\n      var qcdOrQcc = context.currentTile.QCC[c] !== undefined ? context.currentTile.QCC[c] : context.currentTile.QCD;\n      component.quantizationParameters = qcdOrQcc;\n      var codOrCoc = context.currentTile.COC[c] !== undefined ? context.currentTile.COC[c] : context.currentTile.COD;\n      component.codingStyleParameters = codOrCoc;\n    }\n\n    tile.codingStyleDefaultParameters = context.currentTile.COD;\n  }\n\n  var TagTree = function TagTreeClosure() {\n    function TagTree(width, height) {\n      var levelsLength = (0, _core_utils.log2)(Math.max(width, height)) + 1;\n      this.levels = [];\n\n      for (var i = 0; i < levelsLength; i++) {\n        var level = {\n          width,\n          height,\n          items: []\n        };\n        this.levels.push(level);\n        width = Math.ceil(width / 2);\n        height = Math.ceil(height / 2);\n      }\n    }\n\n    TagTree.prototype = {\n      reset: function TagTree_reset(i, j) {\n        var currentLevel = 0,\n            value = 0,\n            level;\n\n        while (currentLevel < this.levels.length) {\n          level = this.levels[currentLevel];\n          var index = i + j * level.width;\n\n          if (level.items[index] !== undefined) {\n            value = level.items[index];\n            break;\n          }\n\n          level.index = index;\n          i >>= 1;\n          j >>= 1;\n          currentLevel++;\n        }\n\n        currentLevel--;\n        level = this.levels[currentLevel];\n        level.items[level.index] = value;\n        this.currentLevel = currentLevel;\n        delete this.value;\n      },\n      incrementValue: function TagTree_incrementValue() {\n        var level = this.levels[this.currentLevel];\n        level.items[level.index]++;\n      },\n      nextLevel: function TagTree_nextLevel() {\n        var currentLevel = this.currentLevel;\n        var level = this.levels[currentLevel];\n        var value = level.items[level.index];\n        currentLevel--;\n\n        if (currentLevel < 0) {\n          this.value = value;\n          return false;\n        }\n\n        this.currentLevel = currentLevel;\n        level = this.levels[currentLevel];\n        level.items[level.index] = value;\n        return true;\n      }\n    };\n    return TagTree;\n  }();\n\n  var InclusionTree = function InclusionTreeClosure() {\n    function InclusionTree(width, height, defaultValue) {\n      var levelsLength = (0, _core_utils.log2)(Math.max(width, height)) + 1;\n      this.levels = [];\n\n      for (var i = 0; i < levelsLength; i++) {\n        var items = new Uint8Array(width * height);\n\n        for (var j = 0, jj = items.length; j < jj; j++) {\n          items[j] = defaultValue;\n        }\n\n        var level = {\n          width,\n          height,\n          items\n        };\n        this.levels.push(level);\n        width = Math.ceil(width / 2);\n        height = Math.ceil(height / 2);\n      }\n    }\n\n    InclusionTree.prototype = {\n      reset: function InclusionTree_reset(i, j, stopValue) {\n        var currentLevel = 0;\n\n        while (currentLevel < this.levels.length) {\n          var level = this.levels[currentLevel];\n          var index = i + j * level.width;\n          level.index = index;\n          var value = level.items[index];\n\n          if (value === 0xff) {\n            break;\n          }\n\n          if (value > stopValue) {\n            this.currentLevel = currentLevel;\n            this.propagateValues();\n            return false;\n          }\n\n          i >>= 1;\n          j >>= 1;\n          currentLevel++;\n        }\n\n        this.currentLevel = currentLevel - 1;\n        return true;\n      },\n      incrementValue: function InclusionTree_incrementValue(stopValue) {\n        var level = this.levels[this.currentLevel];\n        level.items[level.index] = stopValue + 1;\n        this.propagateValues();\n      },\n      propagateValues: function InclusionTree_propagateValues() {\n        var levelIndex = this.currentLevel;\n        var level = this.levels[levelIndex];\n        var currentValue = level.items[level.index];\n\n        while (--levelIndex >= 0) {\n          level = this.levels[levelIndex];\n          level.items[level.index] = currentValue;\n        }\n      },\n      nextLevel: function InclusionTree_nextLevel() {\n        var currentLevel = this.currentLevel;\n        var level = this.levels[currentLevel];\n        var value = level.items[level.index];\n        level.items[level.index] = 0xff;\n        currentLevel--;\n\n        if (currentLevel < 0) {\n          return false;\n        }\n\n        this.currentLevel = currentLevel;\n        level = this.levels[currentLevel];\n        level.items[level.index] = value;\n        return true;\n      }\n    };\n    return InclusionTree;\n  }();\n\n  var BitModel = function BitModelClosure() {\n    var UNIFORM_CONTEXT = 17;\n    var RUNLENGTH_CONTEXT = 18;\n    var LLAndLHContextsLabel = new Uint8Array([0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8]);\n    var HLContextLabel = new Uint8Array([0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8]);\n    var HHContextLabel = new Uint8Array([0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5, 5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8]);\n\n    function BitModel(width, height, subband, zeroBitPlanes, mb) {\n      this.width = width;\n      this.height = height;\n      let contextLabelTable;\n\n      if (subband === \"HH\") {\n        contextLabelTable = HHContextLabel;\n      } else if (subband === \"HL\") {\n        contextLabelTable = HLContextLabel;\n      } else {\n        contextLabelTable = LLAndLHContextsLabel;\n      }\n\n      this.contextLabelTable = contextLabelTable;\n      var coefficientCount = width * height;\n      this.neighborsSignificance = new Uint8Array(coefficientCount);\n      this.coefficentsSign = new Uint8Array(coefficientCount);\n      let coefficentsMagnitude;\n\n      if (mb > 14) {\n        coefficentsMagnitude = new Uint32Array(coefficientCount);\n      } else if (mb > 6) {\n        coefficentsMagnitude = new Uint16Array(coefficientCount);\n      } else {\n        coefficentsMagnitude = new Uint8Array(coefficientCount);\n      }\n\n      this.coefficentsMagnitude = coefficentsMagnitude;\n      this.processingFlags = new Uint8Array(coefficientCount);\n      var bitsDecoded = new Uint8Array(coefficientCount);\n\n      if (zeroBitPlanes !== 0) {\n        for (var i = 0; i < coefficientCount; i++) {\n          bitsDecoded[i] = zeroBitPlanes;\n        }\n      }\n\n      this.bitsDecoded = bitsDecoded;\n      this.reset();\n    }\n\n    BitModel.prototype = {\n      setDecoder: function BitModel_setDecoder(decoder) {\n        this.decoder = decoder;\n      },\n      reset: function BitModel_reset() {\n        this.contexts = new Int8Array(19);\n        this.contexts[0] = 4 << 1 | 0;\n        this.contexts[UNIFORM_CONTEXT] = 46 << 1 | 0;\n        this.contexts[RUNLENGTH_CONTEXT] = 3 << 1 | 0;\n      },\n      setNeighborsSignificance: function BitModel_setNeighborsSignificance(row, column, index) {\n        var neighborsSignificance = this.neighborsSignificance;\n        var width = this.width,\n            height = this.height;\n        var left = column > 0;\n        var right = column + 1 < width;\n        var i;\n\n        if (row > 0) {\n          i = index - width;\n\n          if (left) {\n            neighborsSignificance[i - 1] += 0x10;\n          }\n\n          if (right) {\n            neighborsSignificance[i + 1] += 0x10;\n          }\n\n          neighborsSignificance[i] += 0x04;\n        }\n\n        if (row + 1 < height) {\n          i = index + width;\n\n          if (left) {\n            neighborsSignificance[i - 1] += 0x10;\n          }\n\n          if (right) {\n            neighborsSignificance[i + 1] += 0x10;\n          }\n\n          neighborsSignificance[i] += 0x04;\n        }\n\n        if (left) {\n          neighborsSignificance[index - 1] += 0x01;\n        }\n\n        if (right) {\n          neighborsSignificance[index + 1] += 0x01;\n        }\n\n        neighborsSignificance[index] |= 0x80;\n      },\n      runSignificancePropagationPass: function BitModel_runSignificancePropagationPass() {\n        var decoder = this.decoder;\n        var width = this.width,\n            height = this.height;\n        var coefficentsMagnitude = this.coefficentsMagnitude;\n        var coefficentsSign = this.coefficentsSign;\n        var neighborsSignificance = this.neighborsSignificance;\n        var processingFlags = this.processingFlags;\n        var contexts = this.contexts;\n        var labels = this.contextLabelTable;\n        var bitsDecoded = this.bitsDecoded;\n        var processedInverseMask = ~1;\n        var processedMask = 1;\n        var firstMagnitudeBitMask = 2;\n\n        for (var i0 = 0; i0 < height; i0 += 4) {\n          for (var j = 0; j < width; j++) {\n            var index = i0 * width + j;\n\n            for (var i1 = 0; i1 < 4; i1++, index += width) {\n              var i = i0 + i1;\n\n              if (i >= height) {\n                break;\n              }\n\n              processingFlags[index] &= processedInverseMask;\n\n              if (coefficentsMagnitude[index] || !neighborsSignificance[index]) {\n                continue;\n              }\n\n              var contextLabel = labels[neighborsSignificance[index]];\n              var decision = decoder.readBit(contexts, contextLabel);\n\n              if (decision) {\n                var sign = this.decodeSignBit(i, j, index);\n                coefficentsSign[index] = sign;\n                coefficentsMagnitude[index] = 1;\n                this.setNeighborsSignificance(i, j, index);\n                processingFlags[index] |= firstMagnitudeBitMask;\n              }\n\n              bitsDecoded[index]++;\n              processingFlags[index] |= processedMask;\n            }\n          }\n        }\n      },\n      decodeSignBit: function BitModel_decodeSignBit(row, column, index) {\n        var width = this.width,\n            height = this.height;\n        var coefficentsMagnitude = this.coefficentsMagnitude;\n        var coefficentsSign = this.coefficentsSign;\n        var contribution, sign0, sign1, significance1;\n        var contextLabel, decoded;\n        significance1 = column > 0 && coefficentsMagnitude[index - 1] !== 0;\n\n        if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) {\n          sign1 = coefficentsSign[index + 1];\n\n          if (significance1) {\n            sign0 = coefficentsSign[index - 1];\n            contribution = 1 - sign1 - sign0;\n          } else {\n            contribution = 1 - sign1 - sign1;\n          }\n        } else if (significance1) {\n          sign0 = coefficentsSign[index - 1];\n          contribution = 1 - sign0 - sign0;\n        } else {\n          contribution = 0;\n        }\n\n        var horizontalContribution = 3 * contribution;\n        significance1 = row > 0 && coefficentsMagnitude[index - width] !== 0;\n\n        if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) {\n          sign1 = coefficentsSign[index + width];\n\n          if (significance1) {\n            sign0 = coefficentsSign[index - width];\n            contribution = 1 - sign1 - sign0 + horizontalContribution;\n          } else {\n            contribution = 1 - sign1 - sign1 + horizontalContribution;\n          }\n        } else if (significance1) {\n          sign0 = coefficentsSign[index - width];\n          contribution = 1 - sign0 - sign0 + horizontalContribution;\n        } else {\n          contribution = horizontalContribution;\n        }\n\n        if (contribution >= 0) {\n          contextLabel = 9 + contribution;\n          decoded = this.decoder.readBit(this.contexts, contextLabel);\n        } else {\n          contextLabel = 9 - contribution;\n          decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1;\n        }\n\n        return decoded;\n      },\n      runMagnitudeRefinementPass: function BitModel_runMagnitudeRefinementPass() {\n        var decoder = this.decoder;\n        var width = this.width,\n            height = this.height;\n        var coefficentsMagnitude = this.coefficentsMagnitude;\n        var neighborsSignificance = this.neighborsSignificance;\n        var contexts = this.contexts;\n        var bitsDecoded = this.bitsDecoded;\n        var processingFlags = this.processingFlags;\n        var processedMask = 1;\n        var firstMagnitudeBitMask = 2;\n        var length = width * height;\n        var width4 = width * 4;\n\n        for (var index0 = 0, indexNext; index0 < length; index0 = indexNext) {\n          indexNext = Math.min(length, index0 + width4);\n\n          for (var j = 0; j < width; j++) {\n            for (var index = index0 + j; index < indexNext; index += width) {\n              if (!coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) {\n                continue;\n              }\n\n              var contextLabel = 16;\n\n              if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) {\n                processingFlags[index] ^= firstMagnitudeBitMask;\n                var significance = neighborsSignificance[index] & 127;\n                contextLabel = significance === 0 ? 15 : 14;\n              }\n\n              var bit = decoder.readBit(contexts, contextLabel);\n              coefficentsMagnitude[index] = coefficentsMagnitude[index] << 1 | bit;\n              bitsDecoded[index]++;\n              processingFlags[index] |= processedMask;\n            }\n          }\n        }\n      },\n      runCleanupPass: function BitModel_runCleanupPass() {\n        var decoder = this.decoder;\n        var width = this.width,\n            height = this.height;\n        var neighborsSignificance = this.neighborsSignificance;\n        var coefficentsMagnitude = this.coefficentsMagnitude;\n        var coefficentsSign = this.coefficentsSign;\n        var contexts = this.contexts;\n        var labels = this.contextLabelTable;\n        var bitsDecoded = this.bitsDecoded;\n        var processingFlags = this.processingFlags;\n        var processedMask = 1;\n        var firstMagnitudeBitMask = 2;\n        var oneRowDown = width;\n        var twoRowsDown = width * 2;\n        var threeRowsDown = width * 3;\n        var iNext;\n\n        for (var i0 = 0; i0 < height; i0 = iNext) {\n          iNext = Math.min(i0 + 4, height);\n          var indexBase = i0 * width;\n          var checkAllEmpty = i0 + 3 < height;\n\n          for (var j = 0; j < width; j++) {\n            var index0 = indexBase + j;\n            var allEmpty = checkAllEmpty && processingFlags[index0] === 0 && processingFlags[index0 + oneRowDown] === 0 && processingFlags[index0 + twoRowsDown] === 0 && processingFlags[index0 + threeRowsDown] === 0 && neighborsSignificance[index0] === 0 && neighborsSignificance[index0 + oneRowDown] === 0 && neighborsSignificance[index0 + twoRowsDown] === 0 && neighborsSignificance[index0 + threeRowsDown] === 0;\n            var i1 = 0,\n                index = index0;\n            var i = i0,\n                sign;\n\n            if (allEmpty) {\n              var hasSignificantCoefficent = decoder.readBit(contexts, RUNLENGTH_CONTEXT);\n\n              if (!hasSignificantCoefficent) {\n                bitsDecoded[index0]++;\n                bitsDecoded[index0 + oneRowDown]++;\n                bitsDecoded[index0 + twoRowsDown]++;\n                bitsDecoded[index0 + threeRowsDown]++;\n                continue;\n              }\n\n              i1 = decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, UNIFORM_CONTEXT);\n\n              if (i1 !== 0) {\n                i = i0 + i1;\n                index += i1 * width;\n              }\n\n              sign = this.decodeSignBit(i, j, index);\n              coefficentsSign[index] = sign;\n              coefficentsMagnitude[index] = 1;\n              this.setNeighborsSignificance(i, j, index);\n              processingFlags[index] |= firstMagnitudeBitMask;\n              index = index0;\n\n              for (var i2 = i0; i2 <= i; i2++, index += width) {\n                bitsDecoded[index]++;\n              }\n\n              i1++;\n            }\n\n            for (i = i0 + i1; i < iNext; i++, index += width) {\n              if (coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) {\n                continue;\n              }\n\n              var contextLabel = labels[neighborsSignificance[index]];\n              var decision = decoder.readBit(contexts, contextLabel);\n\n              if (decision === 1) {\n                sign = this.decodeSignBit(i, j, index);\n                coefficentsSign[index] = sign;\n                coefficentsMagnitude[index] = 1;\n                this.setNeighborsSignificance(i, j, index);\n                processingFlags[index] |= firstMagnitudeBitMask;\n              }\n\n              bitsDecoded[index]++;\n            }\n          }\n        }\n      },\n      checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() {\n        var decoder = this.decoder;\n        var contexts = this.contexts;\n        var symbol = decoder.readBit(contexts, UNIFORM_CONTEXT) << 3 | decoder.readBit(contexts, UNIFORM_CONTEXT) << 2 | decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, UNIFORM_CONTEXT);\n\n        if (symbol !== 0xa) {\n          throw new JpxError(\"Invalid segmentation symbol\");\n        }\n      }\n    };\n    return BitModel;\n  }();\n\n  var Transform = function TransformClosure() {\n    function Transform() {}\n\n    Transform.prototype.calculate = function transformCalculate(subbands, u0, v0) {\n      var ll = subbands[0];\n\n      for (var i = 1, ii = subbands.length; i < ii; i++) {\n        ll = this.iterate(ll, subbands[i], u0, v0);\n      }\n\n      return ll;\n    };\n\n    Transform.prototype.extend = function extend(buffer, offset, size) {\n      var i1 = offset - 1,\n          j1 = offset + 1;\n      var i2 = offset + size - 2,\n          j2 = offset + size;\n      buffer[i1--] = buffer[j1++];\n      buffer[j2++] = buffer[i2--];\n      buffer[i1--] = buffer[j1++];\n      buffer[j2++] = buffer[i2--];\n      buffer[i1--] = buffer[j1++];\n      buffer[j2++] = buffer[i2--];\n      buffer[i1] = buffer[j1];\n      buffer[j2] = buffer[i2];\n    };\n\n    Transform.prototype.iterate = function Transform_iterate(ll, hl_lh_hh, u0, v0) {\n      var llWidth = ll.width,\n          llHeight = ll.height,\n          llItems = ll.items;\n      var width = hl_lh_hh.width;\n      var height = hl_lh_hh.height;\n      var items = hl_lh_hh.items;\n      var i, j, k, l, u, v;\n\n      for (k = 0, i = 0; i < llHeight; i++) {\n        l = i * 2 * width;\n\n        for (j = 0; j < llWidth; j++, k++, l += 2) {\n          items[l] = llItems[k];\n        }\n      }\n\n      llItems = ll.items = null;\n      var bufferPadding = 4;\n      var rowBuffer = new Float32Array(width + 2 * bufferPadding);\n\n      if (width === 1) {\n        if ((u0 & 1) !== 0) {\n          for (v = 0, k = 0; v < height; v++, k += width) {\n            items[k] *= 0.5;\n          }\n        }\n      } else {\n        for (v = 0, k = 0; v < height; v++, k += width) {\n          rowBuffer.set(items.subarray(k, k + width), bufferPadding);\n          this.extend(rowBuffer, bufferPadding, width);\n          this.filter(rowBuffer, bufferPadding, width);\n          items.set(rowBuffer.subarray(bufferPadding, bufferPadding + width), k);\n        }\n      }\n\n      var numBuffers = 16;\n      var colBuffers = [];\n\n      for (i = 0; i < numBuffers; i++) {\n        colBuffers.push(new Float32Array(height + 2 * bufferPadding));\n      }\n\n      var b,\n          currentBuffer = 0;\n      ll = bufferPadding + height;\n\n      if (height === 1) {\n        if ((v0 & 1) !== 0) {\n          for (u = 0; u < width; u++) {\n            items[u] *= 0.5;\n          }\n        }\n      } else {\n        for (u = 0; u < width; u++) {\n          if (currentBuffer === 0) {\n            numBuffers = Math.min(width - u, numBuffers);\n\n            for (k = u, l = bufferPadding; l < ll; k += width, l++) {\n              for (b = 0; b < numBuffers; b++) {\n                colBuffers[b][l] = items[k + b];\n              }\n            }\n\n            currentBuffer = numBuffers;\n          }\n\n          currentBuffer--;\n          var buffer = colBuffers[currentBuffer];\n          this.extend(buffer, bufferPadding, height);\n          this.filter(buffer, bufferPadding, height);\n\n          if (currentBuffer === 0) {\n            k = u - numBuffers + 1;\n\n            for (l = bufferPadding; l < ll; k += width, l++) {\n              for (b = 0; b < numBuffers; b++) {\n                items[k + b] = colBuffers[b][l];\n              }\n            }\n          }\n        }\n      }\n\n      return {\n        width,\n        height,\n        items\n      };\n    };\n\n    return Transform;\n  }();\n\n  var IrreversibleTransform = function IrreversibleTransformClosure() {\n    function IrreversibleTransform() {\n      Transform.call(this);\n    }\n\n    IrreversibleTransform.prototype = Object.create(Transform.prototype);\n\n    IrreversibleTransform.prototype.filter = function irreversibleTransformFilter(x, offset, length) {\n      var len = length >> 1;\n      offset = offset | 0;\n      var j, n, current, next;\n      var alpha = -1.586134342059924;\n      var beta = -0.052980118572961;\n      var gamma = 0.882911075530934;\n      var delta = 0.443506852043971;\n      var K = 1.230174104914001;\n      var K_ = 1 / K;\n      j = offset - 3;\n\n      for (n = len + 4; n--; j += 2) {\n        x[j] *= K_;\n      }\n\n      j = offset - 2;\n      current = delta * x[j - 1];\n\n      for (n = len + 3; n--; j += 2) {\n        next = delta * x[j + 1];\n        x[j] = K * x[j] - current - next;\n\n        if (n--) {\n          j += 2;\n          current = delta * x[j + 1];\n          x[j] = K * x[j] - current - next;\n        } else {\n          break;\n        }\n      }\n\n      j = offset - 1;\n      current = gamma * x[j - 1];\n\n      for (n = len + 2; n--; j += 2) {\n        next = gamma * x[j + 1];\n        x[j] -= current + next;\n\n        if (n--) {\n          j += 2;\n          current = gamma * x[j + 1];\n          x[j] -= current + next;\n        } else {\n          break;\n        }\n      }\n\n      j = offset;\n      current = beta * x[j - 1];\n\n      for (n = len + 1; n--; j += 2) {\n        next = beta * x[j + 1];\n        x[j] -= current + next;\n\n        if (n--) {\n          j += 2;\n          current = beta * x[j + 1];\n          x[j] -= current + next;\n        } else {\n          break;\n        }\n      }\n\n      if (len !== 0) {\n        j = offset + 1;\n        current = alpha * x[j - 1];\n\n        for (n = len; n--; j += 2) {\n          next = alpha * x[j + 1];\n          x[j] -= current + next;\n\n          if (n--) {\n            j += 2;\n            current = alpha * x[j + 1];\n            x[j] -= current + next;\n          } else {\n            break;\n          }\n        }\n      }\n    };\n\n    return IrreversibleTransform;\n  }();\n\n  var ReversibleTransform = function ReversibleTransformClosure() {\n    function ReversibleTransform() {\n      Transform.call(this);\n    }\n\n    ReversibleTransform.prototype = Object.create(Transform.prototype);\n\n    ReversibleTransform.prototype.filter = function reversibleTransformFilter(x, offset, length) {\n      var len = length >> 1;\n      offset = offset | 0;\n      var j, n;\n\n      for (j = offset, n = len + 1; n--; j += 2) {\n        x[j] -= x[j - 1] + x[j + 1] + 2 >> 2;\n      }\n\n      for (j = offset + 1, n = len; n--; j += 2) {\n        x[j] += x[j - 1] + x[j + 1] >> 1;\n      }\n    };\n\n    return ReversibleTransform;\n  }();\n\n  return JpxImage;\n}();\n\nexports.JpxImage = JpxImage;\n\n/***/ }),\n/* 22 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.calculateSHA384 = calculateSHA384;\nexports.PDF20 = exports.PDF17 = exports.CipherTransformFactory = exports.calculateSHA512 = exports.calculateSHA256 = exports.calculateMD5 = exports.ARCFourCipher = exports.AES256Cipher = exports.AES128Cipher = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _primitives = __w_pdfjs_require__(5);\n\nvar _stream = __w_pdfjs_require__(12);\n\nclass ARCFourCipher {\n  constructor(key) {\n    this.a = 0;\n    this.b = 0;\n    var s = new Uint8Array(256);\n    var i,\n        j = 0,\n        tmp,\n        keyLength = key.length;\n\n    for (i = 0; i < 256; ++i) {\n      s[i] = i;\n    }\n\n    for (i = 0; i < 256; ++i) {\n      tmp = s[i];\n      j = j + tmp + key[i % keyLength] & 0xff;\n      s[i] = s[j];\n      s[j] = tmp;\n    }\n\n    this.s = s;\n  }\n\n  encryptBlock(data) {\n    var i,\n        n = data.length,\n        tmp,\n        tmp2;\n    var a = this.a,\n        b = this.b,\n        s = this.s;\n    var output = new Uint8Array(n);\n\n    for (i = 0; i < n; ++i) {\n      a = a + 1 & 0xff;\n      tmp = s[a];\n      b = b + tmp & 0xff;\n      tmp2 = s[b];\n      s[a] = tmp2;\n      s[b] = tmp;\n      output[i] = data[i] ^ s[tmp + tmp2 & 0xff];\n    }\n\n    this.a = a;\n    this.b = b;\n    return output;\n  }\n\n  decryptBlock(data) {\n    return this.encryptBlock(data);\n  }\n\n  encrypt(data) {\n    return this.encryptBlock(data);\n  }\n\n}\n\nexports.ARCFourCipher = ARCFourCipher;\n\nvar calculateMD5 = function calculateMD5Closure() {\n  var r = new Uint8Array([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);\n  var k = new Int32Array([-680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, -145523070, -1120210379, 718787259, -343485551]);\n\n  function hash(data, offset, length) {\n    var h0 = 1732584193,\n        h1 = -271733879,\n        h2 = -1732584194,\n        h3 = 271733878;\n    var paddedLength = length + 72 & ~63;\n    var padded = new Uint8Array(paddedLength);\n    var i, j, n;\n\n    for (i = 0; i < length; ++i) {\n      padded[i] = data[offset++];\n    }\n\n    padded[i++] = 0x80;\n    n = paddedLength - 8;\n\n    while (i < n) {\n      padded[i++] = 0;\n    }\n\n    padded[i++] = length << 3 & 0xff;\n    padded[i++] = length >> 5 & 0xff;\n    padded[i++] = length >> 13 & 0xff;\n    padded[i++] = length >> 21 & 0xff;\n    padded[i++] = length >>> 29 & 0xff;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    var w = new Int32Array(16);\n\n    for (i = 0; i < paddedLength;) {\n      for (j = 0; j < 16; ++j, i += 4) {\n        w[j] = padded[i] | padded[i + 1] << 8 | padded[i + 2] << 16 | padded[i + 3] << 24;\n      }\n\n      var a = h0,\n          b = h1,\n          c = h2,\n          d = h3,\n          f,\n          g;\n\n      for (j = 0; j < 64; ++j) {\n        if (j < 16) {\n          f = b & c | ~b & d;\n          g = j;\n        } else if (j < 32) {\n          f = d & b | ~d & c;\n          g = 5 * j + 1 & 15;\n        } else if (j < 48) {\n          f = b ^ c ^ d;\n          g = 3 * j + 5 & 15;\n        } else {\n          f = c ^ (b | ~d);\n          g = 7 * j & 15;\n        }\n\n        var tmp = d,\n            rotateArg = a + f + k[j] + w[g] | 0,\n            rotate = r[j];\n        d = c;\n        c = b;\n        b = b + (rotateArg << rotate | rotateArg >>> 32 - rotate) | 0;\n        a = tmp;\n      }\n\n      h0 = h0 + a | 0;\n      h1 = h1 + b | 0;\n      h2 = h2 + c | 0;\n      h3 = h3 + d | 0;\n    }\n\n    return new Uint8Array([h0 & 0xFF, h0 >> 8 & 0xFF, h0 >> 16 & 0xFF, h0 >>> 24 & 0xFF, h1 & 0xFF, h1 >> 8 & 0xFF, h1 >> 16 & 0xFF, h1 >>> 24 & 0xFF, h2 & 0xFF, h2 >> 8 & 0xFF, h2 >> 16 & 0xFF, h2 >>> 24 & 0xFF, h3 & 0xFF, h3 >> 8 & 0xFF, h3 >> 16 & 0xFF, h3 >>> 24 & 0xFF]);\n  }\n\n  return hash;\n}();\n\nexports.calculateMD5 = calculateMD5;\n\nclass Word64 {\n  constructor(highInteger, lowInteger) {\n    this.high = highInteger | 0;\n    this.low = lowInteger | 0;\n  }\n\n  and(word) {\n    this.high &= word.high;\n    this.low &= word.low;\n  }\n\n  xor(word) {\n    this.high ^= word.high;\n    this.low ^= word.low;\n  }\n\n  or(word) {\n    this.high |= word.high;\n    this.low |= word.low;\n  }\n\n  shiftRight(places) {\n    if (places >= 32) {\n      this.low = this.high >>> places - 32 | 0;\n      this.high = 0;\n    } else {\n      this.low = this.low >>> places | this.high << 32 - places;\n      this.high = this.high >>> places | 0;\n    }\n  }\n\n  shiftLeft(places) {\n    if (places >= 32) {\n      this.high = this.low << places - 32;\n      this.low = 0;\n    } else {\n      this.high = this.high << places | this.low >>> 32 - places;\n      this.low = this.low << places;\n    }\n  }\n\n  rotateRight(places) {\n    var low, high;\n\n    if (places & 32) {\n      high = this.low;\n      low = this.high;\n    } else {\n      low = this.low;\n      high = this.high;\n    }\n\n    places &= 31;\n    this.low = low >>> places | high << 32 - places;\n    this.high = high >>> places | low << 32 - places;\n  }\n\n  not() {\n    this.high = ~this.high;\n    this.low = ~this.low;\n  }\n\n  add(word) {\n    var lowAdd = (this.low >>> 0) + (word.low >>> 0);\n    var highAdd = (this.high >>> 0) + (word.high >>> 0);\n\n    if (lowAdd > 0xffffffff) {\n      highAdd += 1;\n    }\n\n    this.low = lowAdd | 0;\n    this.high = highAdd | 0;\n  }\n\n  copyTo(bytes, offset) {\n    bytes[offset] = this.high >>> 24 & 0xff;\n    bytes[offset + 1] = this.high >> 16 & 0xff;\n    bytes[offset + 2] = this.high >> 8 & 0xff;\n    bytes[offset + 3] = this.high & 0xff;\n    bytes[offset + 4] = this.low >>> 24 & 0xff;\n    bytes[offset + 5] = this.low >> 16 & 0xff;\n    bytes[offset + 6] = this.low >> 8 & 0xff;\n    bytes[offset + 7] = this.low & 0xff;\n  }\n\n  assign(word) {\n    this.high = word.high;\n    this.low = word.low;\n  }\n\n}\n\nvar calculateSHA256 = function calculateSHA256Closure() {\n  function rotr(x, n) {\n    return x >>> n | x << 32 - n;\n  }\n\n  function ch(x, y, z) {\n    return x & y ^ ~x & z;\n  }\n\n  function maj(x, y, z) {\n    return x & y ^ x & z ^ y & z;\n  }\n\n  function sigma(x) {\n    return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22);\n  }\n\n  function sigmaPrime(x) {\n    return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25);\n  }\n\n  function littleSigma(x) {\n    return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3;\n  }\n\n  function littleSigmaPrime(x) {\n    return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10;\n  }\n\n  var k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];\n\n  function hash(data, offset, length) {\n    var h0 = 0x6a09e667,\n        h1 = 0xbb67ae85,\n        h2 = 0x3c6ef372,\n        h3 = 0xa54ff53a,\n        h4 = 0x510e527f,\n        h5 = 0x9b05688c,\n        h6 = 0x1f83d9ab,\n        h7 = 0x5be0cd19;\n    var paddedLength = Math.ceil((length + 9) / 64) * 64;\n    var padded = new Uint8Array(paddedLength);\n    var i, j, n;\n\n    for (i = 0; i < length; ++i) {\n      padded[i] = data[offset++];\n    }\n\n    padded[i++] = 0x80;\n    n = paddedLength - 8;\n\n    while (i < n) {\n      padded[i++] = 0;\n    }\n\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = length >>> 29 & 0xff;\n    padded[i++] = length >> 21 & 0xff;\n    padded[i++] = length >> 13 & 0xff;\n    padded[i++] = length >> 5 & 0xff;\n    padded[i++] = length << 3 & 0xff;\n    var w = new Uint32Array(64);\n\n    for (i = 0; i < paddedLength;) {\n      for (j = 0; j < 16; ++j) {\n        w[j] = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3];\n        i += 4;\n      }\n\n      for (j = 16; j < 64; ++j) {\n        w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] + littleSigma(w[j - 15]) + w[j - 16] | 0;\n      }\n\n      var a = h0,\n          b = h1,\n          c = h2,\n          d = h3,\n          e = h4,\n          f = h5,\n          g = h6,\n          h = h7,\n          t1,\n          t2;\n\n      for (j = 0; j < 64; ++j) {\n        t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j];\n        t2 = sigma(a) + maj(a, b, c);\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      h0 = h0 + a | 0;\n      h1 = h1 + b | 0;\n      h2 = h2 + c | 0;\n      h3 = h3 + d | 0;\n      h4 = h4 + e | 0;\n      h5 = h5 + f | 0;\n      h6 = h6 + g | 0;\n      h7 = h7 + h | 0;\n    }\n\n    return new Uint8Array([h0 >> 24 & 0xFF, h0 >> 16 & 0xFF, h0 >> 8 & 0xFF, h0 & 0xFF, h1 >> 24 & 0xFF, h1 >> 16 & 0xFF, h1 >> 8 & 0xFF, h1 & 0xFF, h2 >> 24 & 0xFF, h2 >> 16 & 0xFF, h2 >> 8 & 0xFF, h2 & 0xFF, h3 >> 24 & 0xFF, h3 >> 16 & 0xFF, h3 >> 8 & 0xFF, h3 & 0xFF, h4 >> 24 & 0xFF, h4 >> 16 & 0xFF, h4 >> 8 & 0xFF, h4 & 0xFF, h5 >> 24 & 0xFF, h5 >> 16 & 0xFF, h5 >> 8 & 0xFF, h5 & 0xFF, h6 >> 24 & 0xFF, h6 >> 16 & 0xFF, h6 >> 8 & 0xFF, h6 & 0xFF, h7 >> 24 & 0xFF, h7 >> 16 & 0xFF, h7 >> 8 & 0xFF, h7 & 0xFF]);\n  }\n\n  return hash;\n}();\n\nexports.calculateSHA256 = calculateSHA256;\n\nvar calculateSHA512 = function calculateSHA512Closure() {\n  function ch(result, x, y, z, tmp) {\n    result.assign(x);\n    result.and(y);\n    tmp.assign(x);\n    tmp.not();\n    tmp.and(z);\n    result.xor(tmp);\n  }\n\n  function maj(result, x, y, z, tmp) {\n    result.assign(x);\n    result.and(y);\n    tmp.assign(x);\n    tmp.and(z);\n    result.xor(tmp);\n    tmp.assign(y);\n    tmp.and(z);\n    result.xor(tmp);\n  }\n\n  function sigma(result, x, tmp) {\n    result.assign(x);\n    result.rotateRight(28);\n    tmp.assign(x);\n    tmp.rotateRight(34);\n    result.xor(tmp);\n    tmp.assign(x);\n    tmp.rotateRight(39);\n    result.xor(tmp);\n  }\n\n  function sigmaPrime(result, x, tmp) {\n    result.assign(x);\n    result.rotateRight(14);\n    tmp.assign(x);\n    tmp.rotateRight(18);\n    result.xor(tmp);\n    tmp.assign(x);\n    tmp.rotateRight(41);\n    result.xor(tmp);\n  }\n\n  function littleSigma(result, x, tmp) {\n    result.assign(x);\n    result.rotateRight(1);\n    tmp.assign(x);\n    tmp.rotateRight(8);\n    result.xor(tmp);\n    tmp.assign(x);\n    tmp.shiftRight(7);\n    result.xor(tmp);\n  }\n\n  function littleSigmaPrime(result, x, tmp) {\n    result.assign(x);\n    result.rotateRight(19);\n    tmp.assign(x);\n    tmp.rotateRight(61);\n    result.xor(tmp);\n    tmp.assign(x);\n    tmp.shiftRight(6);\n    result.xor(tmp);\n  }\n\n  var k = [new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019), new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe), new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2), new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694), new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3), new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5), new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4), new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926), new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b), new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910), new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8), new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3), new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9), new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178), new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493), new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)];\n\n  function hash(data, offset, length, mode384 = false) {\n    var h0, h1, h2, h3, h4, h5, h6, h7;\n\n    if (!mode384) {\n      h0 = new Word64(0x6a09e667, 0xf3bcc908);\n      h1 = new Word64(0xbb67ae85, 0x84caa73b);\n      h2 = new Word64(0x3c6ef372, 0xfe94f82b);\n      h3 = new Word64(0xa54ff53a, 0x5f1d36f1);\n      h4 = new Word64(0x510e527f, 0xade682d1);\n      h5 = new Word64(0x9b05688c, 0x2b3e6c1f);\n      h6 = new Word64(0x1f83d9ab, 0xfb41bd6b);\n      h7 = new Word64(0x5be0cd19, 0x137e2179);\n    } else {\n      h0 = new Word64(0xcbbb9d5d, 0xc1059ed8);\n      h1 = new Word64(0x629a292a, 0x367cd507);\n      h2 = new Word64(0x9159015a, 0x3070dd17);\n      h3 = new Word64(0x152fecd8, 0xf70e5939);\n      h4 = new Word64(0x67332667, 0xffc00b31);\n      h5 = new Word64(0x8eb44a87, 0x68581511);\n      h6 = new Word64(0xdb0c2e0d, 0x64f98fa7);\n      h7 = new Word64(0x47b5481d, 0xbefa4fa4);\n    }\n\n    var paddedLength = Math.ceil((length + 17) / 128) * 128;\n    var padded = new Uint8Array(paddedLength);\n    var i, j, n;\n\n    for (i = 0; i < length; ++i) {\n      padded[i] = data[offset++];\n    }\n\n    padded[i++] = 0x80;\n    n = paddedLength - 16;\n\n    while (i < n) {\n      padded[i++] = 0;\n    }\n\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = length >>> 29 & 0xff;\n    padded[i++] = length >> 21 & 0xff;\n    padded[i++] = length >> 13 & 0xff;\n    padded[i++] = length >> 5 & 0xff;\n    padded[i++] = length << 3 & 0xff;\n    var w = new Array(80);\n\n    for (i = 0; i < 80; i++) {\n      w[i] = new Word64(0, 0);\n    }\n\n    var a = new Word64(0, 0),\n        b = new Word64(0, 0),\n        c = new Word64(0, 0);\n    var d = new Word64(0, 0),\n        e = new Word64(0, 0),\n        f = new Word64(0, 0);\n    var g = new Word64(0, 0),\n        h = new Word64(0, 0);\n    var t1 = new Word64(0, 0),\n        t2 = new Word64(0, 0);\n    var tmp1 = new Word64(0, 0),\n        tmp2 = new Word64(0, 0),\n        tmp3;\n\n    for (i = 0; i < paddedLength;) {\n      for (j = 0; j < 16; ++j) {\n        w[j].high = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3];\n        w[j].low = padded[i + 4] << 24 | padded[i + 5] << 16 | padded[i + 6] << 8 | padded[i + 7];\n        i += 8;\n      }\n\n      for (j = 16; j < 80; ++j) {\n        tmp3 = w[j];\n        littleSigmaPrime(tmp3, w[j - 2], tmp2);\n        tmp3.add(w[j - 7]);\n        littleSigma(tmp1, w[j - 15], tmp2);\n        tmp3.add(tmp1);\n        tmp3.add(w[j - 16]);\n      }\n\n      a.assign(h0);\n      b.assign(h1);\n      c.assign(h2);\n      d.assign(h3);\n      e.assign(h4);\n      f.assign(h5);\n      g.assign(h6);\n      h.assign(h7);\n\n      for (j = 0; j < 80; ++j) {\n        t1.assign(h);\n        sigmaPrime(tmp1, e, tmp2);\n        t1.add(tmp1);\n        ch(tmp1, e, f, g, tmp2);\n        t1.add(tmp1);\n        t1.add(k[j]);\n        t1.add(w[j]);\n        sigma(t2, a, tmp2);\n        maj(tmp1, a, b, c, tmp2);\n        t2.add(tmp1);\n        tmp3 = h;\n        h = g;\n        g = f;\n        f = e;\n        d.add(t1);\n        e = d;\n        d = c;\n        c = b;\n        b = a;\n        tmp3.assign(t1);\n        tmp3.add(t2);\n        a = tmp3;\n      }\n\n      h0.add(a);\n      h1.add(b);\n      h2.add(c);\n      h3.add(d);\n      h4.add(e);\n      h5.add(f);\n      h6.add(g);\n      h7.add(h);\n    }\n\n    var result;\n\n    if (!mode384) {\n      result = new Uint8Array(64);\n      h0.copyTo(result, 0);\n      h1.copyTo(result, 8);\n      h2.copyTo(result, 16);\n      h3.copyTo(result, 24);\n      h4.copyTo(result, 32);\n      h5.copyTo(result, 40);\n      h6.copyTo(result, 48);\n      h7.copyTo(result, 56);\n    } else {\n      result = new Uint8Array(48);\n      h0.copyTo(result, 0);\n      h1.copyTo(result, 8);\n      h2.copyTo(result, 16);\n      h3.copyTo(result, 24);\n      h4.copyTo(result, 32);\n      h5.copyTo(result, 40);\n    }\n\n    return result;\n  }\n\n  return hash;\n}();\n\nexports.calculateSHA512 = calculateSHA512;\n\nfunction calculateSHA384(data, offset, length) {\n  return calculateSHA512(data, offset, length, true);\n}\n\nclass NullCipher {\n  decryptBlock(data) {\n    return data;\n  }\n\n  encrypt(data) {\n    return data;\n  }\n\n}\n\nclass AESBaseCipher {\n  constructor() {\n    if (this.constructor === AESBaseCipher) {\n      (0, _util.unreachable)(\"Cannot initialize AESBaseCipher.\");\n    }\n\n    this._s = new Uint8Array([0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]);\n    this._inv_s = new Uint8Array([0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]);\n    this._mix = new Uint32Array([0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);\n    this._mixCol = new Uint8Array(256);\n\n    for (let i = 0; i < 256; i++) {\n      if (i < 128) {\n        this._mixCol[i] = i << 1;\n      } else {\n        this._mixCol[i] = i << 1 ^ 0x1b;\n      }\n    }\n\n    this.buffer = new Uint8Array(16);\n    this.bufferPosition = 0;\n  }\n\n  _expandKey(cipherKey) {\n    (0, _util.unreachable)(\"Cannot call `_expandKey` on the base class\");\n  }\n\n  _decrypt(input, key) {\n    let t, u, v;\n    const state = new Uint8Array(16);\n    state.set(input);\n\n    for (let j = 0, k = this._keySize; j < 16; ++j, ++k) {\n      state[j] ^= key[k];\n    }\n\n    for (let i = this._cyclesOfRepetition - 1; i >= 1; --i) {\n      t = state[13];\n      state[13] = state[9];\n      state[9] = state[5];\n      state[5] = state[1];\n      state[1] = t;\n      t = state[14];\n      u = state[10];\n      state[14] = state[6];\n      state[10] = state[2];\n      state[6] = t;\n      state[2] = u;\n      t = state[15];\n      u = state[11];\n      v = state[7];\n      state[15] = state[3];\n      state[11] = t;\n      state[7] = u;\n      state[3] = v;\n\n      for (let j = 0; j < 16; ++j) {\n        state[j] = this._inv_s[state[j]];\n      }\n\n      for (let j = 0, k = i * 16; j < 16; ++j, ++k) {\n        state[j] ^= key[k];\n      }\n\n      for (let j = 0; j < 16; j += 4) {\n        const s0 = this._mix[state[j]];\n        const s1 = this._mix[state[j + 1]];\n        const s2 = this._mix[state[j + 2]];\n        const s3 = this._mix[state[j + 3]];\n        t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8;\n        state[j] = t >>> 24 & 0xff;\n        state[j + 1] = t >> 16 & 0xff;\n        state[j + 2] = t >> 8 & 0xff;\n        state[j + 3] = t & 0xff;\n      }\n    }\n\n    t = state[13];\n    state[13] = state[9];\n    state[9] = state[5];\n    state[5] = state[1];\n    state[1] = t;\n    t = state[14];\n    u = state[10];\n    state[14] = state[6];\n    state[10] = state[2];\n    state[6] = t;\n    state[2] = u;\n    t = state[15];\n    u = state[11];\n    v = state[7];\n    state[15] = state[3];\n    state[11] = t;\n    state[7] = u;\n    state[3] = v;\n\n    for (let j = 0; j < 16; ++j) {\n      state[j] = this._inv_s[state[j]];\n      state[j] ^= key[j];\n    }\n\n    return state;\n  }\n\n  _encrypt(input, key) {\n    const s = this._s;\n    let t, u, v;\n    const state = new Uint8Array(16);\n    state.set(input);\n\n    for (let j = 0; j < 16; ++j) {\n      state[j] ^= key[j];\n    }\n\n    for (let i = 1; i < this._cyclesOfRepetition; i++) {\n      for (let j = 0; j < 16; ++j) {\n        state[j] = s[state[j]];\n      }\n\n      v = state[1];\n      state[1] = state[5];\n      state[5] = state[9];\n      state[9] = state[13];\n      state[13] = v;\n      v = state[2];\n      u = state[6];\n      state[2] = state[10];\n      state[6] = state[14];\n      state[10] = v;\n      state[14] = u;\n      v = state[3];\n      u = state[7];\n      t = state[11];\n      state[3] = state[15];\n      state[7] = v;\n      state[11] = u;\n      state[15] = t;\n\n      for (let j = 0; j < 16; j += 4) {\n        const s0 = state[j + 0];\n        const s1 = state[j + 1];\n        const s2 = state[j + 2];\n        const s3 = state[j + 3];\n        t = s0 ^ s1 ^ s2 ^ s3;\n        state[j + 0] ^= t ^ this._mixCol[s0 ^ s1];\n        state[j + 1] ^= t ^ this._mixCol[s1 ^ s2];\n        state[j + 2] ^= t ^ this._mixCol[s2 ^ s3];\n        state[j + 3] ^= t ^ this._mixCol[s3 ^ s0];\n      }\n\n      for (let j = 0, k = i * 16; j < 16; ++j, ++k) {\n        state[j] ^= key[k];\n      }\n    }\n\n    for (let j = 0; j < 16; ++j) {\n      state[j] = s[state[j]];\n    }\n\n    v = state[1];\n    state[1] = state[5];\n    state[5] = state[9];\n    state[9] = state[13];\n    state[13] = v;\n    v = state[2];\n    u = state[6];\n    state[2] = state[10];\n    state[6] = state[14];\n    state[10] = v;\n    state[14] = u;\n    v = state[3];\n    u = state[7];\n    t = state[11];\n    state[3] = state[15];\n    state[7] = v;\n    state[11] = u;\n    state[15] = t;\n\n    for (let j = 0, k = this._keySize; j < 16; ++j, ++k) {\n      state[j] ^= key[k];\n    }\n\n    return state;\n  }\n\n  _decryptBlock2(data, finalize) {\n    const sourceLength = data.length;\n    let buffer = this.buffer,\n        bufferLength = this.bufferPosition;\n    const result = [];\n    let iv = this.iv;\n\n    for (let i = 0; i < sourceLength; ++i) {\n      buffer[bufferLength] = data[i];\n      ++bufferLength;\n\n      if (bufferLength < 16) {\n        continue;\n      }\n\n      const plain = this._decrypt(buffer, this._key);\n\n      for (let j = 0; j < 16; ++j) {\n        plain[j] ^= iv[j];\n      }\n\n      iv = buffer;\n      result.push(plain);\n      buffer = new Uint8Array(16);\n      bufferLength = 0;\n    }\n\n    this.buffer = buffer;\n    this.bufferLength = bufferLength;\n    this.iv = iv;\n\n    if (result.length === 0) {\n      return new Uint8Array(0);\n    }\n\n    let outputLength = 16 * result.length;\n\n    if (finalize) {\n      const lastBlock = result[result.length - 1];\n      let psLen = lastBlock[15];\n\n      if (psLen <= 16) {\n        for (let i = 15, ii = 16 - psLen; i >= ii; --i) {\n          if (lastBlock[i] !== psLen) {\n            psLen = 0;\n            break;\n          }\n        }\n\n        outputLength -= psLen;\n        result[result.length - 1] = lastBlock.subarray(0, 16 - psLen);\n      }\n    }\n\n    const output = new Uint8Array(outputLength);\n\n    for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {\n      output.set(result[i], j);\n    }\n\n    return output;\n  }\n\n  decryptBlock(data, finalize, iv = null) {\n    const sourceLength = data.length;\n    const buffer = this.buffer;\n    let bufferLength = this.bufferPosition;\n\n    if (iv) {\n      this.iv = iv;\n    } else {\n      for (let i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) {\n        buffer[bufferLength] = data[i];\n      }\n\n      if (bufferLength < 16) {\n        this.bufferLength = bufferLength;\n        return new Uint8Array(0);\n      }\n\n      this.iv = buffer;\n      data = data.subarray(16);\n    }\n\n    this.buffer = new Uint8Array(16);\n    this.bufferLength = 0;\n    this.decryptBlock = this._decryptBlock2;\n    return this.decryptBlock(data, finalize);\n  }\n\n  encrypt(data, iv) {\n    const sourceLength = data.length;\n    let buffer = this.buffer,\n        bufferLength = this.bufferPosition;\n    const result = [];\n\n    if (!iv) {\n      iv = new Uint8Array(16);\n    }\n\n    for (let i = 0; i < sourceLength; ++i) {\n      buffer[bufferLength] = data[i];\n      ++bufferLength;\n\n      if (bufferLength < 16) {\n        continue;\n      }\n\n      for (let j = 0; j < 16; ++j) {\n        buffer[j] ^= iv[j];\n      }\n\n      const cipher = this._encrypt(buffer, this._key);\n\n      iv = cipher;\n      result.push(cipher);\n      buffer = new Uint8Array(16);\n      bufferLength = 0;\n    }\n\n    this.buffer = buffer;\n    this.bufferLength = bufferLength;\n    this.iv = iv;\n\n    if (result.length === 0) {\n      return new Uint8Array(0);\n    }\n\n    const outputLength = 16 * result.length;\n    const output = new Uint8Array(outputLength);\n\n    for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {\n      output.set(result[i], j);\n    }\n\n    return output;\n  }\n\n}\n\nclass AES128Cipher extends AESBaseCipher {\n  constructor(key) {\n    super();\n    this._cyclesOfRepetition = 10;\n    this._keySize = 160;\n    this._rcon = new Uint8Array([0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d]);\n    this._key = this._expandKey(key);\n  }\n\n  _expandKey(cipherKey) {\n    const b = 176;\n    const s = this._s;\n    const rcon = this._rcon;\n    const result = new Uint8Array(b);\n    result.set(cipherKey);\n\n    for (let j = 16, i = 1; j < b; ++i) {\n      let t1 = result[j - 3];\n      let t2 = result[j - 2];\n      let t3 = result[j - 1];\n      let t4 = result[j - 4];\n      t1 = s[t1];\n      t2 = s[t2];\n      t3 = s[t3];\n      t4 = s[t4];\n      t1 = t1 ^ rcon[i];\n\n      for (let n = 0; n < 4; ++n) {\n        result[j] = t1 ^= result[j - 16];\n        j++;\n        result[j] = t2 ^= result[j - 16];\n        j++;\n        result[j] = t3 ^= result[j - 16];\n        j++;\n        result[j] = t4 ^= result[j - 16];\n        j++;\n      }\n    }\n\n    return result;\n  }\n\n}\n\nexports.AES128Cipher = AES128Cipher;\n\nclass AES256Cipher extends AESBaseCipher {\n  constructor(key) {\n    super();\n    this._cyclesOfRepetition = 14;\n    this._keySize = 224;\n    this._key = this._expandKey(key);\n  }\n\n  _expandKey(cipherKey) {\n    const b = 240;\n    const s = this._s;\n    const result = new Uint8Array(b);\n    result.set(cipherKey);\n    let r = 1;\n    let t1, t2, t3, t4;\n\n    for (let j = 32, i = 1; j < b; ++i) {\n      if (j % 32 === 16) {\n        t1 = s[t1];\n        t2 = s[t2];\n        t3 = s[t3];\n        t4 = s[t4];\n      } else if (j % 32 === 0) {\n        t1 = result[j - 3];\n        t2 = result[j - 2];\n        t3 = result[j - 1];\n        t4 = result[j - 4];\n        t1 = s[t1];\n        t2 = s[t2];\n        t3 = s[t3];\n        t4 = s[t4];\n        t1 = t1 ^ r;\n\n        if ((r <<= 1) >= 256) {\n          r = (r ^ 0x1b) & 0xff;\n        }\n      }\n\n      for (let n = 0; n < 4; ++n) {\n        result[j] = t1 ^= result[j - 32];\n        j++;\n        result[j] = t2 ^= result[j - 32];\n        j++;\n        result[j] = t3 ^= result[j - 32];\n        j++;\n        result[j] = t4 ^= result[j - 32];\n        j++;\n      }\n    }\n\n    return result;\n  }\n\n}\n\nexports.AES256Cipher = AES256Cipher;\n\nclass PDF17 {\n  checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) {\n    var hashData = new Uint8Array(password.length + 56);\n    hashData.set(password, 0);\n    hashData.set(ownerValidationSalt, password.length);\n    hashData.set(userBytes, password.length + ownerValidationSalt.length);\n    var result = calculateSHA256(hashData, 0, hashData.length);\n    return (0, _util.isArrayEqual)(result, ownerPassword);\n  }\n\n  checkUserPassword(password, userValidationSalt, userPassword) {\n    var hashData = new Uint8Array(password.length + 8);\n    hashData.set(password, 0);\n    hashData.set(userValidationSalt, password.length);\n    var result = calculateSHA256(hashData, 0, hashData.length);\n    return (0, _util.isArrayEqual)(result, userPassword);\n  }\n\n  getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) {\n    var hashData = new Uint8Array(password.length + 56);\n    hashData.set(password, 0);\n    hashData.set(ownerKeySalt, password.length);\n    hashData.set(userBytes, password.length + ownerKeySalt.length);\n    var key = calculateSHA256(hashData, 0, hashData.length);\n    var cipher = new AES256Cipher(key);\n    return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16));\n  }\n\n  getUserKey(password, userKeySalt, userEncryption) {\n    var hashData = new Uint8Array(password.length + 8);\n    hashData.set(password, 0);\n    hashData.set(userKeySalt, password.length);\n    var key = calculateSHA256(hashData, 0, hashData.length);\n    var cipher = new AES256Cipher(key);\n    return cipher.decryptBlock(userEncryption, false, new Uint8Array(16));\n  }\n\n}\n\nexports.PDF17 = PDF17;\n\nvar PDF20 = function PDF20Closure() {\n  function calculatePDF20Hash(password, input, userBytes) {\n    var k = calculateSHA256(input, 0, input.length).subarray(0, 32);\n    var e = [0];\n    var i = 0;\n\n    while (i < 64 || e[e.length - 1] > i - 32) {\n      const combinedLength = password.length + k.length + userBytes.length,\n            combinedArray = new Uint8Array(combinedLength);\n      let writeOffset = 0;\n      combinedArray.set(password, writeOffset);\n      writeOffset += password.length;\n      combinedArray.set(k, writeOffset);\n      writeOffset += k.length;\n      combinedArray.set(userBytes, writeOffset);\n      var k1 = new Uint8Array(combinedLength * 64);\n\n      for (var j = 0, pos = 0; j < 64; j++, pos += combinedLength) {\n        k1.set(combinedArray, pos);\n      }\n\n      var cipher = new AES128Cipher(k.subarray(0, 16));\n      e = cipher.encrypt(k1, k.subarray(16, 32));\n      var remainder = 0;\n\n      for (var z = 0; z < 16; z++) {\n        remainder *= 256 % 3;\n        remainder %= 3;\n        remainder += (e[z] >>> 0) % 3;\n        remainder %= 3;\n      }\n\n      if (remainder === 0) {\n        k = calculateSHA256(e, 0, e.length);\n      } else if (remainder === 1) {\n        k = calculateSHA384(e, 0, e.length);\n      } else if (remainder === 2) {\n        k = calculateSHA512(e, 0, e.length);\n      }\n\n      i++;\n    }\n\n    return k.subarray(0, 32);\n  }\n\n  class PDF20 {\n    hash(password, concatBytes, userBytes) {\n      return calculatePDF20Hash(password, concatBytes, userBytes);\n    }\n\n    checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) {\n      var hashData = new Uint8Array(password.length + 56);\n      hashData.set(password, 0);\n      hashData.set(ownerValidationSalt, password.length);\n      hashData.set(userBytes, password.length + ownerValidationSalt.length);\n      var result = calculatePDF20Hash(password, hashData, userBytes);\n      return (0, _util.isArrayEqual)(result, ownerPassword);\n    }\n\n    checkUserPassword(password, userValidationSalt, userPassword) {\n      var hashData = new Uint8Array(password.length + 8);\n      hashData.set(password, 0);\n      hashData.set(userValidationSalt, password.length);\n      var result = calculatePDF20Hash(password, hashData, []);\n      return (0, _util.isArrayEqual)(result, userPassword);\n    }\n\n    getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) {\n      var hashData = new Uint8Array(password.length + 56);\n      hashData.set(password, 0);\n      hashData.set(ownerKeySalt, password.length);\n      hashData.set(userBytes, password.length + ownerKeySalt.length);\n      var key = calculatePDF20Hash(password, hashData, userBytes);\n      var cipher = new AES256Cipher(key);\n      return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16));\n    }\n\n    getUserKey(password, userKeySalt, userEncryption) {\n      var hashData = new Uint8Array(password.length + 8);\n      hashData.set(password, 0);\n      hashData.set(userKeySalt, password.length);\n      var key = calculatePDF20Hash(password, hashData, []);\n      var cipher = new AES256Cipher(key);\n      return cipher.decryptBlock(userEncryption, false, new Uint8Array(16));\n    }\n\n  }\n\n  return PDF20;\n}();\n\nexports.PDF20 = PDF20;\n\nclass CipherTransform {\n  constructor(stringCipherConstructor, streamCipherConstructor) {\n    this.StringCipherConstructor = stringCipherConstructor;\n    this.StreamCipherConstructor = streamCipherConstructor;\n  }\n\n  createStream(stream, length) {\n    var cipher = new this.StreamCipherConstructor();\n    return new _stream.DecryptStream(stream, length, function cipherTransformDecryptStream(data, finalize) {\n      return cipher.decryptBlock(data, finalize);\n    });\n  }\n\n  decryptString(s) {\n    var cipher = new this.StringCipherConstructor();\n    var data = (0, _util.stringToBytes)(s);\n    data = cipher.decryptBlock(data, true);\n    return (0, _util.bytesToString)(data);\n  }\n\n  encryptString(s) {\n    const cipher = new this.StringCipherConstructor();\n\n    if (cipher instanceof AESBaseCipher) {\n      const strLen = s.length;\n      const pad = 16 - strLen % 16;\n\n      if (pad !== 16) {\n        s = s.padEnd(16 * Math.ceil(strLen / 16), String.fromCharCode(pad));\n      }\n\n      const iv = new Uint8Array(16);\n\n      if (typeof crypto !== \"undefined\") {\n        crypto.getRandomValues(iv);\n      } else {\n        for (let i = 0; i < 16; i++) {\n          iv[i] = Math.floor(256 * Math.random());\n        }\n      }\n\n      let data = (0, _util.stringToBytes)(s);\n      data = cipher.encrypt(data, iv);\n      const buf = new Uint8Array(16 + data.length);\n      buf.set(iv);\n      buf.set(data, 16);\n      return (0, _util.bytesToString)(buf);\n    }\n\n    let data = (0, _util.stringToBytes)(s);\n    data = cipher.encrypt(data);\n    return (0, _util.bytesToString)(data);\n  }\n\n}\n\nvar CipherTransformFactory = function CipherTransformFactoryClosure() {\n  var defaultPasswordBytes = new Uint8Array([0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41, 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08, 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80, 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]);\n\n  function createEncryptionKey20(revision, password, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms) {\n    if (password) {\n      var passwordLength = Math.min(127, password.length);\n      password = password.subarray(0, passwordLength);\n    } else {\n      password = [];\n    }\n\n    var pdfAlgorithm;\n\n    if (revision === 6) {\n      pdfAlgorithm = new PDF20();\n    } else {\n      pdfAlgorithm = new PDF17();\n    }\n\n    if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, userPassword)) {\n      return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption);\n    } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt, uBytes, ownerPassword)) {\n      return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, ownerEncryption);\n    }\n\n    return null;\n  }\n\n  function prepareKeyData(fileId, password, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata) {\n    var hashDataSize = 40 + ownerPassword.length + fileId.length;\n    var hashData = new Uint8Array(hashDataSize),\n        i = 0,\n        j,\n        n;\n\n    if (password) {\n      n = Math.min(32, password.length);\n\n      for (; i < n; ++i) {\n        hashData[i] = password[i];\n      }\n    }\n\n    j = 0;\n\n    while (i < 32) {\n      hashData[i++] = defaultPasswordBytes[j++];\n    }\n\n    for (j = 0, n = ownerPassword.length; j < n; ++j) {\n      hashData[i++] = ownerPassword[j];\n    }\n\n    hashData[i++] = flags & 0xff;\n    hashData[i++] = flags >> 8 & 0xff;\n    hashData[i++] = flags >> 16 & 0xff;\n    hashData[i++] = flags >>> 24 & 0xff;\n\n    for (j = 0, n = fileId.length; j < n; ++j) {\n      hashData[i++] = fileId[j];\n    }\n\n    if (revision >= 4 && !encryptMetadata) {\n      hashData[i++] = 0xff;\n      hashData[i++] = 0xff;\n      hashData[i++] = 0xff;\n      hashData[i++] = 0xff;\n    }\n\n    var hash = calculateMD5(hashData, 0, i);\n    var keyLengthInBytes = keyLength >> 3;\n\n    if (revision >= 3) {\n      for (j = 0; j < 50; ++j) {\n        hash = calculateMD5(hash, 0, keyLengthInBytes);\n      }\n    }\n\n    var encryptionKey = hash.subarray(0, keyLengthInBytes);\n    var cipher, checkData;\n\n    if (revision >= 3) {\n      for (i = 0; i < 32; ++i) {\n        hashData[i] = defaultPasswordBytes[i];\n      }\n\n      for (j = 0, n = fileId.length; j < n; ++j) {\n        hashData[i++] = fileId[j];\n      }\n\n      cipher = new ARCFourCipher(encryptionKey);\n      checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));\n      n = encryptionKey.length;\n      var derivedKey = new Uint8Array(n),\n          k;\n\n      for (j = 1; j <= 19; ++j) {\n        for (k = 0; k < n; ++k) {\n          derivedKey[k] = encryptionKey[k] ^ j;\n        }\n\n        cipher = new ARCFourCipher(derivedKey);\n        checkData = cipher.encryptBlock(checkData);\n      }\n\n      for (j = 0, n = checkData.length; j < n; ++j) {\n        if (userPassword[j] !== checkData[j]) {\n          return null;\n        }\n      }\n    } else {\n      cipher = new ARCFourCipher(encryptionKey);\n      checkData = cipher.encryptBlock(defaultPasswordBytes);\n\n      for (j = 0, n = checkData.length; j < n; ++j) {\n        if (userPassword[j] !== checkData[j]) {\n          return null;\n        }\n      }\n    }\n\n    return encryptionKey;\n  }\n\n  function decodeUserPassword(password, ownerPassword, revision, keyLength) {\n    var hashData = new Uint8Array(32),\n        i = 0,\n        j,\n        n;\n    n = Math.min(32, password.length);\n\n    for (; i < n; ++i) {\n      hashData[i] = password[i];\n    }\n\n    j = 0;\n\n    while (i < 32) {\n      hashData[i++] = defaultPasswordBytes[j++];\n    }\n\n    var hash = calculateMD5(hashData, 0, i);\n    var keyLengthInBytes = keyLength >> 3;\n\n    if (revision >= 3) {\n      for (j = 0; j < 50; ++j) {\n        hash = calculateMD5(hash, 0, hash.length);\n      }\n    }\n\n    var cipher, userPassword;\n\n    if (revision >= 3) {\n      userPassword = ownerPassword;\n      var derivedKey = new Uint8Array(keyLengthInBytes),\n          k;\n\n      for (j = 19; j >= 0; j--) {\n        for (k = 0; k < keyLengthInBytes; ++k) {\n          derivedKey[k] = hash[k] ^ j;\n        }\n\n        cipher = new ARCFourCipher(derivedKey);\n        userPassword = cipher.encryptBlock(userPassword);\n      }\n    } else {\n      cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes));\n      userPassword = cipher.encryptBlock(ownerPassword);\n    }\n\n    return userPassword;\n  }\n\n  var identityName = _primitives.Name.get(\"Identity\");\n\n  function buildObjectKey(num, gen, encryptionKey, isAes = false) {\n    var key = new Uint8Array(encryptionKey.length + 9),\n        i,\n        n;\n\n    for (i = 0, n = encryptionKey.length; i < n; ++i) {\n      key[i] = encryptionKey[i];\n    }\n\n    key[i++] = num & 0xff;\n    key[i++] = num >> 8 & 0xff;\n    key[i++] = num >> 16 & 0xff;\n    key[i++] = gen & 0xff;\n    key[i++] = gen >> 8 & 0xff;\n\n    if (isAes) {\n      key[i++] = 0x73;\n      key[i++] = 0x41;\n      key[i++] = 0x6c;\n      key[i++] = 0x54;\n    }\n\n    var hash = calculateMD5(key, 0, i);\n    return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));\n  }\n\n  function buildCipherConstructor(cf, name, num, gen, key) {\n    if (!(0, _primitives.isName)(name)) {\n      throw new _util.FormatError(\"Invalid crypt filter name.\");\n    }\n\n    var cryptFilter = cf.get(name.name);\n    var cfm;\n\n    if (cryptFilter !== null && cryptFilter !== undefined) {\n      cfm = cryptFilter.get(\"CFM\");\n    }\n\n    if (!cfm || cfm.name === \"None\") {\n      return function cipherTransformFactoryBuildCipherConstructorNone() {\n        return new NullCipher();\n      };\n    }\n\n    if (cfm.name === \"V2\") {\n      return function cipherTransformFactoryBuildCipherConstructorV2() {\n        return new ARCFourCipher(buildObjectKey(num, gen, key, false));\n      };\n    }\n\n    if (cfm.name === \"AESV2\") {\n      return function cipherTransformFactoryBuildCipherConstructorAESV2() {\n        return new AES128Cipher(buildObjectKey(num, gen, key, true));\n      };\n    }\n\n    if (cfm.name === \"AESV3\") {\n      return function cipherTransformFactoryBuildCipherConstructorAESV3() {\n        return new AES256Cipher(key);\n      };\n    }\n\n    throw new _util.FormatError(\"Unknown crypto method\");\n  }\n\n  class CipherTransformFactory {\n    constructor(dict, fileId, password) {\n      var filter = dict.get(\"Filter\");\n\n      if (!(0, _primitives.isName)(filter, \"Standard\")) {\n        throw new _util.FormatError(\"unknown encryption method\");\n      }\n\n      this.dict = dict;\n      var algorithm = dict.get(\"V\");\n\n      if (!Number.isInteger(algorithm) || algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm !== 5) {\n        throw new _util.FormatError(\"unsupported encryption algorithm\");\n      }\n\n      this.algorithm = algorithm;\n      var keyLength = dict.get(\"Length\");\n\n      if (!keyLength) {\n        if (algorithm <= 3) {\n          keyLength = 40;\n        } else {\n          var cfDict = dict.get(\"CF\");\n          var streamCryptoName = dict.get(\"StmF\");\n\n          if ((0, _primitives.isDict)(cfDict) && (0, _primitives.isName)(streamCryptoName)) {\n            cfDict.suppressEncryption = true;\n            var handlerDict = cfDict.get(streamCryptoName.name);\n            keyLength = handlerDict && handlerDict.get(\"Length\") || 128;\n\n            if (keyLength < 40) {\n              keyLength <<= 3;\n            }\n          }\n        }\n      }\n\n      if (!Number.isInteger(keyLength) || keyLength < 40 || keyLength % 8 !== 0) {\n        throw new _util.FormatError(\"invalid key length\");\n      }\n\n      var ownerPassword = (0, _util.stringToBytes)(dict.get(\"O\")).subarray(0, 32);\n      var userPassword = (0, _util.stringToBytes)(dict.get(\"U\")).subarray(0, 32);\n      var flags = dict.get(\"P\");\n      var revision = dict.get(\"R\");\n      var encryptMetadata = (algorithm === 4 || algorithm === 5) && dict.get(\"EncryptMetadata\") !== false;\n      this.encryptMetadata = encryptMetadata;\n      var fileIdBytes = (0, _util.stringToBytes)(fileId);\n      var passwordBytes;\n\n      if (password) {\n        if (revision === 6) {\n          try {\n            password = (0, _util.utf8StringToString)(password);\n          } catch (ex) {\n            (0, _util.warn)(\"CipherTransformFactory: \" + \"Unable to convert UTF8 encoded password.\");\n          }\n        }\n\n        passwordBytes = (0, _util.stringToBytes)(password);\n      }\n\n      var encryptionKey;\n\n      if (algorithm !== 5) {\n        encryptionKey = prepareKeyData(fileIdBytes, passwordBytes, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata);\n      } else {\n        var ownerValidationSalt = (0, _util.stringToBytes)(dict.get(\"O\")).subarray(32, 40);\n        var ownerKeySalt = (0, _util.stringToBytes)(dict.get(\"O\")).subarray(40, 48);\n        var uBytes = (0, _util.stringToBytes)(dict.get(\"U\")).subarray(0, 48);\n        var userValidationSalt = (0, _util.stringToBytes)(dict.get(\"U\")).subarray(32, 40);\n        var userKeySalt = (0, _util.stringToBytes)(dict.get(\"U\")).subarray(40, 48);\n        var ownerEncryption = (0, _util.stringToBytes)(dict.get(\"OE\"));\n        var userEncryption = (0, _util.stringToBytes)(dict.get(\"UE\"));\n        var perms = (0, _util.stringToBytes)(dict.get(\"Perms\"));\n        encryptionKey = createEncryptionKey20(revision, passwordBytes, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms);\n      }\n\n      if (!encryptionKey && !password) {\n        throw new _util.PasswordException(\"No password given\", _util.PasswordResponses.NEED_PASSWORD);\n      } else if (!encryptionKey && password) {\n        var decodedPassword = decodeUserPassword(passwordBytes, ownerPassword, revision, keyLength);\n        encryptionKey = prepareKeyData(fileIdBytes, decodedPassword, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata);\n      }\n\n      if (!encryptionKey) {\n        throw new _util.PasswordException(\"Incorrect Password\", _util.PasswordResponses.INCORRECT_PASSWORD);\n      }\n\n      this.encryptionKey = encryptionKey;\n\n      if (algorithm >= 4) {\n        var cf = dict.get(\"CF\");\n\n        if ((0, _primitives.isDict)(cf)) {\n          cf.suppressEncryption = true;\n        }\n\n        this.cf = cf;\n        this.stmf = dict.get(\"StmF\") || identityName;\n        this.strf = dict.get(\"StrF\") || identityName;\n        this.eff = dict.get(\"EFF\") || this.stmf;\n      }\n    }\n\n    createCipherTransform(num, gen) {\n      if (this.algorithm === 4 || this.algorithm === 5) {\n        return new CipherTransform(buildCipherConstructor(this.cf, this.stmf, num, gen, this.encryptionKey), buildCipherConstructor(this.cf, this.strf, num, gen, this.encryptionKey));\n      }\n\n      var key = buildObjectKey(num, gen, this.encryptionKey, false);\n\n      var cipherConstructor = function buildCipherCipherConstructor() {\n        return new ARCFourCipher(key);\n      };\n\n      return new CipherTransform(cipherConstructor, cipherConstructor);\n    }\n\n  }\n\n  return CipherTransformFactory;\n}();\n\nexports.CipherTransformFactory = CipherTransformFactory;\n\n/***/ }),\n/* 23 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.ColorSpace = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _primitives = __w_pdfjs_require__(5);\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nfunction resizeRgbImage(src, dest, w1, h1, w2, h2, alpha01) {\n  const COMPONENTS = 3;\n  alpha01 = alpha01 !== 1 ? 0 : alpha01;\n  const xRatio = w1 / w2;\n  const yRatio = h1 / h2;\n  let newIndex = 0,\n      oldIndex;\n  const xScaled = new Uint16Array(w2);\n  const w1Scanline = w1 * COMPONENTS;\n\n  for (let i = 0; i < w2; i++) {\n    xScaled[i] = Math.floor(i * xRatio) * COMPONENTS;\n  }\n\n  for (let i = 0; i < h2; i++) {\n    const py = Math.floor(i * yRatio) * w1Scanline;\n\n    for (let j = 0; j < w2; j++) {\n      oldIndex = py + xScaled[j];\n      dest[newIndex++] = src[oldIndex++];\n      dest[newIndex++] = src[oldIndex++];\n      dest[newIndex++] = src[oldIndex++];\n      newIndex += alpha01;\n    }\n  }\n}\n\nclass ColorSpace {\n  constructor(name, numComps) {\n    if (this.constructor === ColorSpace) {\n      (0, _util.unreachable)(\"Cannot initialize ColorSpace.\");\n    }\n\n    this.name = name;\n    this.numComps = numComps;\n  }\n\n  getRgb(src, srcOffset) {\n    const rgb = new Uint8ClampedArray(3);\n    this.getRgbItem(src, srcOffset, rgb, 0);\n    return rgb;\n  }\n\n  getRgbItem(src, srcOffset, dest, destOffset) {\n    (0, _util.unreachable)(\"Should not call ColorSpace.getRgbItem\");\n  }\n\n  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n    (0, _util.unreachable)(\"Should not call ColorSpace.getRgbBuffer\");\n  }\n\n  getOutputLength(inputLength, alpha01) {\n    (0, _util.unreachable)(\"Should not call ColorSpace.getOutputLength\");\n  }\n\n  isPassthrough(bits) {\n    return false;\n  }\n\n  isDefaultDecode(decodeMap, bpc) {\n    return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n  }\n\n  fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) {\n    const count = originalWidth * originalHeight;\n    let rgbBuf = null;\n    const numComponentColors = 1 << bpc;\n    const needsResizing = originalHeight !== height || originalWidth !== width;\n\n    if (this.isPassthrough(bpc)) {\n      rgbBuf = comps;\n    } else if (this.numComps === 1 && count > numComponentColors && this.name !== \"DeviceGray\" && this.name !== \"DeviceRGB\") {\n      const allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : new Uint16Array(numComponentColors);\n\n      for (let i = 0; i < numComponentColors; i++) {\n        allColors[i] = i;\n      }\n\n      const colorMap = new Uint8ClampedArray(numComponentColors * 3);\n      this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, 0);\n\n      if (!needsResizing) {\n        let destPos = 0;\n\n        for (let i = 0; i < count; ++i) {\n          const key = comps[i] * 3;\n          dest[destPos++] = colorMap[key];\n          dest[destPos++] = colorMap[key + 1];\n          dest[destPos++] = colorMap[key + 2];\n          destPos += alpha01;\n        }\n      } else {\n        rgbBuf = new Uint8Array(count * 3);\n        let rgbPos = 0;\n\n        for (let i = 0; i < count; ++i) {\n          const key = comps[i] * 3;\n          rgbBuf[rgbPos++] = colorMap[key];\n          rgbBuf[rgbPos++] = colorMap[key + 1];\n          rgbBuf[rgbPos++] = colorMap[key + 2];\n        }\n      }\n    } else {\n      if (!needsResizing) {\n        this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, alpha01);\n      } else {\n        rgbBuf = new Uint8ClampedArray(count * 3);\n        this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, 0);\n      }\n    }\n\n    if (rgbBuf) {\n      if (needsResizing) {\n        resizeRgbImage(rgbBuf, dest, originalWidth, originalHeight, width, height, alpha01);\n      } else {\n        let destPos = 0,\n            rgbPos = 0;\n\n        for (let i = 0, ii = width * actualHeight; i < ii; i++) {\n          dest[destPos++] = rgbBuf[rgbPos++];\n          dest[destPos++] = rgbBuf[rgbPos++];\n          dest[destPos++] = rgbBuf[rgbPos++];\n          destPos += alpha01;\n        }\n      }\n    }\n  }\n\n  get usesZeroToOneRange() {\n    return (0, _util.shadow)(this, \"usesZeroToOneRange\", true);\n  }\n\n  static _cache(cacheKey, xref, localColorSpaceCache, parsedColorSpace) {\n    if (!localColorSpaceCache) {\n      throw new Error('ColorSpace._cache - expected \"localColorSpaceCache\" argument.');\n    }\n\n    if (!parsedColorSpace) {\n      throw new Error('ColorSpace._cache - expected \"parsedColorSpace\" argument.');\n    }\n\n    let csName, csRef;\n\n    if (cacheKey instanceof _primitives.Ref) {\n      csRef = cacheKey;\n      cacheKey = xref.fetch(cacheKey);\n    }\n\n    if (cacheKey instanceof _primitives.Name) {\n      csName = cacheKey.name;\n    }\n\n    if (csName || csRef) {\n      localColorSpaceCache.set(csName, csRef, parsedColorSpace);\n    }\n  }\n\n  static getCached(cacheKey, xref, localColorSpaceCache) {\n    if (!localColorSpaceCache) {\n      throw new Error('ColorSpace.getCached - expected \"localColorSpaceCache\" argument.');\n    }\n\n    if (cacheKey instanceof _primitives.Ref) {\n      const localColorSpace = localColorSpaceCache.getByRef(cacheKey);\n\n      if (localColorSpace) {\n        return localColorSpace;\n      }\n\n      try {\n        cacheKey = xref.fetch(cacheKey);\n      } catch (ex) {\n        if (ex instanceof _core_utils.MissingDataException) {\n          throw ex;\n        }\n      }\n    }\n\n    if (cacheKey instanceof _primitives.Name) {\n      const localColorSpace = localColorSpaceCache.getByName(cacheKey.name);\n\n      if (localColorSpace) {\n        return localColorSpace;\n      }\n    }\n\n    return null;\n  }\n\n  static async parseAsync({\n    cs,\n    xref,\n    resources = null,\n    pdfFunctionFactory,\n    localColorSpaceCache\n  }) {\n    const parsedColorSpace = this._parse(cs, xref, resources, pdfFunctionFactory);\n\n    this._cache(cs, xref, localColorSpaceCache, parsedColorSpace);\n\n    return parsedColorSpace;\n  }\n\n  static parse({\n    cs,\n    xref,\n    resources = null,\n    pdfFunctionFactory,\n    localColorSpaceCache\n  }) {\n    const cachedColorSpace = this.getCached(cs, xref, localColorSpaceCache);\n\n    if (cachedColorSpace) {\n      return cachedColorSpace;\n    }\n\n    const parsedColorSpace = this._parse(cs, xref, resources, pdfFunctionFactory);\n\n    this._cache(cs, xref, localColorSpaceCache, parsedColorSpace);\n\n    return parsedColorSpace;\n  }\n\n  static _parse(cs, xref, resources = null, pdfFunctionFactory) {\n    cs = xref.fetchIfRef(cs);\n\n    if ((0, _primitives.isName)(cs)) {\n      switch (cs.name) {\n        case \"DeviceGray\":\n        case \"G\":\n          return this.singletons.gray;\n\n        case \"DeviceRGB\":\n        case \"RGB\":\n          return this.singletons.rgb;\n\n        case \"DeviceCMYK\":\n        case \"CMYK\":\n          return this.singletons.cmyk;\n\n        case \"Pattern\":\n          return new PatternCS(null);\n\n        default:\n          if ((0, _primitives.isDict)(resources)) {\n            const colorSpaces = resources.get(\"ColorSpace\");\n\n            if ((0, _primitives.isDict)(colorSpaces)) {\n              const resourcesCS = colorSpaces.get(cs.name);\n\n              if (resourcesCS) {\n                if ((0, _primitives.isName)(resourcesCS)) {\n                  return this._parse(resourcesCS, xref, resources, pdfFunctionFactory);\n                }\n\n                cs = resourcesCS;\n                break;\n              }\n            }\n          }\n\n          throw new _util.FormatError(`Unrecognized ColorSpace: ${cs.name}`);\n      }\n    }\n\n    if (Array.isArray(cs)) {\n      const mode = xref.fetchIfRef(cs[0]).name;\n      let params, numComps, baseCS, whitePoint, blackPoint, gamma;\n\n      switch (mode) {\n        case \"DeviceGray\":\n        case \"G\":\n          return this.singletons.gray;\n\n        case \"DeviceRGB\":\n        case \"RGB\":\n          return this.singletons.rgb;\n\n        case \"DeviceCMYK\":\n        case \"CMYK\":\n          return this.singletons.cmyk;\n\n        case \"CalGray\":\n          params = xref.fetchIfRef(cs[1]);\n          whitePoint = params.getArray(\"WhitePoint\");\n          blackPoint = params.getArray(\"BlackPoint\");\n          gamma = params.get(\"Gamma\");\n          return new CalGrayCS(whitePoint, blackPoint, gamma);\n\n        case \"CalRGB\":\n          params = xref.fetchIfRef(cs[1]);\n          whitePoint = params.getArray(\"WhitePoint\");\n          blackPoint = params.getArray(\"BlackPoint\");\n          gamma = params.getArray(\"Gamma\");\n          const matrix = params.getArray(\"Matrix\");\n          return new CalRGBCS(whitePoint, blackPoint, gamma, matrix);\n\n        case \"ICCBased\":\n          const stream = xref.fetchIfRef(cs[1]);\n          const dict = stream.dict;\n          numComps = dict.get(\"N\");\n          const alt = dict.get(\"Alternate\");\n\n          if (alt) {\n            const altCS = this._parse(alt, xref, resources, pdfFunctionFactory);\n\n            if (altCS.numComps === numComps) {\n              return altCS;\n            }\n\n            (0, _util.warn)(\"ICCBased color space: Ignoring incorrect /Alternate entry.\");\n          }\n\n          if (numComps === 1) {\n            return this.singletons.gray;\n          } else if (numComps === 3) {\n            return this.singletons.rgb;\n          } else if (numComps === 4) {\n            return this.singletons.cmyk;\n          }\n\n          break;\n\n        case \"Pattern\":\n          baseCS = cs[1] || null;\n\n          if (baseCS) {\n            baseCS = this._parse(baseCS, xref, resources, pdfFunctionFactory);\n          }\n\n          return new PatternCS(baseCS);\n\n        case \"Indexed\":\n        case \"I\":\n          baseCS = this._parse(cs[1], xref, resources, pdfFunctionFactory);\n          const hiVal = xref.fetchIfRef(cs[2]) + 1;\n          const lookup = xref.fetchIfRef(cs[3]);\n          return new IndexedCS(baseCS, hiVal, lookup);\n\n        case \"Separation\":\n        case \"DeviceN\":\n          const name = xref.fetchIfRef(cs[1]);\n          numComps = Array.isArray(name) ? name.length : 1;\n          baseCS = this._parse(cs[2], xref, resources, pdfFunctionFactory);\n          const tintFn = pdfFunctionFactory.create(cs[3]);\n          return new AlternateCS(numComps, baseCS, tintFn);\n\n        case \"Lab\":\n          params = xref.fetchIfRef(cs[1]);\n          whitePoint = params.getArray(\"WhitePoint\");\n          blackPoint = params.getArray(\"BlackPoint\");\n          const range = params.getArray(\"Range\");\n          return new LabCS(whitePoint, blackPoint, range);\n\n        default:\n          throw new _util.FormatError(`Unimplemented ColorSpace object: ${mode}`);\n      }\n    }\n\n    throw new _util.FormatError(`Unrecognized ColorSpace object: ${cs}`);\n  }\n\n  static isDefaultDecode(decode, numComps) {\n    if (!Array.isArray(decode)) {\n      return true;\n    }\n\n    if (numComps * 2 !== decode.length) {\n      (0, _util.warn)(\"The decode map is not the correct length\");\n      return true;\n    }\n\n    for (let i = 0, ii = decode.length; i < ii; i += 2) {\n      if (decode[i] !== 0 || decode[i + 1] !== 1) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  static get singletons() {\n    return (0, _util.shadow)(this, \"singletons\", {\n      get gray() {\n        return (0, _util.shadow)(this, \"gray\", new DeviceGrayCS());\n      },\n\n      get rgb() {\n        return (0, _util.shadow)(this, \"rgb\", new DeviceRgbCS());\n      },\n\n      get cmyk() {\n        return (0, _util.shadow)(this, \"cmyk\", new DeviceCmykCS());\n      }\n\n    });\n  }\n\n}\n\nexports.ColorSpace = ColorSpace;\n\nclass AlternateCS extends ColorSpace {\n  constructor(numComps, base, tintFn) {\n    super(\"Alternate\", numComps);\n    this.base = base;\n    this.tintFn = tintFn;\n    this.tmpBuf = new Float32Array(base.numComps);\n  }\n\n  getRgbItem(src, srcOffset, dest, destOffset) {\n    const tmpBuf = this.tmpBuf;\n    this.tintFn(src, srcOffset, tmpBuf, 0);\n    this.base.getRgbItem(tmpBuf, 0, dest, destOffset);\n  }\n\n  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n    const tintFn = this.tintFn;\n    const base = this.base;\n    const scale = 1 / ((1 << bits) - 1);\n    const baseNumComps = base.numComps;\n    const usesZeroToOneRange = base.usesZeroToOneRange;\n    const isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) && alpha01 === 0;\n    let pos = isPassthrough ? destOffset : 0;\n    const baseBuf = isPassthrough ? dest : new Uint8ClampedArray(baseNumComps * count);\n    const numComps = this.numComps;\n    const scaled = new Float32Array(numComps);\n    const tinted = new Float32Array(baseNumComps);\n    let i, j;\n\n    for (i = 0; i < count; i++) {\n      for (j = 0; j < numComps; j++) {\n        scaled[j] = src[srcOffset++] * scale;\n      }\n\n      tintFn(scaled, 0, tinted, 0);\n\n      if (usesZeroToOneRange) {\n        for (j = 0; j < baseNumComps; j++) {\n          baseBuf[pos++] = tinted[j] * 255;\n        }\n      } else {\n        base.getRgbItem(tinted, 0, baseBuf, pos);\n        pos += baseNumComps;\n      }\n    }\n\n    if (!isPassthrough) {\n      base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01);\n    }\n  }\n\n  getOutputLength(inputLength, alpha01) {\n    return this.base.getOutputLength(inputLength * this.base.numComps / this.numComps, alpha01);\n  }\n\n}\n\nclass PatternCS extends ColorSpace {\n  constructor(baseCS) {\n    super(\"Pattern\", null);\n    this.base = baseCS;\n  }\n\n  isDefaultDecode(decodeMap, bpc) {\n    (0, _util.unreachable)(\"Should not call PatternCS.isDefaultDecode\");\n  }\n\n}\n\nclass IndexedCS extends ColorSpace {\n  constructor(base, highVal, lookup) {\n    super(\"Indexed\", 1);\n    this.base = base;\n    this.highVal = highVal;\n    const length = base.numComps * highVal;\n    this.lookup = new Uint8Array(length);\n\n    if ((0, _primitives.isStream)(lookup)) {\n      const bytes = lookup.getBytes(length);\n      this.lookup.set(bytes);\n    } else if (typeof lookup === \"string\") {\n      for (let i = 0; i < length; ++i) {\n        this.lookup[i] = lookup.charCodeAt(i) & 0xff;\n      }\n    } else {\n      throw new _util.FormatError(`IndexedCS - unrecognized lookup table: ${lookup}`);\n    }\n  }\n\n  getRgbItem(src, srcOffset, dest, destOffset) {\n    const numComps = this.base.numComps;\n    const start = src[srcOffset] * numComps;\n    this.base.getRgbBuffer(this.lookup, start, 1, dest, destOffset, 8, 0);\n  }\n\n  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n    const base = this.base;\n    const numComps = base.numComps;\n    const outputDelta = base.getOutputLength(numComps, alpha01);\n    const lookup = this.lookup;\n\n    for (let i = 0; i < count; ++i) {\n      const lookupPos = src[srcOffset++] * numComps;\n      base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01);\n      destOffset += outputDelta;\n    }\n  }\n\n  getOutputLength(inputLength, alpha01) {\n    return this.base.getOutputLength(inputLength * this.base.numComps, alpha01);\n  }\n\n  isDefaultDecode(decodeMap, bpc) {\n    if (!Array.isArray(decodeMap)) {\n      return true;\n    }\n\n    if (decodeMap.length !== 2) {\n      (0, _util.warn)(\"Decode map length is not correct\");\n      return true;\n    }\n\n    if (!Number.isInteger(bpc) || bpc < 1) {\n      (0, _util.warn)(\"Bits per component is not correct\");\n      return true;\n    }\n\n    return decodeMap[0] === 0 && decodeMap[1] === (1 << bpc) - 1;\n  }\n\n}\n\nclass DeviceGrayCS extends ColorSpace {\n  constructor() {\n    super(\"DeviceGray\", 1);\n  }\n\n  getRgbItem(src, srcOffset, dest, destOffset) {\n    const c = src[srcOffset] * 255;\n    dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c;\n  }\n\n  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n    const scale = 255 / ((1 << bits) - 1);\n    let j = srcOffset,\n        q = destOffset;\n\n    for (let i = 0; i < count; ++i) {\n      const c = scale * src[j++];\n      dest[q++] = c;\n      dest[q++] = c;\n      dest[q++] = c;\n      q += alpha01;\n    }\n  }\n\n  getOutputLength(inputLength, alpha01) {\n    return inputLength * (3 + alpha01);\n  }\n\n}\n\nclass DeviceRgbCS extends ColorSpace {\n  constructor() {\n    super(\"DeviceRGB\", 3);\n  }\n\n  getRgbItem(src, srcOffset, dest, destOffset) {\n    dest[destOffset] = src[srcOffset] * 255;\n    dest[destOffset + 1] = src[srcOffset + 1] * 255;\n    dest[destOffset + 2] = src[srcOffset + 2] * 255;\n  }\n\n  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n    if (bits === 8 && alpha01 === 0) {\n      dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset);\n      return;\n    }\n\n    const scale = 255 / ((1 << bits) - 1);\n    let j = srcOffset,\n        q = destOffset;\n\n    for (let i = 0; i < count; ++i) {\n      dest[q++] = scale * src[j++];\n      dest[q++] = scale * src[j++];\n      dest[q++] = scale * src[j++];\n      q += alpha01;\n    }\n  }\n\n  getOutputLength(inputLength, alpha01) {\n    return inputLength * (3 + alpha01) / 3 | 0;\n  }\n\n  isPassthrough(bits) {\n    return bits === 8;\n  }\n\n}\n\nconst DeviceCmykCS = function DeviceCmykCSClosure() {\n  function convertToRgb(src, srcOffset, srcScale, dest, destOffset) {\n    const c = src[srcOffset] * srcScale;\n    const m = src[srcOffset + 1] * srcScale;\n    const y = src[srcOffset + 2] * srcScale;\n    const k = src[srcOffset + 3] * srcScale;\n    dest[destOffset] = 255 + c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k + -285.2331026137004) + m * (1.7149763477362134 * m - 5.6096736904047315 * y + -17.873870861415444 * k - 5.497006427196366) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 17.5119270841813) + k * (-21.86122147463605 * k - 189.48180835922747);\n    dest[destOffset + 1] = 255 + c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k + -79.2970844816548) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 190.9453302588951) + y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) + k * (-20.737325471181034 * k - 187.80453709719578);\n    dest[destOffset + 2] = 255 + c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k + -14.183576799673286) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 112.23884253719248) + y * (0.03296041114873217 * y + 115.60384449646641 * k + -193.58209356861505) + k * (-22.33816807309886 * k - 180.12613974708367);\n  }\n\n  class DeviceCmykCS extends ColorSpace {\n    constructor() {\n      super(\"DeviceCMYK\", 4);\n    }\n\n    getRgbItem(src, srcOffset, dest, destOffset) {\n      convertToRgb(src, srcOffset, 1, dest, destOffset);\n    }\n\n    getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      const scale = 1 / ((1 << bits) - 1);\n\n      for (let i = 0; i < count; i++) {\n        convertToRgb(src, srcOffset, scale, dest, destOffset);\n        srcOffset += 4;\n        destOffset += 3 + alpha01;\n      }\n    }\n\n    getOutputLength(inputLength, alpha01) {\n      return inputLength / 4 * (3 + alpha01) | 0;\n    }\n\n  }\n\n  return DeviceCmykCS;\n}();\n\nconst CalGrayCS = function CalGrayCSClosure() {\n  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {\n    const A = src[srcOffset] * scale;\n    const AG = A ** cs.G;\n    const L = cs.YW * AG;\n    const val = Math.max(295.8 * L ** 0.333333333333333333 - 40.8, 0);\n    dest[destOffset] = val;\n    dest[destOffset + 1] = val;\n    dest[destOffset + 2] = val;\n  }\n\n  class CalGrayCS extends ColorSpace {\n    constructor(whitePoint, blackPoint, gamma) {\n      super(\"CalGray\", 1);\n\n      if (!whitePoint) {\n        throw new _util.FormatError(\"WhitePoint missing - required for color space CalGray\");\n      }\n\n      blackPoint = blackPoint || [0, 0, 0];\n      gamma = gamma || 1;\n      this.XW = whitePoint[0];\n      this.YW = whitePoint[1];\n      this.ZW = whitePoint[2];\n      this.XB = blackPoint[0];\n      this.YB = blackPoint[1];\n      this.ZB = blackPoint[2];\n      this.G = gamma;\n\n      if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {\n        throw new _util.FormatError(`Invalid WhitePoint components for ${this.name}` + \", no fallback available\");\n      }\n\n      if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {\n        (0, _util.info)(`Invalid BlackPoint for ${this.name}, falling back to default.`);\n        this.XB = this.YB = this.ZB = 0;\n      }\n\n      if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) {\n        (0, _util.warn)(`${this.name}, BlackPoint: XB: ${this.XB}, YB: ${this.YB}, ` + `ZB: ${this.ZB}, only default values are supported.`);\n      }\n\n      if (this.G < 1) {\n        (0, _util.info)(`Invalid Gamma: ${this.G} for ${this.name}, ` + \"falling back to default.\");\n        this.G = 1;\n      }\n    }\n\n    getRgbItem(src, srcOffset, dest, destOffset) {\n      convertToRgb(this, src, srcOffset, dest, destOffset, 1);\n    }\n\n    getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      const scale = 1 / ((1 << bits) - 1);\n\n      for (let i = 0; i < count; ++i) {\n        convertToRgb(this, src, srcOffset, dest, destOffset, scale);\n        srcOffset += 1;\n        destOffset += 3 + alpha01;\n      }\n    }\n\n    getOutputLength(inputLength, alpha01) {\n      return inputLength * (3 + alpha01);\n    }\n\n  }\n\n  return CalGrayCS;\n}();\n\nconst CalRGBCS = function CalRGBCSClosure() {\n  const BRADFORD_SCALE_MATRIX = new Float32Array([0.8951, 0.2664, -0.1614, -0.7502, 1.7135, 0.0367, 0.0389, -0.0685, 1.0296]);\n  const BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([0.9869929, -0.1470543, 0.1599627, 0.4323053, 0.5183603, 0.0492912, -0.0085287, 0.0400428, 0.9684867]);\n  const SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([3.2404542, -1.5371385, -0.4985314, -0.9692660, 1.8760108, 0.0415560, 0.0556434, -0.2040259, 1.0572252]);\n  const FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]);\n  const tempNormalizeMatrix = new Float32Array(3);\n  const tempConvertMatrix1 = new Float32Array(3);\n  const tempConvertMatrix2 = new Float32Array(3);\n  const DECODE_L_CONSTANT = ((8 + 16) / 116) ** 3 / 8.0;\n\n  function matrixProduct(a, b, result) {\n    result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n    result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2];\n    result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2];\n  }\n\n  function convertToFlat(sourceWhitePoint, LMS, result) {\n    result[0] = LMS[0] * 1 / sourceWhitePoint[0];\n    result[1] = LMS[1] * 1 / sourceWhitePoint[1];\n    result[2] = LMS[2] * 1 / sourceWhitePoint[2];\n  }\n\n  function convertToD65(sourceWhitePoint, LMS, result) {\n    const D65X = 0.95047;\n    const D65Y = 1;\n    const D65Z = 1.08883;\n    result[0] = LMS[0] * D65X / sourceWhitePoint[0];\n    result[1] = LMS[1] * D65Y / sourceWhitePoint[1];\n    result[2] = LMS[2] * D65Z / sourceWhitePoint[2];\n  }\n\n  function sRGBTransferFunction(color) {\n    if (color <= 0.0031308) {\n      return adjustToRange(0, 1, 12.92 * color);\n    }\n\n    if (color >= 0.99554525) {\n      return 1;\n    }\n\n    return adjustToRange(0, 1, (1 + 0.055) * color ** (1 / 2.4) - 0.055);\n  }\n\n  function adjustToRange(min, max, value) {\n    return Math.max(min, Math.min(max, value));\n  }\n\n  function decodeL(L) {\n    if (L < 0) {\n      return -decodeL(-L);\n    }\n\n    if (L > 8.0) {\n      return ((L + 16) / 116) ** 3;\n    }\n\n    return L * DECODE_L_CONSTANT;\n  }\n\n  function compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) {\n    if (sourceBlackPoint[0] === 0 && sourceBlackPoint[1] === 0 && sourceBlackPoint[2] === 0) {\n      result[0] = XYZ_Flat[0];\n      result[1] = XYZ_Flat[1];\n      result[2] = XYZ_Flat[2];\n      return;\n    }\n\n    const zeroDecodeL = decodeL(0);\n    const X_DST = zeroDecodeL;\n    const X_SRC = decodeL(sourceBlackPoint[0]);\n    const Y_DST = zeroDecodeL;\n    const Y_SRC = decodeL(sourceBlackPoint[1]);\n    const Z_DST = zeroDecodeL;\n    const Z_SRC = decodeL(sourceBlackPoint[2]);\n    const X_Scale = (1 - X_DST) / (1 - X_SRC);\n    const X_Offset = 1 - X_Scale;\n    const Y_Scale = (1 - Y_DST) / (1 - Y_SRC);\n    const Y_Offset = 1 - Y_Scale;\n    const Z_Scale = (1 - Z_DST) / (1 - Z_SRC);\n    const Z_Offset = 1 - Z_Scale;\n    result[0] = XYZ_Flat[0] * X_Scale + X_Offset;\n    result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset;\n    result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset;\n  }\n\n  function normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) {\n    if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) {\n      result[0] = XYZ_In[0];\n      result[1] = XYZ_In[1];\n      result[2] = XYZ_In[2];\n      return;\n    }\n\n    const LMS = result;\n    matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);\n    const LMS_Flat = tempNormalizeMatrix;\n    convertToFlat(sourceWhitePoint, LMS, LMS_Flat);\n    matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result);\n  }\n\n  function normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) {\n    const LMS = result;\n    matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);\n    const LMS_D65 = tempNormalizeMatrix;\n    convertToD65(sourceWhitePoint, LMS, LMS_D65);\n    matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result);\n  }\n\n  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {\n    const A = adjustToRange(0, 1, src[srcOffset] * scale);\n    const B = adjustToRange(0, 1, src[srcOffset + 1] * scale);\n    const C = adjustToRange(0, 1, src[srcOffset + 2] * scale);\n    const AGR = A === 1 ? 1 : A ** cs.GR;\n    const BGG = B === 1 ? 1 : B ** cs.GG;\n    const CGB = C === 1 ? 1 : C ** cs.GB;\n    const X = cs.MXA * AGR + cs.MXB * BGG + cs.MXC * CGB;\n    const Y = cs.MYA * AGR + cs.MYB * BGG + cs.MYC * CGB;\n    const Z = cs.MZA * AGR + cs.MZB * BGG + cs.MZC * CGB;\n    const XYZ = tempConvertMatrix1;\n    XYZ[0] = X;\n    XYZ[1] = Y;\n    XYZ[2] = Z;\n    const XYZ_Flat = tempConvertMatrix2;\n    normalizeWhitePointToFlat(cs.whitePoint, XYZ, XYZ_Flat);\n    const XYZ_Black = tempConvertMatrix1;\n    compensateBlackPoint(cs.blackPoint, XYZ_Flat, XYZ_Black);\n    const XYZ_D65 = tempConvertMatrix2;\n    normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65);\n    const SRGB = tempConvertMatrix1;\n    matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB);\n    dest[destOffset] = sRGBTransferFunction(SRGB[0]) * 255;\n    dest[destOffset + 1] = sRGBTransferFunction(SRGB[1]) * 255;\n    dest[destOffset + 2] = sRGBTransferFunction(SRGB[2]) * 255;\n  }\n\n  class CalRGBCS extends ColorSpace {\n    constructor(whitePoint, blackPoint, gamma, matrix) {\n      super(\"CalRGB\", 3);\n\n      if (!whitePoint) {\n        throw new _util.FormatError(\"WhitePoint missing - required for color space CalRGB\");\n      }\n\n      blackPoint = blackPoint || new Float32Array(3);\n      gamma = gamma || new Float32Array([1, 1, 1]);\n      matrix = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]);\n      const XW = whitePoint[0];\n      const YW = whitePoint[1];\n      const ZW = whitePoint[2];\n      this.whitePoint = whitePoint;\n      const XB = blackPoint[0];\n      const YB = blackPoint[1];\n      const ZB = blackPoint[2];\n      this.blackPoint = blackPoint;\n      this.GR = gamma[0];\n      this.GG = gamma[1];\n      this.GB = gamma[2];\n      this.MXA = matrix[0];\n      this.MYA = matrix[1];\n      this.MZA = matrix[2];\n      this.MXB = matrix[3];\n      this.MYB = matrix[4];\n      this.MZB = matrix[5];\n      this.MXC = matrix[6];\n      this.MYC = matrix[7];\n      this.MZC = matrix[8];\n\n      if (XW < 0 || ZW < 0 || YW !== 1) {\n        throw new _util.FormatError(`Invalid WhitePoint components for ${this.name}` + \", no fallback available\");\n      }\n\n      if (XB < 0 || YB < 0 || ZB < 0) {\n        (0, _util.info)(`Invalid BlackPoint for ${this.name} [${XB}, ${YB}, ${ZB}], ` + \"falling back to default.\");\n        this.blackPoint = new Float32Array(3);\n      }\n\n      if (this.GR < 0 || this.GG < 0 || this.GB < 0) {\n        (0, _util.info)(`Invalid Gamma [${this.GR}, ${this.GG}, ${this.GB}] for ` + `${this.name}, falling back to default.`);\n        this.GR = this.GG = this.GB = 1;\n      }\n    }\n\n    getRgbItem(src, srcOffset, dest, destOffset) {\n      convertToRgb(this, src, srcOffset, dest, destOffset, 1);\n    }\n\n    getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      const scale = 1 / ((1 << bits) - 1);\n\n      for (let i = 0; i < count; ++i) {\n        convertToRgb(this, src, srcOffset, dest, destOffset, scale);\n        srcOffset += 3;\n        destOffset += 3 + alpha01;\n      }\n    }\n\n    getOutputLength(inputLength, alpha01) {\n      return inputLength * (3 + alpha01) / 3 | 0;\n    }\n\n  }\n\n  return CalRGBCS;\n}();\n\nconst LabCS = function LabCSClosure() {\n  function fn_g(x) {\n    let result;\n\n    if (x >= 6 / 29) {\n      result = x ** 3;\n    } else {\n      result = 108 / 841 * (x - 4 / 29);\n    }\n\n    return result;\n  }\n\n  function decode(value, high1, low2, high2) {\n    return low2 + value * (high2 - low2) / high1;\n  }\n\n  function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) {\n    let Ls = src[srcOffset];\n    let as = src[srcOffset + 1];\n    let bs = src[srcOffset + 2];\n\n    if (maxVal !== false) {\n      Ls = decode(Ls, maxVal, 0, 100);\n      as = decode(as, maxVal, cs.amin, cs.amax);\n      bs = decode(bs, maxVal, cs.bmin, cs.bmax);\n    }\n\n    if (as > cs.amax) {\n      as = cs.amax;\n    } else if (as < cs.amin) {\n      as = cs.amin;\n    }\n\n    if (bs > cs.bmax) {\n      bs = cs.bmax;\n    } else if (bs < cs.bmin) {\n      bs = cs.bmin;\n    }\n\n    const M = (Ls + 16) / 116;\n    const L = M + as / 500;\n    const N = M - bs / 200;\n    const X = cs.XW * fn_g(L);\n    const Y = cs.YW * fn_g(M);\n    const Z = cs.ZW * fn_g(N);\n    let r, g, b;\n\n    if (cs.ZW < 1) {\n      r = X * 3.1339 + Y * -1.617 + Z * -0.4906;\n      g = X * -0.9785 + Y * 1.916 + Z * 0.0333;\n      b = X * 0.072 + Y * -0.229 + Z * 1.4057;\n    } else {\n      r = X * 3.2406 + Y * -1.5372 + Z * -0.4986;\n      g = X * -0.9689 + Y * 1.8758 + Z * 0.0415;\n      b = X * 0.0557 + Y * -0.204 + Z * 1.057;\n    }\n\n    dest[destOffset] = Math.sqrt(r) * 255;\n    dest[destOffset + 1] = Math.sqrt(g) * 255;\n    dest[destOffset + 2] = Math.sqrt(b) * 255;\n  }\n\n  class LabCS extends ColorSpace {\n    constructor(whitePoint, blackPoint, range) {\n      super(\"Lab\", 3);\n\n      if (!whitePoint) {\n        throw new _util.FormatError(\"WhitePoint missing - required for color space Lab\");\n      }\n\n      blackPoint = blackPoint || [0, 0, 0];\n      range = range || [-100, 100, -100, 100];\n      this.XW = whitePoint[0];\n      this.YW = whitePoint[1];\n      this.ZW = whitePoint[2];\n      this.amin = range[0];\n      this.amax = range[1];\n      this.bmin = range[2];\n      this.bmax = range[3];\n      this.XB = blackPoint[0];\n      this.YB = blackPoint[1];\n      this.ZB = blackPoint[2];\n\n      if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {\n        throw new _util.FormatError(\"Invalid WhitePoint components, no fallback available\");\n      }\n\n      if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {\n        (0, _util.info)(\"Invalid BlackPoint, falling back to default\");\n        this.XB = this.YB = this.ZB = 0;\n      }\n\n      if (this.amin > this.amax || this.bmin > this.bmax) {\n        (0, _util.info)(\"Invalid Range, falling back to defaults\");\n        this.amin = -100;\n        this.amax = 100;\n        this.bmin = -100;\n        this.bmax = 100;\n      }\n    }\n\n    getRgbItem(src, srcOffset, dest, destOffset) {\n      convertToRgb(this, src, srcOffset, false, dest, destOffset);\n    }\n\n    getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      const maxVal = (1 << bits) - 1;\n\n      for (let i = 0; i < count; i++) {\n        convertToRgb(this, src, srcOffset, maxVal, dest, destOffset);\n        srcOffset += 3;\n        destOffset += 3 + alpha01;\n      }\n    }\n\n    getOutputLength(inputLength, alpha01) {\n      return inputLength * (3 + alpha01) / 3 | 0;\n    }\n\n    isDefaultDecode(decodeMap, bpc) {\n      return true;\n    }\n\n    get usesZeroToOneRange() {\n      return (0, _util.shadow)(this, \"usesZeroToOneRange\", false);\n    }\n\n  }\n\n  return LabCS;\n}();\n\n/***/ }),\n/* 24 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.LocalTilingPatternCache = exports.LocalImageCache = exports.LocalGStateCache = exports.LocalFunctionCache = exports.LocalColorSpaceCache = exports.GlobalImageCache = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _primitives = __w_pdfjs_require__(5);\n\nclass BaseLocalCache {\n  constructor(options) {\n    if (this.constructor === BaseLocalCache) {\n      (0, _util.unreachable)(\"Cannot initialize BaseLocalCache.\");\n    }\n\n    if (!options || !options.onlyRefs) {\n      this._nameRefMap = new Map();\n      this._imageMap = new Map();\n    }\n\n    this._imageCache = new _primitives.RefSetCache();\n  }\n\n  getByName(name) {\n    const ref = this._nameRefMap.get(name);\n\n    if (ref) {\n      return this.getByRef(ref);\n    }\n\n    return this._imageMap.get(name) || null;\n  }\n\n  getByRef(ref) {\n    return this._imageCache.get(ref) || null;\n  }\n\n  set(name, ref, data) {\n    (0, _util.unreachable)(\"Abstract method `set` called.\");\n  }\n\n}\n\nclass LocalImageCache extends BaseLocalCache {\n  set(name, ref = null, data) {\n    if (!name) {\n      throw new Error('LocalImageCache.set - expected \"name\" argument.');\n    }\n\n    if (ref) {\n      if (this._imageCache.has(ref)) {\n        return;\n      }\n\n      this._nameRefMap.set(name, ref);\n\n      this._imageCache.put(ref, data);\n\n      return;\n    }\n\n    if (this._imageMap.has(name)) {\n      return;\n    }\n\n    this._imageMap.set(name, data);\n  }\n\n}\n\nexports.LocalImageCache = LocalImageCache;\n\nclass LocalColorSpaceCache extends BaseLocalCache {\n  set(name = null, ref = null, data) {\n    if (!name && !ref) {\n      throw new Error('LocalColorSpaceCache.set - expected \"name\" and/or \"ref\" argument.');\n    }\n\n    if (ref) {\n      if (this._imageCache.has(ref)) {\n        return;\n      }\n\n      if (name) {\n        this._nameRefMap.set(name, ref);\n      }\n\n      this._imageCache.put(ref, data);\n\n      return;\n    }\n\n    if (this._imageMap.has(name)) {\n      return;\n    }\n\n    this._imageMap.set(name, data);\n  }\n\n}\n\nexports.LocalColorSpaceCache = LocalColorSpaceCache;\n\nclass LocalFunctionCache extends BaseLocalCache {\n  constructor(options) {\n    super({\n      onlyRefs: true\n    });\n  }\n\n  getByName(name) {\n    (0, _util.unreachable)(\"Should not call `getByName` method.\");\n  }\n\n  set(name = null, ref, data) {\n    if (!ref) {\n      throw new Error('LocalFunctionCache.set - expected \"ref\" argument.');\n    }\n\n    if (this._imageCache.has(ref)) {\n      return;\n    }\n\n    this._imageCache.put(ref, data);\n  }\n\n}\n\nexports.LocalFunctionCache = LocalFunctionCache;\n\nclass LocalGStateCache extends BaseLocalCache {\n  set(name, ref = null, data) {\n    if (!name) {\n      throw new Error('LocalGStateCache.set - expected \"name\" argument.');\n    }\n\n    if (ref) {\n      if (this._imageCache.has(ref)) {\n        return;\n      }\n\n      this._nameRefMap.set(name, ref);\n\n      this._imageCache.put(ref, data);\n\n      return;\n    }\n\n    if (this._imageMap.has(name)) {\n      return;\n    }\n\n    this._imageMap.set(name, data);\n  }\n\n}\n\nexports.LocalGStateCache = LocalGStateCache;\n\nclass LocalTilingPatternCache extends BaseLocalCache {\n  set(name, ref = null, data) {\n    if (!name) {\n      throw new Error('LocalTilingPatternCache.set - expected \"name\" argument.');\n    }\n\n    if (ref) {\n      if (this._imageCache.has(ref)) {\n        return;\n      }\n\n      this._nameRefMap.set(name, ref);\n\n      this._imageCache.put(ref, data);\n\n      return;\n    }\n\n    if (this._imageMap.has(name)) {\n      return;\n    }\n\n    this._imageMap.set(name, data);\n  }\n\n}\n\nexports.LocalTilingPatternCache = LocalTilingPatternCache;\n\nclass GlobalImageCache {\n  static get NUM_PAGES_THRESHOLD() {\n    return (0, _util.shadow)(this, \"NUM_PAGES_THRESHOLD\", 2);\n  }\n\n  static get MIN_IMAGES_TO_CACHE() {\n    return (0, _util.shadow)(this, \"MIN_IMAGES_TO_CACHE\", 10);\n  }\n\n  static get MAX_BYTE_SIZE() {\n    return (0, _util.shadow)(this, \"MAX_BYTE_SIZE\", 40e6);\n  }\n\n  constructor() {\n    this._refCache = new _primitives.RefSetCache();\n    this._imageCache = new _primitives.RefSetCache();\n  }\n\n  get _byteSize() {\n    let byteSize = 0;\n\n    this._imageCache.forEach(imageData => {\n      byteSize += imageData.byteSize;\n    });\n\n    return byteSize;\n  }\n\n  get _cacheLimitReached() {\n    if (this._imageCache.size < GlobalImageCache.MIN_IMAGES_TO_CACHE) {\n      return false;\n    }\n\n    if (this._byteSize < GlobalImageCache.MAX_BYTE_SIZE) {\n      return false;\n    }\n\n    return true;\n  }\n\n  shouldCache(ref, pageIndex) {\n    const pageIndexSet = this._refCache.get(ref);\n\n    const numPages = pageIndexSet ? pageIndexSet.size + (pageIndexSet.has(pageIndex) ? 0 : 1) : 1;\n\n    if (numPages < GlobalImageCache.NUM_PAGES_THRESHOLD) {\n      return false;\n    }\n\n    if (!this._imageCache.has(ref) && this._cacheLimitReached) {\n      return false;\n    }\n\n    return true;\n  }\n\n  addPageIndex(ref, pageIndex) {\n    let pageIndexSet = this._refCache.get(ref);\n\n    if (!pageIndexSet) {\n      pageIndexSet = new Set();\n\n      this._refCache.put(ref, pageIndexSet);\n    }\n\n    pageIndexSet.add(pageIndex);\n  }\n\n  addByteSize(ref, byteSize) {\n    const imageData = this._imageCache.get(ref);\n\n    if (!imageData) {\n      return;\n    }\n\n    if (imageData.byteSize) {\n      return;\n    }\n\n    imageData.byteSize = byteSize;\n  }\n\n  getData(ref, pageIndex) {\n    const pageIndexSet = this._refCache.get(ref);\n\n    if (!pageIndexSet) {\n      return null;\n    }\n\n    if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) {\n      return null;\n    }\n\n    const imageData = this._imageCache.get(ref);\n\n    if (!imageData) {\n      return null;\n    }\n\n    pageIndexSet.add(pageIndex);\n    return imageData;\n  }\n\n  setData(ref, data) {\n    if (!this._refCache.has(ref)) {\n      throw new Error('GlobalImageCache.setData - expected \"addPageIndex\" to have been called.');\n    }\n\n    if (this._imageCache.has(ref)) {\n      return;\n    }\n\n    if (this._cacheLimitReached) {\n      (0, _util.warn)(\"GlobalImageCache.setData - cache limit reached.\");\n      return;\n    }\n\n    this._imageCache.put(ref, data);\n  }\n\n  clear(onlyData = false) {\n    if (!onlyData) {\n      this._refCache.clear();\n    }\n\n    this._imageCache.clear();\n  }\n\n}\n\nexports.GlobalImageCache = GlobalImageCache;\n\n/***/ }),\n/* 25 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.MetadataParser = void 0;\n\nvar _xml_parser = __w_pdfjs_require__(26);\n\nclass MetadataParser {\n  constructor(data) {\n    data = this._repair(data);\n    const parser = new _xml_parser.SimpleXMLParser({\n      lowerCaseName: true\n    });\n    const xmlDocument = parser.parseFromString(data);\n    this._metadataMap = new Map();\n    this._data = data;\n\n    if (xmlDocument) {\n      this._parse(xmlDocument);\n    }\n  }\n\n  _repair(data) {\n    return data.replace(/^[^<]+/, \"\").replace(/>\\\\376\\\\377([^<]+)/g, function (all, codes) {\n      const bytes = codes.replace(/\\\\([0-3])([0-7])([0-7])/g, function (code, d1, d2, d3) {\n        return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1);\n      }).replace(/&(amp|apos|gt|lt|quot);/g, function (str, name) {\n        switch (name) {\n          case \"amp\":\n            return \"&\";\n\n          case \"apos\":\n            return \"'\";\n\n          case \"gt\":\n            return \">\";\n\n          case \"lt\":\n            return \"<\";\n\n          case \"quot\":\n            return '\"';\n        }\n\n        throw new Error(`_repair: ${name} isn't defined.`);\n      });\n      const charBuf = [];\n\n      for (let i = 0, ii = bytes.length; i < ii; i += 2) {\n        const code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);\n\n        if (code >= 32 && code < 127 && code !== 60 && code !== 62 && code !== 38) {\n          charBuf.push(String.fromCharCode(code));\n        } else {\n          charBuf.push(\"&#x\" + (0x10000 + code).toString(16).substring(1) + \";\");\n        }\n      }\n\n      return \">\" + charBuf.join(\"\");\n    });\n  }\n\n  _getSequence(entry) {\n    const name = entry.nodeName;\n\n    if (name !== \"rdf:bag\" && name !== \"rdf:seq\" && name !== \"rdf:alt\") {\n      return null;\n    }\n\n    return entry.childNodes.filter(node => node.nodeName === \"rdf:li\");\n  }\n\n  _parseArray(entry) {\n    if (!entry.hasChildNodes()) {\n      return;\n    }\n\n    const [seqNode] = entry.childNodes;\n    const sequence = this._getSequence(seqNode) || [];\n\n    this._metadataMap.set(entry.nodeName, sequence.map(node => node.textContent.trim()));\n  }\n\n  _parse(xmlDocument) {\n    let rdf = xmlDocument.documentElement;\n\n    if (rdf.nodeName !== \"rdf:rdf\") {\n      rdf = rdf.firstChild;\n\n      while (rdf && rdf.nodeName !== \"rdf:rdf\") {\n        rdf = rdf.nextSibling;\n      }\n    }\n\n    if (!rdf || rdf.nodeName !== \"rdf:rdf\" || !rdf.hasChildNodes()) {\n      return;\n    }\n\n    for (const desc of rdf.childNodes) {\n      if (desc.nodeName !== \"rdf:description\") {\n        continue;\n      }\n\n      for (const entry of desc.childNodes) {\n        const name = entry.nodeName;\n\n        switch (name) {\n          case \"#text\":\n            continue;\n\n          case \"dc:creator\":\n          case \"dc:subject\":\n            this._parseArray(entry);\n\n            continue;\n        }\n\n        this._metadataMap.set(name, entry.textContent.trim());\n      }\n    }\n  }\n\n  get serializable() {\n    return {\n      parsedData: this._metadataMap,\n      rawData: this._data\n    };\n  }\n\n}\n\nexports.MetadataParser = MetadataParser;\n\n/***/ }),\n/* 26 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.XMLParserErrorCode = exports.XMLParserBase = exports.SimpleXMLParser = exports.SimpleDOMNode = void 0;\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nconst XMLParserErrorCode = {\n  NoError: 0,\n  EndOfDocument: -1,\n  UnterminatedCdat: -2,\n  UnterminatedXmlDeclaration: -3,\n  UnterminatedDoctypeDeclaration: -4,\n  UnterminatedComment: -5,\n  MalformedElement: -6,\n  OutOfMemory: -7,\n  UnterminatedAttributeValue: -8,\n  UnterminatedElement: -9,\n  ElementNeverBegun: -10\n};\nexports.XMLParserErrorCode = XMLParserErrorCode;\n\nfunction isWhitespace(s, index) {\n  const ch = s[index];\n  return ch === \" \" || ch === \"\\n\" || ch === \"\\r\" || ch === \"\\t\";\n}\n\nfunction isWhitespaceString(s) {\n  for (let i = 0, ii = s.length; i < ii; i++) {\n    if (!isWhitespace(s, i)) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nclass XMLParserBase {\n  _resolveEntities(s) {\n    return s.replace(/&([^;]+);/g, (all, entity) => {\n      if (entity.substring(0, 2) === \"#x\") {\n        return String.fromCodePoint(parseInt(entity.substring(2), 16));\n      } else if (entity.substring(0, 1) === \"#\") {\n        return String.fromCodePoint(parseInt(entity.substring(1), 10));\n      }\n\n      switch (entity) {\n        case \"lt\":\n          return \"<\";\n\n        case \"gt\":\n          return \">\";\n\n        case \"amp\":\n          return \"&\";\n\n        case \"quot\":\n          return '\"';\n\n        case \"apos\":\n          return \"'\";\n      }\n\n      return this.onResolveEntity(entity);\n    });\n  }\n\n  _parseContent(s, start) {\n    const attributes = [];\n    let pos = start;\n\n    function skipWs() {\n      while (pos < s.length && isWhitespace(s, pos)) {\n        ++pos;\n      }\n    }\n\n    while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== \">\" && s[pos] !== \"/\") {\n      ++pos;\n    }\n\n    const name = s.substring(start, pos);\n    skipWs();\n\n    while (pos < s.length && s[pos] !== \">\" && s[pos] !== \"/\" && s[pos] !== \"?\") {\n      skipWs();\n      let attrName = \"\",\n          attrValue = \"\";\n\n      while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== \"=\") {\n        attrName += s[pos];\n        ++pos;\n      }\n\n      skipWs();\n\n      if (s[pos] !== \"=\") {\n        return null;\n      }\n\n      ++pos;\n      skipWs();\n      const attrEndChar = s[pos];\n\n      if (attrEndChar !== '\"' && attrEndChar !== \"'\") {\n        return null;\n      }\n\n      const attrEndIndex = s.indexOf(attrEndChar, ++pos);\n\n      if (attrEndIndex < 0) {\n        return null;\n      }\n\n      attrValue = s.substring(pos, attrEndIndex);\n      attributes.push({\n        name: attrName,\n        value: this._resolveEntities(attrValue)\n      });\n      pos = attrEndIndex + 1;\n      skipWs();\n    }\n\n    return {\n      name,\n      attributes,\n      parsed: pos - start\n    };\n  }\n\n  _parseProcessingInstruction(s, start) {\n    let pos = start;\n\n    function skipWs() {\n      while (pos < s.length && isWhitespace(s, pos)) {\n        ++pos;\n      }\n    }\n\n    while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== \">\" && s[pos] !== \"/\") {\n      ++pos;\n    }\n\n    const name = s.substring(start, pos);\n    skipWs();\n    const attrStart = pos;\n\n    while (pos < s.length && (s[pos] !== \"?\" || s[pos + 1] !== \">\")) {\n      ++pos;\n    }\n\n    const value = s.substring(attrStart, pos);\n    return {\n      name,\n      value,\n      parsed: pos - start\n    };\n  }\n\n  parseXml(s) {\n    let i = 0;\n\n    while (i < s.length) {\n      const ch = s[i];\n      let j = i;\n\n      if (ch === \"<\") {\n        ++j;\n        const ch2 = s[j];\n        let q;\n\n        switch (ch2) {\n          case \"/\":\n            ++j;\n            q = s.indexOf(\">\", j);\n\n            if (q < 0) {\n              this.onError(XMLParserErrorCode.UnterminatedElement);\n              return;\n            }\n\n            this.onEndElement(s.substring(j, q));\n            j = q + 1;\n            break;\n\n          case \"?\":\n            ++j;\n\n            const pi = this._parseProcessingInstruction(s, j);\n\n            if (s.substring(j + pi.parsed, j + pi.parsed + 2) !== \"?>\") {\n              this.onError(XMLParserErrorCode.UnterminatedXmlDeclaration);\n              return;\n            }\n\n            this.onPi(pi.name, pi.value);\n            j += pi.parsed + 2;\n            break;\n\n          case \"!\":\n            if (s.substring(j + 1, j + 3) === \"--\") {\n              q = s.indexOf(\"-->\", j + 3);\n\n              if (q < 0) {\n                this.onError(XMLParserErrorCode.UnterminatedComment);\n                return;\n              }\n\n              this.onComment(s.substring(j + 3, q));\n              j = q + 3;\n            } else if (s.substring(j + 1, j + 8) === \"[CDATA[\") {\n              q = s.indexOf(\"]]>\", j + 8);\n\n              if (q < 0) {\n                this.onError(XMLParserErrorCode.UnterminatedCdat);\n                return;\n              }\n\n              this.onCdata(s.substring(j + 8, q));\n              j = q + 3;\n            } else if (s.substring(j + 1, j + 8) === \"DOCTYPE\") {\n              const q2 = s.indexOf(\"[\", j + 8);\n              let complexDoctype = false;\n              q = s.indexOf(\">\", j + 8);\n\n              if (q < 0) {\n                this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration);\n                return;\n              }\n\n              if (q2 > 0 && q > q2) {\n                q = s.indexOf(\"]>\", j + 8);\n\n                if (q < 0) {\n                  this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration);\n                  return;\n                }\n\n                complexDoctype = true;\n              }\n\n              const doctypeContent = s.substring(j + 8, q + (complexDoctype ? 1 : 0));\n              this.onDoctype(doctypeContent);\n              j = q + (complexDoctype ? 2 : 1);\n            } else {\n              this.onError(XMLParserErrorCode.MalformedElement);\n              return;\n            }\n\n            break;\n\n          default:\n            const content = this._parseContent(s, j);\n\n            if (content === null) {\n              this.onError(XMLParserErrorCode.MalformedElement);\n              return;\n            }\n\n            let isClosed = false;\n\n            if (s.substring(j + content.parsed, j + content.parsed + 2) === \"/>\") {\n              isClosed = true;\n            } else if (s.substring(j + content.parsed, j + content.parsed + 1) !== \">\") {\n              this.onError(XMLParserErrorCode.UnterminatedElement);\n              return;\n            }\n\n            this.onBeginElement(content.name, content.attributes, isClosed);\n            j += content.parsed + (isClosed ? 2 : 1);\n            break;\n        }\n      } else {\n        while (j < s.length && s[j] !== \"<\") {\n          j++;\n        }\n\n        const text = s.substring(i, j);\n        this.onText(this._resolveEntities(text));\n      }\n\n      i = j;\n    }\n  }\n\n  onResolveEntity(name) {\n    return `&${name};`;\n  }\n\n  onPi(name, value) {}\n\n  onComment(text) {}\n\n  onCdata(text) {}\n\n  onDoctype(doctypeContent) {}\n\n  onText(text) {}\n\n  onBeginElement(name, attributes, isEmpty) {}\n\n  onEndElement(name) {}\n\n  onError(code) {}\n\n}\n\nexports.XMLParserBase = XMLParserBase;\n\nclass SimpleDOMNode {\n  constructor(nodeName, nodeValue) {\n    this.nodeName = nodeName;\n    this.nodeValue = nodeValue;\n    Object.defineProperty(this, \"parentNode\", {\n      value: null,\n      writable: true\n    });\n  }\n\n  get firstChild() {\n    return this.childNodes && this.childNodes[0];\n  }\n\n  get nextSibling() {\n    const childNodes = this.parentNode.childNodes;\n\n    if (!childNodes) {\n      return undefined;\n    }\n\n    const index = childNodes.indexOf(this);\n\n    if (index === -1) {\n      return undefined;\n    }\n\n    return childNodes[index + 1];\n  }\n\n  get textContent() {\n    if (!this.childNodes) {\n      return this.nodeValue || \"\";\n    }\n\n    return this.childNodes.map(function (child) {\n      return child.textContent;\n    }).join(\"\");\n  }\n\n  hasChildNodes() {\n    return this.childNodes && this.childNodes.length > 0;\n  }\n\n  searchNode(paths, pos) {\n    if (pos >= paths.length) {\n      return this;\n    }\n\n    const component = paths[pos];\n    const stack = [];\n    let node = this;\n\n    while (true) {\n      if (component.name === node.nodeName) {\n        if (component.pos === 0) {\n          const res = node.searchNode(paths, pos + 1);\n\n          if (res !== null) {\n            return res;\n          }\n        } else if (stack.length === 0) {\n          return null;\n        } else {\n          const [parent] = stack.pop();\n          let siblingPos = 0;\n\n          for (const child of parent.childNodes) {\n            if (component.name === child.nodeName) {\n              if (siblingPos === component.pos) {\n                return child.searchNode(paths, pos + 1);\n              }\n\n              siblingPos++;\n            }\n          }\n\n          return node.searchNode(paths, pos + 1);\n        }\n      }\n\n      if (node.childNodes && node.childNodes.length !== 0) {\n        stack.push([node, 0]);\n        node = node.childNodes[0];\n      } else if (stack.length === 0) {\n        return null;\n      } else {\n        while (stack.length !== 0) {\n          const [parent, currentPos] = stack.pop();\n          const newPos = currentPos + 1;\n\n          if (newPos < parent.childNodes.length) {\n            stack.push([parent, newPos]);\n            node = parent.childNodes[newPos];\n            break;\n          }\n        }\n\n        if (stack.length === 0) {\n          return null;\n        }\n      }\n    }\n  }\n\n  dump(buffer) {\n    if (this.nodeName === \"#text\") {\n      buffer.push((0, _core_utils.encodeToXmlString)(this.nodeValue));\n      return;\n    }\n\n    buffer.push(`<${this.nodeName}`);\n\n    if (this.attributes) {\n      for (const attribute of this.attributes) {\n        buffer.push(` ${attribute.name}=\"${(0, _core_utils.encodeToXmlString)(attribute.value)}\"`);\n      }\n    }\n\n    if (this.hasChildNodes()) {\n      buffer.push(\">\");\n\n      for (const child of this.childNodes) {\n        child.dump(buffer);\n      }\n\n      buffer.push(`</${this.nodeName}>`);\n    } else if (this.nodeValue) {\n      buffer.push(`>${(0, _core_utils.encodeToXmlString)(this.nodeValue)}</${this.nodeName}>`);\n    } else {\n      buffer.push(\"/>\");\n    }\n  }\n\n}\n\nexports.SimpleDOMNode = SimpleDOMNode;\n\nclass SimpleXMLParser extends XMLParserBase {\n  constructor({\n    hasAttributes = false,\n    lowerCaseName = false\n  }) {\n    super();\n    this._currentFragment = null;\n    this._stack = null;\n    this._errorCode = XMLParserErrorCode.NoError;\n    this._hasAttributes = hasAttributes;\n    this._lowerCaseName = lowerCaseName;\n  }\n\n  parseFromString(data) {\n    this._currentFragment = [];\n    this._stack = [];\n    this._errorCode = XMLParserErrorCode.NoError;\n    this.parseXml(data);\n\n    if (this._errorCode !== XMLParserErrorCode.NoError) {\n      return undefined;\n    }\n\n    const [documentElement] = this._currentFragment;\n\n    if (!documentElement) {\n      return undefined;\n    }\n\n    return {\n      documentElement\n    };\n  }\n\n  onText(text) {\n    if (isWhitespaceString(text)) {\n      return;\n    }\n\n    const node = new SimpleDOMNode(\"#text\", text);\n\n    this._currentFragment.push(node);\n  }\n\n  onCdata(text) {\n    const node = new SimpleDOMNode(\"#text\", text);\n\n    this._currentFragment.push(node);\n  }\n\n  onBeginElement(name, attributes, isEmpty) {\n    if (this._lowerCaseName) {\n      name = name.toLowerCase();\n    }\n\n    const node = new SimpleDOMNode(name);\n    node.childNodes = [];\n\n    if (this._hasAttributes) {\n      node.attributes = attributes;\n    }\n\n    this._currentFragment.push(node);\n\n    if (isEmpty) {\n      return;\n    }\n\n    this._stack.push(this._currentFragment);\n\n    this._currentFragment = node.childNodes;\n  }\n\n  onEndElement(name) {\n    this._currentFragment = this._stack.pop() || [];\n    const lastElement = this._currentFragment[this._currentFragment.length - 1];\n\n    if (!lastElement) {\n      return;\n    }\n\n    for (let i = 0, ii = lastElement.childNodes.length; i < ii; i++) {\n      lastElement.childNodes[i].parentNode = lastElement;\n    }\n  }\n\n  onError(code) {\n    this._errorCode = code;\n  }\n\n}\n\nexports.SimpleXMLParser = SimpleXMLParser;\n\n/***/ }),\n/* 27 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.getQuadPoints = getQuadPoints;\nexports.MarkupAnnotation = exports.AnnotationFactory = exports.AnnotationBorderStyle = exports.Annotation = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _obj = __w_pdfjs_require__(10);\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nvar _default_appearance = __w_pdfjs_require__(28);\n\nvar _primitives = __w_pdfjs_require__(5);\n\nvar _colorspace = __w_pdfjs_require__(23);\n\nvar _operator_list = __w_pdfjs_require__(46);\n\nvar _stream = __w_pdfjs_require__(12);\n\nvar _writer = __w_pdfjs_require__(48);\n\nclass AnnotationFactory {\n  static create(xref, ref, pdfManager, idFactory, collectFields) {\n    return pdfManager.ensureCatalog(\"acroForm\").then(acroForm => {\n      return pdfManager.ensure(this, \"_create\", [xref, ref, pdfManager, idFactory, acroForm, collectFields]);\n    });\n  }\n\n  static _create(xref, ref, pdfManager, idFactory, acroForm, collectFields) {\n    const dict = xref.fetchIfRef(ref);\n\n    if (!(0, _primitives.isDict)(dict)) {\n      return undefined;\n    }\n\n    const id = (0, _primitives.isRef)(ref) ? ref.toString() : `annot_${idFactory.createObjId()}`;\n    let subtype = dict.get(\"Subtype\");\n    subtype = (0, _primitives.isName)(subtype) ? subtype.name : null;\n    const parameters = {\n      xref,\n      ref,\n      dict,\n      subtype,\n      id,\n      pdfManager,\n      acroForm: acroForm instanceof _primitives.Dict ? acroForm : _primitives.Dict.empty,\n      collectFields\n    };\n\n    switch (subtype) {\n      case \"Link\":\n        return new LinkAnnotation(parameters);\n\n      case \"Text\":\n        return new TextAnnotation(parameters);\n\n      case \"Widget\":\n        let fieldType = (0, _core_utils.getInheritableProperty)({\n          dict,\n          key: \"FT\"\n        });\n        fieldType = (0, _primitives.isName)(fieldType) ? fieldType.name : null;\n\n        switch (fieldType) {\n          case \"Tx\":\n            return new TextWidgetAnnotation(parameters);\n\n          case \"Btn\":\n            return new ButtonWidgetAnnotation(parameters);\n\n          case \"Ch\":\n            return new ChoiceWidgetAnnotation(parameters);\n        }\n\n        (0, _util.warn)(`Unimplemented widget field type \"${fieldType}\", ` + \"falling back to base field type.\");\n        return new WidgetAnnotation(parameters);\n\n      case \"Popup\":\n        return new PopupAnnotation(parameters);\n\n      case \"FreeText\":\n        return new FreeTextAnnotation(parameters);\n\n      case \"Line\":\n        return new LineAnnotation(parameters);\n\n      case \"Square\":\n        return new SquareAnnotation(parameters);\n\n      case \"Circle\":\n        return new CircleAnnotation(parameters);\n\n      case \"PolyLine\":\n        return new PolylineAnnotation(parameters);\n\n      case \"Polygon\":\n        return new PolygonAnnotation(parameters);\n\n      case \"Caret\":\n        return new CaretAnnotation(parameters);\n\n      case \"Ink\":\n        return new InkAnnotation(parameters);\n\n      case \"Highlight\":\n        return new HighlightAnnotation(parameters);\n\n      case \"Underline\":\n        return new UnderlineAnnotation(parameters);\n\n      case \"Squiggly\":\n        return new SquigglyAnnotation(parameters);\n\n      case \"StrikeOut\":\n        return new StrikeOutAnnotation(parameters);\n\n      case \"Stamp\":\n        return new StampAnnotation(parameters);\n\n      case \"FileAttachment\":\n        return new FileAttachmentAnnotation(parameters);\n\n      default:\n        if (!collectFields) {\n          if (!subtype) {\n            (0, _util.warn)(\"Annotation is missing the required /Subtype.\");\n          } else {\n            (0, _util.warn)(`Unimplemented annotation type \"${subtype}\", ` + \"falling back to base annotation.\");\n          }\n        }\n\n        return new Annotation(parameters);\n    }\n  }\n\n}\n\nexports.AnnotationFactory = AnnotationFactory;\n\nfunction getRgbColor(color) {\n  const rgbColor = new Uint8ClampedArray(3);\n\n  if (!Array.isArray(color)) {\n    return rgbColor;\n  }\n\n  switch (color.length) {\n    case 0:\n      return null;\n\n    case 1:\n      _colorspace.ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0);\n\n      return rgbColor;\n\n    case 3:\n      _colorspace.ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0);\n\n      return rgbColor;\n\n    case 4:\n      _colorspace.ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0);\n\n      return rgbColor;\n\n    default:\n      return rgbColor;\n  }\n}\n\nfunction getQuadPoints(dict, rect) {\n  if (!dict.has(\"QuadPoints\")) {\n    return null;\n  }\n\n  const quadPoints = dict.getArray(\"QuadPoints\");\n\n  if (!Array.isArray(quadPoints) || quadPoints.length === 0 || quadPoints.length % 8 > 0) {\n    return null;\n  }\n\n  const quadPointsLists = [];\n\n  for (let i = 0, ii = quadPoints.length / 8; i < ii; i++) {\n    quadPointsLists.push([]);\n\n    for (let j = i * 8, jj = i * 8 + 8; j < jj; j += 2) {\n      const x = quadPoints[j];\n      const y = quadPoints[j + 1];\n\n      if (rect !== null && (x < rect[0] || x > rect[2] || y < rect[1] || y > rect[3])) {\n        return null;\n      }\n\n      quadPointsLists[i].push({\n        x,\n        y\n      });\n    }\n  }\n\n  return quadPointsLists.map(quadPointsList => {\n    const [minX, maxX, minY, maxY] = quadPointsList.reduce(([mX, MX, mY, MY], quadPoint) => [Math.min(mX, quadPoint.x), Math.max(MX, quadPoint.x), Math.min(mY, quadPoint.y), Math.max(MY, quadPoint.y)], [Number.MAX_VALUE, Number.MIN_VALUE, Number.MAX_VALUE, Number.MIN_VALUE]);\n    return [{\n      x: minX,\n      y: maxY\n    }, {\n      x: maxX,\n      y: maxY\n    }, {\n      x: minX,\n      y: minY\n    }, {\n      x: maxX,\n      y: minY\n    }];\n  });\n}\n\nfunction getTransformMatrix(rect, bbox, matrix) {\n  const [minX, minY, maxX, maxY] = _util.Util.getAxialAlignedBoundingBox(bbox, matrix);\n\n  if (minX === maxX || minY === maxY) {\n    return [1, 0, 0, 1, rect[0], rect[1]];\n  }\n\n  const xRatio = (rect[2] - rect[0]) / (maxX - minX);\n  const yRatio = (rect[3] - rect[1]) / (maxY - minY);\n  return [xRatio, 0, 0, yRatio, rect[0] - minX * xRatio, rect[1] - minY * yRatio];\n}\n\nclass Annotation {\n  constructor(params) {\n    const dict = params.dict;\n    this.setContents(dict.get(\"Contents\"));\n    this.setModificationDate(dict.get(\"M\"));\n    this.setFlags(dict.get(\"F\"));\n    this.setRectangle(dict.getArray(\"Rect\"));\n    this.setColor(dict.getArray(\"C\"));\n    this.setBorderStyle(dict);\n    this.setAppearance(dict);\n    this._streams = [];\n\n    if (this.appearance) {\n      this._streams.push(this.appearance);\n    }\n\n    this.data = {\n      annotationFlags: this.flags,\n      borderStyle: this.borderStyle,\n      color: this.color,\n      contents: this.contents,\n      hasAppearance: !!this.appearance,\n      id: params.id,\n      modificationDate: this.modificationDate,\n      rect: this.rectangle,\n      subtype: params.subtype\n    };\n\n    if (params.collectFields) {\n      const kids = dict.get(\"Kids\");\n\n      if (Array.isArray(kids)) {\n        const kidIds = [];\n\n        for (const kid of kids) {\n          if ((0, _primitives.isRef)(kid)) {\n            kidIds.push(kid.toString());\n          }\n        }\n\n        if (kidIds.length !== 0) {\n          this.data.kidIds = kidIds;\n        }\n      }\n\n      this.data.actions = (0, _core_utils.collectActions)(params.xref, dict, _util.AnnotationActionEventType);\n      this.data.fieldName = this._constructFieldName(dict);\n    }\n\n    this._fallbackFontDict = null;\n  }\n\n  _hasFlag(flags, flag) {\n    return !!(flags & flag);\n  }\n\n  _isViewable(flags) {\n    return !this._hasFlag(flags, _util.AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, _util.AnnotationFlag.NOVIEW);\n  }\n\n  _isPrintable(flags) {\n    return this._hasFlag(flags, _util.AnnotationFlag.PRINT) && !this._hasFlag(flags, _util.AnnotationFlag.INVISIBLE);\n  }\n\n  isHidden(annotationStorage) {\n    const storageEntry = annotationStorage && annotationStorage.get(this.data.id);\n\n    if (storageEntry && storageEntry.hidden !== undefined) {\n      return storageEntry.hidden;\n    }\n\n    return this._hasFlag(this.flags, _util.AnnotationFlag.HIDDEN);\n  }\n\n  get viewable() {\n    if (this.data.quadPoints === null) {\n      return false;\n    }\n\n    if (this.flags === 0) {\n      return true;\n    }\n\n    return this._isViewable(this.flags);\n  }\n\n  get printable() {\n    if (this.data.quadPoints === null) {\n      return false;\n    }\n\n    if (this.flags === 0) {\n      return false;\n    }\n\n    return this._isPrintable(this.flags);\n  }\n\n  setContents(contents) {\n    this.contents = (0, _util.stringToPDFString)(contents || \"\");\n  }\n\n  setModificationDate(modificationDate) {\n    this.modificationDate = (0, _util.isString)(modificationDate) ? modificationDate : null;\n  }\n\n  setFlags(flags) {\n    this.flags = Number.isInteger(flags) && flags > 0 ? flags : 0;\n  }\n\n  hasFlag(flag) {\n    return this._hasFlag(this.flags, flag);\n  }\n\n  setRectangle(rectangle) {\n    if (Array.isArray(rectangle) && rectangle.length === 4) {\n      this.rectangle = _util.Util.normalizeRect(rectangle);\n    } else {\n      this.rectangle = [0, 0, 0, 0];\n    }\n  }\n\n  setColor(color) {\n    this.color = getRgbColor(color);\n  }\n\n  setBorderStyle(borderStyle) {\n    this.borderStyle = new AnnotationBorderStyle();\n\n    if (!(0, _primitives.isDict)(borderStyle)) {\n      return;\n    }\n\n    if (borderStyle.has(\"BS\")) {\n      const dict = borderStyle.get(\"BS\");\n      const dictType = dict.get(\"Type\");\n\n      if (!dictType || (0, _primitives.isName)(dictType, \"Border\")) {\n        this.borderStyle.setWidth(dict.get(\"W\"), this.rectangle);\n        this.borderStyle.setStyle(dict.get(\"S\"));\n        this.borderStyle.setDashArray(dict.getArray(\"D\"));\n      }\n    } else if (borderStyle.has(\"Border\")) {\n      const array = borderStyle.getArray(\"Border\");\n\n      if (Array.isArray(array) && array.length >= 3) {\n        this.borderStyle.setHorizontalCornerRadius(array[0]);\n        this.borderStyle.setVerticalCornerRadius(array[1]);\n        this.borderStyle.setWidth(array[2], this.rectangle);\n\n        if (array.length === 4) {\n          this.borderStyle.setDashArray(array[3]);\n        }\n      }\n    } else {\n      this.borderStyle.setWidth(0);\n    }\n  }\n\n  setAppearance(dict) {\n    this.appearance = null;\n    const appearanceStates = dict.get(\"AP\");\n\n    if (!(0, _primitives.isDict)(appearanceStates)) {\n      return;\n    }\n\n    const normalAppearanceState = appearanceStates.get(\"N\");\n\n    if ((0, _primitives.isStream)(normalAppearanceState)) {\n      this.appearance = normalAppearanceState;\n      return;\n    }\n\n    if (!(0, _primitives.isDict)(normalAppearanceState)) {\n      return;\n    }\n\n    const as = dict.get(\"AS\");\n\n    if (!(0, _primitives.isName)(as) || !normalAppearanceState.has(as.name)) {\n      return;\n    }\n\n    this.appearance = normalAppearanceState.get(as.name);\n  }\n\n  loadResources(keys) {\n    return this.appearance.dict.getAsync(\"Resources\").then(resources => {\n      if (!resources) {\n        return undefined;\n      }\n\n      const objectLoader = new _obj.ObjectLoader(resources, keys, resources.xref);\n      return objectLoader.load().then(function () {\n        return resources;\n      });\n    });\n  }\n\n  getOperatorList(evaluator, task, renderForms, annotationStorage) {\n    if (!this.appearance) {\n      return Promise.resolve(new _operator_list.OperatorList());\n    }\n\n    const appearance = this.appearance;\n    const data = this.data;\n    const appearanceDict = appearance.dict;\n    const resourcesPromise = this.loadResources([\"ExtGState\", \"ColorSpace\", \"Pattern\", \"Shading\", \"XObject\", \"Font\"]);\n    const bbox = appearanceDict.getArray(\"BBox\") || [0, 0, 1, 1];\n    const matrix = appearanceDict.getArray(\"Matrix\") || [1, 0, 0, 1, 0, 0];\n    const transform = getTransformMatrix(data.rect, bbox, matrix);\n    return resourcesPromise.then(resources => {\n      const opList = new _operator_list.OperatorList();\n      opList.addOp(_util.OPS.beginAnnotation, [data.rect, transform, matrix]);\n      return evaluator.getOperatorList({\n        stream: appearance,\n        task,\n        resources,\n        operatorList: opList,\n        fallbackFontDict: this._fallbackFontDict\n      }).then(() => {\n        opList.addOp(_util.OPS.endAnnotation, []);\n        this.reset();\n        return opList;\n      });\n    });\n  }\n\n  async save(evaluator, task, annotationStorage) {\n    return null;\n  }\n\n  getFieldObject() {\n    if (this.data.kidIds) {\n      return {\n        id: this.data.id,\n        actions: this.data.actions,\n        name: this.data.fieldName,\n        type: \"\",\n        kidIds: this.data.kidIds\n      };\n    }\n\n    return null;\n  }\n\n  reset() {\n    for (const stream of this._streams) {\n      stream.reset();\n    }\n  }\n\n  _constructFieldName(dict) {\n    if (!dict.has(\"T\") && !dict.has(\"Parent\")) {\n      (0, _util.warn)(\"Unknown field name, falling back to empty field name.\");\n      return \"\";\n    }\n\n    if (!dict.has(\"Parent\")) {\n      return (0, _util.stringToPDFString)(dict.get(\"T\"));\n    }\n\n    const fieldName = [];\n\n    if (dict.has(\"T\")) {\n      fieldName.unshift((0, _util.stringToPDFString)(dict.get(\"T\")));\n    }\n\n    let loopDict = dict;\n    const visited = new _primitives.RefSet();\n\n    if (dict.objId) {\n      visited.put(dict.objId);\n    }\n\n    while (loopDict.has(\"Parent\")) {\n      loopDict = loopDict.get(\"Parent\");\n\n      if (!(loopDict instanceof _primitives.Dict) || loopDict.objId && visited.has(loopDict.objId)) {\n        break;\n      }\n\n      if (loopDict.objId) {\n        visited.put(loopDict.objId);\n      }\n\n      if (loopDict.has(\"T\")) {\n        fieldName.unshift((0, _util.stringToPDFString)(loopDict.get(\"T\")));\n      }\n    }\n\n    return fieldName.join(\".\");\n  }\n\n}\n\nexports.Annotation = Annotation;\n\nclass AnnotationBorderStyle {\n  constructor() {\n    this.width = 1;\n    this.style = _util.AnnotationBorderStyleType.SOLID;\n    this.dashArray = [3];\n    this.horizontalCornerRadius = 0;\n    this.verticalCornerRadius = 0;\n  }\n\n  setWidth(width, rect = [0, 0, 0, 0]) {\n    if ((0, _primitives.isName)(width)) {\n      this.width = 0;\n      return;\n    }\n\n    if (Number.isInteger(width)) {\n      if (width > 0) {\n        const maxWidth = (rect[2] - rect[0]) / 2;\n        const maxHeight = (rect[3] - rect[1]) / 2;\n\n        if (maxWidth > 0 && maxHeight > 0 && (width > maxWidth || width > maxHeight)) {\n          (0, _util.warn)(`AnnotationBorderStyle.setWidth - ignoring width: ${width}`);\n          width = 1;\n        }\n      }\n\n      this.width = width;\n    }\n  }\n\n  setStyle(style) {\n    if (!(0, _primitives.isName)(style)) {\n      return;\n    }\n\n    switch (style.name) {\n      case \"S\":\n        this.style = _util.AnnotationBorderStyleType.SOLID;\n        break;\n\n      case \"D\":\n        this.style = _util.AnnotationBorderStyleType.DASHED;\n        break;\n\n      case \"B\":\n        this.style = _util.AnnotationBorderStyleType.BEVELED;\n        break;\n\n      case \"I\":\n        this.style = _util.AnnotationBorderStyleType.INSET;\n        break;\n\n      case \"U\":\n        this.style = _util.AnnotationBorderStyleType.UNDERLINE;\n        break;\n\n      default:\n        break;\n    }\n  }\n\n  setDashArray(dashArray) {\n    if (Array.isArray(dashArray) && dashArray.length > 0) {\n      let isValid = true;\n      let allZeros = true;\n\n      for (const element of dashArray) {\n        const validNumber = +element >= 0;\n\n        if (!validNumber) {\n          isValid = false;\n          break;\n        } else if (element > 0) {\n          allZeros = false;\n        }\n      }\n\n      if (isValid && !allZeros) {\n        this.dashArray = dashArray;\n      } else {\n        this.width = 0;\n      }\n    } else if (dashArray) {\n      this.width = 0;\n    }\n  }\n\n  setHorizontalCornerRadius(radius) {\n    if (Number.isInteger(radius)) {\n      this.horizontalCornerRadius = radius;\n    }\n  }\n\n  setVerticalCornerRadius(radius) {\n    if (Number.isInteger(radius)) {\n      this.verticalCornerRadius = radius;\n    }\n  }\n\n}\n\nexports.AnnotationBorderStyle = AnnotationBorderStyle;\n\nclass MarkupAnnotation extends Annotation {\n  constructor(parameters) {\n    super(parameters);\n    const dict = parameters.dict;\n\n    if (dict.has(\"IRT\")) {\n      const rawIRT = dict.getRaw(\"IRT\");\n      this.data.inReplyTo = (0, _primitives.isRef)(rawIRT) ? rawIRT.toString() : null;\n      const rt = dict.get(\"RT\");\n      this.data.replyType = (0, _primitives.isName)(rt) ? rt.name : _util.AnnotationReplyType.REPLY;\n    }\n\n    if (this.data.replyType === _util.AnnotationReplyType.GROUP) {\n      const parent = dict.get(\"IRT\");\n      this.data.title = (0, _util.stringToPDFString)(parent.get(\"T\") || \"\");\n      this.setContents(parent.get(\"Contents\"));\n      this.data.contents = this.contents;\n\n      if (!parent.has(\"CreationDate\")) {\n        this.data.creationDate = null;\n      } else {\n        this.setCreationDate(parent.get(\"CreationDate\"));\n        this.data.creationDate = this.creationDate;\n      }\n\n      if (!parent.has(\"M\")) {\n        this.data.modificationDate = null;\n      } else {\n        this.setModificationDate(parent.get(\"M\"));\n        this.data.modificationDate = this.modificationDate;\n      }\n\n      this.data.hasPopup = parent.has(\"Popup\");\n\n      if (!parent.has(\"C\")) {\n        this.data.color = null;\n      } else {\n        this.setColor(parent.getArray(\"C\"));\n        this.data.color = this.color;\n      }\n    } else {\n      this.data.title = (0, _util.stringToPDFString)(dict.get(\"T\") || \"\");\n      this.setCreationDate(dict.get(\"CreationDate\"));\n      this.data.creationDate = this.creationDate;\n      this.data.hasPopup = dict.has(\"Popup\");\n\n      if (!dict.has(\"C\")) {\n        this.data.color = null;\n      }\n    }\n  }\n\n  setCreationDate(creationDate) {\n    this.creationDate = (0, _util.isString)(creationDate) ? creationDate : null;\n  }\n\n  _setDefaultAppearance({\n    xref,\n    extra,\n    strokeColor,\n    fillColor,\n    blendMode,\n    pointsCallback\n  }) {\n    let minX = Number.MAX_VALUE;\n    let minY = Number.MAX_VALUE;\n    let maxX = Number.MIN_VALUE;\n    let maxY = Number.MIN_VALUE;\n    const buffer = [\"q\"];\n\n    if (extra) {\n      buffer.push(extra);\n    }\n\n    if (strokeColor) {\n      buffer.push(`${strokeColor[0]} ${strokeColor[1]} ${strokeColor[2]} RG`);\n    }\n\n    if (fillColor) {\n      buffer.push(`${fillColor[0]} ${fillColor[1]} ${fillColor[2]} rg`);\n    }\n\n    let pointsArray = this.data.quadPoints;\n\n    if (!pointsArray) {\n      pointsArray = [[{\n        x: this.rectangle[0],\n        y: this.rectangle[3]\n      }, {\n        x: this.rectangle[2],\n        y: this.rectangle[3]\n      }, {\n        x: this.rectangle[0],\n        y: this.rectangle[1]\n      }, {\n        x: this.rectangle[2],\n        y: this.rectangle[1]\n      }]];\n    }\n\n    for (const points of pointsArray) {\n      const [mX, MX, mY, MY] = pointsCallback(buffer, points);\n      minX = Math.min(minX, mX);\n      maxX = Math.max(maxX, MX);\n      minY = Math.min(minY, mY);\n      maxY = Math.max(maxY, MY);\n    }\n\n    buffer.push(\"Q\");\n    const formDict = new _primitives.Dict(xref);\n    const appearanceStreamDict = new _primitives.Dict(xref);\n    appearanceStreamDict.set(\"Subtype\", _primitives.Name.get(\"Form\"));\n    const appearanceStream = new _stream.StringStream(buffer.join(\" \"));\n    appearanceStream.dict = appearanceStreamDict;\n    formDict.set(\"Fm0\", appearanceStream);\n    const gsDict = new _primitives.Dict(xref);\n\n    if (blendMode) {\n      gsDict.set(\"BM\", _primitives.Name.get(blendMode));\n    }\n\n    const stateDict = new _primitives.Dict(xref);\n    stateDict.set(\"GS0\", gsDict);\n    const resources = new _primitives.Dict(xref);\n    resources.set(\"ExtGState\", stateDict);\n    resources.set(\"XObject\", formDict);\n    const appearanceDict = new _primitives.Dict(xref);\n    appearanceDict.set(\"Resources\", resources);\n    const bbox = this.data.rect = [minX, minY, maxX, maxY];\n    appearanceDict.set(\"BBox\", bbox);\n    this.appearance = new _stream.StringStream(\"/GS0 gs /Fm0 Do\");\n    this.appearance.dict = appearanceDict;\n\n    this._streams.push(this.appearance, appearanceStream);\n  }\n\n}\n\nexports.MarkupAnnotation = MarkupAnnotation;\n\nclass WidgetAnnotation extends Annotation {\n  constructor(params) {\n    super(params);\n    const dict = params.dict;\n    const data = this.data;\n    this.ref = params.ref;\n    data.annotationType = _util.AnnotationType.WIDGET;\n\n    if (data.fieldName === undefined) {\n      data.fieldName = this._constructFieldName(dict);\n    }\n\n    if (data.actions === undefined) {\n      data.actions = (0, _core_utils.collectActions)(params.xref, dict, _util.AnnotationActionEventType);\n    }\n\n    const fieldValue = (0, _core_utils.getInheritableProperty)({\n      dict,\n      key: \"V\",\n      getArray: true\n    });\n    data.fieldValue = this._decodeFormValue(fieldValue);\n    const defaultFieldValue = (0, _core_utils.getInheritableProperty)({\n      dict,\n      key: \"DV\",\n      getArray: true\n    });\n    data.defaultFieldValue = this._decodeFormValue(defaultFieldValue);\n    data.alternativeText = (0, _util.stringToPDFString)(dict.get(\"TU\") || \"\");\n    const defaultAppearance = (0, _core_utils.getInheritableProperty)({\n      dict,\n      key: \"DA\"\n    }) || params.acroForm.get(\"DA\");\n    this._defaultAppearance = (0, _util.isString)(defaultAppearance) ? defaultAppearance : \"\";\n    data.defaultAppearanceData = (0, _default_appearance.parseDefaultAppearance)(this._defaultAppearance);\n    const fieldType = (0, _core_utils.getInheritableProperty)({\n      dict,\n      key: \"FT\"\n    });\n    data.fieldType = (0, _primitives.isName)(fieldType) ? fieldType.name : null;\n    const localResources = (0, _core_utils.getInheritableProperty)({\n      dict,\n      key: \"DR\"\n    });\n    const acroFormResources = params.acroForm.get(\"DR\");\n    const appearanceResources = this.appearance && this.appearance.dict.get(\"Resources\");\n    this._fieldResources = {\n      localResources,\n      acroFormResources,\n      appearanceResources,\n      mergedResources: _primitives.Dict.merge({\n        xref: params.xref,\n        dictArray: [localResources, appearanceResources, acroFormResources],\n        mergeSubDicts: true\n      })\n    };\n    data.fieldFlags = (0, _core_utils.getInheritableProperty)({\n      dict,\n      key: \"Ff\"\n    });\n\n    if (!Number.isInteger(data.fieldFlags) || data.fieldFlags < 0) {\n      data.fieldFlags = 0;\n    }\n\n    data.readOnly = this.hasFieldFlag(_util.AnnotationFieldFlag.READONLY);\n    data.hidden = this._hasFlag(data.annotationFlags, _util.AnnotationFlag.HIDDEN);\n\n    if (data.fieldType === \"Sig\") {\n      data.fieldValue = null;\n      this.setFlags(_util.AnnotationFlag.HIDDEN);\n      data.hidden = true;\n    }\n  }\n\n  _decodeFormValue(formValue) {\n    if (Array.isArray(formValue)) {\n      return formValue.filter(item => (0, _util.isString)(item)).map(item => (0, _util.stringToPDFString)(item));\n    } else if ((0, _primitives.isName)(formValue)) {\n      return (0, _util.stringToPDFString)(formValue.name);\n    } else if ((0, _util.isString)(formValue)) {\n      return (0, _util.stringToPDFString)(formValue);\n    }\n\n    return null;\n  }\n\n  hasFieldFlag(flag) {\n    return !!(this.data.fieldFlags & flag);\n  }\n\n  getOperatorList(evaluator, task, renderForms, annotationStorage) {\n    if (renderForms) {\n      return Promise.resolve(new _operator_list.OperatorList());\n    }\n\n    if (!this._hasText) {\n      return super.getOperatorList(evaluator, task, renderForms, annotationStorage);\n    }\n\n    return this._getAppearance(evaluator, task, annotationStorage).then(content => {\n      if (this.appearance && content === null) {\n        return super.getOperatorList(evaluator, task, renderForms, annotationStorage);\n      }\n\n      const operatorList = new _operator_list.OperatorList();\n\n      if (!this._defaultAppearance || content === null) {\n        return operatorList;\n      }\n\n      const matrix = [1, 0, 0, 1, 0, 0];\n      const bbox = [0, 0, this.data.rect[2] - this.data.rect[0], this.data.rect[3] - this.data.rect[1]];\n      const transform = getTransformMatrix(this.data.rect, bbox, matrix);\n      operatorList.addOp(_util.OPS.beginAnnotation, [this.data.rect, transform, matrix]);\n      const stream = new _stream.StringStream(content);\n      return evaluator.getOperatorList({\n        stream,\n        task,\n        resources: this._fieldResources.mergedResources,\n        operatorList\n      }).then(function () {\n        operatorList.addOp(_util.OPS.endAnnotation, []);\n        return operatorList;\n      });\n    });\n  }\n\n  async save(evaluator, task, annotationStorage) {\n    if (!annotationStorage) {\n      return null;\n    }\n\n    const storageEntry = annotationStorage.get(this.data.id);\n    const value = storageEntry && storageEntry.value;\n\n    if (value === this.data.fieldValue || value === undefined) {\n      return null;\n    }\n\n    let appearance = await this._getAppearance(evaluator, task, annotationStorage);\n\n    if (appearance === null) {\n      return null;\n    }\n\n    const {\n      xref\n    } = evaluator;\n    const dict = xref.fetchIfRef(this.ref);\n\n    if (!(0, _primitives.isDict)(dict)) {\n      return null;\n    }\n\n    const bbox = [0, 0, this.data.rect[2] - this.data.rect[0], this.data.rect[3] - this.data.rect[1]];\n    const xfa = {\n      path: (0, _util.stringToPDFString)(dict.get(\"T\") || \"\"),\n      value\n    };\n    const newRef = xref.getNewRef();\n    const AP = new _primitives.Dict(xref);\n    AP.set(\"N\", newRef);\n    const encrypt = xref.encrypt;\n    let originalTransform = null;\n    let newTransform = null;\n\n    if (encrypt) {\n      originalTransform = encrypt.createCipherTransform(this.ref.num, this.ref.gen);\n      newTransform = encrypt.createCipherTransform(newRef.num, newRef.gen);\n      appearance = newTransform.encryptString(appearance);\n    }\n\n    dict.set(\"V\", (0, _util.isAscii)(value) ? value : (0, _util.stringToUTF16BEString)(value));\n    dict.set(\"AP\", AP);\n    dict.set(\"M\", `D:${(0, _util.getModificationDate)()}`);\n    const appearanceDict = new _primitives.Dict(xref);\n    appearanceDict.set(\"Length\", appearance.length);\n    appearanceDict.set(\"Subtype\", _primitives.Name.get(\"Form\"));\n    appearanceDict.set(\"Resources\", this._getSaveFieldResources(xref));\n    appearanceDict.set(\"BBox\", bbox);\n    const bufferOriginal = [`${this.ref.num} ${this.ref.gen} obj\\n`];\n    (0, _writer.writeDict)(dict, bufferOriginal, originalTransform);\n    bufferOriginal.push(\"\\nendobj\\n\");\n    const bufferNew = [`${newRef.num} ${newRef.gen} obj\\n`];\n    (0, _writer.writeDict)(appearanceDict, bufferNew, newTransform);\n    bufferNew.push(\" stream\\n\");\n    bufferNew.push(appearance);\n    bufferNew.push(\"\\nendstream\\nendobj\\n\");\n    return [{\n      ref: this.ref,\n      data: bufferOriginal.join(\"\"),\n      xfa\n    }, {\n      ref: newRef,\n      data: bufferNew.join(\"\"),\n      xfa: null\n    }];\n  }\n\n  async _getAppearance(evaluator, task, annotationStorage) {\n    const isPassword = this.hasFieldFlag(_util.AnnotationFieldFlag.PASSWORD);\n\n    if (!annotationStorage || isPassword) {\n      return null;\n    }\n\n    const storageEntry = annotationStorage.get(this.data.id);\n    let value = storageEntry && storageEntry.value;\n\n    if (value === undefined) {\n      return null;\n    }\n\n    value = value.trim();\n\n    if (value === \"\") {\n      return \"\";\n    }\n\n    let lineCount = -1;\n\n    if (this.data.multiLine) {\n      lineCount = value.split(/\\r\\n|\\r|\\n/).length;\n    }\n\n    const defaultPadding = 2;\n    const hPadding = defaultPadding;\n    const totalHeight = this.data.rect[3] - this.data.rect[1];\n    const totalWidth = this.data.rect[2] - this.data.rect[0];\n\n    if (!this._defaultAppearance) {\n      this.data.defaultAppearanceData = (0, _default_appearance.parseDefaultAppearance)(this._defaultAppearance = \"/Helvetica 0 Tf 0 g\");\n    }\n\n    const [defaultAppearance, fontSize] = this._computeFontSize(totalHeight, lineCount);\n\n    const font = await this._getFontData(evaluator, task);\n    let descent = font.descent;\n\n    if (isNaN(descent)) {\n      descent = 0;\n    }\n\n    const vPadding = defaultPadding + Math.abs(descent) * fontSize;\n    const alignment = this.data.textAlignment;\n\n    if (this.data.multiLine) {\n      return this._getMultilineAppearance(defaultAppearance, value, font, fontSize, totalWidth, totalHeight, alignment, hPadding, vPadding);\n    }\n\n    const encodedString = font.encodeString(value).join(\"\");\n\n    if (this.data.comb) {\n      return this._getCombAppearance(defaultAppearance, font, encodedString, totalWidth, hPadding, vPadding);\n    }\n\n    if (alignment === 0 || alignment > 2) {\n      return \"/Tx BMC q BT \" + defaultAppearance + ` 1 0 0 1 ${hPadding} ${vPadding} Tm (${(0, _util.escapeString)(encodedString)}) Tj` + \" ET Q EMC\";\n    }\n\n    const renderedText = this._renderText(encodedString, font, fontSize, totalWidth, alignment, hPadding, vPadding);\n\n    return \"/Tx BMC q BT \" + defaultAppearance + ` 1 0 0 1 0 0 Tm ${renderedText}` + \" ET Q EMC\";\n  }\n\n  async _getFontData(evaluator, task) {\n    const operatorList = new _operator_list.OperatorList();\n    const initialState = {\n      font: null,\n\n      clone() {\n        return this;\n      }\n\n    };\n    const {\n      fontName,\n      fontSize\n    } = this.data.defaultAppearanceData;\n    await evaluator.handleSetFont(this._fieldResources.mergedResources, [fontName && _primitives.Name.get(fontName), fontSize], null, operatorList, task, initialState, null);\n    return initialState.font;\n  }\n\n  _computeFontSize(height, lineCount) {\n    let {\n      fontSize\n    } = this.data.defaultAppearanceData;\n\n    if (!fontSize) {\n      const roundWithOneDigit = x => Math.round(x * 10) / 10;\n\n      const FONT_FACTOR = 0.8;\n\n      if (lineCount === -1) {\n        fontSize = roundWithOneDigit(FONT_FACTOR * height);\n      } else {\n        fontSize = 10;\n        let lineHeight = fontSize / FONT_FACTOR;\n        let numberOfLines = Math.round(height / lineHeight);\n        numberOfLines = Math.max(numberOfLines, lineCount);\n        lineHeight = height / numberOfLines;\n        fontSize = roundWithOneDigit(FONT_FACTOR * lineHeight);\n      }\n\n      const {\n        fontName,\n        fontColor\n      } = this.data.defaultAppearanceData;\n      this._defaultAppearance = (0, _default_appearance.createDefaultAppearance)({\n        fontSize,\n        fontName,\n        fontColor\n      });\n    }\n\n    return [this._defaultAppearance, fontSize];\n  }\n\n  _renderText(text, font, fontSize, totalWidth, alignment, hPadding, vPadding) {\n    const glyphs = font.charsToGlyphs(text);\n    const scale = fontSize / 1000;\n    let width = 0;\n\n    for (const glyph of glyphs) {\n      width += glyph.width * scale;\n    }\n\n    let shift;\n\n    if (alignment === 1) {\n      shift = (totalWidth - width) / 2;\n    } else if (alignment === 2) {\n      shift = totalWidth - width - hPadding;\n    } else {\n      shift = hPadding;\n    }\n\n    shift = shift.toFixed(2);\n    vPadding = vPadding.toFixed(2);\n    return `${shift} ${vPadding} Td (${(0, _util.escapeString)(text)}) Tj`;\n  }\n\n  _getSaveFieldResources(xref) {\n    const {\n      localResources,\n      appearanceResources,\n      acroFormResources\n    } = this._fieldResources;\n    const fontName = this.data.defaultAppearanceData && this.data.defaultAppearanceData.fontName;\n\n    if (!fontName) {\n      return localResources || _primitives.Dict.empty;\n    }\n\n    for (const resources of [localResources, appearanceResources]) {\n      if (resources instanceof _primitives.Dict) {\n        const localFont = resources.get(\"Font\");\n\n        if (localFont instanceof _primitives.Dict && localFont.has(fontName)) {\n          return resources;\n        }\n      }\n    }\n\n    if (acroFormResources instanceof _primitives.Dict) {\n      const acroFormFont = acroFormResources.get(\"Font\");\n\n      if (acroFormFont instanceof _primitives.Dict && acroFormFont.has(fontName)) {\n        const subFontDict = new _primitives.Dict(xref);\n        subFontDict.set(fontName, acroFormFont.getRaw(fontName));\n        const subResourcesDict = new _primitives.Dict(xref);\n        subResourcesDict.set(\"Font\", subFontDict);\n        return _primitives.Dict.merge({\n          xref,\n          dictArray: [subResourcesDict, localResources],\n          mergeSubDicts: true\n        });\n      }\n    }\n\n    return localResources || _primitives.Dict.empty;\n  }\n\n  getFieldObject() {\n    if (this.data.fieldType === \"Sig\") {\n      return {\n        id: this.data.id,\n        value: null,\n        type: \"signature\"\n      };\n    }\n\n    return null;\n  }\n\n}\n\nclass TextWidgetAnnotation extends WidgetAnnotation {\n  constructor(params) {\n    super(params);\n    this._hasText = true;\n    const dict = params.dict;\n\n    if (!(0, _util.isString)(this.data.fieldValue)) {\n      this.data.fieldValue = \"\";\n    }\n\n    let alignment = (0, _core_utils.getInheritableProperty)({\n      dict,\n      key: \"Q\"\n    });\n\n    if (!Number.isInteger(alignment) || alignment < 0 || alignment > 2) {\n      alignment = null;\n    }\n\n    this.data.textAlignment = alignment;\n    let maximumLength = (0, _core_utils.getInheritableProperty)({\n      dict,\n      key: \"MaxLen\"\n    });\n\n    if (!Number.isInteger(maximumLength) || maximumLength < 0) {\n      maximumLength = null;\n    }\n\n    this.data.maxLen = maximumLength;\n    this.data.multiLine = this.hasFieldFlag(_util.AnnotationFieldFlag.MULTILINE);\n    this.data.comb = this.hasFieldFlag(_util.AnnotationFieldFlag.COMB) && !this.hasFieldFlag(_util.AnnotationFieldFlag.MULTILINE) && !this.hasFieldFlag(_util.AnnotationFieldFlag.PASSWORD) && !this.hasFieldFlag(_util.AnnotationFieldFlag.FILESELECT) && this.data.maxLen !== null;\n  }\n\n  _getCombAppearance(defaultAppearance, font, text, width, hPadding, vPadding) {\n    const combWidth = (width / this.data.maxLen).toFixed(2);\n    const buf = [];\n    const positions = font.getCharPositions(text);\n\n    for (const [start, end] of positions) {\n      buf.push(`(${(0, _util.escapeString)(text.substring(start, end))}) Tj`);\n    }\n\n    const renderedComb = buf.join(` ${combWidth} 0 Td `);\n    return \"/Tx BMC q BT \" + defaultAppearance + ` 1 0 0 1 ${hPadding} ${vPadding} Tm ${renderedComb}` + \" ET Q EMC\";\n  }\n\n  _getMultilineAppearance(defaultAppearance, text, font, fontSize, width, height, alignment, hPadding, vPadding) {\n    const lines = text.split(/\\r\\n|\\r|\\n/);\n    const buf = [];\n    const totalWidth = width - 2 * hPadding;\n\n    for (const line of lines) {\n      const chunks = this._splitLine(line, font, fontSize, totalWidth);\n\n      for (const chunk of chunks) {\n        const padding = buf.length === 0 ? hPadding : 0;\n        buf.push(this._renderText(chunk, font, fontSize, width, alignment, padding, -fontSize));\n      }\n    }\n\n    const renderedText = buf.join(\"\\n\");\n    return \"/Tx BMC q BT \" + defaultAppearance + ` 1 0 0 1 0 ${height} Tm ${renderedText}` + \" ET Q EMC\";\n  }\n\n  _splitLine(line, font, fontSize, width) {\n    line = font.encodeString(line).join(\"\");\n    const glyphs = font.charsToGlyphs(line);\n\n    if (glyphs.length <= 1) {\n      return [line];\n    }\n\n    const positions = font.getCharPositions(line);\n    const scale = fontSize / 1000;\n    const chunks = [];\n    let lastSpacePosInStringStart = -1,\n        lastSpacePosInStringEnd = -1,\n        lastSpacePos = -1,\n        startChunk = 0,\n        currentWidth = 0;\n\n    for (let i = 0, ii = glyphs.length; i < ii; i++) {\n      const [start, end] = positions[i];\n      const glyph = glyphs[i];\n      const glyphWidth = glyph.width * scale;\n\n      if (glyph.unicode === \" \") {\n        if (currentWidth + glyphWidth > width) {\n          chunks.push(line.substring(startChunk, start));\n          startChunk = start;\n          currentWidth = glyphWidth;\n          lastSpacePosInStringStart = -1;\n          lastSpacePos = -1;\n        } else {\n          currentWidth += glyphWidth;\n          lastSpacePosInStringStart = start;\n          lastSpacePosInStringEnd = end;\n          lastSpacePos = i;\n        }\n      } else {\n        if (currentWidth + glyphWidth > width) {\n          if (lastSpacePosInStringStart !== -1) {\n            chunks.push(line.substring(startChunk, lastSpacePosInStringEnd));\n            startChunk = lastSpacePosInStringEnd;\n            i = lastSpacePos + 1;\n            lastSpacePosInStringStart = -1;\n            currentWidth = 0;\n          } else {\n            chunks.push(line.substring(startChunk, start));\n            startChunk = start;\n            currentWidth = glyphWidth;\n          }\n        } else {\n          currentWidth += glyphWidth;\n        }\n      }\n    }\n\n    if (startChunk < line.length) {\n      chunks.push(line.substring(startChunk, line.length));\n    }\n\n    return chunks;\n  }\n\n  getFieldObject() {\n    return {\n      id: this.data.id,\n      value: this.data.fieldValue,\n      defaultValue: this.data.defaultFieldValue,\n      multiline: this.data.multiLine,\n      password: this.hasFieldFlag(_util.AnnotationFieldFlag.PASSWORD),\n      charLimit: this.data.maxLen,\n      comb: this.data.comb,\n      editable: !this.data.readOnly,\n      hidden: this.data.hidden,\n      name: this.data.fieldName,\n      rect: this.data.rect,\n      actions: this.data.actions,\n      type: \"text\"\n    };\n  }\n\n}\n\nclass ButtonWidgetAnnotation extends WidgetAnnotation {\n  constructor(params) {\n    super(params);\n    this.checkedAppearance = null;\n    this.uncheckedAppearance = null;\n    this.data.checkBox = !this.hasFieldFlag(_util.AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON);\n    this.data.radioButton = this.hasFieldFlag(_util.AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON);\n    this.data.pushButton = this.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON);\n    this.data.isTooltipOnly = false;\n\n    if (this.data.checkBox) {\n      this._processCheckBox(params);\n    } else if (this.data.radioButton) {\n      this._processRadioButton(params);\n    } else if (this.data.pushButton) {\n      this._processPushButton(params);\n    } else {\n      (0, _util.warn)(\"Invalid field flags for button widget annotation\");\n    }\n  }\n\n  getOperatorList(evaluator, task, renderForms, annotationStorage) {\n    if (this.data.pushButton) {\n      return super.getOperatorList(evaluator, task, false, annotationStorage);\n    }\n\n    if (annotationStorage) {\n      const storageEntry = annotationStorage.get(this.data.id);\n      const value = storageEntry && storageEntry.value;\n\n      if (value === undefined) {\n        return super.getOperatorList(evaluator, task, renderForms, annotationStorage);\n      }\n\n      let appearance;\n\n      if (value) {\n        appearance = this.checkedAppearance;\n      } else {\n        appearance = this.uncheckedAppearance;\n      }\n\n      if (appearance) {\n        const savedAppearance = this.appearance;\n        this.appearance = appearance;\n        const operatorList = super.getOperatorList(evaluator, task, renderForms, annotationStorage);\n        this.appearance = savedAppearance;\n        return operatorList;\n      }\n\n      return Promise.resolve(new _operator_list.OperatorList());\n    }\n\n    return super.getOperatorList(evaluator, task, renderForms, annotationStorage);\n  }\n\n  async save(evaluator, task, annotationStorage) {\n    if (this.data.checkBox) {\n      return this._saveCheckbox(evaluator, task, annotationStorage);\n    }\n\n    if (this.data.radioButton) {\n      return this._saveRadioButton(evaluator, task, annotationStorage);\n    }\n\n    return null;\n  }\n\n  async _saveCheckbox(evaluator, task, annotationStorage) {\n    if (!annotationStorage) {\n      return null;\n    }\n\n    const storageEntry = annotationStorage.get(this.data.id);\n    const value = storageEntry && storageEntry.value;\n\n    if (value === undefined) {\n      return null;\n    }\n\n    const defaultValue = this.data.fieldValue && this.data.fieldValue !== \"Off\";\n\n    if (defaultValue === value) {\n      return null;\n    }\n\n    const dict = evaluator.xref.fetchIfRef(this.ref);\n\n    if (!(0, _primitives.isDict)(dict)) {\n      return null;\n    }\n\n    const xfa = {\n      path: (0, _util.stringToPDFString)(dict.get(\"T\") || \"\"),\n      value: value ? this.data.exportValue : \"\"\n    };\n\n    const name = _primitives.Name.get(value ? this.data.exportValue : \"Off\");\n\n    dict.set(\"V\", name);\n    dict.set(\"AS\", name);\n    dict.set(\"M\", `D:${(0, _util.getModificationDate)()}`);\n    const encrypt = evaluator.xref.encrypt;\n    let originalTransform = null;\n\n    if (encrypt) {\n      originalTransform = encrypt.createCipherTransform(this.ref.num, this.ref.gen);\n    }\n\n    const buffer = [`${this.ref.num} ${this.ref.gen} obj\\n`];\n    (0, _writer.writeDict)(dict, buffer, originalTransform);\n    buffer.push(\"\\nendobj\\n\");\n    return [{\n      ref: this.ref,\n      data: buffer.join(\"\"),\n      xfa\n    }];\n  }\n\n  async _saveRadioButton(evaluator, task, annotationStorage) {\n    if (!annotationStorage) {\n      return null;\n    }\n\n    const storageEntry = annotationStorage.get(this.data.id);\n    const value = storageEntry && storageEntry.value;\n\n    if (value === undefined) {\n      return null;\n    }\n\n    const defaultValue = this.data.fieldValue === this.data.buttonValue;\n\n    if (defaultValue === value) {\n      return null;\n    }\n\n    const dict = evaluator.xref.fetchIfRef(this.ref);\n\n    if (!(0, _primitives.isDict)(dict)) {\n      return null;\n    }\n\n    const xfa = {\n      path: (0, _util.stringToPDFString)(dict.get(\"T\") || \"\"),\n      value: value ? this.data.buttonValue : \"\"\n    };\n\n    const name = _primitives.Name.get(value ? this.data.buttonValue : \"Off\");\n\n    let parentBuffer = null;\n    const encrypt = evaluator.xref.encrypt;\n\n    if (value) {\n      if ((0, _primitives.isRef)(this.parent)) {\n        const parent = evaluator.xref.fetch(this.parent);\n        let parentTransform = null;\n\n        if (encrypt) {\n          parentTransform = encrypt.createCipherTransform(this.parent.num, this.parent.gen);\n        }\n\n        parent.set(\"V\", name);\n        parentBuffer = [`${this.parent.num} ${this.parent.gen} obj\\n`];\n        (0, _writer.writeDict)(parent, parentBuffer, parentTransform);\n        parentBuffer.push(\"\\nendobj\\n\");\n      } else if ((0, _primitives.isDict)(this.parent)) {\n        this.parent.set(\"V\", name);\n      }\n    }\n\n    dict.set(\"AS\", name);\n    dict.set(\"M\", `D:${(0, _util.getModificationDate)()}`);\n    let originalTransform = null;\n\n    if (encrypt) {\n      originalTransform = encrypt.createCipherTransform(this.ref.num, this.ref.gen);\n    }\n\n    const buffer = [`${this.ref.num} ${this.ref.gen} obj\\n`];\n    (0, _writer.writeDict)(dict, buffer, originalTransform);\n    buffer.push(\"\\nendobj\\n\");\n    const newRefs = [{\n      ref: this.ref,\n      data: buffer.join(\"\"),\n      xfa\n    }];\n\n    if (parentBuffer !== null) {\n      newRefs.push({\n        ref: this.parent,\n        data: parentBuffer.join(\"\"),\n        xfa: null\n      });\n    }\n\n    return newRefs;\n  }\n\n  _processCheckBox(params) {\n    const customAppearance = params.dict.get(\"AP\");\n\n    if (!(0, _primitives.isDict)(customAppearance)) {\n      return;\n    }\n\n    const normalAppearance = customAppearance.get(\"N\");\n\n    if (!(0, _primitives.isDict)(normalAppearance)) {\n      return;\n    }\n\n    const exportValues = normalAppearance.getKeys();\n\n    if (!exportValues.includes(\"Off\")) {\n      exportValues.push(\"Off\");\n    }\n\n    if (exportValues.length !== 2) {\n      return;\n    }\n\n    this.data.exportValue = exportValues[0] === \"Off\" ? exportValues[1] : exportValues[0];\n    this.checkedAppearance = normalAppearance.get(this.data.exportValue);\n    this.uncheckedAppearance = normalAppearance.get(\"Off\") || null;\n\n    this._streams.push(this.checkedAppearance);\n\n    if (this.uncheckedAppearance) {\n      this._streams.push(this.uncheckedAppearance);\n    }\n\n    this._fallbackFontDict = this.fallbackFontDict;\n  }\n\n  _processRadioButton(params) {\n    this.data.fieldValue = this.data.buttonValue = null;\n    const fieldParent = params.dict.get(\"Parent\");\n\n    if ((0, _primitives.isDict)(fieldParent)) {\n      this.parent = params.dict.getRaw(\"Parent\");\n      const fieldParentValue = fieldParent.get(\"V\");\n\n      if ((0, _primitives.isName)(fieldParentValue)) {\n        this.data.fieldValue = this._decodeFormValue(fieldParentValue);\n      }\n    }\n\n    const appearanceStates = params.dict.get(\"AP\");\n\n    if (!(0, _primitives.isDict)(appearanceStates)) {\n      return;\n    }\n\n    const normalAppearance = appearanceStates.get(\"N\");\n\n    if (!(0, _primitives.isDict)(normalAppearance)) {\n      return;\n    }\n\n    for (const key of normalAppearance.getKeys()) {\n      if (key !== \"Off\") {\n        this.data.buttonValue = this._decodeFormValue(key);\n        break;\n      }\n    }\n\n    this.checkedAppearance = normalAppearance.get(this.data.buttonValue);\n    this.uncheckedAppearance = normalAppearance.get(\"Off\") || null;\n\n    this._streams.push(this.checkedAppearance);\n\n    if (this.uncheckedAppearance) {\n      this._streams.push(this.uncheckedAppearance);\n    }\n\n    this._fallbackFontDict = this.fallbackFontDict;\n  }\n\n  _processPushButton(params) {\n    if (!params.dict.has(\"A\") && !params.dict.has(\"AA\") && !this.data.alternativeText) {\n      (0, _util.warn)(\"Push buttons without action dictionaries are not supported\");\n      return;\n    }\n\n    this.data.isTooltipOnly = !params.dict.has(\"A\") && !params.dict.has(\"AA\");\n\n    _obj.Catalog.parseDestDictionary({\n      destDict: params.dict,\n      resultObj: this.data,\n      docBaseUrl: params.pdfManager.docBaseUrl\n    });\n  }\n\n  getFieldObject() {\n    let type = \"button\";\n    let exportValues;\n\n    if (this.data.checkBox) {\n      type = \"checkbox\";\n      exportValues = this.data.exportValue;\n    } else if (this.data.radioButton) {\n      type = \"radiobutton\";\n      exportValues = this.data.buttonValue;\n    }\n\n    return {\n      id: this.data.id,\n      value: this.data.fieldValue || \"Off\",\n      defaultValue: this.data.defaultFieldValue,\n      exportValues,\n      editable: !this.data.readOnly,\n      name: this.data.fieldName,\n      rect: this.data.rect,\n      hidden: this.data.hidden,\n      actions: this.data.actions,\n      type\n    };\n  }\n\n  get fallbackFontDict() {\n    const dict = new _primitives.Dict();\n    dict.set(\"BaseFont\", _primitives.Name.get(\"ZapfDingbats\"));\n    dict.set(\"Type\", _primitives.Name.get(\"FallbackType\"));\n    dict.set(\"Subtype\", _primitives.Name.get(\"FallbackType\"));\n    dict.set(\"Encoding\", _primitives.Name.get(\"ZapfDingbatsEncoding\"));\n    return (0, _util.shadow)(this, \"fallbackFontDict\", dict);\n  }\n\n}\n\nclass ChoiceWidgetAnnotation extends WidgetAnnotation {\n  constructor(params) {\n    super(params);\n    this.data.options = [];\n    const options = (0, _core_utils.getInheritableProperty)({\n      dict: params.dict,\n      key: \"Opt\"\n    });\n\n    if (Array.isArray(options)) {\n      const xref = params.xref;\n\n      for (let i = 0, ii = options.length; i < ii; i++) {\n        const option = xref.fetchIfRef(options[i]);\n        const isOptionArray = Array.isArray(option);\n        this.data.options[i] = {\n          exportValue: this._decodeFormValue(isOptionArray ? xref.fetchIfRef(option[0]) : option),\n          displayValue: this._decodeFormValue(isOptionArray ? xref.fetchIfRef(option[1]) : option)\n        };\n      }\n    }\n\n    if ((0, _util.isString)(this.data.fieldValue)) {\n      this.data.fieldValue = [this.data.fieldValue];\n    } else if (!this.data.fieldValue) {\n      this.data.fieldValue = [];\n    }\n\n    this.data.combo = this.hasFieldFlag(_util.AnnotationFieldFlag.COMBO);\n    this.data.multiSelect = this.hasFieldFlag(_util.AnnotationFieldFlag.MULTISELECT);\n    this._hasText = true;\n  }\n\n  getFieldObject() {\n    const type = this.data.combo ? \"combobox\" : \"listbox\";\n    const value = this.data.fieldValue.length > 0 ? this.data.fieldValue[0] : null;\n    return {\n      id: this.data.id,\n      value,\n      defaultValue: this.data.defaultFieldValue,\n      editable: !this.data.readOnly,\n      name: this.data.fieldName,\n      rect: this.data.rect,\n      numItems: this.data.fieldValue.length,\n      multipleSelection: this.data.multiSelect,\n      hidden: this.data.hidden,\n      actions: this.data.actions,\n      items: this.data.options,\n      type\n    };\n  }\n\n}\n\nclass TextAnnotation extends MarkupAnnotation {\n  constructor(parameters) {\n    const DEFAULT_ICON_SIZE = 22;\n    super(parameters);\n    const dict = parameters.dict;\n    this.data.annotationType = _util.AnnotationType.TEXT;\n\n    if (this.data.hasAppearance) {\n      this.data.name = \"NoIcon\";\n    } else {\n      this.data.rect[1] = this.data.rect[3] - DEFAULT_ICON_SIZE;\n      this.data.rect[2] = this.data.rect[0] + DEFAULT_ICON_SIZE;\n      this.data.name = dict.has(\"Name\") ? dict.get(\"Name\").name : \"Note\";\n    }\n\n    if (dict.has(\"State\")) {\n      this.data.state = dict.get(\"State\") || null;\n      this.data.stateModel = dict.get(\"StateModel\") || null;\n    } else {\n      this.data.state = null;\n      this.data.stateModel = null;\n    }\n  }\n\n}\n\nclass LinkAnnotation extends Annotation {\n  constructor(params) {\n    super(params);\n    this.data.annotationType = _util.AnnotationType.LINK;\n    const quadPoints = getQuadPoints(params.dict, this.rectangle);\n\n    if (quadPoints) {\n      this.data.quadPoints = quadPoints;\n    }\n\n    _obj.Catalog.parseDestDictionary({\n      destDict: params.dict,\n      resultObj: this.data,\n      docBaseUrl: params.pdfManager.docBaseUrl\n    });\n  }\n\n}\n\nclass PopupAnnotation extends Annotation {\n  constructor(parameters) {\n    super(parameters);\n    this.data.annotationType = _util.AnnotationType.POPUP;\n    let parentItem = parameters.dict.get(\"Parent\");\n\n    if (!parentItem) {\n      (0, _util.warn)(\"Popup annotation has a missing or invalid parent annotation.\");\n      return;\n    }\n\n    const parentSubtype = parentItem.get(\"Subtype\");\n    this.data.parentType = (0, _primitives.isName)(parentSubtype) ? parentSubtype.name : null;\n    const rawParent = parameters.dict.getRaw(\"Parent\");\n    this.data.parentId = (0, _primitives.isRef)(rawParent) ? rawParent.toString() : null;\n    const parentRect = parentItem.getArray(\"Rect\");\n\n    if (Array.isArray(parentRect) && parentRect.length === 4) {\n      this.data.parentRect = _util.Util.normalizeRect(parentRect);\n    } else {\n      this.data.parentRect = [0, 0, 0, 0];\n    }\n\n    const rt = parentItem.get(\"RT\");\n\n    if ((0, _primitives.isName)(rt, _util.AnnotationReplyType.GROUP)) {\n      parentItem = parentItem.get(\"IRT\");\n    }\n\n    if (!parentItem.has(\"M\")) {\n      this.data.modificationDate = null;\n    } else {\n      this.setModificationDate(parentItem.get(\"M\"));\n      this.data.modificationDate = this.modificationDate;\n    }\n\n    if (!parentItem.has(\"C\")) {\n      this.data.color = null;\n    } else {\n      this.setColor(parentItem.getArray(\"C\"));\n      this.data.color = this.color;\n    }\n\n    if (!this.viewable) {\n      const parentFlags = parentItem.get(\"F\");\n\n      if (this._isViewable(parentFlags)) {\n        this.setFlags(parentFlags);\n      }\n    }\n\n    this.data.title = (0, _util.stringToPDFString)(parentItem.get(\"T\") || \"\");\n    this.data.contents = (0, _util.stringToPDFString)(parentItem.get(\"Contents\") || \"\");\n  }\n\n}\n\nclass FreeTextAnnotation extends MarkupAnnotation {\n  constructor(parameters) {\n    super(parameters);\n    this.data.annotationType = _util.AnnotationType.FREETEXT;\n  }\n\n}\n\nclass LineAnnotation extends MarkupAnnotation {\n  constructor(parameters) {\n    super(parameters);\n    this.data.annotationType = _util.AnnotationType.LINE;\n    const lineCoordinates = parameters.dict.getArray(\"L\");\n    this.data.lineCoordinates = _util.Util.normalizeRect(lineCoordinates);\n\n    if (!this.appearance) {\n      const strokeColor = this.color ? Array.from(this.color).map(c => c / 255) : [0, 0, 0];\n      const borderWidth = this.borderStyle.width;\n\n      if ((0, _util.isArrayEqual)(this.rectangle, [0, 0, 0, 0])) {\n        this.rectangle = [this.data.lineCoordinates[0] - 2 * borderWidth, this.data.lineCoordinates[1] - 2 * borderWidth, this.data.lineCoordinates[2] + 2 * borderWidth, this.data.lineCoordinates[3] + 2 * borderWidth];\n      }\n\n      this._setDefaultAppearance({\n        xref: parameters.xref,\n        extra: `${borderWidth} w`,\n        strokeColor,\n        pointsCallback: (buffer, points) => {\n          buffer.push(`${lineCoordinates[0]} ${lineCoordinates[1]} m`);\n          buffer.push(`${lineCoordinates[2]} ${lineCoordinates[3]} l`);\n          buffer.push(\"S\");\n          return [points[0].x - borderWidth, points[1].x + borderWidth, points[3].y - borderWidth, points[1].y + borderWidth];\n        }\n      });\n    }\n  }\n\n}\n\nclass SquareAnnotation extends MarkupAnnotation {\n  constructor(parameters) {\n    super(parameters);\n    this.data.annotationType = _util.AnnotationType.SQUARE;\n\n    if (!this.appearance) {\n      const strokeColor = this.color ? Array.from(this.color).map(c => c / 255) : [0, 0, 0];\n      let fillColor = null;\n      let interiorColor = parameters.dict.getArray(\"IC\");\n\n      if (interiorColor) {\n        interiorColor = getRgbColor(interiorColor);\n        fillColor = interiorColor ? Array.from(interiorColor).map(c => c / 255) : null;\n      }\n\n      this._setDefaultAppearance({\n        xref: parameters.xref,\n        extra: `${this.borderStyle.width} w`,\n        strokeColor,\n        fillColor,\n        pointsCallback: (buffer, points) => {\n          const x = points[2].x + this.borderStyle.width / 2;\n          const y = points[2].y + this.borderStyle.width / 2;\n          const width = points[3].x - points[2].x - this.borderStyle.width;\n          const height = points[1].y - points[3].y - this.borderStyle.width;\n          buffer.push(`${x} ${y} ${width} ${height} re`);\n\n          if (fillColor) {\n            buffer.push(\"B\");\n          } else {\n            buffer.push(\"S\");\n          }\n\n          return [points[0].x, points[1].x, points[3].y, points[1].y];\n        }\n      });\n    }\n  }\n\n}\n\nclass CircleAnnotation extends MarkupAnnotation {\n  constructor(parameters) {\n    super(parameters);\n    this.data.annotationType = _util.AnnotationType.CIRCLE;\n\n    if (!this.appearance) {\n      const strokeColor = this.color ? Array.from(this.color).map(c => c / 255) : [0, 0, 0];\n      let fillColor = null;\n      let interiorColor = parameters.dict.getArray(\"IC\");\n\n      if (interiorColor) {\n        interiorColor = getRgbColor(interiorColor);\n        fillColor = interiorColor ? Array.from(interiorColor).map(c => c / 255) : null;\n      }\n\n      const controlPointsDistance = 4 / 3 * Math.tan(Math.PI / (2 * 4));\n\n      this._setDefaultAppearance({\n        xref: parameters.xref,\n        extra: `${this.borderStyle.width} w`,\n        strokeColor,\n        fillColor,\n        pointsCallback: (buffer, points) => {\n          const x0 = points[0].x + this.borderStyle.width / 2;\n          const y0 = points[0].y - this.borderStyle.width / 2;\n          const x1 = points[3].x - this.borderStyle.width / 2;\n          const y1 = points[3].y + this.borderStyle.width / 2;\n          const xMid = x0 + (x1 - x0) / 2;\n          const yMid = y0 + (y1 - y0) / 2;\n          const xOffset = (x1 - x0) / 2 * controlPointsDistance;\n          const yOffset = (y1 - y0) / 2 * controlPointsDistance;\n          buffer.push(`${xMid} ${y1} m`);\n          buffer.push(`${xMid + xOffset} ${y1} ${x1} ${yMid + yOffset} ${x1} ${yMid} c`);\n          buffer.push(`${x1} ${yMid - yOffset} ${xMid + xOffset} ${y0} ${xMid} ${y0} c`);\n          buffer.push(`${xMid - xOffset} ${y0} ${x0} ${yMid - yOffset} ${x0} ${yMid} c`);\n          buffer.push(`${x0} ${yMid + yOffset} ${xMid - xOffset} ${y1} ${xMid} ${y1} c`);\n          buffer.push(\"h\");\n\n          if (fillColor) {\n            buffer.push(\"B\");\n          } else {\n            buffer.push(\"S\");\n          }\n\n          return [points[0].x, points[1].x, points[3].y, points[1].y];\n        }\n      });\n    }\n  }\n\n}\n\nclass PolylineAnnotation extends MarkupAnnotation {\n  constructor(parameters) {\n    super(parameters);\n    this.data.annotationType = _util.AnnotationType.POLYLINE;\n    this.data.vertices = [];\n    const rawVertices = parameters.dict.getArray(\"Vertices\");\n\n    if (!Array.isArray(rawVertices)) {\n      return;\n    }\n\n    for (let i = 0, ii = rawVertices.length; i < ii; i += 2) {\n      this.data.vertices.push({\n        x: rawVertices[i],\n        y: rawVertices[i + 1]\n      });\n    }\n  }\n\n}\n\nclass PolygonAnnotation extends PolylineAnnotation {\n  constructor(parameters) {\n    super(parameters);\n    this.data.annotationType = _util.AnnotationType.POLYGON;\n  }\n\n}\n\nclass CaretAnnotation extends MarkupAnnotation {\n  constructor(parameters) {\n    super(parameters);\n    this.data.annotationType = _util.AnnotationType.CARET;\n  }\n\n}\n\nclass InkAnnotation extends MarkupAnnotation {\n  constructor(parameters) {\n    super(parameters);\n    this.data.annotationType = _util.AnnotationType.INK;\n    this.data.inkLists = [];\n    const rawInkLists = parameters.dict.getArray(\"InkList\");\n\n    if (!Array.isArray(rawInkLists)) {\n      return;\n    }\n\n    const xref = parameters.xref;\n\n    for (let i = 0, ii = rawInkLists.length; i < ii; ++i) {\n      this.data.inkLists.push([]);\n\n      for (let j = 0, jj = rawInkLists[i].length; j < jj; j += 2) {\n        this.data.inkLists[i].push({\n          x: xref.fetchIfRef(rawInkLists[i][j]),\n          y: xref.fetchIfRef(rawInkLists[i][j + 1])\n        });\n      }\n    }\n  }\n\n}\n\nclass HighlightAnnotation extends MarkupAnnotation {\n  constructor(parameters) {\n    super(parameters);\n    this.data.annotationType = _util.AnnotationType.HIGHLIGHT;\n    const quadPoints = this.data.quadPoints = getQuadPoints(parameters.dict, null);\n\n    if (quadPoints) {\n      if (!this.appearance) {\n        const fillColor = this.color ? Array.from(this.color).map(c => c / 255) : [1, 1, 0];\n\n        this._setDefaultAppearance({\n          xref: parameters.xref,\n          fillColor,\n          blendMode: \"Multiply\",\n          pointsCallback: (buffer, points) => {\n            buffer.push(`${points[0].x} ${points[0].y} m`);\n            buffer.push(`${points[1].x} ${points[1].y} l`);\n            buffer.push(`${points[3].x} ${points[3].y} l`);\n            buffer.push(`${points[2].x} ${points[2].y} l`);\n            buffer.push(\"f\");\n            return [points[0].x, points[1].x, points[3].y, points[1].y];\n          }\n        });\n      }\n    } else {\n      this.data.hasPopup = false;\n    }\n  }\n\n}\n\nclass UnderlineAnnotation extends MarkupAnnotation {\n  constructor(parameters) {\n    super(parameters);\n    this.data.annotationType = _util.AnnotationType.UNDERLINE;\n    const quadPoints = this.data.quadPoints = getQuadPoints(parameters.dict, null);\n\n    if (quadPoints) {\n      if (!this.appearance) {\n        const strokeColor = this.color ? Array.from(this.color).map(c => c / 255) : [0, 0, 0];\n\n        this._setDefaultAppearance({\n          xref: parameters.xref,\n          extra: \"[] 0 d 1 w\",\n          strokeColor,\n          pointsCallback: (buffer, points) => {\n            buffer.push(`${points[2].x} ${points[2].y} m`);\n            buffer.push(`${points[3].x} ${points[3].y} l`);\n            buffer.push(\"S\");\n            return [points[0].x, points[1].x, points[3].y, points[1].y];\n          }\n        });\n      }\n    } else {\n      this.data.hasPopup = false;\n    }\n  }\n\n}\n\nclass SquigglyAnnotation extends MarkupAnnotation {\n  constructor(parameters) {\n    super(parameters);\n    this.data.annotationType = _util.AnnotationType.SQUIGGLY;\n    const quadPoints = this.data.quadPoints = getQuadPoints(parameters.dict, null);\n\n    if (quadPoints) {\n      if (!this.appearance) {\n        const strokeColor = this.color ? Array.from(this.color).map(c => c / 255) : [0, 0, 0];\n\n        this._setDefaultAppearance({\n          xref: parameters.xref,\n          extra: \"[] 0 d 1 w\",\n          strokeColor,\n          pointsCallback: (buffer, points) => {\n            const dy = (points[0].y - points[2].y) / 6;\n            let shift = dy;\n            let x = points[2].x;\n            const y = points[2].y;\n            const xEnd = points[3].x;\n            buffer.push(`${x} ${y + shift} m`);\n\n            do {\n              x += 2;\n              shift = shift === 0 ? dy : 0;\n              buffer.push(`${x} ${y + shift} l`);\n            } while (x < xEnd);\n\n            buffer.push(\"S\");\n            return [points[2].x, xEnd, y - 2 * dy, y + 2 * dy];\n          }\n        });\n      }\n    } else {\n      this.data.hasPopup = false;\n    }\n  }\n\n}\n\nclass StrikeOutAnnotation extends MarkupAnnotation {\n  constructor(parameters) {\n    super(parameters);\n    this.data.annotationType = _util.AnnotationType.STRIKEOUT;\n    const quadPoints = this.data.quadPoints = getQuadPoints(parameters.dict, null);\n\n    if (quadPoints) {\n      if (!this.appearance) {\n        const strokeColor = this.color ? Array.from(this.color).map(c => c / 255) : [0, 0, 0];\n\n        this._setDefaultAppearance({\n          xref: parameters.xref,\n          extra: \"[] 0 d 1 w\",\n          strokeColor,\n          pointsCallback: (buffer, points) => {\n            buffer.push(`${(points[0].x + points[2].x) / 2}` + ` ${(points[0].y + points[2].y) / 2} m`);\n            buffer.push(`${(points[1].x + points[3].x) / 2}` + ` ${(points[1].y + points[3].y) / 2} l`);\n            buffer.push(\"S\");\n            return [points[0].x, points[1].x, points[3].y, points[1].y];\n          }\n        });\n      }\n    } else {\n      this.data.hasPopup = false;\n    }\n  }\n\n}\n\nclass StampAnnotation extends MarkupAnnotation {\n  constructor(parameters) {\n    super(parameters);\n    this.data.annotationType = _util.AnnotationType.STAMP;\n  }\n\n}\n\nclass FileAttachmentAnnotation extends MarkupAnnotation {\n  constructor(parameters) {\n    super(parameters);\n    const file = new _obj.FileSpec(parameters.dict.get(\"FS\"), parameters.xref);\n    this.data.annotationType = _util.AnnotationType.FILEATTACHMENT;\n    this.data.file = file.serializable;\n  }\n\n}\n\n/***/ }),\n/* 28 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.createDefaultAppearance = createDefaultAppearance;\nexports.parseDefaultAppearance = parseDefaultAppearance;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _colorspace = __w_pdfjs_require__(23);\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nvar _evaluator = __w_pdfjs_require__(29);\n\nvar _primitives = __w_pdfjs_require__(5);\n\nvar _stream = __w_pdfjs_require__(12);\n\nclass DefaultAppearanceEvaluator extends _evaluator.EvaluatorPreprocessor {\n  constructor(str) {\n    super(new _stream.StringStream(str));\n  }\n\n  parse() {\n    const operation = {\n      fn: 0,\n      args: []\n    };\n    const result = {\n      fontSize: 0,\n      fontName: \"\",\n      fontColor: new Uint8ClampedArray(3)\n    };\n\n    try {\n      while (true) {\n        operation.args.length = 0;\n\n        if (!this.read(operation)) {\n          break;\n        }\n\n        if (this.savedStatesDepth !== 0) {\n          continue;\n        }\n\n        const {\n          fn,\n          args\n        } = operation;\n\n        switch (fn | 0) {\n          case _util.OPS.setFont:\n            const [fontName, fontSize] = args;\n\n            if (fontName instanceof _primitives.Name) {\n              result.fontName = fontName.name;\n            }\n\n            if (typeof fontSize === \"number\" && fontSize > 0) {\n              result.fontSize = fontSize;\n            }\n\n            break;\n\n          case _util.OPS.setFillRGBColor:\n            _colorspace.ColorSpace.singletons.rgb.getRgbItem(args, 0, result.fontColor, 0);\n\n            break;\n\n          case _util.OPS.setFillGray:\n            _colorspace.ColorSpace.singletons.gray.getRgbItem(args, 0, result.fontColor, 0);\n\n            break;\n\n          case _util.OPS.setFillColorSpace:\n            _colorspace.ColorSpace.singletons.cmyk.getRgbItem(args, 0, result.fontColor, 0);\n\n            break;\n        }\n      }\n    } catch (reason) {\n      (0, _util.warn)(`parseDefaultAppearance - ignoring errors: \"${reason}\".`);\n    }\n\n    return result;\n  }\n\n}\n\nfunction parseDefaultAppearance(str) {\n  return new DefaultAppearanceEvaluator(str).parse();\n}\n\nfunction createDefaultAppearance({\n  fontSize,\n  fontName,\n  fontColor\n}) {\n  let colorCmd;\n\n  if (fontColor.every(c => c === 0)) {\n    colorCmd = \"0 g\";\n  } else {\n    colorCmd = Array.from(fontColor).map(c => (c / 255).toFixed(2)).join(\" \") + \" rg\";\n  }\n\n  return `/${(0, _core_utils.escapePDFName)(fontName)} ${fontSize} Tf ${colorCmd}`;\n}\n\n/***/ }),\n/* 29 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PartialEvaluator = exports.EvaluatorPreprocessor = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _cmap = __w_pdfjs_require__(30);\n\nvar _primitives = __w_pdfjs_require__(5);\n\nvar _stream = __w_pdfjs_require__(12);\n\nvar _fonts = __w_pdfjs_require__(31);\n\nvar _encodings = __w_pdfjs_require__(34);\n\nvar _unicode = __w_pdfjs_require__(37);\n\nvar _standard_fonts = __w_pdfjs_require__(36);\n\nvar _pattern = __w_pdfjs_require__(40);\n\nvar _function = __w_pdfjs_require__(41);\n\nvar _parser = __w_pdfjs_require__(11);\n\nvar _image_utils = __w_pdfjs_require__(24);\n\nvar _bidi = __w_pdfjs_require__(43);\n\nvar _colorspace = __w_pdfjs_require__(23);\n\nvar _glyphlist = __w_pdfjs_require__(35);\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nvar _metrics = __w_pdfjs_require__(44);\n\nvar _murmurhash = __w_pdfjs_require__(45);\n\nvar _operator_list = __w_pdfjs_require__(46);\n\nvar _image = __w_pdfjs_require__(47);\n\nconst DefaultPartialEvaluatorOptions = Object.freeze({\n  maxImageSize: -1,\n  disableFontFace: false,\n  ignoreErrors: false,\n  isEvalSupported: true,\n  fontExtraProperties: false\n});\nconst PatternType = {\n  TILING: 1,\n  SHADING: 2\n};\nconst deferred = Promise.resolve();\n\nfunction normalizeBlendMode(value, parsingArray = false) {\n  if (Array.isArray(value)) {\n    for (let i = 0, ii = value.length; i < ii; i++) {\n      const maybeBM = normalizeBlendMode(value[i], true);\n\n      if (maybeBM) {\n        return maybeBM;\n      }\n    }\n\n    (0, _util.warn)(`Unsupported blend mode Array: ${value}`);\n    return \"source-over\";\n  }\n\n  if (!(0, _primitives.isName)(value)) {\n    if (parsingArray) {\n      return null;\n    }\n\n    return \"source-over\";\n  }\n\n  switch (value.name) {\n    case \"Normal\":\n    case \"Compatible\":\n      return \"source-over\";\n\n    case \"Multiply\":\n      return \"multiply\";\n\n    case \"Screen\":\n      return \"screen\";\n\n    case \"Overlay\":\n      return \"overlay\";\n\n    case \"Darken\":\n      return \"darken\";\n\n    case \"Lighten\":\n      return \"lighten\";\n\n    case \"ColorDodge\":\n      return \"color-dodge\";\n\n    case \"ColorBurn\":\n      return \"color-burn\";\n\n    case \"HardLight\":\n      return \"hard-light\";\n\n    case \"SoftLight\":\n      return \"soft-light\";\n\n    case \"Difference\":\n      return \"difference\";\n\n    case \"Exclusion\":\n      return \"exclusion\";\n\n    case \"Hue\":\n      return \"hue\";\n\n    case \"Saturation\":\n      return \"saturation\";\n\n    case \"Color\":\n      return \"color\";\n\n    case \"Luminosity\":\n      return \"luminosity\";\n  }\n\n  if (parsingArray) {\n    return null;\n  }\n\n  (0, _util.warn)(`Unsupported blend mode: ${value.name}`);\n  return \"source-over\";\n}\n\nclass TimeSlotManager {\n  static get TIME_SLOT_DURATION_MS() {\n    return (0, _util.shadow)(this, \"TIME_SLOT_DURATION_MS\", 20);\n  }\n\n  static get CHECK_TIME_EVERY() {\n    return (0, _util.shadow)(this, \"CHECK_TIME_EVERY\", 100);\n  }\n\n  constructor() {\n    this.reset();\n  }\n\n  check() {\n    if (++this.checked < TimeSlotManager.CHECK_TIME_EVERY) {\n      return false;\n    }\n\n    this.checked = 0;\n    return this.endTime <= Date.now();\n  }\n\n  reset() {\n    this.endTime = Date.now() + TimeSlotManager.TIME_SLOT_DURATION_MS;\n    this.checked = 0;\n  }\n\n}\n\nclass PartialEvaluator {\n  constructor({\n    xref,\n    handler,\n    pageIndex,\n    idFactory,\n    fontCache,\n    builtInCMapCache,\n    globalImageCache,\n    options = null\n  }) {\n    this.xref = xref;\n    this.handler = handler;\n    this.pageIndex = pageIndex;\n    this.idFactory = idFactory;\n    this.fontCache = fontCache;\n    this.builtInCMapCache = builtInCMapCache;\n    this.globalImageCache = globalImageCache;\n    this.options = options || DefaultPartialEvaluatorOptions;\n    this.parsingType3Font = false;\n    this._fetchBuiltInCMapBound = this.fetchBuiltInCMap.bind(this);\n  }\n\n  get _pdfFunctionFactory() {\n    const pdfFunctionFactory = new _function.PDFFunctionFactory({\n      xref: this.xref,\n      isEvalSupported: this.options.isEvalSupported\n    });\n    return (0, _util.shadow)(this, \"_pdfFunctionFactory\", pdfFunctionFactory);\n  }\n\n  clone(newOptions = DefaultPartialEvaluatorOptions) {\n    var newEvaluator = Object.create(this);\n    newEvaluator.options = newOptions;\n    return newEvaluator;\n  }\n\n  hasBlendModes(resources, nonBlendModesSet) {\n    if (!(resources instanceof _primitives.Dict)) {\n      return false;\n    }\n\n    if (resources.objId && nonBlendModesSet.has(resources.objId)) {\n      return false;\n    }\n\n    const processed = new _primitives.RefSet(nonBlendModesSet);\n\n    if (resources.objId) {\n      processed.put(resources.objId);\n    }\n\n    var nodes = [resources],\n        xref = this.xref;\n\n    while (nodes.length) {\n      var node = nodes.shift();\n      var graphicStates = node.get(\"ExtGState\");\n\n      if (graphicStates instanceof _primitives.Dict) {\n        for (let graphicState of graphicStates.getRawValues()) {\n          if (graphicState instanceof _primitives.Ref) {\n            if (processed.has(graphicState)) {\n              continue;\n            }\n\n            try {\n              graphicState = xref.fetch(graphicState);\n            } catch (ex) {\n              processed.put(graphicState);\n              (0, _util.info)(`hasBlendModes - ignoring ExtGState: \"${ex}\".`);\n              continue;\n            }\n          }\n\n          if (!(graphicState instanceof _primitives.Dict)) {\n            continue;\n          }\n\n          if (graphicState.objId) {\n            processed.put(graphicState.objId);\n          }\n\n          const bm = graphicState.get(\"BM\");\n\n          if (bm instanceof _primitives.Name) {\n            if (bm.name !== \"Normal\") {\n              return true;\n            }\n\n            continue;\n          }\n\n          if (bm !== undefined && Array.isArray(bm)) {\n            for (const element of bm) {\n              if (element instanceof _primitives.Name && element.name !== \"Normal\") {\n                return true;\n              }\n            }\n          }\n        }\n      }\n\n      var xObjects = node.get(\"XObject\");\n\n      if (!(xObjects instanceof _primitives.Dict)) {\n        continue;\n      }\n\n      for (let xObject of xObjects.getRawValues()) {\n        if (xObject instanceof _primitives.Ref) {\n          if (processed.has(xObject)) {\n            continue;\n          }\n\n          try {\n            xObject = xref.fetch(xObject);\n          } catch (ex) {\n            processed.put(xObject);\n            (0, _util.info)(`hasBlendModes - ignoring XObject: \"${ex}\".`);\n            continue;\n          }\n        }\n\n        if (!(0, _primitives.isStream)(xObject)) {\n          continue;\n        }\n\n        if (xObject.dict.objId) {\n          processed.put(xObject.dict.objId);\n        }\n\n        var xResources = xObject.dict.get(\"Resources\");\n\n        if (!(xResources instanceof _primitives.Dict)) {\n          continue;\n        }\n\n        if (xResources.objId && processed.has(xResources.objId)) {\n          continue;\n        }\n\n        nodes.push(xResources);\n\n        if (xResources.objId) {\n          processed.put(xResources.objId);\n        }\n      }\n    }\n\n    processed.forEach(ref => {\n      nonBlendModesSet.put(ref);\n    });\n    return false;\n  }\n\n  async fetchBuiltInCMap(name) {\n    const cachedData = this.builtInCMapCache.get(name);\n\n    if (cachedData) {\n      return cachedData;\n    }\n\n    const readableStream = this.handler.sendWithStream(\"FetchBuiltInCMap\", {\n      name\n    });\n    const reader = readableStream.getReader();\n    const data = await new Promise(function (resolve, reject) {\n      function pump() {\n        reader.read().then(function ({\n          value,\n          done\n        }) {\n          if (done) {\n            return;\n          }\n\n          resolve(value);\n          pump();\n        }, reject);\n      }\n\n      pump();\n    });\n\n    if (data.compressionType !== _util.CMapCompressionType.NONE) {\n      this.builtInCMapCache.set(name, data);\n    }\n\n    return data;\n  }\n\n  async buildFormXObject(resources, xobj, smask, operatorList, task, initialState, localColorSpaceCache) {\n    var dict = xobj.dict;\n    var matrix = dict.getArray(\"Matrix\");\n    var bbox = dict.getArray(\"BBox\");\n\n    if (Array.isArray(bbox) && bbox.length === 4) {\n      bbox = _util.Util.normalizeRect(bbox);\n    } else {\n      bbox = null;\n    }\n\n    let optionalContent = null;\n\n    if (dict.has(\"OC\")) {\n      optionalContent = await this.parseMarkedContentProps(dict.get(\"OC\"), resources);\n      operatorList.addOp(_util.OPS.beginMarkedContentProps, [\"OC\", optionalContent]);\n    }\n\n    var group = dict.get(\"Group\");\n\n    if (group) {\n      var groupOptions = {\n        matrix,\n        bbox,\n        smask,\n        isolated: false,\n        knockout: false\n      };\n      var groupSubtype = group.get(\"S\");\n      var colorSpace = null;\n\n      if ((0, _primitives.isName)(groupSubtype, \"Transparency\")) {\n        groupOptions.isolated = group.get(\"I\") || false;\n        groupOptions.knockout = group.get(\"K\") || false;\n\n        if (group.has(\"CS\")) {\n          const cs = group.getRaw(\"CS\");\n\n          const cachedColorSpace = _colorspace.ColorSpace.getCached(cs, this.xref, localColorSpaceCache);\n\n          if (cachedColorSpace) {\n            colorSpace = cachedColorSpace;\n          } else {\n            colorSpace = await this.parseColorSpace({\n              cs,\n              resources,\n              localColorSpaceCache\n            });\n          }\n        }\n      }\n\n      if (smask && smask.backdrop) {\n        colorSpace = colorSpace || _colorspace.ColorSpace.singletons.rgb;\n        smask.backdrop = colorSpace.getRgb(smask.backdrop, 0);\n      }\n\n      operatorList.addOp(_util.OPS.beginGroup, [groupOptions]);\n    }\n\n    operatorList.addOp(_util.OPS.paintFormXObjectBegin, [matrix, bbox]);\n    return this.getOperatorList({\n      stream: xobj,\n      task,\n      resources: dict.get(\"Resources\") || resources,\n      operatorList,\n      initialState\n    }).then(function () {\n      operatorList.addOp(_util.OPS.paintFormXObjectEnd, []);\n\n      if (group) {\n        operatorList.addOp(_util.OPS.endGroup, [groupOptions]);\n      }\n\n      if (optionalContent) {\n        operatorList.addOp(_util.OPS.endMarkedContent, []);\n      }\n    });\n  }\n\n  _sendImgData(objId, imgData, cacheGlobally = false) {\n    const transfers = imgData ? [imgData.data.buffer] : null;\n\n    if (this.parsingType3Font || cacheGlobally) {\n      return this.handler.send(\"commonobj\", [objId, \"Image\", imgData], transfers);\n    }\n\n    return this.handler.send(\"obj\", [objId, this.pageIndex, \"Image\", imgData], transfers);\n  }\n\n  async buildPaintImageXObject({\n    resources,\n    image,\n    isInline = false,\n    operatorList,\n    cacheKey,\n    localImageCache,\n    localColorSpaceCache\n  }) {\n    var dict = image.dict;\n    const imageRef = dict.objId;\n    var w = dict.get(\"Width\", \"W\");\n    var h = dict.get(\"Height\", \"H\");\n\n    if (!(w && (0, _util.isNum)(w)) || !(h && (0, _util.isNum)(h))) {\n      (0, _util.warn)(\"Image dimensions are missing, or not numbers.\");\n      return undefined;\n    }\n\n    var maxImageSize = this.options.maxImageSize;\n\n    if (maxImageSize !== -1 && w * h > maxImageSize) {\n      (0, _util.warn)(\"Image exceeded maximum allowed size and was removed.\");\n      return undefined;\n    }\n\n    var imageMask = dict.get(\"ImageMask\", \"IM\") || false;\n    var imgData, args;\n\n    if (imageMask) {\n      var width = dict.get(\"Width\", \"W\");\n      var height = dict.get(\"Height\", \"H\");\n      var bitStrideLength = width + 7 >> 3;\n      var imgArray = image.getBytes(bitStrideLength * height, true);\n      var decode = dict.getArray(\"Decode\", \"D\");\n      imgData = _image.PDFImage.createMask({\n        imgArray,\n        width,\n        height,\n        imageIsFromDecodeStream: image instanceof _stream.DecodeStream,\n        inverseDecode: !!decode && decode[0] > 0\n      });\n      imgData.cached = !!cacheKey;\n      args = [imgData];\n      operatorList.addOp(_util.OPS.paintImageMaskXObject, args);\n\n      if (cacheKey) {\n        localImageCache.set(cacheKey, imageRef, {\n          fn: _util.OPS.paintImageMaskXObject,\n          args\n        });\n      }\n\n      return undefined;\n    }\n\n    var softMask = dict.get(\"SMask\", \"SM\") || false;\n    var mask = dict.get(\"Mask\") || false;\n    var SMALL_IMAGE_DIMENSIONS = 200;\n\n    if (isInline && !softMask && !mask && w + h < SMALL_IMAGE_DIMENSIONS) {\n      const imageObj = new _image.PDFImage({\n        xref: this.xref,\n        res: resources,\n        image,\n        isInline,\n        pdfFunctionFactory: this._pdfFunctionFactory,\n        localColorSpaceCache\n      });\n      imgData = imageObj.createImageData(true);\n      operatorList.addOp(_util.OPS.paintInlineImageXObject, [imgData]);\n      return undefined;\n    }\n\n    let objId = `img_${this.idFactory.createObjId()}`,\n        cacheGlobally = false;\n\n    if (this.parsingType3Font) {\n      objId = `${this.idFactory.getDocId()}_type3_${objId}`;\n    } else if (imageRef) {\n      cacheGlobally = this.globalImageCache.shouldCache(imageRef, this.pageIndex);\n\n      if (cacheGlobally) {\n        objId = `${this.idFactory.getDocId()}_${objId}`;\n      }\n    }\n\n    operatorList.addDependency(objId);\n    args = [objId, w, h];\n\n    _image.PDFImage.buildImage({\n      xref: this.xref,\n      res: resources,\n      image,\n      isInline,\n      pdfFunctionFactory: this._pdfFunctionFactory,\n      localColorSpaceCache\n    }).then(imageObj => {\n      imgData = imageObj.createImageData(false);\n\n      if (cacheKey && imageRef && cacheGlobally) {\n        this.globalImageCache.addByteSize(imageRef, imgData.data.length);\n      }\n\n      return this._sendImgData(objId, imgData, cacheGlobally);\n    }).catch(reason => {\n      (0, _util.warn)(`Unable to decode image \"${objId}\": \"${reason}\".`);\n      return this._sendImgData(objId, null, cacheGlobally);\n    });\n\n    operatorList.addOp(_util.OPS.paintImageXObject, args);\n\n    if (cacheKey) {\n      localImageCache.set(cacheKey, imageRef, {\n        fn: _util.OPS.paintImageXObject,\n        args\n      });\n\n      if (imageRef) {\n        (0, _util.assert)(!isInline, \"Cannot cache an inline image globally.\");\n        this.globalImageCache.addPageIndex(imageRef, this.pageIndex);\n\n        if (cacheGlobally) {\n          this.globalImageCache.setData(imageRef, {\n            objId,\n            fn: _util.OPS.paintImageXObject,\n            args,\n            byteSize: 0\n          });\n        }\n      }\n    }\n\n    return undefined;\n  }\n\n  handleSMask(smask, resources, operatorList, task, stateManager, localColorSpaceCache) {\n    var smaskContent = smask.get(\"G\");\n    var smaskOptions = {\n      subtype: smask.get(\"S\").name,\n      backdrop: smask.get(\"BC\")\n    };\n    var transferObj = smask.get(\"TR\");\n\n    if ((0, _function.isPDFFunction)(transferObj)) {\n      const transferFn = this._pdfFunctionFactory.create(transferObj);\n\n      var transferMap = new Uint8Array(256);\n      var tmp = new Float32Array(1);\n\n      for (var i = 0; i < 256; i++) {\n        tmp[0] = i / 255;\n        transferFn(tmp, 0, tmp, 0);\n        transferMap[i] = tmp[0] * 255 | 0;\n      }\n\n      smaskOptions.transferMap = transferMap;\n    }\n\n    return this.buildFormXObject(resources, smaskContent, smaskOptions, operatorList, task, stateManager.state.clone(), localColorSpaceCache);\n  }\n\n  handleTransferFunction(tr) {\n    let transferArray;\n\n    if (Array.isArray(tr)) {\n      transferArray = tr;\n    } else if ((0, _function.isPDFFunction)(tr)) {\n      transferArray = [tr];\n    } else {\n      return null;\n    }\n\n    const transferMaps = [];\n    let numFns = 0,\n        numEffectfulFns = 0;\n\n    for (const entry of transferArray) {\n      const transferObj = this.xref.fetchIfRef(entry);\n      numFns++;\n\n      if ((0, _primitives.isName)(transferObj, \"Identity\")) {\n        transferMaps.push(null);\n        continue;\n      } else if (!(0, _function.isPDFFunction)(transferObj)) {\n        return null;\n      }\n\n      const transferFn = this._pdfFunctionFactory.create(transferObj);\n\n      const transferMap = new Uint8Array(256),\n            tmp = new Float32Array(1);\n\n      for (let j = 0; j < 256; j++) {\n        tmp[0] = j / 255;\n        transferFn(tmp, 0, tmp, 0);\n        transferMap[j] = tmp[0] * 255 | 0;\n      }\n\n      transferMaps.push(transferMap);\n      numEffectfulFns++;\n    }\n\n    if (!(numFns === 1 || numFns === 4)) {\n      return null;\n    }\n\n    if (numEffectfulFns === 0) {\n      return null;\n    }\n\n    return transferMaps;\n  }\n\n  handleTilingType(fn, color, resources, pattern, patternDict, operatorList, task, cacheKey, localTilingPatternCache) {\n    const tilingOpList = new _operator_list.OperatorList();\n\n    const patternResources = _primitives.Dict.merge({\n      xref: this.xref,\n      dictArray: [patternDict.get(\"Resources\"), resources]\n    });\n\n    return this.getOperatorList({\n      stream: pattern,\n      task,\n      resources: patternResources,\n      operatorList: tilingOpList\n    }).then(function () {\n      const operatorListIR = tilingOpList.getIR();\n      const tilingPatternIR = (0, _pattern.getTilingPatternIR)(operatorListIR, patternDict, color);\n      operatorList.addDependencies(tilingOpList.dependencies);\n      operatorList.addOp(fn, tilingPatternIR);\n\n      if (cacheKey) {\n        localTilingPatternCache.set(cacheKey, patternDict.objId, {\n          operatorListIR,\n          dict: patternDict\n        });\n      }\n    }).catch(reason => {\n      if (reason instanceof _util.AbortException) {\n        return;\n      }\n\n      if (this.options.ignoreErrors) {\n        this.handler.send(\"UnsupportedFeature\", {\n          featureId: _util.UNSUPPORTED_FEATURES.errorTilingPattern\n        });\n        (0, _util.warn)(`handleTilingType - ignoring pattern: \"${reason}\".`);\n        return;\n      }\n\n      throw reason;\n    });\n  }\n\n  handleSetFont(resources, fontArgs, fontRef, operatorList, task, state, fallbackFontDict = null) {\n    const fontName = fontArgs && fontArgs[0] instanceof _primitives.Name ? fontArgs[0].name : null;\n    return this.loadFont(fontName, fontRef, resources, fallbackFontDict).then(translated => {\n      if (!translated.font.isType3Font) {\n        return translated;\n      }\n\n      return translated.loadType3Data(this, resources, task).then(function () {\n        operatorList.addDependencies(translated.type3Dependencies);\n        return translated;\n      }).catch(reason => {\n        this.handler.send(\"UnsupportedFeature\", {\n          featureId: _util.UNSUPPORTED_FEATURES.errorFontLoadType3\n        });\n        return new TranslatedFont({\n          loadedName: \"g_font_error\",\n          font: new _fonts.ErrorFont(`Type3 font load error: ${reason}`),\n          dict: translated.font,\n          extraProperties: this.options.fontExtraProperties\n        });\n      });\n    }).then(translated => {\n      state.font = translated.font;\n      translated.send(this.handler);\n      return translated.loadedName;\n    });\n  }\n\n  handleText(chars, state) {\n    const font = state.font;\n    const glyphs = font.charsToGlyphs(chars);\n\n    if (font.data) {\n      const isAddToPathSet = !!(state.textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG);\n\n      if (isAddToPathSet || state.fillColorSpace.name === \"Pattern\" || font.disableFontFace || this.options.disableFontFace) {\n        PartialEvaluator.buildFontPaths(font, glyphs, this.handler);\n      }\n    }\n\n    return glyphs;\n  }\n\n  ensureStateFont(state) {\n    if (state.font) {\n      return;\n    }\n\n    const reason = new _util.FormatError(\"Missing setFont (Tf) operator before text rendering operator.\");\n\n    if (this.options.ignoreErrors) {\n      this.handler.send(\"UnsupportedFeature\", {\n        featureId: _util.UNSUPPORTED_FEATURES.errorFontState\n      });\n      (0, _util.warn)(`ensureStateFont: \"${reason}\".`);\n      return;\n    }\n\n    throw reason;\n  }\n\n  async setGState({\n    resources,\n    gState,\n    operatorList,\n    cacheKey,\n    task,\n    stateManager,\n    localGStateCache,\n    localColorSpaceCache\n  }) {\n    const gStateRef = gState.objId;\n    let isSimpleGState = true;\n    var gStateObj = [];\n    var gStateKeys = gState.getKeys();\n    var promise = Promise.resolve();\n\n    for (var i = 0, ii = gStateKeys.length; i < ii; i++) {\n      const key = gStateKeys[i];\n      const value = gState.get(key);\n\n      switch (key) {\n        case \"Type\":\n          break;\n\n        case \"LW\":\n        case \"LC\":\n        case \"LJ\":\n        case \"ML\":\n        case \"D\":\n        case \"RI\":\n        case \"FL\":\n        case \"CA\":\n        case \"ca\":\n          gStateObj.push([key, value]);\n          break;\n\n        case \"Font\":\n          isSimpleGState = false;\n          promise = promise.then(() => {\n            return this.handleSetFont(resources, null, value[0], operatorList, task, stateManager.state).then(function (loadedName) {\n              operatorList.addDependency(loadedName);\n              gStateObj.push([key, [loadedName, value[1]]]);\n            });\n          });\n          break;\n\n        case \"BM\":\n          gStateObj.push([key, normalizeBlendMode(value)]);\n          break;\n\n        case \"SMask\":\n          if ((0, _primitives.isName)(value, \"None\")) {\n            gStateObj.push([key, false]);\n            break;\n          }\n\n          if ((0, _primitives.isDict)(value)) {\n            isSimpleGState = false;\n            promise = promise.then(() => {\n              return this.handleSMask(value, resources, operatorList, task, stateManager, localColorSpaceCache);\n            });\n            gStateObj.push([key, true]);\n          } else {\n            (0, _util.warn)(\"Unsupported SMask type\");\n          }\n\n          break;\n\n        case \"TR\":\n          const transferMaps = this.handleTransferFunction(value);\n          gStateObj.push([key, transferMaps]);\n          break;\n\n        case \"OP\":\n        case \"op\":\n        case \"OPM\":\n        case \"BG\":\n        case \"BG2\":\n        case \"UCR\":\n        case \"UCR2\":\n        case \"TR2\":\n        case \"HT\":\n        case \"SM\":\n        case \"SA\":\n        case \"AIS\":\n        case \"TK\":\n          (0, _util.info)(\"graphic state operator \" + key);\n          break;\n\n        default:\n          (0, _util.info)(\"Unknown graphic state operator \" + key);\n          break;\n      }\n    }\n\n    return promise.then(function () {\n      if (gStateObj.length > 0) {\n        operatorList.addOp(_util.OPS.setGState, [gStateObj]);\n      }\n\n      if (isSimpleGState) {\n        localGStateCache.set(cacheKey, gStateRef, gStateObj);\n      }\n    });\n  }\n\n  loadFont(fontName, font, resources, fallbackFontDict = null) {\n    const errorFont = async () => {\n      return new TranslatedFont({\n        loadedName: \"g_font_error\",\n        font: new _fonts.ErrorFont(`Font \"${fontName}\" is not available.`),\n        dict: font,\n        extraProperties: this.options.fontExtraProperties\n      });\n    };\n\n    var fontRef,\n        xref = this.xref;\n\n    if (font) {\n      if (!(0, _primitives.isRef)(font)) {\n        throw new _util.FormatError('The \"font\" object should be a reference.');\n      }\n\n      fontRef = font;\n    } else {\n      var fontRes = resources.get(\"Font\");\n\n      if (fontRes) {\n        fontRef = fontRes.getRaw(fontName);\n      }\n    }\n\n    if (!fontRef) {\n      const partialMsg = `Font \"${fontName || font && font.toString()}\" is not available`;\n\n      if (!this.options.ignoreErrors && !this.parsingType3Font) {\n        (0, _util.warn)(`${partialMsg}.`);\n        return errorFont();\n      }\n\n      this.handler.send(\"UnsupportedFeature\", {\n        featureId: _util.UNSUPPORTED_FEATURES.errorFontMissing\n      });\n      (0, _util.warn)(`${partialMsg} -- attempting to fallback to a default font.`);\n\n      if (fallbackFontDict) {\n        fontRef = fallbackFontDict;\n      } else {\n        fontRef = PartialEvaluator.fallbackFontDict;\n      }\n    }\n\n    if (this.fontCache.has(fontRef)) {\n      return this.fontCache.get(fontRef);\n    }\n\n    font = xref.fetchIfRef(fontRef);\n\n    if (!(0, _primitives.isDict)(font)) {\n      return errorFont();\n    }\n\n    if (font.cacheKey && this.fontCache.has(font.cacheKey)) {\n      return this.fontCache.get(font.cacheKey);\n    }\n\n    var fontCapability = (0, _util.createPromiseCapability)();\n    let preEvaluatedFont;\n\n    try {\n      preEvaluatedFont = this.preEvaluateFont(font);\n    } catch (reason) {\n      (0, _util.warn)(`loadFont - preEvaluateFont failed: \"${reason}\".`);\n      return errorFont();\n    }\n\n    const {\n      descriptor,\n      hash\n    } = preEvaluatedFont;\n    var fontRefIsRef = (0, _primitives.isRef)(fontRef),\n        fontID;\n\n    if (fontRefIsRef) {\n      fontID = `f${fontRef.toString()}`;\n    }\n\n    if (hash && (0, _primitives.isDict)(descriptor)) {\n      if (!descriptor.fontAliases) {\n        descriptor.fontAliases = Object.create(null);\n      }\n\n      var fontAliases = descriptor.fontAliases;\n\n      if (fontAliases[hash]) {\n        var aliasFontRef = fontAliases[hash].aliasRef;\n\n        if (fontRefIsRef && aliasFontRef && this.fontCache.has(aliasFontRef)) {\n          this.fontCache.putAlias(fontRef, aliasFontRef);\n          return this.fontCache.get(fontRef);\n        }\n      } else {\n        fontAliases[hash] = {\n          fontID: this.idFactory.createFontId()\n        };\n      }\n\n      if (fontRefIsRef) {\n        fontAliases[hash].aliasRef = fontRef;\n      }\n\n      fontID = fontAliases[hash].fontID;\n    }\n\n    if (fontRefIsRef) {\n      this.fontCache.put(fontRef, fontCapability.promise);\n    } else {\n      if (!fontID) {\n        fontID = this.idFactory.createFontId();\n      }\n\n      font.cacheKey = `cacheKey_${fontID}`;\n      this.fontCache.put(font.cacheKey, fontCapability.promise);\n    }\n\n    (0, _util.assert)(fontID && fontID.startsWith(\"f\"), 'The \"fontID\" must be (correctly) defined.');\n    font.loadedName = `${this.idFactory.getDocId()}_${fontID}`;\n    this.translateFont(preEvaluatedFont).then(translatedFont => {\n      if (translatedFont.fontType !== undefined) {\n        var xrefFontStats = xref.stats.fontTypes;\n        xrefFontStats[translatedFont.fontType] = true;\n      }\n\n      fontCapability.resolve(new TranslatedFont({\n        loadedName: font.loadedName,\n        font: translatedFont,\n        dict: font,\n        extraProperties: this.options.fontExtraProperties\n      }));\n    }).catch(reason => {\n      this.handler.send(\"UnsupportedFeature\", {\n        featureId: _util.UNSUPPORTED_FEATURES.errorFontTranslate\n      });\n      (0, _util.warn)(`loadFont - translateFont failed: \"${reason}\".`);\n\n      try {\n        var fontFile3 = descriptor && descriptor.get(\"FontFile3\");\n        var subtype = fontFile3 && fontFile3.get(\"Subtype\");\n        var fontType = (0, _fonts.getFontType)(preEvaluatedFont.type, subtype && subtype.name);\n        var xrefFontStats = xref.stats.fontTypes;\n        xrefFontStats[fontType] = true;\n      } catch (ex) {}\n\n      fontCapability.resolve(new TranslatedFont({\n        loadedName: font.loadedName,\n        font: new _fonts.ErrorFont(reason instanceof Error ? reason.message : reason),\n        dict: font,\n        extraProperties: this.options.fontExtraProperties\n      }));\n    });\n    return fontCapability.promise;\n  }\n\n  buildPath(operatorList, fn, args, parsingText = false) {\n    var lastIndex = operatorList.length - 1;\n\n    if (!args) {\n      args = [];\n    }\n\n    if (lastIndex < 0 || operatorList.fnArray[lastIndex] !== _util.OPS.constructPath) {\n      if (parsingText) {\n        (0, _util.warn)(`Encountered path operator \"${fn}\" inside of a text object.`);\n        operatorList.addOp(_util.OPS.save, null);\n      }\n\n      operatorList.addOp(_util.OPS.constructPath, [[fn], args]);\n\n      if (parsingText) {\n        operatorList.addOp(_util.OPS.restore, null);\n      }\n    } else {\n      var opArgs = operatorList.argsArray[lastIndex];\n      opArgs[0].push(fn);\n      Array.prototype.push.apply(opArgs[1], args);\n    }\n  }\n\n  parseColorSpace({\n    cs,\n    resources,\n    localColorSpaceCache\n  }) {\n    return _colorspace.ColorSpace.parseAsync({\n      cs,\n      xref: this.xref,\n      resources,\n      pdfFunctionFactory: this._pdfFunctionFactory,\n      localColorSpaceCache\n    }).catch(reason => {\n      if (reason instanceof _util.AbortException) {\n        return null;\n      }\n\n      if (this.options.ignoreErrors) {\n        this.handler.send(\"UnsupportedFeature\", {\n          featureId: _util.UNSUPPORTED_FEATURES.errorColorSpace\n        });\n        (0, _util.warn)(`parseColorSpace - ignoring ColorSpace: \"${reason}\".`);\n        return null;\n      }\n\n      throw reason;\n    });\n  }\n\n  handleColorN(operatorList, fn, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache) {\n    const patternName = args.pop();\n\n    if (patternName instanceof _primitives.Name) {\n      const name = patternName.name;\n      const localTilingPattern = localTilingPatternCache.getByName(name);\n\n      if (localTilingPattern) {\n        try {\n          const color = cs.base ? cs.base.getRgb(args, 0) : null;\n          const tilingPatternIR = (0, _pattern.getTilingPatternIR)(localTilingPattern.operatorListIR, localTilingPattern.dict, color);\n          operatorList.addOp(fn, tilingPatternIR);\n          return undefined;\n        } catch (ex) {}\n      }\n\n      let pattern = patterns.get(name);\n\n      if (pattern) {\n        var dict = (0, _primitives.isStream)(pattern) ? pattern.dict : pattern;\n        var typeNum = dict.get(\"PatternType\");\n\n        if (typeNum === PatternType.TILING) {\n          const color = cs.base ? cs.base.getRgb(args, 0) : null;\n          return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task, name, localTilingPatternCache);\n        } else if (typeNum === PatternType.SHADING) {\n          var shading = dict.get(\"Shading\");\n          var matrix = dict.getArray(\"Matrix\");\n          pattern = _pattern.Pattern.parseShading(shading, matrix, this.xref, resources, this.handler, this._pdfFunctionFactory, localColorSpaceCache);\n          operatorList.addOp(fn, pattern.getIR());\n          return undefined;\n        }\n\n        throw new _util.FormatError(`Unknown PatternType: ${typeNum}`);\n      }\n    }\n\n    throw new _util.FormatError(`Unknown PatternName: ${patternName}`);\n  }\n\n  async parseMarkedContentProps(contentProperties, resources) {\n    let optionalContent;\n\n    if ((0, _primitives.isName)(contentProperties)) {\n      const properties = resources.get(\"Properties\");\n      optionalContent = properties.get(contentProperties.name);\n    } else if ((0, _primitives.isDict)(contentProperties)) {\n      optionalContent = contentProperties;\n    } else {\n      throw new _util.FormatError(\"Optional content properties malformed.\");\n    }\n\n    const optionalContentType = optionalContent.get(\"Type\").name;\n\n    if (optionalContentType === \"OCG\") {\n      return {\n        type: optionalContentType,\n        id: optionalContent.objId\n      };\n    } else if (optionalContentType === \"OCMD\") {\n      const optionalContentGroups = optionalContent.get(\"OCGs\");\n\n      if (Array.isArray(optionalContentGroups) || (0, _primitives.isDict)(optionalContentGroups)) {\n        const groupIds = [];\n\n        if (Array.isArray(optionalContentGroups)) {\n          optionalContent.get(\"OCGs\").forEach(ocg => {\n            groupIds.push(ocg.toString());\n          });\n        } else {\n          groupIds.push(optionalContentGroups.objId);\n        }\n\n        let expression = null;\n\n        if (optionalContent.get(\"VE\")) {\n          expression = true;\n        }\n\n        return {\n          type: optionalContentType,\n          ids: groupIds,\n          policy: (0, _primitives.isName)(optionalContent.get(\"P\")) ? optionalContent.get(\"P\").name : null,\n          expression\n        };\n      } else if ((0, _primitives.isRef)(optionalContentGroups)) {\n        return {\n          type: optionalContentType,\n          id: optionalContentGroups.toString()\n        };\n      }\n    }\n\n    return null;\n  }\n\n  getOperatorList({\n    stream,\n    task,\n    resources,\n    operatorList,\n    initialState = null,\n    fallbackFontDict = null\n  }) {\n    resources = resources || _primitives.Dict.empty;\n    initialState = initialState || new EvalState();\n\n    if (!operatorList) {\n      throw new Error('getOperatorList: missing \"operatorList\" parameter');\n    }\n\n    var self = this;\n    var xref = this.xref;\n    let parsingText = false;\n    const localImageCache = new _image_utils.LocalImageCache();\n    const localColorSpaceCache = new _image_utils.LocalColorSpaceCache();\n    const localGStateCache = new _image_utils.LocalGStateCache();\n    const localTilingPatternCache = new _image_utils.LocalTilingPatternCache();\n\n    var xobjs = resources.get(\"XObject\") || _primitives.Dict.empty;\n\n    var patterns = resources.get(\"Pattern\") || _primitives.Dict.empty;\n\n    var stateManager = new StateManager(initialState);\n    var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);\n    var timeSlotManager = new TimeSlotManager();\n\n    function closePendingRestoreOPS(argument) {\n      for (var i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) {\n        operatorList.addOp(_util.OPS.restore, []);\n      }\n    }\n\n    return new Promise(function promiseBody(resolve, reject) {\n      const next = function (promise) {\n        Promise.all([promise, operatorList.ready]).then(function () {\n          try {\n            promiseBody(resolve, reject);\n          } catch (ex) {\n            reject(ex);\n          }\n        }, reject);\n      };\n\n      task.ensureNotTerminated();\n      timeSlotManager.reset();\n      var stop,\n          operation = {},\n          i,\n          ii,\n          cs,\n          name;\n\n      while (!(stop = timeSlotManager.check())) {\n        operation.args = null;\n\n        if (!preprocessor.read(operation)) {\n          break;\n        }\n\n        var args = operation.args;\n        var fn = operation.fn;\n\n        switch (fn | 0) {\n          case _util.OPS.paintXObject:\n            name = args[0].name;\n\n            if (name) {\n              const localImage = localImageCache.getByName(name);\n\n              if (localImage) {\n                operatorList.addOp(localImage.fn, localImage.args);\n                args = null;\n                continue;\n              }\n            }\n\n            next(new Promise(function (resolveXObject, rejectXObject) {\n              if (!name) {\n                throw new _util.FormatError(\"XObject must be referred to by name.\");\n              }\n\n              let xobj = xobjs.getRaw(name);\n\n              if (xobj instanceof _primitives.Ref) {\n                const localImage = localImageCache.getByRef(xobj);\n\n                if (localImage) {\n                  operatorList.addOp(localImage.fn, localImage.args);\n                  resolveXObject();\n                  return;\n                }\n\n                const globalImage = self.globalImageCache.getData(xobj, self.pageIndex);\n\n                if (globalImage) {\n                  operatorList.addDependency(globalImage.objId);\n                  operatorList.addOp(globalImage.fn, globalImage.args);\n                  resolveXObject();\n                  return;\n                }\n\n                xobj = xref.fetch(xobj);\n              }\n\n              if (!(0, _primitives.isStream)(xobj)) {\n                throw new _util.FormatError(\"XObject should be a stream\");\n              }\n\n              const type = xobj.dict.get(\"Subtype\");\n\n              if (!(0, _primitives.isName)(type)) {\n                throw new _util.FormatError(\"XObject should have a Name subtype\");\n              }\n\n              if (type.name === \"Form\") {\n                stateManager.save();\n                self.buildFormXObject(resources, xobj, null, operatorList, task, stateManager.state.clone(), localColorSpaceCache).then(function () {\n                  stateManager.restore();\n                  resolveXObject();\n                }, rejectXObject);\n                return;\n              } else if (type.name === \"Image\") {\n                self.buildPaintImageXObject({\n                  resources,\n                  image: xobj,\n                  operatorList,\n                  cacheKey: name,\n                  localImageCache,\n                  localColorSpaceCache\n                }).then(resolveXObject, rejectXObject);\n                return;\n              } else if (type.name === \"PS\") {\n                (0, _util.info)(\"Ignored XObject subtype PS\");\n              } else {\n                throw new _util.FormatError(`Unhandled XObject subtype ${type.name}`);\n              }\n\n              resolveXObject();\n            }).catch(function (reason) {\n              if (reason instanceof _util.AbortException) {\n                return;\n              }\n\n              if (self.options.ignoreErrors) {\n                self.handler.send(\"UnsupportedFeature\", {\n                  featureId: _util.UNSUPPORTED_FEATURES.errorXObject\n                });\n                (0, _util.warn)(`getOperatorList - ignoring XObject: \"${reason}\".`);\n                return;\n              }\n\n              throw reason;\n            }));\n            return;\n\n          case _util.OPS.setFont:\n            var fontSize = args[1];\n            next(self.handleSetFont(resources, args, null, operatorList, task, stateManager.state, fallbackFontDict).then(function (loadedName) {\n              operatorList.addDependency(loadedName);\n              operatorList.addOp(_util.OPS.setFont, [loadedName, fontSize]);\n            }));\n            return;\n\n          case _util.OPS.beginText:\n            parsingText = true;\n            break;\n\n          case _util.OPS.endText:\n            parsingText = false;\n            break;\n\n          case _util.OPS.endInlineImage:\n            var cacheKey = args[0].cacheKey;\n\n            if (cacheKey) {\n              const localImage = localImageCache.getByName(cacheKey);\n\n              if (localImage) {\n                operatorList.addOp(localImage.fn, localImage.args);\n                args = null;\n                continue;\n              }\n            }\n\n            next(self.buildPaintImageXObject({\n              resources,\n              image: args[0],\n              isInline: true,\n              operatorList,\n              cacheKey,\n              localImageCache,\n              localColorSpaceCache\n            }));\n            return;\n\n          case _util.OPS.showText:\n            if (!stateManager.state.font) {\n              self.ensureStateFont(stateManager.state);\n              continue;\n            }\n\n            args[0] = self.handleText(args[0], stateManager.state);\n            break;\n\n          case _util.OPS.showSpacedText:\n            if (!stateManager.state.font) {\n              self.ensureStateFont(stateManager.state);\n              continue;\n            }\n\n            var arr = args[0];\n            var combinedGlyphs = [];\n            var arrLength = arr.length;\n            var state = stateManager.state;\n\n            for (i = 0; i < arrLength; ++i) {\n              var arrItem = arr[i];\n\n              if ((0, _util.isString)(arrItem)) {\n                Array.prototype.push.apply(combinedGlyphs, self.handleText(arrItem, state));\n              } else if ((0, _util.isNum)(arrItem)) {\n                combinedGlyphs.push(arrItem);\n              }\n            }\n\n            args[0] = combinedGlyphs;\n            fn = _util.OPS.showText;\n            break;\n\n          case _util.OPS.nextLineShowText:\n            if (!stateManager.state.font) {\n              self.ensureStateFont(stateManager.state);\n              continue;\n            }\n\n            operatorList.addOp(_util.OPS.nextLine);\n            args[0] = self.handleText(args[0], stateManager.state);\n            fn = _util.OPS.showText;\n            break;\n\n          case _util.OPS.nextLineSetSpacingShowText:\n            if (!stateManager.state.font) {\n              self.ensureStateFont(stateManager.state);\n              continue;\n            }\n\n            operatorList.addOp(_util.OPS.nextLine);\n            operatorList.addOp(_util.OPS.setWordSpacing, [args.shift()]);\n            operatorList.addOp(_util.OPS.setCharSpacing, [args.shift()]);\n            args[0] = self.handleText(args[0], stateManager.state);\n            fn = _util.OPS.showText;\n            break;\n\n          case _util.OPS.setTextRenderingMode:\n            stateManager.state.textRenderingMode = args[0];\n            break;\n\n          case _util.OPS.setFillColorSpace:\n            {\n              const cachedColorSpace = _colorspace.ColorSpace.getCached(args[0], xref, localColorSpaceCache);\n\n              if (cachedColorSpace) {\n                stateManager.state.fillColorSpace = cachedColorSpace;\n                continue;\n              }\n\n              next(self.parseColorSpace({\n                cs: args[0],\n                resources,\n                localColorSpaceCache\n              }).then(function (colorSpace) {\n                if (colorSpace) {\n                  stateManager.state.fillColorSpace = colorSpace;\n                }\n              }));\n              return;\n            }\n\n          case _util.OPS.setStrokeColorSpace:\n            {\n              const cachedColorSpace = _colorspace.ColorSpace.getCached(args[0], xref, localColorSpaceCache);\n\n              if (cachedColorSpace) {\n                stateManager.state.strokeColorSpace = cachedColorSpace;\n                continue;\n              }\n\n              next(self.parseColorSpace({\n                cs: args[0],\n                resources,\n                localColorSpaceCache\n              }).then(function (colorSpace) {\n                if (colorSpace) {\n                  stateManager.state.strokeColorSpace = colorSpace;\n                }\n              }));\n              return;\n            }\n\n          case _util.OPS.setFillColor:\n            cs = stateManager.state.fillColorSpace;\n            args = cs.getRgb(args, 0);\n            fn = _util.OPS.setFillRGBColor;\n            break;\n\n          case _util.OPS.setStrokeColor:\n            cs = stateManager.state.strokeColorSpace;\n            args = cs.getRgb(args, 0);\n            fn = _util.OPS.setStrokeRGBColor;\n            break;\n\n          case _util.OPS.setFillGray:\n            stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.gray;\n            args = _colorspace.ColorSpace.singletons.gray.getRgb(args, 0);\n            fn = _util.OPS.setFillRGBColor;\n            break;\n\n          case _util.OPS.setStrokeGray:\n            stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.gray;\n            args = _colorspace.ColorSpace.singletons.gray.getRgb(args, 0);\n            fn = _util.OPS.setStrokeRGBColor;\n            break;\n\n          case _util.OPS.setFillCMYKColor:\n            stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.cmyk;\n            args = _colorspace.ColorSpace.singletons.cmyk.getRgb(args, 0);\n            fn = _util.OPS.setFillRGBColor;\n            break;\n\n          case _util.OPS.setStrokeCMYKColor:\n            stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.cmyk;\n            args = _colorspace.ColorSpace.singletons.cmyk.getRgb(args, 0);\n            fn = _util.OPS.setStrokeRGBColor;\n            break;\n\n          case _util.OPS.setFillRGBColor:\n            stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.rgb;\n            args = _colorspace.ColorSpace.singletons.rgb.getRgb(args, 0);\n            break;\n\n          case _util.OPS.setStrokeRGBColor:\n            stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.rgb;\n            args = _colorspace.ColorSpace.singletons.rgb.getRgb(args, 0);\n            break;\n\n          case _util.OPS.setFillColorN:\n            cs = stateManager.state.fillColorSpace;\n\n            if (cs.name === \"Pattern\") {\n              next(self.handleColorN(operatorList, _util.OPS.setFillColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache));\n              return;\n            }\n\n            args = cs.getRgb(args, 0);\n            fn = _util.OPS.setFillRGBColor;\n            break;\n\n          case _util.OPS.setStrokeColorN:\n            cs = stateManager.state.strokeColorSpace;\n\n            if (cs.name === \"Pattern\") {\n              next(self.handleColorN(operatorList, _util.OPS.setStrokeColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache));\n              return;\n            }\n\n            args = cs.getRgb(args, 0);\n            fn = _util.OPS.setStrokeRGBColor;\n            break;\n\n          case _util.OPS.shadingFill:\n            var shadingRes = resources.get(\"Shading\");\n\n            if (!shadingRes) {\n              throw new _util.FormatError(\"No shading resource found\");\n            }\n\n            var shading = shadingRes.get(args[0].name);\n\n            if (!shading) {\n              throw new _util.FormatError(\"No shading object found\");\n            }\n\n            var shadingFill = _pattern.Pattern.parseShading(shading, null, xref, resources, self.handler, self._pdfFunctionFactory, localColorSpaceCache);\n\n            var patternIR = shadingFill.getIR();\n            args = [patternIR];\n            fn = _util.OPS.shadingFill;\n            break;\n\n          case _util.OPS.setGState:\n            name = args[0].name;\n\n            if (name) {\n              const localGStateObj = localGStateCache.getByName(name);\n\n              if (localGStateObj) {\n                if (localGStateObj.length > 0) {\n                  operatorList.addOp(_util.OPS.setGState, [localGStateObj]);\n                }\n\n                args = null;\n                continue;\n              }\n            }\n\n            next(new Promise(function (resolveGState, rejectGState) {\n              if (!name) {\n                throw new _util.FormatError(\"GState must be referred to by name.\");\n              }\n\n              const extGState = resources.get(\"ExtGState\");\n\n              if (!(extGState instanceof _primitives.Dict)) {\n                throw new _util.FormatError(\"ExtGState should be a dictionary.\");\n              }\n\n              const gState = extGState.get(name);\n\n              if (!(gState instanceof _primitives.Dict)) {\n                throw new _util.FormatError(\"GState should be a dictionary.\");\n              }\n\n              self.setGState({\n                resources,\n                gState,\n                operatorList,\n                cacheKey: name,\n                task,\n                stateManager,\n                localGStateCache,\n                localColorSpaceCache\n              }).then(resolveGState, rejectGState);\n            }).catch(function (reason) {\n              if (reason instanceof _util.AbortException) {\n                return;\n              }\n\n              if (self.options.ignoreErrors) {\n                self.handler.send(\"UnsupportedFeature\", {\n                  featureId: _util.UNSUPPORTED_FEATURES.errorExtGState\n                });\n                (0, _util.warn)(`getOperatorList - ignoring ExtGState: \"${reason}\".`);\n                return;\n              }\n\n              throw reason;\n            }));\n            return;\n\n          case _util.OPS.moveTo:\n          case _util.OPS.lineTo:\n          case _util.OPS.curveTo:\n          case _util.OPS.curveTo2:\n          case _util.OPS.curveTo3:\n          case _util.OPS.closePath:\n          case _util.OPS.rectangle:\n            self.buildPath(operatorList, fn, args, parsingText);\n            continue;\n\n          case _util.OPS.markPoint:\n          case _util.OPS.markPointProps:\n          case _util.OPS.beginCompat:\n          case _util.OPS.endCompat:\n            continue;\n\n          case _util.OPS.beginMarkedContentProps:\n            if (!(0, _primitives.isName)(args[0])) {\n              (0, _util.warn)(`Expected name for beginMarkedContentProps arg0=${args[0]}`);\n              continue;\n            }\n\n            if (args[0].name === \"OC\") {\n              next(self.parseMarkedContentProps(args[1], resources).then(data => {\n                operatorList.addOp(_util.OPS.beginMarkedContentProps, [\"OC\", data]);\n              }).catch(reason => {\n                if (reason instanceof _util.AbortException) {\n                  return;\n                }\n\n                if (self.options.ignoreErrors) {\n                  self.handler.send(\"UnsupportedFeature\", {\n                    featureId: _util.UNSUPPORTED_FEATURES.errorMarkedContent\n                  });\n                  (0, _util.warn)(`getOperatorList - ignoring beginMarkedContentProps: \"${reason}\".`);\n                  return;\n                }\n\n                throw reason;\n              }));\n              return;\n            }\n\n            args = [args[0].name];\n            break;\n\n          case _util.OPS.beginMarkedContent:\n          case _util.OPS.endMarkedContent:\n          default:\n            if (args !== null) {\n              for (i = 0, ii = args.length; i < ii; i++) {\n                if (args[i] instanceof _primitives.Dict) {\n                  break;\n                }\n              }\n\n              if (i < ii) {\n                (0, _util.warn)(\"getOperatorList - ignoring operator: \" + fn);\n                continue;\n              }\n            }\n\n        }\n\n        operatorList.addOp(fn, args);\n      }\n\n      if (stop) {\n        next(deferred);\n        return;\n      }\n\n      closePendingRestoreOPS();\n      resolve();\n    }).catch(reason => {\n      if (reason instanceof _util.AbortException) {\n        return;\n      }\n\n      if (this.options.ignoreErrors) {\n        this.handler.send(\"UnsupportedFeature\", {\n          featureId: _util.UNSUPPORTED_FEATURES.errorOperatorList\n        });\n        (0, _util.warn)(`getOperatorList - ignoring errors during \"${task.name}\" ` + `task: \"${reason}\".`);\n        closePendingRestoreOPS();\n        return;\n      }\n\n      throw reason;\n    });\n  }\n\n  getTextContent({\n    stream,\n    task,\n    resources,\n    stateManager = null,\n    normalizeWhitespace = false,\n    combineTextItems = false,\n    sink,\n    seenStyles = new Set()\n  }) {\n    resources = resources || _primitives.Dict.empty;\n    stateManager = stateManager || new StateManager(new TextState());\n    var WhitespaceRegexp = /\\s/g;\n    var textContent = {\n      items: [],\n      styles: Object.create(null)\n    };\n    var textContentItem = {\n      initialized: false,\n      str: [],\n      width: 0,\n      height: 0,\n      vertical: false,\n      lastAdvanceWidth: 0,\n      lastAdvanceHeight: 0,\n      textAdvanceScale: 0,\n      spaceWidth: 0,\n      fakeSpaceMin: Infinity,\n      fakeMultiSpaceMin: Infinity,\n      fakeMultiSpaceMax: -0,\n      textRunBreakAllowed: false,\n      transform: null,\n      fontName: null\n    };\n    var SPACE_FACTOR = 0.3;\n    var MULTI_SPACE_FACTOR = 1.5;\n    var MULTI_SPACE_FACTOR_MAX = 4;\n    var self = this;\n    var xref = this.xref;\n    var xobjs = null;\n    const emptyXObjectCache = new _image_utils.LocalImageCache();\n    const emptyGStateCache = new _image_utils.LocalGStateCache();\n    var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);\n    var textState;\n\n    function ensureTextContentItem() {\n      if (textContentItem.initialized) {\n        return textContentItem;\n      }\n\n      const font = textState.font,\n            loadedName = font.loadedName;\n\n      if (!seenStyles.has(loadedName)) {\n        seenStyles.add(loadedName);\n        textContent.styles[loadedName] = {\n          fontFamily: font.fallbackName,\n          ascent: font.ascent,\n          descent: font.descent,\n          vertical: font.vertical\n        };\n      }\n\n      textContentItem.fontName = loadedName;\n      var tsm = [textState.fontSize * textState.textHScale, 0, 0, textState.fontSize, 0, textState.textRise];\n\n      if (font.isType3Font && textState.fontSize <= 1 && !(0, _util.isArrayEqual)(textState.fontMatrix, _util.FONT_IDENTITY_MATRIX)) {\n        const glyphHeight = font.bbox[3] - font.bbox[1];\n\n        if (glyphHeight > 0) {\n          tsm[3] *= glyphHeight * textState.fontMatrix[3];\n        }\n      }\n\n      var trm = _util.Util.transform(textState.ctm, _util.Util.transform(textState.textMatrix, tsm));\n\n      textContentItem.transform = trm;\n\n      if (!font.vertical) {\n        textContentItem.width = 0;\n        textContentItem.height = Math.hypot(trm[2], trm[3]);\n        textContentItem.vertical = false;\n      } else {\n        textContentItem.width = Math.hypot(trm[0], trm[1]);\n        textContentItem.height = 0;\n        textContentItem.vertical = true;\n      }\n\n      const scaleLineX = Math.hypot(textState.textLineMatrix[0], textState.textLineMatrix[1]);\n      const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]);\n      textContentItem.textAdvanceScale = scaleCtmX * scaleLineX;\n      textContentItem.lastAdvanceWidth = 0;\n      textContentItem.lastAdvanceHeight = 0;\n      var spaceWidth = font.spaceWidth / 1000 * textState.fontSize;\n\n      if (spaceWidth) {\n        textContentItem.spaceWidth = spaceWidth;\n        textContentItem.fakeSpaceMin = spaceWidth * SPACE_FACTOR;\n        textContentItem.fakeMultiSpaceMin = spaceWidth * MULTI_SPACE_FACTOR;\n        textContentItem.fakeMultiSpaceMax = spaceWidth * MULTI_SPACE_FACTOR_MAX;\n        textContentItem.textRunBreakAllowed = !font.isMonospace;\n      } else {\n        textContentItem.spaceWidth = 0;\n        textContentItem.fakeSpaceMin = Infinity;\n        textContentItem.fakeMultiSpaceMin = Infinity;\n        textContentItem.fakeMultiSpaceMax = 0;\n        textContentItem.textRunBreakAllowed = false;\n      }\n\n      textContentItem.initialized = true;\n      return textContentItem;\n    }\n\n    function replaceWhitespace(str) {\n      var i = 0,\n          ii = str.length,\n          code;\n\n      while (i < ii && (code = str.charCodeAt(i)) >= 0x20 && code <= 0x7f) {\n        i++;\n      }\n\n      return i < ii ? str.replace(WhitespaceRegexp, \" \") : str;\n    }\n\n    function runBidiTransform(textChunk) {\n      var str = textChunk.str.join(\"\");\n      var bidiResult = (0, _bidi.bidi)(str, -1, textChunk.vertical);\n      return {\n        str: normalizeWhitespace ? replaceWhitespace(bidiResult.str) : bidiResult.str,\n        dir: bidiResult.dir,\n        width: textChunk.width,\n        height: textChunk.height,\n        transform: textChunk.transform,\n        fontName: textChunk.fontName\n      };\n    }\n\n    function handleSetFont(fontName, fontRef) {\n      return self.loadFont(fontName, fontRef, resources).then(function (translated) {\n        textState.font = translated.font;\n        textState.fontMatrix = translated.font.fontMatrix || _util.FONT_IDENTITY_MATRIX;\n      });\n    }\n\n    function buildTextContentItem(chars) {\n      var font = textState.font;\n      var textChunk = ensureTextContentItem();\n      var width = 0;\n      var height = 0;\n      var glyphs = font.charsToGlyphs(chars);\n\n      for (var i = 0; i < glyphs.length; i++) {\n        var glyph = glyphs[i];\n        var glyphWidth = null;\n\n        if (font.vertical && glyph.vmetric) {\n          glyphWidth = glyph.vmetric[0];\n        } else {\n          glyphWidth = glyph.width;\n        }\n\n        var glyphUnicode = glyph.unicode;\n        var NormalizedUnicodes = (0, _unicode.getNormalizedUnicodes)();\n\n        if (NormalizedUnicodes[glyphUnicode] !== undefined) {\n          glyphUnicode = NormalizedUnicodes[glyphUnicode];\n        }\n\n        glyphUnicode = (0, _unicode.reverseIfRtl)(glyphUnicode);\n        var charSpacing = textState.charSpacing;\n\n        if (glyph.isSpace) {\n          var wordSpacing = textState.wordSpacing;\n          charSpacing += wordSpacing;\n\n          if (wordSpacing > 0) {\n            addFakeSpaces(wordSpacing, textChunk.str);\n          }\n        }\n\n        var tx = 0;\n        var ty = 0;\n\n        if (!font.vertical) {\n          var w0 = glyphWidth * textState.fontMatrix[0];\n          tx = (w0 * textState.fontSize + charSpacing) * textState.textHScale;\n          width += tx;\n        } else {\n          var w1 = glyphWidth * textState.fontMatrix[0];\n          ty = w1 * textState.fontSize + charSpacing;\n          height += ty;\n        }\n\n        textState.translateTextMatrix(tx, ty);\n        textChunk.str.push(glyphUnicode);\n      }\n\n      if (!font.vertical) {\n        textChunk.lastAdvanceWidth = width;\n        textChunk.width += width;\n      } else {\n        textChunk.lastAdvanceHeight = height;\n        textChunk.height += Math.abs(height);\n      }\n\n      return textChunk;\n    }\n\n    function addFakeSpaces(width, strBuf) {\n      if (width < textContentItem.fakeSpaceMin) {\n        return;\n      }\n\n      if (width < textContentItem.fakeMultiSpaceMin) {\n        strBuf.push(\" \");\n        return;\n      }\n\n      var fakeSpaces = Math.round(width / textContentItem.spaceWidth);\n\n      while (fakeSpaces-- > 0) {\n        strBuf.push(\" \");\n      }\n    }\n\n    function flushTextContentItem() {\n      if (!textContentItem.initialized) {\n        return;\n      }\n\n      if (!textContentItem.vertical) {\n        textContentItem.width *= textContentItem.textAdvanceScale;\n      } else {\n        textContentItem.height *= textContentItem.textAdvanceScale;\n      }\n\n      textContent.items.push(runBidiTransform(textContentItem));\n      textContentItem.initialized = false;\n      textContentItem.str.length = 0;\n    }\n\n    function enqueueChunk() {\n      const length = textContent.items.length;\n\n      if (length > 0) {\n        sink.enqueue(textContent, length);\n        textContent.items = [];\n        textContent.styles = Object.create(null);\n      }\n    }\n\n    var timeSlotManager = new TimeSlotManager();\n    return new Promise(function promiseBody(resolve, reject) {\n      const next = function (promise) {\n        enqueueChunk();\n        Promise.all([promise, sink.ready]).then(function () {\n          try {\n            promiseBody(resolve, reject);\n          } catch (ex) {\n            reject(ex);\n          }\n        }, reject);\n      };\n\n      task.ensureNotTerminated();\n      timeSlotManager.reset();\n      var stop,\n          operation = {},\n          args = [];\n\n      while (!(stop = timeSlotManager.check())) {\n        args.length = 0;\n        operation.args = args;\n\n        if (!preprocessor.read(operation)) {\n          break;\n        }\n\n        textState = stateManager.state;\n        var fn = operation.fn;\n        args = operation.args;\n        var advance, diff;\n\n        switch (fn | 0) {\n          case _util.OPS.setFont:\n            var fontNameArg = args[0].name,\n                fontSizeArg = args[1];\n\n            if (textState.font && fontNameArg === textState.fontName && fontSizeArg === textState.fontSize) {\n              break;\n            }\n\n            flushTextContentItem();\n            textState.fontName = fontNameArg;\n            textState.fontSize = fontSizeArg;\n            next(handleSetFont(fontNameArg, null));\n            return;\n\n          case _util.OPS.setTextRise:\n            flushTextContentItem();\n            textState.textRise = args[0];\n            break;\n\n          case _util.OPS.setHScale:\n            flushTextContentItem();\n            textState.textHScale = args[0] / 100;\n            break;\n\n          case _util.OPS.setLeading:\n            flushTextContentItem();\n            textState.leading = args[0];\n            break;\n\n          case _util.OPS.moveText:\n            var isSameTextLine = !textState.font ? false : (textState.font.vertical ? args[0] : args[1]) === 0;\n            advance = args[0] - args[1];\n\n            if (combineTextItems && isSameTextLine && textContentItem.initialized && advance > 0 && advance <= textContentItem.fakeMultiSpaceMax) {\n              textState.translateTextLineMatrix(args[0], args[1]);\n              textContentItem.width += args[0] - textContentItem.lastAdvanceWidth;\n              textContentItem.height += args[1] - textContentItem.lastAdvanceHeight;\n              diff = args[0] - textContentItem.lastAdvanceWidth - (args[1] - textContentItem.lastAdvanceHeight);\n              addFakeSpaces(diff, textContentItem.str);\n              break;\n            }\n\n            flushTextContentItem();\n            textState.translateTextLineMatrix(args[0], args[1]);\n            textState.textMatrix = textState.textLineMatrix.slice();\n            break;\n\n          case _util.OPS.setLeadingMoveText:\n            flushTextContentItem();\n            textState.leading = -args[1];\n            textState.translateTextLineMatrix(args[0], args[1]);\n            textState.textMatrix = textState.textLineMatrix.slice();\n            break;\n\n          case _util.OPS.nextLine:\n            flushTextContentItem();\n            textState.carriageReturn();\n            break;\n\n          case _util.OPS.setTextMatrix:\n            advance = textState.calcTextLineMatrixAdvance(args[0], args[1], args[2], args[3], args[4], args[5]);\n\n            if (combineTextItems && advance !== null && textContentItem.initialized && advance.value > 0 && advance.value <= textContentItem.fakeMultiSpaceMax) {\n              textState.translateTextLineMatrix(advance.width, advance.height);\n              textContentItem.width += advance.width - textContentItem.lastAdvanceWidth;\n              textContentItem.height += advance.height - textContentItem.lastAdvanceHeight;\n              diff = advance.width - textContentItem.lastAdvanceWidth - (advance.height - textContentItem.lastAdvanceHeight);\n              addFakeSpaces(diff, textContentItem.str);\n              break;\n            }\n\n            flushTextContentItem();\n            textState.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);\n            textState.setTextLineMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);\n            break;\n\n          case _util.OPS.setCharSpacing:\n            textState.charSpacing = args[0];\n            break;\n\n          case _util.OPS.setWordSpacing:\n            textState.wordSpacing = args[0];\n            break;\n\n          case _util.OPS.beginText:\n            flushTextContentItem();\n            textState.textMatrix = _util.IDENTITY_MATRIX.slice();\n            textState.textLineMatrix = _util.IDENTITY_MATRIX.slice();\n            break;\n\n          case _util.OPS.showSpacedText:\n            if (!stateManager.state.font) {\n              self.ensureStateFont(stateManager.state);\n              continue;\n            }\n\n            var items = args[0];\n            var offset;\n\n            for (var j = 0, jj = items.length; j < jj; j++) {\n              if (typeof items[j] === \"string\") {\n                buildTextContentItem(items[j]);\n              } else if ((0, _util.isNum)(items[j])) {\n                ensureTextContentItem();\n                advance = items[j] * textState.fontSize / 1000;\n                var breakTextRun = false;\n\n                if (textState.font.vertical) {\n                  offset = advance;\n                  textState.translateTextMatrix(0, offset);\n                  breakTextRun = textContentItem.textRunBreakAllowed && advance > textContentItem.fakeMultiSpaceMax;\n\n                  if (!breakTextRun) {\n                    textContentItem.height += offset;\n                  }\n                } else {\n                  advance = -advance;\n                  offset = advance * textState.textHScale;\n                  textState.translateTextMatrix(offset, 0);\n                  breakTextRun = textContentItem.textRunBreakAllowed && advance > textContentItem.fakeMultiSpaceMax;\n\n                  if (!breakTextRun) {\n                    textContentItem.width += offset;\n                  }\n                }\n\n                if (breakTextRun) {\n                  flushTextContentItem();\n                } else if (advance > 0) {\n                  addFakeSpaces(advance, textContentItem.str);\n                }\n              }\n            }\n\n            break;\n\n          case _util.OPS.showText:\n            if (!stateManager.state.font) {\n              self.ensureStateFont(stateManager.state);\n              continue;\n            }\n\n            buildTextContentItem(args[0]);\n            break;\n\n          case _util.OPS.nextLineShowText:\n            if (!stateManager.state.font) {\n              self.ensureStateFont(stateManager.state);\n              continue;\n            }\n\n            flushTextContentItem();\n            textState.carriageReturn();\n            buildTextContentItem(args[0]);\n            break;\n\n          case _util.OPS.nextLineSetSpacingShowText:\n            if (!stateManager.state.font) {\n              self.ensureStateFont(stateManager.state);\n              continue;\n            }\n\n            flushTextContentItem();\n            textState.wordSpacing = args[0];\n            textState.charSpacing = args[1];\n            textState.carriageReturn();\n            buildTextContentItem(args[2]);\n            break;\n\n          case _util.OPS.paintXObject:\n            flushTextContentItem();\n\n            if (!xobjs) {\n              xobjs = resources.get(\"XObject\") || _primitives.Dict.empty;\n            }\n\n            var name = args[0].name;\n\n            if (name && emptyXObjectCache.getByName(name)) {\n              break;\n            }\n\n            next(new Promise(function (resolveXObject, rejectXObject) {\n              if (!name) {\n                throw new _util.FormatError(\"XObject must be referred to by name.\");\n              }\n\n              let xobj = xobjs.getRaw(name);\n\n              if (xobj instanceof _primitives.Ref) {\n                if (emptyXObjectCache.getByRef(xobj)) {\n                  resolveXObject();\n                  return;\n                }\n\n                const globalImage = self.globalImageCache.getData(xobj, self.pageIndex);\n\n                if (globalImage) {\n                  resolveXObject();\n                  return;\n                }\n\n                xobj = xref.fetch(xobj);\n              }\n\n              if (!(0, _primitives.isStream)(xobj)) {\n                throw new _util.FormatError(\"XObject should be a stream\");\n              }\n\n              const type = xobj.dict.get(\"Subtype\");\n\n              if (!(0, _primitives.isName)(type)) {\n                throw new _util.FormatError(\"XObject should have a Name subtype\");\n              }\n\n              if (type.name !== \"Form\") {\n                emptyXObjectCache.set(name, xobj.dict.objId, true);\n                resolveXObject();\n                return;\n              }\n\n              const currentState = stateManager.state.clone();\n              const xObjStateManager = new StateManager(currentState);\n              const matrix = xobj.dict.getArray(\"Matrix\");\n\n              if (Array.isArray(matrix) && matrix.length === 6) {\n                xObjStateManager.transform(matrix);\n              }\n\n              enqueueChunk();\n              const sinkWrapper = {\n                enqueueInvoked: false,\n\n                enqueue(chunk, size) {\n                  this.enqueueInvoked = true;\n                  sink.enqueue(chunk, size);\n                },\n\n                get desiredSize() {\n                  return sink.desiredSize;\n                },\n\n                get ready() {\n                  return sink.ready;\n                }\n\n              };\n              self.getTextContent({\n                stream: xobj,\n                task,\n                resources: xobj.dict.get(\"Resources\") || resources,\n                stateManager: xObjStateManager,\n                normalizeWhitespace,\n                combineTextItems,\n                sink: sinkWrapper,\n                seenStyles\n              }).then(function () {\n                if (!sinkWrapper.enqueueInvoked) {\n                  emptyXObjectCache.set(name, xobj.dict.objId, true);\n                }\n\n                resolveXObject();\n              }, rejectXObject);\n            }).catch(function (reason) {\n              if (reason instanceof _util.AbortException) {\n                return;\n              }\n\n              if (self.options.ignoreErrors) {\n                (0, _util.warn)(`getTextContent - ignoring XObject: \"${reason}\".`);\n                return;\n              }\n\n              throw reason;\n            }));\n            return;\n\n          case _util.OPS.setGState:\n            name = args[0].name;\n\n            if (name && emptyGStateCache.getByName(name)) {\n              break;\n            }\n\n            next(new Promise(function (resolveGState, rejectGState) {\n              if (!name) {\n                throw new _util.FormatError(\"GState must be referred to by name.\");\n              }\n\n              const extGState = resources.get(\"ExtGState\");\n\n              if (!(extGState instanceof _primitives.Dict)) {\n                throw new _util.FormatError(\"ExtGState should be a dictionary.\");\n              }\n\n              const gState = extGState.get(name);\n\n              if (!(gState instanceof _primitives.Dict)) {\n                throw new _util.FormatError(\"GState should be a dictionary.\");\n              }\n\n              const gStateFont = gState.get(\"Font\");\n\n              if (!gStateFont) {\n                emptyGStateCache.set(name, gState.objId, true);\n                resolveGState();\n                return;\n              }\n\n              flushTextContentItem();\n              textState.fontName = null;\n              textState.fontSize = gStateFont[1];\n              handleSetFont(null, gStateFont[0]).then(resolveGState, rejectGState);\n            }).catch(function (reason) {\n              if (reason instanceof _util.AbortException) {\n                return;\n              }\n\n              if (self.options.ignoreErrors) {\n                (0, _util.warn)(`getTextContent - ignoring ExtGState: \"${reason}\".`);\n                return;\n              }\n\n              throw reason;\n            }));\n            return;\n        }\n\n        if (textContent.items.length >= sink.desiredSize) {\n          stop = true;\n          break;\n        }\n      }\n\n      if (stop) {\n        next(deferred);\n        return;\n      }\n\n      flushTextContentItem();\n      enqueueChunk();\n      resolve();\n    }).catch(reason => {\n      if (reason instanceof _util.AbortException) {\n        return;\n      }\n\n      if (this.options.ignoreErrors) {\n        (0, _util.warn)(`getTextContent - ignoring errors during \"${task.name}\" ` + `task: \"${reason}\".`);\n        flushTextContentItem();\n        enqueueChunk();\n        return;\n      }\n\n      throw reason;\n    });\n  }\n\n  extractDataStructures(dict, baseDict, properties) {\n    const xref = this.xref;\n    let cidToGidBytes;\n    var toUnicode = dict.get(\"ToUnicode\") || baseDict.get(\"ToUnicode\");\n    var toUnicodePromise = toUnicode ? this.readToUnicode(toUnicode) : Promise.resolve(undefined);\n\n    if (properties.composite) {\n      var cidSystemInfo = dict.get(\"CIDSystemInfo\");\n\n      if ((0, _primitives.isDict)(cidSystemInfo)) {\n        properties.cidSystemInfo = {\n          registry: (0, _util.stringToPDFString)(cidSystemInfo.get(\"Registry\")),\n          ordering: (0, _util.stringToPDFString)(cidSystemInfo.get(\"Ordering\")),\n          supplement: cidSystemInfo.get(\"Supplement\")\n        };\n      }\n\n      var cidToGidMap = dict.get(\"CIDToGIDMap\");\n\n      if ((0, _primitives.isStream)(cidToGidMap)) {\n        cidToGidBytes = cidToGidMap.getBytes();\n      }\n    }\n\n    var differences = [];\n    var baseEncodingName = null;\n    var encoding;\n\n    if (dict.has(\"Encoding\")) {\n      encoding = dict.get(\"Encoding\");\n\n      if ((0, _primitives.isDict)(encoding)) {\n        baseEncodingName = encoding.get(\"BaseEncoding\");\n        baseEncodingName = (0, _primitives.isName)(baseEncodingName) ? baseEncodingName.name : null;\n\n        if (encoding.has(\"Differences\")) {\n          var diffEncoding = encoding.get(\"Differences\");\n          var index = 0;\n\n          for (var j = 0, jj = diffEncoding.length; j < jj; j++) {\n            var data = xref.fetchIfRef(diffEncoding[j]);\n\n            if ((0, _util.isNum)(data)) {\n              index = data;\n            } else if ((0, _primitives.isName)(data)) {\n              differences[index++] = data.name;\n            } else {\n              throw new _util.FormatError(`Invalid entry in 'Differences' array: ${data}`);\n            }\n          }\n        }\n      } else if ((0, _primitives.isName)(encoding)) {\n        baseEncodingName = encoding.name;\n      } else {\n        throw new _util.FormatError(\"Encoding is not a Name nor a Dict\");\n      }\n\n      if (baseEncodingName !== \"MacRomanEncoding\" && baseEncodingName !== \"MacExpertEncoding\" && baseEncodingName !== \"WinAnsiEncoding\") {\n        baseEncodingName = null;\n      }\n    }\n\n    if (baseEncodingName) {\n      properties.defaultEncoding = (0, _encodings.getEncoding)(baseEncodingName).slice();\n    } else {\n      var isSymbolicFont = !!(properties.flags & _fonts.FontFlags.Symbolic);\n      var isNonsymbolicFont = !!(properties.flags & _fonts.FontFlags.Nonsymbolic);\n      encoding = _encodings.StandardEncoding;\n\n      if (properties.type === \"TrueType\" && !isNonsymbolicFont) {\n        encoding = _encodings.WinAnsiEncoding;\n      }\n\n      if (isSymbolicFont) {\n        encoding = _encodings.MacRomanEncoding;\n\n        if (!properties.file) {\n          if (/Symbol/i.test(properties.name)) {\n            encoding = _encodings.SymbolSetEncoding;\n          } else if (/Dingbats|Wingdings/i.test(properties.name)) {\n            encoding = _encodings.ZapfDingbatsEncoding;\n          }\n        }\n      }\n\n      properties.defaultEncoding = encoding;\n    }\n\n    properties.differences = differences;\n    properties.baseEncodingName = baseEncodingName;\n    properties.hasEncoding = !!baseEncodingName || differences.length > 0;\n    properties.dict = dict;\n    return toUnicodePromise.then(readToUnicode => {\n      properties.toUnicode = readToUnicode;\n      return this.buildToUnicode(properties);\n    }).then(builtToUnicode => {\n      properties.toUnicode = builtToUnicode;\n\n      if (cidToGidBytes) {\n        properties.cidToGidMap = this.readCidToGidMap(cidToGidBytes, builtToUnicode);\n      }\n\n      return properties;\n    });\n  }\n\n  _buildSimpleFontToUnicode(properties, forceGlyphs = false) {\n    (0, _util.assert)(!properties.composite, \"Must be a simple font.\");\n    const toUnicode = [];\n    const encoding = properties.defaultEncoding.slice();\n    const baseEncodingName = properties.baseEncodingName;\n    const differences = properties.differences;\n\n    for (const charcode in differences) {\n      const glyphName = differences[charcode];\n\n      if (glyphName === \".notdef\") {\n        continue;\n      }\n\n      encoding[charcode] = glyphName;\n    }\n\n    const glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();\n\n    for (const charcode in encoding) {\n      let glyphName = encoding[charcode];\n\n      if (glyphName === \"\") {\n        continue;\n      } else if (glyphsUnicodeMap[glyphName] === undefined) {\n        let code = 0;\n\n        switch (glyphName[0]) {\n          case \"G\":\n            if (glyphName.length === 3) {\n              code = parseInt(glyphName.substring(1), 16);\n            }\n\n            break;\n\n          case \"g\":\n            if (glyphName.length === 5) {\n              code = parseInt(glyphName.substring(1), 16);\n            }\n\n            break;\n\n          case \"C\":\n          case \"c\":\n            if (glyphName.length >= 3 && glyphName.length <= 4) {\n              const codeStr = glyphName.substring(1);\n\n              if (forceGlyphs) {\n                code = parseInt(codeStr, 16);\n                break;\n              }\n\n              code = +codeStr;\n\n              if (Number.isNaN(code) && Number.isInteger(parseInt(codeStr, 16))) {\n                return this._buildSimpleFontToUnicode(properties, true);\n              }\n            }\n\n            break;\n\n          default:\n            const unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);\n\n            if (unicode !== -1) {\n              code = unicode;\n            }\n\n        }\n\n        if (code > 0 && code <= 0x10ffff && Number.isInteger(code)) {\n          if (baseEncodingName && code === +charcode) {\n            const baseEncoding = (0, _encodings.getEncoding)(baseEncodingName);\n\n            if (baseEncoding && (glyphName = baseEncoding[charcode])) {\n              toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]);\n              continue;\n            }\n          }\n\n          toUnicode[charcode] = String.fromCodePoint(code);\n        }\n\n        continue;\n      }\n\n      toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]);\n    }\n\n    return new _fonts.ToUnicodeMap(toUnicode);\n  }\n\n  buildToUnicode(properties) {\n    properties.hasIncludedToUnicodeMap = !!properties.toUnicode && properties.toUnicode.length > 0;\n\n    if (properties.hasIncludedToUnicodeMap) {\n      if (!properties.composite && properties.hasEncoding) {\n        properties.fallbackToUnicode = this._buildSimpleFontToUnicode(properties);\n      }\n\n      return Promise.resolve(properties.toUnicode);\n    }\n\n    if (!properties.composite) {\n      return Promise.resolve(this._buildSimpleFontToUnicode(properties));\n    }\n\n    if (properties.composite && (properties.cMap.builtInCMap && !(properties.cMap instanceof _cmap.IdentityCMap) || properties.cidSystemInfo.registry === \"Adobe\" && (properties.cidSystemInfo.ordering === \"GB1\" || properties.cidSystemInfo.ordering === \"CNS1\" || properties.cidSystemInfo.ordering === \"Japan1\" || properties.cidSystemInfo.ordering === \"Korea1\"))) {\n      const registry = properties.cidSystemInfo.registry;\n      const ordering = properties.cidSystemInfo.ordering;\n\n      const ucs2CMapName = _primitives.Name.get(registry + \"-\" + ordering + \"-UCS2\");\n\n      return _cmap.CMapFactory.create({\n        encoding: ucs2CMapName,\n        fetchBuiltInCMap: this._fetchBuiltInCMapBound,\n        useCMap: null\n      }).then(function (ucs2CMap) {\n        const cMap = properties.cMap;\n        const toUnicode = [];\n        cMap.forEach(function (charcode, cid) {\n          if (cid > 0xffff) {\n            throw new _util.FormatError(\"Max size of CID is 65,535\");\n          }\n\n          const ucs2 = ucs2CMap.lookup(cid);\n\n          if (ucs2) {\n            toUnicode[charcode] = String.fromCharCode((ucs2.charCodeAt(0) << 8) + ucs2.charCodeAt(1));\n          }\n        });\n        return new _fonts.ToUnicodeMap(toUnicode);\n      });\n    }\n\n    return Promise.resolve(new _fonts.IdentityToUnicodeMap(properties.firstChar, properties.lastChar));\n  }\n\n  readToUnicode(toUnicode) {\n    var cmapObj = toUnicode;\n\n    if ((0, _primitives.isName)(cmapObj)) {\n      return _cmap.CMapFactory.create({\n        encoding: cmapObj,\n        fetchBuiltInCMap: this._fetchBuiltInCMapBound,\n        useCMap: null\n      }).then(function (cmap) {\n        if (cmap instanceof _cmap.IdentityCMap) {\n          return new _fonts.IdentityToUnicodeMap(0, 0xffff);\n        }\n\n        return new _fonts.ToUnicodeMap(cmap.getMap());\n      });\n    } else if ((0, _primitives.isStream)(cmapObj)) {\n      return _cmap.CMapFactory.create({\n        encoding: cmapObj,\n        fetchBuiltInCMap: this._fetchBuiltInCMapBound,\n        useCMap: null\n      }).then(function (cmap) {\n        if (cmap instanceof _cmap.IdentityCMap) {\n          return new _fonts.IdentityToUnicodeMap(0, 0xffff);\n        }\n\n        var map = new Array(cmap.length);\n        cmap.forEach(function (charCode, token) {\n          var str = [];\n\n          for (var k = 0; k < token.length; k += 2) {\n            var w1 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1);\n\n            if ((w1 & 0xf800) !== 0xd800) {\n              str.push(w1);\n              continue;\n            }\n\n            k += 2;\n            var w2 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1);\n            str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000);\n          }\n\n          map[charCode] = String.fromCodePoint.apply(String, str);\n        });\n        return new _fonts.ToUnicodeMap(map);\n      }, reason => {\n        if (reason instanceof _util.AbortException) {\n          return null;\n        }\n\n        if (this.options.ignoreErrors) {\n          this.handler.send(\"UnsupportedFeature\", {\n            featureId: _util.UNSUPPORTED_FEATURES.errorFontToUnicode\n          });\n          (0, _util.warn)(`readToUnicode - ignoring ToUnicode data: \"${reason}\".`);\n          return null;\n        }\n\n        throw reason;\n      });\n    }\n\n    return Promise.resolve(null);\n  }\n\n  readCidToGidMap(glyphsData, toUnicode) {\n    var result = [];\n\n    for (var j = 0, jj = glyphsData.length; j < jj; j++) {\n      var glyphID = glyphsData[j++] << 8 | glyphsData[j];\n      const code = j >> 1;\n\n      if (glyphID === 0 && !toUnicode.has(code)) {\n        continue;\n      }\n\n      result[code] = glyphID;\n    }\n\n    return result;\n  }\n\n  extractWidths(dict, descriptor, properties) {\n    var xref = this.xref;\n    var glyphsWidths = [];\n    var defaultWidth = 0;\n    var glyphsVMetrics = [];\n    var defaultVMetrics;\n    var i, ii, j, jj, start, code, widths;\n\n    if (properties.composite) {\n      defaultWidth = dict.has(\"DW\") ? dict.get(\"DW\") : 1000;\n      widths = dict.get(\"W\");\n\n      if (widths) {\n        for (i = 0, ii = widths.length; i < ii; i++) {\n          start = xref.fetchIfRef(widths[i++]);\n          code = xref.fetchIfRef(widths[i]);\n\n          if (Array.isArray(code)) {\n            for (j = 0, jj = code.length; j < jj; j++) {\n              glyphsWidths[start++] = xref.fetchIfRef(code[j]);\n            }\n          } else {\n            var width = xref.fetchIfRef(widths[++i]);\n\n            for (j = start; j <= code; j++) {\n              glyphsWidths[j] = width;\n            }\n          }\n        }\n      }\n\n      if (properties.vertical) {\n        var vmetrics = dict.getArray(\"DW2\") || [880, -1000];\n        defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]];\n        vmetrics = dict.get(\"W2\");\n\n        if (vmetrics) {\n          for (i = 0, ii = vmetrics.length; i < ii; i++) {\n            start = xref.fetchIfRef(vmetrics[i++]);\n            code = xref.fetchIfRef(vmetrics[i]);\n\n            if (Array.isArray(code)) {\n              for (j = 0, jj = code.length; j < jj; j++) {\n                glyphsVMetrics[start++] = [xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j])];\n              }\n            } else {\n              var vmetric = [xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i])];\n\n              for (j = start; j <= code; j++) {\n                glyphsVMetrics[j] = vmetric;\n              }\n            }\n          }\n        }\n      }\n    } else {\n      var firstChar = properties.firstChar;\n      widths = dict.get(\"Widths\");\n\n      if (widths) {\n        j = firstChar;\n\n        for (i = 0, ii = widths.length; i < ii; i++) {\n          glyphsWidths[j++] = xref.fetchIfRef(widths[i]);\n        }\n\n        defaultWidth = parseFloat(descriptor.get(\"MissingWidth\")) || 0;\n      } else {\n        var baseFontName = dict.get(\"BaseFont\");\n\n        if ((0, _primitives.isName)(baseFontName)) {\n          var metrics = this.getBaseFontMetrics(baseFontName.name);\n          glyphsWidths = this.buildCharCodeToWidth(metrics.widths, properties);\n          defaultWidth = metrics.defaultWidth;\n        }\n      }\n    }\n\n    var isMonospace = true;\n    var firstWidth = defaultWidth;\n\n    for (var glyph in glyphsWidths) {\n      var glyphWidth = glyphsWidths[glyph];\n\n      if (!glyphWidth) {\n        continue;\n      }\n\n      if (!firstWidth) {\n        firstWidth = glyphWidth;\n        continue;\n      }\n\n      if (firstWidth !== glyphWidth) {\n        isMonospace = false;\n        break;\n      }\n    }\n\n    if (isMonospace) {\n      properties.flags |= _fonts.FontFlags.FixedPitch;\n    }\n\n    properties.defaultWidth = defaultWidth;\n    properties.widths = glyphsWidths;\n    properties.defaultVMetrics = defaultVMetrics;\n    properties.vmetrics = glyphsVMetrics;\n  }\n\n  isSerifFont(baseFontName) {\n    var fontNameWoStyle = baseFontName.split(\"-\")[0];\n    return fontNameWoStyle in (0, _standard_fonts.getSerifFonts)() || fontNameWoStyle.search(/serif/gi) !== -1;\n  }\n\n  getBaseFontMetrics(name) {\n    var defaultWidth = 0;\n    var widths = Object.create(null);\n    var monospace = false;\n    var stdFontMap = (0, _standard_fonts.getStdFontMap)();\n    var lookupName = stdFontMap[name] || name;\n    var Metrics = (0, _metrics.getMetrics)();\n\n    if (!(lookupName in Metrics)) {\n      if (this.isSerifFont(name)) {\n        lookupName = \"Times-Roman\";\n      } else {\n        lookupName = \"Helvetica\";\n      }\n    }\n\n    var glyphWidths = Metrics[lookupName];\n\n    if ((0, _util.isNum)(glyphWidths)) {\n      defaultWidth = glyphWidths;\n      monospace = true;\n    } else {\n      widths = glyphWidths();\n    }\n\n    return {\n      defaultWidth,\n      monospace,\n      widths\n    };\n  }\n\n  buildCharCodeToWidth(widthsByGlyphName, properties) {\n    var widths = Object.create(null);\n    var differences = properties.differences;\n    var encoding = properties.defaultEncoding;\n\n    for (var charCode = 0; charCode < 256; charCode++) {\n      if (charCode in differences && widthsByGlyphName[differences[charCode]]) {\n        widths[charCode] = widthsByGlyphName[differences[charCode]];\n        continue;\n      }\n\n      if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) {\n        widths[charCode] = widthsByGlyphName[encoding[charCode]];\n        continue;\n      }\n    }\n\n    return widths;\n  }\n\n  preEvaluateFont(dict) {\n    var baseDict = dict;\n    var type = dict.get(\"Subtype\");\n\n    if (!(0, _primitives.isName)(type)) {\n      throw new _util.FormatError(\"invalid font Subtype\");\n    }\n\n    var composite = false;\n    var uint8array;\n\n    if (type.name === \"Type0\") {\n      var df = dict.get(\"DescendantFonts\");\n\n      if (!df) {\n        throw new _util.FormatError(\"Descendant fonts are not specified\");\n      }\n\n      dict = Array.isArray(df) ? this.xref.fetchIfRef(df[0]) : df;\n\n      if (!(dict instanceof _primitives.Dict)) {\n        throw new _util.FormatError(\"Descendant font is not a dictionary.\");\n      }\n\n      type = dict.get(\"Subtype\");\n\n      if (!(0, _primitives.isName)(type)) {\n        throw new _util.FormatError(\"invalid font Subtype\");\n      }\n\n      composite = true;\n    }\n\n    var descriptor = dict.get(\"FontDescriptor\");\n\n    if (descriptor) {\n      var hash = new _murmurhash.MurmurHash3_64();\n      var encoding = baseDict.getRaw(\"Encoding\");\n\n      if ((0, _primitives.isName)(encoding)) {\n        hash.update(encoding.name);\n      } else if ((0, _primitives.isRef)(encoding)) {\n        hash.update(encoding.toString());\n      } else if ((0, _primitives.isDict)(encoding)) {\n        for (const entry of encoding.getRawValues()) {\n          if ((0, _primitives.isName)(entry)) {\n            hash.update(entry.name);\n          } else if ((0, _primitives.isRef)(entry)) {\n            hash.update(entry.toString());\n          } else if (Array.isArray(entry)) {\n            var diffLength = entry.length,\n                diffBuf = new Array(diffLength);\n\n            for (var j = 0; j < diffLength; j++) {\n              var diffEntry = entry[j];\n\n              if ((0, _primitives.isName)(diffEntry)) {\n                diffBuf[j] = diffEntry.name;\n              } else if ((0, _util.isNum)(diffEntry) || (0, _primitives.isRef)(diffEntry)) {\n                diffBuf[j] = diffEntry.toString();\n              }\n            }\n\n            hash.update(diffBuf.join());\n          }\n        }\n      }\n\n      const firstChar = dict.get(\"FirstChar\") || 0;\n      const lastChar = dict.get(\"LastChar\") || (composite ? 0xffff : 0xff);\n      hash.update(`${firstChar}-${lastChar}`);\n      var toUnicode = dict.get(\"ToUnicode\") || baseDict.get(\"ToUnicode\");\n\n      if ((0, _primitives.isStream)(toUnicode)) {\n        var stream = toUnicode.str || toUnicode;\n        uint8array = stream.buffer ? new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : new Uint8Array(stream.bytes.buffer, stream.start, stream.end - stream.start);\n        hash.update(uint8array);\n      } else if ((0, _primitives.isName)(toUnicode)) {\n        hash.update(toUnicode.name);\n      }\n\n      var widths = dict.get(\"Widths\") || baseDict.get(\"Widths\");\n\n      if (widths) {\n        uint8array = new Uint8Array(new Uint32Array(widths).buffer);\n        hash.update(uint8array);\n      }\n    }\n\n    return {\n      descriptor,\n      dict,\n      baseDict,\n      composite,\n      type: type.name,\n      hash: hash ? hash.hexdigest() : \"\"\n    };\n  }\n\n  async translateFont(preEvaluatedFont) {\n    var baseDict = preEvaluatedFont.baseDict;\n    var dict = preEvaluatedFont.dict;\n    var composite = preEvaluatedFont.composite;\n    var descriptor = preEvaluatedFont.descriptor;\n    var type = preEvaluatedFont.type;\n    var maxCharIndex = composite ? 0xffff : 0xff;\n    var properties;\n    const firstChar = dict.get(\"FirstChar\") || 0;\n    const lastChar = dict.get(\"LastChar\") || maxCharIndex;\n\n    if (!descriptor) {\n      if (type === \"Type3\") {\n        descriptor = new _primitives.Dict(null);\n        descriptor.set(\"FontName\", _primitives.Name.get(type));\n        descriptor.set(\"FontBBox\", dict.getArray(\"FontBBox\") || [0, 0, 0, 0]);\n      } else {\n        var baseFontName = dict.get(\"BaseFont\");\n\n        if (!(0, _primitives.isName)(baseFontName)) {\n          throw new _util.FormatError(\"Base font is not specified\");\n        }\n\n        baseFontName = baseFontName.name.replace(/[,_]/g, \"-\");\n        var metrics = this.getBaseFontMetrics(baseFontName);\n        var fontNameWoStyle = baseFontName.split(\"-\")[0];\n        var flags = (this.isSerifFont(fontNameWoStyle) ? _fonts.FontFlags.Serif : 0) | (metrics.monospace ? _fonts.FontFlags.FixedPitch : 0) | ((0, _standard_fonts.getSymbolsFonts)()[fontNameWoStyle] ? _fonts.FontFlags.Symbolic : _fonts.FontFlags.Nonsymbolic);\n        properties = {\n          type,\n          name: baseFontName,\n          widths: metrics.widths,\n          defaultWidth: metrics.defaultWidth,\n          flags,\n          firstChar,\n          lastChar\n        };\n        const widths = dict.get(\"Widths\");\n        return this.extractDataStructures(dict, dict, properties).then(newProperties => {\n          if (widths) {\n            const glyphWidths = [];\n            let j = firstChar;\n\n            for (let i = 0, ii = widths.length; i < ii; i++) {\n              glyphWidths[j++] = this.xref.fetchIfRef(widths[i]);\n            }\n\n            newProperties.widths = glyphWidths;\n          } else {\n            newProperties.widths = this.buildCharCodeToWidth(metrics.widths, newProperties);\n          }\n\n          return new _fonts.Font(baseFontName, null, newProperties);\n        });\n      }\n    }\n\n    var fontName = descriptor.get(\"FontName\");\n    var baseFont = dict.get(\"BaseFont\");\n\n    if ((0, _util.isString)(fontName)) {\n      fontName = _primitives.Name.get(fontName);\n    }\n\n    if ((0, _util.isString)(baseFont)) {\n      baseFont = _primitives.Name.get(baseFont);\n    }\n\n    if (type !== \"Type3\") {\n      var fontNameStr = fontName && fontName.name;\n      var baseFontStr = baseFont && baseFont.name;\n\n      if (fontNameStr !== baseFontStr) {\n        (0, _util.info)(`The FontDescriptor's FontName is \"${fontNameStr}\" but ` + `should be the same as the Font's BaseFont \"${baseFontStr}\".`);\n\n        if (fontNameStr && baseFontStr && baseFontStr.startsWith(fontNameStr)) {\n          fontName = baseFont;\n        }\n      }\n    }\n\n    fontName = fontName || baseFont;\n\n    if (!(0, _primitives.isName)(fontName)) {\n      throw new _util.FormatError(\"invalid font name\");\n    }\n\n    let fontFile;\n\n    try {\n      fontFile = descriptor.get(\"FontFile\", \"FontFile2\", \"FontFile3\");\n    } catch (ex) {\n      if (!this.options.ignoreErrors) {\n        throw ex;\n      }\n\n      (0, _util.warn)(`translateFont - fetching \"${fontName.name}\" font file: \"${ex}\".`);\n      fontFile = new _stream.NullStream();\n    }\n\n    if (fontFile) {\n      if (fontFile.dict) {\n        var subtype = fontFile.dict.get(\"Subtype\");\n\n        if (subtype) {\n          subtype = subtype.name;\n        }\n\n        var length1 = fontFile.dict.get(\"Length1\");\n        var length2 = fontFile.dict.get(\"Length2\");\n        var length3 = fontFile.dict.get(\"Length3\");\n      }\n    }\n\n    properties = {\n      type,\n      name: fontName.name,\n      subtype,\n      file: fontFile,\n      length1,\n      length2,\n      length3,\n      loadedName: baseDict.loadedName,\n      composite,\n      fixedPitch: false,\n      fontMatrix: dict.getArray(\"FontMatrix\") || _util.FONT_IDENTITY_MATRIX,\n      firstChar: firstChar || 0,\n      lastChar: lastChar || maxCharIndex,\n      bbox: descriptor.getArray(\"FontBBox\"),\n      ascent: descriptor.get(\"Ascent\"),\n      descent: descriptor.get(\"Descent\"),\n      xHeight: descriptor.get(\"XHeight\"),\n      capHeight: descriptor.get(\"CapHeight\"),\n      flags: descriptor.get(\"Flags\"),\n      italicAngle: descriptor.get(\"ItalicAngle\"),\n      isType3Font: false\n    };\n\n    if (composite) {\n      const cidEncoding = baseDict.get(\"Encoding\");\n\n      if ((0, _primitives.isName)(cidEncoding)) {\n        properties.cidEncoding = cidEncoding.name;\n      }\n\n      const cMap = await _cmap.CMapFactory.create({\n        encoding: cidEncoding,\n        fetchBuiltInCMap: this._fetchBuiltInCMapBound,\n        useCMap: null\n      });\n      properties.cMap = cMap;\n      properties.vertical = properties.cMap.vertical;\n    }\n\n    return this.extractDataStructures(dict, baseDict, properties).then(newProperties => {\n      this.extractWidths(dict, descriptor, newProperties);\n\n      if (type === \"Type3\") {\n        newProperties.isType3Font = true;\n      }\n\n      return new _fonts.Font(fontName.name, fontFile, newProperties);\n    });\n  }\n\n  static buildFontPaths(font, glyphs, handler) {\n    function buildPath(fontChar) {\n      if (font.renderer.hasBuiltPath(fontChar)) {\n        return;\n      }\n\n      handler.send(\"commonobj\", [`${font.loadedName}_path_${fontChar}`, \"FontPath\", font.renderer.getPathJs(fontChar)]);\n    }\n\n    for (const glyph of glyphs) {\n      buildPath(glyph.fontChar);\n      const accent = glyph.accent;\n\n      if (accent && accent.fontChar) {\n        buildPath(accent.fontChar);\n      }\n    }\n  }\n\n  static get fallbackFontDict() {\n    const dict = new _primitives.Dict();\n    dict.set(\"BaseFont\", _primitives.Name.get(\"PDFJS-FallbackFont\"));\n    dict.set(\"Type\", _primitives.Name.get(\"FallbackType\"));\n    dict.set(\"Subtype\", _primitives.Name.get(\"FallbackType\"));\n    dict.set(\"Encoding\", _primitives.Name.get(\"WinAnsiEncoding\"));\n    return (0, _util.shadow)(this, \"fallbackFontDict\", dict);\n  }\n\n}\n\nexports.PartialEvaluator = PartialEvaluator;\n\nclass TranslatedFont {\n  constructor({\n    loadedName,\n    font,\n    dict,\n    extraProperties = false\n  }) {\n    this.loadedName = loadedName;\n    this.font = font;\n    this.dict = dict;\n    this._extraProperties = extraProperties;\n    this.type3Loaded = null;\n    this.type3Dependencies = font.isType3Font ? new Set() : null;\n    this.sent = false;\n  }\n\n  send(handler) {\n    if (this.sent) {\n      return;\n    }\n\n    this.sent = true;\n    handler.send(\"commonobj\", [this.loadedName, \"Font\", this.font.exportData(this._extraProperties)]);\n  }\n\n  fallback(handler) {\n    if (!this.font.data) {\n      return;\n    }\n\n    this.font.disableFontFace = true;\n    const glyphs = this.font.glyphCacheValues;\n    PartialEvaluator.buildFontPaths(this.font, glyphs, handler);\n  }\n\n  loadType3Data(evaluator, resources, task) {\n    if (this.type3Loaded) {\n      return this.type3Loaded;\n    }\n\n    if (!this.font.isType3Font) {\n      throw new Error(\"Must be a Type3 font.\");\n    }\n\n    var type3Options = Object.create(evaluator.options);\n    type3Options.ignoreErrors = false;\n    var type3Evaluator = evaluator.clone(type3Options);\n    type3Evaluator.parsingType3Font = true;\n    const translatedFont = this.font,\n          type3Dependencies = this.type3Dependencies;\n    var loadCharProcsPromise = Promise.resolve();\n    var charProcs = this.dict.get(\"CharProcs\");\n    var fontResources = this.dict.get(\"Resources\") || resources;\n    var charProcOperatorList = Object.create(null);\n\n    for (const key of charProcs.getKeys()) {\n      loadCharProcsPromise = loadCharProcsPromise.then(() => {\n        var glyphStream = charProcs.get(key);\n        var operatorList = new _operator_list.OperatorList();\n        return type3Evaluator.getOperatorList({\n          stream: glyphStream,\n          task,\n          resources: fontResources,\n          operatorList\n        }).then(() => {\n          if (operatorList.fnArray[0] === _util.OPS.setCharWidthAndBounds) {\n            this._removeType3ColorOperators(operatorList);\n          }\n\n          charProcOperatorList[key] = operatorList.getIR();\n\n          for (const dependency of operatorList.dependencies) {\n            type3Dependencies.add(dependency);\n          }\n        }).catch(function (reason) {\n          (0, _util.warn)(`Type3 font resource \"${key}\" is not available.`);\n          const dummyOperatorList = new _operator_list.OperatorList();\n          charProcOperatorList[key] = dummyOperatorList.getIR();\n        });\n      });\n    }\n\n    this.type3Loaded = loadCharProcsPromise.then(function () {\n      translatedFont.charProcOperatorList = charProcOperatorList;\n    });\n    return this.type3Loaded;\n  }\n\n  _removeType3ColorOperators(operatorList) {\n    let i = 1,\n        ii = operatorList.length;\n\n    while (i < ii) {\n      switch (operatorList.fnArray[i]) {\n        case _util.OPS.setStrokeColorSpace:\n        case _util.OPS.setFillColorSpace:\n        case _util.OPS.setStrokeColor:\n        case _util.OPS.setStrokeColorN:\n        case _util.OPS.setFillColor:\n        case _util.OPS.setFillColorN:\n        case _util.OPS.setStrokeGray:\n        case _util.OPS.setFillGray:\n        case _util.OPS.setStrokeRGBColor:\n        case _util.OPS.setFillRGBColor:\n        case _util.OPS.setStrokeCMYKColor:\n        case _util.OPS.setFillCMYKColor:\n        case _util.OPS.shadingFill:\n        case _util.OPS.setRenderingIntent:\n          operatorList.fnArray.splice(i, 1);\n          operatorList.argsArray.splice(i, 1);\n          ii--;\n          continue;\n\n        case _util.OPS.setGState:\n          const [gStateObj] = operatorList.argsArray[i];\n          let j = 0,\n              jj = gStateObj.length;\n\n          while (j < jj) {\n            const [gStateKey] = gStateObj[j];\n\n            switch (gStateKey) {\n              case \"TR\":\n              case \"TR2\":\n              case \"HT\":\n              case \"BG\":\n              case \"BG2\":\n              case \"UCR\":\n              case \"UCR2\":\n                gStateObj.splice(j, 1);\n                jj--;\n                continue;\n            }\n\n            j++;\n          }\n\n          break;\n      }\n\n      i++;\n    }\n  }\n\n}\n\nclass StateManager {\n  constructor(initialState = new EvalState()) {\n    this.state = initialState;\n    this.stateStack = [];\n  }\n\n  save() {\n    var old = this.state;\n    this.stateStack.push(this.state);\n    this.state = old.clone();\n  }\n\n  restore() {\n    var prev = this.stateStack.pop();\n\n    if (prev) {\n      this.state = prev;\n    }\n  }\n\n  transform(args) {\n    this.state.ctm = _util.Util.transform(this.state.ctm, args);\n  }\n\n}\n\nclass TextState {\n  constructor() {\n    this.ctm = new Float32Array(_util.IDENTITY_MATRIX);\n    this.fontName = null;\n    this.fontSize = 0;\n    this.font = null;\n    this.fontMatrix = _util.FONT_IDENTITY_MATRIX;\n    this.textMatrix = _util.IDENTITY_MATRIX.slice();\n    this.textLineMatrix = _util.IDENTITY_MATRIX.slice();\n    this.charSpacing = 0;\n    this.wordSpacing = 0;\n    this.leading = 0;\n    this.textHScale = 1;\n    this.textRise = 0;\n  }\n\n  setTextMatrix(a, b, c, d, e, f) {\n    var m = this.textMatrix;\n    m[0] = a;\n    m[1] = b;\n    m[2] = c;\n    m[3] = d;\n    m[4] = e;\n    m[5] = f;\n  }\n\n  setTextLineMatrix(a, b, c, d, e, f) {\n    var m = this.textLineMatrix;\n    m[0] = a;\n    m[1] = b;\n    m[2] = c;\n    m[3] = d;\n    m[4] = e;\n    m[5] = f;\n  }\n\n  translateTextMatrix(x, y) {\n    var m = this.textMatrix;\n    m[4] = m[0] * x + m[2] * y + m[4];\n    m[5] = m[1] * x + m[3] * y + m[5];\n  }\n\n  translateTextLineMatrix(x, y) {\n    var m = this.textLineMatrix;\n    m[4] = m[0] * x + m[2] * y + m[4];\n    m[5] = m[1] * x + m[3] * y + m[5];\n  }\n\n  calcTextLineMatrixAdvance(a, b, c, d, e, f) {\n    var font = this.font;\n\n    if (!font) {\n      return null;\n    }\n\n    var m = this.textLineMatrix;\n\n    if (!(a === m[0] && b === m[1] && c === m[2] && d === m[3])) {\n      return null;\n    }\n\n    var txDiff = e - m[4],\n        tyDiff = f - m[5];\n\n    if (font.vertical && txDiff !== 0 || !font.vertical && tyDiff !== 0) {\n      return null;\n    }\n\n    var tx,\n        ty,\n        denominator = a * d - b * c;\n\n    if (font.vertical) {\n      tx = -tyDiff * c / denominator;\n      ty = tyDiff * a / denominator;\n    } else {\n      tx = txDiff * d / denominator;\n      ty = -txDiff * b / denominator;\n    }\n\n    return {\n      width: tx,\n      height: ty,\n      value: font.vertical ? ty : tx\n    };\n  }\n\n  calcRenderMatrix(ctm) {\n    var tsm = [this.fontSize * this.textHScale, 0, 0, this.fontSize, 0, this.textRise];\n    return _util.Util.transform(ctm, _util.Util.transform(this.textMatrix, tsm));\n  }\n\n  carriageReturn() {\n    this.translateTextLineMatrix(0, -this.leading);\n    this.textMatrix = this.textLineMatrix.slice();\n  }\n\n  clone() {\n    var clone = Object.create(this);\n    clone.textMatrix = this.textMatrix.slice();\n    clone.textLineMatrix = this.textLineMatrix.slice();\n    clone.fontMatrix = this.fontMatrix.slice();\n    return clone;\n  }\n\n}\n\nclass EvalState {\n  constructor() {\n    this.ctm = new Float32Array(_util.IDENTITY_MATRIX);\n    this.font = null;\n    this.textRenderingMode = _util.TextRenderingMode.FILL;\n    this.fillColorSpace = _colorspace.ColorSpace.singletons.gray;\n    this.strokeColorSpace = _colorspace.ColorSpace.singletons.gray;\n  }\n\n  clone() {\n    return Object.create(this);\n  }\n\n}\n\nclass EvaluatorPreprocessor {\n  static get opMap() {\n    const getOPMap = (0, _core_utils.getLookupTableFactory)(function (t) {\n      t.w = {\n        id: _util.OPS.setLineWidth,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.J = {\n        id: _util.OPS.setLineCap,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.j = {\n        id: _util.OPS.setLineJoin,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.M = {\n        id: _util.OPS.setMiterLimit,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.d = {\n        id: _util.OPS.setDash,\n        numArgs: 2,\n        variableArgs: false\n      };\n      t.ri = {\n        id: _util.OPS.setRenderingIntent,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.i = {\n        id: _util.OPS.setFlatness,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.gs = {\n        id: _util.OPS.setGState,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.q = {\n        id: _util.OPS.save,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t.Q = {\n        id: _util.OPS.restore,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t.cm = {\n        id: _util.OPS.transform,\n        numArgs: 6,\n        variableArgs: false\n      };\n      t.m = {\n        id: _util.OPS.moveTo,\n        numArgs: 2,\n        variableArgs: false\n      };\n      t.l = {\n        id: _util.OPS.lineTo,\n        numArgs: 2,\n        variableArgs: false\n      };\n      t.c = {\n        id: _util.OPS.curveTo,\n        numArgs: 6,\n        variableArgs: false\n      };\n      t.v = {\n        id: _util.OPS.curveTo2,\n        numArgs: 4,\n        variableArgs: false\n      };\n      t.y = {\n        id: _util.OPS.curveTo3,\n        numArgs: 4,\n        variableArgs: false\n      };\n      t.h = {\n        id: _util.OPS.closePath,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t.re = {\n        id: _util.OPS.rectangle,\n        numArgs: 4,\n        variableArgs: false\n      };\n      t.S = {\n        id: _util.OPS.stroke,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t.s = {\n        id: _util.OPS.closeStroke,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t.f = {\n        id: _util.OPS.fill,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t.F = {\n        id: _util.OPS.fill,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t[\"f*\"] = {\n        id: _util.OPS.eoFill,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t.B = {\n        id: _util.OPS.fillStroke,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t[\"B*\"] = {\n        id: _util.OPS.eoFillStroke,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t.b = {\n        id: _util.OPS.closeFillStroke,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t[\"b*\"] = {\n        id: _util.OPS.closeEOFillStroke,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t.n = {\n        id: _util.OPS.endPath,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t.W = {\n        id: _util.OPS.clip,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t[\"W*\"] = {\n        id: _util.OPS.eoClip,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t.BT = {\n        id: _util.OPS.beginText,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t.ET = {\n        id: _util.OPS.endText,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t.Tc = {\n        id: _util.OPS.setCharSpacing,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.Tw = {\n        id: _util.OPS.setWordSpacing,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.Tz = {\n        id: _util.OPS.setHScale,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.TL = {\n        id: _util.OPS.setLeading,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.Tf = {\n        id: _util.OPS.setFont,\n        numArgs: 2,\n        variableArgs: false\n      };\n      t.Tr = {\n        id: _util.OPS.setTextRenderingMode,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.Ts = {\n        id: _util.OPS.setTextRise,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.Td = {\n        id: _util.OPS.moveText,\n        numArgs: 2,\n        variableArgs: false\n      };\n      t.TD = {\n        id: _util.OPS.setLeadingMoveText,\n        numArgs: 2,\n        variableArgs: false\n      };\n      t.Tm = {\n        id: _util.OPS.setTextMatrix,\n        numArgs: 6,\n        variableArgs: false\n      };\n      t[\"T*\"] = {\n        id: _util.OPS.nextLine,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t.Tj = {\n        id: _util.OPS.showText,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.TJ = {\n        id: _util.OPS.showSpacedText,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t[\"'\"] = {\n        id: _util.OPS.nextLineShowText,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t['\"'] = {\n        id: _util.OPS.nextLineSetSpacingShowText,\n        numArgs: 3,\n        variableArgs: false\n      };\n      t.d0 = {\n        id: _util.OPS.setCharWidth,\n        numArgs: 2,\n        variableArgs: false\n      };\n      t.d1 = {\n        id: _util.OPS.setCharWidthAndBounds,\n        numArgs: 6,\n        variableArgs: false\n      };\n      t.CS = {\n        id: _util.OPS.setStrokeColorSpace,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.cs = {\n        id: _util.OPS.setFillColorSpace,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.SC = {\n        id: _util.OPS.setStrokeColor,\n        numArgs: 4,\n        variableArgs: true\n      };\n      t.SCN = {\n        id: _util.OPS.setStrokeColorN,\n        numArgs: 33,\n        variableArgs: true\n      };\n      t.sc = {\n        id: _util.OPS.setFillColor,\n        numArgs: 4,\n        variableArgs: true\n      };\n      t.scn = {\n        id: _util.OPS.setFillColorN,\n        numArgs: 33,\n        variableArgs: true\n      };\n      t.G = {\n        id: _util.OPS.setStrokeGray,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.g = {\n        id: _util.OPS.setFillGray,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.RG = {\n        id: _util.OPS.setStrokeRGBColor,\n        numArgs: 3,\n        variableArgs: false\n      };\n      t.rg = {\n        id: _util.OPS.setFillRGBColor,\n        numArgs: 3,\n        variableArgs: false\n      };\n      t.K = {\n        id: _util.OPS.setStrokeCMYKColor,\n        numArgs: 4,\n        variableArgs: false\n      };\n      t.k = {\n        id: _util.OPS.setFillCMYKColor,\n        numArgs: 4,\n        variableArgs: false\n      };\n      t.sh = {\n        id: _util.OPS.shadingFill,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.BI = {\n        id: _util.OPS.beginInlineImage,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t.ID = {\n        id: _util.OPS.beginImageData,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t.EI = {\n        id: _util.OPS.endInlineImage,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.Do = {\n        id: _util.OPS.paintXObject,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.MP = {\n        id: _util.OPS.markPoint,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.DP = {\n        id: _util.OPS.markPointProps,\n        numArgs: 2,\n        variableArgs: false\n      };\n      t.BMC = {\n        id: _util.OPS.beginMarkedContent,\n        numArgs: 1,\n        variableArgs: false\n      };\n      t.BDC = {\n        id: _util.OPS.beginMarkedContentProps,\n        numArgs: 2,\n        variableArgs: false\n      };\n      t.EMC = {\n        id: _util.OPS.endMarkedContent,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t.BX = {\n        id: _util.OPS.beginCompat,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t.EX = {\n        id: _util.OPS.endCompat,\n        numArgs: 0,\n        variableArgs: false\n      };\n      t.BM = null;\n      t.BD = null;\n      t.true = null;\n      t.fa = null;\n      t.fal = null;\n      t.fals = null;\n      t.false = null;\n      t.nu = null;\n      t.nul = null;\n      t.null = null;\n    });\n    return (0, _util.shadow)(this, \"opMap\", getOPMap());\n  }\n\n  static get MAX_INVALID_PATH_OPS() {\n    return (0, _util.shadow)(this, \"MAX_INVALID_PATH_OPS\", 20);\n  }\n\n  constructor(stream, xref, stateManager = new StateManager()) {\n    this.parser = new _parser.Parser({\n      lexer: new _parser.Lexer(stream, EvaluatorPreprocessor.opMap),\n      xref\n    });\n    this.stateManager = stateManager;\n    this.nonProcessedArgs = [];\n    this._numInvalidPathOPS = 0;\n  }\n\n  get savedStatesDepth() {\n    return this.stateManager.stateStack.length;\n  }\n\n  read(operation) {\n    var args = operation.args;\n\n    while (true) {\n      var obj = this.parser.getObj();\n\n      if (obj instanceof _primitives.Cmd) {\n        var cmd = obj.cmd;\n        var opSpec = EvaluatorPreprocessor.opMap[cmd];\n\n        if (!opSpec) {\n          (0, _util.warn)(`Unknown command \"${cmd}\".`);\n          continue;\n        }\n\n        var fn = opSpec.id;\n        var numArgs = opSpec.numArgs;\n        var argsLength = args !== null ? args.length : 0;\n\n        if (!opSpec.variableArgs) {\n          if (argsLength !== numArgs) {\n            var nonProcessedArgs = this.nonProcessedArgs;\n\n            while (argsLength > numArgs) {\n              nonProcessedArgs.push(args.shift());\n              argsLength--;\n            }\n\n            while (argsLength < numArgs && nonProcessedArgs.length !== 0) {\n              if (args === null) {\n                args = [];\n              }\n\n              args.unshift(nonProcessedArgs.pop());\n              argsLength++;\n            }\n          }\n\n          if (argsLength < numArgs) {\n            const partialMsg = `command ${cmd}: expected ${numArgs} args, ` + `but received ${argsLength} args.`;\n\n            if (fn >= _util.OPS.moveTo && fn <= _util.OPS.endPath && ++this._numInvalidPathOPS > EvaluatorPreprocessor.MAX_INVALID_PATH_OPS) {\n              throw new _util.FormatError(`Invalid ${partialMsg}`);\n            }\n\n            (0, _util.warn)(`Skipping ${partialMsg}`);\n\n            if (args !== null) {\n              args.length = 0;\n            }\n\n            continue;\n          }\n        } else if (argsLength > numArgs) {\n          (0, _util.info)(`Command ${cmd}: expected [0, ${numArgs}] args, ` + `but received ${argsLength} args.`);\n        }\n\n        this.preprocessCommand(fn, args);\n        operation.fn = fn;\n        operation.args = args;\n        return true;\n      }\n\n      if (obj === _primitives.EOF) {\n        return false;\n      }\n\n      if (obj !== null) {\n        if (args === null) {\n          args = [];\n        }\n\n        args.push(obj);\n\n        if (args.length > 33) {\n          throw new _util.FormatError(\"Too many arguments\");\n        }\n      }\n    }\n  }\n\n  preprocessCommand(fn, args) {\n    switch (fn | 0) {\n      case _util.OPS.save:\n        this.stateManager.save();\n        break;\n\n      case _util.OPS.restore:\n        this.stateManager.restore();\n        break;\n\n      case _util.OPS.transform:\n        this.stateManager.transform(args);\n        break;\n    }\n  }\n\n}\n\nexports.EvaluatorPreprocessor = EvaluatorPreprocessor;\n\n/***/ }),\n/* 30 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.IdentityCMap = exports.CMapFactory = exports.CMap = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _primitives = __w_pdfjs_require__(5);\n\nvar _parser = __w_pdfjs_require__(11);\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nvar _stream = __w_pdfjs_require__(12);\n\nvar BUILT_IN_CMAPS = [\"Adobe-GB1-UCS2\", \"Adobe-CNS1-UCS2\", \"Adobe-Japan1-UCS2\", \"Adobe-Korea1-UCS2\", \"78-EUC-H\", \"78-EUC-V\", \"78-H\", \"78-RKSJ-H\", \"78-RKSJ-V\", \"78-V\", \"78ms-RKSJ-H\", \"78ms-RKSJ-V\", \"83pv-RKSJ-H\", \"90ms-RKSJ-H\", \"90ms-RKSJ-V\", \"90msp-RKSJ-H\", \"90msp-RKSJ-V\", \"90pv-RKSJ-H\", \"90pv-RKSJ-V\", \"Add-H\", \"Add-RKSJ-H\", \"Add-RKSJ-V\", \"Add-V\", \"Adobe-CNS1-0\", \"Adobe-CNS1-1\", \"Adobe-CNS1-2\", \"Adobe-CNS1-3\", \"Adobe-CNS1-4\", \"Adobe-CNS1-5\", \"Adobe-CNS1-6\", \"Adobe-GB1-0\", \"Adobe-GB1-1\", \"Adobe-GB1-2\", \"Adobe-GB1-3\", \"Adobe-GB1-4\", \"Adobe-GB1-5\", \"Adobe-Japan1-0\", \"Adobe-Japan1-1\", \"Adobe-Japan1-2\", \"Adobe-Japan1-3\", \"Adobe-Japan1-4\", \"Adobe-Japan1-5\", \"Adobe-Japan1-6\", \"Adobe-Korea1-0\", \"Adobe-Korea1-1\", \"Adobe-Korea1-2\", \"B5-H\", \"B5-V\", \"B5pc-H\", \"B5pc-V\", \"CNS-EUC-H\", \"CNS-EUC-V\", \"CNS1-H\", \"CNS1-V\", \"CNS2-H\", \"CNS2-V\", \"ETHK-B5-H\", \"ETHK-B5-V\", \"ETen-B5-H\", \"ETen-B5-V\", \"ETenms-B5-H\", \"ETenms-B5-V\", \"EUC-H\", \"EUC-V\", \"Ext-H\", \"Ext-RKSJ-H\", \"Ext-RKSJ-V\", \"Ext-V\", \"GB-EUC-H\", \"GB-EUC-V\", \"GB-H\", \"GB-V\", \"GBK-EUC-H\", \"GBK-EUC-V\", \"GBK2K-H\", \"GBK2K-V\", \"GBKp-EUC-H\", \"GBKp-EUC-V\", \"GBT-EUC-H\", \"GBT-EUC-V\", \"GBT-H\", \"GBT-V\", \"GBTpc-EUC-H\", \"GBTpc-EUC-V\", \"GBpc-EUC-H\", \"GBpc-EUC-V\", \"H\", \"HKdla-B5-H\", \"HKdla-B5-V\", \"HKdlb-B5-H\", \"HKdlb-B5-V\", \"HKgccs-B5-H\", \"HKgccs-B5-V\", \"HKm314-B5-H\", \"HKm314-B5-V\", \"HKm471-B5-H\", \"HKm471-B5-V\", \"HKscs-B5-H\", \"HKscs-B5-V\", \"Hankaku\", \"Hiragana\", \"KSC-EUC-H\", \"KSC-EUC-V\", \"KSC-H\", \"KSC-Johab-H\", \"KSC-Johab-V\", \"KSC-V\", \"KSCms-UHC-H\", \"KSCms-UHC-HW-H\", \"KSCms-UHC-HW-V\", \"KSCms-UHC-V\", \"KSCpc-EUC-H\", \"KSCpc-EUC-V\", \"Katakana\", \"NWP-H\", \"NWP-V\", \"RKSJ-H\", \"RKSJ-V\", \"Roman\", \"UniCNS-UCS2-H\", \"UniCNS-UCS2-V\", \"UniCNS-UTF16-H\", \"UniCNS-UTF16-V\", \"UniCNS-UTF32-H\", \"UniCNS-UTF32-V\", \"UniCNS-UTF8-H\", \"UniCNS-UTF8-V\", \"UniGB-UCS2-H\", \"UniGB-UCS2-V\", \"UniGB-UTF16-H\", \"UniGB-UTF16-V\", \"UniGB-UTF32-H\", \"UniGB-UTF32-V\", \"UniGB-UTF8-H\", \"UniGB-UTF8-V\", \"UniJIS-UCS2-H\", \"UniJIS-UCS2-HW-H\", \"UniJIS-UCS2-HW-V\", \"UniJIS-UCS2-V\", \"UniJIS-UTF16-H\", \"UniJIS-UTF16-V\", \"UniJIS-UTF32-H\", \"UniJIS-UTF32-V\", \"UniJIS-UTF8-H\", \"UniJIS-UTF8-V\", \"UniJIS2004-UTF16-H\", \"UniJIS2004-UTF16-V\", \"UniJIS2004-UTF32-H\", \"UniJIS2004-UTF32-V\", \"UniJIS2004-UTF8-H\", \"UniJIS2004-UTF8-V\", \"UniJISPro-UCS2-HW-V\", \"UniJISPro-UCS2-V\", \"UniJISPro-UTF8-V\", \"UniJISX0213-UTF32-H\", \"UniJISX0213-UTF32-V\", \"UniJISX02132004-UTF32-H\", \"UniJISX02132004-UTF32-V\", \"UniKS-UCS2-H\", \"UniKS-UCS2-V\", \"UniKS-UTF16-H\", \"UniKS-UTF16-V\", \"UniKS-UTF32-H\", \"UniKS-UTF32-V\", \"UniKS-UTF8-H\", \"UniKS-UTF8-V\", \"V\", \"WP-Symbol\"];\nconst MAX_MAP_RANGE = 2 ** 24 - 1;\n\nclass CMap {\n  constructor(builtInCMap = false) {\n    this.codespaceRanges = [[], [], [], []];\n    this.numCodespaceRanges = 0;\n    this._map = [];\n    this.name = \"\";\n    this.vertical = false;\n    this.useCMap = null;\n    this.builtInCMap = builtInCMap;\n  }\n\n  addCodespaceRange(n, low, high) {\n    this.codespaceRanges[n - 1].push(low, high);\n    this.numCodespaceRanges++;\n  }\n\n  mapCidRange(low, high, dstLow) {\n    if (high - low > MAX_MAP_RANGE) {\n      throw new Error(\"mapCidRange - ignoring data above MAX_MAP_RANGE.\");\n    }\n\n    while (low <= high) {\n      this._map[low++] = dstLow++;\n    }\n  }\n\n  mapBfRange(low, high, dstLow) {\n    if (high - low > MAX_MAP_RANGE) {\n      throw new Error(\"mapBfRange - ignoring data above MAX_MAP_RANGE.\");\n    }\n\n    var lastByte = dstLow.length - 1;\n\n    while (low <= high) {\n      this._map[low++] = dstLow;\n      dstLow = dstLow.substring(0, lastByte) + String.fromCharCode(dstLow.charCodeAt(lastByte) + 1);\n    }\n  }\n\n  mapBfRangeToArray(low, high, array) {\n    if (high - low > MAX_MAP_RANGE) {\n      throw new Error(\"mapBfRangeToArray - ignoring data above MAX_MAP_RANGE.\");\n    }\n\n    const ii = array.length;\n    let i = 0;\n\n    while (low <= high && i < ii) {\n      this._map[low] = array[i++];\n      ++low;\n    }\n  }\n\n  mapOne(src, dst) {\n    this._map[src] = dst;\n  }\n\n  lookup(code) {\n    return this._map[code];\n  }\n\n  contains(code) {\n    return this._map[code] !== undefined;\n  }\n\n  forEach(callback) {\n    const map = this._map;\n    const length = map.length;\n\n    if (length <= 0x10000) {\n      for (let i = 0; i < length; i++) {\n        if (map[i] !== undefined) {\n          callback(i, map[i]);\n        }\n      }\n    } else {\n      for (const i in map) {\n        callback(i, map[i]);\n      }\n    }\n  }\n\n  charCodeOf(value) {\n    const map = this._map;\n\n    if (map.length <= 0x10000) {\n      return map.indexOf(value);\n    }\n\n    for (const charCode in map) {\n      if (map[charCode] === value) {\n        return charCode | 0;\n      }\n    }\n\n    return -1;\n  }\n\n  getMap() {\n    return this._map;\n  }\n\n  readCharCode(str, offset, out) {\n    let c = 0;\n    const codespaceRanges = this.codespaceRanges;\n\n    for (let n = 0, nn = codespaceRanges.length; n < nn; n++) {\n      c = (c << 8 | str.charCodeAt(offset + n)) >>> 0;\n      const codespaceRange = codespaceRanges[n];\n\n      for (let k = 0, kk = codespaceRange.length; k < kk;) {\n        const low = codespaceRange[k++];\n        const high = codespaceRange[k++];\n\n        if (c >= low && c <= high) {\n          out.charcode = c;\n          out.length = n + 1;\n          return;\n        }\n      }\n    }\n\n    out.charcode = 0;\n    out.length = 1;\n  }\n\n  getCharCodeLength(charCode) {\n    const codespaceRanges = this.codespaceRanges;\n\n    for (let n = 0, nn = codespaceRanges.length; n < nn; n++) {\n      const codespaceRange = codespaceRanges[n];\n\n      for (let k = 0, kk = codespaceRange.length; k < kk;) {\n        const low = codespaceRange[k++];\n        const high = codespaceRange[k++];\n\n        if (charCode >= low && charCode <= high) {\n          return n + 1;\n        }\n      }\n    }\n\n    return 1;\n  }\n\n  get length() {\n    return this._map.length;\n  }\n\n  get isIdentityCMap() {\n    if (!(this.name === \"Identity-H\" || this.name === \"Identity-V\")) {\n      return false;\n    }\n\n    if (this._map.length !== 0x10000) {\n      return false;\n    }\n\n    for (let i = 0; i < 0x10000; i++) {\n      if (this._map[i] !== i) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n}\n\nexports.CMap = CMap;\n\nclass IdentityCMap extends CMap {\n  constructor(vertical, n) {\n    super();\n    this.vertical = vertical;\n    this.addCodespaceRange(n, 0, 0xffff);\n  }\n\n  mapCidRange(low, high, dstLow) {\n    (0, _util.unreachable)(\"should not call mapCidRange\");\n  }\n\n  mapBfRange(low, high, dstLow) {\n    (0, _util.unreachable)(\"should not call mapBfRange\");\n  }\n\n  mapBfRangeToArray(low, high, array) {\n    (0, _util.unreachable)(\"should not call mapBfRangeToArray\");\n  }\n\n  mapOne(src, dst) {\n    (0, _util.unreachable)(\"should not call mapCidOne\");\n  }\n\n  lookup(code) {\n    return Number.isInteger(code) && code <= 0xffff ? code : undefined;\n  }\n\n  contains(code) {\n    return Number.isInteger(code) && code <= 0xffff;\n  }\n\n  forEach(callback) {\n    for (let i = 0; i <= 0xffff; i++) {\n      callback(i, i);\n    }\n  }\n\n  charCodeOf(value) {\n    return Number.isInteger(value) && value <= 0xffff ? value : -1;\n  }\n\n  getMap() {\n    const map = new Array(0x10000);\n\n    for (let i = 0; i <= 0xffff; i++) {\n      map[i] = i;\n    }\n\n    return map;\n  }\n\n  get length() {\n    return 0x10000;\n  }\n\n  get isIdentityCMap() {\n    (0, _util.unreachable)(\"should not access .isIdentityCMap\");\n  }\n\n}\n\nexports.IdentityCMap = IdentityCMap;\n\nvar BinaryCMapReader = function BinaryCMapReaderClosure() {\n  function hexToInt(a, size) {\n    var n = 0;\n\n    for (var i = 0; i <= size; i++) {\n      n = n << 8 | a[i];\n    }\n\n    return n >>> 0;\n  }\n\n  function hexToStr(a, size) {\n    if (size === 1) {\n      return String.fromCharCode(a[0], a[1]);\n    }\n\n    if (size === 3) {\n      return String.fromCharCode(a[0], a[1], a[2], a[3]);\n    }\n\n    return String.fromCharCode.apply(null, a.subarray(0, size + 1));\n  }\n\n  function addHex(a, b, size) {\n    var c = 0;\n\n    for (var i = size; i >= 0; i--) {\n      c += a[i] + b[i];\n      a[i] = c & 255;\n      c >>= 8;\n    }\n  }\n\n  function incHex(a, size) {\n    var c = 1;\n\n    for (var i = size; i >= 0 && c > 0; i--) {\n      c += a[i];\n      a[i] = c & 255;\n      c >>= 8;\n    }\n  }\n\n  var MAX_NUM_SIZE = 16;\n  var MAX_ENCODED_NUM_SIZE = 19;\n\n  class BinaryCMapStream {\n    constructor(data) {\n      this.buffer = data;\n      this.pos = 0;\n      this.end = data.length;\n      this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE);\n    }\n\n    readByte() {\n      if (this.pos >= this.end) {\n        return -1;\n      }\n\n      return this.buffer[this.pos++];\n    }\n\n    readNumber() {\n      var n = 0;\n      var last;\n\n      do {\n        var b = this.readByte();\n\n        if (b < 0) {\n          throw new _util.FormatError(\"unexpected EOF in bcmap\");\n        }\n\n        last = !(b & 0x80);\n        n = n << 7 | b & 0x7f;\n      } while (!last);\n\n      return n;\n    }\n\n    readSigned() {\n      var n = this.readNumber();\n      return n & 1 ? ~(n >>> 1) : n >>> 1;\n    }\n\n    readHex(num, size) {\n      num.set(this.buffer.subarray(this.pos, this.pos + size + 1));\n      this.pos += size + 1;\n    }\n\n    readHexNumber(num, size) {\n      var last;\n      var stack = this.tmpBuf,\n          sp = 0;\n\n      do {\n        var b = this.readByte();\n\n        if (b < 0) {\n          throw new _util.FormatError(\"unexpected EOF in bcmap\");\n        }\n\n        last = !(b & 0x80);\n        stack[sp++] = b & 0x7f;\n      } while (!last);\n\n      var i = size,\n          buffer = 0,\n          bufferSize = 0;\n\n      while (i >= 0) {\n        while (bufferSize < 8 && stack.length > 0) {\n          buffer = stack[--sp] << bufferSize | buffer;\n          bufferSize += 7;\n        }\n\n        num[i] = buffer & 255;\n        i--;\n        buffer >>= 8;\n        bufferSize -= 8;\n      }\n    }\n\n    readHexSigned(num, size) {\n      this.readHexNumber(num, size);\n      var sign = num[size] & 1 ? 255 : 0;\n      var c = 0;\n\n      for (var i = 0; i <= size; i++) {\n        c = (c & 1) << 8 | num[i];\n        num[i] = c >> 1 ^ sign;\n      }\n    }\n\n    readString() {\n      var len = this.readNumber();\n      var s = \"\";\n\n      for (var i = 0; i < len; i++) {\n        s += String.fromCharCode(this.readNumber());\n      }\n\n      return s;\n    }\n\n  }\n\n  class BinaryCMapReader {\n    async process(data, cMap, extend) {\n      var stream = new BinaryCMapStream(data);\n      var header = stream.readByte();\n      cMap.vertical = !!(header & 1);\n      var useCMap = null;\n      var start = new Uint8Array(MAX_NUM_SIZE);\n      var end = new Uint8Array(MAX_NUM_SIZE);\n      var char = new Uint8Array(MAX_NUM_SIZE);\n      var charCode = new Uint8Array(MAX_NUM_SIZE);\n      var tmp = new Uint8Array(MAX_NUM_SIZE);\n      var code;\n      var b;\n\n      while ((b = stream.readByte()) >= 0) {\n        var type = b >> 5;\n\n        if (type === 7) {\n          switch (b & 0x1f) {\n            case 0:\n              stream.readString();\n              break;\n\n            case 1:\n              useCMap = stream.readString();\n              break;\n          }\n\n          continue;\n        }\n\n        var sequence = !!(b & 0x10);\n        var dataSize = b & 15;\n\n        if (dataSize + 1 > MAX_NUM_SIZE) {\n          throw new Error(\"BinaryCMapReader.process: Invalid dataSize.\");\n        }\n\n        var ucs2DataSize = 1;\n        var subitemsCount = stream.readNumber();\n        var i;\n\n        switch (type) {\n          case 0:\n            stream.readHex(start, dataSize);\n            stream.readHexNumber(end, dataSize);\n            addHex(end, start, dataSize);\n            cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize));\n\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(end, dataSize);\n              stream.readHexNumber(start, dataSize);\n              addHex(start, end, dataSize);\n              stream.readHexNumber(end, dataSize);\n              addHex(end, start, dataSize);\n              cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize));\n            }\n\n            break;\n\n          case 1:\n            stream.readHex(start, dataSize);\n            stream.readHexNumber(end, dataSize);\n            addHex(end, start, dataSize);\n            stream.readNumber();\n\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(end, dataSize);\n              stream.readHexNumber(start, dataSize);\n              addHex(start, end, dataSize);\n              stream.readHexNumber(end, dataSize);\n              addHex(end, start, dataSize);\n              stream.readNumber();\n            }\n\n            break;\n\n          case 2:\n            stream.readHex(char, dataSize);\n            code = stream.readNumber();\n            cMap.mapOne(hexToInt(char, dataSize), code);\n\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(char, dataSize);\n\n              if (!sequence) {\n                stream.readHexNumber(tmp, dataSize);\n                addHex(char, tmp, dataSize);\n              }\n\n              code = stream.readSigned() + (code + 1);\n              cMap.mapOne(hexToInt(char, dataSize), code);\n            }\n\n            break;\n\n          case 3:\n            stream.readHex(start, dataSize);\n            stream.readHexNumber(end, dataSize);\n            addHex(end, start, dataSize);\n            code = stream.readNumber();\n            cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code);\n\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(end, dataSize);\n\n              if (!sequence) {\n                stream.readHexNumber(start, dataSize);\n                addHex(start, end, dataSize);\n              } else {\n                start.set(end);\n              }\n\n              stream.readHexNumber(end, dataSize);\n              addHex(end, start, dataSize);\n              code = stream.readNumber();\n              cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code);\n            }\n\n            break;\n\n          case 4:\n            stream.readHex(char, ucs2DataSize);\n            stream.readHex(charCode, dataSize);\n            cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize));\n\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(char, ucs2DataSize);\n\n              if (!sequence) {\n                stream.readHexNumber(tmp, ucs2DataSize);\n                addHex(char, tmp, ucs2DataSize);\n              }\n\n              incHex(charCode, dataSize);\n              stream.readHexSigned(tmp, dataSize);\n              addHex(charCode, tmp, dataSize);\n              cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize));\n            }\n\n            break;\n\n          case 5:\n            stream.readHex(start, ucs2DataSize);\n            stream.readHexNumber(end, ucs2DataSize);\n            addHex(end, start, ucs2DataSize);\n            stream.readHex(charCode, dataSize);\n            cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize));\n\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(end, ucs2DataSize);\n\n              if (!sequence) {\n                stream.readHexNumber(start, ucs2DataSize);\n                addHex(start, end, ucs2DataSize);\n              } else {\n                start.set(end);\n              }\n\n              stream.readHexNumber(end, ucs2DataSize);\n              addHex(end, start, ucs2DataSize);\n              stream.readHex(charCode, dataSize);\n              cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize));\n            }\n\n            break;\n\n          default:\n            throw new Error(`BinaryCMapReader.process - unknown type: ${type}`);\n        }\n      }\n\n      if (useCMap) {\n        return extend(useCMap);\n      }\n\n      return cMap;\n    }\n\n  }\n\n  return BinaryCMapReader;\n}();\n\nvar CMapFactory = function CMapFactoryClosure() {\n  function strToInt(str) {\n    var a = 0;\n\n    for (var i = 0; i < str.length; i++) {\n      a = a << 8 | str.charCodeAt(i);\n    }\n\n    return a >>> 0;\n  }\n\n  function expectString(obj) {\n    if (!(0, _util.isString)(obj)) {\n      throw new _util.FormatError(\"Malformed CMap: expected string.\");\n    }\n  }\n\n  function expectInt(obj) {\n    if (!Number.isInteger(obj)) {\n      throw new _util.FormatError(\"Malformed CMap: expected int.\");\n    }\n  }\n\n  function parseBfChar(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n\n      if ((0, _primitives.isEOF)(obj)) {\n        break;\n      }\n\n      if ((0, _primitives.isCmd)(obj, \"endbfchar\")) {\n        return;\n      }\n\n      expectString(obj);\n      var src = strToInt(obj);\n      obj = lexer.getObj();\n      expectString(obj);\n      var dst = obj;\n      cMap.mapOne(src, dst);\n    }\n  }\n\n  function parseBfRange(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n\n      if ((0, _primitives.isEOF)(obj)) {\n        break;\n      }\n\n      if ((0, _primitives.isCmd)(obj, \"endbfrange\")) {\n        return;\n      }\n\n      expectString(obj);\n      var low = strToInt(obj);\n      obj = lexer.getObj();\n      expectString(obj);\n      var high = strToInt(obj);\n      obj = lexer.getObj();\n\n      if (Number.isInteger(obj) || (0, _util.isString)(obj)) {\n        var dstLow = Number.isInteger(obj) ? String.fromCharCode(obj) : obj;\n        cMap.mapBfRange(low, high, dstLow);\n      } else if ((0, _primitives.isCmd)(obj, \"[\")) {\n        obj = lexer.getObj();\n        var array = [];\n\n        while (!(0, _primitives.isCmd)(obj, \"]\") && !(0, _primitives.isEOF)(obj)) {\n          array.push(obj);\n          obj = lexer.getObj();\n        }\n\n        cMap.mapBfRangeToArray(low, high, array);\n      } else {\n        break;\n      }\n    }\n\n    throw new _util.FormatError(\"Invalid bf range.\");\n  }\n\n  function parseCidChar(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n\n      if ((0, _primitives.isEOF)(obj)) {\n        break;\n      }\n\n      if ((0, _primitives.isCmd)(obj, \"endcidchar\")) {\n        return;\n      }\n\n      expectString(obj);\n      var src = strToInt(obj);\n      obj = lexer.getObj();\n      expectInt(obj);\n      var dst = obj;\n      cMap.mapOne(src, dst);\n    }\n  }\n\n  function parseCidRange(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n\n      if ((0, _primitives.isEOF)(obj)) {\n        break;\n      }\n\n      if ((0, _primitives.isCmd)(obj, \"endcidrange\")) {\n        return;\n      }\n\n      expectString(obj);\n      var low = strToInt(obj);\n      obj = lexer.getObj();\n      expectString(obj);\n      var high = strToInt(obj);\n      obj = lexer.getObj();\n      expectInt(obj);\n      var dstLow = obj;\n      cMap.mapCidRange(low, high, dstLow);\n    }\n  }\n\n  function parseCodespaceRange(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n\n      if ((0, _primitives.isEOF)(obj)) {\n        break;\n      }\n\n      if ((0, _primitives.isCmd)(obj, \"endcodespacerange\")) {\n        return;\n      }\n\n      if (!(0, _util.isString)(obj)) {\n        break;\n      }\n\n      var low = strToInt(obj);\n      obj = lexer.getObj();\n\n      if (!(0, _util.isString)(obj)) {\n        break;\n      }\n\n      var high = strToInt(obj);\n      cMap.addCodespaceRange(obj.length, low, high);\n    }\n\n    throw new _util.FormatError(\"Invalid codespace range.\");\n  }\n\n  function parseWMode(cMap, lexer) {\n    var obj = lexer.getObj();\n\n    if (Number.isInteger(obj)) {\n      cMap.vertical = !!obj;\n    }\n  }\n\n  function parseCMapName(cMap, lexer) {\n    var obj = lexer.getObj();\n\n    if ((0, _primitives.isName)(obj) && (0, _util.isString)(obj.name)) {\n      cMap.name = obj.name;\n    }\n  }\n\n  async function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) {\n    var previous;\n    var embeddedUseCMap;\n\n    objLoop: while (true) {\n      try {\n        var obj = lexer.getObj();\n\n        if ((0, _primitives.isEOF)(obj)) {\n          break;\n        } else if ((0, _primitives.isName)(obj)) {\n          if (obj.name === \"WMode\") {\n            parseWMode(cMap, lexer);\n          } else if (obj.name === \"CMapName\") {\n            parseCMapName(cMap, lexer);\n          }\n\n          previous = obj;\n        } else if ((0, _primitives.isCmd)(obj)) {\n          switch (obj.cmd) {\n            case \"endcmap\":\n              break objLoop;\n\n            case \"usecmap\":\n              if ((0, _primitives.isName)(previous)) {\n                embeddedUseCMap = previous.name;\n              }\n\n              break;\n\n            case \"begincodespacerange\":\n              parseCodespaceRange(cMap, lexer);\n              break;\n\n            case \"beginbfchar\":\n              parseBfChar(cMap, lexer);\n              break;\n\n            case \"begincidchar\":\n              parseCidChar(cMap, lexer);\n              break;\n\n            case \"beginbfrange\":\n              parseBfRange(cMap, lexer);\n              break;\n\n            case \"begincidrange\":\n              parseCidRange(cMap, lexer);\n              break;\n          }\n        }\n      } catch (ex) {\n        if (ex instanceof _core_utils.MissingDataException) {\n          throw ex;\n        }\n\n        (0, _util.warn)(\"Invalid cMap data: \" + ex);\n        continue;\n      }\n    }\n\n    if (!useCMap && embeddedUseCMap) {\n      useCMap = embeddedUseCMap;\n    }\n\n    if (useCMap) {\n      return extendCMap(cMap, fetchBuiltInCMap, useCMap);\n    }\n\n    return cMap;\n  }\n\n  async function extendCMap(cMap, fetchBuiltInCMap, useCMap) {\n    cMap.useCMap = await createBuiltInCMap(useCMap, fetchBuiltInCMap);\n\n    if (cMap.numCodespaceRanges === 0) {\n      var useCodespaceRanges = cMap.useCMap.codespaceRanges;\n\n      for (var i = 0; i < useCodespaceRanges.length; i++) {\n        cMap.codespaceRanges[i] = useCodespaceRanges[i].slice();\n      }\n\n      cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges;\n    }\n\n    cMap.useCMap.forEach(function (key, value) {\n      if (!cMap.contains(key)) {\n        cMap.mapOne(key, cMap.useCMap.lookup(key));\n      }\n    });\n    return cMap;\n  }\n\n  async function createBuiltInCMap(name, fetchBuiltInCMap) {\n    if (name === \"Identity-H\") {\n      return new IdentityCMap(false, 2);\n    } else if (name === \"Identity-V\") {\n      return new IdentityCMap(true, 2);\n    }\n\n    if (!BUILT_IN_CMAPS.includes(name)) {\n      throw new Error(\"Unknown CMap name: \" + name);\n    }\n\n    if (!fetchBuiltInCMap) {\n      throw new Error(\"Built-in CMap parameters are not provided.\");\n    }\n\n    const {\n      cMapData,\n      compressionType\n    } = await fetchBuiltInCMap(name);\n    var cMap = new CMap(true);\n\n    if (compressionType === _util.CMapCompressionType.BINARY) {\n      return new BinaryCMapReader().process(cMapData, cMap, useCMap => {\n        return extendCMap(cMap, fetchBuiltInCMap, useCMap);\n      });\n    }\n\n    if (compressionType === _util.CMapCompressionType.NONE) {\n      var lexer = new _parser.Lexer(new _stream.Stream(cMapData));\n      return parseCMap(cMap, lexer, fetchBuiltInCMap, null);\n    }\n\n    throw new Error(\"TODO: Only BINARY/NONE CMap compression is currently supported.\");\n  }\n\n  return {\n    async create(params) {\n      var encoding = params.encoding;\n      var fetchBuiltInCMap = params.fetchBuiltInCMap;\n      var useCMap = params.useCMap;\n\n      if ((0, _primitives.isName)(encoding)) {\n        return createBuiltInCMap(encoding.name, fetchBuiltInCMap);\n      } else if ((0, _primitives.isStream)(encoding)) {\n        const parsedCMap = await parseCMap(new CMap(), new _parser.Lexer(encoding), fetchBuiltInCMap, useCMap);\n\n        if (parsedCMap.isIdentityCMap) {\n          return createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap);\n        }\n\n        return parsedCMap;\n      }\n\n      throw new Error(\"Encoding required.\");\n    }\n\n  };\n}();\n\nexports.CMapFactory = CMapFactory;\n\n/***/ }),\n/* 31 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.getFontType = getFontType;\nexports.ToUnicodeMap = exports.SEAC_ANALYSIS_ENABLED = exports.IdentityToUnicodeMap = exports.FontFlags = exports.Font = exports.ErrorFont = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _cff_parser = __w_pdfjs_require__(32);\n\nvar _glyphlist = __w_pdfjs_require__(35);\n\nvar _encodings = __w_pdfjs_require__(34);\n\nvar _standard_fonts = __w_pdfjs_require__(36);\n\nvar _unicode = __w_pdfjs_require__(37);\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nvar _font_renderer = __w_pdfjs_require__(38);\n\nvar _cmap = __w_pdfjs_require__(30);\n\nvar _stream = __w_pdfjs_require__(12);\n\nvar _type1_parser = __w_pdfjs_require__(39);\n\nconst PRIVATE_USE_AREAS = [[0xe000, 0xf8ff], [0x100000, 0x10fffd]];\nvar PDF_GLYPH_SPACE_UNITS = 1000;\nvar SEAC_ANALYSIS_ENABLED = true;\nexports.SEAC_ANALYSIS_ENABLED = SEAC_ANALYSIS_ENABLED;\nconst EXPORT_DATA_PROPERTIES = [\"ascent\", \"bbox\", \"black\", \"bold\", \"charProcOperatorList\", \"composite\", \"data\", \"defaultVMetrics\", \"defaultWidth\", \"descent\", \"fallbackName\", \"fontMatrix\", \"fontType\", \"isMonospace\", \"isSerifFont\", \"isType3Font\", \"italic\", \"loadedName\", \"mimetype\", \"missingFile\", \"name\", \"remeasure\", \"subtype\", \"type\", \"vertical\"];\nconst EXPORT_DATA_EXTRA_PROPERTIES = [\"cMap\", \"defaultEncoding\", \"differences\", \"isSymbolicFont\", \"seacMap\", \"toFontChar\", \"toUnicode\", \"vmetrics\", \"widths\"];\nvar FontFlags = {\n  FixedPitch: 1,\n  Serif: 2,\n  Symbolic: 4,\n  Script: 8,\n  Nonsymbolic: 32,\n  Italic: 64,\n  AllCap: 65536,\n  SmallCap: 131072,\n  ForceBold: 262144\n};\nexports.FontFlags = FontFlags;\nvar MacStandardGlyphOrdering = [\".notdef\", \".null\", \"nonmarkingreturn\", \"space\", \"exclam\", \"quotedbl\", \"numbersign\", \"dollar\", \"percent\", \"ampersand\", \"quotesingle\", \"parenleft\", \"parenright\", \"asterisk\", \"plus\", \"comma\", \"hyphen\", \"period\", \"slash\", \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"colon\", \"semicolon\", \"less\", \"equal\", \"greater\", \"question\", \"at\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\", \"bracketleft\", \"backslash\", \"bracketright\", \"asciicircum\", \"underscore\", \"grave\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\", \"x\", \"y\", \"z\", \"braceleft\", \"bar\", \"braceright\", \"asciitilde\", \"Adieresis\", \"Aring\", \"Ccedilla\", \"Eacute\", \"Ntilde\", \"Odieresis\", \"Udieresis\", \"aacute\", \"agrave\", \"acircumflex\", \"adieresis\", \"atilde\", \"aring\", \"ccedilla\", \"eacute\", \"egrave\", \"ecircumflex\", \"edieresis\", \"iacute\", \"igrave\", \"icircumflex\", \"idieresis\", \"ntilde\", \"oacute\", \"ograve\", \"ocircumflex\", \"odieresis\", \"otilde\", \"uacute\", \"ugrave\", \"ucircumflex\", \"udieresis\", \"dagger\", \"degree\", \"cent\", \"sterling\", \"section\", \"bullet\", \"paragraph\", \"germandbls\", \"registered\", \"copyright\", \"trademark\", \"acute\", \"dieresis\", \"notequal\", \"AE\", \"Oslash\", \"infinity\", \"plusminus\", \"lessequal\", \"greaterequal\", \"yen\", \"mu\", \"partialdiff\", \"summation\", \"product\", \"pi\", \"integral\", \"ordfeminine\", \"ordmasculine\", \"Omega\", \"ae\", \"oslash\", \"questiondown\", \"exclamdown\", \"logicalnot\", \"radical\", \"florin\", \"approxequal\", \"Delta\", \"guillemotleft\", \"guillemotright\", \"ellipsis\", \"nonbreakingspace\", \"Agrave\", \"Atilde\", \"Otilde\", \"OE\", \"oe\", \"endash\", \"emdash\", \"quotedblleft\", \"quotedblright\", \"quoteleft\", \"quoteright\", \"divide\", \"lozenge\", \"ydieresis\", \"Ydieresis\", \"fraction\", \"currency\", \"guilsinglleft\", \"guilsinglright\", \"fi\", \"fl\", \"daggerdbl\", \"periodcentered\", \"quotesinglbase\", \"quotedblbase\", \"perthousand\", \"Acircumflex\", \"Ecircumflex\", \"Aacute\", \"Edieresis\", \"Egrave\", \"Iacute\", \"Icircumflex\", \"Idieresis\", \"Igrave\", \"Oacute\", \"Ocircumflex\", \"apple\", \"Ograve\", \"Uacute\", \"Ucircumflex\", \"Ugrave\", \"dotlessi\", \"circumflex\", \"tilde\", \"macron\", \"breve\", \"dotaccent\", \"ring\", \"cedilla\", \"hungarumlaut\", \"ogonek\", \"caron\", \"Lslash\", \"lslash\", \"Scaron\", \"scaron\", \"Zcaron\", \"zcaron\", \"brokenbar\", \"Eth\", \"eth\", \"Yacute\", \"yacute\", \"Thorn\", \"thorn\", \"minus\", \"multiply\", \"onesuperior\", \"twosuperior\", \"threesuperior\", \"onehalf\", \"onequarter\", \"threequarters\", \"franc\", \"Gbreve\", \"gbreve\", \"Idotaccent\", \"Scedilla\", \"scedilla\", \"Cacute\", \"cacute\", \"Ccaron\", \"ccaron\", \"dcroat\"];\n\nfunction adjustWidths(properties) {\n  if (!properties.fontMatrix) {\n    return;\n  }\n\n  if (properties.fontMatrix[0] === _util.FONT_IDENTITY_MATRIX[0]) {\n    return;\n  }\n\n  var scale = 0.001 / properties.fontMatrix[0];\n  var glyphsWidths = properties.widths;\n\n  for (var glyph in glyphsWidths) {\n    glyphsWidths[glyph] *= scale;\n  }\n\n  properties.defaultWidth *= scale;\n}\n\nfunction adjustToUnicode(properties, builtInEncoding) {\n  if (properties.hasIncludedToUnicodeMap) {\n    return;\n  }\n\n  if (properties.hasEncoding) {\n    return;\n  }\n\n  if (builtInEncoding === properties.defaultEncoding) {\n    return;\n  }\n\n  if (properties.toUnicode instanceof IdentityToUnicodeMap) {\n    return;\n  }\n\n  var toUnicode = [],\n      glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();\n\n  for (var charCode in builtInEncoding) {\n    var glyphName = builtInEncoding[charCode];\n    var unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);\n\n    if (unicode !== -1) {\n      toUnicode[charCode] = String.fromCharCode(unicode);\n    }\n  }\n\n  properties.toUnicode.amend(toUnicode);\n}\n\nfunction getFontType(type, subtype) {\n  switch (type) {\n    case \"Type1\":\n      return subtype === \"Type1C\" ? _util.FontType.TYPE1C : _util.FontType.TYPE1;\n\n    case \"CIDFontType0\":\n      return subtype === \"CIDFontType0C\" ? _util.FontType.CIDFONTTYPE0C : _util.FontType.CIDFONTTYPE0;\n\n    case \"OpenType\":\n      return _util.FontType.OPENTYPE;\n\n    case \"TrueType\":\n      return _util.FontType.TRUETYPE;\n\n    case \"CIDFontType2\":\n      return _util.FontType.CIDFONTTYPE2;\n\n    case \"MMType1\":\n      return _util.FontType.MMTYPE1;\n\n    case \"Type0\":\n      return _util.FontType.TYPE0;\n\n    default:\n      return _util.FontType.UNKNOWN;\n  }\n}\n\nfunction recoverGlyphName(name, glyphsUnicodeMap) {\n  if (glyphsUnicodeMap[name] !== undefined) {\n    return name;\n  }\n\n  var unicode = (0, _unicode.getUnicodeForGlyph)(name, glyphsUnicodeMap);\n\n  if (unicode !== -1) {\n    for (var key in glyphsUnicodeMap) {\n      if (glyphsUnicodeMap[key] === unicode) {\n        return key;\n      }\n    }\n  }\n\n  (0, _util.info)(\"Unable to recover a standard glyph name for: \" + name);\n  return name;\n}\n\nvar Glyph = function GlyphClosure() {\n  function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) {\n    this.fontChar = fontChar;\n    this.unicode = unicode;\n    this.accent = accent;\n    this.width = width;\n    this.vmetric = vmetric;\n    this.operatorListId = operatorListId;\n    this.isSpace = isSpace;\n    this.isInFont = isInFont;\n  }\n\n  Glyph.prototype.matchesForCache = function (fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) {\n    return this.fontChar === fontChar && this.unicode === unicode && this.accent === accent && this.width === width && this.vmetric === vmetric && this.operatorListId === operatorListId && this.isSpace === isSpace && this.isInFont === isInFont;\n  };\n\n  return Glyph;\n}();\n\nvar ToUnicodeMap = function ToUnicodeMapClosure() {\n  function ToUnicodeMap(cmap = []) {\n    this._map = cmap;\n  }\n\n  ToUnicodeMap.prototype = {\n    get length() {\n      return this._map.length;\n    },\n\n    forEach(callback) {\n      for (var charCode in this._map) {\n        callback(charCode, this._map[charCode].charCodeAt(0));\n      }\n    },\n\n    has(i) {\n      return this._map[i] !== undefined;\n    },\n\n    get(i) {\n      return this._map[i];\n    },\n\n    charCodeOf(value) {\n      const map = this._map;\n\n      if (map.length <= 0x10000) {\n        return map.indexOf(value);\n      }\n\n      for (const charCode in map) {\n        if (map[charCode] === value) {\n          return charCode | 0;\n        }\n      }\n\n      return -1;\n    },\n\n    amend(map) {\n      for (var charCode in map) {\n        this._map[charCode] = map[charCode];\n      }\n    }\n\n  };\n  return ToUnicodeMap;\n}();\n\nexports.ToUnicodeMap = ToUnicodeMap;\n\nvar IdentityToUnicodeMap = function IdentityToUnicodeMapClosure() {\n  function IdentityToUnicodeMap(firstChar, lastChar) {\n    this.firstChar = firstChar;\n    this.lastChar = lastChar;\n  }\n\n  IdentityToUnicodeMap.prototype = {\n    get length() {\n      return this.lastChar + 1 - this.firstChar;\n    },\n\n    forEach(callback) {\n      for (var i = this.firstChar, ii = this.lastChar; i <= ii; i++) {\n        callback(i, i);\n      }\n    },\n\n    has(i) {\n      return this.firstChar <= i && i <= this.lastChar;\n    },\n\n    get(i) {\n      if (this.firstChar <= i && i <= this.lastChar) {\n        return String.fromCharCode(i);\n      }\n\n      return undefined;\n    },\n\n    charCodeOf(v) {\n      return Number.isInteger(v) && v >= this.firstChar && v <= this.lastChar ? v : -1;\n    },\n\n    amend(map) {\n      (0, _util.unreachable)(\"Should not call amend()\");\n    }\n\n  };\n  return IdentityToUnicodeMap;\n}();\n\nexports.IdentityToUnicodeMap = IdentityToUnicodeMap;\n\nvar OpenTypeFileBuilder = function OpenTypeFileBuilderClosure() {\n  function writeInt16(dest, offset, num) {\n    dest[offset] = num >> 8 & 0xff;\n    dest[offset + 1] = num & 0xff;\n  }\n\n  function writeInt32(dest, offset, num) {\n    dest[offset] = num >> 24 & 0xff;\n    dest[offset + 1] = num >> 16 & 0xff;\n    dest[offset + 2] = num >> 8 & 0xff;\n    dest[offset + 3] = num & 0xff;\n  }\n\n  function writeData(dest, offset, data) {\n    var i, ii;\n\n    if (data instanceof Uint8Array) {\n      dest.set(data, offset);\n    } else if (typeof data === \"string\") {\n      for (i = 0, ii = data.length; i < ii; i++) {\n        dest[offset++] = data.charCodeAt(i) & 0xff;\n      }\n    } else {\n      for (i = 0, ii = data.length; i < ii; i++) {\n        dest[offset++] = data[i] & 0xff;\n      }\n    }\n  }\n\n  function OpenTypeFileBuilder(sfnt) {\n    this.sfnt = sfnt;\n    this.tables = Object.create(null);\n  }\n\n  OpenTypeFileBuilder.getSearchParams = function OpenTypeFileBuilder_getSearchParams(entriesCount, entrySize) {\n    var maxPower2 = 1,\n        log2 = 0;\n\n    while ((maxPower2 ^ entriesCount) > maxPower2) {\n      maxPower2 <<= 1;\n      log2++;\n    }\n\n    var searchRange = maxPower2 * entrySize;\n    return {\n      range: searchRange,\n      entry: log2,\n      rangeShift: entrySize * entriesCount - searchRange\n    };\n  };\n\n  var OTF_HEADER_SIZE = 12;\n  var OTF_TABLE_ENTRY_SIZE = 16;\n  OpenTypeFileBuilder.prototype = {\n    toArray: function OpenTypeFileBuilder_toArray() {\n      var sfnt = this.sfnt;\n      var tables = this.tables;\n      var tablesNames = Object.keys(tables);\n      tablesNames.sort();\n      var numTables = tablesNames.length;\n      var i, j, jj, table, tableName;\n      var offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE;\n      var tableOffsets = [offset];\n\n      for (i = 0; i < numTables; i++) {\n        table = tables[tablesNames[i]];\n        var paddedLength = (table.length + 3 & ~3) >>> 0;\n        offset += paddedLength;\n        tableOffsets.push(offset);\n      }\n\n      var file = new Uint8Array(offset);\n\n      for (i = 0; i < numTables; i++) {\n        table = tables[tablesNames[i]];\n        writeData(file, tableOffsets[i], table);\n      }\n\n      if (sfnt === \"true\") {\n        sfnt = (0, _util.string32)(0x00010000);\n      }\n\n      file[0] = sfnt.charCodeAt(0) & 0xff;\n      file[1] = sfnt.charCodeAt(1) & 0xff;\n      file[2] = sfnt.charCodeAt(2) & 0xff;\n      file[3] = sfnt.charCodeAt(3) & 0xff;\n      writeInt16(file, 4, numTables);\n      var searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16);\n      writeInt16(file, 6, searchParams.range);\n      writeInt16(file, 8, searchParams.entry);\n      writeInt16(file, 10, searchParams.rangeShift);\n      offset = OTF_HEADER_SIZE;\n\n      for (i = 0; i < numTables; i++) {\n        tableName = tablesNames[i];\n        file[offset] = tableName.charCodeAt(0) & 0xff;\n        file[offset + 1] = tableName.charCodeAt(1) & 0xff;\n        file[offset + 2] = tableName.charCodeAt(2) & 0xff;\n        file[offset + 3] = tableName.charCodeAt(3) & 0xff;\n        var checksum = 0;\n\n        for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) {\n          var quad = (0, _core_utils.readUint32)(file, j);\n          checksum = checksum + quad >>> 0;\n        }\n\n        writeInt32(file, offset + 4, checksum);\n        writeInt32(file, offset + 8, tableOffsets[i]);\n        writeInt32(file, offset + 12, tables[tableName].length);\n        offset += OTF_TABLE_ENTRY_SIZE;\n      }\n\n      return file;\n    },\n    addTable: function OpenTypeFileBuilder_addTable(tag, data) {\n      if (tag in this.tables) {\n        throw new Error(\"Table \" + tag + \" already exists\");\n      }\n\n      this.tables[tag] = data;\n    }\n  };\n  return OpenTypeFileBuilder;\n}();\n\nvar Font = function FontClosure() {\n  function Font(name, file, properties) {\n    var charCode;\n    this.name = name;\n    this.loadedName = properties.loadedName;\n    this.isType3Font = properties.isType3Font;\n    this.missingFile = false;\n    this.glyphCache = Object.create(null);\n    this.isSerifFont = !!(properties.flags & FontFlags.Serif);\n    this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);\n    this.isMonospace = !!(properties.flags & FontFlags.FixedPitch);\n    var type = properties.type;\n    var subtype = properties.subtype;\n    this.type = type;\n    this.subtype = subtype;\n    let fallbackName = \"sans-serif\";\n\n    if (this.isMonospace) {\n      fallbackName = \"monospace\";\n    } else if (this.isSerifFont) {\n      fallbackName = \"serif\";\n    }\n\n    this.fallbackName = fallbackName;\n    this.differences = properties.differences;\n    this.widths = properties.widths;\n    this.defaultWidth = properties.defaultWidth;\n    this.composite = properties.composite;\n    this.cMap = properties.cMap;\n    this.capHeight = properties.capHeight / PDF_GLYPH_SPACE_UNITS;\n    this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS;\n    this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS;\n    this.fontMatrix = properties.fontMatrix;\n    this.bbox = properties.bbox;\n    this.defaultEncoding = properties.defaultEncoding;\n    this.toUnicode = properties.toUnicode;\n    this.fallbackToUnicode = properties.fallbackToUnicode || new ToUnicodeMap();\n    this.toFontChar = [];\n\n    if (properties.type === \"Type3\") {\n      for (charCode = 0; charCode < 256; charCode++) {\n        this.toFontChar[charCode] = this.differences[charCode] || properties.defaultEncoding[charCode];\n      }\n\n      this.fontType = _util.FontType.TYPE3;\n      return;\n    }\n\n    this.cidEncoding = properties.cidEncoding;\n    this.vertical = !!properties.vertical;\n\n    if (this.vertical) {\n      this.vmetrics = properties.vmetrics;\n      this.defaultVMetrics = properties.defaultVMetrics;\n    }\n\n    if (!file || file.isEmpty) {\n      if (file) {\n        (0, _util.warn)('Font file is empty in \"' + name + '\" (' + this.loadedName + \")\");\n      }\n\n      this.fallbackToSystemFont(properties);\n      return;\n    }\n\n    [type, subtype] = getFontFileType(file, properties);\n\n    if (type !== this.type || subtype !== this.subtype) {\n      (0, _util.info)(\"Inconsistent font file Type/SubType, expected: \" + `${this.type}/${this.subtype} but found: ${type}/${subtype}.`);\n    }\n\n    try {\n      var data;\n\n      switch (type) {\n        case \"MMType1\":\n          (0, _util.info)(\"MMType1 font (\" + name + \"), falling back to Type1.\");\n\n        case \"Type1\":\n        case \"CIDFontType0\":\n          this.mimetype = \"font/opentype\";\n          var cff = subtype === \"Type1C\" || subtype === \"CIDFontType0C\" ? new CFFFont(file, properties) : new Type1Font(name, file, properties);\n          adjustWidths(properties);\n          data = this.convert(name, cff, properties);\n          break;\n\n        case \"OpenType\":\n        case \"TrueType\":\n        case \"CIDFontType2\":\n          this.mimetype = \"font/opentype\";\n          data = this.checkAndRepair(name, file, properties);\n\n          if (this.isOpenType) {\n            adjustWidths(properties);\n            type = \"OpenType\";\n          }\n\n          break;\n\n        default:\n          throw new _util.FormatError(`Font ${type} is not supported`);\n      }\n    } catch (e) {\n      (0, _util.warn)(e);\n      this.fallbackToSystemFont(properties);\n      return;\n    }\n\n    this.data = data;\n    this.fontType = getFontType(type, subtype);\n    this.fontMatrix = properties.fontMatrix;\n    this.widths = properties.widths;\n    this.defaultWidth = properties.defaultWidth;\n    this.toUnicode = properties.toUnicode;\n    this.seacMap = properties.seacMap;\n  }\n\n  function int16(b0, b1) {\n    return (b0 << 8) + b1;\n  }\n\n  function writeSignedInt16(bytes, index, value) {\n    bytes[index + 1] = value;\n    bytes[index] = value >>> 8;\n  }\n\n  function signedInt16(b0, b1) {\n    var value = (b0 << 8) + b1;\n    return value & 1 << 15 ? value - 0x10000 : value;\n  }\n\n  function int32(b0, b1, b2, b3) {\n    return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n  }\n\n  function string16(value) {\n    return String.fromCharCode(value >> 8 & 0xff, value & 0xff);\n  }\n\n  function safeString16(value) {\n    if (value > 0x7fff) {\n      value = 0x7fff;\n    } else if (value < -0x8000) {\n      value = -0x8000;\n    }\n\n    return String.fromCharCode(value >> 8 & 0xff, value & 0xff);\n  }\n\n  function isTrueTypeFile(file) {\n    var header = file.peekBytes(4);\n    return (0, _core_utils.readUint32)(header, 0) === 0x00010000 || (0, _util.bytesToString)(header) === \"true\";\n  }\n\n  function isTrueTypeCollectionFile(file) {\n    const header = file.peekBytes(4);\n    return (0, _util.bytesToString)(header) === \"ttcf\";\n  }\n\n  function isOpenTypeFile(file) {\n    var header = file.peekBytes(4);\n    return (0, _util.bytesToString)(header) === \"OTTO\";\n  }\n\n  function isType1File(file) {\n    var header = file.peekBytes(2);\n\n    if (header[0] === 0x25 && header[1] === 0x21) {\n      return true;\n    }\n\n    if (header[0] === 0x80 && header[1] === 0x01) {\n      return true;\n    }\n\n    return false;\n  }\n\n  function isCFFFile(file) {\n    const header = file.peekBytes(4);\n\n    if (header[0] >= 1 && header[3] >= 1 && header[3] <= 4) {\n      return true;\n    }\n\n    return false;\n  }\n\n  function getFontFileType(file, {\n    type,\n    subtype,\n    composite\n  }) {\n    let fileType, fileSubtype;\n\n    if (isTrueTypeFile(file) || isTrueTypeCollectionFile(file)) {\n      if (composite) {\n        fileType = \"CIDFontType2\";\n      } else {\n        fileType = \"TrueType\";\n      }\n    } else if (isOpenTypeFile(file)) {\n      if (composite) {\n        fileType = \"CIDFontType2\";\n      } else {\n        fileType = \"OpenType\";\n      }\n    } else if (isType1File(file)) {\n      if (composite) {\n        fileType = \"CIDFontType0\";\n      } else {\n        fileType = type === \"MMType1\" ? \"MMType1\" : \"Type1\";\n      }\n    } else if (isCFFFile(file)) {\n      if (composite) {\n        fileType = \"CIDFontType0\";\n        fileSubtype = \"CIDFontType0C\";\n      } else {\n        fileType = type === \"MMType1\" ? \"MMType1\" : \"Type1\";\n        fileSubtype = \"Type1C\";\n      }\n    } else {\n      (0, _util.warn)(\"getFontFileType: Unable to detect correct font file Type/Subtype.\");\n      fileType = type;\n      fileSubtype = subtype;\n    }\n\n    return [fileType, fileSubtype];\n  }\n\n  function buildToFontChar(encoding, glyphsUnicodeMap, differences) {\n    var toFontChar = [],\n        unicode;\n\n    for (var i = 0, ii = encoding.length; i < ii; i++) {\n      unicode = (0, _unicode.getUnicodeForGlyph)(encoding[i], glyphsUnicodeMap);\n\n      if (unicode !== -1) {\n        toFontChar[i] = unicode;\n      }\n    }\n\n    for (var charCode in differences) {\n      unicode = (0, _unicode.getUnicodeForGlyph)(differences[charCode], glyphsUnicodeMap);\n\n      if (unicode !== -1) {\n        toFontChar[+charCode] = unicode;\n      }\n    }\n\n    return toFontChar;\n  }\n\n  function adjustMapping(charCodeToGlyphId, hasGlyph, newGlyphZeroId) {\n    var newMap = Object.create(null);\n    var toFontChar = [];\n    var privateUseAreaIndex = 0;\n    var nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0];\n    var privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1];\n\n    for (var originalCharCode in charCodeToGlyphId) {\n      originalCharCode |= 0;\n      var glyphId = charCodeToGlyphId[originalCharCode];\n\n      if (!hasGlyph(glyphId)) {\n        continue;\n      }\n\n      if (nextAvailableFontCharCode > privateUseOffetEnd) {\n        privateUseAreaIndex++;\n\n        if (privateUseAreaIndex >= PRIVATE_USE_AREAS.length) {\n          (0, _util.warn)(\"Ran out of space in font private use area.\");\n          break;\n        }\n\n        nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0];\n        privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1];\n      }\n\n      var fontCharCode = nextAvailableFontCharCode++;\n\n      if (glyphId === 0) {\n        glyphId = newGlyphZeroId;\n      }\n\n      newMap[fontCharCode] = glyphId;\n      toFontChar[originalCharCode] = fontCharCode;\n    }\n\n    return {\n      toFontChar,\n      charCodeToGlyphId: newMap,\n      nextAvailableFontCharCode\n    };\n  }\n\n  function getRanges(glyphs, numGlyphs) {\n    var codes = [];\n\n    for (var charCode in glyphs) {\n      if (glyphs[charCode] >= numGlyphs) {\n        continue;\n      }\n\n      codes.push({\n        fontCharCode: charCode | 0,\n        glyphId: glyphs[charCode]\n      });\n    }\n\n    if (codes.length === 0) {\n      codes.push({\n        fontCharCode: 0,\n        glyphId: 0\n      });\n    }\n\n    codes.sort(function fontGetRangesSort(a, b) {\n      return a.fontCharCode - b.fontCharCode;\n    });\n    var ranges = [];\n    var length = codes.length;\n\n    for (var n = 0; n < length;) {\n      var start = codes[n].fontCharCode;\n      var codeIndices = [codes[n].glyphId];\n      ++n;\n      var end = start;\n\n      while (n < length && end + 1 === codes[n].fontCharCode) {\n        codeIndices.push(codes[n].glyphId);\n        ++end;\n        ++n;\n\n        if (end === 0xffff) {\n          break;\n        }\n      }\n\n      ranges.push([start, end, codeIndices]);\n    }\n\n    return ranges;\n  }\n\n  function createCmapTable(glyphs, numGlyphs) {\n    var ranges = getRanges(glyphs, numGlyphs);\n    var numTables = ranges[ranges.length - 1][1] > 0xffff ? 2 : 1;\n    var cmap = \"\\x00\\x00\" + string16(numTables) + \"\\x00\\x03\" + \"\\x00\\x01\" + (0, _util.string32)(4 + numTables * 8);\n    var i, ii, j, jj;\n\n    for (i = ranges.length - 1; i >= 0; --i) {\n      if (ranges[i][0] <= 0xffff) {\n        break;\n      }\n    }\n\n    var bmpLength = i + 1;\n\n    if (ranges[i][0] < 0xffff && ranges[i][1] === 0xffff) {\n      ranges[i][1] = 0xfffe;\n    }\n\n    var trailingRangesCount = ranges[i][1] < 0xffff ? 1 : 0;\n    var segCount = bmpLength + trailingRangesCount;\n    var searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2);\n    var startCount = \"\";\n    var endCount = \"\";\n    var idDeltas = \"\";\n    var idRangeOffsets = \"\";\n    var glyphsIds = \"\";\n    var bias = 0;\n    var range, start, end, codes;\n\n    for (i = 0, ii = bmpLength; i < ii; i++) {\n      range = ranges[i];\n      start = range[0];\n      end = range[1];\n      startCount += string16(start);\n      endCount += string16(end);\n      codes = range[2];\n      var contiguous = true;\n\n      for (j = 1, jj = codes.length; j < jj; ++j) {\n        if (codes[j] !== codes[j - 1] + 1) {\n          contiguous = false;\n          break;\n        }\n      }\n\n      if (!contiguous) {\n        var offset = (segCount - i) * 2 + bias * 2;\n        bias += end - start + 1;\n        idDeltas += string16(0);\n        idRangeOffsets += string16(offset);\n\n        for (j = 0, jj = codes.length; j < jj; ++j) {\n          glyphsIds += string16(codes[j]);\n        }\n      } else {\n        var startCode = codes[0];\n        idDeltas += string16(startCode - start & 0xffff);\n        idRangeOffsets += string16(0);\n      }\n    }\n\n    if (trailingRangesCount > 0) {\n      endCount += \"\\xFF\\xFF\";\n      startCount += \"\\xFF\\xFF\";\n      idDeltas += \"\\x00\\x01\";\n      idRangeOffsets += \"\\x00\\x00\";\n    }\n\n    var format314 = \"\\x00\\x00\" + string16(2 * segCount) + string16(searchParams.range) + string16(searchParams.entry) + string16(searchParams.rangeShift) + endCount + \"\\x00\\x00\" + startCount + idDeltas + idRangeOffsets + glyphsIds;\n    var format31012 = \"\";\n    var header31012 = \"\";\n\n    if (numTables > 1) {\n      cmap += \"\\x00\\x03\" + \"\\x00\\x0A\" + (0, _util.string32)(4 + numTables * 8 + 4 + format314.length);\n      format31012 = \"\";\n\n      for (i = 0, ii = ranges.length; i < ii; i++) {\n        range = ranges[i];\n        start = range[0];\n        codes = range[2];\n        var code = codes[0];\n\n        for (j = 1, jj = codes.length; j < jj; ++j) {\n          if (codes[j] !== codes[j - 1] + 1) {\n            end = range[0] + j - 1;\n            format31012 += (0, _util.string32)(start) + (0, _util.string32)(end) + (0, _util.string32)(code);\n            start = end + 1;\n            code = codes[j];\n          }\n        }\n\n        format31012 += (0, _util.string32)(start) + (0, _util.string32)(range[1]) + (0, _util.string32)(code);\n      }\n\n      header31012 = \"\\x00\\x0C\" + \"\\x00\\x00\" + (0, _util.string32)(format31012.length + 16) + \"\\x00\\x00\\x00\\x00\" + (0, _util.string32)(format31012.length / 12);\n    }\n\n    return cmap + \"\\x00\\x04\" + string16(format314.length + 4) + format314 + header31012 + format31012;\n  }\n\n  function validateOS2Table(os2, file) {\n    file.pos = (file.start || 0) + os2.offset;\n    var version = file.getUint16();\n    file.skip(60);\n    var selection = file.getUint16();\n\n    if (version < 4 && selection & 0x0300) {\n      return false;\n    }\n\n    var firstChar = file.getUint16();\n    var lastChar = file.getUint16();\n\n    if (firstChar > lastChar) {\n      return false;\n    }\n\n    file.skip(6);\n    var usWinAscent = file.getUint16();\n\n    if (usWinAscent === 0) {\n      return false;\n    }\n\n    os2.data[8] = os2.data[9] = 0;\n    return true;\n  }\n\n  function createOS2Table(properties, charstrings, override) {\n    override = override || {\n      unitsPerEm: 0,\n      yMax: 0,\n      yMin: 0,\n      ascent: 0,\n      descent: 0\n    };\n    var ulUnicodeRange1 = 0;\n    var ulUnicodeRange2 = 0;\n    var ulUnicodeRange3 = 0;\n    var ulUnicodeRange4 = 0;\n    var firstCharIndex = null;\n    var lastCharIndex = 0;\n\n    if (charstrings) {\n      for (var code in charstrings) {\n        code |= 0;\n\n        if (firstCharIndex > code || !firstCharIndex) {\n          firstCharIndex = code;\n        }\n\n        if (lastCharIndex < code) {\n          lastCharIndex = code;\n        }\n\n        var position = (0, _unicode.getUnicodeRangeFor)(code);\n\n        if (position < 32) {\n          ulUnicodeRange1 |= 1 << position;\n        } else if (position < 64) {\n          ulUnicodeRange2 |= 1 << position - 32;\n        } else if (position < 96) {\n          ulUnicodeRange3 |= 1 << position - 64;\n        } else if (position < 123) {\n          ulUnicodeRange4 |= 1 << position - 96;\n        } else {\n          throw new _util.FormatError(\"Unicode ranges Bits > 123 are reserved for internal usage\");\n        }\n      }\n\n      if (lastCharIndex > 0xffff) {\n        lastCharIndex = 0xffff;\n      }\n    } else {\n      firstCharIndex = 0;\n      lastCharIndex = 255;\n    }\n\n    var bbox = properties.bbox || [0, 0, 0, 0];\n    var unitsPerEm = override.unitsPerEm || 1 / (properties.fontMatrix || _util.FONT_IDENTITY_MATRIX)[0];\n    var scale = properties.ascentScaled ? 1.0 : unitsPerEm / PDF_GLYPH_SPACE_UNITS;\n    var typoAscent = override.ascent || Math.round(scale * (properties.ascent || bbox[3]));\n    var typoDescent = override.descent || Math.round(scale * (properties.descent || bbox[1]));\n\n    if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) {\n      typoDescent = -typoDescent;\n    }\n\n    var winAscent = override.yMax || typoAscent;\n    var winDescent = -override.yMin || -typoDescent;\n    return \"\\x00\\x03\" + \"\\x02\\x24\" + \"\\x01\\xF4\" + \"\\x00\\x05\" + \"\\x00\\x00\" + \"\\x02\\x8A\" + \"\\x02\\xBB\" + \"\\x00\\x00\" + \"\\x00\\x8C\" + \"\\x02\\x8A\" + \"\\x02\\xBB\" + \"\\x00\\x00\" + \"\\x01\\xDF\" + \"\\x00\\x31\" + \"\\x01\\x02\" + \"\\x00\\x00\" + \"\\x00\\x00\\x06\" + String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) + \"\\x00\\x00\\x00\\x00\\x00\\x00\" + (0, _util.string32)(ulUnicodeRange1) + (0, _util.string32)(ulUnicodeRange2) + (0, _util.string32)(ulUnicodeRange3) + (0, _util.string32)(ulUnicodeRange4) + \"\\x2A\\x32\\x31\\x2A\" + string16(properties.italicAngle ? 1 : 0) + string16(firstCharIndex || properties.firstChar) + string16(lastCharIndex || properties.lastChar) + string16(typoAscent) + string16(typoDescent) + \"\\x00\\x64\" + string16(winAscent) + string16(winDescent) + \"\\x00\\x00\\x00\\x00\" + \"\\x00\\x00\\x00\\x00\" + string16(properties.xHeight) + string16(properties.capHeight) + string16(0) + string16(firstCharIndex || properties.firstChar) + \"\\x00\\x03\";\n  }\n\n  function createPostTable(properties) {\n    var angle = Math.floor(properties.italicAngle * 2 ** 16);\n    return \"\\x00\\x03\\x00\\x00\" + (0, _util.string32)(angle) + \"\\x00\\x00\" + \"\\x00\\x00\" + (0, _util.string32)(properties.fixedPitch) + \"\\x00\\x00\\x00\\x00\" + \"\\x00\\x00\\x00\\x00\" + \"\\x00\\x00\\x00\\x00\" + \"\\x00\\x00\\x00\\x00\";\n  }\n\n  function createNameTable(name, proto) {\n    if (!proto) {\n      proto = [[], []];\n    }\n\n    var strings = [proto[0][0] || \"Original licence\", proto[0][1] || name, proto[0][2] || \"Unknown\", proto[0][3] || \"uniqueID\", proto[0][4] || name, proto[0][5] || \"Version 0.11\", proto[0][6] || \"\", proto[0][7] || \"Unknown\", proto[0][8] || \"Unknown\", proto[0][9] || \"Unknown\"];\n    var stringsUnicode = [];\n    var i, ii, j, jj, str;\n\n    for (i = 0, ii = strings.length; i < ii; i++) {\n      str = proto[1][i] || strings[i];\n      var strBufUnicode = [];\n\n      for (j = 0, jj = str.length; j < jj; j++) {\n        strBufUnicode.push(string16(str.charCodeAt(j)));\n      }\n\n      stringsUnicode.push(strBufUnicode.join(\"\"));\n    }\n\n    var names = [strings, stringsUnicode];\n    var platforms = [\"\\x00\\x01\", \"\\x00\\x03\"];\n    var encodings = [\"\\x00\\x00\", \"\\x00\\x01\"];\n    var languages = [\"\\x00\\x00\", \"\\x04\\x09\"];\n    var namesRecordCount = strings.length * platforms.length;\n    var nameTable = \"\\x00\\x00\" + string16(namesRecordCount) + string16(namesRecordCount * 12 + 6);\n    var strOffset = 0;\n\n    for (i = 0, ii = platforms.length; i < ii; i++) {\n      var strs = names[i];\n\n      for (j = 0, jj = strs.length; j < jj; j++) {\n        str = strs[j];\n        var nameRecord = platforms[i] + encodings[i] + languages[i] + string16(j) + string16(str.length) + string16(strOffset);\n        nameTable += nameRecord;\n        strOffset += str.length;\n      }\n    }\n\n    nameTable += strings.join(\"\") + stringsUnicode.join(\"\");\n    return nameTable;\n  }\n\n  Font.prototype = {\n    name: null,\n    font: null,\n    mimetype: null,\n    disableFontFace: false,\n\n    get renderer() {\n      var renderer = _font_renderer.FontRendererFactory.create(this, SEAC_ANALYSIS_ENABLED);\n\n      return (0, _util.shadow)(this, \"renderer\", renderer);\n    },\n\n    exportData(extraProperties = false) {\n      const exportDataProperties = extraProperties ? [...EXPORT_DATA_PROPERTIES, ...EXPORT_DATA_EXTRA_PROPERTIES] : EXPORT_DATA_PROPERTIES;\n      const data = Object.create(null);\n      let property, value;\n\n      for (property of exportDataProperties) {\n        value = this[property];\n\n        if (value !== undefined) {\n          data[property] = value;\n        }\n      }\n\n      return data;\n    },\n\n    fallbackToSystemFont(properties) {\n      this.missingFile = true;\n      var name = this.name;\n      var type = this.type;\n      var subtype = this.subtype;\n      let fontName = name.replace(/[,_]/g, \"-\").replace(/\\s/g, \"\");\n      var stdFontMap = (0, _standard_fonts.getStdFontMap)(),\n          nonStdFontMap = (0, _standard_fonts.getNonStdFontMap)();\n      const isStandardFont = !!stdFontMap[fontName];\n      const isMappedToStandardFont = !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]);\n      fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;\n      this.bold = fontName.search(/bold/gi) !== -1;\n      this.italic = fontName.search(/oblique/gi) !== -1 || fontName.search(/italic/gi) !== -1;\n      this.black = name.search(/Black/g) !== -1;\n      const isNarrow = name.search(/Narrow/g) !== -1;\n      this.remeasure = (!isStandardFont || isNarrow) && Object.keys(this.widths).length > 0;\n\n      if ((isStandardFont || isMappedToStandardFont) && type === \"CIDFontType2\" && this.cidEncoding.startsWith(\"Identity-\")) {\n        const GlyphMapForStandardFonts = (0, _standard_fonts.getGlyphMapForStandardFonts)(),\n              cidToGidMap = properties.cidToGidMap;\n        const map = [];\n\n        for (const charCode in GlyphMapForStandardFonts) {\n          map[+charCode] = GlyphMapForStandardFonts[charCode];\n        }\n\n        if (/Arial-?Black/i.test(name)) {\n          var SupplementalGlyphMapForArialBlack = (0, _standard_fonts.getSupplementalGlyphMapForArialBlack)();\n\n          for (const charCode in SupplementalGlyphMapForArialBlack) {\n            map[+charCode] = SupplementalGlyphMapForArialBlack[charCode];\n          }\n        } else if (/Calibri/i.test(name)) {\n          const SupplementalGlyphMapForCalibri = (0, _standard_fonts.getSupplementalGlyphMapForCalibri)();\n\n          for (const charCode in SupplementalGlyphMapForCalibri) {\n            map[+charCode] = SupplementalGlyphMapForCalibri[charCode];\n          }\n        }\n\n        if (cidToGidMap) {\n          for (const charCode in map) {\n            const cid = map[charCode];\n\n            if (cidToGidMap[cid] !== undefined) {\n              map[+charCode] = cidToGidMap[cid];\n            }\n          }\n        }\n\n        var isIdentityUnicode = this.toUnicode instanceof IdentityToUnicodeMap;\n\n        if (!isIdentityUnicode) {\n          this.toUnicode.forEach(function (charCode, unicodeCharCode) {\n            map[+charCode] = unicodeCharCode;\n          });\n        }\n\n        this.toFontChar = map;\n        this.toUnicode = new ToUnicodeMap(map);\n      } else if (/Symbol/i.test(fontName)) {\n        this.toFontChar = buildToFontChar(_encodings.SymbolSetEncoding, (0, _glyphlist.getGlyphsUnicode)(), this.differences);\n      } else if (/Dingbats/i.test(fontName)) {\n        if (/Wingdings/i.test(name)) {\n          (0, _util.warn)(\"Non-embedded Wingdings font, falling back to ZapfDingbats.\");\n        }\n\n        this.toFontChar = buildToFontChar(_encodings.ZapfDingbatsEncoding, (0, _glyphlist.getDingbatsGlyphsUnicode)(), this.differences);\n      } else if (isStandardFont) {\n        this.toFontChar = buildToFontChar(this.defaultEncoding, (0, _glyphlist.getGlyphsUnicode)(), this.differences);\n      } else {\n        const glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();\n        const map = [];\n        this.toUnicode.forEach((charCode, unicodeCharCode) => {\n          if (!this.composite) {\n            var glyphName = this.differences[charCode] || this.defaultEncoding[charCode];\n            const unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);\n\n            if (unicode !== -1) {\n              unicodeCharCode = unicode;\n            }\n          }\n\n          map[+charCode] = unicodeCharCode;\n        });\n\n        if (this.composite && this.toUnicode instanceof IdentityToUnicodeMap) {\n          if (/Verdana/i.test(name)) {\n            const GlyphMapForStandardFonts = (0, _standard_fonts.getGlyphMapForStandardFonts)();\n\n            for (const charCode in GlyphMapForStandardFonts) {\n              map[+charCode] = GlyphMapForStandardFonts[charCode];\n            }\n          }\n        }\n\n        this.toFontChar = map;\n      }\n\n      this.loadedName = fontName.split(\"-\")[0];\n      this.fontType = getFontType(type, subtype);\n    },\n\n    checkAndRepair: function Font_checkAndRepair(name, font, properties) {\n      const VALID_TABLES = [\"OS/2\", \"cmap\", \"head\", \"hhea\", \"hmtx\", \"maxp\", \"name\", \"post\", \"loca\", \"glyf\", \"fpgm\", \"prep\", \"cvt \", \"CFF \"];\n\n      function readTables(file, numTables) {\n        const tables = Object.create(null);\n        tables[\"OS/2\"] = null;\n        tables.cmap = null;\n        tables.head = null;\n        tables.hhea = null;\n        tables.hmtx = null;\n        tables.maxp = null;\n        tables.name = null;\n        tables.post = null;\n\n        for (let i = 0; i < numTables; i++) {\n          const table = readTableEntry(file);\n\n          if (!VALID_TABLES.includes(table.tag)) {\n            continue;\n          }\n\n          if (table.length === 0) {\n            continue;\n          }\n\n          tables[table.tag] = table;\n        }\n\n        return tables;\n      }\n\n      function readTableEntry(file) {\n        var tag = (0, _util.bytesToString)(file.getBytes(4));\n        var checksum = file.getInt32() >>> 0;\n        var offset = file.getInt32() >>> 0;\n        var length = file.getInt32() >>> 0;\n        var previousPosition = file.pos;\n        file.pos = file.start ? file.start : 0;\n        file.skip(offset);\n        var data = file.getBytes(length);\n        file.pos = previousPosition;\n\n        if (tag === \"head\") {\n          data[8] = data[9] = data[10] = data[11] = 0;\n          data[17] |= 0x20;\n        }\n\n        return {\n          tag,\n          checksum,\n          length,\n          offset,\n          data\n        };\n      }\n\n      function readOpenTypeHeader(ttf) {\n        return {\n          version: (0, _util.bytesToString)(ttf.getBytes(4)),\n          numTables: ttf.getUint16(),\n          searchRange: ttf.getUint16(),\n          entrySelector: ttf.getUint16(),\n          rangeShift: ttf.getUint16()\n        };\n      }\n\n      function readTrueTypeCollectionHeader(ttc) {\n        const ttcTag = (0, _util.bytesToString)(ttc.getBytes(4));\n        (0, _util.assert)(ttcTag === \"ttcf\", \"Must be a TrueType Collection font.\");\n        const majorVersion = ttc.getUint16();\n        const minorVersion = ttc.getUint16();\n        const numFonts = ttc.getInt32() >>> 0;\n        const offsetTable = [];\n\n        for (let i = 0; i < numFonts; i++) {\n          offsetTable.push(ttc.getInt32() >>> 0);\n        }\n\n        const header = {\n          ttcTag,\n          majorVersion,\n          minorVersion,\n          numFonts,\n          offsetTable\n        };\n\n        switch (majorVersion) {\n          case 1:\n            return header;\n\n          case 2:\n            header.dsigTag = ttc.getInt32() >>> 0;\n            header.dsigLength = ttc.getInt32() >>> 0;\n            header.dsigOffset = ttc.getInt32() >>> 0;\n            return header;\n        }\n\n        throw new _util.FormatError(`Invalid TrueType Collection majorVersion: ${majorVersion}.`);\n      }\n\n      function readTrueTypeCollectionData(ttc, fontName) {\n        const {\n          numFonts,\n          offsetTable\n        } = readTrueTypeCollectionHeader(ttc);\n\n        for (let i = 0; i < numFonts; i++) {\n          ttc.pos = (ttc.start || 0) + offsetTable[i];\n          const potentialHeader = readOpenTypeHeader(ttc);\n          const potentialTables = readTables(ttc, potentialHeader.numTables);\n\n          if (!potentialTables.name) {\n            throw new _util.FormatError('TrueType Collection font must contain a \"name\" table.');\n          }\n\n          const nameTable = readNameTable(potentialTables.name);\n\n          for (let j = 0, jj = nameTable.length; j < jj; j++) {\n            for (let k = 0, kk = nameTable[j].length; k < kk; k++) {\n              const nameEntry = nameTable[j][k];\n\n              if (nameEntry && nameEntry.replace(/\\s/g, \"\") === fontName) {\n                return {\n                  header: potentialHeader,\n                  tables: potentialTables\n                };\n              }\n            }\n          }\n        }\n\n        throw new _util.FormatError(`TrueType Collection does not contain \"${fontName}\" font.`);\n      }\n\n      function readCmapTable(cmap, file, isSymbolicFont, hasEncoding) {\n        if (!cmap) {\n          (0, _util.warn)(\"No cmap table available.\");\n          return {\n            platformId: -1,\n            encodingId: -1,\n            mappings: [],\n            hasShortCmap: false\n          };\n        }\n\n        var segment;\n        var start = (file.start ? file.start : 0) + cmap.offset;\n        file.pos = start;\n        file.skip(2);\n        var numTables = file.getUint16();\n        var potentialTable;\n        var canBreak = false;\n\n        for (var i = 0; i < numTables; i++) {\n          var platformId = file.getUint16();\n          var encodingId = file.getUint16();\n          var offset = file.getInt32() >>> 0;\n          var useTable = false;\n\n          if (potentialTable && potentialTable.platformId === platformId && potentialTable.encodingId === encodingId) {\n            continue;\n          }\n\n          if (platformId === 0 && (encodingId === 0 || encodingId === 1 || encodingId === 3)) {\n            useTable = true;\n          } else if (platformId === 1 && encodingId === 0) {\n            useTable = true;\n          } else if (platformId === 3 && encodingId === 1 && (hasEncoding || !potentialTable)) {\n            useTable = true;\n\n            if (!isSymbolicFont) {\n              canBreak = true;\n            }\n          } else if (isSymbolicFont && platformId === 3 && encodingId === 0) {\n            useTable = true;\n            canBreak = true;\n          }\n\n          if (useTable) {\n            potentialTable = {\n              platformId,\n              encodingId,\n              offset\n            };\n          }\n\n          if (canBreak) {\n            break;\n          }\n        }\n\n        if (potentialTable) {\n          file.pos = start + potentialTable.offset;\n        }\n\n        if (!potentialTable || file.peekByte() === -1) {\n          (0, _util.warn)(\"Could not find a preferred cmap table.\");\n          return {\n            platformId: -1,\n            encodingId: -1,\n            mappings: [],\n            hasShortCmap: false\n          };\n        }\n\n        var format = file.getUint16();\n        file.skip(2 + 2);\n        var hasShortCmap = false;\n        var mappings = [];\n        var j, glyphId;\n\n        if (format === 0) {\n          for (j = 0; j < 256; j++) {\n            var index = file.getByte();\n\n            if (!index) {\n              continue;\n            }\n\n            mappings.push({\n              charCode: j,\n              glyphId: index\n            });\n          }\n\n          hasShortCmap = true;\n        } else if (format === 4) {\n          var segCount = file.getUint16() >> 1;\n          file.skip(6);\n          var segIndex,\n              segments = [];\n\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segments.push({\n              end: file.getUint16()\n            });\n          }\n\n          file.skip(2);\n\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segments[segIndex].start = file.getUint16();\n          }\n\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segments[segIndex].delta = file.getUint16();\n          }\n\n          var offsetsCount = 0;\n\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segment = segments[segIndex];\n            var rangeOffset = file.getUint16();\n\n            if (!rangeOffset) {\n              segment.offsetIndex = -1;\n              continue;\n            }\n\n            var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);\n            segment.offsetIndex = offsetIndex;\n            offsetsCount = Math.max(offsetsCount, offsetIndex + segment.end - segment.start + 1);\n          }\n\n          var offsets = [];\n\n          for (j = 0; j < offsetsCount; j++) {\n            offsets.push(file.getUint16());\n          }\n\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segment = segments[segIndex];\n            start = segment.start;\n            var end = segment.end;\n            var delta = segment.delta;\n            offsetIndex = segment.offsetIndex;\n\n            for (j = start; j <= end; j++) {\n              if (j === 0xffff) {\n                continue;\n              }\n\n              glyphId = offsetIndex < 0 ? j : offsets[offsetIndex + j - start];\n              glyphId = glyphId + delta & 0xffff;\n              mappings.push({\n                charCode: j,\n                glyphId\n              });\n            }\n          }\n        } else if (format === 6) {\n          var firstCode = file.getUint16();\n          var entryCount = file.getUint16();\n\n          for (j = 0; j < entryCount; j++) {\n            glyphId = file.getUint16();\n            var charCode = firstCode + j;\n            mappings.push({\n              charCode,\n              glyphId\n            });\n          }\n        } else {\n          (0, _util.warn)(\"cmap table has unsupported format: \" + format);\n          return {\n            platformId: -1,\n            encodingId: -1,\n            mappings: [],\n            hasShortCmap: false\n          };\n        }\n\n        mappings.sort(function (a, b) {\n          return a.charCode - b.charCode;\n        });\n\n        for (i = 1; i < mappings.length; i++) {\n          if (mappings[i - 1].charCode === mappings[i].charCode) {\n            mappings.splice(i, 1);\n            i--;\n          }\n        }\n\n        return {\n          platformId: potentialTable.platformId,\n          encodingId: potentialTable.encodingId,\n          mappings,\n          hasShortCmap\n        };\n      }\n\n      function sanitizeMetrics(file, header, metrics, numGlyphs, dupFirstEntry) {\n        if (!header) {\n          if (metrics) {\n            metrics.data = null;\n          }\n\n          return;\n        }\n\n        file.pos = (file.start ? file.start : 0) + header.offset;\n        file.pos += 4;\n        file.pos += 2;\n        file.pos += 2;\n        file.pos += 2;\n        file.pos += 2;\n        file.pos += 2;\n        file.pos += 2;\n        file.pos += 2;\n        file.pos += 2;\n        file.pos += 2;\n        file.pos += 2;\n        file.pos += 8;\n        file.pos += 2;\n        var numOfMetrics = file.getUint16();\n\n        if (numOfMetrics > numGlyphs) {\n          (0, _util.info)(\"The numOfMetrics (\" + numOfMetrics + \") should not be \" + \"greater than the numGlyphs (\" + numGlyphs + \")\");\n          numOfMetrics = numGlyphs;\n          header.data[34] = (numOfMetrics & 0xff00) >> 8;\n          header.data[35] = numOfMetrics & 0x00ff;\n        }\n\n        var numOfSidebearings = numGlyphs - numOfMetrics;\n        var numMissing = numOfSidebearings - (metrics.length - numOfMetrics * 4 >> 1);\n\n        if (numMissing > 0) {\n          var entries = new Uint8Array(metrics.length + numMissing * 2);\n          entries.set(metrics.data);\n\n          if (dupFirstEntry) {\n            entries[metrics.length] = metrics.data[2];\n            entries[metrics.length + 1] = metrics.data[3];\n          }\n\n          metrics.data = entries;\n        }\n      }\n\n      function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, hintsValid) {\n        var glyphProfile = {\n          length: 0,\n          sizeOfInstructions: 0\n        };\n\n        if (sourceEnd - sourceStart <= 12) {\n          return glyphProfile;\n        }\n\n        var glyf = source.subarray(sourceStart, sourceEnd);\n        var contoursCount = signedInt16(glyf[0], glyf[1]);\n\n        if (contoursCount < 0) {\n          contoursCount = -1;\n          writeSignedInt16(glyf, 0, contoursCount);\n          dest.set(glyf, destStart);\n          glyphProfile.length = glyf.length;\n          return glyphProfile;\n        }\n\n        var i,\n            j = 10,\n            flagsCount = 0;\n\n        for (i = 0; i < contoursCount; i++) {\n          var endPoint = glyf[j] << 8 | glyf[j + 1];\n          flagsCount = endPoint + 1;\n          j += 2;\n        }\n\n        var instructionsStart = j;\n        var instructionsLength = glyf[j] << 8 | glyf[j + 1];\n        glyphProfile.sizeOfInstructions = instructionsLength;\n        j += 2 + instructionsLength;\n        var instructionsEnd = j;\n        var coordinatesLength = 0;\n\n        for (i = 0; i < flagsCount; i++) {\n          var flag = glyf[j++];\n\n          if (flag & 0xc0) {\n            glyf[j - 1] = flag & 0x3f;\n          }\n\n          let xLength = 2;\n\n          if (flag & 2) {\n            xLength = 1;\n          } else if (flag & 16) {\n            xLength = 0;\n          }\n\n          let yLength = 2;\n\n          if (flag & 4) {\n            yLength = 1;\n          } else if (flag & 32) {\n            yLength = 0;\n          }\n\n          const xyLength = xLength + yLength;\n          coordinatesLength += xyLength;\n\n          if (flag & 8) {\n            var repeat = glyf[j++];\n            i += repeat;\n            coordinatesLength += repeat * xyLength;\n          }\n        }\n\n        if (coordinatesLength === 0) {\n          return glyphProfile;\n        }\n\n        var glyphDataLength = j + coordinatesLength;\n\n        if (glyphDataLength > glyf.length) {\n          return glyphProfile;\n        }\n\n        if (!hintsValid && instructionsLength > 0) {\n          dest.set(glyf.subarray(0, instructionsStart), destStart);\n          dest.set([0, 0], destStart + instructionsStart);\n          dest.set(glyf.subarray(instructionsEnd, glyphDataLength), destStart + instructionsStart + 2);\n          glyphDataLength -= instructionsLength;\n\n          if (glyf.length - glyphDataLength > 3) {\n            glyphDataLength = glyphDataLength + 3 & ~3;\n          }\n\n          glyphProfile.length = glyphDataLength;\n          return glyphProfile;\n        }\n\n        if (glyf.length - glyphDataLength > 3) {\n          glyphDataLength = glyphDataLength + 3 & ~3;\n          dest.set(glyf.subarray(0, glyphDataLength), destStart);\n          glyphProfile.length = glyphDataLength;\n          return glyphProfile;\n        }\n\n        dest.set(glyf, destStart);\n        glyphProfile.length = glyf.length;\n        return glyphProfile;\n      }\n\n      function sanitizeHead(head, numGlyphs, locaLength) {\n        var data = head.data;\n        var version = int32(data[0], data[1], data[2], data[3]);\n\n        if (version >> 16 !== 1) {\n          (0, _util.info)(\"Attempting to fix invalid version in head table: \" + version);\n          data[0] = 0;\n          data[1] = 1;\n          data[2] = 0;\n          data[3] = 0;\n        }\n\n        var indexToLocFormat = int16(data[50], data[51]);\n\n        if (indexToLocFormat < 0 || indexToLocFormat > 1) {\n          (0, _util.info)(\"Attempting to fix invalid indexToLocFormat in head table: \" + indexToLocFormat);\n          var numGlyphsPlusOne = numGlyphs + 1;\n\n          if (locaLength === numGlyphsPlusOne << 1) {\n            data[50] = 0;\n            data[51] = 0;\n          } else if (locaLength === numGlyphsPlusOne << 2) {\n            data[50] = 0;\n            data[51] = 1;\n          } else {\n            throw new _util.FormatError(\"Could not fix indexToLocFormat: \" + indexToLocFormat);\n          }\n        }\n      }\n\n      function sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions) {\n        var itemSize, itemDecode, itemEncode;\n\n        if (isGlyphLocationsLong) {\n          itemSize = 4;\n\n          itemDecode = function fontItemDecodeLong(data, offset) {\n            return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];\n          };\n\n          itemEncode = function fontItemEncodeLong(data, offset, value) {\n            data[offset] = value >>> 24 & 0xff;\n            data[offset + 1] = value >> 16 & 0xff;\n            data[offset + 2] = value >> 8 & 0xff;\n            data[offset + 3] = value & 0xff;\n          };\n        } else {\n          itemSize = 2;\n\n          itemDecode = function fontItemDecode(data, offset) {\n            return data[offset] << 9 | data[offset + 1] << 1;\n          };\n\n          itemEncode = function fontItemEncode(data, offset, value) {\n            data[offset] = value >> 9 & 0xff;\n            data[offset + 1] = value >> 1 & 0xff;\n          };\n        }\n\n        var numGlyphsOut = dupFirstEntry ? numGlyphs + 1 : numGlyphs;\n        var locaDataSize = itemSize * (1 + numGlyphsOut);\n        var locaData = new Uint8Array(locaDataSize);\n        locaData.set(loca.data.subarray(0, locaDataSize));\n        loca.data = locaData;\n        var oldGlyfData = glyf.data;\n        var oldGlyfDataLength = oldGlyfData.length;\n        var newGlyfData = new Uint8Array(oldGlyfDataLength);\n        var i, j;\n        const locaEntries = [];\n\n        for (i = 0, j = 0; i < numGlyphs + 1; i++, j += itemSize) {\n          let offset = itemDecode(locaData, j);\n\n          if (offset > oldGlyfDataLength) {\n            offset = oldGlyfDataLength;\n          }\n\n          locaEntries.push({\n            index: i,\n            offset,\n            endOffset: 0\n          });\n        }\n\n        locaEntries.sort((a, b) => {\n          return a.offset - b.offset;\n        });\n\n        for (i = 0; i < numGlyphs; i++) {\n          locaEntries[i].endOffset = locaEntries[i + 1].offset;\n        }\n\n        locaEntries.sort((a, b) => {\n          return a.index - b.index;\n        });\n        var missingGlyphs = Object.create(null);\n        var writeOffset = 0;\n        itemEncode(locaData, 0, writeOffset);\n\n        for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {\n          var glyphProfile = sanitizeGlyph(oldGlyfData, locaEntries[i].offset, locaEntries[i].endOffset, newGlyfData, writeOffset, hintsValid);\n          var newLength = glyphProfile.length;\n\n          if (newLength === 0) {\n            missingGlyphs[i] = true;\n          }\n\n          if (glyphProfile.sizeOfInstructions > maxSizeOfInstructions) {\n            maxSizeOfInstructions = glyphProfile.sizeOfInstructions;\n          }\n\n          writeOffset += newLength;\n          itemEncode(locaData, j, writeOffset);\n        }\n\n        if (writeOffset === 0) {\n          var simpleGlyph = new Uint8Array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);\n\n          for (i = 0, j = itemSize; i < numGlyphsOut; i++, j += itemSize) {\n            itemEncode(locaData, j, simpleGlyph.length);\n          }\n\n          glyf.data = simpleGlyph;\n        } else if (dupFirstEntry) {\n          var firstEntryLength = itemDecode(locaData, itemSize);\n\n          if (newGlyfData.length > firstEntryLength + writeOffset) {\n            glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset);\n          } else {\n            glyf.data = new Uint8Array(firstEntryLength + writeOffset);\n            glyf.data.set(newGlyfData.subarray(0, writeOffset));\n          }\n\n          glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset);\n          itemEncode(loca.data, locaData.length - itemSize, writeOffset + firstEntryLength);\n        } else {\n          glyf.data = newGlyfData.subarray(0, writeOffset);\n        }\n\n        return {\n          missingGlyphs,\n          maxSizeOfInstructions\n        };\n      }\n\n      function readPostScriptTable(post, propertiesObj, maxpNumGlyphs) {\n        var start = (font.start ? font.start : 0) + post.offset;\n        font.pos = start;\n        var length = post.length,\n            end = start + length;\n        var version = font.getInt32();\n        font.skip(28);\n        var glyphNames;\n        var valid = true;\n        var i;\n\n        switch (version) {\n          case 0x00010000:\n            glyphNames = MacStandardGlyphOrdering;\n            break;\n\n          case 0x00020000:\n            var numGlyphs = font.getUint16();\n\n            if (numGlyphs !== maxpNumGlyphs) {\n              valid = false;\n              break;\n            }\n\n            var glyphNameIndexes = [];\n\n            for (i = 0; i < numGlyphs; ++i) {\n              var index = font.getUint16();\n\n              if (index >= 32768) {\n                valid = false;\n                break;\n              }\n\n              glyphNameIndexes.push(index);\n            }\n\n            if (!valid) {\n              break;\n            }\n\n            var customNames = [];\n            var strBuf = [];\n\n            while (font.pos < end) {\n              var stringLength = font.getByte();\n              strBuf.length = stringLength;\n\n              for (i = 0; i < stringLength; ++i) {\n                strBuf[i] = String.fromCharCode(font.getByte());\n              }\n\n              customNames.push(strBuf.join(\"\"));\n            }\n\n            glyphNames = [];\n\n            for (i = 0; i < numGlyphs; ++i) {\n              var j = glyphNameIndexes[i];\n\n              if (j < 258) {\n                glyphNames.push(MacStandardGlyphOrdering[j]);\n                continue;\n              }\n\n              glyphNames.push(customNames[j - 258]);\n            }\n\n            break;\n\n          case 0x00030000:\n            break;\n\n          default:\n            (0, _util.warn)(\"Unknown/unsupported post table version \" + version);\n            valid = false;\n\n            if (propertiesObj.defaultEncoding) {\n              glyphNames = propertiesObj.defaultEncoding;\n            }\n\n            break;\n        }\n\n        propertiesObj.glyphNames = glyphNames;\n        return valid;\n      }\n\n      function readNameTable(nameTable) {\n        var start = (font.start ? font.start : 0) + nameTable.offset;\n        font.pos = start;\n        var names = [[], []];\n        var length = nameTable.length,\n            end = start + length;\n        var format = font.getUint16();\n        var FORMAT_0_HEADER_LENGTH = 6;\n\n        if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) {\n          return names;\n        }\n\n        var numRecords = font.getUint16();\n        var stringsStart = font.getUint16();\n        var records = [];\n        var NAME_RECORD_LENGTH = 12;\n        var i, ii;\n\n        for (i = 0; i < numRecords && font.pos + NAME_RECORD_LENGTH <= end; i++) {\n          var r = {\n            platform: font.getUint16(),\n            encoding: font.getUint16(),\n            language: font.getUint16(),\n            name: font.getUint16(),\n            length: font.getUint16(),\n            offset: font.getUint16()\n          };\n\n          if (r.platform === 1 && r.encoding === 0 && r.language === 0 || r.platform === 3 && r.encoding === 1 && r.language === 0x409) {\n            records.push(r);\n          }\n        }\n\n        for (i = 0, ii = records.length; i < ii; i++) {\n          var record = records[i];\n\n          if (record.length <= 0) {\n            continue;\n          }\n\n          var pos = start + stringsStart + record.offset;\n\n          if (pos + record.length > end) {\n            continue;\n          }\n\n          font.pos = pos;\n          var nameIndex = record.name;\n\n          if (record.encoding) {\n            var str = \"\";\n\n            for (var j = 0, jj = record.length; j < jj; j += 2) {\n              str += String.fromCharCode(font.getUint16());\n            }\n\n            names[1][nameIndex] = str;\n          } else {\n            names[0][nameIndex] = (0, _util.bytesToString)(font.getBytes(record.length));\n          }\n        }\n\n        return names;\n      }\n\n      var TTOpsStackDeltas = [0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, 1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1, 0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2, 0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1, -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2];\n\n      function sanitizeTTProgram(table, ttContext) {\n        var data = table.data;\n        var i = 0,\n            j,\n            n,\n            b,\n            funcId,\n            pc,\n            lastEndf = 0,\n            lastDeff = 0;\n        var stack = [];\n        var callstack = [];\n        var functionsCalled = [];\n        var tooComplexToFollowFunctions = ttContext.tooComplexToFollowFunctions;\n        var inFDEF = false,\n            ifLevel = 0,\n            inELSE = 0;\n\n        for (var ii = data.length; i < ii;) {\n          var op = data[i++];\n\n          if (op === 0x40) {\n            n = data[i++];\n\n            if (inFDEF || inELSE) {\n              i += n;\n            } else {\n              for (j = 0; j < n; j++) {\n                stack.push(data[i++]);\n              }\n            }\n          } else if (op === 0x41) {\n            n = data[i++];\n\n            if (inFDEF || inELSE) {\n              i += n * 2;\n            } else {\n              for (j = 0; j < n; j++) {\n                b = data[i++];\n                stack.push(b << 8 | data[i++]);\n              }\n            }\n          } else if ((op & 0xf8) === 0xb0) {\n            n = op - 0xb0 + 1;\n\n            if (inFDEF || inELSE) {\n              i += n;\n            } else {\n              for (j = 0; j < n; j++) {\n                stack.push(data[i++]);\n              }\n            }\n          } else if ((op & 0xf8) === 0xb8) {\n            n = op - 0xb8 + 1;\n\n            if (inFDEF || inELSE) {\n              i += n * 2;\n            } else {\n              for (j = 0; j < n; j++) {\n                b = data[i++];\n                stack.push(b << 8 | data[i++]);\n              }\n            }\n          } else if (op === 0x2b && !tooComplexToFollowFunctions) {\n            if (!inFDEF && !inELSE) {\n              funcId = stack[stack.length - 1];\n\n              if (isNaN(funcId)) {\n                (0, _util.info)(\"TT: CALL empty stack (or invalid entry).\");\n              } else {\n                ttContext.functionsUsed[funcId] = true;\n\n                if (funcId in ttContext.functionsStackDeltas) {\n                  const newStackLength = stack.length + ttContext.functionsStackDeltas[funcId];\n\n                  if (newStackLength < 0) {\n                    (0, _util.warn)(\"TT: CALL invalid functions stack delta.\");\n                    ttContext.hintsValid = false;\n                    return;\n                  }\n\n                  stack.length = newStackLength;\n                } else if (funcId in ttContext.functionsDefined && !functionsCalled.includes(funcId)) {\n                  callstack.push({\n                    data,\n                    i,\n                    stackTop: stack.length - 1\n                  });\n                  functionsCalled.push(funcId);\n                  pc = ttContext.functionsDefined[funcId];\n\n                  if (!pc) {\n                    (0, _util.warn)(\"TT: CALL non-existent function\");\n                    ttContext.hintsValid = false;\n                    return;\n                  }\n\n                  data = pc.data;\n                  i = pc.i;\n                }\n              }\n            }\n          } else if (op === 0x2c && !tooComplexToFollowFunctions) {\n            if (inFDEF || inELSE) {\n              (0, _util.warn)(\"TT: nested FDEFs not allowed\");\n              tooComplexToFollowFunctions = true;\n            }\n\n            inFDEF = true;\n            lastDeff = i;\n            funcId = stack.pop();\n            ttContext.functionsDefined[funcId] = {\n              data,\n              i\n            };\n          } else if (op === 0x2d) {\n            if (inFDEF) {\n              inFDEF = false;\n              lastEndf = i;\n            } else {\n              pc = callstack.pop();\n\n              if (!pc) {\n                (0, _util.warn)(\"TT: ENDF bad stack\");\n                ttContext.hintsValid = false;\n                return;\n              }\n\n              funcId = functionsCalled.pop();\n              data = pc.data;\n              i = pc.i;\n              ttContext.functionsStackDeltas[funcId] = stack.length - pc.stackTop;\n            }\n          } else if (op === 0x89) {\n            if (inFDEF || inELSE) {\n              (0, _util.warn)(\"TT: nested IDEFs not allowed\");\n              tooComplexToFollowFunctions = true;\n            }\n\n            inFDEF = true;\n            lastDeff = i;\n          } else if (op === 0x58) {\n            ++ifLevel;\n          } else if (op === 0x1b) {\n            inELSE = ifLevel;\n          } else if (op === 0x59) {\n            if (inELSE === ifLevel) {\n              inELSE = 0;\n            }\n\n            --ifLevel;\n          } else if (op === 0x1c) {\n            if (!inFDEF && !inELSE) {\n              var offset = stack[stack.length - 1];\n\n              if (offset > 0) {\n                i += offset - 1;\n              }\n            }\n          }\n\n          if (!inFDEF && !inELSE) {\n            let stackDelta = 0;\n\n            if (op <= 0x8e) {\n              stackDelta = TTOpsStackDeltas[op];\n            } else if (op >= 0xc0 && op <= 0xdf) {\n              stackDelta = -1;\n            } else if (op >= 0xe0) {\n              stackDelta = -2;\n            }\n\n            if (op >= 0x71 && op <= 0x75) {\n              n = stack.pop();\n\n              if (!isNaN(n)) {\n                stackDelta = -n * 2;\n              }\n            }\n\n            while (stackDelta < 0 && stack.length > 0) {\n              stack.pop();\n              stackDelta++;\n            }\n\n            while (stackDelta > 0) {\n              stack.push(NaN);\n              stackDelta--;\n            }\n          }\n        }\n\n        ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions;\n        var content = [data];\n\n        if (i > data.length) {\n          content.push(new Uint8Array(i - data.length));\n        }\n\n        if (lastDeff > lastEndf) {\n          (0, _util.warn)(\"TT: complementing a missing function tail\");\n          content.push(new Uint8Array([0x22, 0x2d]));\n        }\n\n        foldTTTable(table, content);\n      }\n\n      function checkInvalidFunctions(ttContext, maxFunctionDefs) {\n        if (ttContext.tooComplexToFollowFunctions) {\n          return;\n        }\n\n        if (ttContext.functionsDefined.length > maxFunctionDefs) {\n          (0, _util.warn)(\"TT: more functions defined than expected\");\n          ttContext.hintsValid = false;\n          return;\n        }\n\n        for (var j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) {\n          if (j > maxFunctionDefs) {\n            (0, _util.warn)(\"TT: invalid function id: \" + j);\n            ttContext.hintsValid = false;\n            return;\n          }\n\n          if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) {\n            (0, _util.warn)(\"TT: undefined function: \" + j);\n            ttContext.hintsValid = false;\n            return;\n          }\n        }\n      }\n\n      function foldTTTable(table, content) {\n        if (content.length > 1) {\n          var newLength = 0;\n          var j, jj;\n\n          for (j = 0, jj = content.length; j < jj; j++) {\n            newLength += content[j].length;\n          }\n\n          newLength = newLength + 3 & ~3;\n          var result = new Uint8Array(newLength);\n          var pos = 0;\n\n          for (j = 0, jj = content.length; j < jj; j++) {\n            result.set(content[j], pos);\n            pos += content[j].length;\n          }\n\n          table.data = result;\n          table.length = newLength;\n        }\n      }\n\n      function sanitizeTTPrograms(fpgm, prep, cvt, maxFunctionDefs) {\n        var ttContext = {\n          functionsDefined: [],\n          functionsUsed: [],\n          functionsStackDeltas: [],\n          tooComplexToFollowFunctions: false,\n          hintsValid: true\n        };\n\n        if (fpgm) {\n          sanitizeTTProgram(fpgm, ttContext);\n        }\n\n        if (prep) {\n          sanitizeTTProgram(prep, ttContext);\n        }\n\n        if (fpgm) {\n          checkInvalidFunctions(ttContext, maxFunctionDefs);\n        }\n\n        if (cvt && cvt.length & 1) {\n          var cvtData = new Uint8Array(cvt.length + 1);\n          cvtData.set(cvt.data);\n          cvt.data = cvtData;\n        }\n\n        return ttContext.hintsValid;\n      }\n\n      font = new _stream.Stream(new Uint8Array(font.getBytes()));\n      let header, tables;\n\n      if (isTrueTypeCollectionFile(font)) {\n        const ttcData = readTrueTypeCollectionData(font, this.name);\n        header = ttcData.header;\n        tables = ttcData.tables;\n      } else {\n        header = readOpenTypeHeader(font);\n        tables = readTables(font, header.numTables);\n      }\n\n      let cff, cffFile;\n      var isTrueType = !tables[\"CFF \"];\n\n      if (!isTrueType) {\n        const isComposite = properties.composite && ((properties.cidToGidMap || []).length > 0 || !(properties.cMap instanceof _cmap.IdentityCMap));\n\n        if (header.version === \"OTTO\" && !isComposite || !tables.head || !tables.hhea || !tables.maxp || !tables.post) {\n          cffFile = new _stream.Stream(tables[\"CFF \"].data);\n          cff = new CFFFont(cffFile, properties);\n          adjustWidths(properties);\n          return this.convert(name, cff, properties);\n        }\n\n        delete tables.glyf;\n        delete tables.loca;\n        delete tables.fpgm;\n        delete tables.prep;\n        delete tables[\"cvt \"];\n        this.isOpenType = true;\n      } else {\n        if (!tables.loca) {\n          throw new _util.FormatError('Required \"loca\" table is not found');\n        }\n\n        if (!tables.glyf) {\n          (0, _util.warn)('Required \"glyf\" table is not found -- trying to recover.');\n          tables.glyf = {\n            tag: \"glyf\",\n            data: new Uint8Array(0)\n          };\n        }\n\n        this.isOpenType = false;\n      }\n\n      if (!tables.maxp) {\n        throw new _util.FormatError('Required \"maxp\" table is not found');\n      }\n\n      font.pos = (font.start || 0) + tables.maxp.offset;\n      var version = font.getInt32();\n      const numGlyphs = font.getUint16();\n      let numGlyphsOut = numGlyphs + 1;\n      let dupFirstEntry = true;\n\n      if (numGlyphsOut > 0xffff) {\n        dupFirstEntry = false;\n        numGlyphsOut = numGlyphs;\n        (0, _util.warn)(\"Not enough space in glyfs to duplicate first glyph.\");\n      }\n\n      var maxFunctionDefs = 0;\n      var maxSizeOfInstructions = 0;\n\n      if (version >= 0x00010000 && tables.maxp.length >= 22) {\n        font.pos += 8;\n        var maxZones = font.getUint16();\n\n        if (maxZones > 2) {\n          tables.maxp.data[14] = 0;\n          tables.maxp.data[15] = 2;\n        }\n\n        font.pos += 4;\n        maxFunctionDefs = font.getUint16();\n        font.pos += 4;\n        maxSizeOfInstructions = font.getUint16();\n      }\n\n      tables.maxp.data[4] = numGlyphsOut >> 8;\n      tables.maxp.data[5] = numGlyphsOut & 255;\n      var hintsValid = sanitizeTTPrograms(tables.fpgm, tables.prep, tables[\"cvt \"], maxFunctionDefs);\n\n      if (!hintsValid) {\n        delete tables.fpgm;\n        delete tables.prep;\n        delete tables[\"cvt \"];\n      }\n\n      sanitizeMetrics(font, tables.hhea, tables.hmtx, numGlyphsOut, dupFirstEntry);\n\n      if (!tables.head) {\n        throw new _util.FormatError('Required \"head\" table is not found');\n      }\n\n      sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0);\n      var missingGlyphs = Object.create(null);\n\n      if (isTrueType) {\n        var isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]);\n        var glyphsInfo = sanitizeGlyphLocations(tables.loca, tables.glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions);\n        missingGlyphs = glyphsInfo.missingGlyphs;\n\n        if (version >= 0x00010000 && tables.maxp.length >= 22) {\n          tables.maxp.data[26] = glyphsInfo.maxSizeOfInstructions >> 8;\n          tables.maxp.data[27] = glyphsInfo.maxSizeOfInstructions & 255;\n        }\n      }\n\n      if (!tables.hhea) {\n        throw new _util.FormatError('Required \"hhea\" table is not found');\n      }\n\n      if (tables.hhea.data[10] === 0 && tables.hhea.data[11] === 0) {\n        tables.hhea.data[10] = 0xff;\n        tables.hhea.data[11] = 0xff;\n      }\n\n      var metricsOverride = {\n        unitsPerEm: int16(tables.head.data[18], tables.head.data[19]),\n        yMax: int16(tables.head.data[42], tables.head.data[43]),\n        yMin: signedInt16(tables.head.data[38], tables.head.data[39]),\n        ascent: int16(tables.hhea.data[4], tables.hhea.data[5]),\n        descent: signedInt16(tables.hhea.data[6], tables.hhea.data[7])\n      };\n      this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm;\n      this.descent = metricsOverride.descent / metricsOverride.unitsPerEm;\n\n      if (tables.post) {\n        readPostScriptTable(tables.post, properties, numGlyphs);\n      }\n\n      tables.post = {\n        tag: \"post\",\n        data: createPostTable(properties)\n      };\n      const charCodeToGlyphId = [];\n\n      function hasGlyph(glyphId) {\n        return !missingGlyphs[glyphId];\n      }\n\n      if (properties.composite) {\n        var cidToGidMap = properties.cidToGidMap || [];\n        var isCidToGidMapEmpty = cidToGidMap.length === 0;\n        properties.cMap.forEach(function (charCode, cid) {\n          if (cid > 0xffff) {\n            throw new _util.FormatError(\"Max size of CID is 65,535\");\n          }\n\n          var glyphId = -1;\n\n          if (isCidToGidMapEmpty) {\n            glyphId = cid;\n          } else if (cidToGidMap[cid] !== undefined) {\n            glyphId = cidToGidMap[cid];\n          }\n\n          if (glyphId >= 0 && glyphId < numGlyphs && hasGlyph(glyphId)) {\n            charCodeToGlyphId[charCode] = glyphId;\n          }\n        });\n      } else {\n        var cmapTable = readCmapTable(tables.cmap, font, this.isSymbolicFont, properties.hasEncoding);\n        var cmapPlatformId = cmapTable.platformId;\n        var cmapEncodingId = cmapTable.encodingId;\n        var cmapMappings = cmapTable.mappings;\n        var cmapMappingsLength = cmapMappings.length;\n        let baseEncoding = [];\n\n        if (properties.hasEncoding && (properties.baseEncodingName === \"MacRomanEncoding\" || properties.baseEncodingName === \"WinAnsiEncoding\")) {\n          baseEncoding = (0, _encodings.getEncoding)(properties.baseEncodingName);\n        }\n\n        if (properties.hasEncoding && !this.isSymbolicFont && (cmapPlatformId === 3 && cmapEncodingId === 1 || cmapPlatformId === 1 && cmapEncodingId === 0)) {\n          var glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();\n\n          for (let charCode = 0; charCode < 256; charCode++) {\n            var glyphName, standardGlyphName;\n\n            if (this.differences && charCode in this.differences) {\n              glyphName = this.differences[charCode];\n            } else if (charCode in baseEncoding && baseEncoding[charCode] !== \"\") {\n              glyphName = baseEncoding[charCode];\n            } else {\n              glyphName = _encodings.StandardEncoding[charCode];\n            }\n\n            if (!glyphName) {\n              continue;\n            }\n\n            standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap);\n            var unicodeOrCharCode;\n\n            if (cmapPlatformId === 3 && cmapEncodingId === 1) {\n              unicodeOrCharCode = glyphsUnicodeMap[standardGlyphName];\n            } else if (cmapPlatformId === 1 && cmapEncodingId === 0) {\n              unicodeOrCharCode = _encodings.MacRomanEncoding.indexOf(standardGlyphName);\n            }\n\n            for (let i = 0; i < cmapMappingsLength; ++i) {\n              if (cmapMappings[i].charCode !== unicodeOrCharCode) {\n                continue;\n              }\n\n              charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;\n              break;\n            }\n          }\n        } else if (cmapPlatformId === 0) {\n          for (let i = 0; i < cmapMappingsLength; ++i) {\n            charCodeToGlyphId[cmapMappings[i].charCode] = cmapMappings[i].glyphId;\n          }\n        } else {\n          for (let i = 0; i < cmapMappingsLength; ++i) {\n            let charCode = cmapMappings[i].charCode;\n\n            if (cmapPlatformId === 3 && charCode >= 0xf000 && charCode <= 0xf0ff) {\n              charCode &= 0xff;\n            }\n\n            charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;\n          }\n        }\n\n        if (properties.glyphNames && (baseEncoding.length || this.differences.length)) {\n          for (let i = 0; i < 256; ++i) {\n            if (charCodeToGlyphId[i] !== undefined) {\n              continue;\n            }\n\n            glyphName = this.differences[i] || baseEncoding[i];\n\n            if (!glyphName) {\n              continue;\n            }\n\n            const glyphId = properties.glyphNames.indexOf(glyphName);\n\n            if (glyphId > 0 && hasGlyph(glyphId)) {\n              charCodeToGlyphId[i] = glyphId;\n            }\n          }\n        }\n      }\n\n      if (charCodeToGlyphId.length === 0) {\n        charCodeToGlyphId[0] = 0;\n      }\n\n      let glyphZeroId = numGlyphsOut - 1;\n\n      if (!dupFirstEntry) {\n        glyphZeroId = 0;\n      }\n\n      var newMapping = adjustMapping(charCodeToGlyphId, hasGlyph, glyphZeroId);\n      this.toFontChar = newMapping.toFontChar;\n      tables.cmap = {\n        tag: \"cmap\",\n        data: createCmapTable(newMapping.charCodeToGlyphId, numGlyphsOut)\n      };\n\n      if (!tables[\"OS/2\"] || !validateOS2Table(tables[\"OS/2\"], font)) {\n        tables[\"OS/2\"] = {\n          tag: \"OS/2\",\n          data: createOS2Table(properties, newMapping.charCodeToGlyphId, metricsOverride)\n        };\n      }\n\n      if (!isTrueType) {\n        try {\n          cffFile = new _stream.Stream(tables[\"CFF \"].data);\n          var parser = new _cff_parser.CFFParser(cffFile, properties, SEAC_ANALYSIS_ENABLED);\n          cff = parser.parse();\n          cff.duplicateFirstGlyph();\n          var compiler = new _cff_parser.CFFCompiler(cff);\n          tables[\"CFF \"].data = compiler.compile();\n        } catch (e) {\n          (0, _util.warn)(\"Failed to compile font \" + properties.loadedName);\n        }\n      }\n\n      if (!tables.name) {\n        tables.name = {\n          tag: \"name\",\n          data: createNameTable(this.name)\n        };\n      } else {\n        var namePrototype = readNameTable(tables.name);\n        tables.name.data = createNameTable(name, namePrototype);\n      }\n\n      var builder = new OpenTypeFileBuilder(header.version);\n\n      for (var tableTag in tables) {\n        builder.addTable(tableTag, tables[tableTag].data);\n      }\n\n      return builder.toArray();\n    },\n    convert: function Font_convert(fontName, font, properties) {\n      properties.fixedPitch = false;\n\n      if (properties.builtInEncoding) {\n        adjustToUnicode(properties, properties.builtInEncoding);\n      }\n\n      let glyphZeroId = 1;\n\n      if (font instanceof CFFFont) {\n        glyphZeroId = font.numGlyphs - 1;\n      }\n\n      var mapping = font.getGlyphMapping(properties);\n      var newMapping = adjustMapping(mapping, font.hasGlyphId.bind(font), glyphZeroId);\n      this.toFontChar = newMapping.toFontChar;\n      var numGlyphs = font.numGlyphs;\n\n      function getCharCodes(charCodeToGlyphId, glyphId) {\n        var charCodes = null;\n\n        for (var charCode in charCodeToGlyphId) {\n          if (glyphId === charCodeToGlyphId[charCode]) {\n            if (!charCodes) {\n              charCodes = [];\n            }\n\n            charCodes.push(charCode | 0);\n          }\n        }\n\n        return charCodes;\n      }\n\n      function createCharCode(charCodeToGlyphId, glyphId) {\n        for (var charCode in charCodeToGlyphId) {\n          if (glyphId === charCodeToGlyphId[charCode]) {\n            return charCode | 0;\n          }\n        }\n\n        newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = glyphId;\n        return newMapping.nextAvailableFontCharCode++;\n      }\n\n      var seacs = font.seacs;\n\n      if (SEAC_ANALYSIS_ENABLED && seacs && seacs.length) {\n        var matrix = properties.fontMatrix || _util.FONT_IDENTITY_MATRIX;\n        var charset = font.getCharset();\n        var seacMap = Object.create(null);\n\n        for (var glyphId in seacs) {\n          glyphId |= 0;\n          var seac = seacs[glyphId];\n          var baseGlyphName = _encodings.StandardEncoding[seac[2]];\n          var accentGlyphName = _encodings.StandardEncoding[seac[3]];\n          var baseGlyphId = charset.indexOf(baseGlyphName);\n          var accentGlyphId = charset.indexOf(accentGlyphName);\n\n          if (baseGlyphId < 0 || accentGlyphId < 0) {\n            continue;\n          }\n\n          var accentOffset = {\n            x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4],\n            y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5]\n          };\n          var charCodes = getCharCodes(mapping, glyphId);\n\n          if (!charCodes) {\n            continue;\n          }\n\n          for (let i = 0, ii = charCodes.length; i < ii; i++) {\n            var charCode = charCodes[i];\n            var charCodeToGlyphId = newMapping.charCodeToGlyphId;\n            var baseFontCharCode = createCharCode(charCodeToGlyphId, baseGlyphId);\n            var accentFontCharCode = createCharCode(charCodeToGlyphId, accentGlyphId);\n            seacMap[charCode] = {\n              baseFontCharCode,\n              accentFontCharCode,\n              accentOffset\n            };\n          }\n        }\n\n        properties.seacMap = seacMap;\n      }\n\n      var unitsPerEm = 1 / (properties.fontMatrix || _util.FONT_IDENTITY_MATRIX)[0];\n      var builder = new OpenTypeFileBuilder(\"\\x4F\\x54\\x54\\x4F\");\n      builder.addTable(\"CFF \", font.data);\n      builder.addTable(\"OS/2\", createOS2Table(properties, newMapping.charCodeToGlyphId));\n      builder.addTable(\"cmap\", createCmapTable(newMapping.charCodeToGlyphId, numGlyphs));\n      builder.addTable(\"head\", \"\\x00\\x01\\x00\\x00\" + \"\\x00\\x00\\x10\\x00\" + \"\\x00\\x00\\x00\\x00\" + \"\\x5F\\x0F\\x3C\\xF5\" + \"\\x00\\x00\" + safeString16(unitsPerEm) + \"\\x00\\x00\\x00\\x00\\x9e\\x0b\\x7e\\x27\" + \"\\x00\\x00\\x00\\x00\\x9e\\x0b\\x7e\\x27\" + \"\\x00\\x00\" + safeString16(properties.descent) + \"\\x0F\\xFF\" + safeString16(properties.ascent) + string16(properties.italicAngle ? 2 : 0) + \"\\x00\\x11\" + \"\\x00\\x00\" + \"\\x00\\x00\" + \"\\x00\\x00\");\n      builder.addTable(\"hhea\", \"\\x00\\x01\\x00\\x00\" + safeString16(properties.ascent) + safeString16(properties.descent) + \"\\x00\\x00\" + \"\\xFF\\xFF\" + \"\\x00\\x00\" + \"\\x00\\x00\" + \"\\x00\\x00\" + safeString16(properties.capHeight) + safeString16(Math.tan(properties.italicAngle) * properties.xHeight) + \"\\x00\\x00\" + \"\\x00\\x00\" + \"\\x00\\x00\" + \"\\x00\\x00\" + \"\\x00\\x00\" + \"\\x00\\x00\" + string16(numGlyphs));\n      builder.addTable(\"hmtx\", function fontFieldsHmtx() {\n        var charstrings = font.charstrings;\n        var cffWidths = font.cff ? font.cff.widths : null;\n        var hmtx = \"\\x00\\x00\\x00\\x00\";\n\n        for (let i = 1, ii = numGlyphs; i < ii; i++) {\n          var width = 0;\n\n          if (charstrings) {\n            var charstring = charstrings[i - 1];\n            width = \"width\" in charstring ? charstring.width : 0;\n          } else if (cffWidths) {\n            width = Math.ceil(cffWidths[i] || 0);\n          }\n\n          hmtx += string16(width) + string16(0);\n        }\n\n        return hmtx;\n      }());\n      builder.addTable(\"maxp\", \"\\x00\\x00\\x50\\x00\" + string16(numGlyphs));\n      builder.addTable(\"name\", createNameTable(fontName));\n      builder.addTable(\"post\", createPostTable(properties));\n      return builder.toArray();\n    },\n\n    get spaceWidth() {\n      var possibleSpaceReplacements = [\"space\", \"minus\", \"one\", \"i\", \"I\"];\n      var width;\n\n      for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) {\n        var glyphName = possibleSpaceReplacements[i];\n\n        if (glyphName in this.widths) {\n          width = this.widths[glyphName];\n          break;\n        }\n\n        var glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();\n        var glyphUnicode = glyphsUnicodeMap[glyphName];\n        var charcode = 0;\n\n        if (this.composite && this.cMap.contains(glyphUnicode)) {\n          charcode = this.cMap.lookup(glyphUnicode);\n        }\n\n        if (!charcode && this.toUnicode) {\n          charcode = this.toUnicode.charCodeOf(glyphUnicode);\n        }\n\n        if (charcode <= 0) {\n          charcode = glyphUnicode;\n        }\n\n        width = this.widths[charcode];\n\n        if (width) {\n          break;\n        }\n      }\n\n      width = width || this.defaultWidth;\n      return (0, _util.shadow)(this, \"spaceWidth\", width);\n    },\n\n    _charToGlyph(charcode, isSpace = false) {\n      var fontCharCode, width, operatorListId;\n      var widthCode = charcode;\n\n      if (this.cMap && this.cMap.contains(charcode)) {\n        widthCode = this.cMap.lookup(charcode);\n      }\n\n      width = this.widths[widthCode];\n      width = (0, _util.isNum)(width) ? width : this.defaultWidth;\n      var vmetric = this.vmetrics && this.vmetrics[widthCode];\n      let unicode = this.toUnicode.get(charcode) || this.fallbackToUnicode.get(charcode) || charcode;\n\n      if (typeof unicode === \"number\") {\n        unicode = String.fromCharCode(unicode);\n      }\n\n      var isInFont = (charcode in this.toFontChar);\n      fontCharCode = this.toFontChar[charcode] || charcode;\n\n      if (this.missingFile) {\n        const glyphName = this.differences[charcode] || this.defaultEncoding[charcode];\n\n        if ((glyphName === \".notdef\" || glyphName === \"\") && this.type === \"Type1\") {\n          fontCharCode = 0x20;\n        }\n\n        fontCharCode = (0, _unicode.mapSpecialUnicodeValues)(fontCharCode);\n      }\n\n      if (this.isType3Font) {\n        operatorListId = fontCharCode;\n      }\n\n      var accent = null;\n\n      if (this.seacMap && this.seacMap[charcode]) {\n        isInFont = true;\n        var seac = this.seacMap[charcode];\n        fontCharCode = seac.baseFontCharCode;\n        accent = {\n          fontChar: String.fromCodePoint(seac.accentFontCharCode),\n          offset: seac.accentOffset\n        };\n      }\n\n      let fontChar = \"\";\n\n      if (typeof fontCharCode === \"number\") {\n        if (fontCharCode <= 0x10ffff) {\n          fontChar = String.fromCodePoint(fontCharCode);\n        } else {\n          (0, _util.warn)(`charToGlyph - invalid fontCharCode: ${fontCharCode}`);\n        }\n      }\n\n      var glyph = this.glyphCache[charcode];\n\n      if (!glyph || !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont)) {\n        glyph = new Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont);\n        this.glyphCache[charcode] = glyph;\n      }\n\n      return glyph;\n    },\n\n    charsToGlyphs: function Font_charsToGlyphs(chars) {\n      var charsCache = this.charsCache;\n      var glyphs, glyph, charcode;\n\n      if (charsCache) {\n        glyphs = charsCache[chars];\n\n        if (glyphs) {\n          return glyphs;\n        }\n      }\n\n      if (!charsCache) {\n        charsCache = this.charsCache = Object.create(null);\n      }\n\n      glyphs = [];\n      var charsCacheKey = chars;\n      var i = 0,\n          ii;\n\n      if (this.cMap) {\n        var c = Object.create(null);\n\n        while (i < chars.length) {\n          this.cMap.readCharCode(chars, i, c);\n          charcode = c.charcode;\n          var length = c.length;\n          i += length;\n          var isSpace = length === 1 && chars.charCodeAt(i - 1) === 0x20;\n          glyph = this._charToGlyph(charcode, isSpace);\n          glyphs.push(glyph);\n        }\n      } else {\n        for (i = 0, ii = chars.length; i < ii; ++i) {\n          charcode = chars.charCodeAt(i);\n          glyph = this._charToGlyph(charcode, charcode === 0x20);\n          glyphs.push(glyph);\n        }\n      }\n\n      return charsCache[charsCacheKey] = glyphs;\n    },\n\n    getCharPositions(chars) {\n      const positions = [];\n\n      if (this.cMap) {\n        const c = Object.create(null);\n        let i = 0;\n\n        while (i < chars.length) {\n          this.cMap.readCharCode(chars, i, c);\n          const length = c.length;\n          positions.push([i, i + length]);\n          i += length;\n        }\n      } else {\n        for (let i = 0, ii = chars.length; i < ii; ++i) {\n          positions.push([i, i + 1]);\n        }\n      }\n\n      return positions;\n    },\n\n    get glyphCacheValues() {\n      return Object.values(this.glyphCache);\n    },\n\n    encodeString(str) {\n      const buffers = [];\n      const currentBuf = [];\n\n      const hasCurrentBufErrors = () => buffers.length % 2 === 1;\n\n      for (let i = 0, ii = str.length; i < ii; i++) {\n        const unicode = str.codePointAt(i);\n\n        if (unicode > 0xd7ff && (unicode < 0xe000 || unicode > 0xfffd)) {\n          i++;\n        }\n\n        if (this.toUnicode) {\n          const char = String.fromCodePoint(unicode);\n          const charCode = this.toUnicode.charCodeOf(char);\n\n          if (charCode !== -1) {\n            if (hasCurrentBufErrors()) {\n              buffers.push(currentBuf.join(\"\"));\n              currentBuf.length = 0;\n            }\n\n            const charCodeLength = this.cMap ? this.cMap.getCharCodeLength(charCode) : 1;\n\n            for (let j = charCodeLength - 1; j >= 0; j--) {\n              currentBuf.push(String.fromCharCode(charCode >> 8 * j & 0xff));\n            }\n\n            continue;\n          }\n        }\n\n        if (!hasCurrentBufErrors()) {\n          buffers.push(currentBuf.join(\"\"));\n          currentBuf.length = 0;\n        }\n\n        currentBuf.push(String.fromCodePoint(unicode));\n      }\n\n      buffers.push(currentBuf.join(\"\"));\n      return buffers;\n    }\n\n  };\n  return Font;\n}();\n\nexports.Font = Font;\n\nvar ErrorFont = function ErrorFontClosure() {\n  function ErrorFont(error) {\n    this.error = error;\n    this.loadedName = \"g_font_error\";\n    this.missingFile = true;\n  }\n\n  ErrorFont.prototype = {\n    charsToGlyphs: function ErrorFont_charsToGlyphs() {\n      return [];\n    },\n    encodeString: function ErrorFont_encodeString(chars) {\n      return [chars];\n    },\n\n    exportData(extraProperties = false) {\n      return {\n        error: this.error\n      };\n    }\n\n  };\n  return ErrorFont;\n}();\n\nexports.ErrorFont = ErrorFont;\n\nfunction type1FontGlyphMapping(properties, builtInEncoding, glyphNames) {\n  var charCodeToGlyphId = Object.create(null);\n  var glyphId, charCode, baseEncoding;\n  var isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);\n\n  if (properties.baseEncodingName) {\n    baseEncoding = (0, _encodings.getEncoding)(properties.baseEncodingName);\n\n    for (charCode = 0; charCode < baseEncoding.length; charCode++) {\n      glyphId = glyphNames.indexOf(baseEncoding[charCode]);\n\n      if (glyphId >= 0) {\n        charCodeToGlyphId[charCode] = glyphId;\n      } else {\n        charCodeToGlyphId[charCode] = 0;\n      }\n    }\n  } else if (isSymbolicFont) {\n    for (charCode in builtInEncoding) {\n      charCodeToGlyphId[charCode] = builtInEncoding[charCode];\n    }\n  } else {\n    baseEncoding = _encodings.StandardEncoding;\n\n    for (charCode = 0; charCode < baseEncoding.length; charCode++) {\n      glyphId = glyphNames.indexOf(baseEncoding[charCode]);\n\n      if (glyphId >= 0) {\n        charCodeToGlyphId[charCode] = glyphId;\n      } else {\n        charCodeToGlyphId[charCode] = 0;\n      }\n    }\n  }\n\n  var differences = properties.differences,\n      glyphsUnicodeMap;\n\n  if (differences) {\n    for (charCode in differences) {\n      var glyphName = differences[charCode];\n      glyphId = glyphNames.indexOf(glyphName);\n\n      if (glyphId === -1) {\n        if (!glyphsUnicodeMap) {\n          glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();\n        }\n\n        var standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap);\n\n        if (standardGlyphName !== glyphName) {\n          glyphId = glyphNames.indexOf(standardGlyphName);\n        }\n      }\n\n      if (glyphId >= 0) {\n        charCodeToGlyphId[charCode] = glyphId;\n      } else {\n        charCodeToGlyphId[charCode] = 0;\n      }\n    }\n  }\n\n  return charCodeToGlyphId;\n}\n\nvar Type1Font = function Type1FontClosure() {\n  function findBlock(streamBytes, signature, startIndex) {\n    var streamBytesLength = streamBytes.length;\n    var signatureLength = signature.length;\n    var scanLength = streamBytesLength - signatureLength;\n    var i = startIndex,\n        j,\n        found = false;\n\n    while (i < scanLength) {\n      j = 0;\n\n      while (j < signatureLength && streamBytes[i + j] === signature[j]) {\n        j++;\n      }\n\n      if (j >= signatureLength) {\n        i += j;\n\n        while (i < streamBytesLength && (0, _core_utils.isWhiteSpace)(streamBytes[i])) {\n          i++;\n        }\n\n        found = true;\n        break;\n      }\n\n      i++;\n    }\n\n    return {\n      found,\n      length: i\n    };\n  }\n\n  function getHeaderBlock(stream, suggestedLength) {\n    var EEXEC_SIGNATURE = [0x65, 0x65, 0x78, 0x65, 0x63];\n    var streamStartPos = stream.pos;\n    var headerBytes, headerBytesLength, block;\n\n    try {\n      headerBytes = stream.getBytes(suggestedLength);\n      headerBytesLength = headerBytes.length;\n    } catch (ex) {\n      if (ex instanceof _core_utils.MissingDataException) {\n        throw ex;\n      }\n    }\n\n    if (headerBytesLength === suggestedLength) {\n      block = findBlock(headerBytes, EEXEC_SIGNATURE, suggestedLength - 2 * EEXEC_SIGNATURE.length);\n\n      if (block.found && block.length === suggestedLength) {\n        return {\n          stream: new _stream.Stream(headerBytes),\n          length: suggestedLength\n        };\n      }\n    }\n\n    (0, _util.warn)('Invalid \"Length1\" property in Type1 font -- trying to recover.');\n    stream.pos = streamStartPos;\n    var SCAN_BLOCK_LENGTH = 2048;\n    var actualLength;\n\n    while (true) {\n      var scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH);\n      block = findBlock(scanBytes, EEXEC_SIGNATURE, 0);\n\n      if (block.length === 0) {\n        break;\n      }\n\n      stream.pos += block.length;\n\n      if (block.found) {\n        actualLength = stream.pos - streamStartPos;\n        break;\n      }\n    }\n\n    stream.pos = streamStartPos;\n\n    if (actualLength) {\n      return {\n        stream: new _stream.Stream(stream.getBytes(actualLength)),\n        length: actualLength\n      };\n    }\n\n    (0, _util.warn)('Unable to recover \"Length1\" property in Type1 font -- using as is.');\n    return {\n      stream: new _stream.Stream(stream.getBytes(suggestedLength)),\n      length: suggestedLength\n    };\n  }\n\n  function getEexecBlock(stream, suggestedLength) {\n    var eexecBytes = stream.getBytes();\n    return {\n      stream: new _stream.Stream(eexecBytes),\n      length: eexecBytes.length\n    };\n  }\n\n  function Type1Font(name, file, properties) {\n    var PFB_HEADER_SIZE = 6;\n    var headerBlockLength = properties.length1;\n    var eexecBlockLength = properties.length2;\n    var pfbHeader = file.peekBytes(PFB_HEADER_SIZE);\n    var pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01;\n\n    if (pfbHeaderPresent) {\n      file.skip(PFB_HEADER_SIZE);\n      headerBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2];\n    }\n\n    var headerBlock = getHeaderBlock(file, headerBlockLength);\n    var headerBlockParser = new _type1_parser.Type1Parser(headerBlock.stream, false, SEAC_ANALYSIS_ENABLED);\n    headerBlockParser.extractFontHeader(properties);\n\n    if (pfbHeaderPresent) {\n      pfbHeader = file.getBytes(PFB_HEADER_SIZE);\n      eexecBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2];\n    }\n\n    var eexecBlock = getEexecBlock(file, eexecBlockLength);\n    var eexecBlockParser = new _type1_parser.Type1Parser(eexecBlock.stream, true, SEAC_ANALYSIS_ENABLED);\n    var data = eexecBlockParser.extractFontProgram(properties);\n\n    for (const key in data.properties) {\n      properties[key] = data.properties[key];\n    }\n\n    var charstrings = data.charstrings;\n    var type2Charstrings = this.getType2Charstrings(charstrings);\n    var subrs = this.getType2Subrs(data.subrs);\n    this.charstrings = charstrings;\n    this.data = this.wrap(name, type2Charstrings, this.charstrings, subrs, properties);\n    this.seacs = this.getSeacs(data.charstrings);\n  }\n\n  Type1Font.prototype = {\n    get numGlyphs() {\n      return this.charstrings.length + 1;\n    },\n\n    getCharset: function Type1Font_getCharset() {\n      var charset = [\".notdef\"];\n      var charstrings = this.charstrings;\n\n      for (var glyphId = 0; glyphId < charstrings.length; glyphId++) {\n        charset.push(charstrings[glyphId].glyphName);\n      }\n\n      return charset;\n    },\n    getGlyphMapping: function Type1Font_getGlyphMapping(properties) {\n      var charstrings = this.charstrings;\n\n      if (properties.composite) {\n        const charCodeToGlyphId = Object.create(null);\n\n        for (let glyphId = 0, charstringsLen = charstrings.length; glyphId < charstringsLen; glyphId++) {\n          const charCode = properties.cMap.charCodeOf(glyphId);\n          charCodeToGlyphId[charCode] = glyphId + 1;\n        }\n\n        return charCodeToGlyphId;\n      }\n\n      var glyphNames = [\".notdef\"],\n          glyphId;\n\n      for (glyphId = 0; glyphId < charstrings.length; glyphId++) {\n        glyphNames.push(charstrings[glyphId].glyphName);\n      }\n\n      var encoding = properties.builtInEncoding;\n\n      if (encoding) {\n        var builtInEncoding = Object.create(null);\n\n        for (var charCode in encoding) {\n          glyphId = glyphNames.indexOf(encoding[charCode]);\n\n          if (glyphId >= 0) {\n            builtInEncoding[charCode] = glyphId;\n          }\n        }\n      }\n\n      return type1FontGlyphMapping(properties, builtInEncoding, glyphNames);\n    },\n    hasGlyphId: function Type1Font_hasGlyphID(id) {\n      if (id < 0 || id >= this.numGlyphs) {\n        return false;\n      }\n\n      if (id === 0) {\n        return true;\n      }\n\n      var glyph = this.charstrings[id - 1];\n      return glyph.charstring.length > 0;\n    },\n    getSeacs: function Type1Font_getSeacs(charstrings) {\n      var i, ii;\n      var seacMap = [];\n\n      for (i = 0, ii = charstrings.length; i < ii; i++) {\n        var charstring = charstrings[i];\n\n        if (charstring.seac) {\n          seacMap[i + 1] = charstring.seac;\n        }\n      }\n\n      return seacMap;\n    },\n    getType2Charstrings: function Type1Font_getType2Charstrings(type1Charstrings) {\n      var type2Charstrings = [];\n\n      for (var i = 0, ii = type1Charstrings.length; i < ii; i++) {\n        type2Charstrings.push(type1Charstrings[i].charstring);\n      }\n\n      return type2Charstrings;\n    },\n    getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) {\n      var bias = 0;\n      var count = type1Subrs.length;\n\n      if (count < 1133) {\n        bias = 107;\n      } else if (count < 33769) {\n        bias = 1131;\n      } else {\n        bias = 32768;\n      }\n\n      var type2Subrs = [];\n      var i;\n\n      for (i = 0; i < bias; i++) {\n        type2Subrs.push([0x0b]);\n      }\n\n      for (i = 0; i < count; i++) {\n        type2Subrs.push(type1Subrs[i]);\n      }\n\n      return type2Subrs;\n    },\n    wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) {\n      var cff = new _cff_parser.CFF();\n      cff.header = new _cff_parser.CFFHeader(1, 0, 4, 4);\n      cff.names = [name];\n      var topDict = new _cff_parser.CFFTopDict();\n      topDict.setByName(\"version\", 391);\n      topDict.setByName(\"Notice\", 392);\n      topDict.setByName(\"FullName\", 393);\n      topDict.setByName(\"FamilyName\", 394);\n      topDict.setByName(\"Weight\", 395);\n      topDict.setByName(\"Encoding\", null);\n      topDict.setByName(\"FontMatrix\", properties.fontMatrix);\n      topDict.setByName(\"FontBBox\", properties.bbox);\n      topDict.setByName(\"charset\", null);\n      topDict.setByName(\"CharStrings\", null);\n      topDict.setByName(\"Private\", null);\n      cff.topDict = topDict;\n      var strings = new _cff_parser.CFFStrings();\n      strings.add(\"Version 0.11\");\n      strings.add(\"See original notice\");\n      strings.add(name);\n      strings.add(name);\n      strings.add(\"Medium\");\n      cff.strings = strings;\n      cff.globalSubrIndex = new _cff_parser.CFFIndex();\n      var count = glyphs.length;\n      var charsetArray = [\".notdef\"];\n      var i, ii;\n\n      for (i = 0; i < count; i++) {\n        const glyphName = charstrings[i].glyphName;\n\n        const index = _cff_parser.CFFStandardStrings.indexOf(glyphName);\n\n        if (index === -1) {\n          strings.add(glyphName);\n        }\n\n        charsetArray.push(glyphName);\n      }\n\n      cff.charset = new _cff_parser.CFFCharset(false, 0, charsetArray);\n      var charStringsIndex = new _cff_parser.CFFIndex();\n      charStringsIndex.add([0x8b, 0x0e]);\n\n      for (i = 0; i < count; i++) {\n        charStringsIndex.add(glyphs[i]);\n      }\n\n      cff.charStrings = charStringsIndex;\n      var privateDict = new _cff_parser.CFFPrivateDict();\n      privateDict.setByName(\"Subrs\", null);\n      var fields = [\"BlueValues\", \"OtherBlues\", \"FamilyBlues\", \"FamilyOtherBlues\", \"StemSnapH\", \"StemSnapV\", \"BlueShift\", \"BlueFuzz\", \"BlueScale\", \"LanguageGroup\", \"ExpansionFactor\", \"ForceBold\", \"StdHW\", \"StdVW\"];\n\n      for (i = 0, ii = fields.length; i < ii; i++) {\n        var field = fields[i];\n\n        if (!(field in properties.privateData)) {\n          continue;\n        }\n\n        var value = properties.privateData[field];\n\n        if (Array.isArray(value)) {\n          for (var j = value.length - 1; j > 0; j--) {\n            value[j] -= value[j - 1];\n          }\n        }\n\n        privateDict.setByName(field, value);\n      }\n\n      cff.topDict.privateDict = privateDict;\n      var subrIndex = new _cff_parser.CFFIndex();\n\n      for (i = 0, ii = subrs.length; i < ii; i++) {\n        subrIndex.add(subrs[i]);\n      }\n\n      privateDict.subrsIndex = subrIndex;\n      var compiler = new _cff_parser.CFFCompiler(cff);\n      return compiler.compile();\n    }\n  };\n  return Type1Font;\n}();\n\nvar CFFFont = function CFFFontClosure() {\n  function CFFFont(file, properties) {\n    this.properties = properties;\n    var parser = new _cff_parser.CFFParser(file, properties, SEAC_ANALYSIS_ENABLED);\n    this.cff = parser.parse();\n    this.cff.duplicateFirstGlyph();\n    var compiler = new _cff_parser.CFFCompiler(this.cff);\n    this.seacs = this.cff.seacs;\n\n    try {\n      this.data = compiler.compile();\n    } catch (e) {\n      (0, _util.warn)(\"Failed to compile font \" + properties.loadedName);\n      this.data = file;\n    }\n  }\n\n  CFFFont.prototype = {\n    get numGlyphs() {\n      return this.cff.charStrings.count;\n    },\n\n    getCharset: function CFFFont_getCharset() {\n      return this.cff.charset.charset;\n    },\n    getGlyphMapping: function CFFFont_getGlyphMapping() {\n      var cff = this.cff;\n      var properties = this.properties;\n      var charsets = cff.charset.charset;\n      var charCodeToGlyphId;\n      var glyphId;\n\n      if (properties.composite) {\n        charCodeToGlyphId = Object.create(null);\n        let charCode;\n\n        if (cff.isCIDFont) {\n          for (glyphId = 0; glyphId < charsets.length; glyphId++) {\n            var cid = charsets[glyphId];\n            charCode = properties.cMap.charCodeOf(cid);\n            charCodeToGlyphId[charCode] = glyphId;\n          }\n        } else {\n          for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) {\n            charCode = properties.cMap.charCodeOf(glyphId);\n            charCodeToGlyphId[charCode] = glyphId;\n          }\n        }\n\n        return charCodeToGlyphId;\n      }\n\n      var encoding = cff.encoding ? cff.encoding.encoding : null;\n      charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets);\n      return charCodeToGlyphId;\n    },\n    hasGlyphId: function CFFFont_hasGlyphID(id) {\n      return this.cff.hasGlyphId(id);\n    }\n  };\n  return CFFFont;\n}();\n\n/***/ }),\n/* 32 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.CFFTopDict = exports.CFFStrings = exports.CFFStandardStrings = exports.CFFPrivateDict = exports.CFFParser = exports.CFFIndex = exports.CFFHeader = exports.CFFFDSelect = exports.CFFCompiler = exports.CFFCharset = exports.CFF = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _charsets = __w_pdfjs_require__(33);\n\nvar _encodings = __w_pdfjs_require__(34);\n\nconst MAX_SUBR_NESTING = 10;\nconst CFFStandardStrings = [\".notdef\", \"space\", \"exclam\", \"quotedbl\", \"numbersign\", \"dollar\", \"percent\", \"ampersand\", \"quoteright\", \"parenleft\", \"parenright\", \"asterisk\", \"plus\", \"comma\", \"hyphen\", \"period\", \"slash\", \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"colon\", \"semicolon\", \"less\", \"equal\", \"greater\", \"question\", \"at\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\", \"bracketleft\", \"backslash\", \"bracketright\", \"asciicircum\", \"underscore\", \"quoteleft\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\", \"x\", \"y\", \"z\", \"braceleft\", \"bar\", \"braceright\", \"asciitilde\", \"exclamdown\", \"cent\", \"sterling\", \"fraction\", \"yen\", \"florin\", \"section\", \"currency\", \"quotesingle\", \"quotedblleft\", \"guillemotleft\", \"guilsinglleft\", \"guilsinglright\", \"fi\", \"fl\", \"endash\", \"dagger\", \"daggerdbl\", \"periodcentered\", \"paragraph\", \"bullet\", \"quotesinglbase\", \"quotedblbase\", \"quotedblright\", \"guillemotright\", \"ellipsis\", \"perthousand\", \"questiondown\", \"grave\", \"acute\", \"circumflex\", \"tilde\", \"macron\", \"breve\", \"dotaccent\", \"dieresis\", \"ring\", \"cedilla\", \"hungarumlaut\", \"ogonek\", \"caron\", \"emdash\", \"AE\", \"ordfeminine\", \"Lslash\", \"Oslash\", \"OE\", \"ordmasculine\", \"ae\", \"dotlessi\", \"lslash\", \"oslash\", \"oe\", \"germandbls\", \"onesuperior\", \"logicalnot\", \"mu\", \"trademark\", \"Eth\", \"onehalf\", \"plusminus\", \"Thorn\", \"onequarter\", \"divide\", \"brokenbar\", \"degree\", \"thorn\", \"threequarters\", \"twosuperior\", \"registered\", \"minus\", \"eth\", \"multiply\", \"threesuperior\", \"copyright\", \"Aacute\", \"Acircumflex\", \"Adieresis\", \"Agrave\", \"Aring\", \"Atilde\", \"Ccedilla\", \"Eacute\", \"Ecircumflex\", \"Edieresis\", \"Egrave\", \"Iacute\", \"Icircumflex\", \"Idieresis\", \"Igrave\", \"Ntilde\", \"Oacute\", \"Ocircumflex\", \"Odieresis\", \"Ograve\", \"Otilde\", \"Scaron\", \"Uacute\", \"Ucircumflex\", \"Udieresis\", \"Ugrave\", \"Yacute\", \"Ydieresis\", \"Zcaron\", \"aacute\", \"acircumflex\", \"adieresis\", \"agrave\", \"aring\", \"atilde\", \"ccedilla\", \"eacute\", \"ecircumflex\", \"edieresis\", \"egrave\", \"iacute\", \"icircumflex\", \"idieresis\", \"igrave\", \"ntilde\", \"oacute\", \"ocircumflex\", \"odieresis\", \"ograve\", \"otilde\", \"scaron\", \"uacute\", \"ucircumflex\", \"udieresis\", \"ugrave\", \"yacute\", \"ydieresis\", \"zcaron\", \"exclamsmall\", \"Hungarumlautsmall\", \"dollaroldstyle\", \"dollarsuperior\", \"ampersandsmall\", \"Acutesmall\", \"parenleftsuperior\", \"parenrightsuperior\", \"twodotenleader\", \"onedotenleader\", \"zerooldstyle\", \"oneoldstyle\", \"twooldstyle\", \"threeoldstyle\", \"fouroldstyle\", \"fiveoldstyle\", \"sixoldstyle\", \"sevenoldstyle\", \"eightoldstyle\", \"nineoldstyle\", \"commasuperior\", \"threequartersemdash\", \"periodsuperior\", \"questionsmall\", \"asuperior\", \"bsuperior\", \"centsuperior\", \"dsuperior\", \"esuperior\", \"isuperior\", \"lsuperior\", \"msuperior\", \"nsuperior\", \"osuperior\", \"rsuperior\", \"ssuperior\", \"tsuperior\", \"ff\", \"ffi\", \"ffl\", \"parenleftinferior\", \"parenrightinferior\", \"Circumflexsmall\", \"hyphensuperior\", \"Gravesmall\", \"Asmall\", \"Bsmall\", \"Csmall\", \"Dsmall\", \"Esmall\", \"Fsmall\", \"Gsmall\", \"Hsmall\", \"Ismall\", \"Jsmall\", \"Ksmall\", \"Lsmall\", \"Msmall\", \"Nsmall\", \"Osmall\", \"Psmall\", \"Qsmall\", \"Rsmall\", \"Ssmall\", \"Tsmall\", \"Usmall\", \"Vsmall\", \"Wsmall\", \"Xsmall\", \"Ysmall\", \"Zsmall\", \"colonmonetary\", \"onefitted\", \"rupiah\", \"Tildesmall\", \"exclamdownsmall\", \"centoldstyle\", \"Lslashsmall\", \"Scaronsmall\", \"Zcaronsmall\", \"Dieresissmall\", \"Brevesmall\", \"Caronsmall\", \"Dotaccentsmall\", \"Macronsmall\", \"figuredash\", \"hypheninferior\", \"Ogoneksmall\", \"Ringsmall\", \"Cedillasmall\", \"questiondownsmall\", \"oneeighth\", \"threeeighths\", \"fiveeighths\", \"seveneighths\", \"onethird\", \"twothirds\", \"zerosuperior\", \"foursuperior\", \"fivesuperior\", \"sixsuperior\", \"sevensuperior\", \"eightsuperior\", \"ninesuperior\", \"zeroinferior\", \"oneinferior\", \"twoinferior\", \"threeinferior\", \"fourinferior\", \"fiveinferior\", \"sixinferior\", \"seveninferior\", \"eightinferior\", \"nineinferior\", \"centinferior\", \"dollarinferior\", \"periodinferior\", \"commainferior\", \"Agravesmall\", \"Aacutesmall\", \"Acircumflexsmall\", \"Atildesmall\", \"Adieresissmall\", \"Aringsmall\", \"AEsmall\", \"Ccedillasmall\", \"Egravesmall\", \"Eacutesmall\", \"Ecircumflexsmall\", \"Edieresissmall\", \"Igravesmall\", \"Iacutesmall\", \"Icircumflexsmall\", \"Idieresissmall\", \"Ethsmall\", \"Ntildesmall\", \"Ogravesmall\", \"Oacutesmall\", \"Ocircumflexsmall\", \"Otildesmall\", \"Odieresissmall\", \"OEsmall\", \"Oslashsmall\", \"Ugravesmall\", \"Uacutesmall\", \"Ucircumflexsmall\", \"Udieresissmall\", \"Yacutesmall\", \"Thornsmall\", \"Ydieresissmall\", \"001.000\", \"001.001\", \"001.002\", \"001.003\", \"Black\", \"Bold\", \"Book\", \"Light\", \"Medium\", \"Regular\", \"Roman\", \"Semibold\"];\nexports.CFFStandardStrings = CFFStandardStrings;\nconst NUM_STANDARD_CFF_STRINGS = 391;\n\nconst CFFParser = function CFFParserClosure() {\n  const CharstringValidationData = [null, {\n    id: \"hstem\",\n    min: 2,\n    stackClearing: true,\n    stem: true\n  }, null, {\n    id: \"vstem\",\n    min: 2,\n    stackClearing: true,\n    stem: true\n  }, {\n    id: \"vmoveto\",\n    min: 1,\n    stackClearing: true\n  }, {\n    id: \"rlineto\",\n    min: 2,\n    resetStack: true\n  }, {\n    id: \"hlineto\",\n    min: 1,\n    resetStack: true\n  }, {\n    id: \"vlineto\",\n    min: 1,\n    resetStack: true\n  }, {\n    id: \"rrcurveto\",\n    min: 6,\n    resetStack: true\n  }, null, {\n    id: \"callsubr\",\n    min: 1,\n    undefStack: true\n  }, {\n    id: \"return\",\n    min: 0,\n    undefStack: true\n  }, null, null, {\n    id: \"endchar\",\n    min: 0,\n    stackClearing: true\n  }, null, null, null, {\n    id: \"hstemhm\",\n    min: 2,\n    stackClearing: true,\n    stem: true\n  }, {\n    id: \"hintmask\",\n    min: 0,\n    stackClearing: true\n  }, {\n    id: \"cntrmask\",\n    min: 0,\n    stackClearing: true\n  }, {\n    id: \"rmoveto\",\n    min: 2,\n    stackClearing: true\n  }, {\n    id: \"hmoveto\",\n    min: 1,\n    stackClearing: true\n  }, {\n    id: \"vstemhm\",\n    min: 2,\n    stackClearing: true,\n    stem: true\n  }, {\n    id: \"rcurveline\",\n    min: 8,\n    resetStack: true\n  }, {\n    id: \"rlinecurve\",\n    min: 8,\n    resetStack: true\n  }, {\n    id: \"vvcurveto\",\n    min: 4,\n    resetStack: true\n  }, {\n    id: \"hhcurveto\",\n    min: 4,\n    resetStack: true\n  }, null, {\n    id: \"callgsubr\",\n    min: 1,\n    undefStack: true\n  }, {\n    id: \"vhcurveto\",\n    min: 4,\n    resetStack: true\n  }, {\n    id: \"hvcurveto\",\n    min: 4,\n    resetStack: true\n  }];\n  const CharstringValidationData12 = [null, null, null, {\n    id: \"and\",\n    min: 2,\n    stackDelta: -1\n  }, {\n    id: \"or\",\n    min: 2,\n    stackDelta: -1\n  }, {\n    id: \"not\",\n    min: 1,\n    stackDelta: 0\n  }, null, null, null, {\n    id: \"abs\",\n    min: 1,\n    stackDelta: 0\n  }, {\n    id: \"add\",\n    min: 2,\n    stackDelta: -1,\n    stackFn: function stack_div(stack, index) {\n      stack[index - 2] = stack[index - 2] + stack[index - 1];\n    }\n  }, {\n    id: \"sub\",\n    min: 2,\n    stackDelta: -1,\n    stackFn: function stack_div(stack, index) {\n      stack[index - 2] = stack[index - 2] - stack[index - 1];\n    }\n  }, {\n    id: \"div\",\n    min: 2,\n    stackDelta: -1,\n    stackFn: function stack_div(stack, index) {\n      stack[index - 2] = stack[index - 2] / stack[index - 1];\n    }\n  }, null, {\n    id: \"neg\",\n    min: 1,\n    stackDelta: 0,\n    stackFn: function stack_div(stack, index) {\n      stack[index - 1] = -stack[index - 1];\n    }\n  }, {\n    id: \"eq\",\n    min: 2,\n    stackDelta: -1\n  }, null, null, {\n    id: \"drop\",\n    min: 1,\n    stackDelta: -1\n  }, null, {\n    id: \"put\",\n    min: 2,\n    stackDelta: -2\n  }, {\n    id: \"get\",\n    min: 1,\n    stackDelta: 0\n  }, {\n    id: \"ifelse\",\n    min: 4,\n    stackDelta: -3\n  }, {\n    id: \"random\",\n    min: 0,\n    stackDelta: 1\n  }, {\n    id: \"mul\",\n    min: 2,\n    stackDelta: -1,\n    stackFn: function stack_div(stack, index) {\n      stack[index - 2] = stack[index - 2] * stack[index - 1];\n    }\n  }, null, {\n    id: \"sqrt\",\n    min: 1,\n    stackDelta: 0\n  }, {\n    id: \"dup\",\n    min: 1,\n    stackDelta: 1\n  }, {\n    id: \"exch\",\n    min: 2,\n    stackDelta: 0\n  }, {\n    id: \"index\",\n    min: 2,\n    stackDelta: 0\n  }, {\n    id: \"roll\",\n    min: 3,\n    stackDelta: -2\n  }, null, null, null, {\n    id: \"hflex\",\n    min: 7,\n    resetStack: true\n  }, {\n    id: \"flex\",\n    min: 13,\n    resetStack: true\n  }, {\n    id: \"hflex1\",\n    min: 9,\n    resetStack: true\n  }, {\n    id: \"flex1\",\n    min: 11,\n    resetStack: true\n  }];\n\n  class CFFParser {\n    constructor(file, properties, seacAnalysisEnabled) {\n      this.bytes = file.getBytes();\n      this.properties = properties;\n      this.seacAnalysisEnabled = !!seacAnalysisEnabled;\n    }\n\n    parse() {\n      const properties = this.properties;\n      const cff = new CFF();\n      this.cff = cff;\n      const header = this.parseHeader();\n      const nameIndex = this.parseIndex(header.endPos);\n      const topDictIndex = this.parseIndex(nameIndex.endPos);\n      const stringIndex = this.parseIndex(topDictIndex.endPos);\n      const globalSubrIndex = this.parseIndex(stringIndex.endPos);\n      const topDictParsed = this.parseDict(topDictIndex.obj.get(0));\n      const topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);\n      cff.header = header.obj;\n      cff.names = this.parseNameIndex(nameIndex.obj);\n      cff.strings = this.parseStringIndex(stringIndex.obj);\n      cff.topDict = topDict;\n      cff.globalSubrIndex = globalSubrIndex.obj;\n      this.parsePrivateDict(cff.topDict);\n      cff.isCIDFont = topDict.hasName(\"ROS\");\n      const charStringOffset = topDict.getByName(\"CharStrings\");\n      const charStringIndex = this.parseIndex(charStringOffset).obj;\n      const fontMatrix = topDict.getByName(\"FontMatrix\");\n\n      if (fontMatrix) {\n        properties.fontMatrix = fontMatrix;\n      }\n\n      const fontBBox = topDict.getByName(\"FontBBox\");\n\n      if (fontBBox) {\n        properties.ascent = Math.max(fontBBox[3], fontBBox[1]);\n        properties.descent = Math.min(fontBBox[1], fontBBox[3]);\n        properties.ascentScaled = true;\n      }\n\n      let charset, encoding;\n\n      if (cff.isCIDFont) {\n        const fdArrayIndex = this.parseIndex(topDict.getByName(\"FDArray\")).obj;\n\n        for (let i = 0, ii = fdArrayIndex.count; i < ii; ++i) {\n          const dictRaw = fdArrayIndex.get(i);\n          const fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), cff.strings);\n          this.parsePrivateDict(fontDict);\n          cff.fdArray.push(fontDict);\n        }\n\n        encoding = null;\n        charset = this.parseCharsets(topDict.getByName(\"charset\"), charStringIndex.count, cff.strings, true);\n        cff.fdSelect = this.parseFDSelect(topDict.getByName(\"FDSelect\"), charStringIndex.count);\n      } else {\n        charset = this.parseCharsets(topDict.getByName(\"charset\"), charStringIndex.count, cff.strings, false);\n        encoding = this.parseEncoding(topDict.getByName(\"Encoding\"), properties, cff.strings, charset.charset);\n      }\n\n      cff.charset = charset;\n      cff.encoding = encoding;\n      const charStringsAndSeacs = this.parseCharStrings({\n        charStrings: charStringIndex,\n        localSubrIndex: topDict.privateDict.subrsIndex,\n        globalSubrIndex: globalSubrIndex.obj,\n        fdSelect: cff.fdSelect,\n        fdArray: cff.fdArray,\n        privateDict: topDict.privateDict\n      });\n      cff.charStrings = charStringsAndSeacs.charStrings;\n      cff.seacs = charStringsAndSeacs.seacs;\n      cff.widths = charStringsAndSeacs.widths;\n      return cff;\n    }\n\n    parseHeader() {\n      let bytes = this.bytes;\n      const bytesLength = bytes.length;\n      let offset = 0;\n\n      while (offset < bytesLength && bytes[offset] !== 1) {\n        ++offset;\n      }\n\n      if (offset >= bytesLength) {\n        throw new _util.FormatError(\"Invalid CFF header\");\n      }\n\n      if (offset !== 0) {\n        (0, _util.info)(\"cff data is shifted\");\n        bytes = bytes.subarray(offset);\n        this.bytes = bytes;\n      }\n\n      const major = bytes[0];\n      const minor = bytes[1];\n      const hdrSize = bytes[2];\n      const offSize = bytes[3];\n      const header = new CFFHeader(major, minor, hdrSize, offSize);\n      return {\n        obj: header,\n        endPos: hdrSize\n      };\n    }\n\n    parseDict(dict) {\n      let pos = 0;\n\n      function parseOperand() {\n        let value = dict[pos++];\n\n        if (value === 30) {\n          return parseFloatOperand();\n        } else if (value === 28) {\n          value = dict[pos++];\n          value = (value << 24 | dict[pos++] << 16) >> 16;\n          return value;\n        } else if (value === 29) {\n          value = dict[pos++];\n          value = value << 8 | dict[pos++];\n          value = value << 8 | dict[pos++];\n          value = value << 8 | dict[pos++];\n          return value;\n        } else if (value >= 32 && value <= 246) {\n          return value - 139;\n        } else if (value >= 247 && value <= 250) {\n          return (value - 247) * 256 + dict[pos++] + 108;\n        } else if (value >= 251 && value <= 254) {\n          return -((value - 251) * 256) - dict[pos++] - 108;\n        }\n\n        (0, _util.warn)('CFFParser_parseDict: \"' + value + '\" is a reserved command.');\n        return NaN;\n      }\n\n      function parseFloatOperand() {\n        let str = \"\";\n        const eof = 15;\n        const lookup = [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \".\", \"E\", \"E-\", null, \"-\"];\n        const length = dict.length;\n\n        while (pos < length) {\n          const b = dict[pos++];\n          const b1 = b >> 4;\n          const b2 = b & 15;\n\n          if (b1 === eof) {\n            break;\n          }\n\n          str += lookup[b1];\n\n          if (b2 === eof) {\n            break;\n          }\n\n          str += lookup[b2];\n        }\n\n        return parseFloat(str);\n      }\n\n      let operands = [];\n      const entries = [];\n      pos = 0;\n      const end = dict.length;\n\n      while (pos < end) {\n        let b = dict[pos];\n\n        if (b <= 21) {\n          if (b === 12) {\n            b = b << 8 | dict[++pos];\n          }\n\n          entries.push([b, operands]);\n          operands = [];\n          ++pos;\n        } else {\n          operands.push(parseOperand());\n        }\n      }\n\n      return entries;\n    }\n\n    parseIndex(pos) {\n      const cffIndex = new CFFIndex();\n      const bytes = this.bytes;\n      const count = bytes[pos++] << 8 | bytes[pos++];\n      const offsets = [];\n      let end = pos;\n      let i, ii;\n\n      if (count !== 0) {\n        const offsetSize = bytes[pos++];\n        const startPos = pos + (count + 1) * offsetSize - 1;\n\n        for (i = 0, ii = count + 1; i < ii; ++i) {\n          let offset = 0;\n\n          for (let j = 0; j < offsetSize; ++j) {\n            offset <<= 8;\n            offset += bytes[pos++];\n          }\n\n          offsets.push(startPos + offset);\n        }\n\n        end = offsets[count];\n      }\n\n      for (i = 0, ii = offsets.length - 1; i < ii; ++i) {\n        const offsetStart = offsets[i];\n        const offsetEnd = offsets[i + 1];\n        cffIndex.add(bytes.subarray(offsetStart, offsetEnd));\n      }\n\n      return {\n        obj: cffIndex,\n        endPos: end\n      };\n    }\n\n    parseNameIndex(index) {\n      const names = [];\n\n      for (let i = 0, ii = index.count; i < ii; ++i) {\n        const name = index.get(i);\n        names.push((0, _util.bytesToString)(name));\n      }\n\n      return names;\n    }\n\n    parseStringIndex(index) {\n      const strings = new CFFStrings();\n\n      for (let i = 0, ii = index.count; i < ii; ++i) {\n        const data = index.get(i);\n        strings.add((0, _util.bytesToString)(data));\n      }\n\n      return strings;\n    }\n\n    createDict(Type, dict, strings) {\n      const cffDict = new Type(strings);\n\n      for (let i = 0, ii = dict.length; i < ii; ++i) {\n        const pair = dict[i];\n        const key = pair[0];\n        const value = pair[1];\n        cffDict.setByKey(key, value);\n      }\n\n      return cffDict;\n    }\n\n    parseCharString(state, data, localSubrIndex, globalSubrIndex) {\n      if (!data || state.callDepth > MAX_SUBR_NESTING) {\n        return false;\n      }\n\n      let stackSize = state.stackSize;\n      const stack = state.stack;\n      const length = data.length;\n\n      for (let j = 0; j < length;) {\n        const value = data[j++];\n        let validationCommand = null;\n\n        if (value === 12) {\n          const q = data[j++];\n\n          if (q === 0) {\n            data[j - 2] = 139;\n            data[j - 1] = 22;\n            stackSize = 0;\n          } else {\n            validationCommand = CharstringValidationData12[q];\n          }\n        } else if (value === 28) {\n          stack[stackSize] = (data[j] << 24 | data[j + 1] << 16) >> 16;\n          j += 2;\n          stackSize++;\n        } else if (value === 14) {\n          if (stackSize >= 4) {\n            stackSize -= 4;\n\n            if (this.seacAnalysisEnabled) {\n              state.seac = stack.slice(stackSize, stackSize + 4);\n              return false;\n            }\n          }\n\n          validationCommand = CharstringValidationData[value];\n        } else if (value >= 32 && value <= 246) {\n          stack[stackSize] = value - 139;\n          stackSize++;\n        } else if (value >= 247 && value <= 254) {\n          stack[stackSize] = value < 251 ? (value - 247 << 8) + data[j] + 108 : -(value - 251 << 8) - data[j] - 108;\n          j++;\n          stackSize++;\n        } else if (value === 255) {\n          stack[stackSize] = (data[j] << 24 | data[j + 1] << 16 | data[j + 2] << 8 | data[j + 3]) / 65536;\n          j += 4;\n          stackSize++;\n        } else if (value === 19 || value === 20) {\n          state.hints += stackSize >> 1;\n          j += state.hints + 7 >> 3;\n          stackSize %= 2;\n          validationCommand = CharstringValidationData[value];\n        } else if (value === 10 || value === 29) {\n          let subrsIndex;\n\n          if (value === 10) {\n            subrsIndex = localSubrIndex;\n          } else {\n            subrsIndex = globalSubrIndex;\n          }\n\n          if (!subrsIndex) {\n            validationCommand = CharstringValidationData[value];\n            (0, _util.warn)(\"Missing subrsIndex for \" + validationCommand.id);\n            return false;\n          }\n\n          let bias = 32768;\n\n          if (subrsIndex.count < 1240) {\n            bias = 107;\n          } else if (subrsIndex.count < 33900) {\n            bias = 1131;\n          }\n\n          const subrNumber = stack[--stackSize] + bias;\n\n          if (subrNumber < 0 || subrNumber >= subrsIndex.count || isNaN(subrNumber)) {\n            validationCommand = CharstringValidationData[value];\n            (0, _util.warn)(\"Out of bounds subrIndex for \" + validationCommand.id);\n            return false;\n          }\n\n          state.stackSize = stackSize;\n          state.callDepth++;\n          const valid = this.parseCharString(state, subrsIndex.get(subrNumber), localSubrIndex, globalSubrIndex);\n\n          if (!valid) {\n            return false;\n          }\n\n          state.callDepth--;\n          stackSize = state.stackSize;\n          continue;\n        } else if (value === 11) {\n          state.stackSize = stackSize;\n          return true;\n        } else {\n          validationCommand = CharstringValidationData[value];\n        }\n\n        if (validationCommand) {\n          if (validationCommand.stem) {\n            state.hints += stackSize >> 1;\n\n            if (value === 3 || value === 23) {\n              state.hasVStems = true;\n            } else if (state.hasVStems && (value === 1 || value === 18)) {\n              (0, _util.warn)(\"CFF stem hints are in wrong order\");\n              data[j - 1] = value === 1 ? 3 : 23;\n            }\n          }\n\n          if (\"min\" in validationCommand) {\n            if (!state.undefStack && stackSize < validationCommand.min) {\n              (0, _util.warn)(\"Not enough parameters for \" + validationCommand.id + \"; actual: \" + stackSize + \", expected: \" + validationCommand.min);\n              return false;\n            }\n          }\n\n          if (state.firstStackClearing && validationCommand.stackClearing) {\n            state.firstStackClearing = false;\n            stackSize -= validationCommand.min;\n\n            if (stackSize >= 2 && validationCommand.stem) {\n              stackSize %= 2;\n            } else if (stackSize > 1) {\n              (0, _util.warn)(\"Found too many parameters for stack-clearing command\");\n            }\n\n            if (stackSize > 0 && stack[stackSize - 1] >= 0) {\n              state.width = stack[stackSize - 1];\n            }\n          }\n\n          if (\"stackDelta\" in validationCommand) {\n            if (\"stackFn\" in validationCommand) {\n              validationCommand.stackFn(stack, stackSize);\n            }\n\n            stackSize += validationCommand.stackDelta;\n          } else if (validationCommand.stackClearing) {\n            stackSize = 0;\n          } else if (validationCommand.resetStack) {\n            stackSize = 0;\n            state.undefStack = false;\n          } else if (validationCommand.undefStack) {\n            stackSize = 0;\n            state.undefStack = true;\n            state.firstStackClearing = false;\n          }\n        }\n      }\n\n      state.stackSize = stackSize;\n      return true;\n    }\n\n    parseCharStrings({\n      charStrings,\n      localSubrIndex,\n      globalSubrIndex,\n      fdSelect,\n      fdArray,\n      privateDict\n    }) {\n      const seacs = [];\n      const widths = [];\n      const count = charStrings.count;\n\n      for (let i = 0; i < count; i++) {\n        const charstring = charStrings.get(i);\n        const state = {\n          callDepth: 0,\n          stackSize: 0,\n          stack: [],\n          undefStack: true,\n          hints: 0,\n          firstStackClearing: true,\n          seac: null,\n          width: null,\n          hasVStems: false\n        };\n        let valid = true;\n        let localSubrToUse = null;\n        let privateDictToUse = privateDict;\n\n        if (fdSelect && fdArray.length) {\n          const fdIndex = fdSelect.getFDIndex(i);\n\n          if (fdIndex === -1) {\n            (0, _util.warn)(\"Glyph index is not in fd select.\");\n            valid = false;\n          }\n\n          if (fdIndex >= fdArray.length) {\n            (0, _util.warn)(\"Invalid fd index for glyph index.\");\n            valid = false;\n          }\n\n          if (valid) {\n            privateDictToUse = fdArray[fdIndex].privateDict;\n            localSubrToUse = privateDictToUse.subrsIndex;\n          }\n        } else if (localSubrIndex) {\n          localSubrToUse = localSubrIndex;\n        }\n\n        if (valid) {\n          valid = this.parseCharString(state, charstring, localSubrToUse, globalSubrIndex);\n        }\n\n        if (state.width !== null) {\n          const nominalWidth = privateDictToUse.getByName(\"nominalWidthX\");\n          widths[i] = nominalWidth + state.width;\n        } else {\n          const defaultWidth = privateDictToUse.getByName(\"defaultWidthX\");\n          widths[i] = defaultWidth;\n        }\n\n        if (state.seac !== null) {\n          seacs[i] = state.seac;\n        }\n\n        if (!valid) {\n          charStrings.set(i, new Uint8Array([14]));\n        }\n      }\n\n      return {\n        charStrings,\n        seacs,\n        widths\n      };\n    }\n\n    emptyPrivateDictionary(parentDict) {\n      const privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings);\n      parentDict.setByKey(18, [0, 0]);\n      parentDict.privateDict = privateDict;\n    }\n\n    parsePrivateDict(parentDict) {\n      if (!parentDict.hasName(\"Private\")) {\n        this.emptyPrivateDictionary(parentDict);\n        return;\n      }\n\n      const privateOffset = parentDict.getByName(\"Private\");\n\n      if (!Array.isArray(privateOffset) || privateOffset.length !== 2) {\n        parentDict.removeByName(\"Private\");\n        return;\n      }\n\n      const size = privateOffset[0];\n      const offset = privateOffset[1];\n\n      if (size === 0 || offset >= this.bytes.length) {\n        this.emptyPrivateDictionary(parentDict);\n        return;\n      }\n\n      const privateDictEnd = offset + size;\n      const dictData = this.bytes.subarray(offset, privateDictEnd);\n      const dict = this.parseDict(dictData);\n      const privateDict = this.createDict(CFFPrivateDict, dict, parentDict.strings);\n      parentDict.privateDict = privateDict;\n\n      if (!privateDict.getByName(\"Subrs\")) {\n        return;\n      }\n\n      const subrsOffset = privateDict.getByName(\"Subrs\");\n      const relativeOffset = offset + subrsOffset;\n\n      if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {\n        this.emptyPrivateDictionary(parentDict);\n        return;\n      }\n\n      const subrsIndex = this.parseIndex(relativeOffset);\n      privateDict.subrsIndex = subrsIndex.obj;\n    }\n\n    parseCharsets(pos, length, strings, cid) {\n      if (pos === 0) {\n        return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, _charsets.ISOAdobeCharset);\n      } else if (pos === 1) {\n        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, _charsets.ExpertCharset);\n      } else if (pos === 2) {\n        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, _charsets.ExpertSubsetCharset);\n      }\n\n      const bytes = this.bytes;\n      const start = pos;\n      const format = bytes[pos++];\n      const charset = [cid ? 0 : \".notdef\"];\n      let id, count, i;\n      length -= 1;\n\n      switch (format) {\n        case 0:\n          for (i = 0; i < length; i++) {\n            id = bytes[pos++] << 8 | bytes[pos++];\n            charset.push(cid ? id : strings.get(id));\n          }\n\n          break;\n\n        case 1:\n          while (charset.length <= length) {\n            id = bytes[pos++] << 8 | bytes[pos++];\n            count = bytes[pos++];\n\n            for (i = 0; i <= count; i++) {\n              charset.push(cid ? id++ : strings.get(id++));\n            }\n          }\n\n          break;\n\n        case 2:\n          while (charset.length <= length) {\n            id = bytes[pos++] << 8 | bytes[pos++];\n            count = bytes[pos++] << 8 | bytes[pos++];\n\n            for (i = 0; i <= count; i++) {\n              charset.push(cid ? id++ : strings.get(id++));\n            }\n          }\n\n          break;\n\n        default:\n          throw new _util.FormatError(\"Unknown charset format\");\n      }\n\n      const end = pos;\n      const raw = bytes.subarray(start, end);\n      return new CFFCharset(false, format, charset, raw);\n    }\n\n    parseEncoding(pos, properties, strings, charset) {\n      const encoding = Object.create(null);\n      const bytes = this.bytes;\n      let predefined = false;\n      let format, i, ii;\n      let raw = null;\n\n      function readSupplement() {\n        const supplementsCount = bytes[pos++];\n\n        for (i = 0; i < supplementsCount; i++) {\n          const code = bytes[pos++];\n          const sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);\n          encoding[code] = charset.indexOf(strings.get(sid));\n        }\n      }\n\n      if (pos === 0 || pos === 1) {\n        predefined = true;\n        format = pos;\n        const baseEncoding = pos ? _encodings.ExpertEncoding : _encodings.StandardEncoding;\n\n        for (i = 0, ii = charset.length; i < ii; i++) {\n          const index = baseEncoding.indexOf(charset[i]);\n\n          if (index !== -1) {\n            encoding[index] = i;\n          }\n        }\n      } else {\n        const dataStart = pos;\n        format = bytes[pos++];\n\n        switch (format & 0x7f) {\n          case 0:\n            const glyphsCount = bytes[pos++];\n\n            for (i = 1; i <= glyphsCount; i++) {\n              encoding[bytes[pos++]] = i;\n            }\n\n            break;\n\n          case 1:\n            const rangesCount = bytes[pos++];\n            let gid = 1;\n\n            for (i = 0; i < rangesCount; i++) {\n              const start = bytes[pos++];\n              const left = bytes[pos++];\n\n              for (let j = start; j <= start + left; j++) {\n                encoding[j] = gid++;\n              }\n            }\n\n            break;\n\n          default:\n            throw new _util.FormatError(`Unknown encoding format: ${format} in CFF`);\n        }\n\n        const dataEnd = pos;\n\n        if (format & 0x80) {\n          bytes[dataStart] &= 0x7f;\n          readSupplement();\n        }\n\n        raw = bytes.subarray(dataStart, dataEnd);\n      }\n\n      format = format & 0x7f;\n      return new CFFEncoding(predefined, format, encoding, raw);\n    }\n\n    parseFDSelect(pos, length) {\n      const bytes = this.bytes;\n      const format = bytes[pos++];\n      const fdSelect = [];\n      let i;\n\n      switch (format) {\n        case 0:\n          for (i = 0; i < length; ++i) {\n            const id = bytes[pos++];\n            fdSelect.push(id);\n          }\n\n          break;\n\n        case 3:\n          const rangesCount = bytes[pos++] << 8 | bytes[pos++];\n\n          for (i = 0; i < rangesCount; ++i) {\n            let first = bytes[pos++] << 8 | bytes[pos++];\n\n            if (i === 0 && first !== 0) {\n              (0, _util.warn)(\"parseFDSelect: The first range must have a first GID of 0\" + \" -- trying to recover.\");\n              first = 0;\n            }\n\n            const fdIndex = bytes[pos++];\n            const next = bytes[pos] << 8 | bytes[pos + 1];\n\n            for (let j = first; j < next; ++j) {\n              fdSelect.push(fdIndex);\n            }\n          }\n\n          pos += 2;\n          break;\n\n        default:\n          throw new _util.FormatError(`parseFDSelect: Unknown format \"${format}\".`);\n      }\n\n      if (fdSelect.length !== length) {\n        throw new _util.FormatError(\"parseFDSelect: Invalid font data.\");\n      }\n\n      return new CFFFDSelect(format, fdSelect);\n    }\n\n  }\n\n  return CFFParser;\n}();\n\nexports.CFFParser = CFFParser;\n\nclass CFF {\n  constructor() {\n    this.header = null;\n    this.names = [];\n    this.topDict = null;\n    this.strings = new CFFStrings();\n    this.globalSubrIndex = null;\n    this.encoding = null;\n    this.charset = null;\n    this.charStrings = null;\n    this.fdArray = [];\n    this.fdSelect = null;\n    this.isCIDFont = false;\n  }\n\n  duplicateFirstGlyph() {\n    if (this.charStrings.count >= 65535) {\n      (0, _util.warn)(\"Not enough space in charstrings to duplicate first glyph.\");\n      return;\n    }\n\n    const glyphZero = this.charStrings.get(0);\n    this.charStrings.add(glyphZero);\n\n    if (this.isCIDFont) {\n      this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]);\n    }\n  }\n\n  hasGlyphId(id) {\n    if (id < 0 || id >= this.charStrings.count) {\n      return false;\n    }\n\n    const glyph = this.charStrings.get(id);\n    return glyph.length > 0;\n  }\n\n}\n\nexports.CFF = CFF;\n\nclass CFFHeader {\n  constructor(major, minor, hdrSize, offSize) {\n    this.major = major;\n    this.minor = minor;\n    this.hdrSize = hdrSize;\n    this.offSize = offSize;\n  }\n\n}\n\nexports.CFFHeader = CFFHeader;\n\nclass CFFStrings {\n  constructor() {\n    this.strings = [];\n  }\n\n  get(index) {\n    if (index >= 0 && index <= NUM_STANDARD_CFF_STRINGS - 1) {\n      return CFFStandardStrings[index];\n    }\n\n    if (index - NUM_STANDARD_CFF_STRINGS <= this.strings.length) {\n      return this.strings[index - NUM_STANDARD_CFF_STRINGS];\n    }\n\n    return CFFStandardStrings[0];\n  }\n\n  getSID(str) {\n    let index = CFFStandardStrings.indexOf(str);\n\n    if (index !== -1) {\n      return index;\n    }\n\n    index = this.strings.indexOf(str);\n\n    if (index !== -1) {\n      return index + NUM_STANDARD_CFF_STRINGS;\n    }\n\n    return -1;\n  }\n\n  add(value) {\n    this.strings.push(value);\n  }\n\n  get count() {\n    return this.strings.length;\n  }\n\n}\n\nexports.CFFStrings = CFFStrings;\n\nclass CFFIndex {\n  constructor() {\n    this.objects = [];\n    this.length = 0;\n  }\n\n  add(data) {\n    this.length += data.length;\n    this.objects.push(data);\n  }\n\n  set(index, data) {\n    this.length += data.length - this.objects[index].length;\n    this.objects[index] = data;\n  }\n\n  get(index) {\n    return this.objects[index];\n  }\n\n  get count() {\n    return this.objects.length;\n  }\n\n}\n\nexports.CFFIndex = CFFIndex;\n\nclass CFFDict {\n  constructor(tables, strings) {\n    this.keyToNameMap = tables.keyToNameMap;\n    this.nameToKeyMap = tables.nameToKeyMap;\n    this.defaults = tables.defaults;\n    this.types = tables.types;\n    this.opcodes = tables.opcodes;\n    this.order = tables.order;\n    this.strings = strings;\n    this.values = Object.create(null);\n  }\n\n  setByKey(key, value) {\n    if (!(key in this.keyToNameMap)) {\n      return false;\n    }\n\n    const valueLength = value.length;\n\n    if (valueLength === 0) {\n      return true;\n    }\n\n    for (let i = 0; i < valueLength; i++) {\n      if (isNaN(value[i])) {\n        (0, _util.warn)('Invalid CFFDict value: \"' + value + '\" for key \"' + key + '\".');\n        return true;\n      }\n    }\n\n    const type = this.types[key];\n\n    if (type === \"num\" || type === \"sid\" || type === \"offset\") {\n      value = value[0];\n    }\n\n    this.values[key] = value;\n    return true;\n  }\n\n  setByName(name, value) {\n    if (!(name in this.nameToKeyMap)) {\n      throw new _util.FormatError(`Invalid dictionary name \"${name}\"`);\n    }\n\n    this.values[this.nameToKeyMap[name]] = value;\n  }\n\n  hasName(name) {\n    return this.nameToKeyMap[name] in this.values;\n  }\n\n  getByName(name) {\n    if (!(name in this.nameToKeyMap)) {\n      throw new _util.FormatError(`Invalid dictionary name ${name}\"`);\n    }\n\n    const key = this.nameToKeyMap[name];\n\n    if (!(key in this.values)) {\n      return this.defaults[key];\n    }\n\n    return this.values[key];\n  }\n\n  removeByName(name) {\n    delete this.values[this.nameToKeyMap[name]];\n  }\n\n  static createTables(layout) {\n    const tables = {\n      keyToNameMap: {},\n      nameToKeyMap: {},\n      defaults: {},\n      types: {},\n      opcodes: {},\n      order: []\n    };\n\n    for (let i = 0, ii = layout.length; i < ii; ++i) {\n      const entry = layout[i];\n      const key = Array.isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];\n      tables.keyToNameMap[key] = entry[1];\n      tables.nameToKeyMap[entry[1]] = key;\n      tables.types[key] = entry[2];\n      tables.defaults[key] = entry[3];\n      tables.opcodes[key] = Array.isArray(entry[0]) ? entry[0] : [entry[0]];\n      tables.order.push(key);\n    }\n\n    return tables;\n  }\n\n}\n\nconst CFFTopDict = function CFFTopDictClosure() {\n  const layout = [[[12, 30], \"ROS\", [\"sid\", \"sid\", \"num\"], null], [[12, 20], \"SyntheticBase\", \"num\", null], [0, \"version\", \"sid\", null], [1, \"Notice\", \"sid\", null], [[12, 0], \"Copyright\", \"sid\", null], [2, \"FullName\", \"sid\", null], [3, \"FamilyName\", \"sid\", null], [4, \"Weight\", \"sid\", null], [[12, 1], \"isFixedPitch\", \"num\", 0], [[12, 2], \"ItalicAngle\", \"num\", 0], [[12, 3], \"UnderlinePosition\", \"num\", -100], [[12, 4], \"UnderlineThickness\", \"num\", 50], [[12, 5], \"PaintType\", \"num\", 0], [[12, 6], \"CharstringType\", \"num\", 2], [[12, 7], \"FontMatrix\", [\"num\", \"num\", \"num\", \"num\", \"num\", \"num\"], [0.001, 0, 0, 0.001, 0, 0]], [13, \"UniqueID\", \"num\", null], [5, \"FontBBox\", [\"num\", \"num\", \"num\", \"num\"], [0, 0, 0, 0]], [[12, 8], \"StrokeWidth\", \"num\", 0], [14, \"XUID\", \"array\", null], [15, \"charset\", \"offset\", 0], [16, \"Encoding\", \"offset\", 0], [17, \"CharStrings\", \"offset\", 0], [18, \"Private\", [\"offset\", \"offset\"], null], [[12, 21], \"PostScript\", \"sid\", null], [[12, 22], \"BaseFontName\", \"sid\", null], [[12, 23], \"BaseFontBlend\", \"delta\", null], [[12, 31], \"CIDFontVersion\", \"num\", 0], [[12, 32], \"CIDFontRevision\", \"num\", 0], [[12, 33], \"CIDFontType\", \"num\", 0], [[12, 34], \"CIDCount\", \"num\", 8720], [[12, 35], \"UIDBase\", \"num\", null], [[12, 37], \"FDSelect\", \"offset\", null], [[12, 36], \"FDArray\", \"offset\", null], [[12, 38], \"FontName\", \"sid\", null]];\n  let tables = null;\n\n  class CFFTopDict extends CFFDict {\n    constructor(strings) {\n      if (tables === null) {\n        tables = CFFDict.createTables(layout);\n      }\n\n      super(tables, strings);\n      this.privateDict = null;\n    }\n\n  }\n\n  return CFFTopDict;\n}();\n\nexports.CFFTopDict = CFFTopDict;\n\nconst CFFPrivateDict = function CFFPrivateDictClosure() {\n  const layout = [[6, \"BlueValues\", \"delta\", null], [7, \"OtherBlues\", \"delta\", null], [8, \"FamilyBlues\", \"delta\", null], [9, \"FamilyOtherBlues\", \"delta\", null], [[12, 9], \"BlueScale\", \"num\", 0.039625], [[12, 10], \"BlueShift\", \"num\", 7], [[12, 11], \"BlueFuzz\", \"num\", 1], [10, \"StdHW\", \"num\", null], [11, \"StdVW\", \"num\", null], [[12, 12], \"StemSnapH\", \"delta\", null], [[12, 13], \"StemSnapV\", \"delta\", null], [[12, 14], \"ForceBold\", \"num\", 0], [[12, 17], \"LanguageGroup\", \"num\", 0], [[12, 18], \"ExpansionFactor\", \"num\", 0.06], [[12, 19], \"initialRandomSeed\", \"num\", 0], [20, \"defaultWidthX\", \"num\", 0], [21, \"nominalWidthX\", \"num\", 0], [19, \"Subrs\", \"offset\", null]];\n  let tables = null;\n\n  class CFFPrivateDict extends CFFDict {\n    constructor(strings) {\n      if (tables === null) {\n        tables = CFFDict.createTables(layout);\n      }\n\n      super(tables, strings);\n      this.subrsIndex = null;\n    }\n\n  }\n\n  return CFFPrivateDict;\n}();\n\nexports.CFFPrivateDict = CFFPrivateDict;\nconst CFFCharsetPredefinedTypes = {\n  ISO_ADOBE: 0,\n  EXPERT: 1,\n  EXPERT_SUBSET: 2\n};\n\nclass CFFCharset {\n  constructor(predefined, format, charset, raw) {\n    this.predefined = predefined;\n    this.format = format;\n    this.charset = charset;\n    this.raw = raw;\n  }\n\n}\n\nexports.CFFCharset = CFFCharset;\n\nclass CFFEncoding {\n  constructor(predefined, format, encoding, raw) {\n    this.predefined = predefined;\n    this.format = format;\n    this.encoding = encoding;\n    this.raw = raw;\n  }\n\n}\n\nclass CFFFDSelect {\n  constructor(format, fdSelect) {\n    this.format = format;\n    this.fdSelect = fdSelect;\n  }\n\n  getFDIndex(glyphIndex) {\n    if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) {\n      return -1;\n    }\n\n    return this.fdSelect[glyphIndex];\n  }\n\n}\n\nexports.CFFFDSelect = CFFFDSelect;\n\nclass CFFOffsetTracker {\n  constructor() {\n    this.offsets = Object.create(null);\n  }\n\n  isTracking(key) {\n    return key in this.offsets;\n  }\n\n  track(key, location) {\n    if (key in this.offsets) {\n      throw new _util.FormatError(`Already tracking location of ${key}`);\n    }\n\n    this.offsets[key] = location;\n  }\n\n  offset(value) {\n    for (const key in this.offsets) {\n      this.offsets[key] += value;\n    }\n  }\n\n  setEntryLocation(key, values, output) {\n    if (!(key in this.offsets)) {\n      throw new _util.FormatError(`Not tracking location of ${key}`);\n    }\n\n    const data = output.data;\n    const dataOffset = this.offsets[key];\n    const size = 5;\n\n    for (let i = 0, ii = values.length; i < ii; ++i) {\n      const offset0 = i * size + dataOffset;\n      const offset1 = offset0 + 1;\n      const offset2 = offset0 + 2;\n      const offset3 = offset0 + 3;\n      const offset4 = offset0 + 4;\n\n      if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) {\n        throw new _util.FormatError(\"writing to an offset that is not empty\");\n      }\n\n      const value = values[i];\n      data[offset0] = 0x1d;\n      data[offset1] = value >> 24 & 0xff;\n      data[offset2] = value >> 16 & 0xff;\n      data[offset3] = value >> 8 & 0xff;\n      data[offset4] = value & 0xff;\n    }\n  }\n\n}\n\nclass CFFCompiler {\n  constructor(cff) {\n    this.cff = cff;\n  }\n\n  compile() {\n    const cff = this.cff;\n    const output = {\n      data: [],\n      length: 0,\n      add: function CFFCompiler_add(data) {\n        this.data = this.data.concat(data);\n        this.length = this.data.length;\n      }\n    };\n    const header = this.compileHeader(cff.header);\n    output.add(header);\n    const nameIndex = this.compileNameIndex(cff.names);\n    output.add(nameIndex);\n\n    if (cff.isCIDFont) {\n      if (cff.topDict.hasName(\"FontMatrix\")) {\n        const base = cff.topDict.getByName(\"FontMatrix\");\n        cff.topDict.removeByName(\"FontMatrix\");\n\n        for (let i = 0, ii = cff.fdArray.length; i < ii; i++) {\n          const subDict = cff.fdArray[i];\n          let matrix = base.slice(0);\n\n          if (subDict.hasName(\"FontMatrix\")) {\n            matrix = _util.Util.transform(matrix, subDict.getByName(\"FontMatrix\"));\n          }\n\n          subDict.setByName(\"FontMatrix\", matrix);\n        }\n      }\n    }\n\n    const xuid = cff.topDict.getByName(\"XUID\");\n\n    if (xuid && xuid.length > 16) {\n      cff.topDict.removeByName(\"XUID\");\n    }\n\n    cff.topDict.setByName(\"charset\", 0);\n    let compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont);\n    output.add(compiled.output);\n    const topDictTracker = compiled.trackers[0];\n    const stringIndex = this.compileStringIndex(cff.strings.strings);\n    output.add(stringIndex);\n    const globalSubrIndex = this.compileIndex(cff.globalSubrIndex);\n    output.add(globalSubrIndex);\n\n    if (cff.encoding && cff.topDict.hasName(\"Encoding\")) {\n      if (cff.encoding.predefined) {\n        topDictTracker.setEntryLocation(\"Encoding\", [cff.encoding.format], output);\n      } else {\n        const encoding = this.compileEncoding(cff.encoding);\n        topDictTracker.setEntryLocation(\"Encoding\", [output.length], output);\n        output.add(encoding);\n      }\n    }\n\n    const charset = this.compileCharset(cff.charset, cff.charStrings.count, cff.strings, cff.isCIDFont);\n    topDictTracker.setEntryLocation(\"charset\", [output.length], output);\n    output.add(charset);\n    const charStrings = this.compileCharStrings(cff.charStrings);\n    topDictTracker.setEntryLocation(\"CharStrings\", [output.length], output);\n    output.add(charStrings);\n\n    if (cff.isCIDFont) {\n      topDictTracker.setEntryLocation(\"FDSelect\", [output.length], output);\n      const fdSelect = this.compileFDSelect(cff.fdSelect);\n      output.add(fdSelect);\n      compiled = this.compileTopDicts(cff.fdArray, output.length, true);\n      topDictTracker.setEntryLocation(\"FDArray\", [output.length], output);\n      output.add(compiled.output);\n      const fontDictTrackers = compiled.trackers;\n      this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);\n    }\n\n    this.compilePrivateDicts([cff.topDict], [topDictTracker], output);\n    output.add([0]);\n    return output.data;\n  }\n\n  encodeNumber(value) {\n    if (Number.isInteger(value)) {\n      return this.encodeInteger(value);\n    }\n\n    return this.encodeFloat(value);\n  }\n\n  static get EncodeFloatRegExp() {\n    return (0, _util.shadow)(this, \"EncodeFloatRegExp\", /\\.(\\d*?)(?:9{5,20}|0{5,20})\\d{0,2}(?:e(.+)|$)/);\n  }\n\n  encodeFloat(num) {\n    let value = num.toString();\n    const m = CFFCompiler.EncodeFloatRegExp.exec(value);\n\n    if (m) {\n      const epsilon = parseFloat(\"1e\" + ((m[2] ? +m[2] : 0) + m[1].length));\n      value = (Math.round(num * epsilon) / epsilon).toString();\n    }\n\n    let nibbles = \"\";\n    let i, ii;\n\n    for (i = 0, ii = value.length; i < ii; ++i) {\n      const a = value[i];\n\n      if (a === \"e\") {\n        nibbles += value[++i] === \"-\" ? \"c\" : \"b\";\n      } else if (a === \".\") {\n        nibbles += \"a\";\n      } else if (a === \"-\") {\n        nibbles += \"e\";\n      } else {\n        nibbles += a;\n      }\n    }\n\n    nibbles += nibbles.length & 1 ? \"f\" : \"ff\";\n    const out = [30];\n\n    for (i = 0, ii = nibbles.length; i < ii; i += 2) {\n      out.push(parseInt(nibbles.substring(i, i + 2), 16));\n    }\n\n    return out;\n  }\n\n  encodeInteger(value) {\n    let code;\n\n    if (value >= -107 && value <= 107) {\n      code = [value + 139];\n    } else if (value >= 108 && value <= 1131) {\n      value = value - 108;\n      code = [(value >> 8) + 247, value & 0xff];\n    } else if (value >= -1131 && value <= -108) {\n      value = -value - 108;\n      code = [(value >> 8) + 251, value & 0xff];\n    } else if (value >= -32768 && value <= 32767) {\n      code = [0x1c, value >> 8 & 0xff, value & 0xff];\n    } else {\n      code = [0x1d, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff];\n    }\n\n    return code;\n  }\n\n  compileHeader(header) {\n    return [header.major, header.minor, 4, header.offSize];\n  }\n\n  compileNameIndex(names) {\n    const nameIndex = new CFFIndex();\n\n    for (let i = 0, ii = names.length; i < ii; ++i) {\n      const name = names[i];\n      const length = Math.min(name.length, 127);\n      let sanitizedName = new Array(length);\n\n      for (let j = 0; j < length; j++) {\n        let char = name[j];\n\n        if (char < \"!\" || char > \"~\" || char === \"[\" || char === \"]\" || char === \"(\" || char === \")\" || char === \"{\" || char === \"}\" || char === \"<\" || char === \">\" || char === \"/\" || char === \"%\") {\n          char = \"_\";\n        }\n\n        sanitizedName[j] = char;\n      }\n\n      sanitizedName = sanitizedName.join(\"\");\n\n      if (sanitizedName === \"\") {\n        sanitizedName = \"Bad_Font_Name\";\n      }\n\n      nameIndex.add((0, _util.stringToBytes)(sanitizedName));\n    }\n\n    return this.compileIndex(nameIndex);\n  }\n\n  compileTopDicts(dicts, length, removeCidKeys) {\n    const fontDictTrackers = [];\n    let fdArrayIndex = new CFFIndex();\n\n    for (let i = 0, ii = dicts.length; i < ii; ++i) {\n      const fontDict = dicts[i];\n\n      if (removeCidKeys) {\n        fontDict.removeByName(\"CIDFontVersion\");\n        fontDict.removeByName(\"CIDFontRevision\");\n        fontDict.removeByName(\"CIDFontType\");\n        fontDict.removeByName(\"CIDCount\");\n        fontDict.removeByName(\"UIDBase\");\n      }\n\n      const fontDictTracker = new CFFOffsetTracker();\n      const fontDictData = this.compileDict(fontDict, fontDictTracker);\n      fontDictTrackers.push(fontDictTracker);\n      fdArrayIndex.add(fontDictData);\n      fontDictTracker.offset(length);\n    }\n\n    fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);\n    return {\n      trackers: fontDictTrackers,\n      output: fdArrayIndex\n    };\n  }\n\n  compilePrivateDicts(dicts, trackers, output) {\n    for (let i = 0, ii = dicts.length; i < ii; ++i) {\n      const fontDict = dicts[i];\n      const privateDict = fontDict.privateDict;\n\n      if (!privateDict || !fontDict.hasName(\"Private\")) {\n        throw new _util.FormatError(\"There must be a private dictionary.\");\n      }\n\n      const privateDictTracker = new CFFOffsetTracker();\n      const privateDictData = this.compileDict(privateDict, privateDictTracker);\n      let outputLength = output.length;\n      privateDictTracker.offset(outputLength);\n\n      if (!privateDictData.length) {\n        outputLength = 0;\n      }\n\n      trackers[i].setEntryLocation(\"Private\", [privateDictData.length, outputLength], output);\n      output.add(privateDictData);\n\n      if (privateDict.subrsIndex && privateDict.hasName(\"Subrs\")) {\n        const subrs = this.compileIndex(privateDict.subrsIndex);\n        privateDictTracker.setEntryLocation(\"Subrs\", [privateDictData.length], output);\n        output.add(subrs);\n      }\n    }\n  }\n\n  compileDict(dict, offsetTracker) {\n    let out = [];\n    const order = dict.order;\n\n    for (let i = 0; i < order.length; ++i) {\n      const key = order[i];\n\n      if (!(key in dict.values)) {\n        continue;\n      }\n\n      let values = dict.values[key];\n      let types = dict.types[key];\n\n      if (!Array.isArray(types)) {\n        types = [types];\n      }\n\n      if (!Array.isArray(values)) {\n        values = [values];\n      }\n\n      if (values.length === 0) {\n        continue;\n      }\n\n      for (let j = 0, jj = types.length; j < jj; ++j) {\n        const type = types[j];\n        const value = values[j];\n\n        switch (type) {\n          case \"num\":\n          case \"sid\":\n            out = out.concat(this.encodeNumber(value));\n            break;\n\n          case \"offset\":\n            const name = dict.keyToNameMap[key];\n\n            if (!offsetTracker.isTracking(name)) {\n              offsetTracker.track(name, out.length);\n            }\n\n            out = out.concat([0x1d, 0, 0, 0, 0]);\n            break;\n\n          case \"array\":\n          case \"delta\":\n            out = out.concat(this.encodeNumber(value));\n\n            for (let k = 1, kk = values.length; k < kk; ++k) {\n              out = out.concat(this.encodeNumber(values[k]));\n            }\n\n            break;\n\n          default:\n            throw new _util.FormatError(`Unknown data type of ${type}`);\n        }\n      }\n\n      out = out.concat(dict.opcodes[key]);\n    }\n\n    return out;\n  }\n\n  compileStringIndex(strings) {\n    const stringIndex = new CFFIndex();\n\n    for (let i = 0, ii = strings.length; i < ii; ++i) {\n      stringIndex.add((0, _util.stringToBytes)(strings[i]));\n    }\n\n    return this.compileIndex(stringIndex);\n  }\n\n  compileGlobalSubrIndex() {\n    const globalSubrIndex = this.cff.globalSubrIndex;\n    this.out.writeByteArray(this.compileIndex(globalSubrIndex));\n  }\n\n  compileCharStrings(charStrings) {\n    const charStringsIndex = new CFFIndex();\n\n    for (let i = 0; i < charStrings.count; i++) {\n      const glyph = charStrings.get(i);\n\n      if (glyph.length === 0) {\n        charStringsIndex.add(new Uint8Array([0x8b, 0x0e]));\n        continue;\n      }\n\n      charStringsIndex.add(glyph);\n    }\n\n    return this.compileIndex(charStringsIndex);\n  }\n\n  compileCharset(charset, numGlyphs, strings, isCIDFont) {\n    let out;\n    const numGlyphsLessNotDef = numGlyphs - 1;\n\n    if (isCIDFont) {\n      out = new Uint8Array([2, 0, 0, numGlyphsLessNotDef >> 8 & 0xff, numGlyphsLessNotDef & 0xff]);\n    } else {\n      const length = 1 + numGlyphsLessNotDef * 2;\n      out = new Uint8Array(length);\n      out[0] = 0;\n      let charsetIndex = 0;\n      const numCharsets = charset.charset.length;\n      let warned = false;\n\n      for (let i = 1; i < out.length; i += 2) {\n        let sid = 0;\n\n        if (charsetIndex < numCharsets) {\n          const name = charset.charset[charsetIndex++];\n          sid = strings.getSID(name);\n\n          if (sid === -1) {\n            sid = 0;\n\n            if (!warned) {\n              warned = true;\n              (0, _util.warn)(`Couldn't find ${name} in CFF strings`);\n            }\n          }\n        }\n\n        out[i] = sid >> 8 & 0xff;\n        out[i + 1] = sid & 0xff;\n      }\n    }\n\n    return this.compileTypedArray(out);\n  }\n\n  compileEncoding(encoding) {\n    return this.compileTypedArray(encoding.raw);\n  }\n\n  compileFDSelect(fdSelect) {\n    const format = fdSelect.format;\n    let out, i;\n\n    switch (format) {\n      case 0:\n        out = new Uint8Array(1 + fdSelect.fdSelect.length);\n        out[0] = format;\n\n        for (i = 0; i < fdSelect.fdSelect.length; i++) {\n          out[i + 1] = fdSelect.fdSelect[i];\n        }\n\n        break;\n\n      case 3:\n        const start = 0;\n        let lastFD = fdSelect.fdSelect[0];\n        const ranges = [format, 0, 0, start >> 8 & 0xff, start & 0xff, lastFD];\n\n        for (i = 1; i < fdSelect.fdSelect.length; i++) {\n          const currentFD = fdSelect.fdSelect[i];\n\n          if (currentFD !== lastFD) {\n            ranges.push(i >> 8 & 0xff, i & 0xff, currentFD);\n            lastFD = currentFD;\n          }\n        }\n\n        const numRanges = (ranges.length - 3) / 3;\n        ranges[1] = numRanges >> 8 & 0xff;\n        ranges[2] = numRanges & 0xff;\n        ranges.push(i >> 8 & 0xff, i & 0xff);\n        out = new Uint8Array(ranges);\n        break;\n    }\n\n    return this.compileTypedArray(out);\n  }\n\n  compileTypedArray(data) {\n    const out = [];\n\n    for (let i = 0, ii = data.length; i < ii; ++i) {\n      out[i] = data[i];\n    }\n\n    return out;\n  }\n\n  compileIndex(index, trackers = []) {\n    const objects = index.objects;\n    const count = objects.length;\n\n    if (count === 0) {\n      return [0, 0, 0];\n    }\n\n    const data = [count >> 8 & 0xff, count & 0xff];\n    let lastOffset = 1,\n        i;\n\n    for (i = 0; i < count; ++i) {\n      lastOffset += objects[i].length;\n    }\n\n    let offsetSize;\n\n    if (lastOffset < 0x100) {\n      offsetSize = 1;\n    } else if (lastOffset < 0x10000) {\n      offsetSize = 2;\n    } else if (lastOffset < 0x1000000) {\n      offsetSize = 3;\n    } else {\n      offsetSize = 4;\n    }\n\n    data.push(offsetSize);\n    let relativeOffset = 1;\n\n    for (i = 0; i < count + 1; i++) {\n      if (offsetSize === 1) {\n        data.push(relativeOffset & 0xff);\n      } else if (offsetSize === 2) {\n        data.push(relativeOffset >> 8 & 0xff, relativeOffset & 0xff);\n      } else if (offsetSize === 3) {\n        data.push(relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff);\n      } else {\n        data.push(relativeOffset >>> 24 & 0xff, relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff);\n      }\n\n      if (objects[i]) {\n        relativeOffset += objects[i].length;\n      }\n    }\n\n    for (i = 0; i < count; i++) {\n      if (trackers[i]) {\n        trackers[i].offset(data.length);\n      }\n\n      for (let j = 0, jj = objects[i].length; j < jj; j++) {\n        data.push(objects[i][j]);\n      }\n    }\n\n    return data;\n  }\n\n}\n\nexports.CFFCompiler = CFFCompiler;\n\n/***/ }),\n/* 33 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.ISOAdobeCharset = exports.ExpertSubsetCharset = exports.ExpertCharset = void 0;\nconst ISOAdobeCharset = [\".notdef\", \"space\", \"exclam\", \"quotedbl\", \"numbersign\", \"dollar\", \"percent\", \"ampersand\", \"quoteright\", \"parenleft\", \"parenright\", \"asterisk\", \"plus\", \"comma\", \"hyphen\", \"period\", \"slash\", \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"colon\", \"semicolon\", \"less\", \"equal\", \"greater\", \"question\", \"at\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\", \"bracketleft\", \"backslash\", \"bracketright\", \"asciicircum\", \"underscore\", \"quoteleft\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\", \"x\", \"y\", \"z\", \"braceleft\", \"bar\", \"braceright\", \"asciitilde\", \"exclamdown\", \"cent\", \"sterling\", \"fraction\", \"yen\", \"florin\", \"section\", \"currency\", \"quotesingle\", \"quotedblleft\", \"guillemotleft\", \"guilsinglleft\", \"guilsinglright\", \"fi\", \"fl\", \"endash\", \"dagger\", \"daggerdbl\", \"periodcentered\", \"paragraph\", \"bullet\", \"quotesinglbase\", \"quotedblbase\", \"quotedblright\", \"guillemotright\", \"ellipsis\", \"perthousand\", \"questiondown\", \"grave\", \"acute\", \"circumflex\", \"tilde\", \"macron\", \"breve\", \"dotaccent\", \"dieresis\", \"ring\", \"cedilla\", \"hungarumlaut\", \"ogonek\", \"caron\", \"emdash\", \"AE\", \"ordfeminine\", \"Lslash\", \"Oslash\", \"OE\", \"ordmasculine\", \"ae\", \"dotlessi\", \"lslash\", \"oslash\", \"oe\", \"germandbls\", \"onesuperior\", \"logicalnot\", \"mu\", \"trademark\", \"Eth\", \"onehalf\", \"plusminus\", \"Thorn\", \"onequarter\", \"divide\", \"brokenbar\", \"degree\", \"thorn\", \"threequarters\", \"twosuperior\", \"registered\", \"minus\", \"eth\", \"multiply\", \"threesuperior\", \"copyright\", \"Aacute\", \"Acircumflex\", \"Adieresis\", \"Agrave\", \"Aring\", \"Atilde\", \"Ccedilla\", \"Eacute\", \"Ecircumflex\", \"Edieresis\", \"Egrave\", \"Iacute\", \"Icircumflex\", \"Idieresis\", \"Igrave\", \"Ntilde\", \"Oacute\", \"Ocircumflex\", \"Odieresis\", \"Ograve\", \"Otilde\", \"Scaron\", \"Uacute\", \"Ucircumflex\", \"Udieresis\", \"Ugrave\", \"Yacute\", \"Ydieresis\", \"Zcaron\", \"aacute\", \"acircumflex\", \"adieresis\", \"agrave\", \"aring\", \"atilde\", \"ccedilla\", \"eacute\", \"ecircumflex\", \"edieresis\", \"egrave\", \"iacute\", \"icircumflex\", \"idieresis\", \"igrave\", \"ntilde\", \"oacute\", \"ocircumflex\", \"odieresis\", \"ograve\", \"otilde\", \"scaron\", \"uacute\", \"ucircumflex\", \"udieresis\", \"ugrave\", \"yacute\", \"ydieresis\", \"zcaron\"];\nexports.ISOAdobeCharset = ISOAdobeCharset;\nconst ExpertCharset = [\".notdef\", \"space\", \"exclamsmall\", \"Hungarumlautsmall\", \"dollaroldstyle\", \"dollarsuperior\", \"ampersandsmall\", \"Acutesmall\", \"parenleftsuperior\", \"parenrightsuperior\", \"twodotenleader\", \"onedotenleader\", \"comma\", \"hyphen\", \"period\", \"fraction\", \"zerooldstyle\", \"oneoldstyle\", \"twooldstyle\", \"threeoldstyle\", \"fouroldstyle\", \"fiveoldstyle\", \"sixoldstyle\", \"sevenoldstyle\", \"eightoldstyle\", \"nineoldstyle\", \"colon\", \"semicolon\", \"commasuperior\", \"threequartersemdash\", \"periodsuperior\", \"questionsmall\", \"asuperior\", \"bsuperior\", \"centsuperior\", \"dsuperior\", \"esuperior\", \"isuperior\", \"lsuperior\", \"msuperior\", \"nsuperior\", \"osuperior\", \"rsuperior\", \"ssuperior\", \"tsuperior\", \"ff\", \"fi\", \"fl\", \"ffi\", \"ffl\", \"parenleftinferior\", \"parenrightinferior\", \"Circumflexsmall\", \"hyphensuperior\", \"Gravesmall\", \"Asmall\", \"Bsmall\", \"Csmall\", \"Dsmall\", \"Esmall\", \"Fsmall\", \"Gsmall\", \"Hsmall\", \"Ismall\", \"Jsmall\", \"Ksmall\", \"Lsmall\", \"Msmall\", \"Nsmall\", \"Osmall\", \"Psmall\", \"Qsmall\", \"Rsmall\", \"Ssmall\", \"Tsmall\", \"Usmall\", \"Vsmall\", \"Wsmall\", \"Xsmall\", \"Ysmall\", \"Zsmall\", \"colonmonetary\", \"onefitted\", \"rupiah\", \"Tildesmall\", \"exclamdownsmall\", \"centoldstyle\", \"Lslashsmall\", \"Scaronsmall\", \"Zcaronsmall\", \"Dieresissmall\", \"Brevesmall\", \"Caronsmall\", \"Dotaccentsmall\", \"Macronsmall\", \"figuredash\", \"hypheninferior\", \"Ogoneksmall\", \"Ringsmall\", \"Cedillasmall\", \"onequarter\", \"onehalf\", \"threequarters\", \"questiondownsmall\", \"oneeighth\", \"threeeighths\", \"fiveeighths\", \"seveneighths\", \"onethird\", \"twothirds\", \"zerosuperior\", \"onesuperior\", \"twosuperior\", \"threesuperior\", \"foursuperior\", \"fivesuperior\", \"sixsuperior\", \"sevensuperior\", \"eightsuperior\", \"ninesuperior\", \"zeroinferior\", \"oneinferior\", \"twoinferior\", \"threeinferior\", \"fourinferior\", \"fiveinferior\", \"sixinferior\", \"seveninferior\", \"eightinferior\", \"nineinferior\", \"centinferior\", \"dollarinferior\", \"periodinferior\", \"commainferior\", \"Agravesmall\", \"Aacutesmall\", \"Acircumflexsmall\", \"Atildesmall\", \"Adieresissmall\", \"Aringsmall\", \"AEsmall\", \"Ccedillasmall\", \"Egravesmall\", \"Eacutesmall\", \"Ecircumflexsmall\", \"Edieresissmall\", \"Igravesmall\", \"Iacutesmall\", \"Icircumflexsmall\", \"Idieresissmall\", \"Ethsmall\", \"Ntildesmall\", \"Ogravesmall\", \"Oacutesmall\", \"Ocircumflexsmall\", \"Otildesmall\", \"Odieresissmall\", \"OEsmall\", \"Oslashsmall\", \"Ugravesmall\", \"Uacutesmall\", \"Ucircumflexsmall\", \"Udieresissmall\", \"Yacutesmall\", \"Thornsmall\", \"Ydieresissmall\"];\nexports.ExpertCharset = ExpertCharset;\nconst ExpertSubsetCharset = [\".notdef\", \"space\", \"dollaroldstyle\", \"dollarsuperior\", \"parenleftsuperior\", \"parenrightsuperior\", \"twodotenleader\", \"onedotenleader\", \"comma\", \"hyphen\", \"period\", \"fraction\", \"zerooldstyle\", \"oneoldstyle\", \"twooldstyle\", \"threeoldstyle\", \"fouroldstyle\", \"fiveoldstyle\", \"sixoldstyle\", \"sevenoldstyle\", \"eightoldstyle\", \"nineoldstyle\", \"colon\", \"semicolon\", \"commasuperior\", \"threequartersemdash\", \"periodsuperior\", \"asuperior\", \"bsuperior\", \"centsuperior\", \"dsuperior\", \"esuperior\", \"isuperior\", \"lsuperior\", \"msuperior\", \"nsuperior\", \"osuperior\", \"rsuperior\", \"ssuperior\", \"tsuperior\", \"ff\", \"fi\", \"fl\", \"ffi\", \"ffl\", \"parenleftinferior\", \"parenrightinferior\", \"hyphensuperior\", \"colonmonetary\", \"onefitted\", \"rupiah\", \"centoldstyle\", \"figuredash\", \"hypheninferior\", \"onequarter\", \"onehalf\", \"threequarters\", \"oneeighth\", \"threeeighths\", \"fiveeighths\", \"seveneighths\", \"onethird\", \"twothirds\", \"zerosuperior\", \"onesuperior\", \"twosuperior\", \"threesuperior\", \"foursuperior\", \"fivesuperior\", \"sixsuperior\", \"sevensuperior\", \"eightsuperior\", \"ninesuperior\", \"zeroinferior\", \"oneinferior\", \"twoinferior\", \"threeinferior\", \"fourinferior\", \"fiveinferior\", \"sixinferior\", \"seveninferior\", \"eightinferior\", \"nineinferior\", \"centinferior\", \"dollarinferior\", \"periodinferior\", \"commainferior\"];\nexports.ExpertSubsetCharset = ExpertSubsetCharset;\n\n/***/ }),\n/* 34 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.getEncoding = getEncoding;\nexports.ZapfDingbatsEncoding = exports.WinAnsiEncoding = exports.SymbolSetEncoding = exports.StandardEncoding = exports.MacRomanEncoding = exports.ExpertEncoding = void 0;\nconst ExpertEncoding = [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"space\", \"exclamsmall\", \"Hungarumlautsmall\", \"\", \"dollaroldstyle\", \"dollarsuperior\", \"ampersandsmall\", \"Acutesmall\", \"parenleftsuperior\", \"parenrightsuperior\", \"twodotenleader\", \"onedotenleader\", \"comma\", \"hyphen\", \"period\", \"fraction\", \"zerooldstyle\", \"oneoldstyle\", \"twooldstyle\", \"threeoldstyle\", \"fouroldstyle\", \"fiveoldstyle\", \"sixoldstyle\", \"sevenoldstyle\", \"eightoldstyle\", \"nineoldstyle\", \"colon\", \"semicolon\", \"commasuperior\", \"threequartersemdash\", \"periodsuperior\", \"questionsmall\", \"\", \"asuperior\", \"bsuperior\", \"centsuperior\", \"dsuperior\", \"esuperior\", \"\", \"\", \"\", \"isuperior\", \"\", \"\", \"lsuperior\", \"msuperior\", \"nsuperior\", \"osuperior\", \"\", \"\", \"rsuperior\", \"ssuperior\", \"tsuperior\", \"\", \"ff\", \"fi\", \"fl\", \"ffi\", \"ffl\", \"parenleftinferior\", \"\", \"parenrightinferior\", \"Circumflexsmall\", \"hyphensuperior\", \"Gravesmall\", \"Asmall\", \"Bsmall\", \"Csmall\", \"Dsmall\", \"Esmall\", \"Fsmall\", \"Gsmall\", \"Hsmall\", \"Ismall\", \"Jsmall\", \"Ksmall\", \"Lsmall\", \"Msmall\", \"Nsmall\", \"Osmall\", \"Psmall\", \"Qsmall\", \"Rsmall\", \"Ssmall\", \"Tsmall\", \"Usmall\", \"Vsmall\", \"Wsmall\", \"Xsmall\", \"Ysmall\", \"Zsmall\", \"colonmonetary\", \"onefitted\", \"rupiah\", \"Tildesmall\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"exclamdownsmall\", \"centoldstyle\", \"Lslashsmall\", \"\", \"\", \"Scaronsmall\", \"Zcaronsmall\", \"Dieresissmall\", \"Brevesmall\", \"Caronsmall\", \"\", \"Dotaccentsmall\", \"\", \"\", \"Macronsmall\", \"\", \"\", \"figuredash\", \"hypheninferior\", \"\", \"\", \"Ogoneksmall\", \"Ringsmall\", \"Cedillasmall\", \"\", \"\", \"\", \"onequarter\", \"onehalf\", \"threequarters\", \"questiondownsmall\", \"oneeighth\", \"threeeighths\", \"fiveeighths\", \"seveneighths\", \"onethird\", \"twothirds\", \"\", \"\", \"zerosuperior\", \"onesuperior\", \"twosuperior\", \"threesuperior\", \"foursuperior\", \"fivesuperior\", \"sixsuperior\", \"sevensuperior\", \"eightsuperior\", \"ninesuperior\", \"zeroinferior\", \"oneinferior\", \"twoinferior\", \"threeinferior\", \"fourinferior\", \"fiveinferior\", \"sixinferior\", \"seveninferior\", \"eightinferior\", \"nineinferior\", \"centinferior\", \"dollarinferior\", \"periodinferior\", \"commainferior\", \"Agravesmall\", \"Aacutesmall\", \"Acircumflexsmall\", \"Atildesmall\", \"Adieresissmall\", \"Aringsmall\", \"AEsmall\", \"Ccedillasmall\", \"Egravesmall\", \"Eacutesmall\", \"Ecircumflexsmall\", \"Edieresissmall\", \"Igravesmall\", \"Iacutesmall\", \"Icircumflexsmall\", \"Idieresissmall\", \"Ethsmall\", \"Ntildesmall\", \"Ogravesmall\", \"Oacutesmall\", \"Ocircumflexsmall\", \"Otildesmall\", \"Odieresissmall\", \"OEsmall\", \"Oslashsmall\", \"Ugravesmall\", \"Uacutesmall\", \"Ucircumflexsmall\", \"Udieresissmall\", \"Yacutesmall\", \"Thornsmall\", \"Ydieresissmall\"];\nexports.ExpertEncoding = ExpertEncoding;\nconst MacExpertEncoding = [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"space\", \"exclamsmall\", \"Hungarumlautsmall\", \"centoldstyle\", \"dollaroldstyle\", \"dollarsuperior\", \"ampersandsmall\", \"Acutesmall\", \"parenleftsuperior\", \"parenrightsuperior\", \"twodotenleader\", \"onedotenleader\", \"comma\", \"hyphen\", \"period\", \"fraction\", \"zerooldstyle\", \"oneoldstyle\", \"twooldstyle\", \"threeoldstyle\", \"fouroldstyle\", \"fiveoldstyle\", \"sixoldstyle\", \"sevenoldstyle\", \"eightoldstyle\", \"nineoldstyle\", \"colon\", \"semicolon\", \"\", \"threequartersemdash\", \"\", \"questionsmall\", \"\", \"\", \"\", \"\", \"Ethsmall\", \"\", \"\", \"onequarter\", \"onehalf\", \"threequarters\", \"oneeighth\", \"threeeighths\", \"fiveeighths\", \"seveneighths\", \"onethird\", \"twothirds\", \"\", \"\", \"\", \"\", \"\", \"\", \"ff\", \"fi\", \"fl\", \"ffi\", \"ffl\", \"parenleftinferior\", \"\", \"parenrightinferior\", \"Circumflexsmall\", \"hypheninferior\", \"Gravesmall\", \"Asmall\", \"Bsmall\", \"Csmall\", \"Dsmall\", \"Esmall\", \"Fsmall\", \"Gsmall\", \"Hsmall\", \"Ismall\", \"Jsmall\", \"Ksmall\", \"Lsmall\", \"Msmall\", \"Nsmall\", \"Osmall\", \"Psmall\", \"Qsmall\", \"Rsmall\", \"Ssmall\", \"Tsmall\", \"Usmall\", \"Vsmall\", \"Wsmall\", \"Xsmall\", \"Ysmall\", \"Zsmall\", \"colonmonetary\", \"onefitted\", \"rupiah\", \"Tildesmall\", \"\", \"\", \"asuperior\", \"centsuperior\", \"\", \"\", \"\", \"\", \"Aacutesmall\", \"Agravesmall\", \"Acircumflexsmall\", \"Adieresissmall\", \"Atildesmall\", \"Aringsmall\", \"Ccedillasmall\", \"Eacutesmall\", \"Egravesmall\", \"Ecircumflexsmall\", \"Edieresissmall\", \"Iacutesmall\", \"Igravesmall\", \"Icircumflexsmall\", \"Idieresissmall\", \"Ntildesmall\", \"Oacutesmall\", \"Ogravesmall\", \"Ocircumflexsmall\", \"Odieresissmall\", \"Otildesmall\", \"Uacutesmall\", \"Ugravesmall\", \"Ucircumflexsmall\", \"Udieresissmall\", \"\", \"eightsuperior\", \"fourinferior\", \"threeinferior\", \"sixinferior\", \"eightinferior\", \"seveninferior\", \"Scaronsmall\", \"\", \"centinferior\", \"twoinferior\", \"\", \"Dieresissmall\", \"\", \"Caronsmall\", \"osuperior\", \"fiveinferior\", \"\", \"commainferior\", \"periodinferior\", \"Yacutesmall\", \"\", \"dollarinferior\", \"\", \"\", \"Thornsmall\", \"\", \"nineinferior\", \"zeroinferior\", \"Zcaronsmall\", \"AEsmall\", \"Oslashsmall\", \"questiondownsmall\", \"oneinferior\", \"Lslashsmall\", \"\", \"\", \"\", \"\", \"\", \"\", \"Cedillasmall\", \"\", \"\", \"\", \"\", \"\", \"OEsmall\", \"figuredash\", \"hyphensuperior\", \"\", \"\", \"\", \"\", \"exclamdownsmall\", \"\", \"Ydieresissmall\", \"\", \"onesuperior\", \"twosuperior\", \"threesuperior\", \"foursuperior\", \"fivesuperior\", \"sixsuperior\", \"sevensuperior\", \"ninesuperior\", \"zerosuperior\", \"\", \"esuperior\", \"rsuperior\", \"tsuperior\", \"\", \"\", \"isuperior\", \"ssuperior\", \"dsuperior\", \"\", \"\", \"\", \"\", \"\", \"lsuperior\", \"Ogoneksmall\", \"Brevesmall\", \"Macronsmall\", \"bsuperior\", \"nsuperior\", \"msuperior\", \"commasuperior\", \"periodsuperior\", \"Dotaccentsmall\", \"Ringsmall\", \"\", \"\", \"\", \"\"];\nconst MacRomanEncoding = [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"space\", \"exclam\", \"quotedbl\", \"numbersign\", \"dollar\", \"percent\", \"ampersand\", \"quotesingle\", \"parenleft\", \"parenright\", \"asterisk\", \"plus\", \"comma\", \"hyphen\", \"period\", \"slash\", \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"colon\", \"semicolon\", \"less\", \"equal\", \"greater\", \"question\", \"at\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\", \"bracketleft\", \"backslash\", \"bracketright\", \"asciicircum\", \"underscore\", \"grave\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\", \"x\", \"y\", \"z\", \"braceleft\", \"bar\", \"braceright\", \"asciitilde\", \"\", \"Adieresis\", \"Aring\", \"Ccedilla\", \"Eacute\", \"Ntilde\", \"Odieresis\", \"Udieresis\", \"aacute\", \"agrave\", \"acircumflex\", \"adieresis\", \"atilde\", \"aring\", \"ccedilla\", \"eacute\", \"egrave\", \"ecircumflex\", \"edieresis\", \"iacute\", \"igrave\", \"icircumflex\", \"idieresis\", \"ntilde\", \"oacute\", \"ograve\", \"ocircumflex\", \"odieresis\", \"otilde\", \"uacute\", \"ugrave\", \"ucircumflex\", \"udieresis\", \"dagger\", \"degree\", \"cent\", \"sterling\", \"section\", \"bullet\", \"paragraph\", \"germandbls\", \"registered\", \"copyright\", \"trademark\", \"acute\", \"dieresis\", \"notequal\", \"AE\", \"Oslash\", \"infinity\", \"plusminus\", \"lessequal\", \"greaterequal\", \"yen\", \"mu\", \"partialdiff\", \"summation\", \"product\", \"pi\", \"integral\", \"ordfeminine\", \"ordmasculine\", \"Omega\", \"ae\", \"oslash\", \"questiondown\", \"exclamdown\", \"logicalnot\", \"radical\", \"florin\", \"approxequal\", \"Delta\", \"guillemotleft\", \"guillemotright\", \"ellipsis\", \"space\", \"Agrave\", \"Atilde\", \"Otilde\", \"OE\", \"oe\", \"endash\", \"emdash\", \"quotedblleft\", \"quotedblright\", \"quoteleft\", \"quoteright\", \"divide\", \"lozenge\", \"ydieresis\", \"Ydieresis\", \"fraction\", \"currency\", \"guilsinglleft\", \"guilsinglright\", \"fi\", \"fl\", \"daggerdbl\", \"periodcentered\", \"quotesinglbase\", \"quotedblbase\", \"perthousand\", \"Acircumflex\", \"Ecircumflex\", \"Aacute\", \"Edieresis\", \"Egrave\", \"Iacute\", \"Icircumflex\", \"Idieresis\", \"Igrave\", \"Oacute\", \"Ocircumflex\", \"apple\", \"Ograve\", \"Uacute\", \"Ucircumflex\", \"Ugrave\", \"dotlessi\", \"circumflex\", \"tilde\", \"macron\", \"breve\", \"dotaccent\", \"ring\", \"cedilla\", \"hungarumlaut\", \"ogonek\", \"caron\"];\nexports.MacRomanEncoding = MacRomanEncoding;\nconst StandardEncoding = [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"space\", \"exclam\", \"quotedbl\", \"numbersign\", \"dollar\", \"percent\", \"ampersand\", \"quoteright\", \"parenleft\", \"parenright\", \"asterisk\", \"plus\", \"comma\", \"hyphen\", \"period\", \"slash\", \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"colon\", \"semicolon\", \"less\", \"equal\", \"greater\", \"question\", \"at\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\", \"bracketleft\", \"backslash\", \"bracketright\", \"asciicircum\", \"underscore\", \"quoteleft\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\", \"x\", \"y\", \"z\", \"braceleft\", \"bar\", \"braceright\", \"asciitilde\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"exclamdown\", \"cent\", \"sterling\", \"fraction\", \"yen\", \"florin\", \"section\", \"currency\", \"quotesingle\", \"quotedblleft\", \"guillemotleft\", \"guilsinglleft\", \"guilsinglright\", \"fi\", \"fl\", \"\", \"endash\", \"dagger\", \"daggerdbl\", \"periodcentered\", \"\", \"paragraph\", \"bullet\", \"quotesinglbase\", \"quotedblbase\", \"quotedblright\", \"guillemotright\", \"ellipsis\", \"perthousand\", \"\", \"questiondown\", \"\", \"grave\", \"acute\", \"circumflex\", \"tilde\", \"macron\", \"breve\", \"dotaccent\", \"dieresis\", \"\", \"ring\", \"cedilla\", \"\", \"hungarumlaut\", \"ogonek\", \"caron\", \"emdash\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"AE\", \"\", \"ordfeminine\", \"\", \"\", \"\", \"\", \"Lslash\", \"Oslash\", \"OE\", \"ordmasculine\", \"\", \"\", \"\", \"\", \"\", \"ae\", \"\", \"\", \"\", \"dotlessi\", \"\", \"\", \"lslash\", \"oslash\", \"oe\", \"germandbls\", \"\", \"\", \"\", \"\"];\nexports.StandardEncoding = StandardEncoding;\nconst WinAnsiEncoding = [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"space\", \"exclam\", \"quotedbl\", \"numbersign\", \"dollar\", \"percent\", \"ampersand\", \"quotesingle\", \"parenleft\", \"parenright\", \"asterisk\", \"plus\", \"comma\", \"hyphen\", \"period\", \"slash\", \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"colon\", \"semicolon\", \"less\", \"equal\", \"greater\", \"question\", \"at\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\", \"bracketleft\", \"backslash\", \"bracketright\", \"asciicircum\", \"underscore\", \"grave\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\", \"x\", \"y\", \"z\", \"braceleft\", \"bar\", \"braceright\", \"asciitilde\", \"bullet\", \"Euro\", \"bullet\", \"quotesinglbase\", \"florin\", \"quotedblbase\", \"ellipsis\", \"dagger\", \"daggerdbl\", \"circumflex\", \"perthousand\", \"Scaron\", \"guilsinglleft\", \"OE\", \"bullet\", \"Zcaron\", \"bullet\", \"bullet\", \"quoteleft\", \"quoteright\", \"quotedblleft\", \"quotedblright\", \"bullet\", \"endash\", \"emdash\", \"tilde\", \"trademark\", \"scaron\", \"guilsinglright\", \"oe\", \"bullet\", \"zcaron\", \"Ydieresis\", \"space\", \"exclamdown\", \"cent\", \"sterling\", \"currency\", \"yen\", \"brokenbar\", \"section\", \"dieresis\", \"copyright\", \"ordfeminine\", \"guillemotleft\", \"logicalnot\", \"hyphen\", \"registered\", \"macron\", \"degree\", \"plusminus\", \"twosuperior\", \"threesuperior\", \"acute\", \"mu\", \"paragraph\", \"periodcentered\", \"cedilla\", \"onesuperior\", \"ordmasculine\", \"guillemotright\", \"onequarter\", \"onehalf\", \"threequarters\", \"questiondown\", \"Agrave\", \"Aacute\", \"Acircumflex\", \"Atilde\", \"Adieresis\", \"Aring\", \"AE\", \"Ccedilla\", \"Egrave\", \"Eacute\", \"Ecircumflex\", \"Edieresis\", \"Igrave\", \"Iacute\", \"Icircumflex\", \"Idieresis\", \"Eth\", \"Ntilde\", \"Ograve\", \"Oacute\", \"Ocircumflex\", \"Otilde\", \"Odieresis\", \"multiply\", \"Oslash\", \"Ugrave\", \"Uacute\", \"Ucircumflex\", \"Udieresis\", \"Yacute\", \"Thorn\", \"germandbls\", \"agrave\", \"aacute\", \"acircumflex\", \"atilde\", \"adieresis\", \"aring\", \"ae\", \"ccedilla\", \"egrave\", \"eacute\", \"ecircumflex\", \"edieresis\", \"igrave\", \"iacute\", \"icircumflex\", \"idieresis\", \"eth\", \"ntilde\", \"ograve\", \"oacute\", \"ocircumflex\", \"otilde\", \"odieresis\", \"divide\", \"oslash\", \"ugrave\", \"uacute\", \"ucircumflex\", \"udieresis\", \"yacute\", \"thorn\", \"ydieresis\"];\nexports.WinAnsiEncoding = WinAnsiEncoding;\nconst SymbolSetEncoding = [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"space\", \"exclam\", \"universal\", \"numbersign\", \"existential\", \"percent\", \"ampersand\", \"suchthat\", \"parenleft\", \"parenright\", \"asteriskmath\", \"plus\", \"comma\", \"minus\", \"period\", \"slash\", \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"colon\", \"semicolon\", \"less\", \"equal\", \"greater\", \"question\", \"congruent\", \"Alpha\", \"Beta\", \"Chi\", \"Delta\", \"Epsilon\", \"Phi\", \"Gamma\", \"Eta\", \"Iota\", \"theta1\", \"Kappa\", \"Lambda\", \"Mu\", \"Nu\", \"Omicron\", \"Pi\", \"Theta\", \"Rho\", \"Sigma\", \"Tau\", \"Upsilon\", \"sigma1\", \"Omega\", \"Xi\", \"Psi\", \"Zeta\", \"bracketleft\", \"therefore\", \"bracketright\", \"perpendicular\", \"underscore\", \"radicalex\", \"alpha\", \"beta\", \"chi\", \"delta\", \"epsilon\", \"phi\", \"gamma\", \"eta\", \"iota\", \"phi1\", \"kappa\", \"lambda\", \"mu\", \"nu\", \"omicron\", \"pi\", \"theta\", \"rho\", \"sigma\", \"tau\", \"upsilon\", \"omega1\", \"omega\", \"xi\", \"psi\", \"zeta\", \"braceleft\", \"bar\", \"braceright\", \"similar\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"Euro\", \"Upsilon1\", \"minute\", \"lessequal\", \"fraction\", \"infinity\", \"florin\", \"club\", \"diamond\", \"heart\", \"spade\", \"arrowboth\", \"arrowleft\", \"arrowup\", \"arrowright\", \"arrowdown\", \"degree\", \"plusminus\", \"second\", \"greaterequal\", \"multiply\", \"proportional\", \"partialdiff\", \"bullet\", \"divide\", \"notequal\", \"equivalence\", \"approxequal\", \"ellipsis\", \"arrowvertex\", \"arrowhorizex\", \"carriagereturn\", \"aleph\", \"Ifraktur\", \"Rfraktur\", \"weierstrass\", \"circlemultiply\", \"circleplus\", \"emptyset\", \"intersection\", \"union\", \"propersuperset\", \"reflexsuperset\", \"notsubset\", \"propersubset\", \"reflexsubset\", \"element\", \"notelement\", \"angle\", \"gradient\", \"registerserif\", \"copyrightserif\", \"trademarkserif\", \"product\", \"radical\", \"dotmath\", \"logicalnot\", \"logicaland\", \"logicalor\", \"arrowdblboth\", \"arrowdblleft\", \"arrowdblup\", \"arrowdblright\", \"arrowdbldown\", \"lozenge\", \"angleleft\", \"registersans\", \"copyrightsans\", \"trademarksans\", \"summation\", \"parenlefttp\", \"parenleftex\", \"parenleftbt\", \"bracketlefttp\", \"bracketleftex\", \"bracketleftbt\", \"bracelefttp\", \"braceleftmid\", \"braceleftbt\", \"braceex\", \"\", \"angleright\", \"integral\", \"integraltp\", \"integralex\", \"integralbt\", \"parenrighttp\", \"parenrightex\", \"parenrightbt\", \"bracketrighttp\", \"bracketrightex\", \"bracketrightbt\", \"bracerighttp\", \"bracerightmid\", \"bracerightbt\", \"\"];\nexports.SymbolSetEncoding = SymbolSetEncoding;\nconst ZapfDingbatsEncoding = [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"space\", \"a1\", \"a2\", \"a202\", \"a3\", \"a4\", \"a5\", \"a119\", \"a118\", \"a117\", \"a11\", \"a12\", \"a13\", \"a14\", \"a15\", \"a16\", \"a105\", \"a17\", \"a18\", \"a19\", \"a20\", \"a21\", \"a22\", \"a23\", \"a24\", \"a25\", \"a26\", \"a27\", \"a28\", \"a6\", \"a7\", \"a8\", \"a9\", \"a10\", \"a29\", \"a30\", \"a31\", \"a32\", \"a33\", \"a34\", \"a35\", \"a36\", \"a37\", \"a38\", \"a39\", \"a40\", \"a41\", \"a42\", \"a43\", \"a44\", \"a45\", \"a46\", \"a47\", \"a48\", \"a49\", \"a50\", \"a51\", \"a52\", \"a53\", \"a54\", \"a55\", \"a56\", \"a57\", \"a58\", \"a59\", \"a60\", \"a61\", \"a62\", \"a63\", \"a64\", \"a65\", \"a66\", \"a67\", \"a68\", \"a69\", \"a70\", \"a71\", \"a72\", \"a73\", \"a74\", \"a203\", \"a75\", \"a204\", \"a76\", \"a77\", \"a78\", \"a79\", \"a81\", \"a82\", \"a83\", \"a84\", \"a97\", \"a98\", \"a99\", \"a100\", \"\", \"a89\", \"a90\", \"a93\", \"a94\", \"a91\", \"a92\", \"a205\", \"a85\", \"a206\", \"a86\", \"a87\", \"a88\", \"a95\", \"a96\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"a101\", \"a102\", \"a103\", \"a104\", \"a106\", \"a107\", \"a108\", \"a112\", \"a111\", \"a110\", \"a109\", \"a120\", \"a121\", \"a122\", \"a123\", \"a124\", \"a125\", \"a126\", \"a127\", \"a128\", \"a129\", \"a130\", \"a131\", \"a132\", \"a133\", \"a134\", \"a135\", \"a136\", \"a137\", \"a138\", \"a139\", \"a140\", \"a141\", \"a142\", \"a143\", \"a144\", \"a145\", \"a146\", \"a147\", \"a148\", \"a149\", \"a150\", \"a151\", \"a152\", \"a153\", \"a154\", \"a155\", \"a156\", \"a157\", \"a158\", \"a159\", \"a160\", \"a161\", \"a163\", \"a164\", \"a196\", \"a165\", \"a192\", \"a166\", \"a167\", \"a168\", \"a169\", \"a170\", \"a171\", \"a172\", \"a173\", \"a162\", \"a174\", \"a175\", \"a176\", \"a177\", \"a178\", \"a179\", \"a193\", \"a180\", \"a199\", \"a181\", \"a200\", \"a182\", \"\", \"a201\", \"a183\", \"a184\", \"a197\", \"a185\", \"a194\", \"a198\", \"a186\", \"a195\", \"a187\", \"a188\", \"a189\", \"a190\", \"a191\", \"\"];\nexports.ZapfDingbatsEncoding = ZapfDingbatsEncoding;\n\nfunction getEncoding(encodingName) {\n  switch (encodingName) {\n    case \"WinAnsiEncoding\":\n      return WinAnsiEncoding;\n\n    case \"StandardEncoding\":\n      return StandardEncoding;\n\n    case \"MacRomanEncoding\":\n      return MacRomanEncoding;\n\n    case \"SymbolSetEncoding\":\n      return SymbolSetEncoding;\n\n    case \"ZapfDingbatsEncoding\":\n      return ZapfDingbatsEncoding;\n\n    case \"ExpertEncoding\":\n      return ExpertEncoding;\n\n    case \"MacExpertEncoding\":\n      return MacExpertEncoding;\n\n    default:\n      return null;\n  }\n}\n\n/***/ }),\n/* 35 */\n/***/ ((__unused_webpack_module, __webpack_exports__, __w_pdfjs_require__) => {\n\n__w_pdfjs_require__.r(__webpack_exports__);\n/* harmony export */ __w_pdfjs_require__.d(__webpack_exports__, {\n/* harmony export */   \"getDingbatsGlyphsUnicode\": () => (/* binding */ getDingbatsGlyphsUnicode),\n/* harmony export */   \"getGlyphsUnicode\": () => (/* binding */ getGlyphsUnicode)\n/* harmony export */ });\n/* harmony import */ var _core_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __w_pdfjs_require__(8);\n\nconst getGlyphsUnicode = (0,_core_utils_js__WEBPACK_IMPORTED_MODULE_0__.getArrayLookupTableFactory)(function () {\n return [\n  \"A\",\n  0x0041,\n  \"AE\",\n  0x00c6,\n  \"AEacute\",\n  0x01fc,\n  \"AEmacron\",\n  0x01e2,\n  \"AEsmall\",\n  0xf7e6,\n  \"Aacute\",\n  0x00c1,\n  \"Aacutesmall\",\n  0xf7e1,\n  \"Abreve\",\n  0x0102,\n  \"Abreveacute\",\n  0x1eae,\n  \"Abrevecyrillic\",\n  0x04d0,\n  \"Abrevedotbelow\",\n  0x1eb6,\n  \"Abrevegrave\",\n  0x1eb0,\n  \"Abrevehookabove\",\n  0x1eb2,\n  \"Abrevetilde\",\n  0x1eb4,\n  \"Acaron\",\n  0x01cd,\n  \"Acircle\",\n  0x24b6,\n  \"Acircumflex\",\n  0x00c2,\n  \"Acircumflexacute\",\n  0x1ea4,\n  \"Acircumflexdotbelow\",\n  0x1eac,\n  \"Acircumflexgrave\",\n  0x1ea6,\n  \"Acircumflexhookabove\",\n  0x1ea8,\n  \"Acircumflexsmall\",\n  0xf7e2,\n  \"Acircumflextilde\",\n  0x1eaa,\n  \"Acute\",\n  0xf6c9,\n  \"Acutesmall\",\n  0xf7b4,\n  \"Acyrillic\",\n  0x0410,\n  \"Adblgrave\",\n  0x0200,\n  \"Adieresis\",\n  0x00c4,\n  \"Adieresiscyrillic\",\n  0x04d2,\n  \"Adieresismacron\",\n  0x01de,\n  \"Adieresissmall\",\n  0xf7e4,\n  \"Adotbelow\",\n  0x1ea0,\n  \"Adotmacron\",\n  0x01e0,\n  \"Agrave\",\n  0x00c0,\n  \"Agravesmall\",\n  0xf7e0,\n  \"Ahookabove\",\n  0x1ea2,\n  \"Aiecyrillic\",\n  0x04d4,\n  \"Ainvertedbreve\",\n  0x0202,\n  \"Alpha\",\n  0x0391,\n  \"Alphatonos\",\n  0x0386,\n  \"Amacron\",\n  0x0100,\n  \"Amonospace\",\n  0xff21,\n  \"Aogonek\",\n  0x0104,\n  \"Aring\",\n  0x00c5,\n  \"Aringacute\",\n  0x01fa,\n  \"Aringbelow\",\n  0x1e00,\n  \"Aringsmall\",\n  0xf7e5,\n  \"Asmall\",\n  0xf761,\n  \"Atilde\",\n  0x00c3,\n  \"Atildesmall\",\n  0xf7e3,\n  \"Aybarmenian\",\n  0x0531,\n  \"B\",\n  0x0042,\n  \"Bcircle\",\n  0x24b7,\n  \"Bdotaccent\",\n  0x1e02,\n  \"Bdotbelow\",\n  0x1e04,\n  \"Becyrillic\",\n  0x0411,\n  \"Benarmenian\",\n  0x0532,\n  \"Beta\",\n  0x0392,\n  \"Bhook\",\n  0x0181,\n  \"Blinebelow\",\n  0x1e06,\n  \"Bmonospace\",\n  0xff22,\n  \"Brevesmall\",\n  0xf6f4,\n  \"Bsmall\",\n  0xf762,\n  \"Btopbar\",\n  0x0182,\n  \"C\",\n  0x0043,\n  \"Caarmenian\",\n  0x053e,\n  \"Cacute\",\n  0x0106,\n  \"Caron\",\n  0xf6ca,\n  \"Caronsmall\",\n  0xf6f5,\n  \"Ccaron\",\n  0x010c,\n  \"Ccedilla\",\n  0x00c7,\n  \"Ccedillaacute\",\n  0x1e08,\n  \"Ccedillasmall\",\n  0xf7e7,\n  \"Ccircle\",\n  0x24b8,\n  \"Ccircumflex\",\n  0x0108,\n  \"Cdot\",\n  0x010a,\n  \"Cdotaccent\",\n  0x010a,\n  \"Cedillasmall\",\n  0xf7b8,\n  \"Chaarmenian\",\n  0x0549,\n  \"Cheabkhasiancyrillic\",\n  0x04bc,\n  \"Checyrillic\",\n  0x0427,\n  \"Chedescenderabkhasiancyrillic\",\n  0x04be,\n  \"Chedescendercyrillic\",\n  0x04b6,\n  \"Chedieresiscyrillic\",\n  0x04f4,\n  \"Cheharmenian\",\n  0x0543,\n  \"Chekhakassiancyrillic\",\n  0x04cb,\n  \"Cheverticalstrokecyrillic\",\n  0x04b8,\n  \"Chi\",\n  0x03a7,\n  \"Chook\",\n  0x0187,\n  \"Circumflexsmall\",\n  0xf6f6,\n  \"Cmonospace\",\n  0xff23,\n  \"Coarmenian\",\n  0x0551,\n  \"Csmall\",\n  0xf763,\n  \"D\",\n  0x0044,\n  \"DZ\",\n  0x01f1,\n  \"DZcaron\",\n  0x01c4,\n  \"Daarmenian\",\n  0x0534,\n  \"Dafrican\",\n  0x0189,\n  \"Dcaron\",\n  0x010e,\n  \"Dcedilla\",\n  0x1e10,\n  \"Dcircle\",\n  0x24b9,\n  \"Dcircumflexbelow\",\n  0x1e12,\n  \"Dcroat\",\n  0x0110,\n  \"Ddotaccent\",\n  0x1e0a,\n  \"Ddotbelow\",\n  0x1e0c,\n  \"Decyrillic\",\n  0x0414,\n  \"Deicoptic\",\n  0x03ee,\n  \"Delta\",\n  0x2206,\n  \"Deltagreek\",\n  0x0394,\n  \"Dhook\",\n  0x018a,\n  \"Dieresis\",\n  0xf6cb,\n  \"DieresisAcute\",\n  0xf6cc,\n  \"DieresisGrave\",\n  0xf6cd,\n  \"Dieresissmall\",\n  0xf7a8,\n  \"Digammagreek\",\n  0x03dc,\n  \"Djecyrillic\",\n  0x0402,\n  \"Dlinebelow\",\n  0x1e0e,\n  \"Dmonospace\",\n  0xff24,\n  \"Dotaccentsmall\",\n  0xf6f7,\n  \"Dslash\",\n  0x0110,\n  \"Dsmall\",\n  0xf764,\n  \"Dtopbar\",\n  0x018b,\n  \"Dz\",\n  0x01f2,\n  \"Dzcaron\",\n  0x01c5,\n  \"Dzeabkhasiancyrillic\",\n  0x04e0,\n  \"Dzecyrillic\",\n  0x0405,\n  \"Dzhecyrillic\",\n  0x040f,\n  \"E\",\n  0x0045,\n  \"Eacute\",\n  0x00c9,\n  \"Eacutesmall\",\n  0xf7e9,\n  \"Ebreve\",\n  0x0114,\n  \"Ecaron\",\n  0x011a,\n  \"Ecedillabreve\",\n  0x1e1c,\n  \"Echarmenian\",\n  0x0535,\n  \"Ecircle\",\n  0x24ba,\n  \"Ecircumflex\",\n  0x00ca,\n  \"Ecircumflexacute\",\n  0x1ebe,\n  \"Ecircumflexbelow\",\n  0x1e18,\n  \"Ecircumflexdotbelow\",\n  0x1ec6,\n  \"Ecircumflexgrave\",\n  0x1ec0,\n  \"Ecircumflexhookabove\",\n  0x1ec2,\n  \"Ecircumflexsmall\",\n  0xf7ea,\n  \"Ecircumflextilde\",\n  0x1ec4,\n  \"Ecyrillic\",\n  0x0404,\n  \"Edblgrave\",\n  0x0204,\n  \"Edieresis\",\n  0x00cb,\n  \"Edieresissmall\",\n  0xf7eb,\n  \"Edot\",\n  0x0116,\n  \"Edotaccent\",\n  0x0116,\n  \"Edotbelow\",\n  0x1eb8,\n  \"Efcyrillic\",\n  0x0424,\n  \"Egrave\",\n  0x00c8,\n  \"Egravesmall\",\n  0xf7e8,\n  \"Eharmenian\",\n  0x0537,\n  \"Ehookabove\",\n  0x1eba,\n  \"Eightroman\",\n  0x2167,\n  \"Einvertedbreve\",\n  0x0206,\n  \"Eiotifiedcyrillic\",\n  0x0464,\n  \"Elcyrillic\",\n  0x041b,\n  \"Elevenroman\",\n  0x216a,\n  \"Emacron\",\n  0x0112,\n  \"Emacronacute\",\n  0x1e16,\n  \"Emacrongrave\",\n  0x1e14,\n  \"Emcyrillic\",\n  0x041c,\n  \"Emonospace\",\n  0xff25,\n  \"Encyrillic\",\n  0x041d,\n  \"Endescendercyrillic\",\n  0x04a2,\n  \"Eng\",\n  0x014a,\n  \"Enghecyrillic\",\n  0x04a4,\n  \"Enhookcyrillic\",\n  0x04c7,\n  \"Eogonek\",\n  0x0118,\n  \"Eopen\",\n  0x0190,\n  \"Epsilon\",\n  0x0395,\n  \"Epsilontonos\",\n  0x0388,\n  \"Ercyrillic\",\n  0x0420,\n  \"Ereversed\",\n  0x018e,\n  \"Ereversedcyrillic\",\n  0x042d,\n  \"Escyrillic\",\n  0x0421,\n  \"Esdescendercyrillic\",\n  0x04aa,\n  \"Esh\",\n  0x01a9,\n  \"Esmall\",\n  0xf765,\n  \"Eta\",\n  0x0397,\n  \"Etarmenian\",\n  0x0538,\n  \"Etatonos\",\n  0x0389,\n  \"Eth\",\n  0x00d0,\n  \"Ethsmall\",\n  0xf7f0,\n  \"Etilde\",\n  0x1ebc,\n  \"Etildebelow\",\n  0x1e1a,\n  \"Euro\",\n  0x20ac,\n  \"Ezh\",\n  0x01b7,\n  \"Ezhcaron\",\n  0x01ee,\n  \"Ezhreversed\",\n  0x01b8,\n  \"F\",\n  0x0046,\n  \"Fcircle\",\n  0x24bb,\n  \"Fdotaccent\",\n  0x1e1e,\n  \"Feharmenian\",\n  0x0556,\n  \"Feicoptic\",\n  0x03e4,\n  \"Fhook\",\n  0x0191,\n  \"Fitacyrillic\",\n  0x0472,\n  \"Fiveroman\",\n  0x2164,\n  \"Fmonospace\",\n  0xff26,\n  \"Fourroman\",\n  0x2163,\n  \"Fsmall\",\n  0xf766,\n  \"G\",\n  0x0047,\n  \"GBsquare\",\n  0x3387,\n  \"Gacute\",\n  0x01f4,\n  \"Gamma\",\n  0x0393,\n  \"Gammaafrican\",\n  0x0194,\n  \"Gangiacoptic\",\n  0x03ea,\n  \"Gbreve\",\n  0x011e,\n  \"Gcaron\",\n  0x01e6,\n  \"Gcedilla\",\n  0x0122,\n  \"Gcircle\",\n  0x24bc,\n  \"Gcircumflex\",\n  0x011c,\n  \"Gcommaaccent\",\n  0x0122,\n  \"Gdot\",\n  0x0120,\n  \"Gdotaccent\",\n  0x0120,\n  \"Gecyrillic\",\n  0x0413,\n  \"Ghadarmenian\",\n  0x0542,\n  \"Ghemiddlehookcyrillic\",\n  0x0494,\n  \"Ghestrokecyrillic\",\n  0x0492,\n  \"Gheupturncyrillic\",\n  0x0490,\n  \"Ghook\",\n  0x0193,\n  \"Gimarmenian\",\n  0x0533,\n  \"Gjecyrillic\",\n  0x0403,\n  \"Gmacron\",\n  0x1e20,\n  \"Gmonospace\",\n  0xff27,\n  \"Grave\",\n  0xf6ce,\n  \"Gravesmall\",\n  0xf760,\n  \"Gsmall\",\n  0xf767,\n  \"Gsmallhook\",\n  0x029b,\n  \"Gstroke\",\n  0x01e4,\n  \"H\",\n  0x0048,\n  \"H18533\",\n  0x25cf,\n  \"H18543\",\n  0x25aa,\n  \"H18551\",\n  0x25ab,\n  \"H22073\",\n  0x25a1,\n  \"HPsquare\",\n  0x33cb,\n  \"Haabkhasiancyrillic\",\n  0x04a8,\n  \"Hadescendercyrillic\",\n  0x04b2,\n  \"Hardsigncyrillic\",\n  0x042a,\n  \"Hbar\",\n  0x0126,\n  \"Hbrevebelow\",\n  0x1e2a,\n  \"Hcedilla\",\n  0x1e28,\n  \"Hcircle\",\n  0x24bd,\n  \"Hcircumflex\",\n  0x0124,\n  \"Hdieresis\",\n  0x1e26,\n  \"Hdotaccent\",\n  0x1e22,\n  \"Hdotbelow\",\n  0x1e24,\n  \"Hmonospace\",\n  0xff28,\n  \"Hoarmenian\",\n  0x0540,\n  \"Horicoptic\",\n  0x03e8,\n  \"Hsmall\",\n  0xf768,\n  \"Hungarumlaut\",\n  0xf6cf,\n  \"Hungarumlautsmall\",\n  0xf6f8,\n  \"Hzsquare\",\n  0x3390,\n  \"I\",\n  0x0049,\n  \"IAcyrillic\",\n  0x042f,\n  \"IJ\",\n  0x0132,\n  \"IUcyrillic\",\n  0x042e,\n  \"Iacute\",\n  0x00cd,\n  \"Iacutesmall\",\n  0xf7ed,\n  \"Ibreve\",\n  0x012c,\n  \"Icaron\",\n  0x01cf,\n  \"Icircle\",\n  0x24be,\n  \"Icircumflex\",\n  0x00ce,\n  \"Icircumflexsmall\",\n  0xf7ee,\n  \"Icyrillic\",\n  0x0406,\n  \"Idblgrave\",\n  0x0208,\n  \"Idieresis\",\n  0x00cf,\n  \"Idieresisacute\",\n  0x1e2e,\n  \"Idieresiscyrillic\",\n  0x04e4,\n  \"Idieresissmall\",\n  0xf7ef,\n  \"Idot\",\n  0x0130,\n  \"Idotaccent\",\n  0x0130,\n  \"Idotbelow\",\n  0x1eca,\n  \"Iebrevecyrillic\",\n  0x04d6,\n  \"Iecyrillic\",\n  0x0415,\n  \"Ifraktur\",\n  0x2111,\n  \"Igrave\",\n  0x00cc,\n  \"Igravesmall\",\n  0xf7ec,\n  \"Ihookabove\",\n  0x1ec8,\n  \"Iicyrillic\",\n  0x0418,\n  \"Iinvertedbreve\",\n  0x020a,\n  \"Iishortcyrillic\",\n  0x0419,\n  \"Imacron\",\n  0x012a,\n  \"Imacroncyrillic\",\n  0x04e2,\n  \"Imonospace\",\n  0xff29,\n  \"Iniarmenian\",\n  0x053b,\n  \"Iocyrillic\",\n  0x0401,\n  \"Iogonek\",\n  0x012e,\n  \"Iota\",\n  0x0399,\n  \"Iotaafrican\",\n  0x0196,\n  \"Iotadieresis\",\n  0x03aa,\n  \"Iotatonos\",\n  0x038a,\n  \"Ismall\",\n  0xf769,\n  \"Istroke\",\n  0x0197,\n  \"Itilde\",\n  0x0128,\n  \"Itildebelow\",\n  0x1e2c,\n  \"Izhitsacyrillic\",\n  0x0474,\n  \"Izhitsadblgravecyrillic\",\n  0x0476,\n  \"J\",\n  0x004a,\n  \"Jaarmenian\",\n  0x0541,\n  \"Jcircle\",\n  0x24bf,\n  \"Jcircumflex\",\n  0x0134,\n  \"Jecyrillic\",\n  0x0408,\n  \"Jheharmenian\",\n  0x054b,\n  \"Jmonospace\",\n  0xff2a,\n  \"Jsmall\",\n  0xf76a,\n  \"K\",\n  0x004b,\n  \"KBsquare\",\n  0x3385,\n  \"KKsquare\",\n  0x33cd,\n  \"Kabashkircyrillic\",\n  0x04a0,\n  \"Kacute\",\n  0x1e30,\n  \"Kacyrillic\",\n  0x041a,\n  \"Kadescendercyrillic\",\n  0x049a,\n  \"Kahookcyrillic\",\n  0x04c3,\n  \"Kappa\",\n  0x039a,\n  \"Kastrokecyrillic\",\n  0x049e,\n  \"Kaverticalstrokecyrillic\",\n  0x049c,\n  \"Kcaron\",\n  0x01e8,\n  \"Kcedilla\",\n  0x0136,\n  \"Kcircle\",\n  0x24c0,\n  \"Kcommaaccent\",\n  0x0136,\n  \"Kdotbelow\",\n  0x1e32,\n  \"Keharmenian\",\n  0x0554,\n  \"Kenarmenian\",\n  0x053f,\n  \"Khacyrillic\",\n  0x0425,\n  \"Kheicoptic\",\n  0x03e6,\n  \"Khook\",\n  0x0198,\n  \"Kjecyrillic\",\n  0x040c,\n  \"Klinebelow\",\n  0x1e34,\n  \"Kmonospace\",\n  0xff2b,\n  \"Koppacyrillic\",\n  0x0480,\n  \"Koppagreek\",\n  0x03de,\n  \"Ksicyrillic\",\n  0x046e,\n  \"Ksmall\",\n  0xf76b,\n  \"L\",\n  0x004c,\n  \"LJ\",\n  0x01c7,\n  \"LL\",\n  0xf6bf,\n  \"Lacute\",\n  0x0139,\n  \"Lambda\",\n  0x039b,\n  \"Lcaron\",\n  0x013d,\n  \"Lcedilla\",\n  0x013b,\n  \"Lcircle\",\n  0x24c1,\n  \"Lcircumflexbelow\",\n  0x1e3c,\n  \"Lcommaaccent\",\n  0x013b,\n  \"Ldot\",\n  0x013f,\n  \"Ldotaccent\",\n  0x013f,\n  \"Ldotbelow\",\n  0x1e36,\n  \"Ldotbelowmacron\",\n  0x1e38,\n  \"Liwnarmenian\",\n  0x053c,\n  \"Lj\",\n  0x01c8,\n  \"Ljecyrillic\",\n  0x0409,\n  \"Llinebelow\",\n  0x1e3a,\n  \"Lmonospace\",\n  0xff2c,\n  \"Lslash\",\n  0x0141,\n  \"Lslashsmall\",\n  0xf6f9,\n  \"Lsmall\",\n  0xf76c,\n  \"M\",\n  0x004d,\n  \"MBsquare\",\n  0x3386,\n  \"Macron\",\n  0xf6d0,\n  \"Macronsmall\",\n  0xf7af,\n  \"Macute\",\n  0x1e3e,\n  \"Mcircle\",\n  0x24c2,\n  \"Mdotaccent\",\n  0x1e40,\n  \"Mdotbelow\",\n  0x1e42,\n  \"Menarmenian\",\n  0x0544,\n  \"Mmonospace\",\n  0xff2d,\n  \"Msmall\",\n  0xf76d,\n  \"Mturned\",\n  0x019c,\n  \"Mu\",\n  0x039c,\n  \"N\",\n  0x004e,\n  \"NJ\",\n  0x01ca,\n  \"Nacute\",\n  0x0143,\n  \"Ncaron\",\n  0x0147,\n  \"Ncedilla\",\n  0x0145,\n  \"Ncircle\",\n  0x24c3,\n  \"Ncircumflexbelow\",\n  0x1e4a,\n  \"Ncommaaccent\",\n  0x0145,\n  \"Ndotaccent\",\n  0x1e44,\n  \"Ndotbelow\",\n  0x1e46,\n  \"Nhookleft\",\n  0x019d,\n  \"Nineroman\",\n  0x2168,\n  \"Nj\",\n  0x01cb,\n  \"Njecyrillic\",\n  0x040a,\n  \"Nlinebelow\",\n  0x1e48,\n  \"Nmonospace\",\n  0xff2e,\n  \"Nowarmenian\",\n  0x0546,\n  \"Nsmall\",\n  0xf76e,\n  \"Ntilde\",\n  0x00d1,\n  \"Ntildesmall\",\n  0xf7f1,\n  \"Nu\",\n  0x039d,\n  \"O\",\n  0x004f,\n  \"OE\",\n  0x0152,\n  \"OEsmall\",\n  0xf6fa,\n  \"Oacute\",\n  0x00d3,\n  \"Oacutesmall\",\n  0xf7f3,\n  \"Obarredcyrillic\",\n  0x04e8,\n  \"Obarreddieresiscyrillic\",\n  0x04ea,\n  \"Obreve\",\n  0x014e,\n  \"Ocaron\",\n  0x01d1,\n  \"Ocenteredtilde\",\n  0x019f,\n  \"Ocircle\",\n  0x24c4,\n  \"Ocircumflex\",\n  0x00d4,\n  \"Ocircumflexacute\",\n  0x1ed0,\n  \"Ocircumflexdotbelow\",\n  0x1ed8,\n  \"Ocircumflexgrave\",\n  0x1ed2,\n  \"Ocircumflexhookabove\",\n  0x1ed4,\n  \"Ocircumflexsmall\",\n  0xf7f4,\n  \"Ocircumflextilde\",\n  0x1ed6,\n  \"Ocyrillic\",\n  0x041e,\n  \"Odblacute\",\n  0x0150,\n  \"Odblgrave\",\n  0x020c,\n  \"Odieresis\",\n  0x00d6,\n  \"Odieresiscyrillic\",\n  0x04e6,\n  \"Odieresissmall\",\n  0xf7f6,\n  \"Odotbelow\",\n  0x1ecc,\n  \"Ogoneksmall\",\n  0xf6fb,\n  \"Ograve\",\n  0x00d2,\n  \"Ogravesmall\",\n  0xf7f2,\n  \"Oharmenian\",\n  0x0555,\n  \"Ohm\",\n  0x2126,\n  \"Ohookabove\",\n  0x1ece,\n  \"Ohorn\",\n  0x01a0,\n  \"Ohornacute\",\n  0x1eda,\n  \"Ohorndotbelow\",\n  0x1ee2,\n  \"Ohorngrave\",\n  0x1edc,\n  \"Ohornhookabove\",\n  0x1ede,\n  \"Ohorntilde\",\n  0x1ee0,\n  \"Ohungarumlaut\",\n  0x0150,\n  \"Oi\",\n  0x01a2,\n  \"Oinvertedbreve\",\n  0x020e,\n  \"Omacron\",\n  0x014c,\n  \"Omacronacute\",\n  0x1e52,\n  \"Omacrongrave\",\n  0x1e50,\n  \"Omega\",\n  0x2126,\n  \"Omegacyrillic\",\n  0x0460,\n  \"Omegagreek\",\n  0x03a9,\n  \"Omegaroundcyrillic\",\n  0x047a,\n  \"Omegatitlocyrillic\",\n  0x047c,\n  \"Omegatonos\",\n  0x038f,\n  \"Omicron\",\n  0x039f,\n  \"Omicrontonos\",\n  0x038c,\n  \"Omonospace\",\n  0xff2f,\n  \"Oneroman\",\n  0x2160,\n  \"Oogonek\",\n  0x01ea,\n  \"Oogonekmacron\",\n  0x01ec,\n  \"Oopen\",\n  0x0186,\n  \"Oslash\",\n  0x00d8,\n  \"Oslashacute\",\n  0x01fe,\n  \"Oslashsmall\",\n  0xf7f8,\n  \"Osmall\",\n  0xf76f,\n  \"Ostrokeacute\",\n  0x01fe,\n  \"Otcyrillic\",\n  0x047e,\n  \"Otilde\",\n  0x00d5,\n  \"Otildeacute\",\n  0x1e4c,\n  \"Otildedieresis\",\n  0x1e4e,\n  \"Otildesmall\",\n  0xf7f5,\n  \"P\",\n  0x0050,\n  \"Pacute\",\n  0x1e54,\n  \"Pcircle\",\n  0x24c5,\n  \"Pdotaccent\",\n  0x1e56,\n  \"Pecyrillic\",\n  0x041f,\n  \"Peharmenian\",\n  0x054a,\n  \"Pemiddlehookcyrillic\",\n  0x04a6,\n  \"Phi\",\n  0x03a6,\n  \"Phook\",\n  0x01a4,\n  \"Pi\",\n  0x03a0,\n  \"Piwrarmenian\",\n  0x0553,\n  \"Pmonospace\",\n  0xff30,\n  \"Psi\",\n  0x03a8,\n  \"Psicyrillic\",\n  0x0470,\n  \"Psmall\",\n  0xf770,\n  \"Q\",\n  0x0051,\n  \"Qcircle\",\n  0x24c6,\n  \"Qmonospace\",\n  0xff31,\n  \"Qsmall\",\n  0xf771,\n  \"R\",\n  0x0052,\n  \"Raarmenian\",\n  0x054c,\n  \"Racute\",\n  0x0154,\n  \"Rcaron\",\n  0x0158,\n  \"Rcedilla\",\n  0x0156,\n  \"Rcircle\",\n  0x24c7,\n  \"Rcommaaccent\",\n  0x0156,\n  \"Rdblgrave\",\n  0x0210,\n  \"Rdotaccent\",\n  0x1e58,\n  \"Rdotbelow\",\n  0x1e5a,\n  \"Rdotbelowmacron\",\n  0x1e5c,\n  \"Reharmenian\",\n  0x0550,\n  \"Rfraktur\",\n  0x211c,\n  \"Rho\",\n  0x03a1,\n  \"Ringsmall\",\n  0xf6fc,\n  \"Rinvertedbreve\",\n  0x0212,\n  \"Rlinebelow\",\n  0x1e5e,\n  \"Rmonospace\",\n  0xff32,\n  \"Rsmall\",\n  0xf772,\n  \"Rsmallinverted\",\n  0x0281,\n  \"Rsmallinvertedsuperior\",\n  0x02b6,\n  \"S\",\n  0x0053,\n  \"SF010000\",\n  0x250c,\n  \"SF020000\",\n  0x2514,\n  \"SF030000\",\n  0x2510,\n  \"SF040000\",\n  0x2518,\n  \"SF050000\",\n  0x253c,\n  \"SF060000\",\n  0x252c,\n  \"SF070000\",\n  0x2534,\n  \"SF080000\",\n  0x251c,\n  \"SF090000\",\n  0x2524,\n  \"SF100000\",\n  0x2500,\n  \"SF110000\",\n  0x2502,\n  \"SF190000\",\n  0x2561,\n  \"SF200000\",\n  0x2562,\n  \"SF210000\",\n  0x2556,\n  \"SF220000\",\n  0x2555,\n  \"SF230000\",\n  0x2563,\n  \"SF240000\",\n  0x2551,\n  \"SF250000\",\n  0x2557,\n  \"SF260000\",\n  0x255d,\n  \"SF270000\",\n  0x255c,\n  \"SF280000\",\n  0x255b,\n  \"SF360000\",\n  0x255e,\n  \"SF370000\",\n  0x255f,\n  \"SF380000\",\n  0x255a,\n  \"SF390000\",\n  0x2554,\n  \"SF400000\",\n  0x2569,\n  \"SF410000\",\n  0x2566,\n  \"SF420000\",\n  0x2560,\n  \"SF430000\",\n  0x2550,\n  \"SF440000\",\n  0x256c,\n  \"SF450000\",\n  0x2567,\n  \"SF460000\",\n  0x2568,\n  \"SF470000\",\n  0x2564,\n  \"SF480000\",\n  0x2565,\n  \"SF490000\",\n  0x2559,\n  \"SF500000\",\n  0x2558,\n  \"SF510000\",\n  0x2552,\n  \"SF520000\",\n  0x2553,\n  \"SF530000\",\n  0x256b,\n  \"SF540000\",\n  0x256a,\n  \"Sacute\",\n  0x015a,\n  \"Sacutedotaccent\",\n  0x1e64,\n  \"Sampigreek\",\n  0x03e0,\n  \"Scaron\",\n  0x0160,\n  \"Scarondotaccent\",\n  0x1e66,\n  \"Scaronsmall\",\n  0xf6fd,\n  \"Scedilla\",\n  0x015e,\n  \"Schwa\",\n  0x018f,\n  \"Schwacyrillic\",\n  0x04d8,\n  \"Schwadieresiscyrillic\",\n  0x04da,\n  \"Scircle\",\n  0x24c8,\n  \"Scircumflex\",\n  0x015c,\n  \"Scommaaccent\",\n  0x0218,\n  \"Sdotaccent\",\n  0x1e60,\n  \"Sdotbelow\",\n  0x1e62,\n  \"Sdotbelowdotaccent\",\n  0x1e68,\n  \"Seharmenian\",\n  0x054d,\n  \"Sevenroman\",\n  0x2166,\n  \"Shaarmenian\",\n  0x0547,\n  \"Shacyrillic\",\n  0x0428,\n  \"Shchacyrillic\",\n  0x0429,\n  \"Sheicoptic\",\n  0x03e2,\n  \"Shhacyrillic\",\n  0x04ba,\n  \"Shimacoptic\",\n  0x03ec,\n  \"Sigma\",\n  0x03a3,\n  \"Sixroman\",\n  0x2165,\n  \"Smonospace\",\n  0xff33,\n  \"Softsigncyrillic\",\n  0x042c,\n  \"Ssmall\",\n  0xf773,\n  \"Stigmagreek\",\n  0x03da,\n  \"T\",\n  0x0054,\n  \"Tau\",\n  0x03a4,\n  \"Tbar\",\n  0x0166,\n  \"Tcaron\",\n  0x0164,\n  \"Tcedilla\",\n  0x0162,\n  \"Tcircle\",\n  0x24c9,\n  \"Tcircumflexbelow\",\n  0x1e70,\n  \"Tcommaaccent\",\n  0x0162,\n  \"Tdotaccent\",\n  0x1e6a,\n  \"Tdotbelow\",\n  0x1e6c,\n  \"Tecyrillic\",\n  0x0422,\n  \"Tedescendercyrillic\",\n  0x04ac,\n  \"Tenroman\",\n  0x2169,\n  \"Tetsecyrillic\",\n  0x04b4,\n  \"Theta\",\n  0x0398,\n  \"Thook\",\n  0x01ac,\n  \"Thorn\",\n  0x00de,\n  \"Thornsmall\",\n  0xf7fe,\n  \"Threeroman\",\n  0x2162,\n  \"Tildesmall\",\n  0xf6fe,\n  \"Tiwnarmenian\",\n  0x054f,\n  \"Tlinebelow\",\n  0x1e6e,\n  \"Tmonospace\",\n  0xff34,\n  \"Toarmenian\",\n  0x0539,\n  \"Tonefive\",\n  0x01bc,\n  \"Tonesix\",\n  0x0184,\n  \"Tonetwo\",\n  0x01a7,\n  \"Tretroflexhook\",\n  0x01ae,\n  \"Tsecyrillic\",\n  0x0426,\n  \"Tshecyrillic\",\n  0x040b,\n  \"Tsmall\",\n  0xf774,\n  \"Twelveroman\",\n  0x216b,\n  \"Tworoman\",\n  0x2161,\n  \"U\",\n  0x0055,\n  \"Uacute\",\n  0x00da,\n  \"Uacutesmall\",\n  0xf7fa,\n  \"Ubreve\",\n  0x016c,\n  \"Ucaron\",\n  0x01d3,\n  \"Ucircle\",\n  0x24ca,\n  \"Ucircumflex\",\n  0x00db,\n  \"Ucircumflexbelow\",\n  0x1e76,\n  \"Ucircumflexsmall\",\n  0xf7fb,\n  \"Ucyrillic\",\n  0x0423,\n  \"Udblacute\",\n  0x0170,\n  \"Udblgrave\",\n  0x0214,\n  \"Udieresis\",\n  0x00dc,\n  \"Udieresisacute\",\n  0x01d7,\n  \"Udieresisbelow\",\n  0x1e72,\n  \"Udieresiscaron\",\n  0x01d9,\n  \"Udieresiscyrillic\",\n  0x04f0,\n  \"Udieresisgrave\",\n  0x01db,\n  \"Udieresismacron\",\n  0x01d5,\n  \"Udieresissmall\",\n  0xf7fc,\n  \"Udotbelow\",\n  0x1ee4,\n  \"Ugrave\",\n  0x00d9,\n  \"Ugravesmall\",\n  0xf7f9,\n  \"Uhookabove\",\n  0x1ee6,\n  \"Uhorn\",\n  0x01af,\n  \"Uhornacute\",\n  0x1ee8,\n  \"Uhorndotbelow\",\n  0x1ef0,\n  \"Uhorngrave\",\n  0x1eea,\n  \"Uhornhookabove\",\n  0x1eec,\n  \"Uhorntilde\",\n  0x1eee,\n  \"Uhungarumlaut\",\n  0x0170,\n  \"Uhungarumlautcyrillic\",\n  0x04f2,\n  \"Uinvertedbreve\",\n  0x0216,\n  \"Ukcyrillic\",\n  0x0478,\n  \"Umacron\",\n  0x016a,\n  \"Umacroncyrillic\",\n  0x04ee,\n  \"Umacrondieresis\",\n  0x1e7a,\n  \"Umonospace\",\n  0xff35,\n  \"Uogonek\",\n  0x0172,\n  \"Upsilon\",\n  0x03a5,\n  \"Upsilon1\",\n  0x03d2,\n  \"Upsilonacutehooksymbolgreek\",\n  0x03d3,\n  \"Upsilonafrican\",\n  0x01b1,\n  \"Upsilondieresis\",\n  0x03ab,\n  \"Upsilondieresishooksymbolgreek\",\n  0x03d4,\n  \"Upsilonhooksymbol\",\n  0x03d2,\n  \"Upsilontonos\",\n  0x038e,\n  \"Uring\",\n  0x016e,\n  \"Ushortcyrillic\",\n  0x040e,\n  \"Usmall\",\n  0xf775,\n  \"Ustraightcyrillic\",\n  0x04ae,\n  \"Ustraightstrokecyrillic\",\n  0x04b0,\n  \"Utilde\",\n  0x0168,\n  \"Utildeacute\",\n  0x1e78,\n  \"Utildebelow\",\n  0x1e74,\n  \"V\",\n  0x0056,\n  \"Vcircle\",\n  0x24cb,\n  \"Vdotbelow\",\n  0x1e7e,\n  \"Vecyrillic\",\n  0x0412,\n  \"Vewarmenian\",\n  0x054e,\n  \"Vhook\",\n  0x01b2,\n  \"Vmonospace\",\n  0xff36,\n  \"Voarmenian\",\n  0x0548,\n  \"Vsmall\",\n  0xf776,\n  \"Vtilde\",\n  0x1e7c,\n  \"W\",\n  0x0057,\n  \"Wacute\",\n  0x1e82,\n  \"Wcircle\",\n  0x24cc,\n  \"Wcircumflex\",\n  0x0174,\n  \"Wdieresis\",\n  0x1e84,\n  \"Wdotaccent\",\n  0x1e86,\n  \"Wdotbelow\",\n  0x1e88,\n  \"Wgrave\",\n  0x1e80,\n  \"Wmonospace\",\n  0xff37,\n  \"Wsmall\",\n  0xf777,\n  \"X\",\n  0x0058,\n  \"Xcircle\",\n  0x24cd,\n  \"Xdieresis\",\n  0x1e8c,\n  \"Xdotaccent\",\n  0x1e8a,\n  \"Xeharmenian\",\n  0x053d,\n  \"Xi\",\n  0x039e,\n  \"Xmonospace\",\n  0xff38,\n  \"Xsmall\",\n  0xf778,\n  \"Y\",\n  0x0059,\n  \"Yacute\",\n  0x00dd,\n  \"Yacutesmall\",\n  0xf7fd,\n  \"Yatcyrillic\",\n  0x0462,\n  \"Ycircle\",\n  0x24ce,\n  \"Ycircumflex\",\n  0x0176,\n  \"Ydieresis\",\n  0x0178,\n  \"Ydieresissmall\",\n  0xf7ff,\n  \"Ydotaccent\",\n  0x1e8e,\n  \"Ydotbelow\",\n  0x1ef4,\n  \"Yericyrillic\",\n  0x042b,\n  \"Yerudieresiscyrillic\",\n  0x04f8,\n  \"Ygrave\",\n  0x1ef2,\n  \"Yhook\",\n  0x01b3,\n  \"Yhookabove\",\n  0x1ef6,\n  \"Yiarmenian\",\n  0x0545,\n  \"Yicyrillic\",\n  0x0407,\n  \"Yiwnarmenian\",\n  0x0552,\n  \"Ymonospace\",\n  0xff39,\n  \"Ysmall\",\n  0xf779,\n  \"Ytilde\",\n  0x1ef8,\n  \"Yusbigcyrillic\",\n  0x046a,\n  \"Yusbigiotifiedcyrillic\",\n  0x046c,\n  \"Yuslittlecyrillic\",\n  0x0466,\n  \"Yuslittleiotifiedcyrillic\",\n  0x0468,\n  \"Z\",\n  0x005a,\n  \"Zaarmenian\",\n  0x0536,\n  \"Zacute\",\n  0x0179,\n  \"Zcaron\",\n  0x017d,\n  \"Zcaronsmall\",\n  0xf6ff,\n  \"Zcircle\",\n  0x24cf,\n  \"Zcircumflex\",\n  0x1e90,\n  \"Zdot\",\n  0x017b,\n  \"Zdotaccent\",\n  0x017b,\n  \"Zdotbelow\",\n  0x1e92,\n  \"Zecyrillic\",\n  0x0417,\n  \"Zedescendercyrillic\",\n  0x0498,\n  \"Zedieresiscyrillic\",\n  0x04de,\n  \"Zeta\",\n  0x0396,\n  \"Zhearmenian\",\n  0x053a,\n  \"Zhebrevecyrillic\",\n  0x04c1,\n  \"Zhecyrillic\",\n  0x0416,\n  \"Zhedescendercyrillic\",\n  0x0496,\n  \"Zhedieresiscyrillic\",\n  0x04dc,\n  \"Zlinebelow\",\n  0x1e94,\n  \"Zmonospace\",\n  0xff3a,\n  \"Zsmall\",\n  0xf77a,\n  \"Zstroke\",\n  0x01b5,\n  \"a\",\n  0x0061,\n  \"aabengali\",\n  0x0986,\n  \"aacute\",\n  0x00e1,\n  \"aadeva\",\n  0x0906,\n  \"aagujarati\",\n  0x0a86,\n  \"aagurmukhi\",\n  0x0a06,\n  \"aamatragurmukhi\",\n  0x0a3e,\n  \"aarusquare\",\n  0x3303,\n  \"aavowelsignbengali\",\n  0x09be,\n  \"aavowelsigndeva\",\n  0x093e,\n  \"aavowelsigngujarati\",\n  0x0abe,\n  \"abbreviationmarkarmenian\",\n  0x055f,\n  \"abbreviationsigndeva\",\n  0x0970,\n  \"abengali\",\n  0x0985,\n  \"abopomofo\",\n  0x311a,\n  \"abreve\",\n  0x0103,\n  \"abreveacute\",\n  0x1eaf,\n  \"abrevecyrillic\",\n  0x04d1,\n  \"abrevedotbelow\",\n  0x1eb7,\n  \"abrevegrave\",\n  0x1eb1,\n  \"abrevehookabove\",\n  0x1eb3,\n  \"abrevetilde\",\n  0x1eb5,\n  \"acaron\",\n  0x01ce,\n  \"acircle\",\n  0x24d0,\n  \"acircumflex\",\n  0x00e2,\n  \"acircumflexacute\",\n  0x1ea5,\n  \"acircumflexdotbelow\",\n  0x1ead,\n  \"acircumflexgrave\",\n  0x1ea7,\n  \"acircumflexhookabove\",\n  0x1ea9,\n  \"acircumflextilde\",\n  0x1eab,\n  \"acute\",\n  0x00b4,\n  \"acutebelowcmb\",\n  0x0317,\n  \"acutecmb\",\n  0x0301,\n  \"acutecomb\",\n  0x0301,\n  \"acutedeva\",\n  0x0954,\n  \"acutelowmod\",\n  0x02cf,\n  \"acutetonecmb\",\n  0x0341,\n  \"acyrillic\",\n  0x0430,\n  \"adblgrave\",\n  0x0201,\n  \"addakgurmukhi\",\n  0x0a71,\n  \"adeva\",\n  0x0905,\n  \"adieresis\",\n  0x00e4,\n  \"adieresiscyrillic\",\n  0x04d3,\n  \"adieresismacron\",\n  0x01df,\n  \"adotbelow\",\n  0x1ea1,\n  \"adotmacron\",\n  0x01e1,\n  \"ae\",\n  0x00e6,\n  \"aeacute\",\n  0x01fd,\n  \"aekorean\",\n  0x3150,\n  \"aemacron\",\n  0x01e3,\n  \"afii00208\",\n  0x2015,\n  \"afii08941\",\n  0x20a4,\n  \"afii10017\",\n  0x0410,\n  \"afii10018\",\n  0x0411,\n  \"afii10019\",\n  0x0412,\n  \"afii10020\",\n  0x0413,\n  \"afii10021\",\n  0x0414,\n  \"afii10022\",\n  0x0415,\n  \"afii10023\",\n  0x0401,\n  \"afii10024\",\n  0x0416,\n  \"afii10025\",\n  0x0417,\n  \"afii10026\",\n  0x0418,\n  \"afii10027\",\n  0x0419,\n  \"afii10028\",\n  0x041a,\n  \"afii10029\",\n  0x041b,\n  \"afii10030\",\n  0x041c,\n  \"afii10031\",\n  0x041d,\n  \"afii10032\",\n  0x041e,\n  \"afii10033\",\n  0x041f,\n  \"afii10034\",\n  0x0420,\n  \"afii10035\",\n  0x0421,\n  \"afii10036\",\n  0x0422,\n  \"afii10037\",\n  0x0423,\n  \"afii10038\",\n  0x0424,\n  \"afii10039\",\n  0x0425,\n  \"afii10040\",\n  0x0426,\n  \"afii10041\",\n  0x0427,\n  \"afii10042\",\n  0x0428,\n  \"afii10043\",\n  0x0429,\n  \"afii10044\",\n  0x042a,\n  \"afii10045\",\n  0x042b,\n  \"afii10046\",\n  0x042c,\n  \"afii10047\",\n  0x042d,\n  \"afii10048\",\n  0x042e,\n  \"afii10049\",\n  0x042f,\n  \"afii10050\",\n  0x0490,\n  \"afii10051\",\n  0x0402,\n  \"afii10052\",\n  0x0403,\n  \"afii10053\",\n  0x0404,\n  \"afii10054\",\n  0x0405,\n  \"afii10055\",\n  0x0406,\n  \"afii10056\",\n  0x0407,\n  \"afii10057\",\n  0x0408,\n  \"afii10058\",\n  0x0409,\n  \"afii10059\",\n  0x040a,\n  \"afii10060\",\n  0x040b,\n  \"afii10061\",\n  0x040c,\n  \"afii10062\",\n  0x040e,\n  \"afii10063\",\n  0xf6c4,\n  \"afii10064\",\n  0xf6c5,\n  \"afii10065\",\n  0x0430,\n  \"afii10066\",\n  0x0431,\n  \"afii10067\",\n  0x0432,\n  \"afii10068\",\n  0x0433,\n  \"afii10069\",\n  0x0434,\n  \"afii10070\",\n  0x0435,\n  \"afii10071\",\n  0x0451,\n  \"afii10072\",\n  0x0436,\n  \"afii10073\",\n  0x0437,\n  \"afii10074\",\n  0x0438,\n  \"afii10075\",\n  0x0439,\n  \"afii10076\",\n  0x043a,\n  \"afii10077\",\n  0x043b,\n  \"afii10078\",\n  0x043c,\n  \"afii10079\",\n  0x043d,\n  \"afii10080\",\n  0x043e,\n  \"afii10081\",\n  0x043f,\n  \"afii10082\",\n  0x0440,\n  \"afii10083\",\n  0x0441,\n  \"afii10084\",\n  0x0442,\n  \"afii10085\",\n  0x0443,\n  \"afii10086\",\n  0x0444,\n  \"afii10087\",\n  0x0445,\n  \"afii10088\",\n  0x0446,\n  \"afii10089\",\n  0x0447,\n  \"afii10090\",\n  0x0448,\n  \"afii10091\",\n  0x0449,\n  \"afii10092\",\n  0x044a,\n  \"afii10093\",\n  0x044b,\n  \"afii10094\",\n  0x044c,\n  \"afii10095\",\n  0x044d,\n  \"afii10096\",\n  0x044e,\n  \"afii10097\",\n  0x044f,\n  \"afii10098\",\n  0x0491,\n  \"afii10099\",\n  0x0452,\n  \"afii10100\",\n  0x0453,\n  \"afii10101\",\n  0x0454,\n  \"afii10102\",\n  0x0455,\n  \"afii10103\",\n  0x0456,\n  \"afii10104\",\n  0x0457,\n  \"afii10105\",\n  0x0458,\n  \"afii10106\",\n  0x0459,\n  \"afii10107\",\n  0x045a,\n  \"afii10108\",\n  0x045b,\n  \"afii10109\",\n  0x045c,\n  \"afii10110\",\n  0x045e,\n  \"afii10145\",\n  0x040f,\n  \"afii10146\",\n  0x0462,\n  \"afii10147\",\n  0x0472,\n  \"afii10148\",\n  0x0474,\n  \"afii10192\",\n  0xf6c6,\n  \"afii10193\",\n  0x045f,\n  \"afii10194\",\n  0x0463,\n  \"afii10195\",\n  0x0473,\n  \"afii10196\",\n  0x0475,\n  \"afii10831\",\n  0xf6c7,\n  \"afii10832\",\n  0xf6c8,\n  \"afii10846\",\n  0x04d9,\n  \"afii299\",\n  0x200e,\n  \"afii300\",\n  0x200f,\n  \"afii301\",\n  0x200d,\n  \"afii57381\",\n  0x066a,\n  \"afii57388\",\n  0x060c,\n  \"afii57392\",\n  0x0660,\n  \"afii57393\",\n  0x0661,\n  \"afii57394\",\n  0x0662,\n  \"afii57395\",\n  0x0663,\n  \"afii57396\",\n  0x0664,\n  \"afii57397\",\n  0x0665,\n  \"afii57398\",\n  0x0666,\n  \"afii57399\",\n  0x0667,\n  \"afii57400\",\n  0x0668,\n  \"afii57401\",\n  0x0669,\n  \"afii57403\",\n  0x061b,\n  \"afii57407\",\n  0x061f,\n  \"afii57409\",\n  0x0621,\n  \"afii57410\",\n  0x0622,\n  \"afii57411\",\n  0x0623,\n  \"afii57412\",\n  0x0624,\n  \"afii57413\",\n  0x0625,\n  \"afii57414\",\n  0x0626,\n  \"afii57415\",\n  0x0627,\n  \"afii57416\",\n  0x0628,\n  \"afii57417\",\n  0x0629,\n  \"afii57418\",\n  0x062a,\n  \"afii57419\",\n  0x062b,\n  \"afii57420\",\n  0x062c,\n  \"afii57421\",\n  0x062d,\n  \"afii57422\",\n  0x062e,\n  \"afii57423\",\n  0x062f,\n  \"afii57424\",\n  0x0630,\n  \"afii57425\",\n  0x0631,\n  \"afii57426\",\n  0x0632,\n  \"afii57427\",\n  0x0633,\n  \"afii57428\",\n  0x0634,\n  \"afii57429\",\n  0x0635,\n  \"afii57430\",\n  0x0636,\n  \"afii57431\",\n  0x0637,\n  \"afii57432\",\n  0x0638,\n  \"afii57433\",\n  0x0639,\n  \"afii57434\",\n  0x063a,\n  \"afii57440\",\n  0x0640,\n  \"afii57441\",\n  0x0641,\n  \"afii57442\",\n  0x0642,\n  \"afii57443\",\n  0x0643,\n  \"afii57444\",\n  0x0644,\n  \"afii57445\",\n  0x0645,\n  \"afii57446\",\n  0x0646,\n  \"afii57448\",\n  0x0648,\n  \"afii57449\",\n  0x0649,\n  \"afii57450\",\n  0x064a,\n  \"afii57451\",\n  0x064b,\n  \"afii57452\",\n  0x064c,\n  \"afii57453\",\n  0x064d,\n  \"afii57454\",\n  0x064e,\n  \"afii57455\",\n  0x064f,\n  \"afii57456\",\n  0x0650,\n  \"afii57457\",\n  0x0651,\n  \"afii57458\",\n  0x0652,\n  \"afii57470\",\n  0x0647,\n  \"afii57505\",\n  0x06a4,\n  \"afii57506\",\n  0x067e,\n  \"afii57507\",\n  0x0686,\n  \"afii57508\",\n  0x0698,\n  \"afii57509\",\n  0x06af,\n  \"afii57511\",\n  0x0679,\n  \"afii57512\",\n  0x0688,\n  \"afii57513\",\n  0x0691,\n  \"afii57514\",\n  0x06ba,\n  \"afii57519\",\n  0x06d2,\n  \"afii57534\",\n  0x06d5,\n  \"afii57636\",\n  0x20aa,\n  \"afii57645\",\n  0x05be,\n  \"afii57658\",\n  0x05c3,\n  \"afii57664\",\n  0x05d0,\n  \"afii57665\",\n  0x05d1,\n  \"afii57666\",\n  0x05d2,\n  \"afii57667\",\n  0x05d3,\n  \"afii57668\",\n  0x05d4,\n  \"afii57669\",\n  0x05d5,\n  \"afii57670\",\n  0x05d6,\n  \"afii57671\",\n  0x05d7,\n  \"afii57672\",\n  0x05d8,\n  \"afii57673\",\n  0x05d9,\n  \"afii57674\",\n  0x05da,\n  \"afii57675\",\n  0x05db,\n  \"afii57676\",\n  0x05dc,\n  \"afii57677\",\n  0x05dd,\n  \"afii57678\",\n  0x05de,\n  \"afii57679\",\n  0x05df,\n  \"afii57680\",\n  0x05e0,\n  \"afii57681\",\n  0x05e1,\n  \"afii57682\",\n  0x05e2,\n  \"afii57683\",\n  0x05e3,\n  \"afii57684\",\n  0x05e4,\n  \"afii57685\",\n  0x05e5,\n  \"afii57686\",\n  0x05e6,\n  \"afii57687\",\n  0x05e7,\n  \"afii57688\",\n  0x05e8,\n  \"afii57689\",\n  0x05e9,\n  \"afii57690\",\n  0x05ea,\n  \"afii57694\",\n  0xfb2a,\n  \"afii57695\",\n  0xfb2b,\n  \"afii57700\",\n  0xfb4b,\n  \"afii57705\",\n  0xfb1f,\n  \"afii57716\",\n  0x05f0,\n  \"afii57717\",\n  0x05f1,\n  \"afii57718\",\n  0x05f2,\n  \"afii57723\",\n  0xfb35,\n  \"afii57793\",\n  0x05b4,\n  \"afii57794\",\n  0x05b5,\n  \"afii57795\",\n  0x05b6,\n  \"afii57796\",\n  0x05bb,\n  \"afii57797\",\n  0x05b8,\n  \"afii57798\",\n  0x05b7,\n  \"afii57799\",\n  0x05b0,\n  \"afii57800\",\n  0x05b2,\n  \"afii57801\",\n  0x05b1,\n  \"afii57802\",\n  0x05b3,\n  \"afii57803\",\n  0x05c2,\n  \"afii57804\",\n  0x05c1,\n  \"afii57806\",\n  0x05b9,\n  \"afii57807\",\n  0x05bc,\n  \"afii57839\",\n  0x05bd,\n  \"afii57841\",\n  0x05bf,\n  \"afii57842\",\n  0x05c0,\n  \"afii57929\",\n  0x02bc,\n  \"afii61248\",\n  0x2105,\n  \"afii61289\",\n  0x2113,\n  \"afii61352\",\n  0x2116,\n  \"afii61573\",\n  0x202c,\n  \"afii61574\",\n  0x202d,\n  \"afii61575\",\n  0x202e,\n  \"afii61664\",\n  0x200c,\n  \"afii63167\",\n  0x066d,\n  \"afii64937\",\n  0x02bd,\n  \"agrave\",\n  0x00e0,\n  \"agujarati\",\n  0x0a85,\n  \"agurmukhi\",\n  0x0a05,\n  \"ahiragana\",\n  0x3042,\n  \"ahookabove\",\n  0x1ea3,\n  \"aibengali\",\n  0x0990,\n  \"aibopomofo\",\n  0x311e,\n  \"aideva\",\n  0x0910,\n  \"aiecyrillic\",\n  0x04d5,\n  \"aigujarati\",\n  0x0a90,\n  \"aigurmukhi\",\n  0x0a10,\n  \"aimatragurmukhi\",\n  0x0a48,\n  \"ainarabic\",\n  0x0639,\n  \"ainfinalarabic\",\n  0xfeca,\n  \"aininitialarabic\",\n  0xfecb,\n  \"ainmedialarabic\",\n  0xfecc,\n  \"ainvertedbreve\",\n  0x0203,\n  \"aivowelsignbengali\",\n  0x09c8,\n  \"aivowelsigndeva\",\n  0x0948,\n  \"aivowelsigngujarati\",\n  0x0ac8,\n  \"akatakana\",\n  0x30a2,\n  \"akatakanahalfwidth\",\n  0xff71,\n  \"akorean\",\n  0x314f,\n  \"alef\",\n  0x05d0,\n  \"alefarabic\",\n  0x0627,\n  \"alefdageshhebrew\",\n  0xfb30,\n  \"aleffinalarabic\",\n  0xfe8e,\n  \"alefhamzaabovearabic\",\n  0x0623,\n  \"alefhamzaabovefinalarabic\",\n  0xfe84,\n  \"alefhamzabelowarabic\",\n  0x0625,\n  \"alefhamzabelowfinalarabic\",\n  0xfe88,\n  \"alefhebrew\",\n  0x05d0,\n  \"aleflamedhebrew\",\n  0xfb4f,\n  \"alefmaddaabovearabic\",\n  0x0622,\n  \"alefmaddaabovefinalarabic\",\n  0xfe82,\n  \"alefmaksuraarabic\",\n  0x0649,\n  \"alefmaksurafinalarabic\",\n  0xfef0,\n  \"alefmaksurainitialarabic\",\n  0xfef3,\n  \"alefmaksuramedialarabic\",\n  0xfef4,\n  \"alefpatahhebrew\",\n  0xfb2e,\n  \"alefqamatshebrew\",\n  0xfb2f,\n  \"aleph\",\n  0x2135,\n  \"allequal\",\n  0x224c,\n  \"alpha\",\n  0x03b1,\n  \"alphatonos\",\n  0x03ac,\n  \"amacron\",\n  0x0101,\n  \"amonospace\",\n  0xff41,\n  \"ampersand\",\n  0x0026,\n  \"ampersandmonospace\",\n  0xff06,\n  \"ampersandsmall\",\n  0xf726,\n  \"amsquare\",\n  0x33c2,\n  \"anbopomofo\",\n  0x3122,\n  \"angbopomofo\",\n  0x3124,\n  \"angbracketleft\",\n  0x3008,\n  \"angbracketright\",\n  0x3009,\n  \"angkhankhuthai\",\n  0x0e5a,\n  \"angle\",\n  0x2220,\n  \"anglebracketleft\",\n  0x3008,\n  \"anglebracketleftvertical\",\n  0xfe3f,\n  \"anglebracketright\",\n  0x3009,\n  \"anglebracketrightvertical\",\n  0xfe40,\n  \"angleleft\",\n  0x2329,\n  \"angleright\",\n  0x232a,\n  \"angstrom\",\n  0x212b,\n  \"anoteleia\",\n  0x0387,\n  \"anudattadeva\",\n  0x0952,\n  \"anusvarabengali\",\n  0x0982,\n  \"anusvaradeva\",\n  0x0902,\n  \"anusvaragujarati\",\n  0x0a82,\n  \"aogonek\",\n  0x0105,\n  \"apaatosquare\",\n  0x3300,\n  \"aparen\",\n  0x249c,\n  \"apostrophearmenian\",\n  0x055a,\n  \"apostrophemod\",\n  0x02bc,\n  \"apple\",\n  0xf8ff,\n  \"approaches\",\n  0x2250,\n  \"approxequal\",\n  0x2248,\n  \"approxequalorimage\",\n  0x2252,\n  \"approximatelyequal\",\n  0x2245,\n  \"araeaekorean\",\n  0x318e,\n  \"araeakorean\",\n  0x318d,\n  \"arc\",\n  0x2312,\n  \"arighthalfring\",\n  0x1e9a,\n  \"aring\",\n  0x00e5,\n  \"aringacute\",\n  0x01fb,\n  \"aringbelow\",\n  0x1e01,\n  \"arrowboth\",\n  0x2194,\n  \"arrowdashdown\",\n  0x21e3,\n  \"arrowdashleft\",\n  0x21e0,\n  \"arrowdashright\",\n  0x21e2,\n  \"arrowdashup\",\n  0x21e1,\n  \"arrowdblboth\",\n  0x21d4,\n  \"arrowdbldown\",\n  0x21d3,\n  \"arrowdblleft\",\n  0x21d0,\n  \"arrowdblright\",\n  0x21d2,\n  \"arrowdblup\",\n  0x21d1,\n  \"arrowdown\",\n  0x2193,\n  \"arrowdownleft\",\n  0x2199,\n  \"arrowdownright\",\n  0x2198,\n  \"arrowdownwhite\",\n  0x21e9,\n  \"arrowheaddownmod\",\n  0x02c5,\n  \"arrowheadleftmod\",\n  0x02c2,\n  \"arrowheadrightmod\",\n  0x02c3,\n  \"arrowheadupmod\",\n  0x02c4,\n  \"arrowhorizex\",\n  0xf8e7,\n  \"arrowleft\",\n  0x2190,\n  \"arrowleftdbl\",\n  0x21d0,\n  \"arrowleftdblstroke\",\n  0x21cd,\n  \"arrowleftoverright\",\n  0x21c6,\n  \"arrowleftwhite\",\n  0x21e6,\n  \"arrowright\",\n  0x2192,\n  \"arrowrightdblstroke\",\n  0x21cf,\n  \"arrowrightheavy\",\n  0x279e,\n  \"arrowrightoverleft\",\n  0x21c4,\n  \"arrowrightwhite\",\n  0x21e8,\n  \"arrowtableft\",\n  0x21e4,\n  \"arrowtabright\",\n  0x21e5,\n  \"arrowup\",\n  0x2191,\n  \"arrowupdn\",\n  0x2195,\n  \"arrowupdnbse\",\n  0x21a8,\n  \"arrowupdownbase\",\n  0x21a8,\n  \"arrowupleft\",\n  0x2196,\n  \"arrowupleftofdown\",\n  0x21c5,\n  \"arrowupright\",\n  0x2197,\n  \"arrowupwhite\",\n  0x21e7,\n  \"arrowvertex\",\n  0xf8e6,\n  \"asciicircum\",\n  0x005e,\n  \"asciicircummonospace\",\n  0xff3e,\n  \"asciitilde\",\n  0x007e,\n  \"asciitildemonospace\",\n  0xff5e,\n  \"ascript\",\n  0x0251,\n  \"ascriptturned\",\n  0x0252,\n  \"asmallhiragana\",\n  0x3041,\n  \"asmallkatakana\",\n  0x30a1,\n  \"asmallkatakanahalfwidth\",\n  0xff67,\n  \"asterisk\",\n  0x002a,\n  \"asteriskaltonearabic\",\n  0x066d,\n  \"asteriskarabic\",\n  0x066d,\n  \"asteriskmath\",\n  0x2217,\n  \"asteriskmonospace\",\n  0xff0a,\n  \"asterisksmall\",\n  0xfe61,\n  \"asterism\",\n  0x2042,\n  \"asuperior\",\n  0xf6e9,\n  \"asymptoticallyequal\",\n  0x2243,\n  \"at\",\n  0x0040,\n  \"atilde\",\n  0x00e3,\n  \"atmonospace\",\n  0xff20,\n  \"atsmall\",\n  0xfe6b,\n  \"aturned\",\n  0x0250,\n  \"aubengali\",\n  0x0994,\n  \"aubopomofo\",\n  0x3120,\n  \"audeva\",\n  0x0914,\n  \"augujarati\",\n  0x0a94,\n  \"augurmukhi\",\n  0x0a14,\n  \"aulengthmarkbengali\",\n  0x09d7,\n  \"aumatragurmukhi\",\n  0x0a4c,\n  \"auvowelsignbengali\",\n  0x09cc,\n  \"auvowelsigndeva\",\n  0x094c,\n  \"auvowelsigngujarati\",\n  0x0acc,\n  \"avagrahadeva\",\n  0x093d,\n  \"aybarmenian\",\n  0x0561,\n  \"ayin\",\n  0x05e2,\n  \"ayinaltonehebrew\",\n  0xfb20,\n  \"ayinhebrew\",\n  0x05e2,\n  \"b\",\n  0x0062,\n  \"babengali\",\n  0x09ac,\n  \"backslash\",\n  0x005c,\n  \"backslashmonospace\",\n  0xff3c,\n  \"badeva\",\n  0x092c,\n  \"bagujarati\",\n  0x0aac,\n  \"bagurmukhi\",\n  0x0a2c,\n  \"bahiragana\",\n  0x3070,\n  \"bahtthai\",\n  0x0e3f,\n  \"bakatakana\",\n  0x30d0,\n  \"bar\",\n  0x007c,\n  \"barmonospace\",\n  0xff5c,\n  \"bbopomofo\",\n  0x3105,\n  \"bcircle\",\n  0x24d1,\n  \"bdotaccent\",\n  0x1e03,\n  \"bdotbelow\",\n  0x1e05,\n  \"beamedsixteenthnotes\",\n  0x266c,\n  \"because\",\n  0x2235,\n  \"becyrillic\",\n  0x0431,\n  \"beharabic\",\n  0x0628,\n  \"behfinalarabic\",\n  0xfe90,\n  \"behinitialarabic\",\n  0xfe91,\n  \"behiragana\",\n  0x3079,\n  \"behmedialarabic\",\n  0xfe92,\n  \"behmeeminitialarabic\",\n  0xfc9f,\n  \"behmeemisolatedarabic\",\n  0xfc08,\n  \"behnoonfinalarabic\",\n  0xfc6d,\n  \"bekatakana\",\n  0x30d9,\n  \"benarmenian\",\n  0x0562,\n  \"bet\",\n  0x05d1,\n  \"beta\",\n  0x03b2,\n  \"betasymbolgreek\",\n  0x03d0,\n  \"betdagesh\",\n  0xfb31,\n  \"betdageshhebrew\",\n  0xfb31,\n  \"bethebrew\",\n  0x05d1,\n  \"betrafehebrew\",\n  0xfb4c,\n  \"bhabengali\",\n  0x09ad,\n  \"bhadeva\",\n  0x092d,\n  \"bhagujarati\",\n  0x0aad,\n  \"bhagurmukhi\",\n  0x0a2d,\n  \"bhook\",\n  0x0253,\n  \"bihiragana\",\n  0x3073,\n  \"bikatakana\",\n  0x30d3,\n  \"bilabialclick\",\n  0x0298,\n  \"bindigurmukhi\",\n  0x0a02,\n  \"birusquare\",\n  0x3331,\n  \"blackcircle\",\n  0x25cf,\n  \"blackdiamond\",\n  0x25c6,\n  \"blackdownpointingtriangle\",\n  0x25bc,\n  \"blackleftpointingpointer\",\n  0x25c4,\n  \"blackleftpointingtriangle\",\n  0x25c0,\n  \"blacklenticularbracketleft\",\n  0x3010,\n  \"blacklenticularbracketleftvertical\",\n  0xfe3b,\n  \"blacklenticularbracketright\",\n  0x3011,\n  \"blacklenticularbracketrightvertical\",\n  0xfe3c,\n  \"blacklowerlefttriangle\",\n  0x25e3,\n  \"blacklowerrighttriangle\",\n  0x25e2,\n  \"blackrectangle\",\n  0x25ac,\n  \"blackrightpointingpointer\",\n  0x25ba,\n  \"blackrightpointingtriangle\",\n  0x25b6,\n  \"blacksmallsquare\",\n  0x25aa,\n  \"blacksmilingface\",\n  0x263b,\n  \"blacksquare\",\n  0x25a0,\n  \"blackstar\",\n  0x2605,\n  \"blackupperlefttriangle\",\n  0x25e4,\n  \"blackupperrighttriangle\",\n  0x25e5,\n  \"blackuppointingsmalltriangle\",\n  0x25b4,\n  \"blackuppointingtriangle\",\n  0x25b2,\n  \"blank\",\n  0x2423,\n  \"blinebelow\",\n  0x1e07,\n  \"block\",\n  0x2588,\n  \"bmonospace\",\n  0xff42,\n  \"bobaimaithai\",\n  0x0e1a,\n  \"bohiragana\",\n  0x307c,\n  \"bokatakana\",\n  0x30dc,\n  \"bparen\",\n  0x249d,\n  \"bqsquare\",\n  0x33c3,\n  \"braceex\",\n  0xf8f4,\n  \"braceleft\",\n  0x007b,\n  \"braceleftbt\",\n  0xf8f3,\n  \"braceleftmid\",\n  0xf8f2,\n  \"braceleftmonospace\",\n  0xff5b,\n  \"braceleftsmall\",\n  0xfe5b,\n  \"bracelefttp\",\n  0xf8f1,\n  \"braceleftvertical\",\n  0xfe37,\n  \"braceright\",\n  0x007d,\n  \"bracerightbt\",\n  0xf8fe,\n  \"bracerightmid\",\n  0xf8fd,\n  \"bracerightmonospace\",\n  0xff5d,\n  \"bracerightsmall\",\n  0xfe5c,\n  \"bracerighttp\",\n  0xf8fc,\n  \"bracerightvertical\",\n  0xfe38,\n  \"bracketleft\",\n  0x005b,\n  \"bracketleftbt\",\n  0xf8f0,\n  \"bracketleftex\",\n  0xf8ef,\n  \"bracketleftmonospace\",\n  0xff3b,\n  \"bracketlefttp\",\n  0xf8ee,\n  \"bracketright\",\n  0x005d,\n  \"bracketrightbt\",\n  0xf8fb,\n  \"bracketrightex\",\n  0xf8fa,\n  \"bracketrightmonospace\",\n  0xff3d,\n  \"bracketrighttp\",\n  0xf8f9,\n  \"breve\",\n  0x02d8,\n  \"brevebelowcmb\",\n  0x032e,\n  \"brevecmb\",\n  0x0306,\n  \"breveinvertedbelowcmb\",\n  0x032f,\n  \"breveinvertedcmb\",\n  0x0311,\n  \"breveinverteddoublecmb\",\n  0x0361,\n  \"bridgebelowcmb\",\n  0x032a,\n  \"bridgeinvertedbelowcmb\",\n  0x033a,\n  \"brokenbar\",\n  0x00a6,\n  \"bstroke\",\n  0x0180,\n  \"bsuperior\",\n  0xf6ea,\n  \"btopbar\",\n  0x0183,\n  \"buhiragana\",\n  0x3076,\n  \"bukatakana\",\n  0x30d6,\n  \"bullet\",\n  0x2022,\n  \"bulletinverse\",\n  0x25d8,\n  \"bulletoperator\",\n  0x2219,\n  \"bullseye\",\n  0x25ce,\n  \"c\",\n  0x0063,\n  \"caarmenian\",\n  0x056e,\n  \"cabengali\",\n  0x099a,\n  \"cacute\",\n  0x0107,\n  \"cadeva\",\n  0x091a,\n  \"cagujarati\",\n  0x0a9a,\n  \"cagurmukhi\",\n  0x0a1a,\n  \"calsquare\",\n  0x3388,\n  \"candrabindubengali\",\n  0x0981,\n  \"candrabinducmb\",\n  0x0310,\n  \"candrabindudeva\",\n  0x0901,\n  \"candrabindugujarati\",\n  0x0a81,\n  \"capslock\",\n  0x21ea,\n  \"careof\",\n  0x2105,\n  \"caron\",\n  0x02c7,\n  \"caronbelowcmb\",\n  0x032c,\n  \"caroncmb\",\n  0x030c,\n  \"carriagereturn\",\n  0x21b5,\n  \"cbopomofo\",\n  0x3118,\n  \"ccaron\",\n  0x010d,\n  \"ccedilla\",\n  0x00e7,\n  \"ccedillaacute\",\n  0x1e09,\n  \"ccircle\",\n  0x24d2,\n  \"ccircumflex\",\n  0x0109,\n  \"ccurl\",\n  0x0255,\n  \"cdot\",\n  0x010b,\n  \"cdotaccent\",\n  0x010b,\n  \"cdsquare\",\n  0x33c5,\n  \"cedilla\",\n  0x00b8,\n  \"cedillacmb\",\n  0x0327,\n  \"cent\",\n  0x00a2,\n  \"centigrade\",\n  0x2103,\n  \"centinferior\",\n  0xf6df,\n  \"centmonospace\",\n  0xffe0,\n  \"centoldstyle\",\n  0xf7a2,\n  \"centsuperior\",\n  0xf6e0,\n  \"chaarmenian\",\n  0x0579,\n  \"chabengali\",\n  0x099b,\n  \"chadeva\",\n  0x091b,\n  \"chagujarati\",\n  0x0a9b,\n  \"chagurmukhi\",\n  0x0a1b,\n  \"chbopomofo\",\n  0x3114,\n  \"cheabkhasiancyrillic\",\n  0x04bd,\n  \"checkmark\",\n  0x2713,\n  \"checyrillic\",\n  0x0447,\n  \"chedescenderabkhasiancyrillic\",\n  0x04bf,\n  \"chedescendercyrillic\",\n  0x04b7,\n  \"chedieresiscyrillic\",\n  0x04f5,\n  \"cheharmenian\",\n  0x0573,\n  \"chekhakassiancyrillic\",\n  0x04cc,\n  \"cheverticalstrokecyrillic\",\n  0x04b9,\n  \"chi\",\n  0x03c7,\n  \"chieuchacirclekorean\",\n  0x3277,\n  \"chieuchaparenkorean\",\n  0x3217,\n  \"chieuchcirclekorean\",\n  0x3269,\n  \"chieuchkorean\",\n  0x314a,\n  \"chieuchparenkorean\",\n  0x3209,\n  \"chochangthai\",\n  0x0e0a,\n  \"chochanthai\",\n  0x0e08,\n  \"chochingthai\",\n  0x0e09,\n  \"chochoethai\",\n  0x0e0c,\n  \"chook\",\n  0x0188,\n  \"cieucacirclekorean\",\n  0x3276,\n  \"cieucaparenkorean\",\n  0x3216,\n  \"cieuccirclekorean\",\n  0x3268,\n  \"cieuckorean\",\n  0x3148,\n  \"cieucparenkorean\",\n  0x3208,\n  \"cieucuparenkorean\",\n  0x321c,\n  \"circle\",\n  0x25cb,\n  \"circlecopyrt\",\n  0x00a9,\n  \"circlemultiply\",\n  0x2297,\n  \"circleot\",\n  0x2299,\n  \"circleplus\",\n  0x2295,\n  \"circlepostalmark\",\n  0x3036,\n  \"circlewithlefthalfblack\",\n  0x25d0,\n  \"circlewithrighthalfblack\",\n  0x25d1,\n  \"circumflex\",\n  0x02c6,\n  \"circumflexbelowcmb\",\n  0x032d,\n  \"circumflexcmb\",\n  0x0302,\n  \"clear\",\n  0x2327,\n  \"clickalveolar\",\n  0x01c2,\n  \"clickdental\",\n  0x01c0,\n  \"clicklateral\",\n  0x01c1,\n  \"clickretroflex\",\n  0x01c3,\n  \"club\",\n  0x2663,\n  \"clubsuitblack\",\n  0x2663,\n  \"clubsuitwhite\",\n  0x2667,\n  \"cmcubedsquare\",\n  0x33a4,\n  \"cmonospace\",\n  0xff43,\n  \"cmsquaredsquare\",\n  0x33a0,\n  \"coarmenian\",\n  0x0581,\n  \"colon\",\n  0x003a,\n  \"colonmonetary\",\n  0x20a1,\n  \"colonmonospace\",\n  0xff1a,\n  \"colonsign\",\n  0x20a1,\n  \"colonsmall\",\n  0xfe55,\n  \"colontriangularhalfmod\",\n  0x02d1,\n  \"colontriangularmod\",\n  0x02d0,\n  \"comma\",\n  0x002c,\n  \"commaabovecmb\",\n  0x0313,\n  \"commaaboverightcmb\",\n  0x0315,\n  \"commaaccent\",\n  0xf6c3,\n  \"commaarabic\",\n  0x060c,\n  \"commaarmenian\",\n  0x055d,\n  \"commainferior\",\n  0xf6e1,\n  \"commamonospace\",\n  0xff0c,\n  \"commareversedabovecmb\",\n  0x0314,\n  \"commareversedmod\",\n  0x02bd,\n  \"commasmall\",\n  0xfe50,\n  \"commasuperior\",\n  0xf6e2,\n  \"commaturnedabovecmb\",\n  0x0312,\n  \"commaturnedmod\",\n  0x02bb,\n  \"compass\",\n  0x263c,\n  \"congruent\",\n  0x2245,\n  \"contourintegral\",\n  0x222e,\n  \"control\",\n  0x2303,\n  \"controlACK\",\n  0x0006,\n  \"controlBEL\",\n  0x0007,\n  \"controlBS\",\n  0x0008,\n  \"controlCAN\",\n  0x0018,\n  \"controlCR\",\n  0x000d,\n  \"controlDC1\",\n  0x0011,\n  \"controlDC2\",\n  0x0012,\n  \"controlDC3\",\n  0x0013,\n  \"controlDC4\",\n  0x0014,\n  \"controlDEL\",\n  0x007f,\n  \"controlDLE\",\n  0x0010,\n  \"controlEM\",\n  0x0019,\n  \"controlENQ\",\n  0x0005,\n  \"controlEOT\",\n  0x0004,\n  \"controlESC\",\n  0x001b,\n  \"controlETB\",\n  0x0017,\n  \"controlETX\",\n  0x0003,\n  \"controlFF\",\n  0x000c,\n  \"controlFS\",\n  0x001c,\n  \"controlGS\",\n  0x001d,\n  \"controlHT\",\n  0x0009,\n  \"controlLF\",\n  0x000a,\n  \"controlNAK\",\n  0x0015,\n  \"controlNULL\",\n  0x0000,\n  \"controlRS\",\n  0x001e,\n  \"controlSI\",\n  0x000f,\n  \"controlSO\",\n  0x000e,\n  \"controlSOT\",\n  0x0002,\n  \"controlSTX\",\n  0x0001,\n  \"controlSUB\",\n  0x001a,\n  \"controlSYN\",\n  0x0016,\n  \"controlUS\",\n  0x001f,\n  \"controlVT\",\n  0x000b,\n  \"copyright\",\n  0x00a9,\n  \"copyrightsans\",\n  0xf8e9,\n  \"copyrightserif\",\n  0xf6d9,\n  \"cornerbracketleft\",\n  0x300c,\n  \"cornerbracketlefthalfwidth\",\n  0xff62,\n  \"cornerbracketleftvertical\",\n  0xfe41,\n  \"cornerbracketright\",\n  0x300d,\n  \"cornerbracketrighthalfwidth\",\n  0xff63,\n  \"cornerbracketrightvertical\",\n  0xfe42,\n  \"corporationsquare\",\n  0x337f,\n  \"cosquare\",\n  0x33c7,\n  \"coverkgsquare\",\n  0x33c6,\n  \"cparen\",\n  0x249e,\n  \"cruzeiro\",\n  0x20a2,\n  \"cstretched\",\n  0x0297,\n  \"curlyand\",\n  0x22cf,\n  \"curlyor\",\n  0x22ce,\n  \"currency\",\n  0x00a4,\n  \"cyrBreve\",\n  0xf6d1,\n  \"cyrFlex\",\n  0xf6d2,\n  \"cyrbreve\",\n  0xf6d4,\n  \"cyrflex\",\n  0xf6d5,\n  \"d\",\n  0x0064,\n  \"daarmenian\",\n  0x0564,\n  \"dabengali\",\n  0x09a6,\n  \"dadarabic\",\n  0x0636,\n  \"dadeva\",\n  0x0926,\n  \"dadfinalarabic\",\n  0xfebe,\n  \"dadinitialarabic\",\n  0xfebf,\n  \"dadmedialarabic\",\n  0xfec0,\n  \"dagesh\",\n  0x05bc,\n  \"dageshhebrew\",\n  0x05bc,\n  \"dagger\",\n  0x2020,\n  \"daggerdbl\",\n  0x2021,\n  \"dagujarati\",\n  0x0aa6,\n  \"dagurmukhi\",\n  0x0a26,\n  \"dahiragana\",\n  0x3060,\n  \"dakatakana\",\n  0x30c0,\n  \"dalarabic\",\n  0x062f,\n  \"dalet\",\n  0x05d3,\n  \"daletdagesh\",\n  0xfb33,\n  \"daletdageshhebrew\",\n  0xfb33,\n  \"dalethebrew\",\n  0x05d3,\n  \"dalfinalarabic\",\n  0xfeaa,\n  \"dammaarabic\",\n  0x064f,\n  \"dammalowarabic\",\n  0x064f,\n  \"dammatanaltonearabic\",\n  0x064c,\n  \"dammatanarabic\",\n  0x064c,\n  \"danda\",\n  0x0964,\n  \"dargahebrew\",\n  0x05a7,\n  \"dargalefthebrew\",\n  0x05a7,\n  \"dasiapneumatacyrilliccmb\",\n  0x0485,\n  \"dblGrave\",\n  0xf6d3,\n  \"dblanglebracketleft\",\n  0x300a,\n  \"dblanglebracketleftvertical\",\n  0xfe3d,\n  \"dblanglebracketright\",\n  0x300b,\n  \"dblanglebracketrightvertical\",\n  0xfe3e,\n  \"dblarchinvertedbelowcmb\",\n  0x032b,\n  \"dblarrowleft\",\n  0x21d4,\n  \"dblarrowright\",\n  0x21d2,\n  \"dbldanda\",\n  0x0965,\n  \"dblgrave\",\n  0xf6d6,\n  \"dblgravecmb\",\n  0x030f,\n  \"dblintegral\",\n  0x222c,\n  \"dbllowline\",\n  0x2017,\n  \"dbllowlinecmb\",\n  0x0333,\n  \"dbloverlinecmb\",\n  0x033f,\n  \"dblprimemod\",\n  0x02ba,\n  \"dblverticalbar\",\n  0x2016,\n  \"dblverticallineabovecmb\",\n  0x030e,\n  \"dbopomofo\",\n  0x3109,\n  \"dbsquare\",\n  0x33c8,\n  \"dcaron\",\n  0x010f,\n  \"dcedilla\",\n  0x1e11,\n  \"dcircle\",\n  0x24d3,\n  \"dcircumflexbelow\",\n  0x1e13,\n  \"dcroat\",\n  0x0111,\n  \"ddabengali\",\n  0x09a1,\n  \"ddadeva\",\n  0x0921,\n  \"ddagujarati\",\n  0x0aa1,\n  \"ddagurmukhi\",\n  0x0a21,\n  \"ddalarabic\",\n  0x0688,\n  \"ddalfinalarabic\",\n  0xfb89,\n  \"dddhadeva\",\n  0x095c,\n  \"ddhabengali\",\n  0x09a2,\n  \"ddhadeva\",\n  0x0922,\n  \"ddhagujarati\",\n  0x0aa2,\n  \"ddhagurmukhi\",\n  0x0a22,\n  \"ddotaccent\",\n  0x1e0b,\n  \"ddotbelow\",\n  0x1e0d,\n  \"decimalseparatorarabic\",\n  0x066b,\n  \"decimalseparatorpersian\",\n  0x066b,\n  \"decyrillic\",\n  0x0434,\n  \"degree\",\n  0x00b0,\n  \"dehihebrew\",\n  0x05ad,\n  \"dehiragana\",\n  0x3067,\n  \"deicoptic\",\n  0x03ef,\n  \"dekatakana\",\n  0x30c7,\n  \"deleteleft\",\n  0x232b,\n  \"deleteright\",\n  0x2326,\n  \"delta\",\n  0x03b4,\n  \"deltaturned\",\n  0x018d,\n  \"denominatorminusonenumeratorbengali\",\n  0x09f8,\n  \"dezh\",\n  0x02a4,\n  \"dhabengali\",\n  0x09a7,\n  \"dhadeva\",\n  0x0927,\n  \"dhagujarati\",\n  0x0aa7,\n  \"dhagurmukhi\",\n  0x0a27,\n  \"dhook\",\n  0x0257,\n  \"dialytikatonos\",\n  0x0385,\n  \"dialytikatonoscmb\",\n  0x0344,\n  \"diamond\",\n  0x2666,\n  \"diamondsuitwhite\",\n  0x2662,\n  \"dieresis\",\n  0x00a8,\n  \"dieresisacute\",\n  0xf6d7,\n  \"dieresisbelowcmb\",\n  0x0324,\n  \"dieresiscmb\",\n  0x0308,\n  \"dieresisgrave\",\n  0xf6d8,\n  \"dieresistonos\",\n  0x0385,\n  \"dihiragana\",\n  0x3062,\n  \"dikatakana\",\n  0x30c2,\n  \"dittomark\",\n  0x3003,\n  \"divide\",\n  0x00f7,\n  \"divides\",\n  0x2223,\n  \"divisionslash\",\n  0x2215,\n  \"djecyrillic\",\n  0x0452,\n  \"dkshade\",\n  0x2593,\n  \"dlinebelow\",\n  0x1e0f,\n  \"dlsquare\",\n  0x3397,\n  \"dmacron\",\n  0x0111,\n  \"dmonospace\",\n  0xff44,\n  \"dnblock\",\n  0x2584,\n  \"dochadathai\",\n  0x0e0e,\n  \"dodekthai\",\n  0x0e14,\n  \"dohiragana\",\n  0x3069,\n  \"dokatakana\",\n  0x30c9,\n  \"dollar\",\n  0x0024,\n  \"dollarinferior\",\n  0xf6e3,\n  \"dollarmonospace\",\n  0xff04,\n  \"dollaroldstyle\",\n  0xf724,\n  \"dollarsmall\",\n  0xfe69,\n  \"dollarsuperior\",\n  0xf6e4,\n  \"dong\",\n  0x20ab,\n  \"dorusquare\",\n  0x3326,\n  \"dotaccent\",\n  0x02d9,\n  \"dotaccentcmb\",\n  0x0307,\n  \"dotbelowcmb\",\n  0x0323,\n  \"dotbelowcomb\",\n  0x0323,\n  \"dotkatakana\",\n  0x30fb,\n  \"dotlessi\",\n  0x0131,\n  \"dotlessj\",\n  0xf6be,\n  \"dotlessjstrokehook\",\n  0x0284,\n  \"dotmath\",\n  0x22c5,\n  \"dottedcircle\",\n  0x25cc,\n  \"doubleyodpatah\",\n  0xfb1f,\n  \"doubleyodpatahhebrew\",\n  0xfb1f,\n  \"downtackbelowcmb\",\n  0x031e,\n  \"downtackmod\",\n  0x02d5,\n  \"dparen\",\n  0x249f,\n  \"dsuperior\",\n  0xf6eb,\n  \"dtail\",\n  0x0256,\n  \"dtopbar\",\n  0x018c,\n  \"duhiragana\",\n  0x3065,\n  \"dukatakana\",\n  0x30c5,\n  \"dz\",\n  0x01f3,\n  \"dzaltone\",\n  0x02a3,\n  \"dzcaron\",\n  0x01c6,\n  \"dzcurl\",\n  0x02a5,\n  \"dzeabkhasiancyrillic\",\n  0x04e1,\n  \"dzecyrillic\",\n  0x0455,\n  \"dzhecyrillic\",\n  0x045f,\n  \"e\",\n  0x0065,\n  \"eacute\",\n  0x00e9,\n  \"earth\",\n  0x2641,\n  \"ebengali\",\n  0x098f,\n  \"ebopomofo\",\n  0x311c,\n  \"ebreve\",\n  0x0115,\n  \"ecandradeva\",\n  0x090d,\n  \"ecandragujarati\",\n  0x0a8d,\n  \"ecandravowelsigndeva\",\n  0x0945,\n  \"ecandravowelsigngujarati\",\n  0x0ac5,\n  \"ecaron\",\n  0x011b,\n  \"ecedillabreve\",\n  0x1e1d,\n  \"echarmenian\",\n  0x0565,\n  \"echyiwnarmenian\",\n  0x0587,\n  \"ecircle\",\n  0x24d4,\n  \"ecircumflex\",\n  0x00ea,\n  \"ecircumflexacute\",\n  0x1ebf,\n  \"ecircumflexbelow\",\n  0x1e19,\n  \"ecircumflexdotbelow\",\n  0x1ec7,\n  \"ecircumflexgrave\",\n  0x1ec1,\n  \"ecircumflexhookabove\",\n  0x1ec3,\n  \"ecircumflextilde\",\n  0x1ec5,\n  \"ecyrillic\",\n  0x0454,\n  \"edblgrave\",\n  0x0205,\n  \"edeva\",\n  0x090f,\n  \"edieresis\",\n  0x00eb,\n  \"edot\",\n  0x0117,\n  \"edotaccent\",\n  0x0117,\n  \"edotbelow\",\n  0x1eb9,\n  \"eegurmukhi\",\n  0x0a0f,\n  \"eematragurmukhi\",\n  0x0a47,\n  \"efcyrillic\",\n  0x0444,\n  \"egrave\",\n  0x00e8,\n  \"egujarati\",\n  0x0a8f,\n  \"eharmenian\",\n  0x0567,\n  \"ehbopomofo\",\n  0x311d,\n  \"ehiragana\",\n  0x3048,\n  \"ehookabove\",\n  0x1ebb,\n  \"eibopomofo\",\n  0x311f,\n  \"eight\",\n  0x0038,\n  \"eightarabic\",\n  0x0668,\n  \"eightbengali\",\n  0x09ee,\n  \"eightcircle\",\n  0x2467,\n  \"eightcircleinversesansserif\",\n  0x2791,\n  \"eightdeva\",\n  0x096e,\n  \"eighteencircle\",\n  0x2471,\n  \"eighteenparen\",\n  0x2485,\n  \"eighteenperiod\",\n  0x2499,\n  \"eightgujarati\",\n  0x0aee,\n  \"eightgurmukhi\",\n  0x0a6e,\n  \"eighthackarabic\",\n  0x0668,\n  \"eighthangzhou\",\n  0x3028,\n  \"eighthnotebeamed\",\n  0x266b,\n  \"eightideographicparen\",\n  0x3227,\n  \"eightinferior\",\n  0x2088,\n  \"eightmonospace\",\n  0xff18,\n  \"eightoldstyle\",\n  0xf738,\n  \"eightparen\",\n  0x247b,\n  \"eightperiod\",\n  0x248f,\n  \"eightpersian\",\n  0x06f8,\n  \"eightroman\",\n  0x2177,\n  \"eightsuperior\",\n  0x2078,\n  \"eightthai\",\n  0x0e58,\n  \"einvertedbreve\",\n  0x0207,\n  \"eiotifiedcyrillic\",\n  0x0465,\n  \"ekatakana\",\n  0x30a8,\n  \"ekatakanahalfwidth\",\n  0xff74,\n  \"ekonkargurmukhi\",\n  0x0a74,\n  \"ekorean\",\n  0x3154,\n  \"elcyrillic\",\n  0x043b,\n  \"element\",\n  0x2208,\n  \"elevencircle\",\n  0x246a,\n  \"elevenparen\",\n  0x247e,\n  \"elevenperiod\",\n  0x2492,\n  \"elevenroman\",\n  0x217a,\n  \"ellipsis\",\n  0x2026,\n  \"ellipsisvertical\",\n  0x22ee,\n  \"emacron\",\n  0x0113,\n  \"emacronacute\",\n  0x1e17,\n  \"emacrongrave\",\n  0x1e15,\n  \"emcyrillic\",\n  0x043c,\n  \"emdash\",\n  0x2014,\n  \"emdashvertical\",\n  0xfe31,\n  \"emonospace\",\n  0xff45,\n  \"emphasismarkarmenian\",\n  0x055b,\n  \"emptyset\",\n  0x2205,\n  \"enbopomofo\",\n  0x3123,\n  \"encyrillic\",\n  0x043d,\n  \"endash\",\n  0x2013,\n  \"endashvertical\",\n  0xfe32,\n  \"endescendercyrillic\",\n  0x04a3,\n  \"eng\",\n  0x014b,\n  \"engbopomofo\",\n  0x3125,\n  \"enghecyrillic\",\n  0x04a5,\n  \"enhookcyrillic\",\n  0x04c8,\n  \"enspace\",\n  0x2002,\n  \"eogonek\",\n  0x0119,\n  \"eokorean\",\n  0x3153,\n  \"eopen\",\n  0x025b,\n  \"eopenclosed\",\n  0x029a,\n  \"eopenreversed\",\n  0x025c,\n  \"eopenreversedclosed\",\n  0x025e,\n  \"eopenreversedhook\",\n  0x025d,\n  \"eparen\",\n  0x24a0,\n  \"epsilon\",\n  0x03b5,\n  \"epsilontonos\",\n  0x03ad,\n  \"equal\",\n  0x003d,\n  \"equalmonospace\",\n  0xff1d,\n  \"equalsmall\",\n  0xfe66,\n  \"equalsuperior\",\n  0x207c,\n  \"equivalence\",\n  0x2261,\n  \"erbopomofo\",\n  0x3126,\n  \"ercyrillic\",\n  0x0440,\n  \"ereversed\",\n  0x0258,\n  \"ereversedcyrillic\",\n  0x044d,\n  \"escyrillic\",\n  0x0441,\n  \"esdescendercyrillic\",\n  0x04ab,\n  \"esh\",\n  0x0283,\n  \"eshcurl\",\n  0x0286,\n  \"eshortdeva\",\n  0x090e,\n  \"eshortvowelsigndeva\",\n  0x0946,\n  \"eshreversedloop\",\n  0x01aa,\n  \"eshsquatreversed\",\n  0x0285,\n  \"esmallhiragana\",\n  0x3047,\n  \"esmallkatakana\",\n  0x30a7,\n  \"esmallkatakanahalfwidth\",\n  0xff6a,\n  \"estimated\",\n  0x212e,\n  \"esuperior\",\n  0xf6ec,\n  \"eta\",\n  0x03b7,\n  \"etarmenian\",\n  0x0568,\n  \"etatonos\",\n  0x03ae,\n  \"eth\",\n  0x00f0,\n  \"etilde\",\n  0x1ebd,\n  \"etildebelow\",\n  0x1e1b,\n  \"etnahtafoukhhebrew\",\n  0x0591,\n  \"etnahtafoukhlefthebrew\",\n  0x0591,\n  \"etnahtahebrew\",\n  0x0591,\n  \"etnahtalefthebrew\",\n  0x0591,\n  \"eturned\",\n  0x01dd,\n  \"eukorean\",\n  0x3161,\n  \"euro\",\n  0x20ac,\n  \"evowelsignbengali\",\n  0x09c7,\n  \"evowelsigndeva\",\n  0x0947,\n  \"evowelsigngujarati\",\n  0x0ac7,\n  \"exclam\",\n  0x0021,\n  \"exclamarmenian\",\n  0x055c,\n  \"exclamdbl\",\n  0x203c,\n  \"exclamdown\",\n  0x00a1,\n  \"exclamdownsmall\",\n  0xf7a1,\n  \"exclammonospace\",\n  0xff01,\n  \"exclamsmall\",\n  0xf721,\n  \"existential\",\n  0x2203,\n  \"ezh\",\n  0x0292,\n  \"ezhcaron\",\n  0x01ef,\n  \"ezhcurl\",\n  0x0293,\n  \"ezhreversed\",\n  0x01b9,\n  \"ezhtail\",\n  0x01ba,\n  \"f\",\n  0x0066,\n  \"fadeva\",\n  0x095e,\n  \"fagurmukhi\",\n  0x0a5e,\n  \"fahrenheit\",\n  0x2109,\n  \"fathaarabic\",\n  0x064e,\n  \"fathalowarabic\",\n  0x064e,\n  \"fathatanarabic\",\n  0x064b,\n  \"fbopomofo\",\n  0x3108,\n  \"fcircle\",\n  0x24d5,\n  \"fdotaccent\",\n  0x1e1f,\n  \"feharabic\",\n  0x0641,\n  \"feharmenian\",\n  0x0586,\n  \"fehfinalarabic\",\n  0xfed2,\n  \"fehinitialarabic\",\n  0xfed3,\n  \"fehmedialarabic\",\n  0xfed4,\n  \"feicoptic\",\n  0x03e5,\n  \"female\",\n  0x2640,\n  \"ff\",\n  0xfb00,\n  \"f_f\",\n  0xfb00,\n  \"ffi\",\n  0xfb03,\n  \"ffl\",\n  0xfb04,\n  \"fi\",\n  0xfb01,\n  \"fifteencircle\",\n  0x246e,\n  \"fifteenparen\",\n  0x2482,\n  \"fifteenperiod\",\n  0x2496,\n  \"figuredash\",\n  0x2012,\n  \"filledbox\",\n  0x25a0,\n  \"filledrect\",\n  0x25ac,\n  \"finalkaf\",\n  0x05da,\n  \"finalkafdagesh\",\n  0xfb3a,\n  \"finalkafdageshhebrew\",\n  0xfb3a,\n  \"finalkafhebrew\",\n  0x05da,\n  \"finalmem\",\n  0x05dd,\n  \"finalmemhebrew\",\n  0x05dd,\n  \"finalnun\",\n  0x05df,\n  \"finalnunhebrew\",\n  0x05df,\n  \"finalpe\",\n  0x05e3,\n  \"finalpehebrew\",\n  0x05e3,\n  \"finaltsadi\",\n  0x05e5,\n  \"finaltsadihebrew\",\n  0x05e5,\n  \"firsttonechinese\",\n  0x02c9,\n  \"fisheye\",\n  0x25c9,\n  \"fitacyrillic\",\n  0x0473,\n  \"five\",\n  0x0035,\n  \"fivearabic\",\n  0x0665,\n  \"fivebengali\",\n  0x09eb,\n  \"fivecircle\",\n  0x2464,\n  \"fivecircleinversesansserif\",\n  0x278e,\n  \"fivedeva\",\n  0x096b,\n  \"fiveeighths\",\n  0x215d,\n  \"fivegujarati\",\n  0x0aeb,\n  \"fivegurmukhi\",\n  0x0a6b,\n  \"fivehackarabic\",\n  0x0665,\n  \"fivehangzhou\",\n  0x3025,\n  \"fiveideographicparen\",\n  0x3224,\n  \"fiveinferior\",\n  0x2085,\n  \"fivemonospace\",\n  0xff15,\n  \"fiveoldstyle\",\n  0xf735,\n  \"fiveparen\",\n  0x2478,\n  \"fiveperiod\",\n  0x248c,\n  \"fivepersian\",\n  0x06f5,\n  \"fiveroman\",\n  0x2174,\n  \"fivesuperior\",\n  0x2075,\n  \"fivethai\",\n  0x0e55,\n  \"fl\",\n  0xfb02,\n  \"florin\",\n  0x0192,\n  \"fmonospace\",\n  0xff46,\n  \"fmsquare\",\n  0x3399,\n  \"fofanthai\",\n  0x0e1f,\n  \"fofathai\",\n  0x0e1d,\n  \"fongmanthai\",\n  0x0e4f,\n  \"forall\",\n  0x2200,\n  \"four\",\n  0x0034,\n  \"fourarabic\",\n  0x0664,\n  \"fourbengali\",\n  0x09ea,\n  \"fourcircle\",\n  0x2463,\n  \"fourcircleinversesansserif\",\n  0x278d,\n  \"fourdeva\",\n  0x096a,\n  \"fourgujarati\",\n  0x0aea,\n  \"fourgurmukhi\",\n  0x0a6a,\n  \"fourhackarabic\",\n  0x0664,\n  \"fourhangzhou\",\n  0x3024,\n  \"fourideographicparen\",\n  0x3223,\n  \"fourinferior\",\n  0x2084,\n  \"fourmonospace\",\n  0xff14,\n  \"fournumeratorbengali\",\n  0x09f7,\n  \"fouroldstyle\",\n  0xf734,\n  \"fourparen\",\n  0x2477,\n  \"fourperiod\",\n  0x248b,\n  \"fourpersian\",\n  0x06f4,\n  \"fourroman\",\n  0x2173,\n  \"foursuperior\",\n  0x2074,\n  \"fourteencircle\",\n  0x246d,\n  \"fourteenparen\",\n  0x2481,\n  \"fourteenperiod\",\n  0x2495,\n  \"fourthai\",\n  0x0e54,\n  \"fourthtonechinese\",\n  0x02cb,\n  \"fparen\",\n  0x24a1,\n  \"fraction\",\n  0x2044,\n  \"franc\",\n  0x20a3,\n  \"g\",\n  0x0067,\n  \"gabengali\",\n  0x0997,\n  \"gacute\",\n  0x01f5,\n  \"gadeva\",\n  0x0917,\n  \"gafarabic\",\n  0x06af,\n  \"gaffinalarabic\",\n  0xfb93,\n  \"gafinitialarabic\",\n  0xfb94,\n  \"gafmedialarabic\",\n  0xfb95,\n  \"gagujarati\",\n  0x0a97,\n  \"gagurmukhi\",\n  0x0a17,\n  \"gahiragana\",\n  0x304c,\n  \"gakatakana\",\n  0x30ac,\n  \"gamma\",\n  0x03b3,\n  \"gammalatinsmall\",\n  0x0263,\n  \"gammasuperior\",\n  0x02e0,\n  \"gangiacoptic\",\n  0x03eb,\n  \"gbopomofo\",\n  0x310d,\n  \"gbreve\",\n  0x011f,\n  \"gcaron\",\n  0x01e7,\n  \"gcedilla\",\n  0x0123,\n  \"gcircle\",\n  0x24d6,\n  \"gcircumflex\",\n  0x011d,\n  \"gcommaaccent\",\n  0x0123,\n  \"gdot\",\n  0x0121,\n  \"gdotaccent\",\n  0x0121,\n  \"gecyrillic\",\n  0x0433,\n  \"gehiragana\",\n  0x3052,\n  \"gekatakana\",\n  0x30b2,\n  \"geometricallyequal\",\n  0x2251,\n  \"gereshaccenthebrew\",\n  0x059c,\n  \"gereshhebrew\",\n  0x05f3,\n  \"gereshmuqdamhebrew\",\n  0x059d,\n  \"germandbls\",\n  0x00df,\n  \"gershayimaccenthebrew\",\n  0x059e,\n  \"gershayimhebrew\",\n  0x05f4,\n  \"getamark\",\n  0x3013,\n  \"ghabengali\",\n  0x0998,\n  \"ghadarmenian\",\n  0x0572,\n  \"ghadeva\",\n  0x0918,\n  \"ghagujarati\",\n  0x0a98,\n  \"ghagurmukhi\",\n  0x0a18,\n  \"ghainarabic\",\n  0x063a,\n  \"ghainfinalarabic\",\n  0xfece,\n  \"ghaininitialarabic\",\n  0xfecf,\n  \"ghainmedialarabic\",\n  0xfed0,\n  \"ghemiddlehookcyrillic\",\n  0x0495,\n  \"ghestrokecyrillic\",\n  0x0493,\n  \"gheupturncyrillic\",\n  0x0491,\n  \"ghhadeva\",\n  0x095a,\n  \"ghhagurmukhi\",\n  0x0a5a,\n  \"ghook\",\n  0x0260,\n  \"ghzsquare\",\n  0x3393,\n  \"gihiragana\",\n  0x304e,\n  \"gikatakana\",\n  0x30ae,\n  \"gimarmenian\",\n  0x0563,\n  \"gimel\",\n  0x05d2,\n  \"gimeldagesh\",\n  0xfb32,\n  \"gimeldageshhebrew\",\n  0xfb32,\n  \"gimelhebrew\",\n  0x05d2,\n  \"gjecyrillic\",\n  0x0453,\n  \"glottalinvertedstroke\",\n  0x01be,\n  \"glottalstop\",\n  0x0294,\n  \"glottalstopinverted\",\n  0x0296,\n  \"glottalstopmod\",\n  0x02c0,\n  \"glottalstopreversed\",\n  0x0295,\n  \"glottalstopreversedmod\",\n  0x02c1,\n  \"glottalstopreversedsuperior\",\n  0x02e4,\n  \"glottalstopstroke\",\n  0x02a1,\n  \"glottalstopstrokereversed\",\n  0x02a2,\n  \"gmacron\",\n  0x1e21,\n  \"gmonospace\",\n  0xff47,\n  \"gohiragana\",\n  0x3054,\n  \"gokatakana\",\n  0x30b4,\n  \"gparen\",\n  0x24a2,\n  \"gpasquare\",\n  0x33ac,\n  \"gradient\",\n  0x2207,\n  \"grave\",\n  0x0060,\n  \"gravebelowcmb\",\n  0x0316,\n  \"gravecmb\",\n  0x0300,\n  \"gravecomb\",\n  0x0300,\n  \"gravedeva\",\n  0x0953,\n  \"gravelowmod\",\n  0x02ce,\n  \"gravemonospace\",\n  0xff40,\n  \"gravetonecmb\",\n  0x0340,\n  \"greater\",\n  0x003e,\n  \"greaterequal\",\n  0x2265,\n  \"greaterequalorless\",\n  0x22db,\n  \"greatermonospace\",\n  0xff1e,\n  \"greaterorequivalent\",\n  0x2273,\n  \"greaterorless\",\n  0x2277,\n  \"greateroverequal\",\n  0x2267,\n  \"greatersmall\",\n  0xfe65,\n  \"gscript\",\n  0x0261,\n  \"gstroke\",\n  0x01e5,\n  \"guhiragana\",\n  0x3050,\n  \"guillemotleft\",\n  0x00ab,\n  \"guillemotright\",\n  0x00bb,\n  \"guilsinglleft\",\n  0x2039,\n  \"guilsinglright\",\n  0x203a,\n  \"gukatakana\",\n  0x30b0,\n  \"guramusquare\",\n  0x3318,\n  \"gysquare\",\n  0x33c9,\n  \"h\",\n  0x0068,\n  \"haabkhasiancyrillic\",\n  0x04a9,\n  \"haaltonearabic\",\n  0x06c1,\n  \"habengali\",\n  0x09b9,\n  \"hadescendercyrillic\",\n  0x04b3,\n  \"hadeva\",\n  0x0939,\n  \"hagujarati\",\n  0x0ab9,\n  \"hagurmukhi\",\n  0x0a39,\n  \"haharabic\",\n  0x062d,\n  \"hahfinalarabic\",\n  0xfea2,\n  \"hahinitialarabic\",\n  0xfea3,\n  \"hahiragana\",\n  0x306f,\n  \"hahmedialarabic\",\n  0xfea4,\n  \"haitusquare\",\n  0x332a,\n  \"hakatakana\",\n  0x30cf,\n  \"hakatakanahalfwidth\",\n  0xff8a,\n  \"halantgurmukhi\",\n  0x0a4d,\n  \"hamzaarabic\",\n  0x0621,\n  \"hamzalowarabic\",\n  0x0621,\n  \"hangulfiller\",\n  0x3164,\n  \"hardsigncyrillic\",\n  0x044a,\n  \"harpoonleftbarbup\",\n  0x21bc,\n  \"harpoonrightbarbup\",\n  0x21c0,\n  \"hasquare\",\n  0x33ca,\n  \"hatafpatah\",\n  0x05b2,\n  \"hatafpatah16\",\n  0x05b2,\n  \"hatafpatah23\",\n  0x05b2,\n  \"hatafpatah2f\",\n  0x05b2,\n  \"hatafpatahhebrew\",\n  0x05b2,\n  \"hatafpatahnarrowhebrew\",\n  0x05b2,\n  \"hatafpatahquarterhebrew\",\n  0x05b2,\n  \"hatafpatahwidehebrew\",\n  0x05b2,\n  \"hatafqamats\",\n  0x05b3,\n  \"hatafqamats1b\",\n  0x05b3,\n  \"hatafqamats28\",\n  0x05b3,\n  \"hatafqamats34\",\n  0x05b3,\n  \"hatafqamatshebrew\",\n  0x05b3,\n  \"hatafqamatsnarrowhebrew\",\n  0x05b3,\n  \"hatafqamatsquarterhebrew\",\n  0x05b3,\n  \"hatafqamatswidehebrew\",\n  0x05b3,\n  \"hatafsegol\",\n  0x05b1,\n  \"hatafsegol17\",\n  0x05b1,\n  \"hatafsegol24\",\n  0x05b1,\n  \"hatafsegol30\",\n  0x05b1,\n  \"hatafsegolhebrew\",\n  0x05b1,\n  \"hatafsegolnarrowhebrew\",\n  0x05b1,\n  \"hatafsegolquarterhebrew\",\n  0x05b1,\n  \"hatafsegolwidehebrew\",\n  0x05b1,\n  \"hbar\",\n  0x0127,\n  \"hbopomofo\",\n  0x310f,\n  \"hbrevebelow\",\n  0x1e2b,\n  \"hcedilla\",\n  0x1e29,\n  \"hcircle\",\n  0x24d7,\n  \"hcircumflex\",\n  0x0125,\n  \"hdieresis\",\n  0x1e27,\n  \"hdotaccent\",\n  0x1e23,\n  \"hdotbelow\",\n  0x1e25,\n  \"he\",\n  0x05d4,\n  \"heart\",\n  0x2665,\n  \"heartsuitblack\",\n  0x2665,\n  \"heartsuitwhite\",\n  0x2661,\n  \"hedagesh\",\n  0xfb34,\n  \"hedageshhebrew\",\n  0xfb34,\n  \"hehaltonearabic\",\n  0x06c1,\n  \"heharabic\",\n  0x0647,\n  \"hehebrew\",\n  0x05d4,\n  \"hehfinalaltonearabic\",\n  0xfba7,\n  \"hehfinalalttwoarabic\",\n  0xfeea,\n  \"hehfinalarabic\",\n  0xfeea,\n  \"hehhamzaabovefinalarabic\",\n  0xfba5,\n  \"hehhamzaaboveisolatedarabic\",\n  0xfba4,\n  \"hehinitialaltonearabic\",\n  0xfba8,\n  \"hehinitialarabic\",\n  0xfeeb,\n  \"hehiragana\",\n  0x3078,\n  \"hehmedialaltonearabic\",\n  0xfba9,\n  \"hehmedialarabic\",\n  0xfeec,\n  \"heiseierasquare\",\n  0x337b,\n  \"hekatakana\",\n  0x30d8,\n  \"hekatakanahalfwidth\",\n  0xff8d,\n  \"hekutaarusquare\",\n  0x3336,\n  \"henghook\",\n  0x0267,\n  \"herutusquare\",\n  0x3339,\n  \"het\",\n  0x05d7,\n  \"hethebrew\",\n  0x05d7,\n  \"hhook\",\n  0x0266,\n  \"hhooksuperior\",\n  0x02b1,\n  \"hieuhacirclekorean\",\n  0x327b,\n  \"hieuhaparenkorean\",\n  0x321b,\n  \"hieuhcirclekorean\",\n  0x326d,\n  \"hieuhkorean\",\n  0x314e,\n  \"hieuhparenkorean\",\n  0x320d,\n  \"hihiragana\",\n  0x3072,\n  \"hikatakana\",\n  0x30d2,\n  \"hikatakanahalfwidth\",\n  0xff8b,\n  \"hiriq\",\n  0x05b4,\n  \"hiriq14\",\n  0x05b4,\n  \"hiriq21\",\n  0x05b4,\n  \"hiriq2d\",\n  0x05b4,\n  \"hiriqhebrew\",\n  0x05b4,\n  \"hiriqnarrowhebrew\",\n  0x05b4,\n  \"hiriqquarterhebrew\",\n  0x05b4,\n  \"hiriqwidehebrew\",\n  0x05b4,\n  \"hlinebelow\",\n  0x1e96,\n  \"hmonospace\",\n  0xff48,\n  \"hoarmenian\",\n  0x0570,\n  \"hohipthai\",\n  0x0e2b,\n  \"hohiragana\",\n  0x307b,\n  \"hokatakana\",\n  0x30db,\n  \"hokatakanahalfwidth\",\n  0xff8e,\n  \"holam\",\n  0x05b9,\n  \"holam19\",\n  0x05b9,\n  \"holam26\",\n  0x05b9,\n  \"holam32\",\n  0x05b9,\n  \"holamhebrew\",\n  0x05b9,\n  \"holamnarrowhebrew\",\n  0x05b9,\n  \"holamquarterhebrew\",\n  0x05b9,\n  \"holamwidehebrew\",\n  0x05b9,\n  \"honokhukthai\",\n  0x0e2e,\n  \"hookabovecomb\",\n  0x0309,\n  \"hookcmb\",\n  0x0309,\n  \"hookpalatalizedbelowcmb\",\n  0x0321,\n  \"hookretroflexbelowcmb\",\n  0x0322,\n  \"hoonsquare\",\n  0x3342,\n  \"horicoptic\",\n  0x03e9,\n  \"horizontalbar\",\n  0x2015,\n  \"horncmb\",\n  0x031b,\n  \"hotsprings\",\n  0x2668,\n  \"house\",\n  0x2302,\n  \"hparen\",\n  0x24a3,\n  \"hsuperior\",\n  0x02b0,\n  \"hturned\",\n  0x0265,\n  \"huhiragana\",\n  0x3075,\n  \"huiitosquare\",\n  0x3333,\n  \"hukatakana\",\n  0x30d5,\n  \"hukatakanahalfwidth\",\n  0xff8c,\n  \"hungarumlaut\",\n  0x02dd,\n  \"hungarumlautcmb\",\n  0x030b,\n  \"hv\",\n  0x0195,\n  \"hyphen\",\n  0x002d,\n  \"hypheninferior\",\n  0xf6e5,\n  \"hyphenmonospace\",\n  0xff0d,\n  \"hyphensmall\",\n  0xfe63,\n  \"hyphensuperior\",\n  0xf6e6,\n  \"hyphentwo\",\n  0x2010,\n  \"i\",\n  0x0069,\n  \"iacute\",\n  0x00ed,\n  \"iacyrillic\",\n  0x044f,\n  \"ibengali\",\n  0x0987,\n  \"ibopomofo\",\n  0x3127,\n  \"ibreve\",\n  0x012d,\n  \"icaron\",\n  0x01d0,\n  \"icircle\",\n  0x24d8,\n  \"icircumflex\",\n  0x00ee,\n  \"icyrillic\",\n  0x0456,\n  \"idblgrave\",\n  0x0209,\n  \"ideographearthcircle\",\n  0x328f,\n  \"ideographfirecircle\",\n  0x328b,\n  \"ideographicallianceparen\",\n  0x323f,\n  \"ideographiccallparen\",\n  0x323a,\n  \"ideographiccentrecircle\",\n  0x32a5,\n  \"ideographicclose\",\n  0x3006,\n  \"ideographiccomma\",\n  0x3001,\n  \"ideographiccommaleft\",\n  0xff64,\n  \"ideographiccongratulationparen\",\n  0x3237,\n  \"ideographiccorrectcircle\",\n  0x32a3,\n  \"ideographicearthparen\",\n  0x322f,\n  \"ideographicenterpriseparen\",\n  0x323d,\n  \"ideographicexcellentcircle\",\n  0x329d,\n  \"ideographicfestivalparen\",\n  0x3240,\n  \"ideographicfinancialcircle\",\n  0x3296,\n  \"ideographicfinancialparen\",\n  0x3236,\n  \"ideographicfireparen\",\n  0x322b,\n  \"ideographichaveparen\",\n  0x3232,\n  \"ideographichighcircle\",\n  0x32a4,\n  \"ideographiciterationmark\",\n  0x3005,\n  \"ideographiclaborcircle\",\n  0x3298,\n  \"ideographiclaborparen\",\n  0x3238,\n  \"ideographicleftcircle\",\n  0x32a7,\n  \"ideographiclowcircle\",\n  0x32a6,\n  \"ideographicmedicinecircle\",\n  0x32a9,\n  \"ideographicmetalparen\",\n  0x322e,\n  \"ideographicmoonparen\",\n  0x322a,\n  \"ideographicnameparen\",\n  0x3234,\n  \"ideographicperiod\",\n  0x3002,\n  \"ideographicprintcircle\",\n  0x329e,\n  \"ideographicreachparen\",\n  0x3243,\n  \"ideographicrepresentparen\",\n  0x3239,\n  \"ideographicresourceparen\",\n  0x323e,\n  \"ideographicrightcircle\",\n  0x32a8,\n  \"ideographicsecretcircle\",\n  0x3299,\n  \"ideographicselfparen\",\n  0x3242,\n  \"ideographicsocietyparen\",\n  0x3233,\n  \"ideographicspace\",\n  0x3000,\n  \"ideographicspecialparen\",\n  0x3235,\n  \"ideographicstockparen\",\n  0x3231,\n  \"ideographicstudyparen\",\n  0x323b,\n  \"ideographicsunparen\",\n  0x3230,\n  \"ideographicsuperviseparen\",\n  0x323c,\n  \"ideographicwaterparen\",\n  0x322c,\n  \"ideographicwoodparen\",\n  0x322d,\n  \"ideographiczero\",\n  0x3007,\n  \"ideographmetalcircle\",\n  0x328e,\n  \"ideographmooncircle\",\n  0x328a,\n  \"ideographnamecircle\",\n  0x3294,\n  \"ideographsuncircle\",\n  0x3290,\n  \"ideographwatercircle\",\n  0x328c,\n  \"ideographwoodcircle\",\n  0x328d,\n  \"ideva\",\n  0x0907,\n  \"idieresis\",\n  0x00ef,\n  \"idieresisacute\",\n  0x1e2f,\n  \"idieresiscyrillic\",\n  0x04e5,\n  \"idotbelow\",\n  0x1ecb,\n  \"iebrevecyrillic\",\n  0x04d7,\n  \"iecyrillic\",\n  0x0435,\n  \"ieungacirclekorean\",\n  0x3275,\n  \"ieungaparenkorean\",\n  0x3215,\n  \"ieungcirclekorean\",\n  0x3267,\n  \"ieungkorean\",\n  0x3147,\n  \"ieungparenkorean\",\n  0x3207,\n  \"igrave\",\n  0x00ec,\n  \"igujarati\",\n  0x0a87,\n  \"igurmukhi\",\n  0x0a07,\n  \"ihiragana\",\n  0x3044,\n  \"ihookabove\",\n  0x1ec9,\n  \"iibengali\",\n  0x0988,\n  \"iicyrillic\",\n  0x0438,\n  \"iideva\",\n  0x0908,\n  \"iigujarati\",\n  0x0a88,\n  \"iigurmukhi\",\n  0x0a08,\n  \"iimatragurmukhi\",\n  0x0a40,\n  \"iinvertedbreve\",\n  0x020b,\n  \"iishortcyrillic\",\n  0x0439,\n  \"iivowelsignbengali\",\n  0x09c0,\n  \"iivowelsigndeva\",\n  0x0940,\n  \"iivowelsigngujarati\",\n  0x0ac0,\n  \"ij\",\n  0x0133,\n  \"ikatakana\",\n  0x30a4,\n  \"ikatakanahalfwidth\",\n  0xff72,\n  \"ikorean\",\n  0x3163,\n  \"ilde\",\n  0x02dc,\n  \"iluyhebrew\",\n  0x05ac,\n  \"imacron\",\n  0x012b,\n  \"imacroncyrillic\",\n  0x04e3,\n  \"imageorapproximatelyequal\",\n  0x2253,\n  \"imatragurmukhi\",\n  0x0a3f,\n  \"imonospace\",\n  0xff49,\n  \"increment\",\n  0x2206,\n  \"infinity\",\n  0x221e,\n  \"iniarmenian\",\n  0x056b,\n  \"integral\",\n  0x222b,\n  \"integralbottom\",\n  0x2321,\n  \"integralbt\",\n  0x2321,\n  \"integralex\",\n  0xf8f5,\n  \"integraltop\",\n  0x2320,\n  \"integraltp\",\n  0x2320,\n  \"intersection\",\n  0x2229,\n  \"intisquare\",\n  0x3305,\n  \"invbullet\",\n  0x25d8,\n  \"invcircle\",\n  0x25d9,\n  \"invsmileface\",\n  0x263b,\n  \"iocyrillic\",\n  0x0451,\n  \"iogonek\",\n  0x012f,\n  \"iota\",\n  0x03b9,\n  \"iotadieresis\",\n  0x03ca,\n  \"iotadieresistonos\",\n  0x0390,\n  \"iotalatin\",\n  0x0269,\n  \"iotatonos\",\n  0x03af,\n  \"iparen\",\n  0x24a4,\n  \"irigurmukhi\",\n  0x0a72,\n  \"ismallhiragana\",\n  0x3043,\n  \"ismallkatakana\",\n  0x30a3,\n  \"ismallkatakanahalfwidth\",\n  0xff68,\n  \"issharbengali\",\n  0x09fa,\n  \"istroke\",\n  0x0268,\n  \"isuperior\",\n  0xf6ed,\n  \"iterationhiragana\",\n  0x309d,\n  \"iterationkatakana\",\n  0x30fd,\n  \"itilde\",\n  0x0129,\n  \"itildebelow\",\n  0x1e2d,\n  \"iubopomofo\",\n  0x3129,\n  \"iucyrillic\",\n  0x044e,\n  \"ivowelsignbengali\",\n  0x09bf,\n  \"ivowelsigndeva\",\n  0x093f,\n  \"ivowelsigngujarati\",\n  0x0abf,\n  \"izhitsacyrillic\",\n  0x0475,\n  \"izhitsadblgravecyrillic\",\n  0x0477,\n  \"j\",\n  0x006a,\n  \"jaarmenian\",\n  0x0571,\n  \"jabengali\",\n  0x099c,\n  \"jadeva\",\n  0x091c,\n  \"jagujarati\",\n  0x0a9c,\n  \"jagurmukhi\",\n  0x0a1c,\n  \"jbopomofo\",\n  0x3110,\n  \"jcaron\",\n  0x01f0,\n  \"jcircle\",\n  0x24d9,\n  \"jcircumflex\",\n  0x0135,\n  \"jcrossedtail\",\n  0x029d,\n  \"jdotlessstroke\",\n  0x025f,\n  \"jecyrillic\",\n  0x0458,\n  \"jeemarabic\",\n  0x062c,\n  \"jeemfinalarabic\",\n  0xfe9e,\n  \"jeeminitialarabic\",\n  0xfe9f,\n  \"jeemmedialarabic\",\n  0xfea0,\n  \"jeharabic\",\n  0x0698,\n  \"jehfinalarabic\",\n  0xfb8b,\n  \"jhabengali\",\n  0x099d,\n  \"jhadeva\",\n  0x091d,\n  \"jhagujarati\",\n  0x0a9d,\n  \"jhagurmukhi\",\n  0x0a1d,\n  \"jheharmenian\",\n  0x057b,\n  \"jis\",\n  0x3004,\n  \"jmonospace\",\n  0xff4a,\n  \"jparen\",\n  0x24a5,\n  \"jsuperior\",\n  0x02b2,\n  \"k\",\n  0x006b,\n  \"kabashkircyrillic\",\n  0x04a1,\n  \"kabengali\",\n  0x0995,\n  \"kacute\",\n  0x1e31,\n  \"kacyrillic\",\n  0x043a,\n  \"kadescendercyrillic\",\n  0x049b,\n  \"kadeva\",\n  0x0915,\n  \"kaf\",\n  0x05db,\n  \"kafarabic\",\n  0x0643,\n  \"kafdagesh\",\n  0xfb3b,\n  \"kafdageshhebrew\",\n  0xfb3b,\n  \"kaffinalarabic\",\n  0xfeda,\n  \"kafhebrew\",\n  0x05db,\n  \"kafinitialarabic\",\n  0xfedb,\n  \"kafmedialarabic\",\n  0xfedc,\n  \"kafrafehebrew\",\n  0xfb4d,\n  \"kagujarati\",\n  0x0a95,\n  \"kagurmukhi\",\n  0x0a15,\n  \"kahiragana\",\n  0x304b,\n  \"kahookcyrillic\",\n  0x04c4,\n  \"kakatakana\",\n  0x30ab,\n  \"kakatakanahalfwidth\",\n  0xff76,\n  \"kappa\",\n  0x03ba,\n  \"kappasymbolgreek\",\n  0x03f0,\n  \"kapyeounmieumkorean\",\n  0x3171,\n  \"kapyeounphieuphkorean\",\n  0x3184,\n  \"kapyeounpieupkorean\",\n  0x3178,\n  \"kapyeounssangpieupkorean\",\n  0x3179,\n  \"karoriisquare\",\n  0x330d,\n  \"kashidaautoarabic\",\n  0x0640,\n  \"kashidaautonosidebearingarabic\",\n  0x0640,\n  \"kasmallkatakana\",\n  0x30f5,\n  \"kasquare\",\n  0x3384,\n  \"kasraarabic\",\n  0x0650,\n  \"kasratanarabic\",\n  0x064d,\n  \"kastrokecyrillic\",\n  0x049f,\n  \"katahiraprolongmarkhalfwidth\",\n  0xff70,\n  \"kaverticalstrokecyrillic\",\n  0x049d,\n  \"kbopomofo\",\n  0x310e,\n  \"kcalsquare\",\n  0x3389,\n  \"kcaron\",\n  0x01e9,\n  \"kcedilla\",\n  0x0137,\n  \"kcircle\",\n  0x24da,\n  \"kcommaaccent\",\n  0x0137,\n  \"kdotbelow\",\n  0x1e33,\n  \"keharmenian\",\n  0x0584,\n  \"kehiragana\",\n  0x3051,\n  \"kekatakana\",\n  0x30b1,\n  \"kekatakanahalfwidth\",\n  0xff79,\n  \"kenarmenian\",\n  0x056f,\n  \"kesmallkatakana\",\n  0x30f6,\n  \"kgreenlandic\",\n  0x0138,\n  \"khabengali\",\n  0x0996,\n  \"khacyrillic\",\n  0x0445,\n  \"khadeva\",\n  0x0916,\n  \"khagujarati\",\n  0x0a96,\n  \"khagurmukhi\",\n  0x0a16,\n  \"khaharabic\",\n  0x062e,\n  \"khahfinalarabic\",\n  0xfea6,\n  \"khahinitialarabic\",\n  0xfea7,\n  \"khahmedialarabic\",\n  0xfea8,\n  \"kheicoptic\",\n  0x03e7,\n  \"khhadeva\",\n  0x0959,\n  \"khhagurmukhi\",\n  0x0a59,\n  \"khieukhacirclekorean\",\n  0x3278,\n  \"khieukhaparenkorean\",\n  0x3218,\n  \"khieukhcirclekorean\",\n  0x326a,\n  \"khieukhkorean\",\n  0x314b,\n  \"khieukhparenkorean\",\n  0x320a,\n  \"khokhaithai\",\n  0x0e02,\n  \"khokhonthai\",\n  0x0e05,\n  \"khokhuatthai\",\n  0x0e03,\n  \"khokhwaithai\",\n  0x0e04,\n  \"khomutthai\",\n  0x0e5b,\n  \"khook\",\n  0x0199,\n  \"khorakhangthai\",\n  0x0e06,\n  \"khzsquare\",\n  0x3391,\n  \"kihiragana\",\n  0x304d,\n  \"kikatakana\",\n  0x30ad,\n  \"kikatakanahalfwidth\",\n  0xff77,\n  \"kiroguramusquare\",\n  0x3315,\n  \"kiromeetorusquare\",\n  0x3316,\n  \"kirosquare\",\n  0x3314,\n  \"kiyeokacirclekorean\",\n  0x326e,\n  \"kiyeokaparenkorean\",\n  0x320e,\n  \"kiyeokcirclekorean\",\n  0x3260,\n  \"kiyeokkorean\",\n  0x3131,\n  \"kiyeokparenkorean\",\n  0x3200,\n  \"kiyeoksioskorean\",\n  0x3133,\n  \"kjecyrillic\",\n  0x045c,\n  \"klinebelow\",\n  0x1e35,\n  \"klsquare\",\n  0x3398,\n  \"kmcubedsquare\",\n  0x33a6,\n  \"kmonospace\",\n  0xff4b,\n  \"kmsquaredsquare\",\n  0x33a2,\n  \"kohiragana\",\n  0x3053,\n  \"kohmsquare\",\n  0x33c0,\n  \"kokaithai\",\n  0x0e01,\n  \"kokatakana\",\n  0x30b3,\n  \"kokatakanahalfwidth\",\n  0xff7a,\n  \"kooposquare\",\n  0x331e,\n  \"koppacyrillic\",\n  0x0481,\n  \"koreanstandardsymbol\",\n  0x327f,\n  \"koroniscmb\",\n  0x0343,\n  \"kparen\",\n  0x24a6,\n  \"kpasquare\",\n  0x33aa,\n  \"ksicyrillic\",\n  0x046f,\n  \"ktsquare\",\n  0x33cf,\n  \"kturned\",\n  0x029e,\n  \"kuhiragana\",\n  0x304f,\n  \"kukatakana\",\n  0x30af,\n  \"kukatakanahalfwidth\",\n  0xff78,\n  \"kvsquare\",\n  0x33b8,\n  \"kwsquare\",\n  0x33be,\n  \"l\",\n  0x006c,\n  \"labengali\",\n  0x09b2,\n  \"lacute\",\n  0x013a,\n  \"ladeva\",\n  0x0932,\n  \"lagujarati\",\n  0x0ab2,\n  \"lagurmukhi\",\n  0x0a32,\n  \"lakkhangyaothai\",\n  0x0e45,\n  \"lamaleffinalarabic\",\n  0xfefc,\n  \"lamalefhamzaabovefinalarabic\",\n  0xfef8,\n  \"lamalefhamzaaboveisolatedarabic\",\n  0xfef7,\n  \"lamalefhamzabelowfinalarabic\",\n  0xfefa,\n  \"lamalefhamzabelowisolatedarabic\",\n  0xfef9,\n  \"lamalefisolatedarabic\",\n  0xfefb,\n  \"lamalefmaddaabovefinalarabic\",\n  0xfef6,\n  \"lamalefmaddaaboveisolatedarabic\",\n  0xfef5,\n  \"lamarabic\",\n  0x0644,\n  \"lambda\",\n  0x03bb,\n  \"lambdastroke\",\n  0x019b,\n  \"lamed\",\n  0x05dc,\n  \"lameddagesh\",\n  0xfb3c,\n  \"lameddageshhebrew\",\n  0xfb3c,\n  \"lamedhebrew\",\n  0x05dc,\n  \"lamfinalarabic\",\n  0xfede,\n  \"lamhahinitialarabic\",\n  0xfcca,\n  \"laminitialarabic\",\n  0xfedf,\n  \"lamjeeminitialarabic\",\n  0xfcc9,\n  \"lamkhahinitialarabic\",\n  0xfccb,\n  \"lamlamhehisolatedarabic\",\n  0xfdf2,\n  \"lammedialarabic\",\n  0xfee0,\n  \"lammeemhahinitialarabic\",\n  0xfd88,\n  \"lammeeminitialarabic\",\n  0xfccc,\n  \"largecircle\",\n  0x25ef,\n  \"lbar\",\n  0x019a,\n  \"lbelt\",\n  0x026c,\n  \"lbopomofo\",\n  0x310c,\n  \"lcaron\",\n  0x013e,\n  \"lcedilla\",\n  0x013c,\n  \"lcircle\",\n  0x24db,\n  \"lcircumflexbelow\",\n  0x1e3d,\n  \"lcommaaccent\",\n  0x013c,\n  \"ldot\",\n  0x0140,\n  \"ldotaccent\",\n  0x0140,\n  \"ldotbelow\",\n  0x1e37,\n  \"ldotbelowmacron\",\n  0x1e39,\n  \"leftangleabovecmb\",\n  0x031a,\n  \"lefttackbelowcmb\",\n  0x0318,\n  \"less\",\n  0x003c,\n  \"lessequal\",\n  0x2264,\n  \"lessequalorgreater\",\n  0x22da,\n  \"lessmonospace\",\n  0xff1c,\n  \"lessorequivalent\",\n  0x2272,\n  \"lessorgreater\",\n  0x2276,\n  \"lessoverequal\",\n  0x2266,\n  \"lesssmall\",\n  0xfe64,\n  \"lezh\",\n  0x026e,\n  \"lfblock\",\n  0x258c,\n  \"lhookretroflex\",\n  0x026d,\n  \"lira\",\n  0x20a4,\n  \"liwnarmenian\",\n  0x056c,\n  \"lj\",\n  0x01c9,\n  \"ljecyrillic\",\n  0x0459,\n  \"ll\",\n  0xf6c0,\n  \"lladeva\",\n  0x0933,\n  \"llagujarati\",\n  0x0ab3,\n  \"llinebelow\",\n  0x1e3b,\n  \"llladeva\",\n  0x0934,\n  \"llvocalicbengali\",\n  0x09e1,\n  \"llvocalicdeva\",\n  0x0961,\n  \"llvocalicvowelsignbengali\",\n  0x09e3,\n  \"llvocalicvowelsigndeva\",\n  0x0963,\n  \"lmiddletilde\",\n  0x026b,\n  \"lmonospace\",\n  0xff4c,\n  \"lmsquare\",\n  0x33d0,\n  \"lochulathai\",\n  0x0e2c,\n  \"logicaland\",\n  0x2227,\n  \"logicalnot\",\n  0x00ac,\n  \"logicalnotreversed\",\n  0x2310,\n  \"logicalor\",\n  0x2228,\n  \"lolingthai\",\n  0x0e25,\n  \"longs\",\n  0x017f,\n  \"lowlinecenterline\",\n  0xfe4e,\n  \"lowlinecmb\",\n  0x0332,\n  \"lowlinedashed\",\n  0xfe4d,\n  \"lozenge\",\n  0x25ca,\n  \"lparen\",\n  0x24a7,\n  \"lslash\",\n  0x0142,\n  \"lsquare\",\n  0x2113,\n  \"lsuperior\",\n  0xf6ee,\n  \"ltshade\",\n  0x2591,\n  \"luthai\",\n  0x0e26,\n  \"lvocalicbengali\",\n  0x098c,\n  \"lvocalicdeva\",\n  0x090c,\n  \"lvocalicvowelsignbengali\",\n  0x09e2,\n  \"lvocalicvowelsigndeva\",\n  0x0962,\n  \"lxsquare\",\n  0x33d3,\n  \"m\",\n  0x006d,\n  \"mabengali\",\n  0x09ae,\n  \"macron\",\n  0x00af,\n  \"macronbelowcmb\",\n  0x0331,\n  \"macroncmb\",\n  0x0304,\n  \"macronlowmod\",\n  0x02cd,\n  \"macronmonospace\",\n  0xffe3,\n  \"macute\",\n  0x1e3f,\n  \"madeva\",\n  0x092e,\n  \"magujarati\",\n  0x0aae,\n  \"magurmukhi\",\n  0x0a2e,\n  \"mahapakhhebrew\",\n  0x05a4,\n  \"mahapakhlefthebrew\",\n  0x05a4,\n  \"mahiragana\",\n  0x307e,\n  \"maichattawalowleftthai\",\n  0xf895,\n  \"maichattawalowrightthai\",\n  0xf894,\n  \"maichattawathai\",\n  0x0e4b,\n  \"maichattawaupperleftthai\",\n  0xf893,\n  \"maieklowleftthai\",\n  0xf88c,\n  \"maieklowrightthai\",\n  0xf88b,\n  \"maiekthai\",\n  0x0e48,\n  \"maiekupperleftthai\",\n  0xf88a,\n  \"maihanakatleftthai\",\n  0xf884,\n  \"maihanakatthai\",\n  0x0e31,\n  \"maitaikhuleftthai\",\n  0xf889,\n  \"maitaikhuthai\",\n  0x0e47,\n  \"maitholowleftthai\",\n  0xf88f,\n  \"maitholowrightthai\",\n  0xf88e,\n  \"maithothai\",\n  0x0e49,\n  \"maithoupperleftthai\",\n  0xf88d,\n  \"maitrilowleftthai\",\n  0xf892,\n  \"maitrilowrightthai\",\n  0xf891,\n  \"maitrithai\",\n  0x0e4a,\n  \"maitriupperleftthai\",\n  0xf890,\n  \"maiyamokthai\",\n  0x0e46,\n  \"makatakana\",\n  0x30de,\n  \"makatakanahalfwidth\",\n  0xff8f,\n  \"male\",\n  0x2642,\n  \"mansyonsquare\",\n  0x3347,\n  \"maqafhebrew\",\n  0x05be,\n  \"mars\",\n  0x2642,\n  \"masoracirclehebrew\",\n  0x05af,\n  \"masquare\",\n  0x3383,\n  \"mbopomofo\",\n  0x3107,\n  \"mbsquare\",\n  0x33d4,\n  \"mcircle\",\n  0x24dc,\n  \"mcubedsquare\",\n  0x33a5,\n  \"mdotaccent\",\n  0x1e41,\n  \"mdotbelow\",\n  0x1e43,\n  \"meemarabic\",\n  0x0645,\n  \"meemfinalarabic\",\n  0xfee2,\n  \"meeminitialarabic\",\n  0xfee3,\n  \"meemmedialarabic\",\n  0xfee4,\n  \"meemmeeminitialarabic\",\n  0xfcd1,\n  \"meemmeemisolatedarabic\",\n  0xfc48,\n  \"meetorusquare\",\n  0x334d,\n  \"mehiragana\",\n  0x3081,\n  \"meizierasquare\",\n  0x337e,\n  \"mekatakana\",\n  0x30e1,\n  \"mekatakanahalfwidth\",\n  0xff92,\n  \"mem\",\n  0x05de,\n  \"memdagesh\",\n  0xfb3e,\n  \"memdageshhebrew\",\n  0xfb3e,\n  \"memhebrew\",\n  0x05de,\n  \"menarmenian\",\n  0x0574,\n  \"merkhahebrew\",\n  0x05a5,\n  \"merkhakefulahebrew\",\n  0x05a6,\n  \"merkhakefulalefthebrew\",\n  0x05a6,\n  \"merkhalefthebrew\",\n  0x05a5,\n  \"mhook\",\n  0x0271,\n  \"mhzsquare\",\n  0x3392,\n  \"middledotkatakanahalfwidth\",\n  0xff65,\n  \"middot\",\n  0x00b7,\n  \"mieumacirclekorean\",\n  0x3272,\n  \"mieumaparenkorean\",\n  0x3212,\n  \"mieumcirclekorean\",\n  0x3264,\n  \"mieumkorean\",\n  0x3141,\n  \"mieumpansioskorean\",\n  0x3170,\n  \"mieumparenkorean\",\n  0x3204,\n  \"mieumpieupkorean\",\n  0x316e,\n  \"mieumsioskorean\",\n  0x316f,\n  \"mihiragana\",\n  0x307f,\n  \"mikatakana\",\n  0x30df,\n  \"mikatakanahalfwidth\",\n  0xff90,\n  \"minus\",\n  0x2212,\n  \"minusbelowcmb\",\n  0x0320,\n  \"minuscircle\",\n  0x2296,\n  \"minusmod\",\n  0x02d7,\n  \"minusplus\",\n  0x2213,\n  \"minute\",\n  0x2032,\n  \"miribaarusquare\",\n  0x334a,\n  \"mirisquare\",\n  0x3349,\n  \"mlonglegturned\",\n  0x0270,\n  \"mlsquare\",\n  0x3396,\n  \"mmcubedsquare\",\n  0x33a3,\n  \"mmonospace\",\n  0xff4d,\n  \"mmsquaredsquare\",\n  0x339f,\n  \"mohiragana\",\n  0x3082,\n  \"mohmsquare\",\n  0x33c1,\n  \"mokatakana\",\n  0x30e2,\n  \"mokatakanahalfwidth\",\n  0xff93,\n  \"molsquare\",\n  0x33d6,\n  \"momathai\",\n  0x0e21,\n  \"moverssquare\",\n  0x33a7,\n  \"moverssquaredsquare\",\n  0x33a8,\n  \"mparen\",\n  0x24a8,\n  \"mpasquare\",\n  0x33ab,\n  \"mssquare\",\n  0x33b3,\n  \"msuperior\",\n  0xf6ef,\n  \"mturned\",\n  0x026f,\n  \"mu\",\n  0x00b5,\n  \"mu1\",\n  0x00b5,\n  \"muasquare\",\n  0x3382,\n  \"muchgreater\",\n  0x226b,\n  \"muchless\",\n  0x226a,\n  \"mufsquare\",\n  0x338c,\n  \"mugreek\",\n  0x03bc,\n  \"mugsquare\",\n  0x338d,\n  \"muhiragana\",\n  0x3080,\n  \"mukatakana\",\n  0x30e0,\n  \"mukatakanahalfwidth\",\n  0xff91,\n  \"mulsquare\",\n  0x3395,\n  \"multiply\",\n  0x00d7,\n  \"mumsquare\",\n  0x339b,\n  \"munahhebrew\",\n  0x05a3,\n  \"munahlefthebrew\",\n  0x05a3,\n  \"musicalnote\",\n  0x266a,\n  \"musicalnotedbl\",\n  0x266b,\n  \"musicflatsign\",\n  0x266d,\n  \"musicsharpsign\",\n  0x266f,\n  \"mussquare\",\n  0x33b2,\n  \"muvsquare\",\n  0x33b6,\n  \"muwsquare\",\n  0x33bc,\n  \"mvmegasquare\",\n  0x33b9,\n  \"mvsquare\",\n  0x33b7,\n  \"mwmegasquare\",\n  0x33bf,\n  \"mwsquare\",\n  0x33bd,\n  \"n\",\n  0x006e,\n  \"nabengali\",\n  0x09a8,\n  \"nabla\",\n  0x2207,\n  \"nacute\",\n  0x0144,\n  \"nadeva\",\n  0x0928,\n  \"nagujarati\",\n  0x0aa8,\n  \"nagurmukhi\",\n  0x0a28,\n  \"nahiragana\",\n  0x306a,\n  \"nakatakana\",\n  0x30ca,\n  \"nakatakanahalfwidth\",\n  0xff85,\n  \"napostrophe\",\n  0x0149,\n  \"nasquare\",\n  0x3381,\n  \"nbopomofo\",\n  0x310b,\n  \"nbspace\",\n  0x00a0,\n  \"ncaron\",\n  0x0148,\n  \"ncedilla\",\n  0x0146,\n  \"ncircle\",\n  0x24dd,\n  \"ncircumflexbelow\",\n  0x1e4b,\n  \"ncommaaccent\",\n  0x0146,\n  \"ndotaccent\",\n  0x1e45,\n  \"ndotbelow\",\n  0x1e47,\n  \"nehiragana\",\n  0x306d,\n  \"nekatakana\",\n  0x30cd,\n  \"nekatakanahalfwidth\",\n  0xff88,\n  \"newsheqelsign\",\n  0x20aa,\n  \"nfsquare\",\n  0x338b,\n  \"ngabengali\",\n  0x0999,\n  \"ngadeva\",\n  0x0919,\n  \"ngagujarati\",\n  0x0a99,\n  \"ngagurmukhi\",\n  0x0a19,\n  \"ngonguthai\",\n  0x0e07,\n  \"nhiragana\",\n  0x3093,\n  \"nhookleft\",\n  0x0272,\n  \"nhookretroflex\",\n  0x0273,\n  \"nieunacirclekorean\",\n  0x326f,\n  \"nieunaparenkorean\",\n  0x320f,\n  \"nieuncieuckorean\",\n  0x3135,\n  \"nieuncirclekorean\",\n  0x3261,\n  \"nieunhieuhkorean\",\n  0x3136,\n  \"nieunkorean\",\n  0x3134,\n  \"nieunpansioskorean\",\n  0x3168,\n  \"nieunparenkorean\",\n  0x3201,\n  \"nieunsioskorean\",\n  0x3167,\n  \"nieuntikeutkorean\",\n  0x3166,\n  \"nihiragana\",\n  0x306b,\n  \"nikatakana\",\n  0x30cb,\n  \"nikatakanahalfwidth\",\n  0xff86,\n  \"nikhahitleftthai\",\n  0xf899,\n  \"nikhahitthai\",\n  0x0e4d,\n  \"nine\",\n  0x0039,\n  \"ninearabic\",\n  0x0669,\n  \"ninebengali\",\n  0x09ef,\n  \"ninecircle\",\n  0x2468,\n  \"ninecircleinversesansserif\",\n  0x2792,\n  \"ninedeva\",\n  0x096f,\n  \"ninegujarati\",\n  0x0aef,\n  \"ninegurmukhi\",\n  0x0a6f,\n  \"ninehackarabic\",\n  0x0669,\n  \"ninehangzhou\",\n  0x3029,\n  \"nineideographicparen\",\n  0x3228,\n  \"nineinferior\",\n  0x2089,\n  \"ninemonospace\",\n  0xff19,\n  \"nineoldstyle\",\n  0xf739,\n  \"nineparen\",\n  0x247c,\n  \"nineperiod\",\n  0x2490,\n  \"ninepersian\",\n  0x06f9,\n  \"nineroman\",\n  0x2178,\n  \"ninesuperior\",\n  0x2079,\n  \"nineteencircle\",\n  0x2472,\n  \"nineteenparen\",\n  0x2486,\n  \"nineteenperiod\",\n  0x249a,\n  \"ninethai\",\n  0x0e59,\n  \"nj\",\n  0x01cc,\n  \"njecyrillic\",\n  0x045a,\n  \"nkatakana\",\n  0x30f3,\n  \"nkatakanahalfwidth\",\n  0xff9d,\n  \"nlegrightlong\",\n  0x019e,\n  \"nlinebelow\",\n  0x1e49,\n  \"nmonospace\",\n  0xff4e,\n  \"nmsquare\",\n  0x339a,\n  \"nnabengali\",\n  0x09a3,\n  \"nnadeva\",\n  0x0923,\n  \"nnagujarati\",\n  0x0aa3,\n  \"nnagurmukhi\",\n  0x0a23,\n  \"nnnadeva\",\n  0x0929,\n  \"nohiragana\",\n  0x306e,\n  \"nokatakana\",\n  0x30ce,\n  \"nokatakanahalfwidth\",\n  0xff89,\n  \"nonbreakingspace\",\n  0x00a0,\n  \"nonenthai\",\n  0x0e13,\n  \"nonuthai\",\n  0x0e19,\n  \"noonarabic\",\n  0x0646,\n  \"noonfinalarabic\",\n  0xfee6,\n  \"noonghunnaarabic\",\n  0x06ba,\n  \"noonghunnafinalarabic\",\n  0xfb9f,\n  \"nooninitialarabic\",\n  0xfee7,\n  \"noonjeeminitialarabic\",\n  0xfcd2,\n  \"noonjeemisolatedarabic\",\n  0xfc4b,\n  \"noonmedialarabic\",\n  0xfee8,\n  \"noonmeeminitialarabic\",\n  0xfcd5,\n  \"noonmeemisolatedarabic\",\n  0xfc4e,\n  \"noonnoonfinalarabic\",\n  0xfc8d,\n  \"notcontains\",\n  0x220c,\n  \"notelement\",\n  0x2209,\n  \"notelementof\",\n  0x2209,\n  \"notequal\",\n  0x2260,\n  \"notgreater\",\n  0x226f,\n  \"notgreaternorequal\",\n  0x2271,\n  \"notgreaternorless\",\n  0x2279,\n  \"notidentical\",\n  0x2262,\n  \"notless\",\n  0x226e,\n  \"notlessnorequal\",\n  0x2270,\n  \"notparallel\",\n  0x2226,\n  \"notprecedes\",\n  0x2280,\n  \"notsubset\",\n  0x2284,\n  \"notsucceeds\",\n  0x2281,\n  \"notsuperset\",\n  0x2285,\n  \"nowarmenian\",\n  0x0576,\n  \"nparen\",\n  0x24a9,\n  \"nssquare\",\n  0x33b1,\n  \"nsuperior\",\n  0x207f,\n  \"ntilde\",\n  0x00f1,\n  \"nu\",\n  0x03bd,\n  \"nuhiragana\",\n  0x306c,\n  \"nukatakana\",\n  0x30cc,\n  \"nukatakanahalfwidth\",\n  0xff87,\n  \"nuktabengali\",\n  0x09bc,\n  \"nuktadeva\",\n  0x093c,\n  \"nuktagujarati\",\n  0x0abc,\n  \"nuktagurmukhi\",\n  0x0a3c,\n  \"numbersign\",\n  0x0023,\n  \"numbersignmonospace\",\n  0xff03,\n  \"numbersignsmall\",\n  0xfe5f,\n  \"numeralsigngreek\",\n  0x0374,\n  \"numeralsignlowergreek\",\n  0x0375,\n  \"numero\",\n  0x2116,\n  \"nun\",\n  0x05e0,\n  \"nundagesh\",\n  0xfb40,\n  \"nundageshhebrew\",\n  0xfb40,\n  \"nunhebrew\",\n  0x05e0,\n  \"nvsquare\",\n  0x33b5,\n  \"nwsquare\",\n  0x33bb,\n  \"nyabengali\",\n  0x099e,\n  \"nyadeva\",\n  0x091e,\n  \"nyagujarati\",\n  0x0a9e,\n  \"nyagurmukhi\",\n  0x0a1e,\n  \"o\",\n  0x006f,\n  \"oacute\",\n  0x00f3,\n  \"oangthai\",\n  0x0e2d,\n  \"obarred\",\n  0x0275,\n  \"obarredcyrillic\",\n  0x04e9,\n  \"obarreddieresiscyrillic\",\n  0x04eb,\n  \"obengali\",\n  0x0993,\n  \"obopomofo\",\n  0x311b,\n  \"obreve\",\n  0x014f,\n  \"ocandradeva\",\n  0x0911,\n  \"ocandragujarati\",\n  0x0a91,\n  \"ocandravowelsigndeva\",\n  0x0949,\n  \"ocandravowelsigngujarati\",\n  0x0ac9,\n  \"ocaron\",\n  0x01d2,\n  \"ocircle\",\n  0x24de,\n  \"ocircumflex\",\n  0x00f4,\n  \"ocircumflexacute\",\n  0x1ed1,\n  \"ocircumflexdotbelow\",\n  0x1ed9,\n  \"ocircumflexgrave\",\n  0x1ed3,\n  \"ocircumflexhookabove\",\n  0x1ed5,\n  \"ocircumflextilde\",\n  0x1ed7,\n  \"ocyrillic\",\n  0x043e,\n  \"odblacute\",\n  0x0151,\n  \"odblgrave\",\n  0x020d,\n  \"odeva\",\n  0x0913,\n  \"odieresis\",\n  0x00f6,\n  \"odieresiscyrillic\",\n  0x04e7,\n  \"odotbelow\",\n  0x1ecd,\n  \"oe\",\n  0x0153,\n  \"oekorean\",\n  0x315a,\n  \"ogonek\",\n  0x02db,\n  \"ogonekcmb\",\n  0x0328,\n  \"ograve\",\n  0x00f2,\n  \"ogujarati\",\n  0x0a93,\n  \"oharmenian\",\n  0x0585,\n  \"ohiragana\",\n  0x304a,\n  \"ohookabove\",\n  0x1ecf,\n  \"ohorn\",\n  0x01a1,\n  \"ohornacute\",\n  0x1edb,\n  \"ohorndotbelow\",\n  0x1ee3,\n  \"ohorngrave\",\n  0x1edd,\n  \"ohornhookabove\",\n  0x1edf,\n  \"ohorntilde\",\n  0x1ee1,\n  \"ohungarumlaut\",\n  0x0151,\n  \"oi\",\n  0x01a3,\n  \"oinvertedbreve\",\n  0x020f,\n  \"okatakana\",\n  0x30aa,\n  \"okatakanahalfwidth\",\n  0xff75,\n  \"okorean\",\n  0x3157,\n  \"olehebrew\",\n  0x05ab,\n  \"omacron\",\n  0x014d,\n  \"omacronacute\",\n  0x1e53,\n  \"omacrongrave\",\n  0x1e51,\n  \"omdeva\",\n  0x0950,\n  \"omega\",\n  0x03c9,\n  \"omega1\",\n  0x03d6,\n  \"omegacyrillic\",\n  0x0461,\n  \"omegalatinclosed\",\n  0x0277,\n  \"omegaroundcyrillic\",\n  0x047b,\n  \"omegatitlocyrillic\",\n  0x047d,\n  \"omegatonos\",\n  0x03ce,\n  \"omgujarati\",\n  0x0ad0,\n  \"omicron\",\n  0x03bf,\n  \"omicrontonos\",\n  0x03cc,\n  \"omonospace\",\n  0xff4f,\n  \"one\",\n  0x0031,\n  \"onearabic\",\n  0x0661,\n  \"onebengali\",\n  0x09e7,\n  \"onecircle\",\n  0x2460,\n  \"onecircleinversesansserif\",\n  0x278a,\n  \"onedeva\",\n  0x0967,\n  \"onedotenleader\",\n  0x2024,\n  \"oneeighth\",\n  0x215b,\n  \"onefitted\",\n  0xf6dc,\n  \"onegujarati\",\n  0x0ae7,\n  \"onegurmukhi\",\n  0x0a67,\n  \"onehackarabic\",\n  0x0661,\n  \"onehalf\",\n  0x00bd,\n  \"onehangzhou\",\n  0x3021,\n  \"oneideographicparen\",\n  0x3220,\n  \"oneinferior\",\n  0x2081,\n  \"onemonospace\",\n  0xff11,\n  \"onenumeratorbengali\",\n  0x09f4,\n  \"oneoldstyle\",\n  0xf731,\n  \"oneparen\",\n  0x2474,\n  \"oneperiod\",\n  0x2488,\n  \"onepersian\",\n  0x06f1,\n  \"onequarter\",\n  0x00bc,\n  \"oneroman\",\n  0x2170,\n  \"onesuperior\",\n  0x00b9,\n  \"onethai\",\n  0x0e51,\n  \"onethird\",\n  0x2153,\n  \"oogonek\",\n  0x01eb,\n  \"oogonekmacron\",\n  0x01ed,\n  \"oogurmukhi\",\n  0x0a13,\n  \"oomatragurmukhi\",\n  0x0a4b,\n  \"oopen\",\n  0x0254,\n  \"oparen\",\n  0x24aa,\n  \"openbullet\",\n  0x25e6,\n  \"option\",\n  0x2325,\n  \"ordfeminine\",\n  0x00aa,\n  \"ordmasculine\",\n  0x00ba,\n  \"orthogonal\",\n  0x221f,\n  \"oshortdeva\",\n  0x0912,\n  \"oshortvowelsigndeva\",\n  0x094a,\n  \"oslash\",\n  0x00f8,\n  \"oslashacute\",\n  0x01ff,\n  \"osmallhiragana\",\n  0x3049,\n  \"osmallkatakana\",\n  0x30a9,\n  \"osmallkatakanahalfwidth\",\n  0xff6b,\n  \"ostrokeacute\",\n  0x01ff,\n  \"osuperior\",\n  0xf6f0,\n  \"otcyrillic\",\n  0x047f,\n  \"otilde\",\n  0x00f5,\n  \"otildeacute\",\n  0x1e4d,\n  \"otildedieresis\",\n  0x1e4f,\n  \"oubopomofo\",\n  0x3121,\n  \"overline\",\n  0x203e,\n  \"overlinecenterline\",\n  0xfe4a,\n  \"overlinecmb\",\n  0x0305,\n  \"overlinedashed\",\n  0xfe49,\n  \"overlinedblwavy\",\n  0xfe4c,\n  \"overlinewavy\",\n  0xfe4b,\n  \"overscore\",\n  0x00af,\n  \"ovowelsignbengali\",\n  0x09cb,\n  \"ovowelsigndeva\",\n  0x094b,\n  \"ovowelsigngujarati\",\n  0x0acb,\n  \"p\",\n  0x0070,\n  \"paampssquare\",\n  0x3380,\n  \"paasentosquare\",\n  0x332b,\n  \"pabengali\",\n  0x09aa,\n  \"pacute\",\n  0x1e55,\n  \"padeva\",\n  0x092a,\n  \"pagedown\",\n  0x21df,\n  \"pageup\",\n  0x21de,\n  \"pagujarati\",\n  0x0aaa,\n  \"pagurmukhi\",\n  0x0a2a,\n  \"pahiragana\",\n  0x3071,\n  \"paiyannoithai\",\n  0x0e2f,\n  \"pakatakana\",\n  0x30d1,\n  \"palatalizationcyrilliccmb\",\n  0x0484,\n  \"palochkacyrillic\",\n  0x04c0,\n  \"pansioskorean\",\n  0x317f,\n  \"paragraph\",\n  0x00b6,\n  \"parallel\",\n  0x2225,\n  \"parenleft\",\n  0x0028,\n  \"parenleftaltonearabic\",\n  0xfd3e,\n  \"parenleftbt\",\n  0xf8ed,\n  \"parenleftex\",\n  0xf8ec,\n  \"parenleftinferior\",\n  0x208d,\n  \"parenleftmonospace\",\n  0xff08,\n  \"parenleftsmall\",\n  0xfe59,\n  \"parenleftsuperior\",\n  0x207d,\n  \"parenlefttp\",\n  0xf8eb,\n  \"parenleftvertical\",\n  0xfe35,\n  \"parenright\",\n  0x0029,\n  \"parenrightaltonearabic\",\n  0xfd3f,\n  \"parenrightbt\",\n  0xf8f8,\n  \"parenrightex\",\n  0xf8f7,\n  \"parenrightinferior\",\n  0x208e,\n  \"parenrightmonospace\",\n  0xff09,\n  \"parenrightsmall\",\n  0xfe5a,\n  \"parenrightsuperior\",\n  0x207e,\n  \"parenrighttp\",\n  0xf8f6,\n  \"parenrightvertical\",\n  0xfe36,\n  \"partialdiff\",\n  0x2202,\n  \"paseqhebrew\",\n  0x05c0,\n  \"pashtahebrew\",\n  0x0599,\n  \"pasquare\",\n  0x33a9,\n  \"patah\",\n  0x05b7,\n  \"patah11\",\n  0x05b7,\n  \"patah1d\",\n  0x05b7,\n  \"patah2a\",\n  0x05b7,\n  \"patahhebrew\",\n  0x05b7,\n  \"patahnarrowhebrew\",\n  0x05b7,\n  \"patahquarterhebrew\",\n  0x05b7,\n  \"patahwidehebrew\",\n  0x05b7,\n  \"pazerhebrew\",\n  0x05a1,\n  \"pbopomofo\",\n  0x3106,\n  \"pcircle\",\n  0x24df,\n  \"pdotaccent\",\n  0x1e57,\n  \"pe\",\n  0x05e4,\n  \"pecyrillic\",\n  0x043f,\n  \"pedagesh\",\n  0xfb44,\n  \"pedageshhebrew\",\n  0xfb44,\n  \"peezisquare\",\n  0x333b,\n  \"pefinaldageshhebrew\",\n  0xfb43,\n  \"peharabic\",\n  0x067e,\n  \"peharmenian\",\n  0x057a,\n  \"pehebrew\",\n  0x05e4,\n  \"pehfinalarabic\",\n  0xfb57,\n  \"pehinitialarabic\",\n  0xfb58,\n  \"pehiragana\",\n  0x307a,\n  \"pehmedialarabic\",\n  0xfb59,\n  \"pekatakana\",\n  0x30da,\n  \"pemiddlehookcyrillic\",\n  0x04a7,\n  \"perafehebrew\",\n  0xfb4e,\n  \"percent\",\n  0x0025,\n  \"percentarabic\",\n  0x066a,\n  \"percentmonospace\",\n  0xff05,\n  \"percentsmall\",\n  0xfe6a,\n  \"period\",\n  0x002e,\n  \"periodarmenian\",\n  0x0589,\n  \"periodcentered\",\n  0x00b7,\n  \"periodhalfwidth\",\n  0xff61,\n  \"periodinferior\",\n  0xf6e7,\n  \"periodmonospace\",\n  0xff0e,\n  \"periodsmall\",\n  0xfe52,\n  \"periodsuperior\",\n  0xf6e8,\n  \"perispomenigreekcmb\",\n  0x0342,\n  \"perpendicular\",\n  0x22a5,\n  \"perthousand\",\n  0x2030,\n  \"peseta\",\n  0x20a7,\n  \"pfsquare\",\n  0x338a,\n  \"phabengali\",\n  0x09ab,\n  \"phadeva\",\n  0x092b,\n  \"phagujarati\",\n  0x0aab,\n  \"phagurmukhi\",\n  0x0a2b,\n  \"phi\",\n  0x03c6,\n  \"phi1\",\n  0x03d5,\n  \"phieuphacirclekorean\",\n  0x327a,\n  \"phieuphaparenkorean\",\n  0x321a,\n  \"phieuphcirclekorean\",\n  0x326c,\n  \"phieuphkorean\",\n  0x314d,\n  \"phieuphparenkorean\",\n  0x320c,\n  \"philatin\",\n  0x0278,\n  \"phinthuthai\",\n  0x0e3a,\n  \"phisymbolgreek\",\n  0x03d5,\n  \"phook\",\n  0x01a5,\n  \"phophanthai\",\n  0x0e1e,\n  \"phophungthai\",\n  0x0e1c,\n  \"phosamphaothai\",\n  0x0e20,\n  \"pi\",\n  0x03c0,\n  \"pieupacirclekorean\",\n  0x3273,\n  \"pieupaparenkorean\",\n  0x3213,\n  \"pieupcieuckorean\",\n  0x3176,\n  \"pieupcirclekorean\",\n  0x3265,\n  \"pieupkiyeokkorean\",\n  0x3172,\n  \"pieupkorean\",\n  0x3142,\n  \"pieupparenkorean\",\n  0x3205,\n  \"pieupsioskiyeokkorean\",\n  0x3174,\n  \"pieupsioskorean\",\n  0x3144,\n  \"pieupsiostikeutkorean\",\n  0x3175,\n  \"pieupthieuthkorean\",\n  0x3177,\n  \"pieuptikeutkorean\",\n  0x3173,\n  \"pihiragana\",\n  0x3074,\n  \"pikatakana\",\n  0x30d4,\n  \"pisymbolgreek\",\n  0x03d6,\n  \"piwrarmenian\",\n  0x0583,\n  \"plus\",\n  0x002b,\n  \"plusbelowcmb\",\n  0x031f,\n  \"pluscircle\",\n  0x2295,\n  \"plusminus\",\n  0x00b1,\n  \"plusmod\",\n  0x02d6,\n  \"plusmonospace\",\n  0xff0b,\n  \"plussmall\",\n  0xfe62,\n  \"plussuperior\",\n  0x207a,\n  \"pmonospace\",\n  0xff50,\n  \"pmsquare\",\n  0x33d8,\n  \"pohiragana\",\n  0x307d,\n  \"pointingindexdownwhite\",\n  0x261f,\n  \"pointingindexleftwhite\",\n  0x261c,\n  \"pointingindexrightwhite\",\n  0x261e,\n  \"pointingindexupwhite\",\n  0x261d,\n  \"pokatakana\",\n  0x30dd,\n  \"poplathai\",\n  0x0e1b,\n  \"postalmark\",\n  0x3012,\n  \"postalmarkface\",\n  0x3020,\n  \"pparen\",\n  0x24ab,\n  \"precedes\",\n  0x227a,\n  \"prescription\",\n  0x211e,\n  \"primemod\",\n  0x02b9,\n  \"primereversed\",\n  0x2035,\n  \"product\",\n  0x220f,\n  \"projective\",\n  0x2305,\n  \"prolongedkana\",\n  0x30fc,\n  \"propellor\",\n  0x2318,\n  \"propersubset\",\n  0x2282,\n  \"propersuperset\",\n  0x2283,\n  \"proportion\",\n  0x2237,\n  \"proportional\",\n  0x221d,\n  \"psi\",\n  0x03c8,\n  \"psicyrillic\",\n  0x0471,\n  \"psilipneumatacyrilliccmb\",\n  0x0486,\n  \"pssquare\",\n  0x33b0,\n  \"puhiragana\",\n  0x3077,\n  \"pukatakana\",\n  0x30d7,\n  \"pvsquare\",\n  0x33b4,\n  \"pwsquare\",\n  0x33ba,\n  \"q\",\n  0x0071,\n  \"qadeva\",\n  0x0958,\n  \"qadmahebrew\",\n  0x05a8,\n  \"qafarabic\",\n  0x0642,\n  \"qaffinalarabic\",\n  0xfed6,\n  \"qafinitialarabic\",\n  0xfed7,\n  \"qafmedialarabic\",\n  0xfed8,\n  \"qamats\",\n  0x05b8,\n  \"qamats10\",\n  0x05b8,\n  \"qamats1a\",\n  0x05b8,\n  \"qamats1c\",\n  0x05b8,\n  \"qamats27\",\n  0x05b8,\n  \"qamats29\",\n  0x05b8,\n  \"qamats33\",\n  0x05b8,\n  \"qamatsde\",\n  0x05b8,\n  \"qamatshebrew\",\n  0x05b8,\n  \"qamatsnarrowhebrew\",\n  0x05b8,\n  \"qamatsqatanhebrew\",\n  0x05b8,\n  \"qamatsqatannarrowhebrew\",\n  0x05b8,\n  \"qamatsqatanquarterhebrew\",\n  0x05b8,\n  \"qamatsqatanwidehebrew\",\n  0x05b8,\n  \"qamatsquarterhebrew\",\n  0x05b8,\n  \"qamatswidehebrew\",\n  0x05b8,\n  \"qarneyparahebrew\",\n  0x059f,\n  \"qbopomofo\",\n  0x3111,\n  \"qcircle\",\n  0x24e0,\n  \"qhook\",\n  0x02a0,\n  \"qmonospace\",\n  0xff51,\n  \"qof\",\n  0x05e7,\n  \"qofdagesh\",\n  0xfb47,\n  \"qofdageshhebrew\",\n  0xfb47,\n  \"qofhebrew\",\n  0x05e7,\n  \"qparen\",\n  0x24ac,\n  \"quarternote\",\n  0x2669,\n  \"qubuts\",\n  0x05bb,\n  \"qubuts18\",\n  0x05bb,\n  \"qubuts25\",\n  0x05bb,\n  \"qubuts31\",\n  0x05bb,\n  \"qubutshebrew\",\n  0x05bb,\n  \"qubutsnarrowhebrew\",\n  0x05bb,\n  \"qubutsquarterhebrew\",\n  0x05bb,\n  \"qubutswidehebrew\",\n  0x05bb,\n  \"question\",\n  0x003f,\n  \"questionarabic\",\n  0x061f,\n  \"questionarmenian\",\n  0x055e,\n  \"questiondown\",\n  0x00bf,\n  \"questiondownsmall\",\n  0xf7bf,\n  \"questiongreek\",\n  0x037e,\n  \"questionmonospace\",\n  0xff1f,\n  \"questionsmall\",\n  0xf73f,\n  \"quotedbl\",\n  0x0022,\n  \"quotedblbase\",\n  0x201e,\n  \"quotedblleft\",\n  0x201c,\n  \"quotedblmonospace\",\n  0xff02,\n  \"quotedblprime\",\n  0x301e,\n  \"quotedblprimereversed\",\n  0x301d,\n  \"quotedblright\",\n  0x201d,\n  \"quoteleft\",\n  0x2018,\n  \"quoteleftreversed\",\n  0x201b,\n  \"quotereversed\",\n  0x201b,\n  \"quoteright\",\n  0x2019,\n  \"quoterightn\",\n  0x0149,\n  \"quotesinglbase\",\n  0x201a,\n  \"quotesingle\",\n  0x0027,\n  \"quotesinglemonospace\",\n  0xff07,\n  \"r\",\n  0x0072,\n  \"raarmenian\",\n  0x057c,\n  \"rabengali\",\n  0x09b0,\n  \"racute\",\n  0x0155,\n  \"radeva\",\n  0x0930,\n  \"radical\",\n  0x221a,\n  \"radicalex\",\n  0xf8e5,\n  \"radoverssquare\",\n  0x33ae,\n  \"radoverssquaredsquare\",\n  0x33af,\n  \"radsquare\",\n  0x33ad,\n  \"rafe\",\n  0x05bf,\n  \"rafehebrew\",\n  0x05bf,\n  \"ragujarati\",\n  0x0ab0,\n  \"ragurmukhi\",\n  0x0a30,\n  \"rahiragana\",\n  0x3089,\n  \"rakatakana\",\n  0x30e9,\n  \"rakatakanahalfwidth\",\n  0xff97,\n  \"ralowerdiagonalbengali\",\n  0x09f1,\n  \"ramiddlediagonalbengali\",\n  0x09f0,\n  \"ramshorn\",\n  0x0264,\n  \"ratio\",\n  0x2236,\n  \"rbopomofo\",\n  0x3116,\n  \"rcaron\",\n  0x0159,\n  \"rcedilla\",\n  0x0157,\n  \"rcircle\",\n  0x24e1,\n  \"rcommaaccent\",\n  0x0157,\n  \"rdblgrave\",\n  0x0211,\n  \"rdotaccent\",\n  0x1e59,\n  \"rdotbelow\",\n  0x1e5b,\n  \"rdotbelowmacron\",\n  0x1e5d,\n  \"referencemark\",\n  0x203b,\n  \"reflexsubset\",\n  0x2286,\n  \"reflexsuperset\",\n  0x2287,\n  \"registered\",\n  0x00ae,\n  \"registersans\",\n  0xf8e8,\n  \"registerserif\",\n  0xf6da,\n  \"reharabic\",\n  0x0631,\n  \"reharmenian\",\n  0x0580,\n  \"rehfinalarabic\",\n  0xfeae,\n  \"rehiragana\",\n  0x308c,\n  \"rekatakana\",\n  0x30ec,\n  \"rekatakanahalfwidth\",\n  0xff9a,\n  \"resh\",\n  0x05e8,\n  \"reshdageshhebrew\",\n  0xfb48,\n  \"reshhebrew\",\n  0x05e8,\n  \"reversedtilde\",\n  0x223d,\n  \"reviahebrew\",\n  0x0597,\n  \"reviamugrashhebrew\",\n  0x0597,\n  \"revlogicalnot\",\n  0x2310,\n  \"rfishhook\",\n  0x027e,\n  \"rfishhookreversed\",\n  0x027f,\n  \"rhabengali\",\n  0x09dd,\n  \"rhadeva\",\n  0x095d,\n  \"rho\",\n  0x03c1,\n  \"rhook\",\n  0x027d,\n  \"rhookturned\",\n  0x027b,\n  \"rhookturnedsuperior\",\n  0x02b5,\n  \"rhosymbolgreek\",\n  0x03f1,\n  \"rhotichookmod\",\n  0x02de,\n  \"rieulacirclekorean\",\n  0x3271,\n  \"rieulaparenkorean\",\n  0x3211,\n  \"rieulcirclekorean\",\n  0x3263,\n  \"rieulhieuhkorean\",\n  0x3140,\n  \"rieulkiyeokkorean\",\n  0x313a,\n  \"rieulkiyeoksioskorean\",\n  0x3169,\n  \"rieulkorean\",\n  0x3139,\n  \"rieulmieumkorean\",\n  0x313b,\n  \"rieulpansioskorean\",\n  0x316c,\n  \"rieulparenkorean\",\n  0x3203,\n  \"rieulphieuphkorean\",\n  0x313f,\n  \"rieulpieupkorean\",\n  0x313c,\n  \"rieulpieupsioskorean\",\n  0x316b,\n  \"rieulsioskorean\",\n  0x313d,\n  \"rieulthieuthkorean\",\n  0x313e,\n  \"rieultikeutkorean\",\n  0x316a,\n  \"rieulyeorinhieuhkorean\",\n  0x316d,\n  \"rightangle\",\n  0x221f,\n  \"righttackbelowcmb\",\n  0x0319,\n  \"righttriangle\",\n  0x22bf,\n  \"rihiragana\",\n  0x308a,\n  \"rikatakana\",\n  0x30ea,\n  \"rikatakanahalfwidth\",\n  0xff98,\n  \"ring\",\n  0x02da,\n  \"ringbelowcmb\",\n  0x0325,\n  \"ringcmb\",\n  0x030a,\n  \"ringhalfleft\",\n  0x02bf,\n  \"ringhalfleftarmenian\",\n  0x0559,\n  \"ringhalfleftbelowcmb\",\n  0x031c,\n  \"ringhalfleftcentered\",\n  0x02d3,\n  \"ringhalfright\",\n  0x02be,\n  \"ringhalfrightbelowcmb\",\n  0x0339,\n  \"ringhalfrightcentered\",\n  0x02d2,\n  \"rinvertedbreve\",\n  0x0213,\n  \"rittorusquare\",\n  0x3351,\n  \"rlinebelow\",\n  0x1e5f,\n  \"rlongleg\",\n  0x027c,\n  \"rlonglegturned\",\n  0x027a,\n  \"rmonospace\",\n  0xff52,\n  \"rohiragana\",\n  0x308d,\n  \"rokatakana\",\n  0x30ed,\n  \"rokatakanahalfwidth\",\n  0xff9b,\n  \"roruathai\",\n  0x0e23,\n  \"rparen\",\n  0x24ad,\n  \"rrabengali\",\n  0x09dc,\n  \"rradeva\",\n  0x0931,\n  \"rragurmukhi\",\n  0x0a5c,\n  \"rreharabic\",\n  0x0691,\n  \"rrehfinalarabic\",\n  0xfb8d,\n  \"rrvocalicbengali\",\n  0x09e0,\n  \"rrvocalicdeva\",\n  0x0960,\n  \"rrvocalicgujarati\",\n  0x0ae0,\n  \"rrvocalicvowelsignbengali\",\n  0x09c4,\n  \"rrvocalicvowelsigndeva\",\n  0x0944,\n  \"rrvocalicvowelsigngujarati\",\n  0x0ac4,\n  \"rsuperior\",\n  0xf6f1,\n  \"rtblock\",\n  0x2590,\n  \"rturned\",\n  0x0279,\n  \"rturnedsuperior\",\n  0x02b4,\n  \"ruhiragana\",\n  0x308b,\n  \"rukatakana\",\n  0x30eb,\n  \"rukatakanahalfwidth\",\n  0xff99,\n  \"rupeemarkbengali\",\n  0x09f2,\n  \"rupeesignbengali\",\n  0x09f3,\n  \"rupiah\",\n  0xf6dd,\n  \"ruthai\",\n  0x0e24,\n  \"rvocalicbengali\",\n  0x098b,\n  \"rvocalicdeva\",\n  0x090b,\n  \"rvocalicgujarati\",\n  0x0a8b,\n  \"rvocalicvowelsignbengali\",\n  0x09c3,\n  \"rvocalicvowelsigndeva\",\n  0x0943,\n  \"rvocalicvowelsigngujarati\",\n  0x0ac3,\n  \"s\",\n  0x0073,\n  \"sabengali\",\n  0x09b8,\n  \"sacute\",\n  0x015b,\n  \"sacutedotaccent\",\n  0x1e65,\n  \"sadarabic\",\n  0x0635,\n  \"sadeva\",\n  0x0938,\n  \"sadfinalarabic\",\n  0xfeba,\n  \"sadinitialarabic\",\n  0xfebb,\n  \"sadmedialarabic\",\n  0xfebc,\n  \"sagujarati\",\n  0x0ab8,\n  \"sagurmukhi\",\n  0x0a38,\n  \"sahiragana\",\n  0x3055,\n  \"sakatakana\",\n  0x30b5,\n  \"sakatakanahalfwidth\",\n  0xff7b,\n  \"sallallahoualayhewasallamarabic\",\n  0xfdfa,\n  \"samekh\",\n  0x05e1,\n  \"samekhdagesh\",\n  0xfb41,\n  \"samekhdageshhebrew\",\n  0xfb41,\n  \"samekhhebrew\",\n  0x05e1,\n  \"saraaathai\",\n  0x0e32,\n  \"saraaethai\",\n  0x0e41,\n  \"saraaimaimalaithai\",\n  0x0e44,\n  \"saraaimaimuanthai\",\n  0x0e43,\n  \"saraamthai\",\n  0x0e33,\n  \"saraathai\",\n  0x0e30,\n  \"saraethai\",\n  0x0e40,\n  \"saraiileftthai\",\n  0xf886,\n  \"saraiithai\",\n  0x0e35,\n  \"saraileftthai\",\n  0xf885,\n  \"saraithai\",\n  0x0e34,\n  \"saraothai\",\n  0x0e42,\n  \"saraueeleftthai\",\n  0xf888,\n  \"saraueethai\",\n  0x0e37,\n  \"saraueleftthai\",\n  0xf887,\n  \"sarauethai\",\n  0x0e36,\n  \"sarauthai\",\n  0x0e38,\n  \"sarauuthai\",\n  0x0e39,\n  \"sbopomofo\",\n  0x3119,\n  \"scaron\",\n  0x0161,\n  \"scarondotaccent\",\n  0x1e67,\n  \"scedilla\",\n  0x015f,\n  \"schwa\",\n  0x0259,\n  \"schwacyrillic\",\n  0x04d9,\n  \"schwadieresiscyrillic\",\n  0x04db,\n  \"schwahook\",\n  0x025a,\n  \"scircle\",\n  0x24e2,\n  \"scircumflex\",\n  0x015d,\n  \"scommaaccent\",\n  0x0219,\n  \"sdotaccent\",\n  0x1e61,\n  \"sdotbelow\",\n  0x1e63,\n  \"sdotbelowdotaccent\",\n  0x1e69,\n  \"seagullbelowcmb\",\n  0x033c,\n  \"second\",\n  0x2033,\n  \"secondtonechinese\",\n  0x02ca,\n  \"section\",\n  0x00a7,\n  \"seenarabic\",\n  0x0633,\n  \"seenfinalarabic\",\n  0xfeb2,\n  \"seeninitialarabic\",\n  0xfeb3,\n  \"seenmedialarabic\",\n  0xfeb4,\n  \"segol\",\n  0x05b6,\n  \"segol13\",\n  0x05b6,\n  \"segol1f\",\n  0x05b6,\n  \"segol2c\",\n  0x05b6,\n  \"segolhebrew\",\n  0x05b6,\n  \"segolnarrowhebrew\",\n  0x05b6,\n  \"segolquarterhebrew\",\n  0x05b6,\n  \"segoltahebrew\",\n  0x0592,\n  \"segolwidehebrew\",\n  0x05b6,\n  \"seharmenian\",\n  0x057d,\n  \"sehiragana\",\n  0x305b,\n  \"sekatakana\",\n  0x30bb,\n  \"sekatakanahalfwidth\",\n  0xff7e,\n  \"semicolon\",\n  0x003b,\n  \"semicolonarabic\",\n  0x061b,\n  \"semicolonmonospace\",\n  0xff1b,\n  \"semicolonsmall\",\n  0xfe54,\n  \"semivoicedmarkkana\",\n  0x309c,\n  \"semivoicedmarkkanahalfwidth\",\n  0xff9f,\n  \"sentisquare\",\n  0x3322,\n  \"sentosquare\",\n  0x3323,\n  \"seven\",\n  0x0037,\n  \"sevenarabic\",\n  0x0667,\n  \"sevenbengali\",\n  0x09ed,\n  \"sevencircle\",\n  0x2466,\n  \"sevencircleinversesansserif\",\n  0x2790,\n  \"sevendeva\",\n  0x096d,\n  \"seveneighths\",\n  0x215e,\n  \"sevengujarati\",\n  0x0aed,\n  \"sevengurmukhi\",\n  0x0a6d,\n  \"sevenhackarabic\",\n  0x0667,\n  \"sevenhangzhou\",\n  0x3027,\n  \"sevenideographicparen\",\n  0x3226,\n  \"seveninferior\",\n  0x2087,\n  \"sevenmonospace\",\n  0xff17,\n  \"sevenoldstyle\",\n  0xf737,\n  \"sevenparen\",\n  0x247a,\n  \"sevenperiod\",\n  0x248e,\n  \"sevenpersian\",\n  0x06f7,\n  \"sevenroman\",\n  0x2176,\n  \"sevensuperior\",\n  0x2077,\n  \"seventeencircle\",\n  0x2470,\n  \"seventeenparen\",\n  0x2484,\n  \"seventeenperiod\",\n  0x2498,\n  \"seventhai\",\n  0x0e57,\n  \"sfthyphen\",\n  0x00ad,\n  \"shaarmenian\",\n  0x0577,\n  \"shabengali\",\n  0x09b6,\n  \"shacyrillic\",\n  0x0448,\n  \"shaddaarabic\",\n  0x0651,\n  \"shaddadammaarabic\",\n  0xfc61,\n  \"shaddadammatanarabic\",\n  0xfc5e,\n  \"shaddafathaarabic\",\n  0xfc60,\n  \"shaddakasraarabic\",\n  0xfc62,\n  \"shaddakasratanarabic\",\n  0xfc5f,\n  \"shade\",\n  0x2592,\n  \"shadedark\",\n  0x2593,\n  \"shadelight\",\n  0x2591,\n  \"shademedium\",\n  0x2592,\n  \"shadeva\",\n  0x0936,\n  \"shagujarati\",\n  0x0ab6,\n  \"shagurmukhi\",\n  0x0a36,\n  \"shalshelethebrew\",\n  0x0593,\n  \"shbopomofo\",\n  0x3115,\n  \"shchacyrillic\",\n  0x0449,\n  \"sheenarabic\",\n  0x0634,\n  \"sheenfinalarabic\",\n  0xfeb6,\n  \"sheeninitialarabic\",\n  0xfeb7,\n  \"sheenmedialarabic\",\n  0xfeb8,\n  \"sheicoptic\",\n  0x03e3,\n  \"sheqel\",\n  0x20aa,\n  \"sheqelhebrew\",\n  0x20aa,\n  \"sheva\",\n  0x05b0,\n  \"sheva115\",\n  0x05b0,\n  \"sheva15\",\n  0x05b0,\n  \"sheva22\",\n  0x05b0,\n  \"sheva2e\",\n  0x05b0,\n  \"shevahebrew\",\n  0x05b0,\n  \"shevanarrowhebrew\",\n  0x05b0,\n  \"shevaquarterhebrew\",\n  0x05b0,\n  \"shevawidehebrew\",\n  0x05b0,\n  \"shhacyrillic\",\n  0x04bb,\n  \"shimacoptic\",\n  0x03ed,\n  \"shin\",\n  0x05e9,\n  \"shindagesh\",\n  0xfb49,\n  \"shindageshhebrew\",\n  0xfb49,\n  \"shindageshshindot\",\n  0xfb2c,\n  \"shindageshshindothebrew\",\n  0xfb2c,\n  \"shindageshsindot\",\n  0xfb2d,\n  \"shindageshsindothebrew\",\n  0xfb2d,\n  \"shindothebrew\",\n  0x05c1,\n  \"shinhebrew\",\n  0x05e9,\n  \"shinshindot\",\n  0xfb2a,\n  \"shinshindothebrew\",\n  0xfb2a,\n  \"shinsindot\",\n  0xfb2b,\n  \"shinsindothebrew\",\n  0xfb2b,\n  \"shook\",\n  0x0282,\n  \"sigma\",\n  0x03c3,\n  \"sigma1\",\n  0x03c2,\n  \"sigmafinal\",\n  0x03c2,\n  \"sigmalunatesymbolgreek\",\n  0x03f2,\n  \"sihiragana\",\n  0x3057,\n  \"sikatakana\",\n  0x30b7,\n  \"sikatakanahalfwidth\",\n  0xff7c,\n  \"siluqhebrew\",\n  0x05bd,\n  \"siluqlefthebrew\",\n  0x05bd,\n  \"similar\",\n  0x223c,\n  \"sindothebrew\",\n  0x05c2,\n  \"siosacirclekorean\",\n  0x3274,\n  \"siosaparenkorean\",\n  0x3214,\n  \"sioscieuckorean\",\n  0x317e,\n  \"sioscirclekorean\",\n  0x3266,\n  \"sioskiyeokkorean\",\n  0x317a,\n  \"sioskorean\",\n  0x3145,\n  \"siosnieunkorean\",\n  0x317b,\n  \"siosparenkorean\",\n  0x3206,\n  \"siospieupkorean\",\n  0x317d,\n  \"siostikeutkorean\",\n  0x317c,\n  \"six\",\n  0x0036,\n  \"sixarabic\",\n  0x0666,\n  \"sixbengali\",\n  0x09ec,\n  \"sixcircle\",\n  0x2465,\n  \"sixcircleinversesansserif\",\n  0x278f,\n  \"sixdeva\",\n  0x096c,\n  \"sixgujarati\",\n  0x0aec,\n  \"sixgurmukhi\",\n  0x0a6c,\n  \"sixhackarabic\",\n  0x0666,\n  \"sixhangzhou\",\n  0x3026,\n  \"sixideographicparen\",\n  0x3225,\n  \"sixinferior\",\n  0x2086,\n  \"sixmonospace\",\n  0xff16,\n  \"sixoldstyle\",\n  0xf736,\n  \"sixparen\",\n  0x2479,\n  \"sixperiod\",\n  0x248d,\n  \"sixpersian\",\n  0x06f6,\n  \"sixroman\",\n  0x2175,\n  \"sixsuperior\",\n  0x2076,\n  \"sixteencircle\",\n  0x246f,\n  \"sixteencurrencydenominatorbengali\",\n  0x09f9,\n  \"sixteenparen\",\n  0x2483,\n  \"sixteenperiod\",\n  0x2497,\n  \"sixthai\",\n  0x0e56,\n  \"slash\",\n  0x002f,\n  \"slashmonospace\",\n  0xff0f,\n  \"slong\",\n  0x017f,\n  \"slongdotaccent\",\n  0x1e9b,\n  \"smileface\",\n  0x263a,\n  \"smonospace\",\n  0xff53,\n  \"sofpasuqhebrew\",\n  0x05c3,\n  \"softhyphen\",\n  0x00ad,\n  \"softsigncyrillic\",\n  0x044c,\n  \"sohiragana\",\n  0x305d,\n  \"sokatakana\",\n  0x30bd,\n  \"sokatakanahalfwidth\",\n  0xff7f,\n  \"soliduslongoverlaycmb\",\n  0x0338,\n  \"solidusshortoverlaycmb\",\n  0x0337,\n  \"sorusithai\",\n  0x0e29,\n  \"sosalathai\",\n  0x0e28,\n  \"sosothai\",\n  0x0e0b,\n  \"sosuathai\",\n  0x0e2a,\n  \"space\",\n  0x0020,\n  \"spacehackarabic\",\n  0x0020,\n  \"spade\",\n  0x2660,\n  \"spadesuitblack\",\n  0x2660,\n  \"spadesuitwhite\",\n  0x2664,\n  \"sparen\",\n  0x24ae,\n  \"squarebelowcmb\",\n  0x033b,\n  \"squarecc\",\n  0x33c4,\n  \"squarecm\",\n  0x339d,\n  \"squarediagonalcrosshatchfill\",\n  0x25a9,\n  \"squarehorizontalfill\",\n  0x25a4,\n  \"squarekg\",\n  0x338f,\n  \"squarekm\",\n  0x339e,\n  \"squarekmcapital\",\n  0x33ce,\n  \"squareln\",\n  0x33d1,\n  \"squarelog\",\n  0x33d2,\n  \"squaremg\",\n  0x338e,\n  \"squaremil\",\n  0x33d5,\n  \"squaremm\",\n  0x339c,\n  \"squaremsquared\",\n  0x33a1,\n  \"squareorthogonalcrosshatchfill\",\n  0x25a6,\n  \"squareupperlefttolowerrightfill\",\n  0x25a7,\n  \"squareupperrighttolowerleftfill\",\n  0x25a8,\n  \"squareverticalfill\",\n  0x25a5,\n  \"squarewhitewithsmallblack\",\n  0x25a3,\n  \"srsquare\",\n  0x33db,\n  \"ssabengali\",\n  0x09b7,\n  \"ssadeva\",\n  0x0937,\n  \"ssagujarati\",\n  0x0ab7,\n  \"ssangcieuckorean\",\n  0x3149,\n  \"ssanghieuhkorean\",\n  0x3185,\n  \"ssangieungkorean\",\n  0x3180,\n  \"ssangkiyeokkorean\",\n  0x3132,\n  \"ssangnieunkorean\",\n  0x3165,\n  \"ssangpieupkorean\",\n  0x3143,\n  \"ssangsioskorean\",\n  0x3146,\n  \"ssangtikeutkorean\",\n  0x3138,\n  \"ssuperior\",\n  0xf6f2,\n  \"sterling\",\n  0x00a3,\n  \"sterlingmonospace\",\n  0xffe1,\n  \"strokelongoverlaycmb\",\n  0x0336,\n  \"strokeshortoverlaycmb\",\n  0x0335,\n  \"subset\",\n  0x2282,\n  \"subsetnotequal\",\n  0x228a,\n  \"subsetorequal\",\n  0x2286,\n  \"succeeds\",\n  0x227b,\n  \"suchthat\",\n  0x220b,\n  \"suhiragana\",\n  0x3059,\n  \"sukatakana\",\n  0x30b9,\n  \"sukatakanahalfwidth\",\n  0xff7d,\n  \"sukunarabic\",\n  0x0652,\n  \"summation\",\n  0x2211,\n  \"sun\",\n  0x263c,\n  \"superset\",\n  0x2283,\n  \"supersetnotequal\",\n  0x228b,\n  \"supersetorequal\",\n  0x2287,\n  \"svsquare\",\n  0x33dc,\n  \"syouwaerasquare\",\n  0x337c,\n  \"t\",\n  0x0074,\n  \"tabengali\",\n  0x09a4,\n  \"tackdown\",\n  0x22a4,\n  \"tackleft\",\n  0x22a3,\n  \"tadeva\",\n  0x0924,\n  \"tagujarati\",\n  0x0aa4,\n  \"tagurmukhi\",\n  0x0a24,\n  \"taharabic\",\n  0x0637,\n  \"tahfinalarabic\",\n  0xfec2,\n  \"tahinitialarabic\",\n  0xfec3,\n  \"tahiragana\",\n  0x305f,\n  \"tahmedialarabic\",\n  0xfec4,\n  \"taisyouerasquare\",\n  0x337d,\n  \"takatakana\",\n  0x30bf,\n  \"takatakanahalfwidth\",\n  0xff80,\n  \"tatweelarabic\",\n  0x0640,\n  \"tau\",\n  0x03c4,\n  \"tav\",\n  0x05ea,\n  \"tavdages\",\n  0xfb4a,\n  \"tavdagesh\",\n  0xfb4a,\n  \"tavdageshhebrew\",\n  0xfb4a,\n  \"tavhebrew\",\n  0x05ea,\n  \"tbar\",\n  0x0167,\n  \"tbopomofo\",\n  0x310a,\n  \"tcaron\",\n  0x0165,\n  \"tccurl\",\n  0x02a8,\n  \"tcedilla\",\n  0x0163,\n  \"tcheharabic\",\n  0x0686,\n  \"tchehfinalarabic\",\n  0xfb7b,\n  \"tchehinitialarabic\",\n  0xfb7c,\n  \"tchehmedialarabic\",\n  0xfb7d,\n  \"tcircle\",\n  0x24e3,\n  \"tcircumflexbelow\",\n  0x1e71,\n  \"tcommaaccent\",\n  0x0163,\n  \"tdieresis\",\n  0x1e97,\n  \"tdotaccent\",\n  0x1e6b,\n  \"tdotbelow\",\n  0x1e6d,\n  \"tecyrillic\",\n  0x0442,\n  \"tedescendercyrillic\",\n  0x04ad,\n  \"teharabic\",\n  0x062a,\n  \"tehfinalarabic\",\n  0xfe96,\n  \"tehhahinitialarabic\",\n  0xfca2,\n  \"tehhahisolatedarabic\",\n  0xfc0c,\n  \"tehinitialarabic\",\n  0xfe97,\n  \"tehiragana\",\n  0x3066,\n  \"tehjeeminitialarabic\",\n  0xfca1,\n  \"tehjeemisolatedarabic\",\n  0xfc0b,\n  \"tehmarbutaarabic\",\n  0x0629,\n  \"tehmarbutafinalarabic\",\n  0xfe94,\n  \"tehmedialarabic\",\n  0xfe98,\n  \"tehmeeminitialarabic\",\n  0xfca4,\n  \"tehmeemisolatedarabic\",\n  0xfc0e,\n  \"tehnoonfinalarabic\",\n  0xfc73,\n  \"tekatakana\",\n  0x30c6,\n  \"tekatakanahalfwidth\",\n  0xff83,\n  \"telephone\",\n  0x2121,\n  \"telephoneblack\",\n  0x260e,\n  \"telishagedolahebrew\",\n  0x05a0,\n  \"telishaqetanahebrew\",\n  0x05a9,\n  \"tencircle\",\n  0x2469,\n  \"tenideographicparen\",\n  0x3229,\n  \"tenparen\",\n  0x247d,\n  \"tenperiod\",\n  0x2491,\n  \"tenroman\",\n  0x2179,\n  \"tesh\",\n  0x02a7,\n  \"tet\",\n  0x05d8,\n  \"tetdagesh\",\n  0xfb38,\n  \"tetdageshhebrew\",\n  0xfb38,\n  \"tethebrew\",\n  0x05d8,\n  \"tetsecyrillic\",\n  0x04b5,\n  \"tevirhebrew\",\n  0x059b,\n  \"tevirlefthebrew\",\n  0x059b,\n  \"thabengali\",\n  0x09a5,\n  \"thadeva\",\n  0x0925,\n  \"thagujarati\",\n  0x0aa5,\n  \"thagurmukhi\",\n  0x0a25,\n  \"thalarabic\",\n  0x0630,\n  \"thalfinalarabic\",\n  0xfeac,\n  \"thanthakhatlowleftthai\",\n  0xf898,\n  \"thanthakhatlowrightthai\",\n  0xf897,\n  \"thanthakhatthai\",\n  0x0e4c,\n  \"thanthakhatupperleftthai\",\n  0xf896,\n  \"theharabic\",\n  0x062b,\n  \"thehfinalarabic\",\n  0xfe9a,\n  \"thehinitialarabic\",\n  0xfe9b,\n  \"thehmedialarabic\",\n  0xfe9c,\n  \"thereexists\",\n  0x2203,\n  \"therefore\",\n  0x2234,\n  \"theta\",\n  0x03b8,\n  \"theta1\",\n  0x03d1,\n  \"thetasymbolgreek\",\n  0x03d1,\n  \"thieuthacirclekorean\",\n  0x3279,\n  \"thieuthaparenkorean\",\n  0x3219,\n  \"thieuthcirclekorean\",\n  0x326b,\n  \"thieuthkorean\",\n  0x314c,\n  \"thieuthparenkorean\",\n  0x320b,\n  \"thirteencircle\",\n  0x246c,\n  \"thirteenparen\",\n  0x2480,\n  \"thirteenperiod\",\n  0x2494,\n  \"thonangmonthothai\",\n  0x0e11,\n  \"thook\",\n  0x01ad,\n  \"thophuthaothai\",\n  0x0e12,\n  \"thorn\",\n  0x00fe,\n  \"thothahanthai\",\n  0x0e17,\n  \"thothanthai\",\n  0x0e10,\n  \"thothongthai\",\n  0x0e18,\n  \"thothungthai\",\n  0x0e16,\n  \"thousandcyrillic\",\n  0x0482,\n  \"thousandsseparatorarabic\",\n  0x066c,\n  \"thousandsseparatorpersian\",\n  0x066c,\n  \"three\",\n  0x0033,\n  \"threearabic\",\n  0x0663,\n  \"threebengali\",\n  0x09e9,\n  \"threecircle\",\n  0x2462,\n  \"threecircleinversesansserif\",\n  0x278c,\n  \"threedeva\",\n  0x0969,\n  \"threeeighths\",\n  0x215c,\n  \"threegujarati\",\n  0x0ae9,\n  \"threegurmukhi\",\n  0x0a69,\n  \"threehackarabic\",\n  0x0663,\n  \"threehangzhou\",\n  0x3023,\n  \"threeideographicparen\",\n  0x3222,\n  \"threeinferior\",\n  0x2083,\n  \"threemonospace\",\n  0xff13,\n  \"threenumeratorbengali\",\n  0x09f6,\n  \"threeoldstyle\",\n  0xf733,\n  \"threeparen\",\n  0x2476,\n  \"threeperiod\",\n  0x248a,\n  \"threepersian\",\n  0x06f3,\n  \"threequarters\",\n  0x00be,\n  \"threequartersemdash\",\n  0xf6de,\n  \"threeroman\",\n  0x2172,\n  \"threesuperior\",\n  0x00b3,\n  \"threethai\",\n  0x0e53,\n  \"thzsquare\",\n  0x3394,\n  \"tihiragana\",\n  0x3061,\n  \"tikatakana\",\n  0x30c1,\n  \"tikatakanahalfwidth\",\n  0xff81,\n  \"tikeutacirclekorean\",\n  0x3270,\n  \"tikeutaparenkorean\",\n  0x3210,\n  \"tikeutcirclekorean\",\n  0x3262,\n  \"tikeutkorean\",\n  0x3137,\n  \"tikeutparenkorean\",\n  0x3202,\n  \"tilde\",\n  0x02dc,\n  \"tildebelowcmb\",\n  0x0330,\n  \"tildecmb\",\n  0x0303,\n  \"tildecomb\",\n  0x0303,\n  \"tildedoublecmb\",\n  0x0360,\n  \"tildeoperator\",\n  0x223c,\n  \"tildeoverlaycmb\",\n  0x0334,\n  \"tildeverticalcmb\",\n  0x033e,\n  \"timescircle\",\n  0x2297,\n  \"tipehahebrew\",\n  0x0596,\n  \"tipehalefthebrew\",\n  0x0596,\n  \"tippigurmukhi\",\n  0x0a70,\n  \"titlocyrilliccmb\",\n  0x0483,\n  \"tiwnarmenian\",\n  0x057f,\n  \"tlinebelow\",\n  0x1e6f,\n  \"tmonospace\",\n  0xff54,\n  \"toarmenian\",\n  0x0569,\n  \"tohiragana\",\n  0x3068,\n  \"tokatakana\",\n  0x30c8,\n  \"tokatakanahalfwidth\",\n  0xff84,\n  \"tonebarextrahighmod\",\n  0x02e5,\n  \"tonebarextralowmod\",\n  0x02e9,\n  \"tonebarhighmod\",\n  0x02e6,\n  \"tonebarlowmod\",\n  0x02e8,\n  \"tonebarmidmod\",\n  0x02e7,\n  \"tonefive\",\n  0x01bd,\n  \"tonesix\",\n  0x0185,\n  \"tonetwo\",\n  0x01a8,\n  \"tonos\",\n  0x0384,\n  \"tonsquare\",\n  0x3327,\n  \"topatakthai\",\n  0x0e0f,\n  \"tortoiseshellbracketleft\",\n  0x3014,\n  \"tortoiseshellbracketleftsmall\",\n  0xfe5d,\n  \"tortoiseshellbracketleftvertical\",\n  0xfe39,\n  \"tortoiseshellbracketright\",\n  0x3015,\n  \"tortoiseshellbracketrightsmall\",\n  0xfe5e,\n  \"tortoiseshellbracketrightvertical\",\n  0xfe3a,\n  \"totaothai\",\n  0x0e15,\n  \"tpalatalhook\",\n  0x01ab,\n  \"tparen\",\n  0x24af,\n  \"trademark\",\n  0x2122,\n  \"trademarksans\",\n  0xf8ea,\n  \"trademarkserif\",\n  0xf6db,\n  \"tretroflexhook\",\n  0x0288,\n  \"triagdn\",\n  0x25bc,\n  \"triaglf\",\n  0x25c4,\n  \"triagrt\",\n  0x25ba,\n  \"triagup\",\n  0x25b2,\n  \"ts\",\n  0x02a6,\n  \"tsadi\",\n  0x05e6,\n  \"tsadidagesh\",\n  0xfb46,\n  \"tsadidageshhebrew\",\n  0xfb46,\n  \"tsadihebrew\",\n  0x05e6,\n  \"tsecyrillic\",\n  0x0446,\n  \"tsere\",\n  0x05b5,\n  \"tsere12\",\n  0x05b5,\n  \"tsere1e\",\n  0x05b5,\n  \"tsere2b\",\n  0x05b5,\n  \"tserehebrew\",\n  0x05b5,\n  \"tserenarrowhebrew\",\n  0x05b5,\n  \"tserequarterhebrew\",\n  0x05b5,\n  \"tserewidehebrew\",\n  0x05b5,\n  \"tshecyrillic\",\n  0x045b,\n  \"tsuperior\",\n  0xf6f3,\n  \"ttabengali\",\n  0x099f,\n  \"ttadeva\",\n  0x091f,\n  \"ttagujarati\",\n  0x0a9f,\n  \"ttagurmukhi\",\n  0x0a1f,\n  \"tteharabic\",\n  0x0679,\n  \"ttehfinalarabic\",\n  0xfb67,\n  \"ttehinitialarabic\",\n  0xfb68,\n  \"ttehmedialarabic\",\n  0xfb69,\n  \"tthabengali\",\n  0x09a0,\n  \"tthadeva\",\n  0x0920,\n  \"tthagujarati\",\n  0x0aa0,\n  \"tthagurmukhi\",\n  0x0a20,\n  \"tturned\",\n  0x0287,\n  \"tuhiragana\",\n  0x3064,\n  \"tukatakana\",\n  0x30c4,\n  \"tukatakanahalfwidth\",\n  0xff82,\n  \"tusmallhiragana\",\n  0x3063,\n  \"tusmallkatakana\",\n  0x30c3,\n  \"tusmallkatakanahalfwidth\",\n  0xff6f,\n  \"twelvecircle\",\n  0x246b,\n  \"twelveparen\",\n  0x247f,\n  \"twelveperiod\",\n  0x2493,\n  \"twelveroman\",\n  0x217b,\n  \"twentycircle\",\n  0x2473,\n  \"twentyhangzhou\",\n  0x5344,\n  \"twentyparen\",\n  0x2487,\n  \"twentyperiod\",\n  0x249b,\n  \"two\",\n  0x0032,\n  \"twoarabic\",\n  0x0662,\n  \"twobengali\",\n  0x09e8,\n  \"twocircle\",\n  0x2461,\n  \"twocircleinversesansserif\",\n  0x278b,\n  \"twodeva\",\n  0x0968,\n  \"twodotenleader\",\n  0x2025,\n  \"twodotleader\",\n  0x2025,\n  \"twodotleadervertical\",\n  0xfe30,\n  \"twogujarati\",\n  0x0ae8,\n  \"twogurmukhi\",\n  0x0a68,\n  \"twohackarabic\",\n  0x0662,\n  \"twohangzhou\",\n  0x3022,\n  \"twoideographicparen\",\n  0x3221,\n  \"twoinferior\",\n  0x2082,\n  \"twomonospace\",\n  0xff12,\n  \"twonumeratorbengali\",\n  0x09f5,\n  \"twooldstyle\",\n  0xf732,\n  \"twoparen\",\n  0x2475,\n  \"twoperiod\",\n  0x2489,\n  \"twopersian\",\n  0x06f2,\n  \"tworoman\",\n  0x2171,\n  \"twostroke\",\n  0x01bb,\n  \"twosuperior\",\n  0x00b2,\n  \"twothai\",\n  0x0e52,\n  \"twothirds\",\n  0x2154,\n  \"u\",\n  0x0075,\n  \"uacute\",\n  0x00fa,\n  \"ubar\",\n  0x0289,\n  \"ubengali\",\n  0x0989,\n  \"ubopomofo\",\n  0x3128,\n  \"ubreve\",\n  0x016d,\n  \"ucaron\",\n  0x01d4,\n  \"ucircle\",\n  0x24e4,\n  \"ucircumflex\",\n  0x00fb,\n  \"ucircumflexbelow\",\n  0x1e77,\n  \"ucyrillic\",\n  0x0443,\n  \"udattadeva\",\n  0x0951,\n  \"udblacute\",\n  0x0171,\n  \"udblgrave\",\n  0x0215,\n  \"udeva\",\n  0x0909,\n  \"udieresis\",\n  0x00fc,\n  \"udieresisacute\",\n  0x01d8,\n  \"udieresisbelow\",\n  0x1e73,\n  \"udieresiscaron\",\n  0x01da,\n  \"udieresiscyrillic\",\n  0x04f1,\n  \"udieresisgrave\",\n  0x01dc,\n  \"udieresismacron\",\n  0x01d6,\n  \"udotbelow\",\n  0x1ee5,\n  \"ugrave\",\n  0x00f9,\n  \"ugujarati\",\n  0x0a89,\n  \"ugurmukhi\",\n  0x0a09,\n  \"uhiragana\",\n  0x3046,\n  \"uhookabove\",\n  0x1ee7,\n  \"uhorn\",\n  0x01b0,\n  \"uhornacute\",\n  0x1ee9,\n  \"uhorndotbelow\",\n  0x1ef1,\n  \"uhorngrave\",\n  0x1eeb,\n  \"uhornhookabove\",\n  0x1eed,\n  \"uhorntilde\",\n  0x1eef,\n  \"uhungarumlaut\",\n  0x0171,\n  \"uhungarumlautcyrillic\",\n  0x04f3,\n  \"uinvertedbreve\",\n  0x0217,\n  \"ukatakana\",\n  0x30a6,\n  \"ukatakanahalfwidth\",\n  0xff73,\n  \"ukcyrillic\",\n  0x0479,\n  \"ukorean\",\n  0x315c,\n  \"umacron\",\n  0x016b,\n  \"umacroncyrillic\",\n  0x04ef,\n  \"umacrondieresis\",\n  0x1e7b,\n  \"umatragurmukhi\",\n  0x0a41,\n  \"umonospace\",\n  0xff55,\n  \"underscore\",\n  0x005f,\n  \"underscoredbl\",\n  0x2017,\n  \"underscoremonospace\",\n  0xff3f,\n  \"underscorevertical\",\n  0xfe33,\n  \"underscorewavy\",\n  0xfe4f,\n  \"union\",\n  0x222a,\n  \"universal\",\n  0x2200,\n  \"uogonek\",\n  0x0173,\n  \"uparen\",\n  0x24b0,\n  \"upblock\",\n  0x2580,\n  \"upperdothebrew\",\n  0x05c4,\n  \"upsilon\",\n  0x03c5,\n  \"upsilondieresis\",\n  0x03cb,\n  \"upsilondieresistonos\",\n  0x03b0,\n  \"upsilonlatin\",\n  0x028a,\n  \"upsilontonos\",\n  0x03cd,\n  \"uptackbelowcmb\",\n  0x031d,\n  \"uptackmod\",\n  0x02d4,\n  \"uragurmukhi\",\n  0x0a73,\n  \"uring\",\n  0x016f,\n  \"ushortcyrillic\",\n  0x045e,\n  \"usmallhiragana\",\n  0x3045,\n  \"usmallkatakana\",\n  0x30a5,\n  \"usmallkatakanahalfwidth\",\n  0xff69,\n  \"ustraightcyrillic\",\n  0x04af,\n  \"ustraightstrokecyrillic\",\n  0x04b1,\n  \"utilde\",\n  0x0169,\n  \"utildeacute\",\n  0x1e79,\n  \"utildebelow\",\n  0x1e75,\n  \"uubengali\",\n  0x098a,\n  \"uudeva\",\n  0x090a,\n  \"uugujarati\",\n  0x0a8a,\n  \"uugurmukhi\",\n  0x0a0a,\n  \"uumatragurmukhi\",\n  0x0a42,\n  \"uuvowelsignbengali\",\n  0x09c2,\n  \"uuvowelsigndeva\",\n  0x0942,\n  \"uuvowelsigngujarati\",\n  0x0ac2,\n  \"uvowelsignbengali\",\n  0x09c1,\n  \"uvowelsigndeva\",\n  0x0941,\n  \"uvowelsigngujarati\",\n  0x0ac1,\n  \"v\",\n  0x0076,\n  \"vadeva\",\n  0x0935,\n  \"vagujarati\",\n  0x0ab5,\n  \"vagurmukhi\",\n  0x0a35,\n  \"vakatakana\",\n  0x30f7,\n  \"vav\",\n  0x05d5,\n  \"vavdagesh\",\n  0xfb35,\n  \"vavdagesh65\",\n  0xfb35,\n  \"vavdageshhebrew\",\n  0xfb35,\n  \"vavhebrew\",\n  0x05d5,\n  \"vavholam\",\n  0xfb4b,\n  \"vavholamhebrew\",\n  0xfb4b,\n  \"vavvavhebrew\",\n  0x05f0,\n  \"vavyodhebrew\",\n  0x05f1,\n  \"vcircle\",\n  0x24e5,\n  \"vdotbelow\",\n  0x1e7f,\n  \"vecyrillic\",\n  0x0432,\n  \"veharabic\",\n  0x06a4,\n  \"vehfinalarabic\",\n  0xfb6b,\n  \"vehinitialarabic\",\n  0xfb6c,\n  \"vehmedialarabic\",\n  0xfb6d,\n  \"vekatakana\",\n  0x30f9,\n  \"venus\",\n  0x2640,\n  \"verticalbar\",\n  0x007c,\n  \"verticallineabovecmb\",\n  0x030d,\n  \"verticallinebelowcmb\",\n  0x0329,\n  \"verticallinelowmod\",\n  0x02cc,\n  \"verticallinemod\",\n  0x02c8,\n  \"vewarmenian\",\n  0x057e,\n  \"vhook\",\n  0x028b,\n  \"vikatakana\",\n  0x30f8,\n  \"viramabengali\",\n  0x09cd,\n  \"viramadeva\",\n  0x094d,\n  \"viramagujarati\",\n  0x0acd,\n  \"visargabengali\",\n  0x0983,\n  \"visargadeva\",\n  0x0903,\n  \"visargagujarati\",\n  0x0a83,\n  \"vmonospace\",\n  0xff56,\n  \"voarmenian\",\n  0x0578,\n  \"voicediterationhiragana\",\n  0x309e,\n  \"voicediterationkatakana\",\n  0x30fe,\n  \"voicedmarkkana\",\n  0x309b,\n  \"voicedmarkkanahalfwidth\",\n  0xff9e,\n  \"vokatakana\",\n  0x30fa,\n  \"vparen\",\n  0x24b1,\n  \"vtilde\",\n  0x1e7d,\n  \"vturned\",\n  0x028c,\n  \"vuhiragana\",\n  0x3094,\n  \"vukatakana\",\n  0x30f4,\n  \"w\",\n  0x0077,\n  \"wacute\",\n  0x1e83,\n  \"waekorean\",\n  0x3159,\n  \"wahiragana\",\n  0x308f,\n  \"wakatakana\",\n  0x30ef,\n  \"wakatakanahalfwidth\",\n  0xff9c,\n  \"wakorean\",\n  0x3158,\n  \"wasmallhiragana\",\n  0x308e,\n  \"wasmallkatakana\",\n  0x30ee,\n  \"wattosquare\",\n  0x3357,\n  \"wavedash\",\n  0x301c,\n  \"wavyunderscorevertical\",\n  0xfe34,\n  \"wawarabic\",\n  0x0648,\n  \"wawfinalarabic\",\n  0xfeee,\n  \"wawhamzaabovearabic\",\n  0x0624,\n  \"wawhamzaabovefinalarabic\",\n  0xfe86,\n  \"wbsquare\",\n  0x33dd,\n  \"wcircle\",\n  0x24e6,\n  \"wcircumflex\",\n  0x0175,\n  \"wdieresis\",\n  0x1e85,\n  \"wdotaccent\",\n  0x1e87,\n  \"wdotbelow\",\n  0x1e89,\n  \"wehiragana\",\n  0x3091,\n  \"weierstrass\",\n  0x2118,\n  \"wekatakana\",\n  0x30f1,\n  \"wekorean\",\n  0x315e,\n  \"weokorean\",\n  0x315d,\n  \"wgrave\",\n  0x1e81,\n  \"whitebullet\",\n  0x25e6,\n  \"whitecircle\",\n  0x25cb,\n  \"whitecircleinverse\",\n  0x25d9,\n  \"whitecornerbracketleft\",\n  0x300e,\n  \"whitecornerbracketleftvertical\",\n  0xfe43,\n  \"whitecornerbracketright\",\n  0x300f,\n  \"whitecornerbracketrightvertical\",\n  0xfe44,\n  \"whitediamond\",\n  0x25c7,\n  \"whitediamondcontainingblacksmalldiamond\",\n  0x25c8,\n  \"whitedownpointingsmalltriangle\",\n  0x25bf,\n  \"whitedownpointingtriangle\",\n  0x25bd,\n  \"whiteleftpointingsmalltriangle\",\n  0x25c3,\n  \"whiteleftpointingtriangle\",\n  0x25c1,\n  \"whitelenticularbracketleft\",\n  0x3016,\n  \"whitelenticularbracketright\",\n  0x3017,\n  \"whiterightpointingsmalltriangle\",\n  0x25b9,\n  \"whiterightpointingtriangle\",\n  0x25b7,\n  \"whitesmallsquare\",\n  0x25ab,\n  \"whitesmilingface\",\n  0x263a,\n  \"whitesquare\",\n  0x25a1,\n  \"whitestar\",\n  0x2606,\n  \"whitetelephone\",\n  0x260f,\n  \"whitetortoiseshellbracketleft\",\n  0x3018,\n  \"whitetortoiseshellbracketright\",\n  0x3019,\n  \"whiteuppointingsmalltriangle\",\n  0x25b5,\n  \"whiteuppointingtriangle\",\n  0x25b3,\n  \"wihiragana\",\n  0x3090,\n  \"wikatakana\",\n  0x30f0,\n  \"wikorean\",\n  0x315f,\n  \"wmonospace\",\n  0xff57,\n  \"wohiragana\",\n  0x3092,\n  \"wokatakana\",\n  0x30f2,\n  \"wokatakanahalfwidth\",\n  0xff66,\n  \"won\",\n  0x20a9,\n  \"wonmonospace\",\n  0xffe6,\n  \"wowaenthai\",\n  0x0e27,\n  \"wparen\",\n  0x24b2,\n  \"wring\",\n  0x1e98,\n  \"wsuperior\",\n  0x02b7,\n  \"wturned\",\n  0x028d,\n  \"wynn\",\n  0x01bf,\n  \"x\",\n  0x0078,\n  \"xabovecmb\",\n  0x033d,\n  \"xbopomofo\",\n  0x3112,\n  \"xcircle\",\n  0x24e7,\n  \"xdieresis\",\n  0x1e8d,\n  \"xdotaccent\",\n  0x1e8b,\n  \"xeharmenian\",\n  0x056d,\n  \"xi\",\n  0x03be,\n  \"xmonospace\",\n  0xff58,\n  \"xparen\",\n  0x24b3,\n  \"xsuperior\",\n  0x02e3,\n  \"y\",\n  0x0079,\n  \"yaadosquare\",\n  0x334e,\n  \"yabengali\",\n  0x09af,\n  \"yacute\",\n  0x00fd,\n  \"yadeva\",\n  0x092f,\n  \"yaekorean\",\n  0x3152,\n  \"yagujarati\",\n  0x0aaf,\n  \"yagurmukhi\",\n  0x0a2f,\n  \"yahiragana\",\n  0x3084,\n  \"yakatakana\",\n  0x30e4,\n  \"yakatakanahalfwidth\",\n  0xff94,\n  \"yakorean\",\n  0x3151,\n  \"yamakkanthai\",\n  0x0e4e,\n  \"yasmallhiragana\",\n  0x3083,\n  \"yasmallkatakana\",\n  0x30e3,\n  \"yasmallkatakanahalfwidth\",\n  0xff6c,\n  \"yatcyrillic\",\n  0x0463,\n  \"ycircle\",\n  0x24e8,\n  \"ycircumflex\",\n  0x0177,\n  \"ydieresis\",\n  0x00ff,\n  \"ydotaccent\",\n  0x1e8f,\n  \"ydotbelow\",\n  0x1ef5,\n  \"yeharabic\",\n  0x064a,\n  \"yehbarreearabic\",\n  0x06d2,\n  \"yehbarreefinalarabic\",\n  0xfbaf,\n  \"yehfinalarabic\",\n  0xfef2,\n  \"yehhamzaabovearabic\",\n  0x0626,\n  \"yehhamzaabovefinalarabic\",\n  0xfe8a,\n  \"yehhamzaaboveinitialarabic\",\n  0xfe8b,\n  \"yehhamzaabovemedialarabic\",\n  0xfe8c,\n  \"yehinitialarabic\",\n  0xfef3,\n  \"yehmedialarabic\",\n  0xfef4,\n  \"yehmeeminitialarabic\",\n  0xfcdd,\n  \"yehmeemisolatedarabic\",\n  0xfc58,\n  \"yehnoonfinalarabic\",\n  0xfc94,\n  \"yehthreedotsbelowarabic\",\n  0x06d1,\n  \"yekorean\",\n  0x3156,\n  \"yen\",\n  0x00a5,\n  \"yenmonospace\",\n  0xffe5,\n  \"yeokorean\",\n  0x3155,\n  \"yeorinhieuhkorean\",\n  0x3186,\n  \"yerahbenyomohebrew\",\n  0x05aa,\n  \"yerahbenyomolefthebrew\",\n  0x05aa,\n  \"yericyrillic\",\n  0x044b,\n  \"yerudieresiscyrillic\",\n  0x04f9,\n  \"yesieungkorean\",\n  0x3181,\n  \"yesieungpansioskorean\",\n  0x3183,\n  \"yesieungsioskorean\",\n  0x3182,\n  \"yetivhebrew\",\n  0x059a,\n  \"ygrave\",\n  0x1ef3,\n  \"yhook\",\n  0x01b4,\n  \"yhookabove\",\n  0x1ef7,\n  \"yiarmenian\",\n  0x0575,\n  \"yicyrillic\",\n  0x0457,\n  \"yikorean\",\n  0x3162,\n  \"yinyang\",\n  0x262f,\n  \"yiwnarmenian\",\n  0x0582,\n  \"ymonospace\",\n  0xff59,\n  \"yod\",\n  0x05d9,\n  \"yoddagesh\",\n  0xfb39,\n  \"yoddageshhebrew\",\n  0xfb39,\n  \"yodhebrew\",\n  0x05d9,\n  \"yodyodhebrew\",\n  0x05f2,\n  \"yodyodpatahhebrew\",\n  0xfb1f,\n  \"yohiragana\",\n  0x3088,\n  \"yoikorean\",\n  0x3189,\n  \"yokatakana\",\n  0x30e8,\n  \"yokatakanahalfwidth\",\n  0xff96,\n  \"yokorean\",\n  0x315b,\n  \"yosmallhiragana\",\n  0x3087,\n  \"yosmallkatakana\",\n  0x30e7,\n  \"yosmallkatakanahalfwidth\",\n  0xff6e,\n  \"yotgreek\",\n  0x03f3,\n  \"yoyaekorean\",\n  0x3188,\n  \"yoyakorean\",\n  0x3187,\n  \"yoyakthai\",\n  0x0e22,\n  \"yoyingthai\",\n  0x0e0d,\n  \"yparen\",\n  0x24b4,\n  \"ypogegrammeni\",\n  0x037a,\n  \"ypogegrammenigreekcmb\",\n  0x0345,\n  \"yr\",\n  0x01a6,\n  \"yring\",\n  0x1e99,\n  \"ysuperior\",\n  0x02b8,\n  \"ytilde\",\n  0x1ef9,\n  \"yturned\",\n  0x028e,\n  \"yuhiragana\",\n  0x3086,\n  \"yuikorean\",\n  0x318c,\n  \"yukatakana\",\n  0x30e6,\n  \"yukatakanahalfwidth\",\n  0xff95,\n  \"yukorean\",\n  0x3160,\n  \"yusbigcyrillic\",\n  0x046b,\n  \"yusbigiotifiedcyrillic\",\n  0x046d,\n  \"yuslittlecyrillic\",\n  0x0467,\n  \"yuslittleiotifiedcyrillic\",\n  0x0469,\n  \"yusmallhiragana\",\n  0x3085,\n  \"yusmallkatakana\",\n  0x30e5,\n  \"yusmallkatakanahalfwidth\",\n  0xff6d,\n  \"yuyekorean\",\n  0x318b,\n  \"yuyeokorean\",\n  0x318a,\n  \"yyabengali\",\n  0x09df,\n  \"yyadeva\",\n  0x095f,\n  \"z\",\n  0x007a,\n  \"zaarmenian\",\n  0x0566,\n  \"zacute\",\n  0x017a,\n  \"zadeva\",\n  0x095b,\n  \"zagurmukhi\",\n  0x0a5b,\n  \"zaharabic\",\n  0x0638,\n  \"zahfinalarabic\",\n  0xfec6,\n  \"zahinitialarabic\",\n  0xfec7,\n  \"zahiragana\",\n  0x3056,\n  \"zahmedialarabic\",\n  0xfec8,\n  \"zainarabic\",\n  0x0632,\n  \"zainfinalarabic\",\n  0xfeb0,\n  \"zakatakana\",\n  0x30b6,\n  \"zaqefgadolhebrew\",\n  0x0595,\n  \"zaqefqatanhebrew\",\n  0x0594,\n  \"zarqahebrew\",\n  0x0598,\n  \"zayin\",\n  0x05d6,\n  \"zayindagesh\",\n  0xfb36,\n  \"zayindageshhebrew\",\n  0xfb36,\n  \"zayinhebrew\",\n  0x05d6,\n  \"zbopomofo\",\n  0x3117,\n  \"zcaron\",\n  0x017e,\n  \"zcircle\",\n  0x24e9,\n  \"zcircumflex\",\n  0x1e91,\n  \"zcurl\",\n  0x0291,\n  \"zdot\",\n  0x017c,\n  \"zdotaccent\",\n  0x017c,\n  \"zdotbelow\",\n  0x1e93,\n  \"zecyrillic\",\n  0x0437,\n  \"zedescendercyrillic\",\n  0x0499,\n  \"zedieresiscyrillic\",\n  0x04df,\n  \"zehiragana\",\n  0x305c,\n  \"zekatakana\",\n  0x30bc,\n  \"zero\",\n  0x0030,\n  \"zeroarabic\",\n  0x0660,\n  \"zerobengali\",\n  0x09e6,\n  \"zerodeva\",\n  0x0966,\n  \"zerogujarati\",\n  0x0ae6,\n  \"zerogurmukhi\",\n  0x0a66,\n  \"zerohackarabic\",\n  0x0660,\n  \"zeroinferior\",\n  0x2080,\n  \"zeromonospace\",\n  0xff10,\n  \"zerooldstyle\",\n  0xf730,\n  \"zeropersian\",\n  0x06f0,\n  \"zerosuperior\",\n  0x2070,\n  \"zerothai\",\n  0x0e50,\n  \"zerowidthjoiner\",\n  0xfeff,\n  \"zerowidthnonjoiner\",\n  0x200c,\n  \"zerowidthspace\",\n  0x200b,\n  \"zeta\",\n  0x03b6,\n  \"zhbopomofo\",\n  0x3113,\n  \"zhearmenian\",\n  0x056a,\n  \"zhebrevecyrillic\",\n  0x04c2,\n  \"zhecyrillic\",\n  0x0436,\n  \"zhedescendercyrillic\",\n  0x0497,\n  \"zhedieresiscyrillic\",\n  0x04dd,\n  \"zihiragana\",\n  0x3058,\n  \"zikatakana\",\n  0x30b8,\n  \"zinorhebrew\",\n  0x05ae,\n  \"zlinebelow\",\n  0x1e95,\n  \"zmonospace\",\n  0xff5a,\n  \"zohiragana\",\n  0x305e,\n  \"zokatakana\",\n  0x30be,\n  \"zparen\",\n  0x24b5,\n  \"zretroflexhook\",\n  0x0290,\n  \"zstroke\",\n  0x01b6,\n  \"zuhiragana\",\n  0x305a,\n  \"zukatakana\",\n  0x30ba,\n  \".notdef\",\n  0x0000,\n  \"angbracketleftbig\",\n  0x2329,\n  \"angbracketleftBig\",\n  0x2329,\n  \"angbracketleftbigg\",\n  0x2329,\n  \"angbracketleftBigg\",\n  0x2329,\n  \"angbracketrightBig\",\n  0x232a,\n  \"angbracketrightbig\",\n  0x232a,\n  \"angbracketrightBigg\",\n  0x232a,\n  \"angbracketrightbigg\",\n  0x232a,\n  \"arrowhookleft\",\n  0x21aa,\n  \"arrowhookright\",\n  0x21a9,\n  \"arrowlefttophalf\",\n  0x21bc,\n  \"arrowleftbothalf\",\n  0x21bd,\n  \"arrownortheast\",\n  0x2197,\n  \"arrownorthwest\",\n  0x2196,\n  \"arrowrighttophalf\",\n  0x21c0,\n  \"arrowrightbothalf\",\n  0x21c1,\n  \"arrowsoutheast\",\n  0x2198,\n  \"arrowsouthwest\",\n  0x2199,\n  \"backslashbig\",\n  0x2216,\n  \"backslashBig\",\n  0x2216,\n  \"backslashBigg\",\n  0x2216,\n  \"backslashbigg\",\n  0x2216,\n  \"bardbl\",\n  0x2016,\n  \"bracehtipdownleft\",\n  0xfe37,\n  \"bracehtipdownright\",\n  0xfe37,\n  \"bracehtipupleft\",\n  0xfe38,\n  \"bracehtipupright\",\n  0xfe38,\n  \"braceleftBig\",\n  0x007b,\n  \"braceleftbig\",\n  0x007b,\n  \"braceleftbigg\",\n  0x007b,\n  \"braceleftBigg\",\n  0x007b,\n  \"bracerightBig\",\n  0x007d,\n  \"bracerightbig\",\n  0x007d,\n  \"bracerightbigg\",\n  0x007d,\n  \"bracerightBigg\",\n  0x007d,\n  \"bracketleftbig\",\n  0x005b,\n  \"bracketleftBig\",\n  0x005b,\n  \"bracketleftbigg\",\n  0x005b,\n  \"bracketleftBigg\",\n  0x005b,\n  \"bracketrightBig\",\n  0x005d,\n  \"bracketrightbig\",\n  0x005d,\n  \"bracketrightbigg\",\n  0x005d,\n  \"bracketrightBigg\",\n  0x005d,\n  \"ceilingleftbig\",\n  0x2308,\n  \"ceilingleftBig\",\n  0x2308,\n  \"ceilingleftBigg\",\n  0x2308,\n  \"ceilingleftbigg\",\n  0x2308,\n  \"ceilingrightbig\",\n  0x2309,\n  \"ceilingrightBig\",\n  0x2309,\n  \"ceilingrightbigg\",\n  0x2309,\n  \"ceilingrightBigg\",\n  0x2309,\n  \"circledotdisplay\",\n  0x2299,\n  \"circledottext\",\n  0x2299,\n  \"circlemultiplydisplay\",\n  0x2297,\n  \"circlemultiplytext\",\n  0x2297,\n  \"circleplusdisplay\",\n  0x2295,\n  \"circleplustext\",\n  0x2295,\n  \"contintegraldisplay\",\n  0x222e,\n  \"contintegraltext\",\n  0x222e,\n  \"coproductdisplay\",\n  0x2210,\n  \"coproducttext\",\n  0x2210,\n  \"floorleftBig\",\n  0x230a,\n  \"floorleftbig\",\n  0x230a,\n  \"floorleftbigg\",\n  0x230a,\n  \"floorleftBigg\",\n  0x230a,\n  \"floorrightbig\",\n  0x230b,\n  \"floorrightBig\",\n  0x230b,\n  \"floorrightBigg\",\n  0x230b,\n  \"floorrightbigg\",\n  0x230b,\n  \"hatwide\",\n  0x0302,\n  \"hatwider\",\n  0x0302,\n  \"hatwidest\",\n  0x0302,\n  \"intercal\",\n  0x1d40,\n  \"integraldisplay\",\n  0x222b,\n  \"integraltext\",\n  0x222b,\n  \"intersectiondisplay\",\n  0x22c2,\n  \"intersectiontext\",\n  0x22c2,\n  \"logicalanddisplay\",\n  0x2227,\n  \"logicalandtext\",\n  0x2227,\n  \"logicalordisplay\",\n  0x2228,\n  \"logicalortext\",\n  0x2228,\n  \"parenleftBig\",\n  0x0028,\n  \"parenleftbig\",\n  0x0028,\n  \"parenleftBigg\",\n  0x0028,\n  \"parenleftbigg\",\n  0x0028,\n  \"parenrightBig\",\n  0x0029,\n  \"parenrightbig\",\n  0x0029,\n  \"parenrightBigg\",\n  0x0029,\n  \"parenrightbigg\",\n  0x0029,\n  \"prime\",\n  0x2032,\n  \"productdisplay\",\n  0x220f,\n  \"producttext\",\n  0x220f,\n  \"radicalbig\",\n  0x221a,\n  \"radicalBig\",\n  0x221a,\n  \"radicalBigg\",\n  0x221a,\n  \"radicalbigg\",\n  0x221a,\n  \"radicalbt\",\n  0x221a,\n  \"radicaltp\",\n  0x221a,\n  \"radicalvertex\",\n  0x221a,\n  \"slashbig\",\n  0x002f,\n  \"slashBig\",\n  0x002f,\n  \"slashBigg\",\n  0x002f,\n  \"slashbigg\",\n  0x002f,\n  \"summationdisplay\",\n  0x2211,\n  \"summationtext\",\n  0x2211,\n  \"tildewide\",\n  0x02dc,\n  \"tildewider\",\n  0x02dc,\n  \"tildewidest\",\n  0x02dc,\n  \"uniondisplay\",\n  0x22c3,\n  \"unionmultidisplay\",\n  0x228e,\n  \"unionmultitext\",\n  0x228e,\n  \"unionsqdisplay\",\n  0x2294,\n  \"unionsqtext\",\n  0x2294,\n  \"uniontext\",\n  0x22c3,\n  \"vextenddouble\",\n  0x2225,\n  \"vextendsingle\",\n  0x2223\n ];\n});\nconst getDingbatsGlyphsUnicode = (0,_core_utils_js__WEBPACK_IMPORTED_MODULE_0__.getArrayLookupTableFactory)(function () {\n return [\n  \"space\",\n  0x0020,\n  \"a1\",\n  0x2701,\n  \"a2\",\n  0x2702,\n  \"a202\",\n  0x2703,\n  \"a3\",\n  0x2704,\n  \"a4\",\n  0x260e,\n  \"a5\",\n  0x2706,\n  \"a119\",\n  0x2707,\n  \"a118\",\n  0x2708,\n  \"a117\",\n  0x2709,\n  \"a11\",\n  0x261b,\n  \"a12\",\n  0x261e,\n  \"a13\",\n  0x270c,\n  \"a14\",\n  0x270d,\n  \"a15\",\n  0x270e,\n  \"a16\",\n  0x270f,\n  \"a105\",\n  0x2710,\n  \"a17\",\n  0x2711,\n  \"a18\",\n  0x2712,\n  \"a19\",\n  0x2713,\n  \"a20\",\n  0x2714,\n  \"a21\",\n  0x2715,\n  \"a22\",\n  0x2716,\n  \"a23\",\n  0x2717,\n  \"a24\",\n  0x2718,\n  \"a25\",\n  0x2719,\n  \"a26\",\n  0x271a,\n  \"a27\",\n  0x271b,\n  \"a28\",\n  0x271c,\n  \"a6\",\n  0x271d,\n  \"a7\",\n  0x271e,\n  \"a8\",\n  0x271f,\n  \"a9\",\n  0x2720,\n  \"a10\",\n  0x2721,\n  \"a29\",\n  0x2722,\n  \"a30\",\n  0x2723,\n  \"a31\",\n  0x2724,\n  \"a32\",\n  0x2725,\n  \"a33\",\n  0x2726,\n  \"a34\",\n  0x2727,\n  \"a35\",\n  0x2605,\n  \"a36\",\n  0x2729,\n  \"a37\",\n  0x272a,\n  \"a38\",\n  0x272b,\n  \"a39\",\n  0x272c,\n  \"a40\",\n  0x272d,\n  \"a41\",\n  0x272e,\n  \"a42\",\n  0x272f,\n  \"a43\",\n  0x2730,\n  \"a44\",\n  0x2731,\n  \"a45\",\n  0x2732,\n  \"a46\",\n  0x2733,\n  \"a47\",\n  0x2734,\n  \"a48\",\n  0x2735,\n  \"a49\",\n  0x2736,\n  \"a50\",\n  0x2737,\n  \"a51\",\n  0x2738,\n  \"a52\",\n  0x2739,\n  \"a53\",\n  0x273a,\n  \"a54\",\n  0x273b,\n  \"a55\",\n  0x273c,\n  \"a56\",\n  0x273d,\n  \"a57\",\n  0x273e,\n  \"a58\",\n  0x273f,\n  \"a59\",\n  0x2740,\n  \"a60\",\n  0x2741,\n  \"a61\",\n  0x2742,\n  \"a62\",\n  0x2743,\n  \"a63\",\n  0x2744,\n  \"a64\",\n  0x2745,\n  \"a65\",\n  0x2746,\n  \"a66\",\n  0x2747,\n  \"a67\",\n  0x2748,\n  \"a68\",\n  0x2749,\n  \"a69\",\n  0x274a,\n  \"a70\",\n  0x274b,\n  \"a71\",\n  0x25cf,\n  \"a72\",\n  0x274d,\n  \"a73\",\n  0x25a0,\n  \"a74\",\n  0x274f,\n  \"a203\",\n  0x2750,\n  \"a75\",\n  0x2751,\n  \"a204\",\n  0x2752,\n  \"a76\",\n  0x25b2,\n  \"a77\",\n  0x25bc,\n  \"a78\",\n  0x25c6,\n  \"a79\",\n  0x2756,\n  \"a81\",\n  0x25d7,\n  \"a82\",\n  0x2758,\n  \"a83\",\n  0x2759,\n  \"a84\",\n  0x275a,\n  \"a97\",\n  0x275b,\n  \"a98\",\n  0x275c,\n  \"a99\",\n  0x275d,\n  \"a100\",\n  0x275e,\n  \"a101\",\n  0x2761,\n  \"a102\",\n  0x2762,\n  \"a103\",\n  0x2763,\n  \"a104\",\n  0x2764,\n  \"a106\",\n  0x2765,\n  \"a107\",\n  0x2766,\n  \"a108\",\n  0x2767,\n  \"a112\",\n  0x2663,\n  \"a111\",\n  0x2666,\n  \"a110\",\n  0x2665,\n  \"a109\",\n  0x2660,\n  \"a120\",\n  0x2460,\n  \"a121\",\n  0x2461,\n  \"a122\",\n  0x2462,\n  \"a123\",\n  0x2463,\n  \"a124\",\n  0x2464,\n  \"a125\",\n  0x2465,\n  \"a126\",\n  0x2466,\n  \"a127\",\n  0x2467,\n  \"a128\",\n  0x2468,\n  \"a129\",\n  0x2469,\n  \"a130\",\n  0x2776,\n  \"a131\",\n  0x2777,\n  \"a132\",\n  0x2778,\n  \"a133\",\n  0x2779,\n  \"a134\",\n  0x277a,\n  \"a135\",\n  0x277b,\n  \"a136\",\n  0x277c,\n  \"a137\",\n  0x277d,\n  \"a138\",\n  0x277e,\n  \"a139\",\n  0x277f,\n  \"a140\",\n  0x2780,\n  \"a141\",\n  0x2781,\n  \"a142\",\n  0x2782,\n  \"a143\",\n  0x2783,\n  \"a144\",\n  0x2784,\n  \"a145\",\n  0x2785,\n  \"a146\",\n  0x2786,\n  \"a147\",\n  0x2787,\n  \"a148\",\n  0x2788,\n  \"a149\",\n  0x2789,\n  \"a150\",\n  0x278a,\n  \"a151\",\n  0x278b,\n  \"a152\",\n  0x278c,\n  \"a153\",\n  0x278d,\n  \"a154\",\n  0x278e,\n  \"a155\",\n  0x278f,\n  \"a156\",\n  0x2790,\n  \"a157\",\n  0x2791,\n  \"a158\",\n  0x2792,\n  \"a159\",\n  0x2793,\n  \"a160\",\n  0x2794,\n  \"a161\",\n  0x2192,\n  \"a163\",\n  0x2194,\n  \"a164\",\n  0x2195,\n  \"a196\",\n  0x2798,\n  \"a165\",\n  0x2799,\n  \"a192\",\n  0x279a,\n  \"a166\",\n  0x279b,\n  \"a167\",\n  0x279c,\n  \"a168\",\n  0x279d,\n  \"a169\",\n  0x279e,\n  \"a170\",\n  0x279f,\n  \"a171\",\n  0x27a0,\n  \"a172\",\n  0x27a1,\n  \"a173\",\n  0x27a2,\n  \"a162\",\n  0x27a3,\n  \"a174\",\n  0x27a4,\n  \"a175\",\n  0x27a5,\n  \"a176\",\n  0x27a6,\n  \"a177\",\n  0x27a7,\n  \"a178\",\n  0x27a8,\n  \"a179\",\n  0x27a9,\n  \"a193\",\n  0x27aa,\n  \"a180\",\n  0x27ab,\n  \"a199\",\n  0x27ac,\n  \"a181\",\n  0x27ad,\n  \"a200\",\n  0x27ae,\n  \"a182\",\n  0x27af,\n  \"a201\",\n  0x27b1,\n  \"a183\",\n  0x27b2,\n  \"a184\",\n  0x27b3,\n  \"a197\",\n  0x27b4,\n  \"a185\",\n  0x27b5,\n  \"a194\",\n  0x27b6,\n  \"a198\",\n  0x27b7,\n  \"a186\",\n  0x27b8,\n  \"a195\",\n  0x27b9,\n  \"a187\",\n  0x27ba,\n  \"a188\",\n  0x27bb,\n  \"a189\",\n  0x27bc,\n  \"a190\",\n  0x27bd,\n  \"a191\",\n  0x27be,\n  \"a89\",\n  0x2768,\n  \"a90\",\n  0x2769,\n  \"a93\",\n  0x276a,\n  \"a94\",\n  0x276b,\n  \"a91\",\n  0x276c,\n  \"a92\",\n  0x276d,\n  \"a205\",\n  0x276e,\n  \"a85\",\n  0x276f,\n  \"a206\",\n  0x2770,\n  \"a86\",\n  0x2771,\n  \"a87\",\n  0x2772,\n  \"a88\",\n  0x2773,\n  \"a95\",\n  0x2774,\n  \"a96\",\n  0x2775,\n  \".notdef\",\n  0x0000\n ];\n});\n\n\n/***/ }),\n/* 36 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.getSymbolsFonts = exports.getSupplementalGlyphMapForCalibri = exports.getSupplementalGlyphMapForArialBlack = exports.getStdFontMap = exports.getSerifFonts = exports.getNonStdFontMap = exports.getGlyphMapForStandardFonts = void 0;\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nconst getStdFontMap = (0, _core_utils.getLookupTableFactory)(function (t) {\n  t.ArialNarrow = \"Helvetica\";\n  t[\"ArialNarrow-Bold\"] = \"Helvetica-Bold\";\n  t[\"ArialNarrow-BoldItalic\"] = \"Helvetica-BoldOblique\";\n  t[\"ArialNarrow-Italic\"] = \"Helvetica-Oblique\";\n  t.ArialBlack = \"Helvetica\";\n  t[\"ArialBlack-Bold\"] = \"Helvetica-Bold\";\n  t[\"ArialBlack-BoldItalic\"] = \"Helvetica-BoldOblique\";\n  t[\"ArialBlack-Italic\"] = \"Helvetica-Oblique\";\n  t[\"Arial-Black\"] = \"Helvetica\";\n  t[\"Arial-Black-Bold\"] = \"Helvetica-Bold\";\n  t[\"Arial-Black-BoldItalic\"] = \"Helvetica-BoldOblique\";\n  t[\"Arial-Black-Italic\"] = \"Helvetica-Oblique\";\n  t.Arial = \"Helvetica\";\n  t[\"Arial-Bold\"] = \"Helvetica-Bold\";\n  t[\"Arial-BoldItalic\"] = \"Helvetica-BoldOblique\";\n  t[\"Arial-Italic\"] = \"Helvetica-Oblique\";\n  t[\"Arial-BoldItalicMT\"] = \"Helvetica-BoldOblique\";\n  t[\"Arial-BoldMT\"] = \"Helvetica-Bold\";\n  t[\"Arial-ItalicMT\"] = \"Helvetica-Oblique\";\n  t.ArialMT = \"Helvetica\";\n  t[\"Courier-Bold\"] = \"Courier-Bold\";\n  t[\"Courier-BoldItalic\"] = \"Courier-BoldOblique\";\n  t[\"Courier-Italic\"] = \"Courier-Oblique\";\n  t.CourierNew = \"Courier\";\n  t[\"CourierNew-Bold\"] = \"Courier-Bold\";\n  t[\"CourierNew-BoldItalic\"] = \"Courier-BoldOblique\";\n  t[\"CourierNew-Italic\"] = \"Courier-Oblique\";\n  t[\"CourierNewPS-BoldItalicMT\"] = \"Courier-BoldOblique\";\n  t[\"CourierNewPS-BoldMT\"] = \"Courier-Bold\";\n  t[\"CourierNewPS-ItalicMT\"] = \"Courier-Oblique\";\n  t.CourierNewPSMT = \"Courier\";\n  t.Helvetica = \"Helvetica\";\n  t[\"Helvetica-Bold\"] = \"Helvetica-Bold\";\n  t[\"Helvetica-BoldItalic\"] = \"Helvetica-BoldOblique\";\n  t[\"Helvetica-BoldOblique\"] = \"Helvetica-BoldOblique\";\n  t[\"Helvetica-Italic\"] = \"Helvetica-Oblique\";\n  t[\"Helvetica-Oblique\"] = \"Helvetica-Oblique\";\n  t[\"Symbol-Bold\"] = \"Symbol\";\n  t[\"Symbol-BoldItalic\"] = \"Symbol\";\n  t[\"Symbol-Italic\"] = \"Symbol\";\n  t.TimesNewRoman = \"Times-Roman\";\n  t[\"TimesNewRoman-Bold\"] = \"Times-Bold\";\n  t[\"TimesNewRoman-BoldItalic\"] = \"Times-BoldItalic\";\n  t[\"TimesNewRoman-Italic\"] = \"Times-Italic\";\n  t.TimesNewRomanPS = \"Times-Roman\";\n  t[\"TimesNewRomanPS-Bold\"] = \"Times-Bold\";\n  t[\"TimesNewRomanPS-BoldItalic\"] = \"Times-BoldItalic\";\n  t[\"TimesNewRomanPS-BoldItalicMT\"] = \"Times-BoldItalic\";\n  t[\"TimesNewRomanPS-BoldMT\"] = \"Times-Bold\";\n  t[\"TimesNewRomanPS-Italic\"] = \"Times-Italic\";\n  t[\"TimesNewRomanPS-ItalicMT\"] = \"Times-Italic\";\n  t.TimesNewRomanPSMT = \"Times-Roman\";\n  t[\"TimesNewRomanPSMT-Bold\"] = \"Times-Bold\";\n  t[\"TimesNewRomanPSMT-BoldItalic\"] = \"Times-BoldItalic\";\n  t[\"TimesNewRomanPSMT-Italic\"] = \"Times-Italic\";\n});\nexports.getStdFontMap = getStdFontMap;\nconst getNonStdFontMap = (0, _core_utils.getLookupTableFactory)(function (t) {\n  t.Calibri = \"Helvetica\";\n  t[\"Calibri-Bold\"] = \"Helvetica-Bold\";\n  t[\"Calibri-BoldItalic\"] = \"Helvetica-BoldOblique\";\n  t[\"Calibri-Italic\"] = \"Helvetica-Oblique\";\n  t.CenturyGothic = \"Helvetica\";\n  t[\"CenturyGothic-Bold\"] = \"Helvetica-Bold\";\n  t[\"CenturyGothic-BoldItalic\"] = \"Helvetica-BoldOblique\";\n  t[\"CenturyGothic-Italic\"] = \"Helvetica-Oblique\";\n  t.ComicSansMS = \"Comic Sans MS\";\n  t[\"ComicSansMS-Bold\"] = \"Comic Sans MS-Bold\";\n  t[\"ComicSansMS-BoldItalic\"] = \"Comic Sans MS-BoldItalic\";\n  t[\"ComicSansMS-Italic\"] = \"Comic Sans MS-Italic\";\n  t.LucidaConsole = \"Courier\";\n  t[\"LucidaConsole-Bold\"] = \"Courier-Bold\";\n  t[\"LucidaConsole-BoldItalic\"] = \"Courier-BoldOblique\";\n  t[\"LucidaConsole-Italic\"] = \"Courier-Oblique\";\n  t[\"LucidaSans-Demi\"] = \"Helvetica-Bold\";\n  t[\"MS-Gothic\"] = \"MS Gothic\";\n  t[\"MS-Gothic-Bold\"] = \"MS Gothic-Bold\";\n  t[\"MS-Gothic-BoldItalic\"] = \"MS Gothic-BoldItalic\";\n  t[\"MS-Gothic-Italic\"] = \"MS Gothic-Italic\";\n  t[\"MS-Mincho\"] = \"MS Mincho\";\n  t[\"MS-Mincho-Bold\"] = \"MS Mincho-Bold\";\n  t[\"MS-Mincho-BoldItalic\"] = \"MS Mincho-BoldItalic\";\n  t[\"MS-Mincho-Italic\"] = \"MS Mincho-Italic\";\n  t[\"MS-PGothic\"] = \"MS PGothic\";\n  t[\"MS-PGothic-Bold\"] = \"MS PGothic-Bold\";\n  t[\"MS-PGothic-BoldItalic\"] = \"MS PGothic-BoldItalic\";\n  t[\"MS-PGothic-Italic\"] = \"MS PGothic-Italic\";\n  t[\"MS-PMincho\"] = \"MS PMincho\";\n  t[\"MS-PMincho-Bold\"] = \"MS PMincho-Bold\";\n  t[\"MS-PMincho-BoldItalic\"] = \"MS PMincho-BoldItalic\";\n  t[\"MS-PMincho-Italic\"] = \"MS PMincho-Italic\";\n  t.NuptialScript = \"Times-Italic\";\n  t.SegoeUISymbol = \"Helvetica\";\n  t.Wingdings = \"ZapfDingbats\";\n  t[\"Wingdings-Regular\"] = \"ZapfDingbats\";\n});\nexports.getNonStdFontMap = getNonStdFontMap;\nconst getSerifFonts = (0, _core_utils.getLookupTableFactory)(function (t) {\n  t[\"Adobe Jenson\"] = true;\n  t[\"Adobe Text\"] = true;\n  t.Albertus = true;\n  t.Aldus = true;\n  t.Alexandria = true;\n  t.Algerian = true;\n  t[\"American Typewriter\"] = true;\n  t.Antiqua = true;\n  t.Apex = true;\n  t.Arno = true;\n  t.Aster = true;\n  t.Aurora = true;\n  t.Baskerville = true;\n  t.Bell = true;\n  t.Bembo = true;\n  t[\"Bembo Schoolbook\"] = true;\n  t.Benguiat = true;\n  t[\"Berkeley Old Style\"] = true;\n  t[\"Bernhard Modern\"] = true;\n  t[\"Berthold City\"] = true;\n  t.Bodoni = true;\n  t[\"Bauer Bodoni\"] = true;\n  t[\"Book Antiqua\"] = true;\n  t.Bookman = true;\n  t[\"Bordeaux Roman\"] = true;\n  t[\"Californian FB\"] = true;\n  t.Calisto = true;\n  t.Calvert = true;\n  t.Capitals = true;\n  t.Cambria = true;\n  t.Cartier = true;\n  t.Caslon = true;\n  t.Catull = true;\n  t.Centaur = true;\n  t[\"Century Old Style\"] = true;\n  t[\"Century Schoolbook\"] = true;\n  t.Chaparral = true;\n  t[\"Charis SIL\"] = true;\n  t.Cheltenham = true;\n  t[\"Cholla Slab\"] = true;\n  t.Clarendon = true;\n  t.Clearface = true;\n  t.Cochin = true;\n  t.Colonna = true;\n  t[\"Computer Modern\"] = true;\n  t[\"Concrete Roman\"] = true;\n  t.Constantia = true;\n  t[\"Cooper Black\"] = true;\n  t.Corona = true;\n  t.Ecotype = true;\n  t.Egyptienne = true;\n  t.Elephant = true;\n  t.Excelsior = true;\n  t.Fairfield = true;\n  t[\"FF Scala\"] = true;\n  t.Folkard = true;\n  t.Footlight = true;\n  t.FreeSerif = true;\n  t[\"Friz Quadrata\"] = true;\n  t.Garamond = true;\n  t.Gentium = true;\n  t.Georgia = true;\n  t.Gloucester = true;\n  t[\"Goudy Old Style\"] = true;\n  t[\"Goudy Schoolbook\"] = true;\n  t[\"Goudy Pro Font\"] = true;\n  t.Granjon = true;\n  t[\"Guardian Egyptian\"] = true;\n  t.Heather = true;\n  t.Hercules = true;\n  t[\"High Tower Text\"] = true;\n  t.Hiroshige = true;\n  t[\"Hoefler Text\"] = true;\n  t[\"Humana Serif\"] = true;\n  t.Imprint = true;\n  t[\"Ionic No. 5\"] = true;\n  t.Janson = true;\n  t.Joanna = true;\n  t.Korinna = true;\n  t.Lexicon = true;\n  t[\"Liberation Serif\"] = true;\n  t[\"Linux Libertine\"] = true;\n  t.Literaturnaya = true;\n  t.Lucida = true;\n  t[\"Lucida Bright\"] = true;\n  t.Melior = true;\n  t.Memphis = true;\n  t.Miller = true;\n  t.Minion = true;\n  t.Modern = true;\n  t[\"Mona Lisa\"] = true;\n  t[\"Mrs Eaves\"] = true;\n  t[\"MS Serif\"] = true;\n  t[\"Museo Slab\"] = true;\n  t[\"New York\"] = true;\n  t[\"Nimbus Roman\"] = true;\n  t[\"NPS Rawlinson Roadway\"] = true;\n  t.NuptialScript = true;\n  t.Palatino = true;\n  t.Perpetua = true;\n  t.Plantin = true;\n  t[\"Plantin Schoolbook\"] = true;\n  t.Playbill = true;\n  t[\"Poor Richard\"] = true;\n  t[\"Rawlinson Roadway\"] = true;\n  t.Renault = true;\n  t.Requiem = true;\n  t.Rockwell = true;\n  t.Roman = true;\n  t[\"Rotis Serif\"] = true;\n  t.Sabon = true;\n  t.Scala = true;\n  t.Seagull = true;\n  t.Sistina = true;\n  t.Souvenir = true;\n  t.STIX = true;\n  t[\"Stone Informal\"] = true;\n  t[\"Stone Serif\"] = true;\n  t.Sylfaen = true;\n  t.Times = true;\n  t.Trajan = true;\n  t[\"Trinité\"] = true;\n  t[\"Trump Mediaeval\"] = true;\n  t.Utopia = true;\n  t[\"Vale Type\"] = true;\n  t[\"Bitstream Vera\"] = true;\n  t[\"Vera Serif\"] = true;\n  t.Versailles = true;\n  t.Wanted = true;\n  t.Weiss = true;\n  t[\"Wide Latin\"] = true;\n  t.Windsor = true;\n  t.XITS = true;\n});\nexports.getSerifFonts = getSerifFonts;\nconst getSymbolsFonts = (0, _core_utils.getLookupTableFactory)(function (t) {\n  t.Dingbats = true;\n  t.Symbol = true;\n  t.ZapfDingbats = true;\n});\nexports.getSymbolsFonts = getSymbolsFonts;\nconst getGlyphMapForStandardFonts = (0, _core_utils.getLookupTableFactory)(function (t) {\n  t[2] = 10;\n  t[3] = 32;\n  t[4] = 33;\n  t[5] = 34;\n  t[6] = 35;\n  t[7] = 36;\n  t[8] = 37;\n  t[9] = 38;\n  t[10] = 39;\n  t[11] = 40;\n  t[12] = 41;\n  t[13] = 42;\n  t[14] = 43;\n  t[15] = 44;\n  t[16] = 45;\n  t[17] = 46;\n  t[18] = 47;\n  t[19] = 48;\n  t[20] = 49;\n  t[21] = 50;\n  t[22] = 51;\n  t[23] = 52;\n  t[24] = 53;\n  t[25] = 54;\n  t[26] = 55;\n  t[27] = 56;\n  t[28] = 57;\n  t[29] = 58;\n  t[30] = 894;\n  t[31] = 60;\n  t[32] = 61;\n  t[33] = 62;\n  t[34] = 63;\n  t[35] = 64;\n  t[36] = 65;\n  t[37] = 66;\n  t[38] = 67;\n  t[39] = 68;\n  t[40] = 69;\n  t[41] = 70;\n  t[42] = 71;\n  t[43] = 72;\n  t[44] = 73;\n  t[45] = 74;\n  t[46] = 75;\n  t[47] = 76;\n  t[48] = 77;\n  t[49] = 78;\n  t[50] = 79;\n  t[51] = 80;\n  t[52] = 81;\n  t[53] = 82;\n  t[54] = 83;\n  t[55] = 84;\n  t[56] = 85;\n  t[57] = 86;\n  t[58] = 87;\n  t[59] = 88;\n  t[60] = 89;\n  t[61] = 90;\n  t[62] = 91;\n  t[63] = 92;\n  t[64] = 93;\n  t[65] = 94;\n  t[66] = 95;\n  t[67] = 96;\n  t[68] = 97;\n  t[69] = 98;\n  t[70] = 99;\n  t[71] = 100;\n  t[72] = 101;\n  t[73] = 102;\n  t[74] = 103;\n  t[75] = 104;\n  t[76] = 105;\n  t[77] = 106;\n  t[78] = 107;\n  t[79] = 108;\n  t[80] = 109;\n  t[81] = 110;\n  t[82] = 111;\n  t[83] = 112;\n  t[84] = 113;\n  t[85] = 114;\n  t[86] = 115;\n  t[87] = 116;\n  t[88] = 117;\n  t[89] = 118;\n  t[90] = 119;\n  t[91] = 120;\n  t[92] = 121;\n  t[93] = 122;\n  t[94] = 123;\n  t[95] = 124;\n  t[96] = 125;\n  t[97] = 126;\n  t[98] = 196;\n  t[99] = 197;\n  t[100] = 199;\n  t[101] = 201;\n  t[102] = 209;\n  t[103] = 214;\n  t[104] = 220;\n  t[105] = 225;\n  t[106] = 224;\n  t[107] = 226;\n  t[108] = 228;\n  t[109] = 227;\n  t[110] = 229;\n  t[111] = 231;\n  t[112] = 233;\n  t[113] = 232;\n  t[114] = 234;\n  t[115] = 235;\n  t[116] = 237;\n  t[117] = 236;\n  t[118] = 238;\n  t[119] = 239;\n  t[120] = 241;\n  t[121] = 243;\n  t[122] = 242;\n  t[123] = 244;\n  t[124] = 246;\n  t[125] = 245;\n  t[126] = 250;\n  t[127] = 249;\n  t[128] = 251;\n  t[129] = 252;\n  t[130] = 8224;\n  t[131] = 176;\n  t[132] = 162;\n  t[133] = 163;\n  t[134] = 167;\n  t[135] = 8226;\n  t[136] = 182;\n  t[137] = 223;\n  t[138] = 174;\n  t[139] = 169;\n  t[140] = 8482;\n  t[141] = 180;\n  t[142] = 168;\n  t[143] = 8800;\n  t[144] = 198;\n  t[145] = 216;\n  t[146] = 8734;\n  t[147] = 177;\n  t[148] = 8804;\n  t[149] = 8805;\n  t[150] = 165;\n  t[151] = 181;\n  t[152] = 8706;\n  t[153] = 8721;\n  t[154] = 8719;\n  t[156] = 8747;\n  t[157] = 170;\n  t[158] = 186;\n  t[159] = 8486;\n  t[160] = 230;\n  t[161] = 248;\n  t[162] = 191;\n  t[163] = 161;\n  t[164] = 172;\n  t[165] = 8730;\n  t[166] = 402;\n  t[167] = 8776;\n  t[168] = 8710;\n  t[169] = 171;\n  t[170] = 187;\n  t[171] = 8230;\n  t[210] = 218;\n  t[223] = 711;\n  t[224] = 321;\n  t[225] = 322;\n  t[227] = 353;\n  t[229] = 382;\n  t[234] = 253;\n  t[252] = 263;\n  t[253] = 268;\n  t[254] = 269;\n  t[258] = 258;\n  t[260] = 260;\n  t[261] = 261;\n  t[265] = 280;\n  t[266] = 281;\n  t[268] = 283;\n  t[269] = 313;\n  t[275] = 323;\n  t[276] = 324;\n  t[278] = 328;\n  t[284] = 345;\n  t[285] = 346;\n  t[286] = 347;\n  t[292] = 367;\n  t[295] = 377;\n  t[296] = 378;\n  t[298] = 380;\n  t[305] = 963;\n  t[306] = 964;\n  t[307] = 966;\n  t[308] = 8215;\n  t[309] = 8252;\n  t[310] = 8319;\n  t[311] = 8359;\n  t[312] = 8592;\n  t[313] = 8593;\n  t[337] = 9552;\n  t[493] = 1039;\n  t[494] = 1040;\n  t[705] = 1524;\n  t[706] = 8362;\n  t[710] = 64288;\n  t[711] = 64298;\n  t[759] = 1617;\n  t[761] = 1776;\n  t[763] = 1778;\n  t[775] = 1652;\n  t[777] = 1764;\n  t[778] = 1780;\n  t[779] = 1781;\n  t[780] = 1782;\n  t[782] = 771;\n  t[783] = 64726;\n  t[786] = 8363;\n  t[788] = 8532;\n  t[790] = 768;\n  t[791] = 769;\n  t[792] = 768;\n  t[795] = 803;\n  t[797] = 64336;\n  t[798] = 64337;\n  t[799] = 64342;\n  t[800] = 64343;\n  t[801] = 64344;\n  t[802] = 64345;\n  t[803] = 64362;\n  t[804] = 64363;\n  t[805] = 64364;\n  t[2424] = 7821;\n  t[2425] = 7822;\n  t[2426] = 7823;\n  t[2427] = 7824;\n  t[2428] = 7825;\n  t[2429] = 7826;\n  t[2430] = 7827;\n  t[2433] = 7682;\n  t[2678] = 8045;\n  t[2679] = 8046;\n  t[2830] = 1552;\n  t[2838] = 686;\n  t[2840] = 751;\n  t[2842] = 753;\n  t[2843] = 754;\n  t[2844] = 755;\n  t[2846] = 757;\n  t[2856] = 767;\n  t[2857] = 848;\n  t[2858] = 849;\n  t[2862] = 853;\n  t[2863] = 854;\n  t[2864] = 855;\n  t[2865] = 861;\n  t[2866] = 862;\n  t[2906] = 7460;\n  t[2908] = 7462;\n  t[2909] = 7463;\n  t[2910] = 7464;\n  t[2912] = 7466;\n  t[2913] = 7467;\n  t[2914] = 7468;\n  t[2916] = 7470;\n  t[2917] = 7471;\n  t[2918] = 7472;\n  t[2920] = 7474;\n  t[2921] = 7475;\n  t[2922] = 7476;\n  t[2924] = 7478;\n  t[2925] = 7479;\n  t[2926] = 7480;\n  t[2928] = 7482;\n  t[2929] = 7483;\n  t[2930] = 7484;\n  t[2932] = 7486;\n  t[2933] = 7487;\n  t[2934] = 7488;\n  t[2936] = 7490;\n  t[2937] = 7491;\n  t[2938] = 7492;\n  t[2940] = 7494;\n  t[2941] = 7495;\n  t[2942] = 7496;\n  t[2944] = 7498;\n  t[2946] = 7500;\n  t[2948] = 7502;\n  t[2950] = 7504;\n  t[2951] = 7505;\n  t[2952] = 7506;\n  t[2954] = 7508;\n  t[2955] = 7509;\n  t[2956] = 7510;\n  t[2958] = 7512;\n  t[2959] = 7513;\n  t[2960] = 7514;\n  t[2962] = 7516;\n  t[2963] = 7517;\n  t[2964] = 7518;\n  t[2966] = 7520;\n  t[2967] = 7521;\n  t[2968] = 7522;\n  t[2970] = 7524;\n  t[2971] = 7525;\n  t[2972] = 7526;\n  t[2974] = 7528;\n  t[2975] = 7529;\n  t[2976] = 7530;\n  t[2978] = 1537;\n  t[2979] = 1538;\n  t[2980] = 1539;\n  t[2982] = 1549;\n  t[2983] = 1551;\n  t[2984] = 1552;\n  t[2986] = 1554;\n  t[2987] = 1555;\n  t[2988] = 1556;\n  t[2990] = 1623;\n  t[2991] = 1624;\n  t[2995] = 1775;\n  t[2999] = 1791;\n  t[3002] = 64290;\n  t[3003] = 64291;\n  t[3004] = 64292;\n  t[3006] = 64294;\n  t[3007] = 64295;\n  t[3008] = 64296;\n  t[3011] = 1900;\n  t[3014] = 8223;\n  t[3015] = 8244;\n  t[3017] = 7532;\n  t[3018] = 7533;\n  t[3019] = 7534;\n  t[3075] = 7590;\n  t[3076] = 7591;\n  t[3079] = 7594;\n  t[3080] = 7595;\n  t[3083] = 7598;\n  t[3084] = 7599;\n  t[3087] = 7602;\n  t[3088] = 7603;\n  t[3091] = 7606;\n  t[3092] = 7607;\n  t[3095] = 7610;\n  t[3096] = 7611;\n  t[3099] = 7614;\n  t[3100] = 7615;\n  t[3103] = 7618;\n  t[3104] = 7619;\n  t[3107] = 8337;\n  t[3108] = 8338;\n  t[3116] = 1884;\n  t[3119] = 1885;\n  t[3120] = 1885;\n  t[3123] = 1886;\n  t[3124] = 1886;\n  t[3127] = 1887;\n  t[3128] = 1887;\n  t[3131] = 1888;\n  t[3132] = 1888;\n  t[3135] = 1889;\n  t[3136] = 1889;\n  t[3139] = 1890;\n  t[3140] = 1890;\n  t[3143] = 1891;\n  t[3144] = 1891;\n  t[3147] = 1892;\n  t[3148] = 1892;\n  t[3153] = 580;\n  t[3154] = 581;\n  t[3157] = 584;\n  t[3158] = 585;\n  t[3161] = 588;\n  t[3162] = 589;\n  t[3165] = 891;\n  t[3166] = 892;\n  t[3169] = 1274;\n  t[3170] = 1275;\n  t[3173] = 1278;\n  t[3174] = 1279;\n  t[3181] = 7622;\n  t[3182] = 7623;\n  t[3282] = 11799;\n  t[3316] = 578;\n  t[3379] = 42785;\n  t[3393] = 1159;\n  t[3416] = 8377;\n});\nexports.getGlyphMapForStandardFonts = getGlyphMapForStandardFonts;\nconst getSupplementalGlyphMapForArialBlack = (0, _core_utils.getLookupTableFactory)(function (t) {\n  t[227] = 322;\n  t[264] = 261;\n  t[291] = 346;\n});\nexports.getSupplementalGlyphMapForArialBlack = getSupplementalGlyphMapForArialBlack;\nconst getSupplementalGlyphMapForCalibri = (0, _core_utils.getLookupTableFactory)(function (t) {\n  t[1] = 32;\n  t[4] = 65;\n  t[17] = 66;\n  t[18] = 67;\n  t[24] = 68;\n  t[28] = 69;\n  t[38] = 70;\n  t[39] = 71;\n  t[44] = 72;\n  t[47] = 73;\n  t[58] = 74;\n  t[60] = 75;\n  t[62] = 76;\n  t[68] = 77;\n  t[69] = 78;\n  t[75] = 79;\n  t[87] = 80;\n  t[89] = 81;\n  t[90] = 82;\n  t[94] = 83;\n  t[100] = 84;\n  t[104] = 85;\n  t[115] = 86;\n  t[116] = 87;\n  t[121] = 88;\n  t[122] = 89;\n  t[127] = 90;\n  t[258] = 97;\n  t[268] = 261;\n  t[271] = 98;\n  t[272] = 99;\n  t[273] = 263;\n  t[282] = 100;\n  t[286] = 101;\n  t[295] = 281;\n  t[296] = 102;\n  t[336] = 103;\n  t[346] = 104;\n  t[349] = 105;\n  t[361] = 106;\n  t[364] = 107;\n  t[367] = 108;\n  t[371] = 322;\n  t[373] = 109;\n  t[374] = 110;\n  t[381] = 111;\n  t[383] = 243;\n  t[393] = 112;\n  t[395] = 113;\n  t[396] = 114;\n  t[400] = 115;\n  t[401] = 347;\n  t[410] = 116;\n  t[437] = 117;\n  t[448] = 118;\n  t[449] = 119;\n  t[454] = 120;\n  t[455] = 121;\n  t[460] = 122;\n  t[463] = 380;\n  t[853] = 44;\n  t[855] = 58;\n  t[856] = 46;\n  t[876] = 47;\n  t[878] = 45;\n  t[882] = 45;\n  t[894] = 40;\n  t[895] = 41;\n  t[896] = 91;\n  t[897] = 93;\n  t[923] = 64;\n  t[1004] = 48;\n  t[1005] = 49;\n  t[1006] = 50;\n  t[1007] = 51;\n  t[1008] = 52;\n  t[1009] = 53;\n  t[1010] = 54;\n  t[1011] = 55;\n  t[1012] = 56;\n  t[1013] = 57;\n  t[1081] = 37;\n  t[1085] = 43;\n  t[1086] = 45;\n});\nexports.getSupplementalGlyphMapForCalibri = getSupplementalGlyphMapForCalibri;\n\n/***/ }),\n/* 37 */\n/***/ ((__unused_webpack_module, __webpack_exports__, __w_pdfjs_require__) => {\n\n__w_pdfjs_require__.r(__webpack_exports__);\n/* harmony export */ __w_pdfjs_require__.d(__webpack_exports__, {\n/* harmony export */   \"getNormalizedUnicodes\": () => (/* binding */ getNormalizedUnicodes),\n/* harmony export */   \"getUnicodeForGlyph\": () => (/* binding */ getUnicodeForGlyph),\n/* harmony export */   \"getUnicodeRangeFor\": () => (/* binding */ getUnicodeRangeFor),\n/* harmony export */   \"mapSpecialUnicodeValues\": () => (/* binding */ mapSpecialUnicodeValues),\n/* harmony export */   \"reverseIfRtl\": () => (/* binding */ reverseIfRtl)\n/* harmony export */ });\n/* harmony import */ var _core_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __w_pdfjs_require__(8);\n\nconst getSpecialPUASymbols = (0,_core_utils_js__WEBPACK_IMPORTED_MODULE_0__.getLookupTableFactory)(function (t) {\n t[63721] = 0x00a9;\n t[63193] = 0x00a9;\n t[63720] = 0x00ae;\n t[63194] = 0x00ae;\n t[63722] = 0x2122;\n t[63195] = 0x2122;\n t[63729] = 0x23a7;\n t[63730] = 0x23a8;\n t[63731] = 0x23a9;\n t[63740] = 0x23ab;\n t[63741] = 0x23ac;\n t[63742] = 0x23ad;\n t[63726] = 0x23a1;\n t[63727] = 0x23a2;\n t[63728] = 0x23a3;\n t[63737] = 0x23a4;\n t[63738] = 0x23a5;\n t[63739] = 0x23a6;\n t[63723] = 0x239b;\n t[63724] = 0x239c;\n t[63725] = 0x239d;\n t[63734] = 0x239e;\n t[63735] = 0x239f;\n t[63736] = 0x23a0;\n});\nfunction mapSpecialUnicodeValues(code) {\n if (code >= 0xfff0 && code <= 0xffff) {\n  return 0;\n } else if (code >= 0xf600 && code <= 0xf8ff) {\n  return getSpecialPUASymbols()[code] || code;\n } else if (code === 0x00ad) {\n  return 0x002d;\n }\n return code;\n}\nfunction getUnicodeForGlyph(name, glyphsUnicodeMap) {\n let unicode = glyphsUnicodeMap[name];\n if (unicode !== undefined) {\n  return unicode;\n }\n if (!name) {\n  return -1;\n }\n if (name[0] === \"u\") {\n  const nameLen = name.length;\n  let hexStr;\n  if (nameLen === 7 && name[1] === \"n\" && name[2] === \"i\") {\n   hexStr = name.substring(3);\n  } else if (nameLen >= 5 && nameLen <= 7) {\n   hexStr = name.substring(1);\n  } else {\n   return -1;\n  }\n  if (hexStr === hexStr.toUpperCase()) {\n   unicode = parseInt(hexStr, 16);\n   if (unicode >= 0) {\n    return unicode;\n   }\n  }\n }\n return -1;\n}\nconst UnicodeRanges = [\n {\n  begin: 0x0000,\n  end: 0x007f\n },\n {\n  begin: 0x0080,\n  end: 0x00ff\n },\n {\n  begin: 0x0100,\n  end: 0x017f\n },\n {\n  begin: 0x0180,\n  end: 0x024f\n },\n {\n  begin: 0x0250,\n  end: 0x02af\n },\n {\n  begin: 0x02b0,\n  end: 0x02ff\n },\n {\n  begin: 0x0300,\n  end: 0x036f\n },\n {\n  begin: 0x0370,\n  end: 0x03ff\n },\n {\n  begin: 0x2c80,\n  end: 0x2cff\n },\n {\n  begin: 0x0400,\n  end: 0x04ff\n },\n {\n  begin: 0x0530,\n  end: 0x058f\n },\n {\n  begin: 0x0590,\n  end: 0x05ff\n },\n {\n  begin: 0xa500,\n  end: 0xa63f\n },\n {\n  begin: 0x0600,\n  end: 0x06ff\n },\n {\n  begin: 0x07c0,\n  end: 0x07ff\n },\n {\n  begin: 0x0900,\n  end: 0x097f\n },\n {\n  begin: 0x0980,\n  end: 0x09ff\n },\n {\n  begin: 0x0a00,\n  end: 0x0a7f\n },\n {\n  begin: 0x0a80,\n  end: 0x0aff\n },\n {\n  begin: 0x0b00,\n  end: 0x0b7f\n },\n {\n  begin: 0x0b80,\n  end: 0x0bff\n },\n {\n  begin: 0x0c00,\n  end: 0x0c7f\n },\n {\n  begin: 0x0c80,\n  end: 0x0cff\n },\n {\n  begin: 0x0d00,\n  end: 0x0d7f\n },\n {\n  begin: 0x0e00,\n  end: 0x0e7f\n },\n {\n  begin: 0x0e80,\n  end: 0x0eff\n },\n {\n  begin: 0x10a0,\n  end: 0x10ff\n },\n {\n  begin: 0x1b00,\n  end: 0x1b7f\n },\n {\n  begin: 0x1100,\n  end: 0x11ff\n },\n {\n  begin: 0x1e00,\n  end: 0x1eff\n },\n {\n  begin: 0x1f00,\n  end: 0x1fff\n },\n {\n  begin: 0x2000,\n  end: 0x206f\n },\n {\n  begin: 0x2070,\n  end: 0x209f\n },\n {\n  begin: 0x20a0,\n  end: 0x20cf\n },\n {\n  begin: 0x20d0,\n  end: 0x20ff\n },\n {\n  begin: 0x2100,\n  end: 0x214f\n },\n {\n  begin: 0x2150,\n  end: 0x218f\n },\n {\n  begin: 0x2190,\n  end: 0x21ff\n },\n {\n  begin: 0x2200,\n  end: 0x22ff\n },\n {\n  begin: 0x2300,\n  end: 0x23ff\n },\n {\n  begin: 0x2400,\n  end: 0x243f\n },\n {\n  begin: 0x2440,\n  end: 0x245f\n },\n {\n  begin: 0x2460,\n  end: 0x24ff\n },\n {\n  begin: 0x2500,\n  end: 0x257f\n },\n {\n  begin: 0x2580,\n  end: 0x259f\n },\n {\n  begin: 0x25a0,\n  end: 0x25ff\n },\n {\n  begin: 0x2600,\n  end: 0x26ff\n },\n {\n  begin: 0x2700,\n  end: 0x27bf\n },\n {\n  begin: 0x3000,\n  end: 0x303f\n },\n {\n  begin: 0x3040,\n  end: 0x309f\n },\n {\n  begin: 0x30a0,\n  end: 0x30ff\n },\n {\n  begin: 0x3100,\n  end: 0x312f\n },\n {\n  begin: 0x3130,\n  end: 0x318f\n },\n {\n  begin: 0xa840,\n  end: 0xa87f\n },\n {\n  begin: 0x3200,\n  end: 0x32ff\n },\n {\n  begin: 0x3300,\n  end: 0x33ff\n },\n {\n  begin: 0xac00,\n  end: 0xd7af\n },\n {\n  begin: 0xd800,\n  end: 0xdfff\n },\n {\n  begin: 0x10900,\n  end: 0x1091f\n },\n {\n  begin: 0x4e00,\n  end: 0x9fff\n },\n {\n  begin: 0xe000,\n  end: 0xf8ff\n },\n {\n  begin: 0x31c0,\n  end: 0x31ef\n },\n {\n  begin: 0xfb00,\n  end: 0xfb4f\n },\n {\n  begin: 0xfb50,\n  end: 0xfdff\n },\n {\n  begin: 0xfe20,\n  end: 0xfe2f\n },\n {\n  begin: 0xfe10,\n  end: 0xfe1f\n },\n {\n  begin: 0xfe50,\n  end: 0xfe6f\n },\n {\n  begin: 0xfe70,\n  end: 0xfeff\n },\n {\n  begin: 0xff00,\n  end: 0xffef\n },\n {\n  begin: 0xfff0,\n  end: 0xffff\n },\n {\n  begin: 0x0f00,\n  end: 0x0fff\n },\n {\n  begin: 0x0700,\n  end: 0x074f\n },\n {\n  begin: 0x0780,\n  end: 0x07bf\n },\n {\n  begin: 0x0d80,\n  end: 0x0dff\n },\n {\n  begin: 0x1000,\n  end: 0x109f\n },\n {\n  begin: 0x1200,\n  end: 0x137f\n },\n {\n  begin: 0x13a0,\n  end: 0x13ff\n },\n {\n  begin: 0x1400,\n  end: 0x167f\n },\n {\n  begin: 0x1680,\n  end: 0x169f\n },\n {\n  begin: 0x16a0,\n  end: 0x16ff\n },\n {\n  begin: 0x1780,\n  end: 0x17ff\n },\n {\n  begin: 0x1800,\n  end: 0x18af\n },\n {\n  begin: 0x2800,\n  end: 0x28ff\n },\n {\n  begin: 0xa000,\n  end: 0xa48f\n },\n {\n  begin: 0x1700,\n  end: 0x171f\n },\n {\n  begin: 0x10300,\n  end: 0x1032f\n },\n {\n  begin: 0x10330,\n  end: 0x1034f\n },\n {\n  begin: 0x10400,\n  end: 0x1044f\n },\n {\n  begin: 0x1d000,\n  end: 0x1d0ff\n },\n {\n  begin: 0x1d400,\n  end: 0x1d7ff\n },\n {\n  begin: 0xff000,\n  end: 0xffffd\n },\n {\n  begin: 0xfe00,\n  end: 0xfe0f\n },\n {\n  begin: 0xe0000,\n  end: 0xe007f\n },\n {\n  begin: 0x1900,\n  end: 0x194f\n },\n {\n  begin: 0x1950,\n  end: 0x197f\n },\n {\n  begin: 0x1980,\n  end: 0x19df\n },\n {\n  begin: 0x1a00,\n  end: 0x1a1f\n },\n {\n  begin: 0x2c00,\n  end: 0x2c5f\n },\n {\n  begin: 0x2d30,\n  end: 0x2d7f\n },\n {\n  begin: 0x4dc0,\n  end: 0x4dff\n },\n {\n  begin: 0xa800,\n  end: 0xa82f\n },\n {\n  begin: 0x10000,\n  end: 0x1007f\n },\n {\n  begin: 0x10140,\n  end: 0x1018f\n },\n {\n  begin: 0x10380,\n  end: 0x1039f\n },\n {\n  begin: 0x103a0,\n  end: 0x103df\n },\n {\n  begin: 0x10450,\n  end: 0x1047f\n },\n {\n  begin: 0x10480,\n  end: 0x104af\n },\n {\n  begin: 0x10800,\n  end: 0x1083f\n },\n {\n  begin: 0x10a00,\n  end: 0x10a5f\n },\n {\n  begin: 0x1d300,\n  end: 0x1d35f\n },\n {\n  begin: 0x12000,\n  end: 0x123ff\n },\n {\n  begin: 0x1d360,\n  end: 0x1d37f\n },\n {\n  begin: 0x1b80,\n  end: 0x1bbf\n },\n {\n  begin: 0x1c00,\n  end: 0x1c4f\n },\n {\n  begin: 0x1c50,\n  end: 0x1c7f\n },\n {\n  begin: 0xa880,\n  end: 0xa8df\n },\n {\n  begin: 0xa900,\n  end: 0xa92f\n },\n {\n  begin: 0xa930,\n  end: 0xa95f\n },\n {\n  begin: 0xaa00,\n  end: 0xaa5f\n },\n {\n  begin: 0x10190,\n  end: 0x101cf\n },\n {\n  begin: 0x101d0,\n  end: 0x101ff\n },\n {\n  begin: 0x102a0,\n  end: 0x102df\n },\n {\n  begin: 0x1f030,\n  end: 0x1f09f\n }\n];\nfunction getUnicodeRangeFor(value) {\n for (let i = 0, ii = UnicodeRanges.length; i < ii; i++) {\n  const range = UnicodeRanges[i];\n  if (value >= range.begin && value < range.end) {\n   return i;\n  }\n }\n return -1;\n}\nfunction isRTLRangeFor(value) {\n let range = UnicodeRanges[13];\n if (value >= range.begin && value < range.end) {\n  return true;\n }\n range = UnicodeRanges[11];\n if (value >= range.begin && value < range.end) {\n  return true;\n }\n return false;\n}\nconst getNormalizedUnicodes = (0,_core_utils_js__WEBPACK_IMPORTED_MODULE_0__.getArrayLookupTableFactory)(function () {\n return [\n  \"\\u00A8\",\n  \"\\u0020\\u0308\",\n  \"\\u00AF\",\n  \"\\u0020\\u0304\",\n  \"\\u00B4\",\n  \"\\u0020\\u0301\",\n  \"\\u00B5\",\n  \"\\u03BC\",\n  \"\\u00B8\",\n  \"\\u0020\\u0327\",\n  \"\\u0132\",\n  \"\\u0049\\u004A\",\n  \"\\u0133\",\n  \"\\u0069\\u006A\",\n  \"\\u013F\",\n  \"\\u004C\\u00B7\",\n  \"\\u0140\",\n  \"\\u006C\\u00B7\",\n  \"\\u0149\",\n  \"\\u02BC\\u006E\",\n  \"\\u017F\",\n  \"\\u0073\",\n  \"\\u01C4\",\n  \"\\u0044\\u017D\",\n  \"\\u01C5\",\n  \"\\u0044\\u017E\",\n  \"\\u01C6\",\n  \"\\u0064\\u017E\",\n  \"\\u01C7\",\n  \"\\u004C\\u004A\",\n  \"\\u01C8\",\n  \"\\u004C\\u006A\",\n  \"\\u01C9\",\n  \"\\u006C\\u006A\",\n  \"\\u01CA\",\n  \"\\u004E\\u004A\",\n  \"\\u01CB\",\n  \"\\u004E\\u006A\",\n  \"\\u01CC\",\n  \"\\u006E\\u006A\",\n  \"\\u01F1\",\n  \"\\u0044\\u005A\",\n  \"\\u01F2\",\n  \"\\u0044\\u007A\",\n  \"\\u01F3\",\n  \"\\u0064\\u007A\",\n  \"\\u02D8\",\n  \"\\u0020\\u0306\",\n  \"\\u02D9\",\n  \"\\u0020\\u0307\",\n  \"\\u02DA\",\n  \"\\u0020\\u030A\",\n  \"\\u02DB\",\n  \"\\u0020\\u0328\",\n  \"\\u02DC\",\n  \"\\u0020\\u0303\",\n  \"\\u02DD\",\n  \"\\u0020\\u030B\",\n  \"\\u037A\",\n  \"\\u0020\\u0345\",\n  \"\\u0384\",\n  \"\\u0020\\u0301\",\n  \"\\u03D0\",\n  \"\\u03B2\",\n  \"\\u03D1\",\n  \"\\u03B8\",\n  \"\\u03D2\",\n  \"\\u03A5\",\n  \"\\u03D5\",\n  \"\\u03C6\",\n  \"\\u03D6\",\n  \"\\u03C0\",\n  \"\\u03F0\",\n  \"\\u03BA\",\n  \"\\u03F1\",\n  \"\\u03C1\",\n  \"\\u03F2\",\n  \"\\u03C2\",\n  \"\\u03F4\",\n  \"\\u0398\",\n  \"\\u03F5\",\n  \"\\u03B5\",\n  \"\\u03F9\",\n  \"\\u03A3\",\n  \"\\u0587\",\n  \"\\u0565\\u0582\",\n  \"\\u0675\",\n  \"\\u0627\\u0674\",\n  \"\\u0676\",\n  \"\\u0648\\u0674\",\n  \"\\u0677\",\n  \"\\u06C7\\u0674\",\n  \"\\u0678\",\n  \"\\u064A\\u0674\",\n  \"\\u0E33\",\n  \"\\u0E4D\\u0E32\",\n  \"\\u0EB3\",\n  \"\\u0ECD\\u0EB2\",\n  \"\\u0EDC\",\n  \"\\u0EAB\\u0E99\",\n  \"\\u0EDD\",\n  \"\\u0EAB\\u0EA1\",\n  \"\\u0F77\",\n  \"\\u0FB2\\u0F81\",\n  \"\\u0F79\",\n  \"\\u0FB3\\u0F81\",\n  \"\\u1E9A\",\n  \"\\u0061\\u02BE\",\n  \"\\u1FBD\",\n  \"\\u0020\\u0313\",\n  \"\\u1FBF\",\n  \"\\u0020\\u0313\",\n  \"\\u1FC0\",\n  \"\\u0020\\u0342\",\n  \"\\u1FFE\",\n  \"\\u0020\\u0314\",\n  \"\\u2002\",\n  \"\\u0020\",\n  \"\\u2003\",\n  \"\\u0020\",\n  \"\\u2004\",\n  \"\\u0020\",\n  \"\\u2005\",\n  \"\\u0020\",\n  \"\\u2006\",\n  \"\\u0020\",\n  \"\\u2008\",\n  \"\\u0020\",\n  \"\\u2009\",\n  \"\\u0020\",\n  \"\\u200A\",\n  \"\\u0020\",\n  \"\\u2017\",\n  \"\\u0020\\u0333\",\n  \"\\u2024\",\n  \"\\u002E\",\n  \"\\u2025\",\n  \"\\u002E\\u002E\",\n  \"\\u2026\",\n  \"\\u002E\\u002E\\u002E\",\n  \"\\u2033\",\n  \"\\u2032\\u2032\",\n  \"\\u2034\",\n  \"\\u2032\\u2032\\u2032\",\n  \"\\u2036\",\n  \"\\u2035\\u2035\",\n  \"\\u2037\",\n  \"\\u2035\\u2035\\u2035\",\n  \"\\u203C\",\n  \"\\u0021\\u0021\",\n  \"\\u203E\",\n  \"\\u0020\\u0305\",\n  \"\\u2047\",\n  \"\\u003F\\u003F\",\n  \"\\u2048\",\n  \"\\u003F\\u0021\",\n  \"\\u2049\",\n  \"\\u0021\\u003F\",\n  \"\\u2057\",\n  \"\\u2032\\u2032\\u2032\\u2032\",\n  \"\\u205F\",\n  \"\\u0020\",\n  \"\\u20A8\",\n  \"\\u0052\\u0073\",\n  \"\\u2100\",\n  \"\\u0061\\u002F\\u0063\",\n  \"\\u2101\",\n  \"\\u0061\\u002F\\u0073\",\n  \"\\u2103\",\n  \"\\u00B0\\u0043\",\n  \"\\u2105\",\n  \"\\u0063\\u002F\\u006F\",\n  \"\\u2106\",\n  \"\\u0063\\u002F\\u0075\",\n  \"\\u2107\",\n  \"\\u0190\",\n  \"\\u2109\",\n  \"\\u00B0\\u0046\",\n  \"\\u2116\",\n  \"\\u004E\\u006F\",\n  \"\\u2121\",\n  \"\\u0054\\u0045\\u004C\",\n  \"\\u2135\",\n  \"\\u05D0\",\n  \"\\u2136\",\n  \"\\u05D1\",\n  \"\\u2137\",\n  \"\\u05D2\",\n  \"\\u2138\",\n  \"\\u05D3\",\n  \"\\u213B\",\n  \"\\u0046\\u0041\\u0058\",\n  \"\\u2160\",\n  \"\\u0049\",\n  \"\\u2161\",\n  \"\\u0049\\u0049\",\n  \"\\u2162\",\n  \"\\u0049\\u0049\\u0049\",\n  \"\\u2163\",\n  \"\\u0049\\u0056\",\n  \"\\u2164\",\n  \"\\u0056\",\n  \"\\u2165\",\n  \"\\u0056\\u0049\",\n  \"\\u2166\",\n  \"\\u0056\\u0049\\u0049\",\n  \"\\u2167\",\n  \"\\u0056\\u0049\\u0049\\u0049\",\n  \"\\u2168\",\n  \"\\u0049\\u0058\",\n  \"\\u2169\",\n  \"\\u0058\",\n  \"\\u216A\",\n  \"\\u0058\\u0049\",\n  \"\\u216B\",\n  \"\\u0058\\u0049\\u0049\",\n  \"\\u216C\",\n  \"\\u004C\",\n  \"\\u216D\",\n  \"\\u0043\",\n  \"\\u216E\",\n  \"\\u0044\",\n  \"\\u216F\",\n  \"\\u004D\",\n  \"\\u2170\",\n  \"\\u0069\",\n  \"\\u2171\",\n  \"\\u0069\\u0069\",\n  \"\\u2172\",\n  \"\\u0069\\u0069\\u0069\",\n  \"\\u2173\",\n  \"\\u0069\\u0076\",\n  \"\\u2174\",\n  \"\\u0076\",\n  \"\\u2175\",\n  \"\\u0076\\u0069\",\n  \"\\u2176\",\n  \"\\u0076\\u0069\\u0069\",\n  \"\\u2177\",\n  \"\\u0076\\u0069\\u0069\\u0069\",\n  \"\\u2178\",\n  \"\\u0069\\u0078\",\n  \"\\u2179\",\n  \"\\u0078\",\n  \"\\u217A\",\n  \"\\u0078\\u0069\",\n  \"\\u217B\",\n  \"\\u0078\\u0069\\u0069\",\n  \"\\u217C\",\n  \"\\u006C\",\n  \"\\u217D\",\n  \"\\u0063\",\n  \"\\u217E\",\n  \"\\u0064\",\n  \"\\u217F\",\n  \"\\u006D\",\n  \"\\u222C\",\n  \"\\u222B\\u222B\",\n  \"\\u222D\",\n  \"\\u222B\\u222B\\u222B\",\n  \"\\u222F\",\n  \"\\u222E\\u222E\",\n  \"\\u2230\",\n  \"\\u222E\\u222E\\u222E\",\n  \"\\u2474\",\n  \"\\u0028\\u0031\\u0029\",\n  \"\\u2475\",\n  \"\\u0028\\u0032\\u0029\",\n  \"\\u2476\",\n  \"\\u0028\\u0033\\u0029\",\n  \"\\u2477\",\n  \"\\u0028\\u0034\\u0029\",\n  \"\\u2478\",\n  \"\\u0028\\u0035\\u0029\",\n  \"\\u2479\",\n  \"\\u0028\\u0036\\u0029\",\n  \"\\u247A\",\n  \"\\u0028\\u0037\\u0029\",\n  \"\\u247B\",\n  \"\\u0028\\u0038\\u0029\",\n  \"\\u247C\",\n  \"\\u0028\\u0039\\u0029\",\n  \"\\u247D\",\n  \"\\u0028\\u0031\\u0030\\u0029\",\n  \"\\u247E\",\n  \"\\u0028\\u0031\\u0031\\u0029\",\n  \"\\u247F\",\n  \"\\u0028\\u0031\\u0032\\u0029\",\n  \"\\u2480\",\n  \"\\u0028\\u0031\\u0033\\u0029\",\n  \"\\u2481\",\n  \"\\u0028\\u0031\\u0034\\u0029\",\n  \"\\u2482\",\n  \"\\u0028\\u0031\\u0035\\u0029\",\n  \"\\u2483\",\n  \"\\u0028\\u0031\\u0036\\u0029\",\n  \"\\u2484\",\n  \"\\u0028\\u0031\\u0037\\u0029\",\n  \"\\u2485\",\n  \"\\u0028\\u0031\\u0038\\u0029\",\n  \"\\u2486\",\n  \"\\u0028\\u0031\\u0039\\u0029\",\n  \"\\u2487\",\n  \"\\u0028\\u0032\\u0030\\u0029\",\n  \"\\u2488\",\n  \"\\u0031\\u002E\",\n  \"\\u2489\",\n  \"\\u0032\\u002E\",\n  \"\\u248A\",\n  \"\\u0033\\u002E\",\n  \"\\u248B\",\n  \"\\u0034\\u002E\",\n  \"\\u248C\",\n  \"\\u0035\\u002E\",\n  \"\\u248D\",\n  \"\\u0036\\u002E\",\n  \"\\u248E\",\n  \"\\u0037\\u002E\",\n  \"\\u248F\",\n  \"\\u0038\\u002E\",\n  \"\\u2490\",\n  \"\\u0039\\u002E\",\n  \"\\u2491\",\n  \"\\u0031\\u0030\\u002E\",\n  \"\\u2492\",\n  \"\\u0031\\u0031\\u002E\",\n  \"\\u2493\",\n  \"\\u0031\\u0032\\u002E\",\n  \"\\u2494\",\n  \"\\u0031\\u0033\\u002E\",\n  \"\\u2495\",\n  \"\\u0031\\u0034\\u002E\",\n  \"\\u2496\",\n  \"\\u0031\\u0035\\u002E\",\n  \"\\u2497\",\n  \"\\u0031\\u0036\\u002E\",\n  \"\\u2498\",\n  \"\\u0031\\u0037\\u002E\",\n  \"\\u2499\",\n  \"\\u0031\\u0038\\u002E\",\n  \"\\u249A\",\n  \"\\u0031\\u0039\\u002E\",\n  \"\\u249B\",\n  \"\\u0032\\u0030\\u002E\",\n  \"\\u249C\",\n  \"\\u0028\\u0061\\u0029\",\n  \"\\u249D\",\n  \"\\u0028\\u0062\\u0029\",\n  \"\\u249E\",\n  \"\\u0028\\u0063\\u0029\",\n  \"\\u249F\",\n  \"\\u0028\\u0064\\u0029\",\n  \"\\u24A0\",\n  \"\\u0028\\u0065\\u0029\",\n  \"\\u24A1\",\n  \"\\u0028\\u0066\\u0029\",\n  \"\\u24A2\",\n  \"\\u0028\\u0067\\u0029\",\n  \"\\u24A3\",\n  \"\\u0028\\u0068\\u0029\",\n  \"\\u24A4\",\n  \"\\u0028\\u0069\\u0029\",\n  \"\\u24A5\",\n  \"\\u0028\\u006A\\u0029\",\n  \"\\u24A6\",\n  \"\\u0028\\u006B\\u0029\",\n  \"\\u24A7\",\n  \"\\u0028\\u006C\\u0029\",\n  \"\\u24A8\",\n  \"\\u0028\\u006D\\u0029\",\n  \"\\u24A9\",\n  \"\\u0028\\u006E\\u0029\",\n  \"\\u24AA\",\n  \"\\u0028\\u006F\\u0029\",\n  \"\\u24AB\",\n  \"\\u0028\\u0070\\u0029\",\n  \"\\u24AC\",\n  \"\\u0028\\u0071\\u0029\",\n  \"\\u24AD\",\n  \"\\u0028\\u0072\\u0029\",\n  \"\\u24AE\",\n  \"\\u0028\\u0073\\u0029\",\n  \"\\u24AF\",\n  \"\\u0028\\u0074\\u0029\",\n  \"\\u24B0\",\n  \"\\u0028\\u0075\\u0029\",\n  \"\\u24B1\",\n  \"\\u0028\\u0076\\u0029\",\n  \"\\u24B2\",\n  \"\\u0028\\u0077\\u0029\",\n  \"\\u24B3\",\n  \"\\u0028\\u0078\\u0029\",\n  \"\\u24B4\",\n  \"\\u0028\\u0079\\u0029\",\n  \"\\u24B5\",\n  \"\\u0028\\u007A\\u0029\",\n  \"\\u2A0C\",\n  \"\\u222B\\u222B\\u222B\\u222B\",\n  \"\\u2A74\",\n  \"\\u003A\\u003A\\u003D\",\n  \"\\u2A75\",\n  \"\\u003D\\u003D\",\n  \"\\u2A76\",\n  \"\\u003D\\u003D\\u003D\",\n  \"\\u2E9F\",\n  \"\\u6BCD\",\n  \"\\u2EF3\",\n  \"\\u9F9F\",\n  \"\\u2F00\",\n  \"\\u4E00\",\n  \"\\u2F01\",\n  \"\\u4E28\",\n  \"\\u2F02\",\n  \"\\u4E36\",\n  \"\\u2F03\",\n  \"\\u4E3F\",\n  \"\\u2F04\",\n  \"\\u4E59\",\n  \"\\u2F05\",\n  \"\\u4E85\",\n  \"\\u2F06\",\n  \"\\u4E8C\",\n  \"\\u2F07\",\n  \"\\u4EA0\",\n  \"\\u2F08\",\n  \"\\u4EBA\",\n  \"\\u2F09\",\n  \"\\u513F\",\n  \"\\u2F0A\",\n  \"\\u5165\",\n  \"\\u2F0B\",\n  \"\\u516B\",\n  \"\\u2F0C\",\n  \"\\u5182\",\n  \"\\u2F0D\",\n  \"\\u5196\",\n  \"\\u2F0E\",\n  \"\\u51AB\",\n  \"\\u2F0F\",\n  \"\\u51E0\",\n  \"\\u2F10\",\n  \"\\u51F5\",\n  \"\\u2F11\",\n  \"\\u5200\",\n  \"\\u2F12\",\n  \"\\u529B\",\n  \"\\u2F13\",\n  \"\\u52F9\",\n  \"\\u2F14\",\n  \"\\u5315\",\n  \"\\u2F15\",\n  \"\\u531A\",\n  \"\\u2F16\",\n  \"\\u5338\",\n  \"\\u2F17\",\n  \"\\u5341\",\n  \"\\u2F18\",\n  \"\\u535C\",\n  \"\\u2F19\",\n  \"\\u5369\",\n  \"\\u2F1A\",\n  \"\\u5382\",\n  \"\\u2F1B\",\n  \"\\u53B6\",\n  \"\\u2F1C\",\n  \"\\u53C8\",\n  \"\\u2F1D\",\n  \"\\u53E3\",\n  \"\\u2F1E\",\n  \"\\u56D7\",\n  \"\\u2F1F\",\n  \"\\u571F\",\n  \"\\u2F20\",\n  \"\\u58EB\",\n  \"\\u2F21\",\n  \"\\u5902\",\n  \"\\u2F22\",\n  \"\\u590A\",\n  \"\\u2F23\",\n  \"\\u5915\",\n  \"\\u2F24\",\n  \"\\u5927\",\n  \"\\u2F25\",\n  \"\\u5973\",\n  \"\\u2F26\",\n  \"\\u5B50\",\n  \"\\u2F27\",\n  \"\\u5B80\",\n  \"\\u2F28\",\n  \"\\u5BF8\",\n  \"\\u2F29\",\n  \"\\u5C0F\",\n  \"\\u2F2A\",\n  \"\\u5C22\",\n  \"\\u2F2B\",\n  \"\\u5C38\",\n  \"\\u2F2C\",\n  \"\\u5C6E\",\n  \"\\u2F2D\",\n  \"\\u5C71\",\n  \"\\u2F2E\",\n  \"\\u5DDB\",\n  \"\\u2F2F\",\n  \"\\u5DE5\",\n  \"\\u2F30\",\n  \"\\u5DF1\",\n  \"\\u2F31\",\n  \"\\u5DFE\",\n  \"\\u2F32\",\n  \"\\u5E72\",\n  \"\\u2F33\",\n  \"\\u5E7A\",\n  \"\\u2F34\",\n  \"\\u5E7F\",\n  \"\\u2F35\",\n  \"\\u5EF4\",\n  \"\\u2F36\",\n  \"\\u5EFE\",\n  \"\\u2F37\",\n  \"\\u5F0B\",\n  \"\\u2F38\",\n  \"\\u5F13\",\n  \"\\u2F39\",\n  \"\\u5F50\",\n  \"\\u2F3A\",\n  \"\\u5F61\",\n  \"\\u2F3B\",\n  \"\\u5F73\",\n  \"\\u2F3C\",\n  \"\\u5FC3\",\n  \"\\u2F3D\",\n  \"\\u6208\",\n  \"\\u2F3E\",\n  \"\\u6236\",\n  \"\\u2F3F\",\n  \"\\u624B\",\n  \"\\u2F40\",\n  \"\\u652F\",\n  \"\\u2F41\",\n  \"\\u6534\",\n  \"\\u2F42\",\n  \"\\u6587\",\n  \"\\u2F43\",\n  \"\\u6597\",\n  \"\\u2F44\",\n  \"\\u65A4\",\n  \"\\u2F45\",\n  \"\\u65B9\",\n  \"\\u2F46\",\n  \"\\u65E0\",\n  \"\\u2F47\",\n  \"\\u65E5\",\n  \"\\u2F48\",\n  \"\\u66F0\",\n  \"\\u2F49\",\n  \"\\u6708\",\n  \"\\u2F4A\",\n  \"\\u6728\",\n  \"\\u2F4B\",\n  \"\\u6B20\",\n  \"\\u2F4C\",\n  \"\\u6B62\",\n  \"\\u2F4D\",\n  \"\\u6B79\",\n  \"\\u2F4E\",\n  \"\\u6BB3\",\n  \"\\u2F4F\",\n  \"\\u6BCB\",\n  \"\\u2F50\",\n  \"\\u6BD4\",\n  \"\\u2F51\",\n  \"\\u6BDB\",\n  \"\\u2F52\",\n  \"\\u6C0F\",\n  \"\\u2F53\",\n  \"\\u6C14\",\n  \"\\u2F54\",\n  \"\\u6C34\",\n  \"\\u2F55\",\n  \"\\u706B\",\n  \"\\u2F56\",\n  \"\\u722A\",\n  \"\\u2F57\",\n  \"\\u7236\",\n  \"\\u2F58\",\n  \"\\u723B\",\n  \"\\u2F59\",\n  \"\\u723F\",\n  \"\\u2F5A\",\n  \"\\u7247\",\n  \"\\u2F5B\",\n  \"\\u7259\",\n  \"\\u2F5C\",\n  \"\\u725B\",\n  \"\\u2F5D\",\n  \"\\u72AC\",\n  \"\\u2F5E\",\n  \"\\u7384\",\n  \"\\u2F5F\",\n  \"\\u7389\",\n  \"\\u2F60\",\n  \"\\u74DC\",\n  \"\\u2F61\",\n  \"\\u74E6\",\n  \"\\u2F62\",\n  \"\\u7518\",\n  \"\\u2F63\",\n  \"\\u751F\",\n  \"\\u2F64\",\n  \"\\u7528\",\n  \"\\u2F65\",\n  \"\\u7530\",\n  \"\\u2F66\",\n  \"\\u758B\",\n  \"\\u2F67\",\n  \"\\u7592\",\n  \"\\u2F68\",\n  \"\\u7676\",\n  \"\\u2F69\",\n  \"\\u767D\",\n  \"\\u2F6A\",\n  \"\\u76AE\",\n  \"\\u2F6B\",\n  \"\\u76BF\",\n  \"\\u2F6C\",\n  \"\\u76EE\",\n  \"\\u2F6D\",\n  \"\\u77DB\",\n  \"\\u2F6E\",\n  \"\\u77E2\",\n  \"\\u2F6F\",\n  \"\\u77F3\",\n  \"\\u2F70\",\n  \"\\u793A\",\n  \"\\u2F71\",\n  \"\\u79B8\",\n  \"\\u2F72\",\n  \"\\u79BE\",\n  \"\\u2F73\",\n  \"\\u7A74\",\n  \"\\u2F74\",\n  \"\\u7ACB\",\n  \"\\u2F75\",\n  \"\\u7AF9\",\n  \"\\u2F76\",\n  \"\\u7C73\",\n  \"\\u2F77\",\n  \"\\u7CF8\",\n  \"\\u2F78\",\n  \"\\u7F36\",\n  \"\\u2F79\",\n  \"\\u7F51\",\n  \"\\u2F7A\",\n  \"\\u7F8A\",\n  \"\\u2F7B\",\n  \"\\u7FBD\",\n  \"\\u2F7C\",\n  \"\\u8001\",\n  \"\\u2F7D\",\n  \"\\u800C\",\n  \"\\u2F7E\",\n  \"\\u8012\",\n  \"\\u2F7F\",\n  \"\\u8033\",\n  \"\\u2F80\",\n  \"\\u807F\",\n  \"\\u2F81\",\n  \"\\u8089\",\n  \"\\u2F82\",\n  \"\\u81E3\",\n  \"\\u2F83\",\n  \"\\u81EA\",\n  \"\\u2F84\",\n  \"\\u81F3\",\n  \"\\u2F85\",\n  \"\\u81FC\",\n  \"\\u2F86\",\n  \"\\u820C\",\n  \"\\u2F87\",\n  \"\\u821B\",\n  \"\\u2F88\",\n  \"\\u821F\",\n  \"\\u2F89\",\n  \"\\u826E\",\n  \"\\u2F8A\",\n  \"\\u8272\",\n  \"\\u2F8B\",\n  \"\\u8278\",\n  \"\\u2F8C\",\n  \"\\u864D\",\n  \"\\u2F8D\",\n  \"\\u866B\",\n  \"\\u2F8E\",\n  \"\\u8840\",\n  \"\\u2F8F\",\n  \"\\u884C\",\n  \"\\u2F90\",\n  \"\\u8863\",\n  \"\\u2F91\",\n  \"\\u897E\",\n  \"\\u2F92\",\n  \"\\u898B\",\n  \"\\u2F93\",\n  \"\\u89D2\",\n  \"\\u2F94\",\n  \"\\u8A00\",\n  \"\\u2F95\",\n  \"\\u8C37\",\n  \"\\u2F96\",\n  \"\\u8C46\",\n  \"\\u2F97\",\n  \"\\u8C55\",\n  \"\\u2F98\",\n  \"\\u8C78\",\n  \"\\u2F99\",\n  \"\\u8C9D\",\n  \"\\u2F9A\",\n  \"\\u8D64\",\n  \"\\u2F9B\",\n  \"\\u8D70\",\n  \"\\u2F9C\",\n  \"\\u8DB3\",\n  \"\\u2F9D\",\n  \"\\u8EAB\",\n  \"\\u2F9E\",\n  \"\\u8ECA\",\n  \"\\u2F9F\",\n  \"\\u8F9B\",\n  \"\\u2FA0\",\n  \"\\u8FB0\",\n  \"\\u2FA1\",\n  \"\\u8FB5\",\n  \"\\u2FA2\",\n  \"\\u9091\",\n  \"\\u2FA3\",\n  \"\\u9149\",\n  \"\\u2FA4\",\n  \"\\u91C6\",\n  \"\\u2FA5\",\n  \"\\u91CC\",\n  \"\\u2FA6\",\n  \"\\u91D1\",\n  \"\\u2FA7\",\n  \"\\u9577\",\n  \"\\u2FA8\",\n  \"\\u9580\",\n  \"\\u2FA9\",\n  \"\\u961C\",\n  \"\\u2FAA\",\n  \"\\u96B6\",\n  \"\\u2FAB\",\n  \"\\u96B9\",\n  \"\\u2FAC\",\n  \"\\u96E8\",\n  \"\\u2FAD\",\n  \"\\u9751\",\n  \"\\u2FAE\",\n  \"\\u975E\",\n  \"\\u2FAF\",\n  \"\\u9762\",\n  \"\\u2FB0\",\n  \"\\u9769\",\n  \"\\u2FB1\",\n  \"\\u97CB\",\n  \"\\u2FB2\",\n  \"\\u97ED\",\n  \"\\u2FB3\",\n  \"\\u97F3\",\n  \"\\u2FB4\",\n  \"\\u9801\",\n  \"\\u2FB5\",\n  \"\\u98A8\",\n  \"\\u2FB6\",\n  \"\\u98DB\",\n  \"\\u2FB7\",\n  \"\\u98DF\",\n  \"\\u2FB8\",\n  \"\\u9996\",\n  \"\\u2FB9\",\n  \"\\u9999\",\n  \"\\u2FBA\",\n  \"\\u99AC\",\n  \"\\u2FBB\",\n  \"\\u9AA8\",\n  \"\\u2FBC\",\n  \"\\u9AD8\",\n  \"\\u2FBD\",\n  \"\\u9ADF\",\n  \"\\u2FBE\",\n  \"\\u9B25\",\n  \"\\u2FBF\",\n  \"\\u9B2F\",\n  \"\\u2FC0\",\n  \"\\u9B32\",\n  \"\\u2FC1\",\n  \"\\u9B3C\",\n  \"\\u2FC2\",\n  \"\\u9B5A\",\n  \"\\u2FC3\",\n  \"\\u9CE5\",\n  \"\\u2FC4\",\n  \"\\u9E75\",\n  \"\\u2FC5\",\n  \"\\u9E7F\",\n  \"\\u2FC6\",\n  \"\\u9EA5\",\n  \"\\u2FC7\",\n  \"\\u9EBB\",\n  \"\\u2FC8\",\n  \"\\u9EC3\",\n  \"\\u2FC9\",\n  \"\\u9ECD\",\n  \"\\u2FCA\",\n  \"\\u9ED1\",\n  \"\\u2FCB\",\n  \"\\u9EF9\",\n  \"\\u2FCC\",\n  \"\\u9EFD\",\n  \"\\u2FCD\",\n  \"\\u9F0E\",\n  \"\\u2FCE\",\n  \"\\u9F13\",\n  \"\\u2FCF\",\n  \"\\u9F20\",\n  \"\\u2FD0\",\n  \"\\u9F3B\",\n  \"\\u2FD1\",\n  \"\\u9F4A\",\n  \"\\u2FD2\",\n  \"\\u9F52\",\n  \"\\u2FD3\",\n  \"\\u9F8D\",\n  \"\\u2FD4\",\n  \"\\u9F9C\",\n  \"\\u2FD5\",\n  \"\\u9FA0\",\n  \"\\u3036\",\n  \"\\u3012\",\n  \"\\u3038\",\n  \"\\u5341\",\n  \"\\u3039\",\n  \"\\u5344\",\n  \"\\u303A\",\n  \"\\u5345\",\n  \"\\u309B\",\n  \"\\u0020\\u3099\",\n  \"\\u309C\",\n  \"\\u0020\\u309A\",\n  \"\\u3131\",\n  \"\\u1100\",\n  \"\\u3132\",\n  \"\\u1101\",\n  \"\\u3133\",\n  \"\\u11AA\",\n  \"\\u3134\",\n  \"\\u1102\",\n  \"\\u3135\",\n  \"\\u11AC\",\n  \"\\u3136\",\n  \"\\u11AD\",\n  \"\\u3137\",\n  \"\\u1103\",\n  \"\\u3138\",\n  \"\\u1104\",\n  \"\\u3139\",\n  \"\\u1105\",\n  \"\\u313A\",\n  \"\\u11B0\",\n  \"\\u313B\",\n  \"\\u11B1\",\n  \"\\u313C\",\n  \"\\u11B2\",\n  \"\\u313D\",\n  \"\\u11B3\",\n  \"\\u313E\",\n  \"\\u11B4\",\n  \"\\u313F\",\n  \"\\u11B5\",\n  \"\\u3140\",\n  \"\\u111A\",\n  \"\\u3141\",\n  \"\\u1106\",\n  \"\\u3142\",\n  \"\\u1107\",\n  \"\\u3143\",\n  \"\\u1108\",\n  \"\\u3144\",\n  \"\\u1121\",\n  \"\\u3145\",\n  \"\\u1109\",\n  \"\\u3146\",\n  \"\\u110A\",\n  \"\\u3147\",\n  \"\\u110B\",\n  \"\\u3148\",\n  \"\\u110C\",\n  \"\\u3149\",\n  \"\\u110D\",\n  \"\\u314A\",\n  \"\\u110E\",\n  \"\\u314B\",\n  \"\\u110F\",\n  \"\\u314C\",\n  \"\\u1110\",\n  \"\\u314D\",\n  \"\\u1111\",\n  \"\\u314E\",\n  \"\\u1112\",\n  \"\\u314F\",\n  \"\\u1161\",\n  \"\\u3150\",\n  \"\\u1162\",\n  \"\\u3151\",\n  \"\\u1163\",\n  \"\\u3152\",\n  \"\\u1164\",\n  \"\\u3153\",\n  \"\\u1165\",\n  \"\\u3154\",\n  \"\\u1166\",\n  \"\\u3155\",\n  \"\\u1167\",\n  \"\\u3156\",\n  \"\\u1168\",\n  \"\\u3157\",\n  \"\\u1169\",\n  \"\\u3158\",\n  \"\\u116A\",\n  \"\\u3159\",\n  \"\\u116B\",\n  \"\\u315A\",\n  \"\\u116C\",\n  \"\\u315B\",\n  \"\\u116D\",\n  \"\\u315C\",\n  \"\\u116E\",\n  \"\\u315D\",\n  \"\\u116F\",\n  \"\\u315E\",\n  \"\\u1170\",\n  \"\\u315F\",\n  \"\\u1171\",\n  \"\\u3160\",\n  \"\\u1172\",\n  \"\\u3161\",\n  \"\\u1173\",\n  \"\\u3162\",\n  \"\\u1174\",\n  \"\\u3163\",\n  \"\\u1175\",\n  \"\\u3164\",\n  \"\\u1160\",\n  \"\\u3165\",\n  \"\\u1114\",\n  \"\\u3166\",\n  \"\\u1115\",\n  \"\\u3167\",\n  \"\\u11C7\",\n  \"\\u3168\",\n  \"\\u11C8\",\n  \"\\u3169\",\n  \"\\u11CC\",\n  \"\\u316A\",\n  \"\\u11CE\",\n  \"\\u316B\",\n  \"\\u11D3\",\n  \"\\u316C\",\n  \"\\u11D7\",\n  \"\\u316D\",\n  \"\\u11D9\",\n  \"\\u316E\",\n  \"\\u111C\",\n  \"\\u316F\",\n  \"\\u11DD\",\n  \"\\u3170\",\n  \"\\u11DF\",\n  \"\\u3171\",\n  \"\\u111D\",\n  \"\\u3172\",\n  \"\\u111E\",\n  \"\\u3173\",\n  \"\\u1120\",\n  \"\\u3174\",\n  \"\\u1122\",\n  \"\\u3175\",\n  \"\\u1123\",\n  \"\\u3176\",\n  \"\\u1127\",\n  \"\\u3177\",\n  \"\\u1129\",\n  \"\\u3178\",\n  \"\\u112B\",\n  \"\\u3179\",\n  \"\\u112C\",\n  \"\\u317A\",\n  \"\\u112D\",\n  \"\\u317B\",\n  \"\\u112E\",\n  \"\\u317C\",\n  \"\\u112F\",\n  \"\\u317D\",\n  \"\\u1132\",\n  \"\\u317E\",\n  \"\\u1136\",\n  \"\\u317F\",\n  \"\\u1140\",\n  \"\\u3180\",\n  \"\\u1147\",\n  \"\\u3181\",\n  \"\\u114C\",\n  \"\\u3182\",\n  \"\\u11F1\",\n  \"\\u3183\",\n  \"\\u11F2\",\n  \"\\u3184\",\n  \"\\u1157\",\n  \"\\u3185\",\n  \"\\u1158\",\n  \"\\u3186\",\n  \"\\u1159\",\n  \"\\u3187\",\n  \"\\u1184\",\n  \"\\u3188\",\n  \"\\u1185\",\n  \"\\u3189\",\n  \"\\u1188\",\n  \"\\u318A\",\n  \"\\u1191\",\n  \"\\u318B\",\n  \"\\u1192\",\n  \"\\u318C\",\n  \"\\u1194\",\n  \"\\u318D\",\n  \"\\u119E\",\n  \"\\u318E\",\n  \"\\u11A1\",\n  \"\\u3200\",\n  \"\\u0028\\u1100\\u0029\",\n  \"\\u3201\",\n  \"\\u0028\\u1102\\u0029\",\n  \"\\u3202\",\n  \"\\u0028\\u1103\\u0029\",\n  \"\\u3203\",\n  \"\\u0028\\u1105\\u0029\",\n  \"\\u3204\",\n  \"\\u0028\\u1106\\u0029\",\n  \"\\u3205\",\n  \"\\u0028\\u1107\\u0029\",\n  \"\\u3206\",\n  \"\\u0028\\u1109\\u0029\",\n  \"\\u3207\",\n  \"\\u0028\\u110B\\u0029\",\n  \"\\u3208\",\n  \"\\u0028\\u110C\\u0029\",\n  \"\\u3209\",\n  \"\\u0028\\u110E\\u0029\",\n  \"\\u320A\",\n  \"\\u0028\\u110F\\u0029\",\n  \"\\u320B\",\n  \"\\u0028\\u1110\\u0029\",\n  \"\\u320C\",\n  \"\\u0028\\u1111\\u0029\",\n  \"\\u320D\",\n  \"\\u0028\\u1112\\u0029\",\n  \"\\u320E\",\n  \"\\u0028\\u1100\\u1161\\u0029\",\n  \"\\u320F\",\n  \"\\u0028\\u1102\\u1161\\u0029\",\n  \"\\u3210\",\n  \"\\u0028\\u1103\\u1161\\u0029\",\n  \"\\u3211\",\n  \"\\u0028\\u1105\\u1161\\u0029\",\n  \"\\u3212\",\n  \"\\u0028\\u1106\\u1161\\u0029\",\n  \"\\u3213\",\n  \"\\u0028\\u1107\\u1161\\u0029\",\n  \"\\u3214\",\n  \"\\u0028\\u1109\\u1161\\u0029\",\n  \"\\u3215\",\n  \"\\u0028\\u110B\\u1161\\u0029\",\n  \"\\u3216\",\n  \"\\u0028\\u110C\\u1161\\u0029\",\n  \"\\u3217\",\n  \"\\u0028\\u110E\\u1161\\u0029\",\n  \"\\u3218\",\n  \"\\u0028\\u110F\\u1161\\u0029\",\n  \"\\u3219\",\n  \"\\u0028\\u1110\\u1161\\u0029\",\n  \"\\u321A\",\n  \"\\u0028\\u1111\\u1161\\u0029\",\n  \"\\u321B\",\n  \"\\u0028\\u1112\\u1161\\u0029\",\n  \"\\u321C\",\n  \"\\u0028\\u110C\\u116E\\u0029\",\n  \"\\u321D\",\n  \"\\u0028\\u110B\\u1169\\u110C\\u1165\\u11AB\\u0029\",\n  \"\\u321E\",\n  \"\\u0028\\u110B\\u1169\\u1112\\u116E\\u0029\",\n  \"\\u3220\",\n  \"\\u0028\\u4E00\\u0029\",\n  \"\\u3221\",\n  \"\\u0028\\u4E8C\\u0029\",\n  \"\\u3222\",\n  \"\\u0028\\u4E09\\u0029\",\n  \"\\u3223\",\n  \"\\u0028\\u56DB\\u0029\",\n  \"\\u3224\",\n  \"\\u0028\\u4E94\\u0029\",\n  \"\\u3225\",\n  \"\\u0028\\u516D\\u0029\",\n  \"\\u3226\",\n  \"\\u0028\\u4E03\\u0029\",\n  \"\\u3227\",\n  \"\\u0028\\u516B\\u0029\",\n  \"\\u3228\",\n  \"\\u0028\\u4E5D\\u0029\",\n  \"\\u3229\",\n  \"\\u0028\\u5341\\u0029\",\n  \"\\u322A\",\n  \"\\u0028\\u6708\\u0029\",\n  \"\\u322B\",\n  \"\\u0028\\u706B\\u0029\",\n  \"\\u322C\",\n  \"\\u0028\\u6C34\\u0029\",\n  \"\\u322D\",\n  \"\\u0028\\u6728\\u0029\",\n  \"\\u322E\",\n  \"\\u0028\\u91D1\\u0029\",\n  \"\\u322F\",\n  \"\\u0028\\u571F\\u0029\",\n  \"\\u3230\",\n  \"\\u0028\\u65E5\\u0029\",\n  \"\\u3231\",\n  \"\\u0028\\u682A\\u0029\",\n  \"\\u3232\",\n  \"\\u0028\\u6709\\u0029\",\n  \"\\u3233\",\n  \"\\u0028\\u793E\\u0029\",\n  \"\\u3234\",\n  \"\\u0028\\u540D\\u0029\",\n  \"\\u3235\",\n  \"\\u0028\\u7279\\u0029\",\n  \"\\u3236\",\n  \"\\u0028\\u8CA1\\u0029\",\n  \"\\u3237\",\n  \"\\u0028\\u795D\\u0029\",\n  \"\\u3238\",\n  \"\\u0028\\u52B4\\u0029\",\n  \"\\u3239\",\n  \"\\u0028\\u4EE3\\u0029\",\n  \"\\u323A\",\n  \"\\u0028\\u547C\\u0029\",\n  \"\\u323B\",\n  \"\\u0028\\u5B66\\u0029\",\n  \"\\u323C\",\n  \"\\u0028\\u76E3\\u0029\",\n  \"\\u323D\",\n  \"\\u0028\\u4F01\\u0029\",\n  \"\\u323E\",\n  \"\\u0028\\u8CC7\\u0029\",\n  \"\\u323F\",\n  \"\\u0028\\u5354\\u0029\",\n  \"\\u3240\",\n  \"\\u0028\\u796D\\u0029\",\n  \"\\u3241\",\n  \"\\u0028\\u4F11\\u0029\",\n  \"\\u3242\",\n  \"\\u0028\\u81EA\\u0029\",\n  \"\\u3243\",\n  \"\\u0028\\u81F3\\u0029\",\n  \"\\u32C0\",\n  \"\\u0031\\u6708\",\n  \"\\u32C1\",\n  \"\\u0032\\u6708\",\n  \"\\u32C2\",\n  \"\\u0033\\u6708\",\n  \"\\u32C3\",\n  \"\\u0034\\u6708\",\n  \"\\u32C4\",\n  \"\\u0035\\u6708\",\n  \"\\u32C5\",\n  \"\\u0036\\u6708\",\n  \"\\u32C6\",\n  \"\\u0037\\u6708\",\n  \"\\u32C7\",\n  \"\\u0038\\u6708\",\n  \"\\u32C8\",\n  \"\\u0039\\u6708\",\n  \"\\u32C9\",\n  \"\\u0031\\u0030\\u6708\",\n  \"\\u32CA\",\n  \"\\u0031\\u0031\\u6708\",\n  \"\\u32CB\",\n  \"\\u0031\\u0032\\u6708\",\n  \"\\u3358\",\n  \"\\u0030\\u70B9\",\n  \"\\u3359\",\n  \"\\u0031\\u70B9\",\n  \"\\u335A\",\n  \"\\u0032\\u70B9\",\n  \"\\u335B\",\n  \"\\u0033\\u70B9\",\n  \"\\u335C\",\n  \"\\u0034\\u70B9\",\n  \"\\u335D\",\n  \"\\u0035\\u70B9\",\n  \"\\u335E\",\n  \"\\u0036\\u70B9\",\n  \"\\u335F\",\n  \"\\u0037\\u70B9\",\n  \"\\u3360\",\n  \"\\u0038\\u70B9\",\n  \"\\u3361\",\n  \"\\u0039\\u70B9\",\n  \"\\u3362\",\n  \"\\u0031\\u0030\\u70B9\",\n  \"\\u3363\",\n  \"\\u0031\\u0031\\u70B9\",\n  \"\\u3364\",\n  \"\\u0031\\u0032\\u70B9\",\n  \"\\u3365\",\n  \"\\u0031\\u0033\\u70B9\",\n  \"\\u3366\",\n  \"\\u0031\\u0034\\u70B9\",\n  \"\\u3367\",\n  \"\\u0031\\u0035\\u70B9\",\n  \"\\u3368\",\n  \"\\u0031\\u0036\\u70B9\",\n  \"\\u3369\",\n  \"\\u0031\\u0037\\u70B9\",\n  \"\\u336A\",\n  \"\\u0031\\u0038\\u70B9\",\n  \"\\u336B\",\n  \"\\u0031\\u0039\\u70B9\",\n  \"\\u336C\",\n  \"\\u0032\\u0030\\u70B9\",\n  \"\\u336D\",\n  \"\\u0032\\u0031\\u70B9\",\n  \"\\u336E\",\n  \"\\u0032\\u0032\\u70B9\",\n  \"\\u336F\",\n  \"\\u0032\\u0033\\u70B9\",\n  \"\\u3370\",\n  \"\\u0032\\u0034\\u70B9\",\n  \"\\u33E0\",\n  \"\\u0031\\u65E5\",\n  \"\\u33E1\",\n  \"\\u0032\\u65E5\",\n  \"\\u33E2\",\n  \"\\u0033\\u65E5\",\n  \"\\u33E3\",\n  \"\\u0034\\u65E5\",\n  \"\\u33E4\",\n  \"\\u0035\\u65E5\",\n  \"\\u33E5\",\n  \"\\u0036\\u65E5\",\n  \"\\u33E6\",\n  \"\\u0037\\u65E5\",\n  \"\\u33E7\",\n  \"\\u0038\\u65E5\",\n  \"\\u33E8\",\n  \"\\u0039\\u65E5\",\n  \"\\u33E9\",\n  \"\\u0031\\u0030\\u65E5\",\n  \"\\u33EA\",\n  \"\\u0031\\u0031\\u65E5\",\n  \"\\u33EB\",\n  \"\\u0031\\u0032\\u65E5\",\n  \"\\u33EC\",\n  \"\\u0031\\u0033\\u65E5\",\n  \"\\u33ED\",\n  \"\\u0031\\u0034\\u65E5\",\n  \"\\u33EE\",\n  \"\\u0031\\u0035\\u65E5\",\n  \"\\u33EF\",\n  \"\\u0031\\u0036\\u65E5\",\n  \"\\u33F0\",\n  \"\\u0031\\u0037\\u65E5\",\n  \"\\u33F1\",\n  \"\\u0031\\u0038\\u65E5\",\n  \"\\u33F2\",\n  \"\\u0031\\u0039\\u65E5\",\n  \"\\u33F3\",\n  \"\\u0032\\u0030\\u65E5\",\n  \"\\u33F4\",\n  \"\\u0032\\u0031\\u65E5\",\n  \"\\u33F5\",\n  \"\\u0032\\u0032\\u65E5\",\n  \"\\u33F6\",\n  \"\\u0032\\u0033\\u65E5\",\n  \"\\u33F7\",\n  \"\\u0032\\u0034\\u65E5\",\n  \"\\u33F8\",\n  \"\\u0032\\u0035\\u65E5\",\n  \"\\u33F9\",\n  \"\\u0032\\u0036\\u65E5\",\n  \"\\u33FA\",\n  \"\\u0032\\u0037\\u65E5\",\n  \"\\u33FB\",\n  \"\\u0032\\u0038\\u65E5\",\n  \"\\u33FC\",\n  \"\\u0032\\u0039\\u65E5\",\n  \"\\u33FD\",\n  \"\\u0033\\u0030\\u65E5\",\n  \"\\u33FE\",\n  \"\\u0033\\u0031\\u65E5\",\n  \"\\uFB00\",\n  \"\\u0066\\u0066\",\n  \"\\uFB01\",\n  \"\\u0066\\u0069\",\n  \"\\uFB02\",\n  \"\\u0066\\u006C\",\n  \"\\uFB03\",\n  \"\\u0066\\u0066\\u0069\",\n  \"\\uFB04\",\n  \"\\u0066\\u0066\\u006C\",\n  \"\\uFB05\",\n  \"\\u017F\\u0074\",\n  \"\\uFB06\",\n  \"\\u0073\\u0074\",\n  \"\\uFB13\",\n  \"\\u0574\\u0576\",\n  \"\\uFB14\",\n  \"\\u0574\\u0565\",\n  \"\\uFB15\",\n  \"\\u0574\\u056B\",\n  \"\\uFB16\",\n  \"\\u057E\\u0576\",\n  \"\\uFB17\",\n  \"\\u0574\\u056D\",\n  \"\\uFB4F\",\n  \"\\u05D0\\u05DC\",\n  \"\\uFB50\",\n  \"\\u0671\",\n  \"\\uFB51\",\n  \"\\u0671\",\n  \"\\uFB52\",\n  \"\\u067B\",\n  \"\\uFB53\",\n  \"\\u067B\",\n  \"\\uFB54\",\n  \"\\u067B\",\n  \"\\uFB55\",\n  \"\\u067B\",\n  \"\\uFB56\",\n  \"\\u067E\",\n  \"\\uFB57\",\n  \"\\u067E\",\n  \"\\uFB58\",\n  \"\\u067E\",\n  \"\\uFB59\",\n  \"\\u067E\",\n  \"\\uFB5A\",\n  \"\\u0680\",\n  \"\\uFB5B\",\n  \"\\u0680\",\n  \"\\uFB5C\",\n  \"\\u0680\",\n  \"\\uFB5D\",\n  \"\\u0680\",\n  \"\\uFB5E\",\n  \"\\u067A\",\n  \"\\uFB5F\",\n  \"\\u067A\",\n  \"\\uFB60\",\n  \"\\u067A\",\n  \"\\uFB61\",\n  \"\\u067A\",\n  \"\\uFB62\",\n  \"\\u067F\",\n  \"\\uFB63\",\n  \"\\u067F\",\n  \"\\uFB64\",\n  \"\\u067F\",\n  \"\\uFB65\",\n  \"\\u067F\",\n  \"\\uFB66\",\n  \"\\u0679\",\n  \"\\uFB67\",\n  \"\\u0679\",\n  \"\\uFB68\",\n  \"\\u0679\",\n  \"\\uFB69\",\n  \"\\u0679\",\n  \"\\uFB6A\",\n  \"\\u06A4\",\n  \"\\uFB6B\",\n  \"\\u06A4\",\n  \"\\uFB6C\",\n  \"\\u06A4\",\n  \"\\uFB6D\",\n  \"\\u06A4\",\n  \"\\uFB6E\",\n  \"\\u06A6\",\n  \"\\uFB6F\",\n  \"\\u06A6\",\n  \"\\uFB70\",\n  \"\\u06A6\",\n  \"\\uFB71\",\n  \"\\u06A6\",\n  \"\\uFB72\",\n  \"\\u0684\",\n  \"\\uFB73\",\n  \"\\u0684\",\n  \"\\uFB74\",\n  \"\\u0684\",\n  \"\\uFB75\",\n  \"\\u0684\",\n  \"\\uFB76\",\n  \"\\u0683\",\n  \"\\uFB77\",\n  \"\\u0683\",\n  \"\\uFB78\",\n  \"\\u0683\",\n  \"\\uFB79\",\n  \"\\u0683\",\n  \"\\uFB7A\",\n  \"\\u0686\",\n  \"\\uFB7B\",\n  \"\\u0686\",\n  \"\\uFB7C\",\n  \"\\u0686\",\n  \"\\uFB7D\",\n  \"\\u0686\",\n  \"\\uFB7E\",\n  \"\\u0687\",\n  \"\\uFB7F\",\n  \"\\u0687\",\n  \"\\uFB80\",\n  \"\\u0687\",\n  \"\\uFB81\",\n  \"\\u0687\",\n  \"\\uFB82\",\n  \"\\u068D\",\n  \"\\uFB83\",\n  \"\\u068D\",\n  \"\\uFB84\",\n  \"\\u068C\",\n  \"\\uFB85\",\n  \"\\u068C\",\n  \"\\uFB86\",\n  \"\\u068E\",\n  \"\\uFB87\",\n  \"\\u068E\",\n  \"\\uFB88\",\n  \"\\u0688\",\n  \"\\uFB89\",\n  \"\\u0688\",\n  \"\\uFB8A\",\n  \"\\u0698\",\n  \"\\uFB8B\",\n  \"\\u0698\",\n  \"\\uFB8C\",\n  \"\\u0691\",\n  \"\\uFB8D\",\n  \"\\u0691\",\n  \"\\uFB8E\",\n  \"\\u06A9\",\n  \"\\uFB8F\",\n  \"\\u06A9\",\n  \"\\uFB90\",\n  \"\\u06A9\",\n  \"\\uFB91\",\n  \"\\u06A9\",\n  \"\\uFB92\",\n  \"\\u06AF\",\n  \"\\uFB93\",\n  \"\\u06AF\",\n  \"\\uFB94\",\n  \"\\u06AF\",\n  \"\\uFB95\",\n  \"\\u06AF\",\n  \"\\uFB96\",\n  \"\\u06B3\",\n  \"\\uFB97\",\n  \"\\u06B3\",\n  \"\\uFB98\",\n  \"\\u06B3\",\n  \"\\uFB99\",\n  \"\\u06B3\",\n  \"\\uFB9A\",\n  \"\\u06B1\",\n  \"\\uFB9B\",\n  \"\\u06B1\",\n  \"\\uFB9C\",\n  \"\\u06B1\",\n  \"\\uFB9D\",\n  \"\\u06B1\",\n  \"\\uFB9E\",\n  \"\\u06BA\",\n  \"\\uFB9F\",\n  \"\\u06BA\",\n  \"\\uFBA0\",\n  \"\\u06BB\",\n  \"\\uFBA1\",\n  \"\\u06BB\",\n  \"\\uFBA2\",\n  \"\\u06BB\",\n  \"\\uFBA3\",\n  \"\\u06BB\",\n  \"\\uFBA4\",\n  \"\\u06C0\",\n  \"\\uFBA5\",\n  \"\\u06C0\",\n  \"\\uFBA6\",\n  \"\\u06C1\",\n  \"\\uFBA7\",\n  \"\\u06C1\",\n  \"\\uFBA8\",\n  \"\\u06C1\",\n  \"\\uFBA9\",\n  \"\\u06C1\",\n  \"\\uFBAA\",\n  \"\\u06BE\",\n  \"\\uFBAB\",\n  \"\\u06BE\",\n  \"\\uFBAC\",\n  \"\\u06BE\",\n  \"\\uFBAD\",\n  \"\\u06BE\",\n  \"\\uFBAE\",\n  \"\\u06D2\",\n  \"\\uFBAF\",\n  \"\\u06D2\",\n  \"\\uFBB0\",\n  \"\\u06D3\",\n  \"\\uFBB1\",\n  \"\\u06D3\",\n  \"\\uFBD3\",\n  \"\\u06AD\",\n  \"\\uFBD4\",\n  \"\\u06AD\",\n  \"\\uFBD5\",\n  \"\\u06AD\",\n  \"\\uFBD6\",\n  \"\\u06AD\",\n  \"\\uFBD7\",\n  \"\\u06C7\",\n  \"\\uFBD8\",\n  \"\\u06C7\",\n  \"\\uFBD9\",\n  \"\\u06C6\",\n  \"\\uFBDA\",\n  \"\\u06C6\",\n  \"\\uFBDB\",\n  \"\\u06C8\",\n  \"\\uFBDC\",\n  \"\\u06C8\",\n  \"\\uFBDD\",\n  \"\\u0677\",\n  \"\\uFBDE\",\n  \"\\u06CB\",\n  \"\\uFBDF\",\n  \"\\u06CB\",\n  \"\\uFBE0\",\n  \"\\u06C5\",\n  \"\\uFBE1\",\n  \"\\u06C5\",\n  \"\\uFBE2\",\n  \"\\u06C9\",\n  \"\\uFBE3\",\n  \"\\u06C9\",\n  \"\\uFBE4\",\n  \"\\u06D0\",\n  \"\\uFBE5\",\n  \"\\u06D0\",\n  \"\\uFBE6\",\n  \"\\u06D0\",\n  \"\\uFBE7\",\n  \"\\u06D0\",\n  \"\\uFBE8\",\n  \"\\u0649\",\n  \"\\uFBE9\",\n  \"\\u0649\",\n  \"\\uFBEA\",\n  \"\\u0626\\u0627\",\n  \"\\uFBEB\",\n  \"\\u0626\\u0627\",\n  \"\\uFBEC\",\n  \"\\u0626\\u06D5\",\n  \"\\uFBED\",\n  \"\\u0626\\u06D5\",\n  \"\\uFBEE\",\n  \"\\u0626\\u0648\",\n  \"\\uFBEF\",\n  \"\\u0626\\u0648\",\n  \"\\uFBF0\",\n  \"\\u0626\\u06C7\",\n  \"\\uFBF1\",\n  \"\\u0626\\u06C7\",\n  \"\\uFBF2\",\n  \"\\u0626\\u06C6\",\n  \"\\uFBF3\",\n  \"\\u0626\\u06C6\",\n  \"\\uFBF4\",\n  \"\\u0626\\u06C8\",\n  \"\\uFBF5\",\n  \"\\u0626\\u06C8\",\n  \"\\uFBF6\",\n  \"\\u0626\\u06D0\",\n  \"\\uFBF7\",\n  \"\\u0626\\u06D0\",\n  \"\\uFBF8\",\n  \"\\u0626\\u06D0\",\n  \"\\uFBF9\",\n  \"\\u0626\\u0649\",\n  \"\\uFBFA\",\n  \"\\u0626\\u0649\",\n  \"\\uFBFB\",\n  \"\\u0626\\u0649\",\n  \"\\uFBFC\",\n  \"\\u06CC\",\n  \"\\uFBFD\",\n  \"\\u06CC\",\n  \"\\uFBFE\",\n  \"\\u06CC\",\n  \"\\uFBFF\",\n  \"\\u06CC\",\n  \"\\uFC00\",\n  \"\\u0626\\u062C\",\n  \"\\uFC01\",\n  \"\\u0626\\u062D\",\n  \"\\uFC02\",\n  \"\\u0626\\u0645\",\n  \"\\uFC03\",\n  \"\\u0626\\u0649\",\n  \"\\uFC04\",\n  \"\\u0626\\u064A\",\n  \"\\uFC05\",\n  \"\\u0628\\u062C\",\n  \"\\uFC06\",\n  \"\\u0628\\u062D\",\n  \"\\uFC07\",\n  \"\\u0628\\u062E\",\n  \"\\uFC08\",\n  \"\\u0628\\u0645\",\n  \"\\uFC09\",\n  \"\\u0628\\u0649\",\n  \"\\uFC0A\",\n  \"\\u0628\\u064A\",\n  \"\\uFC0B\",\n  \"\\u062A\\u062C\",\n  \"\\uFC0C\",\n  \"\\u062A\\u062D\",\n  \"\\uFC0D\",\n  \"\\u062A\\u062E\",\n  \"\\uFC0E\",\n  \"\\u062A\\u0645\",\n  \"\\uFC0F\",\n  \"\\u062A\\u0649\",\n  \"\\uFC10\",\n  \"\\u062A\\u064A\",\n  \"\\uFC11\",\n  \"\\u062B\\u062C\",\n  \"\\uFC12\",\n  \"\\u062B\\u0645\",\n  \"\\uFC13\",\n  \"\\u062B\\u0649\",\n  \"\\uFC14\",\n  \"\\u062B\\u064A\",\n  \"\\uFC15\",\n  \"\\u062C\\u062D\",\n  \"\\uFC16\",\n  \"\\u062C\\u0645\",\n  \"\\uFC17\",\n  \"\\u062D\\u062C\",\n  \"\\uFC18\",\n  \"\\u062D\\u0645\",\n  \"\\uFC19\",\n  \"\\u062E\\u062C\",\n  \"\\uFC1A\",\n  \"\\u062E\\u062D\",\n  \"\\uFC1B\",\n  \"\\u062E\\u0645\",\n  \"\\uFC1C\",\n  \"\\u0633\\u062C\",\n  \"\\uFC1D\",\n  \"\\u0633\\u062D\",\n  \"\\uFC1E\",\n  \"\\u0633\\u062E\",\n  \"\\uFC1F\",\n  \"\\u0633\\u0645\",\n  \"\\uFC20\",\n  \"\\u0635\\u062D\",\n  \"\\uFC21\",\n  \"\\u0635\\u0645\",\n  \"\\uFC22\",\n  \"\\u0636\\u062C\",\n  \"\\uFC23\",\n  \"\\u0636\\u062D\",\n  \"\\uFC24\",\n  \"\\u0636\\u062E\",\n  \"\\uFC25\",\n  \"\\u0636\\u0645\",\n  \"\\uFC26\",\n  \"\\u0637\\u062D\",\n  \"\\uFC27\",\n  \"\\u0637\\u0645\",\n  \"\\uFC28\",\n  \"\\u0638\\u0645\",\n  \"\\uFC29\",\n  \"\\u0639\\u062C\",\n  \"\\uFC2A\",\n  \"\\u0639\\u0645\",\n  \"\\uFC2B\",\n  \"\\u063A\\u062C\",\n  \"\\uFC2C\",\n  \"\\u063A\\u0645\",\n  \"\\uFC2D\",\n  \"\\u0641\\u062C\",\n  \"\\uFC2E\",\n  \"\\u0641\\u062D\",\n  \"\\uFC2F\",\n  \"\\u0641\\u062E\",\n  \"\\uFC30\",\n  \"\\u0641\\u0645\",\n  \"\\uFC31\",\n  \"\\u0641\\u0649\",\n  \"\\uFC32\",\n  \"\\u0641\\u064A\",\n  \"\\uFC33\",\n  \"\\u0642\\u062D\",\n  \"\\uFC34\",\n  \"\\u0642\\u0645\",\n  \"\\uFC35\",\n  \"\\u0642\\u0649\",\n  \"\\uFC36\",\n  \"\\u0642\\u064A\",\n  \"\\uFC37\",\n  \"\\u0643\\u0627\",\n  \"\\uFC38\",\n  \"\\u0643\\u062C\",\n  \"\\uFC39\",\n  \"\\u0643\\u062D\",\n  \"\\uFC3A\",\n  \"\\u0643\\u062E\",\n  \"\\uFC3B\",\n  \"\\u0643\\u0644\",\n  \"\\uFC3C\",\n  \"\\u0643\\u0645\",\n  \"\\uFC3D\",\n  \"\\u0643\\u0649\",\n  \"\\uFC3E\",\n  \"\\u0643\\u064A\",\n  \"\\uFC3F\",\n  \"\\u0644\\u062C\",\n  \"\\uFC40\",\n  \"\\u0644\\u062D\",\n  \"\\uFC41\",\n  \"\\u0644\\u062E\",\n  \"\\uFC42\",\n  \"\\u0644\\u0645\",\n  \"\\uFC43\",\n  \"\\u0644\\u0649\",\n  \"\\uFC44\",\n  \"\\u0644\\u064A\",\n  \"\\uFC45\",\n  \"\\u0645\\u062C\",\n  \"\\uFC46\",\n  \"\\u0645\\u062D\",\n  \"\\uFC47\",\n  \"\\u0645\\u062E\",\n  \"\\uFC48\",\n  \"\\u0645\\u0645\",\n  \"\\uFC49\",\n  \"\\u0645\\u0649\",\n  \"\\uFC4A\",\n  \"\\u0645\\u064A\",\n  \"\\uFC4B\",\n  \"\\u0646\\u062C\",\n  \"\\uFC4C\",\n  \"\\u0646\\u062D\",\n  \"\\uFC4D\",\n  \"\\u0646\\u062E\",\n  \"\\uFC4E\",\n  \"\\u0646\\u0645\",\n  \"\\uFC4F\",\n  \"\\u0646\\u0649\",\n  \"\\uFC50\",\n  \"\\u0646\\u064A\",\n  \"\\uFC51\",\n  \"\\u0647\\u062C\",\n  \"\\uFC52\",\n  \"\\u0647\\u0645\",\n  \"\\uFC53\",\n  \"\\u0647\\u0649\",\n  \"\\uFC54\",\n  \"\\u0647\\u064A\",\n  \"\\uFC55\",\n  \"\\u064A\\u062C\",\n  \"\\uFC56\",\n  \"\\u064A\\u062D\",\n  \"\\uFC57\",\n  \"\\u064A\\u062E\",\n  \"\\uFC58\",\n  \"\\u064A\\u0645\",\n  \"\\uFC59\",\n  \"\\u064A\\u0649\",\n  \"\\uFC5A\",\n  \"\\u064A\\u064A\",\n  \"\\uFC5B\",\n  \"\\u0630\\u0670\",\n  \"\\uFC5C\",\n  \"\\u0631\\u0670\",\n  \"\\uFC5D\",\n  \"\\u0649\\u0670\",\n  \"\\uFC5E\",\n  \"\\u0020\\u064C\\u0651\",\n  \"\\uFC5F\",\n  \"\\u0020\\u064D\\u0651\",\n  \"\\uFC60\",\n  \"\\u0020\\u064E\\u0651\",\n  \"\\uFC61\",\n  \"\\u0020\\u064F\\u0651\",\n  \"\\uFC62\",\n  \"\\u0020\\u0650\\u0651\",\n  \"\\uFC63\",\n  \"\\u0020\\u0651\\u0670\",\n  \"\\uFC64\",\n  \"\\u0626\\u0631\",\n  \"\\uFC65\",\n  \"\\u0626\\u0632\",\n  \"\\uFC66\",\n  \"\\u0626\\u0645\",\n  \"\\uFC67\",\n  \"\\u0626\\u0646\",\n  \"\\uFC68\",\n  \"\\u0626\\u0649\",\n  \"\\uFC69\",\n  \"\\u0626\\u064A\",\n  \"\\uFC6A\",\n  \"\\u0628\\u0631\",\n  \"\\uFC6B\",\n  \"\\u0628\\u0632\",\n  \"\\uFC6C\",\n  \"\\u0628\\u0645\",\n  \"\\uFC6D\",\n  \"\\u0628\\u0646\",\n  \"\\uFC6E\",\n  \"\\u0628\\u0649\",\n  \"\\uFC6F\",\n  \"\\u0628\\u064A\",\n  \"\\uFC70\",\n  \"\\u062A\\u0631\",\n  \"\\uFC71\",\n  \"\\u062A\\u0632\",\n  \"\\uFC72\",\n  \"\\u062A\\u0645\",\n  \"\\uFC73\",\n  \"\\u062A\\u0646\",\n  \"\\uFC74\",\n  \"\\u062A\\u0649\",\n  \"\\uFC75\",\n  \"\\u062A\\u064A\",\n  \"\\uFC76\",\n  \"\\u062B\\u0631\",\n  \"\\uFC77\",\n  \"\\u062B\\u0632\",\n  \"\\uFC78\",\n  \"\\u062B\\u0645\",\n  \"\\uFC79\",\n  \"\\u062B\\u0646\",\n  \"\\uFC7A\",\n  \"\\u062B\\u0649\",\n  \"\\uFC7B\",\n  \"\\u062B\\u064A\",\n  \"\\uFC7C\",\n  \"\\u0641\\u0649\",\n  \"\\uFC7D\",\n  \"\\u0641\\u064A\",\n  \"\\uFC7E\",\n  \"\\u0642\\u0649\",\n  \"\\uFC7F\",\n  \"\\u0642\\u064A\",\n  \"\\uFC80\",\n  \"\\u0643\\u0627\",\n  \"\\uFC81\",\n  \"\\u0643\\u0644\",\n  \"\\uFC82\",\n  \"\\u0643\\u0645\",\n  \"\\uFC83\",\n  \"\\u0643\\u0649\",\n  \"\\uFC84\",\n  \"\\u0643\\u064A\",\n  \"\\uFC85\",\n  \"\\u0644\\u0645\",\n  \"\\uFC86\",\n  \"\\u0644\\u0649\",\n  \"\\uFC87\",\n  \"\\u0644\\u064A\",\n  \"\\uFC88\",\n  \"\\u0645\\u0627\",\n  \"\\uFC89\",\n  \"\\u0645\\u0645\",\n  \"\\uFC8A\",\n  \"\\u0646\\u0631\",\n  \"\\uFC8B\",\n  \"\\u0646\\u0632\",\n  \"\\uFC8C\",\n  \"\\u0646\\u0645\",\n  \"\\uFC8D\",\n  \"\\u0646\\u0646\",\n  \"\\uFC8E\",\n  \"\\u0646\\u0649\",\n  \"\\uFC8F\",\n  \"\\u0646\\u064A\",\n  \"\\uFC90\",\n  \"\\u0649\\u0670\",\n  \"\\uFC91\",\n  \"\\u064A\\u0631\",\n  \"\\uFC92\",\n  \"\\u064A\\u0632\",\n  \"\\uFC93\",\n  \"\\u064A\\u0645\",\n  \"\\uFC94\",\n  \"\\u064A\\u0646\",\n  \"\\uFC95\",\n  \"\\u064A\\u0649\",\n  \"\\uFC96\",\n  \"\\u064A\\u064A\",\n  \"\\uFC97\",\n  \"\\u0626\\u062C\",\n  \"\\uFC98\",\n  \"\\u0626\\u062D\",\n  \"\\uFC99\",\n  \"\\u0626\\u062E\",\n  \"\\uFC9A\",\n  \"\\u0626\\u0645\",\n  \"\\uFC9B\",\n  \"\\u0626\\u0647\",\n  \"\\uFC9C\",\n  \"\\u0628\\u062C\",\n  \"\\uFC9D\",\n  \"\\u0628\\u062D\",\n  \"\\uFC9E\",\n  \"\\u0628\\u062E\",\n  \"\\uFC9F\",\n  \"\\u0628\\u0645\",\n  \"\\uFCA0\",\n  \"\\u0628\\u0647\",\n  \"\\uFCA1\",\n  \"\\u062A\\u062C\",\n  \"\\uFCA2\",\n  \"\\u062A\\u062D\",\n  \"\\uFCA3\",\n  \"\\u062A\\u062E\",\n  \"\\uFCA4\",\n  \"\\u062A\\u0645\",\n  \"\\uFCA5\",\n  \"\\u062A\\u0647\",\n  \"\\uFCA6\",\n  \"\\u062B\\u0645\",\n  \"\\uFCA7\",\n  \"\\u062C\\u062D\",\n  \"\\uFCA8\",\n  \"\\u062C\\u0645\",\n  \"\\uFCA9\",\n  \"\\u062D\\u062C\",\n  \"\\uFCAA\",\n  \"\\u062D\\u0645\",\n  \"\\uFCAB\",\n  \"\\u062E\\u062C\",\n  \"\\uFCAC\",\n  \"\\u062E\\u0645\",\n  \"\\uFCAD\",\n  \"\\u0633\\u062C\",\n  \"\\uFCAE\",\n  \"\\u0633\\u062D\",\n  \"\\uFCAF\",\n  \"\\u0633\\u062E\",\n  \"\\uFCB0\",\n  \"\\u0633\\u0645\",\n  \"\\uFCB1\",\n  \"\\u0635\\u062D\",\n  \"\\uFCB2\",\n  \"\\u0635\\u062E\",\n  \"\\uFCB3\",\n  \"\\u0635\\u0645\",\n  \"\\uFCB4\",\n  \"\\u0636\\u062C\",\n  \"\\uFCB5\",\n  \"\\u0636\\u062D\",\n  \"\\uFCB6\",\n  \"\\u0636\\u062E\",\n  \"\\uFCB7\",\n  \"\\u0636\\u0645\",\n  \"\\uFCB8\",\n  \"\\u0637\\u062D\",\n  \"\\uFCB9\",\n  \"\\u0638\\u0645\",\n  \"\\uFCBA\",\n  \"\\u0639\\u062C\",\n  \"\\uFCBB\",\n  \"\\u0639\\u0645\",\n  \"\\uFCBC\",\n  \"\\u063A\\u062C\",\n  \"\\uFCBD\",\n  \"\\u063A\\u0645\",\n  \"\\uFCBE\",\n  \"\\u0641\\u062C\",\n  \"\\uFCBF\",\n  \"\\u0641\\u062D\",\n  \"\\uFCC0\",\n  \"\\u0641\\u062E\",\n  \"\\uFCC1\",\n  \"\\u0641\\u0645\",\n  \"\\uFCC2\",\n  \"\\u0642\\u062D\",\n  \"\\uFCC3\",\n  \"\\u0642\\u0645\",\n  \"\\uFCC4\",\n  \"\\u0643\\u062C\",\n  \"\\uFCC5\",\n  \"\\u0643\\u062D\",\n  \"\\uFCC6\",\n  \"\\u0643\\u062E\",\n  \"\\uFCC7\",\n  \"\\u0643\\u0644\",\n  \"\\uFCC8\",\n  \"\\u0643\\u0645\",\n  \"\\uFCC9\",\n  \"\\u0644\\u062C\",\n  \"\\uFCCA\",\n  \"\\u0644\\u062D\",\n  \"\\uFCCB\",\n  \"\\u0644\\u062E\",\n  \"\\uFCCC\",\n  \"\\u0644\\u0645\",\n  \"\\uFCCD\",\n  \"\\u0644\\u0647\",\n  \"\\uFCCE\",\n  \"\\u0645\\u062C\",\n  \"\\uFCCF\",\n  \"\\u0645\\u062D\",\n  \"\\uFCD0\",\n  \"\\u0645\\u062E\",\n  \"\\uFCD1\",\n  \"\\u0645\\u0645\",\n  \"\\uFCD2\",\n  \"\\u0646\\u062C\",\n  \"\\uFCD3\",\n  \"\\u0646\\u062D\",\n  \"\\uFCD4\",\n  \"\\u0646\\u062E\",\n  \"\\uFCD5\",\n  \"\\u0646\\u0645\",\n  \"\\uFCD6\",\n  \"\\u0646\\u0647\",\n  \"\\uFCD7\",\n  \"\\u0647\\u062C\",\n  \"\\uFCD8\",\n  \"\\u0647\\u0645\",\n  \"\\uFCD9\",\n  \"\\u0647\\u0670\",\n  \"\\uFCDA\",\n  \"\\u064A\\u062C\",\n  \"\\uFCDB\",\n  \"\\u064A\\u062D\",\n  \"\\uFCDC\",\n  \"\\u064A\\u062E\",\n  \"\\uFCDD\",\n  \"\\u064A\\u0645\",\n  \"\\uFCDE\",\n  \"\\u064A\\u0647\",\n  \"\\uFCDF\",\n  \"\\u0626\\u0645\",\n  \"\\uFCE0\",\n  \"\\u0626\\u0647\",\n  \"\\uFCE1\",\n  \"\\u0628\\u0645\",\n  \"\\uFCE2\",\n  \"\\u0628\\u0647\",\n  \"\\uFCE3\",\n  \"\\u062A\\u0645\",\n  \"\\uFCE4\",\n  \"\\u062A\\u0647\",\n  \"\\uFCE5\",\n  \"\\u062B\\u0645\",\n  \"\\uFCE6\",\n  \"\\u062B\\u0647\",\n  \"\\uFCE7\",\n  \"\\u0633\\u0645\",\n  \"\\uFCE8\",\n  \"\\u0633\\u0647\",\n  \"\\uFCE9\",\n  \"\\u0634\\u0645\",\n  \"\\uFCEA\",\n  \"\\u0634\\u0647\",\n  \"\\uFCEB\",\n  \"\\u0643\\u0644\",\n  \"\\uFCEC\",\n  \"\\u0643\\u0645\",\n  \"\\uFCED\",\n  \"\\u0644\\u0645\",\n  \"\\uFCEE\",\n  \"\\u0646\\u0645\",\n  \"\\uFCEF\",\n  \"\\u0646\\u0647\",\n  \"\\uFCF0\",\n  \"\\u064A\\u0645\",\n  \"\\uFCF1\",\n  \"\\u064A\\u0647\",\n  \"\\uFCF2\",\n  \"\\u0640\\u064E\\u0651\",\n  \"\\uFCF3\",\n  \"\\u0640\\u064F\\u0651\",\n  \"\\uFCF4\",\n  \"\\u0640\\u0650\\u0651\",\n  \"\\uFCF5\",\n  \"\\u0637\\u0649\",\n  \"\\uFCF6\",\n  \"\\u0637\\u064A\",\n  \"\\uFCF7\",\n  \"\\u0639\\u0649\",\n  \"\\uFCF8\",\n  \"\\u0639\\u064A\",\n  \"\\uFCF9\",\n  \"\\u063A\\u0649\",\n  \"\\uFCFA\",\n  \"\\u063A\\u064A\",\n  \"\\uFCFB\",\n  \"\\u0633\\u0649\",\n  \"\\uFCFC\",\n  \"\\u0633\\u064A\",\n  \"\\uFCFD\",\n  \"\\u0634\\u0649\",\n  \"\\uFCFE\",\n  \"\\u0634\\u064A\",\n  \"\\uFCFF\",\n  \"\\u062D\\u0649\",\n  \"\\uFD00\",\n  \"\\u062D\\u064A\",\n  \"\\uFD01\",\n  \"\\u062C\\u0649\",\n  \"\\uFD02\",\n  \"\\u062C\\u064A\",\n  \"\\uFD03\",\n  \"\\u062E\\u0649\",\n  \"\\uFD04\",\n  \"\\u062E\\u064A\",\n  \"\\uFD05\",\n  \"\\u0635\\u0649\",\n  \"\\uFD06\",\n  \"\\u0635\\u064A\",\n  \"\\uFD07\",\n  \"\\u0636\\u0649\",\n  \"\\uFD08\",\n  \"\\u0636\\u064A\",\n  \"\\uFD09\",\n  \"\\u0634\\u062C\",\n  \"\\uFD0A\",\n  \"\\u0634\\u062D\",\n  \"\\uFD0B\",\n  \"\\u0634\\u062E\",\n  \"\\uFD0C\",\n  \"\\u0634\\u0645\",\n  \"\\uFD0D\",\n  \"\\u0634\\u0631\",\n  \"\\uFD0E\",\n  \"\\u0633\\u0631\",\n  \"\\uFD0F\",\n  \"\\u0635\\u0631\",\n  \"\\uFD10\",\n  \"\\u0636\\u0631\",\n  \"\\uFD11\",\n  \"\\u0637\\u0649\",\n  \"\\uFD12\",\n  \"\\u0637\\u064A\",\n  \"\\uFD13\",\n  \"\\u0639\\u0649\",\n  \"\\uFD14\",\n  \"\\u0639\\u064A\",\n  \"\\uFD15\",\n  \"\\u063A\\u0649\",\n  \"\\uFD16\",\n  \"\\u063A\\u064A\",\n  \"\\uFD17\",\n  \"\\u0633\\u0649\",\n  \"\\uFD18\",\n  \"\\u0633\\u064A\",\n  \"\\uFD19\",\n  \"\\u0634\\u0649\",\n  \"\\uFD1A\",\n  \"\\u0634\\u064A\",\n  \"\\uFD1B\",\n  \"\\u062D\\u0649\",\n  \"\\uFD1C\",\n  \"\\u062D\\u064A\",\n  \"\\uFD1D\",\n  \"\\u062C\\u0649\",\n  \"\\uFD1E\",\n  \"\\u062C\\u064A\",\n  \"\\uFD1F\",\n  \"\\u062E\\u0649\",\n  \"\\uFD20\",\n  \"\\u062E\\u064A\",\n  \"\\uFD21\",\n  \"\\u0635\\u0649\",\n  \"\\uFD22\",\n  \"\\u0635\\u064A\",\n  \"\\uFD23\",\n  \"\\u0636\\u0649\",\n  \"\\uFD24\",\n  \"\\u0636\\u064A\",\n  \"\\uFD25\",\n  \"\\u0634\\u062C\",\n  \"\\uFD26\",\n  \"\\u0634\\u062D\",\n  \"\\uFD27\",\n  \"\\u0634\\u062E\",\n  \"\\uFD28\",\n  \"\\u0634\\u0645\",\n  \"\\uFD29\",\n  \"\\u0634\\u0631\",\n  \"\\uFD2A\",\n  \"\\u0633\\u0631\",\n  \"\\uFD2B\",\n  \"\\u0635\\u0631\",\n  \"\\uFD2C\",\n  \"\\u0636\\u0631\",\n  \"\\uFD2D\",\n  \"\\u0634\\u062C\",\n  \"\\uFD2E\",\n  \"\\u0634\\u062D\",\n  \"\\uFD2F\",\n  \"\\u0634\\u062E\",\n  \"\\uFD30\",\n  \"\\u0634\\u0645\",\n  \"\\uFD31\",\n  \"\\u0633\\u0647\",\n  \"\\uFD32\",\n  \"\\u0634\\u0647\",\n  \"\\uFD33\",\n  \"\\u0637\\u0645\",\n  \"\\uFD34\",\n  \"\\u0633\\u062C\",\n  \"\\uFD35\",\n  \"\\u0633\\u062D\",\n  \"\\uFD36\",\n  \"\\u0633\\u062E\",\n  \"\\uFD37\",\n  \"\\u0634\\u062C\",\n  \"\\uFD38\",\n  \"\\u0634\\u062D\",\n  \"\\uFD39\",\n  \"\\u0634\\u062E\",\n  \"\\uFD3A\",\n  \"\\u0637\\u0645\",\n  \"\\uFD3B\",\n  \"\\u0638\\u0645\",\n  \"\\uFD3C\",\n  \"\\u0627\\u064B\",\n  \"\\uFD3D\",\n  \"\\u0627\\u064B\",\n  \"\\uFD50\",\n  \"\\u062A\\u062C\\u0645\",\n  \"\\uFD51\",\n  \"\\u062A\\u062D\\u062C\",\n  \"\\uFD52\",\n  \"\\u062A\\u062D\\u062C\",\n  \"\\uFD53\",\n  \"\\u062A\\u062D\\u0645\",\n  \"\\uFD54\",\n  \"\\u062A\\u062E\\u0645\",\n  \"\\uFD55\",\n  \"\\u062A\\u0645\\u062C\",\n  \"\\uFD56\",\n  \"\\u062A\\u0645\\u062D\",\n  \"\\uFD57\",\n  \"\\u062A\\u0645\\u062E\",\n  \"\\uFD58\",\n  \"\\u062C\\u0645\\u062D\",\n  \"\\uFD59\",\n  \"\\u062C\\u0645\\u062D\",\n  \"\\uFD5A\",\n  \"\\u062D\\u0645\\u064A\",\n  \"\\uFD5B\",\n  \"\\u062D\\u0645\\u0649\",\n  \"\\uFD5C\",\n  \"\\u0633\\u062D\\u062C\",\n  \"\\uFD5D\",\n  \"\\u0633\\u062C\\u062D\",\n  \"\\uFD5E\",\n  \"\\u0633\\u062C\\u0649\",\n  \"\\uFD5F\",\n  \"\\u0633\\u0645\\u062D\",\n  \"\\uFD60\",\n  \"\\u0633\\u0645\\u062D\",\n  \"\\uFD61\",\n  \"\\u0633\\u0645\\u062C\",\n  \"\\uFD62\",\n  \"\\u0633\\u0645\\u0645\",\n  \"\\uFD63\",\n  \"\\u0633\\u0645\\u0645\",\n  \"\\uFD64\",\n  \"\\u0635\\u062D\\u062D\",\n  \"\\uFD65\",\n  \"\\u0635\\u062D\\u062D\",\n  \"\\uFD66\",\n  \"\\u0635\\u0645\\u0645\",\n  \"\\uFD67\",\n  \"\\u0634\\u062D\\u0645\",\n  \"\\uFD68\",\n  \"\\u0634\\u062D\\u0645\",\n  \"\\uFD69\",\n  \"\\u0634\\u062C\\u064A\",\n  \"\\uFD6A\",\n  \"\\u0634\\u0645\\u062E\",\n  \"\\uFD6B\",\n  \"\\u0634\\u0645\\u062E\",\n  \"\\uFD6C\",\n  \"\\u0634\\u0645\\u0645\",\n  \"\\uFD6D\",\n  \"\\u0634\\u0645\\u0645\",\n  \"\\uFD6E\",\n  \"\\u0636\\u062D\\u0649\",\n  \"\\uFD6F\",\n  \"\\u0636\\u062E\\u0645\",\n  \"\\uFD70\",\n  \"\\u0636\\u062E\\u0645\",\n  \"\\uFD71\",\n  \"\\u0637\\u0645\\u062D\",\n  \"\\uFD72\",\n  \"\\u0637\\u0645\\u062D\",\n  \"\\uFD73\",\n  \"\\u0637\\u0645\\u0645\",\n  \"\\uFD74\",\n  \"\\u0637\\u0645\\u064A\",\n  \"\\uFD75\",\n  \"\\u0639\\u062C\\u0645\",\n  \"\\uFD76\",\n  \"\\u0639\\u0645\\u0645\",\n  \"\\uFD77\",\n  \"\\u0639\\u0645\\u0645\",\n  \"\\uFD78\",\n  \"\\u0639\\u0645\\u0649\",\n  \"\\uFD79\",\n  \"\\u063A\\u0645\\u0645\",\n  \"\\uFD7A\",\n  \"\\u063A\\u0645\\u064A\",\n  \"\\uFD7B\",\n  \"\\u063A\\u0645\\u0649\",\n  \"\\uFD7C\",\n  \"\\u0641\\u062E\\u0645\",\n  \"\\uFD7D\",\n  \"\\u0641\\u062E\\u0645\",\n  \"\\uFD7E\",\n  \"\\u0642\\u0645\\u062D\",\n  \"\\uFD7F\",\n  \"\\u0642\\u0645\\u0645\",\n  \"\\uFD80\",\n  \"\\u0644\\u062D\\u0645\",\n  \"\\uFD81\",\n  \"\\u0644\\u062D\\u064A\",\n  \"\\uFD82\",\n  \"\\u0644\\u062D\\u0649\",\n  \"\\uFD83\",\n  \"\\u0644\\u062C\\u062C\",\n  \"\\uFD84\",\n  \"\\u0644\\u062C\\u062C\",\n  \"\\uFD85\",\n  \"\\u0644\\u062E\\u0645\",\n  \"\\uFD86\",\n  \"\\u0644\\u062E\\u0645\",\n  \"\\uFD87\",\n  \"\\u0644\\u0645\\u062D\",\n  \"\\uFD88\",\n  \"\\u0644\\u0645\\u062D\",\n  \"\\uFD89\",\n  \"\\u0645\\u062D\\u062C\",\n  \"\\uFD8A\",\n  \"\\u0645\\u062D\\u0645\",\n  \"\\uFD8B\",\n  \"\\u0645\\u062D\\u064A\",\n  \"\\uFD8C\",\n  \"\\u0645\\u062C\\u062D\",\n  \"\\uFD8D\",\n  \"\\u0645\\u062C\\u0645\",\n  \"\\uFD8E\",\n  \"\\u0645\\u062E\\u062C\",\n  \"\\uFD8F\",\n  \"\\u0645\\u062E\\u0645\",\n  \"\\uFD92\",\n  \"\\u0645\\u062C\\u062E\",\n  \"\\uFD93\",\n  \"\\u0647\\u0645\\u062C\",\n  \"\\uFD94\",\n  \"\\u0647\\u0645\\u0645\",\n  \"\\uFD95\",\n  \"\\u0646\\u062D\\u0645\",\n  \"\\uFD96\",\n  \"\\u0646\\u062D\\u0649\",\n  \"\\uFD97\",\n  \"\\u0646\\u062C\\u0645\",\n  \"\\uFD98\",\n  \"\\u0646\\u062C\\u0645\",\n  \"\\uFD99\",\n  \"\\u0646\\u062C\\u0649\",\n  \"\\uFD9A\",\n  \"\\u0646\\u0645\\u064A\",\n  \"\\uFD9B\",\n  \"\\u0646\\u0645\\u0649\",\n  \"\\uFD9C\",\n  \"\\u064A\\u0645\\u0645\",\n  \"\\uFD9D\",\n  \"\\u064A\\u0645\\u0645\",\n  \"\\uFD9E\",\n  \"\\u0628\\u062E\\u064A\",\n  \"\\uFD9F\",\n  \"\\u062A\\u062C\\u064A\",\n  \"\\uFDA0\",\n  \"\\u062A\\u062C\\u0649\",\n  \"\\uFDA1\",\n  \"\\u062A\\u062E\\u064A\",\n  \"\\uFDA2\",\n  \"\\u062A\\u062E\\u0649\",\n  \"\\uFDA3\",\n  \"\\u062A\\u0645\\u064A\",\n  \"\\uFDA4\",\n  \"\\u062A\\u0645\\u0649\",\n  \"\\uFDA5\",\n  \"\\u062C\\u0645\\u064A\",\n  \"\\uFDA6\",\n  \"\\u062C\\u062D\\u0649\",\n  \"\\uFDA7\",\n  \"\\u062C\\u0645\\u0649\",\n  \"\\uFDA8\",\n  \"\\u0633\\u062E\\u0649\",\n  \"\\uFDA9\",\n  \"\\u0635\\u062D\\u064A\",\n  \"\\uFDAA\",\n  \"\\u0634\\u062D\\u064A\",\n  \"\\uFDAB\",\n  \"\\u0636\\u062D\\u064A\",\n  \"\\uFDAC\",\n  \"\\u0644\\u062C\\u064A\",\n  \"\\uFDAD\",\n  \"\\u0644\\u0645\\u064A\",\n  \"\\uFDAE\",\n  \"\\u064A\\u062D\\u064A\",\n  \"\\uFDAF\",\n  \"\\u064A\\u062C\\u064A\",\n  \"\\uFDB0\",\n  \"\\u064A\\u0645\\u064A\",\n  \"\\uFDB1\",\n  \"\\u0645\\u0645\\u064A\",\n  \"\\uFDB2\",\n  \"\\u0642\\u0645\\u064A\",\n  \"\\uFDB3\",\n  \"\\u0646\\u062D\\u064A\",\n  \"\\uFDB4\",\n  \"\\u0642\\u0645\\u062D\",\n  \"\\uFDB5\",\n  \"\\u0644\\u062D\\u0645\",\n  \"\\uFDB6\",\n  \"\\u0639\\u0645\\u064A\",\n  \"\\uFDB7\",\n  \"\\u0643\\u0645\\u064A\",\n  \"\\uFDB8\",\n  \"\\u0646\\u062C\\u062D\",\n  \"\\uFDB9\",\n  \"\\u0645\\u062E\\u064A\",\n  \"\\uFDBA\",\n  \"\\u0644\\u062C\\u0645\",\n  \"\\uFDBB\",\n  \"\\u0643\\u0645\\u0645\",\n  \"\\uFDBC\",\n  \"\\u0644\\u062C\\u0645\",\n  \"\\uFDBD\",\n  \"\\u0646\\u062C\\u062D\",\n  \"\\uFDBE\",\n  \"\\u062C\\u062D\\u064A\",\n  \"\\uFDBF\",\n  \"\\u062D\\u062C\\u064A\",\n  \"\\uFDC0\",\n  \"\\u0645\\u062C\\u064A\",\n  \"\\uFDC1\",\n  \"\\u0641\\u0645\\u064A\",\n  \"\\uFDC2\",\n  \"\\u0628\\u062D\\u064A\",\n  \"\\uFDC3\",\n  \"\\u0643\\u0645\\u0645\",\n  \"\\uFDC4\",\n  \"\\u0639\\u062C\\u0645\",\n  \"\\uFDC5\",\n  \"\\u0635\\u0645\\u0645\",\n  \"\\uFDC6\",\n  \"\\u0633\\u062E\\u064A\",\n  \"\\uFDC7\",\n  \"\\u0646\\u062C\\u064A\",\n  \"\\uFE49\",\n  \"\\u203E\",\n  \"\\uFE4A\",\n  \"\\u203E\",\n  \"\\uFE4B\",\n  \"\\u203E\",\n  \"\\uFE4C\",\n  \"\\u203E\",\n  \"\\uFE4D\",\n  \"\\u005F\",\n  \"\\uFE4E\",\n  \"\\u005F\",\n  \"\\uFE4F\",\n  \"\\u005F\",\n  \"\\uFE80\",\n  \"\\u0621\",\n  \"\\uFE81\",\n  \"\\u0622\",\n  \"\\uFE82\",\n  \"\\u0622\",\n  \"\\uFE83\",\n  \"\\u0623\",\n  \"\\uFE84\",\n  \"\\u0623\",\n  \"\\uFE85\",\n  \"\\u0624\",\n  \"\\uFE86\",\n  \"\\u0624\",\n  \"\\uFE87\",\n  \"\\u0625\",\n  \"\\uFE88\",\n  \"\\u0625\",\n  \"\\uFE89\",\n  \"\\u0626\",\n  \"\\uFE8A\",\n  \"\\u0626\",\n  \"\\uFE8B\",\n  \"\\u0626\",\n  \"\\uFE8C\",\n  \"\\u0626\",\n  \"\\uFE8D\",\n  \"\\u0627\",\n  \"\\uFE8E\",\n  \"\\u0627\",\n  \"\\uFE8F\",\n  \"\\u0628\",\n  \"\\uFE90\",\n  \"\\u0628\",\n  \"\\uFE91\",\n  \"\\u0628\",\n  \"\\uFE92\",\n  \"\\u0628\",\n  \"\\uFE93\",\n  \"\\u0629\",\n  \"\\uFE94\",\n  \"\\u0629\",\n  \"\\uFE95\",\n  \"\\u062A\",\n  \"\\uFE96\",\n  \"\\u062A\",\n  \"\\uFE97\",\n  \"\\u062A\",\n  \"\\uFE98\",\n  \"\\u062A\",\n  \"\\uFE99\",\n  \"\\u062B\",\n  \"\\uFE9A\",\n  \"\\u062B\",\n  \"\\uFE9B\",\n  \"\\u062B\",\n  \"\\uFE9C\",\n  \"\\u062B\",\n  \"\\uFE9D\",\n  \"\\u062C\",\n  \"\\uFE9E\",\n  \"\\u062C\",\n  \"\\uFE9F\",\n  \"\\u062C\",\n  \"\\uFEA0\",\n  \"\\u062C\",\n  \"\\uFEA1\",\n  \"\\u062D\",\n  \"\\uFEA2\",\n  \"\\u062D\",\n  \"\\uFEA3\",\n  \"\\u062D\",\n  \"\\uFEA4\",\n  \"\\u062D\",\n  \"\\uFEA5\",\n  \"\\u062E\",\n  \"\\uFEA6\",\n  \"\\u062E\",\n  \"\\uFEA7\",\n  \"\\u062E\",\n  \"\\uFEA8\",\n  \"\\u062E\",\n  \"\\uFEA9\",\n  \"\\u062F\",\n  \"\\uFEAA\",\n  \"\\u062F\",\n  \"\\uFEAB\",\n  \"\\u0630\",\n  \"\\uFEAC\",\n  \"\\u0630\",\n  \"\\uFEAD\",\n  \"\\u0631\",\n  \"\\uFEAE\",\n  \"\\u0631\",\n  \"\\uFEAF\",\n  \"\\u0632\",\n  \"\\uFEB0\",\n  \"\\u0632\",\n  \"\\uFEB1\",\n  \"\\u0633\",\n  \"\\uFEB2\",\n  \"\\u0633\",\n  \"\\uFEB3\",\n  \"\\u0633\",\n  \"\\uFEB4\",\n  \"\\u0633\",\n  \"\\uFEB5\",\n  \"\\u0634\",\n  \"\\uFEB6\",\n  \"\\u0634\",\n  \"\\uFEB7\",\n  \"\\u0634\",\n  \"\\uFEB8\",\n  \"\\u0634\",\n  \"\\uFEB9\",\n  \"\\u0635\",\n  \"\\uFEBA\",\n  \"\\u0635\",\n  \"\\uFEBB\",\n  \"\\u0635\",\n  \"\\uFEBC\",\n  \"\\u0635\",\n  \"\\uFEBD\",\n  \"\\u0636\",\n  \"\\uFEBE\",\n  \"\\u0636\",\n  \"\\uFEBF\",\n  \"\\u0636\",\n  \"\\uFEC0\",\n  \"\\u0636\",\n  \"\\uFEC1\",\n  \"\\u0637\",\n  \"\\uFEC2\",\n  \"\\u0637\",\n  \"\\uFEC3\",\n  \"\\u0637\",\n  \"\\uFEC4\",\n  \"\\u0637\",\n  \"\\uFEC5\",\n  \"\\u0638\",\n  \"\\uFEC6\",\n  \"\\u0638\",\n  \"\\uFEC7\",\n  \"\\u0638\",\n  \"\\uFEC8\",\n  \"\\u0638\",\n  \"\\uFEC9\",\n  \"\\u0639\",\n  \"\\uFECA\",\n  \"\\u0639\",\n  \"\\uFECB\",\n  \"\\u0639\",\n  \"\\uFECC\",\n  \"\\u0639\",\n  \"\\uFECD\",\n  \"\\u063A\",\n  \"\\uFECE\",\n  \"\\u063A\",\n  \"\\uFECF\",\n  \"\\u063A\",\n  \"\\uFED0\",\n  \"\\u063A\",\n  \"\\uFED1\",\n  \"\\u0641\",\n  \"\\uFED2\",\n  \"\\u0641\",\n  \"\\uFED3\",\n  \"\\u0641\",\n  \"\\uFED4\",\n  \"\\u0641\",\n  \"\\uFED5\",\n  \"\\u0642\",\n  \"\\uFED6\",\n  \"\\u0642\",\n  \"\\uFED7\",\n  \"\\u0642\",\n  \"\\uFED8\",\n  \"\\u0642\",\n  \"\\uFED9\",\n  \"\\u0643\",\n  \"\\uFEDA\",\n  \"\\u0643\",\n  \"\\uFEDB\",\n  \"\\u0643\",\n  \"\\uFEDC\",\n  \"\\u0643\",\n  \"\\uFEDD\",\n  \"\\u0644\",\n  \"\\uFEDE\",\n  \"\\u0644\",\n  \"\\uFEDF\",\n  \"\\u0644\",\n  \"\\uFEE0\",\n  \"\\u0644\",\n  \"\\uFEE1\",\n  \"\\u0645\",\n  \"\\uFEE2\",\n  \"\\u0645\",\n  \"\\uFEE3\",\n  \"\\u0645\",\n  \"\\uFEE4\",\n  \"\\u0645\",\n  \"\\uFEE5\",\n  \"\\u0646\",\n  \"\\uFEE6\",\n  \"\\u0646\",\n  \"\\uFEE7\",\n  \"\\u0646\",\n  \"\\uFEE8\",\n  \"\\u0646\",\n  \"\\uFEE9\",\n  \"\\u0647\",\n  \"\\uFEEA\",\n  \"\\u0647\",\n  \"\\uFEEB\",\n  \"\\u0647\",\n  \"\\uFEEC\",\n  \"\\u0647\",\n  \"\\uFEED\",\n  \"\\u0648\",\n  \"\\uFEEE\",\n  \"\\u0648\",\n  \"\\uFEEF\",\n  \"\\u0649\",\n  \"\\uFEF0\",\n  \"\\u0649\",\n  \"\\uFEF1\",\n  \"\\u064A\",\n  \"\\uFEF2\",\n  \"\\u064A\",\n  \"\\uFEF3\",\n  \"\\u064A\",\n  \"\\uFEF4\",\n  \"\\u064A\",\n  \"\\uFEF5\",\n  \"\\u0644\\u0622\",\n  \"\\uFEF6\",\n  \"\\u0644\\u0622\",\n  \"\\uFEF7\",\n  \"\\u0644\\u0623\",\n  \"\\uFEF8\",\n  \"\\u0644\\u0623\",\n  \"\\uFEF9\",\n  \"\\u0644\\u0625\",\n  \"\\uFEFA\",\n  \"\\u0644\\u0625\",\n  \"\\uFEFB\",\n  \"\\u0644\\u0627\",\n  \"\\uFEFC\",\n  \"\\u0644\\u0627\"\n ];\n});\nfunction reverseIfRtl(chars) {\n const charsLength = chars.length;\n if (charsLength <= 1 || !isRTLRangeFor(chars.charCodeAt(0))) {\n  return chars;\n }\n const buf = [];\n for (let ii = charsLength - 1; ii >= 0; ii--) {\n  buf.push(chars[ii]);\n }\n return buf.join(\"\");\n}\n\n\n/***/ }),\n/* 38 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.FontRendererFactory = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _cff_parser = __w_pdfjs_require__(32);\n\nvar _glyphlist = __w_pdfjs_require__(35);\n\nvar _encodings = __w_pdfjs_require__(34);\n\nvar _stream = __w_pdfjs_require__(12);\n\nconst FontRendererFactory = function FontRendererFactoryClosure() {\n  function getLong(data, offset) {\n    return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];\n  }\n\n  function getUshort(data, offset) {\n    return data[offset] << 8 | data[offset + 1];\n  }\n\n  function getSubroutineBias(subrs) {\n    const numSubrs = subrs.length;\n    let bias = 32768;\n\n    if (numSubrs < 1240) {\n      bias = 107;\n    } else if (numSubrs < 33900) {\n      bias = 1131;\n    }\n\n    return bias;\n  }\n\n  function parseCmap(data, start, end) {\n    const offset = getUshort(data, start + 2) === 1 ? getLong(data, start + 8) : getLong(data, start + 16);\n    const format = getUshort(data, start + offset);\n    let ranges, p, i;\n\n    if (format === 4) {\n      getUshort(data, start + offset + 2);\n      const segCount = getUshort(data, start + offset + 6) >> 1;\n      p = start + offset + 14;\n      ranges = [];\n\n      for (i = 0; i < segCount; i++, p += 2) {\n        ranges[i] = {\n          end: getUshort(data, p)\n        };\n      }\n\n      p += 2;\n\n      for (i = 0; i < segCount; i++, p += 2) {\n        ranges[i].start = getUshort(data, p);\n      }\n\n      for (i = 0; i < segCount; i++, p += 2) {\n        ranges[i].idDelta = getUshort(data, p);\n      }\n\n      for (i = 0; i < segCount; i++, p += 2) {\n        let idOffset = getUshort(data, p);\n\n        if (idOffset === 0) {\n          continue;\n        }\n\n        ranges[i].ids = [];\n\n        for (let j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) {\n          ranges[i].ids[j] = getUshort(data, p + idOffset);\n          idOffset += 2;\n        }\n      }\n\n      return ranges;\n    } else if (format === 12) {\n      getLong(data, start + offset + 4);\n      const groups = getLong(data, start + offset + 12);\n      p = start + offset + 16;\n      ranges = [];\n\n      for (i = 0; i < groups; i++) {\n        ranges.push({\n          start: getLong(data, p),\n          end: getLong(data, p + 4),\n          idDelta: getLong(data, p + 8) - getLong(data, p)\n        });\n        p += 12;\n      }\n\n      return ranges;\n    }\n\n    throw new _util.FormatError(`unsupported cmap: ${format}`);\n  }\n\n  function parseCff(data, start, end, seacAnalysisEnabled) {\n    const properties = {};\n    const parser = new _cff_parser.CFFParser(new _stream.Stream(data, start, end - start), properties, seacAnalysisEnabled);\n    const cff = parser.parse();\n    return {\n      glyphs: cff.charStrings.objects,\n      subrs: cff.topDict.privateDict && cff.topDict.privateDict.subrsIndex && cff.topDict.privateDict.subrsIndex.objects,\n      gsubrs: cff.globalSubrIndex && cff.globalSubrIndex.objects,\n      isCFFCIDFont: cff.isCIDFont,\n      fdSelect: cff.fdSelect,\n      fdArray: cff.fdArray\n    };\n  }\n\n  function parseGlyfTable(glyf, loca, isGlyphLocationsLong) {\n    let itemSize, itemDecode;\n\n    if (isGlyphLocationsLong) {\n      itemSize = 4;\n\n      itemDecode = function fontItemDecodeLong(data, offset) {\n        return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];\n      };\n    } else {\n      itemSize = 2;\n\n      itemDecode = function fontItemDecode(data, offset) {\n        return data[offset] << 9 | data[offset + 1] << 1;\n      };\n    }\n\n    const glyphs = [];\n    let startOffset = itemDecode(loca, 0);\n\n    for (let j = itemSize; j < loca.length; j += itemSize) {\n      const endOffset = itemDecode(loca, j);\n      glyphs.push(glyf.subarray(startOffset, endOffset));\n      startOffset = endOffset;\n    }\n\n    return glyphs;\n  }\n\n  function lookupCmap(ranges, unicode) {\n    const code = unicode.codePointAt(0);\n    let gid = 0,\n        l = 0,\n        r = ranges.length - 1;\n\n    while (l < r) {\n      const c = l + r + 1 >> 1;\n\n      if (code < ranges[c].start) {\n        r = c - 1;\n      } else {\n        l = c;\n      }\n    }\n\n    if (ranges[l].start <= code && code <= ranges[l].end) {\n      gid = ranges[l].idDelta + (ranges[l].ids ? ranges[l].ids[code - ranges[l].start] : code) & 0xffff;\n    }\n\n    return {\n      charCode: code,\n      glyphId: gid\n    };\n  }\n\n  function compileGlyf(code, cmds, font) {\n    function moveTo(x, y) {\n      cmds.push({\n        cmd: \"moveTo\",\n        args: [x, y]\n      });\n    }\n\n    function lineTo(x, y) {\n      cmds.push({\n        cmd: \"lineTo\",\n        args: [x, y]\n      });\n    }\n\n    function quadraticCurveTo(xa, ya, x, y) {\n      cmds.push({\n        cmd: \"quadraticCurveTo\",\n        args: [xa, ya, x, y]\n      });\n    }\n\n    let i = 0;\n    const numberOfContours = (code[i] << 24 | code[i + 1] << 16) >> 16;\n    let flags;\n    let x = 0,\n        y = 0;\n    i += 10;\n\n    if (numberOfContours < 0) {\n      do {\n        flags = code[i] << 8 | code[i + 1];\n        const glyphIndex = code[i + 2] << 8 | code[i + 3];\n        i += 4;\n        let arg1, arg2;\n\n        if (flags & 0x01) {\n          arg1 = (code[i] << 24 | code[i + 1] << 16) >> 16;\n          arg2 = (code[i + 2] << 24 | code[i + 3] << 16) >> 16;\n          i += 4;\n        } else {\n          arg1 = code[i++];\n          arg2 = code[i++];\n        }\n\n        if (flags & 0x02) {\n          x = arg1;\n          y = arg2;\n        } else {\n          x = 0;\n          y = 0;\n        }\n\n        let scaleX = 1,\n            scaleY = 1,\n            scale01 = 0,\n            scale10 = 0;\n\n        if (flags & 0x08) {\n          scaleX = scaleY = (code[i] << 24 | code[i + 1] << 16) / 1073741824;\n          i += 2;\n        } else if (flags & 0x40) {\n          scaleX = (code[i] << 24 | code[i + 1] << 16) / 1073741824;\n          scaleY = (code[i + 2] << 24 | code[i + 3] << 16) / 1073741824;\n          i += 4;\n        } else if (flags & 0x80) {\n          scaleX = (code[i] << 24 | code[i + 1] << 16) / 1073741824;\n          scale01 = (code[i + 2] << 24 | code[i + 3] << 16) / 1073741824;\n          scale10 = (code[i + 4] << 24 | code[i + 5] << 16) / 1073741824;\n          scaleY = (code[i + 6] << 24 | code[i + 7] << 16) / 1073741824;\n          i += 8;\n        }\n\n        const subglyph = font.glyphs[glyphIndex];\n\n        if (subglyph) {\n          cmds.push({\n            cmd: \"save\"\n          });\n          cmds.push({\n            cmd: \"transform\",\n            args: [scaleX, scale01, scale10, scaleY, x, y]\n          });\n          compileGlyf(subglyph, cmds, font);\n          cmds.push({\n            cmd: \"restore\"\n          });\n        }\n      } while (flags & 0x20);\n    } else {\n      const endPtsOfContours = [];\n      let j, jj;\n\n      for (j = 0; j < numberOfContours; j++) {\n        endPtsOfContours.push(code[i] << 8 | code[i + 1]);\n        i += 2;\n      }\n\n      const instructionLength = code[i] << 8 | code[i + 1];\n      i += 2 + instructionLength;\n      const numberOfPoints = endPtsOfContours[endPtsOfContours.length - 1] + 1;\n      const points = [];\n\n      while (points.length < numberOfPoints) {\n        flags = code[i++];\n        let repeat = 1;\n\n        if (flags & 0x08) {\n          repeat += code[i++];\n        }\n\n        while (repeat-- > 0) {\n          points.push({\n            flags\n          });\n        }\n      }\n\n      for (j = 0; j < numberOfPoints; j++) {\n        switch (points[j].flags & 0x12) {\n          case 0x00:\n            x += (code[i] << 24 | code[i + 1] << 16) >> 16;\n            i += 2;\n            break;\n\n          case 0x02:\n            x -= code[i++];\n            break;\n\n          case 0x12:\n            x += code[i++];\n            break;\n        }\n\n        points[j].x = x;\n      }\n\n      for (j = 0; j < numberOfPoints; j++) {\n        switch (points[j].flags & 0x24) {\n          case 0x00:\n            y += (code[i] << 24 | code[i + 1] << 16) >> 16;\n            i += 2;\n            break;\n\n          case 0x04:\n            y -= code[i++];\n            break;\n\n          case 0x24:\n            y += code[i++];\n            break;\n        }\n\n        points[j].y = y;\n      }\n\n      let startPoint = 0;\n\n      for (i = 0; i < numberOfContours; i++) {\n        const endPoint = endPtsOfContours[i];\n        const contour = points.slice(startPoint, endPoint + 1);\n\n        if (contour[0].flags & 1) {\n          contour.push(contour[0]);\n        } else if (contour[contour.length - 1].flags & 1) {\n          contour.unshift(contour[contour.length - 1]);\n        } else {\n          const p = {\n            flags: 1,\n            x: (contour[0].x + contour[contour.length - 1].x) / 2,\n            y: (contour[0].y + contour[contour.length - 1].y) / 2\n          };\n          contour.unshift(p);\n          contour.push(p);\n        }\n\n        moveTo(contour[0].x, contour[0].y);\n\n        for (j = 1, jj = contour.length; j < jj; j++) {\n          if (contour[j].flags & 1) {\n            lineTo(contour[j].x, contour[j].y);\n          } else if (contour[j + 1].flags & 1) {\n            quadraticCurveTo(contour[j].x, contour[j].y, contour[j + 1].x, contour[j + 1].y);\n            j++;\n          } else {\n            quadraticCurveTo(contour[j].x, contour[j].y, (contour[j].x + contour[j + 1].x) / 2, (contour[j].y + contour[j + 1].y) / 2);\n          }\n        }\n\n        startPoint = endPoint + 1;\n      }\n    }\n  }\n\n  function compileCharString(charStringCode, cmds, font, glyphId) {\n    function moveTo(x, y) {\n      cmds.push({\n        cmd: \"moveTo\",\n        args: [x, y]\n      });\n    }\n\n    function lineTo(x, y) {\n      cmds.push({\n        cmd: \"lineTo\",\n        args: [x, y]\n      });\n    }\n\n    function bezierCurveTo(x1, y1, x2, y2, x, y) {\n      cmds.push({\n        cmd: \"bezierCurveTo\",\n        args: [x1, y1, x2, y2, x, y]\n      });\n    }\n\n    const stack = [];\n    let x = 0,\n        y = 0;\n    let stems = 0;\n\n    function parse(code) {\n      let i = 0;\n\n      while (i < code.length) {\n        let stackClean = false;\n        let v = code[i++];\n        let xa, xb, ya, yb, y1, y2, y3, n, subrCode;\n\n        switch (v) {\n          case 1:\n            stems += stack.length >> 1;\n            stackClean = true;\n            break;\n\n          case 3:\n            stems += stack.length >> 1;\n            stackClean = true;\n            break;\n\n          case 4:\n            y += stack.pop();\n            moveTo(x, y);\n            stackClean = true;\n            break;\n\n          case 5:\n            while (stack.length > 0) {\n              x += stack.shift();\n              y += stack.shift();\n              lineTo(x, y);\n            }\n\n            break;\n\n          case 6:\n            while (stack.length > 0) {\n              x += stack.shift();\n              lineTo(x, y);\n\n              if (stack.length === 0) {\n                break;\n              }\n\n              y += stack.shift();\n              lineTo(x, y);\n            }\n\n            break;\n\n          case 7:\n            while (stack.length > 0) {\n              y += stack.shift();\n              lineTo(x, y);\n\n              if (stack.length === 0) {\n                break;\n              }\n\n              x += stack.shift();\n              lineTo(x, y);\n            }\n\n            break;\n\n          case 8:\n            while (stack.length > 0) {\n              xa = x + stack.shift();\n              ya = y + stack.shift();\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb + stack.shift();\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n\n            break;\n\n          case 10:\n            n = stack.pop();\n            subrCode = null;\n\n            if (font.isCFFCIDFont) {\n              const fdIndex = font.fdSelect.getFDIndex(glyphId);\n\n              if (fdIndex >= 0 && fdIndex < font.fdArray.length) {\n                const fontDict = font.fdArray[fdIndex];\n                let subrs;\n\n                if (fontDict.privateDict && fontDict.privateDict.subrsIndex) {\n                  subrs = fontDict.privateDict.subrsIndex.objects;\n                }\n\n                if (subrs) {\n                  n += getSubroutineBias(subrs);\n                  subrCode = subrs[n];\n                }\n              } else {\n                (0, _util.warn)(\"Invalid fd index for glyph index.\");\n              }\n            } else {\n              subrCode = font.subrs[n + font.subrsBias];\n            }\n\n            if (subrCode) {\n              parse(subrCode);\n            }\n\n            break;\n\n          case 11:\n            return;\n\n          case 12:\n            v = code[i++];\n\n            switch (v) {\n              case 34:\n                xa = x + stack.shift();\n                xb = xa + stack.shift();\n                y1 = y + stack.shift();\n                x = xb + stack.shift();\n                bezierCurveTo(xa, y, xb, y1, x, y1);\n                xa = x + stack.shift();\n                xb = xa + stack.shift();\n                x = xb + stack.shift();\n                bezierCurveTo(xa, y1, xb, y, x, y);\n                break;\n\n              case 35:\n                xa = x + stack.shift();\n                ya = y + stack.shift();\n                xb = xa + stack.shift();\n                yb = ya + stack.shift();\n                x = xb + stack.shift();\n                y = yb + stack.shift();\n                bezierCurveTo(xa, ya, xb, yb, x, y);\n                xa = x + stack.shift();\n                ya = y + stack.shift();\n                xb = xa + stack.shift();\n                yb = ya + stack.shift();\n                x = xb + stack.shift();\n                y = yb + stack.shift();\n                bezierCurveTo(xa, ya, xb, yb, x, y);\n                stack.pop();\n                break;\n\n              case 36:\n                xa = x + stack.shift();\n                y1 = y + stack.shift();\n                xb = xa + stack.shift();\n                y2 = y1 + stack.shift();\n                x = xb + stack.shift();\n                bezierCurveTo(xa, y1, xb, y2, x, y2);\n                xa = x + stack.shift();\n                xb = xa + stack.shift();\n                y3 = y2 + stack.shift();\n                x = xb + stack.shift();\n                bezierCurveTo(xa, y2, xb, y3, x, y);\n                break;\n\n              case 37:\n                const x0 = x,\n                      y0 = y;\n                xa = x + stack.shift();\n                ya = y + stack.shift();\n                xb = xa + stack.shift();\n                yb = ya + stack.shift();\n                x = xb + stack.shift();\n                y = yb + stack.shift();\n                bezierCurveTo(xa, ya, xb, yb, x, y);\n                xa = x + stack.shift();\n                ya = y + stack.shift();\n                xb = xa + stack.shift();\n                yb = ya + stack.shift();\n                x = xb;\n                y = yb;\n\n                if (Math.abs(x - x0) > Math.abs(y - y0)) {\n                  x += stack.shift();\n                } else {\n                  y += stack.shift();\n                }\n\n                bezierCurveTo(xa, ya, xb, yb, x, y);\n                break;\n\n              default:\n                throw new _util.FormatError(`unknown operator: 12 ${v}`);\n            }\n\n            break;\n\n          case 14:\n            if (stack.length >= 4) {\n              const achar = stack.pop();\n              const bchar = stack.pop();\n              y = stack.pop();\n              x = stack.pop();\n              cmds.push({\n                cmd: \"save\"\n              });\n              cmds.push({\n                cmd: \"translate\",\n                args: [x, y]\n              });\n              let cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[_encodings.StandardEncoding[achar]]));\n              compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId);\n              cmds.push({\n                cmd: \"restore\"\n              });\n              cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[_encodings.StandardEncoding[bchar]]));\n              compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId);\n            }\n\n            return;\n\n          case 18:\n            stems += stack.length >> 1;\n            stackClean = true;\n            break;\n\n          case 19:\n            stems += stack.length >> 1;\n            i += stems + 7 >> 3;\n            stackClean = true;\n            break;\n\n          case 20:\n            stems += stack.length >> 1;\n            i += stems + 7 >> 3;\n            stackClean = true;\n            break;\n\n          case 21:\n            y += stack.pop();\n            x += stack.pop();\n            moveTo(x, y);\n            stackClean = true;\n            break;\n\n          case 22:\n            x += stack.pop();\n            moveTo(x, y);\n            stackClean = true;\n            break;\n\n          case 23:\n            stems += stack.length >> 1;\n            stackClean = true;\n            break;\n\n          case 24:\n            while (stack.length > 2) {\n              xa = x + stack.shift();\n              ya = y + stack.shift();\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb + stack.shift();\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n\n            x += stack.shift();\n            y += stack.shift();\n            lineTo(x, y);\n            break;\n\n          case 25:\n            while (stack.length > 6) {\n              x += stack.shift();\n              y += stack.shift();\n              lineTo(x, y);\n            }\n\n            xa = x + stack.shift();\n            ya = y + stack.shift();\n            xb = xa + stack.shift();\n            yb = ya + stack.shift();\n            x = xb + stack.shift();\n            y = yb + stack.shift();\n            bezierCurveTo(xa, ya, xb, yb, x, y);\n            break;\n\n          case 26:\n            if (stack.length % 2) {\n              x += stack.shift();\n            }\n\n            while (stack.length > 0) {\n              xa = x;\n              ya = y + stack.shift();\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb;\n              y = yb + stack.shift();\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n\n            break;\n\n          case 27:\n            if (stack.length % 2) {\n              y += stack.shift();\n            }\n\n            while (stack.length > 0) {\n              xa = x + stack.shift();\n              ya = y;\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb;\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n\n            break;\n\n          case 28:\n            stack.push((code[i] << 24 | code[i + 1] << 16) >> 16);\n            i += 2;\n            break;\n\n          case 29:\n            n = stack.pop() + font.gsubrsBias;\n            subrCode = font.gsubrs[n];\n\n            if (subrCode) {\n              parse(subrCode);\n            }\n\n            break;\n\n          case 30:\n            while (stack.length > 0) {\n              xa = x;\n              ya = y + stack.shift();\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb + (stack.length === 1 ? stack.shift() : 0);\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n\n              if (stack.length === 0) {\n                break;\n              }\n\n              xa = x + stack.shift();\n              ya = y;\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              y = yb + stack.shift();\n              x = xb + (stack.length === 1 ? stack.shift() : 0);\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n\n            break;\n\n          case 31:\n            while (stack.length > 0) {\n              xa = x + stack.shift();\n              ya = y;\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              y = yb + stack.shift();\n              x = xb + (stack.length === 1 ? stack.shift() : 0);\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n\n              if (stack.length === 0) {\n                break;\n              }\n\n              xa = x;\n              ya = y + stack.shift();\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb + (stack.length === 1 ? stack.shift() : 0);\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n\n            break;\n\n          default:\n            if (v < 32) {\n              throw new _util.FormatError(`unknown operator: ${v}`);\n            }\n\n            if (v < 247) {\n              stack.push(v - 139);\n            } else if (v < 251) {\n              stack.push((v - 247) * 256 + code[i++] + 108);\n            } else if (v < 255) {\n              stack.push(-(v - 251) * 256 - code[i++] - 108);\n            } else {\n              stack.push((code[i] << 24 | code[i + 1] << 16 | code[i + 2] << 8 | code[i + 3]) / 65536);\n              i += 4;\n            }\n\n            break;\n        }\n\n        if (stackClean) {\n          stack.length = 0;\n        }\n      }\n    }\n\n    parse(charStringCode);\n  }\n\n  const NOOP = [];\n\n  class CompiledFont {\n    constructor(fontMatrix) {\n      if (this.constructor === CompiledFont) {\n        (0, _util.unreachable)(\"Cannot initialize CompiledFont.\");\n      }\n\n      this.fontMatrix = fontMatrix;\n      this.compiledGlyphs = Object.create(null);\n      this.compiledCharCodeToGlyphId = Object.create(null);\n    }\n\n    getPathJs(unicode) {\n      const cmap = lookupCmap(this.cmap, unicode);\n      let fn = this.compiledGlyphs[cmap.glyphId];\n\n      if (!fn) {\n        fn = this.compileGlyph(this.glyphs[cmap.glyphId], cmap.glyphId);\n        this.compiledGlyphs[cmap.glyphId] = fn;\n      }\n\n      if (this.compiledCharCodeToGlyphId[cmap.charCode] === undefined) {\n        this.compiledCharCodeToGlyphId[cmap.charCode] = cmap.glyphId;\n      }\n\n      return fn;\n    }\n\n    compileGlyph(code, glyphId) {\n      if (!code || code.length === 0 || code[0] === 14) {\n        return NOOP;\n      }\n\n      let fontMatrix = this.fontMatrix;\n\n      if (this.isCFFCIDFont) {\n        const fdIndex = this.fdSelect.getFDIndex(glyphId);\n\n        if (fdIndex >= 0 && fdIndex < this.fdArray.length) {\n          const fontDict = this.fdArray[fdIndex];\n          fontMatrix = fontDict.getByName(\"FontMatrix\") || _util.FONT_IDENTITY_MATRIX;\n        } else {\n          (0, _util.warn)(\"Invalid fd index for glyph index.\");\n        }\n      }\n\n      const cmds = [];\n      cmds.push({\n        cmd: \"save\"\n      });\n      cmds.push({\n        cmd: \"transform\",\n        args: fontMatrix.slice()\n      });\n      cmds.push({\n        cmd: \"scale\",\n        args: [\"size\", \"-size\"]\n      });\n      this.compileGlyphImpl(code, cmds, glyphId);\n      cmds.push({\n        cmd: \"restore\"\n      });\n      return cmds;\n    }\n\n    compileGlyphImpl() {\n      (0, _util.unreachable)(\"Children classes should implement this.\");\n    }\n\n    hasBuiltPath(unicode) {\n      const cmap = lookupCmap(this.cmap, unicode);\n      return this.compiledGlyphs[cmap.glyphId] !== undefined && this.compiledCharCodeToGlyphId[cmap.charCode] !== undefined;\n    }\n\n  }\n\n  class TrueTypeCompiled extends CompiledFont {\n    constructor(glyphs, cmap, fontMatrix) {\n      super(fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]);\n      this.glyphs = glyphs;\n      this.cmap = cmap;\n    }\n\n    compileGlyphImpl(code, cmds) {\n      compileGlyf(code, cmds, this);\n    }\n\n  }\n\n  class Type2Compiled extends CompiledFont {\n    constructor(cffInfo, cmap, fontMatrix, glyphNameMap) {\n      super(fontMatrix || [0.001, 0, 0, 0.001, 0, 0]);\n      this.glyphs = cffInfo.glyphs;\n      this.gsubrs = cffInfo.gsubrs || [];\n      this.subrs = cffInfo.subrs || [];\n      this.cmap = cmap;\n      this.glyphNameMap = glyphNameMap || (0, _glyphlist.getGlyphsUnicode)();\n      this.gsubrsBias = getSubroutineBias(this.gsubrs);\n      this.subrsBias = getSubroutineBias(this.subrs);\n      this.isCFFCIDFont = cffInfo.isCFFCIDFont;\n      this.fdSelect = cffInfo.fdSelect;\n      this.fdArray = cffInfo.fdArray;\n    }\n\n    compileGlyphImpl(code, cmds, glyphId) {\n      compileCharString(code, cmds, this, glyphId);\n    }\n\n  }\n\n  return {\n    create: function FontRendererFactory_create(font, seacAnalysisEnabled) {\n      const data = new Uint8Array(font.data);\n      let cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm;\n      const numTables = getUshort(data, 4);\n\n      for (let i = 0, p = 12; i < numTables; i++, p += 16) {\n        const tag = (0, _util.bytesToString)(data.subarray(p, p + 4));\n        const offset = getLong(data, p + 8);\n        const length = getLong(data, p + 12);\n\n        switch (tag) {\n          case \"cmap\":\n            cmap = parseCmap(data, offset, offset + length);\n            break;\n\n          case \"glyf\":\n            glyf = data.subarray(offset, offset + length);\n            break;\n\n          case \"loca\":\n            loca = data.subarray(offset, offset + length);\n            break;\n\n          case \"head\":\n            unitsPerEm = getUshort(data, offset + 18);\n            indexToLocFormat = getUshort(data, offset + 50);\n            break;\n\n          case \"CFF \":\n            cff = parseCff(data, offset, offset + length, seacAnalysisEnabled);\n            break;\n        }\n      }\n\n      if (glyf) {\n        const fontMatrix = !unitsPerEm ? font.fontMatrix : [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0];\n        return new TrueTypeCompiled(parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix);\n      }\n\n      return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap);\n    }\n  };\n}();\n\nexports.FontRendererFactory = FontRendererFactory;\n\n/***/ }),\n/* 39 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.Type1Parser = void 0;\n\nvar _encodings = __w_pdfjs_require__(34);\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nvar _stream = __w_pdfjs_require__(12);\n\nvar _util = __w_pdfjs_require__(2);\n\nconst HINTING_ENABLED = false;\n\nconst Type1CharString = function Type1CharStringClosure() {\n  const COMMAND_MAP = {\n    hstem: [1],\n    vstem: [3],\n    vmoveto: [4],\n    rlineto: [5],\n    hlineto: [6],\n    vlineto: [7],\n    rrcurveto: [8],\n    callsubr: [10],\n    flex: [12, 35],\n    drop: [12, 18],\n    endchar: [14],\n    rmoveto: [21],\n    hmoveto: [22],\n    vhcurveto: [30],\n    hvcurveto: [31]\n  };\n\n  class Type1CharString {\n    constructor() {\n      this.width = 0;\n      this.lsb = 0;\n      this.flexing = false;\n      this.output = [];\n      this.stack = [];\n    }\n\n    convert(encoded, subrs, seacAnalysisEnabled) {\n      const count = encoded.length;\n      let error = false;\n      let wx, sbx, subrNumber;\n\n      for (let i = 0; i < count; i++) {\n        let value = encoded[i];\n\n        if (value < 32) {\n          if (value === 12) {\n            value = (value << 8) + encoded[++i];\n          }\n\n          switch (value) {\n            case 1:\n              if (!HINTING_ENABLED) {\n                this.stack = [];\n                break;\n              }\n\n              error = this.executeCommand(2, COMMAND_MAP.hstem);\n              break;\n\n            case 3:\n              if (!HINTING_ENABLED) {\n                this.stack = [];\n                break;\n              }\n\n              error = this.executeCommand(2, COMMAND_MAP.vstem);\n              break;\n\n            case 4:\n              if (this.flexing) {\n                if (this.stack.length < 1) {\n                  error = true;\n                  break;\n                }\n\n                const dy = this.stack.pop();\n                this.stack.push(0, dy);\n                break;\n              }\n\n              error = this.executeCommand(1, COMMAND_MAP.vmoveto);\n              break;\n\n            case 5:\n              error = this.executeCommand(2, COMMAND_MAP.rlineto);\n              break;\n\n            case 6:\n              error = this.executeCommand(1, COMMAND_MAP.hlineto);\n              break;\n\n            case 7:\n              error = this.executeCommand(1, COMMAND_MAP.vlineto);\n              break;\n\n            case 8:\n              error = this.executeCommand(6, COMMAND_MAP.rrcurveto);\n              break;\n\n            case 9:\n              this.stack = [];\n              break;\n\n            case 10:\n              if (this.stack.length < 1) {\n                error = true;\n                break;\n              }\n\n              subrNumber = this.stack.pop();\n\n              if (!subrs[subrNumber]) {\n                error = true;\n                break;\n              }\n\n              error = this.convert(subrs[subrNumber], subrs, seacAnalysisEnabled);\n              break;\n\n            case 11:\n              return error;\n\n            case 13:\n              if (this.stack.length < 2) {\n                error = true;\n                break;\n              }\n\n              wx = this.stack.pop();\n              sbx = this.stack.pop();\n              this.lsb = sbx;\n              this.width = wx;\n              this.stack.push(wx, sbx);\n              error = this.executeCommand(2, COMMAND_MAP.hmoveto);\n              break;\n\n            case 14:\n              this.output.push(COMMAND_MAP.endchar[0]);\n              break;\n\n            case 21:\n              if (this.flexing) {\n                break;\n              }\n\n              error = this.executeCommand(2, COMMAND_MAP.rmoveto);\n              break;\n\n            case 22:\n              if (this.flexing) {\n                this.stack.push(0);\n                break;\n              }\n\n              error = this.executeCommand(1, COMMAND_MAP.hmoveto);\n              break;\n\n            case 30:\n              error = this.executeCommand(4, COMMAND_MAP.vhcurveto);\n              break;\n\n            case 31:\n              error = this.executeCommand(4, COMMAND_MAP.hvcurveto);\n              break;\n\n            case (12 << 8) + 0:\n              this.stack = [];\n              break;\n\n            case (12 << 8) + 1:\n              if (!HINTING_ENABLED) {\n                this.stack = [];\n                break;\n              }\n\n              error = this.executeCommand(2, COMMAND_MAP.vstem);\n              break;\n\n            case (12 << 8) + 2:\n              if (!HINTING_ENABLED) {\n                this.stack = [];\n                break;\n              }\n\n              error = this.executeCommand(2, COMMAND_MAP.hstem);\n              break;\n\n            case (12 << 8) + 6:\n              if (seacAnalysisEnabled) {\n                const asb = this.stack[this.stack.length - 5];\n                this.seac = this.stack.splice(-4, 4);\n                this.seac[0] += this.lsb - asb;\n                error = this.executeCommand(0, COMMAND_MAP.endchar);\n              } else {\n                error = this.executeCommand(4, COMMAND_MAP.endchar);\n              }\n\n              break;\n\n            case (12 << 8) + 7:\n              if (this.stack.length < 4) {\n                error = true;\n                break;\n              }\n\n              this.stack.pop();\n              wx = this.stack.pop();\n              const sby = this.stack.pop();\n              sbx = this.stack.pop();\n              this.lsb = sbx;\n              this.width = wx;\n              this.stack.push(wx, sbx, sby);\n              error = this.executeCommand(3, COMMAND_MAP.rmoveto);\n              break;\n\n            case (12 << 8) + 12:\n              if (this.stack.length < 2) {\n                error = true;\n                break;\n              }\n\n              const num2 = this.stack.pop();\n              const num1 = this.stack.pop();\n              this.stack.push(num1 / num2);\n              break;\n\n            case (12 << 8) + 16:\n              if (this.stack.length < 2) {\n                error = true;\n                break;\n              }\n\n              subrNumber = this.stack.pop();\n              const numArgs = this.stack.pop();\n\n              if (subrNumber === 0 && numArgs === 3) {\n                const flexArgs = this.stack.splice(this.stack.length - 17, 17);\n                this.stack.push(flexArgs[2] + flexArgs[0], flexArgs[3] + flexArgs[1], flexArgs[4], flexArgs[5], flexArgs[6], flexArgs[7], flexArgs[8], flexArgs[9], flexArgs[10], flexArgs[11], flexArgs[12], flexArgs[13], flexArgs[14]);\n                error = this.executeCommand(13, COMMAND_MAP.flex, true);\n                this.flexing = false;\n                this.stack.push(flexArgs[15], flexArgs[16]);\n              } else if (subrNumber === 1 && numArgs === 0) {\n                this.flexing = true;\n              }\n\n              break;\n\n            case (12 << 8) + 17:\n              break;\n\n            case (12 << 8) + 33:\n              this.stack = [];\n              break;\n\n            default:\n              (0, _util.warn)('Unknown type 1 charstring command of \"' + value + '\"');\n              break;\n          }\n\n          if (error) {\n            break;\n          }\n\n          continue;\n        } else if (value <= 246) {\n          value = value - 139;\n        } else if (value <= 250) {\n          value = (value - 247) * 256 + encoded[++i] + 108;\n        } else if (value <= 254) {\n          value = -((value - 251) * 256) - encoded[++i] - 108;\n        } else {\n          value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 | (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0;\n        }\n\n        this.stack.push(value);\n      }\n\n      return error;\n    }\n\n    executeCommand(howManyArgs, command, keepStack) {\n      const stackLength = this.stack.length;\n\n      if (howManyArgs > stackLength) {\n        return true;\n      }\n\n      const start = stackLength - howManyArgs;\n\n      for (let i = start; i < stackLength; i++) {\n        let value = this.stack[i];\n\n        if (Number.isInteger(value)) {\n          this.output.push(28, value >> 8 & 0xff, value & 0xff);\n        } else {\n          value = 65536 * value | 0;\n          this.output.push(255, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff);\n        }\n      }\n\n      this.output.push.apply(this.output, command);\n\n      if (keepStack) {\n        this.stack.splice(start, howManyArgs);\n      } else {\n        this.stack.length = 0;\n      }\n\n      return false;\n    }\n\n  }\n\n  return Type1CharString;\n}();\n\nconst Type1Parser = function Type1ParserClosure() {\n  const EEXEC_ENCRYPT_KEY = 55665;\n  const CHAR_STRS_ENCRYPT_KEY = 4330;\n\n  function isHexDigit(code) {\n    return code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102;\n  }\n\n  function decrypt(data, key, discardNumber) {\n    if (discardNumber >= data.length) {\n      return new Uint8Array(0);\n    }\n\n    const c1 = 52845,\n          c2 = 22719;\n    let r = key | 0,\n        i,\n        j;\n\n    for (i = 0; i < discardNumber; i++) {\n      r = (data[i] + r) * c1 + c2 & (1 << 16) - 1;\n    }\n\n    const count = data.length - discardNumber;\n    const decrypted = new Uint8Array(count);\n\n    for (i = discardNumber, j = 0; j < count; i++, j++) {\n      const value = data[i];\n      decrypted[j] = value ^ r >> 8;\n      r = (value + r) * c1 + c2 & (1 << 16) - 1;\n    }\n\n    return decrypted;\n  }\n\n  function decryptAscii(data, key, discardNumber) {\n    const c1 = 52845,\n          c2 = 22719;\n    let r = key | 0;\n    const count = data.length,\n          maybeLength = count >>> 1;\n    const decrypted = new Uint8Array(maybeLength);\n    let i, j;\n\n    for (i = 0, j = 0; i < count; i++) {\n      const digit1 = data[i];\n\n      if (!isHexDigit(digit1)) {\n        continue;\n      }\n\n      i++;\n      let digit2;\n\n      while (i < count && !isHexDigit(digit2 = data[i])) {\n        i++;\n      }\n\n      if (i < count) {\n        const value = parseInt(String.fromCharCode(digit1, digit2), 16);\n        decrypted[j++] = value ^ r >> 8;\n        r = (value + r) * c1 + c2 & (1 << 16) - 1;\n      }\n    }\n\n    return decrypted.slice(discardNumber, j);\n  }\n\n  function isSpecial(c) {\n    return c === 0x2f || c === 0x5b || c === 0x5d || c === 0x7b || c === 0x7d || c === 0x28 || c === 0x29;\n  }\n\n  class Type1Parser {\n    constructor(stream, encrypted, seacAnalysisEnabled) {\n      if (encrypted) {\n        const data = stream.getBytes();\n        const isBinary = !((isHexDigit(data[0]) || (0, _core_utils.isWhiteSpace)(data[0])) && isHexDigit(data[1]) && isHexDigit(data[2]) && isHexDigit(data[3]) && isHexDigit(data[4]) && isHexDigit(data[5]) && isHexDigit(data[6]) && isHexDigit(data[7]));\n        stream = new _stream.Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : decryptAscii(data, EEXEC_ENCRYPT_KEY, 4));\n      }\n\n      this.seacAnalysisEnabled = !!seacAnalysisEnabled;\n      this.stream = stream;\n      this.nextChar();\n    }\n\n    readNumberArray() {\n      this.getToken();\n      const array = [];\n\n      while (true) {\n        const token = this.getToken();\n\n        if (token === null || token === \"]\" || token === \"}\") {\n          break;\n        }\n\n        array.push(parseFloat(token || 0));\n      }\n\n      return array;\n    }\n\n    readNumber() {\n      const token = this.getToken();\n      return parseFloat(token || 0);\n    }\n\n    readInt() {\n      const token = this.getToken();\n      return parseInt(token || 0, 10) | 0;\n    }\n\n    readBoolean() {\n      const token = this.getToken();\n      return token === \"true\" ? 1 : 0;\n    }\n\n    nextChar() {\n      return this.currentChar = this.stream.getByte();\n    }\n\n    getToken() {\n      let comment = false;\n      let ch = this.currentChar;\n\n      while (true) {\n        if (ch === -1) {\n          return null;\n        }\n\n        if (comment) {\n          if (ch === 0x0a || ch === 0x0d) {\n            comment = false;\n          }\n        } else if (ch === 0x25) {\n          comment = true;\n        } else if (!(0, _core_utils.isWhiteSpace)(ch)) {\n          break;\n        }\n\n        ch = this.nextChar();\n      }\n\n      if (isSpecial(ch)) {\n        this.nextChar();\n        return String.fromCharCode(ch);\n      }\n\n      let token = \"\";\n\n      do {\n        token += String.fromCharCode(ch);\n        ch = this.nextChar();\n      } while (ch >= 0 && !(0, _core_utils.isWhiteSpace)(ch) && !isSpecial(ch));\n\n      return token;\n    }\n\n    readCharStrings(bytes, lenIV) {\n      if (lenIV === -1) {\n        return bytes;\n      }\n\n      return decrypt(bytes, CHAR_STRS_ENCRYPT_KEY, lenIV);\n    }\n\n    extractFontProgram(properties) {\n      const stream = this.stream;\n      const subrs = [],\n            charstrings = [];\n      const privateData = Object.create(null);\n      privateData.lenIV = 4;\n      const program = {\n        subrs: [],\n        charstrings: [],\n        properties: {\n          privateData\n        }\n      };\n      let token, length, data, lenIV, encoded;\n\n      while ((token = this.getToken()) !== null) {\n        if (token !== \"/\") {\n          continue;\n        }\n\n        token = this.getToken();\n\n        switch (token) {\n          case \"CharStrings\":\n            this.getToken();\n            this.getToken();\n            this.getToken();\n            this.getToken();\n\n            while (true) {\n              token = this.getToken();\n\n              if (token === null || token === \"end\") {\n                break;\n              }\n\n              if (token !== \"/\") {\n                continue;\n              }\n\n              const glyph = this.getToken();\n              length = this.readInt();\n              this.getToken();\n              data = length > 0 ? stream.getBytes(length) : new Uint8Array(0);\n              lenIV = program.properties.privateData.lenIV;\n              encoded = this.readCharStrings(data, lenIV);\n              this.nextChar();\n              token = this.getToken();\n\n              if (token === \"noaccess\") {\n                this.getToken();\n              }\n\n              charstrings.push({\n                glyph,\n                encoded\n              });\n            }\n\n            break;\n\n          case \"Subrs\":\n            this.readInt();\n            this.getToken();\n\n            while (this.getToken() === \"dup\") {\n              const index = this.readInt();\n              length = this.readInt();\n              this.getToken();\n              data = length > 0 ? stream.getBytes(length) : new Uint8Array(0);\n              lenIV = program.properties.privateData.lenIV;\n              encoded = this.readCharStrings(data, lenIV);\n              this.nextChar();\n              token = this.getToken();\n\n              if (token === \"noaccess\") {\n                this.getToken();\n              }\n\n              subrs[index] = encoded;\n            }\n\n            break;\n\n          case \"BlueValues\":\n          case \"OtherBlues\":\n          case \"FamilyBlues\":\n          case \"FamilyOtherBlues\":\n            const blueArray = this.readNumberArray();\n\n            if (blueArray.length > 0 && blueArray.length % 2 === 0 && HINTING_ENABLED) {\n              program.properties.privateData[token] = blueArray;\n            }\n\n            break;\n\n          case \"StemSnapH\":\n          case \"StemSnapV\":\n            program.properties.privateData[token] = this.readNumberArray();\n            break;\n\n          case \"StdHW\":\n          case \"StdVW\":\n            program.properties.privateData[token] = this.readNumberArray()[0];\n            break;\n\n          case \"BlueShift\":\n          case \"lenIV\":\n          case \"BlueFuzz\":\n          case \"BlueScale\":\n          case \"LanguageGroup\":\n          case \"ExpansionFactor\":\n            program.properties.privateData[token] = this.readNumber();\n            break;\n\n          case \"ForceBold\":\n            program.properties.privateData[token] = this.readBoolean();\n            break;\n        }\n      }\n\n      for (let i = 0; i < charstrings.length; i++) {\n        const glyph = charstrings[i].glyph;\n        encoded = charstrings[i].encoded;\n        const charString = new Type1CharString();\n        const error = charString.convert(encoded, subrs, this.seacAnalysisEnabled);\n        let output = charString.output;\n\n        if (error) {\n          output = [14];\n        }\n\n        const charStringObject = {\n          glyphName: glyph,\n          charstring: output,\n          width: charString.width,\n          lsb: charString.lsb,\n          seac: charString.seac\n        };\n\n        if (glyph === \".notdef\") {\n          program.charstrings.unshift(charStringObject);\n        } else {\n          program.charstrings.push(charStringObject);\n        }\n\n        if (properties.builtInEncoding) {\n          const index = properties.builtInEncoding.indexOf(glyph);\n\n          if (index > -1 && properties.widths[index] === undefined && index >= properties.firstChar && index <= properties.lastChar) {\n            properties.widths[index] = charString.width;\n          }\n        }\n      }\n\n      return program;\n    }\n\n    extractFontHeader(properties) {\n      let token;\n\n      while ((token = this.getToken()) !== null) {\n        if (token !== \"/\") {\n          continue;\n        }\n\n        token = this.getToken();\n\n        switch (token) {\n          case \"FontMatrix\":\n            const matrix = this.readNumberArray();\n            properties.fontMatrix = matrix;\n            break;\n\n          case \"Encoding\":\n            const encodingArg = this.getToken();\n            let encoding;\n\n            if (!/^\\d+$/.test(encodingArg)) {\n              encoding = (0, _encodings.getEncoding)(encodingArg);\n            } else {\n              encoding = [];\n              const size = parseInt(encodingArg, 10) | 0;\n              this.getToken();\n\n              for (let j = 0; j < size; j++) {\n                token = this.getToken();\n\n                while (token !== \"dup\" && token !== \"def\") {\n                  token = this.getToken();\n\n                  if (token === null) {\n                    return;\n                  }\n                }\n\n                if (token === \"def\") {\n                  break;\n                }\n\n                const index = this.readInt();\n                this.getToken();\n                const glyph = this.getToken();\n                encoding[index] = glyph;\n                this.getToken();\n              }\n            }\n\n            properties.builtInEncoding = encoding;\n            break;\n\n          case \"FontBBox\":\n            const fontBBox = this.readNumberArray();\n            properties.ascent = Math.max(fontBBox[3], fontBBox[1]);\n            properties.descent = Math.min(fontBBox[1], fontBBox[3]);\n            properties.ascentScaled = true;\n            break;\n        }\n      }\n    }\n\n  }\n\n  return Type1Parser;\n}();\n\nexports.Type1Parser = Type1Parser;\n\n/***/ }),\n/* 40 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.getTilingPatternIR = getTilingPatternIR;\nexports.Pattern = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _colorspace = __w_pdfjs_require__(23);\n\nvar _primitives = __w_pdfjs_require__(5);\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nconst ShadingType = {\n  FUNCTION_BASED: 1,\n  AXIAL: 2,\n  RADIAL: 3,\n  FREE_FORM_MESH: 4,\n  LATTICE_FORM_MESH: 5,\n  COONS_PATCH_MESH: 6,\n  TENSOR_PATCH_MESH: 7\n};\n\nconst Pattern = function PatternClosure() {\n  function Pattern() {\n    (0, _util.unreachable)(\"should not call Pattern constructor\");\n  }\n\n  Pattern.prototype = {\n    getPattern: function Pattern_getPattern(ctx) {\n      (0, _util.unreachable)(`Should not call Pattern.getStyle: ${ctx}`);\n    }\n  };\n\n  Pattern.parseShading = function (shading, matrix, xref, res, handler, pdfFunctionFactory, localColorSpaceCache) {\n    const dict = (0, _primitives.isStream)(shading) ? shading.dict : shading;\n    const type = dict.get(\"ShadingType\");\n\n    try {\n      switch (type) {\n        case ShadingType.AXIAL:\n        case ShadingType.RADIAL:\n          return new Shadings.RadialAxial(dict, matrix, xref, res, pdfFunctionFactory, localColorSpaceCache);\n\n        case ShadingType.FREE_FORM_MESH:\n        case ShadingType.LATTICE_FORM_MESH:\n        case ShadingType.COONS_PATCH_MESH:\n        case ShadingType.TENSOR_PATCH_MESH:\n          return new Shadings.Mesh(shading, matrix, xref, res, pdfFunctionFactory, localColorSpaceCache);\n\n        default:\n          throw new _util.FormatError(\"Unsupported ShadingType: \" + type);\n      }\n    } catch (ex) {\n      if (ex instanceof _core_utils.MissingDataException) {\n        throw ex;\n      }\n\n      handler.send(\"UnsupportedFeature\", {\n        featureId: _util.UNSUPPORTED_FEATURES.shadingPattern\n      });\n      (0, _util.warn)(ex);\n      return new Shadings.Dummy();\n    }\n  };\n\n  return Pattern;\n}();\n\nexports.Pattern = Pattern;\nconst Shadings = {};\nShadings.SMALL_NUMBER = 1e-6;\n\nShadings.RadialAxial = function RadialAxialClosure() {\n  function RadialAxial(dict, matrix, xref, resources, pdfFunctionFactory, localColorSpaceCache) {\n    this.matrix = matrix;\n    this.coordsArr = dict.getArray(\"Coords\");\n    this.shadingType = dict.get(\"ShadingType\");\n    this.type = \"Pattern\";\n\n    const cs = _colorspace.ColorSpace.parse({\n      cs: dict.getRaw(\"ColorSpace\") || dict.getRaw(\"CS\"),\n      xref,\n      resources,\n      pdfFunctionFactory,\n      localColorSpaceCache\n    });\n\n    this.cs = cs;\n    const bbox = dict.getArray(\"BBox\");\n\n    if (Array.isArray(bbox) && bbox.length === 4) {\n      this.bbox = _util.Util.normalizeRect(bbox);\n    } else {\n      this.bbox = null;\n    }\n\n    let t0 = 0.0,\n        t1 = 1.0;\n\n    if (dict.has(\"Domain\")) {\n      const domainArr = dict.getArray(\"Domain\");\n      t0 = domainArr[0];\n      t1 = domainArr[1];\n    }\n\n    let extendStart = false,\n        extendEnd = false;\n\n    if (dict.has(\"Extend\")) {\n      const extendArr = dict.getArray(\"Extend\");\n      extendStart = extendArr[0];\n      extendEnd = extendArr[1];\n    }\n\n    if (this.shadingType === ShadingType.RADIAL && (!extendStart || !extendEnd)) {\n      const [x1, y1, r1, x2, y2, r2] = this.coordsArr;\n      const distance = Math.hypot(x1 - x2, y1 - y2);\n\n      if (r1 <= r2 + distance && r2 <= r1 + distance) {\n        (0, _util.warn)(\"Unsupported radial gradient.\");\n      }\n    }\n\n    this.extendStart = extendStart;\n    this.extendEnd = extendEnd;\n    const fnObj = dict.getRaw(\"Function\");\n    const fn = pdfFunctionFactory.createFromArray(fnObj);\n    const NUMBER_OF_SAMPLES = 10;\n    const step = (t1 - t0) / NUMBER_OF_SAMPLES;\n    const colorStops = this.colorStops = [];\n\n    if (t0 >= t1 || step <= 0) {\n      (0, _util.info)(\"Bad shading domain.\");\n      return;\n    }\n\n    const color = new Float32Array(cs.numComps),\n          ratio = new Float32Array(1);\n    let rgbColor;\n\n    for (let i = 0; i <= NUMBER_OF_SAMPLES; i++) {\n      ratio[0] = t0 + i * step;\n      fn(ratio, 0, color, 0);\n      rgbColor = cs.getRgb(color, 0);\n\n      const cssColor = _util.Util.makeHexColor(rgbColor[0], rgbColor[1], rgbColor[2]);\n\n      colorStops.push([i / NUMBER_OF_SAMPLES, cssColor]);\n    }\n\n    let background = \"transparent\";\n\n    if (dict.has(\"Background\")) {\n      rgbColor = cs.getRgb(dict.get(\"Background\"), 0);\n      background = _util.Util.makeHexColor(rgbColor[0], rgbColor[1], rgbColor[2]);\n    }\n\n    if (!extendStart) {\n      colorStops.unshift([0, background]);\n      colorStops[1][0] += Shadings.SMALL_NUMBER;\n    }\n\n    if (!extendEnd) {\n      colorStops[colorStops.length - 1][0] -= Shadings.SMALL_NUMBER;\n      colorStops.push([1, background]);\n    }\n\n    this.colorStops = colorStops;\n  }\n\n  RadialAxial.prototype = {\n    getIR: function RadialAxial_getIR() {\n      const coordsArr = this.coordsArr;\n      const shadingType = this.shadingType;\n      let type, p0, p1, r0, r1;\n\n      if (shadingType === ShadingType.AXIAL) {\n        p0 = [coordsArr[0], coordsArr[1]];\n        p1 = [coordsArr[2], coordsArr[3]];\n        r0 = null;\n        r1 = null;\n        type = \"axial\";\n      } else if (shadingType === ShadingType.RADIAL) {\n        p0 = [coordsArr[0], coordsArr[1]];\n        p1 = [coordsArr[3], coordsArr[4]];\n        r0 = coordsArr[2];\n        r1 = coordsArr[5];\n        type = \"radial\";\n      } else {\n        (0, _util.unreachable)(`getPattern type unknown: ${shadingType}`);\n      }\n\n      const matrix = this.matrix;\n\n      if (matrix) {\n        p0 = _util.Util.applyTransform(p0, matrix);\n        p1 = _util.Util.applyTransform(p1, matrix);\n\n        if (shadingType === ShadingType.RADIAL) {\n          const scale = _util.Util.singularValueDecompose2dScale(matrix);\n\n          r0 *= scale[0];\n          r1 *= scale[1];\n        }\n      }\n\n      return [\"RadialAxial\", type, this.bbox, this.colorStops, p0, p1, r0, r1];\n    }\n  };\n  return RadialAxial;\n}();\n\nShadings.Mesh = function MeshClosure() {\n  function MeshStreamReader(stream, context) {\n    this.stream = stream;\n    this.context = context;\n    this.buffer = 0;\n    this.bufferLength = 0;\n    const numComps = context.numComps;\n    this.tmpCompsBuf = new Float32Array(numComps);\n    const csNumComps = context.colorSpace.numComps;\n    this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : this.tmpCompsBuf;\n  }\n\n  MeshStreamReader.prototype = {\n    get hasData() {\n      if (this.stream.end) {\n        return this.stream.pos < this.stream.end;\n      }\n\n      if (this.bufferLength > 0) {\n        return true;\n      }\n\n      const nextByte = this.stream.getByte();\n\n      if (nextByte < 0) {\n        return false;\n      }\n\n      this.buffer = nextByte;\n      this.bufferLength = 8;\n      return true;\n    },\n\n    readBits: function MeshStreamReader_readBits(n) {\n      let buffer = this.buffer;\n      let bufferLength = this.bufferLength;\n\n      if (n === 32) {\n        if (bufferLength === 0) {\n          return (this.stream.getByte() << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte()) >>> 0;\n        }\n\n        buffer = buffer << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte();\n        const nextByte = this.stream.getByte();\n        this.buffer = nextByte & (1 << bufferLength) - 1;\n        return (buffer << 8 - bufferLength | (nextByte & 0xff) >> bufferLength) >>> 0;\n      }\n\n      if (n === 8 && bufferLength === 0) {\n        return this.stream.getByte();\n      }\n\n      while (bufferLength < n) {\n        buffer = buffer << 8 | this.stream.getByte();\n        bufferLength += 8;\n      }\n\n      bufferLength -= n;\n      this.bufferLength = bufferLength;\n      this.buffer = buffer & (1 << bufferLength) - 1;\n      return buffer >> bufferLength;\n    },\n    align: function MeshStreamReader_align() {\n      this.buffer = 0;\n      this.bufferLength = 0;\n    },\n    readFlag: function MeshStreamReader_readFlag() {\n      return this.readBits(this.context.bitsPerFlag);\n    },\n    readCoordinate: function MeshStreamReader_readCoordinate() {\n      const bitsPerCoordinate = this.context.bitsPerCoordinate;\n      const xi = this.readBits(bitsPerCoordinate);\n      const yi = this.readBits(bitsPerCoordinate);\n      const decode = this.context.decode;\n      const scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : 2.3283064365386963e-10;\n      return [xi * scale * (decode[1] - decode[0]) + decode[0], yi * scale * (decode[3] - decode[2]) + decode[2]];\n    },\n    readComponents: function MeshStreamReader_readComponents() {\n      const numComps = this.context.numComps;\n      const bitsPerComponent = this.context.bitsPerComponent;\n      const scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : 2.3283064365386963e-10;\n      const decode = this.context.decode;\n      const components = this.tmpCompsBuf;\n\n      for (let i = 0, j = 4; i < numComps; i++, j += 2) {\n        const ci = this.readBits(bitsPerComponent);\n        components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j];\n      }\n\n      const color = this.tmpCsCompsBuf;\n\n      if (this.context.colorFn) {\n        this.context.colorFn(components, 0, color, 0);\n      }\n\n      return this.context.colorSpace.getRgb(color, 0);\n    }\n  };\n\n  function decodeType4Shading(mesh, reader) {\n    const coords = mesh.coords;\n    const colors = mesh.colors;\n    const operators = [];\n    const ps = [];\n    let verticesLeft = 0;\n\n    while (reader.hasData) {\n      const f = reader.readFlag();\n      const coord = reader.readCoordinate();\n      const color = reader.readComponents();\n\n      if (verticesLeft === 0) {\n        if (!(0 <= f && f <= 2)) {\n          throw new _util.FormatError(\"Unknown type4 flag\");\n        }\n\n        switch (f) {\n          case 0:\n            verticesLeft = 3;\n            break;\n\n          case 1:\n            ps.push(ps[ps.length - 2], ps[ps.length - 1]);\n            verticesLeft = 1;\n            break;\n\n          case 2:\n            ps.push(ps[ps.length - 3], ps[ps.length - 1]);\n            verticesLeft = 1;\n            break;\n        }\n\n        operators.push(f);\n      }\n\n      ps.push(coords.length);\n      coords.push(coord);\n      colors.push(color);\n      verticesLeft--;\n      reader.align();\n    }\n\n    mesh.figures.push({\n      type: \"triangles\",\n      coords: new Int32Array(ps),\n      colors: new Int32Array(ps)\n    });\n  }\n\n  function decodeType5Shading(mesh, reader, verticesPerRow) {\n    const coords = mesh.coords;\n    const colors = mesh.colors;\n    const ps = [];\n\n    while (reader.hasData) {\n      const coord = reader.readCoordinate();\n      const color = reader.readComponents();\n      ps.push(coords.length);\n      coords.push(coord);\n      colors.push(color);\n    }\n\n    mesh.figures.push({\n      type: \"lattice\",\n      coords: new Int32Array(ps),\n      colors: new Int32Array(ps),\n      verticesPerRow\n    });\n  }\n\n  const MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3;\n  const MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20;\n  const TRIANGLE_DENSITY = 20;\n\n  const getB = function getBClosure() {\n    function buildB(count) {\n      const lut = [];\n\n      for (let i = 0; i <= count; i++) {\n        const t = i / count,\n              t_ = 1 - t;\n        lut.push(new Float32Array([t_ * t_ * t_, 3 * t * t_ * t_, 3 * t * t * t_, t * t * t]));\n      }\n\n      return lut;\n    }\n\n    const cache = [];\n    return function getB(count) {\n      if (!cache[count]) {\n        cache[count] = buildB(count);\n      }\n\n      return cache[count];\n    };\n  }();\n\n  function buildFigureFromPatch(mesh, index) {\n    const figure = mesh.figures[index];\n    (0, _util.assert)(figure.type === \"patch\", \"Unexpected patch mesh figure\");\n    const coords = mesh.coords,\n          colors = mesh.colors;\n    const pi = figure.coords;\n    const ci = figure.colors;\n    const figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]);\n    const figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]);\n    const figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]);\n    const figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]);\n    let splitXBy = Math.ceil((figureMaxX - figureMinX) * TRIANGLE_DENSITY / (mesh.bounds[2] - mesh.bounds[0]));\n    splitXBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy));\n    let splitYBy = Math.ceil((figureMaxY - figureMinY) * TRIANGLE_DENSITY / (mesh.bounds[3] - mesh.bounds[1]));\n    splitYBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy));\n    const verticesPerRow = splitXBy + 1;\n    const figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow);\n    const figureColors = new Int32Array((splitYBy + 1) * verticesPerRow);\n    let k = 0;\n    const cl = new Uint8Array(3),\n          cr = new Uint8Array(3);\n    const c0 = colors[ci[0]],\n          c1 = colors[ci[1]],\n          c2 = colors[ci[2]],\n          c3 = colors[ci[3]];\n    const bRow = getB(splitYBy),\n          bCol = getB(splitXBy);\n\n    for (let row = 0; row <= splitYBy; row++) {\n      cl[0] = (c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy | 0;\n      cl[1] = (c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy | 0;\n      cl[2] = (c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy | 0;\n      cr[0] = (c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy | 0;\n      cr[1] = (c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy | 0;\n      cr[2] = (c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy | 0;\n\n      for (let col = 0; col <= splitXBy; col++, k++) {\n        if ((row === 0 || row === splitYBy) && (col === 0 || col === splitXBy)) {\n          continue;\n        }\n\n        let x = 0,\n            y = 0;\n        let q = 0;\n\n        for (let i = 0; i <= 3; i++) {\n          for (let j = 0; j <= 3; j++, q++) {\n            const m = bRow[row][i] * bCol[col][j];\n            x += coords[pi[q]][0] * m;\n            y += coords[pi[q]][1] * m;\n          }\n        }\n\n        figureCoords[k] = coords.length;\n        coords.push([x, y]);\n        figureColors[k] = colors.length;\n        const newColor = new Uint8Array(3);\n        newColor[0] = (cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy | 0;\n        newColor[1] = (cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy | 0;\n        newColor[2] = (cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy | 0;\n        colors.push(newColor);\n      }\n    }\n\n    figureCoords[0] = pi[0];\n    figureColors[0] = ci[0];\n    figureCoords[splitXBy] = pi[3];\n    figureColors[splitXBy] = ci[1];\n    figureCoords[verticesPerRow * splitYBy] = pi[12];\n    figureColors[verticesPerRow * splitYBy] = ci[2];\n    figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15];\n    figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3];\n    mesh.figures[index] = {\n      type: \"lattice\",\n      coords: figureCoords,\n      colors: figureColors,\n      verticesPerRow\n    };\n  }\n\n  function decodeType6Shading(mesh, reader) {\n    const coords = mesh.coords;\n    const colors = mesh.colors;\n    const ps = new Int32Array(16);\n    const cs = new Int32Array(4);\n\n    while (reader.hasData) {\n      const f = reader.readFlag();\n\n      if (!(0 <= f && f <= 3)) {\n        throw new _util.FormatError(\"Unknown type6 flag\");\n      }\n\n      const pi = coords.length;\n\n      for (let i = 0, ii = f !== 0 ? 8 : 12; i < ii; i++) {\n        coords.push(reader.readCoordinate());\n      }\n\n      const ci = colors.length;\n\n      for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {\n        colors.push(reader.readComponents());\n      }\n\n      let tmp1, tmp2, tmp3, tmp4;\n\n      switch (f) {\n        case 0:\n          ps[12] = pi + 3;\n          ps[13] = pi + 4;\n          ps[14] = pi + 5;\n          ps[15] = pi + 6;\n          ps[8] = pi + 2;\n          ps[11] = pi + 7;\n          ps[4] = pi + 1;\n          ps[7] = pi + 8;\n          ps[0] = pi;\n          ps[1] = pi + 11;\n          ps[2] = pi + 10;\n          ps[3] = pi + 9;\n          cs[2] = ci + 1;\n          cs[3] = ci + 2;\n          cs[0] = ci;\n          cs[1] = ci + 3;\n          break;\n\n        case 1:\n          tmp1 = ps[12];\n          tmp2 = ps[13];\n          tmp3 = ps[14];\n          tmp4 = ps[15];\n          ps[12] = tmp4;\n          ps[13] = pi + 0;\n          ps[14] = pi + 1;\n          ps[15] = pi + 2;\n          ps[8] = tmp3;\n          ps[11] = pi + 3;\n          ps[4] = tmp2;\n          ps[7] = pi + 4;\n          ps[0] = tmp1;\n          ps[1] = pi + 7;\n          ps[2] = pi + 6;\n          ps[3] = pi + 5;\n          tmp1 = cs[2];\n          tmp2 = cs[3];\n          cs[2] = tmp2;\n          cs[3] = ci;\n          cs[0] = tmp1;\n          cs[1] = ci + 1;\n          break;\n\n        case 2:\n          tmp1 = ps[15];\n          tmp2 = ps[11];\n          ps[12] = ps[3];\n          ps[13] = pi + 0;\n          ps[14] = pi + 1;\n          ps[15] = pi + 2;\n          ps[8] = ps[7];\n          ps[11] = pi + 3;\n          ps[4] = tmp2;\n          ps[7] = pi + 4;\n          ps[0] = tmp1;\n          ps[1] = pi + 7;\n          ps[2] = pi + 6;\n          ps[3] = pi + 5;\n          tmp1 = cs[3];\n          cs[2] = cs[1];\n          cs[3] = ci;\n          cs[0] = tmp1;\n          cs[1] = ci + 1;\n          break;\n\n        case 3:\n          ps[12] = ps[0];\n          ps[13] = pi + 0;\n          ps[14] = pi + 1;\n          ps[15] = pi + 2;\n          ps[8] = ps[1];\n          ps[11] = pi + 3;\n          ps[4] = ps[2];\n          ps[7] = pi + 4;\n          ps[0] = ps[3];\n          ps[1] = pi + 7;\n          ps[2] = pi + 6;\n          ps[3] = pi + 5;\n          cs[2] = cs[0];\n          cs[3] = ci;\n          cs[0] = cs[1];\n          cs[1] = ci + 1;\n          break;\n      }\n\n      ps[5] = coords.length;\n      coords.push([(-4 * coords[ps[0]][0] - coords[ps[15]][0] + 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, (-4 * coords[ps[0]][1] - coords[ps[15]][1] + 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9]);\n      ps[6] = coords.length;\n      coords.push([(-4 * coords[ps[3]][0] - coords[ps[12]][0] + 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, (-4 * coords[ps[3]][1] - coords[ps[12]][1] + 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9]);\n      ps[9] = coords.length;\n      coords.push([(-4 * coords[ps[12]][0] - coords[ps[3]][0] + 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, (-4 * coords[ps[12]][1] - coords[ps[3]][1] + 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9]);\n      ps[10] = coords.length;\n      coords.push([(-4 * coords[ps[15]][0] - coords[ps[0]][0] + 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, (-4 * coords[ps[15]][1] - coords[ps[0]][1] + 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9]);\n      mesh.figures.push({\n        type: \"patch\",\n        coords: new Int32Array(ps),\n        colors: new Int32Array(cs)\n      });\n    }\n  }\n\n  function decodeType7Shading(mesh, reader) {\n    const coords = mesh.coords;\n    const colors = mesh.colors;\n    const ps = new Int32Array(16);\n    const cs = new Int32Array(4);\n\n    while (reader.hasData) {\n      const f = reader.readFlag();\n\n      if (!(0 <= f && f <= 3)) {\n        throw new _util.FormatError(\"Unknown type7 flag\");\n      }\n\n      const pi = coords.length;\n\n      for (let i = 0, ii = f !== 0 ? 12 : 16; i < ii; i++) {\n        coords.push(reader.readCoordinate());\n      }\n\n      const ci = colors.length;\n\n      for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {\n        colors.push(reader.readComponents());\n      }\n\n      let tmp1, tmp2, tmp3, tmp4;\n\n      switch (f) {\n        case 0:\n          ps[12] = pi + 3;\n          ps[13] = pi + 4;\n          ps[14] = pi + 5;\n          ps[15] = pi + 6;\n          ps[8] = pi + 2;\n          ps[9] = pi + 13;\n          ps[10] = pi + 14;\n          ps[11] = pi + 7;\n          ps[4] = pi + 1;\n          ps[5] = pi + 12;\n          ps[6] = pi + 15;\n          ps[7] = pi + 8;\n          ps[0] = pi;\n          ps[1] = pi + 11;\n          ps[2] = pi + 10;\n          ps[3] = pi + 9;\n          cs[2] = ci + 1;\n          cs[3] = ci + 2;\n          cs[0] = ci;\n          cs[1] = ci + 3;\n          break;\n\n        case 1:\n          tmp1 = ps[12];\n          tmp2 = ps[13];\n          tmp3 = ps[14];\n          tmp4 = ps[15];\n          ps[12] = tmp4;\n          ps[13] = pi + 0;\n          ps[14] = pi + 1;\n          ps[15] = pi + 2;\n          ps[8] = tmp3;\n          ps[9] = pi + 9;\n          ps[10] = pi + 10;\n          ps[11] = pi + 3;\n          ps[4] = tmp2;\n          ps[5] = pi + 8;\n          ps[6] = pi + 11;\n          ps[7] = pi + 4;\n          ps[0] = tmp1;\n          ps[1] = pi + 7;\n          ps[2] = pi + 6;\n          ps[3] = pi + 5;\n          tmp1 = cs[2];\n          tmp2 = cs[3];\n          cs[2] = tmp2;\n          cs[3] = ci;\n          cs[0] = tmp1;\n          cs[1] = ci + 1;\n          break;\n\n        case 2:\n          tmp1 = ps[15];\n          tmp2 = ps[11];\n          ps[12] = ps[3];\n          ps[13] = pi + 0;\n          ps[14] = pi + 1;\n          ps[15] = pi + 2;\n          ps[8] = ps[7];\n          ps[9] = pi + 9;\n          ps[10] = pi + 10;\n          ps[11] = pi + 3;\n          ps[4] = tmp2;\n          ps[5] = pi + 8;\n          ps[6] = pi + 11;\n          ps[7] = pi + 4;\n          ps[0] = tmp1;\n          ps[1] = pi + 7;\n          ps[2] = pi + 6;\n          ps[3] = pi + 5;\n          tmp1 = cs[3];\n          cs[2] = cs[1];\n          cs[3] = ci;\n          cs[0] = tmp1;\n          cs[1] = ci + 1;\n          break;\n\n        case 3:\n          ps[12] = ps[0];\n          ps[13] = pi + 0;\n          ps[14] = pi + 1;\n          ps[15] = pi + 2;\n          ps[8] = ps[1];\n          ps[9] = pi + 9;\n          ps[10] = pi + 10;\n          ps[11] = pi + 3;\n          ps[4] = ps[2];\n          ps[5] = pi + 8;\n          ps[6] = pi + 11;\n          ps[7] = pi + 4;\n          ps[0] = ps[3];\n          ps[1] = pi + 7;\n          ps[2] = pi + 6;\n          ps[3] = pi + 5;\n          cs[2] = cs[0];\n          cs[3] = ci;\n          cs[0] = cs[1];\n          cs[1] = ci + 1;\n          break;\n      }\n\n      mesh.figures.push({\n        type: \"patch\",\n        coords: new Int32Array(ps),\n        colors: new Int32Array(cs)\n      });\n    }\n  }\n\n  function updateBounds(mesh) {\n    let minX = mesh.coords[0][0],\n        minY = mesh.coords[0][1],\n        maxX = minX,\n        maxY = minY;\n\n    for (let i = 1, ii = mesh.coords.length; i < ii; i++) {\n      const x = mesh.coords[i][0],\n            y = mesh.coords[i][1];\n      minX = minX > x ? x : minX;\n      minY = minY > y ? y : minY;\n      maxX = maxX < x ? x : maxX;\n      maxY = maxY < y ? y : maxY;\n    }\n\n    mesh.bounds = [minX, minY, maxX, maxY];\n  }\n\n  function packData(mesh) {\n    let i, ii, j, jj;\n    const coords = mesh.coords;\n    const coordsPacked = new Float32Array(coords.length * 2);\n\n    for (i = 0, j = 0, ii = coords.length; i < ii; i++) {\n      const xy = coords[i];\n      coordsPacked[j++] = xy[0];\n      coordsPacked[j++] = xy[1];\n    }\n\n    mesh.coords = coordsPacked;\n    const colors = mesh.colors;\n    const colorsPacked = new Uint8Array(colors.length * 3);\n\n    for (i = 0, j = 0, ii = colors.length; i < ii; i++) {\n      const c = colors[i];\n      colorsPacked[j++] = c[0];\n      colorsPacked[j++] = c[1];\n      colorsPacked[j++] = c[2];\n    }\n\n    mesh.colors = colorsPacked;\n    const figures = mesh.figures;\n\n    for (i = 0, ii = figures.length; i < ii; i++) {\n      const figure = figures[i],\n            ps = figure.coords,\n            cs = figure.colors;\n\n      for (j = 0, jj = ps.length; j < jj; j++) {\n        ps[j] *= 2;\n        cs[j] *= 3;\n      }\n    }\n  }\n\n  function Mesh(stream, matrix, xref, resources, pdfFunctionFactory, localColorSpaceCache) {\n    if (!(0, _primitives.isStream)(stream)) {\n      throw new _util.FormatError(\"Mesh data is not a stream\");\n    }\n\n    const dict = stream.dict;\n    this.matrix = matrix;\n    this.shadingType = dict.get(\"ShadingType\");\n    this.type = \"Pattern\";\n    const bbox = dict.getArray(\"BBox\");\n\n    if (Array.isArray(bbox) && bbox.length === 4) {\n      this.bbox = _util.Util.normalizeRect(bbox);\n    } else {\n      this.bbox = null;\n    }\n\n    const cs = _colorspace.ColorSpace.parse({\n      cs: dict.getRaw(\"ColorSpace\") || dict.getRaw(\"CS\"),\n      xref,\n      resources,\n      pdfFunctionFactory,\n      localColorSpaceCache\n    });\n\n    this.cs = cs;\n    this.background = dict.has(\"Background\") ? cs.getRgb(dict.get(\"Background\"), 0) : null;\n    const fnObj = dict.getRaw(\"Function\");\n    const fn = fnObj ? pdfFunctionFactory.createFromArray(fnObj) : null;\n    this.coords = [];\n    this.colors = [];\n    this.figures = [];\n    const decodeContext = {\n      bitsPerCoordinate: dict.get(\"BitsPerCoordinate\"),\n      bitsPerComponent: dict.get(\"BitsPerComponent\"),\n      bitsPerFlag: dict.get(\"BitsPerFlag\"),\n      decode: dict.getArray(\"Decode\"),\n      colorFn: fn,\n      colorSpace: cs,\n      numComps: fn ? 1 : cs.numComps\n    };\n    const reader = new MeshStreamReader(stream, decodeContext);\n    let patchMesh = false;\n\n    switch (this.shadingType) {\n      case ShadingType.FREE_FORM_MESH:\n        decodeType4Shading(this, reader);\n        break;\n\n      case ShadingType.LATTICE_FORM_MESH:\n        const verticesPerRow = dict.get(\"VerticesPerRow\") | 0;\n\n        if (verticesPerRow < 2) {\n          throw new _util.FormatError(\"Invalid VerticesPerRow\");\n        }\n\n        decodeType5Shading(this, reader, verticesPerRow);\n        break;\n\n      case ShadingType.COONS_PATCH_MESH:\n        decodeType6Shading(this, reader);\n        patchMesh = true;\n        break;\n\n      case ShadingType.TENSOR_PATCH_MESH:\n        decodeType7Shading(this, reader);\n        patchMesh = true;\n        break;\n\n      default:\n        (0, _util.unreachable)(\"Unsupported mesh type.\");\n        break;\n    }\n\n    if (patchMesh) {\n      updateBounds(this);\n\n      for (let i = 0, ii = this.figures.length; i < ii; i++) {\n        buildFigureFromPatch(this, i);\n      }\n    }\n\n    updateBounds(this);\n    packData(this);\n  }\n\n  Mesh.prototype = {\n    getIR: function Mesh_getIR() {\n      return [\"Mesh\", this.shadingType, this.coords, this.colors, this.figures, this.bounds, this.matrix, this.bbox, this.background];\n    }\n  };\n  return Mesh;\n}();\n\nShadings.Dummy = function DummyClosure() {\n  function Dummy() {\n    this.type = \"Pattern\";\n  }\n\n  Dummy.prototype = {\n    getIR: function Dummy_getIR() {\n      return [\"Dummy\"];\n    }\n  };\n  return Dummy;\n}();\n\nfunction getTilingPatternIR(operatorList, dict, color) {\n  const matrix = dict.getArray(\"Matrix\");\n\n  const bbox = _util.Util.normalizeRect(dict.getArray(\"BBox\"));\n\n  const xstep = dict.get(\"XStep\");\n  const ystep = dict.get(\"YStep\");\n  const paintType = dict.get(\"PaintType\");\n  const tilingType = dict.get(\"TilingType\");\n\n  if (bbox[2] - bbox[0] === 0 || bbox[3] - bbox[1] === 0) {\n    throw new _util.FormatError(`Invalid getTilingPatternIR /BBox array: [${bbox}].`);\n  }\n\n  return [\"TilingPattern\", color, operatorList, matrix, bbox, xstep, ystep, paintType, tilingType];\n}\n\n/***/ }),\n/* 41 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.isPDFFunction = isPDFFunction;\nexports.PostScriptEvaluator = exports.PostScriptCompiler = exports.PDFFunctionFactory = void 0;\n\nvar _primitives = __w_pdfjs_require__(5);\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _ps_parser = __w_pdfjs_require__(42);\n\nvar _image_utils = __w_pdfjs_require__(24);\n\nclass PDFFunctionFactory {\n  constructor({\n    xref,\n    isEvalSupported = true\n  }) {\n    this.xref = xref;\n    this.isEvalSupported = isEvalSupported !== false;\n  }\n\n  create(fn) {\n    const cachedFunction = this.getCached(fn);\n\n    if (cachedFunction) {\n      return cachedFunction;\n    }\n\n    const parsedFunction = PDFFunction.parse({\n      xref: this.xref,\n      isEvalSupported: this.isEvalSupported,\n      fn: fn instanceof _primitives.Ref ? this.xref.fetch(fn) : fn\n    });\n\n    this._cache(fn, parsedFunction);\n\n    return parsedFunction;\n  }\n\n  createFromArray(fnObj) {\n    const cachedFunction = this.getCached(fnObj);\n\n    if (cachedFunction) {\n      return cachedFunction;\n    }\n\n    const parsedFunction = PDFFunction.parseArray({\n      xref: this.xref,\n      isEvalSupported: this.isEvalSupported,\n      fnObj: fnObj instanceof _primitives.Ref ? this.xref.fetch(fnObj) : fnObj\n    });\n\n    this._cache(fnObj, parsedFunction);\n\n    return parsedFunction;\n  }\n\n  getCached(cacheKey) {\n    let fnRef;\n\n    if (cacheKey instanceof _primitives.Ref) {\n      fnRef = cacheKey;\n    } else if (cacheKey instanceof _primitives.Dict) {\n      fnRef = cacheKey.objId;\n    } else if ((0, _primitives.isStream)(cacheKey)) {\n      fnRef = cacheKey.dict && cacheKey.dict.objId;\n    }\n\n    if (fnRef) {\n      const localFunction = this._localFunctionCache.getByRef(fnRef);\n\n      if (localFunction) {\n        return localFunction;\n      }\n    }\n\n    return null;\n  }\n\n  _cache(cacheKey, parsedFunction) {\n    if (!parsedFunction) {\n      throw new Error('PDFFunctionFactory._cache - expected \"parsedFunction\" argument.');\n    }\n\n    let fnRef;\n\n    if (cacheKey instanceof _primitives.Ref) {\n      fnRef = cacheKey;\n    } else if (cacheKey instanceof _primitives.Dict) {\n      fnRef = cacheKey.objId;\n    } else if ((0, _primitives.isStream)(cacheKey)) {\n      fnRef = cacheKey.dict && cacheKey.dict.objId;\n    }\n\n    if (fnRef) {\n      this._localFunctionCache.set(null, fnRef, parsedFunction);\n    }\n  }\n\n  get _localFunctionCache() {\n    return (0, _util.shadow)(this, \"_localFunctionCache\", new _image_utils.LocalFunctionCache());\n  }\n\n}\n\nexports.PDFFunctionFactory = PDFFunctionFactory;\n\nfunction toNumberArray(arr) {\n  if (!Array.isArray(arr)) {\n    return null;\n  }\n\n  const length = arr.length;\n\n  for (let i = 0; i < length; i++) {\n    if (typeof arr[i] !== \"number\") {\n      const result = new Array(length);\n\n      for (let j = 0; j < length; j++) {\n        result[j] = +arr[j];\n      }\n\n      return result;\n    }\n  }\n\n  return arr;\n}\n\nvar PDFFunction = function PDFFunctionClosure() {\n  const CONSTRUCT_SAMPLED = 0;\n  const CONSTRUCT_INTERPOLATED = 2;\n  const CONSTRUCT_STICHED = 3;\n  const CONSTRUCT_POSTSCRIPT = 4;\n  return {\n    getSampleArray(size, outputSize, bps, stream) {\n      var i, ii;\n      var length = 1;\n\n      for (i = 0, ii = size.length; i < ii; i++) {\n        length *= size[i];\n      }\n\n      length *= outputSize;\n      var array = new Array(length);\n      var codeSize = 0;\n      var codeBuf = 0;\n      var sampleMul = 1.0 / (2.0 ** bps - 1);\n      var strBytes = stream.getBytes((length * bps + 7) / 8);\n      var strIdx = 0;\n\n      for (i = 0; i < length; i++) {\n        while (codeSize < bps) {\n          codeBuf <<= 8;\n          codeBuf |= strBytes[strIdx++];\n          codeSize += 8;\n        }\n\n        codeSize -= bps;\n        array[i] = (codeBuf >> codeSize) * sampleMul;\n        codeBuf &= (1 << codeSize) - 1;\n      }\n\n      return array;\n    },\n\n    getIR({\n      xref,\n      isEvalSupported,\n      fn\n    }) {\n      var dict = fn.dict;\n\n      if (!dict) {\n        dict = fn;\n      }\n\n      var types = [this.constructSampled, null, this.constructInterpolated, this.constructStiched, this.constructPostScript];\n      var typeNum = dict.get(\"FunctionType\");\n      var typeFn = types[typeNum];\n\n      if (!typeFn) {\n        throw new _util.FormatError(\"Unknown type of function\");\n      }\n\n      return typeFn.call(this, {\n        xref,\n        isEvalSupported,\n        fn,\n        dict\n      });\n    },\n\n    fromIR({\n      xref,\n      isEvalSupported,\n      IR\n    }) {\n      var type = IR[0];\n\n      switch (type) {\n        case CONSTRUCT_SAMPLED:\n          return this.constructSampledFromIR({\n            xref,\n            isEvalSupported,\n            IR\n          });\n\n        case CONSTRUCT_INTERPOLATED:\n          return this.constructInterpolatedFromIR({\n            xref,\n            isEvalSupported,\n            IR\n          });\n\n        case CONSTRUCT_STICHED:\n          return this.constructStichedFromIR({\n            xref,\n            isEvalSupported,\n            IR\n          });\n\n        default:\n          return this.constructPostScriptFromIR({\n            xref,\n            isEvalSupported,\n            IR\n          });\n      }\n    },\n\n    parse({\n      xref,\n      isEvalSupported,\n      fn\n    }) {\n      const IR = this.getIR({\n        xref,\n        isEvalSupported,\n        fn\n      });\n      return this.fromIR({\n        xref,\n        isEvalSupported,\n        IR\n      });\n    },\n\n    parseArray({\n      xref,\n      isEvalSupported,\n      fnObj\n    }) {\n      if (!Array.isArray(fnObj)) {\n        return this.parse({\n          xref,\n          isEvalSupported,\n          fn: fnObj\n        });\n      }\n\n      var fnArray = [];\n\n      for (var j = 0, jj = fnObj.length; j < jj; j++) {\n        fnArray.push(this.parse({\n          xref,\n          isEvalSupported,\n          fn: xref.fetchIfRef(fnObj[j])\n        }));\n      }\n\n      return function (src, srcOffset, dest, destOffset) {\n        for (var i = 0, ii = fnArray.length; i < ii; i++) {\n          fnArray[i](src, srcOffset, dest, destOffset + i);\n        }\n      };\n    },\n\n    constructSampled({\n      xref,\n      isEvalSupported,\n      fn,\n      dict\n    }) {\n      function toMultiArray(arr) {\n        var inputLength = arr.length;\n        var out = [];\n        var index = 0;\n\n        for (var i = 0; i < inputLength; i += 2) {\n          out[index] = [arr[i], arr[i + 1]];\n          ++index;\n        }\n\n        return out;\n      }\n\n      var domain = toNumberArray(dict.getArray(\"Domain\"));\n      var range = toNumberArray(dict.getArray(\"Range\"));\n\n      if (!domain || !range) {\n        throw new _util.FormatError(\"No domain or range\");\n      }\n\n      var inputSize = domain.length / 2;\n      var outputSize = range.length / 2;\n      domain = toMultiArray(domain);\n      range = toMultiArray(range);\n      var size = toNumberArray(dict.getArray(\"Size\"));\n      var bps = dict.get(\"BitsPerSample\");\n      var order = dict.get(\"Order\") || 1;\n\n      if (order !== 1) {\n        (0, _util.info)(\"No support for cubic spline interpolation: \" + order);\n      }\n\n      var encode = toNumberArray(dict.getArray(\"Encode\"));\n\n      if (!encode) {\n        encode = [];\n\n        for (var i = 0; i < inputSize; ++i) {\n          encode.push([0, size[i] - 1]);\n        }\n      } else {\n        encode = toMultiArray(encode);\n      }\n\n      var decode = toNumberArray(dict.getArray(\"Decode\"));\n\n      if (!decode) {\n        decode = range;\n      } else {\n        decode = toMultiArray(decode);\n      }\n\n      var samples = this.getSampleArray(size, outputSize, bps, fn);\n      return [CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size, outputSize, 2 ** bps - 1, range];\n    },\n\n    constructSampledFromIR({\n      xref,\n      isEvalSupported,\n      IR\n    }) {\n      function interpolate(x, xmin, xmax, ymin, ymax) {\n        return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin));\n      }\n\n      return function constructSampledFromIRResult(src, srcOffset, dest, destOffset) {\n        var m = IR[1];\n        var domain = IR[2];\n        var encode = IR[3];\n        var decode = IR[4];\n        var samples = IR[5];\n        var size = IR[6];\n        var n = IR[7];\n        var range = IR[9];\n        var cubeVertices = 1 << m;\n        var cubeN = new Float64Array(cubeVertices);\n        var cubeVertex = new Uint32Array(cubeVertices);\n        var i, j;\n\n        for (j = 0; j < cubeVertices; j++) {\n          cubeN[j] = 1;\n        }\n\n        var k = n,\n            pos = 1;\n\n        for (i = 0; i < m; ++i) {\n          var domain_2i = domain[i][0];\n          var domain_2i_1 = domain[i][1];\n          var xi = Math.min(Math.max(src[srcOffset + i], domain_2i), domain_2i_1);\n          var e = interpolate(xi, domain_2i, domain_2i_1, encode[i][0], encode[i][1]);\n          var size_i = size[i];\n          e = Math.min(Math.max(e, 0), size_i - 1);\n          var e0 = e < size_i - 1 ? Math.floor(e) : e - 1;\n          var n0 = e0 + 1 - e;\n          var n1 = e - e0;\n          var offset0 = e0 * k;\n          var offset1 = offset0 + k;\n\n          for (j = 0; j < cubeVertices; j++) {\n            if (j & pos) {\n              cubeN[j] *= n1;\n              cubeVertex[j] += offset1;\n            } else {\n              cubeN[j] *= n0;\n              cubeVertex[j] += offset0;\n            }\n          }\n\n          k *= size_i;\n          pos <<= 1;\n        }\n\n        for (j = 0; j < n; ++j) {\n          var rj = 0;\n\n          for (i = 0; i < cubeVertices; i++) {\n            rj += samples[cubeVertex[i] + j] * cubeN[i];\n          }\n\n          rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);\n          dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), range[j][1]);\n        }\n      };\n    },\n\n    constructInterpolated({\n      xref,\n      isEvalSupported,\n      fn,\n      dict\n    }) {\n      var c0 = toNumberArray(dict.getArray(\"C0\")) || [0];\n      var c1 = toNumberArray(dict.getArray(\"C1\")) || [1];\n      var n = dict.get(\"N\");\n      var length = c0.length;\n      var diff = [];\n\n      for (var i = 0; i < length; ++i) {\n        diff.push(c1[i] - c0[i]);\n      }\n\n      return [CONSTRUCT_INTERPOLATED, c0, diff, n];\n    },\n\n    constructInterpolatedFromIR({\n      xref,\n      isEvalSupported,\n      IR\n    }) {\n      var c0 = IR[1];\n      var diff = IR[2];\n      var n = IR[3];\n      var length = diff.length;\n      return function constructInterpolatedFromIRResult(src, srcOffset, dest, destOffset) {\n        var x = n === 1 ? src[srcOffset] : src[srcOffset] ** n;\n\n        for (var j = 0; j < length; ++j) {\n          dest[destOffset + j] = c0[j] + x * diff[j];\n        }\n      };\n    },\n\n    constructStiched({\n      xref,\n      isEvalSupported,\n      fn,\n      dict\n    }) {\n      var domain = toNumberArray(dict.getArray(\"Domain\"));\n\n      if (!domain) {\n        throw new _util.FormatError(\"No domain\");\n      }\n\n      var inputSize = domain.length / 2;\n\n      if (inputSize !== 1) {\n        throw new _util.FormatError(\"Bad domain for stiched function\");\n      }\n\n      var fnRefs = dict.get(\"Functions\");\n      var fns = [];\n\n      for (var i = 0, ii = fnRefs.length; i < ii; ++i) {\n        fns.push(this.parse({\n          xref,\n          isEvalSupported,\n          fn: xref.fetchIfRef(fnRefs[i])\n        }));\n      }\n\n      var bounds = toNumberArray(dict.getArray(\"Bounds\"));\n      var encode = toNumberArray(dict.getArray(\"Encode\"));\n      return [CONSTRUCT_STICHED, domain, bounds, encode, fns];\n    },\n\n    constructStichedFromIR({\n      xref,\n      isEvalSupported,\n      IR\n    }) {\n      var domain = IR[1];\n      var bounds = IR[2];\n      var encode = IR[3];\n      var fns = IR[4];\n      var tmpBuf = new Float32Array(1);\n      return function constructStichedFromIRResult(src, srcOffset, dest, destOffset) {\n        var clip = function constructStichedFromIRClip(v, min, max) {\n          if (v > max) {\n            v = max;\n          } else if (v < min) {\n            v = min;\n          }\n\n          return v;\n        };\n\n        var v = clip(src[srcOffset], domain[0], domain[1]);\n\n        for (var i = 0, ii = bounds.length; i < ii; ++i) {\n          if (v < bounds[i]) {\n            break;\n          }\n        }\n\n        var dmin = domain[0];\n\n        if (i > 0) {\n          dmin = bounds[i - 1];\n        }\n\n        var dmax = domain[1];\n\n        if (i < bounds.length) {\n          dmax = bounds[i];\n        }\n\n        var rmin = encode[2 * i];\n        var rmax = encode[2 * i + 1];\n        tmpBuf[0] = dmin === dmax ? rmin : rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);\n        fns[i](tmpBuf, 0, dest, destOffset);\n      };\n    },\n\n    constructPostScript({\n      xref,\n      isEvalSupported,\n      fn,\n      dict\n    }) {\n      var domain = toNumberArray(dict.getArray(\"Domain\"));\n      var range = toNumberArray(dict.getArray(\"Range\"));\n\n      if (!domain) {\n        throw new _util.FormatError(\"No domain.\");\n      }\n\n      if (!range) {\n        throw new _util.FormatError(\"No range.\");\n      }\n\n      var lexer = new _ps_parser.PostScriptLexer(fn);\n      var parser = new _ps_parser.PostScriptParser(lexer);\n      var code = parser.parse();\n      return [CONSTRUCT_POSTSCRIPT, domain, range, code];\n    },\n\n    constructPostScriptFromIR({\n      xref,\n      isEvalSupported,\n      IR\n    }) {\n      var domain = IR[1];\n      var range = IR[2];\n      var code = IR[3];\n\n      if (isEvalSupported && _util.IsEvalSupportedCached.value) {\n        const compiled = new PostScriptCompiler().compile(code, domain, range);\n\n        if (compiled) {\n          return new Function(\"src\", \"srcOffset\", \"dest\", \"destOffset\", compiled);\n        }\n      }\n\n      (0, _util.info)(\"Unable to compile PS function\");\n      var numOutputs = range.length >> 1;\n      var numInputs = domain.length >> 1;\n      var evaluator = new PostScriptEvaluator(code);\n      var cache = Object.create(null);\n      var MAX_CACHE_SIZE = 2048 * 4;\n      var cache_available = MAX_CACHE_SIZE;\n      var tmpBuf = new Float32Array(numInputs);\n      return function constructPostScriptFromIRResult(src, srcOffset, dest, destOffset) {\n        var i, value;\n        var key = \"\";\n        var input = tmpBuf;\n\n        for (i = 0; i < numInputs; i++) {\n          value = src[srcOffset + i];\n          input[i] = value;\n          key += value + \"_\";\n        }\n\n        var cachedValue = cache[key];\n\n        if (cachedValue !== undefined) {\n          dest.set(cachedValue, destOffset);\n          return;\n        }\n\n        var output = new Float32Array(numOutputs);\n        var stack = evaluator.execute(input);\n        var stackIndex = stack.length - numOutputs;\n\n        for (i = 0; i < numOutputs; i++) {\n          value = stack[stackIndex + i];\n          var bound = range[i * 2];\n\n          if (value < bound) {\n            value = bound;\n          } else {\n            bound = range[i * 2 + 1];\n\n            if (value > bound) {\n              value = bound;\n            }\n          }\n\n          output[i] = value;\n        }\n\n        if (cache_available > 0) {\n          cache_available--;\n          cache[key] = output;\n        }\n\n        dest.set(output, destOffset);\n      };\n    }\n\n  };\n}();\n\nfunction isPDFFunction(v) {\n  var fnDict;\n\n  if (typeof v !== \"object\") {\n    return false;\n  } else if ((0, _primitives.isDict)(v)) {\n    fnDict = v;\n  } else if ((0, _primitives.isStream)(v)) {\n    fnDict = v.dict;\n  } else {\n    return false;\n  }\n\n  return fnDict.has(\"FunctionType\");\n}\n\nvar PostScriptStack = function PostScriptStackClosure() {\n  var MAX_STACK_SIZE = 100;\n\n  class PostScriptStack {\n    constructor(initialStack) {\n      this.stack = !initialStack ? [] : Array.prototype.slice.call(initialStack, 0);\n    }\n\n    push(value) {\n      if (this.stack.length >= MAX_STACK_SIZE) {\n        throw new Error(\"PostScript function stack overflow.\");\n      }\n\n      this.stack.push(value);\n    }\n\n    pop() {\n      if (this.stack.length <= 0) {\n        throw new Error(\"PostScript function stack underflow.\");\n      }\n\n      return this.stack.pop();\n    }\n\n    copy(n) {\n      if (this.stack.length + n >= MAX_STACK_SIZE) {\n        throw new Error(\"PostScript function stack overflow.\");\n      }\n\n      var stack = this.stack;\n\n      for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++) {\n        stack.push(stack[i]);\n      }\n    }\n\n    index(n) {\n      this.push(this.stack[this.stack.length - n - 1]);\n    }\n\n    roll(n, p) {\n      var stack = this.stack;\n      var l = stack.length - n;\n      var r = stack.length - 1,\n          c = l + (p - Math.floor(p / n) * n),\n          i,\n          j,\n          t;\n\n      for (i = l, j = r; i < j; i++, j--) {\n        t = stack[i];\n        stack[i] = stack[j];\n        stack[j] = t;\n      }\n\n      for (i = l, j = c - 1; i < j; i++, j--) {\n        t = stack[i];\n        stack[i] = stack[j];\n        stack[j] = t;\n      }\n\n      for (i = c, j = r; i < j; i++, j--) {\n        t = stack[i];\n        stack[i] = stack[j];\n        stack[j] = t;\n      }\n    }\n\n  }\n\n  return PostScriptStack;\n}();\n\nclass PostScriptEvaluator {\n  constructor(operators) {\n    this.operators = operators;\n  }\n\n  execute(initialStack) {\n    var stack = new PostScriptStack(initialStack);\n    var counter = 0;\n    var operators = this.operators;\n    var length = operators.length;\n    var operator, a, b;\n\n    while (counter < length) {\n      operator = operators[counter++];\n\n      if (typeof operator === \"number\") {\n        stack.push(operator);\n        continue;\n      }\n\n      switch (operator) {\n        case \"jz\":\n          b = stack.pop();\n          a = stack.pop();\n\n          if (!a) {\n            counter = b;\n          }\n\n          break;\n\n        case \"j\":\n          a = stack.pop();\n          counter = a;\n          break;\n\n        case \"abs\":\n          a = stack.pop();\n          stack.push(Math.abs(a));\n          break;\n\n        case \"add\":\n          b = stack.pop();\n          a = stack.pop();\n          stack.push(a + b);\n          break;\n\n        case \"and\":\n          b = stack.pop();\n          a = stack.pop();\n\n          if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {\n            stack.push(a && b);\n          } else {\n            stack.push(a & b);\n          }\n\n          break;\n\n        case \"atan\":\n          a = stack.pop();\n          stack.push(Math.atan(a));\n          break;\n\n        case \"bitshift\":\n          b = stack.pop();\n          a = stack.pop();\n\n          if (a > 0) {\n            stack.push(a << b);\n          } else {\n            stack.push(a >> b);\n          }\n\n          break;\n\n        case \"ceiling\":\n          a = stack.pop();\n          stack.push(Math.ceil(a));\n          break;\n\n        case \"copy\":\n          a = stack.pop();\n          stack.copy(a);\n          break;\n\n        case \"cos\":\n          a = stack.pop();\n          stack.push(Math.cos(a));\n          break;\n\n        case \"cvi\":\n          a = stack.pop() | 0;\n          stack.push(a);\n          break;\n\n        case \"cvr\":\n          break;\n\n        case \"div\":\n          b = stack.pop();\n          a = stack.pop();\n          stack.push(a / b);\n          break;\n\n        case \"dup\":\n          stack.copy(1);\n          break;\n\n        case \"eq\":\n          b = stack.pop();\n          a = stack.pop();\n          stack.push(a === b);\n          break;\n\n        case \"exch\":\n          stack.roll(2, 1);\n          break;\n\n        case \"exp\":\n          b = stack.pop();\n          a = stack.pop();\n          stack.push(a ** b);\n          break;\n\n        case \"false\":\n          stack.push(false);\n          break;\n\n        case \"floor\":\n          a = stack.pop();\n          stack.push(Math.floor(a));\n          break;\n\n        case \"ge\":\n          b = stack.pop();\n          a = stack.pop();\n          stack.push(a >= b);\n          break;\n\n        case \"gt\":\n          b = stack.pop();\n          a = stack.pop();\n          stack.push(a > b);\n          break;\n\n        case \"idiv\":\n          b = stack.pop();\n          a = stack.pop();\n          stack.push(a / b | 0);\n          break;\n\n        case \"index\":\n          a = stack.pop();\n          stack.index(a);\n          break;\n\n        case \"le\":\n          b = stack.pop();\n          a = stack.pop();\n          stack.push(a <= b);\n          break;\n\n        case \"ln\":\n          a = stack.pop();\n          stack.push(Math.log(a));\n          break;\n\n        case \"log\":\n          a = stack.pop();\n          stack.push(Math.log(a) / Math.LN10);\n          break;\n\n        case \"lt\":\n          b = stack.pop();\n          a = stack.pop();\n          stack.push(a < b);\n          break;\n\n        case \"mod\":\n          b = stack.pop();\n          a = stack.pop();\n          stack.push(a % b);\n          break;\n\n        case \"mul\":\n          b = stack.pop();\n          a = stack.pop();\n          stack.push(a * b);\n          break;\n\n        case \"ne\":\n          b = stack.pop();\n          a = stack.pop();\n          stack.push(a !== b);\n          break;\n\n        case \"neg\":\n          a = stack.pop();\n          stack.push(-a);\n          break;\n\n        case \"not\":\n          a = stack.pop();\n\n          if ((0, _util.isBool)(a)) {\n            stack.push(!a);\n          } else {\n            stack.push(~a);\n          }\n\n          break;\n\n        case \"or\":\n          b = stack.pop();\n          a = stack.pop();\n\n          if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {\n            stack.push(a || b);\n          } else {\n            stack.push(a | b);\n          }\n\n          break;\n\n        case \"pop\":\n          stack.pop();\n          break;\n\n        case \"roll\":\n          b = stack.pop();\n          a = stack.pop();\n          stack.roll(a, b);\n          break;\n\n        case \"round\":\n          a = stack.pop();\n          stack.push(Math.round(a));\n          break;\n\n        case \"sin\":\n          a = stack.pop();\n          stack.push(Math.sin(a));\n          break;\n\n        case \"sqrt\":\n          a = stack.pop();\n          stack.push(Math.sqrt(a));\n          break;\n\n        case \"sub\":\n          b = stack.pop();\n          a = stack.pop();\n          stack.push(a - b);\n          break;\n\n        case \"true\":\n          stack.push(true);\n          break;\n\n        case \"truncate\":\n          a = stack.pop();\n          a = a < 0 ? Math.ceil(a) : Math.floor(a);\n          stack.push(a);\n          break;\n\n        case \"xor\":\n          b = stack.pop();\n          a = stack.pop();\n\n          if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {\n            stack.push(a !== b);\n          } else {\n            stack.push(a ^ b);\n          }\n\n          break;\n\n        default:\n          throw new _util.FormatError(`Unknown operator ${operator}`);\n      }\n    }\n\n    return stack.stack;\n  }\n\n}\n\nexports.PostScriptEvaluator = PostScriptEvaluator;\n\nvar PostScriptCompiler = function PostScriptCompilerClosure() {\n  class AstNode {\n    constructor(type) {\n      this.type = type;\n    }\n\n    visit(visitor) {\n      (0, _util.unreachable)(\"abstract method\");\n    }\n\n  }\n\n  class AstArgument extends AstNode {\n    constructor(index, min, max) {\n      super(\"args\");\n      this.index = index;\n      this.min = min;\n      this.max = max;\n    }\n\n    visit(visitor) {\n      visitor.visitArgument(this);\n    }\n\n  }\n\n  class AstLiteral extends AstNode {\n    constructor(number) {\n      super(\"literal\");\n      this.number = number;\n      this.min = number;\n      this.max = number;\n    }\n\n    visit(visitor) {\n      visitor.visitLiteral(this);\n    }\n\n  }\n\n  class AstBinaryOperation extends AstNode {\n    constructor(op, arg1, arg2, min, max) {\n      super(\"binary\");\n      this.op = op;\n      this.arg1 = arg1;\n      this.arg2 = arg2;\n      this.min = min;\n      this.max = max;\n    }\n\n    visit(visitor) {\n      visitor.visitBinaryOperation(this);\n    }\n\n  }\n\n  class AstMin extends AstNode {\n    constructor(arg, max) {\n      super(\"max\");\n      this.arg = arg;\n      this.min = arg.min;\n      this.max = max;\n    }\n\n    visit(visitor) {\n      visitor.visitMin(this);\n    }\n\n  }\n\n  class AstVariable extends AstNode {\n    constructor(index, min, max) {\n      super(\"var\");\n      this.index = index;\n      this.min = min;\n      this.max = max;\n    }\n\n    visit(visitor) {\n      visitor.visitVariable(this);\n    }\n\n  }\n\n  class AstVariableDefinition extends AstNode {\n    constructor(variable, arg) {\n      super(\"definition\");\n      this.variable = variable;\n      this.arg = arg;\n    }\n\n    visit(visitor) {\n      visitor.visitVariableDefinition(this);\n    }\n\n  }\n\n  class ExpressionBuilderVisitor {\n    constructor() {\n      this.parts = [];\n    }\n\n    visitArgument(arg) {\n      this.parts.push(\"Math.max(\", arg.min, \", Math.min(\", arg.max, \", src[srcOffset + \", arg.index, \"]))\");\n    }\n\n    visitVariable(variable) {\n      this.parts.push(\"v\", variable.index);\n    }\n\n    visitLiteral(literal) {\n      this.parts.push(literal.number);\n    }\n\n    visitBinaryOperation(operation) {\n      this.parts.push(\"(\");\n      operation.arg1.visit(this);\n      this.parts.push(\" \", operation.op, \" \");\n      operation.arg2.visit(this);\n      this.parts.push(\")\");\n    }\n\n    visitVariableDefinition(definition) {\n      this.parts.push(\"var \");\n      definition.variable.visit(this);\n      this.parts.push(\" = \");\n      definition.arg.visit(this);\n      this.parts.push(\";\");\n    }\n\n    visitMin(max) {\n      this.parts.push(\"Math.min(\");\n      max.arg.visit(this);\n      this.parts.push(\", \", max.max, \")\");\n    }\n\n    toString() {\n      return this.parts.join(\"\");\n    }\n\n  }\n\n  function buildAddOperation(num1, num2) {\n    if (num2.type === \"literal\" && num2.number === 0) {\n      return num1;\n    }\n\n    if (num1.type === \"literal\" && num1.number === 0) {\n      return num2;\n    }\n\n    if (num2.type === \"literal\" && num1.type === \"literal\") {\n      return new AstLiteral(num1.number + num2.number);\n    }\n\n    return new AstBinaryOperation(\"+\", num1, num2, num1.min + num2.min, num1.max + num2.max);\n  }\n\n  function buildMulOperation(num1, num2) {\n    if (num2.type === \"literal\") {\n      if (num2.number === 0) {\n        return new AstLiteral(0);\n      } else if (num2.number === 1) {\n        return num1;\n      } else if (num1.type === \"literal\") {\n        return new AstLiteral(num1.number * num2.number);\n      }\n    }\n\n    if (num1.type === \"literal\") {\n      if (num1.number === 0) {\n        return new AstLiteral(0);\n      } else if (num1.number === 1) {\n        return num2;\n      }\n    }\n\n    var min = Math.min(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max);\n    var max = Math.max(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max);\n    return new AstBinaryOperation(\"*\", num1, num2, min, max);\n  }\n\n  function buildSubOperation(num1, num2) {\n    if (num2.type === \"literal\") {\n      if (num2.number === 0) {\n        return num1;\n      } else if (num1.type === \"literal\") {\n        return new AstLiteral(num1.number - num2.number);\n      }\n    }\n\n    if (num2.type === \"binary\" && num2.op === \"-\" && num1.type === \"literal\" && num1.number === 1 && num2.arg1.type === \"literal\" && num2.arg1.number === 1) {\n      return num2.arg2;\n    }\n\n    return new AstBinaryOperation(\"-\", num1, num2, num1.min - num2.max, num1.max - num2.min);\n  }\n\n  function buildMinOperation(num1, max) {\n    if (num1.min >= max) {\n      return new AstLiteral(max);\n    } else if (num1.max <= max) {\n      return num1;\n    }\n\n    return new AstMin(num1, max);\n  }\n\n  class PostScriptCompiler {\n    compile(code, domain, range) {\n      var stack = [];\n      var instructions = [];\n      var inputSize = domain.length >> 1,\n          outputSize = range.length >> 1;\n      var lastRegister = 0;\n      var n, j;\n      var num1, num2, ast1, ast2, tmpVar, item;\n\n      for (let i = 0; i < inputSize; i++) {\n        stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1]));\n      }\n\n      for (let i = 0, ii = code.length; i < ii; i++) {\n        item = code[i];\n\n        if (typeof item === \"number\") {\n          stack.push(new AstLiteral(item));\n          continue;\n        }\n\n        switch (item) {\n          case \"add\":\n            if (stack.length < 2) {\n              return null;\n            }\n\n            num2 = stack.pop();\n            num1 = stack.pop();\n            stack.push(buildAddOperation(num1, num2));\n            break;\n\n          case \"cvr\":\n            if (stack.length < 1) {\n              return null;\n            }\n\n            break;\n\n          case \"mul\":\n            if (stack.length < 2) {\n              return null;\n            }\n\n            num2 = stack.pop();\n            num1 = stack.pop();\n            stack.push(buildMulOperation(num1, num2));\n            break;\n\n          case \"sub\":\n            if (stack.length < 2) {\n              return null;\n            }\n\n            num2 = stack.pop();\n            num1 = stack.pop();\n            stack.push(buildSubOperation(num1, num2));\n            break;\n\n          case \"exch\":\n            if (stack.length < 2) {\n              return null;\n            }\n\n            ast1 = stack.pop();\n            ast2 = stack.pop();\n            stack.push(ast1, ast2);\n            break;\n\n          case \"pop\":\n            if (stack.length < 1) {\n              return null;\n            }\n\n            stack.pop();\n            break;\n\n          case \"index\":\n            if (stack.length < 1) {\n              return null;\n            }\n\n            num1 = stack.pop();\n\n            if (num1.type !== \"literal\") {\n              return null;\n            }\n\n            n = num1.number;\n\n            if (n < 0 || !Number.isInteger(n) || stack.length < n) {\n              return null;\n            }\n\n            ast1 = stack[stack.length - n - 1];\n\n            if (ast1.type === \"literal\" || ast1.type === \"var\") {\n              stack.push(ast1);\n              break;\n            }\n\n            tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);\n            stack[stack.length - n - 1] = tmpVar;\n            stack.push(tmpVar);\n            instructions.push(new AstVariableDefinition(tmpVar, ast1));\n            break;\n\n          case \"dup\":\n            if (stack.length < 1) {\n              return null;\n            }\n\n            if (typeof code[i + 1] === \"number\" && code[i + 2] === \"gt\" && code[i + 3] === i + 7 && code[i + 4] === \"jz\" && code[i + 5] === \"pop\" && code[i + 6] === code[i + 1]) {\n              num1 = stack.pop();\n              stack.push(buildMinOperation(num1, code[i + 1]));\n              i += 6;\n              break;\n            }\n\n            ast1 = stack[stack.length - 1];\n\n            if (ast1.type === \"literal\" || ast1.type === \"var\") {\n              stack.push(ast1);\n              break;\n            }\n\n            tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);\n            stack[stack.length - 1] = tmpVar;\n            stack.push(tmpVar);\n            instructions.push(new AstVariableDefinition(tmpVar, ast1));\n            break;\n\n          case \"roll\":\n            if (stack.length < 2) {\n              return null;\n            }\n\n            num2 = stack.pop();\n            num1 = stack.pop();\n\n            if (num2.type !== \"literal\" || num1.type !== \"literal\") {\n              return null;\n            }\n\n            j = num2.number;\n            n = num1.number;\n\n            if (n <= 0 || !Number.isInteger(n) || !Number.isInteger(j) || stack.length < n) {\n              return null;\n            }\n\n            j = (j % n + n) % n;\n\n            if (j === 0) {\n              break;\n            }\n\n            Array.prototype.push.apply(stack, stack.splice(stack.length - n, n - j));\n            break;\n\n          default:\n            return null;\n        }\n      }\n\n      if (stack.length !== outputSize) {\n        return null;\n      }\n\n      var result = [];\n      instructions.forEach(function (instruction) {\n        var statementBuilder = new ExpressionBuilderVisitor();\n        instruction.visit(statementBuilder);\n        result.push(statementBuilder.toString());\n      });\n      stack.forEach(function (expr, i) {\n        var statementBuilder = new ExpressionBuilderVisitor();\n        expr.visit(statementBuilder);\n        var min = range[i * 2],\n            max = range[i * 2 + 1];\n        var out = [statementBuilder.toString()];\n\n        if (min > expr.min) {\n          out.unshift(\"Math.max(\", min, \", \");\n          out.push(\")\");\n        }\n\n        if (max < expr.max) {\n          out.unshift(\"Math.min(\", max, \", \");\n          out.push(\")\");\n        }\n\n        out.unshift(\"dest[destOffset + \", i, \"] = \");\n        out.push(\";\");\n        result.push(out.join(\"\"));\n      });\n      return result.join(\"\\n\");\n    }\n\n  }\n\n  return PostScriptCompiler;\n}();\n\nexports.PostScriptCompiler = PostScriptCompiler;\n\n/***/ }),\n/* 42 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PostScriptParser = exports.PostScriptLexer = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _primitives = __w_pdfjs_require__(5);\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nclass PostScriptParser {\n  constructor(lexer) {\n    this.lexer = lexer;\n    this.operators = [];\n    this.token = null;\n    this.prev = null;\n  }\n\n  nextToken() {\n    this.prev = this.token;\n    this.token = this.lexer.getToken();\n  }\n\n  accept(type) {\n    if (this.token.type === type) {\n      this.nextToken();\n      return true;\n    }\n\n    return false;\n  }\n\n  expect(type) {\n    if (this.accept(type)) {\n      return true;\n    }\n\n    throw new _util.FormatError(`Unexpected symbol: found ${this.token.type} expected ${type}.`);\n  }\n\n  parse() {\n    this.nextToken();\n    this.expect(PostScriptTokenTypes.LBRACE);\n    this.parseBlock();\n    this.expect(PostScriptTokenTypes.RBRACE);\n    return this.operators;\n  }\n\n  parseBlock() {\n    while (true) {\n      if (this.accept(PostScriptTokenTypes.NUMBER)) {\n        this.operators.push(this.prev.value);\n      } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {\n        this.operators.push(this.prev.value);\n      } else if (this.accept(PostScriptTokenTypes.LBRACE)) {\n        this.parseCondition();\n      } else {\n        return;\n      }\n    }\n  }\n\n  parseCondition() {\n    const conditionLocation = this.operators.length;\n    this.operators.push(null, null);\n    this.parseBlock();\n    this.expect(PostScriptTokenTypes.RBRACE);\n\n    if (this.accept(PostScriptTokenTypes.IF)) {\n      this.operators[conditionLocation] = this.operators.length;\n      this.operators[conditionLocation + 1] = \"jz\";\n    } else if (this.accept(PostScriptTokenTypes.LBRACE)) {\n      const jumpLocation = this.operators.length;\n      this.operators.push(null, null);\n      const endOfTrue = this.operators.length;\n      this.parseBlock();\n      this.expect(PostScriptTokenTypes.RBRACE);\n      this.expect(PostScriptTokenTypes.IFELSE);\n      this.operators[jumpLocation] = this.operators.length;\n      this.operators[jumpLocation + 1] = \"j\";\n      this.operators[conditionLocation] = endOfTrue;\n      this.operators[conditionLocation + 1] = \"jz\";\n    } else {\n      throw new _util.FormatError(\"PS Function: error parsing conditional.\");\n    }\n  }\n\n}\n\nexports.PostScriptParser = PostScriptParser;\nconst PostScriptTokenTypes = {\n  LBRACE: 0,\n  RBRACE: 1,\n  NUMBER: 2,\n  OPERATOR: 3,\n  IF: 4,\n  IFELSE: 5\n};\n\nconst PostScriptToken = function PostScriptTokenClosure() {\n  const opCache = Object.create(null);\n\n  class PostScriptToken {\n    constructor(type, value) {\n      this.type = type;\n      this.value = value;\n    }\n\n    static getOperator(op) {\n      const opValue = opCache[op];\n\n      if (opValue) {\n        return opValue;\n      }\n\n      return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);\n    }\n\n    static get LBRACE() {\n      return (0, _util.shadow)(this, \"LBRACE\", new PostScriptToken(PostScriptTokenTypes.LBRACE, \"{\"));\n    }\n\n    static get RBRACE() {\n      return (0, _util.shadow)(this, \"RBRACE\", new PostScriptToken(PostScriptTokenTypes.RBRACE, \"}\"));\n    }\n\n    static get IF() {\n      return (0, _util.shadow)(this, \"IF\", new PostScriptToken(PostScriptTokenTypes.IF, \"IF\"));\n    }\n\n    static get IFELSE() {\n      return (0, _util.shadow)(this, \"IFELSE\", new PostScriptToken(PostScriptTokenTypes.IFELSE, \"IFELSE\"));\n    }\n\n  }\n\n  return PostScriptToken;\n}();\n\nclass PostScriptLexer {\n  constructor(stream) {\n    this.stream = stream;\n    this.nextChar();\n    this.strBuf = [];\n  }\n\n  nextChar() {\n    return this.currentChar = this.stream.getByte();\n  }\n\n  getToken() {\n    let comment = false;\n    let ch = this.currentChar;\n\n    while (true) {\n      if (ch < 0) {\n        return _primitives.EOF;\n      }\n\n      if (comment) {\n        if (ch === 0x0a || ch === 0x0d) {\n          comment = false;\n        }\n      } else if (ch === 0x25) {\n        comment = true;\n      } else if (!(0, _core_utils.isWhiteSpace)(ch)) {\n        break;\n      }\n\n      ch = this.nextChar();\n    }\n\n    switch (ch | 0) {\n      case 0x30:\n      case 0x31:\n      case 0x32:\n      case 0x33:\n      case 0x34:\n      case 0x35:\n      case 0x36:\n      case 0x37:\n      case 0x38:\n      case 0x39:\n      case 0x2b:\n      case 0x2d:\n      case 0x2e:\n        return new PostScriptToken(PostScriptTokenTypes.NUMBER, this.getNumber());\n\n      case 0x7b:\n        this.nextChar();\n        return PostScriptToken.LBRACE;\n\n      case 0x7d:\n        this.nextChar();\n        return PostScriptToken.RBRACE;\n    }\n\n    const strBuf = this.strBuf;\n    strBuf.length = 0;\n    strBuf[0] = String.fromCharCode(ch);\n\n    while ((ch = this.nextChar()) >= 0 && (ch >= 0x41 && ch <= 0x5a || ch >= 0x61 && ch <= 0x7a)) {\n      strBuf.push(String.fromCharCode(ch));\n    }\n\n    const str = strBuf.join(\"\");\n\n    switch (str.toLowerCase()) {\n      case \"if\":\n        return PostScriptToken.IF;\n\n      case \"ifelse\":\n        return PostScriptToken.IFELSE;\n\n      default:\n        return PostScriptToken.getOperator(str);\n    }\n  }\n\n  getNumber() {\n    let ch = this.currentChar;\n    const strBuf = this.strBuf;\n    strBuf.length = 0;\n    strBuf[0] = String.fromCharCode(ch);\n\n    while ((ch = this.nextChar()) >= 0) {\n      if (ch >= 0x30 && ch <= 0x39 || ch === 0x2d || ch === 0x2e) {\n        strBuf.push(String.fromCharCode(ch));\n      } else {\n        break;\n      }\n    }\n\n    const value = parseFloat(strBuf.join(\"\"));\n\n    if (isNaN(value)) {\n      throw new _util.FormatError(`Invalid floating point number: ${value}`);\n    }\n\n    return value;\n  }\n\n}\n\nexports.PostScriptLexer = PostScriptLexer;\n\n/***/ }),\n/* 43 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.bidi = bidi;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar baseTypes = [\"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"S\", \"B\", \"S\", \"WS\", \"B\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"B\", \"B\", \"B\", \"S\", \"WS\", \"ON\", \"ON\", \"ET\", \"ET\", \"ET\", \"ON\", \"ON\", \"ON\", \"ON\", \"ON\", \"ES\", \"CS\", \"ES\", \"CS\", \"CS\", \"EN\", \"EN\", \"EN\", \"EN\", \"EN\", \"EN\", \"EN\", \"EN\", \"EN\", \"EN\", \"CS\", \"ON\", \"ON\", \"ON\", \"ON\", \"ON\", \"ON\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"ON\", \"ON\", \"ON\", \"ON\", \"ON\", \"ON\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"ON\", \"ON\", \"ON\", \"ON\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"B\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"CS\", \"ON\", \"ET\", \"ET\", \"ET\", \"ET\", \"ON\", \"ON\", \"ON\", \"ON\", \"L\", \"ON\", \"ON\", \"BN\", \"ON\", \"ON\", \"ET\", \"ET\", \"EN\", \"EN\", \"ON\", \"L\", \"ON\", \"ON\", \"ON\", \"EN\", \"L\", \"ON\", \"ON\", \"ON\", \"ON\", \"ON\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"ON\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"ON\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\"];\nvar arabicTypes = [\"AN\", \"AN\", \"AN\", \"AN\", \"AN\", \"AN\", \"ON\", \"ON\", \"AL\", \"ET\", \"ET\", \"AL\", \"CS\", \"AL\", \"ON\", \"ON\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"AL\", \"AL\", \"\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"AN\", \"AN\", \"AN\", \"AN\", \"AN\", \"AN\", \"AN\", \"AN\", \"AN\", \"AN\", \"ET\", \"AN\", \"AN\", \"AL\", \"AL\", \"AL\", \"NSM\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"AN\", \"ON\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"AL\", \"AL\", \"NSM\", \"NSM\", \"ON\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"AL\", \"AL\", \"EN\", \"EN\", \"EN\", \"EN\", \"EN\", \"EN\", \"EN\", \"EN\", \"EN\", \"EN\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\"];\n\nfunction isOdd(i) {\n  return (i & 1) !== 0;\n}\n\nfunction isEven(i) {\n  return (i & 1) === 0;\n}\n\nfunction findUnequal(arr, start, value) {\n  for (var j = start, jj = arr.length; j < jj; ++j) {\n    if (arr[j] !== value) {\n      return j;\n    }\n  }\n\n  return j;\n}\n\nfunction setValues(arr, start, end, value) {\n  for (var j = start; j < end; ++j) {\n    arr[j] = value;\n  }\n}\n\nfunction reverseValues(arr, start, end) {\n  for (var i = start, j = end - 1; i < j; ++i, --j) {\n    var temp = arr[i];\n    arr[i] = arr[j];\n    arr[j] = temp;\n  }\n}\n\nfunction createBidiText(str, isLTR, vertical = false) {\n  let dir = \"ltr\";\n\n  if (vertical) {\n    dir = \"ttb\";\n  } else if (!isLTR) {\n    dir = \"rtl\";\n  }\n\n  return {\n    str,\n    dir\n  };\n}\n\nvar chars = [];\nvar types = [];\n\nfunction bidi(str, startLevel, vertical) {\n  var isLTR = true;\n  var strLength = str.length;\n\n  if (strLength === 0 || vertical) {\n    return createBidiText(str, isLTR, vertical);\n  }\n\n  chars.length = strLength;\n  types.length = strLength;\n  var numBidi = 0;\n  var i, ii;\n\n  for (i = 0; i < strLength; ++i) {\n    chars[i] = str.charAt(i);\n    var charCode = str.charCodeAt(i);\n    var charType = \"L\";\n\n    if (charCode <= 0x00ff) {\n      charType = baseTypes[charCode];\n    } else if (0x0590 <= charCode && charCode <= 0x05f4) {\n      charType = \"R\";\n    } else if (0x0600 <= charCode && charCode <= 0x06ff) {\n      charType = arabicTypes[charCode & 0xff];\n\n      if (!charType) {\n        (0, _util.warn)(\"Bidi: invalid Unicode character \" + charCode.toString(16));\n      }\n    } else if (0x0700 <= charCode && charCode <= 0x08ac) {\n      charType = \"AL\";\n    }\n\n    if (charType === \"R\" || charType === \"AL\" || charType === \"AN\") {\n      numBidi++;\n    }\n\n    types[i] = charType;\n  }\n\n  if (numBidi === 0) {\n    isLTR = true;\n    return createBidiText(str, isLTR);\n  }\n\n  if (startLevel === -1) {\n    if (numBidi / strLength < 0.3) {\n      isLTR = true;\n      startLevel = 0;\n    } else {\n      isLTR = false;\n      startLevel = 1;\n    }\n  }\n\n  var levels = [];\n\n  for (i = 0; i < strLength; ++i) {\n    levels[i] = startLevel;\n  }\n\n  var e = isOdd(startLevel) ? \"R\" : \"L\";\n  var sor = e;\n  var eor = sor;\n  var lastType = sor;\n\n  for (i = 0; i < strLength; ++i) {\n    if (types[i] === \"NSM\") {\n      types[i] = lastType;\n    } else {\n      lastType = types[i];\n    }\n  }\n\n  lastType = sor;\n  var t;\n\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n\n    if (t === \"EN\") {\n      types[i] = lastType === \"AL\" ? \"AN\" : \"EN\";\n    } else if (t === \"R\" || t === \"L\" || t === \"AL\") {\n      lastType = t;\n    }\n  }\n\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n\n    if (t === \"AL\") {\n      types[i] = \"R\";\n    }\n  }\n\n  for (i = 1; i < strLength - 1; ++i) {\n    if (types[i] === \"ES\" && types[i - 1] === \"EN\" && types[i + 1] === \"EN\") {\n      types[i] = \"EN\";\n    }\n\n    if (types[i] === \"CS\" && (types[i - 1] === \"EN\" || types[i - 1] === \"AN\") && types[i + 1] === types[i - 1]) {\n      types[i] = types[i - 1];\n    }\n  }\n\n  for (i = 0; i < strLength; ++i) {\n    if (types[i] === \"EN\") {\n      var j;\n\n      for (j = i - 1; j >= 0; --j) {\n        if (types[j] !== \"ET\") {\n          break;\n        }\n\n        types[j] = \"EN\";\n      }\n\n      for (j = i + 1; j < strLength; ++j) {\n        if (types[j] !== \"ET\") {\n          break;\n        }\n\n        types[j] = \"EN\";\n      }\n    }\n  }\n\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n\n    if (t === \"WS\" || t === \"ES\" || t === \"ET\" || t === \"CS\") {\n      types[i] = \"ON\";\n    }\n  }\n\n  lastType = sor;\n\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n\n    if (t === \"EN\") {\n      types[i] = lastType === \"L\" ? \"L\" : \"EN\";\n    } else if (t === \"R\" || t === \"L\") {\n      lastType = t;\n    }\n  }\n\n  for (i = 0; i < strLength; ++i) {\n    if (types[i] === \"ON\") {\n      var end = findUnequal(types, i + 1, \"ON\");\n      var before = sor;\n\n      if (i > 0) {\n        before = types[i - 1];\n      }\n\n      var after = eor;\n\n      if (end + 1 < strLength) {\n        after = types[end + 1];\n      }\n\n      if (before !== \"L\") {\n        before = \"R\";\n      }\n\n      if (after !== \"L\") {\n        after = \"R\";\n      }\n\n      if (before === after) {\n        setValues(types, i, end, before);\n      }\n\n      i = end - 1;\n    }\n  }\n\n  for (i = 0; i < strLength; ++i) {\n    if (types[i] === \"ON\") {\n      types[i] = e;\n    }\n  }\n\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n\n    if (isEven(levels[i])) {\n      if (t === \"R\") {\n        levels[i] += 1;\n      } else if (t === \"AN\" || t === \"EN\") {\n        levels[i] += 2;\n      }\n    } else {\n      if (t === \"L\" || t === \"AN\" || t === \"EN\") {\n        levels[i] += 1;\n      }\n    }\n  }\n\n  var highestLevel = -1;\n  var lowestOddLevel = 99;\n  var level;\n\n  for (i = 0, ii = levels.length; i < ii; ++i) {\n    level = levels[i];\n\n    if (highestLevel < level) {\n      highestLevel = level;\n    }\n\n    if (lowestOddLevel > level && isOdd(level)) {\n      lowestOddLevel = level;\n    }\n  }\n\n  for (level = highestLevel; level >= lowestOddLevel; --level) {\n    var start = -1;\n\n    for (i = 0, ii = levels.length; i < ii; ++i) {\n      if (levels[i] < level) {\n        if (start >= 0) {\n          reverseValues(chars, start, i);\n          start = -1;\n        }\n      } else if (start < 0) {\n        start = i;\n      }\n    }\n\n    if (start >= 0) {\n      reverseValues(chars, start, levels.length);\n    }\n  }\n\n  for (i = 0, ii = chars.length; i < ii; ++i) {\n    var ch = chars[i];\n\n    if (ch === \"<\" || ch === \">\") {\n      chars[i] = \"\";\n    }\n  }\n\n  return createBidiText(chars.join(\"\"), isLTR);\n}\n\n/***/ }),\n/* 44 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.getMetrics = void 0;\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nconst getMetrics = (0, _core_utils.getLookupTableFactory)(function (t) {\n  t.Courier = 600;\n  t[\"Courier-Bold\"] = 600;\n  t[\"Courier-BoldOblique\"] = 600;\n  t[\"Courier-Oblique\"] = 600;\n  t.Helvetica = (0, _core_utils.getLookupTableFactory)(function (t) {\n    t.space = 278;\n    t.exclam = 278;\n    t.quotedbl = 355;\n    t.numbersign = 556;\n    t.dollar = 556;\n    t.percent = 889;\n    t.ampersand = 667;\n    t.quoteright = 222;\n    t.parenleft = 333;\n    t.parenright = 333;\n    t.asterisk = 389;\n    t.plus = 584;\n    t.comma = 278;\n    t.hyphen = 333;\n    t.period = 278;\n    t.slash = 278;\n    t.zero = 556;\n    t.one = 556;\n    t.two = 556;\n    t.three = 556;\n    t.four = 556;\n    t.five = 556;\n    t.six = 556;\n    t.seven = 556;\n    t.eight = 556;\n    t.nine = 556;\n    t.colon = 278;\n    t.semicolon = 278;\n    t.less = 584;\n    t.equal = 584;\n    t.greater = 584;\n    t.question = 556;\n    t.at = 1015;\n    t.A = 667;\n    t.B = 667;\n    t.C = 722;\n    t.D = 722;\n    t.E = 667;\n    t.F = 611;\n    t.G = 778;\n    t.H = 722;\n    t.I = 278;\n    t.J = 500;\n    t.K = 667;\n    t.L = 556;\n    t.M = 833;\n    t.N = 722;\n    t.O = 778;\n    t.P = 667;\n    t.Q = 778;\n    t.R = 722;\n    t.S = 667;\n    t.T = 611;\n    t.U = 722;\n    t.V = 667;\n    t.W = 944;\n    t.X = 667;\n    t.Y = 667;\n    t.Z = 611;\n    t.bracketleft = 278;\n    t.backslash = 278;\n    t.bracketright = 278;\n    t.asciicircum = 469;\n    t.underscore = 556;\n    t.quoteleft = 222;\n    t.a = 556;\n    t.b = 556;\n    t.c = 500;\n    t.d = 556;\n    t.e = 556;\n    t.f = 278;\n    t.g = 556;\n    t.h = 556;\n    t.i = 222;\n    t.j = 222;\n    t.k = 500;\n    t.l = 222;\n    t.m = 833;\n    t.n = 556;\n    t.o = 556;\n    t.p = 556;\n    t.q = 556;\n    t.r = 333;\n    t.s = 500;\n    t.t = 278;\n    t.u = 556;\n    t.v = 500;\n    t.w = 722;\n    t.x = 500;\n    t.y = 500;\n    t.z = 500;\n    t.braceleft = 334;\n    t.bar = 260;\n    t.braceright = 334;\n    t.asciitilde = 584;\n    t.exclamdown = 333;\n    t.cent = 556;\n    t.sterling = 556;\n    t.fraction = 167;\n    t.yen = 556;\n    t.florin = 556;\n    t.section = 556;\n    t.currency = 556;\n    t.quotesingle = 191;\n    t.quotedblleft = 333;\n    t.guillemotleft = 556;\n    t.guilsinglleft = 333;\n    t.guilsinglright = 333;\n    t.fi = 500;\n    t.fl = 500;\n    t.endash = 556;\n    t.dagger = 556;\n    t.daggerdbl = 556;\n    t.periodcentered = 278;\n    t.paragraph = 537;\n    t.bullet = 350;\n    t.quotesinglbase = 222;\n    t.quotedblbase = 333;\n    t.quotedblright = 333;\n    t.guillemotright = 556;\n    t.ellipsis = 1000;\n    t.perthousand = 1000;\n    t.questiondown = 611;\n    t.grave = 333;\n    t.acute = 333;\n    t.circumflex = 333;\n    t.tilde = 333;\n    t.macron = 333;\n    t.breve = 333;\n    t.dotaccent = 333;\n    t.dieresis = 333;\n    t.ring = 333;\n    t.cedilla = 333;\n    t.hungarumlaut = 333;\n    t.ogonek = 333;\n    t.caron = 333;\n    t.emdash = 1000;\n    t.AE = 1000;\n    t.ordfeminine = 370;\n    t.Lslash = 556;\n    t.Oslash = 778;\n    t.OE = 1000;\n    t.ordmasculine = 365;\n    t.ae = 889;\n    t.dotlessi = 278;\n    t.lslash = 222;\n    t.oslash = 611;\n    t.oe = 944;\n    t.germandbls = 611;\n    t.Idieresis = 278;\n    t.eacute = 556;\n    t.abreve = 556;\n    t.uhungarumlaut = 556;\n    t.ecaron = 556;\n    t.Ydieresis = 667;\n    t.divide = 584;\n    t.Yacute = 667;\n    t.Acircumflex = 667;\n    t.aacute = 556;\n    t.Ucircumflex = 722;\n    t.yacute = 500;\n    t.scommaaccent = 500;\n    t.ecircumflex = 556;\n    t.Uring = 722;\n    t.Udieresis = 722;\n    t.aogonek = 556;\n    t.Uacute = 722;\n    t.uogonek = 556;\n    t.Edieresis = 667;\n    t.Dcroat = 722;\n    t.commaaccent = 250;\n    t.copyright = 737;\n    t.Emacron = 667;\n    t.ccaron = 500;\n    t.aring = 556;\n    t.Ncommaaccent = 722;\n    t.lacute = 222;\n    t.agrave = 556;\n    t.Tcommaaccent = 611;\n    t.Cacute = 722;\n    t.atilde = 556;\n    t.Edotaccent = 667;\n    t.scaron = 500;\n    t.scedilla = 500;\n    t.iacute = 278;\n    t.lozenge = 471;\n    t.Rcaron = 722;\n    t.Gcommaaccent = 778;\n    t.ucircumflex = 556;\n    t.acircumflex = 556;\n    t.Amacron = 667;\n    t.rcaron = 333;\n    t.ccedilla = 500;\n    t.Zdotaccent = 611;\n    t.Thorn = 667;\n    t.Omacron = 778;\n    t.Racute = 722;\n    t.Sacute = 667;\n    t.dcaron = 643;\n    t.Umacron = 722;\n    t.uring = 556;\n    t.threesuperior = 333;\n    t.Ograve = 778;\n    t.Agrave = 667;\n    t.Abreve = 667;\n    t.multiply = 584;\n    t.uacute = 556;\n    t.Tcaron = 611;\n    t.partialdiff = 476;\n    t.ydieresis = 500;\n    t.Nacute = 722;\n    t.icircumflex = 278;\n    t.Ecircumflex = 667;\n    t.adieresis = 556;\n    t.edieresis = 556;\n    t.cacute = 500;\n    t.nacute = 556;\n    t.umacron = 556;\n    t.Ncaron = 722;\n    t.Iacute = 278;\n    t.plusminus = 584;\n    t.brokenbar = 260;\n    t.registered = 737;\n    t.Gbreve = 778;\n    t.Idotaccent = 278;\n    t.summation = 600;\n    t.Egrave = 667;\n    t.racute = 333;\n    t.omacron = 556;\n    t.Zacute = 611;\n    t.Zcaron = 611;\n    t.greaterequal = 549;\n    t.Eth = 722;\n    t.Ccedilla = 722;\n    t.lcommaaccent = 222;\n    t.tcaron = 317;\n    t.eogonek = 556;\n    t.Uogonek = 722;\n    t.Aacute = 667;\n    t.Adieresis = 667;\n    t.egrave = 556;\n    t.zacute = 500;\n    t.iogonek = 222;\n    t.Oacute = 778;\n    t.oacute = 556;\n    t.amacron = 556;\n    t.sacute = 500;\n    t.idieresis = 278;\n    t.Ocircumflex = 778;\n    t.Ugrave = 722;\n    t.Delta = 612;\n    t.thorn = 556;\n    t.twosuperior = 333;\n    t.Odieresis = 778;\n    t.mu = 556;\n    t.igrave = 278;\n    t.ohungarumlaut = 556;\n    t.Eogonek = 667;\n    t.dcroat = 556;\n    t.threequarters = 834;\n    t.Scedilla = 667;\n    t.lcaron = 299;\n    t.Kcommaaccent = 667;\n    t.Lacute = 556;\n    t.trademark = 1000;\n    t.edotaccent = 556;\n    t.Igrave = 278;\n    t.Imacron = 278;\n    t.Lcaron = 556;\n    t.onehalf = 834;\n    t.lessequal = 549;\n    t.ocircumflex = 556;\n    t.ntilde = 556;\n    t.Uhungarumlaut = 722;\n    t.Eacute = 667;\n    t.emacron = 556;\n    t.gbreve = 556;\n    t.onequarter = 834;\n    t.Scaron = 667;\n    t.Scommaaccent = 667;\n    t.Ohungarumlaut = 778;\n    t.degree = 400;\n    t.ograve = 556;\n    t.Ccaron = 722;\n    t.ugrave = 556;\n    t.radical = 453;\n    t.Dcaron = 722;\n    t.rcommaaccent = 333;\n    t.Ntilde = 722;\n    t.otilde = 556;\n    t.Rcommaaccent = 722;\n    t.Lcommaaccent = 556;\n    t.Atilde = 667;\n    t.Aogonek = 667;\n    t.Aring = 667;\n    t.Otilde = 778;\n    t.zdotaccent = 500;\n    t.Ecaron = 667;\n    t.Iogonek = 278;\n    t.kcommaaccent = 500;\n    t.minus = 584;\n    t.Icircumflex = 278;\n    t.ncaron = 556;\n    t.tcommaaccent = 278;\n    t.logicalnot = 584;\n    t.odieresis = 556;\n    t.udieresis = 556;\n    t.notequal = 549;\n    t.gcommaaccent = 556;\n    t.eth = 556;\n    t.zcaron = 500;\n    t.ncommaaccent = 556;\n    t.onesuperior = 333;\n    t.imacron = 278;\n    t.Euro = 556;\n  });\n  t[\"Helvetica-Bold\"] = (0, _core_utils.getLookupTableFactory)(function (t) {\n    t.space = 278;\n    t.exclam = 333;\n    t.quotedbl = 474;\n    t.numbersign = 556;\n    t.dollar = 556;\n    t.percent = 889;\n    t.ampersand = 722;\n    t.quoteright = 278;\n    t.parenleft = 333;\n    t.parenright = 333;\n    t.asterisk = 389;\n    t.plus = 584;\n    t.comma = 278;\n    t.hyphen = 333;\n    t.period = 278;\n    t.slash = 278;\n    t.zero = 556;\n    t.one = 556;\n    t.two = 556;\n    t.three = 556;\n    t.four = 556;\n    t.five = 556;\n    t.six = 556;\n    t.seven = 556;\n    t.eight = 556;\n    t.nine = 556;\n    t.colon = 333;\n    t.semicolon = 333;\n    t.less = 584;\n    t.equal = 584;\n    t.greater = 584;\n    t.question = 611;\n    t.at = 975;\n    t.A = 722;\n    t.B = 722;\n    t.C = 722;\n    t.D = 722;\n    t.E = 667;\n    t.F = 611;\n    t.G = 778;\n    t.H = 722;\n    t.I = 278;\n    t.J = 556;\n    t.K = 722;\n    t.L = 611;\n    t.M = 833;\n    t.N = 722;\n    t.O = 778;\n    t.P = 667;\n    t.Q = 778;\n    t.R = 722;\n    t.S = 667;\n    t.T = 611;\n    t.U = 722;\n    t.V = 667;\n    t.W = 944;\n    t.X = 667;\n    t.Y = 667;\n    t.Z = 611;\n    t.bracketleft = 333;\n    t.backslash = 278;\n    t.bracketright = 333;\n    t.asciicircum = 584;\n    t.underscore = 556;\n    t.quoteleft = 278;\n    t.a = 556;\n    t.b = 611;\n    t.c = 556;\n    t.d = 611;\n    t.e = 556;\n    t.f = 333;\n    t.g = 611;\n    t.h = 611;\n    t.i = 278;\n    t.j = 278;\n    t.k = 556;\n    t.l = 278;\n    t.m = 889;\n    t.n = 611;\n    t.o = 611;\n    t.p = 611;\n    t.q = 611;\n    t.r = 389;\n    t.s = 556;\n    t.t = 333;\n    t.u = 611;\n    t.v = 556;\n    t.w = 778;\n    t.x = 556;\n    t.y = 556;\n    t.z = 500;\n    t.braceleft = 389;\n    t.bar = 280;\n    t.braceright = 389;\n    t.asciitilde = 584;\n    t.exclamdown = 333;\n    t.cent = 556;\n    t.sterling = 556;\n    t.fraction = 167;\n    t.yen = 556;\n    t.florin = 556;\n    t.section = 556;\n    t.currency = 556;\n    t.quotesingle = 238;\n    t.quotedblleft = 500;\n    t.guillemotleft = 556;\n    t.guilsinglleft = 333;\n    t.guilsinglright = 333;\n    t.fi = 611;\n    t.fl = 611;\n    t.endash = 556;\n    t.dagger = 556;\n    t.daggerdbl = 556;\n    t.periodcentered = 278;\n    t.paragraph = 556;\n    t.bullet = 350;\n    t.quotesinglbase = 278;\n    t.quotedblbase = 500;\n    t.quotedblright = 500;\n    t.guillemotright = 556;\n    t.ellipsis = 1000;\n    t.perthousand = 1000;\n    t.questiondown = 611;\n    t.grave = 333;\n    t.acute = 333;\n    t.circumflex = 333;\n    t.tilde = 333;\n    t.macron = 333;\n    t.breve = 333;\n    t.dotaccent = 333;\n    t.dieresis = 333;\n    t.ring = 333;\n    t.cedilla = 333;\n    t.hungarumlaut = 333;\n    t.ogonek = 333;\n    t.caron = 333;\n    t.emdash = 1000;\n    t.AE = 1000;\n    t.ordfeminine = 370;\n    t.Lslash = 611;\n    t.Oslash = 778;\n    t.OE = 1000;\n    t.ordmasculine = 365;\n    t.ae = 889;\n    t.dotlessi = 278;\n    t.lslash = 278;\n    t.oslash = 611;\n    t.oe = 944;\n    t.germandbls = 611;\n    t.Idieresis = 278;\n    t.eacute = 556;\n    t.abreve = 556;\n    t.uhungarumlaut = 611;\n    t.ecaron = 556;\n    t.Ydieresis = 667;\n    t.divide = 584;\n    t.Yacute = 667;\n    t.Acircumflex = 722;\n    t.aacute = 556;\n    t.Ucircumflex = 722;\n    t.yacute = 556;\n    t.scommaaccent = 556;\n    t.ecircumflex = 556;\n    t.Uring = 722;\n    t.Udieresis = 722;\n    t.aogonek = 556;\n    t.Uacute = 722;\n    t.uogonek = 611;\n    t.Edieresis = 667;\n    t.Dcroat = 722;\n    t.commaaccent = 250;\n    t.copyright = 737;\n    t.Emacron = 667;\n    t.ccaron = 556;\n    t.aring = 556;\n    t.Ncommaaccent = 722;\n    t.lacute = 278;\n    t.agrave = 556;\n    t.Tcommaaccent = 611;\n    t.Cacute = 722;\n    t.atilde = 556;\n    t.Edotaccent = 667;\n    t.scaron = 556;\n    t.scedilla = 556;\n    t.iacute = 278;\n    t.lozenge = 494;\n    t.Rcaron = 722;\n    t.Gcommaaccent = 778;\n    t.ucircumflex = 611;\n    t.acircumflex = 556;\n    t.Amacron = 722;\n    t.rcaron = 389;\n    t.ccedilla = 556;\n    t.Zdotaccent = 611;\n    t.Thorn = 667;\n    t.Omacron = 778;\n    t.Racute = 722;\n    t.Sacute = 667;\n    t.dcaron = 743;\n    t.Umacron = 722;\n    t.uring = 611;\n    t.threesuperior = 333;\n    t.Ograve = 778;\n    t.Agrave = 722;\n    t.Abreve = 722;\n    t.multiply = 584;\n    t.uacute = 611;\n    t.Tcaron = 611;\n    t.partialdiff = 494;\n    t.ydieresis = 556;\n    t.Nacute = 722;\n    t.icircumflex = 278;\n    t.Ecircumflex = 667;\n    t.adieresis = 556;\n    t.edieresis = 556;\n    t.cacute = 556;\n    t.nacute = 611;\n    t.umacron = 611;\n    t.Ncaron = 722;\n    t.Iacute = 278;\n    t.plusminus = 584;\n    t.brokenbar = 280;\n    t.registered = 737;\n    t.Gbreve = 778;\n    t.Idotaccent = 278;\n    t.summation = 600;\n    t.Egrave = 667;\n    t.racute = 389;\n    t.omacron = 611;\n    t.Zacute = 611;\n    t.Zcaron = 611;\n    t.greaterequal = 549;\n    t.Eth = 722;\n    t.Ccedilla = 722;\n    t.lcommaaccent = 278;\n    t.tcaron = 389;\n    t.eogonek = 556;\n    t.Uogonek = 722;\n    t.Aacute = 722;\n    t.Adieresis = 722;\n    t.egrave = 556;\n    t.zacute = 500;\n    t.iogonek = 278;\n    t.Oacute = 778;\n    t.oacute = 611;\n    t.amacron = 556;\n    t.sacute = 556;\n    t.idieresis = 278;\n    t.Ocircumflex = 778;\n    t.Ugrave = 722;\n    t.Delta = 612;\n    t.thorn = 611;\n    t.twosuperior = 333;\n    t.Odieresis = 778;\n    t.mu = 611;\n    t.igrave = 278;\n    t.ohungarumlaut = 611;\n    t.Eogonek = 667;\n    t.dcroat = 611;\n    t.threequarters = 834;\n    t.Scedilla = 667;\n    t.lcaron = 400;\n    t.Kcommaaccent = 722;\n    t.Lacute = 611;\n    t.trademark = 1000;\n    t.edotaccent = 556;\n    t.Igrave = 278;\n    t.Imacron = 278;\n    t.Lcaron = 611;\n    t.onehalf = 834;\n    t.lessequal = 549;\n    t.ocircumflex = 611;\n    t.ntilde = 611;\n    t.Uhungarumlaut = 722;\n    t.Eacute = 667;\n    t.emacron = 556;\n    t.gbreve = 611;\n    t.onequarter = 834;\n    t.Scaron = 667;\n    t.Scommaaccent = 667;\n    t.Ohungarumlaut = 778;\n    t.degree = 400;\n    t.ograve = 611;\n    t.Ccaron = 722;\n    t.ugrave = 611;\n    t.radical = 549;\n    t.Dcaron = 722;\n    t.rcommaaccent = 389;\n    t.Ntilde = 722;\n    t.otilde = 611;\n    t.Rcommaaccent = 722;\n    t.Lcommaaccent = 611;\n    t.Atilde = 722;\n    t.Aogonek = 722;\n    t.Aring = 722;\n    t.Otilde = 778;\n    t.zdotaccent = 500;\n    t.Ecaron = 667;\n    t.Iogonek = 278;\n    t.kcommaaccent = 556;\n    t.minus = 584;\n    t.Icircumflex = 278;\n    t.ncaron = 611;\n    t.tcommaaccent = 333;\n    t.logicalnot = 584;\n    t.odieresis = 611;\n    t.udieresis = 611;\n    t.notequal = 549;\n    t.gcommaaccent = 611;\n    t.eth = 611;\n    t.zcaron = 500;\n    t.ncommaaccent = 611;\n    t.onesuperior = 333;\n    t.imacron = 278;\n    t.Euro = 556;\n  });\n  t[\"Helvetica-BoldOblique\"] = (0, _core_utils.getLookupTableFactory)(function (t) {\n    t.space = 278;\n    t.exclam = 333;\n    t.quotedbl = 474;\n    t.numbersign = 556;\n    t.dollar = 556;\n    t.percent = 889;\n    t.ampersand = 722;\n    t.quoteright = 278;\n    t.parenleft = 333;\n    t.parenright = 333;\n    t.asterisk = 389;\n    t.plus = 584;\n    t.comma = 278;\n    t.hyphen = 333;\n    t.period = 278;\n    t.slash = 278;\n    t.zero = 556;\n    t.one = 556;\n    t.two = 556;\n    t.three = 556;\n    t.four = 556;\n    t.five = 556;\n    t.six = 556;\n    t.seven = 556;\n    t.eight = 556;\n    t.nine = 556;\n    t.colon = 333;\n    t.semicolon = 333;\n    t.less = 584;\n    t.equal = 584;\n    t.greater = 584;\n    t.question = 611;\n    t.at = 975;\n    t.A = 722;\n    t.B = 722;\n    t.C = 722;\n    t.D = 722;\n    t.E = 667;\n    t.F = 611;\n    t.G = 778;\n    t.H = 722;\n    t.I = 278;\n    t.J = 556;\n    t.K = 722;\n    t.L = 611;\n    t.M = 833;\n    t.N = 722;\n    t.O = 778;\n    t.P = 667;\n    t.Q = 778;\n    t.R = 722;\n    t.S = 667;\n    t.T = 611;\n    t.U = 722;\n    t.V = 667;\n    t.W = 944;\n    t.X = 667;\n    t.Y = 667;\n    t.Z = 611;\n    t.bracketleft = 333;\n    t.backslash = 278;\n    t.bracketright = 333;\n    t.asciicircum = 584;\n    t.underscore = 556;\n    t.quoteleft = 278;\n    t.a = 556;\n    t.b = 611;\n    t.c = 556;\n    t.d = 611;\n    t.e = 556;\n    t.f = 333;\n    t.g = 611;\n    t.h = 611;\n    t.i = 278;\n    t.j = 278;\n    t.k = 556;\n    t.l = 278;\n    t.m = 889;\n    t.n = 611;\n    t.o = 611;\n    t.p = 611;\n    t.q = 611;\n    t.r = 389;\n    t.s = 556;\n    t.t = 333;\n    t.u = 611;\n    t.v = 556;\n    t.w = 778;\n    t.x = 556;\n    t.y = 556;\n    t.z = 500;\n    t.braceleft = 389;\n    t.bar = 280;\n    t.braceright = 389;\n    t.asciitilde = 584;\n    t.exclamdown = 333;\n    t.cent = 556;\n    t.sterling = 556;\n    t.fraction = 167;\n    t.yen = 556;\n    t.florin = 556;\n    t.section = 556;\n    t.currency = 556;\n    t.quotesingle = 238;\n    t.quotedblleft = 500;\n    t.guillemotleft = 556;\n    t.guilsinglleft = 333;\n    t.guilsinglright = 333;\n    t.fi = 611;\n    t.fl = 611;\n    t.endash = 556;\n    t.dagger = 556;\n    t.daggerdbl = 556;\n    t.periodcentered = 278;\n    t.paragraph = 556;\n    t.bullet = 350;\n    t.quotesinglbase = 278;\n    t.quotedblbase = 500;\n    t.quotedblright = 500;\n    t.guillemotright = 556;\n    t.ellipsis = 1000;\n    t.perthousand = 1000;\n    t.questiondown = 611;\n    t.grave = 333;\n    t.acute = 333;\n    t.circumflex = 333;\n    t.tilde = 333;\n    t.macron = 333;\n    t.breve = 333;\n    t.dotaccent = 333;\n    t.dieresis = 333;\n    t.ring = 333;\n    t.cedilla = 333;\n    t.hungarumlaut = 333;\n    t.ogonek = 333;\n    t.caron = 333;\n    t.emdash = 1000;\n    t.AE = 1000;\n    t.ordfeminine = 370;\n    t.Lslash = 611;\n    t.Oslash = 778;\n    t.OE = 1000;\n    t.ordmasculine = 365;\n    t.ae = 889;\n    t.dotlessi = 278;\n    t.lslash = 278;\n    t.oslash = 611;\n    t.oe = 944;\n    t.germandbls = 611;\n    t.Idieresis = 278;\n    t.eacute = 556;\n    t.abreve = 556;\n    t.uhungarumlaut = 611;\n    t.ecaron = 556;\n    t.Ydieresis = 667;\n    t.divide = 584;\n    t.Yacute = 667;\n    t.Acircumflex = 722;\n    t.aacute = 556;\n    t.Ucircumflex = 722;\n    t.yacute = 556;\n    t.scommaaccent = 556;\n    t.ecircumflex = 556;\n    t.Uring = 722;\n    t.Udieresis = 722;\n    t.aogonek = 556;\n    t.Uacute = 722;\n    t.uogonek = 611;\n    t.Edieresis = 667;\n    t.Dcroat = 722;\n    t.commaaccent = 250;\n    t.copyright = 737;\n    t.Emacron = 667;\n    t.ccaron = 556;\n    t.aring = 556;\n    t.Ncommaaccent = 722;\n    t.lacute = 278;\n    t.agrave = 556;\n    t.Tcommaaccent = 611;\n    t.Cacute = 722;\n    t.atilde = 556;\n    t.Edotaccent = 667;\n    t.scaron = 556;\n    t.scedilla = 556;\n    t.iacute = 278;\n    t.lozenge = 494;\n    t.Rcaron = 722;\n    t.Gcommaaccent = 778;\n    t.ucircumflex = 611;\n    t.acircumflex = 556;\n    t.Amacron = 722;\n    t.rcaron = 389;\n    t.ccedilla = 556;\n    t.Zdotaccent = 611;\n    t.Thorn = 667;\n    t.Omacron = 778;\n    t.Racute = 722;\n    t.Sacute = 667;\n    t.dcaron = 743;\n    t.Umacron = 722;\n    t.uring = 611;\n    t.threesuperior = 333;\n    t.Ograve = 778;\n    t.Agrave = 722;\n    t.Abreve = 722;\n    t.multiply = 584;\n    t.uacute = 611;\n    t.Tcaron = 611;\n    t.partialdiff = 494;\n    t.ydieresis = 556;\n    t.Nacute = 722;\n    t.icircumflex = 278;\n    t.Ecircumflex = 667;\n    t.adieresis = 556;\n    t.edieresis = 556;\n    t.cacute = 556;\n    t.nacute = 611;\n    t.umacron = 611;\n    t.Ncaron = 722;\n    t.Iacute = 278;\n    t.plusminus = 584;\n    t.brokenbar = 280;\n    t.registered = 737;\n    t.Gbreve = 778;\n    t.Idotaccent = 278;\n    t.summation = 600;\n    t.Egrave = 667;\n    t.racute = 389;\n    t.omacron = 611;\n    t.Zacute = 611;\n    t.Zcaron = 611;\n    t.greaterequal = 549;\n    t.Eth = 722;\n    t.Ccedilla = 722;\n    t.lcommaaccent = 278;\n    t.tcaron = 389;\n    t.eogonek = 556;\n    t.Uogonek = 722;\n    t.Aacute = 722;\n    t.Adieresis = 722;\n    t.egrave = 556;\n    t.zacute = 500;\n    t.iogonek = 278;\n    t.Oacute = 778;\n    t.oacute = 611;\n    t.amacron = 556;\n    t.sacute = 556;\n    t.idieresis = 278;\n    t.Ocircumflex = 778;\n    t.Ugrave = 722;\n    t.Delta = 612;\n    t.thorn = 611;\n    t.twosuperior = 333;\n    t.Odieresis = 778;\n    t.mu = 611;\n    t.igrave = 278;\n    t.ohungarumlaut = 611;\n    t.Eogonek = 667;\n    t.dcroat = 611;\n    t.threequarters = 834;\n    t.Scedilla = 667;\n    t.lcaron = 400;\n    t.Kcommaaccent = 722;\n    t.Lacute = 611;\n    t.trademark = 1000;\n    t.edotaccent = 556;\n    t.Igrave = 278;\n    t.Imacron = 278;\n    t.Lcaron = 611;\n    t.onehalf = 834;\n    t.lessequal = 549;\n    t.ocircumflex = 611;\n    t.ntilde = 611;\n    t.Uhungarumlaut = 722;\n    t.Eacute = 667;\n    t.emacron = 556;\n    t.gbreve = 611;\n    t.onequarter = 834;\n    t.Scaron = 667;\n    t.Scommaaccent = 667;\n    t.Ohungarumlaut = 778;\n    t.degree = 400;\n    t.ograve = 611;\n    t.Ccaron = 722;\n    t.ugrave = 611;\n    t.radical = 549;\n    t.Dcaron = 722;\n    t.rcommaaccent = 389;\n    t.Ntilde = 722;\n    t.otilde = 611;\n    t.Rcommaaccent = 722;\n    t.Lcommaaccent = 611;\n    t.Atilde = 722;\n    t.Aogonek = 722;\n    t.Aring = 722;\n    t.Otilde = 778;\n    t.zdotaccent = 500;\n    t.Ecaron = 667;\n    t.Iogonek = 278;\n    t.kcommaaccent = 556;\n    t.minus = 584;\n    t.Icircumflex = 278;\n    t.ncaron = 611;\n    t.tcommaaccent = 333;\n    t.logicalnot = 584;\n    t.odieresis = 611;\n    t.udieresis = 611;\n    t.notequal = 549;\n    t.gcommaaccent = 611;\n    t.eth = 611;\n    t.zcaron = 500;\n    t.ncommaaccent = 611;\n    t.onesuperior = 333;\n    t.imacron = 278;\n    t.Euro = 556;\n  });\n  t[\"Helvetica-Oblique\"] = (0, _core_utils.getLookupTableFactory)(function (t) {\n    t.space = 278;\n    t.exclam = 278;\n    t.quotedbl = 355;\n    t.numbersign = 556;\n    t.dollar = 556;\n    t.percent = 889;\n    t.ampersand = 667;\n    t.quoteright = 222;\n    t.parenleft = 333;\n    t.parenright = 333;\n    t.asterisk = 389;\n    t.plus = 584;\n    t.comma = 278;\n    t.hyphen = 333;\n    t.period = 278;\n    t.slash = 278;\n    t.zero = 556;\n    t.one = 556;\n    t.two = 556;\n    t.three = 556;\n    t.four = 556;\n    t.five = 556;\n    t.six = 556;\n    t.seven = 556;\n    t.eight = 556;\n    t.nine = 556;\n    t.colon = 278;\n    t.semicolon = 278;\n    t.less = 584;\n    t.equal = 584;\n    t.greater = 584;\n    t.question = 556;\n    t.at = 1015;\n    t.A = 667;\n    t.B = 667;\n    t.C = 722;\n    t.D = 722;\n    t.E = 667;\n    t.F = 611;\n    t.G = 778;\n    t.H = 722;\n    t.I = 278;\n    t.J = 500;\n    t.K = 667;\n    t.L = 556;\n    t.M = 833;\n    t.N = 722;\n    t.O = 778;\n    t.P = 667;\n    t.Q = 778;\n    t.R = 722;\n    t.S = 667;\n    t.T = 611;\n    t.U = 722;\n    t.V = 667;\n    t.W = 944;\n    t.X = 667;\n    t.Y = 667;\n    t.Z = 611;\n    t.bracketleft = 278;\n    t.backslash = 278;\n    t.bracketright = 278;\n    t.asciicircum = 469;\n    t.underscore = 556;\n    t.quoteleft = 222;\n    t.a = 556;\n    t.b = 556;\n    t.c = 500;\n    t.d = 556;\n    t.e = 556;\n    t.f = 278;\n    t.g = 556;\n    t.h = 556;\n    t.i = 222;\n    t.j = 222;\n    t.k = 500;\n    t.l = 222;\n    t.m = 833;\n    t.n = 556;\n    t.o = 556;\n    t.p = 556;\n    t.q = 556;\n    t.r = 333;\n    t.s = 500;\n    t.t = 278;\n    t.u = 556;\n    t.v = 500;\n    t.w = 722;\n    t.x = 500;\n    t.y = 500;\n    t.z = 500;\n    t.braceleft = 334;\n    t.bar = 260;\n    t.braceright = 334;\n    t.asciitilde = 584;\n    t.exclamdown = 333;\n    t.cent = 556;\n    t.sterling = 556;\n    t.fraction = 167;\n    t.yen = 556;\n    t.florin = 556;\n    t.section = 556;\n    t.currency = 556;\n    t.quotesingle = 191;\n    t.quotedblleft = 333;\n    t.guillemotleft = 556;\n    t.guilsinglleft = 333;\n    t.guilsinglright = 333;\n    t.fi = 500;\n    t.fl = 500;\n    t.endash = 556;\n    t.dagger = 556;\n    t.daggerdbl = 556;\n    t.periodcentered = 278;\n    t.paragraph = 537;\n    t.bullet = 350;\n    t.quotesinglbase = 222;\n    t.quotedblbase = 333;\n    t.quotedblright = 333;\n    t.guillemotright = 556;\n    t.ellipsis = 1000;\n    t.perthousand = 1000;\n    t.questiondown = 611;\n    t.grave = 333;\n    t.acute = 333;\n    t.circumflex = 333;\n    t.tilde = 333;\n    t.macron = 333;\n    t.breve = 333;\n    t.dotaccent = 333;\n    t.dieresis = 333;\n    t.ring = 333;\n    t.cedilla = 333;\n    t.hungarumlaut = 333;\n    t.ogonek = 333;\n    t.caron = 333;\n    t.emdash = 1000;\n    t.AE = 1000;\n    t.ordfeminine = 370;\n    t.Lslash = 556;\n    t.Oslash = 778;\n    t.OE = 1000;\n    t.ordmasculine = 365;\n    t.ae = 889;\n    t.dotlessi = 278;\n    t.lslash = 222;\n    t.oslash = 611;\n    t.oe = 944;\n    t.germandbls = 611;\n    t.Idieresis = 278;\n    t.eacute = 556;\n    t.abreve = 556;\n    t.uhungarumlaut = 556;\n    t.ecaron = 556;\n    t.Ydieresis = 667;\n    t.divide = 584;\n    t.Yacute = 667;\n    t.Acircumflex = 667;\n    t.aacute = 556;\n    t.Ucircumflex = 722;\n    t.yacute = 500;\n    t.scommaaccent = 500;\n    t.ecircumflex = 556;\n    t.Uring = 722;\n    t.Udieresis = 722;\n    t.aogonek = 556;\n    t.Uacute = 722;\n    t.uogonek = 556;\n    t.Edieresis = 667;\n    t.Dcroat = 722;\n    t.commaaccent = 250;\n    t.copyright = 737;\n    t.Emacron = 667;\n    t.ccaron = 500;\n    t.aring = 556;\n    t.Ncommaaccent = 722;\n    t.lacute = 222;\n    t.agrave = 556;\n    t.Tcommaaccent = 611;\n    t.Cacute = 722;\n    t.atilde = 556;\n    t.Edotaccent = 667;\n    t.scaron = 500;\n    t.scedilla = 500;\n    t.iacute = 278;\n    t.lozenge = 471;\n    t.Rcaron = 722;\n    t.Gcommaaccent = 778;\n    t.ucircumflex = 556;\n    t.acircumflex = 556;\n    t.Amacron = 667;\n    t.rcaron = 333;\n    t.ccedilla = 500;\n    t.Zdotaccent = 611;\n    t.Thorn = 667;\n    t.Omacron = 778;\n    t.Racute = 722;\n    t.Sacute = 667;\n    t.dcaron = 643;\n    t.Umacron = 722;\n    t.uring = 556;\n    t.threesuperior = 333;\n    t.Ograve = 778;\n    t.Agrave = 667;\n    t.Abreve = 667;\n    t.multiply = 584;\n    t.uacute = 556;\n    t.Tcaron = 611;\n    t.partialdiff = 476;\n    t.ydieresis = 500;\n    t.Nacute = 722;\n    t.icircumflex = 278;\n    t.Ecircumflex = 667;\n    t.adieresis = 556;\n    t.edieresis = 556;\n    t.cacute = 500;\n    t.nacute = 556;\n    t.umacron = 556;\n    t.Ncaron = 722;\n    t.Iacute = 278;\n    t.plusminus = 584;\n    t.brokenbar = 260;\n    t.registered = 737;\n    t.Gbreve = 778;\n    t.Idotaccent = 278;\n    t.summation = 600;\n    t.Egrave = 667;\n    t.racute = 333;\n    t.omacron = 556;\n    t.Zacute = 611;\n    t.Zcaron = 611;\n    t.greaterequal = 549;\n    t.Eth = 722;\n    t.Ccedilla = 722;\n    t.lcommaaccent = 222;\n    t.tcaron = 317;\n    t.eogonek = 556;\n    t.Uogonek = 722;\n    t.Aacute = 667;\n    t.Adieresis = 667;\n    t.egrave = 556;\n    t.zacute = 500;\n    t.iogonek = 222;\n    t.Oacute = 778;\n    t.oacute = 556;\n    t.amacron = 556;\n    t.sacute = 500;\n    t.idieresis = 278;\n    t.Ocircumflex = 778;\n    t.Ugrave = 722;\n    t.Delta = 612;\n    t.thorn = 556;\n    t.twosuperior = 333;\n    t.Odieresis = 778;\n    t.mu = 556;\n    t.igrave = 278;\n    t.ohungarumlaut = 556;\n    t.Eogonek = 667;\n    t.dcroat = 556;\n    t.threequarters = 834;\n    t.Scedilla = 667;\n    t.lcaron = 299;\n    t.Kcommaaccent = 667;\n    t.Lacute = 556;\n    t.trademark = 1000;\n    t.edotaccent = 556;\n    t.Igrave = 278;\n    t.Imacron = 278;\n    t.Lcaron = 556;\n    t.onehalf = 834;\n    t.lessequal = 549;\n    t.ocircumflex = 556;\n    t.ntilde = 556;\n    t.Uhungarumlaut = 722;\n    t.Eacute = 667;\n    t.emacron = 556;\n    t.gbreve = 556;\n    t.onequarter = 834;\n    t.Scaron = 667;\n    t.Scommaaccent = 667;\n    t.Ohungarumlaut = 778;\n    t.degree = 400;\n    t.ograve = 556;\n    t.Ccaron = 722;\n    t.ugrave = 556;\n    t.radical = 453;\n    t.Dcaron = 722;\n    t.rcommaaccent = 333;\n    t.Ntilde = 722;\n    t.otilde = 556;\n    t.Rcommaaccent = 722;\n    t.Lcommaaccent = 556;\n    t.Atilde = 667;\n    t.Aogonek = 667;\n    t.Aring = 667;\n    t.Otilde = 778;\n    t.zdotaccent = 500;\n    t.Ecaron = 667;\n    t.Iogonek = 278;\n    t.kcommaaccent = 500;\n    t.minus = 584;\n    t.Icircumflex = 278;\n    t.ncaron = 556;\n    t.tcommaaccent = 278;\n    t.logicalnot = 584;\n    t.odieresis = 556;\n    t.udieresis = 556;\n    t.notequal = 549;\n    t.gcommaaccent = 556;\n    t.eth = 556;\n    t.zcaron = 500;\n    t.ncommaaccent = 556;\n    t.onesuperior = 333;\n    t.imacron = 278;\n    t.Euro = 556;\n  });\n  t.Symbol = (0, _core_utils.getLookupTableFactory)(function (t) {\n    t.space = 250;\n    t.exclam = 333;\n    t.universal = 713;\n    t.numbersign = 500;\n    t.existential = 549;\n    t.percent = 833;\n    t.ampersand = 778;\n    t.suchthat = 439;\n    t.parenleft = 333;\n    t.parenright = 333;\n    t.asteriskmath = 500;\n    t.plus = 549;\n    t.comma = 250;\n    t.minus = 549;\n    t.period = 250;\n    t.slash = 278;\n    t.zero = 500;\n    t.one = 500;\n    t.two = 500;\n    t.three = 500;\n    t.four = 500;\n    t.five = 500;\n    t.six = 500;\n    t.seven = 500;\n    t.eight = 500;\n    t.nine = 500;\n    t.colon = 278;\n    t.semicolon = 278;\n    t.less = 549;\n    t.equal = 549;\n    t.greater = 549;\n    t.question = 444;\n    t.congruent = 549;\n    t.Alpha = 722;\n    t.Beta = 667;\n    t.Chi = 722;\n    t.Delta = 612;\n    t.Epsilon = 611;\n    t.Phi = 763;\n    t.Gamma = 603;\n    t.Eta = 722;\n    t.Iota = 333;\n    t.theta1 = 631;\n    t.Kappa = 722;\n    t.Lambda = 686;\n    t.Mu = 889;\n    t.Nu = 722;\n    t.Omicron = 722;\n    t.Pi = 768;\n    t.Theta = 741;\n    t.Rho = 556;\n    t.Sigma = 592;\n    t.Tau = 611;\n    t.Upsilon = 690;\n    t.sigma1 = 439;\n    t.Omega = 768;\n    t.Xi = 645;\n    t.Psi = 795;\n    t.Zeta = 611;\n    t.bracketleft = 333;\n    t.therefore = 863;\n    t.bracketright = 333;\n    t.perpendicular = 658;\n    t.underscore = 500;\n    t.radicalex = 500;\n    t.alpha = 631;\n    t.beta = 549;\n    t.chi = 549;\n    t.delta = 494;\n    t.epsilon = 439;\n    t.phi = 521;\n    t.gamma = 411;\n    t.eta = 603;\n    t.iota = 329;\n    t.phi1 = 603;\n    t.kappa = 549;\n    t.lambda = 549;\n    t.mu = 576;\n    t.nu = 521;\n    t.omicron = 549;\n    t.pi = 549;\n    t.theta = 521;\n    t.rho = 549;\n    t.sigma = 603;\n    t.tau = 439;\n    t.upsilon = 576;\n    t.omega1 = 713;\n    t.omega = 686;\n    t.xi = 493;\n    t.psi = 686;\n    t.zeta = 494;\n    t.braceleft = 480;\n    t.bar = 200;\n    t.braceright = 480;\n    t.similar = 549;\n    t.Euro = 750;\n    t.Upsilon1 = 620;\n    t.minute = 247;\n    t.lessequal = 549;\n    t.fraction = 167;\n    t.infinity = 713;\n    t.florin = 500;\n    t.club = 753;\n    t.diamond = 753;\n    t.heart = 753;\n    t.spade = 753;\n    t.arrowboth = 1042;\n    t.arrowleft = 987;\n    t.arrowup = 603;\n    t.arrowright = 987;\n    t.arrowdown = 603;\n    t.degree = 400;\n    t.plusminus = 549;\n    t.second = 411;\n    t.greaterequal = 549;\n    t.multiply = 549;\n    t.proportional = 713;\n    t.partialdiff = 494;\n    t.bullet = 460;\n    t.divide = 549;\n    t.notequal = 549;\n    t.equivalence = 549;\n    t.approxequal = 549;\n    t.ellipsis = 1000;\n    t.arrowvertex = 603;\n    t.arrowhorizex = 1000;\n    t.carriagereturn = 658;\n    t.aleph = 823;\n    t.Ifraktur = 686;\n    t.Rfraktur = 795;\n    t.weierstrass = 987;\n    t.circlemultiply = 768;\n    t.circleplus = 768;\n    t.emptyset = 823;\n    t.intersection = 768;\n    t.union = 768;\n    t.propersuperset = 713;\n    t.reflexsuperset = 713;\n    t.notsubset = 713;\n    t.propersubset = 713;\n    t.reflexsubset = 713;\n    t.element = 713;\n    t.notelement = 713;\n    t.angle = 768;\n    t.gradient = 713;\n    t.registerserif = 790;\n    t.copyrightserif = 790;\n    t.trademarkserif = 890;\n    t.product = 823;\n    t.radical = 549;\n    t.dotmath = 250;\n    t.logicalnot = 713;\n    t.logicaland = 603;\n    t.logicalor = 603;\n    t.arrowdblboth = 1042;\n    t.arrowdblleft = 987;\n    t.arrowdblup = 603;\n    t.arrowdblright = 987;\n    t.arrowdbldown = 603;\n    t.lozenge = 494;\n    t.angleleft = 329;\n    t.registersans = 790;\n    t.copyrightsans = 790;\n    t.trademarksans = 786;\n    t.summation = 713;\n    t.parenlefttp = 384;\n    t.parenleftex = 384;\n    t.parenleftbt = 384;\n    t.bracketlefttp = 384;\n    t.bracketleftex = 384;\n    t.bracketleftbt = 384;\n    t.bracelefttp = 494;\n    t.braceleftmid = 494;\n    t.braceleftbt = 494;\n    t.braceex = 494;\n    t.angleright = 329;\n    t.integral = 274;\n    t.integraltp = 686;\n    t.integralex = 686;\n    t.integralbt = 686;\n    t.parenrighttp = 384;\n    t.parenrightex = 384;\n    t.parenrightbt = 384;\n    t.bracketrighttp = 384;\n    t.bracketrightex = 384;\n    t.bracketrightbt = 384;\n    t.bracerighttp = 494;\n    t.bracerightmid = 494;\n    t.bracerightbt = 494;\n    t.apple = 790;\n  });\n  t[\"Times-Roman\"] = (0, _core_utils.getLookupTableFactory)(function (t) {\n    t.space = 250;\n    t.exclam = 333;\n    t.quotedbl = 408;\n    t.numbersign = 500;\n    t.dollar = 500;\n    t.percent = 833;\n    t.ampersand = 778;\n    t.quoteright = 333;\n    t.parenleft = 333;\n    t.parenright = 333;\n    t.asterisk = 500;\n    t.plus = 564;\n    t.comma = 250;\n    t.hyphen = 333;\n    t.period = 250;\n    t.slash = 278;\n    t.zero = 500;\n    t.one = 500;\n    t.two = 500;\n    t.three = 500;\n    t.four = 500;\n    t.five = 500;\n    t.six = 500;\n    t.seven = 500;\n    t.eight = 500;\n    t.nine = 500;\n    t.colon = 278;\n    t.semicolon = 278;\n    t.less = 564;\n    t.equal = 564;\n    t.greater = 564;\n    t.question = 444;\n    t.at = 921;\n    t.A = 722;\n    t.B = 667;\n    t.C = 667;\n    t.D = 722;\n    t.E = 611;\n    t.F = 556;\n    t.G = 722;\n    t.H = 722;\n    t.I = 333;\n    t.J = 389;\n    t.K = 722;\n    t.L = 611;\n    t.M = 889;\n    t.N = 722;\n    t.O = 722;\n    t.P = 556;\n    t.Q = 722;\n    t.R = 667;\n    t.S = 556;\n    t.T = 611;\n    t.U = 722;\n    t.V = 722;\n    t.W = 944;\n    t.X = 722;\n    t.Y = 722;\n    t.Z = 611;\n    t.bracketleft = 333;\n    t.backslash = 278;\n    t.bracketright = 333;\n    t.asciicircum = 469;\n    t.underscore = 500;\n    t.quoteleft = 333;\n    t.a = 444;\n    t.b = 500;\n    t.c = 444;\n    t.d = 500;\n    t.e = 444;\n    t.f = 333;\n    t.g = 500;\n    t.h = 500;\n    t.i = 278;\n    t.j = 278;\n    t.k = 500;\n    t.l = 278;\n    t.m = 778;\n    t.n = 500;\n    t.o = 500;\n    t.p = 500;\n    t.q = 500;\n    t.r = 333;\n    t.s = 389;\n    t.t = 278;\n    t.u = 500;\n    t.v = 500;\n    t.w = 722;\n    t.x = 500;\n    t.y = 500;\n    t.z = 444;\n    t.braceleft = 480;\n    t.bar = 200;\n    t.braceright = 480;\n    t.asciitilde = 541;\n    t.exclamdown = 333;\n    t.cent = 500;\n    t.sterling = 500;\n    t.fraction = 167;\n    t.yen = 500;\n    t.florin = 500;\n    t.section = 500;\n    t.currency = 500;\n    t.quotesingle = 180;\n    t.quotedblleft = 444;\n    t.guillemotleft = 500;\n    t.guilsinglleft = 333;\n    t.guilsinglright = 333;\n    t.fi = 556;\n    t.fl = 556;\n    t.endash = 500;\n    t.dagger = 500;\n    t.daggerdbl = 500;\n    t.periodcentered = 250;\n    t.paragraph = 453;\n    t.bullet = 350;\n    t.quotesinglbase = 333;\n    t.quotedblbase = 444;\n    t.quotedblright = 444;\n    t.guillemotright = 500;\n    t.ellipsis = 1000;\n    t.perthousand = 1000;\n    t.questiondown = 444;\n    t.grave = 333;\n    t.acute = 333;\n    t.circumflex = 333;\n    t.tilde = 333;\n    t.macron = 333;\n    t.breve = 333;\n    t.dotaccent = 333;\n    t.dieresis = 333;\n    t.ring = 333;\n    t.cedilla = 333;\n    t.hungarumlaut = 333;\n    t.ogonek = 333;\n    t.caron = 333;\n    t.emdash = 1000;\n    t.AE = 889;\n    t.ordfeminine = 276;\n    t.Lslash = 611;\n    t.Oslash = 722;\n    t.OE = 889;\n    t.ordmasculine = 310;\n    t.ae = 667;\n    t.dotlessi = 278;\n    t.lslash = 278;\n    t.oslash = 500;\n    t.oe = 722;\n    t.germandbls = 500;\n    t.Idieresis = 333;\n    t.eacute = 444;\n    t.abreve = 444;\n    t.uhungarumlaut = 500;\n    t.ecaron = 444;\n    t.Ydieresis = 722;\n    t.divide = 564;\n    t.Yacute = 722;\n    t.Acircumflex = 722;\n    t.aacute = 444;\n    t.Ucircumflex = 722;\n    t.yacute = 500;\n    t.scommaaccent = 389;\n    t.ecircumflex = 444;\n    t.Uring = 722;\n    t.Udieresis = 722;\n    t.aogonek = 444;\n    t.Uacute = 722;\n    t.uogonek = 500;\n    t.Edieresis = 611;\n    t.Dcroat = 722;\n    t.commaaccent = 250;\n    t.copyright = 760;\n    t.Emacron = 611;\n    t.ccaron = 444;\n    t.aring = 444;\n    t.Ncommaaccent = 722;\n    t.lacute = 278;\n    t.agrave = 444;\n    t.Tcommaaccent = 611;\n    t.Cacute = 667;\n    t.atilde = 444;\n    t.Edotaccent = 611;\n    t.scaron = 389;\n    t.scedilla = 389;\n    t.iacute = 278;\n    t.lozenge = 471;\n    t.Rcaron = 667;\n    t.Gcommaaccent = 722;\n    t.ucircumflex = 500;\n    t.acircumflex = 444;\n    t.Amacron = 722;\n    t.rcaron = 333;\n    t.ccedilla = 444;\n    t.Zdotaccent = 611;\n    t.Thorn = 556;\n    t.Omacron = 722;\n    t.Racute = 667;\n    t.Sacute = 556;\n    t.dcaron = 588;\n    t.Umacron = 722;\n    t.uring = 500;\n    t.threesuperior = 300;\n    t.Ograve = 722;\n    t.Agrave = 722;\n    t.Abreve = 722;\n    t.multiply = 564;\n    t.uacute = 500;\n    t.Tcaron = 611;\n    t.partialdiff = 476;\n    t.ydieresis = 500;\n    t.Nacute = 722;\n    t.icircumflex = 278;\n    t.Ecircumflex = 611;\n    t.adieresis = 444;\n    t.edieresis = 444;\n    t.cacute = 444;\n    t.nacute = 500;\n    t.umacron = 500;\n    t.Ncaron = 722;\n    t.Iacute = 333;\n    t.plusminus = 564;\n    t.brokenbar = 200;\n    t.registered = 760;\n    t.Gbreve = 722;\n    t.Idotaccent = 333;\n    t.summation = 600;\n    t.Egrave = 611;\n    t.racute = 333;\n    t.omacron = 500;\n    t.Zacute = 611;\n    t.Zcaron = 611;\n    t.greaterequal = 549;\n    t.Eth = 722;\n    t.Ccedilla = 667;\n    t.lcommaaccent = 278;\n    t.tcaron = 326;\n    t.eogonek = 444;\n    t.Uogonek = 722;\n    t.Aacute = 722;\n    t.Adieresis = 722;\n    t.egrave = 444;\n    t.zacute = 444;\n    t.iogonek = 278;\n    t.Oacute = 722;\n    t.oacute = 500;\n    t.amacron = 444;\n    t.sacute = 389;\n    t.idieresis = 278;\n    t.Ocircumflex = 722;\n    t.Ugrave = 722;\n    t.Delta = 612;\n    t.thorn = 500;\n    t.twosuperior = 300;\n    t.Odieresis = 722;\n    t.mu = 500;\n    t.igrave = 278;\n    t.ohungarumlaut = 500;\n    t.Eogonek = 611;\n    t.dcroat = 500;\n    t.threequarters = 750;\n    t.Scedilla = 556;\n    t.lcaron = 344;\n    t.Kcommaaccent = 722;\n    t.Lacute = 611;\n    t.trademark = 980;\n    t.edotaccent = 444;\n    t.Igrave = 333;\n    t.Imacron = 333;\n    t.Lcaron = 611;\n    t.onehalf = 750;\n    t.lessequal = 549;\n    t.ocircumflex = 500;\n    t.ntilde = 500;\n    t.Uhungarumlaut = 722;\n    t.Eacute = 611;\n    t.emacron = 444;\n    t.gbreve = 500;\n    t.onequarter = 750;\n    t.Scaron = 556;\n    t.Scommaaccent = 556;\n    t.Ohungarumlaut = 722;\n    t.degree = 400;\n    t.ograve = 500;\n    t.Ccaron = 667;\n    t.ugrave = 500;\n    t.radical = 453;\n    t.Dcaron = 722;\n    t.rcommaaccent = 333;\n    t.Ntilde = 722;\n    t.otilde = 500;\n    t.Rcommaaccent = 667;\n    t.Lcommaaccent = 611;\n    t.Atilde = 722;\n    t.Aogonek = 722;\n    t.Aring = 722;\n    t.Otilde = 722;\n    t.zdotaccent = 444;\n    t.Ecaron = 611;\n    t.Iogonek = 333;\n    t.kcommaaccent = 500;\n    t.minus = 564;\n    t.Icircumflex = 333;\n    t.ncaron = 500;\n    t.tcommaaccent = 278;\n    t.logicalnot = 564;\n    t.odieresis = 500;\n    t.udieresis = 500;\n    t.notequal = 549;\n    t.gcommaaccent = 500;\n    t.eth = 500;\n    t.zcaron = 444;\n    t.ncommaaccent = 500;\n    t.onesuperior = 300;\n    t.imacron = 278;\n    t.Euro = 500;\n  });\n  t[\"Times-Bold\"] = (0, _core_utils.getLookupTableFactory)(function (t) {\n    t.space = 250;\n    t.exclam = 333;\n    t.quotedbl = 555;\n    t.numbersign = 500;\n    t.dollar = 500;\n    t.percent = 1000;\n    t.ampersand = 833;\n    t.quoteright = 333;\n    t.parenleft = 333;\n    t.parenright = 333;\n    t.asterisk = 500;\n    t.plus = 570;\n    t.comma = 250;\n    t.hyphen = 333;\n    t.period = 250;\n    t.slash = 278;\n    t.zero = 500;\n    t.one = 500;\n    t.two = 500;\n    t.three = 500;\n    t.four = 500;\n    t.five = 500;\n    t.six = 500;\n    t.seven = 500;\n    t.eight = 500;\n    t.nine = 500;\n    t.colon = 333;\n    t.semicolon = 333;\n    t.less = 570;\n    t.equal = 570;\n    t.greater = 570;\n    t.question = 500;\n    t.at = 930;\n    t.A = 722;\n    t.B = 667;\n    t.C = 722;\n    t.D = 722;\n    t.E = 667;\n    t.F = 611;\n    t.G = 778;\n    t.H = 778;\n    t.I = 389;\n    t.J = 500;\n    t.K = 778;\n    t.L = 667;\n    t.M = 944;\n    t.N = 722;\n    t.O = 778;\n    t.P = 611;\n    t.Q = 778;\n    t.R = 722;\n    t.S = 556;\n    t.T = 667;\n    t.U = 722;\n    t.V = 722;\n    t.W = 1000;\n    t.X = 722;\n    t.Y = 722;\n    t.Z = 667;\n    t.bracketleft = 333;\n    t.backslash = 278;\n    t.bracketright = 333;\n    t.asciicircum = 581;\n    t.underscore = 500;\n    t.quoteleft = 333;\n    t.a = 500;\n    t.b = 556;\n    t.c = 444;\n    t.d = 556;\n    t.e = 444;\n    t.f = 333;\n    t.g = 500;\n    t.h = 556;\n    t.i = 278;\n    t.j = 333;\n    t.k = 556;\n    t.l = 278;\n    t.m = 833;\n    t.n = 556;\n    t.o = 500;\n    t.p = 556;\n    t.q = 556;\n    t.r = 444;\n    t.s = 389;\n    t.t = 333;\n    t.u = 556;\n    t.v = 500;\n    t.w = 722;\n    t.x = 500;\n    t.y = 500;\n    t.z = 444;\n    t.braceleft = 394;\n    t.bar = 220;\n    t.braceright = 394;\n    t.asciitilde = 520;\n    t.exclamdown = 333;\n    t.cent = 500;\n    t.sterling = 500;\n    t.fraction = 167;\n    t.yen = 500;\n    t.florin = 500;\n    t.section = 500;\n    t.currency = 500;\n    t.quotesingle = 278;\n    t.quotedblleft = 500;\n    t.guillemotleft = 500;\n    t.guilsinglleft = 333;\n    t.guilsinglright = 333;\n    t.fi = 556;\n    t.fl = 556;\n    t.endash = 500;\n    t.dagger = 500;\n    t.daggerdbl = 500;\n    t.periodcentered = 250;\n    t.paragraph = 540;\n    t.bullet = 350;\n    t.quotesinglbase = 333;\n    t.quotedblbase = 500;\n    t.quotedblright = 500;\n    t.guillemotright = 500;\n    t.ellipsis = 1000;\n    t.perthousand = 1000;\n    t.questiondown = 500;\n    t.grave = 333;\n    t.acute = 333;\n    t.circumflex = 333;\n    t.tilde = 333;\n    t.macron = 333;\n    t.breve = 333;\n    t.dotaccent = 333;\n    t.dieresis = 333;\n    t.ring = 333;\n    t.cedilla = 333;\n    t.hungarumlaut = 333;\n    t.ogonek = 333;\n    t.caron = 333;\n    t.emdash = 1000;\n    t.AE = 1000;\n    t.ordfeminine = 300;\n    t.Lslash = 667;\n    t.Oslash = 778;\n    t.OE = 1000;\n    t.ordmasculine = 330;\n    t.ae = 722;\n    t.dotlessi = 278;\n    t.lslash = 278;\n    t.oslash = 500;\n    t.oe = 722;\n    t.germandbls = 556;\n    t.Idieresis = 389;\n    t.eacute = 444;\n    t.abreve = 500;\n    t.uhungarumlaut = 556;\n    t.ecaron = 444;\n    t.Ydieresis = 722;\n    t.divide = 570;\n    t.Yacute = 722;\n    t.Acircumflex = 722;\n    t.aacute = 500;\n    t.Ucircumflex = 722;\n    t.yacute = 500;\n    t.scommaaccent = 389;\n    t.ecircumflex = 444;\n    t.Uring = 722;\n    t.Udieresis = 722;\n    t.aogonek = 500;\n    t.Uacute = 722;\n    t.uogonek = 556;\n    t.Edieresis = 667;\n    t.Dcroat = 722;\n    t.commaaccent = 250;\n    t.copyright = 747;\n    t.Emacron = 667;\n    t.ccaron = 444;\n    t.aring = 500;\n    t.Ncommaaccent = 722;\n    t.lacute = 278;\n    t.agrave = 500;\n    t.Tcommaaccent = 667;\n    t.Cacute = 722;\n    t.atilde = 500;\n    t.Edotaccent = 667;\n    t.scaron = 389;\n    t.scedilla = 389;\n    t.iacute = 278;\n    t.lozenge = 494;\n    t.Rcaron = 722;\n    t.Gcommaaccent = 778;\n    t.ucircumflex = 556;\n    t.acircumflex = 500;\n    t.Amacron = 722;\n    t.rcaron = 444;\n    t.ccedilla = 444;\n    t.Zdotaccent = 667;\n    t.Thorn = 611;\n    t.Omacron = 778;\n    t.Racute = 722;\n    t.Sacute = 556;\n    t.dcaron = 672;\n    t.Umacron = 722;\n    t.uring = 556;\n    t.threesuperior = 300;\n    t.Ograve = 778;\n    t.Agrave = 722;\n    t.Abreve = 722;\n    t.multiply = 570;\n    t.uacute = 556;\n    t.Tcaron = 667;\n    t.partialdiff = 494;\n    t.ydieresis = 500;\n    t.Nacute = 722;\n    t.icircumflex = 278;\n    t.Ecircumflex = 667;\n    t.adieresis = 500;\n    t.edieresis = 444;\n    t.cacute = 444;\n    t.nacute = 556;\n    t.umacron = 556;\n    t.Ncaron = 722;\n    t.Iacute = 389;\n    t.plusminus = 570;\n    t.brokenbar = 220;\n    t.registered = 747;\n    t.Gbreve = 778;\n    t.Idotaccent = 389;\n    t.summation = 600;\n    t.Egrave = 667;\n    t.racute = 444;\n    t.omacron = 500;\n    t.Zacute = 667;\n    t.Zcaron = 667;\n    t.greaterequal = 549;\n    t.Eth = 722;\n    t.Ccedilla = 722;\n    t.lcommaaccent = 278;\n    t.tcaron = 416;\n    t.eogonek = 444;\n    t.Uogonek = 722;\n    t.Aacute = 722;\n    t.Adieresis = 722;\n    t.egrave = 444;\n    t.zacute = 444;\n    t.iogonek = 278;\n    t.Oacute = 778;\n    t.oacute = 500;\n    t.amacron = 500;\n    t.sacute = 389;\n    t.idieresis = 278;\n    t.Ocircumflex = 778;\n    t.Ugrave = 722;\n    t.Delta = 612;\n    t.thorn = 556;\n    t.twosuperior = 300;\n    t.Odieresis = 778;\n    t.mu = 556;\n    t.igrave = 278;\n    t.ohungarumlaut = 500;\n    t.Eogonek = 667;\n    t.dcroat = 556;\n    t.threequarters = 750;\n    t.Scedilla = 556;\n    t.lcaron = 394;\n    t.Kcommaaccent = 778;\n    t.Lacute = 667;\n    t.trademark = 1000;\n    t.edotaccent = 444;\n    t.Igrave = 389;\n    t.Imacron = 389;\n    t.Lcaron = 667;\n    t.onehalf = 750;\n    t.lessequal = 549;\n    t.ocircumflex = 500;\n    t.ntilde = 556;\n    t.Uhungarumlaut = 722;\n    t.Eacute = 667;\n    t.emacron = 444;\n    t.gbreve = 500;\n    t.onequarter = 750;\n    t.Scaron = 556;\n    t.Scommaaccent = 556;\n    t.Ohungarumlaut = 778;\n    t.degree = 400;\n    t.ograve = 500;\n    t.Ccaron = 722;\n    t.ugrave = 556;\n    t.radical = 549;\n    t.Dcaron = 722;\n    t.rcommaaccent = 444;\n    t.Ntilde = 722;\n    t.otilde = 500;\n    t.Rcommaaccent = 722;\n    t.Lcommaaccent = 667;\n    t.Atilde = 722;\n    t.Aogonek = 722;\n    t.Aring = 722;\n    t.Otilde = 778;\n    t.zdotaccent = 444;\n    t.Ecaron = 667;\n    t.Iogonek = 389;\n    t.kcommaaccent = 556;\n    t.minus = 570;\n    t.Icircumflex = 389;\n    t.ncaron = 556;\n    t.tcommaaccent = 333;\n    t.logicalnot = 570;\n    t.odieresis = 500;\n    t.udieresis = 556;\n    t.notequal = 549;\n    t.gcommaaccent = 500;\n    t.eth = 500;\n    t.zcaron = 444;\n    t.ncommaaccent = 556;\n    t.onesuperior = 300;\n    t.imacron = 278;\n    t.Euro = 500;\n  });\n  t[\"Times-BoldItalic\"] = (0, _core_utils.getLookupTableFactory)(function (t) {\n    t.space = 250;\n    t.exclam = 389;\n    t.quotedbl = 555;\n    t.numbersign = 500;\n    t.dollar = 500;\n    t.percent = 833;\n    t.ampersand = 778;\n    t.quoteright = 333;\n    t.parenleft = 333;\n    t.parenright = 333;\n    t.asterisk = 500;\n    t.plus = 570;\n    t.comma = 250;\n    t.hyphen = 333;\n    t.period = 250;\n    t.slash = 278;\n    t.zero = 500;\n    t.one = 500;\n    t.two = 500;\n    t.three = 500;\n    t.four = 500;\n    t.five = 500;\n    t.six = 500;\n    t.seven = 500;\n    t.eight = 500;\n    t.nine = 500;\n    t.colon = 333;\n    t.semicolon = 333;\n    t.less = 570;\n    t.equal = 570;\n    t.greater = 570;\n    t.question = 500;\n    t.at = 832;\n    t.A = 667;\n    t.B = 667;\n    t.C = 667;\n    t.D = 722;\n    t.E = 667;\n    t.F = 667;\n    t.G = 722;\n    t.H = 778;\n    t.I = 389;\n    t.J = 500;\n    t.K = 667;\n    t.L = 611;\n    t.M = 889;\n    t.N = 722;\n    t.O = 722;\n    t.P = 611;\n    t.Q = 722;\n    t.R = 667;\n    t.S = 556;\n    t.T = 611;\n    t.U = 722;\n    t.V = 667;\n    t.W = 889;\n    t.X = 667;\n    t.Y = 611;\n    t.Z = 611;\n    t.bracketleft = 333;\n    t.backslash = 278;\n    t.bracketright = 333;\n    t.asciicircum = 570;\n    t.underscore = 500;\n    t.quoteleft = 333;\n    t.a = 500;\n    t.b = 500;\n    t.c = 444;\n    t.d = 500;\n    t.e = 444;\n    t.f = 333;\n    t.g = 500;\n    t.h = 556;\n    t.i = 278;\n    t.j = 278;\n    t.k = 500;\n    t.l = 278;\n    t.m = 778;\n    t.n = 556;\n    t.o = 500;\n    t.p = 500;\n    t.q = 500;\n    t.r = 389;\n    t.s = 389;\n    t.t = 278;\n    t.u = 556;\n    t.v = 444;\n    t.w = 667;\n    t.x = 500;\n    t.y = 444;\n    t.z = 389;\n    t.braceleft = 348;\n    t.bar = 220;\n    t.braceright = 348;\n    t.asciitilde = 570;\n    t.exclamdown = 389;\n    t.cent = 500;\n    t.sterling = 500;\n    t.fraction = 167;\n    t.yen = 500;\n    t.florin = 500;\n    t.section = 500;\n    t.currency = 500;\n    t.quotesingle = 278;\n    t.quotedblleft = 500;\n    t.guillemotleft = 500;\n    t.guilsinglleft = 333;\n    t.guilsinglright = 333;\n    t.fi = 556;\n    t.fl = 556;\n    t.endash = 500;\n    t.dagger = 500;\n    t.daggerdbl = 500;\n    t.periodcentered = 250;\n    t.paragraph = 500;\n    t.bullet = 350;\n    t.quotesinglbase = 333;\n    t.quotedblbase = 500;\n    t.quotedblright = 500;\n    t.guillemotright = 500;\n    t.ellipsis = 1000;\n    t.perthousand = 1000;\n    t.questiondown = 500;\n    t.grave = 333;\n    t.acute = 333;\n    t.circumflex = 333;\n    t.tilde = 333;\n    t.macron = 333;\n    t.breve = 333;\n    t.dotaccent = 333;\n    t.dieresis = 333;\n    t.ring = 333;\n    t.cedilla = 333;\n    t.hungarumlaut = 333;\n    t.ogonek = 333;\n    t.caron = 333;\n    t.emdash = 1000;\n    t.AE = 944;\n    t.ordfeminine = 266;\n    t.Lslash = 611;\n    t.Oslash = 722;\n    t.OE = 944;\n    t.ordmasculine = 300;\n    t.ae = 722;\n    t.dotlessi = 278;\n    t.lslash = 278;\n    t.oslash = 500;\n    t.oe = 722;\n    t.germandbls = 500;\n    t.Idieresis = 389;\n    t.eacute = 444;\n    t.abreve = 500;\n    t.uhungarumlaut = 556;\n    t.ecaron = 444;\n    t.Ydieresis = 611;\n    t.divide = 570;\n    t.Yacute = 611;\n    t.Acircumflex = 667;\n    t.aacute = 500;\n    t.Ucircumflex = 722;\n    t.yacute = 444;\n    t.scommaaccent = 389;\n    t.ecircumflex = 444;\n    t.Uring = 722;\n    t.Udieresis = 722;\n    t.aogonek = 500;\n    t.Uacute = 722;\n    t.uogonek = 556;\n    t.Edieresis = 667;\n    t.Dcroat = 722;\n    t.commaaccent = 250;\n    t.copyright = 747;\n    t.Emacron = 667;\n    t.ccaron = 444;\n    t.aring = 500;\n    t.Ncommaaccent = 722;\n    t.lacute = 278;\n    t.agrave = 500;\n    t.Tcommaaccent = 611;\n    t.Cacute = 667;\n    t.atilde = 500;\n    t.Edotaccent = 667;\n    t.scaron = 389;\n    t.scedilla = 389;\n    t.iacute = 278;\n    t.lozenge = 494;\n    t.Rcaron = 667;\n    t.Gcommaaccent = 722;\n    t.ucircumflex = 556;\n    t.acircumflex = 500;\n    t.Amacron = 667;\n    t.rcaron = 389;\n    t.ccedilla = 444;\n    t.Zdotaccent = 611;\n    t.Thorn = 611;\n    t.Omacron = 722;\n    t.Racute = 667;\n    t.Sacute = 556;\n    t.dcaron = 608;\n    t.Umacron = 722;\n    t.uring = 556;\n    t.threesuperior = 300;\n    t.Ograve = 722;\n    t.Agrave = 667;\n    t.Abreve = 667;\n    t.multiply = 570;\n    t.uacute = 556;\n    t.Tcaron = 611;\n    t.partialdiff = 494;\n    t.ydieresis = 444;\n    t.Nacute = 722;\n    t.icircumflex = 278;\n    t.Ecircumflex = 667;\n    t.adieresis = 500;\n    t.edieresis = 444;\n    t.cacute = 444;\n    t.nacute = 556;\n    t.umacron = 556;\n    t.Ncaron = 722;\n    t.Iacute = 389;\n    t.plusminus = 570;\n    t.brokenbar = 220;\n    t.registered = 747;\n    t.Gbreve = 722;\n    t.Idotaccent = 389;\n    t.summation = 600;\n    t.Egrave = 667;\n    t.racute = 389;\n    t.omacron = 500;\n    t.Zacute = 611;\n    t.Zcaron = 611;\n    t.greaterequal = 549;\n    t.Eth = 722;\n    t.Ccedilla = 667;\n    t.lcommaaccent = 278;\n    t.tcaron = 366;\n    t.eogonek = 444;\n    t.Uogonek = 722;\n    t.Aacute = 667;\n    t.Adieresis = 667;\n    t.egrave = 444;\n    t.zacute = 389;\n    t.iogonek = 278;\n    t.Oacute = 722;\n    t.oacute = 500;\n    t.amacron = 500;\n    t.sacute = 389;\n    t.idieresis = 278;\n    t.Ocircumflex = 722;\n    t.Ugrave = 722;\n    t.Delta = 612;\n    t.thorn = 500;\n    t.twosuperior = 300;\n    t.Odieresis = 722;\n    t.mu = 576;\n    t.igrave = 278;\n    t.ohungarumlaut = 500;\n    t.Eogonek = 667;\n    t.dcroat = 500;\n    t.threequarters = 750;\n    t.Scedilla = 556;\n    t.lcaron = 382;\n    t.Kcommaaccent = 667;\n    t.Lacute = 611;\n    t.trademark = 1000;\n    t.edotaccent = 444;\n    t.Igrave = 389;\n    t.Imacron = 389;\n    t.Lcaron = 611;\n    t.onehalf = 750;\n    t.lessequal = 549;\n    t.ocircumflex = 500;\n    t.ntilde = 556;\n    t.Uhungarumlaut = 722;\n    t.Eacute = 667;\n    t.emacron = 444;\n    t.gbreve = 500;\n    t.onequarter = 750;\n    t.Scaron = 556;\n    t.Scommaaccent = 556;\n    t.Ohungarumlaut = 722;\n    t.degree = 400;\n    t.ograve = 500;\n    t.Ccaron = 667;\n    t.ugrave = 556;\n    t.radical = 549;\n    t.Dcaron = 722;\n    t.rcommaaccent = 389;\n    t.Ntilde = 722;\n    t.otilde = 500;\n    t.Rcommaaccent = 667;\n    t.Lcommaaccent = 611;\n    t.Atilde = 667;\n    t.Aogonek = 667;\n    t.Aring = 667;\n    t.Otilde = 722;\n    t.zdotaccent = 389;\n    t.Ecaron = 667;\n    t.Iogonek = 389;\n    t.kcommaaccent = 500;\n    t.minus = 606;\n    t.Icircumflex = 389;\n    t.ncaron = 556;\n    t.tcommaaccent = 278;\n    t.logicalnot = 606;\n    t.odieresis = 500;\n    t.udieresis = 556;\n    t.notequal = 549;\n    t.gcommaaccent = 500;\n    t.eth = 500;\n    t.zcaron = 389;\n    t.ncommaaccent = 556;\n    t.onesuperior = 300;\n    t.imacron = 278;\n    t.Euro = 500;\n  });\n  t[\"Times-Italic\"] = (0, _core_utils.getLookupTableFactory)(function (t) {\n    t.space = 250;\n    t.exclam = 333;\n    t.quotedbl = 420;\n    t.numbersign = 500;\n    t.dollar = 500;\n    t.percent = 833;\n    t.ampersand = 778;\n    t.quoteright = 333;\n    t.parenleft = 333;\n    t.parenright = 333;\n    t.asterisk = 500;\n    t.plus = 675;\n    t.comma = 250;\n    t.hyphen = 333;\n    t.period = 250;\n    t.slash = 278;\n    t.zero = 500;\n    t.one = 500;\n    t.two = 500;\n    t.three = 500;\n    t.four = 500;\n    t.five = 500;\n    t.six = 500;\n    t.seven = 500;\n    t.eight = 500;\n    t.nine = 500;\n    t.colon = 333;\n    t.semicolon = 333;\n    t.less = 675;\n    t.equal = 675;\n    t.greater = 675;\n    t.question = 500;\n    t.at = 920;\n    t.A = 611;\n    t.B = 611;\n    t.C = 667;\n    t.D = 722;\n    t.E = 611;\n    t.F = 611;\n    t.G = 722;\n    t.H = 722;\n    t.I = 333;\n    t.J = 444;\n    t.K = 667;\n    t.L = 556;\n    t.M = 833;\n    t.N = 667;\n    t.O = 722;\n    t.P = 611;\n    t.Q = 722;\n    t.R = 611;\n    t.S = 500;\n    t.T = 556;\n    t.U = 722;\n    t.V = 611;\n    t.W = 833;\n    t.X = 611;\n    t.Y = 556;\n    t.Z = 556;\n    t.bracketleft = 389;\n    t.backslash = 278;\n    t.bracketright = 389;\n    t.asciicircum = 422;\n    t.underscore = 500;\n    t.quoteleft = 333;\n    t.a = 500;\n    t.b = 500;\n    t.c = 444;\n    t.d = 500;\n    t.e = 444;\n    t.f = 278;\n    t.g = 500;\n    t.h = 500;\n    t.i = 278;\n    t.j = 278;\n    t.k = 444;\n    t.l = 278;\n    t.m = 722;\n    t.n = 500;\n    t.o = 500;\n    t.p = 500;\n    t.q = 500;\n    t.r = 389;\n    t.s = 389;\n    t.t = 278;\n    t.u = 500;\n    t.v = 444;\n    t.w = 667;\n    t.x = 444;\n    t.y = 444;\n    t.z = 389;\n    t.braceleft = 400;\n    t.bar = 275;\n    t.braceright = 400;\n    t.asciitilde = 541;\n    t.exclamdown = 389;\n    t.cent = 500;\n    t.sterling = 500;\n    t.fraction = 167;\n    t.yen = 500;\n    t.florin = 500;\n    t.section = 500;\n    t.currency = 500;\n    t.quotesingle = 214;\n    t.quotedblleft = 556;\n    t.guillemotleft = 500;\n    t.guilsinglleft = 333;\n    t.guilsinglright = 333;\n    t.fi = 500;\n    t.fl = 500;\n    t.endash = 500;\n    t.dagger = 500;\n    t.daggerdbl = 500;\n    t.periodcentered = 250;\n    t.paragraph = 523;\n    t.bullet = 350;\n    t.quotesinglbase = 333;\n    t.quotedblbase = 556;\n    t.quotedblright = 556;\n    t.guillemotright = 500;\n    t.ellipsis = 889;\n    t.perthousand = 1000;\n    t.questiondown = 500;\n    t.grave = 333;\n    t.acute = 333;\n    t.circumflex = 333;\n    t.tilde = 333;\n    t.macron = 333;\n    t.breve = 333;\n    t.dotaccent = 333;\n    t.dieresis = 333;\n    t.ring = 333;\n    t.cedilla = 333;\n    t.hungarumlaut = 333;\n    t.ogonek = 333;\n    t.caron = 333;\n    t.emdash = 889;\n    t.AE = 889;\n    t.ordfeminine = 276;\n    t.Lslash = 556;\n    t.Oslash = 722;\n    t.OE = 944;\n    t.ordmasculine = 310;\n    t.ae = 667;\n    t.dotlessi = 278;\n    t.lslash = 278;\n    t.oslash = 500;\n    t.oe = 667;\n    t.germandbls = 500;\n    t.Idieresis = 333;\n    t.eacute = 444;\n    t.abreve = 500;\n    t.uhungarumlaut = 500;\n    t.ecaron = 444;\n    t.Ydieresis = 556;\n    t.divide = 675;\n    t.Yacute = 556;\n    t.Acircumflex = 611;\n    t.aacute = 500;\n    t.Ucircumflex = 722;\n    t.yacute = 444;\n    t.scommaaccent = 389;\n    t.ecircumflex = 444;\n    t.Uring = 722;\n    t.Udieresis = 722;\n    t.aogonek = 500;\n    t.Uacute = 722;\n    t.uogonek = 500;\n    t.Edieresis = 611;\n    t.Dcroat = 722;\n    t.commaaccent = 250;\n    t.copyright = 760;\n    t.Emacron = 611;\n    t.ccaron = 444;\n    t.aring = 500;\n    t.Ncommaaccent = 667;\n    t.lacute = 278;\n    t.agrave = 500;\n    t.Tcommaaccent = 556;\n    t.Cacute = 667;\n    t.atilde = 500;\n    t.Edotaccent = 611;\n    t.scaron = 389;\n    t.scedilla = 389;\n    t.iacute = 278;\n    t.lozenge = 471;\n    t.Rcaron = 611;\n    t.Gcommaaccent = 722;\n    t.ucircumflex = 500;\n    t.acircumflex = 500;\n    t.Amacron = 611;\n    t.rcaron = 389;\n    t.ccedilla = 444;\n    t.Zdotaccent = 556;\n    t.Thorn = 611;\n    t.Omacron = 722;\n    t.Racute = 611;\n    t.Sacute = 500;\n    t.dcaron = 544;\n    t.Umacron = 722;\n    t.uring = 500;\n    t.threesuperior = 300;\n    t.Ograve = 722;\n    t.Agrave = 611;\n    t.Abreve = 611;\n    t.multiply = 675;\n    t.uacute = 500;\n    t.Tcaron = 556;\n    t.partialdiff = 476;\n    t.ydieresis = 444;\n    t.Nacute = 667;\n    t.icircumflex = 278;\n    t.Ecircumflex = 611;\n    t.adieresis = 500;\n    t.edieresis = 444;\n    t.cacute = 444;\n    t.nacute = 500;\n    t.umacron = 500;\n    t.Ncaron = 667;\n    t.Iacute = 333;\n    t.plusminus = 675;\n    t.brokenbar = 275;\n    t.registered = 760;\n    t.Gbreve = 722;\n    t.Idotaccent = 333;\n    t.summation = 600;\n    t.Egrave = 611;\n    t.racute = 389;\n    t.omacron = 500;\n    t.Zacute = 556;\n    t.Zcaron = 556;\n    t.greaterequal = 549;\n    t.Eth = 722;\n    t.Ccedilla = 667;\n    t.lcommaaccent = 278;\n    t.tcaron = 300;\n    t.eogonek = 444;\n    t.Uogonek = 722;\n    t.Aacute = 611;\n    t.Adieresis = 611;\n    t.egrave = 444;\n    t.zacute = 389;\n    t.iogonek = 278;\n    t.Oacute = 722;\n    t.oacute = 500;\n    t.amacron = 500;\n    t.sacute = 389;\n    t.idieresis = 278;\n    t.Ocircumflex = 722;\n    t.Ugrave = 722;\n    t.Delta = 612;\n    t.thorn = 500;\n    t.twosuperior = 300;\n    t.Odieresis = 722;\n    t.mu = 500;\n    t.igrave = 278;\n    t.ohungarumlaut = 500;\n    t.Eogonek = 611;\n    t.dcroat = 500;\n    t.threequarters = 750;\n    t.Scedilla = 500;\n    t.lcaron = 300;\n    t.Kcommaaccent = 667;\n    t.Lacute = 556;\n    t.trademark = 980;\n    t.edotaccent = 444;\n    t.Igrave = 333;\n    t.Imacron = 333;\n    t.Lcaron = 611;\n    t.onehalf = 750;\n    t.lessequal = 549;\n    t.ocircumflex = 500;\n    t.ntilde = 500;\n    t.Uhungarumlaut = 722;\n    t.Eacute = 611;\n    t.emacron = 444;\n    t.gbreve = 500;\n    t.onequarter = 750;\n    t.Scaron = 500;\n    t.Scommaaccent = 500;\n    t.Ohungarumlaut = 722;\n    t.degree = 400;\n    t.ograve = 500;\n    t.Ccaron = 667;\n    t.ugrave = 500;\n    t.radical = 453;\n    t.Dcaron = 722;\n    t.rcommaaccent = 389;\n    t.Ntilde = 667;\n    t.otilde = 500;\n    t.Rcommaaccent = 611;\n    t.Lcommaaccent = 556;\n    t.Atilde = 611;\n    t.Aogonek = 611;\n    t.Aring = 611;\n    t.Otilde = 722;\n    t.zdotaccent = 389;\n    t.Ecaron = 611;\n    t.Iogonek = 333;\n    t.kcommaaccent = 444;\n    t.minus = 675;\n    t.Icircumflex = 333;\n    t.ncaron = 500;\n    t.tcommaaccent = 278;\n    t.logicalnot = 675;\n    t.odieresis = 500;\n    t.udieresis = 500;\n    t.notequal = 549;\n    t.gcommaaccent = 500;\n    t.eth = 500;\n    t.zcaron = 389;\n    t.ncommaaccent = 500;\n    t.onesuperior = 300;\n    t.imacron = 278;\n    t.Euro = 500;\n  });\n  t.ZapfDingbats = (0, _core_utils.getLookupTableFactory)(function (t) {\n    t.space = 278;\n    t.a1 = 974;\n    t.a2 = 961;\n    t.a202 = 974;\n    t.a3 = 980;\n    t.a4 = 719;\n    t.a5 = 789;\n    t.a119 = 790;\n    t.a118 = 791;\n    t.a117 = 690;\n    t.a11 = 960;\n    t.a12 = 939;\n    t.a13 = 549;\n    t.a14 = 855;\n    t.a15 = 911;\n    t.a16 = 933;\n    t.a105 = 911;\n    t.a17 = 945;\n    t.a18 = 974;\n    t.a19 = 755;\n    t.a20 = 846;\n    t.a21 = 762;\n    t.a22 = 761;\n    t.a23 = 571;\n    t.a24 = 677;\n    t.a25 = 763;\n    t.a26 = 760;\n    t.a27 = 759;\n    t.a28 = 754;\n    t.a6 = 494;\n    t.a7 = 552;\n    t.a8 = 537;\n    t.a9 = 577;\n    t.a10 = 692;\n    t.a29 = 786;\n    t.a30 = 788;\n    t.a31 = 788;\n    t.a32 = 790;\n    t.a33 = 793;\n    t.a34 = 794;\n    t.a35 = 816;\n    t.a36 = 823;\n    t.a37 = 789;\n    t.a38 = 841;\n    t.a39 = 823;\n    t.a40 = 833;\n    t.a41 = 816;\n    t.a42 = 831;\n    t.a43 = 923;\n    t.a44 = 744;\n    t.a45 = 723;\n    t.a46 = 749;\n    t.a47 = 790;\n    t.a48 = 792;\n    t.a49 = 695;\n    t.a50 = 776;\n    t.a51 = 768;\n    t.a52 = 792;\n    t.a53 = 759;\n    t.a54 = 707;\n    t.a55 = 708;\n    t.a56 = 682;\n    t.a57 = 701;\n    t.a58 = 826;\n    t.a59 = 815;\n    t.a60 = 789;\n    t.a61 = 789;\n    t.a62 = 707;\n    t.a63 = 687;\n    t.a64 = 696;\n    t.a65 = 689;\n    t.a66 = 786;\n    t.a67 = 787;\n    t.a68 = 713;\n    t.a69 = 791;\n    t.a70 = 785;\n    t.a71 = 791;\n    t.a72 = 873;\n    t.a73 = 761;\n    t.a74 = 762;\n    t.a203 = 762;\n    t.a75 = 759;\n    t.a204 = 759;\n    t.a76 = 892;\n    t.a77 = 892;\n    t.a78 = 788;\n    t.a79 = 784;\n    t.a81 = 438;\n    t.a82 = 138;\n    t.a83 = 277;\n    t.a84 = 415;\n    t.a97 = 392;\n    t.a98 = 392;\n    t.a99 = 668;\n    t.a100 = 668;\n    t.a89 = 390;\n    t.a90 = 390;\n    t.a93 = 317;\n    t.a94 = 317;\n    t.a91 = 276;\n    t.a92 = 276;\n    t.a205 = 509;\n    t.a85 = 509;\n    t.a206 = 410;\n    t.a86 = 410;\n    t.a87 = 234;\n    t.a88 = 234;\n    t.a95 = 334;\n    t.a96 = 334;\n    t.a101 = 732;\n    t.a102 = 544;\n    t.a103 = 544;\n    t.a104 = 910;\n    t.a106 = 667;\n    t.a107 = 760;\n    t.a108 = 760;\n    t.a112 = 776;\n    t.a111 = 595;\n    t.a110 = 694;\n    t.a109 = 626;\n    t.a120 = 788;\n    t.a121 = 788;\n    t.a122 = 788;\n    t.a123 = 788;\n    t.a124 = 788;\n    t.a125 = 788;\n    t.a126 = 788;\n    t.a127 = 788;\n    t.a128 = 788;\n    t.a129 = 788;\n    t.a130 = 788;\n    t.a131 = 788;\n    t.a132 = 788;\n    t.a133 = 788;\n    t.a134 = 788;\n    t.a135 = 788;\n    t.a136 = 788;\n    t.a137 = 788;\n    t.a138 = 788;\n    t.a139 = 788;\n    t.a140 = 788;\n    t.a141 = 788;\n    t.a142 = 788;\n    t.a143 = 788;\n    t.a144 = 788;\n    t.a145 = 788;\n    t.a146 = 788;\n    t.a147 = 788;\n    t.a148 = 788;\n    t.a149 = 788;\n    t.a150 = 788;\n    t.a151 = 788;\n    t.a152 = 788;\n    t.a153 = 788;\n    t.a154 = 788;\n    t.a155 = 788;\n    t.a156 = 788;\n    t.a157 = 788;\n    t.a158 = 788;\n    t.a159 = 788;\n    t.a160 = 894;\n    t.a161 = 838;\n    t.a163 = 1016;\n    t.a164 = 458;\n    t.a196 = 748;\n    t.a165 = 924;\n    t.a192 = 748;\n    t.a166 = 918;\n    t.a167 = 927;\n    t.a168 = 928;\n    t.a169 = 928;\n    t.a170 = 834;\n    t.a171 = 873;\n    t.a172 = 828;\n    t.a173 = 924;\n    t.a162 = 924;\n    t.a174 = 917;\n    t.a175 = 930;\n    t.a176 = 931;\n    t.a177 = 463;\n    t.a178 = 883;\n    t.a179 = 836;\n    t.a193 = 836;\n    t.a180 = 867;\n    t.a199 = 867;\n    t.a181 = 696;\n    t.a200 = 696;\n    t.a182 = 874;\n    t.a201 = 874;\n    t.a183 = 760;\n    t.a184 = 946;\n    t.a197 = 771;\n    t.a185 = 865;\n    t.a194 = 771;\n    t.a198 = 888;\n    t.a186 = 967;\n    t.a195 = 888;\n    t.a187 = 831;\n    t.a188 = 873;\n    t.a189 = 927;\n    t.a190 = 970;\n    t.a191 = 918;\n  });\n});\nexports.getMetrics = getMetrics;\n\n/***/ }),\n/* 45 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.MurmurHash3_64 = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nconst SEED = 0xc3d2e1f0;\nconst MASK_HIGH = 0xffff0000;\nconst MASK_LOW = 0xffff;\n\nclass MurmurHash3_64 {\n  constructor(seed) {\n    this.h1 = seed ? seed & 0xffffffff : SEED;\n    this.h2 = seed ? seed & 0xffffffff : SEED;\n  }\n\n  update(input) {\n    let data, length;\n\n    if ((0, _util.isString)(input)) {\n      data = new Uint8Array(input.length * 2);\n      length = 0;\n\n      for (let i = 0, ii = input.length; i < ii; i++) {\n        const code = input.charCodeAt(i);\n\n        if (code <= 0xff) {\n          data[length++] = code;\n        } else {\n          data[length++] = code >>> 8;\n          data[length++] = code & 0xff;\n        }\n      }\n    } else if ((0, _util.isArrayBuffer)(input)) {\n      data = input.slice();\n      length = data.byteLength;\n    } else {\n      throw new Error(\"Wrong data format in MurmurHash3_64_update. \" + \"Input must be a string or array.\");\n    }\n\n    const blockCounts = length >> 2;\n    const tailLength = length - blockCounts * 4;\n    const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);\n    let k1 = 0,\n        k2 = 0;\n    let h1 = this.h1,\n        h2 = this.h2;\n    const C1 = 0xcc9e2d51,\n          C2 = 0x1b873593;\n    const C1_LOW = C1 & MASK_LOW,\n          C2_LOW = C2 & MASK_LOW;\n\n    for (let i = 0; i < blockCounts; i++) {\n      if (i & 1) {\n        k1 = dataUint32[i];\n        k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;\n        k1 = k1 << 15 | k1 >>> 17;\n        k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;\n        h1 ^= k1;\n        h1 = h1 << 13 | h1 >>> 19;\n        h1 = h1 * 5 + 0xe6546b64;\n      } else {\n        k2 = dataUint32[i];\n        k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW;\n        k2 = k2 << 15 | k2 >>> 17;\n        k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW;\n        h2 ^= k2;\n        h2 = h2 << 13 | h2 >>> 19;\n        h2 = h2 * 5 + 0xe6546b64;\n      }\n    }\n\n    k1 = 0;\n\n    switch (tailLength) {\n      case 3:\n        k1 ^= data[blockCounts * 4 + 2] << 16;\n\n      case 2:\n        k1 ^= data[blockCounts * 4 + 1] << 8;\n\n      case 1:\n        k1 ^= data[blockCounts * 4];\n        k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;\n        k1 = k1 << 15 | k1 >>> 17;\n        k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;\n\n        if (blockCounts & 1) {\n          h1 ^= k1;\n        } else {\n          h2 ^= k1;\n        }\n\n    }\n\n    this.h1 = h1;\n    this.h2 = h2;\n  }\n\n  hexdigest() {\n    let h1 = this.h1,\n        h2 = this.h2;\n    h1 ^= h2 >>> 1;\n    h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW;\n    h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16;\n    h1 ^= h2 >>> 1;\n    h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW;\n    h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16;\n    h1 ^= h2 >>> 1;\n    const hex1 = (h1 >>> 0).toString(16),\n          hex2 = (h2 >>> 0).toString(16);\n    return hex1.padStart(8, \"0\") + hex2.padStart(8, \"0\");\n  }\n\n}\n\nexports.MurmurHash3_64 = MurmurHash3_64;\n\n/***/ }),\n/* 46 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.OperatorList = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nconst QueueOptimizer = function QueueOptimizerClosure() {\n  function addState(parentState, pattern, checkFn, iterateFn, processFn) {\n    let state = parentState;\n\n    for (let i = 0, ii = pattern.length - 1; i < ii; i++) {\n      const item = pattern[i];\n      state = state[item] || (state[item] = []);\n    }\n\n    state[pattern[pattern.length - 1]] = {\n      checkFn,\n      iterateFn,\n      processFn\n    };\n  }\n\n  function handlePaintSolidColorImageMask(iFirstSave, count, fnArray, argsArray) {\n    const iFirstPIMXO = iFirstSave + 2;\n    let i;\n\n    for (i = 0; i < count; i++) {\n      const arg = argsArray[iFirstPIMXO + 4 * i];\n      const imageMask = arg.length === 1 && arg[0];\n\n      if (imageMask && imageMask.width === 1 && imageMask.height === 1 && (!imageMask.data.length || imageMask.data.length === 1 && imageMask.data[0] === 0)) {\n        fnArray[iFirstPIMXO + 4 * i] = _util.OPS.paintSolidColorImageMask;\n        continue;\n      }\n\n      break;\n    }\n\n    return count - i;\n  }\n\n  const InitialState = [];\n  addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintInlineImageXObject, _util.OPS.restore], null, function iterateInlineImageGroup(context, i) {\n    const fnArray = context.fnArray;\n    const iFirstSave = context.iCurr - 3;\n    const pos = (i - iFirstSave) % 4;\n\n    switch (pos) {\n      case 0:\n        return fnArray[i] === _util.OPS.save;\n\n      case 1:\n        return fnArray[i] === _util.OPS.transform;\n\n      case 2:\n        return fnArray[i] === _util.OPS.paintInlineImageXObject;\n\n      case 3:\n        return fnArray[i] === _util.OPS.restore;\n    }\n\n    throw new Error(`iterateInlineImageGroup - invalid pos: ${pos}`);\n  }, function foundInlineImageGroup(context, i) {\n    const MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10;\n    const MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200;\n    const MAX_WIDTH = 1000;\n    const IMAGE_PADDING = 1;\n    const fnArray = context.fnArray,\n          argsArray = context.argsArray;\n    const curr = context.iCurr;\n    const iFirstSave = curr - 3;\n    const iFirstTransform = curr - 2;\n    const iFirstPIIXO = curr - 1;\n    const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_INLINE_IMAGES_BLOCK);\n\n    if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) {\n      return i - (i - iFirstSave) % 4;\n    }\n\n    let maxX = 0;\n    const map = [];\n    let maxLineHeight = 0;\n    let currentX = IMAGE_PADDING,\n        currentY = IMAGE_PADDING;\n\n    for (let q = 0; q < count; q++) {\n      const transform = argsArray[iFirstTransform + (q << 2)];\n      const img = argsArray[iFirstPIIXO + (q << 2)][0];\n\n      if (currentX + img.width > MAX_WIDTH) {\n        maxX = Math.max(maxX, currentX);\n        currentY += maxLineHeight + 2 * IMAGE_PADDING;\n        currentX = 0;\n        maxLineHeight = 0;\n      }\n\n      map.push({\n        transform,\n        x: currentX,\n        y: currentY,\n        w: img.width,\n        h: img.height\n      });\n      currentX += img.width + 2 * IMAGE_PADDING;\n      maxLineHeight = Math.max(maxLineHeight, img.height);\n    }\n\n    const imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING;\n    const imgHeight = currentY + maxLineHeight + IMAGE_PADDING;\n    const imgData = new Uint8ClampedArray(imgWidth * imgHeight * 4);\n    const imgRowSize = imgWidth << 2;\n\n    for (let q = 0; q < count; q++) {\n      const data = argsArray[iFirstPIIXO + (q << 2)][0].data;\n      const rowSize = map[q].w << 2;\n      let dataOffset = 0;\n      let offset = map[q].x + map[q].y * imgWidth << 2;\n      imgData.set(data.subarray(0, rowSize), offset - imgRowSize);\n\n      for (let k = 0, kk = map[q].h; k < kk; k++) {\n        imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset);\n        dataOffset += rowSize;\n        offset += imgRowSize;\n      }\n\n      imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset);\n\n      while (offset >= 0) {\n        data[offset - 4] = data[offset];\n        data[offset - 3] = data[offset + 1];\n        data[offset - 2] = data[offset + 2];\n        data[offset - 1] = data[offset + 3];\n        data[offset + rowSize] = data[offset + rowSize - 4];\n        data[offset + rowSize + 1] = data[offset + rowSize - 3];\n        data[offset + rowSize + 2] = data[offset + rowSize - 2];\n        data[offset + rowSize + 3] = data[offset + rowSize - 1];\n        offset -= imgRowSize;\n      }\n    }\n\n    fnArray.splice(iFirstSave, count * 4, _util.OPS.paintInlineImageXObjectGroup);\n    argsArray.splice(iFirstSave, count * 4, [{\n      width: imgWidth,\n      height: imgHeight,\n      kind: _util.ImageKind.RGBA_32BPP,\n      data: imgData\n    }, map]);\n    return iFirstSave + 1;\n  });\n  addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintImageMaskXObject, _util.OPS.restore], null, function iterateImageMaskGroup(context, i) {\n    const fnArray = context.fnArray;\n    const iFirstSave = context.iCurr - 3;\n    const pos = (i - iFirstSave) % 4;\n\n    switch (pos) {\n      case 0:\n        return fnArray[i] === _util.OPS.save;\n\n      case 1:\n        return fnArray[i] === _util.OPS.transform;\n\n      case 2:\n        return fnArray[i] === _util.OPS.paintImageMaskXObject;\n\n      case 3:\n        return fnArray[i] === _util.OPS.restore;\n    }\n\n    throw new Error(`iterateImageMaskGroup - invalid pos: ${pos}`);\n  }, function foundImageMaskGroup(context, i) {\n    const MIN_IMAGES_IN_MASKS_BLOCK = 10;\n    const MAX_IMAGES_IN_MASKS_BLOCK = 100;\n    const MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000;\n    const fnArray = context.fnArray,\n          argsArray = context.argsArray;\n    const curr = context.iCurr;\n    const iFirstSave = curr - 3;\n    const iFirstTransform = curr - 2;\n    const iFirstPIMXO = curr - 1;\n    let count = Math.floor((i - iFirstSave) / 4);\n    count = handlePaintSolidColorImageMask(iFirstSave, count, fnArray, argsArray);\n\n    if (count < MIN_IMAGES_IN_MASKS_BLOCK) {\n      return i - (i - iFirstSave) % 4;\n    }\n\n    let isSameImage = false;\n    let iTransform, transformArgs;\n    const firstPIMXOArg0 = argsArray[iFirstPIMXO][0];\n    const firstTransformArg0 = argsArray[iFirstTransform][0],\n          firstTransformArg1 = argsArray[iFirstTransform][1],\n          firstTransformArg2 = argsArray[iFirstTransform][2],\n          firstTransformArg3 = argsArray[iFirstTransform][3];\n\n    if (firstTransformArg1 === firstTransformArg2) {\n      isSameImage = true;\n      iTransform = iFirstTransform + 4;\n      let iPIMXO = iFirstPIMXO + 4;\n\n      for (let q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) {\n        transformArgs = argsArray[iTransform];\n\n        if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || transformArgs[0] !== firstTransformArg0 || transformArgs[1] !== firstTransformArg1 || transformArgs[2] !== firstTransformArg2 || transformArgs[3] !== firstTransformArg3) {\n          if (q < MIN_IMAGES_IN_MASKS_BLOCK) {\n            isSameImage = false;\n          } else {\n            count = q;\n          }\n\n          break;\n        }\n      }\n    }\n\n    if (isSameImage) {\n      count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK);\n      const positions = new Float32Array(count * 2);\n      iTransform = iFirstTransform;\n\n      for (let q = 0; q < count; q++, iTransform += 4) {\n        transformArgs = argsArray[iTransform];\n        positions[q << 1] = transformArgs[4];\n        positions[(q << 1) + 1] = transformArgs[5];\n      }\n\n      fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageMaskXObjectRepeat);\n      argsArray.splice(iFirstSave, count * 4, [firstPIMXOArg0, firstTransformArg0, firstTransformArg1, firstTransformArg2, firstTransformArg3, positions]);\n    } else {\n      count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK);\n      const images = [];\n\n      for (let q = 0; q < count; q++) {\n        transformArgs = argsArray[iFirstTransform + (q << 2)];\n        const maskParams = argsArray[iFirstPIMXO + (q << 2)][0];\n        images.push({\n          data: maskParams.data,\n          width: maskParams.width,\n          height: maskParams.height,\n          transform: transformArgs\n        });\n      }\n\n      fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageMaskXObjectGroup);\n      argsArray.splice(iFirstSave, count * 4, [images]);\n    }\n\n    return iFirstSave + 1;\n  });\n  addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintImageXObject, _util.OPS.restore], function (context) {\n    const argsArray = context.argsArray;\n    const iFirstTransform = context.iCurr - 2;\n    return argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0;\n  }, function iterateImageGroup(context, i) {\n    const fnArray = context.fnArray,\n          argsArray = context.argsArray;\n    const iFirstSave = context.iCurr - 3;\n    const pos = (i - iFirstSave) % 4;\n\n    switch (pos) {\n      case 0:\n        return fnArray[i] === _util.OPS.save;\n\n      case 1:\n        if (fnArray[i] !== _util.OPS.transform) {\n          return false;\n        }\n\n        const iFirstTransform = context.iCurr - 2;\n        const firstTransformArg0 = argsArray[iFirstTransform][0];\n        const firstTransformArg3 = argsArray[iFirstTransform][3];\n\n        if (argsArray[i][0] !== firstTransformArg0 || argsArray[i][1] !== 0 || argsArray[i][2] !== 0 || argsArray[i][3] !== firstTransformArg3) {\n          return false;\n        }\n\n        return true;\n\n      case 2:\n        if (fnArray[i] !== _util.OPS.paintImageXObject) {\n          return false;\n        }\n\n        const iFirstPIXO = context.iCurr - 1;\n        const firstPIXOArg0 = argsArray[iFirstPIXO][0];\n\n        if (argsArray[i][0] !== firstPIXOArg0) {\n          return false;\n        }\n\n        return true;\n\n      case 3:\n        return fnArray[i] === _util.OPS.restore;\n    }\n\n    throw new Error(`iterateImageGroup - invalid pos: ${pos}`);\n  }, function (context, i) {\n    const MIN_IMAGES_IN_BLOCK = 3;\n    const MAX_IMAGES_IN_BLOCK = 1000;\n    const fnArray = context.fnArray,\n          argsArray = context.argsArray;\n    const curr = context.iCurr;\n    const iFirstSave = curr - 3;\n    const iFirstTransform = curr - 2;\n    const iFirstPIXO = curr - 1;\n    const firstPIXOArg0 = argsArray[iFirstPIXO][0];\n    const firstTransformArg0 = argsArray[iFirstTransform][0];\n    const firstTransformArg3 = argsArray[iFirstTransform][3];\n    const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_BLOCK);\n\n    if (count < MIN_IMAGES_IN_BLOCK) {\n      return i - (i - iFirstSave) % 4;\n    }\n\n    const positions = new Float32Array(count * 2);\n    let iTransform = iFirstTransform;\n\n    for (let q = 0; q < count; q++, iTransform += 4) {\n      const transformArgs = argsArray[iTransform];\n      positions[q << 1] = transformArgs[4];\n      positions[(q << 1) + 1] = transformArgs[5];\n    }\n\n    const args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, positions];\n    fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageXObjectRepeat);\n    argsArray.splice(iFirstSave, count * 4, args);\n    return iFirstSave + 1;\n  });\n  addState(InitialState, [_util.OPS.beginText, _util.OPS.setFont, _util.OPS.setTextMatrix, _util.OPS.showText, _util.OPS.endText], null, function iterateShowTextGroup(context, i) {\n    const fnArray = context.fnArray,\n          argsArray = context.argsArray;\n    const iFirstSave = context.iCurr - 4;\n    const pos = (i - iFirstSave) % 5;\n\n    switch (pos) {\n      case 0:\n        return fnArray[i] === _util.OPS.beginText;\n\n      case 1:\n        return fnArray[i] === _util.OPS.setFont;\n\n      case 2:\n        return fnArray[i] === _util.OPS.setTextMatrix;\n\n      case 3:\n        if (fnArray[i] !== _util.OPS.showText) {\n          return false;\n        }\n\n        const iFirstSetFont = context.iCurr - 3;\n        const firstSetFontArg0 = argsArray[iFirstSetFont][0];\n        const firstSetFontArg1 = argsArray[iFirstSetFont][1];\n\n        if (argsArray[i][0] !== firstSetFontArg0 || argsArray[i][1] !== firstSetFontArg1) {\n          return false;\n        }\n\n        return true;\n\n      case 4:\n        return fnArray[i] === _util.OPS.endText;\n    }\n\n    throw new Error(`iterateShowTextGroup - invalid pos: ${pos}`);\n  }, function (context, i) {\n    const MIN_CHARS_IN_BLOCK = 3;\n    const MAX_CHARS_IN_BLOCK = 1000;\n    const fnArray = context.fnArray,\n          argsArray = context.argsArray;\n    const curr = context.iCurr;\n    const iFirstBeginText = curr - 4;\n    const iFirstSetFont = curr - 3;\n    const iFirstSetTextMatrix = curr - 2;\n    const iFirstShowText = curr - 1;\n    const iFirstEndText = curr;\n    const firstSetFontArg0 = argsArray[iFirstSetFont][0];\n    const firstSetFontArg1 = argsArray[iFirstSetFont][1];\n    let count = Math.min(Math.floor((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK);\n\n    if (count < MIN_CHARS_IN_BLOCK) {\n      return i - (i - iFirstBeginText) % 5;\n    }\n\n    let iFirst = iFirstBeginText;\n\n    if (iFirstBeginText >= 4 && fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) {\n      count++;\n      iFirst -= 5;\n    }\n\n    let iEndText = iFirst + 4;\n\n    for (let q = 1; q < count; q++) {\n      fnArray.splice(iEndText, 3);\n      argsArray.splice(iEndText, 3);\n      iEndText += 2;\n    }\n\n    return iEndText + 1;\n  });\n\n  function QueueOptimizer(queue) {\n    this.queue = queue;\n    this.state = null;\n    this.context = {\n      iCurr: 0,\n      fnArray: queue.fnArray,\n      argsArray: queue.argsArray\n    };\n    this.match = null;\n    this.lastProcessed = 0;\n  }\n\n  QueueOptimizer.prototype = {\n    _optimize() {\n      const fnArray = this.queue.fnArray;\n      let i = this.lastProcessed,\n          ii = fnArray.length;\n      let state = this.state;\n      let match = this.match;\n\n      if (!state && !match && i + 1 === ii && !InitialState[fnArray[i]]) {\n        this.lastProcessed = ii;\n        return;\n      }\n\n      const context = this.context;\n\n      while (i < ii) {\n        if (match) {\n          const iterate = (0, match.iterateFn)(context, i);\n\n          if (iterate) {\n            i++;\n            continue;\n          }\n\n          i = (0, match.processFn)(context, i + 1);\n          ii = fnArray.length;\n          match = null;\n          state = null;\n\n          if (i >= ii) {\n            break;\n          }\n        }\n\n        state = (state || InitialState)[fnArray[i]];\n\n        if (!state || Array.isArray(state)) {\n          i++;\n          continue;\n        }\n\n        context.iCurr = i;\n        i++;\n\n        if (state.checkFn && !(0, state.checkFn)(context)) {\n          state = null;\n          continue;\n        }\n\n        match = state;\n        state = null;\n      }\n\n      this.state = state;\n      this.match = match;\n      this.lastProcessed = i;\n    },\n\n    push(fn, args) {\n      this.queue.fnArray.push(fn);\n      this.queue.argsArray.push(args);\n\n      this._optimize();\n    },\n\n    flush() {\n      while (this.match) {\n        const length = this.queue.fnArray.length;\n        this.lastProcessed = (0, this.match.processFn)(this.context, length);\n        this.match = null;\n        this.state = null;\n\n        this._optimize();\n      }\n    },\n\n    reset() {\n      this.state = null;\n      this.match = null;\n      this.lastProcessed = 0;\n    }\n\n  };\n  return QueueOptimizer;\n}();\n\nconst NullOptimizer = function NullOptimizerClosure() {\n  function NullOptimizer(queue) {\n    this.queue = queue;\n  }\n\n  NullOptimizer.prototype = {\n    push(fn, args) {\n      this.queue.fnArray.push(fn);\n      this.queue.argsArray.push(args);\n    },\n\n    flush() {},\n\n    reset() {}\n\n  };\n  return NullOptimizer;\n}();\n\nconst OperatorList = function OperatorListClosure() {\n  const CHUNK_SIZE = 1000;\n  const CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5;\n\n  function OperatorList(intent, streamSink) {\n    this._streamSink = streamSink;\n    this.fnArray = [];\n    this.argsArray = [];\n\n    if (streamSink && intent !== \"oplist\") {\n      this.optimizer = new QueueOptimizer(this);\n    } else {\n      this.optimizer = new NullOptimizer(this);\n    }\n\n    this.dependencies = new Set();\n    this._totalLength = 0;\n    this.weight = 0;\n    this._resolved = streamSink ? null : Promise.resolve();\n  }\n\n  OperatorList.prototype = {\n    get length() {\n      return this.argsArray.length;\n    },\n\n    get ready() {\n      return this._resolved || this._streamSink.ready;\n    },\n\n    get totalLength() {\n      return this._totalLength + this.length;\n    },\n\n    addOp(fn, args) {\n      this.optimizer.push(fn, args);\n      this.weight++;\n\n      if (this._streamSink) {\n        if (this.weight >= CHUNK_SIZE) {\n          this.flush();\n        } else if (this.weight >= CHUNK_SIZE_ABOUT && (fn === _util.OPS.restore || fn === _util.OPS.endText)) {\n          this.flush();\n        }\n      }\n    },\n\n    addDependency(dependency) {\n      if (this.dependencies.has(dependency)) {\n        return;\n      }\n\n      this.dependencies.add(dependency);\n      this.addOp(_util.OPS.dependency, [dependency]);\n    },\n\n    addDependencies(dependencies) {\n      for (const dependency of dependencies) {\n        this.addDependency(dependency);\n      }\n    },\n\n    addOpList(opList) {\n      if (!(opList instanceof OperatorList)) {\n        (0, _util.warn)('addOpList - ignoring invalid \"opList\" parameter.');\n        return;\n      }\n\n      for (const dependency of opList.dependencies) {\n        this.dependencies.add(dependency);\n      }\n\n      for (let i = 0, ii = opList.length; i < ii; i++) {\n        this.addOp(opList.fnArray[i], opList.argsArray[i]);\n      }\n    },\n\n    getIR() {\n      return {\n        fnArray: this.fnArray,\n        argsArray: this.argsArray,\n        length: this.length\n      };\n    },\n\n    get _transfers() {\n      const transfers = [];\n      const {\n        fnArray,\n        argsArray,\n        length\n      } = this;\n\n      for (let i = 0; i < length; i++) {\n        switch (fnArray[i]) {\n          case _util.OPS.paintInlineImageXObject:\n          case _util.OPS.paintInlineImageXObjectGroup:\n          case _util.OPS.paintImageMaskXObject:\n            const arg = argsArray[i][0];\n            ;\n\n            if (!arg.cached) {\n              transfers.push(arg.data.buffer);\n            }\n\n            break;\n        }\n      }\n\n      return transfers;\n    },\n\n    flush(lastChunk = false) {\n      this.optimizer.flush();\n      const length = this.length;\n      this._totalLength += length;\n\n      this._streamSink.enqueue({\n        fnArray: this.fnArray,\n        argsArray: this.argsArray,\n        lastChunk,\n        length\n      }, 1, this._transfers);\n\n      this.dependencies.clear();\n      this.fnArray.length = 0;\n      this.argsArray.length = 0;\n      this.weight = 0;\n      this.optimizer.reset();\n    }\n\n  };\n  return OperatorList;\n}();\n\nexports.OperatorList = OperatorList;\n\n/***/ }),\n/* 47 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFImage = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _primitives = __w_pdfjs_require__(5);\n\nvar _colorspace = __w_pdfjs_require__(23);\n\nvar _stream = __w_pdfjs_require__(12);\n\nvar _jpeg_stream = __w_pdfjs_require__(18);\n\nvar _jpx = __w_pdfjs_require__(21);\n\nfunction decodeAndClamp(value, addend, coefficient, max) {\n  value = addend + value * coefficient;\n\n  if (value < 0) {\n    value = 0;\n  } else if (value > max) {\n    value = max;\n  }\n\n  return value;\n}\n\nfunction resizeImageMask(src, bpc, w1, h1, w2, h2) {\n  var length = w2 * h2;\n  let dest;\n\n  if (bpc <= 8) {\n    dest = new Uint8Array(length);\n  } else if (bpc <= 16) {\n    dest = new Uint16Array(length);\n  } else {\n    dest = new Uint32Array(length);\n  }\n\n  var xRatio = w1 / w2;\n  var yRatio = h1 / h2;\n  var i,\n      j,\n      py,\n      newIndex = 0,\n      oldIndex;\n  var xScaled = new Uint16Array(w2);\n  var w1Scanline = w1;\n\n  for (i = 0; i < w2; i++) {\n    xScaled[i] = Math.floor(i * xRatio);\n  }\n\n  for (i = 0; i < h2; i++) {\n    py = Math.floor(i * yRatio) * w1Scanline;\n\n    for (j = 0; j < w2; j++) {\n      oldIndex = py + xScaled[j];\n      dest[newIndex++] = src[oldIndex];\n    }\n  }\n\n  return dest;\n}\n\nclass PDFImage {\n  constructor({\n    xref,\n    res,\n    image,\n    isInline = false,\n    smask = null,\n    mask = null,\n    isMask = false,\n    pdfFunctionFactory,\n    localColorSpaceCache\n  }) {\n    this.image = image;\n    var dict = image.dict;\n    const filter = dict.get(\"Filter\");\n\n    if ((0, _primitives.isName)(filter)) {\n      switch (filter.name) {\n        case \"JPXDecode\":\n          var jpxImage = new _jpx.JpxImage();\n          jpxImage.parseImageProperties(image.stream);\n          image.stream.reset();\n          image.width = jpxImage.width;\n          image.height = jpxImage.height;\n          image.bitsPerComponent = jpxImage.bitsPerComponent;\n          image.numComps = jpxImage.componentsCount;\n          break;\n\n        case \"JBIG2Decode\":\n          image.bitsPerComponent = 1;\n          image.numComps = 1;\n          break;\n      }\n    }\n\n    let width = dict.get(\"Width\", \"W\");\n    let height = dict.get(\"Height\", \"H\");\n\n    if (Number.isInteger(image.width) && image.width > 0 && Number.isInteger(image.height) && image.height > 0 && (image.width !== width || image.height !== height)) {\n      (0, _util.warn)(\"PDFImage - using the Width/Height of the image data, \" + \"rather than the image dictionary.\");\n      width = image.width;\n      height = image.height;\n    }\n\n    if (width < 1 || height < 1) {\n      throw new _util.FormatError(`Invalid image width: ${width} or height: ${height}`);\n    }\n\n    this.width = width;\n    this.height = height;\n    this.interpolate = dict.get(\"Interpolate\", \"I\") || false;\n    this.imageMask = dict.get(\"ImageMask\", \"IM\") || false;\n    this.matte = dict.get(\"Matte\") || false;\n    var bitsPerComponent = image.bitsPerComponent;\n\n    if (!bitsPerComponent) {\n      bitsPerComponent = dict.get(\"BitsPerComponent\", \"BPC\");\n\n      if (!bitsPerComponent) {\n        if (this.imageMask) {\n          bitsPerComponent = 1;\n        } else {\n          throw new _util.FormatError(`Bits per component missing in image: ${this.imageMask}`);\n        }\n      }\n    }\n\n    this.bpc = bitsPerComponent;\n\n    if (!this.imageMask) {\n      let colorSpace = dict.getRaw(\"ColorSpace\") || dict.getRaw(\"CS\");\n\n      if (!colorSpace) {\n        (0, _util.info)(\"JPX images (which do not require color spaces)\");\n\n        switch (image.numComps) {\n          case 1:\n            colorSpace = _primitives.Name.get(\"DeviceGray\");\n            break;\n\n          case 3:\n            colorSpace = _primitives.Name.get(\"DeviceRGB\");\n            break;\n\n          case 4:\n            colorSpace = _primitives.Name.get(\"DeviceCMYK\");\n            break;\n\n          default:\n            throw new Error(`JPX images with ${image.numComps} ` + \"color components not supported.\");\n        }\n      }\n\n      this.colorSpace = _colorspace.ColorSpace.parse({\n        cs: colorSpace,\n        xref,\n        resources: isInline ? res : null,\n        pdfFunctionFactory,\n        localColorSpaceCache\n      });\n      this.numComps = this.colorSpace.numComps;\n    }\n\n    this.decode = dict.getArray(\"Decode\", \"D\");\n    this.needsDecode = false;\n\n    if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode, bitsPerComponent) || isMask && !_colorspace.ColorSpace.isDefaultDecode(this.decode, 1))) {\n      this.needsDecode = true;\n      var max = (1 << bitsPerComponent) - 1;\n      this.decodeCoefficients = [];\n      this.decodeAddends = [];\n      const isIndexed = this.colorSpace && this.colorSpace.name === \"Indexed\";\n\n      for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {\n        var dmin = this.decode[i];\n        var dmax = this.decode[i + 1];\n        this.decodeCoefficients[j] = isIndexed ? (dmax - dmin) / max : dmax - dmin;\n        this.decodeAddends[j] = isIndexed ? dmin : max * dmin;\n      }\n    }\n\n    if (smask) {\n      this.smask = new PDFImage({\n        xref,\n        res,\n        image: smask,\n        isInline,\n        pdfFunctionFactory,\n        localColorSpaceCache\n      });\n    } else if (mask) {\n      if ((0, _primitives.isStream)(mask)) {\n        var maskDict = mask.dict,\n            imageMask = maskDict.get(\"ImageMask\", \"IM\");\n\n        if (!imageMask) {\n          (0, _util.warn)(\"Ignoring /Mask in image without /ImageMask.\");\n        } else {\n          this.mask = new PDFImage({\n            xref,\n            res,\n            image: mask,\n            isInline,\n            isMask: true,\n            pdfFunctionFactory,\n            localColorSpaceCache\n          });\n        }\n      } else {\n        this.mask = mask;\n      }\n    }\n  }\n\n  static async buildImage({\n    xref,\n    res,\n    image,\n    isInline = false,\n    pdfFunctionFactory,\n    localColorSpaceCache\n  }) {\n    const imageData = image;\n    let smaskData = null;\n    let maskData = null;\n    const smask = image.dict.get(\"SMask\");\n    const mask = image.dict.get(\"Mask\");\n\n    if (smask) {\n      smaskData = smask;\n    } else if (mask) {\n      if ((0, _primitives.isStream)(mask) || Array.isArray(mask)) {\n        maskData = mask;\n      } else {\n        (0, _util.warn)(\"Unsupported mask format.\");\n      }\n    }\n\n    return new PDFImage({\n      xref,\n      res,\n      image: imageData,\n      isInline,\n      smask: smaskData,\n      mask: maskData,\n      pdfFunctionFactory,\n      localColorSpaceCache\n    });\n  }\n\n  static createMask({\n    imgArray,\n    width,\n    height,\n    imageIsFromDecodeStream,\n    inverseDecode\n  }) {\n    var computedLength = (width + 7 >> 3) * height;\n    var actualLength = imgArray.byteLength;\n    var haveFullData = computedLength === actualLength;\n    var data, i;\n\n    if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) {\n      data = imgArray;\n    } else if (!inverseDecode) {\n      data = new Uint8ClampedArray(actualLength);\n      data.set(imgArray);\n    } else {\n      data = new Uint8ClampedArray(computedLength);\n      data.set(imgArray);\n\n      for (i = actualLength; i < computedLength; i++) {\n        data[i] = 0xff;\n      }\n    }\n\n    if (inverseDecode) {\n      for (i = 0; i < actualLength; i++) {\n        data[i] ^= 0xff;\n      }\n    }\n\n    return {\n      data,\n      width,\n      height\n    };\n  }\n\n  get drawWidth() {\n    return Math.max(this.width, this.smask && this.smask.width || 0, this.mask && this.mask.width || 0);\n  }\n\n  get drawHeight() {\n    return Math.max(this.height, this.smask && this.smask.height || 0, this.mask && this.mask.height || 0);\n  }\n\n  decodeBuffer(buffer) {\n    var bpc = this.bpc;\n    var numComps = this.numComps;\n    var decodeAddends = this.decodeAddends;\n    var decodeCoefficients = this.decodeCoefficients;\n    var max = (1 << bpc) - 1;\n    var i, ii;\n\n    if (bpc === 1) {\n      for (i = 0, ii = buffer.length; i < ii; i++) {\n        buffer[i] = +!buffer[i];\n      }\n\n      return;\n    }\n\n    var index = 0;\n\n    for (i = 0, ii = this.width * this.height; i < ii; i++) {\n      for (var j = 0; j < numComps; j++) {\n        buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], decodeCoefficients[j], max);\n        index++;\n      }\n    }\n  }\n\n  getComponents(buffer) {\n    var bpc = this.bpc;\n\n    if (bpc === 8) {\n      return buffer;\n    }\n\n    var width = this.width;\n    var height = this.height;\n    var numComps = this.numComps;\n    var length = width * height * numComps;\n    var bufferPos = 0;\n    let output;\n\n    if (bpc <= 8) {\n      output = new Uint8Array(length);\n    } else if (bpc <= 16) {\n      output = new Uint16Array(length);\n    } else {\n      output = new Uint32Array(length);\n    }\n\n    var rowComps = width * numComps;\n    var max = (1 << bpc) - 1;\n    var i = 0,\n        ii,\n        buf;\n\n    if (bpc === 1) {\n      var mask, loop1End, loop2End;\n\n      for (var j = 0; j < height; j++) {\n        loop1End = i + (rowComps & ~7);\n        loop2End = i + rowComps;\n\n        while (i < loop1End) {\n          buf = buffer[bufferPos++];\n          output[i] = buf >> 7 & 1;\n          output[i + 1] = buf >> 6 & 1;\n          output[i + 2] = buf >> 5 & 1;\n          output[i + 3] = buf >> 4 & 1;\n          output[i + 4] = buf >> 3 & 1;\n          output[i + 5] = buf >> 2 & 1;\n          output[i + 6] = buf >> 1 & 1;\n          output[i + 7] = buf & 1;\n          i += 8;\n        }\n\n        if (i < loop2End) {\n          buf = buffer[bufferPos++];\n          mask = 128;\n\n          while (i < loop2End) {\n            output[i++] = +!!(buf & mask);\n            mask >>= 1;\n          }\n        }\n      }\n    } else {\n      var bits = 0;\n      buf = 0;\n\n      for (i = 0, ii = length; i < ii; ++i) {\n        if (i % rowComps === 0) {\n          buf = 0;\n          bits = 0;\n        }\n\n        while (bits < bpc) {\n          buf = buf << 8 | buffer[bufferPos++];\n          bits += 8;\n        }\n\n        var remainingBits = bits - bpc;\n        let value = buf >> remainingBits;\n\n        if (value < 0) {\n          value = 0;\n        } else if (value > max) {\n          value = max;\n        }\n\n        output[i] = value;\n        buf = buf & (1 << remainingBits) - 1;\n        bits = remainingBits;\n      }\n    }\n\n    return output;\n  }\n\n  fillOpacity(rgbaBuf, width, height, actualHeight, image) {\n    var smask = this.smask;\n    var mask = this.mask;\n    var alphaBuf, sw, sh, i, ii, j;\n\n    if (smask) {\n      sw = smask.width;\n      sh = smask.height;\n      alphaBuf = new Uint8ClampedArray(sw * sh);\n      smask.fillGrayBuffer(alphaBuf);\n\n      if (sw !== width || sh !== height) {\n        alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height);\n      }\n    } else if (mask) {\n      if (mask instanceof PDFImage) {\n        sw = mask.width;\n        sh = mask.height;\n        alphaBuf = new Uint8ClampedArray(sw * sh);\n        mask.numComps = 1;\n        mask.fillGrayBuffer(alphaBuf);\n\n        for (i = 0, ii = sw * sh; i < ii; ++i) {\n          alphaBuf[i] = 255 - alphaBuf[i];\n        }\n\n        if (sw !== width || sh !== height) {\n          alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, width, height);\n        }\n      } else if (Array.isArray(mask)) {\n        alphaBuf = new Uint8ClampedArray(width * height);\n        var numComps = this.numComps;\n\n        for (i = 0, ii = width * height; i < ii; ++i) {\n          var opacity = 0;\n          var imageOffset = i * numComps;\n\n          for (j = 0; j < numComps; ++j) {\n            var color = image[imageOffset + j];\n            var maskOffset = j * 2;\n\n            if (color < mask[maskOffset] || color > mask[maskOffset + 1]) {\n              opacity = 255;\n              break;\n            }\n          }\n\n          alphaBuf[i] = opacity;\n        }\n      } else {\n        throw new _util.FormatError(\"Unknown mask format.\");\n      }\n    }\n\n    if (alphaBuf) {\n      for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {\n        rgbaBuf[j] = alphaBuf[i];\n      }\n    } else {\n      for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {\n        rgbaBuf[j] = 255;\n      }\n    }\n  }\n\n  undoPreblend(buffer, width, height) {\n    var matte = this.smask && this.smask.matte;\n\n    if (!matte) {\n      return;\n    }\n\n    var matteRgb = this.colorSpace.getRgb(matte, 0);\n    var matteR = matteRgb[0];\n    var matteG = matteRgb[1];\n    var matteB = matteRgb[2];\n    var length = width * height * 4;\n\n    for (var i = 0; i < length; i += 4) {\n      var alpha = buffer[i + 3];\n\n      if (alpha === 0) {\n        buffer[i] = 255;\n        buffer[i + 1] = 255;\n        buffer[i + 2] = 255;\n        continue;\n      }\n\n      var k = 255 / alpha;\n      buffer[i] = (buffer[i] - matteR) * k + matteR;\n      buffer[i + 1] = (buffer[i + 1] - matteG) * k + matteG;\n      buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB;\n    }\n  }\n\n  createImageData(forceRGBA = false) {\n    var drawWidth = this.drawWidth;\n    var drawHeight = this.drawHeight;\n    var imgData = {\n      width: drawWidth,\n      height: drawHeight,\n      kind: 0,\n      data: null\n    };\n    var numComps = this.numComps;\n    var originalWidth = this.width;\n    var originalHeight = this.height;\n    var bpc = this.bpc;\n    var rowBytes = originalWidth * numComps * bpc + 7 >> 3;\n    var imgArray;\n\n    if (!forceRGBA) {\n      var kind;\n\n      if (this.colorSpace.name === \"DeviceGray\" && bpc === 1) {\n        kind = _util.ImageKind.GRAYSCALE_1BPP;\n      } else if (this.colorSpace.name === \"DeviceRGB\" && bpc === 8 && !this.needsDecode) {\n        kind = _util.ImageKind.RGB_24BPP;\n      }\n\n      if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) {\n        imgData.kind = kind;\n        imgArray = this.getImageBytes(originalHeight * rowBytes);\n\n        if (this.image instanceof _stream.DecodeStream) {\n          imgData.data = imgArray;\n        } else {\n          var newArray = new Uint8ClampedArray(imgArray.length);\n          newArray.set(imgArray);\n          imgData.data = newArray;\n        }\n\n        if (this.needsDecode) {\n          (0, _util.assert)(kind === _util.ImageKind.GRAYSCALE_1BPP, \"PDFImage.createImageData: The image must be grayscale.\");\n          var buffer = imgData.data;\n\n          for (var i = 0, ii = buffer.length; i < ii; i++) {\n            buffer[i] ^= 0xff;\n          }\n        }\n\n        return imgData;\n      }\n\n      if (this.image instanceof _jpeg_stream.JpegStream && !this.smask && !this.mask) {\n        let imageLength = originalHeight * rowBytes;\n\n        switch (this.colorSpace.name) {\n          case \"DeviceGray\":\n            imageLength *= 3;\n\n          case \"DeviceRGB\":\n          case \"DeviceCMYK\":\n            imgData.kind = _util.ImageKind.RGB_24BPP;\n            imgData.data = this.getImageBytes(imageLength, drawWidth, drawHeight, true);\n            return imgData;\n        }\n      }\n    }\n\n    imgArray = this.getImageBytes(originalHeight * rowBytes);\n    var actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight;\n    var comps = this.getComponents(imgArray);\n    var alpha01, maybeUndoPreblend;\n\n    if (!forceRGBA && !this.smask && !this.mask) {\n      imgData.kind = _util.ImageKind.RGB_24BPP;\n      imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 3);\n      alpha01 = 0;\n      maybeUndoPreblend = false;\n    } else {\n      imgData.kind = _util.ImageKind.RGBA_32BPP;\n      imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 4);\n      alpha01 = 1;\n      maybeUndoPreblend = true;\n      this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, comps);\n    }\n\n    if (this.needsDecode) {\n      this.decodeBuffer(comps);\n    }\n\n    this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01);\n\n    if (maybeUndoPreblend) {\n      this.undoPreblend(imgData.data, drawWidth, actualHeight);\n    }\n\n    return imgData;\n  }\n\n  fillGrayBuffer(buffer) {\n    var numComps = this.numComps;\n\n    if (numComps !== 1) {\n      throw new _util.FormatError(`Reading gray scale from a color image: ${numComps}`);\n    }\n\n    var width = this.width;\n    var height = this.height;\n    var bpc = this.bpc;\n    var rowBytes = width * numComps * bpc + 7 >> 3;\n    var imgArray = this.getImageBytes(height * rowBytes);\n    var comps = this.getComponents(imgArray);\n    var i, length;\n\n    if (bpc === 1) {\n      length = width * height;\n\n      if (this.needsDecode) {\n        for (i = 0; i < length; ++i) {\n          buffer[i] = comps[i] - 1 & 255;\n        }\n      } else {\n        for (i = 0; i < length; ++i) {\n          buffer[i] = -comps[i] & 255;\n        }\n      }\n\n      return;\n    }\n\n    if (this.needsDecode) {\n      this.decodeBuffer(comps);\n    }\n\n    length = width * height;\n    var scale = 255 / ((1 << bpc) - 1);\n\n    for (i = 0; i < length; ++i) {\n      buffer[i] = scale * comps[i];\n    }\n  }\n\n  getImageBytes(length, drawWidth, drawHeight, forceRGB = false) {\n    this.image.reset();\n    this.image.drawWidth = drawWidth || this.width;\n    this.image.drawHeight = drawHeight || this.height;\n    this.image.forceRGB = !!forceRGB;\n    return this.image.getBytes(length, true);\n  }\n\n}\n\nexports.PDFImage = PDFImage;\n\n/***/ }),\n/* 48 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.incrementalUpdate = incrementalUpdate;\nexports.writeDict = writeDict;\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _primitives = __w_pdfjs_require__(5);\n\nvar _core_utils = __w_pdfjs_require__(8);\n\nvar _xml_parser = __w_pdfjs_require__(26);\n\nvar _crypto = __w_pdfjs_require__(22);\n\nfunction writeDict(dict, buffer, transform) {\n  buffer.push(\"<<\");\n\n  for (const key of dict.getKeys()) {\n    buffer.push(` /${(0, _core_utils.escapePDFName)(key)} `);\n    writeValue(dict.getRaw(key), buffer, transform);\n  }\n\n  buffer.push(\">>\");\n}\n\nfunction writeStream(stream, buffer, transform) {\n  writeDict(stream.dict, buffer, transform);\n  buffer.push(\" stream\\n\");\n  let string = (0, _util.bytesToString)(stream.getBytes());\n\n  if (transform !== null) {\n    string = transform.encryptString(string);\n  }\n\n  buffer.push(string);\n  buffer.push(\"\\nendstream\\n\");\n}\n\nfunction writeArray(array, buffer, transform) {\n  buffer.push(\"[\");\n  let first = true;\n\n  for (const val of array) {\n    if (!first) {\n      buffer.push(\" \");\n    } else {\n      first = false;\n    }\n\n    writeValue(val, buffer, transform);\n  }\n\n  buffer.push(\"]\");\n}\n\nfunction numberToString(value) {\n  if (Number.isInteger(value)) {\n    return value.toString();\n  }\n\n  const roundedValue = Math.round(value * 100);\n\n  if (roundedValue % 100 === 0) {\n    return (roundedValue / 100).toString();\n  }\n\n  if (roundedValue % 10 === 0) {\n    return value.toFixed(1);\n  }\n\n  return value.toFixed(2);\n}\n\nfunction writeValue(value, buffer, transform) {\n  if ((0, _primitives.isName)(value)) {\n    buffer.push(`/${(0, _core_utils.escapePDFName)(value.name)}`);\n  } else if ((0, _primitives.isRef)(value)) {\n    buffer.push(`${value.num} ${value.gen} R`);\n  } else if (Array.isArray(value)) {\n    writeArray(value, buffer, transform);\n  } else if (typeof value === \"string\") {\n    if (transform !== null) {\n      value = transform.encryptString(value);\n    }\n\n    buffer.push(`(${(0, _util.escapeString)(value)})`);\n  } else if (typeof value === \"number\") {\n    buffer.push(numberToString(value));\n  } else if ((0, _primitives.isDict)(value)) {\n    writeDict(value, buffer, transform);\n  } else if ((0, _primitives.isStream)(value)) {\n    writeStream(value, buffer, transform);\n  }\n}\n\nfunction writeInt(number, size, offset, buffer) {\n  for (let i = size + offset - 1; i > offset - 1; i--) {\n    buffer[i] = number & 0xff;\n    number >>= 8;\n  }\n\n  return offset + size;\n}\n\nfunction writeString(string, offset, buffer) {\n  for (let i = 0, len = string.length; i < len; i++) {\n    buffer[offset + i] = string.charCodeAt(i) & 0xff;\n  }\n}\n\nfunction computeMD5(filesize, xrefInfo) {\n  const time = Math.floor(Date.now() / 1000);\n  const filename = xrefInfo.filename || \"\";\n  const md5Buffer = [time.toString(), filename, filesize.toString()];\n  let md5BufferLen = md5Buffer.reduce((a, str) => a + str.length, 0);\n\n  for (const value of Object.values(xrefInfo.info)) {\n    md5Buffer.push(value);\n    md5BufferLen += value.length;\n  }\n\n  const array = new Uint8Array(md5BufferLen);\n  let offset = 0;\n\n  for (const str of md5Buffer) {\n    writeString(str, offset, array);\n    offset += str.length;\n  }\n\n  return (0, _util.bytesToString)((0, _crypto.calculateMD5)(array));\n}\n\nfunction updateXFA(datasetsRef, newRefs, xref) {\n  if (datasetsRef === null || xref === null) {\n    return;\n  }\n\n  const datasets = xref.fetchIfRef(datasetsRef);\n  const str = (0, _util.bytesToString)(datasets.getBytes());\n  const xml = new _xml_parser.SimpleXMLParser({\n    hasAttributes: true\n  }).parseFromString(str);\n\n  for (const {\n    xfa\n  } of newRefs) {\n    if (!xfa) {\n      continue;\n    }\n\n    const {\n      path,\n      value\n    } = xfa;\n\n    if (!path) {\n      continue;\n    }\n\n    const node = xml.documentElement.searchNode((0, _core_utils.parseXFAPath)(path), 0);\n\n    if (node) {\n      node.childNodes = [new _xml_parser.SimpleDOMNode(\"#text\", value)];\n    } else {\n      (0, _util.warn)(`Node not found for path: ${path}`);\n    }\n  }\n\n  const buffer = [];\n  xml.documentElement.dump(buffer);\n  let updatedXml = buffer.join(\"\");\n  const encrypt = xref.encrypt;\n\n  if (encrypt) {\n    const transform = encrypt.createCipherTransform(datasetsRef.num, datasetsRef.gen);\n    updatedXml = transform.encryptString(updatedXml);\n  }\n\n  const data = `${datasetsRef.num} ${datasetsRef.gen} obj\\n` + `<< /Type /EmbeddedFile /Length ${updatedXml.length}>>\\nstream\\n` + updatedXml + \"\\nendstream\\nendobj\\n\";\n  newRefs.push({\n    ref: datasetsRef,\n    data\n  });\n}\n\nfunction incrementalUpdate({\n  originalData,\n  xrefInfo,\n  newRefs,\n  xref = null,\n  datasetsRef = null\n}) {\n  updateXFA(datasetsRef, newRefs, xref);\n  const newXref = new _primitives.Dict(null);\n  const refForXrefTable = xrefInfo.newRef;\n  let buffer, baseOffset;\n  const lastByte = originalData[originalData.length - 1];\n\n  if (lastByte === 0x0a || lastByte === 0x0d) {\n    buffer = [];\n    baseOffset = originalData.length;\n  } else {\n    buffer = [\"\\n\"];\n    baseOffset = originalData.length + 1;\n  }\n\n  newXref.set(\"Size\", refForXrefTable.num + 1);\n  newXref.set(\"Prev\", xrefInfo.startXRef);\n  newXref.set(\"Type\", _primitives.Name.get(\"XRef\"));\n\n  if (xrefInfo.rootRef !== null) {\n    newXref.set(\"Root\", xrefInfo.rootRef);\n  }\n\n  if (xrefInfo.infoRef !== null) {\n    newXref.set(\"Info\", xrefInfo.infoRef);\n  }\n\n  if (xrefInfo.encrypt !== null) {\n    newXref.set(\"Encrypt\", xrefInfo.encrypt);\n  }\n\n  newRefs.push({\n    ref: refForXrefTable,\n    data: \"\"\n  });\n  newRefs = newRefs.sort((a, b) => {\n    return a.ref.num - b.ref.num;\n  });\n  const xrefTableData = [[0, 1, 0xffff]];\n  const indexes = [0, 1];\n  let maxOffset = 0;\n\n  for (const {\n    ref,\n    data\n  } of newRefs) {\n    maxOffset = Math.max(maxOffset, baseOffset);\n    xrefTableData.push([1, baseOffset, Math.min(ref.gen, 0xffff)]);\n    baseOffset += data.length;\n    indexes.push(ref.num);\n    indexes.push(1);\n    buffer.push(data);\n  }\n\n  newXref.set(\"Index\", indexes);\n\n  if (xrefInfo.fileIds.length !== 0) {\n    const md5 = computeMD5(baseOffset, xrefInfo);\n    newXref.set(\"ID\", [xrefInfo.fileIds[0], md5]);\n  }\n\n  const offsetSize = Math.ceil(Math.log2(maxOffset) / 8);\n  const sizes = [1, offsetSize, 2];\n  const structSize = sizes[0] + sizes[1] + sizes[2];\n  const tableLength = structSize * xrefTableData.length;\n  newXref.set(\"W\", sizes);\n  newXref.set(\"Length\", tableLength);\n  buffer.push(`${refForXrefTable.num} ${refForXrefTable.gen} obj\\n`);\n  writeDict(newXref, buffer, null);\n  buffer.push(\" stream\\n\");\n  const bufferLen = buffer.reduce((a, str) => a + str.length, 0);\n  const footer = `\\nendstream\\nendobj\\nstartxref\\n${baseOffset}\\n%%EOF\\n`;\n  const array = new Uint8Array(originalData.length + bufferLen + tableLength + footer.length);\n  array.set(originalData);\n  let offset = originalData.length;\n\n  for (const str of buffer) {\n    writeString(str, offset, array);\n    offset += str.length;\n  }\n\n  for (const [type, objOffset, gen] of xrefTableData) {\n    offset = writeInt(type, sizes[0], offset, array);\n    offset = writeInt(objOffset, sizes[1], offset, array);\n    offset = writeInt(gen, sizes[2], offset, array);\n  }\n\n  writeString(footer, offset, array);\n  return array;\n}\n\n/***/ }),\n/* 49 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.XFAFactory = void 0;\n\nvar _xfa_object = __w_pdfjs_require__(50);\n\nvar _bind = __w_pdfjs_require__(53);\n\nvar _parser = __w_pdfjs_require__(57);\n\nclass XFAFactory {\n  constructor(data) {\n    try {\n      this.root = new _parser.XFAParser().parse(XFAFactory._createDocument(data));\n      this.form = new _bind.Binder(this.root).bind();\n      this.pages = this.form[_xfa_object.$toHTML]();\n    } catch (e) {\n      console.log(e);\n    }\n  }\n\n  getPage(pageIndex) {\n    return this.pages.children[pageIndex];\n  }\n\n  get numberPages() {\n    return this.pages.children.length;\n  }\n\n  static _createDocument(data) {\n    if (!data[\"/xdp:xdp\"]) {\n      return data[\"xdp:xdp\"];\n    }\n\n    return Object.values(data).join(\"\");\n  }\n\n}\n\nexports.XFAFactory = XFAFactory;\n\n/***/ }),\n/* 50 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.XmlObject = exports.XFAObjectArray = exports.XFAObject = exports.XFAAttribute = exports.StringObject = exports.OptionObject = exports.Option10 = exports.Option01 = exports.IntegerObject = exports.ContentObject = exports.$uid = exports.$toStyle = exports.$toHTML = exports.$text = exports.$setValue = exports.$setSetAttributes = exports.$setId = exports.$resolvePrototypes = exports.$removeChild = exports.$onText = exports.$onChildCheck = exports.$onChild = exports.$nsAttributes = exports.$nodeName = exports.$namespaceId = exports.$isTransparent = exports.$isDescendent = exports.$isDataValue = exports.$insertAt = exports.$indexOf = exports.$hasSettableValue = exports.$hasItem = exports.$global = exports.$getRealChildrenByNameIt = exports.$getParent = exports.$getChildrenByNameIt = exports.$getChildrenByName = exports.$getChildrenByClass = exports.$getChildren = exports.$getAttributeIt = exports.$finalize = exports.$extra = exports.$dump = exports.$data = exports.$content = exports.$consumed = exports.$clone = exports.$cleanup = exports.$clean = exports.$childrenToHTML = exports.$appendChild = void 0;\n\nvar _utils = __w_pdfjs_require__(51);\n\nvar _util = __w_pdfjs_require__(2);\n\nvar _namespaces = __w_pdfjs_require__(52);\n\nconst $appendChild = Symbol();\nexports.$appendChild = $appendChild;\nconst $childrenToHTML = Symbol();\nexports.$childrenToHTML = $childrenToHTML;\nconst $clean = Symbol();\nexports.$clean = $clean;\nconst $cleanup = Symbol();\nexports.$cleanup = $cleanup;\nconst $clone = Symbol();\nexports.$clone = $clone;\nconst $consumed = Symbol();\nexports.$consumed = $consumed;\nconst $content = Symbol(\"content\");\nexports.$content = $content;\nconst $data = Symbol(\"data\");\nexports.$data = $data;\nconst $dump = Symbol();\nexports.$dump = $dump;\nconst $extra = Symbol(\"extra\");\nexports.$extra = $extra;\nconst $finalize = Symbol();\nexports.$finalize = $finalize;\nconst $getAttributeIt = Symbol();\nexports.$getAttributeIt = $getAttributeIt;\nconst $getChildrenByClass = Symbol();\nexports.$getChildrenByClass = $getChildrenByClass;\nconst $getChildrenByName = Symbol();\nexports.$getChildrenByName = $getChildrenByName;\nconst $getChildrenByNameIt = Symbol();\nexports.$getChildrenByNameIt = $getChildrenByNameIt;\nconst $getRealChildrenByNameIt = Symbol();\nexports.$getRealChildrenByNameIt = $getRealChildrenByNameIt;\nconst $getChildren = Symbol();\nexports.$getChildren = $getChildren;\nconst $getParent = Symbol();\nexports.$getParent = $getParent;\nconst $global = Symbol();\nexports.$global = $global;\nconst $hasItem = Symbol();\nexports.$hasItem = $hasItem;\nconst $hasSettableValue = Symbol();\nexports.$hasSettableValue = $hasSettableValue;\nconst $indexOf = Symbol();\nexports.$indexOf = $indexOf;\nconst $insertAt = Symbol();\nexports.$insertAt = $insertAt;\nconst $isDataValue = Symbol();\nexports.$isDataValue = $isDataValue;\nconst $isDescendent = Symbol();\nexports.$isDescendent = $isDescendent;\nconst $isTransparent = Symbol();\nexports.$isTransparent = $isTransparent;\nconst $lastAttribute = Symbol();\nconst $namespaceId = Symbol(\"namespaceId\");\nexports.$namespaceId = $namespaceId;\nconst $nodeName = Symbol(\"nodeName\");\nexports.$nodeName = $nodeName;\nconst $nsAttributes = Symbol();\nexports.$nsAttributes = $nsAttributes;\nconst $onChild = Symbol();\nexports.$onChild = $onChild;\nconst $onChildCheck = Symbol();\nexports.$onChildCheck = $onChildCheck;\nconst $onText = Symbol();\nexports.$onText = $onText;\nconst $removeChild = Symbol();\nexports.$removeChild = $removeChild;\nconst $resolvePrototypes = Symbol();\nexports.$resolvePrototypes = $resolvePrototypes;\nconst $setId = Symbol();\nexports.$setId = $setId;\nconst $setSetAttributes = Symbol();\nexports.$setSetAttributes = $setSetAttributes;\nconst $setValue = Symbol();\nexports.$setValue = $setValue;\nconst $text = Symbol();\nexports.$text = $text;\nconst $toHTML = Symbol();\nexports.$toHTML = $toHTML;\nconst $toStyle = Symbol();\nexports.$toStyle = $toStyle;\nconst $uid = Symbol(\"uid\");\nexports.$uid = $uid;\n\nconst _applyPrototype = Symbol();\n\nconst _attributes = Symbol();\n\nconst _attributeNames = Symbol();\n\nconst _children = Symbol(\"_children\");\n\nconst _cloneAttribute = Symbol();\n\nconst _dataValue = Symbol();\n\nconst _defaultValue = Symbol();\n\nconst _getPrototype = Symbol();\n\nconst _getUnsetAttributes = Symbol();\n\nconst _hasChildren = Symbol();\n\nconst _max = Symbol();\n\nconst _options = Symbol();\n\nconst _parent = Symbol(\"parent\");\n\nconst _setAttributes = Symbol();\n\nconst _validator = Symbol();\n\nlet uid = 0;\n\nclass XFAObject {\n  constructor(nsId, name, hasChildren = false) {\n    this[$namespaceId] = nsId;\n    this[$nodeName] = name;\n    this[_hasChildren] = hasChildren;\n    this[_parent] = null;\n    this[_children] = [];\n    this[$uid] = `${name}${uid++}`;\n  }\n\n  [$onChild](child) {\n    if (!this[_hasChildren] || !this[$onChildCheck](child)) {\n      return false;\n    }\n\n    const name = child[$nodeName];\n    const node = this[name];\n\n    if (node instanceof XFAObjectArray) {\n      if (node.push(child)) {\n        this[$appendChild](child);\n        return true;\n      }\n    } else {\n      if (node !== null) {\n        this[$removeChild](node);\n      }\n\n      this[name] = child;\n      this[$appendChild](child);\n      return true;\n    }\n\n    let id = \"\";\n\n    if (this.id) {\n      id = ` (id: ${this.id})`;\n    } else if (this.name) {\n      id = ` (name: ${this.name} ${this.h.value})`;\n    }\n\n    (0, _util.warn)(`XFA - node \"${this[$nodeName]}\"${id} has already enough \"${name}\"!`);\n    return false;\n  }\n\n  [$onChildCheck](child) {\n    return this.hasOwnProperty(child[$nodeName]) && child[$namespaceId] === this[$namespaceId];\n  }\n\n  [$setId](ids) {\n    if (this.id && this[$namespaceId] === _namespaces.NamespaceIds.template.id) {\n      ids.set(this.id, this);\n    }\n  }\n\n  [$appendChild](child) {\n    child[_parent] = this;\n\n    this[_children].push(child);\n  }\n\n  [$removeChild](child) {\n    const i = this[_children].indexOf(child);\n\n    this[_children].splice(i, 1);\n  }\n\n  [$hasSettableValue]() {\n    return this.hasOwnProperty(\"value\");\n  }\n\n  [$setValue](_) {}\n\n  [$onText](_) {}\n\n  [$finalize]() {}\n\n  [$clean](builder) {\n    delete this[_hasChildren];\n\n    if (this[$cleanup]) {\n      builder.clean(this[$cleanup]);\n      delete this[$cleanup];\n    }\n  }\n\n  [$hasItem]() {\n    return false;\n  }\n\n  [$indexOf](child) {\n    return this[_children].indexOf(child);\n  }\n\n  [$insertAt](i, child) {\n    child[_parent] = this;\n\n    this[_children].splice(i, 0, child);\n  }\n\n  [$isTransparent]() {\n    return this.name === \"\";\n  }\n\n  [$lastAttribute]() {\n    return \"\";\n  }\n\n  [$text]() {\n    if (this[_children].length === 0) {\n      return this[$content];\n    }\n\n    return this[_children].map(c => c[$text]()).join(\"\");\n  }\n\n  get [_attributeNames]() {\n    const proto = Object.getPrototypeOf(this);\n\n    if (!proto._attributes) {\n      const attributes = proto._attributes = new Set();\n\n      for (const name of Object.getOwnPropertyNames(this)) {\n        if (this[name] === null || this[name] instanceof XFAObject || this[name] instanceof XFAObjectArray) {\n          break;\n        }\n\n        attributes.add(name);\n      }\n    }\n\n    return (0, _util.shadow)(this, _attributeNames, proto._attributes);\n  }\n\n  [$isDescendent](parent) {\n    let node = this;\n\n    while (node) {\n      if (node === parent) {\n        return true;\n      }\n\n      node = node[$getParent]();\n    }\n\n    return false;\n  }\n\n  [$getParent]() {\n    return this[_parent];\n  }\n\n  [$getChildren](name = null) {\n    if (!name) {\n      return this[_children];\n    }\n\n    return this[name];\n  }\n\n  [$dump]() {\n    const dumped = Object.create(null);\n\n    if (this[$content]) {\n      dumped.$content = this[$content];\n    }\n\n    for (const name of Object.getOwnPropertyNames(this)) {\n      const value = this[name];\n\n      if (value === null) {\n        continue;\n      }\n\n      if (value instanceof XFAObject) {\n        dumped[name] = value[$dump]();\n      } else if (value instanceof XFAObjectArray) {\n        if (!value.isEmpty()) {\n          dumped[name] = value.dump();\n        }\n      } else {\n        dumped[name] = value;\n      }\n    }\n\n    return dumped;\n  }\n\n  [$toStyle]() {\n    return null;\n  }\n\n  [$toHTML]() {\n    return null;\n  }\n\n  [$childrenToHTML]({\n    filter = null,\n    include = true\n  }) {\n    const res = [];\n    this[$getChildren]().forEach(node => {\n      if (!filter || include === filter.has(node[$nodeName])) {\n        const html = node[$toHTML]();\n\n        if (html) {\n          res.push(html);\n        }\n      }\n    });\n    return res;\n  }\n\n  [$setSetAttributes](attributes) {\n    if (attributes.use || attributes.id) {\n      this[_setAttributes] = new Set(Object.keys(attributes));\n    }\n  }\n\n  [_getUnsetAttributes](protoAttributes) {\n    const allAttr = this[_attributeNames];\n    const setAttr = this[_setAttributes];\n    return [...protoAttributes].filter(x => allAttr.has(x) && !setAttr.has(x));\n  }\n\n  [$resolvePrototypes](ids, ancestors = new Set()) {\n    for (const child of this[_children]) {\n      const proto = child[_getPrototype](ids, ancestors);\n\n      if (proto) {\n        child[_applyPrototype](proto, ids, ancestors);\n      } else {\n        child[$resolvePrototypes](ids, ancestors);\n      }\n    }\n  }\n\n  [_getPrototype](ids, ancestors) {\n    const {\n      use\n    } = this;\n\n    if (use && use.startsWith(\"#\")) {\n      const id = use.slice(1);\n      const proto = ids.get(id);\n      this.use = \"\";\n\n      if (!proto) {\n        (0, _util.warn)(`XFA - Invalid prototype id: ${id}.`);\n        return null;\n      }\n\n      if (proto[$nodeName] !== this[$nodeName]) {\n        (0, _util.warn)(`XFA - Incompatible prototype: ${proto[$nodeName]} !== ${this[$nodeName]}.`);\n        return null;\n      }\n\n      if (ancestors.has(proto)) {\n        (0, _util.warn)(`XFA - Cycle detected in prototypes use.`);\n        return null;\n      }\n\n      ancestors.add(proto);\n\n      const protoProto = proto[_getPrototype](ids, ancestors);\n\n      if (!protoProto) {\n        ancestors.delete(proto);\n        return proto;\n      }\n\n      proto[_applyPrototype](protoProto, ids, ancestors);\n\n      ancestors.delete(proto);\n      return proto;\n    }\n\n    return null;\n  }\n\n  [_applyPrototype](proto, ids, ancestors) {\n    if (ancestors.has(proto)) {\n      (0, _util.warn)(`XFA - Cycle detected in prototypes use.`);\n      return;\n    }\n\n    if (!this[$content] && proto[$content]) {\n      this[$content] = proto[$content];\n    }\n\n    const newAncestors = new Set(ancestors);\n    newAncestors.add(proto);\n\n    for (const unsetAttrName of this[_getUnsetAttributes](proto[_setAttributes])) {\n      this[unsetAttrName] = proto[unsetAttrName];\n\n      if (this[_setAttributes]) {\n        this[_setAttributes].add(unsetAttrName);\n      }\n    }\n\n    for (const name of Object.getOwnPropertyNames(this)) {\n      if (this[_attributeNames].has(name)) {\n        continue;\n      }\n\n      const value = this[name];\n      const protoValue = proto[name];\n\n      if (value instanceof XFAObjectArray) {\n        for (const child of value[_children]) {\n          child[$resolvePrototypes](ids, ancestors);\n        }\n\n        for (let i = value[_children].length, ii = protoValue[_children].length; i < ii; i++) {\n          const child = proto[_children][i][$clone]();\n\n          if (value.push(child)) {\n            child[_parent] = this;\n\n            this[_children].push(child);\n\n            child[$resolvePrototypes](ids, newAncestors);\n          } else {\n            break;\n          }\n        }\n\n        continue;\n      }\n\n      if (value !== null) {\n        value[$resolvePrototypes](ids, ancestors);\n        continue;\n      }\n\n      if (protoValue !== null) {\n        const child = protoValue[$clone]();\n        child[_parent] = this;\n        this[name] = child;\n\n        this[_children].push(child);\n\n        child[$resolvePrototypes](ids, newAncestors);\n      }\n    }\n  }\n\n  static [_cloneAttribute](obj) {\n    if (Array.isArray(obj)) {\n      return obj.map(x => XFAObject[_cloneAttribute](x));\n    }\n\n    if (obj instanceof Object) {\n      return Object.assign({}, obj);\n    }\n\n    return obj;\n  }\n\n  [$clone]() {\n    const clone = Object.create(Object.getPrototypeOf(this));\n\n    for (const $symbol of Object.getOwnPropertySymbols(this)) {\n      try {\n        clone[$symbol] = this[$symbol];\n      } catch (_) {\n        (0, _util.shadow)(clone, $symbol, this[$symbol]);\n      }\n    }\n\n    clone[_children] = [];\n\n    for (const name of Object.getOwnPropertyNames(this)) {\n      if (this[_attributeNames].has(name)) {\n        clone[name] = XFAObject[_cloneAttribute](this[name]);\n        continue;\n      }\n\n      const value = this[name];\n\n      if (value instanceof XFAObjectArray) {\n        clone[name] = new XFAObjectArray(value[_max]);\n      } else {\n        clone[name] = null;\n      }\n    }\n\n    for (const child of this[_children]) {\n      const name = child[$nodeName];\n      const clonedChild = child[$clone]();\n\n      clone[_children].push(clonedChild);\n\n      clonedChild[_parent] = clone;\n\n      if (clone[name] === null) {\n        clone[name] = clonedChild;\n      } else {\n        clone[name][_children].push(clonedChild);\n      }\n    }\n\n    return clone;\n  }\n\n  [$getChildren](name = null) {\n    if (!name) {\n      return this[_children];\n    }\n\n    return this[_children].filter(c => c[$nodeName] === name);\n  }\n\n  [$getChildrenByClass](name) {\n    return this[name];\n  }\n\n  [$getChildrenByName](name, allTransparent, first = true) {\n    return Array.from(this[$getChildrenByNameIt](name, allTransparent, first));\n  }\n\n  *[$getChildrenByNameIt](name, allTransparent, first = true) {\n    if (name === \"parent\") {\n      yield this[_parent];\n      return;\n    }\n\n    for (const child of this[_children]) {\n      if (child[$nodeName] === name) {\n        yield child;\n      }\n\n      if (child.name === name) {\n        yield child;\n      }\n\n      if (allTransparent || child[$isTransparent]()) {\n        yield* child[$getChildrenByNameIt](name, allTransparent, false);\n      }\n    }\n\n    if (first && this[_attributeNames].has(name)) {\n      yield new XFAAttribute(this, name, this[name]);\n    }\n  }\n\n}\n\nexports.XFAObject = XFAObject;\n\nclass XFAObjectArray {\n  constructor(max = Infinity) {\n    this[_max] = max;\n    this[_children] = [];\n  }\n\n  push(child) {\n    const len = this[_children].length;\n\n    if (len <= this[_max]) {\n      this[_children].push(child);\n\n      return true;\n    }\n\n    (0, _util.warn)(`XFA - node \"${child[$nodeName]}\" accepts no more than ${this[_max]} children`);\n    return false;\n  }\n\n  isEmpty() {\n    return this[_children].length === 0;\n  }\n\n  dump() {\n    return this[_children].length === 1 ? this[_children][0][$dump]() : this[_children].map(x => x[$dump]());\n  }\n\n  [$clone]() {\n    const clone = new XFAObjectArray(this[_max]);\n    clone[_children] = this[_children].map(c => c[$clone]());\n    return clone;\n  }\n\n  get children() {\n    return this[_children];\n  }\n\n  clear() {\n    this[_children].length = 0;\n  }\n\n}\n\nexports.XFAObjectArray = XFAObjectArray;\n\nclass XFAAttribute {\n  constructor(node, name, value) {\n    this[_parent] = node;\n    this[$nodeName] = name;\n    this[$content] = value;\n    this[$consumed] = false;\n  }\n\n  [$getParent]() {\n    return this[_parent];\n  }\n\n  [$isDataValue]() {\n    return true;\n  }\n\n  [$text]() {\n    return this[$content];\n  }\n\n  [$isDescendent](parent) {\n    return this[_parent] === parent || this[_parent][$isDescendent](parent);\n  }\n\n}\n\nexports.XFAAttribute = XFAAttribute;\n\nclass XmlObject extends XFAObject {\n  constructor(nsId, name, attributes = {}) {\n    super(nsId, name);\n    this[$content] = \"\";\n    this[_dataValue] = null;\n\n    if (name !== \"#text\") {\n      const map = new Map();\n      this[_attributes] = map;\n\n      for (const [attrName, value] of Object.entries(attributes)) {\n        map.set(attrName, new XFAAttribute(this, attrName, value));\n      }\n\n      if (attributes.hasOwnProperty($nsAttributes)) {\n        const dataNode = attributes[$nsAttributes].xfa.dataNode;\n\n        if (dataNode !== undefined) {\n          if (dataNode === \"dataGroup\") {\n            this[_dataValue] = false;\n          } else if (dataNode === \"dataValue\") {\n            this[_dataValue] = true;\n          }\n        }\n      }\n    }\n\n    this[$consumed] = false;\n  }\n\n  [$onChild](child) {\n    if (this[$content]) {\n      const node = new XmlObject(this[$namespaceId], \"#text\");\n      this[$appendChild](node);\n      node[$content] = this[$content];\n      this[$content] = \"\";\n    }\n\n    this[$appendChild](child);\n    return true;\n  }\n\n  [$onText](str) {\n    this[$content] += str;\n  }\n\n  [$finalize]() {\n    if (this[$content] && this[_children].length > 0) {\n      const node = new XmlObject(this[$namespaceId], \"#text\");\n      this[$appendChild](node);\n      node[$content] = this[$content];\n      delete this[$content];\n    }\n  }\n\n  [$toHTML]() {\n    if (this[$nodeName] === \"#text\") {\n      return {\n        name: \"#text\",\n        value: this[$content]\n      };\n    }\n\n    return null;\n  }\n\n  [$getChildren](name = null) {\n    if (!name) {\n      return this[_children];\n    }\n\n    return this[_children].filter(c => c[$nodeName] === name);\n  }\n\n  [$getChildrenByClass](name) {\n    const value = this[_attributes].get(name);\n\n    if (value !== undefined) {\n      return value;\n    }\n\n    return this[$getChildren](name);\n  }\n\n  *[$getChildrenByNameIt](name, allTransparent) {\n    const value = this[_attributes].get(name);\n\n    if (value) {\n      yield value;\n    }\n\n    for (const child of this[_children]) {\n      if (child[$nodeName] === name) {\n        yield child;\n      }\n\n      if (allTransparent) {\n        yield* child[$getChildrenByNameIt](name, allTransparent);\n      }\n    }\n  }\n\n  *[$getAttributeIt](name, skipConsumed) {\n    const value = this[_attributes].get(name);\n\n    if (value && (!skipConsumed || !value[$consumed])) {\n      yield value;\n    }\n\n    for (const child of this[_children]) {\n      yield* child[$getAttributeIt](name, skipConsumed);\n    }\n  }\n\n  *[$getRealChildrenByNameIt](name, allTransparent, skipConsumed) {\n    for (const child of this[_children]) {\n      if (child[$nodeName] === name && (!skipConsumed || !child[$consumed])) {\n        yield child;\n      }\n\n      if (allTransparent) {\n        yield* child[$getRealChildrenByNameIt](name, allTransparent, skipConsumed);\n      }\n    }\n  }\n\n  [$isDataValue]() {\n    if (this[_dataValue] === null) {\n      return this[_children].length === 0;\n    }\n\n    return this[_dataValue];\n  }\n\n  [$dump]() {\n    const dumped = Object.create(null);\n\n    if (this[$content]) {\n      dumped.$content = this[$content];\n    }\n\n    dumped.$name = this[$nodeName];\n    dumped.children = [];\n\n    for (const child of this[_children]) {\n      dumped.children.push(child[$dump]());\n    }\n\n    dumped.attributes = Object.create(null);\n\n    for (const [name, value] of this[_attributes]) {\n      dumped.attributes[name] = value[$content];\n    }\n\n    return dumped;\n  }\n\n}\n\nexports.XmlObject = XmlObject;\n\nclass ContentObject extends XFAObject {\n  constructor(nsId, name) {\n    super(nsId, name);\n    this[$content] = \"\";\n  }\n\n  [$onText](text) {\n    this[$content] += text;\n  }\n\n  [$finalize]() {}\n\n}\n\nexports.ContentObject = ContentObject;\n\nclass OptionObject extends ContentObject {\n  constructor(nsId, name, options) {\n    super(nsId, name);\n    this[_options] = options;\n  }\n\n  [$finalize]() {\n    this[$content] = (0, _utils.getKeyword)({\n      data: this[$content],\n      defaultValue: this[_options][0],\n      validate: k => this[_options].includes(k)\n    });\n  }\n\n  [$clean](builder) {\n    super[$clean](builder);\n    delete this[_options];\n  }\n\n}\n\nexports.OptionObject = OptionObject;\n\nclass StringObject extends ContentObject {\n  [$finalize]() {\n    this[$content] = this[$content].trim();\n  }\n\n}\n\nexports.StringObject = StringObject;\n\nclass IntegerObject extends ContentObject {\n  constructor(nsId, name, defaultValue, validator) {\n    super(nsId, name);\n    this[_defaultValue] = defaultValue;\n    this[_validator] = validator;\n  }\n\n  [$finalize]() {\n    this[$content] = (0, _utils.getInteger)({\n      data: this[$content],\n      defaultValue: this[_defaultValue],\n      validate: this[_validator]\n    });\n  }\n\n  [$clean](builder) {\n    super[$clean](builder);\n    delete this[_defaultValue];\n    delete this[_validator];\n  }\n\n}\n\nexports.IntegerObject = IntegerObject;\n\nclass Option01 extends IntegerObject {\n  constructor(nsId, name) {\n    super(nsId, name, 0, n => n === 1);\n  }\n\n}\n\nexports.Option01 = Option01;\n\nclass Option10 extends IntegerObject {\n  constructor(nsId, name) {\n    super(nsId, name, 1, n => n === 0);\n  }\n\n}\n\nexports.Option10 = Option10;\n\n/***/ }),\n/* 51 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.getBBox = getBBox;\nexports.getColor = getColor;\nexports.getFloat = getFloat;\nexports.getInteger = getInteger;\nexports.getKeyword = getKeyword;\nexports.getMeasurement = getMeasurement;\nexports.getRatio = getRatio;\nexports.getRelevant = getRelevant;\nexports.getStringOption = getStringOption;\nconst dimConverters = {\n  pt: x => x,\n  cm: x => x / 2.54 * 72,\n  mm: x => x / (10 * 2.54) * 72,\n  in: x => x * 72\n};\nconst measurementPattern = /([+-]?[0-9]+\\.?[0-9]*)(.*)/;\n\nfunction getInteger({\n  data,\n  defaultValue,\n  validate\n}) {\n  if (!data) {\n    return defaultValue;\n  }\n\n  data = data.trim();\n  const n = parseInt(data, 10);\n\n  if (!isNaN(n) && validate(n)) {\n    return n;\n  }\n\n  return defaultValue;\n}\n\nfunction getFloat({\n  data,\n  defaultValue,\n  validate\n}) {\n  if (!data) {\n    return defaultValue;\n  }\n\n  data = data.trim();\n  const n = parseFloat(data);\n\n  if (!isNaN(n) && validate(n)) {\n    return n;\n  }\n\n  return defaultValue;\n}\n\nfunction getKeyword({\n  data,\n  defaultValue,\n  validate\n}) {\n  if (!data) {\n    return defaultValue;\n  }\n\n  data = data.trim();\n\n  if (validate(data)) {\n    return data;\n  }\n\n  return defaultValue;\n}\n\nfunction getStringOption(data, options) {\n  return getKeyword({\n    data,\n    defaultValue: options[0],\n    validate: k => options.includes(k)\n  });\n}\n\nfunction getMeasurement(str, def = \"0\") {\n  def = def || \"0\";\n\n  if (!str) {\n    return getMeasurement(def);\n  }\n\n  const match = str.trim().match(measurementPattern);\n\n  if (!match) {\n    return getMeasurement(def);\n  }\n\n  const [, valueStr, unit] = match;\n  const value = parseFloat(valueStr);\n\n  if (isNaN(value)) {\n    return getMeasurement(def);\n  }\n\n  if (value === 0) {\n    return 0;\n  }\n\n  const conv = dimConverters[unit];\n\n  if (conv) {\n    return conv(value);\n  }\n\n  return value;\n}\n\nfunction getRatio(data) {\n  if (!data) {\n    return {\n      num: 1,\n      den: 1\n    };\n  }\n\n  const ratio = data.trim().split(/\\s*:\\s*/).map(x => parseFloat(x)).filter(x => !isNaN(x));\n\n  if (ratio.length === 1) {\n    ratio.push(1);\n  }\n\n  if (ratio.length === 0) {\n    return {\n      num: 1,\n      den: 1\n    };\n  }\n\n  const [num, den] = ratio;\n  return {\n    num,\n    den\n  };\n}\n\nfunction getRelevant(data) {\n  if (!data) {\n    return [];\n  }\n\n  return data.trim().split(/\\s+/).map(e => {\n    return {\n      excluded: e[0] === \"-\",\n      viewname: e.substring(1)\n    };\n  });\n}\n\nfunction getColor(data, def = [0, 0, 0]) {\n  let [r, g, b] = def;\n\n  if (!data) {\n    return {\n      r,\n      g,\n      b\n    };\n  }\n\n  const color = data.trim().split(/\\s*,\\s*/).map(c => Math.min(Math.max(0, parseInt(c.trim(), 10)), 255)).map(c => isNaN(c) ? 0 : c);\n\n  if (color.length < 3) {\n    return {\n      r,\n      g,\n      b\n    };\n  }\n\n  [r, g, b] = color;\n  return {\n    r,\n    g,\n    b\n  };\n}\n\nfunction getBBox(data) {\n  const def = -1;\n\n  if (!data) {\n    return {\n      x: def,\n      y: def,\n      width: def,\n      height: def\n    };\n  }\n\n  const bbox = data.trim().split(/\\s*,\\s*/).map(m => getMeasurement(m, \"-1\"));\n\n  if (bbox.length < 4 || bbox[2] < 0 || bbox[3] < 0) {\n    return {\n      x: def,\n      y: def,\n      width: def,\n      height: def\n    };\n  }\n\n  const [x, y, width, height] = bbox;\n  return {\n    x,\n    y,\n    width,\n    height\n  };\n}\n\n/***/ }),\n/* 52 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.NamespaceIds = exports.$buildXFAObject = void 0;\nconst $buildXFAObject = Symbol();\nexports.$buildXFAObject = $buildXFAObject;\nconst NamespaceIds = {\n  config: {\n    id: 0,\n    check: ns => ns.startsWith(\"http://www.xfa.org/schema/xci/\")\n  },\n  connectionSet: {\n    id: 1,\n    check: ns => ns.startsWith(\"http://www.xfa.org/schema/xfa-connection-set/\")\n  },\n  datasets: {\n    id: 2,\n    check: ns => ns.startsWith(\"http://www.xfa.org/schema/xfa-data/\")\n  },\n  form: {\n    id: 3,\n    check: ns => ns.startsWith(\"http://www.xfa.org/schema/xfa-form/\")\n  },\n  localeSet: {\n    id: 4,\n    check: ns => ns.startsWith(\"http://www.xfa.org/schema/xfa-locale-set/\")\n  },\n  pdf: {\n    id: 5,\n    check: ns => ns === \"http://ns.adobe.com/xdp/pdf/\"\n  },\n  signature: {\n    id: 6,\n    check: ns => ns === \"http://www.w3.org/2000/09/xmldsig#\"\n  },\n  sourceSet: {\n    id: 7,\n    check: ns => ns.startsWith(\"http://www.xfa.org/schema/xfa-source-set/\")\n  },\n  stylesheet: {\n    id: 8,\n    check: ns => ns === \"http://www.w3.org/1999/XSL/Transform\"\n  },\n  template: {\n    id: 9,\n    check: ns => ns.startsWith(\"http://www.xfa.org/schema/xfa-template/\")\n  },\n  xdc: {\n    id: 10,\n    check: ns => ns.startsWith(\"http://www.xfa.org/schema/xdc/\")\n  },\n  xdp: {\n    id: 11,\n    check: ns => ns === \"http://ns.adobe.com/xdp/\"\n  },\n  xfdf: {\n    id: 12,\n    check: ns => ns === \"http://ns.adobe.com/xfdf/\"\n  },\n  xhtml: {\n    id: 13,\n    check: ns => ns === \"http://www.w3.org/1999/xhtml\"\n  },\n  xmpmeta: {\n    id: 14,\n    check: ns => ns === \"http://ns.adobe.com/xmpmeta/\"\n  }\n};\nexports.NamespaceIds = NamespaceIds;\n\n/***/ }),\n/* 53 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.Binder = void 0;\n\nvar _xfa_object = __w_pdfjs_require__(50);\n\nvar _template = __w_pdfjs_require__(54);\n\nvar _som = __w_pdfjs_require__(56);\n\nvar _namespaces = __w_pdfjs_require__(52);\n\nvar _util = __w_pdfjs_require__(2);\n\nfunction createText(content) {\n  const node = new _template.Text({});\n  node[_xfa_object.$content] = content;\n  return node;\n}\n\nclass Binder {\n  constructor(root) {\n    this.root = root;\n    this.datasets = root.datasets;\n\n    if (root.datasets && root.datasets.data) {\n      this.emptyMerge = false;\n      this.data = root.datasets.data;\n    } else {\n      this.emptyMerge = true;\n      this.data = new _xfa_object.XmlObject(_namespaces.NamespaceIds.datasets.id, \"data\");\n    }\n\n    this.root.form = this.form = root.template[_xfa_object.$clone]();\n  }\n\n  _isConsumeData() {\n    return !this.emptyMerge && this._mergeMode;\n  }\n\n  _isMatchTemplate() {\n    return !this._isConsumeData();\n  }\n\n  bind() {\n    this._bindElement(this.form, this.data);\n\n    return this.form;\n  }\n\n  getData() {\n    return this.data;\n  }\n\n  _bindValue(formNode, data, picture) {\n    if (formNode[_xfa_object.$hasSettableValue]()) {\n      if (data[_xfa_object.$isDataValue]()) {\n        const value = data[_xfa_object.$content].trim();\n\n        formNode[_xfa_object.$setValue](createText(value));\n\n        formNode[_xfa_object.$data] = data;\n      } else if (formNode instanceof _template.Field && formNode.ui && formNode.ui.choiceList && formNode.ui.choiceList.open === \"multiSelect\") {\n        const value = data[_xfa_object.$getChildren]().map(child => child[_xfa_object.$content].trim()).join(\"\\n\");\n\n        formNode[_xfa_object.$setValue](createText(value));\n\n        formNode[_xfa_object.$data] = data;\n      } else if (this._isConsumeData()) {\n        (0, _util.warn)(`XFA - Nodes haven't the same type.`);\n      }\n    } else if (!data[_xfa_object.$isDataValue]() || this._isMatchTemplate()) {\n      this._bindElement(formNode, data);\n\n      formNode[_xfa_object.$data] = data;\n    } else {\n      (0, _util.warn)(`XFA - Nodes haven't the same type.`);\n    }\n  }\n\n  _findDataByNameToConsume(name, dataNode, global) {\n    if (!name) {\n      return null;\n    }\n\n    let generator, match;\n\n    for (let i = 0; i < 3; i++) {\n      generator = dataNode[_xfa_object.$getRealChildrenByNameIt](name, false, true);\n      match = generator.next().value;\n\n      if (match) {\n        return match;\n      }\n\n      if (dataNode[_xfa_object.$namespaceId] === _namespaces.NamespaceIds.datasets.id && dataNode[_xfa_object.$nodeName] === \"data\") {\n        break;\n      }\n\n      dataNode = dataNode[_xfa_object.$getParent]();\n    }\n\n    if (!global) {\n      return null;\n    }\n\n    generator = this.datasets[_xfa_object.$getRealChildrenByNameIt](name, false, false);\n\n    while (true) {\n      match = generator.next().value;\n\n      if (!match) {\n        break;\n      }\n\n      if (match[_xfa_object.$global]) {\n        return match;\n      }\n    }\n\n    generator = this.data[_xfa_object.$getAttributeIt](name, true);\n    match = generator.next().value;\n\n    if (match && match[_xfa_object.$isDataValue]()) {\n      return match;\n    }\n\n    return null;\n  }\n\n  _setProperties(formNode, dataNode) {\n    if (!formNode.hasOwnProperty(\"setProperty\")) {\n      return;\n    }\n\n    for (const {\n      ref,\n      target,\n      connection\n    } of formNode.setProperty.children) {\n      if (connection) {\n        continue;\n      }\n\n      if (!ref) {\n        continue;\n      }\n\n      const [node] = (0, _som.searchNode)(this.root, dataNode, ref, false, false);\n\n      if (!node) {\n        (0, _util.warn)(`XFA - Invalid reference: ${ref}.`);\n        continue;\n      }\n\n      if (!node[_xfa_object.$isDescendent](this.data)) {\n        (0, _util.warn)(`XFA - Invalid node: must be a data node.`);\n        continue;\n      }\n\n      const [targetNode] = (0, _som.searchNode)(this.root, formNode, target, false, false);\n\n      if (!targetNode) {\n        (0, _util.warn)(`XFA - Invalid target: ${target}.`);\n        continue;\n      }\n\n      if (!targetNode[_xfa_object.$isDescendent](formNode)) {\n        (0, _util.warn)(`XFA - Invalid target: must be a property or subproperty.`);\n        continue;\n      }\n\n      const targetParent = targetNode[_xfa_object.$getParent]();\n\n      if (targetNode instanceof _template.SetProperty || targetParent instanceof _template.SetProperty) {\n        (0, _util.warn)(`XFA - Invalid target: cannot be a setProperty or one of its properties.`);\n        continue;\n      }\n\n      if (targetNode instanceof _template.BindItems || targetParent instanceof _template.BindItems) {\n        (0, _util.warn)(`XFA - Invalid target: cannot be a bindItems or one of its properties.`);\n        continue;\n      }\n\n      const content = node[_xfa_object.$text]();\n\n      const name = targetNode[_xfa_object.$nodeName];\n\n      if (targetNode instanceof _xfa_object.XFAAttribute) {\n        const attrs = Object.create(null);\n        attrs[name] = content;\n        const obj = Reflect.construct(Object.getPrototypeOf(targetParent).constructor, [attrs]);\n        targetParent[name] = obj[name];\n        continue;\n      }\n\n      if (!targetNode.hasOwnProperty(_xfa_object.$content)) {\n        (0, _util.warn)(`XFA - Invalid node to use in setProperty`);\n        continue;\n      }\n\n      targetNode[_xfa_object.$data] = node;\n      targetNode[_xfa_object.$content] = content;\n\n      targetNode[_xfa_object.$finalize]();\n    }\n  }\n\n  _bindItems(formNode, dataNode) {\n    if (!formNode.hasOwnProperty(\"items\") || !formNode.hasOwnProperty(\"bindItems\") || formNode.bindItems.isEmpty()) {\n      return;\n    }\n\n    for (const item of formNode.items.children) {\n      formNode[_xfa_object.$removeChild](item);\n    }\n\n    formNode.items.clear();\n    const labels = new _template.Items({});\n    const values = new _template.Items({});\n\n    formNode[_xfa_object.$appendChild](labels);\n\n    formNode.items.push(labels);\n\n    formNode[_xfa_object.$appendChild](values);\n\n    formNode.items.push(values);\n\n    for (const {\n      ref,\n      labelRef,\n      valueRef,\n      connection\n    } of formNode.bindItems.children) {\n      if (connection) {\n        continue;\n      }\n\n      if (!ref) {\n        continue;\n      }\n\n      const nodes = (0, _som.searchNode)(this.root, dataNode, ref, false, false);\n\n      if (!nodes) {\n        (0, _util.warn)(`XFA - Invalid reference: ${ref}.`);\n        continue;\n      }\n\n      for (const node of nodes) {\n        if (!node[_xfa_object.$isDescendent](this.datasets)) {\n          (0, _util.warn)(`XFA - Invalid ref (${ref}): must be a datasets child.`);\n          continue;\n        }\n\n        const [labelNode] = (0, _som.searchNode)(this.root, node, labelRef, true, false);\n\n        if (!labelNode) {\n          (0, _util.warn)(`XFA - Invalid label: ${labelRef}.`);\n          continue;\n        }\n\n        if (!labelNode[_xfa_object.$isDescendent](this.datasets)) {\n          (0, _util.warn)(`XFA - Invalid label: must be a datasets child.`);\n          continue;\n        }\n\n        const [valueNode] = (0, _som.searchNode)(this.root, node, valueRef, true, false);\n\n        if (!valueNode) {\n          (0, _util.warn)(`XFA - Invalid value: ${valueRef}.`);\n          continue;\n        }\n\n        if (!valueNode[_xfa_object.$isDescendent](this.datasets)) {\n          (0, _util.warn)(`XFA - Invalid value: must be a datasets child.`);\n          continue;\n        }\n\n        const label = createText(labelNode[_xfa_object.$text]());\n        const value = createText(valueNode[_xfa_object.$text]());\n\n        labels[_xfa_object.$appendChild](label);\n\n        labels.text.push(label);\n\n        values[_xfa_object.$appendChild](value);\n\n        values.text.push(value);\n      }\n    }\n  }\n\n  _bindOccurrences(formNode, matches, picture) {\n    let baseClone;\n\n    if (matches.length > 1) {\n      baseClone = formNode[_xfa_object.$clone]();\n    }\n\n    this._bindValue(formNode, matches[0], picture);\n\n    this._setProperties(formNode, matches[0]);\n\n    this._bindItems(formNode, matches[0]);\n\n    if (matches.length === 1) {\n      return;\n    }\n\n    const parent = formNode[_xfa_object.$getParent]();\n\n    const name = formNode[_xfa_object.$nodeName];\n\n    const pos = parent[_xfa_object.$indexOf](formNode);\n\n    for (let i = 1, ii = matches.length; i < ii; i++) {\n      const match = matches[i];\n\n      const clone = baseClone[_xfa_object.$clone]();\n\n      clone.occur.min = 1;\n      clone.occur.max = 1;\n      clone.occur.initial = 1;\n      parent[name].push(clone);\n\n      parent[_xfa_object.$insertAt](pos + i, clone);\n\n      this._bindValue(clone, match, picture);\n\n      this._setProperties(clone, match);\n\n      this._bindItems(clone, match);\n    }\n  }\n\n  _createOccurrences(formNode) {\n    if (!this.emptyMerge) {\n      return;\n    }\n\n    const {\n      occur\n    } = formNode;\n\n    if (!occur || occur.initial <= 1) {\n      return;\n    }\n\n    const parent = formNode[_xfa_object.$getParent]();\n\n    const name = formNode[_xfa_object.$nodeName];\n\n    for (let i = 0, ii = occur.initial; i < ii; i++) {\n      const clone = formNode[_xfa_object.$clone]();\n\n      clone.occur.min = 1;\n      clone.occur.max = 1;\n      clone.occur.initial = 1;\n      parent[name].push(clone);\n\n      parent[_xfa_object.$appendChild](clone);\n    }\n  }\n\n  _getOccurInfo(formNode) {\n    const {\n      occur\n    } = formNode;\n    const dataName = formNode.name;\n\n    if (!occur || !dataName) {\n      return [1, 1];\n    }\n\n    const max = occur.max === -1 ? Infinity : occur.max;\n    return [occur.min, max];\n  }\n\n  _bindElement(formNode, dataNode) {\n    const uselessNodes = [];\n\n    this._createOccurrences(formNode);\n\n    for (const child of formNode[_xfa_object.$getChildren]()) {\n      if (child[_xfa_object.$data]) {\n        continue;\n      }\n\n      if (this._mergeMode === undefined && child[_xfa_object.$nodeName] === \"subform\") {\n        this._mergeMode = child.mergeMode === \"consumeData\";\n      }\n\n      let global = false;\n      let picture = null;\n      let ref = null;\n      let match = null;\n\n      if (child.bind) {\n        switch (child.bind.match) {\n          case \"none\":\n            continue;\n\n          case \"global\":\n            global = true;\n            break;\n\n          case \"dataRef\":\n            if (!child.bind.ref) {\n              (0, _util.warn)(`XFA - ref is empty in node ${child[_xfa_object.$nodeName]}.`);\n              continue;\n            }\n\n            ref = child.bind.ref;\n            break;\n\n          default:\n            break;\n        }\n\n        if (child.bind.picture) {\n          picture = child.bind.picture[_xfa_object.$content];\n        }\n      }\n\n      const [min, max] = this._getOccurInfo(child);\n\n      if (ref) {\n        match = (0, _som.searchNode)(this.root, dataNode, ref, true, false);\n\n        if (match === null) {\n          match = (0, _som.createDataNode)(this.data, dataNode, ref);\n\n          if (this._isConsumeData()) {\n            match[_xfa_object.$consumed] = true;\n          }\n\n          match = [match];\n        } else {\n          if (this._isConsumeData()) {\n            match = match.filter(node => !node[_xfa_object.$consumed]);\n          }\n\n          if (match.length > max) {\n            match = match.slice(0, max);\n          } else if (match.length === 0) {\n            match = null;\n          }\n\n          if (match && this._isConsumeData()) {\n            match.forEach(node => {\n              node[_xfa_object.$consumed] = true;\n            });\n          }\n        }\n      } else {\n        if (!child.name) {\n          this._bindElement(child, dataNode);\n\n          continue;\n        }\n\n        if (this._isConsumeData()) {\n          const matches = [];\n\n          while (matches.length < max) {\n            const found = this._findDataByNameToConsume(child.name, dataNode, global);\n\n            if (!found) {\n              break;\n            }\n\n            found[_xfa_object.$consumed] = true;\n            matches.push(found);\n          }\n\n          match = matches.length > 0 ? matches : null;\n        } else {\n          match = dataNode[_xfa_object.$getRealChildrenByNameIt](child.name, false, false).next().value;\n\n          if (!match) {\n            match = new _xfa_object.XmlObject(dataNode[_xfa_object.$namespaceId], child.name);\n\n            dataNode[_xfa_object.$appendChild](match);\n          }\n\n          match = [match];\n        }\n      }\n\n      if (match) {\n        if (match.length < min) {\n          (0, _util.warn)(`XFA - Must have at least ${min} occurrences: ${formNode[_xfa_object.$nodeName]}.`);\n          continue;\n        }\n\n        this._bindOccurrences(child, match, picture);\n      } else if (min > 0) {\n        this._bindElement(child, dataNode);\n      } else {\n        uselessNodes.push(child);\n      }\n    }\n\n    uselessNodes.forEach(node => node[_xfa_object.$getParent]()[_xfa_object.$removeChild](node));\n  }\n\n}\n\nexports.Binder = Binder;\n\n/***/ }),\n/* 54 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.Value = exports.Text = exports.TemplateNamespace = exports.Template = exports.SetProperty = exports.Items = exports.Field = exports.BindItems = void 0;\n\nvar _xfa_object = __w_pdfjs_require__(50);\n\nvar _namespaces = __w_pdfjs_require__(52);\n\nvar _utils = __w_pdfjs_require__(51);\n\nvar _html_utils = __w_pdfjs_require__(55);\n\nvar _util = __w_pdfjs_require__(2);\n\nconst TEMPLATE_NS_ID = _namespaces.NamespaceIds.template.id;\n\nfunction _setValue(templateNode, value) {\n  if (!templateNode.value) {\n    const nodeValue = new Value({});\n\n    templateNode[_xfa_object.$appendChild](nodeValue);\n\n    templateNode.value = nodeValue;\n  }\n\n  templateNode.value[_xfa_object.$setValue](value);\n}\n\nclass AppearanceFilter extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"appearanceFilter\");\n    this.id = attributes.id || \"\";\n    this.type = (0, _utils.getStringOption)(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass Arc extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"arc\", true);\n    this.circular = (0, _utils.getInteger)({\n      data: attributes.circular,\n      defaultValue: 0,\n      validate: x => x === 1\n    });\n    this.hand = (0, _utils.getStringOption)(attributes.hand, [\"even\", \"left\", \"right\"]);\n    this.id = attributes.id || \"\";\n    this.startAngle = (0, _utils.getFloat)({\n      data: attributes.startAngle,\n      defaultValue: 0,\n      validate: x => true\n    });\n    this.sweepAngle = (0, _utils.getFloat)({\n      data: attributes.sweepAngle,\n      defaultValue: 360,\n      validate: x => true\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.edge = null;\n    this.fill = null;\n  }\n\n}\n\nclass Area extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"area\", true);\n    this.colSpan = (0, _utils.getInteger)({\n      data: attributes.colSpan,\n      defaultValue: 1,\n      validate: n => n >= 1\n    });\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.relevant = (0, _utils.getRelevant)(attributes.relevant);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.x = (0, _utils.getMeasurement)(attributes.x, \"0pt\");\n    this.y = (0, _utils.getMeasurement)(attributes.y, \"0pt\");\n    this.desc = null;\n    this.extras = null;\n    this.area = new _xfa_object.XFAObjectArray();\n    this.draw = new _xfa_object.XFAObjectArray();\n    this.exObject = new _xfa_object.XFAObjectArray();\n    this.exclGroup = new _xfa_object.XFAObjectArray();\n    this.field = new _xfa_object.XFAObjectArray();\n    this.subform = new _xfa_object.XFAObjectArray();\n    this.subformSet = new _xfa_object.XFAObjectArray();\n  }\n\n  [_xfa_object.$isTransparent]() {\n    return true;\n  }\n\n}\n\nclass Assist extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"assist\", true);\n    this.id = attributes.id || \"\";\n    this.role = attributes.role || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.speak = null;\n    this.toolTip = null;\n  }\n\n}\n\nclass Barcode extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"barcode\", true);\n    this.charEncoding = (0, _utils.getKeyword)({\n      data: attributes.charEncoding ? attributes.charEncoding.toLowerCase() : \"\",\n      defaultValue: \"\",\n      validate: k => [\"utf-8\", \"big-five\", \"fontspecific\", \"gbk\", \"gb-18030\", \"gb-2312\", \"ksc-5601\", \"none\", \"shift-jis\", \"ucs-2\", \"utf-16\"].includes(k) || k.match(/iso-8859-[0-9]{2}/)\n    });\n    this.checksum = (0, _utils.getStringOption)(attributes.checksum, [\"none\", \"1mod10\", \"1mod10_1mod11\", \"2mod10\", \"auto\"]);\n    this.dataColumnCount = (0, _utils.getInteger)({\n      data: attributes.dataColumnCount,\n      defaultValue: -1,\n      validate: x => x >= 0\n    });\n    this.dataLength = (0, _utils.getInteger)({\n      data: attributes.dataLength,\n      defaultValue: -1,\n      validate: x => x >= 0\n    });\n    this.dataPrep = (0, _utils.getStringOption)(attributes.dataPrep, [\"none\", \"flateCompress\"]);\n    this.dataRowCount = (0, _utils.getInteger)({\n      data: attributes.dataRowCount,\n      defaultValue: -1,\n      validate: x => x >= 0\n    });\n    this.endChar = attributes.endChar || \"\";\n    this.errorCorrectionLevel = (0, _utils.getInteger)({\n      data: attributes.errorCorrectionLevel,\n      defaultValue: -1,\n      validate: x => x >= 0 && x <= 8\n    });\n    this.id = attributes.id || \"\";\n    this.moduleHeight = (0, _utils.getMeasurement)(attributes.moduleHeight, \"5mm\");\n    this.moduleWidth = (0, _utils.getMeasurement)(attributes.moduleWidth, \"0.25mm\");\n    this.printCheckDigit = (0, _utils.getInteger)({\n      data: attributes.printCheckDigit,\n      defaultValue: 0,\n      validate: x => x === 1\n    });\n    this.rowColumnRatio = (0, _utils.getRatio)(attributes.rowColumnRatio);\n    this.startChar = attributes.startChar || \"\";\n    this.textLocation = (0, _utils.getStringOption)(attributes.textLocation, [\"below\", \"above\", \"aboveEmbedded\", \"belowEmbedded\", \"none\"]);\n    this.truncate = (0, _utils.getInteger)({\n      data: attributes.truncate,\n      defaultValue: 0,\n      validate: x => x === 1\n    });\n    this.type = (0, _utils.getStringOption)(attributes.type ? attributes.type.toLowerCase() : \"\", [\"aztec\", \"codabar\", \"code2of5industrial\", \"code2of5interleaved\", \"code2of5matrix\", \"code2of5standard\", \"code3of9\", \"code3of9extended\", \"code11\", \"code49\", \"code93\", \"code128\", \"code128a\", \"code128b\", \"code128c\", \"code128sscc\", \"datamatrix\", \"ean8\", \"ean8add2\", \"ean8add5\", \"ean13\", \"ean13add2\", \"ean13add5\", \"ean13pwcd\", \"fim\", \"logmars\", \"maxicode\", \"msi\", \"pdf417\", \"pdf417macro\", \"plessey\", \"postauscust2\", \"postauscust3\", \"postausreplypaid\", \"postausstandard\", \"postukrm4scc\", \"postusdpbc\", \"postusimb\", \"postusstandard\", \"postus5zip\", \"qrcode\", \"rfid\", \"rss14\", \"rss14expanded\", \"rss14limited\", \"rss14stacked\", \"rss14stackedomni\", \"rss14truncated\", \"telepen\", \"ucc128\", \"ucc128random\", \"ucc128sscc\", \"upca\", \"upcaadd2\", \"upcaadd5\", \"upcapwcd\", \"upce\", \"upceadd2\", \"upceadd5\", \"upcean2\", \"upcean5\", \"upsmaxicode\"]);\n    this.upsMode = (0, _utils.getStringOption)(attributes.upsMode, [\"usCarrier\", \"internationalCarrier\", \"secureSymbol\", \"standardSymbol\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.wideNarrowRatio = (0, _utils.getRatio)(attributes.wideNarrowRatio);\n    this.encrypt = null;\n    this.extras = null;\n  }\n\n}\n\nclass Bind extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"bind\", true);\n    this.match = (0, _utils.getStringOption)(attributes.match, [\"once\", \"dataRef\", \"global\", \"none\"]);\n    this.ref = attributes.ref || \"\";\n    this.picture = null;\n  }\n\n}\n\nclass BindItems extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"bindItems\");\n    this.connection = attributes.connection || \"\";\n    this.labelRef = attributes.labelRef || \"\";\n    this.ref = attributes.ref || \"\";\n    this.valueRef = attributes.valueRef || \"\";\n  }\n\n}\n\nexports.BindItems = BindItems;\n\nclass Bookend extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"bookend\");\n    this.id = attributes.id || \"\";\n    this.leader = attributes.leader || \"\";\n    this.trailer = attributes.trailer || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass BooleanElement extends _xfa_object.Option01 {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"boolean\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [_xfa_object.$toHTML]() {\n    return this[_xfa_object.$content] === 1;\n  }\n\n}\n\nclass Border extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"border\", true);\n    this.break = (0, _utils.getStringOption)(attributes.break, [\"close\", \"open\"]);\n    this.hand = (0, _utils.getStringOption)(attributes.hand, [\"even\", \"left\", \"right\"]);\n    this.id = attributes.id || \"\";\n    this.presence = (0, _utils.getStringOption)(attributes.presence, [\"visible\", \"hidden\", \"inactive\", \"invisible\"]);\n    this.relevant = (0, _utils.getRelevant)(attributes.relevant);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.corner = new _xfa_object.XFAObjectArray(4);\n    this.edge = new _xfa_object.XFAObjectArray(4);\n    this.extras = null;\n    this.fill = null;\n    this.margin = null;\n  }\n\n  [_xfa_object.$toStyle](widths, margins) {\n    const edgeStyles = this.edge.children.map(node => node[_xfa_object.$toStyle]());\n    const cornerStyles = this.edge.children.map(node => node[_xfa_object.$toStyle]());\n    let style;\n\n    if (this.margin) {\n      style = this.margin[_xfa_object.$toStyle]();\n\n      if (margins) {\n        margins.push(this.margin.topInset, this.margin.rightInset, this.margin.bottomInset, this.margin.leftInset);\n      }\n    } else {\n      style = Object.create(null);\n\n      if (margins) {\n        margins.push(0, 0, 0, 0);\n      }\n    }\n\n    if (this.fill) {\n      Object.assign(style, this.fill[_xfa_object.$toStyle]());\n    }\n\n    if (edgeStyles.length > 0) {\n      if (widths) {\n        this.edge.children.forEach(node => widths.push(node.thickness));\n\n        if (widths.length < 4) {\n          const last = widths[widths.length - 1];\n\n          for (let i = widths.length; i < 4; i++) {\n            widths.push(last);\n          }\n        }\n      }\n\n      if (edgeStyles.length === 2 || edgeStyles.length === 3) {\n        const last = edgeStyles[edgeStyles.length - 1];\n\n        for (let i = edgeStyles.length; i < 4; i++) {\n          edgeStyles.push(last);\n        }\n      }\n\n      style.borderWidth = edgeStyles.map(s => s.width).join(\" \");\n      style.borderColor = edgeStyles.map(s => s.color).join(\" \");\n      style.borderStyle = edgeStyles.map(s => s.style).join(\" \");\n    } else {\n      if (widths) {\n        widths.push(0, 0, 0, 0);\n      }\n    }\n\n    if (cornerStyles.length > 0) {\n      if (cornerStyles.length === 2 || cornerStyles.length === 3) {\n        const last = cornerStyles[cornerStyles.length - 1];\n\n        for (let i = cornerStyles.length; i < 4; i++) {\n          cornerStyles.push(last);\n        }\n      }\n\n      style.borderRadius = cornerStyles.map(s => s.radius).join(\" \");\n    }\n\n    switch (this.presence) {\n      case \"invisible\":\n      case \"hidden\":\n        style.borderStyle = \"\";\n        break;\n\n      case \"inactive\":\n        style.borderStyle = \"none\";\n        break;\n    }\n\n    return style;\n  }\n\n}\n\nclass Break extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"break\", true);\n    this.after = (0, _utils.getStringOption)(attributes.after, [\"auto\", \"contentArea\", \"pageArea\", \"pageEven\", \"pageOdd\"]);\n    this.afterTarget = attributes.afterTarget || \"\";\n    this.before = (0, _utils.getStringOption)(attributes.before, [\"auto\", \"contentArea\", \"pageArea\", \"pageEven\", \"pageOdd\"]);\n    this.beforeTarget = attributes.beforeTarget || \"\";\n    this.bookendLeader = attributes.bookendLeader || \"\";\n    this.bookendTrailer = attributes.bookendTrailer || \"\";\n    this.id = attributes.id || \"\";\n    this.overflowLeader = attributes.overflowLeader || \"\";\n    this.overflowTarget = attributes.overflowTarget || \"\";\n    this.overflowTrailer = attributes.overflowTrailer || \"\";\n    this.startNew = (0, _utils.getInteger)({\n      data: attributes.startNew,\n      defaultValue: 0,\n      validate: x => x === 1\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n  }\n\n}\n\nclass BreakAfter extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"breakAfter\", true);\n    this.id = attributes.id || \"\";\n    this.leader = attributes.leader || \"\";\n    this.startNew = (0, _utils.getInteger)({\n      data: attributes.startNew,\n      defaultValue: 0,\n      validate: x => x === 1\n    });\n    this.target = attributes.target || \"\";\n    this.targetType = (0, _utils.getStringOption)(attributes.targetType, [\"auto\", \"contentArea\", \"pageArea\", \"pageEven\", \"pageOdd\"]);\n    this.trailer = attributes.trailer || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.script = null;\n  }\n\n}\n\nclass BreakBefore extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"breakBefore\", true);\n    this.id = attributes.id || \"\";\n    this.leader = attributes.leader || \"\";\n    this.startNew = (0, _utils.getInteger)({\n      data: attributes.startNew,\n      defaultValue: 0,\n      validate: x => x === 1\n    });\n    this.target = attributes.target || \"\";\n    this.targetType = (0, _utils.getStringOption)(attributes.targetType, [\"auto\", \"contentArea\", \"pageArea\", \"pageEven\", \"pageOdd\"]);\n    this.trailer = attributes.trailer || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.script = null;\n  }\n\n}\n\nclass Button extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"button\", true);\n    this.highlight = (0, _utils.getStringOption)(attributes.highlight, [\"inverted\", \"none\", \"outline\", \"push\"]);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n  }\n\n  [_xfa_object.$toHTML]() {\n    return {\n      name: \"button\",\n      attributes: {\n        class: \"xfaButton\",\n        style: {}\n      }\n    };\n  }\n\n}\n\nclass Calculate extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"calculate\", true);\n    this.id = attributes.id || \"\";\n    this.override = (0, _utils.getStringOption)(attributes.override, [\"disabled\", \"error\", \"ignore\", \"warning\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.message = null;\n    this.script = null;\n  }\n\n}\n\nclass Caption extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"caption\", true);\n    this.id = attributes.id || \"\";\n    this.placement = (0, _utils.getStringOption)(attributes.placement, [\"left\", \"bottom\", \"inline\", \"right\", \"top\"]);\n    this.presence = (0, _utils.getStringOption)(attributes.presence, [\"visible\", \"hidden\", \"inactive\", \"invisible\"]);\n    this.reserve = (0, _utils.getMeasurement)(attributes.reserve);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.font = null;\n    this.margin = null;\n    this.para = null;\n    this.value = null;\n  }\n\n  [_xfa_object.$setValue](value) {\n    _setValue(this, value);\n  }\n\n  [_xfa_object.$toHTML]() {\n    if (!this.value) {\n      return null;\n    }\n\n    const value = this.value[_xfa_object.$toHTML]();\n\n    if (!value) {\n      return null;\n    }\n\n    const children = [];\n\n    if (typeof value === \"string\") {\n      children.push({\n        name: \"#text\",\n        value\n      });\n    } else {\n      children.push(value);\n    }\n\n    const style = (0, _html_utils.toStyle)(this, \"font\", \"margin\", \"para\", \"visibility\");\n\n    switch (this.placement) {\n      case \"left\":\n      case \"right\":\n        style.minWidth = (0, _html_utils.measureToString)(this.reserve);\n        break;\n\n      case \"top\":\n      case \"bottom\":\n        style.minHeight = (0, _html_utils.measureToString)(this.reserve);\n        break;\n    }\n\n    return {\n      name: \"div\",\n      attributes: {\n        style\n      },\n      children\n    };\n  }\n\n}\n\nclass Certificate extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"certificate\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass Certificates extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"certificates\", true);\n    this.credentialServerPolicy = (0, _utils.getStringOption)(attributes.credentialServerPolicy, [\"optional\", \"required\"]);\n    this.id = attributes.id || \"\";\n    this.url = attributes.url || \"\";\n    this.urlPolicy = attributes.urlPolicy || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.encryption = null;\n    this.issuers = null;\n    this.keyUsage = null;\n    this.oids = null;\n    this.signing = null;\n    this.subjectDNs = null;\n  }\n\n}\n\nclass CheckButton extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"checkButton\", true);\n    this.id = attributes.id || \"\";\n    this.mark = (0, _utils.getStringOption)(attributes.mark, [\"default\", \"check\", \"circle\", \"cross\", \"diamond\", \"square\", \"star\"]);\n    this.shape = (0, _utils.getStringOption)(attributes.shape, [\"square\", \"round\"]);\n    this.size = (0, _utils.getMeasurement)(attributes.size, \"10pt\");\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.border = null;\n    this.extras = null;\n    this.margin = null;\n  }\n\n  [_xfa_object.$toHTML]() {\n    const style = (0, _html_utils.toStyle)(this, \"border\", \"margin\");\n    const size = (0, _html_utils.measureToString)(this.size);\n    style.width = style.height = size;\n    let mark, radius;\n\n    if (this.shape === \"square\") {\n      mark = \"■\";\n      radius = \"10%\";\n    } else {\n      mark = \"●\";\n      radius = \"50%\";\n    }\n\n    if (!style.borderRadius) {\n      style.borderRadius = radius;\n    }\n\n    if (this.mark !== \"default\") {\n      switch (this.mark) {\n        case \"check\":\n          mark = \"✓\";\n          break;\n\n        case \"circle\":\n          mark = \"●\";\n          break;\n\n        case \"cross\":\n          mark = \"✕\";\n          break;\n\n        case \"diamond\":\n          mark = \"♦\";\n          break;\n\n        case \"square\":\n          mark = \"■\";\n          break;\n\n        case \"star\":\n          mark = \"★\";\n          break;\n      }\n    }\n\n    if (size !== \"10px\") {\n      style.fontSize = size;\n      style.lineHeight = size;\n      style.width = size;\n      style.height = size;\n    }\n\n    return {\n      name: \"label\",\n      attributes: {\n        class: \"xfaLabel\"\n      },\n      children: [{\n        name: \"input\",\n        attributes: {\n          class: \"xfaCheckbox\",\n          type: \"checkbox\"\n        }\n      }, {\n        name: \"span\",\n        attributes: {\n          class: \"xfaCheckboxMark\",\n          mark,\n          style\n        }\n      }]\n    };\n  }\n\n}\n\nclass ChoiceList extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"choiceList\", true);\n    this.commitOn = (0, _utils.getStringOption)(attributes.commitOn, [\"select\", \"exit\"]);\n    this.id = attributes.id || \"\";\n    this.open = (0, _utils.getStringOption)(attributes.open, [\"userControl\", \"always\", \"multiSelect\", \"onEntry\"]);\n    this.textEntry = (0, _utils.getInteger)({\n      data: attributes.textEntry,\n      defaultValue: 0,\n      validate: x => x === 1\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.border = null;\n    this.extras = null;\n    this.margin = null;\n  }\n\n  [_xfa_object.$toHTML]() {\n    const style = (0, _html_utils.toStyle)(this, \"border\", \"margin\");\n    return {\n      name: \"label\",\n      attributes: {\n        class: \"xfaLabel\"\n      },\n      children: [{\n        name: \"select\",\n        attributes: {\n          class: \"xfaSxelect\",\n          multiple: this.open === \"multiSelect\",\n          style\n        }\n      }]\n    };\n  }\n\n}\n\nclass Color extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"color\", true);\n    this.cSpace = (0, _utils.getStringOption)(attributes.cSpace, [\"SRGB\"]);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.value = (0, _utils.getColor)(attributes.value);\n    this.extras = null;\n  }\n\n  [_xfa_object.$hasSettableValue]() {\n    return false;\n  }\n\n  [_xfa_object.$toStyle]() {\n    return _util.Util.makeHexColor(this.value.r, this.value.g, this.value.b);\n  }\n\n}\n\nclass Comb extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"comb\");\n    this.id = attributes.id || \"\";\n    this.numberOfCells = (0, _utils.getInteger)({\n      data: attributes.numberOfCells,\n      defaultValue: 0,\n      validate: x => x >= 0\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass Connect extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"connect\", true);\n    this.connection = attributes.connection || \"\";\n    this.id = attributes.id || \"\";\n    this.ref = attributes.ref || \"\";\n    this.usage = (0, _utils.getStringOption)(attributes.usage, [\"exportAndImport\", \"exportOnly\", \"importOnly\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.picture = null;\n  }\n\n}\n\nclass ContentArea extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"contentArea\", true);\n    this.h = (0, _utils.getMeasurement)(attributes.h);\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.relevant = (0, _utils.getRelevant)(attributes.relevant);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.w = (0, _utils.getMeasurement)(attributes.w);\n    this.x = (0, _utils.getMeasurement)(attributes.x, \"0pt\");\n    this.y = (0, _utils.getMeasurement)(attributes.y, \"0pt\");\n    this.desc = null;\n    this.extras = null;\n  }\n\n  [_xfa_object.$toHTML]() {\n    const left = (0, _html_utils.measureToString)(this.x);\n    const top = (0, _html_utils.measureToString)(this.y);\n    const style = {\n      position: \"absolute\",\n      left,\n      top,\n      width: (0, _html_utils.measureToString)(this.w),\n      height: (0, _html_utils.measureToString)(this.h)\n    };\n    return {\n      name: \"div\",\n      children: [],\n      attributes: {\n        style,\n        class: \"xfaContentarea\",\n        id: this[_xfa_object.$uid]\n      }\n    };\n  }\n\n}\n\nclass Corner extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"corner\", true);\n    this.id = attributes.id || \"\";\n    this.inverted = (0, _utils.getInteger)({\n      data: attributes.inverted,\n      defaultValue: 0,\n      validate: x => x === 1\n    });\n    this.join = (0, _utils.getStringOption)(attributes.join, [\"square\", \"round\"]);\n    this.presence = (0, _utils.getStringOption)(attributes.presence, [\"visible\", \"hidden\", \"inactive\", \"invisible\"]);\n    this.radius = (0, _utils.getMeasurement)(attributes.radius);\n    this.stroke = (0, _utils.getStringOption)(attributes.stroke, [\"solid\", \"dashDot\", \"dashDotDot\", \"dashed\", \"dotted\", \"embossed\", \"etched\", \"lowered\", \"raised\"]);\n    this.thickness = (0, _utils.getMeasurement)(attributes.thickness, \"0.5pt\");\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.color = null;\n    this.extras = null;\n  }\n\n  [_xfa_object.$toStyle]() {\n    const style = (0, _html_utils.toStyle)(this, \"visibility\");\n    style.radius = (0, _html_utils.measureToString)(this.radius);\n    return style;\n  }\n\n}\n\nclass DateElement extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"date\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [_xfa_object.$finalize]() {\n    this[_xfa_object.$content] = new Date(this[_xfa_object.$content].trim());\n  }\n\n  [_xfa_object.$toHTML]() {\n    return this[_xfa_object.$content].toString();\n  }\n\n}\n\nclass DateTime extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"dateTime\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [_xfa_object.$finalize]() {\n    this[_xfa_object.$content] = new Date(this[_xfa_object.$content].trim());\n  }\n\n  [_xfa_object.$toHTML]() {\n    return this[_xfa_object.$content].toString();\n  }\n\n}\n\nclass DateTimeEdit extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"dateTimeEdit\", true);\n    this.hScrollPolicy = (0, _utils.getStringOption)(attributes.hScrollPolicy, [\"auto\", \"off\", \"on\"]);\n    this.id = attributes.id || \"\";\n    this.picker = (0, _utils.getStringOption)(attributes.picker, [\"host\", \"none\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.border = null;\n    this.comb = null;\n    this.extras = null;\n    this.margin = null;\n  }\n\n  [_xfa_object.$toHTML]() {\n    const style = (0, _html_utils.toStyle)(this, \"border\", \"font\", \"margin\");\n    const html = {\n      name: \"input\",\n      attributes: {\n        type: \"text\",\n        class: \"xfaTextfield\",\n        style\n      }\n    };\n    return {\n      name: \"label\",\n      attributes: {\n        class: \"xfaLabel\"\n      },\n      children: [html]\n    };\n  }\n\n}\n\nclass Decimal extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"decimal\");\n    this.fracDigits = (0, _utils.getInteger)({\n      data: attributes.fracDigits,\n      defaultValue: 2,\n      validate: x => true\n    });\n    this.id = attributes.id || \"\";\n    this.leadDigits = (0, _utils.getInteger)({\n      data: attributes.leadDigits,\n      defaultValue: -1,\n      validate: x => true\n    });\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [_xfa_object.$finalize]() {\n    const number = parseFloat(this[_xfa_object.$content].trim());\n    this[_xfa_object.$content] = isNaN(number) ? null : number;\n  }\n\n  [_xfa_object.$toHTML]() {\n    return this[_xfa_object.$content] !== null ? this[_xfa_object.$content].toString() : \"\";\n  }\n\n}\n\nclass DefaultUi extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"defaultUi\", true);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n  }\n\n}\n\nclass Desc extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"desc\", true);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.boolean = new _xfa_object.XFAObjectArray();\n    this.date = new _xfa_object.XFAObjectArray();\n    this.dateTime = new _xfa_object.XFAObjectArray();\n    this.decimal = new _xfa_object.XFAObjectArray();\n    this.exData = new _xfa_object.XFAObjectArray();\n    this.float = new _xfa_object.XFAObjectArray();\n    this.image = new _xfa_object.XFAObjectArray();\n    this.integer = new _xfa_object.XFAObjectArray();\n    this.text = new _xfa_object.XFAObjectArray();\n    this.time = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass DigestMethod extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"digestMethod\", [\"\", \"SHA1\", \"SHA256\", \"SHA512\", \"RIPEMD160\"]);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass DigestMethods extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"digestMethods\", true);\n    this.id = attributes.id || \"\";\n    this.type = (0, _utils.getStringOption)(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.digestMethod = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Draw extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"draw\", true);\n    this.anchorType = (0, _utils.getStringOption)(attributes.anchorType, [\"topLeft\", \"bottomCenter\", \"bottomLeft\", \"bottomRight\", \"middleCenter\", \"middleLeft\", \"middleRight\", \"topCenter\", \"topRight\"]);\n    this.colSpan = (0, _utils.getInteger)({\n      data: attributes.colSpan,\n      defaultValue: 1,\n      validate: x => x >= 1\n    });\n    this.h = attributes.h ? (0, _utils.getMeasurement)(attributes.h) : \"\";\n    this.hAlign = (0, _utils.getStringOption)(attributes.hAlign, [\"left\", \"center\", \"justify\", \"justifyAll\", \"radix\", \"right\"]);\n    this.id = attributes.id || \"\";\n    this.locale = attributes.locale || \"\";\n    this.maxH = (0, _utils.getMeasurement)(attributes.maxH, \"0pt\");\n    this.maxW = (0, _utils.getMeasurement)(attributes.maxW, \"0pt\");\n    this.minH = (0, _utils.getMeasurement)(attributes.minH, \"0pt\");\n    this.minW = (0, _utils.getMeasurement)(attributes.minW, \"0pt\");\n    this.name = attributes.name || \"\";\n    this.presence = (0, _utils.getStringOption)(attributes.presence, [\"visible\", \"hidden\", \"inactive\", \"invisible\"]);\n    this.relevant = (0, _utils.getRelevant)(attributes.relevant);\n    this.rotate = (0, _utils.getInteger)({\n      data: attributes.rotate,\n      defaultValue: 0,\n      validate: x => x % 90 === 0\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.w = attributes.w ? (0, _utils.getMeasurement)(attributes.w) : \"\";\n    this.x = (0, _utils.getMeasurement)(attributes.x, \"0pt\");\n    this.y = (0, _utils.getMeasurement)(attributes.y, \"0pt\");\n    this.assist = null;\n    this.border = null;\n    this.caption = null;\n    this.desc = null;\n    this.extras = null;\n    this.font = null;\n    this.keep = null;\n    this.margin = null;\n    this.para = null;\n    this.traversal = null;\n    this.ui = null;\n    this.value = null;\n    this.setProperty = new _xfa_object.XFAObjectArray();\n  }\n\n  [_xfa_object.$setValue](value) {\n    _setValue(this, value);\n  }\n\n  [_xfa_object.$toHTML]() {\n    if (!this.value) {\n      return null;\n    }\n\n    const style = (0, _html_utils.toStyle)(this, \"font\", \"dimensions\", \"position\", \"presence\", \"rotate\", \"anchorType\");\n    const clazz = [\"xfaDraw\"];\n\n    if (this.font) {\n      clazz.push(\"xfaFont\");\n    }\n\n    const attributes = {\n      style,\n      id: this[_xfa_object.$uid],\n      class: clazz.join(\" \")\n    };\n\n    if (this.name) {\n      attributes.xfaName = this.name;\n    }\n\n    return {\n      name: \"div\",\n      attributes,\n      children: []\n    };\n  }\n\n}\n\nclass Edge extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"edge\", true);\n    this.cap = (0, _utils.getStringOption)(attributes.cap, [\"square\", \"butt\", \"round\"]);\n    this.id = attributes.id || \"\";\n    this.presence = (0, _utils.getStringOption)(attributes.presence, [\"visible\", \"hidden\", \"inactive\", \"invisible\"]);\n    this.stroke = (0, _utils.getStringOption)(attributes.stroke, [\"solid\", \"dashDot\", \"dashDotDot\", \"dashed\", \"dotted\", \"embossed\", \"etched\", \"lowered\", \"raised\"]);\n    this.thickness = (0, _utils.getMeasurement)(attributes.thickness, \"0.5pt\");\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.color = null;\n    this.extras = null;\n  }\n\n  [_xfa_object.$toStyle]() {\n    const style = (0, _html_utils.toStyle)(this, \"visibility\");\n    Object.assign(style, {\n      linecap: this.cap,\n      width: (0, _html_utils.measureToString)(this.thickness),\n      color: this.color ? this.color[_xfa_object.$toHTML]() : \"#000000\",\n      style: \"\"\n    });\n\n    if (this.presence !== \"visible\") {\n      style.style = \"none\";\n    } else {\n      switch (this.stroke) {\n        case \"solid\":\n          style.style = \"solid\";\n          break;\n\n        case \"dashDot\":\n          style.style = \"dashed\";\n          break;\n\n        case \"dashDotDot\":\n          style.style = \"dashed\";\n          break;\n\n        case \"dashed\":\n          style.style = \"dashed\";\n          break;\n\n        case \"dotted\":\n          style.style = \"dotted\";\n          break;\n\n        case \"embossed\":\n          style.style = \"ridge\";\n          break;\n\n        case \"etched\":\n          style.style = \"groove\";\n          break;\n\n        case \"lowered\":\n          style.style = \"inset\";\n          break;\n\n        case \"raised\":\n          style.style = \"outset\";\n          break;\n      }\n    }\n\n    return style;\n  }\n\n}\n\nclass Encoding extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"encoding\", [\"adbe.x509.rsa_sha1\", \"adbe.pkcs7.detached\", \"adbe.pkcs7.sha1\"]);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass Encodings extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"encodings\", true);\n    this.id = attributes.id || \"\";\n    this.type = (0, _utils.getStringOption)(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.encoding = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Encrypt extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"encrypt\", true);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.certificate = null;\n  }\n\n}\n\nclass EncryptData extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"encryptData\", true);\n    this.id = attributes.id || \"\";\n    this.operation = (0, _utils.getStringOption)(attributes.operation, [\"encrypt\", \"decrypt\"]);\n    this.target = attributes.target || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.filter = null;\n    this.manifest = null;\n  }\n\n}\n\nclass Encryption extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"encryption\", true);\n    this.id = attributes.id || \"\";\n    this.type = (0, _utils.getStringOption)(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.certificate = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass EncryptionMethod extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"encryptionMethod\", [\"\", \"AES256-CBC\", \"TRIPLEDES-CBC\", \"AES128-CBC\", \"AES192-CBC\"]);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass EncryptionMethods extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"encryptionMethods\", true);\n    this.id = attributes.id || \"\";\n    this.type = (0, _utils.getStringOption)(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.encryptionMethod = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Event extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"event\", true);\n    this.activity = (0, _utils.getStringOption)(attributes.activity, [\"click\", \"change\", \"docClose\", \"docReady\", \"enter\", \"exit\", \"full\", \"indexChange\", \"initialize\", \"mouseDown\", \"mouseEnter\", \"mouseExit\", \"mouseUp\", \"postExecute\", \"postOpen\", \"postPrint\", \"postSave\", \"postSign\", \"postSubmit\", \"preExecute\", \"preOpen\", \"prePrint\", \"preSave\", \"preSign\", \"preSubmit\", \"ready\", \"validationState\"]);\n    this.id = attributes.id || \"\";\n    this.listen = (0, _utils.getStringOption)(attributes.listen, [\"refOnly\", \"refAndDescendents\"]);\n    this.name = attributes.name || \"\";\n    this.ref = attributes.ref || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.encryptData = null;\n    this.execute = null;\n    this.script = null;\n    this.signData = null;\n    this.submit = null;\n  }\n\n}\n\nclass ExData extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"exData\");\n    this.contentType = attributes.contentType || \"\";\n    this.href = attributes.href || \"\";\n    this.id = attributes.id || \"\";\n    this.maxLength = (0, _utils.getInteger)({\n      data: attributes.maxLength,\n      defaultValue: -1,\n      validate: x => x >= -1\n    });\n    this.name = attributes.name || \"\";\n    this.rid = attributes.rid || \"\";\n    this.transferEncoding = (0, _utils.getStringOption)(attributes.transferEncoding, [\"none\", \"base64\", \"package\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [_xfa_object.$onChild](child) {\n    if (this.contentType === \"text/html\" && child[_xfa_object.$namespaceId] === _namespaces.NamespaceIds.xhtml.id) {\n      this[_xfa_object.$content] = child;\n      return true;\n    }\n\n    if (this.contentType === \"text/xml\") {\n      this[_xfa_object.$content] = child;\n      return true;\n    }\n\n    return false;\n  }\n\n}\n\nclass ExObject extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"exObject\", true);\n    this.archive = attributes.archive || \"\";\n    this.classId = attributes.classId || \"\";\n    this.codeBase = attributes.codeBase || \"\";\n    this.codeType = attributes.codeType || \"\";\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.boolean = new _xfa_object.XFAObjectArray();\n    this.date = new _xfa_object.XFAObjectArray();\n    this.dateTime = new _xfa_object.XFAObjectArray();\n    this.decimal = new _xfa_object.XFAObjectArray();\n    this.exData = new _xfa_object.XFAObjectArray();\n    this.exObject = new _xfa_object.XFAObjectArray();\n    this.float = new _xfa_object.XFAObjectArray();\n    this.image = new _xfa_object.XFAObjectArray();\n    this.integer = new _xfa_object.XFAObjectArray();\n    this.text = new _xfa_object.XFAObjectArray();\n    this.time = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass ExclGroup extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"exclGroup\", true);\n    this.access = (0, _utils.getStringOption)(attributes.access, [\"open\", \"nonInteractive\", \"protected\", \"readOnly\"]);\n    this.accessKey = attributes.accessKey || \"\";\n    this.anchorType = (0, _utils.getStringOption)(attributes.anchorType, [\"topLeft\", \"bottomCenter\", \"bottomLeft\", \"bottomRight\", \"middleCenter\", \"middleLeft\", \"middleRight\", \"topCenter\", \"topRight\"]);\n    this.colSpan = (0, _utils.getInteger)({\n      data: attributes.colSpan,\n      defaultValue: 1,\n      validate: x => x >= 1\n    });\n    this.h = attributes.h ? (0, _utils.getMeasurement)(attributes.h) : \"\";\n    this.hAlign = (0, _utils.getStringOption)(attributes.hAlign, [\"left\", \"center\", \"justify\", \"justifyAll\", \"radix\", \"right\"]);\n    this.id = attributes.id || \"\";\n    this.layout = (0, _utils.getStringOption)(attributes.layout, [\"position\", \"lr-tb\", \"rl-row\", \"rl-tb\", \"row\", \"table\", \"tb\"]);\n    this.maxH = (0, _utils.getMeasurement)(attributes.maxH, \"0pt\");\n    this.maxW = (0, _utils.getMeasurement)(attributes.maxW, \"0pt\");\n    this.minH = (0, _utils.getMeasurement)(attributes.minH, \"0pt\");\n    this.minW = (0, _utils.getMeasurement)(attributes.minW, \"0pt\");\n    this.name = attributes.name || \"\";\n    this.presence = (0, _utils.getStringOption)(attributes.presence, [\"visible\", \"hidden\", \"inactive\", \"invisible\"]);\n    this.relevant = (0, _utils.getRelevant)(attributes.relevant);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.w = attributes.w ? (0, _utils.getMeasurement)(attributes.w) : \"\";\n    this.x = (0, _utils.getMeasurement)(attributes.x, \"0pt\");\n    this.y = (0, _utils.getMeasurement)(attributes.y, \"0pt\");\n    this.assist = null;\n    this.bind = null;\n    this.border = null;\n    this.calculate = null;\n    this.caption = null;\n    this.desc = null;\n    this.extras = null;\n    this.margin = null;\n    this.para = null;\n    this.traversal = null;\n    this.validate = null;\n    this.connect = new _xfa_object.XFAObjectArray();\n    this.event = new _xfa_object.XFAObjectArray();\n    this.field = new _xfa_object.XFAObjectArray();\n    this.setProperty = new _xfa_object.XFAObjectArray();\n  }\n\n  [_xfa_object.$hasSettableValue]() {\n    return true;\n  }\n\n  [_xfa_object.$setValue](value) {\n    for (const field of this.field.children) {\n      if (!field.value) {\n        const nodeValue = new Value({});\n\n        field[_xfa_object.$appendChild](nodeValue);\n\n        field.value = nodeValue;\n      }\n\n      const nodeBoolean = new BooleanElement({});\n      nodeBoolean[_xfa_object.$content] = 0;\n\n      for (const item of field.items.children) {\n        if (item[_xfa_object.$hasItem](value)) {\n          nodeBoolean[_xfa_object.$content] = 1;\n          break;\n        }\n      }\n\n      field.value[_xfa_object.$setValue](nodeBoolean);\n    }\n  }\n\n  [_xfa_object.$toHTML]() {\n    if (!this.value) {\n      return null;\n    }\n\n    const style = (0, _html_utils.toStyle)(this, \"dimensions\", \"position\", \"anchorType\");\n    const attributes = {\n      style,\n      id: this[_xfa_object.$uid],\n      class: \"xfaExclgroup\"\n    };\n\n    const children = this[_xfa_object.$childrenToHTML]({\n      filter: new Set([\"field\"]),\n      include: true\n    });\n\n    return {\n      name: \"div\",\n      attributes,\n      children\n    };\n  }\n\n}\n\nclass Execute extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"execute\");\n    this.connection = attributes.connection || \"\";\n    this.executeType = (0, _utils.getStringOption)(attributes.executeType, [\"import\", \"remerge\"]);\n    this.id = attributes.id || \"\";\n    this.runAt = (0, _utils.getStringOption)(attributes.runAt, [\"client\", \"both\", \"server\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass Extras extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"extras\", true);\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.boolean = new _xfa_object.XFAObjectArray();\n    this.date = new _xfa_object.XFAObjectArray();\n    this.dateTime = new _xfa_object.XFAObjectArray();\n    this.decimal = new _xfa_object.XFAObjectArray();\n    this.exData = new _xfa_object.XFAObjectArray();\n    this.extras = new _xfa_object.XFAObjectArray();\n    this.float = new _xfa_object.XFAObjectArray();\n    this.image = new _xfa_object.XFAObjectArray();\n    this.integer = new _xfa_object.XFAObjectArray();\n    this.text = new _xfa_object.XFAObjectArray();\n    this.time = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Field extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"field\", true);\n    this.access = (0, _utils.getStringOption)(attributes.access, [\"open\", \"nonInteractive\", \"protected\", \"readOnly\"]);\n    this.accessKey = attributes.accessKey || \"\";\n    this.anchorType = (0, _utils.getStringOption)(attributes.anchorType, [\"topLeft\", \"bottomCenter\", \"bottomLeft\", \"bottomRight\", \"middleCenter\", \"middleLeft\", \"middleRight\", \"topCenter\", \"topRight\"]);\n    this.colSpan = (0, _utils.getInteger)({\n      data: attributes.colSpan,\n      defaultValue: 1,\n      validate: x => x >= 1\n    });\n    this.h = attributes.h ? (0, _utils.getMeasurement)(attributes.h) : \"\";\n    this.hAlign = (0, _utils.getStringOption)(attributes.hAlign, [\"left\", \"center\", \"justify\", \"justifyAll\", \"radix\", \"right\"]);\n    this.id = attributes.id || \"\";\n    this.locale = attributes.locale || \"\";\n    this.maxH = (0, _utils.getMeasurement)(attributes.maxH, \"0pt\");\n    this.maxW = (0, _utils.getMeasurement)(attributes.maxW, \"0pt\");\n    this.minH = (0, _utils.getMeasurement)(attributes.minH, \"0pt\");\n    this.minW = (0, _utils.getMeasurement)(attributes.minW, \"0pt\");\n    this.name = attributes.name || \"\";\n    this.presence = (0, _utils.getStringOption)(attributes.presence, [\"visible\", \"hidden\", \"inactive\", \"invisible\"]);\n    this.relevant = (0, _utils.getRelevant)(attributes.relevant);\n    this.rotate = (0, _utils.getInteger)({\n      data: attributes.rotate,\n      defaultValue: 0,\n      validate: x => x % 90 === 0\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.w = attributes.w ? (0, _utils.getMeasurement)(attributes.w) : \"\";\n    this.x = (0, _utils.getMeasurement)(attributes.x, \"0pt\");\n    this.y = (0, _utils.getMeasurement)(attributes.y, \"0pt\");\n    this.assist = null;\n    this.bind = null;\n    this.border = null;\n    this.calculate = null;\n    this.caption = null;\n    this.desc = null;\n    this.extras = null;\n    this.font = null;\n    this.format = null;\n    this.items = new _xfa_object.XFAObjectArray(2);\n    this.keep = null;\n    this.margin = null;\n    this.para = null;\n    this.traversal = null;\n    this.ui = null;\n    this.validate = null;\n    this.value = null;\n    this.bindItems = new _xfa_object.XFAObjectArray();\n    this.connect = new _xfa_object.XFAObjectArray();\n    this.event = new _xfa_object.XFAObjectArray();\n    this.setProperty = new _xfa_object.XFAObjectArray();\n  }\n\n  [_xfa_object.$setValue](value) {\n    _setValue(this, value);\n  }\n\n  [_xfa_object.$toHTML]() {\n    if (!this.ui) {\n      return null;\n    }\n\n    const style = (0, _html_utils.toStyle)(this, \"font\", \"dimensions\", \"position\", \"rotate\", \"anchorType\", \"presence\");\n    const borderWidths = [];\n    const marginWidths = [];\n\n    if (this.border) {\n      Object.assign(style, this.border[_xfa_object.$toStyle](borderWidths, marginWidths));\n    }\n\n    if (this.margin) {\n      style.paddingTop = (0, _html_utils.measureToString)(this.margin.topInset - borderWidths[0] - marginWidths[0]);\n      style.paddingRight = (0, _html_utils.measureToString)(this.margin.rightInset - borderWidths[1] - marginWidths[1]);\n      style.paddingBottom = (0, _html_utils.measureToString)(this.margin.bottomInset - borderWidths[2] - marginWidths[2]);\n      style.paddingLeft = (0, _html_utils.measureToString)(this.margin.leftInset - borderWidths[3] - marginWidths[3]);\n    } else {\n      style.paddingTop = (0, _html_utils.measureToString)(-borderWidths[0] - marginWidths[0]);\n      style.paddingRight = (0, _html_utils.measureToString)(-borderWidths[1] - marginWidths[1]);\n      style.paddingBottom = (0, _html_utils.measureToString)(-borderWidths[2] - marginWidths[2]);\n      style.paddingLeft = (0, _html_utils.measureToString)(-borderWidths[3] - marginWidths[3]);\n    }\n\n    const clazz = [\"xfaField\"];\n\n    if (this.font) {\n      clazz.push(\"xfaFont\");\n    }\n\n    const attributes = {\n      style,\n      id: this[_xfa_object.$uid],\n      class: clazz.join(\" \")\n    };\n\n    if (this.name) {\n      attributes.xfaName = this.name;\n    }\n\n    const children = [];\n    const html = {\n      name: \"div\",\n      attributes,\n      children\n    };\n    const ui = this.ui ? this.ui[_xfa_object.$toHTML]() : null;\n\n    if (!ui) {\n      return html;\n    }\n\n    if (!ui.attributes.style) {\n      ui.attributes.style = Object.create(null);\n    }\n\n    children.push(ui);\n\n    if (this.value && ui.name !== \"button\") {\n      ui.children[0].attributes.value = this.value[_xfa_object.$toHTML]();\n    }\n\n    const caption = this.caption ? this.caption[_xfa_object.$toHTML]() : null;\n\n    if (!caption) {\n      return html;\n    }\n\n    if (ui.name === \"button\") {\n      ui.attributes.style.background = style.color;\n      delete style.color;\n\n      if (caption.name === \"div\") {\n        caption.name = \"span\";\n      }\n\n      ui.children = [caption];\n      return html;\n    }\n\n    ui.children.splice(0, 0, caption);\n\n    switch (this.caption.placement) {\n      case \"left\":\n        ui.attributes.style.flexDirection = \"row\";\n        break;\n\n      case \"right\":\n        ui.attributes.style.flexDirection = \"row-reverse\";\n        break;\n\n      case \"top\":\n        ui.attributes.style.flexDirection = \"column\";\n        break;\n\n      case \"bottom\":\n        ui.attributes.style.flexDirection = \"column-reverse\";\n        break;\n\n      case \"inline\":\n        delete ui.attributes.class;\n        caption.attributes.style.float = \"left\";\n        break;\n    }\n\n    return html;\n  }\n\n}\n\nexports.Field = Field;\n\nclass Fill extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"fill\", true);\n    this.id = attributes.id || \"\";\n    this.presence = (0, _utils.getStringOption)(attributes.presence, [\"visible\", \"hidden\", \"inactive\", \"invisible\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.color = null;\n    this.extras = null;\n    this.linear = null;\n    this.pattern = null;\n    this.radial = null;\n    this.solid = null;\n    this.stipple = null;\n  }\n\n  [_xfa_object.$toStyle]() {\n    for (const name of Object.getOwnPropertyNames(this)) {\n      if (name === \"extras\" || name === \"color\") {\n        continue;\n      }\n\n      const obj = this[name];\n\n      if (!(obj instanceof _xfa_object.XFAObject)) {\n        continue;\n      }\n\n      return {\n        color: obj[_xfa_object.$toStyle](this.color)\n      };\n    }\n\n    return {\n      color: this.color ? this.color[_xfa_object.$toStyle]() : \"#000000\"\n    };\n  }\n\n}\n\nclass Filter extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"filter\", true);\n    this.addRevocationInfo = (0, _utils.getStringOption)(attributes.addRevocationInfo, [\"\", \"required\", \"optional\", \"none\"]);\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.version = (0, _utils.getInteger)({\n      data: this.version,\n      defaultValue: 5,\n      validate: x => x >= 1 && x <= 5\n    });\n    this.appearanceFilter = null;\n    this.certificates = null;\n    this.digestMethods = null;\n    this.encodings = null;\n    this.encryptionMethods = null;\n    this.handler = null;\n    this.lockDocument = null;\n    this.mdp = null;\n    this.reasons = null;\n    this.timeStamp = null;\n  }\n\n}\n\nclass Float extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"float\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [_xfa_object.$finalize]() {\n    const number = parseFloat(this[_xfa_object.$content].trim());\n    this[_xfa_object.$content] = isNaN(number) ? null : number;\n  }\n\n  [_xfa_object.$toHTML]() {\n    return this[_xfa_object.$content] !== null ? this[_xfa_object.$content].toString() : \"\";\n  }\n\n}\n\nclass Font extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"font\", true);\n    this.baselineShift = (0, _utils.getMeasurement)(attributes.baselineShift);\n    this.fontHorizontalScale = (0, _utils.getFloat)({\n      data: attributes.fontHorizontalScale,\n      defaultValue: 100,\n      validate: x => x >= 0\n    });\n    this.fontVerticalScale = (0, _utils.getFloat)({\n      data: attributes.fontVerticalScale,\n      defaultValue: 100,\n      validate: x => x >= 0\n    });\n    this.id = attributes.id || \"\";\n    this.kerningMode = (0, _utils.getStringOption)(attributes.kerningMode, [\"none\", \"pair\"]);\n    this.letterSpacing = (0, _utils.getMeasurement)(attributes.letterSpacing, \"0\");\n    this.lineThrough = (0, _utils.getInteger)({\n      data: attributes.lineThrough,\n      defaultValue: 0,\n      validate: x => x === 1 || x === 2\n    });\n    this.lineThroughPeriod = (0, _utils.getStringOption)(attributes.lineThroughPeriod, [\"all\", \"word\"]);\n    this.overline = (0, _utils.getInteger)({\n      data: attributes.overline,\n      defaultValue: 0,\n      validate: x => x === 1 || x === 2\n    });\n    this.overlinePeriod = (0, _utils.getStringOption)(attributes.overlinePeriod, [\"all\", \"word\"]);\n    this.posture = (0, _utils.getStringOption)(attributes.posture, [\"normal\", \"italic\"]);\n    this.size = (0, _utils.getMeasurement)(attributes.size, \"10pt\");\n    this.typeface = attributes.typeface || \"\";\n    this.underline = (0, _utils.getInteger)({\n      data: attributes.underline,\n      defaultValue: 0,\n      validate: x => x === 1 || x === 2\n    });\n    this.underlinePeriod = (0, _utils.getStringOption)(attributes.underlinePeriod, [\"all\", \"word\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.weight = (0, _utils.getStringOption)(attributes.weight, [\"normal\", \"bold\"]);\n    this.extras = null;\n    this.fill = null;\n  }\n\n  [_xfa_object.$toStyle]() {\n    const style = (0, _html_utils.toStyle)(this, \"fill\");\n\n    if (style.color) {\n      if (!style.color.startsWith(\"#\")) {\n        style.backgroundClip = \"text\";\n        style.background = style.color;\n        style.color = \"transparent\";\n      } else if (style.color === \"#000000\") {\n        delete style.color;\n      }\n    }\n\n    if (this.baselineShift) {\n      style.verticalAlign = (0, _html_utils.measureToString)(this.baselineShift);\n    }\n\n    if (this.kerningMode !== \"none\") {\n      style.fontKerning = \"normal\";\n    }\n\n    if (this.letterSpacing) {\n      style.letterSpacing = (0, _html_utils.measureToString)(this.letterSpacing);\n    }\n\n    if (this.lineThrough !== 0) {\n      style.textDecoration = \"line-through\";\n\n      if (this.lineThrough === 2) {\n        style.textDecorationStyle = \"double\";\n      }\n    }\n\n    if (this.overline !== 0) {\n      style.textDecoration = \"overline\";\n\n      if (this.overline === 2) {\n        style.textDecorationStyle = \"double\";\n      }\n    }\n\n    if (this.posture !== \"normal\") {\n      style.fontStyle = this.posture;\n    }\n\n    const fontSize = (0, _html_utils.measureToString)(this.size);\n\n    if (fontSize !== \"10px\") {\n      style.fontSize = fontSize;\n    }\n\n    style.fontFamily = this.typeface;\n\n    if (this.underline !== 0) {\n      style.textDecoration = \"underline\";\n\n      if (this.underline === 2) {\n        style.textDecorationStyle = \"double\";\n      }\n    }\n\n    if (this.weight !== \"normal\") {\n      style.fontWeight = this.weight;\n    }\n\n    return style;\n  }\n\n}\n\nclass Format extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"format\", true);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.picture = null;\n  }\n\n}\n\nclass Handler extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"handler\");\n    this.id = attributes.id || \"\";\n    this.type = (0, _utils.getStringOption)(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass Hyphenation extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"hyphenation\");\n    this.excludeAllCaps = (0, _utils.getInteger)({\n      data: attributes.excludeAllCaps,\n      defaultValue: 0,\n      validate: x => x === 1\n    });\n    this.excludeInitialCap = (0, _utils.getInteger)({\n      data: attributes.excludeInitialCap,\n      defaultValue: 0,\n      validate: x => x === 1\n    });\n    this.hyphenate = (0, _utils.getInteger)({\n      data: attributes.hyphenate,\n      defaultValue: 0,\n      validate: x => x === 1\n    });\n    this.id = attributes.id || \"\";\n    this.pushCharacterCount = (0, _utils.getInteger)({\n      data: attributes.pushCharacterCount,\n      defaultValue: 3,\n      validate: x => x >= 0\n    });\n    this.remainCharacterCount = (0, _utils.getInteger)({\n      data: attributes.remainCharacterCount,\n      defaultValue: 3,\n      validate: x => x >= 0\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.wordCharacterCount = (0, _utils.getInteger)({\n      data: attributes.wordCharacterCount,\n      defaultValue: 7,\n      validate: x => x >= 0\n    });\n  }\n\n}\n\nclass Image extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"image\");\n    this.aspect = (0, _utils.getStringOption)(attributes.aspect, [\"fit\", \"actual\", \"height\", \"none\", \"width\"]);\n    this.contentType = attributes.contentType || \"\";\n    this.href = attributes.href || \"\";\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.transferEncoding = (0, _utils.getStringOption)(attributes.transferEncoding, [\"base64\", \"none\", \"package\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [_xfa_object.$toHTML]() {\n    const html = {\n      name: \"img\",\n      attributes: {\n        style: {}\n      }\n    };\n\n    if (this.href) {\n      html.attributes.src = new URL(this.href);\n      return html;\n    }\n\n    if (this.transferEncoding === \"base64\") {\n      const buffer = Uint8Array.from(atob(this[_xfa_object.$content]), c => c.charCodeAt(0));\n      const blob = new Blob([buffer], {\n        type: this.contentType\n      });\n      html.attributes.src = URL.createObjectURL(blob);\n      return html;\n    }\n\n    return null;\n  }\n\n}\n\nclass ImageEdit extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"imageEdit\", true);\n    this.data = (0, _utils.getStringOption)(attributes.data, [\"link\", \"embed\"]);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.border = null;\n    this.extras = null;\n    this.margin = null;\n  }\n\n}\n\nclass Integer extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"integer\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [_xfa_object.$finalize]() {\n    const number = parseInt(this[_xfa_object.$content].trim(), 10);\n    this[_xfa_object.$content] = isNaN(number) ? null : number;\n  }\n\n  [_xfa_object.$toHTML]() {\n    return this[_xfa_object.$content] !== null ? this[_xfa_object.$content].toString() : \"\";\n  }\n\n}\n\nclass Issuers extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"issuers\", true);\n    this.id = attributes.id || \"\";\n    this.type = (0, _utils.getStringOption)(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.certificate = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Items extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"items\", true);\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.presence = (0, _utils.getStringOption)(attributes.presence, [\"visible\", \"hidden\", \"inactive\", \"invisible\"]);\n    this.ref = attributes.ref || \"\";\n    this.save = (0, _utils.getInteger)({\n      data: attributes.save,\n      defaultValue: 0,\n      validate: x => x === 1\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.boolean = new _xfa_object.XFAObjectArray();\n    this.date = new _xfa_object.XFAObjectArray();\n    this.dateTime = new _xfa_object.XFAObjectArray();\n    this.decimal = new _xfa_object.XFAObjectArray();\n    this.exData = new _xfa_object.XFAObjectArray();\n    this.float = new _xfa_object.XFAObjectArray();\n    this.image = new _xfa_object.XFAObjectArray();\n    this.integer = new _xfa_object.XFAObjectArray();\n    this.text = new _xfa_object.XFAObjectArray();\n    this.time = new _xfa_object.XFAObjectArray();\n  }\n\n  [_xfa_object.$hasItem](value) {\n    return this.hasOwnProperty(value[_xfa_object.$nodeName]) && this[value[_xfa_object.$nodeName]].children.some(node => node[_xfa_object.$content] === value[_xfa_object.$content]);\n  }\n\n}\n\nexports.Items = Items;\n\nclass Keep extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"keep\", true);\n    this.id = attributes.id || \"\";\n    const options = [\"none\", \"contentArea\", \"pageArea\"];\n    this.intact = (0, _utils.getStringOption)(attributes.intact, options);\n    this.next = (0, _utils.getStringOption)(attributes.next, options);\n    this.previous = (0, _utils.getStringOption)(attributes.previous, options);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n  }\n\n}\n\nclass KeyUsage extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"keyUsage\");\n    const options = [\"\", \"yes\", \"no\"];\n    this.crlSign = (0, _utils.getStringOption)(attributes.crlSign, options);\n    this.dataEncipherment = (0, _utils.getStringOption)(attributes.dataEncipherment, options);\n    this.decipherOnly = (0, _utils.getStringOption)(attributes.decipherOnly, options);\n    this.digitalSignature = (0, _utils.getStringOption)(attributes.digitalSignature, options);\n    this.encipherOnly = (0, _utils.getStringOption)(attributes.encipherOnly, options);\n    this.id = attributes.id || \"\";\n    this.keyAgreement = (0, _utils.getStringOption)(attributes.keyAgreement, options);\n    this.keyCertSign = (0, _utils.getStringOption)(attributes.keyCertSign, options);\n    this.keyEncipherment = (0, _utils.getStringOption)(attributes.keyEncipherment, options);\n    this.nonRepudiation = (0, _utils.getStringOption)(attributes.nonRepudiation, options);\n    this.type = (0, _utils.getStringOption)(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass Line extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"line\", true);\n    this.hand = (0, _utils.getStringOption)(attributes.hand, [\"even\", \"left\", \"right\"]);\n    this.id = attributes.id || \"\";\n    this.slope = (0, _utils.getStringOption)(attributes.slope, [\"\\\\\", \"/\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.edge = null;\n  }\n\n}\n\nclass Linear extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"linear\", true);\n    this.id = attributes.id || \"\";\n    this.type = (0, _utils.getStringOption)(attributes.type, [\"toRight\", \"toBottom\", \"toLeft\", \"toTop\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.color = null;\n    this.extras = null;\n  }\n\n  [_xfa_object.$toStyle](startColor) {\n    startColor = startColor ? startColor[_xfa_object.$toStyle]() : \"#FFFFFF\";\n    const transf = this.type.replace(/([RBLT])/, \" $1\").toLowerCase();\n    const endColor = this.color ? this.color[_xfa_object.$toStyle]() : \"#000000\";\n    return `linear-gradient(${transf}, ${startColor}, ${endColor})`;\n  }\n\n}\n\nclass LockDocument extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"lockDocument\");\n    this.id = attributes.id || \"\";\n    this.type = (0, _utils.getStringOption)(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [_xfa_object.$finalize]() {\n    this[_xfa_object.$content] = (0, _utils.getStringOption)(this[_xfa_object.$content], [\"auto\", \"0\", \"1\"]);\n  }\n\n}\n\nclass Manifest extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"manifest\", true);\n    this.action = (0, _utils.getStringOption)(attributes.action, [\"include\", \"all\", \"exclude\"]);\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.ref = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Margin extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"margin\", true);\n    this.bottomInset = (0, _utils.getMeasurement)(attributes.bottomInset, \"0\");\n    this.id = attributes.id || \"\";\n    this.leftInset = (0, _utils.getMeasurement)(attributes.leftInset, \"0\");\n    this.rightInset = (0, _utils.getMeasurement)(attributes.rightInset, \"0\");\n    this.topInset = (0, _utils.getMeasurement)(attributes.topInset, \"0\");\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n  }\n\n  [_xfa_object.$toStyle]() {\n    return {\n      marginLeft: (0, _html_utils.measureToString)(this.leftInset),\n      marginRight: (0, _html_utils.measureToString)(this.rightInset),\n      marginTop: (0, _html_utils.measureToString)(this.topInset),\n      marginBottom: (0, _html_utils.measureToString)(this.bottomInset)\n    };\n  }\n\n}\n\nclass Mdp extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"mdp\");\n    this.id = attributes.id || \"\";\n    this.permissions = (0, _utils.getInteger)({\n      data: attributes.permissions,\n      defaultValue: 2,\n      validate: x => x === 1 || x === 3\n    });\n    this.signatureType = (0, _utils.getStringOption)(attributes.signatureType, [\"filler\", \"author\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass Medium extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"medium\");\n    this.id = attributes.id || \"\";\n    this.imagingBBox = (0, _utils.getBBox)(attributes.imagingBBox);\n    this.long = (0, _utils.getMeasurement)(attributes.long);\n    this.orientation = (0, _utils.getStringOption)(attributes.orientation, [\"portrait\", \"landscape\"]);\n    this.short = (0, _utils.getMeasurement)(attributes.short);\n    this.stock = attributes.stock || \"\";\n    this.trayIn = (0, _utils.getStringOption)(attributes.trayIn, [\"auto\", \"delegate\", \"pageFront\"]);\n    this.trayOut = (0, _utils.getStringOption)(attributes.trayOut, [\"auto\", \"delegate\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass Message extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"message\", true);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.text = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass NumericEdit extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"numericEdit\", true);\n    this.hScrollPolicy = (0, _utils.getStringOption)(attributes.hScrollPolicy, [\"auto\", \"off\", \"on\"]);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.border = null;\n    this.comb = null;\n    this.extras = null;\n    this.margin = null;\n  }\n\n  [_xfa_object.$toHTML]() {\n    const style = (0, _html_utils.toStyle)(this, \"border\", \"font\", \"margin\");\n    const html = {\n      name: \"input\",\n      attributes: {\n        type: \"text\",\n        class: \"xfaTextfield\",\n        style\n      }\n    };\n    return {\n      name: \"label\",\n      attributes: {\n        class: \"xfaLabel\"\n      },\n      children: [html]\n    };\n  }\n\n}\n\nclass Occur extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"occur\", true);\n    this.id = attributes.id || \"\";\n    this.initial = (0, _utils.getInteger)({\n      data: attributes.initial,\n      defaultValue: 1,\n      validate: x => true\n    });\n    this.max = (0, _utils.getInteger)({\n      data: attributes.max,\n      defaultValue: 1,\n      validate: x => true\n    });\n    this.min = (0, _utils.getInteger)({\n      data: attributes.min,\n      defaultValue: 1,\n      validate: x => true\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n  }\n\n}\n\nclass Oid extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"oid\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass Oids extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"oids\", true);\n    this.id = attributes.id || \"\";\n    this.type = (0, _utils.getStringOption)(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.oid = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Overflow extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"overflow\");\n    this.id = attributes.id || \"\";\n    this.leader = attributes.leader || \"\";\n    this.target = attributes.target || \"\";\n    this.trailer = attributes.trailer || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass PageArea extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"pageArea\", true);\n    this.blankOrNotBlank = (0, _utils.getStringOption)(attributes.blankOrNotBlank, [\"any\", \"blank\", \"notBlank\"]);\n    this.id = attributes.id || \"\";\n    this.initialNumber = (0, _utils.getInteger)({\n      data: attributes.initialNumber,\n      defaultValue: 1,\n      validate: x => true\n    });\n    this.name = attributes.name || \"\";\n    this.numbered = (0, _utils.getInteger)({\n      data: attributes.numbered,\n      defaultValue: 1,\n      validate: x => true\n    });\n    this.oddOrEven = (0, _utils.getStringOption)(attributes.oddOrEven, [\"any\", \"even\", \"odd\"]);\n    this.pagePosition = (0, _utils.getStringOption)(attributes.pagePosition, [\"any\", \"first\", \"last\", \"only\", \"rest\"]);\n    this.relevant = (0, _utils.getRelevant)(attributes.relevant);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.desc = null;\n    this.extras = null;\n    this.medium = null;\n    this.occur = null;\n    this.area = new _xfa_object.XFAObjectArray();\n    this.contentArea = new _xfa_object.XFAObjectArray();\n    this.draw = new _xfa_object.XFAObjectArray();\n    this.exclGroup = new _xfa_object.XFAObjectArray();\n    this.field = new _xfa_object.XFAObjectArray();\n    this.subform = new _xfa_object.XFAObjectArray();\n  }\n\n  [_xfa_object.$toHTML]() {\n    if (this.contentArea.children.length === 0) {\n      return null;\n    }\n\n    const children = this[_xfa_object.$childrenToHTML]({\n      filter: new Set([\"area\", \"draw\", \"field\", \"subform\", \"contentArea\"]),\n      include: true\n    });\n\n    const contentArea = children.find(node => node.attributes.class === \"xfaContentarea\");\n    const style = Object.create(null);\n\n    if (this.medium && this.medium.short && this.medium.long) {\n      style.width = (0, _html_utils.measureToString)(this.medium.short);\n      style.height = (0, _html_utils.measureToString)(this.medium.long);\n    } else {}\n\n    return {\n      name: \"div\",\n      children,\n      attributes: {\n        id: this[_xfa_object.$uid],\n        style\n      },\n      contentArea\n    };\n  }\n\n}\n\nclass PageSet extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"pageSet\", true);\n    this.duplexImposition = (0, _utils.getStringOption)(attributes.duplexImposition, [\"longEdge\", \"shortEdge\"]);\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.relation = (0, _utils.getStringOption)(attributes.relation, [\"orderedOccurrence\", \"duplexPaginated\", \"simplexPaginated\"]);\n    this.relevant = (0, _utils.getRelevant)(attributes.relevant);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.occur = null;\n    this.pageArea = new _xfa_object.XFAObjectArray();\n    this.pageSet = new _xfa_object.XFAObjectArray();\n  }\n\n  [_xfa_object.$toHTML]() {\n    return {\n      name: \"div\",\n      children: this[_xfa_object.$childrenToHTML]({\n        filter: new Set([\"pageArea\", \"pageSet\"]),\n        include: true\n      }),\n      attributes: {\n        id: this[_xfa_object.$uid]\n      }\n    };\n  }\n\n}\n\nclass Para extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"para\", true);\n    this.hAlign = (0, _utils.getStringOption)(attributes.hAlign, [\"left\", \"center\", \"justify\", \"justifyAll\", \"radix\", \"right\"]);\n    this.id = attributes.id || \"\";\n    this.lineHeight = (0, _utils.getMeasurement)(attributes.lineHeight, \"0pt\");\n    this.marginLeft = (0, _utils.getMeasurement)(attributes.marginLeft, \"0\");\n    this.marginRight = (0, _utils.getMeasurement)(attributes.marginRight, \"0\");\n    this.orphans = (0, _utils.getInteger)({\n      data: attributes.orphans,\n      defaultValue: 0,\n      validate: x => x >= 0\n    });\n    this.preserve = attributes.preserve || \"\";\n    this.radixOffset = (0, _utils.getMeasurement)(attributes.radixOffset, \"0\");\n    this.spaceAbove = (0, _utils.getMeasurement)(attributes.spaceAbove, \"0\");\n    this.spaceBelow = (0, _utils.getMeasurement)(attributes.spaceBelow, \"0\");\n    this.tabDefault = attributes.tabDefault ? (0, _utils.getMeasurement)(this.tabDefault) : null;\n    this.tabStops = (attributes.tabStops || \"\").trim().split(/\\s+/).map((x, i) => i % 2 === 1 ? (0, _utils.getMeasurement)(x) : x);\n    this.textIndent = (0, _utils.getMeasurement)(attributes.textIndent, \"0\");\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.vAlign = (0, _utils.getStringOption)(attributes.vAlign, [\"top\", \"bottom\", \"middle\"]);\n    this.widows = (0, _utils.getInteger)({\n      data: attributes.widows,\n      defaultValue: 0,\n      validate: x => x >= 0\n    });\n    this.hyphenation = null;\n  }\n\n  [_xfa_object.$toHTML]() {\n    const style = {\n      marginLeft: (0, _html_utils.measureToString)(this.marginLeft),\n      marginRight: (0, _html_utils.measureToString)(this.marginRight),\n      paddingTop: (0, _html_utils.measureToString)(this.spaceAbove),\n      paddingBottom: (0, _html_utils.measureToString)(this.spaceBelow),\n      textIndent: (0, _html_utils.measureToString)(this.textIndent),\n      verticalAlign: this.vAlign\n    };\n\n    if (this.lineHeight.value >= 0) {\n      style.lineHeight = (0, _html_utils.measureToString)(this.lineHeight);\n    }\n\n    if (this.tabDefault) {\n      style.tabSize = (0, _html_utils.measureToString)(this.tabDefault);\n    }\n\n    if (this.tabStops.length > 0) {}\n\n    if (this.hyphenatation) {\n      Object.assign(style, this.hyphenatation[_xfa_object.$toHTML]());\n    }\n\n    return style;\n  }\n\n}\n\nclass PasswordEdit extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"passwordEdit\", true);\n    this.hScrollPolicy = (0, _utils.getStringOption)(attributes.hScrollPolicy, [\"auto\", \"off\", \"on\"]);\n    this.id = attributes.id || \"\";\n    this.passwordChar = attributes.passwordChar || \"*\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.border = null;\n    this.extras = null;\n    this.margin = null;\n  }\n\n}\n\nclass Pattern extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"pattern\", true);\n    this.id = attributes.id || \"\";\n    this.type = (0, _utils.getStringOption)(attributes.type, [\"crossHatch\", \"crossDiagonal\", \"diagonalLeft\", \"diagonalRight\", \"horizontal\", \"vertical\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.color = null;\n    this.extras = null;\n  }\n\n  [_xfa_object.$toStyle](startColor) {\n    startColor = startColor ? startColor[_xfa_object.$toStyle]() : \"#FFFFFF\";\n    const endColor = this.color ? this.color[_xfa_object.$toStyle]() : \"#000000\";\n    const width = 5;\n    const cmd = \"repeating-linear-gradient\";\n    const colors = `${startColor},${startColor} ${width}px,${endColor} ${width}px,${endColor} ${2 * width}px`;\n\n    switch (this.type) {\n      case \"crossHatch\":\n        return `${cmd}(to top,${colors}) ${cmd}(to right,${colors})`;\n\n      case \"crossDiagonal\":\n        return `${cmd}(45deg,${colors}) ${cmd}(-45deg,${colors})`;\n\n      case \"diagonalLeft\":\n        return `${cmd}(45deg,${colors})`;\n\n      case \"diagonalRight\":\n        return `${cmd}(-45deg,${colors})`;\n\n      case \"horizontal\":\n        return `${cmd}(to top,${colors})`;\n\n      case \"vertical\":\n        return `${cmd}(to right,${colors})`;\n    }\n\n    return \"\";\n  }\n\n}\n\nclass Picture extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"picture\");\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass Proto extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"proto\", true);\n    this.appearanceFilter = new _xfa_object.XFAObjectArray();\n    this.arc = new _xfa_object.XFAObjectArray();\n    this.area = new _xfa_object.XFAObjectArray();\n    this.assist = new _xfa_object.XFAObjectArray();\n    this.barcode = new _xfa_object.XFAObjectArray();\n    this.bindItems = new _xfa_object.XFAObjectArray();\n    this.bookend = new _xfa_object.XFAObjectArray();\n    this.boolean = new _xfa_object.XFAObjectArray();\n    this.border = new _xfa_object.XFAObjectArray();\n    this.break = new _xfa_object.XFAObjectArray();\n    this.breakAfter = new _xfa_object.XFAObjectArray();\n    this.breakBefore = new _xfa_object.XFAObjectArray();\n    this.button = new _xfa_object.XFAObjectArray();\n    this.calculate = new _xfa_object.XFAObjectArray();\n    this.caption = new _xfa_object.XFAObjectArray();\n    this.certificate = new _xfa_object.XFAObjectArray();\n    this.certificates = new _xfa_object.XFAObjectArray();\n    this.checkButton = new _xfa_object.XFAObjectArray();\n    this.choiceList = new _xfa_object.XFAObjectArray();\n    this.color = new _xfa_object.XFAObjectArray();\n    this.comb = new _xfa_object.XFAObjectArray();\n    this.connect = new _xfa_object.XFAObjectArray();\n    this.contentArea = new _xfa_object.XFAObjectArray();\n    this.corner = new _xfa_object.XFAObjectArray();\n    this.date = new _xfa_object.XFAObjectArray();\n    this.dateTime = new _xfa_object.XFAObjectArray();\n    this.dateTimeEdit = new _xfa_object.XFAObjectArray();\n    this.decimal = new _xfa_object.XFAObjectArray();\n    this.defaultUi = new _xfa_object.XFAObjectArray();\n    this.desc = new _xfa_object.XFAObjectArray();\n    this.digestMethod = new _xfa_object.XFAObjectArray();\n    this.digestMethods = new _xfa_object.XFAObjectArray();\n    this.draw = new _xfa_object.XFAObjectArray();\n    this.edge = new _xfa_object.XFAObjectArray();\n    this.encoding = new _xfa_object.XFAObjectArray();\n    this.encodings = new _xfa_object.XFAObjectArray();\n    this.encrypt = new _xfa_object.XFAObjectArray();\n    this.encryptData = new _xfa_object.XFAObjectArray();\n    this.encryption = new _xfa_object.XFAObjectArray();\n    this.encryptionMethod = new _xfa_object.XFAObjectArray();\n    this.encryptionMethods = new _xfa_object.XFAObjectArray();\n    this.event = new _xfa_object.XFAObjectArray();\n    this.exData = new _xfa_object.XFAObjectArray();\n    this.exObject = new _xfa_object.XFAObjectArray();\n    this.exclGroup = new _xfa_object.XFAObjectArray();\n    this.execute = new _xfa_object.XFAObjectArray();\n    this.extras = new _xfa_object.XFAObjectArray();\n    this.field = new _xfa_object.XFAObjectArray();\n    this.fill = new _xfa_object.XFAObjectArray();\n    this.filter = new _xfa_object.XFAObjectArray();\n    this.float = new _xfa_object.XFAObjectArray();\n    this.font = new _xfa_object.XFAObjectArray();\n    this.format = new _xfa_object.XFAObjectArray();\n    this.handler = new _xfa_object.XFAObjectArray();\n    this.hyphenation = new _xfa_object.XFAObjectArray();\n    this.image = new _xfa_object.XFAObjectArray();\n    this.imageEdit = new _xfa_object.XFAObjectArray();\n    this.integer = new _xfa_object.XFAObjectArray();\n    this.issuers = new _xfa_object.XFAObjectArray();\n    this.items = new _xfa_object.XFAObjectArray();\n    this.keep = new _xfa_object.XFAObjectArray();\n    this.keyUsage = new _xfa_object.XFAObjectArray();\n    this.line = new _xfa_object.XFAObjectArray();\n    this.linear = new _xfa_object.XFAObjectArray();\n    this.lockDocument = new _xfa_object.XFAObjectArray();\n    this.manifest = new _xfa_object.XFAObjectArray();\n    this.margin = new _xfa_object.XFAObjectArray();\n    this.mdp = new _xfa_object.XFAObjectArray();\n    this.medium = new _xfa_object.XFAObjectArray();\n    this.message = new _xfa_object.XFAObjectArray();\n    this.numericEdit = new _xfa_object.XFAObjectArray();\n    this.occur = new _xfa_object.XFAObjectArray();\n    this.oid = new _xfa_object.XFAObjectArray();\n    this.oids = new _xfa_object.XFAObjectArray();\n    this.overflow = new _xfa_object.XFAObjectArray();\n    this.pageArea = new _xfa_object.XFAObjectArray();\n    this.pageSet = new _xfa_object.XFAObjectArray();\n    this.para = new _xfa_object.XFAObjectArray();\n    this.passwordEdit = new _xfa_object.XFAObjectArray();\n    this.pattern = new _xfa_object.XFAObjectArray();\n    this.picture = new _xfa_object.XFAObjectArray();\n    this.radial = new _xfa_object.XFAObjectArray();\n    this.reason = new _xfa_object.XFAObjectArray();\n    this.reasons = new _xfa_object.XFAObjectArray();\n    this.rectangle = new _xfa_object.XFAObjectArray();\n    this.ref = new _xfa_object.XFAObjectArray();\n    this.script = new _xfa_object.XFAObjectArray();\n    this.setProperty = new _xfa_object.XFAObjectArray();\n    this.signData = new _xfa_object.XFAObjectArray();\n    this.signature = new _xfa_object.XFAObjectArray();\n    this.signing = new _xfa_object.XFAObjectArray();\n    this.solid = new _xfa_object.XFAObjectArray();\n    this.speak = new _xfa_object.XFAObjectArray();\n    this.stipple = new _xfa_object.XFAObjectArray();\n    this.subform = new _xfa_object.XFAObjectArray();\n    this.subformSet = new _xfa_object.XFAObjectArray();\n    this.subjectDN = new _xfa_object.XFAObjectArray();\n    this.subjectDNs = new _xfa_object.XFAObjectArray();\n    this.submit = new _xfa_object.XFAObjectArray();\n    this.text = new _xfa_object.XFAObjectArray();\n    this.textEdit = new _xfa_object.XFAObjectArray();\n    this.time = new _xfa_object.XFAObjectArray();\n    this.timeStamp = new _xfa_object.XFAObjectArray();\n    this.toolTip = new _xfa_object.XFAObjectArray();\n    this.traversal = new _xfa_object.XFAObjectArray();\n    this.traverse = new _xfa_object.XFAObjectArray();\n    this.ui = new _xfa_object.XFAObjectArray();\n    this.validate = new _xfa_object.XFAObjectArray();\n    this.value = new _xfa_object.XFAObjectArray();\n    this.variables = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Radial extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"radial\", true);\n    this.id = attributes.id || \"\";\n    this.type = (0, _utils.getStringOption)(attributes.type, [\"toEdge\", \"toCenter\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.color = null;\n    this.extras = null;\n  }\n\n  [_xfa_object.$toStyle](startColor) {\n    startColor = startColor ? startColor[_xfa_object.$toStyle]() : \"#FFFFFF\";\n    const endColor = this.color ? this.color[_xfa_object.$toStyle]() : \"#000000\";\n    const colors = this.type === \"toEdge\" ? `${startColor},${endColor}` : `${endColor},${startColor}`;\n    return `radial-gradient(circle to center, ${colors})`;\n  }\n\n}\n\nclass Reason extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"reason\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass Reasons extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"reasons\", true);\n    this.id = attributes.id || \"\";\n    this.type = (0, _utils.getStringOption)(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.reason = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Rectangle extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"rectangle\", true);\n    this.hand = (0, _utils.getStringOption)(attributes.hand, [\"even\", \"left\", \"right\"]);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.corner = new _xfa_object.XFAObjectArray(4);\n    this.edge = new _xfa_object.XFAObjectArray(4);\n    this.fill = null;\n  }\n\n}\n\nclass RefElement extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"ref\");\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass Script extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"script\");\n    this.binding = attributes.binding || \"\";\n    this.contentType = attributes.contentType || \"\";\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.runAt = (0, _utils.getStringOption)(attributes.runAt, [\"client\", \"both\", \"server\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass SetProperty extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"setProperty\");\n    this.connection = attributes.connection || \"\";\n    this.ref = attributes.ref || \"\";\n    this.target = attributes.target || \"\";\n  }\n\n}\n\nexports.SetProperty = SetProperty;\n\nclass SignData extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"signData\", true);\n    this.id = attributes.id || \"\";\n    this.operation = (0, _utils.getStringOption)(attributes.operation, [\"sign\", \"clear\", \"verify\"]);\n    this.ref = attributes.ref || \"\";\n    this.target = attributes.target || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.filter = null;\n    this.manifest = null;\n  }\n\n}\n\nclass Signature extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"signature\", true);\n    this.id = attributes.id || \"\";\n    this.type = (0, _utils.getStringOption)(attributes.type, [\"PDF1.3\", \"PDF1.6\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.border = null;\n    this.extras = null;\n    this.filter = null;\n    this.manifest = null;\n    this.margin = null;\n  }\n\n}\n\nclass Signing extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"signing\", true);\n    this.id = attributes.id || \"\";\n    this.type = (0, _utils.getStringOption)(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.certificate = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Solid extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"solid\", true);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n  }\n\n  [_xfa_object.$toStyle](startColor) {\n    return startColor ? startColor[_xfa_object.$toStyle]() : \"#FFFFFF\";\n  }\n\n}\n\nclass Speak extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"speak\");\n    this.disable = (0, _utils.getInteger)({\n      data: attributes.disable,\n      defaultValue: 0,\n      validate: x => x === 1\n    });\n    this.id = attributes.id || \"\";\n    this.priority = (0, _utils.getStringOption)(attributes.priority, [\"custom\", \"caption\", \"name\", \"toolTip\"]);\n    this.rid = attributes.rid || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass Stipple extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"stipple\", true);\n    this.id = attributes.id || \"\";\n    this.rate = (0, _utils.getInteger)({\n      data: attributes.rate,\n      defaultValue: 50,\n      validate: x => x >= 0 && x <= 100\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.color = null;\n    this.extras = null;\n  }\n\n  [_xfa_object.$toStyle](bgColor) {\n    const alpha = this.rate / 100;\n    return _util.Util.makeHexColor(Math.round(bgColor.value.r * (1 - alpha) + this.value.r * alpha), Math.round(bgColor.value.g * (1 - alpha) + this.value.g * alpha), Math.round(bgColor.value.b * (1 - alpha) + this.value.b * alpha));\n  }\n\n}\n\nclass Subform extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"subform\", true);\n    this.access = (0, _utils.getStringOption)(attributes.access, [\"open\", \"nonInteractive\", \"protected\", \"readOnly\"]);\n    this.allowMacro = (0, _utils.getInteger)({\n      data: attributes.allowMacro,\n      defaultValue: 0,\n      validate: x => x === 1\n    });\n    this.anchorType = (0, _utils.getStringOption)(attributes.anchorType, [\"topLeft\", \"bottomCenter\", \"bottomLeft\", \"bottomRight\", \"middleCenter\", \"middleLeft\", \"middleRight\", \"topCenter\", \"topRight\"]);\n    this.colSpan = (0, _utils.getInteger)({\n      data: attributes.colSpan,\n      defaultValue: 1,\n      validate: x => x >= 1\n    });\n    this.columnWidths = (attributes.columnWidths || \"\").trim().split(/\\s+/).map(x => x === \"-1\" ? -1 : (0, _utils.getMeasurement)(x));\n    this.h = attributes.h ? (0, _utils.getMeasurement)(attributes.h) : \"\";\n    this.hAlign = (0, _utils.getStringOption)(attributes.hAlign, [\"left\", \"center\", \"justify\", \"justifyAll\", \"radix\", \"right\"]);\n    this.id = attributes.id || \"\";\n    this.layout = (0, _utils.getStringOption)(attributes.layout, [\"position\", \"lr-tb\", \"rl-row\", \"rl-tb\", \"row\", \"table\", \"tb\"]);\n    this.locale = attributes.locale || \"\";\n    this.maxH = (0, _utils.getMeasurement)(attributes.maxH, \"0pt\");\n    this.maxW = (0, _utils.getMeasurement)(attributes.maxW, \"0pt\");\n    this.mergeMode = (0, _utils.getStringOption)(attributes.mergeMode, [\"consumeData\", \"matchTemplate\"]);\n    this.minH = (0, _utils.getMeasurement)(attributes.minH, \"0pt\");\n    this.minW = (0, _utils.getMeasurement)(attributes.minW, \"0pt\");\n    this.name = attributes.name || \"\";\n    this.presence = (0, _utils.getStringOption)(attributes.presence, [\"visible\", \"hidden\", \"inactive\", \"invisible\"]);\n    this.relevant = (0, _utils.getRelevant)(attributes.relevant);\n    this.restoreState = (0, _utils.getStringOption)(attributes.restoreState, [\"manual\", \"auto\"]);\n    this.scope = (0, _utils.getStringOption)(attributes.scope, [\"name\", \"none\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.w = attributes.w ? (0, _utils.getMeasurement)(attributes.w) : \"\";\n    this.x = (0, _utils.getMeasurement)(attributes.x, \"0pt\");\n    this.y = (0, _utils.getMeasurement)(attributes.y, \"0pt\");\n    this.assist = null;\n    this.bind = null;\n    this.bookend = null;\n    this.border = null;\n    this.break = null;\n    this.calculate = null;\n    this.desc = null;\n    this.extras = null;\n    this.keep = null;\n    this.margin = null;\n    this.occur = null;\n    this.overflow = null;\n    this.pageSet = null;\n    this.para = null;\n    this.traversal = null;\n    this.validate = null;\n    this.variables = null;\n    this.area = new _xfa_object.XFAObjectArray();\n    this.breakAfter = new _xfa_object.XFAObjectArray();\n    this.breakBefore = new _xfa_object.XFAObjectArray();\n    this.connect = new _xfa_object.XFAObjectArray();\n    this.draw = new _xfa_object.XFAObjectArray();\n    this.event = new _xfa_object.XFAObjectArray();\n    this.exObject = new _xfa_object.XFAObjectArray();\n    this.exclGroup = new _xfa_object.XFAObjectArray();\n    this.field = new _xfa_object.XFAObjectArray();\n    this.proto = new _xfa_object.XFAObjectArray();\n    this.setProperty = new _xfa_object.XFAObjectArray();\n    this.subform = new _xfa_object.XFAObjectArray();\n    this.subformSet = new _xfa_object.XFAObjectArray();\n  }\n\n  [_xfa_object.$toHTML]() {\n    this[_xfa_object.$extra] = Object.create(null);\n\n    const parent = this[_xfa_object.$getParent]();\n\n    let page = null;\n\n    if (parent[_xfa_object.$nodeName] === \"template\") {\n      if (this.pageSet !== null) {\n        this[_xfa_object.$extra].pageNumber = 0;\n      } else {\n        (0, _util.warn)(\"XFA - No pageSet in root subform\");\n      }\n    } else if (parent[_xfa_object.$extra] && parent[_xfa_object.$extra].pageNumber !== undefined) {\n      const pageNumber = parent[_xfa_object.$extra].pageNumber;\n      const pageAreas = parent.pageSet.pageArea.children;\n      parent[_xfa_object.$extra].pageNumber = (parent[_xfa_object.$extra].pageNumber + 1) % pageAreas.length;\n      page = pageAreas[pageNumber][_xfa_object.$toHTML]();\n    }\n\n    const style = (0, _html_utils.toStyle)(this, \"dimensions\", \"position\", \"presence\");\n    const clazz = [\"xfaSubform\"];\n    const cl = (0, _html_utils.layoutClass)(this);\n\n    if (cl) {\n      clazz.push(cl);\n    }\n\n    const attributes = {\n      style,\n      id: this[_xfa_object.$uid],\n      class: clazz.join(\" \")\n    };\n\n    if (this.name) {\n      attributes.xfaName = this.name;\n    }\n\n    const children = this[_xfa_object.$childrenToHTML]({\n      filter: new Set([\"area\", \"draw\", \"field\", \"subform\", \"subformSet\"]),\n      include: true\n    });\n\n    const html = {\n      name: \"div\",\n      attributes,\n      children\n    };\n\n    if (page) {\n      page.contentArea.children.push(html);\n      delete page.contentArea;\n      return page;\n    }\n\n    return html;\n  }\n\n}\n\nclass SubformSet extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"subformSet\", true);\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.relation = (0, _utils.getStringOption)(attributes.relation, [\"ordered\", \"choice\", \"unordered\"]);\n    this.relevant = (0, _utils.getRelevant)(attributes.relevant);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.bookend = null;\n    this.break = null;\n    this.desc = null;\n    this.extras = null;\n    this.occur = null;\n    this.overflow = null;\n    this.breakAfter = new _xfa_object.XFAObjectArray();\n    this.breakBefore = new _xfa_object.XFAObjectArray();\n    this.subform = new _xfa_object.XFAObjectArray();\n    this.subformSet = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass SubjectDN extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"subjectDN\");\n    this.delimiter = attributes.delimiter || \",\";\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [_xfa_object.$finalize]() {\n    this[_xfa_object.$content] = new Map(this[_xfa_object.$content].split(this.delimiter).map(kv => {\n      kv = kv.split(\"=\", 2);\n      kv[0] = kv[0].trim();\n      return kv;\n    }));\n  }\n\n}\n\nclass SubjectDNs extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"subjectDNs\", true);\n    this.id = attributes.id || \"\";\n    this.type = (0, _utils.getStringOption)(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.subjectDN = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Submit extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"submit\", true);\n    this.embedPDF = (0, _utils.getInteger)({\n      data: attributes.embedPDF,\n      defaultValue: 0,\n      validate: x => x === 1\n    });\n    this.format = (0, _utils.getStringOption)(attributes.format, [\"xdp\", \"formdata\", \"pdf\", \"urlencoded\", \"xfd\", \"xml\"]);\n    this.id = attributes.id || \"\";\n    this.target = attributes.target || \"\";\n    this.textEncoding = (0, _utils.getKeyword)({\n      data: attributes.textEncoding ? attributes.textEncoding.toLowerCase() : \"\",\n      defaultValue: \"\",\n      validate: k => [\"utf-8\", \"big-five\", \"fontspecific\", \"gbk\", \"gb-18030\", \"gb-2312\", \"ksc-5601\", \"none\", \"shift-jis\", \"ucs-2\", \"utf-16\"].includes(k) || k.match(/iso-8859-[0-9]{2}/)\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.xdpContent = attributes.xdpContent || \"\";\n    this.encrypt = null;\n    this.encryptData = new _xfa_object.XFAObjectArray();\n    this.signData = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Template extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"template\", true);\n    this.baseProfile = (0, _utils.getStringOption)(attributes.baseProfile, [\"full\", \"interactiveForms\"]);\n    this.extras = null;\n    this.subform = new _xfa_object.XFAObjectArray();\n  }\n\n  [_xfa_object.$finalize]() {\n    if (this.subform.children.length === 0) {\n      (0, _util.warn)(\"XFA - No subforms in template node.\");\n    }\n\n    if (this.subform.children.length >= 2) {\n      (0, _util.warn)(\"XFA - Several subforms in template node: please file a bug.\");\n    }\n  }\n\n  [_xfa_object.$toHTML]() {\n    if (this.subform.children.length > 0) {\n      return this.subform.children[0][_xfa_object.$toHTML]();\n    }\n\n    return {\n      name: \"div\",\n      children: []\n    };\n  }\n\n}\n\nexports.Template = Template;\n\nclass Text extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"text\");\n    this.id = attributes.id || \"\";\n    this.maxChars = (0, _utils.getInteger)({\n      data: attributes.maxChars,\n      defaultValue: 0,\n      validate: x => x >= 0\n    });\n    this.name = attributes.name || \"\";\n    this.rid = attributes.rid || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [_xfa_object.$onChild](child) {\n    if (child[_xfa_object.$namespaceId] === _namespaces.NamespaceIds.xhtml.id) {\n      this[_xfa_object.$content] = child;\n      return true;\n    }\n\n    (0, _util.warn)(`XFA - Invalid content in Text: ${child[_xfa_object.$nodeName]}.`);\n    return false;\n  }\n\n  [_xfa_object.$toHTML]() {\n    if (typeof this[_xfa_object.$content] === \"string\") {\n      return this[_xfa_object.$content];\n    }\n\n    return this[_xfa_object.$content][_xfa_object.$toHTML]();\n  }\n\n}\n\nexports.Text = Text;\n\nclass TextEdit extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"textEdit\", true);\n    this.allowRichText = (0, _utils.getInteger)({\n      data: attributes.allowRichText,\n      defaultValue: 0,\n      validate: x => x === 1\n    });\n    this.hScrollPolicy = (0, _utils.getStringOption)(attributes.hScrollPolicy, [\"auto\", \"off\", \"on\"]);\n    this.id = attributes.id || \"\";\n    this.multiLine = (0, _utils.getInteger)({\n      data: attributes.multiLine,\n      defaultValue: 1,\n      validate: x => x === 0\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.vScrollPolicy = (0, _utils.getStringOption)(attributes.vScrollPolicy, [\"auto\", \"off\", \"on\"]);\n    this.border = null;\n    this.comb = null;\n    this.extras = null;\n    this.margin = null;\n  }\n\n  [_xfa_object.$toHTML]() {\n    const style = (0, _html_utils.toStyle)(this, \"border\", \"font\", \"margin\");\n    let html;\n\n    if (this.multiline === 1) {\n      html = {\n        name: \"textarea\",\n        attributes: {\n          style\n        }\n      };\n    } else {\n      html = {\n        name: \"input\",\n        attributes: {\n          type: \"text\",\n          class: \"xfaTextfield\",\n          style\n        }\n      };\n    }\n\n    return {\n      name: \"label\",\n      attributes: {\n        class: \"xfaLabel\"\n      },\n      children: [html]\n    };\n  }\n\n}\n\nclass Time extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"time\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [_xfa_object.$finalize]() {\n    this[_xfa_object.$content] = new Date(this[_xfa_object.$content]);\n  }\n\n  [_xfa_object.$toHTML]() {\n    return this[_xfa_object.$content].toString();\n  }\n\n}\n\nclass TimeStamp extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"timeStamp\");\n    this.id = attributes.id || \"\";\n    this.server = attributes.server || \"\";\n    this.type = (0, _utils.getStringOption)(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass ToolTip extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"toolTip\");\n    this.id = attributes.id || \"\";\n    this.rid = attributes.rid || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass Traversal extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"traversal\", true);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.traverse = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Traverse extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"traverse\", true);\n    this.id = attributes.id || \"\";\n    this.operation = (0, _utils.getStringOption)(attributes.operation, [\"next\", \"back\", \"down\", \"first\", \"left\", \"right\", \"up\"]);\n    this.ref = attributes.ref || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.script = null;\n  }\n\n  get name() {\n    return this.operation;\n  }\n\n  [_xfa_object.$isTransparent]() {\n    return false;\n  }\n\n}\n\nclass Ui extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"ui\", true);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.picture = null;\n    this.barcode = null;\n    this.button = null;\n    this.checkButton = null;\n    this.choiceList = null;\n    this.dateTimeEdit = null;\n    this.defaultUi = null;\n    this.imageEdit = null;\n    this.numericEdit = null;\n    this.passwordEdit = null;\n    this.signature = null;\n    this.textEdit = null;\n  }\n\n  [_xfa_object.$toHTML]() {\n    for (const name of Object.getOwnPropertyNames(this)) {\n      if (name === \"extras\" || name === \"picture\") {\n        continue;\n      }\n\n      const obj = this[name];\n\n      if (!(obj instanceof _xfa_object.XFAObject)) {\n        continue;\n      }\n\n      return obj[_xfa_object.$toHTML]();\n    }\n\n    return null;\n  }\n\n}\n\nclass Validate extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"validate\", true);\n    this.formatTest = (0, _utils.getStringOption)(attributes.formatTest, [\"warning\", \"disabled\", \"error\"]);\n    this.id = attributes.id || \"\";\n    this.nullTest = (0, _utils.getStringOption)(attributes.nullTest, [\"disabled\", \"error\", \"warning\"]);\n    this.scriptTest = (0, _utils.getStringOption)(attributes.scriptTest, [\"error\", \"disabled\", \"warning\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.message = null;\n    this.picture = null;\n    this.script = null;\n  }\n\n}\n\nclass Value extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"value\", true);\n    this.id = attributes.id || \"\";\n    this.override = (0, _utils.getInteger)({\n      data: attributes.override,\n      defaultValue: 0,\n      validate: x => x === 1\n    });\n    this.relevant = (0, _utils.getRelevant)(attributes.relevant);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.arc = null;\n    this.boolean = null;\n    this.date = null;\n    this.dateTime = null;\n    this.decimal = null;\n    this.exData = null;\n    this.float = null;\n    this.image = null;\n    this.integer = null;\n    this.line = null;\n    this.rectangle = null;\n    this.text = null;\n    this.time = null;\n  }\n\n  [_xfa_object.$setValue](value) {\n    const valueName = value[_xfa_object.$nodeName];\n\n    if (this[valueName] !== null) {\n      this[valueName][_xfa_object.$content] = value[_xfa_object.$content];\n      return;\n    }\n\n    for (const name of Object.getOwnPropertyNames(this)) {\n      const obj = this[name];\n\n      if (obj instanceof _xfa_object.XFAObject) {\n        this[name] = null;\n\n        this[_xfa_object.$removeChild](obj);\n      }\n    }\n\n    this[value[_xfa_object.$nodeName]] = value;\n\n    this[_xfa_object.$appendChild](value);\n  }\n\n  [_xfa_object.$toHTML]() {\n    for (const name of Object.getOwnPropertyNames(this)) {\n      const obj = this[name];\n\n      if (!(obj instanceof _xfa_object.XFAObject)) {\n        continue;\n      }\n\n      return obj[_xfa_object.$toHTML]();\n    }\n\n    return null;\n  }\n\n}\n\nexports.Value = Value;\n\nclass Variables extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"variables\", true);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.boolean = new _xfa_object.XFAObjectArray();\n    this.date = new _xfa_object.XFAObjectArray();\n    this.dateTime = new _xfa_object.XFAObjectArray();\n    this.decimal = new _xfa_object.XFAObjectArray();\n    this.exData = new _xfa_object.XFAObjectArray();\n    this.float = new _xfa_object.XFAObjectArray();\n    this.image = new _xfa_object.XFAObjectArray();\n    this.integer = new _xfa_object.XFAObjectArray();\n    this.manifest = new _xfa_object.XFAObjectArray();\n    this.script = new _xfa_object.XFAObjectArray();\n    this.text = new _xfa_object.XFAObjectArray();\n    this.time = new _xfa_object.XFAObjectArray();\n  }\n\n  [_xfa_object.$isTransparent]() {\n    return true;\n  }\n\n}\n\nclass TemplateNamespace {\n  static [_namespaces.$buildXFAObject](name, attributes) {\n    if (TemplateNamespace.hasOwnProperty(name)) {\n      const node = TemplateNamespace[name](attributes);\n\n      node[_xfa_object.$setSetAttributes](attributes);\n\n      return node;\n    }\n\n    return undefined;\n  }\n\n  static appearanceFilter(attrs) {\n    return new AppearanceFilter(attrs);\n  }\n\n  static arc(attrs) {\n    return new Arc(attrs);\n  }\n\n  static area(attrs) {\n    return new Area(attrs);\n  }\n\n  static assist(attrs) {\n    return new Assist(attrs);\n  }\n\n  static barcode(attrs) {\n    return new Barcode(attrs);\n  }\n\n  static bind(attrs) {\n    return new Bind(attrs);\n  }\n\n  static bindItems(attrs) {\n    return new BindItems(attrs);\n  }\n\n  static bookend(attrs) {\n    return new Bookend(attrs);\n  }\n\n  static boolean(attrs) {\n    return new BooleanElement(attrs);\n  }\n\n  static border(attrs) {\n    return new Border(attrs);\n  }\n\n  static break(attrs) {\n    return new Break(attrs);\n  }\n\n  static breakAfter(attrs) {\n    return new BreakAfter(attrs);\n  }\n\n  static breakBefore(attrs) {\n    return new BreakBefore(attrs);\n  }\n\n  static button(attrs) {\n    return new Button(attrs);\n  }\n\n  static calculate(attrs) {\n    return new Calculate(attrs);\n  }\n\n  static caption(attrs) {\n    return new Caption(attrs);\n  }\n\n  static certificate(attrs) {\n    return new Certificate(attrs);\n  }\n\n  static certificates(attrs) {\n    return new Certificates(attrs);\n  }\n\n  static checkButton(attrs) {\n    return new CheckButton(attrs);\n  }\n\n  static choiceList(attrs) {\n    return new ChoiceList(attrs);\n  }\n\n  static color(attrs) {\n    return new Color(attrs);\n  }\n\n  static comb(attrs) {\n    return new Comb(attrs);\n  }\n\n  static connect(attrs) {\n    return new Connect(attrs);\n  }\n\n  static contentArea(attrs) {\n    return new ContentArea(attrs);\n  }\n\n  static corner(attrs) {\n    return new Corner(attrs);\n  }\n\n  static date(attrs) {\n    return new DateElement(attrs);\n  }\n\n  static dateTime(attrs) {\n    return new DateTime(attrs);\n  }\n\n  static dateTimeEdit(attrs) {\n    return new DateTimeEdit(attrs);\n  }\n\n  static decimal(attrs) {\n    return new Decimal(attrs);\n  }\n\n  static defaultUi(attrs) {\n    return new DefaultUi(attrs);\n  }\n\n  static desc(attrs) {\n    return new Desc(attrs);\n  }\n\n  static digestMethod(attrs) {\n    return new DigestMethod(attrs);\n  }\n\n  static digestMethods(attrs) {\n    return new DigestMethods(attrs);\n  }\n\n  static draw(attrs) {\n    return new Draw(attrs);\n  }\n\n  static edge(attrs) {\n    return new Edge(attrs);\n  }\n\n  static encoding(attrs) {\n    return new Encoding(attrs);\n  }\n\n  static encodings(attrs) {\n    return new Encodings(attrs);\n  }\n\n  static encrypt(attrs) {\n    return new Encrypt(attrs);\n  }\n\n  static encryptData(attrs) {\n    return new EncryptData(attrs);\n  }\n\n  static encryption(attrs) {\n    return new Encryption(attrs);\n  }\n\n  static encryptionMethod(attrs) {\n    return new EncryptionMethod(attrs);\n  }\n\n  static encryptionMethods(attrs) {\n    return new EncryptionMethods(attrs);\n  }\n\n  static event(attrs) {\n    return new Event(attrs);\n  }\n\n  static exData(attrs) {\n    return new ExData(attrs);\n  }\n\n  static exObject(attrs) {\n    return new ExObject(attrs);\n  }\n\n  static exclGroup(attrs) {\n    return new ExclGroup(attrs);\n  }\n\n  static execute(attrs) {\n    return new Execute(attrs);\n  }\n\n  static extras(attrs) {\n    return new Extras(attrs);\n  }\n\n  static field(attrs) {\n    return new Field(attrs);\n  }\n\n  static fill(attrs) {\n    return new Fill(attrs);\n  }\n\n  static filter(attrs) {\n    return new Filter(attrs);\n  }\n\n  static float(attrs) {\n    return new Float(attrs);\n  }\n\n  static font(attrs) {\n    return new Font(attrs);\n  }\n\n  static format(attrs) {\n    return new Format(attrs);\n  }\n\n  static handler(attrs) {\n    return new Handler(attrs);\n  }\n\n  static hyphenation(attrs) {\n    return new Hyphenation(attrs);\n  }\n\n  static image(attrs) {\n    return new Image(attrs);\n  }\n\n  static imageEdit(attrs) {\n    return new ImageEdit(attrs);\n  }\n\n  static integer(attrs) {\n    return new Integer(attrs);\n  }\n\n  static issuers(attrs) {\n    return new Issuers(attrs);\n  }\n\n  static items(attrs) {\n    return new Items(attrs);\n  }\n\n  static keep(attrs) {\n    return new Keep(attrs);\n  }\n\n  static keyUsage(attrs) {\n    return new KeyUsage(attrs);\n  }\n\n  static line(attrs) {\n    return new Line(attrs);\n  }\n\n  static linear(attrs) {\n    return new Linear(attrs);\n  }\n\n  static lockDocument(attrs) {\n    return new LockDocument(attrs);\n  }\n\n  static manifest(attrs) {\n    return new Manifest(attrs);\n  }\n\n  static margin(attrs) {\n    return new Margin(attrs);\n  }\n\n  static mdp(attrs) {\n    return new Mdp(attrs);\n  }\n\n  static medium(attrs) {\n    return new Medium(attrs);\n  }\n\n  static message(attrs) {\n    return new Message(attrs);\n  }\n\n  static numericEdit(attrs) {\n    return new NumericEdit(attrs);\n  }\n\n  static occur(attrs) {\n    return new Occur(attrs);\n  }\n\n  static oid(attrs) {\n    return new Oid(attrs);\n  }\n\n  static oids(attrs) {\n    return new Oids(attrs);\n  }\n\n  static overflow(attrs) {\n    return new Overflow(attrs);\n  }\n\n  static pageArea(attrs) {\n    return new PageArea(attrs);\n  }\n\n  static pageSet(attrs) {\n    return new PageSet(attrs);\n  }\n\n  static para(attrs) {\n    return new Para(attrs);\n  }\n\n  static passwordEdit(attrs) {\n    return new PasswordEdit(attrs);\n  }\n\n  static pattern(attrs) {\n    return new Pattern(attrs);\n  }\n\n  static picture(attrs) {\n    return new Picture(attrs);\n  }\n\n  static proto(attrs) {\n    return new Proto(attrs);\n  }\n\n  static radial(attrs) {\n    return new Radial(attrs);\n  }\n\n  static reason(attrs) {\n    return new Reason(attrs);\n  }\n\n  static reasons(attrs) {\n    return new Reasons(attrs);\n  }\n\n  static rectangle(attrs) {\n    return new Rectangle(attrs);\n  }\n\n  static ref(attrs) {\n    return new RefElement(attrs);\n  }\n\n  static script(attrs) {\n    return new Script(attrs);\n  }\n\n  static setProperty(attrs) {\n    return new SetProperty(attrs);\n  }\n\n  static signData(attrs) {\n    return new SignData(attrs);\n  }\n\n  static signature(attrs) {\n    return new Signature(attrs);\n  }\n\n  static signing(attrs) {\n    return new Signing(attrs);\n  }\n\n  static solid(attrs) {\n    return new Solid(attrs);\n  }\n\n  static speak(attrs) {\n    return new Speak(attrs);\n  }\n\n  static stipple(attrs) {\n    return new Stipple(attrs);\n  }\n\n  static subform(attrs) {\n    return new Subform(attrs);\n  }\n\n  static subformSet(attrs) {\n    return new SubformSet(attrs);\n  }\n\n  static subjectDN(attrs) {\n    return new SubjectDN(attrs);\n  }\n\n  static subjectDNs(attrs) {\n    return new SubjectDNs(attrs);\n  }\n\n  static submit(attrs) {\n    return new Submit(attrs);\n  }\n\n  static template(attrs) {\n    return new Template(attrs);\n  }\n\n  static text(attrs) {\n    return new Text(attrs);\n  }\n\n  static textEdit(attrs) {\n    return new TextEdit(attrs);\n  }\n\n  static time(attrs) {\n    return new Time(attrs);\n  }\n\n  static timeStamp(attrs) {\n    return new TimeStamp(attrs);\n  }\n\n  static toolTip(attrs) {\n    return new ToolTip(attrs);\n  }\n\n  static traversal(attrs) {\n    return new Traversal(attrs);\n  }\n\n  static traverse(attrs) {\n    return new Traverse(attrs);\n  }\n\n  static ui(attrs) {\n    return new Ui(attrs);\n  }\n\n  static validate(attrs) {\n    return new Validate(attrs);\n  }\n\n  static value(attrs) {\n    return new Value(attrs);\n  }\n\n  static variables(attrs) {\n    return new Variables(attrs);\n  }\n\n}\n\nexports.TemplateNamespace = TemplateNamespace;\n\n/***/ }),\n/* 55 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.layoutClass = layoutClass;\nexports.measureToString = measureToString;\nexports.toStyle = toStyle;\n\nvar _xfa_object = __w_pdfjs_require__(50);\n\nvar _util = __w_pdfjs_require__(2);\n\nfunction measureToString(m) {\n  if (typeof m === \"string\") {\n    return \"0px\";\n  }\n\n  return Number.isInteger(m) ? `${m}px` : `${m.toFixed(2)}px`;\n}\n\nconst converters = {\n  anchorType(node, style) {\n    if (!(\"transform\" in style)) {\n      style.transform = \"\";\n    }\n\n    switch (node.anchorType) {\n      case \"bottomCenter\":\n        style.transform += \"translate(-50%, -100%)\";\n        break;\n\n      case \"bottomLeft\":\n        style.transform += \"translate(0,-100%)\";\n        break;\n\n      case \"bottomRight\":\n        style.transform += \"translate(-100%,-100%)\";\n        break;\n\n      case \"middleCenter\":\n        style.transform += \"translate(-50%,-50%)\";\n        break;\n\n      case \"middleLeft\":\n        style.transform += \"translate(0,-50%)\";\n        break;\n\n      case \"middleRight\":\n        style.transform += \"translate(-100%,-50%)\";\n        break;\n\n      case \"topCenter\":\n        style.transform += \"translate(-50%,0)\";\n        break;\n\n      case \"topRight\":\n        style.transform += \"translate(-100%,0)\";\n        break;\n    }\n  },\n\n  dimensions(node, style) {\n    if (node.w) {\n      style.width = measureToString(node.w);\n    } else {\n      style.width = \"auto\";\n\n      if (node.maxW > 0) {\n        style.maxWidth = measureToString(node.maxW);\n      }\n\n      style.minWidth = measureToString(node.minW);\n    }\n\n    if (node.h) {\n      style.height = measureToString(node.h);\n    } else {\n      style.height = \"auto\";\n\n      if (node.maxH > 0) {\n        style.maxHeight = measureToString(node.maxH);\n      }\n\n      style.minHeight = measureToString(node.minH);\n    }\n  },\n\n  position(node, style) {\n    const parent = node[_xfa_object.$getParent]();\n\n    if (parent && parent.layout && parent.layout !== \"position\") {\n      return;\n    }\n\n    style.position = \"absolute\";\n    style.left = measureToString(node.x);\n    style.top = measureToString(node.y);\n  },\n\n  rotate(node, style) {\n    if (node.rotate) {\n      if (!(\"transform\" in style)) {\n        style.transform = \"\";\n      }\n\n      style.transform += `rotate(-${node.rotate}deg)`;\n      style.transformOrigin = \"top left\";\n    }\n  },\n\n  presence(node, style) {\n    switch (node.presence) {\n      case \"invisible\":\n        style.visibility = \"hidden\";\n        break;\n\n      case \"hidden\":\n      case \"inactive\":\n        style.display = \"none\";\n        break;\n    }\n  }\n\n};\n\nfunction layoutClass(node) {\n  switch (node.layout) {\n    case \"position\":\n      return \"xfaPosition\";\n\n    case \"lr-tb\":\n      return \"xfaLrTb\";\n\n    case \"rl-row\":\n      return \"xfaRlRow\";\n\n    case \"rl-tb\":\n      return \"xfaRlTb\";\n\n    case \"row\":\n      return \"xfaRow\";\n\n    case \"table\":\n      return \"xfaTable\";\n\n    case \"tb\":\n      return \"xfaTb\";\n\n    default:\n      return \"xfaPosition\";\n  }\n}\n\nfunction toStyle(node, ...names) {\n  const style = Object.create(null);\n\n  for (const name of names) {\n    const value = node[name];\n\n    if (value === null) {\n      continue;\n    }\n\n    if (value instanceof _xfa_object.XFAObject) {\n      const newStyle = value[_xfa_object.$toStyle]();\n\n      if (newStyle) {\n        Object.assign(style, newStyle);\n      } else {\n        (0, _util.warn)(`(DEBUG) - XFA - style for ${name} not implemented yet`);\n      }\n\n      continue;\n    }\n\n    if (converters.hasOwnProperty(name)) {\n      converters[name](node, style);\n    }\n  }\n\n  return style;\n}\n\n/***/ }),\n/* 56 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.createDataNode = createDataNode;\nexports.searchNode = searchNode;\n\nvar _xfa_object = __w_pdfjs_require__(50);\n\nvar _util = __w_pdfjs_require__(2);\n\nconst namePattern = /^[^.[]+/;\nconst indexPattern = /^[^\\]]+/;\nconst operators = {\n  dot: 0,\n  dotDot: 1,\n  dotHash: 2,\n  dotBracket: 3,\n  dotParen: 4\n};\nconst shortcuts = new Map([[\"$data\", (root, current) => root.datasets.data], [\"$template\", (root, current) => root.template], [\"$connectionSet\", (root, current) => root.connectionSet], [\"$form\", (root, current) => root.form], [\"$layout\", (root, current) => root.layout], [\"$host\", (root, current) => root.host], [\"$dataWindow\", (root, current) => root.dataWindow], [\"$event\", (root, current) => root.event], [\"!\", (root, current) => root.datasets], [\"$xfa\", (root, current) => root], [\"xfa\", (root, current) => root], [\"$\", (root, current) => current]]);\nconst somCache = new WeakMap();\n\nfunction parseIndex(index) {\n  index = index.trim();\n\n  if (index === \"*\") {\n    return Infinity;\n  }\n\n  return parseInt(index, 10) || 0;\n}\n\nfunction parseExpression(expr, dotDotAllowed) {\n  let match = expr.match(namePattern);\n\n  if (!match) {\n    return null;\n  }\n\n  let [name] = match;\n  const parsed = [{\n    name,\n    cacheName: \".\" + name,\n    index: 0,\n    js: null,\n    formCalc: null,\n    operator: operators.dot\n  }];\n  let pos = name.length;\n\n  while (pos < expr.length) {\n    const spos = pos;\n    const char = expr.charAt(pos++);\n\n    if (char === \"[\") {\n      match = expr.slice(pos).match(indexPattern);\n\n      if (!match) {\n        (0, _util.warn)(\"XFA - Invalid index in SOM expression\");\n        return null;\n      }\n\n      parsed[parsed.length - 1].index = parseIndex(match[0]);\n      pos += match[0].length + 1;\n      continue;\n    }\n\n    let operator;\n\n    switch (expr.charAt(pos)) {\n      case \".\":\n        if (!dotDotAllowed) {\n          return null;\n        }\n\n        pos++;\n        operator = operators.dotDot;\n        break;\n\n      case \"#\":\n        pos++;\n        operator = operators.dotHash;\n        break;\n\n      case \"[\":\n        operator = operators.dotBracket;\n        break;\n\n      case \"(\":\n        operator = operators.dotParen;\n        break;\n\n      default:\n        operator = operators.dot;\n        break;\n    }\n\n    match = expr.slice(pos).match(namePattern);\n\n    if (!match) {\n      break;\n    }\n\n    [name] = match;\n    pos += name.length;\n    parsed.push({\n      name,\n      cacheName: expr.slice(spos, pos),\n      operator,\n      index: 0,\n      js: null,\n      formCalc: null\n    });\n  }\n\n  return parsed;\n}\n\nfunction searchNode(root, container, expr, dotDotAllowed = true, useCache = true) {\n  const parsed = parseExpression(expr, dotDotAllowed);\n\n  if (!parsed) {\n    return null;\n  }\n\n  const fn = shortcuts.get(parsed[0].name);\n  let i = 0;\n  let isQualified;\n\n  if (fn) {\n    isQualified = true;\n    root = [fn(root, container)];\n    i = 1;\n  } else {\n    isQualified = container === null;\n    root = [container || root];\n  }\n\n  for (let ii = parsed.length; i < ii; i++) {\n    const {\n      name,\n      cacheName,\n      operator,\n      index\n    } = parsed[i];\n    const nodes = [];\n\n    for (const node of root) {\n      if (!(node instanceof _xfa_object.XFAObject)) {\n        continue;\n      }\n\n      let children, cached;\n\n      if (useCache) {\n        cached = somCache.get(node);\n\n        if (!cached) {\n          cached = new Map();\n          somCache.set(node, cached);\n        }\n\n        children = cached.get(cacheName);\n      }\n\n      if (!children) {\n        switch (operator) {\n          case operators.dot:\n            children = node[_xfa_object.$getChildrenByName](name, false);\n            break;\n\n          case operators.dotDot:\n            children = node[_xfa_object.$getChildrenByName](name, true);\n            break;\n\n          case operators.dotHash:\n            children = node[_xfa_object.$getChildrenByClass](name);\n\n            if (children instanceof _xfa_object.XFAObjectArray) {\n              children = children.children;\n            } else {\n              children = [children];\n            }\n\n            break;\n\n          default:\n            break;\n        }\n\n        if (useCache) {\n          cached.set(cacheName, children);\n        }\n      }\n\n      if (children.length > 0) {\n        nodes.push(children);\n      }\n    }\n\n    if (nodes.length === 0 && !isQualified && i === 0) {\n      const parent = container[_xfa_object.$getParent]();\n\n      container = parent;\n\n      if (!container) {\n        return null;\n      }\n\n      i = -1;\n      root = [container];\n      continue;\n    }\n\n    if (isFinite(index)) {\n      root = nodes.filter(node => index < node.length).map(node => node[index]);\n    } else {\n      root = nodes.reduce((acc, node) => acc.concat(node), []);\n    }\n  }\n\n  if (root.length === 0) {\n    return null;\n  }\n\n  return root;\n}\n\nfunction createNodes(root, path) {\n  let node = null;\n\n  for (const {\n    name,\n    index\n  } of path) {\n    for (let i = 0; i <= index; i++) {\n      node = new _xfa_object.XmlObject(root[_xfa_object.$namespaceId], name);\n\n      root[_xfa_object.$appendChild](node);\n    }\n\n    root = node;\n  }\n\n  return node;\n}\n\nfunction createDataNode(root, container, expr) {\n  const parsed = parseExpression(expr);\n\n  if (!parsed) {\n    return null;\n  }\n\n  if (parsed.some(x => x.operator === operators.dotDot)) {\n    return null;\n  }\n\n  const fn = shortcuts.get(parsed[0].name);\n  let i = 0;\n\n  if (fn) {\n    root = fn(root, container);\n    i = 1;\n  } else {\n    root = container || root;\n  }\n\n  for (let ii = parsed.length; i < ii; i++) {\n    const {\n      cacheName,\n      index\n    } = parsed[i];\n\n    if (!isFinite(index)) {\n      parsed[i].index = 0;\n      return createNodes(root, parsed.slice(i));\n    }\n\n    const cached = somCache.get(root);\n\n    if (!cached) {\n      (0, _util.warn)(`XFA - createDataNode must be called after searchNode.`);\n      return null;\n    }\n\n    const children = cached.get(cacheName);\n\n    if (children.length === 0) {\n      return createNodes(root, parsed.slice(i));\n    }\n\n    if (index < children.length) {\n      const child = children[index];\n\n      if (!(child instanceof _xfa_object.XFAObject)) {\n        (0, _util.warn)(`XFA - Cannot create a node.`);\n        return null;\n      }\n\n      root = child;\n    } else {\n      parsed[i].index = children.length - index;\n      return createNodes(root, parsed.slice(i));\n    }\n  }\n\n  return null;\n}\n\n/***/ }),\n/* 57 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.XFAParser = void 0;\n\nvar _xfa_object = __w_pdfjs_require__(50);\n\nvar _xml_parser = __w_pdfjs_require__(26);\n\nvar _builder = __w_pdfjs_require__(58);\n\nvar _util = __w_pdfjs_require__(2);\n\nclass XFAParser extends _xml_parser.XMLParserBase {\n  constructor() {\n    super();\n    this._builder = new _builder.Builder();\n    this._stack = [];\n    this._ids = new Map();\n    this._current = this._builder.buildRoot(this._ids);\n    this._errorCode = _xml_parser.XMLParserErrorCode.NoError;\n    this._whiteRegex = /^\\s+$/;\n  }\n\n  parse(data) {\n    this.parseXml(data);\n\n    if (this._errorCode !== _xml_parser.XMLParserErrorCode.NoError) {\n      return undefined;\n    }\n\n    this._current[_xfa_object.$finalize]();\n\n    return this._current.element;\n  }\n\n  onText(text) {\n    if (this._whiteRegex.test(text)) {\n      return;\n    }\n\n    this._current[_xfa_object.$onText](text.trim());\n  }\n\n  onCdata(text) {\n    this._current[_xfa_object.$onText](text);\n  }\n\n  _mkAttributes(attributes, tagName) {\n    let namespace = null;\n    let prefixes = null;\n    const attributeObj = Object.create({});\n\n    for (const {\n      name,\n      value\n    } of attributes) {\n      if (name === \"xmlns\") {\n        if (!namespace) {\n          namespace = value;\n        } else {\n          (0, _util.warn)(`XFA - multiple namespace definition in <${tagName}>`);\n        }\n      } else if (name.startsWith(\"xmlns:\")) {\n        const prefix = name.substring(\"xmlns:\".length);\n\n        if (!prefixes) {\n          prefixes = [];\n        }\n\n        prefixes.push({\n          prefix,\n          value\n        });\n      } else {\n        const i = name.indexOf(\":\");\n\n        if (i === -1) {\n          attributeObj[name] = value;\n        } else {\n          let nsAttrs = attributeObj[_xfa_object.$nsAttributes];\n\n          if (!nsAttrs) {\n            nsAttrs = attributeObj[_xfa_object.$nsAttributes] = Object.create(null);\n          }\n\n          const [ns, attrName] = [name.slice(0, i), name.slice(i + 1)];\n          let attrs = nsAttrs[ns];\n\n          if (!attrs) {\n            attrs = nsAttrs[ns] = Object.create(null);\n          }\n\n          attrs[attrName] = value;\n        }\n      }\n    }\n\n    return [namespace, prefixes, attributeObj];\n  }\n\n  _getNameAndPrefix(name) {\n    const i = name.indexOf(\":\");\n\n    if (i === -1) {\n      return [name, null];\n    }\n\n    return [name.substring(i + 1), name.substring(0, i)];\n  }\n\n  onBeginElement(tagName, attributes, isEmpty) {\n    const [namespace, prefixes, attributesObj] = this._mkAttributes(attributes, tagName);\n\n    const [name, nsPrefix] = this._getNameAndPrefix(tagName);\n\n    const node = this._builder.build({\n      nsPrefix,\n      name,\n      attributes: attributesObj,\n      namespace,\n      prefixes\n    });\n\n    if (isEmpty) {\n      node[_xfa_object.$finalize]();\n\n      if (this._current[_xfa_object.$onChild](node)) {\n        node[_xfa_object.$setId](this._ids);\n      }\n\n      node[_xfa_object.$clean](this._builder);\n\n      return;\n    }\n\n    this._stack.push(this._current);\n\n    this._current = node;\n  }\n\n  onEndElement(name) {\n    const node = this._current;\n\n    node[_xfa_object.$finalize]();\n\n    this._current = this._stack.pop();\n\n    if (this._current[_xfa_object.$onChild](node)) {\n      node[_xfa_object.$setId](this._ids);\n    }\n\n    node[_xfa_object.$clean](this._builder);\n  }\n\n  onError(code) {\n    this._errorCode = code;\n  }\n\n}\n\nexports.XFAParser = XFAParser;\n\n/***/ }),\n/* 58 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.Builder = void 0;\n\nvar _namespaces = __w_pdfjs_require__(52);\n\nvar _xfa_object = __w_pdfjs_require__(50);\n\nvar _setup = __w_pdfjs_require__(59);\n\nvar _template = __w_pdfjs_require__(54);\n\nvar _unknown = __w_pdfjs_require__(68);\n\nvar _util = __w_pdfjs_require__(2);\n\nconst _ids = Symbol();\n\nclass Root extends _xfa_object.XFAObject {\n  constructor(ids) {\n    super(-1, \"root\", Object.create(null));\n    this.element = null;\n    this[_ids] = ids;\n  }\n\n  [_xfa_object.$onChild](child) {\n    this.element = child;\n    return true;\n  }\n\n  [_xfa_object.$finalize]() {\n    super[_xfa_object.$finalize]();\n\n    if (this.element.template instanceof _template.Template) {\n      this.element.template[_xfa_object.$resolvePrototypes](this[_ids]);\n    }\n  }\n\n}\n\nclass Empty extends _xfa_object.XFAObject {\n  constructor() {\n    super(-1, \"\", Object.create(null));\n  }\n\n  [_xfa_object.$onChild](_) {\n    return false;\n  }\n\n}\n\nclass Builder {\n  constructor() {\n    this._namespaceStack = [];\n    this._namespacePrefixes = new Map();\n    this._namespaces = new Map();\n    this._nextNsId = Math.max(...Object.values(_namespaces.NamespaceIds).map(({\n      id\n    }) => id));\n    this._currentNamespace = new _unknown.UnknownNamespace(++this._nextNsId);\n  }\n\n  buildRoot(ids) {\n    return new Root(ids);\n  }\n\n  build({\n    nsPrefix,\n    name,\n    attributes,\n    namespace,\n    prefixes\n  }) {\n    const hasNamespaceDef = namespace !== null;\n\n    if (hasNamespaceDef) {\n      this._namespaceStack.push(this._currentNamespace);\n\n      this._currentNamespace = this._searchNamespace(namespace);\n    }\n\n    if (prefixes) {\n      this._addNamespacePrefix(prefixes);\n    }\n\n    if (attributes.hasOwnProperty(_xfa_object.$nsAttributes)) {\n      const dataTemplate = _setup.NamespaceSetUp.datasets;\n      const nsAttrs = attributes[_xfa_object.$nsAttributes];\n      let xfaAttrs = null;\n\n      for (const [ns, attrs] of Object.entries(nsAttrs)) {\n        const nsToUse = this._getNamespaceToUse(ns);\n\n        if (nsToUse === dataTemplate) {\n          xfaAttrs = {\n            xfa: attrs\n          };\n          break;\n        }\n      }\n\n      if (xfaAttrs) {\n        attributes[_xfa_object.$nsAttributes] = xfaAttrs;\n      } else {\n        delete attributes[_xfa_object.$nsAttributes];\n      }\n    }\n\n    const namespaceToUse = this._getNamespaceToUse(nsPrefix);\n\n    const node = namespaceToUse && namespaceToUse[_namespaces.$buildXFAObject](name, attributes) || new Empty();\n\n    if (hasNamespaceDef || prefixes) {\n      node[_xfa_object.$cleanup] = {\n        hasNamespace: hasNamespaceDef,\n        prefixes\n      };\n    }\n\n    return node;\n  }\n\n  _searchNamespace(nsName) {\n    let ns = this._namespaces.get(nsName);\n\n    if (ns) {\n      return ns;\n    }\n\n    for (const [name, {\n      check\n    }] of Object.entries(_namespaces.NamespaceIds)) {\n      if (check(nsName)) {\n        ns = _setup.NamespaceSetUp[name];\n\n        if (ns) {\n          this._namespaces.set(nsName, ns);\n\n          return ns;\n        }\n\n        break;\n      }\n    }\n\n    ns = new _unknown.UnknownNamespace(++this._nextNsId);\n\n    this._namespaces.set(nsName, ns);\n\n    return ns;\n  }\n\n  _addNamespacePrefix(prefixes) {\n    for (const {\n      prefix,\n      value\n    } of prefixes) {\n      const namespace = this._searchNamespace(value);\n\n      let prefixStack = this._namespacePrefixes.get(prefix);\n\n      if (!prefixStack) {\n        prefixStack = [];\n\n        this._namespacePrefixes.set(prefix, prefixStack);\n      }\n\n      prefixStack.push(namespace);\n    }\n  }\n\n  _getNamespaceToUse(prefix) {\n    if (!prefix) {\n      return this._currentNamespace;\n    }\n\n    const prefixStack = this._namespacePrefixes.get(prefix);\n\n    if (prefixStack && prefixStack.length > 0) {\n      return prefixStack[prefixStack.length - 1];\n    }\n\n    (0, _util.warn)(`Unknown namespace prefix: ${prefix}.`);\n    return null;\n  }\n\n  clean(data) {\n    const {\n      hasNamespace,\n      prefixes\n    } = data;\n\n    if (hasNamespace) {\n      this._currentNamespace = this._namespaceStack.pop();\n    }\n\n    if (prefixes) {\n      prefixes.forEach(({\n        prefix\n      }) => {\n        this._namespacePrefixes.get(prefix).pop();\n      });\n    }\n  }\n\n}\n\nexports.Builder = Builder;\n\n/***/ }),\n/* 59 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.NamespaceSetUp = void 0;\n\nvar _config = __w_pdfjs_require__(60);\n\nvar _connection_set = __w_pdfjs_require__(61);\n\nvar _datasets = __w_pdfjs_require__(62);\n\nvar _locale_set = __w_pdfjs_require__(63);\n\nvar _signature = __w_pdfjs_require__(64);\n\nvar _stylesheet = __w_pdfjs_require__(65);\n\nvar _template = __w_pdfjs_require__(54);\n\nvar _xdp = __w_pdfjs_require__(66);\n\nvar _xhtml = __w_pdfjs_require__(67);\n\nconst NamespaceSetUp = {\n  config: _config.ConfigNamespace,\n  connection: _connection_set.ConnectionSetNamespace,\n  datasets: _datasets.DatasetsNamespace,\n  localeSet: _locale_set.LocaleSetNamespace,\n  signature: _signature.SignatureNamespace,\n  stylesheet: _stylesheet.StylesheetNamespace,\n  template: _template.TemplateNamespace,\n  xdp: _xdp.XdpNamespace,\n  xhtml: _xhtml.XhtmlNamespace\n};\nexports.NamespaceSetUp = NamespaceSetUp;\n\n/***/ }),\n/* 60 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.ConfigNamespace = void 0;\n\nvar _namespaces = __w_pdfjs_require__(52);\n\nvar _xfa_object = __w_pdfjs_require__(50);\n\nvar _utils = __w_pdfjs_require__(51);\n\nvar _util = __w_pdfjs_require__(2);\n\nconst CONFIG_NS_ID = _namespaces.NamespaceIds.config.id;\n\nclass Acrobat extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"acrobat\", true);\n    this.acrobat7 = null;\n    this.autoSave = null;\n    this.common = null;\n    this.validate = null;\n    this.validateApprovalSignatures = null;\n    this.submitUrl = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Acrobat7 extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"acrobat7\", true);\n    this.dynamicRender = null;\n  }\n\n}\n\nclass ADBE_JSConsole extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"ADBE_JSConsole\", [\"delegate\", \"Enable\", \"Disable\"]);\n  }\n\n}\n\nclass ADBE_JSDebugger extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"ADBE_JSDebugger\", [\"delegate\", \"Enable\", \"Disable\"]);\n  }\n\n}\n\nclass AddSilentPrint extends _xfa_object.Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"addSilentPrint\");\n  }\n\n}\n\nclass AddViewerPreferences extends _xfa_object.Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"addViewerPreferences\");\n  }\n\n}\n\nclass AdjustData extends _xfa_object.Option10 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"adjustData\");\n  }\n\n}\n\nclass AdobeExtensionLevel extends _xfa_object.IntegerObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"adobeExtensionLevel\", 0, n => n >= 1 && n <= 8);\n  }\n\n}\n\nclass Agent extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"agent\", true);\n    this.name = attributes.name ? attributes.name.trim() : \"\";\n    this.common = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass AlwaysEmbed extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"alwaysEmbed\");\n  }\n\n}\n\nclass Amd extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"amd\");\n  }\n\n}\n\nclass Area extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"area\");\n    this.level = (0, _utils.getInteger)({\n      data: attributes.level,\n      defaultValue: 0,\n      validator: n => n >= 1 && n <= 3\n    });\n    this.name = (0, _utils.getStringOption)(attributes.name, [\"\", \"barcode\", \"coreinit\", \"deviceDriver\", \"font\", \"general\", \"layout\", \"merge\", \"script\", \"signature\", \"sourceSet\", \"templateCache\"]);\n  }\n\n}\n\nclass Attributes extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"attributes\", [\"preserve\", \"delegate\", \"ignore\"]);\n  }\n\n}\n\nclass AutoSave extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"autoSave\", [\"disabled\", \"enabled\"]);\n  }\n\n}\n\nclass Base extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"base\");\n  }\n\n}\n\nclass BatchOutput extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"batchOutput\");\n    this.format = (0, _utils.getStringOption)(attributes.format, [\"none\", \"concat\", \"zip\", \"zipCompress\"]);\n  }\n\n}\n\nclass BehaviorOverride extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"behaviorOverride\");\n  }\n\n  [_xfa_object.$finalize]() {\n    this[_xfa_object.$content] = new Map(this[_xfa_object.$content].trim().split(/\\s+/).filter(x => !!x && x.include(\":\")).map(x => x.split(\":\", 2)));\n  }\n\n}\n\nclass Cache extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"cache\", true);\n    this.templateCache = null;\n  }\n\n}\n\nclass Change extends _xfa_object.Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"change\");\n  }\n\n}\n\nclass Common extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"common\", true);\n    this.data = null;\n    this.locale = null;\n    this.localeSet = null;\n    this.messaging = null;\n    this.suppressBanner = null;\n    this.template = null;\n    this.validationMessaging = null;\n    this.versionControl = null;\n    this.log = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Compress extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"compress\");\n    this.scope = (0, _utils.getStringOption)(attributes.scope, [\"imageOnly\", \"document\"]);\n  }\n\n}\n\nclass CompressLogicalStructure extends _xfa_object.Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"compressLogicalStructure\");\n  }\n\n}\n\nclass CompressObjectStream extends _xfa_object.Option10 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"compressObjectStream\");\n  }\n\n}\n\nclass Compression extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"compression\", true);\n    this.compressLogicalStructure = null;\n    this.compressObjectStream = null;\n    this.level = null;\n    this.type = null;\n  }\n\n}\n\nclass Config extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"config\", true);\n    this.acrobat = null;\n    this.present = null;\n    this.trace = null;\n    this.agent = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Conformance extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"conformance\", [\"A\", \"B\"]);\n  }\n\n}\n\nclass ContentCopy extends _xfa_object.Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"contentCopy\");\n  }\n\n}\n\nclass Copies extends _xfa_object.IntegerObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"copies\", 1, n => n >= 1);\n  }\n\n}\n\nclass Creator extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"creator\");\n  }\n\n}\n\nclass CurrentPage extends _xfa_object.IntegerObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"currentPage\", 0, n => n >= 0);\n  }\n\n}\n\nclass Data extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"data\", true);\n    this.adjustData = null;\n    this.attributes = null;\n    this.incrementalLoad = null;\n    this.outputXSL = null;\n    this.range = null;\n    this.record = null;\n    this.startNode = null;\n    this.uri = null;\n    this.window = null;\n    this.xsl = null;\n    this.excludeNS = new _xfa_object.XFAObjectArray();\n    this.transform = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Debug extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"debug\", true);\n    this.uri = null;\n  }\n\n}\n\nclass DefaultTypeface extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"defaultTypeface\");\n    this.writingScript = (0, _utils.getStringOption)(attributes.writingScript, [\"*\", \"Arabic\", \"Cyrillic\", \"EastEuropeanRoman\", \"Greek\", \"Hebrew\", \"Japanese\", \"Korean\", \"Roman\", \"SimplifiedChinese\", \"Thai\", \"TraditionalChinese\", \"Vietnamese\"]);\n  }\n\n}\n\nclass Destination extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"destination\", [\"pdf\", \"pcl\", \"ps\", \"webClient\", \"zpl\"]);\n  }\n\n}\n\nclass DocumentAssembly extends _xfa_object.Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"documentAssembly\");\n  }\n\n}\n\nclass Driver extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"driver\", true);\n    this.name = attributes.name ? attributes.name.trim() : \"\";\n    this.fontInfo = null;\n    this.xdc = null;\n  }\n\n}\n\nclass DuplexOption extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"duplexOption\", [\"simplex\", \"duplexFlipLongEdge\", \"duplexFlipShortEdge\"]);\n  }\n\n}\n\nclass DynamicRender extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"dynamicRender\", [\"forbidden\", \"required\"]);\n  }\n\n}\n\nclass Embed extends _xfa_object.Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"embed\");\n  }\n\n}\n\nclass Encrypt extends _xfa_object.Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"encrypt\");\n  }\n\n}\n\nclass Encryption extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"encryption\", true);\n    this.encrypt = null;\n    this.encryptionLevel = null;\n    this.permissions = null;\n  }\n\n}\n\nclass EncryptionLevel extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"encryptionLevel\", [\"40bit\", \"128bit\"]);\n  }\n\n}\n\nclass Enforce extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"enforce\");\n  }\n\n}\n\nclass Equate extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"equate\");\n    this.force = (0, _utils.getInteger)({\n      data: attributes.force,\n      defaultValue: 1,\n      validator: n => n === 0\n    });\n    this.from = attributes.from || \"\";\n    this.to = attributes.to || \"\";\n  }\n\n}\n\nclass EquateRange extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"equateRange\");\n    this.from = attributes.from || \"\";\n    this.to = attributes.to || \"\";\n    this._unicodeRange = attributes.unicodeRange || \"\";\n  }\n\n  get unicodeRange() {\n    const ranges = [];\n    const unicodeRegex = /U\\+([0-9a-fA-F]+)/;\n    const unicodeRange = this._unicodeRange;\n\n    for (let range of unicodeRange.split(\",\").map(x => x.trim()).filter(x => !!x)) {\n      range = range.split(\"-\", 2).map(x => {\n        const found = x.match(unicodeRegex);\n\n        if (!found) {\n          return 0;\n        }\n\n        return parseInt(found[1], 16);\n      });\n\n      if (range.length === 1) {\n        range.push(range[0]);\n      }\n\n      ranges.push(range);\n    }\n\n    return (0, _util.shadow)(this, \"unicodeRange\", ranges);\n  }\n\n}\n\nclass Exclude extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"exclude\");\n  }\n\n  [_xfa_object.$finalize]() {\n    this[_xfa_object.$content] = this[_xfa_object.$content].trim().split(/\\s+/).filter(x => x && [\"calculate\", \"close\", \"enter\", \"exit\", \"initialize\", \"ready\", \"validate\"].includes(x));\n  }\n\n}\n\nclass ExcludeNS extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"excludeNS\");\n  }\n\n}\n\nclass FlipLabel extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"flipLabel\", [\"usePrinterSetting\", \"on\", \"off\"]);\n  }\n\n}\n\nclass FontInfo extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"fontInfo\", true);\n    this.embed = null;\n    this.map = null;\n    this.subsetBelow = null;\n    this.alwaysEmbed = new _xfa_object.XFAObjectArray();\n    this.defaultTypeface = new _xfa_object.XFAObjectArray();\n    this.neverEmbed = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass FormFieldFilling extends _xfa_object.Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"formFieldFilling\");\n  }\n\n}\n\nclass GroupParent extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"groupParent\");\n  }\n\n}\n\nclass IfEmpty extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"ifEmpty\", [\"dataValue\", \"dataGroup\", \"ignore\", \"remove\"]);\n  }\n\n}\n\nclass IncludeXDPContent extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"includeXDPContent\");\n  }\n\n}\n\nclass IncrementalLoad extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"incrementalLoad\", [\"none\", \"forwardOnly\"]);\n  }\n\n}\n\nclass IncrementalMerge extends _xfa_object.Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"incrementalMerge\");\n  }\n\n}\n\nclass Interactive extends _xfa_object.Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"interactive\");\n  }\n\n}\n\nclass Jog extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"jog\", [\"usePrinterSetting\", \"none\", \"pageSet\"]);\n  }\n\n}\n\nclass LabelPrinter extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"labelPrinter\", true);\n    this.name = (0, _utils.getStringOption)(attributes.name, [\"zpl\", \"dpl\", \"ipl\", \"tcpl\"]);\n    this.batchOutput = null;\n    this.flipLabel = null;\n    this.fontInfo = null;\n    this.xdc = null;\n  }\n\n}\n\nclass Layout extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"layout\", [\"paginate\", \"panel\"]);\n  }\n\n}\n\nclass Level extends _xfa_object.IntegerObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"level\", 0, n => n > 0);\n  }\n\n}\n\nclass Linearized extends _xfa_object.Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"linearized\");\n  }\n\n}\n\nclass Locale extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"locale\");\n  }\n\n}\n\nclass LocaleSet extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"localeSet\");\n  }\n\n}\n\nclass Log extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"log\", true);\n    this.mode = null;\n    this.threshold = null;\n    this.to = null;\n    this.uri = null;\n  }\n\n}\n\nclass MapElement extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"map\", true);\n    this.equate = new _xfa_object.XFAObjectArray();\n    this.equateRange = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass MediumInfo extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"mediumInfo\", true);\n    this.map = null;\n  }\n\n}\n\nclass Message extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"message\", true);\n    this.msgId = null;\n    this.severity = null;\n  }\n\n}\n\nclass Messaging extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"messaging\", true);\n    this.message = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Mode extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"mode\", [\"append\", \"overwrite\"]);\n  }\n\n}\n\nclass ModifyAnnots extends _xfa_object.Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"modifyAnnots\");\n  }\n\n}\n\nclass MsgId extends _xfa_object.IntegerObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"msgId\", 1, n => n >= 1);\n  }\n\n}\n\nclass NameAttr extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"nameAttr\");\n  }\n\n}\n\nclass NeverEmbed extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"neverEmbed\");\n  }\n\n}\n\nclass NumberOfCopies extends _xfa_object.IntegerObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"numberOfCopies\", null, n => n >= 2 && n <= 5);\n  }\n\n}\n\nclass OpenAction extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"openAction\", true);\n    this.destination = null;\n  }\n\n}\n\nclass Output extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"output\", true);\n    this.to = null;\n    this.type = null;\n    this.uri = null;\n  }\n\n}\n\nclass OutputBin extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"outputBin\");\n  }\n\n}\n\nclass OutputXSL extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"outputXSL\", true);\n    this.uri = null;\n  }\n\n}\n\nclass Overprint extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"overprint\", [\"none\", \"both\", \"draw\", \"field\"]);\n  }\n\n}\n\nclass Packets extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"packets\");\n  }\n\n  [_xfa_object.$finalize]() {\n    if (this[_xfa_object.$content] === \"*\") {\n      return;\n    }\n\n    this[_xfa_object.$content] = this[_xfa_object.$content].trim().split(/\\s+/).filter(x => [\"config\", \"datasets\", \"template\", \"xfdf\", \"xslt\"].includes(x));\n  }\n\n}\n\nclass PageOffset extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"pageOffset\");\n    this.x = (0, _utils.getInteger)({\n      data: attributes.x,\n      defaultValue: \"useXDCSetting\",\n      validator: n => true\n    });\n    this.y = (0, _utils.getInteger)({\n      data: attributes.y,\n      defaultValue: \"useXDCSetting\",\n      validator: n => true\n    });\n  }\n\n}\n\nclass PageRange extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"pageRange\");\n  }\n\n  [_xfa_object.$finalize]() {\n    const numbers = this[_xfa_object.$content].trim().split(/\\s+/).map(x => parseInt(x, 10));\n\n    const ranges = [];\n\n    for (let i = 0, ii = numbers.length; i < ii; i += 2) {\n      ranges.push(numbers.slice(i, i + 2));\n    }\n\n    this[_xfa_object.$content] = ranges;\n  }\n\n}\n\nclass Pagination extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"pagination\", [\"simplex\", \"duplexShortEdge\", \"duplexLongEdge\"]);\n  }\n\n}\n\nclass PaginationOverride extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"paginationOverride\", [\"none\", \"forceDuplex\", \"forceDuplexLongEdge\", \"forceDuplexShortEdge\", \"forceSimplex\"]);\n  }\n\n}\n\nclass Part extends _xfa_object.IntegerObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"part\", 1, n => false);\n  }\n\n}\n\nclass Pcl extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"pcl\", true);\n    this.name = attributes.name || \"\";\n    this.batchOutput = null;\n    this.fontInfo = null;\n    this.jog = null;\n    this.mediumInfo = null;\n    this.outputBin = null;\n    this.pageOffset = null;\n    this.staple = null;\n    this.xdc = null;\n  }\n\n}\n\nclass Pdf extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"pdf\", true);\n    this.name = attributes.name || \"\";\n    this.adobeExtensionLevel = null;\n    this.batchOutput = null;\n    this.compression = null;\n    this.creator = null;\n    this.encryption = null;\n    this.fontInfo = null;\n    this.interactive = null;\n    this.linearized = null;\n    this.openAction = null;\n    this.pdfa = null;\n    this.producer = null;\n    this.renderPolicy = null;\n    this.scriptModel = null;\n    this.silentPrint = null;\n    this.submitFormat = null;\n    this.tagged = null;\n    this.version = null;\n    this.viewerPreferences = null;\n    this.xdc = null;\n  }\n\n}\n\nclass Pdfa extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"pdfa\", true);\n    this.amd = null;\n    this.conformance = null;\n    this.includeXDPContent = null;\n    this.part = null;\n  }\n\n}\n\nclass Permissions extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"permissions\", true);\n    this.accessibleContent = null;\n    this.change = null;\n    this.contentCopy = null;\n    this.documentAssembly = null;\n    this.formFieldFilling = null;\n    this.modifyAnnots = null;\n    this.plaintextMetadata = null;\n    this.print = null;\n    this.printHighQuality = null;\n  }\n\n}\n\nclass PickTrayByPDFSize extends _xfa_object.Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"pickTrayByPDFSize\");\n  }\n\n}\n\nclass Picture extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"picture\");\n  }\n\n}\n\nclass PlaintextMetadata extends _xfa_object.Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"plaintextMetadata\");\n  }\n\n}\n\nclass Presence extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"presence\", [\"preserve\", \"dissolve\", \"dissolveStructure\", \"ignore\", \"remove\"]);\n  }\n\n}\n\nclass Present extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"present\", true);\n    this.behaviorOverride = null;\n    this.cache = null;\n    this.common = null;\n    this.copies = null;\n    this.destination = null;\n    this.incrementalMerge = null;\n    this.layout = null;\n    this.output = null;\n    this.overprint = null;\n    this.pagination = null;\n    this.paginationOverride = null;\n    this.script = null;\n    this.validate = null;\n    this.xdp = null;\n    this.driver = new _xfa_object.XFAObjectArray();\n    this.labelPrinter = new _xfa_object.XFAObjectArray();\n    this.pcl = new _xfa_object.XFAObjectArray();\n    this.pdf = new _xfa_object.XFAObjectArray();\n    this.ps = new _xfa_object.XFAObjectArray();\n    this.submitUrl = new _xfa_object.XFAObjectArray();\n    this.webClient = new _xfa_object.XFAObjectArray();\n    this.zpl = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Print extends _xfa_object.Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"print\");\n  }\n\n}\n\nclass PrintHighQuality extends _xfa_object.Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"printHighQuality\");\n  }\n\n}\n\nclass PrintScaling extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"printScaling\", [\"appdefault\", \"noScaling\"]);\n  }\n\n}\n\nclass PrinterName extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"printerName\");\n  }\n\n}\n\nclass Producer extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"producer\");\n  }\n\n}\n\nclass Ps extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"ps\", true);\n    this.name = attributes.name || \"\";\n    this.batchOutput = null;\n    this.fontInfo = null;\n    this.jog = null;\n    this.mediumInfo = null;\n    this.outputBin = null;\n    this.staple = null;\n    this.xdc = null;\n  }\n\n}\n\nclass Range extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"range\");\n  }\n\n  [_xfa_object.$finalize]() {\n    this[_xfa_object.$content] = this[_xfa_object.$content].trim().split(/\\s*,\\s*/, 2).map(range => range.split(\"-\").map(x => parseInt(x.trim(), 10))).filter(range => range.every(x => !isNaN(x))).map(range => {\n      if (range.length === 1) {\n        range.push(range[0]);\n      }\n\n      return range;\n    });\n  }\n\n}\n\nclass Record extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"record\");\n  }\n\n  [_xfa_object.$finalize]() {\n    this[_xfa_object.$content] = this[_xfa_object.$content].trim();\n    const n = parseInt(this[_xfa_object.$content], 10);\n\n    if (!isNaN(n) && n >= 0) {\n      this[_xfa_object.$content] = n;\n    }\n  }\n\n}\n\nclass Relevant extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"relevant\");\n  }\n\n  [_xfa_object.$finalize]() {\n    this[_xfa_object.$content] = this[_xfa_object.$content].trim().split(/\\s+/);\n  }\n\n}\n\nclass Rename extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"rename\");\n  }\n\n  [_xfa_object.$finalize]() {\n    this[_xfa_object.$content] = this[_xfa_object.$content].trim();\n\n    if (this[_xfa_object.$content].toLowerCase().startsWith(\"xml\") || this[_xfa_object.$content].match(new RegExp(\"[\\\\p{L}_][\\\\p{L}\\\\d._\\\\p{M}-]*\", \"u\"))) {\n      (0, _util.warn)(\"XFA - Rename: invalid XFA name\");\n    }\n  }\n\n}\n\nclass RenderPolicy extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"renderPolicy\", [\"server\", \"client\"]);\n  }\n\n}\n\nclass RunScripts extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"runScripts\", [\"both\", \"client\", \"none\", \"server\"]);\n  }\n\n}\n\nclass Script extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"script\", true);\n    this.currentPage = null;\n    this.exclude = null;\n    this.runScripts = null;\n  }\n\n}\n\nclass ScriptModel extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"scriptModel\", [\"XFA\", \"none\"]);\n  }\n\n}\n\nclass Severity extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"severity\", [\"ignore\", \"error\", \"information\", \"trace\", \"warning\"]);\n  }\n\n}\n\nclass SilentPrint extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"silentPrint\", true);\n    this.addSilentPrint = null;\n    this.printerName = null;\n  }\n\n}\n\nclass Staple extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"staple\");\n    this.mode = (0, _utils.getStringOption)(attributes.mode, [\"usePrinterSetting\", \"on\", \"off\"]);\n  }\n\n}\n\nclass StartNode extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"startNode\");\n  }\n\n}\n\nclass StartPage extends _xfa_object.IntegerObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"startPage\", 0, n => true);\n  }\n\n}\n\nclass SubmitFormat extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"submitFormat\", [\"html\", \"delegate\", \"fdf\", \"xml\", \"pdf\"]);\n  }\n\n}\n\nclass SubmitUrl extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"submitUrl\");\n  }\n\n}\n\nclass SubsetBelow extends _xfa_object.IntegerObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"subsetBelow\", 100, n => n >= 0 && n <= 100);\n  }\n\n}\n\nclass SuppressBanner extends _xfa_object.Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"suppressBanner\");\n  }\n\n}\n\nclass Tagged extends _xfa_object.Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"tagged\");\n  }\n\n}\n\nclass Template extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"template\", true);\n    this.base = null;\n    this.relevant = null;\n    this.startPage = null;\n    this.uri = null;\n    this.xsl = null;\n  }\n\n}\n\nclass Threshold extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"threshold\", [\"trace\", \"error\", \"information\", \"warning\"]);\n  }\n\n}\n\nclass To extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"to\", [\"null\", \"memory\", \"stderr\", \"stdout\", \"system\", \"uri\"]);\n  }\n\n}\n\nclass TemplateCache extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"templateCache\");\n    this.maxEntries = (0, _utils.getInteger)({\n      data: attributes.maxEntries,\n      defaultValue: 5,\n      validator: n => n >= 0\n    });\n  }\n\n}\n\nclass Trace extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"trace\", true);\n    this.area = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Transform extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"transform\", true);\n    this.groupParent = null;\n    this.ifEmpty = null;\n    this.nameAttr = null;\n    this.picture = null;\n    this.presence = null;\n    this.rename = null;\n    this.whitespace = null;\n  }\n\n}\n\nclass Type extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"type\", [\"none\", \"ascii85\", \"asciiHex\", \"ccittfax\", \"flate\", \"lzw\", \"runLength\", \"native\", \"xdp\", \"mergedXDP\"]);\n  }\n\n}\n\nclass Uri extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"uri\");\n  }\n\n}\n\nclass Validate extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"validate\", [\"preSubmit\", \"prePrint\", \"preExecute\", \"preSave\"]);\n  }\n\n}\n\nclass ValidateApprovalSignatures extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"validateApprovalSignatures\");\n  }\n\n  [_xfa_object.$finalize]() {\n    this[_xfa_object.$content] = this[_xfa_object.$content].trim().split(/\\s+/).filter(x => [\"docReady\", \"postSign\"].includes(x));\n  }\n\n}\n\nclass ValidationMessaging extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"validationMessaging\", [\"allMessagesIndividually\", \"allMessagesTogether\", \"firstMessageOnly\", \"noMessages\"]);\n  }\n\n}\n\nclass Version extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"version\", [\"1.7\", \"1.6\", \"1.5\", \"1.4\", \"1.3\", \"1.2\"]);\n  }\n\n}\n\nclass VersionControl extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"VersionControl\");\n    this.outputBelow = (0, _utils.getStringOption)(attributes.outputBelow, [\"warn\", \"error\", \"update\"]);\n    this.sourceAbove = (0, _utils.getStringOption)(attributes.sourceAbove, [\"warn\", \"error\"]);\n    this.sourceBelow = (0, _utils.getStringOption)(attributes.sourceBelow, [\"update\", \"maintain\"]);\n  }\n\n}\n\nclass ViewerPreferences extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"viewerPreferences\", true);\n    this.ADBE_JSConsole = null;\n    this.ADBE_JSDebugger = null;\n    this.addViewerPreferences = null;\n    this.duplexOption = null;\n    this.enforce = null;\n    this.numberOfCopies = null;\n    this.pageRange = null;\n    this.pickTrayByPDFSize = null;\n    this.printScaling = null;\n  }\n\n}\n\nclass WebClient extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"webClient\", true);\n    this.name = attributes.name ? attributes.name.trim() : \"\";\n    this.fontInfo = null;\n    this.xdc = null;\n  }\n\n}\n\nclass Whitespace extends _xfa_object.OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"whitespace\", [\"preserve\", \"ltrim\", \"normalize\", \"rtrim\", \"trim\"]);\n  }\n\n}\n\nclass Window extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"window\");\n  }\n\n  [_xfa_object.$finalize]() {\n    const pair = this[_xfa_object.$content].trim().split(/\\s*,\\s*/, 2).map(x => parseInt(x, 10));\n\n    if (pair.some(x => isNaN(x))) {\n      this[_xfa_object.$content] = [0, 0];\n      return;\n    }\n\n    if (pair.length === 1) {\n      pair.push(pair[0]);\n    }\n\n    this[_xfa_object.$content] = pair;\n  }\n\n}\n\nclass Xdc extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"xdc\", true);\n    this.uri = new _xfa_object.XFAObjectArray();\n    this.xsl = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Xdp extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"xdp\", true);\n    this.packets = null;\n  }\n\n}\n\nclass Xsl extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"xsl\", true);\n    this.debug = null;\n    this.uri = null;\n  }\n\n}\n\nclass Zpl extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"zpl\", true);\n    this.name = attributes.name ? attributes.name.trim() : \"\";\n    this.batchOutput = null;\n    this.flipLabel = null;\n    this.fontInfo = null;\n    this.xdc = null;\n  }\n\n}\n\nclass ConfigNamespace {\n  static [_namespaces.$buildXFAObject](name, attributes) {\n    if (ConfigNamespace.hasOwnProperty(name)) {\n      return ConfigNamespace[name](attributes);\n    }\n\n    return undefined;\n  }\n\n  static acrobat(attrs) {\n    return new Acrobat(attrs);\n  }\n\n  static acrobat7(attrs) {\n    return new Acrobat7(attrs);\n  }\n\n  static ADBE_JSConsole(attrs) {\n    return new ADBE_JSConsole(attrs);\n  }\n\n  static ADBE_JSDebugger(attrs) {\n    return new ADBE_JSDebugger(attrs);\n  }\n\n  static addSilentPrint(attrs) {\n    return new AddSilentPrint(attrs);\n  }\n\n  static addViewerPreferences(attrs) {\n    return new AddViewerPreferences(attrs);\n  }\n\n  static adjustData(attrs) {\n    return new AdjustData(attrs);\n  }\n\n  static adobeExtensionLevel(attrs) {\n    return new AdobeExtensionLevel(attrs);\n  }\n\n  static agent(attrs) {\n    return new Agent(attrs);\n  }\n\n  static alwaysEmbed(attrs) {\n    return new AlwaysEmbed(attrs);\n  }\n\n  static amd(attrs) {\n    return new Amd(attrs);\n  }\n\n  static area(attrs) {\n    return new Area(attrs);\n  }\n\n  static attributes(attrs) {\n    return new Attributes(attrs);\n  }\n\n  static autoSave(attrs) {\n    return new AutoSave(attrs);\n  }\n\n  static base(attrs) {\n    return new Base(attrs);\n  }\n\n  static batchOutput(attrs) {\n    return new BatchOutput(attrs);\n  }\n\n  static behaviorOverride(attrs) {\n    return new BehaviorOverride(attrs);\n  }\n\n  static cache(attrs) {\n    return new Cache(attrs);\n  }\n\n  static change(attrs) {\n    return new Change(attrs);\n  }\n\n  static common(attrs) {\n    return new Common(attrs);\n  }\n\n  static compress(attrs) {\n    return new Compress(attrs);\n  }\n\n  static compressLogicalStructure(attrs) {\n    return new CompressLogicalStructure(attrs);\n  }\n\n  static compressObjectStream(attrs) {\n    return new CompressObjectStream(attrs);\n  }\n\n  static compression(attrs) {\n    return new Compression(attrs);\n  }\n\n  static config(attrs) {\n    return new Config(attrs);\n  }\n\n  static conformance(attrs) {\n    return new Conformance(attrs);\n  }\n\n  static contentCopy(attrs) {\n    return new ContentCopy(attrs);\n  }\n\n  static copies(attrs) {\n    return new Copies(attrs);\n  }\n\n  static creator(attrs) {\n    return new Creator(attrs);\n  }\n\n  static currentPage(attrs) {\n    return new CurrentPage(attrs);\n  }\n\n  static data(attrs) {\n    return new Data(attrs);\n  }\n\n  static debug(attrs) {\n    return new Debug(attrs);\n  }\n\n  static defaultTypeface(attrs) {\n    return new DefaultTypeface(attrs);\n  }\n\n  static destination(attrs) {\n    return new Destination(attrs);\n  }\n\n  static documentAssembly(attrs) {\n    return new DocumentAssembly(attrs);\n  }\n\n  static driver(attrs) {\n    return new Driver(attrs);\n  }\n\n  static duplexOption(attrs) {\n    return new DuplexOption(attrs);\n  }\n\n  static dynamicRender(attrs) {\n    return new DynamicRender(attrs);\n  }\n\n  static embed(attrs) {\n    return new Embed(attrs);\n  }\n\n  static encrypt(attrs) {\n    return new Encrypt(attrs);\n  }\n\n  static encryption(attrs) {\n    return new Encryption(attrs);\n  }\n\n  static encryptionLevel(attrs) {\n    return new EncryptionLevel(attrs);\n  }\n\n  static enforce(attrs) {\n    return new Enforce(attrs);\n  }\n\n  static equate(attrs) {\n    return new Equate(attrs);\n  }\n\n  static equateRange(attrs) {\n    return new EquateRange(attrs);\n  }\n\n  static exclude(attrs) {\n    return new Exclude(attrs);\n  }\n\n  static excludeNS(attrs) {\n    return new ExcludeNS(attrs);\n  }\n\n  static flipLabel(attrs) {\n    return new FlipLabel(attrs);\n  }\n\n  static fontInfo(attrs) {\n    return new FontInfo(attrs);\n  }\n\n  static formFieldFilling(attrs) {\n    return new FormFieldFilling(attrs);\n  }\n\n  static groupParent(attrs) {\n    return new GroupParent(attrs);\n  }\n\n  static ifEmpty(attrs) {\n    return new IfEmpty(attrs);\n  }\n\n  static includeXDPContent(attrs) {\n    return new IncludeXDPContent(attrs);\n  }\n\n  static incrementalLoad(attrs) {\n    return new IncrementalLoad(attrs);\n  }\n\n  static incrementalMerge(attrs) {\n    return new IncrementalMerge(attrs);\n  }\n\n  static interactive(attrs) {\n    return new Interactive(attrs);\n  }\n\n  static jog(attrs) {\n    return new Jog(attrs);\n  }\n\n  static labelPrinter(attrs) {\n    return new LabelPrinter(attrs);\n  }\n\n  static layout(attrs) {\n    return new Layout(attrs);\n  }\n\n  static level(attrs) {\n    return new Level(attrs);\n  }\n\n  static linearized(attrs) {\n    return new Linearized(attrs);\n  }\n\n  static locale(attrs) {\n    return new Locale(attrs);\n  }\n\n  static localeSet(attrs) {\n    return new LocaleSet(attrs);\n  }\n\n  static log(attrs) {\n    return new Log(attrs);\n  }\n\n  static map(attrs) {\n    return new MapElement(attrs);\n  }\n\n  static mediumInfo(attrs) {\n    return new MediumInfo(attrs);\n  }\n\n  static message(attrs) {\n    return new Message(attrs);\n  }\n\n  static messaging(attrs) {\n    return new Messaging(attrs);\n  }\n\n  static mode(attrs) {\n    return new Mode(attrs);\n  }\n\n  static modifyAnnots(attrs) {\n    return new ModifyAnnots(attrs);\n  }\n\n  static msgId(attrs) {\n    return new MsgId(attrs);\n  }\n\n  static nameAttr(attrs) {\n    return new NameAttr(attrs);\n  }\n\n  static neverEmbed(attrs) {\n    return new NeverEmbed(attrs);\n  }\n\n  static numberOfCopies(attrs) {\n    return new NumberOfCopies(attrs);\n  }\n\n  static openAction(attrs) {\n    return new OpenAction(attrs);\n  }\n\n  static output(attrs) {\n    return new Output(attrs);\n  }\n\n  static outputBin(attrs) {\n    return new OutputBin(attrs);\n  }\n\n  static outputXSL(attrs) {\n    return new OutputXSL(attrs);\n  }\n\n  static overprint(attrs) {\n    return new Overprint(attrs);\n  }\n\n  static packets(attrs) {\n    return new Packets(attrs);\n  }\n\n  static pageOffset(attrs) {\n    return new PageOffset(attrs);\n  }\n\n  static pageRange(attrs) {\n    return new PageRange(attrs);\n  }\n\n  static pagination(attrs) {\n    return new Pagination(attrs);\n  }\n\n  static paginationOverride(attrs) {\n    return new PaginationOverride(attrs);\n  }\n\n  static part(attrs) {\n    return new Part(attrs);\n  }\n\n  static pcl(attrs) {\n    return new Pcl(attrs);\n  }\n\n  static pdf(attrs) {\n    return new Pdf(attrs);\n  }\n\n  static pdfa(attrs) {\n    return new Pdfa(attrs);\n  }\n\n  static permissions(attrs) {\n    return new Permissions(attrs);\n  }\n\n  static pickTrayByPDFSize(attrs) {\n    return new PickTrayByPDFSize(attrs);\n  }\n\n  static picture(attrs) {\n    return new Picture(attrs);\n  }\n\n  static plaintextMetadata(attrs) {\n    return new PlaintextMetadata(attrs);\n  }\n\n  static presence(attrs) {\n    return new Presence(attrs);\n  }\n\n  static present(attrs) {\n    return new Present(attrs);\n  }\n\n  static print(attrs) {\n    return new Print(attrs);\n  }\n\n  static printHighQuality(attrs) {\n    return new PrintHighQuality(attrs);\n  }\n\n  static printScaling(attrs) {\n    return new PrintScaling(attrs);\n  }\n\n  static printerName(attrs) {\n    return new PrinterName(attrs);\n  }\n\n  static producer(attrs) {\n    return new Producer(attrs);\n  }\n\n  static ps(attrs) {\n    return new Ps(attrs);\n  }\n\n  static range(attrs) {\n    return new Range(attrs);\n  }\n\n  static record(attrs) {\n    return new Record(attrs);\n  }\n\n  static relevant(attrs) {\n    return new Relevant(attrs);\n  }\n\n  static rename(attrs) {\n    return new Rename(attrs);\n  }\n\n  static renderPolicy(attrs) {\n    return new RenderPolicy(attrs);\n  }\n\n  static runScripts(attrs) {\n    return new RunScripts(attrs);\n  }\n\n  static script(attrs) {\n    return new Script(attrs);\n  }\n\n  static scriptModel(attrs) {\n    return new ScriptModel(attrs);\n  }\n\n  static severity(attrs) {\n    return new Severity(attrs);\n  }\n\n  static silentPrint(attrs) {\n    return new SilentPrint(attrs);\n  }\n\n  static staple(attrs) {\n    return new Staple(attrs);\n  }\n\n  static startNode(attrs) {\n    return new StartNode(attrs);\n  }\n\n  static startPage(attrs) {\n    return new StartPage(attrs);\n  }\n\n  static submitFormat(attrs) {\n    return new SubmitFormat(attrs);\n  }\n\n  static submitUrl(attrs) {\n    return new SubmitUrl(attrs);\n  }\n\n  static subsetBelow(attrs) {\n    return new SubsetBelow(attrs);\n  }\n\n  static suppressBanner(attrs) {\n    return new SuppressBanner(attrs);\n  }\n\n  static tagged(attrs) {\n    return new Tagged(attrs);\n  }\n\n  static template(attrs) {\n    return new Template(attrs);\n  }\n\n  static templateCache(attrs) {\n    return new TemplateCache(attrs);\n  }\n\n  static threshold(attrs) {\n    return new Threshold(attrs);\n  }\n\n  static to(attrs) {\n    return new To(attrs);\n  }\n\n  static trace(attrs) {\n    return new Trace(attrs);\n  }\n\n  static transform(attrs) {\n    return new Transform(attrs);\n  }\n\n  static type(attrs) {\n    return new Type(attrs);\n  }\n\n  static uri(attrs) {\n    return new Uri(attrs);\n  }\n\n  static validate(attrs) {\n    return new Validate(attrs);\n  }\n\n  static validateApprovalSignatures(attrs) {\n    return new ValidateApprovalSignatures(attrs);\n  }\n\n  static validationMessaging(attrs) {\n    return new ValidationMessaging(attrs);\n  }\n\n  static version(attrs) {\n    return new Version(attrs);\n  }\n\n  static versionControl(attrs) {\n    return new VersionControl(attrs);\n  }\n\n  static viewerPreferences(attrs) {\n    return new ViewerPreferences(attrs);\n  }\n\n  static webClient(attrs) {\n    return new WebClient(attrs);\n  }\n\n  static whitespace(attrs) {\n    return new Whitespace(attrs);\n  }\n\n  static window(attrs) {\n    return new Window(attrs);\n  }\n\n  static xdc(attrs) {\n    return new Xdc(attrs);\n  }\n\n  static xdp(attrs) {\n    return new Xdp(attrs);\n  }\n\n  static xsl(attrs) {\n    return new Xsl(attrs);\n  }\n\n  static zpl(attrs) {\n    return new Zpl(attrs);\n  }\n\n}\n\nexports.ConfigNamespace = ConfigNamespace;\n\n/***/ }),\n/* 61 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.ConnectionSetNamespace = void 0;\n\nvar _namespaces = __w_pdfjs_require__(52);\n\nvar _xfa_object = __w_pdfjs_require__(50);\n\nconst CONNECTION_SET_NS_ID = _namespaces.NamespaceIds.connectionSet.id;\n\nclass ConnectionSet extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"connectionSet\", true);\n    this.wsdlConnection = new _xfa_object.XFAObjectArray();\n    this.xmlConnection = new _xfa_object.XFAObjectArray();\n    this.xsdConnection = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass EffectiveInputPolicy extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"effectiveInputPolicy\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass EffectiveOutputPolicy extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"effectiveOutputPolicy\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass Operation extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"operation\");\n    this.id = attributes.id || \"\";\n    this.input = attributes.input || \"\";\n    this.name = attributes.name || \"\";\n    this.output = attributes.output || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass RootElement extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"rootElement\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass SoapAction extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"soapAction\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass SoapAddress extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"soapAddress\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass Uri extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"uri\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass WsdlAddress extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"wsdlAddress\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n}\n\nclass WsdlConnection extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"wsdlConnection\", true);\n    this.dataDescription = attributes.dataDescription || \"\";\n    this.name = attributes.name || \"\";\n    this.effectiveInputPolicy = null;\n    this.effectiveOutputPolicy = null;\n    this.operation = null;\n    this.soapAction = null;\n    this.soapAddress = null;\n    this.wsdlAddress = null;\n  }\n\n}\n\nclass XmlConnection extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"xmlConnection\", true);\n    this.dataDescription = attributes.dataDescription || \"\";\n    this.name = attributes.name || \"\";\n    this.uri = null;\n  }\n\n}\n\nclass XsdConnection extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"xsdConnection\", true);\n    this.dataDescription = attributes.dataDescription || \"\";\n    this.name = attributes.name || \"\";\n    this.rootElement = null;\n    this.uri = null;\n  }\n\n}\n\nclass ConnectionSetNamespace {\n  static [_namespaces.$buildXFAObject](name, attributes) {\n    if (ConnectionSetNamespace.hasOwnProperty(name)) {\n      return ConnectionSetNamespace[name](attributes);\n    }\n\n    return undefined;\n  }\n\n  static connectionSet(attrs) {\n    return new ConnectionSet(attrs);\n  }\n\n  static effectiveInputPolicy(attrs) {\n    return new EffectiveInputPolicy(attrs);\n  }\n\n  static effectiveOutputPolicy(attrs) {\n    return new EffectiveOutputPolicy(attrs);\n  }\n\n  static operation(attrs) {\n    return new Operation(attrs);\n  }\n\n  static rootElement(attrs) {\n    return new RootElement(attrs);\n  }\n\n  static soapAction(attrs) {\n    return new SoapAction(attrs);\n  }\n\n  static soapAddress(attrs) {\n    return new SoapAddress(attrs);\n  }\n\n  static uri(attrs) {\n    return new Uri(attrs);\n  }\n\n  static wsdlAddress(attrs) {\n    return new WsdlAddress(attrs);\n  }\n\n  static wsdlConnection(attrs) {\n    return new WsdlConnection(attrs);\n  }\n\n  static xmlConnection(attrs) {\n    return new XmlConnection(attrs);\n  }\n\n  static xsdConnection(attrs) {\n    return new XsdConnection(attrs);\n  }\n\n}\n\nexports.ConnectionSetNamespace = ConnectionSetNamespace;\n\n/***/ }),\n/* 62 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.DatasetsNamespace = void 0;\n\nvar _xfa_object = __w_pdfjs_require__(50);\n\nvar _namespaces = __w_pdfjs_require__(52);\n\nconst DATASETS_NS_ID = _namespaces.NamespaceIds.datasets.id;\n\nclass Data extends _xfa_object.XmlObject {\n  constructor(attributes) {\n    super(DATASETS_NS_ID, \"data\", attributes);\n  }\n\n}\n\nclass Datasets extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(DATASETS_NS_ID, \"datasets\", true);\n    this.data = null;\n    this.Signature = null;\n  }\n\n  [_xfa_object.$onChild](child) {\n    const name = child[_xfa_object.$nodeName];\n\n    if (name === \"data\" && child[_xfa_object.$namespaceId] === DATASETS_NS_ID || name === \"Signature\" && child[_xfa_object.$namespaceId] === _namespaces.NamespaceIds.signature.id) {\n      this[name] = child;\n    } else {\n      child[_xfa_object.$global] = true;\n    }\n\n    this[_xfa_object.$appendChild](child);\n  }\n\n}\n\nclass DatasetsNamespace {\n  static [_namespaces.$buildXFAObject](name, attributes) {\n    if (DatasetsNamespace.hasOwnProperty(name)) {\n      return DatasetsNamespace[name](attributes);\n    }\n\n    return undefined;\n  }\n\n  static datasets(attributes) {\n    return new Datasets(attributes);\n  }\n\n  static data(attributes) {\n    return new Data(attributes);\n  }\n\n}\n\nexports.DatasetsNamespace = DatasetsNamespace;\n\n/***/ }),\n/* 63 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.LocaleSetNamespace = void 0;\n\nvar _namespaces = __w_pdfjs_require__(52);\n\nvar _xfa_object = __w_pdfjs_require__(50);\n\nvar _utils = __w_pdfjs_require__(51);\n\nconst LOCALE_SET_NS_ID = _namespaces.NamespaceIds.localeSet.id;\n\nclass CalendarSymbols extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"calendarSymbols\", true);\n    this.name = \"gregorian\";\n    this.dayNames = new _xfa_object.XFAObjectArray(2);\n    this.eraNames = null;\n    this.meridiemNames = null;\n    this.monthNames = new _xfa_object.XFAObjectArray(2);\n  }\n\n}\n\nclass CurrencySymbol extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"currencySymbol\");\n    this.name = (0, _utils.getStringOption)(attributes.name, [\"symbol\", \"isoname\", \"decimal\"]);\n  }\n\n}\n\nclass CurrencySymbols extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"currencySymbols\", true);\n    this.currencySymbol = new _xfa_object.XFAObjectArray(3);\n  }\n\n}\n\nclass DatePattern extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"datePattern\");\n    this.name = (0, _utils.getStringOption)(attributes.name, [\"full\", \"long\", \"med\", \"short\"]);\n  }\n\n}\n\nclass DatePatterns extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"datePatterns\", true);\n    this.datePattern = new _xfa_object.XFAObjectArray(4);\n  }\n\n}\n\nclass DateTimeSymbols extends _xfa_object.ContentObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"dateTimeSymbols\");\n  }\n\n}\n\nclass Day extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"day\");\n  }\n\n}\n\nclass DayNames extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"dayNames\", true);\n    this.abbr = (0, _utils.getInteger)({\n      data: attributes.abbr,\n      defaultValue: 0,\n      validate: x => x === 1\n    });\n    this.day = new _xfa_object.XFAObjectArray(7);\n  }\n\n}\n\nclass Era extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"era\");\n  }\n\n}\n\nclass EraNames extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"eraNames\", true);\n    this.era = new _xfa_object.XFAObjectArray(2);\n  }\n\n}\n\nclass Locale extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"locale\", true);\n    this.desc = attributes.desc || \"\";\n    this.name = \"isoname\";\n    this.calendarSymbols = null;\n    this.currencySymbols = null;\n    this.datePatterns = null;\n    this.dateTimeSymbols = null;\n    this.numberPatterns = null;\n    this.numberSymbols = null;\n    this.timePatterns = null;\n    this.typeFaces = null;\n  }\n\n}\n\nclass LocaleSet extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"localeSet\", true);\n    this.locale = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass Meridiem extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"meridiem\");\n  }\n\n}\n\nclass MeridiemNames extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"meridiemNames\", true);\n    this.meridiem = new _xfa_object.XFAObjectArray(2);\n  }\n\n}\n\nclass Month extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"month\");\n  }\n\n}\n\nclass MonthNames extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"monthNames\", true);\n    this.abbr = (0, _utils.getInteger)({\n      data: attributes.abbr,\n      defaultValue: 0,\n      validate: x => x === 1\n    });\n    this.month = new _xfa_object.XFAObjectArray(12);\n  }\n\n}\n\nclass NumberPattern extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"numberPattern\");\n    this.name = (0, _utils.getStringOption)(attributes.name, [\"full\", \"long\", \"med\", \"short\"]);\n  }\n\n}\n\nclass NumberPatterns extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"numberPatterns\", true);\n    this.numberPattern = new _xfa_object.XFAObjectArray(4);\n  }\n\n}\n\nclass NumberSymbol extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"numberSymbol\");\n    this.name = (0, _utils.getStringOption)(attributes.name, [\"decimal\", \"grouping\", \"percent\", \"minus\", \"zero\"]);\n  }\n\n}\n\nclass NumberSymbols extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"numberSymbols\", true);\n    this.numberSymbol = new _xfa_object.XFAObjectArray(5);\n  }\n\n}\n\nclass TimePattern extends _xfa_object.StringObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"timePattern\");\n    this.name = (0, _utils.getStringOption)(attributes.name, [\"full\", \"long\", \"med\", \"short\"]);\n  }\n\n}\n\nclass TimePatterns extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"timePatterns\", true);\n    this.timePattern = new _xfa_object.XFAObjectArray(4);\n  }\n\n}\n\nclass TypeFace extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"typeFace\", true);\n    this.name = attributes.name | \"\";\n  }\n\n}\n\nclass TypeFaces extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"typeFaces\", true);\n    this.typeFace = new _xfa_object.XFAObjectArray();\n  }\n\n}\n\nclass LocaleSetNamespace {\n  static [_namespaces.$buildXFAObject](name, attributes) {\n    if (LocaleSetNamespace.hasOwnProperty(name)) {\n      return LocaleSetNamespace[name](attributes);\n    }\n\n    return undefined;\n  }\n\n  static calendarSymbols(attrs) {\n    return new CalendarSymbols(attrs);\n  }\n\n  static currencySymbol(attrs) {\n    return new CurrencySymbol(attrs);\n  }\n\n  static currencySymbols(attrs) {\n    return new CurrencySymbols(attrs);\n  }\n\n  static datePattern(attrs) {\n    return new DatePattern(attrs);\n  }\n\n  static datePatterns(attrs) {\n    return new DatePatterns(attrs);\n  }\n\n  static dateTimeSymbols(attrs) {\n    return new DateTimeSymbols(attrs);\n  }\n\n  static day(attrs) {\n    return new Day(attrs);\n  }\n\n  static dayNames(attrs) {\n    return new DayNames(attrs);\n  }\n\n  static era(attrs) {\n    return new Era(attrs);\n  }\n\n  static eraNames(attrs) {\n    return new EraNames(attrs);\n  }\n\n  static locale(attrs) {\n    return new Locale(attrs);\n  }\n\n  static localeSet(attrs) {\n    return new LocaleSet(attrs);\n  }\n\n  static meridiem(attrs) {\n    return new Meridiem(attrs);\n  }\n\n  static meridiemNames(attrs) {\n    return new MeridiemNames(attrs);\n  }\n\n  static month(attrs) {\n    return new Month(attrs);\n  }\n\n  static monthNames(attrs) {\n    return new MonthNames(attrs);\n  }\n\n  static numberPattern(attrs) {\n    return new NumberPattern(attrs);\n  }\n\n  static numberPatterns(attrs) {\n    return new NumberPatterns(attrs);\n  }\n\n  static numberSymbol(attrs) {\n    return new NumberSymbol(attrs);\n  }\n\n  static numberSymbols(attrs) {\n    return new NumberSymbols(attrs);\n  }\n\n  static timePattern(attrs) {\n    return new TimePattern(attrs);\n  }\n\n  static timePatterns(attrs) {\n    return new TimePatterns(attrs);\n  }\n\n  static typeFace(attrs) {\n    return new TypeFace(attrs);\n  }\n\n  static typeFaces(attrs) {\n    return new TypeFaces(attrs);\n  }\n\n}\n\nexports.LocaleSetNamespace = LocaleSetNamespace;\n\n/***/ }),\n/* 64 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.SignatureNamespace = void 0;\n\nvar _namespaces = __w_pdfjs_require__(52);\n\nvar _xfa_object = __w_pdfjs_require__(50);\n\nconst SIGNATURE_NS_ID = _namespaces.NamespaceIds.signature.id;\n\nclass Signature extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(SIGNATURE_NS_ID, \"signature\", true);\n  }\n\n}\n\nclass SignatureNamespace {\n  static [_namespaces.$buildXFAObject](name, attributes) {\n    if (SignatureNamespace.hasOwnProperty(name)) {\n      return SignatureNamespace[name](attributes);\n    }\n\n    return undefined;\n  }\n\n  static signature(attributes) {\n    return new Signature(attributes);\n  }\n\n}\n\nexports.SignatureNamespace = SignatureNamespace;\n\n/***/ }),\n/* 65 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.StylesheetNamespace = void 0;\n\nvar _namespaces = __w_pdfjs_require__(52);\n\nvar _xfa_object = __w_pdfjs_require__(50);\n\nconst STYLESHEET_NS_ID = _namespaces.NamespaceIds.stylesheet.id;\n\nclass Stylesheet extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(STYLESHEET_NS_ID, \"stylesheet\", true);\n  }\n\n}\n\nclass StylesheetNamespace {\n  static [_namespaces.$buildXFAObject](name, attributes) {\n    if (StylesheetNamespace.hasOwnProperty(name)) {\n      return StylesheetNamespace[name](attributes);\n    }\n\n    return undefined;\n  }\n\n  static stylesheet(attributes) {\n    return new Stylesheet(attributes);\n  }\n\n}\n\nexports.StylesheetNamespace = StylesheetNamespace;\n\n/***/ }),\n/* 66 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.XdpNamespace = void 0;\n\nvar _namespaces = __w_pdfjs_require__(52);\n\nvar _xfa_object = __w_pdfjs_require__(50);\n\nconst XDP_NS_ID = _namespaces.NamespaceIds.xdp.id;\n\nclass Xdp extends _xfa_object.XFAObject {\n  constructor(attributes) {\n    super(XDP_NS_ID, \"xdp\", true);\n    this.uuid = attributes.uuid || \"\";\n    this.timeStamp = attributes.timeStamp || \"\";\n    this.config = null;\n    this.connectionSet = null;\n    this.datasets = null;\n    this.localeSet = null;\n    this.stylesheet = new _xfa_object.XFAObjectArray();\n    this.template = null;\n  }\n\n  [_xfa_object.$onChildCheck](child) {\n    const ns = _namespaces.NamespaceIds[child[_xfa_object.$nodeName]];\n    return ns && child[_xfa_object.$namespaceId] === ns.id;\n  }\n\n}\n\nclass XdpNamespace {\n  static [_namespaces.$buildXFAObject](name, attributes) {\n    if (XdpNamespace.hasOwnProperty(name)) {\n      return XdpNamespace[name](attributes);\n    }\n\n    return undefined;\n  }\n\n  static xdp(attributes) {\n    return new Xdp(attributes);\n  }\n\n}\n\nexports.XdpNamespace = XdpNamespace;\n\n/***/ }),\n/* 67 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.XhtmlNamespace = void 0;\n\nvar _namespaces = __w_pdfjs_require__(52);\n\nvar _xfa_object = __w_pdfjs_require__(50);\n\nconst XHTML_NS_ID = _namespaces.NamespaceIds.xhtml.id;\nconst VALID_STYLES = new Set([\"color\", \"font\", \"font-family\", \"font-size\", \"font-stretch\", \"font-style\", \"font-weight\", \"margin\", \"margin-bottom\", \"margin-left\", \"margin-right\", \"margin-top\", \"letter-spacing\", \"line-height\", \"orphans\", \"page-break-after\", \"page-break-before\", \"page-break-inside\", \"tab-interval\", \"tab-stop\", \"text-decoration\", \"text-indent\", \"vertical-align\", \"widows\", \"kerning-mode\", \"xfa-font-horizontal-scale\", \"xfa-font-vertical-scale\", \"xfa-tab-stops\"]);\n\nfunction checkStyle(style) {\n  if (!style) {\n    return \"\";\n  }\n\n  return style.trim().split(/\\s*;\\s*/).filter(s => !!s).map(s => s.split(/\\s*:\\s*/, 2)).filter(([key]) => VALID_STYLES.has(key)).map(kv => kv.join(\":\")).join(\";\");\n}\n\nclass A extends _xfa_object.XmlObject {\n  constructor(attributes) {\n    super(XHTML_NS_ID, \"a\");\n    this.href = attributes.href || \"\";\n    this.style = checkStyle(attributes.style);\n  }\n\n}\n\nclass B extends _xfa_object.XmlObject {\n  constructor(attributes) {\n    super(XHTML_NS_ID, \"b\");\n    this.style = checkStyle(attributes.style);\n  }\n\n}\n\nclass Body extends _xfa_object.XmlObject {\n  constructor(attributes) {\n    super(XHTML_NS_ID, \"body\");\n    this.style = checkStyle(attributes.style);\n  }\n\n}\n\nclass Br extends _xfa_object.XmlObject {\n  constructor(attributes) {\n    super(XHTML_NS_ID, \"br\");\n    this.style = checkStyle(attributes.style);\n  }\n\n  [_xfa_object.$text]() {\n    return \"\\n\";\n  }\n\n}\n\nclass Html extends _xfa_object.XmlObject {\n  constructor(attributes) {\n    super(XHTML_NS_ID, \"html\");\n    this.style = checkStyle(attributes.style);\n  }\n\n}\n\nclass I extends _xfa_object.XmlObject {\n  constructor(attributes) {\n    super(XHTML_NS_ID, \"i\");\n    this.style = checkStyle(attributes.style);\n  }\n\n}\n\nclass Li extends _xfa_object.XmlObject {\n  constructor(attributes) {\n    super(XHTML_NS_ID, \"li\");\n    this.style = checkStyle(attributes.style);\n  }\n\n}\n\nclass Ol extends _xfa_object.XmlObject {\n  constructor(attributes) {\n    super(XHTML_NS_ID, \"ol\");\n    this.style = checkStyle(attributes.style);\n  }\n\n}\n\nclass P extends _xfa_object.XmlObject {\n  constructor(attributes) {\n    super(XHTML_NS_ID, \"p\");\n    this.style = checkStyle(attributes.style);\n  }\n\n}\n\nclass Span extends _xfa_object.XmlObject {\n  constructor(attributes) {\n    super(XHTML_NS_ID, \"span\");\n    this.style = checkStyle(attributes.style);\n  }\n\n}\n\nclass Sub extends _xfa_object.XmlObject {\n  constructor(attributes) {\n    super(XHTML_NS_ID, \"sub\");\n    this.style = checkStyle(attributes.style);\n  }\n\n}\n\nclass Sup extends _xfa_object.XmlObject {\n  constructor(attributes) {\n    super(XHTML_NS_ID, \"sup\");\n    this.style = checkStyle(attributes.style);\n  }\n\n}\n\nclass Ul extends _xfa_object.XmlObject {\n  constructor(attributes) {\n    super(XHTML_NS_ID, \"ul\");\n    this.style = checkStyle(attributes.style);\n  }\n\n}\n\nclass XhtmlNamespace {\n  static [_namespaces.$buildXFAObject](name, attributes) {\n    if (XhtmlNamespace.hasOwnProperty(name)) {\n      return XhtmlNamespace[name](attributes);\n    }\n\n    return undefined;\n  }\n\n  static a(attributes) {\n    return new A(attributes);\n  }\n\n  static b(attributes) {\n    return new B(attributes);\n  }\n\n  static body(attributes) {\n    return new Body(attributes);\n  }\n\n  static br(attributes) {\n    return new Br(attributes);\n  }\n\n  static html(attributes) {\n    return new Html(attributes);\n  }\n\n  static i(attributes) {\n    return new I(attributes);\n  }\n\n  static li(attributes) {\n    return new Li(attributes);\n  }\n\n  static ol(attributes) {\n    return new Ol(attributes);\n  }\n\n  static p(attributes) {\n    return new P(attributes);\n  }\n\n  static span(attributes) {\n    return new Span(attributes);\n  }\n\n  static sub(attributes) {\n    return new Sub(attributes);\n  }\n\n  static sup(attributes) {\n    return new Sup(attributes);\n  }\n\n  static ul(attributes) {\n    return new Ul(attributes);\n  }\n\n}\n\nexports.XhtmlNamespace = XhtmlNamespace;\n\n/***/ }),\n/* 68 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.UnknownNamespace = void 0;\n\nvar _namespaces = __w_pdfjs_require__(52);\n\nvar _xfa_object = __w_pdfjs_require__(50);\n\nclass UnknownNamespace {\n  constructor(nsId) {\n    this.namespaceId = nsId;\n  }\n\n  [_namespaces.$buildXFAObject](name, attributes) {\n    return new _xfa_object.XmlObject(this.namespaceId, name, attributes);\n  }\n\n}\n\nexports.UnknownNamespace = UnknownNamespace;\n\n/***/ }),\n/* 69 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.MessageHandler = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nconst CallbackKind = {\n  UNKNOWN: 0,\n  DATA: 1,\n  ERROR: 2\n};\nconst StreamKind = {\n  UNKNOWN: 0,\n  CANCEL: 1,\n  CANCEL_COMPLETE: 2,\n  CLOSE: 3,\n  ENQUEUE: 4,\n  ERROR: 5,\n  PULL: 6,\n  PULL_COMPLETE: 7,\n  START_COMPLETE: 8\n};\n\nfunction wrapReason(reason) {\n  if (typeof reason !== \"object\" || reason === null) {\n    return reason;\n  }\n\n  switch (reason.name) {\n    case \"AbortException\":\n      return new _util.AbortException(reason.message);\n\n    case \"MissingPDFException\":\n      return new _util.MissingPDFException(reason.message);\n\n    case \"UnexpectedResponseException\":\n      return new _util.UnexpectedResponseException(reason.message, reason.status);\n\n    case \"UnknownErrorException\":\n      return new _util.UnknownErrorException(reason.message, reason.details);\n\n    default:\n      return new _util.UnknownErrorException(reason.message, reason.toString());\n  }\n}\n\nclass MessageHandler {\n  constructor(sourceName, targetName, comObj) {\n    this.sourceName = sourceName;\n    this.targetName = targetName;\n    this.comObj = comObj;\n    this.callbackId = 1;\n    this.streamId = 1;\n    this.postMessageTransfers = true;\n    this.streamSinks = Object.create(null);\n    this.streamControllers = Object.create(null);\n    this.callbackCapabilities = Object.create(null);\n    this.actionHandler = Object.create(null);\n\n    this._onComObjOnMessage = event => {\n      const data = event.data;\n\n      if (data.targetName !== this.sourceName) {\n        return;\n      }\n\n      if (data.stream) {\n        this._processStreamMessage(data);\n\n        return;\n      }\n\n      if (data.callback) {\n        const callbackId = data.callbackId;\n        const capability = this.callbackCapabilities[callbackId];\n\n        if (!capability) {\n          throw new Error(`Cannot resolve callback ${callbackId}`);\n        }\n\n        delete this.callbackCapabilities[callbackId];\n\n        if (data.callback === CallbackKind.DATA) {\n          capability.resolve(data.data);\n        } else if (data.callback === CallbackKind.ERROR) {\n          capability.reject(wrapReason(data.reason));\n        } else {\n          throw new Error(\"Unexpected callback case\");\n        }\n\n        return;\n      }\n\n      const action = this.actionHandler[data.action];\n\n      if (!action) {\n        throw new Error(`Unknown action from worker: ${data.action}`);\n      }\n\n      if (data.callbackId) {\n        const cbSourceName = this.sourceName;\n        const cbTargetName = data.sourceName;\n        new Promise(function (resolve) {\n          resolve(action(data.data));\n        }).then(function (result) {\n          comObj.postMessage({\n            sourceName: cbSourceName,\n            targetName: cbTargetName,\n            callback: CallbackKind.DATA,\n            callbackId: data.callbackId,\n            data: result\n          });\n        }, function (reason) {\n          comObj.postMessage({\n            sourceName: cbSourceName,\n            targetName: cbTargetName,\n            callback: CallbackKind.ERROR,\n            callbackId: data.callbackId,\n            reason: wrapReason(reason)\n          });\n        });\n        return;\n      }\n\n      if (data.streamId) {\n        this._createStreamSink(data);\n\n        return;\n      }\n\n      action(data.data);\n    };\n\n    comObj.addEventListener(\"message\", this._onComObjOnMessage);\n  }\n\n  on(actionName, handler) {\n    const ah = this.actionHandler;\n\n    if (ah[actionName]) {\n      throw new Error(`There is already an actionName called \"${actionName}\"`);\n    }\n\n    ah[actionName] = handler;\n  }\n\n  send(actionName, data, transfers) {\n    this._postMessage({\n      sourceName: this.sourceName,\n      targetName: this.targetName,\n      action: actionName,\n      data\n    }, transfers);\n  }\n\n  sendWithPromise(actionName, data, transfers) {\n    const callbackId = this.callbackId++;\n    const capability = (0, _util.createPromiseCapability)();\n    this.callbackCapabilities[callbackId] = capability;\n\n    try {\n      this._postMessage({\n        sourceName: this.sourceName,\n        targetName: this.targetName,\n        action: actionName,\n        callbackId,\n        data\n      }, transfers);\n    } catch (ex) {\n      capability.reject(ex);\n    }\n\n    return capability.promise;\n  }\n\n  sendWithStream(actionName, data, queueingStrategy, transfers) {\n    const streamId = this.streamId++;\n    const sourceName = this.sourceName;\n    const targetName = this.targetName;\n    const comObj = this.comObj;\n    return new ReadableStream({\n      start: controller => {\n        const startCapability = (0, _util.createPromiseCapability)();\n        this.streamControllers[streamId] = {\n          controller,\n          startCall: startCapability,\n          pullCall: null,\n          cancelCall: null,\n          isClosed: false\n        };\n\n        this._postMessage({\n          sourceName,\n          targetName,\n          action: actionName,\n          streamId,\n          data,\n          desiredSize: controller.desiredSize\n        }, transfers);\n\n        return startCapability.promise;\n      },\n      pull: controller => {\n        const pullCapability = (0, _util.createPromiseCapability)();\n        this.streamControllers[streamId].pullCall = pullCapability;\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.PULL,\n          streamId,\n          desiredSize: controller.desiredSize\n        });\n        return pullCapability.promise;\n      },\n      cancel: reason => {\n        (0, _util.assert)(reason instanceof Error, \"cancel must have a valid reason\");\n        const cancelCapability = (0, _util.createPromiseCapability)();\n        this.streamControllers[streamId].cancelCall = cancelCapability;\n        this.streamControllers[streamId].isClosed = true;\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.CANCEL,\n          streamId,\n          reason: wrapReason(reason)\n        });\n        return cancelCapability.promise;\n      }\n    }, queueingStrategy);\n  }\n\n  _createStreamSink(data) {\n    const self = this;\n    const action = this.actionHandler[data.action];\n    const streamId = data.streamId;\n    const sourceName = this.sourceName;\n    const targetName = data.sourceName;\n    const comObj = this.comObj;\n    const streamSink = {\n      enqueue(chunk, size = 1, transfers) {\n        if (this.isCancelled) {\n          return;\n        }\n\n        const lastDesiredSize = this.desiredSize;\n        this.desiredSize -= size;\n\n        if (lastDesiredSize > 0 && this.desiredSize <= 0) {\n          this.sinkCapability = (0, _util.createPromiseCapability)();\n          this.ready = this.sinkCapability.promise;\n        }\n\n        self._postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.ENQUEUE,\n          streamId,\n          chunk\n        }, transfers);\n      },\n\n      close() {\n        if (this.isCancelled) {\n          return;\n        }\n\n        this.isCancelled = true;\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.CLOSE,\n          streamId\n        });\n        delete self.streamSinks[streamId];\n      },\n\n      error(reason) {\n        (0, _util.assert)(reason instanceof Error, \"error must have a valid reason\");\n\n        if (this.isCancelled) {\n          return;\n        }\n\n        this.isCancelled = true;\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.ERROR,\n          streamId,\n          reason: wrapReason(reason)\n        });\n      },\n\n      sinkCapability: (0, _util.createPromiseCapability)(),\n      onPull: null,\n      onCancel: null,\n      isCancelled: false,\n      desiredSize: data.desiredSize,\n      ready: null\n    };\n    streamSink.sinkCapability.resolve();\n    streamSink.ready = streamSink.sinkCapability.promise;\n    this.streamSinks[streamId] = streamSink;\n    new Promise(function (resolve) {\n      resolve(action(data.data, streamSink));\n    }).then(function () {\n      comObj.postMessage({\n        sourceName,\n        targetName,\n        stream: StreamKind.START_COMPLETE,\n        streamId,\n        success: true\n      });\n    }, function (reason) {\n      comObj.postMessage({\n        sourceName,\n        targetName,\n        stream: StreamKind.START_COMPLETE,\n        streamId,\n        reason: wrapReason(reason)\n      });\n    });\n  }\n\n  _processStreamMessage(data) {\n    const streamId = data.streamId;\n    const sourceName = this.sourceName;\n    const targetName = data.sourceName;\n    const comObj = this.comObj;\n\n    switch (data.stream) {\n      case StreamKind.START_COMPLETE:\n        if (data.success) {\n          this.streamControllers[streamId].startCall.resolve();\n        } else {\n          this.streamControllers[streamId].startCall.reject(wrapReason(data.reason));\n        }\n\n        break;\n\n      case StreamKind.PULL_COMPLETE:\n        if (data.success) {\n          this.streamControllers[streamId].pullCall.resolve();\n        } else {\n          this.streamControllers[streamId].pullCall.reject(wrapReason(data.reason));\n        }\n\n        break;\n\n      case StreamKind.PULL:\n        if (!this.streamSinks[streamId]) {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.PULL_COMPLETE,\n            streamId,\n            success: true\n          });\n          break;\n        }\n\n        if (this.streamSinks[streamId].desiredSize <= 0 && data.desiredSize > 0) {\n          this.streamSinks[streamId].sinkCapability.resolve();\n        }\n\n        this.streamSinks[streamId].desiredSize = data.desiredSize;\n        const {\n          onPull\n        } = this.streamSinks[data.streamId];\n        new Promise(function (resolve) {\n          resolve(onPull && onPull());\n        }).then(function () {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.PULL_COMPLETE,\n            streamId,\n            success: true\n          });\n        }, function (reason) {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.PULL_COMPLETE,\n            streamId,\n            reason: wrapReason(reason)\n          });\n        });\n        break;\n\n      case StreamKind.ENQUEUE:\n        (0, _util.assert)(this.streamControllers[streamId], \"enqueue should have stream controller\");\n\n        if (this.streamControllers[streamId].isClosed) {\n          break;\n        }\n\n        this.streamControllers[streamId].controller.enqueue(data.chunk);\n        break;\n\n      case StreamKind.CLOSE:\n        (0, _util.assert)(this.streamControllers[streamId], \"close should have stream controller\");\n\n        if (this.streamControllers[streamId].isClosed) {\n          break;\n        }\n\n        this.streamControllers[streamId].isClosed = true;\n        this.streamControllers[streamId].controller.close();\n\n        this._deleteStreamController(streamId);\n\n        break;\n\n      case StreamKind.ERROR:\n        (0, _util.assert)(this.streamControllers[streamId], \"error should have stream controller\");\n        this.streamControllers[streamId].controller.error(wrapReason(data.reason));\n\n        this._deleteStreamController(streamId);\n\n        break;\n\n      case StreamKind.CANCEL_COMPLETE:\n        if (data.success) {\n          this.streamControllers[streamId].cancelCall.resolve();\n        } else {\n          this.streamControllers[streamId].cancelCall.reject(wrapReason(data.reason));\n        }\n\n        this._deleteStreamController(streamId);\n\n        break;\n\n      case StreamKind.CANCEL:\n        if (!this.streamSinks[streamId]) {\n          break;\n        }\n\n        const {\n          onCancel\n        } = this.streamSinks[data.streamId];\n        new Promise(function (resolve) {\n          resolve(onCancel && onCancel(wrapReason(data.reason)));\n        }).then(function () {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.CANCEL_COMPLETE,\n            streamId,\n            success: true\n          });\n        }, function (reason) {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.CANCEL_COMPLETE,\n            streamId,\n            reason: wrapReason(reason)\n          });\n        });\n        this.streamSinks[streamId].sinkCapability.reject(wrapReason(data.reason));\n        this.streamSinks[streamId].isCancelled = true;\n        delete this.streamSinks[streamId];\n        break;\n\n      default:\n        throw new Error(\"Unexpected stream case\");\n    }\n  }\n\n  async _deleteStreamController(streamId) {\n    await Promise.allSettled([this.streamControllers[streamId].startCall, this.streamControllers[streamId].pullCall, this.streamControllers[streamId].cancelCall].map(function (capability) {\n      return capability && capability.promise;\n    }));\n    delete this.streamControllers[streamId];\n  }\n\n  _postMessage(message, transfers) {\n    if (transfers && this.postMessageTransfers) {\n      this.comObj.postMessage(message, transfers);\n    } else {\n      this.comObj.postMessage(message);\n    }\n  }\n\n  destroy() {\n    this.comObj.removeEventListener(\"message\", this._onComObjOnMessage);\n  }\n\n}\n\nexports.MessageHandler = MessageHandler;\n\n/***/ }),\n/* 70 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFWorkerStream = void 0;\n\nvar _util = __w_pdfjs_require__(2);\n\nclass PDFWorkerStream {\n  constructor(msgHandler) {\n    this._msgHandler = msgHandler;\n    this._contentLength = null;\n    this._fullRequestReader = null;\n    this._rangeRequestReaders = [];\n  }\n\n  getFullReader() {\n    (0, _util.assert)(!this._fullRequestReader, \"PDFWorkerStream.getFullReader can only be called once.\");\n    this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler);\n    return this._fullRequestReader;\n  }\n\n  getRangeReader(begin, end) {\n    const reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler);\n\n    this._rangeRequestReaders.push(reader);\n\n    return reader;\n  }\n\n  cancelAllRequests(reason) {\n    if (this._fullRequestReader) {\n      this._fullRequestReader.cancel(reason);\n    }\n\n    const readers = this._rangeRequestReaders.slice(0);\n\n    readers.forEach(function (reader) {\n      reader.cancel(reason);\n    });\n  }\n\n}\n\nexports.PDFWorkerStream = PDFWorkerStream;\n\nclass PDFWorkerStreamReader {\n  constructor(msgHandler) {\n    this._msgHandler = msgHandler;\n    this.onProgress = null;\n    this._contentLength = null;\n    this._isRangeSupported = false;\n    this._isStreamingSupported = false;\n\n    const readableStream = this._msgHandler.sendWithStream(\"GetReader\");\n\n    this._reader = readableStream.getReader();\n    this._headersReady = this._msgHandler.sendWithPromise(\"ReaderHeadersReady\").then(data => {\n      this._isStreamingSupported = data.isStreamingSupported;\n      this._isRangeSupported = data.isRangeSupported;\n      this._contentLength = data.contentLength;\n    });\n  }\n\n  get headersReady() {\n    return this._headersReady;\n  }\n\n  get contentLength() {\n    return this._contentLength;\n  }\n\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  }\n\n  get isRangeSupported() {\n    return this._isRangeSupported;\n  }\n\n  async read() {\n    const {\n      value,\n      done\n    } = await this._reader.read();\n\n    if (done) {\n      return {\n        value: undefined,\n        done: true\n      };\n    }\n\n    return {\n      value: value.buffer,\n      done: false\n    };\n  }\n\n  cancel(reason) {\n    this._reader.cancel(reason);\n  }\n\n}\n\nclass PDFWorkerStreamRangeReader {\n  constructor(begin, end, msgHandler) {\n    this._msgHandler = msgHandler;\n    this.onProgress = null;\n\n    const readableStream = this._msgHandler.sendWithStream(\"GetRangeReader\", {\n      begin,\n      end\n    });\n\n    this._reader = readableStream.getReader();\n  }\n\n  get isStreamingSupported() {\n    return false;\n  }\n\n  async read() {\n    const {\n      value,\n      done\n    } = await this._reader.read();\n\n    if (done) {\n      return {\n        value: undefined,\n        done: true\n      };\n    }\n\n    return {\n      value: value.buffer,\n      done: false\n    };\n  }\n\n  cancel(reason) {\n    this._reader.cancel(reason);\n  }\n\n}\n\n/***/ })\n/******/ \t]);\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __w_pdfjs_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __w_pdfjs_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t(() => {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__w_pdfjs_require__.d = (exports, definition) => {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__w_pdfjs_require__.o(definition, key) && !__w_pdfjs_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t(() => {\n/******/ \t\t__w_pdfjs_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t(() => {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__w_pdfjs_require__.r = (exports) => {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.\n(() => {\nvar exports = __webpack_exports__;\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nObject.defineProperty(exports, \"WorkerMessageHandler\", ({\n  enumerable: true,\n  get: function () {\n    return _worker.WorkerMessageHandler;\n  }\n}));\n\nvar _worker = __w_pdfjs_require__(1);\n\nconst pdfjsVersion = '2.8.335';\nconst pdfjsBuild = '228adbf67';\n})();\n\n/******/ \treturn __webpack_exports__;\n/******/ })()\n;\n});\n//# sourceMappingURL=pdf.worker.js.map"
  },
  {
    "path": "lib/pdf.js/web/cmaps/CNS2-V.bcmap",
    "content": "\u0003RCopyright 1990-2009 Adobe Systems Incorporated.\nAll rights reserved.\nSee ./LICENSE\u0006CNS2-H"
  },
  {
    "path": "lib/pdf.js/web/cmaps/ETenms-B5-H.bcmap",
    "content": "\u0002RCopyright 1990-2009 Adobe Systems Incorporated.\nAll rights reserved.\nSee ./LICENSE\tETen-B5-H`\u0001 ^\u0001"
  },
  {
    "path": "lib/pdf.js/web/cmaps/GB-H.bcmap",
    "content": "\u0002RCopyright 1990-2009 Adobe Systems Incorporated.\nAll rights reserved.\nSee ./LICENSE\u0001\u0001!!]aX!!]`21>\u0002\tp\u0002\u000bz$]\u0006\"Rd-U7*\u0017\r\b4%+ Z\u000f {/\u001f\u001c\u0004%<9Kb1].\"\u001f\f`],\"]\n\"]h\"]F\"]$\"]\u0002\"]`\"]>\"]\u001c\"]z\"]X\"]6\"]\u0014\"]r\"]P\"].\"]\f\"]j\"]H\"]&\"]\u0004\"]b\"]@\"]\u001e\"]|\"]Z\"]8\"]\u0016\"]t\"]R\"]0\"]\u000e\"]l\"]J\"](\"]\u0006\"]d\"]B\"] \"X~']W\"]5\"]\u0013\"]q\"]O\"]-\"]\u000b\"]i\"]G\"]%\"]\u0003\"]a\"]?\"]\u001d\"]{\"]Y\"]7\"]\u0015\"]s\"]Q\"]/\"]\r\"]k\"]I\"]'\"]\u0005\"]c\"]A\"]\u001f\"]}\"][\"]9"
  },
  {
    "path": "lib/pdf.js/web/cmaps/LICENSE",
    "content": "%%Copyright: -----------------------------------------------------------\n%%Copyright: Copyright 1990-2009 Adobe Systems Incorporated.\n%%Copyright: All rights reserved.\n%%Copyright:\n%%Copyright: Redistribution and use in source and binary forms, with or\n%%Copyright: without modification, are permitted provided that the\n%%Copyright: following conditions are met:\n%%Copyright:\n%%Copyright: Redistributions of source code must retain the above\n%%Copyright: copyright notice, this list of conditions and the following\n%%Copyright: disclaimer.\n%%Copyright:\n%%Copyright: Redistributions in binary form must reproduce the above\n%%Copyright: copyright notice, this list of conditions and the following\n%%Copyright: disclaimer in the documentation and/or other materials\n%%Copyright: provided with the distribution. \n%%Copyright:\n%%Copyright: Neither the name of Adobe Systems Incorporated nor the names\n%%Copyright: of its contributors may be used to endorse or promote\n%%Copyright: products derived from this software without specific prior\n%%Copyright: written permission. \n%%Copyright:\n%%Copyright: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n%%Copyright: CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n%%Copyright: INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n%%Copyright: MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n%%Copyright: DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n%%Copyright: CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n%%Copyright: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n%%Copyright: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n%%Copyright: LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n%%Copyright: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n%%Copyright: CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n%%Copyright: OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n%%Copyright: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n%%Copyright: -----------------------------------------------------------\n"
  },
  {
    "path": "lib/pdf.js/web/debugger.js",
    "content": "/* Copyright 2012 Mozilla Foundation\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/* eslint-disable no-var */\n\n\"use strict\";\n\nvar FontInspector = (function FontInspectorClosure() {\n  var fonts;\n  var active = false;\n  var fontAttribute = \"data-font-name\";\n  function removeSelection() {\n    const divs = document.querySelectorAll(`span[${fontAttribute}]`);\n    for (const div of divs) {\n      div.className = \"\";\n    }\n  }\n  function resetSelection() {\n    const divs = document.querySelectorAll(`span[${fontAttribute}]`);\n    for (const div of divs) {\n      div.className = \"debuggerHideText\";\n    }\n  }\n  function selectFont(fontName, show) {\n    const divs = document.querySelectorAll(\n      `span[${fontAttribute}=${fontName}]`\n    );\n    for (const div of divs) {\n      div.className = show ? \"debuggerShowText\" : \"debuggerHideText\";\n    }\n  }\n  function textLayerClick(e) {\n    if (\n      !e.target.dataset.fontName ||\n      e.target.tagName.toUpperCase() !== \"SPAN\"\n    ) {\n      return;\n    }\n    var fontName = e.target.dataset.fontName;\n    var selects = document.getElementsByTagName(\"input\");\n    for (var i = 0; i < selects.length; ++i) {\n      var select = selects[i];\n      if (select.dataset.fontName !== fontName) {\n        continue;\n      }\n      select.checked = !select.checked;\n      selectFont(fontName, select.checked);\n      select.scrollIntoView();\n    }\n  }\n  return {\n    // Properties/functions needed by PDFBug.\n    id: \"FontInspector\",\n    name: \"Font Inspector\",\n    panel: null,\n    manager: null,\n    init: function init(pdfjsLib) {\n      var panel = this.panel;\n      var tmp = document.createElement(\"button\");\n      tmp.addEventListener(\"click\", resetSelection);\n      tmp.textContent = \"Refresh\";\n      panel.appendChild(tmp);\n\n      fonts = document.createElement(\"div\");\n      panel.appendChild(fonts);\n    },\n    cleanup: function cleanup() {\n      fonts.textContent = \"\";\n    },\n    enabled: false,\n    get active() {\n      return active;\n    },\n    set active(value) {\n      active = value;\n      if (active) {\n        document.body.addEventListener(\"click\", textLayerClick, true);\n        resetSelection();\n      } else {\n        document.body.removeEventListener(\"click\", textLayerClick, true);\n        removeSelection();\n      }\n    },\n    // FontInspector specific functions.\n    fontAdded: function fontAdded(fontObj, url) {\n      function properties(obj, list) {\n        var moreInfo = document.createElement(\"table\");\n        for (var i = 0; i < list.length; i++) {\n          var tr = document.createElement(\"tr\");\n          var td1 = document.createElement(\"td\");\n          td1.textContent = list[i];\n          tr.appendChild(td1);\n          var td2 = document.createElement(\"td\");\n          td2.textContent = obj[list[i]].toString();\n          tr.appendChild(td2);\n          moreInfo.appendChild(tr);\n        }\n        return moreInfo;\n      }\n      var moreInfo = properties(fontObj, [\"name\", \"type\"]);\n      const fontName = fontObj.loadedName;\n      var font = document.createElement(\"div\");\n      var name = document.createElement(\"span\");\n      name.textContent = fontName;\n      var download = document.createElement(\"a\");\n      if (url) {\n        url = /url\\(['\"]?([^)\"']+)/.exec(url);\n        download.href = url[1];\n      } else if (fontObj.data) {\n        download.href = URL.createObjectURL(\n          new Blob([fontObj.data], { type: fontObj.mimeType })\n        );\n      }\n      download.textContent = \"Download\";\n      var logIt = document.createElement(\"a\");\n      logIt.href = \"\";\n      logIt.textContent = \"Log\";\n      logIt.addEventListener(\"click\", function (event) {\n        event.preventDefault();\n        console.log(fontObj);\n      });\n      const select = document.createElement(\"input\");\n      select.setAttribute(\"type\", \"checkbox\");\n      select.dataset.fontName = fontName;\n      select.addEventListener(\"click\", function () {\n        selectFont(fontName, select.checked);\n      });\n      font.appendChild(select);\n      font.appendChild(name);\n      font.appendChild(document.createTextNode(\" \"));\n      font.appendChild(download);\n      font.appendChild(document.createTextNode(\" \"));\n      font.appendChild(logIt);\n      font.appendChild(moreInfo);\n      fonts.appendChild(font);\n      // Somewhat of a hack, should probably add a hook for when the text layer\n      // is done rendering.\n      setTimeout(() => {\n        if (this.active) {\n          resetSelection();\n        }\n      }, 2000);\n    },\n  };\n})();\n\nvar opMap;\n\n// Manages all the page steppers.\nvar StepperManager = (function StepperManagerClosure() {\n  var steppers = [];\n  var stepperDiv = null;\n  var stepperControls = null;\n  var stepperChooser = null;\n  var breakPoints = Object.create(null);\n  return {\n    // Properties/functions needed by PDFBug.\n    id: \"Stepper\",\n    name: \"Stepper\",\n    panel: null,\n    manager: null,\n    init: function init(pdfjsLib) {\n      var self = this;\n      stepperControls = document.createElement(\"div\");\n      stepperChooser = document.createElement(\"select\");\n      stepperChooser.addEventListener(\"change\", function (event) {\n        self.selectStepper(this.value);\n      });\n      stepperControls.appendChild(stepperChooser);\n      stepperDiv = document.createElement(\"div\");\n      this.panel.appendChild(stepperControls);\n      this.panel.appendChild(stepperDiv);\n      if (sessionStorage.getItem(\"pdfjsBreakPoints\")) {\n        breakPoints = JSON.parse(sessionStorage.getItem(\"pdfjsBreakPoints\"));\n      }\n\n      opMap = Object.create(null);\n      for (var key in pdfjsLib.OPS) {\n        opMap[pdfjsLib.OPS[key]] = key;\n      }\n    },\n    cleanup: function cleanup() {\n      stepperChooser.textContent = \"\";\n      stepperDiv.textContent = \"\";\n      steppers = [];\n    },\n    enabled: false,\n    active: false,\n    // Stepper specific functions.\n    create: function create(pageIndex) {\n      var debug = document.createElement(\"div\");\n      debug.id = \"stepper\" + pageIndex;\n      debug.hidden = true;\n      debug.className = \"stepper\";\n      stepperDiv.appendChild(debug);\n      var b = document.createElement(\"option\");\n      b.textContent = \"Page \" + (pageIndex + 1);\n      b.value = pageIndex;\n      stepperChooser.appendChild(b);\n      var initBreakPoints = breakPoints[pageIndex] || [];\n      var stepper = new Stepper(debug, pageIndex, initBreakPoints);\n      steppers.push(stepper);\n      if (steppers.length === 1) {\n        this.selectStepper(pageIndex, false);\n      }\n      return stepper;\n    },\n    selectStepper: function selectStepper(pageIndex, selectPanel) {\n      var i;\n      pageIndex = pageIndex | 0;\n      if (selectPanel) {\n        this.manager.selectPanel(this);\n      }\n      for (i = 0; i < steppers.length; ++i) {\n        var stepper = steppers[i];\n        stepper.panel.hidden = stepper.pageIndex !== pageIndex;\n      }\n      var options = stepperChooser.options;\n      for (i = 0; i < options.length; ++i) {\n        var option = options[i];\n        option.selected = (option.value | 0) === pageIndex;\n      }\n    },\n    saveBreakPoints: function saveBreakPoints(pageIndex, bps) {\n      breakPoints[pageIndex] = bps;\n      sessionStorage.setItem(\"pdfjsBreakPoints\", JSON.stringify(breakPoints));\n    },\n  };\n})();\n\n// The stepper for each page's IRQueue.\nvar Stepper = (function StepperClosure() {\n  // Shorter way to create element and optionally set textContent.\n  function c(tag, textContent) {\n    var d = document.createElement(tag);\n    if (textContent) {\n      d.textContent = textContent;\n    }\n    return d;\n  }\n\n  function simplifyArgs(args) {\n    if (typeof args === \"string\") {\n      var MAX_STRING_LENGTH = 75;\n      return args.length <= MAX_STRING_LENGTH\n        ? args\n        : args.substring(0, MAX_STRING_LENGTH) + \"...\";\n    }\n    if (typeof args !== \"object\" || args === null) {\n      return args;\n    }\n    if (\"length\" in args) {\n      // array\n      var simpleArgs = [],\n        i,\n        ii;\n      var MAX_ITEMS = 10;\n      for (i = 0, ii = Math.min(MAX_ITEMS, args.length); i < ii; i++) {\n        simpleArgs.push(simplifyArgs(args[i]));\n      }\n      if (i < args.length) {\n        simpleArgs.push(\"...\");\n      }\n      return simpleArgs;\n    }\n    var simpleObj = {};\n    for (var key in args) {\n      simpleObj[key] = simplifyArgs(args[key]);\n    }\n    return simpleObj;\n  }\n\n  // eslint-disable-next-line no-shadow\n  function Stepper(panel, pageIndex, initialBreakPoints) {\n    this.panel = panel;\n    this.breakPoint = 0;\n    this.nextBreakPoint = null;\n    this.pageIndex = pageIndex;\n    this.breakPoints = initialBreakPoints;\n    this.currentIdx = -1;\n    this.operatorListIdx = 0;\n  }\n  Stepper.prototype = {\n    init: function init(operatorList) {\n      var panel = this.panel;\n      var content = c(\"div\", \"c=continue, s=step\");\n      var table = c(\"table\");\n      content.appendChild(table);\n      table.cellSpacing = 0;\n      var headerRow = c(\"tr\");\n      table.appendChild(headerRow);\n      headerRow.appendChild(c(\"th\", \"Break\"));\n      headerRow.appendChild(c(\"th\", \"Idx\"));\n      headerRow.appendChild(c(\"th\", \"fn\"));\n      headerRow.appendChild(c(\"th\", \"args\"));\n      panel.appendChild(content);\n      this.table = table;\n      this.updateOperatorList(operatorList);\n    },\n    updateOperatorList: function updateOperatorList(operatorList) {\n      var self = this;\n\n      function cboxOnClick() {\n        var x = +this.dataset.idx;\n        if (this.checked) {\n          self.breakPoints.push(x);\n        } else {\n          self.breakPoints.splice(self.breakPoints.indexOf(x), 1);\n        }\n        StepperManager.saveBreakPoints(self.pageIndex, self.breakPoints);\n      }\n\n      var MAX_OPERATORS_COUNT = 15000;\n      if (this.operatorListIdx > MAX_OPERATORS_COUNT) {\n        return;\n      }\n\n      var chunk = document.createDocumentFragment();\n      var operatorsToDisplay = Math.min(\n        MAX_OPERATORS_COUNT,\n        operatorList.fnArray.length\n      );\n      for (var i = this.operatorListIdx; i < operatorsToDisplay; i++) {\n        var line = c(\"tr\");\n        line.className = \"line\";\n        line.dataset.idx = i;\n        chunk.appendChild(line);\n        var checked = this.breakPoints.includes(i);\n        var args = operatorList.argsArray[i] || [];\n\n        var breakCell = c(\"td\");\n        var cbox = c(\"input\");\n        cbox.type = \"checkbox\";\n        cbox.className = \"points\";\n        cbox.checked = checked;\n        cbox.dataset.idx = i;\n        cbox.onclick = cboxOnClick;\n\n        breakCell.appendChild(cbox);\n        line.appendChild(breakCell);\n        line.appendChild(c(\"td\", i.toString()));\n        var fn = opMap[operatorList.fnArray[i]];\n        var decArgs = args;\n        if (fn === \"showText\") {\n          var glyphs = args[0];\n          var newArgs = [];\n          var str = [];\n          for (var j = 0; j < glyphs.length; j++) {\n            var glyph = glyphs[j];\n            if (typeof glyph === \"object\" && glyph !== null) {\n              str.push(glyph.fontChar);\n            } else {\n              if (str.length > 0) {\n                newArgs.push(str.join(\"\"));\n                str = [];\n              }\n              newArgs.push(glyph); // null or number\n            }\n          }\n          if (str.length > 0) {\n            newArgs.push(str.join(\"\"));\n          }\n          decArgs = [newArgs];\n        }\n        line.appendChild(c(\"td\", fn));\n        line.appendChild(c(\"td\", JSON.stringify(simplifyArgs(decArgs))));\n      }\n      if (operatorsToDisplay < operatorList.fnArray.length) {\n        var lastCell = c(\"td\", \"...\");\n        lastCell.colspan = 4;\n        chunk.appendChild(lastCell);\n      }\n      this.operatorListIdx = operatorList.fnArray.length;\n      this.table.appendChild(chunk);\n    },\n    getNextBreakPoint: function getNextBreakPoint() {\n      this.breakPoints.sort(function (a, b) {\n        return a - b;\n      });\n      for (var i = 0; i < this.breakPoints.length; i++) {\n        if (this.breakPoints[i] > this.currentIdx) {\n          return this.breakPoints[i];\n        }\n      }\n      return null;\n    },\n    breakIt: function breakIt(idx, callback) {\n      StepperManager.selectStepper(this.pageIndex, true);\n      var self = this;\n      var dom = document;\n      self.currentIdx = idx;\n      var listener = function (e) {\n        switch (e.keyCode) {\n          case 83: // step\n            dom.removeEventListener(\"keydown\", listener);\n            self.nextBreakPoint = self.currentIdx + 1;\n            self.goTo(-1);\n            callback();\n            break;\n          case 67: // continue\n            dom.removeEventListener(\"keydown\", listener);\n            var breakPoint = self.getNextBreakPoint();\n            self.nextBreakPoint = breakPoint;\n            self.goTo(-1);\n            callback();\n            break;\n        }\n      };\n      dom.addEventListener(\"keydown\", listener);\n      self.goTo(idx);\n    },\n    goTo: function goTo(idx) {\n      var allRows = this.panel.getElementsByClassName(\"line\");\n      for (var x = 0, xx = allRows.length; x < xx; ++x) {\n        var row = allRows[x];\n        if ((row.dataset.idx | 0) === idx) {\n          row.style.backgroundColor = \"rgb(251,250,207)\";\n          row.scrollIntoView();\n        } else {\n          row.style.backgroundColor = null;\n        }\n      }\n    },\n  };\n  return Stepper;\n})();\n\nvar Stats = (function Stats() {\n  var stats = [];\n  function clear(node) {\n    while (node.hasChildNodes()) {\n      node.removeChild(node.lastChild);\n    }\n  }\n  function getStatIndex(pageNumber) {\n    for (var i = 0, ii = stats.length; i < ii; ++i) {\n      if (stats[i].pageNumber === pageNumber) {\n        return i;\n      }\n    }\n    return false;\n  }\n  return {\n    // Properties/functions needed by PDFBug.\n    id: \"Stats\",\n    name: \"Stats\",\n    panel: null,\n    manager: null,\n    init(pdfjsLib) {},\n    enabled: false,\n    active: false,\n    // Stats specific functions.\n    add(pageNumber, stat) {\n      if (!stat) {\n        return;\n      }\n      var statsIndex = getStatIndex(pageNumber);\n      if (statsIndex !== false) {\n        const b = stats[statsIndex];\n        this.panel.removeChild(b.div);\n        stats.splice(statsIndex, 1);\n      }\n      var wrapper = document.createElement(\"div\");\n      wrapper.className = \"stats\";\n      var title = document.createElement(\"div\");\n      title.className = \"title\";\n      title.textContent = \"Page: \" + pageNumber;\n      var statsDiv = document.createElement(\"div\");\n      statsDiv.textContent = stat.toString();\n      wrapper.appendChild(title);\n      wrapper.appendChild(statsDiv);\n      stats.push({ pageNumber, div: wrapper });\n      stats.sort(function (a, b) {\n        return a.pageNumber - b.pageNumber;\n      });\n      clear(this.panel);\n      for (var i = 0, ii = stats.length; i < ii; ++i) {\n        this.panel.appendChild(stats[i].div);\n      }\n    },\n    cleanup() {\n      stats = [];\n      clear(this.panel);\n    },\n  };\n})();\n\n// Manages all the debugging tools.\nwindow.PDFBug = (function PDFBugClosure() {\n  var panelWidth = 300;\n  var buttons = [];\n  var activePanel = null;\n\n  return {\n    tools: [FontInspector, StepperManager, Stats],\n    enable(ids) {\n      var all = false,\n        tools = this.tools;\n      if (ids.length === 1 && ids[0] === \"all\") {\n        all = true;\n      }\n      for (var i = 0; i < tools.length; ++i) {\n        var tool = tools[i];\n        if (all || ids.includes(tool.id)) {\n          tool.enabled = true;\n        }\n      }\n      if (!all) {\n        // Sort the tools by the order they are enabled.\n        tools.sort(function (a, b) {\n          var indexA = ids.indexOf(a.id);\n          indexA = indexA < 0 ? tools.length : indexA;\n          var indexB = ids.indexOf(b.id);\n          indexB = indexB < 0 ? tools.length : indexB;\n          return indexA - indexB;\n        });\n      }\n    },\n    init(pdfjsLib, container) {\n      /*\n       * Basic Layout:\n       * PDFBug\n       *  Controls\n       *  Panels\n       *    Panel\n       *    Panel\n       *    ...\n       */\n      var ui = document.createElement(\"div\");\n      ui.id = \"PDFBug\";\n\n      var controls = document.createElement(\"div\");\n      controls.setAttribute(\"class\", \"controls\");\n      ui.appendChild(controls);\n\n      var panels = document.createElement(\"div\");\n      panels.setAttribute(\"class\", \"panels\");\n      ui.appendChild(panels);\n\n      container.appendChild(ui);\n      container.style.right = panelWidth + \"px\";\n\n      // Initialize all the debugging tools.\n      var tools = this.tools;\n      var self = this;\n      for (var i = 0; i < tools.length; ++i) {\n        var tool = tools[i];\n        var panel = document.createElement(\"div\");\n        var panelButton = document.createElement(\"button\");\n        panelButton.textContent = tool.name;\n        panelButton.addEventListener(\n          \"click\",\n          (function (selected) {\n            return function (event) {\n              event.preventDefault();\n              self.selectPanel(selected);\n            };\n          })(i)\n        );\n        controls.appendChild(panelButton);\n        panels.appendChild(panel);\n        tool.panel = panel;\n        tool.manager = this;\n        if (tool.enabled) {\n          tool.init(pdfjsLib);\n        } else {\n          panel.textContent =\n            tool.name +\n            \" is disabled. To enable add \" +\n            ' \"' +\n            tool.id +\n            '\" to the pdfBug parameter ' +\n            \"and refresh (separate multiple by commas).\";\n        }\n        buttons.push(panelButton);\n      }\n      this.selectPanel(0);\n    },\n    cleanup() {\n      for (var i = 0, ii = this.tools.length; i < ii; i++) {\n        if (this.tools[i].enabled) {\n          this.tools[i].cleanup();\n        }\n      }\n    },\n    selectPanel(index) {\n      if (typeof index !== \"number\") {\n        index = this.tools.indexOf(index);\n      }\n      if (index === activePanel) {\n        return;\n      }\n      activePanel = index;\n      var tools = this.tools;\n      for (var j = 0; j < tools.length; ++j) {\n        var isActive = j === index;\n        buttons[j].classList.toggle(\"active\", isActive);\n        tools[j].active = isActive;\n        tools[j].panel.hidden = !isActive;\n      }\n    },\n  };\n})();\n"
  },
  {
    "path": "lib/pdf.js/web/locale/ach/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pot buk mukato\nprevious_label=Mukato\nnext.title=Pot buk malubo\nnext_label=Malubo\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pot buk\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=pi {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} me {{pagesCount}})\n\nzoom_out.title=Jwik Matidi\nzoom_out_label=Jwik Matidi\nzoom_in.title=Kwot Madit\nzoom_in_label=Kwot Madit\nzoom.title=Kwoti\npresentation_mode.title=Lokke i kit me tyer\npresentation_mode_label=Kit me tyer\nopen_file.title=Yab Pwail\nopen_file_label=Yab\nprint.title=Go\nprint_label=Go\ndownload.title=Gam\ndownload_label=Gam\nbookmark.title=Neno ma kombedi (lok onyo yab i dirica manyen)\nbookmark_label=Neno ma kombedi\n\n# Secondary toolbar and context menu\ntools.title=Gintic\ntools_label=Gintic\nfirst_page.title=Cit i pot buk mukwongo\nfirst_page.label=Cit i pot buk mukwongo\nfirst_page_label=Cit i pot buk mukwongo\nlast_page.title=Cit i pot buk magiko\nlast_page.label=Cit i pot buk magiko\nlast_page_label=Cit i pot buk magiko\npage_rotate_cw.title=Wire i tung lacuc\npage_rotate_cw.label=Wire i tung lacuc\npage_rotate_cw_label=Wire i tung lacuc\npage_rotate_ccw.title=Wire i tung lacam\npage_rotate_ccw.label=Wire i tung lacam\npage_rotate_ccw_label=Wire i tung lacam\n\ncursor_text_select_tool.title=Cak gitic me yero coc\ncursor_text_select_tool_label=Gitic me yero coc\ncursor_hand_tool.title=Cak gitic me cing\ncursor_hand_tool_label=Gitic cing\n\n\n\n# Document properties dialog box\ndocument_properties.title=Jami me gin acoya…\ndocument_properties_label=Jami me gin acoya…\ndocument_properties_file_name=Nying pwail:\ndocument_properties_file_size=Dit pa pwail:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Wiye:\ndocument_properties_author=Ngat mucoyo:\ndocument_properties_subject=Subjek:\ndocument_properties_keywords=Lok mapire tek:\ndocument_properties_creation_date=Nino dwe me cwec:\ndocument_properties_modification_date=Nino dwe me yub:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Lacwec:\ndocument_properties_producer=Layub PDF:\ndocument_properties_version=Kit PDF:\ndocument_properties_page_count=Kwan me pot buk:\ndocument_properties_page_size=Dit pa potbuk:\ndocument_properties_page_size_unit_inches=i\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=atir\ndocument_properties_page_size_orientation_landscape=arii\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Waraga\ndocument_properties_page_size_name_legal=Cik\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized_yes=Eyo\ndocument_properties_linearized_no=Pe\ndocument_properties_close=Lor\n\nprint_progress_message=Yubo coc me agoya…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Juki\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Lok gintic ma inget\ntoggle_sidebar_notification.title=Lok lanyut me nget (wiyewiye tye i gin acoya/attachments)\ntoggle_sidebar_label=Lok gintic ma inget\ndocument_outline.title=Nyut Wiyewiye me Gin acoya (dii-kiryo me yaro/kano jami weng)\ndocument_outline_label=Pek pa gin acoya\nattachments.title=Nyut twec\nattachments_label=Twec\nthumbs.title=Nyut cal\nthumbs_label=Cal\nfindbar.title=Nong iye gin acoya\nfindbar_label=Nong\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pot buk {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Cal me pot buk {{page}}\n\n# Find panel button title and messages\nfind_input.title=Nong\nfind_input.placeholder=Nong i dokumen…\nfind_previous.title=Nong timme pa lok mukato\nfind_previous_label=Mukato\nfind_next.title=Nong timme pa lok malubo\nfind_next_label=Malubo\nfind_highlight=Wer weng\nfind_match_case_label=Lok marwate\nfind_reached_top=Oo iwi gin acoya, omede ki i tere\nfind_reached_bottom=Oo i agiki me gin acoya, omede ki iwiye\nfind_not_found=Lok pe ononge\n\n# Error panel labels\nerror_more_info=Ngec Mukene\nerror_less_info=Ngec Manok\nerror_close=Lor\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Kwena: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Can kikore {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Pwail: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rek: {{line}}\nrendering_error=Bal otime i kare me nyuto pot buk.\n\n# Predefined zoom values\npage_scale_width=Lac me iye pot buk\npage_scale_fit=Porre me pot buk\npage_scale_auto=Kwot pire kene\npage_scale_actual=Dite kikome\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Bal otime kun cano PDF.\ninvalid_file_error=Pwail me PDF ma pe atir onyo obale woko.\nmissing_file_error=Pwail me PDF tye ka rem.\nunexpected_response_error=Lagam mape kigeno pa lapok tic.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Lok angea manok]\npassword_label=Ket mung me donyo me yabo pwail me PDF man.\npassword_invalid=Mung me donyo pe atir. Tim ber i tem doki.\npassword_ok=OK\npassword_cancel=Juki\n\nprinting_not_supported=Ciko: Layeny ma pe teno goyo liweng.\nprinting_not_ready=Ciko: PDF pe ocane weng me agoya.\nweb_fonts_disabled=Kijuko dit pa coc me kakube woko: pe romo tic ki dit pa coc me PDF ma kiketo i kine.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/af/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Vorige bladsy\nprevious_label=Vorige\nnext.title=Volgende bladsy\nnext_label=Volgende\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Bladsy\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=van {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} van {{pagesCount}})\n\nzoom_out.title=Zoem uit\nzoom_out_label=Zoem uit\nzoom_in.title=Zoem in\nzoom_in_label=Zoem in\nzoom.title=Zoem\npresentation_mode.title=Wissel na voorleggingsmodus\npresentation_mode_label=Voorleggingsmodus\nopen_file.title=Open lêer\nopen_file_label=Open\nprint.title=Druk\nprint_label=Druk\ndownload.title=Laai af\ndownload_label=Laai af\nbookmark.title=Huidige aansig (kopieer of open in nuwe venster)\nbookmark_label=Huidige aansig\n\n# Secondary toolbar and context menu\ntools.title=Nutsgoed\ntools_label=Nutsgoed\nfirst_page.title=Gaan na eerste bladsy\nfirst_page.label=Gaan na eerste bladsy\nfirst_page_label=Gaan na eerste bladsy\nlast_page.title=Gaan na laaste bladsy\nlast_page.label=Gaan na laaste bladsy\nlast_page_label=Gaan na laaste bladsy\npage_rotate_cw.title=Roteer kloksgewys\npage_rotate_cw.label=Roteer kloksgewys\npage_rotate_cw_label=Roteer kloksgewys\npage_rotate_ccw.title=Roteer anti-kloksgewys\npage_rotate_ccw.label=Roteer anti-kloksgewys\npage_rotate_ccw_label=Roteer anti-kloksgewys\n\ncursor_text_select_tool.title=Aktiveer gereedskap om teks te merk\ncursor_text_select_tool_label=Teksmerkgereedskap\ncursor_hand_tool.title=Aktiveer handjie\ncursor_hand_tool_label=Handjie\n\n# Document properties dialog box\ndocument_properties.title=Dokumenteienskappe…\ndocument_properties_label=Dokumenteienskappe…\ndocument_properties_file_name=Lêernaam:\ndocument_properties_file_size=Lêergrootte:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kG ({{size_b}} grepe)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MG ({{size_b}} grepe)\ndocument_properties_title=Titel:\ndocument_properties_author=Outeur:\ndocument_properties_subject=Onderwerp:\ndocument_properties_keywords=Sleutelwoorde:\ndocument_properties_creation_date=Skeppingsdatum:\ndocument_properties_modification_date=Wysigingsdatum:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Skepper:\ndocument_properties_producer=PDF-vervaardiger:\ndocument_properties_version=PDF-weergawe:\ndocument_properties_page_count=Aantal bladsye:\ndocument_properties_close=Sluit\n\nprint_progress_message=Berei tans dokument voor om te druk…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Kanselleer\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Sypaneel aan/af\ntoggle_sidebar_notification.title=Sypaneel aan/af (dokument bevat skema/aanhegsels)\ntoggle_sidebar_label=Sypaneel aan/af\ndocument_outline.title=Wys dokumentskema (dubbelklik om alle items oop/toe te vou)\ndocument_outline_label=Dokumentoorsig\nattachments.title=Wys aanhegsels\nattachments_label=Aanhegsels\nthumbs.title=Wys duimnaels\nthumbs_label=Duimnaels\nfindbar.title=Soek in dokument\nfindbar_label=Vind\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Bladsy {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Duimnael van bladsy {{page}}\n\n# Find panel button title and messages\nfind_input.title=Vind\nfind_input.placeholder=Soek in dokument…\nfind_previous.title=Vind die vorige voorkoms van die frase\nfind_previous_label=Vorige\nfind_next.title=Vind die volgende voorkoms van die frase\nfind_next_label=Volgende\nfind_highlight=Verlig almal\nfind_match_case_label=Kassensitief\nfind_reached_top=Bokant van dokument is bereik; gaan voort van onder af\nfind_reached_bottom=Einde van dokument is bereik; gaan voort van bo af\nfind_not_found=Frase nie gevind nie\n\n# Error panel labels\nerror_more_info=Meer inligting\nerror_less_info=Minder inligting\nerror_close=Sluit\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (ID: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Boodskap: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stapel: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Lêer: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Lyn: {{line}}\nrendering_error='n Fout het voorgekom toe die bladsy weergegee is.\n\n# Predefined zoom values\npage_scale_width=Bladsywydte\npage_scale_fit=Pas bladsy\npage_scale_auto=Outomatiese zoem\npage_scale_actual=Werklike grootte\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error='n Fout het voorgekom met die laai van die PDF.\ninvalid_file_error=Ongeldige of korrupte PDF-lêer.\nmissing_file_error=PDF-lêer is weg.\nunexpected_response_error=Onverwagse antwoord van bediener.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}-annotasie]\npassword_label=Gee die wagwoord om dié PDF-lêer mee te open.\npassword_invalid=Ongeldige wagwoord. Probeer gerus weer.\npassword_ok=OK\npassword_cancel=Kanselleer\n\nprinting_not_supported=Waarskuwing: Dié blaaier ondersteun nie drukwerk ten volle nie.\nprinting_not_ready=Waarskuwing: Die PDF is nog nie volledig gelaai vir drukwerk nie.\nweb_fonts_disabled=Webfonte is gedeaktiveer: kan nie PDF-fonte wat ingebed is, gebruik nie.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/an/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pachina anterior\nprevious_label=Anterior\nnext.title=Pachina siguient\nnext_label=Siguient\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pachina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Achiquir\nzoom_out_label=Achiquir\nzoom_in.title=Agrandir\nzoom_in_label=Agrandir\nzoom.title=Grandaria\npresentation_mode.title=Cambear t'o modo de presentación\npresentation_mode_label=Modo de presentación\nopen_file.title=Ubrir o fichero\nopen_file_label=Ubrir\nprint.title=Imprentar\nprint_label=Imprentar\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar u ubrir en una nueva finestra)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Ferramientas\ntools_label=Ferramientas\nfirst_page.title=Ir ta la primer pachina\nfirst_page.label=Ir ta la primer pachina\nfirst_page_label=Ir ta la primer pachina\nlast_page.title=Ir ta la zaguer pachina\nlast_page.label=Ir ta la zaguera pachina\nlast_page_label=Ir ta la zaguer pachina\npage_rotate_cw.title=Chirar enta la dreita\npage_rotate_cw.label=Chirar enta la dreita\npage_rotate_cw_label=Chira enta la dreita\npage_rotate_ccw.title=Chirar enta la zurda\npage_rotate_ccw.label=Chirar en sentiu antihorario\npage_rotate_ccw_label=Chirar enta la zurda\n\ncursor_text_select_tool.title=Activar la ferramienta de selección de texto\ncursor_text_select_tool_label=Ferramienta de selección de texto\ncursor_hand_tool.title=Activar la ferramienta man\ncursor_hand_tool_label=Ferramienta man\n\nscroll_vertical.title=Usar lo desplazamiento vertical\nscroll_vertical_label=Desplazamiento vertical\nscroll_horizontal.title=Usar lo desplazamiento horizontal\nscroll_horizontal_label=Desplazamiento horizontal\nscroll_wrapped.title=Activaar lo desplazamiento contino\nscroll_wrapped_label=Desplazamiento contino\n\nspread_none.title=No unir vistas de pachinas\nspread_none_label=Una pachina nomás\nspread_odd.title=Mostrar vista de pachinas, con as impars a la zurda\nspread_odd_label=Doble pachina, impar a la zurda\nspread_even.title=Amostrar vista de pachinas, con as pars a la zurda\nspread_even_label=Doble pachina, para a la zurda\n\n# Document properties dialog box\ndocument_properties.title=Propiedatz d'o documento...\ndocument_properties_label=Propiedatz d'o documento...\ndocument_properties_file_name=Nombre de fichero:\ndocument_properties_file_size=Grandaria d'o fichero:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titol:\ndocument_properties_author=Autor:\ndocument_properties_subject=Afer:\ndocument_properties_keywords=Parolas clau:\ndocument_properties_creation_date=Calendata de creyación:\ndocument_properties_modification_date=Calendata de modificación:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creyador:\ndocument_properties_producer=Creyador de PDF:\ndocument_properties_version=Versión de PDF:\ndocument_properties_page_count=Numero de pachinas:\ndocument_properties_page_size=Mida de pachina:\ndocument_properties_page_size_unit_inches=pulgadas\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=vertical\ndocument_properties_page_size_orientation_landscape=horizontal\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Carta\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} x {{height}} {{unit}} {{orientation}}\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} x {{height}} {{unit}} {{name}}, {{orientation}}\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Vista web rapida:\ndocument_properties_linearized_yes=Sí\ndocument_properties_linearized_no=No\ndocument_properties_close=Zarrar\n\nprint_progress_message=Se ye preparando la documentación pa imprentar…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancelar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Amostrar u amagar a barra lateral\ntoggle_sidebar_notification.title=Cambiar barra lateral (lo documento contiene esquema/adchuntos)\ntoggle_sidebar_notification2.title=Cambiar barra lateral (lo documento contiene esquema/adchuntos/capas)\ntoggle_sidebar_label=Amostrar a barra lateral\ndocument_outline.title=Amostrar esquema d'o documento (fer doble clic pa expandir/compactar totz los items)\ndocument_outline_label=Esquema d'o documento\nattachments.title=Amostrar os adchuntos\nattachments_label=Adchuntos\nlayers.title=Amostrar capas (doble clic para reiniciar totas las capas a lo estau per defecto)\nlayers_label=Capas\nthumbs.title=Amostrar as miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Trobar en o documento\nfindbar_label=Trobar\n\nadditional_layers=Capas adicionals\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Pachina {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pachina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura d'a pachina {{page}}\n\n# Find panel button title and messages\nfind_input.title=Trobar\nfind_input.placeholder=Trobar en o documento…\nfind_previous.title=Trobar l'anterior coincidencia d'a frase\nfind_previous_label=Anterior\nfind_next.title=Trobar a siguient coincidencia d'a frase\nfind_next_label=Siguient\nfind_highlight=Resaltar-lo tot\nfind_match_case_label=Coincidencia de mayusclas/minusclas\nfind_entire_word_label=Parolas completas\nfind_reached_top=S'ha plegau a l'inicio d'o documento, se contina dende baixo\nfind_reached_bottom=S'ha plegau a la fin d'o documento, se contina dende alto\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} de {{total}} coincidencia\nfind_match_count[two]={{current}} de {{total}} coincidencias\nfind_match_count[few]={{current}} de {{total}} coincidencias\nfind_match_count[many]={{current}} de {{total}} coincidencias\nfind_match_count[other]={{current}} de {{total}} coincidencias\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Mas de {{limit}} coincidencias\nfind_match_count_limit[one]=Mas de {{limit}} coincidencias\nfind_match_count_limit[two]=Mas que {{limit}} coincidencias\nfind_match_count_limit[few]=Mas que {{limit}} coincidencias\nfind_match_count_limit[many]=Mas que {{limit}} coincidencias\nfind_match_count_limit[other]=Mas que {{limit}} coincidencias\nfind_not_found=No s'ha trobau a frase\n\n# Error panel labels\nerror_more_info=Mas información\nerror_less_info=Menos información\nerror_close=Zarrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensache: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fichero: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linia: {{line}}\nrendering_error=Ha ocurriu una error en renderizar a pachina.\n\n# Predefined zoom values\npage_scale_width=Amplaria d'a pachina\npage_scale_fit=Achuste d'a pachina\npage_scale_auto=Grandaria automatica\npage_scale_actual=Grandaria actual\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=S'ha produciu una error en cargar o PDF.\ninvalid_file_error=O PDF no ye valido u ye estorbau.\nmissing_file_error=No i ha fichero PDF.\nunexpected_response_error=Respuesta a lo servicio inasperada.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotación {{type}}]\npassword_label=Introduzca a clau ta ubrir iste fichero PDF.\npassword_invalid=Clau invalida. Torna a intentar-lo.\npassword_ok=Acceptar\npassword_cancel=Cancelar\n\nprinting_not_supported=Pare cuenta: Iste navegador no maneya totalment as impresions.\nprinting_not_ready=Aviso: Encara no se ha cargau completament o PDF ta imprentar-lo.\nweb_fonts_disabled=As fuents web son desactivadas: no se puet incrustar fichers PDF.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/ar/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=الصفحة السابقة\nprevious_label=السابقة\nnext.title=الصفحة التالية\nnext_label=التالية\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=صفحة\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=من {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} من {{pagesCount}})\n\nzoom_out.title=بعّد\nzoom_out_label=بعّد\nzoom_in.title=قرّب\nzoom_in_label=قرّب\nzoom.title=التقريب\npresentation_mode.title=انتقل لوضع العرض التقديمي\npresentation_mode_label=وضع العرض التقديمي\nopen_file.title=افتح ملفًا\nopen_file_label=افتح\nprint.title=اطبع\nprint_label=اطبع\ndownload.title=نزّل\ndownload_label=نزّل\nbookmark.title=المنظور الحالي (انسخ أو افتح في نافذة جديدة)\nbookmark_label=المنظور الحالي\n\n# Secondary toolbar and context menu\ntools.title=الأدوات\ntools_label=الأدوات\nfirst_page.title=انتقل إلى الصفحة الأولى\nfirst_page.label=انتقل إلى الصفحة الأولى\nfirst_page_label=انتقل إلى الصفحة الأولى\nlast_page.title=انتقل إلى الصفحة الأخيرة\nlast_page.label=انتقل إلى الصفحة الأخيرة\nlast_page_label=انتقل إلى الصفحة الأخيرة\npage_rotate_cw.title=أدر باتجاه عقارب الساعة\npage_rotate_cw.label=أدر باتجاه عقارب الساعة\npage_rotate_cw_label=أدر باتجاه عقارب الساعة\npage_rotate_ccw.title=أدر بعكس اتجاه عقارب الساعة\npage_rotate_ccw.label=أدر بعكس اتجاه عقارب الساعة\npage_rotate_ccw_label=أدر بعكس اتجاه عقارب الساعة\n\ncursor_text_select_tool.title=فعّل أداة اختيار النص\ncursor_text_select_tool_label=أداة اختيار النص\ncursor_hand_tool.title=فعّل أداة اليد\ncursor_hand_tool_label=أداة اليد\n\nscroll_vertical.title=استخدم التمرير الرأسي\nscroll_vertical_label=التمرير الرأسي\nscroll_horizontal.title=استخدم التمرير الأفقي\nscroll_horizontal_label=التمرير الأفقي\nscroll_wrapped.title=استخدم التمرير الملتف\nscroll_wrapped_label=التمرير الملتف\n\nspread_none.title=لا تدمج هوامش الصفحات مع بعضها البعض\nspread_none_label=بلا هوامش\nspread_odd.title=ادمج هوامش الصفحات الفردية\nspread_odd_label=هوامش الصفحات الفردية\nspread_even.title=ادمج هوامش الصفحات الزوجية\nspread_even_label=هوامش الصفحات الزوجية\n\n# Document properties dialog box\ndocument_properties.title=خصائص المستند…\ndocument_properties_label=خصائص المستند…\ndocument_properties_file_name=اسم الملف:\ndocument_properties_file_size=حجم الملف:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} ك.بايت ({{size_b}} بايت)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} م.بايت ({{size_b}} بايت)\ndocument_properties_title=العنوان:\ndocument_properties_author=المؤلف:\ndocument_properties_subject=الموضوع:\ndocument_properties_keywords=الكلمات الأساسية:\ndocument_properties_creation_date=تاريخ الإنشاء:\ndocument_properties_modification_date=تاريخ التعديل:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}، {{time}}\ndocument_properties_creator=المنشئ:\ndocument_properties_producer=منتج PDF:\ndocument_properties_version=إصدارة PDF:\ndocument_properties_page_count=عدد الصفحات:\ndocument_properties_page_size=مقاس الورقة:\ndocument_properties_page_size_unit_inches=بوصة\ndocument_properties_page_size_unit_millimeters=ملم\ndocument_properties_page_size_orientation_portrait=طوليّ\ndocument_properties_page_size_orientation_landscape=عرضيّ\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=خطاب\ndocument_properties_page_size_name_legal=قانونيّ\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string=‏{{width}} × ‏{{height}} ‏{{unit}} (‏{{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string=‏{{width}} × ‏{{height}} ‏{{unit}} (‏{{name}}، {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=العرض السريع عبر الوِب:\ndocument_properties_linearized_yes=نعم\ndocument_properties_linearized_no=لا\ndocument_properties_close=أغلق\n\nprint_progress_message=يُحضّر المستند للطباعة…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}٪\nprint_progress_close=ألغِ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=بدّل ظهور الشريط الجانبي\ntoggle_sidebar_notification.title=بدّل ظهور الشريط الجانبي (يحتوي المستند على مخطط أو مرفقات)\ntoggle_sidebar_notification2.title=بدّل ظهور الشريط الجانبي (يحتوي المستند على مخطط أو مرفقات أو طبقات)\ntoggle_sidebar_label=بدّل ظهور الشريط الجانبي\ndocument_outline.title=اعرض فهرس المستند (نقر مزدوج لتمديد أو تقليص كل العناصر)\ndocument_outline_label=مخطط المستند\nattachments.title=اعرض المرفقات\nattachments_label=المُرفقات\nlayers.title=اعرض الطبقات (انقر مرتين لتصفير كل الطبقات إلى الحالة المبدئية)\nlayers_label=‏‏الطبقات\nthumbs.title=اعرض مُصغرات\nthumbs_label=مُصغّرات\nfindbar.title=ابحث في المستند\nfindbar_label=ابحث\n\nadditional_layers=الطبقات الإضافية\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=صفحة {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=صفحة {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=مصغّرة صفحة {{page}}\n\n# Find panel button title and messages\nfind_input.title=ابحث\nfind_input.placeholder=ابحث في المستند…\nfind_previous.title=ابحث عن التّواجد السّابق للعبارة\nfind_previous_label=السابق\nfind_next.title=ابحث عن التّواجد التّالي للعبارة\nfind_next_label=التالي\nfind_highlight=أبرِز الكل\nfind_match_case_label=طابق حالة الأحرف\nfind_entire_word_label=كلمات كاملة\nfind_reached_top=تابعت من الأسفل بعدما وصلت إلى بداية المستند\nfind_reached_bottom=تابعت من الأعلى بعدما وصلت إلى نهاية المستند\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} من أصل مطابقة واحدة\nfind_match_count[two]={{current}} من أصل مطابقتين\nfind_match_count[few]={{current}} من أصل {{total}} مطابقات\nfind_match_count[many]={{current}} من أصل {{total}} مطابقة\nfind_match_count[other]={{current}} من أصل {{total}} مطابقة\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=فقط\nfind_match_count_limit[one]=أكثر من مطابقة واحدة\nfind_match_count_limit[two]=أكثر من مطابقتين\nfind_match_count_limit[few]=أكثر من {{limit}} مطابقات\nfind_match_count_limit[many]=أكثر من {{limit}} مطابقة\nfind_match_count_limit[other]=أكثر من {{limit}} مطابقة\nfind_not_found=لا وجود للعبارة\n\n# Error panel labels\nerror_more_info=معلومات أكثر\nerror_less_info=معلومات أقل\nerror_close=أغلق\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=‏PDF.js ن{{version}} ‏(بناء: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=الرسالة: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=الرصّة: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=الملف: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=السطر: {{line}}\nrendering_error=حدث خطأ أثناء عرض الصفحة.\n\n# Predefined zoom values\npage_scale_width=عرض الصفحة\npage_scale_fit=ملائمة الصفحة\npage_scale_auto=تقريب تلقائي\npage_scale_actual=الحجم الفعلي\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}٪\n\n# Loading indicator messages\nloading_error=حدث عطل أثناء تحميل ملف PDF.\ninvalid_file_error=ملف PDF تالف أو غير صحيح.\nmissing_file_error=ملف PDF غير موجود.\nunexpected_response_error=استجابة خادوم غير متوقعة.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}، {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[تعليق {{type}}]\npassword_label=أدخل لكلمة السر لفتح هذا الملف.\npassword_invalid=كلمة سر خطأ. من فضلك أعد المحاولة.\npassword_ok=حسنا\npassword_cancel=ألغِ\n\nprinting_not_supported=تحذير: لا يدعم هذا المتصفح الطباعة بشكل كامل.\nprinting_not_ready=تحذير: ملف PDF لم يُحمّل كاملًا للطباعة.\nweb_fonts_disabled=خطوط الوب مُعطّلة: تعذّر استخدام خطوط PDF المُضمّنة.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/ast/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Páxina anterior\nprevious_label=Anterior\nnext.title=Páxina siguiente\nnext_label=Siguiente\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Páxina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Ferramientes\ntools_label=Ferramientes\n\n\nscroll_vertical_label=Desplazamientu vertical\nscroll_horizontal_label=Desplazamientu horizontal\nscroll_wrapped_label=Desplazamientu continuu\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=vertical\ndocument_properties_page_size_orientation_landscape=horizontal\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized_yes=Sí\ndocument_properties_linearized_no=Non\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\n\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\n\n# Find panel button title and messages\nfind_entire_word_label=Pallabres completes\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit[zero]=Más de {{limit}} coincidencies\nfind_match_count_limit[one]=Más de {{limit}} coincidencia\nfind_match_count_limit[two]=Más de {{limit}} coincidencies\nfind_match_count_limit[few]=Más de {{limit}} coincidencies\nfind_match_count_limit[many]=Más de {{limit}} coincidencies\nfind_match_count_limit[other]=Más de {{limit}} coincidencies\n\n# Error panel labels\nerror_more_info=Más información\nerror_less_info=Menos información\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (compilación: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensaxe: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ficheru: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Llinia: {{line}}\n\n# Predefined zoom values\npage_scale_auto=Zoom automáticu\npage_scale_actual=Tamañu real\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Asocedió un fallu mentanto se cargaba'l PDF.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\npassword_ok=Aceptar\npassword_cancel=Encaboxar\n\n"
  },
  {
    "path": "lib/pdf.js/web/locale/az/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Əvvəlki səhifə\nprevious_label=Əvvəlkini tap\nnext.title=Növbəti səhifə\nnext_label=İrəli\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Səhifə\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} / {{pagesCount}})\n\nzoom_out.title=Uzaqlaş\nzoom_out_label=Uzaqlaş\nzoom_in.title=Yaxınlaş\nzoom_in_label=Yaxınlaş\nzoom.title=Yaxınlaşdırma\npresentation_mode.title=Təqdimat Rejiminə Keç\npresentation_mode_label=Təqdimat Rejimi\nopen_file.title=Fayl Aç\nopen_file_label=Aç\nprint.title=Yazdır\nprint_label=Yazdır\ndownload.title=Endir\ndownload_label=Endir\nbookmark.title=Hazırkı görünüş (köçür və ya yeni pəncərədə aç)\nbookmark_label=Hazırkı görünüş\n\n# Secondary toolbar and context menu\ntools.title=Alətlər\ntools_label=Alətlər\nfirst_page.title=İlk Səhifəyə get\nfirst_page.label=İlk Səhifəyə get\nfirst_page_label=İlk Səhifəyə get\nlast_page.title=Son Səhifəyə get\nlast_page.label=Son Səhifəyə get\nlast_page_label=Son Səhifəyə get\npage_rotate_cw.title=Saat İstiqamətində Fırlat\npage_rotate_cw.label=Saat İstiqamətində Fırlat\npage_rotate_cw_label=Saat İstiqamətində Fırlat\npage_rotate_ccw.title=Saat İstiqamətinin Əksinə Fırlat\npage_rotate_ccw.label=Saat İstiqamətinin Əksinə Fırlat\npage_rotate_ccw_label=Saat İstiqamətinin Əksinə Fırlat\n\ncursor_text_select_tool.title=Yazı seçmə alətini aktivləşdir\ncursor_text_select_tool_label=Yazı seçmə aləti\ncursor_hand_tool.title=Əl alətini aktivləşdir\ncursor_hand_tool_label=Əl aləti\n\nscroll_vertical.title=Şaquli sürüşdürmə işlət\nscroll_vertical_label=Şaquli sürüşdürmə\nscroll_horizontal.title=Üfüqi sürüşdürmə işlət\nscroll_horizontal_label=Üfüqi sürüşdürmə\nscroll_wrapped.title=Bükülü sürüşdürmə işlət\nscroll_wrapped_label=Bükülü sürüşdürmə\n\nspread_none.title=Yan-yana birləşdirilmiş səhifələri işlətmə\nspread_none_label=Birləşdirmə\nspread_odd.title=Yan-yana birləşdirilmiş səhifələri tək nömrəli səhifələrdən başlat\nspread_odd_label=Tək nömrəli\nspread_even.title=Yan-yana birləşdirilmiş səhifələri cüt nömrəli səhifələrdən başlat\nspread_even_label=Cüt nömrəli\n\n# Document properties dialog box\ndocument_properties.title=Sənəd xüsusiyyətləri…\ndocument_properties_label=Sənəd xüsusiyyətləri…\ndocument_properties_file_name=Fayl adı:\ndocument_properties_file_size=Fayl ölçüsü:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bayt)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bayt)\ndocument_properties_title=Başlık:\ndocument_properties_author=Müəllif:\ndocument_properties_subject=Mövzu:\ndocument_properties_keywords=Açar sözlər:\ndocument_properties_creation_date=Yaradılış Tarixi :\ndocument_properties_modification_date=Dəyişdirilmə Tarixi :\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Yaradan:\ndocument_properties_producer=PDF yaradıcısı:\ndocument_properties_version=PDF versiyası:\ndocument_properties_page_count=Səhifə sayı:\ndocument_properties_page_size=Səhifə Ölçüsü:\ndocument_properties_page_size_unit_inches=inç\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=portret\ndocument_properties_page_size_orientation_landscape=albom\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Məktub\ndocument_properties_page_size_name_legal=Hüquqi\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Fast Web View:\ndocument_properties_linearized_yes=Bəli\ndocument_properties_linearized_no=Xeyr\ndocument_properties_close=Qapat\n\nprint_progress_message=Sənəd çap üçün hazırlanır…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Ləğv et\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Yan Paneli Aç/Bağla\ntoggle_sidebar_notification.title=Yan paneli çevir (sənəddə icmal/bağlama var)\ntoggle_sidebar_notification2.title=Yan paneli çevir (sənəddə icmal/bağlamalar/laylar mövcuddur)\ntoggle_sidebar_label=Yan Paneli Aç/Bağla\ndocument_outline.title=Sənədin eskizini göstər (bütün bəndləri açmaq/yığmaq üçün iki dəfə klikləyin)\ndocument_outline_label=Sənəd strukturu\nattachments.title=Bağlamaları göstər\nattachments_label=Bağlamalar\nlayers.title=Layları göstər (bütün layları ilkin halına sıfırlamaq üçün iki dəfə klikləyin)\nlayers_label=Laylar\nthumbs.title=Kiçik şəkilləri göstər\nthumbs_label=Kiçik şəkillər\nfindbar.title=Sənəddə Tap\nfindbar_label=Tap\n\nadditional_layers=Əlavə laylar\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Səhifə {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Səhifə{{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} səhifəsinin kiçik vəziyyəti\n\n# Find panel button title and messages\nfind_input.title=Tap\nfind_input.placeholder=Sənəddə tap…\nfind_previous.title=Bir öncəki uyğun gələn sözü tapır\nfind_previous_label=Geri\nfind_next.title=Bir sonrakı uyğun gələn sözü tapır\nfind_next_label=İrəli\nfind_highlight=İşarələ\nfind_match_case_label=Böyük/kiçik hərfə həssaslıq\nfind_entire_word_label=Tam sözlər\nfind_reached_top=Sənədin yuxarısına çatdı, aşağıdan davam edir\nfind_reached_bottom=Sənədin sonuna çatdı, yuxarıdan davam edir\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} / {{total}} uyğunluq\nfind_match_count[two]={{current}} / {{total}} uyğunluq\nfind_match_count[few]={{current}} / {{total}} uyğunluq\nfind_match_count[many]={{current}} / {{total}} uyğunluq\nfind_match_count[other]={{current}} / {{total}} uyğunluq\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]={{limit}}-dan çox uyğunluq\nfind_match_count_limit[one]={{limit}}-dən çox uyğunluq\nfind_match_count_limit[two]={{limit}}-dən çox uyğunluq\nfind_match_count_limit[few]={{limit}} uyğunluqdan daha çox\nfind_match_count_limit[many]={{limit}} uyğunluqdan daha çox\nfind_match_count_limit[other]={{limit}} uyğunluqdan daha çox\nfind_not_found=Uyğunlaşma tapılmadı\n\n# Error panel labels\nerror_more_info=Daha çox məlumati\nerror_less_info=Daha az məlumat\nerror_close=Qapat\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (yığma: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=İsmarıc: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stek: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fayl: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Sətir: {{line}}\nrendering_error=Səhifə göstərilərkən səhv yarandı.\n\n# Predefined zoom values\npage_scale_width=Səhifə genişliyi\npage_scale_fit=Səhifəni sığdır\npage_scale_auto=Avtomatik yaxınlaşdır\npage_scale_actual=Hazırkı Həcm\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=PDF yüklenərkən bir səhv yarandı.\ninvalid_file_error=Səhv və ya zədələnmiş olmuş PDF fayl.\nmissing_file_error=PDF fayl yoxdur.\nunexpected_response_error=Gözlənilməz server cavabı.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotasiyası]\npassword_label=Bu PDF faylı açmaq üçün parolu daxil edin.\npassword_invalid=Parol səhvdir. Bir daha yoxlayın.\npassword_ok=Tamam\npassword_cancel=Ləğv et\n\nprinting_not_supported=Xəbərdarlıq: Çap bu səyyah tərəfindən tam olaraq dəstəklənmir.\nprinting_not_ready=Xəbərdarlıq: PDF çap üçün tam yüklənməyib.\nweb_fonts_disabled=Web Şriftlər söndürülüb: yerləşdirilmiş PDF şriftlərini istifadə etmək mümkün deyil.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/be/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Папярэдняя старонка\nprevious_label=Папярэдняя\nnext.title=Наступная старонка\nnext_label=Наступная\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Старонка\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=з {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} з {{pagesCount}})\n\nzoom_out.title=Паменшыць\nzoom_out_label=Паменшыць\nzoom_in.title=Павялічыць\nzoom_in_label=Павялічыць\nzoom.title=Павялічэнне тэксту\npresentation_mode.title=Пераключыцца ў рэжым паказу\npresentation_mode_label=Рэжым паказу\nopen_file.title=Адкрыць файл\nopen_file_label=Адкрыць\nprint.title=Друкаваць\nprint_label=Друкаваць\ndownload.title=Сцягнуць\ndownload_label=Сцягнуць\nbookmark.title=Цяперашняя праява (скапіяваць або адчыніць у новым акне)\nbookmark_label=Цяперашняя праява\n\n# Secondary toolbar and context menu\ntools.title=Прылады\ntools_label=Прылады\nfirst_page.title=Перайсці на першую старонку\nfirst_page.label=Перайсці на першую старонку\nfirst_page_label=Перайсці на першую старонку\nlast_page.title=Перайсці на апошнюю старонку\nlast_page.label=Перайсці на апошнюю старонку\nlast_page_label=Перайсці на апошнюю старонку\npage_rotate_cw.title=Павярнуць па сонцу\npage_rotate_cw.label=Павярнуць па сонцу\npage_rotate_cw_label=Павярнуць па сонцу\npage_rotate_ccw.title=Павярнуць супраць сонца\npage_rotate_ccw.label=Павярнуць супраць сонца\npage_rotate_ccw_label=Павярнуць супраць сонца\n\ncursor_text_select_tool.title=Уключыць прыладу выбару тэксту\ncursor_text_select_tool_label=Прылада выбару тэксту\ncursor_hand_tool.title=Уключыць ручную прыладу\ncursor_hand_tool_label=Ручная прылада\n\nscroll_vertical.title=Ужываць вертыкальную пракрутку\nscroll_vertical_label=Вертыкальная пракрутка\nscroll_horizontal.title=Ужываць гарызантальную пракрутку\nscroll_horizontal_label=Гарызантальная пракрутка\nscroll_wrapped.title=Ужываць маштабавальную пракрутку\nscroll_wrapped_label=Маштабавальная пракрутка\n\nspread_none.title=Не выкарыстоўваць разгорнутыя старонкі\nspread_none_label=Без разгорнутых старонак\nspread_odd.title=Разгорнутыя старонкі пачынаючы з няцотных нумароў\nspread_odd_label=Няцотныя старонкі злева\nspread_even.title=Разгорнутыя старонкі пачынаючы з цотных нумароў\nspread_even_label=Цотныя старонкі злева\n\n# Document properties dialog box\ndocument_properties.title=Уласцівасці дакумента…\ndocument_properties_label=Уласцівасці дакумента…\ndocument_properties_file_name=Назва файла:\ndocument_properties_file_size=Памер файла:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} КБ ({{size_b}} байт)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} МБ ({{size_b}} байт)\ndocument_properties_title=Загаловак:\ndocument_properties_author=Аўтар:\ndocument_properties_subject=Тэма:\ndocument_properties_keywords=Ключавыя словы:\ndocument_properties_creation_date=Дата стварэння:\ndocument_properties_modification_date=Дата змянення:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Стваральнік:\ndocument_properties_producer=Вырабнік PDF:\ndocument_properties_version=Версія PDF:\ndocument_properties_page_count=Колькасць старонак:\ndocument_properties_page_size=Памер старонкі:\ndocument_properties_page_size_unit_inches=цаляў\ndocument_properties_page_size_unit_millimeters=мм\ndocument_properties_page_size_orientation_portrait=кніжная\ndocument_properties_page_size_orientation_landscape=альбомная\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Хуткі прагляд у Інтэрнэце:\ndocument_properties_linearized_yes=Так\ndocument_properties_linearized_no=Не\ndocument_properties_close=Закрыць\n\nprint_progress_message=Падрыхтоўка дакумента да друку…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Скасаваць\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Паказаць/схаваць бакавую панэль\ntoggle_sidebar_notification.title=Паказаць/схаваць бакавую панэль (дакумент мае змест/укладанні)\ntoggle_sidebar_notification2.title=Паказаць/схаваць бакавую панэль (дакумент мае змест/укладанні/пласты)\ntoggle_sidebar_label=Паказаць/схаваць бакавую панэль\ndocument_outline.title=Паказаць структуру дакумента (двайная пстрычка, каб разгарнуць /згарнуць усе элементы)\ndocument_outline_label=Структура дакумента\nattachments.title=Паказаць далучэнні\nattachments_label=Далучэнні\nlayers.title=Паказаць пласты (двойчы пстрыкніце, каб скінуць усе пласты да прадвызначанага стану)\nlayers_label=Пласты\nthumbs.title=Паказ мініяцюр\nthumbs_label=Мініяцюры\ncurrent_outline_item.title=Знайсці бягучы элемент структуры\ncurrent_outline_item_label=Бягучы элемент структуры\nfindbar.title=Пошук у дакуменце\nfindbar_label=Знайсці\n\nadditional_layers=Дадатковыя пласты\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Старонка {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Старонка {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Мініяцюра старонкі {{page}}\n\n# Find panel button title and messages\nfind_input.title=Шукаць\nfind_input.placeholder=Шукаць у дакуменце…\nfind_previous.title=Знайсці папярэдні выпадак выразу\nfind_previous_label=Папярэдні\nfind_next.title=Знайсці наступны выпадак выразу\nfind_next_label=Наступны\nfind_highlight=Падфарбаваць усе\nfind_match_case_label=Адрозніваць вялікія/малыя літары\nfind_entire_word_label=Словы цалкам\nfind_reached_top=Дасягнуты пачатак дакумента, працяг з канца\nfind_reached_bottom=Дасягнуты канец дакумента, працяг з пачатку\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} з {{total}} супадзення\nfind_match_count[two]={{current}} з {{total}} супадзенняў\nfind_match_count[few]={{current}} з {{total}} супадзенняў\nfind_match_count[many]={{current}} з {{total}} супадзенняў\nfind_match_count[other]={{current}} з {{total}} супадзенняў\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Больш за {{limit}} супадзенняў\nfind_match_count_limit[one]=Больш за {{limit}} супадзенне\nfind_match_count_limit[two]=Больш за {{limit}} супадзенняў\nfind_match_count_limit[few]=Больш за {{limit}} супадзенняў\nfind_match_count_limit[many]=Больш за {{limit}} супадзенняў\nfind_match_count_limit[other]=Больш за {{limit}} супадзенняў\nfind_not_found=Выраз не знойдзены\n\n# Error panel labels\nerror_more_info=Падрабязней\nerror_less_info=Сцісла\nerror_close=Закрыць\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js в{{version}} (зборка: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Паведамленне: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стос: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Файл: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Радок: {{line}}\nrendering_error=Здарылася памылка падчас адлюстравання старонкі.\n\n# Predefined zoom values\npage_scale_width=Шырыня старонкі\npage_scale_fit=Уцісненне старонкі\npage_scale_auto=Аўтаматычнае павелічэнне\npage_scale_actual=Сапраўдны памер\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Здарылася памылка падчас загрузкі PDF.\ninvalid_file_error=Няспраўны або пашкоджаны файл PDF.\nmissing_file_error=Адсутны файл PDF.\nunexpected_response_error=Нечаканы адказ сервера.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Увядзіце пароль, каб адкрыць гэты файл PDF.\npassword_invalid=Нядзейсны пароль. Паспрабуйце зноў.\npassword_ok=Добра\npassword_cancel=Скасаваць\n\nprinting_not_supported=Папярэджанне: друк не падтрымліваецца цалкам гэтым браўзерам.\nprinting_not_ready=Увага: PDF не сцягнуты цалкам для друкавання.\nweb_fonts_disabled=Шрыфты Сеціва забаронены: немагчыма ўжываць укладзеныя шрыфты PDF.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/bg/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Предишна страница\nprevious_label=Предишна\nnext.title=Следваща страница\nnext_label=Следваща\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Страница\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=от {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} от {{pagesCount}})\n\nzoom_out.title=Намаляване\nzoom_out_label=Намаляване\nzoom_in.title=Увеличаване\nzoom_in_label=Увеличаване\nzoom.title=Мащабиране\npresentation_mode.title=Превключване към режим на представяне\npresentation_mode_label=Режим на представяне\nopen_file.title=Отваряне на файл\nopen_file_label=Отваряне\nprint.title=Отпечатване\nprint_label=Отпечатване\ndownload.title=Изтегляне\ndownload_label=Изтегляне\nbookmark.title=Текущ изглед (копиране или отваряне в нов прозорец)\nbookmark_label=Текущ изглед\n\n# Secondary toolbar and context menu\ntools.title=Инструменти\ntools_label=Инструменти\nfirst_page.title=Към първата страница\nfirst_page.label=Към първата страница\nfirst_page_label=Към първата страница\nlast_page.title=Към последната страница\nlast_page.label=Към последната страница\nlast_page_label=Към последната страница\npage_rotate_cw.title=Завъртане по час. стрелка\npage_rotate_cw.label=Завъртане по часовниковата стрелка\npage_rotate_cw_label=Завъртане по часовниковата стрелка\npage_rotate_ccw.title=Завъртане обратно на час. стрелка\npage_rotate_ccw.label=Завъртане обратно на часовниковата стрелка\npage_rotate_ccw_label=Завъртане обратно на часовниковата стрелка\n\ncursor_text_select_tool.title=Включване на инструмента за избор на текст\ncursor_text_select_tool_label=Инструмент за избор на текст\ncursor_hand_tool.title=Включване на инструмента ръка\ncursor_hand_tool_label=Инструмент ръка\n\nscroll_vertical.title=Използване на вертикално плъзгане\nscroll_vertical_label=Вертикално плъзгане\nscroll_horizontal.title=Използване на хоризонтално\nscroll_horizontal_label=Хоризонтално плъзгане\nscroll_wrapped.title=Използване на мащабируемо плъзгане\nscroll_wrapped_label=Мащабируемо плъзгане\n\nspread_none.title=Режимът на сдвояване е изключен\nspread_none_label=Без сдвояване\nspread_odd.title=Сдвояване, започвайки от нечетните страници\nspread_odd_label=Нечетните отляво\nspread_even.title=Сдвояване, започвайки от четните страници\nspread_even_label=Четните отляво\n\n# Document properties dialog box\ndocument_properties.title=Свойства на документа…\ndocument_properties_label=Свойства на документа…\ndocument_properties_file_name=Име на файл:\ndocument_properties_file_size=Големина на файл:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} КБ ({{size_b}} байта)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} МБ ({{size_b}} байта)\ndocument_properties_title=Заглавие:\ndocument_properties_author=Автор:\ndocument_properties_subject=Тема:\ndocument_properties_keywords=Ключови думи:\ndocument_properties_creation_date=Дата на създаване:\ndocument_properties_modification_date=Дата на промяна:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Създател:\ndocument_properties_producer=PDF произведен от:\ndocument_properties_version=Издание на PDF:\ndocument_properties_page_count=Брой страници:\ndocument_properties_page_size=Размер на страницата:\ndocument_properties_page_size_unit_inches=инч\ndocument_properties_page_size_unit_millimeters=мм\ndocument_properties_page_size_orientation_portrait=портрет\ndocument_properties_page_size_orientation_landscape=пейзаж\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Правни въпроси\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Бърз преглед:\ndocument_properties_linearized_yes=Да\ndocument_properties_linearized_no=Не\ndocument_properties_close=Затваряне\n\nprint_progress_message=Подготвяне на документа за отпечатване…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Отказ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Превключване на страничната лента\ntoggle_sidebar_notification.title=Превключване на страничната лента (документи със структура/прикачени файлове)\ntoggle_sidebar_label=Превключване на страничната лента\ndocument_outline.title=Показване на структурата на документа (двукратно щракване за свиване/разгъване на всичко)\ndocument_outline_label=Структура на документа\nattachments.title=Показване на притурките\nattachments_label=Притурки\nthumbs.title=Показване на миниатюрите\nthumbs_label=Миниатюри\nfindbar.title=Намиране в документа\nfindbar_label=Търсене\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Страница {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Миниатюра на страница {{page}}\n\n# Find panel button title and messages\nfind_input.title=Търсене\nfind_input.placeholder=Търсене в документа…\nfind_previous.title=Намиране на предишно съвпадение на фразата\nfind_previous_label=Предишна\nfind_next.title=Намиране на следващо съвпадение на фразата\nfind_next_label=Следваща\nfind_highlight=Открояване на всички\nfind_match_case_label=Съвпадение на регистъра\nfind_entire_word_label=Цели думи\nfind_reached_top=Достигнато е началото на документа, продължаване от края\nfind_reached_bottom=Достигнат е краят на документа, продължаване от началото\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} от {{total}} съвпадение\nfind_match_count[two]={{current}} от {{total}} съвпадения\nfind_match_count[few]={{current}} от {{total}} съвпадения\nfind_match_count[many]={{current}} от {{total}} съвпадения\nfind_match_count[other]={{current}} от {{total}} съвпадения\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Повече от {{limit}} съвпадения\nfind_match_count_limit[one]=Повече от {{limit}} съвпадение\nfind_match_count_limit[two]=Повече от {{limit}} съвпадения\nfind_match_count_limit[few]=Повече от {{limit}} съвпадения\nfind_match_count_limit[many]=Повече от {{limit}} съвпадения\nfind_match_count_limit[other]=Повече от {{limit}} съвпадения\nfind_not_found=Фразата не е намерена\n\n# Error panel labels\nerror_more_info=Повече информация\nerror_less_info=По-малко информация\nerror_close=Затваряне\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=Издание на PDF.js {{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Съобщение: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стек: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Файл: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Ред: {{line}}\nrendering_error=Грешка при изчертаване на страницата.\n\n# Predefined zoom values\npage_scale_width=Ширина на страницата\npage_scale_fit=Вместване в страницата\npage_scale_auto=Автоматично мащабиране\npage_scale_actual=Действителен размер\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Получи се грешка при зареждане на PDF-а.\ninvalid_file_error=Невалиден или повреден PDF файл.\nmissing_file_error=Липсващ PDF файл.\nunexpected_response_error=Неочакван отговор от сървъра.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Анотация {{type}}]\npassword_label=Въведете парола за отваряне на този PDF файл.\npassword_invalid=Невалидна парола. Моля, опитайте отново.\npassword_ok=Добре\npassword_cancel=Отказ\n\nprinting_not_supported=Внимание: Този четец няма пълна поддръжка на отпечатване.\nprinting_not_ready=Внимание: Този PDF файл не е напълно зареден за печат.\nweb_fonts_disabled=Уеб-шрифтовете са забранени: разрешаване на използването на вградените PDF шрифтове.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/bn/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=পূর্ববর্তী পাতা\nprevious_label=পূর্ববর্তী\nnext.title=পরবর্তী পাতা\nnext_label=পরবর্তী\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=পাতা\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} এর\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pagesCount}} এর {{pageNumber}})\n\nzoom_out.title=ছোট আকারে প্রদর্শন\nzoom_out_label=ছোট আকারে প্রদর্শন\nzoom_in.title=বড় আকারে প্রদর্শন\nzoom_in_label=বড় আকারে প্রদর্শন\nzoom.title=বড় আকারে প্রদর্শন\npresentation_mode.title=উপস্থাপনা মোডে স্যুইচ করুন\npresentation_mode_label=উপস্থাপনা মোড\nopen_file.title=ফাইল খুলুন\nopen_file_label=খুলুন\nprint.title=মুদ্রণ\nprint_label=মুদ্রণ\ndownload.title=ডাউনলোড\ndownload_label=ডাউনলোড\nbookmark.title=বর্তমান অবস্থা (অনুলিপি অথবা নতুন উইন্ডো তে খুলুন)\nbookmark_label=বর্তমান অবস্থা\n\n# Secondary toolbar and context menu\ntools.title=টুল\ntools_label=টুল\nfirst_page.title=প্রথম পাতায় যাও\nfirst_page.label=প্রথম পাতায় যাও\nfirst_page_label=প্রথম পাতায় যাও\nlast_page.title=শেষ পাতায় যাও\nlast_page.label=শেষ পাতায় যাও\nlast_page_label=শেষ পাতায় যাও\npage_rotate_cw.title=ঘড়ির কাঁটার দিকে ঘোরাও\npage_rotate_cw.label=ঘড়ির কাঁটার দিকে ঘোরাও\npage_rotate_cw_label=ঘড়ির কাঁটার দিকে ঘোরাও\npage_rotate_ccw.title=ঘড়ির কাঁটার বিপরীতে ঘোরাও\npage_rotate_ccw.label=ঘড়ির কাঁটার বিপরীতে ঘোরাও\npage_rotate_ccw_label=ঘড়ির কাঁটার বিপরীতে ঘোরাও\n\ncursor_text_select_tool.title=লেখা নির্বাচক টুল সক্রিয় করুন\ncursor_text_select_tool_label=লেখা নির্বাচক টুল\ncursor_hand_tool.title=হ্যান্ড টুল সক্রিয় করুন\ncursor_hand_tool_label=হ্যান্ড টুল\n\nscroll_vertical.title=উলম্ব স্ক্রলিং ব্যবহার করুন\nscroll_vertical_label=উলম্ব স্ক্রলিং\nscroll_horizontal.title=অনুভূমিক স্ক্রলিং ব্যবহার করুন\nscroll_horizontal_label=অনুভূমিক স্ক্রলিং\nscroll_wrapped.title=Wrapped স্ক্রোলিং ব্যবহার করুন\nscroll_wrapped_label=Wrapped স্ক্রোলিং\n\nspread_none.title=পেজ স্প্রেডগুলোতে যোগদান করবেন না\nspread_none_label=Spreads নেই\nspread_odd_label=বিজোড় Spreads\nspread_even_label=জোড় Spreads\n\n# Document properties dialog box\ndocument_properties.title=নথি বৈশিষ্ট্য…\ndocument_properties_label=নথি বৈশিষ্ট্য…\ndocument_properties_file_name=ফাইলের নাম:\ndocument_properties_file_size=ফাইলের আকার:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} কেবি ({{size_b}} বাইট)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} এমবি ({{size_b}} বাইট)\ndocument_properties_title=শিরোনাম:\ndocument_properties_author=লেখক:\ndocument_properties_subject=বিষয়:\ndocument_properties_keywords=কীওয়ার্ড:\ndocument_properties_creation_date=তৈরির তারিখ:\ndocument_properties_modification_date=পরিবর্তনের তারিখ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=প্রস্তুতকারক:\ndocument_properties_producer=পিডিএফ প্রস্তুতকারক:\ndocument_properties_version=পিডিএফ সংষ্করণ:\ndocument_properties_page_count=মোট পাতা:\ndocument_properties_page_size=পাতার সাইজ:\ndocument_properties_page_size_unit_inches=এর মধ্যে\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=উলম্ব\ndocument_properties_page_size_orientation_landscape=অনুভূমিক\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=লেটার\ndocument_properties_page_size_name_legal=লীগাল\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Fast Web View:\ndocument_properties_linearized_yes=হ্যাঁ\ndocument_properties_linearized_no=না\ndocument_properties_close=বন্ধ\n\nprint_progress_message=মুদ্রণের জন্য নথি প্রস্তুত করা হচ্ছে…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=বাতিল\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=সাইডবার টগল করুন\ntoggle_sidebar_notification.title=সাইডবার টগল (নথিতে আউটলাইন/এটাচমেন্ট রয়েছে)\ntoggle_sidebar_label=সাইডবার টগল করুন\ndocument_outline.title=নথির আউটলাইন দেখাও (সব আইটেম প্রসারিত/সঙ্কুচিত করতে ডবল ক্লিক করুন)\ndocument_outline_label=নথির রূপরেখা\nattachments.title=সংযুক্তি দেখাও\nattachments_label=সংযুক্তি\nthumbs.title=থাম্বনেইল সমূহ প্রদর্শন করুন\nthumbs_label=থাম্বনেইল সমূহ\nfindbar.title=নথির মধ্যে খুঁজুন\nfindbar_label=খুঁজুন\n\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=পাতা {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=পাতা {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} পাতার থাম্বনেইল\n\n# Find panel button title and messages\nfind_input.title=খুঁজুন\nfind_input.placeholder=নথির মধ্যে খুঁজুন…\nfind_previous.title=বাক্যাংশের পূর্ববর্তী উপস্থিতি অনুসন্ধান\nfind_previous_label=পূর্ববর্তী\nfind_next.title=বাক্যাংশের পরবর্তী উপস্থিতি অনুসন্ধান\nfind_next_label=পরবর্তী\nfind_highlight=সব হাইলাইট করা হবে\nfind_match_case_label=অক্ষরের ছাঁদ মেলানো\nfind_entire_word_label=সম্পূর্ণ শব্দ\nfind_reached_top=পাতার শুরুতে পৌছে গেছে, নীচ থেকে আরম্ভ করা হয়েছে\nfind_reached_bottom=পাতার শেষে পৌছে গেছে, উপর থেকে আরম্ভ করা হয়েছে\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{total}} এর {{current}} মিল\nfind_match_count[two]={{total}} এর {{current}} মিল\nfind_match_count[few]={{total}} এর {{current}} মিল\nfind_match_count[many]={{total}} এর {{current}} মিল\nfind_match_count[other]={{total}} এর {{current}} মিল\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]={{limit}} এর বেশি মিল\nfind_match_count_limit[one]={{limit}} এর বেশি মিল\nfind_match_count_limit[two]={{limit}} এর বেশি মিল\nfind_match_count_limit[few]={{limit}} এর বেশি মিল\nfind_match_count_limit[many]={{limit}} এর বেশি মিল\nfind_match_count_limit[other]={{limit}} এর বেশি মিল\nfind_not_found=বাক্যাংশ পাওয়া যায়নি\n\n# Error panel labels\nerror_more_info=আরও তথ্য\nerror_less_info=কম তথ্য\nerror_close=বন্ধ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=বার্তা: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=নথি: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=লাইন: {{line}}\nrendering_error=পাতা উপস্থাপনার সময় ত্রুটি দেখা দিয়েছে।\n\n# Predefined zoom values\npage_scale_width=পাতার প্রস্থ\npage_scale_fit=পাতা ফিট করুন\npage_scale_auto=স্বয়ংক্রিয় জুম\npage_scale_actual=প্রকৃত আকার\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=পিডিএফ লোড করার সময় ত্রুটি দেখা দিয়েছে।\ninvalid_file_error=অকার্যকর অথবা ক্ষতিগ্রস্ত পিডিএফ ফাইল।\nmissing_file_error=নিখোঁজ PDF ফাইল।\nunexpected_response_error=অপ্রত্যাশীত সার্ভার প্রতিক্রিয়া।\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} টীকা]\npassword_label=পিডিএফ ফাইলটি ওপেন করতে পাসওয়ার্ড দিন।\npassword_invalid=ভুল পাসওয়ার্ড। অনুগ্রহ করে আবার চেষ্টা করুন।\npassword_ok=ঠিক আছে\npassword_cancel=বাতিল\n\nprinting_not_supported=সতর্কতা: এই ব্রাউজারে মুদ্রণ সম্পূর্ণভাবে সমর্থিত নয়।\nprinting_not_ready=সতর্কীকরণ: পিডিএফটি মুদ্রণের জন্য সম্পূর্ণ লোড হয়নি।\nweb_fonts_disabled=ওয়েব ফন্ট নিষ্ক্রিয়: সংযুক্ত পিডিএফ ফন্ট ব্যবহার করা যাচ্ছে না।\n"
  },
  {
    "path": "lib/pdf.js/web/locale/bo/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=དྲ་ངོས་སྔོན་མ\nprevious_label=སྔོན་མ\nnext.title=དྲ་ངོས་རྗེས་མ\nnext_label=རྗེས་མ\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=ཤོག་ངོས\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=of {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} of {{pagesCount}})\n\nzoom_out.title=Zoom Out\nzoom_out_label=Zoom Out\nzoom_in.title=Zoom In\nzoom_in_label=Zoom In\nzoom.title=Zoom\npresentation_mode.title=Switch to Presentation Mode\npresentation_mode_label=Presentation Mode\nopen_file.title=Open File\nopen_file_label=Open\nprint.title=Print\nprint_label=Print\ndownload.title=Download\ndownload_label=Download\nbookmark.title=Current view (copy or open in new window)\nbookmark_label=Current View\n\n# Secondary toolbar and context menu\ntools.title=Tools\ntools_label=Tools\nfirst_page.title=Go to First Page\nfirst_page.label=Go to First Page\nfirst_page_label=Go to First Page\nlast_page.title=Go to Last Page\nlast_page.label=Go to Last Page\nlast_page_label=Go to Last Page\npage_rotate_cw.title=Rotate Clockwise\npage_rotate_cw.label=Rotate Clockwise\npage_rotate_cw_label=Rotate Clockwise\npage_rotate_ccw.title=Rotate Counterclockwise\npage_rotate_ccw.label=Rotate Counterclockwise\npage_rotate_ccw_label=Rotate Counterclockwise\n\ncursor_text_select_tool.title=Enable Text Selection Tool\ncursor_text_select_tool_label=Text Selection Tool\ncursor_hand_tool.title=Enable Hand Tool\ncursor_hand_tool_label=Hand Tool\n\nscroll_vertical.title=Use Vertical Scrolling\nscroll_vertical_label=Vertical Scrolling\nscroll_horizontal.title=Use Horizontal Scrolling\nscroll_horizontal_label=Horizontal Scrolling\nscroll_wrapped.title=Use Wrapped Scrolling\nscroll_wrapped_label=Wrapped Scrolling\n\nspread_none.title=Do not join page spreads\nspread_none_label=No Spreads\nspread_odd.title=Join page spreads starting with odd-numbered pages\nspread_odd_label=Odd Spreads\nspread_even.title=Join page spreads starting with even-numbered pages\nspread_even_label=Even Spreads\n\n# Document properties dialog box\ndocument_properties.title=Document Properties…\ndocument_properties_label=Document Properties…\ndocument_properties_file_name=File name:\ndocument_properties_file_size=File size:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Title:\ndocument_properties_author=Author:\ndocument_properties_subject=Subject:\ndocument_properties_keywords=Keywords:\ndocument_properties_creation_date=Creation Date:\ndocument_properties_modification_date=Modification Date:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creator:\ndocument_properties_producer=PDF Producer:\ndocument_properties_version=PDF Version:\ndocument_properties_page_count=Page Count:\ndocument_properties_page_size=Page Size:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=portrait\ndocument_properties_page_size_orientation_landscape=landscape\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Fast Web View:\ndocument_properties_linearized_yes=Yes\ndocument_properties_linearized_no=No\ndocument_properties_close=Close\n\nprint_progress_message=Preparing document for printing…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancel\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toggle Sidebar\ntoggle_sidebar_notification.title=Toggle Sidebar (document contains outline/attachments)\ntoggle_sidebar_label=Toggle Sidebar\ndocument_outline.title=Show Document Outline (double-click to expand/collapse all items)\ndocument_outline_label=Document Outline\nattachments.title=Show Attachments\nattachments_label=Attachments\nthumbs.title=Show Thumbnails\nthumbs_label=Thumbnails\nfindbar.title=Find in Document\nfindbar_label=Find\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Page {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail of Page {{page}}\n\n# Find panel button title and messages\nfind_input.title=Find\nfind_input.placeholder=Find in document…\nfind_previous.title=Find the previous occurrence of the phrase\nfind_previous_label=Previous\nfind_next.title=Find the next occurrence of the phrase\nfind_next_label=Next\nfind_highlight=Highlight all\nfind_match_case_label=Match case\nfind_entire_word_label=Whole words\nfind_reached_top=Reached top of document, continued from bottom\nfind_reached_bottom=Reached end of document, continued from top\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} of {{total}} match\nfind_match_count[two]={{current}} of {{total}} matches\nfind_match_count[few]={{current}} of {{total}} matches\nfind_match_count[many]={{current}} of {{total}} matches\nfind_match_count[other]={{current}} of {{total}} matches\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=More than {{limit}} matches\nfind_match_count_limit[one]=More than {{limit}} match\nfind_match_count_limit[two]=More than {{limit}} matches\nfind_match_count_limit[few]=More than {{limit}} matches\nfind_match_count_limit[many]=More than {{limit}} matches\nfind_match_count_limit[other]=More than {{limit}} matches\nfind_not_found=Phrase not found\n\n# Error panel labels\nerror_more_info=More Information\nerror_less_info=Less Information\nerror_close=Close\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=An error occurred while rendering the page.\n\n# Predefined zoom values\npage_scale_width=Page Width\npage_scale_fit=Page Fit\npage_scale_auto=Automatic Zoom\npage_scale_actual=Actual Size\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=An error occurred while loading the PDF.\ninvalid_file_error=Invalid or corrupted PDF file.\nmissing_file_error=Missing PDF file.\nunexpected_response_error=Unexpected server response.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Enter the password to open this PDF file.\npassword_invalid=Invalid password. Please try again.\npassword_ok=OK\npassword_cancel=Cancel\n\nprinting_not_supported=Warning: Printing is not fully supported by this browser.\nprinting_not_ready=Warning: The PDF is not fully loaded for printing.\nweb_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/br/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pajenn a-raok\nprevious_label=A-raok\nnext.title=Pajenn war-lerc'h\nnext_label=War-lerc'h\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pajenn\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=eus {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} war {{pagesCount}})\n\nzoom_out.title=Zoum bihanaat\nzoom_out_label=Zoum bihanaat\nzoom_in.title=Zoum brasaat\nzoom_in_label=Zoum brasaat\nzoom.title=Zoum\npresentation_mode.title=Trec'haoliñ etrezek ar mod kinnigadenn\npresentation_mode_label=Mod kinnigadenn\nopen_file.title=Digeriñ ur restr\nopen_file_label=Digeriñ ur restr\nprint.title=Moullañ\nprint_label=Moullañ\ndownload.title=Pellgargañ\ndownload_label=Pellgargañ\nbookmark.title=Gwel bremanel (eilañ pe zigeriñ e-barzh ur prenestr nevez)\nbookmark_label=Gwel bremanel\n\n# Secondary toolbar and context menu\ntools.title=Ostilhoù\ntools_label=Ostilhoù\nfirst_page.title=Mont d'ar bajenn gentañ\nfirst_page.label=Mont d'ar bajenn gentañ\nfirst_page_label=Mont d'ar bajenn gentañ\nlast_page.title=Mont d'ar bajenn diwezhañ\nlast_page.label=Mont d'ar bajenn diwezhañ\nlast_page_label=Mont d'ar bajenn diwezhañ\npage_rotate_cw.title=C'hwelañ gant roud ar bizied\npage_rotate_cw.label=C'hwelañ gant roud ar bizied\npage_rotate_cw_label=C'hwelañ gant roud ar bizied\npage_rotate_ccw.title=C'hwelañ gant roud gin ar bizied\npage_rotate_ccw.label=C'hwelañ gant roud gin ar bizied\npage_rotate_ccw_label=C'hwelañ gant roud gin ar bizied\n\ncursor_text_select_tool.title=Gweredekaat an ostilh diuzañ testenn\ncursor_text_select_tool_label=Ostilh diuzañ testenn\ncursor_hand_tool.title=Gweredekaat an ostilh dorn\ncursor_hand_tool_label=Ostilh dorn\n\nscroll_vertical.title=Arverañ an dibunañ a-blom\nscroll_vertical_label=Dibunañ a-serzh\nscroll_horizontal.title=Arverañ an dibunañ a-blaen\nscroll_horizontal_label=Dibunañ a-blaen\nscroll_wrapped.title=Arverañ an dibunañ paket\nscroll_wrapped_label=Dibunañ paket\n\nspread_none.title=Chom hep stagañ ar skignadurioù\nspread_none_label=Skignadenn ebet\nspread_odd.title=Lakaat ar pajennadoù en ur gregiñ gant ar pajennoù ampar\nspread_odd_label=Pajennoù ampar\nspread_even.title=Lakaat ar pajennadoù en ur gregiñ gant ar pajennoù par\nspread_even_label=Pajennoù par\n\n# Document properties dialog box\ndocument_properties.title=Perzhioù an teul…\ndocument_properties_label=Perzhioù an teul…\ndocument_properties_file_name=Anv restr:\ndocument_properties_file_size=Ment ar restr:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} Ke ({{size_b}} eizhbit)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} Me ({{size_b}} eizhbit)\ndocument_properties_title=Titl:\ndocument_properties_author=Aozer:\ndocument_properties_subject=Danvez:\ndocument_properties_keywords=Gerioù-alc'hwez:\ndocument_properties_creation_date=Deiziad krouiñ:\ndocument_properties_modification_date=Deiziad kemmañ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Krouer:\ndocument_properties_producer=Kenderc'her PDF:\ndocument_properties_version=Handelv PDF:\ndocument_properties_page_count=Niver a bajennoù:\ndocument_properties_page_size=Ment ar bajenn:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=poltred\ndocument_properties_page_size_orientation_landscape=gweledva\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Lizher\ndocument_properties_page_size_name_legal=Lezennel\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Gwel Web Herrek:\ndocument_properties_linearized_yes=Ya\ndocument_properties_linearized_no=Ket\ndocument_properties_close=Serriñ\n\nprint_progress_message=O prientiñ an teul evit moullañ...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Nullañ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Diskouez/kuzhat ar varrenn gostez\ntoggle_sidebar_notification.title=Trec'haoliñ ar verrenn-gostez (ur steuñv pe stagadennoù a zo en teul)\ntoggle_sidebar_notification2.title=Trec'haoliñ ar varrenn-gostez (ur steuñv pe stagadennoù a zo en teul)\ntoggle_sidebar_label=Diskouez/kuzhat ar varrenn gostez\ndocument_outline.title=Diskouez steuñv an teul (daouglikit evit brasaat/bihanaat an holl elfennoù)\ndocument_outline_label=Sinedoù an teuliad\nattachments.title=Diskouez ar c'henstagadurioù\nattachments_label=Kenstagadurioù\nlayers_label=Gwiskadoù\nthumbs.title=Diskouez ar melvennoù\nthumbs_label=Melvennoù\nfindbar.title=Klask e-barzh an teuliad\nfindbar_label=Klask\n\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Pajenn {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pajenn {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Melvenn ar bajenn {{page}}\n\n# Find panel button title and messages\nfind_input.title=Klask\nfind_input.placeholder=Klask e-barzh an teuliad\nfind_previous.title=Kavout an tamm frazenn kent o klotañ ganti\nfind_previous_label=Kent\nfind_next.title=Kavout an tamm frazenn war-lerc'h o klotañ ganti\nfind_next_label=War-lerc'h\nfind_highlight=Usskediñ pep tra\nfind_match_case_label=Teurel evezh ouzh ar pennlizherennoù\nfind_entire_word_label=Gerioù a-bezh\nfind_reached_top=Tizhet eo bet derou ar bajenn, kenderc'hel diouzh an diaz\nfind_reached_bottom=Tizhet eo bet dibenn ar bajenn, kenderc'hel diouzh ar c'hrec'h\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]=Klotadenn {{current}} war {{total}}\nfind_match_count[two]=Klotadenn {{current}} war {{total}}\nfind_match_count[few]=Klotadenn {{current}} war {{total}}\nfind_match_count[many]=Klotadenn {{current}} war {{total}}\nfind_match_count[other]=Klotadenn {{current}} war {{total}}\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Muioc'h eget {{limit}} a glotadennoù\nfind_match_count_limit[one]=Muioc'h eget {{limit}} a glotadennoù\nfind_match_count_limit[two]=Muioc'h eget {{limit}} a glotadennoù\nfind_match_count_limit[few]=Muioc'h eget {{limit}} a glotadennoù\nfind_match_count_limit[many]=Muioc'h eget {{limit}} a glotadennoù\nfind_match_count_limit[other]=Muioc'h eget {{limit}} a glotadennoù\nfind_not_found=N'haller ket kavout ar frazenn\n\n# Error panel labels\nerror_more_info=Muioc'h a ditouroù\nerror_less_info=Nebeutoc'h a ditouroù\nerror_close=Serriñ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js handelv {{version}} (kempunadur: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Kemennadenn: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Torn: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Restr: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linenn: {{line}}\nrendering_error=Degouezhet ez eus bet ur fazi e-pad skrammañ ar bajennad.\n\n# Predefined zoom values\npage_scale_width=Led ar bajenn\npage_scale_fit=Pajenn a-bezh\npage_scale_auto=Zoum emgefreek\npage_scale_actual=Ment wir\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Degouezhet ez eus bet ur fazi e-pad kargañ ar PDF.\ninvalid_file_error=Restr PDF didalvoudek pe kontronet.\nmissing_file_error=Restr PDF o vankout.\nunexpected_response_error=Respont dic'hortoz a-berzh an dafariad\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Notennañ]\npassword_label=Enankit ar ger-tremen evit digeriñ ar restr PDF-mañ.\npassword_invalid=Ger-tremen didalvoudek. Klaskit en-dro mar plij.\npassword_ok=Mat eo\npassword_cancel=Nullañ\n\nprinting_not_supported=Kemenn: N'eo ket skoret penn-da-benn ar moullañ gant ar merdeer-mañ.\nprinting_not_ready=Kemenn: N'hall ket bezañ moullet ar restr PDF rak n'eo ket karget penn-da-benn.\nweb_fonts_disabled=Diweredekaet eo an nodrezhoù web: n'haller ket arverañ an nodrezhoù PDF enframmet.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/brx/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=आगोलनि बिलाइ\nprevious_label=आगोलनि\nnext.title=उननि बिलाइ\nnext_label=उननि\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=बिलाइ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} नि\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pagesCount}} नि {{pageNumber}})\n\nzoom_out.title=फिसायै जुम खालाम\nzoom_out_label=फिसायै जुम खालाम\nzoom_in.title=गेदेरै जुम खालाम\nzoom_in_label=गेदेरै जुम खालाम\nzoom.title=जुम खालाम\npresentation_mode.title=दिन्थिफुंनाय म'डआव थां\npresentation_mode_label=दिन्थिफुंनाय म'ड\nopen_file.title=फाइलखौ खेव\nopen_file_label=खेव\nprint.title=साफाय\nprint_label=साफाय\ndownload.title=डाउनल'ड खालाम\ndownload_label=डाउनल'ड खालाम\nbookmark.title=दानि नुथाय (गोदान उइन्ड'आव कपि खालाम एबा खेव)\nbookmark_label=दानि नुथाय\n\n# Secondary toolbar and context menu\ntools.title=टुल\ntools_label=टुल\nfirst_page.title=गिबि बिलाइआव थां\nfirst_page.label=गिबि बिलाइआव थां\nfirst_page_label=गिबि बिलाइआव थां\nlast_page.title=जोबथा बिलाइआव थां\nlast_page.label=जोबथा बिलाइआव थां\nlast_page_label=जोबथा बिलाइआव थां\npage_rotate_cw.title=घरि गिदिंनाय फार्से फिदिं\npage_rotate_cw.label=घरि गिदिंनाय फार्से फिदिं\npage_rotate_cw_label=घरि गिदिंनाय फार्से फिदिं\npage_rotate_ccw.title=घरि गिदिंनाय उल्था फार्से फिदिं\npage_rotate_ccw.label=घरि गिदिंनाय उल्था फार्से फिदिं\npage_rotate_ccw_label=घरि गिदिंनाय उल्था फार्से फिदिं\n\n\n\n\n# Document properties dialog box\ndocument_properties.title=फोरमान बिलाइनि आखुथाय...\ndocument_properties_label=फोरमान बिलाइनि आखुथाय...\ndocument_properties_file_name=फाइलनि मुं:\ndocument_properties_file_size=फाइलनि महर:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} बाइट)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} बाइट)\ndocument_properties_title=बिमुं:\ndocument_properties_author=लिरगिरि:\ndocument_properties_subject=आयदा:\ndocument_properties_keywords=गाहाय सोदोब:\ndocument_properties_creation_date=सोरजिनाय अक्ट':\ndocument_properties_modification_date=सुद्रायनाय अक्ट':\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=सोरजिग्रा:\ndocument_properties_producer=PDF दिहुनग्रा:\ndocument_properties_version=PDF बिसान:\ndocument_properties_page_count=बिलाइनि हिसाब:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=प'र्ट्रेट\ndocument_properties_page_size_orientation_landscape=लेण्डस्केप\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=लायजाम\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized_yes=नंगौ\ndocument_properties_linearized_no=नङा\ndocument_properties_close=बन्द खालाम\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=नेवसि\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=टग्गल साइडबार\ntoggle_sidebar_label=टग्गल साइडबार\ndocument_outline_label=फोरमान बिलाइ सिमा हांखो\nattachments.title=नांजाब होनायखौ दिन्थि\nattachments_label=नांजाब होनाय\nthumbs.title=थामनेइलखौ दिन्थि\nthumbs_label=थामनेइल\nfindbar.title=फोरमान बिलाइआव नागिरना दिहुन\nfindbar_label=नायगिरना दिहुन\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=बिलाइ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=बिलाइ {{page}} नि थामनेइल\n\n# Find panel button title and messages\nfind_input.title=नायगिरना दिहुन\nfind_input.placeholder=फोरमान बिलाइआव नागिरना दिहुन...\nfind_previous.title=बाथ्रा खोन्दोबनि सिगांनि नुजाथिनायखौ नागिर\nfind_previous_label=आगोलनि\nfind_next.title=बाथ्रा खोन्दोबनि उननि नुजाथिनायखौ नागिर\nfind_next_label=उननि\nfind_highlight=गासैखौबो हाइलाइट खालाम\nfind_match_case_label=गोरोबनाय केस\nfind_reached_top=थालो निफ्राय जागायनानै फोरमान बिलाइनि बिजौआव सौहैबाय\nfind_reached_bottom=बिजौ निफ्राय जागायनानै फोरमान बिलाइनि बिजौआव सौहैबाय\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_not_found=बाथ्रा खोन्दोब मोनाखै\n\n# Error panel labels\nerror_more_info=गोबां फोरमायथिहोग्रा\nerror_less_info=खम फोरमायथिहोग्रा\nerror_close=बन्द खालाम\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=खौरां: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=स्टेक: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=फाइल: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=सारि: {{line}}\nrendering_error=बिलाइखौ राव सोलायनाय समाव मोनसे गोरोन्थि जादों।\n\n# Predefined zoom values\npage_scale_width=बिलाइनि गुवार\npage_scale_fit=बिलाइ गोरोबनाय\npage_scale_auto=गावनोगाव जुम\npage_scale_actual=थार महर\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=PDF ल'ड खालामनाय समाव मोनसे गोरोन्थि जाबाय।\ninvalid_file_error=बाहायजायै एबा गाज्रि जानाय PDF फाइल\nmissing_file_error=गोमानाय PDF फाइल\nunexpected_response_error=मिजिंथियै सार्भार फिननाय।\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} सोदोब बेखेवनाय]\npassword_label=बे PDF फाइलखौ खेवनो पासवार्ड हाबहो।\npassword_invalid=बाहायजायै पासवार्ड। अननानै फिन नाजा।\npassword_ok=OK\npassword_cancel=नेवसि\n\nprinting_not_supported=सांग्रांथि: साफायनाया बे ब्राउजारजों आबुङै हेफाजाब होजाया।\nprinting_not_ready=सांग्रांथि: PDF खौ साफायनायनि थाखाय फुरायै ल'ड खालामाखै।\nweb_fonts_disabled=वेब फन्टखौ लोरबां खालामबाय: अरजाबहोनाय PDF फन्टखौ बाहायनो हायाखै।\n"
  },
  {
    "path": "lib/pdf.js/web/locale/bs/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Prethodna strana\nprevious_label=Prethodna\nnext.title=Sljedeća strna\nnext_label=Sljedeća\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Strana\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=od {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} od {{pagesCount}})\n\nzoom_out.title=Umanji\nzoom_out_label=Umanji\nzoom_in.title=Uvećaj\nzoom_in_label=Uvećaj\nzoom.title=Uvećanje\npresentation_mode.title=Prebaci se u prezentacijski režim\npresentation_mode_label=Prezentacijski režim\nopen_file.title=Otvori fajl\nopen_file_label=Otvori\nprint.title=Štampaj\nprint_label=Štampaj\ndownload.title=Preuzmi\ndownload_label=Preuzmi\nbookmark.title=Trenutni prikaz (kopiraj ili otvori u novom prozoru)\nbookmark_label=Trenutni prikaz\n\n# Secondary toolbar and context menu\ntools.title=Alati\ntools_label=Alati\nfirst_page.title=Idi na prvu stranu\nfirst_page.label=Idi na prvu stranu\nfirst_page_label=Idi na prvu stranu\nlast_page.title=Idi na zadnju stranu\nlast_page.label=Idi na zadnju stranu\nlast_page_label=Idi na zadnju stranu\npage_rotate_cw.title=Rotiraj u smjeru kazaljke na satu\npage_rotate_cw.label=Rotiraj u smjeru kazaljke na satu\npage_rotate_cw_label=Rotiraj u smjeru kazaljke na satu\npage_rotate_ccw.title=Rotiraj suprotno smjeru kazaljke na satu\npage_rotate_ccw.label=Rotiraj suprotno smjeru kazaljke na satu\npage_rotate_ccw_label=Rotiraj suprotno smjeru kazaljke na satu\n\ncursor_text_select_tool.title=Omogući alat za označavanje teksta\ncursor_text_select_tool_label=Alat za označavanje teksta\ncursor_hand_tool.title=Omogući ručni alat\ncursor_hand_tool_label=Ručni alat\n\n# Document properties dialog box\ndocument_properties.title=Svojstva dokumenta...\ndocument_properties_label=Svojstva dokumenta...\ndocument_properties_file_name=Naziv fajla:\ndocument_properties_file_size=Veličina fajla:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bajta)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajta)\ndocument_properties_title=Naslov:\ndocument_properties_author=Autor:\ndocument_properties_subject=Predmet:\ndocument_properties_keywords=Ključne riječi:\ndocument_properties_creation_date=Datum kreiranja:\ndocument_properties_modification_date=Datum promjene:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Kreator:\ndocument_properties_producer=PDF stvaratelj:\ndocument_properties_version=PDF verzija:\ndocument_properties_page_count=Broj stranica:\ndocument_properties_page_size=Veličina stranice:\ndocument_properties_page_size_unit_inches=u\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=uspravno\ndocument_properties_page_size_orientation_landscape=vodoravno\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Pismo\ndocument_properties_page_size_name_legal=Pravni\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\ndocument_properties_close=Zatvori\n\nprint_progress_message=Pripremam dokument za štampu…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Otkaži\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Uključi/isključi bočnu traku\ntoggle_sidebar_notification.title=Uključi/isključi sidebar (dokument sadrži outline/priloge)\ntoggle_sidebar_label=Uključi/isključi bočnu traku\ndocument_outline.title=Prikaži outline dokumenta (dvoklik za skupljanje/širenje svih stavki)\ndocument_outline_label=Konture dokumenta\nattachments.title=Prikaži priloge\nattachments_label=Prilozi\nthumbs.title=Prikaži thumbnailove\nthumbs_label=Thumbnailovi\nfindbar.title=Pronađi u dokumentu\nfindbar_label=Pronađi\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Strana {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail strane {{page}}\n\n# Find panel button title and messages\nfind_input.title=Pronađi\nfind_input.placeholder=Pronađi u dokumentu…\nfind_previous.title=Pronađi prethodno pojavljivanje fraze\nfind_previous_label=Prethodno\nfind_next.title=Pronađi sljedeće pojavljivanje fraze\nfind_next_label=Sljedeće\nfind_highlight=Označi sve\nfind_match_case_label=Osjetljivost na karaktere\nfind_reached_top=Dostigao sam vrh dokumenta, nastavljam sa dna\nfind_reached_bottom=Dostigao sam kraj dokumenta, nastavljam sa vrha\nfind_not_found=Fraza nije pronađena\n\n# Error panel labels\nerror_more_info=Više informacija\nerror_less_info=Manje informacija\nerror_close=Zatvori\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Poruka: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fajl: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linija: {{line}}\nrendering_error=Došlo je do greške prilikom renderiranja strane.\n\n# Predefined zoom values\npage_scale_width=Širina strane\npage_scale_fit=Uklopi stranu\npage_scale_auto=Automatsko uvećanje\npage_scale_actual=Stvarna veličina\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Došlo je do greške prilikom učitavanja PDF-a.\ninvalid_file_error=Neispravan ili oštećen PDF fajl.\nmissing_file_error=Nedostaje PDF fajl.\nunexpected_response_error=Neočekivani odgovor servera.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} pribilješka]\npassword_label=Upišite lozinku da biste otvorili ovaj PDF fajl.\npassword_invalid=Pogrešna lozinka. Pokušajte ponovo.\npassword_ok=OK\npassword_cancel=Otkaži\n\nprinting_not_supported=Upozorenje: Štampanje nije u potpunosti podržano u ovom browseru.\nprinting_not_ready=Upozorenje: PDF nije u potpunosti učitan za štampanje.\nweb_fonts_disabled=Web fontovi su onemogućeni: nemoguće koristiti ubačene PDF fontove.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/ca/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pàgina anterior\nprevious_label=Anterior\nnext.title=Pàgina següent\nnext_label=Següent\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pàgina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Redueix\nzoom_out_label=Redueix\nzoom_in.title=Amplia\nzoom_in_label=Amplia\nzoom.title=Escala\npresentation_mode.title=Canvia al mode de presentació\npresentation_mode_label=Mode de presentació\nopen_file.title=Obre el fitxer\nopen_file_label=Obre\nprint.title=Imprimeix\nprint_label=Imprimeix\ndownload.title=Baixa\ndownload_label=Baixa\nbookmark.title=Vista actual (copia o obre en una finestra nova)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Eines\ntools_label=Eines\nfirst_page.title=Vés a la primera pàgina\nfirst_page.label=Vés a la primera pàgina\nfirst_page_label=Vés a la primera pàgina\nlast_page.title=Vés a l'última pàgina\nlast_page.label=Vés a l'última pàgina\nlast_page_label=Vés a l'última pàgina\npage_rotate_cw.title=Gira cap a la dreta\npage_rotate_cw.label=Gira cap a la dreta\npage_rotate_cw_label=Gira cap a la dreta\npage_rotate_ccw.title=Gira cap a l'esquerra\npage_rotate_ccw.label=Gira cap a l'esquerra\npage_rotate_ccw_label=Gira cap a l'esquerra\n\ncursor_text_select_tool.title=Habilita l'eina de selecció de text\ncursor_text_select_tool_label=Eina de selecció de text\ncursor_hand_tool.title=Habilita l'eina de mà\ncursor_hand_tool_label=Eina de mà\n\nscroll_vertical.title=Utilitza el desplaçament vertical\nscroll_vertical_label=Desplaçament vertical\nscroll_horizontal.title=Utilitza el desplaçament horitzontal\nscroll_horizontal_label=Desplaçament horitzontal\nscroll_wrapped.title=Activa el desplaçament continu\nscroll_wrapped_label=Desplaçament continu\n\nspread_none.title=No agrupis les pàgines de dues en dues\nspread_none_label=Una sola pàgina\nspread_odd.title=Mostra dues pàgines començant per les pàgines de numeració senar\nspread_odd_label=Doble pàgina (senar)\nspread_even.title=Mostra dues pàgines començant per les pàgines de numeració parell\nspread_even_label=Doble pàgina (parell)\n\n# Document properties dialog box\ndocument_properties.title=Propietats del document…\ndocument_properties_label=Propietats del document…\ndocument_properties_file_name=Nom del fitxer:\ndocument_properties_file_size=Mida del fitxer:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Títol:\ndocument_properties_author=Autor:\ndocument_properties_subject=Assumpte:\ndocument_properties_keywords=Paraules clau:\ndocument_properties_creation_date=Data de creació:\ndocument_properties_modification_date=Data de modificació:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creador:\ndocument_properties_producer=Generador de PDF:\ndocument_properties_version=Versió de PDF:\ndocument_properties_page_count=Nombre de pàgines:\ndocument_properties_page_size=Mida de la pàgina:\ndocument_properties_page_size_unit_inches=polzades\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=vertical\ndocument_properties_page_size_orientation_landscape=apaïsat\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Carta\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Vista web ràpida:\ndocument_properties_linearized_yes=Sí\ndocument_properties_linearized_no=No\ndocument_properties_close=Tanca\n\nprint_progress_message=S'està preparant la impressió del document…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancel·la\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Mostra/amaga la barra lateral\ntoggle_sidebar_notification.title=Mostra/amaga la barra lateral (el document conté un esquema o adjuncions)\ntoggle_sidebar_notification2.title=Mostra/amaga la barra lateral (el document conté un esquema, adjuncions o capes)\ntoggle_sidebar_label=Mostra/amaga la barra lateral\ndocument_outline.title=Mostra l'esquema del document (doble clic per ampliar/reduir tots els elements)\ndocument_outline_label=Esquema del document\nattachments.title=Mostra les adjuncions\nattachments_label=Adjuncions\nlayers.title=Mostra les capes (doble clic per restablir totes les capes al seu estat per defecte)\nlayers_label=Capes\nthumbs.title=Mostra les miniatures\nthumbs_label=Miniatures\ncurrent_outline_item.title=Cerca l'element d'esquema actual\ncurrent_outline_item_label=Element d'esquema actual\nfindbar.title=Cerca al document\nfindbar_label=Cerca\n\nadditional_layers=Capes addicionals\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Pàgina {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pàgina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura de la pàgina {{page}}\n\n# Find panel button title and messages\nfind_input.title=Cerca\nfind_input.placeholder=Cerca al document…\nfind_previous.title=Cerca l'anterior coincidència de l'expressió\nfind_previous_label=Anterior\nfind_next.title=Cerca la següent coincidència de l'expressió\nfind_next_label=Següent\nfind_highlight=Ressalta-ho tot\nfind_match_case_label=Distingeix entre majúscules i minúscules\nfind_entire_word_label=Paraules senceres\nfind_reached_top=S'ha arribat al principi del document, es continua pel final\nfind_reached_bottom=S'ha arribat al final del document, es continua pel principi\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} de {{total}} coincidència\nfind_match_count[two]={{current}} de {{total}} coincidències\nfind_match_count[few]={{current}} de {{total}} coincidències\nfind_match_count[many]={{current}} de {{total}} coincidències\nfind_match_count[other]={{current}} de {{total}} coincidències\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Més de {{limit}} coincidències\nfind_match_count_limit[one]=Més d'{{limit}} coincidència\nfind_match_count_limit[two]=Més de {{limit}} coincidències\nfind_match_count_limit[few]=Més de {{limit}} coincidències\nfind_match_count_limit[many]=Més de {{limit}} coincidències\nfind_match_count_limit[other]=Més de {{limit}} coincidències\nfind_not_found=No s'ha trobat l'expressió\n\n# Error panel labels\nerror_more_info=Més informació\nerror_less_info=Menys informació\nerror_close=Tanca\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (muntatge: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Missatge: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fitxer: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Línia: {{line}}\nrendering_error=S'ha produït un error mentre es renderitzava la pàgina.\n\n# Predefined zoom values\npage_scale_width=Amplada de la pàgina\npage_scale_fit=Ajusta la pàgina\npage_scale_auto=Zoom automàtic\npage_scale_actual=Mida real\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=S'ha produït un error en carregar el PDF.\ninvalid_file_error=El fitxer PDF no és vàlid o està malmès.\nmissing_file_error=Falta el fitxer PDF.\nunexpected_response_error=Resposta inesperada del servidor.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotació {{type}}]\npassword_label=Introduïu la contrasenya per obrir aquest fitxer PDF.\npassword_invalid=La contrasenya no és vàlida. Torneu-ho a provar.\npassword_ok=D'acord\npassword_cancel=Cancel·la\n\nprinting_not_supported=Avís: la impressió no és plenament funcional en aquest navegador.\nprinting_not_ready=Atenció: el PDF no s'ha acabat de carregar per imprimir-lo.\nweb_fonts_disabled=Els tipus de lletra web estan desactivats: no es poden utilitzar els tipus de lletra incrustats al PDF.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/cak/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Jun kan ruxaq\nprevious_label=Jun kan\nnext.title=Jun chik ruxaq\nnext_label=Jun chik\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Ruxaq\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=richin {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} richin {{pagesCount}})\n\nzoom_out.title=Tich'utinirisäx\nzoom_out_label=Tich'utinirisäx\nzoom_in.title=Tinimirisäx\nzoom_in_label=Tinimirisäx\nzoom.title=Sum\npresentation_mode.title=Tijal ri rub'anikil niwachin\npresentation_mode_label=Pa rub'eyal niwachin\nopen_file.title=Tijaq Yakb'äl\nopen_file_label=Tijaq\nprint.title=Titz'ajb'äx\nprint_label=Titz'ajb'äx\ndownload.title=Tiqasäx\ndownload_label=Tiqasäx\nbookmark.title=Rutz'etik wakami (tiwachib'ëx o tijaq pa jun k'ak'a' tzuwäch)\nbookmark_label=Rutzub'al wakami\n\n# Secondary toolbar and context menu\ntools.title=Samajib'äl\ntools_label=Samajib'äl\nfirst_page.title=Tib'e pa nab'ey ruxaq\nfirst_page.label=Tib'e pa nab'ey ruxaq\nfirst_page_label=Tib'e pa nab'ey ruxaq\nlast_page.title=Tib'e pa ruk'isib'äl ruxaq\nlast_page.label=Tib'e pa ruk'isib'äl ruxaq\nlast_page_label=Tib'e pa ruk'isib'äl ruxaq\npage_rotate_cw.title=Tisutïx pan ajkiq'a'\npage_rotate_cw.label=Tisutïx pan ajkiq'a'\npage_rotate_cw_label=Tisutïx pan ajkiq'a'\npage_rotate_ccw.title=Tisutïx pan ajxokon\npage_rotate_ccw.label=Tisutïx pan ajxokon\npage_rotate_ccw_label=Tisutïx pan ajxokon\n\ncursor_text_select_tool.title=Titzij ri rusamajib'al Rucha'ik Rucholajem Tzij\ncursor_text_select_tool_label=Rusamajib'al Rucha'ik Rucholajem Tzij\ncursor_hand_tool.title=Titzij ri q'ab'aj samajib'äl\ncursor_hand_tool_label=Q'ab'aj Samajib'äl\n\nscroll_vertical.title=Tokisäx Pa'äl Q'axanem\nscroll_vertical_label=Pa'äl Q'axanem\nscroll_horizontal.title=Tokisäx Kotz'öl Q'axanem\nscroll_horizontal_label=Kotz'öl Q'axanem\nscroll_wrapped.title=Tokisäx Tzub'aj Q'axanem\nscroll_wrapped_label=Tzub'aj Q'axanem\n\nspread_none.title=Man ketun taq ruxaq pa rub'eyal wuj\nspread_none_label=Majun Rub'eyal\nspread_odd.title=Ke'atunu' ri taq ruxaq rik'in natikirisaj rik'in jun man k'ulaj ta rajilab'al\nspread_odd_label=Man K'ulaj Ta Rub'eyal\nspread_even.title=Ke'atunu' ri taq ruxaq rik'in natikirisaj rik'in jun k'ulaj rajilab'al\nspread_even_label=K'ulaj Rub'eyal\n\n# Document properties dialog box\ndocument_properties.title=Taq richinil wuj…\ndocument_properties_label=Taq richinil wuj…\ndocument_properties_file_name=Rub'i' yakb'äl:\ndocument_properties_file_size=Runimilem yakb'äl:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=B'i'aj:\ndocument_properties_author=B'anel:\ndocument_properties_subject=Taqikil:\ndocument_properties_keywords=Kixe'el taq tzij:\ndocument_properties_creation_date=Ruq'ijul xtz'uk:\ndocument_properties_modification_date=Ruq'ijul xjalwachïx:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Q'inonel:\ndocument_properties_producer=PDF b'anöy:\ndocument_properties_version=PDF ruwäch:\ndocument_properties_page_count=Jarupe' ruxaq:\ndocument_properties_page_size=Runimilem ri Ruxaq:\ndocument_properties_page_size_unit_inches=pa\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=rupalem\ndocument_properties_page_size_orientation_landscape=rukotz'olem\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Loman wuj\ndocument_properties_page_size_name_legal=Taqanel tzijol\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Anin Rutz'etik Ajk'amaya'l:\ndocument_properties_linearized_yes=Ja'\ndocument_properties_linearized_no=Mani\ndocument_properties_close=Titz'apïx\n\nprint_progress_message=Ruchojmirisaxik wuj richin nitz'ajb'äx…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Tiq'at\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Tijal ri ajxikin kajtz'ik\ntoggle_sidebar_notification.title=Tik'ex ri ajxikin yuqkajtz'ik (ri wuj eruk'wan taq ruchi'/taqoj taq yakb'äl)\ntoggle_sidebar_notification2.title=Tik'ex ri ajxikin yuqkajtz'ik (ri wuj eruk'wan taq ruchi'/taqo/kuchuj)\ntoggle_sidebar_label=Tijal ri ajxikin kajtz'ik\ndocument_outline.title=Tik'ut pe ruch'akulal wuj (kamul-pitz'oj richin nirik'/nich'utinirisäx ronojel ruch'akulal)\ndocument_outline_label=Ruch'akulal wuj\nattachments.title=Kek'ut pe ri taq taqoj\nattachments_label=Taq taqoj\nlayers.title=Kek'ut taq Kuchuj (ka'i'-pitz' richin yetzolïx ronojel ri taq kuchuj e k'o wi)\nlayers_label=Taq kuchuj\nthumbs.title=Kek'ut pe taq ch'utiq\nthumbs_label=Koköj\ncurrent_outline_item.title=Kekanöx  Taq Ch'akulal Kik'wan Chib'äl\ncurrent_outline_item_label=Taq Ch'akulal Kik'wan Chib'äl\nfindbar.title=Tikanöx chupam ri wuj\nfindbar_label=Tikanöx\n\nadditional_layers=Tz'aqat ta Kuchuj\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Ruxaq {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Ruxaq {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Ruch'utinirisaxik ruxaq {{page}}\n\n# Find panel button title and messages\nfind_input.title=Tikanöx\nfind_input.placeholder=Tikanöx pa wuj…\nfind_previous.title=Tib'an b'enam pa ri jun kan q'aptzij xilitäj\nfind_previous_label=Jun kan\nfind_next.title=Tib'e pa ri jun chik pajtzij xilitäj\nfind_next_label=Jun chik\nfind_highlight=Tiya' retal ronojel\nfind_match_case_label=Tuk'äm ri' kik'in taq nimatz'ib' chuqa' taq ch'utitz'ib'\nfind_entire_word_label=Tz'aqät taq tzij\nfind_reached_top=Xb'eq'i' ri rutikirib'al wuj, xtikanöx k'a pa ruk'isib'äl\nfind_reached_bottom=Xb'eq'i' ri ruk'isib'äl wuj, xtikanöx pa rutikirib'al\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} richin {{total}} nuk'äm ri'\nfind_match_count[two]={{current}} richin {{total}} nikik'äm ki'\nfind_match_count[few]={{current}} richin {{total}} nikik'äm ki'\nfind_match_count[many]={{current}} richin {{total}} nikik'äm ki'\nfind_match_count[other]={{current}} richin {{total}} nikik'äm ki'\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=K'ïy chi re {{limit}} nikik'äm ki'\nfind_match_count_limit[one]=K'ïy chi re {{limit}} nuk'äm ri'\nfind_match_count_limit[two]=K'ïy chi re {{limit}} nikik'äm ki'\nfind_match_count_limit[few]=K'ïy chi re {{limit}} nikik'äm ki'\nfind_match_count_limit[many]=K'ïy chi re {{limit}} nikik'äm ki'\nfind_match_count_limit[other]=K'ïy chi re {{limit}} nikik'äm ki'\nfind_not_found=Man xilitäj ta ri pajtzij\n\n# Error panel labels\nerror_more_info=Ch'aqa' chik rutzijol\nerror_less_info=Jub'a' ok rutzijol\nerror_close=Titz'apïx\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Uqxa'n: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Tzub'aj: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Yakb'äl: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=B'ey: {{line}}\nrendering_error=Xk'ulwachitäj jun sachoj toq ninuk'wachij ri ruxaq.\n\n# Predefined zoom values\npage_scale_width=Ruwa ruxaq\npage_scale_fit=Tinuk' ruxaq\npage_scale_auto=Yonil chi nimilem\npage_scale_actual=Runimilem Wakami\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=\\u0020Xk'ulwachitäj jun sach'oj toq xnuk'ux ri PDF .\ninvalid_file_error=Man oke ta o yujtajinäq ri PDF yakb'äl.\nmissing_file_error=Man xilitäj ta ri PDF yakb'äl.\nunexpected_response_error=Man oyob'en ta tz'olin rutzij ruk'u'x samaj.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Tz'ib'anïk]\npassword_label=Tatz'ib'aj ri ewan tzij richin najäq re yakb'äl re' pa PDF.\npassword_invalid=Man okel ta ri ewan tzij: Tatojtob'ej chik.\npassword_ok=Ütz\npassword_cancel=Tiq'at\n\nprinting_not_supported=Rutzijol k'ayewal: Ri rutz'ajb'axik man koch'el ta ronojel pa re okik'amaya'l re'.\nprinting_not_ready=Rutzijol k'ayewal: Ri PDF man xusamajij ta ronojel richin nitz'ajb'äx.\nweb_fonts_disabled=E chupül ri taq ajk'amaya'l tz'ib': man tikirel ta nokisäx ri taq tz'ib' PDF pa ch'ikenïk\n"
  },
  {
    "path": "lib/pdf.js/web/locale/ckb/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=پەڕەی پێشوو\nprevious_label=پێشوو\nnext.title=پەڕەی دوواتر\nnext_label=دوواتر\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=پەرە\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=لە {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} لە {{pagesCount}})\n\nzoom_out.title=ڕۆچوونی\nzoom_out_label=ڕۆچوونی\nzoom_in.title=هێنانەپێش\nzoom_in_label=هێنانەپێش\nzoom.title=زووم\npresentation_mode.title=گۆڕین بۆ دۆخی پێشکەشکردن\npresentation_mode_label=دۆخی پێشکەشکردن\nopen_file.title=پەڕگە بکەرەوە\nopen_file_label=کردنەوە\nprint.title=چاپکردن\nprint_label=چاپکردن\ndownload.title=داگرتن\ndownload_label=داگرتن\nbookmark.title=پێشبینینی ئێستا(لەبەریبگرەوە یان پەنجەرەیەکی نوێ بکەرەوە)\nbookmark_label=پیشبینینی ئێستا\n\n# Secondary toolbar and context menu\ntools.title=ئامرازەکان\ntools_label=ئامرازەکان\nfirst_page.title=برۆ بۆ یەکەم پەڕە\nfirst_page.label=بڕۆ بۆ یەکەم پەڕە\nfirst_page_label=بڕۆ بۆ یەکەم پەڕە\nlast_page.title=بڕۆ بۆ کۆتا پەڕە\nlast_page.label=بڕۆ بۆ کۆتا پەڕە\nlast_page_label=بڕۆ بۆ کۆتا پەڕە\npage_rotate_cw.title=ئاڕاستەی میلی کاتژمێر\npage_rotate_cw.label=ئاڕاستەی میلی کاتژمێر\npage_rotate_cw_label=ئاڕاستەی میلی کاتژمێر\npage_rotate_ccw.title=پێچەوانەی میلی کاتژمێر\npage_rotate_ccw.label=پێچەوانەی میلی کاتژمێر\npage_rotate_ccw_label=پێچەوانەی میلی کاتژمێر\n\ncursor_text_select_tool.title=توڵامرازی نیشانکەری دەق چالاک بکە\ncursor_text_select_tool_label=توڵامرازی نیشانکەری دەق\ncursor_hand_tool.title=توڵامرازی دەستی چالاک بکە\ncursor_hand_tool_label=توڵامرازی دەستی\n\nscroll_vertical.title=ناردنی ئەستوونی بەکاربێنە\nscroll_vertical_label=ناردنی ئەستوونی\nscroll_horizontal.title=ناردنی ئاسۆیی بەکاربێنە\nscroll_horizontal_label=ناردنی ئاسۆیی \nscroll_wrapped.title=ناردنی لوولکراو بەکاربێنە\nscroll_wrapped_label=ناردنی لوولکراو \n\n\n# Document properties dialog box\ndocument_properties.title=تایبەتمەندییەکانی بەڵگەنامە...\ndocument_properties_label=تایبەتمەندییەکانی بەڵگەنامە...\ndocument_properties_file_name=ناوی پەڕگە:\ndocument_properties_file_size=قەبارەی پەڕگە:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} کب ({{size_b}} بایت)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} مب ({{size_b}} بایت)\ndocument_properties_title=سەردێڕ:\ndocument_properties_author=نووسەر\ndocument_properties_subject=بابەت:\ndocument_properties_keywords=کلیلەوشە:\ndocument_properties_creation_date=بەرواری درووستکردن:\ndocument_properties_modification_date=بەرواری دەستکاریکردن:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=درووستکەر:\ndocument_properties_producer=بەرهەمهێنەری PDF:\ndocument_properties_version=وەشانی PDF:\ndocument_properties_page_count=ژمارەی پەرەکان:\ndocument_properties_page_size=قەبارەی پەڕە:\ndocument_properties_page_size_unit_inches=ئینچ\ndocument_properties_page_size_unit_millimeters=ملم\ndocument_properties_page_size_orientation_portrait=پۆرترەیت(درێژ)\ndocument_properties_page_size_orientation_landscape=پانیی\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=نامە\ndocument_properties_page_size_name_legal=یاسایی\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=پیشاندانی وێبی خێرا:\ndocument_properties_linearized_yes=بەڵێ\ndocument_properties_linearized_no=نەخێر\ndocument_properties_close=داخستن\n\nprint_progress_message=بەڵگەنامە ئامادەدەکرێت بۆ چاپکردن...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=پاشگەزبوونەوە\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=لاتەنیشت پیشاندان/شاردنەوە\ntoggle_sidebar_label=لاتەنیشت پیشاندان/شاردنەوە\ndocument_outline_label=سنووری چوارچێوە\nattachments.title=پاشکۆکان پیشان بدە\nattachments_label=پاشکۆکان\nlayers_label=چینەکان\nthumbs.title=وێنۆچکە پیشان بدە\nthumbs_label=وێنۆچکە\nfindbar.title=لە بەڵگەنامە بگەرێ\nfindbar_label=دۆزینەوە\n\nadditional_layers=چینی زیاتر\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=پەڕەی {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=پەڕەی {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=وێنۆچکەی پەڕەی {{page}}\n\n# Find panel button title and messages\nfind_input.title=دۆزینەوە\nfind_input.placeholder=لە بەڵگەنامە بگەرێ...\nfind_previous.title=هەبوونی پێشوو بدۆزرەوە لە ڕستەکەدا\nfind_previous_label=پێشوو\nfind_next.title=هەبوونی داهاتوو بدۆزەرەوە لە ڕستەکەدا\nfind_next_label=دوواتر\nfind_highlight=هەمووی نیشانە بکە\nfind_match_case_label=دۆخی لەیەکچوون\nfind_entire_word_label=هەموو وشەکان\nfind_reached_top=گەشتیتە سەرەوەی بەڵگەنامە، لە خوارەوە دەستت پێکرد\nfind_reached_bottom=گەشتیتە کۆتایی بەڵگەنامە. لەسەرەوە دەستت پێکرد\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} لە کۆی {{total}} لەیەکچوو\nfind_match_count[two]={{current}} لە کۆی {{total}} لەیەکچوو\nfind_match_count[few]={{current}} لە کۆی {{total}} لەیەکچوو\nfind_match_count[many]={{current}} لە کۆی {{total}} لەیەکچوو\nfind_match_count[other]={{current}} لە کۆی {{total}} لەیەکچوو\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=زیاتر لە {{limit}} لەیەکچوو\nfind_match_count_limit[one]=زیاتر لە {{limit}} لەیەکچوو\nfind_match_count_limit[two]=زیاتر لە {{limit}} لەیەکچوو\nfind_match_count_limit[few]=زیاتر لە {{limit}} لەیەکچوو\nfind_match_count_limit[many]=زیاتر لە {{limit}} لەیەکچوو\nfind_match_count_limit[other]=زیاتر لە {{limit}} لەیەکچوو\nfind_not_found=نووسین نەدۆزرایەوە\n\n# Error panel labels\nerror_more_info=زانیاری زیاتر\nerror_less_info=زانیاری کەمتر\nerror_close=داخستن\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=پەیام: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=لەسەریەک: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=پەڕگە: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=هێڵ: {{line}}\nrendering_error=هەڵەیەک ڕوویدا لە کاتی پوختەکردنی (ڕێندەر) پەڕە.\n\n# Predefined zoom values\npage_scale_width=پانی پەڕە\npage_scale_fit=پڕبوونی پەڕە\npage_scale_auto=زوومی خۆکار\npage_scale_actual=قەبارەی ڕاستی\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=هەڵەیەک ڕوویدا لە کاتی بارکردنی  PDF.\ninvalid_file_error=پەڕگەی pdf تێکچووە یان نەگونجاوە.\nmissing_file_error=پەڕگەی pdf بوونی نیە.\nunexpected_response_error=وەڵامی ڕاژەخوازی نەخوازراو.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} سەرنج]\npassword_label=وشەی تێپەڕ بنووسە بۆ کردنەوەی پەڕگەی pdf.\npassword_invalid=وشەی تێپەڕ هەڵەیە. تکایە دووبارە هەوڵ بدەرەوە.\npassword_ok=باشە\npassword_cancel=پاشگەزبوونەوە\n\nprinting_not_supported=ئاگاداربە: چاپکردن بە تەواوی پشتگیر ناکرێت لەم وێبگەڕە.\nprinting_not_ready=ئاگاداربە: PDF بە تەواوی بارنەبووە بۆ چاپکردن.\nweb_fonts_disabled=جۆرەپیتی وێب ناچالاکە: نەتوانی جۆرەپیتی تێخراوی ناو pdfـەکە بەکاربێت.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/cs/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Přejde na předchozí stránku\nprevious_label=Předchozí\nnext.title=Přejde na následující stránku\nnext_label=Další\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Stránka\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=z {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} z {{pagesCount}})\n\nzoom_out.title=Zmenší velikost\nzoom_out_label=Zmenšit\nzoom_in.title=Zvětší velikost\nzoom_in_label=Zvětšit\nzoom.title=Nastaví velikost\npresentation_mode.title=Přepne do režimu prezentace\npresentation_mode_label=Režim prezentace\nopen_file.title=Otevře soubor\nopen_file_label=Otevřít\nprint.title=Vytiskne dokument\nprint_label=Vytisknout\ndownload.title=Stáhne dokument\ndownload_label=Stáhnout\nbookmark.title=Současný pohled (kopírovat nebo otevřít v novém okně)\nbookmark_label=Současný pohled\n\n# Secondary toolbar and context menu\ntools.title=Nástroje\ntools_label=Nástroje\nfirst_page.title=Přejde na první stránku\nfirst_page.label=Přejít na první stránku\nfirst_page_label=Přejít na první stránku\nlast_page.title=Přejde na poslední stránku\nlast_page.label=Přejít na poslední stránku\nlast_page_label=Přejít na poslední stránku\npage_rotate_cw.title=Otočí po směru hodin\npage_rotate_cw.label=Otočit po směru hodin\npage_rotate_cw_label=Otočit po směru hodin\npage_rotate_ccw.title=Otočí proti směru hodin\npage_rotate_ccw.label=Otočit proti směru hodin\npage_rotate_ccw_label=Otočit proti směru hodin\n\ncursor_text_select_tool.title=Povolí výběr textu\ncursor_text_select_tool_label=Výběr textu\ncursor_hand_tool.title=Povolí nástroj ručička\ncursor_hand_tool_label=Nástroj ručička\n\nscroll_vertical.title=Použít svislé posouvání\nscroll_vertical_label=Svislé posouvání\nscroll_horizontal.title=Použít vodorovné posouvání\nscroll_horizontal_label=Vodorovné posouvání\nscroll_wrapped.title=Použít postupné posouvání\nscroll_wrapped_label=Postupné posouvání\n\nspread_none.title=Nesdružovat stránky\nspread_none_label=Žádné sdružení\nspread_odd.title=Sdruží stránky s umístěním lichých vlevo\nspread_odd_label=Sdružení stránek (liché vlevo)\nspread_even.title=Sdruží stránky s umístěním sudých vlevo\nspread_even_label=Sdružení stránek (sudé vlevo)\n\n# Document properties dialog box\ndocument_properties.title=Vlastnosti dokumentu…\ndocument_properties_label=Vlastnosti dokumentu…\ndocument_properties_file_name=Název souboru:\ndocument_properties_file_size=Velikost souboru:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bajtů)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajtů)\ndocument_properties_title=Název stránky:\ndocument_properties_author=Autor:\ndocument_properties_subject=Předmět:\ndocument_properties_keywords=Klíčová slova:\ndocument_properties_creation_date=Datum vytvoření:\ndocument_properties_modification_date=Datum úpravy:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Vytvořil:\ndocument_properties_producer=Tvůrce PDF:\ndocument_properties_version=Verze PDF:\ndocument_properties_page_count=Počet stránek:\ndocument_properties_page_size=Velikost stránky:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=na výšku\ndocument_properties_page_size_orientation_landscape=na šířku\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Dopis\ndocument_properties_page_size_name_legal=Právní dokument\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Rychlé zobrazování z webu:\ndocument_properties_linearized_yes=Ano\ndocument_properties_linearized_no=Ne\ndocument_properties_close=Zavřít\n\nprint_progress_message=Příprava dokumentu pro tisk…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}} %\nprint_progress_close=Zrušit\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Postranní lišta\ntoggle_sidebar_notification.title=Přepne postranní lištu (dokument obsahuje osnovu/přílohy)\ntoggle_sidebar_notification2.title=Přepnout postranní lištu (dokument obsahuje osnovu/přílohy/vrstvy)\ntoggle_sidebar_label=Postranní lišta\ndocument_outline.title=Zobrazí osnovu dokumentu (dvojité klepnutí rozbalí/sbalí všechny položky)\ndocument_outline_label=Osnova dokumentu\nattachments.title=Zobrazí přílohy\nattachments_label=Přílohy\nlayers.title=Zobrazit vrstvy (poklepáním obnovíte všechny vrstvy do výchozího stavu)\nlayers_label=Vrstvy\nthumbs.title=Zobrazí náhledy\nthumbs_label=Náhledy\ncurrent_outline_item.title=Najít aktuální položku v osnově\ncurrent_outline_item_label=Aktuální položka v osnově\nfindbar.title=Najde v dokumentu\nfindbar_label=Najít\n\nadditional_layers=Další vrstvy\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Strana {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Strana {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Náhled strany {{page}}\n\n# Find panel button title and messages\nfind_input.title=Najít\nfind_input.placeholder=Najít v dokumentu…\nfind_previous.title=Najde předchozí výskyt hledaného textu\nfind_previous_label=Předchozí\nfind_next.title=Najde další výskyt hledaného textu\nfind_next_label=Další\nfind_highlight=Zvýraznit\nfind_match_case_label=Rozlišovat velikost\nfind_entire_word_label=Celá slova\nfind_reached_top=Dosažen začátek dokumentu, pokračuje se od konce\nfind_reached_bottom=Dosažen konec dokumentu, pokračuje se od začátku\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}}. z {{total}} výskytu\nfind_match_count[two]={{current}}. z {{total}} výskytů\nfind_match_count[few]={{current}}. z {{total}} výskytů\nfind_match_count[many]={{current}}. z {{total}} výskytů\nfind_match_count[other]={{current}}. z {{total}} výskytů\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Více než {{limit}} výskytů\nfind_match_count_limit[one]=Více než {{limit}} výskyt\nfind_match_count_limit[two]=Více než {{limit}} výskyty\nfind_match_count_limit[few]=Více než {{limit}} výskyty\nfind_match_count_limit[many]=Více než {{limit}} výskytů\nfind_match_count_limit[other]=Více než {{limit}} výskytů\nfind_not_found=Hledaný text nenalezen\n\n# Error panel labels\nerror_more_info=Více informací\nerror_less_info=Méně informací\nerror_close=Zavřít\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (sestavení: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Zpráva: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Zásobník: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Soubor: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Řádek: {{line}}\nrendering_error=Při vykreslování stránky nastala chyba.\n\n# Predefined zoom values\npage_scale_width=Podle šířky\npage_scale_fit=Podle výšky\npage_scale_auto=Automatická velikost\npage_scale_actual=Skutečná velikost\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}} %\n\n# Loading indicator messages\nloading_error=Při nahrávání PDF nastala chyba.\ninvalid_file_error=Neplatný nebo chybný soubor PDF.\nmissing_file_error=Chybí soubor PDF.\nunexpected_response_error=Neočekávaná odpověď serveru.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotace typu {{type}}]\npassword_label=Pro otevření PDF souboru vložte heslo.\npassword_invalid=Neplatné heslo. Zkuste to znovu.\npassword_ok=OK\npassword_cancel=Zrušit\n\nprinting_not_supported=Upozornění: Tisk není v tomto prohlížeči plně podporován.\nprinting_not_ready=Upozornění: Dokument PDF není kompletně načten.\nweb_fonts_disabled=Webová písma jsou zakázána, proto není možné použít vložená písma PDF.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/cy/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Tudalen Flaenorol\nprevious_label=Blaenorol\nnext.title=Tudalen Nesaf\nnext_label=Nesaf\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Tudalen\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=o {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} o {{pagesCount}})\n\nzoom_out.title=Chwyddo Allan\nzoom_out_label=Chwyddo Allan\nzoom_in.title=Chwyddo Mewn\nzoom_in_label=Chwyddo Mewn\nzoom.title=Chwyddo\npresentation_mode.title=Newid i'r Modd Cyflwyno\npresentation_mode_label=Modd Cyflwyno\nopen_file.title=Agor Ffeil\nopen_file_label=Agor\nprint.title=Argraffu\nprint_label=Argraffu\ndownload.title=Llwyth\ndownload_label=Llwytho i Lawr\nbookmark.title=Golwg cyfredol (copïo neu agor ffenestr newydd)\nbookmark_label=Golwg Gyfredol\n\n# Secondary toolbar and context menu\ntools.title=Offer\ntools_label=Offer\nfirst_page.title=Mynd i'r Dudalen Gyntaf\nfirst_page.label=Mynd i'r Dudalen Gyntaf\nfirst_page_label=Mynd i'r Dudalen Gyntaf\nlast_page.title=Mynd i'r Dudalen Olaf\nlast_page.label=Mynd i'r Dudalen Olaf\nlast_page_label=Mynd i'r Dudalen Olaf\npage_rotate_cw.title=Cylchdroi Clocwedd\npage_rotate_cw.label=Cylchdroi Clocwedd\npage_rotate_cw_label=Cylchdroi Clocwedd\npage_rotate_ccw.title=Cylchdroi Gwrthglocwedd\npage_rotate_ccw.label=Cylchdroi Gwrthglocwedd\npage_rotate_ccw_label=Cylchdroi Gwrthglocwedd\n\ncursor_text_select_tool.title=Galluogi Dewis Offeryn Testun\ncursor_text_select_tool_label=Offeryn Dewis Testun\ncursor_hand_tool.title=Galluogi Offeryn Llaw\ncursor_hand_tool_label=Offeryn Llaw\n\nscroll_vertical.title=Defnyddio Sgrolio Fertigol\nscroll_vertical_label=Sgrolio Fertigol\nscroll_horizontal.title=Defnyddio Sgrolio Fertigol\nscroll_horizontal_label=Sgrolio Fertigol\nscroll_wrapped.title=Defnyddio Sgrolio Amlapio\nscroll_wrapped_label=Sgrolio Amlapio\n\nspread_none.title=Peidio uno taeniadau canol\nspread_none_label=Dim Taeniadau\nspread_odd.title=Uno taeniadau tudalen yn cychwyn gyda thudalennau odrif\nspread_odd_label=Taeniadau Odrifau\nspread_even.title=Uno taeniadau tudalen yn cychwyn gyda thudalennau eilrif\nspread_even_label=Taeniadau Eilrif\n\n# Document properties dialog box\ndocument_properties.title=Priodweddau Dogfen…\ndocument_properties_label=Priodweddau Dogfen…\ndocument_properties_file_name=Enw ffeil:\ndocument_properties_file_size=Maint ffeil:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} beit)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} beit)\ndocument_properties_title=Teitl:\ndocument_properties_author=Awdur:\ndocument_properties_subject=Pwnc:\ndocument_properties_keywords=Allweddair:\ndocument_properties_creation_date=Dyddiad Creu:\ndocument_properties_modification_date=Dyddiad Addasu:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Crewr:\ndocument_properties_producer=Cynhyrchydd PDF:\ndocument_properties_version=Fersiwn PDF:\ndocument_properties_page_count=Cyfrif Tudalen:\ndocument_properties_page_size=Maint Tudalen:\ndocument_properties_page_size_unit_inches=o fewn\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=portread\ndocument_properties_page_size_orientation_landscape=tirlun\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Llythyr\ndocument_properties_page_size_name_legal=Cyfreithiol\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Golwg Gwe Cyflym:\ndocument_properties_linearized_yes=Iawn\ndocument_properties_linearized_no=Na\ndocument_properties_close=Cau\n\nprint_progress_message=Paratoi dogfen ar gyfer ei hargraffu…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Diddymu\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toglo'r Bar Ochr\ntoggle_sidebar_notification.title=Toglo'r Bar Ochr (mae'r ddogfen yn cynnwys outline/attachments)\ntoggle_sidebar_notification2.title=Toglo'r Bar Ochr (mae'r ddogfen yn cynnwys amlinelliadau/atodiadau/haenau)\ntoggle_sidebar_label=Toglo'r Bar Ochr\ndocument_outline.title=Dangos Amlinell Dogfen (clic dwbl i ymestyn/cau pob eitem)\ndocument_outline_label=Amlinelliad Dogfen\nattachments.title=Dangos Atodiadau\nattachments_label=Atodiadau\nlayers.title=Dangos Haenau (cliciwch ddwywaith i ailosod yr holl haenau i'r cyflwr rhagosodedig)\nlayers_label=Haenau\nthumbs.title=Dangos Lluniau Bach\nthumbs_label=Lluniau Bach\ncurrent_outline_item.title=Canfod yr Eitem Amlinellol Gyfredol\ncurrent_outline_item_label=Yr Eitem Amlinellol Gyfredol\nfindbar.title=Canfod yn y Ddogfen\nfindbar_label=Canfod\n\nadditional_layers=Haenau Ychwanegol\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Tudalen {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Tudalen {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Llun Bach Tudalen {{page}}\n\n# Find panel button title and messages\nfind_input.title=Canfod\nfind_input.placeholder=Canfod yn y ddogfen…\nfind_previous.title=Canfod enghraifft flaenorol o'r ymadrodd\nfind_previous_label=Blaenorol\nfind_next.title=Canfod enghraifft nesaf yr ymadrodd\nfind_next_label=Nesaf\nfind_highlight=Amlygu popeth\nfind_match_case_label=Cydweddu maint\nfind_entire_word_label=Geiriau cyfan\nfind_reached_top=Wedi cyrraedd brig y dudalen, parhau o'r gwaelod\nfind_reached_bottom=Wedi cyrraedd diwedd y dudalen, parhau o'r brig\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} o {{total}} cydweddiad\nfind_match_count[two]={{current}} o {{total}} cydweddiad\nfind_match_count[few]={{current}} o {{total}} cydweddiad\nfind_match_count[many]={{current}} o {{total}} cydweddiad\nfind_match_count[other]={{current}} o {{total}} cydweddiad\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Mwy na {{limit}} cydweddiad\nfind_match_count_limit[one]=Mwy na {{limit}} cydweddiad\nfind_match_count_limit[two]=Mwy na {{limit}} cydweddiad\nfind_match_count_limit[few]=Mwy na {{limit}} cydweddiad\nfind_match_count_limit[many]=Mwy na {{limit}} cydweddiad\nfind_match_count_limit[other]=Mwy na {{limit}} cydweddiad\nfind_not_found=Heb ganfod ymadrodd\n\n# Error panel labels\nerror_more_info=Rhagor o Wybodaeth\nerror_less_info=Llai o wybodaeth\nerror_close=Cau\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Neges: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stac: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ffeil: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Llinell: {{line}}\nrendering_error=Digwyddodd gwall wrth adeiladu'r dudalen.\n\n# Predefined zoom values\npage_scale_width=Lled Tudalen\npage_scale_fit=Ffit Tudalen\npage_scale_auto=Chwyddo Awtomatig\npage_scale_actual=Maint Gwirioneddol\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Digwyddodd gwall wrth lwytho'r PDF.\ninvalid_file_error=Ffeil PDF annilys neu llwgr.\nmissing_file_error=Ffeil PDF coll.\nunexpected_response_error=Ymateb annisgwyl gan y gweinydd.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anodiad {{type}} ]\npassword_label=Rhowch gyfrinair i agor y PDF.\npassword_invalid=Cyfrinair annilys. Ceisiwch eto.\npassword_ok=Iawn\npassword_cancel=Diddymu\n\nprinting_not_supported=Rhybudd: Nid yw argraffu yn cael ei gynnal yn llawn gan y porwr.\nprinting_not_ready=Rhybudd: Nid yw'r PDF wedi ei lwytho'n llawn ar gyfer argraffu.\nweb_fonts_disabled=Ffontiau gwe wedi eu hanalluogi: methu defnyddio ffontiau PDF mewnblanedig.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/da/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Forrige side\nprevious_label=Forrige\nnext.title=Næste side\nnext_label=Næste\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Side\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=af {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} af {{pagesCount}})\n\nzoom_out.title=Zoom ud\nzoom_out_label=Zoom ud\nzoom_in.title=Zoom ind\nzoom_in_label=Zoom ind\nzoom.title=Zoom\npresentation_mode.title=Skift til fuldskærmsvisning\npresentation_mode_label=Fuldskærmsvisning\nopen_file.title=Åbn fil\nopen_file_label=Åbn\nprint.title=Udskriv\nprint_label=Udskriv\ndownload.title=Hent\ndownload_label=Hent\nbookmark.title=Aktuel visning (kopier eller åbn i et nyt vindue)\nbookmark_label=Aktuel visning\n\n# Secondary toolbar and context menu\ntools.title=Funktioner\ntools_label=Funktioner\nfirst_page.title=Gå til første side\nfirst_page.label=Gå til første side\nfirst_page_label=Gå til første side\nlast_page.title=Gå til sidste side\nlast_page.label=Gå til sidste side\nlast_page_label=Gå til sidste side\npage_rotate_cw.title=Roter med uret\npage_rotate_cw.label=Roter med uret\npage_rotate_cw_label=Roter med uret\npage_rotate_ccw.title=Roter mod uret\npage_rotate_ccw.label=Roter mod uret\npage_rotate_ccw_label=Roter mod uret\n\ncursor_text_select_tool.title=Aktiver markeringsværktøj\ncursor_text_select_tool_label=Markeringsværktøj\ncursor_hand_tool.title=Aktiver håndværktøj\ncursor_hand_tool_label=Håndværktøj\n\nscroll_vertical.title=Brug vertikal scrolling\nscroll_vertical_label=Vertikal scrolling\nscroll_horizontal.title=Brug horisontal scrolling\nscroll_horizontal_label=Horisontal scrolling\nscroll_wrapped.title=Brug ombrudt scrolling\nscroll_wrapped_label=Ombrudt scrolling\n\nspread_none.title=Vis enkeltsider\nspread_none_label=Enkeltsider\nspread_odd.title=Vis opslag med ulige sidenumre til venstre\nspread_odd_label=Opslag med forside\nspread_even.title=Vis opslag med lige sidenumre til venstre\nspread_even_label=Opslag uden forside\n\n# Document properties dialog box\ndocument_properties.title=Dokumentegenskaber…\ndocument_properties_label=Dokumentegenskaber…\ndocument_properties_file_name=Filnavn:\ndocument_properties_file_size=Filstørrelse:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titel:\ndocument_properties_author=Forfatter:\ndocument_properties_subject=Emne:\ndocument_properties_keywords=Nøgleord:\ndocument_properties_creation_date=Oprettet:\ndocument_properties_modification_date=Redigeret:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Program:\ndocument_properties_producer=PDF-producent:\ndocument_properties_version=PDF-version:\ndocument_properties_page_count=Antal sider:\ndocument_properties_page_size=Sidestørrelse:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=stående\ndocument_properties_page_size_orientation_landscape=liggende\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Hurtig web-visning:\ndocument_properties_linearized_yes=Ja\ndocument_properties_linearized_no=Nej\ndocument_properties_close=Luk\n\nprint_progress_message=Forbereder dokument til udskrivning…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Annuller\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Slå sidepanel til eller fra\ntoggle_sidebar_notification.title=Slå sidepanel til eller fra (dokumentet indeholder disposition/vedhæftede filer)\ntoggle_sidebar_notification2.title=Slå sidepanel til eller fra (dokumentet indeholder disposition/vedhæftede filer/lag)\ntoggle_sidebar_label=Slå sidepanel til eller fra\ndocument_outline.title=Vis dokumentets disposition (dobbeltklik for at vise/skjule alle elementer)\ndocument_outline_label=Dokument-disposition\nattachments.title=Vis vedhæftede filer\nattachments_label=Vedhæftede filer\nlayers.title=Vis lag (dobbeltklik for at nulstille alle lag til standard-tilstanden)\nlayers_label=Lag\nthumbs.title=Vis miniaturer\nthumbs_label=Miniaturer\ncurrent_outline_item.title=Find det aktuelle dispositions-element\ncurrent_outline_item_label=Aktuelt dispositions-element\nfindbar.title=Find i dokument\nfindbar_label=Find\n\nadditional_layers=Yderligere lag\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Side {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Side {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniature af side {{page}}\n\n# Find panel button title and messages\nfind_input.title=Find\nfind_input.placeholder=Find i dokument…\nfind_previous.title=Find den forrige forekomst\nfind_previous_label=Forrige\nfind_next.title=Find den næste forekomst\nfind_next_label=Næste\nfind_highlight=Fremhæv alle\nfind_match_case_label=Forskel på store og små bogstaver\nfind_entire_word_label=Hele ord\nfind_reached_top=Toppen af siden blev nået, fortsatte fra bunden\nfind_reached_bottom=Bunden af siden blev nået, fortsatte fra toppen\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} af {{total}} forekomst\nfind_match_count[two]={{current}} af {{total}} forekomster\nfind_match_count[few]={{current}} af {{total}} forekomster\nfind_match_count[many]={{current}} af {{total}} forekomster\nfind_match_count[other]={{current}} af {{total}} forekomster\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Mere end {{limit}} forekomster\nfind_match_count_limit[one]=Mere end {{limit}} forekomst\nfind_match_count_limit[two]=Mere end {{limit}} forekomster\nfind_match_count_limit[few]=Mere end {{limit}} forekomster\nfind_match_count_limit[many]=Mere end {{limit}} forekomster\nfind_match_count_limit[other]=Mere end {{limit}} forekomster\nfind_not_found=Der blev ikke fundet noget\n\n# Error panel labels\nerror_more_info=Mere information\nerror_less_info=Mindre information\nerror_close=Luk\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Fejlmeddelelse: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fil: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linje: {{line}}\nrendering_error=Der opstod en fejl ved generering af siden.\n\n# Predefined zoom values\npage_scale_width=Sidebredde\npage_scale_fit=Tilpas til side\npage_scale_auto=Automatisk zoom\npage_scale_actual=Faktisk størrelse\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Der opstod en fejl ved indlæsning af PDF-filen.\ninvalid_file_error=PDF-filen er ugyldig eller ødelagt.\nmissing_file_error=Manglende PDF-fil.\nunexpected_response_error=Uventet svar fra serveren.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}kommentar]\npassword_label=Angiv adgangskode til at åbne denne PDF-fil.\npassword_invalid=Ugyldig adgangskode. Prøv igen.\npassword_ok=OK\npassword_cancel=Fortryd\n\nprinting_not_supported=Advarsel: Udskrivning er ikke fuldt understøttet af browseren.\nprinting_not_ready=Advarsel: PDF-filen er ikke fuldt indlæst til udskrivning.\nweb_fonts_disabled=Webskrifttyper er deaktiverede. De indlejrede skrifttyper i PDF-filen kan ikke anvendes.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/de/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Eine Seite zurück\nprevious_label=Zurück\nnext.title=Eine Seite vor\nnext_label=Vor\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Seite\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=von {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} von {{pagesCount}})\n\nzoom_out.title=Verkleinern\nzoom_out_label=Verkleinern\nzoom_in.title=Vergrößern\nzoom_in_label=Vergrößern\nzoom.title=Zoom\npresentation_mode.title=In Präsentationsmodus wechseln\npresentation_mode_label=Präsentationsmodus\nopen_file.title=Datei öffnen\nopen_file_label=Öffnen\nprint.title=Drucken\nprint_label=Drucken\ndownload.title=Dokument speichern\ndownload_label=Speichern\nbookmark.title=Aktuelle Ansicht (zum Kopieren oder Öffnen in einem neuen Fenster)\nbookmark_label=Aktuelle Ansicht\n\n# Secondary toolbar and context menu\ntools.title=Werkzeuge\ntools_label=Werkzeuge\nfirst_page.title=Erste Seite anzeigen\nfirst_page.label=Erste Seite anzeigen\nfirst_page_label=Erste Seite anzeigen\nlast_page.title=Letzte Seite anzeigen\nlast_page.label=Letzte Seite anzeigen\nlast_page_label=Letzte Seite anzeigen\npage_rotate_cw.title=Im Uhrzeigersinn drehen\npage_rotate_cw.label=Im Uhrzeigersinn drehen\npage_rotate_cw_label=Im Uhrzeigersinn drehen\npage_rotate_ccw.title=Gegen Uhrzeigersinn drehen\npage_rotate_ccw.label=Gegen Uhrzeigersinn drehen\npage_rotate_ccw_label=Gegen Uhrzeigersinn drehen\n\ncursor_text_select_tool.title=Textauswahl-Werkzeug aktivieren\ncursor_text_select_tool_label=Textauswahl-Werkzeug\ncursor_hand_tool.title=Hand-Werkzeug aktivieren\ncursor_hand_tool_label=Hand-Werkzeug\n\nscroll_vertical.title=Seiten übereinander anordnen\nscroll_vertical_label=Vertikale Seitenanordnung\nscroll_horizontal.title=Seiten nebeneinander anordnen\nscroll_horizontal_label=Horizontale Seitenanordnung\nscroll_wrapped.title=Seiten neben- und übereinander anordnen, anhängig vom Platz\nscroll_wrapped_label=Kombinierte Seitenanordnung\n\nspread_none.title=Seiten nicht nebeneinander anzeigen\nspread_none_label=Einzelne Seiten\nspread_odd.title=Jeweils eine ungerade und eine gerade Seite nebeneinander anzeigen\nspread_odd_label=Ungerade + gerade Seite\nspread_even.title=Jeweils eine gerade und eine ungerade Seite nebeneinander anzeigen\nspread_even_label=Gerade + ungerade Seite\n\n# Document properties dialog box\ndocument_properties.title=Dokumenteigenschaften\ndocument_properties_label=Dokumenteigenschaften…\ndocument_properties_file_name=Dateiname:\ndocument_properties_file_size=Dateigröße:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} Bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} Bytes)\ndocument_properties_title=Titel:\ndocument_properties_author=Autor:\ndocument_properties_subject=Thema:\ndocument_properties_keywords=Stichwörter:\ndocument_properties_creation_date=Erstelldatum:\ndocument_properties_modification_date=Bearbeitungsdatum:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}} {{time}}\ndocument_properties_creator=Anwendung:\ndocument_properties_producer=PDF erstellt mit:\ndocument_properties_version=PDF-Version:\ndocument_properties_page_count=Seitenzahl:\ndocument_properties_page_size=Seitengröße:\ndocument_properties_page_size_unit_inches=Zoll\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=Hochformat\ndocument_properties_page_size_orientation_landscape=Querformat\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Schnelle Webanzeige:\ndocument_properties_linearized_yes=Ja\ndocument_properties_linearized_no=Nein\ndocument_properties_close=Schließen\n\nprint_progress_message=Dokument wird für Drucken vorbereitet…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}} %\nprint_progress_close=Abbrechen\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Sidebar umschalten\ntoggle_sidebar_notification.title=Sidebar umschalten (Dokument enthält Dokumentstruktur/Anhänge)\ntoggle_sidebar_notification2.title=Sidebar umschalten (Dokument enthält Dokumentstruktur/Anhänge/Ebenen)\ntoggle_sidebar_label=Sidebar umschalten\ndocument_outline.title=Dokumentstruktur anzeigen (Doppelklicken, um alle Einträge aus- bzw. einzuklappen)\ndocument_outline_label=Dokumentstruktur\nattachments.title=Anhänge anzeigen\nattachments_label=Anhänge\nlayers.title=Ebenen anzeigen (Doppelklicken, um alle Ebenen auf den Standardzustand zurückzusetzen)\nlayers_label=Ebenen\nthumbs.title=Miniaturansichten anzeigen\nthumbs_label=Miniaturansichten\ncurrent_outline_item.title=Aktuelles Struktur-Element finden\ncurrent_outline_item_label=Aktuelles Struktur-Element\nfindbar.title=Dokument durchsuchen\nfindbar_label=Suchen\n\nadditional_layers=Zusätzliche Ebenen\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Seite {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Seite {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniaturansicht von Seite {{page}}\n\n# Find panel button title and messages\nfind_input.title=Suchen\nfind_input.placeholder=Im Dokument suchen…\nfind_previous.title=Vorheriges Vorkommen des Suchbegriffs finden\nfind_previous_label=Zurück\nfind_next.title=Nächstes Vorkommen des Suchbegriffs finden\nfind_next_label=Weiter\nfind_highlight=Alle hervorheben\nfind_match_case_label=Groß-/Kleinschreibung beachten\nfind_entire_word_label=Ganze Wörter\nfind_reached_top=Anfang des Dokuments erreicht, fahre am Ende fort\nfind_reached_bottom=Ende des Dokuments erreicht, fahre am Anfang fort\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} von {{total}} Übereinstimmung\nfind_match_count[two]={{current}} von {{total}} Übereinstimmungen\nfind_match_count[few]={{current}} von {{total}} Übereinstimmungen\nfind_match_count[many]={{current}} von {{total}} Übereinstimmungen\nfind_match_count[other]={{current}} von {{total}} Übereinstimmungen\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Mehr als {{limit}} Übereinstimmungen\nfind_match_count_limit[one]=Mehr als {{limit}} Übereinstimmung\nfind_match_count_limit[two]=Mehr als {{limit}} Übereinstimmungen\nfind_match_count_limit[few]=Mehr als {{limit}} Übereinstimmungen\nfind_match_count_limit[many]=Mehr als {{limit}} Übereinstimmungen\nfind_match_count_limit[other]=Mehr als {{limit}} Übereinstimmungen\nfind_not_found=Suchbegriff nicht gefunden\n\n# Error panel labels\nerror_more_info=Mehr Informationen\nerror_less_info=Weniger Informationen\nerror_close=Schließen\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js Version {{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Nachricht: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Aufrufliste: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Datei: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Zeile: {{line}}\nrendering_error=Beim Darstellen der Seite trat ein Fehler auf.\n\n# Predefined zoom values\npage_scale_width=Seitenbreite\npage_scale_fit=Seitengröße\npage_scale_auto=Automatischer Zoom\npage_scale_actual=Originalgröße\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}} %\n\n# Loading indicator messages\nloading_error=Beim Laden der PDF-Datei trat ein Fehler auf.\ninvalid_file_error=Ungültige oder beschädigte PDF-Datei\nmissing_file_error=Fehlende PDF-Datei\nunexpected_response_error=Unerwartete Antwort des Servers\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anlage: {{type}}]\npassword_label=Geben Sie zum Öffnen der PDF-Datei deren Passwort ein.\npassword_invalid=Falsches Passwort. Bitte versuchen Sie es erneut.\npassword_ok=OK\npassword_cancel=Abbrechen\n\nprinting_not_supported=Warnung: Die Drucken-Funktion wird durch diesen Browser nicht vollständig unterstützt.\nprinting_not_ready=Warnung: Die PDF-Datei ist nicht vollständig geladen, dies ist für das Drucken aber empfohlen.\nweb_fonts_disabled=Web-Schriftarten sind deaktiviert: Eingebettete PDF-Schriftarten konnten nicht geladen werden.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/dsb/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pjerwjejšny bok\nprevious_label=Slědk\nnext.title=Pśiducy bok\nnext_label=Dalej\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Bok\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=z {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} z {{pagesCount}})\n\nzoom_out.title=Pómjeńšyś\nzoom_out_label=Pómjeńšyś\nzoom_in.title=Pówětšyś\nzoom_in_label=Pówětšyś\nzoom.title=Skalěrowanje\npresentation_mode.title=Do prezentaciskego modusa pśejś\npresentation_mode_label=Prezentaciski modus\nopen_file.title=Dataju wócyniś\nopen_file_label=Wócyniś\nprint.title=Śišćaś\nprint_label=Śišćaś\ndownload.title=Ześěgnuś\ndownload_label=Ześěgnuś\nbookmark.title=Aktualny naglěd (kopěrowaś abo w nowem woknje wócyniś)\nbookmark_label=Aktualny naglěd\n\n# Secondary toolbar and context menu\ntools.title=Rědy\ntools_label=Rědy\nfirst_page.title=K prědnemu bokoju\nfirst_page.label=K prědnemu bokoju\nfirst_page_label=K prědnemu bokoju\nlast_page.title=K slědnemu bokoju\nlast_page.label=K slědnemu bokoju\nlast_page_label=K slědnemu bokoju\npage_rotate_cw.title=Wobwjertnuś ako špěra źo\npage_rotate_cw.label=Wobwjertnuś ako špěra źo\npage_rotate_cw_label=Wobwjertnuś ako špěra źo\npage_rotate_ccw.title=Wobwjertnuś nawopaki ako špěra źo\npage_rotate_ccw.label=Wobwjertnuś nawopaki ako špěra źo\npage_rotate_ccw_label=Wobwjertnuś nawopaki ako špěra źo\n\ncursor_text_select_tool.title=Rěd za wuběranje teksta zmóžniś\ncursor_text_select_tool_label=Rěd za wuběranje teksta\ncursor_hand_tool.title=Rucny rěd zmóžniś\ncursor_hand_tool_label=Rucny rěd\n\nscroll_vertical.title=Wertikalne suwanje wužywaś\nscroll_vertical_label=Wertikalnje suwanje\nscroll_horizontal.title=Horicontalne suwanje wužywaś\nscroll_horizontal_label=Horicontalne suwanje\nscroll_wrapped.title=Pózlažke suwanje wužywaś\nscroll_wrapped_label=Pózlažke suwanje\n\nspread_none.title=Boki njezwězaś\nspread_none_label=Žeden dwójny bok\nspread_odd.title=Boki zachopinajucy z njerownymi bokami zwězaś\nspread_odd_label=Njerowne boki\nspread_even.title=Boki zachopinajucy z rownymi bokami zwězaś\nspread_even_label=Rowne boki\n\n# Document properties dialog box\ndocument_properties.title=Dokumentowe kakosći…\ndocument_properties_label=Dokumentowe kakosći…\ndocument_properties_file_name=Mě dataje:\ndocument_properties_file_size=Wjelikosć dataje:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bajtow)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajtow)\ndocument_properties_title=Titel:\ndocument_properties_author=Awtor:\ndocument_properties_subject=Tema:\ndocument_properties_keywords=Klucowe słowa:\ndocument_properties_creation_date=Datum napóranja:\ndocument_properties_modification_date=Datum změny:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Awtor:\ndocument_properties_producer=PDF-gótowaŕ:\ndocument_properties_version=PDF-wersija:\ndocument_properties_page_count=Licba bokow:\ndocument_properties_page_size=Wjelikosć boka:\ndocument_properties_page_size_unit_inches=col\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=wusoki format\ndocument_properties_page_size_orientation_landscape=prěcny format\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Fast Web View:\ndocument_properties_linearized_yes=Jo\ndocument_properties_linearized_no=Ně\ndocument_properties_close=Zacyniś\n\nprint_progress_message=Dokument pśigótujo se za śišćanje…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Pśetergnuś\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Bócnicu pokazaś/schowaś\ntoggle_sidebar_notification.title=Bocnicu pśešaltowaś (dokument wopśimujo pśeglěd/pśipiski)\ntoggle_sidebar_notification2.title=Bocnicu pśešaltowaś (dokument rozrědowanje/pśipiski/warstwy wopśimujo)\ntoggle_sidebar_label=Bócnicu pokazaś/schowaś\ndocument_outline.title=Dokumentowe naraźenje pokazaś (dwójne kliknjenje, aby se wšykne zapiski pokazali/schowali)\ndocument_outline_label=Dokumentowa struktura\nattachments.title=Pśidanki pokazaś\nattachments_label=Pśidanki\nlayers.title=Warstwy pokazaś (klikniśo dwójcy, aby wšykne warstwy na standardny staw slědk stajił)\nlayers_label=Warstwy\nthumbs.title=Miniatury pokazaś\nthumbs_label=Miniatury\ncurrent_outline_item.title=Aktualny rozrědowański zapisk pytaś\ncurrent_outline_item_label=Aktualny rozrědowański zapisk\nfindbar.title=W dokumenśe pytaś\nfindbar_label=Pytaś\n\nadditional_layers=Dalšne warstwy\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Bok {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Bok {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura boka {{page}}\n\n# Find panel button title and messages\nfind_input.title=Pytaś\nfind_input.placeholder=W dokumenśe pytaś…\nfind_previous.title=Pjerwjejšne wustupowanje pytańskego wuraza pytaś\nfind_previous_label=Slědk\nfind_next.title=Pśidujuce wustupowanje pytańskego wuraza pytaś\nfind_next_label=Dalej\nfind_highlight=Wšykne wuzwignuś\nfind_match_case_label=Na wjelikopisanje źiwaś\nfind_entire_word_label=Cełe słowa\nfind_reached_top=Zachopjeńk dokumenta dostany, pókšacujo se z kóńcom\nfind_reached_bottom=Kóńc dokumenta dostany, pókšacujo se ze zachopjeńkom\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} z {{total}} wótpowědnika\nfind_match_count[two]={{current}} z {{total}} wótpowědnikowu\nfind_match_count[few]={{current}} z {{total}} wótpowědnikow\nfind_match_count[many]={{current}} z {{total}} wótpowědnikow\nfind_match_count[other]={{current}} z {{total}} wótpowědnikow\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Wěcej ako {{limit}} wótpowědnikow\nfind_match_count_limit[one]=Wěcej ako {{limit}} wótpowědnik\nfind_match_count_limit[two]=Wěcej ako {{limit}} wótpowědnika\nfind_match_count_limit[few]=Wěcej ako {{limit}} wótpowědniki\nfind_match_count_limit[many]=Wěcej ako {{limit}} wótpowědnikow\nfind_match_count_limit[other]=Wěcej ako {{limit}} wótpowědnikow\nfind_not_found=Pytański wuraz njejo se namakał\n\n# Error panel labels\nerror_more_info=Wěcej informacijow\nerror_less_info=Mjenjej informacijow\nerror_close=Zacyniś\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Powěźenka: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Lisćina zawołanjow: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Dataja: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Smužka: {{line}}\nrendering_error=Pśi zwobraznjanju boka jo zmólka nastała.\n\n# Predefined zoom values\npage_scale_width=Šyrokosć boka\npage_scale_fit=Wjelikosć boka\npage_scale_auto=Awtomatiske skalěrowanje\npage_scale_actual=Aktualna wjelikosć\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Pśi zacytowanju PDF jo zmólka nastała.\ninvalid_file_error=Njepłaśiwa abo wobškóźona PDF-dataja.\nmissing_file_error=Felujuca PDF-dataja.\nunexpected_response_error=Njewócakane serwerowe wótegrono.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Typ pśipiskow: {{type}}]\npassword_label=Zapódajśo gronidło, aby PDF-dataju wócynił.\npassword_invalid=Njepłaśiwe gronidło. Pšosym wopytajśo hyšći raz.\npassword_ok=W pórěźe\npassword_cancel=Pśetergnuś\n\nprinting_not_supported=Warnowanje: Śišćanje njepódpěra se połnje pśez toś ten wobglědowak.\nprinting_not_ready=Warnowanje: PDF njejo se za śišćanje dopołnje zacytał.\nweb_fonts_disabled=Webpisma su znjemóžnjone: njejo móžno, zasajźone PDF-pisma wužywaś.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/el/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Προηγούμενη σελίδα\nprevious_label=Προηγούμενη\nnext.title=Επόμενη σελίδα\nnext_label=Επόμενη\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Σελίδα\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=από {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} από {{pagesCount}})\n\nzoom_out.title=Σμίκρυνση\nzoom_out_label=Σμίκρυνση\nzoom_in.title=Μεγέθυνση\nzoom_in_label=Μεγέθυνση\nzoom.title=Ζουμ\npresentation_mode.title=Εναλλαγή σε λειτουργία παρουσίασης\npresentation_mode_label=Λειτουργία παρουσίασης\nopen_file.title=Άνοιγμα αρχείου\nopen_file_label=Άνοιγμα\nprint.title=Εκτύπωση\nprint_label=Εκτύπωση\ndownload.title=Λήψη\ndownload_label=Λήψη\nbookmark.title=Τρέχουσα προβολή (αντιγραφή ή άνοιγμα σε νέο παράθυρο)\nbookmark_label=Τρέχουσα προβολή\n\n# Secondary toolbar and context menu\ntools.title=Εργαλεία\ntools_label=Εργαλεία\nfirst_page.title=Μετάβαση στην πρώτη σελίδα\nfirst_page.label=Μετάβαση στην πρώτη σελίδα\nfirst_page_label=Μετάβαση στην πρώτη σελίδα\nlast_page.title=Μετάβαση στην τελευταία σελίδα\nlast_page.label=Μετάβαση στην τελευταία σελίδα\nlast_page_label=Μετάβαση στην τελευταία σελίδα\npage_rotate_cw.title=Δεξιόστροφη περιστροφή\npage_rotate_cw.label=Δεξιόστροφη περιστροφή\npage_rotate_cw_label=Δεξιόστροφη περιστροφή\npage_rotate_ccw.title=Αριστερόστροφη περιστροφή\npage_rotate_ccw.label=Αριστερόστροφη περιστροφή\npage_rotate_ccw_label=Αριστερόστροφη περιστροφή\n\ncursor_text_select_tool.title=Ενεργοποίηση εργαλείου επιλογής κειμένου\ncursor_text_select_tool_label=Εργαλείο επιλογής κειμένου\ncursor_hand_tool.title=Ενεργοποίηση εργαλείου χεριού\ncursor_hand_tool_label=Εργαλείο χεριού\n\nscroll_vertical.title=Χρήση κάθετης κύλισης\nscroll_vertical_label=Κάθετη κύλιση\nscroll_horizontal.title=Χρήση οριζόντιας κύλισης\nscroll_horizontal_label=Οριζόντια κύλιση\nscroll_wrapped.title=Χρήση κυκλικής κύλισης\nscroll_wrapped_label=Κυκλική κύλιση\n\nspread_none.title=Να μην γίνει σύνδεση επεκτάσεων σελίδων\nspread_none_label=Χωρίς επεκτάσεις\nspread_odd.title=Σύνδεση επεκτάσεων σελίδων ξεκινώντας από τις μονές σελίδες\nspread_odd_label=Μονές επεκτάσεις\nspread_even.title=Σύνδεση επεκτάσεων σελίδων ξεκινώντας από τις ζυγές σελίδες\nspread_even_label=Ζυγές επεκτάσεις\n\n# Document properties dialog box\ndocument_properties.title=Ιδιότητες εγγράφου…\ndocument_properties_label=Ιδιότητες εγγράφου…\ndocument_properties_file_name=Όνομα αρχείου:\ndocument_properties_file_size=Μέγεθος αρχείου:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Τίτλος:\ndocument_properties_author=Συγγραφέας:\ndocument_properties_subject=Θέμα:\ndocument_properties_keywords=Λέξεις κλειδιά:\ndocument_properties_creation_date=Ημερομηνία δημιουργίας:\ndocument_properties_modification_date=Ημερομηνία τροποποίησης:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Δημιουργός:\ndocument_properties_producer=Παραγωγός PDF:\ndocument_properties_version=Έκδοση PDF:\ndocument_properties_page_count=Αριθμός σελίδων:\ndocument_properties_page_size=Μέγεθος σελίδας:\ndocument_properties_page_size_unit_inches=ίντσες\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=κατακόρυφα\ndocument_properties_page_size_orientation_landscape=οριζόντια\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Επιστολή\ndocument_properties_page_size_name_legal=Τύπου Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Ταχεία προβολή ιστού:\ndocument_properties_linearized_yes=Ναι\ndocument_properties_linearized_no=Όχι\ndocument_properties_close=Κλείσιμο\n\nprint_progress_message=Προετοιμασία του εγγράφου για εκτύπωση…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Ακύρωση\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=(Απ)ενεργοποίηση πλευρικής στήλης\ntoggle_sidebar_notification.title=(Απ)ενεργοποίηση πλευρικής στήλης (το έγγραφο περιέχει περίγραμμα/συνημμένα)\ntoggle_sidebar_notification2.title=(Απ)ενεργοποίηση πλευρικής στήλης (το έγγραφο περιέχει περίγραμμα/συνημμένα/επίπεδα)\ntoggle_sidebar_label=(Απ)ενεργοποίηση πλευρικής στήλης\ndocument_outline.title=Εμφάνιση διάρθρωσης εγγράφου (διπλό κλικ για ανάπτυξη/σύμπτυξη όλων των στοιχείων)\ndocument_outline_label=Διάρθρωση εγγράφου\nattachments.title=Προβολή συνημμένων\nattachments_label=Συνημμένα\nlayers.title=Εμφάνιση επιπέδων (διπλό κλικ για επαναφορά όλων των επιπέδων στην προεπιλεγμένη κατάσταση)\nlayers_label=Επίπεδα\nthumbs.title=Προβολή μικρογραφιών\nthumbs_label=Μικρογραφίες\ncurrent_outline_item.title=Εύρεση τρέχοντος στοιχείου διάρθρωσης\ncurrent_outline_item_label=Τρέχον στοιχείο διάρθρωσης\nfindbar.title=Εύρεση στο έγγραφο\nfindbar_label=Εύρεση\n\nadditional_layers=Επιπρόσθετα επίπεδα\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Σελίδα {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Σελίδα {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Μικρογραφία της σελίδας {{page}}\n\n# Find panel button title and messages\nfind_input.title=Εύρεση\nfind_input.placeholder=Εύρεση στο έγγραφο…\nfind_previous.title=Εύρεση της προηγούμενης εμφάνισης της φράσης\nfind_previous_label=Προηγούμενο\nfind_next.title=Εύρεση της επόμενης εμφάνισης της φράσης\nfind_next_label=Επόμενο\nfind_highlight=Επισήμανση όλων\nfind_match_case_label=Ταίριασμα χαρακτήρα\nfind_entire_word_label=Ολόκληρες λέξεις\nfind_reached_top=Έλευση στην αρχή του εγγράφου, συνέχεια από το τέλος\nfind_reached_bottom=Έλευση στο τέλος του εγγράφου, συνέχεια από την αρχή\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} από {{total}} αντιστοιχία\nfind_match_count[two]={{current}} από {{total}} αντιστοιχίες\nfind_match_count[few]={{current}} από {{total}} αντιστοιχίες\nfind_match_count[many]={{current}} από {{total}} αντιστοιχίες\nfind_match_count[other]={{current}} από {{total}} αντιστοιχίες\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Περισσότερες από {{limit}} αντιστοιχίες\nfind_match_count_limit[one]=Περισσότερες από {{limit}} αντιστοιχία\nfind_match_count_limit[two]=Περισσότερες από {{limit}} αντιστοιχίες\nfind_match_count_limit[few]=Περισσότερες από {{limit}} αντιστοιχίες\nfind_match_count_limit[many]=Περισσότερες από {{limit}} αντιστοιχίες\nfind_match_count_limit[other]=Περισσότερες από {{limit}} αντιστοιχίες\nfind_not_found=Η φράση δεν βρέθηκε\n\n# Error panel labels\nerror_more_info=Περισσότερες πληροφορίες\nerror_less_info=Λιγότερες πληροφορίες\nerror_close=Κλείσιμο\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Μήνυμα: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Στοίβα: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Αρχείο: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Γραμμή: {{line}}\nrendering_error=Προέκυψε σφάλμα κατά την ανάλυση της σελίδας.\n\n# Predefined zoom values\npage_scale_width=Πλάτος σελίδας\npage_scale_fit=Μέγεθος σελίδας\npage_scale_auto=Αυτόματο ζουμ\npage_scale_actual=Πραγματικό μέγεθος\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Προέκυψε ένα σφάλμα κατά τη φόρτωση του PDF.\ninvalid_file_error=Μη έγκυρο ή κατεστραμμένο αρχείο PDF.\nmissing_file_error=Λείπει αρχείο PDF.\nunexpected_response_error=Μη αναμενόμενη απόκριση από το διακομιστή.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Σχόλιο]\npassword_label=Εισαγωγή κωδικού για το άνοιγμα του PDF αρχείου.\npassword_invalid=Μη έγκυρος κωδικός. Προσπαθείστε ξανά.\npassword_ok=OK\npassword_cancel=Ακύρωση\n\nprinting_not_supported=Προειδοποίηση: Η εκτύπωση δεν υποστηρίζεται πλήρως από αυτόν τον περιηγητή.\nprinting_not_ready=Προειδοποίηση: Το PDF δεν φορτώθηκε πλήρως για εκτύπωση.\nweb_fonts_disabled=Οι γραμματοσειρές Web απενεργοποιημένες: αδυναμία χρήσης των ενσωματωμένων γραμματοσειρών PDF.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/en-CA/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Previous Page\nprevious_label=Previous\nnext.title=Next Page\nnext_label=Next\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Page\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=of {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} of {{pagesCount}})\n\nzoom_out.title=Zoom Out\nzoom_out_label=Zoom Out\nzoom_in.title=Zoom In\nzoom_in_label=Zoom In\nzoom.title=Zoom\npresentation_mode.title=Switch to Presentation Mode\npresentation_mode_label=Presentation Mode\nopen_file.title=Open File\nopen_file_label=Open\nprint.title=Print\nprint_label=Print\ndownload.title=Download\ndownload_label=Download\nbookmark.title=Current view (copy or open in new window)\nbookmark_label=Current View\n\n# Secondary toolbar and context menu\ntools.title=Tools\ntools_label=Tools\nfirst_page.title=Go to First Page\nfirst_page.label=Go to First Page\nfirst_page_label=Go to First Page\nlast_page.title=Go to Last Page\nlast_page.label=Go to Last Page\nlast_page_label=Go to Last Page\npage_rotate_cw.title=Rotate Clockwise\npage_rotate_cw.label=Rotate Clockwise\npage_rotate_cw_label=Rotate Clockwise\npage_rotate_ccw.title=Rotate Counterclockwise\npage_rotate_ccw.label=Rotate Counterclockwise\npage_rotate_ccw_label=Rotate Counterclockwise\n\ncursor_text_select_tool.title=Enable Text Selection Tool\ncursor_text_select_tool_label=Text Selection Tool\ncursor_hand_tool.title=Enable Hand Tool\ncursor_hand_tool_label=Hand Tool\n\nscroll_vertical.title=Use Vertical Scrolling\nscroll_vertical_label=Vertical Scrolling\nscroll_horizontal.title=Use Horizontal Scrolling\nscroll_horizontal_label=Horizontal Scrolling\nscroll_wrapped.title=Use Wrapped Scrolling\nscroll_wrapped_label=Wrapped Scrolling\n\nspread_none.title=Do not join page spreads\nspread_none_label=No Spreads\nspread_odd.title=Join page spreads starting with odd-numbered pages\nspread_odd_label=Odd Spreads\nspread_even.title=Join page spreads starting with even-numbered pages\nspread_even_label=Even Spreads\n\n# Document properties dialog box\ndocument_properties.title=Document Properties…\ndocument_properties_label=Document Properties…\ndocument_properties_file_name=File name:\ndocument_properties_file_size=File size:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Title:\ndocument_properties_author=Author:\ndocument_properties_subject=Subject:\ndocument_properties_keywords=Keywords:\ndocument_properties_creation_date=Creation Date:\ndocument_properties_modification_date=Modification Date:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creator:\ndocument_properties_producer=PDF Producer:\ndocument_properties_version=PDF Version:\ndocument_properties_page_count=Page Count:\ndocument_properties_page_size=Page Size:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=portrait\ndocument_properties_page_size_orientation_landscape=landscape\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Fast Web View:\ndocument_properties_linearized_yes=Yes\ndocument_properties_linearized_no=No\ndocument_properties_close=Close\n\nprint_progress_message=Preparing document for printing…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancel\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toggle Sidebar\ntoggle_sidebar_notification.title=Toggle Sidebar (document contains outline/attachments)\ntoggle_sidebar_notification2.title=Toggle Sidebar (document contains outline/attachments/layers)\ntoggle_sidebar_label=Toggle Sidebar\ndocument_outline.title=Show Document Outline (double-click to expand/collapse all items)\ndocument_outline_label=Document Outline\nattachments.title=Show Attachments\nattachments_label=Attachments\nlayers.title=Show Layers (double-click to reset all layers to the default state)\nlayers_label=Layers\nthumbs.title=Show Thumbnails\nthumbs_label=Thumbnails\ncurrent_outline_item.title=Find Current Outline Item\ncurrent_outline_item_label=Current Outline Item\nfindbar.title=Find in Document\nfindbar_label=Find\n\nadditional_layers=Additional Layers\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Page {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Page {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail of Page {{page}}\n\n# Find panel button title and messages\nfind_input.title=Find\nfind_input.placeholder=Find in document…\nfind_previous.title=Find the previous occurrence of the phrase\nfind_previous_label=Previous\nfind_next.title=Find the next occurrence of the phrase\nfind_next_label=Next\nfind_highlight=Highlight all\nfind_match_case_label=Match case\nfind_entire_word_label=Whole words\nfind_reached_top=Reached top of document, continued from bottom\nfind_reached_bottom=Reached end of document, continued from top\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} of {{total}} match\nfind_match_count[two]={{current}} of {{total}} matches\nfind_match_count[few]={{current}} of {{total}} matches\nfind_match_count[many]={{current}} of {{total}} matches\nfind_match_count[other]={{current}} of {{total}} matches\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=More than {{limit}} matches\nfind_match_count_limit[one]=More than {{limit}} match\nfind_match_count_limit[two]=More than {{limit}} matches\nfind_match_count_limit[few]=More than {{limit}} matches\nfind_match_count_limit[many]=More than {{limit}} matches\nfind_match_count_limit[other]=More than {{limit}} matches\nfind_not_found=Phrase not found\n\n# Error panel labels\nerror_more_info=More Information\nerror_less_info=Less Information\nerror_close=Close\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=An error occurred while rendering the page.\n\n# Predefined zoom values\npage_scale_width=Page Width\npage_scale_fit=Page Fit\npage_scale_auto=Automatic Zoom\npage_scale_actual=Actual Size\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=An error occurred while loading the PDF.\ninvalid_file_error=Invalid or corrupted PDF file.\nmissing_file_error=Missing PDF file.\nunexpected_response_error=Unexpected server response.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Enter the password to open this PDF file.\npassword_invalid=Invalid password. Please try again.\npassword_ok=OK\npassword_cancel=Cancel\n\nprinting_not_supported=Warning: Printing is not fully supported by this browser.\nprinting_not_ready=Warning: The PDF is not fully loaded for printing.\nweb_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/en-GB/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Previous Page\nprevious_label=Previous\nnext.title=Next Page\nnext_label=Next\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Page\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=of {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} of {{pagesCount}})\n\nzoom_out.title=Zoom Out\nzoom_out_label=Zoom Out\nzoom_in.title=Zoom In\nzoom_in_label=Zoom In\nzoom.title=Zoom\npresentation_mode.title=Switch to Presentation Mode\npresentation_mode_label=Presentation Mode\nopen_file.title=Open File\nopen_file_label=Open\nprint.title=Print\nprint_label=Print\ndownload.title=Download\ndownload_label=Download\nbookmark.title=Current view (copy or open in new window)\nbookmark_label=Current View\n\n# Secondary toolbar and context menu\ntools.title=Tools\ntools_label=Tools\nfirst_page.title=Go to First Page\nfirst_page.label=Go to First Page\nfirst_page_label=Go to First Page\nlast_page.title=Go to Last Page\nlast_page.label=Go to Last Page\nlast_page_label=Go to Last Page\npage_rotate_cw.title=Rotate Clockwise\npage_rotate_cw.label=Rotate Clockwise\npage_rotate_cw_label=Rotate Clockwise\npage_rotate_ccw.title=Rotate Anti-Clockwise\npage_rotate_ccw.label=Rotate Anti-Clockwise\npage_rotate_ccw_label=Rotate Anti-Clockwise\n\ncursor_text_select_tool.title=Enable Text Selection Tool\ncursor_text_select_tool_label=Text Selection Tool\ncursor_hand_tool.title=Enable Hand Tool\ncursor_hand_tool_label=Hand Tool\n\nscroll_vertical.title=Use Vertical Scrolling\nscroll_vertical_label=Vertical Scrolling\nscroll_horizontal.title=Use Horizontal Scrolling\nscroll_horizontal_label=Horizontal Scrolling\nscroll_wrapped.title=Use Wrapped Scrolling\nscroll_wrapped_label=Wrapped Scrolling\n\nspread_none.title=Do not join page spreads\nspread_none_label=No Spreads\nspread_odd.title=Join page spreads starting with odd-numbered pages\nspread_odd_label=Odd Spreads\nspread_even.title=Join page spreads starting with even-numbered pages\nspread_even_label=Even Spreads\n\n# Document properties dialog box\ndocument_properties.title=Document Properties…\ndocument_properties_label=Document Properties…\ndocument_properties_file_name=File name:\ndocument_properties_file_size=File size:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Title:\ndocument_properties_author=Author:\ndocument_properties_subject=Subject:\ndocument_properties_keywords=Keywords:\ndocument_properties_creation_date=Creation Date:\ndocument_properties_modification_date=Modification Date:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creator:\ndocument_properties_producer=PDF Producer:\ndocument_properties_version=PDF Version:\ndocument_properties_page_count=Page Count:\ndocument_properties_page_size=Page Size:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=portrait\ndocument_properties_page_size_orientation_landscape=landscape\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Fast Web View:\ndocument_properties_linearized_yes=Yes\ndocument_properties_linearized_no=No\ndocument_properties_close=Close\n\nprint_progress_message=Preparing document for printing…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancel\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toggle Sidebar\ntoggle_sidebar_notification.title=Toggle Sidebar (document contains outline/attachments)\ntoggle_sidebar_notification2.title=Toggle Sidebar (document contains outline/attachments/layers)\ntoggle_sidebar_label=Toggle Sidebar\ndocument_outline.title=Show Document Outline (double-click to expand/collapse all items)\ndocument_outline_label=Document Outline\nattachments.title=Show Attachments\nattachments_label=Attachments\nlayers.title=Show Layers (double-click to reset all layers to the default state)\nlayers_label=Layers\nthumbs.title=Show Thumbnails\nthumbs_label=Thumbnails\ncurrent_outline_item.title=Find Current Outline Item\ncurrent_outline_item_label=Current Outline Item\nfindbar.title=Find in Document\nfindbar_label=Find\n\nadditional_layers=Additional Layers\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Page {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Page {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail of Page {{page}}\n\n# Find panel button title and messages\nfind_input.title=Find\nfind_input.placeholder=Find in document…\nfind_previous.title=Find the previous occurrence of the phrase\nfind_previous_label=Previous\nfind_next.title=Find the next occurrence of the phrase\nfind_next_label=Next\nfind_highlight=Highlight all\nfind_match_case_label=Match case\nfind_entire_word_label=Whole words\nfind_reached_top=Reached top of document, continued from bottom\nfind_reached_bottom=Reached end of document, continued from top\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} of {{total}} match\nfind_match_count[two]={{current}} of {{total}} matches\nfind_match_count[few]={{current}} of {{total}} matches\nfind_match_count[many]={{current}} of {{total}} matches\nfind_match_count[other]={{current}} of {{total}} matches\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=More than {{limit}} matches\nfind_match_count_limit[one]=More than {{limit}} match\nfind_match_count_limit[two]=More than {{limit}} matches\nfind_match_count_limit[few]=More than {{limit}} matches\nfind_match_count_limit[many]=More than {{limit}} matches\nfind_match_count_limit[other]=More than {{limit}} matches\nfind_not_found=Phrase not found\n\n# Error panel labels\nerror_more_info=More Information\nerror_less_info=Less Information\nerror_close=Close\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=An error occurred while rendering the page.\n\n# Predefined zoom values\npage_scale_width=Page Width\npage_scale_fit=Page Fit\npage_scale_auto=Automatic Zoom\npage_scale_actual=Actual Size\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=An error occurred while loading the PDF.\ninvalid_file_error=Invalid or corrupted PDF file.\nmissing_file_error=Missing PDF file.\nunexpected_response_error=Unexpected server response.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Enter the password to open this PDF file.\npassword_invalid=Invalid password. Please try again.\npassword_ok=OK\npassword_cancel=Cancel\n\nprinting_not_supported=Warning: Printing is not fully supported by this browser.\nprinting_not_ready=Warning: The PDF is not fully loaded for printing.\nweb_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/en-US/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Previous Page\nprevious_label=Previous\nnext.title=Next Page\nnext_label=Next\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Page\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=of {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} of {{pagesCount}})\n\nzoom_out.title=Zoom Out\nzoom_out_label=Zoom Out\nzoom_in.title=Zoom In\nzoom_in_label=Zoom In\nzoom.title=Zoom\npresentation_mode.title=Switch to Presentation Mode\npresentation_mode_label=Presentation Mode\nopen_file.title=Open File\nopen_file_label=Open\nprint.title=Print\nprint_label=Print\ndownload.title=Download\ndownload_label=Download\nbookmark.title=Current view (copy or open in new window)\nbookmark_label=Current View\n\n# Secondary toolbar and context menu\ntools.title=Tools\ntools_label=Tools\nfirst_page.title=Go to First Page\nfirst_page_label=Go to First Page\nlast_page.title=Go to Last Page\nlast_page_label=Go to Last Page\npage_rotate_cw.title=Rotate Clockwise\npage_rotate_cw_label=Rotate Clockwise\npage_rotate_ccw.title=Rotate Counterclockwise\npage_rotate_ccw_label=Rotate Counterclockwise\n\ncursor_text_select_tool.title=Enable Text Selection Tool\ncursor_text_select_tool_label=Text Selection Tool\ncursor_hand_tool.title=Enable Hand Tool\ncursor_hand_tool_label=Hand Tool\n\nscroll_vertical.title=Use Vertical Scrolling\nscroll_vertical_label=Vertical Scrolling\nscroll_horizontal.title=Use Horizontal Scrolling\nscroll_horizontal_label=Horizontal Scrolling\nscroll_wrapped.title=Use Wrapped Scrolling\nscroll_wrapped_label=Wrapped Scrolling\n\nspread_none.title=Do not join page spreads\nspread_none_label=No Spreads\nspread_odd.title=Join page spreads starting with odd-numbered pages\nspread_odd_label=Odd Spreads\nspread_even.title=Join page spreads starting with even-numbered pages\nspread_even_label=Even Spreads\n\n# Document properties dialog box\ndocument_properties.title=Document Properties…\ndocument_properties_label=Document Properties…\ndocument_properties_file_name=File name:\ndocument_properties_file_size=File size:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Title:\ndocument_properties_author=Author:\ndocument_properties_subject=Subject:\ndocument_properties_keywords=Keywords:\ndocument_properties_creation_date=Creation Date:\ndocument_properties_modification_date=Modification Date:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creator:\ndocument_properties_producer=PDF Producer:\ndocument_properties_version=PDF Version:\ndocument_properties_page_count=Page Count:\ndocument_properties_page_size=Page Size:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=portrait\ndocument_properties_page_size_orientation_landscape=landscape\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Fast Web View:\ndocument_properties_linearized_yes=Yes\ndocument_properties_linearized_no=No\ndocument_properties_close=Close\n\nprint_progress_message=Preparing document for printing…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancel\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toggle Sidebar\ntoggle_sidebar_notification2.title=Toggle Sidebar (document contains outline/attachments/layers)\ntoggle_sidebar_label=Toggle Sidebar\ndocument_outline.title=Show Document Outline (double-click to expand/collapse all items)\ndocument_outline_label=Document Outline\nattachments.title=Show Attachments\nattachments_label=Attachments\nlayers.title=Show Layers (double-click to reset all layers to the default state)\nlayers_label=Layers\nthumbs.title=Show Thumbnails\nthumbs_label=Thumbnails\ncurrent_outline_item.title=Find Current Outline Item\ncurrent_outline_item_label=Current Outline Item\nfindbar.title=Find in Document\nfindbar_label=Find\n\nadditional_layers=Additional Layers\n# LOCALIZATION NOTE (page_landmark): \"{{page}}\" will be replaced by the page number.\npage_landmark=Page {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Page {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail of Page {{page}}\n\n# Find panel button title and messages\nfind_input.title=Find\nfind_input.placeholder=Find in document…\nfind_previous.title=Find the previous occurrence of the phrase\nfind_previous_label=Previous\nfind_next.title=Find the next occurrence of the phrase\nfind_next_label=Next\nfind_highlight=Highlight all\nfind_match_case_label=Match case\nfind_entire_word_label=Whole words\nfind_reached_top=Reached top of document, continued from bottom\nfind_reached_bottom=Reached end of document, continued from top\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} of {{total}} match\nfind_match_count[two]={{current}} of {{total}} matches\nfind_match_count[few]={{current}} of {{total}} matches\nfind_match_count[many]={{current}} of {{total}} matches\nfind_match_count[other]={{current}} of {{total}} matches\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=More than {{limit}} matches\nfind_match_count_limit[one]=More than {{limit}} match\nfind_match_count_limit[two]=More than {{limit}} matches\nfind_match_count_limit[few]=More than {{limit}} matches\nfind_match_count_limit[many]=More than {{limit}} matches\nfind_match_count_limit[other]=More than {{limit}} matches\nfind_not_found=Phrase not found\n\n# Error panel labels\nerror_more_info=More Information\nerror_less_info=Less Information\nerror_close=Close\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=An error occurred while rendering the page.\n\n# Predefined zoom values\npage_scale_width=Page Width\npage_scale_fit=Page Fit\npage_scale_auto=Automatic Zoom\npage_scale_actual=Actual Size\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading=Loading…\nloading_error=An error occurred while loading the PDF.\ninvalid_file_error=Invalid or corrupted PDF file.\nmissing_file_error=Missing PDF file.\nunexpected_response_error=Unexpected server response.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Enter the password to open this PDF file.\npassword_invalid=Invalid password. Please try again.\npassword_ok=OK\npassword_cancel=Cancel\n\nprinting_not_supported=Warning: Printing is not fully supported by this browser.\nprinting_not_ready=Warning: The PDF is not fully loaded for printing.\nweb_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/eo/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Antaŭa paĝo\nprevious_label=Malantaŭen\nnext.title=Venonta paĝo\nnext_label=Antaŭen\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Paĝo\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=el {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} el {{pagesCount}})\n\nzoom_out.title=Malpligrandigi\nzoom_out_label=Malpligrandigi\nzoom_in.title=Pligrandigi\nzoom_in_label=Pligrandigi\nzoom.title=Pligrandigilo\npresentation_mode.title=Iri al prezenta reĝimo\npresentation_mode_label=Prezenta reĝimo\nopen_file.title=Malfermi dosieron\nopen_file_label=Malfermi\nprint.title=Presi\nprint_label=Presi\ndownload.title=Elŝuti\ndownload_label=Elŝuti\nbookmark.title=Nuna vido (kopii aŭ malfermi en nova fenestro)\nbookmark_label=Nuna vido\n\n# Secondary toolbar and context menu\ntools.title=Iloj\ntools_label=Iloj\nfirst_page.title=Iri al la unua paĝo\nfirst_page.label=Iri al la unua paĝo\nfirst_page_label=Iri al la unua paĝo\nlast_page.title=Iri al la lasta paĝo\nlast_page.label=Iri al la lasta paĝo\nlast_page_label=Iri al la lasta paĝo\npage_rotate_cw.title=Rotaciigi dekstrume\npage_rotate_cw.label=Rotaciigi dekstrume\npage_rotate_cw_label=Rotaciigi dekstrume\npage_rotate_ccw.title=Rotaciigi maldekstrume\npage_rotate_ccw.label=Rotaciigi maldekstrume\npage_rotate_ccw_label=Rotaciigi maldekstrume\n\ncursor_text_select_tool.title=Aktivigi tekstan elektilon\ncursor_text_select_tool_label=Teksta elektilo\ncursor_hand_tool.title=Aktivigi ilon de mano\ncursor_hand_tool_label=Ilo de mano\n\nscroll_vertical.title=Uzi vertikalan ŝovadon\nscroll_vertical_label=Vertikala ŝovado\nscroll_horizontal.title=Uzi horizontalan ŝovadon\nscroll_horizontal_label=Horizontala ŝovado\nscroll_wrapped.title=Uzi ambaŭdirektan ŝovadon\nscroll_wrapped_label=Ambaŭdirekta ŝovado\n\nspread_none.title=Ne montri paĝojn po du\nspread_none_label=Unupaĝa vido\nspread_odd.title=Kunigi paĝojn komencante per nepara paĝo\nspread_odd_label=Po du paĝoj, neparaj maldekstre\nspread_even.title=Kunigi paĝojn komencante per para paĝo\nspread_even_label=Po du paĝoj, paraj maldekstre\n\n# Document properties dialog box\ndocument_properties.title=Atributoj de dokumento…\ndocument_properties_label=Atributoj de dokumento…\ndocument_properties_file_name=Nomo de dosiero:\ndocument_properties_file_size=Grando de dosiero:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KO ({{size_b}} oktetoj)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MO ({{size_b}} oktetoj)\ndocument_properties_title=Titolo:\ndocument_properties_author=Aŭtoro:\ndocument_properties_subject=Temo:\ndocument_properties_keywords=Ŝlosilvorto:\ndocument_properties_creation_date=Dato de kreado:\ndocument_properties_modification_date=Dato de modifo:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Kreinto:\ndocument_properties_producer=Produktinto de PDF:\ndocument_properties_version=Versio de PDF:\ndocument_properties_page_count=Nombro de paĝoj:\ndocument_properties_page_size=Grando de paĝo:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=vertikala\ndocument_properties_page_size_orientation_landscape=horizontala\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letera\ndocument_properties_page_size_name_legal=Jura\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Rapida tekstaĵa vido:\ndocument_properties_linearized_yes=Jes\ndocument_properties_linearized_no=Ne\ndocument_properties_close=Fermi\n\nprint_progress_message=Preparo de dokumento por presi ĝin …\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Nuligi\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Montri/kaŝi flankan strion\ntoggle_sidebar_notification.title=Montri/kaŝi flankan strion (la dokumento enhavas konturon/aneksaĵojn)\ntoggle_sidebar_notification2.title=Montri/kaŝi flankan strion (la dokumento enhavas konturon/kunsendaĵojn/tavolojn)\ntoggle_sidebar_label=Montri/kaŝi flankan strion\ndocument_outline.title=Montri la konturon de dokumento (alklaku duoble por faldi/malfaldi ĉiujn elementojn)\ndocument_outline_label=Konturo de dokumento\nattachments.title=Montri kunsendaĵojn\nattachments_label=Kunsendaĵojn\nlayers.title=Montri tavolojn (duoble alklaku por remeti ĉiujn tavolojn en la norman staton)\nlayers_label=Tavoloj\nthumbs.title=Montri miniaturojn\nthumbs_label=Miniaturoj\ncurrent_outline_item.title=Trovi nunan konturan elementon\ncurrent_outline_item_label=Nuna kontura elemento\nfindbar.title=Serĉi en dokumento\nfindbar_label=Serĉi\n\nadditional_layers=Aldonaj tavoloj\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Paĝo {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Paĝo {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniaturo de paĝo {{page}}\n\n# Find panel button title and messages\nfind_input.title=Serĉi\nfind_input.placeholder=Serĉi en dokumento…\nfind_previous.title=Serĉi la antaŭan aperon de la frazo\nfind_previous_label=Malantaŭen\nfind_next.title=Serĉi la venontan aperon de la frazo\nfind_next_label=Antaŭen\nfind_highlight=Elstarigi ĉiujn\nfind_match_case_label=Distingi inter majuskloj kaj minuskloj\nfind_entire_word_label=Tutaj vortoj\nfind_reached_top=Komenco de la dokumento atingita, daŭrigado ekde la fino\nfind_reached_bottom=Fino de la dokumento atingita, daŭrigado ekde la komenco\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} el {{total}} kongruo\nfind_match_count[two]={{current}} el {{total}} kongruoj\nfind_match_count[few]={{current}} el {{total}} kongruoj\nfind_match_count[many]={{current}} el {{total}} kongruoj\nfind_match_count[other]={{current}} el {{total}} kongruoj\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Pli ol {{limit}} kongruoj\nfind_match_count_limit[one]=Pli ol {{limit}} kongruo\nfind_match_count_limit[two]=Pli ol {{limit}} kongruoj\nfind_match_count_limit[few]=Pli ol {{limit}} kongruoj\nfind_match_count_limit[many]=Pli ol {{limit}} kongruoj\nfind_match_count_limit[other]=Pli ol {{limit}} kongruoj\nfind_not_found=Frazo ne trovita\n\n# Error panel labels\nerror_more_info=Pli da informo\nerror_less_info=Malpli da informo\nerror_close=Fermi\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mesaĝo: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stako: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Dosiero: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linio: {{line}}\nrendering_error=Okazis eraro dum la montro de la paĝo.\n\n# Predefined zoom values\npage_scale_width=Larĝo de paĝo\npage_scale_fit=Adapti paĝon\npage_scale_auto=Aŭtomata skalo\npage_scale_actual=Reala grando\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Okazis eraro dum la ŝargado de la PDF dosiero.\ninvalid_file_error=Nevalida aŭ difektita PDF dosiero.\nmissing_file_error=Mankas dosiero PDF.\nunexpected_response_error=Neatendita respondo de servilo.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Prinoto: {{type}}]\npassword_label=Tajpu pasvorton por malfermi tiun ĉi dosieron PDF.\npassword_invalid=Nevalida pasvorto. Bonvolu provi denove.\npassword_ok=Akcepti\npassword_cancel=Nuligi\n\nprinting_not_supported=Averto: tiu ĉi retumilo ne plene subtenas presadon.\nprinting_not_ready=Averto: la PDF dosiero ne estas plene ŝargita por presado.\nweb_fonts_disabled=Neaktivaj teksaĵaj tiparoj: ne elbas uzi enmetitajn tiparojn de PDF.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/es-AR/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página anterior\nprevious_label=Anterior\nnext.title=Página siguiente\nnext_label=Siguiente\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Página\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=( {{pageNumber}} de {{pagesCount}} )\n\nzoom_out.title=Alejar\nzoom_out_label=Alejar\nzoom_in.title=Acercar\nzoom_in_label=Acercar\nzoom.title=Zoom\npresentation_mode.title=Cambiar a modo presentación\npresentation_mode_label=Modo presentación\nopen_file.title=Abrir archivo\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar o abrir en nueva ventana)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Herramientas\ntools_label=Herramientas\nfirst_page.title=Ir a primera página\nfirst_page.label=Ir a primera página\nfirst_page_label=Ir a primera página\nlast_page.title=Ir a última página\nlast_page.label=Ir a última página\nlast_page_label=Ir a última página\npage_rotate_cw.title=Rotar horario\npage_rotate_cw.label=Rotar horario\npage_rotate_cw_label=Rotar horario\npage_rotate_ccw.title=Rotar antihorario\npage_rotate_ccw.label=Rotar antihorario\npage_rotate_ccw_label=Rotar antihorario\n\ncursor_text_select_tool.title=Habilitar herramienta de selección de texto\ncursor_text_select_tool_label=Herramienta de selección de texto\ncursor_hand_tool.title=Habilitar herramienta mano\ncursor_hand_tool_label=Herramienta mano\n\nscroll_vertical.title=Usar desplazamiento vertical\nscroll_vertical_label=Desplazamiento vertical\nscroll_horizontal.title=Usar desplazamiento vertical\nscroll_horizontal_label=Desplazamiento horizontal\nscroll_wrapped.title=Usar desplazamiento encapsulado\nscroll_wrapped_label=Desplazamiento encapsulado\n\nspread_none.title=No unir páginas dobles\nspread_none_label=Sin dobles\nspread_odd.title=Unir páginas dobles comenzando con las impares\nspread_odd_label=Dobles impares\nspread_even.title=Unir páginas dobles comenzando con las pares\nspread_even_label=Dobles pares\n\n# Document properties dialog box\ndocument_properties.title=Propiedades del documento…\ndocument_properties_label=Propiedades del documento…\ndocument_properties_file_name=Nombre de archivo:\ndocument_properties_file_size=Tamaño de archovo:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Asunto:\ndocument_properties_keywords=Palabras clave:\ndocument_properties_creation_date=Fecha de creación:\ndocument_properties_modification_date=Fecha de modificación:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creador:\ndocument_properties_producer=PDF Productor:\ndocument_properties_version=Versión de PDF:\ndocument_properties_page_count=Cantidad de páginas:\ndocument_properties_page_size=Tamaño de página:\ndocument_properties_page_size_unit_inches=en\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=normal\ndocument_properties_page_size_orientation_landscape=apaisado\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Carta\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Vista rápida de la Web:\ndocument_properties_linearized_yes=Sí\ndocument_properties_linearized_no=No\ndocument_properties_close=Cerrar\n\nprint_progress_message=Preparando documento para imprimir…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancelar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Alternar barra lateral\ntoggle_sidebar_notification.title=Intercambiar barra lateral (el documento contiene esquema/adjuntos)\ntoggle_sidebar_notification2.title=Alternar barra lateral (el documento contiene esquemas/adjuntos/capas)\ntoggle_sidebar_label=Alternar barra lateral\ndocument_outline.title=Mostrar esquema del documento (doble clic para expandir/colapsar todos los ítems)\ndocument_outline_label=Esquema del documento\nattachments.title=Mostrar adjuntos\nattachments_label=Adjuntos\nlayers.title=Mostrar capas (doble clic para restablecer todas las capas al estado predeterminado)\nlayers_label=Capas\nthumbs.title=Mostrar miniaturas\nthumbs_label=Miniaturas\ncurrent_outline_item.title=Buscar elemento de esquema actual\ncurrent_outline_item_label=Elemento de esquema actual\nfindbar.title=Buscar en documento\nfindbar_label=Buscar\n\nadditional_layers=Capas adicionales\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Página {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Página {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura de página {{page}}\n\n# Find panel button title and messages\nfind_input.title=Buscar\nfind_input.placeholder=Buscar en documento…\nfind_previous.title=Buscar la aparición anterior de la frase\nfind_previous_label=Anterior\nfind_next.title=Buscar la siguiente aparición de la frase\nfind_next_label=Siguiente\nfind_highlight=Resaltar todo\nfind_match_case_label=Coincidir mayúsculas\nfind_entire_word_label=Palabras completas\nfind_reached_top=Inicio de documento alcanzado, continuando desde abajo\nfind_reached_bottom=Fin de documento alcanzando, continuando desde arriba\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} de {{total}} coincidencias\nfind_match_count[two]={{current}} de {{total}} coincidencias\nfind_match_count[few]={{current}} de {{total}} coincidencias\nfind_match_count[many]={{current}} de {{total}} coincidencias\nfind_match_count[other]={{current}} de {{total}} coincidencias\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Más de {{limit}} coincidencias\nfind_match_count_limit[one]=Más de {{limit}} coinciden\nfind_match_count_limit[two]=Más de {{limit}} coincidencias\nfind_match_count_limit[few]=Más de {{limit}} coincidencias\nfind_match_count_limit[many]=Más de {{limit}} coincidencias\nfind_match_count_limit[other]=Más de {{limit}} coincidencias\nfind_not_found=Frase no encontrada\n\n# Error panel labels\nerror_more_info=Más información\nerror_less_info=Menos información\nerror_close=Cerrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensaje: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Archivo: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Línea: {{line}}\nrendering_error=Ocurrió un error al dibujar la página.\n\n# Predefined zoom values\npage_scale_width=Ancho de página\npage_scale_fit=Ajustar página\npage_scale_auto=Zoom automático\npage_scale_actual=Tamaño real\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Ocurrió un error al cargar el PDF.\ninvalid_file_error=Archivo PDF no válido o cocrrupto.\nmissing_file_error=Archivo PDF faltante.\nunexpected_response_error=Respuesta del servidor inesperada.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Anotación]\npassword_label=Ingrese la contraseña para abrir este archivo PDF\npassword_invalid=Contraseña inválida. Intente nuevamente.\npassword_ok=Aceptar\npassword_cancel=Cancelar\n\nprinting_not_supported=Advertencia: La impresión no está totalmente soportada por este navegador.\nprinting_not_ready=Advertencia: El PDF no está completamente cargado para impresión.\nweb_fonts_disabled=Tipografía web deshabilitada: no se pueden usar tipos incrustados en PDF.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/es-CL/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página anterior\nprevious_label=Anterior\nnext.title=Página siguiente\nnext_label=Siguiente\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Página\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Alejar\nzoom_out_label=Alejar\nzoom_in.title=Acercar\nzoom_in_label=Acercar\nzoom.title=Ampliación\npresentation_mode.title=Cambiar al modo de presentación\npresentation_mode_label=Modo de presentación\nopen_file.title=Abrir archivo\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar o abrir en nueva ventana)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Herramientas\ntools_label=Herramientas\nfirst_page.title=Ir a la primera página\nfirst_page.label=Ir a la primera página\nfirst_page_label=Ir a la primera página\nlast_page.title=Ir a la última página\nlast_page.label=Ir a la última página\nlast_page_label=Ir a la última página\npage_rotate_cw.title=Girar a la derecha\npage_rotate_cw.label=Girar a la derecha\npage_rotate_cw_label=Girar a la derecha\npage_rotate_ccw.title=Girar a la izquierda\npage_rotate_ccw.label=Girar a la izquierda\npage_rotate_ccw_label=Girar a la izquierda\n\ncursor_text_select_tool.title=Activar la herramienta de selección de texto\ncursor_text_select_tool_label=Herramienta de selección de texto\ncursor_hand_tool.title=Activar la herramienta de mano\ncursor_hand_tool_label=Herramienta de mano\n\nscroll_vertical.title=Usar desplazamiento vertical\nscroll_vertical_label=Desplazamiento vertical\nscroll_horizontal.title=Usar desplazamiento horizontal\nscroll_horizontal_label=Desplazamiento horizontal\nscroll_wrapped.title=Usar desplazamiento en bloque\nscroll_wrapped_label=Desplazamiento en bloque\n\nspread_none.title=No juntar páginas a modo de libro\nspread_none_label=Vista de una página\nspread_odd.title=Junta las páginas partiendo con una de número impar\nspread_odd_label=Vista de libro impar\nspread_even.title=Junta las páginas partiendo con una de número par\nspread_even_label=Vista de libro par\n\n# Document properties dialog box\ndocument_properties.title=Propiedades del documento…\ndocument_properties_label=Propiedades del documento…\ndocument_properties_file_name=Nombre de archivo:\ndocument_properties_file_size=Tamaño del archivo:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Asunto:\ndocument_properties_keywords=Palabras clave:\ndocument_properties_creation_date=Fecha de creación:\ndocument_properties_modification_date=Fecha de modificación:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creador:\ndocument_properties_producer=Productor del PDF:\ndocument_properties_version=Versión de PDF:\ndocument_properties_page_count=Cantidad de páginas:\ndocument_properties_page_size=Tamaño de la página:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=vertical\ndocument_properties_page_size_orientation_landscape=horizontal\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Carta\ndocument_properties_page_size_name_legal=Oficio\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Vista rápida en Web:\ndocument_properties_linearized_yes=Sí\ndocument_properties_linearized_no=No\ndocument_properties_close=Cerrar\n\nprint_progress_message=Preparando documento para impresión…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancelar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Barra lateral\ntoggle_sidebar_notification.title=Cambiar barra lateral (índice de contenidos del documento/adjuntos)\ntoggle_sidebar_notification2.title=Cambiar barra lateral (índice de contenidos del documento/adjuntos/capas)\ntoggle_sidebar_label=Mostrar u ocultar la barra lateral\ndocument_outline.title=Mostrar esquema del documento (doble clic para expandir/contraer todos los elementos)\ndocument_outline_label=Esquema del documento\nattachments.title=Mostrar adjuntos\nattachments_label=Adjuntos\nlayers.title=Mostrar capas (doble clic para restablecer todas las capas al estado predeterminado)\nlayers_label=Capas\nthumbs.title=Mostrar miniaturas\nthumbs_label=Miniaturas\ncurrent_outline_item.title=Buscar elemento de esquema actual\ncurrent_outline_item_label=Elemento de esquema actual\nfindbar.title=Buscar en el documento\nfindbar_label=Buscar\n\nadditional_layers=Capas adicionales\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Página {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Página {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura de la página {{page}}\n\n# Find panel button title and messages\nfind_input.title=Encontrar\nfind_input.placeholder=Encontrar en el documento…\nfind_previous.title=Buscar la aparición anterior de la frase\nfind_previous_label=Previo\nfind_next.title=Buscar la siguiente aparición de la frase\nfind_next_label=Siguiente\nfind_highlight=Destacar todos\nfind_match_case_label=Coincidir mayús./minús.\nfind_entire_word_label=Palabras completas\nfind_reached_top=Se alcanzó el inicio del documento, continuando desde el final\nfind_reached_bottom=Se alcanzó el final del documento, continuando desde el inicio\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} de {{total}} coincidencia\nfind_match_count[two]={{current}} de {{total}} coincidencias\nfind_match_count[few]={{current}} de {{total}} coincidencias\nfind_match_count[many]={{current}} de {{total}} coincidencias\nfind_match_count[other]={{current}} de {{total}} coincidencias\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Más de {{limit}} coincidencias\nfind_match_count_limit[one]=Más de {{limit}} coincidencia\nfind_match_count_limit[two]=Más de {{limit}} coincidencias\nfind_match_count_limit[few]=Más de {{limit}} coincidencias\nfind_match_count_limit[many]=Más de {{limit}} coincidencias\nfind_match_count_limit[other]=Más de {{limit}} coincidencias\nfind_not_found=Frase no encontrada\n\n# Error panel labels\nerror_more_info=Más información\nerror_less_info=Menos información\nerror_close=Cerrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (compilación: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensaje: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Archivo: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Línea: {{line}}\nrendering_error=Ocurrió un error al renderizar la página.\n\n# Predefined zoom values\npage_scale_width=Ancho de página\npage_scale_fit=Ajuste de página\npage_scale_auto=Aumento automático\npage_scale_actual=Tamaño actual\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Ocurrió un error al cargar el PDF.\ninvalid_file_error=Archivo PDF inválido o corrupto.\nmissing_file_error=Falta el archivo PDF.\nunexpected_response_error=Respuesta del servidor inesperada.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Anotación]\npassword_label=Ingrese la contraseña para abrir este archivo PDF.\npassword_invalid=Contraseña inválida. Por favor, vuelve a intentarlo.\npassword_ok=Aceptar\npassword_cancel=Cancelar\n\nprinting_not_supported=Advertencia: Imprimir no está soportado completamente por este navegador.\nprinting_not_ready=Advertencia: El PDF no está completamente cargado para ser impreso.\nweb_fonts_disabled=Las tipografías web están desactivadas: imposible usar las fuentes PDF embebidas.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/es-ES/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página anterior\nprevious_label=Anterior\nnext.title=Página siguiente\nnext_label=Siguiente\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Página\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Reducir\nzoom_out_label=Reducir\nzoom_in.title=Aumentar\nzoom_in_label=Aumentar\nzoom.title=Tamaño\npresentation_mode.title=Cambiar al modo presentación\npresentation_mode_label=Modo presentación\nopen_file.title=Abrir archivo\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar o abrir en una nueva ventana)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Herramientas\ntools_label=Herramientas\nfirst_page.title=Ir a la primera página\nfirst_page.label=Ir a la primera página\nfirst_page_label=Ir a la primera página\nlast_page.title=Ir a la última página\nlast_page.label=Ir a la última página\nlast_page_label=Ir a la última página\npage_rotate_cw.title=Rotar en sentido horario\npage_rotate_cw.label=Rotar en sentido horario\npage_rotate_cw_label=Rotar en sentido horario\npage_rotate_ccw.title=Rotar en sentido antihorario\npage_rotate_ccw.label=Rotar en sentido antihorario\npage_rotate_ccw_label=Rotar en sentido antihorario\n\ncursor_text_select_tool.title=Activar herramienta de selección de texto\ncursor_text_select_tool_label=Herramienta de selección de texto\ncursor_hand_tool.title=Activar herramienta de mano\ncursor_hand_tool_label=Herramienta de mano\n\nscroll_vertical.title=Usar desplazamiento vertical\nscroll_vertical_label=Desplazamiento vertical\nscroll_horizontal.title=Usar desplazamiento horizontal\nscroll_horizontal_label=Desplazamiento horizontal\nscroll_wrapped.title=Usar desplazamiento en bloque\nscroll_wrapped_label=Desplazamiento en bloque\n\nspread_none.title=No juntar páginas en vista de libro\nspread_none_label=Vista de libro\nspread_odd.title=Juntar las páginas partiendo de una con número impar\nspread_odd_label=Vista de libro impar\nspread_even.title=Juntar las páginas partiendo de una con número par\nspread_even_label=Vista de libro par\n\n# Document properties dialog box\ndocument_properties.title=Propiedades del documento…\ndocument_properties_label=Propiedades del documento…\ndocument_properties_file_name=Nombre de archivo:\ndocument_properties_file_size=Tamaño de archivo:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Asunto:\ndocument_properties_keywords=Palabras clave:\ndocument_properties_creation_date=Fecha de creación:\ndocument_properties_modification_date=Fecha de modificación:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creador:\ndocument_properties_producer=Productor PDF:\ndocument_properties_version=Versión PDF:\ndocument_properties_page_count=Número de páginas:\ndocument_properties_page_size=Tamaño de la página:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=vertical\ndocument_properties_page_size_orientation_landscape=horizontal\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Carta\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Vista rápida de la web:\ndocument_properties_linearized_yes=Sí\ndocument_properties_linearized_no=No\ndocument_properties_close=Cerrar\n\nprint_progress_message=Preparando documento para impresión…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancelar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Cambiar barra lateral\ntoggle_sidebar_notification.title=Alternar panel lateral (el documento contiene un esquema o adjuntos)\ntoggle_sidebar_notification2.title=Alternar barra lateral (el documento contiene esquemas/adjuntos/capas)\ntoggle_sidebar_label=Cambiar barra lateral\ndocument_outline.title=Mostrar resumen del documento (doble clic para expandir/contraer todos los elementos)\ndocument_outline_label=Resumen de documento\nattachments.title=Mostrar adjuntos\nattachments_label=Adjuntos\nlayers.title=Mostrar capas (doble clic para restablecer todas las capas al estado predeterminado)\nlayers_label=Capas\nthumbs.title=Mostrar miniaturas\nthumbs_label=Miniaturas\ncurrent_outline_item.title=Encontrar elemento de esquema actual\ncurrent_outline_item_label=Elemento de esquema actual\nfindbar.title=Buscar en el documento\nfindbar_label=Buscar\n\nadditional_layers=Capas adicionales\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Página {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Página {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura de la página {{page}}\n\n# Find panel button title and messages\nfind_input.title=Buscar\nfind_input.placeholder=Buscar en el documento…\nfind_previous.title=Encontrar la anterior aparición de la frase\nfind_previous_label=Anterior\nfind_next.title=Encontrar la siguiente aparición de esta frase\nfind_next_label=Siguiente\nfind_highlight=Resaltar todos\nfind_match_case_label=Coincidencia de mayús./minús.\nfind_entire_word_label=Palabras completas\nfind_reached_top=Se alcanzó el inicio del documento, se continúa desde el final\nfind_reached_bottom=Se alcanzó el final del documento, se continúa desde el inicio\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} de {{total}} coincidencia\nfind_match_count[two]={{current}} de {{total}} coincidencias\nfind_match_count[few]={{current}} de {{total}} coincidencias\nfind_match_count[many]={{current}} de {{total}} coincidencias\nfind_match_count[other]={{current}} de {{total}} coincidencias\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Más de {{limit}} coincidencias\nfind_match_count_limit[one]=Más de {{limit}} coincidencia\nfind_match_count_limit[two]=Más de {{limit}} coincidencias\nfind_match_count_limit[few]=Más de {{limit}} coincidencias\nfind_match_count_limit[many]=Más de {{limit}} coincidencias\nfind_match_count_limit[other]=Más de {{limit}} coincidencias\nfind_not_found=Frase no encontrada\n\n# Error panel labels\nerror_more_info=Más información\nerror_less_info=Menos información\nerror_close=Cerrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensaje: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Archivo: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Línea: {{line}}\nrendering_error=Ocurrió un error al renderizar la página.\n\n# Predefined zoom values\npage_scale_width=Anchura de la página\npage_scale_fit=Ajuste de la página\npage_scale_auto=Tamaño automático\npage_scale_actual=Tamaño real\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Ocurrió un error al cargar el PDF.\ninvalid_file_error=Fichero PDF no válido o corrupto.\nmissing_file_error=No hay fichero PDF.\nunexpected_response_error=Respuesta inesperada del servidor.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotación {{type}}]\npassword_label=Introduzca la contraseña para abrir este archivo PDF.\npassword_invalid=Contraseña no válida. Vuelva a intentarlo.\npassword_ok=Aceptar\npassword_cancel=Cancelar\n\nprinting_not_supported=Advertencia: Imprimir no está totalmente soportado por este navegador.\nprinting_not_ready=Advertencia: Este PDF no se ha cargado completamente para poder imprimirse.\nweb_fonts_disabled=Las tipografías web están desactivadas: es imposible usar las tipografías PDF embebidas.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/es-MX/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página anterior\nprevious_label=Anterior\nnext.title=Página siguiente\nnext_label=Siguiente\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Página\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Reducir\nzoom_out_label=Reducir\nzoom_in.title=Aumentar\nzoom_in_label=Aumentar\nzoom.title=Zoom\npresentation_mode.title=Cambiar al modo presentación\npresentation_mode_label=Modo presentación\nopen_file.title=Abrir archivo\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar o abrir en una nueva ventana)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Herramientas\ntools_label=Herramientas\nfirst_page.title=Ir a la primera página\nfirst_page.label=Ir a la primera página\nfirst_page_label=Ir a la primera página\nlast_page.title=Ir a la última página\nlast_page.label=Ir a la última página\nlast_page_label=Ir a la última página\npage_rotate_cw.title=Girar a la derecha\npage_rotate_cw.label=Girar a la derecha\npage_rotate_cw_label=Girar a la derecha\npage_rotate_ccw.title=Girar a la izquierda\npage_rotate_ccw.label=Girar a la izquierda\npage_rotate_ccw_label=Girar a la izquierda\n\ncursor_text_select_tool.title=Activar la herramienta de selección de texto\ncursor_text_select_tool_label=Herramienta de selección de texto\ncursor_hand_tool.title=Activar la herramienta de mano\ncursor_hand_tool_label=Herramienta de mano\n\nscroll_vertical.title=Usar desplazamiento vertical\nscroll_vertical_label=Desplazamiento vertical\nscroll_horizontal.title=Usar desplazamiento horizontal\nscroll_horizontal_label=Desplazamiento horizontal\nscroll_wrapped.title=Usar desplazamiento encapsulado\nscroll_wrapped_label=Desplazamiento encapsulado\n\nspread_none.title=No unir páginas separadas\nspread_none_label=Vista de una página\nspread_odd.title=Unir las páginas partiendo con una de número impar\nspread_odd_label=Vista de libro impar\nspread_even.title=Juntar las páginas partiendo con una de número par\nspread_even_label=Vista de libro par\n\n# Document properties dialog box\ndocument_properties.title=Propiedades del documento…\ndocument_properties_label=Propiedades del documento…\ndocument_properties_file_name=Nombre del archivo:\ndocument_properties_file_size=Tamaño del archivo:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Asunto:\ndocument_properties_keywords=Palabras claves:\ndocument_properties_creation_date=Fecha de creación:\ndocument_properties_modification_date=Fecha de modificación:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creador:\ndocument_properties_producer=Productor PDF:\ndocument_properties_version=Versión PDF:\ndocument_properties_page_count=Número de páginas:\ndocument_properties_page_size=Tamaño de la página:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=vertical\ndocument_properties_page_size_orientation_landscape=horizontal\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Carta\ndocument_properties_page_size_name_legal=Oficio\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Vista rápida de la web:\ndocument_properties_linearized_yes=Sí\ndocument_properties_linearized_no=No\ndocument_properties_close=Cerrar\n\nprint_progress_message=Preparando documento para impresión…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancelar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Cambiar barra lateral\ntoggle_sidebar_notification.title=Cambiar barra lateral (índice de contenidos del documento/adjuntos)\ntoggle_sidebar_notification2.title=Alternar barra lateral (el documento contiene esquemas/adjuntos/capas)\ntoggle_sidebar_label=Cambiar barra lateral\ndocument_outline.title=Mostrar esquema del documento (doble clic para expandir/contraer todos los elementos)\ndocument_outline_label=Esquema del documento\nattachments.title=Mostrar adjuntos\nattachments_label=Adjuntos\nlayers.title=Mostrar capas (doble clic para restablecer todas las capas al estado predeterminado)\nlayers_label=Capas\nthumbs.title=Mostrar miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Buscar en el documento\nfindbar_label=Buscar\n\nadditional_layers=Capas adicionales\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Página {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Página {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura de la página {{page}}\n\n# Find panel button title and messages\nfind_input.title=Buscar\nfind_input.placeholder=Buscar en el documento…\nfind_previous.title=Ir a la anterior frase encontrada\nfind_previous_label=Anterior\nfind_next.title=Ir a la siguiente frase encontrada\nfind_next_label=Siguiente\nfind_highlight=Resaltar todo\nfind_match_case_label=Coincidir con mayúsculas y minúsculas\nfind_entire_word_label=Palabras completas\nfind_reached_top=Se alcanzó el inicio del documento, se buscará al final\nfind_reached_bottom=Se alcanzó el final del documento, se buscará al inicio\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} de {{total}} coincidencia\nfind_match_count[two]={{current}} de {{total}} coincidencias\nfind_match_count[few]={{current}} de {{total}} coincidencias\nfind_match_count[many]={{current}} de {{total}} coincidencias\nfind_match_count[other]={{current}} de {{total}} coincidencias\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Más de {{limit}} coincidencias\nfind_match_count_limit[one]=Más de {{limit}} coinciden\nfind_match_count_limit[two]=Más de {{limit}} coincidencias\nfind_match_count_limit[few]=Más de {{limit}} coincidencias\nfind_match_count_limit[many]=Más de {{limit}} coincidencias\nfind_match_count_limit[other]=Más de {{limit}} coincidencias\nfind_not_found=No se encontró la frase\n\n# Error panel labels\nerror_more_info=Más información\nerror_less_info=Menos información\nerror_close=Cerrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensaje: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Archivo: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Línea: {{line}}\nrendering_error=Un error ocurrió al renderizar la página.\n\n# Predefined zoom values\npage_scale_width=Ancho de página\npage_scale_fit=Ajustar página\npage_scale_auto=Zoom automático\npage_scale_actual=Tamaño real\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Un error ocurrió al cargar el PDF.\ninvalid_file_error=Archivo PDF invalido o dañado.\nmissing_file_error=Archivo PDF no encontrado.\nunexpected_response_error=Respuesta inesperada del servidor.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} anotación]\npassword_label=Ingresa la contraseña para abrir este archivo PDF.\npassword_invalid=Contraseña inválida. Por favor intenta de nuevo.\npassword_ok=Aceptar\npassword_cancel=Cancelar\n\nprinting_not_supported=Advertencia: La impresión no esta completamente soportada por este navegador.\nprinting_not_ready=Advertencia: El PDF no cargo completamente para impresión.\nweb_fonts_disabled=Las fuentes web están desactivadas: es imposible usar las fuentes PDF embebidas.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/et/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Eelmine lehekülg\nprevious_label=Eelmine\nnext.title=Järgmine lehekülg\nnext_label=Järgmine\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Leht\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}}/{{pagesCount}})\n\nzoom_out.title=Vähenda\nzoom_out_label=Vähenda\nzoom_in.title=Suurenda\nzoom_in_label=Suurenda\nzoom.title=Suurendamine\npresentation_mode.title=Lülitu esitlusrežiimi\npresentation_mode_label=Esitlusrežiim\nopen_file.title=Ava fail\nopen_file_label=Ava\nprint.title=Prindi\nprint_label=Prindi\ndownload.title=Laadi alla\ndownload_label=Laadi alla\nbookmark.title=Praegune vaade (kopeeri või ava uues aknas)\nbookmark_label=Praegune vaade\n\n# Secondary toolbar and context menu\ntools.title=Tööriistad\ntools_label=Tööriistad\nfirst_page.title=Mine esimesele leheküljele\nfirst_page.label=Mine esimesele leheküljele\nfirst_page_label=Mine esimesele leheküljele\nlast_page.title=Mine viimasele leheküljele\nlast_page.label=Mine viimasele leheküljele\nlast_page_label=Mine viimasele leheküljele\npage_rotate_cw.title=Pööra päripäeva\npage_rotate_cw.label=Pööra päripäeva\npage_rotate_cw_label=Pööra päripäeva\npage_rotate_ccw.title=Pööra vastupäeva\npage_rotate_ccw.label=Pööra vastupäeva\npage_rotate_ccw_label=Pööra vastupäeva\n\ncursor_text_select_tool.title=Luba teksti valimise tööriist\ncursor_text_select_tool_label=Teksti valimise tööriist\ncursor_hand_tool.title=Luba sirvimistööriist\ncursor_hand_tool_label=Sirvimistööriist\n\nscroll_vertical.title=Kasuta vertikaalset kerimist\nscroll_vertical_label=Vertikaalne kerimine\nscroll_horizontal.title=Kasuta horisontaalset kerimist\nscroll_horizontal_label=Horisontaalne kerimine\nscroll_wrapped.title=Kasuta rohkem mahutavat kerimist\nscroll_wrapped_label=Rohkem mahutav kerimine\n\nspread_none.title=Ära kõrvuta lehekülgi\nspread_none_label=Lehtede kõrvutamine puudub\nspread_odd.title=Kõrvuta leheküljed, alustades paaritute numbritega lehekülgedega\nspread_odd_label=Kõrvutamine paaritute numbritega alustades\nspread_even.title=Kõrvuta leheküljed, alustades paarisnumbritega lehekülgedega\nspread_even_label=Kõrvutamine paarisnumbritega alustades\n\n# Document properties dialog box\ndocument_properties.title=Dokumendi omadused…\ndocument_properties_label=Dokumendi omadused…\ndocument_properties_file_name=Faili nimi:\ndocument_properties_file_size=Faili suurus:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KiB ({{size_b}} baiti)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MiB ({{size_b}} baiti)\ndocument_properties_title=Pealkiri:\ndocument_properties_author=Autor:\ndocument_properties_subject=Teema:\ndocument_properties_keywords=Märksõnad:\ndocument_properties_creation_date=Loodud:\ndocument_properties_modification_date=Muudetud:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}} {{time}}\ndocument_properties_creator=Looja:\ndocument_properties_producer=Generaator:\ndocument_properties_version=Generaatori versioon:\ndocument_properties_page_count=Lehekülgi:\ndocument_properties_page_size=Lehe suurus:\ndocument_properties_page_size_unit_inches=tolli\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=vertikaalpaigutus\ndocument_properties_page_size_orientation_landscape=rõhtpaigutus\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=\"Fast Web View\" tugi:\ndocument_properties_linearized_yes=Jah\ndocument_properties_linearized_no=Ei\ndocument_properties_close=Sulge\n\nprint_progress_message=Dokumendi ettevalmistamine printimiseks…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Loobu\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Näita külgriba\ntoggle_sidebar_notification.title=Näita külgriba (dokument sisaldab sisukorda/manuseid)\ntoggle_sidebar_label=Näita külgriba\ndocument_outline.title=Näita sisukorda (kõigi punktide laiendamiseks/ahendamiseks topeltklõpsa)\ndocument_outline_label=Näita sisukorda\nattachments.title=Näita manuseid\nattachments_label=Manused\nthumbs.title=Näita pisipilte\nthumbs_label=Pisipildid\nfindbar.title=Otsi dokumendist\nfindbar_label=Otsi\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}}. lehekülg\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}}. lehekülje pisipilt\n\n# Find panel button title and messages\nfind_input.title=Otsi\nfind_input.placeholder=Otsi dokumendist…\nfind_previous.title=Otsi fraasi eelmine esinemiskoht\nfind_previous_label=Eelmine\nfind_next.title=Otsi fraasi järgmine esinemiskoht\nfind_next_label=Järgmine\nfind_highlight=Too kõik esile\nfind_match_case_label=Tõstutundlik\nfind_entire_word_label=Täissõnad\nfind_reached_top=Jõuti dokumendi algusesse, jätkati lõpust\nfind_reached_bottom=Jõuti dokumendi lõppu, jätkati algusest\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]=vaste {{current}}/{{total}}\nfind_match_count[two]=vaste {{current}}/{{total}}\nfind_match_count[few]=vaste {{current}}/{{total}}\nfind_match_count[many]=vaste {{current}}/{{total}}\nfind_match_count[other]=vaste {{current}}/{{total}}\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Rohkem kui {{limit}} vastet\nfind_match_count_limit[one]=Rohkem kui {{limit}} vaste\nfind_match_count_limit[two]=Rohkem kui {{limit}} vastet\nfind_match_count_limit[few]=Rohkem kui {{limit}} vastet\nfind_match_count_limit[many]=Rohkem kui {{limit}} vastet\nfind_match_count_limit[other]=Rohkem kui {{limit}} vastet\nfind_not_found=Fraasi ei leitud\n\n# Error panel labels\nerror_more_info=Rohkem teavet\nerror_less_info=Vähem teavet\nerror_close=Sulge\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Teade: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fail: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rida: {{line}}\nrendering_error=Lehe renderdamisel esines viga.\n\n# Predefined zoom values\npage_scale_width=Mahuta laiusele\npage_scale_fit=Mahuta leheküljele\npage_scale_auto=Automaatne suurendamine\npage_scale_actual=Tegelik suurus\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=PDFi laadimisel esines viga.\ninvalid_file_error=Vigane või rikutud PDF-fail.\nmissing_file_error=PDF-fail puudub.\nunexpected_response_error=Ootamatu vastus serverilt.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}} {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=PDF-faili avamiseks sisesta parool.\npassword_invalid=Vigane parool. Palun proovi uuesti.\npassword_ok=Sobib\npassword_cancel=Loobu\n\nprinting_not_supported=Hoiatus: printimine pole selle brauseri poolt täielikult toetatud.\nprinting_not_ready=Hoiatus: PDF pole printimiseks täielikult laaditud.\nweb_fonts_disabled=Veebifondid on keelatud: PDFiga kaasatud fonte pole võimalik kasutada.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/eu/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Aurreko orria\nprevious_label=Aurrekoa\nnext.title=Hurrengo orria\nnext_label=Hurrengoa\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Orria\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages={{pagesCount}}/{{pageNumber}}\n\nzoom_out.title=Urrundu zooma\nzoom_out_label=Urrundu zooma\nzoom_in.title=Gerturatu zooma\nzoom_in_label=Gerturatu zooma\nzoom.title=Zooma\npresentation_mode.title=Aldatu aurkezpen modura\npresentation_mode_label=Arkezpen modua\nopen_file.title=Ireki fitxategia\nopen_file_label=Ireki\nprint.title=Inprimatu\nprint_label=Inprimatu\ndownload.title=Deskargatu\ndownload_label=Deskargatu\nbookmark.title=Uneko ikuspegia (kopiatu edo ireki leiho berrian)\nbookmark_label=Uneko ikuspegia\n\n# Secondary toolbar and context menu\ntools.title=Tresnak\ntools_label=Tresnak\nfirst_page.title=Joan lehen orrira\nfirst_page.label=Joan lehen orrira\nfirst_page_label=Joan lehen orrira\nlast_page.title=Joan azken orrira\nlast_page.label=Joan azken orrira\nlast_page_label=Joan azken orrira\npage_rotate_cw.title=Biratu erlojuaren norantzan\npage_rotate_cw.label=Biratu erlojuaren norantzan\npage_rotate_cw_label=Biratu erlojuaren norantzan\npage_rotate_ccw.title=Biratu erlojuaren aurkako norantzan\npage_rotate_ccw.label=Biratu erlojuaren aurkako norantzan\npage_rotate_ccw_label=Biratu erlojuaren aurkako norantzan\n\ncursor_text_select_tool.title=Gaitu testuaren hautapen tresna\ncursor_text_select_tool_label=Testuaren hautapen tresna\ncursor_hand_tool.title=Gaitu eskuaren tresna\ncursor_hand_tool_label=Eskuaren tresna\n\nscroll_vertical.title=Erabili korritze bertikala\nscroll_vertical_label=Korritze bertikala\nscroll_horizontal.title=Erabili korritze horizontala\nscroll_horizontal_label=Korritze horizontala\nscroll_wrapped.title=Erabili korritze egokitua\nscroll_wrapped_label=Korritze egokitua\n\nspread_none.title=Ez elkartu barreiatutako orriak\nspread_none_label=Barreiatzerik ez\nspread_odd.title=Elkartu barreiatutako orriak bakoiti zenbakidunekin hasita\nspread_odd_label=Barreiatze bakoitia\nspread_even.title=Elkartu barreiatutako orriak bikoiti zenbakidunekin hasita\nspread_even_label=Barreiatze bikoitia\n\n# Document properties dialog box\ndocument_properties.title=Dokumentuaren propietateak…\ndocument_properties_label=Dokumentuaren propietateak…\ndocument_properties_file_name=Fitxategi-izena:\ndocument_properties_file_size=Fitxategiaren tamaina:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} byte)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} byte)\ndocument_properties_title=Izenburua:\ndocument_properties_author=Egilea:\ndocument_properties_subject=Gaia:\ndocument_properties_keywords=Gako-hitzak:\ndocument_properties_creation_date=Sortze-data:\ndocument_properties_modification_date=Aldatze-data:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Sortzailea:\ndocument_properties_producer=PDFaren ekoizlea:\ndocument_properties_version=PDF bertsioa:\ndocument_properties_page_count=Orrialde kopurua:\ndocument_properties_page_size=Orriaren tamaina:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=bertikala\ndocument_properties_page_size_orientation_landscape=horizontala\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Gutuna\ndocument_properties_page_size_name_legal=Legala\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Webeko ikuspegi bizkorra:\ndocument_properties_linearized_yes=Bai\ndocument_properties_linearized_no=Ez\ndocument_properties_close=Itxi\n\nprint_progress_message=Dokumentua inprimatzeko prestatzen…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent=%{{progress}}\nprint_progress_close=Utzi\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Txandakatu alboko barra\ntoggle_sidebar_notification.title=Txandakatu alboko barra (dokumentuak eskema/eranskinak ditu)\ntoggle_sidebar_notification2.title=Txandakatu alboko barra (dokumentuak eskema/eranskinak/geruzak ditu)\ntoggle_sidebar_label=Txandakatu alboko barra\ndocument_outline.title=Erakutsi dokumentuaren eskema (klik bikoitza elementu guztiak zabaltzeko/tolesteko)\ndocument_outline_label=Dokumentuaren eskema\nattachments.title=Erakutsi eranskinak\nattachments_label=Eranskinak\nlayers.title=Erakutsi geruzak (klik bikoitza geruza guztiak egoera lehenetsira berrezartzeko)\nlayers_label=Geruzak\nthumbs.title=Erakutsi koadro txikiak\nthumbs_label=Koadro txikiak\ncurrent_outline_item.title=Bilatu uneko eskemaren elementua\ncurrent_outline_item_label=Uneko eskemaren elementua\nfindbar.title=Bilatu dokumentuan\nfindbar_label=Bilatu\n\nadditional_layers=Geruza gehigarriak\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas={{page}}. orria\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}}. orria\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}}. orriaren koadro txikia\n\n# Find panel button title and messages\nfind_input.title=Bilatu\nfind_input.placeholder=Bilatu dokumentuan…\nfind_previous.title=Bilatu esaldiaren aurreko parekatzea\nfind_previous_label=Aurrekoa\nfind_next.title=Bilatu esaldiaren hurrengo parekatzea\nfind_next_label=Hurrengoa\nfind_highlight=Nabarmendu guztia\nfind_match_case_label=Bat etorri maiuskulekin/minuskulekin\nfind_entire_word_label=Hitz osoak\nfind_reached_top=Dokumentuaren hasierara heldu da, bukaeratik jarraitzen\nfind_reached_bottom=Dokumentuaren bukaerara heldu da, hasieratik jarraitzen\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{total}}/{{current}}. bat etortzea\nfind_match_count[two]={{total}}/{{current}}. bat etortzea\nfind_match_count[few]={{total}}/{{current}}. bat etortzea\nfind_match_count[many]={{total}}/{{current}}. bat etortzea\nfind_match_count[other]={{total}}/{{current}}. bat etortzea\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]={{limit}} bat-etortze baino gehiago\nfind_match_count_limit[one]=Bat-etortze {{limit}} baino gehiago\nfind_match_count_limit[two]={{limit}} bat-etortze baino gehiago\nfind_match_count_limit[few]={{limit}} bat-etortze baino gehiago\nfind_match_count_limit[many]={{limit}} bat-etortze baino gehiago\nfind_match_count_limit[other]={{limit}} bat-etortze baino gehiago\nfind_not_found=Esaldia ez da aurkitu\n\n# Error panel labels\nerror_more_info=Informazio gehiago\nerror_less_info=Informazio gutxiago\nerror_close=Itxi\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (eraikuntza: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mezua: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fitxategia: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Lerroa: {{line}}\nrendering_error=Errorea gertatu da orria errendatzean.\n\n# Predefined zoom values\npage_scale_width=Orriaren zabalera\npage_scale_fit=Doitu orrira\npage_scale_auto=Zoom automatikoa\npage_scale_actual=Benetako tamaina\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent=%{{scale}}\n\n# Loading indicator messages\nloading_error=Errorea gertatu da PDFa kargatzean.\ninvalid_file_error=PDF fitxategi baliogabe edo hondatua.\nmissing_file_error=PDF fitxategia falta da.\nunexpected_response_error=Espero gabeko zerbitzariaren erantzuna.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} ohartarazpena]\npassword_label=Idatzi PDF fitxategi hau irekitzeko pasahitza.\npassword_invalid=Pasahitz baliogabea. Saiatu berriro mesedez.\npassword_ok=Ados\npassword_cancel=Utzi\n\nprinting_not_supported=Abisua: inprimatzeko euskarria ez da erabatekoa nabigatzaile honetan.\nprinting_not_ready=Abisua: PDFa ez dago erabat kargatuta inprimatzeko.\nweb_fonts_disabled=Webeko letra-tipoak desgaituta daude: ezin dira kapsulatutako PDF letra-tipoak erabili.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/fa/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=صفحهٔ قبلی\nprevious_label=قبلی\nnext.title=صفحهٔ بعدی\nnext_label=بعدی\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=صفحه\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=از {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}}از {{pagesCount}})\n\nzoom_out.title=کوچک‌نمایی\nzoom_out_label=کوچک‌نمایی\nzoom_in.title=بزرگ‌نمایی\nzoom_in_label=بزرگ‌نمایی\nzoom.title=زوم\npresentation_mode.title=تغییر به حالت ارائه\npresentation_mode_label=حالت ارائه\nopen_file.title=باز کردن پرونده\nopen_file_label=باز کردن\nprint.title=چاپ\nprint_label=چاپ\ndownload.title=بارگیری\ndownload_label=بارگیری\nbookmark.title=نمای فعلی (رونوشت و یا نشان دادن در پنجره جدید)\nbookmark_label=نمای فعلی\n\n# Secondary toolbar and context menu\ntools.title=ابزارها\ntools_label=ابزارها\nfirst_page.title=برو به اولین صفحه\nfirst_page.label=برو یه اولین صفحه\nfirst_page_label=برو به اولین صفحه\nlast_page.title=برو به آخرین صفحه\nlast_page.label=برو به آخرین صفحه\nlast_page_label=برو به آخرین صفحه\npage_rotate_cw.title=چرخش ساعتگرد\npage_rotate_cw.label=چرخش ساعتگرد\npage_rotate_cw_label=چرخش ساعتگرد\npage_rotate_ccw.title=چرخش پاد ساعتگرد\npage_rotate_ccw.label=چرخش پاد ساعتگرد\npage_rotate_ccw_label=چرخش پاد ساعتگرد\n\ncursor_text_select_tool.title=فعال کردن ابزارِ انتخابِ متن\ncursor_text_select_tool_label=ابزارِ انتخابِ متن\ncursor_hand_tool.title=فعال کردن ابزارِ دست\ncursor_hand_tool_label=ابزار دست\n\nscroll_vertical.title=استفاده از پیمایش عمودی\nscroll_vertical_label=پیمایش عمودی\nscroll_horizontal.title=استفاده از پیمایش افقی\nscroll_horizontal_label=پیمایش افقی\n\n\n# Document properties dialog box\ndocument_properties.title=خصوصیات سند...\ndocument_properties_label=خصوصیات سند...\ndocument_properties_file_name=نام فایل:\ndocument_properties_file_size=حجم پرونده:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} کیلوبایت ({{size_b}} بایت)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} مگابایت ({{size_b}} بایت)\ndocument_properties_title=عنوان:\ndocument_properties_author=نویسنده:\ndocument_properties_subject=موضوع:\ndocument_properties_keywords=کلیدواژه‌ها:\ndocument_properties_creation_date=تاریخ ایجاد:\ndocument_properties_modification_date=تاریخ ویرایش:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}، {{time}}\ndocument_properties_creator=ایجاد کننده:\ndocument_properties_producer=ایجاد کننده PDF:\ndocument_properties_version=نسخه PDF:\ndocument_properties_page_count=تعداد صفحات:\ndocument_properties_page_size=اندازه صفحه:\ndocument_properties_page_size_unit_inches=اینچ\ndocument_properties_page_size_unit_millimeters=میلی‌متر\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=نامه\ndocument_properties_page_size_name_legal=حقوقی\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized_yes=بله\ndocument_properties_linearized_no=خیر\ndocument_properties_close=بستن\n\nprint_progress_message=آماده سازی مدارک برای چاپ کردن…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=لغو\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=باز و بسته کردن نوار کناری\ntoggle_sidebar_notification.title=تغییر وضعیت نوار کناری (سند حاوی طرح/پیوست است)\ntoggle_sidebar_label=تغییرحالت نوارکناری\ndocument_outline.title=نمایش رئوس مطالب مدارک(برای بازشدن/جمع شدن همه موارد دوبار کلیک کنید)\ndocument_outline_label=طرح نوشتار\nattachments.title=نمایش پیوست‌ها\nattachments_label=پیوست‌ها\nthumbs.title=نمایش تصاویر بندانگشتی\nthumbs_label=تصاویر بندانگشتی\nfindbar.title=جستجو در سند\nfindbar_label=پیدا کردن\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=صفحه {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=تصویر بند‌ انگشتی صفحه {{page}}\n\n# Find panel button title and messages\nfind_input.title=پیدا کردن\nfind_input.placeholder=پیدا کردن در سند…\nfind_previous.title=پیدا کردن رخداد قبلی عبارت\nfind_previous_label=قبلی\nfind_next.title=پیدا کردن رخداد بعدی عبارت\nfind_next_label=بعدی\nfind_highlight=برجسته و هایلایت کردن همه موارد\nfind_match_case_label=تطبیق کوچکی و بزرگی حروف\nfind_entire_word_label=تمام کلمه‌ها\nfind_reached_top=به بالای صفحه رسیدیم، از پایین ادامه می‌دهیم\nfind_reached_bottom=به آخر صفحه رسیدیم، از بالا ادامه می‌دهیم\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count[one]={{current}} از {{total}} مطابقت دارد\nfind_match_count[two]={{current}} از {{total}} مطابقت دارد\nfind_match_count[few]={{current}} از {{total}} مطابقت دارد\nfind_match_count[many]={{current}} از {{total}} مطابقت دارد\nfind_match_count[other]={{current}} از {{total}} مطابقت دارد\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_not_found=عبارت پیدا نشد\n\n# Error panel labels\nerror_more_info=اطلاعات بیشتر\nerror_less_info=اطلاعات کمتر\nerror_close=بستن\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=‏PDF.js ورژن{{version}} ‏(ساخت: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=پیام: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=توده: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=پرونده: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=سطر: {{line}}\nrendering_error=هنگام بارگیری صفحه خطایی رخ داد.\n\n# Predefined zoom values\npage_scale_width=عرض صفحه\npage_scale_fit=اندازه کردن صفحه\npage_scale_auto=بزرگنمایی خودکار\npage_scale_actual=اندازه واقعی‌\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=هنگام بارگیری پرونده PDF خطایی رخ داد.\ninvalid_file_error=پرونده PDF نامعتبر یامعیوب می‌باشد.\nmissing_file_error=پرونده PDF یافت نشد.\nunexpected_response_error=پاسخ پیش بینی نشده سرور\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=جهت باز کردن پرونده PDF گذرواژه را وارد نمائید.\npassword_invalid=گذرواژه نامعتبر. لطفا مجددا تلاش کنید.\npassword_ok=تأیید\npassword_cancel=لغو\n\nprinting_not_supported=هشدار: قابلیت چاپ به‌طور کامل در این مرورگر پشتیبانی نمی‌شود.\nprinting_not_ready=اخطار: پرونده PDF بطور کامل بارگیری نشده و امکان چاپ وجود ندارد.\nweb_fonts_disabled=فونت های تحت وب غیر فعال شده اند: امکان استفاده از نمایش دهنده داخلی PDF وجود ندارد.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/ff/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Hello Ɓennungo\nprevious_label=Ɓennuɗo\nnext.title=Hello faango\nnext_label=Yeeso\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Hello\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=e nder {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} of {{pagesCount}})\n\nzoom_out.title=Lonngo Woɗɗa\nzoom_out_label=Lonngo Woɗɗa\nzoom_in.title=Lonngo Ara\nzoom_in_label=Lonngo Ara\nzoom.title=Lonngo\npresentation_mode.title=Faytu to  Presentation Mode\npresentation_mode_label=Presentation Mode\nopen_file.title=Uddit Fiilde\nopen_file_label=Uddit\nprint.title=Winndito\nprint_label=Winndito\ndownload.title=Aawto\ndownload_label=Aawto\nbookmark.title=Jiytol gonangol (natto walla uddit e henorde)\nbookmark_label=Jiytol Gonangol\n\n# Secondary toolbar and context menu\ntools.title=Kuutorɗe\ntools_label=Kuutorɗe\nfirst_page.title=Yah to hello adanngo\nfirst_page.label=Yah to hello adanngo\nfirst_page_label=Yah to hello adanngo\nlast_page.title=Yah to hello wattindiingo\nlast_page.label=Yah to hello wattindiingo\nlast_page_label=Yah to hello wattindiingo\npage_rotate_cw.title=Yiiltu Faya Ñaamo\npage_rotate_cw.label=Yiiltu Faya Ñaamo\npage_rotate_cw_label=Yiiltu Faya Ñaamo\npage_rotate_ccw.title=Yiiltu Faya Nano\npage_rotate_ccw.label=Yiiltu Faya Nano\npage_rotate_ccw_label=Yiiltu Faya Nano\n\ncursor_text_select_tool.title=Gollin kaɓirgel cuɓirgel binndi\ncursor_text_select_tool_label=Kaɓirgel cuɓirgel binndi\ncursor_hand_tool.title=Hurmin kuutorgal junngo\ncursor_hand_tool_label=Kaɓirgel junngo\n\nscroll_vertical.title=Huutoro gorwitol daringol\nscroll_vertical_label=Gorwitol daringol\nscroll_horizontal.title=Huutoro gorwitol lelingol\nscroll_horizontal_label=Gorwitol daringol\nscroll_wrapped.title=Huutoro gorwitol coomingol\nscroll_wrapped_label=Gorwitol coomingol\n\nspread_none.title=Hoto tawtu kelle kelle\nspread_none_label=Alaa Spreads\nspread_odd.title=Tawtu kelle puɗɗortooɗe kelle teelɗe\nspread_odd_label=Kelle teelɗe\nspread_even.title=Tawtu ɗereeji kelle puɗɗoriiɗi kelle teeltuɗe\nspread_even_label=Kelle teeltuɗe\n\n# Document properties dialog box\ndocument_properties.title=Keeroraaɗi Winndannde…\ndocument_properties_label=Keeroraaɗi Winndannde…\ndocument_properties_file_name=Innde fiilde:\ndocument_properties_file_size=Ɓetol fiilde:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bite)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bite)\ndocument_properties_title=Tiitoonde:\ndocument_properties_author=Binnduɗo:\ndocument_properties_subject=Toɓɓere:\ndocument_properties_keywords=Kelmekele jiytirɗe:\ndocument_properties_creation_date=Ñalnde Sosaa:\ndocument_properties_modification_date=Ñalnde Waylaa:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Cosɗo:\ndocument_properties_producer=Paggiiɗo PDF:\ndocument_properties_version=Yamre PDF:\ndocument_properties_page_count=Limoore Kelle:\ndocument_properties_page_size=Ɓeto Hello:\ndocument_properties_page_size_unit_inches=nder\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=dariingo\ndocument_properties_page_size_orientation_landscape=wertiingo\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Ɓataake\ndocument_properties_page_size_name_legal=Laawol\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Ɗisngo geese yaawngo:\ndocument_properties_linearized_yes=Eey\ndocument_properties_linearized_no=Alaa\ndocument_properties_close=Uddu\n\nprint_progress_message=Nana heboo winnditaade fiilannde…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Haaytu\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toggilo Palal Sawndo\ntoggle_sidebar_notification.title=Palal sawndo (dokimaa oo ina waɗi taarngo/cinnde)\ntoggle_sidebar_label=Toggilo Palal Sawndo\ndocument_outline.title=Hollu Ƴiyal Fiilannde (dobdobo ngam wertude/taggude teme fof)\ndocument_outline_label=Toɓɓe Fiilannde\nattachments.title=Hollu Ɗisanɗe\nattachments_label=Ɗisanɗe\nthumbs.title=Hollu Dooɓe\nthumbs_label=Dooɓe\nfindbar.title=Yiylo e fiilannde\nfindbar_label=Yiytu\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Hello {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Dooɓre Hello {{page}}\n\n# Find panel button title and messages\nfind_input.title=Yiytu\nfind_input.placeholder=Yiylo nder dokimaa\nfind_previous.title=Yiylo cilol ɓennugol konngol ngol\nfind_previous_label=Ɓennuɗo\nfind_next.title=Yiylo cilol garowol konngol ngol\nfind_next_label=Yeeso\nfind_highlight=Jalbin fof\nfind_match_case_label=Jaaɓnu darnde\nfind_entire_word_label=Kelme timmuɗe tan\nfind_reached_top=Heɓii fuɗɗorde fiilannde, jokku faya les\nfind_reached_bottom=Heɓii hoore fiilannde, jokku faya les\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} wonande laabi {{total}}\nfind_match_count[two]={{current}} wonande laabi {{total}}\nfind_match_count[few]={{current}} wonande laabi {{total}}\nfind_match_count[many]={{current}} wonande laabi {{total}}\nfind_match_count[other]={{current}} wonande laabi {{total}}\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Ko ɓuri laabi {{limit}}\nfind_match_count_limit[one]=Ko ɓuri laani {{limit}}\nfind_match_count_limit[two]=Ko ɓuri laabi {{limit}}\nfind_match_count_limit[few]=Ko ɓuri laabi {{limit}}\nfind_match_count_limit[many]=Ko ɓuri laabi {{limit}}\nfind_match_count_limit[other]=Ko ɓuri laabi {{limit}}\nfind_not_found=Konngi njiyataa\n\n# Error panel labels\nerror_more_info=Ɓeydu Humpito\nerror_less_info=Ustu Humpito\nerror_close=Uddu\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Ɓatakuure: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fiilde: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Gorol: {{line}}\nrendering_error=Juumre waɗii tuma nde yoŋkittoo hello.\n\n# Predefined zoom values\npage_scale_width=Njaajeendi Hello\npage_scale_fit=Keƴeendi Hello\npage_scale_auto=Loongorde Jaajol\npage_scale_actual=Ɓetol Jaati\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Juumre waɗii tuma nde loowata PDF oo.\ninvalid_file_error=Fiilde PDF moƴƴaani walla jiibii.\nmissing_file_error=Fiilde PDF ena ŋakki.\nunexpected_response_error=Jaabtol sarworde tijjinooka.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Siiftannde]\npassword_label=Naatu finnde ngam uddite ndee fiilde PDF.\npassword_invalid=Finnde moƴƴaani. Tiiɗno eto kadi.\npassword_ok=OK\npassword_cancel=Haaytu\n\nprinting_not_supported=Reentino: Winnditagol tammbitaaka no feewi e ndee wanngorde.\nprinting_not_ready=Reentino: PDF oo loowaaki haa timmi ngam winnditagol.\nweb_fonts_disabled=Ponte geese ko daaƴaaɗe: horiima huutoraade ponte PDF coomtoraaɗe.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/fi/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Edellinen sivu\nprevious_label=Edellinen\nnext.title=Seuraava sivu\nnext_label=Seuraava\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Sivu\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} / {{pagesCount}})\n\nzoom_out.title=Loitonna\nzoom_out_label=Loitonna\nzoom_in.title=Lähennä\nzoom_in_label=Lähennä\nzoom.title=Suurennus\npresentation_mode.title=Siirry esitystilaan\npresentation_mode_label=Esitystila\nopen_file.title=Avaa tiedosto\nopen_file_label=Avaa\nprint.title=Tulosta\nprint_label=Tulosta\ndownload.title=Lataa\ndownload_label=Lataa\nbookmark.title=Avoin ikkuna (kopioi tai avaa uuteen ikkunaan)\nbookmark_label=Avoin ikkuna\n\n# Secondary toolbar and context menu\ntools.title=Tools\ntools_label=Tools\nfirst_page.title=Siirry ensimmäiselle sivulle\nfirst_page.label=Siirry ensimmäiselle sivulle\nfirst_page_label=Siirry ensimmäiselle sivulle\nlast_page.title=Siirry viimeiselle sivulle\nlast_page.label=Siirry viimeiselle sivulle\nlast_page_label=Siirry viimeiselle sivulle\npage_rotate_cw.title=Kierrä oikealle\npage_rotate_cw.label=Kierrä oikealle\npage_rotate_cw_label=Kierrä oikealle\npage_rotate_ccw.title=Kierrä vasemmalle\npage_rotate_ccw.label=Kierrä vasemmalle\npage_rotate_ccw_label=Kierrä vasemmalle\n\ncursor_text_select_tool.title=Käytä tekstinvalintatyökalua\ncursor_text_select_tool_label=Tekstinvalintatyökalu\ncursor_hand_tool.title=Käytä käsityökalua\ncursor_hand_tool_label=Käsityökalu\n\nscroll_vertical.title=Käytä pystysuuntaista vieritystä\nscroll_vertical_label=Pystysuuntainen vieritys\nscroll_horizontal.title=Käytä vaakasuuntaista vieritystä\nscroll_horizontal_label=Vaakasuuntainen vieritys\nscroll_wrapped.title=Käytä rivittyvää vieritystä\nscroll_wrapped_label=Rivittyvä vieritys\n\nspread_none.title=Älä yhdistä sivuja aukeamiksi\nspread_none_label=Ei aukeamia\nspread_odd.title=Yhdistä sivut aukeamiksi alkaen parittomalta sivulta\nspread_odd_label=Parittomalta alkavat aukeamat\nspread_even.title=Yhdistä sivut aukeamiksi alkaen parilliselta sivulta\nspread_even_label=Parilliselta alkavat aukeamat\n\n# Document properties dialog box\ndocument_properties.title=Dokumentin ominaisuudet…\ndocument_properties_label=Dokumentin ominaisuudet…\ndocument_properties_file_name=Tiedostonimi:\ndocument_properties_file_size=Tiedoston koko:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kt ({{size_b}} tavua)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} Mt ({{size_b}} tavua)\ndocument_properties_title=Otsikko:\ndocument_properties_author=Tekijä:\ndocument_properties_subject=Aihe:\ndocument_properties_keywords=Avainsanat:\ndocument_properties_creation_date=Luomispäivämäärä:\ndocument_properties_modification_date=Muokkauspäivämäärä:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Luoja:\ndocument_properties_producer=PDF-tuottaja:\ndocument_properties_version=PDF-versio:\ndocument_properties_page_count=Sivujen määrä:\ndocument_properties_page_size=Sivun koko:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=pysty\ndocument_properties_page_size_orientation_landscape=vaaka\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Nopea web-katselu:\ndocument_properties_linearized_yes=Kyllä\ndocument_properties_linearized_no=Ei\ndocument_properties_close=Sulje\n\nprint_progress_message=Valmistellaan dokumenttia tulostamista varten…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}} %\nprint_progress_close=Peruuta\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Näytä/piilota sivupaneeli\ntoggle_sidebar_notification.title=Näytä/piilota sivupaneeli (dokumentissa on sisällys tai liitteitä)\ntoggle_sidebar_notification2.title=Näytä/piilota sivupaneeli (dokumentissa on sisällys/liitteitä/tasoja)\ntoggle_sidebar_label=Näytä/piilota sivupaneeli\ndocument_outline.title=Näytä dokumentin sisällys (laajenna tai kutista kohdat kaksoisnapsauttamalla)\ndocument_outline_label=Dokumentin sisällys\nattachments.title=Näytä liitteet\nattachments_label=Liitteet\nlayers.title=Näytä tasot (kaksoisnapsauta palauttaaksesi kaikki tasot oletustilaan)\nlayers_label=Tasot\nthumbs.title=Näytä pienoiskuvat\nthumbs_label=Pienoiskuvat\ncurrent_outline_item.title=Etsi nykyinen sisällyksen kohta\ncurrent_outline_item_label=Nykyinen sisällyksen kohta\nfindbar.title=Etsi dokumentista\nfindbar_label=Etsi\n\nadditional_layers=Lisätasot\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Sivu {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Sivu {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Pienoiskuva sivusta {{page}}\n\n# Find panel button title and messages\nfind_input.title=Etsi\nfind_input.placeholder=Etsi dokumentista…\nfind_previous.title=Etsi hakusanan edellinen osuma\nfind_previous_label=Edellinen\nfind_next.title=Etsi hakusanan seuraava osuma\nfind_next_label=Seuraava\nfind_highlight=Korosta kaikki\nfind_match_case_label=Huomioi kirjainkoko\nfind_entire_word_label=Kokonaiset sanat\nfind_reached_top=Päästiin dokumentin alkuun, jatketaan lopusta\nfind_reached_bottom=Päästiin dokumentin loppuun, jatketaan alusta\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} / {{total}} osuma\nfind_match_count[two]={{current}} / {{total}} osumaa\nfind_match_count[few]={{current}} / {{total}} osumaa\nfind_match_count[many]={{current}} / {{total}} osumaa\nfind_match_count[other]={{current}} / {{total}} osumaa\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Enemmän kuin {{limit}} osumaa\nfind_match_count_limit[one]=Enemmän kuin {{limit}} osuma\nfind_match_count_limit[two]=Enemmän kuin {{limit}} osumaa\nfind_match_count_limit[few]=Enemmän kuin {{limit}} osumaa\nfind_match_count_limit[many]=Enemmän kuin {{limit}} osumaa\nfind_match_count_limit[other]=Enemmän kuin {{limit}} osumaa\nfind_not_found=Hakusanaa ei löytynyt\n\n# Error panel labels\nerror_more_info=Lisätietoja\nerror_less_info=Lisätietoja\nerror_close=Sulje\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (kooste: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Virheilmoitus: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pino: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Tiedosto: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rivi: {{line}}\nrendering_error=Tapahtui virhe piirrettäessä sivua.\n\n# Predefined zoom values\npage_scale_width=Sivun leveys\npage_scale_fit=Koko sivu\npage_scale_auto=Automaattinen suurennus\npage_scale_actual=Todellinen koko\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}} %\n\n# Loading indicator messages\nloading_error=Tapahtui virhe ladattaessa PDF-tiedostoa.\ninvalid_file_error=Virheellinen tai vioittunut PDF-tiedosto.\nmissing_file_error=Puuttuva PDF-tiedosto.\nunexpected_response_error=Odottamaton vastaus palvelimelta.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Kirjoita PDF-tiedoston salasana.\npassword_invalid=Virheellinen salasana. Yritä uudestaan.\npassword_ok=OK\npassword_cancel=Peruuta\n\nprinting_not_supported=Varoitus: Selain ei tue kaikkia tulostustapoja.\nprinting_not_ready=Varoitus: PDF-tiedosto ei ole vielä latautunut kokonaan, eikä sitä voi vielä tulostaa.\nweb_fonts_disabled=Verkkosivujen omat kirjasinlajit on estetty: ei voida käyttää upotettuja PDF-kirjasinlajeja.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/fr/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Page précédente\nprevious_label=Précédent\nnext.title=Page suivante\nnext_label=Suivant\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Page\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=sur {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} sur {{pagesCount}})\n\nzoom_out.title=Zoom arrière\nzoom_out_label=Zoom arrière\nzoom_in.title=Zoom avant\nzoom_in_label=Zoom avant\nzoom.title=Zoom\npresentation_mode.title=Basculer en mode présentation\npresentation_mode_label=Mode présentation\nopen_file.title=Ouvrir le fichier\nopen_file_label=Ouvrir le fichier\nprint.title=Imprimer\nprint_label=Imprimer\ndownload.title=Télécharger\ndownload_label=Télécharger\nbookmark.title=Affichage courant (copier ou ouvrir dans une nouvelle fenêtre)\nbookmark_label=Affichage actuel\n\n# Secondary toolbar and context menu\ntools.title=Outils\ntools_label=Outils\nfirst_page.title=Aller à la première page\nfirst_page.label=Aller à la première page\nfirst_page_label=Aller à la première page\nlast_page.title=Aller à la dernière page\nlast_page.label=Aller à la dernière page\nlast_page_label=Aller à la dernière page\npage_rotate_cw.title=Rotation horaire\npage_rotate_cw.label=Rotation horaire\npage_rotate_cw_label=Rotation horaire\npage_rotate_ccw.title=Rotation antihoraire\npage_rotate_ccw.label=Rotation antihoraire\npage_rotate_ccw_label=Rotation antihoraire\n\ncursor_text_select_tool.title=Activer l’outil de sélection de texte\ncursor_text_select_tool_label=Outil de sélection de texte\ncursor_hand_tool.title=Activer l’outil main\ncursor_hand_tool_label=Outil main\n\nscroll_vertical.title=Utiliser le défilement vertical\nscroll_vertical_label=Défilement vertical\nscroll_horizontal.title=Utiliser le défilement horizontal\nscroll_horizontal_label=Défilement horizontal\nscroll_wrapped.title=Utiliser le défilement par bloc\nscroll_wrapped_label=Défilement par bloc\n\nspread_none.title=Ne pas afficher les pages deux à deux\nspread_none_label=Pas de double affichage\nspread_odd.title=Afficher les pages par deux, impaires à gauche\nspread_odd_label=Doubles pages, impaires à gauche\nspread_even.title=Afficher les pages par deux, paires à gauche\nspread_even_label=Doubles pages, paires à gauche\n\n# Document properties dialog box\ndocument_properties.title=Propriétés du document…\ndocument_properties_label=Propriétés du document…\ndocument_properties_file_name=Nom du fichier :\ndocument_properties_file_size=Taille du fichier :\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} Ko ({{size_b}} octets)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} Mo ({{size_b}} octets)\ndocument_properties_title=Titre :\ndocument_properties_author=Auteur :\ndocument_properties_subject=Sujet :\ndocument_properties_keywords=Mots-clés :\ndocument_properties_creation_date=Date de création :\ndocument_properties_modification_date=Modifié le :\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}} à {{time}}\ndocument_properties_creator=Créé par :\ndocument_properties_producer=Outil de conversion PDF :\ndocument_properties_version=Version PDF :\ndocument_properties_page_count=Nombre de pages :\ndocument_properties_page_size=Taille de la page :\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=portrait\ndocument_properties_page_size_orientation_landscape=paysage\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=lettre\ndocument_properties_page_size_name_legal=document juridique\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Affichage rapide des pages web :\ndocument_properties_linearized_yes=Oui\ndocument_properties_linearized_no=Non\ndocument_properties_close=Fermer\n\nprint_progress_message=Préparation du document pour l’impression…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}} %\nprint_progress_close=Annuler\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Afficher/Masquer le panneau latéral\ntoggle_sidebar_notification.title=Afficher/Masquer le panneau latéral (le document contient des signets/pièces jointes)\ntoggle_sidebar_notification2.title=Afficher/Masquer le panneau latéral (le document contient des signets/pièces jointes/calques)\ntoggle_sidebar_label=Afficher/Masquer le panneau latéral\ndocument_outline.title=Afficher les signets du document (double-cliquer pour développer/réduire tous les éléments)\ndocument_outline_label=Signets du document\nattachments.title=Afficher les pièces jointes\nattachments_label=Pièces jointes\nlayers.title=Afficher les calques (double-cliquer pour réinitialiser tous les calques à l’état par défaut)\nlayers_label=Calques\nthumbs.title=Afficher les vignettes\nthumbs_label=Vignettes\ncurrent_outline_item.title=Trouver l’élément de plan actuel\ncurrent_outline_item_label=Élément de plan actuel\nfindbar.title=Rechercher dans le document\nfindbar_label=Rechercher\n\nadditional_layers=Calques additionnels\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Page {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Page {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Vignette de la page {{page}}\n\n# Find panel button title and messages\nfind_input.title=Rechercher\nfind_input.placeholder=Rechercher dans le document…\nfind_previous.title=Trouver l’occurrence précédente de l’expression\nfind_previous_label=Précédent\nfind_next.title=Trouver la prochaine occurrence de l’expression\nfind_next_label=Suivant\nfind_highlight=Tout surligner\nfind_match_case_label=Respecter la casse\nfind_entire_word_label=Mots entiers\nfind_reached_top=Haut de la page atteint, poursuite depuis la fin\nfind_reached_bottom=Bas de la page atteint, poursuite au début\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]=Occurrence {{current}} sur {{total}}\nfind_match_count[two]=Occurrence {{current}} sur {{total}}\nfind_match_count[few]=Occurrence {{current}} sur {{total}}\nfind_match_count[many]=Occurrence {{current}} sur {{total}}\nfind_match_count[other]=Occurrence {{current}} sur {{total}}\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Plus de {{limit}} correspondances\nfind_match_count_limit[one]=Plus de {{limit}} correspondance\nfind_match_count_limit[two]=Plus de {{limit}} correspondances\nfind_match_count_limit[few]=Plus de {{limit}} correspondances\nfind_match_count_limit[many]=Plus de {{limit}} correspondances\nfind_match_count_limit[other]=Plus de {{limit}} correspondances\nfind_not_found=Expression non trouvée\n\n# Error panel labels\nerror_more_info=Plus d’informations\nerror_less_info=Moins d’informations\nerror_close=Fermer\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (identifiant de compilation : {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message : {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pile : {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fichier : {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Ligne : {{line}}\nrendering_error=Une erreur s’est produite lors de l’affichage de la page.\n\n# Predefined zoom values\npage_scale_width=Pleine largeur\npage_scale_fit=Page entière\npage_scale_auto=Zoom automatique\npage_scale_actual=Taille réelle\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}} %\n\n# Loading indicator messages\nloading_error=Une erreur s’est produite lors du chargement du fichier PDF.\ninvalid_file_error=Fichier PDF invalide ou corrompu.\nmissing_file_error=Fichier PDF manquant.\nunexpected_response_error=Réponse inattendue du serveur.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}} à {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Annotation {{type}}]\npassword_label=Veuillez saisir le mot de passe pour ouvrir ce fichier PDF.\npassword_invalid=Mot de passe incorrect. Veuillez réessayer.\npassword_ok=OK\npassword_cancel=Annuler\n\nprinting_not_supported=Attention : l’impression n’est pas totalement prise en charge par ce navigateur.\nprinting_not_ready=Attention : le PDF n’est pas entièrement chargé pour pouvoir l’imprimer.\nweb_fonts_disabled=Les polices web sont désactivées : impossible d’utiliser les polices intégrées au PDF.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/fy-NL/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Foarige side\nprevious_label=Foarige\nnext.title=Folgjende side\nnext_label=Folgjende\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Side\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=fan {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} fan {{pagesCount}})\n\nzoom_out.title=Utzoome\nzoom_out_label=Utzoome\nzoom_in.title=Ynzoome\nzoom_in_label=Ynzoome\nzoom.title=Zoome\npresentation_mode.title=Wikselje nei presintaasjemodus\npresentation_mode_label=Presintaasjemodus\nopen_file.title=Bestân iepenje\nopen_file_label=Iepenje\nprint.title=Ofdrukke\nprint_label=Ofdrukke\ndownload.title=Downloade\ndownload_label=Downloade\nbookmark.title=Aktuele finster (kopiearje of iepenje yn nij finster)\nbookmark_label=Aktuele finster\n\n# Secondary toolbar and context menu\ntools.title=Ark\ntools_label=Ark\nfirst_page.title=Gean nei earste side\nfirst_page.label=Nei earste side gean\nfirst_page_label=Gean nei earste side\nlast_page.title=Gean nei lêste side\nlast_page.label=Nei lêste side gean\nlast_page_label=Gean nei lêste side\npage_rotate_cw.title=Rjochtsom draaie\npage_rotate_cw.label=Rjochtsom draaie\npage_rotate_cw_label=Rjochtsom draaie\npage_rotate_ccw.title=Loftsom draaie\npage_rotate_ccw.label=Loftsom draaie\npage_rotate_ccw_label=Loftsom draaie\n\ncursor_text_select_tool.title=Tekstseleksjehelpmiddel ynskeakelje\ncursor_text_select_tool_label=Tekstseleksjehelpmiddel\ncursor_hand_tool.title=Hânhelpmiddel ynskeakelje\ncursor_hand_tool_label=Hânhelpmiddel\n\nscroll_vertical.title=Fertikaal skowe brûke\nscroll_vertical_label=Fertikaal skowe\nscroll_horizontal.title=Horizontaal skowe brûke\nscroll_horizontal_label=Horizontaal skowe\nscroll_wrapped.title=Skowe mei oersjoch brûke\nscroll_wrapped_label=Skowe mei oersjoch\n\nspread_none.title=Sidesprieding net gearfetsje\nspread_none_label=Gjin sprieding\nspread_odd.title=Sidesprieding gearfetsje te starten mei ûneven nûmers\nspread_odd_label=Uneven sprieding\nspread_even.title=Sidesprieding gearfetsje te starten mei even nûmers\nspread_even_label=Even sprieding\n\n# Document properties dialog box\ndocument_properties.title=Dokuminteigenskippen…\ndocument_properties_label=Dokuminteigenskippen…\ndocument_properties_file_name=Bestânsnamme:\ndocument_properties_file_size=Bestânsgrutte:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titel:\ndocument_properties_author=Auteur:\ndocument_properties_subject=Underwerp:\ndocument_properties_keywords=Kaaiwurden:\ndocument_properties_creation_date=Oanmaakdatum:\ndocument_properties_modification_date=Bewurkingsdatum:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Makker:\ndocument_properties_producer=PDF-makker:\ndocument_properties_version=PDF-ferzje:\ndocument_properties_page_count=Siden:\ndocument_properties_page_size=Sideformaat:\ndocument_properties_page_size_unit_inches=yn\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=steand\ndocument_properties_page_size_orientation_landscape=lizzend\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Juridysk\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Flugge webwerjefte:\ndocument_properties_linearized_yes=Ja\ndocument_properties_linearized_no=Nee\ndocument_properties_close=Slute\n\nprint_progress_message=Dokumint tariede oar ôfdrukken…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Annulearje\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Sidebalke yn-/útskeakelje\ntoggle_sidebar_notification.title=Sidebalke yn-/útskeakelje (dokumint befettet outline/bylagen)\ntoggle_sidebar_notification2.title=Sidebalke yn-/útskeakelje (dokumint befettet oersjoch/bylagen/lagen)\ntoggle_sidebar_label=Sidebalke yn-/útskeakelje\ndocument_outline.title=Dokumintoersjoch toane (dûbelklik om alle items út/yn te klappen)\ndocument_outline_label=Dokumintoersjoch\nattachments.title=Bylagen toane\nattachments_label=Bylagen\nlayers.title=Lagen toane (dûbelklik om alle lagen nei de standertsteat werom te setten)\nlayers_label=Lagen\nthumbs.title=Foarbylden toane\nthumbs_label=Foarbylden\ncurrent_outline_item.title=Aktueel item yn ynhâldsopjefte sykje\ncurrent_outline_item_label=Aktueel item yn ynhâldsopjefte\nfindbar.title=Sykje yn dokumint\nfindbar_label=Sykje\n\nadditional_layers=Oanfoljende lagen\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Side {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Side {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Foarbyld fan side {{page}}\n\n# Find panel button title and messages\nfind_input.title=Sykje\nfind_input.placeholder=Sykje yn dokumint…\nfind_previous.title=It foarige foarkommen fan de tekst sykje\nfind_previous_label=Foarige\nfind_next.title=It folgjende foarkommen fan de tekst sykje\nfind_next_label=Folgjende\nfind_highlight=Alles markearje\nfind_match_case_label=Haadlettergefoelich\nfind_entire_word_label=Hiele wurden\nfind_reached_top=Boppekant fan dokumint berikt, trochgien fan ûnder ôf\nfind_reached_bottom=Ein fan dokumint berikt, trochgien fan boppe ôf\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} fan {{total}} oerienkomst\nfind_match_count[two]={{current}} fan {{total}} oerienkomsten\nfind_match_count[few]={{current}} fan {{total}} oerienkomsten\nfind_match_count[many]={{current}} fan {{total}} oerienkomsten\nfind_match_count[other]={{current}} fan {{total}} oerienkomsten\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Mear as {{limit}} oerienkomsten\nfind_match_count_limit[one]=Mear as {{limit}} oerienkomst\nfind_match_count_limit[two]=Mear as {{limit}} oerienkomsten\nfind_match_count_limit[few]=Mear as {{limit}} oerienkomsten\nfind_match_count_limit[many]=Mear as {{limit}} oerienkomsten\nfind_match_count_limit[other]=Mear as {{limit}} oerienkomsten\nfind_not_found=Tekst net fûn\n\n# Error panel labels\nerror_more_info=Mear ynformaasje\nerror_less_info=Minder ynformaasje\nerror_close=Slute\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js f{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Berjocht: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Bestân: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rigel: {{line}}\nrendering_error=Der is in flater bard by it renderjen fan de side.\n\n# Predefined zoom values\npage_scale_width=Sidebreedte\npage_scale_fit=Hiele side\npage_scale_auto=Automatysk zoome\npage_scale_actual=Werklike grutte\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Der is in flater bard by it laden fan de PDF.\ninvalid_file_error=Ynfalide of korruptearre PDF-bestân.\nmissing_file_error=PDF-bestân ûntbrekt.\nunexpected_response_error=Unferwacht serverantwurd.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}-annotaasje]\npassword_label=Jou it wachtwurd om dit PDF-bestân te iepenjen.\npassword_invalid=Ferkeard wachtwurd. Probearje opnij.\npassword_ok=OK\npassword_cancel=Annulearje\n\nprinting_not_supported=Warning: Printen is net folslein stipe troch dizze browser.\nprinting_not_ready=Warning: PDF is net folslein laden om ôf te drukken.\nweb_fonts_disabled=Weblettertypen binne útskeakele: gebrûk fan ynsluten PDF-lettertypen is net mooglik.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/ga-IE/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=An Leathanach Roimhe Seo\nprevious_label=Roimhe Seo\nnext.title=An Chéad Leathanach Eile\nnext_label=Ar Aghaidh\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Leathanach\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=as {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} as {{pagesCount}})\n\nzoom_out.title=Súmáil Amach\nzoom_out_label=Súmáil Amach\nzoom_in.title=Súmáil Isteach\nzoom_in_label=Súmáil Isteach\nzoom.title=Súmáil\npresentation_mode.title=Úsáid an Mód Láithreoireachta\npresentation_mode_label=Mód Láithreoireachta\nopen_file.title=Oscail Comhad\nopen_file_label=Oscail\nprint.title=Priontáil\nprint_label=Priontáil\ndownload.title=Íoslódáil\ndownload_label=Íoslódáil\nbookmark.title=An t-amharc reatha (cóipeáil nó oscail i bhfuinneog nua)\nbookmark_label=An tAmharc Reatha\n\n# Secondary toolbar and context menu\ntools.title=Uirlisí\ntools_label=Uirlisí\nfirst_page.title=Go dtí an chéad leathanach\nfirst_page.label=Go dtí an chéad leathanach\nfirst_page_label=Go dtí an chéad leathanach\nlast_page.title=Go dtí an leathanach deiridh\nlast_page.label=Go dtí an leathanach deiridh\nlast_page_label=Go dtí an leathanach deiridh\npage_rotate_cw.title=Rothlaigh ar deiseal\npage_rotate_cw.label=Rothlaigh ar deiseal\npage_rotate_cw_label=Rothlaigh ar deiseal\npage_rotate_ccw.title=Rothlaigh ar tuathal\npage_rotate_ccw.label=Rothlaigh ar tuathal\npage_rotate_ccw_label=Rothlaigh ar tuathal\n\ncursor_text_select_tool.title=Cumasaigh an Uirlis Roghnaithe Téacs\ncursor_text_select_tool_label=Uirlis Roghnaithe Téacs\ncursor_hand_tool.title=Cumasaigh an Uirlis Láimhe\ncursor_hand_tool_label=Uirlis Láimhe\n\n# Document properties dialog box\ndocument_properties.title=Airíonna na Cáipéise…\ndocument_properties_label=Airíonna na Cáipéise…\ndocument_properties_file_name=Ainm an chomhaid:\ndocument_properties_file_size=Méid an chomhaid:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kB ({{size_b}} beart)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} beart)\ndocument_properties_title=Teideal:\ndocument_properties_author=Údar:\ndocument_properties_subject=Ábhar:\ndocument_properties_keywords=Eochairfhocail:\ndocument_properties_creation_date=Dáta Cruthaithe:\ndocument_properties_modification_date=Dáta Athraithe:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Cruthaitheoir:\ndocument_properties_producer=Cruthaitheoir an PDF:\ndocument_properties_version=Leagan PDF:\ndocument_properties_page_count=Líon Leathanach:\ndocument_properties_close=Dún\n\nprint_progress_message=Cáipéis á hullmhú le priontáil…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cealaigh\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Scoránaigh an Barra Taoibh\ntoggle_sidebar_notification.title=Scoránaigh an Barra Taoibh (achoimre/iatáin sa cháipéis)\ntoggle_sidebar_label=Scoránaigh an Barra Taoibh\ndocument_outline.title=Taispeáin Imlíne na Cáipéise (déchliceáil chun chuile rud a leathnú nó a laghdú)\ndocument_outline_label=Creatlach na Cáipéise\nattachments.title=Taispeáin Iatáin\nattachments_label=Iatáin\nthumbs.title=Taispeáin Mionsamhlacha\nthumbs_label=Mionsamhlacha\nfindbar.title=Aimsigh sa Cháipéis\nfindbar_label=Aimsigh\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Leathanach {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Mionsamhail Leathanaigh {{page}}\n\n# Find panel button title and messages\nfind_input.title=Aimsigh\nfind_input.placeholder=Aimsigh sa cháipéis…\nfind_previous.title=Aimsigh an sampla roimhe seo den nath seo\nfind_previous_label=Roimhe seo\nfind_next.title=Aimsigh an chéad sampla eile den nath sin\nfind_next_label=Ar aghaidh\nfind_highlight=Aibhsigh uile\nfind_match_case_label=Cásíogair\nfind_reached_top=Ag barr na cáipéise, ag leanúint ón mbun\nfind_reached_bottom=Ag bun na cáipéise, ag leanúint ón mbarr\nfind_not_found=Frása gan aimsiú\n\n# Error panel labels\nerror_more_info=Tuilleadh Eolais\nerror_less_info=Níos Lú Eolais\nerror_close=Dún\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Teachtaireacht: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Cruach: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Comhad: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Líne: {{line}}\nrendering_error=Tharla earráid agus an leathanach á leagan amach.\n\n# Predefined zoom values\npage_scale_width=Leithead Leathanaigh\npage_scale_fit=Laghdaigh go dtí an Leathanach\npage_scale_auto=Súmáil Uathoibríoch\npage_scale_actual=Fíormhéid\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Tharla earráid agus an cháipéis PDF á lódáil.\ninvalid_file_error=Comhad neamhbhailí nó truaillithe PDF.\nmissing_file_error=Comhad PDF ar iarraidh.\nunexpected_response_error=Freagra ón bhfreastalaí nach rabhthas ag súil leis.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anótáil {{type}}]\npassword_label=Cuir an focal faire isteach chun an comhad PDF seo a oscailt.\npassword_invalid=Focal faire mícheart. Déan iarracht eile.\npassword_ok=OK\npassword_cancel=Cealaigh\n\nprinting_not_supported=Rabhadh: Ní thacaíonn an brabhsálaí le priontáil go hiomlán.\nprinting_not_ready=Rabhadh: Ní féidir an PDF a phriontáil go dtí go mbeidh an cháipéis iomlán lódáilte.\nweb_fonts_disabled=Tá clófhoirne Gréasáin díchumasaithe: ní féidir clófhoirne leabaithe PDF a úsáid.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/gd/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=An duilleag roimhe\nprevious_label=Air ais\nnext.title=An ath-dhuilleag\nnext_label=Air adhart\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Duilleag\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=à {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} à {{pagesCount}})\n\nzoom_out.title=Sùm a-mach\nzoom_out_label=Sùm a-mach\nzoom_in.title=Sùm a-steach\nzoom_in_label=Sùm a-steach\nzoom.title=Sùm\npresentation_mode.title=Gearr leum dhan mhodh taisbeanaidh\npresentation_mode_label=Am modh taisbeanaidh\nopen_file.title=Fosgail faidhle\nopen_file_label=Fosgail\nprint.title=Clò-bhuail\nprint_label=Clò-bhuail\ndownload.title=Luchdaich a-nuas\ndownload_label=Luchdaich a-nuas\nbookmark.title=An sealladh làithreach (dèan lethbhreac no fosgail e ann an uinneag ùr)\nbookmark_label=An sealladh làithreach\n\n# Secondary toolbar and context menu\ntools.title=Innealan\ntools_label=Innealan\nfirst_page.title=Rach gun chiad duilleag\nfirst_page.label=Rach gun chiad duilleag\nfirst_page_label=Rach gun chiad duilleag\nlast_page.title=Rach gun duilleag mu dheireadh\nlast_page.label=Rach gun duilleag mu dheireadh\nlast_page_label=Rach gun duilleag mu dheireadh\npage_rotate_cw.title=Cuairtich gu deiseil\npage_rotate_cw.label=Cuairtich gu deiseil\npage_rotate_cw_label=Cuairtich gu deiseil\npage_rotate_ccw.title=Cuairtich gu tuathail\npage_rotate_ccw.label=Cuairtich gu tuathail\npage_rotate_ccw_label=Cuairtich gu tuathail\n\ncursor_text_select_tool.title=Cuir an comas inneal taghadh an teacsa\ncursor_text_select_tool_label=Inneal taghadh an teacsa\ncursor_hand_tool.title=Cuir inneal na làimhe an comas\ncursor_hand_tool_label=Inneal na làimhe\n\nscroll_vertical.title=Cleachd sgroladh inghearach\nscroll_vertical_label=Sgroladh inghearach\nscroll_horizontal.title=Cleachd sgroladh còmhnard\nscroll_horizontal_label=Sgroladh còmhnard\nscroll_wrapped.title=Cleachd sgroladh paisgte\nscroll_wrapped_label=Sgroladh paisgte\n\nspread_none.title=Na cuir còmhla sgoileadh dhuilleagan\nspread_none_label=Gun sgaoileadh dhuilleagan\nspread_odd.title=Cuir còmhla duilleagan sgaoilte a thòisicheas le duilleagan aig a bheil àireamh chorr\nspread_odd_label=Sgaoileadh dhuilleagan corra\nspread_even.title=Cuir còmhla duilleagan sgaoilte a thòisicheas le duilleagan aig a bheil àireamh chothrom\nspread_even_label=Sgaoileadh dhuilleagan cothrom\n\n# Document properties dialog box\ndocument_properties.title=Roghainnean na sgrìobhainne…\ndocument_properties_label=Roghainnean na sgrìobhainne…\ndocument_properties_file_name=Ainm an fhaidhle:\ndocument_properties_file_size=Meud an fhaidhle:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Tiotal:\ndocument_properties_author=Ùghdar:\ndocument_properties_subject=Cuspair:\ndocument_properties_keywords=Faclan-luirg:\ndocument_properties_creation_date=Latha a chruthachaidh:\ndocument_properties_modification_date=Latha atharrachaidh:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Cruthadair:\ndocument_properties_producer=Saothraiche a' PDF:\ndocument_properties_version=Tionndadh a' PDF:\ndocument_properties_page_count=Àireamh de dhuilleagan:\ndocument_properties_page_size=Meud na duilleige:\ndocument_properties_page_size_unit_inches=ann an\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=portraid\ndocument_properties_page_size_orientation_landscape=dreach-tìre\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Litir\ndocument_properties_page_size_name_legal=Laghail\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Grad shealladh-lìn:\ndocument_properties_linearized_yes=Tha\ndocument_properties_linearized_no=Chan eil\ndocument_properties_close=Dùin\n\nprint_progress_message=Ag ullachadh na sgrìobhainn airson clò-bhualadh…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Sguir dheth\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toglaich am bàr-taoibh\ntoggle_sidebar_notification.title=Toglaich am bàr-taoibh (tha oir-loidhne/ceanglachain aig an sgrìobhainn)\ntoggle_sidebar_label=Toglaich am bàr-taoibh\ndocument_outline.title=Seall oir-loidhne na sgrìobhainn (dèan briogadh dùbailte airson a h-uile nì a leudachadh/a cho-theannadh)\ndocument_outline_label=Oir-loidhne na sgrìobhainne\nattachments.title=Seall na ceanglachain\nattachments_label=Ceanglachain\nthumbs.title=Seall na dealbhagan\nthumbs_label=Dealbhagan\nfindbar.title=Lorg san sgrìobhainn\nfindbar_label=Lorg\n\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Duilleag a {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Dealbhag duilleag a {{page}}\n\n# Find panel button title and messages\nfind_input.title=Lorg\nfind_input.placeholder=Lorg san sgrìobhainn...\nfind_previous.title=Lorg làthair roimhe na h-abairt seo\nfind_previous_label=Air ais\nfind_next.title=Lorg ath-làthair na h-abairt seo\nfind_next_label=Air adhart\nfind_highlight=Soillsich a h-uile\nfind_match_case_label=Aire do litrichean mòra is beaga\nfind_entire_word_label=Faclan-slàna\nfind_reached_top=Ràinig sinn barr na duilleige, a' leantainn air adhart o bhonn na duilleige\nfind_reached_bottom=Ràinig sinn bonn na duilleige, a' leantainn air adhart o bharr na duilleige\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} à {{total}} mhaids\nfind_match_count[two]={{current}} à {{total}} mhaids\nfind_match_count[few]={{current}} à {{total}} maidsichean\nfind_match_count[many]={{current}} à {{total}} maids\nfind_match_count[other]={{current}} à {{total}} maids\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Barrachd air {{limit}} maids\nfind_match_count_limit[one]=Barrachd air {{limit}} mhaids\nfind_match_count_limit[two]=Barrachd air {{limit}} mhaids\nfind_match_count_limit[few]=Barrachd air {{limit}} maidsichean\nfind_match_count_limit[many]=Barrachd air {{limit}} maids\nfind_match_count_limit[other]=Barrachd air {{limit}} maids\nfind_not_found=Cha deach an abairt a lorg\n\n# Error panel labels\nerror_more_info=Barrachd fiosrachaidh\nerror_less_info=Nas lugha de dh'fhiosrachadh\nerror_close=Dùin\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Teachdaireachd: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stac: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Faidhle: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Loidhne: {{line}}\nrendering_error=Thachair mearachd rè reandaradh na duilleige.\n\n# Predefined zoom values\npage_scale_width=Leud na duilleige\npage_scale_fit=Freagair ri meud na duilleige\npage_scale_auto=Sùm fèin-obrachail\npage_scale_actual=Am fìor-mheud\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Thachair mearachd rè luchdadh a' PDF.\ninvalid_file_error=Faidhle PDF a tha mì-dhligheach no coirbte.\nmissing_file_error=Faidhle PDF a tha a dhìth.\nunexpected_response_error=Freagairt on fhrithealaiche ris nach robh dùil.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Nòtachadh {{type}}]\npassword_label=Cuir a-steach am facal-faire gus am faidhle PDF seo fhosgladh.\npassword_invalid=Tha am facal-faire cearr. Nach fheuch thu ris a-rithist?\npassword_ok=Ceart ma-thà\npassword_cancel=Sguir dheth\n\nprinting_not_supported=Rabhadh: Chan eil am brabhsair seo a' cur làn-taic ri clò-bhualadh.\nprinting_not_ready=Rabhadh: Cha deach am PDF a luchdadh gu tur airson clò-bhualadh.\nweb_fonts_disabled=Tha cruthan-clò lìn à comas: Chan urrainn dhuinn cruthan-clò PDF leabaichte a chleachdadh.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/gl/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Páxina anterior\nprevious_label=Anterior\nnext.title=Seguinte páxina\nnext_label=Seguinte\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Páxina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Reducir\nzoom_out_label=Reducir\nzoom_in.title=Ampliar\nzoom_in_label=Ampliar\nzoom.title=Zoom\npresentation_mode.title=Cambiar ao modo presentación\npresentation_mode_label=Modo presentación\nopen_file.title=Abrir ficheiro\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar ou abrir nunha nova xanela)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Ferramentas\ntools_label=Ferramentas\nfirst_page.title=Ir á primeira páxina\nfirst_page.label=Ir á primeira páxina\nfirst_page_label=Ir á primeira páxina\nlast_page.title=Ir á última páxina\nlast_page.label=Ir á última páxina\nlast_page_label=Ir á última páxina\npage_rotate_cw.title=Rotar no sentido das agullas do reloxo\npage_rotate_cw.label=Rotar no sentido das agullas do reloxo\npage_rotate_cw_label=Rotar no sentido das agullas do reloxo\npage_rotate_ccw.title=Rotar no sentido contrario ás agullas do reloxo\npage_rotate_ccw.label=Rotar no sentido contrario ás agullas do reloxo\npage_rotate_ccw_label=Rotar no sentido contrario ás agullas do reloxo\n\ncursor_text_select_tool.title=Activar a ferramenta de selección de texto\ncursor_text_select_tool_label=Ferramenta de selección de texto\ncursor_hand_tool.title=Activar a ferramenta man\ncursor_hand_tool_label=Ferramenta man\n\nscroll_vertical.title=Usar o desprazamento vertical\nscroll_vertical_label=Desprazamento vertical\nscroll_horizontal.title=Usar o desprazamento horizontal\nscroll_horizontal_label=Desprazamento horizontal\nscroll_wrapped.title=Usar desprazamento en bloque\nscroll_wrapped_label=Desprazamento en bloque\n\nspread_none.title=Non agrupar páxinas\nspread_none_label=Ningún agrupamento\nspread_odd.title=Crea grupo de páxinas que comezan con números de páxina impares\nspread_odd_label=Agrupamento impar\nspread_even.title=Crea grupo de páxinas que comezan con números de páxina pares\nspread_even_label=Agrupamento par\n\n# Document properties dialog box\ndocument_properties.title=Propiedades do documento…\ndocument_properties_label=Propiedades do documento…\ndocument_properties_file_name=Nome do ficheiro:\ndocument_properties_file_size=Tamaño do ficheiro:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Asunto:\ndocument_properties_keywords=Palabras clave:\ndocument_properties_creation_date=Data de creación:\ndocument_properties_modification_date=Data de modificación:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creado por:\ndocument_properties_producer=Xenerador do PDF:\ndocument_properties_version=Versión de PDF:\ndocument_properties_page_count=Número de páxinas:\ndocument_properties_page_size=Tamaño da páxina:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=Vertical\ndocument_properties_page_size_orientation_landscape=Horizontal\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Carta\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Visualización rápida das páxinas web:\ndocument_properties_linearized_yes=Si\ndocument_properties_linearized_no=Non\ndocument_properties_close=Pechar\n\nprint_progress_message=Preparando documento para imprimir…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancelar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Amosar/agochar a barra lateral\ntoggle_sidebar_notification.title=Amosar/agochar a barra lateral (o documento contén un esquema ou anexos)\ntoggle_sidebar_notification2.title=Alternar barra lateral (o documento contén esquema/anexos/capas)\ntoggle_sidebar_label=Amosar/agochar a barra lateral\ndocument_outline.title=Amosar o esquema do documento (prema dúas veces para expandir/contraer todos os elementos)\ndocument_outline_label=Esquema do documento\nattachments.title=Amosar anexos\nattachments_label=Anexos\nlayers.title=Mostrar capas (prema dúas veces para restaurar todas as capas o estado predeterminado)\nlayers_label=Capas\nthumbs.title=Amosar miniaturas\nthumbs_label=Miniaturas\ncurrent_outline_item.title=Atopar o elemento delimitado actualmente\ncurrent_outline_item_label=Elemento delimitado actualmente\nfindbar.title=Atopar no documento\nfindbar_label=Atopar\n\nadditional_layers=Capas adicionais\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Páxina {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Páxina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura da páxina {{page}}\n\n# Find panel button title and messages\nfind_input.title=Atopar\nfind_input.placeholder=Atopar no documento…\nfind_previous.title=Atopar a anterior aparición da frase\nfind_previous_label=Anterior\nfind_next.title=Atopar a seguinte aparición da frase\nfind_next_label=Seguinte\nfind_highlight=Realzar todo\nfind_match_case_label=Diferenciar maiúsculas de minúsculas\nfind_entire_word_label=Palabras completas\nfind_reached_top=Chegouse ao inicio do documento, continuar desde o final\nfind_reached_bottom=Chegouse ao final do documento, continuar desde o inicio\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} de {{total}} coincidencia\nfind_match_count[two]={{current}} de {{total}} coincidencias\nfind_match_count[few]={{current}} de {{total}} coincidencias\nfind_match_count[many]={{current}} de {{total}} coincidencias\nfind_match_count[other]={{current}} de {{total}} coincidencias\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Máis de {{limit}} coincidencias\nfind_match_count_limit[one]=Máis de {{limit}} coincidencia\nfind_match_count_limit[two]=Máis de {{limit}} coincidencias\nfind_match_count_limit[few]=Máis de {{limit}} coincidencias\nfind_match_count_limit[many]=Máis de {{limit}} coincidencias\nfind_match_count_limit[other]=Máis de {{limit}} coincidencias\nfind_not_found=Non se atopou a frase\n\n# Error panel labels\nerror_more_info=Máis información\nerror_less_info=Menos información\nerror_close=Pechar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (Identificador da compilación: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensaxe: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ficheiro: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Liña: {{line}}\nrendering_error=Produciuse un erro ao representar a páxina.\n\n# Predefined zoom values\npage_scale_width=Largura da páxina\npage_scale_fit=Axuste de páxina\npage_scale_auto=Zoom automático\npage_scale_actual=Tamaño actual\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Produciuse un erro ao cargar o PDF.\ninvalid_file_error=Ficheiro PDF danado ou non válido.\nmissing_file_error=Falta o ficheiro PDF.\nunexpected_response_error=Resposta inesperada do servidor.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotación {{type}}]\npassword_label=Escriba o contrasinal para abrir este ficheiro PDF.\npassword_invalid=Contrasinal incorrecto. Tente de novo.\npassword_ok=Aceptar\npassword_cancel=Cancelar\n\nprinting_not_supported=Aviso: A impresión non é compatíbel de todo con este navegador.\nprinting_not_ready=Aviso: O PDF non se cargou completamente para imprimirse.\nweb_fonts_disabled=Desactiváronse as fontes web:  foi imposíbel usar as fontes incrustadas no PDF.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/gn/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Kuatiarogue mboyvegua\nprevious_label=Mboyvegua\nnext.title=Kuatiarogue upeigua\nnext_label=Upeigua\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Kuatiarogue\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} gui\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} of {{pagesCount}})\n\nzoom_out.title=Momichĩ\nzoom_out_label=Momichĩ\nzoom_in.title=Mbotuicha\nzoom_in_label=Mbotuicha\nzoom.title=Tuichakue\npresentation_mode.title=Jehechauka reko moambue\npresentation_mode_label=Jehechauka reko\nopen_file.title=Marandurendápe jeike\nopen_file_label=Jeike\nprint.title=Monguatia\nprint_label=Monguatia\ndownload.title=Mboguejy\ndownload_label=Mboguejy\nbookmark.title=Ag̃agua jehecha (mbohasarã térã eike peteĩ ovetã pyahúpe)\nbookmark_label=Ag̃agua jehecha\n\n# Secondary toolbar and context menu\ntools.title=Tembipuru\ntools_label=Tembipuru\nfirst_page.title=Kuatiarogue ñepyrũme jeho\nfirst_page.label=Kuatiarogue ñepyrũme jeho\nfirst_page_label=Kuatiarogue ñepyrũme jeho\nlast_page.title=Kuatiarogue pahápe jeho\nlast_page.label=Kuatiarogue pahápe jeho\nlast_page_label=Kuatiarogue pahápe jeho\npage_rotate_cw.title=Aravóicha mbojere\npage_rotate_cw.label=Aravóicha mbojere\npage_rotate_cw_label=Aravóicha mbojere\npage_rotate_ccw.title=Aravo rapykue gotyo mbojere\npage_rotate_ccw.label=Aravo rapykue gotyo mbojere\npage_rotate_ccw_label=Aravo rapykue gotyo mbojere\n\ncursor_text_select_tool.title=Emyandy moñe’ẽrã jeporavo rembipuru\ncursor_text_select_tool_label=Moñe’ẽrã jeporavo rembipuru\ncursor_hand_tool.title=Tembipuru po pegua myandy\ncursor_hand_tool_label=Tembipuru po pegua\n\nscroll_vertical.title=Eipuru jeku’e ykeguáva\nscroll_vertical_label=Jeku’e ykeguáva\nscroll_horizontal.title=Eipuru jeku’e yvate gotyo\nscroll_horizontal_label=Jeku’e yvate gotyo\nscroll_wrapped.title=Eipuru jeku’e mbohyrupyre\nscroll_wrapped_label=Jeku’e mbohyrupyre\n\nspread_none.title=Ani ejuaju spreads kuatiarogue ndive\nspread_none_label=Spreads ỹre\nspread_odd.title=Embojuaju kuatiarogue jepysokue eñepyrũvo kuatiarogue impar-vagui\nspread_odd_label=Spreads impar\nspread_even.title=Embojuaju kuatiarogue jepysokue eñepyrũvo kuatiarogue par-vagui\nspread_even_label=Ipukuve uvei\n\n# Document properties dialog box\ndocument_properties.title=Kuatia mba’etee…\ndocument_properties_label=Kuatia mba’etee…\ndocument_properties_file_name=Marandurenda réra:\ndocument_properties_file_size=Marandurenda tuichakue:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Teratee:\ndocument_properties_author=Apohára:\ndocument_properties_subject=Mba’egua:\ndocument_properties_keywords=Jehero:\ndocument_properties_creation_date=Teñoihague arange:\ndocument_properties_modification_date=Iñambue hague arange:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Apo’ypyha:\ndocument_properties_producer=PDF mbosako’iha:\ndocument_properties_version=PDF mbojuehegua:\ndocument_properties_page_count=Kuatiarogue papapy:\ndocument_properties_page_size=Kuatiarogue tuichakue:\ndocument_properties_page_size_unit_inches=Amo\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=Oĩháicha\ndocument_properties_page_size_orientation_landscape=apaisado\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Kuatiañe’ẽ\ndocument_properties_page_size_name_legal=Tee\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Ñanduti jahecha pya’e:\ndocument_properties_linearized_yes=Añete\ndocument_properties_linearized_no=Ahániri\ndocument_properties_close=Mboty\n\nprint_progress_message=Embosako’i kuatia emonguatia hag̃ua…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Heja\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Tenda yke moambue\ntoggle_sidebar_notification.title=Embojopyru tenda ykegua (kuatia oguereko kora/marandurenda moirũha)\ntoggle_sidebar_notification2.title=Embojopyru tenda ykegua (kuatia oguereko kuaakaha/moirũha/ñuãha)\ntoggle_sidebar_label=Tenda yke moambue\ndocument_outline.title=Ehechauka kuatia rape (eikutu mokõi jey embotuicha/emomichĩ hag̃ua opavavete mba’epuru)\ndocument_outline_label=Kuatia apopyre\nattachments.title=Moirũha jehechauka\nattachments_label=Moirũha\nlayers.title=Ehechauka ñuãha (eikutu jo’a emomba’apo hag̃ua opaite ñuãha tekoypýpe)\nlayers_label=Ñuãha\nthumbs.title=Mba’emirĩ jehechauka\nthumbs_label=Mba’emirĩ\ncurrent_outline_item.title=Eheka mba’epuru ag̃aguaitéva\ncurrent_outline_item_label=Mba’epuru ag̃aguaitéva\nfindbar.title=Kuatiápe jeheka\nfindbar_label=Juhu\n\nadditional_layers=Ñuãha moirũguáva\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Kuatiarogue {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Kuatiarogue {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Kuatiarogue mba’emirĩ {{page}}\n\n# Find panel button title and messages\nfind_input.title=Juhu\nfind_input.placeholder=Kuatiápe jejuhu…\nfind_previous.title=Ejuhu ñe’ẽrysýi osẽ’ypy hague\nfind_previous_label=Mboyvegua\nfind_next.title=Eho ñe’ẽ juhupyre upeiguávape\nfind_next_label=Upeigua\nfind_highlight=Embojekuaavepa\nfind_match_case_label=Ejesareko taiguasu/taimichĩre\nfind_entire_word_label=Ñe’ẽ oĩmbáva \nfind_reached_top=Ojehupyty kuatia ñepyrũ, oku’ejeýta kuatia paha guive\nfind_reached_bottom=Ojehupyty kuatia paha, oku’ejeýta kuatia ñepyrũ guive\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} {{total}} ojojoguáva\nfind_match_count[two]={{current}} {{total}} ojojoguáva\nfind_match_count[few]={{current}} {{total}} ojojoguáva\nfind_match_count[many]={{current}} {{total}} ojojoguáva\nfind_match_count[other]={{current}} {{total}} ojojoguáva\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Hetave {{limit}} ojojoguáva\nfind_match_count_limit[one]=Hetave {{limit}} ojojogua\nfind_match_count_limit[two]=Hetave {{limit}} ojojoguáva\nfind_match_count_limit[few]=Hetave {{limit}} ojojoguáva\nfind_match_count_limit[many]=Hetave {{limit}} ojojoguáva\nfind_match_count_limit[other]=Hetave {{limit}} ojojoguáva\nfind_not_found=Ñe’ẽrysýi ojejuhu’ỹva\n\n# Error panel labels\nerror_more_info=Maranduve\nerror_less_info=Sa’ive marandu\nerror_close=Mboty\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Ñe’ẽmondo: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Mbojo’apy: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Marandurenda: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Tairenda: {{line}}\nrendering_error=Oiko jejavy ehechaukasévo kuatiarogue.\n\n# Predefined zoom values\npage_scale_width=Kuatiarogue pekue\npage_scale_fit=Kuatiarogue ñemoĩporã\npage_scale_auto=Tuichakue ijeheguíva\npage_scale_actual=Tuichakue ag̃agua\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Oiko jejavy PDF oñemyeñyhẽnguévo.\ninvalid_file_error=PDF marandurenda ndoikóiva térã ivaipyréva.\nmissing_file_error=Ndaipóri PDF marandurenda\nunexpected_response_error=Mohendahavusu mbohovái ñeha’arõ’ỹva.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Jehaipy {{type}}]\npassword_label=Emoinge ñe’ẽñemi eipe’a hag̃ua ko marandurenda PDF.\npassword_invalid=Ñe’ẽñemi ndoikóiva. Eha’ã jey.\npassword_ok=MONEĨ\npassword_cancel=Heja\n\nprinting_not_supported=Kyhyjerã: Ñembokuatia ndojokupytypái ko kundahára ndive.\nprinting_not_ready=Kyhyjerã: Ko PDF nahenyhẽmbái oñembokuatia hag̃uáicha.\nweb_fonts_disabled=Ñanduti taity oñemongéma: ndaikatumo’ãi eipuru PDF jehai’íva taity.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/gu-IN/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=પહેલાનુ પાનું\nprevious_label=પહેલાનુ\nnext.title=આગળનુ પાનું\nnext_label=આગળનું\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=પાનું\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=નો {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} નો {{pagesCount}})\n\nzoom_out.title=મોટુ કરો\nzoom_out_label=મોટુ કરો\nzoom_in.title=નાનું કરો\nzoom_in_label=નાનું કરો\nzoom.title=નાનું મોટુ કરો\npresentation_mode.title=રજૂઆત સ્થિતિમાં જાવ\npresentation_mode_label=રજૂઆત સ્થિતિ\nopen_file.title=ફાઇલ ખોલો\nopen_file_label=ખોલો\nprint.title=છાપો\nprint_label=છારો\ndownload.title=ડાઉનલોડ\ndownload_label=ડાઉનલોડ\nbookmark.title=વર્તમાન દૃશ્ય (નવી વિન્ડોમાં નકલ કરો અથવા ખોલો)\nbookmark_label=વર્તમાન દૃશ્ય\n\n# Secondary toolbar and context menu\ntools.title=સાધનો\ntools_label=સાધનો\nfirst_page.title=પહેલાં પાનામાં જાવ\nfirst_page.label=પહેલાં પાનામાં જાવ\nfirst_page_label=પ્રથમ પાનાં પર જાવ\nlast_page.title=છેલ્લા પાનાં પર જાવ\nlast_page.label=છેલ્લા પાનામાં જાવ\nlast_page_label=છેલ્લા પાનાં પર જાવ\npage_rotate_cw.title=ઘડિયાળનાં કાંટા તરફ ફેરવો\npage_rotate_cw.label=ઘડિયાળનાં કાંટાની જેમ ફેરવો\npage_rotate_cw_label=ઘડિયાળનાં કાંટા તરફ ફેરવો\npage_rotate_ccw.title=ઘડિયાળનાં કાંટાની ઉલટી દિશામાં ફેરવો\npage_rotate_ccw.label=ઘડિયાળનાં કાંટાની ઉલટી દિશામાં ફેરવો\npage_rotate_ccw_label=ઘડિયાળનાં કાંટાની વિરુદ્દ ફેરવો\n\ncursor_text_select_tool.title=ટેક્સ્ટ પસંદગી ટૂલ સક્ષમ કરો\ncursor_text_select_tool_label=ટેક્સ્ટ પસંદગી ટૂલ\ncursor_hand_tool.title=હાથનાં સાધનને સક્રિય કરો\ncursor_hand_tool_label=હેન્ડ ટૂલ\n\nscroll_vertical.title=ઊભી સ્ક્રોલિંગનો ઉપયોગ કરો\nscroll_vertical_label=ઊભી સ્ક્રોલિંગ\nscroll_horizontal.title=આડી સ્ક્રોલિંગનો ઉપયોગ કરો\nscroll_horizontal_label=આડી સ્ક્રોલિંગ\nscroll_wrapped.title=આવરિત સ્ક્રોલિંગનો ઉપયોગ કરો\nscroll_wrapped_label=આવરિત સ્ક્રોલિંગ\n\nspread_none.title=પૃષ્ઠ સ્પ્રેડમાં જોડાવશો નહીં\nspread_none_label=કોઈ સ્પ્રેડ નથી\nspread_odd.title=એકી-ક્રમાંકિત પૃષ્ઠો સાથે પ્રારંભ થતાં પૃષ્ઠ સ્પ્રેડમાં જોડાઓ\nspread_odd_label=એકી સ્પ્રેડ્સ\nspread_even.title=નંબર-ક્રમાંકિત પૃષ્ઠોથી શરૂ થતાં પૃષ્ઠ સ્પ્રેડમાં જોડાઓ\nspread_even_label=સરખું ફેલાવવું\n\n# Document properties dialog box\ndocument_properties.title=દસ્તાવેજ ગુણધર્મો…\ndocument_properties_label=દસ્તાવેજ ગુણધર્મો…\ndocument_properties_file_name=ફાઇલ નામ:\ndocument_properties_file_size=ફાઇલ માપ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} બાઇટ)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} બાઇટ)\ndocument_properties_title=શીર્ષક:\ndocument_properties_author=લેખક:\ndocument_properties_subject=વિષય:\ndocument_properties_keywords=કિવર્ડ:\ndocument_properties_creation_date=નિર્માણ તારીખ:\ndocument_properties_modification_date=ફેરફાર તારીખ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=નિર્માતા:\ndocument_properties_producer=PDF નિર્માતા:\ndocument_properties_version=PDF આવૃત્તિ:\ndocument_properties_page_count=પાનાં ગણતરી:\ndocument_properties_page_size=પૃષ્ઠનું કદ:\ndocument_properties_page_size_unit_inches=ઇંચ\ndocument_properties_page_size_unit_millimeters=મીમી\ndocument_properties_page_size_orientation_portrait=ઉભું\ndocument_properties_page_size_orientation_landscape=આડુ\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=પત્ર\ndocument_properties_page_size_name_legal=કાયદાકીય\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=ઝડપી વૅબ દૃશ્ય:\ndocument_properties_linearized_yes=હા\ndocument_properties_linearized_no=ના\ndocument_properties_close=બંધ કરો\n\nprint_progress_message=છાપકામ માટે દસ્તાવેજ તૈયાર કરી રહ્યા છે…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=રદ કરો\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=ટૉગલ બાજુપટ્ટી\ntoggle_sidebar_notification.title=સાઇડબારને ટૉગલ કરો(દસ્તાવેજની રૂપરેખા/જોડાણો શામેલ છે)\ntoggle_sidebar_label=ટૉગલ બાજુપટ્ટી\ndocument_outline.title=દસ્તાવેજની રૂપરેખા બતાવો(બધી આઇટમ્સને વિસ્તૃત/સંકુચિત કરવા માટે ડબલ-ક્લિક કરો)\ndocument_outline_label=દસ્તાવેજ રૂપરેખા\nattachments.title=જોડાણોને બતાવો\nattachments_label=જોડાણો\nthumbs.title=થંબનેલ્સ બતાવો\nthumbs_label=થંબનેલ્સ\nfindbar.title=દસ્તાવેજમાં શોધો\nfindbar_label=શોધો\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=પાનું {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=પાનાં {{page}} નું થંબનેલ્સ\n\n# Find panel button title and messages\nfind_input.title=શોધો\nfind_input.placeholder=દસ્તાવેજમાં શોધો…\nfind_previous.title=શબ્દસમૂહની પાછલી ઘટનાને શોધો\nfind_previous_label=પહેલાંનુ\nfind_next.title=શબ્દસમૂહની આગળની ઘટનાને શોધો\nfind_next_label=આગળનું\nfind_highlight=બધુ પ્રકાશિત કરો\nfind_match_case_label=કેસ બંધબેસાડો\nfind_entire_word_label=સંપૂર્ણ શબ્દો\nfind_reached_top=દસ્તાવેજનાં ટોચે પહોંચી ગયા, તળિયેથી ચાલુ કરેલ હતુ\nfind_reached_bottom=દસ્તાવેજનાં અંતે પહોંચી ગયા, ઉપરથી ચાલુ કરેલ હતુ\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{total}} માંથી {{current}} સરખું મળ્યું\nfind_match_count[two]={{total}} માંથી {{current}} સરખા મળ્યાં\nfind_match_count[few]={{total}} માંથી {{current}} સરખા મળ્યાં\nfind_match_count[many]={{total}} માંથી {{current}} સરખા મળ્યાં\nfind_match_count[other]={{total}} માંથી {{current}} સરખા મળ્યાં\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]={{limit}} કરતાં વધુ સરખા મળ્યાં\nfind_match_count_limit[one]={{limit}} કરતાં વધુ સરખું મળ્યું\nfind_match_count_limit[two]={{limit}} કરતાં વધુ સરખા મળ્યાં\nfind_match_count_limit[few]={{limit}} કરતાં વધુ સરખા મળ્યાં\nfind_match_count_limit[many]={{limit}} કરતાં વધુ સરખા મળ્યાં\nfind_match_count_limit[other]={{limit}} કરતાં વધુ સરખા મળ્યાં\nfind_not_found=શબ્દસમૂહ મળ્યુ નથી\n\n# Error panel labels\nerror_more_info=વધારે જાણકારી\nerror_less_info=ઓછી જાણકારી\nerror_close=બંધ કરો\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=સંદેશો: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=સ્ટેક: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ફાઇલ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=વાક્ય: {{line}}\nrendering_error=ભૂલ ઉદ્ભવી જ્યારે પાનાંનુ રેન્ડ કરી રહ્યા હોય.\n\n# Predefined zoom values\npage_scale_width=પાનાની પહોળાઇ\npage_scale_fit=પાનું બંધબેસતુ\npage_scale_auto=આપમેળે નાનુંમોટુ કરો\npage_scale_actual=ચોક્કસ માપ\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=ભૂલ ઉદ્ભવી જ્યારે PDF ને લાવી રહ્યા હોય.\ninvalid_file_error=અયોગ્ય અથવા ભાંગેલ PDF ફાઇલ.\nmissing_file_error=ગુમ થયેલ PDF ફાઇલ.\nunexpected_response_error=અનપેક્ષિત સર્વર પ્રતિસાદ.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=આ PDF ફાઇલને ખોલવા પાસવર્ડને દાખલ કરો.\npassword_invalid=અયોગ્ય પાસવર્ડ. મહેરબાની કરીને ફરી પ્રયત્ન કરો.\npassword_ok=બરાબર\npassword_cancel=રદ કરો\n\nprinting_not_supported=ચેતવણી: છાપવાનું આ બ્રાઉઝર દ્દારા સંપૂર્ણપણે આધારભૂત નથી.\nprinting_not_ready=Warning: PDF એ છાપવા માટે સંપૂર્ણપણે લાવેલ છે.\nweb_fonts_disabled=વેબ ફોન્ટ નિષ્ક્રિય થયેલ છે: ઍમ્બેડ થયેલ PDF ફોન્ટને વાપરવાનું અસમર્થ.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/he/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=דף קודם\nprevious_label=קודם\nnext.title=דף הבא\nnext_label=הבא\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=דף\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=מתוך {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} מתוך {{pagesCount}})\n\nzoom_out.title=התרחקות\nzoom_out_label=התרחקות\nzoom_in.title=התקרבות\nzoom_in_label=התקרבות\nzoom.title=מרחק מתצוגה\npresentation_mode.title=מעבר למצב מצגת\npresentation_mode_label=מצב מצגת\nopen_file.title=פתיחת קובץ\nopen_file_label=פתיחה\nprint.title=הדפסה\nprint_label=הדפסה\ndownload.title=הורדה\ndownload_label=הורדה\nbookmark.title=תצוגה נוכחית (העתקה או פתיחה בחלון חדש)\nbookmark_label=תצוגה נוכחית\n\n# Secondary toolbar and context menu\ntools.title=כלים\ntools_label=כלים\nfirst_page.title=מעבר לעמוד הראשון\nfirst_page.label=מעבר לעמוד הראשון\nfirst_page_label=מעבר לעמוד הראשון\nlast_page.title=מעבר לעמוד האחרון\nlast_page.label=מעבר לעמוד האחרון\nlast_page_label=מעבר לעמוד האחרון\npage_rotate_cw.title=הטיה עם כיוון השעון\npage_rotate_cw.label=הטיה עם כיוון השעון\npage_rotate_cw_label=הטיה עם כיוון השעון\npage_rotate_ccw.title=הטיה כנגד כיוון השעון\npage_rotate_ccw.label=הטיה כנגד כיוון השעון\npage_rotate_ccw_label=הטיה כנגד כיוון השעון\n\ncursor_text_select_tool.title=הפעלת כלי בחירת טקסט\ncursor_text_select_tool_label=כלי בחירת טקסט\ncursor_hand_tool.title=הפעלת כלי היד\ncursor_hand_tool_label=כלי יד\n\nscroll_vertical.title=שימוש בגלילה אנכית\nscroll_vertical_label=גלילה אנכית\nscroll_horizontal.title=שימוש בגלילה אופקית\nscroll_horizontal_label=גלילה אופקית\nscroll_wrapped.title=שימוש בגלילה רציפה\nscroll_wrapped_label=גלילה רציפה\n\nspread_none.title=לא לצרף מפתחי עמודים\nspread_none_label=ללא מפתחים\nspread_odd.title=צירוף מפתחי עמודים שמתחילים בדפים עם מספרים אי־זוגיים\nspread_odd_label=מפתחים אי־זוגיים\nspread_even.title=צירוף מפתחי עמודים שמתחילים בדפים עם מספרים זוגיים\nspread_even_label=מפתחים זוגיים\n\n# Document properties dialog box\ndocument_properties.title=מאפייני מסמך…\ndocument_properties_label=מאפייני מסמך…\ndocument_properties_file_name=שם קובץ:\ndocument_properties_file_size=גודל הקובץ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} ק״ב ({{size_b}} בתים)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} מ״ב ({{size_b}} בתים)\ndocument_properties_title=כותרת:\ndocument_properties_author=מחבר:\ndocument_properties_subject=נושא:\ndocument_properties_keywords=מילות מפתח:\ndocument_properties_creation_date=תאריך יצירה:\ndocument_properties_modification_date=תאריך שינוי:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=יוצר:\ndocument_properties_producer=יצרן PDF:\ndocument_properties_version=גרסת PDF:\ndocument_properties_page_count=מספר דפים:\ndocument_properties_page_size=גודל העמוד:\ndocument_properties_page_size_unit_inches=אינ׳\ndocument_properties_page_size_unit_millimeters=מ״מ\ndocument_properties_page_size_orientation_portrait=לאורך\ndocument_properties_page_size_orientation_landscape=לרוחב\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=מכתב\ndocument_properties_page_size_name_legal=דף משפטי\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=תצוגת דף מהירה:\ndocument_properties_linearized_yes=כן\ndocument_properties_linearized_no=לא\ndocument_properties_close=סגירה\n\nprint_progress_message=מסמך בהכנה להדפסה…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=ביטול\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=הצגה/הסתרה של סרגל הצד\ntoggle_sidebar_notification.title=החלפת תצוגת סרגל צד (מסמך שמכיל תוכן עניינים/קבצים מצורפים)\ntoggle_sidebar_notification2.title=החלפת תצוגת סרגל צד (מסמך שמכיל תוכן עניינים/קבצים מצורפים/שכבות)\ntoggle_sidebar_label=הצגה/הסתרה של סרגל הצד\ndocument_outline.title=הצגת תוכן העניינים של המסמך (לחיצה כפולה כדי להרחיב או לצמצם את כל הפריטים)\ndocument_outline_label=תוכן העניינים של המסמך\nattachments.title=הצגת צרופות\nattachments_label=צרופות\nlayers.title=הצגת שכבות (יש ללחוץ לחיצה כפולה כדי לאפס את כל השכבות למצב ברירת המחדל)\nlayers_label=שכבות\nthumbs.title=הצגת תצוגה מקדימה\nthumbs_label=תצוגה מקדימה\ncurrent_outline_item.title=מציאת פריט תוכן העניינים הנוכחי\ncurrent_outline_item_label=פריט תוכן העניינים הנוכחי\nfindbar.title=חיפוש במסמך\nfindbar_label=חיפוש\n\nadditional_layers=שכבות נוספות\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=עמוד {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=עמוד {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=תצוגה מקדימה של עמוד {{page}}\n\n# Find panel button title and messages\nfind_input.title=חיפוש\nfind_input.placeholder=חיפוש במסמך…\nfind_previous.title=מציאת המופע הקודם של הביטוי\nfind_previous_label=קודם\nfind_next.title=מציאת המופע הבא של הביטוי\nfind_next_label=הבא\nfind_highlight=הדגשת הכול\nfind_match_case_label=התאמת אותיות\nfind_entire_word_label=מילים שלמות\nfind_reached_top=הגיע לראש הדף, ממשיך מלמטה\nfind_reached_bottom=הגיע לסוף הדף, ממשיך מלמעלה\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]=תוצאה {{current}} מתוך {{total}}\nfind_match_count[two]={{current}} מתוך {{total}} תוצאות\nfind_match_count[few]={{current}} מתוך {{total}} תוצאות\nfind_match_count[many]={{current}} מתוך {{total}} תוצאות\nfind_match_count[other]={{current}} מתוך {{total}} תוצאות\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=יותר מ־{{limit}} תוצאות\nfind_match_count_limit[one]=יותר מתוצאה אחת\nfind_match_count_limit[two]=יותר מ־{{limit}} תוצאות\nfind_match_count_limit[few]=יותר מ־{{limit}} תוצאות\nfind_match_count_limit[many]=יותר מ־{{limit}} תוצאות\nfind_match_count_limit[other]=יותר מ־{{limit}} תוצאות\nfind_not_found=הביטוי לא נמצא\n\n# Error panel labels\nerror_more_info=מידע נוסף\nerror_less_info=פחות מידע\nerror_close=סגירה\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js גרסה {{version}} (בנייה: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=הודעה: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=תוכן מחסנית: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=קובץ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=שורה: {{line}}\nrendering_error=אירעה שגיאה בעת עיבוד הדף.\n\n# Predefined zoom values\npage_scale_width=רוחב העמוד\npage_scale_fit=התאמה לעמוד\npage_scale_auto=מרחק מתצוגה אוטומטי\npage_scale_actual=גודל אמיתי\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=אירעה שגיאה בעת טעינת ה־PDF.\ninvalid_file_error=קובץ PDF פגום או לא תקין.\nmissing_file_error=קובץ PDF חסר.\nunexpected_response_error=תגובת שרת לא צפויה.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[הערת {{type}}]\npassword_label=נא להכניס את הססמה לפתיחת קובץ PDF זה.\npassword_invalid=ססמה שגויה. נא לנסות שנית.\npassword_ok=אישור\npassword_cancel=ביטול\n\nprinting_not_supported=אזהרה: הדפסה אינה נתמכת במלואה בדפדפן זה.\nprinting_not_ready=אזהרה: מסמך ה־PDF לא נטען לחלוטין עד מצב שמאפשר הדפסה.\nweb_fonts_disabled=גופני רשת מנוטרלים: לא ניתן להשתמש בגופני PDF מוטבעים.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/hi-IN/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=पिछला पृष्ठ\nprevious_label=पिछला\nnext.title=अगला पृष्ठ\nnext_label=आगे\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=पृष्ठ:\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} का\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} of {{pagesCount}})\n\nzoom_out.title=\\u0020छोटा करें\nzoom_out_label=\\u0020छोटा करें\nzoom_in.title=बड़ा करें\nzoom_in_label=बड़ा करें\nzoom.title=बड़ा-छोटा करें\npresentation_mode.title=प्रस्तुति अवस्था में जाएँ\npresentation_mode_label=\\u0020प्रस्तुति अवस्था\nopen_file.title=फ़ाइल खोलें\nopen_file_label=\\u0020खोलें\nprint.title=छापें\nprint_label=\\u0020छापें\ndownload.title=डाउनलोड\ndownload_label=डाउनलोड\nbookmark.title=मौजूदा दृश्य (नए विंडो में नक़ल लें या खोलें)\nbookmark_label=\\u0020मौजूदा दृश्य\n\n# Secondary toolbar and context menu\ntools.title=औज़ार\ntools_label=औज़ार\nfirst_page.title=प्रथम पृष्ठ पर जाएँ\nfirst_page.label=\\u0020प्रथम पृष्ठ पर जाएँ\nfirst_page_label=प्रथम पृष्ठ पर जाएँ\nlast_page.title=अंतिम पृष्ठ पर जाएँ\nlast_page.label=\\u0020अंतिम पृष्ठ पर जाएँ\nlast_page_label=\\u0020अंतिम पृष्ठ पर जाएँ\npage_rotate_cw.title=घड़ी की दिशा में घुमाएँ\npage_rotate_cw.label=घड़ी की दिशा में घुमाएँ\npage_rotate_cw_label=घड़ी की दिशा में घुमाएँ\npage_rotate_ccw.title=घड़ी की दिशा से उल्टा घुमाएँ\npage_rotate_ccw.label=घड़ी की दिशा से उल्टा घुमाएँ\npage_rotate_ccw_label=\\u0020घड़ी की दिशा से उल्टा घुमाएँ\n\ncursor_text_select_tool.title=पाठ चयन उपकरण सक्षम करें\ncursor_text_select_tool_label=पाठ चयन उपकरण\ncursor_hand_tool.title=हस्त उपकरण सक्षम करें\ncursor_hand_tool_label=हस्त उपकरण\n\nscroll_vertical.title=लंबवत स्क्रॉलिंग का उपयोग करें\nscroll_vertical_label=लंबवत स्क्रॉलिंग\nscroll_horizontal.title=क्षितिजिय स्क्रॉलिंग का उपयोग करें\nscroll_horizontal_label=क्षितिजिय स्क्रॉलिंग\nscroll_wrapped.title=व्राप्पेड स्क्रॉलिंग का उपयोग करें\n\nspread_none_label=कोई स्प्रेड उपलब्ध नहीं\nspread_odd.title=विषम-क्रमांकित पृष्ठों से प्रारंभ होने वाले पृष्ठ स्प्रेड में शामिल हों\nspread_odd_label=विषम फैलाव\n\n# Document properties dialog box\ndocument_properties.title=दस्तावेज़ विशेषता...\ndocument_properties_label=दस्तावेज़ विशेषता...\ndocument_properties_file_name=फ़ाइल नाम:\ndocument_properties_file_size=फाइल आकारः\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=शीर्षक:\ndocument_properties_author=लेखकः\ndocument_properties_subject=विषय:\ndocument_properties_keywords=कुंजी-शब्द:\ndocument_properties_creation_date=निर्माण दिनांक:\ndocument_properties_modification_date=संशोधन दिनांक:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=निर्माता:\ndocument_properties_producer=PDF उत्पादक:\ndocument_properties_version=PDF संस्करण:\ndocument_properties_page_count=पृष्ठ गिनती:\ndocument_properties_page_size=पृष्ठ आकार:\ndocument_properties_page_size_unit_inches=इंच\ndocument_properties_page_size_unit_millimeters=मिमी\ndocument_properties_page_size_orientation_portrait=पोर्ट्रेट\ndocument_properties_page_size_orientation_landscape=लैंडस्केप\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=पत्र\ndocument_properties_page_size_name_legal=क़ानूनी\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=तीव्र वेब व्यू:\ndocument_properties_linearized_yes=हाँ\ndocument_properties_linearized_no=नहीं\ndocument_properties_close=बंद करें\n\nprint_progress_message=छपाई के लिए दस्तावेज़ को तैयार किया जा रहा है...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=रद्द करें\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=\\u0020स्लाइडर टॉगल करें\ntoggle_sidebar_notification.title=साइडबार टॉगल करें (दस्तावेज़ में रूपरेखा शामिल है/attachments)\ntoggle_sidebar_label=स्लाइडर टॉगल करें\ndocument_outline.title=दस्तावेज़ की रूपरेखा दिखाइए (सारी वस्तुओं को फलने अथवा समेटने के लिए दो बार क्लिक करें)\ndocument_outline_label=दस्तावेज़ आउटलाइन\nattachments.title=संलग्नक दिखायें\nattachments_label=संलग्नक\nthumbs.title=लघुछवियाँ दिखाएँ\nthumbs_label=लघु छवि\nfindbar.title=\\u0020दस्तावेज़ में ढूँढ़ें\nfindbar_label=ढूँढें\n\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=पृष्ठ {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=पृष्ठ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=पृष्ठ {{page}} की लघु-छवि\n\n# Find panel button title and messages\nfind_input.title=ढूँढें\nfind_input.placeholder=दस्तावेज़ में खोजें...\nfind_previous.title=वाक्यांश की पिछली उपस्थिति ढूँढ़ें\nfind_previous_label=पिछला\nfind_next.title=वाक्यांश की अगली उपस्थिति ढूँढ़ें\nfind_next_label=अगला\nfind_highlight=\\u0020सभी आलोकित करें\nfind_match_case_label=मिलान स्थिति\nfind_entire_word_label=संपूर्ण शब्द\nfind_reached_top=पृष्ठ के ऊपर पहुंच गया, नीचे से जारी रखें\nfind_reached_bottom=पृष्ठ के नीचे में जा पहुँचा, ऊपर से जारी\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{total}} में {{current}} मेल\nfind_match_count[two]={{total}} में {{current}} मेल\nfind_match_count[few]={{total}} में {{current}} मेल\nfind_match_count[many]={{total}} में {{current}} मेल\nfind_match_count[other]={{total}} में {{current}} मेल\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]={{limit}} से अधिक मेल\nfind_match_count_limit[one]={{limit}} से अधिक मेल\nfind_match_count_limit[two]={{limit}} से अधिक मेल\nfind_match_count_limit[few]={{limit}} से अधिक मेल\nfind_match_count_limit[many]={{limit}} से अधिक मेल\nfind_match_count_limit[other]={{limit}} से अधिक मेल\nfind_not_found=वाक्यांश नहीं मिला\n\n# Error panel labels\nerror_more_info=अधिक सूचना\nerror_less_info=कम सूचना\nerror_close=बंद करें\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=\\u0020संदेश: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=स्टैक: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=फ़ाइल: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=पंक्ति: {{line}}\nrendering_error=पृष्ठ रेंडरिंग के दौरान त्रुटि आई.\n\n# Predefined zoom values\npage_scale_width=\\u0020पृष्ठ चौड़ाई\npage_scale_fit=पृष्ठ फिट\npage_scale_auto=स्वचालित जूम\npage_scale_actual=वास्तविक आकार\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=PDF लोड करते समय एक त्रुटि हुई.\ninvalid_file_error=अमान्य या भ्रष्ट PDF फ़ाइल.\nmissing_file_error=\\u0020अनुपस्थित PDF फ़ाइल.\nunexpected_response_error=अप्रत्याशित सर्वर प्रतिक्रिया.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=\\u0020[{{type}} Annotation]\npassword_label=इस PDF फ़ाइल को खोलने के लिए कृपया कूटशब्द भरें.\npassword_invalid=अवैध कूटशब्द, कृपया फिर कोशिश करें.\npassword_ok=OK\npassword_cancel=रद्द करें\n\nprinting_not_supported=चेतावनी: इस ब्राउज़र पर छपाई पूरी तरह से समर्थित नहीं है.\nprinting_not_ready=चेतावनी: PDF छपाई के लिए पूरी तरह से लोड नहीं है.\nweb_fonts_disabled=वेब फॉन्ट्स निष्क्रिय हैं: अंतःस्थापित PDF फॉन्टस के उपयोग में असमर्थ.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/hr/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Prethodna stranica\nprevious_label=Prethodna\nnext.title=Sljedeća stranica\nnext_label=Sljedeća\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Stranica\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=od {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} od {{pagesCount}})\n\nzoom_out.title=Umanji\nzoom_out_label=Umanji\nzoom_in.title=Uvećaj\nzoom_in_label=Uvećaj\nzoom.title=Zumiranje\npresentation_mode.title=Prebaci u prezentacijski način rada\npresentation_mode_label=Prezentacijski način rada\nopen_file.title=Otvori datoteku\nopen_file_label=Otvori\nprint.title=Ispiši\nprint_label=Ispiši\ndownload.title=Preuzmi\ndownload_label=Preuzmi\nbookmark.title=Trenutačni prikaz (kopiraj ili otvori u novom prozoru)\nbookmark_label=Trenutačni prikaz\n\n# Secondary toolbar and context menu\ntools.title=Alati\ntools_label=Alati\nfirst_page.title=Idi na prvu stranicu\nfirst_page.label=Idi na prvu stranicu\nfirst_page_label=Idi na prvu stranicu\nlast_page.title=Idi na posljednju stranicu\nlast_page.label=Idi na posljednju stranicu\nlast_page_label=Idi na posljednju stranicu\npage_rotate_cw.title=Rotiraj u smjeru kazaljke na satu\npage_rotate_cw.label=Rotiraj u smjeru kazaljke na satu\npage_rotate_cw_label=Rotiraj u smjeru kazaljke na satu\npage_rotate_ccw.title=Rotiraj obrnutno od smjera kazaljke na satu\npage_rotate_ccw.label=Rotiraj obrnutno od smjera kazaljke na satu\npage_rotate_ccw_label=Rotiraj obrnutno od smjera kazaljke na satu\n\ncursor_text_select_tool.title=Omogući alat za označavanje teksta\ncursor_text_select_tool_label=Alat za označavanje teksta\ncursor_hand_tool.title=Omogući ručni alat\ncursor_hand_tool_label=Ručni alat\n\nscroll_vertical.title=Koristi okomito pomicanje\nscroll_vertical_label=Okomito pomicanje\nscroll_horizontal.title=Koristi vodoravno pomicanje\nscroll_horizontal_label=Vodoravno pomicanje\nscroll_wrapped.title=Koristi kontinuirani raspored stranica\nscroll_wrapped_label=Kontinuirani raspored stranica\n\nspread_none.title=Ne izrađuj duplerice\nspread_none_label=Pojedinačne stranice\nspread_odd.title=Izradi duplerice koje počinju s neparnim stranicama\nspread_odd_label=Neparne duplerice\nspread_even.title=Izradi duplerice koje počinju s parnim stranicama\nspread_even_label=Parne duplerice\n\n# Document properties dialog box\ndocument_properties.title=Svojstva dokumenta...\ndocument_properties_label=Svojstva dokumenta...\ndocument_properties_file_name=Naziv datoteke:\ndocument_properties_file_size=Veličina datoteke:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bajtova)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajtova)\ndocument_properties_title=Naslov:\ndocument_properties_author=Autor:\ndocument_properties_subject=Predmet:\ndocument_properties_keywords=Ključne riječi:\ndocument_properties_creation_date=Datum stvaranja:\ndocument_properties_modification_date=Datum promjene:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Stvaratelj:\ndocument_properties_producer=PDF stvaratelj:\ndocument_properties_version=PDF verzija:\ndocument_properties_page_count=Broj stranica:\ndocument_properties_page_size=Dimenzije stranice:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=uspravno\ndocument_properties_page_size_orientation_landscape=položeno\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Brzi web pregled:\ndocument_properties_linearized_yes=Da\ndocument_properties_linearized_no=Ne\ndocument_properties_close=Zatvori\n\nprint_progress_message=Pripremanje dokumenta za ispis…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Odustani\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Prikaži/sakrij bočnu traku\ntoggle_sidebar_notification.title=Prikazivanje i sklanjanje bočne trake (dokument sadrži strukturu/privitke)\ntoggle_sidebar_notification2.title=Prikazivanje i sklanjanje bočne trake (dokument sadrži strukturu/privitke/slojeve)\ntoggle_sidebar_label=Prikaži/sakrij bočnu traku\ndocument_outline.title=Prikaži strukturu dokumenta (dvostruki klik za rasklapanje/sklapanje svih stavki)\ndocument_outline_label=Struktura dokumenta\nattachments.title=Prikaži privitke\nattachments_label=Privitci\nlayers.title=Prikaži slojeve (dvoklik za vraćanje svih slojeva u zadano stanje)\nlayers_label=Slojevi\nthumbs.title=Prikaži minijature\nthumbs_label=Minijature\ncurrent_outline_item.title=Pronađi trenutačni element strukture\ncurrent_outline_item_label=Trenutačni element strukture\nfindbar.title=Pronađi u dokumentu\nfindbar_label=Pronađi\n\nadditional_layers=Dodatni slojevi\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Stranica br. {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Stranica {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Minijatura stranice {{page}}\n\n# Find panel button title and messages\nfind_input.title=Pronađi\nfind_input.placeholder=Pronađi u dokumentu …\nfind_previous.title=Pronađi prethodno pojavljivanje ovog izraza\nfind_previous_label=Prethodno\nfind_next.title=Pronađi sljedeće pojavljivanje ovog izraza\nfind_next_label=Sljedeće\nfind_highlight=Istankni sve\nfind_match_case_label=Razlikovanje velikih i malih slova\nfind_entire_word_label=Cijele riječi\nfind_reached_top=Dosegnut početak dokumenta, nastavak s kraja\nfind_reached_bottom=Dosegnut kraj dokumenta, nastavak s početka\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} od {{total}} se podudara\nfind_match_count[two]={{current}} od {{total}} se podudara\nfind_match_count[few]={{current}} od {{total}} se podudara\nfind_match_count[many]={{current}} od {{total}} se podudara\nfind_match_count[other]={{current}} od {{total}} se podudara\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Više od {{limit}} podudaranja\nfind_match_count_limit[one]=Više od {{limit}} podudaranja\nfind_match_count_limit[two]=Više od {{limit}} podudaranja\nfind_match_count_limit[few]=Više od {{limit}} podudaranja\nfind_match_count_limit[many]=Više od {{limit}} podudaranja\nfind_match_count_limit[other]=Više od {{limit}} podudaranja\nfind_not_found=Izraz nije pronađen\n\n# Error panel labels\nerror_more_info=Više informacija\nerror_less_info=Manje informacija\nerror_close=Zatvori\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Poruka: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stog: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Datoteka: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Redak: {{line}}\nrendering_error=Došlo je do greške prilikom iscrtavanja stranice.\n\n# Predefined zoom values\npage_scale_width=Prilagodi širini prozora\npage_scale_fit=Prilagodi veličini prozora\npage_scale_auto=Automatsko zumiranje\npage_scale_actual=Stvarna veličina\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}} %\n\n# Loading indicator messages\nloading_error=Došlo je do greške pri učitavanju PDF-a.\ninvalid_file_error=Neispravna ili oštećena PDF datoteka.\nmissing_file_error=Nedostaje PDF datoteka.\nunexpected_response_error=Neočekivani odgovor poslužitelja.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Bilješka]\npassword_label=Za otvoranje ove PDF datoteku upiši lozinku.\npassword_invalid=Neispravna lozinka. Pokušaj ponovo.\npassword_ok=U redu\npassword_cancel=Odustani\n\nprinting_not_supported=Upozorenje: Ovaj preglednik ne podržava u potpunosti ispisivanje.\nprinting_not_ready=Upozorenje: PDF nije u potpunosti učitan za ispis.\nweb_fonts_disabled=Web fontovi su deaktivirani: nije moguće koristiti ugrađene PDF fontove.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/hsb/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Předchadna strona\nprevious_label=Wróćo\nnext.title=Přichodna strona\nnext_label=Dale\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Strona\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=z {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} z {{pagesCount}})\n\nzoom_out.title=Pomjeńšić\nzoom_out_label=Pomjeńšić\nzoom_in.title=Powjetšić\nzoom_in_label=Powjetšić\nzoom.title=Skalowanje\npresentation_mode.title=Do prezentaciskeho modusa přeńć\npresentation_mode_label=Prezentaciski modus\nopen_file.title=Dataju wočinić\nopen_file_label=Wočinić\nprint.title=Ćišćeć\nprint_label=Ćišćeć\ndownload.title=Sćahnyć\ndownload_label=Sćahnyć\nbookmark.title=Aktualny napohlad (kopěrować abo w nowym woknje wočinić)\nbookmark_label=Aktualny napohlad\n\n# Secondary toolbar and context menu\ntools.title=Nastroje\ntools_label=Nastroje\nfirst_page.title=K prěnjej stronje\nfirst_page.label=K prěnjej stronje\nfirst_page_label=K prěnjej stronje\nlast_page.title=K poslednjej stronje\nlast_page.label=K poslednjej stronje\nlast_page_label=K poslednjej stronje\npage_rotate_cw.title=K směrej časnika wjerćeć\npage_rotate_cw.label=K směrej časnika wjerćeć\npage_rotate_cw_label=K směrej časnika wjerćeć\npage_rotate_ccw.title=Přećiwo směrej časnika wjerćeć\npage_rotate_ccw.label=Přećiwo směrej časnika wjerćeć\npage_rotate_ccw_label=Přećiwo směrej časnika wjerćeć\n\ncursor_text_select_tool.title=Nastroj za wuběranje teksta zmóžnić\ncursor_text_select_tool_label=Nastroj za wuběranje teksta\ncursor_hand_tool.title=Ručny nastroj zmóžnić\ncursor_hand_tool_label=Ručny nastroj\n\nscroll_vertical.title=Wertikalne suwanje wužiwać\nscroll_vertical_label=Wertikalnje suwanje\nscroll_horizontal.title=Horicontalne suwanje wužiwać\nscroll_horizontal_label=Horicontalne suwanje\nscroll_wrapped.title=Postupne suwanje wužiwać\nscroll_wrapped_label=Postupne suwanje\n\nspread_none.title=Strony njezwjazać\nspread_none_label=Žana dwójna strona\nspread_odd.title=Strony započinajo z njerunymi stronami zwjazać\nspread_odd_label=Njerune strony\nspread_even.title=Strony započinajo z runymi stronami zwjazać\nspread_even_label=Rune strony\n\n# Document properties dialog box\ndocument_properties.title=Dokumentowe kajkosće…\ndocument_properties_label=Dokumentowe kajkosće…\ndocument_properties_file_name=Mjeno dataje:\ndocument_properties_file_size=Wulkosć dataje:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bajtow)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajtow)\ndocument_properties_title=Titul:\ndocument_properties_author=Awtor:\ndocument_properties_subject=Předmjet:\ndocument_properties_keywords=Klučowe słowa:\ndocument_properties_creation_date=Datum wutworjenja:\ndocument_properties_modification_date=Datum změny:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Awtor:\ndocument_properties_producer=PDF-zhotowjer:\ndocument_properties_version=PDF-wersija:\ndocument_properties_page_count=Ličba stronow:\ndocument_properties_page_size=Wulkosć strony:\ndocument_properties_page_size_unit_inches=cól\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=wysoki format\ndocument_properties_page_size_orientation_landscape=prěčny format\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Fast Web View:\ndocument_properties_linearized_yes=Haj\ndocument_properties_linearized_no=Ně\ndocument_properties_close=Začinić\n\nprint_progress_message=Dokument so za ćišćenje přihotuje…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Přetorhnyć\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Bóčnicu pokazać/schować\ntoggle_sidebar_notification.title=Bóčnicu přepinać (dokument wobsahuje wobrys/přiwěški)\ntoggle_sidebar_notification2.title=Bóčnicu přepinać (dokument rozrjad/přiwěški/woršty wobsahuje)\ntoggle_sidebar_label=Bóčnicu pokazać/schować\ndocument_outline.title=Dokumentowy naćisk pokazać (dwójne kliknjenje, zo bychu so wšě zapiski pokazali/schowali)\ndocument_outline_label=Dokumentowa struktura\nattachments.title=Přiwěški pokazać\nattachments_label=Přiwěški\nlayers.title=Woršty pokazać (klikńće dwójce, zo byšće wšě woršty na standardny staw wróćo stajił)\nlayers_label=Woršty\nthumbs.title=Miniatury pokazać\nthumbs_label=Miniatury\ncurrent_outline_item.title=Aktualny rozrjadowy zapisk pytać\ncurrent_outline_item_label=Aktualny rozrjadowy zapisk\nfindbar.title=W dokumenće pytać\nfindbar_label=Pytać\n\nadditional_layers=Dalše woršty\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Strona {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Strona {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura strony {{page}}\n\n# Find panel button title and messages\nfind_input.title=Pytać\nfind_input.placeholder=W dokumenće pytać…\nfind_previous.title=Předchadne wustupowanje pytanskeho wuraza pytać\nfind_previous_label=Wróćo\nfind_next.title=Přichodne wustupowanje pytanskeho wuraza pytać\nfind_next_label=Dale\nfind_highlight=Wšě wuzběhnyć\nfind_match_case_label=Wulkopisanje wobkedźbować\nfind_entire_word_label=Cyłe słowa\nfind_reached_top=Spočatk dokumenta docpěty, pokročuje so z kóncom\nfind_reached_bottom=Kónc dokument docpěty, pokročuje so ze spočatkom\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} z {{total}} wotpowědnika\nfind_match_count[two]={{current}} z {{total}} wotpowědnikow\nfind_match_count[few]={{current}} z {{total}} wotpowědnikow\nfind_match_count[many]={{current}} z {{total}} wotpowědnikow\nfind_match_count[other]={{current}} z {{total}} wotpowědnikow\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Wjace hač {{limit}} wotpowědnikow\nfind_match_count_limit[one]=Wjace hač {{limit}} wotpowědnik\nfind_match_count_limit[two]=Wjace hač {{limit}} wotpowědnikaj\nfind_match_count_limit[few]=Wjace hač {{limit}} wotpowědniki\nfind_match_count_limit[many]=Wjace hač {{limit}} wotpowědnikow\nfind_match_count_limit[other]=Wjace hač {{limit}} wotpowědnikow\nfind_not_found=Pytanski wuraz njeje so namakał\n\n# Error panel labels\nerror_more_info=Wjace informacijow\nerror_less_info=Mjenje informacijow\nerror_close=Začinić\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Zdźělenka: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Lisćina zawołanjow: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Dataja: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linka: {{line}}\nrendering_error=Při zwobraznjenju strony je zmylk wustupił.\n\n# Predefined zoom values\npage_scale_width=Šěrokosć strony\npage_scale_fit=Wulkosć strony\npage_scale_auto=Awtomatiske skalowanje\npage_scale_actual=Aktualna wulkosć\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Při začitowanju PDF je zmylk wustupił.\ninvalid_file_error=Njepłaćiwa abo wobškodźena PDF-dataja.\nmissing_file_error=Falowaca PDF-dataja.\nunexpected_response_error=Njewočakowana serwerowa wotmołwa.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Typ přispomnjenki: {{type}}]\npassword_label=Zapodajće hesło, zo byšće PDF-dataju wočinił.\npassword_invalid=Njepłaćiwe hesło. Prošu spytajće hišće raz.\npassword_ok=W porjadku\npassword_cancel=Přetorhnyć\n\nprinting_not_supported=Warnowanje: Ćišćenje so přez tutón wobhladowak połnje njepodpěruje.\nprinting_not_ready=Warnowanje: PDF njeje so za ćišćenje dospołnje začitał.\nweb_fonts_disabled=Webpisma su znjemóžnjene: njeje móžno, zasadźene PDF-pisma wužiwać.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/hu/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Előző oldal\nprevious_label=Előző\nnext.title=Következő oldal\nnext_label=Tovább\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Oldal\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=összesen: {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} / {{pagesCount}})\n\nzoom_out.title=Kicsinyítés\nzoom_out_label=Kicsinyítés\nzoom_in.title=Nagyítás\nzoom_in_label=Nagyítás\nzoom.title=Nagyítás\npresentation_mode.title=Váltás bemutató módba\npresentation_mode_label=Bemutató mód\nopen_file.title=Fájl megnyitása\nopen_file_label=Megnyitás\nprint.title=Nyomtatás\nprint_label=Nyomtatás\ndownload.title=Letöltés\ndownload_label=Letöltés\nbookmark.title=Jelenlegi nézet (másolás vagy megnyitás új ablakban)\nbookmark_label=Aktuális nézet\n\n# Secondary toolbar and context menu\ntools.title=Eszközök\ntools_label=Eszközök\nfirst_page.title=Ugrás az első oldalra\nfirst_page.label=Ugrás az első oldalra\nfirst_page_label=Ugrás az első oldalra\nlast_page.title=Ugrás az utolsó oldalra\nlast_page.label=Ugrás az utolsó oldalra\nlast_page_label=Ugrás az utolsó oldalra\npage_rotate_cw.title=Forgatás az óramutató járásával egyezően\npage_rotate_cw.label=Forgatás az óramutató járásával egyezően\npage_rotate_cw_label=Forgatás az óramutató járásával egyezően\npage_rotate_ccw.title=Forgatás az óramutató járásával ellentétesen\npage_rotate_ccw.label=Forgatás az óramutató járásával ellentétesen\npage_rotate_ccw_label=Forgatás az óramutató járásával ellentétesen\n\ncursor_text_select_tool.title=Szövegkijelölő eszköz bekapcsolása\ncursor_text_select_tool_label=Szövegkijelölő eszköz\ncursor_hand_tool.title=Kéz eszköz bekapcsolása\ncursor_hand_tool_label=Kéz eszköz\n\nscroll_vertical.title=Függőleges görgetés használata\nscroll_vertical_label=Függőleges görgetés\nscroll_horizontal.title=Vízszintes görgetés használata\nscroll_horizontal_label=Vízszintes görgetés\nscroll_wrapped.title=Rácsos elrendezés használata\nscroll_wrapped_label=Rácsos elrendezés\n\nspread_none.title=Ne tapassza össze az oldalakat\nspread_none_label=Nincs összetapasztás\nspread_odd.title=Lapok összetapasztása, a páratlan számú oldalakkal kezdve\nspread_odd_label=Összetapasztás: páratlan\nspread_even.title=Lapok összetapasztása, a páros számú oldalakkal kezdve\nspread_even_label=Összetapasztás: páros\n\n# Document properties dialog box\ndocument_properties.title=Dokumentum tulajdonságai…\ndocument_properties_label=Dokumentum tulajdonságai…\ndocument_properties_file_name=Fájlnév:\ndocument_properties_file_size=Fájlméret:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bájt)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bájt)\ndocument_properties_title=Cím:\ndocument_properties_author=Szerző:\ndocument_properties_subject=Tárgy:\ndocument_properties_keywords=Kulcsszavak:\ndocument_properties_creation_date=Létrehozás dátuma:\ndocument_properties_modification_date=Módosítás dátuma:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Létrehozta:\ndocument_properties_producer=PDF előállító:\ndocument_properties_version=PDF verzió:\ndocument_properties_page_count=Oldalszám:\ndocument_properties_page_size=Lapméret:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=álló\ndocument_properties_page_size_orientation_landscape=fekvő\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Jogi információk\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Gyors webes nézet:\ndocument_properties_linearized_yes=Igen\ndocument_properties_linearized_no=Nem\ndocument_properties_close=Bezárás\n\nprint_progress_message=Dokumentum előkészítése nyomtatáshoz…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Mégse\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Oldalsáv be/ki\ntoggle_sidebar_notification.title=Oldalsáv be/ki (a dokumentum vázlatot/mellékleteket tartalmaz)\ntoggle_sidebar_notification2.title=Oldalsáv be/ki (a dokumentum vázlatot/mellékleteket/rétegeket tartalmaz)\ntoggle_sidebar_label=Oldalsáv be/ki\ndocument_outline.title=Dokumentum megjelenítése online (dupla kattintás minden elem kinyitásához/összecsukásához)\ndocument_outline_label=Dokumentumvázlat\nattachments.title=Mellékletek megjelenítése\nattachments_label=Van melléklet\nlayers.title=Rétegek megjelenítése (dupla kattintás az összes réteg alapértelmezett állapotra visszaállításához)\nlayers_label=Rétegek\nthumbs.title=Bélyegképek megjelenítése\nthumbs_label=Bélyegképek\ncurrent_outline_item.title=Jelenlegi vázlatelem megkeresése\ncurrent_outline_item_label=Jelenlegi vázlatelem\nfindbar.title=Keresés a dokumentumban\nfindbar_label=Keresés\n\nadditional_layers=További rétegek\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas={{page}}. oldal\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}}. oldal\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}}. oldal bélyegképe\n\n# Find panel button title and messages\nfind_input.title=Keresés\nfind_input.placeholder=Keresés a dokumentumban…\nfind_previous.title=A kifejezés előző előfordulásának keresése\nfind_previous_label=Előző\nfind_next.title=A kifejezés következő előfordulásának keresése\nfind_next_label=Tovább\nfind_highlight=Összes kiemelése\nfind_match_case_label=Kis- és nagybetűk megkülönböztetése\nfind_entire_word_label=Teljes szavak\nfind_reached_top=A dokumentum eleje elérve, folytatás a végétől\nfind_reached_bottom=A dokumentum vége elérve, folytatás az elejétől\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} / {{total}} találat\nfind_match_count[two]={{current}} / {{total}} találat\nfind_match_count[few]={{current}} / {{total}} találat\nfind_match_count[many]={{current}} / {{total}} találat\nfind_match_count[other]={{current}} / {{total}} találat\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Több mint {{limit}} találat\nfind_match_count_limit[one]=Több mint {{limit}} találat\nfind_match_count_limit[two]=Több mint {{limit}} találat\nfind_match_count_limit[few]=Több mint {{limit}} találat\nfind_match_count_limit[many]=Több mint {{limit}} találat\nfind_match_count_limit[other]=Több mint {{limit}} találat\nfind_not_found=A kifejezés nem található\n\n# Error panel labels\nerror_more_info=További tudnivalók\nerror_less_info=Kevesebb információ\nerror_close=Bezárás\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Üzenet: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Verem: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fájl: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Sor: {{line}}\nrendering_error=Hiba történt az oldal feldolgozása közben.\n\n# Predefined zoom values\npage_scale_width=Oldalszélesség\npage_scale_fit=Teljes oldal\npage_scale_auto=Automatikus nagyítás\npage_scale_actual=Valódi méret\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Hiba történt a PDF betöltésekor.\ninvalid_file_error=Érvénytelen vagy sérült PDF fájl.\nmissing_file_error=Hiányzó PDF fájl.\nunexpected_response_error=Váratlan kiszolgálóválasz.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} megjegyzés]\npassword_label=Adja meg a jelszót a PDF fájl megnyitásához.\npassword_invalid=Helytelen jelszó. Próbálja újra.\npassword_ok=OK\npassword_cancel=Mégse\n\nprinting_not_supported=Figyelmeztetés: Ez a böngésző nem teljesen támogatja a nyomtatást.\nprinting_not_ready=Figyelmeztetés: A PDF nincs teljesen betöltve a nyomtatáshoz.\nweb_fonts_disabled=Webes betűkészletek letiltva: nem használhatók a beágyazott PDF betűkészletek.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/hy-AM/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Նախորդ էջը\nprevious_label=Նախորդը\nnext.title=Հաջորդ էջը\nnext_label=Հաջորդը\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Էջ.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}}-ից\\u0020\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}}-ը {{pagesCount}})-ից\n\nzoom_out.title=Փոքրացնել\nzoom_out_label=Փոքրացնել\nzoom_in.title=Խոշորացնել\nzoom_in_label=Խոշորացնել\nzoom.title=Մասշտաբը\\u0020\npresentation_mode.title=Անցնել Ներկայացման եղանակին\npresentation_mode_label=Ներկայացման եղանակ\nopen_file.title=Բացել նիշք\nopen_file_label=Բացել\nprint.title=Տպել\nprint_label=Տպել\ndownload.title=Բեռնել\ndownload_label=Բեռնել\nbookmark.title=Ընթացիկ տեսքով (պատճենել կամ բացել նոր պատուհանում)\nbookmark_label=Ընթացիկ տեսքը\n\n# Secondary toolbar and context menu\ntools.title=Գործիքներ\ntools_label=Գործիքներ\nfirst_page.title=Անցնել առաջին էջին\nfirst_page.label=Անցնել առաջին էջին\nfirst_page_label=Անցնել առաջին էջին\nlast_page.title=Անցնել վերջին էջին\nlast_page.label=Անցնել վերջին էջին\nlast_page_label=Անցնել վերջին էջին\npage_rotate_cw.title=Պտտել ըստ ժամացույցի սլաքի\npage_rotate_cw.label=Պտտել ըստ ժամացույցի սլաքի\npage_rotate_cw_label=Պտտել ըստ ժամացույցի սլաքի\npage_rotate_ccw.title=Պտտել հակառակ ժամացույցի սլաքի\npage_rotate_ccw.label=Պտտել հակառակ ժամացույցի սլաքի\npage_rotate_ccw_label=Պտտել հակառակ ժամացույցի սլաքի\n\ncursor_text_select_tool.title=Միացնել գրույթ ընտրելու գործիքը\ncursor_text_select_tool_label=Գրույթը ընտրելու գործիք\ncursor_hand_tool.title=Միացնել Ձեռքի գործիքը\ncursor_hand_tool_label=Ձեռքի գործիք\n\nscroll_vertical.title=Օգտագործել ուղղահայաց ոլորում\nscroll_vertical_label=Ուղղահայաց ոլորում\nscroll_horizontal.title=Օգտագործել հորիզոնական ոլորում\nscroll_horizontal_label=Հորիզոնական ոլորում\nscroll_wrapped.title=Օգտագործել փաթաթված ոլորում\nscroll_wrapped_label=Փաթաթված ոլորում\n\nspread_none.title=Մի միացեք էջի վերածածկերին\nspread_none_label=Չկա վերածածկեր\nspread_odd.title=Միացեք էջի վերածածկերին սկսելով՝ կենտ համարակալված էջերով\nspread_odd_label=Կենտ վերածածկեր\nspread_even.title=Միացեք էջի վերածածկերին սկսելով՝ զույգ համարակալված էջերով\nspread_even_label=Զույգ վերածածկեր\n\n# Document properties dialog box\ndocument_properties.title=Փաստաթղթի հատկությունները…\ndocument_properties_label=Փաստաթղթի հատկությունները…\ndocument_properties_file_name=Նիշքի անունը.\ndocument_properties_file_size=Նիշք չափը.\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} ԿԲ ({{size_b}} բայթ)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} ՄԲ ({{size_b}} բայթ)\ndocument_properties_title=Վերնագիր.\ndocument_properties_author=Հեղինակ․\ndocument_properties_subject=Վերնագիր.\ndocument_properties_keywords=Հիմնաբառ.\ndocument_properties_creation_date=Ստեղծելու ամսաթիվը.\ndocument_properties_modification_date=Փոփոխելու ամսաթիվը.\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Ստեղծող.\ndocument_properties_producer=PDF-ի հեղինակը.\ndocument_properties_version=PDF-ի տարբերակը.\ndocument_properties_page_count=Էջերի քանակը.\ndocument_properties_page_size=Էջի չափը.\ndocument_properties_page_size_unit_inches=ում\ndocument_properties_page_size_unit_millimeters=մմ\ndocument_properties_page_size_orientation_portrait=ուղղաձիգ\ndocument_properties_page_size_orientation_landscape=հորիզոնական\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Նամակ\ndocument_properties_page_size_name_legal=Օրինական\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Արագ վեբ դիտում․\ndocument_properties_linearized_yes=Այո\ndocument_properties_linearized_no=Ոչ\ndocument_properties_close=Փակել\n\nprint_progress_message=Նախապատրաստում է փաստաթուղթը տպելուն...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Չեղարկել\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Բացել/Փակել Կողային վահանակը\ntoggle_sidebar_notification.title=Փոխարկել Կողային փեղկը (փաստաթուղթը պարունակում է ուրվագիծ/կցորդներ)\ntoggle_sidebar_label=Բացել/Փակել Կողային վահանակը\ndocument_outline.title=Ցուցադրել փաստաթղթի ուրվագիծը (կրկնակի սեղմեք՝ միավորները ընդարձակելու/կոծկելու համար)\ndocument_outline_label=Փաստաթղթի բովանդակությունը\nattachments.title=Ցուցադրել կցորդները\nattachments_label=Կցորդներ\nthumbs.title=Ցուցադրել Մանրապատկերը\nthumbs_label=Մանրապատկերը\nfindbar.title=Գտնել փաստաթղթում\nfindbar_label=Որոնում\n\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Էջ {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Էջը {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Էջի մանրապատկերը {{page}}\n\n# Find panel button title and messages\nfind_input.title=Որոնում\nfind_input.placeholder=Գտնել փաստաթղթում...\nfind_previous.title=Գտնել անրահայտության նախորդ հանդիպումը\nfind_previous_label=Նախորդը\nfind_next.title=Գտիր արտահայտության հաջորդ հանդիպումը\nfind_next_label=Հաջորդը\nfind_highlight=Գունանշել բոլորը\nfind_match_case_label=Մեծ(փոքր)ատառ հաշվի առնել\nfind_entire_word_label=Ամբողջ բառերը\nfind_reached_top=Հասել եք փաստաթղթի վերևին, կշարունակվի ներքևից\nfind_reached_bottom=Հասել եք փաստաթղթի վերջին, կշարունակվի վերևից\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ հոգնակի(ընդհանուր) ]}\nfind_match_count[one]={{current}} {{total}}-ի համընկնումից\nfind_match_count[two]={{current}} {{total}}-ի համընկնումներից\nfind_match_count[few]={{current}} {{total}}-ի համընկնումներից\nfind_match_count[many]={{current}} {{total}}-ի համընկնումներից\nfind_match_count[other]={{current}} {{total}}-ի համընկնումներից\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ հոգնակի (սահմանը) ]}\nfind_match_count_limit[zero]=Ավելին քան {{limit}} համընկնումները\nfind_match_count_limit[one]=Ավելին քան {{limit}} համընկնումը\nfind_match_count_limit[two]=Ավելին քան {{limit}} համընկնումներներ\nfind_match_count_limit[few]=Ավելին քան {{limit}} համընկնումներներ\nfind_match_count_limit[many]=Ավելին քան {{limit}} համընկնումներներ\nfind_match_count_limit[other]=Ավելին քան {{limit}} համընկնումներներ\nfind_not_found=Արտահայտությունը չգտնվեց\n\n# Error panel labels\nerror_more_info=Ավելի շատ տեղեկություն\nerror_less_info=Քիչ տեղեկություն\nerror_close=Փակել\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (կառուցումը. {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Գրությունը. {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Շեղջ. {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ֆայլ. {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Տողը. {{line}}\nrendering_error=Սխալ՝ էջը ստեղծելիս:\n\n# Predefined zoom values\npage_scale_width=Էջի լայնքը\npage_scale_fit=Ձգել էջը\npage_scale_auto=Ինքնաշխատ\npage_scale_actual=Իրական չափը\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Սխալ՝ PDF ֆայլը բացելիս։\ninvalid_file_error=Սխալ կամ վնասված PDF ֆայլ:\nmissing_file_error=PDF ֆայլը բացակայում է:\nunexpected_response_error=Սպասարկիչի անսպասելի պատասխան:\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Ծանոթություն]\npassword_label=Մուտքագրեք PDF-ի գաղտնաբառը:\npassword_invalid=Գաղտնաբառը սխալ է: Կրկին փորձեք:\npassword_ok=Լավ\npassword_cancel=Չեղարկել\n\nprinting_not_supported=Զգուշացում. Տպելը ամբողջությամբ չի աջակցվում դիտարկիչի կողմից։\nprinting_not_ready=Զգուշացում. PDF-ը ամբողջությամբ չի բեռնավորվել տպելու համար:\nweb_fonts_disabled=Վեբ-տառատեսակները անջատված են. հնարավոր չէ օգտագործել ներկառուցված PDF տառատեսակները:\n"
  },
  {
    "path": "lib/pdf.js/web/locale/hye/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Նախորդ էջ\nprevious_label=Նախորդը\nnext.title=Յաջորդ էջ\nnext_label=Յաջորդը\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=էջ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}}-ից\\u0020\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}}-ը {{pagesCount}})-ից\n\nzoom_out.title=Փոքրացնել\nzoom_out_label=Փոքրացնել\nzoom_in.title=Խոշորացնել\nzoom_in_label=Խոշորացնել\nzoom.title=Խոշորացում\npresentation_mode.title=Անցնել ներկայացման եղանակին\npresentation_mode_label=Ներկայացման եղանակ\nopen_file.title=Բացել նիշքը\nopen_file_label=Բացել\nprint.title=Տպել\nprint_label=Տպել\ndownload.title=Բեռնել\ndownload_label=Բեռնել\nbookmark.title=Ընթացիկ տեսքով (պատճէնել կամ բացել նոր պատուհանում)\nbookmark_label=Ընթացիկ տեսք\n\n# Secondary toolbar and context menu\ntools.title=Գործիքներ\ntools_label=Գործիքներ\nfirst_page.title=Գնալ դէպի առաջին էջ\nfirst_page.label=Գնալ դէպի առաջին էջ\nfirst_page_label=Գնալ դէպի առաջին էջ\nlast_page.title=Գնալ դէպի վերջին էջ\nlast_page.label=Գնալ դէպի վերջին էջ\nlast_page_label=Գնալ դէպի վերջին էջ\npage_rotate_cw.title=Պտտել ժամացոյցի սլաքի ուղղութեամբ\npage_rotate_cw.label=Պտտել ժամացոյցի սլաքի ուղղութեամբ\npage_rotate_cw_label=Պտտել ժամացոյցի սլաքի ուղղութեամբ\npage_rotate_ccw.title=Պտտել ժամացոյցի սլաքի հակառակ ուղղութեամբ\npage_rotate_ccw.label=Պտտել ժամացոյցի սլաքի հակառակ ուղղութեամբ\npage_rotate_ccw_label=Պտտել ժամացոյցի սլաքի հակառակ ուղղութեամբ\n\ncursor_text_select_tool.title=Միացնել գրոյթ ընտրելու գործիքը\ncursor_text_select_tool_label=Գրուածք ընտրելու գործիք\ncursor_hand_tool.title=Միացնել ձեռքի գործիքը\ncursor_hand_tool_label=Ձեռքի գործիք\n\nscroll_vertical.title=Աւգտագործել ուղղահայեաց ոլորում\nscroll_vertical_label=Ուղղահայեաց ոլորում\nscroll_horizontal.title=Աւգտագործել հորիզոնական ոլորում\nscroll_horizontal_label=Հորիզոնական ոլորում\nscroll_wrapped.title=Աւգտագործել փաթաթուած ոլորում\nscroll_wrapped_label=Փաթաթուած ոլորում\n\nspread_none.title=Մի միացէք էջի կոնտեքստում\nspread_none_label=Չկայ կոնտեքստ\nspread_odd.title=Միացէք էջի կոնտեքստին սկսելով՝ կենտ համարակալուած էջերով\nspread_odd_label=Տարաւրինակ կոնտեքստ\nspread_even.title=Միացէք էջի կոնտեքստին սկսելով՝ զոյգ համարակալուած էջերով\nspread_even_label=Հաւասար վերածածկեր\n\n# Document properties dialog box\ndocument_properties.title=Փաստաթղթի հատկութիւնները…\ndocument_properties_label=Փաստաթղթի յատկութիւնները…\ndocument_properties_file_name=Նիշքի անունը․\ndocument_properties_file_size=Նիշք չափը.\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} ԿԲ ({{size_b}} բայթ)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} ՄԲ ({{size_b}} բայթ)\ndocument_properties_title=Վերնագիր\ndocument_properties_author=Հեղինակ․\ndocument_properties_subject=առարկայ\ndocument_properties_keywords=Հիմնաբառեր\ndocument_properties_creation_date=Ստեղծման ամսաթիւ\ndocument_properties_modification_date=Փոփոխութեան ամսաթիւ.\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Ստեղծող\ndocument_properties_producer=PDF-ի Արտադրողը.\ndocument_properties_version=PDF-ի տարբերակը.\ndocument_properties_page_count=Էջերի քանակը.\ndocument_properties_page_size=Էջի չափը.\ndocument_properties_page_size_unit_inches=ում\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=ուղղաձիգ\ndocument_properties_page_size_orientation_landscape=հորիզոնական\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Նամակ\ndocument_properties_page_size_name_legal=Աւրինական\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Արագ վեբ դիտում․\ndocument_properties_linearized_yes=Այո\ndocument_properties_linearized_no=Ոչ\ndocument_properties_close=Փակել\n\nprint_progress_message=Նախապատրաստում է փաստաթուղթը տպելուն…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Չեղարկել\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Փոխարկել կողային վահանակը\ntoggle_sidebar_notification.title=Փոխարկել կողային վահանակը (փաստաթուղթը պարունակում է ուրուագիծ/կցորդ)\ntoggle_sidebar_notification2.title=Փոխանջատել կողմնասիւնը (փաստաթուղթը պարունակում է ուրուագիծ/կցորդներ/շերտեր)\ntoggle_sidebar_label=Փոխարկել կողային վահանակը\ndocument_outline.title=Ցուցադրել փաստաթղթի ուրուագիծը (կրկնակի սեղմէք՝ միաւորները ընդարձակելու/կոծկելու համար)\ndocument_outline_label=Փաստաթղթի ուրուագիծ\nattachments.title=Ցուցադրել կցորդները\nattachments_label=Կցորդներ\nlayers.title=Ցուցադրել շերտերը (կրկնահպել վերակայելու բոլոր շերտերը սկզբնադիր վիճակի)\nlayers_label=Շերտեր\nthumbs.title=Ցուցադրել մանրապատկերը\nthumbs_label=Մանրապատկեր\ncurrent_outline_item.title=Գտէք ընթացիկ գծագրման տարրը\ncurrent_outline_item_label=Ընթացիկ գծագրման տարր\nfindbar.title=Գտնել փաստաթղթում\nfindbar_label=Որոնում\n\nadditional_layers=Լրացուցիչ շերտեր\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Էջ {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Էջը {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Էջի մանրապատկերը {{page}}\n\n# Find panel button title and messages\nfind_input.title=Որոնում\nfind_input.placeholder=Գտնել փաստաթղթում…\nfind_previous.title=Գտնել արտայայտութեան նախորդ արտայայտութիւնը\nfind_previous_label=Նախորդը\nfind_next.title=Գտիր արտայայտութեան յաջորդ արտայայտութիւնը\nfind_next_label=Հաջորդը\nfind_highlight=Գունանշել բոլորը\nfind_match_case_label=Հաշուի առնել հանգամանքը\nfind_entire_word_label=Ամբողջ բառերը\nfind_reached_top=Հասել եք փաստաթղթի վերեւին,շարունակել ներքեւից\nfind_reached_bottom=Հասել էք փաստաթղթի վերջին, շարունակել վերեւից\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ հոգնակի(ընդհանուր) ]}\nfind_match_count[one]={{current}} {{total}}-ի համընկնումից\nfind_match_count[two]={{current}} {{total}}-ի համընկնումներից\nfind_match_count[few]={{current}} {{total}}-ի համընկնումներից\nfind_match_count[many]={{current}} {{total}}-ի համընկնումներից\nfind_match_count[other]={{current}} {{total}}-ի համընկնումներից\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ հոգնակի (սահմանը) ]}\nfind_match_count_limit[zero]=Աւելին քան {{limit}} համընկնումները\nfind_match_count_limit[one]=Աւելին քան {{limit}} համընկնումը\nfind_match_count_limit[two]=Աւելին քան {{limit}} համընկնումները\nfind_match_count_limit[few]=Աւելին քան {{limit}} համընկնումները\nfind_match_count_limit[many]=Աւելին քան {{limit}} համընկնումները\nfind_match_count_limit[other]=Աւելին քան {{limit}} համընկնումները\nfind_not_found=Արտայայտութիւնը չգտնուեց\n\n# Error panel labels\nerror_more_info=Աւելի շատ տեղեկութիւն\nerror_less_info=Քիչ տեղեկութիւն\nerror_close=Փակել\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (կառուցումը. {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Գրութիւնը. {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Շեղջ. {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=նիշք․ {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Տողը. {{line}}\nrendering_error=Սխալ է տեղի ունեցել էջի մեկնաբանման ժամանակ\n\n# Predefined zoom values\npage_scale_width=Էջի լայնութիւն\npage_scale_fit=Հարմարեցնել էջը\npage_scale_auto=Ինքնաշխատ խոշորացում\npage_scale_actual=Իրական չափը\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=PDF նիշքը բացելիս սխալ է տեղի ունեցել։\ninvalid_file_error=Սխալ կամ վնասուած PDF նիշք։\nmissing_file_error=PDF նիշքը բացակաիւմ է։\nunexpected_response_error=Սպասարկիչի անսպասելի պատասխան։\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Ծանոթութիւն]\npassword_label=Մուտքագրէք  գաղտնաբառը այս PDF նիշքը բացելու համար\npassword_invalid=Գաղտնաբառը սխալ է: Կրկին փորձէք:\npassword_ok=Լաւ\npassword_cancel=Չեղարկել\n\nprinting_not_supported=Զգուշացում. Տպելը ամբողջութեամբ չի աջակցուում զննարկիչի կողմից։\nprinting_not_ready=Զգուշացում. PDF֊ը ամբողջութեամբ չի բեռնաւորուել տպելու համար։\nweb_fonts_disabled=Վեբ-տառատեսակները անջատուած են. հնարաւոր չէ աւգտագործել ներկառուցուած PDF տառատեսակները։\n"
  },
  {
    "path": "lib/pdf.js/web/locale/ia/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pagina previe\nprevious_label=Previe\nnext.title=Pagina sequente\nnext_label=Sequente\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pagina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Distantiar\nzoom_out_label=Distantiar\nzoom_in.title=Approximar\nzoom_in_label=Approximar\nzoom.title=Zoom\npresentation_mode.title=Excambiar a modo presentation\npresentation_mode_label=Modo presentation\nopen_file.title=Aperir le file\nopen_file_label=Aperir\nprint.title=Imprimer\nprint_label=Imprimer\ndownload.title=Discargar\ndownload_label=Discargar\nbookmark.title=Vista actual (copiar o aperir in un nove fenestra)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Instrumentos\ntools_label=Instrumentos\nfirst_page.title=Ir al prime pagina\nfirst_page.label=Ir al prime pagina\nfirst_page_label=Ir al prime pagina\nlast_page.title=Ir al prime pagina\nlast_page.label=Ir al prime pagina\nlast_page_label=Ir al prime pagina\npage_rotate_cw.title=Rotar in senso horari\npage_rotate_cw.label=Rotar in senso horari\npage_rotate_cw_label=Rotar in senso horari\npage_rotate_ccw.title=Rotar in senso antihorari\npage_rotate_ccw.label=Rotar in senso antihorari\npage_rotate_ccw_label=Rotar in senso antihorari\n\ncursor_text_select_tool.title=Activar le instrumento de selection de texto\ncursor_text_select_tool_label=Instrumento de selection de texto\ncursor_hand_tool.title=Activar le instrumento mano\ncursor_hand_tool_label=Instrumento mano\n\nscroll_vertical.title=Usar rolamento vertical\nscroll_vertical_label=Rolamento vertical\nscroll_horizontal.title=Usar rolamento horizontal\nscroll_horizontal_label=Rolamento horizontal\nscroll_wrapped.title=Usar rolamento incapsulate\nscroll_wrapped_label=Rolamento incapsulate\n\nspread_none.title=Non junger paginas dual\nspread_none_label=Sin paginas dual\nspread_odd.title=Junger paginas dual a partir de paginas con numeros impar\nspread_odd_label=Paginas dual impar\nspread_even.title=Junger paginas dual a partir de paginas con numeros par\nspread_even_label=Paginas dual par\n\n# Document properties dialog box\ndocument_properties.title=Proprietates del documento…\ndocument_properties_label=Proprietates del documento…\ndocument_properties_file_name=Nomine del file:\ndocument_properties_file_size=Dimension de file:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titulo:\ndocument_properties_author=Autor:\ndocument_properties_subject=Subjecto:\ndocument_properties_keywords=Parolas clave:\ndocument_properties_creation_date=Data de creation:\ndocument_properties_modification_date=Data de modification:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creator:\ndocument_properties_producer=Productor PDF:\ndocument_properties_version=Version PDF:\ndocument_properties_page_count=Numero de paginas:\ndocument_properties_page_size=Dimension del pagina:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=vertical\ndocument_properties_page_size_orientation_landscape=horizontal\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Littera\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Vista web rapide:\ndocument_properties_linearized_yes=Si\ndocument_properties_linearized_no=No\ndocument_properties_close=Clauder\n\nprint_progress_message=Preparation del documento pro le impression…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancellar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Monstrar/celar le barra lateral\ntoggle_sidebar_notification.title=Monstrar/celar le barra lateral (le documento contine structura/attachamentos)\ntoggle_sidebar_notification2.title=Monstrar/celar le barra lateral (le documento contine structura/attachamentos/stratos)\ntoggle_sidebar_label=Monstrar/celar le barra lateral\ndocument_outline.title=Monstrar le schema del documento (clic duple pro expander/contraher tote le elementos)\ndocument_outline_label=Schema del documento\nattachments.title=Monstrar le annexos\nattachments_label=Annexos\nlayers.title=Monstrar stratos (clicca duple pro remontar tote le stratos al stato predefinite)\nlayers_label=Stratos\nthumbs.title=Monstrar le vignettes\nthumbs_label=Vignettes\ncurrent_outline_item.title=Trovar le elemento de structura actual\ncurrent_outline_item_label=Elemento de structura actual\nfindbar.title=Cercar in le documento\nfindbar_label=Cercar\n\nadditional_layers=Altere stratos\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Pagina {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pagina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Vignette del pagina {{page}}\n\n# Find panel button title and messages\nfind_input.title=Cercar\nfind_input.placeholder=Cercar in le documento…\nfind_previous.title=Trovar le previe occurrentia del phrase\nfind_previous_label=Previe\nfind_next.title=Trovar le successive occurrentia del phrase\nfind_next_label=Sequente\nfind_highlight=Evidentiar toto\nfind_match_case_label=Distinguer majusculas/minusculas\nfind_entire_word_label=Parolas integre\nfind_reached_top=Initio del documento attingite, continuation ab fin\nfind_reached_bottom=Fin del documento attingite, continuation ab initio\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} de {{total}} concordantia\nfind_match_count[two]={{current}} de {{total}} concordantias\nfind_match_count[few]={{current}} de {{total}} concordantias\nfind_match_count[many]={{current}} de {{total}} concordantias\nfind_match_count[other]={{current}} de {{total}} concordantias\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Plus de {{limit}} concordantias\nfind_match_count_limit[one]=Plus de {{limit}} concordantia\nfind_match_count_limit[two]=Plus de {{limit}} concordantias\nfind_match_count_limit[few]=Plus de {{limit}} concordantias\nfind_match_count_limit[many]=Plus de {{limit}} correspondentias\nfind_match_count_limit[other]=Plus de {{limit}} concordantias\nfind_not_found=Phrase non trovate\n\n# Error panel labels\nerror_more_info=Plus de informationes\nerror_less_info=Minus de informationes\nerror_close=Clauder\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linea: {{line}}\nrendering_error=Un error occurreva durante que on processava le pagina.\n\n# Predefined zoom values\npage_scale_width=Plen largor del pagina\npage_scale_fit=Pagina integre\npage_scale_auto=Zoom automatic\npage_scale_actual=Dimension actual\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Un error occurreva durante que on cargava le file PDF.\ninvalid_file_error=File PDF corrumpite o non valide.\nmissing_file_error=File PDF mancante.\nunexpected_response_error=Responsa del servitor inexpectate.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Insere le contrasigno pro aperir iste file PDF.\npassword_invalid=Contrasigno invalide. Per favor retenta.\npassword_ok=OK\npassword_cancel=Cancellar\n\nprinting_not_supported=Attention : le impression non es totalmente supportate per ce navigator.\nprinting_not_ready=Attention: le file PDF non es integremente cargate pro lo poter imprimer.\nweb_fonts_disabled=Le typos de litteras web es disactivate: impossibile usar le typos de litteras PDF incorporate.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/id/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Laman Sebelumnya\nprevious_label=Sebelumnya\nnext.title=Laman Selanjutnya\nnext_label=Selanjutnya\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Halaman\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=dari {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} dari {{pagesCount}})\n\nzoom_out.title=Perkecil\nzoom_out_label=Perkecil\nzoom_in.title=Perbesar\nzoom_in_label=Perbesar\nzoom.title=Perbesaran\npresentation_mode.title=Ganti ke Mode Presentasi\npresentation_mode_label=Mode Presentasi\nopen_file.title=Buka Berkas\nopen_file_label=Buka\nprint.title=Cetak\nprint_label=Cetak\ndownload.title=Unduh\ndownload_label=Unduh\nbookmark.title=Tampilan Sekarang (salin atau buka di jendela baru)\nbookmark_label=Tampilan Sekarang\n\n# Secondary toolbar and context menu\ntools.title=Alat\ntools_label=Alat\nfirst_page.title=Buka Halaman Pertama\nfirst_page.label=Ke Halaman Pertama\nfirst_page_label=Buka Halaman Pertama\nlast_page.title=Buka Halaman Terakhir\nlast_page.label=Ke Halaman Terakhir\nlast_page_label=Buka Halaman Terakhir\npage_rotate_cw.title=Putar Searah Jarum Jam\npage_rotate_cw.label=Putar Searah Jarum Jam\npage_rotate_cw_label=Putar Searah Jarum Jam\npage_rotate_ccw.title=Putar Berlawanan Arah Jarum Jam\npage_rotate_ccw.label=Putar Berlawanan Arah Jarum Jam\npage_rotate_ccw_label=Putar Berlawanan Arah Jarum Jam\n\ncursor_text_select_tool.title=Aktifkan Alat Seleksi Teks\ncursor_text_select_tool_label=Alat Seleksi Teks\ncursor_hand_tool.title=Aktifkan Alat Tangan\ncursor_hand_tool_label=Alat Tangan\n\nscroll_vertical.title=Gunakan Penggeseran Vertikal\nscroll_vertical_label=Penggeseran Vertikal\nscroll_horizontal.title=Gunakan Penggeseran Horizontal\nscroll_horizontal_label=Penggeseran Horizontal\nscroll_wrapped.title=Gunakan Penggeseran Terapit\nscroll_wrapped_label=Penggeseran Terapit\n\nspread_none.title=Jangan gabungkan lembar halaman\nspread_none_label=Tidak Ada Lembaran\nspread_odd.title=Gabungkan lembar lamanan mulai dengan halaman ganjil\nspread_odd_label=Lembaran Ganjil\nspread_even.title=Gabungkan lembar halaman dimulai dengan halaman genap\nspread_even_label=Lembaran Genap\n\n# Document properties dialog box\ndocument_properties.title=Properti Dokumen…\ndocument_properties_label=Properti Dokumen…\ndocument_properties_file_name=Nama berkas:\ndocument_properties_file_size=Ukuran berkas:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} byte)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} byte)\ndocument_properties_title=Judul:\ndocument_properties_author=Penyusun:\ndocument_properties_subject=Subjek:\ndocument_properties_keywords=Kata Kunci:\ndocument_properties_creation_date=Tanggal Dibuat:\ndocument_properties_modification_date=Tanggal Dimodifikasi:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Pembuat:\ndocument_properties_producer=Pemroduksi PDF:\ndocument_properties_version=Versi PDF:\ndocument_properties_page_count=Jumlah Halaman:\ndocument_properties_page_size=Ukuran Laman:\ndocument_properties_page_size_unit_inches=inci\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=tegak\ndocument_properties_page_size_orientation_landscape=mendatar\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Tampilan Web Kilat:\ndocument_properties_linearized_yes=Ya\ndocument_properties_linearized_no=Tidak\ndocument_properties_close=Tutup\n\nprint_progress_message=Menyiapkan dokumen untuk pencetakan…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Batalkan\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Aktif/Nonaktifkan Bilah Samping\ntoggle_sidebar_notification.title=Aktif/Nonaktifkan Bilah Samping (dokumen berisi kerangka/lampiran)\ntoggle_sidebar_notification2.title=Aktif/Nonaktifkan Bilah Samping (dokumen berisi kerangka/lampiran/lapisan)\ntoggle_sidebar_label=Aktif/Nonaktifkan Bilah Samping\ndocument_outline.title=Tampilkan Kerangka Dokumen (klik ganda untuk membentangkan/menciutkan semua item)\ndocument_outline_label=Kerangka Dokumen\nattachments.title=Tampilkan Lampiran\nattachments_label=Lampiran\nlayers.title=Tampilkan Lapisan (klik ganda untuk mengatur ulang semua lapisan ke keadaan baku)\nlayers_label=Lapisan\nthumbs.title=Tampilkan Miniatur\nthumbs_label=Miniatur\ncurrent_outline_item.title=Cari Butir Ikhtisar Saat Ini\ncurrent_outline_item_label=Butir Ikhtisar Saat Ini\nfindbar.title=Temukan di Dokumen\nfindbar_label=Temukan\n\nadditional_layers=Lapisan Tambahan\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Laman {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Laman {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatur Laman {{page}}\n\n# Find panel button title and messages\nfind_input.title=Temukan\nfind_input.placeholder=Temukan di dokumen…\nfind_previous.title=Temukan kata sebelumnya\nfind_previous_label=Sebelumnya\nfind_next.title=Temukan lebih lanjut\nfind_next_label=Selanjutnya\nfind_highlight=Sorot semuanya\nfind_match_case_label=Cocokkan BESAR/kecil\nfind_entire_word_label=Seluruh teks\nfind_reached_top=Sampai di awal dokumen, dilanjutkan dari bawah\nfind_reached_bottom=Sampai di akhir dokumen, dilanjutkan dari atas\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} dari {{total}} hasil\nfind_match_count[two]={{current}} dari {{total}} hasil\nfind_match_count[few]={{current}} dari {{total}} hasil\nfind_match_count[many]={{current}} dari {{total}} hasil\nfind_match_count[other]={{current}} dari {{total}} hasil\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Ditemukan lebih dari {{limit}}\nfind_match_count_limit[one]=Ditemukan lebih dari {{limit}}\nfind_match_count_limit[two]=Ditemukan lebih dari {{limit}}\nfind_match_count_limit[few]=Ditemukan lebih dari {{limit}}\nfind_match_count_limit[many]=Ditemukan lebih dari {{limit}}\nfind_match_count_limit[other]=Ditemukan lebih dari {{limit}}\nfind_not_found=Frasa tidak ditemukan\n\n# Error panel labels\nerror_more_info=Lebih Banyak Informasi\nerror_less_info=Lebih Sedikit Informasi\nerror_close=Tutup\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Pesan: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Berkas: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Baris: {{line}}\nrendering_error=Galat terjadi saat merender laman.\n\n# Predefined zoom values\npage_scale_width=Lebar Laman\npage_scale_fit=Muat Laman\npage_scale_auto=Perbesaran Otomatis\npage_scale_actual=Ukuran Asli\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Galat terjadi saat memuat PDF.\ninvalid_file_error=Berkas PDF tidak valid atau rusak.\nmissing_file_error=Berkas PDF tidak ada.\nunexpected_response_error=Balasan server yang tidak diharapkan.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotasi {{type}}]\npassword_label=Masukkan sandi untuk membuka berkas PDF ini.\npassword_invalid=Sandi tidak valid. Silakan coba lagi.\npassword_ok=Oke\npassword_cancel=Batal\n\nprinting_not_supported=Peringatan: Pencetakan tidak didukung secara lengkap pada peramban ini.\nprinting_not_ready=Peringatan: Berkas PDF masih belum dimuat secara lengkap untuk dapat dicetak.\nweb_fonts_disabled=Font web dinonaktifkan: tidak dapat menggunakan font PDF yang tersemat.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/is/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Fyrri síða\nprevious_label=Fyrri\nnext.title=Næsta síða\nnext_label=Næsti\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Síða\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=af {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} af {{pagesCount}})\n\nzoom_out.title=Minnka\nzoom_out_label=Minnka\nzoom_in.title=Stækka\nzoom_in_label=Stækka\nzoom.title=Aðdráttur\npresentation_mode.title=Skipta yfir á kynningarham\npresentation_mode_label=Kynningarhamur\nopen_file.title=Opna skrá\nopen_file_label=Opna\nprint.title=Prenta\nprint_label=Prenta\ndownload.title=Hala niður\ndownload_label=Hala niður\nbookmark.title=Núverandi sýn (afritaðu eða opnaðu í nýjum glugga)\nbookmark_label=Núverandi sýn\n\n# Secondary toolbar and context menu\ntools.title=Verkfæri\ntools_label=Verkfæri\nfirst_page.title=Fara á fyrstu síðu\nfirst_page.label=Fara á fyrstu síðu\nfirst_page_label=Fara á fyrstu síðu\nlast_page.title=Fara á síðustu síðu\nlast_page.label=Fara á síðustu síðu\nlast_page_label=Fara á síðustu síðu\npage_rotate_cw.title=Snúa réttsælis\npage_rotate_cw.label=Snúa réttsælis\npage_rotate_cw_label=Snúa réttsælis\npage_rotate_ccw.title=Snúa rangsælis\npage_rotate_ccw.label=Snúa rangsælis\npage_rotate_ccw_label=Snúa rangsælis\n\ncursor_text_select_tool.title=Virkja textavalsáhald\ncursor_text_select_tool_label=Textavalsáhald\ncursor_hand_tool.title=Virkja handarverkfæri\ncursor_hand_tool_label=Handarverkfæri\n\nscroll_vertical.title=Nota lóðrétt skrun\nscroll_vertical_label=Lóðrétt skrun\nscroll_horizontal.title=Nota lárétt skrun\nscroll_horizontal_label=Lárétt skrun\n\nspread_none.title=Ekki taka þátt í dreifingu síðna\nspread_none_label=Engin dreifing\nspread_odd.title=Taka þátt í dreifingu síðna með oddatölum\nspread_odd_label=Oddatöludreifing\nspread_even.title=Taktu þátt í dreifingu síðna með jöfnuntölum\nspread_even_label=Jafnatöludreifing\n\n# Document properties dialog box\ndocument_properties.title=Eiginleikar skjals…\ndocument_properties_label=Eiginleikar skjals…\ndocument_properties_file_name=Skráarnafn:\ndocument_properties_file_size=Skrárstærð:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titill:\ndocument_properties_author=Hönnuður:\ndocument_properties_subject=Efni:\ndocument_properties_keywords=Stikkorð:\ndocument_properties_creation_date=Búið til:\ndocument_properties_modification_date=Dags breytingar:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Höfundur:\ndocument_properties_producer=PDF framleiðandi:\ndocument_properties_version=PDF útgáfa:\ndocument_properties_page_count=Blaðsíðufjöldi:\ndocument_properties_page_size=Stærð síðu:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=skammsnið\ndocument_properties_page_size_orientation_landscape=langsnið\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized_yes=Já\ndocument_properties_linearized_no=Nei\ndocument_properties_close=Loka\n\nprint_progress_message=Undirbý skjal fyrir prentun…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Hætta við\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Víxla hliðslá\ntoggle_sidebar_notification.title=Víxla hliðarslá (skjal inniheldur yfirlit/viðhengi)\ntoggle_sidebar_label=Víxla hliðslá\ndocument_outline.title=Sýna yfirlit skjals (tvísmelltu til að opna/loka öllum hlutum)\ndocument_outline_label=Efnisskipan skjals\nattachments.title=Sýna viðhengi\nattachments_label=Viðhengi\nthumbs.title=Sýna smámyndir\nthumbs_label=Smámyndir\nfindbar.title=Leita í skjali\nfindbar_label=Leita\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Síða {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Smámynd af síðu {{page}}\n\n# Find panel button title and messages\nfind_input.title=Leita\nfind_input.placeholder=Leita í skjali…\nfind_previous.title=Leita að fyrra tilfelli þessara orða\nfind_previous_label=Fyrri\nfind_next.title=Leita að næsta tilfelli þessara orða\nfind_next_label=Næsti\nfind_highlight=Lita allt\nfind_match_case_label=Passa við stafstöðu\nfind_entire_word_label=Heil orð\nfind_reached_top=Náði efst í skjal, held áfram neðst\nfind_reached_bottom=Náði enda skjals, held áfram efst\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} af {{total}} niðurstöðu\nfind_match_count[two]={{current}} af {{total}} niðurstöðum\nfind_match_count[few]={{current}} af {{total}} niðurstöðum\nfind_match_count[many]={{current}} af {{total}} niðurstöðum\nfind_match_count[other]={{current}} af {{total}} niðurstöðum\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Fleiri en {{limit}} niðurstöður\nfind_match_count_limit[one]=Fleiri en {{limit}} niðurstaða\nfind_match_count_limit[two]=Fleiri en {{limit}} niðurstöður\nfind_match_count_limit[few]=Fleiri en {{limit}} niðurstöður\nfind_match_count_limit[many]=Fleiri en {{limit}} niðurstöður\nfind_match_count_limit[other]=Fleiri en {{limit}} niðurstöður\nfind_not_found=Fann ekki orðið\n\n# Error panel labels\nerror_more_info=Meiri upplýsingar\nerror_less_info=Minni upplýsingar\nerror_close=Loka\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Skilaboð: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stafli: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Skrá: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Lína: {{line}}\nrendering_error=Upp kom villa við að birta síðuna.\n\n# Predefined zoom values\npage_scale_width=Síðubreidd\npage_scale_fit=Passa á síðu\npage_scale_auto=Sjálfvirkur aðdráttur\npage_scale_actual=Raunstærð\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Villa kom upp við að hlaða inn PDF.\ninvalid_file_error=Ógild eða skemmd PDF skrá.\nmissing_file_error=Vantar PDF skrá.\nunexpected_response_error=Óvænt svar frá netþjóni.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Skýring]\npassword_label=Sláðu inn lykilorð til að opna þessa PDF skrá.\npassword_invalid=Ógilt lykilorð. Reyndu aftur.\npassword_ok=Í lagi\npassword_cancel=Hætta við\n\nprinting_not_supported=Aðvörun: Prentun er ekki með fyllilegan stuðning á þessum vafra.\nprinting_not_ready=Aðvörun: Ekki er búið að hlaða inn allri PDF skránni fyrir prentun.\nweb_fonts_disabled=Vef leturgerðir eru óvirkar: get ekki notað innbyggðar PDF leturgerðir.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/it/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# Copyright 2012 Mozilla Foundation\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\nprevious.title = Pagina precedente\nprevious_label = Precedente\nnext.title = Pagina successiva\nnext_label = Successiva\n\npage.title = Pagina\nof_pages = di {{pagesCount}}\npage_of_pages = ({{pageNumber}} di {{pagesCount}})\n\nzoom_out.title = Riduci zoom\nzoom_out_label = Riduci zoom\nzoom_in.title = Aumenta zoom\nzoom_in_label = Aumenta zoom\nzoom.title = Zoom\npresentation_mode.title = Passa alla modalità presentazione\npresentation_mode_label = Modalità presentazione\nopen_file.title = Apri file\nopen_file_label = Apri\nprint.title = Stampa\nprint_label = Stampa\ndownload.title = Scarica questo documento\ndownload_label = Download\nbookmark.title = Visualizzazione corrente (copia o apri in una nuova finestra)\nbookmark_label = Visualizzazione corrente\n\ntools.title = Strumenti\ntools_label = Strumenti\nfirst_page.title = Vai alla prima pagina\nfirst_page.label = Vai alla prima pagina\nfirst_page_label = Vai alla prima pagina\nlast_page.title = Vai all’ultima pagina\nlast_page.label = Vai all’ultima pagina\nlast_page_label = Vai all’ultima pagina\npage_rotate_cw.title = Ruota in senso orario\npage_rotate_cw.label = Ruota in senso orario\npage_rotate_cw_label = Ruota in senso orario\npage_rotate_ccw.title = Ruota in senso antiorario\npage_rotate_ccw.label = Ruota in senso antiorario\npage_rotate_ccw_label = Ruota in senso antiorario\n\ncursor_text_select_tool.title = Attiva strumento di selezione testo\ncursor_text_select_tool_label = Strumento di selezione testo\ncursor_hand_tool.title = Attiva strumento mano\ncursor_hand_tool_label = Strumento mano\n\nscroll_vertical.title = Scorri le pagine in verticale\nscroll_vertical_label = Scorrimento verticale\nscroll_horizontal.title = Scorri le pagine in orizzontale\nscroll_horizontal_label = Scorrimento orizzontale\nscroll_wrapped.title = Scorri le pagine in verticale, disponendole da sinistra a destra e andando a capo automaticamente\nscroll_wrapped_label = Scorrimento con a capo automatico\n\nspread_none.title = Non raggruppare pagine\nspread_none_label = Nessun raggruppamento\nspread_odd.title = Crea gruppi di pagine che iniziano con numeri di pagina dispari\nspread_odd_label = Raggruppamento dispari\nspread_even.title = Crea gruppi di pagine che iniziano con numeri di pagina pari\nspread_even_label = Raggruppamento pari\n\ndocument_properties.title = Proprietà del documento…\ndocument_properties_label = Proprietà del documento…\ndocument_properties_file_name = Nome file:\ndocument_properties_file_size = Dimensione file:\ndocument_properties_kb = {{size_kb}} kB ({{size_b}} byte)\ndocument_properties_mb = {{size_mb}} MB ({{size_b}} byte)\ndocument_properties_title = Titolo:\ndocument_properties_author = Autore:\ndocument_properties_subject = Oggetto:\ndocument_properties_keywords = Parole chiave:\ndocument_properties_creation_date = Data creazione:\ndocument_properties_modification_date = Data modifica:\ndocument_properties_date_string = {{date}}, {{time}}\ndocument_properties_creator = Autore originale:\ndocument_properties_producer = Produttore PDF:\ndocument_properties_version = Versione PDF:\ndocument_properties_page_count = Conteggio pagine:\ndocument_properties_page_size = Dimensioni pagina:\ndocument_properties_page_size_unit_inches = in\ndocument_properties_page_size_unit_millimeters = mm\ndocument_properties_page_size_orientation_portrait = verticale\ndocument_properties_page_size_orientation_landscape = orizzontale\ndocument_properties_page_size_name_a3 = A3\ndocument_properties_page_size_name_a4 = A4\ndocument_properties_page_size_name_letter = Lettera\ndocument_properties_page_size_name_legal = Legale\ndocument_properties_page_size_dimension_string = {{width}} × {{height}} {{unit}} ({{orientation}})\ndocument_properties_page_size_dimension_name_string = {{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\ndocument_properties_linearized = Visualizzazione web veloce:\ndocument_properties_linearized_yes = Sì\ndocument_properties_linearized_no = No\ndocument_properties_close = Chiudi\n\nprint_progress_message = Preparazione documento per la stampa…\nprint_progress_percent = {{progress}}%\nprint_progress_close = Annulla\n\ntoggle_sidebar.title = Attiva/disattiva barra laterale\ntoggle_sidebar_notification.title = Attiva/disattiva barra laterale (il documento contiene struttura/allegati)\ntoggle_sidebar_notification2.title = Attiva/disattiva barra laterale (il documento contiene struttura/allegati/livelli)\ntoggle_sidebar_label = Attiva/disattiva barra laterale\ndocument_outline.title = Visualizza la struttura del documento (doppio clic per visualizzare/comprimere tutti gli elementi)\ndocument_outline_label = Struttura documento\nattachments.title = Visualizza allegati\nattachments_label = Allegati\nlayers.title = Visualizza livelli (doppio clic per ripristinare tutti i livelli allo stato predefinito)\nlayers_label = Livelli\nthumbs.title = Mostra le miniature\nthumbs_label = Miniature\ncurrent_outline_item.title = Trova elemento struttura corrente\ncurrent_outline_item_label = Elemento struttura corrente\nfindbar.title = Trova nel documento\nfindbar_label = Trova\n\nadditional_layers = Livelli aggiuntivi\npage_canvas = Pagina {{page}}\npage_landmark = Pagina {{page}}\nthumb_page_title = Pagina {{page}}\nthumb_page_canvas = Miniatura della pagina {{page}}\n\nfind_input.title = Trova\nfind_input.placeholder = Trova nel documento…\nfind_previous.title = Trova l’occorrenza precedente del testo da cercare\nfind_previous_label = Precedente\nfind_next.title = Trova l’occorrenza successiva del testo da cercare\nfind_next_label = Successivo\nfind_highlight = Evidenzia\nfind_match_case_label = Maiuscole/minuscole\nfind_entire_word_label = Parole intere\nfind_reached_top = Raggiunto l’inizio della pagina, continua dalla fine\nfind_reached_bottom = Raggiunta la fine della pagina, continua dall’inizio\nfind_match_count = {[ plural(total) ]}\nfind_match_count[one] = {{current}} di {{total}} corrispondenza\nfind_match_count[two] = {{current}} di {{total}} corrispondenze\nfind_match_count[few] = {{current}} di {{total}} corrispondenze\nfind_match_count[many] = {{current}} di {{total}} corrispondenze\nfind_match_count[other] = {{current}} di {{total}} corrispondenze\nfind_match_count_limit = {[ plural(limit) ]}\nfind_match_count_limit[zero] = Più di {{limit}} corrispondenze\nfind_match_count_limit[one] = Più di {{limit}} corrispondenza\nfind_match_count_limit[two] = Più di {{limit}} corrispondenze\nfind_match_count_limit[few] = Più di {{limit}} corrispondenze\nfind_match_count_limit[many] = Più di {{limit}} corrispondenze\nfind_match_count_limit[other] = Più di {{limit}} corrispondenze\nfind_not_found = Testo non trovato\n\nerror_more_info = Ulteriori informazioni\nerror_less_info = Nascondi dettagli\nerror_close = Chiudi\nerror_version_info = PDF.js v{{version}} (build: {{build}})\nerror_message = Messaggio: {{message}}\nerror_stack = Stack: {{stack}}\nerror_file = File: {{file}}\nerror_line = Riga: {{line}}\nrendering_error = Si è verificato un errore durante il rendering della pagina.\n\npage_scale_width = Larghezza pagina\npage_scale_fit = Adatta a una pagina\npage_scale_auto = Zoom automatico\npage_scale_actual = Dimensioni effettive\npage_scale_percent = {{scale}}%\n\nloading = Caricamento in corso…\nloading_error = Si è verificato un errore durante il caricamento del PDF.\ninvalid_file_error = File PDF non valido o danneggiato.\nmissing_file_error = File PDF non disponibile.\nunexpected_response_error = Risposta imprevista del server\n\nannotation_date_string = {{date}}, {{time}}\n\ntext_annotation_type.alt = [Annotazione: {{type}}]\npassword_label = Inserire la password per aprire questo file PDF.\npassword_invalid = Password non corretta. Riprovare.\npassword_ok = OK\npassword_cancel = Annulla\n\nprinting_not_supported = Attenzione: la stampa non è completamente supportata da questo browser.\nprinting_not_ready = Attenzione: il PDF non è ancora stato caricato completamente per la stampa.\nweb_fonts_disabled = I web font risultano disattivati: impossibile utilizzare i caratteri incorporati nel PDF.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/ja/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=前のページへ戻ります\nprevious_label=前へ\nnext.title=次のページへ進みます\nnext_label=次へ\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=ページ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} / {{pagesCount}})\n\nzoom_out.title=表示を縮小します\nzoom_out_label=縮小\nzoom_in.title=表示を拡大します\nzoom_in_label=拡大\nzoom.title=拡大/縮小\npresentation_mode.title=プレゼンテーションモードに切り替えます\npresentation_mode_label=プレゼンテーションモード\nopen_file.title=ファイルを開きます\nopen_file_label=開く\nprint.title=印刷します\nprint_label=印刷\ndownload.title=ダウンロードします\ndownload_label=ダウンロード\nbookmark.title=現在のビューの URL です (コピーまたは新しいウィンドウに開く)\nbookmark_label=現在のビュー\n\n# Secondary toolbar and context menu\ntools.title=ツール\ntools_label=ツール\nfirst_page.title=最初のページへ移動します\nfirst_page.label=最初のページへ移動\nfirst_page_label=最初のページへ移動\nlast_page.title=最後のページへ移動します\nlast_page.label=最後のページへ移動\nlast_page_label=最後のページへ移動\npage_rotate_cw.title=ページを右へ回転します\npage_rotate_cw.label=右回転\npage_rotate_cw_label=右回転\npage_rotate_ccw.title=ページを左へ回転します\npage_rotate_ccw.label=左回転\npage_rotate_ccw_label=左回転\n\ncursor_text_select_tool.title=テキスト選択ツールを有効にする\ncursor_text_select_tool_label=テキスト選択ツール\ncursor_hand_tool.title=手のひらツールを有効にする\ncursor_hand_tool_label=手のひらツール\n\nscroll_vertical.title=縦スクロールにする\nscroll_vertical_label=縦スクロール\nscroll_horizontal.title=横スクロールにする\nscroll_horizontal_label=横スクロール\nscroll_wrapped.title=折り返しスクロールにする\nscroll_wrapped_label=折り返しスクロール\n\nspread_none.title=見開きにしない\nspread_none_label=見開きにしない\nspread_odd.title=奇数ページ開始で見開きにする\nspread_odd_label=奇数ページ見開き\nspread_even.title=偶数ページ開始で見開きにする\nspread_even_label=偶数ページ見開き\n\n# Document properties dialog box\ndocument_properties.title=文書のプロパティ...\ndocument_properties_label=文書のプロパティ...\ndocument_properties_file_name=ファイル名:\ndocument_properties_file_size=ファイルサイズ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=タイトル:\ndocument_properties_author=作成者:\ndocument_properties_subject=件名:\ndocument_properties_keywords=キーワード:\ndocument_properties_creation_date=作成日:\ndocument_properties_modification_date=更新日:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=アプリケーション:\ndocument_properties_producer=PDF 作成:\ndocument_properties_version=PDF のバージョン:\ndocument_properties_page_count=ページ数:\ndocument_properties_page_size=ページサイズ:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=縦\ndocument_properties_page_size_orientation_landscape=横\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=レター\ndocument_properties_page_size_name_legal=リーガル\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=ウェブ表示用に最適化:\ndocument_properties_linearized_yes=はい\ndocument_properties_linearized_no=いいえ\ndocument_properties_close=閉じる\n\nprint_progress_message=文書の印刷を準備しています...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=キャンセル\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=サイドバー表示を切り替えます\ntoggle_sidebar_notification.title=サイドバー表示を切り替えます (文書に含まれるアウトライン / 添付)\ntoggle_sidebar_notification2.title=サイドバー表示を切り替えます (文書に含まれるアウトライン / 添付 / レイヤー)\ntoggle_sidebar_label=サイドバーの切り替え\ndocument_outline.title=文書の目次を表示します (ダブルクリックで項目を開閉します)\ndocument_outline_label=文書の目次\nattachments.title=添付ファイルを表示します\nattachments_label=添付ファイル\nlayers.title=レイヤーを表示します (ダブルクリックですべてのレイヤーが初期状態に戻ります)\nlayers_label=レイヤー\nthumbs.title=縮小版を表示します\nthumbs_label=縮小版\ncurrent_outline_item.title=現在のアウトライン項目を検索\ncurrent_outline_item_label=現在のアウトライン項目\nfindbar.title=文書内を検索します\nfindbar_label=検索\n\nadditional_layers=追加レイヤー\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas={{page}} ページ\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}} ページ\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} ページの縮小版\n\n# Find panel button title and messages\nfind_input.title=検索\nfind_input.placeholder=文書内を検索...\nfind_previous.title=現在より前の位置で指定文字列が現れる部分を検索します\nfind_previous_label=前へ\nfind_next.title=現在より後の位置で指定文字列が現れる部分を検索します\nfind_next_label=次へ\nfind_highlight=すべて強調表示\nfind_match_case_label=大文字/小文字を区別\nfind_entire_word_label=単語一致\nfind_reached_top=文書先頭に到達したので末尾から続けて検索します\nfind_reached_bottom=文書末尾に到達したので先頭から続けて検索します\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{total}} 件中 {{current}} 件目\nfind_match_count[two]={{total}} 件中 {{current}} 件目\nfind_match_count[few]={{total}} 件中 {{current}} 件目\nfind_match_count[many]={{total}} 件中 {{current}} 件目\nfind_match_count[other]={{total}} 件中 {{current}} 件目\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]={{limit}} 件以上一致\nfind_match_count_limit[one]={{limit}} 件以上一致\nfind_match_count_limit[two]={{limit}} 件以上一致\nfind_match_count_limit[few]={{limit}} 件以上一致\nfind_match_count_limit[many]={{limit}} 件以上一致\nfind_match_count_limit[other]={{limit}} 件以上一致\nfind_not_found=見つかりませんでした\n\n# Error panel labels\nerror_more_info=詳細情報\nerror_less_info=詳細情報を隠す\nerror_close=閉じる\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (ビルド: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=メッセージ: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=スタック: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ファイル: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=行: {{line}}\nrendering_error=ページのレンダリング中にエラーが発生しました。\n\n# Predefined zoom values\npage_scale_width=幅に合わせる\npage_scale_fit=ページのサイズに合わせる\npage_scale_auto=自動ズーム\npage_scale_actual=実際のサイズ\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=PDF の読み込み中にエラーが発生しました。\ninvalid_file_error=無効または破損した PDF ファイル。\nmissing_file_error=PDF ファイルが見つかりません。\nunexpected_response_error=サーバーから予期せぬ応答がありました。\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} 注釈]\npassword_label=この PDF ファイルを開くためのパスワードを入力してください。\npassword_invalid=無効なパスワードです。もう一度やり直してください。\npassword_ok=OK\npassword_cancel=キャンセル\n\nprinting_not_supported=警告: このブラウザーでは印刷が完全にサポートされていません。\nprinting_not_ready=警告: PDF を印刷するための読み込みが終了していません。\nweb_fonts_disabled=ウェブフォントが無効になっています: 埋め込まれた PDF のフォントを使用できません。\n"
  },
  {
    "path": "lib/pdf.js/web/locale/ka/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=წინა გვერდი\nprevious_label=წინა\nnext.title=შემდეგი გვერდი\nnext_label=შემდეგი\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=გვერდი\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}}-დან\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} {{pagesCount}}-დან)\n\nzoom_out.title=ზომის შემცირება\nzoom_out_label=დაშორება\nzoom_in.title=ზომის გაზრდა\nzoom_in_label=მოახლოება\nzoom.title=ზომა\npresentation_mode.title=ჩვენების რეჟიმზე გადართვა\npresentation_mode_label=ჩვენების რეჟიმი\nopen_file.title=ფაილის გახსნა\nopen_file_label=გახსნა\nprint.title=ამობეჭდვა\nprint_label=ამობეჭდვა\ndownload.title=ჩამოტვირთვა\ndownload_label=ჩამოტვირთვა\nbookmark.title=მიმდინარე ხედი (ასლის აღება ან გახსნა ახალ ფანჯარაში)\nbookmark_label=მიმდინარე ხედი\n\n# Secondary toolbar and context menu\ntools.title=ხელსაწყოები\ntools_label=ხელსაწყოები\nfirst_page.title=პირველ გვერდზე გადასვლა\nfirst_page.label=პირველ გვერდზე გადასვლა\nfirst_page_label=პირველ გვერდზე გადასვლა\nlast_page.title=ბოლო გვერდზე გადასვლა\nlast_page.label=ბოლო გვერდზე გადასვლა\nlast_page_label=ბოლო გვერდზე გადასვლა\npage_rotate_cw.title=საათის ისრის მიმართულებით შებრუნება\npage_rotate_cw.label=მარჯვნივ გადაბრუნება\npage_rotate_cw_label=მარჯვნივ გადაბრუნება\npage_rotate_ccw.title=საათის ისრის საპირისპიროდ შებრუნება\npage_rotate_ccw.label=მარცხნივ გადაბრუნება\npage_rotate_ccw_label=მარცხნივ გადაბრუნება\n\ncursor_text_select_tool.title=მოსანიშნი მაჩვენებლის გამოყენება\ncursor_text_select_tool_label=მოსანიშნი მაჩვენებელი\ncursor_hand_tool.title=გადასაადგილებელი მაჩვენებლის გამოყენება\ncursor_hand_tool_label=გადასაადგილებელი\n\nscroll_vertical.title=გვერდების შვეულად ჩვენება\nscroll_vertical_label=შვეული გადაადგილება\nscroll_horizontal.title=გვერდების თარაზულად ჩვენება\nscroll_horizontal_label=განივი გადაადგილება\nscroll_wrapped.title=გვერდების ცხრილურად ჩვენება\nscroll_wrapped_label=ცხრილური გადაადგილება\n\nspread_none.title=ორ გვერდზე გაშლის გარეშე\nspread_none_label=ცალგვერდიანი ჩვენება\nspread_odd.title=ორ გვერდზე გაშლა, კენტი გვერდიდან დაწყებული\nspread_odd_label=ორ გვერდზე კენტიდან\nspread_even.title=ორ გვერდზე გაშლა, ლუწი გვერდიდან დაწყებული\nspread_even_label=ორ გვერდზე ლუწიდან\n\n# Document properties dialog box\ndocument_properties.title=დოკუმენტის შესახებ…\ndocument_properties_label=დოკუმენტის შესახებ…\ndocument_properties_file_name=ფაილის სახელი:\ndocument_properties_file_size=ფაილის მოცულობა:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} კბ ({{size_b}} ბაიტი)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} მბ ({{size_b}} ბაიტი)\ndocument_properties_title=სათაური:\ndocument_properties_author=შემქმნელი:\ndocument_properties_subject=თემა:\ndocument_properties_keywords=საკვანძო სიტყვები:\ndocument_properties_creation_date=შექმნის დრო:\ndocument_properties_modification_date=ჩასწორების დრო:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=გამომშვები:\ndocument_properties_producer=PDF-გამომშვები:\ndocument_properties_version=PDF-ვერსია:\ndocument_properties_page_count=გვერდები:\ndocument_properties_page_size=გვერდის ზომა:\ndocument_properties_page_size_unit_inches=დუიმი\ndocument_properties_page_size_unit_millimeters=მმ\ndocument_properties_page_size_orientation_portrait=შვეულად\ndocument_properties_page_size_orientation_landscape=თარაზულად\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=მსუბუქი ვებჩვენება:\ndocument_properties_linearized_yes=დიახ\ndocument_properties_linearized_no=არა\ndocument_properties_close=დახურვა\n\nprint_progress_message=დოკუმენტი მზადდება ამოსაბეჭდად…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=გაუქმება\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=გვერდითა ზოლის გამოჩენა/დამალვა\ntoggle_sidebar_notification.title=გვერდითა ზოლის გამოჩენა (შეიცავს სარჩევს/დანართს)\ntoggle_sidebar_notification2.title=გვერდითი ზოლის გამოჩენა (შეიცავს სარჩევს/დანართს/ფენებს)\ntoggle_sidebar_label=გვერდითა ზოლის გამოჩენა/დამალვა\ndocument_outline.title=დოკუმენტის სარჩევის ჩვენება (ორმაგი წკაპით თითოეულის ჩამოშლა/აკეცვა)\ndocument_outline_label=დოკუმენტის სარჩევი\nattachments.title=დანართების ჩვენება\nattachments_label=დანართები\nlayers.title=ფენების გამოჩენა (ორმაგი წკაპით ყველა ფენის ნაგულისხმევზე დაბრუნება)\nlayers_label=ფენები\nthumbs.title=შეთვალიერება\nthumbs_label=ესკიზები\ncurrent_outline_item.title=მიმდინარე გვერდის მონახვა სარჩევში\ncurrent_outline_item_label=მიმდინარე გვერდი სარჩევში\nfindbar.title=პოვნა დოკუმენტში\nfindbar_label=ძიება\n\nadditional_layers=დამატებითი ფენები\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=გვერდი {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=გვერდი {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=გვერდის შეთვალიერება {{page}}\n\n# Find panel button title and messages\nfind_input.title=ძიება\nfind_input.placeholder=პოვნა დოკუმენტში…\nfind_previous.title=ფრაზის წინა კონტექსტის პოვნა\nfind_previous_label=წინა\nfind_next.title=ფრაზის შემდეგი კონტექსტის პოვნა\nfind_next_label=შემდეგი\nfind_highlight=ყველას მონიშვნა\nfind_match_case_label=ემთხვევა მთავრული\nfind_entire_word_label=მთლიანი სიტყვები\nfind_reached_top=მიღწეულია დოკუმენტის დასაწყისი, გრძელდება ბოლოდან\nfind_reached_bottom=მიღწეულია დოკუმენტის ბოლო, გრძელდება დასაწყისიდან\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} / {{total}} თანხვედრიდან\nfind_match_count[two]={{current}} / {{total}} თანხვედრიდან\nfind_match_count[few]={{current}} / {{total}} თანხვედრიდან\nfind_match_count[many]={{current}} / {{total}} თანხვედრიდან\nfind_match_count[other]={{current}} / {{total}} თანხვედრიდან\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]={{limit}}-ზე მეტი თანხვედრა\nfind_match_count_limit[one]={{limit}}-ზე მეტი თანხვედრა\nfind_match_count_limit[two]={{limit}}-ზე მეტი თანხვედრა\nfind_match_count_limit[few]={{limit}}-ზე მეტი თანხვედრა\nfind_match_count_limit[many]={{limit}}-ზე მეტი თანხვედრა\nfind_match_count_limit[other]={{limit}}-ზე მეტი თანხვედრა\nfind_not_found=ფრაზა ვერ მოიძებნა\n\n# Error panel labels\nerror_more_info=ვრცლად\nerror_less_info=შემოკლებულად\nerror_close=დახურვა\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=შეტყობინება: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=სტეკი: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ფაილი: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=ხაზი: {{line}}\nrendering_error=შეცდომა, გვერდის ჩვენებისას.\n\n# Predefined zoom values\npage_scale_width=გვერდის სიგანეზე\npage_scale_fit=მთლიანი გვერდი\npage_scale_auto=ავტომატური\npage_scale_actual=საწყისი ზომა\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=შეცდომა, PDF-ფაილის ჩატვირთვისას.\ninvalid_file_error=არამართებული ან დაზიანებული PDF-ფაილი.\nmissing_file_error=ნაკლული PDF-ფაილი.\nunexpected_response_error=სერვერის მოულოდნელი პასუხი.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} შენიშვნა]\npassword_label=შეიყვანეთ პაროლი PDF-ფაილის გასახსნელად.\npassword_invalid=არასწორი პაროლი. გთხოვთ, სცადოთ ხელახლა.\npassword_ok=კარგი\npassword_cancel=გაუქმება\n\nprinting_not_supported=გაფრთხილება: ამობეჭდვა ამ ბრაუზერში არაა სრულად მხარდაჭერილი.\nprinting_not_ready=გაფრთხილება: PDF სრულად ჩატვირთული არაა, ამობეჭდვის დასაწყებად.\nweb_fonts_disabled=ვებშრიფტები გამორთულია: ჩაშენებული PDF-შრიფტების გამოყენება ვერ ხერხდება.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/kab/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Asebter azewwar\nprevious_label=Azewwar\nnext.title=Asebter d-iteddun\nnext_label=Ddu ɣer zdat\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Asebter\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=ɣef {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} n {{pagesCount}})\n\nzoom_out.title=Semẓi\nzoom_out_label=Semẓi\nzoom_in.title=Semɣeṛ\nzoom_in_label=Semɣeṛ\nzoom.title=Semɣeṛ/Semẓi\npresentation_mode.title=Uɣal ɣer Uskar Tihawt\npresentation_mode_label=Askar Tihawt\nopen_file.title=Ldi Afaylu\nopen_file_label=Ldi\nprint.title=Siggez\nprint_label=Siggez\ndownload.title=Sader\ndownload_label=Azdam\nbookmark.title=Timeẓri tamirant (nɣel neɣ ldi ɣef usfaylu amaynut)\nbookmark_label=Askan amiran\n\n# Secondary toolbar and context menu\ntools.title=Ifecka\ntools_label=Ifecka\nfirst_page.title=Ddu ɣer usebter amezwaru\nfirst_page.label=Ddu ɣer usebter amezwaru\nfirst_page_label=Ddu ɣer usebter amezwaru\nlast_page.title=Ddu ɣer usebter aneggaru\nlast_page.label=Ddu ɣer usebter aneggaru\nlast_page_label=Ddu ɣer usebter aneggaru\npage_rotate_cw.title=Tuzzya tusrigt\npage_rotate_cw.label=Tuzzya tusrigt\npage_rotate_cw_label=Tuzzya tusrigt\npage_rotate_ccw.title=Tuzzya amgal-usrig\npage_rotate_ccw.label=Tuzzya amgal-usrig\npage_rotate_ccw_label=Tuzzya amgal-usrig\n\ncursor_text_select_tool.title=Rmed afecku n tefrant n uḍris\ncursor_text_select_tool_label=Afecku n tefrant n uḍris\ncursor_hand_tool.title=Rmed afecku afus\ncursor_hand_tool_label=Afecku afus\n\nscroll_vertical.title=Seqdec adrurem ubdid\nscroll_vertical_label=Adrurem ubdid\nscroll_horizontal.title=Seqdec adrurem aglawan\nscroll_horizontal_label=Adrurem aglawan\nscroll_wrapped.title=Seqdec adrurem yuẓen\nscroll_wrapped_label=Adrurem yuẓen\n\nspread_none.title=Ur sedday ara isiɣzaf n usebter\nspread_none_label=Ulac isiɣzaf\nspread_odd.title=Seddu isiɣzaf n usebter ibeddun s yisebtar irayuganen\nspread_odd_label=Isiɣzaf irayuganen\nspread_even.title=Seddu isiɣzaf n usebter ibeddun s yisebtar iyuganen\nspread_even_label=Isiɣzaf iyuganen\n\n# Document properties dialog box\ndocument_properties.title=Taɣaṛa n isemli…\ndocument_properties_label=Taɣaṛa n isemli…\ndocument_properties_file_name=Isem n ufaylu:\ndocument_properties_file_size=Teɣzi n ufaylu:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KAṬ ({{size_b}} ibiten)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MAṬ ({{size_b}} iṭamḍanen)\ndocument_properties_title=Azwel:\ndocument_properties_author=Ameskar:\ndocument_properties_subject=Amgay:\ndocument_properties_keywords=Awalen n tsaruţ\ndocument_properties_creation_date=Azemz n tmerna:\ndocument_properties_modification_date=Azemz n usnifel:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Yerna-t:\ndocument_properties_producer=Afecku n uselket PDF:\ndocument_properties_version=Lqem PDF:\ndocument_properties_page_count=Amḍan n yisebtar:\ndocument_properties_page_size=Tuγzi n usebter:\ndocument_properties_page_size_unit_inches=deg\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=s teɣzi\ndocument_properties_page_size_orientation_landscape=s tehri\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Asekkil\ndocument_properties_page_size_name_legal=Usḍif\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Taskant Web taruradt:\ndocument_properties_linearized_yes=Ih\ndocument_properties_linearized_no=Ala\ndocument_properties_close=Mdel\n\nprint_progress_message=Aheggi i usiggez n isemli…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Sefsex\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Sken/Fer agalis adisan\ntoggle_sidebar_notification.title=Ffer/Sken agalis adisan (isemli yegber aɣawas/imeddayen)\ntoggle_sidebar_notification2.title=Ffer/Sekn agalis adisan (isemli yegber aɣawas/ticeqqufin yeddan/tissiwin)\ntoggle_sidebar_label=Sken/Fer agalis adisan\ndocument_outline.title=Sken isemli (Senned snat tikal i wesemɣer/Afneẓ n iferdisen meṛṛa)\ndocument_outline_label=Isɣalen n isebtar\nattachments.title=Sken ticeqqufin yeddan\nattachments_label=Ticeqqufin yeddan\nlayers.title=Skeen tissiwin (sit sin yiberdan i uwennez n meṛṛa tissiwin ɣer waddad amezwer)\nlayers_label=Tissiwin\nthumbs.title=Sken tanfult.\nthumbs_label=Tinfulin\ncurrent_outline_item.title=Af-d aferdis n uɣawas amiran\ncurrent_outline_item_label=Aferdis n uɣawas amiran\nfindbar.title=Nadi deg isemli\nfindbar_label=Nadi\n\nadditional_layers=Tissiwin-nniḍen\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Asebter {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Asebter {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Tanfult n usebter {{page}}\n\n# Find panel button title and messages\nfind_input.title=Nadi\nfind_input.placeholder=Nadi deg isemli…\nfind_previous.title=Aff-d tamseḍriwt n twinest n deffir\nfind_previous_label=Azewwar\nfind_next.title=Aff-d timseḍriwt n twinest d-iteddun\nfind_next_label=Ddu ɣer zdat\nfind_highlight=Err izirig imaṛṛa\nfind_match_case_label=Qadeṛ amasal n isekkilen\nfind_entire_word_label=Awalen iččuranen\nfind_reached_top=Yabbeḍ s afella n usebter, tuɣalin s wadda\nfind_reached_bottom=Tebḍeḍ s adda n usebter, tuɣalin s afella\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} seg {{total}} n tmeɣṛuḍin\nfind_match_count[two]={{current}} seg {{total}} n tmeɣṛuḍin\nfind_match_count[few]={{current}} seg {{total}} n tmeɣṛuḍin\nfind_match_count[many]={{current}} seg {{total}} n tmeɣṛuḍin\nfind_match_count[other]={{current}} seg {{total}} n tmeɣṛuḍin\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Ugar n {{limit}} n tmeɣṛuḍin\nfind_match_count_limit[one]=Ugar n {{limit}} n tmeɣṛuḍin\nfind_match_count_limit[two]=Ugar n {{limit}} n tmeɣṛuḍin\nfind_match_count_limit[few]=Ugar n {{limit}} n tmeɣṛuḍin\nfind_match_count_limit[many]=Ugar n {{limit}} n tmeɣṛuḍin\nfind_match_count_limit[other]=Ugar n {{limit}} n tmeɣṛuḍin\nfind_not_found=Ulac tawinest\n\n# Error panel labels\nerror_more_info=Ugar n telɣut\nerror_less_info=Drus n isalen\nerror_close=Mdel\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Izen: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Tanebdant: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Afaylu: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Izirig: {{line}}\nrendering_error=Teḍra-d tuccḍa deg uskan n usebter.\n\n# Predefined zoom values\npage_scale_width=Tehri n usebter\npage_scale_fit=Asebter imaṛṛa\npage_scale_auto=Asemɣeṛ/Asemẓi awurman\npage_scale_actual=Teɣzi tilawt\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Teḍra-d tuccḍa deg alluy n PDF:\ninvalid_file_error=Afaylu PDF arameɣtu neɣ yexṣeṛ.\nmissing_file_error=Ulac afaylu PDF.\nunexpected_response_error=Aqeddac yerra-d yir tiririt ur nettwaṛǧi ara.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Tabzimt {{type}}]\npassword_label=Sekcem awal uffir akken ad ldiḍ afaylu-yagi PDF\npassword_invalid=Awal uffir mačči d ameɣtu, Ɛreḍ tikelt-nniḍen.\npassword_ok=IH\npassword_cancel=Sefsex\n\nprinting_not_supported=Ɣuṛ-k: Asiggez ur ittusefrak ara yakan imaṛṛa deg iminig-a.\nprinting_not_ready=Ɣuṛ-k: Afaylu PDF ur d-yuli ara imeṛṛa akken ad ittusiggez.\nweb_fonts_disabled=Tisefsiyin web ttwassensent; D awezɣi useqdec n tsefsiyin yettwarnan ɣer PDF.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/kk/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Алдыңғы парақ\nprevious_label=Алдыңғысы\nnext.title=Келесі парақ\nnext_label=Келесі\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Парақ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} ішінен\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=(парақ {{pageNumber}}, {{pagesCount}} ішінен)\n\nzoom_out.title=Кішірейту\nzoom_out_label=Кішірейту\nzoom_in.title=Үлкейту\nzoom_in_label=Үлкейту\nzoom.title=Масштаб\npresentation_mode.title=Презентация режиміне ауысу\npresentation_mode_label=Презентация режимі\nopen_file.title=Файлды ашу\nopen_file_label=Ашу\nprint.title=Баспаға шығару\nprint_label=Баспаға шығару\ndownload.title=Жүктеп алу\ndownload_label=Жүктеп алу\nbookmark.title=Ағымдағы көрініс (көшіру не жаңа терезеде ашу)\nbookmark_label=Ағымдағы көрініс\n\n# Secondary toolbar and context menu\ntools.title=Құралдар\ntools_label=Құралдар\nfirst_page.title=Алғашқы параққа өту\nfirst_page.label=Алғашқы параққа өту\nfirst_page_label=Алғашқы параққа өту\nlast_page.title=Соңғы параққа өту\nlast_page.label=Соңғы параққа өту\nlast_page_label=Соңғы параққа өту\npage_rotate_cw.title=Сағат тілі бағытымен айналдыру\npage_rotate_cw.label=Сағат тілі бағытымен бұру\npage_rotate_cw_label=Сағат тілі бағытымен бұру\npage_rotate_ccw.title=Сағат тілі бағытына қарсы бұру\npage_rotate_ccw.label=Сағат тілі бағытына қарсы бұру\npage_rotate_ccw_label=Сағат тілі бағытына қарсы бұру\n\ncursor_text_select_tool.title=Мәтінді таңдау құралын іске қосу\ncursor_text_select_tool_label=Мәтінді таңдау құралы\ncursor_hand_tool.title=Қол құралын іске қосу\ncursor_hand_tool_label=Қол құралы\n\nscroll_vertical.title=Вертикалды айналдыруды қолдану\nscroll_vertical_label=Вертикалды айналдыру\nscroll_horizontal.title=Горизонталды айналдыруды қолдану\nscroll_horizontal_label=Горизонталды айналдыру\nscroll_wrapped.title=Масштабталатын айналдыруды қолдану\nscroll_wrapped_label=Масштабталатын айналдыру\n\nspread_none.title=Жазық беттер режимін қолданбау\nspread_none_label=Жазық беттер режимсіз\nspread_odd.title=Жазық беттер тақ нөмірлі беттерден басталады\nspread_odd_label=Тақ нөмірлі беттер сол жақтан\nspread_even.title=Жазық беттер жұп нөмірлі беттерден басталады\nspread_even_label=Жұп нөмірлі беттер сол жақтан\n\n# Document properties dialog box\ndocument_properties.title=Құжат қасиеттері…\ndocument_properties_label=Құжат қасиеттері…\ndocument_properties_file_name=Файл аты:\ndocument_properties_file_size=Файл өлшемі:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} КБ ({{size_b}} байт)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} МБ ({{size_b}} байт)\ndocument_properties_title=Тақырыбы:\ndocument_properties_author=Авторы:\ndocument_properties_subject=Тақырыбы:\ndocument_properties_keywords=Кілт сөздер:\ndocument_properties_creation_date=Жасалған күні:\ndocument_properties_modification_date=Түзету күні:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Жасаған:\ndocument_properties_producer=PDF өндірген:\ndocument_properties_version=PDF нұсқасы:\ndocument_properties_page_count=Беттер саны:\ndocument_properties_page_size=Бет өлшемі:\ndocument_properties_page_size_unit_inches=дюйм\ndocument_properties_page_size_unit_millimeters=мм\ndocument_properties_page_size_orientation_portrait=тік\ndocument_properties_page_size_orientation_landscape=жатық\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Жылдам Web көрінісі:\ndocument_properties_linearized_yes=Иә\ndocument_properties_linearized_no=Жоқ\ndocument_properties_close=Жабу\n\nprint_progress_message=Құжатты баспаға шығару үшін дайындау…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Бас тарту\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Бүйір панелін көрсету/жасыру\ntoggle_sidebar_notification.title=Бүйір панелін көрсету/жасыру (құжатта құрылымы/салынымдар бар)\ntoggle_sidebar_notification2.title=Бүйір панелін көрсету/жасыру (құжатта құрылымы/салынымдар/қабаттар бар)\ntoggle_sidebar_label=Бүйір панелін көрсету/жасыру\ndocument_outline.title=Құжат құрылымын көрсету (барлық нәрселерді жазық қылу/жинау үшін қос шерту керек)\ndocument_outline_label=Құжат құрамасы\nattachments.title=Салынымдарды көрсету\nattachments_label=Салынымдар\nlayers.title=Қабаттарды көрсету (барлық қабаттарды бастапқы күйге келтіру үшін екі рет шертіңіз)\nlayers_label=Қабаттар\nthumbs.title=Кіші көріністерді көрсету\nthumbs_label=Кіші көріністер\ncurrent_outline_item.title=Құрылымның ағымдағы элементін табу\ncurrent_outline_item_label=Құрылымның ағымдағы элементі\nfindbar.title=Құжаттан табу\nfindbar_label=Табу\n\nadditional_layers=Қосымша қабаттар\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Бет {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}} парағы\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} парағы үшін кіші көрінісі\n\n# Find panel button title and messages\nfind_input.title=Табу\nfind_input.placeholder=Құжаттан табу…\nfind_previous.title=Осы сөздердің мәтіннен алдыңғы кездесуін табу\nfind_previous_label=Алдыңғысы\nfind_next.title=Осы сөздердің мәтіннен келесі кездесуін табу\nfind_next_label=Келесі\nfind_highlight=Барлығын түспен ерекшелеу\nfind_match_case_label=Регистрді ескеру\nfind_entire_word_label=Сөздер толығымен\nfind_reached_top=Құжаттың басына жеттік, соңынан бастап жалғастырамыз\nfind_reached_bottom=Құжаттың соңына жеттік, басынан бастап жалғастырамыз\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} / {{total}} сәйкестік\nfind_match_count[two]={{current}} / {{total}} сәйкестік\nfind_match_count[few]={{current}} / {{total}} сәйкестік\nfind_match_count[many]={{current}} / {{total}} сәйкестік\nfind_match_count[other]={{current}} / {{total}} сәйкестік\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]={{limit}} сәйкестіктен көп\nfind_match_count_limit[one]={{limit}} сәйкестіктен көп\nfind_match_count_limit[two]={{limit}} сәйкестіктен көп\nfind_match_count_limit[few]={{limit}} сәйкестіктен көп\nfind_match_count_limit[many]={{limit}} сәйкестіктен көп\nfind_match_count_limit[other]={{limit}} сәйкестіктен көп\nfind_not_found=Сөз(дер) табылмады\n\n# Error panel labels\nerror_more_info=Көбірек ақпарат\nerror_less_info=Азырақ ақпарат\nerror_close=Жабу\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (жинақ: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Хабарлама: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стек: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Файл: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Жол: {{line}}\nrendering_error=Парақты өңдеу кезінде қате кетті.\n\n# Predefined zoom values\npage_scale_width=Парақ ені\npage_scale_fit=Парақты сыйдыру\npage_scale_auto=Автомасштабтау\npage_scale_actual=Нақты өлшемі\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=PDF жүктеу кезінде қате кетті.\ninvalid_file_error=Зақымдалған немесе қате PDF файл.\nmissing_file_error=PDF файлы жоқ.\nunexpected_response_error=Сервердің күтпеген жауабы.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} аңдатпасы]\npassword_label=Бұл PDF файлын ашу үшін парольді енгізіңіз.\npassword_invalid=Пароль дұрыс емес. Қайталап көріңіз.\npassword_ok=ОК\npassword_cancel=Бас тарту\n\nprinting_not_supported=Ескерту: Баспаға шығаруды бұл браузер толығымен қолдамайды.\nprinting_not_ready=Ескерту: Баспаға шығару үшін, бұл PDF толығымен жүктеліп алынбады.\nweb_fonts_disabled=Веб қаріптері сөндірілген: құрамына енгізілген PDF қаріптерін қолдану мүмкін емес.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/km/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=ទំព័រ​មុន\nprevious_label=មុន\nnext.title=ទំព័រ​បន្ទាប់\nnext_label=បន្ទាប់\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=ទំព័រ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=នៃ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} នៃ {{pagesCount}})\n\nzoom_out.title=​បង្រួម\nzoom_out_label=​បង្រួម\nzoom_in.title=​ពង្រីក\nzoom_in_label=​ពង្រីក\nzoom.title=ពង្រីក\npresentation_mode.title=ប្ដូរ​ទៅ​របៀប​បទ​បង្ហាញ\npresentation_mode_label=របៀប​បទ​បង្ហាញ\nopen_file.title=បើក​ឯកសារ\nopen_file_label=បើក\nprint.title=បោះពុម្ព\nprint_label=បោះពុម្ព\ndownload.title=ទាញ​យក\ndownload_label=ទាញ​យក\nbookmark.title=ទិដ្ឋភាព​បច្ចុប្បន្ន (ចម្លង ឬ​បើក​នៅ​ក្នុង​បង្អួច​ថ្មី)\nbookmark_label=ទិដ្ឋភាព​បច្ចុប្បន្ន\n\n# Secondary toolbar and context menu\ntools.title=ឧបករណ៍\ntools_label=ឧបករណ៍\nfirst_page.title=ទៅកាន់​ទំព័រ​ដំបូង​\nfirst_page.label=ទៅកាន់​ទំព័រ​ដំបូង​\nfirst_page_label=ទៅកាន់​ទំព័រ​ដំបូង​\nlast_page.title=ទៅកាន់​ទំព័រ​ចុងក្រោយ​\nlast_page.label=ទៅកាន់​ទំព័រ​ចុងក្រោយ​\nlast_page_label=ទៅកាន់​ទំព័រ​ចុងក្រោយ\npage_rotate_cw.title=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា\npage_rotate_cw.label=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា\npage_rotate_cw_label=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា\npage_rotate_ccw.title=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​\npage_rotate_ccw.label=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​\npage_rotate_ccw_label=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​\n\ncursor_text_select_tool.title=បើក​ឧបករណ៍​ជ្រើស​អត្ថបទ\ncursor_text_select_tool_label=ឧបករណ៍​ជ្រើស​អត្ថបទ\ncursor_hand_tool.title=បើក​ឧបករណ៍​ដៃ\ncursor_hand_tool_label=ឧបករណ៍​ដៃ\n\n\n\n# Document properties dialog box\ndocument_properties.title=លក្ខណ​សម្បត្តិ​ឯកសារ…\ndocument_properties_label=លក្ខណ​សម្បត្តិ​ឯកសារ…\ndocument_properties_file_name=ឈ្មោះ​ឯកសារ៖\ndocument_properties_file_size=ទំហំ​ឯកសារ៖\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} បៃ)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} បៃ)\ndocument_properties_title=ចំណងជើង៖\ndocument_properties_author=អ្នក​និពន្ធ៖\ndocument_properties_subject=ប្រធានបទ៖\ndocument_properties_keywords=ពាក្យ​គន្លឹះ៖\ndocument_properties_creation_date=កាលបរិច្ឆេទ​បង្កើត៖\ndocument_properties_modification_date=កាលបរិច្ឆេទ​កែប្រែ៖\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=អ្នក​បង្កើត៖\ndocument_properties_producer=កម្មវិធី​បង្កើត PDF ៖\ndocument_properties_version=កំណែ PDF ៖\ndocument_properties_page_count=ចំនួន​ទំព័រ៖\ndocument_properties_page_size_unit_inches=អ៊ីញ\ndocument_properties_page_size_unit_millimeters=មម\ndocument_properties_page_size_orientation_portrait=បញ្ឈរ\ndocument_properties_page_size_orientation_landscape=ផ្តេក\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=សំបុត្រ\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized_yes=បាទ/ចាស\ndocument_properties_linearized_no=ទេ\ndocument_properties_close=បិទ\n\nprint_progress_message=កំពុង​រៀបចំ​ឯកសារ​សម្រាប់​បោះពុម្ព…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=បោះបង់\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=បិទ/បើក​គ្រាប់​រំកិល\ntoggle_sidebar_notification.title=បិទ/បើក​របារ​ចំហៀង (ឯកសារ​មាន​មាតិកា​នៅ​ក្រៅ/attachments)\ntoggle_sidebar_label=បិទ/បើក​គ្រាប់​រំកិល\ndocument_outline.title=បង្ហាញ​គ្រោង​ឯកសារ (ចុច​ទ្វេ​ដង​ដើម្បី​ពង្រីក/បង្រួម​ធាតុ​ទាំងអស់)\ndocument_outline_label=គ្រោង​ឯកសារ\nattachments.title=បង្ហាញ​ឯកសារ​ភ្ជាប់\nattachments_label=ឯកសារ​ភ្ជាប់\nthumbs.title=បង្ហាញ​រូបភាព​តូចៗ\nthumbs_label=រួបភាព​តូចៗ\nfindbar.title=រក​នៅ​ក្នុង​ឯកសារ\nfindbar_label=រក\n\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=ទំព័រ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=រូបភាព​តូច​របស់​ទំព័រ {{page}}\n\n# Find panel button title and messages\nfind_input.title=រក\nfind_input.placeholder=រក​នៅ​ក្នុង​ឯកសារ...\nfind_previous.title=រក​ពាក្យ ឬ​ឃ្លា​ដែល​បាន​ជួប​មុន\nfind_previous_label=មុន\nfind_next.title=រក​ពាក្យ ឬ​ឃ្លា​ដែល​បាន​ជួប​បន្ទាប់\nfind_next_label=បន្ទាប់\nfind_highlight=បន្លិច​ទាំងអស់\nfind_match_case_label=ករណី​ដំណូច\nfind_reached_top=បាន​បន្ត​ពី​ខាង​ក្រោម ទៅ​ដល់​ខាង​​លើ​នៃ​ឯកសារ\nfind_reached_bottom=បាន​បន្ត​ពី​ខាងលើ ទៅដល់​ចុង​​នៃ​ឯកសារ\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_not_found=រក​មិន​ឃើញ​ពាក្យ ឬ​ឃ្លា\n\n# Error panel labels\nerror_more_info=ព័ត៌មាន​បន្ថែម\nerror_less_info=ព័ត៌មាន​តិចតួច\nerror_close=បិទ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=សារ ៖ {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=ជង់ ៖ {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ឯកសារ ៖ {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=ជួរ ៖ {{line}}\nrendering_error=មាន​កំហុស​បាន​កើតឡើង​ពេល​បង្ហាញ​ទំព័រ ។\n\n# Predefined zoom values\npage_scale_width=ទទឹង​ទំព័រ\npage_scale_fit=សម​ទំព័រ\npage_scale_auto=ពង្រីក​ស្វ័យប្រវត្តិ\npage_scale_actual=ទំហំ​ជាក់ស្ដែង\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=មាន​កំហុស​បាន​កើតឡើង​ពេល​កំពុង​ផ្ទុក PDF ។\ninvalid_file_error=ឯកសារ PDF ខូច ឬ​មិន​ត្រឹមត្រូវ ។\nmissing_file_error=បាត់​ឯកសារ PDF\nunexpected_response_error=ការ​ឆ្លើយ​តម​ម៉ាស៊ីន​មេ​ដែល​មិន​បាន​រំពឹង។\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} ចំណារ​ពន្យល់]\npassword_label=បញ្ចូល​ពាក្យសម្ងាត់​ដើម្បី​បើក​ឯកសារ PDF នេះ។\npassword_invalid=ពាក្យសម្ងាត់​មិន​ត្រឹមត្រូវ។ សូម​ព្យាយាម​ម្ដងទៀត។\npassword_ok=យល់​ព្រម\npassword_cancel=បោះបង់\n\nprinting_not_supported=ការ​ព្រមាន ៖ កា​រ​បោះពុម្ព​មិន​ត្រូវ​បាន​គាំទ្រ​ពេញលេញ​ដោយ​កម្មវិធី​រុករក​នេះ​ទេ ។\nprinting_not_ready=ព្រមាន៖ PDF មិន​ត្រូវ​បាន​ផ្ទុក​ទាំងស្រុង​ដើម្បី​បោះពុម្ព​ទេ។\nweb_fonts_disabled=បាន​បិទ​ពុម្ពអក្សរ​បណ្ដាញ ៖ មិន​អាច​ប្រើ​ពុម្ពអក្សរ PDF ដែល​បាន​បង្កប់​បាន​ទេ ។\n"
  },
  {
    "path": "lib/pdf.js/web/locale/kn/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=ಹಿಂದಿನ ಪುಟ\nprevious_label=ಹಿಂದಿನ\nnext.title=ಮುಂದಿನ ಪುಟ\nnext_label=ಮುಂದಿನ\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=ಪುಟ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} ರಲ್ಲಿ\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pagesCount}} ರಲ್ಲಿ {{pageNumber}})\n\nzoom_out.title=ಕಿರಿದಾಗಿಸು\nzoom_out_label=ಕಿರಿದಾಗಿಸಿ\nzoom_in.title=ಹಿರಿದಾಗಿಸು\nzoom_in_label=ಹಿರಿದಾಗಿಸಿ\nzoom.title=ಗಾತ್ರಬದಲಿಸು\npresentation_mode.title=ಪ್ರಸ್ತುತಿ (ಪ್ರಸೆಂಟೇಶನ್) ಕ್ರಮಕ್ಕೆ ಬದಲಾಯಿಸು\npresentation_mode_label=ಪ್ರಸ್ತುತಿ (ಪ್ರಸೆಂಟೇಶನ್) ಕ್ರಮ\nopen_file.title=ಕಡತವನ್ನು ತೆರೆ\nopen_file_label=ತೆರೆಯಿರಿ\nprint.title=ಮುದ್ರಿಸು\nprint_label=ಮುದ್ರಿಸಿ\ndownload.title=ಇಳಿಸು\ndownload_label=ಇಳಿಸಿಕೊಳ್ಳಿ\nbookmark.title=ಪ್ರಸಕ್ತ ನೋಟ (ಪ್ರತಿ ಮಾಡು ಅಥವ ಹೊಸ ಕಿಟಕಿಯಲ್ಲಿ ತೆರೆ)\nbookmark_label=ಪ್ರಸಕ್ತ ನೋಟ\n\n# Secondary toolbar and context menu\ntools.title=ಉಪಕರಣಗಳು\ntools_label=ಉಪಕರಣಗಳು\nfirst_page.title=ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು\nfirst_page.label=ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು\nfirst_page_label=ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು\nlast_page.title=ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು\nlast_page.label=ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು\nlast_page_label=ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು\npage_rotate_cw.title=ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು\npage_rotate_cw.label=ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು\npage_rotate_cw_label=ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು\npage_rotate_ccw.title=ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು\npage_rotate_ccw.label=ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು\npage_rotate_ccw_label=ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು\n\ncursor_text_select_tool.title=ಪಠ್ಯ ಆಯ್ಕೆ ಉಪಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ\ncursor_text_select_tool_label=ಪಠ್ಯ ಆಯ್ಕೆಯ ಉಪಕರಣ\ncursor_hand_tool.title=ಕೈ ಉಪಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ\ncursor_hand_tool_label=ಕೈ ಉಪಕರಣ\n\n\n\n# Document properties dialog box\ndocument_properties.title=ಡಾಕ್ಯುಮೆಂಟ್‌ ಗುಣಗಳು...\ndocument_properties_label=ಡಾಕ್ಯುಮೆಂಟ್‌ ಗುಣಗಳು...\ndocument_properties_file_name=ಕಡತದ ಹೆಸರು:\ndocument_properties_file_size=ಕಡತದ ಗಾತ್ರ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} ಬೈಟ್‍ಗಳು)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} ಬೈಟ್‍ಗಳು)\ndocument_properties_title=ಶೀರ್ಷಿಕೆ:\ndocument_properties_author=ಕರ್ತೃ:\ndocument_properties_subject=ವಿಷಯ:\ndocument_properties_keywords=ಮುಖ್ಯಪದಗಳು:\ndocument_properties_creation_date=ರಚಿಸಿದ ದಿನಾಂಕ:\ndocument_properties_modification_date=ಮಾರ್ಪಡಿಸಲಾದ ದಿನಾಂಕ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=ರಚಿಸಿದವರು:\ndocument_properties_producer=PDF ಉತ್ಪಾದಕ:\ndocument_properties_version=PDF ಆವೃತ್ತಿ:\ndocument_properties_page_count=ಪುಟದ ಎಣಿಕೆ:\ndocument_properties_page_size_unit_inches=ಇದರಲ್ಲಿ\ndocument_properties_page_size_orientation_portrait=ಭಾವಚಿತ್ರ\ndocument_properties_page_size_orientation_landscape=ಪ್ರಕೃತಿ ಚಿತ್ರ\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_close=ಮುಚ್ಚು\n\nprint_progress_message=ಮುದ್ರಿಸುವುದಕ್ಕಾಗಿ ದಸ್ತಾವೇಜನ್ನು ಸಿದ್ಧಗೊಳಿಸಲಾಗುತ್ತಿದೆ…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=ರದ್ದು ಮಾಡು\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=ಬದಿಪಟ್ಟಿಯನ್ನು ಹೊರಳಿಸು\ntoggle_sidebar_label=ಬದಿಪಟ್ಟಿಯನ್ನು ಹೊರಳಿಸು\ndocument_outline_label=ದಸ್ತಾವೇಜಿನ ಹೊರರೇಖೆ\nattachments.title=ಲಗತ್ತುಗಳನ್ನು ತೋರಿಸು\nattachments_label=ಲಗತ್ತುಗಳು\nthumbs.title=ಚಿಕ್ಕಚಿತ್ರದಂತೆ ತೋರಿಸು\nthumbs_label=ಚಿಕ್ಕಚಿತ್ರಗಳು\nfindbar.title=ದಸ್ತಾವೇಜಿನಲ್ಲಿ ಹುಡುಕು\nfindbar_label=ಹುಡುಕು\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=ಪುಟ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=ಪುಟವನ್ನು ಚಿಕ್ಕಚಿತ್ರದಂತೆ ತೋರಿಸು {{page}}\n\n# Find panel button title and messages\nfind_input.title=ಹುಡುಕು\nfind_input.placeholder=ದಸ್ತಾವೇಜಿನಲ್ಲಿ ಹುಡುಕು…\nfind_previous.title=ವಾಕ್ಯದ ಹಿಂದಿನ ಇರುವಿಕೆಯನ್ನು ಹುಡುಕು\nfind_previous_label=ಹಿಂದಿನ\nfind_next.title=ವಾಕ್ಯದ ಮುಂದಿನ ಇರುವಿಕೆಯನ್ನು ಹುಡುಕು\nfind_next_label=ಮುಂದಿನ\nfind_highlight=ಎಲ್ಲವನ್ನು ಹೈಲೈಟ್ ಮಾಡು\nfind_match_case_label=ಕೇಸನ್ನು ಹೊಂದಿಸು\nfind_reached_top=ದಸ್ತಾವೇಜಿನ ಮೇಲ್ಭಾಗವನ್ನು ತಲುಪಿದೆ, ಕೆಳಗಿನಿಂದ ಆರಂಭಿಸು\nfind_reached_bottom=ದಸ್ತಾವೇಜಿನ ಕೊನೆಯನ್ನು ತಲುಪಿದೆ, ಮೇಲಿನಿಂದ ಆರಂಭಿಸು\nfind_not_found=ವಾಕ್ಯವು ಕಂಡು ಬಂದಿಲ್ಲ\n\n# Error panel labels\nerror_more_info=ಹೆಚ್ಚಿನ ಮಾಹಿತಿ\nerror_less_info=ಕಡಿಮೆ ಮಾಹಿತಿ\nerror_close=ಮುಚ್ಚು\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=ಸಂದೇಶ: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=ರಾಶಿ: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ಕಡತ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=ಸಾಲು: {{line}}\nrendering_error=ಪುಟವನ್ನು ನಿರೂಪಿಸುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ.\n\n# Predefined zoom values\npage_scale_width=ಪುಟದ ಅಗಲ\npage_scale_fit=ಪುಟದ ಸರಿಹೊಂದಿಕೆ\npage_scale_auto=ಸ್ವಯಂಚಾಲಿತ ಗಾತ್ರಬದಲಾವಣೆ\npage_scale_actual=ನಿಜವಾದ ಗಾತ್ರ\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=PDF ಅನ್ನು ಲೋಡ್ ಮಾಡುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ.\ninvalid_file_error=ಅಮಾನ್ಯವಾದ ಅಥವ ಹಾಳಾದ PDF ಕಡತ.\nmissing_file_error=PDF ಕಡತ ಇಲ್ಲ.\nunexpected_response_error=ಅನಿರೀಕ್ಷಿತವಾದ ಪೂರೈಕೆಗಣಕದ ಪ್ರತಿಕ್ರಿಯೆ.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} ಟಿಪ್ಪಣಿ]\npassword_label=PDF ಅನ್ನು ತೆರೆಯಲು ಗುಪ್ತಪದವನ್ನು ನಮೂದಿಸಿ.\npassword_invalid=ಅಮಾನ್ಯವಾದ ಗುಪ್ತಪದ, ದಯವಿಟ್ಟು ಇನ್ನೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.\npassword_ok=OK\npassword_cancel=ರದ್ದು ಮಾಡು\n\nprinting_not_supported=ಎಚ್ಚರಿಕೆ: ಈ ಜಾಲವೀಕ್ಷಕದಲ್ಲಿ ಮುದ್ರಣಕ್ಕೆ ಸಂಪೂರ್ಣ ಬೆಂಬಲವಿಲ್ಲ.\nprinting_not_ready=ಎಚ್ಚರಿಕೆ: PDF ಕಡತವು ಮುದ್ರಿಸಲು ಸಂಪೂರ್ಣವಾಗಿ ಲೋಡ್ ಆಗಿಲ್ಲ.\nweb_fonts_disabled=ಜಾಲ ಅಕ್ಷರಶೈಲಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ: ಅಡಕಗೊಳಿಸಿದ PDF ಅಕ್ಷರಶೈಲಿಗಳನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/ko/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=이전 페이지\nprevious_label=이전\nnext.title=다음 페이지\nnext_label=다음\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=페이지\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} / {{pagesCount}})\n\nzoom_out.title=축소\nzoom_out_label=축소\nzoom_in.title=확대\nzoom_in_label=확대\nzoom.title=확대/축소\npresentation_mode.title=프레젠테이션 모드로 전환\npresentation_mode_label=프레젠테이션 모드\nopen_file.title=파일 열기\nopen_file_label=열기\nprint.title=인쇄\nprint_label=인쇄\ndownload.title=다운로드\ndownload_label=다운로드\nbookmark.title=현재 보기 (복사 또는 새 창에 열기)\nbookmark_label=현재 보기\n\n# Secondary toolbar and context menu\ntools.title=도구\ntools_label=도구\nfirst_page.title=첫 페이지로 이동\nfirst_page.label=첫 페이지로 이동\nfirst_page_label=첫 페이지로 이동\nlast_page.title=마지막 페이지로 이동\nlast_page.label=마지막 페이지로 이동\nlast_page_label=마지막 페이지로 이동\npage_rotate_cw.title=시계방향으로 회전\npage_rotate_cw.label=시계방향으로 회전\npage_rotate_cw_label=시계방향으로 회전\npage_rotate_ccw.title=시계 반대방향으로 회전\npage_rotate_ccw.label=시계 반대방향으로 회전\npage_rotate_ccw_label=시계 반대방향으로 회전\n\ncursor_text_select_tool.title=텍스트 선택 도구 활성화\ncursor_text_select_tool_label=텍스트 선택 도구\ncursor_hand_tool.title=손 도구 활성화\ncursor_hand_tool_label=손 도구\n\nscroll_vertical.title=세로 스크롤 사용\nscroll_vertical_label=세로 스크롤\nscroll_horizontal.title=가로 스크롤 사용\nscroll_horizontal_label=가로 스크롤\nscroll_wrapped.title=래핑(자동 줄 바꿈) 스크롤 사용\nscroll_wrapped_label=래핑 스크롤\n\nspread_none.title=한 페이지 보기\nspread_none_label=펼쳐짐 없음\nspread_odd.title=홀수 페이지로 시작하는 두 페이지 보기\nspread_odd_label=홀수 펼쳐짐\nspread_even.title=짝수 페이지로 시작하는 두 페이지 보기\nspread_even_label=짝수 펼쳐짐\n\n# Document properties dialog box\ndocument_properties.title=문서 속성…\ndocument_properties_label=문서 속성…\ndocument_properties_file_name=파일 이름:\ndocument_properties_file_size=파일 크기:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}}바이트)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}}바이트)\ndocument_properties_title=제목:\ndocument_properties_author=작성자:\ndocument_properties_subject=주제:\ndocument_properties_keywords=키워드:\ndocument_properties_creation_date=작성 날짜:\ndocument_properties_modification_date=수정 날짜:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=작성 프로그램:\ndocument_properties_producer=PDF 변환 소프트웨어:\ndocument_properties_version=PDF 버전:\ndocument_properties_page_count=페이지 수:\ndocument_properties_page_size=페이지 크기:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=세로 방향\ndocument_properties_page_size_orientation_landscape=가로 방향\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=레터\ndocument_properties_page_size_name_legal=리걸\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=빠른 웹 보기:\ndocument_properties_linearized_yes=예\ndocument_properties_linearized_no=아니오\ndocument_properties_close=닫기\n\nprint_progress_message=인쇄 문서 준비 중…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=취소\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=탐색창 표시/숨기기\ntoggle_sidebar_notification.title=탐색창 표시/숨기기 (문서에 아웃라인/첨부파일 포함됨)\ntoggle_sidebar_notification2.title=탐색창 표시/숨기기 (문서에 아웃라인/첨부파일/레이어 포함됨)\ntoggle_sidebar_label=탐색창 표시/숨기기\ndocument_outline.title=문서 아웃라인 보기 (더블 클릭해서 모든 항목 펼치기/접기)\ndocument_outline_label=문서 아웃라인\nattachments.title=첨부파일 보기\nattachments_label=첨부파일\nlayers.title=레이어 보기 (더블 클릭해서 모든 레이어를 기본 상태로 재설정)\nlayers_label=레이어\nthumbs.title=미리보기\nthumbs_label=미리보기\ncurrent_outline_item.title=현재 아웃라인 항목 찾기\ncurrent_outline_item_label=현재 아웃라인 항목\nfindbar.title=검색\nfindbar_label=검색\n\nadditional_layers=추가 레이어\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas={{page}} 페이지\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}} 페이지\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} 페이지 미리보기\n\n# Find panel button title and messages\nfind_input.title=찾기\nfind_input.placeholder=문서에서 찾기…\nfind_previous.title=지정 문자열에 일치하는 1개 부분을 검색\nfind_previous_label=이전\nfind_next.title=지정 문자열에 일치하는 다음 부분을 검색\nfind_next_label=다음\nfind_highlight=모두 강조 표시\nfind_match_case_label=대/소문자 구분\nfind_entire_word_label=단어 단위로\nfind_reached_top=문서 처음까지 검색하고 끝으로 돌아와 검색했습니다.\nfind_reached_bottom=문서 끝까지 검색하고 앞으로 돌아와 검색했습니다.\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{total}} 중 {{current}} 일치\nfind_match_count[two]={{total}} 중 {{current}} 일치\nfind_match_count[few]={{total}} 중 {{current}} 일치\nfind_match_count[many]={{total}} 중 {{current}} 일치\nfind_match_count[other]={{total}} 중 {{current}} 일치\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]={{limit}} 이상 일치\nfind_match_count_limit[one]={{limit}} 이상 일치\nfind_match_count_limit[two]={{limit}} 이상 일치\nfind_match_count_limit[few]={{limit}} 이상 일치\nfind_match_count_limit[many]={{limit}} 이상 일치\nfind_match_count_limit[other]={{limit}} 이상 일치\nfind_not_found=검색 결과 없음\n\n# Error panel labels\nerror_more_info=정보 더 보기\nerror_less_info=정보 간단히 보기\nerror_close=닫기\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (빌드: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=메시지: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=스택: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=파일: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=줄 번호: {{line}}\nrendering_error=페이지를 렌더링하는 동안 오류가 발생했습니다.\n\n# Predefined zoom values\npage_scale_width=페이지 너비에 맞추기\npage_scale_fit=페이지에 맞추기\npage_scale_auto=자동\npage_scale_actual=실제 크기\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=PDF를 로드하는 동안 오류가 발생했습니다.\ninvalid_file_error=잘못되었거나 손상된 PDF 파일.\nmissing_file_error=PDF 파일 없음.\nunexpected_response_error=예상치 못한 서버 응답입니다.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}} {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} 주석]\npassword_label=이 PDF 파일을 열 수 있는 비밀번호를 입력하세요.\npassword_invalid=잘못된 비밀번호입니다. 다시 시도하세요.\npassword_ok=확인\npassword_cancel=취소\n\nprinting_not_supported=경고: 이 브라우저는 인쇄를 완전히 지원하지 않습니다.\nprinting_not_ready=경고: 이 PDF를 인쇄를 할 수 있을 정도로 읽어들이지 못했습니다.\nweb_fonts_disabled=웹 폰트가 비활성화됨: 내장된 PDF 글꼴을 사용할 수 없습니다.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/lij/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pagina primma\nprevious_label=Precedente\nnext.title=Pagina dòppo\nnext_label=Pròscima\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pagina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Diminoisci zoom\nzoom_out_label=Diminoisci zoom\nzoom_in.title=Aomenta zoom\nzoom_in_label=Aomenta zoom\nzoom.title=Zoom\npresentation_mode.title=Vanni into mòddo de prezentaçion\npresentation_mode_label=Mòddo de prezentaçion\nopen_file.title=Arvi file\nopen_file_label=Arvi\nprint.title=Stanpa\nprint_label=Stanpa\ndownload.title=Descaregamento\ndownload_label=Descaregamento\nbookmark.title=Vixon corente (còpia ò arvi inte 'n neuvo barcon)\nbookmark_label=Vixon corente\n\n# Secondary toolbar and context menu\ntools.title=Atressi\ntools_label=Atressi\nfirst_page.title=Vanni a-a primma pagina\nfirst_page.label=Vanni a-a primma pagina\nfirst_page_label=Vanni a-a primma pagina\nlast_page.title=Vanni a l'urtima pagina\nlast_page.label=Vanni a l'urtima pagina\nlast_page_label=Vanni a l'urtima pagina\npage_rotate_cw.title=Gia into verso oraio\npage_rotate_cw.label=Gia in senso do releuio\npage_rotate_cw_label=Gia into verso oraio\npage_rotate_ccw.title=Gia into verso antioraio\npage_rotate_ccw.label=Gia in senso do releuio a-a reversa\npage_rotate_ccw_label=Gia into verso antioraio\n\ncursor_text_select_tool.title=Abilita strumento de seleçion do testo\ncursor_text_select_tool_label=Strumento de seleçion do testo\ncursor_hand_tool.title=Abilita strumento man\ncursor_hand_tool_label=Strumento man\n\nscroll_vertical.title=Deuvia rebelamento verticale\nscroll_vertical_label=Rebelamento verticale\nscroll_horizontal.title=Deuvia rebelamento orizontâ\nscroll_horizontal_label=Rebelamento orizontâ\nscroll_wrapped.title=Deuvia rebelamento incapsolou\nscroll_wrapped_label=Rebelamento incapsolou\n\nspread_none.title=No unite a-a difuxon de pagina\nspread_none_label=No difuxon\nspread_odd.title=Uniscite a-a difuxon de pagina co-o numero dèspa\nspread_odd_label=Difuxon dèspa\nspread_even.title=Uniscite a-a difuxon de pagina co-o numero pari\nspread_even_label=Difuxon pari\n\n# Document properties dialog box\ndocument_properties.title=Propietæ do documento…\ndocument_properties_label=Propietæ do documento…\ndocument_properties_file_name=Nomme schedaio:\ndocument_properties_file_size=Dimenscion schedaio:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kB ({{size_b}} byte)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} byte)\ndocument_properties_title=Titolo:\ndocument_properties_author=Aoto:\ndocument_properties_subject=Ogetto:\ndocument_properties_keywords=Paròlle ciave:\ndocument_properties_creation_date=Dæta creaçion:\ndocument_properties_modification_date=Dæta cangiamento:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Aotô originale:\ndocument_properties_producer=Produtô PDF:\ndocument_properties_version=Verscion PDF:\ndocument_properties_page_count=Contezzo pagine:\ndocument_properties_page_size=Dimenscion da pagina:\ndocument_properties_page_size_unit_inches=dii gròsci\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=drito\ndocument_properties_page_size_orientation_landscape=desteizo\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letia\ndocument_properties_page_size_name_legal=Lezze\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Vista veloce do Web:\ndocument_properties_linearized_yes=Sci\ndocument_properties_linearized_no=No\ndocument_properties_close=Særa\n\nprint_progress_message=Praparo o documento pe-a stanpa…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Anulla\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Ativa/dizativa bara de scianco\ntoggle_sidebar_notification.title=Cangia bara de löo (o documento o contegne di alegæ)\ntoggle_sidebar_label=Ativa/dizativa bara de scianco\ndocument_outline.title=Fanni vedde o contorno do documento (scicca doggio pe espande/ridue tutti i elementi)\ndocument_outline_label=Contorno do documento\nattachments.title=Fanni vedde alegæ\nattachments_label=Alegæ\nthumbs.title=Mostra miniatue\nthumbs_label=Miniatue\nfindbar.title=Treuva into documento\nfindbar_label=Treuva\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pagina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatua da pagina {{page}}\n\n# Find panel button title and messages\nfind_input.title=Treuva\nfind_input.placeholder=Treuva into documento…\nfind_previous.title=Treuva a ripetiçion precedente do testo da çercâ\nfind_previous_label=Precedente\nfind_next.title=Treuva a ripetiçion dòppo do testo da çercâ\nfind_next_label=Segoente\nfind_highlight=Evidençia\nfind_match_case_label=Maioscole/minoscole\nfind_entire_word_label=Poula intrega\nfind_reached_top=Razonto a fin da pagina, continoa da l'iniçio\nfind_reached_bottom=Razonto l'iniçio da pagina, continoa da-a fin\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} de {{total}} corispondensa\nfind_match_count[two]={{current}} de {{total}} corispondense\nfind_match_count[few]={{current}} de {{total}} corispondense\nfind_match_count[many]={{current}} de {{total}} corispondense\nfind_match_count[other]={{current}} de {{total}} corispondense\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Ciù de {{limit}} corispondense\nfind_match_count_limit[one]=Ciù de {{limit}} corispondensa\nfind_match_count_limit[two]=Ciù de {{limit}} corispondense\nfind_match_count_limit[few]=Ciù de {{limit}} corispondense\nfind_match_count_limit[many]=Ciù de {{limit}} corispondense\nfind_match_count_limit[other]=Ciù de {{limit}} corispondense\nfind_not_found=Testo no trovou\n\n# Error panel labels\nerror_more_info=Ciù informaçioin\nerror_less_info=Meno informaçioin\nerror_close=Særa\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mesaggio: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Schedaio: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linia: {{line}}\nrendering_error=Gh'é stæto 'n'erô itno rendering da pagina.\n\n# Predefined zoom values\npage_scale_width=Larghessa pagina\npage_scale_fit=Adatta a una pagina\npage_scale_auto=Zoom aotomatico\npage_scale_actual=Dimenscioin efetive\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=S'é verificou 'n'erô itno caregamento do PDF.\ninvalid_file_error=O schedaio PDF o l'é no valido ò aroinou.\nmissing_file_error=O schedaio PDF o no gh'é.\nunexpected_response_error=Risposta inprevista do-u server\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotaçion: {{type}}]\npassword_label=Dimme a paròlla segreta pe arvî sto schedaio PDF.\npassword_invalid=Paròlla segreta sbalia. Preuva torna.\npassword_ok=Va ben\npassword_cancel=Anulla\n\nprinting_not_supported=Atençion: a stanpa a no l'é conpletamente soportâ da sto navegatô.\nprinting_not_ready=Atençion: o PDF o no l'é ancon caregou conpletamente pe-a stanpa.\nweb_fonts_disabled=I font do web en dizativæ: inposcibile adeuviâ i carateri do PDF.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/lo/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=ຫນ້າກ່ອນຫນ້າ\nprevious_label=ກ່ອນຫນ້າ\nnext.title=ຫນ້າຖັດໄປ\nnext_label=ຖັດໄປ\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=ຫນ້າ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=ຈາກ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} ຈາກ {{pagesCount}})\n\nzoom_out.title=ຂະຫຍາຍອອກ\nzoom_out_label=ຂະຫຍາຍອອກ\nzoom_in.title=ຂະຫຍາຍເຂົ້າ\nzoom_in_label=ຂະຫຍາຍເຂົ້າ\nzoom.title=ຂະຫຍາຍ\npresentation_mode.title=ສັບປ່ຽນເປັນໂຫມດການນຳສະເຫນີ\npresentation_mode_label=ໂຫມດການນຳສະເຫນີ\nopen_file.title=ເປີດໄຟລ໌\nopen_file_label=ເປີດ\nprint.title=ພິມ\nprint_label=ພິມ\ndownload.title=ດາວໂຫລດ\ndownload_label=ດາວໂຫລດ\nbookmark.title=ມຸມມອງປະຈຸບັນ (ສຳເນົາ ຫລື ເປີດໃນວິນໂດໃຫມ່)\nbookmark_label=ມຸມມອງປະຈຸບັນ\n\n# Secondary toolbar and context menu\ntools.title=ເຄື່ອງມື\ntools_label=ເຄື່ອງມື\nfirst_page.title=ໄປທີ່ຫນ້າທຳອິດ\nfirst_page.label=ໄປທີ່ຫນ້າທຳອິດ\nfirst_page_label=ໄປທີ່ຫນ້າທຳອິດ\nlast_page.title=ໄປທີ່ຫນ້າສຸດທ້າຍ\nlast_page.label=ໄປທີ່ຫນ້າສຸດທ້າຍ\nlast_page_label=ໄປທີ່ຫນ້າສຸດທ້າຍ\npage_rotate_cw.title=ຫມູນຕາມເຂັມໂມງ\npage_rotate_cw.label=ຫມູນຕາມເຂັມໂມງ\npage_rotate_cw_label=ຫມູນຕາມເຂັມໂມງ\npage_rotate_ccw.title=ຫມູນທວນເຂັມໂມງ\npage_rotate_ccw.label=ຫມູນທວນເຂັມໂມງ\npage_rotate_ccw_label=ຫມູນທວນເຂັມໂມງ\n\n\n\n\n# Document properties dialog box\ndocument_properties_file_name=ຊື່ໄຟລ໌:\ndocument_properties_file_size=ຂະຫນາດໄຟລ໌:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=ລວງຕັ້ງ\ndocument_properties_page_size_orientation_landscape=ລວງນອນ\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=ຈົດໝາຍ\ndocument_properties_page_size_name_legal=ຂໍ້ກົດຫມາຍ\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_close=ປິດ\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_close=ຍົກເລີກ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=ເປີດ/ປິດແຖບຂ້າງ\ntoggle_sidebar_notification.title=ເປີດ/ປິດແຖບຂ້າງ (ເອກະສານມີເຄົ້າຮ່າງ/ໄຟລ໌ແນບ)\ntoggle_sidebar_label=ເປີດ/ປິດແຖບຂ້າງ\ndocument_outline_label=ເຄົ້າຮ່າງເອກະສານ\nfindbar_label=ຄົ້ນຫາ\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\n\n# Find panel button title and messages\nfind_input.title=ຄົ້ນຫາ\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\n\n# Error panel labels\nerror_more_info=ຂໍ້ມູນເພີ່ມເຕີມ\nerror_less_info=ຂໍ້ມູນນ້ອຍລົງ\nerror_close=ປິດ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nrendering_error=ມີຂໍ້ຜິດພາດເກີດຂື້ນຂະນະທີ່ກຳລັງເຣັນເດີຫນ້າ.\n\n# Predefined zoom values\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error=ມີຂໍ້ຜິດພາດເກີດຂື້ນຂະນະທີ່ກຳລັງໂຫລດ PDF.\ninvalid_file_error=ໄຟລ໌ PDF ບໍ່ຖືກຕ້ອງຫລືເສຍຫາຍ.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\npassword_ok=ຕົກລົງ\npassword_cancel=ຍົກເລີກ\n\n"
  },
  {
    "path": "lib/pdf.js/web/locale/locale.properties",
    "content": "[ach]\n@import url(ach/viewer.properties)\n\n[af]\n@import url(af/viewer.properties)\n\n[an]\n@import url(an/viewer.properties)\n\n[ar]\n@import url(ar/viewer.properties)\n\n[ast]\n@import url(ast/viewer.properties)\n\n[az]\n@import url(az/viewer.properties)\n\n[be]\n@import url(be/viewer.properties)\n\n[bg]\n@import url(bg/viewer.properties)\n\n[bn]\n@import url(bn/viewer.properties)\n\n[bo]\n@import url(bo/viewer.properties)\n\n[br]\n@import url(br/viewer.properties)\n\n[brx]\n@import url(brx/viewer.properties)\n\n[bs]\n@import url(bs/viewer.properties)\n\n[ca]\n@import url(ca/viewer.properties)\n\n[cak]\n@import url(cak/viewer.properties)\n\n[ckb]\n@import url(ckb/viewer.properties)\n\n[cs]\n@import url(cs/viewer.properties)\n\n[cy]\n@import url(cy/viewer.properties)\n\n[da]\n@import url(da/viewer.properties)\n\n[de]\n@import url(de/viewer.properties)\n\n[dsb]\n@import url(dsb/viewer.properties)\n\n[el]\n@import url(el/viewer.properties)\n\n[en-CA]\n@import url(en-CA/viewer.properties)\n\n[en-GB]\n@import url(en-GB/viewer.properties)\n\n[en-US]\n@import url(en-US/viewer.properties)\n\n[eo]\n@import url(eo/viewer.properties)\n\n[es-AR]\n@import url(es-AR/viewer.properties)\n\n[es-CL]\n@import url(es-CL/viewer.properties)\n\n[es-ES]\n@import url(es-ES/viewer.properties)\n\n[es-MX]\n@import url(es-MX/viewer.properties)\n\n[et]\n@import url(et/viewer.properties)\n\n[eu]\n@import url(eu/viewer.properties)\n\n[fa]\n@import url(fa/viewer.properties)\n\n[ff]\n@import url(ff/viewer.properties)\n\n[fi]\n@import url(fi/viewer.properties)\n\n[fr]\n@import url(fr/viewer.properties)\n\n[fy-NL]\n@import url(fy-NL/viewer.properties)\n\n[ga-IE]\n@import url(ga-IE/viewer.properties)\n\n[gd]\n@import url(gd/viewer.properties)\n\n[gl]\n@import url(gl/viewer.properties)\n\n[gn]\n@import url(gn/viewer.properties)\n\n[gu-IN]\n@import url(gu-IN/viewer.properties)\n\n[he]\n@import url(he/viewer.properties)\n\n[hi-IN]\n@import url(hi-IN/viewer.properties)\n\n[hr]\n@import url(hr/viewer.properties)\n\n[hsb]\n@import url(hsb/viewer.properties)\n\n[hu]\n@import url(hu/viewer.properties)\n\n[hy-AM]\n@import url(hy-AM/viewer.properties)\n\n[hye]\n@import url(hye/viewer.properties)\n\n[ia]\n@import url(ia/viewer.properties)\n\n[id]\n@import url(id/viewer.properties)\n\n[is]\n@import url(is/viewer.properties)\n\n[it]\n@import url(it/viewer.properties)\n\n[ja]\n@import url(ja/viewer.properties)\n\n[ka]\n@import url(ka/viewer.properties)\n\n[kab]\n@import url(kab/viewer.properties)\n\n[kk]\n@import url(kk/viewer.properties)\n\n[km]\n@import url(km/viewer.properties)\n\n[kn]\n@import url(kn/viewer.properties)\n\n[ko]\n@import url(ko/viewer.properties)\n\n[lij]\n@import url(lij/viewer.properties)\n\n[lo]\n@import url(lo/viewer.properties)\n\n[lt]\n@import url(lt/viewer.properties)\n\n[ltg]\n@import url(ltg/viewer.properties)\n\n[lv]\n@import url(lv/viewer.properties)\n\n[meh]\n@import url(meh/viewer.properties)\n\n[mk]\n@import url(mk/viewer.properties)\n\n[mr]\n@import url(mr/viewer.properties)\n\n[ms]\n@import url(ms/viewer.properties)\n\n[my]\n@import url(my/viewer.properties)\n\n[nb-NO]\n@import url(nb-NO/viewer.properties)\n\n[ne-NP]\n@import url(ne-NP/viewer.properties)\n\n[nl]\n@import url(nl/viewer.properties)\n\n[nn-NO]\n@import url(nn-NO/viewer.properties)\n\n[oc]\n@import url(oc/viewer.properties)\n\n[pa-IN]\n@import url(pa-IN/viewer.properties)\n\n[pl]\n@import url(pl/viewer.properties)\n\n[pt-BR]\n@import url(pt-BR/viewer.properties)\n\n[pt-PT]\n@import url(pt-PT/viewer.properties)\n\n[rm]\n@import url(rm/viewer.properties)\n\n[ro]\n@import url(ro/viewer.properties)\n\n[ru]\n@import url(ru/viewer.properties)\n\n[scn]\n@import url(scn/viewer.properties)\n\n[si]\n@import url(si/viewer.properties)\n\n[sk]\n@import url(sk/viewer.properties)\n\n[sl]\n@import url(sl/viewer.properties)\n\n[son]\n@import url(son/viewer.properties)\n\n[sq]\n@import url(sq/viewer.properties)\n\n[sr]\n@import url(sr/viewer.properties)\n\n[sv-SE]\n@import url(sv-SE/viewer.properties)\n\n[szl]\n@import url(szl/viewer.properties)\n\n[ta]\n@import url(ta/viewer.properties)\n\n[te]\n@import url(te/viewer.properties)\n\n[th]\n@import url(th/viewer.properties)\n\n[tl]\n@import url(tl/viewer.properties)\n\n[tr]\n@import url(tr/viewer.properties)\n\n[trs]\n@import url(trs/viewer.properties)\n\n[uk]\n@import url(uk/viewer.properties)\n\n[ur]\n@import url(ur/viewer.properties)\n\n[uz]\n@import url(uz/viewer.properties)\n\n[vi]\n@import url(vi/viewer.properties)\n\n[wo]\n@import url(wo/viewer.properties)\n\n[xh]\n@import url(xh/viewer.properties)\n\n[zh-CN]\n@import url(zh-CN/viewer.properties)\n\n[zh-TW]\n@import url(zh-TW/viewer.properties)\n\n"
  },
  {
    "path": "lib/pdf.js/web/locale/lt/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Ankstesnis puslapis\nprevious_label=Ankstesnis\nnext.title=Kitas puslapis\nnext_label=Kitas\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Puslapis\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=iš {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} iš {{pagesCount}})\n\nzoom_out.title=Sumažinti\nzoom_out_label=Sumažinti\nzoom_in.title=Padidinti\nzoom_in_label=Padidinti\nzoom.title=Mastelis\npresentation_mode.title=Pereiti į pateikties veikseną\npresentation_mode_label=Pateikties veiksena\nopen_file.title=Atverti failą\nopen_file_label=Atverti\nprint.title=Spausdinti\nprint_label=Spausdinti\ndownload.title=Parsiųsti\ndownload_label=Parsiųsti\nbookmark.title=Esamojo rodinio saitas (kopijavimui ar atvėrimui kitame lange)\nbookmark_label=Esamasis rodinys\n\n# Secondary toolbar and context menu\ntools.title=Priemonės\ntools_label=Priemonės\nfirst_page.title=Eiti į pirmą puslapį\nfirst_page.label=Eiti į pirmą puslapį\nfirst_page_label=Eiti į pirmą puslapį\nlast_page.title=Eiti į paskutinį puslapį\nlast_page.label=Eiti į paskutinį puslapį\nlast_page_label=Eiti į paskutinį puslapį\npage_rotate_cw.title=Pasukti pagal laikrodžio rodyklę\npage_rotate_cw.label=Pasukti pagal laikrodžio rodyklę\npage_rotate_cw_label=Pasukti pagal laikrodžio rodyklę\npage_rotate_ccw.title=Pasukti prieš laikrodžio rodyklę\npage_rotate_ccw.label=Pasukti prieš laikrodžio rodyklę\npage_rotate_ccw_label=Pasukti prieš laikrodžio rodyklę\n\ncursor_text_select_tool.title=Įjungti teksto žymėjimo įrankį\ncursor_text_select_tool_label=Teksto žymėjimo įrankis\ncursor_hand_tool.title=Įjungti vilkimo įrankį\ncursor_hand_tool_label=Vilkimo įrankis\n\nscroll_vertical.title=Naudoti vertikalų slinkimą\nscroll_vertical_label=Vertikalus slinkimas\nscroll_horizontal.title=Naudoti horizontalų slinkimą\nscroll_horizontal_label=Horizontalus slinkimas\nscroll_wrapped.title=Naudoti išklotą slinkimą\nscroll_wrapped_label=Išklotas slinkimas\n\nspread_none.title=Nejungti puslapių į dvilapius\nspread_none_label=Be dvilapių\nspread_odd.title=Sujungti į dvilapius pradedant nelyginiais puslapiais\nspread_odd_label=Nelyginiai dvilapiai\nspread_even.title=Sujungti į dvilapius pradedant lyginiais puslapiais\nspread_even_label=Lyginiai dvilapiai\n\n# Document properties dialog box\ndocument_properties.title=Dokumento savybės…\ndocument_properties_label=Dokumento savybės…\ndocument_properties_file_name=Failo vardas:\ndocument_properties_file_size=Failo dydis:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} B)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} B)\ndocument_properties_title=Antraštė:\ndocument_properties_author=Autorius:\ndocument_properties_subject=Tema:\ndocument_properties_keywords=Reikšminiai žodžiai:\ndocument_properties_creation_date=Sukūrimo data:\ndocument_properties_modification_date=Modifikavimo data:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Kūrėjas:\ndocument_properties_producer=PDF generatorius:\ndocument_properties_version=PDF versija:\ndocument_properties_page_count=Puslapių skaičius:\ndocument_properties_page_size=Puslapio dydis:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=stačias\ndocument_properties_page_size_orientation_landscape=gulsčias\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Laiškas\ndocument_properties_page_size_name_legal=Dokumentas\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Spartus žiniatinklio rodinys:\ndocument_properties_linearized_yes=Taip\ndocument_properties_linearized_no=Ne\ndocument_properties_close=Užverti\n\nprint_progress_message=Dokumentas ruošiamas spausdinimui…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Atsisakyti\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Rodyti / slėpti šoninį polangį\ntoggle_sidebar_notification.title=Parankinė (dokumentas turi struktūrą / priedų)\ntoggle_sidebar_notification2.title=Parankinė (dokumentas turi struktūrą / priedų / sluoksnių)\ntoggle_sidebar_label=Šoninis polangis\ndocument_outline.title=Rodyti dokumento struktūrą (spustelėkite dukart norėdami išplėsti/suskleisti visus elementus)\ndocument_outline_label=Dokumento struktūra\nattachments.title=Rodyti priedus\nattachments_label=Priedai\nlayers.title=Rodyti sluoksnius (spustelėkite dukart, norėdami atstatyti visus sluoksnius į numatytąją būseną)\nlayers_label=Sluoksniai\nthumbs.title=Rodyti puslapių miniatiūras\nthumbs_label=Miniatiūros\ncurrent_outline_item.title=Rasti dabartinį struktūros elementą\ncurrent_outline_item_label=Dabartinis struktūros elementas\nfindbar.title=Ieškoti dokumente\nfindbar_label=Rasti\n\nadditional_layers=Papildomi sluoksniai\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas={{page}} puslapis\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}} puslapis\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} puslapio miniatiūra\n\n# Find panel button title and messages\nfind_input.title=Rasti\nfind_input.placeholder=Rasti dokumente…\nfind_previous.title=Ieškoti ankstesnio frazės egzemplioriaus\nfind_previous_label=Ankstesnis\nfind_next.title=Ieškoti tolesnio frazės egzemplioriaus\nfind_next_label=Tolesnis\nfind_highlight=Viską paryškinti\nfind_match_case_label=Skirti didžiąsias ir mažąsias raides\nfind_entire_word_label=Ištisi žodžiai\nfind_reached_top=Pasiekus dokumento pradžią, paieška pratęsta nuo pabaigos\nfind_reached_bottom=Pasiekus dokumento pabaigą, paieška pratęsta nuo pradžios\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} iš {{total}} atitikmens\nfind_match_count[two]={{current}} iš {{total}} atitikmenų\nfind_match_count[few]={{current}} iš {{total}} atitikmenų\nfind_match_count[many]={{current}} iš {{total}} atitikmenų\nfind_match_count[other]={{current}} iš {{total}} atitikmens\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Daugiau nei {{limit}} atitikmenų\nfind_match_count_limit[one]=Daugiau nei {{limit}} atitikmuo\nfind_match_count_limit[two]=Daugiau nei {{limit}} atitikmenys\nfind_match_count_limit[few]=Daugiau nei {{limit}} atitikmenys\nfind_match_count_limit[many]=Daugiau nei {{limit}} atitikmenų\nfind_match_count_limit[other]=Daugiau nei {{limit}} atitikmuo\nfind_not_found=Ieškoma frazė nerasta\n\n# Error panel labels\nerror_more_info=Išsamiau\nerror_less_info=Glausčiau\nerror_close=Užverti\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v. {{version}} (darinys: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Pranešimas: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Dėklas: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Failas: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Eilutė: {{line}}\nrendering_error=Atvaizduojant puslapį įvyko klaida.\n\n# Predefined zoom values\npage_scale_width=Priderinti prie lapo pločio\npage_scale_fit=Pritaikyti prie lapo dydžio\npage_scale_auto=Automatinis mastelis\npage_scale_actual=Tikras dydis\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Įkeliant PDF failą įvyko klaida.\ninvalid_file_error=Tai nėra PDF failas arba jis yra sugadintas.\nmissing_file_error=PDF failas nerastas.\nunexpected_response_error=Netikėtas serverio atsakas.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[„{{type}}“ tipo anotacija]\npassword_label=Įveskite slaptažodį šiam PDF failui atverti.\npassword_invalid=Slaptažodis neteisingas. Bandykite dar kartą.\npassword_ok=Gerai\npassword_cancel=Atsisakyti\n\nprinting_not_supported=Dėmesio! Spausdinimas šioje naršyklėje nėra pilnai realizuotas.\nprinting_not_ready=Dėmesio! PDF failas dar nėra pilnai įkeltas spausdinimui.\nweb_fonts_disabled=Saityno šriftai išjungti – PDF faile esančių šriftų naudoti negalima.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/ltg/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Īprīkšejā lopa\nprevious_label=Īprīkšejā\nnext.title=Nuokomuo lopa\nnext_label=Nuokomuo\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Lopa\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=nu {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} nu {{pagesCount}})\n\nzoom_out.title=Attuolynuot \nzoom_out_label=Attuolynuot\nzoom_in.title=Pītuvynuot\nzoom_in_label=Pītuvynuot\nzoom.title=Palelynuojums\npresentation_mode.title=Puorslēgtīs iz Prezentacejis režymu\npresentation_mode_label=Prezentacejis režyms\nopen_file.title=Attaiseit failu\nopen_file_label=Attaiseit\nprint.title=Drukuošona\nprint_label=Drukōt\ndownload.title=Lejupīluode\ndownload_label=Lejupīluodeit\nbookmark.title=Pošreizejais skots (kopēt voi attaiseit jaunā lūgā)\nbookmark_label=Pošreizejais skots\n\n# Secondary toolbar and context menu\ntools.title=Reiki\ntools_label=Reiki\nfirst_page.title=Īt iz pyrmū lopu\nfirst_page.label=Īt iz pyrmū lopu\nfirst_page_label=Īt iz pyrmū lopu\nlast_page.title=Īt iz piedejū lopu\nlast_page.label=Īt iz piedejū lopu\nlast_page_label=Īt iz piedejū lopu\npage_rotate_cw.title=Pagrīzt pa pulksteni\npage_rotate_cw.label=Pagrīzt pa pulksteni\npage_rotate_cw_label=Pagrīzt pa pulksteni\npage_rotate_ccw.title=Pagrīzt pret pulksteni\npage_rotate_ccw.label=Pagrīzt pret pulksteni\npage_rotate_ccw_label=Pagrīzt pret pulksteni\n\ncursor_text_select_tool.title=Aktivizēt teksta izvieles reiku\ncursor_text_select_tool_label=Teksta izvieles reiks\ncursor_hand_tool.title=Aktivēt rūkys reiku\ncursor_hand_tool_label=Rūkys reiks\n\nscroll_vertical.title=Izmontōt vertikalū ritinōšonu\nscroll_vertical_label=Vertikalō ritinōšona\nscroll_horizontal.title=Izmontōt horizontalū ritinōšonu\nscroll_horizontal_label=Horizontalō ritinōšona\nscroll_wrapped.title=Izmontōt mārūgojamū ritinōšonu\nscroll_wrapped_label=Mārūgojamō ritinōšona\n\nspread_none.title=Naizmontōt lopu atvāruma režimu\nspread_none_label=Bez atvārumim\nspread_odd.title=Izmontōt lopu atvārumus sōkut nu napōra numeru lopom\nspread_odd_label=Napōra lopys pa kreisi\nspread_even.title=Izmontōt lopu atvārumus sōkut nu pōra numeru lopom\nspread_even_label=Pōra lopys pa kreisi\n\n# Document properties dialog box\ndocument_properties.title=Dokumenta īstatiejumi…\ndocument_properties_label=Dokumenta īstatiejumi…\ndocument_properties_file_name=Faila nūsaukums:\ndocument_properties_file_size=Faila izmārs:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} biti)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} biti)\ndocument_properties_title=Nūsaukums:\ndocument_properties_author=Autors:\ndocument_properties_subject=Tema:\ndocument_properties_keywords=Atslāgi vuordi:\ndocument_properties_creation_date=Izveides datums:\ndocument_properties_modification_date=lobuošonys datums:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Radeituojs:\ndocument_properties_producer=PDF producents:\ndocument_properties_version=PDF verseja:\ndocument_properties_page_count=Lopu skaits:\ndocument_properties_page_size=Lopas izmārs:\ndocument_properties_page_size_unit_inches=collas\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=portreta orientaceja\ndocument_properties_page_size_orientation_landscape=ainovys orientaceja\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Fast Web View:\ndocument_properties_linearized_yes=Jā\ndocument_properties_linearized_no=Nā\ndocument_properties_close=Aiztaiseit\n\nprint_progress_message=Preparing document for printing…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Atceļt\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Puorslēgt suonu jūslu\ntoggle_sidebar_notification.title=Toggle Sidebar (document contains outline/attachments)\ntoggle_sidebar_label=Puorslēgt suonu jūslu\ndocument_outline.title=Show Document Outline (double-click to expand/collapse all items)\ndocument_outline_label=Dokumenta saturs\nattachments.title=Show Attachments\nattachments_label=Attachments\nthumbs.title=Paruodeit seiktālus\nthumbs_label=Seiktāli\nfindbar.title=Mekleit dokumentā\nfindbar_label=Mekleit\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Lopa {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Lopys {{page}} seiktāls\n\n# Find panel button title and messages\nfind_input.title=Mekleit\nfind_input.placeholder=Mekleit dokumentā…\nfind_previous.title=Atrast īprīkšejū\nfind_previous_label=Īprīkšejā\nfind_next.title=Atrast nuokamū\nfind_next_label=Nuokomuo\nfind_highlight=Īkruosuot vysys\nfind_match_case_label=Lelū, mozū burtu jiuteigs\nfind_reached_top=Sasnīgts dokumenta suokums, turpynojom nu beigom\nfind_reached_bottom=Sasnīgtys dokumenta beigys, turpynojom nu suokuma\nfind_not_found=Frāze nav atrosta\n\n# Error panel labels\nerror_more_info=Vairuok informacejis\nerror_less_info=mozuok informacejis\nerror_close=Close\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Ziņuojums: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Steks: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Ryndeņa: {{line}}\nrendering_error=Attālojūt lopu rodās klaida\n\n# Predefined zoom values\npage_scale_width=Lopys plotumā\npage_scale_fit=Ītylpynūt lopu\npage_scale_auto=Automatiskais izmārs\npage_scale_actual=Patīsais izmārs\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Īluodejūt PDF nūtyka klaida.\ninvalid_file_error=Nadereigs voi būjuots PDF fails.\nmissing_file_error=PDF fails nav atrosts.\nunexpected_response_error=Unexpected server response.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Īvodit paroli, kab attaiseitu PDF failu.\npassword_invalid=Napareiza parole, raugit vēļreiz.\npassword_ok=Labi\npassword_cancel=Atceļt\n\nprinting_not_supported=Uzmaneibu: Drukuošona nu itei puorlūka dorbojās tikai daleji.\nprinting_not_ready=Uzmaneibu: PDF nav pilneibā īluodeits drukuošonai.\nweb_fonts_disabled=Šķārsteikla fonti nav aktivizāti: Navar īgult PDF fontus.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/lv/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Iepriekšējā lapa\nprevious_label=Iepriekšējā\nnext.title=Nākamā lapa\nnext_label=Nākamā\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Lapa\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=no {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} no {{pagesCount}})\n\nzoom_out.title=Attālināt\\u0020\nzoom_out_label=Attālināt\nzoom_in.title=Pietuvināt\nzoom_in_label=Pietuvināt\nzoom.title=Palielinājums\npresentation_mode.title=Pārslēgties uz Prezentācijas režīmu\npresentation_mode_label=Prezentācijas režīms\nopen_file.title=Atvērt failu\nopen_file_label=Atvērt\nprint.title=Drukāšana\nprint_label=Drukāt\ndownload.title=Lejupielāde\ndownload_label=Lejupielādēt\nbookmark.title=Pašreizējais skats (kopēt vai atvērt jaunā logā)\nbookmark_label=Pašreizējais skats\n\n# Secondary toolbar and context menu\ntools.title=Rīki\ntools_label=Rīki\nfirst_page.title=Iet uz pirmo lapu\nfirst_page.label=Iet uz pirmo lapu\nfirst_page_label=Iet uz pirmo lapu\nlast_page.title=Iet uz pēdējo lapu\nlast_page.label=Iet uz pēdējo lapu\nlast_page_label=Iet uz pēdējo lapu\npage_rotate_cw.title=Pagriezt pa pulksteni\npage_rotate_cw.label=Pagriezt pa pulksteni\npage_rotate_cw_label=Pagriezt pa pulksteni\npage_rotate_ccw.title=Pagriezt pret pulksteni\npage_rotate_ccw.label=Pagriezt pret pulksteni\npage_rotate_ccw_label=Pagriezt pret pulksteni\n\ncursor_text_select_tool.title=Aktivizēt teksta izvēles rīku\ncursor_text_select_tool_label=Teksta izvēles rīks\ncursor_hand_tool.title=Aktivēt rokas rīku\ncursor_hand_tool_label=Rokas rīks\n\nscroll_vertical.title=Izmantot vertikālo ritināšanu\nscroll_vertical_label=Vertikālā ritināšana\nscroll_horizontal.title=Izmantot horizontālo ritināšanu\nscroll_horizontal_label=Horizontālā ritināšana\nscroll_wrapped.title=Izmantot apkļauto ritināšanu\nscroll_wrapped_label=Apkļautā ritināšana\n\nspread_none.title=Nepievienoties lapu izpletumiem\nspread_none_label=Neizmantot izpletumus\nspread_odd.title=Izmantot lapu izpletumus sākot ar nepāra numuru lapām\nspread_odd_label=Nepāra izpletumi\nspread_even.title=Izmantot lapu izpletumus sākot ar pāra numuru lapām\nspread_even_label=Pāra izpletumi\n\n# Document properties dialog box\ndocument_properties.title=Dokumenta iestatījumi…\ndocument_properties_label=Dokumenta iestatījumi…\ndocument_properties_file_name=Faila nosaukums:\ndocument_properties_file_size=Faila izmērs:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} biti)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} biti)\ndocument_properties_title=Nosaukums:\ndocument_properties_author=Autors:\ndocument_properties_subject=Tēma:\ndocument_properties_keywords=Atslēgas vārdi:\ndocument_properties_creation_date=Izveides datums:\ndocument_properties_modification_date=LAbošanas datums:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Radītājs:\ndocument_properties_producer=PDF producents:\ndocument_properties_version=PDF versija:\ndocument_properties_page_count=Lapu skaits:\ndocument_properties_page_size=Papīra izmērs:\ndocument_properties_page_size_unit_inches=collas\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=portretorientācija\ndocument_properties_page_size_orientation_landscape=ainavorientācija\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Vēstule\ndocument_properties_page_size_name_legal=Juridiskie teksti\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Ātrā tīmekļa skats:\ndocument_properties_linearized_yes=Jā\ndocument_properties_linearized_no=Nē\ndocument_properties_close=Aizvērt\n\nprint_progress_message=Gatavo dokumentu drukāšanai...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Atcelt\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Pārslēgt sānu joslu\ntoggle_sidebar_notification.title=Pārslēgt sānu joslu (dokumenta saturu un pielikumus)\ntoggle_sidebar_label=Pārslēgt sānu joslu\ndocument_outline.title=Rādīt dokumenta struktūru (veiciet dubultklikšķi lai izvērstu/sakļautu visus vienumus)\ndocument_outline_label=Dokumenta saturs\nattachments.title=Rādīt pielikumus\nattachments_label=Pielikumi\nthumbs.title=Parādīt sīktēlus\nthumbs_label=Sīktēli\nfindbar.title=Meklēt dokumentā\nfindbar_label=Meklēt\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Lapa {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Lapas {{page}} sīktēls\n\n# Find panel button title and messages\nfind_input.title=Meklēt\nfind_input.placeholder=Meklēt dokumentā…\nfind_previous.title=Atrast iepriekšējo\nfind_previous_label=Iepriekšējā\nfind_next.title=Atrast nākamo\nfind_next_label=Nākamā\nfind_highlight=Iekrāsot visas\nfind_match_case_label=Lielo, mazo burtu jutīgs\nfind_entire_word_label=Veselus vārdus\nfind_reached_top=Sasniegts dokumenta sākums, turpinām no beigām\nfind_reached_bottom=Sasniegtas dokumenta beigas, turpinām no sākuma\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} no {{total}} rezultāta\nfind_match_count[two]={{current}} no {{total}} rezultātiem\nfind_match_count[few]={{current}} no {{total}} rezultātiem\nfind_match_count[many]={{current}} no {{total}} rezultātiem\nfind_match_count[other]={{current}} no {{total}} rezultātiem\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Vairāk nekā {{limit}} rezultāti\nfind_match_count_limit[one]=Vairāk nekā {{limit}} rezultāti\nfind_match_count_limit[two]=Vairāk nekā {{limit}} rezultāti\nfind_match_count_limit[few]=Vairāk nekā {{limit}} rezultāti\nfind_match_count_limit[many]=Vairāk nekā {{limit}} rezultāti\nfind_match_count_limit[other]=Vairāk nekā {{limit}} rezultāti\nfind_not_found=Frāze nav atrasta\n\n# Error panel labels\nerror_more_info=Vairāk informācijas\nerror_less_info=MAzāk informācijas\nerror_close=Close\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Ziņojums: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Steks: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rindiņa: {{line}}\nrendering_error=Attēlojot lapu radās kļūda\n\n# Predefined zoom values\npage_scale_width=Lapas platumā\npage_scale_fit=Ietilpinot lapu\npage_scale_auto=Automātiskais izmērs\npage_scale_actual=Patiesais izmērs\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Ielādējot PDF notika kļūda.\ninvalid_file_error=Nederīgs vai bojāts PDF fails.\nmissing_file_error=PDF fails nav atrasts.\nunexpected_response_error=Negaidīa servera atbilde.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} anotācija]\npassword_label=Ievadiet paroli, lai atvērtu PDF failu.\npassword_invalid=Nepareiza parole, mēģiniet vēlreiz.\npassword_ok=Labi\npassword_cancel=Atcelt\n\nprinting_not_supported=Uzmanību: Drukāšana no šī pārlūka darbojas tikai daļēji.\nprinting_not_ready=Uzmanību: PDF nav pilnībā ielādēts drukāšanai.\nweb_fonts_disabled=Tīmekļa fonti nav aktivizēti: Nevar iegult PDF fontus.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/meh/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página yata\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom.title=Nasa´a ka´nu/Nasa´a luli\nopen_file_label=Síne\n\n# Secondary toolbar and context menu\n\n\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized_yes=Kuvi\ndocument_properties_close=Nakasɨ\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Nkuvi-ka\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\nfindbar_label=Nánuku\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\n\n# Find panel button title and messages\nfind_input.title=Nánuku\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\n\n# Error panel labels\nerror_close=Nakasɨ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\n\n# Predefined zoom values\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\npassword_cancel=Nkuvi-ka\n\n"
  },
  {
    "path": "lib/pdf.js/web/locale/mk/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Претходна страница\nprevious_label=Претходна\nnext.title=Следна страница\nnext_label=Следна\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Намалување\nzoom_out_label=Намали\nzoom_in.title=Зголемување\nzoom_in_label=Зголеми\nzoom.title=Променување на големина\npresentation_mode.title=Премини во презентациски режим\npresentation_mode_label=Презентациски режим\nopen_file.title=Отворање датотека\nopen_file_label=Отвори\nprint.title=Печатење\nprint_label=Печати\ndownload.title=Преземање\ndownload_label=Преземи\nbookmark.title=Овој преглед (копирај или отвори во нов прозорец)\nbookmark_label=Овој преглед\n\n# Secondary toolbar and context menu\ntools.title=Алатки\nfirst_page.label=Оди до првата страница\nlast_page.label=Оди до последната страница\npage_rotate_cw.label=Ротирај по стрелките на часовникот\npage_rotate_ccw.label=Ротирај спротивно од стрелките на часовникот\n\n\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_close=Откажи\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Вклучи странична лента\ntoggle_sidebar_label=Вклучи странична лента\nthumbs.title=Прикажување на икони\nthumbs_label=Икони\nfindbar.title=Најди во документот\nfindbar_label=Најди\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Страница {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Икона од страница {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Најди ја предходната појава на фразата\nfind_previous_label=Претходно\nfind_next.title=Најди ја следната појава на фразата\nfind_next_label=Следно\nfind_highlight=Означи сѐ\nfind_match_case_label=Токму така\nfind_reached_top=Барањето стигна до почетокот на документот и почнува од крајот\nfind_reached_bottom=Барањето стигна до крајот на документот и почнува од почеток\nfind_not_found=Фразата не е пронајдена\n\n# Error panel labels\nerror_more_info=Повеќе информации\nerror_less_info=Помалку информации\nerror_close=Затвори\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Порака: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Датотека: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Линија: {{line}}\nrendering_error=Настана грешка при прикажувањето на страницата.\n\n# Predefined zoom values\npage_scale_width=Ширина на страница\npage_scale_fit=Цела страница\npage_scale_auto=Автоматска големина\npage_scale_actual=Вистинска големина\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error=Настана грешка при вчитувањето на PDF-от.\ninvalid_file_error=Невалидна или корумпирана PDF датотека.\nmissing_file_error=Недостасува PDF документ.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\npassword_cancel=Откажи\n\nprinting_not_supported=Предупредување: Печатењето не е целосно поддржано во овој прелистувач.\nprinting_not_ready=Предупредување: PDF документот не е целосно вчитан за печатење.\nweb_fonts_disabled=Интернет фонтовите се оневозможени: не може да се користат вградените PDF фонтови.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/mr/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=मागील पृष्ठ\nprevious_label=मागील\nnext.title=पुढील पृष्ठ\nnext_label=पुढील\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=पृष्ठ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}}पैकी\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pagesCount}} पैकी {{pageNumber}})\n\nzoom_out.title=छोटे करा\nzoom_out_label=छोटे करा\nzoom_in.title=मोठे करा\nzoom_in_label=मोठे करा\nzoom.title=लहान किंवा मोठे करा\npresentation_mode.title=प्रस्तुतिकरण मोडचा वापर करा\npresentation_mode_label=प्रस्तुतिकरण मोड\nopen_file.title=फाइल उघडा\nopen_file_label=उघडा\nprint.title=छपाई करा\nprint_label=छपाई करा\ndownload.title=डाउनलोड करा\ndownload_label=डाउनलोड करा\nbookmark.title=सध्याचे अवलोकन (नवीन पटलात प्रत बनवा किंवा उघडा)\nbookmark_label=सध्याचे अवलोकन\n\n# Secondary toolbar and context menu\ntools.title=साधने\ntools_label=साधने\nfirst_page.title=पहिल्या पृष्ठावर जा\nfirst_page.label=पहिल्या पृष्ठावर जा\nfirst_page_label=पहिल्या पृष्ठावर जा\nlast_page.title=शेवटच्या पृष्ठावर जा\nlast_page.label=शेवटच्या पृष्ठावर जा\nlast_page_label=शेवटच्या पृष्ठावर जा\npage_rotate_cw.title=घड्याळाच्या काट्याच्या दिशेने फिरवा\npage_rotate_cw.label=घड्याळाच्या काट्याच्या दिशेने फिरवा\npage_rotate_cw_label=घड्याळाच्या काट्याच्या दिशेने फिरवा\npage_rotate_ccw.title=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा\npage_rotate_ccw.label=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा\npage_rotate_ccw_label=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा\n\ncursor_text_select_tool.title=मजकूर निवड साधन कार्यान्वयीत करा\ncursor_text_select_tool_label=मजकूर निवड साधन\ncursor_hand_tool.title=हात साधन कार्यान्वित करा\ncursor_hand_tool_label=हस्त साधन\n\nscroll_vertical.title=अनुलंब स्क्रोलिंग वापरा\nscroll_vertical_label=अनुलंब स्क्रोलिंग\nscroll_horizontal.title=क्षैतिज स्क्रोलिंग वापरा\nscroll_horizontal_label=क्षैतिज स्क्रोलिंग\n\n\n# Document properties dialog box\ndocument_properties.title=दस्तऐवज गुणधर्म…\ndocument_properties_label=दस्तऐवज गुणधर्म…\ndocument_properties_file_name=फाइलचे नाव:\ndocument_properties_file_size=फाइल आकार:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} बाइट्स)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} बाइट्स)\ndocument_properties_title=शिर्षक:\ndocument_properties_author=लेखक:\ndocument_properties_subject=विषय:\ndocument_properties_keywords=मुख्यशब्द:\ndocument_properties_creation_date=निर्माण दिनांक:\ndocument_properties_modification_date=दुरूस्ती दिनांक:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=निर्माता:\ndocument_properties_producer=PDF निर्माता:\ndocument_properties_version=PDF आवृत्ती:\ndocument_properties_page_count=पृष्ठ संख्या:\ndocument_properties_page_size=पृष्ठ आकार:\ndocument_properties_page_size_unit_inches=इंच\ndocument_properties_page_size_unit_millimeters=मीमी\ndocument_properties_page_size_orientation_portrait=उभी मांडणी\ndocument_properties_page_size_orientation_landscape=आडवे\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=जलद वेब दृष्य:\ndocument_properties_linearized_yes=हो\ndocument_properties_linearized_no=नाही\ndocument_properties_close=बंद करा\n\nprint_progress_message=छपाई करीता पृष्ठ तयार करीत आहे…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=रद्द करा\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=बाजूचीपट्टी टॉगल करा\ntoggle_sidebar_notification.title=बाजूची पट्टी टॉगल करा (दस्तऐवजामध्ये रुपरेषा/जोडण्या आहेत)\ntoggle_sidebar_label=बाजूचीपट्टी टॉगल करा\ndocument_outline.title=दस्तऐवज बाह्यरेखा दर्शवा (विस्तृत करण्यासाठी दोनवेळा क्लिक करा /सर्व घटक दाखवा)\ndocument_outline_label=दस्तऐवज रूपरेषा\nattachments.title=जोडपत्र दाखवा\nattachments_label=जोडपत्र\nthumbs.title=थंबनेल्स् दाखवा\nthumbs_label=थंबनेल्स्\nfindbar.title=दस्तऐवजात शोधा\nfindbar_label=शोधा\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=पृष्ठ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=पृष्ठाचे थंबनेल {{page}}\n\n# Find panel button title and messages\nfind_input.title=शोधा\nfind_input.placeholder=दस्तऐवजात शोधा…\nfind_previous.title=वाकप्रयोगची मागील घटना शोधा\nfind_previous_label=मागील\nfind_next.title=वाकप्रयोगची पुढील घटना शोधा\nfind_next_label=पुढील\nfind_highlight=सर्व ठळक करा\nfind_match_case_label=आकार जुळवा\nfind_entire_word_label=संपूर्ण शब्द\nfind_reached_top=दस्तऐवजाच्या शीर्षकास पोहचले, तळपासून पुढे\nfind_reached_bottom=दस्तऐवजाच्या तळाला पोहचले, शीर्षकापासून पुढे\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{total}} पैकी {{current}} सुसंगत\nfind_match_count[two]={{total}} पैकी {{current}} सुसंगत\nfind_match_count[few]={{total}} पैकी {{current}} सुसंगत\nfind_match_count[many]={{total}} पैकी {{current}} सुसंगत\nfind_match_count[other]={{total}} पैकी {{current}} सुसंगत\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]={{limit}} पेक्षा अधिक जुळण्या\nfind_match_count_limit[one]={{limit}} पेक्षा अधिक जुळण्या\nfind_match_count_limit[two]={{limit}} पेक्षा अधिक जुळण्या\nfind_match_count_limit[few]={{limit}} पेक्षा अधिक जुळण्या\nfind_match_count_limit[many]={{limit}} पेक्षा अधिक जुळण्या\nfind_match_count_limit[other]={{limit}} पेक्षा अधिक जुळण्या\nfind_not_found=वाकप्रयोग आढळले नाही\n\n# Error panel labels\nerror_more_info=आणखी माहिती\nerror_less_info=कमी माहिती\nerror_close=बंद करा\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=संदेश: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=स्टॅक: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=फाइल: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=रेष: {{line}}\nrendering_error=पृष्ठ दाखवतेवेळी त्रुटी आढळली.\n\n# Predefined zoom values\npage_scale_width=पृष्ठाची रूंदी\npage_scale_fit=पृष्ठ बसवा\npage_scale_auto=स्वयं लाहन किंवा मोठे करणे\npage_scale_actual=प्रत्यक्ष आकार\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=PDF लोड करतेवेळी त्रुटी आढळली.\ninvalid_file_error=अवैध किंवा दोषीत PDF फाइल.\nmissing_file_error=न आढळणारी PDF फाइल.\nunexpected_response_error=अनपेक्षित सर्व्हर प्रतिसाद.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} टिपण्णी]\npassword_label=ही PDF फाइल उघडण्याकरिता पासवर्ड द्या.\npassword_invalid=अवैध पासवर्ड. कृपया पुन्हा प्रयत्न करा.\npassword_ok=ठीक आहे\npassword_cancel=रद्द करा\n\nprinting_not_supported=सावधानता: या ब्राउझरतर्फे छपाइ पूर्णपणे समर्थीत नाही.\nprinting_not_ready=सावधानता: छपाईकरिता PDF पूर्णतया लोड झाले नाही.\nweb_fonts_disabled=वेब टंक असमर्थीत आहेत: एम्बेडेड PDF टंक वापर अशक्य.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/ms/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Halaman Dahulu\nprevious_label=Dahulu\nnext.title=Halaman Berikut\nnext_label=Berikut\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Halaman\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=daripada {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} daripada {{pagesCount}})\n\nzoom_out.title=Zum Keluar\nzoom_out_label=Zum Keluar\nzoom_in.title=Zum Masuk\nzoom_in_label=Zum Masuk\nzoom.title=Zum\npresentation_mode.title=Tukar ke Mod Persembahan\npresentation_mode_label=Mod Persembahan\nopen_file.title=Buka Fail\nopen_file_label=Buka\nprint.title=Cetak\nprint_label=Cetak\ndownload.title=Muat turun\ndownload_label=Muat turun\nbookmark.title=Paparan semasa (salin atau buka dalam tetingkap baru)\nbookmark_label=Paparan Semasa\n\n# Secondary toolbar and context menu\ntools.title=Alatan\ntools_label=Alatan\nfirst_page.title=Pergi ke Halaman Pertama\nfirst_page.label=Pergi ke Halaman Pertama\nfirst_page_label=Pergi ke Halaman Pertama\nlast_page.title=Pergi ke Halaman Terakhir\nlast_page.label=Pergi ke Halaman Terakhir\nlast_page_label=Pergi ke Halaman Terakhir\npage_rotate_cw.title=Berputar ikut arah Jam\npage_rotate_cw.label=Berputar ikut arah Jam\npage_rotate_cw_label=Berputar ikut arah Jam\npage_rotate_ccw.title=Pusing berlawan arah jam\npage_rotate_ccw.label=Pusing berlawan arah jam\npage_rotate_ccw_label=Pusing berlawan arah jam\n\ncursor_text_select_tool.title=Dayakan Alatan Pilihan Teks\ncursor_text_select_tool_label=Alatan Pilihan Teks\ncursor_hand_tool.title=Dayakan Alatan Tangan\ncursor_hand_tool_label=Alatan Tangan\n\nscroll_vertical.title=Guna Skrol Menegak\nscroll_vertical_label=Skrol Menegak\nscroll_horizontal.title=Guna Skrol Mengufuk\nscroll_horizontal_label=Skrol Mengufuk\nscroll_wrapped.title=Guna Skrol Berbalut\nscroll_wrapped_label=Skrol Berbalut\n\nspread_none.title=Jangan hubungkan hamparan halaman\nspread_none_label=Tanpa Hamparan\nspread_odd.title=Hubungkan hamparan halaman dengan halaman nombor ganjil\nspread_odd_label=Hamparan Ganjil\nspread_even.title=Hubungkan hamparan halaman dengan halaman nombor genap\nspread_even_label=Hamparan Seimbang\n\n# Document properties dialog box\ndocument_properties.title=Sifat Dokumen…\ndocument_properties_label=Sifat Dokumen…\ndocument_properties_file_name=Nama fail:\ndocument_properties_file_size=Saiz fail:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bait)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bait)\ndocument_properties_title=Tajuk:\ndocument_properties_author=Pengarang:\ndocument_properties_subject=Subjek:\ndocument_properties_keywords=Kata kunci:\ndocument_properties_creation_date=Masa Dicipta:\ndocument_properties_modification_date=Tarikh Ubahsuai:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Pencipta:\ndocument_properties_producer=Pengeluar PDF:\ndocument_properties_version=Versi PDF:\ndocument_properties_page_count=Kiraan Laman:\ndocument_properties_page_size=Saiz Halaman:\ndocument_properties_page_size_unit_inches=dalam\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=potret\ndocument_properties_page_size_orientation_landscape=landskap\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Paparan Web Pantas:\ndocument_properties_linearized_yes=Ya\ndocument_properties_linearized_no=Tidak\ndocument_properties_close=Tutup\n\nprint_progress_message=Menyediakan dokumen untuk dicetak…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Batal\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Togol Bar Sisi\ntoggle_sidebar_notification.title=Togol Sidebar (dokumen mengandungi rangka/attachments)\ntoggle_sidebar_label=Togol Bar Sisi\ndocument_outline.title=Papar Rangka Dokumen (klik-dua-kali untuk kembangkan/kolaps semua item)\ndocument_outline_label=Rangka Dokumen\nattachments.title=Papar Lampiran\nattachments_label=Lampiran\nthumbs.title=Papar Thumbnails\nthumbs_label=Imej kecil\nfindbar.title=Cari didalam Dokumen\nfindbar_label=Cari\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Halaman {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Halaman Imej kecil {{page}}\n\n# Find panel button title and messages\nfind_input.title=Cari\nfind_input.placeholder=Cari dalam dokumen…\nfind_previous.title=Cari teks frasa berkenaan yang terdahulu\nfind_previous_label=Dahulu\nfind_next.title=Cari teks frasa berkenaan yang berikut\nfind_next_label=Berikut\nfind_highlight=Serlahkan semua\nfind_match_case_label=Huruf sepadan\nfind_entire_word_label=Seluruh perkataan\nfind_reached_top=Mencapai teratas daripada dokumen, sambungan daripada bawah\nfind_reached_bottom=Mencapai terakhir daripada dokumen, sambungan daripada atas\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} daripada {{total}} padanan\nfind_match_count[two]={{current}} daripada {{total}} padanan\nfind_match_count[few]={{current}} daripada {{total}} padanan\nfind_match_count[many]={{current}} daripada {{total}} padanan\nfind_match_count[other]={{current}} daripada {{total}} padanan\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Lebih daripada {{limit}} padanan\nfind_match_count_limit[one]=Lebih daripada {{limit}} padanan\nfind_match_count_limit[two]=Lebih daripada {{limit}} padanan\nfind_match_count_limit[few]=Lebih daripada {{limit}} padanan\nfind_match_count_limit[many]=Lebih daripada {{limit}} padanan\nfind_match_count_limit[other]=Lebih daripada {{limit}} padanan\nfind_not_found=Frasa tidak ditemui\n\n# Error panel labels\nerror_more_info=Maklumat Lanjut\nerror_less_info=Kurang Informasi\nerror_close=Tutup\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mesej: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Timbun: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fail: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Garis: {{line}}\nrendering_error=Ralat berlaku ketika memberikan halaman.\n\n# Predefined zoom values\npage_scale_width=Lebar Halaman\npage_scale_fit=Muat Halaman\npage_scale_auto=Zoom Automatik\npage_scale_actual=Saiz Sebenar\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Masalah berlaku semasa menuatkan sebuah PDF.\ninvalid_file_error=Tidak sah atau fail PDF rosak.\nmissing_file_error=Fail PDF Hilang.\nunexpected_response_error=Respon pelayan yang tidak dijangka.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Anotasi]\npassword_label=Masukan kata kunci untuk membuka fail PDF ini.\npassword_invalid=Kata laluan salah. Cuba lagi.\npassword_ok=OK\npassword_cancel=Batal\n\nprinting_not_supported=Amaran: Cetakan ini tidak sepenuhnya disokong oleh pelayar ini.\nprinting_not_ready=Amaran: PDF tidak sepenuhnya dimuatkan untuk dicetak.\nweb_fonts_disabled=Fon web dinyahdayakan: tidak dapat menggunakan fon terbenam PDF.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/my/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=အရင် စာမျက်နှာ\nprevious_label=အရင်နေရာ\nnext.title=ရှေ့ စာမျက်နှာ\nnext_label=နောက်တခု\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=စာမျက်နှာ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} ၏\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pagesCount}} ၏ {{pageNumber}})\n\nzoom_out.title=ချုံ့ပါ\nzoom_out_label=ချုံ့ပါ\nzoom_in.title=ချဲ့ပါ\nzoom_in_label=ချဲ့ပါ\nzoom.title=ချုံ့/ချဲ့ပါ\npresentation_mode.title=ဆွေးနွေးတင်ပြစနစ်သို့ ကူးပြောင်းပါ\npresentation_mode_label=ဆွေးနွေးတင်ပြစနစ်\nopen_file.title=ဖိုင်အားဖွင့်ပါ။\nopen_file_label=ဖွင့်ပါ\nprint.title=ပုံနှိုပ်ပါ\nprint_label=ပုံနှိုပ်ပါ\ndownload.title=ကူးဆွဲ\ndownload_label=ကူးဆွဲ\nbookmark.title=လက်ရှိ မြင်ကွင်း (ဝင်းဒိုးအသစ်မှာ ကူးပါ သို့မဟုတ် ဖွင့်ပါ)\nbookmark_label=လက်ရှိ မြင်ကွင်း\n\n# Secondary toolbar and context menu\ntools.title=ကိရိယာများ\ntools_label=ကိရိယာများ\nfirst_page.title=ပထမ စာမျက်နှာသို့\nfirst_page.label=ပထမ စာမျက်နှာသို့\nfirst_page_label=ပထမ စာမျက်နှာသို့\nlast_page.title=နောက်ဆုံး စာမျက်နှာသို့\nlast_page.label=နောက်ဆုံး စာမျက်နှာသို့\nlast_page_label=နောက်ဆုံး စာမျက်နှာသို့\npage_rotate_cw.title=နာရီလက်တံ အတိုင်း\npage_rotate_cw.label=နာရီလက်တံ အတိုင်း\npage_rotate_cw_label=နာရီလက်တံ အတိုင်း\npage_rotate_ccw.title=နာရီလက်တံ ပြောင်းပြန်\npage_rotate_ccw.label=နာရီလက်တံ ပြောင်းပြန်\npage_rotate_ccw_label=နာရီလက်တံ ပြောင်းပြန်\n\n\n\n\n# Document properties dialog box\ndocument_properties.title=မှတ်တမ်းမှတ်ရာ ဂုဏ်သတ္တိများ\ndocument_properties_label=မှတ်တမ်းမှတ်ရာ ဂုဏ်သတ္တိများ\ndocument_properties_file_name=ဖိုင် :\ndocument_properties_file_size=ဖိုင်ဆိုဒ် :\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} ကီလိုဘိုတ် ({{size_b}}ဘိုတ်)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=ခေါင်းစဉ်‌ -\ndocument_properties_author=ရေးသားသူ:\ndocument_properties_subject=အကြောင်းအရာ:\\u0020\ndocument_properties_keywords=သော့ချက် စာလုံး:\ndocument_properties_creation_date=ထုတ်လုပ်ရက်စွဲ:\ndocument_properties_modification_date=ပြင်ဆင်ရက်စွဲ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=ဖန်တီးသူ:\ndocument_properties_producer=PDF ထုတ်လုပ်သူ:\ndocument_properties_version=PDF ဗားရှင်း:\ndocument_properties_page_count=စာမျက်နှာအရေအတွက်:\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_close=ပိတ်\n\nprint_progress_message=Preparing document for printing…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=ပယ်​ဖျက်ပါ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=ဘေးတန်းဖွင့်ပိတ်\ntoggle_sidebar_notification.title=ဘေးဘားတန်းကို အဖွင့်/အပိတ် လုပ်ရန် (စာတမ်းတွင် outline/attachments ပါဝင်နိုင်သည်)\ntoggle_sidebar_label=ဖွင့်ပိတ် ဆလိုက်ဒါ\ndocument_outline.title=စာတမ်းအကျဉ်းချုပ်ကို ပြပါ (စာရင်းအားလုံးကို ချုံ့/ချဲ့ရန် ကလစ်နှစ်ချက်နှိပ်ပါ)\ndocument_outline_label=စာတမ်းအကျဉ်းချုပ်\nattachments.title=တွဲချက်များ ပြပါ\nattachments_label=တွဲထားချက်များ\nthumbs.title=ပုံရိပ်ငယ်များကို ပြပါ\nthumbs_label=ပုံရိပ်ငယ်များ\nfindbar.title=Find in Document\nfindbar_label=ရှာဖွေပါ\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=စာမျက်နှာ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=စာမျက်နှာရဲ့ ပုံရိပ်ငယ် {{page}}\n\n# Find panel button title and messages\nfind_input.title=ရှာဖွေပါ\nfind_input.placeholder=စာတမ်းထဲတွင် ရှာဖွေရန်…\nfind_previous.title=စကားစုရဲ့ အရင် ​ဖြစ်ပွားမှုကို ရှာဖွေပါ\nfind_previous_label=နောက်သို့\nfind_next.title=စကားစုရဲ့ နောက်ထပ် ​ဖြစ်ပွားမှုကို ရှာဖွေပါ\nfind_next_label=ရှေ့သို့\nfind_highlight=အားလုံးကို မျဉ်းသားပါ\nfind_match_case_label=စာလုံး တိုက်ဆိုင်ပါ\nfind_reached_top=စာမျက်နှာထိပ် ရောက်နေပြီ၊ အဆုံးကနေ ပြန်စပါ\nfind_reached_bottom=စာမျက်နှာအဆုံး ရောက်နေပြီ၊ ထိပ်ကနေ ပြန်စပါ\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_not_found=စကားစု မတွေ့ရဘူး\n\n# Error panel labels\nerror_more_info=နောက်ထပ်အချက်အလက်များ\nerror_less_info=အနည်းငယ်မျှသော သတင်းအချက်အလက်\nerror_close=ပိတ်\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=မက်ဆေ့ - {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=အထပ် - {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ဖိုင် {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=လိုင်း - {{line}}\nrendering_error=စာမျက်နှာကို ပုံဖော်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။\n\n# Predefined zoom values\npage_scale_width=စာမျက်နှာ အကျယ်\npage_scale_fit=စာမျက်နှာ ကွက်တိ\npage_scale_auto=အလိုအလျောက် ချုံ့ချဲ့\npage_scale_actual=အမှန်တကယ်ရှိတဲ့ အရွယ်\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=PDF ဖိုင် ကိုဆွဲတင်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။\ninvalid_file_error=မရသော သို့ ပျက်နေသော PDF ဖိုင်\nmissing_file_error=PDF ပျောက်ဆုံး\nunexpected_response_error=မမျှော်လင့်ထားသော ဆာဗာမှ ပြန်ကြားချက်\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} အဓိပ္ပာယ်ဖွင့်ဆိုချက်]\npassword_label=ယခု PDF ကို ဖွင့်ရန် စကားဝှက်ကို ရိုက်ပါ။\npassword_invalid=စာဝှက် မှားသည်။ ထပ်ကြိုးစားကြည့်ပါ။\npassword_ok=OK\npassword_cancel=ပယ်​ဖျက်ပါ\n\nprinting_not_supported=သတိပေးချက်၊ပရင့်ထုတ်ခြင်းကိုဤဘယောက်ဆာသည် ပြည့်ဝစွာထောက်ပံ့မထားပါ ။\nprinting_not_ready=သတိပေးချက်: ယခု PDF ဖိုင်သည် ပုံနှိပ်ရန် မပြည့်စုံပါ\nweb_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/nb-NO/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Forrige side\nprevious_label=Forrige\nnext.title=Neste side\nnext_label=Neste\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Side\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=av {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} av {{pagesCount}})\n\nzoom_out.title=Zoom ut\nzoom_out_label=Zoom ut\nzoom_in.title=Zoom inn\nzoom_in_label=Zoom inn\nzoom.title=Zoom\npresentation_mode.title=Bytt til presentasjonsmodus\npresentation_mode_label=Presentasjonsmodus\nopen_file.title=Åpne fil\nopen_file_label=Åpne\nprint.title=Skriv ut\nprint_label=Skriv ut\ndownload.title=Last ned\ndownload_label=Last ned\nbookmark.title=Nåværende visning (kopier eller åpne i et nytt vindu)\nbookmark_label=Nåværende visning\n\n# Secondary toolbar and context menu\ntools.title=Verktøy\ntools_label=Verktøy\nfirst_page.title=Gå til første side\nfirst_page.label=Gå til første side\nfirst_page_label=Gå til første side\nlast_page.title=Gå til siste side\nlast_page.label=Gå til siste side\nlast_page_label=Gå til siste side\npage_rotate_cw.title=Roter med klokken\npage_rotate_cw.label=Roter med klokken\npage_rotate_cw_label=Roter med klokken\npage_rotate_ccw.title=Roter mot klokken\npage_rotate_ccw.label=Roter mot klokken\npage_rotate_ccw_label=Roter mot klokken\n\ncursor_text_select_tool.title=Aktiver tekstmarkeringsverktøy\ncursor_text_select_tool_label=Tekstmarkeringsverktøy\ncursor_hand_tool.title=Aktiver handverktøy\ncursor_hand_tool_label=Handverktøy\n\nscroll_vertical.title=Bruk vertikal rulling\nscroll_vertical_label=Vertikal rulling\nscroll_horizontal.title=Bruk horisontal rulling\nscroll_horizontal_label=Horisontal rulling\nscroll_wrapped.title=Bruk flersiderulling\nscroll_wrapped_label=Flersiderulling\n\nspread_none.title=Vis enkeltsider\nspread_none_label=Enkeltsider\nspread_odd.title=Vis oppslag med ulike sidenumre til venstre\nspread_odd_label=Oppslag med forside\nspread_even.title=Vis oppslag med like sidenumre til venstre\nspread_even_label=Oppslag uten forside\n\n# Document properties dialog box\ndocument_properties.title=Dokumentegenskaper …\ndocument_properties_label=Dokumentegenskaper …\ndocument_properties_file_name=Filnavn:\ndocument_properties_file_size=Filstørrelse:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Dokumentegenskaper …\ndocument_properties_author=Forfatter:\ndocument_properties_subject=Emne:\ndocument_properties_keywords=Nøkkelord:\ndocument_properties_creation_date=Opprettet dato:\ndocument_properties_modification_date=Endret dato:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Opprettet av:\ndocument_properties_producer=PDF-verktøy:\ndocument_properties_version=PDF-versjon:\ndocument_properties_page_count=Sideantall:\ndocument_properties_page_size=Sidestørrelse:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=stående\ndocument_properties_page_size_orientation_landscape=liggende\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Hurtig nettvisning:\ndocument_properties_linearized_yes=Ja\ndocument_properties_linearized_no=Nei\ndocument_properties_close=Lukk\n\nprint_progress_message=Forbereder dokument for utskrift …\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Avbryt\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Slå av/på sidestolpe\ntoggle_sidebar_notification.title=Vis/gjem sidestolpe (dokumentet inneholder oversikt/vedlegg)\ntoggle_sidebar_notification2.title=Vis/gjem sidestolpe (dokumentet inneholder oversikt/vedlegg/lag)\ntoggle_sidebar_label=Slå av/på sidestolpe\ndocument_outline.title=Vis dokumentdisposisjonen (dobbeltklikk for å utvide/skjule alle elementer)\ndocument_outline_label=Dokumentdisposisjon\nattachments.title=Vis vedlegg\nattachments_label=Vedlegg\nlayers.title=Vis lag (dobbeltklikk for å tilbakestille alle lag til standardtilstand)\nlayers_label=Lag\nthumbs.title=Vis miniatyrbilde\nthumbs_label=Miniatyrbilde\ncurrent_outline_item.title=Finn gjeldende disposisjonselement\ncurrent_outline_item_label=Gjeldende disposisjonselement\nfindbar.title=Finn i dokumentet\nfindbar_label=Finn\n\nadditional_layers=Ytterligere lag\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Side {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Side {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatyrbilde av side {{page}}\n\n# Find panel button title and messages\nfind_input.title=Søk\nfind_input.placeholder=Søk i dokument…\nfind_previous.title=Finn forrige forekomst av frasen\nfind_previous_label=Forrige\nfind_next.title=Finn neste forekomst av frasen\nfind_next_label=Neste\nfind_highlight=Uthev alle\nfind_match_case_label=Skill store/små bokstaver\nfind_entire_word_label=Hele ord\nfind_reached_top=Nådde toppen av dokumentet, fortsetter fra bunnen\nfind_reached_bottom=Nådde bunnen av dokumentet, fortsetter fra toppen\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} av {{total}} treff\nfind_match_count[two]={{current}} av {{total}} treff\nfind_match_count[few]={{current}} av {{total}} treff\nfind_match_count[many]={{current}} av {{total}} treff\nfind_match_count[other]={{current}} av {{total}} treff\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Mer enn {{limit}} treff\nfind_match_count_limit[one]=Mer enn {{limit}} treff\nfind_match_count_limit[two]=Mer enn {{limit}} treff\nfind_match_count_limit[few]=Mer enn {{limit}} treff\nfind_match_count_limit[many]=Mer enn {{limit}} treff\nfind_match_count_limit[other]=Mer enn {{limit}} treff\nfind_not_found=Fant ikke teksten\n\n# Error panel labels\nerror_more_info=Mer info\nerror_less_info=Mindre info\nerror_close=Lukk\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (bygg: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Melding: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stakk: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fil: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linje: {{line}}\nrendering_error=En feil oppstod ved opptegning av siden.\n\n# Predefined zoom values\npage_scale_width=Sidebredde\npage_scale_fit=Tilpass til siden\npage_scale_auto=Automatisk zoom\npage_scale_actual=Virkelig størrelse\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}} %\n\n# Loading indicator messages\nloading_error=En feil oppstod ved lasting av PDF.\ninvalid_file_error=Ugyldig eller skadet PDF-fil.\nmissing_file_error=Manglende PDF-fil.\nunexpected_response_error=Uventet serverrespons.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} annotasjon]\npassword_label=Skriv inn passordet for å åpne denne PDF-filen.\npassword_invalid=Ugyldig passord. Prøv igjen.\npassword_ok=OK\npassword_cancel=Avbryt\n\nprinting_not_supported=Advarsel: Utskrift er ikke fullstendig støttet av denne nettleseren.\nprinting_not_ready=Advarsel: PDF er ikke fullstendig innlastet for utskrift.\nweb_fonts_disabled=Web-fonter er avslått: Kan ikke bruke innbundne PDF-fonter.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/ne-NP/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=अघिल्लो पृष्ठ\nprevious_label=अघिल्लो\nnext.title=पछिल्लो पृष्ठ\nnext_label=पछिल्लो\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=पृष्ठ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} मध्ये\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pagesCount}} को {{pageNumber}})\n\nzoom_out.title=जुम घटाउनुहोस्\nzoom_out_label=जुम घटाउनुहोस्\nzoom_in.title=जुम बढाउनुहोस्\nzoom_in_label=जुम बढाउनुहोस्\nzoom.title=जुम गर्नुहोस्\npresentation_mode.title=प्रस्तुति मोडमा जानुहोस्\npresentation_mode_label=प्रस्तुति मोड\nopen_file.title=फाइल खोल्नुहोस्\nopen_file_label=खोल्नुहोस्\nprint.title=मुद्रण गर्नुहोस्\nprint_label=मुद्रण गर्नुहोस्\ndownload.title=डाउनलोडहरू\ndownload_label=डाउनलोडहरू\nbookmark.title=वर्तमान दृश्य (प्रतिलिपि गर्नुहोस् वा नयाँ सञ्झ्यालमा खुल्नुहोस्)\nbookmark_label=हालको दृश्य\n\n# Secondary toolbar and context menu\ntools.title=औजारहरू\ntools_label=औजारहरू\nfirst_page.title=पहिलो पृष्ठमा जानुहोस्\nfirst_page.label=पहिलो पृष्ठमा जानुहोस्\nfirst_page_label=पहिलो पृष्ठमा जानुहोस्\nlast_page.title=पछिल्लो पृष्ठमा जानुहोस्\nlast_page.label=पछिल्लो पृष्ठमा जानुहोस्\nlast_page_label=पछिल्लो पृष्ठमा जानुहोस्\npage_rotate_cw.title=घडीको दिशामा घुमाउनुहोस्\npage_rotate_cw.label=घडीको दिशामा घुमाउनुहोस्\npage_rotate_cw_label=घडीको दिशामा घुमाउनुहोस्\npage_rotate_ccw.title=घडीको विपरित दिशामा घुमाउनुहोस्\npage_rotate_ccw.label=घडीको विपरित दिशामा घुमाउनुहोस्\npage_rotate_ccw_label=घडीको विपरित दिशामा घुमाउनुहोस्\n\ncursor_text_select_tool.title=पाठ चयन उपकरण सक्षम गर्नुहोस्\ncursor_text_select_tool_label=पाठ चयन उपकरण\ncursor_hand_tool.title=हाते उपकरण सक्षम गर्नुहोस्\ncursor_hand_tool_label=हाते उपकरण\n\n# Document properties dialog box\ndocument_properties.title=कागजात विशेषताहरू...\ndocument_properties_label=कागजात विशेषताहरू...\ndocument_properties_file_name=फाइल नाम:\ndocument_properties_file_size=फाइल आकार:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=शीर्षक:\ndocument_properties_author=लेखक:\ndocument_properties_subject=विषयः\ndocument_properties_keywords=शब्दकुञ्जीः\ndocument_properties_creation_date=सिर्जना गरिएको मिति:\ndocument_properties_modification_date=परिमार्जित मिति:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=सर्जक:\ndocument_properties_producer=PDF निर्माता:\ndocument_properties_version=PDF संस्करण\ndocument_properties_page_count=पृष्ठ गणना:\ndocument_properties_close=बन्द गर्नुहोस्\n\nprint_progress_message=मुद्रणका लागि कागजात तयारी गरिदै…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=रद्द गर्नुहोस्\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=टगल साइडबार\ntoggle_sidebar_notification.title=साइडबार टगल गर्नुहोस् (कागजातमा समावेश भएको कुराहरू रूपरेखा/attachments)\ntoggle_sidebar_label=टगल साइडबार\ndocument_outline.title=कागजातको रूपरेखा देखाउनुहोस् (सबै वस्तुहरू विस्तार/पतन गर्न डबल-क्लिक गर्नुहोस्)\ndocument_outline_label=दस्तावेजको रूपरेखा\nattachments.title=संलग्नहरू देखाउनुहोस्\nattachments_label=संलग्नकहरू\nthumbs.title=थम्बनेलहरू देखाउनुहोस्\nthumbs_label=थम्बनेलहरू\nfindbar.title=कागजातमा फेला पार्नुहोस्\nfindbar_label=फेला पार्नुहोस्\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=पृष्ठ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} पृष्ठको थम्बनेल\n\n# Find panel button title and messages\nfind_input.title=फेला पार्नुहोस्\nfind_input.placeholder=कागजातमा फेला पार्नुहोस्…\nfind_previous.title=यस वाक्यांशको अघिल्लो घटना फेला पार्नुहोस्\nfind_previous_label=अघिल्लो\nfind_next.title=यस वाक्यांशको पछिल्लो घटना फेला पार्नुहोस्\nfind_next_label=अर्को\nfind_highlight=सबै हाइलाइट गर्ने\nfind_match_case_label=केस जोडा मिलाउनुहोस्\nfind_reached_top=पृष्ठको शिर्षमा पुगीयो, तलबाट जारी गरिएको थियो\nfind_reached_bottom=पृष्ठको अन्त्यमा पुगीयो, शिर्षबाट जारी गरिएको थियो\nfind_not_found=वाक्यांश फेला परेन\n\n# Error panel labels\nerror_more_info=थप जानकारी\nerror_less_info=कम जानकारी\nerror_close=बन्द गर्नुहोस्\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=सन्देश: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=स्ट्याक: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=फाइल: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=लाइन: {{line}}\nrendering_error=पृष्ठ प्रतिपादन गर्दा एउटा त्रुटि देखापर्‍यो।\n\n# Predefined zoom values\npage_scale_width=पृष्ठ चौडाइ\npage_scale_fit=पृष्ठ ठिक्क मिल्ने\npage_scale_auto=स्वचालित जुम\npage_scale_actual=वास्तविक आकार\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=यो PDF लोड गर्दा एउटा त्रुटि देखापर्‍यो।\ninvalid_file_error=अवैध वा दुषित PDF फाइल।\nmissing_file_error=हराईरहेको PDF फाइल।\nunexpected_response_error=अप्रत्याशित सर्भर प्रतिक्रिया।\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=यस PDF फाइललाई खोल्न गोप्यशब्द प्रविष्ट गर्नुहोस्।\npassword_invalid=अवैध गोप्यशब्द। पुनः प्रयास गर्नुहोस्।\npassword_ok=ठिक छ\npassword_cancel=रद्द गर्नुहोस्\n\nprinting_not_supported=चेतावनी: यो ब्राउजरमा मुद्रण पूर्णतया समर्थित छैन।\nprinting_not_ready=चेतावनी: PDF मुद्रणका लागि पूर्णतया लोड भएको छैन।\nweb_fonts_disabled=वेब फन्ट असक्षम छन्: एम्बेडेड PDF फन्ट प्रयोग गर्न असमर्थ।\n"
  },
  {
    "path": "lib/pdf.js/web/locale/nl/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Vorige pagina\nprevious_label=Vorige\nnext.title=Volgende pagina\nnext_label=Volgende\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pagina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=van {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} van {{pagesCount}})\n\nzoom_out.title=Uitzoomen\nzoom_out_label=Uitzoomen\nzoom_in.title=Inzoomen\nzoom_in_label=Inzoomen\nzoom.title=Zoomen\npresentation_mode.title=Wisselen naar presentatiemodus\npresentation_mode_label=Presentatiemodus\nopen_file.title=Bestand openen\nopen_file_label=Openen\nprint.title=Afdrukken\nprint_label=Afdrukken\ndownload.title=Downloaden\ndownload_label=Downloaden\nbookmark.title=Huidige weergave (kopiëren of openen in nieuw venster)\nbookmark_label=Huidige weergave\n\n# Secondary toolbar and context menu\ntools.title=Hulpmiddelen\ntools_label=Hulpmiddelen\nfirst_page.title=Naar eerste pagina gaan\nfirst_page.label=Naar eerste pagina gaan\nfirst_page_label=Naar eerste pagina gaan\nlast_page.title=Naar laatste pagina gaan\nlast_page.label=Naar laatste pagina gaan\nlast_page_label=Naar laatste pagina gaan\npage_rotate_cw.title=Rechtsom draaien\npage_rotate_cw.label=Rechtsom draaien\npage_rotate_cw_label=Rechtsom draaien\npage_rotate_ccw.title=Linksom draaien\npage_rotate_ccw.label=Linksom draaien\npage_rotate_ccw_label=Linksom draaien\n\ncursor_text_select_tool.title=Tekstselectiehulpmiddel inschakelen\ncursor_text_select_tool_label=Tekstselectiehulpmiddel\ncursor_hand_tool.title=Handhulpmiddel inschakelen\ncursor_hand_tool_label=Handhulpmiddel\n\nscroll_vertical.title=Verticaal scrollen gebruiken\nscroll_vertical_label=Verticaal scrollen\nscroll_horizontal.title=Horizontaal scrollen gebruiken\nscroll_horizontal_label=Horizontaal scrollen\nscroll_wrapped.title=Scrollen met terugloop gebruiken\nscroll_wrapped_label=Scrollen met terugloop\n\nspread_none.title=Dubbele pagina’s niet samenvoegen\nspread_none_label=Geen dubbele pagina’s\nspread_odd.title=Dubbele pagina’s samenvoegen vanaf oneven pagina’s\nspread_odd_label=Oneven dubbele pagina’s\nspread_even.title=Dubbele pagina’s samenvoegen vanaf even pagina’s\nspread_even_label=Even dubbele pagina’s\n\n# Document properties dialog box\ndocument_properties.title=Documenteigenschappen…\ndocument_properties_label=Documenteigenschappen…\ndocument_properties_file_name=Bestandsnaam:\ndocument_properties_file_size=Bestandsgrootte:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titel:\ndocument_properties_author=Auteur:\ndocument_properties_subject=Onderwerp:\ndocument_properties_keywords=Trefwoorden:\ndocument_properties_creation_date=Aanmaakdatum:\ndocument_properties_modification_date=Wijzigingsdatum:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Maker:\ndocument_properties_producer=PDF-producent:\ndocument_properties_version=PDF-versie:\ndocument_properties_page_count=Aantal pagina’s:\ndocument_properties_page_size=Paginagrootte:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=staand\ndocument_properties_page_size_orientation_landscape=liggend\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Snelle webweergave:\ndocument_properties_linearized_yes=Ja\ndocument_properties_linearized_no=Nee\ndocument_properties_close=Sluiten\n\nprint_progress_message=Document voorbereiden voor afdrukken…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Annuleren\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Zijbalk in-/uitschakelen\ntoggle_sidebar_notification.title=Zijbalk in-/uitschakelen (document bevat overzicht/bijlagen)\ntoggle_sidebar_notification2.title=Zijbalk in-/uitschakelen (document bevat overzicht/bijlagen/lagen)\ntoggle_sidebar_label=Zijbalk in-/uitschakelen\ndocument_outline.title=Documentoverzicht tonen (dubbelklik om alle items uit/samen te vouwen)\ndocument_outline_label=Documentoverzicht\nattachments.title=Bijlagen tonen\nattachments_label=Bijlagen\nlayers.title=Lagen tonen (dubbelklik om alle lagen naar de standaardstatus terug te zetten)\nlayers_label=Lagen\nthumbs.title=Miniaturen tonen\nthumbs_label=Miniaturen\ncurrent_outline_item.title=Huidig item in inhoudsopgave zoeken\ncurrent_outline_item_label=Huidig item in inhoudsopgave\nfindbar.title=Zoeken in document\nfindbar_label=Zoeken\n\nadditional_layers=Aanvullende lagen\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Pagina {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pagina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatuur van pagina {{page}}\n\n# Find panel button title and messages\nfind_input.title=Zoeken\nfind_input.placeholder=Zoeken in document…\nfind_previous.title=De vorige overeenkomst van de tekst zoeken\nfind_previous_label=Vorige\nfind_next.title=De volgende overeenkomst van de tekst zoeken\nfind_next_label=Volgende\nfind_highlight=Alles markeren\nfind_match_case_label=Hoofdlettergevoelig\nfind_entire_word_label=Hele woorden\nfind_reached_top=Bovenkant van document bereikt, doorgegaan vanaf onderkant\nfind_reached_bottom=Onderkant van document bereikt, doorgegaan vanaf bovenkant\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} van {{total}} overeenkomst\nfind_match_count[two]={{current}} van {{total}} overeenkomsten\nfind_match_count[few]={{current}} van {{total}} overeenkomsten\nfind_match_count[many]={{current}} van {{total}} overeenkomsten\nfind_match_count[other]={{current}} van {{total}} overeenkomsten\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Meer dan {{limit}} overeenkomsten\nfind_match_count_limit[one]=Meer dan {{limit}} overeenkomst\nfind_match_count_limit[two]=Meer dan {{limit}} overeenkomsten\nfind_match_count_limit[few]=Meer dan {{limit}} overeenkomsten\nfind_match_count_limit[many]=Meer dan {{limit}} overeenkomsten\nfind_match_count_limit[other]=Meer dan {{limit}} overeenkomsten\nfind_not_found=Tekst niet gevonden\n\n# Error panel labels\nerror_more_info=Meer informatie\nerror_less_info=Minder informatie\nerror_close=Sluiten\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Bericht: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Bestand: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Regel: {{line}}\nrendering_error=Er is een fout opgetreden bij het weergeven van de pagina.\n\n# Predefined zoom values\npage_scale_width=Paginabreedte\npage_scale_fit=Hele pagina\npage_scale_auto=Automatisch zoomen\npage_scale_actual=Werkelijke grootte\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Er is een fout opgetreden bij het laden van de PDF.\ninvalid_file_error=Ongeldig of beschadigd PDF-bestand.\nmissing_file_error=PDF-bestand ontbreekt. \nunexpected_response_error=Onverwacht serverantwoord.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}-aantekening]\npassword_label=Voer het wachtwoord in om dit PDF-bestand te openen.\npassword_invalid=Ongeldig wachtwoord. Probeer het opnieuw.\npassword_ok=OK\npassword_cancel=Annuleren\n\nprinting_not_supported=Waarschuwing: afdrukken wordt niet volledig ondersteund door deze browser.\nprinting_not_ready=Waarschuwing: de PDF is niet volledig geladen voor afdrukken.\nweb_fonts_disabled=Weblettertypen zijn uitgeschakeld: gebruik van ingebedde PDF-lettertypen is niet mogelijk.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/nn-NO/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Føregåande side\nprevious_label=Føregåande\nnext.title=Neste side\nnext_label=Neste\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Side\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=av {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} av {{pagesCount}})\n\nzoom_out.title=Zoom ut\nzoom_out_label=Zoom ut\nzoom_in.title=Zoom inn\nzoom_in_label=Zoom inn\nzoom.title=Zoom\npresentation_mode.title=Byt til presentasjonsmodus\npresentation_mode_label=Presentasjonsmodus\nopen_file.title=Opne fil\nopen_file_label=Opne\nprint.title=Skriv ut\nprint_label=Skriv ut\ndownload.title=Last ned\ndownload_label=Last ned\nbookmark.title=Gjeldande vising (kopier eller opne i nytt vindauge)\nbookmark_label=Gjeldande vising\n\n# Secondary toolbar and context menu\ntools.title=Verktøy\ntools_label=Verktøy\nfirst_page.title=Gå til første side\nfirst_page.label=Gå til første side\nfirst_page_label=Gå til første side\nlast_page.title=Gå til siste side\nlast_page.label=Gå til siste side\nlast_page_label=Gå til siste side\npage_rotate_cw.title=Roter med klokka\npage_rotate_cw.label=Roter med klokka\npage_rotate_cw_label=Roter med klokka\npage_rotate_ccw.title=Roter mot klokka\npage_rotate_ccw.label=Roter mot klokka\npage_rotate_ccw_label=Roter mot klokka\n\ncursor_text_select_tool.title=Aktiver tekstmarkeringsverktøy\ncursor_text_select_tool_label=Tekstmarkeringsverktøy\ncursor_hand_tool.title=Aktiver handverktøy\ncursor_hand_tool_label=Handverktøy\n\nscroll_vertical.title=Bruk vertikal rulling\nscroll_vertical_label=Vertikal rulling\nscroll_horizontal.title=Bruk horisontal rulling\nscroll_horizontal_label=Horisontal rulling\nscroll_wrapped.title=Bruk fleirsiderulling\nscroll_wrapped_label=Fleirsiderulling\n\nspread_none.title=Vis enkeltsider\nspread_none_label=Enkeltside\nspread_odd.title=Vis oppslag med ulike sidenummer til venstre\nspread_odd_label=Oppslag med framside\nspread_even.title=Vis oppslag med like sidenummmer til venstre\nspread_even_label=Oppslag utan framside\n\n# Document properties dialog box\ndocument_properties.title=Dokumenteigenskapar…\ndocument_properties_label=Dokumenteigenskapar…\ndocument_properties_file_name=Filnamn:\ndocument_properties_file_size=Filstorleik:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Tittel:\ndocument_properties_author=Forfattar:\ndocument_properties_subject=Emne:\ndocument_properties_keywords=Stikkord:\ndocument_properties_creation_date=Dato oppretta:\ndocument_properties_modification_date=Dato endra:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Oppretta av:\ndocument_properties_producer=PDF-verktøy:\ndocument_properties_version=PDF-versjon:\ndocument_properties_page_count=Sidetal:\ndocument_properties_page_size=Sidestørrelse:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=ståande\ndocument_properties_page_size_orientation_landscape=liggande\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Brev\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Rask nettvising:\ndocument_properties_linearized_yes=Ja\ndocument_properties_linearized_no=Nei\ndocument_properties_close=Lat att\n\nprint_progress_message=Førebur dokumentet for utskrift…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Avbryt\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Slå av/på sidestolpe\ntoggle_sidebar_notification.title=Vis/gøym sidestolpen (dokumentet inneheld oversikt/vedlegg)\ntoggle_sidebar_notification2.title=Vis/gøym sidestolpe (dokumentet inneheld oversikt/vedlegg/lag)\ntoggle_sidebar_label=Slå av/på sidestolpe\ndocument_outline.title=Vis dokumentdisposisjonen (dobbelklikk for å utvide/gøyme alle elementa)\ndocument_outline_label=Dokumentdisposisjon\nattachments.title=Vis vedlegg\nattachments_label=Vedlegg\nlayers.title=Vis lag (dobbeltklikk for å tilbakestille alle lag til standardtilstand)\nlayers_label=Lag\nthumbs.title=Vis miniatyrbilde\nthumbs_label=Miniatyrbilde\ncurrent_outline_item.title=Finn gjeldande disposisjonselement\ncurrent_outline_item_label=Gjeldande disposisjonselement\nfindbar.title=Finn i dokumentet\nfindbar_label=Finn\n\nadditional_layers=Ytterlegare lag\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Side {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Side {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatyrbilde av side {{page}}\n\n# Find panel button title and messages\nfind_input.title=Søk\nfind_input.placeholder=Søk i dokument…\nfind_previous.title=Finn førre førekomst av frasen\nfind_previous_label=Førre\nfind_next.title=Finn neste førekomst av frasen\nfind_next_label=Neste\nfind_highlight=Uthev alle\nfind_match_case_label=Skil store/små bokstavar\nfind_entire_word_label=Heile ord\nfind_reached_top=Nådde toppen av dokumentet, fortset frå botnen\nfind_reached_bottom=Nådde botnen av dokumentet, fortset frå toppen\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} av {{total}} treff\nfind_match_count[two]={{current}} av {{total}} treff\nfind_match_count[few]={{current}} av {{total}} treff\nfind_match_count[many]={{current}} av {{total}} treff\nfind_match_count[other]={{current}} av {{total}} treff\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Meir enn {{limit}} treff\nfind_match_count_limit[one]=Meir enn {{limit}} treff\nfind_match_count_limit[two]=Meir enn {{limit}} treff\nfind_match_count_limit[few]=Meir enn {{limit}} treff\nfind_match_count_limit[many]=Meir enn {{limit}} treff\nfind_match_count_limit[other]=Meir enn {{limit}} treff\nfind_not_found=Fann ikkje teksten\n\n# Error panel labels\nerror_more_info=Meir info\nerror_less_info=Mindre info\nerror_close=Lat att\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (bygg: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Melding: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stakk: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fil: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linje: {{line}}\nrendering_error=Ein feil oppstod under vising av sida.\n\n# Predefined zoom values\npage_scale_width=Sidebreidde\npage_scale_fit=Tilpass til sida\npage_scale_auto=Automatisk skalering\npage_scale_actual=Verkeleg storleik\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Ein feil oppstod ved lasting av PDF.\ninvalid_file_error=Ugyldig eller korrupt PDF-fil.\nmissing_file_error=Manglande PDF-fil.\nunexpected_response_error=Uventa tenarrespons.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}} {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} annotasjon]\npassword_label=Skriv inn passordet for å opne denne PDF-fila.\npassword_invalid=Ugyldig passord. Prøv igjen.\npassword_ok=OK\npassword_cancel=Avbryt\n\nprinting_not_supported=Åtvaring: Utskrift er ikkje fullstendig støtta av denne nettlesaren.\nprinting_not_ready=Åtvaring: PDF ikkje fullstendig innlasta for utskrift.\nweb_fonts_disabled=Web-skrifter er slått av: Kan ikkje bruke innbundne PDF-skrifter.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/oc/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pagina precedenta\nprevious_label=Precedent\nnext.title=Pagina seguenta\nnext_label=Seguent\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pagina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=sus {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} sus {{pagesCount}})\n\nzoom_out.title=Zoom arrièr\nzoom_out_label=Zoom arrièr\nzoom_in.title=Zoom avant\nzoom_in_label=Zoom avant\nzoom.title=Zoom\npresentation_mode.title=Bascular en mòde presentacion\npresentation_mode_label=Mòde Presentacion\nopen_file.title=Dobrir lo fichièr\nopen_file_label=Dobrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Telecargar\ndownload_label=Telecargar\nbookmark.title=Afichatge corrent (copiar o dobrir dins una fenèstra novèla)\nbookmark_label=Afichatge actual\n\n# Secondary toolbar and context menu\ntools.title=Aisinas\ntools_label=Aisinas\nfirst_page.title=Anar a la primièra pagina\nfirst_page.label=Anar a la primièra pagina\nfirst_page_label=Anar a la primièra pagina\nlast_page.title=Anar a la darrièra pagina\nlast_page.label=Anar a la darrièra pagina\nlast_page_label=Anar a la darrièra pagina\npage_rotate_cw.title=Rotacion orària\npage_rotate_cw.label=Rotacion orària\npage_rotate_cw_label=Rotacion orària\npage_rotate_ccw.title=Rotacion antiorària\npage_rotate_ccw.label=Rotacion antiorària\npage_rotate_ccw_label=Rotacion antiorària\n\ncursor_text_select_tool.title=Activar l'aisina de seleccion de tèxte\ncursor_text_select_tool_label=Aisina de seleccion de tèxte\ncursor_hand_tool.title=Activar l’aisina man\ncursor_hand_tool_label=Aisina man\n\nscroll_vertical.title=Utilizar lo desfilament vertical\nscroll_vertical_label=Desfilament vertical\nscroll_horizontal.title=Utilizar lo desfilament orizontal\nscroll_horizontal_label=Desfilament orizontal\nscroll_wrapped.title=Activar lo desfilament continú\nscroll_wrapped_label=Desfilament continú\n\nspread_none.title=Agropar pas las paginas doas a doas\nspread_none_label=Una sola pagina\nspread_odd.title=Mostrar doas paginas en començant per las paginas imparas a esquèrra\nspread_odd_label=Dobla pagina, impara a drecha\nspread_even.title=Mostrar doas paginas en començant per las paginas paras a esquèrra\nspread_even_label=Dobla pagina, para a drecha\n\n# Document properties dialog box\ndocument_properties.title=Proprietats del document…\ndocument_properties_label=Proprietats del document…\ndocument_properties_file_name=Nom del fichièr :\ndocument_properties_file_size=Talha del fichièr :\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} Ko ({{size_b}} octets)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} Mo ({{size_b}} octets)\ndocument_properties_title=Títol :\ndocument_properties_author=Autor :\ndocument_properties_subject=Subjècte :\ndocument_properties_keywords=Mots claus :\ndocument_properties_creation_date=Data de creacion :\ndocument_properties_modification_date=Data de modificacion :\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, a {{time}}\ndocument_properties_creator=Creator :\ndocument_properties_producer=Aisina de conversion PDF :\ndocument_properties_version=Version PDF :\ndocument_properties_page_count=Nombre de paginas :\ndocument_properties_page_size=Talha de la pagina :\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=retrach\ndocument_properties_page_size_orientation_landscape=païsatge\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letra\ndocument_properties_page_size_name_legal=Document juridic\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Vista web rapida :\ndocument_properties_linearized_yes=Òc\ndocument_properties_linearized_no=Non\ndocument_properties_close=Tampar\n\nprint_progress_message=Preparacion del document per l’impression…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Anullar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Afichar/amagar lo panèl lateral\ntoggle_sidebar_notification.title=Afichar/amagar lo panèl lateral (lo document conten esquèmas/pèças juntas)\ntoggle_sidebar_notification2.title=Afichar/amagar lo panèl lateral (lo document conten esquèmas/pèças juntas/calques)\ntoggle_sidebar_label=Afichar/amagar lo panèl lateral\ndocument_outline.title=Mostrar los esquèmas del document (dobleclicar per espandre/reduire totes los elements)\ndocument_outline_label=Marcapaginas del document\nattachments.title=Visualizar las pèças juntas\nattachments_label=Pèças juntas\nlayers.title=Afichar los calques (doble-clicar per reïnicializar totes los calques a l’estat per defaut)\nlayers_label=Calques\nthumbs.title=Afichar las vinhetas\nthumbs_label=Vinhetas\ncurrent_outline_item.title=Trobar l’element de plan actual\ncurrent_outline_item_label=Element de plan actual\nfindbar.title=Cercar dins lo document\nfindbar_label=Recercar\n\nadditional_layers=Calques suplementaris\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Pagina {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pagina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Vinheta de la pagina {{page}}\n\n# Find panel button title and messages\nfind_input.title=Recercar\nfind_input.placeholder=Cercar dins lo document…\nfind_previous.title=Tròba l'ocurréncia precedenta de la frasa\nfind_previous_label=Precedent\nfind_next.title=Tròba l'ocurréncia venenta de la frasa\nfind_next_label=Seguent\nfind_highlight=Suslinhar tot\nfind_match_case_label=Respectar la cassa\nfind_entire_word_label=Mots entièrs\nfind_reached_top=Naut de la pagina atenh, perseguida del bas\nfind_reached_bottom=Bas de la pagina atench, perseguida al començament\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]=Occuréncia {{current}} sus {{total}}\nfind_match_count[two]=Occuréncia {{current}} sus {{total}}\nfind_match_count[few]=Occuréncia {{current}} sus {{total}}\nfind_match_count[many]=Occuréncia {{current}} sus {{total}}\nfind_match_count[other]=Occuréncia {{current}} sus {{total}}\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Mai de {{limit}} occuréncias\nfind_match_count_limit[one]=Mai de {{limit}} occuréncia\nfind_match_count_limit[two]=Mai de {{limit}} occuréncias\nfind_match_count_limit[few]=Mai de {{limit}} occuréncias\nfind_match_count_limit[many]=Mai de {{limit}} occuréncias\nfind_match_count_limit[other]=Mai de {{limit}} occuréncias\nfind_not_found=Frasa pas trobada\n\n# Error panel labels\nerror_more_info=Mai de detalhs\nerror_less_info=Mens d'informacions\nerror_close=Tampar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (identificant de compilacion : {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Messatge : {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila : {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fichièr : {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linha : {{line}}\nrendering_error=Una error s'es producha pendent l'afichatge de la pagina.\n\n# Predefined zoom values\npage_scale_width=Largor plena\npage_scale_fit=Pagina entièra\npage_scale_auto=Zoom automatic\npage_scale_actual=Talha vertadièra\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Una error s'es producha pendent lo cargament del fichièr PDF.\ninvalid_file_error=Fichièr PDF invalid o corromput.\nmissing_file_error=Fichièr PDF mancant.\nunexpected_response_error=Responsa de servidor imprevista.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}} a {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotacion {{type}}]\npassword_label=Picatz lo senhal per dobrir aqueste fichièr PDF.\npassword_invalid=Senhal incorrècte. Tornatz ensajar.\npassword_ok=D'acòrdi\npassword_cancel=Anullar\n\nprinting_not_supported=Atencion : l'impression es pas completament gerida per aqueste navegador.\nprinting_not_ready=Atencion : lo PDF es pas entièrament cargat per lo poder imprimir.\nweb_fonts_disabled=Las poliças web son desactivadas : impossible d'utilizar las poliças integradas al PDF.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/pa-IN/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=ਪਿਛਲਾ ਸਫ਼ਾ\nprevious_label=ਪਿੱਛੇ\nnext.title=ਅਗਲਾ ਸਫ਼ਾ\nnext_label=ਅੱਗੇ\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=ਸਫ਼ਾ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} ਵਿੱਚੋਂ\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages={{pagesCount}}) ਵਿੱਚੋਂ ({{pageNumber}}\n\nzoom_out.title=ਜ਼ੂਮ ਆਉਟ\nzoom_out_label=ਜ਼ੂਮ ਆਉਟ\nzoom_in.title=ਜ਼ੂਮ ਇਨ\nzoom_in_label=ਜ਼ੂਮ ਇਨ\nzoom.title=ਜ਼ੂਨ\npresentation_mode.title=ਪਰਿਜੈਂਟੇਸ਼ਨ ਮੋਡ ਵਿੱਚ ਜਾਓ\npresentation_mode_label=ਪਰਿਜੈਂਟੇਸ਼ਨ ਮੋਡ\nopen_file.title=ਫਾਈਲ ਨੂੰ ਖੋਲ੍ਹੋ\nopen_file_label=ਖੋਲ੍ਹੋ\nprint.title=ਪਰਿੰਟ\nprint_label=ਪਰਿੰਟ\ndownload.title=ਡਾਊਨਲੋਡ\ndownload_label=ਡਾਊਨਲੋਡ\nbookmark.title=ਮੌਜੂਦਾ ਝਲਕ (ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਕਾਪੀ ਕਰੋ ਜਾਂ ਖੋਲ੍ਹੋ)\nbookmark_label=ਮੌਜੂਦਾ ਝਲਕ\n\n# Secondary toolbar and context menu\ntools.title=ਟੂਲ\ntools_label=ਟੂਲ\nfirst_page.title=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\nfirst_page.label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\nfirst_page_label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\nlast_page.title=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\nlast_page.label=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\nlast_page_label=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\npage_rotate_cw.title=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ\npage_rotate_cw.label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਉ\npage_rotate_cw_label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ\npage_rotate_ccw.title=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ\npage_rotate_ccw.label=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਉ\npage_rotate_ccw_label=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ\n\ncursor_text_select_tool.title=ਲਿਖਤ ਚੋਣ ਟੂਲ ਸਮਰੱਥ ਕਰੋ\ncursor_text_select_tool_label=ਲਿਖਤ ਚੋਣ ਟੂਲ\ncursor_hand_tool.title=ਹੱਥ ਟੂਲ ਸਮਰੱਥ ਕਰੋ\ncursor_hand_tool_label=ਹੱਥ ਟੂਲ\n\nscroll_vertical.title=ਖੜ੍ਹਵੇਂ ਸਕਰਾਉਣ ਨੂੰ ਵਰਤੋਂ\nscroll_vertical_label=ਖੜ੍ਹਵਾਂ ਸਰਕਾਉਣਾ\nscroll_horizontal.title=ਲੇਟਵੇਂ ਸਰਕਾਉਣ ਨੂੰ ਵਰਤੋਂ\nscroll_horizontal_label=ਲੇਟਵਾਂ ਸਰਕਾਉਣਾ\nscroll_wrapped.title=ਸਮੇਟੇ ਸਰਕਾਉਣ ਨੂੰ ਵਰਤੋਂ\nscroll_wrapped_label=ਸਮੇਟਿਆ ਸਰਕਾਉਣਾ\n\nspread_none.title=ਸਫ਼ਾ ਫੈਲਾਅ ਵਿੱਚ ਸ਼ਾਮਲ ਨਾ ਹੋਵੋ\nspread_none_label=ਕੋਈ ਫੈਲਾਅ ਨਹੀਂ\nspread_odd.title=ਟਾਂਕ ਅੰਕ ਵਾਲੇ ਸਫ਼ਿਆਂ ਨਾਲ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੇ ਸਫਿਆਂ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੋ\nspread_odd_label=ਟਾਂਕ ਫੈਲਾਅ\nspread_even.title=ਜਿਸਤ ਅੰਕ ਵਾਲੇ ਸਫ਼ਿਆਂ ਨਾਲ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੇ ਸਫਿਆਂ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੋ\nspread_even_label=ਜਿਸਤ ਫੈਲਾਅ\n\n# Document properties dialog box\ndocument_properties.title=…ਦਸਤਾਵੇਜ਼ ਦੀ ਵਿਸ਼ੇਸ਼ਤਾ\ndocument_properties_label=…ਦਸਤਾਵੇਜ਼ ਦੀ ਵਿਸ਼ੇਸ਼ਤਾ\ndocument_properties_file_name=ਫਾਈਲ ਦਾ ਨਾਂ:\ndocument_properties_file_size=ਫਾਈਲ ਦਾ ਆਕਾਰ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} ਬਾਈਟ)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} ਬਾਈਟ)\ndocument_properties_title=ਟਾਈਟਲ:\ndocument_properties_author=ਲੇਖਕ:\ndocument_properties_subject=ਵਿਸ਼ਾ:\ndocument_properties_keywords=ਸ਼ਬਦ:\ndocument_properties_creation_date=ਬਣਾਉਣ ਦੀ ਮਿਤੀ:\ndocument_properties_modification_date=ਸੋਧ ਦੀ ਮਿਤੀ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=ਨਿਰਮਾਤਾ:\ndocument_properties_producer=PDF ਪ੍ਰੋਡਿਊਸਰ:\ndocument_properties_version=PDF ਵਰਜਨ:\ndocument_properties_page_count=ਸਫ਼ੇ ਦੀ ਗਿਣਤੀ:\ndocument_properties_page_size=ਸਫ਼ਾ ਆਕਾਰ:\ndocument_properties_page_size_unit_inches=ਇੰਚ\ndocument_properties_page_size_unit_millimeters=ਮਿਮੀ\ndocument_properties_page_size_orientation_portrait=ਪੋਰਟਰੇਟ\ndocument_properties_page_size_orientation_landscape=ਲੈਂਡਸਕੇਪ\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=ਲੈਟਰ\ndocument_properties_page_size_name_legal=ਕਨੂੰਨੀ\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=ਤੇਜ਼ ਵੈੱਬ ਝਲਕ:\ndocument_properties_linearized_yes=ਹਾਂ\ndocument_properties_linearized_no=ਨਹੀਂ\ndocument_properties_close=ਬੰਦ ਕਰੋ\n\nprint_progress_message=…ਪਰਿੰਟ ਕਰਨ ਲਈ ਦਸਤਾਵੇਜ਼ ਨੂੰ ਤਿਆਰ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=ਰੱਦ ਕਰੋ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=ਬਾਹੀ ਬਦਲੋ\ntoggle_sidebar_notification.title=ਬਾਹੀ ਨੂੰ ਬਦਲੋ (ਦਸਤਾਵੇਜ਼ ਖਾਕਾ/ਅਟੈਚਮੈਂਟਾਂ ਰੱਖਦਾ ਹੈ)\ntoggle_sidebar_notification2.title=ਬਾਹੀ ਨੂੰ ਬਦਲੋ (ਦਸਤਾਵੇਜ਼ ਖਾਕਾ/ਅਟੈਚਮੈਂਟ/ਪਰਤਾਂ ਰੱਖਦਾ ਹੈ)\ntoggle_sidebar_label=ਬਾਹੀ ਬਦਲੋ\ndocument_outline.title=ਦਸਤਾਵੇਜ਼ ਖਾਕਾ ਦਿਖਾਓ (ਸਾਰੀਆਂ ਆਈਟਮਾਂ ਨੂੰ ਫੈਲਾਉਣ/ਸਮੇਟਣ ਲਈ ਦੋ ਵਾਰ ਕਲਿੱਕ ਕਰੋ)\ndocument_outline_label=ਦਸਤਾਵੇਜ਼ ਖਾਕਾ\nattachments.title=ਅਟੈਚਮੈਂਟ ਵੇਖਾਓ\nattachments_label=ਅਟੈਚਮੈਂਟਾਂ\nlayers.title=ਪਰਤਾਂ ਵੇਖਾਓ (ਸਾਰੀਆਂ ਪਰਤਾਂ ਨੂੰ ਮੂਲ ਹਾਲਤ ਉੱਤੇ ਮੁੜ-ਸੈੱਟ ਕਰਨ ਲਈ ਦੋ ਵਾਰ ਕਲਿੱਕ ਕਰੋ)\nlayers_label=ਪਰਤਾਂ\nthumbs.title=ਥੰਮਨੇਲ ਨੂੰ ਵੇਖਾਓ\nthumbs_label=ਥੰਮਨੇਲ\ncurrent_outline_item.title=ਮੌੌਜੂਦਾ ਖਾਕਾ ਚੀਜ਼ ਲੱਭੋ\ncurrent_outline_item_label=ਮੌਜੂਦਾ ਖਾਕਾ ਚੀਜ਼\nfindbar.title=ਦਸਤਾਵੇਜ਼ ਵਿੱਚ ਲੱਭੋ\nfindbar_label=ਲੱਭੋ\n\nadditional_layers=ਵਾਧੂ ਪਰਤਾਂ\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=ਸਫ਼ਾ {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=ਸਫ਼ਾ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} ਸਫ਼ੇ ਦਾ ਥੰਮਨੇਲ\n\n# Find panel button title and messages\nfind_input.title=ਲੱਭੋ\nfind_input.placeholder=…ਦਸਤਾਵੇਜ਼ 'ਚ ਲੱਭੋ\nfind_previous.title=ਵਾਕ ਦੀ ਪਿਛਲੀ ਮੌਜੂਦਗੀ ਲੱਭੋ\nfind_previous_label=ਪਿੱਛੇ\nfind_next.title=ਵਾਕ ਦੀ ਅਗਲੀ ਮੌਜੂਦਗੀ ਲੱਭੋ\nfind_next_label=ਅੱਗੇ\nfind_highlight=ਸਭ ਉਭਾਰੋ\nfind_match_case_label=ਅੱਖਰ ਆਕਾਰ ਨੂੰ ਮਿਲਾਉ\nfind_entire_word_label=ਪੂਰੇ ਸ਼ਬਦ\nfind_reached_top=ਦਸਤਾਵੇਜ਼ ਦੇ ਉੱਤੇ ਆ ਗਏ ਹਾਂ, ਥੱਲੇ ਤੋਂ ਜਾਰੀ ਰੱਖਿਆ ਹੈ\nfind_reached_bottom=ਦਸਤਾਵੇਜ਼ ਦੇ ਅੰਤ ਉੱਤੇ ਆ ਗਏ ਹਾਂ, ਉੱਤੇ ਤੋਂ ਜਾਰੀ ਰੱਖਿਆ ਹੈ\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{total}} ਵਿੱਚੋਂ {{current}} ਮੇਲ\nfind_match_count[two]={{total}} ਵਿੱਚੋਂ {{current}} ਮੇਲ\nfind_match_count[few]={{total}} ਵਿੱਚੋਂ {{current}} ਮੇਲ\nfind_match_count[many]={{total}} ਵਿੱਚੋਂ {{current}} ਮੇਲ\nfind_match_count[other]={{total}} ਵਿੱਚੋਂ {{current}} ਮੇਲ\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]={{limit}} ਮੇਲਾਂ ਤੋਂ ਵੱਧ\nfind_match_count_limit[one]={{limit}} ਮੇਲ ਤੋਂ ਵੱਧ\nfind_match_count_limit[two]={{limit}} ਮੇਲਾਂ ਤੋਂ ਵੱਧ\nfind_match_count_limit[few]={{limit}} ਮੇਲਾਂ ਤੋਂ ਵੱਧ\nfind_match_count_limit[many]={{limit}} ਮੇਲਾਂ ਤੋਂ ਵੱਧ\nfind_match_count_limit[other]={{limit}} ਮੇਲਾਂ ਤੋਂ ਵੱਧ\nfind_not_found=ਵਾਕ ਨਹੀਂ ਲੱਭਿਆ\n\n# Error panel labels\nerror_more_info=ਹੋਰ ਜਾਣਕਾਰੀ\nerror_less_info=ਘੱਟ ਜਾਣਕਾਰੀ\nerror_close=ਬੰਦ ਕਰੋ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (ਬਿਲਡ: {{build}}\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=ਸੁਨੇਹਾ: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=ਸਟੈਕ: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ਫਾਈਲ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=ਲਾਈਨ: {{line}}\nrendering_error=ਸਫ਼ਾ ਰੈਡਰ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ।\n\n# Predefined zoom values\npage_scale_width=ਸਫ਼ੇ ਦੀ ਚੌੜਾਈ\npage_scale_fit=ਸਫ਼ਾ ਫਿੱਟ\npage_scale_auto=ਆਟੋਮੈਟਿਕ ਜ਼ੂਮ ਕਰੋ\npage_scale_actual=ਆਟੋਮੈਟਿਕ ਆਕਾਰ\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=PDF ਲੋਡ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ।\ninvalid_file_error=ਗਲਤ ਜਾਂ ਨਿਕਾਰਾ PDF ਫਾਈਲ ਹੈ।\nmissing_file_error=ਨਾ-ਮੌਜੂਦ PDF ਫਾਈਲ।\nunexpected_response_error=ਅਣਜਾਣ ਸਰਵਰ ਜਵਾਬ।\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} ਵਿਆਖਿਆ]\npassword_label=ਇਹ PDF ਫਾਈਲ ਨੂੰ ਖੋਲ੍ਹਣ ਲਈ ਪਾਸਵਰਡ ਦਿਉ।\npassword_invalid=ਗਲਤ ਪਾਸਵਰਡ। ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ।\npassword_ok=ਠੀਕ ਹੈ\npassword_cancel=ਰੱਦ ਕਰੋ\n\nprinting_not_supported=ਸਾਵਧਾਨ: ਇਹ ਬਰਾਊਜ਼ਰ ਪਰਿੰਟ ਕਰਨ ਲਈ ਪੂਰੀ ਤਰ੍ਹਾਂ ਸਹਾਇਕ ਨਹੀਂ ਹੈ।\nprinting_not_ready=ਸਾਵਧਾਨ: PDF ਨੂੰ ਪਰਿੰਟ ਕਰਨ ਲਈ ਪੂਰੀ ਤਰ੍ਹਾਂ ਲੋਡ ਨਹੀਂ ਹੈ।\nweb_fonts_disabled=ਵੈਬ ਫੋਂਟ ਬੰਦ ਹਨ: ਇੰਬੈਡ PDF ਫੋਂਟ ਨੂੰ ਵਰਤਣ ਲਈ ਅਸਮਰੱਥ ਹੈ।\n"
  },
  {
    "path": "lib/pdf.js/web/locale/pl/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Poprzednia strona\nprevious_label=Poprzednia\nnext.title=Następna strona\nnext_label=Następna\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Strona\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=z {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} z {{pagesCount}})\n\nzoom_out.title=Pomniejsz\nzoom_out_label=Pomniejsz\nzoom_in.title=Powiększ\nzoom_in_label=Powiększ\nzoom.title=Skala\npresentation_mode.title=Przełącz na tryb prezentacji\npresentation_mode_label=Tryb prezentacji\nopen_file.title=Otwórz plik\nopen_file_label=Otwórz\nprint.title=Drukuj\nprint_label=Drukuj\ndownload.title=Pobierz\ndownload_label=Pobierz\nbookmark.title=Bieżąca pozycja (skopiuj lub otwórz jako odnośnik w nowym oknie)\nbookmark_label=Bieżąca pozycja\n\n# Secondary toolbar and context menu\ntools.title=Narzędzia\ntools_label=Narzędzia\nfirst_page.title=Przejdź do pierwszej strony\nfirst_page.label=Przejdź do pierwszej strony\nfirst_page_label=Przejdź do pierwszej strony\nlast_page.title=Przejdź do ostatniej strony\nlast_page.label=Przejdź do ostatniej strony\nlast_page_label=Przejdź do ostatniej strony\npage_rotate_cw.title=Obróć zgodnie z ruchem wskazówek zegara\npage_rotate_cw.label=Obróć zgodnie z ruchem wskazówek zegara\npage_rotate_cw_label=Obróć zgodnie z ruchem wskazówek zegara\npage_rotate_ccw.title=Obróć przeciwnie do ruchu wskazówek zegara\npage_rotate_ccw.label=Obróć przeciwnie do ruchu wskazówek zegara\npage_rotate_ccw_label=Obróć przeciwnie do ruchu wskazówek zegara\n\ncursor_text_select_tool.title=Włącz narzędzie zaznaczania tekstu\ncursor_text_select_tool_label=Narzędzie zaznaczania tekstu\ncursor_hand_tool.title=Włącz narzędzie rączka\ncursor_hand_tool_label=Narzędzie rączka\n\nscroll_vertical.title=Przewijaj dokument w pionie\nscroll_vertical_label=Przewijanie pionowe\nscroll_horizontal.title=Przewijaj dokument w poziomie\nscroll_horizontal_label=Przewijanie poziome\nscroll_wrapped.title=Strony dokumentu wyświetlaj i przewijaj w kolumnach\nscroll_wrapped_label=Widok dwóch stron\n\nspread_none.title=Nie ustawiaj stron obok siebie\nspread_none_label=Brak kolumn\nspread_odd.title=Strony nieparzyste ustawiaj na lewo od parzystych\nspread_odd_label=Nieparzyste po lewej\nspread_even.title=Strony parzyste ustawiaj na lewo od nieparzystych\nspread_even_label=Parzyste po lewej\n\n# Document properties dialog box\ndocument_properties.title=Właściwości dokumentu…\ndocument_properties_label=Właściwości dokumentu…\ndocument_properties_file_name=Nazwa pliku:\ndocument_properties_file_size=Rozmiar pliku:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} B)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} B)\ndocument_properties_title=Tytuł:\ndocument_properties_author=Autor:\ndocument_properties_subject=Temat:\ndocument_properties_keywords=Słowa kluczowe:\ndocument_properties_creation_date=Data utworzenia:\ndocument_properties_modification_date=Data modyfikacji:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Utworzony przez:\ndocument_properties_producer=PDF wyprodukowany przez:\ndocument_properties_version=Wersja PDF:\ndocument_properties_page_count=Liczba stron:\ndocument_properties_page_size=Wymiary strony:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=pionowa\ndocument_properties_page_size_orientation_landscape=pozioma\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=US Letter\ndocument_properties_page_size_name_legal=US Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}}×{{height}} {{unit}} (orientacja {{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}}×{{height}} {{unit}} ({{name}}, orientacja {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Szybki podgląd w Internecie:\ndocument_properties_linearized_yes=tak\ndocument_properties_linearized_no=nie\ndocument_properties_close=Zamknij\n\nprint_progress_message=Przygotowywanie dokumentu do druku…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Anuluj\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Przełącz panel boczny\ntoggle_sidebar_notification.title=Przełącz panel boczny (dokument zawiera konspekt/załączniki)\ntoggle_sidebar_notification2.title=Przełącz panel boczny (dokument zawiera konspekt/załączniki/warstwy)\ntoggle_sidebar_label=Przełącz panel boczny\ndocument_outline.title=Konspekt dokumentu (podwójne kliknięcie rozwija lub zwija wszystkie pozycje)\ndocument_outline_label=Konspekt dokumentu\nattachments.title=Załączniki\nattachments_label=Załączniki\nlayers.title=Warstwy (podwójne kliknięcie przywraca wszystkie warstwy do stanu domyślnego)\nlayers_label=Warstwy\nthumbs.title=Miniatury\nthumbs_label=Miniatury\ncurrent_outline_item.title=Znajdź bieżący element konspektu\ncurrent_outline_item_label=Bieżący element konspektu\nfindbar.title=Znajdź w dokumencie\nfindbar_label=Znajdź\n\nadditional_layers=Dodatkowe warstwy\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas={{page}}. strona\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}}. strona\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura {{page}}. strony\n\n# Find panel button title and messages\nfind_input.title=Znajdź\nfind_input.placeholder=Znajdź w dokumencie…\nfind_previous.title=Znajdź poprzednie wystąpienie tekstu\nfind_previous_label=Poprzednie\nfind_next.title=Znajdź następne wystąpienie tekstu\nfind_next_label=Następne\nfind_highlight=Wyróżnianie wszystkich\nfind_match_case_label=Rozróżnianie wielkości liter\nfind_entire_word_label=Całe słowa\nfind_reached_top=Początek dokumentu. Wyszukiwanie od końca.\nfind_reached_bottom=Koniec dokumentu. Wyszukiwanie od początku.\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]=Pierwsze z {{total}} trafień\nfind_match_count[two]=Drugie z {{total}} trafień\nfind_match_count[few]={{current}}. z {{total}} trafień\nfind_match_count[many]={{current}}. z {{total}} trafień\nfind_match_count[other]={{current}}. z {{total}} trafień\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Brak trafień.\nfind_match_count_limit[one]=Więcej niż jedno trafienie.\nfind_match_count_limit[two]=Więcej niż dwa trafienia.\nfind_match_count_limit[few]=Więcej niż {{limit}} trafienia.\nfind_match_count_limit[many]=Więcej niż {{limit}} trafień.\nfind_match_count_limit[other]=Więcej niż {{limit}} trafień.\nfind_not_found=Nie znaleziono tekstu\n\n# Error panel labels\nerror_more_info=Więcej informacji\nerror_less_info=Mniej informacji\nerror_close=Zamknij\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (kompilacja: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Komunikat: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stos: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Plik: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Wiersz: {{line}}\nrendering_error=Podczas renderowania strony wystąpił błąd.\n\n# Predefined zoom values\npage_scale_width=Szerokość strony\npage_scale_fit=Dopasowanie strony\npage_scale_auto=Skala automatyczna\npage_scale_actual=Rozmiar oryginalny\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Podczas wczytywania dokumentu PDF wystąpił błąd.\ninvalid_file_error=Nieprawidłowy lub uszkodzony plik PDF.\nmissing_file_error=Brak pliku PDF.\nunexpected_response_error=Nieoczekiwana odpowiedź serwera.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Adnotacja: {{type}}]\npassword_label=Wprowadź hasło, aby otworzyć ten dokument PDF.\npassword_invalid=Nieprawidłowe hasło. Proszę spróbować ponownie.\npassword_ok=OK\npassword_cancel=Anuluj\n\nprinting_not_supported=Ostrzeżenie: drukowanie nie jest w pełni obsługiwane przez tę przeglądarkę.\nprinting_not_ready=Ostrzeżenie: dokument PDF nie jest całkowicie wczytany, więc nie można go wydrukować.\nweb_fonts_disabled=Czcionki sieciowe są wyłączone: nie można użyć osadzonych czcionek PDF.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/pt-BR/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página anterior\nprevious_label=Anterior\nnext.title=Próxima página\nnext_label=Próxima\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Página\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Reduzir\nzoom_out_label=Reduzir\nzoom_in.title=Ampliar\nzoom_in_label=Ampliar\nzoom.title=Zoom\npresentation_mode.title=Alternar para o modo de apresentação\npresentation_mode_label=Modo de apresentação\nopen_file.title=Abrir arquivo\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Baixar\ndownload_label=Baixar\nbookmark.title=Visão atual (copiar ou abrir em nova janela)\nbookmark_label=Visualização atual\n\n# Secondary toolbar and context menu\ntools.title=Ferramentas\ntools_label=Ferramentas\nfirst_page.title=Ir para a primeira página\nfirst_page.label=Ir para a primeira página\nfirst_page_label=Ir para a primeira página\nlast_page.title=Ir para a última página\nlast_page.label=Ir para a última página\nlast_page_label=Ir para a última página\npage_rotate_cw.title=Girar no sentido horário\npage_rotate_cw.label=Girar no sentido horário\npage_rotate_cw_label=Girar no sentido horário\npage_rotate_ccw.title=Girar no sentido anti-horário\npage_rotate_ccw.label=Girar no sentido anti-horário\npage_rotate_ccw_label=Girar no sentido anti-horário\n\ncursor_text_select_tool.title=Ativar a ferramenta de seleção de texto\ncursor_text_select_tool_label=Ferramenta de seleção de texto\ncursor_hand_tool.title=Ativar ferramenta de deslocamento\ncursor_hand_tool_label=Ferramenta de deslocamento\n\nscroll_vertical.title=Usar deslocamento vertical\nscroll_vertical_label=Deslocamento vertical\nscroll_horizontal.title=Usar deslocamento horizontal\nscroll_horizontal_label=Deslocamento horizontal\nscroll_wrapped.title=Usar deslocamento contido\nscroll_wrapped_label=Deslocamento contido\n\nspread_none.title=Não reagrupar páginas\nspread_none_label=Não estender\nspread_odd.title=Agrupar páginas começando em páginas com números ímpares\nspread_odd_label=Estender ímpares\nspread_even.title=Agrupar páginas começando em páginas com números pares\nspread_even_label=Estender pares\n\n# Document properties dialog box\ndocument_properties.title=Propriedades do documento…\ndocument_properties_label=Propriedades do documento…\ndocument_properties_file_name=Nome do arquivo:\ndocument_properties_file_size=Tamanho do arquivo:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Assunto:\ndocument_properties_keywords=Palavras-chave:\ndocument_properties_creation_date=Data da criação:\ndocument_properties_modification_date=Data da modificação:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Criação:\ndocument_properties_producer=Criador do PDF:\ndocument_properties_version=Versão do PDF:\ndocument_properties_page_count=Número de páginas:\ndocument_properties_page_size=Tamanho da página:\ndocument_properties_page_size_unit_inches=pol.\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=retrato\ndocument_properties_page_size_orientation_landscape=paisagem\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Carta\ndocument_properties_page_size_name_legal=Jurídico\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Exibição web rápida:\ndocument_properties_linearized_yes=Sim\ndocument_properties_linearized_no=Não\ndocument_properties_close=Fechar\n\nprint_progress_message=Preparando documento para impressão…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}} %\nprint_progress_close=Cancelar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Exibir/ocultar painel lateral\ntoggle_sidebar_notification.title=Exibir/ocultar painel lateral (documento contém estrutura/anexos)\ntoggle_sidebar_notification2.title=Exibir/ocultar painel (documento contém estrutura/anexos/camadas)\ntoggle_sidebar_label=Exibir/ocultar painel\ndocument_outline.title=Mostrar a estrutura do documento (dê um duplo-clique para expandir/recolher todos os itens)\ndocument_outline_label=Estrutura do documento\nattachments.title=Mostrar anexos\nattachments_label=Anexos\nlayers.title=Exibir camadas (duplo-clique para redefinir todas as camadas ao estado predefinido)\nlayers_label=Camadas\nthumbs.title=Mostrar miniaturas\nthumbs_label=Miniaturas\ncurrent_outline_item.title=Encontrar item atual da estrutura\ncurrent_outline_item_label=Item atual da estrutura\nfindbar.title=Procurar no documento\nfindbar_label=Procurar\n\nadditional_layers=Camadas adicionais\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Página {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Página {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura da página {{page}}\n\n# Find panel button title and messages\nfind_input.title=Procurar\nfind_input.placeholder=Procurar no documento…\nfind_previous.title=Procurar a ocorrência anterior da frase\nfind_previous_label=Anterior\nfind_next.title=Procurar a próxima ocorrência da frase\nfind_next_label=Próxima\nfind_highlight=Destacar tudo\nfind_match_case_label=Diferenciar maiúsculas/minúsculas\nfind_entire_word_label=Palavras completas\nfind_reached_top=Início do documento alcançado, continuando do fim\nfind_reached_bottom=Fim do documento alcançado, continuando do início\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} de {{total}} ocorrência\nfind_match_count[two]={{current}} de {{total}} ocorrências\nfind_match_count[few]={{current}} de {{total}} ocorrências\nfind_match_count[many]={{current}} de {{total}} ocorrências\nfind_match_count[other]={{current}} de {{total}} ocorrências\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Mais de {{limit}} ocorrências\nfind_match_count_limit[one]=Mais de {{limit}} ocorrência\nfind_match_count_limit[two]=Mais de {{limit}} ocorrências\nfind_match_count_limit[few]=Mais de {{limit}} ocorrências\nfind_match_count_limit[many]=Mais de {{limit}} ocorrências\nfind_match_count_limit[other]=Mais de {{limit}} ocorrências\nfind_not_found=Frase não encontrada\n\n# Error panel labels\nerror_more_info=Mais informações\nerror_less_info=Menos informações\nerror_close=Fechar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (compilação: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensagem: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pilha: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Arquivo: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linha: {{line}}\nrendering_error=Ocorreu um erro ao renderizar a página.\n\n# Predefined zoom values\npage_scale_width=Largura da página\npage_scale_fit=Ajustar à janela\npage_scale_auto=Zoom automático\npage_scale_actual=Tamanho real\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Ocorreu um erro ao carregar o PDF.\ninvalid_file_error=Arquivo PDF corrompido ou inválido.\nmissing_file_error=Arquivo PDF ausente.\nunexpected_response_error=Resposta inesperada do servidor.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotação {{type}}]\npassword_label=Forneça a senha para abrir este arquivo PDF.\npassword_invalid=Senha inválida. Tente novamente.\npassword_ok=OK\npassword_cancel=Cancelar\n\nprinting_not_supported=Aviso: a impressão não é totalmente suportada neste navegador.\nprinting_not_ready=Aviso: o PDF não está totalmente carregado para impressão.\nweb_fonts_disabled=As fontes web estão desativadas: não foi possível usar fontes incorporadas do PDF.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/pt-PT/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página anterior\nprevious_label=Anterior\nnext.title=Página seguinte\nnext_label=Seguinte\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Página\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Reduzir\nzoom_out_label=Reduzir\nzoom_in.title=Ampliar\nzoom_in_label=Ampliar\nzoom.title=Zoom\npresentation_mode.title=Trocar para o modo de apresentação\npresentation_mode_label=Modo de apresentação\nopen_file.title=Abrir ficheiro\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Transferir\ndownload_label=Transferir\nbookmark.title=Vista atual (copiar ou abrir numa nova janela)\nbookmark_label=Visão atual\n\n# Secondary toolbar and context menu\ntools.title=Ferramentas\ntools_label=Ferramentas\nfirst_page.title=Ir para a primeira página\nfirst_page.label=Ir para a primeira página\nfirst_page_label=Ir para a primeira página\nlast_page.title=Ir para a última página\nlast_page.label=Ir para a última página\nlast_page_label=Ir para a última página\npage_rotate_cw.title=Rodar à direita\npage_rotate_cw.label=Rodar à direita\npage_rotate_cw_label=Rodar à direita\npage_rotate_ccw.title=Rodar à esquerda\npage_rotate_ccw.label=Rodar à esquerda\npage_rotate_ccw_label=Rodar à esquerda\n\ncursor_text_select_tool.title=Ativar ferramenta de seleção de texto\ncursor_text_select_tool_label=Ferramenta de seleção de texto\ncursor_hand_tool.title=Ativar ferramenta de mão\ncursor_hand_tool_label=Ferramenta de mão\n\nscroll_vertical.title=Utilizar deslocação vertical\nscroll_vertical_label=Deslocação vertical\nscroll_horizontal.title=Utilizar deslocação horizontal\nscroll_horizontal_label=Deslocação horizontal\nscroll_wrapped.title=Utilizar deslocação encapsulada\nscroll_wrapped_label=Deslocação encapsulada\n\nspread_none.title=Não juntar páginas dispersas\nspread_none_label=Sem spreads\nspread_odd.title=Juntar páginas dispersas a partir de páginas com números ímpares\nspread_odd_label=Spreads ímpares\nspread_even.title=Juntar páginas dispersas a partir de páginas com números pares\nspread_even_label=Spreads pares\n\n# Document properties dialog box\ndocument_properties.title=Propriedades do documento…\ndocument_properties_label=Propriedades do documento…\ndocument_properties_file_name=Nome do ficheiro:\ndocument_properties_file_size=Tamanho do ficheiro:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Assunto:\ndocument_properties_keywords=Palavras-chave:\ndocument_properties_creation_date=Data de criação:\ndocument_properties_modification_date=Data de modificação:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Criador:\ndocument_properties_producer=Produtor de PDF:\ndocument_properties_version=Versão do PDF:\ndocument_properties_page_count=N.º de páginas:\ndocument_properties_page_size=Tamanho da página:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=retrato\ndocument_properties_page_size_orientation_landscape=paisagem\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Carta\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Vista rápida web:\ndocument_properties_linearized_yes=Sim\ndocument_properties_linearized_no=Não\ndocument_properties_close=Fechar\n\nprint_progress_message=A preparar o documento para impressão…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancelar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Alternar barra lateral\ntoggle_sidebar_notification.title=Alternar barra lateral (documento contém contorno/anexos)\ntoggle_sidebar_notification2.title=Alternar barra lateral (o documento contém contornos/anexos/camadas)\ntoggle_sidebar_label=Alternar barra lateral\ndocument_outline.title=Mostrar esquema do documento (duplo clique para expandir/colapsar todos os itens)\ndocument_outline_label=Esquema do documento\nattachments.title=Mostrar anexos\nattachments_label=Anexos\nlayers.title=Mostrar camadas (clique duas vezes para repor todas as camadas para o estado predefinido)\nlayers_label=Camadas\nthumbs.title=Mostrar miniaturas\nthumbs_label=Miniaturas\ncurrent_outline_item.title=Encontrar o item atualmente destacado\ncurrent_outline_item_label=Item atualmente destacado\nfindbar.title=Localizar em documento\nfindbar_label=Localizar\n\nadditional_layers=Camadas adicionais\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Página {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Página {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura da página {{page}}\n\n# Find panel button title and messages\nfind_input.title=Localizar\nfind_input.placeholder=Localizar em documento…\nfind_previous.title=Localizar ocorrência anterior da frase\nfind_previous_label=Anterior\nfind_next.title=Localizar ocorrência seguinte da frase\nfind_next_label=Seguinte\nfind_highlight=Destacar tudo\nfind_match_case_label=Correspondência\nfind_entire_word_label=Palavras completas\nfind_reached_top=Topo do documento atingido, a continuar a partir do fundo\nfind_reached_bottom=Fim do documento atingido, a continuar a partir do topo\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} de {{total}} correspondência\nfind_match_count[two]={{current}} de {{total}} correspondências\nfind_match_count[few]={{current}} de {{total}} correspondências\nfind_match_count[many]={{current}} de {{total}} correspondências\nfind_match_count[other]={{current}} de {{total}} correspondências\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Mais de {{limit}} correspondências\nfind_match_count_limit[one]=Mais de {{limit}} correspondência\nfind_match_count_limit[two]=Mais de {{limit}} correspondências\nfind_match_count_limit[few]=Mais de {{limit}} correspondências\nfind_match_count_limit[many]=Mais de {{limit}} correspondências\nfind_match_count_limit[other]=Mais de {{limit}} correspondências\nfind_not_found=Frase não encontrada\n\n# Error panel labels\nerror_more_info=Mais informação\nerror_less_info=Menos informação\nerror_close=Fechar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (compilação: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensagem: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ficheiro: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linha: {{line}}\nrendering_error=Ocorreu um erro ao processar a página.\n\n# Predefined zoom values\npage_scale_width=Ajustar à largura\npage_scale_fit=Ajustar à página\npage_scale_auto=Zoom automático\npage_scale_actual=Tamanho real\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Ocorreu um erro ao carregar o PDF.\ninvalid_file_error=Ficheiro PDF inválido ou danificado.\nmissing_file_error=Ficheiro PDF inexistente.\nunexpected_response_error=Resposta inesperada do servidor.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotação {{type}}]\npassword_label=Introduza a palavra-passe para abrir este ficheiro PDF.\npassword_invalid=Palavra-passe inválida. Por favor, tente novamente.\npassword_ok=OK\npassword_cancel=Cancelar\n\nprinting_not_supported=Aviso: a impressão não é totalmente suportada por este navegador.\nprinting_not_ready=Aviso: o PDF ainda não está totalmente carregado.\nweb_fonts_disabled=Os tipos de letra web estão desativados: não é possível utilizar os tipos de letra PDF embutidos.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/rm/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pagina precedenta\nprevious_label=Enavos\nnext.title=Proxima pagina\nnext_label=Enavant\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pagina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=da {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} da {{pagesCount}})\n\nzoom_out.title=Empitschnir\nzoom_out_label=Empitschnir\nzoom_in.title=Engrondir\nzoom_in_label=Engrondir\nzoom.title=Zoom\npresentation_mode.title=Midar en il modus da preschentaziun\npresentation_mode_label=Modus da preschentaziun\nopen_file.title=Avrir datoteca\nopen_file_label=Avrir\nprint.title=Stampar\nprint_label=Stampar\ndownload.title=Telechargiar\ndownload_label=Telechargiar\nbookmark.title=Vista actuala (copiar u avrir en ina nova fanestra)\nbookmark_label=Vista actuala\n\n# Secondary toolbar and context menu\ntools.title=Utensils\ntools_label=Utensils\nfirst_page.title=Siglir a l'emprima pagina\nfirst_page.label=Siglir a l'emprima pagina\nfirst_page_label=Siglir a l'emprima pagina\nlast_page.title=Siglir a la davosa pagina\nlast_page.label=Siglir a la davosa pagina\nlast_page_label=Siglir a la davosa pagina\npage_rotate_cw.title=Rotar en direcziun da l'ura\npage_rotate_cw.label=Rotar en direcziun da l'ura\npage_rotate_cw_label=Rotar en direcziun da l'ura\npage_rotate_ccw.title=Rotar en direcziun cuntraria a l'ura\npage_rotate_ccw.label=Rotar en direcziun cuntraria a l'ura\npage_rotate_ccw_label=Rotar en direcziun cuntraria a l'ura\n\ncursor_text_select_tool.title=Activar l'utensil per selecziunar text\ncursor_text_select_tool_label=Utensil per selecziunar text\ncursor_hand_tool.title=Activar l'utensil da maun\ncursor_hand_tool_label=Utensil da maun\n\nscroll_vertical.title=Utilisar il defilar vertical\nscroll_vertical_label=Defilar vertical\nscroll_horizontal.title=Utilisar il defilar orizontal\nscroll_horizontal_label=Defilar orizontal\nscroll_wrapped.title=Utilisar il defilar en colonnas\nscroll_wrapped_label=Defilar en colonnas\n\nspread_none.title=Betg parallelisar las paginas\nspread_none_label=Betg parallel\nspread_odd.title=Parallelisar las paginas cun cumenzar cun paginas spèras\nspread_odd_label=Parallel spèr\nspread_even.title=Parallelisar las paginas cun cumenzar cun paginas pèras\nspread_even_label=Parallel pèr\n\n# Document properties dialog box\ndocument_properties.title=Caracteristicas dal document…\ndocument_properties_label=Caracteristicas dal document…\ndocument_properties_file_name=Num da la datoteca:\ndocument_properties_file_size=Grondezza da la datoteca:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titel:\ndocument_properties_author=Autur:\ndocument_properties_subject=Tema:\ndocument_properties_keywords=Chavazzins:\ndocument_properties_creation_date=Data da creaziun:\ndocument_properties_modification_date=Data da modificaziun:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}} {{time}}\ndocument_properties_creator=Creà da:\ndocument_properties_producer=Creà il PDF cun:\ndocument_properties_version=Versiun da PDF:\ndocument_properties_page_count=Dumber da paginas:\ndocument_properties_page_size=Grondezza da la pagina:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=vertical\ndocument_properties_page_size_orientation_landscape=orizontal\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Fast Web View:\ndocument_properties_linearized_yes=Gea\ndocument_properties_linearized_no=Na\ndocument_properties_close=Serrar\n\nprint_progress_message=Preparar il document per stampar…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Interrumper\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Activar/deactivar la trav laterala\ntoggle_sidebar_notification.title=Activar/deactivar la trav laterala (structura dal document/agiuntas)\ntoggle_sidebar_notification2.title=Activar/deactivar la trav laterala (il document cuntegna structura dal document/agiuntas/nivels)\ntoggle_sidebar_label=Activar/deactivar la trav laterala\ndocument_outline.title=Mussar la structura dal document (cliccar duas giadas per extender/cumprimer tut ils elements)\ndocument_outline_label=Structura dal document\nattachments.title=Mussar agiuntas\nattachments_label=Agiuntas\nlayers.title=Mussar ils nivels (cliccar dubel per restaurar il stadi da standard da tut ils nivels)\nlayers_label=Nivels\nthumbs.title=Mussar las miniaturas\nthumbs_label=Miniaturas\ncurrent_outline_item.title=Tschertgar l'element da structura actual\ncurrent_outline_item_label=Element da structura actual\nfindbar.title=Tschertgar en il document\nfindbar_label=Tschertgar\n\nadditional_layers=Nivels supplementars\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Pagina {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pagina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura da la pagina {{page}}\n\n# Find panel button title and messages\nfind_input.title=Tschertgar\nfind_input.placeholder=Tschertgar en il document…\nfind_previous.title=Tschertgar la posiziun precedenta da l'expressiun\nfind_previous_label=Enavos\nfind_next.title=Tschertgar la proxima posiziun da l'expressiun\nfind_next_label=Enavant\nfind_highlight=Relevar tuts\nfind_match_case_label=Resguardar maiusclas/minusclas\nfind_entire_word_label=Pleds entirs\nfind_reached_top=Il cumenzament dal document è cuntanschì, la tschertga cuntinuescha a la fin dal document\nfind_reached_bottom=La fin dal document è cuntanschì, la tschertga cuntinuescha al cumenzament dal document\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} dad {{total}} correspundenza\nfind_match_count[two]={{current}} da {{total}} correspundenzas\nfind_match_count[few]={{current}} da {{total}} correspundenzas\nfind_match_count[many]={{current}} da {{total}} correspundenzas\nfind_match_count[other]={{current}} da {{total}} correspundenzas\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Dapli che {{limit}} correspundenzas\nfind_match_count_limit[one]=Dapli che {{limit}} correspundenza\nfind_match_count_limit[two]=Dapli che {{limit}} correspundenzas\nfind_match_count_limit[few]=Dapli che {{limit}} correspundenzas\nfind_match_count_limit[many]=Dapli che {{limit}} correspundenzas\nfind_match_count_limit[other]=Dapli che {{limit}} correspundenzas\nfind_not_found=Impussibel da chattar l'expressiun\n\n# Error panel labels\nerror_more_info=Dapli infurmaziuns\nerror_less_info=Damain infurmaziuns\nerror_close=Serrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Messadi: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Datoteca: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Lingia: {{line}}\nrendering_error=Ina errur è cumparida cun visualisar questa pagina.\n\n# Predefined zoom values\npage_scale_width=Ladezza da la pagina\npage_scale_fit=Entira pagina\npage_scale_auto=Zoom automatic\npage_scale_actual=Grondezza actuala\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Ina errur è cumparida cun chargiar il PDF.\ninvalid_file_error=Datoteca PDF nunvalida u donnegiada.\nmissing_file_error=Datoteca PDF manconta.\nunexpected_response_error=Resposta nunspetgada dal server.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Annotaziun da {{type}}]\npassword_label=Endatescha il pled-clav per avrir questa datoteca da PDF.\npassword_invalid=Pled-clav nunvalid. Emprova anc ina giada.\npassword_ok=OK\npassword_cancel=Interrumper\n\nprinting_not_supported=Attenziun: Il stampar na funcziunescha anc betg dal tut en quest navigatur.\nprinting_not_ready=Attenziun: Il PDF n'è betg chargià cumplettamain per stampar.\nweb_fonts_disabled=Scrittiras dal web èn deactivadas: impussibel dad utilisar las scrittiras integradas en il PDF.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/ro/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pagina precedentă\nprevious_label=Înapoi\nnext.title=Pagina următoare\nnext_label=Înainte\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pagina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=din {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} din {{pagesCount}})\n\nzoom_out.title=Micșorează\nzoom_out_label=Micșorează\nzoom_in.title=Mărește\nzoom_in_label=Mărește\nzoom.title=Zoom\npresentation_mode.title=Comută la modul de prezentare\npresentation_mode_label=Mod de prezentare\nopen_file.title=Deschide un fișier\nopen_file_label=Deschide\nprint.title=Tipărește\nprint_label=Tipărește\ndownload.title=Descarcă\ndownload_label=Descarcă\nbookmark.title=Vizualizare actuală (copiază sau deschide într-o fereastră nouă)\nbookmark_label=Vizualizare actuală\n\n# Secondary toolbar and context menu\ntools.title=Instrumente\ntools_label=Instrumente\nfirst_page.title=Mergi la prima pagină\nfirst_page.label=Mergi la prima pagină\nfirst_page_label=Mergi la prima pagină\nlast_page.title=Mergi la ultima pagină\nlast_page.label=Mergi la ultima pagină\nlast_page_label=Mergi la ultima pagină\npage_rotate_cw.title=Rotește în sensul acelor de ceas\npage_rotate_cw.label=Rotește în sensul acelor de ceas\npage_rotate_cw_label=Rotește în sensul acelor de ceas\npage_rotate_ccw.title=Rotește în sens invers al acelor de ceas\npage_rotate_ccw.label=Rotește în sens invers al acelor de ceas\npage_rotate_ccw_label=Rotește în sens invers al acelor de ceas\n\ncursor_text_select_tool.title=Activează instrumentul de selecție a textului\ncursor_text_select_tool_label=Instrumentul de selecție a textului\ncursor_hand_tool.title=Activează instrumentul mână\ncursor_hand_tool_label=Unealta mână\n\nscroll_vertical.title=Folosește derularea verticală\nscroll_vertical_label=Derulare verticală\nscroll_horizontal.title=Folosește derularea orizontală\nscroll_horizontal_label=Derulare orizontală\nscroll_wrapped.title=Folosește derularea încadrată\nscroll_wrapped_label=Derulare încadrată\n\nspread_none.title=Nu uni paginile broșate\nspread_none_label=Fără pagini broșate\nspread_odd.title=Unește paginile broșate începând cu cele impare\nspread_odd_label=Broșare pagini impare\nspread_even.title=Unește paginile broșate începând cu cele pare\nspread_even_label=Broșare pagini pare\n\n# Document properties dialog box\ndocument_properties.title=Proprietățile documentului…\ndocument_properties_label=Proprietățile documentului…\ndocument_properties_file_name=Numele fișierului:\ndocument_properties_file_size=Mărimea fișierului:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} byți)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} byți)\ndocument_properties_title=Titlu:\ndocument_properties_author=Autor:\ndocument_properties_subject=Subiect:\ndocument_properties_keywords=Cuvinte cheie:\ndocument_properties_creation_date=Data creării:\ndocument_properties_modification_date=Data modificării:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Autor:\ndocument_properties_producer=Producător PDF:\ndocument_properties_version=Versiune PDF:\ndocument_properties_page_count=Număr de pagini:\ndocument_properties_page_size=Mărimea paginii:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=verticală\ndocument_properties_page_size_orientation_landscape=orizontală\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Literă\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Vizualizare web rapidă:\ndocument_properties_linearized_yes=Da\ndocument_properties_linearized_no=Nu\ndocument_properties_close=Închide\n\nprint_progress_message=Se pregătește documentul pentru tipărire…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Renunță\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Comută bara laterală\ntoggle_sidebar_notification.title=Comută bara laterală (documentul conține schițe/atașamente)\ntoggle_sidebar_label=Comută bara laterală\ndocument_outline.title=Afișează schița documentului (dublu-clic pentru a extinde/restrânge toate elementele)\ndocument_outline_label=Schița documentului\nattachments.title=Afișează atașamentele\nattachments_label=Atașamente\nthumbs.title=Afișează miniaturi\nthumbs_label=Miniaturi\nfindbar.title=Caută în document\nfindbar_label=Caută\n\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Pagina {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pagina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura paginii {{page}}\n\n# Find panel button title and messages\nfind_input.title=Caută\nfind_input.placeholder=Caută în document…\nfind_previous.title=Mergi la apariția anterioară a textului\nfind_previous_label=Înapoi\nfind_next.title=Mergi la apariția următoare a textului\nfind_next_label=Înainte\nfind_highlight=Evidențiază toate aparițiile\nfind_match_case_label=Ține cont de majuscule și minuscule\nfind_entire_word_label=Cuvinte întregi\nfind_reached_top=Am ajuns la începutul documentului, continuă de la sfârșit\nfind_reached_bottom=Am ajuns la sfârșitul documentului, continuă de la început\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} din {{total}} rezultat\nfind_match_count[two]={{current}} din {{total}} rezultate\nfind_match_count[few]={{current}} din {{total}} rezultate\nfind_match_count[many]={{current}} din {{total}} de rezultate\nfind_match_count[other]={{current}} din {{total}} de rezultate\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Peste {{limit}} rezultate\nfind_match_count_limit[one]=Peste {{limit}} rezultat\nfind_match_count_limit[two]=Peste {{limit}} rezultate\nfind_match_count_limit[few]=Peste {{limit}} rezultate\nfind_match_count_limit[many]=Peste {{limit}} de rezultate\nfind_match_count_limit[other]=Peste {{limit}} de rezultate\nfind_not_found=Nu s-a găsit textul\n\n# Error panel labels\nerror_more_info=Mai multe informații\nerror_less_info=Mai puține informații\nerror_close=Închide\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (versiunea compilată: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mesaj: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stivă: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fișier: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rând: {{line}}\nrendering_error=A intervenit o eroare la randarea paginii.\n\n# Predefined zoom values\npage_scale_width=Lățime pagină\npage_scale_fit=Potrivire la pagină\npage_scale_auto=Zoom automat\npage_scale_actual=Mărime reală\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=A intervenit o eroare la încărcarea PDF-ului.\ninvalid_file_error=Fișier PDF nevalid sau corupt.\nmissing_file_error=Fișier PDF lipsă.\nunexpected_response_error=Răspuns neașteptat de la server.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Adnotare {{type}}]\npassword_label=Introdu parola pentru a deschide acest fișier PDF.\npassword_invalid=Parolă nevalidă. Te rugăm să încerci din nou.\npassword_ok=Ok\npassword_cancel=Renunță\n\nprinting_not_supported=Avertisment: Tipărirea nu este suportată în totalitate de acest browser.\nprinting_not_ready=Avertisment: PDF-ul nu este încărcat complet pentru tipărire.\nweb_fonts_disabled=Fonturile web sunt dezactivate: nu se pot folosi fonturile PDF încorporate.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/ru/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Предыдущая страница\nprevious_label=Предыдущая\nnext.title=Следующая страница\nnext_label=Следующая\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Страница\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=из {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} из {{pagesCount}})\n\nzoom_out.title=Уменьшить\nzoom_out_label=Уменьшить\nzoom_in.title=Увеличить\nzoom_in_label=Увеличить\nzoom.title=Масштаб\npresentation_mode.title=Перейти в режим презентации\npresentation_mode_label=Режим презентации\nopen_file.title=Открыть файл\nopen_file_label=Открыть\nprint.title=Печать\nprint_label=Печать\ndownload.title=Загрузить\ndownload_label=Загрузить\nbookmark.title=Ссылка на текущий вид (скопировать или открыть в новом окне)\nbookmark_label=Текущий вид\n\n# Secondary toolbar and context menu\ntools.title=Инструменты\ntools_label=Инструменты\nfirst_page.title=Перейти на первую страницу\nfirst_page.label=Перейти на первую страницу\nfirst_page_label=Перейти на первую страницу\nlast_page.title=Перейти на последнюю страницу\nlast_page.label=Перейти на последнюю страницу\nlast_page_label=Перейти на последнюю страницу\npage_rotate_cw.title=Повернуть по часовой стрелке\npage_rotate_cw.label=Повернуть по часовой стрелке\npage_rotate_cw_label=Повернуть по часовой стрелке\npage_rotate_ccw.title=Повернуть против часовой стрелки\npage_rotate_ccw.label=Повернуть против часовой стрелки\npage_rotate_ccw_label=Повернуть против часовой стрелки\n\ncursor_text_select_tool.title=Включить Инструмент «Выделение текста»\ncursor_text_select_tool_label=Инструмент «Выделение текста»\ncursor_hand_tool.title=Включить Инструмент «Рука»\ncursor_hand_tool_label=Инструмент «Рука»\n\nscroll_vertical.title=Использовать вертикальную прокрутку\nscroll_vertical_label=Вертикальная прокрутка\nscroll_horizontal.title=Использовать горизонтальную прокрутку\nscroll_horizontal_label=Горизонтальная прокрутка\nscroll_wrapped.title=Использовать масштабируемую прокрутку\nscroll_wrapped_label=Масштабируемая прокрутка\n\nspread_none.title=Не использовать режим разворотов страниц\nspread_none_label=Без разворотов страниц\nspread_odd.title=Развороты начинаются с нечётных номеров страниц\nspread_odd_label=Нечётные страницы слева\nspread_even.title=Развороты начинаются с чётных номеров страниц\nspread_even_label=Чётные страницы слева\n\n# Document properties dialog box\ndocument_properties.title=Свойства документа…\ndocument_properties_label=Свойства документа…\ndocument_properties_file_name=Имя файла:\ndocument_properties_file_size=Размер файла:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} КБ ({{size_b}} байт)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} МБ ({{size_b}} байт)\ndocument_properties_title=Заголовок:\ndocument_properties_author=Автор:\ndocument_properties_subject=Тема:\ndocument_properties_keywords=Ключевые слова:\ndocument_properties_creation_date=Дата создания:\ndocument_properties_modification_date=Дата изменения:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Приложение:\ndocument_properties_producer=Производитель PDF:\ndocument_properties_version=Версия PDF:\ndocument_properties_page_count=Число страниц:\ndocument_properties_page_size=Размер страницы:\ndocument_properties_page_size_unit_inches=дюймов\ndocument_properties_page_size_unit_millimeters=мм\ndocument_properties_page_size_orientation_portrait=книжная\ndocument_properties_page_size_orientation_landscape=альбомная\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Быстрый просмотр в Web:\ndocument_properties_linearized_yes=Да\ndocument_properties_linearized_no=Нет\ndocument_properties_close=Закрыть\n\nprint_progress_message=Подготовка документа к печати…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Отмена\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Показать/скрыть боковую панель\ntoggle_sidebar_notification.title=Показать/скрыть боковую панель (документ имеет содержание/вложения)\ntoggle_sidebar_notification2.title=Показать/скрыть боковую панель (документ имеет содержание/вложения/слои)\ntoggle_sidebar_label=Показать/скрыть боковую панель\ndocument_outline.title=Показать содержание документа (двойной щелчок, чтобы развернуть/свернуть все элементы)\ndocument_outline_label=Содержание документа\nattachments.title=Показать вложения\nattachments_label=Вложения\nlayers.title=Показать слои (дважды щёлкните, чтобы сбросить все слои к состоянию по умолчанию)\nlayers_label=Слои\nthumbs.title=Показать миниатюры\nthumbs_label=Миниатюры\ncurrent_outline_item.title=Найти текущий элемент структуры\ncurrent_outline_item_label=Текущий элемент структуры\nfindbar.title=Найти в документе\nfindbar_label=Найти\n\nadditional_layers=Дополнительные слои\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Страница {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Страница {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Миниатюра страницы {{page}}\n\n# Find panel button title and messages\nfind_input.title=Найти\nfind_input.placeholder=Найти в документе…\nfind_previous.title=Найти предыдущее вхождение фразы в текст\nfind_previous_label=Назад\nfind_next.title=Найти следующее вхождение фразы в текст\nfind_next_label=Далее\nfind_highlight=Подсветить все\nfind_match_case_label=С учётом регистра\nfind_entire_word_label=Слова целиком\nfind_reached_top=Достигнут верх документа, продолжено снизу\nfind_reached_bottom=Достигнут конец документа, продолжено сверху\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} из {{total}} совпадения\nfind_match_count[two]={{current}} из {{total}} совпадений\nfind_match_count[few]={{current}} из {{total}} совпадений\nfind_match_count[many]={{current}} из {{total}} совпадений\nfind_match_count[other]={{current}} из {{total}} совпадений\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Более {{limit}} совпадений\nfind_match_count_limit[one]=Более {{limit}} совпадения\nfind_match_count_limit[two]=Более {{limit}} совпадений\nfind_match_count_limit[few]=Более {{limit}} совпадений\nfind_match_count_limit[many]=Более {{limit}} совпадений\nfind_match_count_limit[other]=Более {{limit}} совпадений\nfind_not_found=Фраза не найдена\n\n# Error panel labels\nerror_more_info=Детали\nerror_less_info=Скрыть детали\nerror_close=Закрыть\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (сборка: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Сообщение: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стeк: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Файл: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Строка: {{line}}\nrendering_error=При создании страницы произошла ошибка.\n\n# Predefined zoom values\npage_scale_width=По ширине страницы\npage_scale_fit=По размеру страницы\npage_scale_auto=Автоматически\npage_scale_actual=Реальный размер\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=При загрузке PDF произошла ошибка.\ninvalid_file_error=Некорректный или повреждённый PDF-файл.\nmissing_file_error=PDF-файл отсутствует.\nunexpected_response_error=Неожиданный ответ сервера.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Аннотация {{type}}]\npassword_label=Введите пароль, чтобы открыть этот PDF-файл.\npassword_invalid=Неверный пароль. Пожалуйста, попробуйте снова.\npassword_ok=OK\npassword_cancel=Отмена\n\nprinting_not_supported=Предупреждение: В этом браузере не полностью поддерживается печать.\nprinting_not_ready=Предупреждение: PDF не полностью загружен для печати.\nweb_fonts_disabled=Веб-шрифты отключены: не удалось задействовать встроенные PDF-шрифты.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/scn/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Cchiù nicu\nzoom_out_label=Cchiù nicu\nzoom_in.title=Cchiù granni\nzoom_in_label=Cchiù granni\n\n# Secondary toolbar and context menu\n\n\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Vista web lesta:\ndocument_properties_linearized_yes=Se\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_close=Sfai\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\n\n# Find panel button title and messages\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\n\n# Error panel labels\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\n\n# Predefined zoom values\npage_scale_width=Larghizza dâ pàggina\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\npassword_cancel=Sfai\n\n"
  },
  {
    "path": "lib/pdf.js/web/locale/si/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=මීට පෙර පිටුව\nprevious_label=පෙර\nnext.title=මීළඟ පිටුව\nnext_label=මීළඟ\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=පිටුව\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=කුඩා කරන්න\nzoom_out_label=කුඩා කරන්න\nzoom_in.title=විශාල කරන්න\nzoom_in_label=විශාල කරන්න\nzoom.title=විශාලණය\npresentation_mode.title=ඉදිරිපත්කිරීම් ප්‍රකාරය වෙත මාරුවන්න\npresentation_mode_label=ඉදිරිපත්කිරීම් ප්‍රකාරය\nopen_file.title=ගොනුව විවෘත කරන්න\nopen_file_label=විවෘත කරන්න\nprint.title=මුද්‍රණය\nprint_label=මුද්‍රණය\ndownload.title=බාගන්න\ndownload_label=බාගන්න\nbookmark.title=දැනට ඇති දසුන (පිටපත් කරන්න හෝ නව කවුළුවක විවෘත කරන්න)\nbookmark_label=දැනට ඇති දසුන\n\n# Secondary toolbar and context menu\ntools.title=මෙවලම්\ntools_label=මෙවලම්\nfirst_page.title=මුල් පිටුවට යන්න\nfirst_page.label=මුල් පිටුවට යන්න\nfirst_page_label=මුල් පිටුවට යන්න\nlast_page.title=අවසන් පිටුවට යන්න\nlast_page.label=අවසන් පිටුවට යන්න\nlast_page_label=අවසන් පිටුවට යන්න\npage_rotate_cw.title=දක්ශිණාවර්තව භ්‍රමණය\npage_rotate_cw.label=දක්ශිණාවර්තව භ්‍රමණය\npage_rotate_cw_label=දක්ශිණාවර්තව භ්‍රමණය\npage_rotate_ccw.title=වාමාවර්තව භ්‍රමණය\npage_rotate_ccw.label=වාමාවර්තව භ්‍රමණය\npage_rotate_ccw_label=වාමාවර්තව භ්‍රමණය\n\ncursor_hand_tool_label=අත් මෙවලම\n\n\n\n# Document properties dialog box\ndocument_properties.title=ලේඛන වත්කම්...\ndocument_properties_label=ලේඛන වත්කම්...\ndocument_properties_file_name=ගොනු නම:\ndocument_properties_file_size=ගොනු ප්‍රමාණය:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} බයිට)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} බයිට)\ndocument_properties_title=සිරස්තලය:\ndocument_properties_author=කතෲ\ndocument_properties_subject=මාතෘකාව:\ndocument_properties_keywords=යතුරු වදන්:\ndocument_properties_creation_date=නිර්මිත දිනය:\ndocument_properties_modification_date=වෙනස්කල දිනය:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=නිර්මාපක:\ndocument_properties_producer=PDF නිශ්පාදක:\ndocument_properties_version=PDF නිකුතුව:\ndocument_properties_page_count=පිටු ගණන:\ndocument_properties_page_size=පිටුවේ විශාලත්වය:\ndocument_properties_page_size_unit_inches=අඟල්\ndocument_properties_page_size_unit_millimeters=මිමි\ndocument_properties_page_size_orientation_portrait=සිරස්\ndocument_properties_page_size_orientation_landscape=තිරස්\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}}×{{height}}{{unit}}{{name}}{{orientation}}\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=වේගවත් ජාල දසුන:\ndocument_properties_linearized_yes=ඔව්\ndocument_properties_linearized_no=නැහැ\ndocument_properties_close=වසන්න\n\nprint_progress_message=ලේඛනය මුද්‍රණය සඳහා සූදානම් කරමින්…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=අවලංගු කරන්න\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=පැති තීරුවට මාරුවන්න\ntoggle_sidebar_label=පැති තීරුවට මාරුවන්න\ndocument_outline_label=ලේඛනයේ පිට මායිම\nattachments.title=ඇමිණුම් පෙන්වන්න\nattachments_label=ඇමිණුම්\nthumbs.title=සිඟිති රූ පෙන්වන්න\nthumbs_label=සිඟිති රූ\nfindbar.title=ලේඛනය තුළ සොයන්න\nfindbar_label=සොයන්න\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=පිටුව {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=පිටුවෙ සිඟිත රූව {{page}}\n\n# Find panel button title and messages\nfind_input.title=සොයන්න\nfind_previous.title=මේ වාක්‍ය ඛණ්ඩය මීට පෙර යෙදුණු ස්ථානය සොයන්න\nfind_previous_label=පෙර:\nfind_next.title=මේ වාක්‍ය ඛණ්ඩය මීළඟට යෙදෙන ස්ථානය සොයන්න\nfind_next_label=මීළඟ\nfind_highlight=සියල්ල උද්දීපනය\nfind_match_case_label=අකුරු ගළපන්න\nfind_entire_word_label=සම්පූර්ණ වචන\nfind_reached_top=පිටුවේ ඉහළ කෙළවරට ලගාවිය, පහළ සිට ඉදිරියට යමින්\nfind_reached_bottom=පිටුවේ පහළ කෙළවරට ලගාවිය, ඉහළ සිට ඉදිරියට යමින්\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit[zero]=ගැලපුම් {{limit}} ට වඩා\nfind_not_found=ඔබ සෙව් වචන හමු නොවීය\n\n# Error panel labels\nerror_more_info=බොහෝ තොරතුරු\nerror_less_info=අවම තොරතුරු\nerror_close=වසන්න\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (නිකුතුව: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=පණිවිඩය: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ගොනුව: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=පේළිය: {{line}}\nrendering_error=පිටුව රෙන්ඩර් විමේදි ගැටලුවක් හට ගැනුණි.\n\n# Predefined zoom values\npage_scale_width=පිටුවේ පළල\npage_scale_fit=පිටුවට සුදුසු ලෙස\npage_scale_auto=ස්වයංක්‍රීය විශාලණය\npage_scale_actual=නියමිත ප්‍රමාණය\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=PDF පූරණය විමේදි දෝෂයක් හට ගැනුණි.\ninvalid_file_error=දූශිත හෝ සාවද්‍ය PDF ගොනුව.\nmissing_file_error=නැතිවූ PDF ගොනුව.\nunexpected_response_error=බලාපොරොත්තු නොවූ සේවාදායක ප්‍රතිචාරය.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} විස්තරය]\npassword_label=මෙම PDF ගොනුව විවෘත කිරීමට මුරපදය ඇතුළත් කරන්න.\npassword_invalid=වැරදි මුරපදයක්. කරුණාකර නැවත උත්සහ කරන්න.\npassword_ok=හරි\npassword_cancel=එපා\n\nprinting_not_supported=අවවාදයයි: මෙම ගවේශකය මුද්‍රණය සඳහා සම්පූර්ණයෙන් සහය නොදක්වයි.\nprinting_not_ready=අවවාදයයි: මුද්‍රණය සඳහා PDF සම්පූර්ණයෙන් පූර්ණය වී නොමැත.\nweb_fonts_disabled=ජාල අකුරු අක්‍රීයයි: තිළැලි PDF අකුරු භාවිත කළ නොහැක.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/sk/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Predchádzajúca strana\nprevious_label=Predchádzajúca\nnext.title=Nasledujúca strana\nnext_label=Nasledujúca\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Strana\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=z {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} z {{pagesCount}})\n\nzoom_out.title=Zmenšiť veľkosť\nzoom_out_label=Zmenšiť veľkosť\nzoom_in.title=Zväčšiť veľkosť\nzoom_in_label=Zväčšiť veľkosť\nzoom.title=Nastavenie veľkosti\npresentation_mode.title=Prepnúť na režim prezentácie\npresentation_mode_label=Režim prezentácie\nopen_file.title=Otvoriť súbor\nopen_file_label=Otvoriť\nprint.title=Tlačiť\nprint_label=Tlačiť\ndownload.title=Prevziať\ndownload_label=Prevziať\nbookmark.title=Aktuálne zobrazenie (kopírovať alebo otvoriť v novom okne)\nbookmark_label=Aktuálne zobrazenie\n\n# Secondary toolbar and context menu\ntools.title=Nástroje\ntools_label=Nástroje\nfirst_page.title=Prejsť na prvú stranu\nfirst_page.label=Prejsť na prvú stranu\nfirst_page_label=Prejsť na prvú stranu\nlast_page.title=Prejsť na poslednú stranu\nlast_page.label=Prejsť na poslednú stranu\nlast_page_label=Prejsť na poslednú stranu\npage_rotate_cw.title=Otočiť v smere hodinových ručičiek\npage_rotate_cw.label=Otočiť v smere hodinových ručičiek\npage_rotate_cw_label=Otočiť v smere hodinových ručičiek\npage_rotate_ccw.title=Otočiť proti smeru hodinových ručičiek\npage_rotate_ccw.label=Otočiť proti smeru hodinových ručičiek\npage_rotate_ccw_label=Otočiť proti smeru hodinových ručičiek\n\ncursor_text_select_tool.title=Povoliť výber textu\ncursor_text_select_tool_label=Výber textu\ncursor_hand_tool.title=Povoliť nástroj ruka\ncursor_hand_tool_label=Nástroj ruka\n\nscroll_vertical.title=Používať zvislé posúvanie\nscroll_vertical_label=Zvislé posúvanie\nscroll_horizontal.title=Používať vodorovné posúvanie\nscroll_horizontal_label=Vodorovné posúvanie\nscroll_wrapped.title=Použiť postupné posúvanie\nscroll_wrapped_label=Postupné posúvanie\n\nspread_none.title=Nezdružovať stránky\nspread_none_label=Žiadne združovanie\nspread_odd.title=Združí stránky a umiestni nepárne stránky vľavo\nspread_odd_label=Združiť stránky (nepárne vľavo)\nspread_even.title=Združí stránky a umiestni párne stránky vľavo\nspread_even_label=Združiť stránky (párne vľavo)\n\n# Document properties dialog box\ndocument_properties.title=Vlastnosti dokumentu…\ndocument_properties_label=Vlastnosti dokumentu…\ndocument_properties_file_name=Názov súboru:\ndocument_properties_file_size=Veľkosť súboru:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kB ({{size_b}} bajtov)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajtov)\ndocument_properties_title=Názov:\ndocument_properties_author=Autor:\ndocument_properties_subject=Predmet:\ndocument_properties_keywords=Kľúčové slová:\ndocument_properties_creation_date=Dátum vytvorenia:\ndocument_properties_modification_date=Dátum úpravy:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Vytvoril:\ndocument_properties_producer=Tvorca PDF:\ndocument_properties_version=Verzia PDF:\ndocument_properties_page_count=Počet strán:\ndocument_properties_page_size=Veľkosť stránky:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=na výšku\ndocument_properties_page_size_orientation_landscape=na šírku\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=List\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Rýchle Web View:\ndocument_properties_linearized_yes=Áno\ndocument_properties_linearized_no=Nie\ndocument_properties_close=Zavrieť\n\nprint_progress_message=Príprava dokumentu na tlač…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Zrušiť\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Prepnúť bočný panel\ntoggle_sidebar_notification.title=Prepnúť bočný panel (dokument obsahuje osnovu/prílohy)\ntoggle_sidebar_notification2.title=Prepnúť bočný panel (dokument obsahuje osnovu/prílohy/vrstvy)\ntoggle_sidebar_label=Prepnúť bočný panel\ndocument_outline.title=Zobraziť osnovu dokumentu (dvojitým kliknutím rozbalíte/zbalíte všetky položky)\ndocument_outline_label=Osnova dokumentu\nattachments.title=Zobraziť prílohy\nattachments_label=Prílohy\nlayers.title=Zobraziť vrstvy (dvojitým kliknutím uvediete všetky vrstvy do pôvodného stavu)\nlayers_label=Vrstvy\nthumbs.title=Zobraziť miniatúry\nthumbs_label=Miniatúry\ncurrent_outline_item.title=Nájsť aktuálnu položku v osnove\ncurrent_outline_item_label=Aktuálna položka v osnove\nfindbar.title=Hľadať v dokumente\nfindbar_label=Hľadať\n\nadditional_layers=Ďalšie vrstvy\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Strana {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Strana {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatúra strany {{page}}\n\n# Find panel button title and messages\nfind_input.title=Hľadať\nfind_input.placeholder=Hľadať v dokumente…\nfind_previous.title=Vyhľadať predchádzajúci výskyt reťazca\nfind_previous_label=Predchádzajúce\nfind_next.title=Vyhľadať ďalší výskyt reťazca\nfind_next_label=Ďalšie\nfind_highlight=Zvýrazniť všetky\nfind_match_case_label=Rozlišovať veľkosť písmen\nfind_entire_word_label=Celé slová\nfind_reached_top=Bol dosiahnutý začiatok stránky, pokračuje sa od konca\nfind_reached_bottom=Bol dosiahnutý koniec stránky, pokračuje sa od začiatku\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}}. z {{total}} výsledku\nfind_match_count[two]={{current}}. z {{total}} výsledkov\nfind_match_count[few]={{current}}. z {{total}} výsledkov\nfind_match_count[many]={{current}}. z {{total}} výsledkov\nfind_match_count[other]={{current}}. z {{total}} výsledkov\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Viac než {{limit}} výsledkov\nfind_match_count_limit[one]=Viac než {{limit}} výsledok\nfind_match_count_limit[two]=Viac než {{limit}} výsledky\nfind_match_count_limit[few]=Viac než {{limit}} výsledky\nfind_match_count_limit[many]=Viac než {{limit}} výsledkov\nfind_match_count_limit[other]=Viac než {{limit}} výsledkov\nfind_not_found=Výraz nebol nájdený\n\n# Error panel labels\nerror_more_info=Ďalšie informácie\nerror_less_info=Menej informácií\nerror_close=Zavrieť\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (zostavenie: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Správa: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Zásobník: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Súbor: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Riadok: {{line}}\nrendering_error=Pri vykresľovaní stránky sa vyskytla chyba.\n\n# Predefined zoom values\npage_scale_width=Na šírku strany\npage_scale_fit=Na veľkosť strany\npage_scale_auto=Automatická veľkosť\npage_scale_actual=Skutočná veľkosť\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}} %\n\n# Loading indicator messages\nloading_error=Počas načítavania dokumentu PDF sa vyskytla chyba.\ninvalid_file_error=Neplatný alebo poškodený súbor PDF.\nmissing_file_error=Chýbajúci súbor PDF.\nunexpected_response_error=Neočakávaná odpoveď zo servera.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotácia typu {{type}}]\npassword_label=Ak chcete otvoriť tento súbor PDF, zadajte jeho heslo.\npassword_invalid=Heslo nie je platné. Skúste to znova.\npassword_ok=OK\npassword_cancel=Zrušiť\n\nprinting_not_supported=Upozornenie: tlač nie je v tomto prehliadači plne podporovaná.\nprinting_not_ready=Upozornenie: súbor PDF nie je plne načítaný pre tlač.\nweb_fonts_disabled=Webové písma sú vypnuté: nie je možné použiť písma vložené do súboru PDF.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/sl/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Prejšnja stran\nprevious_label=Nazaj\nnext.title=Naslednja stran\nnext_label=Naprej\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Stran\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=od {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} od {{pagesCount}})\n\nzoom_out.title=Pomanjšaj\nzoom_out_label=Pomanjšaj\nzoom_in.title=Povečaj\nzoom_in_label=Povečaj\nzoom.title=Povečava\npresentation_mode.title=Preklopi v način predstavitve\npresentation_mode_label=Način predstavitve\nopen_file.title=Odpri datoteko\nopen_file_label=Odpri\nprint.title=Natisni\nprint_label=Natisni\ndownload.title=Prenesi\ndownload_label=Prenesi\nbookmark.title=Trenutni pogled (kopiraj ali odpri v novem oknu)\nbookmark_label=Trenutni pogled\n\n# Secondary toolbar and context menu\ntools.title=Orodja\ntools_label=Orodja\nfirst_page.title=Pojdi na prvo stran\nfirst_page.label=Pojdi na prvo stran\nfirst_page_label=Pojdi na prvo stran\nlast_page.title=Pojdi na zadnjo stran\nlast_page.label=Pojdi na zadnjo stran\nlast_page_label=Pojdi na zadnjo stran\npage_rotate_cw.title=Zavrti v smeri urnega kazalca\npage_rotate_cw.label=Zavrti v smeri urnega kazalca\npage_rotate_cw_label=Zavrti v smeri urnega kazalca\npage_rotate_ccw.title=Zavrti v nasprotni smeri urnega kazalca\npage_rotate_ccw.label=Zavrti v nasprotni smeri urnega kazalca\npage_rotate_ccw_label=Zavrti v nasprotni smeri urnega kazalca\n\ncursor_text_select_tool.title=Omogoči orodje za izbor besedila\ncursor_text_select_tool_label=Orodje za izbor besedila\ncursor_hand_tool.title=Omogoči roko\ncursor_hand_tool_label=Roka\n\nscroll_vertical.title=Uporabi navpično drsenje\nscroll_vertical_label=Navpično drsenje\nscroll_horizontal.title=Uporabi vodoravno drsenje\nscroll_horizontal_label=Vodoravno drsenje\nscroll_wrapped.title=Uporabi ovito drsenje\nscroll_wrapped_label=Ovito drsenje\n\nspread_none.title=Ne združuj razponov strani\nspread_none_label=Brez razponov\nspread_odd.title=Združuj razpone strani z začetkom pri lihih straneh\nspread_odd_label=Lihi razponi\nspread_even.title=Združuj razpone strani z začetkom pri sodih straneh\nspread_even_label=Sodi razponi\n\n# Document properties dialog box\ndocument_properties.title=Lastnosti dokumenta …\ndocument_properties_label=Lastnosti dokumenta …\ndocument_properties_file_name=Ime datoteke:\ndocument_properties_file_size=Velikost datoteke:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bajtov)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajtov)\ndocument_properties_title=Ime:\ndocument_properties_author=Avtor:\ndocument_properties_subject=Tema:\ndocument_properties_keywords=Ključne besede:\ndocument_properties_creation_date=Datum nastanka:\ndocument_properties_modification_date=Datum spremembe:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Ustvaril:\ndocument_properties_producer=Izdelovalec PDF:\ndocument_properties_version=Različica PDF:\ndocument_properties_page_count=Število strani:\ndocument_properties_page_size=Velikost strani:\ndocument_properties_page_size_unit_inches=palcev\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=pokončno\ndocument_properties_page_size_orientation_landscape=ležeče\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Pismo\ndocument_properties_page_size_name_legal=Pravno\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Hitri spletni ogled:\ndocument_properties_linearized_yes=Da\ndocument_properties_linearized_no=Ne\ndocument_properties_close=Zapri\n\nprint_progress_message=Priprava dokumenta na tiskanje …\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}} %\nprint_progress_close=Prekliči\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Preklopi stransko vrstico\ntoggle_sidebar_notification.title=Preklopi stransko vrstico (dokument vsebuje oris/priponke)\ntoggle_sidebar_notification2.title=Preklopi stransko vrstico (dokument vsebuje oris/priponke/plasti)\ntoggle_sidebar_label=Preklopi stransko vrstico\ndocument_outline.title=Prikaži oris dokumenta (dvokliknite za razširitev/strnitev vseh predmetov)\ndocument_outline_label=Oris dokumenta\nattachments.title=Prikaži priponke\nattachments_label=Priponke\nlayers.title=Prikaži plasti (dvokliknite za ponastavitev vseh plasti na privzeto stanje)\nlayers_label=Plasti\nthumbs.title=Prikaži sličice\nthumbs_label=Sličice\ncurrent_outline_item.title=Najdi trenutni predmet orisa\ncurrent_outline_item_label=Trenutni predmet orisa\nfindbar.title=Iskanje po dokumentu\nfindbar_label=Najdi\n\nadditional_layers=Dodatne plasti\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Stran {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Stran {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Sličica strani {{page}}\n\n# Find panel button title and messages\nfind_input.title=Najdi\nfind_input.placeholder=Najdi v dokumentu …\nfind_previous.title=Najdi prejšnjo ponovitev iskanega\nfind_previous_label=Najdi nazaj\nfind_next.title=Najdi naslednjo ponovitev iskanega\nfind_next_label=Najdi naprej\nfind_highlight=Označi vse\nfind_match_case_label=Razlikuj velike/male črke\nfind_entire_word_label=Cele besede\nfind_reached_top=Dosežen začetek dokumenta iz smeri konca\nfind_reached_bottom=Doseženo konec dokumenta iz smeri začetka\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]=Zadetek {{current}} od {{total}}\nfind_match_count[two]=Zadetek {{current}} od {{total}}\nfind_match_count[few]=Zadetek {{current}} od {{total}}\nfind_match_count[many]=Zadetek {{current}} od {{total}}\nfind_match_count[other]=Zadetek {{current}} od {{total}}\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Več kot {{limit}} zadetkov\nfind_match_count_limit[one]=Več kot {{limit}} zadetek\nfind_match_count_limit[two]=Več kot {{limit}} zadetka\nfind_match_count_limit[few]=Več kot {{limit}} zadetki\nfind_match_count_limit[many]=Več kot {{limit}} zadetkov\nfind_match_count_limit[other]=Več kot {{limit}} zadetkov\nfind_not_found=Iskanega ni mogoče najti\n\n# Error panel labels\nerror_more_info=Več informacij\nerror_less_info=Manj informacij\nerror_close=Zapri\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js r{{version}} (graditev: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Sporočilo: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Sklad: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Datoteka: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Vrstica: {{line}}\nrendering_error=Med pripravljanjem strani je prišlo do napake!\n\n# Predefined zoom values\npage_scale_width=Širina strani\npage_scale_fit=Prilagodi stran\npage_scale_auto=Samodejno\npage_scale_actual=Dejanska velikost\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}} %\n\n# Loading indicator messages\nloading_error=Med nalaganjem datoteke PDF je prišlo do napake.\ninvalid_file_error=Neveljavna ali pokvarjena datoteka PDF.\nmissing_file_error=Ni datoteke PDF.\nunexpected_response_error=Nepričakovan odgovor strežnika.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Opomba vrste {{type}}]\npassword_label=Vnesite geslo za odpiranje te datoteke PDF.\npassword_invalid=Neveljavno geslo. Poskusite znova.\npassword_ok=V redu\npassword_cancel=Prekliči\n\nprinting_not_supported=Opozorilo: ta brskalnik ne podpira vseh možnosti tiskanja.\nprinting_not_ready=Opozorilo: PDF ni v celoti naložen za tiskanje.\nweb_fonts_disabled=Spletne pisave so onemogočene: vgradnih pisav za PDF ni mogoče uporabiti.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/son/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Moo bisante\nprevious_label=Bisante\nnext.title=Jinehere moo\nnext_label=Jine\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Moo\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} ra\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} ka hun {{pagesCount}}) ra\n\nzoom_out.title=Nakasandi\nzoom_out_label=Nakasandi\nzoom_in.title=Bebbeerandi\nzoom_in_label=Bebbeerandi\nzoom.title=Bebbeerandi\npresentation_mode.title=Bere cebeyan alhaali\npresentation_mode_label=Cebeyan alhaali\nopen_file.title=Tuku feeri\nopen_file_label=Feeri\nprint.title=Kar\nprint_label=Kar\ndownload.title=Zumandi\ndownload_label=Zumandi\nbookmark.title=Sohõ gunarro (bere wala feeri zanfun taaga ra)\nbookmark_label=Sohõ gunaroo\n\n# Secondary toolbar and context menu\ntools.title=Goyjinawey\ntools_label=Goyjinawey\nfirst_page.title=Koy moo jinaa ga\nfirst_page.label=Koy moo jinaa ga\nfirst_page_label=Koy moo jinaa ga\nlast_page.title=Koy moo koraa ga\nlast_page.label=Koy moo koraa ga\nlast_page_label=Koy moo koraa ga\npage_rotate_cw.title=Kuubi kanbe guma here\npage_rotate_cw.label=Kuubi kanbe guma here\npage_rotate_cw_label=Kuubi kanbe guma here\npage_rotate_ccw.title=Kuubi kanbe wowa here\npage_rotate_ccw.label=Kuubi kanbe wowa here\npage_rotate_ccw_label=Kuubi kanbe wowa here\n\n\n# Document properties dialog box\ndocument_properties.title=Takadda mayrawey…\ndocument_properties_label=Takadda mayrawey…\ndocument_properties_file_name=Tuku maa:\ndocument_properties_file_size=Tuku adadu:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb=KB {{size_kb}} (cebsu-ize {{size_b}})\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb=MB {{size_mb}} (cebsu-ize {{size_b}})\ndocument_properties_title=Tiiramaa:\ndocument_properties_author=Hantumkaw:\ndocument_properties_subject=Dalil:\ndocument_properties_keywords=Kufalkalimawey:\ndocument_properties_creation_date=Teeyan han:\ndocument_properties_modification_date=Barmayan han:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Teekaw:\ndocument_properties_producer=PDF berandikaw:\ndocument_properties_version=PDF dumi:\ndocument_properties_page_count=Moo hinna:\ndocument_properties_close=Daabu\n\nprint_progress_message=Goo ma takaddaa soolu k'a kar se…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Naŋ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Kanjari ceraw zuu\ntoggle_sidebar_notification.title=Kanjari ceraw-zuu (takaddaa goo nda filla-boŋ/hangandiyaŋ)\ntoggle_sidebar_label=Kanjari ceraw zuu\ndocument_outline.title=Takaddaa korfur alhaaloo cebe (naagu cee hinka ka haya-izey kul hayandi/kankamandi)\ndocument_outline_label=Takadda filla-boŋ\nattachments.title=Hangarey cebe\nattachments_label=Hangarey\nthumbs.title=Kabeboy biyey cebe\nthumbs_label=Kabeboy biyey\nfindbar.title=Ceeci takaddaa ra\nfindbar_label=Ceeci\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}} moo\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Kabeboy bii {{page}} moo še\n\n# Find panel button title and messages\nfind_input.title=Ceeci\nfind_input.placeholder=Ceeci takaddaa ra…\nfind_previous.title=Kalimaɲaŋoo bangayri bisantaa ceeci\nfind_previous_label=Bisante\nfind_next.title=Kalimaɲaŋoo hiino bangayroo ceeci\nfind_next_label=Jine\nfind_highlight=Ikul šilbay\nfind_match_case_label=Harfu-beeriyan hawgay\nfind_reached_top=A too moŋoo boŋoo, koy jine ka šinitin nda cewoo\nfind_reached_bottom=A too moɲoo cewoo, koy jine šintioo ga\nfind_not_found=Kalimaɲaa mana duwandi\n\n# Error panel labels\nerror_more_info=Alhabar tontoni\nerror_less_info=Alhabar tontoni\nerror_close=Daabu\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Alhabar: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Dekeri: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Tuku: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Žeeri: {{line}}\nrendering_error=Firka bangay kaŋ moɲoo goo ma willandi.\n\n# Predefined zoom values\npage_scale_width=Mooo hayyan\npage_scale_fit=Moo sawayan\npage_scale_auto=Boŋše azzaati barmayyan\npage_scale_actual=Adadu cimi\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Firka bangay kaŋ PDF goo ma zumandi.\ninvalid_file_error=PDF tuku laala wala laybante.\nmissing_file_error=PDF tuku kumante.\nunexpected_response_error=Manti feršikaw tuuruyan maatante.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt={{type}} maasa-caw]\npassword_label=Šennikufal dam ka PDF tukoo woo feeri.\npassword_invalid=Šennikufal laalo. Ceeci koyne taare.\npassword_ok=Ayyo\npassword_cancel=Naŋ\n\nprinting_not_supported=Yaamar: Karyan ši tee ka timme nda ceecikaa woo.\nprinting_not_ready=Yaamar: PDF ši zunbu ka timme karyan še.\nweb_fonts_disabled=Interneti šigirawey kay: ši hin ka goy nda PDF šigira hurantey.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/sq/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Faqja e Mëparshme\nprevious_label=E mëparshmja\nnext.title=Faqja Pasuese\nnext_label=Pasuesja\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Faqe\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=nga {{pagesCount}} gjithsej\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} nga {{pagesCount}})\n\nzoom_out.title=Zvogëlojeni\nzoom_out_label=Zvogëlojeni\nzoom_in.title=Zmadhojeni\nzoom_in_label=Zmadhojini\nzoom.title=Zoom\npresentation_mode.title=Kalo te Mënyra Paraqitje\npresentation_mode_label=Mënyra Paraqitje\nopen_file.title=Hapni Kartelë\nopen_file_label=Hape\nprint.title=Shtypje\nprint_label=Shtype\ndownload.title=Shkarkim\ndownload_label=Shkarkoje\nbookmark.title=Pamja e tanishme (kopjojeni ose hapeni në dritare të re)\nbookmark_label=Pamja e Tanishme\n\n# Secondary toolbar and context menu\ntools.title=Mjete\ntools_label=Mjete\nfirst_page.title=Kaloni te Faqja e Parë\nfirst_page.label=Kaloni te Faqja e Parë\nfirst_page_label=Kaloni te Faqja e Parë\nlast_page.title=Kaloni te Faqja e Fundit\nlast_page.label=Kaloni te Faqja e Fundit\nlast_page_label=Kaloni te Faqja e Fundit\npage_rotate_cw.title=Rrotullojeni Në Kahun Orar\npage_rotate_cw.label=Rrotulloje Në Kahun Orar\npage_rotate_cw_label=Rrotulloje Në Kahun Orar\npage_rotate_ccw.title=Rrotullojeni Në Kahun Kundërorar\npage_rotate_ccw.label=Rrotulloje Në Kahun Kundërorar\npage_rotate_ccw_label=Rrotulloje Në Kahun Kundërorar\n\ncursor_text_select_tool.title=Aktivizo Mjet Përzgjedhjeje Teksti\ncursor_text_select_tool_label=Mjet Përzgjedhjeje Teksti\ncursor_hand_tool.title=Aktivizo Mjetin Dorë\ncursor_hand_tool_label=Mjeti Dorë\n\nscroll_vertical.title=Përdor Rrëshqitje Vertikale\nscroll_vertical_label=Rrëshqitje Vertikale\nscroll_horizontal.title=Përdor Rrëshqitje Horizontale\nscroll_horizontal_label=Rrëshqitje Horizontale\nscroll_wrapped.title=Përdor Rrëshqitje Me Mbështjellje\nscroll_wrapped_label=Rrëshqitje Me Mbështjellje\n\n\n# Document properties dialog box\ndocument_properties.title=Veti Dokumenti…\ndocument_properties_label=Veti Dokumenti…\ndocument_properties_file_name=Emër kartele:\ndocument_properties_file_size=Madhësi kartele:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bajte)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajte)\ndocument_properties_title=Titull:\ndocument_properties_author=Autor:\ndocument_properties_subject=Subjekt:\ndocument_properties_keywords=Fjalëkyçe:\ndocument_properties_creation_date=Datë Krijimi:\ndocument_properties_modification_date=Datë Ndryshimi:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Krijues:\ndocument_properties_producer=Prodhues PDF-je:\ndocument_properties_version=Version PDF-je:\ndocument_properties_page_count=Numër Faqesh:\ndocument_properties_page_size=Madhësi Faqeje:\ndocument_properties_page_size_unit_inches=inç\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=portret\ndocument_properties_page_size_orientation_landscape=së gjeri\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized_yes=Po\ndocument_properties_linearized_no=Jo\ndocument_properties_close=Mbylleni\n\nprint_progress_message=Po përgatitet dokumenti për shtypje…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Anuloje\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Shfaqni/Fshihni Anështyllën\ntoggle_sidebar_notification.title=Shfaqni Anështyllën (dokumenti përmban përvijim/bashkëngjitje)\ntoggle_sidebar_notification2.title=Hap/Mbyll Anështylë (dokumenti përmban përvijim/nashkëngjitje/shtresa)\ntoggle_sidebar_label=Shfaq/Fshih Anështyllën\ndocument_outline.title=Shfaqni Përvijim Dokumenti (dyklikoni që të shfaqen/fshihen krejt elementët)\ndocument_outline_label=Përvijim Dokumenti\nattachments.title=Shfaqni Bashkëngjitje\nattachments_label=Bashkëngjitje\nlayers.title=Shfaq Shtresa (dyklikoni që të rikthehen krejt shtresat në gjendjen e tyre parazgjedhje)\nlayers_label=Shtresa\nthumbs.title=Shfaqni Miniatura\nthumbs_label=Miniatura\nfindbar.title=Gjeni në Dokument\nfindbar_label=Gjej\n\nadditional_layers=Shtresa Shtesë\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Faqja {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Faqja {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniaturë e Faqes {{page}}\n\n# Find panel button title and messages\nfind_input.title=Gjej\nfind_input.placeholder=Gjeni në dokument…\nfind_previous.title=Gjeni hasjen e mëparshme të togfjalëshit\nfind_previous_label=E mëparshmja\nfind_next.title=Gjeni hasjen pasuese të togfjalëshit\nfind_next_label=Pasuesja\nfind_highlight=Theksoji të tëra\nfind_match_case_label=Siç është shkruar\nfind_entire_word_label=Krejt fjalët\nfind_reached_top=U mbërrit në krye të dokumentit, vazhduar prej fundit\nfind_reached_bottom=U mbërrit në fund të dokumentit, vazhduar prej kreut\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} nga {{total}} përputhje gjithsej\nfind_match_count[two]={{current}} nga {{total}} përputhje gjithsej\nfind_match_count[few]={{current}} nga {{total}} përputhje gjithsej\nfind_match_count[many]={{current}} nga {{total}} përputhje gjithsej\nfind_match_count[other]={{current}} nga {{total}} përputhje gjithsej\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Më shumë se {{limit}} përputhje\nfind_match_count_limit[one]=Më shumë se {{limit}} përputhje\nfind_match_count_limit[two]=Më shumë se {{limit}} përputhje\nfind_match_count_limit[few]=Më shumë se {{limit}} përputhje\nfind_match_count_limit[many]=Më shumë se {{limit}} përputhje\nfind_match_count_limit[other]=Më shumë se {{limit}} përputhje\nfind_not_found=Togfjalësh që s’gjendet\n\n# Error panel labels\nerror_more_info=Më Tepër të Dhëna\nerror_less_info=Më Pak të Dhëna\nerror_close=Mbylleni\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mesazh: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Kartelë: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rresht: {{line}}\nrendering_error=Ndodhi një gabim gjatë riprodhimit të faqes.\n\n# Predefined zoom values\npage_scale_width=Gjerësi Faqeje\npage_scale_fit=Sa Nxë Faqja\npage_scale_auto=Zoom i Vetvetishëm\npage_scale_actual=Madhësia Faktike\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Ndodhi një gabim gjatë ngarkimit të PDF-së.\ninvalid_file_error=Kartelë PDF e pavlefshme ose e dëmtuar.\nmissing_file_error=Kartelë PDF që mungon.\nunexpected_response_error=Përgjigje shërbyesi e papritur.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Nënvizim {{type}}]\npassword_label=Jepni fjalëkalimin që të hapet kjo kartelë PDF.\npassword_invalid=Fjalëkalim i pavlefshëm. Ju lutemi, riprovoni.\npassword_ok=OK\npassword_cancel=Anuloje\n\nprinting_not_supported=Kujdes: Shtypja s’mbulohet plotësisht nga ky shfletues.\nprinting_not_ready=Kujdes: PDF-ja s’është ngarkuar plotësisht që ta shtypni.\nweb_fonts_disabled=Shkronjat Web janë të çaktivizuara: s’arrihet të përdoren shkronja të trupëzuara në PDF.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/sr/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Претходна страница\nprevious_label=Претходна\nnext.title=Следећа страница\nnext_label=Следећа\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Страница\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=од {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} од {{pagesCount}})\n\nzoom_out.title=Умањи\nzoom_out_label=Умањи\nzoom_in.title=Увеличај\nzoom_in_label=Увеличај\nzoom.title=Увеличавање\npresentation_mode.title=Промени на приказ у режиму презентације\npresentation_mode_label=Режим презентације\nopen_file.title=Отвори датотеку\nopen_file_label=Отвори\nprint.title=Штампај\nprint_label=Штампај\ndownload.title=Преузми\ndownload_label=Преузми\nbookmark.title=Тренутни приказ (копирај или отвори нови прозор)\nbookmark_label=Тренутни приказ\n\n# Secondary toolbar and context menu\ntools.title=Алатке\ntools_label=Алатке\nfirst_page.title=Иди на прву страницу\nfirst_page.label=Иди на прву страницу\nfirst_page_label=Иди на прву страницу\nlast_page.title=Иди на последњу страницу\nlast_page.label=Иди на последњу страницу\nlast_page_label=Иди на последњу страницу\npage_rotate_cw.title=Ротирај у смеру казаљке на сату\npage_rotate_cw.label=Ротирај у смеру казаљке на сату\npage_rotate_cw_label=Ротирај у смеру казаљке на сату\npage_rotate_ccw.title=Ротирај у смеру супротном од казаљке на сату\npage_rotate_ccw.label=Ротирај у смеру супротном од казаљке на сату\npage_rotate_ccw_label=Ротирај у смеру супротном од казаљке на сату\n\ncursor_text_select_tool.title=Омогући алат за селектовање текста\ncursor_text_select_tool_label=Алат за селектовање текста\ncursor_hand_tool.title=Омогући алат за померање\ncursor_hand_tool_label=Алат за померање\n\nscroll_vertical.title=Користи вертикално скроловање\nscroll_vertical_label=Вертикално скроловање\nscroll_horizontal.title=Користи хоризонтално скроловање\nscroll_horizontal_label=Хоризонтално скроловање\nscroll_wrapped.title=Користи скроловање по омоту\nscroll_wrapped_label=Скроловање по омоту\n\nspread_none.title=Немој спајати ширења страница\nspread_none_label=Без распростирања\nspread_odd.title=Споји ширења страница које почињу непарним бројем\nspread_odd_label=Непарна распростирања\nspread_even.title=Споји ширења страница које почињу парним бројем\nspread_even_label=Парна распростирања\n\n# Document properties dialog box\ndocument_properties.title=Параметри документа…\ndocument_properties_label=Параметри документа…\ndocument_properties_file_name=Име датотеке:\ndocument_properties_file_size=Величина датотеке:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} B)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} B)\ndocument_properties_title=Наслов:\ndocument_properties_author=Аутор:\ndocument_properties_subject=Тема:\ndocument_properties_keywords=Кључне речи:\ndocument_properties_creation_date=Датум креирања:\ndocument_properties_modification_date=Датум модификације:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Стваралац:\ndocument_properties_producer=PDF произвођач:\ndocument_properties_version=PDF верзија:\ndocument_properties_page_count=Број страница:\ndocument_properties_page_size=Величина странице:\ndocument_properties_page_size_unit_inches=ин\ndocument_properties_page_size_unit_millimeters=мм\ndocument_properties_page_size_orientation_portrait=усправно\ndocument_properties_page_size_orientation_landscape=водоравно\ndocument_properties_page_size_name_a3=А3\ndocument_properties_page_size_name_a4=А4\ndocument_properties_page_size_name_letter=Слово\ndocument_properties_page_size_name_legal=Права\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Брз веб приказ:\ndocument_properties_linearized_yes=Да\ndocument_properties_linearized_no=Не\ndocument_properties_close=Затвори\n\nprint_progress_message=Припремам документ за штампање…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Откажи\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Прикажи додатну палету\ntoggle_sidebar_notification.title=Прикажи додатну траку (докуменат садржи оквире/прилоге)\ntoggle_sidebar_notification2.title=Прикажи/сакриј бочну траку (документ садржи контуру/прилоге/слојеве)\ntoggle_sidebar_label=Прикажи додатну палету\ndocument_outline.title=Прикажи контуру документа (дупли клик за проширење/скупљање елемената)\ndocument_outline_label=Контура документа\nattachments.title=Прикажи прилоге\nattachments_label=Прилози\nlayers.title=Прикажи слојеве (дупли клик за враћање свих слојева у подразумевано стање)\nlayers_label=Слојеви\nthumbs.title=Прикажи сличице\nthumbs_label=Сличице\ncurrent_outline_item.title=Пронађите тренутни елемент структуре\ncurrent_outline_item_label=Тренутна контура\nfindbar.title=Пронађи у документу\nfindbar_label=Пронађи\n\nadditional_layers=Додатни слојеви\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Страница {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Страница {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Сличица од странице {{page}}\n\n# Find panel button title and messages\nfind_input.title=Пронађи\nfind_input.placeholder=Пронађи у документу…\nfind_previous.title=Пронађи претходну појаву фразе\nfind_previous_label=Претходна\nfind_next.title=Пронађи следећу појаву фразе\nfind_next_label=Следећа\nfind_highlight=Истакнути све\nfind_match_case_label=Подударања\nfind_entire_word_label=Целе речи\nfind_reached_top=Достигнут врх документа, наставио са дна\nfind_reached_bottom=Достигнуто дно документа, наставио са врха\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} од {{total}} одговара\nfind_match_count[two]={{current}} од {{total}} одговара\nfind_match_count[few]={{current}} од {{total}} одговара\nfind_match_count[many]={{current}} од {{total}} одговара\nfind_match_count[other]={{current}} од {{total}} одговара\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Више од {{limit}} одговара\nfind_match_count_limit[one]=Више од {{limit}} одговара\nfind_match_count_limit[two]=Више од {{limit}} одговара\nfind_match_count_limit[few]=Више од {{limit}} одговара\nfind_match_count_limit[many]=Више од {{limit}} одговара\nfind_match_count_limit[other]=Више од {{limit}} одговара\nfind_not_found=Фраза није пронађена\n\n# Error panel labels\nerror_more_info=Више информација\nerror_less_info=Мање информација\nerror_close=Затвори\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Порука: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стек: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Датотека: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Линија: {{line}}\nrendering_error=Дошло је до грешке приликом рендеровања ове странице.\n\n# Predefined zoom values\npage_scale_width=Ширина странице\npage_scale_fit=Прилагоди страницу\npage_scale_auto=Аутоматско увеличавање\npage_scale_actual=Стварна величина\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Дошло је до грешке приликом учитавања PDF-а.\ninvalid_file_error=PDF датотека је оштећена или је неисправна.\nmissing_file_error=PDF датотека није пронађена.\nunexpected_response_error=Неочекиван одговор од сервера.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} коментар]\npassword_label=Унесите лозинку да бисте отворили овај PDF докуменат.\npassword_invalid=Неисправна лозинка. Покушајте поново.\npassword_ok=У реду\npassword_cancel=Откажи\n\nprinting_not_supported=Упозорење: Штампање није у потпуности подржано у овом прегледачу.\nprinting_not_ready=Упозорење: PDF није у потпуности учитан за штампу.\nweb_fonts_disabled=Веб фонтови су онемогућени: не могу користити уграђене PDF фонтове.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/sv-SE/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Föregående sida\nprevious_label=Föregående\nnext.title=Nästa sida\nnext_label=Nästa\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Sida\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=av {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} av {{pagesCount}})\n\nzoom_out.title=Zooma ut\nzoom_out_label=Zooma ut\nzoom_in.title=Zooma in\nzoom_in_label=Zooma in\nzoom.title=Zoom\npresentation_mode.title=Byt till presentationsläge\npresentation_mode_label=Presentationsläge\nopen_file.title=Öppna fil\nopen_file_label=Öppna\nprint.title=Skriv ut\nprint_label=Skriv ut\ndownload.title=Hämta\ndownload_label=Hämta\nbookmark.title=Aktuell vy (kopiera eller öppna i nytt fönster)\nbookmark_label=Aktuell vy\n\n# Secondary toolbar and context menu\ntools.title=Verktyg\ntools_label=Verktyg\nfirst_page.title=Gå till första sidan\nfirst_page.label=Gå till första sidan\nfirst_page_label=Gå till första sidan\nlast_page.title=Gå till sista sidan\nlast_page.label=Gå till sista sidan\nlast_page_label=Gå till sista sidan\npage_rotate_cw.title=Rotera medurs\npage_rotate_cw.label=Rotera medurs\npage_rotate_cw_label=Rotera medurs\npage_rotate_ccw.title=Rotera moturs\npage_rotate_ccw.label=Rotera moturs\npage_rotate_ccw_label=Rotera moturs\n\ncursor_text_select_tool.title=Aktivera textmarkeringsverktyg\ncursor_text_select_tool_label=Textmarkeringsverktyg\ncursor_hand_tool.title=Aktivera handverktyg\ncursor_hand_tool_label=Handverktyg\n\nscroll_vertical.title=Använd vertikal rullning\nscroll_vertical_label=Vertikal rullning\nscroll_horizontal.title=Använd horisontell rullning\nscroll_horizontal_label=Horisontell rullning\nscroll_wrapped.title=Använd överlappande rullning\nscroll_wrapped_label=Överlappande rullning\n\nspread_none.title=Visa enkelsidor\nspread_none_label=Enkelsidor\nspread_odd.title=Visa uppslag med olika sidnummer till vänster\nspread_odd_label=Uppslag med framsida\nspread_even.title=Visa uppslag med lika sidnummer till vänster\nspread_even_label=Uppslag utan framsida\n\n# Document properties dialog box\ndocument_properties.title=Dokumentegenskaper…\ndocument_properties_label=Dokumentegenskaper…\ndocument_properties_file_name=Filnamn:\ndocument_properties_file_size=Filstorlek:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kB ({{size_b}} byte)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} byte)\ndocument_properties_title=Titel:\ndocument_properties_author=Författare:\ndocument_properties_subject=Ämne:\ndocument_properties_keywords=Nyckelord:\ndocument_properties_creation_date=Skapades:\ndocument_properties_modification_date=Ändrades:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Skapare:\ndocument_properties_producer=PDF-producent:\ndocument_properties_version=PDF-version:\ndocument_properties_page_count=Sidantal:\ndocument_properties_page_size=Pappersstorlek:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=porträtt\ndocument_properties_page_size_orientation_landscape=landskap\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Snabb webbvisning:\ndocument_properties_linearized_yes=Ja\ndocument_properties_linearized_no=Nej\ndocument_properties_close=Stäng\n\nprint_progress_message=Förbereder sidor för utskrift…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Avbryt\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Visa/dölj sidofält\ntoggle_sidebar_notification.title=Visa/dölj sidofält (dokument innehåller översikt/bilagor)\ntoggle_sidebar_notification2.title=Växla sidofält (dokumentet innehåller dokumentstruktur/bilagor/lager)\ntoggle_sidebar_label=Visa/dölj sidofält\ndocument_outline.title=Visa dokumentdisposition (dubbelklicka för att expandera/komprimera alla objekt)\ndocument_outline_label=Dokumentöversikt\nattachments.title=Visa Bilagor\nattachments_label=Bilagor\nlayers.title=Visa lager (dubbelklicka för att återställa alla lager till standardläge)\nlayers_label=Lager\nthumbs.title=Visa miniatyrer\nthumbs_label=Miniatyrer\ncurrent_outline_item.title=Hitta aktuellt dispositionsobjekt\ncurrent_outline_item_label=Aktuellt dispositionsobjekt\nfindbar.title=Sök i dokument\nfindbar_label=Sök\n\nadditional_layers=Ytterligare lager\n# LOCALIZATION NOTE (page_landmark): \"{{page}}\" will be replaced by the page number.\npage_landmark=Sida {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Sida {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatyr av sida {{page}}\n\n# Find panel button title and messages\nfind_input.title=Sök\nfind_input.placeholder=Sök i dokument…\nfind_previous.title=Hitta föregående förekomst av frasen\nfind_previous_label=Föregående\nfind_next.title=Hitta nästa förekomst av frasen\nfind_next_label=Nästa\nfind_highlight=Markera alla\nfind_match_case_label=Matcha versal/gemen\nfind_entire_word_label=Hela ord\nfind_reached_top=Nådde början av dokumentet, började från slutet\nfind_reached_bottom=Nådde slutet på dokumentet, började från början\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} av {{total}} träff\nfind_match_count[two]={{current}} av {{total}} träffar\nfind_match_count[few]={{current}} av {{total}} träffar\nfind_match_count[many]={{current}} av {{total}} träffar\nfind_match_count[other]={{current}} av {{total}} träffar\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Mer än {{limit}} träffar\nfind_match_count_limit[one]=Mer än {{limit}} träff\nfind_match_count_limit[two]=Mer än {{limit}} träffar\nfind_match_count_limit[few]=Mer än {{limit}} träffar\nfind_match_count_limit[many]=Mer än {{limit}} träffar\nfind_match_count_limit[other]=Mer än {{limit}} träffar\nfind_not_found=Frasen hittades inte\n\n# Error panel labels\nerror_more_info=Mer information\nerror_less_info=Mindre information\nerror_close=Stäng\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Meddelande: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fil: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rad: {{line}}\nrendering_error=Ett fel uppstod vid visning av sidan.\n\n# Predefined zoom values\npage_scale_width=Sidbredd\npage_scale_fit=Anpassa sida\npage_scale_auto=Automatisk zoom\npage_scale_actual=Verklig storlek\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading=Laddar…\nloading_error=Ett fel uppstod vid laddning av PDF-filen.\ninvalid_file_error=Ogiltig eller korrupt PDF-fil.\nmissing_file_error=Saknad PDF-fil.\nunexpected_response_error=Oväntat svar från servern.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}} {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}-annotering]\npassword_label=Skriv in lösenordet för att öppna PDF-filen.\npassword_invalid=Ogiltigt lösenord. Försök igen.\npassword_ok=OK\npassword_cancel=Avbryt\n\nprinting_not_supported=Varning: Utskrifter stöds inte helt av den här webbläsaren.\nprinting_not_ready=Varning: PDF:en är inte klar för utskrift.\nweb_fonts_disabled=Webbtypsnitt är inaktiverade: kan inte använda inbäddade PDF-typsnitt.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/szl/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Piyrwyjszo strōna\nprevious_label=Piyrwyjszo\nnext.title=Nastympno strōna\nnext_label=Dalij\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Strōna\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=ze {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} ze {{pagesCount}})\n\nzoom_out.title=Zmyńsz\nzoom_out_label=Zmyńsz\nzoom_in.title=Zwiynksz\nzoom_in_label=Zwiynksz\nzoom.title=Srogość\npresentation_mode.title=Przełōncz na tryb prezyntacyje\npresentation_mode_label=Tryb prezyntacyje\nopen_file.title=Ôdewrzij zbiōr\nopen_file_label=Ôdewrzij\nprint.title=Durkuj\nprint_label=Durkuj\ndownload.title=Pobier\ndownload_label=Pobier\nbookmark.title=Aktualny widok (kopiuj abo ôdewrzij w nowym ôknie)\nbookmark_label=Aktualny widok\n\n# Secondary toolbar and context menu\ntools.title=Noczynia\ntools_label=Noczynia\nfirst_page.title=Idź ku piyrszyj strōnie\nfirst_page.label=Idź ku piyrszyj strōnie\nfirst_page_label=Idź ku piyrszyj strōnie\nlast_page.title=Idź ku ôstatnij strōnie\nlast_page.label=Idź ku ôstatnij strōnie\nlast_page_label=Idź ku ôstatnij strōnie\npage_rotate_cw.title=Zwyrtnij w prawo\npage_rotate_cw.label=Zwyrtnij w prawo\npage_rotate_cw_label=Zwyrtnij w prawo\npage_rotate_ccw.title=Zwyrtnij w lewo\npage_rotate_ccw.label=Zwyrtnij w lewo\npage_rotate_ccw_label=Zwyrtnij w lewo\n\ncursor_text_select_tool.title=Załōncz noczynie ôbiyranio tekstu\ncursor_text_select_tool_label=Noczynie ôbiyranio tekstu\ncursor_hand_tool.title=Załōncz noczynie rōnczka\ncursor_hand_tool_label=Noczynie rōnczka\n\nscroll_vertical.title=Używej piōnowego przewijanio\nscroll_vertical_label=Piōnowe przewijanie\nscroll_horizontal.title=Używej poziōmego przewijanio\nscroll_horizontal_label=Poziōme przewijanie\nscroll_wrapped.title=Używej szichtowego przewijanio\nscroll_wrapped_label=Szichtowe przewijanie\n\nspread_none.title=Niy dowej strōn w widoku po dwie\nspread_none_label=Po jednyj strōnie\nspread_odd.title=Dej strōny po dwie: niyparzysto i parzysto\nspread_odd_label=Niyparzysto i parzysto\nspread_even.title=Dej strōny po dwie: parzysto i niyparzysto\nspread_even_label=Parzysto i niyparzysto\n\n# Document properties dialog box\ndocument_properties.title=Włosności dokumyntu…\ndocument_properties_label=Włosności dokumyntu…\ndocument_properties_file_name=Miano zbioru:\ndocument_properties_file_size=Srogość zbioru:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} B)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} B)\ndocument_properties_title=Tytuł:\ndocument_properties_author=Autōr:\ndocument_properties_subject=Tymat:\ndocument_properties_keywords=Kluczowe słowa:\ndocument_properties_creation_date=Data zrychtowanio:\ndocument_properties_modification_date=Data zmiany:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Zrychtowane ôd:\ndocument_properties_producer=PDF ôd:\ndocument_properties_version=Wersyjo PDF:\ndocument_properties_page_count=Wielość strōn:\ndocument_properties_page_size=Srogość strōny:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=piōnowo\ndocument_properties_page_size_orientation_landscape=poziōmo\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Gibki necowy podglōnd:\ndocument_properties_linearized_yes=Ja\ndocument_properties_linearized_no=Niy\ndocument_properties_close=Zawrzij\n\nprint_progress_message=Rychtowanie dokumyntu do durku…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Pociep\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Przełōncz posek na rancie\ntoggle_sidebar_notification.title=Przełōncz posek na rancie (dokumynt mo struktura/przidowki)\ntoggle_sidebar_notification2.title=Przełōncz posek na rancie (dokumynt mo struktura/przidowki/warstwy)\ntoggle_sidebar_label=Przełōncz posek na rancie\ndocument_outline.title=Pokoż struktura dokumyntu (tuplowane klikniyncie rozszyrzo/swijo wszyskie elymynta)\ndocument_outline_label=Struktura dokumyntu\nattachments.title=Pokoż przidowki\nattachments_label=Przidowki\nlayers.title=Pokoż warstwy (tuplowane klikniyncie resetuje wszyskie warstwy do bazowego stanu)\nlayers_label=Warstwy\nthumbs.title=Pokoż miniatury\nthumbs_label=Miniatury\nfindbar.title=Znojdź w dokumyncie\nfindbar_label=Znojdź\n\nadditional_layers=Nadbytnie warstwy\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Strōna {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Strōna {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura strōny {{page}}\n\n# Find panel button title and messages\nfind_input.title=Znojdź\nfind_input.placeholder=Znojdź w dokumyncie…\nfind_previous.title=Znojdź piyrwyjsze pokozanie sie tyj frazy\nfind_previous_label=Piyrwyjszo\nfind_next.title=Znojdź nastympne pokozanie sie tyj frazy\nfind_next_label=Dalij\nfind_highlight=Ôbznocz wszysko\nfind_match_case_label=Poznowej srogość liter\nfind_entire_word_label=Cołke słowa\nfind_reached_top=Doszło do samego wiyrchu strōny, dalij ôd spodku\nfind_reached_bottom=Doszło do samego spodku strōny, dalij ôd wiyrchu\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} ze {{total}}, co pasujōm\nfind_match_count[two]={{current}} ze {{total}}, co pasujōm\nfind_match_count[few]={{current}} ze {{total}}, co pasujōm\nfind_match_count[many]={{current}} ze {{total}}, co pasujōm\nfind_match_count[other]={{current}} ze {{total}}, co pasujōm\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(total) ]}\nfind_match_count_limit[zero]=Wiyncyj jak {{limit}}, co pasujōm\nfind_match_count_limit[one]=Wiyncyj jak {{limit}}, co pasuje\nfind_match_count_limit[two]=Wiyncyj jak {{limit}}, co pasujōm\nfind_match_count_limit[few]=Wiyncyj jak {{limit}}, co pasujōm\nfind_match_count_limit[many]=Wiyncyj jak {{limit}}, co pasujōm\nfind_match_count_limit[other]=Wiyncyj jak {{limit}}, co pasujōm\nfind_not_found=Fraza niy ma znodniynto\n\n# Error panel labels\nerror_more_info=Wiyncyj informacyji\nerror_less_info=Mynij informacyji\nerror_close=Zawrzij\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Wiadōmość: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Sztapel: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Zbiōr: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linijo: {{line}}\nrendering_error=Przi renderowaniu strōny pokozoł sie feler.\n\n# Predefined zoom values\npage_scale_width=Szyrzka strōny\npage_scale_fit=Napasowanie strōny\npage_scale_auto=Autōmatyczno srogość\npage_scale_actual=Aktualno srogość\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Przi ladowaniu PDFa pokozoł sie feler.\ninvalid_file_error=Zły abo felerny zbiōr PDF.\nmissing_file_error=Chybio zbioru PDF.\nunexpected_response_error=Niyôczekowano ôdpowiydź serwera.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotacyjo typu {{type}}]\npassword_label=Wkludź hasło, coby ôdewrzić tyn zbiōr PDF.\npassword_invalid=Hasło je złe. Sprōbuj jeszcze roz.\npassword_ok=OK\npassword_cancel=Pociep\n\nprinting_not_supported=Pozōr: Ta przeglōndarka niy cołkiym ôbsuguje durk.\nprinting_not_ready=Pozōr: Tyn PDF niy ma za tela zaladowany do durku.\nweb_fonts_disabled=Necowe fōnty sōm zastawiōne: niy idzie użyć wkludzōnych fōntōw PDF.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/ta/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=முந்தைய பக்கம்\nprevious_label=முந்தையது\nnext.title=அடுத்த பக்கம்\nnext_label=அடுத்து\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=பக்கம்\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} இல்\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages={{pagesCount}}) இல் ({{pageNumber}}\n\nzoom_out.title=சிறிதாக்கு\nzoom_out_label=சிறிதாக்கு\nzoom_in.title=பெரிதாக்கு\nzoom_in_label=பெரிதாக்கு\nzoom.title=பெரிதாக்கு\npresentation_mode.title=விளக்ககாட்சி பயன்முறைக்கு மாறு\npresentation_mode_label=விளக்ககாட்சி பயன்முறை\nopen_file.title=கோப்பினை திற\nopen_file_label=திற\nprint.title=அச்சிடு\nprint_label=அச்சிடு\ndownload.title=பதிவிறக்கு\ndownload_label=பதிவிறக்கு\nbookmark.title=தற்போதைய காட்சி (புதிய சாளரத்திற்கு நகலெடு அல்லது புதிய சாளரத்தில் திற)\nbookmark_label=தற்போதைய காட்சி\n\n# Secondary toolbar and context menu\ntools.title=கருவிகள்\ntools_label=கருவிகள்\nfirst_page.title=முதல் பக்கத்திற்கு செல்லவும்\nfirst_page.label=முதல் பக்கத்திற்கு செல்லவும்\nfirst_page_label=முதல் பக்கத்திற்கு செல்லவும்\nlast_page.title=கடைசி பக்கத்திற்கு செல்லவும்\nlast_page.label=கடைசி பக்கத்திற்கு செல்லவும்\nlast_page_label=கடைசி பக்கத்திற்கு செல்லவும்\npage_rotate_cw.title=வலஞ்சுழியாக சுழற்று\npage_rotate_cw.label=வலஞ்சுழியாக சுழற்று\npage_rotate_cw_label=வலஞ்சுழியாக சுழற்று\npage_rotate_ccw.title=இடஞ்சுழியாக சுழற்று\npage_rotate_ccw.label=இடஞ்சுழியாக சுழற்று\npage_rotate_ccw_label=இடஞ்சுழியாக சுழற்று\n\ncursor_text_select_tool.title=உரைத் தெரிவு கருவியைச் செயல்படுத்து\ncursor_text_select_tool_label=உரைத் தெரிவு கருவி\ncursor_hand_tool.title=கைக் கருவிக்ச் செயற்படுத்து\ncursor_hand_tool_label=கைக்குருவி\n\n# Document properties dialog box\ndocument_properties.title=ஆவண பண்புகள்...\ndocument_properties_label=ஆவண பண்புகள்...\ndocument_properties_file_name=கோப்பு பெயர்:\ndocument_properties_file_size=கோப்பின் அளவு:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} கிபை ({{size_b}} பைட்டுகள்)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} மெபை ({{size_b}} பைட்டுகள்)\ndocument_properties_title=தலைப்பு:\ndocument_properties_author=எழுதியவர்\ndocument_properties_subject=பொருள்:\ndocument_properties_keywords=முக்கிய வார்த்தைகள்:\ndocument_properties_creation_date=படைத்த தேதி :\ndocument_properties_modification_date=திருத்திய தேதி:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=உருவாக்குபவர்:\ndocument_properties_producer=பிடிஎஃப் தயாரிப்பாளர்:\ndocument_properties_version=PDF பதிப்பு:\ndocument_properties_page_count=பக்க எண்ணிக்கை:\ndocument_properties_page_size=பக்க அளவு:\ndocument_properties_page_size_unit_inches=இதில்\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=நிலைபதிப்பு\ndocument_properties_page_size_orientation_landscape=நிலைபரப்பு\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=கடிதம்\ndocument_properties_page_size_name_legal=சட்டபூர்வ\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\ndocument_properties_close=மூடுக\n\nprint_progress_message=அச்சிடுவதற்கான ஆவணம் தயாராகிறது...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=ரத்து\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=பக்கப் பட்டியை நிலைமாற்று\ntoggle_sidebar_notification.title=பக்கப்பட்டையை நிலைமாற்று (வெளிக்கோடு/இணைப்புகளை ஆவணம் கொண்டுள்ளது)\ntoggle_sidebar_label=பக்கப் பட்டியை நிலைமாற்று\ndocument_outline.title=ஆவண அடக்கத்தைக் காட்டு (இருமுறைச் சொடுக்கி அனைத்து உறுப்பிடிகளையும் விரி/சேர்)\ndocument_outline_label=ஆவண வெளிவரை\nattachments.title=இணைப்புகளை காண்பி\nattachments_label=இணைப்புகள்\nthumbs.title=சிறுபடங்களைக் காண்பி\nthumbs_label=சிறுபடங்கள்\nfindbar.title=ஆவணத்தில் கண்டறி\nfindbar_label=தேடு\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=பக்கம் {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=பக்கத்தின் சிறுபடம் {{page}}\n\n# Find panel button title and messages\nfind_input.title=கண்டுபிடி\nfind_input.placeholder=ஆவணத்தில் கண்டறி…\nfind_previous.title=இந்த சொற்றொடரின் முந்தைய நிகழ்வை தேடு\nfind_previous_label=முந்தையது\nfind_next.title=இந்த சொற்றொடரின் அடுத்த நிகழ்வை தேடு\nfind_next_label=அடுத்து\nfind_highlight=அனைத்தையும் தனிப்படுத்து\nfind_match_case_label=பேரெழுத்தாக்கத்தை உணர்\nfind_reached_top=ஆவணத்தின் மேல் பகுதியை அடைந்தது, அடிப்பக்கத்திலிருந்து தொடர்ந்தது\nfind_reached_bottom=ஆவணத்தின் முடிவை அடைந்தது, மேலிருந்து தொடர்ந்தது\nfind_not_found=சொற்றொடர் காணவில்லை\n\n# Error panel labels\nerror_more_info=கூடுதல் தகவல்\nerror_less_info=குறைந்த தகவல்\nerror_close=மூடுக\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=செய்தி: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=ஸ்டேக்: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=கோப்பு: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=வரி: {{line}}\nrendering_error=இந்தப் பக்கத்தை காட்சிப்படுத்தும் போது ஒரு பிழை ஏற்பட்டது.\n\n# Predefined zoom values\npage_scale_width=பக்க அகலம்\npage_scale_fit=பக்கப் பொருத்தம்\npage_scale_auto=தானியக்க பெரிதாக்கல்\npage_scale_actual=உண்மையான அளவு\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=PDF ஐ ஏற்றும் போது ஒரு பிழை ஏற்பட்டது.\ninvalid_file_error=செல்லுபடியாகாத அல்லது சிதைந்த PDF கோப்பு.\nmissing_file_error=PDF கோப்பு காணவில்லை.\nunexpected_response_error=சேவகன் பதில் எதிர்பாரதது.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} விளக்கம்]\npassword_label=இந்த PDF கோப்பை திறக்க கடவுச்சொல்லை உள்ளிடவும்.\npassword_invalid=செல்லுபடியாகாத கடவுச்சொல், தயை செய்து மீண்டும் முயற்சி செய்க.\npassword_ok=சரி\npassword_cancel=ரத்து\n\nprinting_not_supported=எச்சரிக்கை: இந்த உலாவி அச்சிடுதலை முழுமையாக ஆதரிக்கவில்லை.\nprinting_not_ready=எச்சரிக்கை: PDF அச்சிட முழுவதுமாக ஏற்றப்படவில்லை.\nweb_fonts_disabled=வலை எழுத்துருக்கள் முடக்கப்பட்டுள்ளன: உட்பொதிக்கப்பட்ட PDF எழுத்துருக்களைப் பயன்படுத்த முடியவில்லை.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/te/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=మునుపటి పేజీ\nprevious_label=క్రితం\nnext.title=తరువాత పేజీ\nnext_label=తరువాత\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=పేజీ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=మొత్తం {{pagesCount}} లో\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=(మొత్తం {{pagesCount}} లో {{pageNumber}}వది)\n\nzoom_out.title=జూమ్ తగ్గించు\nzoom_out_label=జూమ్ తగ్గించు\nzoom_in.title=జూమ్ చేయి\nzoom_in_label=జూమ్ చేయి\nzoom.title=జూమ్\npresentation_mode.title=ప్రదర్శనా రీతికి మారు\npresentation_mode_label=ప్రదర్శనా రీతి\nopen_file.title=ఫైల్ తెరువు\nopen_file_label=తెరువు\nprint.title=ముద్రించు\nprint_label=ముద్రించు\ndownload.title=దింపుకోళ్ళు\ndownload_label=దింపుకోళ్ళు\nbookmark.title=ప్రస్తుత దర్శనం (కాపీ చేయి లేదా కొత్త విండోలో తెరువు)\nbookmark_label=ప్రస్తుత దర్శనం\n\n# Secondary toolbar and context menu\ntools.title=పనిముట్లు\ntools_label=పనిముట్లు\nfirst_page.title=మొదటి పేజీకి వెళ్ళు\nfirst_page.label=మొదటి పేజీకి వెళ్ళు\nfirst_page_label=మొదటి పేజీకి వెళ్ళు\nlast_page.title=చివరి పేజీకి వెళ్ళు\nlast_page.label=చివరి పేజీకి వెళ్ళు\nlast_page_label=చివరి పేజీకి వెళ్ళు\npage_rotate_cw.title=సవ్యదిశలో తిప్పు\npage_rotate_cw.label=సవ్యదిశలో తిప్పు\npage_rotate_cw_label=సవ్యదిశలో తిప్పు\npage_rotate_ccw.title=అపసవ్యదిశలో తిప్పు\npage_rotate_ccw.label=అపసవ్యదిశలో తిప్పు\npage_rotate_ccw_label=అపసవ్యదిశలో తిప్పు\n\ncursor_text_select_tool.title=టెక్స్ట్ ఎంపిక సాధనాన్ని ప్రారంభించండి\ncursor_text_select_tool_label=టెక్స్ట్ ఎంపిక సాధనం\ncursor_hand_tool.title=చేతి సాధనం చేతనించు\ncursor_hand_tool_label=చేతి సాధనం\n\nscroll_vertical_label=నిలువు స్క్రోలింగు\n\n\n# Document properties dialog box\ndocument_properties.title=పత్రము లక్షణాలు...\ndocument_properties_label=పత్రము లక్షణాలు...\ndocument_properties_file_name=దస్త్రం పేరు:\ndocument_properties_file_size=దస్త్రం పరిమాణం:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=శీర్షిక:\ndocument_properties_author=మూలకర్త:\ndocument_properties_subject=విషయం:\ndocument_properties_keywords=కీ పదాలు:\ndocument_properties_creation_date=సృష్టించిన తేదీ:\ndocument_properties_modification_date=సవరించిన తేదీ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=సృష్టికర్త:\ndocument_properties_producer=PDF ఉత్పాదకి:\ndocument_properties_version=PDF వర్షన్:\ndocument_properties_page_count=పేజీల సంఖ్య:\ndocument_properties_page_size=కాగితం పరిమాణం:\ndocument_properties_page_size_unit_inches=లో\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=నిలువుచిత్రం\ndocument_properties_page_size_orientation_landscape=అడ్డచిత్రం\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=లేఖ\ndocument_properties_page_size_name_legal=చట్టపరమైన\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized_yes=అవును\ndocument_properties_linearized_no=కాదు\ndocument_properties_close=మూసివేయి\n\nprint_progress_message=ముద్రించడానికి పత్రము సిద్ధమవుతున్నది…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=రద్దుచేయి\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=పక్కపట్టీ మార్చు\ntoggle_sidebar_label=పక్కపట్టీ మార్చు\ndocument_outline.title=పత్రము రూపము చూపించు (డబుల్ క్లిక్ చేసి అన్ని అంశాలను విస్తరించు/కూల్చు)\ndocument_outline_label=పత్రము అవుట్‌లైన్\nattachments.title=అనుబంధాలు చూపు\nattachments_label=అనుబంధాలు\nlayers_label=పొరలు\nthumbs.title=థంబ్‌నైల్స్ చూపు\nthumbs_label=థంబ్‌నైల్స్\nfindbar.title=పత్రములో కనుగొనుము\nfindbar_label=కనుగొను\n\nadditional_layers=అదనపు పొరలు\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=పేజి {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=పేజీ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} పేజీ నఖచిత్రం\n\n# Find panel button title and messages\nfind_input.title=కనుగొను\nfind_input.placeholder=పత్రములో కనుగొను…\nfind_previous.title=పదం యొక్క ముందు సంభవాన్ని కనుగొను\nfind_previous_label=మునుపటి\nfind_next.title=పదం యొక్క తర్వాతి సంభవాన్ని కనుగొను\nfind_next_label=తరువాత\nfind_highlight=అన్నిటిని ఉద్దీపనం చేయుము\nfind_match_case_label=అక్షరముల తేడాతో పోల్చు\nfind_entire_word_label=పూర్తి పదాలు\nfind_reached_top=పేజీ పైకి చేరుకున్నది, క్రింది నుండి కొనసాగించండి\nfind_reached_bottom=పేజీ చివరకు చేరుకున్నది, పైనుండి కొనసాగించండి\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_not_found=పదబంధం కనబడలేదు\n\n# Error panel labels\nerror_more_info=మరింత సమాచారం\nerror_less_info=తక్కువ సమాచారం\nerror_close=మూసివేయి\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=సందేశం: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=స్టాక్: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ఫైలు: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=వరుస: {{line}}\nrendering_error=పేజీను రెండర్ చేయుటలో ఒక దోషం ఎదురైంది.\n\n# Predefined zoom values\npage_scale_width=పేజీ వెడల్పు\npage_scale_fit=పేజీ అమర్పు\npage_scale_auto=స్వయంచాలక జూమ్\npage_scale_actual=యథార్ధ పరిమాణం\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=PDF లోడవుచున్నప్పుడు ఒక దోషం ఎదురైంది.\ninvalid_file_error=చెల్లని లేదా పాడైన PDF ఫైలు.\nmissing_file_error=దొరకని PDF ఫైలు.\nunexpected_response_error=అనుకోని సర్వర్ స్పందన.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} టీకా]\npassword_label=ఈ PDF ఫైల్ తెరుచుటకు సంకేతపదం ప్రవేశపెట్టుము.\npassword_invalid=సంకేతపదం చెల్లదు. దయచేసి మళ్ళీ ప్రయత్నించండి.\npassword_ok=సరే\npassword_cancel=రద్దుచేయి\n\nprinting_not_supported=హెచ్చరిక: ఈ విహారిణి చేత ముద్రణ పూర్తిగా తోడ్పాటు లేదు.\nprinting_not_ready=హెచ్చరిక: ముద్రణ కొరకు ఈ PDF పూర్తిగా లోడవలేదు.\nweb_fonts_disabled=వెబ్ ఫాంట్లు అచేతనించబడెను: ఎంబెడెడ్ PDF ఫాంట్లు ఉపయోగించలేక పోయింది.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/th/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=หน้าก่อนหน้า\nprevious_label=ก่อนหน้า\nnext.title=หน้าถัดไป\nnext_label=ถัดไป\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=หน้า\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=จาก {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} จาก {{pagesCount}})\n\nzoom_out.title=ซูมออก\nzoom_out_label=ซูมออก\nzoom_in.title=ซูมเข้า\nzoom_in_label=ซูมเข้า\nzoom.title=ซูม\npresentation_mode.title=สลับเป็นโหมดการนำเสนอ\npresentation_mode_label=โหมดการนำเสนอ\nopen_file.title=เปิดไฟล์\nopen_file_label=เปิด\nprint.title=พิมพ์\nprint_label=พิมพ์\ndownload.title=ดาวน์โหลด\ndownload_label=ดาวน์โหลด\nbookmark.title=มุมมองปัจจุบัน (คัดลอกหรือเปิดในหน้าต่างใหม่)\nbookmark_label=มุมมองปัจจุบัน\n\n# Secondary toolbar and context menu\ntools.title=เครื่องมือ\ntools_label=เครื่องมือ\nfirst_page.title=ไปยังหน้าแรก\nfirst_page.label=ไปยังหน้าแรก\nfirst_page_label=ไปยังหน้าแรก\nlast_page.title=ไปยังหน้าสุดท้าย\nlast_page.label=ไปยังหน้าสุดท้าย\nlast_page_label=ไปยังหน้าสุดท้าย\npage_rotate_cw.title=หมุนตามเข็มนาฬิกา\npage_rotate_cw.label=หมุนตามเข็มนาฬิกา\npage_rotate_cw_label=หมุนตามเข็มนาฬิกา\npage_rotate_ccw.title=หมุนทวนเข็มนาฬิกา\npage_rotate_ccw.label=หมุนทวนเข็มนาฬิกา\npage_rotate_ccw_label=หมุนทวนเข็มนาฬิกา\n\ncursor_text_select_tool.title=เปิดใช้งานเครื่องมือการเลือกข้อความ\ncursor_text_select_tool_label=เครื่องมือการเลือกข้อความ\ncursor_hand_tool.title=เปิดใช้งานเครื่องมือมือ\ncursor_hand_tool_label=เครื่องมือมือ\n\nscroll_vertical.title=ใช้การเลื่อนแนวตั้ง\nscroll_vertical_label=การเลื่อนแนวตั้ง\nscroll_horizontal.title=ใช้การเลื่อนแนวนอน\nscroll_horizontal_label=การเลื่อนแนวนอน\nscroll_wrapped.title=ใช้การเลื่อนแบบคลุม\nscroll_wrapped_label=เลื่อนแบบคลุม\n\nspread_none.title=ไม่ต้องรวมการกระจายหน้า\nspread_none_label=ไม่กระจาย\nspread_odd.title=รวมการกระจายหน้าเริ่มจากหน้าคี่\nspread_odd_label=กระจายอย่างเหลือเศษ\nspread_even.title=รวมการกระจายหน้าเริ่มจากหน้าคู่\nspread_even_label=กระจายอย่างเท่าเทียม\n\n# Document properties dialog box\ndocument_properties.title=คุณสมบัติเอกสาร…\ndocument_properties_label=คุณสมบัติเอกสาร…\ndocument_properties_file_name=ชื่อไฟล์:\ndocument_properties_file_size=ขนาดไฟล์:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} ไบต์)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} ไบต์)\ndocument_properties_title=ชื่อเรื่อง:\ndocument_properties_author=ผู้สร้าง:\ndocument_properties_subject=ชื่อเรื่อง:\ndocument_properties_keywords=คำสำคัญ:\ndocument_properties_creation_date=วันที่สร้าง:\ndocument_properties_modification_date=วันที่แก้ไข:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=ผู้สร้าง:\ndocument_properties_producer=ผู้ผลิต PDF:\ndocument_properties_version=รุ่น PDF:\ndocument_properties_page_count=จำนวนหน้า:\ndocument_properties_page_size=ขนาดหน้า:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=แนวตั้ง\ndocument_properties_page_size_orientation_landscape=แนวนอน\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=จดหมาย\ndocument_properties_page_size_name_legal=ข้อกฎหมาย\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=มุมมองเว็บแบบรวดเร็ว:\ndocument_properties_linearized_yes=ใช่\ndocument_properties_linearized_no=ไม่\ndocument_properties_close=ปิด\n\nprint_progress_message=กำลังเตรียมเอกสารสำหรับการพิมพ์…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=ยกเลิก\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=เปิด/ปิดแถบข้าง\ntoggle_sidebar_notification.title=เปิด/ปิดแถบข้าง (เอกสารมีเค้าร่าง/ไฟล์แนบ)\ntoggle_sidebar_notification2.title=เปิด/ปิดแถบข้าง (เอกสารมีเค้าร่าง/ไฟล์แนบ/เลเยอร์)\ntoggle_sidebar_label=เปิด/ปิดแถบข้าง\ndocument_outline.title=แสดงเค้าร่างเอกสาร (คลิกสองครั้งเพื่อขยาย/ยุบรายการทั้งหมด)\ndocument_outline_label=เค้าร่างเอกสาร\nattachments.title=แสดงไฟล์แนบ\nattachments_label=ไฟล์แนบ\nlayers.title=แสดงเลเยอร์ (คลิกสองครั้งเพื่อรีเซ็ตเลเยอร์ทั้งหมดเป็นสถานะเริ่มต้น)\nlayers_label=เลเยอร์\nthumbs.title=แสดงภาพขนาดย่อ\nthumbs_label=ภาพขนาดย่อ\ncurrent_outline_item.title=ค้นหารายการเค้าร่างปัจจุบัน\ncurrent_outline_item_label=รายการเค้าร่างปัจจุบัน\nfindbar.title=ค้นหาในเอกสาร\nfindbar_label=ค้นหา\n\nadditional_layers=เลเยอร์เพิ่มเติม\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=หน้า {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=หน้า {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=ภาพขนาดย่อของหน้า {{page}}\n\n# Find panel button title and messages\nfind_input.title=ค้นหา\nfind_input.placeholder=ค้นหาในเอกสาร…\nfind_previous.title=หาตำแหน่งก่อนหน้าของวลี\nfind_previous_label=ก่อนหน้า\nfind_next.title=หาตำแหน่งถัดไปของวลี\nfind_next_label=ถัดไป\nfind_highlight=เน้นสีทั้งหมด\nfind_match_case_label=ตัวพิมพ์ใหญ่เล็กตรงกัน\nfind_entire_word_label=ทั้งคำ\nfind_reached_top=ค้นหาถึงจุดเริ่มต้นของหน้า เริ่มค้นต่อจากด้านล่าง\nfind_reached_bottom=ค้นหาถึงจุดสิ้นสุดหน้า เริ่มค้นต่อจากด้านบน\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} จาก {{total}} ที่ตรงกัน\nfind_match_count[two]={{current}} จาก {{total}} ที่ตรงกัน\nfind_match_count[few]={{current}} จาก {{total}} ที่ตรงกัน\nfind_match_count[many]={{current}} จาก {{total}} ที่ตรงกัน\nfind_match_count[other]={{current}} จาก {{total}} ที่ตรงกัน\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=มากกว่า {{limit}} ที่ตรงกัน\nfind_match_count_limit[one]=มากกว่า {{limit}} ที่ตรงกัน\nfind_match_count_limit[two]=มากกว่า {{limit}} ที่ตรงกัน\nfind_match_count_limit[few]=มากกว่า {{limit}} ที่ตรงกัน\nfind_match_count_limit[many]=มากกว่า {{limit}} ที่ตรงกัน\nfind_match_count_limit[other]=มากกว่า {{limit}} ที่ตรงกัน\nfind_not_found=ไม่พบวลี\n\n# Error panel labels\nerror_more_info=ข้อมูลเพิ่มเติม\nerror_less_info=ข้อมูลน้อยลง\nerror_close=ปิด\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=ข้อความ: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=สแตก: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ไฟล์: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=บรรทัด: {{line}}\nrendering_error=เกิดข้อผิดพลาดขณะเรนเดอร์หน้า\n\n# Predefined zoom values\npage_scale_width=ความกว้างหน้า\npage_scale_fit=พอดีหน้า\npage_scale_auto=ซูมอัตโนมัติ\npage_scale_actual=ขนาดจริง\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=เกิดข้อผิดพลาดขณะโหลด PDF\ninvalid_file_error=ไฟล์ PDF ไม่ถูกต้องหรือเสียหาย\nmissing_file_error=ไฟล์ PDF หายไป\nunexpected_response_error=การตอบสนองของเซิร์ฟเวอร์ที่ไม่คาดคิด\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[คำอธิบายประกอบ {{type}}]\npassword_label=ป้อนรหัสผ่านเพื่อเปิดไฟล์ PDF นี้\npassword_invalid=รหัสผ่านไม่ถูกต้อง โปรดลองอีกครั้ง\npassword_ok=ตกลง\npassword_cancel=ยกเลิก\n\nprinting_not_supported=คำเตือน: เบราว์เซอร์นี้ไม่ได้สนับสนุนการพิมพ์อย่างเต็มที่\nprinting_not_ready=คำเตือน: PDF ไม่ได้รับการโหลดอย่างเต็มที่สำหรับการพิมพ์\nweb_fonts_disabled=แบบอักษรเว็บถูกปิดใช้งาน: ไม่สามารถใช้แบบอักษร PDF ฝังตัว\n"
  },
  {
    "path": "lib/pdf.js/web/locale/tl/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Naunang Pahina\nprevious_label=Nakaraan\nnext.title=Sunod na Pahina\nnext_label=Sunod\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pahina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=ng {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} ng {{pagesCount}})\n\nzoom_out.title=Paliitin\nzoom_out_label=Paliitin\nzoom_in.title=Palakihin\nzoom_in_label=Palakihin\nzoom.title=Mag-zoom\npresentation_mode.title=Lumipat sa Presentation Mode\npresentation_mode_label=Presentation Mode\nopen_file.title=Magbukas ng file\nopen_file_label=Buksan\nprint.title=i-Print\nprint_label=i-Print\ndownload.title=i-Download\ndownload_label=i-Download\nbookmark.title=Kasalukuyang tingin (kopyahin o buksan sa bagong window)\nbookmark_label=Kasalukuyang tingin\n\n# Secondary toolbar and context menu\ntools.title=Mga Kagamitan\ntools_label=Mga Kagamitan\nfirst_page.title=Pumunta sa Unang Pahina\nfirst_page.label=Pumunta sa Unang Pahina\nfirst_page_label=Pumunta sa Unang Pahina\nlast_page.title=Pumunta sa Huling Pahina\nlast_page.label=Pumunta sa Huling Pahina\nlast_page_label=Pumunta sa Huling Pahina\npage_rotate_cw.title=Paikutin Pakanan\npage_rotate_cw.label=Paikutin Pakanan\npage_rotate_cw_label=Paikutin Pakanan\npage_rotate_ccw.title=Paikutin Pakaliwa\npage_rotate_ccw.label=Paikutin Pakaliwa\npage_rotate_ccw_label=Paikutin Pakaliwa\n\ncursor_text_select_tool.title=I-enable ang Text Selection Tool\ncursor_text_select_tool_label=Text Selection Tool\ncursor_hand_tool.title=I-enable ang Hand Tool\ncursor_hand_tool_label=Hand Tool\n\nscroll_vertical.title=Gumamit ng Vertical Scrolling\nscroll_vertical_label=Vertical Scrolling\nscroll_horizontal.title=Gumamit ng Horizontal Scrolling\nscroll_horizontal_label=Horizontal Scrolling\nscroll_wrapped.title=Gumamit ng Wrapped Scrolling\nscroll_wrapped_label=Wrapped Scrolling\n\nspread_none.title=Huwag pagsamahin ang mga page spread\nspread_none_label=No Spreads\nspread_odd.title=Join page spreads starting with odd-numbered pages\nspread_odd_label=Mga Odd Spread\nspread_even.title=Pagsamahin ang mga page spread na nagsisimula sa mga even-numbered na pahina\nspread_even_label=Mga Even Spread\n\n# Document properties dialog box\ndocument_properties.title=Mga Katangian ng Dokumento…\ndocument_properties_label=Mga Katangian ng Dokumento…\ndocument_properties_file_name=File name:\ndocument_properties_file_size=File size:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Pamagat:\ndocument_properties_author=May-akda:\ndocument_properties_subject=Paksa:\ndocument_properties_keywords=Mga keyword:\ndocument_properties_creation_date=Petsa ng Pagkakagawa:\ndocument_properties_modification_date=Petsa ng Pagkakabago:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Tagalikha:\ndocument_properties_producer=PDF Producer:\ndocument_properties_version=PDF Version:\ndocument_properties_page_count=Bilang ng Pahina:\ndocument_properties_page_size=Laki ng Pahina:\ndocument_properties_page_size_unit_inches=pulgada\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=patayo\ndocument_properties_page_size_orientation_landscape=pahiga\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Fast Web View:\ndocument_properties_linearized_yes=Oo\ndocument_properties_linearized_no=Hindi\ndocument_properties_close=Isara\n\nprint_progress_message=Inihahanda ang dokumento para sa pag-print…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Kanselahin\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Ipakita/Itago ang Sidebar\ntoggle_sidebar_notification.title=Ipakita/Itago ang Sidebar (nagtataglay ang dokumento ng balangkas/mga attachment)\ntoggle_sidebar_notification2.title=Ipakita/Itago ang Sidebar (nagtataglay ang dokumento ng balangkas/mga attachment/mga layer)\ntoggle_sidebar_label=Ipakita/Itago ang Sidebar\ndocument_outline.title=Ipakita ang Document Outline (mag-double-click para i-expand/collapse ang laman)\ndocument_outline_label=Balangkas ng Dokumento\nattachments.title=Ipakita ang mga Attachment\nattachments_label=Mga attachment\nlayers.title=Ipakita ang mga Layer (mag-double click para mareset ang lahat ng layer sa orihinal na estado)\nlayers_label=Mga layer\nthumbs.title=Ipakita ang mga Thumbnail\nthumbs_label=Mga thumbnail\nfindbar.title=Hanapin sa Dokumento\nfindbar_label=Hanapin\n\nadditional_layers=Mga Karagdagang Layer\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Pahina {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pahina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail ng Pahina {{page}}\n\n# Find panel button title and messages\nfind_input.title=Hanapin\nfind_input.placeholder=Hanapin sa dokumento…\nfind_previous.title=Hanapin ang nakaraang pangyayari ng parirala\nfind_previous_label=Nakaraan\nfind_next.title=Hanapin ang susunod na pangyayari ng parirala\nfind_next_label=Susunod\nfind_highlight=I-highlight lahat\nfind_match_case_label=Itugma ang case\nfind_entire_word_label=Buong salita\nfind_reached_top=Naabot na ang tuktok ng dokumento, ipinagpatuloy mula sa ilalim\nfind_reached_bottom=Naabot na ang dulo ng dokumento, ipinagpatuloy mula sa tuktok\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} ng {{total}} tugma\nfind_match_count[two]={{current}} ng {{total}} tugma\nfind_match_count[few]={{current}} ng {{total}} tugma\nfind_match_count[many]={{current}} ng {{total}} tugma\nfind_match_count[other]={{current}} ng {{total}} tugma\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Higit sa {{limit}} tugma\nfind_match_count_limit[one]=Higit sa {{limit}} tugma\nfind_match_count_limit[two]=Higit sa {{limit}} tugma\nfind_match_count_limit[few]=Higit sa {{limit}} tugma\nfind_match_count_limit[many]=Higit sa {{limit}} tugma\nfind_match_count_limit[other]=Higit sa {{limit}} tugma\nfind_not_found=Hindi natagpuan ang parirala\n\n# Error panel labels\nerror_more_info=Karagdagang Impormasyon\nerror_less_info=Mas Kaunting Impormasyon\nerror_close=Isara\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensahe: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linya: {{line}}\nrendering_error=Nagkaproblema habang nirerender ang pahina.\n\n# Predefined zoom values\npage_scale_width=Lapad ng Pahina\npage_scale_fit=Pagkasyahin ang Pahina\npage_scale_auto=Automatic Zoom\npage_scale_actual=Totoong sukat\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Nagkaproblema habang niloload ang PDF.\ninvalid_file_error=Di-wasto o sira ang PDF file.\nmissing_file_error=Nawawalang PDF file.\nunexpected_response_error=Hindi inaasahang tugon ng server.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Ipasok ang password upang buksan ang PDF file na ito.\npassword_invalid=Maling password. Subukan uli.\npassword_ok=OK\npassword_cancel=Kanselahin\n\nprinting_not_supported=Babala: Hindi pa ganap na suportado ang pag-print sa browser na ito.\nprinting_not_ready=Babala: Hindi ganap na nabuksan ang PDF para sa pag-print.\nweb_fonts_disabled=Naka-disable ang mga Web font: hindi kayang gamitin ang mga naka-embed na PDF font.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/tr/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Önceki sayfa\nprevious_label=Önceki\nnext.title=Sonraki sayfa\nnext_label=Sonraki\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Sayfa\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} / {{pagesCount}})\n\nzoom_out.title=Uzaklaştır\nzoom_out_label=Uzaklaştır\nzoom_in.title=Yaklaştır\nzoom_in_label=Yaklaştır\nzoom.title=Yakınlaştırma\npresentation_mode.title=Sunum moduna geç\npresentation_mode_label=Sunum Modu\nopen_file.title=Dosya aç\nopen_file_label=Aç\nprint.title=Yazdır\nprint_label=Yazdır\ndownload.title=İndir\ndownload_label=İndir\nbookmark.title=Geçerli görünüm (kopyala veya yeni pencerede aç)\nbookmark_label=Geçerli görünüm\n\n# Secondary toolbar and context menu\ntools.title=Araçlar\ntools_label=Araçlar\nfirst_page.title=İlk sayfaya git\nfirst_page.label=İlk sayfaya git\nfirst_page_label=İlk sayfaya git\nlast_page.title=Son sayfaya git\nlast_page.label=Son sayfaya git\nlast_page_label=Son sayfaya git\npage_rotate_cw.title=Saat yönünde döndür\npage_rotate_cw.label=Saat yönünde döndür\npage_rotate_cw_label=Saat yönünde döndür\npage_rotate_ccw.title=Saat yönünün tersine döndür\npage_rotate_ccw.label=Saat yönünün tersine döndür\npage_rotate_ccw_label=Saat yönünün tersine döndür\n\ncursor_text_select_tool.title=Metin seçme aracını etkinleştir\ncursor_text_select_tool_label=Metin seçme aracı\ncursor_hand_tool.title=El aracını etkinleştir\ncursor_hand_tool_label=El aracı\n\nscroll_vertical.title=Dikey kaydırma kullan\nscroll_vertical_label=Dikey kaydırma\nscroll_horizontal.title=Yatay kaydırma kullan\nscroll_horizontal_label=Yatay kaydırma\nscroll_wrapped.title=Yan yana kaydırmayı kullan\nscroll_wrapped_label=Yan yana kaydırma\n\nspread_none.title=Yan yana sayfaları birleştirme\nspread_none_label=Birleştirme\nspread_odd.title=Yan yana sayfaları tek numaralı sayfalardan başlayarak birleştir\nspread_odd_label=Tek numaralı\nspread_even.title=Yan yana sayfaları çift numaralı sayfalardan başlayarak birleştir\nspread_even_label=Çift numaralı\n\n# Document properties dialog box\ndocument_properties.title=Belge özellikleri…\ndocument_properties_label=Belge özellikleri…\ndocument_properties_file_name=Dosya adı:\ndocument_properties_file_size=Dosya boyutu:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bayt)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bayt)\ndocument_properties_title=Başlık:\ndocument_properties_author=Yazar:\ndocument_properties_subject=Konu:\ndocument_properties_keywords=Anahtar kelimeler:\ndocument_properties_creation_date=Oluturma tarihi:\ndocument_properties_modification_date=Değiştirme tarihi:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}} {{time}}\ndocument_properties_creator=Oluşturan:\ndocument_properties_producer=PDF üreticisi:\ndocument_properties_version=PDF sürümü:\ndocument_properties_page_count=Sayfa sayısı:\ndocument_properties_page_size=Sayfa boyutu:\ndocument_properties_page_size_unit_inches=inç\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=dikey\ndocument_properties_page_size_orientation_landscape=yatay\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Hızlı web görünümü:\ndocument_properties_linearized_yes=Evet\ndocument_properties_linearized_no=Hayır\ndocument_properties_close=Kapat\n\nprint_progress_message=Belge yazdırılmaya hazırlanıyor…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent=%{{progress}}\nprint_progress_close=İptal\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Kenar çubuğunu aç/kapat\ntoggle_sidebar_notification.title=Kenar çubuğunu aç/kapat (Belge ana hat/ekler içeriyor)\ntoggle_sidebar_notification2.title=Kenar çubuğunu aç/kapat (Belge ana hat/ekler/katmanlar içeriyor)\ntoggle_sidebar_label=Kenar çubuğunu aç/kapat\ndocument_outline.title=Belge ana hatlarını göster (Tüm öğeleri genişletmek/daraltmak için çift tıklayın)\ndocument_outline_label=Belge ana hatları\nattachments.title=Ekleri göster\nattachments_label=Ekler\nlayers.title=Katmanları göster (tüm katmanları varsayılan duruma sıfırlamak için çift tıklayın)\nlayers_label=Katmanlar\nthumbs.title=Küçük resimleri göster\nthumbs_label=Küçük resimler\ncurrent_outline_item.title=Mevcut ana hat öğesini bul\ncurrent_outline_item_label=Mevcut ana hat öğesi\nfindbar.title=Belgede bul\nfindbar_label=Bul\n\nadditional_layers=Ek katmanlar\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Sayfa {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Sayfa {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}}. sayfanın küçük hâli\n\n# Find panel button title and messages\nfind_input.title=Bul\nfind_input.placeholder=Belgede bul…\nfind_previous.title=Önceki eşleşmeyi bul\nfind_previous_label=Önceki\nfind_next.title=Sonraki eşleşmeyi bul\nfind_next_label=Sonraki\nfind_highlight=Tümünü vurgula\nfind_match_case_label=Büyük-küçük harfe duyarlı\nfind_entire_word_label=Tam sözcükler\nfind_reached_top=Belgenin başına ulaşıldı, sonundan devam edildi\nfind_reached_bottom=Belgenin sonuna ulaşıldı, başından devam edildi\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{total}} eşleşmeden {{current}}. eşleşme\nfind_match_count[two]={{total}} eşleşmeden {{current}}. eşleşme\nfind_match_count[few]={{total}} eşleşmeden {{current}}. eşleşme\nfind_match_count[many]={{total}} eşleşmeden {{current}}. eşleşme\nfind_match_count[other]={{total}} eşleşmeden {{current}}. eşleşme\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]={{limit}} eşleşmeden fazla\nfind_match_count_limit[one]={{limit}} eşleşmeden fazla\nfind_match_count_limit[two]={{limit}} eşleşmeden fazla\nfind_match_count_limit[few]={{limit}} eşleşmeden fazla\nfind_match_count_limit[many]={{limit}} eşleşmeden fazla\nfind_match_count_limit[other]={{limit}} eşleşmeden fazla\nfind_not_found=Eşleşme bulunamadı\n\n# Error panel labels\nerror_more_info=Daha fazla bilgi al\nerror_less_info=Daha az bilgi\nerror_close=Kapat\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js sürüm {{version}} (yapı: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=İleti: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Yığın: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Dosya: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Satır: {{line}}\nrendering_error=Sayfa yorumlanırken bir hata oluştu.\n\n# Predefined zoom values\npage_scale_width=Sayfa genişliği\npage_scale_fit=Sayfayı sığdır\npage_scale_auto=Otomatik yakınlaştır\npage_scale_actual=Gerçek boyut\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent=%{{scale}}\n\n# Loading indicator messages\nloading_error=PDF yüklenirken bir hata oluştu.\ninvalid_file_error=Geçersiz veya bozulmuş PDF dosyası.\nmissing_file_error=PDF dosyası eksik.\nunexpected_response_error=Beklenmeyen sunucu yanıtı.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} işareti]\npassword_label=Bu PDF dosyasını açmak için parolasını yazın.\npassword_invalid=Geçersiz parola. Lütfen yeniden deneyin.\npassword_ok=Tamam\npassword_cancel=İptal\n\nprinting_not_supported=Uyarı: Yazdırma bu tarayıcı tarafından tam olarak desteklenmemektedir.\nprinting_not_ready=Uyarı: PDF tamamen yüklenmedi ve yazdırmaya hazır değil.\nweb_fonts_disabled=Web fontları devre dışı: Gömülü PDF fontları kullanılamıyor.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/trs/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pajinâ gunâj rukùu\nprevious_label=Sa gachin\nnext.title=Pajinâ 'na' ñaan\nnext_label=Ne' ñaan\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Ñanj\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=si'iaj {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} of {{pagesCount}})\n\nzoom_out.title=Nagi'iaj li'\nzoom_out_label=Nagi'iaj li'\nzoom_in.title=Nagi'iaj niko'\nzoom_in_label=Nagi'iaj niko'\nzoom.title=dàj nìko ma'an\npresentation_mode.title=Naduno' daj ga ma\npresentation_mode_label=Daj gà ma\nopen_file.title=Na'nïn' chrû ñanj\nopen_file_label=Na'nïn\nprint.title=Nari' ña du'ua\nprint_label=Nari' ñadu'ua\ndownload.title=Nadunïnj\ndownload_label=Nadunïnj\nbookmark.title=Daj hua ma (Guxun' nej na'nïn' riña ventana nakàa)\nbookmark_label=Daj hua ma\n\n# Secondary toolbar and context menu\ntools.title=Rasun\ntools_label=Nej rasùun\nfirst_page.title=gun' riña pajina asiniin\nfirst_page.label=Gun' riña pajina asiniin\nfirst_page_label=Gun' riña pajina asiniin\nlast_page.title=Gun' riña pajina rukù ni'in\nlast_page.label=Gun' riña pajina rukù ni'inj\nlast_page_label=Gun' riña pajina rukù ni'inj\npage_rotate_cw.title=Tanikaj ne' huat\npage_rotate_cw.label=Tanikaj ne' huat\npage_rotate_cw_label=Tanikaj ne' huat\npage_rotate_ccw.title=Tanikaj ne' chînt'\npage_rotate_ccw.label=Tanikaj ne' chint\npage_rotate_ccw_label=Tanikaj ne' chint\n\ncursor_text_select_tool.title=Dugi'iaj sun' sa ganahui texto\ncursor_text_select_tool_label=Nej rasun arajsun' da' nahui' texto\ncursor_hand_tool.title=Nachrun' nej rasun\ncursor_hand_tool_label=Sa rajsun ro'o'\n\nscroll_vertical.title=Garasun' dukuán runūu\nscroll_vertical_label=Dukuán runūu\nscroll_horizontal.title=Garasun' dukuán nikin' nahui\nscroll_horizontal_label=Dukuán nikin' nahui\nscroll_wrapped.title=Garasun' sa nachree\nscroll_wrapped_label=Sa nachree\n\nspread_none.title=Si nagi'iaj nugun'un' nej pagina hua ninin\nspread_none_label=Ni'io daj hua pagina\nspread_odd.title=Nagi'iaj nugua'ant nej pajina\nspread_odd_label=Ni'io' daj hua libro gurin\nspread_even.title=Nakāj dugui' ngà nej pajinâ ayi'ì ngà da' hùi hùi\nspread_even_label=Nahuin nìko nej\n\n# Document properties dialog box\ndocument_properties.title=Nej sa nikāj ñanj…\ndocument_properties_label=Nej sa nikāj ñanj…\ndocument_properties_file_name=Si yugui archîbo:\ndocument_properties_file_size=Dàj yachìj archîbo:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Si yugui:\ndocument_properties_author=Sí girirà:\ndocument_properties_subject=Dugui':\ndocument_properties_keywords=Nej nuguan' huìi:\ndocument_properties_creation_date=Gui gurugui' man:\ndocument_properties_modification_date=Nuguan' nahuin nakà:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Guiri ro'\ndocument_properties_producer=Sa ri PDF:\ndocument_properties_version=PDF Version:\ndocument_properties_page_count=Si Guendâ Pâjina:\ndocument_properties_page_size=Dàj yachìj pâjina:\ndocument_properties_page_size_unit_inches=riña\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=nadu'ua\ndocument_properties_page_size_orientation_landscape=dàj huaj\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Da'ngà'a\ndocument_properties_page_size_name_legal=Nuguan' a'nï'ïn\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Nanèt chre ni'iajt riña Web:\ndocument_properties_linearized_yes=Ga'ue\ndocument_properties_linearized_no=Si ga'ue\ndocument_properties_close=Narán\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Duyichin'\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Nadunā barrâ nù yi'nïn\ntoggle_sidebar_label=Nadunā barrâ nù yi'nïn\nfindbar_label=Narì'\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\n\n# Find panel button title and messages\nfind_input.title=Narì'\nfind_previous_label=Sa gachîn\nfind_next_label=Ne' ñaan\nfind_highlight=Daran' sa ña'an \nfind_match_case_label=Match case\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} si'iaj {{total}} guña gè huaj\nfind_match_count[two]={{current}} si'iaj {{total}} guña gè huaj\nfind_match_count[few]={{current}} si'iaj {{total}} guña gè huaj\nfind_match_count[many]={{current}} si'iaj {{total}} guña gè huaj\nfind_match_count[other]={{current}} of {{total}} matches\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Doj ngà da' {{limit}} nej sa nari' dugui'i\nfind_match_count_limit[one]=Doj ngà da' {{limit}} sa nari' dugui'i\nfind_match_count_limit[two]=Doj ngà da' {{limit}} nej sa nari' dugui'i\nfind_match_count_limit[few]=Doj ngà da' {{limit}} nej sa nari' dugui'i\nfind_match_count_limit[many]=Doj ngà da' {{limit}} nej sa nari' dugui'i\nfind_match_count_limit[other]=Doj ngà da' {{limit}} nej sa nari' dugui'i\nfind_not_found=Nu narì'ij nugua'anj\n\n# Error panel labels\nerror_more_info=Doj nuguan' a'min rayi'î nan\nerror_less_info=Dòj nuguan' a'min rayi'î nan\nerror_close=Narán\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Naru'ui': {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Archîbo: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Lînia: {{line}}\n\n# Predefined zoom values\npage_scale_actual=Dàj yàchi akuan' nín\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\npassword_ok=Ga'ue\npassword_cancel=Duyichin'\n\n"
  },
  {
    "path": "lib/pdf.js/web/locale/uk/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Попередня сторінка\nprevious_label=Попередня\nnext.title=Наступна сторінка\nnext_label=Наступна\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Сторінка\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=із {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} із {{pagesCount}})\n\nzoom_out.title=Зменшити\nzoom_out_label=Зменшити\nzoom_in.title=Збільшити\nzoom_in_label=Збільшити\nzoom.title=Масштаб\npresentation_mode.title=Перейти в режим презентації\npresentation_mode_label=Режим презентації\nopen_file.title=Відкрити файл\nopen_file_label=Відкрити\nprint.title=Друк\nprint_label=Друк\ndownload.title=Завантажити\ndownload_label=Завантажити\nbookmark.title=Поточний вигляд (копіювати чи відкрити в новому вікні)\nbookmark_label=Поточний вигляд\n\n# Secondary toolbar and context menu\ntools.title=Інструменти\ntools_label=Інструменти\nfirst_page.title=На першу сторінку\nfirst_page.label=На першу сторінку\nfirst_page_label=На першу сторінку\nlast_page.title=На останню сторінку\nlast_page.label=На останню сторінку\nlast_page_label=На останню сторінку\npage_rotate_cw.title=Повернути за годинниковою стрілкою\npage_rotate_cw.label=Повернути за годинниковою стрілкою\npage_rotate_cw_label=Повернути за годинниковою стрілкою\npage_rotate_ccw.title=Повернути проти годинникової стрілки\npage_rotate_ccw.label=Повернути проти годинникової стрілки\npage_rotate_ccw_label=Повернути проти годинникової стрілки\n\ncursor_text_select_tool.title=Увімкнути інструмент вибору тексту\ncursor_text_select_tool_label=Інструмент вибору тексту\ncursor_hand_tool.title=Увімкнути інструмент \"Рука\"\ncursor_hand_tool_label=Інструмент \"Рука\"\n\nscroll_vertical.title=Використовувати вертикальне прокручування\nscroll_vertical_label=Вертикальне прокручування\nscroll_horizontal.title=Використовувати горизонтальне прокручування\nscroll_horizontal_label=Горизонтальне прокручування\nscroll_wrapped.title=Використовувати масштабоване прокручування\nscroll_wrapped_label=Масштабоване прокручування\n\nspread_none.title=Не використовувати розгорнуті сторінки\nspread_none_label=Без розгорнутих сторінок\nspread_odd.title=Розгорнуті сторінки починаються з непарних номерів\nspread_odd_label=Непарні сторінки зліва\nspread_even.title=Розгорнуті сторінки починаються з парних номерів\nspread_even_label=Парні сторінки зліва\n\n# Document properties dialog box\ndocument_properties.title=Властивості документа…\ndocument_properties_label=Властивості документа…\ndocument_properties_file_name=Назва файла:\ndocument_properties_file_size=Розмір файла:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} КБ ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} МБ ({{size_b}} bytes)\ndocument_properties_title=Заголовок:\ndocument_properties_author=Автор:\ndocument_properties_subject=Тема:\ndocument_properties_keywords=Ключові слова:\ndocument_properties_creation_date=Дата створення:\ndocument_properties_modification_date=Дата зміни:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Створено:\ndocument_properties_producer=Виробник PDF:\ndocument_properties_version=Версія PDF:\ndocument_properties_page_count=Кількість сторінок:\ndocument_properties_page_size=Розмір сторінки:\ndocument_properties_page_size_unit_inches=дюймів\ndocument_properties_page_size_unit_millimeters=мм\ndocument_properties_page_size_orientation_portrait=книжкова\ndocument_properties_page_size_orientation_landscape=альбомна\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Швидкий перегляд в Інтернеті:\ndocument_properties_linearized_yes=Так\ndocument_properties_linearized_no=Ні\ndocument_properties_close=Закрити\n\nprint_progress_message=Підготовка документу до друку…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Скасувати\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Бічна панель\ntoggle_sidebar_notification.title=Перемкнути бічну панель (документ має вміст/вкладення)\ntoggle_sidebar_notification2.title=Перемкнути бічну панель (документ містить ескіз/вкладення/шари)\ntoggle_sidebar_label=Перемкнути бічну панель\ndocument_outline.title=Показати схему документу (подвійний клік для розгортання/згортання елементів)\ndocument_outline_label=Схема документа\nattachments.title=Показати прикріплення\nattachments_label=Прикріплення\nlayers.title=Показати шари (двічі клацніть, щоб скинути всі шари до типового стану)\nlayers_label=Шари\nthumbs.title=Показувати ескізи\nthumbs_label=Ескізи\ncurrent_outline_item.title=Знайти поточний елемент змісту\ncurrent_outline_item_label=Поточний елемент змісту\nfindbar.title=Знайти в документі\nfindbar_label=Знайти\n\nadditional_layers=Додаткові шари\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Сторінка {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Сторінка {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Ескіз сторінки {{page}}\n\n# Find panel button title and messages\nfind_input.title=Знайти\nfind_input.placeholder=Знайти в документі…\nfind_previous.title=Знайти попереднє входження фрази\nfind_previous_label=Попереднє\nfind_next.title=Знайти наступне входження фрази\nfind_next_label=Наступне\nfind_highlight=Підсвітити все\nfind_match_case_label=З урахуванням регістру\nfind_entire_word_label=Цілі слова\nfind_reached_top=Досягнуто початку документу, продовжено з кінця\nfind_reached_bottom=Досягнуто кінця документу, продовжено з початку\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} збіг із {{total}}\nfind_match_count[two]={{current}} збіги з {{total}}\nfind_match_count[few]={{current}} збігів із {{total}}\nfind_match_count[many]={{current}} збігів із {{total}}\nfind_match_count[other]={{current}} збігів із {{total}}\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Понад {{limit}} збігів\nfind_match_count_limit[one]=Більше, ніж {{limit}} збіг\nfind_match_count_limit[two]=Більше, ніж {{limit}} збіги\nfind_match_count_limit[few]=Більше, ніж {{limit}} збігів\nfind_match_count_limit[many]=Понад {{limit}} збігів\nfind_match_count_limit[other]=Понад {{limit}} збігів\nfind_not_found=Фразу не знайдено\n\n# Error panel labels\nerror_more_info=Більше інформації\nerror_less_info=Менше інформації\nerror_close=Закрити\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Повідомлення: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стек: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Файл: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Рядок: {{line}}\nrendering_error=Під час виведення сторінки сталася помилка.\n\n# Predefined zoom values\npage_scale_width=За шириною\npage_scale_fit=Вмістити\npage_scale_auto=Автомасштаб\npage_scale_actual=Дійсний розмір\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Під час завантаження PDF сталася помилка.\ninvalid_file_error=Недійсний або пошкоджений PDF-файл.\nmissing_file_error=Відсутній PDF-файл.\nunexpected_response_error=Неочікувана відповідь сервера.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}-аннотація]\npassword_label=Введіть пароль для відкриття цього PDF-файла.\npassword_invalid=Невірний пароль. Спробуйте ще.\npassword_ok=Гаразд\npassword_cancel=Скасувати\n\nprinting_not_supported=Попередження: Цей браузер не повністю підтримує друк.\nprinting_not_ready=Попередження: PDF не повністю завантажений для друку.\nweb_fonts_disabled=Веб-шрифти вимкнено: неможливо використати вбудовані у PDF шрифти.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/ur/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=پچھلا صفحہ\nprevious_label=پچھلا\nnext.title=اگلا صفحہ\nnext_label=آگے\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=صفحہ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} کا\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} کا {{pagesCount}})\n\nzoom_out.title=باہر زوم کریں\nzoom_out_label=باہر زوم کریں\nzoom_in.title=اندر زوم کریں\nzoom_in_label=اندر زوم کریں\nzoom.title=زوم\npresentation_mode.title=پیشکش موڈ میں چلے جائیں\npresentation_mode_label=پیشکش موڈ\nopen_file.title=مسل کھولیں\nopen_file_label=کھولیں\nprint.title=چھاپیں\nprint_label=چھاپیں\ndownload.title=ڈاؤن لوڈ\ndownload_label=ڈاؤن لوڈ\nbookmark.title=حالیہ نظارہ (نۓ دریچہ میں نقل کریں یا کھولیں)\nbookmark_label=حالیہ نظارہ\n\n# Secondary toolbar and context menu\ntools.title=آلات\ntools_label=آلات\nfirst_page.title=پہلے صفحہ پر جائیں\nfirst_page.label=پہلے صفحہ پر جائیں\nfirst_page_label=پہلے صفحہ پر جائیں\nlast_page.title=آخری صفحہ پر جائیں\nlast_page.label=آخری صفحہ پر جائیں\nlast_page_label=آخری صفحہ پر جائیں\npage_rotate_cw.title=گھڑی وار گھمائیں\npage_rotate_cw.label=گھڑی وار گھمائیں\npage_rotate_cw_label=گھڑی وار گھمائیں\npage_rotate_ccw.title=ضد گھڑی وار گھمائیں\npage_rotate_ccw.label=ضد گھڑی وار گھمائیں\npage_rotate_ccw_label=ضد گھڑی وار گھمائیں\n\ncursor_text_select_tool.title=متن کے انتخاب کے ٹول کو فعال بناے\ncursor_text_select_tool_label=متن کے انتخاب کا آلہ\ncursor_hand_tool.title=ہینڈ ٹول کو فعال بناییں\ncursor_hand_tool_label=ہاتھ کا آلہ\n\nscroll_vertical.title=عمودی اسکرولنگ کا استعمال کریں\nscroll_vertical_label=عمودی اسکرولنگ\nscroll_horizontal.title=افقی سکرولنگ کا استعمال کریں\nscroll_horizontal_label=افقی سکرولنگ\n\nspread_none.title=صفحہ پھیلانے میں شامل نہ ہوں\nspread_none_label=کوئی پھیلاؤ نہیں\nspread_odd_label=تاک پھیلاؤ\nspread_even_label=جفت پھیلاؤ\n\n# Document properties dialog box\ndocument_properties.title=دستاویز خواص…\ndocument_properties_label=دستاویز خواص…\\u0020\ndocument_properties_file_name=نام مسل:\ndocument_properties_file_size=مسل سائز:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=عنوان:\ndocument_properties_author=تخلیق کار:\ndocument_properties_subject=موضوع:\ndocument_properties_keywords=کلیدی الفاظ:\ndocument_properties_creation_date=تخلیق کی تاریخ:\ndocument_properties_modification_date=ترمیم کی تاریخ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}، {{time}}\ndocument_properties_creator=تخلیق کار:\ndocument_properties_producer=PDF پیدا کار:\ndocument_properties_version=PDF ورژن:\ndocument_properties_page_count=صفحہ شمار:\ndocument_properties_page_size=صفہ کی لمبائ:\ndocument_properties_page_size_unit_inches=میں\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=عمودی انداز\ndocument_properties_page_size_orientation_landscape=افقى انداز\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=خط\ndocument_properties_page_size_name_legal=قانونی\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} {{name}} {{orientation}}\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=تیز ویب دیکھیں:\ndocument_properties_linearized_yes=ہاں\ndocument_properties_linearized_no=نہیں\ndocument_properties_close=بند کریں\n\nprint_progress_message=چھاپنے کرنے کے لیے دستاویز تیار کیے جا رھے ھیں\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent=*{{progress}}%*\nprint_progress_close=منسوخ کریں\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=سلائیڈ ٹوگل کریں\ntoggle_sidebar_label=سلائیڈ ٹوگل کریں\ndocument_outline.title=دستاویز کی سرخیاں دکھایں (تمام اشیاء وسیع / غائب کرنے کے لیے ڈبل کلک کریں)\ndocument_outline_label=دستاویز آؤٹ لائن\nattachments.title=منسلکات دکھائیں\nattachments_label=منسلکات\nthumbs.title=تھمبنیل دکھائیں\nthumbs_label=مجمل\nfindbar.title=دستاویز میں ڈھونڈیں\nfindbar_label=ڈھونڈیں\n\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=صفحہ {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=صفحہ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=صفحے کا مجمل {{page}}\n\n# Find panel button title and messages\nfind_input.title=ڈھونڈیں\nfind_input.placeholder=دستاویز… میں ڈھونڈیں\nfind_previous.title=فقرے کا پچھلا وقوع ڈھونڈیں\nfind_previous_label=پچھلا\nfind_next.title=فقرے کا اگلہ وقوع ڈھونڈیں\nfind_next_label=آگے\nfind_highlight=تمام نمایاں کریں\nfind_match_case_label=حروف مشابہ کریں\nfind_entire_word_label=تمام الفاظ\nfind_reached_top=صفحہ کے شروع پر پہنچ گیا، نیچے سے جاری کیا\nfind_reached_bottom=صفحہ کے اختتام پر پہنچ گیا، اوپر سے جاری کیا\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{total}} میچ کا {{current}}\nfind_match_count[few]={{total}} میچوں میں سے {{current}}\nfind_match_count[many]={{total}} میچوں میں سے {{current}}\nfind_match_count[other]={{total}} میچوں میں سے {{current}}\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(total) ]}\nfind_match_count_limit[zero]={{limit}} سے زیادہ میچ\nfind_match_count_limit[one]={{limit}} سے زیادہ میچ\nfind_match_count_limit[two]={{limit}} سے زیادہ میچ\nfind_match_count_limit[few]={{limit}} سے زیادہ میچ\nfind_match_count_limit[many]={{limit}} سے زیادہ میچ\nfind_match_count_limit[other]={{limit}} سے زیادہ میچ\nfind_not_found=فقرا نہیں ملا\n\n# Error panel labels\nerror_more_info=مزید معلومات\nerror_less_info=کم معلومات\nerror_close=بند کریں\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=پیغام: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=سٹیک: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=مسل: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=لائن: {{line}}\nrendering_error=صفحہ بناتے ہوئے نقص آ گیا۔\n\n# Predefined zoom values\npage_scale_width=صفحہ چوڑائی\npage_scale_fit=صفحہ فٹنگ\npage_scale_auto=خودکار زوم\npage_scale_actual=اصل سائز\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=PDF لوڈ کرتے وقت نقص آ گیا۔\ninvalid_file_error=ناجائز یا خراب PDF مسل\nmissing_file_error=PDF مسل غائب ہے۔\nunexpected_response_error=غیرمتوقع پیش کار جواب\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}.{{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} نوٹ]\npassword_label=PDF مسل کھولنے کے لیے پاس ورڈ داخل کریں.\npassword_invalid=ناجائز پاس ورڈ. براےؑ کرم دوبارہ کوشش کریں.\npassword_ok=ٹھیک ہے\npassword_cancel=منسوخ کریں\n\nprinting_not_supported=تنبیہ:چھاپنا اس براؤزر پر پوری طرح معاونت شدہ نہیں ہے۔\nprinting_not_ready=تنبیہ: PDF چھپائی کے لیے پوری طرح لوڈ نہیں ہوئی۔\nweb_fonts_disabled=ویب فانٹ نا اہل ہیں: شامل PDF فانٹ استعمال کرنے میں ناکام۔\n"
  },
  {
    "path": "lib/pdf.js/web/locale/uz/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Oldingi sahifa\nprevious_label=Oldingi\nnext.title=Keyingi sahifa\nnext_label=Keyingi\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/{{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Kichiklashtirish\nzoom_out_label=Kichiklashtirish\nzoom_in.title=Kattalashtirish\nzoom_in_label=Kattalashtirish\nzoom.title=Masshtab\npresentation_mode.title=Namoyish usuliga oʻtish\npresentation_mode_label=Namoyish usuli\nopen_file.title=Faylni ochish\nopen_file_label=Ochish\nprint.title=Chop qilish\nprint_label=Chop qilish\ndownload.title=Yuklab olish\ndownload_label=Yuklab olish\nbookmark.title=Joriy koʻrinish (nusxa oling yoki yangi oynada oching)\nbookmark_label=Joriy koʻrinish\n\n# Secondary toolbar and context menu\ntools.title=Vositalar\ntools_label=Vositalar\nfirst_page.title=Birinchi sahifaga oʻtish\nfirst_page.label=Birinchi sahifaga oʻtish\nfirst_page_label=Birinchi sahifaga oʻtish\nlast_page.title=Soʻnggi sahifaga oʻtish\nlast_page.label=Soʻnggi sahifaga oʻtish\nlast_page_label=Soʻnggi sahifaga oʻtish\npage_rotate_cw.title=Soat yoʻnalishi boʻyicha burish\npage_rotate_cw.label=Soat yoʻnalishi boʻyicha burish\npage_rotate_cw_label=Soat yoʻnalishi boʻyicha burish\npage_rotate_ccw.title=Soat yoʻnalishiga qarshi burish\npage_rotate_ccw.label=Soat yoʻnalishiga qarshi burish\npage_rotate_ccw_label=Soat yoʻnalishiga qarshi burish\n\n\n# Document properties dialog box\ndocument_properties.title=Hujjat xossalari\ndocument_properties_label=Hujjat xossalari\ndocument_properties_file_name=Fayl nomi:\ndocument_properties_file_size=Fayl hajmi:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Nomi:\ndocument_properties_author=Muallifi:\ndocument_properties_subject=Mavzusi:\ndocument_properties_keywords=Kalit so‘zlar\ndocument_properties_creation_date=Yaratilgan sanasi:\ndocument_properties_modification_date=O‘zgartirilgan sanasi\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Yaratuvchi:\ndocument_properties_producer=PDF ishlab chiqaruvchi:\ndocument_properties_version=PDF versiyasi:\ndocument_properties_page_count=Sahifa soni:\ndocument_properties_close=Yopish\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Yon panelni yoqib/oʻchirib qoʻyish\ntoggle_sidebar_label=Yon panelni yoqib/oʻchirib qoʻyish\ndocument_outline_label=Hujjat tuzilishi\nattachments.title=Ilovalarni ko‘rsatish\nattachments_label=Ilovalar\nthumbs.title=Nishonchalarni koʻrsatish\nthumbs_label=Nishoncha\nfindbar.title=Hujjat ichidan topish\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}} sahifa\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} sahifa nishonchasi\n\n# Find panel button title and messages\nfind_previous.title=Soʻzlardagi oldingi hodisani topish\nfind_previous_label=Oldingi\nfind_next.title=Iboradagi keyingi hodisani topish\nfind_next_label=Keyingi\nfind_highlight=Barchasini ajratib koʻrsatish\nfind_match_case_label=Katta-kichik harflarni farqlash\nfind_reached_top=Hujjatning boshigacha yetib keldik, pastdan davom ettiriladi\nfind_reached_bottom=Hujjatning oxiriga yetib kelindi, yuqoridan davom ettirladi\nfind_not_found=Soʻzlar topilmadi\n\n# Error panel labels\nerror_more_info=Koʻproq ma`lumot\nerror_less_info=Kamroq ma`lumot\nerror_close=Yopish\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Xabar: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Toʻplam: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fayl: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Satr: {{line}}\nrendering_error=Sahifa renderlanayotganda xato yuz berdi.\n\n# Predefined zoom values\npage_scale_width=Sahifa eni\npage_scale_fit=Sahifani moslashtirish\npage_scale_auto=Avtomatik masshtab\npage_scale_actual=Haqiqiy hajmi\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=PDF yuklanayotganda xato yuz berdi.\ninvalid_file_error=Xato yoki buzuq PDF fayli.\nmissing_file_error=PDF fayl kerak.\nunexpected_response_error=Kutilmagan server javobi.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=PDF faylni ochish uchun parolni kiriting.\npassword_invalid=Parol - notoʻgʻri. Qaytadan urinib koʻring.\npassword_ok=OK\n\nprinting_not_supported=Diqqat: chop qilish bruzer tomonidan toʻliq qoʻllab-quvvatlanmaydi.\nprinting_not_ready=Diqqat: PDF fayl chop qilish uchun toʻliq yuklanmadi.\nweb_fonts_disabled=Veb shriftlar oʻchirilgan: ichki PDF shriftlardan foydalanib boʻlmmaydi.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/vi/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Trang trước\nprevious_label=Trước\nnext.title=Trang Sau\nnext_label=Tiếp\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Trang\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=trên {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} trên {{pagesCount}})\n\nzoom_out.title=Thu nhỏ\nzoom_out_label=Thu nhỏ\nzoom_in.title=Phóng to\nzoom_in_label=Phóng to\nzoom.title=Thu phóng\npresentation_mode.title=Chuyển sang chế độ trình chiếu\npresentation_mode_label=Chế độ trình chiếu\nopen_file.title=Mở tập tin\nopen_file_label=Mở tập tin\nprint.title=In\nprint_label=In\ndownload.title=Tải xuống\ndownload_label=Tải xuống\nbookmark.title=Chế độ xem hiện tại (sao chép hoặc mở trong cửa sổ mới)\nbookmark_label=Chế độ xem hiện tại\n\n# Secondary toolbar and context menu\ntools.title=Công cụ\ntools_label=Công cụ\nfirst_page.title=Về trang đầu\nfirst_page.label=Về trang đầu\nfirst_page_label=Về trang đầu\nlast_page.title=Đến trang cuối\nlast_page.label=Đến trang cuối\nlast_page_label=Đến trang cuối\npage_rotate_cw.title=Xoay theo chiều kim đồng hồ\npage_rotate_cw.label=Xoay theo chiều kim đồng hồ\npage_rotate_cw_label=Xoay theo chiều kim đồng hồ\npage_rotate_ccw.title=Xoay ngược chiều kim đồng hồ\npage_rotate_ccw.label=Xoay ngược chiều kim đồng hồ\npage_rotate_ccw_label=Xoay ngược chiều kim đồng hồ\n\ncursor_text_select_tool.title=Kích hoạt công cụ chọn vùng văn bản\ncursor_text_select_tool_label=Công cụ chọn vùng văn bản\ncursor_hand_tool.title=Kích hoạt công cụ con trỏ\ncursor_hand_tool_label=Công cụ con trỏ\n\nscroll_vertical.title=Sử dụng cuộn dọc\nscroll_vertical_label=Cuộn dọc\nscroll_horizontal.title=Sử dụng cuộn ngang\nscroll_horizontal_label=Cuộn ngang\nscroll_wrapped.title=Sử dụng cuộn ngắt dòng\nscroll_wrapped_label=Cuộn ngắt dòng\n\nspread_none.title=Không nối rộng trang\nspread_none_label=Không có phân cách\nspread_odd.title=Nối trang bài bắt đầu với các trang được đánh số lẻ\nspread_odd_label=Phân cách theo số lẻ\nspread_even.title=Nối trang bài bắt đầu với các trang được đánh số chẵn\nspread_even_label=Phân cách theo số chẵn\n\n# Document properties dialog box\ndocument_properties.title=Thuộc tính của tài liệu…\ndocument_properties_label=Thuộc tính của tài liệu…\ndocument_properties_file_name=Tên tập tin:\ndocument_properties_file_size=Kích thước:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} byte)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} byte)\ndocument_properties_title=Tiêu đề:\ndocument_properties_author=Tác giả:\ndocument_properties_subject=Chủ đề:\ndocument_properties_keywords=Từ khóa:\ndocument_properties_creation_date=Ngày tạo:\ndocument_properties_modification_date=Ngày sửa đổi:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Người tạo:\ndocument_properties_producer=Phần mềm tạo PDF:\ndocument_properties_version=Phiên bản PDF:\ndocument_properties_page_count=Tổng số trang:\ndocument_properties_page_size=Kích thước trang:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=khổ dọc\ndocument_properties_page_size_orientation_landscape=khổ ngang\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Thư\ndocument_properties_page_size_name_legal=Pháp lý\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=Xem nhanh trên web:\ndocument_properties_linearized_yes=Có\ndocument_properties_linearized_no=Không\ndocument_properties_close=Ðóng\n\nprint_progress_message=Chuẩn bị trang để in…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Hủy bỏ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Bật/Tắt thanh lề\ntoggle_sidebar_notification.title=Bật tắt thanh lề (tài liệu bao gồm bản phác thảo/tập tin đính kèm)\ntoggle_sidebar_notification2.title=Bật tắt thanh lề (tài liệu bao gồm bản phác thảo/tập tin đính kèm/lớp)\ntoggle_sidebar_label=Bật/Tắt thanh lề\ndocument_outline.title=Hiện tài liệu phác thảo (nhấp đúp vào để mở rộng/thu gọn tất cả các mục)\ndocument_outline_label=Bản phác tài liệu\nattachments.title=Hiện nội dung đính kèm\nattachments_label=Nội dung đính kèm\nlayers.title=Hiển thị các lớp (nhấp đúp để đặt lại tất cả các lớp về trạng thái mặc định)\nlayers_label=Lớp\nthumbs.title=Hiển thị ảnh thu nhỏ\nthumbs_label=Ảnh thu nhỏ\ncurrent_outline_item.title=Tìm mục phác thảo hiện tại\ncurrent_outline_item_label=Mục phác thảo hiện tại\nfindbar.title=Tìm trong tài liệu\nfindbar_label=Tìm\n\nadditional_layers=Các lớp bổ sung\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=Trang {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Trang {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Ảnh thu nhỏ của trang {{page}}\n\n# Find panel button title and messages\nfind_input.title=Tìm\nfind_input.placeholder=Tìm trong tài liệu…\nfind_previous.title=Tìm cụm từ ở phần trước\nfind_previous_label=Trước\nfind_next.title=Tìm cụm từ ở phần sau\nfind_next_label=Tiếp\nfind_highlight=Tô sáng tất cả\nfind_match_case_label=Phân biệt hoa, thường\nfind_entire_word_label=Toàn bộ từ\nfind_reached_top=Đã đến phần đầu tài liệu, quay trở lại từ cuối\nfind_reached_bottom=Đã đến phần cuối của tài liệu, quay trở lại từ đầu\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]={{current}} của {{total}} đã trùng\nfind_match_count[two]={{current}} của {{total}} đã trùng\nfind_match_count[few]={{current}} của {{total}} đã trùng\nfind_match_count[many]={{current}} của {{total}} đã trùng\nfind_match_count[other]={{current}} của {{total}} đã trùng\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=Nhiều hơn {{limit}} đã trùng\nfind_match_count_limit[one]=Nhiều hơn {{limit}} đã trùng\nfind_match_count_limit[two]=Nhiều hơn {{limit}} đã trùng\nfind_match_count_limit[few]=Nhiều hơn {{limit}} đã trùng\nfind_match_count_limit[many]=Nhiều hơn {{limit}} đã trùng\nfind_match_count_limit[other]=Nhiều hơn {{limit}} đã trùng\nfind_not_found=Không tìm thấy cụm từ này\n\n# Error panel labels\nerror_more_info=Thông tin thêm\nerror_less_info=Hiển thị ít thông tin hơn\nerror_close=Đóng\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Thông điệp: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Tập tin: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Dòng: {{line}}\nrendering_error=Lỗi khi hiển thị trang.\n\n# Predefined zoom values\npage_scale_width=Vừa chiều rộng\npage_scale_fit=Vừa chiều cao\npage_scale_auto=Tự động chọn kích thước\npage_scale_actual=Kích thước thực\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Lỗi khi tải tài liệu PDF.\ninvalid_file_error=Tập tin PDF hỏng hoặc không hợp lệ.\nmissing_file_error=Thiếu tập tin PDF.\nunexpected_response_error=Máy chủ có phản hồi lạ.\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}, {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Chú thích]\npassword_label=Nhập mật khẩu để mở tập tin PDF này.\npassword_invalid=Mật khẩu không đúng. Vui lòng thử lại.\npassword_ok=OK\npassword_cancel=Hủy bỏ\n\nprinting_not_supported=Cảnh báo: In ấn không được hỗ trợ đầy đủ ở trình duyệt này.\nprinting_not_ready=Cảnh báo: PDF chưa được tải hết để in.\nweb_fonts_disabled=Phông chữ Web bị vô hiệu hóa: không thể sử dụng các phông chữ PDF được nhúng.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/wo/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Xët wi jiitu\nprevious_label=Bi jiitu\nnext.title=Xët wi ci topp\nnext_label=Bi ci topp\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Wàññi\nzoom_out_label=Wàññi\nzoom_in.title=Yaatal\nzoom_in_label=Yaatal\nzoom.title=Yambalaŋ\npresentation_mode.title=Wañarñil ci anamu wone\npresentation_mode_label=Anamu Wone\nopen_file.title=Ubbi benn dencukaay\nopen_file_label=Ubbi\nprint.title=Móol\nprint_label=Móol\ndownload.title=Yeb yi\ndownload_label=Yeb yi\nbookmark.title=Wone bi taxaw (duppi walla ubbi palanteer bu bees)\nbookmark_label=Wone bi feeñ\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Bopp:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\nthumbs.title=Wone nataal yu ndaw yi\nthumbs_label=Nataal yu ndaw yi\nfindbar.title=Gis ci biir jukki bi\nfindbar_label=Wut\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Xët {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Wiñet bu xët {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Seet beneen kaddu bu ni mel te jiitu\nfind_previous_label=Bi jiitu\nfind_next.title=Seet beneen kaddu bu ni mel\nfind_next_label=Bi ci topp\nfind_highlight=Melaxal lépp\nfind_match_case_label=Sàmm jëmmalin wi\nfind_reached_top=Jot nañu ndorteel xët wi, kontine dale ko ci suuf\nfind_reached_bottom=Jot nañu jeexitalu xët wi, kontine ci ndorte\nfind_not_found=Gisiñu kaddu gi\n\n# Error panel labels\nerror_more_info=Xibaar yu gën bari\nerror_less_info=Xibaar yu gën bari\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Bataaxal: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Juug: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Dencukaay: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rëdd : {{line}}\nrendering_error=Am njumte bu am bi xët bi di wonewu.\n\n# Predefined zoom values\npage_scale_width=Yaatuwaay bu mët\npage_scale_fit=Xët lëmm\npage_scale_auto=Yambalaŋ ci saa si\npage_scale_actual=Dayo bi am\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error=Am na njumte ci yebum dencukaay PDF bi.\ninvalid_file_error=Dencukaay PDF bi baaxul walla mu sankar.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Karmat {{type}}]\npassword_ok=OK\npassword_cancel=Neenal\n\nprinting_not_supported=Artu: Joowkat bii nanguwul lool mool.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/xh/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Iphepha langaphambili\nprevious_label=Okwangaphambili\nnext.title=Iphepha elilandelayo\nnext_label=Okulandelayo\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Iphepha\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=kwali- {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} kwali {{pagesCount}})\n\nzoom_out.title=Bhekelisela Kudana\nzoom_out_label=Bhekelisela Kudana\nzoom_in.title=Sondeza Kufuphi\nzoom_in_label=Sondeza Kufuphi\nzoom.title=Yandisa / Nciphisa\npresentation_mode.title=Tshintshela kwimo yonikezelo\npresentation_mode_label=Imo yonikezelo\nopen_file.title=Vula Ifayile\nopen_file_label=Vula\nprint.title=Printa\nprint_label=Printa\ndownload.title=Khuphela\ndownload_label=Khuphela\nbookmark.title=Imbonakalo ekhoyo (kopa okanye vula kwifestile entsha)\nbookmark_label=Imbonakalo ekhoyo\n\n# Secondary toolbar and context menu\ntools.title=Izixhobo zemiyalelo\ntools_label=Izixhobo zemiyalelo\nfirst_page.title=Yiya kwiphepha lokuqala\nfirst_page.label=Yiya kwiphepha lokuqala\nfirst_page_label=Yiya kwiphepha lokuqala\nlast_page.title=Yiya kwiphepha lokugqibela\nlast_page.label=Yiya kwiphepha lokugqibela\nlast_page_label=Yiya kwiphepha lokugqibela\npage_rotate_cw.title=Jikelisa ngasekunene\npage_rotate_cw.label=Jikelisa ngasekunene\npage_rotate_cw_label=Jikelisa ngasekunene\npage_rotate_ccw.title=Jikelisa ngasekhohlo\npage_rotate_ccw.label=Jikelisa ngasekhohlo\npage_rotate_ccw_label=Jikelisa ngasekhohlo\n\ncursor_text_select_tool.title=Vumela iSixhobo sokuKhetha iTeksti\ncursor_text_select_tool_label=ISixhobo sokuKhetha iTeksti\ncursor_hand_tool.title=Yenza iSixhobo seSandla siSebenze\ncursor_hand_tool_label=ISixhobo seSandla\n\n# Document properties dialog box\ndocument_properties.title=Iipropati zoxwebhu…\ndocument_properties_label=Iipropati zoxwebhu…\ndocument_properties_file_name=Igama lefayile:\ndocument_properties_file_size=Isayizi yefayile:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB (iibhayiti{{size_b}})\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB (iibhayithi{{size_b}})\ndocument_properties_title=Umxholo:\ndocument_properties_author=Umbhali:\ndocument_properties_subject=Umbandela:\ndocument_properties_keywords=Amagama aphambili:\ndocument_properties_creation_date=Umhla wokwenziwa kwayo:\ndocument_properties_modification_date=Umhla wokulungiswa kwayo:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Umntu oyenzileyo:\ndocument_properties_producer=Umvelisi we-PDF:\ndocument_properties_version=Uhlelo lwe-PDF:\ndocument_properties_page_count=Inani lamaphepha:\ndocument_properties_close=Vala\n\nprint_progress_message=Ilungisa uxwebhu ukuze iprinte…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Rhoxisa\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Togola ngebha eseCaleni\ntoggle_sidebar_notification.title=ISidebar yeQhosha (uxwebhu lunolwandlalo/iziqhotyoshelwa)\ntoggle_sidebar_label=Togola ngebha eseCaleni\ndocument_outline.title=Bonisa uLwandlalo loXwebhu (cofa kabini ukuze wandise/diliza zonke izinto)\ndocument_outline_label=Isishwankathelo soxwebhu\nattachments.title=Bonisa iziqhotyoshelwa\nattachments_label=Iziqhoboshelo\nthumbs.title=Bonisa ukrobiso kumfanekiso\nthumbs_label=Ukrobiso kumfanekiso\nfindbar.title=Fumana kuXwebhu\nfindbar_label=Fumana\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Iphepha {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Ukrobiso kumfanekiso wephepha {{page}}\n\n# Find panel button title and messages\nfind_input.title=Fumana\nfind_input.placeholder=Fumana kuXwebhu…\nfind_previous.title=Fumanisa isenzeko sangaphambili sebinzana lamagama\nfind_previous_label=Okwangaphambili\nfind_next.title=Fumanisa isenzeko esilandelayo sebinzana lamagama\nfind_next_label=Okulandelayo\nfind_highlight=Qaqambisa konke\nfind_match_case_label=Tshatisa ngobukhulu bukanobumba\nfind_reached_top=Ufike ngaphezulu ephepheni, kusukwa ngezantsi\nfind_reached_bottom=Ufike ekupheleni kwephepha, kusukwa ngaphezulu\nfind_not_found=Ibinzana alifunyenwanga\n\n# Error panel labels\nerror_more_info=Inkcazelo Engakumbi\nerror_less_info=Inkcazelo Encinane\nerror_close=Vala\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=I-PDF.js v{{version}} (yakha: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Umyalezo: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Imfumba: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ifayile: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Umgca: {{line}}\nrendering_error=Imposiso yenzekile xa bekunikezelwa iphepha.\n\n# Predefined zoom values\npage_scale_width=Ububanzi bephepha\npage_scale_fit=Ukulinganiswa kwephepha\npage_scale_auto=Ukwandisa/Ukunciphisa Ngokwayo\npage_scale_actual=Ubungakanani bokwenene\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=Imposiso yenzekile xa kulayishwa i-PDF.\ninvalid_file_error=Ifayile ye-PDF engeyiyo okanye eyonakalisiweyo.\nmissing_file_error=Ifayile ye-PDF edukileyo.\nunexpected_response_error=Impendulo yeseva engalindelekanga.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Ubhalo-nqaku]\npassword_label=Faka ipasiwedi ukuze uvule le fayile yePDF.\npassword_invalid=Ipasiwedi ayisebenzi. Nceda uzame kwakhona.\npassword_ok=KULUNGILE\npassword_cancel=Rhoxisa\n\nprinting_not_supported=Isilumkiso: Ukuprinta akuxhaswa ngokupheleleyo yile bhrawuza.\nprinting_not_ready=Isilumkiso: IPDF ayihlohlwanga ngokupheleleyo ukwenzela ukuprinta.\nweb_fonts_disabled=Iifonti zewebhu ziqhwalelisiwe: ayikwazi ukusebenzisa iifonti ze-PDF ezincanyathelisiweyo.\n"
  },
  {
    "path": "lib/pdf.js/web/locale/zh-CN/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=上一页\nprevious_label=上一页\nnext.title=下一页\nnext_label=下一页\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=页面\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} / {{pagesCount}})\n\nzoom_out.title=缩小\nzoom_out_label=缩小\nzoom_in.title=放大\nzoom_in_label=放大\nzoom.title=缩放\npresentation_mode.title=切换到演示模式\npresentation_mode_label=演示模式\nopen_file.title=打开文件\nopen_file_label=打开\nprint.title=打印\nprint_label=打印\ndownload.title=下载\ndownload_label=下载\nbookmark.title=当前在看的内容（复制或在新窗口中打开）\nbookmark_label=当前在看\n\n# Secondary toolbar and context menu\ntools.title=工具\ntools_label=工具\nfirst_page.title=转到第一页\nfirst_page.label=转到第一页\nfirst_page_label=转到第一页\nlast_page.title=转到最后一页\nlast_page.label=转到最后一页\nlast_page_label=转到最后一页\npage_rotate_cw.title=顺时针旋转\npage_rotate_cw.label=顺时针旋转\npage_rotate_cw_label=顺时针旋转\npage_rotate_ccw.title=逆时针旋转\npage_rotate_ccw.label=逆时针旋转\npage_rotate_ccw_label=逆时针旋转\n\ncursor_text_select_tool.title=启用文本选择工具\ncursor_text_select_tool_label=文本选择工具\ncursor_hand_tool.title=启用手形工具\ncursor_hand_tool_label=手形工具\n\nscroll_vertical.title=使用垂直滚动\nscroll_vertical_label=垂直滚动\nscroll_horizontal.title=使用水平滚动\nscroll_horizontal_label=水平滚动\nscroll_wrapped.title=使用平铺滚动\nscroll_wrapped_label=平铺滚动\n\nspread_none.title=不加入衔接页\nspread_none_label=单页视图\nspread_odd.title=加入衔接页使奇数页作为起始页\nspread_odd_label=双页视图\nspread_even.title=加入衔接页使偶数页作为起始页\nspread_even_label=书籍视图\n\n# Document properties dialog box\ndocument_properties.title=文档属性…\ndocument_properties_label=文档属性…\ndocument_properties_file_name=文件名:\ndocument_properties_file_size=文件大小:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} 字节)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} 字节)\ndocument_properties_title=标题:\ndocument_properties_author=作者:\ndocument_properties_subject=主题:\ndocument_properties_keywords=关键词:\ndocument_properties_creation_date=创建日期:\ndocument_properties_modification_date=修改日期:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=创建者:\ndocument_properties_producer=PDF 生成器：\ndocument_properties_version=PDF 版本:\ndocument_properties_page_count=页数:\ndocument_properties_page_size=页面大小：\ndocument_properties_page_size_unit_inches=英寸\ndocument_properties_page_size_unit_millimeters=毫米\ndocument_properties_page_size_orientation_portrait=纵向\ndocument_properties_page_size_orientation_landscape=横向\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=文本\ndocument_properties_page_size_name_legal=法律\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}}（{{orientation}}）\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}}（{{name}}，{{orientation}}）\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=快速 Web 视图：\ndocument_properties_linearized_yes=是\ndocument_properties_linearized_no=否\ndocument_properties_close=关闭\n\nprint_progress_message=正在准备打印文档…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=取消\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=切换侧栏\ntoggle_sidebar_notification.title=切换侧栏（文档所含的大纲/附件）\ntoggle_sidebar_notification2.title=切换侧栏（文档所含的大纲/附件/图层）\ntoggle_sidebar_label=切换侧栏\ndocument_outline.title=显示文档大纲（双击展开/折叠所有项）\ndocument_outline_label=文档大纲\nattachments.title=显示附件\nattachments_label=附件\nlayers.title=显示图层（双击即可将所有图层重置为默认状态）\nlayers_label=图层\nthumbs.title=显示缩略图\nthumbs_label=缩略图\ncurrent_outline_item.title=查找当前大纲项目\ncurrent_outline_item_label=当前大纲项目\nfindbar.title=在文档中查找\nfindbar_label=查找\n\nadditional_layers=其他图层\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=页码 {{page}}\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=页码 {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=页面 {{page}} 的缩略图\n\n# Find panel button title and messages\nfind_input.title=查找\nfind_input.placeholder=在文档中查找…\nfind_previous.title=查找词语上一次出现的位置\nfind_previous_label=上一页\nfind_next.title=查找词语后一次出现的位置\nfind_next_label=下一页\nfind_highlight=全部高亮显示\nfind_match_case_label=区分大小写\nfind_entire_word_label=字词匹配\nfind_reached_top=到达文档开头，从末尾继续\nfind_reached_bottom=到达文档末尾，从开头继续\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]=第 {{current}} 项，共匹配 {{total}} 项\nfind_match_count[two]=第 {{current}} 项，共匹配 {{total}} 项\nfind_match_count[few]=第 {{current}} 项，共匹配 {{total}} 项\nfind_match_count[many]=第 {{current}} 项，共匹配 {{total}} 项\nfind_match_count[other]=第 {{current}} 项，共匹配 {{total}} 项\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=超过 {{limit}} 项匹配\nfind_match_count_limit[one]=超过 {{limit}} 项匹配\nfind_match_count_limit[two]=超过 {{limit}} 项匹配\nfind_match_count_limit[few]=超过 {{limit}} 项匹配\nfind_match_count_limit[many]=超过 {{limit}} 项匹配\nfind_match_count_limit[other]=超过 {{limit}} 项匹配\nfind_not_found=找不到指定词语\n\n# Error panel labels\nerror_more_info=更多信息\nerror_less_info=更少信息\nerror_close=关闭\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=信息：{{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=堆栈：{{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=文件：{{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=行号：{{line}}\nrendering_error=渲染页面时发生错误。\n\n# Predefined zoom values\npage_scale_width=适合页宽\npage_scale_fit=适合页面\npage_scale_auto=自动缩放\npage_scale_actual=实际大小\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=载入 PDF 时发生错误。\ninvalid_file_error=无效或损坏的 PDF 文件。\nmissing_file_error=缺少 PDF 文件。\nunexpected_response_error=意外的服务器响应。\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}}，{{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} 注释]\npassword_label=输入密码以打开此 PDF 文件。\npassword_invalid=密码无效。请重试。\npassword_ok=确定\npassword_cancel=取消\n\nprinting_not_supported=警告：此浏览器尚未完整支持打印功能。\nprinting_not_ready=警告：此 PDF 未完成载入，无法打印。\nweb_fonts_disabled=Web 字体已被禁用：无法使用嵌入的 PDF 字体。\n"
  },
  {
    "path": "lib/pdf.js/web/locale/zh-TW/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\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# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=上一頁\nprevious_label=上一頁\nnext.title=下一頁\nnext_label=下一頁\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=第\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=頁，共 {{pagesCount}} 頁\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=（第 {{pageNumber}} 頁，共 {{pagesCount}} 頁）\n\nzoom_out.title=縮小\nzoom_out_label=縮小\nzoom_in.title=放大\nzoom_in_label=放大\nzoom.title=縮放\npresentation_mode.title=切換至簡報模式\npresentation_mode_label=簡報模式\nopen_file.title=開啟檔案\nopen_file_label=開啟\nprint.title=列印\nprint_label=列印\ndownload.title=下載\ndownload_label=下載\nbookmark.title=目前畫面（複製或開啟於新視窗）\nbookmark_label=目前檢視\n\n# Secondary toolbar and context menu\ntools.title=工具\ntools_label=工具\nfirst_page.title=跳到第一頁\nfirst_page.label=跳到第一頁\nfirst_page_label=跳到第一頁\nlast_page.title=跳到最後一頁\nlast_page.label=跳到最後一頁\nlast_page_label=跳到最後一頁\npage_rotate_cw.title=順時針旋轉\npage_rotate_cw.label=順時針旋轉\npage_rotate_cw_label=順時針旋轉\npage_rotate_ccw.title=逆時針旋轉\npage_rotate_ccw.label=逆時針旋轉\npage_rotate_ccw_label=逆時針旋轉\n\ncursor_text_select_tool.title=開啟文字選擇工具\ncursor_text_select_tool_label=文字選擇工具\ncursor_hand_tool.title=開啟頁面移動工具\ncursor_hand_tool_label=頁面移動工具\n\nscroll_vertical.title=使用垂直捲動版面\nscroll_vertical_label=垂直捲動\nscroll_horizontal.title=使用水平捲動版面\nscroll_horizontal_label=水平捲動\nscroll_wrapped.title=使用多頁捲動版面\nscroll_wrapped_label=多頁捲動\n\nspread_none.title=不要進行跨頁顯示\nspread_none_label=不跨頁\nspread_odd.title=從奇數頁開始跨頁\nspread_odd_label=奇數跨頁\nspread_even.title=從偶數頁開始跨頁\nspread_even_label=偶數跨頁\n\n# Document properties dialog box\ndocument_properties.title=文件內容…\ndocument_properties_label=文件內容…\ndocument_properties_file_name=檔案名稱:\ndocument_properties_file_size=檔案大小:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB（{{size_b}} 位元組）\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB（{{size_b}} 位元組）\ndocument_properties_title=標題:\ndocument_properties_author=作者:\ndocument_properties_subject=主旨:\ndocument_properties_keywords=關鍵字:\ndocument_properties_creation_date=建立日期:\ndocument_properties_modification_date=修改日期:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}} {{time}}\ndocument_properties_creator=建立者:\ndocument_properties_producer=PDF 產生器:\ndocument_properties_version=PDF 版本:\ndocument_properties_page_count=頁數:\ndocument_properties_page_size=頁面大小:\ndocument_properties_page_size_unit_inches=in\ndocument_properties_page_size_unit_millimeters=mm\ndocument_properties_page_size_orientation_portrait=垂直\ndocument_properties_page_size_orientation_landscape=水平\ndocument_properties_page_size_name_a3=A3\ndocument_properties_page_size_name_a4=A4\ndocument_properties_page_size_name_letter=Letter\ndocument_properties_page_size_name_legal=Legal\n# LOCALIZATION NOTE (document_properties_page_size_dimension_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement and orientation, of the (current) page.\ndocument_properties_page_size_dimension_string={{width}} × {{height}} {{unit}}（{{orientation}}）\n# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):\n# \"{{width}}\", \"{{height}}\", {{unit}}, {{name}}, and {{orientation}} will be replaced by\n# the size, respectively their unit of measurement, name, and orientation, of the (current) page.\ndocument_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}}（{{name}}，{{orientation}}）\n# LOCALIZATION NOTE (document_properties_linearized): The linearization status of\n# the document; usually called \"Fast Web View\" in English locales of Adobe software.\ndocument_properties_linearized=快速 Web 檢視:\ndocument_properties_linearized_yes=是\ndocument_properties_linearized_no=否\ndocument_properties_close=關閉\n\nprint_progress_message=正在準備列印文件…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=取消\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=切換側邊欄\ntoggle_sidebar_notification.title=切換側邊攔（文件包含大綱或附件）\ntoggle_sidebar_notification2.title=切換側邊欄（包含大綱、附件、圖層的文件）\ntoggle_sidebar_label=切換側邊欄\ndocument_outline.title=顯示文件大綱（雙擊展開/摺疊所有項目）\ndocument_outline_label=文件大綱\nattachments.title=顯示附件\nattachments_label=附件\nlayers.title=顯示圖層（滑鼠雙擊即可將所有圖層重設為預設狀態）\nlayers_label=圖層\nthumbs.title=顯示縮圖\nthumbs_label=縮圖\ncurrent_outline_item.title=尋找目前的大綱項目\ncurrent_outline_item_label=目前的大綱項目\nfindbar.title=在文件中尋找\nfindbar_label=尋找\n\nadditional_layers=其他圖層\n# LOCALIZATION NOTE (page_canvas): \"{{page}}\" will be replaced by the page number.\npage_canvas=第 {{page}} 頁\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=第 {{page}} 頁\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=頁 {{page}} 的縮圖\n\n# Find panel button title and messages\nfind_input.title=尋找\nfind_input.placeholder=在文件中搜尋…\nfind_previous.title=尋找文字前次出現的位置\nfind_previous_label=上一個\nfind_next.title=尋找文字下次出現的位置\nfind_next_label=下一個\nfind_highlight=全部強調標示\nfind_match_case_label=區分大小寫\nfind_entire_word_label=符合整個字\nfind_reached_top=已搜尋至文件頂端，自底端繼續搜尋\nfind_reached_bottom=已搜尋至文件底端，自頂端繼續搜尋\n# LOCALIZATION NOTE (find_match_count): The supported plural forms are\n# [one|two|few|many|other], with [other] as the default value.\n# \"{{current}}\" and \"{{total}}\" will be replaced by a number representing the\n# index of the currently active find result, respectively a number representing\n# the total number of matches in the document.\nfind_match_count={[ plural(total) ]}\nfind_match_count[one]=第 {{current}} 筆，共找到 {{total}} 筆\nfind_match_count[two]=第 {{current}} 筆，共找到 {{total}} 筆\nfind_match_count[few]=第 {{current}} 筆，共找到 {{total}} 筆\nfind_match_count[many]=第 {{current}} 筆，共找到 {{total}} 筆\nfind_match_count[other]=第 {{current}} 筆，共找到 {{total}} 筆\n# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are\n# [zero|one|two|few|many|other], with [other] as the default value.\n# \"{{limit}}\" will be replaced by a numerical value.\nfind_match_count_limit={[ plural(limit) ]}\nfind_match_count_limit[zero]=找到超過 {{limit}} 筆\nfind_match_count_limit[one]=找到超過 {{limit}} 筆\nfind_match_count_limit[two]=找到超過 {{limit}} 筆\nfind_match_count_limit[few]=找到超過 {{limit}} 筆\nfind_match_count_limit[many]=找到超過 {{limit}} 筆\nfind_match_count_limit[other]=找到超過 {{limit}} 筆\nfind_not_found=找不到指定文字\n\n# Error panel labels\nerror_more_info=更多資訊\nerror_less_info=更少資訊\nerror_close=關閉\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=訊息: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=堆疊: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=檔案: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=行: {{line}}\nrendering_error=描繪頁面時發生錯誤。\n\n# Predefined zoom values\npage_scale_width=頁面寬度\npage_scale_fit=縮放至頁面大小\npage_scale_auto=自動縮放\npage_scale_actual=實際大小\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error=載入 PDF 時發生錯誤。\ninvalid_file_error=無效或毀損的 PDF 檔案。\nmissing_file_error=找不到 PDF 檔案。\nunexpected_response_error=伺服器回應未預期的內容。\n\n# LOCALIZATION NOTE (annotation_date_string): \"{{date}}\" and \"{{time}}\" will be\n# replaced by the modification date, and time, of the annotation.\nannotation_date_string={{date}} {{time}}\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} 註解]\npassword_label=請輸入用來開啟此 PDF 檔案的密碼。\npassword_invalid=密碼不正確，請再試一次。\npassword_ok=確定\npassword_cancel=取消\n\nprinting_not_supported=警告: 此瀏覽器未完整支援列印功能。\nprinting_not_ready=警告: 此 PDF 未完成下載以供列印。\nweb_fonts_disabled=已停用網路字型 (Web fonts): 無法使用 PDF 內嵌字型。\n"
  },
  {
    "path": "lib/pdf.js/web/viewer.css",
    "content": "/* Copyright 2014 Mozilla Foundation\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.textLayer {\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  overflow: hidden;\n  opacity: 0.2;\n  line-height: 1;\n}\n\n.textLayer > span {\n  color: transparent;\n  position: absolute;\n  white-space: pre;\n  cursor: text;\n  transform-origin: 0% 0%;\n}\n\n.textLayer .highlight {\n  margin: -1px;\n  padding: 1px;\n  background-color: rgba(180, 0, 170, 1);\n  border-radius: 4px;\n}\n\n.textLayer .highlight.begin {\n  border-radius: 4px 0 0 4px;\n}\n\n.textLayer .highlight.end {\n  border-radius: 0 4px 4px 0;\n}\n\n.textLayer .highlight.middle {\n  border-radius: 0;\n}\n\n.textLayer .highlight.selected {\n  background-color: rgba(0, 100, 0, 1);\n}\n\n.textLayer ::-moz-selection {\n  background: rgba(0, 0, 255, 1);\n}\n\n.textLayer ::selection {\n  background: rgba(0, 0, 255, 1);\n}\n\n.textLayer .endOfContent {\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 100%;\n  right: 0;\n  bottom: 0;\n  z-index: -1;\n  cursor: default;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n          user-select: none;\n}\n\n.textLayer .endOfContent.active {\n  top: 0;\n}\n\n\n.annotationLayer section {\n  position: absolute;\n  text-align: initial;\n}\n\n.annotationLayer .linkAnnotation > a,\n.annotationLayer .buttonWidgetAnnotation.pushButton > a {\n  position: absolute;\n  font-size: 1em;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.annotationLayer .linkAnnotation > a:hover,\n.annotationLayer .buttonWidgetAnnotation.pushButton > a:hover {\n  opacity: 0.2;\n  background: rgba(255, 255, 0, 1);\n  box-shadow: 0 2px 10px rgba(255, 255, 0, 1);\n}\n\n.annotationLayer .textAnnotation img {\n  position: absolute;\n  cursor: pointer;\n}\n\n.annotationLayer .textWidgetAnnotation input,\n.annotationLayer .textWidgetAnnotation textarea,\n.annotationLayer .choiceWidgetAnnotation select,\n.annotationLayer .buttonWidgetAnnotation.checkBox input,\n.annotationLayer .buttonWidgetAnnotation.radioButton input {\n  background-color: rgba(0, 54, 255, 0.13);\n  border: 1px solid transparent;\n  box-sizing: border-box;\n  font-size: 9px;\n  height: 100%;\n  margin: 0;\n  padding: 0 3px;\n  vertical-align: top;\n  width: 100%;\n}\n\n.annotationLayer .choiceWidgetAnnotation select option {\n  padding: 0;\n}\n\n.annotationLayer .buttonWidgetAnnotation.radioButton input {\n  border-radius: 50%;\n}\n\n.annotationLayer .textWidgetAnnotation textarea {\n  font: message-box;\n  font-size: 9px;\n  resize: none;\n}\n\n.annotationLayer .textWidgetAnnotation input[disabled],\n.annotationLayer .textWidgetAnnotation textarea[disabled],\n.annotationLayer .choiceWidgetAnnotation select[disabled],\n.annotationLayer .buttonWidgetAnnotation.checkBox input[disabled],\n.annotationLayer .buttonWidgetAnnotation.radioButton input[disabled] {\n  background: none;\n  border: 1px solid transparent;\n  cursor: not-allowed;\n}\n\n.annotationLayer .textWidgetAnnotation input:hover,\n.annotationLayer .textWidgetAnnotation textarea:hover,\n.annotationLayer .choiceWidgetAnnotation select:hover,\n.annotationLayer .buttonWidgetAnnotation.checkBox input:hover,\n.annotationLayer .buttonWidgetAnnotation.radioButton input:hover {\n  border: 1px solid rgba(0, 0, 0, 1);\n}\n\n.annotationLayer .textWidgetAnnotation input:focus,\n.annotationLayer .textWidgetAnnotation textarea:focus,\n.annotationLayer .choiceWidgetAnnotation select:focus {\n  background: none;\n  border: 1px solid transparent;\n}\n\n.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before,\n.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after,\n.annotationLayer .buttonWidgetAnnotation.radioButton input:checked:before {\n  background-color: rgba(0, 0, 0, 1);\n  content: \"\";\n  display: block;\n  position: absolute;\n}\n\n.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before,\n.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after {\n  height: 80%;\n  left: 45%;\n  width: 1px;\n}\n\n.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before {\n  transform: rotate(45deg);\n}\n\n.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after {\n  transform: rotate(-45deg);\n}\n\n.annotationLayer .buttonWidgetAnnotation.radioButton input:checked:before {\n  border-radius: 50%;\n  height: 50%;\n  left: 30%;\n  top: 20%;\n  width: 50%;\n}\n\n.annotationLayer .textWidgetAnnotation input.comb {\n  font-family: monospace;\n  padding-left: 2px;\n  padding-right: 0;\n}\n\n.annotationLayer .textWidgetAnnotation input.comb:focus {\n  /*\n   * Letter spacing is placed on the right side of each character. Hence, the\n   * letter spacing of the last character may be placed outside the visible\n   * area, causing horizontal scrolling. We avoid this by extending the width\n   * when the element has focus and revert this when it loses focus.\n   */\n  width: 115%;\n}\n\n.annotationLayer .buttonWidgetAnnotation.checkBox input,\n.annotationLayer .buttonWidgetAnnotation.radioButton input {\n  -webkit-appearance: none;\n     -moz-appearance: none;\n          appearance: none;\n  padding: 0;\n}\n\n.annotationLayer .popupWrapper {\n  position: absolute;\n  width: 20em;\n}\n\n.annotationLayer .popup {\n  position: absolute;\n  z-index: 200;\n  max-width: 20em;\n  background-color: rgba(255, 255, 153, 1);\n  box-shadow: 0 2px 5px rgba(136, 136, 136, 1);\n  border-radius: 2px;\n  padding: 6px;\n  margin-left: 5px;\n  cursor: pointer;\n  font: message-box;\n  font-size: 9px;\n  white-space: normal;\n  word-wrap: break-word;\n}\n\n.annotationLayer .popup > * {\n  font-size: 9px;\n}\n\n.annotationLayer .popup h1 {\n  display: inline-block;\n}\n\n.annotationLayer .popup span {\n  display: inline-block;\n  margin-left: 5px;\n}\n\n.annotationLayer .popup p {\n  border-top: 1px solid rgba(51, 51, 51, 1);\n  margin-top: 2px;\n  padding-top: 2px;\n}\n\n.annotationLayer .highlightAnnotation,\n.annotationLayer .underlineAnnotation,\n.annotationLayer .squigglyAnnotation,\n.annotationLayer .strikeoutAnnotation,\n.annotationLayer .freeTextAnnotation,\n.annotationLayer .lineAnnotation svg line,\n.annotationLayer .squareAnnotation svg rect,\n.annotationLayer .circleAnnotation svg ellipse,\n.annotationLayer .polylineAnnotation svg polyline,\n.annotationLayer .polygonAnnotation svg polygon,\n.annotationLayer .caretAnnotation,\n.annotationLayer .inkAnnotation svg polyline,\n.annotationLayer .stampAnnotation,\n.annotationLayer .fileAttachmentAnnotation {\n  cursor: pointer;\n}\n\n*/* Copyright 2021 Mozilla Foundation\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.xfaLayer {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 200;\n  transform-origin: 0 0;\n}\n\n.xfaLayer * {\n  color: inherit;\n  font: inherit;\n  -webkit-font-kerning: inherit;\n          font-kerning: inherit;\n  letter-spacing: inherit;\n  text-align: inherit;\n  text-decoration: inherit;\n  vertical-align: inherit;\n  box-sizing: border-box;\n}\n\n.xfaFont {\n  color: black;\n  font-weight: normal;\n  -webkit-font-kerning: none;\n          font-kerning: none;\n  font-size: 10px;\n  font-style: normal;\n  letter-spacing: 0;\n  text-decoration: none;\n  vertical-align: 0;\n}\n\n.xfaDraw {\n  z-index: 200;\n}\n\n.xfaExclgroup {\n  z-index: 300;\n}\n\n.xfaField {\n  z-index: 300;\n}\n\n.xfaSubform {\n  z-index: 100;\n}\n\n.xfaLabel {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  width: 100%;\n  height: 100%;\n}\n\n.xfaCaption {\n  flex: 1 1 auto;\n}\n\n.xfaTextfield,\n.xfaSelect {\n  width: 100%;\n  height: 100%;\n  flex: 1 1 auto;\n  border: none;\n}\n\n.xfaLabel > input[type=\"checkbox\"] {\n  /* Use this trick to make the checkbox invisible but\n       but still focusable. */\n  position: absolute;\n  left: -99999px;\n}\n\n.xfaLabel > input[type=\"checkbox\"]:focus + .xfaCheckboxMark {\n  box-shadow: 0 0 5px rgba(0, 0, 0, 0.7);\n}\n\n.xfaCheckboxMark {\n  cursor: pointer;\n  flex: 0 0 auto;\n  border-style: solid;\n  border-width: 2px;\n  border-color: #8f8f9d;\n  font-size: 10px;\n  line-height: 10px;\n  width: 10px;\n  height: 10px;\n  text-align: center;\n  vertical-align: middle;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n}\n\n.xfaCheckbox:checked + .xfaCheckboxMark::after {\n  content: attr(mark);\n}\n\n.xfaButton {\n  cursor: pointer;\n  width: 100%;\n  height: 100%;\n  border: none;\n  text-align: center;\n}\n\n.xfaButton:hover {\n  background: Highlight;\n}\n\n.xfaLrTb,\n.xfaRlTb,\n.xfaTb,\n.xfaPosition {\n  display: block;\n}\n\n.xfaPosition {\n  position: relative;\n}\n\n.xfaValignMiddle {\n  display: flex;\n  align-items: center;\n}\n\n.xfaLrTb > div {\n  display: inline;\n  float: left;\n}\n\n.xfaRlTb > div {\n  display: inline;\n  float: right;\n}\n\n.xfaTable {\n  display: flex;\n  flex-direction: column;\n}\n\n.xfaTable .xfaRow {\n  display: flex;\n  flex-direction: row;\n  flex: 1 1 auto;\n}\n\n.xfaTable .xfaRow > div {\n  flex: 1 1 auto;\n}\n\n.xfaTable .xfaRlRow {\n  display: flex;\n  flex-direction: row-reverse;\n  flex: 1;\n}\n\n.xfaTable .xfaRlRow > div {\n  flex: 1;\n}\n\n.pdfViewer .canvasWrapper {\n  overflow: hidden;\n}\n\n.pdfViewer .page {\n  direction: ltr;\n  width: 816px;\n  height: 1056px;\n  margin: 1px auto -8px;\n  position: relative;\n  overflow: visible;\n  border: 9px solid transparent;\n  background-clip: content-box;\n  -o-border-image: url(images/shadow.png) 9 9 repeat;\n     border-image: url(images/shadow.png) 9 9 repeat;\n  background-color: rgba(255, 255, 255, 1);\n}\n\n.pdfViewer.removePageBorders .page {\n  margin: 0 auto 10px;\n  border: none;\n}\n\n.pdfViewer.singlePageView {\n  display: inline-block;\n}\n\n.pdfViewer.singlePageView .page {\n  margin: 0;\n  border: none;\n}\n\n.pdfViewer.scrollHorizontal,\n.pdfViewer.scrollWrapped,\n.spread {\n  margin-left: 3.5px;\n  margin-right: 3.5px;\n  text-align: center;\n}\n\n.pdfViewer.scrollHorizontal,\n.spread {\n  white-space: nowrap;\n}\n\n.pdfViewer.removePageBorders,\n.pdfViewer.scrollHorizontal .spread,\n.pdfViewer.scrollWrapped .spread {\n  margin-left: 0;\n  margin-right: 0;\n}\n\n.spread .page,\n.pdfViewer.scrollHorizontal .page,\n.pdfViewer.scrollWrapped .page,\n.pdfViewer.scrollHorizontal .spread,\n.pdfViewer.scrollWrapped .spread {\n  display: inline-block;\n  vertical-align: middle;\n}\n\n.spread .page,\n.pdfViewer.scrollHorizontal .page,\n.pdfViewer.scrollWrapped .page {\n  margin-left: -3.5px;\n  margin-right: -3.5px;\n}\n\n.pdfViewer.removePageBorders .spread .page,\n.pdfViewer.removePageBorders.scrollHorizontal .page,\n.pdfViewer.removePageBorders.scrollWrapped .page {\n  margin-left: 5px;\n  margin-right: 5px;\n}\n\n.pdfViewer .page canvas {\n  margin: 0;\n  display: block;\n}\n\n.pdfViewer .page canvas[hidden] {\n  display: none;\n}\n\n.pdfViewer .page .loadingIcon {\n  position: absolute;\n  display: block;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  background: url(\"images/loading-icon.gif\") center no-repeat;\n}\n\n.pdfPresentationMode .pdfViewer {\n  margin-left: 0;\n  margin-right: 0;\n}\n\n.pdfPresentationMode .pdfViewer .page,\n.pdfPresentationMode .pdfViewer .spread {\n  display: block;\n}\n\n.pdfPresentationMode .pdfViewer .page,\n.pdfPresentationMode .pdfViewer.removePageBorders .page {\n  margin-left: auto;\n  margin-right: auto;\n}\n\n.pdfPresentationMode:-webkit-full-screen .pdfViewer .page {\n  margin-bottom: 100%;\n  border: 0;\n}\n\n.pdfPresentationMode:-moz-full-screen .pdfViewer .page {\n  margin-bottom: 100%;\n  border: 0;\n}\n\n.pdfPresentationMode:fullscreen .pdfViewer .page {\n  margin-bottom: 100%;\n  border: 0;\n}\n\n:root {\n  --sidebar-width: 200px;\n  --sidebar-transition-duration: 200ms;\n  --sidebar-transition-timing-function: ease;\n  --loadingBar-end-offset: 0;\n\n  --toolbar-icon-opacity: 0.7;\n  --doorhanger-icon-opacity: 0.9;\n\n  --main-color: rgba(12, 12, 13, 1);\n  --body-bg-color: rgba(237, 237, 240, 1);\n  --errorWrapper-bg-color: rgba(255, 74, 74, 1);\n  --progressBar-color: rgba(10, 132, 255, 1);\n  --progressBar-indeterminate-bg-color: rgba(221, 221, 222, 1);\n  --progressBar-indeterminate-blend-color: rgba(116, 177, 239, 1);\n  --scrollbar-color: auto;\n  --scrollbar-bg-color: auto;\n  --toolbar-icon-bg-color: rgba(0, 0, 0, 1);\n\n  --sidebar-narrow-bg-color: rgba(237, 237, 240, 0.9);\n  --sidebar-toolbar-bg-color: rgba(245, 246, 247, 1);\n  --toolbar-bg-color: rgba(249, 249, 250, 1);\n  --toolbar-border-color: rgba(204, 204, 204, 1);\n  --button-hover-color: rgba(221, 222, 223, 1);\n  --toggled-btn-bg-color: rgba(0, 0, 0, 0.3);\n  --toggled-hover-active-btn-color: rgba(0, 0, 0, 0.4);\n  --dropdown-btn-bg-color: rgba(215, 215, 219, 1);\n  --separator-color: rgba(0, 0, 0, 0.3);\n  --field-color: rgba(6, 6, 6, 1);\n  --field-bg-color: rgba(255, 255, 255, 1);\n  --field-border-color: rgba(187, 187, 188, 1);\n  --findbar-nextprevious-btn-bg-color: rgba(227, 228, 230, 1);\n  --treeitem-color: rgba(0, 0, 0, 0.8);\n  --treeitem-hover-color: rgba(0, 0, 0, 0.9);\n  --treeitem-selected-color: rgba(0, 0, 0, 0.9);\n  --treeitem-selected-bg-color: rgba(0, 0, 0, 0.25);\n  --sidebaritem-bg-color: rgba(0, 0, 0, 0.15);\n  --doorhanger-bg-color: rgba(255, 255, 255, 1);\n  --doorhanger-border-color: rgba(12, 12, 13, 0.2);\n  --doorhanger-hover-color: rgba(237, 237, 237, 1);\n  --doorhanger-separator-color: rgba(222, 222, 222, 1);\n  --overlay-button-bg-color: rgba(12, 12, 13, 0.1);\n  --overlay-button-hover-color: rgba(12, 12, 13, 0.3);\n\n  --loading-icon: url(images/loading.svg);\n  --treeitem-expanded-icon: url(images/treeitem-expanded.svg);\n  --treeitem-collapsed-icon: url(images/treeitem-collapsed.svg);\n  --toolbarButton-menuArrow-icon: url(images/toolbarButton-menuArrow.svg);\n  --toolbarButton-sidebarToggle-icon: url(images/toolbarButton-sidebarToggle.svg);\n  --toolbarButton-secondaryToolbarToggle-icon: url(images/toolbarButton-secondaryToolbarToggle.svg);\n  --toolbarButton-pageUp-icon: url(images/toolbarButton-pageUp.svg);\n  --toolbarButton-pageDown-icon: url(images/toolbarButton-pageDown.svg);\n  --toolbarButton-zoomOut-icon: url(images/toolbarButton-zoomOut.svg);\n  --toolbarButton-zoomIn-icon: url(images/toolbarButton-zoomIn.svg);\n  --toolbarButton-presentationMode-icon: url(images/toolbarButton-presentationMode.svg);\n  --toolbarButton-print-icon: url(images/toolbarButton-print.svg);\n  --toolbarButton-openFile-icon: url(images/toolbarButton-openFile.svg);\n  --toolbarButton-download-icon: url(images/toolbarButton-download.svg);\n  --toolbarButton-bookmark-icon: url(images/toolbarButton-bookmark.svg);\n  --toolbarButton-viewThumbnail-icon: url(images/toolbarButton-viewThumbnail.svg);\n  --toolbarButton-viewOutline-icon: url(images/toolbarButton-viewOutline.svg);\n  --toolbarButton-viewAttachments-icon: url(images/toolbarButton-viewAttachments.svg);\n  --toolbarButton-viewLayers-icon: url(images/toolbarButton-viewLayers.svg);\n  --toolbarButton-currentOutlineItem-icon: url(images/toolbarButton-currentOutlineItem.svg);\n  --toolbarButton-search-icon: url(images/toolbarButton-search.svg);\n  --findbarButton-previous-icon: url(images/findbarButton-previous.svg);\n  --findbarButton-next-icon: url(images/findbarButton-next.svg);\n  --secondaryToolbarButton-firstPage-icon: url(images/secondaryToolbarButton-firstPage.svg);\n  --secondaryToolbarButton-lastPage-icon: url(images/secondaryToolbarButton-lastPage.svg);\n  --secondaryToolbarButton-rotateCcw-icon: url(images/secondaryToolbarButton-rotateCcw.svg);\n  --secondaryToolbarButton-rotateCw-icon: url(images/secondaryToolbarButton-rotateCw.svg);\n  --secondaryToolbarButton-selectTool-icon: url(images/secondaryToolbarButton-selectTool.svg);\n  --secondaryToolbarButton-handTool-icon: url(images/secondaryToolbarButton-handTool.svg);\n  --secondaryToolbarButton-scrollVertical-icon: url(images/secondaryToolbarButton-scrollVertical.svg);\n  --secondaryToolbarButton-scrollHorizontal-icon: url(images/secondaryToolbarButton-scrollHorizontal.svg);\n  --secondaryToolbarButton-scrollWrapped-icon: url(images/secondaryToolbarButton-scrollWrapped.svg);\n  --secondaryToolbarButton-spreadNone-icon: url(images/secondaryToolbarButton-spreadNone.svg);\n  --secondaryToolbarButton-spreadOdd-icon: url(images/secondaryToolbarButton-spreadOdd.svg);\n  --secondaryToolbarButton-spreadEven-icon: url(images/secondaryToolbarButton-spreadEven.svg);\n  --secondaryToolbarButton-documentProperties-icon: url(images/secondaryToolbarButton-documentProperties.svg);\n}\n\n@media (prefers-color-scheme: dark) {\n  :root {\n    --main-color: rgba(249, 249, 250, 1);\n    --body-bg-color: rgba(42, 42, 46, 1);\n    --errorWrapper-bg-color: rgba(199, 17, 17, 1);\n    --progressBar-color: rgba(0, 96, 223, 1);\n    --progressBar-indeterminate-bg-color: rgba(40, 40, 43, 1);\n    --progressBar-indeterminate-blend-color: rgba(20, 68, 133, 1);\n    --scrollbar-color: rgba(121, 121, 123, 1);\n    --scrollbar-bg-color: rgba(35, 35, 39, 1);\n    --toolbar-icon-bg-color: rgba(255, 255, 255, 1);\n\n    --sidebar-narrow-bg-color: rgba(42, 42, 46, 0.9);\n    --sidebar-toolbar-bg-color: rgba(50, 50, 52, 1);\n    --toolbar-bg-color: rgba(56, 56, 61, 1);\n    --toolbar-border-color: rgba(12, 12, 13, 1);\n    --button-hover-color: rgba(102, 102, 103, 1);\n    --toggled-btn-bg-color: rgba(0, 0, 0, 0.3);\n    --toggled-hover-active-btn-color: rgba(0, 0, 0, 0.4);\n    --dropdown-btn-bg-color: rgba(74, 74, 79, 1);\n    --separator-color: rgba(0, 0, 0, 0.3);\n    --field-color: rgba(250, 250, 250, 1);\n    --field-bg-color: rgba(64, 64, 68, 1);\n    --field-border-color: rgba(115, 115, 115, 1);\n    --findbar-nextprevious-btn-bg-color: rgba(89, 89, 89, 1);\n    --treeitem-color: rgba(255, 255, 255, 0.8);\n    --treeitem-hover-color: rgba(255, 255, 255, 0.9);\n    --treeitem-selected-color: rgba(255, 255, 255, 0.9);\n    --treeitem-selected-bg-color: rgba(255, 255, 255, 0.25);\n    --sidebaritem-bg-color: rgba(255, 255, 255, 0.15);\n    --doorhanger-bg-color: rgba(74, 74, 79, 1);\n    --doorhanger-border-color: rgba(39, 39, 43, 1);\n    --doorhanger-hover-color: rgba(93, 94, 98, 1);\n    --doorhanger-separator-color: rgba(92, 92, 97, 1);\n    --overlay-button-bg-color: rgba(92, 92, 97, 1);\n    --overlay-button-hover-color: rgba(115, 115, 115, 1);\n\n    /* This image is used in <input> elements, which unfortunately means that\n     * the `mask-image` approach used with all of the other images doesn't work\n     * here; hence why we still have two versions of this particular image. */\n    --loading-icon: url(images/loading-dark.svg);\n  }\n}\n\n* {\n  padding: 0;\n  margin: 0;\n}\n\nhtml {\n  height: 100%;\n  width: 100%;\n  /* Font size is needed to make the activity bar the correct size. */\n  font-size: 10px;\n}\n\nbody {\n  height: 100%;\n  width: 100%;\n  background-color: var(--body-bg-color);\n}\n\nbody,\ninput,\nbutton,\nselect {\n  font: message-box;\n  outline: none;\n  scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);\n}\n\n.hidden {\n  display: none !important;\n}\n[hidden] {\n  display: none !important;\n}\n\n.pdfViewer.enablePermissions .textLayer > span {\n  -webkit-user-select: none !important;\n     -moz-user-select: none !important;\n          user-select: none !important;\n  cursor: not-allowed;\n}\n\n#viewerContainer.pdfPresentationMode:-webkit-full-screen {\n  top: 0;\n  border-top: 2px solid rgba(0, 0, 0, 0);\n  background-color: rgba(0, 0, 0, 1);\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  cursor: none;\n  -webkit-user-select: none;\n          user-select: none;\n}\n\n#viewerContainer.pdfPresentationMode:-moz-full-screen {\n  top: 0;\n  border-top: 2px solid rgba(0, 0, 0, 0);\n  background-color: rgba(0, 0, 0, 1);\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  cursor: none;\n  -moz-user-select: none;\n       user-select: none;\n}\n\n#viewerContainer.pdfPresentationMode:fullscreen {\n  top: 0;\n  border-top: 2px solid rgba(0, 0, 0, 0);\n  background-color: rgba(0, 0, 0, 1);\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  cursor: none;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n          user-select: none;\n}\n\n.pdfPresentationMode:-webkit-full-screen a:not(.internalLink) {\n  display: none;\n}\n\n.pdfPresentationMode:-moz-full-screen a:not(.internalLink) {\n  display: none;\n}\n\n.pdfPresentationMode:fullscreen a:not(.internalLink) {\n  display: none;\n}\n\n.pdfPresentationMode:-webkit-full-screen .textLayer > span {\n  cursor: none;\n}\n\n.pdfPresentationMode:-moz-full-screen .textLayer > span {\n  cursor: none;\n}\n\n.pdfPresentationMode:fullscreen .textLayer > span {\n  cursor: none;\n}\n\n.pdfPresentationMode.pdfPresentationModeControls > *,\n.pdfPresentationMode.pdfPresentationModeControls .textLayer > span {\n  cursor: default;\n}\n\n#outerContainer {\n  width: 100%;\n  height: 100%;\n  position: relative;\n}\n\n#sidebarContainer {\n  position: absolute;\n  top: 32px;\n  bottom: 0;\n  width: var(--sidebar-width);\n  visibility: hidden;\n  z-index: 100;\n  border-top: 1px solid rgba(51, 51, 51, 1);\n  transition-duration: var(--sidebar-transition-duration);\n  transition-timing-function: var(--sidebar-transition-timing-function);\n}\nhtml[dir=\"ltr\"] #sidebarContainer {\n  transition-property: left;\n  left: calc(0px - var(--sidebar-width));\n}\nhtml[dir=\"rtl\"] #sidebarContainer {\n  transition-property: right;\n  right: calc(0px - var(--sidebar-width));\n}\n\n#outerContainer.sidebarResizing #sidebarContainer {\n  /* Improve responsiveness and avoid visual glitches when the sidebar is resized. */\n  transition-duration: 0s;\n  /* Prevent e.g. the thumbnails being selected when the sidebar is resized. */\n  -webkit-user-select: none;\n     -moz-user-select: none;\n          user-select: none;\n}\n\n#outerContainer.sidebarMoving #sidebarContainer,\n#outerContainer.sidebarOpen #sidebarContainer {\n  visibility: visible;\n}\nhtml[dir=\"ltr\"] #outerContainer.sidebarOpen #sidebarContainer {\n  left: 0;\n}\nhtml[dir=\"rtl\"] #outerContainer.sidebarOpen #sidebarContainer {\n  right: 0;\n}\n\n#mainContainer {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  min-width: 320px;\n}\n\n#sidebarContent {\n  top: 32px;\n  bottom: 0;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  position: absolute;\n  width: 100%;\n  background-color: rgba(0, 0, 0, 0.1);\n}\nhtml[dir=\"ltr\"] #sidebarContent {\n  left: 0;\n  box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.25);\n}\nhtml[dir=\"rtl\"] #sidebarContent {\n  right: 0;\n  box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.25);\n}\n\n#viewerContainer {\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  position: absolute;\n  top: 32px;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  outline: none;\n}\n#viewerContainer:not(.pdfPresentationMode) {\n  transition-duration: var(--sidebar-transition-duration);\n  transition-timing-function: var(--sidebar-transition-timing-function);\n}\n\n#outerContainer.sidebarResizing #viewerContainer {\n  /* Improve responsiveness and avoid visual glitches when the sidebar is resized. */\n  transition-duration: 0s;\n}\n\nhtml[dir=\"ltr\"]\n  #outerContainer.sidebarOpen\n  #viewerContainer:not(.pdfPresentationMode) {\n  transition-property: left;\n  left: var(--sidebar-width);\n}\nhtml[dir=\"rtl\"]\n  #outerContainer.sidebarOpen\n  #viewerContainer:not(.pdfPresentationMode) {\n  transition-property: right;\n  right: var(--sidebar-width);\n}\n\n.toolbar {\n  position: relative;\n  left: 0;\n  right: 0;\n  z-index: 9999;\n  cursor: default;\n}\n\n#toolbarContainer {\n  width: 100%;\n}\n\n#toolbarSidebar {\n  width: 100%;\n  height: 32px;\n  background-color: var(--sidebar-toolbar-bg-color);\n}\nhtml[dir=\"ltr\"] #toolbarSidebar {\n  box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.25), 0 1px 0 rgba(0, 0, 0, 0.15),\n    0 0 1px rgba(0, 0, 0, 0.1);\n}\nhtml[dir=\"rtl\"] #toolbarSidebar {\n  box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.25), 0 1px 0 rgba(0, 0, 0, 0.15),\n    0 0 1px rgba(0, 0, 0, 0.1);\n}\n\nhtml[dir=\"ltr\"] #toolbarSidebar .toolbarButton {\n  margin-right: 2px !important;\n}\nhtml[dir=\"rtl\"] #toolbarSidebar .toolbarButton {\n  margin-left: 2px !important;\n}\n\nhtml[dir=\"ltr\"] #toolbarSidebarRight .toolbarButton {\n  margin-right: 3px !important;\n}\nhtml[dir=\"rtl\"] #toolbarSidebarRight .toolbarButton {\n  margin-left: 3px !important;\n}\n\n#sidebarResizer {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  width: 6px;\n  z-index: 200;\n  cursor: ew-resize;\n}\nhtml[dir=\"ltr\"] #sidebarResizer {\n  right: -6px;\n}\nhtml[dir=\"rtl\"] #sidebarResizer {\n  left: -6px;\n}\n\n#toolbarContainer,\n.findbar,\n.secondaryToolbar {\n  position: relative;\n  height: 32px;\n  background-color: var(--toolbar-bg-color);\n  box-shadow: 0 1px 0 var(--toolbar-border-color);\n}\n\n#toolbarViewer {\n  height: 32px;\n}\n\n#loadingBar {\n  position: absolute;\n  height: 4px;\n  background-color: var(--body-bg-color);\n  border-bottom: 1px solid var(--toolbar-border-color);\n\n  transition-duration: var(--sidebar-transition-duration);\n  transition-timing-function: var(--sidebar-transition-timing-function);\n}\nhtml[dir=\"ltr\"] #loadingBar {\n  transition-property: left;\n  left: 0;\n  right: var(--loadingBar-end-offset);\n}\nhtml[dir=\"rtl\"] #loadingBar {\n  transition-property: right;\n  left: var(--loadingBar-end-offset);\n  right: 0;\n}\n\nhtml[dir=\"ltr\"] #outerContainer.sidebarOpen #loadingBar {\n  left: var(--sidebar-width);\n}\nhtml[dir=\"rtl\"] #outerContainer.sidebarOpen #loadingBar {\n  right: var(--sidebar-width);\n}\n\n#outerContainer.sidebarResizing #loadingBar {\n  /* Improve responsiveness and avoid visual glitches when the sidebar is resized. */\n  transition-duration: 0s;\n}\n\n#loadingBar .progress {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 0%;\n  height: 100%;\n  background-color: var(--progressBar-color);\n  overflow: hidden;\n  transition: width 200ms;\n}\n\n@-webkit-keyframes progressIndeterminate {\n  0% {\n    left: -142px;\n  }\n  100% {\n    left: 0;\n  }\n}\n\n@keyframes progressIndeterminate {\n  0% {\n    left: -142px;\n  }\n  100% {\n    left: 0;\n  }\n}\n\n#loadingBar .progress.indeterminate {\n  background-color: var(--progressBar-indeterminate-bg-color);\n  transition: none;\n}\n\n#loadingBar .progress.indeterminate .glimmer {\n  position: absolute;\n  top: 0;\n  left: 0;\n  height: 100%;\n  width: calc(100% + 150px);\n  background: repeating-linear-gradient(\n    135deg,\n    var(--progressBar-indeterminate-blend-color) 0,\n    var(--progressBar-indeterminate-bg-color) 5px,\n    var(--progressBar-indeterminate-bg-color) 45px,\n    var(--progressBar-color) 55px,\n    var(--progressBar-color) 95px,\n    var(--progressBar-indeterminate-blend-color) 100px\n  );\n  -webkit-animation: progressIndeterminate 1s linear infinite;\n          animation: progressIndeterminate 1s linear infinite;\n}\n\n.findbar,\n.secondaryToolbar {\n  top: 32px;\n  position: absolute;\n  z-index: 10000;\n  height: auto;\n  min-width: 16px;\n  padding: 0 4px;\n  margin: 4px 2px;\n  color: rgba(217, 217, 217, 1);\n  font-size: 12px;\n  line-height: 14px;\n  text-align: left;\n  cursor: default;\n}\n\n.findbar {\n  min-width: 300px;\n  background-color: var(--toolbar-bg-color);\n}\n.findbar > div {\n  height: 32px;\n}\n.findbar.wrapContainers > div {\n  clear: both;\n}\n.findbar.wrapContainers > div#findbarMessageContainer {\n  height: auto;\n}\nhtml[dir=\"ltr\"] .findbar {\n  left: 64px;\n}\nhtml[dir=\"rtl\"] .findbar {\n  right: 64px;\n}\n\n.findbar .splitToolbarButton {\n  margin-top: 3px;\n}\nhtml[dir=\"ltr\"] .findbar .splitToolbarButton {\n  margin-left: 0;\n  margin-right: 5px;\n}\nhtml[dir=\"rtl\"] .findbar .splitToolbarButton {\n  margin-left: 5px;\n  margin-right: 0;\n}\n\n.findbar .splitToolbarButton > .toolbarButton {\n  background-color: var(--findbar-nextprevious-btn-bg-color);\n  border-radius: 0;\n  height: 26px;\n  border-top: 1px solid var(--field-border-color);\n  border-bottom: 1px solid var(--field-border-color);\n}\n\n.findbar .splitToolbarButton > .toolbarButton::before {\n  top: 5px;\n}\n\n.findbar .splitToolbarButton > .findNext {\n  width: 29px;\n}\nhtml[dir=\"ltr\"] .findbar .splitToolbarButton > .findNext {\n  border-bottom-right-radius: 2px;\n  border-top-right-radius: 2px;\n  border-right: 1px solid var(--field-border-color);\n}\nhtml[dir=\"rtl\"] .findbar .splitToolbarButton > .findNext {\n  border-bottom-left-radius: 2px;\n  border-top-left-radius: 2px;\n  border-left: 1px solid var(--field-border-color);\n}\n\n.findbar input[type=\"checkbox\"] {\n  pointer-events: none;\n}\n\n.findbar label {\n  -webkit-user-select: none;\n     -moz-user-select: none;\n          user-select: none;\n}\n\n.findbar label:hover,\n.findbar input:focus + label {\n  background-color: var(--button-hover-color);\n}\n\nhtml[dir=\"ltr\"] #findInput {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\nhtml[dir=\"rtl\"] #findInput {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.findbar .toolbarField[type=\"checkbox\"]:checked + .toolbarLabel {\n  background-color: var(--toggled-btn-bg-color) !important;\n}\n\n#findInput {\n  width: 200px;\n}\n#findInput::-webkit-input-placeholder {\n  color: rgba(191, 191, 191, 1);\n}\n#findInput::-moz-placeholder {\n  font-style: normal;\n}\n#findInput::placeholder {\n  font-style: normal;\n}\n#findInput[data-status=\"pending\"] {\n  background-image: var(--loading-icon);\n  background-repeat: no-repeat;\n  background-position: 98%;\n}\nhtml[dir=\"rtl\"] #findInput[data-status=\"pending\"] {\n  background-position: 3px;\n}\n#findInput[data-status=\"notFound\"] {\n  background-color: rgba(255, 102, 102, 1);\n}\n\n.secondaryToolbar {\n  padding: 6px 0 10px;\n  height: auto;\n  z-index: 30000;\n  background-color: var(--doorhanger-bg-color);\n}\nhtml[dir=\"ltr\"] .secondaryToolbar {\n  right: 4px;\n}\nhtml[dir=\"rtl\"] .secondaryToolbar {\n  left: 4px;\n}\n\n#secondaryToolbarButtonContainer {\n  max-width: 220px;\n  max-height: 400px;\n  overflow-y: auto;\n  -webkit-overflow-scrolling: touch;\n  margin-bottom: -4px;\n}\n\n#secondaryToolbarButtonContainer.hiddenScrollModeButtons > .scrollModeButtons,\n#secondaryToolbarButtonContainer.hiddenSpreadModeButtons > .spreadModeButtons {\n  display: none !important;\n}\n\n.doorHanger,\n.doorHangerRight {\n  border-radius: 2px;\n  box-shadow: 0 1px 5px var(--doorhanger-border-color),\n    0 0 0 1px var(--doorhanger-border-color);\n}\n.doorHanger:after,\n.doorHanger:before,\n.doorHangerRight:after,\n.doorHangerRight:before {\n  bottom: 100%;\n  border: solid rgba(0, 0, 0, 0);\n  content: \" \";\n  height: 0;\n  width: 0;\n  position: absolute;\n  pointer-events: none;\n}\n.doorHanger:after,\n.doorHangerRight:after {\n  border-width: 8px;\n}\n.doorHanger:after {\n  border-bottom-color: var(--toolbar-bg-color);\n}\n.doorHangerRight:after {\n  border-bottom-color: var(--doorhanger-bg-color);\n}\n.doorHanger:before,\n.doorHangerRight:before {\n  border-bottom-color: var(--doorhanger-border-color);\n  border-width: 9px;\n}\n\nhtml[dir=\"ltr\"] .doorHanger:after,\nhtml[dir=\"rtl\"] .doorHangerRight:after {\n  left: 10px;\n  margin-left: -8px;\n}\n\nhtml[dir=\"ltr\"] .doorHanger:before,\nhtml[dir=\"rtl\"] .doorHangerRight:before {\n  left: 10px;\n  margin-left: -9px;\n}\n\nhtml[dir=\"rtl\"] .doorHanger:after,\nhtml[dir=\"ltr\"] .doorHangerRight:after {\n  right: 10px;\n  margin-right: -8px;\n}\n\nhtml[dir=\"rtl\"] .doorHanger:before,\nhtml[dir=\"ltr\"] .doorHangerRight:before {\n  right: 10px;\n  margin-right: -9px;\n}\n\n#findResultsCount {\n  background-color: rgba(217, 217, 217, 1);\n  color: rgba(82, 82, 82, 1);\n  text-align: center;\n  padding: 3px 4px;\n  margin: 5px;\n}\n\n#findMsg {\n  color: rgba(251, 0, 0, 1);\n}\n#findMsg:empty {\n  display: none;\n}\n\n#toolbarViewerMiddle {\n  position: absolute;\n  left: 50%;\n  transform: translateX(-50%);\n}\n\nhtml[dir=\"ltr\"] #toolbarViewerLeft,\nhtml[dir=\"rtl\"] #toolbarViewerRight,\nhtml[dir=\"ltr\"] #toolbarSidebarLeft,\nhtml[dir=\"rtl\"] #toolbarSidebarRight {\n  float: left;\n}\nhtml[dir=\"ltr\"] #toolbarViewerRight,\nhtml[dir=\"rtl\"] #toolbarViewerLeft,\nhtml[dir=\"ltr\"] #toolbarSidebarRight,\nhtml[dir=\"rtl\"] #toolbarSidebarLeft {\n  float: right;\n}\nhtml[dir=\"ltr\"] #toolbarViewerLeft > *,\nhtml[dir=\"ltr\"] #toolbarViewerMiddle > *,\nhtml[dir=\"ltr\"] #toolbarViewerRight > *,\nhtml[dir=\"ltr\"] #toolbarSidebarLeft *,\nhtml[dir=\"ltr\"] #toolbarSidebarRight *,\nhtml[dir=\"ltr\"] .findbar * {\n  position: relative;\n  float: left;\n}\nhtml[dir=\"rtl\"] #toolbarViewerLeft > *,\nhtml[dir=\"rtl\"] #toolbarViewerMiddle > *,\nhtml[dir=\"rtl\"] #toolbarViewerRight > *,\nhtml[dir=\"rtl\"] #toolbarSidebarLeft *,\nhtml[dir=\"rtl\"] #toolbarSidebarRight *,\nhtml[dir=\"rtl\"] .findbar * {\n  position: relative;\n  float: right;\n}\n\n.splitToolbarButton {\n  margin: 2px 2px 0;\n  display: inline-block;\n}\nhtml[dir=\"ltr\"] .splitToolbarButton > .toolbarButton {\n  float: left;\n}\nhtml[dir=\"rtl\"] .splitToolbarButton > .toolbarButton {\n  float: right;\n}\n\n.toolbarButton,\n.secondaryToolbarButton,\n.overlayButton {\n  border: 0 none;\n  background: none;\n  width: 28px;\n  height: 28px;\n}\n.overlayButton {\n  background-color: var(--overlay-button-bg-color);\n}\n\n.overlayButton:hover,\n.overlayButton:focus {\n  background-color: var(--overlay-button-hover-color);\n}\n\n.toolbarButton > span {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  overflow: hidden;\n}\n\n.toolbarButton[disabled],\n.secondaryToolbarButton[disabled],\n.overlayButton[disabled] {\n  opacity: 0.5;\n}\n\n.splitToolbarButton.toggled .toolbarButton {\n  margin: 0;\n}\n\n.splitToolbarButton > .toolbarButton:hover,\n.splitToolbarButton > .toolbarButton:focus,\n.dropdownToolbarButton:hover,\n.toolbarButton.textButton:hover,\n.toolbarButton.textButton:focus {\n  background-color: var(--button-hover-color);\n  z-index: 199;\n}\n.splitToolbarButton > .toolbarButton {\n  position: relative;\n}\nhtml[dir=\"ltr\"] .splitToolbarButton > .toolbarButton:first-child,\nhtml[dir=\"rtl\"] .splitToolbarButton > .toolbarButton:last-child {\n  margin: 0;\n}\nhtml[dir=\"ltr\"] .splitToolbarButton > .toolbarButton:last-child,\nhtml[dir=\"rtl\"] .splitToolbarButton > .toolbarButton:first-child {\n  margin: 0;\n}\n.splitToolbarButtonSeparator {\n  padding: 10px 0;\n  width: 1px;\n  background-color: var(--separator-color);\n  z-index: 99;\n  display: inline-block;\n  margin: 4px 0;\n}\n\n.findbar .splitToolbarButtonSeparator {\n  background-color: var(--field-border-color);\n  margin: 0;\n  padding: 13px 0;\n}\n\nhtml[dir=\"ltr\"] .splitToolbarButtonSeparator {\n  float: left;\n}\nhtml[dir=\"rtl\"] .splitToolbarButtonSeparator {\n  float: right;\n}\n\n.toolbarButton,\n.dropdownToolbarButton,\n.secondaryToolbarButton,\n.overlayButton {\n  min-width: 16px;\n  margin: 2px 1px;\n  padding: 2px 6px 0;\n  border: none;\n  border-radius: 2px;\n  color: var(--main-color);\n  font-size: 12px;\n  line-height: 14px;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n          user-select: none;\n  cursor: default;\n  box-sizing: border-box;\n}\n\nhtml[dir=\"ltr\"] #toolbarViewerLeft > .toolbarButton:first-child,\nhtml[dir=\"rtl\"] #toolbarViewerRight > .toolbarButton:last-child {\n  margin-left: 2px;\n}\n\nhtml[dir=\"ltr\"] #toolbarViewerRight > .toolbarButton:last-child,\nhtml[dir=\"rtl\"] #toolbarViewerLeft > .toolbarButton:first-child {\n  margin-right: 2px;\n}\n.toolbarButton:hover,\n.toolbarButton:focus {\n  background-color: var(--button-hover-color);\n}\n.secondaryToolbarButton:hover,\n.secondaryToolbarButton:focus {\n  background-color: var(--doorhanger-hover-color);\n}\n\n.toolbarButton.toggled,\n.splitToolbarButton.toggled > .toolbarButton.toggled,\n.secondaryToolbarButton.toggled {\n  background-color: var(--toggled-btn-bg-color);\n}\n\n.toolbarButton.toggled:hover:active,\n.splitToolbarButton.toggled > .toolbarButton.toggled:hover:active,\n.secondaryToolbarButton.toggled:hover:active {\n  background-color: var(--toggled-hover-active-btn-color);\n}\n\n.dropdownToolbarButton {\n  width: 140px;\n  padding: 0;\n  overflow: hidden;\n  background-color: var(--dropdown-btn-bg-color);\n  margin-top: 2px !important;\n}\n.dropdownToolbarButton::after {\n  top: 6px;\n  pointer-events: none;\n\n  -webkit-mask-image: var(--toolbarButton-menuArrow-icon);\n  mask-image: var(--toolbarButton-menuArrow-icon);\n}\nhtml[dir=\"ltr\"] .dropdownToolbarButton::after {\n  right: 7px;\n}\nhtml[dir=\"rtl\"] .dropdownToolbarButton::after {\n  left: 7px;\n}\n\n.dropdownToolbarButton > select {\n  width: 162px;\n  height: 28px;\n  font-size: 12px;\n  color: var(--main-color);\n  margin: 0;\n  padding: 1px 0 2px;\n  border: none;\n  background-color: var(--dropdown-btn-bg-color);\n}\nhtml[dir=\"ltr\"] .dropdownToolbarButton > select {\n  padding-left: 4px;\n}\nhtml[dir=\"rtl\"] .dropdownToolbarButton > select {\n  padding-right: 4px;\n}\n.dropdownToolbarButton > select:hover {\n  background-color: var(--button-hover-color);\n}\n\n.dropdownToolbarButton > select:focus {\n  background-color: var(--button-hover-color);\n}\n\n.dropdownToolbarButton > select > option {\n  background: var(--doorhanger-bg-color);\n}\n\n#customScaleOption {\n  display: none;\n}\n\n#pageWidthOption {\n  border-bottom: 1px rgba(255, 255, 255, 0.5) solid;\n}\n\n.toolbarButtonSpacer {\n  width: 30px;\n  display: inline-block;\n  height: 1px;\n}\n\n.toolbarButton::before,\n.secondaryToolbarButton::before,\n.dropdownToolbarButton::after,\n.treeItemToggler::before {\n  /* All matching images have a size of 16x16\n   * All relevant containers have a size of 28x28 */\n  position: absolute;\n  display: inline-block;\n  width: 16px;\n  height: 16px;\n\n  content: \"\";\n  background-color: var(--toolbar-icon-bg-color);\n  -webkit-mask-size: cover;\n  mask-size: cover;\n}\n\n.toolbarButton::before {\n  opacity: var(--toolbar-icon-opacity);\n  top: 6px;\n  left: 6px;\n}\n\n.secondaryToolbarButton::before {\n  opacity: var(--doorhanger-icon-opacity);\n  top: 5px;\n}\nhtml[dir=\"ltr\"] .secondaryToolbarButton::before {\n  left: 12px;\n}\nhtml[dir=\"rtl\"] .secondaryToolbarButton::before {\n  right: 12px;\n}\n\n.toolbarButton#sidebarToggle::before {\n  -webkit-mask-image: var(--toolbarButton-sidebarToggle-icon);\n  mask-image: var(--toolbarButton-sidebarToggle-icon);\n}\nhtml[dir=\"rtl\"] .toolbarButton#sidebarToggle::before {\n  transform: scaleX(-1);\n}\n\n.toolbarButton#secondaryToolbarToggle::before {\n  -webkit-mask-image: var(--toolbarButton-secondaryToolbarToggle-icon);\n  mask-image: var(--toolbarButton-secondaryToolbarToggle-icon);\n}\nhtml[dir=\"rtl\"] .toolbarButton#secondaryToolbarToggle::before {\n  transform: scaleX(-1);\n}\n\n.toolbarButton.findPrevious::before {\n  -webkit-mask-image: var(--findbarButton-previous-icon);\n  mask-image: var(--findbarButton-previous-icon);\n}\n\n.toolbarButton.findNext::before {\n  -webkit-mask-image: var(--findbarButton-next-icon);\n  mask-image: var(--findbarButton-next-icon);\n}\n\n.toolbarButton.pageUp::before {\n  -webkit-mask-image: var(--toolbarButton-pageUp-icon);\n  mask-image: var(--toolbarButton-pageUp-icon);\n}\n\n.toolbarButton.pageDown::before {\n  -webkit-mask-image: var(--toolbarButton-pageDown-icon);\n  mask-image: var(--toolbarButton-pageDown-icon);\n}\n\n.toolbarButton.zoomOut::before {\n  -webkit-mask-image: var(--toolbarButton-zoomOut-icon);\n  mask-image: var(--toolbarButton-zoomOut-icon);\n}\n\n.toolbarButton.zoomIn::before {\n  -webkit-mask-image: var(--toolbarButton-zoomIn-icon);\n  mask-image: var(--toolbarButton-zoomIn-icon);\n}\n\n.toolbarButton.presentationMode::before,\n.secondaryToolbarButton.presentationMode::before {\n  -webkit-mask-image: var(--toolbarButton-presentationMode-icon);\n  mask-image: var(--toolbarButton-presentationMode-icon);\n}\n\n.toolbarButton.print::before,\n.secondaryToolbarButton.print::before {\n  -webkit-mask-image: var(--toolbarButton-print-icon);\n  mask-image: var(--toolbarButton-print-icon);\n}\n\n.toolbarButton.openFile::before,\n.secondaryToolbarButton.openFile::before {\n  -webkit-mask-image: var(--toolbarButton-openFile-icon);\n  mask-image: var(--toolbarButton-openFile-icon);\n}\n\n.toolbarButton.download::before,\n.secondaryToolbarButton.download::before {\n  -webkit-mask-image: var(--toolbarButton-download-icon);\n  mask-image: var(--toolbarButton-download-icon);\n}\n\n.secondaryToolbarButton.bookmark {\n  padding-top: 6px;\n  text-decoration: none;\n}\n\n.bookmark[href=\"#\"] {\n  opacity: 0.5;\n  pointer-events: none;\n}\n\n.toolbarButton.bookmark::before,\n.secondaryToolbarButton.bookmark::before {\n  -webkit-mask-image: var(--toolbarButton-bookmark-icon);\n  mask-image: var(--toolbarButton-bookmark-icon);\n}\n\n#viewThumbnail.toolbarButton::before {\n  -webkit-mask-image: var(--toolbarButton-viewThumbnail-icon);\n  mask-image: var(--toolbarButton-viewThumbnail-icon);\n}\n\n#viewOutline.toolbarButton::before {\n  -webkit-mask-image: var(--toolbarButton-viewOutline-icon);\n  mask-image: var(--toolbarButton-viewOutline-icon);\n}\nhtml[dir=\"rtl\"] #viewOutline.toolbarButton::before {\n  transform: scaleX(-1);\n}\n\n#viewAttachments.toolbarButton::before {\n  -webkit-mask-image: var(--toolbarButton-viewAttachments-icon);\n  mask-image: var(--toolbarButton-viewAttachments-icon);\n}\n\n#viewLayers.toolbarButton::before {\n  -webkit-mask-image: var(--toolbarButton-viewLayers-icon);\n  mask-image: var(--toolbarButton-viewLayers-icon);\n}\n\n#currentOutlineItem.toolbarButton::before {\n  -webkit-mask-image: var(--toolbarButton-currentOutlineItem-icon);\n  mask-image: var(--toolbarButton-currentOutlineItem-icon);\n}\nhtml[dir=\"rtl\"] #currentOutlineItem.toolbarButton::before {\n  transform: scaleX(-1);\n}\n\n#viewFind.toolbarButton::before {\n  -webkit-mask-image: var(--toolbarButton-search-icon);\n  mask-image: var(--toolbarButton-search-icon);\n}\n\n.toolbarButton.pdfSidebarNotification::after {\n  position: absolute;\n  display: inline-block;\n  top: 1px;\n  /* Create a filled circle, with a diameter of 9 pixels, using only CSS: */\n  content: \"\";\n  background-color: rgba(112, 219, 85, 1);\n  height: 9px;\n  width: 9px;\n  border-radius: 50%;\n}\nhtml[dir=\"ltr\"] .toolbarButton.pdfSidebarNotification::after {\n  left: 17px;\n}\nhtml[dir=\"rtl\"] .toolbarButton.pdfSidebarNotification::after {\n  right: 17px;\n}\n\n.secondaryToolbarButton {\n  position: relative;\n  margin: 0;\n  padding: 0 0 1px;\n  height: auto;\n  min-height: 26px;\n  width: auto;\n  min-width: 100%;\n  white-space: normal;\n  border-radius: 0;\n  box-sizing: border-box;\n}\nhtml[dir=\"ltr\"] .secondaryToolbarButton {\n  padding-left: 36px;\n  text-align: left;\n}\nhtml[dir=\"rtl\"] .secondaryToolbarButton {\n  padding-right: 36px;\n  text-align: right;\n}\n\nhtml[dir=\"ltr\"] .secondaryToolbarButton > span {\n  padding-right: 4px;\n}\nhtml[dir=\"rtl\"] .secondaryToolbarButton > span {\n  padding-left: 4px;\n}\n\n.secondaryToolbarButton.firstPage::before {\n  -webkit-mask-image: var(--secondaryToolbarButton-firstPage-icon);\n  mask-image: var(--secondaryToolbarButton-firstPage-icon);\n}\n\n.secondaryToolbarButton.lastPage::before {\n  -webkit-mask-image: var(--secondaryToolbarButton-lastPage-icon);\n  mask-image: var(--secondaryToolbarButton-lastPage-icon);\n}\n\n.secondaryToolbarButton.rotateCcw::before {\n  -webkit-mask-image: var(--secondaryToolbarButton-rotateCcw-icon);\n  mask-image: var(--secondaryToolbarButton-rotateCcw-icon);\n}\n\n.secondaryToolbarButton.rotateCw::before {\n  -webkit-mask-image: var(--secondaryToolbarButton-rotateCw-icon);\n  mask-image: var(--secondaryToolbarButton-rotateCw-icon);\n}\n\n.secondaryToolbarButton.selectTool::before {\n  -webkit-mask-image: var(--secondaryToolbarButton-selectTool-icon);\n  mask-image: var(--secondaryToolbarButton-selectTool-icon);\n}\n\n.secondaryToolbarButton.handTool::before {\n  -webkit-mask-image: var(--secondaryToolbarButton-handTool-icon);\n  mask-image: var(--secondaryToolbarButton-handTool-icon);\n}\n\n.secondaryToolbarButton.scrollVertical::before {\n  -webkit-mask-image: var(--secondaryToolbarButton-scrollVertical-icon);\n  mask-image: var(--secondaryToolbarButton-scrollVertical-icon);\n}\n\n.secondaryToolbarButton.scrollHorizontal::before {\n  -webkit-mask-image: var(--secondaryToolbarButton-scrollHorizontal-icon);\n  mask-image: var(--secondaryToolbarButton-scrollHorizontal-icon);\n}\n\n.secondaryToolbarButton.scrollWrapped::before {\n  -webkit-mask-image: var(--secondaryToolbarButton-scrollWrapped-icon);\n  mask-image: var(--secondaryToolbarButton-scrollWrapped-icon);\n}\n\n.secondaryToolbarButton.spreadNone::before {\n  -webkit-mask-image: var(--secondaryToolbarButton-spreadNone-icon);\n  mask-image: var(--secondaryToolbarButton-spreadNone-icon);\n}\n\n.secondaryToolbarButton.spreadOdd::before {\n  -webkit-mask-image: var(--secondaryToolbarButton-spreadOdd-icon);\n  mask-image: var(--secondaryToolbarButton-spreadOdd-icon);\n}\n\n.secondaryToolbarButton.spreadEven::before {\n  -webkit-mask-image: var(--secondaryToolbarButton-spreadEven-icon);\n  mask-image: var(--secondaryToolbarButton-spreadEven-icon);\n}\n\n.secondaryToolbarButton.documentProperties::before {\n  -webkit-mask-image: var(--secondaryToolbarButton-documentProperties-icon);\n  mask-image: var(--secondaryToolbarButton-documentProperties-icon);\n}\n\n.verticalToolbarSeparator {\n  display: block;\n  padding: 11px 0;\n  margin: 5px 2px;\n  width: 1px;\n  background-color: var(--separator-color);\n}\nhtml[dir=\"ltr\"] .verticalToolbarSeparator {\n  margin-left: 2px;\n}\nhtml[dir=\"rtl\"] .verticalToolbarSeparator {\n  margin-right: 2px;\n}\n\n.horizontalToolbarSeparator {\n  display: block;\n  margin: 6px 0 5px;\n  height: 1px;\n  width: 100%;\n  border-top: 1px solid var(--doorhanger-separator-color);\n}\n\n.toolbarField {\n  padding: 4px 7px;\n  margin: 3px 0;\n  border-radius: 2px;\n  background-color: var(--field-bg-color);\n  background-clip: padding-box;\n  border-width: 1px;\n  border-style: solid;\n  border-color: var(--field-border-color);\n  box-shadow: none;\n  color: var(--field-color);\n  font-size: 12px;\n  line-height: 16px;\n  outline-style: none;\n}\n\n.toolbarField[type=\"checkbox\"] {\n  opacity: 0;\n  position: absolute !important;\n  left: 0;\n}\n\nhtml[dir=\"ltr\"] .toolbarField[type=\"checkbox\"] {\n  margin: 10px 0 3px 7px;\n}\n\nhtml[dir=\"rtl\"] .toolbarField[type=\"checkbox\"] {\n  margin: 10px 7px 3px 0;\n}\n\n.toolbarField.pageNumber {\n  -moz-appearance: textfield; /* hides the spinner in moz */\n  min-width: 16px;\n  text-align: right;\n  width: 40px;\n}\n\n.toolbarField.pageNumber.visiblePageIsLoading {\n  background-image: var(--loading-icon);\n  background-repeat: no-repeat;\n  background-position: 3px;\n}\n\n.toolbarField.pageNumber::-webkit-inner-spin-button,\n.toolbarField.pageNumber::-webkit-outer-spin-button {\n  -webkit-appearance: none;\n  margin: 0;\n}\n\n.toolbarField:focus {\n  border-color: #0a84ff;\n}\n\n.toolbarLabel {\n  min-width: 16px;\n  padding: 6px;\n  margin: 2px;\n  border: 1px solid rgba(0, 0, 0, 0);\n  border-radius: 2px;\n  color: var(--main-color);\n  font-size: 12px;\n  line-height: 14px;\n  text-align: left;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n          user-select: none;\n  cursor: default;\n}\n\nhtml[dir=\"ltr\"] #numPages.toolbarLabel {\n  padding-left: 2px;\n}\nhtml[dir=\"rtl\"] #numPages.toolbarLabel {\n  padding-right: 2px;\n}\n\n#thumbnailView {\n  position: absolute;\n  width: calc(100% - 60px);\n  top: 0;\n  bottom: 0;\n  padding: 10px 30px 0;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n#thumbnailView > a:active,\n#thumbnailView > a:focus {\n  outline: 0;\n}\n\n.thumbnail {\n  margin: 0 10px 5px;\n}\nhtml[dir=\"ltr\"] .thumbnail {\n  float: left;\n}\nhtml[dir=\"rtl\"] .thumbnail {\n  float: right;\n}\n\n#thumbnailView > a:last-of-type > .thumbnail {\n  margin-bottom: 10px;\n}\n\n#thumbnailView > a:last-of-type > .thumbnail:not([data-loaded]) {\n  margin-bottom: 9px;\n}\n\n.thumbnail:not([data-loaded]) {\n  border: 1px dashed rgba(132, 132, 132, 1);\n  margin: -1px 9px 4px;\n}\n\n.thumbnailImage {\n  border: 1px solid rgba(0, 0, 0, 0);\n  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3);\n  opacity: 0.8;\n  z-index: 99;\n  background-color: rgba(255, 255, 255, 1);\n  background-clip: content-box;\n}\n\n.thumbnailSelectionRing {\n  border-radius: 2px;\n  padding: 7px;\n}\n\na:focus > .thumbnail > .thumbnailSelectionRing > .thumbnailImage,\n.thumbnail:hover > .thumbnailSelectionRing > .thumbnailImage {\n  opacity: 0.9;\n}\n\na:focus > .thumbnail > .thumbnailSelectionRing,\n.thumbnail:hover > .thumbnailSelectionRing {\n  background-color: var(--sidebaritem-bg-color);\n  background-clip: padding-box;\n  color: rgba(255, 255, 255, 0.9);\n}\n\n.thumbnail.selected > .thumbnailSelectionRing > .thumbnailImage {\n  opacity: 1;\n}\n\n.thumbnail.selected > .thumbnailSelectionRing {\n  background-color: var(--sidebaritem-bg-color);\n  background-clip: padding-box;\n  color: rgba(255, 255, 255, 1);\n}\n\n#outlineView,\n#attachmentsView,\n#layersView {\n  position: absolute;\n  width: calc(100% - 8px);\n  top: 0;\n  bottom: 0;\n  padding: 4px 4px 0;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n          user-select: none;\n}\n\nhtml[dir=\"ltr\"] .treeWithDeepNesting > .treeItem,\nhtml[dir=\"ltr\"] .treeItem > .treeItems {\n  margin-left: 20px;\n}\n\nhtml[dir=\"rtl\"] .treeWithDeepNesting > .treeItem,\nhtml[dir=\"rtl\"] .treeItem > .treeItems {\n  margin-right: 20px;\n}\n\n.treeItem > a {\n  text-decoration: none;\n  display: inline-block;\n  min-width: 95%;\n  /* Subtract the right padding (left, in RTL mode) of the container: */\n  min-width: calc(100% - 4px);\n  height: auto;\n  margin-bottom: 1px;\n  border-radius: 2px;\n  color: var(--treeitem-color);\n  font-size: 13px;\n  line-height: 15px;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n          user-select: none;\n  white-space: normal;\n  cursor: pointer;\n}\nhtml[dir=\"ltr\"] .treeItem > a {\n  padding: 2px 0 5px 4px;\n}\nhtml[dir=\"rtl\"] .treeItem > a {\n  padding: 2px 4px 5px 0;\n}\n\n#layersView .treeItem > a > * {\n  cursor: pointer;\n}\nhtml[dir=\"ltr\"] #layersView .treeItem > a > label {\n  padding-left: 4px;\n}\nhtml[dir=\"rtl\"] #layersView .treesItem > a > label {\n  padding-right: 4px;\n}\n\n.treeItemToggler {\n  position: relative;\n  height: 0;\n  width: 0;\n  color: rgba(255, 255, 255, 0.5);\n}\n.treeItemToggler::before {\n  -webkit-mask-image: var(--treeitem-expanded-icon);\n  mask-image: var(--treeitem-expanded-icon);\n}\n.treeItemToggler.treeItemsHidden::before {\n  -webkit-mask-image: var(--treeitem-collapsed-icon);\n  mask-image: var(--treeitem-collapsed-icon);\n}\nhtml[dir=\"rtl\"] .treeItemToggler.treeItemsHidden::before {\n  transform: scaleX(-1);\n}\n.treeItemToggler.treeItemsHidden ~ .treeItems {\n  display: none;\n}\nhtml[dir=\"ltr\"] .treeItemToggler {\n  float: left;\n}\nhtml[dir=\"rtl\"] .treeItemToggler {\n  float: right;\n}\nhtml[dir=\"ltr\"] .treeItemToggler::before {\n  right: 4px;\n}\nhtml[dir=\"rtl\"] .treeItemToggler::before {\n  left: 4px;\n}\n\n.treeItem.selected > a {\n  background-color: var(--treeitem-selected-bg-color);\n  color: var(--treeitem-selected-color);\n}\n\n.treeItemToggler:hover,\n.treeItemToggler:hover + a,\n.treeItemToggler:hover ~ .treeItems,\n.treeItem > a:hover {\n  background-color: var(--sidebaritem-bg-color);\n  background-clip: padding-box;\n  border-radius: 2px;\n  color: var(--treeitem-hover-color);\n}\n\n/* TODO: file FF bug to support ::-moz-selection:window-inactive\n   so we can override the opaque grey background when the window is inactive;\n   see https://bugzilla.mozilla.org/show_bug.cgi?id=706209 */\n::-moz-selection {\n  background: rgba(0, 0, 255, 0.3);\n}\n::selection {\n  background: rgba(0, 0, 255, 0.3);\n}\n\n#errorWrapper {\n  background: none repeat scroll 0 0 var(--errorWrapper-bg-color);\n  color: var(--main-color);\n  left: 0;\n  position: absolute;\n  right: 0;\n  z-index: 1000;\n  padding: 3px 6px;\n}\n\n#errorMessageLeft {\n  float: left;\n}\n\n#errorMessageRight {\n  float: right;\n}\n\n#errorMoreInfo {\n  background-color: var(--field-bg-color);\n  color: var(--field-color);\n  border: 1px solid var(--field-border-color);\n  padding: 3px;\n  margin: 3px;\n  width: 98%;\n}\n\n.overlayButton {\n  width: auto;\n  margin: 3px 4px 2px !important;\n  padding: 2px 11px;\n}\n\n#overlayContainer {\n  display: table;\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  background-color: rgba(0, 0, 0, 0.2);\n  z-index: 40000;\n}\n#overlayContainer > * {\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n#overlayContainer > .container {\n  display: table-cell;\n  vertical-align: middle;\n  text-align: center;\n}\n\n#overlayContainer > .container > .dialog {\n  display: inline-block;\n  padding: 15px;\n  border-spacing: 4px;\n  color: var(--main-color);\n  font-size: 12px;\n  line-height: 14px;\n  background-color: var(--doorhanger-bg-color);\n  border: 1px solid rgba(0, 0, 0, 0.5);\n  border-radius: 4px;\n  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);\n}\n\n.dialog > .row {\n  display: table-row;\n}\n\n.dialog > .row > * {\n  display: table-cell;\n}\n\n.dialog .toolbarField {\n  margin: 5px 0;\n}\n\n.dialog .separator {\n  display: block;\n  margin: 4px 0;\n  height: 1px;\n  width: 100%;\n  background-color: var(--separator-color);\n}\n\n.dialog .buttonRow {\n  text-align: center;\n  vertical-align: middle;\n}\n\n.dialog :link {\n  color: rgba(255, 255, 255, 1);\n}\n\n#passwordOverlay > .dialog {\n  text-align: center;\n}\n#passwordOverlay .toolbarField {\n  width: 200px;\n}\n\n#documentPropertiesOverlay > .dialog {\n  text-align: left;\n}\n#documentPropertiesOverlay .row > * {\n  min-width: 100px;\n}\nhtml[dir=\"ltr\"] #documentPropertiesOverlay .row > * {\n  text-align: left;\n}\nhtml[dir=\"rtl\"] #documentPropertiesOverlay .row > * {\n  text-align: right;\n}\n#documentPropertiesOverlay .row > span {\n  width: 125px;\n  word-wrap: break-word;\n}\n#documentPropertiesOverlay .row > p {\n  max-width: 225px;\n  word-wrap: break-word;\n}\n#documentPropertiesOverlay .buttonRow {\n  margin-top: 10px;\n}\n\n.clearBoth {\n  clear: both;\n}\n\n.fileInput {\n  background: rgba(255, 255, 255, 1);\n  color: rgba(0, 0, 0, 1);\n  margin-top: 5px;\n  visibility: hidden;\n  position: fixed;\n  right: 0;\n  top: 0;\n}\n\n#PDFBug {\n  background: none repeat scroll 0 0 rgba(255, 255, 255, 1);\n  border: 1px solid rgba(102, 102, 102, 1);\n  position: fixed;\n  top: 32px;\n  right: 0;\n  bottom: 0;\n  font-size: 10px;\n  padding: 0;\n  width: 300px;\n}\n#PDFBug .controls {\n  background: rgba(238, 238, 238, 1);\n  border-bottom: 1px solid rgba(102, 102, 102, 1);\n  padding: 3px;\n}\n#PDFBug .panels {\n  bottom: 0;\n  left: 0;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  position: absolute;\n  right: 0;\n  top: 27px;\n}\n#PDFBug .panels > div {\n  padding: 5px;\n}\n#PDFBug button.active {\n  font-weight: bold;\n}\n.debuggerShowText {\n  background: none repeat scroll 0 0 rgba(255, 255, 0, 1);\n  color: rgba(0, 0, 255, 1);\n}\n.debuggerHideText:hover {\n  background: none repeat scroll 0 0 rgba(255, 255, 0, 1);\n}\n#PDFBug .stats {\n  font-family: courier;\n  font-size: 10px;\n  white-space: pre;\n}\n#PDFBug .stats .title {\n  font-weight: bold;\n}\n#PDFBug table {\n  font-size: 10px;\n}\n\n#viewer.textLayer-visible .textLayer {\n  opacity: 1;\n}\n\n#viewer.textLayer-visible .canvasWrapper {\n  background-color: rgba(128, 255, 128, 1);\n}\n\n#viewer.textLayer-visible .canvasWrapper canvas {\n  mix-blend-mode: screen;\n}\n\n#viewer.textLayer-visible .textLayer > span {\n  background-color: rgba(255, 255, 0, 0.1);\n  color: rgba(0, 0, 0, 1);\n  border: solid 1px rgba(255, 0, 0, 0.5);\n  box-sizing: border-box;\n}\n\n#viewer.textLayer-hover .textLayer > span:hover {\n  background-color: rgba(255, 255, 255, 1);\n  color: rgba(0, 0, 0, 1);\n}\n\n#viewer.textLayer-shadow .textLayer > span {\n  background-color: rgba(255, 255, 255, 0.6);\n  color: rgba(0, 0, 0, 1);\n}\n\n.grab-to-pan-grab {\n  cursor: url(\"images/grab.cur\"), move !important;\n  cursor: -webkit-grab !important;\n  cursor: grab !important;\n}\n.grab-to-pan-grab\n  *:not(input):not(textarea):not(button):not(select):not(:link) {\n  cursor: inherit !important;\n}\n.grab-to-pan-grab:active,\n.grab-to-pan-grabbing {\n  cursor: url(\"images/grabbing.cur\"), move !important;\n  cursor: -webkit-grabbing !important;\n  cursor: grabbing !important;\n  position: fixed;\n  background: rgba(0, 0, 0, 0);\n  display: block;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  overflow: hidden;\n  z-index: 50000; /* should be higher than anything else in PDF.js! */\n}\n\n@page {\n  margin: 0;\n}\n\n#printContainer {\n  display: none;\n}\n\n@media print {\n  /* General rules for printing. */\n  body {\n    background: rgba(0, 0, 0, 0) none;\n  }\n\n  /* Rules for browsers that don't support mozPrintCallback. */\n  #sidebarContainer,\n  #secondaryToolbar,\n  .toolbar,\n  #loadingBox,\n  #errorWrapper,\n  .textLayer {\n    display: none;\n  }\n  #viewerContainer {\n    overflow: visible;\n  }\n\n  #mainContainer,\n  #viewerContainer,\n  .page,\n  .page canvas {\n    position: static;\n    padding: 0;\n    margin: 0;\n  }\n\n  .page {\n    float: left;\n    display: none;\n    border: none;\n    box-shadow: none;\n    background-clip: content-box;\n    background-color: rgba(255, 255, 255, 1);\n  }\n\n  .page[data-loaded] {\n    display: block;\n  }\n\n  .fileInput {\n    display: none;\n  }\n\n  /* Rules for browsers that support PDF.js printing */\n  body[data-pdfjsprinting] #outerContainer {\n    display: none;\n  }\n  body[data-pdfjsprinting] #printContainer {\n    display: block;\n  }\n  #printContainer {\n    height: 100%;\n  }\n  /* wrapper around (scaled) print canvas elements */\n  #printContainer > div {\n    page-break-after: always;\n    page-break-inside: avoid;\n\n    /* The wrapper always cover the whole page. */\n    height: 100%;\n    width: 100%;\n\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    align-items: center;\n  }\n  #printContainer canvas,\n  #printContainer img {\n    /* The intrinsic canvas / image size will make sure that we fit the page. */\n    max-width: 100%;\n    max-height: 100%;\n\n    direction: ltr;\n    display: block;\n  }\n}\n\n.visibleLargeView,\n.visibleMediumView,\n.visibleSmallView {\n  display: none;\n}\n\n@media all and (max-width: 900px) {\n  #toolbarViewerMiddle {\n    display: table;\n    margin: auto;\n    left: auto;\n    position: inherit;\n    transform: none;\n  }\n}\n\n@media all and (max-width: 840px) {\n  #sidebarContainer {\n    background-color: var(--sidebar-narrow-bg-color);\n  }\n\n  html[dir=\"ltr\"] #outerContainer.sidebarOpen #viewerContainer {\n    left: 0 !important;\n  }\n  html[dir=\"rtl\"] #outerContainer.sidebarOpen #viewerContainer {\n    right: 0 !important;\n  }\n\n  #outerContainer .hiddenLargeView,\n  #outerContainer .hiddenMediumView {\n    display: inherit;\n  }\n  #outerContainer .visibleLargeView,\n  #outerContainer .visibleMediumView {\n    display: none;\n  }\n}\n\n@media all and (max-width: 770px) {\n  #outerContainer .hiddenLargeView {\n    display: none;\n  }\n  #outerContainer .visibleLargeView {\n    display: inherit;\n  }\n}\n\n@media all and (max-width: 700px) {\n  #outerContainer .hiddenMediumView {\n    display: none;\n  }\n  #outerContainer .visibleMediumView {\n    display: inherit;\n  }\n}\n\n@media all and (max-width: 640px) {\n  .hiddenSmallView,\n  .hiddenSmallView * {\n    display: none;\n  }\n  .visibleSmallView {\n    display: inherit;\n  }\n  .toolbarButtonSpacer {\n    width: 0;\n  }\n  html[dir=\"ltr\"] .findbar {\n    left: 34px;\n  }\n  html[dir=\"rtl\"] .findbar {\n    right: 34px;\n  }\n}\n\n@media all and (max-width: 535px) {\n  #scaleSelectContainer {\n    display: none;\n  }\n}\n"
  },
  {
    "path": "lib/pdf.js/web/viewer.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright 2012 Mozilla Foundation\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\nAdobe CMap resources are covered by their own copyright but the same license:\n\n    Copyright 1990-2015 Adobe Systems Incorporated.\n\nSee https://github.com/adobe-type-tools/cmap-resources\n-->\n<html dir=\"ltr\" mozdisallowselectionprint>\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">\n    <meta name=\"google\" content=\"notranslate\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>PDF.js viewer</title>\n\n\n    <link rel=\"stylesheet\" href=\"viewer.css\">\n\n\n<!-- This snippet is used in production (included from viewer.html) -->\n<link rel=\"resource\" type=\"application/l10n\" href=\"locale/locale.properties\">\n<script src=\"../build/pdf.js\"></script>\n\n\n  <script src=\"viewer.js\"></script>\n\n  </head>\n\n  <body tabindex=\"1\">\n    <div id=\"outerContainer\">\n\n      <div id=\"sidebarContainer\">\n        <div id=\"toolbarSidebar\">\n          <div id=\"toolbarSidebarLeft\">\n            <div class=\"splitToolbarButton toggled\">\n              <button id=\"viewThumbnail\" class=\"toolbarButton toggled\" title=\"Show Thumbnails\" tabindex=\"2\" data-l10n-id=\"thumbs\">\n                 <span data-l10n-id=\"thumbs_label\">Thumbnails</span>\n              </button>\n              <button id=\"viewOutline\" class=\"toolbarButton\" title=\"Show Document Outline (double-click to expand/collapse all items)\" tabindex=\"3\" data-l10n-id=\"document_outline\">\n                 <span data-l10n-id=\"document_outline_label\">Document Outline</span>\n              </button>\n              <button id=\"viewAttachments\" class=\"toolbarButton\" title=\"Show Attachments\" tabindex=\"4\" data-l10n-id=\"attachments\">\n                 <span data-l10n-id=\"attachments_label\">Attachments</span>\n              </button>\n              <button id=\"viewLayers\" class=\"toolbarButton\" title=\"Show Layers (double-click to reset all layers to the default state)\" tabindex=\"5\" data-l10n-id=\"layers\">\n                 <span data-l10n-id=\"layers_label\">Layers</span>\n              </button>\n            </div>\n          </div>\n\n          <div id=\"toolbarSidebarRight\">\n            <div id=\"outlineOptionsContainer\" class=\"hidden\">\n              <div class=\"verticalToolbarSeparator\"></div>\n\n              <button id=\"currentOutlineItem\" class=\"toolbarButton\" disabled=\"disabled\" title=\"Find Current Outline Item\" tabindex=\"6\" data-l10n-id=\"current_outline_item\">\n                <span data-l10n-id=\"current_outline_item_label\">Current Outline Item</span>\n              </button>\n            </div>\n          </div>\n        </div>\n        <div id=\"sidebarContent\">\n          <div id=\"thumbnailView\">\n          </div>\n          <div id=\"outlineView\" class=\"hidden\">\n          </div>\n          <div id=\"attachmentsView\" class=\"hidden\">\n          </div>\n          <div id=\"layersView\" class=\"hidden\">\n          </div>\n        </div>\n        <div id=\"sidebarResizer\"></div>\n      </div>  <!-- sidebarContainer -->\n\n      <div id=\"mainContainer\">\n        <div class=\"findbar hidden doorHanger\" id=\"findbar\">\n          <div id=\"findbarInputContainer\">\n            <input id=\"findInput\" class=\"toolbarField\" title=\"Find\" placeholder=\"Find in document…\" tabindex=\"91\" data-l10n-id=\"find_input\">\n            <div class=\"splitToolbarButton\">\n              <button id=\"findPrevious\" class=\"toolbarButton findPrevious\" title=\"Find the previous occurrence of the phrase\" tabindex=\"92\" data-l10n-id=\"find_previous\">\n                <span data-l10n-id=\"find_previous_label\">Previous</span>\n              </button>\n              <div class=\"splitToolbarButtonSeparator\"></div>\n              <button id=\"findNext\" class=\"toolbarButton findNext\" title=\"Find the next occurrence of the phrase\" tabindex=\"93\" data-l10n-id=\"find_next\">\n                <span data-l10n-id=\"find_next_label\">Next</span>\n              </button>\n            </div>\n          </div>\n\n          <div id=\"findbarOptionsOneContainer\">\n            <input type=\"checkbox\" id=\"findHighlightAll\" class=\"toolbarField\" tabindex=\"94\">\n            <label for=\"findHighlightAll\" class=\"toolbarLabel\" data-l10n-id=\"find_highlight\">Highlight all</label>\n            <input type=\"checkbox\" id=\"findMatchCase\" class=\"toolbarField\" tabindex=\"95\">\n            <label for=\"findMatchCase\" class=\"toolbarLabel\" data-l10n-id=\"find_match_case_label\">Match case</label>\n          </div>\n          <div id=\"findbarOptionsTwoContainer\">\n            <input type=\"checkbox\" id=\"findEntireWord\" class=\"toolbarField\" tabindex=\"96\">\n            <label for=\"findEntireWord\" class=\"toolbarLabel\" data-l10n-id=\"find_entire_word_label\">Whole words</label>\n            <span id=\"findResultsCount\" class=\"toolbarLabel hidden\"></span>\n          </div>\n\n          <div id=\"findbarMessageContainer\">\n            <span id=\"findMsg\" class=\"toolbarLabel\"></span>\n          </div>\n        </div>  <!-- findbar -->\n\n        <div id=\"secondaryToolbar\" class=\"secondaryToolbar hidden doorHangerRight\">\n          <div id=\"secondaryToolbarButtonContainer\">\n            <button id=\"secondaryPresentationMode\" class=\"secondaryToolbarButton presentationMode visibleLargeView\" title=\"Switch to Presentation Mode\" tabindex=\"51\" data-l10n-id=\"presentation_mode\">\n              <span data-l10n-id=\"presentation_mode_label\">Presentation Mode</span>\n            </button>\n\n            <button id=\"secondaryOpenFile\" class=\"secondaryToolbarButton openFile visibleLargeView\" title=\"Open File\" tabindex=\"52\" data-l10n-id=\"open_file\">\n              <span data-l10n-id=\"open_file_label\">Open</span>\n            </button>\n\n            <button id=\"secondaryPrint\" class=\"secondaryToolbarButton print visibleMediumView\" title=\"Print\" tabindex=\"53\" data-l10n-id=\"print\">\n              <span data-l10n-id=\"print_label\">Print</span>\n            </button>\n\n            <button id=\"secondaryDownload\" class=\"secondaryToolbarButton download visibleMediumView\" title=\"Download\" tabindex=\"54\" data-l10n-id=\"download\">\n              <span data-l10n-id=\"download_label\">Download</span>\n            </button>\n\n            <a href=\"#\" id=\"secondaryViewBookmark\" class=\"secondaryToolbarButton bookmark visibleSmallView\" title=\"Current view (copy or open in new window)\" tabindex=\"55\" data-l10n-id=\"bookmark\">\n              <span data-l10n-id=\"bookmark_label\">Current View</span>\n            </a>\n\n            <div class=\"horizontalToolbarSeparator visibleLargeView\"></div>\n\n            <button id=\"firstPage\" class=\"secondaryToolbarButton firstPage\" title=\"Go to First Page\" tabindex=\"56\" data-l10n-id=\"first_page\">\n              <span data-l10n-id=\"first_page_label\">Go to First Page</span>\n            </button>\n            <button id=\"lastPage\" class=\"secondaryToolbarButton lastPage\" title=\"Go to Last Page\" tabindex=\"57\" data-l10n-id=\"last_page\">\n              <span data-l10n-id=\"last_page_label\">Go to Last Page</span>\n            </button>\n\n            <div class=\"horizontalToolbarSeparator\"></div>\n\n            <button id=\"pageRotateCw\" class=\"secondaryToolbarButton rotateCw\" title=\"Rotate Clockwise\" tabindex=\"58\" data-l10n-id=\"page_rotate_cw\">\n              <span data-l10n-id=\"page_rotate_cw_label\">Rotate Clockwise</span>\n            </button>\n            <button id=\"pageRotateCcw\" class=\"secondaryToolbarButton rotateCcw\" title=\"Rotate Counterclockwise\" tabindex=\"59\" data-l10n-id=\"page_rotate_ccw\">\n              <span data-l10n-id=\"page_rotate_ccw_label\">Rotate Counterclockwise</span>\n            </button>\n\n            <div class=\"horizontalToolbarSeparator\"></div>\n\n            <button id=\"cursorSelectTool\" class=\"secondaryToolbarButton selectTool toggled\" title=\"Enable Text Selection Tool\" tabindex=\"60\" data-l10n-id=\"cursor_text_select_tool\">\n              <span data-l10n-id=\"cursor_text_select_tool_label\">Text Selection Tool</span>\n            </button>\n            <button id=\"cursorHandTool\" class=\"secondaryToolbarButton handTool\" title=\"Enable Hand Tool\" tabindex=\"61\" data-l10n-id=\"cursor_hand_tool\">\n              <span data-l10n-id=\"cursor_hand_tool_label\">Hand Tool</span>\n            </button>\n\n            <div class=\"horizontalToolbarSeparator\"></div>\n\n            <button id=\"scrollVertical\" class=\"secondaryToolbarButton scrollModeButtons scrollVertical toggled\" title=\"Use Vertical Scrolling\" tabindex=\"62\" data-l10n-id=\"scroll_vertical\">\n              <span data-l10n-id=\"scroll_vertical_label\">Vertical Scrolling</span>\n            </button>\n            <button id=\"scrollHorizontal\" class=\"secondaryToolbarButton scrollModeButtons scrollHorizontal\" title=\"Use Horizontal Scrolling\" tabindex=\"63\" data-l10n-id=\"scroll_horizontal\">\n              <span data-l10n-id=\"scroll_horizontal_label\">Horizontal Scrolling</span>\n            </button>\n            <button id=\"scrollWrapped\" class=\"secondaryToolbarButton scrollModeButtons scrollWrapped\" title=\"Use Wrapped Scrolling\" tabindex=\"64\" data-l10n-id=\"scroll_wrapped\">\n              <span data-l10n-id=\"scroll_wrapped_label\">Wrapped Scrolling</span>\n            </button>\n\n            <div class=\"horizontalToolbarSeparator scrollModeButtons\"></div>\n\n            <button id=\"spreadNone\" class=\"secondaryToolbarButton spreadModeButtons spreadNone toggled\" title=\"Do not join page spreads\" tabindex=\"65\" data-l10n-id=\"spread_none\">\n              <span data-l10n-id=\"spread_none_label\">No Spreads</span>\n            </button>\n            <button id=\"spreadOdd\" class=\"secondaryToolbarButton spreadModeButtons spreadOdd\" title=\"Join page spreads starting with odd-numbered pages\" tabindex=\"66\" data-l10n-id=\"spread_odd\">\n              <span data-l10n-id=\"spread_odd_label\">Odd Spreads</span>\n            </button>\n            <button id=\"spreadEven\" class=\"secondaryToolbarButton spreadModeButtons spreadEven\" title=\"Join page spreads starting with even-numbered pages\" tabindex=\"67\" data-l10n-id=\"spread_even\">\n              <span data-l10n-id=\"spread_even_label\">Even Spreads</span>\n            </button>\n\n            <div class=\"horizontalToolbarSeparator spreadModeButtons\"></div>\n\n            <button id=\"documentProperties\" class=\"secondaryToolbarButton documentProperties\" title=\"Document Properties…\" tabindex=\"68\" data-l10n-id=\"document_properties\">\n              <span data-l10n-id=\"document_properties_label\">Document Properties…</span>\n            </button>\n          </div>\n        </div>  <!-- secondaryToolbar -->\n\n        <div class=\"toolbar\">\n          <div id=\"toolbarContainer\">\n            <div id=\"toolbarViewer\">\n              <div id=\"toolbarViewerLeft\">\n                <button id=\"sidebarToggle\" class=\"toolbarButton\" title=\"Toggle Sidebar\" tabindex=\"11\" data-l10n-id=\"toggle_sidebar\" aria-expanded=\"false\" aria-controls=\"sidebarContainer\">\n                  <span data-l10n-id=\"toggle_sidebar_label\">Toggle Sidebar</span>\n                </button>\n                <div class=\"toolbarButtonSpacer\"></div>\n                <button id=\"viewFind\" class=\"toolbarButton\" title=\"Find in Document\" tabindex=\"12\" data-l10n-id=\"findbar\" aria-expanded=\"false\" aria-controls=\"findbar\">\n                  <span data-l10n-id=\"findbar_label\">Find</span>\n                </button>\n                <div class=\"splitToolbarButton hiddenSmallView\">\n                  <button class=\"toolbarButton pageUp\" title=\"Previous Page\" id=\"previous\" tabindex=\"13\" data-l10n-id=\"previous\">\n                    <span data-l10n-id=\"previous_label\">Previous</span>\n                  </button>\n                  <div class=\"splitToolbarButtonSeparator\"></div>\n                  <button class=\"toolbarButton pageDown\" title=\"Next Page\" id=\"next\" tabindex=\"14\" data-l10n-id=\"next\">\n                    <span data-l10n-id=\"next_label\">Next</span>\n                  </button>\n                </div>\n                <input type=\"number\" id=\"pageNumber\" class=\"toolbarField pageNumber\" title=\"Page\" value=\"1\" size=\"4\" min=\"1\" tabindex=\"15\" data-l10n-id=\"page\" autocomplete=\"off\">\n                <span id=\"numPages\" class=\"toolbarLabel\"></span>\n              </div>\n              <div id=\"toolbarViewerRight\">\n                <button id=\"presentationMode\" class=\"toolbarButton presentationMode hiddenLargeView\" title=\"Switch to Presentation Mode\" tabindex=\"31\" data-l10n-id=\"presentation_mode\">\n                  <span data-l10n-id=\"presentation_mode_label\">Presentation Mode</span>\n                </button>\n\n                <button id=\"openFile\" class=\"toolbarButton openFile hiddenLargeView\" title=\"Open File\" tabindex=\"32\" data-l10n-id=\"open_file\">\n                  <span data-l10n-id=\"open_file_label\">Open</span>\n                </button>\n\n                <button id=\"print\" class=\"toolbarButton print hiddenMediumView\" title=\"Print\" tabindex=\"33\" data-l10n-id=\"print\">\n                  <span data-l10n-id=\"print_label\">Print</span>\n                </button>\n\n                <button id=\"download\" class=\"toolbarButton download hiddenMediumView\" title=\"Download\" tabindex=\"34\" data-l10n-id=\"download\">\n                  <span data-l10n-id=\"download_label\">Download</span>\n                </button>\n                <a href=\"#\" id=\"viewBookmark\" class=\"toolbarButton bookmark hiddenSmallView\" title=\"Current view (copy or open in new window)\" tabindex=\"35\" data-l10n-id=\"bookmark\">\n                  <span data-l10n-id=\"bookmark_label\">Current View</span>\n                </a>\n\n                <div class=\"verticalToolbarSeparator hiddenSmallView\"></div>\n\n                <button id=\"secondaryToolbarToggle\" class=\"toolbarButton\" title=\"Tools\" tabindex=\"36\" data-l10n-id=\"tools\" aria-expanded=\"false\" aria-controls=\"secondaryToolbar\">\n                  <span data-l10n-id=\"tools_label\">Tools</span>\n                </button>\n              </div>\n              <div id=\"toolbarViewerMiddle\">\n                <div class=\"splitToolbarButton\">\n                  <button id=\"zoomOut\" class=\"toolbarButton zoomOut\" title=\"Zoom Out\" tabindex=\"21\" data-l10n-id=\"zoom_out\">\n                    <span data-l10n-id=\"zoom_out_label\">Zoom Out</span>\n                  </button>\n                  <div class=\"splitToolbarButtonSeparator\"></div>\n                  <button id=\"zoomIn\" class=\"toolbarButton zoomIn\" title=\"Zoom In\" tabindex=\"22\" data-l10n-id=\"zoom_in\">\n                    <span data-l10n-id=\"zoom_in_label\">Zoom In</span>\n                   </button>\n                </div>\n                <span id=\"scaleSelectContainer\" class=\"dropdownToolbarButton\">\n                  <select id=\"scaleSelect\" title=\"Zoom\" tabindex=\"23\" data-l10n-id=\"zoom\">\n                    <option id=\"pageAutoOption\" title=\"\" value=\"auto\" selected=\"selected\" data-l10n-id=\"page_scale_auto\">Automatic Zoom</option>\n                    <option id=\"pageActualOption\" title=\"\" value=\"page-actual\" data-l10n-id=\"page_scale_actual\">Actual Size</option>\n                    <option id=\"pageFitOption\" title=\"\" value=\"page-fit\" data-l10n-id=\"page_scale_fit\">Page Fit</option>\n                    <option id=\"pageWidthOption\" title=\"\" value=\"page-width\" data-l10n-id=\"page_scale_width\">Page Width</option>\n                    <option id=\"customScaleOption\" title=\"\" value=\"custom\" disabled=\"disabled\" hidden=\"true\"></option>\n                    <option title=\"\" value=\"0.5\" data-l10n-id=\"page_scale_percent\" data-l10n-args='{ \"scale\": 50 }'>50%</option>\n                    <option title=\"\" value=\"0.75\" data-l10n-id=\"page_scale_percent\" data-l10n-args='{ \"scale\": 75 }'>75%</option>\n                    <option title=\"\" value=\"1\" data-l10n-id=\"page_scale_percent\" data-l10n-args='{ \"scale\": 100 }'>100%</option>\n                    <option title=\"\" value=\"1.25\" data-l10n-id=\"page_scale_percent\" data-l10n-args='{ \"scale\": 125 }'>125%</option>\n                    <option title=\"\" value=\"1.5\" data-l10n-id=\"page_scale_percent\" data-l10n-args='{ \"scale\": 150 }'>150%</option>\n                    <option title=\"\" value=\"2\" data-l10n-id=\"page_scale_percent\" data-l10n-args='{ \"scale\": 200 }'>200%</option>\n                    <option title=\"\" value=\"3\" data-l10n-id=\"page_scale_percent\" data-l10n-args='{ \"scale\": 300 }'>300%</option>\n                    <option title=\"\" value=\"4\" data-l10n-id=\"page_scale_percent\" data-l10n-args='{ \"scale\": 400 }'>400%</option>\n                  </select>\n                </span>\n              </div>\n            </div>\n            <div id=\"loadingBar\">\n              <div class=\"progress\">\n                <div class=\"glimmer\">\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div id=\"viewerContainer\" tabindex=\"0\">\n          <div id=\"viewer\" class=\"pdfViewer\"></div>\n        </div>\n\n        <div id=\"errorWrapper\" hidden='true'>\n          <div id=\"errorMessageLeft\">\n            <span id=\"errorMessage\"></span>\n            <button id=\"errorShowMore\" data-l10n-id=\"error_more_info\">\n              More Information\n            </button>\n            <button id=\"errorShowLess\" data-l10n-id=\"error_less_info\" hidden='true'>\n              Less Information\n            </button>\n          </div>\n          <div id=\"errorMessageRight\">\n            <button id=\"errorClose\" data-l10n-id=\"error_close\">\n              Close\n            </button>\n          </div>\n          <div class=\"clearBoth\"></div>\n          <textarea id=\"errorMoreInfo\" hidden='true' readonly=\"readonly\"></textarea>\n        </div>\n      </div> <!-- mainContainer -->\n\n      <div id=\"overlayContainer\" class=\"hidden\">\n        <div id=\"passwordOverlay\" class=\"container hidden\">\n          <div class=\"dialog\">\n            <div class=\"row\">\n              <p id=\"passwordText\" data-l10n-id=\"password_label\">Enter the password to open this PDF file:</p>\n            </div>\n            <div class=\"row\">\n              <input type=\"password\" id=\"password\" class=\"toolbarField\">\n            </div>\n            <div class=\"buttonRow\">\n              <button id=\"passwordCancel\" class=\"overlayButton\"><span data-l10n-id=\"password_cancel\">Cancel</span></button>\n              <button id=\"passwordSubmit\" class=\"overlayButton\"><span data-l10n-id=\"password_ok\">OK</span></button>\n            </div>\n          </div>\n        </div>\n        <div id=\"documentPropertiesOverlay\" class=\"container hidden\">\n          <div class=\"dialog\">\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_file_name\">File name:</span> <p id=\"fileNameField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_file_size\">File size:</span> <p id=\"fileSizeField\">-</p>\n            </div>\n            <div class=\"separator\"></div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_title\">Title:</span> <p id=\"titleField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_author\">Author:</span> <p id=\"authorField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_subject\">Subject:</span> <p id=\"subjectField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_keywords\">Keywords:</span> <p id=\"keywordsField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_creation_date\">Creation Date:</span> <p id=\"creationDateField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_modification_date\">Modification Date:</span> <p id=\"modificationDateField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_creator\">Creator:</span> <p id=\"creatorField\">-</p>\n            </div>\n            <div class=\"separator\"></div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_producer\">PDF Producer:</span> <p id=\"producerField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_version\">PDF Version:</span> <p id=\"versionField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_page_count\">Page Count:</span> <p id=\"pageCountField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_page_size\">Page Size:</span> <p id=\"pageSizeField\">-</p>\n            </div>\n            <div class=\"separator\"></div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_linearized\">Fast Web View:</span> <p id=\"linearizedField\">-</p>\n            </div>\n            <div class=\"buttonRow\">\n              <button id=\"documentPropertiesClose\" class=\"overlayButton\"><span data-l10n-id=\"document_properties_close\">Close</span></button>\n            </div>\n          </div>\n        </div>\n        <div id=\"printServiceOverlay\" class=\"container hidden\">\n          <div class=\"dialog\">\n            <div class=\"row\">\n              <span data-l10n-id=\"print_progress_message\">Preparing document for printing…</span>\n            </div>\n            <div class=\"row\">\n              <progress value=\"0\" max=\"100\"></progress>\n              <span data-l10n-id=\"print_progress_percent\" data-l10n-args='{ \"progress\": 0 }' class=\"relative-progress\">0%</span>\n            </div>\n            <div class=\"buttonRow\">\n              <button id=\"printCancel\" class=\"overlayButton\"><span data-l10n-id=\"print_progress_close\">Cancel</span></button>\n            </div>\n          </div>\n        </div>\n      </div>  <!-- overlayContainer -->\n\n    </div> <!-- outerContainer -->\n    <div id=\"printContainer\"></div>\n  </body>\n</html>\n"
  },
  {
    "path": "lib/pdf.js/web/viewer.js",
    "content": "/**\n * @licstart The following is the entire license notice for the\n * Javascript code in this page\n *\n * Copyright 2021 Mozilla Foundation\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 * @licend The above is the entire license notice for the\n * Javascript code in this page\n */\n\n/******/ (() => { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \tvar __webpack_modules__ = ([\n/* 0 */,\n/* 1 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.OptionKind = exports.AppOptions = void 0;\n\nvar _viewer_compatibility = __webpack_require__(2);\n\nconst OptionKind = {\n  VIEWER: 0x02,\n  API: 0x04,\n  WORKER: 0x08,\n  PREFERENCE: 0x80\n};\nexports.OptionKind = OptionKind;\nconst defaultOptions = {\n  cursorToolOnLoad: {\n    value: 0,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE\n  },\n  defaultUrl: {\n    value: \"compressed.tracemonkey-pldi-09.pdf\",\n    kind: OptionKind.VIEWER\n  },\n  defaultZoomValue: {\n    value: \"\",\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE\n  },\n  disableHistory: {\n    value: false,\n    kind: OptionKind.VIEWER\n  },\n  disablePageLabels: {\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE\n  },\n  enablePermissions: {\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE\n  },\n  enablePrintAutoRotate: {\n    value: true,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE\n  },\n  enableScripting: {\n    value: true,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE\n  },\n  enableWebGL: {\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE\n  },\n  externalLinkRel: {\n    value: \"noopener noreferrer nofollow\",\n    kind: OptionKind.VIEWER\n  },\n  externalLinkTarget: {\n    value: 0,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE\n  },\n  historyUpdateUrl: {\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE\n  },\n  ignoreDestinationZoom: {\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE\n  },\n  imageResourcesPath: {\n    value: \"./images/\",\n    kind: OptionKind.VIEWER\n  },\n  maxCanvasPixels: {\n    value: 16777216,\n    compatibility: _viewer_compatibility.viewerCompatibilityParams.maxCanvasPixels,\n    kind: OptionKind.VIEWER\n  },\n  pdfBugEnabled: {\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE\n  },\n  printResolution: {\n    value: 150,\n    kind: OptionKind.VIEWER\n  },\n  renderer: {\n    value: \"canvas\",\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE\n  },\n  renderInteractiveForms: {\n    value: true,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE\n  },\n  sidebarViewOnLoad: {\n    value: -1,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE\n  },\n  scrollModeOnLoad: {\n    value: -1,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE\n  },\n  spreadModeOnLoad: {\n    value: -1,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE\n  },\n  textLayerMode: {\n    value: 1,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE\n  },\n  useOnlyCssZoom: {\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE\n  },\n  viewerCssTheme: {\n    value: 0,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE\n  },\n  viewOnLoad: {\n    value: 0,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE\n  },\n  cMapPacked: {\n    value: true,\n    kind: OptionKind.API\n  },\n  cMapUrl: {\n    value: \"../web/cmaps/\",\n    kind: OptionKind.API\n  },\n  disableAutoFetch: {\n    value: false,\n    kind: OptionKind.API + OptionKind.PREFERENCE\n  },\n  disableFontFace: {\n    value: false,\n    kind: OptionKind.API + OptionKind.PREFERENCE\n  },\n  disableRange: {\n    value: false,\n    kind: OptionKind.API + OptionKind.PREFERENCE\n  },\n  disableStream: {\n    value: false,\n    kind: OptionKind.API + OptionKind.PREFERENCE\n  },\n  docBaseUrl: {\n    value: \"\",\n    kind: OptionKind.API\n  },\n  enableXfa: {\n    value: false,\n    kind: OptionKind.API\n  },\n  fontExtraProperties: {\n    value: false,\n    kind: OptionKind.API\n  },\n  isEvalSupported: {\n    value: true,\n    kind: OptionKind.API\n  },\n  maxImageSize: {\n    value: -1,\n    kind: OptionKind.API\n  },\n  pdfBug: {\n    value: false,\n    kind: OptionKind.API\n  },\n  verbosity: {\n    value: 1,\n    kind: OptionKind.API\n  },\n  workerPort: {\n    value: null,\n    kind: OptionKind.WORKER\n  },\n  workerSrc: {\n    value: \"../build/pdf.worker.js\",\n    kind: OptionKind.WORKER\n  }\n};\n{\n  defaultOptions.disablePreferences = {\n    value: false,\n    kind: OptionKind.VIEWER\n  };\n  defaultOptions.locale = {\n    value: typeof navigator !== \"undefined\" ? navigator.language : \"en-US\",\n    kind: OptionKind.VIEWER\n  };\n  defaultOptions.sandboxBundleSrc = {\n    value: \"../build/pdf.sandbox.js\",\n    kind: OptionKind.VIEWER\n  };\n}\nconst userOptions = Object.create(null);\n\nclass AppOptions {\n  constructor() {\n    throw new Error(\"Cannot initialize AppOptions.\");\n  }\n\n  static get(name) {\n    const userOption = userOptions[name];\n\n    if (userOption !== undefined) {\n      return userOption;\n    }\n\n    const defaultOption = defaultOptions[name];\n\n    if (defaultOption !== undefined) {\n      return defaultOption.compatibility ?? defaultOption.value;\n    }\n\n    return undefined;\n  }\n\n  static getAll(kind = null) {\n    const options = Object.create(null);\n\n    for (const name in defaultOptions) {\n      const defaultOption = defaultOptions[name];\n\n      if (kind) {\n        if ((kind & defaultOption.kind) === 0) {\n          continue;\n        }\n\n        if (kind === OptionKind.PREFERENCE) {\n          const value = defaultOption.value,\n                valueType = typeof value;\n\n          if (valueType === \"boolean\" || valueType === \"string\" || valueType === \"number\" && Number.isInteger(value)) {\n            options[name] = value;\n            continue;\n          }\n\n          throw new Error(`Invalid type for preference: ${name}`);\n        }\n      }\n\n      const userOption = userOptions[name];\n      options[name] = userOption !== undefined ? userOption : defaultOption.compatibility ?? defaultOption.value;\n    }\n\n    return options;\n  }\n\n  static set(name, value) {\n    userOptions[name] = value;\n  }\n\n  static setAll(options) {\n    for (const name in options) {\n      userOptions[name] = options[name];\n    }\n  }\n\n  static remove(name) {\n    delete userOptions[name];\n  }\n\n}\n\nexports.AppOptions = AppOptions;\n\n/***/ }),\n/* 2 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.viewerCompatibilityParams = void 0;\nconst compatibilityParams = Object.create(null);\n{\n  const userAgent = typeof navigator !== \"undefined\" && navigator.userAgent || \"\";\n  const platform = typeof navigator !== \"undefined\" && navigator.platform || \"\";\n  const maxTouchPoints = typeof navigator !== \"undefined\" && navigator.maxTouchPoints || 1;\n  const isAndroid = /Android/.test(userAgent);\n  const isIOS = /\\b(iPad|iPhone|iPod)(?=;)/.test(userAgent) || platform === \"MacIntel\" && maxTouchPoints > 1;\n  const isIOSChrome = /CriOS/.test(userAgent);\n\n  (function checkOnBlobSupport() {\n    if (isIOSChrome) {\n      compatibilityParams.disableCreateObjectURL = true;\n    }\n  })();\n\n  (function checkCanvasSizeLimitation() {\n    if (isIOS || isAndroid) {\n      compatibilityParams.maxCanvasPixels = 5242880;\n    }\n  })();\n}\nconst viewerCompatibilityParams = Object.freeze(compatibilityParams);\nexports.viewerCompatibilityParams = viewerCompatibilityParams;\n\n/***/ }),\n/* 3 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFViewerApplication = exports.PDFPrintServiceFactory = exports.DefaultExternalServices = void 0;\n\nvar _ui_utils = __webpack_require__(4);\n\nvar _app_options = __webpack_require__(1);\n\nvar _pdfjsLib = __webpack_require__(5);\n\nvar _pdf_cursor_tools = __webpack_require__(6);\n\nvar _pdf_rendering_queue = __webpack_require__(8);\n\nvar _overlay_manager = __webpack_require__(9);\n\nvar _password_prompt = __webpack_require__(10);\n\nvar _pdf_attachment_viewer = __webpack_require__(11);\n\nvar _pdf_document_properties = __webpack_require__(13);\n\nvar _pdf_find_bar = __webpack_require__(14);\n\nvar _pdf_find_controller = __webpack_require__(15);\n\nvar _pdf_history = __webpack_require__(17);\n\nvar _pdf_layer_viewer = __webpack_require__(18);\n\nvar _pdf_link_service = __webpack_require__(19);\n\nvar _pdf_outline_viewer = __webpack_require__(20);\n\nvar _pdf_presentation_mode = __webpack_require__(21);\n\nvar _pdf_scripting_manager = __webpack_require__(22);\n\nvar _pdf_sidebar = __webpack_require__(23);\n\nvar _pdf_sidebar_resizer = __webpack_require__(24);\n\nvar _pdf_thumbnail_viewer = __webpack_require__(25);\n\nvar _pdf_viewer = __webpack_require__(27);\n\nvar _secondary_toolbar = __webpack_require__(34);\n\nvar _toolbar = __webpack_require__(36);\n\nvar _viewer_compatibility = __webpack_require__(2);\n\nvar _view_history = __webpack_require__(37);\n\nconst DEFAULT_SCALE_DELTA = 1.1;\nconst DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000;\nconst FORCE_PAGES_LOADED_TIMEOUT = 10000;\nconst WHEEL_ZOOM_DISABLED_TIMEOUT = 1000;\nconst ENABLE_PERMISSIONS_CLASS = \"enablePermissions\";\nconst ViewOnLoad = {\n  UNKNOWN: -1,\n  PREVIOUS: 0,\n  INITIAL: 1\n};\nconst ViewerCssTheme = {\n  AUTOMATIC: 0,\n  LIGHT: 1,\n  DARK: 2\n};\nconst KNOWN_VERSIONS = [\"1.0\", \"1.1\", \"1.2\", \"1.3\", \"1.4\", \"1.5\", \"1.6\", \"1.7\", \"1.8\", \"1.9\", \"2.0\", \"2.1\", \"2.2\", \"2.3\"];\nconst KNOWN_GENERATORS = [\"acrobat distiller\", \"acrobat pdfwriter\", \"adobe livecycle\", \"adobe pdf library\", \"adobe photoshop\", \"ghostscript\", \"tcpdf\", \"cairo\", \"dvipdfm\", \"dvips\", \"pdftex\", \"pdfkit\", \"itext\", \"prince\", \"quarkxpress\", \"mac os x\", \"microsoft\", \"openoffice\", \"oracle\", \"luradocument\", \"pdf-xchange\", \"antenna house\", \"aspose.cells\", \"fpdf\"];\n\nclass DefaultExternalServices {\n  constructor() {\n    throw new Error(\"Cannot initialize DefaultExternalServices.\");\n  }\n\n  static updateFindControlState(data) {}\n\n  static updateFindMatchesCount(data) {}\n\n  static initPassiveLoading(callbacks) {}\n\n  static async fallback(data) {}\n\n  static reportTelemetry(data) {}\n\n  static createDownloadManager(options) {\n    throw new Error(\"Not implemented: createDownloadManager\");\n  }\n\n  static createPreferences() {\n    throw new Error(\"Not implemented: createPreferences\");\n  }\n\n  static createL10n(options) {\n    throw new Error(\"Not implemented: createL10n\");\n  }\n\n  static createScripting(options) {\n    throw new Error(\"Not implemented: createScripting\");\n  }\n\n  static get supportsIntegratedFind() {\n    return (0, _pdfjsLib.shadow)(this, \"supportsIntegratedFind\", false);\n  }\n\n  static get supportsDocumentFonts() {\n    return (0, _pdfjsLib.shadow)(this, \"supportsDocumentFonts\", true);\n  }\n\n  static get supportedMouseWheelZoomModifierKeys() {\n    return (0, _pdfjsLib.shadow)(this, \"supportedMouseWheelZoomModifierKeys\", {\n      ctrlKey: true,\n      metaKey: true\n    });\n  }\n\n  static get isInAutomation() {\n    return (0, _pdfjsLib.shadow)(this, \"isInAutomation\", false);\n  }\n\n}\n\nexports.DefaultExternalServices = DefaultExternalServices;\nconst PDFViewerApplication = {\n  initialBookmark: document.location.hash.substring(1),\n  _initializedCapability: (0, _pdfjsLib.createPromiseCapability)(),\n  fellback: false,\n  appConfig: null,\n  pdfDocument: null,\n  pdfLoadingTask: null,\n  printService: null,\n  pdfViewer: null,\n  pdfThumbnailViewer: null,\n  pdfRenderingQueue: null,\n  pdfPresentationMode: null,\n  pdfDocumentProperties: null,\n  pdfLinkService: null,\n  pdfHistory: null,\n  pdfSidebar: null,\n  pdfSidebarResizer: null,\n  pdfOutlineViewer: null,\n  pdfAttachmentViewer: null,\n  pdfLayerViewer: null,\n  pdfCursorTools: null,\n  pdfScriptingManager: null,\n  store: null,\n  downloadManager: null,\n  overlayManager: null,\n  preferences: null,\n  toolbar: null,\n  secondaryToolbar: null,\n  eventBus: null,\n  l10n: null,\n  isInitialViewSet: false,\n  downloadComplete: false,\n  isViewerEmbedded: window.parent !== window,\n  url: \"\",\n  baseUrl: \"\",\n  externalServices: DefaultExternalServices,\n  _boundEvents: Object.create(null),\n  documentInfo: null,\n  metadata: null,\n  _contentDispositionFilename: null,\n  _contentLength: null,\n  triggerDelayedFallback: null,\n  _saveInProgress: false,\n  _wheelUnusedTicks: 0,\n  _idleCallbacks: new Set(),\n\n  async initialize(appConfig) {\n    this.preferences = this.externalServices.createPreferences();\n    this.appConfig = appConfig;\n    await this._readPreferences();\n    await this._parseHashParameters();\n\n    this._forceCssTheme();\n\n    await this._initializeL10n();\n\n    if (this.isViewerEmbedded && _app_options.AppOptions.get(\"externalLinkTarget\") === _pdfjsLib.LinkTarget.NONE) {\n      _app_options.AppOptions.set(\"externalLinkTarget\", _pdfjsLib.LinkTarget.TOP);\n    }\n\n    await this._initializeViewerComponents();\n    this.bindEvents();\n    this.bindWindowEvents();\n    const appContainer = appConfig.appContainer || document.documentElement;\n    this.l10n.translate(appContainer).then(() => {\n      this.eventBus.dispatch(\"localized\", {\n        source: this\n      });\n    });\n\n    this._initializedCapability.resolve();\n  },\n\n  async _readPreferences() {\n    if (_app_options.AppOptions.get(\"disablePreferences\")) {\n      return;\n    }\n\n    try {\n      _app_options.AppOptions.setAll(await this.preferences.getAll());\n    } catch (reason) {\n      console.error(`_readPreferences: \"${reason?.message}\".`);\n    }\n  },\n\n  async _parseHashParameters() {\n    if (!_app_options.AppOptions.get(\"pdfBugEnabled\")) {\n      return undefined;\n    }\n\n    const hash = document.location.hash.substring(1);\n\n    if (!hash) {\n      return undefined;\n    }\n\n    const hashParams = (0, _ui_utils.parseQueryString)(hash),\n          waitOn = [];\n\n    if (\"disableworker\" in hashParams && hashParams.disableworker === \"true\") {\n      waitOn.push(loadFakeWorker());\n    }\n\n    if (\"disablerange\" in hashParams) {\n      _app_options.AppOptions.set(\"disableRange\", hashParams.disablerange === \"true\");\n    }\n\n    if (\"disablestream\" in hashParams) {\n      _app_options.AppOptions.set(\"disableStream\", hashParams.disablestream === \"true\");\n    }\n\n    if (\"disableautofetch\" in hashParams) {\n      _app_options.AppOptions.set(\"disableAutoFetch\", hashParams.disableautofetch === \"true\");\n    }\n\n    if (\"disablefontface\" in hashParams) {\n      _app_options.AppOptions.set(\"disableFontFace\", hashParams.disablefontface === \"true\");\n    }\n\n    if (\"disablehistory\" in hashParams) {\n      _app_options.AppOptions.set(\"disableHistory\", hashParams.disablehistory === \"true\");\n    }\n\n    if (\"webgl\" in hashParams) {\n      _app_options.AppOptions.set(\"enableWebGL\", hashParams.webgl === \"true\");\n    }\n\n    if (\"verbosity\" in hashParams) {\n      _app_options.AppOptions.set(\"verbosity\", hashParams.verbosity | 0);\n    }\n\n    if (\"textlayer\" in hashParams) {\n      switch (hashParams.textlayer) {\n        case \"off\":\n          _app_options.AppOptions.set(\"textLayerMode\", _ui_utils.TextLayerMode.DISABLE);\n\n          break;\n\n        case \"visible\":\n        case \"shadow\":\n        case \"hover\":\n          const viewer = this.appConfig.viewerContainer;\n          viewer.classList.add(\"textLayer-\" + hashParams.textlayer);\n          break;\n      }\n    }\n\n    if (\"pdfbug\" in hashParams) {\n      _app_options.AppOptions.set(\"pdfBug\", true);\n\n      _app_options.AppOptions.set(\"fontExtraProperties\", true);\n\n      const enabled = hashParams.pdfbug.split(\",\");\n      waitOn.push(loadAndEnablePDFBug(enabled));\n    }\n\n    if (\"locale\" in hashParams) {\n      _app_options.AppOptions.set(\"locale\", hashParams.locale);\n    }\n\n    if (waitOn.length === 0) {\n      return undefined;\n    }\n\n    return Promise.all(waitOn).catch(reason => {\n      console.error(`_parseHashParameters: \"${reason.message}\".`);\n    });\n  },\n\n  async _initializeL10n() {\n    this.l10n = this.externalServices.createL10n({\n      locale: _app_options.AppOptions.get(\"locale\")\n    });\n    const dir = await this.l10n.getDirection();\n    document.getElementsByTagName(\"html\")[0].dir = dir;\n  },\n\n  _forceCssTheme() {\n    const cssTheme = _app_options.AppOptions.get(\"viewerCssTheme\");\n\n    if (cssTheme === ViewerCssTheme.AUTOMATIC || !Object.values(ViewerCssTheme).includes(cssTheme)) {\n      return;\n    }\n\n    try {\n      const styleSheet = document.styleSheets[0];\n      const cssRules = styleSheet?.cssRules || [];\n\n      for (let i = 0, ii = cssRules.length; i < ii; i++) {\n        const rule = cssRules[i];\n\n        if (rule instanceof CSSMediaRule && rule.media?.[0] === \"(prefers-color-scheme: dark)\") {\n          if (cssTheme === ViewerCssTheme.LIGHT) {\n            styleSheet.deleteRule(i);\n            return;\n          }\n\n          const darkRules = /^@media \\(prefers-color-scheme: dark\\) {\\n\\s*([\\w\\s-.,:;/\\\\{}()]+)\\n}$/.exec(rule.cssText);\n\n          if (darkRules?.[1]) {\n            styleSheet.deleteRule(i);\n            styleSheet.insertRule(darkRules[1], i);\n          }\n\n          return;\n        }\n      }\n    } catch (reason) {\n      console.error(`_forceCssTheme: \"${reason?.message}\".`);\n    }\n  },\n\n  async _initializeViewerComponents() {\n    const appConfig = this.appConfig;\n    const eventBus = appConfig.eventBus || new _ui_utils.EventBus({\n      isInAutomation: this.externalServices.isInAutomation\n    });\n    this.eventBus = eventBus;\n    this.overlayManager = new _overlay_manager.OverlayManager();\n    const pdfRenderingQueue = new _pdf_rendering_queue.PDFRenderingQueue();\n    pdfRenderingQueue.onIdle = this._cleanup.bind(this);\n    this.pdfRenderingQueue = pdfRenderingQueue;\n    const pdfLinkService = new _pdf_link_service.PDFLinkService({\n      eventBus,\n      externalLinkTarget: _app_options.AppOptions.get(\"externalLinkTarget\"),\n      externalLinkRel: _app_options.AppOptions.get(\"externalLinkRel\"),\n      ignoreDestinationZoom: _app_options.AppOptions.get(\"ignoreDestinationZoom\")\n    });\n    this.pdfLinkService = pdfLinkService;\n    const downloadManager = this.externalServices.createDownloadManager();\n    this.downloadManager = downloadManager;\n    const findController = new _pdf_find_controller.PDFFindController({\n      linkService: pdfLinkService,\n      eventBus\n    });\n    this.findController = findController;\n    const pdfScriptingManager = new _pdf_scripting_manager.PDFScriptingManager({\n      eventBus,\n      sandboxBundleSrc: _app_options.AppOptions.get(\"sandboxBundleSrc\"),\n      scriptingFactory: this.externalServices,\n      docPropertiesLookup: this._scriptingDocProperties.bind(this)\n    });\n    this.pdfScriptingManager = pdfScriptingManager;\n    const container = appConfig.mainContainer;\n    const viewer = appConfig.viewerContainer;\n    this.pdfViewer = new _pdf_viewer.PDFViewer({\n      container,\n      viewer,\n      eventBus,\n      renderingQueue: pdfRenderingQueue,\n      linkService: pdfLinkService,\n      downloadManager,\n      findController,\n      scriptingManager: pdfScriptingManager,\n      renderer: _app_options.AppOptions.get(\"renderer\"),\n      enableWebGL: _app_options.AppOptions.get(\"enableWebGL\"),\n      l10n: this.l10n,\n      textLayerMode: _app_options.AppOptions.get(\"textLayerMode\"),\n      imageResourcesPath: _app_options.AppOptions.get(\"imageResourcesPath\"),\n      renderInteractiveForms: _app_options.AppOptions.get(\"renderInteractiveForms\"),\n      enablePrintAutoRotate: _app_options.AppOptions.get(\"enablePrintAutoRotate\"),\n      useOnlyCssZoom: _app_options.AppOptions.get(\"useOnlyCssZoom\"),\n      maxCanvasPixels: _app_options.AppOptions.get(\"maxCanvasPixels\"),\n      enableScripting: _app_options.AppOptions.get(\"enableScripting\")\n    });\n    pdfRenderingQueue.setViewer(this.pdfViewer);\n    pdfLinkService.setViewer(this.pdfViewer);\n    pdfScriptingManager.setViewer(this.pdfViewer);\n    this.pdfThumbnailViewer = new _pdf_thumbnail_viewer.PDFThumbnailViewer({\n      container: appConfig.sidebar.thumbnailView,\n      eventBus,\n      renderingQueue: pdfRenderingQueue,\n      linkService: pdfLinkService,\n      l10n: this.l10n\n    });\n    pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer);\n    this.pdfHistory = new _pdf_history.PDFHistory({\n      linkService: pdfLinkService,\n      eventBus\n    });\n    pdfLinkService.setHistory(this.pdfHistory);\n\n    if (!this.supportsIntegratedFind) {\n      this.findBar = new _pdf_find_bar.PDFFindBar(appConfig.findBar, eventBus, this.l10n);\n    }\n\n    this.pdfDocumentProperties = new _pdf_document_properties.PDFDocumentProperties(appConfig.documentProperties, this.overlayManager, eventBus, this.l10n);\n    this.pdfCursorTools = new _pdf_cursor_tools.PDFCursorTools({\n      container,\n      eventBus,\n      cursorToolOnLoad: _app_options.AppOptions.get(\"cursorToolOnLoad\")\n    });\n    this.toolbar = new _toolbar.Toolbar(appConfig.toolbar, eventBus, this.l10n);\n    this.secondaryToolbar = new _secondary_toolbar.SecondaryToolbar(appConfig.secondaryToolbar, container, eventBus);\n\n    if (this.supportsFullscreen) {\n      this.pdfPresentationMode = new _pdf_presentation_mode.PDFPresentationMode({\n        container,\n        pdfViewer: this.pdfViewer,\n        eventBus\n      });\n    }\n\n    this.passwordPrompt = new _password_prompt.PasswordPrompt(appConfig.passwordOverlay, this.overlayManager, this.l10n, this.isViewerEmbedded);\n    this.pdfOutlineViewer = new _pdf_outline_viewer.PDFOutlineViewer({\n      container: appConfig.sidebar.outlineView,\n      eventBus,\n      linkService: pdfLinkService\n    });\n    this.pdfAttachmentViewer = new _pdf_attachment_viewer.PDFAttachmentViewer({\n      container: appConfig.sidebar.attachmentsView,\n      eventBus,\n      downloadManager\n    });\n    this.pdfLayerViewer = new _pdf_layer_viewer.PDFLayerViewer({\n      container: appConfig.sidebar.layersView,\n      eventBus,\n      l10n: this.l10n\n    });\n    this.pdfSidebar = new _pdf_sidebar.PDFSidebar({\n      elements: appConfig.sidebar,\n      pdfViewer: this.pdfViewer,\n      pdfThumbnailViewer: this.pdfThumbnailViewer,\n      eventBus,\n      l10n: this.l10n\n    });\n    this.pdfSidebar.onToggled = this.forceRendering.bind(this);\n    this.pdfSidebarResizer = new _pdf_sidebar_resizer.PDFSidebarResizer(appConfig.sidebarResizer, eventBus, this.l10n);\n  },\n\n  run(config) {\n    this.initialize(config).then(webViewerInitialized);\n  },\n\n  get initialized() {\n    return this._initializedCapability.settled;\n  },\n\n  get initializedPromise() {\n    return this._initializedCapability.promise;\n  },\n\n  zoomIn(ticks) {\n    if (this.pdfViewer.isInPresentationMode) {\n      return;\n    }\n\n    let newScale = this.pdfViewer.currentScale;\n\n    do {\n      newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2);\n      newScale = Math.ceil(newScale * 10) / 10;\n      newScale = Math.min(_ui_utils.MAX_SCALE, newScale);\n    } while (--ticks > 0 && newScale < _ui_utils.MAX_SCALE);\n\n    this.pdfViewer.currentScaleValue = newScale;\n  },\n\n  zoomOut(ticks) {\n    if (this.pdfViewer.isInPresentationMode) {\n      return;\n    }\n\n    let newScale = this.pdfViewer.currentScale;\n\n    do {\n      newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2);\n      newScale = Math.floor(newScale * 10) / 10;\n      newScale = Math.max(_ui_utils.MIN_SCALE, newScale);\n    } while (--ticks > 0 && newScale > _ui_utils.MIN_SCALE);\n\n    this.pdfViewer.currentScaleValue = newScale;\n  },\n\n  zoomReset() {\n    if (this.pdfViewer.isInPresentationMode) {\n      return;\n    }\n\n    this.pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;\n  },\n\n  get pagesCount() {\n    return this.pdfDocument ? this.pdfDocument.numPages : 0;\n  },\n\n  get page() {\n    return this.pdfViewer.currentPageNumber;\n  },\n\n  set page(val) {\n    this.pdfViewer.currentPageNumber = val;\n  },\n\n  get supportsPrinting() {\n    return PDFPrintServiceFactory.instance.supportsPrinting;\n  },\n\n  get supportsFullscreen() {\n    const doc = document.documentElement;\n    let support = !!(doc.requestFullscreen || doc.mozRequestFullScreen || doc.webkitRequestFullScreen);\n\n    if (document.fullscreenEnabled === false || document.mozFullScreenEnabled === false || document.webkitFullscreenEnabled === false) {\n      support = false;\n    }\n\n    return (0, _pdfjsLib.shadow)(this, \"supportsFullscreen\", support);\n  },\n\n  get supportsIntegratedFind() {\n    return this.externalServices.supportsIntegratedFind;\n  },\n\n  get supportsDocumentFonts() {\n    return this.externalServices.supportsDocumentFonts;\n  },\n\n  get loadingBar() {\n    const bar = new _ui_utils.ProgressBar(\"#loadingBar\");\n    return (0, _pdfjsLib.shadow)(this, \"loadingBar\", bar);\n  },\n\n  get supportedMouseWheelZoomModifierKeys() {\n    return this.externalServices.supportedMouseWheelZoomModifierKeys;\n  },\n\n  initPassiveLoading() {\n    throw new Error(\"Not implemented: initPassiveLoading\");\n  },\n\n  setTitleUsingUrl(url = \"\") {\n    this.url = url;\n    this.baseUrl = url.split(\"#\")[0];\n    let title = (0, _pdfjsLib.getPdfFilenameFromUrl)(url, \"\");\n\n    if (!title) {\n      try {\n        title = decodeURIComponent((0, _pdfjsLib.getFilenameFromUrl)(url)) || url;\n      } catch (ex) {\n        title = url;\n      }\n    }\n\n    this.setTitle(title);\n  },\n\n  setTitle(title) {\n    if (this.isViewerEmbedded) {\n      return;\n    }\n\n    document.title = title;\n  },\n\n  get _docFilename() {\n    return this._contentDispositionFilename || (0, _pdfjsLib.getPdfFilenameFromUrl)(this.url);\n  },\n\n  _cancelIdleCallbacks() {\n    if (!this._idleCallbacks.size) {\n      return;\n    }\n\n    for (const callback of this._idleCallbacks) {\n      window.cancelIdleCallback(callback);\n    }\n\n    this._idleCallbacks.clear();\n  },\n\n  async close() {\n    this._unblockDocumentLoadEvent();\n\n    const {\n      container\n    } = this.appConfig.errorWrapper;\n    container.hidden = true;\n\n    if (!this.pdfLoadingTask) {\n      return;\n    }\n\n    if (this.pdfDocument?.annotationStorage.size > 0 && this._annotationStorageModified) {\n      try {\n        await this.save({\n          sourceEventType: \"save\"\n        });\n      } catch (reason) {}\n    }\n\n    const promises = [];\n    promises.push(this.pdfLoadingTask.destroy());\n    this.pdfLoadingTask = null;\n\n    if (this.pdfDocument) {\n      this.pdfDocument = null;\n      this.pdfThumbnailViewer.setDocument(null);\n      this.pdfViewer.setDocument(null);\n      this.pdfLinkService.setDocument(null);\n      this.pdfDocumentProperties.setDocument(null);\n    }\n\n    webViewerResetPermissions();\n    this.store = null;\n    this.isInitialViewSet = false;\n    this.downloadComplete = false;\n    this.url = \"\";\n    this.baseUrl = \"\";\n    this.documentInfo = null;\n    this.metadata = null;\n    this._contentDispositionFilename = null;\n    this._contentLength = null;\n    this.triggerDelayedFallback = null;\n    this._saveInProgress = false;\n\n    this._cancelIdleCallbacks();\n\n    promises.push(this.pdfScriptingManager.destroyPromise);\n    this.pdfSidebar.reset();\n    this.pdfOutlineViewer.reset();\n    this.pdfAttachmentViewer.reset();\n    this.pdfLayerViewer.reset();\n\n    if (this.pdfHistory) {\n      this.pdfHistory.reset();\n    }\n\n    if (this.findBar) {\n      this.findBar.reset();\n    }\n\n    this.toolbar.reset();\n    this.secondaryToolbar.reset();\n\n    if (typeof PDFBug !== \"undefined\") {\n      PDFBug.cleanup();\n    }\n\n    await Promise.all(promises);\n  },\n\n  async open(file, args) {\n    if (this.pdfLoadingTask) {\n      await this.close();\n    }\n\n    const workerParameters = _app_options.AppOptions.getAll(_app_options.OptionKind.WORKER);\n\n    for (const key in workerParameters) {\n      _pdfjsLib.GlobalWorkerOptions[key] = workerParameters[key];\n    }\n\n    const parameters = Object.create(null);\n\n    if (typeof file === \"string\") {\n      this.setTitleUsingUrl(file);\n      parameters.url = file;\n    } else if (file && \"byteLength\" in file) {\n      parameters.data = file;\n    } else if (file.url && file.originalUrl) {\n      this.setTitleUsingUrl(file.originalUrl);\n      parameters.url = file.url;\n    }\n\n    const apiParameters = _app_options.AppOptions.getAll(_app_options.OptionKind.API);\n\n    for (const key in apiParameters) {\n      let value = apiParameters[key];\n\n      if (key === \"docBaseUrl\" && !value) {}\n\n      parameters[key] = value;\n    }\n\n    if (args) {\n      for (const key in args) {\n        parameters[key] = args[key];\n      }\n    }\n\n    const loadingTask = (0, _pdfjsLib.getDocument)(parameters);\n    this.pdfLoadingTask = loadingTask;\n\n    loadingTask.onPassword = (updateCallback, reason) => {\n      this.pdfLinkService.externalLinkEnabled = false;\n      this.passwordPrompt.setUpdateCallback(updateCallback, reason);\n      this.passwordPrompt.open();\n    };\n\n    loadingTask.onProgress = ({\n      loaded,\n      total\n    }) => {\n      this.progress(loaded / total);\n    };\n\n    loadingTask.onUnsupportedFeature = this.fallback.bind(this);\n    return loadingTask.promise.then(pdfDocument => {\n      this.load(pdfDocument);\n    }, exception => {\n      if (loadingTask !== this.pdfLoadingTask) {\n        return undefined;\n      }\n\n      let key = \"loading_error\";\n\n      if (exception instanceof _pdfjsLib.InvalidPDFException) {\n        key = \"invalid_file_error\";\n      } else if (exception instanceof _pdfjsLib.MissingPDFException) {\n        key = \"missing_file_error\";\n      } else if (exception instanceof _pdfjsLib.UnexpectedResponseException) {\n        key = \"unexpected_response_error\";\n      }\n\n      return this.l10n.get(key).then(msg => {\n        this._documentError(msg, {\n          message: exception?.message\n        });\n\n        throw exception;\n      });\n    });\n  },\n\n  _ensureDownloadComplete() {\n    if (this.pdfDocument && this.downloadComplete) {\n      return;\n    }\n\n    throw new Error(\"PDF document not downloaded.\");\n  },\n\n  async download({\n    sourceEventType = \"download\"\n  } = {}) {\n    const url = this.baseUrl,\n          filename = this._docFilename;\n\n    try {\n      this._ensureDownloadComplete();\n\n      const data = await this.pdfDocument.getData();\n      const blob = new Blob([data], {\n        type: \"application/pdf\"\n      });\n      await this.downloadManager.download(blob, url, filename, sourceEventType);\n    } catch (reason) {\n      await this.downloadManager.downloadUrl(url, filename);\n    }\n  },\n\n  async save({\n    sourceEventType = \"download\"\n  } = {}) {\n    if (this._saveInProgress) {\n      return;\n    }\n\n    this._saveInProgress = true;\n    await this.pdfScriptingManager.dispatchWillSave();\n    const url = this.baseUrl,\n          filename = this._docFilename;\n\n    try {\n      this._ensureDownloadComplete();\n\n      const data = await this.pdfDocument.saveDocument(this.pdfDocument.annotationStorage);\n      const blob = new Blob([data], {\n        type: \"application/pdf\"\n      });\n      await this.downloadManager.download(blob, url, filename, sourceEventType);\n    } catch (reason) {\n      await this.download({\n        sourceEventType\n      });\n    } finally {\n      await this.pdfScriptingManager.dispatchDidSave();\n      this._saveInProgress = false;\n    }\n  },\n\n  downloadOrSave(options) {\n    if (this.pdfDocument?.annotationStorage.size > 0) {\n      this.save(options);\n    } else {\n      this.download(options);\n    }\n  },\n\n  _delayedFallback(featureId) {\n    this.externalServices.reportTelemetry({\n      type: \"unsupportedFeature\",\n      featureId\n    });\n\n    if (!this.triggerDelayedFallback) {\n      this.triggerDelayedFallback = () => {\n        this.fallback(featureId);\n        this.triggerDelayedFallback = null;\n      };\n    }\n  },\n\n  fallback(featureId) {\n    this.externalServices.reportTelemetry({\n      type: \"unsupportedFeature\",\n      featureId\n    });\n\n    switch (featureId) {\n      case _pdfjsLib.UNSUPPORTED_FEATURES.errorFontLoadNative:\n      case _pdfjsLib.UNSUPPORTED_FEATURES.errorFontMissing:\n        return;\n    }\n\n    if (this.fellback) {\n      return;\n    }\n\n    this.fellback = true;\n    this.externalServices.fallback({\n      featureId,\n      url: this.baseUrl\n    }).then(download => {\n      if (!download) {\n        return;\n      }\n\n      this.download({\n        sourceEventType: \"download\"\n      });\n    });\n  },\n\n  _documentError(message, moreInfo = null) {\n    this._unblockDocumentLoadEvent();\n\n    this._otherError(message, moreInfo);\n  },\n\n  _otherError(message, moreInfo = null) {\n    const moreInfoText = [this.l10n.get(\"error_version_info\", {\n      version: _pdfjsLib.version || \"?\",\n      build: _pdfjsLib.build || \"?\"\n    })];\n\n    if (moreInfo) {\n      moreInfoText.push(this.l10n.get(\"error_message\", {\n        message: moreInfo.message\n      }));\n\n      if (moreInfo.stack) {\n        moreInfoText.push(this.l10n.get(\"error_stack\", {\n          stack: moreInfo.stack\n        }));\n      } else {\n        if (moreInfo.filename) {\n          moreInfoText.push(this.l10n.get(\"error_file\", {\n            file: moreInfo.filename\n          }));\n        }\n\n        if (moreInfo.lineNumber) {\n          moreInfoText.push(this.l10n.get(\"error_line\", {\n            line: moreInfo.lineNumber\n          }));\n        }\n      }\n    }\n\n    const errorWrapperConfig = this.appConfig.errorWrapper;\n    const errorWrapper = errorWrapperConfig.container;\n    errorWrapper.hidden = false;\n    const errorMessage = errorWrapperConfig.errorMessage;\n    errorMessage.textContent = message;\n    const closeButton = errorWrapperConfig.closeButton;\n\n    closeButton.onclick = function () {\n      errorWrapper.hidden = true;\n    };\n\n    const errorMoreInfo = errorWrapperConfig.errorMoreInfo;\n    const moreInfoButton = errorWrapperConfig.moreInfoButton;\n    const lessInfoButton = errorWrapperConfig.lessInfoButton;\n\n    moreInfoButton.onclick = function () {\n      errorMoreInfo.hidden = false;\n      moreInfoButton.hidden = true;\n      lessInfoButton.hidden = false;\n      errorMoreInfo.style.height = errorMoreInfo.scrollHeight + \"px\";\n    };\n\n    lessInfoButton.onclick = function () {\n      errorMoreInfo.hidden = true;\n      moreInfoButton.hidden = false;\n      lessInfoButton.hidden = true;\n    };\n\n    moreInfoButton.oncontextmenu = _ui_utils.noContextMenuHandler;\n    lessInfoButton.oncontextmenu = _ui_utils.noContextMenuHandler;\n    closeButton.oncontextmenu = _ui_utils.noContextMenuHandler;\n    moreInfoButton.hidden = false;\n    lessInfoButton.hidden = true;\n    Promise.all(moreInfoText).then(parts => {\n      errorMoreInfo.value = parts.join(\"\\n\");\n    });\n  },\n\n  progress(level) {\n    if (this.downloadComplete) {\n      return;\n    }\n\n    const percent = Math.round(level * 100);\n\n    if (percent > this.loadingBar.percent || isNaN(percent)) {\n      this.loadingBar.percent = percent;\n      const disableAutoFetch = this.pdfDocument ? this.pdfDocument.loadingParams.disableAutoFetch : _app_options.AppOptions.get(\"disableAutoFetch\");\n\n      if (disableAutoFetch && percent) {\n        if (this.disableAutoFetchLoadingBarTimeout) {\n          clearTimeout(this.disableAutoFetchLoadingBarTimeout);\n          this.disableAutoFetchLoadingBarTimeout = null;\n        }\n\n        this.loadingBar.show();\n        this.disableAutoFetchLoadingBarTimeout = setTimeout(() => {\n          this.loadingBar.hide();\n          this.disableAutoFetchLoadingBarTimeout = null;\n        }, DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT);\n      }\n    }\n  },\n\n  load(pdfDocument) {\n    this.pdfDocument = pdfDocument;\n    pdfDocument.getDownloadInfo().then(({\n      length\n    }) => {\n      this._contentLength = length;\n      this.downloadComplete = true;\n      this.loadingBar.hide();\n      firstPagePromise.then(() => {\n        this.eventBus.dispatch(\"documentloaded\", {\n          source: this\n        });\n      });\n    });\n    const pageLayoutPromise = pdfDocument.getPageLayout().catch(function () {});\n    const pageModePromise = pdfDocument.getPageMode().catch(function () {});\n    const openActionPromise = pdfDocument.getOpenAction().catch(function () {});\n    this.toolbar.setPagesCount(pdfDocument.numPages, false);\n    this.secondaryToolbar.setPagesCount(pdfDocument.numPages);\n    let baseDocumentUrl;\n    baseDocumentUrl = null;\n    this.pdfLinkService.setDocument(pdfDocument, baseDocumentUrl);\n    this.pdfDocumentProperties.setDocument(pdfDocument, this.url);\n    const pdfViewer = this.pdfViewer;\n    pdfViewer.setDocument(pdfDocument);\n    const {\n      firstPagePromise,\n      onePageRendered,\n      pagesPromise\n    } = pdfViewer;\n    const pdfThumbnailViewer = this.pdfThumbnailViewer;\n    pdfThumbnailViewer.setDocument(pdfDocument);\n    const storedPromise = (this.store = new _view_history.ViewHistory(pdfDocument.fingerprint)).getMultiple({\n      page: null,\n      zoom: _ui_utils.DEFAULT_SCALE_VALUE,\n      scrollLeft: \"0\",\n      scrollTop: \"0\",\n      rotation: null,\n      sidebarView: _ui_utils.SidebarView.UNKNOWN,\n      scrollMode: _ui_utils.ScrollMode.UNKNOWN,\n      spreadMode: _ui_utils.SpreadMode.UNKNOWN\n    }).catch(() => {\n      return Object.create(null);\n    });\n    firstPagePromise.then(pdfPage => {\n      this.loadingBar.setWidth(this.appConfig.viewerContainer);\n\n      this._initializeAnnotationStorageCallbacks(pdfDocument);\n\n      Promise.all([_ui_utils.animationStarted, storedPromise, pageLayoutPromise, pageModePromise, openActionPromise]).then(async ([timeStamp, stored, pageLayout, pageMode, openAction]) => {\n        const viewOnLoad = _app_options.AppOptions.get(\"viewOnLoad\");\n\n        this._initializePdfHistory({\n          fingerprint: pdfDocument.fingerprint,\n          viewOnLoad,\n          initialDest: openAction?.dest\n        });\n\n        const initialBookmark = this.initialBookmark;\n\n        const zoom = _app_options.AppOptions.get(\"defaultZoomValue\");\n\n        let hash = zoom ? `zoom=${zoom}` : null;\n        let rotation = null;\n\n        let sidebarView = _app_options.AppOptions.get(\"sidebarViewOnLoad\");\n\n        let scrollMode = _app_options.AppOptions.get(\"scrollModeOnLoad\");\n\n        let spreadMode = _app_options.AppOptions.get(\"spreadModeOnLoad\");\n\n        if (stored.page && viewOnLoad !== ViewOnLoad.INITIAL) {\n          hash = `page=${stored.page}&zoom=${zoom || stored.zoom},` + `${stored.scrollLeft},${stored.scrollTop}`;\n          rotation = parseInt(stored.rotation, 10);\n\n          if (sidebarView === _ui_utils.SidebarView.UNKNOWN) {\n            sidebarView = stored.sidebarView | 0;\n          }\n\n          if (scrollMode === _ui_utils.ScrollMode.UNKNOWN) {\n            scrollMode = stored.scrollMode | 0;\n          }\n\n          if (spreadMode === _ui_utils.SpreadMode.UNKNOWN) {\n            spreadMode = stored.spreadMode | 0;\n          }\n        }\n\n        if (pageMode && sidebarView === _ui_utils.SidebarView.UNKNOWN) {\n          sidebarView = (0, _ui_utils.apiPageModeToSidebarView)(pageMode);\n        }\n\n        if (pageLayout && spreadMode === _ui_utils.SpreadMode.UNKNOWN) {\n          spreadMode = (0, _ui_utils.apiPageLayoutToSpreadMode)(pageLayout);\n        }\n\n        this.setInitialView(hash, {\n          rotation,\n          sidebarView,\n          scrollMode,\n          spreadMode\n        });\n        this.eventBus.dispatch(\"documentinit\", {\n          source: this\n        });\n\n        if (!this.isViewerEmbedded) {\n          pdfViewer.focus();\n        }\n\n        this._initializePermissions(pdfDocument);\n\n        await Promise.race([pagesPromise, new Promise(resolve => {\n          setTimeout(resolve, FORCE_PAGES_LOADED_TIMEOUT);\n        })]);\n\n        if (!initialBookmark && !hash) {\n          return;\n        }\n\n        if (pdfViewer.hasEqualPageSizes) {\n          return;\n        }\n\n        this.initialBookmark = initialBookmark;\n        pdfViewer.currentScaleValue = pdfViewer.currentScaleValue;\n        this.setInitialView(hash);\n      }).catch(() => {\n        this.setInitialView();\n      }).then(function () {\n        pdfViewer.update();\n      });\n    });\n    pagesPromise.then(() => {\n      this._unblockDocumentLoadEvent();\n\n      this._initializeAutoPrint(pdfDocument, openActionPromise);\n    });\n    onePageRendered.then(() => {\n      pdfDocument.getOutline().then(outline => {\n        this.pdfOutlineViewer.render({\n          outline,\n          pdfDocument\n        });\n      });\n      pdfDocument.getAttachments().then(attachments => {\n        this.pdfAttachmentViewer.render({\n          attachments\n        });\n      });\n      pdfViewer.optionalContentConfigPromise.then(optionalContentConfig => {\n        this.pdfLayerViewer.render({\n          optionalContentConfig,\n          pdfDocument\n        });\n      });\n\n      if (\"requestIdleCallback\" in window) {\n        const callback = window.requestIdleCallback(() => {\n          this._collectTelemetry(pdfDocument);\n\n          this._idleCallbacks.delete(callback);\n        }, {\n          timeout: 1000\n        });\n\n        this._idleCallbacks.add(callback);\n      }\n    });\n\n    this._initializePageLabels(pdfDocument);\n\n    this._initializeMetadata(pdfDocument);\n  },\n\n  async _scriptingDocProperties(pdfDocument) {\n    if (!this.documentInfo) {\n      await new Promise(resolve => {\n        this.eventBus._on(\"metadataloaded\", resolve, {\n          once: true\n        });\n      });\n\n      if (pdfDocument !== this.pdfDocument) {\n        return null;\n      }\n    }\n\n    if (!this._contentLength) {\n      await new Promise(resolve => {\n        this.eventBus._on(\"documentloaded\", resolve, {\n          once: true\n        });\n      });\n\n      if (pdfDocument !== this.pdfDocument) {\n        return null;\n      }\n    }\n\n    return { ...this.documentInfo,\n      baseURL: this.baseUrl,\n      filesize: this._contentLength,\n      filename: this._docFilename,\n      metadata: this.metadata?.getRaw(),\n      authors: this.metadata?.get(\"dc:creator\"),\n      numPages: this.pagesCount,\n      URL: this.url\n    };\n  },\n\n  async _collectTelemetry(pdfDocument) {\n    const markInfo = await this.pdfDocument.getMarkInfo();\n\n    if (pdfDocument !== this.pdfDocument) {\n      return;\n    }\n\n    const tagged = markInfo?.Marked || false;\n    this.externalServices.reportTelemetry({\n      type: \"tagged\",\n      tagged\n    });\n  },\n\n  async _initializeAutoPrint(pdfDocument, openActionPromise) {\n    const [openAction, javaScript] = await Promise.all([openActionPromise, !this.pdfViewer.enableScripting ? pdfDocument.getJavaScript() : null]);\n\n    if (pdfDocument !== this.pdfDocument) {\n      return;\n    }\n\n    let triggerAutoPrint = false;\n\n    if (openAction?.action === \"Print\") {\n      triggerAutoPrint = true;\n    }\n\n    if (javaScript) {\n      javaScript.some(js => {\n        if (!js) {\n          return false;\n        }\n\n        console.warn(\"Warning: JavaScript is not supported\");\n\n        this._delayedFallback(_pdfjsLib.UNSUPPORTED_FEATURES.javaScript);\n\n        return true;\n      });\n\n      if (!triggerAutoPrint) {\n        for (const js of javaScript) {\n          if (js && _ui_utils.AutoPrintRegExp.test(js)) {\n            triggerAutoPrint = true;\n            break;\n          }\n        }\n      }\n    }\n\n    if (triggerAutoPrint) {\n      this.triggerPrinting();\n    }\n  },\n\n  async _initializeMetadata(pdfDocument) {\n    const {\n      info,\n      metadata,\n      contentDispositionFilename,\n      contentLength\n    } = await pdfDocument.getMetadata();\n\n    if (pdfDocument !== this.pdfDocument) {\n      return;\n    }\n\n    this.documentInfo = info;\n    this.metadata = metadata;\n    this._contentDispositionFilename ?? (this._contentDispositionFilename = contentDispositionFilename);\n    this._contentLength ?? (this._contentLength = contentLength);\n    console.log(`PDF ${pdfDocument.fingerprint} [${info.PDFFormatVersion} ` + `${(info.Producer || \"-\").trim()} / ${(info.Creator || \"-\").trim()}] ` + `(PDF.js: ${_pdfjsLib.version || \"-\"}` + `${this.pdfViewer.enableWebGL ? \" [WebGL]\" : \"\"})`);\n    let pdfTitle = info?.Title;\n    const metadataTitle = metadata?.get(\"dc:title\");\n\n    if (metadataTitle) {\n      if (metadataTitle !== \"Untitled\" && !/[\\uFFF0-\\uFFFF]/g.test(metadataTitle)) {\n        pdfTitle = metadataTitle;\n      }\n    }\n\n    if (pdfTitle) {\n      this.setTitle(`${pdfTitle} - ${contentDispositionFilename || document.title}`);\n    } else if (contentDispositionFilename) {\n      this.setTitle(contentDispositionFilename);\n    }\n\n    if (info.IsXFAPresent && !info.IsAcroFormPresent && !pdfDocument.isPureXfa) {\n      console.warn(\"Warning: XFA is not supported\");\n\n      this._delayedFallback(_pdfjsLib.UNSUPPORTED_FEATURES.forms);\n    } else if ((info.IsAcroFormPresent || info.IsXFAPresent) && !this.pdfViewer.renderInteractiveForms) {\n      console.warn(\"Warning: Interactive form support is not enabled\");\n\n      this._delayedFallback(_pdfjsLib.UNSUPPORTED_FEATURES.forms);\n    }\n\n    let versionId = \"other\";\n\n    if (KNOWN_VERSIONS.includes(info.PDFFormatVersion)) {\n      versionId = `v${info.PDFFormatVersion.replace(\".\", \"_\")}`;\n    }\n\n    let generatorId = \"other\";\n\n    if (info.Producer) {\n      const producer = info.Producer.toLowerCase();\n      KNOWN_GENERATORS.some(function (generator) {\n        if (!producer.includes(generator)) {\n          return false;\n        }\n\n        generatorId = generator.replace(/[ .-]/g, \"_\");\n        return true;\n      });\n    }\n\n    let formType = null;\n\n    if (info.IsXFAPresent) {\n      formType = \"xfa\";\n    } else if (info.IsAcroFormPresent) {\n      formType = \"acroform\";\n    }\n\n    this.externalServices.reportTelemetry({\n      type: \"documentInfo\",\n      version: versionId,\n      generator: generatorId,\n      formType\n    });\n    this.eventBus.dispatch(\"metadataloaded\", {\n      source: this\n    });\n  },\n\n  async _initializePageLabels(pdfDocument) {\n    const labels = await pdfDocument.getPageLabels();\n\n    if (pdfDocument !== this.pdfDocument) {\n      return;\n    }\n\n    if (!labels || _app_options.AppOptions.get(\"disablePageLabels\")) {\n      return;\n    }\n\n    const numLabels = labels.length;\n\n    if (numLabels !== this.pagesCount) {\n      console.error(\"The number of Page Labels does not match the number of pages in the document.\");\n      return;\n    }\n\n    let i = 0;\n\n    while (i < numLabels && labels[i] === (i + 1).toString()) {\n      i++;\n    }\n\n    if (i === numLabels) {\n      return;\n    }\n\n    const {\n      pdfViewer,\n      pdfThumbnailViewer,\n      toolbar\n    } = this;\n    pdfViewer.setPageLabels(labels);\n    pdfThumbnailViewer.setPageLabels(labels);\n    toolbar.setPagesCount(numLabels, true);\n    toolbar.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel);\n  },\n\n  _initializePdfHistory({\n    fingerprint,\n    viewOnLoad,\n    initialDest = null\n  }) {\n    if (this.isViewerEmbedded || _app_options.AppOptions.get(\"disableHistory\")) {\n      return;\n    }\n\n    this.pdfHistory.initialize({\n      fingerprint,\n      resetHistory: viewOnLoad === ViewOnLoad.INITIAL,\n      updateUrl: _app_options.AppOptions.get(\"historyUpdateUrl\")\n    });\n\n    if (this.pdfHistory.initialBookmark) {\n      this.initialBookmark = this.pdfHistory.initialBookmark;\n      this.initialRotation = this.pdfHistory.initialRotation;\n    }\n\n    if (initialDest && !this.initialBookmark && viewOnLoad === ViewOnLoad.UNKNOWN) {\n      this.initialBookmark = JSON.stringify(initialDest);\n      this.pdfHistory.push({\n        explicitDest: initialDest,\n        pageNumber: null\n      });\n    }\n  },\n\n  async _initializePermissions(pdfDocument) {\n    const permissions = await pdfDocument.getPermissions();\n\n    if (pdfDocument !== this.pdfDocument) {\n      return;\n    }\n\n    if (!permissions || !_app_options.AppOptions.get(\"enablePermissions\")) {\n      return;\n    }\n\n    if (!permissions.includes(_pdfjsLib.PermissionFlag.COPY)) {\n      this.appConfig.viewerContainer.classList.add(ENABLE_PERMISSIONS_CLASS);\n    }\n  },\n\n  _initializeAnnotationStorageCallbacks(pdfDocument) {\n    if (pdfDocument !== this.pdfDocument) {\n      return;\n    }\n\n    const {\n      annotationStorage\n    } = pdfDocument;\n\n    annotationStorage.onSetModified = () => {\n      window.addEventListener(\"beforeunload\", beforeUnload);\n      this._annotationStorageModified = true;\n    };\n\n    annotationStorage.onResetModified = () => {\n      window.removeEventListener(\"beforeunload\", beforeUnload);\n      delete this._annotationStorageModified;\n    };\n  },\n\n  setInitialView(storedHash, {\n    rotation,\n    sidebarView,\n    scrollMode,\n    spreadMode\n  } = {}) {\n    const setRotation = angle => {\n      if ((0, _ui_utils.isValidRotation)(angle)) {\n        this.pdfViewer.pagesRotation = angle;\n      }\n    };\n\n    const setViewerModes = (scroll, spread) => {\n      if ((0, _ui_utils.isValidScrollMode)(scroll)) {\n        this.pdfViewer.scrollMode = scroll;\n      }\n\n      if ((0, _ui_utils.isValidSpreadMode)(spread)) {\n        this.pdfViewer.spreadMode = spread;\n      }\n    };\n\n    this.isInitialViewSet = true;\n    this.pdfSidebar.setInitialView(sidebarView);\n    setViewerModes(scrollMode, spreadMode);\n\n    if (this.initialBookmark) {\n      setRotation(this.initialRotation);\n      delete this.initialRotation;\n      this.pdfLinkService.setHash(this.initialBookmark);\n      this.initialBookmark = null;\n    } else if (storedHash) {\n      setRotation(rotation);\n      this.pdfLinkService.setHash(storedHash);\n    }\n\n    this.toolbar.setPageNumber(this.pdfViewer.currentPageNumber, this.pdfViewer.currentPageLabel);\n    this.secondaryToolbar.setPageNumber(this.pdfViewer.currentPageNumber);\n\n    if (!this.pdfViewer.currentScaleValue) {\n      this.pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;\n    }\n  },\n\n  _cleanup() {\n    if (!this.pdfDocument) {\n      return;\n    }\n\n    this.pdfViewer.cleanup();\n    this.pdfThumbnailViewer.cleanup();\n    this.pdfDocument.cleanup(this.pdfViewer.renderer === _ui_utils.RendererType.SVG);\n  },\n\n  forceRendering() {\n    this.pdfRenderingQueue.printing = !!this.printService;\n    this.pdfRenderingQueue.isThumbnailViewEnabled = this.pdfSidebar.isThumbnailViewVisible;\n    this.pdfRenderingQueue.renderHighestPriority();\n  },\n\n  beforePrint() {\n    this.pdfScriptingManager.dispatchWillPrint();\n\n    if (this.printService) {\n      return;\n    }\n\n    if (!this.supportsPrinting) {\n      this.l10n.get(\"printing_not_supported\").then(msg => {\n        this._otherError(msg);\n      });\n      return;\n    }\n\n    if (!this.pdfViewer.pageViewsReady) {\n      this.l10n.get(\"printing_not_ready\").then(msg => {\n        window.alert(msg);\n      });\n      return;\n    }\n\n    const pagesOverview = this.pdfViewer.getPagesOverview();\n    const printContainer = this.appConfig.printContainer;\n\n    const printResolution = _app_options.AppOptions.get(\"printResolution\");\n\n    const optionalContentConfigPromise = this.pdfViewer.optionalContentConfigPromise;\n    const printService = PDFPrintServiceFactory.instance.createPrintService(this.pdfDocument, pagesOverview, printContainer, printResolution, optionalContentConfigPromise, this.l10n);\n    this.printService = printService;\n    this.forceRendering();\n    printService.layout();\n    this.externalServices.reportTelemetry({\n      type: \"print\"\n    });\n  },\n\n  afterPrint() {\n    this.pdfScriptingManager.dispatchDidPrint();\n\n    if (this.printService) {\n      this.printService.destroy();\n      this.printService = null;\n\n      if (this.pdfDocument) {\n        this.pdfDocument.annotationStorage.resetModified();\n      }\n    }\n\n    this.forceRendering();\n  },\n\n  rotatePages(delta) {\n    this.pdfViewer.pagesRotation += delta;\n  },\n\n  requestPresentationMode() {\n    if (!this.pdfPresentationMode) {\n      return;\n    }\n\n    this.pdfPresentationMode.request();\n  },\n\n  triggerPrinting() {\n    if (!this.supportsPrinting) {\n      return;\n    }\n\n    window.print();\n  },\n\n  bindEvents() {\n    const {\n      eventBus,\n      _boundEvents\n    } = this;\n    _boundEvents.beforePrint = this.beforePrint.bind(this);\n    _boundEvents.afterPrint = this.afterPrint.bind(this);\n\n    eventBus._on(\"resize\", webViewerResize);\n\n    eventBus._on(\"hashchange\", webViewerHashchange);\n\n    eventBus._on(\"beforeprint\", _boundEvents.beforePrint);\n\n    eventBus._on(\"afterprint\", _boundEvents.afterPrint);\n\n    eventBus._on(\"pagerendered\", webViewerPageRendered);\n\n    eventBus._on(\"updateviewarea\", webViewerUpdateViewarea);\n\n    eventBus._on(\"pagechanging\", webViewerPageChanging);\n\n    eventBus._on(\"scalechanging\", webViewerScaleChanging);\n\n    eventBus._on(\"rotationchanging\", webViewerRotationChanging);\n\n    eventBus._on(\"sidebarviewchanged\", webViewerSidebarViewChanged);\n\n    eventBus._on(\"pagemode\", webViewerPageMode);\n\n    eventBus._on(\"namedaction\", webViewerNamedAction);\n\n    eventBus._on(\"presentationmodechanged\", webViewerPresentationModeChanged);\n\n    eventBus._on(\"presentationmode\", webViewerPresentationMode);\n\n    eventBus._on(\"print\", webViewerPrint);\n\n    eventBus._on(\"download\", webViewerDownload);\n\n    eventBus._on(\"save\", webViewerSave);\n\n    eventBus._on(\"firstpage\", webViewerFirstPage);\n\n    eventBus._on(\"lastpage\", webViewerLastPage);\n\n    eventBus._on(\"nextpage\", webViewerNextPage);\n\n    eventBus._on(\"previouspage\", webViewerPreviousPage);\n\n    eventBus._on(\"zoomin\", webViewerZoomIn);\n\n    eventBus._on(\"zoomout\", webViewerZoomOut);\n\n    eventBus._on(\"zoomreset\", webViewerZoomReset);\n\n    eventBus._on(\"pagenumberchanged\", webViewerPageNumberChanged);\n\n    eventBus._on(\"scalechanged\", webViewerScaleChanged);\n\n    eventBus._on(\"rotatecw\", webViewerRotateCw);\n\n    eventBus._on(\"rotateccw\", webViewerRotateCcw);\n\n    eventBus._on(\"optionalcontentconfig\", webViewerOptionalContentConfig);\n\n    eventBus._on(\"switchscrollmode\", webViewerSwitchScrollMode);\n\n    eventBus._on(\"scrollmodechanged\", webViewerScrollModeChanged);\n\n    eventBus._on(\"switchspreadmode\", webViewerSwitchSpreadMode);\n\n    eventBus._on(\"spreadmodechanged\", webViewerSpreadModeChanged);\n\n    eventBus._on(\"documentproperties\", webViewerDocumentProperties);\n\n    eventBus._on(\"find\", webViewerFind);\n\n    eventBus._on(\"findfromurlhash\", webViewerFindFromUrlHash);\n\n    eventBus._on(\"updatefindmatchescount\", webViewerUpdateFindMatchesCount);\n\n    eventBus._on(\"updatefindcontrolstate\", webViewerUpdateFindControlState);\n\n    if (_app_options.AppOptions.get(\"pdfBug\")) {\n      _boundEvents.reportPageStatsPDFBug = reportPageStatsPDFBug;\n\n      eventBus._on(\"pagerendered\", _boundEvents.reportPageStatsPDFBug);\n\n      eventBus._on(\"pagechanging\", _boundEvents.reportPageStatsPDFBug);\n    }\n\n    eventBus._on(\"fileinputchange\", webViewerFileInputChange);\n\n    eventBus._on(\"openfile\", webViewerOpenFile);\n  },\n\n  bindWindowEvents() {\n    const {\n      eventBus,\n      _boundEvents\n    } = this;\n\n    _boundEvents.windowResize = () => {\n      eventBus.dispatch(\"resize\", {\n        source: window\n      });\n    };\n\n    _boundEvents.windowHashChange = () => {\n      eventBus.dispatch(\"hashchange\", {\n        source: window,\n        hash: document.location.hash.substring(1)\n      });\n    };\n\n    _boundEvents.windowBeforePrint = () => {\n      eventBus.dispatch(\"beforeprint\", {\n        source: window\n      });\n    };\n\n    _boundEvents.windowAfterPrint = () => {\n      eventBus.dispatch(\"afterprint\", {\n        source: window\n      });\n    };\n\n    _boundEvents.windowUpdateFromSandbox = event => {\n      eventBus.dispatch(\"updatefromsandbox\", {\n        source: window,\n        detail: event.detail\n      });\n    };\n\n    window.addEventListener(\"visibilitychange\", webViewerVisibilityChange);\n    window.addEventListener(\"wheel\", webViewerWheel, {\n      passive: false\n    });\n    window.addEventListener(\"touchstart\", webViewerTouchStart, {\n      passive: false\n    });\n    window.addEventListener(\"click\", webViewerClick);\n    window.addEventListener(\"keydown\", webViewerKeyDown);\n    window.addEventListener(\"keyup\", webViewerKeyUp);\n    window.addEventListener(\"resize\", _boundEvents.windowResize);\n    window.addEventListener(\"hashchange\", _boundEvents.windowHashChange);\n    window.addEventListener(\"beforeprint\", _boundEvents.windowBeforePrint);\n    window.addEventListener(\"afterprint\", _boundEvents.windowAfterPrint);\n    window.addEventListener(\"updatefromsandbox\", _boundEvents.windowUpdateFromSandbox);\n  },\n\n  unbindEvents() {\n    const {\n      eventBus,\n      _boundEvents\n    } = this;\n\n    eventBus._off(\"resize\", webViewerResize);\n\n    eventBus._off(\"hashchange\", webViewerHashchange);\n\n    eventBus._off(\"beforeprint\", _boundEvents.beforePrint);\n\n    eventBus._off(\"afterprint\", _boundEvents.afterPrint);\n\n    eventBus._off(\"pagerendered\", webViewerPageRendered);\n\n    eventBus._off(\"updateviewarea\", webViewerUpdateViewarea);\n\n    eventBus._off(\"pagechanging\", webViewerPageChanging);\n\n    eventBus._off(\"scalechanging\", webViewerScaleChanging);\n\n    eventBus._off(\"rotationchanging\", webViewerRotationChanging);\n\n    eventBus._off(\"sidebarviewchanged\", webViewerSidebarViewChanged);\n\n    eventBus._off(\"pagemode\", webViewerPageMode);\n\n    eventBus._off(\"namedaction\", webViewerNamedAction);\n\n    eventBus._off(\"presentationmodechanged\", webViewerPresentationModeChanged);\n\n    eventBus._off(\"presentationmode\", webViewerPresentationMode);\n\n    eventBus._off(\"print\", webViewerPrint);\n\n    eventBus._off(\"download\", webViewerDownload);\n\n    eventBus._off(\"save\", webViewerSave);\n\n    eventBus._off(\"firstpage\", webViewerFirstPage);\n\n    eventBus._off(\"lastpage\", webViewerLastPage);\n\n    eventBus._off(\"nextpage\", webViewerNextPage);\n\n    eventBus._off(\"previouspage\", webViewerPreviousPage);\n\n    eventBus._off(\"zoomin\", webViewerZoomIn);\n\n    eventBus._off(\"zoomout\", webViewerZoomOut);\n\n    eventBus._off(\"zoomreset\", webViewerZoomReset);\n\n    eventBus._off(\"pagenumberchanged\", webViewerPageNumberChanged);\n\n    eventBus._off(\"scalechanged\", webViewerScaleChanged);\n\n    eventBus._off(\"rotatecw\", webViewerRotateCw);\n\n    eventBus._off(\"rotateccw\", webViewerRotateCcw);\n\n    eventBus._off(\"optionalcontentconfig\", webViewerOptionalContentConfig);\n\n    eventBus._off(\"switchscrollmode\", webViewerSwitchScrollMode);\n\n    eventBus._off(\"scrollmodechanged\", webViewerScrollModeChanged);\n\n    eventBus._off(\"switchspreadmode\", webViewerSwitchSpreadMode);\n\n    eventBus._off(\"spreadmodechanged\", webViewerSpreadModeChanged);\n\n    eventBus._off(\"documentproperties\", webViewerDocumentProperties);\n\n    eventBus._off(\"find\", webViewerFind);\n\n    eventBus._off(\"findfromurlhash\", webViewerFindFromUrlHash);\n\n    eventBus._off(\"updatefindmatchescount\", webViewerUpdateFindMatchesCount);\n\n    eventBus._off(\"updatefindcontrolstate\", webViewerUpdateFindControlState);\n\n    if (_boundEvents.reportPageStatsPDFBug) {\n      eventBus._off(\"pagerendered\", _boundEvents.reportPageStatsPDFBug);\n\n      eventBus._off(\"pagechanging\", _boundEvents.reportPageStatsPDFBug);\n\n      _boundEvents.reportPageStatsPDFBug = null;\n    }\n\n    eventBus._off(\"fileinputchange\", webViewerFileInputChange);\n\n    eventBus._off(\"openfile\", webViewerOpenFile);\n\n    _boundEvents.beforePrint = null;\n    _boundEvents.afterPrint = null;\n  },\n\n  unbindWindowEvents() {\n    const {\n      _boundEvents\n    } = this;\n    window.removeEventListener(\"visibilitychange\", webViewerVisibilityChange);\n    window.removeEventListener(\"wheel\", webViewerWheel, {\n      passive: false\n    });\n    window.removeEventListener(\"touchstart\", webViewerTouchStart, {\n      passive: false\n    });\n    window.removeEventListener(\"click\", webViewerClick);\n    window.removeEventListener(\"keydown\", webViewerKeyDown);\n    window.removeEventListener(\"keyup\", webViewerKeyUp);\n    window.removeEventListener(\"resize\", _boundEvents.windowResize);\n    window.removeEventListener(\"hashchange\", _boundEvents.windowHashChange);\n    window.removeEventListener(\"beforeprint\", _boundEvents.windowBeforePrint);\n    window.removeEventListener(\"afterprint\", _boundEvents.windowAfterPrint);\n    window.removeEventListener(\"updatefromsandbox\", _boundEvents.windowUpdateFromSandbox);\n    _boundEvents.windowResize = null;\n    _boundEvents.windowHashChange = null;\n    _boundEvents.windowBeforePrint = null;\n    _boundEvents.windowAfterPrint = null;\n    _boundEvents.windowUpdateFromSandbox = null;\n  },\n\n  accumulateWheelTicks(ticks) {\n    if (this._wheelUnusedTicks > 0 && ticks < 0 || this._wheelUnusedTicks < 0 && ticks > 0) {\n      this._wheelUnusedTicks = 0;\n    }\n\n    this._wheelUnusedTicks += ticks;\n    const wholeTicks = Math.sign(this._wheelUnusedTicks) * Math.floor(Math.abs(this._wheelUnusedTicks));\n    this._wheelUnusedTicks -= wholeTicks;\n    return wholeTicks;\n  },\n\n  _unblockDocumentLoadEvent() {\n    if (document.blockUnblockOnload) {\n      document.blockUnblockOnload(false);\n    }\n\n    this._unblockDocumentLoadEvent = () => {};\n  },\n\n  get scriptingReady() {\n    return this.pdfScriptingManager.ready;\n  }\n\n};\nexports.PDFViewerApplication = PDFViewerApplication;\nlet validateFileURL;\n{\n  const HOSTED_VIEWER_ORIGINS = [\"null\", \"http://mozilla.github.io\", \"https://mozilla.github.io\"];\n\n  validateFileURL = function (file) {\n    if (file === undefined) {\n      return;\n    }\n\n    try {\n      const viewerOrigin = new URL(window.location.href).origin || \"null\";\n\n      if (HOSTED_VIEWER_ORIGINS.includes(viewerOrigin)) {\n        return;\n      }\n\n      const {\n        origin,\n        protocol\n      } = new URL(file, window.location.href);\n\n      if (origin !== viewerOrigin && protocol !== \"blob:\") {\n        throw new Error(\"file origin does not match viewer's\");\n      }\n    } catch (ex) {\n      PDFViewerApplication.l10n.get(\"loading_error\").then(msg => {\n        PDFViewerApplication._documentError(msg, {\n          message: ex?.message\n        });\n      });\n      throw ex;\n    }\n  };\n}\n\nasync function loadFakeWorker() {\n  if (!_pdfjsLib.GlobalWorkerOptions.workerSrc) {\n    _pdfjsLib.GlobalWorkerOptions.workerSrc = _app_options.AppOptions.get(\"workerSrc\");\n  }\n\n  return (0, _pdfjsLib.loadScript)(_pdfjsLib.PDFWorker.getWorkerSrc());\n}\n\nfunction loadAndEnablePDFBug(enabledTabs) {\n  const appConfig = PDFViewerApplication.appConfig;\n  return (0, _pdfjsLib.loadScript)(appConfig.debuggerScriptPath).then(function () {\n    PDFBug.enable(enabledTabs);\n    PDFBug.init({\n      OPS: _pdfjsLib.OPS\n    }, appConfig.mainContainer);\n  });\n}\n\nfunction reportPageStatsPDFBug({\n  pageNumber\n}) {\n  if (typeof Stats === \"undefined\" || !Stats.enabled) {\n    return;\n  }\n\n  const pageView = PDFViewerApplication.pdfViewer.getPageView(pageNumber - 1);\n  const pageStats = pageView?.pdfPage?.stats;\n\n  if (!pageStats) {\n    return;\n  }\n\n  Stats.add(pageNumber, pageStats);\n}\n\nfunction webViewerInitialized() {\n  const appConfig = PDFViewerApplication.appConfig;\n  let file;\n  const queryString = document.location.search.substring(1);\n  const params = (0, _ui_utils.parseQueryString)(queryString);\n  file = \"file\" in params ? params.file : _app_options.AppOptions.get(\"defaultUrl\");\n  validateFileURL(file);\n  const fileInput = document.createElement(\"input\");\n  fileInput.id = appConfig.openFileInputName;\n  fileInput.className = \"fileInput\";\n  fileInput.setAttribute(\"type\", \"file\");\n  fileInput.oncontextmenu = _ui_utils.noContextMenuHandler;\n  document.body.appendChild(fileInput);\n\n  if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {\n    appConfig.toolbar.openFile.hidden = true;\n    appConfig.secondaryToolbar.openFileButton.hidden = true;\n  } else {\n    fileInput.value = null;\n  }\n\n  fileInput.addEventListener(\"change\", function (evt) {\n    const files = evt.target.files;\n\n    if (!files || files.length === 0) {\n      return;\n    }\n\n    PDFViewerApplication.eventBus.dispatch(\"fileinputchange\", {\n      source: this,\n      fileInput: evt.target\n    });\n  });\n  appConfig.mainContainer.addEventListener(\"dragover\", function (evt) {\n    evt.preventDefault();\n    evt.dataTransfer.dropEffect = \"move\";\n  });\n  appConfig.mainContainer.addEventListener(\"drop\", function (evt) {\n    evt.preventDefault();\n    const files = evt.dataTransfer.files;\n\n    if (!files || files.length === 0) {\n      return;\n    }\n\n    PDFViewerApplication.eventBus.dispatch(\"fileinputchange\", {\n      source: this,\n      fileInput: evt.dataTransfer\n    });\n  });\n\n  if (!PDFViewerApplication.supportsDocumentFonts) {\n    _app_options.AppOptions.set(\"disableFontFace\", true);\n\n    PDFViewerApplication.l10n.get(\"web_fonts_disabled\").then(msg => {\n      console.warn(msg);\n    });\n  }\n\n  if (!PDFViewerApplication.supportsPrinting) {\n    appConfig.toolbar.print.classList.add(\"hidden\");\n    appConfig.secondaryToolbar.printButton.classList.add(\"hidden\");\n  }\n\n  if (!PDFViewerApplication.supportsFullscreen) {\n    appConfig.toolbar.presentationModeButton.classList.add(\"hidden\");\n    appConfig.secondaryToolbar.presentationModeButton.classList.add(\"hidden\");\n  }\n\n  if (PDFViewerApplication.supportsIntegratedFind) {\n    appConfig.toolbar.viewFind.classList.add(\"hidden\");\n  }\n\n  appConfig.mainContainer.addEventListener(\"transitionend\", function (evt) {\n    if (evt.target === this) {\n      PDFViewerApplication.eventBus.dispatch(\"resize\", {\n        source: this\n      });\n    }\n  }, true);\n\n  try {\n    webViewerOpenFileViaURL(file);\n  } catch (reason) {\n    PDFViewerApplication.l10n.get(\"loading_error\").then(msg => {\n      PDFViewerApplication._documentError(msg, reason);\n    });\n  }\n}\n\nfunction webViewerOpenFileViaURL(file) {\n  if (file) {\n    PDFViewerApplication.open(file);\n  }\n}\n\nfunction webViewerResetPermissions() {\n  const {\n    appConfig\n  } = PDFViewerApplication;\n\n  if (!appConfig) {\n    return;\n  }\n\n  appConfig.viewerContainer.classList.remove(ENABLE_PERMISSIONS_CLASS);\n}\n\nfunction webViewerPageRendered({\n  pageNumber,\n  timestamp,\n  error\n}) {\n  if (pageNumber === PDFViewerApplication.page) {\n    PDFViewerApplication.toolbar.updateLoadingIndicatorState(false);\n  }\n\n  if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {\n    const pageView = PDFViewerApplication.pdfViewer.getPageView(pageNumber - 1);\n    const thumbnailView = PDFViewerApplication.pdfThumbnailViewer.getThumbnail(pageNumber - 1);\n\n    if (pageView && thumbnailView) {\n      thumbnailView.setImage(pageView);\n    }\n  }\n\n  if (error) {\n    PDFViewerApplication.l10n.get(\"rendering_error\").then(msg => {\n      PDFViewerApplication._otherError(msg, error);\n    });\n  }\n\n  PDFViewerApplication.externalServices.reportTelemetry({\n    type: \"pageInfo\",\n    timestamp\n  });\n  PDFViewerApplication.pdfDocument.getStats().then(function (stats) {\n    PDFViewerApplication.externalServices.reportTelemetry({\n      type: \"documentStats\",\n      stats\n    });\n  });\n}\n\nfunction webViewerPageMode({\n  mode\n}) {\n  let view;\n\n  switch (mode) {\n    case \"thumbs\":\n      view = _ui_utils.SidebarView.THUMBS;\n      break;\n\n    case \"bookmarks\":\n    case \"outline\":\n      view = _ui_utils.SidebarView.OUTLINE;\n      break;\n\n    case \"attachments\":\n      view = _ui_utils.SidebarView.ATTACHMENTS;\n      break;\n\n    case \"layers\":\n      view = _ui_utils.SidebarView.LAYERS;\n      break;\n\n    case \"none\":\n      view = _ui_utils.SidebarView.NONE;\n      break;\n\n    default:\n      console.error('Invalid \"pagemode\" hash parameter: ' + mode);\n      return;\n  }\n\n  PDFViewerApplication.pdfSidebar.switchView(view, true);\n}\n\nfunction webViewerNamedAction(evt) {\n  switch (evt.action) {\n    case \"GoToPage\":\n      PDFViewerApplication.appConfig.toolbar.pageNumber.select();\n      break;\n\n    case \"Find\":\n      if (!PDFViewerApplication.supportsIntegratedFind) {\n        PDFViewerApplication.findBar.toggle();\n      }\n\n      break;\n\n    case \"Print\":\n      PDFViewerApplication.triggerPrinting();\n      break;\n\n    case \"SaveAs\":\n      webViewerSave();\n      break;\n  }\n}\n\nfunction webViewerPresentationModeChanged(evt) {\n  PDFViewerApplication.pdfViewer.presentationModeState = evt.state;\n}\n\nfunction webViewerSidebarViewChanged(evt) {\n  PDFViewerApplication.pdfRenderingQueue.isThumbnailViewEnabled = PDFViewerApplication.pdfSidebar.isThumbnailViewVisible;\n  const store = PDFViewerApplication.store;\n\n  if (store && PDFViewerApplication.isInitialViewSet) {\n    store.set(\"sidebarView\", evt.view).catch(function () {});\n  }\n}\n\nfunction webViewerUpdateViewarea(evt) {\n  const location = evt.location,\n        store = PDFViewerApplication.store;\n\n  if (store && PDFViewerApplication.isInitialViewSet) {\n    store.setMultiple({\n      page: location.pageNumber,\n      zoom: location.scale,\n      scrollLeft: location.left,\n      scrollTop: location.top,\n      rotation: location.rotation\n    }).catch(function () {});\n  }\n\n  const href = PDFViewerApplication.pdfLinkService.getAnchorUrl(location.pdfOpenParams);\n  PDFViewerApplication.appConfig.toolbar.viewBookmark.href = href;\n  PDFViewerApplication.appConfig.secondaryToolbar.viewBookmarkButton.href = href;\n  const currentPage = PDFViewerApplication.pdfViewer.getPageView(PDFViewerApplication.page - 1);\n  const loading = currentPage?.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED;\n  PDFViewerApplication.toolbar.updateLoadingIndicatorState(loading);\n}\n\nfunction webViewerScrollModeChanged(evt) {\n  const store = PDFViewerApplication.store;\n\n  if (store && PDFViewerApplication.isInitialViewSet) {\n    store.set(\"scrollMode\", evt.mode).catch(function () {});\n  }\n}\n\nfunction webViewerSpreadModeChanged(evt) {\n  const store = PDFViewerApplication.store;\n\n  if (store && PDFViewerApplication.isInitialViewSet) {\n    store.set(\"spreadMode\", evt.mode).catch(function () {});\n  }\n}\n\nfunction webViewerResize() {\n  const {\n    pdfDocument,\n    pdfViewer\n  } = PDFViewerApplication;\n\n  if (!pdfDocument) {\n    return;\n  }\n\n  const currentScaleValue = pdfViewer.currentScaleValue;\n\n  if (currentScaleValue === \"auto\" || currentScaleValue === \"page-fit\" || currentScaleValue === \"page-width\") {\n    pdfViewer.currentScaleValue = currentScaleValue;\n  }\n\n  pdfViewer.update();\n}\n\nfunction webViewerHashchange(evt) {\n  const hash = evt.hash;\n\n  if (!hash) {\n    return;\n  }\n\n  if (!PDFViewerApplication.isInitialViewSet) {\n    PDFViewerApplication.initialBookmark = hash;\n  } else if (!PDFViewerApplication.pdfHistory.popStateInProgress) {\n    PDFViewerApplication.pdfLinkService.setHash(hash);\n  }\n}\n\nlet webViewerFileInputChange, webViewerOpenFile;\n{\n  webViewerFileInputChange = function (evt) {\n    if (PDFViewerApplication.pdfViewer?.isInPresentationMode) {\n      return;\n    }\n\n    const file = evt.fileInput.files[0];\n\n    if (!_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) {\n      let url = URL.createObjectURL(file);\n\n      if (file.name) {\n        url = {\n          url,\n          originalUrl: file.name\n        };\n      }\n\n      PDFViewerApplication.open(url);\n    } else {\n      PDFViewerApplication.setTitleUsingUrl(file.name);\n      const fileReader = new FileReader();\n\n      fileReader.onload = function webViewerChangeFileReaderOnload(event) {\n        const buffer = event.target.result;\n        PDFViewerApplication.open(new Uint8Array(buffer));\n      };\n\n      fileReader.readAsArrayBuffer(file);\n    }\n\n    const appConfig = PDFViewerApplication.appConfig;\n    appConfig.toolbar.viewBookmark.hidden = true;\n    appConfig.secondaryToolbar.viewBookmarkButton.hidden = true;\n    appConfig.toolbar.download.hidden = true;\n    appConfig.secondaryToolbar.downloadButton.hidden = true;\n  };\n\n  webViewerOpenFile = function (evt) {\n    const openFileInputName = PDFViewerApplication.appConfig.openFileInputName;\n    document.getElementById(openFileInputName).click();\n  };\n}\n\nfunction webViewerPresentationMode() {\n  PDFViewerApplication.requestPresentationMode();\n}\n\nfunction webViewerPrint() {\n  PDFViewerApplication.triggerPrinting();\n}\n\nfunction webViewerDownload() {\n  PDFViewerApplication.downloadOrSave({\n    sourceEventType: \"download\"\n  });\n}\n\nfunction webViewerSave() {\n  PDFViewerApplication.downloadOrSave({\n    sourceEventType: \"save\"\n  });\n}\n\nfunction webViewerFirstPage() {\n  if (PDFViewerApplication.pdfDocument) {\n    PDFViewerApplication.page = 1;\n  }\n}\n\nfunction webViewerLastPage() {\n  if (PDFViewerApplication.pdfDocument) {\n    PDFViewerApplication.page = PDFViewerApplication.pagesCount;\n  }\n}\n\nfunction webViewerNextPage() {\n  PDFViewerApplication.pdfViewer.nextPage();\n}\n\nfunction webViewerPreviousPage() {\n  PDFViewerApplication.pdfViewer.previousPage();\n}\n\nfunction webViewerZoomIn() {\n  PDFViewerApplication.zoomIn();\n}\n\nfunction webViewerZoomOut() {\n  PDFViewerApplication.zoomOut();\n}\n\nfunction webViewerZoomReset() {\n  PDFViewerApplication.zoomReset();\n}\n\nfunction webViewerPageNumberChanged(evt) {\n  const pdfViewer = PDFViewerApplication.pdfViewer;\n\n  if (evt.value !== \"\") {\n    PDFViewerApplication.pdfLinkService.goToPage(evt.value);\n  }\n\n  if (evt.value !== pdfViewer.currentPageNumber.toString() && evt.value !== pdfViewer.currentPageLabel) {\n    PDFViewerApplication.toolbar.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel);\n  }\n}\n\nfunction webViewerScaleChanged(evt) {\n  PDFViewerApplication.pdfViewer.currentScaleValue = evt.value;\n}\n\nfunction webViewerRotateCw() {\n  PDFViewerApplication.rotatePages(90);\n}\n\nfunction webViewerRotateCcw() {\n  PDFViewerApplication.rotatePages(-90);\n}\n\nfunction webViewerOptionalContentConfig(evt) {\n  PDFViewerApplication.pdfViewer.optionalContentConfigPromise = evt.promise;\n}\n\nfunction webViewerSwitchScrollMode(evt) {\n  PDFViewerApplication.pdfViewer.scrollMode = evt.mode;\n}\n\nfunction webViewerSwitchSpreadMode(evt) {\n  PDFViewerApplication.pdfViewer.spreadMode = evt.mode;\n}\n\nfunction webViewerDocumentProperties() {\n  PDFViewerApplication.pdfDocumentProperties.open();\n}\n\nfunction webViewerFind(evt) {\n  PDFViewerApplication.findController.executeCommand(\"find\" + evt.type, {\n    query: evt.query,\n    phraseSearch: evt.phraseSearch,\n    caseSensitive: evt.caseSensitive,\n    entireWord: evt.entireWord,\n    highlightAll: evt.highlightAll,\n    findPrevious: evt.findPrevious\n  });\n}\n\nfunction webViewerFindFromUrlHash(evt) {\n  PDFViewerApplication.findController.executeCommand(\"find\", {\n    query: evt.query,\n    phraseSearch: evt.phraseSearch,\n    caseSensitive: false,\n    entireWord: false,\n    highlightAll: true,\n    findPrevious: false\n  });\n}\n\nfunction webViewerUpdateFindMatchesCount({\n  matchesCount\n}) {\n  if (PDFViewerApplication.supportsIntegratedFind) {\n    PDFViewerApplication.externalServices.updateFindMatchesCount(matchesCount);\n  } else {\n    PDFViewerApplication.findBar.updateResultsCount(matchesCount);\n  }\n}\n\nfunction webViewerUpdateFindControlState({\n  state,\n  previous,\n  matchesCount,\n  rawQuery\n}) {\n  if (PDFViewerApplication.supportsIntegratedFind) {\n    PDFViewerApplication.externalServices.updateFindControlState({\n      result: state,\n      findPrevious: previous,\n      matchesCount,\n      rawQuery\n    });\n  } else {\n    PDFViewerApplication.findBar.updateUIState(state, previous, matchesCount);\n  }\n}\n\nfunction webViewerScaleChanging(evt) {\n  PDFViewerApplication.toolbar.setPageScale(evt.presetValue, evt.scale);\n  PDFViewerApplication.pdfViewer.update();\n}\n\nfunction webViewerRotationChanging(evt) {\n  PDFViewerApplication.pdfThumbnailViewer.pagesRotation = evt.pagesRotation;\n  PDFViewerApplication.forceRendering();\n  PDFViewerApplication.pdfViewer.currentPageNumber = evt.pageNumber;\n}\n\nfunction webViewerPageChanging({\n  pageNumber,\n  pageLabel\n}) {\n  PDFViewerApplication.toolbar.setPageNumber(pageNumber, pageLabel);\n  PDFViewerApplication.secondaryToolbar.setPageNumber(pageNumber);\n\n  if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {\n    PDFViewerApplication.pdfThumbnailViewer.scrollThumbnailIntoView(pageNumber);\n  }\n}\n\nfunction webViewerVisibilityChange(evt) {\n  if (document.visibilityState === \"visible\") {\n    setZoomDisabledTimeout();\n  }\n}\n\nlet zoomDisabledTimeout = null;\n\nfunction setZoomDisabledTimeout() {\n  if (zoomDisabledTimeout) {\n    clearTimeout(zoomDisabledTimeout);\n  }\n\n  zoomDisabledTimeout = setTimeout(function () {\n    zoomDisabledTimeout = null;\n  }, WHEEL_ZOOM_DISABLED_TIMEOUT);\n}\n\nfunction webViewerWheel(evt) {\n  const {\n    pdfViewer,\n    supportedMouseWheelZoomModifierKeys\n  } = PDFViewerApplication;\n\n  if (pdfViewer.isInPresentationMode) {\n    return;\n  }\n\n  if (evt.ctrlKey && supportedMouseWheelZoomModifierKeys.ctrlKey || evt.metaKey && supportedMouseWheelZoomModifierKeys.metaKey) {\n    evt.preventDefault();\n\n    if (zoomDisabledTimeout || document.visibilityState === \"hidden\") {\n      return;\n    }\n\n    const previousScale = pdfViewer.currentScale;\n    const delta = (0, _ui_utils.normalizeWheelEventDirection)(evt);\n    let ticks = 0;\n\n    if (evt.deltaMode === WheelEvent.DOM_DELTA_LINE || evt.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n      if (Math.abs(delta) >= 1) {\n        ticks = Math.sign(delta);\n      } else {\n        ticks = PDFViewerApplication.accumulateWheelTicks(delta);\n      }\n    } else {\n      const PIXELS_PER_LINE_SCALE = 30;\n      ticks = PDFViewerApplication.accumulateWheelTicks(delta / PIXELS_PER_LINE_SCALE);\n    }\n\n    if (ticks < 0) {\n      PDFViewerApplication.zoomOut(-ticks);\n    } else if (ticks > 0) {\n      PDFViewerApplication.zoomIn(ticks);\n    }\n\n    const currentScale = pdfViewer.currentScale;\n\n    if (previousScale !== currentScale) {\n      const scaleCorrectionFactor = currentScale / previousScale - 1;\n      const rect = pdfViewer.container.getBoundingClientRect();\n      const dx = evt.clientX - rect.left;\n      const dy = evt.clientY - rect.top;\n      pdfViewer.container.scrollLeft += dx * scaleCorrectionFactor;\n      pdfViewer.container.scrollTop += dy * scaleCorrectionFactor;\n    }\n  } else {\n    setZoomDisabledTimeout();\n  }\n}\n\nfunction webViewerTouchStart(evt) {\n  if (evt.touches.length > 1) {\n    evt.preventDefault();\n  }\n}\n\nfunction webViewerClick(evt) {\n  if (PDFViewerApplication.triggerDelayedFallback && PDFViewerApplication.pdfViewer.containsElement(evt.target)) {\n    PDFViewerApplication.triggerDelayedFallback();\n  }\n\n  if (!PDFViewerApplication.secondaryToolbar.isOpen) {\n    return;\n  }\n\n  const appConfig = PDFViewerApplication.appConfig;\n\n  if (PDFViewerApplication.pdfViewer.containsElement(evt.target) || appConfig.toolbar.container.contains(evt.target) && evt.target !== appConfig.secondaryToolbar.toggleButton) {\n    PDFViewerApplication.secondaryToolbar.close();\n  }\n}\n\nfunction webViewerKeyUp(evt) {\n  if (evt.keyCode === 9) {\n    if (PDFViewerApplication.triggerDelayedFallback) {\n      PDFViewerApplication.triggerDelayedFallback();\n    }\n  }\n}\n\nfunction webViewerKeyDown(evt) {\n  if (PDFViewerApplication.overlayManager.active) {\n    return;\n  }\n\n  let handled = false,\n      ensureViewerFocused = false;\n  const cmd = (evt.ctrlKey ? 1 : 0) | (evt.altKey ? 2 : 0) | (evt.shiftKey ? 4 : 0) | (evt.metaKey ? 8 : 0);\n  const pdfViewer = PDFViewerApplication.pdfViewer;\n  const isViewerInPresentationMode = pdfViewer?.isInPresentationMode;\n\n  if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) {\n    switch (evt.keyCode) {\n      case 70:\n        if (!PDFViewerApplication.supportsIntegratedFind && !evt.shiftKey) {\n          PDFViewerApplication.findBar.open();\n          handled = true;\n        }\n\n        break;\n\n      case 71:\n        if (!PDFViewerApplication.supportsIntegratedFind) {\n          const findState = PDFViewerApplication.findController.state;\n\n          if (findState) {\n            PDFViewerApplication.findController.executeCommand(\"findagain\", {\n              query: findState.query,\n              phraseSearch: findState.phraseSearch,\n              caseSensitive: findState.caseSensitive,\n              entireWord: findState.entireWord,\n              highlightAll: findState.highlightAll,\n              findPrevious: cmd === 5 || cmd === 12\n            });\n          }\n\n          handled = true;\n        }\n\n        break;\n\n      case 61:\n      case 107:\n      case 187:\n      case 171:\n        if (!isViewerInPresentationMode) {\n          PDFViewerApplication.zoomIn();\n        }\n\n        handled = true;\n        break;\n\n      case 173:\n      case 109:\n      case 189:\n        if (!isViewerInPresentationMode) {\n          PDFViewerApplication.zoomOut();\n        }\n\n        handled = true;\n        break;\n\n      case 48:\n      case 96:\n        if (!isViewerInPresentationMode) {\n          setTimeout(function () {\n            PDFViewerApplication.zoomReset();\n          });\n          handled = false;\n        }\n\n        break;\n\n      case 38:\n        if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {\n          PDFViewerApplication.page = 1;\n          handled = true;\n          ensureViewerFocused = true;\n        }\n\n        break;\n\n      case 40:\n        if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) {\n          PDFViewerApplication.page = PDFViewerApplication.pagesCount;\n          handled = true;\n          ensureViewerFocused = true;\n        }\n\n        break;\n    }\n  }\n\n  const {\n    eventBus\n  } = PDFViewerApplication;\n\n  if (cmd === 1 || cmd === 8) {\n    switch (evt.keyCode) {\n      case 83:\n        eventBus.dispatch(\"download\", {\n          source: window\n        });\n        handled = true;\n        break;\n\n      case 79:\n        {\n          eventBus.dispatch(\"openfile\", {\n            source: window\n          });\n          handled = true;\n        }\n        break;\n    }\n  }\n\n  if (cmd === 3 || cmd === 10) {\n    switch (evt.keyCode) {\n      case 80:\n        PDFViewerApplication.requestPresentationMode();\n        handled = true;\n        break;\n\n      case 71:\n        PDFViewerApplication.appConfig.toolbar.pageNumber.select();\n        handled = true;\n        break;\n    }\n  }\n\n  if (handled) {\n    if (ensureViewerFocused && !isViewerInPresentationMode) {\n      pdfViewer.focus();\n    }\n\n    evt.preventDefault();\n    return;\n  }\n\n  const curElement = (0, _ui_utils.getActiveOrFocusedElement)();\n  const curElementTagName = curElement?.tagName.toUpperCase();\n\n  if (curElementTagName === \"INPUT\" || curElementTagName === \"TEXTAREA\" || curElementTagName === \"SELECT\" || curElement?.isContentEditable) {\n    if (evt.keyCode !== 27) {\n      return;\n    }\n  }\n\n  if (cmd === 0) {\n    let turnPage = 0,\n        turnOnlyIfPageFit = false;\n\n    switch (evt.keyCode) {\n      case 38:\n      case 33:\n        if (pdfViewer.isVerticalScrollbarEnabled) {\n          turnOnlyIfPageFit = true;\n        }\n\n        turnPage = -1;\n        break;\n\n      case 8:\n        if (!isViewerInPresentationMode) {\n          turnOnlyIfPageFit = true;\n        }\n\n        turnPage = -1;\n        break;\n\n      case 37:\n        if (pdfViewer.isHorizontalScrollbarEnabled) {\n          turnOnlyIfPageFit = true;\n        }\n\n      case 75:\n      case 80:\n        turnPage = -1;\n        break;\n\n      case 27:\n        if (PDFViewerApplication.secondaryToolbar.isOpen) {\n          PDFViewerApplication.secondaryToolbar.close();\n          handled = true;\n        }\n\n        if (!PDFViewerApplication.supportsIntegratedFind && PDFViewerApplication.findBar.opened) {\n          PDFViewerApplication.findBar.close();\n          handled = true;\n        }\n\n        break;\n\n      case 40:\n      case 34:\n        if (pdfViewer.isVerticalScrollbarEnabled) {\n          turnOnlyIfPageFit = true;\n        }\n\n        turnPage = 1;\n        break;\n\n      case 13:\n      case 32:\n        if (!isViewerInPresentationMode) {\n          turnOnlyIfPageFit = true;\n        }\n\n        turnPage = 1;\n        break;\n\n      case 39:\n        if (pdfViewer.isHorizontalScrollbarEnabled) {\n          turnOnlyIfPageFit = true;\n        }\n\n      case 74:\n      case 78:\n        turnPage = 1;\n        break;\n\n      case 36:\n        if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {\n          PDFViewerApplication.page = 1;\n          handled = true;\n          ensureViewerFocused = true;\n        }\n\n        break;\n\n      case 35:\n        if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) {\n          PDFViewerApplication.page = PDFViewerApplication.pagesCount;\n          handled = true;\n          ensureViewerFocused = true;\n        }\n\n        break;\n\n      case 83:\n        PDFViewerApplication.pdfCursorTools.switchTool(_pdf_cursor_tools.CursorTool.SELECT);\n        break;\n\n      case 72:\n        PDFViewerApplication.pdfCursorTools.switchTool(_pdf_cursor_tools.CursorTool.HAND);\n        break;\n\n      case 82:\n        PDFViewerApplication.rotatePages(90);\n        break;\n\n      case 115:\n        PDFViewerApplication.pdfSidebar.toggle();\n        break;\n    }\n\n    if (turnPage !== 0 && (!turnOnlyIfPageFit || pdfViewer.currentScaleValue === \"page-fit\")) {\n      if (turnPage > 0) {\n        pdfViewer.nextPage();\n      } else {\n        pdfViewer.previousPage();\n      }\n\n      handled = true;\n    }\n  }\n\n  if (cmd === 4) {\n    switch (evt.keyCode) {\n      case 13:\n      case 32:\n        if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== \"page-fit\") {\n          break;\n        }\n\n        if (PDFViewerApplication.page > 1) {\n          PDFViewerApplication.page--;\n        }\n\n        handled = true;\n        break;\n\n      case 82:\n        PDFViewerApplication.rotatePages(-90);\n        break;\n    }\n  }\n\n  if (!handled && !isViewerInPresentationMode) {\n    if (evt.keyCode >= 33 && evt.keyCode <= 40 || evt.keyCode === 32 && curElementTagName !== \"BUTTON\") {\n      ensureViewerFocused = true;\n    }\n  }\n\n  if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) {\n    pdfViewer.focus();\n  }\n\n  if (handled) {\n    evt.preventDefault();\n  }\n}\n\nfunction beforeUnload(evt) {\n  evt.preventDefault();\n  evt.returnValue = \"\";\n  return false;\n}\n\nconst PDFPrintServiceFactory = {\n  instance: {\n    supportsPrinting: false,\n\n    createPrintService() {\n      throw new Error(\"Not implemented: createPrintService\");\n    }\n\n  }\n};\nexports.PDFPrintServiceFactory = PDFPrintServiceFactory;\n\n/***/ }),\n/* 4 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.apiPageLayoutToSpreadMode = apiPageLayoutToSpreadMode;\nexports.apiPageModeToSidebarView = apiPageModeToSidebarView;\nexports.approximateFraction = approximateFraction;\nexports.backtrackBeforeAllVisibleElements = backtrackBeforeAllVisibleElements;\nexports.binarySearchFirstItem = binarySearchFirstItem;\nexports.getActiveOrFocusedElement = getActiveOrFocusedElement;\nexports.getOutputScale = getOutputScale;\nexports.getPageSizeInches = getPageSizeInches;\nexports.getVisibleElements = getVisibleElements;\nexports.isPortraitOrientation = isPortraitOrientation;\nexports.isValidRotation = isValidRotation;\nexports.isValidScrollMode = isValidScrollMode;\nexports.isValidSpreadMode = isValidSpreadMode;\nexports.moveToEndOfArray = moveToEndOfArray;\nexports.noContextMenuHandler = noContextMenuHandler;\nexports.normalizeWheelEventDelta = normalizeWheelEventDelta;\nexports.normalizeWheelEventDirection = normalizeWheelEventDirection;\nexports.parseQueryString = parseQueryString;\nexports.roundToDivide = roundToDivide;\nexports.scrollIntoView = scrollIntoView;\nexports.waitOnEventOrTimeout = waitOnEventOrTimeout;\nexports.watchScroll = watchScroll;\nexports.WaitOnType = exports.VERTICAL_PADDING = exports.UNKNOWN_SCALE = exports.TextLayerMode = exports.SpreadMode = exports.SidebarView = exports.ScrollMode = exports.SCROLLBAR_PADDING = exports.RendererType = exports.ProgressBar = exports.PresentationModeState = exports.MIN_SCALE = exports.MAX_SCALE = exports.MAX_AUTO_SCALE = exports.EventBus = exports.DEFAULT_SCALE_VALUE = exports.DEFAULT_SCALE = exports.CSS_UNITS = exports.AutoPrintRegExp = exports.animationStarted = void 0;\nconst CSS_UNITS = 96.0 / 72.0;\nexports.CSS_UNITS = CSS_UNITS;\nconst DEFAULT_SCALE_VALUE = \"auto\";\nexports.DEFAULT_SCALE_VALUE = DEFAULT_SCALE_VALUE;\nconst DEFAULT_SCALE = 1.0;\nexports.DEFAULT_SCALE = DEFAULT_SCALE;\nconst MIN_SCALE = 0.1;\nexports.MIN_SCALE = MIN_SCALE;\nconst MAX_SCALE = 10.0;\nexports.MAX_SCALE = MAX_SCALE;\nconst UNKNOWN_SCALE = 0;\nexports.UNKNOWN_SCALE = UNKNOWN_SCALE;\nconst MAX_AUTO_SCALE = 1.25;\nexports.MAX_AUTO_SCALE = MAX_AUTO_SCALE;\nconst SCROLLBAR_PADDING = 40;\nexports.SCROLLBAR_PADDING = SCROLLBAR_PADDING;\nconst VERTICAL_PADDING = 5;\nexports.VERTICAL_PADDING = VERTICAL_PADDING;\nconst LOADINGBAR_END_OFFSET_VAR = \"--loadingBar-end-offset\";\nconst PresentationModeState = {\n  UNKNOWN: 0,\n  NORMAL: 1,\n  CHANGING: 2,\n  FULLSCREEN: 3\n};\nexports.PresentationModeState = PresentationModeState;\nconst SidebarView = {\n  UNKNOWN: -1,\n  NONE: 0,\n  THUMBS: 1,\n  OUTLINE: 2,\n  ATTACHMENTS: 3,\n  LAYERS: 4\n};\nexports.SidebarView = SidebarView;\nconst RendererType = {\n  CANVAS: \"canvas\",\n  SVG: \"svg\"\n};\nexports.RendererType = RendererType;\nconst TextLayerMode = {\n  DISABLE: 0,\n  ENABLE: 1,\n  ENABLE_ENHANCE: 2\n};\nexports.TextLayerMode = TextLayerMode;\nconst ScrollMode = {\n  UNKNOWN: -1,\n  VERTICAL: 0,\n  HORIZONTAL: 1,\n  WRAPPED: 2\n};\nexports.ScrollMode = ScrollMode;\nconst SpreadMode = {\n  UNKNOWN: -1,\n  NONE: 0,\n  ODD: 1,\n  EVEN: 2\n};\nexports.SpreadMode = SpreadMode;\nconst AutoPrintRegExp = /\\bprint\\s*\\(/;\nexports.AutoPrintRegExp = AutoPrintRegExp;\n\nfunction getOutputScale(ctx) {\n  const devicePixelRatio = window.devicePixelRatio || 1;\n  const backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;\n  const pixelRatio = devicePixelRatio / backingStoreRatio;\n  return {\n    sx: pixelRatio,\n    sy: pixelRatio,\n    scaled: pixelRatio !== 1\n  };\n}\n\nfunction scrollIntoView(element, spot, skipOverflowHiddenElements = false) {\n  let parent = element.offsetParent;\n\n  if (!parent) {\n    console.error(\"offsetParent is not set -- cannot scroll\");\n    return;\n  }\n\n  let offsetY = element.offsetTop + element.clientTop;\n  let offsetX = element.offsetLeft + element.clientLeft;\n\n  while (parent.clientHeight === parent.scrollHeight && parent.clientWidth === parent.scrollWidth || skipOverflowHiddenElements && getComputedStyle(parent).overflow === \"hidden\") {\n    if (parent.dataset._scaleY) {\n      offsetY /= parent.dataset._scaleY;\n      offsetX /= parent.dataset._scaleX;\n    }\n\n    offsetY += parent.offsetTop;\n    offsetX += parent.offsetLeft;\n    parent = parent.offsetParent;\n\n    if (!parent) {\n      return;\n    }\n  }\n\n  if (spot) {\n    if (spot.top !== undefined) {\n      offsetY += spot.top;\n    }\n\n    if (spot.left !== undefined) {\n      offsetX += spot.left;\n      parent.scrollLeft = offsetX;\n    }\n  }\n\n  parent.scrollTop = offsetY;\n}\n\nfunction watchScroll(viewAreaElement, callback) {\n  const debounceScroll = function (evt) {\n    if (rAF) {\n      return;\n    }\n\n    rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {\n      rAF = null;\n      const currentX = viewAreaElement.scrollLeft;\n      const lastX = state.lastX;\n\n      if (currentX !== lastX) {\n        state.right = currentX > lastX;\n      }\n\n      state.lastX = currentX;\n      const currentY = viewAreaElement.scrollTop;\n      const lastY = state.lastY;\n\n      if (currentY !== lastY) {\n        state.down = currentY > lastY;\n      }\n\n      state.lastY = currentY;\n      callback(state);\n    });\n  };\n\n  const state = {\n    right: true,\n    down: true,\n    lastX: viewAreaElement.scrollLeft,\n    lastY: viewAreaElement.scrollTop,\n    _eventHandler: debounceScroll\n  };\n  let rAF = null;\n  viewAreaElement.addEventListener(\"scroll\", debounceScroll, true);\n  return state;\n}\n\nfunction parseQueryString(query) {\n  const parts = query.split(\"&\");\n  const params = Object.create(null);\n\n  for (let i = 0, ii = parts.length; i < ii; ++i) {\n    const param = parts[i].split(\"=\");\n    const key = param[0].toLowerCase();\n    const value = param.length > 1 ? param[1] : null;\n    params[decodeURIComponent(key)] = decodeURIComponent(value);\n  }\n\n  return params;\n}\n\nfunction binarySearchFirstItem(items, condition) {\n  let minIndex = 0;\n  let maxIndex = items.length - 1;\n\n  if (maxIndex < 0 || !condition(items[maxIndex])) {\n    return items.length;\n  }\n\n  if (condition(items[minIndex])) {\n    return minIndex;\n  }\n\n  while (minIndex < maxIndex) {\n    const currentIndex = minIndex + maxIndex >> 1;\n    const currentItem = items[currentIndex];\n\n    if (condition(currentItem)) {\n      maxIndex = currentIndex;\n    } else {\n      minIndex = currentIndex + 1;\n    }\n  }\n\n  return minIndex;\n}\n\nfunction approximateFraction(x) {\n  if (Math.floor(x) === x) {\n    return [x, 1];\n  }\n\n  const xinv = 1 / x;\n  const limit = 8;\n\n  if (xinv > limit) {\n    return [1, limit];\n  } else if (Math.floor(xinv) === xinv) {\n    return [1, xinv];\n  }\n\n  const x_ = x > 1 ? xinv : x;\n  let a = 0,\n      b = 1,\n      c = 1,\n      d = 1;\n\n  while (true) {\n    const p = a + c,\n          q = b + d;\n\n    if (q > limit) {\n      break;\n    }\n\n    if (x_ <= p / q) {\n      c = p;\n      d = q;\n    } else {\n      a = p;\n      b = q;\n    }\n  }\n\n  let result;\n\n  if (x_ - a / b < c / d - x_) {\n    result = x_ === x ? [a, b] : [b, a];\n  } else {\n    result = x_ === x ? [c, d] : [d, c];\n  }\n\n  return result;\n}\n\nfunction roundToDivide(x, div) {\n  const r = x % div;\n  return r === 0 ? x : Math.round(x - r + div);\n}\n\nfunction getPageSizeInches({\n  view,\n  userUnit,\n  rotate\n}) {\n  const [x1, y1, x2, y2] = view;\n  const changeOrientation = rotate % 180 !== 0;\n  const width = (x2 - x1) / 72 * userUnit;\n  const height = (y2 - y1) / 72 * userUnit;\n  return {\n    width: changeOrientation ? height : width,\n    height: changeOrientation ? width : height\n  };\n}\n\nfunction backtrackBeforeAllVisibleElements(index, views, top) {\n  if (index < 2) {\n    return index;\n  }\n\n  let elt = views[index].div;\n  let pageTop = elt.offsetTop + elt.clientTop;\n\n  if (pageTop >= top) {\n    elt = views[index - 1].div;\n    pageTop = elt.offsetTop + elt.clientTop;\n  }\n\n  for (let i = index - 2; i >= 0; --i) {\n    elt = views[i].div;\n\n    if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) {\n      break;\n    }\n\n    index = i;\n  }\n\n  return index;\n}\n\nfunction getVisibleElements({\n  scrollEl,\n  views,\n  sortByVisibility = false,\n  horizontal = false,\n  rtl = false\n}) {\n  const top = scrollEl.scrollTop,\n        bottom = top + scrollEl.clientHeight;\n  const left = scrollEl.scrollLeft,\n        right = left + scrollEl.clientWidth;\n\n  function isElementBottomAfterViewTop(view) {\n    const element = view.div;\n    const elementBottom = element.offsetTop + element.clientTop + element.clientHeight;\n    return elementBottom > top;\n  }\n\n  function isElementNextAfterViewHorizontally(view) {\n    const element = view.div;\n    const elementLeft = element.offsetLeft + element.clientLeft;\n    const elementRight = elementLeft + element.clientWidth;\n    return rtl ? elementLeft < right : elementRight > left;\n  }\n\n  const visible = [],\n        numViews = views.length;\n  let firstVisibleElementInd = binarySearchFirstItem(views, horizontal ? isElementNextAfterViewHorizontally : isElementBottomAfterViewTop);\n\n  if (firstVisibleElementInd > 0 && firstVisibleElementInd < numViews && !horizontal) {\n    firstVisibleElementInd = backtrackBeforeAllVisibleElements(firstVisibleElementInd, views, top);\n  }\n\n  let lastEdge = horizontal ? right : -1;\n\n  for (let i = firstVisibleElementInd; i < numViews; i++) {\n    const view = views[i],\n          element = view.div;\n    const currentWidth = element.offsetLeft + element.clientLeft;\n    const currentHeight = element.offsetTop + element.clientTop;\n    const viewWidth = element.clientWidth,\n          viewHeight = element.clientHeight;\n    const viewRight = currentWidth + viewWidth;\n    const viewBottom = currentHeight + viewHeight;\n\n    if (lastEdge === -1) {\n      if (viewBottom >= bottom) {\n        lastEdge = viewBottom;\n      }\n    } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) {\n      break;\n    }\n\n    if (viewBottom <= top || currentHeight >= bottom || viewRight <= left || currentWidth >= right) {\n      continue;\n    }\n\n    const hiddenHeight = Math.max(0, top - currentHeight) + Math.max(0, viewBottom - bottom);\n    const hiddenWidth = Math.max(0, left - currentWidth) + Math.max(0, viewRight - right);\n    const fractionHeight = (viewHeight - hiddenHeight) / viewHeight,\n          fractionWidth = (viewWidth - hiddenWidth) / viewWidth;\n    const percent = fractionHeight * fractionWidth * 100 | 0;\n    visible.push({\n      id: view.id,\n      x: currentWidth,\n      y: currentHeight,\n      view,\n      percent,\n      widthPercent: fractionWidth * 100 | 0\n    });\n  }\n\n  const first = visible[0],\n        last = visible[visible.length - 1];\n\n  if (sortByVisibility) {\n    visible.sort(function (a, b) {\n      const pc = a.percent - b.percent;\n\n      if (Math.abs(pc) > 0.001) {\n        return -pc;\n      }\n\n      return a.id - b.id;\n    });\n  }\n\n  return {\n    first,\n    last,\n    views: visible\n  };\n}\n\nfunction noContextMenuHandler(evt) {\n  evt.preventDefault();\n}\n\nfunction normalizeWheelEventDirection(evt) {\n  let delta = Math.hypot(evt.deltaX, evt.deltaY);\n  const angle = Math.atan2(evt.deltaY, evt.deltaX);\n\n  if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {\n    delta = -delta;\n  }\n\n  return delta;\n}\n\nfunction normalizeWheelEventDelta(evt) {\n  let delta = normalizeWheelEventDirection(evt);\n  const MOUSE_DOM_DELTA_PIXEL_MODE = 0;\n  const MOUSE_DOM_DELTA_LINE_MODE = 1;\n  const MOUSE_PIXELS_PER_LINE = 30;\n  const MOUSE_LINES_PER_PAGE = 30;\n\n  if (evt.deltaMode === MOUSE_DOM_DELTA_PIXEL_MODE) {\n    delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE;\n  } else if (evt.deltaMode === MOUSE_DOM_DELTA_LINE_MODE) {\n    delta /= MOUSE_LINES_PER_PAGE;\n  }\n\n  return delta;\n}\n\nfunction isValidRotation(angle) {\n  return Number.isInteger(angle) && angle % 90 === 0;\n}\n\nfunction isValidScrollMode(mode) {\n  return Number.isInteger(mode) && Object.values(ScrollMode).includes(mode) && mode !== ScrollMode.UNKNOWN;\n}\n\nfunction isValidSpreadMode(mode) {\n  return Number.isInteger(mode) && Object.values(SpreadMode).includes(mode) && mode !== SpreadMode.UNKNOWN;\n}\n\nfunction isPortraitOrientation(size) {\n  return size.width <= size.height;\n}\n\nconst WaitOnType = {\n  EVENT: \"event\",\n  TIMEOUT: \"timeout\"\n};\nexports.WaitOnType = WaitOnType;\n\nfunction waitOnEventOrTimeout({\n  target,\n  name,\n  delay = 0\n}) {\n  return new Promise(function (resolve, reject) {\n    if (typeof target !== \"object\" || !(name && typeof name === \"string\") || !(Number.isInteger(delay) && delay >= 0)) {\n      throw new Error(\"waitOnEventOrTimeout - invalid parameters.\");\n    }\n\n    function handler(type) {\n      if (target instanceof EventBus) {\n        target._off(name, eventHandler);\n      } else {\n        target.removeEventListener(name, eventHandler);\n      }\n\n      if (timeout) {\n        clearTimeout(timeout);\n      }\n\n      resolve(type);\n    }\n\n    const eventHandler = handler.bind(null, WaitOnType.EVENT);\n\n    if (target instanceof EventBus) {\n      target._on(name, eventHandler);\n    } else {\n      target.addEventListener(name, eventHandler);\n    }\n\n    const timeoutHandler = handler.bind(null, WaitOnType.TIMEOUT);\n    const timeout = setTimeout(timeoutHandler, delay);\n  });\n}\n\nconst animationStarted = new Promise(function (resolve) {\n  window.requestAnimationFrame(resolve);\n});\nexports.animationStarted = animationStarted;\n\nfunction dispatchDOMEvent(eventName, args = null) {\n  throw new Error(\"Not implemented: dispatchDOMEvent\");\n}\n\nclass EventBus {\n  constructor(options) {\n    this._listeners = Object.create(null);\n  }\n\n  on(eventName, listener, options = null) {\n    this._on(eventName, listener, {\n      external: true,\n      once: options?.once\n    });\n  }\n\n  off(eventName, listener, options = null) {\n    this._off(eventName, listener, {\n      external: true,\n      once: options?.once\n    });\n  }\n\n  dispatch(eventName) {\n    const eventListeners = this._listeners[eventName];\n\n    if (!eventListeners || eventListeners.length === 0) {\n      return;\n    }\n\n    const args = Array.prototype.slice.call(arguments, 1);\n    let externalListeners;\n    eventListeners.slice(0).forEach(({\n      listener,\n      external,\n      once\n    }) => {\n      if (once) {\n        this._off(eventName, listener);\n      }\n\n      if (external) {\n        (externalListeners || (externalListeners = [])).push(listener);\n        return;\n      }\n\n      listener.apply(null, args);\n    });\n\n    if (externalListeners) {\n      externalListeners.forEach(listener => {\n        listener.apply(null, args);\n      });\n      externalListeners = null;\n    }\n  }\n\n  _on(eventName, listener, options = null) {\n    var _this$_listeners;\n\n    const eventListeners = (_this$_listeners = this._listeners)[eventName] || (_this$_listeners[eventName] = []);\n    eventListeners.push({\n      listener,\n      external: options?.external === true,\n      once: options?.once === true\n    });\n  }\n\n  _off(eventName, listener, options = null) {\n    const eventListeners = this._listeners[eventName];\n\n    if (!eventListeners) {\n      return;\n    }\n\n    for (let i = 0, ii = eventListeners.length; i < ii; i++) {\n      if (eventListeners[i].listener === listener) {\n        eventListeners.splice(i, 1);\n        return;\n      }\n    }\n  }\n\n}\n\nexports.EventBus = EventBus;\n\nfunction clamp(v, min, max) {\n  return Math.min(Math.max(v, min), max);\n}\n\nclass ProgressBar {\n  constructor(id, {\n    height,\n    width,\n    units\n  } = {}) {\n    this.visible = true;\n    this.div = document.querySelector(id + \" .progress\");\n    this.bar = this.div.parentNode;\n    this.height = height || 100;\n    this.width = width || 100;\n    this.units = units || \"%\";\n    this.div.style.height = this.height + this.units;\n    this.percent = 0;\n  }\n\n  _updateBar() {\n    if (this._indeterminate) {\n      this.div.classList.add(\"indeterminate\");\n      this.div.style.width = this.width + this.units;\n      return;\n    }\n\n    this.div.classList.remove(\"indeterminate\");\n    const progressSize = this.width * this._percent / 100;\n    this.div.style.width = progressSize + this.units;\n  }\n\n  get percent() {\n    return this._percent;\n  }\n\n  set percent(val) {\n    this._indeterminate = isNaN(val);\n    this._percent = clamp(val, 0, 100);\n\n    this._updateBar();\n  }\n\n  setWidth(viewer) {\n    if (!viewer) {\n      return;\n    }\n\n    const container = viewer.parentNode;\n    const scrollbarWidth = container.offsetWidth - viewer.offsetWidth;\n\n    if (scrollbarWidth > 0) {\n      const doc = document.documentElement;\n      doc.style.setProperty(LOADINGBAR_END_OFFSET_VAR, `${scrollbarWidth}px`);\n    }\n  }\n\n  hide() {\n    if (!this.visible) {\n      return;\n    }\n\n    this.visible = false;\n    this.bar.classList.add(\"hidden\");\n  }\n\n  show() {\n    if (this.visible) {\n      return;\n    }\n\n    this.visible = true;\n    this.bar.classList.remove(\"hidden\");\n  }\n\n}\n\nexports.ProgressBar = ProgressBar;\n\nfunction moveToEndOfArray(arr, condition) {\n  const moved = [],\n        len = arr.length;\n  let write = 0;\n\n  for (let read = 0; read < len; ++read) {\n    if (condition(arr[read])) {\n      moved.push(arr[read]);\n    } else {\n      arr[write] = arr[read];\n      ++write;\n    }\n  }\n\n  for (let read = 0; write < len; ++read, ++write) {\n    arr[write] = moved[read];\n  }\n}\n\nfunction getActiveOrFocusedElement() {\n  let curRoot = document;\n  let curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(\":focus\");\n\n  while (curActiveOrFocused?.shadowRoot) {\n    curRoot = curActiveOrFocused.shadowRoot;\n    curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(\":focus\");\n  }\n\n  return curActiveOrFocused;\n}\n\nfunction apiPageLayoutToSpreadMode(layout) {\n  switch (layout) {\n    case \"SinglePage\":\n    case \"OneColumn\":\n      return SpreadMode.NONE;\n\n    case \"TwoColumnLeft\":\n    case \"TwoPageLeft\":\n      return SpreadMode.ODD;\n\n    case \"TwoColumnRight\":\n    case \"TwoPageRight\":\n      return SpreadMode.EVEN;\n  }\n\n  return SpreadMode.NONE;\n}\n\nfunction apiPageModeToSidebarView(mode) {\n  switch (mode) {\n    case \"UseNone\":\n      return SidebarView.NONE;\n\n    case \"UseThumbs\":\n      return SidebarView.THUMBS;\n\n    case \"UseOutlines\":\n      return SidebarView.OUTLINE;\n\n    case \"UseAttachments\":\n      return SidebarView.ATTACHMENTS;\n\n    case \"UseOC\":\n      return SidebarView.LAYERS;\n  }\n\n  return SidebarView.NONE;\n}\n\n/***/ }),\n/* 5 */\n/***/ ((module) => {\n\n\n\nlet pdfjsLib;\n\nif (typeof window !== \"undefined\" && window[\"pdfjs-dist/build/pdf\"]) {\n  pdfjsLib = window[\"pdfjs-dist/build/pdf\"];\n} else {\n  pdfjsLib = require(\"../build/pdf.js\");\n}\n\nmodule.exports = pdfjsLib;\n\n/***/ }),\n/* 6 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFCursorTools = exports.CursorTool = void 0;\n\nvar _grab_to_pan = __webpack_require__(7);\n\nvar _ui_utils = __webpack_require__(4);\n\nconst CursorTool = {\n  SELECT: 0,\n  HAND: 1,\n  ZOOM: 2\n};\nexports.CursorTool = CursorTool;\n\nclass PDFCursorTools {\n  constructor({\n    container,\n    eventBus,\n    cursorToolOnLoad = CursorTool.SELECT\n  }) {\n    this.container = container;\n    this.eventBus = eventBus;\n    this.active = CursorTool.SELECT;\n    this.activeBeforePresentationMode = null;\n    this.handTool = new _grab_to_pan.GrabToPan({\n      element: this.container\n    });\n\n    this._addEventListeners();\n\n    Promise.resolve().then(() => {\n      this.switchTool(cursorToolOnLoad);\n    });\n  }\n\n  get activeTool() {\n    return this.active;\n  }\n\n  switchTool(tool) {\n    if (this.activeBeforePresentationMode !== null) {\n      return;\n    }\n\n    if (tool === this.active) {\n      return;\n    }\n\n    const disableActiveTool = () => {\n      switch (this.active) {\n        case CursorTool.SELECT:\n          break;\n\n        case CursorTool.HAND:\n          this.handTool.deactivate();\n          break;\n\n        case CursorTool.ZOOM:\n      }\n    };\n\n    switch (tool) {\n      case CursorTool.SELECT:\n        disableActiveTool();\n        break;\n\n      case CursorTool.HAND:\n        disableActiveTool();\n        this.handTool.activate();\n        break;\n\n      case CursorTool.ZOOM:\n      default:\n        console.error(`switchTool: \"${tool}\" is an unsupported value.`);\n        return;\n    }\n\n    this.active = tool;\n\n    this._dispatchEvent();\n  }\n\n  _dispatchEvent() {\n    this.eventBus.dispatch(\"cursortoolchanged\", {\n      source: this,\n      tool: this.active\n    });\n  }\n\n  _addEventListeners() {\n    this.eventBus._on(\"switchcursortool\", evt => {\n      this.switchTool(evt.tool);\n    });\n\n    this.eventBus._on(\"presentationmodechanged\", evt => {\n      switch (evt.state) {\n        case _ui_utils.PresentationModeState.FULLSCREEN:\n          {\n            const previouslyActive = this.active;\n            this.switchTool(CursorTool.SELECT);\n            this.activeBeforePresentationMode = previouslyActive;\n            break;\n          }\n\n        case _ui_utils.PresentationModeState.NORMAL:\n          {\n            const previouslyActive = this.activeBeforePresentationMode;\n            this.activeBeforePresentationMode = null;\n            this.switchTool(previouslyActive);\n            break;\n          }\n      }\n    });\n  }\n\n}\n\nexports.PDFCursorTools = PDFCursorTools;\n\n/***/ }),\n/* 7 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.GrabToPan = GrabToPan;\n\nfunction GrabToPan(options) {\n  this.element = options.element;\n  this.document = options.element.ownerDocument;\n\n  if (typeof options.ignoreTarget === \"function\") {\n    this.ignoreTarget = options.ignoreTarget;\n  }\n\n  this.onActiveChanged = options.onActiveChanged;\n  this.activate = this.activate.bind(this);\n  this.deactivate = this.deactivate.bind(this);\n  this.toggle = this.toggle.bind(this);\n  this._onmousedown = this._onmousedown.bind(this);\n  this._onmousemove = this._onmousemove.bind(this);\n  this._endPan = this._endPan.bind(this);\n  const overlay = this.overlay = document.createElement(\"div\");\n  overlay.className = \"grab-to-pan-grabbing\";\n}\n\nGrabToPan.prototype = {\n  CSS_CLASS_GRAB: \"grab-to-pan-grab\",\n  activate: function GrabToPan_activate() {\n    if (!this.active) {\n      this.active = true;\n      this.element.addEventListener(\"mousedown\", this._onmousedown, true);\n      this.element.classList.add(this.CSS_CLASS_GRAB);\n\n      if (this.onActiveChanged) {\n        this.onActiveChanged(true);\n      }\n    }\n  },\n  deactivate: function GrabToPan_deactivate() {\n    if (this.active) {\n      this.active = false;\n      this.element.removeEventListener(\"mousedown\", this._onmousedown, true);\n\n      this._endPan();\n\n      this.element.classList.remove(this.CSS_CLASS_GRAB);\n\n      if (this.onActiveChanged) {\n        this.onActiveChanged(false);\n      }\n    }\n  },\n  toggle: function GrabToPan_toggle() {\n    if (this.active) {\n      this.deactivate();\n    } else {\n      this.activate();\n    }\n  },\n  ignoreTarget: function GrabToPan_ignoreTarget(node) {\n    return node.matches(\"a[href], a[href] *, input, textarea, button, button *, select, option\");\n  },\n  _onmousedown: function GrabToPan__onmousedown(event) {\n    if (event.button !== 0 || this.ignoreTarget(event.target)) {\n      return;\n    }\n\n    if (event.originalTarget) {\n      try {\n        event.originalTarget.tagName;\n      } catch (e) {\n        return;\n      }\n    }\n\n    this.scrollLeftStart = this.element.scrollLeft;\n    this.scrollTopStart = this.element.scrollTop;\n    this.clientXStart = event.clientX;\n    this.clientYStart = event.clientY;\n    this.document.addEventListener(\"mousemove\", this._onmousemove, true);\n    this.document.addEventListener(\"mouseup\", this._endPan, true);\n    this.element.addEventListener(\"scroll\", this._endPan, true);\n    event.preventDefault();\n    event.stopPropagation();\n    const focusedElement = document.activeElement;\n\n    if (focusedElement && !focusedElement.contains(event.target)) {\n      focusedElement.blur();\n    }\n  },\n  _onmousemove: function GrabToPan__onmousemove(event) {\n    this.element.removeEventListener(\"scroll\", this._endPan, true);\n\n    if (isLeftMouseReleased(event)) {\n      this._endPan();\n\n      return;\n    }\n\n    const xDiff = event.clientX - this.clientXStart;\n    const yDiff = event.clientY - this.clientYStart;\n    const scrollTop = this.scrollTopStart - yDiff;\n    const scrollLeft = this.scrollLeftStart - xDiff;\n\n    if (this.element.scrollTo) {\n      this.element.scrollTo({\n        top: scrollTop,\n        left: scrollLeft,\n        behavior: \"instant\"\n      });\n    } else {\n      this.element.scrollTop = scrollTop;\n      this.element.scrollLeft = scrollLeft;\n    }\n\n    if (!this.overlay.parentNode) {\n      document.body.appendChild(this.overlay);\n    }\n  },\n  _endPan: function GrabToPan__endPan() {\n    this.element.removeEventListener(\"scroll\", this._endPan, true);\n    this.document.removeEventListener(\"mousemove\", this._onmousemove, true);\n    this.document.removeEventListener(\"mouseup\", this._endPan, true);\n    this.overlay.remove();\n  }\n};\n\nfunction isLeftMouseReleased(event) {\n  if (\"buttons\" in event) {\n    return !(event.buttons & 1);\n  }\n\n  const chrome = window.chrome;\n  const isChrome15OrOpera15plus = chrome && (chrome.webstore || chrome.app);\n  const isSafari6plus = /Apple/.test(navigator.vendor) && /Version\\/([6-9]\\d*|[1-5]\\d+)/.test(navigator.userAgent);\n\n  if (isChrome15OrOpera15plus || isSafari6plus) {\n    return event.which === 0;\n  }\n\n  return false;\n}\n\n/***/ }),\n/* 8 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.RenderingStates = exports.PDFRenderingQueue = void 0;\n\nvar _pdfjsLib = __webpack_require__(5);\n\nconst CLEANUP_TIMEOUT = 30000;\nconst RenderingStates = {\n  INITIAL: 0,\n  RUNNING: 1,\n  PAUSED: 2,\n  FINISHED: 3\n};\nexports.RenderingStates = RenderingStates;\n\nclass PDFRenderingQueue {\n  constructor() {\n    this.pdfViewer = null;\n    this.pdfThumbnailViewer = null;\n    this.onIdle = null;\n    this.highestPriorityPage = null;\n    this.idleTimeout = null;\n    this.printing = false;\n    this.isThumbnailViewEnabled = false;\n  }\n\n  setViewer(pdfViewer) {\n    this.pdfViewer = pdfViewer;\n  }\n\n  setThumbnailViewer(pdfThumbnailViewer) {\n    this.pdfThumbnailViewer = pdfThumbnailViewer;\n  }\n\n  isHighestPriority(view) {\n    return this.highestPriorityPage === view.renderingId;\n  }\n\n  renderHighestPriority(currentlyVisiblePages) {\n    if (this.idleTimeout) {\n      clearTimeout(this.idleTimeout);\n      this.idleTimeout = null;\n    }\n\n    if (this.pdfViewer.forceRendering(currentlyVisiblePages)) {\n      return;\n    }\n\n    if (this.pdfThumbnailViewer && this.isThumbnailViewEnabled) {\n      if (this.pdfThumbnailViewer.forceRendering()) {\n        return;\n      }\n    }\n\n    if (this.printing) {\n      return;\n    }\n\n    if (this.onIdle) {\n      this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT);\n    }\n  }\n\n  getHighestPriority(visible, views, scrolledDown) {\n    const visibleViews = visible.views;\n    const numVisible = visibleViews.length;\n\n    if (numVisible === 0) {\n      return null;\n    }\n\n    for (let i = 0; i < numVisible; ++i) {\n      const view = visibleViews[i].view;\n\n      if (!this.isViewFinished(view)) {\n        return view;\n      }\n    }\n\n    if (scrolledDown) {\n      const nextPageIndex = visible.last.id;\n\n      if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex])) {\n        return views[nextPageIndex];\n      }\n    } else {\n      const previousPageIndex = visible.first.id - 2;\n\n      if (views[previousPageIndex] && !this.isViewFinished(views[previousPageIndex])) {\n        return views[previousPageIndex];\n      }\n    }\n\n    return null;\n  }\n\n  isViewFinished(view) {\n    return view.renderingState === RenderingStates.FINISHED;\n  }\n\n  renderView(view) {\n    switch (view.renderingState) {\n      case RenderingStates.FINISHED:\n        return false;\n\n      case RenderingStates.PAUSED:\n        this.highestPriorityPage = view.renderingId;\n        view.resume();\n        break;\n\n      case RenderingStates.RUNNING:\n        this.highestPriorityPage = view.renderingId;\n        break;\n\n      case RenderingStates.INITIAL:\n        this.highestPriorityPage = view.renderingId;\n        view.draw().finally(() => {\n          this.renderHighestPriority();\n        }).catch(reason => {\n          if (reason instanceof _pdfjsLib.RenderingCancelledException) {\n            return;\n          }\n\n          console.error(`renderView: \"${reason}\"`);\n        });\n        break;\n    }\n\n    return true;\n  }\n\n}\n\nexports.PDFRenderingQueue = PDFRenderingQueue;\n\n/***/ }),\n/* 9 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.OverlayManager = void 0;\n\nclass OverlayManager {\n  constructor() {\n    this._overlays = {};\n    this._active = null;\n    this._keyDownBound = this._keyDown.bind(this);\n  }\n\n  get active() {\n    return this._active;\n  }\n\n  async register(name, element, callerCloseMethod = null, canForceClose = false) {\n    let container;\n\n    if (!name || !element || !(container = element.parentNode)) {\n      throw new Error(\"Not enough parameters.\");\n    } else if (this._overlays[name]) {\n      throw new Error(\"The overlay is already registered.\");\n    }\n\n    this._overlays[name] = {\n      element,\n      container,\n      callerCloseMethod,\n      canForceClose\n    };\n  }\n\n  async unregister(name) {\n    if (!this._overlays[name]) {\n      throw new Error(\"The overlay does not exist.\");\n    } else if (this._active === name) {\n      throw new Error(\"The overlay cannot be removed while it is active.\");\n    }\n\n    delete this._overlays[name];\n  }\n\n  async open(name) {\n    if (!this._overlays[name]) {\n      throw new Error(\"The overlay does not exist.\");\n    } else if (this._active) {\n      if (this._overlays[name].canForceClose) {\n        this._closeThroughCaller();\n      } else if (this._active === name) {\n        throw new Error(\"The overlay is already active.\");\n      } else {\n        throw new Error(\"Another overlay is currently active.\");\n      }\n    }\n\n    this._active = name;\n\n    this._overlays[this._active].element.classList.remove(\"hidden\");\n\n    this._overlays[this._active].container.classList.remove(\"hidden\");\n\n    window.addEventListener(\"keydown\", this._keyDownBound);\n  }\n\n  async close(name) {\n    if (!this._overlays[name]) {\n      throw new Error(\"The overlay does not exist.\");\n    } else if (!this._active) {\n      throw new Error(\"The overlay is currently not active.\");\n    } else if (this._active !== name) {\n      throw new Error(\"Another overlay is currently active.\");\n    }\n\n    this._overlays[this._active].container.classList.add(\"hidden\");\n\n    this._overlays[this._active].element.classList.add(\"hidden\");\n\n    this._active = null;\n    window.removeEventListener(\"keydown\", this._keyDownBound);\n  }\n\n  _keyDown(evt) {\n    if (this._active && evt.keyCode === 27) {\n      this._closeThroughCaller();\n\n      evt.preventDefault();\n    }\n  }\n\n  _closeThroughCaller() {\n    if (this._overlays[this._active].callerCloseMethod) {\n      this._overlays[this._active].callerCloseMethod();\n    }\n\n    if (this._active) {\n      this.close(this._active);\n    }\n  }\n\n}\n\nexports.OverlayManager = OverlayManager;\n\n/***/ }),\n/* 10 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PasswordPrompt = void 0;\n\nvar _pdfjsLib = __webpack_require__(5);\n\nclass PasswordPrompt {\n  constructor(options, overlayManager, l10n, isViewerEmbedded = false) {\n    this.overlayName = options.overlayName;\n    this.container = options.container;\n    this.label = options.label;\n    this.input = options.input;\n    this.submitButton = options.submitButton;\n    this.cancelButton = options.cancelButton;\n    this.overlayManager = overlayManager;\n    this.l10n = l10n;\n    this._isViewerEmbedded = isViewerEmbedded;\n    this.updateCallback = null;\n    this.reason = null;\n    this.submitButton.addEventListener(\"click\", this.verify.bind(this));\n    this.cancelButton.addEventListener(\"click\", this.close.bind(this));\n    this.input.addEventListener(\"keydown\", e => {\n      if (e.keyCode === 13) {\n        this.verify();\n      }\n    });\n    this.overlayManager.register(this.overlayName, this.container, this.close.bind(this), true);\n  }\n\n  async open() {\n    await this.overlayManager.open(this.overlayName);\n    const passwordIncorrect = this.reason === _pdfjsLib.PasswordResponses.INCORRECT_PASSWORD;\n\n    if (!this._isViewerEmbedded || passwordIncorrect) {\n      this.input.focus();\n    }\n\n    this.label.textContent = await this.l10n.get(`password_${passwordIncorrect ? \"invalid\" : \"label\"}`);\n  }\n\n  close() {\n    this.overlayManager.close(this.overlayName).then(() => {\n      this.input.value = \"\";\n    });\n  }\n\n  verify() {\n    const password = this.input.value;\n\n    if (password?.length > 0) {\n      this.close();\n      this.updateCallback(password);\n    }\n  }\n\n  setUpdateCallback(updateCallback, reason) {\n    this.updateCallback = updateCallback;\n    this.reason = reason;\n  }\n\n}\n\nexports.PasswordPrompt = PasswordPrompt;\n\n/***/ }),\n/* 11 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFAttachmentViewer = void 0;\n\nvar _pdfjsLib = __webpack_require__(5);\n\nvar _base_tree_viewer = __webpack_require__(12);\n\nclass PDFAttachmentViewer extends _base_tree_viewer.BaseTreeViewer {\n  constructor(options) {\n    super(options);\n    this.downloadManager = options.downloadManager;\n\n    this.eventBus._on(\"fileattachmentannotation\", this._appendAttachment.bind(this));\n  }\n\n  reset(keepRenderedCapability = false) {\n    super.reset();\n    this._attachments = null;\n\n    if (!keepRenderedCapability) {\n      this._renderedCapability = (0, _pdfjsLib.createPromiseCapability)();\n    }\n\n    if (this._pendingDispatchEvent) {\n      clearTimeout(this._pendingDispatchEvent);\n    }\n\n    this._pendingDispatchEvent = null;\n  }\n\n  _dispatchEvent(attachmentsCount) {\n    this._renderedCapability.resolve();\n\n    if (this._pendingDispatchEvent) {\n      clearTimeout(this._pendingDispatchEvent);\n      this._pendingDispatchEvent = null;\n    }\n\n    if (attachmentsCount === 0) {\n      this._pendingDispatchEvent = setTimeout(() => {\n        this.eventBus.dispatch(\"attachmentsloaded\", {\n          source: this,\n          attachmentsCount: 0\n        });\n        this._pendingDispatchEvent = null;\n      });\n      return;\n    }\n\n    this.eventBus.dispatch(\"attachmentsloaded\", {\n      source: this,\n      attachmentsCount\n    });\n  }\n\n  _bindLink(element, {\n    content,\n    filename\n  }) {\n    element.onclick = () => {\n      this.downloadManager.openOrDownloadData(element, content, filename);\n      return false;\n    };\n  }\n\n  render({\n    attachments,\n    keepRenderedCapability = false\n  }) {\n    if (this._attachments) {\n      this.reset(keepRenderedCapability);\n    }\n\n    this._attachments = attachments || null;\n\n    if (!attachments) {\n      this._dispatchEvent(0);\n\n      return;\n    }\n\n    const names = Object.keys(attachments).sort(function (a, b) {\n      return a.toLowerCase().localeCompare(b.toLowerCase());\n    });\n    const fragment = document.createDocumentFragment();\n    let attachmentsCount = 0;\n\n    for (const name of names) {\n      const item = attachments[name];\n      const content = item.content,\n            filename = (0, _pdfjsLib.getFilenameFromUrl)(item.filename);\n      const div = document.createElement(\"div\");\n      div.className = \"treeItem\";\n      const element = document.createElement(\"a\");\n\n      this._bindLink(element, {\n        content,\n        filename\n      });\n\n      element.textContent = this._normalizeTextContent(filename);\n      div.appendChild(element);\n      fragment.appendChild(div);\n      attachmentsCount++;\n    }\n\n    this._finishRendering(fragment, attachmentsCount);\n  }\n\n  _appendAttachment({\n    id,\n    filename,\n    content\n  }) {\n    const renderedPromise = this._renderedCapability.promise;\n    renderedPromise.then(() => {\n      if (renderedPromise !== this._renderedCapability.promise) {\n        return;\n      }\n\n      let attachments = this._attachments;\n\n      if (!attachments) {\n        attachments = Object.create(null);\n      } else {\n        for (const name in attachments) {\n          if (id === name) {\n            return;\n          }\n        }\n      }\n\n      attachments[id] = {\n        filename,\n        content\n      };\n      this.render({\n        attachments,\n        keepRenderedCapability: true\n      });\n    });\n  }\n\n}\n\nexports.PDFAttachmentViewer = PDFAttachmentViewer;\n\n/***/ }),\n/* 12 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.BaseTreeViewer = void 0;\n\nvar _pdfjsLib = __webpack_require__(5);\n\nconst TREEITEM_OFFSET_TOP = -100;\nconst TREEITEM_SELECTED_CLASS = \"selected\";\n\nclass BaseTreeViewer {\n  constructor(options) {\n    if (this.constructor === BaseTreeViewer) {\n      throw new Error(\"Cannot initialize BaseTreeViewer.\");\n    }\n\n    this.container = options.container;\n    this.eventBus = options.eventBus;\n    this.reset();\n  }\n\n  reset() {\n    this._pdfDocument = null;\n    this._lastToggleIsShow = true;\n    this._currentTreeItem = null;\n    this.container.textContent = \"\";\n    this.container.classList.remove(\"treeWithDeepNesting\");\n  }\n\n  _dispatchEvent(count) {\n    throw new Error(\"Not implemented: _dispatchEvent\");\n  }\n\n  _bindLink(element, params) {\n    throw new Error(\"Not implemented: _bindLink\");\n  }\n\n  _normalizeTextContent(str) {\n    return (0, _pdfjsLib.removeNullCharacters)(str) || \"\\u2013\";\n  }\n\n  _addToggleButton(div, hidden = false) {\n    const toggler = document.createElement(\"div\");\n    toggler.className = \"treeItemToggler\";\n\n    if (hidden) {\n      toggler.classList.add(\"treeItemsHidden\");\n    }\n\n    toggler.onclick = evt => {\n      evt.stopPropagation();\n      toggler.classList.toggle(\"treeItemsHidden\");\n\n      if (evt.shiftKey) {\n        const shouldShowAll = !toggler.classList.contains(\"treeItemsHidden\");\n\n        this._toggleTreeItem(div, shouldShowAll);\n      }\n    };\n\n    div.insertBefore(toggler, div.firstChild);\n  }\n\n  _toggleTreeItem(root, show = false) {\n    this._lastToggleIsShow = show;\n\n    for (const toggler of root.querySelectorAll(\".treeItemToggler\")) {\n      toggler.classList.toggle(\"treeItemsHidden\", !show);\n    }\n  }\n\n  _toggleAllTreeItems() {\n    this._toggleTreeItem(this.container, !this._lastToggleIsShow);\n  }\n\n  _finishRendering(fragment, count, hasAnyNesting = false) {\n    if (hasAnyNesting) {\n      this.container.classList.add(\"treeWithDeepNesting\");\n      this._lastToggleIsShow = !fragment.querySelector(\".treeItemsHidden\");\n    }\n\n    this.container.appendChild(fragment);\n\n    this._dispatchEvent(count);\n  }\n\n  render(params) {\n    throw new Error(\"Not implemented: render\");\n  }\n\n  _updateCurrentTreeItem(treeItem = null) {\n    if (this._currentTreeItem) {\n      this._currentTreeItem.classList.remove(TREEITEM_SELECTED_CLASS);\n\n      this._currentTreeItem = null;\n    }\n\n    if (treeItem) {\n      treeItem.classList.add(TREEITEM_SELECTED_CLASS);\n      this._currentTreeItem = treeItem;\n    }\n  }\n\n  _scrollToCurrentTreeItem(treeItem) {\n    if (!treeItem) {\n      return;\n    }\n\n    let currentNode = treeItem.parentNode;\n\n    while (currentNode && currentNode !== this.container) {\n      if (currentNode.classList.contains(\"treeItem\")) {\n        const toggler = currentNode.firstElementChild;\n        toggler?.classList.remove(\"treeItemsHidden\");\n      }\n\n      currentNode = currentNode.parentNode;\n    }\n\n    this._updateCurrentTreeItem(treeItem);\n\n    this.container.scrollTo(treeItem.offsetLeft, treeItem.offsetTop + TREEITEM_OFFSET_TOP);\n  }\n\n}\n\nexports.BaseTreeViewer = BaseTreeViewer;\n\n/***/ }),\n/* 13 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFDocumentProperties = void 0;\n\nvar _pdfjsLib = __webpack_require__(5);\n\nvar _ui_utils = __webpack_require__(4);\n\nconst DEFAULT_FIELD_CONTENT = \"-\";\nconst NON_METRIC_LOCALES = [\"en-us\", \"en-lr\", \"my\"];\nconst US_PAGE_NAMES = {\n  \"8.5x11\": \"Letter\",\n  \"8.5x14\": \"Legal\"\n};\nconst METRIC_PAGE_NAMES = {\n  \"297x420\": \"A3\",\n  \"210x297\": \"A4\"\n};\n\nfunction getPageName(size, isPortrait, pageNames) {\n  const width = isPortrait ? size.width : size.height;\n  const height = isPortrait ? size.height : size.width;\n  return pageNames[`${width}x${height}`];\n}\n\nclass PDFDocumentProperties {\n  constructor({\n    overlayName,\n    fields,\n    container,\n    closeButton\n  }, overlayManager, eventBus, l10n) {\n    this.overlayName = overlayName;\n    this.fields = fields;\n    this.container = container;\n    this.overlayManager = overlayManager;\n    this.l10n = l10n;\n\n    this._reset();\n\n    closeButton.addEventListener(\"click\", this.close.bind(this));\n    this.overlayManager.register(this.overlayName, this.container, this.close.bind(this));\n\n    eventBus._on(\"pagechanging\", evt => {\n      this._currentPageNumber = evt.pageNumber;\n    });\n\n    eventBus._on(\"rotationchanging\", evt => {\n      this._pagesRotation = evt.pagesRotation;\n    });\n\n    this._isNonMetricLocale = true;\n    l10n.getLanguage().then(locale => {\n      this._isNonMetricLocale = NON_METRIC_LOCALES.includes(locale);\n    });\n  }\n\n  async open() {\n    const freezeFieldData = data => {\n      Object.defineProperty(this, \"fieldData\", {\n        value: Object.freeze(data),\n        writable: false,\n        enumerable: true,\n        configurable: true\n      });\n    };\n\n    await Promise.all([this.overlayManager.open(this.overlayName), this._dataAvailableCapability.promise]);\n    const currentPageNumber = this._currentPageNumber;\n    const pagesRotation = this._pagesRotation;\n\n    if (this.fieldData && currentPageNumber === this.fieldData._currentPageNumber && pagesRotation === this.fieldData._pagesRotation) {\n      this._updateUI();\n\n      return;\n    }\n\n    const {\n      info,\n      contentDispositionFilename,\n      contentLength\n    } = await this.pdfDocument.getMetadata();\n    const [fileName, fileSize, creationDate, modificationDate, pageSize, isLinearized] = await Promise.all([contentDispositionFilename || (0, _pdfjsLib.getPdfFilenameFromUrl)(this.url), this._parseFileSize(contentLength), this._parseDate(info.CreationDate), this._parseDate(info.ModDate), this.pdfDocument.getPage(currentPageNumber).then(pdfPage => {\n      return this._parsePageSize((0, _ui_utils.getPageSizeInches)(pdfPage), pagesRotation);\n    }), this._parseLinearization(info.IsLinearized)]);\n    freezeFieldData({\n      fileName,\n      fileSize,\n      title: info.Title,\n      author: info.Author,\n      subject: info.Subject,\n      keywords: info.Keywords,\n      creationDate,\n      modificationDate,\n      creator: info.Creator,\n      producer: info.Producer,\n      version: info.PDFFormatVersion,\n      pageCount: this.pdfDocument.numPages,\n      pageSize,\n      linearized: isLinearized,\n      _currentPageNumber: currentPageNumber,\n      _pagesRotation: pagesRotation\n    });\n\n    this._updateUI();\n\n    const {\n      length\n    } = await this.pdfDocument.getDownloadInfo();\n\n    if (contentLength === length) {\n      return;\n    }\n\n    const data = Object.assign(Object.create(null), this.fieldData);\n    data.fileSize = await this._parseFileSize(length);\n    freezeFieldData(data);\n\n    this._updateUI();\n  }\n\n  close() {\n    this.overlayManager.close(this.overlayName);\n  }\n\n  setDocument(pdfDocument, url = null) {\n    if (this.pdfDocument) {\n      this._reset();\n\n      this._updateUI(true);\n    }\n\n    if (!pdfDocument) {\n      return;\n    }\n\n    this.pdfDocument = pdfDocument;\n    this.url = url;\n\n    this._dataAvailableCapability.resolve();\n  }\n\n  _reset() {\n    this.pdfDocument = null;\n    this.url = null;\n    delete this.fieldData;\n    this._dataAvailableCapability = (0, _pdfjsLib.createPromiseCapability)();\n    this._currentPageNumber = 1;\n    this._pagesRotation = 0;\n  }\n\n  _updateUI(reset = false) {\n    if (reset || !this.fieldData) {\n      for (const id in this.fields) {\n        this.fields[id].textContent = DEFAULT_FIELD_CONTENT;\n      }\n\n      return;\n    }\n\n    if (this.overlayManager.active !== this.overlayName) {\n      return;\n    }\n\n    for (const id in this.fields) {\n      const content = this.fieldData[id];\n      this.fields[id].textContent = content || content === 0 ? content : DEFAULT_FIELD_CONTENT;\n    }\n  }\n\n  async _parseFileSize(fileSize = 0) {\n    const kb = fileSize / 1024,\n          mb = kb / 1024;\n\n    if (!kb) {\n      return undefined;\n    }\n\n    return this.l10n.get(`document_properties_${mb >= 1 ? \"mb\" : \"kb\"}`, {\n      size_mb: mb >= 1 && (+mb.toPrecision(3)).toLocaleString(),\n      size_kb: mb < 1 && (+kb.toPrecision(3)).toLocaleString(),\n      size_b: fileSize.toLocaleString()\n    });\n  }\n\n  async _parsePageSize(pageSizeInches, pagesRotation) {\n    if (!pageSizeInches) {\n      return undefined;\n    }\n\n    if (pagesRotation % 180 !== 0) {\n      pageSizeInches = {\n        width: pageSizeInches.height,\n        height: pageSizeInches.width\n      };\n    }\n\n    const isPortrait = (0, _ui_utils.isPortraitOrientation)(pageSizeInches);\n    let sizeInches = {\n      width: Math.round(pageSizeInches.width * 100) / 100,\n      height: Math.round(pageSizeInches.height * 100) / 100\n    };\n    let sizeMillimeters = {\n      width: Math.round(pageSizeInches.width * 25.4 * 10) / 10,\n      height: Math.round(pageSizeInches.height * 25.4 * 10) / 10\n    };\n    let rawName = getPageName(sizeInches, isPortrait, US_PAGE_NAMES) || getPageName(sizeMillimeters, isPortrait, METRIC_PAGE_NAMES);\n\n    if (!rawName && !(Number.isInteger(sizeMillimeters.width) && Number.isInteger(sizeMillimeters.height))) {\n      const exactMillimeters = {\n        width: pageSizeInches.width * 25.4,\n        height: pageSizeInches.height * 25.4\n      };\n      const intMillimeters = {\n        width: Math.round(sizeMillimeters.width),\n        height: Math.round(sizeMillimeters.height)\n      };\n\n      if (Math.abs(exactMillimeters.width - intMillimeters.width) < 0.1 && Math.abs(exactMillimeters.height - intMillimeters.height) < 0.1) {\n        rawName = getPageName(intMillimeters, isPortrait, METRIC_PAGE_NAMES);\n\n        if (rawName) {\n          sizeInches = {\n            width: Math.round(intMillimeters.width / 25.4 * 100) / 100,\n            height: Math.round(intMillimeters.height / 25.4 * 100) / 100\n          };\n          sizeMillimeters = intMillimeters;\n        }\n      }\n    }\n\n    const [{\n      width,\n      height\n    }, unit, name, orientation] = await Promise.all([this._isNonMetricLocale ? sizeInches : sizeMillimeters, this.l10n.get(`document_properties_page_size_unit_${this._isNonMetricLocale ? \"inches\" : \"millimeters\"}`), rawName && this.l10n.get(`document_properties_page_size_name_${rawName.toLowerCase()}`), this.l10n.get(`document_properties_page_size_orientation_${isPortrait ? \"portrait\" : \"landscape\"}`)]);\n    return this.l10n.get(`document_properties_page_size_dimension_${name ? \"name_\" : \"\"}string`, {\n      width: width.toLocaleString(),\n      height: height.toLocaleString(),\n      unit,\n      name,\n      orientation\n    });\n  }\n\n  async _parseDate(inputDate) {\n    const dateObject = _pdfjsLib.PDFDateString.toDateObject(inputDate);\n\n    if (!dateObject) {\n      return undefined;\n    }\n\n    return this.l10n.get(\"document_properties_date_string\", {\n      date: dateObject.toLocaleDateString(),\n      time: dateObject.toLocaleTimeString()\n    });\n  }\n\n  _parseLinearization(isLinearized) {\n    return this.l10n.get(`document_properties_linearized_${isLinearized ? \"yes\" : \"no\"}`);\n  }\n\n}\n\nexports.PDFDocumentProperties = PDFDocumentProperties;\n\n/***/ }),\n/* 14 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFFindBar = void 0;\n\nvar _pdf_find_controller = __webpack_require__(15);\n\nconst MATCHES_COUNT_LIMIT = 1000;\n\nclass PDFFindBar {\n  constructor(options, eventBus, l10n) {\n    this.opened = false;\n    this.bar = options.bar;\n    this.toggleButton = options.toggleButton;\n    this.findField = options.findField;\n    this.highlightAll = options.highlightAllCheckbox;\n    this.caseSensitive = options.caseSensitiveCheckbox;\n    this.entireWord = options.entireWordCheckbox;\n    this.findMsg = options.findMsg;\n    this.findResultsCount = options.findResultsCount;\n    this.findPreviousButton = options.findPreviousButton;\n    this.findNextButton = options.findNextButton;\n    this.eventBus = eventBus;\n    this.l10n = l10n;\n    this.toggleButton.addEventListener(\"click\", () => {\n      this.toggle();\n    });\n    this.findField.addEventListener(\"input\", () => {\n      this.dispatchEvent(\"\");\n    });\n    this.bar.addEventListener(\"keydown\", e => {\n      switch (e.keyCode) {\n        case 13:\n          if (e.target === this.findField) {\n            this.dispatchEvent(\"again\", e.shiftKey);\n          }\n\n          break;\n\n        case 27:\n          this.close();\n          break;\n      }\n    });\n    this.findPreviousButton.addEventListener(\"click\", () => {\n      this.dispatchEvent(\"again\", true);\n    });\n    this.findNextButton.addEventListener(\"click\", () => {\n      this.dispatchEvent(\"again\", false);\n    });\n    this.highlightAll.addEventListener(\"click\", () => {\n      this.dispatchEvent(\"highlightallchange\");\n    });\n    this.caseSensitive.addEventListener(\"click\", () => {\n      this.dispatchEvent(\"casesensitivitychange\");\n    });\n    this.entireWord.addEventListener(\"click\", () => {\n      this.dispatchEvent(\"entirewordchange\");\n    });\n\n    this.eventBus._on(\"resize\", this._adjustWidth.bind(this));\n  }\n\n  reset() {\n    this.updateUIState();\n  }\n\n  dispatchEvent(type, findPrev) {\n    this.eventBus.dispatch(\"find\", {\n      source: this,\n      type,\n      query: this.findField.value,\n      phraseSearch: true,\n      caseSensitive: this.caseSensitive.checked,\n      entireWord: this.entireWord.checked,\n      highlightAll: this.highlightAll.checked,\n      findPrevious: findPrev\n    });\n  }\n\n  updateUIState(state, previous, matchesCount) {\n    let findMsg = Promise.resolve(\"\");\n    let status = \"\";\n\n    switch (state) {\n      case _pdf_find_controller.FindState.FOUND:\n        break;\n\n      case _pdf_find_controller.FindState.PENDING:\n        status = \"pending\";\n        break;\n\n      case _pdf_find_controller.FindState.NOT_FOUND:\n        findMsg = this.l10n.get(\"find_not_found\");\n        status = \"notFound\";\n        break;\n\n      case _pdf_find_controller.FindState.WRAPPED:\n        findMsg = this.l10n.get(`find_reached_${previous ? \"top\" : \"bottom\"}`);\n        break;\n    }\n\n    this.findField.setAttribute(\"data-status\", status);\n    findMsg.then(msg => {\n      this.findMsg.textContent = msg;\n\n      this._adjustWidth();\n    });\n    this.updateResultsCount(matchesCount);\n  }\n\n  updateResultsCount({\n    current = 0,\n    total = 0\n  } = {}) {\n    const limit = MATCHES_COUNT_LIMIT;\n    let matchCountMsg = Promise.resolve(\"\");\n\n    if (total > 0) {\n      if (total > limit) {\n        let key = \"find_match_count_limit\";\n        matchCountMsg = this.l10n.get(key, {\n          limit\n        });\n      } else {\n        let key = \"find_match_count\";\n        matchCountMsg = this.l10n.get(key, {\n          current,\n          total\n        });\n      }\n    }\n\n    matchCountMsg.then(msg => {\n      this.findResultsCount.textContent = msg;\n      this.findResultsCount.classList.toggle(\"hidden\", !total);\n\n      this._adjustWidth();\n    });\n  }\n\n  open() {\n    if (!this.opened) {\n      this.opened = true;\n      this.toggleButton.classList.add(\"toggled\");\n      this.toggleButton.setAttribute(\"aria-expanded\", \"true\");\n      this.bar.classList.remove(\"hidden\");\n    }\n\n    this.findField.select();\n    this.findField.focus();\n\n    this._adjustWidth();\n  }\n\n  close() {\n    if (!this.opened) {\n      return;\n    }\n\n    this.opened = false;\n    this.toggleButton.classList.remove(\"toggled\");\n    this.toggleButton.setAttribute(\"aria-expanded\", \"false\");\n    this.bar.classList.add(\"hidden\");\n    this.eventBus.dispatch(\"findbarclose\", {\n      source: this\n    });\n  }\n\n  toggle() {\n    if (this.opened) {\n      this.close();\n    } else {\n      this.open();\n    }\n  }\n\n  _adjustWidth() {\n    if (!this.opened) {\n      return;\n    }\n\n    this.bar.classList.remove(\"wrapContainers\");\n    const findbarHeight = this.bar.clientHeight;\n    const inputContainerHeight = this.bar.firstElementChild.clientHeight;\n\n    if (findbarHeight > inputContainerHeight) {\n      this.bar.classList.add(\"wrapContainers\");\n    }\n  }\n\n}\n\nexports.PDFFindBar = PDFFindBar;\n\n/***/ }),\n/* 15 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFFindController = exports.FindState = void 0;\n\nvar _pdfjsLib = __webpack_require__(5);\n\nvar _pdf_find_utils = __webpack_require__(16);\n\nvar _ui_utils = __webpack_require__(4);\n\nconst FindState = {\n  FOUND: 0,\n  NOT_FOUND: 1,\n  WRAPPED: 2,\n  PENDING: 3\n};\nexports.FindState = FindState;\nconst FIND_TIMEOUT = 250;\nconst MATCH_SCROLL_OFFSET_TOP = -50;\nconst MATCH_SCROLL_OFFSET_LEFT = -400;\nconst CHARACTERS_TO_NORMALIZE = {\n  \"\\u2018\": \"'\",\n  \"\\u2019\": \"'\",\n  \"\\u201A\": \"'\",\n  \"\\u201B\": \"'\",\n  \"\\u201C\": '\"',\n  \"\\u201D\": '\"',\n  \"\\u201E\": '\"',\n  \"\\u201F\": '\"',\n  \"\\u00BC\": \"1/4\",\n  \"\\u00BD\": \"1/2\",\n  \"\\u00BE\": \"3/4\"\n};\nlet normalizationRegex = null;\n\nfunction normalize(text) {\n  if (!normalizationRegex) {\n    const replace = Object.keys(CHARACTERS_TO_NORMALIZE).join(\"\");\n    normalizationRegex = new RegExp(`[${replace}]`, \"g\");\n  }\n\n  let diffs = null;\n  const normalizedText = text.replace(normalizationRegex, function (ch, index) {\n    const normalizedCh = CHARACTERS_TO_NORMALIZE[ch],\n          diff = normalizedCh.length - ch.length;\n\n    if (diff !== 0) {\n      (diffs || (diffs = [])).push([index, diff]);\n    }\n\n    return normalizedCh;\n  });\n  return [normalizedText, diffs];\n}\n\nfunction getOriginalIndex(matchIndex, diffs = null) {\n  if (!diffs) {\n    return matchIndex;\n  }\n\n  let totalDiff = 0;\n\n  for (const [index, diff] of diffs) {\n    const currentIndex = index + totalDiff;\n\n    if (currentIndex >= matchIndex) {\n      break;\n    }\n\n    if (currentIndex + diff > matchIndex) {\n      totalDiff += matchIndex - currentIndex;\n      break;\n    }\n\n    totalDiff += diff;\n  }\n\n  return matchIndex - totalDiff;\n}\n\nclass PDFFindController {\n  constructor({\n    linkService,\n    eventBus\n  }) {\n    this._linkService = linkService;\n    this._eventBus = eventBus;\n\n    this._reset();\n\n    eventBus._on(\"findbarclose\", this._onFindBarClose.bind(this));\n  }\n\n  get highlightMatches() {\n    return this._highlightMatches;\n  }\n\n  get pageMatches() {\n    return this._pageMatches;\n  }\n\n  get pageMatchesLength() {\n    return this._pageMatchesLength;\n  }\n\n  get selected() {\n    return this._selected;\n  }\n\n  get state() {\n    return this._state;\n  }\n\n  setDocument(pdfDocument) {\n    if (this._pdfDocument) {\n      this._reset();\n    }\n\n    if (!pdfDocument) {\n      return;\n    }\n\n    this._pdfDocument = pdfDocument;\n\n    this._firstPageCapability.resolve();\n  }\n\n  executeCommand(cmd, state) {\n    if (!state) {\n      return;\n    }\n\n    const pdfDocument = this._pdfDocument;\n\n    if (this._state === null || this._shouldDirtyMatch(cmd, state)) {\n      this._dirtyMatch = true;\n    }\n\n    this._state = state;\n\n    if (cmd !== \"findhighlightallchange\") {\n      this._updateUIState(FindState.PENDING);\n    }\n\n    this._firstPageCapability.promise.then(() => {\n      if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) {\n        return;\n      }\n\n      this._extractText();\n\n      const findbarClosed = !this._highlightMatches;\n      const pendingTimeout = !!this._findTimeout;\n\n      if (this._findTimeout) {\n        clearTimeout(this._findTimeout);\n        this._findTimeout = null;\n      }\n\n      if (cmd === \"find\") {\n        this._findTimeout = setTimeout(() => {\n          this._nextMatch();\n\n          this._findTimeout = null;\n        }, FIND_TIMEOUT);\n      } else if (this._dirtyMatch) {\n        this._nextMatch();\n      } else if (cmd === \"findagain\") {\n        this._nextMatch();\n\n        if (findbarClosed && this._state.highlightAll) {\n          this._updateAllPages();\n        }\n      } else if (cmd === \"findhighlightallchange\") {\n        if (pendingTimeout) {\n          this._nextMatch();\n        } else {\n          this._highlightMatches = true;\n        }\n\n        this._updateAllPages();\n      } else {\n        this._nextMatch();\n      }\n    });\n  }\n\n  scrollMatchIntoView({\n    element = null,\n    pageIndex = -1,\n    matchIndex = -1\n  }) {\n    if (!this._scrollMatches || !element) {\n      return;\n    } else if (matchIndex === -1 || matchIndex !== this._selected.matchIdx) {\n      return;\n    } else if (pageIndex === -1 || pageIndex !== this._selected.pageIdx) {\n      return;\n    }\n\n    this._scrollMatches = false;\n    const spot = {\n      top: MATCH_SCROLL_OFFSET_TOP,\n      left: MATCH_SCROLL_OFFSET_LEFT\n    };\n    (0, _ui_utils.scrollIntoView)(element, spot, true);\n  }\n\n  _reset() {\n    this._highlightMatches = false;\n    this._scrollMatches = false;\n    this._pdfDocument = null;\n    this._pageMatches = [];\n    this._pageMatchesLength = [];\n    this._state = null;\n    this._selected = {\n      pageIdx: -1,\n      matchIdx: -1\n    };\n    this._offset = {\n      pageIdx: null,\n      matchIdx: null,\n      wrapped: false\n    };\n    this._extractTextPromises = [];\n    this._pageContents = [];\n    this._pageDiffs = [];\n    this._matchesCountTotal = 0;\n    this._pagesToSearch = null;\n    this._pendingFindMatches = Object.create(null);\n    this._resumePageIdx = null;\n    this._dirtyMatch = false;\n    clearTimeout(this._findTimeout);\n    this._findTimeout = null;\n    this._firstPageCapability = (0, _pdfjsLib.createPromiseCapability)();\n  }\n\n  get _query() {\n    if (this._state.query !== this._rawQuery) {\n      this._rawQuery = this._state.query;\n      [this._normalizedQuery] = normalize(this._state.query);\n    }\n\n    return this._normalizedQuery;\n  }\n\n  _shouldDirtyMatch(cmd, state) {\n    if (state.query !== this._state.query) {\n      return true;\n    }\n\n    switch (cmd) {\n      case \"findagain\":\n        const pageNumber = this._selected.pageIdx + 1;\n        const linkService = this._linkService;\n\n        if (pageNumber >= 1 && pageNumber <= linkService.pagesCount && pageNumber !== linkService.page && !linkService.isPageVisible(pageNumber)) {\n          return true;\n        }\n\n        return false;\n\n      case \"findhighlightallchange\":\n        return false;\n    }\n\n    return true;\n  }\n\n  _prepareMatches(matchesWithLength, matches, matchesLength) {\n    function isSubTerm(currentIndex) {\n      const currentElem = matchesWithLength[currentIndex];\n      const nextElem = matchesWithLength[currentIndex + 1];\n\n      if (currentIndex < matchesWithLength.length - 1 && currentElem.match === nextElem.match) {\n        currentElem.skipped = true;\n        return true;\n      }\n\n      for (let i = currentIndex - 1; i >= 0; i--) {\n        const prevElem = matchesWithLength[i];\n\n        if (prevElem.skipped) {\n          continue;\n        }\n\n        if (prevElem.match + prevElem.matchLength < currentElem.match) {\n          break;\n        }\n\n        if (prevElem.match + prevElem.matchLength >= currentElem.match + currentElem.matchLength) {\n          currentElem.skipped = true;\n          return true;\n        }\n      }\n\n      return false;\n    }\n\n    matchesWithLength.sort(function (a, b) {\n      return a.match === b.match ? a.matchLength - b.matchLength : a.match - b.match;\n    });\n\n    for (let i = 0, len = matchesWithLength.length; i < len; i++) {\n      if (isSubTerm(i)) {\n        continue;\n      }\n\n      matches.push(matchesWithLength[i].match);\n      matchesLength.push(matchesWithLength[i].matchLength);\n    }\n  }\n\n  _isEntireWord(content, startIdx, length) {\n    if (startIdx > 0) {\n      const first = content.charCodeAt(startIdx);\n      const limit = content.charCodeAt(startIdx - 1);\n\n      if ((0, _pdf_find_utils.getCharacterType)(first) === (0, _pdf_find_utils.getCharacterType)(limit)) {\n        return false;\n      }\n    }\n\n    const endIdx = startIdx + length - 1;\n\n    if (endIdx < content.length - 1) {\n      const last = content.charCodeAt(endIdx);\n      const limit = content.charCodeAt(endIdx + 1);\n\n      if ((0, _pdf_find_utils.getCharacterType)(last) === (0, _pdf_find_utils.getCharacterType)(limit)) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  _calculatePhraseMatch(query, pageIndex, pageContent, pageDiffs, entireWord) {\n    const matches = [],\n          matchesLength = [];\n    const queryLen = query.length;\n    let matchIdx = -queryLen;\n\n    while (true) {\n      matchIdx = pageContent.indexOf(query, matchIdx + queryLen);\n\n      if (matchIdx === -1) {\n        break;\n      }\n\n      if (entireWord && !this._isEntireWord(pageContent, matchIdx, queryLen)) {\n        continue;\n      }\n\n      const originalMatchIdx = getOriginalIndex(matchIdx, pageDiffs),\n            matchEnd = matchIdx + queryLen - 1,\n            originalQueryLen = getOriginalIndex(matchEnd, pageDiffs) - originalMatchIdx + 1;\n      matches.push(originalMatchIdx);\n      matchesLength.push(originalQueryLen);\n    }\n\n    this._pageMatches[pageIndex] = matches;\n    this._pageMatchesLength[pageIndex] = matchesLength;\n  }\n\n  _calculateWordMatch(query, pageIndex, pageContent, pageDiffs, entireWord) {\n    const matchesWithLength = [];\n    const queryArray = query.match(/\\S+/g);\n\n    for (let i = 0, len = queryArray.length; i < len; i++) {\n      const subquery = queryArray[i];\n      const subqueryLen = subquery.length;\n      let matchIdx = -subqueryLen;\n\n      while (true) {\n        matchIdx = pageContent.indexOf(subquery, matchIdx + subqueryLen);\n\n        if (matchIdx === -1) {\n          break;\n        }\n\n        if (entireWord && !this._isEntireWord(pageContent, matchIdx, subqueryLen)) {\n          continue;\n        }\n\n        const originalMatchIdx = getOriginalIndex(matchIdx, pageDiffs),\n              matchEnd = matchIdx + subqueryLen - 1,\n              originalQueryLen = getOriginalIndex(matchEnd, pageDiffs) - originalMatchIdx + 1;\n        matchesWithLength.push({\n          match: originalMatchIdx,\n          matchLength: originalQueryLen,\n          skipped: false\n        });\n      }\n    }\n\n    this._pageMatchesLength[pageIndex] = [];\n    this._pageMatches[pageIndex] = [];\n\n    this._prepareMatches(matchesWithLength, this._pageMatches[pageIndex], this._pageMatchesLength[pageIndex]);\n  }\n\n  _calculateMatch(pageIndex) {\n    let pageContent = this._pageContents[pageIndex];\n    const pageDiffs = this._pageDiffs[pageIndex];\n    let query = this._query;\n    const {\n      caseSensitive,\n      entireWord,\n      phraseSearch\n    } = this._state;\n\n    if (query.length === 0) {\n      return;\n    }\n\n    if (!caseSensitive) {\n      pageContent = pageContent.toLowerCase();\n      query = query.toLowerCase();\n    }\n\n    if (phraseSearch) {\n      this._calculatePhraseMatch(query, pageIndex, pageContent, pageDiffs, entireWord);\n    } else {\n      this._calculateWordMatch(query, pageIndex, pageContent, pageDiffs, entireWord);\n    }\n\n    if (this._state.highlightAll) {\n      this._updatePage(pageIndex);\n    }\n\n    if (this._resumePageIdx === pageIndex) {\n      this._resumePageIdx = null;\n\n      this._nextPageMatch();\n    }\n\n    const pageMatchesCount = this._pageMatches[pageIndex].length;\n\n    if (pageMatchesCount > 0) {\n      this._matchesCountTotal += pageMatchesCount;\n\n      this._updateUIResultsCount();\n    }\n  }\n\n  _extractText() {\n    if (this._extractTextPromises.length > 0) {\n      return;\n    }\n\n    let promise = Promise.resolve();\n\n    for (let i = 0, ii = this._linkService.pagesCount; i < ii; i++) {\n      const extractTextCapability = (0, _pdfjsLib.createPromiseCapability)();\n      this._extractTextPromises[i] = extractTextCapability.promise;\n      promise = promise.then(() => {\n        return this._pdfDocument.getPage(i + 1).then(pdfPage => {\n          return pdfPage.getTextContent({\n            normalizeWhitespace: true\n          });\n        }).then(textContent => {\n          const textItems = textContent.items;\n          const strBuf = [];\n\n          for (let j = 0, jj = textItems.length; j < jj; j++) {\n            strBuf.push(textItems[j].str);\n          }\n\n          [this._pageContents[i], this._pageDiffs[i]] = normalize(strBuf.join(\"\"));\n          extractTextCapability.resolve(i);\n        }, reason => {\n          console.error(`Unable to get text content for page ${i + 1}`, reason);\n          this._pageContents[i] = \"\";\n          this._pageDiffs[i] = null;\n          extractTextCapability.resolve(i);\n        });\n      });\n    }\n  }\n\n  _updatePage(index) {\n    if (this._scrollMatches && this._selected.pageIdx === index) {\n      this._linkService.page = index + 1;\n    }\n\n    this._eventBus.dispatch(\"updatetextlayermatches\", {\n      source: this,\n      pageIndex: index\n    });\n  }\n\n  _updateAllPages() {\n    this._eventBus.dispatch(\"updatetextlayermatches\", {\n      source: this,\n      pageIndex: -1\n    });\n  }\n\n  _nextMatch() {\n    const previous = this._state.findPrevious;\n    const currentPageIndex = this._linkService.page - 1;\n    const numPages = this._linkService.pagesCount;\n    this._highlightMatches = true;\n\n    if (this._dirtyMatch) {\n      this._dirtyMatch = false;\n      this._selected.pageIdx = this._selected.matchIdx = -1;\n      this._offset.pageIdx = currentPageIndex;\n      this._offset.matchIdx = null;\n      this._offset.wrapped = false;\n      this._resumePageIdx = null;\n      this._pageMatches.length = 0;\n      this._pageMatchesLength.length = 0;\n      this._matchesCountTotal = 0;\n\n      this._updateAllPages();\n\n      for (let i = 0; i < numPages; i++) {\n        if (this._pendingFindMatches[i] === true) {\n          continue;\n        }\n\n        this._pendingFindMatches[i] = true;\n\n        this._extractTextPromises[i].then(pageIdx => {\n          delete this._pendingFindMatches[pageIdx];\n\n          this._calculateMatch(pageIdx);\n        });\n      }\n    }\n\n    if (this._query === \"\") {\n      this._updateUIState(FindState.FOUND);\n\n      return;\n    }\n\n    if (this._resumePageIdx) {\n      return;\n    }\n\n    const offset = this._offset;\n    this._pagesToSearch = numPages;\n\n    if (offset.matchIdx !== null) {\n      const numPageMatches = this._pageMatches[offset.pageIdx].length;\n\n      if (!previous && offset.matchIdx + 1 < numPageMatches || previous && offset.matchIdx > 0) {\n        offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1;\n\n        this._updateMatch(true);\n\n        return;\n      }\n\n      this._advanceOffsetPage(previous);\n    }\n\n    this._nextPageMatch();\n  }\n\n  _matchesReady(matches) {\n    const offset = this._offset;\n    const numMatches = matches.length;\n    const previous = this._state.findPrevious;\n\n    if (numMatches) {\n      offset.matchIdx = previous ? numMatches - 1 : 0;\n\n      this._updateMatch(true);\n\n      return true;\n    }\n\n    this._advanceOffsetPage(previous);\n\n    if (offset.wrapped) {\n      offset.matchIdx = null;\n\n      if (this._pagesToSearch < 0) {\n        this._updateMatch(false);\n\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  _nextPageMatch() {\n    if (this._resumePageIdx !== null) {\n      console.error(\"There can only be one pending page.\");\n    }\n\n    let matches = null;\n\n    do {\n      const pageIdx = this._offset.pageIdx;\n      matches = this._pageMatches[pageIdx];\n\n      if (!matches) {\n        this._resumePageIdx = pageIdx;\n        break;\n      }\n    } while (!this._matchesReady(matches));\n  }\n\n  _advanceOffsetPage(previous) {\n    const offset = this._offset;\n    const numPages = this._linkService.pagesCount;\n    offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1;\n    offset.matchIdx = null;\n    this._pagesToSearch--;\n\n    if (offset.pageIdx >= numPages || offset.pageIdx < 0) {\n      offset.pageIdx = previous ? numPages - 1 : 0;\n      offset.wrapped = true;\n    }\n  }\n\n  _updateMatch(found = false) {\n    let state = FindState.NOT_FOUND;\n    const wrapped = this._offset.wrapped;\n    this._offset.wrapped = false;\n\n    if (found) {\n      const previousPage = this._selected.pageIdx;\n      this._selected.pageIdx = this._offset.pageIdx;\n      this._selected.matchIdx = this._offset.matchIdx;\n      state = wrapped ? FindState.WRAPPED : FindState.FOUND;\n\n      if (previousPage !== -1 && previousPage !== this._selected.pageIdx) {\n        this._updatePage(previousPage);\n      }\n    }\n\n    this._updateUIState(state, this._state.findPrevious);\n\n    if (this._selected.pageIdx !== -1) {\n      this._scrollMatches = true;\n\n      this._updatePage(this._selected.pageIdx);\n    }\n  }\n\n  _onFindBarClose(evt) {\n    const pdfDocument = this._pdfDocument;\n\n    this._firstPageCapability.promise.then(() => {\n      if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) {\n        return;\n      }\n\n      if (this._findTimeout) {\n        clearTimeout(this._findTimeout);\n        this._findTimeout = null;\n      }\n\n      if (this._resumePageIdx) {\n        this._resumePageIdx = null;\n        this._dirtyMatch = true;\n      }\n\n      this._updateUIState(FindState.FOUND);\n\n      this._highlightMatches = false;\n\n      this._updateAllPages();\n    });\n  }\n\n  _requestMatchesCount() {\n    const {\n      pageIdx,\n      matchIdx\n    } = this._selected;\n    let current = 0,\n        total = this._matchesCountTotal;\n\n    if (matchIdx !== -1) {\n      for (let i = 0; i < pageIdx; i++) {\n        current += this._pageMatches[i]?.length || 0;\n      }\n\n      current += matchIdx + 1;\n    }\n\n    if (current < 1 || current > total) {\n      current = total = 0;\n    }\n\n    return {\n      current,\n      total\n    };\n  }\n\n  _updateUIResultsCount() {\n    this._eventBus.dispatch(\"updatefindmatchescount\", {\n      source: this,\n      matchesCount: this._requestMatchesCount()\n    });\n  }\n\n  _updateUIState(state, previous) {\n    this._eventBus.dispatch(\"updatefindcontrolstate\", {\n      source: this,\n      state,\n      previous,\n      matchesCount: this._requestMatchesCount(),\n      rawQuery: this._state?.query ?? null\n    });\n  }\n\n}\n\nexports.PDFFindController = PDFFindController;\n\n/***/ }),\n/* 16 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.getCharacterType = getCharacterType;\nexports.CharacterType = void 0;\nconst CharacterType = {\n  SPACE: 0,\n  ALPHA_LETTER: 1,\n  PUNCT: 2,\n  HAN_LETTER: 3,\n  KATAKANA_LETTER: 4,\n  HIRAGANA_LETTER: 5,\n  HALFWIDTH_KATAKANA_LETTER: 6,\n  THAI_LETTER: 7\n};\nexports.CharacterType = CharacterType;\n\nfunction isAlphabeticalScript(charCode) {\n  return charCode < 0x2e80;\n}\n\nfunction isAscii(charCode) {\n  return (charCode & 0xff80) === 0;\n}\n\nfunction isAsciiAlpha(charCode) {\n  return charCode >= 0x61 && charCode <= 0x7a || charCode >= 0x41 && charCode <= 0x5a;\n}\n\nfunction isAsciiDigit(charCode) {\n  return charCode >= 0x30 && charCode <= 0x39;\n}\n\nfunction isAsciiSpace(charCode) {\n  return charCode === 0x20 || charCode === 0x09 || charCode === 0x0d || charCode === 0x0a;\n}\n\nfunction isHan(charCode) {\n  return charCode >= 0x3400 && charCode <= 0x9fff || charCode >= 0xf900 && charCode <= 0xfaff;\n}\n\nfunction isKatakana(charCode) {\n  return charCode >= 0x30a0 && charCode <= 0x30ff;\n}\n\nfunction isHiragana(charCode) {\n  return charCode >= 0x3040 && charCode <= 0x309f;\n}\n\nfunction isHalfwidthKatakana(charCode) {\n  return charCode >= 0xff60 && charCode <= 0xff9f;\n}\n\nfunction isThai(charCode) {\n  return (charCode & 0xff80) === 0x0e00;\n}\n\nfunction getCharacterType(charCode) {\n  if (isAlphabeticalScript(charCode)) {\n    if (isAscii(charCode)) {\n      if (isAsciiSpace(charCode)) {\n        return CharacterType.SPACE;\n      } else if (isAsciiAlpha(charCode) || isAsciiDigit(charCode) || charCode === 0x5f) {\n        return CharacterType.ALPHA_LETTER;\n      }\n\n      return CharacterType.PUNCT;\n    } else if (isThai(charCode)) {\n      return CharacterType.THAI_LETTER;\n    } else if (charCode === 0xa0) {\n      return CharacterType.SPACE;\n    }\n\n    return CharacterType.ALPHA_LETTER;\n  }\n\n  if (isHan(charCode)) {\n    return CharacterType.HAN_LETTER;\n  } else if (isKatakana(charCode)) {\n    return CharacterType.KATAKANA_LETTER;\n  } else if (isHiragana(charCode)) {\n    return CharacterType.HIRAGANA_LETTER;\n  } else if (isHalfwidthKatakana(charCode)) {\n    return CharacterType.HALFWIDTH_KATAKANA_LETTER;\n  }\n\n  return CharacterType.ALPHA_LETTER;\n}\n\n/***/ }),\n/* 17 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.isDestArraysEqual = isDestArraysEqual;\nexports.isDestHashesEqual = isDestHashesEqual;\nexports.PDFHistory = void 0;\n\nvar _ui_utils = __webpack_require__(4);\n\nconst HASH_CHANGE_TIMEOUT = 1000;\nconst POSITION_UPDATED_THRESHOLD = 50;\nconst UPDATE_VIEWAREA_TIMEOUT = 1000;\n\nfunction getCurrentHash() {\n  return document.location.hash;\n}\n\nclass PDFHistory {\n  constructor({\n    linkService,\n    eventBus\n  }) {\n    this.linkService = linkService;\n    this.eventBus = eventBus;\n    this._initialized = false;\n    this._fingerprint = \"\";\n    this.reset();\n    this._boundEvents = null;\n    this._isViewerInPresentationMode = false;\n\n    this.eventBus._on(\"presentationmodechanged\", evt => {\n      this._isViewerInPresentationMode = evt.state !== _ui_utils.PresentationModeState.NORMAL;\n    });\n\n    this.eventBus._on(\"pagesinit\", () => {\n      this._isPagesLoaded = false;\n\n      this.eventBus._on(\"pagesloaded\", evt => {\n        this._isPagesLoaded = !!evt.pagesCount;\n      }, {\n        once: true\n      });\n    });\n  }\n\n  initialize({\n    fingerprint,\n    resetHistory = false,\n    updateUrl = false\n  }) {\n    if (!fingerprint || typeof fingerprint !== \"string\") {\n      console.error('PDFHistory.initialize: The \"fingerprint\" must be a non-empty string.');\n      return;\n    }\n\n    if (this._initialized) {\n      this.reset();\n    }\n\n    const reInitialized = this._fingerprint !== \"\" && this._fingerprint !== fingerprint;\n    this._fingerprint = fingerprint;\n    this._updateUrl = updateUrl === true;\n    this._initialized = true;\n\n    this._bindEvents();\n\n    const state = window.history.state;\n    this._popStateInProgress = false;\n    this._blockHashChange = 0;\n    this._currentHash = getCurrentHash();\n    this._numPositionUpdates = 0;\n    this._uid = this._maxUid = 0;\n    this._destination = null;\n    this._position = null;\n\n    if (!this._isValidState(state, true) || resetHistory) {\n      const {\n        hash,\n        page,\n        rotation\n      } = this._parseCurrentHash(true);\n\n      if (!hash || reInitialized || resetHistory) {\n        this._pushOrReplaceState(null, true);\n\n        return;\n      }\n\n      this._pushOrReplaceState({\n        hash,\n        page,\n        rotation\n      }, true);\n\n      return;\n    }\n\n    const destination = state.destination;\n\n    this._updateInternalState(destination, state.uid, true);\n\n    if (destination.rotation !== undefined) {\n      this._initialRotation = destination.rotation;\n    }\n\n    if (destination.dest) {\n      this._initialBookmark = JSON.stringify(destination.dest);\n      this._destination.page = null;\n    } else if (destination.hash) {\n      this._initialBookmark = destination.hash;\n    } else if (destination.page) {\n      this._initialBookmark = `page=${destination.page}`;\n    }\n  }\n\n  reset() {\n    if (this._initialized) {\n      this._pageHide();\n\n      this._initialized = false;\n\n      this._unbindEvents();\n    }\n\n    if (this._updateViewareaTimeout) {\n      clearTimeout(this._updateViewareaTimeout);\n      this._updateViewareaTimeout = null;\n    }\n\n    this._initialBookmark = null;\n    this._initialRotation = null;\n  }\n\n  push({\n    namedDest = null,\n    explicitDest,\n    pageNumber\n  }) {\n    if (!this._initialized) {\n      return;\n    }\n\n    if (namedDest && typeof namedDest !== \"string\") {\n      console.error(\"PDFHistory.push: \" + `\"${namedDest}\" is not a valid namedDest parameter.`);\n      return;\n    } else if (!Array.isArray(explicitDest)) {\n      console.error(\"PDFHistory.push: \" + `\"${explicitDest}\" is not a valid explicitDest parameter.`);\n      return;\n    } else if (!this._isValidPage(pageNumber)) {\n      if (pageNumber !== null || this._destination) {\n        console.error(\"PDFHistory.push: \" + `\"${pageNumber}\" is not a valid pageNumber parameter.`);\n        return;\n      }\n    }\n\n    const hash = namedDest || JSON.stringify(explicitDest);\n\n    if (!hash) {\n      return;\n    }\n\n    let forceReplace = false;\n\n    if (this._destination && (isDestHashesEqual(this._destination.hash, hash) || isDestArraysEqual(this._destination.dest, explicitDest))) {\n      if (this._destination.page) {\n        return;\n      }\n\n      forceReplace = true;\n    }\n\n    if (this._popStateInProgress && !forceReplace) {\n      return;\n    }\n\n    this._pushOrReplaceState({\n      dest: explicitDest,\n      hash,\n      page: pageNumber,\n      rotation: this.linkService.rotation\n    }, forceReplace);\n\n    if (!this._popStateInProgress) {\n      this._popStateInProgress = true;\n      Promise.resolve().then(() => {\n        this._popStateInProgress = false;\n      });\n    }\n  }\n\n  pushPage(pageNumber) {\n    if (!this._initialized) {\n      return;\n    }\n\n    if (!this._isValidPage(pageNumber)) {\n      console.error(`PDFHistory.pushPage: \"${pageNumber}\" is not a valid page number.`);\n      return;\n    }\n\n    if (this._destination?.page === pageNumber) {\n      return;\n    }\n\n    if (this._popStateInProgress) {\n      return;\n    }\n\n    this._pushOrReplaceState({\n      dest: null,\n      hash: `page=${pageNumber}`,\n      page: pageNumber,\n      rotation: this.linkService.rotation\n    });\n\n    if (!this._popStateInProgress) {\n      this._popStateInProgress = true;\n      Promise.resolve().then(() => {\n        this._popStateInProgress = false;\n      });\n    }\n  }\n\n  pushCurrentPosition() {\n    if (!this._initialized || this._popStateInProgress) {\n      return;\n    }\n\n    this._tryPushCurrentPosition();\n  }\n\n  back() {\n    if (!this._initialized || this._popStateInProgress) {\n      return;\n    }\n\n    const state = window.history.state;\n\n    if (this._isValidState(state) && state.uid > 0) {\n      window.history.back();\n    }\n  }\n\n  forward() {\n    if (!this._initialized || this._popStateInProgress) {\n      return;\n    }\n\n    const state = window.history.state;\n\n    if (this._isValidState(state) && state.uid < this._maxUid) {\n      window.history.forward();\n    }\n  }\n\n  get popStateInProgress() {\n    return this._initialized && (this._popStateInProgress || this._blockHashChange > 0);\n  }\n\n  get initialBookmark() {\n    return this._initialized ? this._initialBookmark : null;\n  }\n\n  get initialRotation() {\n    return this._initialized ? this._initialRotation : null;\n  }\n\n  _pushOrReplaceState(destination, forceReplace = false) {\n    const shouldReplace = forceReplace || !this._destination;\n    const newState = {\n      fingerprint: this._fingerprint,\n      uid: shouldReplace ? this._uid : this._uid + 1,\n      destination\n    };\n\n    this._updateInternalState(destination, newState.uid);\n\n    let newUrl;\n\n    if (this._updateUrl && destination?.hash) {\n      const baseUrl = document.location.href.split(\"#\")[0];\n\n      if (!baseUrl.startsWith(\"file://\")) {\n        newUrl = `${baseUrl}#${destination.hash}`;\n      }\n    }\n\n    if (shouldReplace) {\n      window.history.replaceState(newState, \"\", newUrl);\n    } else {\n      window.history.pushState(newState, \"\", newUrl);\n    }\n  }\n\n  _tryPushCurrentPosition(temporary = false) {\n    if (!this._position) {\n      return;\n    }\n\n    let position = this._position;\n\n    if (temporary) {\n      position = Object.assign(Object.create(null), this._position);\n      position.temporary = true;\n    }\n\n    if (!this._destination) {\n      this._pushOrReplaceState(position);\n\n      return;\n    }\n\n    if (this._destination.temporary) {\n      this._pushOrReplaceState(position, true);\n\n      return;\n    }\n\n    if (this._destination.hash === position.hash) {\n      return;\n    }\n\n    if (!this._destination.page && (POSITION_UPDATED_THRESHOLD <= 0 || this._numPositionUpdates <= POSITION_UPDATED_THRESHOLD)) {\n      return;\n    }\n\n    let forceReplace = false;\n\n    if (this._destination.page >= position.first && this._destination.page <= position.page) {\n      if (this._destination.dest !== undefined || !this._destination.first) {\n        return;\n      }\n\n      forceReplace = true;\n    }\n\n    this._pushOrReplaceState(position, forceReplace);\n  }\n\n  _isValidPage(val) {\n    return Number.isInteger(val) && val > 0 && val <= this.linkService.pagesCount;\n  }\n\n  _isValidState(state, checkReload = false) {\n    if (!state) {\n      return false;\n    }\n\n    if (state.fingerprint !== this._fingerprint) {\n      if (checkReload) {\n        if (typeof state.fingerprint !== \"string\" || state.fingerprint.length !== this._fingerprint.length) {\n          return false;\n        }\n\n        const [perfEntry] = performance.getEntriesByType(\"navigation\");\n\n        if (perfEntry?.type !== \"reload\") {\n          return false;\n        }\n      } else {\n        return false;\n      }\n    }\n\n    if (!Number.isInteger(state.uid) || state.uid < 0) {\n      return false;\n    }\n\n    if (state.destination === null || typeof state.destination !== \"object\") {\n      return false;\n    }\n\n    return true;\n  }\n\n  _updateInternalState(destination, uid, removeTemporary = false) {\n    if (this._updateViewareaTimeout) {\n      clearTimeout(this._updateViewareaTimeout);\n      this._updateViewareaTimeout = null;\n    }\n\n    if (removeTemporary && destination?.temporary) {\n      delete destination.temporary;\n    }\n\n    this._destination = destination;\n    this._uid = uid;\n    this._maxUid = Math.max(this._maxUid, uid);\n    this._numPositionUpdates = 0;\n  }\n\n  _parseCurrentHash(checkNameddest = false) {\n    const hash = unescape(getCurrentHash()).substring(1);\n    const params = (0, _ui_utils.parseQueryString)(hash);\n    const nameddest = params.nameddest || \"\";\n    let page = params.page | 0;\n\n    if (!this._isValidPage(page) || checkNameddest && nameddest.length > 0) {\n      page = null;\n    }\n\n    return {\n      hash,\n      page,\n      rotation: this.linkService.rotation\n    };\n  }\n\n  _updateViewarea({\n    location\n  }) {\n    if (this._updateViewareaTimeout) {\n      clearTimeout(this._updateViewareaTimeout);\n      this._updateViewareaTimeout = null;\n    }\n\n    this._position = {\n      hash: this._isViewerInPresentationMode ? `page=${location.pageNumber}` : location.pdfOpenParams.substring(1),\n      page: this.linkService.page,\n      first: location.pageNumber,\n      rotation: location.rotation\n    };\n\n    if (this._popStateInProgress) {\n      return;\n    }\n\n    if (POSITION_UPDATED_THRESHOLD > 0 && this._isPagesLoaded && this._destination && !this._destination.page) {\n      this._numPositionUpdates++;\n    }\n\n    if (UPDATE_VIEWAREA_TIMEOUT > 0) {\n      this._updateViewareaTimeout = setTimeout(() => {\n        if (!this._popStateInProgress) {\n          this._tryPushCurrentPosition(true);\n        }\n\n        this._updateViewareaTimeout = null;\n      }, UPDATE_VIEWAREA_TIMEOUT);\n    }\n  }\n\n  _popState({\n    state\n  }) {\n    const newHash = getCurrentHash(),\n          hashChanged = this._currentHash !== newHash;\n    this._currentHash = newHash;\n\n    if (!state) {\n      this._uid++;\n\n      const {\n        hash,\n        page,\n        rotation\n      } = this._parseCurrentHash();\n\n      this._pushOrReplaceState({\n        hash,\n        page,\n        rotation\n      }, true);\n\n      return;\n    }\n\n    if (!this._isValidState(state)) {\n      return;\n    }\n\n    this._popStateInProgress = true;\n\n    if (hashChanged) {\n      this._blockHashChange++;\n      (0, _ui_utils.waitOnEventOrTimeout)({\n        target: window,\n        name: \"hashchange\",\n        delay: HASH_CHANGE_TIMEOUT\n      }).then(() => {\n        this._blockHashChange--;\n      });\n    }\n\n    const destination = state.destination;\n\n    this._updateInternalState(destination, state.uid, true);\n\n    if ((0, _ui_utils.isValidRotation)(destination.rotation)) {\n      this.linkService.rotation = destination.rotation;\n    }\n\n    if (destination.dest) {\n      this.linkService.goToDestination(destination.dest);\n    } else if (destination.hash) {\n      this.linkService.setHash(destination.hash);\n    } else if (destination.page) {\n      this.linkService.page = destination.page;\n    }\n\n    Promise.resolve().then(() => {\n      this._popStateInProgress = false;\n    });\n  }\n\n  _pageHide() {\n    if (!this._destination || this._destination.temporary) {\n      this._tryPushCurrentPosition();\n    }\n  }\n\n  _bindEvents() {\n    if (this._boundEvents) {\n      return;\n    }\n\n    this._boundEvents = {\n      updateViewarea: this._updateViewarea.bind(this),\n      popState: this._popState.bind(this),\n      pageHide: this._pageHide.bind(this)\n    };\n\n    this.eventBus._on(\"updateviewarea\", this._boundEvents.updateViewarea);\n\n    window.addEventListener(\"popstate\", this._boundEvents.popState);\n    window.addEventListener(\"pagehide\", this._boundEvents.pageHide);\n  }\n\n  _unbindEvents() {\n    if (!this._boundEvents) {\n      return;\n    }\n\n    this.eventBus._off(\"updateviewarea\", this._boundEvents.updateViewarea);\n\n    window.removeEventListener(\"popstate\", this._boundEvents.popState);\n    window.removeEventListener(\"pagehide\", this._boundEvents.pageHide);\n    this._boundEvents = null;\n  }\n\n}\n\nexports.PDFHistory = PDFHistory;\n\nfunction isDestHashesEqual(destHash, pushHash) {\n  if (typeof destHash !== \"string\" || typeof pushHash !== \"string\") {\n    return false;\n  }\n\n  if (destHash === pushHash) {\n    return true;\n  }\n\n  const {\n    nameddest\n  } = (0, _ui_utils.parseQueryString)(destHash);\n\n  if (nameddest === pushHash) {\n    return true;\n  }\n\n  return false;\n}\n\nfunction isDestArraysEqual(firstDest, secondDest) {\n  function isEntryEqual(first, second) {\n    if (typeof first !== typeof second) {\n      return false;\n    }\n\n    if (Array.isArray(first) || Array.isArray(second)) {\n      return false;\n    }\n\n    if (first !== null && typeof first === \"object\" && second !== null) {\n      if (Object.keys(first).length !== Object.keys(second).length) {\n        return false;\n      }\n\n      for (const key in first) {\n        if (!isEntryEqual(first[key], second[key])) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n\n    return first === second || Number.isNaN(first) && Number.isNaN(second);\n  }\n\n  if (!(Array.isArray(firstDest) && Array.isArray(secondDest))) {\n    return false;\n  }\n\n  if (firstDest.length !== secondDest.length) {\n    return false;\n  }\n\n  for (let i = 0, ii = firstDest.length; i < ii; i++) {\n    if (!isEntryEqual(firstDest[i], secondDest[i])) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n/***/ }),\n/* 18 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFLayerViewer = void 0;\n\nvar _base_tree_viewer = __webpack_require__(12);\n\nclass PDFLayerViewer extends _base_tree_viewer.BaseTreeViewer {\n  constructor(options) {\n    super(options);\n    this.l10n = options.l10n;\n\n    this.eventBus._on(\"resetlayers\", this._resetLayers.bind(this));\n\n    this.eventBus._on(\"togglelayerstree\", this._toggleAllTreeItems.bind(this));\n  }\n\n  reset() {\n    super.reset();\n    this._optionalContentConfig = null;\n  }\n\n  _dispatchEvent(layersCount) {\n    this.eventBus.dispatch(\"layersloaded\", {\n      source: this,\n      layersCount\n    });\n  }\n\n  _bindLink(element, {\n    groupId,\n    input\n  }) {\n    const setVisibility = () => {\n      this._optionalContentConfig.setVisibility(groupId, input.checked);\n\n      this.eventBus.dispatch(\"optionalcontentconfig\", {\n        source: this,\n        promise: Promise.resolve(this._optionalContentConfig)\n      });\n    };\n\n    element.onclick = evt => {\n      if (evt.target === input) {\n        setVisibility();\n        return true;\n      } else if (evt.target !== element) {\n        return true;\n      }\n\n      input.checked = !input.checked;\n      setVisibility();\n      return false;\n    };\n  }\n\n  async _setNestedName(element, {\n    name = null\n  }) {\n    if (typeof name === \"string\") {\n      element.textContent = this._normalizeTextContent(name);\n      return;\n    }\n\n    element.textContent = await this.l10n.get(\"additional_layers\");\n    element.style.fontStyle = \"italic\";\n  }\n\n  _addToggleButton(div, {\n    name = null\n  }) {\n    super._addToggleButton(div, name === null);\n  }\n\n  _toggleAllTreeItems() {\n    if (!this._optionalContentConfig) {\n      return;\n    }\n\n    super._toggleAllTreeItems();\n  }\n\n  render({\n    optionalContentConfig,\n    pdfDocument\n  }) {\n    if (this._optionalContentConfig) {\n      this.reset();\n    }\n\n    this._optionalContentConfig = optionalContentConfig || null;\n    this._pdfDocument = pdfDocument || null;\n    const groups = optionalContentConfig?.getOrder();\n\n    if (!groups) {\n      this._dispatchEvent(0);\n\n      return;\n    }\n\n    const fragment = document.createDocumentFragment(),\n          queue = [{\n      parent: fragment,\n      groups\n    }];\n    let layersCount = 0,\n        hasAnyNesting = false;\n\n    while (queue.length > 0) {\n      const levelData = queue.shift();\n\n      for (const groupId of levelData.groups) {\n        const div = document.createElement(\"div\");\n        div.className = \"treeItem\";\n        const element = document.createElement(\"a\");\n        div.appendChild(element);\n\n        if (typeof groupId === \"object\") {\n          hasAnyNesting = true;\n\n          this._addToggleButton(div, groupId);\n\n          this._setNestedName(element, groupId);\n\n          const itemsDiv = document.createElement(\"div\");\n          itemsDiv.className = \"treeItems\";\n          div.appendChild(itemsDiv);\n          queue.push({\n            parent: itemsDiv,\n            groups: groupId.order\n          });\n        } else {\n          const group = optionalContentConfig.getGroup(groupId);\n          const input = document.createElement(\"input\");\n\n          this._bindLink(element, {\n            groupId,\n            input\n          });\n\n          input.type = \"checkbox\";\n          input.id = groupId;\n          input.checked = group.visible;\n          const label = document.createElement(\"label\");\n          label.setAttribute(\"for\", groupId);\n          label.textContent = this._normalizeTextContent(group.name);\n          element.appendChild(input);\n          element.appendChild(label);\n          layersCount++;\n        }\n\n        levelData.parent.appendChild(div);\n      }\n    }\n\n    this._finishRendering(fragment, layersCount, hasAnyNesting);\n  }\n\n  async _resetLayers() {\n    if (!this._optionalContentConfig) {\n      return;\n    }\n\n    const optionalContentConfig = await this._pdfDocument.getOptionalContentConfig();\n    this.eventBus.dispatch(\"optionalcontentconfig\", {\n      source: this,\n      promise: Promise.resolve(optionalContentConfig)\n    });\n    this.render({\n      optionalContentConfig,\n      pdfDocument: this._pdfDocument\n    });\n  }\n\n}\n\nexports.PDFLayerViewer = PDFLayerViewer;\n\n/***/ }),\n/* 19 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.SimpleLinkService = exports.PDFLinkService = void 0;\n\nvar _ui_utils = __webpack_require__(4);\n\nclass PDFLinkService {\n  constructor({\n    eventBus,\n    externalLinkTarget = null,\n    externalLinkRel = null,\n    externalLinkEnabled = true,\n    ignoreDestinationZoom = false\n  } = {}) {\n    this.eventBus = eventBus;\n    this.externalLinkTarget = externalLinkTarget;\n    this.externalLinkRel = externalLinkRel;\n    this.externalLinkEnabled = externalLinkEnabled;\n    this._ignoreDestinationZoom = ignoreDestinationZoom;\n    this.baseUrl = null;\n    this.pdfDocument = null;\n    this.pdfViewer = null;\n    this.pdfHistory = null;\n    this._pagesRefCache = null;\n  }\n\n  setDocument(pdfDocument, baseUrl = null) {\n    this.baseUrl = baseUrl;\n    this.pdfDocument = pdfDocument;\n    this._pagesRefCache = Object.create(null);\n  }\n\n  setViewer(pdfViewer) {\n    this.pdfViewer = pdfViewer;\n  }\n\n  setHistory(pdfHistory) {\n    this.pdfHistory = pdfHistory;\n  }\n\n  get pagesCount() {\n    return this.pdfDocument ? this.pdfDocument.numPages : 0;\n  }\n\n  get page() {\n    return this.pdfViewer.currentPageNumber;\n  }\n\n  set page(value) {\n    this.pdfViewer.currentPageNumber = value;\n  }\n\n  get rotation() {\n    return this.pdfViewer.pagesRotation;\n  }\n\n  set rotation(value) {\n    this.pdfViewer.pagesRotation = value;\n  }\n\n  navigateTo(dest) {\n    console.error(\"Deprecated method: `navigateTo`, use `goToDestination` instead.\");\n    this.goToDestination(dest);\n  }\n\n  _goToDestinationHelper(rawDest, namedDest = null, explicitDest) {\n    const destRef = explicitDest[0];\n    let pageNumber;\n\n    if (destRef instanceof Object) {\n      pageNumber = this._cachedPageNumber(destRef);\n\n      if (pageNumber === null) {\n        this.pdfDocument.getPageIndex(destRef).then(pageIndex => {\n          this.cachePageRef(pageIndex + 1, destRef);\n\n          this._goToDestinationHelper(rawDest, namedDest, explicitDest);\n        }).catch(() => {\n          console.error(`PDFLinkService._goToDestinationHelper: \"${destRef}\" is not ` + `a valid page reference, for dest=\"${rawDest}\".`);\n        });\n        return;\n      }\n    } else if (Number.isInteger(destRef)) {\n      pageNumber = destRef + 1;\n    } else {\n      console.error(`PDFLinkService._goToDestinationHelper: \"${destRef}\" is not ` + `a valid destination reference, for dest=\"${rawDest}\".`);\n      return;\n    }\n\n    if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) {\n      console.error(`PDFLinkService._goToDestinationHelper: \"${pageNumber}\" is not ` + `a valid page number, for dest=\"${rawDest}\".`);\n      return;\n    }\n\n    if (this.pdfHistory) {\n      this.pdfHistory.pushCurrentPosition();\n      this.pdfHistory.push({\n        namedDest,\n        explicitDest,\n        pageNumber\n      });\n    }\n\n    this.pdfViewer.scrollPageIntoView({\n      pageNumber,\n      destArray: explicitDest,\n      ignoreDestinationZoom: this._ignoreDestinationZoom\n    });\n  }\n\n  async goToDestination(dest) {\n    if (!this.pdfDocument) {\n      return;\n    }\n\n    let namedDest, explicitDest;\n\n    if (typeof dest === \"string\") {\n      namedDest = dest;\n      explicitDest = await this.pdfDocument.getDestination(dest);\n    } else {\n      namedDest = null;\n      explicitDest = await dest;\n    }\n\n    if (!Array.isArray(explicitDest)) {\n      console.error(`PDFLinkService.goToDestination: \"${explicitDest}\" is not ` + `a valid destination array, for dest=\"${dest}\".`);\n      return;\n    }\n\n    this._goToDestinationHelper(dest, namedDest, explicitDest);\n  }\n\n  goToPage(val) {\n    if (!this.pdfDocument) {\n      return;\n    }\n\n    const pageNumber = typeof val === \"string\" && this.pdfViewer.pageLabelToPageNumber(val) || val | 0;\n\n    if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) {\n      console.error(`PDFLinkService.goToPage: \"${val}\" is not a valid page.`);\n      return;\n    }\n\n    if (this.pdfHistory) {\n      this.pdfHistory.pushCurrentPosition();\n      this.pdfHistory.pushPage(pageNumber);\n    }\n\n    this.pdfViewer.scrollPageIntoView({\n      pageNumber\n    });\n  }\n\n  getDestinationHash(dest) {\n    if (typeof dest === \"string\") {\n      if (dest.length > 0) {\n        return this.getAnchorUrl(\"#\" + escape(dest));\n      }\n    } else if (Array.isArray(dest)) {\n      const str = JSON.stringify(dest);\n\n      if (str.length > 0) {\n        return this.getAnchorUrl(\"#\" + escape(str));\n      }\n    }\n\n    return this.getAnchorUrl(\"\");\n  }\n\n  getAnchorUrl(anchor) {\n    return (this.baseUrl || \"\") + anchor;\n  }\n\n  setHash(hash) {\n    if (!this.pdfDocument) {\n      return;\n    }\n\n    let pageNumber, dest;\n\n    if (hash.includes(\"=\")) {\n      const params = (0, _ui_utils.parseQueryString)(hash);\n\n      if (\"search\" in params) {\n        this.eventBus.dispatch(\"findfromurlhash\", {\n          source: this,\n          query: params.search.replace(/\"/g, \"\"),\n          phraseSearch: params.phrase === \"true\"\n        });\n      }\n\n      if (\"page\" in params) {\n        pageNumber = params.page | 0 || 1;\n      }\n\n      if (\"zoom\" in params) {\n        const zoomArgs = params.zoom.split(\",\");\n        const zoomArg = zoomArgs[0];\n        const zoomArgNumber = parseFloat(zoomArg);\n\n        if (!zoomArg.includes(\"Fit\")) {\n          dest = [null, {\n            name: \"XYZ\"\n          }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, zoomArgNumber ? zoomArgNumber / 100 : zoomArg];\n        } else {\n          if (zoomArg === \"Fit\" || zoomArg === \"FitB\") {\n            dest = [null, {\n              name: zoomArg\n            }];\n          } else if (zoomArg === \"FitH\" || zoomArg === \"FitBH\" || zoomArg === \"FitV\" || zoomArg === \"FitBV\") {\n            dest = [null, {\n              name: zoomArg\n            }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null];\n          } else if (zoomArg === \"FitR\") {\n            if (zoomArgs.length !== 5) {\n              console.error('PDFLinkService.setHash: Not enough parameters for \"FitR\".');\n            } else {\n              dest = [null, {\n                name: zoomArg\n              }, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0];\n            }\n          } else {\n            console.error(`PDFLinkService.setHash: \"${zoomArg}\" is not ` + \"a valid zoom value.\");\n          }\n        }\n      }\n\n      if (dest) {\n        this.pdfViewer.scrollPageIntoView({\n          pageNumber: pageNumber || this.page,\n          destArray: dest,\n          allowNegativeOffset: true\n        });\n      } else if (pageNumber) {\n        this.page = pageNumber;\n      }\n\n      if (\"pagemode\" in params) {\n        this.eventBus.dispatch(\"pagemode\", {\n          source: this,\n          mode: params.pagemode\n        });\n      }\n\n      if (\"nameddest\" in params) {\n        this.goToDestination(params.nameddest);\n      }\n    } else {\n      dest = unescape(hash);\n\n      try {\n        dest = JSON.parse(dest);\n\n        if (!Array.isArray(dest)) {\n          dest = dest.toString();\n        }\n      } catch (ex) {}\n\n      if (typeof dest === \"string\" || isValidExplicitDestination(dest)) {\n        this.goToDestination(dest);\n        return;\n      }\n\n      console.error(`PDFLinkService.setHash: \"${unescape(hash)}\" is not ` + \"a valid destination.\");\n    }\n  }\n\n  executeNamedAction(action) {\n    switch (action) {\n      case \"GoBack\":\n        if (this.pdfHistory) {\n          this.pdfHistory.back();\n        }\n\n        break;\n\n      case \"GoForward\":\n        if (this.pdfHistory) {\n          this.pdfHistory.forward();\n        }\n\n        break;\n\n      case \"NextPage\":\n        this.pdfViewer.nextPage();\n        break;\n\n      case \"PrevPage\":\n        this.pdfViewer.previousPage();\n        break;\n\n      case \"LastPage\":\n        this.page = this.pagesCount;\n        break;\n\n      case \"FirstPage\":\n        this.page = 1;\n        break;\n\n      default:\n        break;\n    }\n\n    this.eventBus.dispatch(\"namedaction\", {\n      source: this,\n      action\n    });\n  }\n\n  cachePageRef(pageNum, pageRef) {\n    if (!pageRef) {\n      return;\n    }\n\n    const refStr = pageRef.gen === 0 ? `${pageRef.num}R` : `${pageRef.num}R${pageRef.gen}`;\n    this._pagesRefCache[refStr] = pageNum;\n  }\n\n  _cachedPageNumber(pageRef) {\n    const refStr = pageRef.gen === 0 ? `${pageRef.num}R` : `${pageRef.num}R${pageRef.gen}`;\n    return this._pagesRefCache?.[refStr] || null;\n  }\n\n  isPageVisible(pageNumber) {\n    return this.pdfViewer.isPageVisible(pageNumber);\n  }\n\n  isPageCached(pageNumber) {\n    return this.pdfViewer.isPageCached(pageNumber);\n  }\n\n}\n\nexports.PDFLinkService = PDFLinkService;\n\nfunction isValidExplicitDestination(dest) {\n  if (!Array.isArray(dest)) {\n    return false;\n  }\n\n  const destLength = dest.length;\n\n  if (destLength < 2) {\n    return false;\n  }\n\n  const page = dest[0];\n\n  if (!(typeof page === \"object\" && Number.isInteger(page.num) && Number.isInteger(page.gen)) && !(Number.isInteger(page) && page >= 0)) {\n    return false;\n  }\n\n  const zoom = dest[1];\n\n  if (!(typeof zoom === \"object\" && typeof zoom.name === \"string\")) {\n    return false;\n  }\n\n  let allowNull = true;\n\n  switch (zoom.name) {\n    case \"XYZ\":\n      if (destLength !== 5) {\n        return false;\n      }\n\n      break;\n\n    case \"Fit\":\n    case \"FitB\":\n      return destLength === 2;\n\n    case \"FitH\":\n    case \"FitBH\":\n    case \"FitV\":\n    case \"FitBV\":\n      if (destLength !== 3) {\n        return false;\n      }\n\n      break;\n\n    case \"FitR\":\n      if (destLength !== 6) {\n        return false;\n      }\n\n      allowNull = false;\n      break;\n\n    default:\n      return false;\n  }\n\n  for (let i = 2; i < destLength; i++) {\n    const param = dest[i];\n\n    if (!(typeof param === \"number\" || allowNull && param === null)) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nclass SimpleLinkService {\n  constructor() {\n    this.externalLinkTarget = null;\n    this.externalLinkRel = null;\n    this.externalLinkEnabled = true;\n    this._ignoreDestinationZoom = false;\n  }\n\n  get pagesCount() {\n    return 0;\n  }\n\n  get page() {\n    return 0;\n  }\n\n  set page(value) {}\n\n  get rotation() {\n    return 0;\n  }\n\n  set rotation(value) {}\n\n  async goToDestination(dest) {}\n\n  goToPage(val) {}\n\n  getDestinationHash(dest) {\n    return \"#\";\n  }\n\n  getAnchorUrl(hash) {\n    return \"#\";\n  }\n\n  setHash(hash) {}\n\n  executeNamedAction(action) {}\n\n  cachePageRef(pageNum, pageRef) {}\n\n  isPageVisible(pageNumber) {\n    return true;\n  }\n\n  isPageCached(pageNumber) {\n    return true;\n  }\n\n}\n\nexports.SimpleLinkService = SimpleLinkService;\n\n/***/ }),\n/* 20 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFOutlineViewer = void 0;\n\nvar _pdfjsLib = __webpack_require__(5);\n\nvar _base_tree_viewer = __webpack_require__(12);\n\nvar _ui_utils = __webpack_require__(4);\n\nclass PDFOutlineViewer extends _base_tree_viewer.BaseTreeViewer {\n  constructor(options) {\n    super(options);\n    this.linkService = options.linkService;\n\n    this.eventBus._on(\"toggleoutlinetree\", this._toggleAllTreeItems.bind(this));\n\n    this.eventBus._on(\"currentoutlineitem\", this._currentOutlineItem.bind(this));\n\n    this.eventBus._on(\"pagechanging\", evt => {\n      this._currentPageNumber = evt.pageNumber;\n    });\n\n    this.eventBus._on(\"pagesloaded\", evt => {\n      this._isPagesLoaded = !!evt.pagesCount;\n    });\n\n    this.eventBus._on(\"sidebarviewchanged\", evt => {\n      this._sidebarView = evt.view;\n    });\n  }\n\n  reset() {\n    super.reset();\n    this._outline = null;\n    this._pageNumberToDestHashCapability = null;\n    this._currentPageNumber = 1;\n    this._isPagesLoaded = false;\n  }\n\n  _dispatchEvent(outlineCount) {\n    this.eventBus.dispatch(\"outlineloaded\", {\n      source: this,\n      outlineCount,\n      enableCurrentOutlineItemButton: outlineCount > 0 && !this._pdfDocument?.loadingParams.disableAutoFetch\n    });\n  }\n\n  _bindLink(element, {\n    url,\n    newWindow,\n    dest\n  }) {\n    const {\n      linkService\n    } = this;\n\n    if (url) {\n      (0, _pdfjsLib.addLinkAttributes)(element, {\n        url,\n        target: newWindow ? _pdfjsLib.LinkTarget.BLANK : linkService.externalLinkTarget,\n        rel: linkService.externalLinkRel,\n        enabled: linkService.externalLinkEnabled\n      });\n      return;\n    }\n\n    element.href = linkService.getDestinationHash(dest);\n\n    element.onclick = evt => {\n      this._updateCurrentTreeItem(evt.target.parentNode);\n\n      if (dest) {\n        linkService.goToDestination(dest);\n      }\n\n      return false;\n    };\n  }\n\n  _setStyles(element, {\n    bold,\n    italic\n  }) {\n    if (bold) {\n      element.style.fontWeight = \"bold\";\n    }\n\n    if (italic) {\n      element.style.fontStyle = \"italic\";\n    }\n  }\n\n  _addToggleButton(div, {\n    count,\n    items\n  }) {\n    let hidden = false;\n\n    if (count < 0) {\n      let totalCount = items.length;\n\n      if (totalCount > 0) {\n        const queue = [...items];\n\n        while (queue.length > 0) {\n          const {\n            count: nestedCount,\n            items: nestedItems\n          } = queue.shift();\n\n          if (nestedCount > 0 && nestedItems.length > 0) {\n            totalCount += nestedItems.length;\n            queue.push(...nestedItems);\n          }\n        }\n      }\n\n      if (Math.abs(count) === totalCount) {\n        hidden = true;\n      }\n    }\n\n    super._addToggleButton(div, hidden);\n  }\n\n  _toggleAllTreeItems() {\n    if (!this._outline) {\n      return;\n    }\n\n    super._toggleAllTreeItems();\n  }\n\n  render({\n    outline,\n    pdfDocument\n  }) {\n    if (this._outline) {\n      this.reset();\n    }\n\n    this._outline = outline || null;\n    this._pdfDocument = pdfDocument || null;\n\n    if (!outline) {\n      this._dispatchEvent(0);\n\n      return;\n    }\n\n    const fragment = document.createDocumentFragment();\n    const queue = [{\n      parent: fragment,\n      items: outline\n    }];\n    let outlineCount = 0,\n        hasAnyNesting = false;\n\n    while (queue.length > 0) {\n      const levelData = queue.shift();\n\n      for (const item of levelData.items) {\n        const div = document.createElement(\"div\");\n        div.className = \"treeItem\";\n        const element = document.createElement(\"a\");\n\n        this._bindLink(element, item);\n\n        this._setStyles(element, item);\n\n        element.textContent = this._normalizeTextContent(item.title);\n        div.appendChild(element);\n\n        if (item.items.length > 0) {\n          hasAnyNesting = true;\n\n          this._addToggleButton(div, item);\n\n          const itemsDiv = document.createElement(\"div\");\n          itemsDiv.className = \"treeItems\";\n          div.appendChild(itemsDiv);\n          queue.push({\n            parent: itemsDiv,\n            items: item.items\n          });\n        }\n\n        levelData.parent.appendChild(div);\n        outlineCount++;\n      }\n    }\n\n    this._finishRendering(fragment, outlineCount, hasAnyNesting);\n  }\n\n  async _currentOutlineItem() {\n    if (!this._isPagesLoaded) {\n      throw new Error(\"_currentOutlineItem: All pages have not been loaded.\");\n    }\n\n    if (!this._outline || !this._pdfDocument) {\n      return;\n    }\n\n    const pageNumberToDestHash = await this._getPageNumberToDestHash(this._pdfDocument);\n\n    if (!pageNumberToDestHash) {\n      return;\n    }\n\n    this._updateCurrentTreeItem(null);\n\n    if (this._sidebarView !== _ui_utils.SidebarView.OUTLINE) {\n      return;\n    }\n\n    for (let i = this._currentPageNumber; i > 0; i--) {\n      const destHash = pageNumberToDestHash.get(i);\n\n      if (!destHash) {\n        continue;\n      }\n\n      const linkElement = this.container.querySelector(`a[href=\"${destHash}\"]`);\n\n      if (!linkElement) {\n        continue;\n      }\n\n      this._scrollToCurrentTreeItem(linkElement.parentNode);\n\n      break;\n    }\n  }\n\n  async _getPageNumberToDestHash(pdfDocument) {\n    if (this._pageNumberToDestHashCapability) {\n      return this._pageNumberToDestHashCapability.promise;\n    }\n\n    this._pageNumberToDestHashCapability = (0, _pdfjsLib.createPromiseCapability)();\n    const pageNumberToDestHash = new Map(),\n          pageNumberNesting = new Map();\n    const queue = [{\n      nesting: 0,\n      items: this._outline\n    }];\n\n    while (queue.length > 0) {\n      const levelData = queue.shift(),\n            currentNesting = levelData.nesting;\n\n      for (const {\n        dest,\n        items\n      } of levelData.items) {\n        let explicitDest, pageNumber;\n\n        if (typeof dest === \"string\") {\n          explicitDest = await pdfDocument.getDestination(dest);\n\n          if (pdfDocument !== this._pdfDocument) {\n            return null;\n          }\n        } else {\n          explicitDest = dest;\n        }\n\n        if (Array.isArray(explicitDest)) {\n          const [destRef] = explicitDest;\n\n          if (destRef instanceof Object) {\n            pageNumber = this.linkService._cachedPageNumber(destRef);\n\n            if (!pageNumber) {\n              try {\n                pageNumber = (await pdfDocument.getPageIndex(destRef)) + 1;\n\n                if (pdfDocument !== this._pdfDocument) {\n                  return null;\n                }\n\n                this.linkService.cachePageRef(pageNumber, destRef);\n              } catch (ex) {}\n            }\n          } else if (Number.isInteger(destRef)) {\n            pageNumber = destRef + 1;\n          }\n\n          if (Number.isInteger(pageNumber) && (!pageNumberToDestHash.has(pageNumber) || currentNesting > pageNumberNesting.get(pageNumber))) {\n            const destHash = this.linkService.getDestinationHash(dest);\n            pageNumberToDestHash.set(pageNumber, destHash);\n            pageNumberNesting.set(pageNumber, currentNesting);\n          }\n        }\n\n        if (items.length > 0) {\n          queue.push({\n            nesting: currentNesting + 1,\n            items\n          });\n        }\n      }\n    }\n\n    this._pageNumberToDestHashCapability.resolve(pageNumberToDestHash.size > 0 ? pageNumberToDestHash : null);\n\n    return this._pageNumberToDestHashCapability.promise;\n  }\n\n}\n\nexports.PDFOutlineViewer = PDFOutlineViewer;\n\n/***/ }),\n/* 21 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFPresentationMode = void 0;\n\nvar _ui_utils = __webpack_require__(4);\n\nconst DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS = 1500;\nconst DELAY_BEFORE_HIDING_CONTROLS = 3000;\nconst ACTIVE_SELECTOR = \"pdfPresentationMode\";\nconst CONTROLS_SELECTOR = \"pdfPresentationModeControls\";\nconst MOUSE_SCROLL_COOLDOWN_TIME = 50;\nconst PAGE_SWITCH_THRESHOLD = 0.1;\nconst SWIPE_MIN_DISTANCE_THRESHOLD = 50;\nconst SWIPE_ANGLE_THRESHOLD = Math.PI / 6;\n\nclass PDFPresentationMode {\n  constructor({\n    container,\n    pdfViewer,\n    eventBus\n  }) {\n    this.container = container;\n    this.pdfViewer = pdfViewer;\n    this.eventBus = eventBus;\n    this.active = false;\n    this.args = null;\n    this.contextMenuOpen = false;\n    this.mouseScrollTimeStamp = 0;\n    this.mouseScrollDelta = 0;\n    this.touchSwipeState = null;\n  }\n\n  request() {\n    if (this.switchInProgress || this.active || !this.pdfViewer.pagesCount) {\n      return false;\n    }\n\n    this._addFullscreenChangeListeners();\n\n    this._setSwitchInProgress();\n\n    this._notifyStateChange();\n\n    if (this.container.requestFullscreen) {\n      this.container.requestFullscreen();\n    } else if (this.container.mozRequestFullScreen) {\n      this.container.mozRequestFullScreen();\n    } else if (this.container.webkitRequestFullscreen) {\n      this.container.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);\n    } else {\n      return false;\n    }\n\n    this.args = {\n      page: this.pdfViewer.currentPageNumber,\n      previousScale: this.pdfViewer.currentScaleValue\n    };\n    return true;\n  }\n\n  _mouseWheel(evt) {\n    if (!this.active) {\n      return;\n    }\n\n    evt.preventDefault();\n    const delta = (0, _ui_utils.normalizeWheelEventDelta)(evt);\n    const currentTime = Date.now();\n    const storedTime = this.mouseScrollTimeStamp;\n\n    if (currentTime > storedTime && currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) {\n      return;\n    }\n\n    if (this.mouseScrollDelta > 0 && delta < 0 || this.mouseScrollDelta < 0 && delta > 0) {\n      this._resetMouseScrollState();\n    }\n\n    this.mouseScrollDelta += delta;\n\n    if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) {\n      const totalDelta = this.mouseScrollDelta;\n\n      this._resetMouseScrollState();\n\n      const success = totalDelta > 0 ? this.pdfViewer.previousPage() : this.pdfViewer.nextPage();\n\n      if (success) {\n        this.mouseScrollTimeStamp = currentTime;\n      }\n    }\n  }\n\n  get isFullscreen() {\n    return !!(document.fullscreenElement || document.mozFullScreen || document.webkitIsFullScreen);\n  }\n\n  _notifyStateChange() {\n    let state = _ui_utils.PresentationModeState.NORMAL;\n\n    if (this.switchInProgress) {\n      state = _ui_utils.PresentationModeState.CHANGING;\n    } else if (this.active) {\n      state = _ui_utils.PresentationModeState.FULLSCREEN;\n    }\n\n    this.eventBus.dispatch(\"presentationmodechanged\", {\n      source: this,\n      state,\n\n      get active() {\n        throw new Error(\"Deprecated parameter: `active`, please use `state` instead.\");\n      },\n\n      get switchInProgress() {\n        throw new Error(\"Deprecated parameter: `switchInProgress`, please use `state` instead.\");\n      }\n\n    });\n  }\n\n  _setSwitchInProgress() {\n    if (this.switchInProgress) {\n      clearTimeout(this.switchInProgress);\n    }\n\n    this.switchInProgress = setTimeout(() => {\n      this._removeFullscreenChangeListeners();\n\n      delete this.switchInProgress;\n\n      this._notifyStateChange();\n    }, DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS);\n  }\n\n  _resetSwitchInProgress() {\n    if (this.switchInProgress) {\n      clearTimeout(this.switchInProgress);\n      delete this.switchInProgress;\n    }\n  }\n\n  _enter() {\n    this.active = true;\n\n    this._resetSwitchInProgress();\n\n    this._notifyStateChange();\n\n    this.container.classList.add(ACTIVE_SELECTOR);\n    setTimeout(() => {\n      this.pdfViewer.currentPageNumber = this.args.page;\n      this.pdfViewer.currentScaleValue = \"page-fit\";\n    }, 0);\n\n    this._addWindowListeners();\n\n    this._showControls();\n\n    this.contextMenuOpen = false;\n    window.getSelection().removeAllRanges();\n  }\n\n  _exit() {\n    const page = this.pdfViewer.currentPageNumber;\n    this.container.classList.remove(ACTIVE_SELECTOR);\n    setTimeout(() => {\n      this.active = false;\n\n      this._removeFullscreenChangeListeners();\n\n      this._notifyStateChange();\n\n      this.pdfViewer.currentScaleValue = this.args.previousScale;\n      this.pdfViewer.currentPageNumber = page;\n      this.args = null;\n    }, 0);\n\n    this._removeWindowListeners();\n\n    this._hideControls();\n\n    this._resetMouseScrollState();\n\n    this.contextMenuOpen = false;\n  }\n\n  _mouseDown(evt) {\n    if (this.contextMenuOpen) {\n      this.contextMenuOpen = false;\n      evt.preventDefault();\n      return;\n    }\n\n    if (evt.button === 0) {\n      const isInternalLink = evt.target.href && evt.target.classList.contains(\"internalLink\");\n\n      if (!isInternalLink) {\n        evt.preventDefault();\n\n        if (evt.shiftKey) {\n          this.pdfViewer.previousPage();\n        } else {\n          this.pdfViewer.nextPage();\n        }\n      }\n    }\n  }\n\n  _contextMenu() {\n    this.contextMenuOpen = true;\n  }\n\n  _showControls() {\n    if (this.controlsTimeout) {\n      clearTimeout(this.controlsTimeout);\n    } else {\n      this.container.classList.add(CONTROLS_SELECTOR);\n    }\n\n    this.controlsTimeout = setTimeout(() => {\n      this.container.classList.remove(CONTROLS_SELECTOR);\n      delete this.controlsTimeout;\n    }, DELAY_BEFORE_HIDING_CONTROLS);\n  }\n\n  _hideControls() {\n    if (!this.controlsTimeout) {\n      return;\n    }\n\n    clearTimeout(this.controlsTimeout);\n    this.container.classList.remove(CONTROLS_SELECTOR);\n    delete this.controlsTimeout;\n  }\n\n  _resetMouseScrollState() {\n    this.mouseScrollTimeStamp = 0;\n    this.mouseScrollDelta = 0;\n  }\n\n  _touchSwipe(evt) {\n    if (!this.active) {\n      return;\n    }\n\n    if (evt.touches.length > 1) {\n      this.touchSwipeState = null;\n      return;\n    }\n\n    switch (evt.type) {\n      case \"touchstart\":\n        this.touchSwipeState = {\n          startX: evt.touches[0].pageX,\n          startY: evt.touches[0].pageY,\n          endX: evt.touches[0].pageX,\n          endY: evt.touches[0].pageY\n        };\n        break;\n\n      case \"touchmove\":\n        if (this.touchSwipeState === null) {\n          return;\n        }\n\n        this.touchSwipeState.endX = evt.touches[0].pageX;\n        this.touchSwipeState.endY = evt.touches[0].pageY;\n        evt.preventDefault();\n        break;\n\n      case \"touchend\":\n        if (this.touchSwipeState === null) {\n          return;\n        }\n\n        let delta = 0;\n        const dx = this.touchSwipeState.endX - this.touchSwipeState.startX;\n        const dy = this.touchSwipeState.endY - this.touchSwipeState.startY;\n        const absAngle = Math.abs(Math.atan2(dy, dx));\n\n        if (Math.abs(dx) > SWIPE_MIN_DISTANCE_THRESHOLD && (absAngle <= SWIPE_ANGLE_THRESHOLD || absAngle >= Math.PI - SWIPE_ANGLE_THRESHOLD)) {\n          delta = dx;\n        } else if (Math.abs(dy) > SWIPE_MIN_DISTANCE_THRESHOLD && Math.abs(absAngle - Math.PI / 2) <= SWIPE_ANGLE_THRESHOLD) {\n          delta = dy;\n        }\n\n        if (delta > 0) {\n          this.pdfViewer.previousPage();\n        } else if (delta < 0) {\n          this.pdfViewer.nextPage();\n        }\n\n        break;\n    }\n  }\n\n  _addWindowListeners() {\n    this.showControlsBind = this._showControls.bind(this);\n    this.mouseDownBind = this._mouseDown.bind(this);\n    this.mouseWheelBind = this._mouseWheel.bind(this);\n    this.resetMouseScrollStateBind = this._resetMouseScrollState.bind(this);\n    this.contextMenuBind = this._contextMenu.bind(this);\n    this.touchSwipeBind = this._touchSwipe.bind(this);\n    window.addEventListener(\"mousemove\", this.showControlsBind);\n    window.addEventListener(\"mousedown\", this.mouseDownBind);\n    window.addEventListener(\"wheel\", this.mouseWheelBind, {\n      passive: false\n    });\n    window.addEventListener(\"keydown\", this.resetMouseScrollStateBind);\n    window.addEventListener(\"contextmenu\", this.contextMenuBind);\n    window.addEventListener(\"touchstart\", this.touchSwipeBind);\n    window.addEventListener(\"touchmove\", this.touchSwipeBind);\n    window.addEventListener(\"touchend\", this.touchSwipeBind);\n  }\n\n  _removeWindowListeners() {\n    window.removeEventListener(\"mousemove\", this.showControlsBind);\n    window.removeEventListener(\"mousedown\", this.mouseDownBind);\n    window.removeEventListener(\"wheel\", this.mouseWheelBind, {\n      passive: false\n    });\n    window.removeEventListener(\"keydown\", this.resetMouseScrollStateBind);\n    window.removeEventListener(\"contextmenu\", this.contextMenuBind);\n    window.removeEventListener(\"touchstart\", this.touchSwipeBind);\n    window.removeEventListener(\"touchmove\", this.touchSwipeBind);\n    window.removeEventListener(\"touchend\", this.touchSwipeBind);\n    delete this.showControlsBind;\n    delete this.mouseDownBind;\n    delete this.mouseWheelBind;\n    delete this.resetMouseScrollStateBind;\n    delete this.contextMenuBind;\n    delete this.touchSwipeBind;\n  }\n\n  _fullscreenChange() {\n    if (this.isFullscreen) {\n      this._enter();\n    } else {\n      this._exit();\n    }\n  }\n\n  _addFullscreenChangeListeners() {\n    this.fullscreenChangeBind = this._fullscreenChange.bind(this);\n    window.addEventListener(\"fullscreenchange\", this.fullscreenChangeBind);\n    window.addEventListener(\"mozfullscreenchange\", this.fullscreenChangeBind);\n    window.addEventListener(\"webkitfullscreenchange\", this.fullscreenChangeBind);\n  }\n\n  _removeFullscreenChangeListeners() {\n    window.removeEventListener(\"fullscreenchange\", this.fullscreenChangeBind);\n    window.removeEventListener(\"mozfullscreenchange\", this.fullscreenChangeBind);\n    window.removeEventListener(\"webkitfullscreenchange\", this.fullscreenChangeBind);\n    delete this.fullscreenChangeBind;\n  }\n\n}\n\nexports.PDFPresentationMode = PDFPresentationMode;\n\n/***/ }),\n/* 22 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFScriptingManager = void 0;\n\nvar _pdfjsLib = __webpack_require__(5);\n\nvar _ui_utils = __webpack_require__(4);\n\nvar _pdf_rendering_queue = __webpack_require__(8);\n\nclass PDFScriptingManager {\n  constructor({\n    eventBus,\n    sandboxBundleSrc = null,\n    scriptingFactory = null,\n    docPropertiesLookup = null\n  }) {\n    this._pdfDocument = null;\n    this._pdfViewer = null;\n    this._closeCapability = null;\n    this._destroyCapability = null;\n    this._scripting = null;\n    this._mouseState = Object.create(null);\n    this._pageEventsReady = false;\n    this._ready = false;\n    this._eventBus = eventBus;\n    this._sandboxBundleSrc = sandboxBundleSrc;\n    this._scriptingFactory = scriptingFactory;\n    this._docPropertiesLookup = docPropertiesLookup;\n  }\n\n  setViewer(pdfViewer) {\n    this._pdfViewer = pdfViewer;\n  }\n\n  async setDocument(pdfDocument) {\n    if (this._pdfDocument) {\n      await this._destroyScripting();\n    }\n\n    this._pdfDocument = pdfDocument;\n\n    if (!pdfDocument) {\n      return;\n    }\n\n    const [objects, calculationOrder, docActions] = await Promise.all([pdfDocument.getFieldObjects(), pdfDocument.getCalculationOrderIds(), pdfDocument.getJSActions()]);\n\n    if (!objects && !docActions) {\n      await this._destroyScripting();\n      return;\n    }\n\n    if (pdfDocument !== this._pdfDocument) {\n      return;\n    }\n\n    this._scripting = this._createScripting();\n\n    this._internalEvents.set(\"updatefromsandbox\", event => {\n      if (event?.source !== window) {\n        return;\n      }\n\n      this._updateFromSandbox(event.detail);\n    });\n\n    this._internalEvents.set(\"dispatcheventinsandbox\", event => {\n      this._scripting?.dispatchEventInSandbox(event.detail);\n    });\n\n    this._internalEvents.set(\"pagechanging\", ({\n      pageNumber,\n      previous\n    }) => {\n      if (pageNumber === previous) {\n        return;\n      }\n\n      this._dispatchPageClose(previous);\n\n      this._dispatchPageOpen(pageNumber);\n    });\n\n    this._internalEvents.set(\"pagerendered\", ({\n      pageNumber\n    }) => {\n      if (!this._pageOpenPending.has(pageNumber)) {\n        return;\n      }\n\n      if (pageNumber !== this._pdfViewer.currentPageNumber) {\n        return;\n      }\n\n      this._dispatchPageOpen(pageNumber);\n    });\n\n    this._internalEvents.set(\"pagesdestroy\", async event => {\n      await this._dispatchPageClose(this._pdfViewer.currentPageNumber);\n      await this._scripting?.dispatchEventInSandbox({\n        id: \"doc\",\n        name: \"WillClose\"\n      });\n      this._closeCapability?.resolve();\n    });\n\n    this._domEvents.set(\"mousedown\", event => {\n      this._mouseState.isDown = true;\n    });\n\n    this._domEvents.set(\"mouseup\", event => {\n      this._mouseState.isDown = false;\n    });\n\n    for (const [name, listener] of this._internalEvents) {\n      this._eventBus._on(name, listener);\n    }\n\n    for (const [name, listener] of this._domEvents) {\n      window.addEventListener(name, listener);\n    }\n\n    try {\n      const docProperties = await this._getDocProperties();\n\n      if (pdfDocument !== this._pdfDocument) {\n        return;\n      }\n\n      await this._scripting.createSandbox({\n        objects,\n        calculationOrder,\n        appInfo: {\n          platform: navigator.platform,\n          language: navigator.language\n        },\n        docInfo: { ...docProperties,\n          actions: docActions\n        }\n      });\n\n      this._eventBus.dispatch(\"sandboxcreated\", {\n        source: this\n      });\n    } catch (error) {\n      console.error(`PDFScriptingManager.setDocument: \"${error?.message}\".`);\n      await this._destroyScripting();\n      return;\n    }\n\n    await this._scripting?.dispatchEventInSandbox({\n      id: \"doc\",\n      name: \"Open\"\n    });\n    await this._dispatchPageOpen(this._pdfViewer.currentPageNumber, true);\n    Promise.resolve().then(() => {\n      if (pdfDocument === this._pdfDocument) {\n        this._ready = true;\n      }\n    });\n  }\n\n  async dispatchWillSave(detail) {\n    return this._scripting?.dispatchEventInSandbox({\n      id: \"doc\",\n      name: \"WillSave\"\n    });\n  }\n\n  async dispatchDidSave(detail) {\n    return this._scripting?.dispatchEventInSandbox({\n      id: \"doc\",\n      name: \"DidSave\"\n    });\n  }\n\n  async dispatchWillPrint(detail) {\n    return this._scripting?.dispatchEventInSandbox({\n      id: \"doc\",\n      name: \"WillPrint\"\n    });\n  }\n\n  async dispatchDidPrint(detail) {\n    return this._scripting?.dispatchEventInSandbox({\n      id: \"doc\",\n      name: \"DidPrint\"\n    });\n  }\n\n  get mouseState() {\n    return this._mouseState;\n  }\n\n  get destroyPromise() {\n    return this._destroyCapability?.promise || null;\n  }\n\n  get ready() {\n    return this._ready;\n  }\n\n  get _internalEvents() {\n    return (0, _pdfjsLib.shadow)(this, \"_internalEvents\", new Map());\n  }\n\n  get _domEvents() {\n    return (0, _pdfjsLib.shadow)(this, \"_domEvents\", new Map());\n  }\n\n  get _pageOpenPending() {\n    return (0, _pdfjsLib.shadow)(this, \"_pageOpenPending\", new Set());\n  }\n\n  get _visitedPages() {\n    return (0, _pdfjsLib.shadow)(this, \"_visitedPages\", new Map());\n  }\n\n  async _updateFromSandbox(detail) {\n    const isInPresentationMode = this._pdfViewer.isInPresentationMode || this._pdfViewer.isChangingPresentationMode;\n    const {\n      id,\n      command,\n      value\n    } = detail;\n\n    if (!id) {\n      switch (command) {\n        case \"clear\":\n          console.clear();\n          break;\n\n        case \"error\":\n          console.error(value);\n          break;\n\n        case \"layout\":\n          this._pdfViewer.spreadMode = (0, _ui_utils.apiPageLayoutToSpreadMode)(value);\n          break;\n\n        case \"page-num\":\n          this._pdfViewer.currentPageNumber = value + 1;\n          break;\n\n        case \"print\":\n          await this._pdfViewer.pagesPromise;\n\n          this._eventBus.dispatch(\"print\", {\n            source: this\n          });\n\n          break;\n\n        case \"println\":\n          console.log(value);\n          break;\n\n        case \"zoom\":\n          if (isInPresentationMode) {\n            return;\n          }\n\n          this._pdfViewer.currentScaleValue = value;\n          break;\n      }\n\n      return;\n    }\n\n    if (isInPresentationMode) {\n      if (detail.focus) {\n        return;\n      }\n    }\n\n    const element = document.getElementById(id);\n\n    if (element) {\n      element.dispatchEvent(new CustomEvent(\"updatefromsandbox\", {\n        detail\n      }));\n    } else {\n      delete detail.id;\n      this._pdfDocument?.annotationStorage.setValue(id, detail);\n    }\n  }\n\n  async _dispatchPageOpen(pageNumber, initialize = false) {\n    const pdfDocument = this._pdfDocument,\n          visitedPages = this._visitedPages;\n\n    if (initialize) {\n      this._closeCapability = (0, _pdfjsLib.createPromiseCapability)();\n      this._pageEventsReady = true;\n    }\n\n    if (!this._pageEventsReady) {\n      return;\n    }\n\n    const pageView = this._pdfViewer.getPageView(pageNumber - 1);\n\n    if (pageView?.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {\n      this._pageOpenPending.add(pageNumber);\n\n      return;\n    }\n\n    this._pageOpenPending.delete(pageNumber);\n\n    const actionsPromise = (async () => {\n      const actions = await (!visitedPages.has(pageNumber) ? pageView.pdfPage?.getJSActions() : null);\n\n      if (pdfDocument !== this._pdfDocument) {\n        return;\n      }\n\n      await this._scripting?.dispatchEventInSandbox({\n        id: \"page\",\n        name: \"PageOpen\",\n        pageNumber,\n        actions\n      });\n    })();\n\n    visitedPages.set(pageNumber, actionsPromise);\n  }\n\n  async _dispatchPageClose(pageNumber) {\n    const pdfDocument = this._pdfDocument,\n          visitedPages = this._visitedPages;\n\n    if (!this._pageEventsReady) {\n      return;\n    }\n\n    if (this._pageOpenPending.has(pageNumber)) {\n      return;\n    }\n\n    const actionsPromise = visitedPages.get(pageNumber);\n\n    if (!actionsPromise) {\n      return;\n    }\n\n    visitedPages.set(pageNumber, null);\n    await actionsPromise;\n\n    if (pdfDocument !== this._pdfDocument) {\n      return;\n    }\n\n    await this._scripting?.dispatchEventInSandbox({\n      id: \"page\",\n      name: \"PageClose\",\n      pageNumber\n    });\n  }\n\n  async _getDocProperties() {\n    if (this._docPropertiesLookup) {\n      return this._docPropertiesLookup(this._pdfDocument);\n    }\n\n    throw new Error(\"_getDocProperties: Unable to lookup properties.\");\n  }\n\n  _createScripting() {\n    this._destroyCapability = (0, _pdfjsLib.createPromiseCapability)();\n\n    if (this._scripting) {\n      throw new Error(\"_createScripting: Scripting already exists.\");\n    }\n\n    if (this._scriptingFactory) {\n      return this._scriptingFactory.createScripting({\n        sandboxBundleSrc: this._sandboxBundleSrc\n      });\n    }\n\n    throw new Error(\"_createScripting: Cannot create scripting.\");\n  }\n\n  async _destroyScripting() {\n    if (!this._scripting) {\n      this._pdfDocument = null;\n      this._destroyCapability?.resolve();\n      return;\n    }\n\n    if (this._closeCapability) {\n      await Promise.race([this._closeCapability.promise, new Promise(resolve => {\n        setTimeout(resolve, 1000);\n      })]).catch(reason => {});\n      this._closeCapability = null;\n    }\n\n    this._pdfDocument = null;\n\n    try {\n      await this._scripting.destroySandbox();\n    } catch (ex) {}\n\n    for (const [name, listener] of this._internalEvents) {\n      this._eventBus._off(name, listener);\n    }\n\n    this._internalEvents.clear();\n\n    for (const [name, listener] of this._domEvents) {\n      window.removeEventListener(name, listener);\n    }\n\n    this._domEvents.clear();\n\n    this._pageOpenPending.clear();\n\n    this._visitedPages.clear();\n\n    this._scripting = null;\n    delete this._mouseState.isDown;\n    this._pageEventsReady = false;\n    this._ready = false;\n    this._destroyCapability?.resolve();\n  }\n\n}\n\nexports.PDFScriptingManager = PDFScriptingManager;\n\n/***/ }),\n/* 23 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFSidebar = void 0;\n\nvar _ui_utils = __webpack_require__(4);\n\nvar _pdf_rendering_queue = __webpack_require__(8);\n\nconst UI_NOTIFICATION_CLASS = \"pdfSidebarNotification\";\n\nclass PDFSidebar {\n  constructor({\n    elements,\n    pdfViewer,\n    pdfThumbnailViewer,\n    eventBus,\n    l10n\n  }) {\n    this.isOpen = false;\n    this.active = _ui_utils.SidebarView.THUMBS;\n    this.isInitialViewSet = false;\n    this.onToggled = null;\n    this.pdfViewer = pdfViewer;\n    this.pdfThumbnailViewer = pdfThumbnailViewer;\n    this.outerContainer = elements.outerContainer;\n    this.viewerContainer = elements.viewerContainer;\n    this.toggleButton = elements.toggleButton;\n    this.thumbnailButton = elements.thumbnailButton;\n    this.outlineButton = elements.outlineButton;\n    this.attachmentsButton = elements.attachmentsButton;\n    this.layersButton = elements.layersButton;\n    this.thumbnailView = elements.thumbnailView;\n    this.outlineView = elements.outlineView;\n    this.attachmentsView = elements.attachmentsView;\n    this.layersView = elements.layersView;\n    this._outlineOptionsContainer = elements.outlineOptionsContainer;\n    this._currentOutlineItemButton = elements.currentOutlineItemButton;\n    this.eventBus = eventBus;\n    this.l10n = l10n;\n\n    this._addEventListeners();\n  }\n\n  reset() {\n    this.isInitialViewSet = false;\n\n    this._hideUINotification(true);\n\n    this.switchView(_ui_utils.SidebarView.THUMBS);\n    this.outlineButton.disabled = false;\n    this.attachmentsButton.disabled = false;\n    this.layersButton.disabled = false;\n    this._currentOutlineItemButton.disabled = true;\n  }\n\n  get visibleView() {\n    return this.isOpen ? this.active : _ui_utils.SidebarView.NONE;\n  }\n\n  get isThumbnailViewVisible() {\n    return this.isOpen && this.active === _ui_utils.SidebarView.THUMBS;\n  }\n\n  get isOutlineViewVisible() {\n    return this.isOpen && this.active === _ui_utils.SidebarView.OUTLINE;\n  }\n\n  get isAttachmentsViewVisible() {\n    return this.isOpen && this.active === _ui_utils.SidebarView.ATTACHMENTS;\n  }\n\n  get isLayersViewVisible() {\n    return this.isOpen && this.active === _ui_utils.SidebarView.LAYERS;\n  }\n\n  setInitialView(view = _ui_utils.SidebarView.NONE) {\n    if (this.isInitialViewSet) {\n      return;\n    }\n\n    this.isInitialViewSet = true;\n\n    if (view === _ui_utils.SidebarView.NONE || view === _ui_utils.SidebarView.UNKNOWN) {\n      this._dispatchEvent();\n\n      return;\n    }\n\n    if (!this._switchView(view, true)) {\n      this._dispatchEvent();\n    }\n  }\n\n  switchView(view, forceOpen = false) {\n    this._switchView(view, forceOpen);\n  }\n\n  _switchView(view, forceOpen = false) {\n    const isViewChanged = view !== this.active;\n    let shouldForceRendering = false;\n\n    switch (view) {\n      case _ui_utils.SidebarView.NONE:\n        if (this.isOpen) {\n          this.close();\n          return true;\n        }\n\n        return false;\n\n      case _ui_utils.SidebarView.THUMBS:\n        if (this.isOpen && isViewChanged) {\n          shouldForceRendering = true;\n        }\n\n        break;\n\n      case _ui_utils.SidebarView.OUTLINE:\n        if (this.outlineButton.disabled) {\n          return false;\n        }\n\n        break;\n\n      case _ui_utils.SidebarView.ATTACHMENTS:\n        if (this.attachmentsButton.disabled) {\n          return false;\n        }\n\n        break;\n\n      case _ui_utils.SidebarView.LAYERS:\n        if (this.layersButton.disabled) {\n          return false;\n        }\n\n        break;\n\n      default:\n        console.error(`PDFSidebar._switchView: \"${view}\" is not a valid view.`);\n        return false;\n    }\n\n    this.active = view;\n    this.thumbnailButton.classList.toggle(\"toggled\", view === _ui_utils.SidebarView.THUMBS);\n    this.outlineButton.classList.toggle(\"toggled\", view === _ui_utils.SidebarView.OUTLINE);\n    this.attachmentsButton.classList.toggle(\"toggled\", view === _ui_utils.SidebarView.ATTACHMENTS);\n    this.layersButton.classList.toggle(\"toggled\", view === _ui_utils.SidebarView.LAYERS);\n    this.thumbnailView.classList.toggle(\"hidden\", view !== _ui_utils.SidebarView.THUMBS);\n    this.outlineView.classList.toggle(\"hidden\", view !== _ui_utils.SidebarView.OUTLINE);\n    this.attachmentsView.classList.toggle(\"hidden\", view !== _ui_utils.SidebarView.ATTACHMENTS);\n    this.layersView.classList.toggle(\"hidden\", view !== _ui_utils.SidebarView.LAYERS);\n\n    this._outlineOptionsContainer.classList.toggle(\"hidden\", view !== _ui_utils.SidebarView.OUTLINE);\n\n    if (forceOpen && !this.isOpen) {\n      this.open();\n      return true;\n    }\n\n    if (shouldForceRendering) {\n      this._updateThumbnailViewer();\n\n      this._forceRendering();\n    }\n\n    if (isViewChanged) {\n      this._dispatchEvent();\n    }\n\n    return isViewChanged;\n  }\n\n  open() {\n    if (this.isOpen) {\n      return;\n    }\n\n    this.isOpen = true;\n    this.toggleButton.classList.add(\"toggled\");\n    this.toggleButton.setAttribute(\"aria-expanded\", \"true\");\n    this.outerContainer.classList.add(\"sidebarMoving\", \"sidebarOpen\");\n\n    if (this.active === _ui_utils.SidebarView.THUMBS) {\n      this._updateThumbnailViewer();\n    }\n\n    this._forceRendering();\n\n    this._dispatchEvent();\n\n    this._hideUINotification();\n  }\n\n  close() {\n    if (!this.isOpen) {\n      return;\n    }\n\n    this.isOpen = false;\n    this.toggleButton.classList.remove(\"toggled\");\n    this.toggleButton.setAttribute(\"aria-expanded\", \"false\");\n    this.outerContainer.classList.add(\"sidebarMoving\");\n    this.outerContainer.classList.remove(\"sidebarOpen\");\n\n    this._forceRendering();\n\n    this._dispatchEvent();\n  }\n\n  toggle() {\n    if (this.isOpen) {\n      this.close();\n    } else {\n      this.open();\n    }\n  }\n\n  _dispatchEvent() {\n    this.eventBus.dispatch(\"sidebarviewchanged\", {\n      source: this,\n      view: this.visibleView\n    });\n  }\n\n  _forceRendering() {\n    if (this.onToggled) {\n      this.onToggled();\n    } else {\n      this.pdfViewer.forceRendering();\n      this.pdfThumbnailViewer.forceRendering();\n    }\n  }\n\n  _updateThumbnailViewer() {\n    const {\n      pdfViewer,\n      pdfThumbnailViewer\n    } = this;\n    const pagesCount = pdfViewer.pagesCount;\n\n    for (let pageIndex = 0; pageIndex < pagesCount; pageIndex++) {\n      const pageView = pdfViewer.getPageView(pageIndex);\n\n      if (pageView?.renderingState === _pdf_rendering_queue.RenderingStates.FINISHED) {\n        const thumbnailView = pdfThumbnailViewer.getThumbnail(pageIndex);\n        thumbnailView.setImage(pageView);\n      }\n    }\n\n    pdfThumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber);\n  }\n\n  _showUINotification() {\n    this.l10n.get(\"toggle_sidebar_notification2.title\").then(msg => {\n      this.toggleButton.title = msg;\n    });\n\n    if (!this.isOpen) {\n      this.toggleButton.classList.add(UI_NOTIFICATION_CLASS);\n    }\n  }\n\n  _hideUINotification(reset = false) {\n    if (this.isOpen || reset) {\n      this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS);\n    }\n\n    if (reset) {\n      this.l10n.get(\"toggle_sidebar.title\").then(msg => {\n        this.toggleButton.title = msg;\n      });\n    }\n  }\n\n  _addEventListeners() {\n    this.viewerContainer.addEventListener(\"transitionend\", evt => {\n      if (evt.target === this.viewerContainer) {\n        this.outerContainer.classList.remove(\"sidebarMoving\");\n      }\n    });\n    this.toggleButton.addEventListener(\"click\", () => {\n      this.toggle();\n    });\n    this.thumbnailButton.addEventListener(\"click\", () => {\n      this.switchView(_ui_utils.SidebarView.THUMBS);\n    });\n    this.outlineButton.addEventListener(\"click\", () => {\n      this.switchView(_ui_utils.SidebarView.OUTLINE);\n    });\n    this.outlineButton.addEventListener(\"dblclick\", () => {\n      this.eventBus.dispatch(\"toggleoutlinetree\", {\n        source: this\n      });\n    });\n    this.attachmentsButton.addEventListener(\"click\", () => {\n      this.switchView(_ui_utils.SidebarView.ATTACHMENTS);\n    });\n    this.layersButton.addEventListener(\"click\", () => {\n      this.switchView(_ui_utils.SidebarView.LAYERS);\n    });\n    this.layersButton.addEventListener(\"dblclick\", () => {\n      this.eventBus.dispatch(\"resetlayers\", {\n        source: this\n      });\n    });\n\n    this._currentOutlineItemButton.addEventListener(\"click\", () => {\n      this.eventBus.dispatch(\"currentoutlineitem\", {\n        source: this\n      });\n    });\n\n    const onTreeLoaded = (count, button, view) => {\n      button.disabled = !count;\n\n      if (count) {\n        this._showUINotification();\n      } else if (this.active === view) {\n        this.switchView(_ui_utils.SidebarView.THUMBS);\n      }\n    };\n\n    this.eventBus._on(\"outlineloaded\", evt => {\n      onTreeLoaded(evt.outlineCount, this.outlineButton, _ui_utils.SidebarView.OUTLINE);\n\n      if (evt.enableCurrentOutlineItemButton) {\n        this.pdfViewer.pagesPromise.then(() => {\n          this._currentOutlineItemButton.disabled = !this.isInitialViewSet;\n        });\n      }\n    });\n\n    this.eventBus._on(\"attachmentsloaded\", evt => {\n      onTreeLoaded(evt.attachmentsCount, this.attachmentsButton, _ui_utils.SidebarView.ATTACHMENTS);\n    });\n\n    this.eventBus._on(\"layersloaded\", evt => {\n      onTreeLoaded(evt.layersCount, this.layersButton, _ui_utils.SidebarView.LAYERS);\n    });\n\n    this.eventBus._on(\"presentationmodechanged\", evt => {\n      if (evt.state === _ui_utils.PresentationModeState.NORMAL && this.isThumbnailViewVisible) {\n        this._updateThumbnailViewer();\n      }\n    });\n  }\n\n}\n\nexports.PDFSidebar = PDFSidebar;\n\n/***/ }),\n/* 24 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFSidebarResizer = void 0;\nconst SIDEBAR_WIDTH_VAR = \"--sidebar-width\";\nconst SIDEBAR_MIN_WIDTH = 200;\nconst SIDEBAR_RESIZING_CLASS = \"sidebarResizing\";\n\nclass PDFSidebarResizer {\n  constructor(options, eventBus, l10n) {\n    this.isRTL = false;\n    this.sidebarOpen = false;\n    this.doc = document.documentElement;\n    this._width = null;\n    this._outerContainerWidth = null;\n    this._boundEvents = Object.create(null);\n    this.outerContainer = options.outerContainer;\n    this.resizer = options.resizer;\n    this.eventBus = eventBus;\n    l10n.getDirection().then(dir => {\n      this.isRTL = dir === \"rtl\";\n    });\n\n    this._addEventListeners();\n  }\n\n  get outerContainerWidth() {\n    return this._outerContainerWidth || (this._outerContainerWidth = this.outerContainer.clientWidth);\n  }\n\n  _updateWidth(width = 0) {\n    const maxWidth = Math.floor(this.outerContainerWidth / 2);\n\n    if (width > maxWidth) {\n      width = maxWidth;\n    }\n\n    if (width < SIDEBAR_MIN_WIDTH) {\n      width = SIDEBAR_MIN_WIDTH;\n    }\n\n    if (width === this._width) {\n      return false;\n    }\n\n    this._width = width;\n    this.doc.style.setProperty(SIDEBAR_WIDTH_VAR, `${width}px`);\n    return true;\n  }\n\n  _mouseMove(evt) {\n    let width = evt.clientX;\n\n    if (this.isRTL) {\n      width = this.outerContainerWidth - width;\n    }\n\n    this._updateWidth(width);\n  }\n\n  _mouseUp(evt) {\n    this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS);\n    this.eventBus.dispatch(\"resize\", {\n      source: this\n    });\n    const _boundEvents = this._boundEvents;\n    window.removeEventListener(\"mousemove\", _boundEvents.mouseMove);\n    window.removeEventListener(\"mouseup\", _boundEvents.mouseUp);\n  }\n\n  _addEventListeners() {\n    const _boundEvents = this._boundEvents;\n    _boundEvents.mouseMove = this._mouseMove.bind(this);\n    _boundEvents.mouseUp = this._mouseUp.bind(this);\n    this.resizer.addEventListener(\"mousedown\", evt => {\n      if (evt.button !== 0) {\n        return;\n      }\n\n      this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS);\n      window.addEventListener(\"mousemove\", _boundEvents.mouseMove);\n      window.addEventListener(\"mouseup\", _boundEvents.mouseUp);\n    });\n\n    this.eventBus._on(\"sidebarviewchanged\", evt => {\n      this.sidebarOpen = !!evt?.view;\n    });\n\n    this.eventBus._on(\"resize\", evt => {\n      if (evt?.source !== window) {\n        return;\n      }\n\n      this._outerContainerWidth = null;\n\n      if (!this._width) {\n        return;\n      }\n\n      if (!this.sidebarOpen) {\n        this._updateWidth(this._width);\n\n        return;\n      }\n\n      this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS);\n\n      const updated = this._updateWidth(this._width);\n\n      Promise.resolve().then(() => {\n        this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS);\n\n        if (updated) {\n          this.eventBus.dispatch(\"resize\", {\n            source: this\n          });\n        }\n      });\n    });\n  }\n\n}\n\nexports.PDFSidebarResizer = PDFSidebarResizer;\n\n/***/ }),\n/* 25 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFThumbnailViewer = void 0;\n\nvar _ui_utils = __webpack_require__(4);\n\nvar _pdf_thumbnail_view = __webpack_require__(26);\n\nvar _pdf_rendering_queue = __webpack_require__(8);\n\nconst THUMBNAIL_SCROLL_MARGIN = -19;\nconst THUMBNAIL_SELECTED_CLASS = \"selected\";\n\nclass PDFThumbnailViewer {\n  constructor({\n    container,\n    eventBus,\n    linkService,\n    renderingQueue,\n    l10n\n  }) {\n    this.container = container;\n    this.linkService = linkService;\n    this.renderingQueue = renderingQueue;\n    this.l10n = l10n;\n    this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdated.bind(this));\n\n    this._resetView();\n\n    eventBus._on(\"optionalcontentconfigchanged\", () => {\n      this._setImageDisabled = true;\n    });\n  }\n\n  _scrollUpdated() {\n    this.renderingQueue.renderHighestPriority();\n  }\n\n  getThumbnail(index) {\n    return this._thumbnails[index];\n  }\n\n  _getVisibleThumbs() {\n    return (0, _ui_utils.getVisibleElements)({\n      scrollEl: this.container,\n      views: this._thumbnails\n    });\n  }\n\n  scrollThumbnailIntoView(pageNumber) {\n    if (!this.pdfDocument) {\n      return;\n    }\n\n    const thumbnailView = this._thumbnails[pageNumber - 1];\n\n    if (!thumbnailView) {\n      console.error('scrollThumbnailIntoView: Invalid \"pageNumber\" parameter.');\n      return;\n    }\n\n    if (pageNumber !== this._currentPageNumber) {\n      const prevThumbnailView = this._thumbnails[this._currentPageNumber - 1];\n      prevThumbnailView.div.classList.remove(THUMBNAIL_SELECTED_CLASS);\n      thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS);\n    }\n\n    const visibleThumbs = this._getVisibleThumbs();\n\n    const numVisibleThumbs = visibleThumbs.views.length;\n\n    if (numVisibleThumbs > 0) {\n      const first = visibleThumbs.first.id;\n      const last = numVisibleThumbs > 1 ? visibleThumbs.last.id : first;\n      let shouldScroll = false;\n\n      if (pageNumber <= first || pageNumber >= last) {\n        shouldScroll = true;\n      } else {\n        visibleThumbs.views.some(function (view) {\n          if (view.id !== pageNumber) {\n            return false;\n          }\n\n          shouldScroll = view.percent < 100;\n          return true;\n        });\n      }\n\n      if (shouldScroll) {\n        (0, _ui_utils.scrollIntoView)(thumbnailView.div, {\n          top: THUMBNAIL_SCROLL_MARGIN\n        });\n      }\n    }\n\n    this._currentPageNumber = pageNumber;\n  }\n\n  get pagesRotation() {\n    return this._pagesRotation;\n  }\n\n  set pagesRotation(rotation) {\n    if (!(0, _ui_utils.isValidRotation)(rotation)) {\n      throw new Error(\"Invalid thumbnails rotation angle.\");\n    }\n\n    if (!this.pdfDocument) {\n      return;\n    }\n\n    if (this._pagesRotation === rotation) {\n      return;\n    }\n\n    this._pagesRotation = rotation;\n\n    for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {\n      this._thumbnails[i].update(rotation);\n    }\n  }\n\n  cleanup() {\n    for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {\n      if (this._thumbnails[i] && this._thumbnails[i].renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {\n        this._thumbnails[i].reset();\n      }\n    }\n\n    _pdf_thumbnail_view.TempImageFactory.destroyCanvas();\n  }\n\n  _resetView() {\n    this._thumbnails = [];\n    this._currentPageNumber = 1;\n    this._pageLabels = null;\n    this._pagesRotation = 0;\n    this._optionalContentConfigPromise = null;\n    this._pagesRequests = new WeakMap();\n    this._setImageDisabled = false;\n    this.container.textContent = \"\";\n  }\n\n  setDocument(pdfDocument) {\n    if (this.pdfDocument) {\n      this._cancelRendering();\n\n      this._resetView();\n    }\n\n    this.pdfDocument = pdfDocument;\n\n    if (!pdfDocument) {\n      return;\n    }\n\n    const firstPagePromise = pdfDocument.getPage(1);\n    const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig();\n    firstPagePromise.then(firstPdfPage => {\n      this._optionalContentConfigPromise = optionalContentConfigPromise;\n      const pagesCount = pdfDocument.numPages;\n      const viewport = firstPdfPage.getViewport({\n        scale: 1\n      });\n\n      const checkSetImageDisabled = () => {\n        return this._setImageDisabled;\n      };\n\n      for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n        const thumbnail = new _pdf_thumbnail_view.PDFThumbnailView({\n          container: this.container,\n          id: pageNum,\n          defaultViewport: viewport.clone(),\n          optionalContentConfigPromise,\n          linkService: this.linkService,\n          renderingQueue: this.renderingQueue,\n          checkSetImageDisabled,\n          disableCanvasToImageConversion: false,\n          l10n: this.l10n\n        });\n\n        this._thumbnails.push(thumbnail);\n      }\n\n      const firstThumbnailView = this._thumbnails[0];\n\n      if (firstThumbnailView) {\n        firstThumbnailView.setPdfPage(firstPdfPage);\n      }\n\n      const thumbnailView = this._thumbnails[this._currentPageNumber - 1];\n      thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS);\n    }).catch(reason => {\n      console.error(\"Unable to initialize thumbnail viewer\", reason);\n    });\n  }\n\n  _cancelRendering() {\n    for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {\n      if (this._thumbnails[i]) {\n        this._thumbnails[i].cancelRendering();\n      }\n    }\n  }\n\n  setPageLabels(labels) {\n    if (!this.pdfDocument) {\n      return;\n    }\n\n    if (!labels) {\n      this._pageLabels = null;\n    } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) {\n      this._pageLabels = null;\n      console.error(\"PDFThumbnailViewer_setPageLabels: Invalid page labels.\");\n    } else {\n      this._pageLabels = labels;\n    }\n\n    for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {\n      this._thumbnails[i].setPageLabel(this._pageLabels?.[i] ?? null);\n    }\n  }\n\n  _ensurePdfPageLoaded(thumbView) {\n    if (thumbView.pdfPage) {\n      return Promise.resolve(thumbView.pdfPage);\n    }\n\n    if (this._pagesRequests.has(thumbView)) {\n      return this._pagesRequests.get(thumbView);\n    }\n\n    const promise = this.pdfDocument.getPage(thumbView.id).then(pdfPage => {\n      if (!thumbView.pdfPage) {\n        thumbView.setPdfPage(pdfPage);\n      }\n\n      this._pagesRequests.delete(thumbView);\n\n      return pdfPage;\n    }).catch(reason => {\n      console.error(\"Unable to get page for thumb view\", reason);\n\n      this._pagesRequests.delete(thumbView);\n    });\n\n    this._pagesRequests.set(thumbView, promise);\n\n    return promise;\n  }\n\n  forceRendering() {\n    const visibleThumbs = this._getVisibleThumbs();\n\n    const thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, this._thumbnails, this.scroll.down);\n\n    if (thumbView) {\n      this._ensurePdfPageLoaded(thumbView).then(() => {\n        this.renderingQueue.renderView(thumbView);\n      });\n\n      return true;\n    }\n\n    return false;\n  }\n\n}\n\nexports.PDFThumbnailViewer = PDFThumbnailViewer;\n\n/***/ }),\n/* 26 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.TempImageFactory = exports.PDFThumbnailView = void 0;\n\nvar _ui_utils = __webpack_require__(4);\n\nvar _pdfjsLib = __webpack_require__(5);\n\nvar _pdf_rendering_queue = __webpack_require__(8);\n\nconst MAX_NUM_SCALING_STEPS = 3;\nconst THUMBNAIL_CANVAS_BORDER_WIDTH = 1;\nconst THUMBNAIL_WIDTH = 98;\n\nconst TempImageFactory = function TempImageFactoryClosure() {\n  let tempCanvasCache = null;\n  return {\n    getCanvas(width, height) {\n      let tempCanvas = tempCanvasCache;\n\n      if (!tempCanvas) {\n        tempCanvas = document.createElement(\"canvas\");\n        tempCanvasCache = tempCanvas;\n      }\n\n      tempCanvas.width = width;\n      tempCanvas.height = height;\n      tempCanvas.mozOpaque = true;\n      const ctx = tempCanvas.getContext(\"2d\", {\n        alpha: false\n      });\n      ctx.save();\n      ctx.fillStyle = \"rgb(255, 255, 255)\";\n      ctx.fillRect(0, 0, width, height);\n      ctx.restore();\n      return tempCanvas;\n    },\n\n    destroyCanvas() {\n      const tempCanvas = tempCanvasCache;\n\n      if (tempCanvas) {\n        tempCanvas.width = 0;\n        tempCanvas.height = 0;\n      }\n\n      tempCanvasCache = null;\n    }\n\n  };\n}();\n\nexports.TempImageFactory = TempImageFactory;\n\nclass PDFThumbnailView {\n  constructor({\n    container,\n    id,\n    defaultViewport,\n    optionalContentConfigPromise,\n    linkService,\n    renderingQueue,\n    checkSetImageDisabled,\n    disableCanvasToImageConversion = false,\n    l10n\n  }) {\n    this.id = id;\n    this.renderingId = \"thumbnail\" + id;\n    this.pageLabel = null;\n    this.pdfPage = null;\n    this.rotation = 0;\n    this.viewport = defaultViewport;\n    this.pdfPageRotate = defaultViewport.rotation;\n    this._optionalContentConfigPromise = optionalContentConfigPromise || null;\n    this.linkService = linkService;\n    this.renderingQueue = renderingQueue;\n    this.renderTask = null;\n    this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;\n    this.resume = null;\n\n    this._checkSetImageDisabled = checkSetImageDisabled || function () {\n      return false;\n    };\n\n    this.disableCanvasToImageConversion = disableCanvasToImageConversion;\n    this.pageWidth = this.viewport.width;\n    this.pageHeight = this.viewport.height;\n    this.pageRatio = this.pageWidth / this.pageHeight;\n    this.canvasWidth = THUMBNAIL_WIDTH;\n    this.canvasHeight = this.canvasWidth / this.pageRatio | 0;\n    this.scale = this.canvasWidth / this.pageWidth;\n    this.l10n = l10n;\n    const anchor = document.createElement(\"a\");\n    anchor.href = linkService.getAnchorUrl(\"#page=\" + id);\n\n    this._thumbPageTitle.then(msg => {\n      anchor.title = msg;\n    });\n\n    anchor.onclick = function () {\n      linkService.goToPage(id);\n      return false;\n    };\n\n    this.anchor = anchor;\n    const div = document.createElement(\"div\");\n    div.className = \"thumbnail\";\n    div.setAttribute(\"data-page-number\", this.id);\n    this.div = div;\n    const ring = document.createElement(\"div\");\n    ring.className = \"thumbnailSelectionRing\";\n    const borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;\n    ring.style.width = this.canvasWidth + borderAdjustment + \"px\";\n    ring.style.height = this.canvasHeight + borderAdjustment + \"px\";\n    this.ring = ring;\n    div.appendChild(ring);\n    anchor.appendChild(div);\n    container.appendChild(anchor);\n  }\n\n  setPdfPage(pdfPage) {\n    this.pdfPage = pdfPage;\n    this.pdfPageRotate = pdfPage.rotate;\n    const totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n    this.viewport = pdfPage.getViewport({\n      scale: 1,\n      rotation: totalRotation\n    });\n    this.reset();\n  }\n\n  reset() {\n    this.cancelRendering();\n    this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;\n    this.pageWidth = this.viewport.width;\n    this.pageHeight = this.viewport.height;\n    this.pageRatio = this.pageWidth / this.pageHeight;\n    this.canvasHeight = this.canvasWidth / this.pageRatio | 0;\n    this.scale = this.canvasWidth / this.pageWidth;\n    this.div.removeAttribute(\"data-loaded\");\n    const ring = this.ring;\n    const childNodes = ring.childNodes;\n\n    for (let i = childNodes.length - 1; i >= 0; i--) {\n      ring.removeChild(childNodes[i]);\n    }\n\n    const borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;\n    ring.style.width = this.canvasWidth + borderAdjustment + \"px\";\n    ring.style.height = this.canvasHeight + borderAdjustment + \"px\";\n\n    if (this.canvas) {\n      this.canvas.width = 0;\n      this.canvas.height = 0;\n      delete this.canvas;\n    }\n\n    if (this.image) {\n      this.image.removeAttribute(\"src\");\n      delete this.image;\n    }\n  }\n\n  update(rotation) {\n    if (typeof rotation !== \"undefined\") {\n      this.rotation = rotation;\n    }\n\n    const totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n    this.viewport = this.viewport.clone({\n      scale: 1,\n      rotation: totalRotation\n    });\n    this.reset();\n  }\n\n  cancelRendering() {\n    if (this.renderTask) {\n      this.renderTask.cancel();\n      this.renderTask = null;\n    }\n\n    this.resume = null;\n  }\n\n  _getPageDrawContext() {\n    const canvas = document.createElement(\"canvas\");\n    this.canvas = canvas;\n    canvas.mozOpaque = true;\n    const ctx = canvas.getContext(\"2d\", {\n      alpha: false\n    });\n    const outputScale = (0, _ui_utils.getOutputScale)(ctx);\n    canvas.width = this.canvasWidth * outputScale.sx | 0;\n    canvas.height = this.canvasHeight * outputScale.sy | 0;\n    canvas.style.width = this.canvasWidth + \"px\";\n    canvas.style.height = this.canvasHeight + \"px\";\n    const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null;\n    return [ctx, transform];\n  }\n\n  _convertCanvasToImage() {\n    if (!this.canvas) {\n      return;\n    }\n\n    if (this.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {\n      return;\n    }\n\n    const className = \"thumbnailImage\";\n\n    if (this.disableCanvasToImageConversion) {\n      this.canvas.className = className;\n\n      this._thumbPageCanvas.then(msg => {\n        this.canvas.setAttribute(\"aria-label\", msg);\n      });\n\n      this.div.setAttribute(\"data-loaded\", true);\n      this.ring.appendChild(this.canvas);\n      return;\n    }\n\n    const image = document.createElement(\"img\");\n    image.className = className;\n\n    this._thumbPageCanvas.then(msg => {\n      image.setAttribute(\"aria-label\", msg);\n    });\n\n    image.style.width = this.canvasWidth + \"px\";\n    image.style.height = this.canvasHeight + \"px\";\n    image.src = this.canvas.toDataURL();\n    this.image = image;\n    this.div.setAttribute(\"data-loaded\", true);\n    this.ring.appendChild(image);\n    this.canvas.width = 0;\n    this.canvas.height = 0;\n    delete this.canvas;\n  }\n\n  draw() {\n    if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {\n      console.error(\"Must be in new state before drawing\");\n      return Promise.resolve(undefined);\n    }\n\n    const {\n      pdfPage\n    } = this;\n\n    if (!pdfPage) {\n      this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\n      return Promise.reject(new Error(\"pdfPage is not loaded\"));\n    }\n\n    this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;\n\n    const finishRenderTask = async (error = null) => {\n      if (renderTask === this.renderTask) {\n        this.renderTask = null;\n      }\n\n      if (error instanceof _pdfjsLib.RenderingCancelledException) {\n        return;\n      }\n\n      this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\n\n      this._convertCanvasToImage();\n\n      if (error) {\n        throw error;\n      }\n    };\n\n    const [ctx, transform] = this._getPageDrawContext();\n\n    const drawViewport = this.viewport.clone({\n      scale: this.scale\n    });\n\n    const renderContinueCallback = cont => {\n      if (!this.renderingQueue.isHighestPriority(this)) {\n        this.renderingState = _pdf_rendering_queue.RenderingStates.PAUSED;\n\n        this.resume = () => {\n          this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;\n          cont();\n        };\n\n        return;\n      }\n\n      cont();\n    };\n\n    const renderContext = {\n      canvasContext: ctx,\n      transform,\n      viewport: drawViewport,\n      optionalContentConfigPromise: this._optionalContentConfigPromise\n    };\n    const renderTask = this.renderTask = pdfPage.render(renderContext);\n    renderTask.onContinue = renderContinueCallback;\n    const resultPromise = renderTask.promise.then(function () {\n      finishRenderTask(null);\n    }, function (error) {\n      finishRenderTask(error);\n    });\n    resultPromise.finally(() => {\n      const pageCached = this.linkService.isPageCached(this.id);\n\n      if (pageCached) {\n        return;\n      }\n\n      this.pdfPage?.cleanup();\n    });\n    return resultPromise;\n  }\n\n  setImage(pageView) {\n    if (this._checkSetImageDisabled()) {\n      return;\n    }\n\n    if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {\n      return;\n    }\n\n    const img = pageView.canvas;\n\n    if (!img) {\n      return;\n    }\n\n    if (!this.pdfPage) {\n      this.setPdfPage(pageView.pdfPage);\n    }\n\n    this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\n\n    const [ctx] = this._getPageDrawContext();\n\n    const canvas = ctx.canvas;\n\n    if (img.width <= 2 * canvas.width) {\n      ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height);\n\n      this._convertCanvasToImage();\n\n      return;\n    }\n\n    let reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS;\n    let reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS;\n    const reducedImage = TempImageFactory.getCanvas(reducedWidth, reducedHeight);\n    const reducedImageCtx = reducedImage.getContext(\"2d\");\n\n    while (reducedWidth > img.width || reducedHeight > img.height) {\n      reducedWidth >>= 1;\n      reducedHeight >>= 1;\n    }\n\n    reducedImageCtx.drawImage(img, 0, 0, img.width, img.height, 0, 0, reducedWidth, reducedHeight);\n\n    while (reducedWidth > 2 * canvas.width) {\n      reducedImageCtx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, reducedWidth >> 1, reducedHeight >> 1);\n      reducedWidth >>= 1;\n      reducedHeight >>= 1;\n    }\n\n    ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, canvas.width, canvas.height);\n\n    this._convertCanvasToImage();\n  }\n\n  get _thumbPageTitle() {\n    return this.l10n.get(\"thumb_page_title\", {\n      page: this.pageLabel ?? this.id\n    });\n  }\n\n  get _thumbPageCanvas() {\n    return this.l10n.get(\"thumb_page_canvas\", {\n      page: this.pageLabel ?? this.id\n    });\n  }\n\n  setPageLabel(label) {\n    this.pageLabel = typeof label === \"string\" ? label : null;\n\n    this._thumbPageTitle.then(msg => {\n      this.anchor.title = msg;\n    });\n\n    if (this.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {\n      return;\n    }\n\n    this._thumbPageCanvas.then(msg => {\n      if (this.image) {\n        this.image.setAttribute(\"aria-label\", msg);\n      } else if (this.disableCanvasToImageConversion && this.canvas) {\n        this.canvas.setAttribute(\"aria-label\", msg);\n      }\n    });\n  }\n\n}\n\nexports.PDFThumbnailView = PDFThumbnailView;\n\n/***/ }),\n/* 27 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFViewer = void 0;\n\nvar _ui_utils = __webpack_require__(4);\n\nvar _base_viewer = __webpack_require__(28);\n\nvar _pdfjsLib = __webpack_require__(5);\n\nclass PDFViewer extends _base_viewer.BaseViewer {\n  get _viewerElement() {\n    return (0, _pdfjsLib.shadow)(this, \"_viewerElement\", this.viewer);\n  }\n\n  _scrollIntoView({\n    pageDiv,\n    pageSpot = null,\n    pageNumber = null\n  }) {\n    if (!pageSpot && !this.isInPresentationMode) {\n      const left = pageDiv.offsetLeft + pageDiv.clientLeft;\n      const right = left + pageDiv.clientWidth;\n      const {\n        scrollLeft,\n        clientWidth\n      } = this.container;\n\n      if (this._isScrollModeHorizontal || left < scrollLeft || right > scrollLeft + clientWidth) {\n        pageSpot = {\n          left: 0,\n          top: 0\n        };\n      }\n    }\n\n    super._scrollIntoView({\n      pageDiv,\n      pageSpot,\n      pageNumber\n    });\n  }\n\n  _getVisiblePages() {\n    if (this.isInPresentationMode) {\n      return this._getCurrentVisiblePage();\n    }\n\n    return super._getVisiblePages();\n  }\n\n  _updateHelper(visiblePages) {\n    if (this.isInPresentationMode) {\n      return;\n    }\n\n    let currentId = this._currentPageNumber;\n    let stillFullyVisible = false;\n\n    for (const page of visiblePages) {\n      if (page.percent < 100) {\n        break;\n      }\n\n      if (page.id === currentId && this._scrollMode === _ui_utils.ScrollMode.VERTICAL && this._spreadMode === _ui_utils.SpreadMode.NONE) {\n        stillFullyVisible = true;\n        break;\n      }\n    }\n\n    if (!stillFullyVisible) {\n      currentId = visiblePages[0].id;\n    }\n\n    this._setCurrentPageNumber(currentId);\n  }\n\n}\n\nexports.PDFViewer = PDFViewer;\n\n/***/ }),\n/* 28 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.BaseViewer = void 0;\n\nvar _pdfjsLib = __webpack_require__(5);\n\nvar _ui_utils = __webpack_require__(4);\n\nvar _pdf_rendering_queue = __webpack_require__(8);\n\nvar _annotation_layer_builder = __webpack_require__(29);\n\nvar _l10n_utils = __webpack_require__(30);\n\nvar _pdf_page_view = __webpack_require__(31);\n\nvar _pdf_link_service = __webpack_require__(19);\n\nvar _text_layer_builder = __webpack_require__(32);\n\nvar _xfa_layer_builder = __webpack_require__(33);\n\nconst DEFAULT_CACHE_SIZE = 10;\n\nfunction PDFPageViewBuffer(size) {\n  const data = [];\n\n  this.push = function (view) {\n    const i = data.indexOf(view);\n\n    if (i >= 0) {\n      data.splice(i, 1);\n    }\n\n    data.push(view);\n\n    if (data.length > size) {\n      data.shift().destroy();\n    }\n  };\n\n  this.resize = function (newSize, pagesToKeep) {\n    size = newSize;\n\n    if (pagesToKeep) {\n      const pageIdsToKeep = new Set();\n\n      for (let i = 0, iMax = pagesToKeep.length; i < iMax; ++i) {\n        pageIdsToKeep.add(pagesToKeep[i].id);\n      }\n\n      (0, _ui_utils.moveToEndOfArray)(data, function (page) {\n        return pageIdsToKeep.has(page.id);\n      });\n    }\n\n    while (data.length > size) {\n      data.shift().destroy();\n    }\n  };\n\n  this.has = function (view) {\n    return data.includes(view);\n  };\n}\n\nfunction isSameScale(oldScale, newScale) {\n  if (newScale === oldScale) {\n    return true;\n  }\n\n  if (Math.abs(newScale - oldScale) < 1e-15) {\n    return true;\n  }\n\n  return false;\n}\n\nclass BaseViewer {\n  constructor(options) {\n    if (this.constructor === BaseViewer) {\n      throw new Error(\"Cannot initialize BaseViewer.\");\n    }\n\n    const viewerVersion = '2.8.335';\n\n    if (_pdfjsLib.version !== viewerVersion) {\n      throw new Error(`The API version \"${_pdfjsLib.version}\" does not match the Viewer version \"${viewerVersion}\".`);\n    }\n\n    this._name = this.constructor.name;\n    this.container = options.container;\n    this.viewer = options.viewer || options.container.firstElementChild;\n\n    if (!(this.container?.tagName.toUpperCase() === \"DIV\" && this.viewer?.tagName.toUpperCase() === \"DIV\")) {\n      throw new Error(\"Invalid `container` and/or `viewer` option.\");\n    }\n\n    if (this.container.offsetParent && getComputedStyle(this.container).position !== \"absolute\") {\n      throw new Error(\"The `container` must be absolutely positioned.\");\n    }\n\n    this.eventBus = options.eventBus;\n    this.linkService = options.linkService || new _pdf_link_service.SimpleLinkService();\n    this.downloadManager = options.downloadManager || null;\n    this.findController = options.findController || null;\n    this._scriptingManager = options.scriptingManager || null;\n    this.removePageBorders = options.removePageBorders || false;\n    this.textLayerMode = Number.isInteger(options.textLayerMode) ? options.textLayerMode : _ui_utils.TextLayerMode.ENABLE;\n    this.imageResourcesPath = options.imageResourcesPath || \"\";\n    this.renderInteractiveForms = options.renderInteractiveForms !== false;\n    this.enablePrintAutoRotate = options.enablePrintAutoRotate || false;\n    this.renderer = options.renderer || _ui_utils.RendererType.CANVAS;\n    this.enableWebGL = options.enableWebGL || false;\n    this.useOnlyCssZoom = options.useOnlyCssZoom || false;\n    this.maxCanvasPixels = options.maxCanvasPixels;\n    this.l10n = options.l10n || _l10n_utils.NullL10n;\n    this.enableScripting = options.enableScripting === true && !!this._scriptingManager;\n    this.defaultRenderingQueue = !options.renderingQueue;\n\n    if (this.defaultRenderingQueue) {\n      this.renderingQueue = new _pdf_rendering_queue.PDFRenderingQueue();\n      this.renderingQueue.setViewer(this);\n    } else {\n      this.renderingQueue = options.renderingQueue;\n    }\n\n    this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdate.bind(this));\n    this.presentationModeState = _ui_utils.PresentationModeState.UNKNOWN;\n    this._onBeforeDraw = this._onAfterDraw = null;\n\n    this._resetView();\n\n    if (this.removePageBorders) {\n      this.viewer.classList.add(\"removePageBorders\");\n    }\n\n    Promise.resolve().then(() => {\n      this.eventBus.dispatch(\"baseviewerinit\", {\n        source: this\n      });\n    });\n  }\n\n  get pagesCount() {\n    return this._pages.length;\n  }\n\n  getPageView(index) {\n    return this._pages[index];\n  }\n\n  get pageViewsReady() {\n    if (!this._pagesCapability.settled) {\n      return false;\n    }\n\n    return this._pages.every(function (pageView) {\n      return pageView?.pdfPage;\n    });\n  }\n\n  get currentPageNumber() {\n    return this._currentPageNumber;\n  }\n\n  set currentPageNumber(val) {\n    if (!Number.isInteger(val)) {\n      throw new Error(\"Invalid page number.\");\n    }\n\n    if (!this.pdfDocument) {\n      return;\n    }\n\n    if (!this._setCurrentPageNumber(val, true)) {\n      console.error(`${this._name}.currentPageNumber: \"${val}\" is not a valid page.`);\n    }\n  }\n\n  _setCurrentPageNumber(val, resetCurrentPageView = false) {\n    if (this._currentPageNumber === val) {\n      if (resetCurrentPageView) {\n        this._resetCurrentPageView();\n      }\n\n      return true;\n    }\n\n    if (!(0 < val && val <= this.pagesCount)) {\n      return false;\n    }\n\n    const previous = this._currentPageNumber;\n    this._currentPageNumber = val;\n    this.eventBus.dispatch(\"pagechanging\", {\n      source: this,\n      pageNumber: val,\n      pageLabel: this._pageLabels?.[val - 1] ?? null,\n      previous\n    });\n\n    if (resetCurrentPageView) {\n      this._resetCurrentPageView();\n    }\n\n    return true;\n  }\n\n  get currentPageLabel() {\n    return this._pageLabels?.[this._currentPageNumber - 1] ?? null;\n  }\n\n  set currentPageLabel(val) {\n    if (!this.pdfDocument) {\n      return;\n    }\n\n    let page = val | 0;\n\n    if (this._pageLabels) {\n      const i = this._pageLabels.indexOf(val);\n\n      if (i >= 0) {\n        page = i + 1;\n      }\n    }\n\n    if (!this._setCurrentPageNumber(page, true)) {\n      console.error(`${this._name}.currentPageLabel: \"${val}\" is not a valid page.`);\n    }\n  }\n\n  get currentScale() {\n    return this._currentScale !== _ui_utils.UNKNOWN_SCALE ? this._currentScale : _ui_utils.DEFAULT_SCALE;\n  }\n\n  set currentScale(val) {\n    if (isNaN(val)) {\n      throw new Error(\"Invalid numeric scale.\");\n    }\n\n    if (!this.pdfDocument) {\n      return;\n    }\n\n    this._setScale(val, false);\n  }\n\n  get currentScaleValue() {\n    return this._currentScaleValue;\n  }\n\n  set currentScaleValue(val) {\n    if (!this.pdfDocument) {\n      return;\n    }\n\n    this._setScale(val, false);\n  }\n\n  get pagesRotation() {\n    return this._pagesRotation;\n  }\n\n  set pagesRotation(rotation) {\n    if (!(0, _ui_utils.isValidRotation)(rotation)) {\n      throw new Error(\"Invalid pages rotation angle.\");\n    }\n\n    if (!this.pdfDocument) {\n      return;\n    }\n\n    rotation %= 360;\n\n    if (rotation < 0) {\n      rotation += 360;\n    }\n\n    if (this._pagesRotation === rotation) {\n      return;\n    }\n\n    this._pagesRotation = rotation;\n    const pageNumber = this._currentPageNumber;\n\n    for (let i = 0, ii = this._pages.length; i < ii; i++) {\n      const pageView = this._pages[i];\n      pageView.update(pageView.scale, rotation);\n    }\n\n    if (this._currentScaleValue) {\n      this._setScale(this._currentScaleValue, true);\n    }\n\n    this.eventBus.dispatch(\"rotationchanging\", {\n      source: this,\n      pagesRotation: rotation,\n      pageNumber\n    });\n\n    if (this.defaultRenderingQueue) {\n      this.update();\n    }\n  }\n\n  get firstPagePromise() {\n    return this.pdfDocument ? this._firstPageCapability.promise : null;\n  }\n\n  get onePageRendered() {\n    return this.pdfDocument ? this._onePageRenderedCapability.promise : null;\n  }\n\n  get pagesPromise() {\n    return this.pdfDocument ? this._pagesCapability.promise : null;\n  }\n\n  get _viewerElement() {\n    throw new Error(\"Not implemented: _viewerElement\");\n  }\n\n  _onePageRenderedOrForceFetch() {\n    if (!this.container.offsetParent || this._getVisiblePages().views.length === 0) {\n      return Promise.resolve();\n    }\n\n    return this._onePageRenderedCapability.promise;\n  }\n\n  setDocument(pdfDocument) {\n    if (this.pdfDocument) {\n      this.eventBus.dispatch(\"pagesdestroy\", {\n        source: this\n      });\n\n      this._cancelRendering();\n\n      this._resetView();\n\n      if (this.findController) {\n        this.findController.setDocument(null);\n      }\n\n      if (this._scriptingManager) {\n        this._scriptingManager.setDocument(null);\n      }\n    }\n\n    this.pdfDocument = pdfDocument;\n\n    if (!pdfDocument) {\n      return;\n    }\n\n    const isPureXfa = pdfDocument.isPureXfa;\n    const pagesCount = pdfDocument.numPages;\n    const firstPagePromise = pdfDocument.getPage(1);\n    const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig();\n\n    this._pagesCapability.promise.then(() => {\n      this.eventBus.dispatch(\"pagesloaded\", {\n        source: this,\n        pagesCount\n      });\n    });\n\n    this._onBeforeDraw = evt => {\n      const pageView = this._pages[evt.pageNumber - 1];\n\n      if (!pageView) {\n        return;\n      }\n\n      this._buffer.push(pageView);\n    };\n\n    this.eventBus._on(\"pagerender\", this._onBeforeDraw);\n\n    this._onAfterDraw = evt => {\n      if (evt.cssTransform || this._onePageRenderedCapability.settled) {\n        return;\n      }\n\n      this._onePageRenderedCapability.resolve();\n\n      this.eventBus._off(\"pagerendered\", this._onAfterDraw);\n\n      this._onAfterDraw = null;\n    };\n\n    this.eventBus._on(\"pagerendered\", this._onAfterDraw);\n\n    firstPagePromise.then(firstPdfPage => {\n      this._firstPageCapability.resolve(firstPdfPage);\n\n      this._optionalContentConfigPromise = optionalContentConfigPromise;\n      const scale = this.currentScale;\n      const viewport = firstPdfPage.getViewport({\n        scale: scale * _ui_utils.CSS_UNITS\n      });\n      const textLayerFactory = this.textLayerMode !== _ui_utils.TextLayerMode.DISABLE ? this : null;\n      const xfaLayerFactory = isPureXfa ? this : null;\n\n      for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n        const pageView = new _pdf_page_view.PDFPageView({\n          container: this._viewerElement,\n          eventBus: this.eventBus,\n          id: pageNum,\n          scale,\n          defaultViewport: viewport.clone(),\n          optionalContentConfigPromise,\n          renderingQueue: this.renderingQueue,\n          textLayerFactory,\n          textLayerMode: this.textLayerMode,\n          annotationLayerFactory: this,\n          xfaLayerFactory,\n          imageResourcesPath: this.imageResourcesPath,\n          renderInteractiveForms: this.renderInteractiveForms,\n          renderer: this.renderer,\n          enableWebGL: this.enableWebGL,\n          useOnlyCssZoom: this.useOnlyCssZoom,\n          maxCanvasPixels: this.maxCanvasPixels,\n          l10n: this.l10n,\n          enableScripting: this.enableScripting\n        });\n\n        this._pages.push(pageView);\n      }\n\n      const firstPageView = this._pages[0];\n\n      if (firstPageView) {\n        firstPageView.setPdfPage(firstPdfPage);\n        this.linkService.cachePageRef(1, firstPdfPage.ref);\n      }\n\n      if (this._spreadMode !== _ui_utils.SpreadMode.NONE) {\n        this._updateSpreadMode();\n      }\n\n      this._onePageRenderedOrForceFetch().then(() => {\n        if (this.findController) {\n          this.findController.setDocument(pdfDocument);\n        }\n\n        if (this.enableScripting) {\n          this._scriptingManager.setDocument(pdfDocument);\n        }\n\n        if (pdfDocument.loadingParams.disableAutoFetch || pagesCount > 7500) {\n          this._pagesCapability.resolve();\n\n          return;\n        }\n\n        let getPagesLeft = pagesCount - 1;\n\n        if (getPagesLeft <= 0) {\n          this._pagesCapability.resolve();\n\n          return;\n        }\n\n        for (let pageNum = 2; pageNum <= pagesCount; ++pageNum) {\n          pdfDocument.getPage(pageNum).then(pdfPage => {\n            const pageView = this._pages[pageNum - 1];\n\n            if (!pageView.pdfPage) {\n              pageView.setPdfPage(pdfPage);\n            }\n\n            this.linkService.cachePageRef(pageNum, pdfPage.ref);\n\n            if (--getPagesLeft === 0) {\n              this._pagesCapability.resolve();\n            }\n          }, reason => {\n            console.error(`Unable to get page ${pageNum} to initialize viewer`, reason);\n\n            if (--getPagesLeft === 0) {\n              this._pagesCapability.resolve();\n            }\n          });\n        }\n      });\n\n      this.eventBus.dispatch(\"pagesinit\", {\n        source: this\n      });\n\n      if (this.defaultRenderingQueue) {\n        this.update();\n      }\n    }).catch(reason => {\n      console.error(\"Unable to initialize viewer\", reason);\n    });\n  }\n\n  setPageLabels(labels) {\n    if (!this.pdfDocument) {\n      return;\n    }\n\n    if (!labels) {\n      this._pageLabels = null;\n    } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) {\n      this._pageLabels = null;\n      console.error(`${this._name}.setPageLabels: Invalid page labels.`);\n    } else {\n      this._pageLabels = labels;\n    }\n\n    for (let i = 0, ii = this._pages.length; i < ii; i++) {\n      this._pages[i].setPageLabel(this._pageLabels?.[i] ?? null);\n    }\n  }\n\n  _resetView() {\n    this._pages = [];\n    this._currentPageNumber = 1;\n    this._currentScale = _ui_utils.UNKNOWN_SCALE;\n    this._currentScaleValue = null;\n    this._pageLabels = null;\n    this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE);\n    this._location = null;\n    this._pagesRotation = 0;\n    this._optionalContentConfigPromise = null;\n    this._pagesRequests = new WeakMap();\n    this._firstPageCapability = (0, _pdfjsLib.createPromiseCapability)();\n    this._onePageRenderedCapability = (0, _pdfjsLib.createPromiseCapability)();\n    this._pagesCapability = (0, _pdfjsLib.createPromiseCapability)();\n    this._scrollMode = _ui_utils.ScrollMode.VERTICAL;\n    this._spreadMode = _ui_utils.SpreadMode.NONE;\n\n    if (this._onBeforeDraw) {\n      this.eventBus._off(\"pagerender\", this._onBeforeDraw);\n\n      this._onBeforeDraw = null;\n    }\n\n    if (this._onAfterDraw) {\n      this.eventBus._off(\"pagerendered\", this._onAfterDraw);\n\n      this._onAfterDraw = null;\n    }\n\n    this.viewer.textContent = \"\";\n\n    this._updateScrollMode();\n  }\n\n  _scrollUpdate() {\n    if (this.pagesCount === 0) {\n      return;\n    }\n\n    this.update();\n  }\n\n  _scrollIntoView({\n    pageDiv,\n    pageSpot = null,\n    pageNumber = null\n  }) {\n    (0, _ui_utils.scrollIntoView)(pageDiv, pageSpot);\n  }\n\n  _setScaleUpdatePages(newScale, newValue, noScroll = false, preset = false) {\n    this._currentScaleValue = newValue.toString();\n\n    if (isSameScale(this._currentScale, newScale)) {\n      if (preset) {\n        this.eventBus.dispatch(\"scalechanging\", {\n          source: this,\n          scale: newScale,\n          presetValue: newValue\n        });\n      }\n\n      return;\n    }\n\n    for (let i = 0, ii = this._pages.length; i < ii; i++) {\n      this._pages[i].update(newScale);\n    }\n\n    this._currentScale = newScale;\n\n    if (!noScroll) {\n      let page = this._currentPageNumber,\n          dest;\n\n      if (this._location && !(this.isInPresentationMode || this.isChangingPresentationMode)) {\n        page = this._location.pageNumber;\n        dest = [null, {\n          name: \"XYZ\"\n        }, this._location.left, this._location.top, null];\n      }\n\n      this.scrollPageIntoView({\n        pageNumber: page,\n        destArray: dest,\n        allowNegativeOffset: true\n      });\n    }\n\n    this.eventBus.dispatch(\"scalechanging\", {\n      source: this,\n      scale: newScale,\n      presetValue: preset ? newValue : undefined\n    });\n\n    if (this.defaultRenderingQueue) {\n      this.update();\n    }\n  }\n\n  get _pageWidthScaleFactor() {\n    if (this._spreadMode !== _ui_utils.SpreadMode.NONE && this._scrollMode !== _ui_utils.ScrollMode.HORIZONTAL && !this.isInPresentationMode) {\n      return 2;\n    }\n\n    return 1;\n  }\n\n  _setScale(value, noScroll = false) {\n    let scale = parseFloat(value);\n\n    if (scale > 0) {\n      this._setScaleUpdatePages(scale, value, noScroll, false);\n    } else {\n      const currentPage = this._pages[this._currentPageNumber - 1];\n\n      if (!currentPage) {\n        return;\n      }\n\n      const noPadding = this.isInPresentationMode || this.removePageBorders;\n      let hPadding = noPadding ? 0 : _ui_utils.SCROLLBAR_PADDING;\n      let vPadding = noPadding ? 0 : _ui_utils.VERTICAL_PADDING;\n\n      if (!noPadding && this._isScrollModeHorizontal) {\n        [hPadding, vPadding] = [vPadding, hPadding];\n      }\n\n      const pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale / this._pageWidthScaleFactor;\n      const pageHeightScale = (this.container.clientHeight - vPadding) / currentPage.height * currentPage.scale;\n\n      switch (value) {\n        case \"page-actual\":\n          scale = 1;\n          break;\n\n        case \"page-width\":\n          scale = pageWidthScale;\n          break;\n\n        case \"page-height\":\n          scale = pageHeightScale;\n          break;\n\n        case \"page-fit\":\n          scale = Math.min(pageWidthScale, pageHeightScale);\n          break;\n\n        case \"auto\":\n          const horizontalScale = (0, _ui_utils.isPortraitOrientation)(currentPage) ? pageWidthScale : Math.min(pageHeightScale, pageWidthScale);\n          scale = Math.min(_ui_utils.MAX_AUTO_SCALE, horizontalScale);\n          break;\n\n        default:\n          console.error(`${this._name}._setScale: \"${value}\" is an unknown zoom value.`);\n          return;\n      }\n\n      this._setScaleUpdatePages(scale, value, noScroll, true);\n    }\n  }\n\n  _resetCurrentPageView() {\n    if (this.isInPresentationMode) {\n      this._setScale(this._currentScaleValue, true);\n    }\n\n    const pageView = this._pages[this._currentPageNumber - 1];\n\n    this._scrollIntoView({\n      pageDiv: pageView.div\n    });\n  }\n\n  pageLabelToPageNumber(label) {\n    if (!this._pageLabels) {\n      return null;\n    }\n\n    const i = this._pageLabels.indexOf(label);\n\n    if (i < 0) {\n      return null;\n    }\n\n    return i + 1;\n  }\n\n  scrollPageIntoView({\n    pageNumber,\n    destArray = null,\n    allowNegativeOffset = false,\n    ignoreDestinationZoom = false\n  }) {\n    if (!this.pdfDocument) {\n      return;\n    }\n\n    const pageView = Number.isInteger(pageNumber) && this._pages[pageNumber - 1];\n\n    if (!pageView) {\n      console.error(`${this._name}.scrollPageIntoView: ` + `\"${pageNumber}\" is not a valid pageNumber parameter.`);\n      return;\n    }\n\n    if (this.isInPresentationMode || !destArray) {\n      this._setCurrentPageNumber(pageNumber, true);\n\n      return;\n    }\n\n    let x = 0,\n        y = 0;\n    let width = 0,\n        height = 0,\n        widthScale,\n        heightScale;\n    const changeOrientation = pageView.rotation % 180 !== 0;\n    const pageWidth = (changeOrientation ? pageView.height : pageView.width) / pageView.scale / _ui_utils.CSS_UNITS;\n    const pageHeight = (changeOrientation ? pageView.width : pageView.height) / pageView.scale / _ui_utils.CSS_UNITS;\n    let scale = 0;\n\n    switch (destArray[1].name) {\n      case \"XYZ\":\n        x = destArray[2];\n        y = destArray[3];\n        scale = destArray[4];\n        x = x !== null ? x : 0;\n        y = y !== null ? y : pageHeight;\n        break;\n\n      case \"Fit\":\n      case \"FitB\":\n        scale = \"page-fit\";\n        break;\n\n      case \"FitH\":\n      case \"FitBH\":\n        y = destArray[2];\n        scale = \"page-width\";\n\n        if (y === null && this._location) {\n          x = this._location.left;\n          y = this._location.top;\n        } else if (typeof y !== \"number\") {\n          y = pageHeight;\n        }\n\n        break;\n\n      case \"FitV\":\n      case \"FitBV\":\n        x = destArray[2];\n        width = pageWidth;\n        height = pageHeight;\n        scale = \"page-height\";\n        break;\n\n      case \"FitR\":\n        x = destArray[2];\n        y = destArray[3];\n        width = destArray[4] - x;\n        height = destArray[5] - y;\n        const hPadding = this.removePageBorders ? 0 : _ui_utils.SCROLLBAR_PADDING;\n        const vPadding = this.removePageBorders ? 0 : _ui_utils.VERTICAL_PADDING;\n        widthScale = (this.container.clientWidth - hPadding) / width / _ui_utils.CSS_UNITS;\n        heightScale = (this.container.clientHeight - vPadding) / height / _ui_utils.CSS_UNITS;\n        scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));\n        break;\n\n      default:\n        console.error(`${this._name}.scrollPageIntoView: ` + `\"${destArray[1].name}\" is not a valid destination type.`);\n        return;\n    }\n\n    if (!ignoreDestinationZoom) {\n      if (scale && scale !== this._currentScale) {\n        this.currentScaleValue = scale;\n      } else if (this._currentScale === _ui_utils.UNKNOWN_SCALE) {\n        this.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;\n      }\n    }\n\n    if (scale === \"page-fit\" && !destArray[4]) {\n      this._scrollIntoView({\n        pageDiv: pageView.div,\n        pageNumber\n      });\n\n      return;\n    }\n\n    const boundingRect = [pageView.viewport.convertToViewportPoint(x, y), pageView.viewport.convertToViewportPoint(x + width, y + height)];\n    let left = Math.min(boundingRect[0][0], boundingRect[1][0]);\n    let top = Math.min(boundingRect[0][1], boundingRect[1][1]);\n\n    if (!allowNegativeOffset) {\n      left = Math.max(left, 0);\n      top = Math.max(top, 0);\n    }\n\n    this._scrollIntoView({\n      pageDiv: pageView.div,\n      pageSpot: {\n        left,\n        top\n      },\n      pageNumber\n    });\n  }\n\n  _updateLocation(firstPage) {\n    const currentScale = this._currentScale;\n    const currentScaleValue = this._currentScaleValue;\n    const normalizedScaleValue = parseFloat(currentScaleValue) === currentScale ? Math.round(currentScale * 10000) / 100 : currentScaleValue;\n    const pageNumber = firstPage.id;\n    let pdfOpenParams = \"#page=\" + pageNumber;\n    pdfOpenParams += \"&zoom=\" + normalizedScaleValue;\n    const currentPageView = this._pages[pageNumber - 1];\n    const container = this.container;\n    const topLeft = currentPageView.getPagePoint(container.scrollLeft - firstPage.x, container.scrollTop - firstPage.y);\n    const intLeft = Math.round(topLeft[0]);\n    const intTop = Math.round(topLeft[1]);\n    pdfOpenParams += \",\" + intLeft + \",\" + intTop;\n    this._location = {\n      pageNumber,\n      scale: normalizedScaleValue,\n      top: intTop,\n      left: intLeft,\n      rotation: this._pagesRotation,\n      pdfOpenParams\n    };\n  }\n\n  _updateHelper(visiblePages) {\n    throw new Error(\"Not implemented: _updateHelper\");\n  }\n\n  update() {\n    const visible = this._getVisiblePages();\n\n    const visiblePages = visible.views,\n          numVisiblePages = visiblePages.length;\n\n    if (numVisiblePages === 0) {\n      return;\n    }\n\n    const newCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * numVisiblePages + 1);\n\n    this._buffer.resize(newCacheSize, visiblePages);\n\n    this.renderingQueue.renderHighestPriority(visible);\n\n    this._updateHelper(visiblePages);\n\n    this._updateLocation(visible.first);\n\n    this.eventBus.dispatch(\"updateviewarea\", {\n      source: this,\n      location: this._location\n    });\n  }\n\n  containsElement(element) {\n    return this.container.contains(element);\n  }\n\n  focus() {\n    this.container.focus();\n  }\n\n  get _isScrollModeHorizontal() {\n    return this.isInPresentationMode ? false : this._scrollMode === _ui_utils.ScrollMode.HORIZONTAL;\n  }\n\n  get _isContainerRtl() {\n    return getComputedStyle(this.container).direction === \"rtl\";\n  }\n\n  get isInPresentationMode() {\n    return this.presentationModeState === _ui_utils.PresentationModeState.FULLSCREEN;\n  }\n\n  get isChangingPresentationMode() {\n    return this.presentationModeState === _ui_utils.PresentationModeState.CHANGING;\n  }\n\n  get isHorizontalScrollbarEnabled() {\n    return this.isInPresentationMode ? false : this.container.scrollWidth > this.container.clientWidth;\n  }\n\n  get isVerticalScrollbarEnabled() {\n    return this.isInPresentationMode ? false : this.container.scrollHeight > this.container.clientHeight;\n  }\n\n  _getCurrentVisiblePage() {\n    if (!this.pagesCount) {\n      return {\n        views: []\n      };\n    }\n\n    const pageView = this._pages[this._currentPageNumber - 1];\n    const element = pageView.div;\n    const view = {\n      id: pageView.id,\n      x: element.offsetLeft + element.clientLeft,\n      y: element.offsetTop + element.clientTop,\n      view: pageView\n    };\n    return {\n      first: view,\n      last: view,\n      views: [view]\n    };\n  }\n\n  _getVisiblePages() {\n    return (0, _ui_utils.getVisibleElements)({\n      scrollEl: this.container,\n      views: this._pages,\n      sortByVisibility: true,\n      horizontal: this._isScrollModeHorizontal,\n      rtl: this._isScrollModeHorizontal && this._isContainerRtl\n    });\n  }\n\n  isPageVisible(pageNumber) {\n    if (!this.pdfDocument) {\n      return false;\n    }\n\n    if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) {\n      console.error(`${this._name}.isPageVisible: \"${pageNumber}\" is not a valid page.`);\n      return false;\n    }\n\n    return this._getVisiblePages().views.some(function (view) {\n      return view.id === pageNumber;\n    });\n  }\n\n  isPageCached(pageNumber) {\n    if (!this.pdfDocument || !this._buffer) {\n      return false;\n    }\n\n    if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) {\n      console.error(`${this._name}.isPageCached: \"${pageNumber}\" is not a valid page.`);\n      return false;\n    }\n\n    const pageView = this._pages[pageNumber - 1];\n\n    if (!pageView) {\n      return false;\n    }\n\n    return this._buffer.has(pageView);\n  }\n\n  cleanup() {\n    for (let i = 0, ii = this._pages.length; i < ii; i++) {\n      if (this._pages[i] && this._pages[i].renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {\n        this._pages[i].reset();\n      }\n    }\n  }\n\n  _cancelRendering() {\n    for (let i = 0, ii = this._pages.length; i < ii; i++) {\n      if (this._pages[i]) {\n        this._pages[i].cancelRendering();\n      }\n    }\n  }\n\n  _ensurePdfPageLoaded(pageView) {\n    if (pageView.pdfPage) {\n      return Promise.resolve(pageView.pdfPage);\n    }\n\n    if (this._pagesRequests.has(pageView)) {\n      return this._pagesRequests.get(pageView);\n    }\n\n    const promise = this.pdfDocument.getPage(pageView.id).then(pdfPage => {\n      if (!pageView.pdfPage) {\n        pageView.setPdfPage(pdfPage);\n      }\n\n      this._pagesRequests.delete(pageView);\n\n      return pdfPage;\n    }).catch(reason => {\n      console.error(\"Unable to get page for page view\", reason);\n\n      this._pagesRequests.delete(pageView);\n    });\n\n    this._pagesRequests.set(pageView, promise);\n\n    return promise;\n  }\n\n  forceRendering(currentlyVisiblePages) {\n    const visiblePages = currentlyVisiblePages || this._getVisiblePages();\n\n    const scrollAhead = this._isScrollModeHorizontal ? this.scroll.right : this.scroll.down;\n    const pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, scrollAhead);\n\n    if (pageView) {\n      this._ensurePdfPageLoaded(pageView).then(() => {\n        this.renderingQueue.renderView(pageView);\n      });\n\n      return true;\n    }\n\n    return false;\n  }\n\n  createTextLayerBuilder(textLayerDiv, pageIndex, viewport, enhanceTextSelection = false, eventBus) {\n    return new _text_layer_builder.TextLayerBuilder({\n      textLayerDiv,\n      eventBus,\n      pageIndex,\n      viewport,\n      findController: this.isInPresentationMode ? null : this.findController,\n      enhanceTextSelection: this.isInPresentationMode ? false : enhanceTextSelection\n    });\n  }\n\n  createAnnotationLayerBuilder(pageDiv, pdfPage, annotationStorage = null, imageResourcesPath = \"\", renderInteractiveForms = false, l10n = _l10n_utils.NullL10n, enableScripting = false, hasJSActionsPromise = null, mouseState = null) {\n    return new _annotation_layer_builder.AnnotationLayerBuilder({\n      pageDiv,\n      pdfPage,\n      annotationStorage: annotationStorage || this.pdfDocument?.annotationStorage,\n      imageResourcesPath,\n      renderInteractiveForms,\n      linkService: this.linkService,\n      downloadManager: this.downloadManager,\n      l10n,\n      enableScripting,\n      hasJSActionsPromise: hasJSActionsPromise || this.pdfDocument?.hasJSActions(),\n      mouseState: mouseState || this._scriptingManager?.mouseState\n    });\n  }\n\n  createXfaLayerBuilder(pageDiv, pdfPage) {\n    return new _xfa_layer_builder.XfaLayerBuilder({\n      pageDiv,\n      pdfPage\n    });\n  }\n\n  get hasEqualPageSizes() {\n    const firstPageView = this._pages[0];\n\n    for (let i = 1, ii = this._pages.length; i < ii; ++i) {\n      const pageView = this._pages[i];\n\n      if (pageView.width !== firstPageView.width || pageView.height !== firstPageView.height) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  getPagesOverview() {\n    return this._pages.map(pageView => {\n      const viewport = pageView.pdfPage.getViewport({\n        scale: 1\n      });\n\n      if (!this.enablePrintAutoRotate || (0, _ui_utils.isPortraitOrientation)(viewport)) {\n        return {\n          width: viewport.width,\n          height: viewport.height,\n          rotation: viewport.rotation\n        };\n      }\n\n      return {\n        width: viewport.height,\n        height: viewport.width,\n        rotation: (viewport.rotation - 90) % 360\n      };\n    });\n  }\n\n  get optionalContentConfigPromise() {\n    if (!this.pdfDocument) {\n      return Promise.resolve(null);\n    }\n\n    if (!this._optionalContentConfigPromise) {\n      return this.pdfDocument.getOptionalContentConfig();\n    }\n\n    return this._optionalContentConfigPromise;\n  }\n\n  set optionalContentConfigPromise(promise) {\n    if (!(promise instanceof Promise)) {\n      throw new Error(`Invalid optionalContentConfigPromise: ${promise}`);\n    }\n\n    if (!this.pdfDocument) {\n      return;\n    }\n\n    if (!this._optionalContentConfigPromise) {\n      return;\n    }\n\n    this._optionalContentConfigPromise = promise;\n\n    for (const pageView of this._pages) {\n      pageView.update(pageView.scale, pageView.rotation, promise);\n    }\n\n    this.update();\n    this.eventBus.dispatch(\"optionalcontentconfigchanged\", {\n      source: this,\n      promise\n    });\n  }\n\n  get scrollMode() {\n    return this._scrollMode;\n  }\n\n  set scrollMode(mode) {\n    if (this._scrollMode === mode) {\n      return;\n    }\n\n    if (!(0, _ui_utils.isValidScrollMode)(mode)) {\n      throw new Error(`Invalid scroll mode: ${mode}`);\n    }\n\n    this._scrollMode = mode;\n    this.eventBus.dispatch(\"scrollmodechanged\", {\n      source: this,\n      mode\n    });\n\n    this._updateScrollMode(this._currentPageNumber);\n  }\n\n  _updateScrollMode(pageNumber = null) {\n    const scrollMode = this._scrollMode,\n          viewer = this.viewer;\n    viewer.classList.toggle(\"scrollHorizontal\", scrollMode === _ui_utils.ScrollMode.HORIZONTAL);\n    viewer.classList.toggle(\"scrollWrapped\", scrollMode === _ui_utils.ScrollMode.WRAPPED);\n\n    if (!this.pdfDocument || !pageNumber) {\n      return;\n    }\n\n    if (this._currentScaleValue && isNaN(this._currentScaleValue)) {\n      this._setScale(this._currentScaleValue, true);\n    }\n\n    this._setCurrentPageNumber(pageNumber, true);\n\n    this.update();\n  }\n\n  get spreadMode() {\n    return this._spreadMode;\n  }\n\n  set spreadMode(mode) {\n    if (this._spreadMode === mode) {\n      return;\n    }\n\n    if (!(0, _ui_utils.isValidSpreadMode)(mode)) {\n      throw new Error(`Invalid spread mode: ${mode}`);\n    }\n\n    this._spreadMode = mode;\n    this.eventBus.dispatch(\"spreadmodechanged\", {\n      source: this,\n      mode\n    });\n\n    this._updateSpreadMode(this._currentPageNumber);\n  }\n\n  _updateSpreadMode(pageNumber = null) {\n    if (!this.pdfDocument) {\n      return;\n    }\n\n    const viewer = this.viewer,\n          pages = this._pages;\n    viewer.textContent = \"\";\n\n    if (this._spreadMode === _ui_utils.SpreadMode.NONE) {\n      for (let i = 0, iMax = pages.length; i < iMax; ++i) {\n        viewer.appendChild(pages[i].div);\n      }\n    } else {\n      const parity = this._spreadMode - 1;\n      let spread = null;\n\n      for (let i = 0, iMax = pages.length; i < iMax; ++i) {\n        if (spread === null) {\n          spread = document.createElement(\"div\");\n          spread.className = \"spread\";\n          viewer.appendChild(spread);\n        } else if (i % 2 === parity) {\n          spread = spread.cloneNode(false);\n          viewer.appendChild(spread);\n        }\n\n        spread.appendChild(pages[i].div);\n      }\n    }\n\n    if (!pageNumber) {\n      return;\n    }\n\n    if (this._currentScaleValue && isNaN(this._currentScaleValue)) {\n      this._setScale(this._currentScaleValue, true);\n    }\n\n    this._setCurrentPageNumber(pageNumber, true);\n\n    this.update();\n  }\n\n  _getPageAdvance(currentPageNumber, previous = false) {\n    if (this.isInPresentationMode) {\n      return 1;\n    }\n\n    switch (this._scrollMode) {\n      case _ui_utils.ScrollMode.WRAPPED:\n        {\n          const {\n            views\n          } = this._getVisiblePages(),\n                pageLayout = new Map();\n\n          for (const {\n            id,\n            y,\n            percent,\n            widthPercent\n          } of views) {\n            if (percent === 0 || widthPercent < 100) {\n              continue;\n            }\n\n            let yArray = pageLayout.get(y);\n\n            if (!yArray) {\n              pageLayout.set(y, yArray || (yArray = []));\n            }\n\n            yArray.push(id);\n          }\n\n          for (const yArray of pageLayout.values()) {\n            const currentIndex = yArray.indexOf(currentPageNumber);\n\n            if (currentIndex === -1) {\n              continue;\n            }\n\n            const numPages = yArray.length;\n\n            if (numPages === 1) {\n              break;\n            }\n\n            if (previous) {\n              for (let i = currentIndex - 1, ii = 0; i >= ii; i--) {\n                const currentId = yArray[i],\n                      expectedId = yArray[i + 1] - 1;\n\n                if (currentId < expectedId) {\n                  return currentPageNumber - expectedId;\n                }\n              }\n            } else {\n              for (let i = currentIndex + 1, ii = numPages; i < ii; i++) {\n                const currentId = yArray[i],\n                      expectedId = yArray[i - 1] + 1;\n\n                if (currentId > expectedId) {\n                  return expectedId - currentPageNumber;\n                }\n              }\n            }\n\n            if (previous) {\n              const firstId = yArray[0];\n\n              if (firstId < currentPageNumber) {\n                return currentPageNumber - firstId + 1;\n              }\n            } else {\n              const lastId = yArray[numPages - 1];\n\n              if (lastId > currentPageNumber) {\n                return lastId - currentPageNumber + 1;\n              }\n            }\n\n            break;\n          }\n\n          break;\n        }\n\n      case _ui_utils.ScrollMode.HORIZONTAL:\n        {\n          break;\n        }\n\n      case _ui_utils.ScrollMode.VERTICAL:\n        {\n          if (this._spreadMode === _ui_utils.SpreadMode.NONE) {\n            break;\n          }\n\n          const parity = this._spreadMode - 1;\n\n          if (previous && currentPageNumber % 2 !== parity) {\n            break;\n          } else if (!previous && currentPageNumber % 2 === parity) {\n            break;\n          }\n\n          const {\n            views\n          } = this._getVisiblePages(),\n                expectedId = previous ? currentPageNumber - 1 : currentPageNumber + 1;\n\n          for (const {\n            id,\n            percent,\n            widthPercent\n          } of views) {\n            if (id !== expectedId) {\n              continue;\n            }\n\n            if (percent > 0 && widthPercent === 100) {\n              return 2;\n            }\n\n            break;\n          }\n\n          break;\n        }\n    }\n\n    return 1;\n  }\n\n  nextPage() {\n    const currentPageNumber = this._currentPageNumber,\n          pagesCount = this.pagesCount;\n\n    if (currentPageNumber >= pagesCount) {\n      return false;\n    }\n\n    const advance = this._getPageAdvance(currentPageNumber, false) || 1;\n    this.currentPageNumber = Math.min(currentPageNumber + advance, pagesCount);\n    return true;\n  }\n\n  previousPage() {\n    const currentPageNumber = this._currentPageNumber;\n\n    if (currentPageNumber <= 1) {\n      return false;\n    }\n\n    const advance = this._getPageAdvance(currentPageNumber, true) || 1;\n    this.currentPageNumber = Math.max(currentPageNumber - advance, 1);\n    return true;\n  }\n\n}\n\nexports.BaseViewer = BaseViewer;\n\n/***/ }),\n/* 29 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.DefaultAnnotationLayerFactory = exports.AnnotationLayerBuilder = void 0;\n\nvar _pdfjsLib = __webpack_require__(5);\n\nvar _l10n_utils = __webpack_require__(30);\n\nvar _pdf_link_service = __webpack_require__(19);\n\nclass AnnotationLayerBuilder {\n  constructor({\n    pageDiv,\n    pdfPage,\n    linkService,\n    downloadManager,\n    annotationStorage = null,\n    imageResourcesPath = \"\",\n    renderInteractiveForms = true,\n    l10n = _l10n_utils.NullL10n,\n    enableScripting = false,\n    hasJSActionsPromise = null,\n    mouseState = null\n  }) {\n    this.pageDiv = pageDiv;\n    this.pdfPage = pdfPage;\n    this.linkService = linkService;\n    this.downloadManager = downloadManager;\n    this.imageResourcesPath = imageResourcesPath;\n    this.renderInteractiveForms = renderInteractiveForms;\n    this.l10n = l10n;\n    this.annotationStorage = annotationStorage;\n    this.enableScripting = enableScripting;\n    this._hasJSActionsPromise = hasJSActionsPromise;\n    this._mouseState = mouseState;\n    this.div = null;\n    this._cancelled = false;\n  }\n\n  render(viewport, intent = \"display\") {\n    return Promise.all([this.pdfPage.getAnnotations({\n      intent\n    }), this._hasJSActionsPromise]).then(([annotations, hasJSActions = false]) => {\n      if (this._cancelled) {\n        return;\n      }\n\n      if (annotations.length === 0) {\n        return;\n      }\n\n      const parameters = {\n        viewport: viewport.clone({\n          dontFlip: true\n        }),\n        div: this.div,\n        annotations,\n        page: this.pdfPage,\n        imageResourcesPath: this.imageResourcesPath,\n        renderInteractiveForms: this.renderInteractiveForms,\n        linkService: this.linkService,\n        downloadManager: this.downloadManager,\n        annotationStorage: this.annotationStorage,\n        enableScripting: this.enableScripting,\n        hasJSActions,\n        mouseState: this._mouseState\n      };\n\n      if (this.div) {\n        _pdfjsLib.AnnotationLayer.update(parameters);\n      } else {\n        this.div = document.createElement(\"div\");\n        this.div.className = \"annotationLayer\";\n        this.pageDiv.appendChild(this.div);\n        parameters.div = this.div;\n\n        _pdfjsLib.AnnotationLayer.render(parameters);\n\n        this.l10n.translate(this.div);\n      }\n    });\n  }\n\n  cancel() {\n    this._cancelled = true;\n  }\n\n  hide() {\n    if (!this.div) {\n      return;\n    }\n\n    this.div.hidden = true;\n  }\n\n}\n\nexports.AnnotationLayerBuilder = AnnotationLayerBuilder;\n\nclass DefaultAnnotationLayerFactory {\n  createAnnotationLayerBuilder(pageDiv, pdfPage, annotationStorage = null, imageResourcesPath = \"\", renderInteractiveForms = true, l10n = _l10n_utils.NullL10n, enableScripting = false, hasJSActionsPromise = null, mouseState = null) {\n    return new AnnotationLayerBuilder({\n      pageDiv,\n      pdfPage,\n      imageResourcesPath,\n      renderInteractiveForms,\n      linkService: new _pdf_link_service.SimpleLinkService(),\n      l10n,\n      annotationStorage,\n      enableScripting,\n      hasJSActionsPromise,\n      mouseState\n    });\n  }\n\n}\n\nexports.DefaultAnnotationLayerFactory = DefaultAnnotationLayerFactory;\n\n/***/ }),\n/* 30 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.getL10nFallback = getL10nFallback;\nexports.NullL10n = void 0;\nconst DEFAULT_L10N_STRINGS = {\n  of_pages: \"of {{pagesCount}}\",\n  page_of_pages: \"({{pageNumber}} of {{pagesCount}})\",\n  document_properties_kb: \"{{size_kb}} KB ({{size_b}} bytes)\",\n  document_properties_mb: \"{{size_mb}} MB ({{size_b}} bytes)\",\n  document_properties_date_string: \"{{date}}, {{time}}\",\n  document_properties_page_size_unit_inches: \"in\",\n  document_properties_page_size_unit_millimeters: \"mm\",\n  document_properties_page_size_orientation_portrait: \"portrait\",\n  document_properties_page_size_orientation_landscape: \"landscape\",\n  document_properties_page_size_name_a3: \"A3\",\n  document_properties_page_size_name_a4: \"A4\",\n  document_properties_page_size_name_letter: \"Letter\",\n  document_properties_page_size_name_legal: \"Legal\",\n  document_properties_page_size_dimension_string: \"{{width}} × {{height}} {{unit}} ({{orientation}})\",\n  document_properties_page_size_dimension_name_string: \"{{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\",\n  document_properties_linearized_yes: \"Yes\",\n  document_properties_linearized_no: \"No\",\n  print_progress_percent: \"{{progress}}%\",\n  \"toggle_sidebar.title\": \"Toggle Sidebar\",\n  \"toggle_sidebar_notification2.title\": \"Toggle Sidebar (document contains outline/attachments/layers)\",\n  additional_layers: \"Additional Layers\",\n  page_landmark: \"Page {{page}}\",\n  thumb_page_title: \"Page {{page}}\",\n  thumb_page_canvas: \"Thumbnail of Page {{page}}\",\n  find_reached_top: \"Reached top of document, continued from bottom\",\n  find_reached_bottom: \"Reached end of document, continued from top\",\n  \"find_match_count[one]\": \"{{current}} of {{total}} match\",\n  \"find_match_count[other]\": \"{{current}} of {{total}} matches\",\n  \"find_match_count_limit[one]\": \"More than {{limit}} match\",\n  \"find_match_count_limit[other]\": \"More than {{limit}} matches\",\n  find_not_found: \"Phrase not found\",\n  error_version_info: \"PDF.js v{{version}} (build: {{build}})\",\n  error_message: \"Message: {{message}}\",\n  error_stack: \"Stack: {{stack}}\",\n  error_file: \"File: {{file}}\",\n  error_line: \"Line: {{line}}\",\n  rendering_error: \"An error occurred while rendering the page.\",\n  page_scale_width: \"Page Width\",\n  page_scale_fit: \"Page Fit\",\n  page_scale_auto: \"Automatic Zoom\",\n  page_scale_actual: \"Actual Size\",\n  page_scale_percent: \"{{scale}}%\",\n  loading: \"Loading…\",\n  loading_error: \"An error occurred while loading the PDF.\",\n  invalid_file_error: \"Invalid or corrupted PDF file.\",\n  missing_file_error: \"Missing PDF file.\",\n  unexpected_response_error: \"Unexpected server response.\",\n  printing_not_supported: \"Warning: Printing is not fully supported by this browser.\",\n  printing_not_ready: \"Warning: The PDF is not fully loaded for printing.\",\n  web_fonts_disabled: \"Web fonts are disabled: unable to use embedded PDF fonts.\"\n};\n\nfunction getL10nFallback(key, args) {\n  switch (key) {\n    case \"find_match_count\":\n      key = `find_match_count[${args.total === 1 ? \"one\" : \"other\"}]`;\n      break;\n\n    case \"find_match_count_limit\":\n      key = `find_match_count_limit[${args.limit === 1 ? \"one\" : \"other\"}]`;\n      break;\n  }\n\n  return DEFAULT_L10N_STRINGS[key] || \"\";\n}\n\nfunction formatL10nValue(text, args) {\n  if (!args) {\n    return text;\n  }\n\n  return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (all, name) => {\n    return name in args ? args[name] : \"{{\" + name + \"}}\";\n  });\n}\n\nconst NullL10n = {\n  async getLanguage() {\n    return \"en-us\";\n  },\n\n  async getDirection() {\n    return \"ltr\";\n  },\n\n  async get(key, args = null, fallback = getL10nFallback(key, args)) {\n    return formatL10nValue(fallback, args);\n  },\n\n  async translate(element) {}\n\n};\nexports.NullL10n = NullL10n;\n\n/***/ }),\n/* 31 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFPageView = void 0;\n\nvar _ui_utils = __webpack_require__(4);\n\nvar _pdfjsLib = __webpack_require__(5);\n\nvar _l10n_utils = __webpack_require__(30);\n\nvar _pdf_rendering_queue = __webpack_require__(8);\n\nvar _viewer_compatibility = __webpack_require__(2);\n\nconst MAX_CANVAS_PIXELS = _viewer_compatibility.viewerCompatibilityParams.maxCanvasPixels || 16777216;\n\nclass PDFPageView {\n  constructor(options) {\n    const container = options.container;\n    const defaultViewport = options.defaultViewport;\n    this.id = options.id;\n    this.renderingId = \"page\" + this.id;\n    this.pdfPage = null;\n    this.pageLabel = null;\n    this.rotation = 0;\n    this.scale = options.scale || _ui_utils.DEFAULT_SCALE;\n    this.viewport = defaultViewport;\n    this.pdfPageRotate = defaultViewport.rotation;\n    this._optionalContentConfigPromise = options.optionalContentConfigPromise || null;\n    this.hasRestrictedScaling = false;\n    this.textLayerMode = Number.isInteger(options.textLayerMode) ? options.textLayerMode : _ui_utils.TextLayerMode.ENABLE;\n    this.imageResourcesPath = options.imageResourcesPath || \"\";\n    this.renderInteractiveForms = options.renderInteractiveForms !== false;\n    this.useOnlyCssZoom = options.useOnlyCssZoom || false;\n    this.maxCanvasPixels = options.maxCanvasPixels || MAX_CANVAS_PIXELS;\n    this.eventBus = options.eventBus;\n    this.renderingQueue = options.renderingQueue;\n    this.textLayerFactory = options.textLayerFactory;\n    this.annotationLayerFactory = options.annotationLayerFactory;\n    this.xfaLayerFactory = options.xfaLayerFactory;\n    this.renderer = options.renderer || _ui_utils.RendererType.CANVAS;\n    this.enableWebGL = options.enableWebGL || false;\n    this.l10n = options.l10n || _l10n_utils.NullL10n;\n    this.enableScripting = options.enableScripting === true;\n    this.paintTask = null;\n    this.paintedViewportMap = new WeakMap();\n    this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;\n    this.resume = null;\n    this._renderError = null;\n    this.annotationLayer = null;\n    this.textLayer = null;\n    this.zoomLayer = null;\n    this.xfaLayer = null;\n    const div = document.createElement(\"div\");\n    div.className = \"page\";\n    div.style.width = Math.floor(this.viewport.width) + \"px\";\n    div.style.height = Math.floor(this.viewport.height) + \"px\";\n    div.setAttribute(\"data-page-number\", this.id);\n    div.setAttribute(\"role\", \"region\");\n    this.l10n.get(\"page_landmark\", {\n      page: this.id\n    }).then(msg => {\n      div.setAttribute(\"aria-label\", msg);\n    });\n    this.div = div;\n    container.appendChild(div);\n  }\n\n  setPdfPage(pdfPage) {\n    this.pdfPage = pdfPage;\n    this.pdfPageRotate = pdfPage.rotate;\n    const totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n    this.viewport = pdfPage.getViewport({\n      scale: this.scale * _ui_utils.CSS_UNITS,\n      rotation: totalRotation\n    });\n    this.reset();\n  }\n\n  destroy() {\n    this.reset();\n\n    if (this.pdfPage) {\n      this.pdfPage.cleanup();\n    }\n  }\n\n  async _renderAnnotationLayer() {\n    let error = null;\n\n    try {\n      await this.annotationLayer.render(this.viewport, \"display\");\n    } catch (ex) {\n      error = ex;\n    } finally {\n      this.eventBus.dispatch(\"annotationlayerrendered\", {\n        source: this,\n        pageNumber: this.id,\n        error\n      });\n    }\n  }\n\n  async _renderXfaLayer() {\n    let error = null;\n\n    try {\n      await this.xfaLayer.render(this.viewport, \"display\");\n    } catch (ex) {\n      error = ex;\n    } finally {\n      this.eventBus.dispatch(\"xfalayerrendered\", {\n        source: this,\n        pageNumber: this.id,\n        error\n      });\n    }\n  }\n\n  _resetZoomLayer(removeFromDOM = false) {\n    if (!this.zoomLayer) {\n      return;\n    }\n\n    const zoomLayerCanvas = this.zoomLayer.firstChild;\n    this.paintedViewportMap.delete(zoomLayerCanvas);\n    zoomLayerCanvas.width = 0;\n    zoomLayerCanvas.height = 0;\n\n    if (removeFromDOM) {\n      this.zoomLayer.remove();\n    }\n\n    this.zoomLayer = null;\n  }\n\n  reset(keepZoomLayer = false, keepAnnotations = false) {\n    this.cancelRendering(keepAnnotations);\n    this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;\n    const div = this.div;\n    div.style.width = Math.floor(this.viewport.width) + \"px\";\n    div.style.height = Math.floor(this.viewport.height) + \"px\";\n    const childNodes = div.childNodes;\n    const currentZoomLayerNode = keepZoomLayer && this.zoomLayer || null;\n    const currentAnnotationNode = keepAnnotations && this.annotationLayer?.div || null;\n    const currentXfaLayerNode = this.xfaLayer?.div || null;\n\n    for (let i = childNodes.length - 1; i >= 0; i--) {\n      const node = childNodes[i];\n\n      if (currentZoomLayerNode === node || currentAnnotationNode === node || currentXfaLayerNode === node) {\n        continue;\n      }\n\n      div.removeChild(node);\n    }\n\n    div.removeAttribute(\"data-loaded\");\n\n    if (currentAnnotationNode) {\n      this.annotationLayer.hide();\n    } else if (this.annotationLayer) {\n      this.annotationLayer.cancel();\n      this.annotationLayer = null;\n    }\n\n    if (!currentZoomLayerNode) {\n      if (this.canvas) {\n        this.paintedViewportMap.delete(this.canvas);\n        this.canvas.width = 0;\n        this.canvas.height = 0;\n        delete this.canvas;\n      }\n\n      this._resetZoomLayer();\n    }\n\n    if (this.svg) {\n      this.paintedViewportMap.delete(this.svg);\n      delete this.svg;\n    }\n\n    this.loadingIconDiv = document.createElement(\"div\");\n    this.loadingIconDiv.className = \"loadingIcon\";\n    this.loadingIconDiv.setAttribute(\"role\", \"img\");\n    this.l10n.get(\"loading\").then(msg => {\n      this.loadingIconDiv?.setAttribute(\"aria-label\", msg);\n    });\n    div.appendChild(this.loadingIconDiv);\n  }\n\n  update(scale, rotation, optionalContentConfigPromise = null) {\n    this.scale = scale || this.scale;\n\n    if (typeof rotation !== \"undefined\") {\n      this.rotation = rotation;\n    }\n\n    if (optionalContentConfigPromise instanceof Promise) {\n      this._optionalContentConfigPromise = optionalContentConfigPromise;\n    }\n\n    const totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n    this.viewport = this.viewport.clone({\n      scale: this.scale * _ui_utils.CSS_UNITS,\n      rotation: totalRotation\n    });\n\n    if (this.svg) {\n      this.cssTransform(this.svg, true);\n      this.eventBus.dispatch(\"pagerendered\", {\n        source: this,\n        pageNumber: this.id,\n        cssTransform: true,\n        timestamp: performance.now(),\n        error: this._renderError\n      });\n      return;\n    }\n\n    let isScalingRestricted = false;\n\n    if (this.canvas && this.maxCanvasPixels > 0) {\n      const outputScale = this.outputScale;\n\n      if ((Math.floor(this.viewport.width) * outputScale.sx | 0) * (Math.floor(this.viewport.height) * outputScale.sy | 0) > this.maxCanvasPixels) {\n        isScalingRestricted = true;\n      }\n    }\n\n    if (this.canvas) {\n      if (this.useOnlyCssZoom || this.hasRestrictedScaling && isScalingRestricted) {\n        this.cssTransform(this.canvas, true);\n        this.eventBus.dispatch(\"pagerendered\", {\n          source: this,\n          pageNumber: this.id,\n          cssTransform: true,\n          timestamp: performance.now(),\n          error: this._renderError\n        });\n        return;\n      }\n\n      if (!this.zoomLayer && !this.canvas.hidden) {\n        this.zoomLayer = this.canvas.parentNode;\n        this.zoomLayer.style.position = \"absolute\";\n      }\n    }\n\n    if (this.zoomLayer) {\n      this.cssTransform(this.zoomLayer.firstChild);\n    }\n\n    this.reset(true, true);\n  }\n\n  cancelRendering(keepAnnotations = false) {\n    if (this.paintTask) {\n      this.paintTask.cancel();\n      this.paintTask = null;\n    }\n\n    this.resume = null;\n\n    if (this.textLayer) {\n      this.textLayer.cancel();\n      this.textLayer = null;\n    }\n\n    if (!keepAnnotations && this.annotationLayer) {\n      this.annotationLayer.cancel();\n      this.annotationLayer = null;\n    }\n  }\n\n  cssTransform(target, redrawAnnotations = false) {\n    const width = this.viewport.width;\n    const height = this.viewport.height;\n    const div = this.div;\n    target.style.width = target.parentNode.style.width = div.style.width = Math.floor(width) + \"px\";\n    target.style.height = target.parentNode.style.height = div.style.height = Math.floor(height) + \"px\";\n    const relativeRotation = this.viewport.rotation - this.paintedViewportMap.get(target).rotation;\n    const absRotation = Math.abs(relativeRotation);\n    let scaleX = 1,\n        scaleY = 1;\n\n    if (absRotation === 90 || absRotation === 270) {\n      scaleX = height / width;\n      scaleY = width / height;\n    }\n\n    target.style.transform = `rotate(${relativeRotation}deg) scale(${scaleX}, ${scaleY})`;\n\n    if (this.textLayer) {\n      const textLayerViewport = this.textLayer.viewport;\n      const textRelativeRotation = this.viewport.rotation - textLayerViewport.rotation;\n      const textAbsRotation = Math.abs(textRelativeRotation);\n      let scale = width / textLayerViewport.width;\n\n      if (textAbsRotation === 90 || textAbsRotation === 270) {\n        scale = width / textLayerViewport.height;\n      }\n\n      const textLayerDiv = this.textLayer.textLayerDiv;\n      let transX, transY;\n\n      switch (textAbsRotation) {\n        case 0:\n          transX = transY = 0;\n          break;\n\n        case 90:\n          transX = 0;\n          transY = \"-\" + textLayerDiv.style.height;\n          break;\n\n        case 180:\n          transX = \"-\" + textLayerDiv.style.width;\n          transY = \"-\" + textLayerDiv.style.height;\n          break;\n\n        case 270:\n          transX = \"-\" + textLayerDiv.style.width;\n          transY = 0;\n          break;\n\n        default:\n          console.error(\"Bad rotation value.\");\n          break;\n      }\n\n      textLayerDiv.style.transform = `rotate(${textAbsRotation}deg) ` + `scale(${scale}) ` + `translate(${transX}, ${transY})`;\n      textLayerDiv.style.transformOrigin = \"0% 0%\";\n    }\n\n    if (redrawAnnotations && this.annotationLayer) {\n      this._renderAnnotationLayer();\n    }\n\n    if (this.xfaLayer) {\n      this._renderXfaLayer();\n    }\n  }\n\n  get width() {\n    return this.viewport.width;\n  }\n\n  get height() {\n    return this.viewport.height;\n  }\n\n  getPagePoint(x, y) {\n    return this.viewport.convertToPdfPoint(x, y);\n  }\n\n  draw() {\n    if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {\n      console.error(\"Must be in new state before drawing\");\n      this.reset();\n    }\n\n    const {\n      div,\n      pdfPage\n    } = this;\n\n    if (!pdfPage) {\n      this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\n\n      if (this.loadingIconDiv) {\n        div.removeChild(this.loadingIconDiv);\n        delete this.loadingIconDiv;\n      }\n\n      return Promise.reject(new Error(\"pdfPage is not loaded\"));\n    }\n\n    this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;\n    const canvasWrapper = document.createElement(\"div\");\n    canvasWrapper.style.width = div.style.width;\n    canvasWrapper.style.height = div.style.height;\n    canvasWrapper.classList.add(\"canvasWrapper\");\n\n    if (this.annotationLayer?.div) {\n      div.insertBefore(canvasWrapper, this.annotationLayer.div);\n    } else {\n      div.appendChild(canvasWrapper);\n    }\n\n    let textLayer = null;\n\n    if (this.textLayerMode !== _ui_utils.TextLayerMode.DISABLE && this.textLayerFactory) {\n      const textLayerDiv = document.createElement(\"div\");\n      textLayerDiv.className = \"textLayer\";\n      textLayerDiv.style.width = canvasWrapper.style.width;\n      textLayerDiv.style.height = canvasWrapper.style.height;\n\n      if (this.annotationLayer?.div) {\n        div.insertBefore(textLayerDiv, this.annotationLayer.div);\n      } else {\n        div.appendChild(textLayerDiv);\n      }\n\n      textLayer = this.textLayerFactory.createTextLayerBuilder(textLayerDiv, this.id - 1, this.viewport, this.textLayerMode === _ui_utils.TextLayerMode.ENABLE_ENHANCE, this.eventBus);\n    }\n\n    this.textLayer = textLayer;\n    let renderContinueCallback = null;\n\n    if (this.renderingQueue) {\n      renderContinueCallback = cont => {\n        if (!this.renderingQueue.isHighestPriority(this)) {\n          this.renderingState = _pdf_rendering_queue.RenderingStates.PAUSED;\n\n          this.resume = () => {\n            this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;\n            cont();\n          };\n\n          return;\n        }\n\n        cont();\n      };\n    }\n\n    const finishPaintTask = async (error = null) => {\n      if (paintTask === this.paintTask) {\n        this.paintTask = null;\n      }\n\n      if (error instanceof _pdfjsLib.RenderingCancelledException) {\n        this._renderError = null;\n        return;\n      }\n\n      this._renderError = error;\n      this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\n\n      if (this.loadingIconDiv) {\n        div.removeChild(this.loadingIconDiv);\n        delete this.loadingIconDiv;\n      }\n\n      this._resetZoomLayer(true);\n\n      this.eventBus.dispatch(\"pagerendered\", {\n        source: this,\n        pageNumber: this.id,\n        cssTransform: false,\n        timestamp: performance.now(),\n        error: this._renderError\n      });\n\n      if (error) {\n        throw error;\n      }\n    };\n\n    const paintTask = this.renderer === _ui_utils.RendererType.SVG ? this.paintOnSvg(canvasWrapper) : this.paintOnCanvas(canvasWrapper);\n    paintTask.onRenderContinue = renderContinueCallback;\n    this.paintTask = paintTask;\n    const resultPromise = paintTask.promise.then(function () {\n      return finishPaintTask(null).then(function () {\n        if (textLayer) {\n          const readableStream = pdfPage.streamTextContent({\n            normalizeWhitespace: true\n          });\n          textLayer.setTextContentStream(readableStream);\n          textLayer.render();\n        }\n      });\n    }, function (reason) {\n      return finishPaintTask(reason);\n    });\n\n    if (this.annotationLayerFactory) {\n      if (!this.annotationLayer) {\n        this.annotationLayer = this.annotationLayerFactory.createAnnotationLayerBuilder(div, pdfPage, null, this.imageResourcesPath, this.renderInteractiveForms, this.l10n, this.enableScripting, null, null);\n      }\n\n      this._renderAnnotationLayer();\n    }\n\n    if (this.xfaLayerFactory) {\n      if (!this.xfaLayer) {\n        this.xfaLayer = this.xfaLayerFactory.createXfaLayerBuilder(div, pdfPage);\n      }\n\n      this._renderXfaLayer();\n    }\n\n    div.setAttribute(\"data-loaded\", true);\n    this.eventBus.dispatch(\"pagerender\", {\n      source: this,\n      pageNumber: this.id\n    });\n    return resultPromise;\n  }\n\n  paintOnCanvas(canvasWrapper) {\n    const renderCapability = (0, _pdfjsLib.createPromiseCapability)();\n    const result = {\n      promise: renderCapability.promise,\n\n      onRenderContinue(cont) {\n        cont();\n      },\n\n      cancel() {\n        renderTask.cancel();\n      }\n\n    };\n    const viewport = this.viewport;\n    const canvas = document.createElement(\"canvas\");\n    canvas.hidden = true;\n    let isCanvasHidden = true;\n\n    const showCanvas = function () {\n      if (isCanvasHidden) {\n        canvas.hidden = false;\n        isCanvasHidden = false;\n      }\n    };\n\n    canvasWrapper.appendChild(canvas);\n    this.canvas = canvas;\n    canvas.mozOpaque = true;\n    const ctx = canvas.getContext(\"2d\", {\n      alpha: false\n    });\n    const outputScale = (0, _ui_utils.getOutputScale)(ctx);\n    this.outputScale = outputScale;\n\n    if (this.useOnlyCssZoom) {\n      const actualSizeViewport = viewport.clone({\n        scale: _ui_utils.CSS_UNITS\n      });\n      outputScale.sx *= actualSizeViewport.width / viewport.width;\n      outputScale.sy *= actualSizeViewport.height / viewport.height;\n      outputScale.scaled = true;\n    }\n\n    if (this.maxCanvasPixels > 0) {\n      const pixelsInViewport = viewport.width * viewport.height;\n      const maxScale = Math.sqrt(this.maxCanvasPixels / pixelsInViewport);\n\n      if (outputScale.sx > maxScale || outputScale.sy > maxScale) {\n        outputScale.sx = maxScale;\n        outputScale.sy = maxScale;\n        outputScale.scaled = true;\n        this.hasRestrictedScaling = true;\n      } else {\n        this.hasRestrictedScaling = false;\n      }\n    }\n\n    const sfx = (0, _ui_utils.approximateFraction)(outputScale.sx);\n    const sfy = (0, _ui_utils.approximateFraction)(outputScale.sy);\n    canvas.width = (0, _ui_utils.roundToDivide)(viewport.width * outputScale.sx, sfx[0]);\n    canvas.height = (0, _ui_utils.roundToDivide)(viewport.height * outputScale.sy, sfy[0]);\n    canvas.style.width = (0, _ui_utils.roundToDivide)(viewport.width, sfx[1]) + \"px\";\n    canvas.style.height = (0, _ui_utils.roundToDivide)(viewport.height, sfy[1]) + \"px\";\n    this.paintedViewportMap.set(canvas, viewport);\n    const transform = !outputScale.scaled ? null : [outputScale.sx, 0, 0, outputScale.sy, 0, 0];\n    const renderContext = {\n      canvasContext: ctx,\n      transform,\n      viewport: this.viewport,\n      enableWebGL: this.enableWebGL,\n      renderInteractiveForms: this.renderInteractiveForms,\n      optionalContentConfigPromise: this._optionalContentConfigPromise\n    };\n    const renderTask = this.pdfPage.render(renderContext);\n\n    renderTask.onContinue = function (cont) {\n      showCanvas();\n\n      if (result.onRenderContinue) {\n        result.onRenderContinue(cont);\n      } else {\n        cont();\n      }\n    };\n\n    renderTask.promise.then(function () {\n      showCanvas();\n      renderCapability.resolve(undefined);\n    }, function (error) {\n      showCanvas();\n      renderCapability.reject(error);\n    });\n    return result;\n  }\n\n  paintOnSvg(wrapper) {\n    let cancelled = false;\n\n    const ensureNotCancelled = () => {\n      if (cancelled) {\n        throw new _pdfjsLib.RenderingCancelledException(`Rendering cancelled, page ${this.id}`, \"svg\");\n      }\n    };\n\n    const pdfPage = this.pdfPage;\n    const actualSizeViewport = this.viewport.clone({\n      scale: _ui_utils.CSS_UNITS\n    });\n    const promise = pdfPage.getOperatorList().then(opList => {\n      ensureNotCancelled();\n      const svgGfx = new _pdfjsLib.SVGGraphics(pdfPage.commonObjs, pdfPage.objs, _viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL);\n      return svgGfx.getSVG(opList, actualSizeViewport).then(svg => {\n        ensureNotCancelled();\n        this.svg = svg;\n        this.paintedViewportMap.set(svg, actualSizeViewport);\n        svg.style.width = wrapper.style.width;\n        svg.style.height = wrapper.style.height;\n        this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\n        wrapper.appendChild(svg);\n      });\n    });\n    return {\n      promise,\n\n      onRenderContinue(cont) {\n        cont();\n      },\n\n      cancel() {\n        cancelled = true;\n      }\n\n    };\n  }\n\n  setPageLabel(label) {\n    this.pageLabel = typeof label === \"string\" ? label : null;\n\n    if (this.pageLabel !== null) {\n      this.div.setAttribute(\"data-page-label\", this.pageLabel);\n    } else {\n      this.div.removeAttribute(\"data-page-label\");\n    }\n  }\n\n}\n\nexports.PDFPageView = PDFPageView;\n\n/***/ }),\n/* 32 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.TextLayerBuilder = exports.DefaultTextLayerFactory = void 0;\n\nvar _pdfjsLib = __webpack_require__(5);\n\nconst EXPAND_DIVS_TIMEOUT = 300;\n\nclass TextLayerBuilder {\n  constructor({\n    textLayerDiv,\n    eventBus,\n    pageIndex,\n    viewport,\n    findController = null,\n    enhanceTextSelection = false\n  }) {\n    this.textLayerDiv = textLayerDiv;\n    this.eventBus = eventBus;\n    this.textContent = null;\n    this.textContentItemsStr = [];\n    this.textContentStream = null;\n    this.renderingDone = false;\n    this.pageIdx = pageIndex;\n    this.pageNumber = this.pageIdx + 1;\n    this.matches = [];\n    this.viewport = viewport;\n    this.textDivs = [];\n    this.findController = findController;\n    this.textLayerRenderTask = null;\n    this.enhanceTextSelection = enhanceTextSelection;\n    this._onUpdateTextLayerMatches = null;\n\n    this._bindMouse();\n  }\n\n  _finishRendering() {\n    this.renderingDone = true;\n\n    if (!this.enhanceTextSelection) {\n      const endOfContent = document.createElement(\"div\");\n      endOfContent.className = \"endOfContent\";\n      this.textLayerDiv.appendChild(endOfContent);\n    }\n\n    this.eventBus.dispatch(\"textlayerrendered\", {\n      source: this,\n      pageNumber: this.pageNumber,\n      numTextDivs: this.textDivs.length\n    });\n  }\n\n  render(timeout = 0) {\n    if (!(this.textContent || this.textContentStream) || this.renderingDone) {\n      return;\n    }\n\n    this.cancel();\n    this.textDivs = [];\n    const textLayerFrag = document.createDocumentFragment();\n    this.textLayerRenderTask = (0, _pdfjsLib.renderTextLayer)({\n      textContent: this.textContent,\n      textContentStream: this.textContentStream,\n      container: textLayerFrag,\n      viewport: this.viewport,\n      textDivs: this.textDivs,\n      textContentItemsStr: this.textContentItemsStr,\n      timeout,\n      enhanceTextSelection: this.enhanceTextSelection\n    });\n    this.textLayerRenderTask.promise.then(() => {\n      this.textLayerDiv.appendChild(textLayerFrag);\n\n      this._finishRendering();\n\n      this._updateMatches();\n    }, function (reason) {});\n\n    if (!this._onUpdateTextLayerMatches) {\n      this._onUpdateTextLayerMatches = evt => {\n        if (evt.pageIndex === this.pageIdx || evt.pageIndex === -1) {\n          this._updateMatches();\n        }\n      };\n\n      this.eventBus._on(\"updatetextlayermatches\", this._onUpdateTextLayerMatches);\n    }\n  }\n\n  cancel() {\n    if (this.textLayerRenderTask) {\n      this.textLayerRenderTask.cancel();\n      this.textLayerRenderTask = null;\n    }\n\n    if (this._onUpdateTextLayerMatches) {\n      this.eventBus._off(\"updatetextlayermatches\", this._onUpdateTextLayerMatches);\n\n      this._onUpdateTextLayerMatches = null;\n    }\n  }\n\n  setTextContentStream(readableStream) {\n    this.cancel();\n    this.textContentStream = readableStream;\n  }\n\n  setTextContent(textContent) {\n    this.cancel();\n    this.textContent = textContent;\n  }\n\n  _convertMatches(matches, matchesLength) {\n    if (!matches) {\n      return [];\n    }\n\n    const {\n      textContentItemsStr\n    } = this;\n    let i = 0,\n        iIndex = 0;\n    const end = textContentItemsStr.length - 1;\n    const result = [];\n\n    for (let m = 0, mm = matches.length; m < mm; m++) {\n      let matchIdx = matches[m];\n\n      while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) {\n        iIndex += textContentItemsStr[i].length;\n        i++;\n      }\n\n      if (i === textContentItemsStr.length) {\n        console.error(\"Could not find a matching mapping\");\n      }\n\n      const match = {\n        begin: {\n          divIdx: i,\n          offset: matchIdx - iIndex\n        }\n      };\n      matchIdx += matchesLength[m];\n\n      while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) {\n        iIndex += textContentItemsStr[i].length;\n        i++;\n      }\n\n      match.end = {\n        divIdx: i,\n        offset: matchIdx - iIndex\n      };\n      result.push(match);\n    }\n\n    return result;\n  }\n\n  _renderMatches(matches) {\n    if (matches.length === 0) {\n      return;\n    }\n\n    const {\n      findController,\n      pageIdx,\n      textContentItemsStr,\n      textDivs\n    } = this;\n    const isSelectedPage = pageIdx === findController.selected.pageIdx;\n    const selectedMatchIdx = findController.selected.matchIdx;\n    const highlightAll = findController.state.highlightAll;\n    let prevEnd = null;\n    const infinity = {\n      divIdx: -1,\n      offset: undefined\n    };\n\n    function beginText(begin, className) {\n      const divIdx = begin.divIdx;\n      textDivs[divIdx].textContent = \"\";\n      appendTextToDiv(divIdx, 0, begin.offset, className);\n    }\n\n    function appendTextToDiv(divIdx, fromOffset, toOffset, className) {\n      const div = textDivs[divIdx];\n      const content = textContentItemsStr[divIdx].substring(fromOffset, toOffset);\n      const node = document.createTextNode(content);\n\n      if (className) {\n        const span = document.createElement(\"span\");\n        span.className = className;\n        span.appendChild(node);\n        div.appendChild(span);\n        return;\n      }\n\n      div.appendChild(node);\n    }\n\n    let i0 = selectedMatchIdx,\n        i1 = i0 + 1;\n\n    if (highlightAll) {\n      i0 = 0;\n      i1 = matches.length;\n    } else if (!isSelectedPage) {\n      return;\n    }\n\n    for (let i = i0; i < i1; i++) {\n      const match = matches[i];\n      const begin = match.begin;\n      const end = match.end;\n      const isSelected = isSelectedPage && i === selectedMatchIdx;\n      const highlightSuffix = isSelected ? \" selected\" : \"\";\n\n      if (isSelected) {\n        findController.scrollMatchIntoView({\n          element: textDivs[begin.divIdx],\n          pageIndex: pageIdx,\n          matchIndex: selectedMatchIdx\n        });\n      }\n\n      if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {\n        if (prevEnd !== null) {\n          appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n        }\n\n        beginText(begin);\n      } else {\n        appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset);\n      }\n\n      if (begin.divIdx === end.divIdx) {\n        appendTextToDiv(begin.divIdx, begin.offset, end.offset, \"highlight\" + highlightSuffix);\n      } else {\n        appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, \"highlight begin\" + highlightSuffix);\n\n        for (let n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) {\n          textDivs[n0].className = \"highlight middle\" + highlightSuffix;\n        }\n\n        beginText(end, \"highlight end\" + highlightSuffix);\n      }\n\n      prevEnd = end;\n    }\n\n    if (prevEnd) {\n      appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n    }\n  }\n\n  _updateMatches() {\n    if (!this.renderingDone) {\n      return;\n    }\n\n    const {\n      findController,\n      matches,\n      pageIdx,\n      textContentItemsStr,\n      textDivs\n    } = this;\n    let clearedUntilDivIdx = -1;\n\n    for (let i = 0, ii = matches.length; i < ii; i++) {\n      const match = matches[i];\n      const begin = Math.max(clearedUntilDivIdx, match.begin.divIdx);\n\n      for (let n = begin, end = match.end.divIdx; n <= end; n++) {\n        const div = textDivs[n];\n        div.textContent = textContentItemsStr[n];\n        div.className = \"\";\n      }\n\n      clearedUntilDivIdx = match.end.divIdx + 1;\n    }\n\n    if (!findController?.highlightMatches) {\n      return;\n    }\n\n    const pageMatches = findController.pageMatches[pageIdx] || null;\n    const pageMatchesLength = findController.pageMatchesLength[pageIdx] || null;\n    this.matches = this._convertMatches(pageMatches, pageMatchesLength);\n\n    this._renderMatches(this.matches);\n  }\n\n  _bindMouse() {\n    const div = this.textLayerDiv;\n    let expandDivsTimer = null;\n    div.addEventListener(\"mousedown\", evt => {\n      if (this.enhanceTextSelection && this.textLayerRenderTask) {\n        this.textLayerRenderTask.expandTextDivs(true);\n\n        if (expandDivsTimer) {\n          clearTimeout(expandDivsTimer);\n          expandDivsTimer = null;\n        }\n\n        return;\n      }\n\n      const end = div.querySelector(\".endOfContent\");\n\n      if (!end) {\n        return;\n      }\n\n      let adjustTop = evt.target !== div;\n      adjustTop = adjustTop && window.getComputedStyle(end).getPropertyValue(\"-moz-user-select\") !== \"none\";\n\n      if (adjustTop) {\n        const divBounds = div.getBoundingClientRect();\n        const r = Math.max(0, (evt.pageY - divBounds.top) / divBounds.height);\n        end.style.top = (r * 100).toFixed(2) + \"%\";\n      }\n\n      end.classList.add(\"active\");\n    });\n    div.addEventListener(\"mouseup\", () => {\n      if (this.enhanceTextSelection && this.textLayerRenderTask) {\n        expandDivsTimer = setTimeout(() => {\n          if (this.textLayerRenderTask) {\n            this.textLayerRenderTask.expandTextDivs(false);\n          }\n\n          expandDivsTimer = null;\n        }, EXPAND_DIVS_TIMEOUT);\n        return;\n      }\n\n      const end = div.querySelector(\".endOfContent\");\n\n      if (!end) {\n        return;\n      }\n\n      end.style.top = \"\";\n      end.classList.remove(\"active\");\n    });\n  }\n\n}\n\nexports.TextLayerBuilder = TextLayerBuilder;\n\nclass DefaultTextLayerFactory {\n  createTextLayerBuilder(textLayerDiv, pageIndex, viewport, enhanceTextSelection = false, eventBus) {\n    return new TextLayerBuilder({\n      textLayerDiv,\n      pageIndex,\n      viewport,\n      enhanceTextSelection,\n      eventBus\n    });\n  }\n\n}\n\nexports.DefaultTextLayerFactory = DefaultTextLayerFactory;\n\n/***/ }),\n/* 33 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.XfaLayerBuilder = exports.DefaultXfaLayerFactory = void 0;\n\nvar _pdfjsLib = __webpack_require__(5);\n\nclass XfaLayerBuilder {\n  constructor({\n    pageDiv,\n    pdfPage\n  }) {\n    this.pageDiv = pageDiv;\n    this.pdfPage = pdfPage;\n    this.div = null;\n    this._cancelled = false;\n  }\n\n  render(viewport, intent = \"display\") {\n    return this.pdfPage.getXfa().then(xfa => {\n      if (this._cancelled) {\n        return;\n      }\n\n      const parameters = {\n        viewport: viewport.clone({\n          dontFlip: true\n        }),\n        div: this.div,\n        xfa,\n        page: this.pdfPage\n      };\n\n      if (this.div) {\n        _pdfjsLib.XfaLayer.update(parameters);\n      } else {\n        this.div = document.createElement(\"div\");\n        this.pageDiv.appendChild(this.div);\n        parameters.div = this.div;\n\n        _pdfjsLib.XfaLayer.render(parameters);\n      }\n    });\n  }\n\n  cancel() {\n    this._cancelled = true;\n  }\n\n  hide() {\n    if (!this.div) {\n      return;\n    }\n\n    this.div.hidden = true;\n  }\n\n}\n\nexports.XfaLayerBuilder = XfaLayerBuilder;\n\nclass DefaultXfaLayerFactory {\n  createXfaLayerBuilder(pageDiv, pdfPage) {\n    return new XfaLayerBuilder({\n      pageDiv,\n      pdfPage\n    });\n  }\n\n}\n\nexports.DefaultXfaLayerFactory = DefaultXfaLayerFactory;\n\n/***/ }),\n/* 34 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.SecondaryToolbar = void 0;\n\nvar _ui_utils = __webpack_require__(4);\n\nvar _pdf_cursor_tools = __webpack_require__(6);\n\nvar _pdf_single_page_viewer = __webpack_require__(35);\n\nclass SecondaryToolbar {\n  constructor(options, mainContainer, eventBus) {\n    this.toolbar = options.toolbar;\n    this.toggleButton = options.toggleButton;\n    this.toolbarButtonContainer = options.toolbarButtonContainer;\n    this.buttons = [{\n      element: options.presentationModeButton,\n      eventName: \"presentationmode\",\n      close: true\n    }, {\n      element: options.openFileButton,\n      eventName: \"openfile\",\n      close: true\n    }, {\n      element: options.printButton,\n      eventName: \"print\",\n      close: true\n    }, {\n      element: options.downloadButton,\n      eventName: \"download\",\n      close: true\n    }, {\n      element: options.viewBookmarkButton,\n      eventName: null,\n      close: true\n    }, {\n      element: options.firstPageButton,\n      eventName: \"firstpage\",\n      close: true\n    }, {\n      element: options.lastPageButton,\n      eventName: \"lastpage\",\n      close: true\n    }, {\n      element: options.pageRotateCwButton,\n      eventName: \"rotatecw\",\n      close: false\n    }, {\n      element: options.pageRotateCcwButton,\n      eventName: \"rotateccw\",\n      close: false\n    }, {\n      element: options.cursorSelectToolButton,\n      eventName: \"switchcursortool\",\n      eventDetails: {\n        tool: _pdf_cursor_tools.CursorTool.SELECT\n      },\n      close: true\n    }, {\n      element: options.cursorHandToolButton,\n      eventName: \"switchcursortool\",\n      eventDetails: {\n        tool: _pdf_cursor_tools.CursorTool.HAND\n      },\n      close: true\n    }, {\n      element: options.scrollVerticalButton,\n      eventName: \"switchscrollmode\",\n      eventDetails: {\n        mode: _ui_utils.ScrollMode.VERTICAL\n      },\n      close: true\n    }, {\n      element: options.scrollHorizontalButton,\n      eventName: \"switchscrollmode\",\n      eventDetails: {\n        mode: _ui_utils.ScrollMode.HORIZONTAL\n      },\n      close: true\n    }, {\n      element: options.scrollWrappedButton,\n      eventName: \"switchscrollmode\",\n      eventDetails: {\n        mode: _ui_utils.ScrollMode.WRAPPED\n      },\n      close: true\n    }, {\n      element: options.spreadNoneButton,\n      eventName: \"switchspreadmode\",\n      eventDetails: {\n        mode: _ui_utils.SpreadMode.NONE\n      },\n      close: true\n    }, {\n      element: options.spreadOddButton,\n      eventName: \"switchspreadmode\",\n      eventDetails: {\n        mode: _ui_utils.SpreadMode.ODD\n      },\n      close: true\n    }, {\n      element: options.spreadEvenButton,\n      eventName: \"switchspreadmode\",\n      eventDetails: {\n        mode: _ui_utils.SpreadMode.EVEN\n      },\n      close: true\n    }, {\n      element: options.documentPropertiesButton,\n      eventName: \"documentproperties\",\n      close: true\n    }];\n    this.items = {\n      firstPage: options.firstPageButton,\n      lastPage: options.lastPageButton,\n      pageRotateCw: options.pageRotateCwButton,\n      pageRotateCcw: options.pageRotateCcwButton\n    };\n    this.mainContainer = mainContainer;\n    this.eventBus = eventBus;\n    this.opened = false;\n    this.containerHeight = null;\n    this.previousContainerHeight = null;\n    this.reset();\n\n    this._bindClickListeners();\n\n    this._bindCursorToolsListener(options);\n\n    this._bindScrollModeListener(options);\n\n    this._bindSpreadModeListener(options);\n\n    this.eventBus._on(\"resize\", this._setMaxHeight.bind(this));\n\n    this.eventBus._on(\"baseviewerinit\", evt => {\n      if (evt.source instanceof _pdf_single_page_viewer.PDFSinglePageViewer) {\n        this.toolbarButtonContainer.classList.add(\"hiddenScrollModeButtons\", \"hiddenSpreadModeButtons\");\n      } else {\n        this.toolbarButtonContainer.classList.remove(\"hiddenScrollModeButtons\", \"hiddenSpreadModeButtons\");\n      }\n    });\n  }\n\n  get isOpen() {\n    return this.opened;\n  }\n\n  setPageNumber(pageNumber) {\n    this.pageNumber = pageNumber;\n\n    this._updateUIState();\n  }\n\n  setPagesCount(pagesCount) {\n    this.pagesCount = pagesCount;\n\n    this._updateUIState();\n  }\n\n  reset() {\n    this.pageNumber = 0;\n    this.pagesCount = 0;\n\n    this._updateUIState();\n\n    this.eventBus.dispatch(\"secondarytoolbarreset\", {\n      source: this\n    });\n  }\n\n  _updateUIState() {\n    this.items.firstPage.disabled = this.pageNumber <= 1;\n    this.items.lastPage.disabled = this.pageNumber >= this.pagesCount;\n    this.items.pageRotateCw.disabled = this.pagesCount === 0;\n    this.items.pageRotateCcw.disabled = this.pagesCount === 0;\n  }\n\n  _bindClickListeners() {\n    this.toggleButton.addEventListener(\"click\", this.toggle.bind(this));\n\n    for (const {\n      element,\n      eventName,\n      close,\n      eventDetails\n    } of this.buttons) {\n      element.addEventListener(\"click\", evt => {\n        if (eventName !== null) {\n          const details = {\n            source: this\n          };\n\n          for (const property in eventDetails) {\n            details[property] = eventDetails[property];\n          }\n\n          this.eventBus.dispatch(eventName, details);\n        }\n\n        if (close) {\n          this.close();\n        }\n      });\n    }\n  }\n\n  _bindCursorToolsListener(buttons) {\n    this.eventBus._on(\"cursortoolchanged\", function ({\n      tool\n    }) {\n      buttons.cursorSelectToolButton.classList.toggle(\"toggled\", tool === _pdf_cursor_tools.CursorTool.SELECT);\n      buttons.cursorHandToolButton.classList.toggle(\"toggled\", tool === _pdf_cursor_tools.CursorTool.HAND);\n    });\n  }\n\n  _bindScrollModeListener(buttons) {\n    function scrollModeChanged({\n      mode\n    }) {\n      buttons.scrollVerticalButton.classList.toggle(\"toggled\", mode === _ui_utils.ScrollMode.VERTICAL);\n      buttons.scrollHorizontalButton.classList.toggle(\"toggled\", mode === _ui_utils.ScrollMode.HORIZONTAL);\n      buttons.scrollWrappedButton.classList.toggle(\"toggled\", mode === _ui_utils.ScrollMode.WRAPPED);\n      const isScrollModeHorizontal = mode === _ui_utils.ScrollMode.HORIZONTAL;\n      buttons.spreadNoneButton.disabled = isScrollModeHorizontal;\n      buttons.spreadOddButton.disabled = isScrollModeHorizontal;\n      buttons.spreadEvenButton.disabled = isScrollModeHorizontal;\n    }\n\n    this.eventBus._on(\"scrollmodechanged\", scrollModeChanged);\n\n    this.eventBus._on(\"secondarytoolbarreset\", evt => {\n      if (evt.source === this) {\n        scrollModeChanged({\n          mode: _ui_utils.ScrollMode.VERTICAL\n        });\n      }\n    });\n  }\n\n  _bindSpreadModeListener(buttons) {\n    function spreadModeChanged({\n      mode\n    }) {\n      buttons.spreadNoneButton.classList.toggle(\"toggled\", mode === _ui_utils.SpreadMode.NONE);\n      buttons.spreadOddButton.classList.toggle(\"toggled\", mode === _ui_utils.SpreadMode.ODD);\n      buttons.spreadEvenButton.classList.toggle(\"toggled\", mode === _ui_utils.SpreadMode.EVEN);\n    }\n\n    this.eventBus._on(\"spreadmodechanged\", spreadModeChanged);\n\n    this.eventBus._on(\"secondarytoolbarreset\", evt => {\n      if (evt.source === this) {\n        spreadModeChanged({\n          mode: _ui_utils.SpreadMode.NONE\n        });\n      }\n    });\n  }\n\n  open() {\n    if (this.opened) {\n      return;\n    }\n\n    this.opened = true;\n\n    this._setMaxHeight();\n\n    this.toggleButton.classList.add(\"toggled\");\n    this.toggleButton.setAttribute(\"aria-expanded\", \"true\");\n    this.toolbar.classList.remove(\"hidden\");\n  }\n\n  close() {\n    if (!this.opened) {\n      return;\n    }\n\n    this.opened = false;\n    this.toolbar.classList.add(\"hidden\");\n    this.toggleButton.classList.remove(\"toggled\");\n    this.toggleButton.setAttribute(\"aria-expanded\", \"false\");\n  }\n\n  toggle() {\n    if (this.opened) {\n      this.close();\n    } else {\n      this.open();\n    }\n  }\n\n  _setMaxHeight() {\n    if (!this.opened) {\n      return;\n    }\n\n    this.containerHeight = this.mainContainer.clientHeight;\n\n    if (this.containerHeight === this.previousContainerHeight) {\n      return;\n    }\n\n    this.toolbarButtonContainer.style.maxHeight = `${this.containerHeight - _ui_utils.SCROLLBAR_PADDING}px`;\n    this.previousContainerHeight = this.containerHeight;\n  }\n\n}\n\nexports.SecondaryToolbar = SecondaryToolbar;\n\n/***/ }),\n/* 35 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFSinglePageViewer = void 0;\n\nvar _base_viewer = __webpack_require__(28);\n\nvar _pdfjsLib = __webpack_require__(5);\n\nclass PDFSinglePageViewer extends _base_viewer.BaseViewer {\n  constructor(options) {\n    super(options);\n\n    this.eventBus._on(\"pagesinit\", evt => {\n      this._ensurePageViewVisible();\n    });\n  }\n\n  get _viewerElement() {\n    return (0, _pdfjsLib.shadow)(this, \"_viewerElement\", this._shadowViewer);\n  }\n\n  get _pageWidthScaleFactor() {\n    return 1;\n  }\n\n  _resetView() {\n    super._resetView();\n\n    this._previousPageNumber = 1;\n    this._shadowViewer = document.createDocumentFragment();\n    this._updateScrollDown = null;\n  }\n\n  _ensurePageViewVisible() {\n    const pageView = this._pages[this._currentPageNumber - 1];\n    const previousPageView = this._pages[this._previousPageNumber - 1];\n    const viewerNodes = this.viewer.childNodes;\n\n    switch (viewerNodes.length) {\n      case 0:\n        this.viewer.appendChild(pageView.div);\n        break;\n\n      case 1:\n        if (viewerNodes[0] !== previousPageView.div) {\n          throw new Error(\"_ensurePageViewVisible: Unexpected previously visible page.\");\n        }\n\n        if (pageView === previousPageView) {\n          break;\n        }\n\n        this._shadowViewer.appendChild(previousPageView.div);\n\n        this.viewer.appendChild(pageView.div);\n        this.container.scrollTop = 0;\n        break;\n\n      default:\n        throw new Error(\"_ensurePageViewVisible: Only one page should be visible at a time.\");\n    }\n\n    this._previousPageNumber = this._currentPageNumber;\n  }\n\n  _scrollUpdate() {\n    if (this._updateScrollDown) {\n      this._updateScrollDown();\n    }\n\n    super._scrollUpdate();\n  }\n\n  _scrollIntoView({\n    pageDiv,\n    pageSpot = null,\n    pageNumber = null\n  }) {\n    if (pageNumber) {\n      this._setCurrentPageNumber(pageNumber);\n    }\n\n    const scrolledDown = this._currentPageNumber >= this._previousPageNumber;\n\n    this._ensurePageViewVisible();\n\n    this.update();\n\n    super._scrollIntoView({\n      pageDiv,\n      pageSpot,\n      pageNumber\n    });\n\n    this._updateScrollDown = () => {\n      this.scroll.down = scrolledDown;\n      this._updateScrollDown = null;\n    };\n  }\n\n  _getVisiblePages() {\n    return this._getCurrentVisiblePage();\n  }\n\n  _updateHelper(visiblePages) {}\n\n  get _isScrollModeHorizontal() {\n    return (0, _pdfjsLib.shadow)(this, \"_isScrollModeHorizontal\", false);\n  }\n\n  _updateScrollMode() {}\n\n  _updateSpreadMode() {}\n\n  _getPageAdvance() {\n    return 1;\n  }\n\n}\n\nexports.PDFSinglePageViewer = PDFSinglePageViewer;\n\n/***/ }),\n/* 36 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.Toolbar = void 0;\n\nvar _ui_utils = __webpack_require__(4);\n\nconst PAGE_NUMBER_LOADING_INDICATOR = \"visiblePageIsLoading\";\nconst SCALE_SELECT_CONTAINER_WIDTH = 140;\nconst SCALE_SELECT_WIDTH = 162;\n\nclass Toolbar {\n  constructor(options, eventBus, l10n) {\n    this.toolbar = options.container;\n    this.eventBus = eventBus;\n    this.l10n = l10n;\n    this.buttons = [{\n      element: options.previous,\n      eventName: \"previouspage\"\n    }, {\n      element: options.next,\n      eventName: \"nextpage\"\n    }, {\n      element: options.zoomIn,\n      eventName: \"zoomin\"\n    }, {\n      element: options.zoomOut,\n      eventName: \"zoomout\"\n    }, {\n      element: options.openFile,\n      eventName: \"openfile\"\n    }, {\n      element: options.print,\n      eventName: \"print\"\n    }, {\n      element: options.presentationModeButton,\n      eventName: \"presentationmode\"\n    }, {\n      element: options.download,\n      eventName: \"download\"\n    }, {\n      element: options.viewBookmark,\n      eventName: null\n    }];\n    this.items = {\n      numPages: options.numPages,\n      pageNumber: options.pageNumber,\n      scaleSelectContainer: options.scaleSelectContainer,\n      scaleSelect: options.scaleSelect,\n      customScaleOption: options.customScaleOption,\n      previous: options.previous,\n      next: options.next,\n      zoomIn: options.zoomIn,\n      zoomOut: options.zoomOut\n    };\n    this._wasLocalized = false;\n    this.reset();\n\n    this._bindListeners();\n  }\n\n  setPageNumber(pageNumber, pageLabel) {\n    this.pageNumber = pageNumber;\n    this.pageLabel = pageLabel;\n\n    this._updateUIState(false);\n  }\n\n  setPagesCount(pagesCount, hasPageLabels) {\n    this.pagesCount = pagesCount;\n    this.hasPageLabels = hasPageLabels;\n\n    this._updateUIState(true);\n  }\n\n  setPageScale(pageScaleValue, pageScale) {\n    this.pageScaleValue = (pageScaleValue || pageScale).toString();\n    this.pageScale = pageScale;\n\n    this._updateUIState(false);\n  }\n\n  reset() {\n    this.pageNumber = 0;\n    this.pageLabel = null;\n    this.hasPageLabels = false;\n    this.pagesCount = 0;\n    this.pageScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;\n    this.pageScale = _ui_utils.DEFAULT_SCALE;\n\n    this._updateUIState(true);\n\n    this.updateLoadingIndicatorState();\n  }\n\n  _bindListeners() {\n    const {\n      pageNumber,\n      scaleSelect\n    } = this.items;\n    const self = this;\n\n    for (const {\n      element,\n      eventName\n    } of this.buttons) {\n      element.addEventListener(\"click\", evt => {\n        if (eventName !== null) {\n          this.eventBus.dispatch(eventName, {\n            source: this\n          });\n        }\n      });\n    }\n\n    pageNumber.addEventListener(\"click\", function () {\n      this.select();\n    });\n    pageNumber.addEventListener(\"change\", function () {\n      self.eventBus.dispatch(\"pagenumberchanged\", {\n        source: self,\n        value: this.value\n      });\n    });\n    scaleSelect.addEventListener(\"change\", function () {\n      if (this.value === \"custom\") {\n        return;\n      }\n\n      self.eventBus.dispatch(\"scalechanged\", {\n        source: self,\n        value: this.value\n      });\n    });\n    scaleSelect.oncontextmenu = _ui_utils.noContextMenuHandler;\n\n    this.eventBus._on(\"localized\", () => {\n      this._wasLocalized = true;\n\n      this._adjustScaleWidth();\n\n      this._updateUIState(true);\n    });\n  }\n\n  _updateUIState(resetNumPages = false) {\n    if (!this._wasLocalized) {\n      return;\n    }\n\n    const {\n      pageNumber,\n      pagesCount,\n      pageScaleValue,\n      pageScale,\n      items\n    } = this;\n\n    if (resetNumPages) {\n      if (this.hasPageLabels) {\n        items.pageNumber.type = \"text\";\n      } else {\n        items.pageNumber.type = \"number\";\n        this.l10n.get(\"of_pages\", {\n          pagesCount\n        }).then(msg => {\n          items.numPages.textContent = msg;\n        });\n      }\n\n      items.pageNumber.max = pagesCount;\n    }\n\n    if (this.hasPageLabels) {\n      items.pageNumber.value = this.pageLabel;\n      this.l10n.get(\"page_of_pages\", {\n        pageNumber,\n        pagesCount\n      }).then(msg => {\n        items.numPages.textContent = msg;\n      });\n    } else {\n      items.pageNumber.value = pageNumber;\n    }\n\n    items.previous.disabled = pageNumber <= 1;\n    items.next.disabled = pageNumber >= pagesCount;\n    items.zoomOut.disabled = pageScale <= _ui_utils.MIN_SCALE;\n    items.zoomIn.disabled = pageScale >= _ui_utils.MAX_SCALE;\n    this.l10n.get(\"page_scale_percent\", {\n      scale: Math.round(pageScale * 10000) / 100\n    }).then(msg => {\n      let predefinedValueFound = false;\n\n      for (const option of items.scaleSelect.options) {\n        if (option.value !== pageScaleValue) {\n          option.selected = false;\n          continue;\n        }\n\n        option.selected = true;\n        predefinedValueFound = true;\n      }\n\n      if (!predefinedValueFound) {\n        items.customScaleOption.textContent = msg;\n        items.customScaleOption.selected = true;\n      }\n    });\n  }\n\n  updateLoadingIndicatorState(loading = false) {\n    const pageNumberInput = this.items.pageNumber;\n    pageNumberInput.classList.toggle(PAGE_NUMBER_LOADING_INDICATOR, loading);\n  }\n\n  async _adjustScaleWidth() {\n    const {\n      items,\n      l10n\n    } = this;\n    const predefinedValuesPromise = Promise.all([l10n.get(\"page_scale_auto\"), l10n.get(\"page_scale_actual\"), l10n.get(\"page_scale_fit\"), l10n.get(\"page_scale_width\")]);\n    let canvas = document.createElement(\"canvas\");\n    canvas.mozOpaque = true;\n    let ctx = canvas.getContext(\"2d\", {\n      alpha: false\n    });\n    await _ui_utils.animationStarted;\n    const {\n      fontSize,\n      fontFamily\n    } = getComputedStyle(items.scaleSelect);\n    ctx.font = `${fontSize} ${fontFamily}`;\n    let maxWidth = 0;\n\n    for (const predefinedValue of await predefinedValuesPromise) {\n      const {\n        width\n      } = ctx.measureText(predefinedValue);\n\n      if (width > maxWidth) {\n        maxWidth = width;\n      }\n    }\n\n    const overflow = SCALE_SELECT_WIDTH - SCALE_SELECT_CONTAINER_WIDTH;\n    maxWidth += 2 * overflow;\n\n    if (maxWidth > SCALE_SELECT_CONTAINER_WIDTH) {\n      items.scaleSelect.style.width = `${maxWidth + overflow}px`;\n      items.scaleSelectContainer.style.width = `${maxWidth}px`;\n    }\n\n    canvas.width = 0;\n    canvas.height = 0;\n    canvas = ctx = null;\n  }\n\n}\n\nexports.Toolbar = Toolbar;\n\n/***/ }),\n/* 37 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.ViewHistory = void 0;\nconst DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20;\n\nclass ViewHistory {\n  constructor(fingerprint, cacheSize = DEFAULT_VIEW_HISTORY_CACHE_SIZE) {\n    this.fingerprint = fingerprint;\n    this.cacheSize = cacheSize;\n    this._initializedPromise = this._readFromStorage().then(databaseStr => {\n      const database = JSON.parse(databaseStr || \"{}\");\n      let index = -1;\n\n      if (!Array.isArray(database.files)) {\n        database.files = [];\n      } else {\n        while (database.files.length >= this.cacheSize) {\n          database.files.shift();\n        }\n\n        for (let i = 0, ii = database.files.length; i < ii; i++) {\n          const branch = database.files[i];\n\n          if (branch.fingerprint === this.fingerprint) {\n            index = i;\n            break;\n          }\n        }\n      }\n\n      if (index === -1) {\n        index = database.files.push({\n          fingerprint: this.fingerprint\n        }) - 1;\n      }\n\n      this.file = database.files[index];\n      this.database = database;\n    });\n  }\n\n  async _writeToStorage() {\n    const databaseStr = JSON.stringify(this.database);\n    localStorage.setItem(\"pdfjs.history\", databaseStr);\n  }\n\n  async _readFromStorage() {\n    return localStorage.getItem(\"pdfjs.history\");\n  }\n\n  async set(name, val) {\n    await this._initializedPromise;\n    this.file[name] = val;\n    return this._writeToStorage();\n  }\n\n  async setMultiple(properties) {\n    await this._initializedPromise;\n\n    for (const name in properties) {\n      this.file[name] = properties[name];\n    }\n\n    return this._writeToStorage();\n  }\n\n  async get(name, defaultValue) {\n    await this._initializedPromise;\n    const val = this.file[name];\n    return val !== undefined ? val : defaultValue;\n  }\n\n  async getMultiple(properties) {\n    await this._initializedPromise;\n    const values = Object.create(null);\n\n    for (const name in properties) {\n      const val = this.file[name];\n      values[name] = val !== undefined ? val : properties[name];\n    }\n\n    return values;\n  }\n\n}\n\nexports.ViewHistory = ViewHistory;\n\n/***/ }),\n/* 38 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.GenericCom = void 0;\n\nvar _app = __webpack_require__(3);\n\nvar _preferences = __webpack_require__(39);\n\nvar _download_manager = __webpack_require__(40);\n\nvar _genericl10n = __webpack_require__(41);\n\nvar _generic_scripting = __webpack_require__(43);\n\n;\nconst GenericCom = {};\nexports.GenericCom = GenericCom;\n\nclass GenericPreferences extends _preferences.BasePreferences {\n  async _writeToStorage(prefObj) {\n    localStorage.setItem(\"pdfjs.preferences\", JSON.stringify(prefObj));\n  }\n\n  async _readFromStorage(prefObj) {\n    return JSON.parse(localStorage.getItem(\"pdfjs.preferences\"));\n  }\n\n}\n\nclass GenericExternalServices extends _app.DefaultExternalServices {\n  static createDownloadManager(options) {\n    return new _download_manager.DownloadManager();\n  }\n\n  static createPreferences() {\n    return new GenericPreferences();\n  }\n\n  static createL10n({\n    locale = \"en-US\"\n  }) {\n    return new _genericl10n.GenericL10n(locale);\n  }\n\n  static createScripting({\n    sandboxBundleSrc\n  }) {\n    return new _generic_scripting.GenericScripting(sandboxBundleSrc);\n  }\n\n}\n\n_app.PDFViewerApplication.externalServices = GenericExternalServices;\n\n/***/ }),\n/* 39 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.BasePreferences = void 0;\n\nvar _app_options = __webpack_require__(1);\n\nclass BasePreferences {\n  constructor() {\n    if (this.constructor === BasePreferences) {\n      throw new Error(\"Cannot initialize BasePreferences.\");\n    }\n\n    Object.defineProperty(this, \"defaults\", {\n      value: Object.freeze({\n        \"cursorToolOnLoad\": 0,\n        \"defaultZoomValue\": \"\",\n        \"disablePageLabels\": false,\n        \"enablePermissions\": false,\n        \"enablePrintAutoRotate\": true,\n        \"enableScripting\": true,\n        \"enableWebGL\": false,\n        \"externalLinkTarget\": 0,\n        \"historyUpdateUrl\": false,\n        \"ignoreDestinationZoom\": false,\n        \"pdfBugEnabled\": false,\n        \"renderer\": \"canvas\",\n        \"renderInteractiveForms\": true,\n        \"sidebarViewOnLoad\": -1,\n        \"scrollModeOnLoad\": -1,\n        \"spreadModeOnLoad\": -1,\n        \"textLayerMode\": 1,\n        \"useOnlyCssZoom\": false,\n        \"viewerCssTheme\": 0,\n        \"viewOnLoad\": 0,\n        \"disableAutoFetch\": false,\n        \"disableFontFace\": false,\n        \"disableRange\": false,\n        \"disableStream\": false\n      }),\n      writable: false,\n      enumerable: true,\n      configurable: false\n    });\n    this.prefs = Object.create(null);\n    this._initializedPromise = this._readFromStorage(this.defaults).then(prefs => {\n      for (const name in this.defaults) {\n        const prefValue = prefs?.[name];\n\n        if (typeof prefValue === typeof this.defaults[name]) {\n          this.prefs[name] = prefValue;\n        }\n      }\n    });\n  }\n\n  async _writeToStorage(prefObj) {\n    throw new Error(\"Not implemented: _writeToStorage\");\n  }\n\n  async _readFromStorage(prefObj) {\n    throw new Error(\"Not implemented: _readFromStorage\");\n  }\n\n  async reset() {\n    await this._initializedPromise;\n    this.prefs = Object.create(null);\n    return this._writeToStorage(this.defaults);\n  }\n\n  async set(name, value) {\n    await this._initializedPromise;\n    const defaultValue = this.defaults[name];\n\n    if (defaultValue === undefined) {\n      throw new Error(`Set preference: \"${name}\" is undefined.`);\n    } else if (value === undefined) {\n      throw new Error(\"Set preference: no value is specified.\");\n    }\n\n    const valueType = typeof value;\n    const defaultType = typeof defaultValue;\n\n    if (valueType !== defaultType) {\n      if (valueType === \"number\" && defaultType === \"string\") {\n        value = value.toString();\n      } else {\n        throw new Error(`Set preference: \"${value}\" is a ${valueType}, expected a ${defaultType}.`);\n      }\n    } else {\n      if (valueType === \"number\" && !Number.isInteger(value)) {\n        throw new Error(`Set preference: \"${value}\" must be an integer.`);\n      }\n    }\n\n    this.prefs[name] = value;\n    return this._writeToStorage(this.prefs);\n  }\n\n  async get(name) {\n    await this._initializedPromise;\n    const defaultValue = this.defaults[name],\n          prefValue = this.prefs[name];\n\n    if (defaultValue === undefined) {\n      throw new Error(`Get preference: \"${name}\" is undefined.`);\n    }\n\n    return prefValue !== undefined ? prefValue : defaultValue;\n  }\n\n  async getAll() {\n    await this._initializedPromise;\n    const obj = Object.create(null);\n\n    for (const name in this.defaults) {\n      const prefValue = this.prefs[name];\n      obj[name] = prefValue !== undefined ? prefValue : this.defaults[name];\n    }\n\n    return obj;\n  }\n\n}\n\nexports.BasePreferences = BasePreferences;\n\n/***/ }),\n/* 40 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.DownloadManager = void 0;\n\nvar _pdfjsLib = __webpack_require__(5);\n\nvar _viewer_compatibility = __webpack_require__(2);\n\n;\n\nfunction download(blobUrl, filename) {\n  const a = document.createElement(\"a\");\n\n  if (!a.click) {\n    throw new Error('DownloadManager: \"a.click()\" is not supported.');\n  }\n\n  a.href = blobUrl;\n  a.target = \"_parent\";\n\n  if (\"download\" in a) {\n    a.download = filename;\n  }\n\n  (document.body || document.documentElement).appendChild(a);\n  a.click();\n  a.remove();\n}\n\nclass DownloadManager {\n  constructor() {\n    this._openBlobUrls = new WeakMap();\n  }\n\n  downloadUrl(url, filename) {\n    if (!(0, _pdfjsLib.createValidAbsoluteUrl)(url, \"http://example.com\")) {\n      return;\n    }\n\n    download(url + \"#pdfjs.action=download\", filename);\n  }\n\n  downloadData(data, filename, contentType) {\n    const blobUrl = (0, _pdfjsLib.createObjectURL)(data, contentType, _viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL);\n    download(blobUrl, filename);\n  }\n\n  openOrDownloadData(element, data, filename) {\n    const isPdfData = (0, _pdfjsLib.isPdfFile)(filename);\n    const contentType = isPdfData ? \"application/pdf\" : \"\";\n\n    if (isPdfData && !_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) {\n      let blobUrl = this._openBlobUrls.get(element);\n\n      if (!blobUrl) {\n        blobUrl = URL.createObjectURL(new Blob([data], {\n          type: contentType\n        }));\n\n        this._openBlobUrls.set(element, blobUrl);\n      }\n\n      let viewerUrl;\n      viewerUrl = \"?file=\" + encodeURIComponent(blobUrl + \"#\" + filename);\n\n      try {\n        window.open(viewerUrl);\n        return true;\n      } catch (ex) {\n        console.error(`openOrDownloadData: ${ex}`);\n        URL.revokeObjectURL(blobUrl);\n\n        this._openBlobUrls.delete(element);\n      }\n    }\n\n    this.downloadData(data, filename, contentType);\n    return false;\n  }\n\n  download(blob, url, filename, sourceEventType = \"download\") {\n    if (_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) {\n      this.downloadUrl(url, filename);\n      return;\n    }\n\n    const blobUrl = URL.createObjectURL(blob);\n    download(blobUrl, filename);\n  }\n\n}\n\nexports.DownloadManager = DownloadManager;\n\n/***/ }),\n/* 41 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.GenericL10n = void 0;\n\n__webpack_require__(42);\n\nvar _l10n_utils = __webpack_require__(30);\n\nconst webL10n = document.webL10n;\n\nclass GenericL10n {\n  constructor(lang) {\n    this._lang = lang;\n    this._ready = new Promise((resolve, reject) => {\n      webL10n.setLanguage(lang, () => {\n        resolve(webL10n);\n      });\n    });\n  }\n\n  async getLanguage() {\n    const l10n = await this._ready;\n    return l10n.getLanguage();\n  }\n\n  async getDirection() {\n    const l10n = await this._ready;\n    return l10n.getDirection();\n  }\n\n  async get(key, args = null, fallback = (0, _l10n_utils.getL10nFallback)(key, args)) {\n    const l10n = await this._ready;\n    return l10n.get(key, args, fallback);\n  }\n\n  async translate(element) {\n    const l10n = await this._ready;\n    return l10n.translate(element);\n  }\n\n}\n\nexports.GenericL10n = GenericL10n;\n\n/***/ }),\n/* 42 */\n/***/ (() => {\n\n\n\ndocument.webL10n = function (window, document, undefined) {\n  var gL10nData = {};\n  var gTextData = '';\n  var gTextProp = 'textContent';\n  var gLanguage = '';\n  var gMacros = {};\n  var gReadyState = 'loading';\n  var gAsyncResourceLoading = true;\n\n  function getL10nResourceLinks() {\n    return document.querySelectorAll('link[type=\"application/l10n\"]');\n  }\n\n  function getL10nDictionary() {\n    var script = document.querySelector('script[type=\"application/l10n\"]');\n    return script ? JSON.parse(script.innerHTML) : null;\n  }\n\n  function getTranslatableChildren(element) {\n    return element ? element.querySelectorAll('*[data-l10n-id]') : [];\n  }\n\n  function getL10nAttributes(element) {\n    if (!element) return {};\n    var l10nId = element.getAttribute('data-l10n-id');\n    var l10nArgs = element.getAttribute('data-l10n-args');\n    var args = {};\n\n    if (l10nArgs) {\n      try {\n        args = JSON.parse(l10nArgs);\n      } catch (e) {\n        console.warn('could not parse arguments for #' + l10nId);\n      }\n    }\n\n    return {\n      id: l10nId,\n      args: args\n    };\n  }\n\n  function xhrLoadText(url, onSuccess, onFailure) {\n    onSuccess = onSuccess || function _onSuccess(data) {};\n\n    onFailure = onFailure || function _onFailure() {};\n\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, gAsyncResourceLoading);\n\n    if (xhr.overrideMimeType) {\n      xhr.overrideMimeType('text/plain; charset=utf-8');\n    }\n\n    xhr.onreadystatechange = function () {\n      if (xhr.readyState == 4) {\n        if (xhr.status == 200 || xhr.status === 0) {\n          onSuccess(xhr.responseText);\n        } else {\n          onFailure();\n        }\n      }\n    };\n\n    xhr.onerror = onFailure;\n    xhr.ontimeout = onFailure;\n\n    try {\n      xhr.send(null);\n    } catch (e) {\n      onFailure();\n    }\n  }\n\n  function parseResource(href, lang, successCallback, failureCallback) {\n    var baseURL = href.replace(/[^\\/]*$/, '') || './';\n\n    function evalString(text) {\n      if (text.lastIndexOf('\\\\') < 0) return text;\n      return text.replace(/\\\\\\\\/g, '\\\\').replace(/\\\\n/g, '\\n').replace(/\\\\r/g, '\\r').replace(/\\\\t/g, '\\t').replace(/\\\\b/g, '\\b').replace(/\\\\f/g, '\\f').replace(/\\\\{/g, '{').replace(/\\\\}/g, '}').replace(/\\\\\"/g, '\"').replace(/\\\\'/g, \"'\");\n    }\n\n    function parseProperties(text, parsedPropertiesCallback) {\n      var dictionary = {};\n      var reBlank = /^\\s*|\\s*$/;\n      var reComment = /^\\s*#|^\\s*$/;\n      var reSection = /^\\s*\\[(.*)\\]\\s*$/;\n      var reImport = /^\\s*@import\\s+url\\((.*)\\)\\s*$/i;\n      var reSplit = /^([^=\\s]*)\\s*=\\s*(.+)$/;\n\n      function parseRawLines(rawText, extendedSyntax, parsedRawLinesCallback) {\n        var entries = rawText.replace(reBlank, '').split(/[\\r\\n]+/);\n        var currentLang = '*';\n        var genericLang = lang.split('-', 1)[0];\n        var skipLang = false;\n        var match = '';\n\n        function nextEntry() {\n          while (true) {\n            if (!entries.length) {\n              parsedRawLinesCallback();\n              return;\n            }\n\n            var line = entries.shift();\n            if (reComment.test(line)) continue;\n\n            if (extendedSyntax) {\n              match = reSection.exec(line);\n\n              if (match) {\n                currentLang = match[1].toLowerCase();\n                skipLang = currentLang !== '*' && currentLang !== lang && currentLang !== genericLang;\n                continue;\n              } else if (skipLang) {\n                continue;\n              }\n\n              match = reImport.exec(line);\n\n              if (match) {\n                loadImport(baseURL + match[1], nextEntry);\n                return;\n              }\n            }\n\n            var tmp = line.match(reSplit);\n\n            if (tmp && tmp.length == 3) {\n              dictionary[tmp[1]] = evalString(tmp[2]);\n            }\n          }\n        }\n\n        nextEntry();\n      }\n\n      function loadImport(url, callback) {\n        xhrLoadText(url, function (content) {\n          parseRawLines(content, false, callback);\n        }, function () {\n          console.warn(url + ' not found.');\n          callback();\n        });\n      }\n\n      parseRawLines(text, true, function () {\n        parsedPropertiesCallback(dictionary);\n      });\n    }\n\n    xhrLoadText(href, function (response) {\n      gTextData += response;\n      parseProperties(response, function (data) {\n        for (var key in data) {\n          var id,\n              prop,\n              index = key.lastIndexOf('.');\n\n          if (index > 0) {\n            id = key.substring(0, index);\n            prop = key.substring(index + 1);\n          } else {\n            id = key;\n            prop = gTextProp;\n          }\n\n          if (!gL10nData[id]) {\n            gL10nData[id] = {};\n          }\n\n          gL10nData[id][prop] = data[key];\n        }\n\n        if (successCallback) {\n          successCallback();\n        }\n      });\n    }, failureCallback);\n  }\n\n  function loadLocale(lang, callback) {\n    if (lang) {\n      lang = lang.toLowerCase();\n    }\n\n    callback = callback || function _callback() {};\n\n    clear();\n    gLanguage = lang;\n    var langLinks = getL10nResourceLinks();\n    var langCount = langLinks.length;\n\n    if (langCount === 0) {\n      var dict = getL10nDictionary();\n\n      if (dict && dict.locales && dict.default_locale) {\n        console.log('using the embedded JSON directory, early way out');\n        gL10nData = dict.locales[lang];\n\n        if (!gL10nData) {\n          var defaultLocale = dict.default_locale.toLowerCase();\n\n          for (var anyCaseLang in dict.locales) {\n            anyCaseLang = anyCaseLang.toLowerCase();\n\n            if (anyCaseLang === lang) {\n              gL10nData = dict.locales[lang];\n              break;\n            } else if (anyCaseLang === defaultLocale) {\n              gL10nData = dict.locales[defaultLocale];\n            }\n          }\n        }\n\n        callback();\n      } else {\n        console.log('no resource to load, early way out');\n      }\n\n      gReadyState = 'complete';\n      return;\n    }\n\n    var onResourceLoaded = null;\n    var gResourceCount = 0;\n\n    onResourceLoaded = function () {\n      gResourceCount++;\n\n      if (gResourceCount >= langCount) {\n        callback();\n        gReadyState = 'complete';\n      }\n    };\n\n    function L10nResourceLink(link) {\n      var href = link.href;\n\n      this.load = function (lang, callback) {\n        parseResource(href, lang, callback, function () {\n          console.warn(href + ' not found.');\n          console.warn('\"' + lang + '\" resource not found');\n          gLanguage = '';\n          callback();\n        });\n      };\n    }\n\n    for (var i = 0; i < langCount; i++) {\n      var resource = new L10nResourceLink(langLinks[i]);\n      resource.load(lang, onResourceLoaded);\n    }\n  }\n\n  function clear() {\n    gL10nData = {};\n    gTextData = '';\n    gLanguage = '';\n  }\n\n  function getPluralRules(lang) {\n    var locales2rules = {\n      'af': 3,\n      'ak': 4,\n      'am': 4,\n      'ar': 1,\n      'asa': 3,\n      'az': 0,\n      'be': 11,\n      'bem': 3,\n      'bez': 3,\n      'bg': 3,\n      'bh': 4,\n      'bm': 0,\n      'bn': 3,\n      'bo': 0,\n      'br': 20,\n      'brx': 3,\n      'bs': 11,\n      'ca': 3,\n      'cgg': 3,\n      'chr': 3,\n      'cs': 12,\n      'cy': 17,\n      'da': 3,\n      'de': 3,\n      'dv': 3,\n      'dz': 0,\n      'ee': 3,\n      'el': 3,\n      'en': 3,\n      'eo': 3,\n      'es': 3,\n      'et': 3,\n      'eu': 3,\n      'fa': 0,\n      'ff': 5,\n      'fi': 3,\n      'fil': 4,\n      'fo': 3,\n      'fr': 5,\n      'fur': 3,\n      'fy': 3,\n      'ga': 8,\n      'gd': 24,\n      'gl': 3,\n      'gsw': 3,\n      'gu': 3,\n      'guw': 4,\n      'gv': 23,\n      'ha': 3,\n      'haw': 3,\n      'he': 2,\n      'hi': 4,\n      'hr': 11,\n      'hu': 0,\n      'id': 0,\n      'ig': 0,\n      'ii': 0,\n      'is': 3,\n      'it': 3,\n      'iu': 7,\n      'ja': 0,\n      'jmc': 3,\n      'jv': 0,\n      'ka': 0,\n      'kab': 5,\n      'kaj': 3,\n      'kcg': 3,\n      'kde': 0,\n      'kea': 0,\n      'kk': 3,\n      'kl': 3,\n      'km': 0,\n      'kn': 0,\n      'ko': 0,\n      'ksb': 3,\n      'ksh': 21,\n      'ku': 3,\n      'kw': 7,\n      'lag': 18,\n      'lb': 3,\n      'lg': 3,\n      'ln': 4,\n      'lo': 0,\n      'lt': 10,\n      'lv': 6,\n      'mas': 3,\n      'mg': 4,\n      'mk': 16,\n      'ml': 3,\n      'mn': 3,\n      'mo': 9,\n      'mr': 3,\n      'ms': 0,\n      'mt': 15,\n      'my': 0,\n      'nah': 3,\n      'naq': 7,\n      'nb': 3,\n      'nd': 3,\n      'ne': 3,\n      'nl': 3,\n      'nn': 3,\n      'no': 3,\n      'nr': 3,\n      'nso': 4,\n      'ny': 3,\n      'nyn': 3,\n      'om': 3,\n      'or': 3,\n      'pa': 3,\n      'pap': 3,\n      'pl': 13,\n      'ps': 3,\n      'pt': 3,\n      'rm': 3,\n      'ro': 9,\n      'rof': 3,\n      'ru': 11,\n      'rwk': 3,\n      'sah': 0,\n      'saq': 3,\n      'se': 7,\n      'seh': 3,\n      'ses': 0,\n      'sg': 0,\n      'sh': 11,\n      'shi': 19,\n      'sk': 12,\n      'sl': 14,\n      'sma': 7,\n      'smi': 7,\n      'smj': 7,\n      'smn': 7,\n      'sms': 7,\n      'sn': 3,\n      'so': 3,\n      'sq': 3,\n      'sr': 11,\n      'ss': 3,\n      'ssy': 3,\n      'st': 3,\n      'sv': 3,\n      'sw': 3,\n      'syr': 3,\n      'ta': 3,\n      'te': 3,\n      'teo': 3,\n      'th': 0,\n      'ti': 4,\n      'tig': 3,\n      'tk': 3,\n      'tl': 4,\n      'tn': 3,\n      'to': 0,\n      'tr': 0,\n      'ts': 3,\n      'tzm': 22,\n      'uk': 11,\n      'ur': 3,\n      've': 3,\n      'vi': 0,\n      'vun': 3,\n      'wa': 4,\n      'wae': 3,\n      'wo': 0,\n      'xh': 3,\n      'xog': 3,\n      'yo': 0,\n      'zh': 0,\n      'zu': 3\n    };\n\n    function isIn(n, list) {\n      return list.indexOf(n) !== -1;\n    }\n\n    function isBetween(n, start, end) {\n      return start <= n && n <= end;\n    }\n\n    var pluralRules = {\n      '0': function (n) {\n        return 'other';\n      },\n      '1': function (n) {\n        if (isBetween(n % 100, 3, 10)) return 'few';\n        if (n === 0) return 'zero';\n        if (isBetween(n % 100, 11, 99)) return 'many';\n        if (n == 2) return 'two';\n        if (n == 1) return 'one';\n        return 'other';\n      },\n      '2': function (n) {\n        if (n !== 0 && n % 10 === 0) return 'many';\n        if (n == 2) return 'two';\n        if (n == 1) return 'one';\n        return 'other';\n      },\n      '3': function (n) {\n        if (n == 1) return 'one';\n        return 'other';\n      },\n      '4': function (n) {\n        if (isBetween(n, 0, 1)) return 'one';\n        return 'other';\n      },\n      '5': function (n) {\n        if (isBetween(n, 0, 2) && n != 2) return 'one';\n        return 'other';\n      },\n      '6': function (n) {\n        if (n === 0) return 'zero';\n        if (n % 10 == 1 && n % 100 != 11) return 'one';\n        return 'other';\n      },\n      '7': function (n) {\n        if (n == 2) return 'two';\n        if (n == 1) return 'one';\n        return 'other';\n      },\n      '8': function (n) {\n        if (isBetween(n, 3, 6)) return 'few';\n        if (isBetween(n, 7, 10)) return 'many';\n        if (n == 2) return 'two';\n        if (n == 1) return 'one';\n        return 'other';\n      },\n      '9': function (n) {\n        if (n === 0 || n != 1 && isBetween(n % 100, 1, 19)) return 'few';\n        if (n == 1) return 'one';\n        return 'other';\n      },\n      '10': function (n) {\n        if (isBetween(n % 10, 2, 9) && !isBetween(n % 100, 11, 19)) return 'few';\n        if (n % 10 == 1 && !isBetween(n % 100, 11, 19)) return 'one';\n        return 'other';\n      },\n      '11': function (n) {\n        if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) return 'few';\n        if (n % 10 === 0 || isBetween(n % 10, 5, 9) || isBetween(n % 100, 11, 14)) return 'many';\n        if (n % 10 == 1 && n % 100 != 11) return 'one';\n        return 'other';\n      },\n      '12': function (n) {\n        if (isBetween(n, 2, 4)) return 'few';\n        if (n == 1) return 'one';\n        return 'other';\n      },\n      '13': function (n) {\n        if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) return 'few';\n        if (n != 1 && isBetween(n % 10, 0, 1) || isBetween(n % 10, 5, 9) || isBetween(n % 100, 12, 14)) return 'many';\n        if (n == 1) return 'one';\n        return 'other';\n      },\n      '14': function (n) {\n        if (isBetween(n % 100, 3, 4)) return 'few';\n        if (n % 100 == 2) return 'two';\n        if (n % 100 == 1) return 'one';\n        return 'other';\n      },\n      '15': function (n) {\n        if (n === 0 || isBetween(n % 100, 2, 10)) return 'few';\n        if (isBetween(n % 100, 11, 19)) return 'many';\n        if (n == 1) return 'one';\n        return 'other';\n      },\n      '16': function (n) {\n        if (n % 10 == 1 && n != 11) return 'one';\n        return 'other';\n      },\n      '17': function (n) {\n        if (n == 3) return 'few';\n        if (n === 0) return 'zero';\n        if (n == 6) return 'many';\n        if (n == 2) return 'two';\n        if (n == 1) return 'one';\n        return 'other';\n      },\n      '18': function (n) {\n        if (n === 0) return 'zero';\n        if (isBetween(n, 0, 2) && n !== 0 && n != 2) return 'one';\n        return 'other';\n      },\n      '19': function (n) {\n        if (isBetween(n, 2, 10)) return 'few';\n        if (isBetween(n, 0, 1)) return 'one';\n        return 'other';\n      },\n      '20': function (n) {\n        if ((isBetween(n % 10, 3, 4) || n % 10 == 9) && !(isBetween(n % 100, 10, 19) || isBetween(n % 100, 70, 79) || isBetween(n % 100, 90, 99))) return 'few';\n        if (n % 1000000 === 0 && n !== 0) return 'many';\n        if (n % 10 == 2 && !isIn(n % 100, [12, 72, 92])) return 'two';\n        if (n % 10 == 1 && !isIn(n % 100, [11, 71, 91])) return 'one';\n        return 'other';\n      },\n      '21': function (n) {\n        if (n === 0) return 'zero';\n        if (n == 1) return 'one';\n        return 'other';\n      },\n      '22': function (n) {\n        if (isBetween(n, 0, 1) || isBetween(n, 11, 99)) return 'one';\n        return 'other';\n      },\n      '23': function (n) {\n        if (isBetween(n % 10, 1, 2) || n % 20 === 0) return 'one';\n        return 'other';\n      },\n      '24': function (n) {\n        if (isBetween(n, 3, 10) || isBetween(n, 13, 19)) return 'few';\n        if (isIn(n, [2, 12])) return 'two';\n        if (isIn(n, [1, 11])) return 'one';\n        return 'other';\n      }\n    };\n    var index = locales2rules[lang.replace(/-.*$/, '')];\n\n    if (!(index in pluralRules)) {\n      console.warn('plural form unknown for [' + lang + ']');\n      return function () {\n        return 'other';\n      };\n    }\n\n    return pluralRules[index];\n  }\n\n  gMacros.plural = function (str, param, key, prop) {\n    var n = parseFloat(param);\n    if (isNaN(n)) return str;\n    if (prop != gTextProp) return str;\n\n    if (!gMacros._pluralRules) {\n      gMacros._pluralRules = getPluralRules(gLanguage);\n    }\n\n    var index = '[' + gMacros._pluralRules(n) + ']';\n\n    if (n === 0 && key + '[zero]' in gL10nData) {\n      str = gL10nData[key + '[zero]'][prop];\n    } else if (n == 1 && key + '[one]' in gL10nData) {\n      str = gL10nData[key + '[one]'][prop];\n    } else if (n == 2 && key + '[two]' in gL10nData) {\n      str = gL10nData[key + '[two]'][prop];\n    } else if (key + index in gL10nData) {\n      str = gL10nData[key + index][prop];\n    } else if (key + '[other]' in gL10nData) {\n      str = gL10nData[key + '[other]'][prop];\n    }\n\n    return str;\n  };\n\n  function getL10nData(key, args, fallback) {\n    var data = gL10nData[key];\n\n    if (!data) {\n      console.warn('#' + key + ' is undefined.');\n\n      if (!fallback) {\n        return null;\n      }\n\n      data = fallback;\n    }\n\n    var rv = {};\n\n    for (var prop in data) {\n      var str = data[prop];\n      str = substIndexes(str, args, key, prop);\n      str = substArguments(str, args, key);\n      rv[prop] = str;\n    }\n\n    return rv;\n  }\n\n  function substIndexes(str, args, key, prop) {\n    var reIndex = /\\{\\[\\s*([a-zA-Z]+)\\(([a-zA-Z]+)\\)\\s*\\]\\}/;\n    var reMatch = reIndex.exec(str);\n    if (!reMatch || !reMatch.length) return str;\n    var macroName = reMatch[1];\n    var paramName = reMatch[2];\n    var param;\n\n    if (args && paramName in args) {\n      param = args[paramName];\n    } else if (paramName in gL10nData) {\n      param = gL10nData[paramName];\n    }\n\n    if (macroName in gMacros) {\n      var macro = gMacros[macroName];\n      str = macro(str, param, key, prop);\n    }\n\n    return str;\n  }\n\n  function substArguments(str, args, key) {\n    var reArgs = /\\{\\{\\s*(.+?)\\s*\\}\\}/g;\n    return str.replace(reArgs, function (matched_text, arg) {\n      if (args && arg in args) {\n        return args[arg];\n      }\n\n      if (arg in gL10nData) {\n        return gL10nData[arg];\n      }\n\n      console.log('argument {{' + arg + '}} for #' + key + ' is undefined.');\n      return matched_text;\n    });\n  }\n\n  function translateElement(element) {\n    var l10n = getL10nAttributes(element);\n    if (!l10n.id) return;\n    var data = getL10nData(l10n.id, l10n.args);\n\n    if (!data) {\n      console.warn('#' + l10n.id + ' is undefined.');\n      return;\n    }\n\n    if (data[gTextProp]) {\n      if (getChildElementCount(element) === 0) {\n        element[gTextProp] = data[gTextProp];\n      } else {\n        var children = element.childNodes;\n        var found = false;\n\n        for (var i = 0, l = children.length; i < l; i++) {\n          if (children[i].nodeType === 3 && /\\S/.test(children[i].nodeValue)) {\n            if (found) {\n              children[i].nodeValue = '';\n            } else {\n              children[i].nodeValue = data[gTextProp];\n              found = true;\n            }\n          }\n        }\n\n        if (!found) {\n          var textNode = document.createTextNode(data[gTextProp]);\n          element.insertBefore(textNode, element.firstChild);\n        }\n      }\n\n      delete data[gTextProp];\n    }\n\n    for (var k in data) {\n      element[k] = data[k];\n    }\n  }\n\n  function getChildElementCount(element) {\n    if (element.children) {\n      return element.children.length;\n    }\n\n    if (typeof element.childElementCount !== 'undefined') {\n      return element.childElementCount;\n    }\n\n    var count = 0;\n\n    for (var i = 0; i < element.childNodes.length; i++) {\n      count += element.nodeType === 1 ? 1 : 0;\n    }\n\n    return count;\n  }\n\n  function translateFragment(element) {\n    element = element || document.documentElement;\n    var children = getTranslatableChildren(element);\n    var elementCount = children.length;\n\n    for (var i = 0; i < elementCount; i++) {\n      translateElement(children[i]);\n    }\n\n    translateElement(element);\n  }\n\n  return {\n    get: function (key, args, fallbackString) {\n      var index = key.lastIndexOf('.');\n      var prop = gTextProp;\n\n      if (index > 0) {\n        prop = key.substring(index + 1);\n        key = key.substring(0, index);\n      }\n\n      var fallback;\n\n      if (fallbackString) {\n        fallback = {};\n        fallback[prop] = fallbackString;\n      }\n\n      var data = getL10nData(key, args, fallback);\n\n      if (data && prop in data) {\n        return data[prop];\n      }\n\n      return '{{' + key + '}}';\n    },\n    getData: function () {\n      return gL10nData;\n    },\n    getText: function () {\n      return gTextData;\n    },\n    getLanguage: function () {\n      return gLanguage;\n    },\n    setLanguage: function (lang, callback) {\n      loadLocale(lang, function () {\n        if (callback) callback();\n      });\n    },\n    getDirection: function () {\n      var rtlList = ['ar', 'he', 'fa', 'ps', 'ur'];\n      var shortCode = gLanguage.split('-', 1)[0];\n      return rtlList.indexOf(shortCode) >= 0 ? 'rtl' : 'ltr';\n    },\n    translate: translateFragment,\n    getReadyState: function () {\n      return gReadyState;\n    },\n    ready: function (callback) {\n      if (!callback) {\n        return;\n      } else if (gReadyState == 'complete' || gReadyState == 'interactive') {\n        window.setTimeout(function () {\n          callback();\n        });\n      } else if (document.addEventListener) {\n        document.addEventListener('localized', function once() {\n          document.removeEventListener('localized', once);\n          callback();\n        });\n      }\n    }\n  };\n}(window, document);\n\n/***/ }),\n/* 43 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.docPropertiesLookup = docPropertiesLookup;\nexports.GenericScripting = void 0;\n\nvar _pdfjsLib = __webpack_require__(5);\n\nasync function docPropertiesLookup(pdfDocument) {\n  const url = \"\",\n        baseUrl = url.split(\"#\")[0];\n  let {\n    info,\n    metadata,\n    contentDispositionFilename,\n    contentLength\n  } = await pdfDocument.getMetadata();\n\n  if (!contentLength) {\n    const {\n      length\n    } = await pdfDocument.getDownloadInfo();\n    contentLength = length;\n  }\n\n  return { ...info,\n    baseURL: baseUrl,\n    filesize: contentLength,\n    filename: contentDispositionFilename || (0, _pdfjsLib.getPdfFilenameFromUrl)(url),\n    metadata: metadata?.getRaw(),\n    authors: metadata?.get(\"dc:creator\"),\n    numPages: pdfDocument.numPages,\n    URL: url\n  };\n}\n\nclass GenericScripting {\n  constructor(sandboxBundleSrc) {\n    this._ready = (0, _pdfjsLib.loadScript)(sandboxBundleSrc, true).then(() => {\n      return window.pdfjsSandbox.QuickJSSandbox();\n    });\n  }\n\n  async createSandbox(data) {\n    const sandbox = await this._ready;\n    sandbox.create(data);\n  }\n\n  async dispatchEventInSandbox(event) {\n    const sandbox = await this._ready;\n    sandbox.dispatchEvent(event);\n  }\n\n  async destroySandbox() {\n    const sandbox = await this._ready;\n    sandbox.nukeSandbox();\n  }\n\n}\n\nexports.GenericScripting = GenericScripting;\n\n/***/ }),\n/* 44 */\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nexports.PDFPrintService = PDFPrintService;\n\nvar _app = __webpack_require__(3);\n\nvar _viewer_compatibility = __webpack_require__(2);\n\nlet activeService = null;\nlet overlayManager = null;\n\nfunction renderPage(activeServiceOnEntry, pdfDocument, pageNumber, size, printResolution, optionalContentConfigPromise) {\n  const scratchCanvas = activeService.scratchCanvas;\n  const PRINT_UNITS = printResolution / 72.0;\n  scratchCanvas.width = Math.floor(size.width * PRINT_UNITS);\n  scratchCanvas.height = Math.floor(size.height * PRINT_UNITS);\n  const ctx = scratchCanvas.getContext(\"2d\");\n  ctx.save();\n  ctx.fillStyle = \"rgb(255, 255, 255)\";\n  ctx.fillRect(0, 0, scratchCanvas.width, scratchCanvas.height);\n  ctx.restore();\n  return pdfDocument.getPage(pageNumber).then(function (pdfPage) {\n    const renderContext = {\n      canvasContext: ctx,\n      transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0],\n      viewport: pdfPage.getViewport({\n        scale: 1,\n        rotation: size.rotation\n      }),\n      intent: \"print\",\n      annotationStorage: pdfDocument.annotationStorage,\n      optionalContentConfigPromise\n    };\n    return pdfPage.render(renderContext).promise;\n  });\n}\n\nfunction PDFPrintService(pdfDocument, pagesOverview, printContainer, printResolution, optionalContentConfigPromise = null, l10n) {\n  this.pdfDocument = pdfDocument;\n  this.pagesOverview = pagesOverview;\n  this.printContainer = printContainer;\n  this._printResolution = printResolution || 150;\n  this._optionalContentConfigPromise = optionalContentConfigPromise || pdfDocument.getOptionalContentConfig();\n  this.l10n = l10n;\n  this.currentPage = -1;\n  this.scratchCanvas = document.createElement(\"canvas\");\n}\n\nPDFPrintService.prototype = {\n  layout() {\n    this.throwIfInactive();\n    const body = document.querySelector(\"body\");\n    body.setAttribute(\"data-pdfjsprinting\", true);\n    const hasEqualPageSizes = this.pagesOverview.every(function (size) {\n      return size.width === this.pagesOverview[0].width && size.height === this.pagesOverview[0].height;\n    }, this);\n\n    if (!hasEqualPageSizes) {\n      console.warn(\"Not all pages have the same size. The printed \" + \"result may be incorrect!\");\n    }\n\n    this.pageStyleSheet = document.createElement(\"style\");\n    const pageSize = this.pagesOverview[0];\n    this.pageStyleSheet.textContent = \"@page { size: \" + pageSize.width + \"pt \" + pageSize.height + \"pt;}\";\n    body.appendChild(this.pageStyleSheet);\n  },\n\n  destroy() {\n    if (activeService !== this) {\n      return;\n    }\n\n    this.printContainer.textContent = \"\";\n    const body = document.querySelector(\"body\");\n    body.removeAttribute(\"data-pdfjsprinting\");\n\n    if (this.pageStyleSheet) {\n      this.pageStyleSheet.remove();\n      this.pageStyleSheet = null;\n    }\n\n    this.scratchCanvas.width = this.scratchCanvas.height = 0;\n    this.scratchCanvas = null;\n    activeService = null;\n    ensureOverlay().then(function () {\n      if (overlayManager.active !== \"printServiceOverlay\") {\n        return;\n      }\n\n      overlayManager.close(\"printServiceOverlay\");\n    });\n  },\n\n  renderPages() {\n    const pageCount = this.pagesOverview.length;\n\n    const renderNextPage = (resolve, reject) => {\n      this.throwIfInactive();\n\n      if (++this.currentPage >= pageCount) {\n        renderProgress(pageCount, pageCount, this.l10n);\n        resolve();\n        return;\n      }\n\n      const index = this.currentPage;\n      renderProgress(index, pageCount, this.l10n);\n      renderPage(this, this.pdfDocument, index + 1, this.pagesOverview[index], this._printResolution, this._optionalContentConfigPromise).then(this.useRenderedPage.bind(this)).then(function () {\n        renderNextPage(resolve, reject);\n      }, reject);\n    };\n\n    return new Promise(renderNextPage);\n  },\n\n  useRenderedPage() {\n    this.throwIfInactive();\n    const img = document.createElement(\"img\");\n    const scratchCanvas = this.scratchCanvas;\n\n    if (\"toBlob\" in scratchCanvas && !_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) {\n      scratchCanvas.toBlob(function (blob) {\n        img.src = URL.createObjectURL(blob);\n      });\n    } else {\n      img.src = scratchCanvas.toDataURL();\n    }\n\n    const wrapper = document.createElement(\"div\");\n    wrapper.appendChild(img);\n    this.printContainer.appendChild(wrapper);\n    return new Promise(function (resolve, reject) {\n      img.onload = resolve;\n      img.onerror = reject;\n    });\n  },\n\n  performPrint() {\n    this.throwIfInactive();\n    return new Promise(resolve => {\n      setTimeout(() => {\n        if (!this.active) {\n          resolve();\n          return;\n        }\n\n        print.call(window);\n        setTimeout(resolve, 20);\n      }, 0);\n    });\n  },\n\n  get active() {\n    return this === activeService;\n  },\n\n  throwIfInactive() {\n    if (!this.active) {\n      throw new Error(\"This print request was cancelled or completed.\");\n    }\n  }\n\n};\nconst print = window.print;\n\nwindow.print = function () {\n  if (activeService) {\n    console.warn(\"Ignored window.print() because of a pending print job.\");\n    return;\n  }\n\n  ensureOverlay().then(function () {\n    if (activeService) {\n      overlayManager.open(\"printServiceOverlay\");\n    }\n  });\n\n  try {\n    dispatchEvent(\"beforeprint\");\n  } finally {\n    if (!activeService) {\n      console.error(\"Expected print service to be initialized.\");\n      ensureOverlay().then(function () {\n        if (overlayManager.active === \"printServiceOverlay\") {\n          overlayManager.close(\"printServiceOverlay\");\n        }\n      });\n      return;\n    }\n\n    const activeServiceOnEntry = activeService;\n    activeService.renderPages().then(function () {\n      return activeServiceOnEntry.performPrint();\n    }).catch(function () {}).then(function () {\n      if (activeServiceOnEntry.active) {\n        abort();\n      }\n    });\n  }\n};\n\nfunction dispatchEvent(eventType) {\n  const event = document.createEvent(\"CustomEvent\");\n  event.initCustomEvent(eventType, false, false, \"custom\");\n  window.dispatchEvent(event);\n}\n\nfunction abort() {\n  if (activeService) {\n    activeService.destroy();\n    dispatchEvent(\"afterprint\");\n  }\n}\n\nfunction renderProgress(index, total, l10n) {\n  const progressContainer = document.getElementById(\"printServiceOverlay\");\n  const progress = Math.round(100 * index / total);\n  const progressBar = progressContainer.querySelector(\"progress\");\n  const progressPerc = progressContainer.querySelector(\".relative-progress\");\n  progressBar.value = progress;\n  l10n.get(\"print_progress_percent\", {\n    progress\n  }).then(msg => {\n    progressPerc.textContent = msg;\n  });\n}\n\nwindow.addEventListener(\"keydown\", function (event) {\n  if (event.keyCode === 80 && (event.ctrlKey || event.metaKey) && !event.altKey && (!event.shiftKey || window.chrome || window.opera)) {\n    window.print();\n    event.preventDefault();\n\n    if (event.stopImmediatePropagation) {\n      event.stopImmediatePropagation();\n    } else {\n      event.stopPropagation();\n    }\n  }\n}, true);\n\nif (\"onbeforeprint\" in window) {\n  const stopPropagationIfNeeded = function (event) {\n    if (event.detail !== \"custom\" && event.stopImmediatePropagation) {\n      event.stopImmediatePropagation();\n    }\n  };\n\n  window.addEventListener(\"beforeprint\", stopPropagationIfNeeded);\n  window.addEventListener(\"afterprint\", stopPropagationIfNeeded);\n}\n\nlet overlayPromise;\n\nfunction ensureOverlay() {\n  if (!overlayPromise) {\n    overlayManager = _app.PDFViewerApplication.overlayManager;\n\n    if (!overlayManager) {\n      throw new Error(\"The overlay manager has not yet been initialized.\");\n    }\n\n    overlayPromise = overlayManager.register(\"printServiceOverlay\", document.getElementById(\"printServiceOverlay\"), abort, true);\n    document.getElementById(\"printCancel\").onclick = abort;\n  }\n\n  return overlayPromise;\n}\n\n_app.PDFPrintServiceFactory.instance = {\n  supportsPrinting: true,\n\n  createPrintService(pdfDocument, pagesOverview, printContainer, printResolution, optionalContentConfigPromise, l10n) {\n    if (activeService) {\n      throw new Error(\"The print service is created and active.\");\n    }\n\n    activeService = new PDFPrintService(pdfDocument, pagesOverview, printContainer, printResolution, optionalContentConfigPromise, l10n);\n    return activeService;\n  }\n\n};\n\n/***/ })\n/******/ \t]);\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.\n(() => {\nvar exports = __webpack_exports__;\n\n\nObject.defineProperty(exports, \"__esModule\", ({\n  value: true\n}));\nObject.defineProperty(exports, \"PDFViewerApplicationOptions\", ({\n  enumerable: true,\n  get: function () {\n    return _app_options.AppOptions;\n  }\n}));\nObject.defineProperty(exports, \"PDFViewerApplication\", ({\n  enumerable: true,\n  get: function () {\n    return _app.PDFViewerApplication;\n  }\n}));\n\nvar _app_options = __webpack_require__(1);\n\nvar _app = __webpack_require__(3);\n\nconst pdfjsVersion = '2.8.335';\nconst pdfjsBuild = '228adbf67';\nwindow.PDFViewerApplication = _app.PDFViewerApplication;\nwindow.PDFViewerApplicationOptions = _app_options.AppOptions;\n;\n;\n{\n  __webpack_require__(38);\n}\n;\n{\n  __webpack_require__(44);\n}\n\nfunction getViewerConfiguration() {\n  let errorWrapper = null;\n  errorWrapper = {\n    container: document.getElementById(\"errorWrapper\"),\n    errorMessage: document.getElementById(\"errorMessage\"),\n    closeButton: document.getElementById(\"errorClose\"),\n    errorMoreInfo: document.getElementById(\"errorMoreInfo\"),\n    moreInfoButton: document.getElementById(\"errorShowMore\"),\n    lessInfoButton: document.getElementById(\"errorShowLess\")\n  };\n  return {\n    appContainer: document.body,\n    mainContainer: document.getElementById(\"viewerContainer\"),\n    viewerContainer: document.getElementById(\"viewer\"),\n    eventBus: null,\n    toolbar: {\n      container: document.getElementById(\"toolbarViewer\"),\n      numPages: document.getElementById(\"numPages\"),\n      pageNumber: document.getElementById(\"pageNumber\"),\n      scaleSelectContainer: document.getElementById(\"scaleSelectContainer\"),\n      scaleSelect: document.getElementById(\"scaleSelect\"),\n      customScaleOption: document.getElementById(\"customScaleOption\"),\n      previous: document.getElementById(\"previous\"),\n      next: document.getElementById(\"next\"),\n      zoomIn: document.getElementById(\"zoomIn\"),\n      zoomOut: document.getElementById(\"zoomOut\"),\n      viewFind: document.getElementById(\"viewFind\"),\n      openFile: document.getElementById(\"openFile\"),\n      print: document.getElementById(\"print\"),\n      presentationModeButton: document.getElementById(\"presentationMode\"),\n      download: document.getElementById(\"download\"),\n      viewBookmark: document.getElementById(\"viewBookmark\")\n    },\n    secondaryToolbar: {\n      toolbar: document.getElementById(\"secondaryToolbar\"),\n      toggleButton: document.getElementById(\"secondaryToolbarToggle\"),\n      toolbarButtonContainer: document.getElementById(\"secondaryToolbarButtonContainer\"),\n      presentationModeButton: document.getElementById(\"secondaryPresentationMode\"),\n      openFileButton: document.getElementById(\"secondaryOpenFile\"),\n      printButton: document.getElementById(\"secondaryPrint\"),\n      downloadButton: document.getElementById(\"secondaryDownload\"),\n      viewBookmarkButton: document.getElementById(\"secondaryViewBookmark\"),\n      firstPageButton: document.getElementById(\"firstPage\"),\n      lastPageButton: document.getElementById(\"lastPage\"),\n      pageRotateCwButton: document.getElementById(\"pageRotateCw\"),\n      pageRotateCcwButton: document.getElementById(\"pageRotateCcw\"),\n      cursorSelectToolButton: document.getElementById(\"cursorSelectTool\"),\n      cursorHandToolButton: document.getElementById(\"cursorHandTool\"),\n      scrollVerticalButton: document.getElementById(\"scrollVertical\"),\n      scrollHorizontalButton: document.getElementById(\"scrollHorizontal\"),\n      scrollWrappedButton: document.getElementById(\"scrollWrapped\"),\n      spreadNoneButton: document.getElementById(\"spreadNone\"),\n      spreadOddButton: document.getElementById(\"spreadOdd\"),\n      spreadEvenButton: document.getElementById(\"spreadEven\"),\n      documentPropertiesButton: document.getElementById(\"documentProperties\")\n    },\n    sidebar: {\n      outerContainer: document.getElementById(\"outerContainer\"),\n      viewerContainer: document.getElementById(\"viewerContainer\"),\n      toggleButton: document.getElementById(\"sidebarToggle\"),\n      thumbnailButton: document.getElementById(\"viewThumbnail\"),\n      outlineButton: document.getElementById(\"viewOutline\"),\n      attachmentsButton: document.getElementById(\"viewAttachments\"),\n      layersButton: document.getElementById(\"viewLayers\"),\n      thumbnailView: document.getElementById(\"thumbnailView\"),\n      outlineView: document.getElementById(\"outlineView\"),\n      attachmentsView: document.getElementById(\"attachmentsView\"),\n      layersView: document.getElementById(\"layersView\"),\n      outlineOptionsContainer: document.getElementById(\"outlineOptionsContainer\"),\n      currentOutlineItemButton: document.getElementById(\"currentOutlineItem\")\n    },\n    sidebarResizer: {\n      outerContainer: document.getElementById(\"outerContainer\"),\n      resizer: document.getElementById(\"sidebarResizer\")\n    },\n    findBar: {\n      bar: document.getElementById(\"findbar\"),\n      toggleButton: document.getElementById(\"viewFind\"),\n      findField: document.getElementById(\"findInput\"),\n      highlightAllCheckbox: document.getElementById(\"findHighlightAll\"),\n      caseSensitiveCheckbox: document.getElementById(\"findMatchCase\"),\n      entireWordCheckbox: document.getElementById(\"findEntireWord\"),\n      findMsg: document.getElementById(\"findMsg\"),\n      findResultsCount: document.getElementById(\"findResultsCount\"),\n      findPreviousButton: document.getElementById(\"findPrevious\"),\n      findNextButton: document.getElementById(\"findNext\")\n    },\n    passwordOverlay: {\n      overlayName: \"passwordOverlay\",\n      container: document.getElementById(\"passwordOverlay\"),\n      label: document.getElementById(\"passwordText\"),\n      input: document.getElementById(\"password\"),\n      submitButton: document.getElementById(\"passwordSubmit\"),\n      cancelButton: document.getElementById(\"passwordCancel\")\n    },\n    documentProperties: {\n      overlayName: \"documentPropertiesOverlay\",\n      container: document.getElementById(\"documentPropertiesOverlay\"),\n      closeButton: document.getElementById(\"documentPropertiesClose\"),\n      fields: {\n        fileName: document.getElementById(\"fileNameField\"),\n        fileSize: document.getElementById(\"fileSizeField\"),\n        title: document.getElementById(\"titleField\"),\n        author: document.getElementById(\"authorField\"),\n        subject: document.getElementById(\"subjectField\"),\n        keywords: document.getElementById(\"keywordsField\"),\n        creationDate: document.getElementById(\"creationDateField\"),\n        modificationDate: document.getElementById(\"modificationDateField\"),\n        creator: document.getElementById(\"creatorField\"),\n        producer: document.getElementById(\"producerField\"),\n        version: document.getElementById(\"versionField\"),\n        pageCount: document.getElementById(\"pageCountField\"),\n        pageSize: document.getElementById(\"pageSizeField\"),\n        linearized: document.getElementById(\"linearizedField\")\n      }\n    },\n    errorWrapper,\n    printContainer: document.getElementById(\"printContainer\"),\n    openFileInputName: \"fileInput\",\n    debuggerScriptPath: \"./debugger.js\"\n  };\n}\n\nfunction webViewerLoad() {\n  const config = getViewerConfiguration();\n  const event = document.createEvent(\"CustomEvent\");\n  event.initCustomEvent(\"webviewerloaded\", true, true, {\n    source: window\n  });\n\n  try {\n    parent.document.dispatchEvent(event);\n  } catch (ex) {\n    console.error(`webviewerloaded: ${ex}`);\n    document.dispatchEvent(event);\n  }\n\n  _app.PDFViewerApplication.run(config);\n}\n\nif (document.blockUnblockOnload) {\n  document.blockUnblockOnload(true);\n}\n\nif (document.readyState === \"interactive\" || document.readyState === \"complete\") {\n  webViewerLoad();\n} else {\n  document.addEventListener(\"DOMContentLoaded\", webViewerLoad, true);\n}\n})();\n\n/******/ })()\n;\n//# sourceMappingURL=viewer.js.map"
  },
  {
    "path": "lib/tracky-mouse/.gitattributes",
    "content": "* text=auto\n"
  },
  {
    "path": "lib/tracky-mouse/.gitignore",
    "content": "private/\ndist/\n\n# Blender\n*.blend[0-9]\n\n#################\n# Node.js\n#################\n\n# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\n\n# Diagnostic reports (https://nodejs.org/api/report.html)\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\n\n# Runtime data\npids\n*.pid\n*.seed\n*.pid.lock\n.DS_Store\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n*.lcov\n\n# nyc test coverage\n.nyc_output\n\n# node-waf configuration\n.lock-wscript\n\n# Compiled binary addons (https://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directories\nnode_modules/\njspm_packages/\n\n# TypeScript v1 declaration files\ntypings/\n\n# TypeScript cache\n*.tsbuildinfo\n\n# Optional npm cache directory\n.npm\n\n# Optional eslint cache\n.eslintcache\n\n# Optional REPL history\n.node_repl_history\n\n# Output of 'npm pack'\n*.tgz\n\n# Yarn Integrity file\n.yarn-integrity\n\n# dotenv environment variables file\n.env\n.env.test\n\n# parcel-bundler cache (https://parceljs.org/)\n.cache\n\n# next.js build output\n.next\n\n# nuxt.js build output\n.nuxt\n\n# vuepress build output\n.vuepress/dist\n\n# Serverless directories\n.serverless/\n\n# FuseBox cache\n.fusebox/\n\n# DynamoDB Local files\n.dynamodb/\n\n# Webpack\n.webpack/\n\n# Electron-Forge\nout/\n\n\n#################\n# Mac OS\n#################\n\n# General\n.DS_Store\n.AppleDouble\n.LSOverride\n\n# Icon must end with two \\r\nIcon\n\n# Thumbnails\n._*\n\n# Files that might appear in the root of a volume\n.DocumentRevisions-V100\n.fseventsd\n.Spotlight-V100\n.TemporaryItems\n.Trashes\n.VolumeIcon.icns\n.com.apple.timemachine.donotpresent\n\n# Directories potentially created on remote AFP share\n.AppleDB\n.AppleDesktop\nNetwork Trash Folder\nTemporary Items\n.apdisk\n\n#################\n# Linux\n#################\n\n*~\n\n# temporary files which can be created if a process still has a handle open of a deleted file\n.fuse_hidden*\n\n# KDE directory preferences\n.directory\n\n# Linux trash folder which might appear on any partition or disk\n.Trash-*\n\n# .nfs files are created when an open file is removed but is still being accessed\n.nfs*\n\n#################\n# Windows\n#################\n\n# Windows thumbnail cache files\nThumbs.db\nThumbs.db:encryptable\nehthumbs.db\nehthumbs_vista.db\n\n# Dump file\n*.stackdump\n\n# Folder config file\n[Dd]esktop.ini\n\n# Recycle Bin used on file shares\n$RECYCLE.BIN/\n\n# Windows Installer files\n*.cab\n*.msi\n*.msix\n*.msm\n*.msp\n\n# Windows shortcuts\n*.lnk\n"
  },
  {
    "path": "lib/tracky-mouse/.gitrepo",
    "content": "; DO NOT EDIT (unless you know what you are doing)\n;\n; This subdirectory is a git \"subrepo\", and this file is maintained by the\n; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme\n;\n[subrepo]\n\tremote = https://github.com/1j01/tracky-mouse.git\n\tbranch = v1.2.0\n\tcommit = 2cca8048692bef586e6814f04e408c7072525b21\n\tparent = 6ac7bc577041f3933d4cfac31ec995045c9c2056\n\tmethod = merge\n\tcmdver = 0.4.6\n"
  },
  {
    "path": "lib/tracky-mouse/.vscode/extensions.json",
    "content": "{\n\t\"recommendations\": [\n\t\t\"nopjmp.fairyfloss\",\n\t\t\"streetsidesoftware.code-spell-checker\"\n\t]\n}"
  },
  {
    "path": "lib/tracky-mouse/.vscode/launch.json",
    "content": "{\n\t// Use IntelliSense to learn about possible attributes.\n\t// Hover to view descriptions of existing attributes.\n\t// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387\n\t\"version\": \"0.2.0\",\n\t\"configurations\": [\n\t\t{\n\t\t\t// To use this configuration, you must run Chrome with a flag:\n\t\t\t//   google-chrome --remote-debugging-port=9222 http://127.0.0.1:64206\n\t\t\t// or for Windows:\n\t\t\t//   start chrome --remote-debugging-port=9222 http://127.0.0.1:64206\n\t\t\t// and Chrome must not be running beforehand, as the flag won't apply otherwise.\n\t\t\t// And you need to have the dev server running:\n\t\t\t//   npm run dev\n\t\t\t// If you really don't want to close Chrome, you can use a temporary profile.\n\t\t\t// Assuming cmd.exe and not bash:\n\t\t\t//   mkdir C:\\TempChromeProfile\n\t\t\t//   echo {\"browser\": {\"has_seen_welcome_page\": true, \"default_browser_infobar_last_declined\": \"13354566465257726\"}} > C:\\TempChromeProfile\\Preferences\n\t\t\t//   start chrome --remote-debugging-port=9222 --user-data-dir=\"C:\\TempChromeProfile\" --disable-fre --no-default-browser-check --no-first-run http://127.0.0.1:64206\n\t\t\t// Cleanup:\n\t\t\t//   rmdir /s /q C:\\TempChromeProfile\n\t\t\t\"type\": \"chrome\",\n\t\t\t\"request\": \"attach\",\n\t\t\t\"name\": \"Attach to Chrome\",\n\t\t\t\"port\": 9222,\n\t\t\t\"urlFilter\": \"http://127.0.0.1:64206/*\",\n\t\t\t\"webRoot\": \"${workspaceFolder}\"\n\t\t},\n\t\t{\n\t\t\t// https://www.electronjs.org/docs/latest/tutorial/debugging-vscode\n\t\t\t\"name\": \"Electron: Debug Main Process\",\n\t\t\t\"type\": \"node\",\n\t\t\t\"request\": \"launch\",\n\t\t\t\"cwd\": \"${workspaceFolder}\",\n\t\t\t\"runtimeExecutable\": \"${workspaceFolder}/desktop-app/node_modules/.bin/electron\",\n\t\t\t\"windows\": {\n\t\t\t\t\"runtimeExecutable\": \"${workspaceFolder}/desktop-app/node_modules/.bin/electron.cmd\"\n\t\t\t},\n\t\t\t\"args\": [\n\t\t\t\t\"desktop-app\"\n\t\t\t],\n\t\t\t\"outputCapture\": \"std\"\n\t\t}\n\t]\n}"
  },
  {
    "path": "lib/tracky-mouse/.vscode/settings.json",
    "content": "{\n\t// .----------------------------.\n\t// | Filtering                  |\n\t// '----------------------------'\n\t// This hides files from the file tree as well as search results.\n\t\"files.exclude\": {\n\t\t\"**/node_modules\": true,\n\t\t\"**/out\": true,\n\t\t\"**/dist\": true,\n\t},\n\t// This affects Find In Files (Ctrl+Shift+F) but also Go To File (Ctrl+P) and\n\t// the new Quick Search (experimental), which I've been using a lot since it was released.\n\t\"search.exclude\": {\n\t\t\"**/images\": true,\n\t\t\"**/lib\": true,\n\t\t\"**/out\": true,\n\t\t// Symbolic link to the core library, causes duplicate/non-canonical search results.\n\t\t\"website/core\": true,\n\t\t// The package lock files contain a lot of repetition, and are usually noise in search results.\n\t\t// You can often search with `npm ls` if you want to check if a package is installed,\n\t\t// and what depends on what.\n\t\t\"**/package-lock.json\": true,\n\t},\n\t// Prevent accidental editing.\n\t// This can always be overridden with the command \"File: Toggle Active Editor Read-only in Session\"\n\t\"files.readonlyInclude\": {\n\t\t// Electron Forge output\n\t\t\"**/out/**\": true,\n\t\t// Built/installed app (sometimes I follow error message links into the built app's code, and end up editing it by mistake)\n\t\t\"**/resources/app/**\": true,\n\t\t// Node.js\n\t\t\"**/node_modules/**\": true,\n\t\t\"**/package-lock.json\": true,\n\t},\n\t// .----------------------------.\n\t// | Formatting                 |\n\t// '----------------------------'\n\t\"editor.formatOnSave\": true,\n\t\"editor.insertSpaces\": false,\n\t\"editor.detectIndentation\": false,\n\t\"editor.codeActionsOnSave\": {\n\t\t\"source.organizeImports\": \"always\",\n\t},\n\t\"javascript.preferences.importModuleSpecifierEnding\": \"js\",\n\t\"typescript.preferences.importModuleSpecifierEnding\": \"js\",\n\t\"html.format.unformattedContentDelimiter\": \"<!--no_format-->\",\n\t// Note: this doesn't apply to \"JSON with comments\" files, such as this one. That's [jsonc].\n\t\"[json]\": {\n\t\t// npm respects different indent styles, but always adds a newline at the end of package.json/package-lock.json,\n\t\t// so this avoids ping-ponging changes in git.\n\t\t// This could be applied to all files for consistency, but it may introduce noise if all files aren't formatted at once.\n\t\t\"files.insertFinalNewline\": true,\n\t\t// Maintaining current indentation for now, but could remove this for consistency.\n\t\t\"editor.detectIndentation\": true,\n\t},\n\t// .----------------------------.\n\t// | Theming                    |\n\t// '----------------------------'\n\t\"workbench.colorTheme\": \"fairyfloss\",\n\t\"workbench.colorCustomizations\": {\n\t\t\"[fairyfloss]\": {\n\t\t\t\"terminal.ansiMagenta\": \"#f36aff\", // hard to see npm errors otherwise\n\t\t\t\"terminal.ansiBrightMagenta\": \"#f8adff\", // not sure if needed, but figured I'd override the set of magentas\n\t\t}\n\t},\n\t// .------------------------- - .\n\t// | Uncategorised settings\n\t// '------------------------- - .\n}"
  },
  {
    "path": "lib/tracky-mouse/API.md",
    "content": "# API docs have moved\n\nThe API documentation has moved to the [core/README.md](./core/README.md) file.\n"
  },
  {
    "path": "lib/tracky-mouse/CHANGELOG.md",
    "content": "# Changelog\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [Unreleased]\n\nNo changes here yet.\n\n## [1.2.0] - 2024-12-17\n\n### Deprecated\n- `TrackyMouse.cleanupDwellClicking()` is deprecated in favor of calling `dispose()` on the object returned by `TrackyMouse.initDwellClicking()`.\n\n### Changed\n- The Tracky Mouse UI no longer includes a stats.js performance monitor by default. You can still enable it by passing `{statsJs: true}` to `TrackyMouse.init()` and, if needed, also to `TrackyMouse.loadDependencies()`.\n\n### Added\n- `TrackyMouse.init()` now returns an object with a `dispose()` method, which you can call to stop head tracking and remove the UI.\n- The object returned by `TrackyMouse.initDwellClicking()` now has a `dispose()` method as well, which you can use instead of `TrackyMouse.cleanupDwellClicking()`.\n\n### Fixed\n- `TrackyMouse.cleanupDwellClicking()` now handles multiple dwell clickers, not that I know of any use case for that.\n\n## [1.1.0] - 2024-10-20\n\n### Added\n- Start/stop button. This toggles head tracking, and, in the desktop app, dwell clicking as well. In the web library, dwell clicking is set up separately, and is not currently controlled by this button (or the keyboard shortcut F9).\n- Desktop app now supports dwell clicking. This means you can use Tracky Mouse with lots of software not designed with head tracking in mind. I just played a game of Mahjongg, and it worked well.\n- Settings are now persisted, both in the desktop app and in the browser.\n- Desktop app includes menu items for exporting and importing settings.\n- Desktop app now remembers the window size and position.\n- Desktop app lets you regain manual control by simply moving the mouse, pausing temporarily, and resuming when you stop moving the mouse.\n- Friendly error handling for different camera access failure scenarios.\n- Command line interface to control the desktop app, supporting `--start` and `--stop` to toggle head tracking.\n- API documentation.\n- Website at [TrackyMouse.js.org](https://trackymouse.js.org/).\n- Parameter validation.\n- `tracky-mouse.js` includes a CommonJS export, untested. I'm only testing script tag usage. I hope to switch to ES modules soon.\n- `beforeDispatch()`/`afterDispatch()` callbacks for detecting untrusted gestures, outside of an event where you could use `event.isTrusted`.\n- `beforePointerDownDispatch()`/`afterReleaseDrag()` callbacks for JS Paint to replace accessing global `pointers` array.\n- `initDwellClicking` returns an object `{paused}` which lets you pause and resume dwell clicking.\n\n### Fixed\n- Function `average_points` was missing. It existed in JS Paint, the only place I had tested the library, since I was extracting the code from JS Paint.\n- Similarly, styles for the dwell click indicator and hover halo were missing or not applying. (Since they were provided by CSS in JS Paint, I didn't notice, in my rushed testing.)\n- The JS assumed the existence of a global `pointer_active` from JS Paint. This has been replaced with `config.isHeld()`.\n- Missing `facemesh.worker.js` file.\n- \"Mirror\" checkbox was too easy to accidentally click due to a large `<label>` (which acts as a hit region).\n\n### Changed\n- The software now starts disabled (by default), to avoid clicking on things before you're ready. This is especially important for the desktop app. The installer on Windows actually installs and launches the app without any interaction, so it would be *very surprising* if it started clicking right away.\n- The webcam view now shrinks to fit the window.\n- Sliders now have labels for their min and max values, and are widened to make it easier to click precisely.\n- Controls are themed purple.\n- All CSS classes are now prefixed with `tracky-mouse-`.\n- `shouldDrag`, `noCenter`, `retarget`, `isEquivalentTarget`, and `dwellClickEvenIfPaused` are now optional for `initDwellClicking`.\n- You must include a new script `no-eval.js` if you are including Tracky Mouse's dependencies manually. If you are using `loadDependencies()`, it is included automatically.\n- Tracky Mouse no longer requires `unsafe-eval` in the Content Security Policy! This is great, because now I can feel better about usage in Electron, both for the Tracky Mouse desktop app and for JS Paint.\n- Globals used by the Electron app (`moveMouse`, `onShortcut`, etc.) are now namespaced under `window.electronAPI`. For `moveMouse`, use `TrackyMouse.onPointerMove` instead.\n- Will no longer set global `pointers` to an empty array before dispatching `pointerdown` or after releasing a drag. Replaced with `config.beforePointerDownDispatch()` and `config.afterReleaseDrag()`\n\n## [1.0.0] - 2021-05-20\n### Added\n- Head tracking based on [Clmtrackr](https://github.com/auduno/clmtrackr), [Facemesh](https://github.com/tensorflow/tfjs-models/tree/master/facemesh#mediapipe-facemesh), and [jsfeat](https://github.com/inspirit/jsfeat).\n- Dwell clicker API generalized and extracted from [JS Paint](https://github.com/1j01/jspaint).\n- [Electron](https://electronjs.org/) app for desktop (not yet packaged for distribution).\n\n\n[Unreleased]: https://github.com/1j01/tracky-mouse/compare/v1.2.0...HEAD\n[1.2.0]: https://github.com/1j01/tracky-mouse/compare/v1.1.0...v1.2.0\n[1.1.0]: https://github.com/1j01/tracky-mouse/compare/v1.0.0...v1.1.0\n[1.0.0]: https://github.com/1j01/tracky-mouse/releases/tag/v1.0.0\n"
  },
  {
    "path": "lib/tracky-mouse/CLI.md",
    "content": "# Tracky Mouse CLI\n\nTracky Mouse provides a command line interface (CLI) for controlling the desktop app.\n\nIt can start and stop head tracking + dwell clicking, and in the future it will be able to change settings on the fly.\n\nAny program that can launch other programs can use this CLI to control Tracky Mouse. A good use case is a voice command system, which would let you control Tracky Mouse with your voice.\n\n## Installation\n\nThe command `tracky-mouse` is installed automatically when you install the desktop app on Windows.\n\nOn other platforms, you need to edit `.bashrc` or similar, depending on your shell, to add a line that extends the `PATH` environment variable.\n\nFor example (this is a fake path):\n\n```sh\nexport PATH=\"$PATH:/path/to/tracky-mouse/bin\"\n```\n\nThen `source ~/.bashrc` or restart your terminal to access the `tracky-mouse` command.\n\n## Usage\n\n```HELP_OUTPUT\nusage: tracky-mouse [-h] [--start] [--stop] [-v]\n\nControl your mouse hands-free. This CLI controls the running Tracky Mouse app.\nIt's meant for external programs like a voice command system to toggle Tracky\nMouse and adjust settings on the fly.\n\noptional arguments:\n  -h, --help     show this help message and exit\n  --start        Start head tracking.\n  --stop         Stop head tracking.\n  -v, --version  Show the version number.\n```\n"
  },
  {
    "path": "lib/tracky-mouse/LICENSE.txt",
    "content": "MIT License\n\nCopyright (c) 2021 Isaiah Odhner\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "lib/tracky-mouse/README.md",
    "content": "# ![](./images/tracky-mouse-logo-32.png) Tracky Mouse\n\n> Control your computer by moving your head.\n\nTracky Mouse is a desktop application *and embeddable web UI* for head tracking and mouse control.\nIt includes a dwell clicker, and will be expanded with other clicking options in the future.\n\nTracky Mouse is intended to be a complete UI for head tracking, similar to [eViacam](https://github.com/cmauri/eviacam), but embeddable in web applications (such as [JS Paint, with its Eye Gaze Mode](https://jspaint.app/#eye-gaze-mode), which I might rename Hands-Free Mode or Facial Mouse Mode), as well as downloadable as an application to use to control your entire computer.\n\nI'm also thinking about making a browser extension, which would 1. bridge between the desktop application and web applications, making it so you don't need to disable dwell clicking in the desktop app to use a web app that provides dwell clicking, 2. provide the equivalent of the desktop application for Chrome OS, and 3. automatically enhance webpages to be friendlier toward facial mouse input, by preventing menus from closing based on hover, enlarging elements etc., probably using site-specific enhancements.\n\nSo this would be a three-in-one project: desktop app, JavaScript library, and browser extension.\nSharing code between these different facets of the project means a lot of improvements can be made to three different products at once, and the library means that applications can have a fully functional facial mouse UI, and get people interested in head tracking because they can try it out right away.\n\nOptions could be exported/imported or even synced between the products.\n\n[✨👉 **Try out the Demo!** 👈✨](https://trackymouse.js.org/)\n\n## Install Desktop App\n\n[⬇️ Download for Windows](https://github.com/1j01/tracky-mouse/releases/download/v1.2.0/Tracky.Mouse.v1.1.0.Setup.exe) and run the installer.\n\nPre-built binaries are not yet available for macOS or Linux, due to an [Electron Forge issue](https://github.com/electron/forge/issues/3238#issuecomment-2067577947), however you can run the app from source on those platforms.\nSee [Development Setup](#development-setup).\n\n## Usage Guide\n\nThese instructions apply to using the desktop app or the web UI.\n\n### Set up your camera and environment:\n- Make sure to have good lighting on your face. Placing a lamp beside your monitor can help a lot!\n- Back-lighting can be problematic, especially if your head moves in and out from occluding the light during use.\n- Your webcam should be centered in front of your head, with your head fully visible when sitting comfortably.\n\n### Start using Tracky Mouse:\n- Press the \"Start\" button to start moving the mouse and clicking. You can also use the keyboard shortcut <kbd>F9</kbd>. When using the desktop app, this shortcut works even when the app is not in focus.\n- Dwell in one spot to click. To avoid clicking, you have to keep moving your head, or pause the app with <kbd>F9</kbd>.\n\n### General usage tips:\n- Adjust the settings until you can comfortably move the mouse to the edges of the screen with some accuracy.\n- If the mouse cursor feels off-center, you can recalibrate by simply moving your head past where the cursor meets the edge of the screen.\n- Note that not only rotating your head, but translating your head (moving it left/right, up/down, or forward/backward) moves the mouse.\n  - One nuance to this is, if the camera is positioned above your head, leaning forward generally moves the pointer down, whereas if the camera is below your head, leaning forward generally moves the pointer up.\n\n### Troubleshooting:\n- If the camera feed appears black, make sure there is no privacy/dust cover on the camera, and ensure there's enough light. Check the camera in another application to make sure it's working.\n- If the camera can't be accessed at all, make sure it's not being used by another application, then click \"Allow Camera Access\" in the app. Also try unplugging the camera and plugging it in again (if it's an external camera), or restarting your computer.\n  - On Linux: Installing (and maybe running?) `guvcview` can magically fix a webcam not showing up. ([source](https://forums.linuxmint.com/viewtopic.php?t=131011))\n- Auto-focus and auto-brightness can cause head tracking disruptions. Consider disabling auto-focus on your camera, and adjusting focus manually. If you disable auto-brightness, you will have to adjust the brightness regularly as the lighting changes, at least assuming you have any natural light in the room.\n- If you have multiple cameras, the app does not yet support selecting a camera, so you'll have to disable the other cameras in your system settings (or unplug them, if they're external) in order to target the desired camera.\n\n### Integrating with external software\nTrack Mouse comes with a command-line interface (CLI) which can be used to control the desktop app with a voice command system or other external programs. See [CLI documentation](./CLI.md) for usage.\n\n\n## Add to your project\n\nTracky Mouse is available on npm:\n```sh\nnpm install tracky-mouse\n```\n\nRead the [API documentation](./core/README.md) for more information.\n\n## License\n\nMIT-licensed, see [LICENSE.txt](./LICENSE.txt)\n\n## Changelog\n\nSee [CHANGELOG.md](./CHANGELOG.md) for project history and API changes.\n\n## Why did I make this?\n\nSomeone emailed me asking about how they might adjust the UI of [JS Paint](https://jspaint.app/) to work with eye tracking (enlarging the color palette, hiding other UI elements, etc.)\nand I decided to do them one better and build it as an official feature, with dwell clicking and everything.\n\nTo test the Eye Gaze Mode properly, I needed a facial mouse, but eye trackers are expensive, so I tried looking for head tracking software, and found eViacam, but... either it didn't work, or at some point it stopped working on my computer.\n\n- eViacam wasn't working on my computer.\n- There's not that much facial mouse software out there, especially cross-platform, and I think it's good to have options.\n- I want people to be able to try JS Paint's Eye Gaze Mode out easily, and an embeddable facial mouse GUI would be great for that.\n- Sometimes my joints hurt a lot and I'd like to relieve strain by switching to an alternative input method, such as head movement. Although I also have serious neck problems, so I don't know what I was thinking. Working on this project I have to use it very sparingly, using a demo video instead of camera input whenever possible for testing.\n\n## Software Architecture\n\nThis is a monorepo containing packages for the library (`core`), the desktop app (`desktop-app`), and the website (`website`).\n\n\nI tried npm workspaces, but it doesn't work with Electron Forge packaging. See [electron/forge#2306](https://github.com/electron/forge/issues/2306).\n\n### Core\n\nThe core library uses the following third-party libraries:\n\n- [jsfeat](https://github.com/inspirit/jsfeat) for point tracking\n\t- [MIT License](https://github.com/inspirit/jsfeat/blob/master/LICENSE)\n- [clmtrackr.js](https://github.com/auduno/clmtrackr) for fast and lightweight but inaccurate face tracking\n\t- [MIT License](https://github.com/auduno/clmtrackr/blob/dev/LICENSE.txt)\n- [facemesh](https://github.com/tensorflow/tfjs-models/tree/master/facemesh#mediapipe-facemesh) and [TensorFlow.js](https://www.tensorflow.org/) for accurate face tracking (once this loads, it stops using clmtrackr.js)\n\t- [tfjs-models: Apache License 2.0](https://github.com/tensorflow/tfjs-models/blob/master/LICENSE)\n\t- [TensorFlow: Apache License 2.0](https://github.com/tensorflow/tensorflow/blob/master/LICENSE)\n\n\nTo avoid the need for `unsafe-eval` in the Content Security Policy, I had to eliminate the use of `eval` (and `Function` construction) in `clmtrackr.js`.\n\nThe file [no-eval.js](./core/lib/no-eval.js) overrides `eval` with a function that handles the specific cases of `eval` usage in `clmtrackr.js`.\nI made a tool to generate this file by running `clmtrackr.js` while instrumenting `eval` to collect the code it tries to evaluate.\nThis tool is located in [eval-is-evil.html](./website/eval-is-evil.html).\n\n### Website\n\nThe website uses symlinks to reference the library (`core`) and shared resources (`images`) during development.\n\nWhen deploying with `npm run in-website -- npm run deploy`, the symlinks are dereferenced using `cp -rL`.\n\nThe website is deployed to GitHub Pages using the [`gh-pages`](https://www.npmjs.com/package/gh-pages) npm package.\n\n(GitHub Pages supports symlinks, but not to paths outside of `docs` when deploying `docs` as the site root, unfortunately,\nhence I can't use symlinks to reference the library and avoid a deployment script, while keeping a clean repository structure.\nI would have to have the website files at the root of the repository.)\n\n### Desktop App\n\nThe desktop application's architecture is kind of *amusing*...\n\nI will explain. First, some groundwork. Electron apps are multi-process programs. They have a main process, which creates browser windows, and renderer processes, which render the content of the browser windows.\n\nIn this app, there are two renderer processes, one for the main application window, and one for a screen overlay window.\n\nThe overlay window is transparent, always-on-top, and intangible. It's used to preview dwell clicks with a shrinking circle.\n\nNow we get to the good stuff...\n\nIn a \"sane\" architecture, the overlay window, which can't receive any input directly, would be purely a visual output. The state would be kept in either the main process or the main renderer process, and it would only send messages to the overlay to draw the circle.\n\nBut I already had code for the dwell clicker, you see. I want it to behave similarly between the library and the desktop app, so I want the same timing logic and circle drawing to work in both.\n\nKeeping the state in a separate process from where the circle is rendered would mean tearing apart and rewriting my code for the dwell clicker.\n\nSo instead I simply embed the dwell clicker into the screen overlay window, business logic and all.\nIt was already going to be an entire webpage just to render the circle, since this is Electron.\nIt was never going to be efficient.\n\nSo I ended up with an architecture where the **application window controls mouse movement**, and the **screen overlay window controls mouse clicking**, which I think is *pretty epic*. 😎\n\nIt genuinely was a good way to reuse the code for the dwell clicker.\n\nOh also I made a big, screen-sized, **invisible button**, so that the dwell clicker thinks there's something to click on. Pretty silly, but also pretty simple. 🆒\n\n![](./images/software-architecture.svg)\n\n**Not pictured:** the renderer processes each have preload scripts which are more privileged code than the rest of the renderer's code. Access to system functionality passes through the preload scripts.\n\nThe architecture for normal usage of the library is much simpler.\n\nOoh, but the diagram for the desktop app interacting with web pages (including pages using the library) through the browser extension would be interesting. That's all theoretical for now though.\n\n## Development Setup\n\n- Before cloning on Windows, make sure you have `git config --global core.symlinks true` set, or you may have issues with symbolic links.\n- [Clone the repo.](https://help.github.com/articles/cloning-a-repository/)\n- Install [Node.js](https://nodejs.org/) if you don't have it\n- Open up a command prompt / terminal in the project directory.\n- Run `npm install` to install project-wide dependencies.\n\nFor the website:\n- Run `npm run in-website -- npm install` to install the website's dependencies. (`--` allows passing arguments to the script, which is just a simple wrapper to run a command within the directory of the package.)\n- Run `npm run website` to start a web server that will automatically reload when files change.\n\nFor the desktop app:\n- Run `npm run in-desktop-app -- npm install` to install dependencies.\n- Run `npm run desktop-app` to start the app.\n- To test the CLI, run `npx tracky-mouse --help`.\n  - Alternatively, run `npm link` to make `tracky-mouse` available globally, but note that it may conflict with the installed app.\n  - Those options skip Electron Forge currently. To test the CLI through Electron Forge, run `npm run desktop-app -- -- -- --help` (Yes it's a lot of dashes. It's going through npm, then npm within a subfolder, and then Electron Forge. Each tool has its own `--help` flag, but supports `--` to pass on any following arguments as-is.)\n- Run `npm run in-desktop-app -- npm run make` to build the app for distribution. Look in the `desktop-app/out/` directory for build artifacts.\n\n(The core library doesn't currently use `npm` for dependencies. It has dependencies stored in the `core/lib` directory. And it doesn't have any npm scripts.)\n\n### Debugging\n\nVS Code launch configurations are provided to debug the web version in Chrome, and to debug the Electron main process.\n\nFor the screen overlay window, you can use **View > Toggle Developer Tools (Screen Overlay)** from the main window's menu bar.\n\n## Quality Assurance\n\n- Run `npm run lint` to check for spelling and code issues.\n- There are no tests yet.\n\n## Release Process\n\nThis section outlines the steps for releasing a new version of Tracky Mouse.\n\n> Hm, the version numbers need to be updated for the desktop app build (for the about window and `--version` flag to make sense), but it seems a little awkward to have to bump the version numbers on all the operating systems. Should I separate committing the bump from pushing, and push to a branch first, in order to pull on the other systems with the bump? Is that even easier?  \n> I guess it comes down to wanting to test the desktop app on all systems.  \n> But maybe I should just hope for the best, and rely on patch releases if there are issues.  \n> I guess ideally I should set up GitHub Actions to build the desktop app for all platforms, on a branch, on then test by downloading the artifacts, then merge to main and tag the commit.  \n\nRun quality assurance checks:\n```sh\nnpm run lint\n```\n\nUpdate CLI docs:\n```sh\nnpm run update-cli-docs\n```\n\nBump package versions.\n```sh\n# Assuming bash or similar shell syntax\n# TODO: automate this in a cross-platform way\nVERSION=1.1.0\nnpm run in-core -- npm version $VERSION --no-git-tag-version\nnpm run in-website -- npm version $VERSION --no-git-tag-version\nnpm run in-desktop-app -- npm version $VERSION --no-git-tag-version\nnpm version $VERSION --no-git-tag-version\n```\n\nUpdate the changelog.  \nIn CHANGELOG.md, first make sure all important changes are noted.  \nThen add a new heading below \"Unreleased\" with the new version number and date, and update links defined at the bottom which are used for version comparison.  \nAdd \"No changes here yet.\" below the \"Unreleased\" heading so that it doesn't appear to apply to the new version.\n\nUpdate download links to point to the new version:\n```sh\nFILES_WITH_DL_LINKS=\"README.md website/index.html\"\n# sed -i \"s/(https:\\\\/\\\\/github.com\\\\/1j01\\\\/tracky-mouse\\\\/releases\\\\/download\\\\/)[^/]*\\\\//\\1v$VERSION\\\\//g\" $FILES_WITH_DL_LINKS\nnode -e \"const fs = require('fs'); const version = '$VERSION'; const files = '$FILES_WITH_DL_LINKS'.split(' '); files.forEach(file => { fs.writeFileSync(file, fs.readFileSync(file, 'utf8').replace(/(https:\\/\\/github.com\\/1j01\\/tracky-mouse\\/releases\\/download\\/)[^/]*\\//g, '\\$1v' + version + '/')); });\"\n```\n\nBuild the desktop app (this must be done after updating the version number, but should be done before publishing the library to npm in case any issues come up):\n```sh\n# This step should be run on all supported platforms\nnpm run in-desktop-app -- npm run make\n```\n\nCreate `desktop-app/.env` file if it doesn't exist, and inside it, set `GITHUB_TOKEN=...` with a [GitHub personal access token](https://github.com/settings/tokens?page=1&type=beta) with content permissions for creating a release.\n\nCreate a GitHub release draft, automatically uploading the desktop app distributable files:\n```sh\n# This step should be run on all supported platforms\nnpm run in-desktop-app -- npm run publish\n```\n\nCopy and paste the changelog entry into the GitHub release draft's notes.\n\nInstall and test the installed desktop app.\n\nThen commit the changes, tag the commit, and push:\n```sh\ngit add .\ngit commit -m \"Release $VERSION\"\ngit tag v$VERSION\ngit push\ngit push origin tag v$VERSION\n```\n\nPublish the library to npm:\n```sh\nnpm run in-core -- npm publish --dry-run\nnpm run in-core -- npm publish\n```\n\nPublish the GitHub release draft.\n\nDeploy the website (this may be done at any time, but it's good to do it with a release):\n```sh\nnpm run in-website -- npm run deploy\n```\n\n"
  },
  {
    "path": "lib/tracky-mouse/core/README.md",
    "content": "# Tracky Mouse API\n\n## Introduction\n\nTracky Mouse is a simple, open-source API for head tracking and dwell clicking that you can add to any web application.\n\nIt includes a full user interface with a webcam view and settings, and the API lets you specify which elements to click, which to drag, which to treat as equivalent (e.g. form labels and the controls they label), and which to ignore.\n\nThe dwell clicker can also work independently of the head tracking, for use with external pointing devices, including eye trackers (which require similar UI concerns), and the Tracky Mouse desktop app, which can control your computer's mouse.\nWith the desktop app (also open source), users will be able to seamlessly upgrade to full computer control, without learning a new UI.\n\n[✨👉 **Demo and more information on the Tracky Mouse website** 👈✨](https://trackymouse.js.org/)\n\n## Installation\n\n```bash\nnpm install tracky-mouse\n```\n\n## Usage\n\nThe library is currently script tag-based, so you'll need to add it to your HTML file.\n\n```html\n<script src=\"path/to/tracky-mouse/tracky-mouse.js\"></script>\n```\n\nThen you have to tell it where it can load related files from.\nMake sure not to include a trailing slash.\n\n```javascript\nTrackyMouse.dependenciesRoot = \"path/to/tracky-mouse\";\n```\n\nYou also need to include the stylesheet, which is in the same directory as the script.\n\n```html\n<link rel=\"stylesheet\" href=\"path/to/tracky-mouse/tracky-mouse.css\">\n```\n\n## Head Tracking\n\nTracky Mouse makes it easy to set up head tracking,\nbut what you do with the movement data is a bit more complicated.\n\nGenerally, you'll want to simulate mouse/pointer events on the page,\nand in the future the library should help you with this, but for now you'll have to do it yourself, by defining a callback `TrackyMouse.onPointerMove(x, y)`.\n\nYou can copy this code to get started:\n\n```javascript\nTrackyMouse.loadDependencies().then(function() {\n\tTrackyMouse.init();\n\n\t// Pointer event simulation logic should be built into tracky-mouse in the future.\n\t// These simulated events connect the Tracky Mouse head tracker to the Tracky Mouse dwell clicker,\n\t// as well as any other pointermove/pointerenter/pointerleave handlers on the page.\n\tconst getEventOptions = ({ x, y }) => {\n\t\treturn {\n\t\t\tview: window, // needed so the browser can calculate offsetX/Y from the clientX/Y\n\t\t\tclientX: x,\n\t\t\tclientY: y,\n\t\t\tpointerId: 1234567890, // a special value so other code can detect these simulated events\n\t\t\tpointerType: \"mouse\",\n\t\t\tisPrimary: true,\n\t\t};\n\t};\n\tlet last_el_over = null;\n\tTrackyMouse.onPointerMove = (x, y) => {\n\t\tconst target = document.elementFromPoint(x, y) || document.body;\n\t\tif (target !== last_el_over) {\n\t\t\tif (last_el_over) {\n\t\t\t\tconst event = new PointerEvent(\"pointerleave\", Object.assign(getEventOptions({ x, y }), {\n\t\t\t\t\tbutton: 0,\n\t\t\t\t\tbuttons: 1,\n\t\t\t\t\tbubbles: false,\n\t\t\t\t\tcancelable: false,\n\t\t\t\t}));\n\t\t\t\tlast_el_over.dispatchEvent(event);\n\t\t\t}\n\t\t\tconst event = new PointerEvent(\"pointerenter\", Object.assign(getEventOptions({ x, y }), {\n\t\t\t\tbutton: 0,\n\t\t\t\tbuttons: 1,\n\t\t\t\tbubbles: false,\n\t\t\t\tcancelable: false,\n\t\t\t}));\n\t\t\ttarget.dispatchEvent(event);\n\t\t\tlast_el_over = target;\n\t\t}\n\t\tconst event = new PointerEvent(\"pointermove\", Object.assign(getEventOptions({ x, y }), {\n\t\t\tbutton: 0,\n\t\t\tbuttons: 1,\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t}));\n\t\ttarget.dispatchEvent(event);\n\t};\n});\n```\n\n### `TrackyMouse.dependenciesRoot`\n\nSet this to the path to the folder where you installed tracky-mouse, without a trailing slash.\n\n### `TrackyMouse.loadDependencies([options])`\n\nThis loads dependencies needed *for head tracking*. (It is not needed for dwell clicking.)\n\nIf you pass an options object, it can have the following properties:\n- `statsJs` (optional): a boolean, whether to load stats.js for performance monitoring. Default is `false`.\n\nReturns a promise that resolves when the dependencies are loaded.\n\n### `TrackyMouse.init([element, options])`\n\n`TrackyMouse.init` initializes the library *for head tracking*. (It is not needed for dwell clicking.)\n\nIt creates the UI, either creating a new `<div class=\"tracky-mouse-ui\">` element and appending it to the `<body>`,\nor using, and modifying, and existing element.\n\nIf you pass an element, it should be an empty `<div>` element.\nIt will add `class=\"tracky-mouse-ui\"` directly to the element if it doesn't already have it.\n\nIf you pass an options object, it can have the following properties:\n- `statsJs` (optional): a boolean, whether to include the stats.js performance monitor. Default is `false`.\n\nReturns an object with a `dispose` method that you can call to remove the UI and clean up the web worker and camera stream.\n\n*(Search keywords: disposal, destroy, teardown, cleanup, clean-up, clean up, deinitialize, de-initialize, remove, stop, end)* - see return value\n\n### `TrackyMouse.useCamera()`\n\nThis requests permission to use the camera, and starts the camera stream.\n\nThis is optional, and you can instead let the user click the big \"Allow Camera Access\" button.\n\n### `TrackyMouse.onPointerMove(x, y)`\n\nThis is the callback that you need to define to simulate pointer movement.\n\n`x` and `y` are the current mouse position, in pixels.\n\n## Dwell Clicking\n\n### `TrackyMouse.initDwellClicking(config)`\n\nThis starts up the dwell clicker.\n\nArguments:\n- `config.targets` (required): a CSS selector for the elements to click. Anything else will be ignored.\n- `config.shouldDrag(el)` (optional): a function that returns true if the element should be dragged rather than simply clicked.\n- `config.noCenter(el)` (optional): a function that returns true if the element should be clicked anywhere on the element, rather than always at the center.\n- `config.retarget` (optional): an array of `{ from, to, withinMargin }` objects, which define rules for dynamically changing what is hovered/clicked when the mouse is over a different element.\n\t- `from` (required): the element to retarget from. Can be a CSS selector, an element, or a function taking the element under the mouse and returning whether it should be retargeted.\n\t- `to` (required): the element to retarget to. Can be a CSS selector for an element which is an ancestor or descendant of the `from` element, or an element, or a function taking the element under the mouse and returning an element to retarget to, or null to ignore the element.\n\t- `withinMargin` (optional): a number of pixels within which to consider the mouse over the `to` element. Default to infinity.\n- `config.isEquivalentTarget(el1, el2)` (optional): a function that returns true if two elements should be considered part of the same control, i.e. if clicking either should do the same thing. Elements that are equal are always considered equivalent even if you return false. This option is used for preventing the system from detecting occluding elements as separate controls, and rejecting the click. (When an occlusion is detected, it flashes a red box.)\n- `config.dwellClickEvenIfPaused(el)` (optional): a function that returns true if the element should be clicked even while dwell clicking is otherwise paused. Use this for a dwell clicking toggle button, so it's possible to resume dwell clicking. With dwell clicking it's important to let users take a break, since otherwise you have to constantly move the cursor in order to not click on things!\n- `config.click({x, y, target})` (required): a function to trigger a click on the given target element.\n- `config.beforeDispatch()` (optional): a function to call before a pointer event is dispatched. For detecting un-trusted user gestures, outside of an event handler.\n- `config.afterDispatch()` (optional): a function to call after a pointer event is dispatched. For detecting un-trusted user gestures, outside of an event handler.\n- `config.beforePointerDownDispatch()` (optional): a function to call before a `pointerdown` event is dispatched. Likely to be merged with `config.beforeDispatch()` in the future.\n- `config.afterReleaseDrag()` (optional): a function to call after a drag is released. May be merged with `config.afterDispatch()` in the future.\n\nReturns an object with the following properties:\n- `paused`: a getter/setter for whether dwell clicking is paused. Use this to implement a pause/resume button, in conjunction with `config.dwellClickEvenIfPaused`.\n- `dispose`: a method to clean up the dwell clicker.  \n  *(Search keywords: disposal, destroy, teardown, cleanup, clean-up, clean up, deinitialize, de-initialize, remove, stop, end)*\n\nExample:\n```javascript\n// This example is based off of how JS Paint uses the Tracky Mouse API.\n// It's simplified a bit, but includes various settings.\nconst config = {\n\t// The elements to click. Anything else is ignored.\n\ttargets: `\n\t\tbutton:not([disabled]),\n\t\tinput,\n\t\ttextarea,\n\t\tlabel,\n\t\ta,\n\t\tdetails summary,\n\t\t.radio-or-checkbox-wrapper,\n\t\t.drawing-canvas,\n\t\t.window:not(.maximized) .window-titlebar\n\t`,\n\t// Filter for elements to drag. They must be included in the targets first.\n\tshouldDrag: (target) => (\n\t\ttarget.matches(\".window-titlebar\") ||\n\t\t(target.matches(\".drawing-canvas\") && current_tool.supports_drag)\n\t),\n\t// Instead of clicking in the center of these elements, click at any point within the element.\n\t// This is useful for drag offsets, like for a window titlebar,\n\t// and position-based inputs like sliders or color pickers, or a drawing canvas.\n\tnoCenter: (target) => (\n\t\ttarget.matches(`\n\t\t\tinput[type=\"range\"],\n\t\t\t.drawing-canvas,\n\t\t\t.window-titlebar\n\t\t`)\n\t),\n\t// Nudge hovers near the edges of an element onto the element itself,\n\t// to make it easier to click on the element.\n\t// More specifically it makes it easier to click on the edge of an element,\n\t// useful for a drawing canvas.\n\tretarget: [\n\t\t{ from: \".canvas-container\", to: \".drawing-canvas\", withinMargin: 50 },\n\t],\n\t// Elements that are equivalent are considered the same control.\n\t// This is useful for forms if you want the label of a radio button or checkbox\n\t// to be highlighted together with the radio button or checkbox.\n\tisEquivalentTarget: (apparent_hover_target, hover_target) => (\n\t\tapparent_hover_target.closest(\"label\") === hover_target ||\n\t\tapparent_hover_target.closest(\".radio-or-checkbox-wrapper\") === hover_target\n\t),\n\t// Allow dwell clicking on a \"Resume Dwell Clicking\" button, while paused.\n\tdwellClickEvenIfPaused: (target) => (\n\t\ttarget.matches(\".toggle-dwell-clicking-button\")\n\t),\n\t// Define how to click on an element.\n\tclick: ({ target, x, y }) => {\n\t\tif (target.matches(\"input[type='range']\")) {\n\t\t\t// Special handling for sliders\n\t\t\tconst rect = target.getBoundingClientRect();\n\t\t\tconst vertical =\n\t\t\t\ttarget.getAttribute(\"orient\") === \"vertical\" ||\n\t\t\t\t(getCurrentRotation(target) !== 0) ||\n\t\t\t\trect.height > rect.width;\n\t\t\tconst min = Number(target.min);\n\t\t\tconst max = Number(target.max);\n\t\t\ttarget.value = (\n\t\t\t\tvertical ?\n\t\t\t\t\t(y - rect.top) / rect.height :\n\t\t\t\t\t(x - rect.left) / rect.width\n\t\t\t) * (max - min) + min;\n\t\t\ttarget.dispatchEvent(new Event(\"input\", { bubbles: true }));\n\t\t\ttarget.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\t\t} else {\n\t\t\t// Normal click\n\t\t\ttarget.click();\n\t\t\tif (target.matches(\"input, textarea\")) {\n\t\t\t\ttarget.focus();\n\t\t\t}\n\t\t}\n\t},\n\t// Handle untrusted gestures specially in external code.\n\t// Somewhere else, for example, you might do something like:\n\t// if (window.untrusted_gesture) {\n\t// \t// show download window\n\t// } else {\n\t// \t// show save file dialog with FS Access API\n\t// }\n\t// Recommended: use `event.isTrusted` instead, where possible.\n\tbeforeDispatch: () => { window.untrusted_gesture = true; },\n\tafterDispatch: () => { window.untrusted_gesture = false; },\n\t// Some extra hooks for JS Paint, likely to be generalized in the future,\n\t// especially `beforePointerDownDispatch` which could be supplanted by passing an `Event` to `beforeDispatch`.\n\tbeforePointerDownDispatch: () => { window.pointers = []; },\n\tafterReleaseDrag: () => { window.pointers = []; },\n};\nconst dwellClicker = TrackyMouse.initDwellClicking(config);\n// dwellClicker.paused = !dwellClicker.paused; // toggle\n// dwellClicker.dispose(); // clean up\n\n// Source: https://stackoverflow.com/a/54492696/2624876\nfunction getCurrentRotation(el) {\n\tconst st = window.getComputedStyle(el, null);\n\tconst tm = st.getPropertyValue(\"-webkit-transform\") ||\n\t\tst.getPropertyValue(\"-moz-transform\") ||\n\t\tst.getPropertyValue(\"-ms-transform\") ||\n\t\tst.getPropertyValue(\"-o-transform\") ||\n\t\tst.getPropertyValue(\"transform\") ||\n\t\t\"none\";\n\tif (tm !== \"none\") {\n\t\tconst [a, b] = tm.split('(')[1].split(')')[0].split(',');\n\t\treturn Math.round(Math.atan2(a, b) * (180 / Math.PI));\n\t}\n\treturn 0;\n}\n```\n\n### `TrackyMouse.cleanupDwellClicking()`\n\n**Deprecated**: instead call `dispose()` on the object returned from `initDwellClicking()`.\n\nThis stops the dwell clicker.\n\n## Changelog\n\nFor release notes, see [CHANGELOG.md](https://github.com/1j01/tracky-mouse/blob/main/CHANGELOG.md)\n\n## License\n\n[MIT License](https://github.com/1j01/tracky-mouse/blob/main/LICENSE.txt)\n\n## Development\n\nSee [Development Setup](https://github.com/1j01/tracky-mouse#development-setup) in the main README.\n"
  },
  {
    "path": "lib/tracky-mouse/core/facemesh.worker.js",
    "content": "/* global tf, facemesh, importScripts */\nimportScripts('lib/tf.js');\nimportScripts('lib/facemesh/facemesh.js');\n\n// Don't use CPU backend for facemesh.\n// It's too slow to be useful, without advanced time travel technology. (I have dabbled in time travel, but not cracked it.)\n// If the facemesh worker fails to get a WebGL context, it's better that we keep using clmTracker.\n// tf.setBackend('cpu');\ntf.setBackend('webgl').then((success) => {\n\tif (!success) {\n\t\tconsole.log(\"tf.setBackend('webgl') failed\");\n\t\tclose();\n\t}\n}, (error) => {\n\tconsole.log(\"tf.setBackend('webgl') error\", error);\n\tclose();\n});\n\nvar facemeshTensorFlowModel;\n\nonmessage = (e) => {\n\t// console.log('Message received from main script', e.data);\n\tif (e.data.type === \"LOAD\") {\n\t\tfacemesh.load(e.data.options).then((model) => {\n\t\t\tfacemeshTensorFlowModel = model;\n\t\t\tpostMessage({ type: \"LOADED\" });\n\t\t});\n\t} else if (e.data.type === \"ESTIMATE_FACES\") {\n\t\tfacemeshTensorFlowModel.estimateFaces(e.data.imageData).then((predictions) => {\n\t\t\tpostMessage({ type: \"ESTIMATED_FACES\", predictions });\n\t\t}, (error) => {\n\t\t\tconsole.log(error);\n\t\t});\n\t}\n};\n"
  },
  {
    "path": "lib/tracky-mouse/core/lib/clmtrackr.js",
    "content": "// MODIFIED clmtrackr.js\n// Ctrl+F \"PATCHED IN\" for modifications\n// Original: https://github.com/auduno/clmtrackr/blob/0c702208c70ea19ca0cb8c8ca603a86c45db141f/build/clmtrackr.js\n\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.clm = factory());\n}(this, (function () { 'use strict';\n\n// PATCHED IN\n// See eval-is-evil.html which generates no-eval.js\n// These replacements allow the code to work without eval.\n// Have to rename `eval` because in strict mode it's a syntax error to assign to the name \"eval\"\n// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode#syntax_errors\n// (I would call it \"evalSafe\" except it's falling back to the regular `eval`.)\n// (Or I might remove 'use strict' except for the fact that strict mode\n// affects semantics of `this` and other things in subtle ways,\n// and may cause bugs that are hard to track down if the whole library was\n// built and tested using strict mode.)\nconst { eval: evalFn, Function } = globalThis.ClmtrackrAntiEval ?? globalThis;\n\nvar commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n\n\n\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar numeric1_2_6 = createCommonjsModule(function (module, exports) {\n\"use strict\";\n\nvar numeric = exports;\nif(typeof commonjsGlobal !== \"undefined\") { commonjsGlobal.numeric = numeric; }\n\nnumeric.version = \"1.2.6\";\n\n// 1. Utility functions\nnumeric.bench = function bench (f,interval) {\n    var t1,t2,n,i;\n    if(typeof interval === \"undefined\") { interval = 15; }\n    n = 0.5;\n    t1 = new Date();\n    while(1) {\n        n*=2;\n        for(i=n;i>3;i-=4) { f(); f(); f(); f(); }\n        while(i>0) { f(); i--; }\n        t2 = new Date();\n        if(t2-t1 > interval) break;\n    }\n    for(i=n;i>3;i-=4) { f(); f(); f(); f(); }\n    while(i>0) { f(); i--; }\n    t2 = new Date();\n    return 1000*(3*n-1)/(t2-t1);\n};\n\nnumeric._myIndexOf = (function _myIndexOf(w) {\n    var n = this.length,k;\n    for(k=0;k<n;++k) if(this[k]===w) return k;\n    return -1;\n});\nnumeric.myIndexOf = (Array.prototype.indexOf)?Array.prototype.indexOf:numeric._myIndexOf;\n\nnumeric.Function = Function;\nnumeric.precision = 4;\nnumeric.largeArray = 50;\n\nnumeric.prettyPrint = function prettyPrint(x) {\n    function fmtnum(x) {\n        if(x === 0) { return '0'; }\n        if(isNaN(x)) { return 'NaN'; }\n        if(x<0) { return '-'+fmtnum(-x); }\n        if(isFinite(x)) {\n            var scale = Math.floor(Math.log(x) / Math.log(10));\n            var normalized = x / Math.pow(10,scale);\n            var basic = normalized.toPrecision(numeric.precision);\n            if(parseFloat(basic) === 10) { scale++; normalized = 1; basic = normalized.toPrecision(numeric.precision); }\n            return parseFloat(basic).toString()+'e'+scale.toString();\n        }\n        return 'Infinity';\n    }\n    var ret = [];\n    function foo(x) {\n        var k;\n        if(typeof x === \"undefined\") { ret.push(Array(numeric.precision+8).join(' ')); return false; }\n        if(typeof x === \"string\") { ret.push('\"'+x+'\"'); return false; }\n        if(typeof x === \"boolean\") { ret.push(x.toString()); return false; }\n        if(typeof x === \"number\") {\n            var a = fmtnum(x);\n            var b = x.toPrecision(numeric.precision);\n            var c = parseFloat(x.toString()).toString();\n            var d = [a,b,c,parseFloat(b).toString(),parseFloat(c).toString()];\n            for(k=1;k<d.length;k++) { if(d[k].length < a.length) a = d[k]; }\n            ret.push(Array(numeric.precision+8-a.length).join(' ')+a);\n            return false;\n        }\n        if(x === null) { ret.push(\"null\"); return false; }\n        if(typeof x === \"function\") { \n            ret.push(x.toString());\n            var flag = false;\n            for(k in x) { if(x.hasOwnProperty(k)) { \n                if(flag) ret.push(',\\n');\n                else ret.push('\\n{');\n                flag = true; \n                ret.push(k); \n                ret.push(': \\n'); \n                foo(x[k]); \n            } }\n            if(flag) ret.push('}\\n');\n            return true;\n        }\n        if(x instanceof Array) {\n            if(x.length > numeric.largeArray) { ret.push('...Large Array...'); return true; }\n            var flag = false;\n            ret.push('[');\n            for(k=0;k<x.length;k++) { if(k>0) { ret.push(','); if(flag) ret.push('\\n '); } flag = foo(x[k]); }\n            ret.push(']');\n            return true;\n        }\n        ret.push('{');\n        var flag = false;\n        for(k in x) { if(x.hasOwnProperty(k)) { if(flag) ret.push(',\\n'); flag = true; ret.push(k); ret.push(': \\n'); foo(x[k]); } }\n        ret.push('}');\n        return true;\n    }\n    foo(x);\n    return ret.join('');\n};\n\nnumeric.parseDate = function parseDate(d) {\n    function foo(d) {\n        if(typeof d === 'string') { return Date.parse(d.replace(/-/g,'/')); }\n        if(!(d instanceof Array)) { throw new Error(\"parseDate: parameter must be arrays of strings\"); }\n        var ret = [],k;\n        for(k=0;k<d.length;k++) { ret[k] = foo(d[k]); }\n        return ret;\n    }\n    return foo(d);\n};\n\nnumeric.parseFloat = function parseFloat_(d) {\n    function foo(d) {\n        if(typeof d === 'string') { return parseFloat(d); }\n        if(!(d instanceof Array)) { throw new Error(\"parseFloat: parameter must be arrays of strings\"); }\n        var ret = [],k;\n        for(k=0;k<d.length;k++) { ret[k] = foo(d[k]); }\n        return ret;\n    }\n    return foo(d);\n};\n\nnumeric.parseCSV = function parseCSV(t) {\n    var foo = t.split('\\n');\n    var j,k;\n    var ret = [];\n    var pat = /(([^'\",]*)|('[^']*')|(\"[^\"]*\")),/g;\n    var patnum = /^\\s*(([+-]?[0-9]+(\\.[0-9]*)?(e[+-]?[0-9]+)?)|([+-]?[0-9]*(\\.[0-9]+)?(e[+-]?[0-9]+)?))\\s*$/;\n    var stripper = function(n) { return n.substr(0,n.length-1); };\n    var count = 0;\n    for(k=0;k<foo.length;k++) {\n      var bar = (foo[k]+\",\").match(pat),baz;\n      if(bar.length>0) {\n          ret[count] = [];\n          for(j=0;j<bar.length;j++) {\n              baz = stripper(bar[j]);\n              if(patnum.test(baz)) { ret[count][j] = parseFloat(baz); }\n              else ret[count][j] = baz;\n          }\n          count++;\n      }\n    }\n    return ret;\n};\n\nnumeric.toCSV = function toCSV(A) {\n    var s = numeric.dim(A);\n    var i,j,m,n,row,ret;\n    m = s[0];\n    n = s[1];\n    ret = [];\n    for(i=0;i<m;i++) {\n        row = [];\n        for(j=0;j<m;j++) { row[j] = A[i][j].toString(); }\n        ret[i] = row.join(', ');\n    }\n    return ret.join('\\n')+'\\n';\n};\n\nnumeric.getURL = function getURL(url) {\n    var client = new XMLHttpRequest();\n    client.open(\"GET\",url,false);\n    client.send();\n    return client;\n};\n\nnumeric.imageURL = function imageURL(img) {\n    function base64(A) {\n        var n = A.length, i,x,y,z,p,q,r,s;\n        var key = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n        var ret = \"\";\n        for(i=0;i<n;i+=3) {\n            x = A[i];\n            y = A[i+1];\n            z = A[i+2];\n            p = x >> 2;\n            q = ((x & 3) << 4) + (y >> 4);\n            r = ((y & 15) << 2) + (z >> 6);\n            s = z & 63;\n            if(i+1>=n) { r = s = 64; }\n            else if(i+2>=n) { s = 64; }\n            ret += key.charAt(p) + key.charAt(q) + key.charAt(r) + key.charAt(s);\n            }\n        return ret;\n    }\n    function crc32Array (a,from,to) {\n        if(typeof from === \"undefined\") { from = 0; }\n        if(typeof to === \"undefined\") { to = a.length; }\n        var table = [0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,\n                     0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, \n                     0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,\n                     0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, \n                     0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, \n                     0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, \n                     0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,\n                     0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,\n                     0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,\n                     0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, \n                     0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, \n                     0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, \n                     0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, \n                     0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, \n                     0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, \n                     0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, \n                     0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, \n                     0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, \n                     0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, \n                     0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, \n                     0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, \n                     0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, \n                     0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, \n                     0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, \n                     0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, \n                     0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, \n                     0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, \n                     0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, \n                     0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, \n                     0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, \n                     0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, \n                     0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D];\n     \n        var crc = -1, y = 0, n = a.length,i;\n\n        for (i = from; i < to; i++) {\n            y = (crc ^ a[i]) & 0xFF;\n            crc = (crc >>> 8) ^ table[y];\n        }\n     \n        return crc ^ (-1);\n    }\n\n    var h = img[0].length, w = img[0][0].length, s1, s2, next,k,length,a,b,i,j,adler32,crc32;\n    var stream = [\n                  137, 80, 78, 71, 13, 10, 26, 10,                           //  0: PNG signature\n                  0,0,0,13,                                                  //  8: IHDR Chunk length\n                  73, 72, 68, 82,                                            // 12: \"IHDR\" \n                  (w >> 24) & 255, (w >> 16) & 255, (w >> 8) & 255, w&255,   // 16: Width\n                  (h >> 24) & 255, (h >> 16) & 255, (h >> 8) & 255, h&255,   // 20: Height\n                  8,                                                         // 24: bit depth\n                  2,                                                         // 25: RGB\n                  0,                                                         // 26: deflate\n                  0,                                                         // 27: no filter\n                  0,                                                         // 28: no interlace\n                  -1,-2,-3,-4,                                               // 29: CRC\n                  -5,-6,-7,-8,                                               // 33: IDAT Chunk length\n                  73, 68, 65, 84,                                            // 37: \"IDAT\"\n                  // RFC 1950 header starts here\n                  8,                                                         // 41: RFC1950 CMF\n                  29                                                         // 42: RFC1950 FLG\n                  ];\n    crc32 = crc32Array(stream,12,29);\n    stream[29] = (crc32>>24)&255;\n    stream[30] = (crc32>>16)&255;\n    stream[31] = (crc32>>8)&255;\n    stream[32] = (crc32)&255;\n    s1 = 1;\n    s2 = 0;\n    for(i=0;i<h;i++) {\n        if(i<h-1) { stream.push(0); }\n        else { stream.push(1); }\n        a = (3*w+1+(i===0))&255; b = ((3*w+1+(i===0))>>8)&255;\n        stream.push(a); stream.push(b);\n        stream.push((~a)&255); stream.push((~b)&255);\n        if(i===0) stream.push(0);\n        for(j=0;j<w;j++) {\n            for(k=0;k<3;k++) {\n                a = img[k][i][j];\n                if(a>255) a = 255;\n                else if(a<0) a=0;\n                else a = Math.round(a);\n                s1 = (s1 + a )%65521;\n                s2 = (s2 + s1)%65521;\n                stream.push(a);\n            }\n        }\n        stream.push(0);\n    }\n    adler32 = (s2<<16)+s1;\n    stream.push((adler32>>24)&255);\n    stream.push((adler32>>16)&255);\n    stream.push((adler32>>8)&255);\n    stream.push((adler32)&255);\n    length = stream.length - 41;\n    stream[33] = (length>>24)&255;\n    stream[34] = (length>>16)&255;\n    stream[35] = (length>>8)&255;\n    stream[36] = (length)&255;\n    crc32 = crc32Array(stream,37);\n    stream.push((crc32>>24)&255);\n    stream.push((crc32>>16)&255);\n    stream.push((crc32>>8)&255);\n    stream.push((crc32)&255);\n    stream.push(0);\n    stream.push(0);\n    stream.push(0);\n    stream.push(0);\n//    a = stream.length;\n    stream.push(73);  // I\n    stream.push(69);  // E\n    stream.push(78);  // N\n    stream.push(68);  // D\n    stream.push(174); // CRC1\n    stream.push(66);  // CRC2\n    stream.push(96);  // CRC3\n    stream.push(130); // CRC4\n    return 'data:image/png;base64,'+base64(stream);\n};\n\n// 2. Linear algebra with Arrays.\nnumeric._dim = function _dim(x) {\n    var ret = [];\n    while(typeof x === \"object\") { ret.push(x.length); x = x[0]; }\n    return ret;\n};\n\nnumeric.dim = function dim(x) {\n    var y,z;\n    if(typeof x === \"object\") {\n        y = x[0];\n        if(typeof y === \"object\") {\n            z = y[0];\n            if(typeof z === \"object\") {\n                return numeric._dim(x);\n            }\n            return [x.length,y.length];\n        }\n        return [x.length];\n    }\n    return [];\n};\n\nnumeric.mapreduce = function mapreduce(body,init) {\n    return Function('x','accum','_s','_k',\n            'if(typeof accum === \"undefined\") accum = '+init+';\\n'+\n            'if(typeof x === \"number\") { var xi = x; '+body+'; return accum; }\\n'+\n            'if(typeof _s === \"undefined\") _s = numeric.dim(x);\\n'+\n            'if(typeof _k === \"undefined\") _k = 0;\\n'+\n            'var _n = _s[_k];\\n'+\n            'var i,xi;\\n'+\n            'if(_k < _s.length-1) {\\n'+\n            '    for(i=_n-1;i>=0;i--) {\\n'+\n            '        accum = arguments.callee(x[i],accum,_s,_k+1);\\n'+\n            '    }'+\n            '    return accum;\\n'+\n            '}\\n'+\n            'for(i=_n-1;i>=1;i-=2) { \\n'+\n            '    xi = x[i];\\n'+\n            '    '+body+';\\n'+\n            '    xi = x[i-1];\\n'+\n            '    '+body+';\\n'+\n            '}\\n'+\n            'if(i === 0) {\\n'+\n            '    xi = x[i];\\n'+\n            '    '+body+'\\n'+\n            '}\\n'+\n            'return accum;'\n            );\n};\nnumeric.mapreduce2 = function mapreduce2(body,setup) {\n    return Function('x',\n            'var n = x.length;\\n'+\n            'var i,xi;\\n'+setup+';\\n'+\n            'for(i=n-1;i!==-1;--i) { \\n'+\n            '    xi = x[i];\\n'+\n            '    '+body+';\\n'+\n            '}\\n'+\n            'return accum;'\n            );\n};\n\n\nnumeric.same = function same(x,y) {\n    var i,n;\n    if(!(x instanceof Array) || !(y instanceof Array)) { return false; }\n    n = x.length;\n    if(n !== y.length) { return false; }\n    for(i=0;i<n;i++) {\n        if(x[i] === y[i]) { continue; }\n        if(typeof x[i] === \"object\") { if(!same(x[i],y[i])) return false; }\n        else { return false; }\n    }\n    return true;\n};\n\nnumeric.rep = function rep(s,v,k) {\n    if(typeof k === \"undefined\") { k=0; }\n    var n = s[k], ret = Array(n), i;\n    if(k === s.length-1) {\n        for(i=n-2;i>=0;i-=2) { ret[i+1] = v; ret[i] = v; }\n        if(i===-1) { ret[0] = v; }\n        return ret;\n    }\n    for(i=n-1;i>=0;i--) { ret[i] = numeric.rep(s,v,k+1); }\n    return ret;\n};\n\n\nnumeric.dotMMsmall = function dotMMsmall(x,y) {\n    var i,j,k,p,q,r,ret,foo,bar,woo,i0,k0,p0,r0;\n    p = x.length; q = y.length; r = y[0].length;\n    ret = Array(p);\n    for(i=p-1;i>=0;i--) {\n        foo = Array(r);\n        bar = x[i];\n        for(k=r-1;k>=0;k--) {\n            woo = bar[q-1]*y[q-1][k];\n            for(j=q-2;j>=1;j-=2) {\n                i0 = j-1;\n                woo += bar[j]*y[j][k] + bar[i0]*y[i0][k];\n            }\n            if(j===0) { woo += bar[0]*y[0][k]; }\n            foo[k] = woo;\n        }\n        ret[i] = foo;\n    }\n    return ret;\n};\nnumeric._getCol = function _getCol(A,j,x) {\n    var n = A.length, i;\n    for(i=n-1;i>0;--i) {\n        x[i] = A[i][j];\n        --i;\n        x[i] = A[i][j];\n    }\n    if(i===0) x[0] = A[0][j];\n};\nnumeric.dotMMbig = function dotMMbig(x,y){\n    var gc = numeric._getCol, p = y.length, v = Array(p);\n    var m = x.length, n = y[0].length, A = new Array(m), xj;\n    var VV = numeric.dotVV;\n    var i,j,k,z;\n    --p;\n    --m;\n    for(i=m;i!==-1;--i) A[i] = Array(n);\n    --n;\n    for(i=n;i!==-1;--i) {\n        gc(y,i,v);\n        for(j=m;j!==-1;--j) {\n            z=0;\n            xj = x[j];\n            A[j][i] = VV(xj,v);\n        }\n    }\n    return A;\n};\n\nnumeric.dotMV = function dotMV(x,y) {\n    var p = x.length, q = y.length,i;\n    var ret = Array(p), dotVV = numeric.dotVV;\n    for(i=p-1;i>=0;i--) { ret[i] = dotVV(x[i],y); }\n    return ret;\n};\n\nnumeric.dotVM = function dotVM(x,y) {\n    var i,j,k,p,q,r,ret,foo,bar,woo,i0,k0,p0,r0,s1,s2,s3,baz,accum;\n    p = x.length; q = y[0].length;\n    ret = Array(q);\n    for(k=q-1;k>=0;k--) {\n        woo = x[p-1]*y[p-1][k];\n        for(j=p-2;j>=1;j-=2) {\n            i0 = j-1;\n            woo += x[j]*y[j][k] + x[i0]*y[i0][k];\n        }\n        if(j===0) { woo += x[0]*y[0][k]; }\n        ret[k] = woo;\n    }\n    return ret;\n};\n\nnumeric.dotVV = function dotVV(x,y) {\n    var i,n=x.length,i1,ret = x[n-1]*y[n-1];\n    for(i=n-2;i>=1;i-=2) {\n        i1 = i-1;\n        ret += x[i]*y[i] + x[i1]*y[i1];\n    }\n    if(i===0) { ret += x[0]*y[0]; }\n    return ret;\n};\n\nnumeric.dot = function dot(x,y) {\n    var d = numeric.dim;\n    switch(d(x).length*1000+d(y).length) {\n    case 2002:\n        if(y.length < 10) return numeric.dotMMsmall(x,y);\n        else return numeric.dotMMbig(x,y);\n    case 2001: return numeric.dotMV(x,y);\n    case 1002: return numeric.dotVM(x,y);\n    case 1001: return numeric.dotVV(x,y);\n    case 1000: return numeric.mulVS(x,y);\n    case 1: return numeric.mulSV(x,y);\n    case 0: return x*y;\n    default: throw new Error('numeric.dot only works on vectors and matrices');\n    }\n};\n\nnumeric.diag = function diag(d) {\n    var i,i1,j,n = d.length, A = Array(n), Ai;\n    for(i=n-1;i>=0;i--) {\n        Ai = Array(n);\n        i1 = i+2;\n        for(j=n-1;j>=i1;j-=2) {\n            Ai[j] = 0;\n            Ai[j-1] = 0;\n        }\n        if(j>i) { Ai[j] = 0; }\n        Ai[i] = d[i];\n        for(j=i-1;j>=1;j-=2) {\n            Ai[j] = 0;\n            Ai[j-1] = 0;\n        }\n        if(j===0) { Ai[0] = 0; }\n        A[i] = Ai;\n    }\n    return A;\n};\nnumeric.getDiag = function(A) {\n    var n = Math.min(A.length,A[0].length),i,ret = Array(n);\n    for(i=n-1;i>=1;--i) {\n        ret[i] = A[i][i];\n        --i;\n        ret[i] = A[i][i];\n    }\n    if(i===0) {\n        ret[0] = A[0][0];\n    }\n    return ret;\n};\n\nnumeric.identity = function identity(n) { return numeric.diag(numeric.rep([n],1)); };\nnumeric.pointwise = function pointwise(params,body,setup) {\n    if(typeof setup === \"undefined\") { setup = \"\"; }\n    var fun = [];\n    var k;\n    var avec = /\\[i\\]$/,p,thevec = '';\n    var haveret = false;\n    for(k=0;k<params.length;k++) {\n        if(avec.test(params[k])) {\n            p = params[k].substring(0,params[k].length-3);\n            thevec = p;\n        } else { p = params[k]; }\n        if(p==='ret') haveret = true;\n        fun.push(p);\n    }\n    fun[params.length] = '_s';\n    fun[params.length+1] = '_k';\n    fun[params.length+2] = (\n            'if(typeof _s === \"undefined\") _s = numeric.dim('+thevec+');\\n'+\n            'if(typeof _k === \"undefined\") _k = 0;\\n'+\n            'var _n = _s[_k];\\n'+\n            'var i'+(haveret?'':', ret = Array(_n)')+';\\n'+\n            'if(_k < _s.length-1) {\\n'+\n            '    for(i=_n-1;i>=0;i--) ret[i] = arguments.callee('+params.join(',')+',_s,_k+1);\\n'+\n            '    return ret;\\n'+\n            '}\\n'+\n            setup+'\\n'+\n            'for(i=_n-1;i!==-1;--i) {\\n'+\n            '    '+body+'\\n'+\n            '}\\n'+\n            'return ret;'\n            );\n    return Function.apply(null,fun);\n};\nnumeric.pointwise2 = function pointwise2(params,body,setup) {\n    if(typeof setup === \"undefined\") { setup = \"\"; }\n    var fun = [];\n    var k;\n    var avec = /\\[i\\]$/,p,thevec = '';\n    var haveret = false;\n    for(k=0;k<params.length;k++) {\n        if(avec.test(params[k])) {\n            p = params[k].substring(0,params[k].length-3);\n            thevec = p;\n        } else { p = params[k]; }\n        if(p==='ret') haveret = true;\n        fun.push(p);\n    }\n    fun[params.length] = (\n            'var _n = '+thevec+'.length;\\n'+\n            'var i'+(haveret?'':', ret = Array(_n)')+';\\n'+\n            setup+'\\n'+\n            'for(i=_n-1;i!==-1;--i) {\\n'+\n            body+'\\n'+\n            '}\\n'+\n            'return ret;'\n            );\n    return Function.apply(null,fun);\n};\nnumeric._biforeach = (function _biforeach(x,y,s,k,f) {\n    if(k === s.length-1) { f(x,y); return; }\n    var i,n=s[k];\n    for(i=n-1;i>=0;i--) { _biforeach(typeof x===\"object\"?x[i]:x,typeof y===\"object\"?y[i]:y,s,k+1,f); }\n});\nnumeric._biforeach2 = (function _biforeach2(x,y,s,k,f) {\n    if(k === s.length-1) { return f(x,y); }\n    var i,n=s[k],ret = Array(n);\n    for(i=n-1;i>=0;--i) { ret[i] = _biforeach2(typeof x===\"object\"?x[i]:x,typeof y===\"object\"?y[i]:y,s,k+1,f); }\n    return ret;\n});\nnumeric._foreach = (function _foreach(x,s,k,f) {\n    if(k === s.length-1) { f(x); return; }\n    var i,n=s[k];\n    for(i=n-1;i>=0;i--) { _foreach(x[i],s,k+1,f); }\n});\nnumeric._foreach2 = (function _foreach2(x,s,k,f) {\n    if(k === s.length-1) { return f(x); }\n    var i,n=s[k], ret = Array(n);\n    for(i=n-1;i>=0;i--) { ret[i] = _foreach2(x[i],s,k+1,f); }\n    return ret;\n});\n\n/*numeric.anyV = numeric.mapreduce('if(xi) return true;','false');\nnumeric.allV = numeric.mapreduce('if(!xi) return false;','true');\nnumeric.any = function(x) { if(typeof x.length === \"undefined\") return x; return numeric.anyV(x); }\nnumeric.all = function(x) { if(typeof x.length === \"undefined\") return x; return numeric.allV(x); }*/\n\nnumeric.ops2 = {\n        add: '+',\n        sub: '-',\n        mul: '*',\n        div: '/',\n        mod: '%',\n        and: '&&',\n        or:  '||',\n        eq:  '===',\n        neq: '!==',\n        lt:  '<',\n        gt:  '>',\n        leq: '<=',\n        geq: '>=',\n        band: '&',\n        bor: '|',\n        bxor: '^',\n        lshift: '<<',\n        rshift: '>>',\n        rrshift: '>>>'\n};\nnumeric.opseq = {\n        addeq: '+=',\n        subeq: '-=',\n        muleq: '*=',\n        diveq: '/=',\n        modeq: '%=',\n        lshifteq: '<<=',\n        rshifteq: '>>=',\n        rrshifteq: '>>>=',\n        bandeq: '&=',\n        boreq: '|=',\n        bxoreq: '^='\n};\nnumeric.mathfuns = ['abs','acos','asin','atan','ceil','cos',\n                    'exp','floor','log','round','sin','sqrt','tan',\n                    'isNaN','isFinite'];\nnumeric.mathfuns2 = ['atan2','pow','max','min'];\nnumeric.ops1 = {\n        neg: '-',\n        not: '!',\n        bnot: '~',\n        clone: ''\n};\nnumeric.mapreducers = {\n        any: ['if(xi) return true;','var accum = false;'],\n        all: ['if(!xi) return false;','var accum = true;'],\n        sum: ['accum += xi;','var accum = 0;'],\n        prod: ['accum *= xi;','var accum = 1;'],\n        norm2Squared: ['accum += xi*xi;','var accum = 0;'],\n        norminf: ['accum = max(accum,abs(xi));','var accum = 0, max = Math.max, abs = Math.abs;'],\n        norm1: ['accum += abs(xi)','var accum = 0, abs = Math.abs;'],\n        sup: ['accum = max(accum,xi);','var accum = -Infinity, max = Math.max;'],\n        inf: ['accum = min(accum,xi);','var accum = Infinity, min = Math.min;']\n};\n\n(function () {\n    var i,o;\n    for(i=0;i<numeric.mathfuns2.length;++i) {\n        o = numeric.mathfuns2[i];\n        numeric.ops2[o] = o;\n    }\n    for(i in numeric.ops2) {\n        if(numeric.ops2.hasOwnProperty(i)) {\n            o = numeric.ops2[i];\n            var code, codeeq, setup = '';\n            if(numeric.myIndexOf.call(numeric.mathfuns2,i)!==-1) {\n                setup = 'var '+o+' = Math.'+o+';\\n';\n                code = function(r,x,y) { return r+' = '+o+'('+x+','+y+')'; };\n                codeeq = function(x,y) { return x+' = '+o+'('+x+','+y+')'; };\n            } else {\n                code = function(r,x,y) { return r+' = '+x+' '+o+' '+y; };\n                if(numeric.opseq.hasOwnProperty(i+'eq')) {\n                    codeeq = function(x,y) { return x+' '+o+'= '+y; };\n                } else {\n                    codeeq = function(x,y) { return x+' = '+x+' '+o+' '+y; };                    \n                }\n            }\n            numeric[i+'VV'] = numeric.pointwise2(['x[i]','y[i]'],code('ret[i]','x[i]','y[i]'),setup);\n            numeric[i+'SV'] = numeric.pointwise2(['x','y[i]'],code('ret[i]','x','y[i]'),setup);\n            numeric[i+'VS'] = numeric.pointwise2(['x[i]','y'],code('ret[i]','x[i]','y'),setup);\n            numeric[i] = Function(\n                    'var n = arguments.length, i, x = arguments[0], y;\\n'+\n                    'var VV = numeric.'+i+'VV, VS = numeric.'+i+'VS, SV = numeric.'+i+'SV;\\n'+\n                    'var dim = numeric.dim;\\n'+\n                    'for(i=1;i!==n;++i) { \\n'+\n                    '  y = arguments[i];\\n'+\n                    '  if(typeof x === \"object\") {\\n'+\n                    '      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\n'+\n                    '      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\n'+\n                    '  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\n'+\n                    '  else '+codeeq('x','y')+'\\n'+\n                    '}\\nreturn x;\\n');\n            numeric[o] = numeric[i];\n            numeric[i+'eqV'] = numeric.pointwise2(['ret[i]','x[i]'], codeeq('ret[i]','x[i]'),setup);\n            numeric[i+'eqS'] = numeric.pointwise2(['ret[i]','x'], codeeq('ret[i]','x'),setup);\n            numeric[i+'eq'] = Function(\n                    'var n = arguments.length, i, x = arguments[0], y;\\n'+\n                    'var V = numeric.'+i+'eqV, S = numeric.'+i+'eqS\\n'+\n                    'var s = numeric.dim(x);\\n'+\n                    'for(i=1;i!==n;++i) { \\n'+\n                    '  y = arguments[i];\\n'+\n                    '  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\\n'+\n                    '  else numeric._biforeach(x,y,s,0,S);\\n'+\n                    '}\\nreturn x;\\n');\n        }\n    }\n    for(i=0;i<numeric.mathfuns2.length;++i) {\n        o = numeric.mathfuns2[i];\n        delete numeric.ops2[o];\n    }\n    for(i=0;i<numeric.mathfuns.length;++i) {\n        o = numeric.mathfuns[i];\n        numeric.ops1[o] = o;\n    }\n    for(i in numeric.ops1) {\n        if(numeric.ops1.hasOwnProperty(i)) {\n            setup = '';\n            o = numeric.ops1[i];\n            if(numeric.myIndexOf.call(numeric.mathfuns,i)!==-1) {\n                if(Math.hasOwnProperty(o)) setup = 'var '+o+' = Math.'+o+';\\n';\n            }\n            numeric[i+'eqV'] = numeric.pointwise2(['ret[i]'],'ret[i] = '+o+'(ret[i]);',setup);\n            numeric[i+'eq'] = Function('x',\n                    'if(typeof x !== \"object\") return '+o+'x\\n'+\n                    'var i;\\n'+\n                    'var V = numeric.'+i+'eqV;\\n'+\n                    'var s = numeric.dim(x);\\n'+\n                    'numeric._foreach(x,s,0,V);\\n'+\n                    'return x;\\n');\n            numeric[i+'V'] = numeric.pointwise2(['x[i]'],'ret[i] = '+o+'(x[i]);',setup);\n            numeric[i] = Function('x',\n                    'if(typeof x !== \"object\") return '+o+'(x)\\n'+\n                    'var i;\\n'+\n                    'var V = numeric.'+i+'V;\\n'+\n                    'var s = numeric.dim(x);\\n'+\n                    'return numeric._foreach2(x,s,0,V);\\n');\n        }\n    }\n    for(i=0;i<numeric.mathfuns.length;++i) {\n        o = numeric.mathfuns[i];\n        delete numeric.ops1[o];\n    }\n    for(i in numeric.mapreducers) {\n        if(numeric.mapreducers.hasOwnProperty(i)) {\n            o = numeric.mapreducers[i];\n            numeric[i+'V'] = numeric.mapreduce2(o[0],o[1]);\n            numeric[i] = Function('x','s','k',\n                    o[1]+\n                    'if(typeof x !== \"object\") {'+\n                    '    xi = x;\\n'+\n                    o[0]+';\\n'+\n                    '    return accum;\\n'+\n                    '}'+\n                    'if(typeof s === \"undefined\") s = numeric.dim(x);\\n'+\n                    'if(typeof k === \"undefined\") k = 0;\\n'+\n                    'if(k === s.length-1) return numeric.'+i+'V(x);\\n'+\n                    'var xi;\\n'+\n                    'var n = x.length, i;\\n'+\n                    'for(i=n-1;i!==-1;--i) {\\n'+\n                    '   xi = arguments.callee(x[i]);\\n'+\n                    o[0]+';\\n'+\n                    '}\\n'+\n                    'return accum;\\n');\n        }\n    }\n}());\n\nnumeric.truncVV = numeric.pointwise(['x[i]','y[i]'],'ret[i] = round(x[i]/y[i])*y[i];','var round = Math.round;');\nnumeric.truncVS = numeric.pointwise(['x[i]','y'],'ret[i] = round(x[i]/y)*y;','var round = Math.round;');\nnumeric.truncSV = numeric.pointwise(['x','y[i]'],'ret[i] = round(x/y[i])*y[i];','var round = Math.round;');\nnumeric.trunc = function trunc(x,y) {\n    if(typeof x === \"object\") {\n        if(typeof y === \"object\") return numeric.truncVV(x,y);\n        return numeric.truncVS(x,y);\n    }\n    if (typeof y === \"object\") return numeric.truncSV(x,y);\n    return Math.round(x/y)*y;\n};\n\nnumeric.inv = function inv(x) {\n    var s = numeric.dim(x), abs = Math.abs, m = s[0], n = s[1];\n    var A = numeric.clone(x), Ai, Aj;\n    var I = numeric.identity(m), Ii, Ij;\n    var i,j,k,x;\n    for(j=0;j<n;++j) {\n        var i0 = -1;\n        var v0 = -1;\n        for(i=j;i!==m;++i) { k = abs(A[i][j]); if(k>v0) { i0 = i; v0 = k; } }\n        Aj = A[i0]; A[i0] = A[j]; A[j] = Aj;\n        Ij = I[i0]; I[i0] = I[j]; I[j] = Ij;\n        x = Aj[j];\n        for(k=j;k!==n;++k)    Aj[k] /= x; \n        for(k=n-1;k!==-1;--k) Ij[k] /= x;\n        for(i=m-1;i!==-1;--i) {\n            if(i!==j) {\n                Ai = A[i];\n                Ii = I[i];\n                x = Ai[j];\n                for(k=j+1;k!==n;++k)  Ai[k] -= Aj[k]*x;\n                for(k=n-1;k>0;--k) { Ii[k] -= Ij[k]*x; --k; Ii[k] -= Ij[k]*x; }\n                if(k===0) Ii[0] -= Ij[0]*x;\n            }\n        }\n    }\n    return I;\n};\n\nnumeric.det = function det(x) {\n    var s = numeric.dim(x);\n    if(s.length !== 2 || s[0] !== s[1]) { throw new Error('numeric: det() only works on square matrices'); }\n    var n = s[0], ret = 1,i,j,k,A = numeric.clone(x),Aj,Ai,alpha,temp,k1,k2,k3;\n    for(j=0;j<n-1;j++) {\n        k=j;\n        for(i=j+1;i<n;i++) { if(Math.abs(A[i][j]) > Math.abs(A[k][j])) { k = i; } }\n        if(k !== j) {\n            temp = A[k]; A[k] = A[j]; A[j] = temp;\n            ret *= -1;\n        }\n        Aj = A[j];\n        for(i=j+1;i<n;i++) {\n            Ai = A[i];\n            alpha = Ai[j]/Aj[j];\n            for(k=j+1;k<n-1;k+=2) {\n                k1 = k+1;\n                Ai[k] -= Aj[k]*alpha;\n                Ai[k1] -= Aj[k1]*alpha;\n            }\n            if(k!==n) { Ai[k] -= Aj[k]*alpha; }\n        }\n        if(Aj[j] === 0) { return 0; }\n        ret *= Aj[j];\n    }\n    return ret*A[j][j];\n};\n\nnumeric.transpose = function transpose(x) {\n    var i,j,m = x.length,n = x[0].length, ret=Array(n),A0,A1,Bj;\n    for(j=0;j<n;j++) ret[j] = Array(m);\n    for(i=m-1;i>=1;i-=2) {\n        A1 = x[i];\n        A0 = x[i-1];\n        for(j=n-1;j>=1;--j) {\n            Bj = ret[j]; Bj[i] = A1[j]; Bj[i-1] = A0[j];\n            --j;\n            Bj = ret[j]; Bj[i] = A1[j]; Bj[i-1] = A0[j];\n        }\n        if(j===0) {\n            Bj = ret[0]; Bj[i] = A1[0]; Bj[i-1] = A0[0];\n        }\n    }\n    if(i===0) {\n        A0 = x[0];\n        for(j=n-1;j>=1;--j) {\n            ret[j][0] = A0[j];\n            --j;\n            ret[j][0] = A0[j];\n        }\n        if(j===0) { ret[0][0] = A0[0]; }\n    }\n    return ret;\n};\nnumeric.negtranspose = function negtranspose(x) {\n    var i,j,m = x.length,n = x[0].length, ret=Array(n),A0,A1,Bj;\n    for(j=0;j<n;j++) ret[j] = Array(m);\n    for(i=m-1;i>=1;i-=2) {\n        A1 = x[i];\n        A0 = x[i-1];\n        for(j=n-1;j>=1;--j) {\n            Bj = ret[j]; Bj[i] = -A1[j]; Bj[i-1] = -A0[j];\n            --j;\n            Bj = ret[j]; Bj[i] = -A1[j]; Bj[i-1] = -A0[j];\n        }\n        if(j===0) {\n            Bj = ret[0]; Bj[i] = -A1[0]; Bj[i-1] = -A0[0];\n        }\n    }\n    if(i===0) {\n        A0 = x[0];\n        for(j=n-1;j>=1;--j) {\n            ret[j][0] = -A0[j];\n            --j;\n            ret[j][0] = -A0[j];\n        }\n        if(j===0) { ret[0][0] = -A0[0]; }\n    }\n    return ret;\n};\n\nnumeric._random = function _random(s,k) {\n    var i,n=s[k],ret=Array(n), rnd;\n    if(k === s.length-1) {\n        rnd = Math.random;\n        for(i=n-1;i>=1;i-=2) {\n            ret[i] = rnd();\n            ret[i-1] = rnd();\n        }\n        if(i===0) { ret[0] = rnd(); }\n        return ret;\n    }\n    for(i=n-1;i>=0;i--) ret[i] = _random(s,k+1);\n    return ret;\n};\nnumeric.random = function random(s) { return numeric._random(s,0); };\n\nnumeric.norm2 = function norm2(x) { return Math.sqrt(numeric.norm2Squared(x)); };\n\nnumeric.linspace = function linspace(a,b,n) {\n    if(typeof n === \"undefined\") n = Math.max(Math.round(b-a)+1,1);\n    if(n<2) { return n===1?[a]:[]; }\n    var i,ret = Array(n);\n    n--;\n    for(i=n;i>=0;i--) { ret[i] = (i*b+(n-i)*a)/n; }\n    return ret;\n};\n\nnumeric.getBlock = function getBlock(x,from,to) {\n    var s = numeric.dim(x);\n    function foo(x,k) {\n        var i,a = from[k], n = to[k]-a, ret = Array(n);\n        if(k === s.length-1) {\n            for(i=n;i>=0;i--) { ret[i] = x[i+a]; }\n            return ret;\n        }\n        for(i=n;i>=0;i--) { ret[i] = foo(x[i+a],k+1); }\n        return ret;\n    }\n    return foo(x,0);\n};\n\nnumeric.setBlock = function setBlock(x,from,to,B) {\n    var s = numeric.dim(x);\n    function foo(x,y,k) {\n        var i,a = from[k], n = to[k]-a;\n        if(k === s.length-1) { for(i=n;i>=0;i--) { x[i+a] = y[i]; } }\n        for(i=n;i>=0;i--) { foo(x[i+a],y[i],k+1); }\n    }\n    foo(x,B,0);\n    return x;\n};\n\nnumeric.getRange = function getRange(A,I,J) {\n    var m = I.length, n = J.length;\n    var i,j;\n    var B = Array(m), Bi, AI;\n    for(i=m-1;i!==-1;--i) {\n        B[i] = Array(n);\n        Bi = B[i];\n        AI = A[I[i]];\n        for(j=n-1;j!==-1;--j) Bi[j] = AI[J[j]];\n    }\n    return B;\n};\n\nnumeric.blockMatrix = function blockMatrix(X) {\n    var s = numeric.dim(X);\n    if(s.length<4) return numeric.blockMatrix([X]);\n    var m=s[0],n=s[1],M,N,i,j,Xij;\n    M = 0; N = 0;\n    for(i=0;i<m;++i) M+=X[i][0].length;\n    for(j=0;j<n;++j) N+=X[0][j][0].length;\n    var Z = Array(M);\n    for(i=0;i<M;++i) Z[i] = Array(N);\n    var I=0,J,ZI,k,l,Xijk;\n    for(i=0;i<m;++i) {\n        J=N;\n        for(j=n-1;j!==-1;--j) {\n            Xij = X[i][j];\n            J -= Xij[0].length;\n            for(k=Xij.length-1;k!==-1;--k) {\n                Xijk = Xij[k];\n                ZI = Z[I+k];\n                for(l = Xijk.length-1;l!==-1;--l) ZI[J+l] = Xijk[l];\n            }\n        }\n        I += X[i][0].length;\n    }\n    return Z;\n};\n\nnumeric.tensor = function tensor(x,y) {\n    if(typeof x === \"number\" || typeof y === \"number\") return numeric.mul(x,y);\n    var s1 = numeric.dim(x), s2 = numeric.dim(y);\n    if(s1.length !== 1 || s2.length !== 1) {\n        throw new Error('numeric: tensor product is only defined for vectors');\n    }\n    var m = s1[0], n = s2[0], A = Array(m), Ai, i,j,xi;\n    for(i=m-1;i>=0;i--) {\n        Ai = Array(n);\n        xi = x[i];\n        for(j=n-1;j>=3;--j) {\n            Ai[j] = xi * y[j];\n            --j;\n            Ai[j] = xi * y[j];\n            --j;\n            Ai[j] = xi * y[j];\n            --j;\n            Ai[j] = xi * y[j];\n        }\n        while(j>=0) { Ai[j] = xi * y[j]; --j; }\n        A[i] = Ai;\n    }\n    return A;\n};\n\n// 3. The Tensor type T\nnumeric.T = function T(x,y) { this.x = x; this.y = y; };\nnumeric.t = function t(x,y) { return new numeric.T(x,y); };\n\nnumeric.Tbinop = function Tbinop(rr,rc,cr,cc,setup) {\n    var io = numeric.indexOf;\n    if(typeof setup !== \"string\") {\n        var k;\n        setup = '';\n        for(k in numeric) {\n            if(numeric.hasOwnProperty(k) && (rr.indexOf(k)>=0 || rc.indexOf(k)>=0 || cr.indexOf(k)>=0 || cc.indexOf(k)>=0) && k.length>1) {\n                setup += 'var '+k+' = numeric.'+k+';\\n';\n            }\n        }\n    }\n    return Function(['y'],\n            'var x = this;\\n'+\n            'if(!(y instanceof numeric.T)) { y = new numeric.T(y); }\\n'+\n            setup+'\\n'+\n            'if(x.y) {'+\n            '  if(y.y) {'+\n            '    return new numeric.T('+cc+');\\n'+\n            '  }\\n'+\n            '  return new numeric.T('+cr+');\\n'+\n            '}\\n'+\n            'if(y.y) {\\n'+\n            '  return new numeric.T('+rc+');\\n'+\n            '}\\n'+\n            'return new numeric.T('+rr+');\\n'\n    );\n};\n\nnumeric.T.prototype.add = numeric.Tbinop(\n        'add(x.x,y.x)',\n        'add(x.x,y.x),y.y',\n        'add(x.x,y.x),x.y',\n        'add(x.x,y.x),add(x.y,y.y)');\nnumeric.T.prototype.sub = numeric.Tbinop(\n        'sub(x.x,y.x)',\n        'sub(x.x,y.x),neg(y.y)',\n        'sub(x.x,y.x),x.y',\n        'sub(x.x,y.x),sub(x.y,y.y)');\nnumeric.T.prototype.mul = numeric.Tbinop(\n        'mul(x.x,y.x)',\n        'mul(x.x,y.x),mul(x.x,y.y)',\n        'mul(x.x,y.x),mul(x.y,y.x)',\n        'sub(mul(x.x,y.x),mul(x.y,y.y)),add(mul(x.x,y.y),mul(x.y,y.x))');\n\nnumeric.T.prototype.reciprocal = function reciprocal() {\n    var mul = numeric.mul, div = numeric.div;\n    if(this.y) {\n        var d = numeric.add(mul(this.x,this.x),mul(this.y,this.y));\n        return new numeric.T(div(this.x,d),div(numeric.neg(this.y),d));\n    }\n    return new T(div(1,this.x));\n};\nnumeric.T.prototype.div = function div(y) {\n    if(!(y instanceof numeric.T)) y = new numeric.T(y);\n    if(y.y) { return this.mul(y.reciprocal()); }\n    var div = numeric.div;\n    if(this.y) { return new numeric.T(div(this.x,y.x),div(this.y,y.x)); }\n    return new numeric.T(div(this.x,y.x));\n};\nnumeric.T.prototype.dot = numeric.Tbinop(\n        'dot(x.x,y.x)',\n        'dot(x.x,y.x),dot(x.x,y.y)',\n        'dot(x.x,y.x),dot(x.y,y.x)',\n        'sub(dot(x.x,y.x),dot(x.y,y.y)),add(dot(x.x,y.y),dot(x.y,y.x))'\n        );\nnumeric.T.prototype.transpose = function transpose() {\n    var t = numeric.transpose, x = this.x, y = this.y;\n    if(y) { return new numeric.T(t(x),t(y)); }\n    return new numeric.T(t(x));\n};\nnumeric.T.prototype.transjugate = function transjugate() {\n    var t = numeric.transpose, x = this.x, y = this.y;\n    if(y) { return new numeric.T(t(x),numeric.negtranspose(y)); }\n    return new numeric.T(t(x));\n};\nnumeric.Tunop = function Tunop(r,c,s) {\n    if(typeof s !== \"string\") { s = ''; }\n    return Function(\n            'var x = this;\\n'+\n            s+'\\n'+\n            'if(x.y) {'+\n            '  '+c+';\\n'+\n            '}\\n'+\n            r+';\\n'\n    );\n};\n\nnumeric.T.prototype.exp = numeric.Tunop(\n        'return new numeric.T(ex)',\n        'return new numeric.T(mul(cos(x.y),ex),mul(sin(x.y),ex))',\n        'var ex = numeric.exp(x.x), cos = numeric.cos, sin = numeric.sin, mul = numeric.mul;');\nnumeric.T.prototype.conj = numeric.Tunop(\n        'return new numeric.T(x.x);',\n        'return new numeric.T(x.x,numeric.neg(x.y));');\nnumeric.T.prototype.neg = numeric.Tunop(\n        'return new numeric.T(neg(x.x));',\n        'return new numeric.T(neg(x.x),neg(x.y));',\n        'var neg = numeric.neg;');\nnumeric.T.prototype.sin = numeric.Tunop(\n        'return new numeric.T(numeric.sin(x.x))',\n        'return x.exp().sub(x.neg().exp()).div(new numeric.T(0,2));');\nnumeric.T.prototype.cos = numeric.Tunop(\n        'return new numeric.T(numeric.cos(x.x))',\n        'return x.exp().add(x.neg().exp()).div(2);');\nnumeric.T.prototype.abs = numeric.Tunop(\n        'return new numeric.T(numeric.abs(x.x));',\n        'return new numeric.T(numeric.sqrt(numeric.add(mul(x.x,x.x),mul(x.y,x.y))));',\n        'var mul = numeric.mul;');\nnumeric.T.prototype.log = numeric.Tunop(\n        'return new numeric.T(numeric.log(x.x));',\n        'var theta = new numeric.T(numeric.atan2(x.y,x.x)), r = x.abs();\\n'+\n        'return new numeric.T(numeric.log(r.x),theta.x);');\nnumeric.T.prototype.norm2 = numeric.Tunop(\n        'return numeric.norm2(x.x);',\n        'var f = numeric.norm2Squared;\\n'+\n        'return Math.sqrt(f(x.x)+f(x.y));');\nnumeric.T.prototype.inv = function inv() {\n    var A = this;\n    if(typeof A.y === \"undefined\") { return new numeric.T(numeric.inv(A.x)); }\n    var n = A.x.length, i, j, k;\n    var Rx = numeric.identity(n),Ry = numeric.rep([n,n],0);\n    var Ax = numeric.clone(A.x), Ay = numeric.clone(A.y);\n    var Aix, Aiy, Ajx, Ajy, Rix, Riy, Rjx, Rjy;\n    var i,j,k,d,d1,ax,ay,bx,by,temp;\n    for(i=0;i<n;i++) {\n        ax = Ax[i][i]; ay = Ay[i][i];\n        d = ax*ax+ay*ay;\n        k = i;\n        for(j=i+1;j<n;j++) {\n            ax = Ax[j][i]; ay = Ay[j][i];\n            d1 = ax*ax+ay*ay;\n            if(d1 > d) { k=j; d = d1; }\n        }\n        if(k!==i) {\n            temp = Ax[i]; Ax[i] = Ax[k]; Ax[k] = temp;\n            temp = Ay[i]; Ay[i] = Ay[k]; Ay[k] = temp;\n            temp = Rx[i]; Rx[i] = Rx[k]; Rx[k] = temp;\n            temp = Ry[i]; Ry[i] = Ry[k]; Ry[k] = temp;\n        }\n        Aix = Ax[i]; Aiy = Ay[i];\n        Rix = Rx[i]; Riy = Ry[i];\n        ax = Aix[i]; ay = Aiy[i];\n        for(j=i+1;j<n;j++) {\n            bx = Aix[j]; by = Aiy[j];\n            Aix[j] = (bx*ax+by*ay)/d;\n            Aiy[j] = (by*ax-bx*ay)/d;\n        }\n        for(j=0;j<n;j++) {\n            bx = Rix[j]; by = Riy[j];\n            Rix[j] = (bx*ax+by*ay)/d;\n            Riy[j] = (by*ax-bx*ay)/d;\n        }\n        for(j=i+1;j<n;j++) {\n            Ajx = Ax[j]; Ajy = Ay[j];\n            Rjx = Rx[j]; Rjy = Ry[j];\n            ax = Ajx[i]; ay = Ajy[i];\n            for(k=i+1;k<n;k++) {\n                bx = Aix[k]; by = Aiy[k];\n                Ajx[k] -= bx*ax-by*ay;\n                Ajy[k] -= by*ax+bx*ay;\n            }\n            for(k=0;k<n;k++) {\n                bx = Rix[k]; by = Riy[k];\n                Rjx[k] -= bx*ax-by*ay;\n                Rjy[k] -= by*ax+bx*ay;\n            }\n        }\n    }\n    for(i=n-1;i>0;i--) {\n        Rix = Rx[i]; Riy = Ry[i];\n        for(j=i-1;j>=0;j--) {\n            Rjx = Rx[j]; Rjy = Ry[j];\n            ax = Ax[j][i]; ay = Ay[j][i];\n            for(k=n-1;k>=0;k--) {\n                bx = Rix[k]; by = Riy[k];\n                Rjx[k] -= ax*bx - ay*by;\n                Rjy[k] -= ax*by + ay*bx;\n            }\n        }\n    }\n    return new numeric.T(Rx,Ry);\n};\nnumeric.T.prototype.get = function get(i) {\n    var x = this.x, y = this.y, k = 0, ik, n = i.length;\n    if(y) {\n        while(k<n) {\n            ik = i[k];\n            x = x[ik];\n            y = y[ik];\n            k++;\n        }\n        return new numeric.T(x,y);\n    }\n    while(k<n) {\n        ik = i[k];\n        x = x[ik];\n        k++;\n    }\n    return new numeric.T(x);\n};\nnumeric.T.prototype.set = function set(i,v) {\n    var x = this.x, y = this.y, k = 0, ik, n = i.length, vx = v.x, vy = v.y;\n    if(n===0) {\n        if(vy) { this.y = vy; }\n        else if(y) { this.y = undefined; }\n        this.x = x;\n        return this;\n    }\n    if(vy) {\n        if(y) { /* ok */ }\n        else {\n            y = numeric.rep(numeric.dim(x),0);\n            this.y = y;\n        }\n        while(k<n-1) {\n            ik = i[k];\n            x = x[ik];\n            y = y[ik];\n            k++;\n        }\n        ik = i[k];\n        x[ik] = vx;\n        y[ik] = vy;\n        return this;\n    }\n    if(y) {\n        while(k<n-1) {\n            ik = i[k];\n            x = x[ik];\n            y = y[ik];\n            k++;\n        }\n        ik = i[k];\n        x[ik] = vx;\n        if(vx instanceof Array) y[ik] = numeric.rep(numeric.dim(vx),0);\n        else y[ik] = 0;\n        return this;\n    }\n    while(k<n-1) {\n        ik = i[k];\n        x = x[ik];\n        k++;\n    }\n    ik = i[k];\n    x[ik] = vx;\n    return this;\n};\nnumeric.T.prototype.getRows = function getRows(i0,i1) {\n    var n = i1-i0+1, j;\n    var rx = Array(n), ry, x = this.x, y = this.y;\n    for(j=i0;j<=i1;j++) { rx[j-i0] = x[j]; }\n    if(y) {\n        ry = Array(n);\n        for(j=i0;j<=i1;j++) { ry[j-i0] = y[j]; }\n        return new numeric.T(rx,ry);\n    }\n    return new numeric.T(rx);\n};\nnumeric.T.prototype.setRows = function setRows(i0,i1,A) {\n    var j;\n    var rx = this.x, ry = this.y, x = A.x, y = A.y;\n    for(j=i0;j<=i1;j++) { rx[j] = x[j-i0]; }\n    if(y) {\n        if(!ry) { ry = numeric.rep(numeric.dim(rx),0); this.y = ry; }\n        for(j=i0;j<=i1;j++) { ry[j] = y[j-i0]; }\n    } else if(ry) {\n        for(j=i0;j<=i1;j++) { ry[j] = numeric.rep([x[j-i0].length],0); }\n    }\n    return this;\n};\nnumeric.T.prototype.getRow = function getRow(k) {\n    var x = this.x, y = this.y;\n    if(y) { return new numeric.T(x[k],y[k]); }\n    return new numeric.T(x[k]);\n};\nnumeric.T.prototype.setRow = function setRow(i,v) {\n    var rx = this.x, ry = this.y, x = v.x, y = v.y;\n    rx[i] = x;\n    if(y) {\n        if(!ry) { ry = numeric.rep(numeric.dim(rx),0); this.y = ry; }\n        ry[i] = y;\n    } else if(ry) {\n        ry = numeric.rep([x.length],0);\n    }\n    return this;\n};\n\nnumeric.T.prototype.getBlock = function getBlock(from,to) {\n    var x = this.x, y = this.y, b = numeric.getBlock;\n    if(y) { return new numeric.T(b(x,from,to),b(y,from,to)); }\n    return new numeric.T(b(x,from,to));\n};\nnumeric.T.prototype.setBlock = function setBlock(from,to,A) {\n    if(!(A instanceof numeric.T)) A = new numeric.T(A);\n    var x = this.x, y = this.y, b = numeric.setBlock, Ax = A.x, Ay = A.y;\n    if(Ay) {\n        if(!y) { this.y = numeric.rep(numeric.dim(this),0); y = this.y; }\n        b(x,from,to,Ax);\n        b(y,from,to,Ay);\n        return this;\n    }\n    b(x,from,to,Ax);\n    if(y) b(y,from,to,numeric.rep(numeric.dim(Ax),0));\n};\nnumeric.T.rep = function rep(s,v) {\n    var T = numeric.T;\n    if(!(v instanceof T)) v = new T(v);\n    var x = v.x, y = v.y, r = numeric.rep;\n    if(y) return new T(r(s,x),r(s,y));\n    return new T(r(s,x));\n};\nnumeric.T.diag = function diag(d) {\n    if(!(d instanceof numeric.T)) d = new numeric.T(d);\n    var x = d.x, y = d.y, diag = numeric.diag;\n    if(y) return new numeric.T(diag(x),diag(y));\n    return new numeric.T(diag(x));\n};\nnumeric.T.eig = function eig() {\n    if(this.y) { throw new Error('eig: not implemented for complex matrices.'); }\n    return numeric.eig(this.x);\n};\nnumeric.T.identity = function identity(n) { return new numeric.T(numeric.identity(n)); };\nnumeric.T.prototype.getDiag = function getDiag() {\n    var n = numeric;\n    var x = this.x, y = this.y;\n    if(y) { return new n.T(n.getDiag(x),n.getDiag(y)); }\n    return new n.T(n.getDiag(x));\n};\n\n// 4. Eigenvalues of real matrices\n\nnumeric.house = function house(x) {\n    var v = numeric.clone(x);\n    var s = x[0] >= 0 ? 1 : -1;\n    var alpha = s*numeric.norm2(x);\n    v[0] += alpha;\n    var foo = numeric.norm2(v);\n    if(foo === 0) { /* this should not happen */ throw new Error('eig: internal error'); }\n    return numeric.div(v,foo);\n};\n\nnumeric.toUpperHessenberg = function toUpperHessenberg(me) {\n    var s = numeric.dim(me);\n    if(s.length !== 2 || s[0] !== s[1]) { throw new Error('numeric: toUpperHessenberg() only works on square matrices'); }\n    var m = s[0], i,j,k,x,v,A = numeric.clone(me),B,C,Ai,Ci,Q = numeric.identity(m),Qi;\n    for(j=0;j<m-2;j++) {\n        x = Array(m-j-1);\n        for(i=j+1;i<m;i++) { x[i-j-1] = A[i][j]; }\n        if(numeric.norm2(x)>0) {\n            v = numeric.house(x);\n            B = numeric.getBlock(A,[j+1,j],[m-1,m-1]);\n            C = numeric.tensor(v,numeric.dot(v,B));\n            for(i=j+1;i<m;i++) { Ai = A[i]; Ci = C[i-j-1]; for(k=j;k<m;k++) Ai[k] -= 2*Ci[k-j]; }\n            B = numeric.getBlock(A,[0,j+1],[m-1,m-1]);\n            C = numeric.tensor(numeric.dot(B,v),v);\n            for(i=0;i<m;i++) { Ai = A[i]; Ci = C[i]; for(k=j+1;k<m;k++) Ai[k] -= 2*Ci[k-j-1]; }\n            B = Array(m-j-1);\n            for(i=j+1;i<m;i++) B[i-j-1] = Q[i];\n            C = numeric.tensor(v,numeric.dot(v,B));\n            for(i=j+1;i<m;i++) { Qi = Q[i]; Ci = C[i-j-1]; for(k=0;k<m;k++) Qi[k] -= 2*Ci[k]; }\n        }\n    }\n    return {H:A, Q:Q};\n};\n\nnumeric.epsilon = 2.220446049250313e-16;\n\nnumeric.QRFrancis = function(H,maxiter) {\n    if(typeof maxiter === \"undefined\") { maxiter = 10000; }\n    H = numeric.clone(H);\n    var H0 = numeric.clone(H);\n    var s = numeric.dim(H),m=s[0],x,v,a,b,c,d,det,tr, Hloc, Q = numeric.identity(m), Qi, Hi, B, C, Ci,i,j,k,iter;\n    if(m<3) { return {Q:Q, B:[ [0,m-1] ]}; }\n    var epsilon = numeric.epsilon;\n    for(iter=0;iter<maxiter;iter++) {\n        for(j=0;j<m-1;j++) {\n            if(Math.abs(H[j+1][j]) < epsilon*(Math.abs(H[j][j])+Math.abs(H[j+1][j+1]))) {\n                var QH1 = numeric.QRFrancis(numeric.getBlock(H,[0,0],[j,j]),maxiter);\n                var QH2 = numeric.QRFrancis(numeric.getBlock(H,[j+1,j+1],[m-1,m-1]),maxiter);\n                B = Array(j+1);\n                for(i=0;i<=j;i++) { B[i] = Q[i]; }\n                C = numeric.dot(QH1.Q,B);\n                for(i=0;i<=j;i++) { Q[i] = C[i]; }\n                B = Array(m-j-1);\n                for(i=j+1;i<m;i++) { B[i-j-1] = Q[i]; }\n                C = numeric.dot(QH2.Q,B);\n                for(i=j+1;i<m;i++) { Q[i] = C[i-j-1]; }\n                return {Q:Q,B:QH1.B.concat(numeric.add(QH2.B,j+1))};\n            }\n        }\n        a = H[m-2][m-2]; b = H[m-2][m-1];\n        c = H[m-1][m-2]; d = H[m-1][m-1];\n        tr = a+d;\n        det = (a*d-b*c);\n        Hloc = numeric.getBlock(H, [0,0], [2,2]);\n        if(tr*tr>=4*det) {\n            var s1,s2;\n            s1 = 0.5*(tr+Math.sqrt(tr*tr-4*det));\n            s2 = 0.5*(tr-Math.sqrt(tr*tr-4*det));\n            Hloc = numeric.add(numeric.sub(numeric.dot(Hloc,Hloc),\n                                           numeric.mul(Hloc,s1+s2)),\n                               numeric.diag(numeric.rep([3],s1*s2)));\n        } else {\n            Hloc = numeric.add(numeric.sub(numeric.dot(Hloc,Hloc),\n                                           numeric.mul(Hloc,tr)),\n                               numeric.diag(numeric.rep([3],det)));\n        }\n        x = [Hloc[0][0],Hloc[1][0],Hloc[2][0]];\n        v = numeric.house(x);\n        B = [H[0],H[1],H[2]];\n        C = numeric.tensor(v,numeric.dot(v,B));\n        for(i=0;i<3;i++) { Hi = H[i]; Ci = C[i]; for(k=0;k<m;k++) Hi[k] -= 2*Ci[k]; }\n        B = numeric.getBlock(H, [0,0],[m-1,2]);\n        C = numeric.tensor(numeric.dot(B,v),v);\n        for(i=0;i<m;i++) { Hi = H[i]; Ci = C[i]; for(k=0;k<3;k++) Hi[k] -= 2*Ci[k]; }\n        B = [Q[0],Q[1],Q[2]];\n        C = numeric.tensor(v,numeric.dot(v,B));\n        for(i=0;i<3;i++) { Qi = Q[i]; Ci = C[i]; for(k=0;k<m;k++) Qi[k] -= 2*Ci[k]; }\n        var J;\n        for(j=0;j<m-2;j++) {\n            for(k=j;k<=j+1;k++) {\n                if(Math.abs(H[k+1][k]) < epsilon*(Math.abs(H[k][k])+Math.abs(H[k+1][k+1]))) {\n                    var QH1 = numeric.QRFrancis(numeric.getBlock(H,[0,0],[k,k]),maxiter);\n                    var QH2 = numeric.QRFrancis(numeric.getBlock(H,[k+1,k+1],[m-1,m-1]),maxiter);\n                    B = Array(k+1);\n                    for(i=0;i<=k;i++) { B[i] = Q[i]; }\n                    C = numeric.dot(QH1.Q,B);\n                    for(i=0;i<=k;i++) { Q[i] = C[i]; }\n                    B = Array(m-k-1);\n                    for(i=k+1;i<m;i++) { B[i-k-1] = Q[i]; }\n                    C = numeric.dot(QH2.Q,B);\n                    for(i=k+1;i<m;i++) { Q[i] = C[i-k-1]; }\n                    return {Q:Q,B:QH1.B.concat(numeric.add(QH2.B,k+1))};\n                }\n            }\n            J = Math.min(m-1,j+3);\n            x = Array(J-j);\n            for(i=j+1;i<=J;i++) { x[i-j-1] = H[i][j]; }\n            v = numeric.house(x);\n            B = numeric.getBlock(H, [j+1,j],[J,m-1]);\n            C = numeric.tensor(v,numeric.dot(v,B));\n            for(i=j+1;i<=J;i++) { Hi = H[i]; Ci = C[i-j-1]; for(k=j;k<m;k++) Hi[k] -= 2*Ci[k-j]; }\n            B = numeric.getBlock(H, [0,j+1],[m-1,J]);\n            C = numeric.tensor(numeric.dot(B,v),v);\n            for(i=0;i<m;i++) { Hi = H[i]; Ci = C[i]; for(k=j+1;k<=J;k++) Hi[k] -= 2*Ci[k-j-1]; }\n            B = Array(J-j);\n            for(i=j+1;i<=J;i++) B[i-j-1] = Q[i];\n            C = numeric.tensor(v,numeric.dot(v,B));\n            for(i=j+1;i<=J;i++) { Qi = Q[i]; Ci = C[i-j-1]; for(k=0;k<m;k++) Qi[k] -= 2*Ci[k]; }\n        }\n    }\n    throw new Error('numeric: eigenvalue iteration does not converge -- increase maxiter?');\n};\n\nnumeric.eig = function eig(A,maxiter) {\n    var QH = numeric.toUpperHessenberg(A);\n    var QB = numeric.QRFrancis(QH.H,maxiter);\n    var T = numeric.T;\n    var n = A.length,i,k,flag = false,B = QB.B,H = numeric.dot(QB.Q,numeric.dot(QH.H,numeric.transpose(QB.Q)));\n    var Q = new T(numeric.dot(QB.Q,QH.Q)),Q0;\n    var m = B.length,j;\n    var a,b,c,d,p1,p2,disc,x,y,p,q,n1,n2;\n    var sqrt = Math.sqrt;\n    for(k=0;k<m;k++) {\n        i = B[k][0];\n        if(i === B[k][1]) {\n            // nothing\n        } else {\n            j = i+1;\n            a = H[i][i];\n            b = H[i][j];\n            c = H[j][i];\n            d = H[j][j];\n            if(b === 0 && c === 0) continue;\n            p1 = -a-d;\n            p2 = a*d-b*c;\n            disc = p1*p1-4*p2;\n            if(disc>=0) {\n                if(p1<0) x = -0.5*(p1-sqrt(disc));\n                else     x = -0.5*(p1+sqrt(disc));\n                n1 = (a-x)*(a-x)+b*b;\n                n2 = c*c+(d-x)*(d-x);\n                if(n1>n2) {\n                    n1 = sqrt(n1);\n                    p = (a-x)/n1;\n                    q = b/n1;\n                } else {\n                    n2 = sqrt(n2);\n                    p = c/n2;\n                    q = (d-x)/n2;\n                }\n                Q0 = new T([[q,-p],[p,q]]);\n                Q.setRows(i,j,Q0.dot(Q.getRows(i,j)));\n            } else {\n                x = -0.5*p1;\n                y = 0.5*sqrt(-disc);\n                n1 = (a-x)*(a-x)+b*b;\n                n2 = c*c+(d-x)*(d-x);\n                if(n1>n2) {\n                    n1 = sqrt(n1+y*y);\n                    p = (a-x)/n1;\n                    q = b/n1;\n                    x = 0;\n                    y /= n1;\n                } else {\n                    n2 = sqrt(n2+y*y);\n                    p = c/n2;\n                    q = (d-x)/n2;\n                    x = y/n2;\n                    y = 0;\n                }\n                Q0 = new T([[q,-p],[p,q]],[[x,y],[y,-x]]);\n                Q.setRows(i,j,Q0.dot(Q.getRows(i,j)));\n            }\n        }\n    }\n    var R = Q.dot(A).dot(Q.transjugate()), n = A.length, E = numeric.T.identity(n);\n    for(j=0;j<n;j++) {\n        if(j>0) {\n            for(k=j-1;k>=0;k--) {\n                var Rk = R.get([k,k]), Rj = R.get([j,j]);\n                if(numeric.neq(Rk.x,Rj.x) || numeric.neq(Rk.y,Rj.y)) {\n                    x = R.getRow(k).getBlock([k],[j-1]);\n                    y = E.getRow(j).getBlock([k],[j-1]);\n                    E.set([j,k],(R.get([k,j]).neg().sub(x.dot(y))).div(Rk.sub(Rj)));\n                } else {\n                    E.setRow(j,E.getRow(k));\n                    continue;\n                }\n            }\n        }\n    }\n    for(j=0;j<n;j++) {\n        x = E.getRow(j);\n        E.setRow(j,x.div(x.norm2()));\n    }\n    E = E.transpose();\n    E = Q.transjugate().dot(E);\n    return { lambda:R.getDiag(), E:E };\n};\n\n// 5. Compressed Column Storage matrices\nnumeric.ccsSparse = function ccsSparse(A) {\n    var m = A.length,n,foo, i,j, counts = [];\n    for(i=m-1;i!==-1;--i) {\n        foo = A[i];\n        for(j in foo) {\n            j = parseInt(j);\n            while(j>=counts.length) counts[counts.length] = 0;\n            if(foo[j]!==0) counts[j]++;\n        }\n    }\n    var n = counts.length;\n    var Ai = Array(n+1);\n    Ai[0] = 0;\n    for(i=0;i<n;++i) Ai[i+1] = Ai[i] + counts[i];\n    var Aj = Array(Ai[n]), Av = Array(Ai[n]);\n    for(i=m-1;i!==-1;--i) {\n        foo = A[i];\n        for(j in foo) {\n            if(foo[j]!==0) {\n                counts[j]--;\n                Aj[Ai[j]+counts[j]] = i;\n                Av[Ai[j]+counts[j]] = foo[j];\n            }\n        }\n    }\n    return [Ai,Aj,Av];\n};\nnumeric.ccsFull = function ccsFull(A) {\n    var Ai = A[0], Aj = A[1], Av = A[2], s = numeric.ccsDim(A), m = s[0], n = s[1], i,j,j0,j1,k;\n    var B = numeric.rep([m,n],0);\n    for(i=0;i<n;i++) {\n        j0 = Ai[i];\n        j1 = Ai[i+1];\n        for(j=j0;j<j1;++j) { B[Aj[j]][i] = Av[j]; }\n    }\n    return B;\n};\nnumeric.ccsTSolve = function ccsTSolve(A,b,x,bj,xj) {\n    var Ai = A[0], Aj = A[1], Av = A[2],m = Ai.length-1, max = Math.max,n=0;\n    if(typeof bj === \"undefined\") x = numeric.rep([m],0);\n    if(typeof bj === \"undefined\") bj = numeric.linspace(0,x.length-1);\n    if(typeof xj === \"undefined\") xj = [];\n    function dfs(j) {\n        var k;\n        if(x[j] !== 0) return;\n        x[j] = 1;\n        for(k=Ai[j];k<Ai[j+1];++k) dfs(Aj[k]);\n        xj[n] = j;\n        ++n;\n    }\n    var i,j,j0,j1,k,l,l0,l1,a;\n    for(i=bj.length-1;i!==-1;--i) { dfs(bj[i]); }\n    xj.length = n;\n    for(i=xj.length-1;i!==-1;--i) { x[xj[i]] = 0; }\n    for(i=bj.length-1;i!==-1;--i) { j = bj[i]; x[j] = b[j]; }\n    for(i=xj.length-1;i!==-1;--i) {\n        j = xj[i];\n        j0 = Ai[j];\n        j1 = max(Ai[j+1],j0);\n        for(k=j0;k!==j1;++k) { if(Aj[k] === j) { x[j] /= Av[k]; break; } }\n        a = x[j];\n        for(k=j0;k!==j1;++k) {\n            l = Aj[k];\n            if(l !== j) x[l] -= a*Av[k];\n        }\n    }\n    return x;\n};\nnumeric.ccsDFS = function ccsDFS(n) {\n    this.k = Array(n);\n    this.k1 = Array(n);\n    this.j = Array(n);\n};\nnumeric.ccsDFS.prototype.dfs = function dfs(J,Ai,Aj,x,xj,Pinv) {\n    var m = 0,foo,n=xj.length;\n    var k = this.k, k1 = this.k1, j = this.j,km,k11;\n    if(x[J]!==0) return;\n    x[J] = 1;\n    j[0] = J;\n    k[0] = km = Ai[J];\n    k1[0] = k11 = Ai[J+1];\n    while(1) {\n        if(km >= k11) {\n            xj[n] = j[m];\n            if(m===0) return;\n            ++n;\n            --m;\n            km = k[m];\n            k11 = k1[m];\n        } else {\n            foo = Pinv[Aj[km]];\n            if(x[foo] === 0) {\n                x[foo] = 1;\n                k[m] = km;\n                ++m;\n                j[m] = foo;\n                km = Ai[foo];\n                k1[m] = k11 = Ai[foo+1];\n            } else ++km;\n        }\n    }\n};\nnumeric.ccsLPSolve = function ccsLPSolve(A,B,x,xj,I,Pinv,dfs) {\n    var Ai = A[0], Aj = A[1], Av = A[2],m = Ai.length-1, n=0;\n    var Bi = B[0], Bj = B[1], Bv = B[2];\n    \n    var i,i0,i1,j,J,j0,j1,k,l,l0,l1,a;\n    i0 = Bi[I];\n    i1 = Bi[I+1];\n    xj.length = 0;\n    for(i=i0;i<i1;++i) { dfs.dfs(Pinv[Bj[i]],Ai,Aj,x,xj,Pinv); }\n    for(i=xj.length-1;i!==-1;--i) { x[xj[i]] = 0; }\n    for(i=i0;i!==i1;++i) { j = Pinv[Bj[i]]; x[j] = Bv[i]; }\n    for(i=xj.length-1;i!==-1;--i) {\n        j = xj[i];\n        j0 = Ai[j];\n        j1 = Ai[j+1];\n        for(k=j0;k<j1;++k) { if(Pinv[Aj[k]] === j) { x[j] /= Av[k]; break; } }\n        a = x[j];\n        for(k=j0;k<j1;++k) {\n            l = Pinv[Aj[k]];\n            if(l !== j) x[l] -= a*Av[k];\n        }\n    }\n    return x;\n};\nnumeric.ccsLUP1 = function ccsLUP1(A,threshold) {\n    var m = A[0].length-1;\n    var L = [numeric.rep([m+1],0),[],[]], U = [numeric.rep([m+1], 0),[],[]];\n    var Li = L[0], Lj = L[1], Lv = L[2], Ui = U[0], Uj = U[1], Uv = U[2];\n    var x = numeric.rep([m],0), xj = numeric.rep([m],0);\n    var i,j,k,j0,j1,a,e,c,d,K;\n    var sol = numeric.ccsLPSolve, max = Math.max, abs = Math.abs;\n    var P = numeric.linspace(0,m-1),Pinv = numeric.linspace(0,m-1);\n    var dfs = new numeric.ccsDFS(m);\n    if(typeof threshold === \"undefined\") { threshold = 1; }\n    for(i=0;i<m;++i) {\n        sol(L,A,x,xj,i,Pinv,dfs);\n        a = -1;\n        e = -1;\n        for(j=xj.length-1;j!==-1;--j) {\n            k = xj[j];\n            if(k <= i) continue;\n            c = abs(x[k]);\n            if(c > a) { e = k; a = c; }\n        }\n        if(abs(x[i])<threshold*a) {\n            j = P[i];\n            a = P[e];\n            P[i] = a; Pinv[a] = i;\n            P[e] = j; Pinv[j] = e;\n            a = x[i]; x[i] = x[e]; x[e] = a;\n        }\n        a = Li[i];\n        e = Ui[i];\n        d = x[i];\n        Lj[a] = P[i];\n        Lv[a] = 1;\n        ++a;\n        for(j=xj.length-1;j!==-1;--j) {\n            k = xj[j];\n            c = x[k];\n            xj[j] = 0;\n            x[k] = 0;\n            if(k<=i) { Uj[e] = k; Uv[e] = c;   ++e; }\n            else     { Lj[a] = P[k]; Lv[a] = c/d; ++a; }\n        }\n        Li[i+1] = a;\n        Ui[i+1] = e;\n    }\n    for(j=Lj.length-1;j!==-1;--j) { Lj[j] = Pinv[Lj[j]]; }\n    return {L:L, U:U, P:P, Pinv:Pinv};\n};\nnumeric.ccsDFS0 = function ccsDFS0(n) {\n    this.k = Array(n);\n    this.k1 = Array(n);\n    this.j = Array(n);\n};\nnumeric.ccsDFS0.prototype.dfs = function dfs(J,Ai,Aj,x,xj,Pinv,P) {\n    var m = 0,foo,n=xj.length;\n    var k = this.k, k1 = this.k1, j = this.j,km,k11;\n    if(x[J]!==0) return;\n    x[J] = 1;\n    j[0] = J;\n    k[0] = km = Ai[Pinv[J]];\n    k1[0] = k11 = Ai[Pinv[J]+1];\n    while(1) {\n        if(isNaN(km)) throw new Error(\"Ow!\");\n        if(km >= k11) {\n            xj[n] = Pinv[j[m]];\n            if(m===0) return;\n            ++n;\n            --m;\n            km = k[m];\n            k11 = k1[m];\n        } else {\n            foo = Aj[km];\n            if(x[foo] === 0) {\n                x[foo] = 1;\n                k[m] = km;\n                ++m;\n                j[m] = foo;\n                foo = Pinv[foo];\n                km = Ai[foo];\n                k1[m] = k11 = Ai[foo+1];\n            } else ++km;\n        }\n    }\n};\nnumeric.ccsLPSolve0 = function ccsLPSolve0(A,B,y,xj,I,Pinv,P,dfs) {\n    var Ai = A[0], Aj = A[1], Av = A[2],m = Ai.length-1, n=0;\n    var Bi = B[0], Bj = B[1], Bv = B[2];\n    \n    var i,i0,i1,j,J,j0,j1,k,l,l0,l1,a;\n    i0 = Bi[I];\n    i1 = Bi[I+1];\n    xj.length = 0;\n    for(i=i0;i<i1;++i) { dfs.dfs(Bj[i],Ai,Aj,y,xj,Pinv,P); }\n    for(i=xj.length-1;i!==-1;--i) { j = xj[i]; y[P[j]] = 0; }\n    for(i=i0;i!==i1;++i) { j = Bj[i]; y[j] = Bv[i]; }\n    for(i=xj.length-1;i!==-1;--i) {\n        j = xj[i];\n        l = P[j];\n        j0 = Ai[j];\n        j1 = Ai[j+1];\n        for(k=j0;k<j1;++k) { if(Aj[k] === l) { y[l] /= Av[k]; break; } }\n        a = y[l];\n        for(k=j0;k<j1;++k) y[Aj[k]] -= a*Av[k];\n        y[l] = a;\n    }\n};\nnumeric.ccsLUP0 = function ccsLUP0(A,threshold) {\n    var m = A[0].length-1;\n    var L = [numeric.rep([m+1],0),[],[]], U = [numeric.rep([m+1], 0),[],[]];\n    var Li = L[0], Lj = L[1], Lv = L[2], Ui = U[0], Uj = U[1], Uv = U[2];\n    var y = numeric.rep([m],0), xj = numeric.rep([m],0);\n    var i,j,k,j0,j1,a,e,c,d,K;\n    var sol = numeric.ccsLPSolve0, max = Math.max, abs = Math.abs;\n    var P = numeric.linspace(0,m-1),Pinv = numeric.linspace(0,m-1);\n    var dfs = new numeric.ccsDFS0(m);\n    if(typeof threshold === \"undefined\") { threshold = 1; }\n    for(i=0;i<m;++i) {\n        sol(L,A,y,xj,i,Pinv,P,dfs);\n        a = -1;\n        e = -1;\n        for(j=xj.length-1;j!==-1;--j) {\n            k = xj[j];\n            if(k <= i) continue;\n            c = abs(y[P[k]]);\n            if(c > a) { e = k; a = c; }\n        }\n        if(abs(y[P[i]])<threshold*a) {\n            j = P[i];\n            a = P[e];\n            P[i] = a; Pinv[a] = i;\n            P[e] = j; Pinv[j] = e;\n        }\n        a = Li[i];\n        e = Ui[i];\n        d = y[P[i]];\n        Lj[a] = P[i];\n        Lv[a] = 1;\n        ++a;\n        for(j=xj.length-1;j!==-1;--j) {\n            k = xj[j];\n            c = y[P[k]];\n            xj[j] = 0;\n            y[P[k]] = 0;\n            if(k<=i) { Uj[e] = k; Uv[e] = c;   ++e; }\n            else     { Lj[a] = P[k]; Lv[a] = c/d; ++a; }\n        }\n        Li[i+1] = a;\n        Ui[i+1] = e;\n    }\n    for(j=Lj.length-1;j!==-1;--j) { Lj[j] = Pinv[Lj[j]]; }\n    return {L:L, U:U, P:P, Pinv:Pinv};\n};\nnumeric.ccsLUP = numeric.ccsLUP0;\n\nnumeric.ccsDim = function ccsDim(A) { return [numeric.sup(A[1])+1,A[0].length-1]; };\nnumeric.ccsGetBlock = function ccsGetBlock(A,i,j) {\n    var s = numeric.ccsDim(A),m=s[0],n=s[1];\n    if(typeof i === \"undefined\") { i = numeric.linspace(0,m-1); }\n    else if(typeof i === \"number\") { i = [i]; }\n    if(typeof j === \"undefined\") { j = numeric.linspace(0,n-1); }\n    else if(typeof j === \"number\") { j = [j]; }\n    var p,p0,p1,P = i.length,q,Q = j.length,r,jq,ip;\n    var Bi = numeric.rep([n],0), Bj=[], Bv=[], B = [Bi,Bj,Bv];\n    var Ai = A[0], Aj = A[1], Av = A[2];\n    var x = numeric.rep([m],0),count=0,flags = numeric.rep([m],0);\n    for(q=0;q<Q;++q) {\n        jq = j[q];\n        var q0 = Ai[jq];\n        var q1 = Ai[jq+1];\n        for(p=q0;p<q1;++p) {\n            r = Aj[p];\n            flags[r] = 1;\n            x[r] = Av[p];\n        }\n        for(p=0;p<P;++p) {\n            ip = i[p];\n            if(flags[ip]) {\n                Bj[count] = p;\n                Bv[count] = x[i[p]];\n                ++count;\n            }\n        }\n        for(p=q0;p<q1;++p) {\n            r = Aj[p];\n            flags[r] = 0;\n        }\n        Bi[q+1] = count;\n    }\n    return B;\n};\n\nnumeric.ccsDot = function ccsDot(A,B) {\n    var Ai = A[0], Aj = A[1], Av = A[2];\n    var Bi = B[0], Bj = B[1], Bv = B[2];\n    var sA = numeric.ccsDim(A), sB = numeric.ccsDim(B);\n    var m = sA[0], n = sA[1], o = sB[1];\n    var x = numeric.rep([m],0), flags = numeric.rep([m],0), xj = Array(m);\n    var Ci = numeric.rep([o],0), Cj = [], Cv = [], C = [Ci,Cj,Cv];\n    var i,j,k,j0,j1,i0,i1,l,p,a,b;\n    for(k=0;k!==o;++k) {\n        j0 = Bi[k];\n        j1 = Bi[k+1];\n        p = 0;\n        for(j=j0;j<j1;++j) {\n            a = Bj[j];\n            b = Bv[j];\n            i0 = Ai[a];\n            i1 = Ai[a+1];\n            for(i=i0;i<i1;++i) {\n                l = Aj[i];\n                if(flags[l]===0) {\n                    xj[p] = l;\n                    flags[l] = 1;\n                    p = p+1;\n                }\n                x[l] = x[l] + Av[i]*b;\n            }\n        }\n        j0 = Ci[k];\n        j1 = j0+p;\n        Ci[k+1] = j1;\n        for(j=p-1;j!==-1;--j) {\n            b = j0+j;\n            i = xj[j];\n            Cj[b] = i;\n            Cv[b] = x[i];\n            flags[i] = 0;\n            x[i] = 0;\n        }\n        Ci[k+1] = Ci[k]+p;\n    }\n    return C;\n};\n\nnumeric.ccsLUPSolve = function ccsLUPSolve(LUP,B) {\n    var L = LUP.L, U = LUP.U, P = LUP.P;\n    var Bi = B[0];\n    var flag = false;\n    if(typeof Bi !== \"object\") { B = [[0,B.length],numeric.linspace(0,B.length-1),B]; Bi = B[0]; flag = true; }\n    var Bj = B[1], Bv = B[2];\n    var n = L[0].length-1, m = Bi.length-1;\n    var x = numeric.rep([n],0), xj = Array(n);\n    var b = numeric.rep([n],0), bj = Array(n);\n    var Xi = numeric.rep([m+1],0), Xj = [], Xv = [];\n    var sol = numeric.ccsTSolve;\n    var i,j,j0,j1,k,J,N=0;\n    for(i=0;i<m;++i) {\n        k = 0;\n        j0 = Bi[i];\n        j1 = Bi[i+1];\n        for(j=j0;j<j1;++j) { \n            J = LUP.Pinv[Bj[j]];\n            bj[k] = J;\n            b[J] = Bv[j];\n            ++k;\n        }\n        bj.length = k;\n        sol(L,b,x,bj,xj);\n        for(j=bj.length-1;j!==-1;--j) b[bj[j]] = 0;\n        sol(U,x,b,xj,bj);\n        if(flag) return b;\n        for(j=xj.length-1;j!==-1;--j) x[xj[j]] = 0;\n        for(j=bj.length-1;j!==-1;--j) {\n            J = bj[j];\n            Xj[N] = J;\n            Xv[N] = b[J];\n            b[J] = 0;\n            ++N;\n        }\n        Xi[i+1] = N;\n    }\n    return [Xi,Xj,Xv];\n};\n\nnumeric.ccsbinop = function ccsbinop(body,setup) {\n    if(typeof setup === \"undefined\") setup='';\n    return Function('X','Y',\n            'var Xi = X[0], Xj = X[1], Xv = X[2];\\n'+\n            'var Yi = Y[0], Yj = Y[1], Yv = Y[2];\\n'+\n            'var n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\\n'+\n            'var Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\\n'+\n            'var x = numeric.rep([m],0),y = numeric.rep([m],0);\\n'+\n            'var xk,yk,zk;\\n'+\n            'var i,j,j0,j1,k,p=0;\\n'+\n            setup+\n            'for(i=0;i<n;++i) {\\n'+\n            '  j0 = Xi[i]; j1 = Xi[i+1];\\n'+\n            '  for(j=j0;j!==j1;++j) {\\n'+\n            '    k = Xj[j];\\n'+\n            '    x[k] = 1;\\n'+\n            '    Zj[p] = k;\\n'+\n            '    ++p;\\n'+\n            '  }\\n'+\n            '  j0 = Yi[i]; j1 = Yi[i+1];\\n'+\n            '  for(j=j0;j!==j1;++j) {\\n'+\n            '    k = Yj[j];\\n'+\n            '    y[k] = Yv[j];\\n'+\n            '    if(x[k] === 0) {\\n'+\n            '      Zj[p] = k;\\n'+\n            '      ++p;\\n'+\n            '    }\\n'+\n            '  }\\n'+\n            '  Zi[i+1] = p;\\n'+\n            '  j0 = Xi[i]; j1 = Xi[i+1];\\n'+\n            '  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\\n'+\n            '  j0 = Zi[i]; j1 = Zi[i+1];\\n'+\n            '  for(j=j0;j!==j1;++j) {\\n'+\n            '    k = Zj[j];\\n'+\n            '    xk = x[k];\\n'+\n            '    yk = y[k];\\n'+\n            body+'\\n'+\n            '    Zv[j] = zk;\\n'+\n            '  }\\n'+\n            '  j0 = Xi[i]; j1 = Xi[i+1];\\n'+\n            '  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\\n'+\n            '  j0 = Yi[i]; j1 = Yi[i+1];\\n'+\n            '  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\\n'+\n            '}\\n'+\n            'return [Zi,Zj,Zv];'\n            );\n};\n\n(function() {\n    var k,A,B,C;\n    for(k in numeric.ops2) {\n        // PATCHED IN: changed \"eval\" to \"evalFn\" (renamed to avoid needing to remove 'use strict'; see: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode#syntax_errors)\n        if(isFinite(evalFn('1'+numeric.ops2[k]+'0'))) A = '[Y[0],Y[1],numeric.'+k+'(X,Y[2])]';\n        else A = 'NaN';\n        if(isFinite(evalFn('0'+numeric.ops2[k]+'1'))) B = '[X[0],X[1],numeric.'+k+'(X[2],Y)]';\n        else B = 'NaN';\n        if(isFinite(evalFn('1'+numeric.ops2[k]+'0')) && isFinite(evalFn('0'+numeric.ops2[k]+'1'))) C = 'numeric.ccs'+k+'MM(X,Y)';\n        else C = 'NaN';\n        numeric['ccs'+k+'MM'] = numeric.ccsbinop('zk = xk '+numeric.ops2[k]+'yk;');\n        numeric['ccs'+k] = Function('X','Y',\n                'if(typeof X === \"number\") return '+A+';\\n'+\n                'if(typeof Y === \"number\") return '+B+';\\n'+\n                'return '+C+';\\n'\n                );\n    }\n}());\n\nnumeric.ccsScatter = function ccsScatter(A) {\n    var Ai = A[0], Aj = A[1], Av = A[2];\n    var n = numeric.sup(Aj)+1,m=Ai.length;\n    var Ri = numeric.rep([n],0),Rj=Array(m), Rv = Array(m);\n    var counts = numeric.rep([n],0),i;\n    for(i=0;i<m;++i) counts[Aj[i]]++;\n    for(i=0;i<n;++i) Ri[i+1] = Ri[i] + counts[i];\n    var ptr = Ri.slice(0),k,Aii;\n    for(i=0;i<m;++i) {\n        Aii = Aj[i];\n        k = ptr[Aii];\n        Rj[k] = Ai[i];\n        Rv[k] = Av[i];\n        ptr[Aii]=ptr[Aii]+1;\n    }\n    return [Ri,Rj,Rv];\n};\n\nnumeric.ccsGather = function ccsGather(A) {\n    var Ai = A[0], Aj = A[1], Av = A[2];\n    var n = Ai.length-1,m = Aj.length;\n    var Ri = Array(m), Rj = Array(m), Rv = Array(m);\n    var i,j,j0,j1,p;\n    p=0;\n    for(i=0;i<n;++i) {\n        j0 = Ai[i];\n        j1 = Ai[i+1];\n        for(j=j0;j!==j1;++j) {\n            Rj[p] = i;\n            Ri[p] = Aj[j];\n            Rv[p] = Av[j];\n            ++p;\n        }\n    }\n    return [Ri,Rj,Rv];\n};\n\n// The following sparse linear algebra routines are deprecated.\n\nnumeric.sdim = function dim(A,ret,k) {\n    if(typeof ret === \"undefined\") { ret = []; }\n    if(typeof A !== \"object\") return ret;\n    if(typeof k === \"undefined\") { k=0; }\n    if(!(k in ret)) { ret[k] = 0; }\n    if(A.length > ret[k]) ret[k] = A.length;\n    var i;\n    for(i in A) {\n        if(A.hasOwnProperty(i)) dim(A[i],ret,k+1);\n    }\n    return ret;\n};\n\nnumeric.sclone = function clone(A,k,n) {\n    if(typeof k === \"undefined\") { k=0; }\n    if(typeof n === \"undefined\") { n = numeric.sdim(A).length; }\n    var i,ret = Array(A.length);\n    if(k === n-1) {\n        for(i in A) { if(A.hasOwnProperty(i)) ret[i] = A[i]; }\n        return ret;\n    }\n    for(i in A) {\n        if(A.hasOwnProperty(i)) ret[i] = clone(A[i],k+1,n);\n    }\n    return ret;\n};\n\nnumeric.sdiag = function diag(d) {\n    var n = d.length,i,ret = Array(n),i1,i2,i3;\n    for(i=n-1;i>=1;i-=2) {\n        i1 = i-1;\n        ret[i] = []; ret[i][i] = d[i];\n        ret[i1] = []; ret[i1][i1] = d[i1];\n    }\n    if(i===0) { ret[0] = []; ret[0][0] = d[i]; }\n    return ret;\n};\n\nnumeric.sidentity = function identity(n) { return numeric.sdiag(numeric.rep([n],1)); };\n\nnumeric.stranspose = function transpose(A) {\n    var ret = [], n = A.length, i,j,Ai;\n    for(i in A) {\n        if(!(A.hasOwnProperty(i))) continue;\n        Ai = A[i];\n        for(j in Ai) {\n            if(!(Ai.hasOwnProperty(j))) continue;\n            if(typeof ret[j] !== \"object\") { ret[j] = []; }\n            ret[j][i] = Ai[j];\n        }\n    }\n    return ret;\n};\n\nnumeric.sLUP = function LUP(A,tol) {\n    throw new Error(\"The function numeric.sLUP had a bug in it and has been removed. Please use the new numeric.ccsLUP function instead.\");\n};\n\nnumeric.sdotMM = function dotMM(A,B) {\n    var p = A.length, q = B.length, BT = numeric.stranspose(B), r = BT.length, Ai, BTk;\n    var i,j,k,accum;\n    var ret = Array(p),reti;\n    for(i=p-1;i>=0;i--) {\n        reti = [];\n        Ai = A[i];\n        for(k=r-1;k>=0;k--) {\n            accum = 0;\n            BTk = BT[k];\n            for(j in Ai) {\n                if(!(Ai.hasOwnProperty(j))) continue;\n                if(j in BTk) { accum += Ai[j]*BTk[j]; }\n            }\n            if(accum) reti[k] = accum;\n        }\n        ret[i] = reti;\n    }\n    return ret;\n};\n\nnumeric.sdotMV = function dotMV(A,x) {\n    var p = A.length, Ai, i,j;\n    var ret = Array(p), accum;\n    for(i=p-1;i>=0;i--) {\n        Ai = A[i];\n        accum = 0;\n        for(j in Ai) {\n            if(!(Ai.hasOwnProperty(j))) continue;\n            if(x[j]) accum += Ai[j]*x[j];\n        }\n        if(accum) ret[i] = accum;\n    }\n    return ret;\n};\n\nnumeric.sdotVM = function dotMV(x,A) {\n    var i,j,Ai,alpha;\n    var ret = [], accum;\n    for(i in x) {\n        if(!x.hasOwnProperty(i)) continue;\n        Ai = A[i];\n        alpha = x[i];\n        for(j in Ai) {\n            if(!Ai.hasOwnProperty(j)) continue;\n            if(!ret[j]) { ret[j] = 0; }\n            ret[j] += alpha*Ai[j];\n        }\n    }\n    return ret;\n};\n\nnumeric.sdotVV = function dotVV(x,y) {\n    var i,ret=0;\n    for(i in x) { if(x[i] && y[i]) ret+= x[i]*y[i]; }\n    return ret;\n};\n\nnumeric.sdot = function dot(A,B) {\n    var m = numeric.sdim(A).length, n = numeric.sdim(B).length;\n    var k = m*1000+n;\n    switch(k) {\n    case 0: return A*B;\n    case 1001: return numeric.sdotVV(A,B);\n    case 2001: return numeric.sdotMV(A,B);\n    case 1002: return numeric.sdotVM(A,B);\n    case 2002: return numeric.sdotMM(A,B);\n    default: throw new Error('numeric.sdot not implemented for tensors of order '+m+' and '+n);\n    }\n};\n\nnumeric.sscatter = function scatter(V) {\n    var n = V[0].length, Vij, i, j, m = V.length, A = [], Aj;\n    for(i=n-1;i>=0;--i) {\n        if(!V[m-1][i]) continue;\n        Aj = A;\n        for(j=0;j<m-2;j++) {\n            Vij = V[j][i];\n            if(!Aj[Vij]) Aj[Vij] = [];\n            Aj = Aj[Vij];\n        }\n        Aj[V[j][i]] = V[j+1][i];\n    }\n    return A;\n};\n\nnumeric.sgather = function gather(A,ret,k) {\n    if(typeof ret === \"undefined\") ret = [];\n    if(typeof k === \"undefined\") k = [];\n    var n,i,Ai;\n    n = k.length;\n    for(i in A) {\n        if(A.hasOwnProperty(i)) {\n            k[n] = parseInt(i);\n            Ai = A[i];\n            if(typeof Ai === \"number\") {\n                if(Ai) {\n                    if(ret.length === 0) {\n                        for(i=n+1;i>=0;--i) ret[i] = [];\n                    }\n                    for(i=n;i>=0;--i) ret[i].push(k[i]);\n                    ret[n+1].push(Ai);\n                }\n            } else gather(Ai,ret,k);\n        }\n    }\n    if(k.length>n) k.pop();\n    return ret;\n};\n\n// 6. Coordinate matrices\nnumeric.cLU = function LU(A) {\n    var I = A[0], J = A[1], V = A[2];\n    var p = I.length, m=0, i,j,k,a,b,c;\n    for(i=0;i<p;i++) if(I[i]>m) m=I[i];\n    m++;\n    var L = Array(m), U = Array(m), left = numeric.rep([m],Infinity), right = numeric.rep([m],-Infinity);\n    var Ui, Uj,alpha;\n    for(k=0;k<p;k++) {\n        i = I[k];\n        j = J[k];\n        if(j<left[i]) left[i] = j;\n        if(j>right[i]) right[i] = j;\n    }\n    for(i=0;i<m-1;i++) { if(right[i] > right[i+1]) right[i+1] = right[i]; }\n    for(i=m-1;i>=1;i--) { if(left[i]<left[i-1]) left[i-1] = left[i]; }\n    var countL = 0, countU = 0;\n    for(i=0;i<m;i++) {\n        U[i] = numeric.rep([right[i]-left[i]+1],0);\n        L[i] = numeric.rep([i-left[i]],0);\n        countL += i-left[i]+1;\n        countU += right[i]-i+1;\n    }\n    for(k=0;k<p;k++) { i = I[k]; U[i][J[k]-left[i]] = V[k]; }\n    for(i=0;i<m-1;i++) {\n        a = i-left[i];\n        Ui = U[i];\n        for(j=i+1;left[j]<=i && j<m;j++) {\n            b = i-left[j];\n            c = right[i]-i;\n            Uj = U[j];\n            alpha = Uj[b]/Ui[a];\n            if(alpha) {\n                for(k=1;k<=c;k++) { Uj[k+b] -= alpha*Ui[k+a]; }\n                L[j][i-left[j]] = alpha;\n            }\n        }\n    }\n    var Ui = [], Uj = [], Uv = [], Li = [], Lj = [], Lv = [];\n    var p,q,foo;\n    p=0; q=0;\n    for(i=0;i<m;i++) {\n        a = left[i];\n        b = right[i];\n        foo = U[i];\n        for(j=i;j<=b;j++) {\n            if(foo[j-a]) {\n                Ui[p] = i;\n                Uj[p] = j;\n                Uv[p] = foo[j-a];\n                p++;\n            }\n        }\n        foo = L[i];\n        for(j=a;j<i;j++) {\n            if(foo[j-a]) {\n                Li[q] = i;\n                Lj[q] = j;\n                Lv[q] = foo[j-a];\n                q++;\n            }\n        }\n        Li[q] = i;\n        Lj[q] = i;\n        Lv[q] = 1;\n        q++;\n    }\n    return {U:[Ui,Uj,Uv], L:[Li,Lj,Lv]};\n};\n\nnumeric.cLUsolve = function LUsolve(lu,b) {\n    var L = lu.L, U = lu.U, ret = numeric.clone(b);\n    var Li = L[0], Lj = L[1], Lv = L[2];\n    var Ui = U[0], Uj = U[1], Uv = U[2];\n    var p = Ui.length, q = Li.length;\n    var m = ret.length,i,j,k;\n    k = 0;\n    for(i=0;i<m;i++) {\n        while(Lj[k] < i) {\n            ret[i] -= Lv[k]*ret[Lj[k]];\n            k++;\n        }\n        k++;\n    }\n    k = p-1;\n    for(i=m-1;i>=0;i--) {\n        while(Uj[k] > i) {\n            ret[i] -= Uv[k]*ret[Uj[k]];\n            k--;\n        }\n        ret[i] /= Uv[k];\n        k--;\n    }\n    return ret;\n};\n\nnumeric.cgrid = function grid(n,shape) {\n    if(typeof n === \"number\") n = [n,n];\n    var ret = numeric.rep(n,-1);\n    var i,j,count;\n    if(typeof shape !== \"function\") {\n        switch(shape) {\n        case 'L':\n            shape = function(i,j) { return (i>=n[0]/2 || j<n[1]/2); };\n            break;\n        default:\n            shape = function(i,j) { return true; };\n            break;\n        }\n    }\n    count=0;\n    for(i=1;i<n[0]-1;i++) for(j=1;j<n[1]-1;j++) \n        if(shape(i,j)) {\n            ret[i][j] = count;\n            count++;\n        }\n    return ret;\n};\n\nnumeric.cdelsq = function delsq(g) {\n    var dir = [[-1,0],[0,-1],[0,1],[1,0]];\n    var s = numeric.dim(g), m = s[0], n = s[1], i,j,k,p,q;\n    var Li = [], Lj = [], Lv = [];\n    for(i=1;i<m-1;i++) for(j=1;j<n-1;j++) {\n        if(g[i][j]<0) continue;\n        for(k=0;k<4;k++) {\n            p = i+dir[k][0];\n            q = j+dir[k][1];\n            if(g[p][q]<0) continue;\n            Li.push(g[i][j]);\n            Lj.push(g[p][q]);\n            Lv.push(-1);\n        }\n        Li.push(g[i][j]);\n        Lj.push(g[i][j]);\n        Lv.push(4);\n    }\n    return [Li,Lj,Lv];\n};\n\nnumeric.cdotMV = function dotMV(A,x) {\n    var ret, Ai = A[0], Aj = A[1], Av = A[2],k,p=Ai.length,N;\n    N=0;\n    for(k=0;k<p;k++) { if(Ai[k]>N) N = Ai[k]; }\n    N++;\n    ret = numeric.rep([N],0);\n    for(k=0;k<p;k++) { ret[Ai[k]]+=Av[k]*x[Aj[k]]; }\n    return ret;\n};\n\n// 7. Splines\n\nnumeric.Spline = function Spline(x,yl,yr,kl,kr) { this.x = x; this.yl = yl; this.yr = yr; this.kl = kl; this.kr = kr; };\nnumeric.Spline.prototype._at = function _at(x1,p) {\n    var x = this.x;\n    var yl = this.yl;\n    var yr = this.yr;\n    var kl = this.kl;\n    var kr = this.kr;\n    var x1,a,b,t;\n    var add = numeric.add, sub = numeric.sub, mul = numeric.mul;\n    a = sub(mul(kl[p],x[p+1]-x[p]),sub(yr[p+1],yl[p]));\n    b = add(mul(kr[p+1],x[p]-x[p+1]),sub(yr[p+1],yl[p]));\n    t = (x1-x[p])/(x[p+1]-x[p]);\n    var s = t*(1-t);\n    return add(add(add(mul(1-t,yl[p]),mul(t,yr[p+1])),mul(a,s*(1-t))),mul(b,s*t));\n};\nnumeric.Spline.prototype.at = function at(x0) {\n    if(typeof x0 === \"number\") {\n        var x = this.x;\n        var n = x.length;\n        var p,q,mid,floor = Math.floor,a,b,t;\n        p = 0;\n        q = n-1;\n        while(q-p>1) {\n            mid = floor((p+q)/2);\n            if(x[mid] <= x0) p = mid;\n            else q = mid;\n        }\n        return this._at(x0,p);\n    }\n    var n = x0.length, i, ret = Array(n);\n    for(i=n-1;i!==-1;--i) ret[i] = this.at(x0[i]);\n    return ret;\n};\nnumeric.Spline.prototype.diff = function diff() {\n    var x = this.x;\n    var yl = this.yl;\n    var yr = this.yr;\n    var kl = this.kl;\n    var kr = this.kr;\n    var n = yl.length;\n    var i,dx,dy;\n    var zl = kl, zr = kr, pl = Array(n), pr = Array(n);\n    var add = numeric.add, mul = numeric.mul, div = numeric.div, sub = numeric.sub;\n    for(i=n-1;i!==-1;--i) {\n        dx = x[i+1]-x[i];\n        dy = sub(yr[i+1],yl[i]);\n        pl[i] = div(add(mul(dy, 6),mul(kl[i],-4*dx),mul(kr[i+1],-2*dx)),dx*dx);\n        pr[i+1] = div(add(mul(dy,-6),mul(kl[i], 2*dx),mul(kr[i+1], 4*dx)),dx*dx);\n    }\n    return new numeric.Spline(x,zl,zr,pl,pr);\n};\nnumeric.Spline.prototype.roots = function roots() {\n    function sqr(x) { return x*x; }\n    var ret = [];\n    var x = this.x, yl = this.yl, yr = this.yr, kl = this.kl, kr = this.kr;\n    if(typeof yl[0] === \"number\") {\n        yl = [yl];\n        yr = [yr];\n        kl = [kl];\n        kr = [kr];\n    }\n    var m = yl.length,n=x.length-1,i,j,k,y,s,t;\n    var ai,bi,ci,di, ret = Array(m),ri,k0,k1,y0,y1,A,B,D,dx,cx,stops,z0,z1,zm,t0,t1,tm;\n    var sqrt = Math.sqrt;\n    for(i=0;i!==m;++i) {\n        ai = yl[i];\n        bi = yr[i];\n        ci = kl[i];\n        di = kr[i];\n        ri = [];\n        for(j=0;j!==n;j++) {\n            if(j>0 && bi[j]*ai[j]<0) ri.push(x[j]);\n            dx = (x[j+1]-x[j]);\n            cx = x[j];\n            y0 = ai[j];\n            y1 = bi[j+1];\n            k0 = ci[j]/dx;\n            k1 = di[j+1]/dx;\n            D = sqr(k0-k1+3*(y0-y1)) + 12*k1*y0;\n            A = k1+3*y0+2*k0-3*y1;\n            B = 3*(k1+k0+2*(y0-y1));\n            if(D<=0) {\n                z0 = A/B;\n                if(z0>x[j] && z0<x[j+1]) stops = [x[j],z0,x[j+1]];\n                else stops = [x[j],x[j+1]];\n            } else {\n                z0 = (A-sqrt(D))/B;\n                z1 = (A+sqrt(D))/B;\n                stops = [x[j]];\n                if(z0>x[j] && z0<x[j+1]) stops.push(z0);\n                if(z1>x[j] && z1<x[j+1]) stops.push(z1);\n                stops.push(x[j+1]);\n            }\n            t0 = stops[0];\n            z0 = this._at(t0,j);\n            for(k=0;k<stops.length-1;k++) {\n                t1 = stops[k+1];\n                z1 = this._at(t1,j);\n                if(z0 === 0) {\n                    ri.push(t0); \n                    t0 = t1;\n                    z0 = z1;\n                    continue;\n                }\n                if(z1 === 0 || z0*z1>0) {\n                    t0 = t1;\n                    z0 = z1;\n                    continue;\n                }\n                var side = 0;\n                while(1) {\n                    tm = (z0*t1-z1*t0)/(z0-z1);\n                    if(tm <= t0 || tm >= t1) { break; }\n                    zm = this._at(tm,j);\n                    if(zm*z1>0) {\n                        t1 = tm;\n                        z1 = zm;\n                        if(side === -1) z0*=0.5;\n                        side = -1;\n                    } else if(zm*z0>0) {\n                        t0 = tm;\n                        z0 = zm;\n                        if(side === 1) z1*=0.5;\n                        side = 1;\n                    } else break;\n                }\n                ri.push(tm);\n                t0 = stops[k+1];\n                z0 = this._at(t0, j);\n            }\n            if(z1 === 0) ri.push(t1);\n        }\n        ret[i] = ri;\n    }\n    if(typeof this.yl[0] === \"number\") return ret[0];\n    return ret;\n};\nnumeric.spline = function spline(x,y,k1,kn) {\n    var n = x.length, b = [], dx = [], dy = [];\n    var i;\n    var sub = numeric.sub,mul = numeric.mul,add = numeric.add;\n    for(i=n-2;i>=0;i--) { dx[i] = x[i+1]-x[i]; dy[i] = sub(y[i+1],y[i]); }\n    if(typeof k1 === \"string\" || typeof kn === \"string\") { \n        k1 = kn = \"periodic\";\n    }\n    // Build sparse tridiagonal system\n    var T = [[],[],[]];\n    switch(typeof k1) {\n    case \"undefined\":\n        b[0] = mul(3/(dx[0]*dx[0]),dy[0]);\n        T[0].push(0,0);\n        T[1].push(0,1);\n        T[2].push(2/dx[0],1/dx[0]);\n        break;\n    case \"string\":\n        b[0] = add(mul(3/(dx[n-2]*dx[n-2]),dy[n-2]),mul(3/(dx[0]*dx[0]),dy[0]));\n        T[0].push(0,0,0);\n        T[1].push(n-2,0,1);\n        T[2].push(1/dx[n-2],2/dx[n-2]+2/dx[0],1/dx[0]);\n        break;\n    default:\n        b[0] = k1;\n        T[0].push(0);\n        T[1].push(0);\n        T[2].push(1);\n        break;\n    }\n    for(i=1;i<n-1;i++) {\n        b[i] = add(mul(3/(dx[i-1]*dx[i-1]),dy[i-1]),mul(3/(dx[i]*dx[i]),dy[i]));\n        T[0].push(i,i,i);\n        T[1].push(i-1,i,i+1);\n        T[2].push(1/dx[i-1],2/dx[i-1]+2/dx[i],1/dx[i]);\n    }\n    switch(typeof kn) {\n    case \"undefined\":\n        b[n-1] = mul(3/(dx[n-2]*dx[n-2]),dy[n-2]);\n        T[0].push(n-1,n-1);\n        T[1].push(n-2,n-1);\n        T[2].push(1/dx[n-2],2/dx[n-2]);\n        break;\n    case \"string\":\n        T[1][T[1].length-1] = 0;\n        break;\n    default:\n        b[n-1] = kn;\n        T[0].push(n-1);\n        T[1].push(n-1);\n        T[2].push(1);\n        break;\n    }\n    if(typeof b[0] !== \"number\") b = numeric.transpose(b);\n    else b = [b];\n    var k = Array(b.length);\n    if(typeof k1 === \"string\") {\n        for(i=k.length-1;i!==-1;--i) {\n            k[i] = numeric.ccsLUPSolve(numeric.ccsLUP(numeric.ccsScatter(T)),b[i]);\n            k[i][n-1] = k[i][0];\n        }\n    } else {\n        for(i=k.length-1;i!==-1;--i) {\n            k[i] = numeric.cLUsolve(numeric.cLU(T),b[i]);\n        }\n    }\n    if(typeof y[0] === \"number\") k = k[0];\n    else k = numeric.transpose(k);\n    return new numeric.Spline(x,y,y,k,k);\n};\n\n// 8. FFT\nnumeric.fftpow2 = function fftpow2(x,y) {\n    var n = x.length;\n    if(n === 1) return;\n    var cos = Math.cos, sin = Math.sin, i,j;\n    var xe = Array(n/2), ye = Array(n/2), xo = Array(n/2), yo = Array(n/2);\n    j = n/2;\n    for(i=n-1;i!==-1;--i) {\n        --j;\n        xo[j] = x[i];\n        yo[j] = y[i];\n        --i;\n        xe[j] = x[i];\n        ye[j] = y[i];\n    }\n    fftpow2(xe,ye);\n    fftpow2(xo,yo);\n    j = n/2;\n    var t,k = (-6.2831853071795864769252867665590057683943387987502116419/n),ci,si;\n    for(i=n-1;i!==-1;--i) {\n        --j;\n        if(j === -1) j = n/2-1;\n        t = k*i;\n        ci = cos(t);\n        si = sin(t);\n        x[i] = xe[j] + ci*xo[j] - si*yo[j];\n        y[i] = ye[j] + ci*yo[j] + si*xo[j];\n    }\n};\nnumeric._ifftpow2 = function _ifftpow2(x,y) {\n    var n = x.length;\n    if(n === 1) return;\n    var cos = Math.cos, sin = Math.sin, i,j;\n    var xe = Array(n/2), ye = Array(n/2), xo = Array(n/2), yo = Array(n/2);\n    j = n/2;\n    for(i=n-1;i!==-1;--i) {\n        --j;\n        xo[j] = x[i];\n        yo[j] = y[i];\n        --i;\n        xe[j] = x[i];\n        ye[j] = y[i];\n    }\n    _ifftpow2(xe,ye);\n    _ifftpow2(xo,yo);\n    j = n/2;\n    var t,k = (6.2831853071795864769252867665590057683943387987502116419/n),ci,si;\n    for(i=n-1;i!==-1;--i) {\n        --j;\n        if(j === -1) j = n/2-1;\n        t = k*i;\n        ci = cos(t);\n        si = sin(t);\n        x[i] = xe[j] + ci*xo[j] - si*yo[j];\n        y[i] = ye[j] + ci*yo[j] + si*xo[j];\n    }\n};\nnumeric.ifftpow2 = function ifftpow2(x,y) {\n    numeric._ifftpow2(x,y);\n    numeric.diveq(x,x.length);\n    numeric.diveq(y,y.length);\n};\nnumeric.convpow2 = function convpow2(ax,ay,bx,by) {\n    numeric.fftpow2(ax,ay);\n    numeric.fftpow2(bx,by);\n    var i,n = ax.length,axi,bxi,ayi,byi;\n    for(i=n-1;i!==-1;--i) {\n        axi = ax[i]; ayi = ay[i]; bxi = bx[i]; byi = by[i];\n        ax[i] = axi*bxi-ayi*byi;\n        ay[i] = axi*byi+ayi*bxi;\n    }\n    numeric.ifftpow2(ax,ay);\n};\nnumeric.T.prototype.fft = function fft() {\n    var x = this.x, y = this.y;\n    var n = x.length, log = Math.log, log2 = log(2),\n        p = Math.ceil(log(2*n-1)/log2), m = Math.pow(2,p);\n    var cx = numeric.rep([m],0), cy = numeric.rep([m],0), cos = Math.cos, sin = Math.sin;\n    var k, c = (-3.141592653589793238462643383279502884197169399375105820/n),t;\n    var a = numeric.rep([m],0), b = numeric.rep([m],0),nhalf = Math.floor(n/2);\n    for(k=0;k<n;k++) a[k] = x[k];\n    if(typeof y !== \"undefined\") for(k=0;k<n;k++) b[k] = y[k];\n    cx[0] = 1;\n    for(k=1;k<=m/2;k++) {\n        t = c*k*k;\n        cx[k] = cos(t);\n        cy[k] = sin(t);\n        cx[m-k] = cos(t);\n        cy[m-k] = sin(t);\n    }\n    var X = new numeric.T(a,b), Y = new numeric.T(cx,cy);\n    X = X.mul(Y);\n    numeric.convpow2(X.x,X.y,numeric.clone(Y.x),numeric.neg(Y.y));\n    X = X.mul(Y);\n    X.x.length = n;\n    X.y.length = n;\n    return X;\n};\nnumeric.T.prototype.ifft = function ifft() {\n    var x = this.x, y = this.y;\n    var n = x.length, log = Math.log, log2 = log(2),\n        p = Math.ceil(log(2*n-1)/log2), m = Math.pow(2,p);\n    var cx = numeric.rep([m],0), cy = numeric.rep([m],0), cos = Math.cos, sin = Math.sin;\n    var k, c = (3.141592653589793238462643383279502884197169399375105820/n),t;\n    var a = numeric.rep([m],0), b = numeric.rep([m],0),nhalf = Math.floor(n/2);\n    for(k=0;k<n;k++) a[k] = x[k];\n    if(typeof y !== \"undefined\") for(k=0;k<n;k++) b[k] = y[k];\n    cx[0] = 1;\n    for(k=1;k<=m/2;k++) {\n        t = c*k*k;\n        cx[k] = cos(t);\n        cy[k] = sin(t);\n        cx[m-k] = cos(t);\n        cy[m-k] = sin(t);\n    }\n    var X = new numeric.T(a,b), Y = new numeric.T(cx,cy);\n    X = X.mul(Y);\n    numeric.convpow2(X.x,X.y,numeric.clone(Y.x),numeric.neg(Y.y));\n    X = X.mul(Y);\n    X.x.length = n;\n    X.y.length = n;\n    return X.div(n);\n};\n\n//9. Unconstrained optimization\nnumeric.gradient = function gradient(f,x) {\n    var n = x.length;\n    var f0 = f(x);\n    if(isNaN(f0)) throw new Error('gradient: f(x) is a NaN!');\n    var max = Math.max;\n    var i,x0 = numeric.clone(x),f1,f2, J = Array(n);\n    var div = numeric.div, sub = numeric.sub,errest,roundoff,max = Math.max,eps = 1e-3,abs = Math.abs, min = Math.min;\n    var t0,t1,t2,it=0,d1,d2,N;\n    for(i=0;i<n;i++) {\n        var h = max(1e-6*f0,1e-8);\n        while(1) {\n            ++it;\n            if(it>20) { throw new Error(\"Numerical gradient fails\"); }\n            x0[i] = x[i]+h;\n            f1 = f(x0);\n            x0[i] = x[i]-h;\n            f2 = f(x0);\n            x0[i] = x[i];\n            if(isNaN(f1) || isNaN(f2)) { h/=16; continue; }\n            J[i] = (f1-f2)/(2*h);\n            t0 = x[i]-h;\n            t1 = x[i];\n            t2 = x[i]+h;\n            d1 = (f1-f0)/h;\n            d2 = (f0-f2)/h;\n            N = max(abs(J[i]),abs(f0),abs(f1),abs(f2),abs(t0),abs(t1),abs(t2),1e-8);\n            errest = min(max(abs(d1-J[i]),abs(d2-J[i]),abs(d1-d2))/N,h/N);\n            if(errest>eps) { h/=16; }\n            else break;\n            }\n    }\n    return J;\n};\n\nnumeric.uncmin = function uncmin(f,x0,tol,gradient,maxit,callback,options) {\n    var grad = numeric.gradient;\n    if(typeof options === \"undefined\") { options = {}; }\n    if(typeof tol === \"undefined\") { tol = 1e-8; }\n    if(typeof gradient === \"undefined\") { gradient = function(x) { return grad(f,x); }; }\n    if(typeof maxit === \"undefined\") maxit = 1000;\n    x0 = numeric.clone(x0);\n    var n = x0.length;\n    var f0 = f(x0),f1,df0;\n    if(isNaN(f0)) throw new Error('uncmin: f(x0) is a NaN!');\n    var max = Math.max, norm2 = numeric.norm2;\n    tol = max(tol,numeric.epsilon);\n    var step,g0,g1,H1 = options.Hinv || numeric.identity(n);\n    var dot = numeric.dot, inv = numeric.inv, sub = numeric.sub, add = numeric.add, ten = numeric.tensor, div = numeric.div, mul = numeric.mul;\n    var all = numeric.all, isfinite = numeric.isFinite, neg = numeric.neg;\n    var it=0,i,s,x1,y,Hy,Hs,ys,i0,t,nstep,t1,t2;\n    var msg = \"\";\n    g0 = gradient(x0);\n    while(it<maxit) {\n        if(typeof callback === \"function\") { if(callback(it,x0,f0,g0,H1)) { msg = \"Callback returned true\"; break; } }\n        if(!all(isfinite(g0))) { msg = \"Gradient has Infinity or NaN\"; break; }\n        step = neg(dot(H1,g0));\n        if(!all(isfinite(step))) { msg = \"Search direction has Infinity or NaN\"; break; }\n        nstep = norm2(step);\n        if(nstep < tol) { msg=\"Newton step smaller than tol\"; break; }\n        t = 1;\n        df0 = dot(g0,step);\n        // line search\n        x1 = x0;\n        while(it < maxit) {\n            if(t*nstep < tol) { break; }\n            s = mul(step,t);\n            x1 = add(x0,s);\n            f1 = f(x1);\n            if(f1-f0 >= 0.1*t*df0 || isNaN(f1)) {\n                t *= 0.5;\n                ++it;\n                continue;\n            }\n            break;\n        }\n        if(t*nstep < tol) { msg = \"Line search step size smaller than tol\"; break; }\n        if(it === maxit) { msg = \"maxit reached during line search\"; break; }\n        g1 = gradient(x1);\n        y = sub(g1,g0);\n        ys = dot(y,s);\n        Hy = dot(H1,y);\n        H1 = sub(add(H1,\n                mul(\n                        (ys+dot(y,Hy))/(ys*ys),\n                        ten(s,s)    )),\n                div(add(ten(Hy,s),ten(s,Hy)),ys));\n        x0 = x1;\n        f0 = f1;\n        g0 = g1;\n        ++it;\n    }\n    return {solution: x0, f: f0, gradient: g0, invHessian: H1, iterations:it, message: msg};\n};\n\n// 10. Ode solver (Dormand-Prince)\nnumeric.Dopri = function Dopri(x,y,f,ymid,iterations,msg,events) {\n    this.x = x;\n    this.y = y;\n    this.f = f;\n    this.ymid = ymid;\n    this.iterations = iterations;\n    this.events = events;\n    this.message = msg;\n};\nnumeric.Dopri.prototype._at = function _at(xi,j) {\n    function sqr(x) { return x*x; }\n    var sol = this;\n    var xs = sol.x;\n    var ys = sol.y;\n    var k1 = sol.f;\n    var ymid = sol.ymid;\n    var n = xs.length;\n    var x0,x1,xh,y0,y1,yh,xi;\n    var floor = Math.floor,h;\n    var c = 0.5;\n    var add = numeric.add, mul = numeric.mul,sub = numeric.sub, p,q,w;\n    x0 = xs[j];\n    x1 = xs[j+1];\n    y0 = ys[j];\n    y1 = ys[j+1];\n    h  = x1-x0;\n    xh = x0+c*h;\n    yh = ymid[j];\n    p = sub(k1[j  ],mul(y0,1/(x0-xh)+2/(x0-x1)));\n    q = sub(k1[j+1],mul(y1,1/(x1-xh)+2/(x1-x0)));\n    w = [sqr(xi - x1) * (xi - xh) / sqr(x0 - x1) / (x0 - xh),\n         sqr(xi - x0) * sqr(xi - x1) / sqr(x0 - xh) / sqr(x1 - xh),\n         sqr(xi - x0) * (xi - xh) / sqr(x1 - x0) / (x1 - xh),\n         (xi - x0) * sqr(xi - x1) * (xi - xh) / sqr(x0-x1) / (x0 - xh),\n         (xi - x1) * sqr(xi - x0) * (xi - xh) / sqr(x0-x1) / (x1 - xh)];\n    return add(add(add(add(mul(y0,w[0]),\n                           mul(yh,w[1])),\n                           mul(y1,w[2])),\n                           mul( p,w[3])),\n                           mul( q,w[4]));\n};\nnumeric.Dopri.prototype.at = function at(x) {\n    var i,j,k,floor = Math.floor;\n    if(typeof x !== \"number\") {\n        var n = x.length, ret = Array(n);\n        for(i=n-1;i!==-1;--i) {\n            ret[i] = this.at(x[i]);\n        }\n        return ret;\n    }\n    var x0 = this.x;\n    i = 0; j = x0.length-1;\n    while(j-i>1) {\n        k = floor(0.5*(i+j));\n        if(x0[k] <= x) i = k;\n        else j = k;\n    }\n    return this._at(x,i);\n};\n\nnumeric.dopri = function dopri(x0,x1,y0,f,tol,maxit,event) {\n    if(typeof tol === \"undefined\") { tol = 1e-6; }\n    if(typeof maxit === \"undefined\") { maxit = 1000; }\n    var xs = [x0], ys = [y0], k1 = [f(x0,y0)], k2,k3,k4,k5,k6,k7, ymid = [];\n    var A2 = 1/5;\n    var A3 = [3/40,9/40];\n    var A4 = [44/45,-56/15,32/9];\n    var A5 = [19372/6561,-25360/2187,64448/6561,-212/729];\n    var A6 = [9017/3168,-355/33,46732/5247,49/176,-5103/18656];\n    var b = [35/384,0,500/1113,125/192,-2187/6784,11/84];\n    var bm = [0.5*6025192743/30085553152,\n              0,\n              0.5*51252292925/65400821598,\n              0.5*-2691868925/45128329728,\n              0.5*187940372067/1594534317056,\n              0.5*-1776094331/19743644256,\n              0.5*11237099/235043384];\n    var c = [1/5,3/10,4/5,8/9,1,1];\n    var e = [-71/57600,0,71/16695,-71/1920,17253/339200,-22/525,1/40];\n    var i = 0,er,j;\n    var h = (x1-x0)/10;\n    var it = 0;\n    var add = numeric.add, mul = numeric.mul, y1,erinf;\n    var max = Math.max, min = Math.min, abs = Math.abs, norminf = numeric.norminf,pow = Math.pow;\n    var any = numeric.any, lt = numeric.lt, and = numeric.and, sub = numeric.sub;\n    var e0, e1, ev;\n    var ret = new numeric.Dopri(xs,ys,k1,ymid,-1,\"\");\n    if(typeof event === \"function\") e0 = event(x0,y0);\n    while(x0<x1 && it<maxit) {\n        ++it;\n        if(x0+h>x1) h = x1-x0;\n        k2 = f(x0+c[0]*h,                add(y0,mul(   A2*h,k1[i])));\n        k3 = f(x0+c[1]*h,            add(add(y0,mul(A3[0]*h,k1[i])),mul(A3[1]*h,k2)));\n        k4 = f(x0+c[2]*h,        add(add(add(y0,mul(A4[0]*h,k1[i])),mul(A4[1]*h,k2)),mul(A4[2]*h,k3)));\n        k5 = f(x0+c[3]*h,    add(add(add(add(y0,mul(A5[0]*h,k1[i])),mul(A5[1]*h,k2)),mul(A5[2]*h,k3)),mul(A5[3]*h,k4)));\n        k6 = f(x0+c[4]*h,add(add(add(add(add(y0,mul(A6[0]*h,k1[i])),mul(A6[1]*h,k2)),mul(A6[2]*h,k3)),mul(A6[3]*h,k4)),mul(A6[4]*h,k5)));\n        y1 = add(add(add(add(add(y0,mul(k1[i],h*b[0])),mul(k3,h*b[2])),mul(k4,h*b[3])),mul(k5,h*b[4])),mul(k6,h*b[5]));\n        k7 = f(x0+h,y1);\n        er = add(add(add(add(add(mul(k1[i],h*e[0]),mul(k3,h*e[2])),mul(k4,h*e[3])),mul(k5,h*e[4])),mul(k6,h*e[5])),mul(k7,h*e[6]));\n        if(typeof er === \"number\") erinf = abs(er);\n        else erinf = norminf(er);\n        if(erinf > tol) { // reject\n            h = 0.2*h*pow(tol/erinf,0.25);\n            if(x0+h === x0) {\n                ret.msg = \"Step size became too small\";\n                break;\n            }\n            continue;\n        }\n        ymid[i] = add(add(add(add(add(add(y0,\n                mul(k1[i],h*bm[0])),\n                mul(k3   ,h*bm[2])),\n                mul(k4   ,h*bm[3])),\n                mul(k5   ,h*bm[4])),\n                mul(k6   ,h*bm[5])),\n                mul(k7   ,h*bm[6]));\n        ++i;\n        xs[i] = x0+h;\n        ys[i] = y1;\n        k1[i] = k7;\n        if(typeof event === \"function\") {\n            var yi,xl = x0,xr = x0+0.5*h,xi;\n            e1 = event(xr,ymid[i-1]);\n            ev = and(lt(e0,0),lt(0,e1));\n            if(!any(ev)) { xl = xr; xr = x0+h; e0 = e1; e1 = event(xr,y1); ev = and(lt(e0,0),lt(0,e1)); }\n            if(any(ev)) {\n                var xc, yc, en,ei;\n                var side=0, sl = 1.0, sr = 1.0;\n                while(1) {\n                    if(typeof e0 === \"number\") xi = (sr*e1*xl-sl*e0*xr)/(sr*e1-sl*e0);\n                    else {\n                        xi = xr;\n                        for(j=e0.length-1;j!==-1;--j) {\n                            if(e0[j]<0 && e1[j]>0) xi = min(xi,(sr*e1[j]*xl-sl*e0[j]*xr)/(sr*e1[j]-sl*e0[j]));\n                        }\n                    }\n                    if(xi <= xl || xi >= xr) break;\n                    yi = ret._at(xi, i-1);\n                    ei = event(xi,yi);\n                    en = and(lt(e0,0),lt(0,ei));\n                    if(any(en)) {\n                        xr = xi;\n                        e1 = ei;\n                        ev = en;\n                        sr = 1.0;\n                        if(side === -1) sl *= 0.5;\n                        else sl = 1.0;\n                        side = -1;\n                    } else {\n                        xl = xi;\n                        e0 = ei;\n                        sl = 1.0;\n                        if(side === 1) sr *= 0.5;\n                        else sr = 1.0;\n                        side = 1;\n                    }\n                }\n                y1 = ret._at(0.5*(x0+xi),i-1);\n                ret.f[i] = f(xi,yi);\n                ret.x[i] = xi;\n                ret.y[i] = yi;\n                ret.ymid[i-1] = y1;\n                ret.events = ev;\n                ret.iterations = it;\n                return ret;\n            }\n        }\n        x0 += h;\n        y0 = y1;\n        e0 = e1;\n        h = min(0.8*h*pow(tol/erinf,0.25),4*h);\n    }\n    ret.iterations = it;\n    return ret;\n};\n\n// 11. Ax = b\nnumeric.LU = function(A, fast) {\n  fast = fast || false;\n\n  var abs = Math.abs;\n  var i, j, k, absAjk, Akk, Ak, Pk, Ai;\n  var max;\n  var n = A.length, n1 = n-1;\n  var P = new Array(n);\n  if(!fast) A = numeric.clone(A);\n\n  for (k = 0; k < n; ++k) {\n    Pk = k;\n    Ak = A[k];\n    max = abs(Ak[k]);\n    for (j = k + 1; j < n; ++j) {\n      absAjk = abs(A[j][k]);\n      if (max < absAjk) {\n        max = absAjk;\n        Pk = j;\n      }\n    }\n    P[k] = Pk;\n\n    if (Pk != k) {\n      A[k] = A[Pk];\n      A[Pk] = Ak;\n      Ak = A[k];\n    }\n\n    Akk = Ak[k];\n\n    for (i = k + 1; i < n; ++i) {\n      A[i][k] /= Akk;\n    }\n\n    for (i = k + 1; i < n; ++i) {\n      Ai = A[i];\n      for (j = k + 1; j < n1; ++j) {\n        Ai[j] -= Ai[k] * Ak[j];\n        ++j;\n        Ai[j] -= Ai[k] * Ak[j];\n      }\n      if(j===n1) Ai[j] -= Ai[k] * Ak[j];\n    }\n  }\n\n  return {\n    LU: A,\n    P:  P\n  };\n};\n\nnumeric.LUsolve = function LUsolve(LUP, b) {\n  var i, j;\n  var LU = LUP.LU;\n  var n   = LU.length;\n  var x = numeric.clone(b);\n  var P   = LUP.P;\n  var Pi, LUi, LUii, tmp;\n\n  for (i=n-1;i!==-1;--i) x[i] = b[i];\n  for (i = 0; i < n; ++i) {\n    Pi = P[i];\n    if (P[i] !== i) {\n      tmp = x[i];\n      x[i] = x[Pi];\n      x[Pi] = tmp;\n    }\n\n    LUi = LU[i];\n    for (j = 0; j < i; ++j) {\n      x[i] -= x[j] * LUi[j];\n    }\n  }\n\n  for (i = n - 1; i >= 0; --i) {\n    LUi = LU[i];\n    for (j = i + 1; j < n; ++j) {\n      x[i] -= x[j] * LUi[j];\n    }\n\n    x[i] /= LUi[i];\n  }\n\n  return x;\n};\n\nnumeric.solve = function solve(A,b,fast) { return numeric.LUsolve(numeric.LU(A,fast), b); };\n\n// 12. Linear programming\nnumeric.echelonize = function echelonize(A) {\n    var s = numeric.dim(A), m = s[0], n = s[1];\n    var I = numeric.identity(m);\n    var P = Array(m);\n    var i,j,k,l,Ai,Ii,Z,a;\n    var abs = Math.abs;\n    var diveq = numeric.diveq;\n    A = numeric.clone(A);\n    for(i=0;i<m;++i) {\n        k = 0;\n        Ai = A[i];\n        Ii = I[i];\n        for(j=1;j<n;++j) if(abs(Ai[k])<abs(Ai[j])) k=j;\n        P[i] = k;\n        diveq(Ii,Ai[k]);\n        diveq(Ai,Ai[k]);\n        for(j=0;j<m;++j) if(j!==i) {\n            Z = A[j]; a = Z[k];\n            for(l=n-1;l!==-1;--l) Z[l] -= Ai[l]*a;\n            Z = I[j];\n            for(l=m-1;l!==-1;--l) Z[l] -= Ii[l]*a;\n        }\n    }\n    return {I:I, A:A, P:P};\n};\n\nnumeric.__solveLP = function __solveLP(c,A,b,tol,maxit,x,flag) {\n    var sum = numeric.sum, log = numeric.log, mul = numeric.mul, sub = numeric.sub, dot = numeric.dot, div = numeric.div, add = numeric.add;\n    var m = c.length, n = b.length,y;\n    var unbounded = false, cb,i0=0;\n    var alpha = 1.0;\n    var f0,df0,AT = numeric.transpose(A), svd = numeric.svd,transpose = numeric.transpose,leq = numeric.leq, sqrt = Math.sqrt, abs = Math.abs;\n    var muleq = numeric.muleq;\n    var norm = numeric.norminf, any = numeric.any,min = Math.min;\n    var all = numeric.all, gt = numeric.gt;\n    var p = Array(m), A0 = Array(n),e=numeric.rep([n],1), H;\n    var solve = numeric.solve, z = sub(b,dot(A,x)),count;\n    var dotcc = dot(c,c);\n    var g;\n    for(count=i0;count<maxit;++count) {\n        var i,j,d;\n        for(i=n-1;i!==-1;--i) A0[i] = div(A[i],z[i]);\n        var A1 = transpose(A0);\n        for(i=m-1;i!==-1;--i) p[i] = (/*x[i]+*/sum(A1[i]));\n        alpha = 0.25*abs(dotcc/dot(c,p));\n        var a1 = 100*sqrt(dotcc/dot(p,p));\n        if(!isFinite(alpha) || alpha>a1) alpha = a1;\n        g = add(c,mul(alpha,p));\n        H = dot(A1,A0);\n        for(i=m-1;i!==-1;--i) H[i][i] += 1;\n        d = solve(H,div(g,alpha),true);\n        var t0 = div(z,dot(A,d));\n        var t = 1.0;\n        for(i=n-1;i!==-1;--i) if(t0[i]<0) t = min(t,-0.999*t0[i]);\n        y = sub(x,mul(d,t));\n        z = sub(b,dot(A,y));\n        if(!all(gt(z,0))) return { solution: x, message: \"\", iterations: count };\n        x = y;\n        if(alpha<tol) return { solution: y, message: \"\", iterations: count };\n        if(flag) {\n            var s = dot(c,g), Ag = dot(A,g);\n            unbounded = true;\n            for(i=n-1;i!==-1;--i) if(s*Ag[i]<0) { unbounded = false; break; }\n        } else {\n            if(x[m-1]>=0) unbounded = false;\n            else unbounded = true;\n        }\n        if(unbounded) return { solution: y, message: \"Unbounded\", iterations: count };\n    }\n    return { solution: x, message: \"maximum iteration count exceeded\", iterations:count };\n};\n\nnumeric._solveLP = function _solveLP(c,A,b,tol,maxit) {\n    var m = c.length, n = b.length,y;\n    var sum = numeric.sum, log = numeric.log, mul = numeric.mul, sub = numeric.sub, dot = numeric.dot, div = numeric.div, add = numeric.add;\n    var c0 = numeric.rep([m],0).concat([1]);\n    var J = numeric.rep([n,1],-1);\n    var A0 = numeric.blockMatrix([[A                   ,   J  ]]);\n    var b0 = b;\n    var y = numeric.rep([m],0).concat(Math.max(0,numeric.sup(numeric.neg(b)))+1);\n    var x0 = numeric.__solveLP(c0,A0,b0,tol,maxit,y,false);\n    var x = numeric.clone(x0.solution);\n    x.length = m;\n    var foo = numeric.inf(sub(b,dot(A,x)));\n    if(foo<0) { return { solution: NaN, message: \"Infeasible\", iterations: x0.iterations }; }\n    var ret = numeric.__solveLP(c, A, b, tol, maxit-x0.iterations, x, true);\n    ret.iterations += x0.iterations;\n    return ret;\n};\n\nnumeric.solveLP = function solveLP(c,A,b,Aeq,beq,tol,maxit) {\n    if(typeof maxit === \"undefined\") maxit = 1000;\n    if(typeof tol === \"undefined\") tol = numeric.epsilon;\n    if(typeof Aeq === \"undefined\") return numeric._solveLP(c,A,b,tol,maxit);\n    var m = Aeq.length, n = Aeq[0].length, o = A.length;\n    var B = numeric.echelonize(Aeq);\n    var flags = numeric.rep([n],0);\n    var P = B.P;\n    var Q = [];\n    var i;\n    for(i=P.length-1;i!==-1;--i) flags[P[i]] = 1;\n    for(i=n-1;i!==-1;--i) if(flags[i]===0) Q.push(i);\n    var g = numeric.getRange;\n    var I = numeric.linspace(0,m-1), J = numeric.linspace(0,o-1);\n    var Aeq2 = g(Aeq,I,Q), A1 = g(A,J,P), A2 = g(A,J,Q), dot = numeric.dot, sub = numeric.sub;\n    var A3 = dot(A1,B.I);\n    var A4 = sub(A2,dot(A3,Aeq2)), b4 = sub(b,dot(A3,beq));\n    var c1 = Array(P.length), c2 = Array(Q.length);\n    for(i=P.length-1;i!==-1;--i) c1[i] = c[P[i]];\n    for(i=Q.length-1;i!==-1;--i) c2[i] = c[Q[i]];\n    var c4 = sub(c2,dot(c1,dot(B.I,Aeq2)));\n    var S = numeric._solveLP(c4,A4,b4,tol,maxit);\n    var x2 = S.solution;\n    if(x2!==x2) return S;\n    var x1 = dot(B.I,sub(beq,dot(Aeq2,x2)));\n    var x = Array(c.length);\n    for(i=P.length-1;i!==-1;--i) x[P[i]] = x1[i];\n    for(i=Q.length-1;i!==-1;--i) x[Q[i]] = x2[i];\n    return { solution: x, message:S.message, iterations: S.iterations };\n};\n\nnumeric.MPStoLP = function MPStoLP(MPS) {\n    if(MPS instanceof String) { MPS.split('\\n'); }\n    var state = 0;\n    var states = ['Initial state','NAME','ROWS','COLUMNS','RHS','BOUNDS','ENDATA'];\n    var n = MPS.length;\n    var i,j,z,N=0,rows = {}, sign = [], rl = 0, vars = {}, nv = 0;\n    var name;\n    var c = [], A = [], b = [];\n    function err(e) { throw new Error('MPStoLP: '+e+'\\nLine '+i+': '+MPS[i]+'\\nCurrent state: '+states[state]+'\\n'); }\n    for(i=0;i<n;++i) {\n        z = MPS[i];\n        var w0 = z.match(/\\S*/g);\n        var w = [];\n        for(j=0;j<w0.length;++j) if(w0[j]!==\"\") w.push(w0[j]);\n        if(w.length === 0) continue;\n        for(j=0;j<states.length;++j) if(z.substr(0,states[j].length) === states[j]) break;\n        if(j<states.length) {\n            state = j;\n            if(j===1) { name = w[1]; }\n            if(j===6) return { name:name, c:c, A:numeric.transpose(A), b:b, rows:rows, vars:vars };\n            continue;\n        }\n        switch(state) {\n        case 0: case 1: err('Unexpected line');\n        case 2: \n            switch(w[0]) {\n            case 'N': if(N===0) N = w[1]; else err('Two or more N rows'); break;\n            case 'L': rows[w[1]] = rl; sign[rl] = 1; b[rl] = 0; ++rl; break;\n            case 'G': rows[w[1]] = rl; sign[rl] = -1;b[rl] = 0; ++rl; break;\n            case 'E': rows[w[1]] = rl; sign[rl] = 0;b[rl] = 0; ++rl; break;\n            default: err('Parse error '+numeric.prettyPrint(w));\n            }\n            break;\n        case 3:\n            if(!vars.hasOwnProperty(w[0])) { vars[w[0]] = nv; c[nv] = 0; A[nv] = numeric.rep([rl],0); ++nv; }\n            var p = vars[w[0]];\n            for(j=1;j<w.length;j+=2) {\n                if(w[j] === N) { c[p] = parseFloat(w[j+1]); continue; }\n                var q = rows[w[j]];\n                A[p][q] = (sign[q]<0?-1:1)*parseFloat(w[j+1]);\n            }\n            break;\n        case 4:\n            for(j=1;j<w.length;j+=2) b[rows[w[j]]] = (sign[rows[w[j]]]<0?-1:1)*parseFloat(w[j+1]);\n            break;\n        case 5: /*FIXME*/ break;\n        case 6: err('Internal error');\n        }\n    }\n    err('Reached end of file without ENDATA');\n};\n// seedrandom.js version 2.0.\n// Author: David Bau 4/2/2011\n//\n// Defines a method Math.seedrandom() that, when called, substitutes\n// an explicitly seeded RC4-based algorithm for Math.random().  Also\n// supports automatic seeding from local or network sources of entropy.\n//\n// Usage:\n//\n//   <script src=http://davidbau.com/encode/seedrandom-min.js></script>\n//\n//   Math.seedrandom('yipee'); Sets Math.random to a function that is\n//                             initialized using the given explicit seed.\n//\n//   Math.seedrandom();        Sets Math.random to a function that is\n//                             seeded using the current time, dom state,\n//                             and other accumulated local entropy.\n//                             The generated seed string is returned.\n//\n//   Math.seedrandom('yowza', true);\n//                             Seeds using the given explicit seed mixed\n//                             together with accumulated entropy.\n//\n//   <script src=\"http://bit.ly/srandom-512\"></script>\n//                             Seeds using physical random bits downloaded\n//                             from random.org.\n//\n//   <script src=\"https://jsonlib.appspot.com/urandom?callback=Math.seedrandom\">\n//   </script>                 Seeds using urandom bits from call.jsonlib.com,\n//                             which is faster than random.org.\n//\n// Examples:\n//\n//   Math.seedrandom(\"hello\");            // Use \"hello\" as the seed.\n//   document.write(Math.random());       // Always 0.5463663768140734\n//   document.write(Math.random());       // Always 0.43973793770592234\n//   var rng1 = Math.random;              // Remember the current prng.\n//\n//   var autoseed = Math.seedrandom();    // New prng with an automatic seed.\n//   document.write(Math.random());       // Pretty much unpredictable.\n//\n//   Math.random = rng1;                  // Continue \"hello\" prng sequence.\n//   document.write(Math.random());       // Always 0.554769432473455\n//\n//   Math.seedrandom(autoseed);           // Restart at the previous seed.\n//   document.write(Math.random());       // Repeat the 'unpredictable' value.\n//\n// Notes:\n//\n// Each time seedrandom('arg') is called, entropy from the passed seed\n// is accumulated in a pool to help generate future seeds for the\n// zero-argument form of Math.seedrandom, so entropy can be injected over\n// time by calling seedrandom with explicit data repeatedly.\n//\n// On speed - This javascript implementation of Math.random() is about\n// 3-10x slower than the built-in Math.random() because it is not native\n// code, but this is typically fast enough anyway.  Seeding is more expensive,\n// especially if you use auto-seeding.  Some details (timings on Chrome 4):\n//\n// Our Math.random()            - avg less than 0.002 milliseconds per call\n// seedrandom('explicit')       - avg less than 0.5 milliseconds per call\n// seedrandom('explicit', true) - avg less than 2 milliseconds per call\n// seedrandom()                 - avg about 38 milliseconds per call\n//\n// LICENSE (BSD):\n//\n// Copyright 2010 David Bau, all rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n// \n//   1. Redistributions of source code must retain the above copyright\n//      notice, this list of conditions and the following disclaimer.\n//\n//   2. Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n// \n//   3. Neither the name of this module nor the names of its contributors may\n//      be used to endorse or promote products derived from this software\n//      without specific prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n/**\n * All code is in an anonymous closure to keep the global namespace clean.\n *\n * @param {number=} overflow \n * @param {number=} startdenom\n */\n\n// Patched by Seb so that seedrandom.js does not pollute the Math object.\n// My tests suggest that doing Math.trouble = 1 makes Math lookups about 5%\n// slower.\nnumeric.seedrandom = { pow:Math.pow, random:Math.random };\n\n(function (pool, math, width, chunks, significance, overflow, startdenom) {\n\n\n//\n// seedrandom()\n// This is the seedrandom function described above.\n//\nmath['seedrandom'] = function seedrandom(seed, use_entropy) {\n  var key = [];\n  var arc4;\n\n  // Flatten the seed string or build one from local entropy if needed.\n  seed = mixkey(flatten(\n    use_entropy ? [seed, pool] :\n    arguments.length ? seed :\n    [new Date().getTime(), pool, window], 3), key);\n\n  // Use the seed to initialize an ARC4 generator.\n  arc4 = new ARC4(key);\n\n  // Mix the randomness into accumulated entropy.\n  mixkey(arc4.S, pool);\n\n  // Override Math.random\n\n  // This function returns a random double in [0, 1) that contains\n  // randomness in every bit of the mantissa of the IEEE 754 value.\n\n  math['random'] = function random() {  // Closure to return a random double:\n    var n = arc4.g(chunks);             // Start with a numerator n < 2 ^ 48\n    var d = startdenom;                 //   and denominator d = 2 ^ 48.\n    var x = 0;                          //   and no 'extra last byte'.\n    while (n < significance) {          // Fill up all significant digits by\n      n = (n + x) * width;              //   shifting numerator and\n      d *= width;                       //   denominator and generating a\n      x = arc4.g(1);                    //   new least-significant-byte.\n    }\n    while (n >= overflow) {             // To avoid rounding up, before adding\n      n /= 2;                           //   last byte, shift everything\n      d /= 2;                           //   right using integer math until\n      x >>>= 1;                         //   we have exactly the desired bits.\n    }\n    return (n + x) / d;                 // Form the number within [0, 1).\n  };\n\n  // Return the seed that was used\n  return seed;\n};\n\n//\n// ARC4\n//\n// An ARC4 implementation.  The constructor takes a key in the form of\n// an array of at most (width) integers that should be 0 <= x < (width).\n//\n// The g(count) method returns a pseudorandom integer that concatenates\n// the next (count) outputs from ARC4.  Its return value is a number x\n// that is in the range 0 <= x < (width ^ count).\n//\n/** @constructor */\nfunction ARC4(key) {\n  var t, u, me = this, keylen = key.length;\n  var i = 0, j = me.i = me.j = me.m = 0;\n  me.S = [];\n  me.c = [];\n\n  // The empty key [] is treated as [0].\n  if (!keylen) { key = [keylen++]; }\n\n  // Set up S using the standard key scheduling algorithm.\n  while (i < width) { me.S[i] = i++; }\n  for (i = 0; i < width; i++) {\n    t = me.S[i];\n    j = lowbits(j + t + key[i % keylen]);\n    u = me.S[j];\n    me.S[i] = u;\n    me.S[j] = t;\n  }\n\n  // The \"g\" method returns the next (count) outputs as one number.\n  me.g = function getnext(count) {\n    var s = me.S;\n    var i = lowbits(me.i + 1); var t = s[i];\n    var j = lowbits(me.j + t); var u = s[j];\n    s[i] = u;\n    s[j] = t;\n    var r = s[lowbits(t + u)];\n    while (--count) {\n      i = lowbits(i + 1); t = s[i];\n      j = lowbits(j + t); u = s[j];\n      s[i] = u;\n      s[j] = t;\n      r = r * width + s[lowbits(t + u)];\n    }\n    me.i = i;\n    me.j = j;\n    return r;\n  };\n  // For robust unpredictability discard an initial batch of values.\n  // See http://www.rsa.com/rsalabs/node.asp?id=2009\n  me.g(width);\n}\n\n//\n// flatten()\n// Converts an object tree to nested arrays of strings.\n//\n/** @param {Object=} result \n  * @param {string=} prop\n  * @param {string=} typ */\nfunction flatten(obj, depth, result, prop, typ) {\n  result = [];\n  typ = typeof(obj);\n  if (depth && typ == 'object') {\n    for (prop in obj) {\n      if (prop.indexOf('S') < 5) {    // Avoid FF3 bug (local/sessionStorage)\n        try { result.push(flatten(obj[prop], depth - 1)); } catch (e) {}\n      }\n    }\n  }\n  return (result.length ? result : obj + (typ != 'string' ? '\\0' : ''));\n}\n\n//\n// mixkey()\n// Mixes a string seed into a key that is an array of integers, and\n// returns a shortened string seed that is equivalent to the result key.\n//\n/** @param {number=} smear \n  * @param {number=} j */\nfunction mixkey(seed, key, smear, j) {\n  seed += '';                         // Ensure the seed is a string\n  smear = 0;\n  for (j = 0; j < seed.length; j++) {\n    key[lowbits(j)] =\n      lowbits((smear ^= key[lowbits(j)] * 19) + seed.charCodeAt(j));\n  }\n  seed = '';\n  for (j in key) { seed += String.fromCharCode(key[j]); }\n  return seed;\n}\n\n//\n// lowbits()\n// A quick \"n mod width\" for width a power of 2.\n//\nfunction lowbits(n) { return n & (width - 1); }\n\n//\n// The following constants are related to IEEE 754 limits.\n//\nstartdenom = math.pow(width, chunks);\nsignificance = math.pow(2, significance);\noverflow = significance * 2;\n\n//\n// When seedrandom.js is loaded, we immediately mix a few bits\n// from the built-in RNG into the entropy pool.  Because we do\n// not want to intefere with determinstic PRNG state later,\n// seedrandom will not call math.random on its own again after\n// initialization.\n//\nmixkey(math.random(), pool);\n\n// End anonymous scope, and pass initial values.\n}(\n  [],   // pool: entropy pool starts empty\n  numeric.seedrandom, // math: package containing random, pow, and seedrandom\n  256,  // width: each RC4 output is 0 <= x < 256\n  6,    // chunks: at least six RC4 outputs for each double\n  52    // significance: there are 52 significant digits in a double\n  ));\n/* This file is a slightly modified version of quadprog.js from Alberto Santini.\n * It has been slightly modified by Sébastien Loisel to make sure that it handles\n * 0-based Arrays instead of 1-based Arrays.\n * License is in resources/LICENSE.quadprog */\n(function(exports) {\n\nfunction base0to1(A) {\n    if(typeof A !== \"object\") { return A; }\n    var ret = [], i,n=A.length;\n    for(i=0;i<n;i++) ret[i+1] = base0to1(A[i]);\n    return ret;\n}\nfunction base1to0(A) {\n    if(typeof A !== \"object\") { return A; }\n    var ret = [], i,n=A.length;\n    for(i=1;i<n;i++) ret[i-1] = base1to0(A[i]);\n    return ret;\n}\n\nfunction dpori(a, lda, n) {\n    var i, j, k, kp1, t;\n\n    for (k = 1; k <= n; k = k + 1) {\n        a[k][k] = 1 / a[k][k];\n        t = -a[k][k];\n        //~ dscal(k - 1, t, a[1][k], 1);\n        for (i = 1; i < k; i = i + 1) {\n            a[i][k] = t * a[i][k];\n        }\n\n        kp1 = k + 1;\n        if (n < kp1) {\n            break;\n        }\n        for (j = kp1; j <= n; j = j + 1) {\n            t = a[k][j];\n            a[k][j] = 0;\n            //~ daxpy(k, t, a[1][k], 1, a[1][j], 1);\n            for (i = 1; i <= k; i = i + 1) {\n                a[i][j] = a[i][j] + (t * a[i][k]);\n            }\n        }\n    }\n\n}\n\nfunction dposl(a, lda, n, b) {\n    var i, k, kb, t;\n\n    for (k = 1; k <= n; k = k + 1) {\n        //~ t = ddot(k - 1, a[1][k], 1, b[1], 1);\n        t = 0;\n        for (i = 1; i < k; i = i + 1) {\n            t = t + (a[i][k] * b[i]);\n        }\n\n        b[k] = (b[k] - t) / a[k][k];\n    }\n\n    for (kb = 1; kb <= n; kb = kb + 1) {\n        k = n + 1 - kb;\n        b[k] = b[k] / a[k][k];\n        t = -b[k];\n        //~ daxpy(k - 1, t, a[1][k], 1, b[1], 1);\n        for (i = 1; i < k; i = i + 1) {\n            b[i] = b[i] + (t * a[i][k]);\n        }\n    }\n}\n\nfunction dpofa(a, lda, n, info) {\n    var i, j, jm1, k, t, s;\n\n    for (j = 1; j <= n; j = j + 1) {\n        info[1] = j;\n        s = 0;\n        jm1 = j - 1;\n        if (jm1 < 1) {\n            s = a[j][j] - s;\n            if (s <= 0) {\n                break;\n            }\n            a[j][j] = Math.sqrt(s);\n        } else {\n            for (k = 1; k <= jm1; k = k + 1) {\n                //~ t = a[k][j] - ddot(k - 1, a[1][k], 1, a[1][j], 1);\n                t = a[k][j];\n                for (i = 1; i < k; i = i + 1) {\n                    t = t - (a[i][j] * a[i][k]);\n                }\n                t = t / a[k][k];\n                a[k][j] = t;\n                s = s + t * t;\n            }\n            s = a[j][j] - s;\n            if (s <= 0) {\n                break;\n            }\n            a[j][j] = Math.sqrt(s);\n        }\n        info[1] = 0;\n    }\n}\n\nfunction qpgen2(dmat, dvec, fddmat, n, sol, crval, amat,\n    bvec, fdamat, q, meq, iact, nact, iter, work, ierr) {\n\n    var i, j, l, l1, info, it1, iwzv, iwrv, iwrm, iwsv, iwuv, nvl, r, iwnbv,\n        temp, sum, t1, tt, gc, gs, nu,\n        t1inf, t2min,\n        vsmall, tmpa, tmpb,\n        go;\n\n    r = Math.min(n, q);\n    l = 2 * n + (r * (r + 5)) / 2 + 2 * q + 1;\n\n    vsmall = 1.0e-60;\n    do {\n        vsmall = vsmall + vsmall;\n        tmpa = 1 + 0.1 * vsmall;\n        tmpb = 1 + 0.2 * vsmall;\n    } while (tmpa <= 1 || tmpb <= 1);\n\n    for (i = 1; i <= n; i = i + 1) {\n        work[i] = dvec[i];\n    }\n    for (i = n + 1; i <= l; i = i + 1) {\n        work[i] = 0;\n    }\n    for (i = 1; i <= q; i = i + 1) {\n        iact[i] = 0;\n    }\n\n    info = [];\n\n    if (ierr[1] === 0) {\n        dpofa(dmat, fddmat, n, info);\n        if (info[1] !== 0) {\n            ierr[1] = 2;\n            return;\n        }\n        dposl(dmat, fddmat, n, dvec);\n        dpori(dmat, fddmat, n);\n    } else {\n        for (j = 1; j <= n; j = j + 1) {\n            sol[j] = 0;\n            for (i = 1; i <= j; i = i + 1) {\n                sol[j] = sol[j] + dmat[i][j] * dvec[i];\n            }\n        }\n        for (j = 1; j <= n; j = j + 1) {\n            dvec[j] = 0;\n            for (i = j; i <= n; i = i + 1) {\n                dvec[j] = dvec[j] + dmat[j][i] * sol[i];\n            }\n        }\n    }\n\n    crval[1] = 0;\n    for (j = 1; j <= n; j = j + 1) {\n        sol[j] = dvec[j];\n        crval[1] = crval[1] + work[j] * sol[j];\n        work[j] = 0;\n        for (i = j + 1; i <= n; i = i + 1) {\n            dmat[i][j] = 0;\n        }\n    }\n    crval[1] = -crval[1] / 2;\n    ierr[1] = 0;\n\n    iwzv = n;\n    iwrv = iwzv + n;\n    iwuv = iwrv + r;\n    iwrm = iwuv + r + 1;\n    iwsv = iwrm + (r * (r + 1)) / 2;\n    iwnbv = iwsv + q;\n\n    for (i = 1; i <= q; i = i + 1) {\n        sum = 0;\n        for (j = 1; j <= n; j = j + 1) {\n            sum = sum + amat[j][i] * amat[j][i];\n        }\n        work[iwnbv + i] = Math.sqrt(sum);\n    }\n    nact = 0;\n    iter[1] = 0;\n    iter[2] = 0;\n\n    function fn_goto_50() {\n        iter[1] = iter[1] + 1;\n\n        l = iwsv;\n        for (i = 1; i <= q; i = i + 1) {\n            l = l + 1;\n            sum = -bvec[i];\n            for (j = 1; j <= n; j = j + 1) {\n                sum = sum + amat[j][i] * sol[j];\n            }\n            if (Math.abs(sum) < vsmall) {\n                sum = 0;\n            }\n            if (i > meq) {\n                work[l] = sum;\n            } else {\n                work[l] = -Math.abs(sum);\n                if (sum > 0) {\n                    for (j = 1; j <= n; j = j + 1) {\n                        amat[j][i] = -amat[j][i];\n                    }\n                    bvec[i] = -bvec[i];\n                }\n            }\n        }\n\n        for (i = 1; i <= nact; i = i + 1) {\n            work[iwsv + iact[i]] = 0;\n        }\n\n        nvl = 0;\n        temp = 0;\n        for (i = 1; i <= q; i = i + 1) {\n            if (work[iwsv + i] < temp * work[iwnbv + i]) {\n                nvl = i;\n                temp = work[iwsv + i] / work[iwnbv + i];\n            }\n        }\n        if (nvl === 0) {\n            return 999;\n        }\n\n        return 0;\n    }\n\n    function fn_goto_55() {\n        for (i = 1; i <= n; i = i + 1) {\n            sum = 0;\n            for (j = 1; j <= n; j = j + 1) {\n                sum = sum + dmat[j][i] * amat[j][nvl];\n            }\n            work[i] = sum;\n        }\n\n        l1 = iwzv;\n        for (i = 1; i <= n; i = i + 1) {\n            work[l1 + i] = 0;\n        }\n        for (j = nact + 1; j <= n; j = j + 1) {\n            for (i = 1; i <= n; i = i + 1) {\n                work[l1 + i] = work[l1 + i] + dmat[i][j] * work[j];\n            }\n        }\n\n        t1inf = true;\n        for (i = nact; i >= 1; i = i - 1) {\n            sum = work[i];\n            l = iwrm + (i * (i + 3)) / 2;\n            l1 = l - i;\n            for (j = i + 1; j <= nact; j = j + 1) {\n                sum = sum - work[l] * work[iwrv + j];\n                l = l + j;\n            }\n            sum = sum / work[l1];\n            work[iwrv + i] = sum;\n            if (iact[i] < meq) {\n                // continue;\n                break;\n            }\n            if (sum < 0) {\n                // continue;\n                break;\n            }\n            t1inf = false;\n            it1 = i;\n        }\n\n        if (!t1inf) {\n            t1 = work[iwuv + it1] / work[iwrv + it1];\n            for (i = 1; i <= nact; i = i + 1) {\n                if (iact[i] < meq) {\n                    // continue;\n                    break;\n                }\n                if (work[iwrv + i] < 0) {\n                    // continue;\n                    break;\n                }\n                temp = work[iwuv + i] / work[iwrv + i];\n                if (temp < t1) {\n                    t1 = temp;\n                    it1 = i;\n                }\n            }\n        }\n\n        sum = 0;\n        for (i = iwzv + 1; i <= iwzv + n; i = i + 1) {\n            sum = sum + work[i] * work[i];\n        }\n        if (Math.abs(sum) <= vsmall) {\n            if (t1inf) {\n                ierr[1] = 1;\n                // GOTO 999\n                return 999;\n            } else {\n                for (i = 1; i <= nact; i = i + 1) {\n                    work[iwuv + i] = work[iwuv + i] - t1 * work[iwrv + i];\n                }\n                work[iwuv + nact + 1] = work[iwuv + nact + 1] + t1;\n                // GOTO 700\n                return 700;\n            }\n        } else {\n            sum = 0;\n            for (i = 1; i <= n; i = i + 1) {\n                sum = sum + work[iwzv + i] * amat[i][nvl];\n            }\n            tt = -work[iwsv + nvl] / sum;\n            t2min = true;\n            if (!t1inf) {\n                if (t1 < tt) {\n                    tt = t1;\n                    t2min = false;\n                }\n            }\n\n            for (i = 1; i <= n; i = i + 1) {\n                sol[i] = sol[i] + tt * work[iwzv + i];\n                if (Math.abs(sol[i]) < vsmall) {\n                    sol[i] = 0;\n                }\n            }\n\n            crval[1] = crval[1] + tt * sum * (tt / 2 + work[iwuv + nact + 1]);\n            for (i = 1; i <= nact; i = i + 1) {\n                work[iwuv + i] = work[iwuv + i] - tt * work[iwrv + i];\n            }\n            work[iwuv + nact + 1] = work[iwuv + nact + 1] + tt;\n\n            if (t2min) {\n                nact = nact + 1;\n                iact[nact] = nvl;\n\n                l = iwrm + ((nact - 1) * nact) / 2 + 1;\n                for (i = 1; i <= nact - 1; i = i + 1) {\n                    work[l] = work[i];\n                    l = l + 1;\n                }\n\n                if (nact === n) {\n                    work[l] = work[n];\n                } else {\n                    for (i = n; i >= nact + 1; i = i - 1) {\n                        if (work[i] === 0) {\n                            // continue;\n                            break;\n                        }\n                        gc = Math.max(Math.abs(work[i - 1]), Math.abs(work[i]));\n                        gs = Math.min(Math.abs(work[i - 1]), Math.abs(work[i]));\n                        if (work[i - 1] >= 0) {\n                            temp = Math.abs(gc * Math.sqrt(1 + gs * gs / (gc * gc)));\n                        } else {\n                            temp = -Math.abs(gc * Math.sqrt(1 + gs * gs / (gc * gc)));\n                        }\n                        gc = work[i - 1] / temp;\n                        gs = work[i] / temp;\n\n                        if (gc === 1) {\n                            // continue;\n                            break;\n                        }\n                        if (gc === 0) {\n                            work[i - 1] = gs * temp;\n                            for (j = 1; j <= n; j = j + 1) {\n                                temp = dmat[j][i - 1];\n                                dmat[j][i - 1] = dmat[j][i];\n                                dmat[j][i] = temp;\n                            }\n                        } else {\n                            work[i - 1] = temp;\n                            nu = gs / (1 + gc);\n                            for (j = 1; j <= n; j = j + 1) {\n                                temp = gc * dmat[j][i - 1] + gs * dmat[j][i];\n                                dmat[j][i] = nu * (dmat[j][i - 1] + temp) - dmat[j][i];\n                                dmat[j][i - 1] = temp;\n\n                            }\n                        }\n                    }\n                    work[l] = work[nact];\n                }\n            } else {\n                sum = -bvec[nvl];\n                for (j = 1; j <= n; j = j + 1) {\n                    sum = sum + sol[j] * amat[j][nvl];\n                }\n                if (nvl > meq) {\n                    work[iwsv + nvl] = sum;\n                } else {\n                    work[iwsv + nvl] = -Math.abs(sum);\n                    if (sum > 0) {\n                        for (j = 1; j <= n; j = j + 1) {\n                            amat[j][nvl] = -amat[j][nvl];\n                        }\n                        bvec[nvl] = -bvec[nvl];\n                    }\n                }\n                // GOTO 700\n                return 700;\n            }\n        }\n\n        return 0;\n    }\n\n    function fn_goto_797() {\n        l = iwrm + (it1 * (it1 + 1)) / 2 + 1;\n        l1 = l + it1;\n        if (work[l1] === 0) {\n            // GOTO 798\n            return 798;\n        }\n        gc = Math.max(Math.abs(work[l1 - 1]), Math.abs(work[l1]));\n        gs = Math.min(Math.abs(work[l1 - 1]), Math.abs(work[l1]));\n        if (work[l1 - 1] >= 0) {\n            temp = Math.abs(gc * Math.sqrt(1 + gs * gs / (gc * gc)));\n        } else {\n            temp = -Math.abs(gc * Math.sqrt(1 + gs * gs / (gc * gc)));\n        }\n        gc = work[l1 - 1] / temp;\n        gs = work[l1] / temp;\n\n        if (gc === 1) {\n            // GOTO 798\n            return 798;\n        }\n        if (gc === 0) {\n            for (i = it1 + 1; i <= nact; i = i + 1) {\n                temp = work[l1 - 1];\n                work[l1 - 1] = work[l1];\n                work[l1] = temp;\n                l1 = l1 + i;\n            }\n            for (i = 1; i <= n; i = i + 1) {\n                temp = dmat[i][it1];\n                dmat[i][it1] = dmat[i][it1 + 1];\n                dmat[i][it1 + 1] = temp;\n            }\n        } else {\n            nu = gs / (1 + gc);\n            for (i = it1 + 1; i <= nact; i = i + 1) {\n                temp = gc * work[l1 - 1] + gs * work[l1];\n                work[l1] = nu * (work[l1 - 1] + temp) - work[l1];\n                work[l1 - 1] = temp;\n                l1 = l1 + i;\n            }\n            for (i = 1; i <= n; i = i + 1) {\n                temp = gc * dmat[i][it1] + gs * dmat[i][it1 + 1];\n                dmat[i][it1 + 1] = nu * (dmat[i][it1] + temp) - dmat[i][it1 + 1];\n                dmat[i][it1] = temp;\n            }\n        }\n\n        return 0;\n    }\n\n    function fn_goto_798() {\n        l1 = l - it1;\n        for (i = 1; i <= it1; i = i + 1) {\n            work[l1] = work[l];\n            l = l + 1;\n            l1 = l1 + 1;\n        }\n\n        work[iwuv + it1] = work[iwuv + it1 + 1];\n        iact[it1] = iact[it1 + 1];\n        it1 = it1 + 1;\n        if (it1 < nact) {\n            // GOTO 797\n            return 797;\n        }\n\n        return 0;\n    }\n\n    function fn_goto_799() {\n        work[iwuv + nact] = work[iwuv + nact + 1];\n        work[iwuv + nact + 1] = 0;\n        iact[nact] = 0;\n        nact = nact - 1;\n        iter[2] = iter[2] + 1;\n\n        return 0;\n    }\n\n    go = 0;\n    while (true) {\n        go = fn_goto_50();\n        if (go === 999) {\n            return;\n        }\n        while (true) {\n            go = fn_goto_55();\n            if (go === 0) {\n                break;\n            }\n            if (go === 999) {\n                return;\n            }\n            if (go === 700) {\n                if (it1 === nact) {\n                    fn_goto_799();\n                } else {\n                    while (true) {\n                        fn_goto_797();\n                        go = fn_goto_798();\n                        if (go !== 797) {\n                            break;\n                        }\n                    }\n                    fn_goto_799();\n                }\n            }\n        }\n    }\n\n}\n\nfunction solveQP(Dmat, dvec, Amat, bvec, meq, factorized) {\n    Dmat = base0to1(Dmat);\n    dvec = base0to1(dvec);\n    Amat = base0to1(Amat);\n    var i, n, q,\n        nact, r,\n        crval = [], iact = [], sol = [], work = [], iter = [],\n        message;\n\n    meq = meq || 0;\n    factorized = factorized ? base0to1(factorized) : [undefined, 0];\n    bvec = bvec ? base0to1(bvec) : [];\n\n    // In Fortran the array index starts from 1\n    n = Dmat.length - 1;\n    q = Amat[1].length - 1;\n\n    if (!bvec) {\n        for (i = 1; i <= q; i = i + 1) {\n            bvec[i] = 0;\n        }\n    }\n    for (i = 1; i <= q; i = i + 1) {\n        iact[i] = 0;\n    }\n    nact = 0;\n    r = Math.min(n, q);\n    for (i = 1; i <= n; i = i + 1) {\n        sol[i] = 0;\n    }\n    crval[1] = 0;\n    for (i = 1; i <= (2 * n + (r * (r + 5)) / 2 + 2 * q + 1); i = i + 1) {\n        work[i] = 0;\n    }\n    for (i = 1; i <= 2; i = i + 1) {\n        iter[i] = 0;\n    }\n\n    qpgen2(Dmat, dvec, n, n, sol, crval, Amat,\n        bvec, n, q, meq, iact, nact, iter, work, factorized);\n\n    message = \"\";\n    if (factorized[1] === 1) {\n        message = \"constraints are inconsistent, no solution!\";\n    }\n    if (factorized[1] === 2) {\n        message = \"matrix D in quadratic function is not positive definite!\";\n    }\n\n    return {\n        solution: base1to0(sol),\n        value: base1to0(crval),\n        unconstrained_solution: base1to0(dvec),\n        iterations: base1to0(iter),\n        iact: base1to0(iact),\n        message: message\n    };\n}\nexports.solveQP = solveQP;\n}(numeric));\n/*\nShanti Rao sent me this routine by private email. I had to modify it\nslightly to work on Arrays instead of using a Matrix object.\nIt is apparently translated from http://stitchpanorama.sourceforge.net/Python/svd.py\n*/\n\nnumeric.svd= function svd(A) {\n    var temp;\n//Compute the thin SVD from G. H. Golub and C. Reinsch, Numer. Math. 14, 403-420 (1970)\n\tvar prec= numeric.epsilon; //Math.pow(2,-52) // assumes double prec\n\tvar tolerance= 1.e-64/prec;\n\tvar itmax= 50;\n\tvar c=0;\n\tvar i=0;\n\tvar j=0;\n\tvar k=0;\n\tvar l=0;\n\t\n\tvar u= numeric.clone(A);\n\tvar m= u.length;\n\t\n\tvar n= u[0].length;\n\t\n\tif (m < n) throw \"Need more rows than columns\"\n\t\n\tvar e = new Array(n);\n\tvar q = new Array(n);\n\tfor (i=0; i<n; i++) e[i] = q[i] = 0.0;\n\tvar v = numeric.rep([n,n],0);\n//\tv.zero();\n\t\n \tfunction pythag(a,b)\n \t{\n\t\ta = Math.abs(a);\n\t\tb = Math.abs(b);\n\t\tif (a > b)\n\t\t\treturn a*Math.sqrt(1.0+(b*b/a/a))\n\t\telse if (b == 0.0) \n\t\t\treturn a\n\t\treturn b*Math.sqrt(1.0+(a*a/b/b))\n\t}\n\n\t//Householder's reduction to bidiagonal form\n\n\tvar f= 0.0;\n\tvar g= 0.0;\n\tvar h= 0.0;\n\tvar x= 0.0;\n\tvar y= 0.0;\n\tvar z= 0.0;\n\tvar s= 0.0;\n\t\n\tfor (i=0; i < n; i++)\n\t{\t\n\t\te[i]= g;\n\t\ts= 0.0;\n\t\tl= i+1;\n\t\tfor (j=i; j < m; j++) \n\t\t\ts += (u[j][i]*u[j][i]);\n\t\tif (s <= tolerance)\n\t\t\tg= 0.0;\n\t\telse\n\t\t{\t\n\t\t\tf= u[i][i];\n\t\t\tg= Math.sqrt(s);\n\t\t\tif (f >= 0.0) g= -g;\n\t\t\th= f*g-s;\n\t\t\tu[i][i]=f-g;\n\t\t\tfor (j=l; j < n; j++)\n\t\t\t{\n\t\t\t\ts= 0.0;\n\t\t\t\tfor (k=i; k < m; k++) \n\t\t\t\t\ts += u[k][i]*u[k][j];\n\t\t\t\tf= s/h;\n\t\t\t\tfor (k=i; k < m; k++) \n\t\t\t\t\tu[k][j]+=f*u[k][i];\n\t\t\t}\n\t\t}\n\t\tq[i]= g;\n\t\ts= 0.0;\n\t\tfor (j=l; j < n; j++) \n\t\t\ts= s + u[i][j]*u[i][j];\n\t\tif (s <= tolerance)\n\t\t\tg= 0.0;\n\t\telse\n\t\t{\t\n\t\t\tf= u[i][i+1];\n\t\t\tg= Math.sqrt(s);\n\t\t\tif (f >= 0.0) g= -g;\n\t\t\th= f*g - s;\n\t\t\tu[i][i+1] = f-g;\n\t\t\tfor (j=l; j < n; j++) e[j]= u[i][j]/h;\n\t\t\tfor (j=l; j < m; j++)\n\t\t\t{\t\n\t\t\t\ts=0.0;\n\t\t\t\tfor (k=l; k < n; k++) \n\t\t\t\t\ts += (u[j][k]*u[i][k]);\n\t\t\t\tfor (k=l; k < n; k++) \n\t\t\t\t\tu[j][k]+=s*e[k];\n\t\t\t}\t\n\t\t}\n\t\ty= Math.abs(q[i])+Math.abs(e[i]);\n\t\tif (y>x) \n\t\t\tx=y;\n\t}\n\t\n\t// accumulation of right hand gtransformations\n\tfor (i=n-1; i != -1; i+= -1)\n\t{\t\n\t\tif (g != 0.0)\n\t\t{\n\t\t \th= g*u[i][i+1];\n\t\t\tfor (j=l; j < n; j++) \n\t\t\t\tv[j][i]=u[i][j]/h;\n\t\t\tfor (j=l; j < n; j++)\n\t\t\t{\t\n\t\t\t\ts=0.0;\n\t\t\t\tfor (k=l; k < n; k++) \n\t\t\t\t\ts += u[i][k]*v[k][j];\n\t\t\t\tfor (k=l; k < n; k++) \n\t\t\t\t\tv[k][j]+=(s*v[k][i]);\n\t\t\t}\t\n\t\t}\n\t\tfor (j=l; j < n; j++)\n\t\t{\n\t\t\tv[i][j] = 0;\n\t\t\tv[j][i] = 0;\n\t\t}\n\t\tv[i][i] = 1;\n\t\tg= e[i];\n\t\tl= i;\n\t}\n\t\n\t// accumulation of left hand transformations\n\tfor (i=n-1; i != -1; i+= -1)\n\t{\t\n\t\tl= i+1;\n\t\tg= q[i];\n\t\tfor (j=l; j < n; j++) \n\t\t\tu[i][j] = 0;\n\t\tif (g != 0.0)\n\t\t{\n\t\t\th= u[i][i]*g;\n\t\t\tfor (j=l; j < n; j++)\n\t\t\t{\n\t\t\t\ts=0.0;\n\t\t\t\tfor (k=l; k < m; k++) s += u[k][i]*u[k][j];\n\t\t\t\tf= s/h;\n\t\t\t\tfor (k=i; k < m; k++) u[k][j]+=f*u[k][i];\n\t\t\t}\n\t\t\tfor (j=i; j < m; j++) u[j][i] = u[j][i]/g;\n\t\t}\n\t\telse\n\t\t\tfor (j=i; j < m; j++) u[j][i] = 0;\n\t\tu[i][i] += 1;\n\t}\n\t\n\t// diagonalization of the bidiagonal form\n\tprec= prec*x;\n\tfor (k=n-1; k != -1; k+= -1)\n\t{\n\t\tfor (var iteration=0; iteration < itmax; iteration++)\n\t\t{\t// test f splitting\n\t\t\tvar test_convergence = false;\n\t\t\tfor (l=k; l != -1; l+= -1)\n\t\t\t{\t\n\t\t\t\tif (Math.abs(e[l]) <= prec)\n\t\t\t\t{\ttest_convergence= true;\n\t\t\t\t\tbreak \n\t\t\t\t}\n\t\t\t\tif (Math.abs(q[l-1]) <= prec)\n\t\t\t\t\tbreak \n\t\t\t}\n\t\t\tif (!test_convergence)\n\t\t\t{\t// cancellation of e[l] if l>0\n\t\t\t\tc= 0.0;\n\t\t\t\ts= 1.0;\n\t\t\t\tvar l1= l-1;\n\t\t\t\tfor (i =l; i<k+1; i++)\n\t\t\t\t{\t\n\t\t\t\t\tf= s*e[i];\n\t\t\t\t\te[i]= c*e[i];\n\t\t\t\t\tif (Math.abs(f) <= prec)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tg= q[i];\n\t\t\t\t\th= pythag(f,g);\n\t\t\t\t\tq[i]= h;\n\t\t\t\t\tc= g/h;\n\t\t\t\t\ts= -f/h;\n\t\t\t\t\tfor (j=0; j < m; j++)\n\t\t\t\t\t{\t\n\t\t\t\t\t\ty= u[j][l1];\n\t\t\t\t\t\tz= u[j][i];\n\t\t\t\t\t\tu[j][l1] =  y*c+(z*s);\n\t\t\t\t\t\tu[j][i] = -y*s+(z*c);\n\t\t\t\t\t} \n\t\t\t\t}\t\n\t\t\t}\n\t\t\t// test f convergence\n\t\t\tz= q[k];\n\t\t\tif (l== k)\n\t\t\t{\t//convergence\n\t\t\t\tif (z<0.0)\n\t\t\t\t{\t//q[k] is made non-negative\n\t\t\t\t\tq[k]= -z;\n\t\t\t\t\tfor (j=0; j < n; j++)\n\t\t\t\t\t\tv[j][k] = -v[j][k];\n\t\t\t\t}\n\t\t\t\tbreak  //break out of iteration loop and move on to next k value\n\t\t\t}\n\t\t\tif (iteration >= itmax-1)\n\t\t\t\tthrow 'Error: no convergence.'\n\t\t\t// shift from bottom 2x2 minor\n\t\t\tx= q[l];\n\t\t\ty= q[k-1];\n\t\t\tg= e[k-1];\n\t\t\th= e[k];\n\t\t\tf= ((y-z)*(y+z)+(g-h)*(g+h))/(2.0*h*y);\n\t\t\tg= pythag(f,1.0);\n\t\t\tif (f < 0.0)\n\t\t\t\tf= ((x-z)*(x+z)+h*(y/(f-g)-h))/x;\n\t\t\telse\n\t\t\t\tf= ((x-z)*(x+z)+h*(y/(f+g)-h))/x;\n\t\t\t// next QR transformation\n\t\t\tc= 1.0;\n\t\t\ts= 1.0;\n\t\t\tfor (i=l+1; i< k+1; i++)\n\t\t\t{\t\n\t\t\t\tg= e[i];\n\t\t\t\ty= q[i];\n\t\t\t\th= s*g;\n\t\t\t\tg= c*g;\n\t\t\t\tz= pythag(f,h);\n\t\t\t\te[i-1]= z;\n\t\t\t\tc= f/z;\n\t\t\t\ts= h/z;\n\t\t\t\tf= x*c+g*s;\n\t\t\t\tg= -x*s+g*c;\n\t\t\t\th= y*s;\n\t\t\t\ty= y*c;\n\t\t\t\tfor (j=0; j < n; j++)\n\t\t\t\t{\t\n\t\t\t\t\tx= v[j][i-1];\n\t\t\t\t\tz= v[j][i];\n\t\t\t\t\tv[j][i-1] = x*c+z*s;\n\t\t\t\t\tv[j][i] = -x*s+z*c;\n\t\t\t\t}\n\t\t\t\tz= pythag(f,h);\n\t\t\t\tq[i-1]= z;\n\t\t\t\tc= f/z;\n\t\t\t\ts= h/z;\n\t\t\t\tf= c*g+s*y;\n\t\t\t\tx= -s*g+c*y;\n\t\t\t\tfor (j=0; j < m; j++)\n\t\t\t\t{\n\t\t\t\t\ty= u[j][i-1];\n\t\t\t\t\tz= u[j][i];\n\t\t\t\t\tu[j][i-1] = y*c+z*s;\n\t\t\t\t\tu[j][i] = -y*s+z*c;\n\t\t\t\t}\n\t\t\t}\n\t\t\te[l]= 0.0;\n\t\t\te[k]= f;\n\t\t\tq[k]= x;\n\t\t} \n\t}\n\t\t\n\t//vt= transpose(v)\n\t//return (u,q,vt)\n\tfor (i=0;i<q.length; i++) \n\t  if (q[i] < prec) q[i] = 0;\n\t  \n\t//sort eigenvalues\t\n\tfor (i=0; i< n; i++)\n\t{\t \n\t//writeln(q)\n\t for (j=i-1; j >= 0; j--)\n\t {\n\t  if (q[j] < q[i])\n\t  {\n\t//  writeln(i,'-',j)\n\t   c = q[j];\n\t   q[j] = q[i];\n\t   q[i] = c;\n\t   for(k=0;k<u.length;k++) { temp = u[k][i]; u[k][i] = u[k][j]; u[k][j] = temp; }\n\t   for(k=0;k<v.length;k++) { temp = v[k][i]; v[k][i] = v[k][j]; v[k][j] = temp; }\n//\t   u.swapCols(i,j)\n//\t   v.swapCols(i,j)\n\t   i = j;\t   \n\t  }\n\t }\t\n\t}\n\t\n\treturn {U:u,S:q,V:v}\n};\n});\n\nvar performanceNow = createCommonjsModule(function (module) {\n// Generated by CoffeeScript 1.12.2\n(function() {\n  var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime;\n\n  if ((typeof performance !== \"undefined\" && performance !== null) && performance.now) {\n    module.exports = function() {\n      return performance.now();\n    };\n  } else if ((typeof process !== \"undefined\" && process !== null) && process.hrtime) {\n    module.exports = function() {\n      return (getNanoSeconds() - nodeLoadTime) / 1e6;\n    };\n    hrtime = process.hrtime;\n    getNanoSeconds = function() {\n      var hr;\n      hr = hrtime();\n      return hr[0] * 1e9 + hr[1];\n    };\n    moduleLoadTime = getNanoSeconds();\n    upTime = process.uptime() * 1e9;\n    nodeLoadTime = moduleLoadTime - upTime;\n  } else if (Date.now) {\n    module.exports = function() {\n      return Date.now() - loadTime;\n    };\n    loadTime = Date.now();\n  } else {\n    module.exports = function() {\n      return new Date().getTime() - loadTime;\n    };\n    loadTime = new Date().getTime();\n  }\n\n}).call(commonjsGlobal);\n\n\n});\n\nvar root = typeof window === 'undefined' ? commonjsGlobal : window;\nvar vendors = ['moz', 'webkit'];\nvar suffix = 'AnimationFrame';\nvar raf = root['request' + suffix];\nvar caf = root['cancel' + suffix] || root['cancelRequest' + suffix];\n\nfor(var i = 0; !raf && i < vendors.length; i++) {\n  raf = root[vendors[i] + 'Request' + suffix];\n  caf = root[vendors[i] + 'Cancel' + suffix]\n      || root[vendors[i] + 'CancelRequest' + suffix];\n}\n\n// Some versions of FF have rAF but not cAF\nif(!raf || !caf) {\n  var last = 0\n    , id = 0\n    , queue = []\n    , frameDuration = 1000 / 60;\n\n  raf = function(callback) {\n    if(queue.length === 0) {\n      var _now = performanceNow()\n        , next = Math.max(0, frameDuration - (_now - last));\n      last = next + _now;\n      setTimeout(function() {\n        var cp = queue.slice(0);\n        // Clear queue here to prevent\n        // callbacks from appending listeners\n        // to the current frame's queue\n        queue.length = 0;\n        for(var i = 0; i < cp.length; i++) {\n          if(!cp[i].cancelled) {\n            try{\n              cp[i].callback(last);\n            } catch(e) {\n              setTimeout(function() { throw e }, 0);\n            }\n          }\n        }\n      }, Math.round(next));\n    }\n    queue.push({\n      handle: ++id,\n      callback: callback,\n      cancelled: false\n    });\n    return id\n  };\n\n  caf = function(handle) {\n    for(var i = 0; i < queue.length; i++) {\n      if(queue[i].handle === handle) {\n        queue[i].cancelled = true;\n      }\n    }\n  };\n}\n\nvar index = function(fn) {\n  // Wrap in a new function to prevent\n  // `cancel` potentially being assigned\n  // to the native rAF function\n  return raf.call(root, fn)\n};\nvar cancel = function() {\n  caf.apply(root, arguments);\n};\nvar polyfill = function() {\n  root.requestAnimationFrame = raf;\n  root.cancelAnimationFrame = caf;\n};\n\nindex.cancel = cancel;\nindex.polyfill = polyfill;\n\nvar promise = createCommonjsModule(function (module) {\n(function (root) {\n\n  // Store setTimeout reference so promise-polyfill will be unaffected by\n  // other code modifying setTimeout (like sinon.useFakeTimers())\n  var setTimeoutFunc = setTimeout;\n\n  function noop() {}\n  \n  // Polyfill for Function.prototype.bind\n  function bind(fn, thisArg) {\n    return function () {\n      fn.apply(thisArg, arguments);\n    };\n  }\n\n  function Promise(fn) {\n    if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new');\n    if (typeof fn !== 'function') throw new TypeError('not a function');\n    this._state = 0;\n    this._handled = false;\n    this._value = undefined;\n    this._deferreds = [];\n\n    doResolve(fn, this);\n  }\n\n  function handle(self, deferred) {\n    while (self._state === 3) {\n      self = self._value;\n    }\n    if (self._state === 0) {\n      self._deferreds.push(deferred);\n      return;\n    }\n    self._handled = true;\n    Promise._immediateFn(function () {\n      var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;\n      if (cb === null) {\n        (self._state === 1 ? resolve : reject)(deferred.promise, self._value);\n        return;\n      }\n      var ret;\n      try {\n        ret = cb(self._value);\n      } catch (e) {\n        reject(deferred.promise, e);\n        return;\n      }\n      resolve(deferred.promise, ret);\n    });\n  }\n\n  function resolve(self, newValue) {\n    try {\n      // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n      if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.');\n      if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {\n        var then = newValue.then;\n        if (newValue instanceof Promise) {\n          self._state = 3;\n          self._value = newValue;\n          finale(self);\n          return;\n        } else if (typeof then === 'function') {\n          doResolve(bind(then, newValue), self);\n          return;\n        }\n      }\n      self._state = 1;\n      self._value = newValue;\n      finale(self);\n    } catch (e) {\n      reject(self, e);\n    }\n  }\n\n  function reject(self, newValue) {\n    self._state = 2;\n    self._value = newValue;\n    finale(self);\n  }\n\n  function finale(self) {\n    if (self._state === 2 && self._deferreds.length === 0) {\n      Promise._immediateFn(function() {\n        if (!self._handled) {\n          Promise._unhandledRejectionFn(self._value);\n        }\n      });\n    }\n\n    for (var i = 0, len = self._deferreds.length; i < len; i++) {\n      handle(self, self._deferreds[i]);\n    }\n    self._deferreds = null;\n  }\n\n  function Handler(onFulfilled, onRejected, promise) {\n    this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n    this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n    this.promise = promise;\n  }\n\n  /**\n   * Take a potentially misbehaving resolver function and make sure\n   * onFulfilled and onRejected are only called once.\n   *\n   * Makes no guarantees about asynchrony.\n   */\n  function doResolve(fn, self) {\n    var done = false;\n    try {\n      fn(function (value) {\n        if (done) return;\n        done = true;\n        resolve(self, value);\n      }, function (reason) {\n        if (done) return;\n        done = true;\n        reject(self, reason);\n      });\n    } catch (ex) {\n      if (done) return;\n      done = true;\n      reject(self, ex);\n    }\n  }\n\n  Promise.prototype['catch'] = function (onRejected) {\n    return this.then(null, onRejected);\n  };\n\n  Promise.prototype.then = function (onFulfilled, onRejected) {\n    var prom = new (this.constructor)(noop);\n\n    handle(this, new Handler(onFulfilled, onRejected, prom));\n    return prom;\n  };\n\n  Promise.all = function (arr) {\n    var args = Array.prototype.slice.call(arr);\n\n    return new Promise(function (resolve, reject) {\n      if (args.length === 0) return resolve([]);\n      var remaining = args.length;\n\n      function res(i, val) {\n        try {\n          if (val && (typeof val === 'object' || typeof val === 'function')) {\n            var then = val.then;\n            if (typeof then === 'function') {\n              then.call(val, function (val) {\n                res(i, val);\n              }, reject);\n              return;\n            }\n          }\n          args[i] = val;\n          if (--remaining === 0) {\n            resolve(args);\n          }\n        } catch (ex) {\n          reject(ex);\n        }\n      }\n\n      for (var i = 0; i < args.length; i++) {\n        res(i, args[i]);\n      }\n    });\n  };\n\n  Promise.resolve = function (value) {\n    if (value && typeof value === 'object' && value.constructor === Promise) {\n      return value;\n    }\n\n    return new Promise(function (resolve) {\n      resolve(value);\n    });\n  };\n\n  Promise.reject = function (value) {\n    return new Promise(function (resolve, reject) {\n      reject(value);\n    });\n  };\n\n  Promise.race = function (values) {\n    return new Promise(function (resolve, reject) {\n      for (var i = 0, len = values.length; i < len; i++) {\n        values[i].then(resolve, reject);\n      }\n    });\n  };\n\n  // Use polyfill for setImmediate for performance gains\n  Promise._immediateFn = (typeof setImmediate === 'function' && function (fn) { setImmediate(fn); }) ||\n    function (fn) {\n      setTimeoutFunc(fn, 0);\n    };\n\n  Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {\n    if (typeof console !== 'undefined' && console) {\n      console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console\n    }\n  };\n\n  /**\n   * Set the immediate function to execute callbacks\n   * @param fn {function} Function to execute\n   * @deprecated\n   */\n  Promise._setImmediateFn = function _setImmediateFn(fn) {\n    Promise._immediateFn = fn;\n  };\n\n  /**\n   * Change the function to execute on unhandled rejection\n   * @param {function} fn Function to execute on unhandled rejection\n   * @deprecated\n   */\n  Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) {\n    Promise._unhandledRejectionFn = fn;\n  };\n  \n  if ('object' !== 'undefined' && module.exports) {\n    module.exports = Promise;\n  } else if (!root.Promise) {\n    root.Promise = Promise;\n  }\n\n})(commonjsGlobal);\n});\n\n// IE polyfill from MDN\n(function () {\n\tif (typeof window.CustomEvent === 'function') return false;\n\n\tfunction CustomEvent (event, params) {\n\t\tparams = params || {bubbles : false, cancelable : false, detail: undefined};\n\t\tvar evt = document.createEvent('CustomEvent');\n\t\tevt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n\t\treturn evt;\n\t}\n\n\tCustomEvent.prototype = window.Event.prototype;\n\n\twindow.CustomEvent = CustomEvent;\n})();\n\nfunction emitEvent(eventName) {\n\tvar evt = new CustomEvent(eventName, {'bubbles': true, 'cancelable': true});\n\tdocument.dispatchEvent(evt);\n}\n\n/**\n * Fast Fourier Transform\n * 1D-FFT/IFFT, 2D-FFT/IFFT (radix-2)\n * \n * @author ryo / github.com/wellflat\n * Based on https://github.com/wellflat/jslib with some tiny optimizations\n */\n\nfunction FFT() {\n  \n  var _n = 0,          // order\n      _bitrev = null,  // bit reversal table\n      _cstb = null;    // sin/cos table\n  var _tre, _tim;\n  \n  this.init = function (n) {\n    if(n !== 0 && (n & (n - 1)) === 0) {\n      _n = n;\n      _setVariables();\n      _makeBitReversal();\n      _makeCosSinTable();\n    } else {\n      throw new Error(\"init: radix-2 required\");\n    }\n  };\n    \n  // 1D-FFT\n  this.fft1d = function (re, im) {\n    fft(re, im, 1);\n  };\n    \n  // 1D-IFFT\n  this.ifft1d = function (re, im) {\n    var n = 1/_n;\n    fft(re, im, -1);\n    for(var i=0; i<_n; i++) {\n      re[i] *= n;\n      im[i] *= n;\n    }\n  };\n  \n  // 2D-FFT\n  this.fft2d = function (re, im) {\n    var i = 0;\n    // x-axis\n    for(var y=0; y<_n; y++) {\n      i = y*_n;\n      for(var x1=0; x1<_n; x1++) {\n        _tre[x1] = re[x1 + i];\n        _tim[x1] = im[x1 + i];\n      }\n      this.fft1d(_tre, _tim);\n      for(var x2=0; x2<_n; x2++) {\n        re[x2 + i] = _tre[x2];\n        im[x2 + i] = _tim[x2];\n      }\n    }\n    // y-axis\n    for(var x=0; x<_n; x++) {\n      for(var y1=0; y1<_n; y1++) {\n        i = x + y1*_n;\n        _tre[y1] = re[i];\n        _tim[y1] = im[i];\n      }\n      this.fft1d(_tre, _tim);\n      for(var y2=0; y2<_n; y2++) {\n        i = x + y2*_n;\n        re[i] = _tre[y2];\n        im[i] = _tim[y2];\n      }\n    }\n  };\n  \n  // 2D-IFFT\n  this.ifft2d = function (re, im) {\n    var i = 0;\n    // x-axis\n    for(var y=0; y<_n; y++) {\n      i = y*_n;\n      for(var x1=0; x1<_n; x1++) {\n        _tre[x1] = re[x1 + i];\n        _tim[x1] = im[x1 + i];\n      }\n      this.ifft1d(_tre, _tim);\n      for(var x2=0; x2<_n; x2++) {\n        re[x2 + i] = _tre[x2];\n        im[x2 + i] = _tim[x2];\n      }\n    }\n    // y-axis\n    for(var x=0; x<_n; x++) {\n      for(var y1=0; y1<_n; y1++) {\n        i = x + y1*_n;\n        _tre[y1] = re[i];\n        _tim[y1] = im[i];\n      }\n      this.ifft1d(_tre, _tim);\n      for(var y2=0; y2<_n; y2++) {\n        i = x + y2*_n;\n        re[i] = _tre[y2];\n        im[i] = _tim[y2];\n      }\n    }\n  };\n  \n  // core operation of FFT\n  function fft(re, im, inv) {\n    var d, h, ik, m, tmp, wr, wi, xr, xi,\n        n4 = _n >> 2;\n    // bit reversal\n    for(var l=0; l<_n; l++) {\n      m = _bitrev[l];\n      if(l < m) {\n        tmp = re[l];\n        re[l] = re[m];\n        re[m] = tmp;\n        tmp = im[l];\n        im[l] = im[m];\n        im[m] = tmp;\n      }\n    }\n    // butterfly operation\n    for(var k=1; k<_n; k<<=1) {\n      h = 0;\n      d = _n/(k << 1);\n      for(var j=0; j<k; j++) {\n        wr = _cstb[h + n4];\n        wi = inv*_cstb[h];\n        for(var i=j; i<_n; i+=(k<<1)) {\n          ik = i + k;\n          xr = wr*re[ik] + wi*im[ik];\n          xi = wr*im[ik] - wi*re[ik];\n          re[ik] = re[i] - xr;\n          re[i] += xr;\n          im[ik] = im[i] - xi;\n          im[i] += xi;\n        }\n        h += d;\n      }\n    }\n  }\n  \n  // set variables\n  function _setVariables() {\n    if(typeof Uint8Array !== 'undefined') {\n      _bitrev = new Uint8Array(_n);\n    } else {\n      _bitrev = new Array(_n);\n    }\n    if(typeof Float64Array !== 'undefined') {\n      _cstb = new Float64Array(_n*1.25);\n      _tre = new Float64Array(_n*_n);\n      _tim = new Float64Array(_n*_n);\n    } else {\n      _cstb = new Array(_n*1.25);\n      _tre = new Array(_n*_n);\n      _tim = new Array(_n*_n);\n    }\n  }\n  \n  // make bit reversal table\n  function _makeBitReversal() {\n    var i = 0,\n        j = 0,\n        k = 0;\n    _bitrev[0] = 0;\n    while(++i < _n) {\n      k = _n >> 1;\n      while(k <= j) {\n        j -= k;\n        k >>= 1;\n      }\n      j += k;\n      _bitrev[i] = j;\n    }\n  }\n  \n  // make trigonometric function table\n  function _makeCosSinTable() {\n    var n2 = _n >> 1,\n        n4 = _n >> 2,\n        n8 = _n >> 3,\n        n2p4 = n2 + n4,\n        t = Math.sin(Math.PI/_n),\n        dc = 2*t*t,\n        ds = Math.sqrt(dc*(2 - dc)),\n        c = _cstb[n4] = 1,\n        s = _cstb[0] = 0;\n    t = 2*dc;\n    for(var i=1; i<n8; i++) {\n      c -= dc;\n      dc += t*c;\n      s += ds;\n      ds -= t*s;\n      _cstb[i] = s;\n      _cstb[n4 - i] = c;\n    }\n    if(n8 !== 0) {\n      _cstb[n8] = Math.sqrt(0.5);\n    }\n    for(var j=0; j<n4; j++) {\n      _cstb[n2 - j]  = _cstb[j];\n    }\n    for(var k=0; k<n2p4; k++) {\n      _cstb[k + n2] = -_cstb[k];\n    }\n  }\n}\n\nvar left_eye_filter = {\"real\": [1.5419219943717721, 0.40010880110578706, -0.79043641265342957, -1.2685464969238938, 0.39878117336167285, -1.0673489992245377, -0.079880838229404019, -0.45374680224191505, -0.043474097938900787, -0.31125662385352687, 0.17092430376098702, -0.29613086164846153, 0.5616469648110296, -1.559786848789493, 0.64513037997492662, -1.2899747976234162, 1.1761667998175334, -1.2899747976233551, 0.64513037997490474, -1.5597868487894897, 0.56164696481102505, -0.29613086164845964, 0.17092430376099094, -0.31125662385352959, -0.043474097938900787, -0.45374680224191177, -0.079880838229404658, -1.0673489992245357, 0.39878117336167307, -1.2685464969238942, -0.79043641265343012, 0.40010880110578717, -1.3820969331049027, 0.069560471269205768, -1.9786339579213206, -1.9807415717551982, -0.78667274410450883, -1.2217002325587256, -0.19150029104902774, -0.35131617290773243, -0.17646388464205803, -0.16672095020503441, -0.092298612924566523, -0.028899376452253527, -0.1314555696102146, -0.32892265898101813, -0.40987148655061206, 0.11741827111366547, -0.67254330182605138, -0.46007833291519956, -0.67215259521101001, -0.44871907432473013, -0.034749316729184583, 0.0055639281302433969, -0.17675902360981591, -0.26196208085032191, -0.36301254306387037, -0.33546767337818123, -0.6458889740799838, -1.1981932989987978, 0.12372650763830917, -1.4996172161865935, -2.4084298023013888, -2.0505291279591722, -1.7249706159518585, -2.277646289702639, -3.1259631743419591, -2.9656385065342015, -2.8480835086962011, -1.4260964500310189, -0.61792590829173544, -0.2611655301498782, -0.38519889843539723, -0.17511899827006483, -0.32808050503227176, 0.0076800871037463036, -0.18710828510427668, 0.1976534820339281, -0.55444453100465052, 0.14583567590328381, -0.69844971117515287, -0.90188577233526623, -0.53500016384583371, -0.044420751861669799, 0.014727914354086128, -0.28084584584371913, -0.29890408748685848, -0.39431380149336548, -0.39569215798819307, -0.74351999988258299, -0.82502198370631752, -1.851491897104155, -0.74302378668934244, 0.21156442062863762, -3.3061472495599986, -1.7990472945779568, -2.2193764251732282, -2.3438802466919251, -3.3615971067123311, -3.5383249085863708, -2.2639673745086588, -2.0271757806780748, -0.75242583405872232, -0.30143411016839378, -0.3625272253546275, -0.25489431004647689, -0.18928491561467081, -0.1179891518538482, 0.027920290231533224, -0.035472107498143821, -0.29008721857562259, -0.3604588674139817, -0.39156143807433802, -0.82222257402876564, -0.44979914971695928, -0.098136330355476253, 0.065628582466229365, -0.33607304327303128, -0.32161201323497779, -0.41856090178723965, -0.64028425429629054, -0.7766428172010218, -1.3946448661671447, -2.2603422126144683, -0.38769722219534525, -0.95341593939478653, -1.412952994959813, -2.3602336858020432, -1.2756392437278019, -2.0983496132652038, -2.5682454610054268, -2.8791053946930378, -2.1809972632688095, -0.84281293847776861, -0.75998936793718697, -0.18584599820380068, -0.30105748355308259, -0.16098142942852958, -0.13792125740417191, -0.089790022871128708, -0.12321821342876504, -0.1128661923016878, -0.3924098378001975, -0.5780902167586397, -0.48685989567066695, -0.53565359443296234, -0.051036689850526382, -0.0068547033925117689, -0.18963405157839419, -0.22514761090777807, -0.35555823460888908, -0.46670603976585517, -0.56179541485257889, -0.7495095888115163, -1.4772075422260349, -1.5836466114968029, -2.3846549454186694, -1.4884613952536236, -1.8237453905245253, -1.6712324532934877, -1.5169157844507295, -1.6930052820597281, -2.1023566589276004, -2.2062031109308458, -1.7945281756942255, -0.26457398838912649, 0.22038139379151148, -0.43479836723775234, -0.19830827357221226, -0.18018565146479498, -0.097060879184795737, -0.10088329756370379, -0.063069709957272527, -0.17970932516041177, -0.1943040732581543, -0.37970560392277619, -0.47302301606251812, -0.30366967948052181, -0.064732391018915397, -0.08902516330269715, -0.082000200083027344, -0.22965854401457736, -0.32035624605031326, -0.31836783196552437, -0.40132058236311119, -0.65601747033470859, -0.59040483751417483, -1.8503084663080034, -1.8694842425148914, -1.9326778896298584, -1.6301578422923519, -1.4332006785118301, -1.305707665299106, -1.364200787821644, -1.5357935460809622, -1.6161992336951241, -0.74003518668370516, -0.29423824173210689, 0.025934598230976654, -0.043349004411304674, -0.25408021803022468, -0.066965686484977499, -0.075717498698635255, 0.007057189465364498, -0.042171356658338113, -0.036938315661768008, -0.34221561581756049, -0.20400167508805764, -0.37417116097079772, -0.25039909487805356, -0.070874531394524931, -0.0569972852039487, -0.067238206950403182, -0.17397285212300442, -0.20428337307808273, -0.23651154356493315, -0.33356498933276568, -0.07339749754226077, -0.70367959806681601, -0.82403680021595049, -1.6058616381755235, -1.6192427030685497, -1.5705638815427956, -1.4659201063980019, -0.95504179549951018, -0.97237526162739873, -1.0460191987834688, -0.91465668941265721, -0.60548232361398524, 0.01898438364933451, -0.19419044456729498, -0.039627851124307223, 0.0012357796666701798, -0.078110822445325079, 0.0048626364920250518, -0.040449089662379589, -0.0035054269587873454, -0.13387544724730729, -0.10031131456276647, -0.25968674675684189, -0.20555329767005767, -0.26509289948725284, -0.038788452621647145, -0.076999891872251258, -0.071661433038976499, -0.14182240789719938, -0.1654673053291095, -0.19859450279267193, -0.053382326365810369, -0.2156585383674445, -0.045097357284793499, -0.62449818579949512, -0.92624906744917224, -1.0411254782363617, -1.122035196738675, -1.0607692164246043, -0.57723811773534028, -0.63187735896388075, -0.54813311204421922, -0.55320252101738743, -0.30197299587482401, -0.047213249757838388, 0.082808930467383288, -0.067715134483222431, -0.01022881748368659, 0.042038311258956552, -0.063371767399980669, 0.029161890169972702, -0.091396316586836127, -0.0034600735070754811, -0.12424052925006424, -0.24432996418012101, -0.26521664175359499, -0.22745980283820413, -0.14361316535317664, -0.00075904203100577935, -0.020936168457862139, -0.14205665196423617, -0.19024248288823023, -0.079686122362245204, -0.15016133237735926, 0.049598910651295514, -0.11760486834511712, -0.1837522251545049, -0.38594205494114608, -0.53542516436999843, -0.57340991730807989, -0.52753621424018138, -0.23151163972118355, -0.22295096919949259, -0.33704349161770436, -0.26165852514054583, -0.13898866968588663, 0.034596483191139484, -0.012631210076789067, 0.047371310076345617, -0.038651839330751551, -0.0019970761454430018, 0.063048845258375494, -0.1124891762554399, 0.08556992539656616, -0.21043659051868199, -0.19223333969456, -0.39082994830035861, -0.19294368007162721, -0.41025595439938572, -0.17178084419175166, -0.010933041190555012, -0.089512936152074493, -0.21569610281495066, -0.09144756671688016, -0.19525258909505316, -0.029753598134641936, -0.021307245660079924, 0.029087127940551009, 0.037511290653097842, -0.20600990120705839, -0.26967580750352926, -0.21000923681194664, -0.28209018858285628, -0.11925518789339556, -0.24869348141289982, -0.21025892926356746, -0.15567029136726124, -0.040546729108395907, -0.0050266153100547101, 0.030710887069787196, -0.0061104340245858278, 0.0369376092260571, -0.054862661367900321, 0.013297880203253048, 0.19659447375886394, -0.2499491329142558, -0.062959699002865757, -0.53055029095956008, -0.38784811281629444, -0.53891285075962392, -0.41886712861154285, -0.099230097260325875, -0.16474199810952628, -0.28693665642627014, -0.0095667980850221105, -0.32619954993450928, -0.08627491478166284, -0.073253161755714766, 0.015634174038690329, 0.082440536547531792, 0.025411878261881942, -0.11318909242737961, -0.1270560226842935, -0.21657212936164139, -0.13993873549611191, -0.37510275237622831, -0.26472923111076219, -0.24460131567533192, -0.14127652303494026, -0.050428686591045178, 0.041347840374190772, -0.0061780445153000636, 0.0073990345210250153, -0.014062739037014381, 0.14348925152561878, -0.015321787554403667, 0.0017746672356015968, 0.25165135427361052, -0.626463828190993, -0.48167134330805639, -1.045863293770664, -0.69512591788493194, -0.44532127384388254, -0.28479724025368391, -0.39470955087317983, 0.20227228344720469, -0.53909912073488953, -0.12025629051789474, -0.1899243750597305, -0.048474806721595133, 0.060764771353227762, 0.090648151782516159, 0.091608208912697275, 0.0036582478916540977, -0.22492530005263131, -0.27295314658024766, -0.35559738025257359, -0.62902925014412947, -0.57166411974881004, -0.37258895173129181, -0.22157638610464933, 0.022494427132080854, 0.014769425415166171, 0.003526808789406817, -0.011346909674078769, 0.050921170848348289, 0.090308541799219627, 0.37260817254533324, -0.25909871392159911, -0.42379280974334355, -0.095380647808568128, -1.1906083748893519, -0.78599914414892469, -0.95277914352730275, -0.63659778359422337, -0.98026015008952749, 0.48173198285916102, -0.60092009018055192, -0.10265418316164113, -0.39913639006279306, -0.17310908908773887, -0.0194191171632387, 0.054047965289179878, 0.1388529643463832, 0.15661099050145999, -0.10898263774416243, -0.33291231456737602, -0.59569027865888713, -0.69353081584948972, -1.0999707493347484, -0.74392084753736687, -0.49074781214158159, -0.065190556733852961, 0.012289768389229717, 0.024577513704595676, 0.0040302804696096322, 0.036047756292976456, 0.058236765637246286, 0.13893846256790621, 0.036944676036934632, 0.41686279554239464, -0.85232286388185818, -1.2988315127624981, -0.47352779677305168, -0.81763632541546793, -0.77384457803621831, -1.4256240004519281, 0.52588993532360684, -0.89821724022902683, 0.1591911967653899, -0.55046596772346867, -0.30980016041271019, -0.16709614007114884, -0.046029700131955266, 0.044793268150423983, 0.1689242242845459, 0.14412365934528507, -0.0088250071313367359, -0.36778545124666312, -0.79393844517732104, -1.1610479066529615, -0.76523210008850662, -0.63009858032048405, -0.13947023057344932, -0.017173105577524262, 0.039030007688455846, 0.014491273083805401, 0.039792542943837252, 0.054072846696920814, 0.11729310469925348, 0.053609281522667675, 0.0081549498718087084, -0.30910813452845548, 0.25944224899607843, -1.3584842180322938, -1.5885570490138659, -0.65759582794618221, -1.139869490652734, 0.70928264080594694, -1.9674198903133462, 0.37712664425406606, -0.84336038390578949, -0.47788074719428036, -0.18342000086663721, -0.18811394573901796, -0.055050027645985648, 0.045043056834335606, 0.11486303559854361, 0.22023958716404868, 0.14735402009444676, -0.27894427087197998, -0.73080536953129638, -0.76794305693297227, -0.37355919765840223, 0.12353986794322802, 0.090505348376311842, 0.14069908672094206, 0.087373214380278855, 0.023353946735568523, 0.031400559920396587, 0.079550230446202241, 0.084927161382185437, 0.040777158255349423, -0.16274954314482293, -0.41184413435479567, -0.71871288822574875, 0.55302907456342854, -1.5309493464500674, -2.9026104205694736, 0.42043303599508353, -1.7138106264793671, 0.29513888249127102, -1.2517216433630918, -0.66769942176516839, -0.28576739334390183, -0.24127777006787937, -0.10778095858902549, -0.036092425009198861, 0.021519213385077923, 0.13414694961717147, 0.16917378957839613, 0.17307922682581758, 0.076246758829015673, -0.047904835134272621, -0.27544262702406924, 0.61826249566563185, 0.26987423123693399, 0.2085883517320696, 0.26073426210721973, 0.12070625812911842, 0.062945582093309679, 0.083649573916505432, 0.049688095345785867, 0.019564357607843069, -0.046035817476596949, -0.13409074070830324, -0.49027201814294552, -0.47756457321420159, -0.74403675135427549, -0.3080068432033089, -0.043712438842705037, -4.735594317158907, -0.043712438842706695, -0.30800684320330962, -0.74403675135427572, -0.47756457321420304, -0.49027201814294813, -0.13409074070830412, -0.046035817476598156, 0.019564357607843069, 0.049688095345786006, 0.083649573916506056, 0.062945582093310845, 0.12070625812911921, 0.26073426210722073, 0.20858835173207019, 0.26987423123693399, -0.37355919765836759, -0.27544262702403433, -0.047904835134273127, 0.076246758829012523, 0.17307922682581853, 0.16917378957839499, 0.13414694961716844, 0.02151921338507657, -0.036092425009199861, -0.1077809585890261, -0.24127777006787943, -0.2857673933439015, -0.66769942176516905, -1.2517216433630949, 0.29513888249127429, -1.7138106264793713, 0.42043303599507681, -2.902610420569474, -1.5309493464500692, 0.55302907456342232, -0.71871288822575019, -0.41184413435479833, -0.16274954314482265, 0.04077715825534866, 0.08492716138218645, 0.079550230446203143, 0.031400559920398419, 0.023353946735571576, 0.08737321438028138, 0.14069908672095732, 0.090505348376334033, 0.1235398679432393, -0.76523210008847808, -0.76794305693296139, -0.73080536953128505, -0.27894427087197604, 0.1473540200944477, 0.22023958716404682, 0.11486303559854165, 0.045043056834333829, -0.055050027645986453, -0.18811394573901843, -0.18342000086663854, -0.47788074719428042, -0.84336038390579149, 0.37712664425406617, -1.9674198903133469, 0.70928264080593695, -1.1398694906527307, -0.65759582794619398, -1.588557049013867, -1.3584842180322987, 0.25944224899607732, -0.30910813452845781, 0.0081549498718086911, 0.053609281522667279, 0.11729310469925426, 0.054072846696921202, 0.039792542943838709, 0.014491273083807311, 0.039030007688458185, -0.017173105577517028, -0.13947023057343994, -0.63009858032045107, -1.0999707493347308, -1.1610479066529467, -0.79393844517731305, -0.3677854512466584, -0.0088250071313340107, 0.14412365934528559, 0.16892422428454401, 0.044793268150420118, -0.046029700131956147, -0.16709614007115095, -0.30980016041271097, -0.55046596772347045, 0.15919119676539073, -0.8982172402290286, 0.52588993532360329, -1.4256240004519327, -0.77384457803621687, -0.8176363254154656, -0.47352779677305679, -1.2988315127625027, -0.85232286388185829, 0.41686279554239525, 0.036944676036935756, 0.13893846256790574, 0.058236765637246675, 0.036047756292977066, 0.0040302804696111128, 0.02457751370459911, 0.012289768389232913, -0.065190556733844662, -0.49074781214156804, -0.74392084753735632, -0.62902925014412903, -0.69353081584948562, -0.59569027865888302, -0.33291231456737491, -0.10898263774416028, 0.15661099050145985, 0.13885296434638142, 0.054047965289177706, -0.019419117163239467, -0.17310908908773912, -0.39913639006279433, -0.10265418316163986, -0.60092009018055315, 0.48173198285915786, -0.98026015008952594, -0.63659778359422126, -0.9527791435273002, -0.78599914414892458, -1.190608374889349, -0.095380647808570002, -0.42379280974334488, -0.25909871392159683, 0.37260817254533357, 0.09030854179921953, 0.050921170848348372, -0.011346909674079158, 0.0035268087894081549, 0.014769425415168456, 0.022494427132082863, -0.22157638610464575, -0.37258895173129003, -0.5716641197488066, -0.37510275237622537, -0.35559738025257059, -0.27295314658024672, -0.22492530005262792, 0.0036582478916564426, 0.091608208912696387, 0.090648151782514966, 0.060764771353224882, -0.048474806721595647, -0.18992437505973167, -0.12025629051789351, -0.53909912073488875, 0.20227228344720258, -0.39470955087317799, -0.28479724025368247, -0.44532127384387832, -0.69512591788493272, -1.04586329377066, -0.48167134330805861, -0.62646382819099156, 0.25165135427361029, 0.0017746672356018336, -0.0153217875544032, 0.14348925152561842, -0.01406273903701487, 0.0073990345210243587, -0.0061780445152985596, 0.04134784037419488, -0.050428686591041855, -0.1412765230349349, -0.2446013156753272, -0.26472923111076024, -0.11925518789339257, -0.13993873549610955, -0.21657212936163839, -0.1270560226842922, -0.11318909242737903, 0.025411878261882927, 0.082440536547530169, 0.015634174038688685, -0.073253161755715501, -0.086274914781661965, -0.326199549934509, -0.0095667980850238903, -0.28693665642627003, -0.16474199810952764, -0.099230097260324029, -0.41886712861154318, -0.53891285075962314, -0.38784811281629461, -0.53055029095956219, -0.062959699002866631, -0.24994913291425488, 0.1965944737588636, 0.013297880203252755, -0.054862661367901897, 0.036937609226056677, -0.0061104340245862225, 0.030710887069788338, -0.005026615310052167, -0.040546729108393256, -0.15567029136725916, -0.21025892926356554, -0.24869348141289621, -0.23151163972117689, -0.28209018858284918, -0.21000923681193823, -0.26967580750352416, -0.20600990120705304, 0.037511290653099091, 0.029087127940549885, -0.02130724566008323, -0.029753598134642099, -0.19525258909505444, -0.091447566716882075, -0.21569610281495041, -0.089512936152075853, -0.010933041190555782, -0.17178084419175305, -0.41025595439938806, -0.19294368007162768, -0.39082994830036216, -0.19223333969456258, -0.21043659051868269, 0.085569925396567076, -0.11248917625543933, 0.063048845258374231, -0.0019970761454456269, -0.038651839330752197, 0.047371310076345617, -0.012631210076786959, 0.034596483191142599, -0.13898866968588444, -0.26165852514053983, -0.33704349161769737, -0.22295096919948695, -0.57723811773534028, -0.52753621424018138, -0.57340991730807944, -0.53542516436999865, -0.38594205494114614, -0.1837522251545064, -0.11760486834511884, 0.049598910651293758, -0.15016133237735926, -0.07968612236224891, -0.1902424828882312, -0.14205665196423831, -0.020936168457862579, -0.00075904203100844866, -0.14361316535317845, -0.2274598028382093, -0.26521664175359499, -0.24432996418012529, -0.12424052925006639, -0.0034600735070760831, -0.09139631658683596, 0.029161890169972428, -0.063371767399980516, 0.042038311258955005, -0.01022881748368659, -0.067715134483221959, 0.082808930467383746, -0.047213249757837236, -0.3019729958748239, -0.55320252101738743, -0.548133112044219, -0.63187735896388053, -0.95504179549950285, -1.060769216424599, -1.1220351967386673, -1.0411254782363524, -0.92624906744916458, -0.62449818579949246, -0.045097357284792555, -0.21565853836744897, -0.053382326365811708, -0.19859450279267432, -0.16546730532911214, -0.14182240789720132, -0.07166143303897729, -0.076999891872253062, -0.038788452621649434, -0.2650928994872585, -0.20555329767005678, -0.25968674675684078, -0.10031131456276626, -0.13387544724730568, -0.0035054269587865765, -0.040449089662379971, 0.0048626364920241281, -0.078110822445325467, 0.0012357796666695618, -0.039627851124306598, -0.19419044456729473, 0.018984383649339364, -0.60548232361397991, -0.91465668941264988, -1.0460191987834631, -0.97237526162739263, -1.3057076652991049, -1.4659201063979992, -1.5705638815427927, -1.6192427030685486, -1.6058616381755215, -0.82403680021595249, -0.70367959806681868, -0.073397497542269388, -0.33356498933276529, -0.23651154356493967, -0.2042833730780847, -0.17397285212300875, -0.067238206950403417, -0.056997285203952995, -0.070874531394526111, -0.25039909487805306, -0.37417116097079761, -0.20400167508805389, -0.34221561581755761, -0.036938315661763657, -0.042171356658337315, 0.0070571894653653896, -0.075717498698634964, -0.066965686484977194, -0.25408021803022474, -0.043349004411301621, 0.025934598230977574, -0.29423824173210122, -0.74003518668370272, -1.6161992336951192, -1.5357935460809593, -1.3642007878216427, -1.5169157844507262, -1.4332006785118279, -1.6301578422923491, -1.932677889629856, -1.8694842425148879, -1.8503084663080056, -0.59040483751417916, -0.65601747033471336, -0.40132058236311047, -0.31836783196552787, -0.32035624605031593, -0.22965854401457814, -0.082000200083028219, -0.089025163302698024, -0.064732391018913552, -0.30366967948051288, -0.4730230160625184, -0.37970560392275871, -0.19430407325814622, -0.1797093251603995, -0.063069709957271444, -0.10088329756370083, -0.097060879184794432, -0.18018565146479387, -0.19830827357221226, -0.43479836723774673, 0.22038139379151372, -0.26457398838911428, -1.79452817569422, -2.2062031109308391, -2.102356658927595, -1.6930052820597257, -1.2756392437278008, -1.6712324532934884, -1.8237453905245253, -1.4884613952536252, -2.384654945418673, -1.5836466114968115, -1.4772075422260404, -0.74950958881152596, -0.561795414852579, -0.46670603976586306, -0.35555823460889052, -0.22514761090777982, -0.18963405157839525, -0.0068547033925124142, -0.051036689850529192, -0.53565359443295624, -0.48685989567066656, -0.57809021675862349, -0.39240983780018618, -0.11286619230167973, -0.12321821342876334, -0.089790022871127112, -0.13792125740417074, -0.16098142942852883, -0.30105748355308298, -0.18584599820379807, -0.75998936793718352, -0.8428129384777584, -2.1809972632688073, -2.8791053946930352, -2.5682454610054237, -2.0983496132652038, -2.219376425173226, -2.3602336858020396, -1.4129529949598048, -0.95341593939478875, -0.38769722219534936, -2.2603422126144772, -1.394644866167148, -0.77664281720103345, -0.64028425429629032, -0.41856090178724664, -0.3216120132349809, -0.33607304327303461, 0.065628582466230781, -0.098136330355478765, -0.44979914971695495, -0.82222257402878096, -0.39156143807433802, -0.36045886741397631, -0.29008721857562392, -0.035472107498135542, 0.027920290231535812, -0.117989151853845, -0.1892849156146684, -0.25489431004647656, -0.3625272253546275, -0.30143411016838906, -0.75242583405872021, -2.0271757806780628, -2.2639673745086539, -3.5383249085863659, -3.361597106712324, -2.3438802466919229, -1.7249706159518579, -1.7990472945779559, -3.3061472495599995, 0.21156442062862166, -0.74302378668934399, -1.8514918971041745, -0.82502198370632651, -0.74351999988260331, -0.39569215798819279, -0.3943138014933833, -0.29890408748686254, -0.28084584584372846, 0.01472791435408881, -0.04442075186168376, -0.53500016384583715, -0.90188577233528688, -0.69844971117515353, 0.14583567590324595, -0.5544445310046473, 0.1976534820339324, -0.18710828510427244, 0.0076800871037496377, -0.32808050503226982, -0.17511899827005836, -0.38519889843539723, -0.26116553014987143, -0.61792590829173255, -1.4260964500310052, -2.8480835086962002, -2.9656385065341997, -3.1259631743419583, -2.2776462897026373, -1.3820969331049018, -2.0505291279591713, -2.4084298023013879, -1.4996172161865962, 0.12372650763830863, -1.1981932989988076, -0.64588897407998824, -0.33546767337818667, -0.36301254306387043, -0.26196208085033179, -0.17675902360982099, 0.0055639281302357606, -0.034749316729180774, -0.44871907432473696, -0.67215259521100923, -0.46007833291523831, -0.67254330182605182, 0.11741827111366224, -0.409871486550618, -0.32892265898101625, -0.13145556961021479, -0.028899376452251727, -0.092298612924564649, -0.16672095020503341, -0.17646388464205828, -0.35131617290772521, -0.19150029104902661, -1.2217002325587201, -0.7866727441045076, -1.9807415717551959, -1.978633957921319, 0.069560471269209931], \"bottom\": {\"real\": [4103.3252596935745, 31959.928439656338, 10854.934870050551, 5174.7646941682715, 2670.3793024702013, 1512.8812431609856, 751.72119813508266, 487.34157279751093, 286.27976884850017, 202.21445228809756, 139.363320073941, 96.326676625874271, 67.416513392704019, 55.036039361563731, 42.617455049491909, 37.327841235406673, 35.198800209060273, 37.327841235406588, 42.617455049491802, 55.036039361563766, 67.416513392704019, 96.326676625874285, 139.36332007394108, 202.21445228809804, 286.27976884850017, 487.34157279751093, 751.72119813508289, 1512.8812431609856, 2670.3793024702018, 5174.7646941682751, 10854.934870050551, 31959.928439656363, 12454.694619943468, 7821.5833902765553, 5473.1790170642225, 2925.2286142376206, 1403.2127508507554, 917.05530556073552, 556.73350878905819, 335.58154911349368, 222.7562369115075, 161.71079893305554, 119.4497628246793, 75.609007514321249, 55.496087080936569, 43.998829489125107, 34.725029965122339, 29.983374804996487, 29.187336608781969, 30.714909872552553, 33.135728528562289, 38.780040560556557, 50.11926248444739, 62.426609296740132, 93.916765363567279, 123.96413175241418, 177.16967383039952, 250.50030243800805, 399.94920918463373, 596.1485322845399, 914.24633406931139, 1871.6210271277439, 4518.4223121248042, 13565.815861293135, 16084.742683461694, 10028.519769850123, 2736.2851033168113, 1377.4551350842332, 614.08174831750455, 382.39730464420114, 237.0105878631189, 156.24359018004319, 129.95938769710136, 95.53783206710068, 72.004092864891931, 47.804301653843083, 38.41781199466849, 32.452048622414502, 26.753427300507923, 23.772936248165699, 23.138404805980134, 23.598476471031617, 24.755859033283485, 28.713323989162731, 33.395537201677122, 40.850586549891439, 58.649881806718739, 74.872968711973769, 93.465129226367807, 123.19419955144703, 174.75706127058839, 262.71291650117263, 321.82068054258934, 657.05253635266399, 2163.5932265202309, 10212.960963472207, 3792.0213246064613, 2759.3366542985627, 1627.1011647050395, 788.44977202016776, 362.8509317865861, 253.90720770691448, 163.04342130809295, 117.95146004773997, 90.766106703902594, 66.207745096840526, 48.204553381452804, 35.429206551568903, 28.049881805648454, 23.25027473117818, 20.778936642061399, 19.004228801577, 17.585642163629327, 17.698181326434501, 18.806836162280465, 20.329571180523736, 23.456998427374465, 27.472702254518477, 37.193120035742723, 49.117252584083957, 59.574829012615233, 73.59994664128709, 112.97176733843995, 181.91972084309376, 284.0343016488693, 486.29648203694052, 857.05287855361007, 2037.977143592303, 2057.7285052573056, 2152.5952706253152, 1395.1090523951752, 736.25297680000074, 343.98700964912916, 189.68478304615005, 127.37774106216496, 91.12789293157843, 73.667255133763959, 55.964360327653644, 39.482567042532949, 28.14219415335706, 21.278934963706885, 18.193385040510105, 16.473354788100497, 15.086583853495943, 14.403945056404867, 14.533202056236952, 15.306988390608382, 16.092687824041843, 18.097466979870337, 20.289280537832838, 26.201109009342694, 34.023571220637564, 41.620492531599325, 50.685682074964014, 82.560701981631325, 127.19888958323958, 237.89761616945128, 410.06312322518994, 1062.2303232610248, 1612.0404058137353, 2295.1409914972487, 1787.3905923922546, 1192.2295048012345, 614.24882525880628, 260.82616895243024, 126.23242010647614, 84.151076288810984, 67.709414992782712, 60.122571559472298, 42.830591238304876, 28.733103940874788, 20.365121706656215, 16.211112474155353, 14.072758594539286, 13.483685068827034, 12.859628868618824, 11.868475605254234, 11.903201306554562, 12.816996745648828, 13.065794209061782, 14.312459824747068, 16.296926608708432, 20.657711991677495, 27.653390070235432, 33.593110413967857, 40.672720076575544, 55.856624618502167, 103.16047843117397, 179.23484372919035, 453.7513605151255, 902.26285048256875, 1683.7179352249004, 1784.083505146898, 1577.4265763170067, 936.66309122894188, 441.20892337587179, 176.43359667751182, 98.093971741535682, 65.995944695036641, 53.240295707495449, 45.85166507919449, 32.407485359783081, 22.496202298890402, 16.965613714417799, 13.731573445856062, 12.28236966845588, 11.747735381447885, 11.213125876643861, 10.807806034266576, 10.840341477375139, 11.066245600125107, 11.119452781179984, 12.424913044930788, 14.610027556462221, 16.887227742677396, 22.29462391228396, 27.978157381323118, 31.991250392971789, 44.052658881876532, 76.109568327798371, 159.13944268405785, 318.39207128278571, 686.00323178071869, 1336.6568589814267, 1043.0649603599104, 984.78746182807288, 618.0395600950327, 289.32426118556657, 132.98214831862998, 71.520048430881175, 52.57629039600819, 41.525598741467476, 33.633912722813989, 27.031255662449681, 19.489513580793098, 14.812681614273632, 12.21137274400836, 10.893625186679536, 10.482989068673637, 10.105487112246305, 9.7116899243817354, 9.9488069804828818, 10.161347795217756, 10.513274350469635, 11.294150924355744, 12.914730156139361, 14.478861048855546, 19.021661277112585, 23.907610167423496, 27.23573455134931, 38.742976413983023, 62.869223125902629, 111.92503010834605, 213.21062569137553, 433.61330953226366, 726.70269845820769, 562.21861410525219, 539.290746631297, 362.9446461846826, 211.46669660189423, 107.79772661917396, 60.676668375567573, 41.743276533116536, 34.42369696468284, 31.26708433258414, 25.313030406949355, 18.452791878453507, 13.956644256748325, 11.043046695375654, 10.111101652499672, 9.4550360444473061, 9.2429593469396529, 8.9521911222399257, 9.2321124164010211, 9.1908041669169815, 9.5662827353227868, 10.506864865879585, 11.825879962774797, 13.52813582962821, 15.999059082232355, 19.794027285196304, 22.478845287715099, 32.163272384867753, 47.951984523863096, 81.309242866655126, 150.93744536633105, 263.84630525991662, 439.27951033199258, 309.78719189559973, 306.63257299287005, 244.19689848939953, 151.98869039704036, 91.330482004276163, 57.352753322013349, 38.709160706067429, 33.087086449001383, 29.826655436967027, 23.987725148031473, 16.89184234468231, 13.041947079601194, 10.535809562752126, 9.5359471621683909, 8.9374483496855426, 8.5672643122912326, 8.4572735895659434, 8.4602804400971099, 8.5543457526330293, 9.3823763336699937, 10.377230417708629, 11.799673812944503, 12.361176855966248, 14.786798351390814, 16.739331260686697, 20.590148031359199, 25.753571174908508, 38.382893067866803, 63.23013835373618, 105.62437218489313, 175.68359833526657, 256.05708017959813, 224.80770864957879, 228.96753655549054, 172.54966320095522, 116.26546821946491, 80.46990226978717, 53.844334876610212, 37.483534347728245, 31.075867215997253, 26.284110672635684, 20.645029038002825, 15.025930043703783, 11.738276392873866, 10.201438772469425, 8.8203445227279982, 8.4945509856995365, 8.1968728409344909, 8.1790777304419588, 7.908377156922052, 8.6785477295074038, 9.6473715156890378, 10.339435934253908, 10.728035799158873, 11.983620383388951, 13.687783504221503, 16.433795900162693, 18.309125668572698, 22.485075799802843, 31.764684376383052, 49.270779583367755, 77.729851956279916, 123.50059845139852, 179.77043479461938, 159.57955623939222, 154.53329869380329, 127.96891349444883, 91.96783661678981, 66.921744646417011, 48.818287955893446, 36.591061653526779, 27.834277069623926, 23.041902152181589, 18.358713894245302, 13.567338391039883, 11.281789781943191, 9.6038295455647198, 8.7333277563772516, 8.338123667351045, 7.8992088061869676, 7.7104322426775909, 7.9983869985641034, 8.5436438490902269, 9.4432158844800043, 9.7870344410918424, 10.423788563863184, 11.253535869282553, 13.327727562718719, 15.178485067808285, 17.337135682195893, 21.668177060872456, 29.324826866357235, 41.492753218636352, 60.042185621507166, 90.318134916215342, 130.8805255687621, 104.24612656823803, 108.8028525877362, 89.555745560157249, 69.785669575239666, 56.746590174428, 44.171218069814536, 32.39838941697333, 25.182252759236459, 21.610810960419155, 16.972539478480535, 13.238333358456819, 10.614964653675054, 9.3806927946307859, 8.7492814832421075, 8.135298996501481, 7.634398163782139, 7.4852869889479292, 7.8316993609624435, 8.3853957415274643, 9.2315742305614634, 9.8389441629514209, 10.386606043801919, 11.354519695989614, 13.10793814373473, 15.240615596988986, 17.58979203150065, 21.461767190818147, 26.661531554562984, 36.123337028978582, 50.320731869274383, 69.065609719997795, 87.442260857354199, 76.677643276575949, 72.689147636714068, 65.50785565022079, 58.297658406357961, 49.558598741148941, 39.192968104211104, 29.954333787314212, 23.9458863540046, 19.99476230299754, 16.735792774046942, 12.901585018586687, 10.289994503175569, 9.3977765822679924, 8.6704196287803228, 7.8828328381527575, 7.5341478839019471, 7.4312929200041102, 7.7985159766257679, 8.1869060912414078, 9.142118635191288, 9.830770779287306, 10.340589147553608, 11.281171263863113, 12.984935438318947, 15.107976469419242, 18.19770629294057, 20.668346478928893, 25.761496132514932, 32.251424266134499, 39.95295492008993, 51.369438078625848, 65.569299562662465, 55.468849468729523, 55.86542097352833, 55.101138782973663, 50.531848368674723, 43.701470536966781, 35.866381440857431, 28.439396618258566, 22.42863349391925, 18.945030358082761, 15.596977301337661, 12.206893729284205, 10.050508612628137, 9.5473939482322869, 8.6463276280830179, 7.910774588392556, 7.2755514089661562, 7.5482842032534565, 7.5443879419641391, 7.9636187803325598, 8.9922015447577355, 9.6351997849989068, 10.0402383165895, 11.706284711344862, 13.336194440398188, 15.639893484781382, 17.791763978880017, 20.83131115781941, 25.6818621728188, 31.387128642704546, 37.143166049555219, 44.038766386780296, 52.904506937405849, 48.059389050535145, 50.072432061388255, 49.115010315515249, 44.160423468831148, 38.440953181308423, 32.35840674752788, 26.251111011761232, 21.081922570464979, 17.515101530242855, 14.10261621013594, 11.438986216849498, 10.422223192105227, 9.76207732514108, 8.7746319169344158, 7.5939451837729885, 7.2605949806802883, 7.4766919496025244, 7.419064545103371, 8.0187357229163059, 8.9266344512172839, 9.6975643711848107, 10.35689464395745, 11.451859179394017, 13.10319606057651, 15.460942026724263, 18.825021564083144, 22.773162722002358, 26.906890973713775, 31.803276985208164, 37.82902190094245, 42.388788349798304, 44.620105679799558, 48.859277780953818, 46.136110292205181, 41.908361785717766, 39.521022744549988, 35.052294933716347, 29.181343166303421, 23.802472557875006, 19.955746539759069, 16.22743816874862, 13.086681034223906, 11.226909204888067, 10.616041272149978, 9.8385492842648201, 8.6563005846195669, 7.8952678290472065, 7.2762149925656852, 7.3094046208482961, 7.276214992565686, 7.8952678290472083, 8.656300584619574, 9.8385492842648219, 10.616041272149991, 11.226909204888063, 13.086681034223904, 16.22743816874862, 19.955746539759044, 23.802472557874989, 29.181343166303414, 35.052294933716361, 39.521022744549988, 41.908361785717766, 46.136110292205167, 48.059389050535053, 44.620105679799494, 42.388788349798226, 37.82902190094255, 31.803276985208186, 26.906890973713825, 22.773162722002368, 18.825021564083173, 15.460942026724263, 13.103196060576508, 11.451859179394024, 10.356894643957441, 9.6975643711848196, 8.9266344512172751, 8.0187357229163005, 7.4190645451033674, 7.4766919496025226, 7.2605949806802919, 7.5939451837729957, 8.7746319169344176, 9.7620773251410817, 10.42222319210523, 11.438986216849505, 14.102616210135931, 17.515101530242841, 21.081922570464972, 26.251111011761218, 32.358406747527845, 38.44095318130838, 44.160423468831063, 49.115010315515164, 50.072432061388007, 55.468849468729232, 52.90450693740565, 44.038766386780239, 37.143166049555234, 31.387128642704567, 25.681862172818796, 20.831311157819414, 17.79176397888002, 15.639893484781378, 13.336194440398192, 11.706284711344864, 10.040238316589498, 9.6351997849989122, 8.9922015447577301, 7.9636187803325527, 7.5443879419641293, 7.5482842032534556, 7.2755514089661553, 7.9107745883925578, 8.6463276280830215, 9.5473939482322869, 10.050508612628141, 12.206893729284213, 15.596977301337661, 18.945030358082761, 22.428633493919239, 28.439396618258566, 35.866381440857388, 43.70147053696676, 50.531848368674645, 55.101138782973628, 55.865420973528131, 76.677643276575822, 65.569299562662337, 51.369438078625784, 39.952954920090001, 32.251424266134514, 25.761496132514949, 20.668346478928903, 18.19770629294057, 15.107976469419244, 12.984935438318949, 11.28117126386311, 10.340589147553612, 9.8307707792872954, 9.1421186351912915, 8.1869060912414096, 7.7985159766257599, 7.4312929200041067, 7.5341478839019365, 7.882832838152761, 8.6704196287803175, 9.3977765822679942, 10.289994503175565, 12.901585018586699, 16.735792774046928, 19.99476230299755, 23.945886354004585, 29.954333787314209, 39.19296810421109, 49.55859874114887, 58.297658406357826, 65.507855650220662, 72.689147636713827, 104.24612656823788, 87.442260857354213, 69.065609719997752, 50.320731869274368, 36.123337028978554, 26.661531554563005, 21.461767190818144, 17.589792031500657, 15.24061559698899, 13.107938143734735, 11.354519695989618, 10.386606043801917, 9.8389441629514156, 9.2315742305614528, 8.3853957415274607, 7.8316993609624372, 7.4852869889479301, 7.6343981637821372, 8.1352989965014757, 8.7492814832421111, 9.3806927946307876, 10.614964653675061, 13.238333358456819, 16.972539478480542, 21.610810960419155, 25.182252759236462, 32.39838941697333, 44.171218069814465, 56.746590174427972, 69.785669575239609, 89.555745560157177, 108.80285258773613, 159.57955623939191, 130.8805255687619, 90.318134916215342, 60.042185621507201, 41.492753218636388, 29.32482686635726, 21.668177060872456, 17.3371356821959, 15.178485067808294, 13.327727562718726, 11.253535869282553, 10.423788563863175, 9.7870344410918424, 9.4432158844800025, 8.5436438490902233, 7.9983869985640963, 7.7104322426775891, 7.8992088061869596, 8.338123667351045, 8.7333277563772533, 9.6038295455647145, 11.281789781943189, 13.567338391039879, 18.358713894245295, 23.041902152181613, 27.834277069623926, 36.591061653526772, 48.818287955893382, 66.921744646416983, 91.967836616789555, 127.96891349444861, 154.53329869380323, 224.80770864957842, 179.77043479461912, 123.50059845139837, 77.729851956279958, 49.27077958336772, 31.764684376383045, 22.485075799802868, 18.309125668572733, 16.433795900162703, 13.6877835042215, 11.983620383388955, 10.72803579915886, 10.339435934253904, 9.6473715156890254, 8.6785477295073967, 7.9083771569220449, 8.1790777304419553, 8.1968728409344909, 8.4945509856995347, 8.8203445227279857, 10.201438772469423, 11.738276392873869, 15.02593004370379, 20.645029038002832, 26.284110672635681, 31.075867215997253, 37.483534347728245, 53.844334876610127, 80.46990226978717, 116.26546821946468, 172.54966320095502, 228.96753655548974, 309.78719189559854, 256.05708017959756, 175.68359833526623, 105.62437218489312, 63.230138353736059, 38.382893067866796, 25.753571174908501, 20.590148031359234, 16.739331260686704, 14.786798351390802, 12.361176855966249, 11.799673812944498, 10.377230417708628, 9.3823763336699955, 8.5543457526330204, 8.4602804400970992, 8.4572735895659417, 8.567264312291222, 8.9374483496855408, 9.5359471621683873, 10.535809562752121, 13.041947079601202, 16.891842344682331, 23.987725148031487, 29.826655436966995, 33.087086449001376, 38.709160706067401, 57.35275332201325, 91.33048200427605, 151.98869039703999, 244.19689848939879, 306.63257299286875, 562.21861410525219, 439.27951033199281, 263.84630525991662, 150.93744536633125, 81.309242866655154, 47.951984523863167, 32.163272384867753, 22.478845287715121, 19.794027285196304, 15.999059082232373, 13.528135829628219, 11.82587996277479, 10.50686486587958, 9.5662827353227868, 9.190804166916978, 9.2321124164010211, 8.9521911222399257, 9.2429593469396458, 9.4550360444473043, 10.111101652499666, 11.043046695375656, 13.956644256748326, 18.452791878453535, 25.313030406949409, 31.26708433258414, 34.423696964682833, 41.743276533116529, 60.676668375567509, 107.79772661917396, 211.46669660189391, 362.94464618468271, 539.29074663129688, 1043.064960359907, 726.70269845820621, 433.61330953226252, 213.21062569137561, 111.92503010834588, 62.869223125902685, 38.742976413983001, 27.235734551349324, 23.907610167423499, 19.021661277112635, 14.478861048855546, 12.91473015613936, 11.29415092435573, 10.513274350469626, 10.161347795217747, 9.9488069804828747, 9.7116899243817407, 10.105487112246305, 10.48298906867363, 10.893625186679529, 12.211372744008356, 14.812681614273641, 19.489513580793123, 27.031255662449723, 33.633912722813953, 41.52559874146754, 52.576290396008147, 71.520048430881019, 132.98214831862995, 289.32426118556515, 618.03956009503077, 984.7874618280689, 1784.0835051468939, 1336.6568589814267, 686.00323178071801, 318.39207128278593, 159.1394426840578, 76.109568327798428, 44.05265888187656, 31.991250392971853, 27.978157381323108, 22.294623912284028, 16.8872277426774, 14.610027556462216, 12.424913044930783, 11.119452781179971, 11.066245600125109, 10.840341477375128, 10.807806034266576, 11.213125876643852, 11.747735381447885, 12.282369668455885, 13.731573445856061, 16.965613714417831, 22.496202298890438, 32.407485359783124, 45.85166507919449, 53.24029570749542, 65.99594469503667, 98.093971741535469, 176.43359667751176, 441.208923375871, 936.66309122894131, 1577.4265763170022, 2295.1409914972464, 1683.7179352249, 902.26285048256875, 453.75136051512629, 179.23484372919026, 103.16047843117398, 55.856624618502074, 40.67272007657553, 33.59311041396785, 27.653390070235471, 20.65771199167747, 16.296926608708404, 14.312459824747059, 13.065794209061782, 12.816996745648842, 11.903201306554557, 11.868475605254236, 12.859628868618808, 13.483685068827036, 14.072758594539282, 16.21111247415536, 20.365121706656261, 28.733103940874788, 42.830591238304876, 60.122571559472277, 67.709414992782641, 84.151076288810941, 126.23242010647601, 260.82616895243001, 614.24882525880446, 1192.2295048012338, 1787.3905923922525, 2057.7285052573061, 1612.0404058137367, 1062.2303232610243, 410.06312322519068, 237.89761616945111, 127.19888958323968, 82.560701981631325, 50.685682074964042, 41.620492531599325, 34.023571220637599, 26.201109009342684, 20.289280537832823, 18.09746697987034, 16.092687824041846, 15.306988390608383, 14.533202056236956, 14.40394505640487, 15.086583853495929, 16.47335478810048, 18.193385040510101, 21.278934963706888, 28.142194153357082, 39.482567042533006, 55.964360327653644, 73.667255133763959, 91.127892931578486, 127.37774106216477, 189.68478304614982, 343.98700964912905, 736.25297679999983, 1395.1090523951759, 2152.5952706253147, 3792.0213246064582, 2037.977143592301, 857.05287855360893, 486.29648203694126, 284.03430164886925, 181.91972084309373, 112.97176733844, 73.599946641287119, 59.574829012615204, 49.117252584084042, 37.193120035742723, 27.472702254518456, 23.456998427374469, 20.329571180523697, 18.806836162280476, 17.698181326434526, 17.585642163629327, 19.004228801577025, 20.77893664206141, 23.250274731178163, 28.04988180564844, 35.429206551568925, 48.204553381452833, 66.207745096840512, 90.766106703902594, 117.95146004774013, 163.04342130809306, 253.90720770691391, 362.85093178658599, 788.44977202016594, 1627.1011647050398, 2759.3366542985605, 16084.742683461691, 10212.960963472211, 2163.5932265202296, 657.05253635266433, 321.82068054258923, 262.71291650117286, 174.75706127058845, 123.19419955144714, 93.465129226367836, 74.87296871197394, 58.649881806718732, 40.850586549891496, 33.395537201677108, 28.713323989162756, 24.755859033283489, 23.59847647103166, 23.138404805980127, 23.77293624816566, 26.753427300507926, 32.452048622414509, 38.417811994668497, 47.804301653843162, 72.004092864892002, 95.537832067100879, 129.95938769710136, 156.24359018004333, 237.01058786311899, 382.39730464420052, 614.08174831750478, 1377.4551350842296, 2736.2851033168104, 10028.51976985012, 12454.694619943462, 13565.815861293133, 4518.4223121248006, 1871.6210271277425, 914.24633406931184, 596.14853228454001, 399.94920918463339, 250.50030243800833, 177.16967383039946, 123.96413175241405, 93.91676536356745, 62.426609296740118, 50.119262484447404, 38.780040560556571, 33.135728528562332, 30.714909872552628, 29.187336608781973, 29.983374804996448, 34.725029965122346, 43.998829489125086, 55.496087080936618, 75.609007514321277, 119.44976282467937, 161.7107989330556, 222.75623691150756, 335.58154911349339, 556.73350878905831, 917.05530556073529, 1403.2127508507556, 2925.2286142376206, 5473.1790170642225, 7821.5833902765453], \"imag\": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, \"imag\": [0.0, 1.2364045139795619, -1.417097645517349, -0.56399113050110405, 0.44612204752934542, -0.22857396866743723, -0.12233724123958876, -0.22175063370253431, -0.081847654478992143, -0.082144528420219798, -0.016319194688300422, -0.22782269816808789, -0.31553723757062957, -0.34627737582788948, 1.2289873494343531, 0.23714731979244019, 0.0, -0.23714731979246589, -1.2289873494343397, 0.34627737582788415, 0.31553723757063035, 0.2278226981680877, 0.01631919468830003, 0.082144528420217924, 0.081847654478992143, 0.22175063370252604, 0.12233724123959235, 0.22857396866743548, -0.4461220475293452, 0.56399113050110417, 1.4170976455173483, -1.2364045139795607, 1.3606412475160685, 1.4411916754234004, -0.33639737707180672, -0.40059289889731398, 0.077869450453742065, 0.11933000679564014, -0.37020072416606636, -0.12600631152419078, -0.29291723130603109, -0.050683391882318747, -0.2123566898458312, -0.16517843825664788, -0.37438920939802389, 0.24863698196016526, 0.3956337373323095, 0.63308466384569972, -0.42643957249522613, -0.28749903579454716, -0.42301568032975828, 0.27971623762695519, 0.37808744252168813, 0.15296582393741001, 0.10558339349178479, 0.088135922159038316, 0.16705843369252343, 0.44192642538865684, 0.29915225181421068, -0.047649837051313024, -0.91046045526812369, 2.0668504460046964, 1.0236217631956717, 0.095775027331123308, 0.74327388531916394, -0.034562131954570079, 0.86361123753821734, 0.14688086473050152, -0.48040960369964397, 0.72553155869356101, -0.87865322612555963, -0.4386512882244577, -0.48573187070285989, -0.32017932907631874, -0.2830749986604581, -0.26990648117356825, 0.02650526715020339, 0.070485969368273949, 0.54370981678608021, -0.067938463814195812, 0.03776680164210118, -0.5672727000472354, 0.70317235961628322, -0.021133356436660328, 0.38778419454697149, -0.021237638325898506, 0.22272564345822293, -0.028529610958430065, 0.38389116569218468, 0.54015192300945081, 0.60890484535134959, -0.58851980199844323, -0.44257995715790832, -0.31054780878465871, 0.29452233058397137, 1.4203730522981519, 0.55042973333868539, 1.0635980503754177, -0.33223282315731317, 0.34444399750770754, 1.4812987845914649, 0.28203486996779931, -0.50640814880924923, -0.63152717265524028, -0.629560147993244, -0.38143909917016799, -0.26024004494781861, -0.19111004712688462, -0.0074049384249937926, 0.048145781851611912, 0.1775395908501845, -0.010766872600667563, -0.30557543109041663, -0.12790446781789691, 0.26497067484017217, 0.49718432792560446, 0.10847923107858634, 0.18362798444374009, 0.075793328725680426, 0.060915837919074359, 0.19352569039908019, 0.72484131059467238, 0.44769863619371908, 0.65727781823869813, -2.7705947112358387, -1.8545676439466314, 1.2534804319442749, -0.33201271766592177, -0.88179245186152566, -0.49191197464707653, 0.25061306335904526, 0.36434278784189494, 1.1059306596340364, 0.5161851914994362, -0.56259342729123341, -0.79818525223670012, -0.50614275317411506, -0.33450192958610769, -0.24220392956380443, -0.29363217368931438, -0.008975674876931768, 0.015702042401798396, 0.0043287613096781611, 0.11769772351691517, 0.14847974776257877, -0.070404205425901215, 0.15992872157624444, 0.12352253662711207, 0.22950814490677918, 0.17507285276321555, 0.13747467644410705, -0.011397583876153142, 0.1103654239578318, 0.24404333943616102, 1.1434123865171273, -0.60566186502851971, -1.3365493166122577, -1.1338250057068979, -1.8155993788135394, -1.0591766157447149, -0.69010247253016843, -0.46612626705839738, -0.20353239335470796, 0.51663850122650623, 0.2659701357580968, -0.10657803670351902, -0.69730138646619577, -0.60106744735123385, -0.33542800506255299, -0.30564289179799509, -0.26672832014897818, -0.19552146385155383, -0.070818253229817343, 0.24716165183995586, 0.24871001073085031, 0.087906272749659523, -0.066392764898707615, 0.11463822183417864, -0.097387114548935505, 0.203187369929616, 0.14292038700683402, 0.20736891492564988, 0.013685307258532538, -0.024371827339033106, -0.07233585420108031, 0.49291782026044645, 0.048917424863979306, 0.2263553910474094, 0.10839909954530379, -1.1957108711898896, -1.074771579950879, -1.1175823884839045, -0.23901621577757862, -0.12877260884038383, 0.23623861798820722, 0.17111767858219226, 0.46208690546761177, -0.23679486634226876, -0.53178862418379869, -0.34021620386249335, -0.23658495591681358, -0.22275756609764855, -0.20572232603908905, -0.14494733127712761, 0.042569660785953992, 0.077733070765218709, 0.20558191361174552, 0.031719635617051253, -0.031869312918226284, 0.0092446671691655703, 0.056907964871031128, 0.0068114015565279478, 0.20608602740074444, 0.023033890597355222, 0.064944626021130644, -0.089711600875347838, 0.051877409795188095, -0.22207073062343796, 0.24248276916859771, 0.82932242402320455, -0.0013771249391571728, -0.059139017637367147, -0.22067925957890699, -0.040068334939789486, 0.30677005181582889, 0.34490255487274107, 0.22221882441368751, 0.30818729583490434, 0.041656273199714877, 0.04389672863559383, -0.30032839778423015, -0.24246246508902861, -0.17809969240648099, -0.14126159805998126, -0.15553553242798068, -0.11510723629505018, 0.024565620333015844, 0.099324973861333238, 0.11314958231531824, 0.10920785431914558, -0.0027478677647314949, -0.002197448124614016, -0.069940656171551499, 0.14656177726216579, 0.078770189361086429, 0.10241250352514093, -0.021646587213105684, 0.019211160710794505, -0.26281055993233693, -0.055146819140509458, 0.35375643597531126, 0.22411418130009836, 0.3875457037899096, 0.25423051056794166, 0.30581901500051717, 0.085911462662090085, 0.39107302489471046, 0.24699055160378858, 0.29387297238508514, 0.15373347718831995, -0.002984582508486469, -0.017260207971634491, 0.072827255227658205, -0.062089135258224848, -0.11929552297831249, -0.14454547803177953, -0.095268264507681985, -0.10089614648569632, 0.048761457544342565, 0.09609679137720413, 0.10529567915508571, 0.012037966893712556, 0.076343100588013288, -0.20546035926376272, 0.13459193297647368, 0.025732944443593878, 0.15693288111736364, 0.043761647973181578, 0.083479299629684353, -0.15251693996845875, -0.10657849804550705, 0.038641816351084518, -0.10231188547257405, 0.21957600785318707, 0.264774413728534, 0.35686545376814865, 0.29428485506006929, 0.49934135456989248, 0.18285689914378289, 0.23675610338446562, 0.10353827744151976, 0.063107949091445251, 0.03846587209017991, 0.13661717625997899, 0.098122755354854277, -0.0039906200934582137, -0.09009439550122221, -0.16647262366552176, -0.19237746196753996, 0.026647194061990561, 0.048509383863749068, 0.1654716680991411, -0.035914795239386038, 0.099273739290017232, -0.11264804489487676, 0.14792025966567318, -0.093791526140286519, 0.10021979561886898, 0.0080449729031339574, 0.25399382193861558, -0.10951630791791984, -0.033548122233328939, -0.024275040060575473, -0.15565555640319179, -0.035231426543991154, 0.063485173587351437, 0.22814734409189322, 0.10684932807789806, 0.2355554633425988, 0.10407564589066262, 0.015525256999673128, -0.011913601076877599, -0.0039295920043740662, 0.044701593559494178, 0.16547295203389104, 0.15907957720488838, 0.074664630781852093, -0.04243906497357175, -0.11246394245376416, -0.16972427151540079, -0.21530290856092721, -0.15195750501651711, 0.40553391670472716, -0.05507255324487554, 0.18488826926783164, -0.03502892748503212, 0.37001387119519319, -0.15325722566754377, 0.27168929694820759, -0.059701216280397838, 0.48380889084850937, -0.13017614472815323, 0.047673421329954523, 0.071305584258896423, -0.15733503034508964, -0.079593566039511662, -0.075485820780456944, 0.06620598245919887, -0.0012785498169557718, 0.063827392702187832, -0.0024400785561267094, 0.050942947866382475, -0.16777938781510365, -0.092876049496631446, -0.010378011540593757, 0.1594331602275639, 0.19523869399925237, 0.18464942262011227, 0.063285121982437173, -0.077221658551183223, -0.1491589460269398, -0.17912928670535297, -0.11490318286815507, -0.11189726101521234, -0.20487634390276235, 0.76498375921014561, -0.23800865420158882, 0.74083633586796371, -0.083846748018997191, 0.46372256496136105, -0.16834959597660981, 0.80860396068755125, -0.25555617026146216, 0.19463913189037535, 0.30097794980879877, -0.16302064990391507, -0.10690976611351247, -0.13497815095121923, -0.049772201284698683, -0.079451894223961053, 0.040407604161455342, -0.09194915079908203, -0.14731166465811507, -0.26499922119954511, -0.15560186997026057, -0.069496867327866862, 0.16530147427910571, 0.22324548858793775, 0.26718136730575287, 0.19166419512490171, 0.060936923017668537, -0.088626234734120041, -0.14658150061325853, -0.15988330961851069, -0.18630425886720847, 0.20226767939927157, -0.086142375874942501, -0.77766311308853053, 1.4090153420038987, -0.3038886842868152, 1.2888777036518135, -0.074470758177722834, 1.2482190395029773, -0.80123249840125998, 0.47055407026248136, 0.75577199845745624, -0.11037652666672627, -0.054458369263067428, -0.19918107544886771, -0.10899116252888987, -0.15332031366957818, 0.043654486348545761, -0.022154991408309264, -0.15239448898889341, -0.19372066727324463, -0.023769000914279543, 0.24457812931884867, 0.51722906014629877, 0.4305115414461968, 0.4535547011943914, 0.3493581281435395, 0.21076698450898321, 0.063956239140020049, -0.043266091906771414, -0.12307402164456596, -0.17588597679362872, -0.057160335632577657, -0.0784239564694168, 0.14377922602722487, -0.28610637890062873, -1.3867297053543113, 2.7076021550256568, -0.12637740826622818, 2.0046873376560574, -1.442367549533677, 0.41516901914168741, 1.1637625900709285, 0.02187980097289477, 0.2119473473283329, -0.11885489129254229, -0.1159981397382039, -0.18899269201836941, -0.058557612447368006, -0.043992442353640485, -0.026879139952720663, -0.019298206516241499, 0.11425895652801879, -0.10204731321609413, 1.0976378910336273, 0.78083298172023552, 0.7892686156410853, 0.65585934200294294, 0.41963945036689065, 0.21495377802894691, 0.10907743849349204, -0.015003791740152183, -0.098108352324783196, -0.099983461914768382, -0.14074054993981988, -0.049222223079134708, -0.60225632344115432, 0.14822551318702831, -0.20779420774376042, -2.0348285284263787, 4.0251861194251459, -2.7420491756647705, 0.80731183784095106, 1.5256751899261984, -0.015777910213839702, 0.56481061463658855, 0.094745090670160736, 0.032305441115857418, -0.15496296066268442, -0.070898922964745509, -0.15185446167165811, -0.099013378837322308, -0.033839198092832617, 0.20170996830425536, 0.31395340400286426, 0.91804938453195506, 0.90837480132247328, 1.1212514777242175, 0.8111537128593137, 0.65461252772518352, 0.44812018281017851, 0.29338133862249183, 0.080942506543726575, -0.0048876135806632161, -0.042045437831147933, -0.048279129686226115, -0.13748504879992385, -0.22867414001479172, -0.65206021382919555, -1.4414816884582773, 0.34900156189272369, 1.2663064061664397, -4.4519069438082273, 2.3981175155339263, 2.0366543361516527, -0.11574419894478603, 0.9938253915317542, 0.40253059498542132, 0.29787521235777348, -0.048128801274628118, 0.001834095689180732, -0.063578064856638958, -0.14911097873279969, -0.17638384543546787, -0.15061392115741762, -0.13638564133647435, 0.3292785127452974, 0.45646012748955422, 0.0, -0.098380202448484569, 0.2889284460821786, 0.39981384774007012, 0.45036129401449043, 0.22152969012775114, 0.11073273247786891, 0.024117745722163984, -0.0050280129542534689, -0.087106960572679512, -0.083653448195472838, -0.51521426958714545, -0.86124262209127589, -0.78939851130304506, -0.74423225935393889, -1.1208061672534484, 0.0, 1.1208061672534437, 0.74423225935393811, 0.78939851130304262, 0.86124262209127656, 0.51521426958714389, 0.083653448195472491, 0.087106960572679332, 0.0050280129542534689, -0.02411774572216354, -0.11073273247786865, -0.22152969012775126, -0.45036129401449054, -0.39981384774006945, -0.28892844608217838, 0.098380202448484236, -0.90837480132241455, -0.45646012748952708, -0.32927851274525655, 0.13638564133649642, 0.15061392115742586, 0.17638384543547556, 0.14911097873280194, 0.063578064856639402, -0.0018340956891807838, 0.048128801274627743, -0.29787521235777292, -0.40253059498541977, -0.99382539153175098, 0.11574419894478773, -2.0366543361516536, -2.3981175155339201, 4.4519069438082379, -1.2663064061664346, -0.34900156189272086, 1.4414816884582851, 0.65206021382919577, 0.22867414001479336, 0.13748504879992438, 0.048279129686228148, 0.042045437831148495, 0.0048876135806649092, -0.08094250654372509, -0.29338133862248678, -0.44812018281017507, -0.6546125277251672, -0.81115371285928006, -1.1212514777241573, -1.0976378910335893, -0.91804938453192131, -0.31395340400284805, -0.20170996830424559, 0.033839198092839695, 0.09901337883732686, 0.1518544616716597, 0.070898922964745925, 0.15496296066268506, -0.032305441115858605, -0.09474509067015939, -0.56481061463658966, 0.01577791021384034, -1.5256751899262007, -0.80731183784094906, 2.7420491756647789, -4.0251861194251397, 2.0348285284263898, 0.20779420774376556, -0.14822551318702654, 0.60225632344115643, 0.049222223079135728, 0.14074054993982205, 0.099983461914770352, 0.098108352324783543, 0.015003791740153814, -0.10907743849349157, -0.21495377802894516, -0.41963945036688871, -0.65585934200294016, -0.78926861564106898, -0.78083298172020743, -0.24457812931883488, 0.10204731321609872, -0.11425895652800651, 0.019298206516249916, 0.026879139952725083, 0.04399244235364598, 0.058557612447370934, 0.18899269201837068, 0.11599813973820411, 0.11885489129254237, -0.21194734732833254, -0.021879800972893531, -1.1637625900709312, -0.4151690191416833, 1.4423675495336772, -2.0046873376560503, 0.12637740826623128, -2.7076021550256497, 1.3867297053543175, 0.28610637890063351, -0.14377922602722601, 0.078423956469422018, 0.057160335632579121, 0.1758859767936318, 0.12307402164456618, 0.043266091906772712, -0.063956239140019508, -0.21076698450897985, -0.34935812814353639, -0.45355470119438479, -0.43051154144618958, -0.51722906014628944, 0.15560186997025938, 0.02376900091427863, 0.1937206672732435, 0.15239448898889424, 0.022154991408310377, -0.043654486348542874, 0.15332031366958024, 0.10899116252889095, 0.19918107544886771, 0.054458369263066984, 0.11037652666672665, -0.75577199845745313, -0.47055407026248092, 0.80123249840126409, -1.2482190395029769, 0.074470758177730939, -1.2888777036518133, 0.30388868428682408, -1.4090153420038936, 0.77766311308853486, 0.086142375874943722, -0.20226767939927121, 0.18630425886721039, 0.15988330961851227, 0.14658150061325848, 0.088626234734120221, -0.060936923017667906, -0.19166419512490052, -0.26718136730575015, -0.22324548858793625, -0.16530147427910316, 0.069496867327866751, 0.16777938781510615, 0.26499922119954472, 0.14731166465811715, 0.091949150799082904, -0.040407604161453857, 0.07945189422396387, 0.049772201284700876, 0.13497815095122018, 0.10690976611351256, 0.16302064990391416, -0.30097794980879811, -0.19463913189037552, 0.25555617026146371, -0.80860396068754914, 0.16834959597661264, -0.46372256496135666, 0.083846748018996636, -0.7408363358679616, 0.23800865420159104, -0.76498375921014483, 0.20487634390276502, 0.11189726101521356, 0.11490318286815554, 0.17912928670535491, 0.14915894602693922, 0.077221658551183403, -0.063285121982436826, -0.18464942262010964, -0.19523869399925042, -0.15943316022756263, 0.01037801154059478, 0.09287604949663382, -0.015525256999667727, -0.050942947866376924, 0.0024400785561280833, -0.06382739270218761, 0.0012785498169549515, -0.066205982459197621, 0.075485820780458165, 0.079593566039511995, 0.1573350303450895, -0.071305584258897034, -0.047673421329955501, 0.13017614472815361, -0.48380889084851014, 0.05970121628039872, -0.27168929694820493, 0.1532572256675474, -0.37001387119519286, 0.035028927485033709, -0.18488826926782947, 0.055072553244877351, -0.40553391670472771, 0.15195750501651886, 0.21530290856092779, 0.16972427151540051, 0.11246394245376394, 0.042439064973571687, -0.07466463078185144, -0.159079577204887, -0.16547295203388937, -0.044701593559494109, 0.0039295920043746378, 0.011913601076878649, -0.18285689914377989, -0.10407564589066134, -0.23555546334259525, -0.10684932807789757, -0.22814734409189458, -0.063485173587349258, 0.035231426543992535, 0.15565555640319106, 0.02427504006057549, 0.033548122233326282, 0.10951630791791925, -0.25399382193861758, -0.0080449729031340841, -0.10021979561886678, 0.093791526140288961, -0.14792025966567243, 0.11264804489487593, -0.099273739290014568, 0.035914795239387988, -0.16547166809914049, -0.048509383863747611, -0.02664719406199113, 0.19237746196754099, 0.16647262366552154, 0.090094395501221572, 0.0039906200934596249, -0.098122755354853444, -0.1366171762599761, -0.038465872090180271, -0.063107949091446403, -0.10353827744152141, -0.2367561033844639, -0.39107302489471046, -0.4993413545698927, -0.29428485506006952, -0.35686545376814893, -0.26477441372853422, -0.21957600785318782, 0.10231188547257429, -0.038641816351083894, 0.10657849804550705, 0.15251693996845886, -0.083479299629685352, -0.043761647973181945, -0.1569328811173635, -0.025732944443590922, -0.13459193297646968, 0.2054603592637699, -0.076343100588013288, -0.012037966893705314, -0.10529567915508307, -0.096096791377201118, -0.048761457544342024, 0.10089614648569795, 0.095268264507682401, 0.14454547803178003, 0.11929552297831249, 0.062089135258225896, -0.072827255227657164, 0.017260207971635976, 0.0029845825084865137, -0.15373347718831978, -0.29387297238508514, -0.24699055160378858, -0.30677005181583211, -0.085911462662095636, -0.30581901500051922, -0.25423051056794305, -0.38754570378991321, -0.22411418130009808, -0.35375643597530843, 0.055146819140510416, 0.26281055993233621, -0.019211160710796572, 0.021646587213104713, -0.10241250352514171, -0.078770189361086179, -0.14656177726216213, 0.06994065617155748, 0.0021974481246246629, 0.002747867764730379, -0.10920785431913549, -0.11314958231531393, -0.099324973861329505, -0.024565620333014605, 0.11510723629505158, 0.15553553242798132, 0.1412615980599799, 0.1780996924064803, 0.24246246508902825, 0.30032839778422799, -0.043896728635589223, -0.041656273199716369, -0.30818729583490695, -0.22221882441369153, -0.34490255487274391, 0.23901621577757753, 0.040068334939789153, 0.22067925957890494, 0.059139017637366363, 0.0013771249391555669, -0.82932242402320322, -0.24248276916859551, 0.2220707306234446, -0.05187740979518813, 0.089711600875348782, -0.064944626021130755, -0.023033890597353883, -0.20608602740074317, -0.0068114015565181726, -0.056907964871020393, -0.0092446671691440163, 0.031869312918224861, -0.031719635617030659, -0.20558191361174011, -0.077733070765210868, -0.042569660785952056, 0.14494733127713064, 0.20572232603908944, 0.22275756609764749, 0.23658495591681294, 0.34021620386249518, 0.53178862418379935, 0.23679486634227159, -0.4620869054676115, -0.17111767858219507, -0.23623861798820922, 0.12877260884038208, 0.69010247253016699, 1.1175823884838996, 1.0747715799508781, 1.1957108711898863, -0.10839909954530788, -0.2263553910474054, -0.048917424863973949, -0.49291782026044056, 0.072335854201080588, 0.024371827339035017, -0.013685307258532536, -0.20736891492564691, -0.14292038700683141, -0.20318736992960118, 0.09738711454895084, -0.11463822183415182, 0.066392764898706338, -0.087906272749638886, -0.24871001073084317, -0.24716165183994784, 0.070818253229819925, 0.19552146385155544, 0.2667283201489779, 0.30564289179799059, 0.3354280050625516, 0.60106744735122974, 0.69730138646619622, 0.10657803670352221, -0.26597013575809814, -0.51663850122651156, 0.20353239335470413, 0.46612626705839527, 0.88179245186152555, 1.0591766157447142, 1.8155993788135401, 1.1338250057069015, 1.3365493166122591, 0.60566186502852537, -1.1434123865171271, -0.24404333943615408, -0.11036542395783162, 0.011397583876152599, -0.13747467644410641, -0.17507285276321236, -0.22950814490677501, -0.12352253662709391, -0.15992872157622667, 0.070404205425931329, -0.14847974776257952, -0.11769772351689584, -0.0043287613096706385, -0.01570204240179094, 0.0089756748769360926, 0.29363217368931571, 0.24220392956380496, 0.33450192958610414, 0.50614275317411517, 0.79818525223669812, 0.56259342729123207, -0.51618519149943443, -1.105930659634037, -0.36434278784189805, -0.25061306335904537, 0.49191197464707476, -0.55042973333868328, 0.33201271766592266, -1.2534804319442674, 1.8545676439466376, 2.7705947112358396, -0.65727781823869658, -0.44769863619371453, -0.72484131059467105, -0.19352569039907921, -0.06091583791907576, -0.075793328725683354, -0.18362798444373865, -0.10847923107858076, -0.4971843279255892, -0.26497067484015147, 0.12790446781792791, 0.30557543109041591, 0.010766872600696822, -0.17753959085018053, -0.04814578185160058, 0.007404938424997059, 0.19111004712688809, 0.26024004494781799, 0.38143909917016594, 0.62956014799324345, 0.63152717265524094, 0.50640814880924734, -0.28203486996779953, -1.481298784591466, -0.34444399750770943, 0.33223282315731145, -1.0635980503754157, -0.74327388531916416, -1.4203730522981521, -0.29452233058397176, 0.31054780878465887, 0.4425799571579111, 0.58851980199844711, -0.60890484535134703, -0.54015192300944392, -0.38389116569218451, 0.02852961095842791, -0.22272564345822352, 0.021237638325899852, -0.387784194546968, 0.021133356436687064, -0.70317235961626101, 0.56727270004732033, -0.037766801642101375, 0.06793846381428098, -0.54370981678606445, -0.070485969368251203, -0.02650526715020184, 0.26990648117357596, 0.2830749986604576, 0.32017932907632218, 0.48573187070286, 0.4386512882244713, 0.87865322612556163, -0.72553155869355623, 0.48040960369964236, -0.14688086473049994, -0.86361123753821778, 0.034562131954569586, -1.3606412475160699, -0.095775027331125598, -1.0236217631956728, -2.0668504460046977, 0.91046045526812469, 0.047649837051312177, -0.29915225181420874, -0.44192642538866073, -0.16705843369252318, -0.088135922159037081, -0.1055833934917848, -0.15296582393740679, -0.37808744252168625, -0.27971623762694292, 0.42301568032977793, 0.28749903579456393, 0.42643957249522774, -0.63308466384561635, -0.39563373733228846, -0.2486369819601503, 0.37438920939802361, 0.1651784382566546, 0.21235668984583117, 0.050683391882319691, 0.2929172313060312, 0.12600631152419559, 0.37020072416606892, -0.11933000679563836, -0.077869450453742661, 0.40059289889731342, 0.33639737707180556, -1.4411916754233998], \"height\": 32, \"width\": 32, \"top\": {\"real\": [6327.0074679827858, 12787.448651417644, -8580.1357782693794, -6564.4296251926053, 1064.8969915597925, -1614.7722808334524, -60.048119421842308, -221.12968025641604, -12.445754708845573, -62.940587713583341, 23.820578453457951, -28.525301748952867, 37.864280125154337, -85.844490405627994, 27.493814969643068, -48.151974443362732, 41.399660199307142, -48.151974443360345, 27.493814969642067, -85.844490405627866, 37.864280125154032, -28.525301748952689, 23.820578453458509, -62.940587713584037, -12.445754708845573, -221.12968025641445, -60.048119421842806, -1614.7722808334493, 1064.8969915597932, -6564.4296251926125, -8580.1357782693849, 12787.448651417659, -17213.595236981997, 544.07302669902936, -10829.417860945707, -5794.1219231083051, -1103.8692252742003, -1120.3666800727638, -106.61462896985108, -117.89522553300084, -39.308430893651213, -26.960578056534288, -11.025047422886351, -2.1850531713376355, -7.2952697383625882, -14.472211987615461, -14.23279965231924, 3.5205960317557246, -19.629747734378611, -14.131264529804582, -22.272265924680642, -17.401343902608428, -1.7416101263052008, 0.34733716754184635, -16.60063574625633, -32.47390190466588, -64.31481385096977, -84.034753639409303, -258.32278440436392, -714.30117659130417, 113.1165060355228, -2806.7151144576005, -10882.302955904926, -27817.100568112113, -27745.708494118069, -22841.420845008699, -8553.5264674688351, -4085.033989629072, -1748.9561003744159, -545.33543865452532, -146.45498278007594, -40.805440061891282, -50.060212982262158, -16.730489448484349, -23.62313915150434, 0.36714120063527833, -7.1882909197809326, 6.4142604093545659, -14.833291452397129, 3.4669422259569203, -16.161012153790594, -21.283130178011959, -13.244388638951026, -1.2754674400463286, 0.49184661171499777, -11.472717532816317, -17.530689402649369, -29.523444921912187, -36.983418680226812, -91.597351236026796, -144.17841735614732, -486.41083616652156, -239.1204206916959, 139.00893917602821, -7153.1577950265046, -18373.599790964956, -8415.9227315857388, -6467.5546779833858, -5469.6585676007244, -2789.7914675082047, -821.48267137489768, -514.71454200305448, -122.6780822655295, -35.554593402553344, -32.905184819607861, -16.875977506192179, -9.1243948190511883, -4.1802620318744168, 0.78316084097390803, -0.82473624462572925, -6.0277039354546789, -6.8502427898926159, -6.8858593350514123, -14.551844205848809, -8.4592989146599145, -1.9950695133570466, 1.5394495557011576, -9.232834653609892, -11.961754213185406, -20.558561534905806, -38.14482496917136, -57.160869905334089, -157.5554953403844, -411.20082432868492, -110.11930975746139, -463.64281724562954, -1210.9754315912523, -4810.1023052011815, -2624.9192342435695, -4516.897453633137, -3582.982491421491, -2119.7499173636902, -750.23472664477231, -159.86878938364373, -96.805728919101412, -16.935754226078267, -22.178078450833883, -9.0092227225989756, -5.4454852920506616, -2.5268882566736748, -2.6219523498948458, -2.0534180946008638, -6.4643064804236223, -8.7214065300148622, -7.0127031874072934, -7.7847619200438425, -0.78121801903708787, -0.11031060182209244, -3.4318959866990171, -4.568083040130742, -9.3160200641569482, -15.87900618307528, -23.382201868158507, -37.989404730637517, -121.95929165874175, -201.43809047465336, -567.30372690179445, -610.36312853782476, -1937.2376557226703, -2694.0942422163184, -3481.5355975420739, -3026.0617140239533, -2506.4916383888308, -1355.1576691715959, -468.0599091435185, -33.397814851582154, 18.545331481583979, -29.439943085485314, -11.922803368680741, -7.7174579848963036, -2.7888603302094261, -2.0545006330536419, -1.0224301618297007, -2.5290059501700397, -2.6199349314032494, -4.8828731457816774, -5.6140621268617785, -3.6146413255535528, -0.82967484502750599, -1.1631844631411599, -1.1736245693095499, -3.7427284368684024, -6.6178270656423424, -8.8039498431578131, -13.481606634721874, -26.682014936266803, -32.97802138197703, -190.87870662958537, -335.07671606134033, -876.95522185704988, -1470.8308615232113, -2413.1056871868645, -2329.4915082040015, -2151.9265781424592, -1438.5211303616525, -713.08152385953474, -130.56706965452, -28.862997769748436, 1.7115783105395304, -2.3079138134833856, -11.650001060370576, -2.1701895043697319, -1.7033561682904694, 0.11972955037883275, -0.5790790812653609, -0.45369004788794814, -4.0202584980239315, -2.2874964618085922, -4.0439693313887179, -2.7144116941037568, -0.78431497120559035, -0.63377862148075614, -0.83542887465582039, -2.5417481635934216, -3.4497798452119151, -5.2729359146939485, -9.3325337684514853, -2.3480777220919959, -30.998957295773433, -62.717085150656224, -255.55592612696097, -515.55403813953228, -1077.4118984564277, -1959.4321649356718, -996.17063256475433, -957.58296584245431, -646.48124546709357, -264.63237090275328, -80.518340163143705, 1.3577640380308329, -10.209813205700032, -1.6455702447745924, 0.041564105453412992, -2.1114336115237951, 0.094770419949782359, -0.59915948675603581, -0.042806075220647909, -1.4583889440112543, -1.0515624140257636, -2.6242610725724358, -1.9962698899057387, -2.6373580888952279, -0.39414295752688255, -0.80952098820947449, -0.80935504019781357, -1.8315981280862581, -2.3957781219887311, -3.7775973636187947, -1.2762438485839673, -5.8736187047076989, -1.7472058496177199, -39.26171578474986, -103.67045476207605, -221.97901463800724, -486.52939506954147, -770.86385201715837, -324.53401456188737, -340.76561269504333, -198.94197841299811, -116.98390967138687, -32.552002455687223, -2.8647426984892057, 3.4567160839115996, -2.3310052693731942, -0.31982529888503974, 1.0641170511547686, -1.1693860348016079, 0.40700212695667498, -1.0092937918537679, -0.034985154955161232, -1.1746986822405672, -2.2583319261560799, -2.3742700657768196, -2.0999344700147127, -1.3199204785521135, -0.00726121067659493, -0.21997349279604808, -1.6799449140427334, -2.573626149077699, -1.2749029797075579, -2.9722975102588807, 1.1149262389696764, -3.7825574143705132, -8.8112838568342262, -31.380656277665604, -80.815706494855448, -151.2920880811312, -231.73584987382, -71.719340760371239, -68.364029336894532, -82.304975309081328, -39.769136567332623, -12.693902195545155, 1.9842035662706039, -0.48894354077452629, 1.5673786316984977, -1.1528550937233366, -0.047905313676576855, 1.0650111541187497, -1.4670778837513785, 0.90154843827712783, -2.0067122081730173, -1.7180755446076856, -3.3483434682482898, -1.6317774897434336, -3.4708804264384949, -1.4694727348954268, -0.10257790692130256, -0.92889636381571783, -2.5451436559397584, -1.1303995452351283, -2.8871606625355204, -0.49805533537312113, -0.43871934228158149, 0.74909741969065036, 1.439791857975526, -13.026034555561825, -28.484337861014367, -36.895178406765908, -72.231190035838395, -26.809485534889244, -56.942733796520351, -36.280107429422031, -18.099079313675151, -3.2627913287121535, -0.27065475805048173, 1.1511525903295716, -0.1898870363801409, 0.97087220888025372, -1.1326412370424179, 0.19981301766363371, 2.3076802702931332, -2.5498407756566031, -0.55532623625253041, -4.5067864970337066, -3.1791416623515807, -4.4078100962970312, -3.3125592316970569, -0.86117313527739991, -1.5893272599995412, -2.966763176308445, -0.10263295233944174, -3.9090515756474873, -1.1809123553765606, -1.2038275093350199, 0.28624805719871799, 1.8536817132476691, 0.80720029239974944, -5.5769148242308617, -9.876045833403877, -26.746787584056406, -25.156847324745275, -59.858730768373135, -40.909481344220289, -31.301364606284917, -12.992896188265529, -3.3747756869001191, 2.018530777741562, -0.2260612077575776, 0.20594677690592242, -0.32403225688254972, 2.6342781156582364, -0.20787587650621794, 0.020021422684959465, 2.4168167113542753, -5.4711139391067487, -4.0162352275216753, -8.2614925402209369, -5.3597212899808353, -3.5618518868969149, -2.433206189931258, -3.72732750056158, 1.9796458045760836, -5.6194552495050392, -1.3533084788499918, -2.5312603283156982, -0.73577412998862446, 1.0534870856485199, 1.9641802030644013, 2.686394865901931, 0.15179077698100021, -13.505006616733285, -24.652619118640313, -46.540772018331772, -65.573862825648789, -62.198686950727755, -33.367481359773279, -15.462856466374785, 1.2764820376727259, 0.65238351077916601, 0.11426292455840634, -0.28574074744887695, 1.1004477970868616, 1.5327652909312646, 4.9327112002405187, -2.7503236900904393, -3.9754701567757182, -0.83451213573114202, -9.6859551174636032, -6.0006304228248837, -7.1318253263858704, -4.9856424549649869, -8.2198692881497966, 4.4471445589999075, -5.9124192136821829, -1.066228559248251, -4.5320020023541776, -2.2691032318803455, -0.29595929991781228, 0.95069246916243999, 2.9800299945570488, 4.1754888650460389, -3.9368165535394617, -16.752391317324459, -41.141712299851427, -60.643902512124761, -84.343164732157774, -54.074972316673119, -32.147836838432397, -3.8004568077904586, 0.60906370022349199, 0.96326571070502964, 0.12072436644318041, 0.86319547550846831, 1.1644302862121145, 2.3252453178811563, 0.4766448788746544, 4.2895158747096422, -8.0099398507205173, -11.261414242734404, -3.7327404661807368, -6.1601929909303115, -5.7506657339441176, -11.117751544185502, 4.3054115148233869, -8.2116085703478756, 1.5649721654809707, -5.692142411938895, -3.4949086671880489, -2.1697325908161673, -0.69541562648800392, 0.8151347377023449, 3.4913843961972888, 3.7128410928274609, -0.28461904914440361, -14.694115553922865, -40.784171797776878, -76.129097997930202, -42.446544168449137, -35.20072244442639, -7.6849685309209681, -0.86778876706269803, 1.7056687310546401, 0.51974952798739482, 1.1316759112288739, 1.2127800605381189, 2.2221214293211369, 0.8361427470500683, 0.099546606452808759, -3.1066939683116588, 2.4769973579809332, -11.745899626687375, -12.566716735550758, -4.7843722525441121, -8.6040588700645948, 5.3511034027408684, -15.66778198729919, 3.3911987930307137, -8.1259457896856588, -4.7980365887404339, -2.1471667518999764, -2.5087241573260579, -0.86097656871748596, 0.80139543608377761, 2.3927476350849495, 5.6561627225456101, 4.6250195847240709, -10.360873371570062, -32.183766942993408, -40.627648783043085, -17.95302681367091, 6.1859416444601623, 4.4451711191118575, 6.2133312512745986, 3.3587096432927233, 0.75569650762962715, 0.82429958430179118, 1.6770717987294814, 1.4875078542842981, 0.57506461301516931, -1.8616897808321822, -4.2923314886050523, -7.0161307894352376, 4.8526265686569623, -11.625945416074895, -21.07467865045702, 3.1434482955713889, -12.714871655934468, 2.366640700254353, -11.173661544979289, -6.475058123170597, -2.9596627855411386, -2.7630790459355632, -1.4122750319888788, -0.55802289067111654, 0.40509965601619852, 3.0549503122920978, 4.5519407117959005, 5.5044865911271481, 2.884340309618711, -2.0306279174386637, -12.290279126535582, 30.20785901727286, 12.45094729737127, 8.7415961086741216, 10.304484703022888, 4.2310313602871554, 1.8368366318675937, 1.9910666876255574, 0.99156303676388502, 0.31747940339256003, -0.60245605946597469, -1.5054245711483085, -5.2047479791857727, -4.6985425899868174, -6.4406057657264579, -2.4317965202694718, -0.31806110286890099, -34.614374984304249, -0.31806110286891309, -2.431796520269478, -6.440605765726465, -4.6985425899868325, -5.2047479791858065, -1.5054245711483181, -0.60245605946599046, 0.31747940339256003, 0.99156303676388657, 1.9910666876255707, 1.836836631867627, 4.2310313602871847, 10.304484703022929, 8.7415961086741465, 12.450947297371268, -17.953026813669211, -12.290279126534008, -2.0306279174386814, 2.8843403096185996, 5.504486591127181, 4.5519407117958774, 3.0549503122920303, 0.40509965601617365, -0.55802289067113198, -1.4122750319888866, -2.7630790459355659, -2.9596627855411324, -6.4750581231706095, -11.173661544979305, 2.3666407002543774, -12.714871655934495, 3.1434482955713383, -21.074678650457034, -11.625945416074918, 4.852626568656909, -7.0161307894352527, -4.2923314886050816, -1.8616897808321802, 0.57506461301515821, 1.4875078542843145, 1.6770717987294999, 0.82429958430183881, 0.75569650762972518, 3.3587096432928165, 6.2133312512752603, 4.4451711191129393, 6.1859416444606961, -42.446544168447332, -40.62764878304236, -32.183766942992868, -10.360873371569919, 4.6250195847241038, 5.6561627225455622, 2.3927476350849091, 0.80139543608374619, -0.86097656871749839, -2.5087241573260646, -2.1471667518999924, -4.7980365887404339, -8.1259457896856819, 3.3911987930307128, -15.667781987299181, 5.3511034027407849, -8.6040588700645682, -4.7843722525441965, -12.56671673555077, -11.745899626687423, 2.4769973579809226, -3.1066939683116837, 0.09954660645280862, 0.83614274705006209, 2.2221214293211515, 1.2127800605381271, 1.1316759112289154, 0.51974952798746277, 1.7056687310547414, -0.86778876706233132, -7.6849685309204459, -35.200722444424429, -84.343164732156296, -76.12909799792908, -40.784171797776416, -14.694115553922703, -0.28461904914431585, 3.7128410928274769, 3.4913843961972515, 0.81513473770227451, -0.69541562648801736, -2.1697325908161949, -3.4949086671880569, -5.6921424119389146, 1.5649721654809774, -8.2116085703478952, 4.3054115148233585, -11.117751544185527, -5.7506657339441034, -6.1601929909302848, -3.732740466180779, -11.261414242734437, -8.0099398507205191, 4.2895158747096467, 0.47664487887466933, 2.3252453178811465, 1.164430286212123, 0.86319547550848241, 0.12072436644322472, 0.96326571070516387, 0.60906370022364942, -3.8004568077899661, -32.147836838431445, -54.074972316672174, -65.573862825648646, -60.643902512124406, -41.141712299851122, -16.752391317324395, -3.9368165535393809, 4.1754888650460389, 2.9800299945570101, 0.95069246916240213, -0.29595929991782399, -2.2691032318803499, -4.5320020023541936, -1.0662285592482377, -5.9124192136821918, 4.4471445589998728, -8.2198692881497806, -4.9856424549649665, -7.1318253263858535, -6.0006304228248819, -9.685955117463573, -0.83451213573115879, -3.9754701567757316, -2.7503236900904167, 4.9327112002405231, 1.5327652909312637, 1.1004477970868634, -0.28574074744888678, 0.11426292455844969, 0.65238351077926593, 1.2764820376728394, -15.462856466374522, -33.367481359773095, -62.198686950727343, -59.858730768372553, -46.54077201833131, -24.652619118640224, -13.505006616733089, 0.15179077698109764, 2.6863948659019079, 1.9641802030643754, 1.0534870856484704, -0.73577412998863267, -2.5312603283157147, -1.3533084788499781, -5.6194552495050258, 1.979645804576063, -3.7273275005615623, -2.4332061899312447, -3.561851886896878, -5.3597212899808397, -8.2614925402208979, -4.0162352275216939, -5.471113939106738, 2.4168167113542718, 0.020021422684962133, -0.20787587650621156, 2.6342781156582284, -0.32403225688256132, 0.20594677690590416, -0.22606120775752253, 2.01853077774176, -3.3747756868998953, -12.992896188264998, -31.301364606284267, -40.909481344219984, -26.809485534888527, -25.156847324744817, -26.746787584056008, -9.8760458334037811, -5.576914824230828, 0.80720029239978064, 1.8536817132476344, 0.28624805719868845, -1.2038275093350328, -1.1809123553765482, -3.9090515756474855, -0.10263295233946072, -2.9667631763084428, -1.589327259999552, -0.86117313527738326, -3.3125592316970565, -4.4078100962970224, -3.179141662351582, -4.5067864970337235, -0.5553262362525373, -2.5498407756565928, 2.3076802702931301, 0.19981301766362944, -1.1326412370424508, 0.9708722088802425, -0.18988703638015317, 1.1511525903296145, -0.27065475805034434, -3.2627913287119403, -18.099079313674878, -36.280107429421662, -56.94273379651932, -71.719340760368894, -72.231190035836406, -36.895178406764366, -28.484337861013827, -13.026034555561461, 1.4397918579755735, 0.74909741969062116, -0.43871934228165033, -0.49805533537312413, -2.8871606625355364, -1.1303995452351521, -2.5451436559397544, -0.92889636381573193, -0.10257790692130979, -1.4694727348954375, -3.47088042643851, -1.6317774897434372, -3.3483434682483164, -1.7180755446077083, -2.0067122081730231, 0.90154843827713693, -1.4670778837513718, 1.0650111541187297, -0.047905313676639846, -1.1528550937233546, 1.5673786316984972, -0.48894354077444435, 1.9842035662707793, -12.693902195544938, -39.769136567331614, -82.304975309079381, -68.364029336892514, -324.53401456188737, -231.73584987382011, -151.29208808113108, -80.815706494855604, -31.380656277665615, -8.8112838568343115, -3.7825574143705687, 1.1149262389696379, -2.9722975102588807, -1.2749029797076188, -2.5736261490777141, -1.679944914042758, -0.21997349279605258, -0.0072612106766204651, -1.3199204785521295, -2.0999344700147602, -2.3742700657768196, -2.2583319261561177, -1.1746986822405874, -0.034985154955167297, -1.0092937918537661, 0.40700212695667115, -1.169386034801607, 1.0641170511547318, -0.31982529888503974, -2.3310052693731778, 3.4567160839116182, -2.8647426984891329, -32.552002455687209, -116.98390967138671, -198.94197841299811, -340.7656126950431, -996.17063256474341, -770.86385201715302, -486.52939506953675, -221.97901463800537, -103.67045476207502, -39.261715784749725, -1.7472058496176825, -5.8736187047078241, -1.2762438485839995, -3.7775973636188502, -2.3957781219887693, -1.831598128086283, -0.80935504019782156, -0.8095209882094927, -0.39414295752690548, -2.6373580888952821, -1.9962698899057312, -2.6242610725724247, -1.0515624140257607, -1.4583889440112356, -0.042806075220638506, -0.5991594867560418, 0.09477041994976447, -2.1114336115238088, 0.041564105453392161, -1.645570244774569, -10.20981320570001, 1.3577640380311771, -80.518340163142966, -264.63237090274987, -646.481245467088, -957.58296584244442, -2329.4915082039943, -1959.4321649356684, -1077.4118984564245, -515.55403813953228, -255.55592612696057, -62.717085150656416, -30.998957295773568, -2.3480777220922762, -9.3325337684514711, -5.2729359146941093, -3.4497798452119492, -2.5417481635934838, -0.83542887465582316, -0.63377862148080311, -0.78431497120560345, -2.7144116941037488, -4.0439693313887171, -2.2874964618085487, -4.0202584980238978, -0.45369004788789491, -0.57907908126534979, 0.1197295503788481, -1.7033561682904654, -2.1701895043697248, -11.650001060370577, -2.3079138134832218, 1.7115783105395919, -28.862997769747821, -130.56706965451951, -713.08152385953122, -1438.5211303616488, -2151.926578142451, -3481.535597542063, -2413.1056871868605, -1470.8308615232086, -876.95522185705033, -335.07671606133954, -190.87870662958562, -32.978021381977214, -26.682014936266988, -13.48160663472185, -8.8039498431579233, -6.6178270656423885, -3.7427284368684086, -1.1736245693095617, -1.1631844631411714, -0.82967484502748334, -3.6146413255534444, -5.614062126861783, -4.8828731457814465, -2.619934931403141, -2.5290059501698665, -1.0224301618296836, -2.0545006330535864, -2.7888603302093888, -7.7174579848962566, -11.922803368680738, -29.439943085484902, 18.545331481584157, -33.397814851580577, -468.05990914351662, -1355.1576691715877, -2506.491638388823, -3026.0617140239456, -2624.9192342435676, -2694.0942422163216, -1937.2376557226696, -610.36312853782647, -567.30372690179479, -201.43809047465459, -121.9592916587422, -37.989404730638029, -23.382201868158511, -15.879006183075566, -9.3160200641569801, -4.5680830401307739, -3.4318959866990371, -0.11031060182210287, -0.78121801903713106, -7.7847619200437572, -7.0127031874072889, -8.7214065300146117, -6.4643064804234296, -2.0534180946007163, -2.6219523498948099, -2.5268882566736321, -5.4454852920506234, -9.009222722598933, -22.178078450833912, -16.935754226078039, -96.805728919100844, -159.86878938364163, -750.23472664477129, -2119.7499173636857, -3582.9824914214882, -4516.8974536331352, -8415.9227315857224, -4810.1023052011687, -1210.9754315912437, -463.64281724563131, -110.11930975746253, -411.20082432868651, -157.55549534038482, -57.160869905334962, -38.144824969171324, -20.558561534906186, -11.961754213185522, -9.2328346536099755, 1.5394495557011911, -1.9950695133570939, -8.4592989146598381, -14.5518442058491, -6.8858593350514123, -6.8502427898925227, -6.0277039354547091, -0.82473624462553619, 0.7831608409739802, -4.1802620318743058, -9.1243948190510782, -16.875977506192154, -32.905184819607861, -35.55459340255284, -122.67808226552924, -514.71454200305027, -821.48267137489574, -2789.7914675081947, -5469.6585676007144, -6467.5546779833749, -27745.708494118051, -18373.599790964956, -7153.1577950265018, 139.0089391760178, -239.12042069169632, -486.41083616652713, -144.17841735614894, -91.597351236029397, -36.983418680226798, -29.52344492191359, -17.530689402649603, -11.472717532816715, 0.49184661171508715, -1.2754674400467305, -13.244388638951113, -21.283130178012485, -16.161012153790605, 3.4669422259560148, -14.833291452397047, 6.4142604093547071, -7.1882909197807701, 0.36714120063543831, -23.623139151504223, -16.730489448483766, -50.060212982262158, -40.805440061890259, -146.45498278007528, -545.33543865451918, -1748.9561003744159, -4085.0339896290589, -8553.5264674688297, -22841.42084500867, -17213.595236981979, -27817.100568112102, -10882.302955904914, -2806.7151144576032, 113.11650603552238, -714.3011765913102, -258.32278440436545, -84.034753639410752, -64.314813850969756, -32.473901904667066, -16.600635746256838, 0.34733716754136956, -1.7416101263050108, -17.401343902608698, -22.272265924680649, -14.131264529805808, -19.629747734378629, 3.5205960317556224, -14.232799652319452, -14.472211987615371, -7.2952697383626051, -2.1850531713375001, -11.025047422886134, -26.960578056534132, -39.308430893651277, -117.89522553299832, -106.61462896985047, -1120.3666800727583, -1103.8692252741987, -5794.1219231082987, -10829.417860945698, 544.0730266990613], \"imag\": [0.0, 39515.399789254865, -15382.502646592808, -2918.5213899411633, 1191.3150820979915, -345.80526987183259, -91.963497561164317, -108.06830259743781, -23.431327605037779, -16.610810822958811, -2.2742971526945692, -21.94540337447156, -21.272420402577179, -19.057735286082725, 52.376313120912741, 8.8521975026144215, 0.0, -8.8521975026153612, -52.376313120912044, 19.05773528608244, 21.272420402577229, 21.945403374471546, 2.2742971526945164, 16.61081082295847, 23.431327605037779, 108.06830259743377, 91.963497561167031, 345.80526987182992, -1191.3150820979911, 2918.521389941166, 15382.502646592799, -39515.399789254865, 16946.371225111547, 11272.400870696511, -1841.1630655848539, -1171.8258105148211, 109.26740577843201, 109.43221584454041, -206.10314812122442, -42.28539321936541, -65.249140172269108, -8.1960517939269071, -25.365956236318521, -12.488977779350739, -20.777136166915728, 10.939736173955986, 13.738393384077787, 18.982014759380824, -12.446635345723246, -8.8305069728752752, -14.016932746731957, 10.847407040619599, 18.949463773817904, 9.5491377266946333, 9.9160507928571491, 10.925693066643545, 29.597688207921799, 110.70270321520633, 119.64570653889598, -28.406380421737747, -832.38513354395832, 3868.3607546707453, 4625.1554139998552, 1299.266384884336, 11955.369188695569, -346.60702359457474, 2363.0865643328202, 202.32180136864196, -295.01076934839688, 277.44131247872377, -208.25011765184485, -68.536452109290167, -63.125416501511275, -30.589238972650307, -20.382558491276782, -12.902690844348575, 1.0182743702449766, 2.2874141051372452, 14.546101055958879, -1.6150967690531892, 0.87386354462209248, -13.38677146472326, 17.407635810762027, -0.60680891034428563, 12.950261495215786, -0.86756998254740836, 13.062832664150156, -2.136096668655318, 35.880437410281019, 66.543583791324124, 106.41042136702396, -154.61175360170367, -142.43138300706809, -204.04622542072212, 637.22651951043269, 14506.214536688893, 2087.241286517743, 2934.8250858413794, -540.57641351250766, 271.57679130866723, 537.49064424335052, 71.610686309506633, -82.566517160157844, -74.489552074506761, -57.142723569279489, -25.254222647826957, -12.544755138678799, -6.7708773337384622, -0.20770764759918051, 1.1194026551973495, 3.6890839097334878, -0.20461611038051675, -5.3737401851528386, -2.2636764639022453, 4.9832600695280087, 10.10754418440443, 2.544597152813191, 5.0447569422202223, 2.8189903732027388, 2.9920185974422946, 11.529259915073515, 53.348281783168488, 50.577306165813702, 119.57179721034167, -786.94393395792213, -901.86972095078409, 1074.2990124084633, -676.63432998511303, -1814.4894639161919, -1058.8873901892568, 349.63255334068964, 268.2484621242063, 380.4257804868011, 97.912476061205965, -71.661879904778658, -72.736940205390937, -37.286147332183255, -18.720186517652358, -9.5628328869678363, -8.2634536416369482, -0.19099280196160889, 0.28567330333833429, 0.071309220847330906, 1.775656575203522, 2.1386941287610384, -1.0231985430634363, 2.4480270844924137, 1.9878096211738889, 4.1535160740617325, 3.5521022242715827, 3.6019889835361654, -0.38778650675348675, 4.5934633035837322, 12.369503115173785, 94.400929285346393, -77.039516694541632, -317.96189631496532, -464.93982303098932, -1928.5847150696218, -1707.435501473529, -1583.8824730375936, -833.14970460709912, -242.65732454029356, 317.34459246185179, 69.371971565542168, -13.453603503282046, -58.678662168810511, -40.697925231357267, -20.16679423742438, -13.090865763493372, -7.6639325468155182, -3.9818184076004774, -1.1480426683317846, 3.4782462601712654, 3.3535274581593777, 1.1304420427842019, -0.78798091056569108, 1.3645618319176871, -1.2482103302418359, 2.6548043613808709, 2.0455422971726147, 3.3794759874708187, 0.28270713586437868, -0.67396364813071052, -2.4299863370655714, 20.048308524208917, 2.7323622379310764, 23.350930435926227, 19.428895667387472, -542.55543458513841, -969.72646934413422, -1881.6935115818319, -426.42488803140975, -203.12933548649579, 221.2759941924873, 75.498646737827528, 81.527654709232138, -23.228148927519229, -35.095892631083601, -18.113211298120703, -10.84781416147373, -7.2190125620904571, -4.6279710639736358, -2.4591204313834965, 0.58454842364750592, 0.9547463106026568, 2.4151219203224654, 0.35567626693527166, -0.34443735246553581, 0.10021534895843374, 0.62975751586612239, 0.075739057981468363, 2.5606009702294732, 0.33652577635989583, 1.0967346902818458, -2.0000864020848046, 1.451434335785166, -7.1043203483245918, 10.682010714917043, 63.119371696969466, -0.21915489532378957, -18.829394319190524, -151.38668525810633, -53.557614725234764, 319.98109193688521, 339.65571159114432, 137.34002448547074, 89.166061674211335, 5.5395407010458548, 3.1394961579749192, -15.790153056071546, -10.068399035154068, -5.990189510359599, -3.8184783724455591, -3.031311871551015, -1.7050468427375405, 0.29997994657424726, 1.0820090369221063, 1.186145834536469, 1.1035985643781976, -0.026686439684276222, -0.021861987241408937, -0.71069133238487792, 1.5408441736495715, 0.88964240698419117, 1.3226298476418663, -0.31341792844049038, 0.36542819178090652, -6.2831724147446009, -1.5019641274621849, 13.705577255286178, 14.08988446983488, 43.376064565045787, 54.204646228028693, 132.60719521227122, 62.432091745032416, 219.86853407025291, 133.19971898528303, 106.65962198554573, 32.509510578136677, -0.32173120932219279, -1.0472919151881939, 3.0400482541159932, -2.1373375769283371, -3.730023177462626, -3.658884080605465, -1.7579654575817145, -1.4081716233776314, 0.53847505259675243, 0.97164442609396484, 0.99557444173589427, 0.11126643861839057, 0.68343802732828218, -1.8968331338371984, 1.2370080984335854, 0.24616862215977253, 1.6488725749132858, 0.51751999590405229, 1.1293193043526017, -2.440127533596657, -2.1096176983280075, 0.86862341139232857, -3.2906850406637935, 10.529105330387669, 21.528607110729595, 53.864359931260871, 77.645971701549371, 219.35042572397626, 56.646725304489401, 72.597133152544643, 25.283726226154087, 9.5916945360518575, 3.5131066387109651, 7.8353712095885921, 3.7982495059531924, -0.1320379920173739, -2.6872144914167868, -3.9932995411602161, -3.2496097582258021, 0.34753129477634409, 0.51108563039490118, 1.5779290838292743, -0.32098662744154494, 0.85050436376706862, -0.95269533500567993, 1.2514468795435802, -0.80232514327112969, 0.9402998385797201, 0.083484537520043395, 2.9970442493787712, -1.3537504507858638, -0.49606931853204594, -0.40634793694041288, -3.2049709482452999, -0.90733505109423707, 2.4367446291982722, 14.425788131967863, 11.285893196605656, 41.383231407558732, 26.64930600456886, 3.49019745229235, -2.7278278900775033, -0.6780497768719117, 5.1972517053508067, 13.315592278460391, 8.5655340270495799, 2.7986942524720009, -1.3188307478897958, -2.9560147101356677, -3.5039625138893249, -3.2351264422424442, -1.7837191938553947, 4.1370294214229899, -0.48575889336608402, 1.5705428299533406, -0.28712766434912351, 3.0263722138472242, -1.2120159426024513, 2.3578685311613299, -0.57595981339550073, 5.0023110313506045, -1.3965343408401143, 0.57130018359553258, 0.97601539997779907, -2.5856117766371072, -1.4572886030272592, -1.697304402058907, 2.1030121366448049, -0.062995146217583023, 4.9612937854964008, -0.301351161950073, 9.1580358876592047, -26.774160253651129, -14.352442298363405, -1.3280628610826339, 14.662722831107068, 13.065714024917916, 9.0142686843581057, 2.3156698002103213, -2.1494090398895276, -3.4369058394752816, -3.2885833247038136, -1.5589303641797962, -1.2624013759488528, -1.9675974847606275, 6.6808538974877765, -1.9845455926326385, 5.8520209082315047, -0.64649466936933941, 3.7090325345277484, -1.4383189901623872, 7.6358217658181289, -2.5011370399824613, 2.0288771570791524, 3.3870661540364408, -2.1726948090167277, -1.6227282885568253, -2.3401345171732064, -1.0784728701462345, -2.329913042321786, 1.6766227476276099, -5.5208279800184377, -13.304914803323909, -34.683237345909106, -16.2208922311743, -7.5614574111833583, 14.803696771258469, 15.579335900760762, 15.161631552742872, 8.4660409590375174, 1.9742581617985508, -2.2318082441740326, -3.1677451000476946, -2.7136257844502993, -2.4663578849843404, 2.1470642674041458, -0.80807516468244989, -6.8039934755458935, 11.462761097859508, -2.3200072133134322, 9.6476195054900042, -0.58323258923086063, 10.466810618341768, -7.3966372849294499, 4.629755222962074, 7.8499060069144697, -1.2532724460122664, -0.71383693570895246, -3.0356422051110532, -1.9171318821546592, -3.2905248775997, 1.1638954652799918, -0.8003122215164804, -7.6686022187651925, -13.379436000591463, -2.0784151782651223, 18.753674553162941, 37.596939514973172, 28.201887912811504, 26.441177038828386, 17.313699289624569, 8.2605837012813357, 1.9157665349814501, -1.0360449197814665, -2.460835808457071, -2.9435912594789997, -0.73745892985465067, -0.80698208098757895, 1.3512050433752707, -2.4806623635392717, -10.931358459008862, 20.399475046734903, -0.93914753929729033, 15.633586230850142, -11.808527677086202, 3.7955244266493091, 11.440683264496995, 0.22625003249094855, 2.3910143241324033, -1.5433230899620785, -1.7524971656611896, -3.4392335008624597, -1.2102890230410412, -1.1333111335531953, -0.86689054652400055, -0.77102037498198228, 5.869418392294464, -6.6911708498309208, 60.884710948918006, 43.621563233816303, 43.489599527484941, 33.141784821271486, 18.338861076357606, 7.7096141949396086, 3.1020965354201242, -0.33651454595896624, -1.858665713174497, -1.559439785993801, -1.7180049365163976, -0.49470837698954684, -5.7499783777067037, 1.2816063498557866, -1.6438131382345036, -14.80449956699707, 30.383248800411909, -20.687082737158004, 6.4291237134149926, 13.719178799652914, -0.15202331710012035, 5.6708331746907428, 1.1091130063870853, 0.43083164420390874, -2.423604198850752, -1.2614169037455483, -3.1633275417854718, -2.5428479485652051, -1.0621152637056996, 7.4921468465754772, 13.826120615216594, 48.56895003285198, 43.655937980459306, 56.143788442077074, 39.839822974553684, 28.907966432346075, 17.226166967005444, 9.493352687280801, 2.1248307248495761, -0.10304029106189502, -0.73643011249607004, -0.68086203692422775, -1.5726895782452095, -2.38329292549688, -6.3654622280486342, -12.648471231222512, 2.6502987300644998, 9.1941379366153466, -33.28553680715055, 17.791788634489134, 16.331392880531652, -1.0332061538290742, 9.6376857080971341, 4.1689669632335153, 3.4112249849533103, -0.63064111926197686, 0.028356847121888181, -1.1968584419289052, -3.3957285823190806, -4.7459408986565164, -4.790016252397657, -5.1593354130915703, 13.957717184896774, 20.367299127198688, 0.0, -4.5388798707327584, 12.10851784859719, 15.801052170121357, 15.786196904526062, 6.4645339091427658, 2.6357128260629894, 0.48128762074186304, -0.08159176932681525, -1.1399410088753745, -0.93916966756638098, -5.4695359499377414, -8.4733779831544798, -6.8332707948903639, -5.8759130146162706, -8.1552266379296245, 0.0, 8.1552266379295908, 5.8759130146162661, 6.8332707948903488, 8.4733779831544869, 5.4695359499377316, 0.93916966756637688, 1.1399410088753721, 0.08159176932681525, -0.48128762074185355, -2.635712826062981, -6.4645339091427667, -15.786196904526072, -15.801052170121331, -12.108517848597181, 4.5388798707327416, -43.655937980456407, -20.367299127197448, -13.957717184895019, 5.1593354130924185, 4.7900162523979217, 4.7459408986567313, 3.395728582319133, 1.1968584419289152, -0.028356847121888983, 0.63064111926197186, -3.4112249849533058, -4.1689669632334958, -9.6376857080971128, 1.0332061538290882, -16.331392880531649, -17.79178863448908, 33.285536807150621, -9.1941379366153146, -2.6502987300644807, 12.648471231222583, 6.3654622280486368, 2.3832929254968982, 1.5726895782452166, 0.68086203692425595, 0.73643011249607926, 0.10304029106193066, -2.1248307248495362, -9.4933526872806269, -17.226166967005291, -28.907966432345297, -39.839822974551964, -56.143788442073777, -60.884710948915583, -48.568950032850019, -13.82612061521586, -7.4921468465751166, 1.0621152637059226, 2.5428479485653219, 3.1633275417855051, 1.261416903745556, 2.4236041988507613, -0.43083164420392467, -1.1091130063870698, -5.6708331746907525, 0.15202331710012659, -13.719178799652925, -6.4291237134149712, 20.687082737158036, -30.383248800411859, 14.804499566997148, 1.6438131382345447, -1.2816063498557717, 5.7499783777067242, 0.49470837698955733, 1.7180049365164254, 1.5594397859938318, 1.8586657131745035, 0.33651454595900265, -3.1020965354201109, -7.7096141949395376, -18.33886107635751, -33.141784821271301, -43.48959952748401, -43.621563233814584, -18.753674553161851, 6.6911708498312086, -5.8694183922938254, 0.77102037498232001, 0.86689054652414343, 1.1333111335533379, 1.2102890230411023, 3.4392335008624833, 1.7524971656611932, 1.5433230899620796, -2.3910143241323984, -0.22625003249093578, -11.440683264497009, -3.7955244266492731, 11.808527677086207, -15.633586230850069, 0.93914753929731287, -20.399475046734821, 10.931358459008916, 2.4806623635393117, -1.3512050433752816, 0.80698208098763236, 0.73745892985467021, 2.943591259479049, 2.4608358084570767, 1.0360449197814969, -1.9157665349814337, -8.2605837012812007, -17.313699289624388, -26.441177038827938, -28.201887912810978, -37.59693951497237, 16.220892231174151, 2.0784151782650429, 13.379436000591378, 7.6686022187652325, 0.80031222151651993, -1.1638954652799158, 3.290524877599744, 1.917131882154679, 3.0356422051110541, 0.71383693570894702, 1.2532724460122711, -7.849906006914436, -4.6297552229620669, 7.3966372849294793, -10.466810618341761, 0.58323258923092358, -9.6476195054900042, 2.3200072133134997, -11.462761097859458, 6.8039934755459344, 0.80807516468246154, -2.1470642674041431, 2.4663578849843657, 2.7136257844503273, 3.1677451000476933, 2.2318082441740374, -1.9742581617985304, -8.4660409590374517, -15.161631552742712, -15.579335900760643, -14.803696771258227, 7.5614574111833424, 26.774160253651477, 34.683237345909006, 13.304914803324097, 5.5208279800184936, -1.6766227476275497, 2.3299130423218712, 1.078472870146282, 2.3401345171732237, 1.6227282885568277, 2.1726948090167162, -3.3870661540364337, -2.0288771570791524, 2.5011370399824764, -7.6358217658181076, 1.4383189901624107, -3.7090325345277098, 0.64649466936933497, -5.8520209082314834, 1.984545592632657, -6.6808538974877711, 1.9675974847606519, 1.2624013759488664, 1.5589303641798025, 3.2885833247038483, 3.4369058394752718, 2.1494090398895325, -2.3156698002103084, -9.0142686843579654, -13.06571402491778, -14.662722831106908, 1.3280628610827629, 14.352442298363767, -3.4901974522911301, -9.158035887658194, 0.30135116195024236, -4.9612937854963866, 0.062995146217542555, -2.1030121366447649, 1.6973044020589363, 1.457288603027268, 2.5856117766371063, -0.97601539997780706, -0.57130018359554458, 1.396534340840117, -5.0023110313506107, 0.5759598133955085, -2.357868531161305, 1.2120159426024788, -3.0263722138472202, 0.28712766434913656, -1.5705428299533217, 0.48575889336609929, -4.1370294214229943, 1.783719193855416, 3.2351264422424548, 3.5039625138893205, 2.956014710135662, 1.3188307478897938, -2.7986942524719765, -8.5655340270494893, -13.315592278460258, -5.1972517053507898, 0.67804977687200962, 2.7278278900777337, -56.64672530448825, -26.649306004568476, -41.383231407558036, -11.285893196605604, -14.42578813196792, -2.4367446291981882, 0.90733505109427226, 3.2049709482452906, 0.40634793694041338, 0.49606931853200609, 1.3537504507858567, -2.9970442493787934, -0.083484537520044699, -0.94029983857969957, 0.80232514327114979, -1.2514468795435723, 0.95269533500567261, -0.85050436376704475, 0.32098662744156231, -1.5779290838292681, -0.51108563039488553, -0.3475312947763517, 3.2496097582258234, 3.9932995411602126, 2.687214491416765, 0.13203799201742056, -3.7982495059531578, -7.8353712095884145, -3.5131066387109939, -9.5916945360520085, -25.283726226154414, -72.597133152543805, -219.86853407025291, -219.35042572397646, -77.645971701549428, -53.864359931260992, -21.52860711072962, -10.52910533038772, 3.2906850406638011, -0.86862341139231525, 2.1096176983280075, 2.4401275335966615, -1.1293193043526162, -0.5175199959040564, -1.6488725749132833, -0.24616862215974425, -1.2370080984335483, 1.8968331338372646, -0.68343802732828218, -0.11126643861832354, -0.99557444173586918, -0.97164442609393387, -0.53847505259674655, 1.408171623377654, 1.757965457581725, 3.6588840806054854, 3.730023177462626, 2.1373375769283727, -3.0400482541159497, 1.0472919151882829, 0.32173120932219762, -32.509510578136599, -106.65962198554575, -133.199718985283, -319.98109193688754, -62.432091745036324, -132.60719521227176, -54.20464622802902, -43.376064565046129, -14.089884469834875, -13.705577255286062, 1.5019641274622118, 6.2831724147445849, -0.36542819178094682, 0.31341792844047633, -1.3226298476418761, -0.88964240698418728, -1.5408441736495315, 0.71069133238493809, 0.021861987241514846, 0.026686439684265401, -1.1035985643780957, -1.1861458345364231, -1.082009036922065, -0.29997994657423205, 1.7050468427375622, 3.031311871551031, 3.818478372445528, 5.9901895103595697, 10.068399035154069, 15.790153056071421, -3.1394961579745826, -5.539540701046052, -89.166061674211662, -137.34002448547281, -339.65571159114575, 426.42488803140685, 53.557614725234323, 151.38668525810476, 18.829394319190286, 0.21915489532353391, -63.119371696969402, -10.682010714916952, 7.1043203483248183, -1.4514343357851665, 2.0000864020848317, -1.0967346902818478, -0.33652577635987613, -2.5606009702294568, -0.075739057981359575, -0.6297575158660037, -0.1002153489582, 0.34443735246552043, -0.35567626693504045, -2.4151219203224019, -0.95474631060256077, -0.58454842364747928, 2.4591204313835524, 4.6279710639736518, 7.2190125620904322, 10.8478141614737, 18.113211298120788, 35.095892631083665, 23.228148927519459, -81.527654709232067, -75.498646737828622, -221.27599419248904, 203.12933548649244, 1583.8824730375886, 1881.6935115818235, 969.72646934413342, 542.55543458513785, -19.428895667388197, -23.350930435925818, -2.7323622379307726, -20.048308524208668, 2.4299863370655803, 0.67396364813076437, -0.28270713586437829, -3.3794759874707645, -2.0455422971725761, -2.6548043613806773, 1.248210330242034, -1.3645618319173671, 0.78798091056567598, -1.130442042783935, -3.3535274581592822, -3.4782462601711517, 1.1480426683318268, 3.9818184076005192, 7.6639325468155093, 13.090865763493181, 20.166794237424288, 40.697925231356948, 58.678662168810511, 13.453603503282435, -69.371971565542452, -317.34459246185418, 242.65732454028887, 833.14970460709446, 1814.4894639161919, 1707.4355014735293, 1928.5847150696216, 464.93982303099165, 317.96189631496537, 77.039516694542414, -94.400929285346379, -12.369503115173439, -4.5934633035837242, 0.38778650675346871, -3.6019889835361467, -3.5521022242715157, -4.1535160740616579, -1.9878096211735969, -2.4480270844921423, 1.0231985430638744, -2.1386941287610495, -1.7756565752032289, -0.071309220847206922, -0.28567330333819857, 0.19099280196170093, 8.2634536416369908, 9.5628328869678718, 18.720186517652159, 37.286147332183262, 72.736940205390795, 71.661879904778388, -97.912476061205524, -380.4257804868011, -268.24846212420823, -349.63255334068992, 1058.8873901892528, -2087.2412865177334, 676.63432998511416, -1074.2990124084556, 901.86972095078841, 786.94393395792224, -119.57179721034137, -50.577306165813212, -53.34828178316841, -11.529259915073451, -2.9920185974423683, -2.8189903732028481, -5.0447569422201788, -2.5445971528130604, -10.107544184404102, -4.9832600695276215, 2.2636764639027978, 5.3737401851528253, 0.20461611038107308, -3.6890839097334074, -1.119402655197085, 0.20770764759927202, 6.7708773337385892, 12.544755138678777, 25.254222647826818, 57.14272356927944, 74.489552074506946, 82.566517160157588, -71.610686309506534, -537.49064424335074, -271.57679130866813, 540.57641351250493, -2934.8250858413712, -11955.369188695569, -14506.214536688902, -637.22651951043315, 204.04622542072232, 142.43138300706894, 154.61175360170483, -106.41042136702355, -66.543583791323357, -35.880437410281012, 2.1360966686551617, -13.062832664150186, 0.86756998254746465, -12.950261495215663, 0.6068089103450538, -17.40763581076148, 13.386771464725289, -0.87386354462209659, 1.6150967690552112, -14.546101055958459, -2.2874141051365076, -1.0182743702449171, 12.902690844348964, 20.382558491276768, 30.589238972650698, 63.125416501511289, 68.536452109292355, 208.25011765184536, -277.4413124787215, 295.01076934839597, -202.32180136863923, -2363.0865643328207, 346.60702359456963, -16946.371225111554, -1299.266384884367, -4625.1554139998561, -3868.3607546707453, 832.38513354395968, 28.40638042173725, -119.64570653889508, -110.70270321520742, -29.597688207921749, -10.925693066643381, -9.9160507928571686, -9.5491377266944308, -18.949463773817815, -10.847407040619126, 14.016932746732627, 8.8305069728758134, 12.446635345723296, -18.982014759378298, -13.73839338407706, -10.939736173955323, 20.777136166915735, 12.48897777935125, 25.365956236318532, 8.1960517939270616, 65.249140172269151, 42.285393219366988, 206.10314812122587, -109.43221584453876, -109.26740577843286, 1171.8258105148195, 1841.1630655848473, -11272.400870696491]}};\n\nvar right_eye_filter = {\"real\": [1.8229079259010603, 0.097810498648582461, -0.55840092137248587, -0.99970462842356578, 0.18757876559092043, -0.81617694863114465, -0.17457078018685562, 0.13822182613073089, -0.13830885288846723, 0.14088352498892928, -0.11242245121823281, 0.64190144530750459, -0.18081689212517704, 0.84757445423403044, -2.0367692338977426, 2.3450651085370726, -3.2227771639624789, 2.3450651085369945, -2.0367692338977101, 0.84757445423403854, -0.18081689212518082, 0.64190144530750537, -0.11242245121823641, 0.14088352498894169, -0.13830885288846723, 0.13822182613073003, -0.17457078018684977, -0.81617694863113666, 0.18757876559091927, -0.99970462842356267, -0.55840092137248509, 0.097810498648581323, -1.0960340088024074, -1.9119199452512301, -2.4095702665388479, -0.55162352804953241, -0.50505328014021589, -1.3068505835636635, -0.49437187443975589, 0.23127204626685588, 0.043350794355039197, -0.071787406154436809, 0.070854449837205943, 0.17221102955705567, 0.44602122877614064, 0.074148205591900399, -0.015611524439393865, -0.79896724757292914, -0.67155961060437053, -0.49375784053273253, 0.028167647498424205, -0.3191891366103583, 0.53582170174408217, 0.20183473326047152, 0.12710467168208503, -0.071400263514192097, 0.074560604448017792, -0.12451483496807111, 0.051358135035693774, -0.77282398113384443, -0.42160647485916963, -1.1311602269894514, -1.4625324828122208, 0.3337871926813808, -1.77011609742092, -1.4302518240108344, -3.0428213499062116, -0.60631225487833551, -0.13683987631719793, -2.3692424085383519, -0.34105804260324346, -0.25969657852057992, 0.23610433796619859, -0.27685168579683173, 0.16986402710259335, 0.073612585805396993, 0.57704911017089122, -0.059867579479423505, 0.51680219528175042, -1.0666730319382505, -0.0056552094670686828, -0.75809939060745812, -0.064701320250044561, -0.19832318162238824, 0.37732986906226257, 0.20777584924550152, 0.15451076629740465, -0.013991851319401968, 0.13841341497021592, -0.086883949036928532, 0.25261423619714551, -1.1991385138433881, -1.9867837341406693, -2.275962773839737, -3.1079150257531585, -2.3995834975192567, -2.2937692343725722, -2.1872173045799017, -1.3988308931230504, -2.2073957813815439, -1.9667941627002865, -1.6748432066635108, -0.92650772032564344, -0.054197237250052703, -0.18026213329416008, -0.15232124758200827, -0.016555865669302033, 0.31289505893870784, 0.42806542968274719, 0.23124350286854853, -0.087366382764607439, -0.12552132795947232, -0.12547908619418155, -0.38089709050886683, -0.28444076658768042, -0.11944152964360766, 0.12056136689031131, 0.21189843131890268, 0.16581598470154221, 0.13376820638890077, 0.22205496825803592, 0.15120100371874812, 0.12380717441381156, -1.2352596784322261, -2.2222759116849211, -3.3782856809989692, -3.415076124219421, -2.7282977589825297, -1.5576789730825455, -1.6478932560447972, -2.067907968457094, -2.004290735457912, -2.6427456963680775, -1.9309474679838621, -0.16864865516592528, -0.22642518078963322, -0.13321306237600422, -0.20692971953006373, -0.068344938706069003, 0.14493915164047724, 0.46505832474821007, 0.32789481378377733, 0.1852927254910838, -0.1356638873386786, -0.03585192275390197, -0.17203834043005656, -0.15954900238018477, -0.059581713131431221, -0.017228379259871054, 0.12402459410135006, 0.1524538089963059, 0.16271946063708961, 0.24817234249560427, 0.26053579199245763, -0.04769125558408293, -0.81459993031792033, -2.0740660744196808, -3.1544891598954261, -2.9212825837849565, -2.4077419089431702, -1.6411629435379833, -1.576697627349694, -1.8007661961299257, -2.0001525985045707, -1.5107274159689619, -1.2839600483166405, -0.63196711118813498, 0.31071574064221719, -0.21370915949408273, -0.16393119308951343, -0.097481704015839707, 0.13767875532837173, 0.23695911940697742, 0.36158774196732829, -0.00066962538216623158, -0.1026502520704758, -0.18176695609293456, -0.059120611570986824, -0.13702193484548986, -0.0073538013157976303, 0.020281061259494877, 0.15032501459982059, 0.16876214929227357, 0.18780650312631536, 0.16308782299108887, 0.18583847563977354, 0.44907296092364651, -0.020800703185301726, -1.4297091333258476, -2.4259185480628145, -2.4053777736536626, -1.9821307035675879, -1.3372642957080885, -1.2989780551182537, -1.3731553217305845, -1.2269479805895975, -1.2032897772528626, -0.22206046284030648, -0.18415548289109809, -0.23415549346578352, 0.077936325689887453, -0.21633114300736572, -0.059449722211757941, 0.013318329293146938, 0.28775437300883983, 0.21963323601338633, 0.16649953505637383, -0.18974789333555656, -0.17379580132236441, -0.23416130311702454, -0.13478379984035538, -0.13112027137758978, 0.033522350558872455, 0.13259733500476653, 0.171380750952115, 0.15737574769334917, 0.092477162456605533, 0.13448891283084696, 0.41161459424817443, 0.35609170613712005, -0.55316449850203808, -1.540851379466907, -1.8005308506197801, -1.5719273509294158, -0.94040577953316051, -0.83899416480020927, -0.77336416928591256, -0.66562411016509948, -0.4002640865408188, -0.36750971454913561, 0.2414435659750552, -0.065677188177910795, -0.21341675767851534, -0.041369287190265204, -0.087404842921799578, 0.04460147122538273, 0.19583406251777175, 0.1830038441344799, 0.012219595757112435, -0.034593273427629516, -0.14926486203867156, -0.036665364495836496, -0.1306231554860259, -0.086381624051938985, 0.0020423415177502173, 0.11239290885891448, 0.12781279786870536, 0.10954302373131516, 0.14996801038078228, 0.12965098836907352, 0.14324588543961356, 0.0567484033157079, -0.079342592710004017, -0.77145898274835445, -1.1705860882999304, -1.0754357146023004, -0.5463269466436349, -0.37732231762995055, -0.29185933229148303, -0.18245346577017127, -0.15252816280103537, 0.00992307413149221, -0.05334501261419268, 0.10643359538216246, -0.069635302172998029, -0.20853401810086858, 0.03871878333386132, 0.024793140061197767, 0.22215018549405419, 0.19090693911120471, 0.13458393481660855, -0.1226120784542075, -0.060406846903667433, -0.083060383383984554, -0.016925686434954099, -0.033352938195947639, 0.056474422402956102, 0.04873056181166667, 0.092098221631537164, 0.13542751998114597, 0.15540921558269635, 0.10094403852684107, 0.050489672984821425, 0.089840998861512991, 0.018445471788018183, -0.44280324831238471, -0.64559475523542686, -0.64123409592876457, -0.25571779361731761, -0.15489773108593363, -0.10375533557574061, -0.074018947274090252, -0.074021765277388324, -0.034956034554291714, 0.065331700319185393, -0.079299771847393716, 0.035725424097319471, -0.10252861876832269, -0.22107962950770202, 0.20755848067860572, 0.23157078159613848, 0.34013467279608883, 0.23914223921471078, 0.043591964044129211, -0.20186945117744784, 0.04172561648658725, -0.038784831650455286, 0.076248151019351923, -0.060276976551200255, -0.0031358189183758184, 0.13054366560393055, 0.16122088670834137, 0.12129220423951546, 0.064624059271846127, 0.063153633523538075, 0.036868954773612302, 0.025599835220982206, -0.17872521900892777, -0.37577894082797708, -0.33418602947194676, -0.19087946198724595, -0.092430559387195924, -0.15843188266072916, -0.1178716916883143, -0.079832857077627425, -0.038455609721169501, 0.015668866487966955, 0.0052656766019976578, -0.12562510603385343, -0.024970842739258457, -0.030574039563531708, -0.21969881405226874, 0.59191387060782108, 0.39965780946904006, 0.22624763974293111, 0.077143781693831126, 0.078542516808501189, -0.0038697706067326258, 0.21858339549378, 0.083870133819846815, -0.19149929243694441, 0.053673315180545467, 0.22201073984886688, 0.16922848807595664, 0.12511007660405662, 0.095111634855384236, 0.084195395624058103, 0.010195208908487656, -0.016589123313681509, -0.076922699191606214, -0.17023093289451025, -0.26998035777525775, -0.28189859430096476, -0.32749231042729776, -0.240474927671948, -0.27714150491609907, -0.16857870511456344, -0.056310601502134704, 0.026291702225850644, -0.028508101274427284, -0.066307061790986485, -0.27187198211633473, 0.066219257946262391, 0.32825613521942065, -0.21303758386300781, 1.1917438602108388, 0.2807025357241521, 0.23447144426975483, 0.16511529097099151, 0.40113579910945835, 0.017152293761210982, -0.1450564820739392, 0.13833755803781553, 0.2361453534315919, 0.16033553043559276, 0.17442784770871, 0.17988585089228476, 0.143828955260344, 0.07132752932041192, 0.016244981011210025, -0.013577696292888701, -0.024045478766089354, -0.11184718959298219, -0.14666574805211069, 0.0080876817899727359, -0.16842937423863127, -0.43543489379944889, -0.29975286851709859, -0.22753898297998879, -0.069036032916579657, 0.014977564920406507, -0.020420877906038481, -0.13524198281736244, -0.15739380447541659, -0.33401260934309918, 0.46815371603113554, 0.93021729768322625, -0.26733338229185055, 1.4166629302294091, 0.60664479608939625, 0.3603810860087503, 0.4605515924213614, -0.32071019427276837, 0.15916183580862947, 0.55142162929110317, 0.20419289205444074, 0.051921880744650394, 0.24679565757292954, 0.2706202610478356, 0.15590400545853877, 0.081859441051199647, -0.040980231107277158, 0.019596242113331462, 0.094364427919773758, 0.065278519802775978, -0.029838116901178446, 0.15435464918439099, -0.039386655944161249, -0.077796406016204619, -0.28158476919608044, -0.033110128022724852, 0.018548614200940845, 0.067046107651037731, -0.044245201781535203, -0.1525534131110006, -0.22929077462390082, -0.085302710712388263, -0.049302393683332231, 0.85744368463127818, 1.8448220136861364, -0.68744556831975012, 1.810880881855317, 0.66237039703709566, -0.31567909429421087, 0.83232217907475781, 0.97863365922997991, 0.30994126117364096, -0.041163173314528664, 0.17633262873947353, 0.23161854928102976, 0.25087704366702551, 0.19868696729956423, 0.093569887694449877, 0.032362324442922322, -0.0027507666136337679, 0.21821986304703905, 0.37880734420129814, 0.40096920495374666, 0.93561154193066887, 0.61326039955329958, 0.1638528799494483, 0.1009541629695858, 0.056601591846233243, 0.15561323638878471, 0.073000292812971587, -0.0055442453146915694, -0.13817032242271102, -0.11770539535407684, -0.096245457278447424, 0.46442894125096079, 0.45587938373772585, 1.3432089992982477, 2.5059762271849535, -0.93829697639874887, 0.6492144586928863, 0.79782532034480069, 1.3025551528258366, 0.94174974100732234, 0.099921469659734793, 0.28712786266920659, 0.15853680079243379, 0.130717335778855, 0.17042917695126153, 0.19986443324539621, 0.13725228360851915, 0.029723534135295476, 0.098143635338702864, 0.19047751491127032, 0.49335337973435212, 0.78089304412099847, 0.29686587428828037, 0.38131881367791126, 0.40643673652514922, 0.19053499830856688, 0.20033550195294633, 0.13287714582076576, 0.10533560171090586, 0.00085487897815388243, -0.049435296406267468, -0.081309411554979491, 0.057947716710403128, 0.48207744089263116, 1.2538880645112733, 1.2204758332556214, 0.87793863876625744, 1.8796293205435075, -0.45285576127696725, 2.2308682152547137, 1.2382711063757557, -0.035207936995945072, 0.88175672278306683, 0.55916031961657942, 0.18718127547628777, 0.011764673252274449, 0.068747006595272581, 0.13522321325294812, 0.17151312046437606, 0.10315365060575944, -0.0011239413451798732, 0.14993420590829387, 0.38959110228082239, 0.38845862264410469, 0.69716730182732189, 0.51802064393501412, 0.28837767001488912, 0.10583936790249669, 0.071016615670210698, 0.16001776032454934, 0.10715662619027419, 0.056188716759532117, -0.035825840155044517, 0.0061469917968111389, 0.089493877843564718, 0.68387295014825999, 1.1016519558168656, 1.3182383587355595, 0.66635382040153524, 0.54863673632097221, 4.0547770231048936, 0.54863673632097154, 0.66635382040153424, 1.3182383587355562, 1.101651955816866, 0.68387295014826144, 0.089493877843565064, 0.0061469917968106288, -0.035825840155044517, 0.056188716759530431, 0.10715662619027334, 0.16001776032454856, 0.071016615670210018, 0.10583936790249539, 0.28837767001488829, 0.51802064393501346, 0.29686587428830957, 0.38845862264412201, 0.38959110228084654, 0.14993420590831108, -0.001123941345177488, 0.10315365060576374, 0.17151312046437922, 0.13522321325295103, 0.068747006595273552, 0.011764673252275867, 0.18718127547628682, 0.55916031961657786, 0.88175672278306205, -0.035207936995944634, 1.2382711063757532, 2.2308682152547106, -0.45285576127696175, 1.8796293205435037, 0.87793863876625788, 1.2204758332556218, 1.2538880645112747, 0.48207744089263271, 0.057947716710405182, -0.081309411554979547, -0.04943529640626837, 0.0008548789781495917, 0.10533560171090255, 0.13287714582076099, 0.20033550195294705, 0.19053499830855697, 0.40643673652513423, 0.38131881367792647, 0.93561154193068807, 0.78089304412102711, 0.49335337973436416, 0.19047751491127579, 0.098143635338704696, 0.029723534135297252, 0.13725228360851988, 0.19986443324539666, 0.17042917695126267, 0.13071733577885625, 0.15853680079243432, 0.28712786266920415, 0.099921469659732226, 0.94174974100731712, 1.3025551528258328, 0.79782532034480169, 0.64921445869288619, -0.93829697639874454, 2.5059762271849548, 1.3432089992982421, 0.45587938373772335, 0.46442894125096235, -0.096245457278447175, -0.11770539535407766, -0.13817032242271216, -0.0055442453146945193, 0.073000292812969436, 0.15561323638878341, 0.056601591846233208, 0.10095416296958591, 0.16385287994945555, 0.61326039955330602, 0.15435464918440814, 0.40096920495376004, 0.37880734420131523, 0.21821986304704899, -0.0027507666136306606, 0.032362324442924542, 0.093569887694449336, 0.19868696729956342, 0.25087704366702551, 0.23161854928103059, 0.17633262873947425, -0.041163173314526666, 0.30994126117363635, 0.97863365922997669, 0.83232217907475781, -0.31567909429421592, 0.66237039703709699, 1.810880881855315, -0.68744556831974835, 1.8448220136861369, 0.85744368463127729, -0.049302393683329601, -0.085302710712388291, -0.22929077462390179, -0.15255341311100187, -0.044245201781539331, 0.067046107651035594, 0.018548614200940294, -0.033110128022720509, -0.28158476919607578, -0.077796406016200054, -0.039386655944146774, 0.0080876817899761342, -0.029838116901173162, 0.065278519802780599, 0.09436442791977824, 0.019596242113334855, -0.040980231107276652, 0.08185944105119855, 0.15590400545853553, 0.2706202610478356, 0.24679565757292907, 0.051921880744651677, 0.20419289205443947, 0.55142162929109917, 0.15916183580862936, -0.32071019427277109, 0.46055159242136157, 0.36038108600874996, 0.60664479608939803, 1.4166629302294049, -0.2673333822918505, 0.93021729768322625, 0.46815371603113448, -0.3340126093430979, -0.15739380447541709, -0.13524198281736302, -0.020420877906040739, 0.014977564920405115, -0.069036032916578546, -0.22753898297998629, -0.29975286851709465, -0.43543489379944272, -0.16842937423862725, -0.28189859430095965, -0.14666574805210519, -0.1118471895929717, -0.024045478766081197, -0.013577696292883971, 0.016244981011212731, 0.071327529320409616, 0.14382895526034015, 0.1798858508922834, 0.17442784770871067, 0.16033553043559218, 0.23614535343159299, 0.13833755803781575, -0.14505648207394348, 0.017152293761212339, 0.40113579910946001, 0.16511529097099317, 0.23447144426975502, 0.28070253572415382, 1.1917438602108381, -0.21303758386300692, 0.32825613521942509, 0.066219257946262128, -0.27187198211633529, -0.066307061790987387, -0.028508101274429792, 0.026291702225849072, -0.056310601502134003, -0.1685787051145608, -0.27714150491609657, -0.24047492767194564, -0.32749231042729471, -0.19087946198724157, -0.26998035777525148, -0.17023093289450597, -0.076922699191602426, -0.016589123313677224, 0.01019520890848913, 0.084195395624057118, 0.095111634855381461, 0.12511007660405613, 0.1692284880759545, 0.22201073984886613, 0.053673315180547035, -0.19149929243694658, 0.083870133819847037, 0.21858339549377928, -0.0038697706067313737, 0.078542516808500606, 0.077143781693833222, 0.22624763974292969, 0.39965780946904111, 0.59191387060782175, -0.21969881405226852, -0.030574039563530501, -0.024970842739259945, -0.12562510603385371, 0.0052656766019967011, 0.015668866487966397, -0.038455609721168606, -0.079832857077626357, -0.11787169168831266, -0.15843188266072725, -0.092430559387194119, -0.25571779361731145, -0.33418602947193976, -0.37577894082796842, -0.17872521900892277, 0.025599835220983438, 0.036868954773614897, 0.063153633523536298, 0.064624059271844544, 0.12129220423951372, 0.1612208867083402, 0.13054366560393141, -0.0031358189183775171, -0.060276976551199596, 0.076248151019351354, -0.038784831650455917, 0.041725616486585258, -0.20186945117744698, 0.043591964044126186, 0.23914223921470992, 0.34013467279608772, 0.23157078159613964, 0.20755848067860685, -0.22107962950770196, -0.1025286187683216, 0.035725424097318138, -0.079299771847393549, 0.065331700319185088, -0.034956034554288036, -0.074021765277385243, -0.074018947274086908, -0.10375533557573537, -0.15489773108592672, -0.5463269466436349, -0.64123409592876401, -0.64559475523542686, -0.44280324831238616, 0.018445471788017767, 0.089840998861510313, 0.050489672984820259, 0.10094403852683856, 0.15540921558269635, 0.13542751998114574, 0.092098221631536192, 0.04873056181166658, 0.056474422402955825, -0.033352938195949811, -0.016925686434957218, -0.083060383383990535, -0.060406846903667433, -0.1226120784542102, 0.13458393481660744, 0.19090693911120402, 0.22215018549405383, 0.024793140061198739, 0.038718783333861403, -0.20853401810086775, -0.069635302172998029, 0.1064335953821621, -0.053345012614191917, 0.0099230741314936706, -0.15252816280103507, -0.18245346577017069, -0.29185933229148298, -0.3773223176299495, -0.94040577953315341, -1.0754357146022915, -1.1705860882999222, -0.77145898274834734, -0.079342592710004489, 0.05674840331570382, 0.14324588543960787, 0.12965098836906794, 0.14996801038078103, 0.10954302373131049, 0.12781279786870486, 0.11239290885891398, 0.0020423415177517252, -0.086381624051941733, -0.13062315548602732, -0.036665364495841957, -0.14926486203867201, -0.034593273427634852, 0.012219595757109143, 0.18300384413447635, 0.1958340625177715, 0.044601471225384402, -0.08740484292179726, -0.041369287190262873, -0.21341675767851565, -0.065677188177906895, 0.24144356597505726, -0.36750971454912684, -0.40026408654081164, -0.66562411016509171, -0.77336416928590557, -0.83899416480020206, -1.3372642957080858, -1.5719273509294132, -1.8005308506197781, -1.5408513794669076, -0.5531644985020383, 0.35609170613711127, 0.4116145942481696, 0.13448891283084041, 0.092477162456604783, 0.15737574769334561, 0.17138075095211283, 0.13259733500476581, 0.033522350558872378, -0.13112027137759125, -0.13478379984035713, -0.23416130311702804, -0.17379580132236419, -0.18974789333555622, 0.16649953505637016, 0.21963323601338522, 0.28775437300883855, 0.013318329293152468, -0.059449722211754409, -0.21633114300735917, 0.077936325689886982, -0.23415549346577649, -0.18415548289109335, -0.2220604628402971, -1.203289777252857, -1.2269479805895944, -1.3731553217305832, -1.2989780551182524, -1.64116294353798, -1.9821307035675826, -2.4053777736536572, -2.4259185480628087, -1.4297091333258454, -0.020800703185307738, 0.44907296092364196, 0.1858384756397643, 0.16308782299108818, 0.18780650312631128, 0.16876214929227229, 0.15032501459981898, 0.020281061259495404, -0.0073538013157964212, -0.13702193484548603, -0.059120611570979247, -0.18176695609293375, -0.10265025207047287, -0.00066962538216844151, 0.36158774196732713, 0.23695911940697681, 0.13767875532837892, -0.097481704015832935, -0.1639311930895031, -0.2137091594940832, 0.3107157406422304, -0.63196711118812665, -1.2839600483166249, -1.5107274159689543, -2.0001525985045667, -1.8007661961299211, -1.5766976273496909, -1.557678973082544, -2.4077419089431698, -2.9212825837849552, -3.1544891598954266, -2.0740660744196822, -0.81459993031793032, -0.047691255584086843, 0.26053579199245114, 0.24817234249560396, 0.16271946063708537, 0.1524538089963024, 0.12402459410134949, -0.017228379259870755, -0.059581713131428661, -0.15954900238017725, -0.17203834043004781, -0.03585192275390215, -0.13566388733867182, 0.18529272549107739, 0.32789481378377766, 0.46505832474821029, 0.14493915164048596, -0.068344938706060163, -0.20692971953005135, -0.13321306237600447, -0.22642518078961474, -0.16864865516591712, -1.9309474679838514, -2.6427456963680735, -2.0042907354579094, -2.0679079684570931, -1.6478932560447959, -2.2937692343725686, -2.7282977589825266, -3.4150761242194196, -3.3782856809989692, -2.2222759116849189, -1.2352596784322352, 0.12380717441380877, 0.15120100371873849, 0.22205496825803597, 0.13376820638889372, 0.16581598470153905, 0.21189843131890046, 0.1205613668903118, -0.11944152964360859, -0.2844407665876833, -0.38089709050886922, -0.1254790861941803, -0.12552132795948226, -0.087366382764606329, 0.2312435028685467, 0.42806542968274885, 0.31289505893871633, -0.016555865669298363, -0.15232124758199445, -0.18026213329416074, -0.054197237250036744, -0.92650772032563145, -1.6748432066634964, -1.9667941627002861, -2.2073957813815404, -1.3988308931230464, -2.1872173045798968, -1.7701160974209202, -2.3995834975192563, -3.1079150257531603, -2.2759627738397428, -1.9867837341406698, -1.1991385138433992, 0.25261423619714135, -0.086883949036943853, 0.13841341497021575, -0.013991851319408978, 0.15451076629740176, 0.20777584924549833, 0.37732986906226257, -0.1983231816223982, -0.064701320250050057, -0.75809939060751286, -0.0056552094670687921, -1.0666730319382445, 0.5168021952817432, -0.059867579479421881, 0.57704911017089144, 0.073612585805408248, 0.16986402710259826, -0.27685168579682035, 0.23610433796619823, -0.25969657852055217, -0.34105804260323408, -2.3692424085383355, -0.13683987631719494, -0.60631225487832385, -3.0428213499062093, -1.4302518240108333, -1.0960340088024054, 0.33378719268138207, -1.462532482812221, -1.1311602269894572, -0.42160647485916913, -0.77282398113385165, 0.051358135035689895, -0.12451483496808054, 0.074560604448017945, -0.071400263514198398, 0.12710467168208478, 0.20183473326046905, 0.53582170174408328, -0.31918913661037829, 0.028167647498415164, -0.49375784053277538, -0.67155961060436897, -0.79896724757297555, -0.015611524439376389, 0.074148205591898927, 0.44602122877613765, 0.17221102955705844, 0.070854449837212188, -0.07178740615442418, 0.043350794355038948, 0.23127204626685866, -0.49437187443974595, -1.3068505835636535, -0.50505328014021666, -0.55162352804951942, -2.4095702665388461, -1.9119199452512292], \"bottom\": {\"real\": [4046.4241509904555, 28839.973879370627, 10191.512031448321, 4381.7455807293263, 2071.9548413915022, 1107.2825867454831, 528.34551553150311, 308.97330299730402, 185.81061014820492, 130.08108126519062, 87.65365496956511, 59.09553675383809, 43.506269455848397, 34.575222311681692, 30.798097452905282, 25.523061346781674, 25.951646714603154, 25.523061346781589, 30.798097452905211, 34.575222311681706, 43.506269455848361, 59.095536753838019, 87.653654969565167, 130.08108126519082, 185.81061014820492, 308.97330299730379, 528.34551553150334, 1107.2825867454833, 2071.9548413915031, 4381.7455807293318, 10191.512031448323, 28839.973879370646, 13493.224333003216, 16392.519951456161, 4871.8353885075767, 1571.3337493887716, 567.64096645153529, 373.6703632325283, 244.24660034041102, 142.79597933554817, 106.13580676907658, 75.858347622710525, 58.061322564190078, 39.854538473021549, 30.569538051408923, 25.094853941398878, 22.929757321982656, 20.808198660555963, 22.04888812794956, 23.622937534136554, 29.138683151168021, 38.082981074479143, 54.39934218587819, 77.826621492011839, 121.61239162949131, 177.63416429867098, 254.30481783551838, 430.47940336338183, 664.63525809030591, 1219.8477670929726, 1935.5749815900854, 3358.0980991141623, 6069.2175916916049, 8660.7039291701622, 15384.540019848313, 11175.737303494303, 2216.879483433469, 674.59859086304846, 308.57630937597452, 222.13525013253278, 144.62539946693838, 89.351789047349641, 66.200283784031811, 53.5880480094322, 38.104835124660447, 27.112718944065261, 23.033311632510099, 19.858863545618888, 19.408029208714364, 19.38215160767772, 20.871711217553681, 24.726583224259915, 29.429525390428484, 39.688247321389746, 54.026677368666491, 71.509189516532359, 109.7023701375058, 145.30501493896827, 183.84765943176359, 237.38092500065588, 353.51632607639505, 531.27032729465725, 719.17065363709912, 1367.9024800373177, 2857.7322293344778, 8625.0149751320059, 3926.8611003464521, 2444.3527388912776, 1028.8359899085383, 585.56166554295623, 332.57137935864864, 180.13762334769046, 105.17011934648103, 61.496465220623485, 45.504823244138095, 37.908460172493172, 30.846794326525625, 21.222093075405745, 18.718288087401802, 17.679602313216872, 17.409839934721365, 17.794391783727544, 18.55926931620083, 21.348409581307148, 24.39997962145603, 30.767061622228063, 38.103008129659166, 44.81251118779231, 61.577721983396955, 87.291485884508717, 106.99539363556599, 134.18057082099898, 169.37440787587974, 269.99443977661724, 364.56248799144709, 674.50839546082307, 1521.022929703357, 2634.7343778883865, 2024.849011267275, 1926.8239401023498, 1491.9478410044117, 611.83627918833088, 316.43682665588744, 155.99683828976544, 89.673379864750018, 50.013293885425135, 37.528009707176061, 32.4518569290627, 24.966146703509182, 19.130394004010906, 15.343856356149828, 14.843145659919786, 14.861292517540363, 15.036681247518919, 15.312687438440403, 17.138709070816013, 19.446116741695533, 22.850207518010233, 27.457440287528367, 32.581505308308088, 40.985078317877736, 54.412823137373685, 75.762437644265901, 94.733059346587339, 128.1467358253355, 182.29010502256293, 275.95498073034861, 527.32695578494008, 1132.5867520786235, 1866.4077869841046, 2266.7457843108455, 2107.8495169895441, 1234.6592459623437, 673.70954283481137, 266.6693703142779, 139.47307538222793, 66.730731113314476, 41.917980917088734, 31.2590211502941, 26.786032891522527, 20.35627716260823, 16.038244917569745, 14.499148814332527, 13.459360575928033, 13.144389071570192, 12.567429683418663, 12.230328765246885, 13.466217665828195, 15.328301760046475, 17.144679989146308, 19.68756841312236, 24.074134044705339, 32.727034612286992, 43.026808431859955, 59.193773906230369, 78.820512563030945, 92.994178544706472, 120.42091176843755, 201.9182636225097, 436.44287859172925, 877.8862778005057, 1439.6385876846614, 1649.9911393469049, 1699.4038415062987, 1039.2560892520887, 495.51661529689329, 235.81544665938515, 113.58561083280532, 60.921551746622946, 35.725757089786256, 25.024628727892466, 22.490208420088727, 17.759823791920191, 13.543616943986416, 12.938917306264663, 11.956364952724385, 11.421939705679733, 11.372903592178258, 11.032765269291394, 11.408229662647633, 12.481114469594095, 13.60275540468532, 14.91952183557448, 17.807798659576154, 23.277252196336814, 31.950664619854233, 47.416694920263616, 56.268912844615144, 64.959626427586997, 85.070809539003847, 130.82046704446515, 257.67571935262418, 627.46721263291658, 1194.1693767483914, 1080.1900960853154, 902.674413704009, 600.04055794738224, 333.23520458041997, 166.5653831933532, 88.946305547571072, 50.717393232745131, 31.897215329939996, 23.060146944216118, 18.579780562544169, 15.572760511446054, 13.273777678692191, 12.224913053368416, 11.68638594982613, 10.392044527527784, 10.422646713468026, 10.113778554702394, 10.225072497047023, 10.776357928238541, 11.471833692521193, 12.585855785544721, 15.131216045563061, 18.856673404562432, 24.858220592568422, 32.657280802203381, 43.037987696240307, 51.536289299313914, 59.08796022590117, 89.418846636419246, 168.44781050782811, 382.14409608709747, 745.27797642375992, 544.93523795856049, 546.63255943550212, 362.69938393816085, 222.4530875664997, 124.78354764285341, 69.155510455436144, 41.705006957506896, 26.952419331651356, 19.778555411511121, 17.743475715717917, 14.471795156401063, 12.765457059373892, 11.899864411981882, 10.85818004844373, 10.325708895539952, 9.5692719745256376, 9.2113480820863387, 9.0680329970290128, 9.7734432560375648, 10.488284402310196, 11.323197140674811, 13.23504887223821, 16.674941080314653, 20.771526297093455, 27.569417818570489, 33.103068481604573, 37.131609415223707, 47.964760430736398, 66.578817507603574, 119.94841754808802, 237.18123750436465, 409.50889944188236, 307.01018353832677, 288.66760291638428, 236.16368190120858, 154.32114106589464, 92.303773245695481, 55.468009578938926, 35.843010431224045, 24.692475316947775, 18.31794202383119, 15.815283825259236, 13.970653175227845, 12.321358605090134, 11.166914874614415, 10.532076178141539, 9.9738582700772742, 9.4395532322934326, 8.8524779931517035, 8.5960325163902862, 8.7233150994257276, 9.4605465058702709, 10.702831587760128, 11.695932356823622, 14.406509159208545, 18.893042693096525, 25.031728162044864, 28.237283751764654, 32.110154440123182, 38.781782989560291, 56.412497176172337, 92.156945934839797, 157.10935603874077, 244.24925081430641, 218.20881258539546, 216.90433976724358, 169.13695858014356, 112.62100758585845, 68.70530790516959, 45.982361360241526, 32.725373555898344, 22.221572369125827, 17.135020014783734, 14.281960328360523, 12.699315839076576, 11.637118060780567, 11.004832210877884, 10.393382355075936, 9.6259602166533789, 8.7652013845999868, 8.5650120282362092, 8.5854476517741869, 8.1851518687531879, 9.1270872628576836, 9.8383977040140795, 11.693775785132257, 13.287947209975439, 16.544820171465705, 21.672488061489553, 27.762087103200397, 29.796933806391767, 35.443188490268959, 51.826480475596476, 76.692136618774384, 114.45554660359461, 172.81330831382385, 150.57608076172548, 151.07347077509746, 119.80060075739978, 84.307080896770614, 55.59442395215062, 38.954469932130465, 27.855857296119165, 21.147383956632677, 16.095362427853317, 14.114901096214023, 12.272097096384341, 11.279235865220194, 10.45557624282722, 10.213403723979409, 9.4352540004127672, 9.059591562681522, 8.4285767722705884, 8.2189676916739653, 8.2483207838968369, 8.7272133851807343, 9.3853417746714207, 10.436988631508529, 11.737372360714012, 14.160123000210135, 18.959579242189701, 24.173697545434358, 27.627516713161423, 33.591531685669004, 45.297439984936638, 65.897539497304663, 88.610944521286385, 122.51594786973793, 102.9717174324289, 99.771144171631136, 80.254636450195903, 61.009511746666256, 44.786912913807178, 34.271024500323179, 25.65851527359349, 19.184194785168692, 15.369946764821139, 13.384363033613122, 12.174478369218367, 10.905903566261369, 10.181651684644681, 9.6408755952533021, 9.5742304532973588, 8.9763308722412098, 8.5493032688069821, 8.0644484764315241, 8.4276865988342919, 8.7290963397981098, 9.1210926884309647, 10.045472592156113, 11.11042960636143, 12.723025686618605, 15.905816263070196, 20.709491045732211, 24.791931496783274, 30.865414152401307, 41.835714185623189, 55.039237230593706, 69.947250962386548, 86.305656954166849, 70.246077416654487, 70.163190967731239, 60.941585457354833, 46.988681551588527, 37.426824229947464, 31.105114654781531, 24.717957509432271, 18.191253220796238, 14.40571246916225, 12.794837539520243, 11.45286867499644, 10.555233980671725, 10.138595490186225, 9.7617939326440126, 9.2945114067021706, 9.1978519570897408, 8.5269704682665068, 8.3694986947733589, 8.3900850601209847, 8.9019780110016278, 9.4993224051697176, 10.189344774081897, 11.038776504531349, 12.139382952337165, 14.296273465828305, 18.325479810549485, 23.245126565071455, 28.658675517780157, 38.227879918404916, 50.026933715114076, 59.913478880080035, 67.142884728350211, 60.673200962744687, 56.006191670589025, 48.952383807337931, 41.877289900824969, 35.563752651142892, 29.381802508508265, 23.323351055229473, 18.385352146785323, 14.386074460433269, 11.971768024825069, 10.813949701229296, 10.104265892334448, 9.7873837360525968, 9.7876450182420029, 9.3736570608881902, 9.1067837514303367, 8.8782742568475381, 8.4108604655156682, 8.5145291911969032, 9.1444638633789328, 9.5903687569174956, 10.050972673200409, 10.599176866339214, 12.029252308933458, 13.885440808202775, 16.933840539652099, 20.949767453800131, 27.392670445772911, 35.246945811604022, 44.844494652773115, 53.527920120533459, 59.511906457614529, 53.048047546158344, 49.667902591204928, 45.161821768091436, 39.040569237963304, 34.153498370766542, 28.812200326236947, 21.915204963295363, 16.825291542921018, 14.194481006765461, 11.707465544074312, 10.438485210613589, 9.8151245648739263, 9.283134914271356, 9.0821420578250009, 9.0470505359514384, 9.0924089982219396, 8.8466944313913523, 8.4735939062643375, 8.4980702515250215, 9.0113445722107848, 9.2898710387292809, 9.9575678866832327, 10.426127211956205, 11.223822839806607, 13.773251241827809, 16.688691177663944, 20.746301629724744, 26.320191080313084, 33.979868436578599, 42.0788988747152, 48.313306819757166, 52.481937610238305, 49.070609767594966, 49.766679020971374, 46.544272852318578, 40.229040805773415, 32.559839637781486, 26.180018982316895, 21.083604085221012, 16.97356072267355, 13.301411970448795, 11.264067238060504, 10.255581922596939, 9.6536213682112031, 9.2153774062964224, 8.7468110761182825, 8.4356542718375049, 8.7323846743622209, 8.8458599078381237, 8.7323846743622209, 8.4356542718375032, 8.7468110761182896, 9.2153774062964278, 9.653621368211212, 10.255581922596944, 11.264067238060512, 13.301411970448795, 16.973560722673543, 21.083604085221008, 26.180018982316881, 32.559839637781494, 40.22904080577338, 46.544272852318571, 49.766679020971331, 53.048047546158344, 52.481937610238198, 48.313306819757052, 42.0788988747152, 33.979868436578577, 26.320191080313087, 20.746301629724748, 16.688691177663959, 13.773251241827822, 11.22382283980661, 10.426127211956201, 9.9575678866832256, 9.2898710387292791, 9.0113445722107919, 8.4980702515250268, 8.4735939062643357, 8.8466944313913505, 9.0924089982219467, 9.0470505359514402, 9.0821420578250063, 9.2831349142713542, 9.815124564873928, 10.438485210613582, 11.707465544074319, 14.194481006765461, 16.825291542921001, 21.915204963295366, 28.81220032623694, 34.153498370766549, 39.040569237963282, 45.161821768091372, 49.667902591204999, 60.67320096274468, 59.511906457614572, 53.527920120533402, 44.844494652773072, 35.246945811604007, 27.392670445772925, 20.949767453800135, 16.933840539652095, 13.88544080820277, 12.029252308933453, 10.599176866339214, 10.0509726732004, 9.5903687569174885, 9.1444638633789328, 8.5145291911969103, 8.4108604655156718, 8.8782742568475346, 9.1067837514303385, 9.3736570608881848, 9.7876450182420012, 9.7873837360526021, 10.10426589233446, 10.813949701229305, 11.971768024825074, 14.386074460433273, 18.385352146785333, 23.323351055229466, 29.381802508508251, 35.563752651142877, 41.877289900824962, 48.952383807337874, 56.006191670588912, 70.246077416654288, 67.142884728350111, 59.913478880079964, 50.026933715114062, 38.227879918404923, 28.658675517780189, 23.24512656507147, 18.325479810549478, 14.296273465828305, 12.139382952337156, 11.038776504531354, 10.189344774081897, 9.4993224051697229, 8.9019780110016331, 8.3900850601209847, 8.3694986947733572, 8.5269704682665068, 9.197851957089739, 9.2945114067021635, 9.7617939326440144, 10.138595490186225, 10.555233980671725, 11.452868674996441, 12.794837539520238, 14.405712469162248, 18.191253220796249, 24.717957509432264, 31.105114654781534, 37.426824229947449, 46.988681551588492, 60.941585457354776, 70.163190967731154, 102.97171743242879, 86.305656954166807, 69.947250962386491, 55.039237230593784, 41.835714185623168, 30.865414152401325, 24.791931496783278, 20.709491045732214, 15.905816263070196, 12.723025686618604, 11.110429606361421, 10.045472592156107, 9.1210926884309735, 8.7290963397981116, 8.4276865988342937, 8.0644484764315258, 8.5493032688069821, 8.9763308722412134, 9.5742304532973623, 9.6408755952533056, 10.181651684644681, 10.905903566261369, 12.174478369218367, 13.384363033613125, 15.369946764821144, 19.184194785168689, 25.658515273593498, 34.271024500323144, 44.78691291380715, 61.009511746666178, 80.25463645019579, 99.771144171631008, 150.57608076172505, 122.51594786973776, 88.610944521286228, 65.897539497304635, 45.297439984936574, 33.591531685669025, 27.627516713161402, 24.173697545434354, 18.959579242189701, 14.160123000210131, 11.737372360714007, 10.436988631508525, 9.3853417746714172, 8.7272133851807325, 8.2483207838968262, 8.2189676916739689, 8.4285767722705902, 9.0595915626815202, 9.4352540004127654, 10.213403723979411, 10.455576242827226, 11.279235865220191, 12.272097096384336, 14.114901096214016, 16.095362427853331, 21.147383956632702, 27.855857296119162, 38.954469932130408, 55.594423952150585, 84.307080896770429, 119.80060075739968, 151.07347077509721, 218.20881258539524, 172.81330831382382, 114.45554660359451, 76.692136618774427, 51.826480475596433, 35.443188490268959, 29.796933806391745, 27.762087103200372, 21.672488061489549, 16.544820171465698, 13.287947209975444, 11.693775785132251, 9.8383977040140866, 9.1270872628576836, 8.1851518687531897, 8.5854476517741798, 8.5650120282362074, 8.7652013845999939, 9.6259602166533789, 10.393382355075921, 11.004832210877884, 11.637118060780562, 12.699315839076572, 14.281960328360505, 17.135020014783741, 22.221572369125806, 32.725373555898322, 45.982361360241477, 68.705307905169562, 112.62100758585837, 169.13695858014344, 216.90433976724287, 307.01018353832563, 244.24925081430612, 157.1093560387404, 92.156945934839754, 56.412497176172316, 38.781782989560298, 32.110154440123168, 28.237283751764654, 25.031728162044857, 18.893042693096504, 14.406509159208543, 11.695932356823613, 10.702831587760132, 9.4605465058702674, 8.7233150994257205, 8.5960325163902844, 8.8524779931517052, 9.4395532322934272, 9.9738582700772813, 10.53207617814155, 11.166914874614413, 12.321358605090143, 13.970653175227838, 15.815283825259229, 18.317942023831186, 24.692475316947778, 35.843010431224023, 55.468009578938812, 92.303773245695368, 154.32114106589427, 236.16368190120789, 288.66760291638354, 544.93523795856049, 409.50889944188282, 237.18123750436465, 119.9484175480882, 66.578817507603574, 47.964760430736455, 37.131609415223693, 33.103068481604559, 27.569417818570489, 20.771526297093434, 16.674941080314646, 13.235048872238199, 11.323197140674804, 10.488284402310184, 9.7734432560375648, 9.068032997029011, 9.2113480820863387, 9.5692719745256465, 10.325708895539957, 10.85818004844373, 11.899864411981884, 12.765457059373892, 14.471795156401072, 17.743475715717903, 19.778555411511121, 26.952419331651342, 41.705006957506882, 69.155510455435987, 124.78354764285341, 222.45308756649936, 362.69938393816079, 546.63255943550212, 1080.190096085312, 745.27797642375788, 382.14409608709587, 168.44781050782805, 89.418846636419218, 59.087960225901135, 51.536289299313893, 43.037987696240307, 32.657280802203374, 24.858220592568383, 18.8566734045624, 15.131216045563052, 12.585855785544725, 11.471833692521184, 10.776357928238532, 10.225072497047019, 10.113778554702403, 10.422646713468026, 10.39204452752778, 11.686385949826136, 12.224913053368411, 13.273777678692191, 15.572760511446033, 18.579780562544141, 23.060146944216122, 31.897215329939918, 50.717393232745025, 88.946305547570788, 166.56538319335294, 333.23520458041884, 600.04055794738088, 902.6744137040065, 1649.9911393469013, 1194.1693767483896, 627.46721263291568, 257.67571935262464, 130.82046704446515, 85.070809539003903, 64.95962642758694, 56.268912844615201, 47.416694920263595, 31.950664619854226, 23.277252196336782, 17.807798659576147, 14.919521835574468, 13.60275540468532, 12.481114469594081, 11.408229662647638, 11.032765269291394, 11.37290359217827, 11.421939705679749, 11.956364952724407, 12.938917306264656, 13.543616943986398, 17.759823791920141, 22.490208420088635, 25.024628727892473, 35.725757089786228, 60.92155174662291, 113.58561083280503, 235.81544665938503, 495.51661529689198, 1039.2560892520876, 1699.403841506296, 2266.7457843108423, 1439.6385876846614, 877.88627780050422, 436.44287859172971, 201.91826362250967, 120.42091176843758, 92.994178544706443, 78.820512563031016, 59.193773906230312, 43.026808431859891, 32.72703461228695, 24.074134044705318, 19.687568413122339, 17.144679989146301, 15.32830176004647, 13.466217665828177, 12.230328765246888, 12.567429683418707, 13.144389071570203, 13.459360575928054, 14.499148814332536, 16.038244917569731, 20.356277162608194, 26.786032891522385, 31.259021150294068, 41.917980917088691, 66.730731113314405, 139.47307538222745, 266.66937031427761, 673.70954283481024, 1234.659245962343, 2107.8495169895405, 2024.849011267276, 1866.4077869841062, 1132.5867520786235, 527.32695578494054, 275.9549807303485, 182.29010502256293, 128.14673582533564, 94.733059346587495, 75.762437644265887, 54.412823137373678, 40.985078317877729, 32.581505308308067, 27.457440287528364, 22.850207518010212, 19.446116741695526, 17.138709070816009, 15.312687438440404, 15.036681247518965, 14.861292517540395, 14.843145659919811, 15.343856356149836, 19.130394004010878, 24.966146703509185, 32.451856929062608, 37.528009707176075, 50.013293885425036, 89.673379864749862, 155.99683828976509, 316.43682665588739, 611.83627918833008, 1491.9478410044112, 1926.8239401023493, 3926.8611003464503, 2634.734377888386, 1521.0229297033557, 674.50839546082398, 364.56248799144686, 269.99443977661741, 169.37440787587963, 134.18057082099915, 106.99539363556599, 87.291485884508702, 61.577721983396906, 44.812511187792317, 38.103008129659166, 30.767061622228066, 24.399979621456033, 21.348409581307155, 18.55926931620083, 17.794391783727576, 17.409839934721397, 17.67960231321689, 18.718288087401788, 21.222093075405763, 30.846794326525586, 37.908460172493079, 45.504823244138095, 61.496465220623335, 105.17011934648093, 180.13762334768973, 332.57137935864853, 585.56166554295532, 1028.8359899085369, 2444.3527388912739, 15384.540019848309, 8625.0149751320096, 2857.732229334476, 1367.9024800373199, 719.17065363709889, 531.27032729465782, 353.51632607639499, 237.38092500065625, 183.84765943176362, 145.3050149389683, 109.70237013750581, 71.509189516532217, 54.026677368666469, 39.688247321389689, 29.429525390428473, 24.726583224260004, 20.871711217553678, 19.382151607677731, 19.408029208714364, 19.858863545618949, 23.033311632510113, 27.11271894406525, 38.10483512466044, 53.588048009431979, 66.200283784031811, 89.351789047349371, 144.62539946693829, 222.13525013253218, 308.57630937597452, 674.59859086304834, 2216.8794834334685, 11175.737303494294, 13493.224333003214, 8660.703929170164, 6069.217591691604, 3358.0980991141591, 1935.5749815900851, 1219.8477670929722, 664.63525809030602, 430.47940336338263, 254.30481783551838, 177.63416429867087, 121.61239162949126, 77.826621492011839, 54.399342185878204, 38.082981074479164, 29.138683151168006, 23.622937534136597, 22.04888812794956, 20.808198660555991, 22.92975732198266, 25.094853941398917, 30.569538051408909, 39.854538473021513, 58.061322564190043, 75.858347622710383, 106.13580676907651, 142.795979335548, 244.24660034041099, 373.67036323252819, 567.64096645153575, 1571.3337493887695, 4871.835388507573, 16392.519951456165], \"imag\": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, \"imag\": [0.0, -1.343901621327011, 1.7218333249394571, 1.3937858919791224, -0.90478486773452105, 0.99560837280124848, 0.13374486301187097, 0.79781790598886937, 0.081235430122062774, 0.47338465820086184, -0.078534664439216209, 0.29500119331967589, -0.62479162763734286, 0.29517170974740459, -1.8712573358384692, 0.14096520515743682, 0.0, -0.14096520515741828, 1.8712573358384816, -0.29517170974737811, 0.62479162763733731, -0.29500119331966146, 0.078534664439223051, -0.47338465820085962, -0.081235430122062774, -0.79781790598886004, -0.13374486301187369, -0.99560837280124848, 0.90478486773452083, -1.3937858919791226, -1.7218333249394557, 1.3439016213270112, 1.5871307700950068, 0.56370110925886319, 1.2603198064423482, 2.9317402483699255, -0.84090846562801591, 0.28395441021550888, 1.0393523450590114, 0.83104911233799517, 0.57334259680943678, 0.30043904784975134, 0.29266755430531527, 0.082930104064024152, -0.36502835420313379, -0.76213554623438207, -0.54316838647957832, -0.66028179246101926, 0.20250391456576916, -0.059393044635645806, 0.9730252602081445, -0.01782962412134724, 0.18933865423621773, 0.011846708470834844, 0.014269719747672759, -0.16281560265463554, -0.24410560657714067, -0.34963232308526365, -0.32234943120999277, -0.6691127915152365, 0.14162995430492473, -0.96909874957635578, -1.0446282489208472, 1.3612809629252947, 0.70464907960903156, 1.644656498115789, 1.457626495523533, -0.6840361527612806, -0.68147470897196205, 0.73118573872942638, 1.2398159392319572, 1.2736175855463174, 0.65550663858936109, 0.45897332874861019, 0.24948129249627171, 0.22959418801218681, -0.67355449112520815, -0.78917379441405089, -0.83366315887398401, -0.022795944141155908, 0.15753196960053301, 0.50836195321582456, 0.16292155588892338, 0.14047533322536612, -0.029004083819245446, 0.042892010327960466, -0.084780328674450303, -0.13217055914433321, -0.30971168558439593, -0.44061350110378666, -0.59380988893293396, -0.46719027726302742, -1.2068396187631398, -0.94969408752542273, 0.28960616895899027, -0.40038203546320883, 0.55620249274438927, 0.14065731983379595, 1.390858139437829, -0.67833342052765033, -2.0926714021100303, 1.5120873610545131, 1.7251253398279642, 1.0499886203647506, 0.6413261932720733, 0.43315407205712014, 0.32584150801434064, 0.17968537990933128, -0.27887473465086693, -0.72646685328097149, -0.95200274282553721, -0.38747270801185796, 0.31172559850957127, 0.3167238274644899, 0.25925756638025876, 0.20404659434537992, 0.19201780058118942, 0.0025274006864131854, -0.20254250312507205, -0.30146681989018398, -0.45156398868756126, -0.71583959398165176, -0.78636343748881254, -1.3089140888320636, 0.41393919421363429, -0.92308378001125058, -0.96086768695066838, 0.99489496750979101, -0.39381772120025876, -0.59264738582705545, -1.1161873115341066, -0.38954314931717815, 0.15776662530084892, 0.39428020304678685, 1.7089894615168126, 0.92868491010646026, 0.350973234838865, 0.32125288047075679, 0.23669588269358602, 0.19592809956108717, -0.32646969875093118, -0.5617213523679232, -0.76596137582739887, -0.4848448097808058, 0.0035984972735877987, 0.36234031342999445, 0.02584515038201295, 0.38132345964413561, 0.29172235696712762, 0.10460468586389386, -0.14942504329756173, -0.23406484190568319, -0.59702583417138988, -0.64791716309340031, -1.1972380302487249, -0.37081056871520385, 0.31028937719203986, -0.11181138224479611, 0.050224150041196312, -0.59242819035998506, -0.4703174557375312, -0.55567065990801068, -0.18073895078348806, -0.07286620180284567, 0.9080135456055427, 1.3448759333642528, 0.56391746646770735, 0.68824563709365816, 0.27054447491545203, 0.18555506064923469, 0.21628766080629094, 0.089227696371118645, -0.1330464412169812, -0.51044075389216448, -0.57482956329522528, -0.49992842173388902, -0.0088882269741786465, -0.026119953804469152, 0.16649307508904443, 0.18021017930701566, 0.24129551707937363, 0.051414766220490717, -0.054409237913703348, -0.21354052285348152, -0.34065461819243753, -0.83215952955458006, -0.65455151443418824, -0.51711748874533736, -0.34193161983249143, 0.25991967791421511, -0.31922838969311168, -0.25096233231074472, -0.019538834540300996, 0.23386297177233037, 0.39736821511961345, 0.72603823847118543, 0.8168297825020705, 1.0763583447726135, 0.80611388127401196, -0.023349196100613815, 0.09911450222934183, 0.11136104528246665, 0.11912886110102348, 0.1510441091194204, -0.10294245821664937, -0.34339582552474845, -0.46071517851602106, -0.27454988477746128, -0.021291149638310566, 0.035818571775215378, 0.08165077597052256, 0.19593247304969552, 0.16021249355536668, 0.073411101811457824, -0.094413661460628892, -0.14774431296435828, -0.3788677957633147, -0.38953231590523063, -0.62892221563014938, -0.80219655994233319, 0.19764870263775744, -0.28620163890053252, 0.041738811618785537, -0.047502831671303453, 0.42759360787810174, 0.44353340330745888, 0.61232760985457502, 0.70207820166905466, 0.72192603666395361, 0.63928791416871467, 0.32589261306510392, 0.17268517789923485, -0.11832252230060911, 0.049391580905339259, 0.12347320818582375, 0.064697981434016727, -0.0067102091687047593, -0.27370819742589092, -0.26939466873920287, -0.25176222060998998, 0.0081310228529853402, 0.013089808045657288, 0.185105158015618, 0.11713478908555769, 0.20974664985683705, 0.048745778368168922, -0.0069359534603168627, -0.18083894269546222, -0.15907734702039189, -0.30490326972545728, -0.49525043110711681, -0.20633977154543071, -0.28929558460304977, 0.017255660868048289, 0.089250558912840242, 0.34349774583430781, 0.38277205043588519, 0.56772102070325814, 0.48811475177501612, 0.43659704639067964, 0.38858095560717315, 0.35469216713625445, 0.11095078972724678, -0.050354098986562471, 0.010426074631633324, -0.023032548262322892, 0.068558023511485697, 0.1199625535177883, -0.0044347552049944488, -0.14323623171577524, -0.2742488887234425, -0.15059247824174998, -0.18695930341705305, 0.068136880204083733, 0.049162011568203073, 0.16362595169702937, 0.078325720975578078, 0.11153460033842358, -0.10346450949096449, -0.039250261082814021, -0.12027128091306288, -0.23113762225192683, -0.07885965728132803, -0.25982980909746989, -0.11219308206942701, -0.19372413199270677, 0.1843821378255476, 0.22544536191476028, 0.22838873802709003, 0.11856768480607156, 0.20011010622694389, 0.16443500436191505, 0.13441036107213369, 0.15600995797323181, 0.029984980792926118, -0.017950425588896139, -0.095997178609832007, 0.045815559155676679, 0.050600401411128038, 0.062555070152262096, 0.095362679574156284, -0.25884721081868178, -0.19352665675464722, -0.35758313393883445, 0.057241994101256972, -0.074489797691212556, 0.15760636776309309, 0.077110294424560424, 0.21793581355625327, -0.085384156728057797, 0.054278095118519401, -0.063513516552257218, -0.13925876777247995, -0.053090482149624127, -0.088550664314818353, 0.097053178020475875, 0.021982682491266895, -0.032057043772553598, 0.011606155190390474, 0.20297398899260674, 0.087137707937781944, 0.14235450986309658, -0.0066344290522644652, 0.069443551113326479, 0.037974760198136455, 0.02723212012252952, -0.030406089689394462, -0.062891439826322393, -0.033462702565164315, -0.13091343010011852, 0.18662643567548856, 0.14580799486104234, -0.055902479292620696, -0.12813917376287484, -0.43706544906097528, -0.097926711565598012, -0.17130544619864244, 0.30727693305691806, -0.2953735036217468, 0.22056405751825581, -0.16529753202987246, 0.34047455883436423, -0.0020829156573361745, -0.14775664020163451, -0.074518551996532553, -0.14850320507536691, -0.057283952975165524, 0.064665418468806371, 0.23511892751228192, 0.11870789775778592, 0.0625549454189092, -0.031298024311669038, 0.0064402102662661845, -0.079082063664820082, 0.0553675188881671, 0.025089334126077875, 0.063800091749494747, 0.015988824093570549, -0.048545356942180602, -0.11558972094679192, -0.097487343329346582, -0.00049492928166827938, -0.18157168721539482, 0.33942288969170681, 0.30522386319855388, -0.54639589537101751, 0.013830571830100688, -0.38850732372171304, 0.223075916963486, -0.31865288748874443, 0.25745374979707547, -0.81885347149607268, 0.50855168910609783, 0.20195166784419227, -0.069785743671890318, 0.050884179954965268, -0.18377202523753672, -0.17303565260659334, -0.15924096907201105, 0.092146932205194695, 0.26379835890783954, 0.35934781180257075, 0.24329566614587647, 0.18564601960109514, 0.24223475523068938, 0.28967646870392649, 0.15967526911861643, 0.22365254766781259, 0.12185893624650075, 0.070105150765122456, -0.045495054958742086, -0.13016925945874308, -0.12331107551299306, -0.096585989040329473, 0.22919036999990153, -0.39865574246315477, 0.3675558227752026, 0.45597314967635888, -0.93227329954448013, 0.32110784375924512, -0.59160024067907024, 0.39469180639349893, -1.5810043928614619, 0.71926168426275527, -0.095920343398476549, -0.084877145937512208, 0.40399573862898452, -0.041743397742653787, -0.10303861084867461, -0.21220001866353477, -0.17318676777643013, 0.015792824133968684, 0.37994714934071439, 0.4573031649737595, 0.48491463219236358, 0.278045596991639, 0.33099751793182702, 0.073461819418744675, 0.30445717300203839, 0.34815332433352569, 0.27336662525128713, 0.050113511094951838, -0.059405844632707393, -0.16261143474742229, -0.10891422081227681, -0.075070297171157971, 0.15348950297637756, 0.63132994551184463, -0.93604459898777692, 0.42325697055405742, 1.1782712312395338, -1.6700526640562563, 0.67307548012867768, -2.0365876460209691, 0.69665186973993298, -0.3990336398782886, -0.77751104168880314, 0.5628167675812451, 0.044468991083659551, 0.081278132745909976, -0.070993394358423723, -0.091852860366211056, -0.10956166698887557, 0.072941493094735049, 0.35167328896657912, 0.63488067579895824, 0.56199684605205058, 0.60627707274502263, -0.018970197624819329, 0.37668655809680845, 0.22317003729918369, 0.17596357423928666, 0.18202109891962201, 0.038230887694388455, -0.10475039750351335, -0.15123171993121909, -0.11278544639649389, 0.054110895720760221, 0.23852479976301316, 0.30802887330694756, 0.9587111952302938, -1.4503952980081434, -0.061458391503499687, 2.1389978076683529, -3.5142346308062073, 1.6764175122847729, -0.63252660757872936, -1.1970497991660358, 0.46027494328631885, -0.38868529039399474, 0.063066133758830412, 0.085024034480974467, 0.047630852690686495, -0.022775175196356016, 0.011847923870825085, 0.13095780969018636, 0.39870906011464996, 0.54100133271840178, 0.62859642257501991, 0.12859489098386362, -0.17371304193339687, -0.77135662792152559, -0.35696964892202537, -0.15350152251372465, -0.081108427029901481, -0.12890403553126065, -0.14048874638904316, -0.18368108831833277, -0.13143015225876853, 0.037318187986402011, 0.39815350666418903, 0.44685069559938601, 0.29854169122462937, 1.0193515924216456, -2.1696976832709978, -1.5476694374721527, 4.1115013597100623, -1.6066056279080296, -1.1129988398741206, 0.94641351902713078, -0.66464487182371434, -0.22405122030787003, -0.16845135046504239, 0.10281428632219461, 0.12776142939872864, 0.10903691838775739, 0.097477148948306502, 0.19622512970077355, 0.37581890109000032, 0.58152174984392169, 0.57588244896775898, 0.56835821427965394, 0.0, -0.075660591040101741, -0.5319087481065502, -0.49066506338765509, -0.25388521774435541, -0.17759782612549996, -0.17342105765811164, -0.17172379067488869, -0.17163733194043357, -0.0096917261033460274, 0.23320936684713756, 0.61544163247884909, 0.23031783223894131, 0.4504667163321609, -0.25422186154383031, -1.2338903723029762, 0.0, 1.2338903723029679, 0.25422186154382892, -0.45046671633216256, -0.23031783223894184, -0.61544163247884998, -0.2332093668471385, 0.0096917261033450074, 0.17163733194043357, 0.17172379067488885, 0.17342105765811225, 0.17759782612550043, 0.25388521774435546, 0.49066506338765642, 0.53190874810654976, 0.075660591040102837, 0.17371304193345374, -0.56835821427958444, -0.57588244896772234, -0.58152174984391114, -0.37581890108999716, -0.19622512970076919, -0.097477148948305531, -0.10903691838775691, -0.12776142939873006, -0.10281428632219579, 0.16845135046504131, 0.22405122030786861, 0.66464487182371257, -0.94641351902713855, 1.1129988398741191, 1.6066056279080259, -4.1115013597100578, 1.5476694374721462, 2.1696976832709982, -1.0193515924216472, -0.29854169122463242, -0.44685069559938834, -0.39815350666419097, -0.037318187986404149, 0.13143015225876697, 0.18368108831833294, 0.14048874638904385, 0.12890403553126736, 0.081108427029909794, 0.15350152251374438, 0.35696964892206617, 0.77135662792155557, 0.018970197624865574, -0.12859489098383081, -0.62859642257500314, -0.54100133271839856, -0.39870906011464824, -0.13095780969018578, -0.011847923870824886, 0.022775175196357359, -0.047630852690687051, -0.085024034480974689, -0.063066133758832563, 0.38868529039399197, -0.46027494328632251, 1.1970497991660347, 0.63252660757872814, -1.6764175122847713, 3.5142346308062082, -2.1389978076683618, 0.061458391503496308, 1.4503952980081398, -0.95871119523029713, -0.30802887330694667, -0.2385247997630148, -0.054110895720761498, 0.11278544639649313, 0.15123171993121864, 0.1047503975035141, -0.038230887694384028, -0.18202109891961496, -0.17596357423927469, -0.2231700372991606, -0.37668655809676688, -0.33099751793180054, -0.60627707274499654, -0.56199684605203359, -0.63488067579895024, -0.35167328896657507, -0.072941493094733675, 0.1095616669888755, 0.091852860366211805, 0.07099339435842339, -0.08127813274590924, -0.044468991083660724, -0.56281676758124888, 0.77751104168880336, 0.39903363987828711, -0.69665186973992854, 2.0365876460209633, -0.67307548012867546, 1.6700526640562572, -1.17827123123954, -0.42325697055405653, 0.93604459898777859, -0.63132994551184651, -0.15348950297637845, 0.075070297171156097, 0.10891422081227575, 0.16261143474742193, 0.059405844632708517, -0.050113511094947612, -0.27336662525128258, -0.34815332433351742, -0.30445717300202041, -0.073461819418725136, -0.24223475523068566, -0.278045596991634, -0.48491463219235625, -0.45730316497375445, -0.37994714934071183, -0.015792824133968708, 0.17318676777642958, 0.21220001866353638, 0.10303861084867472, 0.04174339774265514, -0.40399573862898636, 0.084877145937511819, 0.095920343398476396, -0.71926168426275106, 1.5810043928614652, -0.39469180639349549, 0.59160024067907002, -0.32110784375924395, 0.93227329954447902, -0.4559731496763611, -0.36755582277520088, 0.39865574246315755, -0.22919036999990147, 0.096585989040328876, 0.12331107551299252, 0.1301692594587433, 0.045495054958742745, -0.070105150765121721, -0.12185893624649984, -0.22365254766781101, -0.15967526911861513, -0.28967646870392255, -0.0064402102662611729, -0.18564601960108706, -0.24329566614587189, -0.35934781180256659, -0.2637983589078372, -0.092146932205193599, 0.15924096907201093, 0.17303565260659445, 0.18377202523753683, -0.05088417995496395, 0.069785743671890568, -0.20195166784419286, -0.50855168910609727, 0.81885347149607191, -0.25745374979707175, 0.3186528874887527, -0.22307591696348483, 0.38850732372171648, -0.013830571830101068, 0.54639589537102196, -0.30522386319855499, -0.33942288969170481, 0.18157168721539607, 0.0004949292816654663, 0.097487343329345874, 0.11558972094679136, 0.04854535694218131, -0.015988824093569717, -0.06380009174949508, -0.025089334126078205, -0.055367518888164394, 0.079082063664820748, -0.087137707937777115, 0.031298024311669809, -0.062554945418906743, -0.1187078977577844, -0.23511892751228033, -0.064665418468805788, 0.057283952975166051, 0.14850320507536743, 0.074518551996532748, 0.14775664020163706, 0.0020829156573371555, -0.34047455883436323, 0.16529753202987046, -0.22056405751825445, 0.29537350362174863, -0.30727693305691484, 0.17130544619864224, 0.097926711565602301, 0.43706544906097711, 0.12813917376287753, 0.055902479292622584, -0.14580799486104357, -0.18662643567548898, 0.13091343010011883, 0.03346270256516358, 0.062891439826322837, 0.030406089689394671, -0.027232120122529239, -0.037974760198136892, -0.069443551113326632, 0.0066344290522653612, -0.14235450986309153, -0.22838873802708684, -0.2029739889926063, -0.011606155190393872, 0.032057043772551565, -0.021982682491265355, -0.097053178020474681, 0.088550664314818187, 0.053090482149624633, 0.13925876777248047, 0.063513516552260146, -0.054278095118517826, 0.08538415672805795, -0.21793581355625447, -0.077110294424558939, -0.15760636776309189, 0.074489797691215873, -0.057241994101257694, 0.35758313393883939, 0.19352665675464989, 0.25884721081868634, -0.095362679574154757, -0.062555070152259029, -0.050600401411129904, -0.04581555915567774, 0.095997178609832215, 0.0179504255888953, -0.029984980792924155, -0.15600995797322956, -0.13441036107213314, -0.16443500436191227, -0.20011010622694014, -0.1185676848060674, -0.38277205043588519, -0.22544536191476122, -0.18438213782554774, 0.19372413199270522, 0.11219308206942717, 0.25982980909746933, 0.078859657281328127, 0.23113762225192824, 0.12027128091306288, 0.03925026108281611, 0.10346450949096535, -0.11153460033842286, -0.078325720975578092, -0.16362595169702793, -0.049162011568201006, -0.06813688020407746, 0.18695930341705305, 0.15059247824175628, 0.27424888872344572, 0.14323623171577923, 0.0044347552049957819, -0.11996255351778637, -0.068558023511484198, 0.023032548262321723, -0.010426074631633324, 0.05035409898656467, -0.11095078972724633, -0.35469216713625396, -0.38858095560717304, -0.43659704639067964, -0.48811475177501651, -0.56772102070325836, -0.42759360787810491, -0.34349774583431025, -0.089250558912845224, -0.017255660868053985, 0.28929558460304938, 0.20633977154543065, 0.49525043110711575, 0.30490326972545867, 0.15907734702039197, 0.18083894269546641, 0.0069359534603191542, -0.048745778368166057, -0.20974664985683683, -0.11713478908555536, -0.18510515801561447, -0.013089808045645399, -0.0081310228529865667, 0.25176222061000281, 0.2693946687392072, 0.27370819742589902, 0.0067102091687078758, -0.064697981434012536, -0.12347320818582255, -0.049391580905336498, 0.11832252230060807, -0.17268517789922963, -0.32589261306509937, -0.639287914168712, -0.72192603666395261, -0.70207820166905555, -0.61232760985457479, -0.44353340330746277, 0.019538834540299969, 0.047502831671299713, -0.041738811618788646, 0.28620163890052958, -0.19764870263775797, 0.80219655994233652, 0.62892221563015416, 0.38953231590523568, 0.37886779576331475, 0.14774431296436413, 0.094413661460632833, -0.073411101811453133, -0.16021249355536557, -0.19593247304968892, -0.081650775970513151, -0.035818571775193361, 0.021291149638310077, 0.27454988477748077, 0.46071517851603194, 0.34339582552475939, 0.10294245821665464, -0.15104410911941546, -0.11912886110102075, -0.1113610452824651, -0.099114502229341719, 0.023349196100618572, -0.80611388127400851, -1.0763583447726097, -0.8168297825020715, -0.72603823847118742, -0.39736821511961523, -0.23386297177233123, 0.4703174557375292, 0.25096233231074278, 0.31922838969310624, -0.25991967791422005, 0.34193161983249054, 0.51711748874534202, 0.65455151443419168, 0.83215952955458772, 0.34065461819243747, 0.21354052285348993, 0.054409237913707532, -0.051414766220484194, -0.24129551707937194, -0.18021017930700467, -0.16649307508903324, 0.02611995380449984, 0.0088882269741778191, 0.49992842173391339, 0.57482956329523827, 0.51044075389218102, 0.13304644121698647, -0.089227696371110179, -0.21628766080628836, -0.18555506064923225, -0.27054447491545125, -0.68824563709364495, -0.56391746646770291, -1.3448759333642519, -0.90801354560554559, 0.072866201802841646, 0.18073895078348665, 0.55567065990800857, 0.39381772120025821, 0.59242819035998318, -0.05022415004119711, 0.11181138224479518, -0.31028937719203997, 0.3708105687152074, 1.1972380302487284, 0.6479171630934083, 0.5970258341713901, 0.23406484190569171, 0.1494250432975659, -0.10460468586388726, -0.29172235696712562, -0.38132345964412656, -0.02584515038199919, -0.36234031342997136, -0.0035984972735878563, 0.484844809780835, 0.76596137582741564, 0.56172135236794307, 0.32646969875093934, -0.19592809956107882, -0.23669588269358457, -0.32125288047075495, -0.35097323483886461, -0.92868491010645182, -1.7089894615168075, -0.39428020304678818, -0.15776662530084981, 0.38954314931717637, 1.1161873115341048, 0.59264738582705467, -0.5562024927443876, -0.99489496750979078, 0.9608676869506646, 0.92308378001124303, -0.4139391942136339, 1.3089140888320632, 0.78636343748881332, 0.71583959398165975, 0.45156398868756092, 0.30146681989019147, 0.20254250312507779, -0.0025274006864056797, -0.19201780058118689, -0.20404659434537004, -0.25925756638025355, -0.31672382746446043, -0.31172559850957088, 0.38747270801190198, 0.95200274282556019, 0.72646685328099436, 0.2788747346508717, -0.17968537990931685, -0.3258415080143367, -0.43315407205711348, -0.64132619327207141, -1.0499886203647348, -1.7251253398279605, -1.5120873610545145, 2.092671402110029, 0.678333420527655, -1.3908581394378237, -0.14065731983379445, -0.704649079609032, 0.40038203546320611, -0.28960616895899161, 0.94969408752542028, 1.2068396187631385, 0.4671902772630277, 0.59380988893293563, 0.44061350110379105, 0.30971168558439566, 0.13217055914433939, 0.084780328674454217, -0.042892010327952576, 0.029004083819250629, -0.14047533322535441, -0.16292155588890503, -0.50836195321575572, -0.15753196960053273, 0.022795944141262008, 0.83366315887402342, 0.78917379441409119, 0.67355449112521315, -0.2295941880121686, -0.24948129249626083, -0.45897332874859181, -0.65550663858936065, -1.2736175855462932, -1.2398159392319503, -0.73118573872941783, 0.68147470897196305, 0.68403615276129381, -1.4576264955235338, -1.6446564981157907, -1.587130770095007, -1.361280962925294, 1.044628248920846, 0.96909874957635356, -0.14162995430492481, 0.66911279151523617, 0.32234943120999365, 0.34963232308526704, 0.244105606577141, 0.16281560265463482, -0.014269719747667968, -0.011846708470826806, -0.18933865423621368, 0.017829624121361812, -0.97302526020811309, 0.059393044635753067, -0.20250391456577049, 0.6602817924610479, 0.54316838647960974, 0.76213554623441593, 0.36502835420313695, -0.082930104064008442, -0.29266755430530383, -0.30043904784973247, -0.57334259680943656, -0.83104911233797829, -1.039352345059011, -0.28395441021550044, 0.84090846562801602, -2.9317402483699175, -1.2603198064423498, -0.5637011092588653], \"height\": 32, \"width\": 32, \"top\": {\"real\": [7376.2586563979694, 2820.8522261533344, -5690.9497085395169, -4380.4513376296127, 388.6547315083493, -903.73852292232903, -92.233688854560938, 42.706854165930984, -25.699252344104405, 18.326281263011424, -9.8542387499157442, 37.933510453511431, -7.8666684309670254, 29.305075180843883, -62.728617354661907, 59.853240627388928, -83.636374399044939, 59.853240627386725, -62.728617354660756, 29.305075180844177, -7.8666684309671826, 37.933510453511431, -9.8542387499160657, 18.326281263013065, -25.699252344104405, 42.706854165930693, -92.233688854557883, -903.7385229223205, 388.65473150834708, -4380.4513376296045, -5690.9497085395114, 2820.8522261533035, -14789.032757371706, -31341.185848117759, -11739.029695619593, -866.78466658113393, -286.68893204831016, -488.33133225087568, -120.74864963582691, 33.024718339611894, 4.6010715329524166, -5.4456740109959769, 4.1139030671062393, 6.8633911029603265, 13.634662924808397, 1.860738389345556, -0.35796846682150263, -16.625069210775109, -14.807142725465134, -11.664010623894898, 0.82076815557037341, -12.155673848711613, 29.148348103795893, 15.708115389403888, 15.457503110539639, -12.683126140048403, 18.961120931859309, -53.601071866945205, 34.13442733448511, -942.72760774202175, -816.05094481379797, -3798.5470080468217, -8876.4278731043305, 2890.8320511623124, -27232.421940549859, -15984.118662988652, -6745.5682223604126, -409.0173927639226, -42.225544009425754, -526.29225504527119, -49.325655652906178, -23.20435390028933, 15.630174176003303, -14.835941429972856, 6.4726407463551725, 1.9958373496876167, 13.291351981828791, -1.1889020916883648, 10.030112101155916, -20.674418420848429, -0.1180338988714332, -18.745207674116038, -1.9041291470929314, -7.8710994817942428, 20.385879097388031, 14.857882580655026, 16.950197274587541, -2.033086164989526, 25.446982376231624, -20.624592190095939, 89.303256695009566, -637.06671072120571, -1428.8365567175017, -3113.2951228079887, -8881.5889351276946, -20696.443600183225, -9007.3131796291163, -5346.3306090002807, -1439.1675666408983, -1292.5663502582722, -654.09944760377277, -301.70227472838963, -97.440927522083996, -3.3329385156017457, -8.2027965131620153, -5.7742639473870323, -0.51069538319854635, 6.6402880636318233, 8.0126520330591013, 4.0882931682311625, -1.5210347396074151, -2.2335756869246048, -2.3288001542285928, -8.1315470965115093, -6.9403489082507335, -3.6748649027980562, 4.5937507427443531, 9.4957008241539675, 10.21057060635477, 11.676825499792781, 23.758858737501662, 20.288236987689611, 20.969766857125101, -333.51324485695324, -810.1584353673162, -2278.6820540988888, -5194.4090916202094, -7188.339898707115, -3154.0647285180166, -3175.2001764803263, -3085.2108289353805, -1226.2977859942123, -836.26206181721784, -301.22169990911055, -15.123294918373254, -11.324269109892445, -4.9992210979693361, -6.7152536525607003, -1.7063097661780617, 2.7727430774894133, 7.1357881321682148, 4.8669904821248817, 2.7536893948953045, -2.039934630711028, -0.54898928719761031, -2.9485150656567436, -3.1026085263061316, -1.3614545093317587, -0.47304719477880164, 4.0409079710738931, 6.2483313015723709, 8.8540252326547968, 18.802141623354618, 24.681352644731625, -6.1114787305120313, -148.49350684902615, -572.34886359995278, -1663.447165744248, -3308.6059534728529, -4493.8282478995061, -3720.0991836319017, -3323.4413322476125, -2223.3326338682518, -1347.5218927383742, -402.86472873295924, -179.07785660663581, -42.171627369153548, 13.024576486879551, -6.680339136637107, -4.3910663300422375, -1.9843645852297727, 2.2081255979025864, 3.4357055351949564, 4.8667397989738959, -0.0088018165553918268, -1.2900498248809058, -2.2230696316747851, -0.79613102395178958, -2.1003135650570957, -0.12607857026311342, 0.39928478103703097, 3.6189445517483683, 5.5230847011321824, 8.0807144322734796, 9.6537837209938342, 14.647883903859292, 41.761171107733581, -2.5048396429986766, -288.68438568639834, -1058.7748743456032, -2111.6481404168812, -2853.5518466904464, -2206.4742388833251, -2207.4882969003411, -1427.0600295974209, -607.97311048711572, -283.75431628355585, -25.222873313531675, -11.21903778037437, -8.3653822807976148, 1.9503276148055415, -4.8653324939916756, -1.0558165909594248, 0.18037835028025548, 3.7232300368774149, 2.6260151255238955, 1.901747650437611, -2.157984497724208, -1.9174482807780493, -2.671365924063863, -1.6822520344543337, -1.7835969801453151, 0.50013744114287995, 2.3612666445612516, 3.9892729615099713, 5.0282597338489978, 4.3849613992965208, 7.5675449146459712, 26.738330274504211, 30.293009711209869, -72.365238046453968, -397.03998761961856, -1129.7740740979677, -1877.1475049531305, -1015.8170093531105, -757.33856581211364, -464.04986763483271, -221.8093865245269, -66.670140953208971, -32.688631361988044, 12.245388279073117, -2.09491941357581, -4.9214217924247272, -0.76863227802399692, -1.3611346863617457, 0.59203001318831738, 2.3940543871676745, 2.1386535528573569, 0.12698658321630202, -0.36055346759858353, -1.509631760657328, -0.37490601010058217, -1.4076418772333708, -0.9909556252137327, 0.025704615807234758, 1.7006413859335137, 2.4101241863335301, 2.7230446482899899, 4.8975474263529586, 5.5799176422335819, 7.3823613929523022, 3.3531473980019464, -7.0947231292717241, -129.95057654055665, -447.33256260550814, -801.49855315264267, -297.71280467242298, -206.25666421819534, -105.85720001872387, -40.587336797783266, -19.033005269759897, 0.68623525685047748, -2.224754122223199, 2.8686428937153541, -1.3772856826259623, -3.7001182860738422, 0.56033030111271653, 0.31649576481826269, 2.6435570864758695, 2.0729019173667451, 1.3896745329326239, -1.1733083260901866, -0.5564284933709801, -0.75319429727185228, -0.16542223594150865, -0.34981510145177358, 0.63947101827441399, 0.64495136714903334, 1.5357324193076427, 2.8130362926385226, 4.2845415972556511, 3.3415574201637508, 1.8747628167747612, 4.3092019872505318, 1.2280777000161127, -53.113548920223614, -153.12296297306594, -262.59106890839882, -78.507966752468647, -44.713956729763169, -24.503242066462356, -11.422688403833899, -6.8324882374101472, -1.9389416594991726, 2.3416848160301655, -1.9581076589813595, 0.65441624739147974, -1.6215192060328243, -3.0886268279599727, 2.5574024719687731, 2.5859312055320047, 3.582324284715654, 2.3851708003164411, 0.41148866509477899, -1.7870448740379692, 0.35867475608513461, -0.33833230756510146, 0.72134917870519866, -0.6451343286468626, -0.036676325952571386, 1.8806785141996829, 3.0459530955995717, 3.0361534846987768, 1.8248078988499765, 2.0278729258957484, 1.4298438030821454, 1.444150632114136, -16.470770345398158, -59.038387406403551, -81.624687331130716, -41.65158074717607, -20.04858945819673, -26.796686775361913, -13.274828683787613, -5.4849410264677898, -1.7682797425272327, 0.51276950901621554, 0.11701161368370352, -2.1525887062494076, -0.35663258536781867, -0.3882693848937121, -2.5566610369397282, 6.5139128293303541, 4.1537964250038213, 2.1778507792771808, 0.67618078211604771, 0.67271760119275736, -0.033223712968477391, 1.7891382881043305, 0.76549003012129324, -1.8840461990319548, 0.62764371336603419, 2.9500669911593334, 2.7998549031057309, 2.7114466415734606, 2.640497491382968, 2.5087646302130264, 0.3613507110411972, -0.85975587552377708, -5.8993661554875496, -19.483874473281006, -46.656198806892085, -42.447185502078959, -49.475399988407517, -28.809040802191632, -23.364991274814315, -9.3720360014436217, -2.193549633075087, 0.73237790527535407, -0.60287176352488314, -1.0672361910519921, -3.8374461384037328, 0.81264916316705227, 3.7024783733454592, -2.2274307006673761, 12.171761179906976, 2.6484997231173142, 2.1242155181960216, 1.3916869062247985, 3.2969221728544564, 0.14147762112210061, -1.2659388719629114, 1.2983452624583423, 2.4646463691490883, 1.8819178233751466, 2.4699197782172551, 3.4105600445409938, 3.476877662739366, 1.970602508408192, 0.54569379437115284, -0.61503488296082265, -1.584537886719974, -9.9108851118855448, -17.968893142628509, 0.83280248396047341, -16.804391379900096, -34.94566909960443, -18.287776152890835, -10.19076861522101, -2.3659355754892188, 0.38430207827148843, -0.39175809943359002, -2.0786620762717161, -2.1066158183404973, -4.0664292874937455, 5.1056392812224729, 9.4711485160420441, -2.577327881134023, 13.563457368659881, 5.4454444116217209, 3.0810071966308192, 3.71409458782056, -2.7028450063821525, 1.3893389983926554, 5.0295677911697716, 2.0512141006459763, 0.57687440104333121, 3.1399874906463121, 4.3044361492909653, 3.2286926050373941, 2.0294536549063102, -1.2648718051872285, 0.81982278416560761, 5.1937461344056883, 4.5660530070978913, -2.5751982814314349, 10.842808636227273, -2.7634934625905125, -4.7410363255116081, -13.231297049532179, -1.2392069417375811, 0.57695677140757395, 1.6572428400911725, -0.80487566941313171, -2.1976406054664008, -2.9337382106235617, -0.97696074341019468, -0.52039830113476337, 8.6932746740913363, 18.008772340009436, -6.3894706762347742, 16.656214263229323, 5.6480128145892756, -2.6420757676626341, 6.9832538798624686, 8.7117753152913409, 2.944231966553327, -0.4194257648970201, 1.9464964791115495, 2.8117062685871983, 3.586606822562346, 3.6410340078674697, 2.1750438821370093, 0.92746135521083628, -0.10515597578954901, 10.916870623975495, 22.695665816423684, 26.922229107827643, 56.766547106622895, 34.346379481364103, 8.0209890672230593, 4.2276867493724737, 2.0129650120803855, 4.5721973792850843, 1.7026114564114816, -0.10193290249876912, -1.9877285465951933, -1.4091416884493304, -1.0407935339809435, 4.6927135104950821, 4.461866465996299, 13.14685287043932, 23.490161756370188, -8.5448676586843408, 5.7639040157862622, 6.7103974452754578, 11.090643871879529, 8.6117964749879281, 0.95828374077, 2.8859143014026349, 1.6803595914225926, 1.5724318132354216, 2.3664842485474589, 3.3844724421254813, 2.8754034241014996, 0.81420697505183059, 3.4592633965370854, 8.5418678989119741, 26.408180301615612, 46.472433795130719, 15.748155014076561, 18.939305693948317, 18.355423454953527, 7.4385947937208252, 6.8421582395566496, 3.8284829441665011, 2.3084513014265475, 0.014383588041353481, -0.70170837590258439, -0.9519271341888802, 0.60488638387036897, 4.7316501322768225, 11.640012070252736, 11.084534895769892, 7.9427552323827459, 17.090358547431578, -4.0062765415124373, 18.903471314461139, 10.522914852414784, -0.31727085194714888, 8.1914062421872558, 5.5678768421215832, 1.9515757898119943, 0.13204460835173984, 0.94686979396028259, 2.2566984460298456, 3.5582629306092612, 2.7150237945754423, -0.038191379039643265, 6.3090662882758242, 18.822434458740766, 20.387061197767007, 34.210424610695611, 25.78016711295075, 13.422328957688888, 4.2578162502068047, 2.3122896178400203, 4.1892680028045364, 2.2592478817037658, 0.95372259584702335, -0.47653425908969432, 0.069240128911087023, 0.91781179579556105, 6.6018505246928774, 10.152138543237006, 11.530381877152177, 5.6211304516254526, 4.7909070280413646, 35.867989503906792, 4.7909070280413584, 5.6211304516254428, 11.530381877152157, 10.152138543237017, 6.6018505246928978, 0.91781179579556504, 0.069240128911081333, -0.47653425908969432, 0.95372259584699437, 2.2592478817037476, 4.1892680028045142, 2.3122896178399985, 4.2578162502067478, 13.422328957688848, 25.780167112950689, 15.74815501407811, 20.387061197767874, 18.822434458741888, 6.309066288276548, -0.038191379039562191, 2.7150237945755555, 3.5582629306093274, 2.2566984460298958, 0.94686979396029702, 0.1320446083517558, 1.9515757898119841, 5.5678768421215636, 8.1914062421872096, -0.31727085194714522, 10.522914852414772, 18.903471314461111, -4.0062765415123884, 17.090358547431556, 7.9427552323827513, 11.084534895769902, 11.640012070252746, 4.7316501322768385, 0.60488638387038995, -0.9519271341888812, -0.70170837590259716, 0.014383588041281273, 2.3084513014264751, 3.8284829441663635, 6.8421582395566762, 7.4385947937204353, 18.355423454952824, 18.939305693949098, 56.76654710662406, 46.472433795132453, 26.408180301616227, 8.5418678989122103, 3.4592633965371484, 0.81420697505187978, 2.8754034241015152, 3.3844724421254879, 2.3664842485474735, 1.572431813235436, 1.6803595914225982, 2.8859143014026083, 0.95828374076997469, 8.6117964749878801, 11.090643871879506, 6.7103974452754693, 5.7639040157862587, -8.5448676586843018, 23.490161756370185, 13.146852870439265, 4.4618664659962768, 4.6927135104951034, -1.0407935339809418, -1.4091416884493408, -1.9877285465952099, -0.10193290249882341, 1.7026114564114307, 4.5721973792850434, 2.0129650120803833, 4.2276867493724772, 8.0209890672234039, 34.346379481364394, 10.842808636228447, 26.9222291078285, 22.695665816424683, 10.916870623975989, -0.10515597578943024, 0.92746135521090112, 2.1750438821369982, 3.6410340078674537, 3.5866068225623455, 2.8117062685872063, 1.9464964791115584, -0.41942576489699973, 2.9442319665532848, 8.7117753152913178, 6.9832538798624677, -2.6420757676626758, 5.6480128145892872, 16.656214263229302, -6.389470676234752, 18.008772340009443, 8.6932746740913274, -0.52039830113473562, -0.97696074341019512, -2.9337382106235728, -2.1976406054664195, -0.80487566941320732, 1.657242840091119, 0.57695677140755675, -1.2392069417374179, -13.231297049531948, -4.7410363255113248, -2.7634934625894938, 0.83280248396082224, -2.5751982814309775, 4.566053007098211, 5.1937461344059415, 0.81982278416574916, -1.2648718051872136, 2.0294536549062832, 3.2286926050373275, 4.3044361492909653, 3.1399874906463054, 0.57687440104334498, 2.0512141006459621, 5.0295677911697396, 1.3893389983926545, -2.7028450063821756, 3.7140945878205622, 3.0810071966308161, 5.4454444116217395, 13.563457368659845, -2.5773278811340234, 9.4711485160420441, 5.1056392812224614, -4.0664292874937296, -2.1066158183405044, -2.0786620762717254, -0.39175809943363327, 0.38430207827145285, -2.3659355754891784, -10.190768615220893, -18.287776152890569, -34.94566909960389, -16.804391379899673, -42.447185502078064, -17.968893142627813, -9.910885111884598, -1.5845378867194357, -0.61503488296060749, 0.5456937943712441, 1.9706025084081269, 3.4768776627392723, 3.4105600445409681, 2.4699197782172639, 1.881917823375139, 2.4646463691490985, 1.2983452624583438, -1.2659388719629485, 0.1414776211221116, 3.2969221728544715, 1.3916869062248129, 2.1242155181960229, 2.6484997231173293, 12.171761179906973, -2.2274307006673681, 3.702478373345508, 0.81264916316704883, -3.8374461384037382, -1.0672361910520076, -0.60287176352493688, 0.73237790527531033, -2.1935496330750563, -9.3720360014434689, -23.364991274814056, -28.809040802191326, -49.47539998840697, -41.651580747175068, -46.656198806890998, -19.483874473280501, -5.8993661554872627, -0.85975587552355426, 0.36135071104124949, 2.5087646302129953, 2.6404974913828889, 2.7114466415734491, 2.7998549031056945, 2.9500669911593249, 0.62764371336605218, -1.8840461990319775, 0.76549003012129535, 1.789138288104325, -0.033223712968466615, 0.67271760119275215, 0.67618078211606658, 2.1778507792771671, 4.1537964250038266, 6.5139128293303603, -2.5566610369397242, -0.38826938489369667, -0.35663258536783948, -2.1525887062494129, 0.11701161368368215, 0.51276950901619689, -1.7682797425271899, -5.4849410264677143, -13.274828683787417, -26.796686775361572, -20.048589458196275, -78.507966752466459, -81.624687331128925, -59.038387406402052, -16.470770345397689, 1.4441506321142048, 1.429843803082246, 2.0278729258956907, 1.8248078988499317, 3.0361534846987319, 3.045953095599546, 1.8806785141996951, -0.036676325952591224, -0.64513432864685583, 0.72134917870519299, -0.33833230756510668, 0.35867475608511745, -1.7870448740379619, 0.41148866509475018, 2.385170800316434, 3.582324284715646, 2.5859312055320172, 2.5574024719687887, -3.08862682795997, -1.6215192060328063, 0.65441624739145521, -1.9581076589813555, 2.3416848160301531, -1.9389416594989646, -6.8324882374098541, -11.422688403833355, -24.503242066461048, -44.713956729761051, -297.71280467242298, -262.59106890839888, -153.12296297306594, -53.113548920223877, 1.2280777000160852, 4.3092019872504084, 1.8747628167747172, 3.341557420163666, 4.2845415972556511, 2.8130362926385151, 1.5357324193076258, 0.64495136714903156, 0.63947101827441044, -0.34981510145179595, -0.16542223594153913, -0.75319429727190634, -0.5564284933709801, -1.1733083260902135, 1.3896745329326132, 2.0729019173667376, 2.6435570864758655, 0.31649576481827513, 0.56033030111271809, -3.7001182860738244, -1.3772856826259623, 2.8686428937153425, -2.2247541222231662, 0.68623525685057685, -19.033005269759858, -40.587336797783074, -105.85720001872383, -206.25666421819477, -1015.8170093530997, -801.4985531526338, -447.3325626055032, -129.9505765405554, -7.094723129271765, 3.3531473980017035, 7.3823613929520073, 5.5799176422333412, 4.8975474263529168, 2.7230446482898696, 2.4101241863335168, 1.700641385933505, 0.025704615807253747, -0.99095562521376346, -1.4076418772333852, -0.37490601010063784, -1.5096317606573337, -0.36055346759863915, 0.12698658321626774, 2.1386535528573165, 2.3940543871676701, 0.59203001318833959, -1.3611346863617075, -0.7686322780239524, -4.9214217924247352, -2.0949194135756803, 12.245388279073195, -32.688631361987156, -66.670140953207678, -221.8093865245236, -464.04986763482748, -757.33856581210489, -2206.474238883316, -1877.1475049531243, -1129.7740740979648, -397.03998761961947, -72.365238046453996, 30.293009711209137, 26.738330274503873, 7.5675449146456106, 4.3849613992964835, 5.0282597338488833, 3.9892729615099154, 2.3612666445612378, 0.50013744114287839, -1.7835969801453351, -1.6822520344543537, -2.6713659240639043, -1.9174482807780469, -2.1579844977242066, 1.9017476504375719, 2.6260151255238871, 3.7232300368773963, 0.18037835028033014, -1.0558165909593593, -4.8653324939915077, 1.9503276148055297, -8.3653822807973572, -11.219037780374073, -25.222873313530549, -283.75431628355437, -607.97311048711254, -1427.0600295974182, -2207.4882969003352, -3720.099183631889, -2853.5518466904387, -2111.648140416873, -1058.7748743456016, -288.68438568639789, -2.5048396429994018, 41.761171107733141, 14.647883903858578, 9.6537837209937827, 8.0807144322732913, 5.5230847011321327, 3.6189445517483261, 0.3992847810370409, -0.12607857026309263, -2.1003135650570361, -0.79613102395168645, -2.2230696316747758, -1.2900498248808734, -0.0088018165554208834, 4.8667397989738888, 3.4357055351949497, 2.2081255979026997, -1.9843645852296314, -4.3910663300419372, -6.6803391366371141, 13.024576486880093, -42.171627369152944, -179.07785660663302, -402.86472873295685, -1347.5218927383694, -2223.332633868245, -3323.4413322476003, -3154.0647285180148, -4493.8282478995088, -3308.6059534728515, -1663.4471657442498, -572.34886359995289, -148.49350684902797, -6.1114787305125393, 24.681352644731046, 18.802141623354593, 8.8540252326545641, 6.2483313015722262, 4.0409079710738718, -0.47304719477879342, -1.361454509331699, -3.1026085263059842, -2.948515065656593, -0.5489892871976132, -2.0399346307109321, 2.7536893948952148, 4.8669904821248942, 7.1357881321682211, 2.7727430774895763, -1.706309766177841, -6.7152536525602784, -4.9992210979693477, -11.324269109891496, -15.123294918372496, -301.22169990910822, -836.26206181721659, -1226.2977859942089, -3085.2108289353782, -3175.2001764803231, -9007.3131796291, -7188.3398987071041, -5194.4090916202022, -2278.6820540988915, -810.15843536731495, -333.51324485695591, 20.969766857124615, 20.288236987688347, 23.758858737501669, 11.676825499792164, 10.210570606354567, 9.4957008241538698, 4.5937507427443718, -3.6748649027980855, -6.9403489082508045, -8.1315470965115626, -2.3288001542285697, -2.2335756869247856, -1.5210347396073984, 4.088293168231135, 8.0126520330591262, 6.6402880636320099, -0.51069538319843244, -5.7742639473864941, -8.2027965131620455, -3.3329385156007563, -97.440927522082632, -301.70227472838576, -654.09944760377232, -1292.5663502582681, -1439.1675666408923, -5346.3306090002598, -27232.421940549855, -20696.443600183229, -8881.5889351276946, -3113.2951228080024, -1428.8365567175017, -637.0667107212123, 89.303256695008088, -20.624592190099609, 25.446982376231595, -2.0330861649905447, 16.950197274587225, 14.857882580654767, 20.385879097388024, -7.8710994817946256, -1.9041291470930921, -18.745207674117459, -0.11803389887143546, -20.674418420848326, 10.030112101155776, -1.1889020916883362, 13.291351981828802, 1.9958373496879209, 6.472640746355359, -14.835941429972186, 15.63017417600328, -23.204353900286776, -49.325655652904786, -526.29225504526619, -42.22554400942483, -409.0173927639147, -6745.5682223604063, -15984.118662988625, -14789.032757371675, 2890.8320511623242, -8876.4278731043305, -3798.5470080468367, -816.05094481379706, -942.72760774203016, 34.134427334482538, -53.601071866949361, 18.961120931859348, -12.683126140049515, 15.4575031105396, 15.708115389403696, 29.148348103795954, -12.155673848712381, 0.82076815557010951, -11.664010623895932, -14.807142725465098, -16.625069210776097, -0.357968466821102, 1.860738389345522, 13.634662924808296, 6.8633911029604313, 4.1139030671065999, -5.4456740109950088, 4.6010715329523864, 33.024718339612249, -120.74864963582446, -488.33133225087175, -286.68893204831085, -866.78466658111245, -11739.029695619576, -31341.185848117751], \"imag\": [0.0, -38758.087655514835, 17548.085047269142, 6107.2151726624015, -1874.673387120311, 1102.4198144208276, 70.663498597697227, 246.50443360377355, 15.094404836632346, 61.578388193120794, -6.883850379905633, 17.433253862249003, -27.182352905748338, 10.205627484635695, -57.631165788617082, 3.5978635789949243, 0.0, -3.5978635789944389, 57.631165788617331, -10.205627484634785, 27.182352905748068, -17.433253862248129, 6.883850379906236, -61.578388193120603, -15.094404836632346, -246.50443360377048, -70.663498597698691, -1102.4198144208278, 1874.6733871203112, -6107.2151726624097, -17548.085047269135, 38758.087655514864, 21415.511526704078, 9240.4816801838842, 6140.0706338628515, 4606.7423967050836, -477.33409412636456, 106.10534760670754, 253.85827683649731, 118.670471872242, 60.852179067446961, 22.790809731222598, 16.992665274593527, 3.3051410229913314, -11.158748163655874, -19.125680216300069, -12.454719286949617, -13.739274709476872, 4.4649861577324996, -1.4030381833900449, 28.352674755287939, -0.67900523797834378, 10.299898240809684, 0.92198929608587377, 1.7353747463970652, -28.921613512340663, -62.077231813228479, -150.50951383829744, -214.24479740751684, -816.21574466320703, 274.1353961963593, -3254.3286688062722, -6340.0761451284025, 11789.651384311641, 10840.701965194425, 18380.248977426931, 3231.3822724351476, -461.44982475214084, -210.28695062763435, 162.42212696600188, 179.30887547689923, 113.80000983072934, 43.394725496932487, 24.59548477602943, 9.5064435172576207, 6.2249226907652995, -15.514190495563678, -15.67209469704693, -16.179758937655365, -0.44183444538403649, 3.28796177703477, 12.57005414423841, 4.7947040656811843, 5.5752197676029693, -1.566994278876134, 3.0671728952871886, -9.3006029966239439, -19.205045070959127, -56.939768493357462, -104.59324045979437, -209.92149032340299, -248.20433151041027, -867.92363746103479, -1299.0888976028032, 827.61688284819274, -3453.3010516440099, 2184.1299326736716, 343.81610498084558, 1430.9649107108667, -397.20604751762147, -695.96261474413006, 272.38382351444113, 181.43163787734565, 64.570588674311324, 29.183435066681643, 16.420203889130576, 10.051165980763317, 3.8132998567254699, -5.2200576234926608, -12.843645059741645, -16.574215370008311, -6.8948411718648668, 5.7853993354930253, 6.7615499928711884, 6.3258793363865982, 6.2779141420300757, 7.316455816584333, 0.11325917153592484, -12.472105947256997, -26.315486653091728, -48.315266721271882, -96.05176533673017, -133.18984159990899, -353.39952612993443, 150.90670251969735, -622.62775933130001, -1461.5017842629939, 2621.2839732861958, -797.42142339187535, -1141.9271710506443, -1665.2932495998289, -238.3366310615267, 49.923170262409073, 61.506465075545492, 153.25086116745172, 46.446591336114025, 13.171326963991907, 10.42525251508628, 5.9093841314446687, 3.7481817410606739, -5.009304162269796, -8.3377118534842136, -11.383176063308646, -7.2904568591879206, 0.055102663998529922, 6.2100452165049633, 0.50258781153530074, 8.7133201843540995, 8.0099491969619425, 3.408178127748358, -6.1241971022028396, -12.736128845291272, -45.232132533425755, -61.3791750629996, -153.42214558232837, -67.595097514570796, 85.625899103861244, -58.961155821254636, 56.883206971067992, -1105.7125877167775, -1066.0901100808514, -1171.2701320923616, -223.1510166903665, -49.090655504704266, 242.13940044346495, 187.57398243385657, 37.630624824958112, 28.849867481961542, 8.4569554634773265, 4.9702839577388582, 4.4028115702250554, 1.4310556478305501, -1.929060150422355, -6.8702061592831818, -7.5557834297932249, -6.2828152868831211, -0.10870593803434039, -0.35173698335235887, 2.5520560959229499, 3.0896458550054593, 4.7505220002799033, 1.2377659738692817, -1.7806530124299274, -9.1879671692559626, -20.164632449396379, -65.591240653702698, -60.869480400000917, -62.271759486118263, -69.04223895420877, 113.44009243151515, -280.24622279593513, -361.29505764988915, -32.2389038646619, 397.42763261597736, 412.9673372382922, 359.76401050336045, 192.6210800054142, 122.25882006598455, 49.109708531705785, -0.83416770813231356, 2.4803036198391495, 2.5045331182816137, 2.1157075816863125, 2.0456835555591151, -1.3319639541688315, -4.1057658132159602, -5.2622609905014679, -3.122429370817716, -0.23490025627283884, 0.40862649299968534, 1.0190926814192749, 2.6652215067301066, 2.3902937959311288, 1.3072901204360872, -2.1976906085986245, -4.7205289930149936, -17.964658686821839, -21.918559933832515, -40.854552179344822, -68.24351076369831, 25.856495589804037, -73.74721318359471, 26.189735785049756, -56.726426890704197, 461.88238037931336, 400.36625478870423, 367.42140066372616, 233.95717316464078, 120.24788693419019, 56.86229814651989, 16.528423808469729, 5.5081763037408891, -2.7285347510623343, 0.91768473485835012, 1.922818700657754, 0.85878662181529319, -0.082031723657331246, -3.1986596327501684, -2.7995613930163934, -2.624028681216124, 0.082235364558318216, 0.13384423623927519, 1.9947594371394528, 1.3437508199980643, 2.6398410865992954, 0.73758290379789837, -0.13078900915043976, -4.4953343292506398, -5.1950335909144894, -13.12242317098767, -25.523369493146305, -12.192196214097944, -25.868477512213353, 2.9066782920883432, 34.106574161015573, 256.00130492151595, 208.58597838816522, 310.3347945923577, 177.03891975992664, 97.122360992021001, 48.488510187113192, 24.528917872852549, 4.6272034575157122, -1.3571647909533122, 0.20621269482631011, -0.40867746076362715, 0.99215767258594889, 1.5313768256641691, -0.052772985639764861, -1.5552847934304939, -2.8318141898835965, -1.44106038161314, -1.7221472209588695, 0.61786747800524422, 0.48048213041449506, 1.7161555169971148, 0.88689757979195871, 1.4761658864245926, -1.7252645996654892, -0.81528783024945528, -3.3158091950668926, -7.6513645380807835, -2.9281859927886749, -12.462674546124116, -7.4696827367159715, -23.236903073402107, 43.7319836231637, 92.321882041990349, 70.117668379783737, 34.226649356314077, 47.258739472197036, 25.375797504306092, 12.406583490274283, 8.6535618432690811, 1.0747519793409035, -0.44324044078252567, -1.7584707522262704, 0.72458607165998101, 0.70692065864217946, 0.77076345191259166, 1.0649069250197341, -2.7261985428418192, -1.9302074459527443, -3.3754250277859401, 0.50673349306549698, -0.64031672309299725, 1.374850007673434, 0.72950552648490297, 2.3325303094340692, -0.9986473214357906, 0.78195787446934228, -1.1999635798104886, -3.4858876190620522, -1.4991310089769327, -2.8433755069243221, 3.7638952884372583, 1.2400980139632869, -2.9542792497780144, 1.8234355680479359, 49.576244746235467, 19.014215780516388, 30.877310974744532, -1.1221271518157558, 7.8208026967228905, 2.609067592037944, 1.2521971880796572, -0.99505064345958283, -1.3975466814991453, -0.57338407820284554, -1.8697004151394911, 2.3700280505641378, 1.696784850403636, -0.61519740478736618, -1.3317994275810727, -4.2071746247346917, -0.85834734780410316, -1.4672332071937433, 2.6381100233578914, -2.4176769851497171, 2.0131074000190821, -1.6262628596018911, 3.9814331515508763, -0.027677673297514374, -2.444607041276003, -1.6150024285043403, -4.1227589144067673, -1.7068861549694658, 2.2919486155920237, 12.185386506158462, 9.103962312567619, 7.1597604706792799, -5.4087151249860161, 0.96974162117579055, -11.947201833901593, 6.6330620252490986, 2.1152085218133552, 3.546929348907518, 0.62283616740311709, -1.3522725353705505, -2.4444202103018355, -1.5690941230144015, -0.0069858778603680161, -2.2282653754616524, 3.8284308308873771, 3.1912913728027457, -5.5805618725494135, 0.13049495818795365, -3.5197176720292105, 1.8802124921714005, -2.6189977871286096, 2.1235611153433935, -7.1463089769422359, 4.7729314123471731, 2.1077672614040215, -0.81910125894631813, 0.72052624692713507, -3.4842402749887631, -4.1829115306886377, -4.3994325344570067, 3.0953565929079909, 11.949390330752637, 23.680136621529911, 21.558658775121675, 22.744598059672118, 24.943328767928129, 28.901352722188449, 12.814680673201753, 13.644932734111247, 5.45768556544121, 2.4025753394703617, -1.1673355625318591, -2.4971924284976894, -1.8952846661475429, -1.2927419412763479, 2.7902732019969552, -4.3477010834394934, 3.7423253621601038, 4.3959804108055893, -8.9257994152947724, 2.882370251254919, -5.0577698714645729, 3.1829717367300585, -13.324209534416688, 6.2785045354550411, -0.87489834284363188, -0.85263104321571348, 4.4885662153073236, -0.53110232172652128, -1.6389132121610095, -4.3945543864166812, -4.2936344828625694, 0.48745205753098192, 15.895360345460416, 25.169617383292081, 33.918445473292621, 23.996907911576923, 23.251277269359601, 5.1543156647143702, 18.554102826608389, 16.359265688234956, 10.231244633613841, 1.5587865083621433, -1.4683911434431964, -2.958105786087343, -1.5689869488245065, -0.96051225634847215, 1.7578951205789273, 6.6638352938822507, -9.4901775499106478, 4.1317473271038834, 10.951455398944859, -15.360897164532773, 5.739294741971535, -17.045217645164048, 5.8449684444103616, -3.5521886878464675, -7.3858280585812945, 5.7347340895196259, 0.4908832539545151, 0.98666637905349674, -1.0149409800154179, -1.6832477381822215, -2.5467748158366237, 2.0904065823844138, 13.443724261124899, 31.761133485201317, 33.671186166611122, 40.707191608760652, -1.1509826127936451, 21.096779572504321, 10.924705320167561, 7.3688776104039446, 6.4733533392666498, 1.1232923919614803, -2.4431302941492752, -2.7804484266994756, -1.6225398299131664, 0.6478030911844409, 2.5793951871330139, 3.1124056384095988, 9.3832743597685244, -14.195954313031031, -0.57608988546761064, 19.479390479219269, -31.200338855208866, 14.100113777774123, -5.3856662644378392, -10.946378631138824, 4.4142064356850845, -3.9066652322250062, 0.66844910598604979, 1.0227755630951001, 0.66137538568075327, -0.38567118503773246, 0.24821124990411303, 3.5872841231435211, 14.053276636456639, 24.260931372233497, 33.647459095648763, 7.6529271231588307, -9.2151377078706354, -38.311665858686638, -16.121399661234683, -5.9927868178298498, -2.7701365304211771, -3.7140088945870469, -3.0788396721523017, -3.0904878618769733, -1.8655827999533823, 0.43690140001808947, 4.1561194908680763, 4.3858952392085353, 2.7714027971729753, 9.257895969243517, -19.629364588289473, -14.072043519544888, 36.373196183604975, -13.61372365841147, -9.4583423311161248, 8.5284583277520429, -6.1744651457950592, -2.2310052363098367, -1.75629520897435, 1.1539693350814639, 1.7596902661237352, 1.8196834579374304, 2.022290334087173, 5.1646829084835781, 12.770276815017757, 24.46979490512981, 27.822785449092486, 29.828540342091252, 0.0, -3.7653763488297254, -24.757305904406468, -19.738984856989376, -8.2664619761594462, -4.6495144591838038, -3.656340919703911, -2.9147641885479052, -2.2830188616483764, -0.10916825448095578, 2.3916977668177819, 5.941240494184604, 2.1224657474819093, 3.9401472638367774, -2.1445277323266949, -10.774805376941604, 0.0, 10.774805376941531, 2.1445277323266829, -3.9401472638367951, -2.1224657474819155, -5.9412404941846173, -2.3916977668177926, 0.10916825448094437, 2.2830188616483764, 2.9147641885479065, 3.6563409197039234, 4.6495144591838136, 8.2664619761594498, 19.738984856989411, 24.75730590440644, 3.7653763488297773, 9.2151377078736516, -29.828540342087546, -27.822785449090652, -24.469794905129369, -12.770276815017642, -5.1646829084834636, -2.022290334087153, -1.8196834579374237, -1.7596902661237566, -1.1539693350814775, 1.7562952089743382, 2.2310052363098212, 6.1744651457950415, -8.5284583277521193, 9.4583423311161194, 13.613723658411436, -36.373196183604932, 14.07204351954484, 19.629364588289484, -9.2578959692435348, -2.7714027971730033, -4.3858952392085584, -4.1561194908680932, -0.43690140001811473, 1.8655827999533605, 3.0904878618769729, 3.0788396721523177, 3.7140088945872396, 2.7701365304214618, 5.9927868178306163, 16.121399661236502, 38.31166585868818, 1.1509826127964509, -7.6529271231568821, -33.647459095647825, -24.260931372233326, -14.053276636456571, -3.5872841231435073, -0.24821124990410889, 0.3856711850377551, -0.66137538568076071, -1.0227755630951023, -0.66844910598607266, 3.9066652322249751, -4.4142064356851165, 10.946378631138813, 5.3856662644378339, -14.100113777774116, 31.200338855208855, -19.479390479219351, 0.57608988546757856, 14.195954313030994, -9.3832743597685617, -3.1124056384095939, -2.5793951871330338, -0.64780309118445645, 1.6225398299131557, 2.7804484266994689, 2.4431302941492916, -1.1232923919613498, -6.4733533392663958, -7.368877610403441, -10.924705320166419, -21.096779572501951, -23.251277269357679, -40.707191608758833, -33.671186166610063, -31.761133485200901, -13.443724261124748, -2.0904065823843769, 2.5467748158366237, 1.6832477381822348, 1.0149409800154132, -0.98666637905348697, -0.49088325395452825, -5.734734089519665, 7.3858280585813008, 3.5521886878464564, -5.8449684444103243, 17.045217645163998, -5.7392947419715155, 15.360897164532778, -10.951455398944907, -4.1317473271038754, 9.4901775499106655, -6.6638352938822702, -1.7578951205789377, 0.96051225634844795, 1.5689869488244914, 2.9581057860873381, 1.4683911434432237, -1.5587865083620118, -10.231244633613667, -16.359265688234554, -18.554102826607274, -5.1543156647129926, -24.943328767927714, -23.996907911576475, -33.918445473292081, -25.169617383291836, -15.895360345460304, -0.48745205753098297, 4.2936344828625552, 4.3945543864167149, 1.6389132121610113, 0.53110232172653837, -4.4885662153073405, 0.85263104321570904, 0.87489834284363122, -6.2785045354550046, 13.324209534416719, -3.1829717367300314, 5.0577698714645702, -2.8823702512549096, 8.9257994152947653, -4.3959804108056124, -3.742325362160086, 4.3477010834395236, -2.7902732019969543, 1.2927419412763401, 1.8952846661475349, 2.4971924284976934, 1.1673355625318764, -2.4025753394703346, -5.4576855654411656, -13.644932734111133, -12.814680673201632, -28.901352722188015, -0.96974162117503315, -22.744598059671098, -21.558658775121231, -23.680136621529623, -11.949390330752514, -3.0953565929079563, 4.3994325344570004, 4.1829115306886644, 3.4842402749887649, -0.72052624692711631, 0.81910125894632069, -2.1077672614040264, -4.772931412347166, 7.1463089769422288, -2.1235611153433602, 2.6189977871286789, -1.8802124921713912, 3.5197176720292407, -0.1304949581879572, 5.5805618725494606, -3.191291372802759, -3.8284308308873531, 2.228265375461667, 0.0069858778603283057, 1.5690941230143916, 2.4444202103018267, 1.3522725353705702, -0.62283616740308378, -3.546929348907534, -2.1152085218133783, -6.6330620252487682, 11.947201833901675, -19.014215780515311, 5.4087151249861485, -7.159760470678993, -9.1039623125675071, -12.18538650615837, -2.2919486155920032, 1.7068861549694805, 4.1227589144067789, 1.6150024285043441, 2.4446070412760443, 0.027677673297527423, -3.981433151550863, 1.6262628596018724, -2.0131074000190696, 2.4176769851497326, -2.6381100233578612, 1.4672332071937413, 0.85834734780414157, 4.2071746247347095, 1.3317994275810989, 0.61519740478738694, -1.6967848504036496, -2.3700280505641422, 1.8697004151394931, 0.5733840782028331, 1.397546681499154, 0.99505064345958893, -1.2521971880796428, -2.6090675920379729, -7.8208026967229012, 1.1221271518159068, -30.877310974743335, -70.117668379782501, -49.576244746235311, -1.8234355680484657, 2.9542792497778261, -1.2400980139631994, -3.7638952884372125, 2.8433755069243154, 1.499131008976947, 3.4858876190620642, 1.1999635798105424, -0.78195787446931964, 0.9986473214357916, -2.332530309434083, -0.72950552648488864, -1.3748500076734225, 0.64031672309302556, -0.50673349306550342, 3.375425027785985, 1.930207445952772, 2.7261985428418698, -1.0649069250197167, -0.77076345191255435, -0.7069206586422051, -0.72458607165999755, 1.7584707522262737, 0.44324044078250502, -1.0747519793408324, -8.6535618432689372, -12.406583490274217, -25.375797504305602, -47.258739472196019, -34.226649356312784, -208.58597838816522, -92.321882041990833, -43.731983623163735, 23.236903073401958, 7.4696827367159822, 12.462674546124104, 2.9281859927886771, 7.6513645380808271, 3.3158091950668926, 0.8152878302494978, 1.7252645996655027, -1.4761658864245817, -0.88689757979195827, -1.7161555169970975, -0.48048213041447491, -0.61786747800518715, 1.7221472209588695, 1.4410603816132017, 2.8318141898836315, 1.5552847934305372, 0.05277298563978073, -1.5313768256641445, -0.9921576725859278, 0.40867746076360606, -0.20621269482631011, 1.3571647909533708, -4.6272034575156908, -24.528917872852457, -48.488510187113178, -97.122360992020845, -177.03891975992676, -310.33479459235781, -461.88238037931535, -256.00130492151709, -34.106574161017335, -2.9066782920893011, 25.868477512213314, 12.192196214097933, 25.523369493146241, 13.12242317098773, 5.1950335909144911, 4.4953343292507366, 0.13078900915048275, -0.73758290379785463, -2.6398410865992936, -1.3437508199980366, -1.9947594371394133, -0.13384423623915356, -0.082235364558330679, 2.6240286812162581, 2.7995613930164374, 3.1986596327502643, 0.082031723657369299, -0.85878662181523746, -1.9228187006577324, -0.91768473485829727, 2.7285347510623108, -5.5081763037407097, -16.528423808469462, -56.862298146519464, -120.24788693418984, -233.9571731646403, -367.42140066372525, -400.36625478870656, 32.238903864660138, 56.726426890699642, -26.189735785051667, 73.747213183594084, -25.856495589804108, 68.243510763698637, 40.854552179345092, 21.918559933832821, 17.964658686821831, 4.7205289930151793, 2.1976906085987129, -1.3072901204360032, -2.3902937959311101, -2.6652215067300165, -1.0190926814191563, -0.40862649299943438, 0.23490025627283342, 3.1224293708179411, 5.2622609905015993, 4.1057658132160988, 1.331963954168899, -2.0456835555590454, -2.1157075816862583, -2.504533118281568, -2.4803036198391473, 0.83416770813248287, -49.109708531705543, -122.25882006598383, -192.62108000541431, -359.76401050336045, -412.96733723829362, -397.42763261597815, 1066.0901100808455, 361.29505764988636, 280.2462227959299, -113.44009243151743, 69.042238954208585, 62.271759486118853, 60.869480400001216, 65.591240653703366, 20.164632449396354, 9.1879671692563107, 1.7806530124300617, -1.2377659738691233, -4.7505220002798652, -3.0896458550052697, -2.5520560959227772, 0.35173698335277165, 0.10870593803433028, 6.2828152868834488, 7.5557834297934026, 6.8702061592834163, 1.9290601504224327, -1.4310556478304128, -4.402811570224995, -4.9702839577387659, -8.4569554634772928, -28.849867481960956, -37.630624824957771, -187.57398243385583, -242.13940044346546, 49.090655504701473, 223.15101669036463, 1171.270132092355, 797.42142339187455, 1105.712587716775, -56.883206971068894, 58.961155821254195, -85.625899103861229, 67.595097514571449, 153.42214558232899, 61.379175063000453, 45.232132533425769, 12.736128845291734, 6.1241971022030093, -3.4081781277481404, -8.0099491969618857, -8.7133201843538846, -0.50258781153503296, -6.2100452165045663, -0.055102663998530817, 7.2904568591883807, 11.383176063308918, 8.3377118534845209, 5.009304162269923, -3.7481817410605087, -5.9093841314446331, -10.425252515086191, -13.171326963991898, -46.446591336113507, -153.25086116745101, -61.506465075545563, -49.92317026240935, 238.33663106152528, 1665.2932495998259, 1141.9271710506428, -2184.1299326736644, -2621.2839732861944, 1461.5017842629866, 622.62775933129569, -150.90670251969709, 353.39952612993454, 133.18984159990904, 96.051765336731378, 48.315266721271847, 26.315486653092378, 12.47210594725734, -0.11325917153558851, -7.3164558165842362, -6.2779141420297728, -6.325879336386472, -6.7615499928705614, -5.7853993354930182, 6.8948411718656626, 16.574215370008741, 12.843645059742064, 5.220057623492746, -3.813299856725167, -10.051165980763182, -16.420203889130285, -29.183435066681557, -64.570588674310201, -181.43163787734505, -272.38382351444022, 695.96261474412938, 397.20604751762363, -1430.9649107108592, -343.81610498084137, -10840.70196519443, 3453.3010516439876, -827.61688284819604, 1299.088897602802, 867.92363746103354, 248.20433151041067, 209.92149032340356, 104.5932404597956, 56.939768493357427, 19.205045070960029, 9.3006029966243737, -3.0671728952866175, 1.5669942788764133, -5.5752197676024959, -4.7947040656806426, -12.570054144236753, -3.2879617770347638, 0.44183444538609318, 16.179758937656128, 15.672094697047777, 15.514190495563801, -6.2249226907648021, -9.506443517257205, -24.595484776028343, -43.394725496932452, -113.80000983072682, -179.30887547689812, -162.42212696599955, 210.28695062763467, 461.44982475214965, -3231.3822724351485, -18380.248977426934, -21415.511526704078, -11789.651384311637, 6340.0761451283952, 3254.3286688062612, -274.13539619635947, 816.21574466320624, 214.24479740751747, 150.50951383829917, 62.077231813228565, 28.921613512340514, -1.7353747463964819, -0.92198929608524804, -10.299898240809465, 0.679005237978899, -28.352674755287008, 1.4030381833925814, -4.4649861577325289, 13.739274709477487, 12.454719286950338, 19.12568021630095, 11.158748163655963, -3.3051410229907021, -16.992665274592852, -22.790809731221124, -60.852179067446897, -118.67047187223945, -253.85827683649717, -106.10534760670436, 477.33409412636507, -4606.7423967050645, -6140.0706338628543, -9240.4816801839206]}};\n\nvar mouth_filter = {\"real\": [4.6340891519992962, 0.7844322938332674, -1.1596739705934982, 3.9933365069793401, 1.0745202382104644, -0.86566739843778528, -0.97931984026536645, -0.55848113024930113, -0.35079784655500912, -0.28441072774545773, -0.088142362922499759, 0.027465161121858393, -0.014037496255053593, -0.0045512610044201119, -0.0097173297219694255, 0.0018722497460425004, 0.00034424707543540862, 0.0018722497460384895, -0.0097173297219602297, -0.0045512610044239907, -0.014037496255053029, 0.02746516112186332, -0.088142362922505241, -0.28441072774544834, -0.35079784655500912, -0.55848113024929857, -0.97931984026536589, -0.86566739843778451, 1.0745202382104642, 3.9933365069793414, -1.1596739705934984, 0.78443229383326629, -0.64146012074713299, -1.4031948309962614, -0.72621528546721359, 2.8301862310857646, 0.22901892606370081, -2.4871893946676962, -0.82292478776907829, -0.038551737265843086, -0.20580868221576679, -0.28505928673030462, -0.18459030185549916, 0.058925447647408556, 0.0086943334915795256, -0.0086001017349623815, -0.0048545170036036192, -0.0004539351773376722, 0.00092194354279838148, 0.0017350493936515445, -0.0021057925479370247, -0.0060275384450162546, -0.01880365799458189, -0.023918178864192268, -0.020757173724755319, -0.18669623657203888, -0.43413705625508531, -0.36480504844763911, -0.32161507141862777, -1.8059188349376913, 0.70639011502857929, 3.4760111666249314, -0.5602942662325473, -0.88313644188618323, -3.1958827705277328, -4.1322391810878196, 0.77904148145098406, 5.0612923845025648, 1.5447671531259652, -2.8176609661232312, -0.63748901957655968, 0.36914599600864362, -0.00037729870766316427, -0.17990982199486863, -0.032569510455235789, 0.0085089063175920673, -0.014523430514595712, -0.012452101483067112, -0.0012625852907501049, 0.00028475514852645983, 0.0011591891684665802, 0.00039450549224649017, -0.002943469227087628, -0.010724474299968166, 0.0061262158881635236, 0.029252238624593387, -0.12159824966625053, -0.31076930784864121, -0.41364470354134941, 0.022306497695738548, 0.074366913048009908, -2.6718092121882169, -0.77719061117874755, 3.9762898076403879, 3.2079354493433021, -4.4012300899429189, -2.5660816993858311, -2.553218193276197, 2.0684625359523285, 4.9974951908094045, 2.143461857355776, -1.7847370377532255, -0.28821333774369001, 0.10766200451394388, 0.18782859841053653, -0.019310891700896299, -0.0062567209274460587, -0.0064371871903130887, 0.0021510630118947156, -0.011505776785749768, -0.0029992319263973479, 0.00030084525589988385, 0.0010941864062154283, 0.00030288821499767468, -0.0032329177128834767, -0.010312595680378463, -0.0068340802376650614, 0.019823041367851263, -0.0078950524544473683, -0.23245655665346024, -0.14923618615195547, 0.056419081419621493, 0.16707514445150673, -2.1849562859013951, -0.54088886065646191, 4.0516538348232194, 4.2406226010125279, -1.7936849281843577, -2.9840428724267536, -3.2115132203593002, -1.9470763746691873, 4.1518693114943472, 2.4862294474678142, -0.30639511041804085, 0.024820417007377235, 0.27577100857260728, 0.055259784589899323, -0.14220319122433717, -0.08642751724431888, 0.023244530667997254, 0.012523451759435138, -0.0058546865987889477, -0.0029976575640192626, -3.5555809550126927e-05, 0.00047377824955015626, 0.00099596206424971642, -0.00098919816572873276, -0.0097580547506740285, -0.020619695697678356, -0.0037015241751264089, -0.003593154009926945, -0.045481667679613515, 0.090305489910112821, 0.19683301699858768, 0.20611623580645685, -0.90233672462032366, 0.065306828187895322, 4.7788333108246484, 2.9026377323781798, -3.2466266324527706, -2.1436478188271333, -2.2561432890218653, -1.9115416020763942, 2.2130343552583907, 1.9915993980953659, -0.056495739083329222, -0.2528646737117784, 0.14962266633073235, -0.0099224078218753502, -0.1479065510292869, -0.07230224268075354, 0.0058318523760505494, 0.0022686064052674618, -0.00013275302826153175, -0.00063102743369309689, 9.1509786481767957e-05, 0.00031972746011452689, 0.00053353867978528325, -0.00058791023420762787, -0.0052408752439335538, -0.0091860766601598153, 0.015159206837947898, 0.016910593952452414, -0.099017880584634829, -0.099839128057652077, 0.28004861021942001, 0.37300273050036969, -0.085260591440202538, 0.41189695036617391, 2.9117111935410587, 0.66045559278765098, -2.6585359534260435, -1.484629636420711, -1.5429215388219939, -1.0057598114385591, 1.6171176031175611, 1.3492912586213337, -0.42857897427067643, -0.50006058673779852, 0.027713169661722398, 0.11528070486941493, -0.039483986090959794, -0.044672910989708811, -0.0092116030206209065, 0.00050303223447250363, 0.00117999940390684, -0.00042184774624830218, 4.668492787763195e-06, 0.00031547415704219679, 0.0001689251312381811, -0.0012866387173093054, -0.0021139867571189981, -0.0022343140961022454, 0.0092259555638931588, -0.0022666885302687536, -0.077537144546569597, -0.14256276290766454, 0.027946173791502729, 0.115246314279082, -0.3242302049719249, 0.30841119378164411, 1.9739342660507115, 0.88921924763931337, -1.5931958725731872, -1.0137169086218167, -0.98220755452462893, -0.55271078229049098, 1.084545546778825, 1.0070569814426842, -0.18251897039350226, -0.37931318856894325, -0.013449845022921075, 0.075764515301197377, -0.035369123979370719, -0.015619619770784467, 0.003123860549792537, 0.0028409863743067009, -0.00016094314378723183, -0.0010442109044203019, -9.8941097057248808e-05, 0.00016280791369542986, 0.00021650467324038706, -0.00047567037374047843, -0.00092328459105976625, -0.0014357330004678133, -0.00013185634410259166, -0.0087980568614916873, -0.057667801386191805, -0.014139365016219003, 0.15150048657312606, -0.063156821697620796, -0.52703545490563852, -0.11064525699952842, 1.3541882686537436, 1.0048741532970387, -0.82641052291163419, -0.55788342432782989, -0.54692805386470211, -0.22545269169536206, 0.6740428991302807, 0.63746360531382218, 0.053213891179403915, -0.16323047770545179, -0.05067162930818387, 0.0058333166986499468, -0.012742844783306895, -0.0071596160198456604, -0.00093377357192446454, 0.0012222061966531139, 0.00017574396951624128, -0.0005642074481669886, -6.0828659546840626e-05, 9.2871290444668044e-05, 0.00015000413209498726, 4.777345737973158e-05, -0.000326961738278439, 0.00024195810565667486, 0.00080694685438762858, 0.0024162562143001782, -0.021930873945379376, -0.011688581845023685, 0.11525275913926007, -0.020751088469611444, -0.33588482906629819, -0.021354414893159417, 0.81277558638075542, 0.72624502554486348, -0.35235216014446363, -0.26240454745464498, -0.25116485949546724, -0.047416949334167319, 0.41581226861132581, 0.36754912691134745, 0.031499405618264475, -0.1182059528936131, -0.027325517544006306, 0.017104517731676545, -0.0028988620733824016, -0.0076630041566265582, -0.0029377702512214019, 0.00085784401988343753, 8.3233018006220044e-05, -6.6626176934615107e-05, 3.0121602117794285e-05, 2.7157707030347298e-05, 5.3948506612911946e-05, 4.1294414526828764e-05, -0.00045536935945395869, -0.00011944277202748304, 0.001701190526917767, 0.00018736852574408679, -0.0020488748359166246, -0.0058560651797691897, 0.014332522459211712, -0.02484159185287883, -0.16044866683911937, 0.063133068421675945, 0.47884903706850868, 0.46922977068813959, -0.1005858110717496, -0.10558450478212159, -0.094572659725636055, 0.030818986514241645, 0.17934859926238414, 0.13718905272203691, -0.010905020288841244, -0.05427060295960378, -0.0073090810457242502, 0.01494907224279079, 0.0034945285778568377, -0.0038412851930084225, -0.0011597829517094804, 0.00044322180186623985, 5.4551216944427788e-05, -9.2794624249969221e-06, 9.5078851906194622e-06, 4.2007998035232393e-06, 4.0012008897297825e-06, -1.1774818209916229e-05, -0.00027037083981188163, -0.00035658526841883775, 0.0010094103856456143, -0.00052904996994269221, -0.0074682098820876806, -0.0022588127195562607, 0.018210634042398671, -0.009508805432907743, -0.085651174753861262, -0.014342078173992242, 0.19289673419785613, 0.23928297364621173, 0.039149520251701771, -0.061014517221157215, -0.057366565922661691, -0.0080064655214225223, 0.076289242121436118, 0.062033108089888676, -0.0026674849249250141, -0.024627343791732099, -0.005372625137310909, 0.0080653113868279242, 0.0030108297249231111, -0.0014118319882570156, -0.00042245914300035952, 0.00026288061895118008, 3.9126968311475854e-05, -2.5576892658974124e-05, -1.3099831737018989e-05, 6.8014805414260688e-07, 6.9755222362157937e-06, 4.1140465083074929e-06, -6.1370755554305661e-05, -0.00013364764935139172, 0.00021919093935820536, -0.00034687380123466822, -0.0034793424266583023, 0.00040352462407419059, 0.01373845906597586, 0.0021423976061818307, -0.037152134230387414, -0.017035854478310443, 0.07316876401329736, 0.093558727298951636, 0.001337949029101016, -0.028771535917646113, -0.027836987718903094, -0.0056044573137369316, 0.030982713752819017, 0.025812139891197732, 0.00074892492781415969, -0.0079187798201619947, -0.002052401353006265, 0.0023870007142673053, 0.00047709621801237946, -0.00019244333515306637, 2.364174882971905e-06, 7.8630073383472148e-05, 1.0976829691696413e-05, -4.9478433448607269e-06, -2.9053042363364555e-06, 2.3830467829361056e-06, 3.9023671373108736e-06, -2.6460791618778472e-06, 1.0608628096643537e-05, 3.3021940418689286e-05, 0.0001912157704189101, 6.7444175547866513e-05, -0.00096115828672010788, 0.00087008244330741215, 0.0067484721896968842, 0.0013604220025846133, -0.013837221190936331, -0.0075049977300193776, 0.030023800478366884, 0.039750958563338108, -0.00010247159736706737, -0.01163043609268417, -0.0096266829589855638, -0.00012449081323135682, 0.0098966622932942921, 0.0080718452892629081, 0.0011587204509509821, -0.0023373825953736087, -0.00080711215646797813, 0.00063105697122019017, 0.00025055042762753488, -0.00015724082609640453, -2.9456254661901335e-05, 2.2436391551144613e-05, 5.7614021056943357e-06, 9.2836238115278777e-08, -2.983219466927386e-07, 3.9469148175242839e-07, -1.897541367332826e-07, 2.3086718690330816e-07, -3.2379878454182751e-06, 2.9136696178544169e-06, 9.1340416066903861e-05, 0.00013720705972618841, -0.00027185621825451397, -0.00025621479435585686, 0.001222650455527893, 8.5193002129657069e-05, -0.004064865703922135, -0.00029221589048634159, 0.011494835522638509, 0.01340946760762054, -0.00054241338513798362, -0.0039904416962682253, -0.0028675934245187911, 0.00011970246178788614, 0.0032259655922311906, 0.0027177896529416603, 0.00029039751533865968, -0.00056045647677372237, -0.00011868935035429348, 8.6932625960108793e-05, 4.0585244752836994e-05, -3.9685399626399569e-05, -3.3675702194659581e-05, 1.8041324860728306e-06, 7.1527415341150131e-07, -2.5874877778097139e-07, -3.5187588582041102e-07, -4.9612975448428711e-07, 4.7392836724258751e-08, -2.7763787498630026e-07, -8.4165778406209883e-07, 3.0761526067769889e-07, 1.927255849211769e-05, 3.5189855392011486e-06, -9.8678053133183447e-05, -6.2632939936424042e-05, 0.00017511504940116496, -9.4816296748496417e-05, -0.0010867114051789507, 0.00038291262596998446, 0.0037605600166853263, 0.0033513976296794821, -0.0010579625982184212, -0.00083900520021582383, -0.00052619171844538041, 0.00055771306950743252, 0.0012835447933515079, 0.00080151927400318277, 6.1491898000095208e-05, -0.00011622895984693472, -2.362760140891841e-05, 3.979172224729024e-05, 7.0290787962574776e-06, -8.7051393881149627e-06, -1.7451721719085544e-06, -1.971994185063341e-06, -7.5103971978779283e-08, -6.3110103076160124e-08, -6.5527443378366647e-08, -1.271443792432593e-07, 9.3246051218088246e-08, 1.5092375607837617e-07, -4.0633606215809979e-07, 4.8842482637076878e-07, 6.2006052053478677e-06, 9.9625085097078631e-06, -8.4218410398305216e-06, -2.1130341683092213e-05, -8.6580287858941996e-06, -0.00010846093496444906, -0.00019573231564846473, 0.00038253737826254207, 0.0014355018795734822, 0.0012361430930244762, -3.8330562655413493e-05, -0.00045693558279248441, -0.00013724958223101865, 0.0005563817789235216, 0.0008124065993596201, 0.00038839544015797694, 5.2654227599481573e-06, -2.0620767185676097e-05, 1.4058588768839616e-05, 2.4456681475752488e-06, -1.3038942789126752e-06, 3.2957272146113247e-06, 2.136839449678527e-06, -3.8521786796247972e-08, -3.9949631386029851e-07, -2.803297067646553e-08, -4.2841831822770929e-08, -2.708778766944344e-08, -4.2841831887488422e-08, -2.8032970597075431e-08, -3.9949631385981395e-07, -3.8521786746470003e-08, 2.1368394496269648e-06, 3.2957272146716597e-06, -1.3038942788497014e-06, 2.4456681475752488e-06, 1.4058588768888149e-05, -2.0620767185710351e-05, 5.2654227597687651e-06, 0.00038839544015800736, 0.00081240659935969219, 0.00055638177892360769, -0.00013724958223097121, -0.00083900520021596553, -3.833056265530287e-05, 0.0012361430930255431, 0.0014355018795735538, 0.00038253737826226555, -0.00019573231564817955, -0.0001084609349642516, -8.6580287858519462e-06, -2.1130341683048624e-05, -8.4218410398544215e-06, 9.9625085095730612e-06, 6.2006052055115093e-06, 4.8842482632655112e-07, -4.0633606237408006e-07, 1.5092375605026055e-07, 9.3246051443898654e-08, -1.2714437924313219e-07, -6.5527443487134095e-08, -6.3110103047252147e-08, -7.510397195070611e-08, -1.9719941850259958e-06, -1.7451721718998097e-06, -8.7051393879504859e-06, 7.0290787963321046e-06, 3.9791722247395916e-05, -2.3627601408864216e-05, -0.0001162289598470872, 6.1491898000005259e-05, 0.00080151927400328501, 0.0012835447933512035, 0.00055771306950693161, -0.00052619171844531059, -0.003990441696267554, -0.0010579625982183091, 0.0033513976296794508, 0.0037605600166856607, 0.00038291262597007754, -0.0010867114051789164, -9.4816296748372926e-05, 0.00017511504940131815, -6.2632939936292583e-05, -9.8678053133139699e-05, 3.5189855391400817e-06, 1.9272558492233388e-05, 3.0761526064323095e-07, -8.4165778419493996e-07, -2.7763787504721638e-07, 4.7392836831470689e-08, -4.9612975448445027e-07, -3.5187588609488416e-07, -2.5874877778167802e-07, 7.152741534536303e-07, 1.804132486106339e-06, -3.3675702194604274e-05, -3.9685399626282394e-05, 4.0585244752900393e-05, 8.6932625960089156e-05, -0.00011868935035428417, -0.0005604564767739365, 0.00029039751533834201, 0.0027177896529417466, 0.0032259655922308689, 0.00011970246178728064, -0.0028675934245188605, -0.011630436092684446, -0.00054241338513798633, 0.013409467607620592, 0.011494835522638138, -0.00029221589048616421, -0.0040648657039219702, 8.5193002129971217e-05, 0.001222650455528094, -0.00025621479435585409, -0.0002718562182545189, 0.00013720705972611116, 9.1340416066969292e-05, 2.9136696178498302e-06, -3.2379878454707733e-06, 2.3086718686225909e-07, -1.8975413675430027e-07, 3.9469148175231827e-07, -2.9832194662415222e-07, 9.2836238091981533e-08, 5.7614021057956332e-06, 2.243639155115928e-05, -2.9456254661848962e-05, -0.00015724082609634113, 0.00025055042762756014, 0.0006310569712201816, -0.00080711215646793249, -0.0023373825953734708, 0.0011587204509510469, 0.0080718452892626774, 0.0098966622932934109, -0.00012449081323185037, -0.0096266829589855153, -0.028771535917645582, -0.00010247159736742938, 0.03975095856333772, 0.030023800478366992, -0.0075049977300190333, -0.013837221190936397, 0.001360422002584686, 0.0067484721896969484, 0.00087008244330749834, -0.00096115828672011482, 6.7444175547800892e-05, 0.00019121577041898859, 3.3021940418677224e-05, 1.0608628096553211e-05, -2.6460791619305373e-06, 3.9023671372462814e-06, 2.3830467829358028e-06, -2.9053042364313164e-06, -4.9478433448600171e-06, 1.0976829691639238e-05, 7.863007338347967e-05, 2.3641748829703282e-06, -0.00019244333515297128, 0.00047709621801239502, 0.0023870007142673287, -0.0020524013530060455, -0.0079187798201617154, 0.00074892492781425889, 0.025812139891197631, 0.030982713752818712, -0.0056044573137374659, -0.027836987718902747, -0.061014517221157166, 0.0013379490291006914, 0.093558727298950733, 0.073168764013296958, -0.017035854478310443, -0.037152134230387518, 0.0021423976061819595, 0.013738459065975945, 0.00040352462407424605, -0.0034793424266582368, -0.00034687380123471886, 0.00021919093935825583, -0.00013364764935140623, -6.1370755554343757e-05, 4.1140465083160657e-06, 6.9755222361877128e-06, 6.8014805414205017e-07, -1.3099831737122968e-05, -2.5576892658968157e-05, 3.9126968311429429e-05, 0.00026288061895118621, -0.00042245914300031615, -0.0014118319882569644, 0.003010829724923217, 0.0080653113868278357, -0.0053726251373106982, -0.024627343791731683, -0.0026674849249247769, 0.06203310808988808, 0.076289242121435036, -0.0080064655214229473, -0.057366565922661421, -0.10558450478212106, 0.039149520251701674, 0.23928297364621154, 0.19289673419785586, -0.014342078173991857, -0.085651174753861178, -0.0095088054329078991, 0.018210634042398706, -0.002258812719556187, -0.0074682098820877006, -0.0005290499699428646, 0.0010094103856456574, -0.00035658526841884875, -0.00027037083981181821, -1.1774818209899307e-05, 4.0012008896968829e-06, 4.2007998035228361e-06, 9.5078851906702469e-06, -9.2794624249821973e-06, 5.45512169444116e-05, 0.0004432218018662688, -0.0011597829517094238, -0.0038412851930083049, 0.0034945285778569305, 0.014949072242790728, -0.0073090810457241244, -0.054270602959603668, -0.01090502028884107, 0.13718905272203655, 0.17934859926238284, 0.030818986514240795, -0.09457265972563568, -0.26240454745464348, -0.1005858110717494, 0.46922977068813976, 0.4788490370685089, 0.063133068421676597, -0.16044866683911846, -0.024841591852878687, 0.014332522459211764, -0.005856065179769227, -0.0020488748359166085, 0.00018736852574399146, 0.0017011905269178167, -0.00011944277202752463, -0.00045536935945402705, 4.1294414526791867e-05, 5.3948506612877123e-05, 2.7157707030347085e-05, 3.0121602117749643e-05, -6.6626176934661782e-05, 8.3233018006250646e-05, 0.0008578440198834165, -0.0029377702512214973, -0.0076630041566264767, -0.0028988620733823725, 0.017104517731676455, -0.027325517544006247, -0.11820595289361274, 0.031499405618264593, 0.36754912691134622, 0.41581226861132453, -0.04741694933416768, -0.2511648594954663, -0.55788342432782989, -0.35235216014446413, 0.72624502554486348, 0.8127755863807552, -0.021354414893159278, -0.33588482906629807, -0.020751088469611285, 0.11525275913925997, -0.011688581845023685, -0.021930873945379303, 0.0024162562143002332, 0.00080694685438767672, 0.00024195810565667153, -0.00032696173827853592, 4.7773457379814068e-05, 0.00015000413209503944, 9.2871290444668044e-05, -6.0828659546917042e-05, -0.00056420744816712695, 0.00017574396951636955, 0.0012222061966531885, -0.00093377357192450466, -0.007159616019845526, -0.01274284478330687, 0.0058333166986499468, -0.050671629308183697, -0.16323047770545204, 0.05321389117940345, 0.63746360531382207, 0.6740428991302817, -0.22545269169536208, -0.54692805386470211, -1.0137169086218165, -0.82641052291163497, 1.0048741532970369, 1.3541882686537434, -0.1106452569995289, -0.52703545490563775, -0.063156821697620685, 0.15150048657312606, -0.014139365016218914, -0.057667801386191833, -0.0087980568614915919, -0.00013185634410271281, -0.0014357330004678901, -0.00092328459105995816, -0.00047567037374023129, 0.00021650467324065207, 0.00016280791369542935, -9.8941097057279613e-05, -0.0010442109044203046, -0.00016094314378705795, 0.0028409863743067928, 0.0031238605497927777, -0.015619619770784359, -0.035369123979370198, 0.075764515301197433, -0.013449845022920601, -0.37931318856894264, -0.18251897039350262, 1.0070569814426831, 1.084545546778823, -0.55271078229049153, -0.9822075545246276, -1.4846296364207112, -1.5931958725731861, 0.88921924763931159, 1.9739342660507089, 0.30841119378164455, -0.32423020497192495, 0.11524631427908204, 0.027946173791502632, -0.14256276290766468, -0.077537144546569833, -0.002266688530268584, 0.0092259555638929507, -0.0022343140961023017, -0.0021139867571188628, -0.0012866387173093869, 0.00016892513123889085, 0.00031547415704219538, 4.668492787631832e-06, -0.00042184774624882054, 0.0011799994039063304, 0.00050303223447267277, -0.0092116030206206324, -0.044672910989708575, -0.03948398609095928, 0.11528070486941518, 0.027713169661722662, -0.5000605867377983, -0.42857897427067776, 1.3492912586213337, 1.6171176031175631, -1.0057598114385595, -1.5429215388219939, -2.143647818827132, -2.6585359534260422, 0.66045559278764887, 2.9117111935410573, 0.41189695036617402, -0.085260591440201997, 0.37300273050036942, 0.28004861021941868, -0.09983912805765198, -0.099017880584635037, 0.016910593952451765, 0.015159206837948214, -0.0091860766601597858, -0.005240875243933095, -0.00058791023420808302, 0.00053353867978554596, 0.00031972746011452689, 9.1509786481807435e-05, -0.00063102743369398116, -0.00013275302826212034, 0.0022686064052679666, 0.0058318523760503612, -0.072302242680752943, -0.14790655102928651, -0.0099224078218752652, 0.14962266633073282, -0.25286467371177851, -0.056495739083330138, 1.9915993980953646, 2.2130343552583911, -1.9115416020763922, -2.2561432890218649, -2.9840428724267536, -3.2466266324527679, 2.902637732378178, 4.7788333108246475, 0.065306828187895516, -0.90233672462032188, 0.20611623580645633, 0.19683301699858602, 0.090305489910112668, -0.045481667679613411, -0.00359315400992807, -0.0037015241751260411, -0.02061969569767819, -0.0097580547506737354, -0.00098919816572940519, 0.00099596206425130282, 0.00047377824955015637, -3.555580955030948e-05, -0.0029976575640203941, -0.0058546865987889858, 0.012523451759435134, 0.023244530667997261, -0.086427517244318533, -0.14220319122433661, 0.05525978458989915, 0.27577100857260672, 0.024820417007377481, -0.30639511041804179, 2.4862294474678128, 4.1518693114943428, -1.947076374669187, -3.2115132203593006, -2.5660816993858284, -1.7936849281843579, 4.2406226010125261, 4.0516538348232221, -0.54088886065646147, -2.1849562859013973, 0.1670751444515067, 0.05641908141962089, -0.1492361861519553, -0.23245655665346052, -0.0078950524544474775, 0.01982304136785135, -0.0068340802376656131, -0.010312595680378572, -0.0032329177128843376, 0.00030288821499861344, 0.0010941864062154279, 0.000300845255900019, -0.0029992319263979755, -0.011505776785751019, 0.0021510630118943804, -0.0064371871903127383, -0.0062567209274463683, -0.019310891700895682, 0.18782859841053667, 0.10766200451394509, -0.28821333774368862, -1.7847370377532281, 2.1434618573557747, 4.9974951908094001, 2.0684625359523268, -2.5532181932761979, -3.1958827705277333, -4.4012300899429215, 3.2079354493433048, 3.9762898076403923, -0.77719061117874688, -2.6718092121882195, 0.074366913048009561, 0.02230649769573629, -0.41364470354134925, -0.31076930784863965, -0.12159824966625225, 0.029252238624593849, 0.0061262158881634976, -0.010724474299966393, -0.0029434692270879645, 0.00039450549224720385, 0.0011591891684665805, 0.00028475514852767235, -0.0012625852907517934, -0.012452101483067435, -0.014523430514596241, 0.0085089063175917082, -0.032569510455234915, -0.17990982199486819, -0.00037729870766311575, 0.36914599600864506, -0.63748901957656057, -2.8176609661232312, 1.5447671531259644, 5.0612923845025639, 0.77904148145098462, -4.1322391810878223, -0.64146012074713366, -0.88313644188618345, -0.56029426623254674, 3.4760111666249305, 0.70639011502857829, -1.805918834937694, -0.32161507141862899, -0.36480504844764006, -0.43413705625508542, -0.1866962365720416, -0.020757173724754961, -0.023918178864192875, -0.018803657994580801, -0.0060275384450154063, -0.002105792547937667, 0.00173504939364955, 0.00092194354279838181, -0.00045393517734262397, -0.0048545170036007057, -0.0086001017349646748, 0.0086943334915797251, 0.058925447647409854, -0.18459030185549863, -0.28505928673030412, -0.20580868221576676, -0.038551737265842712, -0.82292478776907585, -2.4871893946676935, 0.22901892606369992, 2.8301862310857611, -0.72621528546721381, -1.4031948309962614], \"bottom\": {\"real\": [5678.1086041894205, 20900.18095010153, 3447.0499761258557, 3006.2920785513897, 1095.893903110946, 386.81104976321694, 202.87465181506209, 112.96922946840166, 74.157579598112093, 62.413315591675342, 46.931213065231809, 32.703444421117119, 23.138509584976408, 18.532485453515367, 13.839857335386801, 11.995391672846374, 11.011316958211436, 11.995391672846273, 13.839857335386798, 18.532485453515342, 23.138509584976408, 32.703444421117176, 46.931213065231873, 62.41331559167557, 74.157579598112093, 112.96922946840168, 202.87465181506209, 386.8110497632174, 1095.8939031109464, 3006.2920785513907, 3447.0499761258566, 20900.180950101545, 11652.541375531215, 6105.9976767437374, 3079.1167046754913, 1776.9919423314705, 759.63591736173282, 370.96222186223144, 186.72550653728851, 104.06222158598892, 72.776226915090177, 54.132047333262229, 40.617443247446026, 26.905297339122829, 20.596051003825067, 16.964451546104712, 12.574490983994691, 10.149549151428955, 9.456590806505238, 9.9768657536093883, 12.029240511903456, 15.043219420350251, 20.838711299344116, 30.553614566731468, 44.40616386235552, 58.565861412331529, 70.132835875061744, 104.51314473208357, 189.56857349608143, 377.16693201205015, 884.12700895693013, 2239.7595640192126, 3145.1913405539117, 6958.5740759503597, 9609.5106426127932, 4992.6608769394197, 1669.5618690661463, 1059.1995113905639, 549.16279790927274, 278.94923830500289, 170.62516999169446, 111.93749936902557, 73.270251985017907, 52.998042263483633, 37.142546768677903, 24.977928698896999, 19.757351140056166, 15.549412568397655, 12.287444953226689, 10.159177492646036, 9.2913516551568005, 9.4707404644445941, 11.366894624691977, 14.908412193461192, 19.162809661823754, 25.525875481280988, 36.846585979626177, 51.022038209027251, 67.247306229462055, 96.043853286628931, 163.05718048491738, 294.76980362823429, 519.23514670394684, 957.57039473443547, 1368.5173470150648, 3871.635585616455, 5303.4798274482118, 3579.2066474003154, 1207.1822867649944, 879.86972928318005, 366.88528484741369, 208.17182668800805, 144.26637111917213, 100.24198689599578, 68.818117171408701, 48.744575666300129, 36.079835978948523, 24.716276003836366, 18.3829469088219, 14.338503983471835, 11.518473012854098, 9.4389981542904859, 8.6855447757572897, 9.3111499128487676, 10.931731847155714, 14.242659983217518, 18.454273027639637, 22.997981877882626, 32.775354054937182, 47.784430534137819, 65.982333636303437, 97.039219839998921, 143.27997074170094, 205.80805308530745, 348.18684046898466, 831.79281380405996, 1177.2730197279227, 2733.3936378292215, 3938.2641458688445, 2819.7837494548567, 820.36462717097368, 471.37587503146102, 271.87929154854345, 194.2701704157619, 144.96617790506966, 97.576794771201833, 61.3119854017338, 44.971290338260182, 31.994561157116021, 22.178882955012892, 16.262756648609532, 13.335771300720145, 10.777277796853795, 9.4872372674219161, 8.4179220667115882, 8.8615504994164276, 10.464447670423642, 13.467380568991793, 17.380860604603019, 22.603085253093905, 31.976099529363569, 44.356708279359708, 58.842492346581366, 84.943606310881933, 129.92857886018368, 172.62888515328848, 240.58003385007751, 441.25082967480506, 690.43324997326704, 1627.6849016299075, 3510.6104569290264, 2572.5928689582997, 734.84965238283041, 346.49155817100205, 245.54955425961745, 154.38419406683067, 123.89126600552243, 73.592832336469911, 51.176815014056707, 38.823519356586488, 27.703018951863196, 20.40402437294096, 15.615914454631133, 12.262838166368205, 10.911393710353273, 9.2831005853774435, 8.0758021716500519, 8.9560352521382285, 10.337739417364297, 12.597356227543543, 15.877991319670912, 20.726370017730709, 27.911545681671033, 37.940376333065345, 53.075877633932322, 72.520382240797787, 117.05897406186033, 158.12669065273971, 212.38391288711696, 299.48678366969477, 458.16531800810117, 1452.4284055535941, 1811.7186422893874, 1492.3389942582992, 530.65233974797684, 291.76966991086613, 187.69065022036725, 128.13046637777484, 90.24516666546559, 62.18605129748434, 41.710267966739593, 31.806783986884078, 25.068630438788546, 18.542553262414661, 14.666394584276578, 11.150365108371181, 9.9606764098368359, 8.5525257374706207, 7.7030138744354231, 8.2863477700222052, 9.8144929913230374, 11.655898242076917, 14.231766288773079, 17.885476571421012, 23.413082960982251, 31.608461656401264, 43.352221767718426, 55.676412685850877, 83.620268450993763, 126.42534521303489, 156.87210807500801, 246.58019931340195, 341.88266569523688, 826.98358454061815, 1404.2471167163787, 1228.1386668678601, 466.96068651596903, 262.22064771032797, 169.28009741248692, 115.01657309947615, 81.656383365816069, 54.579351530742883, 37.960529311280091, 27.270275764980511, 21.626986342929015, 16.174148423485327, 13.175385803191114, 10.818108303701184, 9.0657850663622632, 7.6275792078218663, 7.6107016321135834, 7.1158024527040036, 8.9011265392735677, 10.779707882412266, 12.420331822356596, 16.598306303244669, 21.012033493538478, 26.831312912868523, 33.051774609079132, 46.309734418779385, 65.383201302087031, 99.002477905219891, 128.56748384849996, 196.60807492406175, 298.23398084325686, 608.36256258703634, 1076.3354380676617, 975.85098582002695, 374.17471043828004, 222.04753134206624, 153.76758510324842, 111.73984833658845, 72.541074744398003, 46.502855765338275, 35.062921303265831, 24.451970593539095, 20.281233326031273, 15.065285185027921, 11.707355473726542, 9.7459029487301194, 8.114918006499499, 7.0964681111892807, 6.6796982066891397, 6.5878914508655138, 7.8186051199031059, 9.5427463544095801, 11.594349559722247, 14.318362157023484, 17.836915226678599, 22.844712934499004, 29.434722992970055, 39.992087970322991, 55.284175542844757, 86.773492313502047, 121.99890155292813, 175.66007701025202, 246.61763210131207, 451.54810738357452, 628.04019623528905, 603.29388410781314, 273.42112436269019, 189.28495193605181, 134.97815383583696, 92.537932899584618, 56.665976520174233, 40.654050842358266, 31.171413996879973, 21.026413392061954, 18.00341753039012, 13.721993308218343, 10.669689426212042, 8.356205196082156, 7.3868882398016433, 6.517599896433226, 6.0584998866872368, 6.5638826426931418, 7.1336795088287781, 8.613838618839619, 10.802606348653876, 13.366335355351938, 15.820551075574965, 19.845163015492108, 26.999239022736937, 35.458458280870509, 46.363090584483807, 68.281465328502051, 105.62610076866049, 153.51240187831726, 202.14938057052223, 301.98539336713208, 397.56324291610815, 405.30563382951226, 215.91082743746526, 149.29333201310212, 99.680104111337215, 70.844144712189916, 48.696705114384329, 36.637056536037569, 25.596184359277657, 19.02307727771527, 15.749761366858216, 11.951033594401437, 10.086463061934033, 8.3506293881191844, 7.2022393029757437, 6.0807779602627861, 5.7612683150124271, 6.0273725182896527, 6.6165496542300648, 7.4365452715085159, 8.6783297077665154, 11.615060741665609, 13.833866336064673, 18.575864228781477, 23.246005390172172, 31.555902400033563, 40.677669500589332, 56.667715144820136, 81.408207108224573, 111.98547216305556, 158.44613292857147, 210.62780774515824, 290.55794842865595, 312.25621146691742, 170.30250321119885, 113.87454497096817, 82.354258183333911, 59.818603534093889, 44.07044665600381, 32.893778204904692, 22.496539871033299, 17.094011041557415, 14.588382118274911, 11.200549789992062, 9.5745830477514566, 8.087405619242082, 6.7925999368613024, 5.4961910805963576, 5.1971703023131628, 5.4199426306511533, 5.7678603293099391, 7.0020534104826666, 8.2642952032077304, 10.213916707261937, 12.095005343850676, 15.601004576857186, 19.781090153028195, 26.29348154312569, 36.515567090044549, 48.740864373075503, 65.517726973596552, 85.616867091925073, 121.65124801185172, 164.28464153081055, 206.40983634767443, 220.41852448872194, 129.10563781650259, 92.689146582332683, 70.791066599245255, 51.943563730344891, 38.624038300983216, 28.742887457924869, 20.6631866841911, 16.243037999103294, 13.925007170923269, 11.024255100844002, 8.4139950296861468, 7.0401470253813523, 6.2856888836418143, 5.3560804114466043, 4.9985348214397556, 5.25099810618907, 5.5809638553577701, 6.8223029788192386, 8.5634007206388532, 9.7563203496299558, 11.812088062444902, 14.805264064130581, 17.93575786748271, 22.626272918294738, 31.174402898500958, 43.302312307258802, 56.326841577080955, 74.050997536102813, 101.37453317449018, 126.60409524008277, 162.42301117619624, 177.05193776506522, 115.72813424994953, 82.326066966484547, 61.307330817502205, 44.340846370849256, 33.378870891164695, 24.521965532974615, 18.923945416120109, 15.051214231467789, 12.320737648353592, 9.7999756970991925, 7.7145670626644423, 6.8152552126005839, 5.790991468644493, 5.5254951271344099, 4.9037029711983342, 5.4977261939037048, 5.4210433665926923, 6.2988580763712889, 7.9430787323529524, 9.3778517337478533, 11.242198007971071, 14.240421326197554, 17.651811381705546, 21.659024896488908, 29.131550319460956, 38.485086199887071, 50.092317177842048, 64.493269139882599, 88.474033169854309, 111.97252766350397, 138.89119149223308, 144.08748993083097, 100.36203094373164, 71.130756050186491, 51.595222833795184, 37.837750442044026, 29.957897076201892, 23.307587216478719, 17.870061723923296, 13.548228816751676, 10.730279953947793, 8.7941383608544452, 7.5189392893151066, 6.705955395914339, 5.4286200247646947, 4.999797681915652, 4.6762703758000139, 5.2431836531184182, 5.2308729223806347, 6.1881055124038262, 7.5261510579683444, 8.5830144005603604, 10.380584080562716, 13.063097810243177, 16.764705389876635, 21.077788907239153, 26.946259601518928, 35.064067560413655, 44.053944420107648, 58.895199291399678, 80.480502591809355, 105.53062749300898, 125.53124807748995, 123.85180136306964, 91.386853748724988, 64.043808743881343, 47.377246890606187, 36.917795087421162, 29.986306366154221, 21.922248103539825, 16.586233036173578, 13.010233921941435, 10.477074169109398, 8.6985558893370474, 7.2537351369992162, 6.347024549002974, 5.3569268232459128, 5.0096575514846968, 4.7237151783382343, 5.0872350526917325, 5.223561398000081, 6.2419547006416494, 7.1521863771078822, 7.9320558557880068, 9.974158228854499, 13.174966641491576, 15.965377755431728, 19.871959533459759, 25.954935810295414, 33.854283766819641, 44.113318889386903, 56.699892234383839, 81.033857172535789, 104.09119566434012, 123.77824150517087, 114.20520067738279, 85.229693259738468, 60.295157098692592, 46.590785285134146, 36.201434834295654, 27.092016678743615, 20.190577794974832, 15.811850117592071, 12.818302458338326, 10.737776338076218, 8.4417395277092595, 7.2563660620061432, 6.1723041784468409, 5.4319323269044659, 5.4462365532477222, 4.8064386829859753, 5.4462365532477284, 5.4319323269044641, 6.1723041784468409, 7.2563660620061476, 8.4417395277092666, 10.737776338076216, 12.81830245833833, 15.811850117592071, 20.190577794974825, 27.092016678743608, 36.20143483429564, 46.590785285134125, 60.295157098692549, 85.229693259738468, 114.20520067738286, 125.53124807748999, 104.09119566434013, 81.033857172535832, 56.699892234383839, 44.113318889386896, 33.854283766819655, 25.954935810295371, 19.871959533459762, 15.965377755431739, 13.174966641491576, 9.9741582288545025, 7.9320558557880112, 7.1521863771078893, 6.241954700641652, 5.2235613980000775, 5.0872350526917307, 4.7237151783382378, 5.0096575514846968, 5.3569268232459146, 6.3470245490029713, 7.2537351369992198, 8.6985558893370474, 10.477074169109407, 13.010233921941426, 16.586233036173571, 21.922248103539818, 29.986306366154224, 36.917795087421148, 47.377246890606152, 64.043808743881314, 91.386853748724917, 123.85180136306961, 138.89119149223299, 105.53062749300904, 80.480502591809227, 58.895199291399692, 44.053944420107612, 35.064067560413633, 26.946259601518928, 21.077788907239164, 16.764705389876632, 13.063097810243177, 10.38058408056272, 8.5830144005603639, 7.5261510579683462, 6.1881055124038333, 5.2308729223806383, 5.2431836531184173, 4.6762703758000139, 4.9997976819156502, 5.4286200247646956, 6.7059553959143425, 7.518939289315103, 8.7941383608544399, 10.730279953947782, 13.548228816751662, 17.870061723923293, 23.307587216478719, 29.957897076201906, 37.837750442044026, 51.595222833795212, 71.130756050186449, 100.36203094373161, 144.08748993083097, 162.4230111761963, 111.97252766350395, 88.474033169854323, 64.493269139882642, 50.092317177842069, 38.485086199887057, 29.131550319460946, 21.659024896488901, 17.651811381705546, 14.240421326197549, 11.24219800797108, 9.3778517337478586, 7.9430787323529533, 6.2988580763712898, 5.4210433665926958, 5.4977261939037065, 4.9037029711983324, 5.5254951271344037, 5.7909914686444868, 6.8152552126005865, 7.7145670626644396, 9.7999756970991907, 12.320737648353587, 15.051214231467785, 18.923945416120109, 24.521965532974619, 33.378870891164681, 44.340846370849256, 61.307330817502212, 82.326066966484575, 115.72813424994952, 177.05193776506513, 206.40983634767417, 126.60409524008281, 101.37453317449015, 74.050997536102813, 56.326841577080955, 43.302312307258816, 31.174402898500965, 22.626272918294742, 17.93575786748271, 14.805264064130563, 11.812088062444909, 9.7563203496299522, 8.5634007206388585, 6.8223029788192431, 5.5809638553577683, 5.2509981061890709, 4.9985348214397556, 5.3560804114466061, 6.2856888836418072, 7.0401470253813523, 8.4139950296861485, 11.024255100844005, 13.925007170923264, 16.243037999103286, 20.663186684191096, 28.742887457924876, 38.624038300983237, 51.943563730344863, 70.791066599245227, 92.689146582332697, 129.10563781650256, 220.41852448872183, 290.55794842865578, 164.28464153081066, 121.65124801185169, 85.616867091925073, 65.517726973596524, 48.740864373075532, 36.515567090044541, 26.29348154312569, 19.781090153028192, 15.601004576857186, 12.095005343850689, 10.213916707261948, 8.2642952032077304, 7.0020534104826773, 5.7678603293099435, 5.4199426306511462, 5.1971703023131655, 5.496191080596355, 6.7925999368612997, 8.0874056192420785, 9.574583047751446, 11.20054978999206, 14.588382118274911, 17.094011041557405, 22.496539871033306, 32.893778204904692, 44.07044665600381, 59.818603534093839, 82.35425818333394, 113.87454497096807, 170.30250321119888, 312.25621146691731, 397.56324291610832, 210.62780774515818, 158.44613292857147, 111.98547216305556, 81.408207108224559, 56.66771514482015, 40.677669500589346, 31.555902400033585, 23.246005390172176, 18.575864228781501, 13.833866336064665, 11.615060741665616, 8.6783297077665136, 7.4365452715085221, 6.6165496542300621, 6.0273725182896607, 5.7612683150124271, 6.0807779602627852, 7.2022393029757401, 8.3506293881191827, 10.086463061934035, 11.951033594401432, 15.749761366858216, 19.023077277715267, 25.59618435927765, 36.637056536037541, 48.696705114384315, 70.844144712189944, 99.680104111337187, 149.29333201310209, 215.91082743746531, 405.30563382951209, 628.04019623528882, 301.98539336713219, 202.14938057052214, 153.51240187831741, 105.62610076866049, 68.281465328502051, 46.363090584483821, 35.458458280870502, 26.999239022736958, 19.845163015492105, 15.820551075574963, 13.366335355351934, 10.802606348653876, 8.6138386188396243, 7.1336795088287852, 6.5638826426931312, 6.0584998866872368, 6.5175998964332322, 7.3868882398016451, 8.3562051960821524, 10.669689426212047, 13.721993308218325, 18.003417530390131, 21.026413392061936, 31.171413996879959, 40.654050842358252, 56.665976520174254, 92.537932899584604, 134.97815383583699, 189.28495193605173, 273.42112436269031, 603.29388410781269, 1076.3354380676617, 451.54810738357469, 246.61763210131207, 175.66007701025202, 121.99890155292813, 86.773492313502132, 55.284175542844778, 39.992087970322984, 29.434722992970055, 22.844712934499, 17.836915226678613, 14.318362157023493, 11.594349559722259, 9.5427463544095765, 7.8186051199031059, 6.5878914508655102, 6.6796982066891397, 7.0964681111892833, 8.1149180064994972, 9.7459029487301141, 11.707355473726548, 15.065285185027918, 20.281233326031277, 24.451970593539112, 35.062921303265831, 46.502855765338289, 72.541074744397974, 111.73984833658835, 153.76758510324839, 222.04753134206618, 374.17471043828004, 975.85098582002649, 1404.247116716379, 608.36256258703611, 298.2339808432568, 196.60807492406164, 128.56748384850005, 99.002477905219948, 65.383201302087045, 46.309734418779399, 33.051774609079132, 26.831312912868544, 21.012033493538468, 16.598306303244666, 12.420331822356601, 10.779707882412263, 8.9011265392735623, 7.1158024527040018, 7.6107016321135861, 7.6275792078218707, 9.065785066362265, 10.81810830370118, 13.175385803191121, 16.174148423485349, 21.62698634292904, 27.270275764980493, 37.960529311280098, 54.579351530742926, 81.656383365816112, 115.0165730994761, 169.28009741248692, 262.22064771032797, 466.9606865159688, 1228.1386668678595, 1811.7186422893876, 826.98358454061849, 341.88266569523705, 246.58019931340198, 156.87210807500793, 126.42534521303487, 83.620268450993777, 55.676412685850913, 43.352221767718426, 31.608461656401282, 23.413082960982216, 17.885476571420995, 14.231766288773079, 11.65589824207691, 9.8144929913230339, 8.2863477700222088, 7.7030138744354231, 8.5525257374706172, 9.9606764098368394, 11.150365108371185, 14.666394584276583, 18.542553262414668, 25.068630438788542, 31.806783986884088, 41.710267966739572, 62.186051297484333, 90.245166665465547, 128.13046637777475, 187.69065022036725, 291.76966991086601, 530.65233974797684, 1492.3389942582987, 3510.6104569290255, 1452.4284055535948, 458.16531800810117, 299.48678366969483, 212.38391288711682, 158.12669065273965, 117.05897406186025, 72.520382240797787, 53.07587763393235, 37.940376333065323, 27.91154568167104, 20.726370017730687, 15.877991319670903, 12.597356227543528, 10.337739417364284, 8.9560352521382303, 8.0758021716500537, 9.2831005853774364, 10.911393710353279, 12.262838166368201, 15.615914454631143, 20.404024372940963, 27.703018951863204, 38.823519356586509, 51.176815014056693, 73.592832336469868, 123.89126600552244, 154.38419406683062, 245.54955425961754, 346.491558171002, 734.84965238283075, 2572.5928689582984, 3938.2641458688445, 1627.6849016299093, 690.43324997326704, 441.25082967480483, 240.58003385007751, 172.62888515328839, 129.92857886018368, 84.943606310881961, 58.842492346581359, 44.356708279359744, 31.976099529363548, 22.603085253093905, 17.380860604603011, 13.467380568991784, 10.46444767042364, 8.8615504994164098, 8.4179220667115935, 9.487237267421909, 10.777277796853792, 13.335771300720136, 16.262756648609525, 22.178882955012895, 31.994561157116046, 44.971290338260197, 61.311985401733793, 97.576794771201889, 144.96617790506969, 194.27017041576195, 271.87929154854334, 471.37587503146125, 820.36462717097379, 2819.7837494548558, 5303.4798274482137, 2733.3936378292242, 1177.2730197279232, 831.79281380405973, 348.18684046898477, 205.80805308530728, 143.27997074170079, 97.039219839998907, 65.982333636303451, 47.784430534137826, 32.775354054937196, 22.997981877882619, 18.45427302763963, 14.242659983217516, 10.931731847155714, 9.3111499128487569, 8.6855447757572897, 9.4389981542904824, 11.518473012854098, 14.33850398347184, 18.382946908821911, 24.716276003836377, 36.079835978948545, 48.744575666300136, 68.81811717140873, 100.24198689599579, 144.26637111917196, 208.17182668800794, 366.88528484741386, 879.86972928318096, 1207.1822867649948, 3579.2066474003141, 9609.5106426127932, 3871.635585616455, 1368.5173470150646, 957.5703947344349, 519.23514670394684, 294.76980362823411, 163.05718048491758, 96.043853286628973, 67.247306229462083, 51.022038209027237, 36.846585979626163, 25.525875481280988, 19.162809661823751, 14.908412193461192, 11.366894624691964, 9.4707404644445834, 9.2913516551568005, 10.159177492646041, 12.287444953226698, 15.549412568397658, 19.757351140056148, 24.977928698897006, 37.142546768677924, 52.99804226348364, 73.270251985017907, 111.93749936902559, 170.62516999169443, 278.94923830500301, 549.16279790927297, 1059.1995113905641, 1669.5618690661465, 4992.6608769394161, 11652.54137553122, 6958.5740759503597, 3145.1913405539112, 2239.7595640192112, 884.1270089569299, 377.16693201204993, 189.56857349608163, 104.51314473208359, 70.132835875061716, 58.565861412331529, 44.406163862355506, 30.553614566731444, 20.838711299344109, 15.043219420350246, 12.029240511903463, 9.9768657536093936, 9.4565908065052362, 10.149549151428952, 12.574490983994684, 16.964451546104694, 20.596051003825067, 26.905297339122818, 40.617443247446033, 54.132047333262229, 72.776226915090191, 104.06222158598892, 186.72550653728851, 370.96222186223156, 759.63591736173305, 1776.9919423314723, 3079.1167046754904, 6105.9976767437374], \"imag\": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, \"imag\": [0.0, -0.027073229785536494, 0.59011929886938141, -0.96446761270548442, -0.6435513043684985, -0.68291153317050746, -0.33645866529024865, 0.1935415439422136, -0.12487037453098428, -0.012369715566745995, 0.0098216569471749459, 0.001542130029622399, 0.020818288300735281, 0.0037303920674802314, -0.0038837652177233549, 0.00060693078338958778, 0.0, -0.00060693078338692346, 0.0038837652177235778, -0.0037303920674795358, -0.020818288300735933, -0.0015421300296204468, -0.0098216569471759191, 0.012369715566746212, 0.12487037453098428, -0.19354154394221409, 0.33645866529024965, 0.68291153317050701, 0.64355130436849806, 0.96446761270548365, -0.59011929886938175, 0.027073229785536425, -2.3563074320989772, 2.5879403475863869, 2.1627258263390448, -3.1655869149224403, -0.41468157127337424, 0.73477199535913751, -1.2119335549119159, -0.10726288955095604, 0.30943623202091536, 0.23604949314849888, -1.983168313462914e-05, -0.015096007795395092, 0.0044172524913437313, 0.0012110563015863107, -0.00040440768488355977, 0.00056775738923005802, -0.00053942936844551652, 0.00087575929197146875, -0.002003234803528005, 0.0042603852180314204, -0.0062087670781442329, 0.017375416518930226, -0.014179868174360925, -0.10125602185153701, -0.15414023444697653, -0.035800396396009702, -0.96211078676818074, -0.96053455050253955, -1.1229487194040586, -2.1710672351706557, 1.4940913514434742, 2.7217236711600989, 1.1141581132568867, -0.84173680321989597, -5.2801379304709686, 1.1933011924316357, 3.2397405202403871, 0.58382335305071387, -1.2090975123731194, 0.11812270190565496, 0.29294962083792114, 0.38808563795590029, 0.017661918975066655, -0.0075287995749033759, -0.018334336057616411, 0.0080668085023426154, 0.0016882901545514294, 0.00017988558455360213, -0.00046271928878641557, -0.00012883481246306377, -0.0015037083336975181, -0.0051624614514164694, 0.0051337344665884242, 0.01635194779532648, -0.020739891572331103, 0.034224425977121886, 0.14660089916526936, 0.2579692221979365, -1.297902949650936, -0.81053000193538005, 2.2824415889165404, 1.3538813012752462, -3.6141509401212817, -1.3641708343500389, -2.525115924658619, -3.1276611078214884, -3.2520008240455529, 1.0086268501795932, 2.5763030038597452, 0.40772972397284202, -0.2975902384778692, -0.049496223745927298, -0.032511080574428759, 0.067130744005831466, -0.0201042966896933, -0.010577484531256129, 0.0093680389241231343, 0.0094203803992774487, 2.0439677469712496e-05, -0.00046042150692956042, 9.7927563908633831e-05, -0.00040743814870436565, -0.00074442767565903077, -0.0053134061063244819, -0.0081457928016647942, -0.016837193889943817, 0.00090322875228200043, 0.15679003542803616, 0.24794675857842086, 0.30815180494462813, -0.65229037787562094, -1.3408717866717259, 2.6508673621629431, 3.2598446139294937, -1.6423378558800314, -3.9986185110220567, 0.17392931664300956, 0.21368421587766026, -1.2315545205448162, -1.7422719766284609, 1.3054063480052003, 1.3750287394245329, -0.35022259842939119, -0.62247639588288617, -0.048937158811492604, 0.046213719349399378, -0.071248172851420807, -0.031638182474279769, 0.0092883221388230762, 0.0058947313405102496, 0.0020720238780862037, 0.00012946526299033534, -7.130655653596095e-05, -0.00038809112868830591, 0.0011018135930776953, 0.0010417550100125584, 0.0072040756024705759, -0.02451231341789871, -0.016921302325211343, 0.019764169882346385, 0.062587439504234885, -0.087282929002583373, -0.10008726366432093, -0.14363219386863416, 1.7469053421591101, 1.042390648919584, -1.364603392172089, -0.68321209765005841, 0.66892838780721486, 0.73208772838799607, -0.32755194356284695, -0.30510623667849596, 1.5181969873975902, 0.34278556022615442, -0.74313584277783451, -0.35705699907666322, 0.1310185858494092, 0.083590457495018811, -0.021674632648672316, -0.02469255214616152, -0.0043034893865322183, 0.0020376676236782713, 0.0021493865206610868, 0.00038855444421157756, -0.00023746053900133829, -0.00029830757497495967, -0.0001970006488720256, -0.00087982491421480442, 0.0074805689709430004, 0.010808720951461402, -0.035798177116234398, -0.091541716420706271, 0.0092010764075083195, -0.19110346978313567, -0.62579430924026735, -0.13482498836119824, 1.785974669626095, 1.1747425146844421, -1.173327779558617, 0.27670322508415535, 0.33562708516576978, 0.27104375713022649, -0.04917488399628335, -0.09917627706172702, 0.47021789966195177, 0.19299106678658604, -0.25337707381982333, -0.21158932458700433, -0.0038282192087294945, 0.079426421106262524, 0.0049276280752214097, -0.012631915096635613, -0.0020857584923047439, 0.0014730403106953706, 0.00056282220383548922, -5.2753025427967662e-05, -0.00011043948472760819, -0.00013701607546798722, 0.00024141713667198109, -0.00017599692518015115, 0.0033313264069332665, -0.0026415953474081991, -0.034551401114022419, -0.067614335954062313, 0.057375162080317274, 0.10414416266224315, -0.4897526648425265, -0.75726357904359276, 0.48971199898009016, 1.1084142254331173, 0.074442669441772358, 0.13102742771679016, -0.24374357403537103, -0.28356643882607668, -0.65203784187591463, -0.36850284921393173, 0.37230089042480646, 0.4991450162764402, 0.031449374349395147, -0.23992875156785609, -0.086092076891526551, 0.032374807759909224, 0.0062294082126362945, -0.0060917930216442444, -0.0010414824560445231, 0.00015455144974867572, -8.9980842426917249e-05, -1.5754152380049444e-05, 2.760348450088792e-07, -8.4925580282278396e-05, -9.538306571273261e-05, 0.0012356709589061894, 0.0019825160649420671, -0.0025172833852348821, -0.028888564425605757, -0.016030883614829267, 0.069260754853324724, 0.010501517567550991, -0.24153406544338693, -0.2847803977366839, 0.37357513895849587, 0.56507750226207965, -0.29338428828582186, -0.55012213491904771, -0.13256769577232769, -0.093306847874868315, -0.26668667634059962, -0.24770054522287138, 0.1944884297335735, 0.33591487261576602, 0.06235746981204858, -0.1546651423691924, -0.03904218756455085, 0.014396528935747412, -0.0017849945305527066, -0.0040798293321671533, -0.0019408045705910123, 0.00084895033746642374, 0.00039593785796133193, 5.5592435290972645e-05, -4.1965636442186823e-06, -6.2852929824007463e-05, -0.00034629566400638584, -4.8241347432061454e-06, 0.00057512008113313117, 0.00033489534843084444, -0.0031901125163299256, -0.010909574115055, 0.016920458777085551, -0.060786209275753178, -0.21998547499285445, 0.011288166830458734, 0.39450427611204475, 0.32156463816915598, -0.16694523801433098, -0.28285607915278405, -0.0086431961771640062, -0.016216948868002824, -0.12426113686156882, -0.13105274525765401, 0.01783418219228005, 0.12470331491202472, 0.037338151491471468, -0.053766563890133817, -0.017697451862990946, 0.0087641985076504225, 0.0020177112398541818, -0.0032903942418034261, -0.00098879884805599711, 0.00072826354344831883, 0.00023394715134995964, 1.1123369888840513e-05, -3.5001088996629374e-05, -3.1388155454884778e-06, -0.00015838596778406701, -0.00033445190756455149, -0.0001142558275417929, -0.00088473043957872045, -0.0055035547036739211, -0.0071882829440315203, 0.0056754664443316848, -0.024165671520133571, -0.12994912866694289, -0.03043154404819853, 0.19383851234462929, 0.16309710351628273, -0.074150026014186132, -0.12085880532211579, -0.044595013287817231, -0.043366337948898985, -0.090257019037460168, -0.073384871025009082, 0.023239798472538018, 0.07639283896145152, 0.011216629301030985, -0.0359133520966744, -0.013573759545388879, 0.0067665755556069575, 0.0030103388508484073, -0.00065141687607212645, -0.00041655443776571915, 0.00013094293222966718, 3.2292215967994378e-05, -1.526253885399206e-05, -1.5127801448997461e-05, -6.4845694559707764e-06, -1.5492547416280305e-05, -9.1308082212917993e-05, 0.00016667120940429337, -0.00041873515724890633, -0.0049027471727904112, -0.003075534798824412, 0.0092738136737237613, 0.0020660684229551027, -0.04064403555503323, -0.033233971766656843, 0.045775294033398174, 0.057167349545223407, -0.02508375199406394, -0.076725145240063103, -0.029192878339710793, -0.027962636418086263, -0.036204190826297326, -0.020723423884568531, 0.024267798198958853, 0.039127433373256276, 0.0066672447446462267, -0.015463651616642567, -0.007692451841204994, 0.0027471626893687531, 0.0010462542577807969, -0.00032293603684165713, -0.00014335933849004065, 2.7664402382146889e-06, 1.3817898707968035e-05, 2.5461973861614876e-06, -2.9451008005958465e-06, -4.0922137159052221e-07, 3.3208780384164378e-06, 2.2930933947507775e-06, 0.00019381368934935658, 0.00021177469863592545, -0.0013059386478791995, -0.00074739544714731232, 0.0074009891423913463, 0.0040508976947942563, -0.024179081541404416, -0.025786109831526915, 0.024427880538049996, 0.049513273245606421, 0.018107593495138536, -0.019155633990847833, -0.010866608608631909, -0.011586446122093948, -0.017758841021731874, -0.007715199561440257, 0.0099083442586334093, 0.016798455246852806, 0.0051385037481195082, -0.0053053978312845055, -0.0034294950764025521, 0.00061169662744445848, 0.00033799731924544067, -0.00024058911609197694, -0.00010154505453872226, 1.9807787751332398e-05, 1.1566718045558844e-05, 2.3526983774034052e-06, -3.1629035250083664e-06, -1.906633619859879e-06, -1.4241006555052951e-05, -3.3020030344899701e-05, 5.2908539732603441e-05, 5.1357289146045035e-05, -0.00039743496113234163, -0.00063432051689119376, 0.0027089055320300356, 0.0013503752362499016, -0.0082884630632301115, -0.0092589342553877248, 0.0088049724290094923, 0.022756702713130291, 0.011156251045765241, -0.0083450930318397683, -0.0049406694317385268, -0.0058001455908667206, -0.0076603598190790028, -0.0053021820779070323, 0.001845870794973378, 0.0051951770049388935, 0.001795161616712868, -0.0014758375936677148, -0.00091174996356954989, 0.00015619540664616496, 0.00011997798601084234, -7.415390708438721e-05, -4.7705175525428954e-05, 1.0498840541001561e-05, 5.7016743603087733e-06, -1.1348311617650734e-06, -1.0392532056220499e-06, -1.5023935068766505e-07, -4.5999439012728934e-06, -1.7083459920844721e-05, -9.6967633574418463e-06, 8.8789075877219231e-06, -0.00012444306086311345, -0.00019783492062566108, 0.00060624989809523425, 0.00033450965931121433, -0.0029572761111825215, -0.0037574725417352365, 0.00099233616545915107, 0.0061280004658490978, 0.0032489106979224094, -0.0026668961742810043, -0.0024385469973046831, -0.0029055731292758351, -0.0035330841487134718, -0.0021581469455770066, 0.00045127797385368442, 0.0018583554775031736, 0.0007285298435105804, -0.00040485086541622897, -0.00029259265207938966, 0.00012119187628647567, 5.7987669870543989e-05, -2.689854721032224e-05, -1.2650266391968962e-05, 1.4661018807957155e-06, 1.5771327546691322e-06, -3.698251896381977e-07, -2.9525581512606399e-07, -1.495621091456335e-07, 1.1697432596209132e-07, -2.2921786679761149e-06, -2.2344957140311543e-07, 9.0079557167444004e-06, -4.7951397864926913e-05, -8.9395111720587663e-05, 0.00025656486918183087, 0.00025588309866116956, -0.00073983779212979841, -0.0015213421071961196, -9.2403301086677145e-05, 0.0017855278470929681, 0.0015458463998575377, -0.00061369027212951951, -0.00026504628413918208, -0.00087036902540521815, -0.0012627180005201106, -0.00080421955077315159, 0.00014616084301033664, 0.00058802678854243985, 0.00023126432473923958, -0.00010449095558686259, -0.00010228145451208669, 1.9325523686774618e-05, 3.0323974870826362e-05, 1.2683141406816166e-06, -1.2058446868057975e-06, 8.8143768771753332e-07, 3.3549731120851134e-07, 9.1056799261659957e-08, 2.0577319091974112e-08, 9.2830259427826791e-08, -6.4704839947157811e-07, -4.5648010846713924e-07, 2.1033881238566881e-06, 7.32796229427314e-06, -2.4374370669839543e-05, -2.5898674317115741e-05, 0.00011257144284409361, 0.00014693728608109456, -0.00023924588800045181, -0.00050123772700090606, -7.4435208380385973e-05, 0.00068444397565025586, 0.00083207770824480598, 0.00048828956300996052, 0.0, -0.00043330868466009542, -0.00064651493374645564, -0.0004135205525089448, 5.8232578355565087e-05, 0.00026030164250996835, 0.00011785219152459624, -5.0479429154057332e-05, -4.1543191833568309e-05, 7.7550355275730399e-06, 8.5787889709012739e-06, 5.074268522214453e-08, -1.5265704867968537e-06, 7.6127420915855944e-07, 3.4322773606588538e-07, -2.4467237539618118e-08, 0.0, 2.4467237179738174e-08, -3.4322773619012653e-07, -7.6127420919217151e-07, 1.526570486753494e-06, -5.0742685069794458e-08, -8.578788970889695e-06, -7.7550355275692266e-06, 4.1543191833568309e-05, 5.0479429154150824e-05, -0.00011785219152460185, -0.00026030164250998353, -5.8232578355579629e-05, 0.00041352055250904981, 0.00064651493374653229, 0.00043330868466019738, 0.00026504628414032808, -0.00048828956301001061, -0.00083207770824431527, -0.00068444397564927856, 7.4435208380627533e-05, 0.00050123772700078214, 0.00023924588800066727, -0.00014693728608088972, -0.000112571442844023, 2.589867431722904e-05, 2.4374370669918344e-05, -7.3279622940927939e-06, -2.1033881238922216e-06, 4.5648010853483173e-07, 6.4704839933564965e-07, -9.2830259571647903e-08, -2.0577319091885375e-08, -9.1056799550122255e-08, -3.3549731127660601e-07, -8.8143768768718392e-07, 1.2058446867643514e-06, -1.2683141406445925e-06, -3.032397487090597e-05, -1.9325523686839914e-05, 0.00010228145451204714, 0.00010449095558694352, -0.00023126432473908535, -0.00058802678854225174, -0.00014616084301019596, 0.00080421955077363764, 0.0012627180005203068, 0.00087036902540495523, 0.0024385469973038903, 0.00061369027212936067, -0.0015458463998569551, -0.0017855278470920858, 9.2403301086626811e-05, 0.0015213421071961089, 0.00073983779212967297, -0.00025588309866126459, -0.00025656486918189489, 8.9395111720511796e-05, 4.795139786497207e-05, -9.0079557166165035e-06, 2.234495713888465e-07, 2.2921786679921674e-06, -1.1697432602157082e-07, 1.4956210883105962e-07, 2.9525581512599554e-07, 3.6982518948350376e-07, -1.5771327547503337e-06, -1.4661018806631417e-06, 1.2650266391950919e-05, 2.6898547210308593e-05, -5.7987669870649895e-05, -0.00012119187628649009, 0.0002925926520794114, 0.00040485086541640515, -0.00072852984351041105, -0.0018583554775031031, -0.00045127797385343153, 0.0021581469455775027, 0.0035330841487132328, 0.0029055731292758334, 0.0049406694317394081, 0.0026668961742812758, -0.0032489106979216591, -0.0061280004658477299, -0.00099233616545883708, 0.0037574725417350639, 0.0029572761111822826, -0.00033450965931128095, -0.00060624989809528011, 0.00019783492062561489, 0.00012444306086323596, -8.8789075876270673e-06, 9.6967633574076482e-06, 1.7083459920778764e-05, 4.5999439011767153e-06, 1.5023935031916601e-07, 1.039253205622084e-06, 1.1348311616083971e-06, -5.7016743603616383e-06, -1.04988405409158e-05, 4.7705175525396455e-05, 7.4153907084401847e-05, -0.00011997798601094042, -0.00015619540664609709, 0.00091174996356957938, 0.0014758375936678126, -0.0017951616167126566, -0.0051951770049386038, -0.0018458707949728875, 0.0053021820779076802, 0.0076603598190795076, 0.0058001455908669262, 0.010866608608631407, 0.0083450930318392878, -0.011156251045764934, -0.022756702713130041, -0.0088049724290099694, 0.0092589342553874195, 0.0082884630632298704, -0.0013503752362499656, -0.0027089055320300547, 0.00063432051689115061, 0.00039743496113240219, -5.135728914582959e-05, -5.2908539732616404e-05, 3.3020030344762441e-05, 1.4241006554950027e-05, 1.9066336197302612e-06, 3.1629035250082296e-06, -2.352698377375767e-06, -1.1566718045553533e-05, -1.9807787751344911e-05, 0.0001015450545386955, 0.00024058911609209111, -0.00033799731924550203, -0.00061169662744447323, 0.0034294950764026141, 0.0053053978312845272, -0.0051385037481194926, -0.016798455246852688, -0.00990834425863296, 0.0077151995614407626, 0.017758841021732009, 0.011586446122093877, 0.029192878339711306, 0.019155633990847316, -0.018107593495138137, -0.049513273245605283, -0.024427880538050034, 0.02578610983152671, 0.024179081541404305, -0.0040508976947941731, -0.0074009891423912162, 0.00074739544714725432, 0.0013059386478792266, -0.00021177469863582771, -0.00019381368934936018, -2.2930933947504607e-06, -3.3208780385072546e-06, 4.0922137139897878e-07, 2.9451008005957237e-06, -2.5461973862464916e-06, -1.3817898708041393e-05, -2.7664402380974939e-06, 0.00014335933849003848, 0.00032293603684169041, -0.0010462542577808741, -0.0027471626893686612, 0.0076924518412050408, 0.015463651616642399, -0.0066672447446463326, -0.039127433373255908, -0.024267798198958437, 0.020723423884568916, 0.036204190826296979, 0.02796263641808593, 0.04459501328781619, 0.076725145240063533, 0.02508375199406461, -0.05716734954522297, -0.045775294033398015, 0.033233971766656642, 0.04064403555503332, -0.0020660684229550407, -0.0092738136737237076, 0.0030755347988242901, 0.0049027471727904398, 0.00041873515724895311, -0.00016667120940430416, 9.1308082212913032e-05, 1.549254741618293e-05, 6.4845694559219288e-06, 1.5127801448997605e-05, 1.5262538853884928e-05, -3.2292215968025048e-05, -0.00013094293222960533, 0.00041655443776571118, 0.00065141687607211561, -0.0030103388508485036, -0.0067665755556069011, 0.013573759545388975, 0.035913352096674386, -0.011216629301031098, -0.076392838961451187, -0.023239798472537657, 0.073384871025009249, 0.090257019037460764, 0.043366337948898895, 0.0086431961771646949, 0.12085880532211546, 0.074150026014186479, -0.16309710351628132, -0.19383851234462879, 0.030431544048198395, 0.12994912866694291, 0.024165671520133634, -0.005675466444331592, 0.0071882829440315836, 0.0055035547036740139, 0.00088473043957880925, 0.00011425582754175175, 0.0003344519075645258, 0.00015838596778393289, 3.138815545460048e-06, 3.5001088996629286e-05, -1.1123369889024881e-05, -0.00023394715134996501, -0.00072826354344829888, 0.00098879884805594702, 0.003290394241803499, -0.0020177112398542039, -0.0087641985076504607, 0.017697451862991015, 0.053766563890133824, -0.037338151491471468, -0.12470331491202422, -0.01783418219227963, 0.13105274525765467, 0.12426113686156864, 0.016216948868002876, 0.13256769577232769, 0.28285607915278405, 0.16694523801433089, -0.32156463816915598, -0.39450427611204497, -0.011288166830458839, 0.21998547499285451, 0.060786209275753553, -0.016920458777085551, 0.010909574115054964, 0.0031901125163300605, -0.00033489534843075342, -0.00057512008113319081, 4.8241347431542723e-06, 0.00034629566400617116, 6.2852929823858467e-05, 4.1965636442186823e-06, -5.5592435290969e-05, -0.00039593785796146729, -0.00084895033746647957, 0.0019408045705911188, 0.0040798293321673848, 0.0017849945305527092, -0.014396528935747516, 0.03904218756455085, 0.15466514236919257, -0.062357469812048469, -0.3359148726157663, -0.19448842973357355, 0.24770054522287124, 0.26668667634059967, 0.093306847874868246, 0.24374357403537067, 0.55012213491904793, 0.2933842882858228, -0.56507750226207876, -0.37357513895849492, 0.28478039773668301, 0.24153406544338699, -0.010501517567550396, -0.069260754853324669, 0.016030883614829131, 0.02888856442560565, 0.0025172833852350443, -0.0019825160649420428, -0.0012356709589064721, 9.5383065712676177e-05, 8.4925580281910716e-05, -2.7603484500895416e-07, 1.575415238022084e-05, 8.9980842426463958e-05, -0.00015455144974887674, 0.0010414824560444731, 0.0060917930216443658, -0.0062294082126362589, -0.032374807759909592, 0.086092076891526537, 0.23992875156785606, -0.031449374349395362, -0.4991450162764392, -0.37230089042480613, 0.36850284921393162, 0.65203784187591551, 0.28356643882607629, -0.33562708516576939, -0.13102742771679063, -0.074442669441771941, -1.108414225433116, -0.48971199898009049, 0.75726357904359165, 0.48975266484252722, -0.10414416266224276, -0.057375162080317302, 0.067614335954062174, 0.034551401114022537, 0.0026415953474081431, -0.0033313264069329894, 0.00017599692518009282, -0.00024141713667201988, 0.00013701607546791344, 0.00011043948472760822, 5.2753025427777066e-05, -0.00056282220383580418, -0.001473040310695623, 0.0020857584923045986, 0.01263191509663575, -0.0049276280752216023, -0.079426421106262579, 0.0038282192087295479, 0.21158932458700425, 0.25337707381982338, -0.19299106678658623, -0.4702178996619516, 0.09917627706172702, 0.049174883996283732, -0.27104375713022683, -0.66892838780721375, -0.27670322508415546, 1.1733277795586157, -1.1747425146844417, -1.7859746696260967, 0.13482498836119791, 0.62579430924026835, 0.19110346978313578, -0.0092010764075083889, 0.091541716420705743, 0.035798177116234828, -0.01080872095146141, -0.0074805689709430082, 0.00087982491421515624, 0.00019700064887198773, 0.00029830757497410965, 0.00023746053900133802, -0.00038855444421207136, -0.0021493865206616879, -0.0020376676236788177, 0.0043034893865325514, 0.024692552146162169, 0.021674632648672077, -0.083590457495018658, -0.13101858584940929, 0.35705699907666349, 0.7431358427778344, -0.3427855602261542, -1.5181969873975907, 0.30510623667849562, 0.32755194356284562, -0.73208772838799718, -0.1739293166430094, 0.68321209765005741, 1.3646033921720888, -1.0423906489195836, -1.7469053421591101, 0.14363219386863219, 0.10008726366432133, 0.087282929002584164, -0.062587439504234912, -0.019764169882346593, 0.016921302325211187, 0.02451231341789838, -0.007204075602470608, -0.0010417550100130558, -0.0011018135930777443, 0.0003880911286887635, 7.1306556535960909e-05, -0.00012946526299007061, -0.0020720238780864522, -0.0058947313405104855, -0.0092883221388232445, 0.031638182474279679, 0.071248172851421404, -0.046213719349399086, 0.048937158811492507, 0.62247639588288617, 0.35022259842939113, -1.375028739424532, -1.3054063480052007, 1.7422719766284596, 1.2315545205448166, -0.21368421587766057, 2.5251159246586199, 3.9986185110220571, 1.6423378558800306, -3.2598446139294928, -2.6508673621629413, 1.3408717866717237, 0.65229037787562116, -0.30815180494462602, -0.24794675857842133, -0.1567900354280353, -0.00090322875228194491, 0.016837193889943952, 0.0081457928016650735, 0.0053134061063229068, 0.00074442767565938834, 0.00040743814870428352, -9.792756390863333e-05, 0.00046042150692909031, -2.0439677469763416e-05, -0.0094203803992774331, -0.0093680389241246331, 0.010577484531255831, 0.020104296689693778, -0.067130744005831841, 0.032511080574428954, 0.049496223745927104, 0.29759023847787003, -0.40772972397284141, -2.5763030038597421, -1.0086268501795939, 3.2520008240455529, 3.127661107821488, -1.1141581132568867, 1.3641708343500387, 3.614150940121283, -1.3538813012752458, -2.2824415889165408, 0.81053000193537672, 1.2979029496509369, -0.25796922219793567, -0.14660089916526964, -0.034224425977123246, 0.020739891572330926, -0.016351947795325953, -0.0051337344665883956, 0.0051624614514157383, 0.0015037083336985342, 0.00012883481245927331, 0.00046271928878641655, -0.00017988558455328343, -0.0016882901545534784, -0.0080668085023415624, 0.018334336057616227, 0.0075287995749028155, -0.017661918975066519, -0.38808563795590117, -0.29294962083792109, -0.11812270190565234, 1.2090975123731191, -0.58382335305071487, -3.2397405202403844, -1.1933011924316363, 5.2801379304709686, 0.84173680321989663, 2.3563074320989759, -2.7217236711600976, -1.4940913514434744, 2.1710672351706584, 1.1229487194040595, 0.96053455050254277, 0.96211078676817896, 0.035800396396013512, 0.15414023444697636, 0.10125602185153926, 0.014179868174359136, -0.01737541651892931, 0.0062087670781442571, -0.0042603852180286457, 0.0020032348035250135, -0.00087575929196809612, 0.00053942936844551738, -0.00056775738923165191, 0.00040440768488539494, -0.0012110563015865644, -0.0044172524913444079, 0.015096007795395007, 1.9831683135784154e-05, -0.23604949314850127, -0.30943623202091552, 0.10726288955095381, 1.2119335549119155, -0.73477199535914062, 0.41468157127337302, 3.1655869149224372, -2.162725826339043, -2.5879403475863874], \"height\": 32, \"width\": 32, \"top\": {\"real\": [26312.861486548059, 16394.776884218503, -3997.4541326480944, 12005.135907922067, 1177.5601778241692, -334.84971513551272, -198.67917160941846, -63.09118295690562, -26.0143192287494, -17.75101650843531, -4.1366280143888243, 0.89820537026572267, -0.32480674164662798, -0.084346178359567467, -0.13448645703297074, 0.022458369013166949, 0.0037906136595566063, 0.022458369013118644, -0.13448645703284343, -0.084346178359639243, -0.32480674164661494, 0.89820537026588532, -4.1366280143890872, -17.751016508434784, -26.0143192287494, -63.091182956905335, -198.67917160941835, -334.84971513551284, 1177.5601778241696, 12005.135907922073, -3997.4541326480962, 16394.776884218489, -7474.6405977592167, -8567.9043780819939, -2236.1016166727777, 5029.218127936877, 173.97100199359824, -922.65330403810697, -153.6610478382718, -4.01177942588299, -14.977979358030328, -15.430842802070819, -7.4975861096446677, 1.585406689794443, 0.17906893603683641, -0.1458960091743404, -0.061043080293462629, -0.0046072373939513231, 0.0087184428309440426, 0.017310354876342828, -0.025331085027308461, -0.090673583392976279, -0.39184400032069594, -0.73078681815467361, -0.92174645774086517, -10.93402591728189, -30.447262913620346, -38.126922827402865, -60.968110303669619, -681.13286643622507, 624.53857955695969, 7785.4292550857708, -1762.2326743166159, -6145.3703500362362, -30710.86949592911, -20630.868893573344, 1300.6579518513645, 5360.9184206698983, 848.32865192899703, -785.98438030181387, -108.77167233308913, 41.321279695295864, -0.027644771384101652, -9.534868349699865, -1.2097145653165393, 0.21253485530640887, -0.28694451643507407, -0.19362286330376682, -0.015513947258845627, 0.0028928780958250894, 0.010770434199071796, 0.0037362591288644677, -0.033458104535328603, -0.15988488342210658, 0.11739550901211815, 0.74668900068008903, -4.4804803612995503, -15.856083499246324, -27.816492049240171, 2.1424019920280393, 12.12605916297551, -787.56867680882806, -403.54468101232709, 3807.5774006807187, 4390.1153105308758, -17039.959036708919, -13609.16252827678, -9138.4955296375883, 2497.0113342386512, 4397.1447406314655, 786.4046140955403, -371.53196930683333, -41.579492344426484, 10.792253245683401, 12.926010493557772, -0.94130122169806685, -0.22574146482830848, -0.15910329528413825, 0.039542877145191092, -0.16497562627541082, -0.034546572003498262, 0.0028396778151660528, 0.0095036050242090567, 0.0028202375766785176, -0.035341389521162114, -0.14687879382002816, -0.12611798259866741, 0.45588994614236095, -0.25876313947681329, -11.107804183612142, -9.8469518252878121, 5.4748636450494486, 23.93852180867734, -449.68159927787053, -188.33038343684237, 3370.1365438276152, 4992.3705750204963, -4902.8469709692872, -11751.949054213763, -9055.7727899285892, -1597.312584178899, 1957.0910297219173, 675.954300804676, -59.523430315468971, 3.5981209875694646, 26.908851107336638, 3.3880871060788613, -6.3950609995768, -2.7652104861310596, 0.51553772502971873, 0.20366584836429452, -0.078076761518840479, -0.032306588307275633, -0.00033732640143732022, 0.0039882283816162498, 0.00882576812785189, -0.010351412440947377, -0.13141543694038546, -0.35838805663068013, -0.083665866496770311, -0.11489505024575582, -2.0174170653233996, 5.313800098890094, 16.719706304911163, 26.780389598343444, -155.76938280407634, 15.711518936085053, 2108.6641632789715, 2004.0776030609009, -5284.4851508729253, -7525.5124487476332, -5804.138136685775, -1404.695681801157, 766.79772203943867, 489.03634446603957, -8.722049146589729, -31.327724554225572, 11.011155797013167, -0.50779722959414419, -5.7422528468514669, -2.0029903992471274, 0.11899325802032906, 0.035426363555884931, -0.0016279289016664685, -0.0068853887710592244, 0.00084949455245666495, 0.0025820557167290517, 0.004778391224536287, -0.0060776628020400699, -0.066021172391945146, -0.14585644547184912, 0.31419533009862166, 0.4720008156080655, -3.7567756530835696, -5.2990493438664403, 20.309232259116531, 43.66331695464585, -13.481975167534534, 87.480286025038623, 872.01902032865974, 302.59784669978308, -3861.3331359414924, -2689.7311891987174, -2302.5619774650818, -533.70879716435536, 471.82586926866179, 253.24935366729582, -54.914023853010136, -45.128050992983141, 1.7233725901997559, 4.8083890914979186, -1.2558586165362935, -1.1198886962259056, -0.17080663964208292, 0.0073776692393840732, 0.01315742418122162, -0.0042018888945982991, 3.9927404722540691e-05, 0.0024301018087218612, 0.0013997723845362102, -0.01262770667339704, -0.024640414526077212, -0.031798236031438429, 0.16501061208698242, -0.053070166605889257, -2.4508298603470875, -6.1804125133917358, 1.555942705006216, 9.6369277380044327, -40.990915592068667, 48.381114122456317, 486.73310475433823, 304.00864677044143, -1317.5468335758922, -1423.509046098827, -1206.2870766014189, -258.09420634314597, 284.39023574769527, 170.47470391854262, -20.992706500305374, -30.973343141495711, -0.73408381954002189, 2.8760611038460322, -0.96452576448322436, -0.33780530346449972, 0.050525784186614971, 0.037431091543099905, -0.0017411003602284265, -0.0094665916234262064, -0.00075468105471295627, 0.0012390824544828156, 0.0015406044848658253, -0.0042340021876475491, -0.0099527381839567483, -0.017832280274117901, -0.0021885919874408454, -0.18486506545171935, -1.5473028239900652, -0.46733110563156899, 7.0159472975173207, -4.1293951866555583, -52.177815979563, -14.225382292199997, 266.2443485847607, 299.68761898427294, -502.75722346741452, -600.46969991458195, -533.72028053649831, -84.35869563264292, 149.66956177052822, 98.021239180316712, 5.9461121297863162, -11.840914283794969, -2.356375469113162, 0.20453312434178955, -0.31158766591945325, -0.14520584302328118, -0.014067565159284239, 0.014308802406409332, 0.0017127836707298723, -0.0045784971805314283, -0.0004316686427205439, 0.00062035219223615539, 0.00098821093942306776, 0.00037352179846464215, -0.0031201129359879932, 0.0028053468557916969, 0.01155415730259296, 0.043098557260407636, -0.50100451968487536, -0.34405016878893097, 4.6091984823197363, -1.1472068176591008, -29.145899633206373, -2.6052151602709381, 142.77222209569624, 179.10482852523111, -159.1039510457467, -164.80060347644744, -151.52622363641359, -12.964795600796743, 78.707005278515467, 49.611102594467418, 2.9148898834797565, -6.6982557512143011, -1.1108929795277851, 0.53317200343106397, -0.060952672321508208, -0.13796026336886294, -0.040312063728342999, 0.0091529292682895457, 0.00069551217754917558, -0.00049216012286125183, 0.00019632055084333887, 0.00016453496496604428, 0.00035411166615570894, 0.00029458111873911975, -0.0039224781743007692, -0.0012902932474049059, 0.022738683086130741, 0.0029642733314895081, -0.040660255117105054, -0.1581093035213153, 0.50820914967959807, -1.1517329733377961, -10.955670081779706, 6.6684998469426819, 73.509265817506147, 94.854507489855607, -30.375445723654334, -41.976518122871582, -38.330831793041703, 6.6541528790739966, 26.775549975763919, 13.67501905826837, -0.77255683543203624, -2.6427995487036586, -0.26778321549867995, 0.38263920912663341, 0.066476687185755071, -0.060499325131928558, -0.013860605018094061, 0.0044705403327676731, 0.00045553699537380387, -6.6832908987799432e-05, 5.7815338715827767e-05, 2.4201934805748865e-05, 2.4116728282913401e-05, -7.7908669355443089e-05, -0.0020106249903568347, -0.0030945645282710967, 0.011724362942541916, -0.0073188065692862368, -0.13872845280170487, -0.0525083726541943, 0.57465299048466112, -0.38679604474522938, -4.8536563727710194, -1.1675628703507077, 21.601631857858344, 37.913461849891526, 8.2459776248906191, -17.728252948144338, -17.913066539877509, -1.363521120172412, 8.6874027327585566, 5.1086905995493517, -0.15956522315726163, -1.0853380408525961, -0.17672593964480066, 0.18144159918607325, 0.051467156562084934, -0.020596344531497161, -0.004731774665412903, 0.0025169723177923789, 0.00031643566338613672, -0.00017373359946045594, -7.1999178350316855e-05, 3.5348452681660421e-06, 3.7806930339121046e-05, 2.3729245648202859e-05, -0.00042972130823292398, -0.0011045036274546954, 0.0022387979975912117, -0.0041954404795751096, -0.054281237122749564, 0.0079821569677783755, 0.36123191988222408, 0.078230863522083471, -1.8108271356936088, -1.1161504624718657, 6.2644803438069099, 11.381535938317967, 0.21980447663235644, -5.9387280202325705, -6.1357877592112944, -0.72356703610536932, 2.8717612965534967, 1.8272689141068139, 0.038901829717158748, -0.30585525507098987, -0.058991941107951799, 0.049323041374202826, 0.007749491998403548, -0.0026797748220028393, 2.6063267012890291e-05, 0.00066159304663239156, 7.7278494902114205e-05, -3.1100603910792207e-05, -1.5561043109534526e-05, 1.1911742325626112e-05, 2.0491322447673862e-05, -1.4767672160855649e-05, 7.2375275064916669e-05, 0.00028278010837829711, 0.0018655623121081823, 0.00079665654087039228, -0.014230202242318532, 0.015605588027909496, 0.15269277354560382, 0.042410343620558247, -0.5991836734745446, -0.42273281817515368, 2.2232923752479885, 4.029734867596904, -0.01297332387246361, -1.8890504514660771, -1.7044228721383259, -0.014407089546523855, 0.81475328270242842, 0.49486328945653796, 0.051378645502378667, -0.078019191874231134, -0.019791976482152574, 0.011942087677832957, 0.0037710881620078929, -0.0019373229659441914, -0.00028867057981419789, 0.000173087047265503, 3.9265425732721298e-05, 5.3761386290662811e-07, -1.6483764627679784e-06, 1.9354497917760563e-06, -1.043216287920153e-06, 1.251541032126094e-06, -2.0395625891304971e-05, 2.3143507174682374e-05, 0.0008565768791742647, 0.0015425089335333231, -0.0038713470880909978, -0.0045226552231720603, 0.026481416655982141, 0.0024818042284060491, -0.15643670700640799, -0.014637771070647379, 0.7413395210802084, 1.1863896819067066, -0.06073539777241771, -0.55423720177498148, -0.41318433868106841, 0.012013582173996683, 0.22946537156729221, 0.14022496275890783, 0.010987988714373856, -0.01679009744687791, -0.0027663623850498948, 0.0015534913917298809, 0.00054985818249530594, -0.00042583544807556255, -0.00029614878449876606, 1.3565162632662745e-05, 4.7965965686279184e-06, -1.4046487964451716e-06, -1.7593082382469076e-06, -2.320036873447806e-06, 2.4848934678754374e-07, -1.4522884424931378e-06, -5.2082671731122632e-06, 2.3151589195966712e-06, 0.00016541664707348802, 3.6529125267961852e-05, -0.0012890410598031484, -0.0010500227857359876, 0.0036910380457585109, -0.0025549445466396393, -0.038104522129866786, 0.016868811542239164, 0.22147893162995161, 0.26972216562160328, -0.11164745685412412, -0.1053213699265967, -0.065169792191789519, 0.050967642716828229, 0.082203097259608671, 0.037973776532028221, 0.002270145289904118, -0.0034852771985896215, -0.00051797014017785649, 0.00065999477810424847, 9.1449959395068298e-05, -9.1204391021716067e-05, -1.5180477673862282e-05, -1.4304323510152094e-05, -4.7668675387694358e-07, -3.3807620398649656e-07, -3.2827005154992035e-07, -6.0059383407177672e-07, 4.743645802817471e-07, 7.8835950629218593e-07, -2.5363312932279684e-06, 3.4933053894102948e-06, 4.918354682850915e-05, 9.9367636232135646e-05, -0.00011095747475971185, -0.00033735388707191222, -0.00017205199767281925, -0.0028150966049269007, -0.0066263773562998379, 0.016874993354405541, 0.081392801874071885, 0.10016944284496203, -0.0039898740972888948, -0.056558682919194136, -0.015674616081580436, 0.047420248352959368, 0.048984183536402902, 0.018095648558125472, 0.00019061585891928039, -0.00055865816852282587, 0.00028385103022481571, 3.8670538186828884e-05, -1.6713711240799624e-05, 3.5388781701807323e-05, 1.8038642046719724e-05, -2.7952818635613013e-07, -2.4658127673140311e-06, -1.5227319963665806e-07, -2.3332675048126655e-07, -1.3019579049092348e-07, -2.3332675083373355e-07, -1.5227319920541638e-07, -2.4658127673110402e-06, -2.7952818599492315e-07, 1.8038642046284464e-05, 3.5388781702455181e-05, -1.6713711239992412e-05, 3.8670538186828884e-05, 0.0002838510302257955, -0.00055865816852375373, 0.00019061585891278605, 0.01809564855812688, 0.048984183536407218, 0.047420248352966703, -0.01567461608157503, -0.10532136992661453, -0.0039898740972773798, 0.10016944284504853, 0.081392801874075937, 0.016874993354393339, -0.0066263773562901859, -0.0028150966049217711, -0.00017205199767197964, -0.00033735388707121654, -0.00011095747476002673, 9.9367636230791154e-05, 4.9183546829807197e-05, 3.4933053890940453e-06, -2.5363312945761086e-06, 7.8835950614532164e-07, 4.7436458143049758e-07, -6.005938340711767e-07, -3.2827005209480802e-07, -3.3807620383163872e-07, -4.7668675369876225e-07, -1.4304323509881206e-05, -1.5180477673786216e-05, -9.1204391019992904e-05, 9.1449959396039146e-05, 0.00065999477810600097, -0.00051797014017666832, -0.0034852771985941946, 0.0022701452899007964, 0.037973776532033036, 0.082203097259589145, 0.050967642716782412, -0.065169792191780859, -0.55423720177488789, -0.11164745685411237, 0.26972216562160034, 0.22147893162997134, 0.016868811542243251, -0.038104522129865558, -0.0025549445466363117, 0.0036910380457617423, -0.0010500227857337837, -0.0012890410598025771, 3.6529125267327953e-05, 0.00016541664707448109, 2.3151589193372615e-06, -5.2082671739343036e-06, -1.4522884428117831e-06, 2.4848934734967557e-07, -2.3200368734485688e-06, -1.7593082396192173e-06, -1.4046487964490078e-06, 4.7965965689104361e-06, 1.3565162632914686e-05, -0.00029614878449827947, -0.00042583544807430477, 0.0005498581824961642, 0.0015534913917295296, -0.002766362385049678, -0.016790097446884332, 0.010987988714361836, 0.14022496275891236, 0.22946537156726918, 0.012013582173935911, -0.4131843386810784, -1.8890504514661226, -0.060735397772418001, 1.1863896819067115, 0.74133952108018497, -0.014637771070638499, -0.15643670700640161, 0.0024818042284152002, 0.026481416655986481, -0.0045226552231720108, -0.0038713470880910664, 0.0015425089335324559, 0.00085657687917487868, 2.3143507174645941e-05, -2.0395625891635653e-05, 1.2515410319035661e-06, -1.0432162880357027e-06, 1.9354497917755154e-06, -1.648376462389003e-06, 5.3761386277171334e-07, 3.9265425733411684e-05, 0.00017308704726561608, -0.00028867057981368457, -0.0019373229659434092, 0.0037710881620082728, 0.011942087677832796, -0.019791976482151457, -0.078019191874226498, 0.051378645502381547, 0.4948632894565238, 0.81475328270235614, -0.014407089546580973, -1.7044228721383166, -5.9387280202324542, -0.012973323872509449, 4.0297348675968632, 2.2232923752479965, -0.42273281817513425, -0.5991836734745476, 0.042410343620560523, 0.15269277354560529, 0.015605588027911042, -0.014230202242318617, 0.00079665654086961773, 0.0018655623121089473, 0.00028278010837819401, 7.237527506430049e-05, -1.4767672161149705e-05, 2.0491322447334689e-05, 1.1911742325624598e-05, -1.5561043110042614e-05, -3.1100603910787708e-05, 7.7278494901711681e-05, 0.00066159304663245509, 2.6063267012872924e-05, -0.0026797748220015139, 0.0077494919984037978, 0.049323041374203298, -0.058991941107945506, -0.30585525507097922, 0.038901829717163883, 1.8272689141068059, 2.8717612965534687, -0.72356703610543815, -6.1357877592112144, -17.728252948144313, 0.21980447663230326, 11.381535938317855, 6.2644803438068752, -1.1161504624718652, -1.810827135693615, 0.078230863522088162, 0.3612319198822263, 0.0079821569677794718, -0.054281237122748544, -0.0041954404795757263, 0.00223879799759173, -0.0011045036274548153, -0.0004297213082331914, 2.3729245648252329e-05, 3.7806930338968797e-05, 3.5348452681631499e-06, -7.1999178350888311e-05, -0.00017373359946041533, 0.00031643566338576109, 0.0025169723177924353, -0.0047317746654124164, -0.020596344531496415, 0.051467156562086717, 0.18144159918607133, -0.17672593964479372, -1.0853380408525777, -0.1595652231572473, 5.1086905995493037, 8.6874027327584269, -1.3635211201724846, -17.913066539877416, -41.976518122871397, 8.245977624890596, 37.913461849891497, 21.601631857858315, -1.1675628703506762, -4.8536563727710167, -0.38679604474523593, 0.57465299048466256, -0.0525083726541926, -0.13872845280170543, -0.0073188065692886169, 0.011724362942542425, -0.0030945645282711917, -0.002010624990356365, -7.7908669355331091e-05, 2.4116728282715131e-05, 2.4201934805746541e-05, 5.7815338716136568e-05, -6.6832908987693356e-05, 0.00045553699537366862, 0.0044705403327679654, -0.013860605018093377, -0.060499325131926705, 0.066476687185756819, 0.38263920912663169, -0.26778321549867512, -2.6427995487036529, -0.77255683543202414, 13.67501905826833, 26.775549975763717, 6.6541528790738154, -38.33083179304154, -164.80060347644644, -30.375445723654281, 94.854507489855592, 73.509265817506247, 6.6684998469427503, -10.955670081779644, -1.1517329733377899, 0.50820914967959985, -0.15810930352131641, -0.040660255117104735, 0.0029642733314879993, 0.0227386830861314, -0.0012902932474053552, -0.0039224781743013607, 0.00029458111873885689, 0.00035411166615547979, 0.00016453496496604298, 0.00019632055084304811, -0.00049216012286159682, 0.00069551217754943101, 0.0091529292682893254, -0.040312063728344255, -0.13796026336886155, -0.060952672321507556, 0.53317200343106097, -1.1108929795277824, -6.6982557512142833, 2.9148898834797672, 49.611102594467262, 78.707005278515183, -12.964795600796847, -151.52622363641291, -600.46969991458195, -159.10395104574698, 179.10482852523111, 142.77222209569621, -2.6052151602709213, -29.145899633206394, -1.1472068176590924, 4.6091984823197309, -0.34405016878893097, -0.50100451968487369, 0.043098557260408649, 0.011554157302593657, 0.0028053468557916613, -0.003120112935988917, 0.00037352179846528708, 0.00098821093942341102, 0.00062035219223615539, -0.00043166864272108633, -0.0045784971805325507, 0.0017127836707311211, 0.014308802406410212, -0.014067565159284841, -0.14520584302327849, -0.31158766591945286, 0.20453312434178955, -2.3563754691131549, -11.840914283794984, 5.9461121297862585, 98.021239180316684, 149.66956177052836, -84.358695632642934, -533.72028053649808, -1423.509046098827, -502.75722346741475, 299.68761898427243, 266.24434858476053, -14.225382292200068, -52.177815979562951, -4.1293951866555521, 7.0159472975173225, -0.46733110563156605, -1.5473028239900675, -0.18486506545171727, -0.0021885919874428559, -0.017832280274118859, -0.0099527381839588144, -0.0042340021876453469, 0.0015406044848677103, 0.0012390824544828119, -0.00075468105471319154, -0.0094665916234262307, -0.0017411003602265445, 0.037431091543101133, 0.050525784186618933, -0.33780530346449777, -0.96452576448320959, 2.8760611038460344, -0.73408381953999657, -30.973343141495679, -20.992706500305406, 170.47470391854245, 284.39023574769476, -258.09420634314608, -1206.2870766014166, -2689.7311891987179, -1317.5468335758917, 304.00864677044098, 486.73310475433766, 48.38111412245636, -40.990915592068674, 9.636927738004438, 1.5559427050062113, -6.1804125133917411, -2.4508298603470964, -0.053070166605885212, 0.16501061208697854, -0.031798236031439234, -0.024640414526075623, -0.012627706673397836, 0.001399772384542092, 0.0024301018087218504, 3.9927404721417186e-05, -0.0042018888946034633, 0.013157424181215942, 0.0073776692393865565, -0.17080663964207793, -1.1198886962258996, -1.2558586165362777, 4.8083890914979266, 1.7233725901997718, -45.128050992983098, -54.914023853010271, 253.24935366729582, 471.82586926866219, -533.70879716435559, -2302.5619774650809, -7525.5124487476278, -3861.3331359414919, 302.59784669978211, 872.01902032865962, 87.480286025038581, -13.481975167534443, 43.663316954645794, 20.309232259116435, -5.2990493438664386, -3.7567756530835754, 0.47200081560804741, 0.31419533009862788, -0.14585644547184853, -0.066021172391939276, -0.0060776628020447684, 0.0047783912245386402, 0.0025820557167290522, 0.00084949455245703076, -0.0068853887710688764, -0.0016279289016736856, 0.035426363555892841, 0.11899325802032523, -2.0029903992471114, -5.7422528468514553, -0.50779722959413964, 11.011155797013195, -31.327724554225593, -8.7220491465898675, 489.03634446603934, 766.79772203943878, -1404.6956818011561, -5804.1381366857704, -11751.949054213763, -5284.4851508729271, 2004.0776030608997, 2108.6641632789701, 15.711518936085099, -155.76938280407595, 26.780389598343376, 16.719706304911028, 5.3138000988900851, -2.0174170653233965, -0.11489505024579171, -0.083665866496761998, -0.35838805663067708, -0.13141543694038144, -0.010351412440954411, 0.0088257681278659308, 0.0039882283816162533, -0.00033732640143905191, -0.032306588307287817, -0.078076761518840951, 0.20366584836429438, 0.51553772502971895, -2.7652104861310511, -6.3950609995767769, 3.3880871060788507, 26.908851107336602, 3.5981209875695015, -59.523430315469177, 675.95430080467531, 1957.0910297219166, -1597.3125841788988, -9055.7727899285874, -13609.162528276773, -4902.8469709692927, 4992.3705750204963, 3370.1365438276171, -188.33038343684228, -449.68159927787059, 23.938521808677311, 5.474863645049389, -9.8469518252878032, -11.107804183612158, -0.25876313947681701, 0.45588994614236283, -0.12611798259867754, -0.14687879382002969, -0.035341389521171523, 0.002820237576687255, 0.0095036050242090532, 0.002839677815167327, -0.034546572003505492, -0.16497562627542883, 0.039542877145184945, -0.15910329528412964, -0.2257414648283198, -0.94130122169803698, 12.926010493557788, 10.792253245683524, -41.579492344426235, -371.53196930683367, 786.40461409554018, 4397.1447406314655, 2497.0113342386503, -9138.4955296375883, -30710.869495929113, -17039.959036708926, 4390.1153105308786, 3807.5774006807205, -403.54468101232675, -787.5686768088284, 12.126059162975466, 2.1424019920278234, -27.816492049240171, -15.856083499246239, -4.4804803612996116, 0.7466890006801008, 0.11739550901211765, -0.15988488342208015, -0.033458104535332392, 0.0037362591288712223, 0.010770434199071798, 0.0028928780958374094, -0.015513947258866389, -0.19362286330377187, -0.28694451643508428, 0.21253485530639998, -1.2097145653165073, -9.5348683496998436, -0.027644771384098099, 41.321279695296035, -108.77167233308927, -785.98438030181433, 848.32865192899692, 5360.9184206698983, 1300.6579518513656, -20630.868893573341, -7474.6405977592276, -6145.3703500362381, -1762.2326743166138, 7785.4292550857645, 624.53857955695855, -681.13286643622564, -60.968110303669903, -38.126922827402971, -30.447262913620339, -10.93402591728205, -0.92174645774084907, -0.73078681815469149, -0.39184400032067312, -0.090673583392963469, -0.025331085027316205, 0.017310354876322938, 0.0087184428309440443, -0.0046072373940015798, -0.061043080293425964, -0.14589600917437914, 0.17906893603684051, 1.5854066897944772, -7.4975861096446481, -15.430842802070792, -14.977979358030328, -4.0117794258829509, -153.66104783827134, -922.65330403810628, 173.97100199359761, 5029.218127936876, -2236.1016166727782, -8567.9043780819939], \"imag\": [0.0, -565.83540142139123, 2034.1707150791078, -2899.4713440958676, -705.26395079653423, -264.15772704109196, -68.25893457091972, 21.864239089276673, -9.2600847387275351, -0.77203496144657713, 0.46094227484148159, 0.050432963713891818, 0.4817041633893655, 0.069133436726486502, -0.053750756537428696, 0.0072803724650655878, 0.0, -0.0072803724650335657, 0.053750756537431763, -0.069133436726473527, -0.4817041633893806, -0.050432963713828063, -0.46094227484152789, 0.77203496144659334, 9.2600847387275351, -21.864239089276733, 68.258934570919919, 264.15772704109207, 705.263950796534, 2899.4713440958658, -2034.1707150791096, 565.83540142139009, -27456.969846005039, 15801.95774991386, 6659.2852195136584, -5625.222440567115, -315.00701580725445, 272.57265196057085, -226.29890693046426, -11.162014580405042, 22.51960143730463, 12.777842336107099, -0.00080551226422213157, -0.40616257836882108, 0.090977957608488841, 0.020544905947865743, -0.0050852207874264883, 0.005762481528077454, -0.0051011628064007979, 0.008737332888475351, -0.024097393253454041, 0.064089909650063406, -0.12938270466631999, 0.53088177925581315, -0.6296735496972713, -5.9301461429211297, -10.810291764213344, -3.7416120100021248, -182.38596939283659, -362.28186950461651, -992.82929249872541, -4862.6686041022249, 4699.2031805565066, 18939.315780035107, 10706.514246895442, -4202.5064061160292, -8815.5169521241642, 1263.9440399653656, 1779.1449685952537, 162.85707963816941, -206.3024685851984, 13.222359870031848, 21.464492537709937, 20.567779042237813, 0.65600865155601296, -0.18805381897022255, -0.36223791541012046, 0.1254341335131833, 0.020744772339125268, 0.00182748958184843, -0.0042992876297386403, -0.0012201610716230688, -0.017092494175410845, -0.076964103250570653, 0.098376776437578264, 0.4173977832999109, -0.76419419802802224, 1.7461999698867376, 9.8585155596813561, 24.776358129244393, -211.6323955131393, -238.91976950528434, 1185.1238932642693, 1296.4366520857086, -4946.0282562867787, -5281.5723471297015, -13391.901368395223, -11194.545427930107, -3925.7577913329569, 887.46023361526534, 945.20766142433024, 84.877841434423829, -42.932263785691212, -4.9615998121405198, -2.2373513523401476, 3.2722596307272758, -0.72535972703625207, -0.26143602710083624, 0.17221216218193261, 0.13507416188085969, 0.00023543387332632535, -0.004345917754103765, 0.00085055424110927274, -0.0037937176827999176, -0.0081378837299059311, -0.075677036525131303, -0.15032468438850372, -0.38722147995532397, 0.029603642148641713, 7.4921225563560006, 16.360105748561345, 29.902810744114234, -93.460146257112015, -275.96221185192559, 922.99713133386672, 2711.515323984423, -1933.4800470053665, -10929.798398133844, 684.97959165063389, 602.54327944682984, -1010.3237650874754, -821.26497752603393, 354.91295307862521, 267.12706753457422, -50.770431510290891, -60.739251530981761, -3.0004343666525628, 2.078290590472712, -2.279554023627556, -0.70169954600639106, 0.15105372261757208, 0.07861078903623217, 0.022330776935849336, 0.0012282676678784887, -0.00060025303576528312, -0.0034390891352469423, 0.011529870687322991, 0.014029711179492978, 0.1252130338315626, -0.55405390993532211, -0.54107724731740914, 0.87667351785494574, 3.6828009300200657, -7.4141267588561011, -13.004195929909718, -24.795065499663313, 420.27054634951992, 459.95573868102485, -942.16755498192015, -1112.054015955898, 2348.3469931726836, 1883.3636695028392, -240.70143186447856, -105.71673535442261, 372.79259353377239, 52.920672453261901, -92.068040375826783, -26.276835867611968, 6.7051139314185226, 3.245275744583783, -0.60045275904084205, -0.50382743582039524, -0.067202922116500141, 0.024987588306014712, 0.02345280256265949, 0.0036069899885115028, -0.0019176843365481997, -0.0026716531574556067, -0.0020365413730906823, -0.011083467862231831, 0.11877640918683252, 0.22402554985838732, -0.99918245590032706, -3.4731271711763432, 0.48835520550537315, -13.858896676215748, -73.254839813416254, -21.319429226850428, 379.31228865246607, 351.81985736289278, -537.57809524921299, 401.89162402051699, 608.06184705207306, 404.48916791571293, -26.0947672494631, -28.936629621288695, 88.255503332807123, 24.728035394109561, -22.866056256077933, -13.157904592767515, -0.15967604903152702, 2.526299018978182, 0.12352888715752443, -0.23422795848566569, -0.030590557055647175, 0.016424937283601903, 0.0056060898486765369, -0.00045117160770213557, -0.00085071688314226489, -0.0011353628514113501, 0.0023693867958524341, -0.0020514022508182662, 0.047410658855092408, -0.047246191697244096, -0.80895482070078151, -2.1371851454270119, 2.4873407504647034, 5.7983733792054322, -40.953249308721645, -95.737309397844541, 76.822153629632922, 273.3130006291081, 25.450658270222483, 108.35753184636786, -342.27621105731498, -348.25890814832445, -304.47603827676795, -96.629055803978503, 63.023130997866865, 57.409949251798395, 2.568042168489272, -13.095155674154295, -3.2681008083097729, 0.88286993545095549, 0.13472332633921499, -0.098529564497226177, -0.013721933165641624, 0.0016719543218752051, -0.00081574697753264229, -0.00012016604513092251, 2.100818845429297e-06, -0.00060431365246994741, -0.00084901673761287883, 0.013320171975788974, 0.024623507369733132, -0.041782640680197221, -0.60700748329107235, -0.43012965453926089, 2.2891908586667724, 0.48632248954743251, -15.792270422196429, -28.193965034765785, 48.029615644247542, 111.09879990264463, -87.497164212346334, -334.6737117352032, -142.68730890272883, -91.053579482449521, -99.787409897491159, -55.001294578822431, 29.906016170654414, 37.535076920090127, 4.5234778785073582, -7.1923708075200636, -1.3689331500831903, 0.35202350218593043, -0.0362018905598291, -0.061463792395340174, -0.022721689012942182, 0.0082737875972394501, 0.0032130032530252534, 0.00039450994426574093, -2.8031778648544371e-05, -0.00041406827904942888, -0.0027075490516005737, -4.6035494233911042e-05, 0.0066681432594733418, 0.0047951528835353972, -0.05690176651734323, -0.24922608889607248, 0.498049017017482, -2.4309674287383847, -12.16171561638105, 0.97951365769633958, 48.129088343602525, 56.486069104567768, -41.171639289684258, -127.72312720337817, -5.4282746232061827, -9.7835860709552271, -33.975619755276277, -24.806312587182678, 2.4072249874859208, 11.539786987684712, 2.1158028157224305, -2.1858286220084042, -0.55165459871114553, 0.18427966087195025, 0.036325697906855962, -0.045150767767426783, -0.010550176613753719, 0.0060855196058800442, 0.0017281414610421119, 7.2497674435495387e-05, -0.00021205409372000895, -2.0602816877647228e-05, -0.0011298747328672136, -0.0028809147575241121, -0.0012342607279736744, -0.011825603754497111, -0.087069268286694118, -0.14265264682578704, 0.15323327509603407, -0.85687745542587679, -6.0248432237602145, -2.077910419819851, 20.474406237761055, 25.037428100181106, -14.989381828055835, -36.497593867080774, -17.729338100591551, -17.576621089243332, -19.487467662417078, -10.955871914675358, 2.3165455312690852, 5.4119853383600915, 0.54621288944966873, -1.3157595111644833, -0.34743645177227866, 0.1287210896998103, 0.047412118534244603, -0.0077851049698980206, -0.004201560949808625, 0.0010934558980435574, 0.00023257626702487001, -9.2808109881009371e-05, -8.7155323163908151e-05, -3.9084915731858744e-05, -0.00010250720925033233, -0.00067901668703098609, 0.0014464277080026529, -0.0048636342861169473, -0.067823949067901526, -0.057130716853855026, 0.21557912264683496, 0.06519665350656248, -1.6533046454778435, -1.8832932452039048, 3.7264846171107551, 6.4019126311322827, -3.9744235027987749, -16.160449140843355, -8.4822228391137156, -8.7315069105384708, -6.1656643244543572, -2.3598704650957352, 1.9985565184181031, 2.3405484242614913, 0.29382845386145329, -0.50865792651575648, -0.17305354955167165, 0.046960029345024031, 0.015263156905378368, -0.0036170611596276912, -0.0013726058920436061, 2.237332432783488e-05, 9.385945789129954e-05, 1.3994387363258527e-05, -1.5306190418175455e-05, -2.2179563572570082e-06, 1.915436069625878e-05, 1.6056362425269958e-05, 0.0016017335432058808, 0.0021630491325728405, -0.015795334924840046, -0.011660119791667443, 0.14639963344722604, 0.10651220377116319, -0.88291287420081066, -1.2568372820076821, 1.6004592076355926, 4.2391713347552544, 2.2028113471748907, -3.1469764634818462, -2.242974904561942, -2.5538673583000224, -2.2927664969925643, -0.71511526306228479, 0.70142225830116711, 0.87257163068624521, 0.19846976557711371, -0.15249245278412921, -0.070864296996220155, 0.0099358115635036701, 0.0047066150942456026, -0.0026523157902845263, -0.00085439958417801774, 0.00013944973801692797, 7.2704791039188404e-05, 1.2601241693252589e-05, -1.5809883406608869e-05, -1.0011729527080636e-05, -7.9478542847663604e-05, -0.00022527265138271089, 0.00045307702727412569, 0.00050105816519738884, -0.004694536759989586, -0.0093912827538699273, 0.048586273708375149, 0.030553958637497009, -0.25838788694247888, -0.40093326275917601, 0.49595628709938333, 1.6851565365398353, 1.1309597417418693, -1.056522952990393, -0.80247840632915779, -1.026927016182452, -0.88651914954529398, -0.43650779681426854, 0.11316541147379869, 0.23035854544536424, 0.059920467833033307, -0.036190438604187899, -0.01725390654373966, 0.0023509305274026565, 0.001478217289217426, -0.00072670648727194635, -0.0003680247758271001, 7.1552277723323216e-05, 3.3018347577537154e-05, -6.270504054453194e-06, -5.0961890322362396e-06, -8.2597481363066073e-07, -2.4936495372693928e-05, -0.00010760628949477799, -7.7022154797155748e-05, 8.3265078915305005e-05, -0.0013990135309411168, -0.0028172526227442643, 0.010701408851355284, 0.0072451530391376149, -0.086150037841453433, -0.14460665466238934, 0.049708417947223346, 0.39521478333333182, 0.28744423285388176, -0.29861910565037264, -0.3386926979654547, -0.41865673900782491, -0.35458750065998923, -0.15351062390629316, 0.023283787620964443, 0.070315990790370639, 0.021825222068831439, -0.0094360968553556454, -0.005228648752625107, 0.0016419352706606338, 0.00062222393158804063, -0.00023654954587354915, -9.5116584994877886e-05, 9.8316138184821904e-06, 8.5616544537091567e-06, -1.8490511258670774e-06, -1.3806960215566987e-06, -7.8418160579829819e-07, 6.1187783428882963e-07, -1.4184243450717458e-05, -1.6817152282181301e-06, 7.7315413636427208e-05, -0.00049776351731738936, -0.0011677770881636529, 0.0043012344452256343, 0.0053934499385103812, -0.019935861209744145, -0.053344442429226806, -0.0040707298903069475, 0.10515901839488417, 0.12441049519027374, -0.064763119504183633, -0.033271590846292554, -0.10779677164705558, -0.11539582523941379, -0.051505283097805894, 0.0069246983450398508, 0.021708652485324127, 0.0069347628931926159, -0.0022906766529511625, -0.0016964640398162575, 0.00025142958382895784, 0.00031770653382385736, 1.1032501437955532e-05, -8.7468779744470293e-06, 5.5945066423596016e-06, 1.7972345455397561e-06, 4.5616338203520101e-07, 9.7201394524267242e-08, 4.7224934971170761e-07, -3.3798970421174713e-06, -2.8493281587958699e-06, 1.5043823885218312e-05, 5.8125806227282977e-05, -0.00024311382978972981, -0.00034121417018685452, 0.0017972456094799462, 0.002919931802959911, -0.0062096116659288523, -0.016969044244524348, -0.0032835840838819309, 0.038807899659842743, 0.067426466166360513, 0.050826644444124935, 0.0, -0.049486105286858977, -0.055102269491050557, -0.024933286677064983, 0.0027131015547638831, 0.0094232929485847418, 0.0031928535384108483, -0.0010192088413809152, -0.00065687472267875711, 9.9406390967590554e-05, 9.2117117221092925e-05, 4.2835653158188598e-07, -1.1077354271652886e-05, 4.6988159821331912e-06, 1.8643898350265165e-06, -1.3325436344526307e-07, 0.0, 1.3325436148527189e-07, -1.8643898357013856e-06, -4.698815982340655e-06, 1.1077354271338259e-05, -4.2835653029578673e-07, -9.2117117220968567e-05, -9.9406390967541697e-05, 0.00065687472267875711, 0.0010192088413828024, -0.0031928535384109992, -0.0094232929485852882, -0.0027131015547645593, 0.024933286677071297, 0.055102269491057093, 0.049486105286870655, 0.033271590846436425, -0.050826644444130153, -0.067426466166320781, -0.038807899659787329, 0.0032835840838925869, 0.01696904424452016, 0.0062096116659344346, -0.0029199318029558409, -0.0017972456094788201, 0.00034121417018834725, 0.00024311382979051588, -5.8125806225852501e-05, -1.5043823885472467e-05, 2.8493281592184042e-06, 3.3798970414074387e-06, -4.7224935044335926e-07, -9.7201394523848146e-08, -4.5616338348029835e-07, -1.7972345459045348e-06, -5.5945066421669702e-06, 8.7468779741463935e-06, -1.1032501437633476e-05, -0.00031770653382469171, -0.00025142958382980715, 0.0016964640398156006, 0.0022906766529529358, -0.0069347628931879929, -0.021708652485317177, -0.0069246983450331808, 0.051505283097836994, 0.11539582523943163, 0.10779677164702299, 0.3386926979653444, 0.064763119504166911, -0.12441049519022664, -0.10515901839483223, 0.004070729890304727, 0.053344442429226403, 0.019935861209740766, -0.0053934499385123874, -0.0043012344452267063, 0.0011677770881626617, 0.00049776351731785828, -7.7315413635329507e-05, 1.6817152281107408e-06, 1.4184243450816806e-05, -6.1187783459995966e-07, 7.8418160414892948e-07, 1.3806960215563787e-06, 1.8490511250936381e-06, -8.5616544541499696e-06, -9.8316138175931616e-06, 9.5116584994742171e-05, 0.00023654954587342899, -0.00062222393158917633, -0.0016419352706608273, 0.0052286487526254947, 0.0094360968553597515, -0.021825222068826373, -0.070315990790367974, -0.023283787620951409, 0.15351062390632836, 0.35458750065996514, 0.41865673900782463, 0.80247840632930123, 0.29861910565040301, -0.28744423285381543, -0.39521478333324389, -0.049708417947207637, 0.14460665466238265, 0.086150037841446453, -0.0072451530391390538, -0.010701408851356092, 0.0028172526227436055, 0.0013990135309424952, -8.3265078914415499e-05, 7.7022154796884101e-05, 0.00010760628949436256, 2.4936495372172559e-05, 8.2597481160475411e-07, 5.0961890322364048e-06, 6.270504053587473e-06, -3.3018347577843258e-05, -7.1552277722738763e-05, 0.00036802477582684921, 0.00072670648727208957, -0.0014782172892186336, -0.0023509305274016343, 0.017253906543740219, 0.0361904386041903, -0.059920467833026222, -0.23035854544535139, -0.11316541147376862, 0.436507796814322, 0.88651914954535227, 1.0269270161824879, 2.2429749045618363, 1.0565229529903326, -1.1309597417418378, -1.6851565365398167, -0.49595628709941025, 0.40093326275916286, 0.25838788694247145, -0.030553958637498463, -0.048586273708375489, 0.0093912827538692768, 0.0046945367599903042, -0.00050105816519528668, -0.00045307702727423699, 0.00022527265138177463, 7.9478542847089153e-05, 1.0011729526400015e-05, 1.5809883406608184e-05, -1.2601241693104561e-05, -7.2704791039154929e-05, -0.00013944973801701606, 0.00085439958417779277, 0.0026523157902857862, -0.0047066150942464552, -0.0099358115635039043, 0.070864296996221418, 0.15249245278412987, -0.19846976557711321, -0.87257163068623855, -0.70142225830113492, 0.71511526306233175, 2.2927664969925812, 2.5538673583000056, 8.4822228391138594, 3.1469764634817636, -2.2028113471748418, -4.2391713347551567, -1.6004592076355943, 1.256837282007673, 0.88291287420080655, -0.10651220377116098, -0.14639963344722345, 0.011660119791666538, 0.015795334924840389, -0.0021630491325718448, -0.0016017335432059105, -1.6056362425267762e-05, -1.9154360696782612e-05, 2.2179563562188507e-06, 1.5306190418174822e-05, -1.3994387363725719e-05, -9.3859457891797799e-05, -2.2373324326887067e-05, 0.001372605892043584, 0.0036170611596280633, -0.015263156905379492, -0.046960029345022428, 0.17305354955167276, 0.50865792651575092, -0.29382845386145795, -2.3405484242614674, -1.9985565184180694, 2.3598704650957769, 6.1656643244542986, 8.7315069105383625, 17.729338100591146, 16.16044914084344, 3.9744235027988806, -6.4019126311322339, -3.7264846171107413, 1.8832932452038942, 1.6533046454778479, -0.065196653506560565, -0.21557912264683374, 0.057130716853852841, 0.067823949067901873, 0.0048636342861174938, -0.0014464277080027464, 0.00067901668703094988, 0.00010250720924968801, 3.9084915731564376e-05, 8.7155323163908978e-05, 9.2808109880357901e-05, -0.0002325762670250908, -0.0010934558980430407, 0.0042015609498085452, 0.0077851049698978879, -0.047412118534246123, -0.12872108969980919, 0.347436451772281, 1.3157595111644818, -0.54621288944967405, -5.4119853383600702, -2.3165455312690484, 10.955871914675381, 19.487467662417213, 17.576621089243289, 5.4282746232066126, 36.497593867080688, 14.989381828055899, -25.037428100180914, -20.474406237761002, 2.0779104198198417, 6.0248432237602181, 0.85687745542587901, -0.15323327509603168, 0.14265264682578829, 0.087069268286695561, 0.011825603754498296, 0.0012342607279732299, 0.0028809147575238926, 0.0011298747328662582, 2.0602816877460582e-05, 0.00021205409372000841, -7.2497674436697104e-05, -0.0017281414610421523, -0.006085519605879876, 0.010550176613753189, 0.04515076776742772, -0.036325697906856379, -0.18427966087195091, 0.55165459871114753, 2.1858286220084038, -2.1158028157224313, -11.539786987684664, -2.4072249874858644, 24.806312587182791, 33.975619755276242, 9.783586070955252, 142.68730890272883, 127.72312720337824, 41.171639289684236, -56.486069104567761, -48.129088343602554, -0.9795136576963499, 12.161715616381057, 2.4309674287383989, -0.498049017017482, 0.24922608889607162, 0.05690176651734568, -0.0047951528835340962, -0.00666814325947404, 4.6035494233416009e-05, 0.0027075490515988954, 0.00041406827904844702, 2.8031778648544371e-05, -0.00039450994426571523, -0.0032130032530263515, -0.0082737875972399878, 0.022721689012943438, 0.061463792395343643, 0.036201890559829163, -0.3520235021859332, 1.3689331500831903, 7.1923708075200734, -4.5234778785073484, -37.53507692009012, -29.906016170654418, 55.001294578822382, 99.787409897491187, 91.053579482449422, 342.27621105731453, 334.67371173520326, 87.497164212346618, -111.0987999026444, -48.029615644247457, 28.193965034765707, 15.792270422196436, -0.48632248954740509, -2.2891908586667706, 0.43012965453925761, 0.60700748329106979, 0.041782640680199906, -0.024623507369732841, -0.013320171975792017, 0.00084901673761237609, 0.0006043136524673308, -2.1008188454298679e-06, 0.0001201660451322299, 0.00081574697752853306, -0.0016719543218773789, 0.013721933165640972, 0.098529564497228272, -0.13472332633921438, -0.88286993545096504, 3.2681008083097729, 13.095155674154302, -2.5680421684892911, -57.409949251798253, -63.023130997866808, 96.62905580397846, 304.47603827676824, 348.25890814832377, -608.06184705207238, -108.3575318463683, -25.450658270222359, -273.31300062910782, -76.822153629632936, 95.737309397844399, 40.953249308721709, -5.7983733792054135, -2.4873407504647047, 2.1371851454270088, 0.80895482070078295, 0.047246191697243041, -0.047410658855088467, 0.0020514022508175854, -0.002369386795852814, 0.0011353628514107392, 0.00085071688314226511, 0.00045117160770050525, -0.0056060898486796759, -0.016424937283604724, 0.030590557055645055, 0.23422795848566832, -0.12352888715752926, -2.5262990189781851, 0.15967604903152918, 13.157904592767508, 22.866056256077929, -24.728035394109568, -88.255503332807095, 28.936629621288684, 26.094767249463303, -404.48916791571332, -2348.346993172679, -401.89162402051733, 537.57809524921231, -351.81985736289272, -379.31228865246618, 21.319429226850364, 73.254839813416325, 13.858896676215757, -0.48835520550537709, 3.4731271711763214, 0.99918245590033916, -0.22402554985838727, -0.11877640918683258, 0.011083467862236249, 0.0020365413730902885, 0.0026716531574479938, 0.001917684336548198, -0.0036069899885160838, -0.023452802562666058, -0.024987588306021404, 0.067202922116505387, 0.50382743582040856, 0.6004527590408355, -3.2452757445837785, -6.7051139314185244, 26.276835867611975, 92.068040375826797, -52.920672453261844, -372.79259353377256, 105.71673535442247, 240.70143186447768, -1883.363669502841, -684.97959165063321, 1112.0540159558975, 942.16755498192003, -459.95573868102451, -420.27054634951992, 24.795065499662957, 13.004195929909772, 7.4141267588561703, -3.682800930020067, -0.87667351785495562, 0.54107724731740381, 0.55405390993531467, -0.1252130338315631, -0.014029711179499669, -0.011529870687323501, 0.0034390891352509903, 0.00060025303576528312, -0.0012282676678759762, -0.022330776935852007, -0.078610789036235279, -0.15105372261757474, 0.70169954600638929, 2.2795540236275773, -2.0782905904726996, 3.000434366652557, 60.739251530981811, 50.770431510290891, -267.12706753457417, -354.91295307862521, 821.26497752603382, 1010.3237650874759, -602.54327944683052, 13391.901368395234, 10929.798398133857, 1933.4800470053663, -2711.5153239844217, -922.99713133386661, 275.96221185192491, 93.460146257111958, -29.902810744114028, -16.360105748561381, -7.4921225563559606, -0.029603642148639909, 0.38722147995532696, 0.15032468438850879, 0.075677036525108848, 0.0081378837299098394, 0.0037937176827991482, -0.00085055424110926829, 0.0043459177540993259, -0.00023543387332691185, -0.13507416188085952, -0.17221216218196025, 0.26143602710082897, 0.72535972703626972, -3.2722596307272944, 2.2373513523401622, 4.9615998121405012, 42.932263785691291, -84.877841434423658, -945.20766142432956, -887.46023361526682, 3925.7577913329583, 11194.545427930101, -10706.514246895442, 5281.5723471297006, 4946.0282562867797, -1296.4366520857075, -1185.1238932642696, 238.9197695052832, 211.6323955131397, -24.776358129244326, -9.8585155596813792, -1.7461999698868065, 0.76419419802801547, -0.41739778329989746, -0.098376776437577709, 0.076964103250559746, 0.017092494175422378, 0.0012201610715871689, 0.004299287629738649, -0.0018274895818451932, -0.020744772339150463, -0.12543413351316696, 0.36223791541011652, 0.18805381897020862, -0.65600865155600818, -20.567779042237863, -21.46449253770993, -13.222359870031557, 206.30246858519831, -162.85707963816978, -1779.1449685952532, -1263.9440399653668, 8815.516952124166, 4202.5064061160301, 27456.969846005039, -18939.315780035096, -4699.2031805565066, 4862.6686041022285, 992.82929249872586, 362.28186950461748, 182.38596939283644, 3.7416120100025241, 10.810291764213327, 5.9301461429212612, 0.62967354969719169, -0.53088177925578472, 0.12938270466632043, -0.064089909650021634, 0.024097393253418069, -0.0087373328884417078, 0.0051011628064008057, -0.0057624815280936303, 0.0050852207874495618, -0.020544905947870024, -0.090977957608502774, 0.40616257836881853, 0.00080551226426904543, -12.777842336107227, -22.519601437304647, 11.16201458040481, 226.29890693046417, -272.5726519605721, 315.00701580725359, 5625.222440567115, -6659.2852195136511, -15801.957749913861]}};\n\nvar nose_filter = {\"real\": [3.0408379415611857, 0.37822261363137938, 1.1747173276627942, 0.87791572866957501, 0.27429578524536991, -0.26015038230887205, -0.04589694540462394, 0.18194913988848616, -0.19035992880648842, -0.050064472206627651, -0.016354960260506177, 0.073013903204916478, 0.15053197342937383, -0.47378158951033317, -0.33333577915227425, -0.30434085338299055, 0.26372284406307878, -0.30434085338299449, -0.33333577915227836, -0.47378158951033028, 0.15053197342937505, 0.073013903204915576, -0.016354960260505706, -0.050064472206628768, -0.19035992880648842, 0.18194913988848541, -0.045896945404624932, -0.2601503823088735, 0.27429578524536952, 0.87791572866957457, 1.1747173276627942, 0.3782226136313796, 1.5638480130127614, -1.0502161590016221, -0.28144140655806793, 0.66007876209063499, 0.25575295594566605, -0.11471557758718753, 0.22751157962613866, -0.29100003355994186, 0.29242994865853178, 0.14950061311078749, -0.02214037256893809, 0.034503572794411914, -0.17412889405901469, 0.060297128338254534, -0.49717312826403576, -0.10585857030501357, 0.082780177430083327, -0.11056584899062352, -0.72499416196392785, -0.15612863751308359, -0.36586758725441215, -0.19718551141955715, -0.043434328775718851, -0.060442748560529294, 0.1383233017601592, -0.071714399164362744, 0.31725814504248484, 0.16801904131477274, 0.58675004339129755, 1.5155025161072819, 0.99232752650122635, -1.0129349058609656, -1.6725083187014358, -0.66077224091757791, 2.2217962254133496, 0.98390492917013095, -0.16319024909703178, 0.67271651276019184, 0.16380771710007475, 0.21989373735679621, -0.12296413131763459, -0.18224776807046256, -0.011168077595514938, 0.10364961453623285, 0.1359801303077682, -0.26339593722715721, 0.039396952561874886, -0.33866696253626483, -0.0043101841409601402, 0.17740469505625342, -0.10830858623812685, -0.33186051211466239, 0.12060535717228799, 0.084703474730635803, -0.086262426064740078, -0.1297477439897661, -0.28426475792188655, 0.21965961682575447, 0.24955999100642301, 0.46804088594167448, -0.46946217188769823, -0.31724338121882617, 1.7716903674840139, 0.56577881124465312, 0.71512595047089234, 0.4910867492003736, 0.92310119575914651, -1.0939934957719639, 0.18102793706565934, 0.35484595526186652, 0.48676804973393767, -0.097923922056211768, -7.8200063684236368e-05, -0.016095705887683227, -0.084263209727683391, 0.0080331646697531477, -0.044853168166469837, 0.0062170702455977547, -0.15890945005602863, 0.22815908460498888, 0.17110516400703918, -0.29052216822588434, -0.18224178792918044, -0.018421573557969844, 0.032535239746583795, -0.08121081614537759, -0.029175915115094032, 0.092929862040843081, 0.16824405476099044, -0.24679227625704581, 0.00030176170486908785, 0.023943010115746295, -0.43281940369171445, -0.57166836623813821, 1.2482467538506352, 0.74385331371246666, 0.54787745216002559, 0.92898941300038174, 0.54473301805335128, -0.4877077226718825, -0.40370312470951597, 0.39096527623299848, 0.12644205243911047, 0.0424168022733412, 0.049219693586430309, -0.077748186566067037, -0.043614575991677208, -0.0041635061718157101, 0.07897222152752259, 0.053944973270972973, 0.11232623315704468, -0.070445625631503542, -0.072057201177642652, 0.12706805404252855, -0.13757198545862262, -0.31639223989443899, -0.029240486244660611, 0.10973045554309782, 0.04102655016489614, 0.01891084247324943, -0.056922369420476487, 0.030805208457151782, -0.1512000567754726, -0.058122663069861934, -0.30506910575481916, -0.79033868813295383, 0.026308878650124864, 1.7521122327973906, 0.64566220514793682, 0.40042515638418263, -0.33461208848408402, -0.55369429571770823, -0.030140868003777126, 0.27230784814155334, 0.008194429787378334, -0.030645866021173498, 0.023928227792328404, 0.090706510487419734, -0.021569631345745226, -0.0064127815367693367, -0.026343653609827326, 0.0079365608693974798, -0.18791450411345401, 0.14319521757460194, 0.17003550871316017, -0.24661106106331201, -0.21167593067635404, -0.098206750946426211, -0.048592759447365123, 0.0028129255950110439, 0.049868939755416952, 0.039023237394102607, -0.0036267311717218496, -0.12930461632538415, -0.067411320951837855, 0.010801205387038189, 0.074931291451028059, 0.0657071501308885, -0.22930577035731903, -0.34894672904561169, 0.37107135970432037, 0.49136473213042475, 0.10645611255411164, -0.27741376367012294, -0.015474080963115254, 0.13417678111594294, -0.00046677178847574514, -0.064152245495751381, 0.038292630722847554, 0.017696001575747813, 0.0052157631901947011, -0.023883294001795573, 0.00060518848897931612, -0.088395093514235953, -0.11757758027246699, -0.019555697374511325, 0.025650630137194243, -0.043746931993730094, -0.08846438922222799, -0.074442233736365312, -0.0099104052825428144, 0.064871673248634965, 0.03524540038796406, -0.0065163090427015676, -0.065286881502250399, 0.023130909787941502, -0.028452880392855154, -0.098638256951482817, -0.23382813425811513, -0.077933249962103476, 0.069575788839216612, 0.86635491100693507, 0.33668792873864722, 0.34253529215971401, -0.019122146869457048, -0.016521364547457899, 0.098161425946316522, -0.011130337821465129, -0.092543539386829035, -0.0046973120649884213, -0.0086885172531639618, 0.041915865623990751, 0.004043623749362439, -0.037907101781325205, -0.03902357631677511, -0.037690963997300889, -0.11419210623041842, -0.076732726183972602, 0.12573571356763677, 0.012633232837618465, -0.098942005293094951, -0.061888601165125671, -0.0090012900880717846, -0.014247675993027883, 0.027023228844142398, -0.0050282774165556453, -0.031667371615742887, -0.033818612421867206, -0.01148054478950835, 0.002410610826462259, 0.084402385062259444, 0.069824545029654947, 0.043930202648898894, 0.078872059827297045, 0.055053359776043469, 0.0133618922103162, 0.068453834537836655, 0.081701490128889276, -0.023034972903402569, -0.042406682273060693, 0.035148729718712253, -0.037569795749083354, -0.0041828274568459145, 0.012961699649937737, -0.015475583648045266, -0.027857672235467607, 0.011169867646763214, -0.052725469767566695, -0.0070148730067698924, 0.053188940442296044, -0.095289423698368528, 0.016377276604450954, -0.015232023889946105, -0.077682201861009353, -0.048207693014304241, 0.014396940553395536, 0.021075876818278678, -0.0024069559974744716, -0.016758259649352489, 0.031865879706987753, 0.032824623168326933, -0.074182732572421473, -0.080036865363297197, 0.055652716802045685, 0.11130862970905192, 0.072952972838101024, 0.035098396968263772, 0.070242479721294437, 0.040747896169172335, -0.022459274904977577, 0.014257984954846613, 0.019887732012022184, -0.040811004345713692, 0.0088191619820225595, 0.012579825412037176, 0.0010521231241174983, 0.006430724322423028, -0.0107697788586532, -0.065313535534231901, -0.062769573271966861, 0.11452944472315789, 0.040092306883550234, 0.12236977033818973, 0.13624403896529741, 0.027359429809611827, -0.0259369720098807, -0.021419082531908291, -0.02797214703330133, 0.0080320798501609496, 0.0013100558771969473, -0.0052561866064455981, -0.0097375289490629017, 0.028455863356249757, 0.056425701741664613, -0.0014166564531825356, -0.032528933027316242, -0.019619112630340951, 0.065700689463789611, -0.027574493612476551, -0.032810042710946841, -0.021337213333243964, 0.019592990080295629, -0.019759750092557201, -0.030135000999364853, 0.031698488621630008, 0.023522054710864718, -0.021766544372719836, -0.0029827434432790761, 0.0078373508878122541, -0.0028057606437618767, -0.033232550782043478, -0.070830818977105636, 0.059080455669844649, 0.36951320092865036, 0.091411128665944044, 0.16404233417264649, 0.062598270207454218, 0.044986403519809939, -0.081510896741027974, -0.042341618007147169, -0.019737461729971092, -0.0048974001169366831, 0.01654258945512711, 0.0088012977267579451, -0.013696041496545335, -0.0020268100930256635, 0.015845305908809133, 0.016458612619479462, 0.00059474001274681517, -0.078529066256991353, -0.013402803779002156, -0.0036013299995064228, 0.037573591582025043, -0.0076636494655425947, -0.0021144243161753088, 0.032140257903604356, 0.0203960516207237, -0.013294834505552555, 0.0021732333351695376, 0.015223562704661827, -0.01560949450401263, 0.015060609589555461, 0.099241248305729085, -0.19173261262163863, 0.2450151004066432, 0.26383919410790774, 0.33963060937430933, 0.34586223870135113, 0.1799263961717959, 0.13137374163691276, -0.036493858716968031, -0.041981936023927684, -0.060258932305754208, -0.0099079010405710068, -0.010024579181759819, 0.016637976300589805, 0.031629106230310143, -0.011441752446030828, -0.010113005489671789, -0.027490450999295705, -0.018258671855796018, 0.061296263921274532, 0.10180457538537498, 0.097647442588889397, 0.063246459754600901, 0.0018146068702083835, -0.012539173975430248, -0.008345642545901014, 0.020763503842579332, 0.035996162307667869, -0.015675575409266479, -0.029662747125522582, 0.021312770128680401, 0.08274253615935892, -0.10682054954404013, -0.033729052458342255, -0.12662108035586636, 0.18053751384272299, 0.70940599530087467, -0.21337246968950196, 0.09763637724258438, 0.15345959634626791, -0.11690110107335749, 0.030098075283007168, 0.034186076429122053, -0.021402902917041923, 0.0046349096026103891, 0.011776544425663813, -0.0089673934626629329, 0.025701507905379287, -0.029333520957471802, 0.0051215906448292756, -9.6207917787476249e-05, -0.027988212781709806, 0.093695296747695708, 0.10174972110658871, 0.1657472048824174, 0.097917377942654052, 0.0075790364114050627, 0.031051039914505564, 0.015692601846482499, -0.015197940538429407, 0.026154427883432859, 0.038178927860434288, 0.07391023019778703, 0.0062621769249755375, 0.14786394857966245, -0.24133125024592791, 0.31944609486771169, 0.50715637065140251, 0.3628700351691248, 1.3060302403517683, -0.51467834215318464, -0.23826829822593068, -0.0093468845104923252, 0.16015106243072727, 0.02805086056222977, -0.0035899004350242064, -0.0055435803643170143, -0.026732920924661639, -0.010772744125100176, -0.024390993371714485, 0.012627431507206405, -0.0087203787935273471, 0.017390054254405412, 0.12375300108425245, 0.24623032442851775, 0.32220608581938742, 0.14931322115435106, -0.030460558403777184, 0.017160725214558258, -0.0094839753900354314, -0.040937983123008212, 0.021461267056132466, 0.052605242734811673, 0.082583919156513017, 0.060994911510484674, 0.19212485777257118, 0.030490864773295545, 0.17592824054988929, 0.2988664581273196, -0.3440942993173739, 1.3210609586317499, 0.059297195869563314, 0.66450815180221101, -0.18837022473974091, 0.34310308052214539, 0.41335445680081984, 0.18880277280085617, -0.0025387166530481263, -0.027056960212979365, -0.014992917126512385, -0.065825070508153574, 0.0059924400617866053, 0.016058491686644451, 0.096318218677932735, 0.11648035795043635, 0.083105673180647682, 0.32671351148908129, 0.21720864831216413, 0.29412476851730657, 0.14853499339159934, 0.018970981025801619, -0.0063191769526926853, -0.01818046447321878, -0.033255690840711123, 0.042088106914846247, 0.11598544099090941, 0.13859711550376397, -0.01128947190338442, 0.086653868373652729, 0.5559656926196751, 0.37680556076813249, 0.88488899182435787, -1.1019114795534606, 1.0072326177374842, -0.25696609936231163, 0.22595605005106759, 0.20124367647634336, 0.25020565573121023, 0.15194580903531119, 0.054188690404279045, -0.031588472981034531, -0.072469006265441768, -0.025752917138555535, -0.0471489088024604, 0.079293556902861981, 0.16429646904639772, 0.19502382977708654, 0.21468548823411557, 0.26510515339808566, 0.4121092848683291, 0.24137856300787749, 0.039245063706659693, 0.01328784964664576, 0.063938494959291103, -0.056808918829038463, -0.039159725623022792, 0.028736615885883075, 0.075674855852819814, 0.10715382591497533, 0.29941075202959372, 0.24751816611443234, -0.14971685838339424, 0.92725020353048182, -0.58030730777587713, 1.4965419400087898, -0.58030730777587824, 0.92725020353048315, -0.1497168583833956, 0.24751816611443228, 0.29941075202959394, 0.10715382591497527, 0.075674855852819592, 0.028736615885883075, -0.039159725623022994, -0.05680891882903847, 0.063938494959291325, 0.013287849646645755, 0.039245063706659422, 0.24137856300787733, 0.41210928486832976, 0.32671351148908501, 0.21468548823411696, 0.19502382977708541, 0.16429646904639761, 0.079293556902861592, -0.047148908802460261, -0.025752917138555938, -0.072469006265442351, -0.031588472981034621, 0.054188690404279302, 0.15194580903531177, 0.25020565573121106, 0.20124367647634361, 0.22595605005106811, -0.25696609936231096, 1.007232617737484, -1.1019114795534584, 0.88488899182435599, 0.37680556076813088, 0.55596569261967799, 0.086653868373653353, -0.011289471903383815, 0.13859711550376486, 0.11598544099090989, 0.042088106914846005, -0.033255690840710936, -0.018180464473218153, -0.0063191769526928735, 0.018970981025801085, 0.14853499339159881, 0.2941247685173069, 0.21720864831216452, 0.24623032442851894, 0.083105673180647877, 0.11648035795043606, 0.096318218677932249, 0.016058491686644111, 0.0059924400617863598, -0.065825070508153657, -0.014992917126512623, -0.027056960212979545, -0.0025387166530475712, 0.18880277280085703, 0.41335445680082034, 0.34310308052214539, -0.18837022473973905, 0.66450815180220979, 0.059297195869561843, 1.3210609586317497, -0.34409429931737384, 0.2988664581273206, 0.17592824054988909, 0.030490864773296485, 0.19212485777257224, 0.06099491151048541, 0.082583919156513072, 0.052605242734811722, 0.021461267056132546, -0.040937983123008163, -0.0094839753900352007, 0.017160725214558203, -0.030460558403777944, 0.14931322115435064, 0.32220608581938709, 0.093695296747697082, 0.1237530010842532, 0.017390054254405134, -0.0087203787935278762, 0.012627431507206037, -0.024390993371714388, -0.010772744125100247, -0.026732920924662094, -0.0055435803643169856, -0.0035899004350241582, 0.028050860562230339, 0.16015106243072863, -0.0093468845104915464, -0.23826829822592965, -0.51467834215318398, 1.3060302403517683, 0.3628700351691248, 0.5071563706514024, 0.31944609486771208, -0.24133125024592691, 0.14786394857966259, 0.0062621769249767058, 0.073910230197787502, 0.038178927860434683, 0.026154427883432977, -0.015197940538429256, 0.015692601846482655, 0.031051039914505491, 0.0075790364114048233, 0.097917377942654316, 0.16574720488241704, 0.10174972110658852, 0.10180457538537414, -0.027988212781709362, -9.6207917787273747e-05, 0.0051215906448293215, -0.029333520957471861, 0.025701507905379183, -0.0089673934626627958, 0.01177654442566399, 0.0046349096026104134, -0.021402902917041607, 0.03418607642912222, 0.030098075283007585, -0.1169011010733573, 0.15345959634626896, 0.097636377242582312, -0.21337246968950468, 0.70940599530087356, 0.18053751384272154, -0.12662108035586525, -0.033729052458342325, -0.1068205495440398, 0.082742536159359198, 0.021312770128680637, -0.02966274712552271, -0.015675575409266458, 0.03599616230766798, 0.020763503842579301, -0.0083456425459010053, -0.012539173975430275, 0.001814606870208027, 0.063246459754600651, 0.097647442588889521, -0.013402803779000846, 0.061296263921273318, -0.018258671855796015, -0.027490450999295389, -0.010113005489671634, -0.011441752446030721, 0.031629106230310081, 0.016637976300589583, -0.010024579181759814, -0.0099079010405707553, -0.060258932305754062, -0.041981936023927795, -0.036493858716967892, 0.13137374163691345, 0.17992639617179582, 0.34586223870135102, 0.3396306093743105, 0.26383919410790552, 0.24501510040664315, -0.19173261262163757, 0.099241248305728891, 0.015060609589555881, -0.015609494504012908, 0.015223562704661735, 0.0021732333351695459, -0.013294834505552418, 0.02039605162072387, 0.032140257903604141, -0.0021144243161752658, -0.0076636494655425496, 0.037573591582025015, -0.0036013299995066783, -0.027574493612477238, -0.078529066256990701, 0.00059474001274650921, 0.016458612619479316, 0.015845305908809258, -0.0020268100930258088, -0.013696041496545191, 0.0088012977267581446, 0.016542589455127047, -0.0048974001169365296, -0.019737461729970797, -0.042341618007146614, -0.081510896741027863, 0.044986403519810654, 0.062598270207453191, 0.16404233417264671, 0.091411128665944058, 0.36951320092864953, 0.059080455669845232, -0.070830818977105567, -0.033232550782043346, -0.0028057606437617323, 0.0078373508878121518, -0.0029827434432791976, -0.021766544372719729, 0.023522054710864829, 0.031698488621629953, -0.030135000999364715, -0.019759750092557201, 0.019592990080295483, -0.021337213333244086, -0.032810042710946043, 0.035098396968265562, 0.065700689463788264, -0.019619112630341284, -0.032528933027315937, -0.001416656453182401, 0.056425701741664544, 0.028455863356249663, -0.0097375289490629503, -0.0052561866064455114, 0.0013100558771970501, 0.0080320798501610554, -0.027972147033301621, -0.021419082531907708, -0.025936972009880058, 0.027359429809612409, 0.13624403896529816, 0.12236977033819048, 0.040092306883550463, 0.11452944472315811, -0.062769573271967, -0.065313535534231998, -0.010769778858653123, 0.0064307243224230766, 0.0010521231241173155, 0.012579825412037126, 0.0088191619820226965, -0.040811004345713484, 0.019887732012021993, 0.014257984954846677, -0.022459274904977573, 0.040747896169171828, 0.070242479721293896, 0.055053359776043469, 0.072952972838101038, 0.11130862970905199, 0.055652716802045553, -0.080036865363297377, -0.074182732572421722, 0.032824623168326919, 0.031865879706987767, -0.016758259649352489, -0.0024069559974744621, 0.021075876818278654, 0.014396940553395566, -0.048207693014304456, -0.077682201861009201, -0.015232023889946197, 0.016377276604451121, -0.095289423698368528, 0.053188940442295753, -0.007014873006770006, -0.052725469767566646, 0.011169867646763318, -0.027857672235467666, -0.015475583648045285, 0.012961699649937817, -0.0041828274568459145, -0.037569795749083312, 0.035148729718712211, -0.042406682273060839, -0.023034972903402475, 0.081701490128889429, 0.068453834537836641, 0.013361892210316275, 0.33668792873864783, 0.078872059827295921, 0.043930202648898596, 0.069824545029654933, 0.084402385062259569, 0.0024106108264623457, -0.011480544789508253, -0.033818612421867275, -0.031667371615742741, -0.00502827741655568, 0.027023228844142416, -0.014247675993027993, -0.0090012900880712381, -0.061888601165125297, -0.098942005293094756, 0.01263323283761883, 0.12573571356763666, -0.076732726183971922, -0.11419210623041808, -0.037690963997301666, -0.039023576316775249, -0.037907101781325052, 0.0040436237493623132, 0.041915865623990772, -0.0086885172531639947, -0.0046973120649884377, -0.092543539386828647, -0.011130337821465186, 0.098161425946316272, -0.016521364547457937, -0.019122146869457519, 0.34253529215971379, 0.37107135970432042, 0.86635491100693385, 0.069575788839216376, -0.077933249962103462, -0.23382813425811527, -0.09863825695148333, -0.028452880392854651, 0.02313090978794155, -0.065286881502250455, -0.0065163090427018816, 0.035245400387964018, 0.064871673248635159, -0.009910405282542379, -0.074442233736364327, -0.088464389222228296, -0.043746931993730226, 0.025650630137194336, -0.019555697374510583, -0.11757758027246727, -0.088395093514236453, 0.00060518848897882292, -0.023883294001795972, 0.0052157631901946491, 0.017696001575747886, 0.038292630722847568, -0.064152245495751242, -0.00046677178847581285, 0.13417678111594261, -0.015474080963115183, -0.27741376367012288, 0.10645611255411111, 0.49136473213042497, 0.64566220514793704, -0.34894672904561197, -0.22930577035731828, 0.065707150130888653, 0.074931291451028587, 0.010801205387038527, -0.067411320951837883, -0.12930461632538409, -0.0036267311717218076, 0.039023237394102503, 0.049868939755416578, 0.0028129255950110478, -0.048592759447364742, -0.098206750946425017, -0.21167593067635238, -0.24661106106331246, 0.17003550871316073, 0.14319521757460188, -0.18791450411345456, 0.0079365608693964147, -0.026343653609827478, -0.0064127815367698198, -0.021569631345745438, 0.090706510487419845, 0.023928227792328456, -0.030645866021173446, 0.0081944297873781744, 0.27230784814155318, -0.030140868003777244, -0.55369429571770845, -0.33461208848408441, 0.40042515638418175, 0.54787745216002603, 1.7521122327973908, 0.02630887865012415, -0.7903386881329546, -0.30506910575481899, -0.058122663069862322, -0.1512000567754718, 0.030805208457151921, -0.056922369420476453, 0.018910842473248434, 0.041026550164896362, 0.10973045554309671, -0.029240486244660805, -0.3163922398944391, -0.13757198545862218, 0.12706805404252669, -0.072057201177643526, -0.070445625631504319, 0.11232623315704422, 0.053944973270972273, 0.078972221527521536, -0.00416350617181658, -0.043614575991677791, -0.077748186566067592, 0.049219693586430378, 0.042416802273341318, 0.12644205243911066, 0.39096527623299887, -0.40370312470951558, -0.48770772267188234, 0.54473301805335006, 0.92898941300038107, 0.71512595047089234, 0.74385331371246577, 1.2482467538506357, -0.57166836623813888, -0.43281940369171401, 0.023943010115746077, 0.00030176170486927514, -0.24679227625704431, 0.16824405476099039, 0.092929862040844205, -0.029175915115095267, -0.081210816145377299, 0.032535239746583337, -0.018421573557966798, -0.18224178792918325, -0.29052216822588622, 0.17110516400703951, 0.22815908460498383, -0.15890945005602886, 0.0062170702455973175, -0.044853168166470177, 0.0080331646697508995, -0.0842632097276826, -0.016095705887684088, -7.820006368420517e-05, -0.097923922056211893, 0.48676804973393806, 0.35484595526186524, 0.18102793706565945, -1.0939934957719641, 0.9231011957591454, 0.49108674920037432, -1.6725083187014362, 0.56577881124465212, 1.7716903674840145, -0.31724338121882639, -0.46946217188769945, 0.46804088594167398, 0.2495599910064237, 0.21965961682575341, -0.28426475792188616, -0.12974774398976752, -0.086262426064739897, 0.084703474730633041, 0.12060535717228706, -0.33186051211466344, -0.10830858623812538, 0.17740469505624151, -0.0043101841409599814, -0.33866696253627121, 0.0393969525618715, -0.26339593722715154, 0.13598013030776659, 0.10364961453623139, -0.011168077595515221, -0.18224776807046214, -0.12296413131763473, 0.21989373735679868, 0.16380771710007386, 0.67271651276019118, -0.16319024909703136, 0.98390492917013062, 2.2217962254133496, -0.66077224091757802, 1.5638480130127614, -1.0129349058609651, 0.99232752650122769, 1.5155025161072819, 0.58675004339129688, 0.16801904131477496, 0.31725814504248523, -0.071714399164359219, 0.13832330176015895, -0.060442748560523389, -0.043434328775720558, -0.19718551141955432, -0.36586758725441343, -0.15612863751307984, -0.72499416196393318, -0.11056584899062098, 0.082780177430082938, -0.10585857030502534, -0.49717312826403764, 0.060297128338251849, -0.1741288940590143, 0.034503572794408806, -0.022140372568936324, 0.14950061311078439, 0.29242994865853189, -0.29100003355994419, 0.22751157962613949, -0.11471557758718894, 0.25575295594566499, 0.66007876209063321, -0.28144140655806837, -1.050216159001623], \"bottom\": {\"real\": [5837.242024063461, 16421.190569053251, 8527.2275182117319, 3938.41845467232, 969.21000043764093, 269.87346390668256, 193.53992011404216, 135.14631901451781, 58.523829955616236, 29.311524302602624, 20.863281166035843, 14.808244655557742, 11.401757474781434, 9.6386493936653288, 8.0538591094176777, 7.4714398062124641, 7.2711776175262477, 7.4714398062124241, 8.0538591094176653, 9.638649393665327, 11.401757474781416, 14.808244655557761, 20.863281166035858, 29.311524302602734, 58.523829955616236, 135.14631901451779, 193.53992011404216, 269.87346390668273, 969.21000043764059, 3938.4184546723186, 8527.2275182117301, 16421.190569053259, 14982.474506443205, 4755.1985786680198, 3083.8642011691682, 1502.8058566448747, 596.26851293203197, 262.35520536881347, 201.52671733896852, 108.13603201941604, 57.999252895466505, 28.992297197792773, 19.233600066307524, 13.871180161098291, 10.761421361485239, 8.8506828512506655, 7.8125584926262617, 7.1234501229356377, 6.6618841738486525, 7.1762884709606958, 8.1416889804019927, 8.8663632607744063, 11.328672883224474, 14.773155762512141, 20.058056528572401, 28.688344099071909, 57.995376649220766, 126.94075502116374, 211.30702516808583, 262.54448595536269, 752.96024761972672, 2141.5368023327851, 3891.3661973657881, 5583.5460990085166, 9500.6528086677681, 4225.3848573287933, 1708.1934289355966, 562.9450489663958, 526.41420210821127, 290.26438540271903, 151.34732218304231, 89.304597077577796, 50.161041673414204, 27.913649363990057, 19.253723232543383, 14.310501425792925, 10.622538104620221, 8.6520747616015274, 7.6796432895344049, 6.9311889072641995, 6.5442165971044535, 6.8352472963781299, 7.2531587818267287, 8.8125700197174819, 10.256278085266516, 13.962876672312342, 18.680978544191657, 27.641611280844351, 51.70590284164593, 92.383035108628647, 175.23999552329536, 238.6238705323166, 446.2130896894364, 589.84950644143407, 1459.800700420838, 2983.6421667816849, 6639.6980670311659, 3615.9230624353354, 1045.9683029029898, 541.95698246733389, 551.2292078912385, 269.01748102372522, 121.81702466062521, 78.619304368994548, 46.266475261147157, 26.895860643920866, 18.966790938143397, 14.141216689343503, 10.624588727031869, 8.5120674584469107, 7.5084078178458054, 7.127942028564302, 6.5505226441602824, 6.5976614570745582, 7.5671769464103935, 8.4293753366132105, 10.446992271959362, 13.755112829750516, 18.515159362788847, 25.868606557166544, 43.593025933023839, 76.847860046206122, 125.03651194390009, 241.77755195523335, 523.08499299660048, 633.36555854289827, 855.69476790230692, 2473.0066947172836, 2803.9496552692158, 1850.6397468329815, 645.77314636959022, 447.00563976857688, 381.6372474267435, 196.7755433249871, 93.586816816137713, 72.612365740746853, 43.711482900929944, 27.782222145016455, 18.647268962291367, 13.844325818813939, 10.350953817244738, 8.7140342291788997, 7.3516641952705921, 6.886474159529909, 6.1226840838853605, 6.7186507131414492, 7.0148796268173141, 7.9020046012660439, 9.6536048586555445, 13.744699851401226, 17.872279960942961, 25.025889030797831, 38.775468597625853, 68.228616115874232, 97.806667851841851, 178.52012140604563, 362.80035213144055, 506.96305099601244, 508.39785887877764, 1271.7627571663681, 1970.0713813014595, 1211.9708052435174, 448.82610946730466, 388.91483700385658, 294.26646682781944, 147.68595350614527, 76.563818921604266, 57.53338100926053, 37.094893522892434, 25.168957624787666, 17.405368368923924, 12.931100650610183, 10.211256703797424, 8.3783082007702649, 6.8845647672161352, 6.2954630311895761, 6.1711525716900475, 6.2852637654745882, 7.1318002457288037, 7.8126464614985656, 9.3562580058102185, 12.456351018938477, 17.12365920646733, 22.851195586808732, 34.22708028584924, 57.273965595477058, 82.126801795962663, 114.0182287640494, 248.69630423497404, 396.25330408596494, 382.77662480077174, 646.86127060880278, 1066.1959535576209, 770.74521634546068, 344.77171326148743, 328.21152488387929, 223.6732358532505, 124.39997807543456, 66.042124980023658, 49.833499278727395, 36.080812354502541, 24.010000461569632, 16.241873057458708, 11.94801819096188, 9.663620823552634, 8.1734814269274114, 6.8263151892657215, 6.1094005534487641, 5.5560364128866686, 6.0895161225652297, 6.7371553850929349, 7.5614980494024309, 9.3035460399083956, 11.904089289656403, 15.753116847312391, 22.116186781807659, 33.401673308199264, 45.775772578430164, 60.542807604917392, 91.412240599681226, 164.58197575163385, 289.97996145010069, 367.09809735899603, 433.51729458889321, 538.99714678707312, 436.9735160339028, 214.45700003213321, 226.27353228768246, 190.72528880002966, 104.24105887361294, 63.096291028318397, 44.895692115573439, 34.378771692376986, 22.743616534455565, 14.943130070579064, 11.306154107321404, 9.490726177732828, 8.057539867813432, 6.6249917656310648, 5.80530835366394, 5.6727594087192097, 5.6803994552580717, 6.4512234217242401, 7.3091820969038412, 8.9053168517088785, 11.147020821533502, 13.978280110937801, 19.308076160210224, 27.380246565144393, 39.45337202937899, 53.823906577074318, 70.344986096434994, 125.18491111128095, 220.27402210338624, 239.02095964975129, 253.52805611791149, 337.90351459641266, 301.96557555412664, 163.14862666039761, 176.1964602722083, 155.2640157056349, 91.402170635856464, 57.9223709952281, 44.132906015519367, 31.477476121951593, 19.994026988386896, 14.669539930994308, 10.52228821405147, 8.9499245076841039, 7.4160858759377133, 6.0652235290917815, 5.5336836347972449, 5.3453345499720717, 5.5251998880295652, 6.049359333226362, 7.4989544637904162, 8.6441457110666775, 10.17217183387787, 12.922358897606493, 16.497840703497662, 24.473525343022239, 36.893225695749557, 46.488420049270196, 60.008949681859932, 101.55324863109907, 172.57213254679178, 186.99209153386954, 177.69050334329205, 224.71115213821386, 219.35401697656656, 131.98987419085088, 139.58612051732652, 133.97255559613592, 83.717667146076977, 52.48988401855501, 39.948149447326976, 29.992243301791387, 19.792293237610107, 13.550533437330548, 10.191515700191694, 8.7251285565258279, 7.0130966099588283, 6.0412905020539274, 5.1695609453883042, 5.2335464217738297, 5.2748937601741233, 5.9151189141762242, 6.6404924993384702, 8.2525633194354864, 9.86505065394757, 11.857247340871206, 15.821441128307118, 21.809722446513074, 33.204842604441232, 45.292100524348356, 53.588237099743992, 86.046570865333351, 138.34470513151498, 144.28338780744133, 137.47961624149846, 184.36194031651988, 195.75342807998493, 111.69248606852764, 108.22432115257934, 110.31477193613289, 70.737952758714727, 45.316084199866118, 35.221165127538775, 25.132656234698317, 17.808708328889288, 13.205138111505544, 9.8319756958291311, 8.3851869715659166, 6.6979147774695411, 5.5577949826186863, 5.0640136062157843, 4.915924071395172, 5.1747375238921238, 5.621849200313962, 6.3926522738336189, 7.8838556827841355, 9.5880495388903295, 11.2702077240605, 14.675031755421674, 19.961485602094882, 28.340133288775018, 38.071807302485439, 46.211805942072893, 70.896288173632385, 115.46517347822648, 119.73189294718243, 110.21299532100423, 137.49078682179271, 145.21239507063157, 90.736475500202033, 84.820134662984671, 87.028887735269166, 58.592780926558561, 39.140475702708279, 30.030590426700837, 23.561748558876776, 17.07171690133644, 12.059539847971436, 9.1303469917064106, 7.8824915696444915, 6.5574577163884546, 5.4508327472027114, 4.6319487889521351, 4.8556936697031698, 5.0952139895658046, 5.3626061482546099, 6.0231504777267588, 7.3929124540904754, 8.8697139145390977, 10.839689611405708, 13.484775054138881, 18.125520870461621, 25.51326521840107, 33.814821758723511, 43.000660712963757, 59.289067569698993, 89.523100480006264, 96.002834501641331, 88.248403951505949, 114.22377327036351, 136.39754784126862, 85.133937137494058, 70.757613581150778, 72.941136445046624, 50.417131404641061, 35.29732697897046, 27.270836476117434, 20.337170678571646, 15.328073102208975, 11.227626008224609, 8.8894703399043831, 7.3066732490559749, 6.1117570010797007, 5.2240396800825373, 4.6927944754047974, 4.4462691956761722, 4.8997943453914665, 5.030120352863074, 5.8504059853355139, 6.9021030785339024, 8.6936481048417669, 10.014300550884089, 12.783989981758968, 16.915182814597465, 23.037925870268026, 29.781501040175886, 36.137786628939317, 46.659613314406016, 72.542096884400053, 80.098309124706176, 76.772569487169434, 87.96931966600367, 100.35528192635977, 66.390743706670477, 56.297220892995071, 57.449776912893739, 42.311817158751616, 30.3950154293208, 24.633397231162515, 18.800000277532757, 13.906344724637259, 10.685561612392762, 8.7726633553262534, 7.3765778222647702, 6.0238006847876884, 5.2082074327498917, 4.5886719664559399, 4.6166410353959701, 4.6115148269570563, 4.9920772309179853, 5.6445124723515159, 6.7980683034043956, 7.4975962005340229, 9.6066586869080837, 12.06652313244911, 16.251663826300451, 21.003823940677318, 27.622933573071261, 33.836788273738165, 41.877854423447168, 58.532835369703733, 68.239320296767971, 62.326149739008642, 71.583830955139561, 81.611391861674278, 61.290606958364052, 49.963935495056425, 49.744027747354536, 38.555965139546075, 28.313241453630848, 22.404376161451804, 17.69007471646092, 13.348861556136391, 10.46674681432143, 8.1507364253451371, 6.7804933363165576, 5.7303247473649055, 4.9737961537641029, 4.6591603640435002, 4.3691273542401863, 4.5876440856805019, 4.8775279419312838, 5.5643157824289267, 6.5106424514611394, 7.6517258774697732, 9.3978270674435489, 12.208065227131403, 15.316902707006163, 20.982661610009878, 26.317869298031479, 32.313264556083666, 38.062860113666069, 50.105167484748129, 58.219661124046276, 59.861157680092496, 61.019020366450448, 69.642805168222978, 57.634563900118565, 46.967523109902231, 43.85887184820529, 34.957640557066753, 26.505039983640941, 21.71545909517323, 16.236775633007202, 12.875777825381771, 9.9834739610997616, 7.8930497070448, 6.6829715569803687, 5.6672193704500122, 5.0794246915518446, 4.681264046528276, 4.6186632297539427, 4.6211092904368423, 5.0897865773957403, 5.5691810710797096, 6.5035187317991277, 7.2014326998593701, 9.1703620437944053, 12.475838151915292, 15.6623920524898, 19.528853843427893, 25.077028045409381, 30.833489267211636, 39.113296407386123, 46.770991427918581, 55.937485646720255, 57.570245344451905, 57.637817589030213, 59.860391566610879, 52.776195682327739, 43.839296967027423, 39.833012832197511, 33.598213438023812, 26.072700016436322, 20.276975501521189, 16.195672497297036, 12.239826665071417, 9.6875213487165066, 7.7379543893933631, 6.3786782254807157, 5.5950259327840586, 5.1232903828272987, 4.5786592309737237, 4.5178908466513406, 4.578659230973722, 5.1232903828272978, 5.5950259327840595, 6.3786782254807148, 7.7379543893933684, 9.6875213487165084, 12.239826665071421, 16.195672497297036, 20.276975501521182, 26.072700016436304, 33.598213438023805, 39.833012832197511, 43.839296967027416, 52.776195682327739, 59.860391566610836, 61.019020366450441, 57.570245344451919, 55.937485646720255, 46.770991427918517, 39.113296407386116, 30.833489267211636, 25.077028045409371, 19.528853843427893, 15.662392052489803, 12.475838151915296, 9.1703620437944, 7.2014326998593674, 6.5035187317991294, 5.5691810710797114, 5.0897865773957385, 4.6211092904368405, 4.6186632297539418, 4.6812640465282733, 5.0794246915518446, 5.6672193704500087, 6.6829715569803696, 7.8930497070447982, 9.9834739610997651, 12.875777825381764, 16.236775633007209, 21.715459095173252, 26.505039983640959, 34.957640557066775, 43.858871848205247, 46.967523109902238, 57.634563900118593, 69.642805168222949, 71.583830955139618, 59.861157680092482, 58.21966112404624, 50.105167484748137, 38.062860113666083, 32.313264556083666, 26.317869298031482, 20.982661610009867, 15.316902707006161, 12.208065227131399, 9.3978270674435436, 7.6517258774697732, 6.5106424514611394, 5.5643157824289284, 4.8775279419312856, 4.587644085680501, 4.3691273542401872, 4.6591603640434966, 4.973796153764102, 5.7303247473649037, 6.7804933363165594, 8.1507364253451371, 10.466746814321423, 13.348861556136386, 17.69007471646092, 22.404376161451779, 28.313241453630852, 38.555965139546039, 49.744027747354508, 49.963935495056418, 61.290606958364073, 81.611391861674235, 87.969319666003628, 62.326149739008663, 68.239320296767957, 58.532835369703712, 41.877854423447168, 33.836788273738158, 27.622933573071283, 21.003823940677311, 16.251663826300444, 12.066523132449106, 9.6066586869080837, 7.4975962005340202, 6.7980683034043929, 5.6445124723515194, 4.9920772309179844, 4.6115148269570598, 4.6166410353959719, 4.5886719664559372, 5.2082074327498908, 6.0238006847876866, 7.3765778222647711, 8.7726633553262587, 10.685561612392764, 13.906344724637258, 18.80000027753276, 24.633397231162533, 30.395015429320793, 42.311817158751609, 57.449776912893732, 56.297220892995028, 66.390743706670506, 100.35528192635975, 114.22377327036349, 76.772569487169449, 80.098309124706219, 72.542096884400053, 46.659613314406002, 36.137786628939317, 29.781501040175893, 23.037925870268033, 16.915182814597468, 12.783989981758975, 10.014300550884082, 8.6936481048417651, 6.9021030785339006, 5.8504059853355228, 5.0301203528630678, 4.8997943453914612, 4.4462691956761731, 4.6927944754048019, 5.2240396800825328, 6.1117570010797033, 7.3066732490559732, 8.8894703399043813, 11.227626008224609, 15.32807310220897, 20.337170678571649, 27.270836476117438, 35.297326978970467, 50.417131404641083, 72.941136445046638, 70.757613581150821, 85.133937137494073, 136.39754784126856, 137.49078682179265, 88.248403951506006, 96.002834501641317, 89.523100480006221, 59.289067569698972, 43.000660712963743, 33.814821758723504, 25.51326521840107, 18.125520870461624, 13.484775054138884, 10.839689611405714, 8.8697139145391013, 7.3929124540904745, 6.0231504777267606, 5.362606148254609, 5.0952139895658073, 4.8556936697031734, 4.6319487889521325, 5.4508327472027096, 6.5574577163884502, 7.8824915696444933, 9.1303469917064124, 12.059539847971436, 17.071716901336433, 23.561748558876776, 30.030590426700826, 39.140475702708279, 58.592780926558504, 87.028887735269151, 84.820134662984628, 90.73647550020199, 145.21239507063157, 184.36194031652002, 110.2129953210042, 119.73189294718252, 115.4651734782265, 70.896288173632399, 46.211805942072878, 38.071807302485439, 28.340133288775018, 19.961485602094882, 14.675031755421674, 11.270207724060505, 9.5880495388903277, 7.8838556827841364, 6.3926522738336233, 5.6218492003139611, 5.1747375238921247, 4.9159240713951746, 5.0640136062157861, 5.5577949826186863, 6.697914777469534, 8.3851869715659184, 9.8319756958291471, 13.205138111505548, 17.808708328889303, 25.13265623469832, 35.221165127538775, 45.316084199866097, 70.737952758714712, 110.3147719361329, 108.22432115257941, 111.69248606852767, 195.75342807998487, 224.71115213821398, 137.47961624149852, 144.28338780744139, 138.3447051315149, 86.046570865333337, 53.588237099743992, 45.292100524348342, 33.204842604441232, 21.809722446513071, 15.82144112830712, 11.857247340871208, 9.86505065394757, 8.2525633194354864, 6.640492499338464, 5.9151189141762242, 5.2748937601741233, 5.2335464217738297, 5.1695609453883096, 6.0412905020539247, 7.0130966099588328, 8.725128556525835, 10.191515700191694, 13.550533437330545, 19.792293237610103, 29.992243301791408, 39.948149447327012, 52.489884018555003, 83.717667146076963, 133.97255559613592, 139.58612051732649, 131.98987419085091, 219.35401697656653, 337.90351459641266, 177.69050334329216, 186.99209153386957, 172.57213254679186, 101.55324863109904, 60.008949681859939, 46.488420049270182, 36.893225695749557, 24.473525343022239, 16.497840703497666, 12.922358897606497, 10.172171833877869, 8.6441457110666775, 7.4989544637904126, 6.0493593332263602, 5.5251998880295634, 5.3453345499720717, 5.5336836347972458, 6.0652235290917806, 7.4160858759377133, 8.949924507684111, 10.522288214051471, 14.669539930994311, 19.994026988386889, 31.477476121951593, 44.13290601551936, 57.922370995228107, 91.402170635856407, 155.2640157056349, 176.1964602722083, 163.14862666039767, 301.96557555412653, 538.99714678707278, 253.5280561179116, 239.02095964975135, 220.2740221033861, 125.18491111128091, 70.344986096434923, 53.823906577074332, 39.453372029378947, 27.380246565144397, 19.308076160210238, 13.978280110937792, 11.147020821533506, 8.9053168517088821, 7.3091820969038439, 6.4512234217242392, 5.6803994552580681, 5.6727594087192079, 5.8053083536639392, 6.6249917656310666, 8.0575398678134302, 9.4907261777328298, 11.306154107321403, 14.943130070579077, 22.743616534455558, 34.378771692377001, 44.895692115573446, 63.09629102831839, 104.241058873613, 190.72528880002952, 226.27353228768243, 214.45700003213315, 436.97351603390234, 1066.1959535576209, 433.51729458889332, 367.09809735899597, 289.97996145010086, 164.58197575163376, 91.412240599681198, 60.542807604917364, 45.775772578430157, 33.401673308199264, 22.116186781807642, 15.753116847312398, 11.904089289656401, 9.303546039908392, 7.5614980494024362, 6.7371553850929322, 6.0895161225652297, 5.5560364128866677, 6.1094005534487605, 6.8263151892657268, 8.1734814269274096, 9.6636208235526269, 11.948018190961893, 16.241873057458722, 24.010000461569639, 36.080812354502534, 49.833499278727416, 66.042124980023658, 124.39997807543459, 223.67323585325056, 328.21152488387946, 344.77171326148749, 770.74521634546022, 1970.0713813014588, 646.86127060880301, 382.77662480077169, 396.2533040859646, 248.69630423497387, 114.01822876404945, 82.126801795962692, 57.273965595476994, 34.227080285849233, 22.851195586808739, 17.12365920646733, 12.456351018938475, 9.3562580058102167, 7.8126464614985656, 7.1318002457288037, 6.2852637654745882, 6.1711525716900475, 6.2954630311895787, 6.8845647672161387, 8.3783082007702561, 10.211256703797417, 12.931100650610194, 17.405368368923916, 25.168957624787648, 37.094893522892434, 57.533381009260523, 76.563818921604266, 147.68595350614524, 294.26646682781944, 388.91483700385658, 448.82610946730478, 1211.9708052435162, 2803.9496552692158, 1271.7627571663686, 508.39785887877753, 506.96305099601244, 362.80035213144049, 178.52012140604566, 97.806667851841823, 68.228616115874146, 38.775468597625853, 25.025889030797838, 17.872279960942965, 13.74469985140124, 9.6536048586555427, 7.9020046012660456, 7.0148796268173159, 6.7186507131414386, 6.1226840838853631, 6.8864741595299055, 7.3516641952705939, 8.7140342291789032, 10.350953817244736, 13.844325818813926, 18.64726896229136, 27.782222145016434, 43.711482900929937, 72.612365740746867, 93.586816816137656, 196.7755433249871, 381.63724742674339, 447.00563976857711, 645.77314636959011, 1850.6397468329806, 6639.698067031165, 2473.0066947172841, 855.69476790230704, 633.36555854289816, 523.0849929966007, 241.77755195523349, 125.03651194390012, 76.847860046206094, 43.593025933023853, 25.868606557166554, 18.515159362788847, 13.755112829750496, 10.44699227195936, 8.4293753366132176, 7.5671769464103917, 6.5976614570745609, 6.5505226441602797, 7.1279420285643011, 7.5084078178458018, 8.5120674584469089, 10.624588727031863, 14.141216689343507, 18.966790938143404, 26.895860643920869, 46.266475261147157, 78.619304368994577, 121.81702466062518, 269.01748102372505, 551.22920789123827, 541.95698246733446, 1045.9683029029893, 3615.9230624353345, 9500.6528086677681, 2983.6421667816867, 1459.8007004208382, 589.84950644143373, 446.2130896894364, 238.62387053231652, 175.23999552329542, 92.383035108628548, 51.705902841645944, 27.641611280844312, 18.680978544191667, 13.962876672312348, 10.256278085266519, 8.8125700197175014, 7.2531587818267402, 6.8352472963781254, 6.5442165971044517, 6.9311889072641986, 7.6796432895344058, 8.6520747616015186, 10.622538104620222, 14.310501425792921, 19.253723232543386, 27.913649363990046, 50.161041673414196, 89.304597077577839, 151.34732218304231, 290.26438540271909, 526.41420210821127, 562.94504896639603, 1708.1934289355961, 4225.3848573287914, 14982.474506443201, 5583.5460990085194, 3891.3661973657854, 2141.5368023327842, 752.9602476197266, 262.54448595536314, 211.30702516808589, 126.94075502116375, 57.995376649220773, 28.688344099071898, 20.058056528572401, 14.773155762512143, 11.328672883224492, 8.8663632607744169, 8.1416889804020052, 7.1762884709607109, 6.6618841738486552, 7.1234501229356262, 7.8125584926262608, 8.8506828512506655, 10.761421361485221, 13.871180161098282, 19.233600066307527, 28.992297197792769, 57.999252895466505, 108.13603201941609, 201.52671733896852, 262.35520536881353, 596.26851293203185, 1502.8058566448742, 3083.8642011691672, 4755.1985786680179], \"imag\": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, \"imag\": [0.0, -0.13871927675086548, -0.55827571496092165, -0.85383263724083092, -0.46701193383615952, 0.047809537946767316, -0.3426920474802197, 0.15831589374137059, 0.20589774809377467, -0.21944378817656213, -0.12654666933988368, -0.19544466487854822, -0.096446269450190733, -0.2265628704083768, 0.10840537931386109, -0.055457499657790024, 0.0, 0.055457499657784036, -0.10840537931384955, 0.22656287040837902, 0.096446269450189581, 0.19544466487854698, 0.1265466693398799, 0.21944378817656165, -0.20589774809377467, -0.15831589374137045, 0.34269204748022014, -0.047809537946767663, 0.46701193383615958, 0.85383263724082981, 0.55827571496092188, 0.13871927675086551, -1.279550584464304, -0.80695903119669909, -0.5066002982483182, -1.4561178571661, -0.13414323846201096, -0.25055297311154978, -0.64027404819684697, -0.19951473048424853, 0.33137912963317689, -0.047498243759329373, -0.24064979253244873, 0.1395435157196932, 0.17789090203786645, -0.044374683774468404, -0.36806933922228663, 0.19528135326361654, 0.32999646269142918, -0.13015393203002068, 0.1959681784626765, 0.28571835588367483, 0.22705801052414751, -0.14508578389537852, 0.23457709892354506, 0.21163882649779878, -0.20150153854805303, 0.060946718066345364, 0.31004041285864392, -0.26258387187077481, 0.13955938857309563, -0.2449447076348287, 0.068510051090992716, -1.1758121586434307, -1.3682011726001491, -1.6899938281650106, -0.75019268688655194, 0.68911282851752931, 0.44086751164178845, -0.23155959034339019, -0.54510315877084203, 0.26585764990704713, 0.2624959582084973, -0.045146091846171167, 0.011517786678353055, -0.057907844320373422, 0.076854124253010955, 0.0035092112107953564, -0.23588030048916386, -0.048277840380711062, -0.21489820671404902, 0.26817287178185911, -0.027468417557455105, 0.29873174456545087, 0.072899207479288589, 0.023829771073631354, 0.0066491170121291982, 0.0048298736467919092, -0.13057930804766787, -0.26946209593128789, 0.39240115086507854, 0.85317721061416651, -0.11752989424299426, 0.99998707389668307, 0.55787436167296656, -1.0314907737559058, -1.5043263157657751, -1.3830149751777026, -0.20446853801739454, -0.28364033101911829, 0.68303147161529054, 0.03902721990981517, -0.18273076418691683, -0.013466871818696777, 0.028891896132398606, -0.068621242214500722, -0.026792869524675422, 0.18842973810535804, 0.068392282535087487, -0.17097210848547728, -0.23288712244734344, -0.31416612358708279, 0.27284169211913839, -0.072438990225411531, 0.1202436118466384, 0.067443262257117789, -0.0040452326400191837, -0.15231382612170316, 0.020438609938141238, 0.10773227995476008, -0.1646961578394999, -0.034526357222664054, 0.34045699686317549, 0.3582562672018631, 0.50203282214727851, -0.90050578840564854, 1.1141651843864948, -1.0547694551235964, 0.15113295529591572, -0.42011997382980693, -1.1306687523196075, 0.59904899563122349, 0.12782476119556421, -0.26469201284371935, -0.0028564673365734715, 0.25878855026626812, 0.00078645201341040851, -0.17181320075266995, 0.013143422355015144, 0.050238396740841747, 0.072156922858987921, 0.041604673982592558, -0.0112715468909201, -0.016101389694688766, -0.31269363662275068, 0.094974334151300396, -0.067869387966968731, 0.14811752790953986, 0.010724993842567176, -0.071495661604357427, -0.037154193600070516, 0.05779163337935353, 0.094937931062917286, -0.1272883333159909, -0.017408469796284951, 0.62003762386212868, 0.074417004563971767, -0.12904495334293709, -1.4636084587609224, -0.036743730082780299, -0.77470195486186, -0.60686918965332004, 0.62872636200456622, -0.46894237369717673, -0.18368617361305525, 0.26816260026693856, 0.13447215443394772, 0.041008154934057489, -0.017107991149299187, -0.0680369475996533, -0.01240601732954733, 0.059356927461924558, 0.12615835751185028, 0.053672308552617974, 0.037749743592242362, -0.10597138547480481, 0.022172258797336697, -0.058681894939636686, 0.12792055300624736, -0.060154323470105943, 0.032298308999269151, -0.015701976416949814, 0.0007367446231764113, 0.07712597645572114, 0.055644084876628218, -0.065981740018919821, -0.14567847379973994, 0.039540586335773356, 0.24917063867041539, -0.6432675339043068, 0.36754664039982821, -0.069649876974948205, 0.2952063874323651, -0.011417685121456805, -1.0450941798657123, -0.17374602795438093, 0.19930768818407893, -0.1556206112582631, 0.055817128538076119, 0.17900936499027481, 0.0052374024484263433, -0.042596098823283683, -0.020834261928533829, 0.036686593450547957, 0.00076880260958178746, 0.061719692477810909, 0.027700064466885506, 0.10661165850403151, -0.13945785164947772, -0.050544258155460708, -0.11937846922953205, 0.034399558837173369, 0.02521789889898339, -0.0047468618190418272, -0.028256857448446509, 0.029239764799856467, 0.046539635523190424, -0.033316423902485758, -0.15842957449053302, 0.14741145606308881, 0.1752194519195491, -0.075629282019522973, -0.91968716746889456, -0.45504702044764878, -0.12177128356890227, -0.10462001130261206, 0.1804016527269576, -0.047005347129142915, -0.19200701617075638, 0.1133507155810588, 0.14315736053243958, -0.067545520465919412, -0.0022066601859379556, 0.0084001340729883862, 0.0049338006978182497, 0.016196236751475263, 0.066419574069183293, -0.012240235365542763, 0.014433128838537781, 0.023674926554515096, -0.017114978073907605, -0.14379898617791109, 0.084303725772385638, 0.0056779923265117766, 0.048321020114327755, 0.022849248448590556, 0.012395399307186424, 0.023865191872962568, -0.0060375152678495622, -0.021897165586045375, -0.092173327221095822, -0.17587869380621102, 0.091992925322100877, 0.014980171338571357, 0.0086063527817299007, 0.098130362913165001, 0.130338354535672, 0.094203305677599436, -0.19730813245926024, -0.10041080102702246, 0.075932042745803577, 0.021134287621881041, -0.059575532325244519, 0.0082992125422013917, 0.015272751179096435, 0.0090248536114060952, -0.019251438395354602, -0.015788972597383853, 0.003250945662643008, 0.032968975479440332, -0.015058032290062954, 0.017643635220692015, -0.068857003169531444, 0.030070570566209365, -0.12793975070954616, -0.043534834876013277, 0.0017423598025251587, 0.028592812647173952, 0.0036967486190428137, 0.0090453167838253218, -0.016259252101333162, -0.0052076817297827191, 0.018046490267575967, -0.026168992315517926, -0.083077034868877908, 0.032798990212655046, -0.027546636940189637, -0.12409557570816734, -0.0088356071822206419, -0.034333260533212014, 0.056177295075322577, 0.057994393113440637, -0.032566171451921935, -0.010465798382464413, 0.020079425427313443, -0.017396471253638312, -0.017870360905994483, 0.010919865739753416, 0.012363627500514531, -0.014313215415815719, 0.034201557920817111, 0.10796975372596095, 0.21064351401911494, -0.046016401957029461, -0.083803307026608195, -0.15128619138644472, -0.070745415327885988, -0.06951503451164355, 0.070638418064815661, -0.0080019035626016123, 0.02654845111893607, 0.019862790828204354, -0.0038698355762961699, -0.020866890117519677, -0.0048084432749845906, -0.0036451640963975299, -0.0026341276434262537, -0.0023099396961399252, 0.043908100663757832, 0.096772033742844044, 0.04918905117971889, 0.070600771528734244, -0.026773628633603139, -0.05973226936448265, 0.013552286601009756, 0.0032289712715403013, -0.023046337829044056, -0.010405151723131599, 0.019427096259341661, 0.018256051683800133, -0.056759870222018213, -0.032960560091393032, -0.017399004273096801, 0.12185282737260948, 0.037984234337547759, -0.12270039394272629, -0.055947445070994896, 0.04621845892784341, -0.1857137618225036, -0.063810892086947277, 0.07053672326645595, 0.03906718120738633, 0.01577517031413787, -0.0047456570119124219, -0.019801411975277249, 0.024637199092487311, 0.019457415538283646, -0.0067710516924983765, -0.028346017012320548, -0.0065098329229195291, -0.0013352981567293612, -0.023151697315085987, -0.06519950655383687, -0.1042256990435297, -0.023224778901070588, 0.0072963544312097499, -0.034708386400909293, -0.0023809918522597964, 0.016167541663812009, -0.0054340236987463174, 0.0027208109883995382, 0.0066841964011560553, -0.023932611476630623, -0.039005803210705049, 0.016396390506166533, 0.058067983872416511, 0.15112210885707694, 0.091953539825334094, -0.30878981646904202, 0.23773808023122034, -0.11496619447060334, -0.15410637679425881, 0.16398523681965352, -0.042160123131605852, -0.0057838899052936009, 0.021159112170606904, -0.00089194024953267548, -0.043632529695206895, 0.025594278576058532, 0.04827977682701759, 0.008656372871138766, -0.025123508323013247, -0.021222695138498154, 0.012727342518660707, 0.0027327273075534982, 0.016727222825244921, -0.062351999721191126, -0.095086485134993501, 0.009789315676701096, 0.020526538310240195, -0.0017729650965628652, 0.0042367342426148282, 0.0096918161659650896, -0.014518052118829046, -0.0045810353743419062, -0.069451504639382974, -0.036289590762181183, 0.22708969966074724, 0.3665342673930222, -0.59625762091850343, 0.36774772058649913, 0.2627894192943519, -0.10703484463450727, -0.13950623949894417, -0.080806137493453625, -0.018761372187400087, -0.14807112835842171, 0.015533054933596769, -0.013156170331620851, 0.033053795814988449, 0.012901798319361097, 0.00377273404398293, -0.0087050725477761486, -0.026200884444946355, -0.069983120002794802, -0.045851102565308888, -0.0080215915074989454, -0.048063119818621811, -0.055909188302307122, 0.015567334119352533, -0.069113723063989038, -0.0072474243428621863, 0.042526562044161449, 0.039806904605142766, -0.027582495505149615, 0.0049261433754253488, -0.04754279011762625, -0.074122351214929355, 0.22223052073714245, -0.0077417273670608014, -0.080825286420915882, 0.62390518555370134, -0.18988737165776209, -0.013310214088767865, -0.13538196037364333, -0.38370084094404533, -0.32853605615928166, -0.23095349816725769, 0.0024573680892555631, -0.060148519255615616, 0.030360401196840837, -0.0084214745912351684, 0.033027304906486414, 0.030739864021722699, 0.0097039926999964547, -0.060698557392036313, -0.04746519227839175, -0.053530300822357386, -0.046174234082698239, 0.0052112044634668644, 0.020596160958060543, -0.15878906772803425, -0.02193329327109424, 0.0079342423803948989, 0.027919450264392773, 0.0070430807013025284, 0.020085011074200358, -0.075935043112063852, -0.041652272773957957, 0.16889959178925665, 0.18647295463827135, 0.014154913289577202, 0.060521107576468509, -0.63637312336837226, 0.90191957381577925, 0.27922666018549325, -0.48673882008850766, -0.33370031357259311, -0.3513559741645329, -0.2622745616761345, -0.17197492325356289, -0.0057315027931728107, -0.04469091820910031, 0.053283308768024513, 0.039465599946438043, -0.014174493080162808, -0.04946368453866596, -0.022857667990750397, -0.16881304090125779, -0.080812526909499666, 0.00058234446045326367, 0.084338425974376116, -0.12518231680881081, -0.040506406338050263, -0.08374410530080309, -0.001350704062862842, 0.030200114248426838, 0.042299889130269351, 0.011310849850443803, 0.081759178445920677, 0.035289563063634108, -0.12268118169149339, 0.058157249768416797, 0.19453030659557169, -0.32019695139960919, 1.2621857571853639, 0.24947885513851267, -0.86827138009746829, -0.26346017480935824, -0.40312000272498982, -0.22820944406317872, 0.0813299683314989, 0.0038871367161771898, -0.10891614598123801, 0.00043800911235750134, -0.043289297526922212, 0.012593343881888895, -0.0042686636670869688, -0.008833188472774969, -0.024141666831206311, -0.03923653338217388, -0.25435751708422283, 0.0, 0.13106581900761921, 0.22441332039311174, -0.094768447018961463, 0.0024812204443016074, 0.036286268392045858, 0.0056698536823630895, -0.010705526315732189, 0.082044918512892334, 0.0010532751265284197, 0.015101105715477795, 0.090653505450224631, 0.27613653682211553, 0.17494988738073455, 0.30956821269851931, 0.034540476362705901, 0.0, -0.034540476362701966, -0.30956821269851847, -0.17494988738073411, -0.27613653682211575, -0.090653505450227129, -0.015101105715478274, -0.0010532751265287738, -0.082044918512892334, 0.010705526315732109, -0.0056698536823632534, -0.036286268392045982, -0.0024812204443015839, 0.094768447018961921, -0.22441332039311199, -0.13106581900761924, -0.00058234446045052997, 0.25435751708422299, 0.039236533382173068, 0.024141666831206714, 0.0088331884727747174, 0.0042686636670865837, -0.012593343881888968, 0.04328929752692242, -0.00043800911235742604, 0.1089161459812379, -0.0038871367161778295, -0.081329968331500163, 0.22820944406317803, 0.40312000272499021, 0.26346017480936107, 0.86827138009747229, -0.24947885513851314, -1.2621857571853632, 0.32019695139960752, -0.19453030659557399, -0.058157249768416672, 0.12268118169149329, -0.035289563063634503, -0.081759178445920649, -0.011310849850443772, -0.042299889130268831, -0.030200114248426623, 0.0013507040628626303, 0.083744105300802674, 0.040506406338050895, 0.12518231680881103, -0.084338425974375644, 0.046174234082696289, 0.08081252690949875, 0.16881304090125832, 0.022857667990750261, 0.04946368453866589, 0.014174493080162815, -0.039465599946438334, -0.053283308768024965, 0.044690918209100129, 0.0057315027931725314, 0.1719749232535624, 0.26227456167613394, 0.3513559741645329, 0.33370031357259339, 0.48673882008850966, -0.27922666018549408, -0.90191957381578058, 0.63637312336837637, -0.060521107576467635, -0.014154913289577215, -0.18647295463827063, -0.16889959178925743, 0.041652272773958374, 0.075935043112064518, -0.020085011074200423, -0.0070430807013025249, -0.02791945026439252, -0.0079342423803949891, 0.021933293271094115, 0.15878906772803389, -0.02059616095805995, -0.0052112044634673969, 0.008021591507499164, 0.05353030082235833, 0.047465192278390397, 0.060698557392036064, -0.0097039926999963107, -0.030739864021722747, -0.033027304906486449, 0.008421474591235165, -0.03036040119684083, 0.060148519255615165, -0.0024573680892551967, 0.23095349816725866, 0.32853605615928261, 0.38370084094404566, 0.13538196037364647, 0.01331021408876858, 0.18988737165776171, -0.62390518555369734, 0.080825286420916714, 0.0077417273670609497, -0.22223052073714233, 0.074122351214929452, 0.047542790117626306, -0.0049261433754249724, 0.027582495505149737, -0.039806904605142586, -0.042526562044161428, 0.0072474243428622999, 0.069113723063988594, -0.015567334119352927, 0.055909188302305984, 0.048063119818621922, -0.0027327273075535455, 0.045851102565308353, 0.069983120002795093, 0.026200884444945973, 0.0087050725477759057, -0.0037727340439829347, -0.012901798319361227, -0.033053795814988754, 0.013156170331620811, -0.015533054933596691, 0.14807112835842184, 0.018761372187400604, 0.080806137493454139, 0.13950623949894433, 0.10703484463450816, -0.26278941929435246, -0.36774772058649907, 0.59625762091850687, -0.36653426739302131, -0.22708969966074771, 0.036289590762181079, 0.069451504639383266, 0.0045810353743422905, 0.014518052118829408, -0.0096918161659651156, -0.0042367342426148941, 0.0017729650965627938, -0.020526538310240098, -0.0097893156767009607, 0.095086485134992974, 0.062351999721190751, -0.01672722282524514, 0.065199506553837216, -0.012727342518659639, 0.021222695138497675, 0.025123508323013449, -0.0086563728711387469, -0.048279776827017555, -0.025594278576058595, 0.04363252969520693, 0.00089194024953267417, -0.021159112170607019, 0.0057838899052937813, 0.042160123131606046, -0.16398523681965352, 0.15410637679425865, 0.11496619447060411, -0.23773808023122042, 0.30878981646904247, -0.091953539825333053, -0.15112210885707561, -0.058067983872415838, -0.016396390506166002, 0.039005803210705077, 0.023932611476630637, -0.006684196401155907, -0.0027208109883995707, 0.0054340236987462662, -0.016167541663812044, 0.0023809918522598732, 0.034708386400909043, -0.0072963544312100569, 0.023224778901069786, 0.10422569904352962, -0.049189051179719279, 0.023151697315084544, 0.0013352981567299367, 0.0065098329229194736, 0.02834601701232067, 0.0067710516924982707, -0.019457415538283694, -0.024637199092487305, 0.019801411975277225, 0.0047456570119127489, -0.015775170314137797, -0.03906718120738624, -0.070536723266456214, 0.063810892086946833, 0.18571376182250354, -0.046218458927843417, 0.055947445070994993, 0.1227003939427266, -0.037984234337547038, -0.12185282737260873, 0.01739900427309727, 0.032960560091392817, 0.056759870222018227, -0.018256051683799891, -0.019427096259341584, 0.010405151723131587, 0.023046337829044038, -0.0032289712715403299, -0.013552286601009622, 0.059732269364482463, 0.026773628633603028, -0.070600771528734632, 0.008835607182220432, -0.096772033742842878, -0.043908100663758234, 0.0023099396961402566, 0.0026341276434262424, 0.0036451640963978101, 0.004808443274984581, 0.020866890117519587, 0.0038698355762962896, -0.019862790828204292, -0.026548451118935872, 0.0080019035626017337, -0.0706384180648158, 0.069515034511643051, 0.070745415327885364, 0.15128619138644453, 0.083803307026608292, 0.046016401957029593, -0.21064351401911435, -0.10796975372596025, -0.034201557920816583, 0.01431321541581594, -0.012363627500514576, -0.010919865739753575, 0.017870360905994497, 0.017396471253638378, -0.02007942542731345, 0.01046579838246435, 0.032566171451921762, -0.05799439311344054, -0.056177295075322847, 0.034333260533212451, -0.130338354535672, 0.12409557570816747, 0.027546636940189641, -0.032798990212655137, 0.083077034868877978, 0.026168992315517999, -0.018046490267575984, 0.005207681729782772, 0.016259252101333162, -0.009045316783825131, -0.0036967486190426836, -0.028592812647173869, -0.0017423598025251908, 0.043534834876013409, 0.12793975070954686, -0.030070570566209584, 0.068857003169531444, -0.017643635220692303, 0.015058032290063167, -0.032968975479440069, -0.0032509456626426633, 0.015788972597383943, 0.019251438395354474, -0.0090248536114061126, -0.015272751179096435, -0.0082992125422014836, 0.059575532325244533, -0.021134287621881149, -0.075932042745803632, 0.10041080102702246, 0.19730813245926007, -0.094203305677599283, 0.12177128356890216, -0.098130362913164085, -0.0086063527817301141, -0.014980171338571052, -0.091992925322100572, 0.17587869380621152, 0.092173327221095724, 0.021897165586045479, 0.0060375152678496429, -0.02386519187296254, -0.012395399307185896, -0.022849248448590303, -0.048321020114327692, -0.0056779923265118269, -0.084303725772385735, 0.1437989861779114, 0.017114978073907855, -0.023674926554513819, -0.014433128838537597, 0.012240235365543381, -0.066419574069182918, -0.016196236751474646, -0.0049338006978182185, -0.0084001340729884851, 0.0022066601859378697, 0.067545520465919467, -0.1431573605324398, -0.11335071558105927, 0.19200701617075636, 0.047005347129143109, -0.18040165272695829, 0.10462001130261284, -0.2952063874323646, 0.45504702044764878, 0.91968716746889512, 0.075629282019523555, -0.17521945191954877, -0.14741145606308895, 0.15842957449053352, 0.033316423902485841, -0.046539635523190549, -0.029239764799856394, 0.028256857448446561, 0.0047468618190423398, -0.025217898898983061, -0.034399558837173737, 0.11937846922953181, 0.050544258155460854, 0.1394578516494776, -0.10661165850403005, -0.027700064466883865, -0.061719692477810832, -0.00076880260958129979, -0.036686593450547596, 0.020834261928534131, 0.042596098823283357, -0.0052374024484263546, -0.17900936499027453, -0.055817128538076279, 0.1556206112582631, -0.19930768818407885, 0.17374602795438115, 1.0450941798657116, 0.011417685121456564, 0.77470195486186011, 0.069649876974948843, -0.36754664039982721, 0.64326753390430735, -0.24917063867041553, -0.039540586335773169, 0.14567847379973992, 0.065981740018920196, -0.055644084876628218, -0.07712597645572139, -0.00073674462317611055, 0.015701976416950342, -0.032298308999268784, 0.060154323470106401, -0.12792055300624763, 0.058681894939637193, -0.022172258797336572, 0.105971385474807, -0.037749743592242278, -0.053672308552617946, -0.12615835751184992, -0.059356927461923663, 0.012406017329547145, 0.068036947599653702, 0.017107991149299284, -0.041008154934057878, -0.13447215443394772, -0.26816260026693878, 0.18368617361305564, 0.46894237369717728, -0.62872636200456533, 0.60686918965331993, -0.15113295529591578, 0.036743730082780514, 1.463608458760923, 0.12904495334293731, -0.074417004563971351, -0.62003762386212891, 0.017408469796284774, 0.1272883333159911, -0.094937931062917147, -0.057791633379354237, 0.037154193600070003, 0.071495661604358593, -0.010724993842566222, -0.14811752790953939, 0.067869387966970118, -0.094974334151300438, 0.31269363662275046, 0.01610138969469304, 0.011271546890921311, -0.0416046739825933, -0.072156922858987255, -0.050238396740841143, -0.013143422355014638, 0.17181320075266959, -0.00078645201341033847, -0.2587885502662679, 0.0028564673365731054, 0.26469201284371935, -0.12782476119556443, -0.59904899563122194, 1.130668752319608, 0.4201199738298067, 1.5043263157657745, 1.0547694551235969, -1.1141651843864939, 0.90050578840564954, -0.50203282214727829, -0.35825626720186354, -0.34045699686317654, 0.034526357222664658, 0.16469615783949973, -0.10773227995476188, -0.020438609938140839, 0.15231382612170388, 0.0040452326400209297, -0.067443262257115694, -0.120243611846639, 0.072438990225412794, -0.27284169211913811, 0.31416612358708496, 0.23288712244734694, 0.17097210848547523, -0.068392282535087695, -0.1884297381053561, 0.026792869524674363, 0.068621242214500999, -0.028891896132398506, 0.01346687181869554, 0.18273076418691644, -0.039027219909814823, -0.68303147161529132, 0.28364033101911773, 0.20446853801739462, 1.3830149751777017, 1.3682011726001495, 1.0314907737559074, -0.55787436167296611, -0.99998707389668362, 0.11752989424299397, -0.85317721061416762, -0.39240115086507799, 0.26946209593128989, 0.13057930804766765, -0.0048298736467919578, -0.0066491170121302217, -0.023829771073630532, -0.072899207479286424, -0.29873174456544577, 0.027468417557455698, -0.26817287178186705, 0.21489820671404794, 0.048277840380711166, 0.23588030048916517, -0.0035092112107956196, -0.076854124253010928, 0.057907844320372041, -0.011517786678353752, 0.045146091846170348, -0.2624959582084973, -0.26585764990704652, 0.54510315877084026, 0.23155959034339049, -0.44086751164178861, -0.68911282851752897, 0.75019268688655205, 1.6899938281650098, 1.2795505844643045, 1.1758121586434311, -0.068510051090992494, 0.24494470763482898, -0.13955938857309558, 0.26258387187077409, -0.31004041285864437, -0.060946718066343622, 0.20150153854805294, -0.21163882649779717, -0.23457709892354675, 0.14508578389537688, -0.22705801052414679, -0.2857183558836735, -0.19596817846267664, 0.13015393203001066, -0.32999646269142935, -0.19528135326362211, 0.36806933922229168, 0.044374683774465004, -0.17789090203786717, -0.13954351571969323, 0.24064979253244634, 0.047498243759330878, -0.33137912963317673, 0.19951473048424839, 0.64027404819684597, 0.25055297311154973, 0.13414323846201037, 1.4561178571660989, 0.50660029824831798, 0.80695903119669876], \"height\": 32, \"width\": 32, \"top\": {\"real\": [17750.107020847583, 6210.8656159662787, 10017.081922566327, 3457.5995074393513, 265.850218137708, -70.207684810343054, -8.882891147089472, 24.589756503786479, -11.140592103834141, -1.46746599378154, -0.34121813437428317, 1.0812077419156148, 1.7163290532419633, -4.5666146304635689, -2.6846394014203829, -2.2738643666223468, 1.917575640981823, -2.2738643666223641, -2.6846394014204122, -4.5666146304635395, 1.7163290532419744, 1.0812077419156028, -0.34121813437427356, -1.4674659937815784, -11.140592103834141, 24.589756503786372, -8.8828911470896639, -70.20768481034348, 265.8502181377076, 3457.5995074393486, 10017.081922566325, 6210.8656159662851, 23430.31298691556, -4993.9863865787011, -867.92707841112326, 991.9702295167051, 152.49743471969379, -30.096228916888641, 45.849661798659078, -31.467588946689009, 16.960718546454469, 4.334366206560186, -0.42583907131000093, 0.47860527443285728, -1.8738744001784808, 0.5336707597630499, -3.8841941455247579, -0.75407824565303971, 0.55147195392985549, -0.79345242739339283, -5.9026769793174889, -1.384293215600769, -4.1447942145798233, -2.9130522743117342, -0.87120822186396762, -1.7340023689981476, 8.0221119849442548, -9.1034799758133218, 67.038874839272566, 44.112472832699858, 441.79945796279685, 3245.5044122716786, 3861.5097933424754, -5655.7687421695537, -15889.920855591003, -2792.0170209163471, 3795.2577126849956, 553.88440852995757, -85.905664770254234, 195.26564512659746, 24.791859336013662, 19.637521614531401, -6.1680089153590449, -5.0872002952886746, -0.21502707506361318, 1.4832779566036471, 1.4444541156654906, -2.278921340791467, 0.30255454236990775, -2.3473646939882187, -0.02820677859184775, 1.2126049622480428, -0.78557937342030726, -2.9245439997897638, 1.236962081731878, 1.1827041713801927, -1.6114665304853286, -3.5864367039316236, -14.698165954413065, 20.29282209316159, 43.732891706759197, 111.68572777077691, -209.48016621032312, -187.12585183373633, 2586.3148393820152, 1688.0815183011628, 4748.2203910254093, 1775.7319020900284, 965.53459113591498, -592.89741380746352, 99.787886354888371, 95.459765036004825, 59.296635518443523, -7.6987106331430111, -0.0036180413118668542, -0.43290786252066471, -1.598202682681902, 0.11359872229615781, -0.47654646487314006, 0.052920121324431191, -1.1931569571302629, 1.6263047283546588, 1.1208282513608689, -1.916766911729648, -1.3790558562903064, -0.15528235781115707, 0.33989539819890602, -1.1170639390757935, -0.54019671791116586, 2.4039660385463359, 7.3342674422729397, -18.965458306286095, 0.037731231015075362, 5.7888823722245277, -226.40133474887324, -362.07505408372458, 1068.1182163210274, 1839.5542246985658, 1536.2207931138801, 1719.2247320855465, 351.77395499971544, -218.00810259302051, -154.06814929171503, 76.932404651951941, 11.83330919947551, 3.0799843602247936, 2.1514657945922595, -2.1600173905506583, -0.81329272919310069, -0.057640935991259419, 0.81743781787660708, 0.47007834357539929, 0.82578474649026179, -0.485121980563267, -0.44118347877967812, 0.85372587191033056, -0.96505091801449949, -2.5001329354507269, -0.28227610008090631, 1.5082121759974054, 0.73323799037869442, 0.47326064521443867, -2.2071915479661444, 2.1017967421924912, -14.788373732218277, -10.376064867674437, -110.67917899227207, -400.67251265606825, 13.375377575225066, 2228.271084047331, 1272.0006323499422, 485.30359922269918, -150.18264185504094, -215.33992676901764, -8.8694467345951651, 40.216044199991913, 0.62739683840663496, -1.763160286154926, 0.88761506214793773, 2.2829883187502253, -0.37542737915458396, -0.082924323502338942, -0.2690018095258665, 0.066494953017985289, -1.2937095742683771, 0.90148019848405447, 1.049315066873844, -1.5500155662664761, -1.5096304544124948, -0.76725462527686761, -0.45464639460382006, 0.03503878860161394, 0.85393872935961013, 0.89172763012310696, -0.12413241898971583, -7.4057881467564117, -5.5362761946156125, 1.231534306746803, 18.635135255424384, 26.03667534143711, -87.772888824715437, -225.72012452523001, 395.63478219787083, 378.71701677039351, 36.703056312438811, -91.050394397947159, -3.4611377608751717, 16.691588629055683, -0.030826600791664327, -3.1969308796412692, 1.3816292236713215, 0.42488100600164197, 0.084713763632908196, -0.28535803119354425, 0.0058483120842748731, -0.72249565507011926, -0.80262162213105104, -0.11947358836291604, 0.14251583505573939, -0.26639764768858409, -0.59599833623749066, -0.56289480519068613, -0.092201911820288446, 0.77223819072116529, 0.55522491064190738, -0.14411590791637013, -2.1806910872492855, 1.0588352659849944, -1.722617263430356, -9.0167440767821265, -38.483896322518888, -22.599080819691828, 25.541139705127691, 375.57983717352784, 181.47383294778024, 149.67885098073037, -4.1008782517976057, -3.7383475143657869, 18.721866312633942, -1.1602382001305473, -5.8391540939420112, -0.21088907624048864, -0.29870055099180226, 0.95331837446181378, 0.060424395643205529, -0.42858353450158043, -0.37036207729837234, -0.30369644506457261, -0.75652176347658984, -0.44545713631522388, 0.71326845215283508, 0.071761808928956311, -0.63829698193917794, -0.45235505563855871, -0.080159340308425753, -0.15881914095274483, 0.37773826228539636, -0.097086363313521495, -0.86706044290909523, -1.3342582973973045, -0.61792777020441481, 0.16957438507140327, 10.565905071599056, 15.380533375221102, 10.500239194747859, 19.996280010030237, 18.60272375866586, 4.0348314717803326, 11.168149094486143, 14.395513359675057, -3.576502394652771, -3.8760628092228431, 2.0358977627782506, -1.6580642648165547, -0.13166485139511078, 0.2591565726162201, -0.22701969228044258, -0.29312645623416966, 0.099969472199353857, -0.39101661164543228, -0.042546772814251566, 0.29433076927773894, -0.50935384874181677, 0.090487726861141621, -0.092143985882572388, -0.58253529440268437, -0.41671432281001702, 0.14644815319126417, 0.2723500443275419, -0.039709576626662156, -0.41013369223337515, 1.1756350920235048, 1.5259648698081887, -4.4516278662013118, -8.128003687892722, 9.6041080205516938, 20.813833475064627, 12.963050463991683, 7.8870012209429445, 15.407970089260955, 5.3783096889109112, -3.1350030536179672, 1.9101786820520572, 1.6649545288728531, -2.1421648847872561, 0.35230920085802159, 0.37729718445187704, 0.020823929394603979, 0.087139744957248078, -0.10976037032555666, -0.56986899401739111, -0.44020908152219312, 0.69190564661152409, 0.20725962387572397, 0.64042787368671816, 0.71867283099896739, 0.16183428074791173, -0.17223426808716463, -0.17676233483878773, -0.27594664738318686, 0.095238357444986099, 0.020726971935864241, -0.11463597101365795, -0.32333311610982368, 1.2888258236383847, 3.0237538834517612, -0.12189842989060286, -4.5002056479068653, -2.8307120360813536, 9.0325055742836575, -5.0836871456416608, -6.4226783361185662, -2.3832064029645541, 2.1204380507892151, -2.1797923249754283, -2.1316882770768921, 1.4364513793862836, 0.82847417311036753, -0.54705107713687473, -0.053118808001263999, 0.10349330090189141, -0.027586170457780668, -0.27866115184949369, -0.4744187891270259, 0.32835706009268834, 1.8712198771790323, 0.44937016780231559, 0.8488760221500451, 0.35191803530681381, 0.28758243475250972, -0.6426201464805843, -0.40597353100929789, -0.22244529364246871, -0.071869502235051647, 0.33021466122988641, 0.24942995069051274, -0.5214330526633183, -0.093662554700336673, 1.1233733739102922, 1.9003965613191238, 0.07120934753760759, -8.6549236119446178, -1.8427620371931031, -0.52295775466804406, 3.4092952720370122, -0.65003177967723336, -0.1840159964371442, 1.8831870902689825, 0.7983111628921199, -0.39925172982701851, 0.051205177403033819, 0.2598923527237304, -0.18824332097783142, 0.13750859145926242, 0.78226830313090512, -1.2572785001190825, 1.3355363328556911, 1.2220896356262305, 1.6491421999762639, 1.7622421170936717, 0.96487439834416744, 0.79128381470112286, -0.26979590260649117, -0.37236776211072153, -0.65318812250908376, -0.13360581679076858, -0.1817007191765827, 0.4244891020544192, 1.0695325895656689, -0.49200291489349485, -0.59959066580988751, -2.4610304070506381, -1.7528842523917616, 5.4092974592427554, 11.628502736704702, 13.318871722095572, 5.3844201289172418, 0.12839725172390623, -0.91462159985003533, -0.4207633568928546, 0.73289618436063231, 0.98164545606019249, -0.31879685258307294, -0.45467275635234927, 0.23929181220408463, 0.73553732103708702, -0.78050285180289647, -0.20614377250205779, -0.66147354811396541, 0.84722544756444751, 3.1542100241342745, -1.0454812204468338, 0.49112272834774079, 0.89780094097137775, -0.80686344960242362, 0.26166207514350009, 0.34234964401672252, -0.27361449647202374, 0.078400343257288022, 0.27130715748636108, -0.26706243773596255, 0.92879560872659372, -1.3686907450256593, 0.37153092475944227, -0.0077060915391855903, -2.1487270106054996, 8.2423115107991176, 10.211121947580189, 11.004080199445575, 5.512476255300478, 0.43541395104991965, 1.3138259234516578, 0.47697687525002369, -0.37437690637871951, 0.49170325146724819, 0.53092933204425685, 0.78977231856458541, 0.054935970034302541, 1.0907299238052364, -1.4537313504920895, 1.6637415256529431, 2.3271742206176285, 1.6752406948773604, 6.0227778178364675, -2.5693140331095292, -1.3449083811022362, -0.063540759326359386, 1.2007479971921078, 0.26947504329539196, -0.043317616642408706, -0.090092404474960294, -0.56149356452164179, -0.29757479536733583, -0.82531287850485402, 0.52880973840083989, -0.51042849628299192, 1.1866854822445434, 7.7130480762288167, 17.626109919920186, 26.29568713002228, 9.1514979514586194, -1.521929375229722, 0.85364359123771261, -0.365663824522519, -1.1590870007863963, 0.48082630002696519, 0.93059067445638155, 1.1024013035834523, 0.63841829574218301, 1.5659590764611497, 0.20674310541385973, 1.0081259505833966, 1.4865008399227626, -1.6031905208728288, 5.7718835709767413, 0.2720344299284404, 3.2411570780563994, -1.0481514144590243, 2.2338214812745694, 3.1628749936702945, 1.7743358086362808, -0.03099281849361625, -0.41442882712954171, -0.31459130661253104, -1.7323756021672925, 0.19363530105298493, 0.61123212270521721, 4.8260404786904152, 6.7814469674820135, 4.974801806376985, 19.935738411546794, 15.127019575257112, 16.951752765718286, 6.976320734749117, 0.83204582564536733, -0.22090351652873133, -0.48187393778382737, -0.72216259413318939, 0.68337514879437744, 1.4934027691778771, 1.3836806937153638, -0.089108362899698895, 0.57910533764344185, 3.1507795425198797, 1.9139554692796912, 4.1423990225960203, -5.0893580330573318, 4.6545320074577088, -1.3079026033800338, 1.2583901568403451, 1.3087920196200225, 1.8018391908724931, 1.3933980798910508, 0.67604933114803067, -0.49475104816844406, -1.4152366315362725, -0.64580662533466104, -1.4537653735214031, 3.1014323943375786, 7.6843087454063586, 10.909142678924193, 12.359496229531475, 15.280082473470735, 24.669023160454167, 12.739042274822818, 1.7204760023261643, 0.52929508548715176, 2.1482192005482723, -1.481161898887601, -0.79404079710432474, 0.46540881956838565, 0.92624711854277975, 1.0380549761479756, 2.3168267428989626, 1.5788387366050483, -0.83766970523004924, 4.7505720502223729, -2.6570294115495297, 6.7612131323955511, -2.6570294115495336, 4.7505720502223783, -0.83766970523005702, 1.5788387366050476, 2.3168267428989657, 1.0380549761479752, 0.9262471185427773, 0.46540881956838565, -0.79404079710432862, -1.4811618988876001, 2.148219200548279, 0.52929508548715154, 1.7204760023261518, 12.739042274822809, 24.669023160454188, 19.935738411547018, 12.35949622953156, 10.909142678924129, 7.6843087454063417, 3.101432394337563, -1.4537653735213987, -0.64580662533467093, -1.4152366315362839, -0.49475104816844562, 0.67604933114803401, 1.3933980798910552, 1.8018391908724987, 1.3087920196200247, 1.2583901568403484, -1.3079026033800301, 4.6545320074577061, -5.0893580330573203, 4.1423990225960088, 1.913955469279683, 3.1507795425198943, 0.57910533764344618, -0.089108362899694094, 1.3836806937153729, 1.4934027691778826, 0.68337514879437378, -0.72216259413318618, -0.4818739377838111, -0.22090351652873805, 0.83204582564534302, 6.976320734749093, 16.951752765718314, 15.127019575257133, 17.626109919920285, 4.9748018063769956, 6.7814469674819922, 4.8260404786903921, 0.61123212270520444, 0.19363530105297699, -1.7323756021672947, -0.31459130661253587, -0.41442882712954437, -0.030992818493609464, 1.7743358086362877, 3.162874993670298, 2.2338214812745694, -1.0481514144590143, 3.241157078056395, 0.27203442992843363, 5.7718835709767413, -1.6031905208728274, 1.4865008399227673, 1.0081259505833953, 0.20674310541386615, 1.5659590764611582, 0.63841829574219022, 1.1024013035834526, 0.93059067445638244, 0.48082630002696636, -1.1590870007863949, -0.36566382452250978, 0.85364359123770939, -1.5219293752297598, 9.1514979514585963, 26.295687130022237, 8.2423115107992349, 7.7130480762288673, 1.1866854822445243, -0.51042849628302267, 0.52880973840082446, -0.82531287850485058, -0.297574795367338, -0.56149356452165111, -0.090092404474959795, -0.043317616642408116, 0.26947504329539745, 1.2007479971921178, -0.063540759326354057, -1.3449083811022313, -2.5693140331095257, 6.0227778178364719, 1.675240694877361, 2.3271742206176271, 1.6637415256529449, -1.4537313504920832, 1.0907299238052377, 0.054935970034312817, 0.78977231856459063, 0.53092933204426229, 0.49170325146725052, -0.37437690637871607, 0.4769768752500283, 1.3138259234516545, 0.43541395104990577, 5.5124762553004887, 11.004080199445557, 10.211121947580168, 11.628502736704604, -2.1487270106054663, -0.0077060915391693741, 0.37153092475944555, -1.3686907450256616, 0.92879560872659006, -0.26706243773595856, 0.27130715748636525, 0.078400343257288438, -0.27361449647201985, 0.34234964401672396, 0.26166207514350365, -0.80686344960242218, 0.8978009409713853, 0.49112272834772974, -1.045481220446846, 3.1542100241342701, 0.84722544756444151, -0.66147354811395898, -0.20614377250205829, -0.7805028518028938, 0.73553732103708935, 0.23929181220408727, -0.45467275635235105, -0.31879685258307255, 0.98164545606019549, 0.73289618436063131, -0.42076335689285432, -0.91462159985003766, 0.12839725172388108, 5.3844201289172204, 13.318871722095585, -1.8427620371929223, 5.4092974592426515, -1.7528842523917609, -2.4610304070506088, -0.59959066580987819, -0.49200291489348996, 1.0695325895656664, 0.42448910205441354, -0.18170071917658262, -0.13360581679076522, -0.65318812250908243, -0.3723677621107227, -0.26979590260649017, 0.7912838147011273, 0.96487439834416677, 1.7622421170936722, 1.6491421999762705, 1.2220896356262196, 1.3355363328556904, -1.2572785001190749, 0.78226830313090379, 0.13750859145926628, -0.18824332097783478, 0.25989235272372874, 0.051205177403034013, -0.39925172982701423, 0.79831116289212645, 1.8831870902689678, -0.18401599643714045, -0.65003177967722925, 3.4092952720370082, -0.52295775466808114, -5.0836871456417914, -8.654923611944545, 0.071209347537571008, 1.9003965613191072, 1.1233733739103013, -0.093662554700343362, -0.52143305266331286, 0.24942995069051838, 0.33021466122988513, -0.071869502235049398, -0.22244529364246549, -0.40597353100929245, -0.64262014648058341, 0.28758243475251449, 0.35191803530680799, 0.84887602215004632, 0.44937016780231587, 1.8712198771790289, 0.32835706009269156, -0.47441878912702484, -0.27866115184949264, -0.027586170457779294, 0.1034933009018901, -0.053118808001266206, -0.54705107713687218, 0.82847417311037153, 1.4364513793862805, -2.1316882770768819, -2.1797923249754287, 2.1204380507892009, -2.3832064029645679, -6.4226783361184081, 7.8870012209433504, 9.0325055742834763, -2.8307120360814029, -4.5002056479068191, -0.12189842989059124, 3.0237538834517572, 1.2888258236383801, -0.32333311610982529, -0.11463597101365604, 0.020726971935865871, 0.09523835744498739, -0.27594664738318975, -0.17676233483878293, -0.17223426808716019, 0.16183428074791517, 0.71867283099897139, 0.64042787368672205, 0.20725962387572536, 0.69190564661152509, -0.44020908152219435, -0.56986899401739244, -0.10976037032555588, 0.087139744957248716, 0.020823929394600361, 0.37729718445187588, 0.35230920085802736, -2.142164884787245, 1.6649545288728365, 1.9101786820520659, -3.1350030536179658, 5.3783096889108455, 15.40797008926083, 18.60272375866586, 12.963050463991696, 20.813833475064644, 9.604108020551676, -8.1280036878927362, -4.4516278662013278, 1.5259648698081876, 1.1756350920235052, -0.41013369223337515, -0.039709576626662003, 0.27235004432754167, 0.14644815319126442, -0.41671432281001886, -0.58253529440268281, -0.092143985882572915, 0.090487726861142509, -0.50935384874181677, 0.29433076927773738, -0.042546772814252246, -0.39101661164543189, 0.09996947219935487, -0.29312645623417033, -0.22701969228044291, 0.2591565726162216, -0.13166485139511078, -1.6580642648165524, 2.0358977627782484, -3.8760628092228537, -3.5765023946527563, 14.395513359675084, 11.168149094486147, 4.034831471780354, 181.47383294778047, 19.996280010029963, 10.50023919474779, 15.38053337522109, 10.565905071599067, 0.16957438507140921, -0.6179277702044097, -1.3342582973973056, -0.86706044290909146, -0.097086363313522245, 0.37773826228539636, -0.1588191409527461, -0.080159340308420923, -0.45235505563855616, -0.63829698193917661, 0.071761808928958337, 0.71326845215283419, -0.44545713631521988, -0.75652176347658784, -0.30369644506457882, -0.37036207729837373, -0.42858353450157866, 0.060424395643203697, 0.953318374461814, -0.29870055099180354, -0.21088907624048941, -5.8391540939419864, -1.1602382001305538, 18.721866312633882, -3.7383475143657954, -4.100878251797706, 149.67885098073012, 395.63478219787089, 375.57983717352744, 25.541139705127598, -22.599080819691835, -38.483896322518888, -9.0167440767821709, -1.7226172634303247, 1.0588352659849967, -2.1806910872492873, -0.14411590791637696, 0.55522491064190693, 0.77223819072116739, -0.092201911820284366, -0.56289480519067914, -0.59599833623749254, -0.26639764768858487, 0.14251583505573989, -0.11947358836291141, -0.80262162213105359, -0.72249565507012325, 0.0058483120842701027, -0.28535803119354936, 0.084713763632907418, 0.42488100600164375, 1.3816292236713219, -3.1969308796412634, -0.030826600791668796, 16.691588629055648, -3.4611377608751566, -91.050394397947187, 36.703056312438633, 378.71701677039351, 1272.0006323499422, -225.72012452523026, -87.772888824715139, 26.036675341437149, 18.635135255424501, 1.2315343067468421, -5.536276194615616, -7.4057881467564011, -0.12413241898971436, 0.89172763012310496, 0.8539387293596038, 0.035038788601613982, -0.4546463946038164, -0.76725462527685828, -1.509630454412483, -1.550015566266479, 1.0493150668738473, 0.90148019848405436, -1.2937095742683813, 0.066494953017976297, -0.26900180952586789, -0.082924323502345257, -0.37542737915458746, 2.2829883187502267, 0.88761506214793962, -1.7631602861549227, 0.62739683840662275, 40.216044199991877, -8.8694467345952006, -215.33992676901772, -150.18264185504114, 485.3035992226977, 1536.2207931138814, 2228.2710840473319, 13.3753775752247, -400.67251265606865, -110.679178992272, -10.376064867674508, -14.788373732218197, 2.1017967421924983, -2.207191547966143, 0.47326064521441386, 0.73323799037869852, 1.5082121759973919, -0.28227610008090809, -2.5001329354507282, -0.96505091801449672, 0.8537258719103169, -0.44118347877968372, -0.48512198056327205, 0.82578474649025857, 0.47007834357539341, 0.81743781787659597, -0.057640935991271409, -0.81329272919311113, -2.1600173905506721, 2.1514657945922622, 3.0799843602248034, 11.833309199475522, 76.932404651952027, -154.06814929171483, -218.00810259302057, 351.77395499971459, 1719.2247320855445, 4748.2203910254084, 1839.554224698564, 1068.1182163210278, -362.07505408372486, -226.40133474887313, 5.7888823722244789, 0.037731231015098787, -18.965458306285971, 7.3342674422729388, 2.4039660385463657, -0.54019671791118873, -1.1170639390757879, 0.33989539819890108, -0.15528235781113153, -1.3790558562903272, -1.9167669117296613, 1.1208282513608707, 1.6263047283546224, -1.193156957130264, 0.052920121324427458, -0.4765464648731435, 0.11359872229612604, -1.5982026826818876, -0.43290786252068791, -0.0036180413118654109, -7.6987106331430244, 59.296635518443559, 95.459765036004427, 99.787886354888386, -592.89741380746432, 965.53459113591339, 1775.7319020900306, -15889.920855591006, 1688.0815183011607, 2586.3148393820165, -187.12585183373636, -209.48016621032366, 111.68572777077674, 43.732891706759332, 20.292822093161472, -14.698165954413049, -3.5864367039316574, -1.611466530485326, 1.1827041713801545, 1.2369620817318689, -2.9245439997897797, -0.78557937342029793, 1.2126049622479607, -0.028206778591846705, -2.3473646939882631, 0.30255454236988177, -2.278921340791416, 1.4444541156654738, 1.483277956603626, -0.21502707506361871, -5.0872002952886604, -6.168008915359052, 19.637521614531632, 24.791859336013527, 195.26564512659732, -85.905664770254006, 553.88440852995757, 3795.2577126849942, -2792.0170209163462, 23430.312986915553, -5655.7687421695537, 3861.5097933424781, 3245.5044122716772, 441.79945796279628, 44.112472832700512, 67.038874839272665, -9.1034799758128742, 8.0221119849442406, -1.7340023689979776, -0.87120822186400182, -2.9130522743116929, -4.1447942145798446, -1.3842932156007377, -5.9026769793175413, -0.7934524273933764, 0.55147195392985315, -0.75407824565312243, -3.8841941455247726, 0.53367075976302614, -1.8738744001784735, 0.47860527443281381, -0.42583907130996707, 4.3343662065600954, 16.960718546454476, -31.467588946689279, 45.849661798659248, -30.096228916889014, 152.4974347196931, 991.97022951670215, -867.92707841112428, -4993.9863865787029], \"imag\": [0.0, -2277.9356791272003, -4760.5440393641002, -3362.7502157108247, -452.6326365977277, 12.902525613472081, -66.324591493039264, 21.395810280639775, 12.049924797684376, -6.4322319301924828, -2.6401787430633603, -2.8941924141450355, -1.0996569736184965, -2.1837600734887777, 0.87308165169681873, -0.4143473704962265, 0.0, 0.41434737049617953, -0.87308165169672458, 2.1837600734887985, 1.0996569736184816, 2.8941924141450213, 2.6401787430632839, 6.4322319301924944, -12.049924797684376, -21.395810280639751, 66.32459149303935, -12.902525613472182, 452.63263659772764, 3362.7502157108197, 4760.5440393641011, 2277.9356791272016, -19170.834011440937, -3837.2504381898657, -1562.2865240696121, -2188.2624437144, -79.985389317630222, -65.73387671644744, -129.03232713044309, -21.574731283989859, 19.219741943874205, -1.3770831994436832, -4.6285618656089973, 1.9356332468609161, 1.914358953204174, -0.39274625271235863, -2.8755632420164114, 1.3910769799127469, 2.1983982122300691, -0.93402216187723952, 1.5955119590990243, 2.5332827335358816, 2.5722659267438073, -2.1433748844126024, 4.7051607105169868, 6.0715674792926295, -11.686157623491814, 7.736622407403881, 65.513717323045199, -68.939947660481394, 105.08267177765576, -524.55810593663, 266.59769699529215, -6565.2013915603111, -12998.804313286138, -7140.8743305075541, -1281.4742181751476, 387.93265499317204, 232.0789193763446, -67.213502175129548, -82.499903393484686, 23.742310304940581, 13.167070698799225, -1.2601921779485123, 0.22176027695648487, -0.82869028871129857, 0.81638586337482588, 0.030361957750051641, -1.8114765667849664, -0.33462283171345614, -1.4063404110660631, 1.8330278968089115, -0.19923279402973898, 2.6325944160953934, 0.74767454410312451, 0.33273215463055067, 0.1242120122414053, 0.13350548988021607, -6.7517210150420688, -24.893726268864828, 68.764375920932309, 203.58844824671789, -52.443377241039173, 589.84188198577237, 814.38538391702434, -3077.5993672243876, -9988.2725309741327, -5000.8757444384873, -213.86760970710961, -153.72085790515706, 376.50689706328353, 10.499004391497454, -22.259718007212538, -1.0587560944123571, 1.3367261976572533, -1.845627367813951, -0.50817475490747221, 2.6646257572641145, 0.72663987403826902, -1.4553261209412862, -1.7486114908592469, -2.2393579162674944, 1.7872556824974239, -0.4779279337995983, 0.90990468751900189, 0.56850457149088529, -0.042260514128558184, -2.0950938638350283, 0.37842412015856491, 2.7868839636562086, -7.1796038797667068, -2.6532766677526052, 42.569555354666804, 86.618323256686423, 262.60583525697274, -570.34935164465662, 953.3853188584327, -2608.4519239039555, 423.76919790180068, -777.49072200787271, -730.15551768721184, 267.77827954485849, 48.782690015655945, -52.084914641107339, -0.26732768536918228, 18.791248861451912, 0.034376983736590996, -4.7733525107569852, 0.2450889317389604, 0.69551673309505335, 0.74689297610787508, 0.36254455317814038, -0.082864627703290866, -0.11088180406499534, -1.9145243520823481, 0.63809937787576865, -0.47609558693404908, 1.1704253870693357, 0.1035348526676573, -0.98268640942924379, -0.66403014974353547, 1.4462870038602533, 3.6812627646537175, -8.6847068298461885, -1.7026644231740631, 110.68919188818327, 26.998515460375977, -65.421023262373453, -744.09540667092062, -46.729307478653496, -1526.2181503116453, -735.50774046161519, 282.18880697804167, -182.37864683063907, -54.052681314235201, 39.603849315110104, 10.295701682078779, 2.359337802307917, -0.63461911007383953, -1.7124190510555728, -0.21593130161202514, 0.76755040332111413, 1.2882353738829533, 0.44968314290067118, 0.25989055470659483, -0.66713893962057369, 0.13682839189736165, -0.36883118795348507, 0.91230383136371929, -0.46996446240256329, 0.30219131214854422, -0.19558932994062075, 0.012615763849470061, 1.762420772813289, 1.9045345605049635, -3.7790359077733253, -11.964107143689581, 4.5083476182968525, 61.96781696120042, -254.89688572081204, 140.68826246910922, -45.053807917761794, 314.74785574475101, -8.8001261891015723, -360.31891091191073, -57.025448777424479, 44.579795546563595, -19.359200628613657, 3.6862817789376683, 8.9206630611283089, 0.18896973496668307, -1.0227323524081069, -0.33838743748909134, 0.43833208591156991, 0.0074294169071561673, 0.50446476014305897, 0.1890893708139402, 0.65133332546862077, -0.77483290182744535, -0.30779007494077709, -0.80427129683389309, 0.26011219704759059, 0.23461588343644721, -0.056507066939534729, -0.44513357712322738, 0.64667209976975049, 1.5545017016282721, -1.5250850436867627, -9.5917712473092696, 13.475211488788412, 28.837963587037802, -21.930976284520067, -337.61540934331555, -197.27075321520147, -65.634374404237917, -45.716174186409042, 38.688397244662028, -10.636065931319841, -36.620593610799475, 11.815798616251305, 9.0326984830007095, -3.0325028906240825, -0.075862266735019127, 0.19104942819406223, 0.073726425569811863, 0.18311714867084192, 0.63036999033226249, -0.098626184449280729, 0.095619359707605045, 0.13744024889930673, -0.097089152898782338, -0.81683568275166918, 0.54386217024143169, 0.041501479859297266, 0.43031399471588661, 0.25470104821283102, 0.17326636360277617, 0.46079094226119127, -0.16530865667454481, -0.86391702025516282, -4.9611285532463629, -12.372184270457062, 11.516126179313906, 3.2997425925449804, 2.0570987009733872, 24.878800155519915, 44.041788084316849, 28.446155418037641, -32.190550839656126, -17.692027714058376, 11.789513877445387, 1.9317197634824401, -3.4507560855810171, 0.36626836712779354, 0.48074766055651602, 0.18044316667269442, -0.28240974426973131, -0.16613612027343372, 0.029095718259237995, 0.24450075339721422, -0.091330331747513635, 0.097634295479075664, -0.36806371804963284, 0.16614591312540511, -0.77395352504544712, -0.3264657443238585, 0.015061212014132833, 0.29085100346092985, 0.047770712409502418, 0.14922819541222396, -0.39792121836056477, -0.1921281774085053, 0.83895281997413806, -1.5703737430868945, -8.4367427775736452, 5.6601916863792336, -5.1510032561702124, -22.050605310259861, -1.9854594697574779, -7.5311386138630718, 7.4148341093741337, 8.0952123464619365, -4.3629732153959058, -0.87617222540110651, 1.0539667118389069, -0.69495683349647086, -0.53597221218340763, 0.21612918483653182, 0.16753374785242167, -0.14587335963051168, 0.2984129896925935, 0.75720231383362635, 1.2725586605629424, -0.23788459440434945, -0.43858849762191893, -0.79801858694486538, -0.41846754429723099, -0.46161406526582383, 0.58294801786464678, -0.078939183973068427, 0.31479155143425391, 0.31425797573231379, -0.084400039832661436, -0.69288180199641103, -0.21778449617622889, -0.19533791786522492, -0.22665765093841067, -0.31956792613405932, 6.3352095159571435, 13.304182061875538, 9.0685889178215753, 13.820343051841526, -2.9904131431626517, -6.4644843028741459, 1.4950174056035006, 0.22841081726546483, -1.0443697855595202, -0.36648156701751267, 0.48825453192442753, 0.32511669967392476, -0.74952192547288132, -0.32406742573949188, -0.14589390394899102, 0.81615985313544603, 0.21110858701983537, -0.62135646441400272, -0.27503339195756299, 0.23916839371037824, -1.0440547633891395, -0.40792084439497517, 0.55610134656922072, 0.37457806876122546, 0.17778944632276653, -0.069642667350154328, -0.39526560004564598, 0.69822150614317735, 0.740778974977921, -0.31290252683747921, -2.0096273906801638, -0.75165898775917361, -0.15987777595408992, -2.5516179078608778, -8.9643314564796608, -15.134863386021781, -2.1073345817546003, 0.61887776540407591, -3.0206322635570779, -0.13950893398737912, 0.63280527166495781, -0.16318694006603662, 0.06410706438489891, 0.11411070867346804, -0.2886162817684455, -0.35613651800395313, 0.12924440993745664, 0.38077834891929796, 0.82374133978448782, 0.42592408743381815, -1.4993887570975311, 1.2113263922466315, -0.61651842130949264, -0.92820589700907985, 1.2123284995709924, -0.37394823077908607, -0.062695571319925397, 0.28532586796592635, -0.016166881608109255, -1.1132083022635739, 0.86546596809253507, 2.0760623026361933, 0.51322827606545562, -2.2491343600113889, -2.0374388890600263, 1.1231676638159473, 0.31214242438772172, 2.2815521755579042, -5.3082712246609329, -6.7280927719717081, 0.71404381047788856, 1.0348891792697787, -0.062580928735681385, 0.11553928672311624, 0.19710411955257187, -0.22253376417909151, -0.05143415191355815, -0.61738709055352659, -0.26515618204121805, 1.3879170617746586, 1.9147895569711311, -2.7981144693643607, 1.6351053618238791, 1.2876141106871726, -0.53839815046157202, -0.81616813855627257, -0.55773229035800009, -0.16310476776122179, -1.4828287822897712, 0.19857441865721279, -0.22253902629935005, 0.76149089771667944, 0.38423492006819204, 0.13633825788919049, -0.40617531895308634, -1.9006670978622686, -5.6055295794952666, -3.5201069577585091, -0.70565394755327504, -4.8233879396582013, -3.7118525914264513, 0.87639764763224848, -3.9705679716456896, -0.3066516936670704, 1.2925955094882555, 0.98057929368147423, -0.5185509231518588, 0.068504647941653091, -0.50802141302695303, -0.65025043431383311, 1.6393007306999561, -0.046634622615140439, -0.42095485749155304, 2.8628962346767608, -0.87664183209871016, -0.061380249620325719, -0.67583720185830587, -2.165804182360429, -2.2334105499018988, -1.7315960703588726, 0.023607096501577673, -0.72578349898044647, 0.49340703388266716, -0.17688316963519096, 0.91231104952944475, 1.0401382704665323, 0.40638239361664558, -3.5528586670065754, -3.2389924588328527, -3.336337544628424, -3.3053285670589143, 0.42529364953930032, 1.2623512061316915, -7.9337267372836493, -1.0910503490681764, 0.30591237262721482, 0.79049013658839029, 0.15779582936744363, 0.35530534658354934, -1.0136463777621887, -0.43596379336607172, 1.3766560550226186, 1.2643786263280588, 0.081112249920068616, 0.30101965208538256, -2.9649644331404845, 3.940601481283172, 1.2809925361642973, -2.3740821954043603, -1.8568139214134618, -2.2875531209700912, -2.0068530505793203, -1.6161905886738603, -0.069970559948539499, -0.68452644609555957, 1.1180256373411306, 1.0386505011587546, -0.45802414484767806, -1.8827293053017495, -1.1452872829873149, -9.8282380345909921, -4.8375314158562777, 0.035534088492687292, 5.8735645683280717, -7.2148282372822923, -1.9024855757814658, -3.6729219824305321, -0.04721742712852893, 0.80045523566507781, 0.91856151213872683, 0.18365173124028911, 1.0527130168554166, 0.35231243394437906, -0.96832866520995176, 0.38866324603453256, 1.1024459216780036, -1.6264163010988006, 5.9086248051519128, 1.1522588148293589, -4.0123769411888297, -1.3409560614230069, -2.2450482885496141, -1.484164394238348, 0.58569229342098317, 0.035646451001070931, -1.3588202093923047, 0.006860270440306241, -0.84539036438792836, 0.31580363771161246, -0.13161779536446233, -0.34549511895795371, -1.1291296924180168, -2.1947930228924113, -14.643424663744323, 0.0, 7.8456512467946364, 11.843681310787776, -4.1545820919682566, 0.098834485797376734, 1.2191537903053737, 0.14782839419733967, -0.21707569483499198, 1.3287726303022269, 0.012891904979339022, 0.146292284007916, 0.70147269041246085, 1.7613861146868823, 0.97884915683286033, 1.5860078469473597, 0.15814907094033309, 0.0, -0.158149070940315, -1.5860078469473551, -0.978849156832858, -1.7613861146868832, -0.70147269041248062, -0.14629228400792066, -0.012891904979343359, -1.3287726303022269, 0.21707569483499028, -0.14782839419734384, -1.2191537903053777, -0.098834485797375804, 4.1545820919682752, -11.843681310787789, -7.8456512467946329, -0.035534088492520481, 14.643424663744339, 2.194793022892366, 1.1291296924180338, 0.34549511895794383, 0.13161779536445045, -0.31580363771161418, 0.84539036438793247, -0.0068602704403050632, 1.3588202093923036, -0.035646451001076773, -0.58569229342099216, 1.484164394238344, 2.2450482885496172, 1.3409560614230207, 4.0123769411888466, -1.1522588148293609, -5.9086248051519057, 1.6264163010987922, -1.102445921678016, -0.38866324603453178, 0.96832866520995076, -0.35231243394438311, -1.0527130168554157, -0.18365173124028866, -0.91856151213871651, -0.80045523566507271, 0.047217427128521561, 3.6729219824305099, 1.9024855757814958, 7.21482823728231, -5.8735645683280371, 3.3053285670587775, 4.8375314158562217, 9.828238034591017, 1.1452872829873084, 1.8827293053017478, 0.45802414484767828, -1.0386505011587623, -1.1180256373411397, 0.68452644609555668, 0.069970559948536071, 1.6161905886738546, 2.0068530505793158, 2.2875531209700912, 1.856813921413464, 2.3740821954043709, -1.2809925361643011, -3.9406014812831787, 2.9649644331405014, -0.30101965208537818, -0.081112249920068671, -1.2643786263280541, -1.3766560550226248, 0.43596379336607571, 1.0136463777621971, -0.35530534658355051, -0.15779582936744335, -0.79049013658838307, -0.30591237262721799, 1.0910503490681696, 7.9337267372836298, -1.2623512061316555, -0.42529364953934357, 0.70565394755329391, 3.336337544628484, 3.2389924588327594, 3.5528586670065589, -0.40638239361663953, -1.0401382704665338, -0.91231104952944642, 0.17688316963519082, -0.49340703388266682, 0.72578349898044092, -0.023607096501574151, 1.7315960703588795, 2.2334105499019046, 2.1658041823604322, 0.67583720185832141, 0.061380249620329064, 0.87664183209870872, -2.8628962346767408, 0.4209548574915572, 0.046634622615141327, -1.6393007306999556, 0.65025043431383445, 0.50802141302695369, -0.068504647941647845, 0.51855092315186113, -0.98057929368147057, -1.2925955094882546, 0.30665169366707518, 3.9705679716456634, -0.8763976476322699, 3.7118525914263776, 4.8233879396582111, -0.31214242438772705, 3.5201069577584692, 5.6055295794952924, 1.9006670978622411, 0.40617531895307485, -0.13633825788919066, -0.38423492006819598, -0.76149089771668665, 0.22253902629934941, -0.1985744186572119, 1.4828287822897714, 0.16310476776122626, 0.55773229035800354, 0.8161681385562749, 0.5383981504615758, -1.2876141106871739, -1.6351053618238793, 2.7981144693643794, -1.9147895569711246, -1.3879170617746619, 0.26515618204121727, 0.61738709055352903, 0.051434151913562459, 0.22253376417909698, -0.19710411955257243, -0.11553928672311804, 0.062580928735678887, -1.0348891792697743, -0.71404381047787879, 6.7280927719716743, 5.3082712246609018, -2.2815521755579335, 8.9643314564797052, -1.1231676638158536, 2.0374388890599802, 2.2491343600114058, -0.51322827606545429, -2.0760623026361911, -0.86546596809253695, 1.1132083022635748, 0.016166881608109234, -0.28532586796592802, 0.062695571319927382, 0.37394823077908801, -1.2123284995709924, 0.92820589700907918, 0.61651842130949663, -1.2113263922466326, 1.4993887570975342, -0.42592408743381316, -0.82374133978448039, -0.38077834891929335, -0.12924440993745251, 0.35613651800395341, 0.28861628176844567, -0.11411070867346547, -0.064107064384899673, 0.16318694006603501, -0.63280527166495915, 0.13950893398738348, 3.0206322635570557, -0.61887776540410167, 2.1073345817545266, 15.134863386021769, -9.0685889178216552, 2.5516179078607184, 0.15987777595415892, 0.75165898775916729, 2.0096273906801727, 0.31290252683747422, -0.74077897497792289, -0.69822150614317713, 0.39526560004564548, 0.069642667350159129, -0.1777894463227658, -0.37457806876122451, -0.55610134656922283, 0.40792084439497267, 1.0440547633891391, -0.23916839371037832, 0.2750333919575636, 0.62135646441400449, -0.21110858701983135, -0.81615985313544015, 0.14589390394899499, 0.32406742573949032, 0.74952192547288177, -0.32511669967392071, -0.48825453192442569, 0.36648156701751228, 1.0443697855595189, -0.22841081726546683, -1.4950174056034862, 6.4644843028741308, 2.9904131431626397, -13.820343051841599, 1.9854594697574315, -13.304182061875386, -6.3352095159572039, 0.3195679261341049, 0.22665765093840967, 0.19533791786523994, 0.21778449617622839, 0.69288180199640803, 0.084400039832664031, -0.31425797573231284, -0.31479155143425158, 0.078939183973069621, -0.58294801786464789, 0.46161406526582016, 0.41846754429722727, 0.79801858694486438, 0.43858849762191948, 0.23788459440435036, -1.2725586605629382, -0.75720231383362191, -0.29841298969258917, 0.14587335963051393, -0.16753374785242225, -0.21612918483653495, 0.53597221218340851, 0.69495683349647419, -1.0539667118389073, 0.87617222540110107, 4.3629732153958827, -8.0952123464619206, -7.414834109374171, 7.5311386138631651, -44.041788084316849, 22.050605310259897, 5.1510032561702142, -5.6601916863792514, 8.4367427775736488, 1.5703737430868991, -0.83895281997413862, 0.19212817740850727, 0.39792121836056477, -0.14922819541222082, -0.047770712409500753, -0.2908510034609289, -0.015061212014133111, 0.32646574432385927, 0.77395352504545112, -0.16614591312540627, 0.36806371804963284, -0.097634295479077288, 0.091330331747514912, -0.24450075339721231, -0.029095718259234932, 0.16613612027343472, 0.28240974426972948, -0.18044316667269469, -0.48074766055651602, -0.36626836712779753, 3.4507560855810189, -1.9317197634824488, -11.789513877445398, 17.692027714058376, 32.190550839656112, -28.446155418037584, 65.634374404237818, -24.878800155519698, -2.0570987009734387, -3.2997425925449106, -11.516126179313863, 12.372184270457085, 4.9611285532463585, 0.86391702025516592, 0.16530865667454706, -0.46079094226119116, -0.1732663636027687, -0.25470104821282824, -0.43031399471588622, -0.041501479859297648, -0.54386217024143224, 0.81683568275167029, 0.097089152898783726, -0.13744024889929929, -0.095619359707603865, 0.098626184449285684, -0.63036999033225893, -0.18311714867083492, -0.07372642556981146, -0.19104942819406445, 0.075862266735016198, 3.0325028906240856, -9.0326984830007238, -11.815798616251362, 36.620593610799446, 10.636065931319884, -38.68839724466217, 45.716174186409333, -314.74785574475044, 197.27075321520152, 337.61540934331566, 21.930976284520245, -28.837963587037731, -13.475211488788421, 9.5917712473092944, 1.5250850436867665, -1.5545017016282761, -0.64667209976974838, 0.44513357712322837, 0.056507066939540815, -0.23461588343644407, -0.26011219704759359, 0.8042712968338912, 0.30779007494077798, 0.77483290182744469, -0.65133332546861145, -0.18908937081392915, -0.50446476014305819, -0.0074294169071514489, -0.43833208591156614, 0.3383874374890965, 1.0227323524080993, -0.18896973496668346, -8.9206630611282982, -3.6862817789376785, 19.35920062861366, -44.579795546563581, 57.025448777424586, 360.31891091191056, 8.8001261891013822, 1526.2181503116453, 45.053807917762221, -140.68826246910882, 254.89688572081207, -61.967816961200398, -4.5083476182968329, 11.964107143689583, 3.7790359077733431, -1.9045345605049631, -1.7624207728132955, -0.01261576384946491, 0.19558932994062728, -0.30219131214854072, 0.4699644624025669, -0.91230383136372128, 0.36883118795348824, -0.13682839189736087, 0.66713893962058779, -0.25989055470659439, -0.44968314290067052, -1.2882353738829488, -0.76755040332110314, 0.21593130161202181, 1.7124190510555817, 0.6346191100738432, -2.3593378023079388, -10.295701682078779, -39.603849315110132, 54.052681314235315, 182.3786468306393, -282.18880697804133, 735.50774046161428, -423.76919790180091, 46.72930747865378, 744.09540667092074, 65.421023262373566, -26.998515460375824, -110.68919188818332, 1.7026644231740455, 8.6847068298461902, -3.6812627646537122, -1.4462870038602713, 0.66403014974352648, 0.98268640942926089, -0.10353485266764806, -1.1704253870693322, 0.47609558693405896, -0.63809937787576798, 1.9145243520823476, 0.11088180406502474, 0.082864627703299776, -0.36254455317814699, -0.74689297610786809, -0.69551673309504447, -0.24508893173895085, 4.773352510756971, -0.034376983736587929, -18.791248861451901, 0.26732768536914786, 52.084914641107339, -48.782690015656009, -267.77827954485792, 730.15551768721207, 777.49072200787191, 9988.2725309741272, 2608.4519239039569, -953.38531885843202, 570.34935164465708, -262.60583525697274, -86.61832325668658, -42.569555354666946, 2.6532766677526505, 7.1796038797667014, -2.7868839636562561, -0.37842412015855753, 2.0950938638350354, 0.042260514128576405, -0.56850457149086808, -0.90990468751900622, 0.4779279337996068, -1.7872556824974217, 2.239357916267509, 1.748611490859272, 1.4553261209412682, -0.72663987403827102, -2.6646257572640879, 0.50817475490745234, 1.8456273678139588, -1.3367261976572486, 1.0587560944122603, 22.259718007212488, -10.499004391497355, -376.50689706328382, 153.72085790515695, 213.86760970710961, 5000.8757444384837, 12998.804313286144, 3077.5993672243935, -814.38538391702389, -589.84188198577237, 52.443377241039045, -203.58844824671809, -68.764375920932238, 24.893726268864992, 6.7517210150420599, -0.13350548988021724, -0.12421201224142447, -0.33273215463053935, -0.74767454410310241, -2.6325944160953538, 0.19923279402974362, -1.8330278968089646, 1.4063404110660558, 0.33462283171345686, 1.8114765667849764, -0.030361957750053889, -0.81638586337482577, 0.82869028871127859, -0.22176027695649836, 1.260192177948489, -13.167070698799225, -23.742310304940538, 82.499903393484416, 67.213502175129648, -232.07891937634469, -387.93265499317204, 1281.4742181751474, 7140.8743305075477, 19170.83401144094, 6565.2013915603166, -266.59769699529113, 524.55810593663034, -105.08267177765569, 68.939947660481323, -65.513717323045299, -7.7366224074036598, 11.686157623491809, -6.0715674792925807, -4.7051607105170206, 2.1433748844125784, -2.5722659267438033, -2.5332827335358727, -1.5955119590990279, 0.93402216187716958, -2.1983982122300714, -1.3910769799127845, 2.875563242016451, 0.39274625271232855, -1.9143589532041787, -1.9356332468609148, 4.6285618656089529, 1.3770831994437265, -19.219741943874194, 21.574731283989856, 129.03232713044289, 65.73387671644744, 79.985389317629867, 2188.2624437143977, 1562.286524069611, 3837.2504381898625]}};\n\nvar face_filter = {\"real\": [2.5919359538538909, 1.3480085770312511, -0.20482945082417442, 2.2477358192448036, 0.93540843887482139, 0.74314370383748074, 0.44299233336869565, 0.53646864525435445, -0.033677232548862526, -0.1522853308878499, -0.0031113453238400149, 0.052610669730581504, -0.0090421776029276455, 0.14571584983663624, 0.44057103654181279, -0.48335213540388067, -1.3567864542305328, -0.48335213540388222, 0.44057103654181745, 0.14571584983663588, -0.0090421776029276386, 0.052610669730583912, -0.0031113453238437146, -0.1522853308878454, -0.033677232548862526, 0.536468645254354, 0.44299233336869559, 0.74314370383748229, 0.9354084388748215, 2.2477358192448023, -0.20482945082417423, 1.3480085770312495, 2.0152106388329991, 0.85611134878653461, -1.3363494489312076, -0.52148568567931619, 1.2207493971968164, 0.88880185549210589, -0.12851357573552111, -0.1350280522901679, 0.041300904967699482, 0.44502243372725686, 0.029355734210915238, -0.51443976319946505, 0.08745222381708008, 1.2148708003194451, 1.1189080727093581, -0.27220544444671846, -0.36088426941083585, -0.093485947527556318, -0.9769818787641994, -0.68349100625395898, 0.024322257871818426, 0.60512811669399713, 0.15343788102432432, -0.4299366545774243, -0.15452787333937706, 0.9156200895039931, 1.19600272916941, 0.72364825206645089, 0.54200011692086325, 2.3400266438502029, -0.033608374945748302, 0.58898161413145322, 2.0269883277253808, 2.818789893714468, -3.5895244227646144, -3.5314332372596891, 2.0122812700890154, 0.93093181995227969, -0.96305400340897007, -0.73612667628472817, -0.053915776695886194, 0.42730242898842419, 0.029936824487282035, -0.35168293029190251, 0.25108420491884947, 0.8544524900293714, 0.16931894270710782, 0.0092385746333500125, 0.68672569869418298, 0.41915906104063394, -1.0984488703050921, -0.63697851900908631, 0.11186355371520935, 0.47269360156783113, 0.15279475225563477, -0.026106440237006989, -0.032262751173084157, 0.14542662300780329, 0.71981331903700141, 1.4137393979172745, 0.60857711312874896, -3.0736342072317173, -2.5537641666010327, 0.6337650914909162, 1.2343577579270657, 0.25345561236901865, -2.0331393954447585, 1.159193858429254, 3.0170447718709359, 0.49021233060315667, -0.684375328954414, -0.32927583863381799, -0.09284792777273311, -0.14740895498043241, -0.19413825853994604, 0.36919608239644319, 0.30546257655082493, -0.55256449500031701, -1.2130125640575424, 0.066961883917897494, -0.13876096422777703, 0.37902224678367341, 0.22718444978554084, 0.19963817528635963, 0.027529920247751867, -0.24231535965414738, -0.016338923407765684, 0.45136614923078927, 0.28975660783972312, -0.73094055491799104, -1.5465072446477164, -0.070769892332079726, 3.1701479989789885, 0.024916786279245037, -2.8717730703729369, -1.1681626968077414, -0.94600410103718435, -0.85872517244177848, 2.9516513032863374, 2.8131952593882126, -1.5261742763882251, -1.0558844683361728, 1.1680212024537544, 0.98450685108739822, 0.064067265719269059, -0.43727283330478184, -0.044395094277671916, 0.6179734700494115, 0.24878996343187737, -0.63891278340523816, -0.75864993025841965, -0.32304619466454659, -0.73387564471571265, -0.043145833390571785, 0.92391812888689884, 0.89946098537045804, 0.14871674926559622, -0.54822828954183223, -0.26728613142127311, 0.309011363128886, 0.21418689978013769, -0.52105157113820344, -1.0686411834884146, -1.3047927124000203, 1.0355627592914096, 2.9672746843849169, 1.9471218128812939, 0.36030875558033187, 0.22471825920653532, 1.3679256644146878, 2.3784795387427549, 0.73776440177250424, -2.2202952003703751, -0.98667153092188797, 0.60944427589951666, 0.29273424438530327, -0.054064553213066489, -0.1955430963609566, 0.13452976853580562, 0.17688857701463095, -0.02907863269662225, -0.037177619339377604, 0.22892611971691484, -0.22870850340942314, -0.41029268509332983, 0.061215349005760457, 0.37818604838169356, 0.34148146887082653, 0.099938245586444027, -0.099254338381423959, -0.11254516916626593, -0.2039622085642743, -0.20060216516957027, 0.30792957356810446, 1.1721236672075155, 0.56136417541067873, -2.3249600877666992, -2.4287881268668112, 2.0674326900187423, 2.8441511789848586, 0.050947133476877834, 0.30280142076825006, 0.23441985585068989, -0.69420211937437837, 0.50017210833819825, 0.9824320425486297, -0.30253127598451673, -0.35217802522066471, -0.25522460504160704, 0.12672156371020879, 0.11584743671788442, -0.27806946703293017, -0.28220471587289919, 0.2622813962834421, 0.46145186677272942, 0.088913779923943934, 0.31552668240292342, 0.083701767363049212, -0.20838882493274438, -0.45028623286649139, -0.21994207603667223, 0.24344265380915428, 0.14566519323380012, -0.26341476824800764, -0.25014860441221609, 0.23269603050324755, 0.65507472733677707, 0.58916939473049168, -1.2014518968451928, -1.4706959472537811, 0.73270160247544736, 1.4639339636380404, 0.46180491918070748, 0.46274052021248863, -1.2522772114725254, -1.0527125117724863, 1.1798416267497167, 0.8831199054956721, 0.0044403719443055645, -0.32008851183583215, -0.088039126814047713, 0.13435677108789251, -0.043849665988197006, -0.30055389900341628, -0.17300527880436442, 0.22268011829576431, 0.14506301721613848, 0.13541851865273877, 0.31252919184011202, 0.13643782704324722, -0.2095508102885523, -0.37861030355575276, -0.25285479563588548, 0.076566684841017141, 0.11737705239518459, 0.013018358464219467, -0.041516874353177323, 0.025396859515453351, -0.19237103418038187, -0.20754469441764836, 0.83543584581843078, 0.96010698083026003, -1.0523257697001149, -1.33376499327856, 0.31064795509136994, 0.20053594173979683, -0.099592610690013544, 0.046946926411794127, -0.26933425983580023, -0.25886956646489134, 0.16667582025681255, 0.16264384177267197, 0.10611595375861864, -0.0098404462838746383, -0.13572606372513804, -0.02258793083641232, 0.1626410940258704, 0.0084042334154625226, -0.31667685877385637, 0.013183667319477316, 0.0095114839461814711, 0.064735813239969756, 0.10654247281867815, 0.21331216355051069, 0.10213744987583113, -0.12973084349572184, -0.098085407735951202, 0.071599991117337544, 0.096012887125637492, -0.070622290324985737, -0.21061961456993025, 0.12811225495378645, 0.61116435171305805, 0.27931012230932523, -0.57076807310688515, -0.50218388849258644, -0.42922119360119421, -0.44865243467955651, 0.48865422280767501, 0.5325596193896186, -0.37999327914266867, -0.37733114800401457, 0.013506411710477314, 0.170066818452864, 0.060998910324659567, -0.13656793547637669, -0.090686593939375684, 0.3743991900961478, 0.47466547775213164, -0.40581229446604228, -0.4933460399621819, -0.38074360867450391, -0.49035943457716413, -0.12412531843683997, 0.30440943973074641, 0.59456571635307864, 0.39877140482842571, -0.17295292843566973, -0.26272159996092964, -0.046183226771098686, 0.047879446168886036, -0.01767919625538646, 0.11122639164092249, 0.28368537020126805, -0.25549013964140954, -0.47047462219224784, 0.42895932921703384, 0.49142711950580215, -0.37646529147307217, -0.2985208724149509, -0.14163512022800509, 0.036248242700393868, 0.16977635036237812, 0.13499908156480836, -0.01898512351822966, -0.069319801425736585, -0.048065151476023839, -0.091445654237596943, 0.063480780271467835, 0.36025783734460454, 0.079528415094702418, -0.1753773206782209, 0.12374069460012149, -0.28367021291499456, -0.3947284775676721, -0.2665809890749859, 0.18834221718468977, 0.27819651942933282, 0.17697914055115227, -0.044718494415980817, -0.10522429653700929, -0.056918990576836789, -0.038574904247242463, 0.0044720036764788907, 0.075029157257001891, -0.012042674487198736, -0.25791041993690383, 0.0094461444749257637, 0.45149640843334832, 0.15522942660639183, 0.16359187166611067, 0.27184060163390095, -0.26140872283435745, -0.36468827084356714, 0.092564696434539948, 0.17076044356298117, -0.081952166134050972, -0.094812402895013512, 0.056872171173511843, 0.14314060902527834, 0.090057378296037091, -0.49752310636724911, -0.90399504476626857, 0.68385321448233993, 1.5206479363861476, 0.97194500124059446, 0.37223376526843088, 0.050885418177567802, -0.35886815857743665, -0.85430361824055856, -0.54314517421482678, 0.35505625397063872, 0.41635160123016829, 0.1097676276443619, 0.0031094617237012487, 0.012467253683817481, -0.13435478466038733, -0.3025207327612856, 0.064227680246281948, 0.26667168729095614, -0.26695175931487575, -0.39070435016787081, 0.46272484969502237, 0.4478152924484996, -0.02777275619946918, -0.36406380803433314, -0.36482553236919035, -0.17145017383338396, -0.0022768560529046471, 0.19648856692552516, 0.19795501524240586, 0.11579620326491886, -0.20236218758832794, -1.3218815146594056, -0.89510126706911786, 0.91685720076146016, 1.0573193754484274, 1.0300227650328617, 1.2681463254528202, 0.54199794330131901, -0.81825453423342154, -1.1158895792994059, -0.48892024147971419, 0.37011029837274972, 0.52557441450178022, 0.12007696462970571, 0.0053871855361874443, 0.0980933520274576, 0.045813676675892742, -0.13973686519943007, -0.1315893019053164, -0.41025099029328865, -0.78307378558342511, -0.43058051319449592, -0.14586342722110873, -0.20332028656079115, -0.50991116383855117, -0.22496834802938576, -0.23147407593468516, -0.0020062182884880236, 0.35659057442027225, 0.21055136817067865, -0.090708657953189512, -0.093236555831976653, -0.39644071531856356, -0.15760046489763799, 0.85217092970404984, -0.006060772398080865, -1.1445855838899712, -0.40779542231222293, 0.57192337467361454, 0.38110042075214373, 0.18372151232217485, 0.45534551448489441, 0.44338161640444884, -0.33392303093222925, -0.30033251173404302, -0.018826279470074956, -0.0031918185582147274, 0.016996498806762936, 0.19478439409652604, 0.14839426734987179, -0.16993496725014728, -0.25233000300477815, -0.17163872305028913, -0.16896259214086029, -0.35048355912402168, -0.56666117156530804, -0.043075182629207294, 0.46189562289598257, 0.12201955959263491, 0.048431387757678836, 0.1008273185138992, -0.19670456422152316, -0.16642026644756419, -0.15046897531292064, 0.1609200706656915, 1.4039223524989202, 1.7178875241186931, -0.079850193819757748, -1.5066376684783904, -1.9250211671886128, -1.0545407692185655, -0.51176749353660089, 1.7285428258292277, 1.5863083779089326, 0.24208315366337785, -0.88837860391849655, -0.80449782923567614, -0.063049218988350142, 0.18072374426616816, 0.041279056588780935, -0.12639978427416398, -0.058413638180600282, 0.18149778190196758, 0.37146508613201623, 0.60005197547104183, 0.38887239681739694, 0.1152103935846736, -0.080081540793911096, 0.79737548580628892, 0.60164673103725985, 0.13967291436025694, -0.17870113794821088, -0.40389823435739103, -0.33510874790612805, -0.062682749064233156, 0.042125181720095217, 0.22750178782369759, 1.0883583281620091, 0.67976518601386504, -0.6792087414350455, -0.67769831799676505, 0.0071297652693774914, -0.21574274789108602, 0.73346137493748143, 0.69884011316820749, 0.12589091429626179, -0.68348492100050939, -0.41285410288550739, -0.18770950063360772, -0.15148842977747803, 0.047869931187020834, 0.21018250411743153, 0.068763639373895541, 0.0098401964213560011, -0.019137710950301583, -0.44014279794733802, -0.21656678437317001, 0.36831896296176964, 0.31965489003799819, 0.24180664285441536, -0.20287221126440233, -0.56181438279878848, -0.15470815549218525, 0.11910006502983214, -0.0029256323011974715, -0.04650506403640628, -0.11603914651892111, -0.15307567360464111, 0.4224212238432043, 0.15967260300989697, -0.83895691770827985, -1.4824802915019837, -0.37969523238638658, 0.89583132075795047, 1.77383273304373, 0.8958313207579488, -0.37969523238638764, -1.4824802915019843, -0.8389569177082784, 0.15967260300989483, 0.42242122384320435, -0.15307567360464003, -0.11603914651892111, -0.046505064036406023, -0.0029256323011973848, 0.11910006502983216, -0.15470815549218528, -0.56181438279878715, -0.20287221126440275, 0.24180664285441561, 0.11521039358467118, 0.36831896296176875, -0.2165667843731702, -0.44014279794733774, -0.019137710950301947, 0.0098401964213558832, 0.068763639373895805, 0.21018250411743131, 0.047869931187020681, -0.15148842977747892, -0.18770950063360678, -0.4128541028855055, -0.68348492100050762, 0.12589091429626098, 0.69884011316820926, 0.73346137493748531, -0.21574274789108297, 0.0071297652693808498, -0.67769831799676439, -0.67920874143504806, 0.6797651860138616, 1.0883583281620088, 0.22750178782369845, 0.042125181720095072, -0.06268274906423292, -0.33510874790612777, -0.40389823435739058, -0.17870113794821069, 0.13967291436025678, 0.6016467310372583, 0.79737548580629014, -0.080081540793910805, -0.35048355912402274, 0.38887239681739855, 0.60005197547104216, 0.37146508613201551, 0.18149778190196694, -0.058413638180600004, -0.12639978427416418, 0.041279056588780526, 0.1807237442661683, -0.063049218988349559, -0.80449782923567681, -0.88837860391849677, 0.24208315366337824, 1.5863083779089293, 1.7285428258292255, -0.51176749353659912, -1.0545407692185644, -1.9250211671886148, -1.506637668478394, -0.079850193819762688, 1.7178875241186904, 1.4039223524989211, 0.160920070665691, -0.15046897531292144, -0.16642026644756441, -0.19670456422152255, 0.10082731851389957, 0.048431387757679002, 0.122019559592635, 0.46189562289598279, -0.043075182629206808, -0.56666117156530804, -0.1458634272211089, -0.16896259214085926, -0.17163872305028846, -0.25233000300477826, -0.16993496725014781, 0.14839426734987166, 0.19478439409652576, 0.016996498806763023, -0.0031918185582146671, -0.01882627947007429, -0.30033251173404329, -0.3339230309322298, 0.44338161640444979, 0.45534551448489619, 0.18372151232217931, 0.38110042075214462, 0.57192337467361187, -0.40779542231222243, -1.1445855838899728, -0.0060607723980816422, 0.85217092970405028, -0.15760046489763638, -0.39644071531856373, -0.093236555831976972, -0.090708657953189803, 0.21055136817067863, 0.35659057442027281, -0.0020062182884879754, -0.23147407593468516, -0.22496834802938495, -0.50991116383855117, -0.20332028656079207, 0.46272484969502153, -0.43058051319449625, -0.78307378558342611, -0.41025099029328771, -0.13158930190531651, -0.13973686519943013, 0.04581367667589293, 0.098093352027458003, 0.0053871855361874036, 0.12007696462970524, 0.52557441450178122, 0.37011029837274845, -0.48892024147971336, -1.1158895792994052, -0.81825453423342154, 0.54199794330131867, 1.2681463254528189, 1.0300227650328604, 1.0573193754484311, 0.91685720076146382, -0.89510126706911664, -1.3218815146594056, -0.20236218758832747, 0.11579620326491913, 0.19795501524240555, 0.19648856692552533, -0.002276856052904625, -0.17145017383338415, -0.36482553236918996, -0.36406380803433286, -0.027772756199469509, 0.44781529244849971, 0.1635918716661118, -0.39070435016787175, -0.26695175931487636, 0.26667168729095614, 0.064227680246282309, -0.30252073276128633, -0.13435478466038722, 0.012467253683817804, 0.0031094617237012916, 0.10976762764436168, 0.41635160123016834, 0.35505625397063934, -0.54314517421482655, -0.85430361824056045, -0.35886815857743842, 0.050885418177567691, 0.3722337652684316, 0.97194500124059191, 1.5206479363861465, 0.68385321448234182, -0.90399504476626835, -0.49752310636725033, 0.09005737829603698, 0.14314060902527884, 0.056872171173512003, -0.094812402895013193, -0.081952166134050861, 0.17076044356298159, 0.092564696434540239, -0.36468827084356803, -0.26140872283435806, 0.27184060163390172, -0.37646529147307173, 0.15522942660639114, 0.45149640843334826, 0.009446144474926697, -0.25791041993690383, -0.012042674487198701, 0.07502915725700196, 0.0044720036764790416, -0.038574904247242366, -0.056918990576836755, -0.10522429653700935, -0.044718494415980962, 0.17697914055115149, 0.2781965194293311, 0.18834221718468852, -0.2665809890749849, -0.39472847756767171, -0.28367021291499434, 0.12374069460012085, -0.17537732067822176, 0.079528415094701682, 0.3602578373446047, 0.063480780271467876, -0.091445654237597165, -0.048065151476023728, -0.06931980142573653, -0.018985123518229702, 0.13499908156480855, 0.16977635036237826, 0.036248242700393465, -0.14163512022800506, -0.29852087241494996, -0.42922119360119487, 0.49142711950580192, 0.428959329217034, -0.47047462219224911, -0.25549013964141071, 0.28368537020126877, 0.111226391640923, -0.017679196255386387, 0.047879446168886071, -0.046183226771098616, -0.26272159996092947, -0.17295292843566987, 0.39877140482842616, 0.59456571635307809, 0.30440943973074525, -0.12412531843683972, -0.49035943457716313, -0.3807436086745018, -0.49334603996218179, -0.40581229446604117, 0.47466547775213147, 0.37439919009614836, -0.090686593939375629, -0.13656793547637694, 0.060998910324659573, 0.17006681845286384, 0.013506411710477128, -0.37733114800401446, -0.37999327914266845, 0.53255961938961804, 0.4886542228076744, -0.44865243467955757, 0.31064795509136994, -0.50218388849258644, -0.57076807310688515, 0.27931012230932423, 0.61116435171305772, 0.12811225495378684, -0.21061961456993031, -0.07062229032498564, 0.096012887125637492, 0.0715999911173376, -0.098085407735951036, -0.12973084349572186, 0.10213744987583084, 0.21331216355051105, 0.10654247281867847, 0.064735813239968978, 0.0095114839461814711, 0.013183667319477904, -0.31667685877385532, 0.0084042334154626214, 0.1626410940258709, -0.022587930836412171, -0.13572606372513854, -0.0098404462838748534, 0.10611595375861864, 0.16264384177267199, 0.16667582025681238, -0.2588695664648914, -0.26933425983580034, 0.046946926411794203, -0.099592610690013642, 0.20053594173979666, 0.46180491918070782, -1.3337649932785616, -1.0523257697001149, 0.96010698083025947, 0.835435845818432, -0.20754469441764875, -0.19237103418038279, 0.025396859515452976, -0.041516874353177122, 0.013018358464219362, 0.11737705239518428, 0.076566684841017002, -0.25285479563588431, -0.37861030355575326, -0.2095508102885513, 0.13643782704324786, 0.31252919184011235, 0.1354185186527376, 0.14506301721613746, 0.22268011829576351, -0.17300527880436414, -0.30055389900341645, -0.043849665988197138, 0.13435677108789171, -0.088039126814047811, -0.32008851183583126, 0.0044403719443063165, 0.8831199054956711, 1.179841626749716, -1.0527125117724856, -1.2522772114725254, 0.46274052021248885, 0.050947133476877821, 1.4639339636380404, 0.73270160247544602, -1.4706959472537806, -1.2014518968451935, 0.58916939473049124, 0.65507472733677696, 0.23269603050324741, -0.25014860441221576, -0.26341476824800797, 0.14566519323380028, 0.24344265380915459, -0.2199420760366726, -0.45028623286649283, -0.20838882493274519, 0.083701767363050281, 0.31552668240292281, 0.088913779923944877, 0.46145186677272854, 0.2622813962834421, -0.28220471587289875, -0.27806946703292978, 0.11584743671788453, 0.12672156371020837, -0.25522460504160699, -0.35217802522066505, -0.30253127598451701, 0.98243204254862915, 0.50017210833819781, -0.69420211937437803, 0.23441985585068889, 0.30280142076825051, 0.2247182592065364, 2.8441511789848586, 2.0674326900187419, -2.4287881268668121, -2.3249600877666978, 0.56136417541067796, 1.1721236672075159, 0.30792957356810535, -0.20060216516957047, -0.2039622085642748, -0.11254516916626582, -0.099254338381423668, 0.0999382455864435, 0.34148146887082625, 0.37818604838169406, 0.061215349005760457, -0.41029268509332922, -0.22870850340942214, 0.22892611971691548, -0.037177619339376564, -0.029078632696622427, 0.17688857701463057, 0.13452976853580567, -0.19554309636095565, -0.054064553213066628, 0.29273424438530188, 0.609444275899516, -0.98667153092188464, -2.2202952003703764, 0.73776440177250102, 2.3784795387427535, 1.367925664414688, -0.94600410103718391, 0.3603087555803301, 1.9471218128812944, 2.9672746843849187, 1.0355627592914098, -1.3047927124000192, -1.068641183488414, -0.52105157113820511, 0.21418689978013775, 0.30901136312888583, -0.26728613142127272, -0.54822828954183234, 0.1487167492655953, 0.89946098537045849, 0.92391812888689973, -0.043145833390572444, -0.73387564471571165, -0.32304619466454804, -0.75864993025841865, -0.63891278340523694, 0.24878996343187765, 0.61797347004941017, -0.044395094277671403, -0.43727283330478151, 0.064067265719269045, 0.98450685108739822, 1.1680212024537535, -1.0558844683361719, -1.5261742763882244, 2.813195259388213, 2.9516513032863356, -0.85872517244177815, 1.2343577579270646, -1.1681626968077381, -2.8717730703729356, 0.024916786279243767, 3.1701479989789867, -0.070769892332079906, -1.5465072446477184, -0.73094055491799181, 0.28975660783972312, 0.45136614923079016, -0.016338923407765823, -0.24231535965414835, 0.027529920247752079, 0.19963817528636058, 0.22718444978554045, 0.37902224678366964, -0.13876096422777742, 0.066961883917898354, -1.213012564057544, -0.55256449500031835, 0.30546257655082465, 0.36919608239644353, -0.1941382585399454, -0.14740895498043313, -0.092847927772733041, -0.32927583863381676, -0.68437532895441289, 0.49021233060315311, 3.0170447718709372, 1.1591938584292596, -2.0331393954447532, 0.25345561236901532, 2.0269883277253808, 0.6337650914909212, -2.5537641666010331, -3.0736342072317178, 0.60857711312874962, 1.4137393979172737, 0.71981331903700019, 0.14542662300780379, -0.032262751173084109, -0.026106440237006333, 0.15279475225563396, 0.47269360156783119, 0.11186355371520969, -0.63697851900908553, -1.0984488703050919, 0.41915906104063416, 0.68672569869418265, 0.0092385746333522867, 0.16931894270710687, 0.85445249002936896, 0.25108420491884997, -0.35168293029190173, 0.029936824487282226, 0.42730242898842274, -0.053915776695886201, -0.7361266762847285, -0.96305400340896929, 0.93093181995227892, 2.0122812700890154, -3.5314332372596846, -3.5895244227646144, 2.8187898937144658, 2.0152106388329991, 0.58898161413145356, -0.033608374945749073, 2.3400266438502024, 0.54200011692086181, 0.72364825206645078, 1.1960027291694086, 0.91562008950399532, -0.15452787333937676, -0.42993665457742386, 0.1534378810243246, 0.60512811669399758, 0.024322257871818742, -0.6834910062539612, -0.9769818787642004, -0.093485947527554653, -0.36088426941083557, -0.27220544444672085, 1.1189080727093528, 1.2148708003194422, 0.087452223817081023, -0.51443976319946561, 0.029355734210916126, 0.44502243372725681, 0.041300904967699399, -0.13502805229016995, -0.12851357573552075, 0.88880185549210555, 1.2207493971968146, -0.52148568567931763, -1.3363494489312078, 0.85611134878653028], \"bottom\": {\"real\": [10965.975170394304, 21271.915267962257, 3528.2703051611911, 4104.4756805864381, 1601.0616042188819, 1022.7399974894073, 557.80113750762041, 282.82230522781242, 145.15707521660474, 105.9441201571383, 59.012707266667213, 44.669628432443531, 36.50168205465414, 28.529134449096524, 21.777099980382825, 18.33532892478512, 16.253545459923078, 18.335328924785092, 21.777099980382847, 28.529134449096492, 36.50168205465414, 44.669628432443567, 59.012707266667277, 105.94412015713864, 145.15707521660474, 282.82230522781276, 557.80113750762041, 1022.7399974894074, 1601.0616042188824, 4104.4756805864426, 3528.2703051611911, 21271.91526796226, 12599.263825927621, 3215.125406898348, 5397.5422498759845, 1626.8549963375583, 805.20630634633005, 515.14459200644239, 359.3048107396736, 212.4360242127799, 110.43978615629422, 81.30134061470001, 50.82057050163526, 41.192651249931721, 32.936640633650484, 26.681133724080869, 18.01921088871573, 14.766368476202661, 15.422836018027418, 15.990808141800954, 20.022228188848842, 26.276495829612259, 35.717232769261116, 41.847677620126099, 54.320387908275151, 97.518896272497358, 133.8729941689642, 238.43595357759855, 456.937693043428, 711.66550404730731, 1144.8252089743219, 1902.8385884755523, 5206.768847980471, 3622.9684974910811, 13155.61342681755, 3416.7436429144991, 2812.4738667722154, 1400.147559944327, 383.1327908328127, 252.15177845425933, 197.2081578118225, 171.59960210222519, 82.275357677734092, 60.48297276194193, 40.777478884094478, 35.028553697203044, 28.877176436297923, 21.966647147933095, 16.371866219790679, 15.053935075225828, 14.23277610579999, 14.866315284596761, 18.218896084560566, 25.18211951926569, 33.821722307900131, 38.320413578940517, 45.570220260185515, 72.059479710744441, 97.660119608992957, 168.65094690401955, 268.62846926573025, 329.42984018623156, 467.75549674428515, 1002.4311488284067, 3554.1418329345079, 1764.397059903687, 4621.9583294760141, 1569.7087860062477, 1388.3341571422952, 628.37101334838883, 414.07061143445827, 168.53157442290524, 137.2795663029475, 102.11362429348972, 55.491719795512424, 49.073126751989768, 36.063389145893389, 30.634459542886617, 24.216782409074948, 18.667040937787934, 14.56741780053745, 12.905268434713205, 12.868626938575844, 13.095932326486089, 16.679039087380332, 21.80969609662603, 29.753917874884348, 36.827824955920349, 38.934743351431941, 57.668339838268878, 69.641961050084433, 131.28843074347486, 180.68252449032624, 169.44044949721729, 350.74973626382058, 497.02834719870827, 1746.1261590593115, 796.99783843130319, 3103.2479470123581, 1415.2337173839596, 752.81814346176623, 549.34301727365857, 201.53841636766998, 154.61036627522753, 104.58138455482165, 77.618781225118965, 49.392087964292358, 44.90232542624743, 31.105878831006294, 25.236762604525154, 19.175053589853054, 16.38453446468991, 12.823063914611339, 12.047936614807259, 11.554737628486025, 12.534926448772453, 14.323695266188452, 17.780247836887199, 24.191492945877869, 28.843093953252101, 32.767703049824149, 43.78366744373352, 51.550546699271386, 70.699184140809493, 109.08321361427502, 136.28687846912635, 199.77708080210388, 376.32680369835469, 796.83467383546451, 571.91471358300532, 984.41049770348889, 694.18752080971819, 999.69929532757897, 367.74073917398181, 338.97998181689366, 133.72435362068052, 109.5985079627268, 89.938945070024957, 49.039508255638331, 36.109063293014415, 25.98394571698211, 23.015774601871652, 16.882299112940213, 14.591336257090045, 11.32667094148311, 9.91803607895827, 9.6753965965616064, 10.57555888797221, 12.046190961831451, 14.768605661776913, 18.648763248771505, 21.576487249184964, 27.01336113453004, 36.908082411505312, 45.645009020283105, 60.837630874998482, 99.37203234809671, 111.28266970072299, 252.63182137130968, 273.92630278831501, 775.2357561437575, 815.85074837225181, 1655.1106419436521, 1107.4422783913506, 474.0637368651835, 355.64805874163005, 199.11678861892517, 123.46347336694488, 65.896409871808586, 68.918403190937497, 38.943190919202721, 28.774499596319636, 21.286505123099762, 17.663953414249985, 14.114074884510726, 11.879784189493673, 10.039166730615968, 8.3521719629346443, 8.4814596475391344, 9.0449476750100413, 9.8512979659284881, 12.153630271582001, 15.23168574488512, 19.437247877391961, 22.710514050850847, 28.755794586161894, 38.618352638886485, 59.942241598726909, 92.997872357952332, 88.111783673752711, 166.94308947555163, 243.79773811420219, 532.10468308026691, 428.26170612042944, 835.14389492248984, 575.84605817489046, 602.78945521124672, 339.57693755905132, 168.11833297683242, 117.99279203678798, 52.586639793255571, 42.047895128628383, 28.318592567301817, 25.001453363505657, 19.91641866758216, 16.823078359396845, 11.65888462925604, 10.364401595593858, 8.8573627978869887, 7.4173871264629518, 7.2681515499390361, 7.5915323421249861, 8.6807340620832107, 10.378269159275604, 12.701378035616356, 16.292785679101375, 18.804030398726262, 23.560923080173954, 30.503495373532754, 45.810504396910375, 65.229522054396952, 65.639482430818617, 177.29565831054776, 166.70872880265193, 491.9902921130938, 512.67235981711065, 747.45313809997936, 645.96141219737251, 307.54977114778814, 298.36000265745548, 105.95282903225828, 85.567113182097643, 44.672376324283228, 40.226583433899208, 25.615021546435344, 22.144491394300847, 16.131654569456256, 13.397071796412417, 10.408828566613494, 8.9591957313528034, 8.0604380452509936, 7.0442060411780956, 6.2883229388812003, 6.8496831982856676, 7.336687105800447, 8.4717730733339334, 9.9814777112217854, 13.121694879148574, 16.902165529440683, 20.643784740763845, 24.153222030769193, 29.725858725465727, 41.896421037553992, 52.630934346953957, 103.5859123323665, 116.76781276597193, 376.64744495733714, 306.93195832405218, 356.46238810538262, 374.90366628545218, 271.63698834940317, 203.15162979817489, 85.296077399229702, 77.649689466739304, 35.918272816149603, 33.069491090524735, 22.605820220395913, 17.296816509483932, 13.342699317421832, 11.640978884779956, 9.3586975241911539, 8.2623074625085575, 6.6065851632208821, 6.2827863632965242, 6.0744238279118932, 6.3582342010947102, 6.8252966967815532, 7.8556092062941403, 9.3209224203195777, 10.848369664421165, 14.056179340078513, 17.792540785133639, 21.540972163896267, 26.803938103683681, 40.50313838179877, 43.285550133972045, 91.691889335245591, 100.98276829758987, 225.59390630676836, 290.0678303886524, 373.60823131669014, 414.22422969876749, 141.37671573357548, 158.90321565708931, 63.837661879419102, 61.993039771960156, 32.588562049134531, 28.668162298507095, 18.426404144385732, 14.735821975464789, 11.992469004096597, 11.399293029930492, 8.7163999068023248, 7.2289667101344008, 6.5906881398505739, 5.7472695906024613, 5.6472990693532683, 5.8777570769595933, 6.4024098578192543, 7.4405650580225187, 8.4599769870087567, 10.256048021590846, 12.060831155359036, 13.785151925105749, 18.659998164390426, 22.921744826480442, 31.905227459883474, 34.302795951832735, 59.880411689763747, 69.971045180964353, 160.24793865518117, 163.52979203882799, 147.83029120770976, 178.6357867835558, 118.15132417284869, 114.19776495947795, 53.375296048832148, 57.177884093679019, 32.93952944330524, 24.968491799996325, 17.430516204833694, 13.433899198972929, 11.836714579435053, 10.548598460428181, 8.0486546171077791, 7.1187881891372964, 6.4594660557219088, 5.8159952878399759, 5.4767794038379067, 5.3908701504578147, 5.8976209996629629, 7.1301831132348088, 7.5675834428185693, 8.7517061416953652, 11.338462673842365, 13.133124938105077, 16.059093761394507, 18.849097825959038, 29.651622179353478, 34.09934210997649, 58.700399360289651, 65.261681531847529, 99.214909240790846, 146.35353694510258, 121.37679122991287, 165.76624382852509, 77.65397407030467, 91.338453331354174, 44.07807549608674, 44.566220734037245, 27.026614222359569, 22.147051076612073, 15.399396116974053, 12.432895564123392, 10.640074418564296, 9.3276298749700732, 7.5791206500207364, 6.7828789822837923, 6.1816087593787632, 5.6692811710818027, 5.1651813219751155, 5.3317492648801608, 5.5981461093243494, 6.4057146645582934, 7.2505243651475348, 8.4209913018587468, 10.969854167863348, 12.153630713859068, 14.766764339656312, 18.099354774134348, 25.326013884328763, 29.785949829841531, 46.424831391908171, 52.615859887304801, 82.573269999379406, 99.676304070074508, 86.640078828927244, 116.36860702141186, 64.2413414100685, 71.742693053970697, 38.10988368760168, 36.926827145978287, 25.897290737678322, 19.275080383374728, 14.749844663752917, 11.485010388879966, 9.4576647539678333, 8.8927162237613455, 7.4395778659669922, 6.0444335480941538, 5.7182084691628248, 5.0557935120943966, 5.0760457790692417, 5.2089717500439345, 5.7735220000474632, 5.9406732653680434, 6.7459275777069596, 7.820577383583708, 9.9835305123253484, 11.402400865496325, 14.118008059701465, 15.687873342054864, 23.860535436216686, 29.003043185839516, 40.145342185017675, 49.33744888297236, 59.017178205425914, 84.300643063132256, 70.160964533004119, 106.14414492511058, 57.343364605572859, 60.092652172041127, 35.035164226891368, 31.196728233049463, 22.848135981998073, 17.280291997569737, 14.215425049471765, 11.487894696175578, 9.2019617459917757, 8.157670273889595, 7.4731544987863776, 6.0230042880637562, 5.6300019663774918, 5.2449852175850884, 4.8944187843316493, 5.1794885290485126, 5.4428139254674495, 5.9866966335497871, 6.4988534667021369, 7.0161059288776793, 9.1662091602334215, 10.540688253938185, 13.221652899667433, 17.448751090247555, 21.405199921620568, 24.443644233674171, 34.565403798719835, 43.064932290411342, 53.896764023490427, 75.330615249002037, 57.139048850516261, 75.071278816121492, 44.304162032217924, 48.091094532561691, 33.4913106785217, 27.211025020176507, 22.453521092970409, 17.428281520682297, 14.160857290751922, 10.592079486422294, 9.2001673028330426, 7.5661166243087798, 6.5335689847346243, 5.8073593275643729, 5.7880621018967249, 5.3539074945975891, 5.3978132668570558, 5.2447316758230391, 5.4735425621066245, 5.861789820088422, 6.5375806061336013, 7.5634600669075329, 8.8416380446398435, 10.50698673124036, 13.949036764622399, 16.252252028090993, 22.019876112374043, 25.162704768394917, 31.578176229468394, 41.771493186860923, 42.955938687991988, 69.858651906447136, 50.780163528630226, 74.077510216304077, 43.697387961361706, 40.315818737884314, 29.770652812772006, 26.340522851312056, 22.034594395520614, 16.748599325796118, 12.845516284546591, 10.52499564475608, 9.2455018617556028, 7.4871364359448869, 6.8277975203922185, 5.6646016980044793, 5.288115481792067, 5.2498383547683662, 5.1849512003341403, 5.2498383547683662, 5.2881154817920599, 5.6646016980044767, 6.8277975203922212, 7.4871364359448904, 9.2455018617556082, 10.52499564475608, 12.845516284546591, 16.748599325796118, 22.034594395520603, 26.340522851312063, 29.770652812772006, 40.315818737884321, 43.697387961361706, 74.077510216304077, 57.139048850516232, 69.858651906447136, 42.955938687991953, 41.771493186860937, 31.578176229468383, 25.162704768394924, 22.019876112374046, 16.252252028090997, 13.949036764622383, 10.506986731240358, 8.8416380446398382, 7.5634600669075285, 6.5375806061335977, 5.8617898200884238, 5.4735425621066245, 5.2447316758230373, 5.3978132668570558, 5.3539074945975873, 5.7880621018967231, 5.807359327564372, 6.5335689847346252, 7.5661166243087798, 9.2001673028330391, 10.592079486422293, 14.16085729075192, 17.428281520682305, 22.453521092970401, 27.211025020176521, 33.491310678521693, 48.091094532561655, 44.304162032217938, 75.071278816121534, 70.160964533004076, 75.330615249002022, 53.89676402349037, 43.064932290411342, 34.565403798719814, 24.443644233674185, 21.405199921620568, 17.448751090247544, 13.221652899667435, 10.540688253938189, 9.1662091602334179, 7.0161059288776801, 6.4988534667021369, 5.9866966335497871, 5.4428139254674504, 5.17948852904851, 4.8944187843316449, 5.2449852175850866, 5.6300019663774892, 6.0230042880637509, 7.4731544987863758, 8.157670273889595, 9.2019617459917793, 11.487894696175564, 14.215425049471762, 17.280291997569748, 22.84813598199807, 31.19672823304948, 35.035164226891382, 60.092652172041191, 57.343364605572894, 106.14414492511065, 86.640078828927187, 84.30064306313227, 59.017178205425857, 49.337448882972346, 40.145342185017682, 29.003043185839513, 23.860535436216686, 15.687873342054866, 14.118008059701463, 11.402400865496327, 9.9835305123253519, 7.8205773835837116, 6.7459275777069578, 5.9406732653680443, 5.7735220000474641, 5.2089717500439328, 5.0760457790692435, 5.0557935120943975, 5.7182084691628221, 6.0444335480941556, 7.4395778659669922, 8.8927162237613491, 9.4576647539678262, 11.485010388879974, 14.749844663752919, 19.275080383374736, 25.897290737678308, 36.92682714597828, 38.109883687601666, 71.742693053970726, 64.241341410068529, 116.36860702141172, 121.37679122991284, 99.676304070074451, 82.57326999937942, 52.615859887304801, 46.424831391908185, 29.785949829841556, 25.32601388432877, 18.099354774134348, 14.766764339656312, 12.153630713859069, 10.96985416786335, 8.4209913018587539, 7.250524365147534, 6.4057146645582961, 5.5981461093243476, 5.3317492648801599, 5.1651813219751173, 5.6692811710818027, 6.1816087593787605, 6.7828789822837923, 7.5791206500207382, 9.3276298749700803, 10.640074418564305, 12.432895564123386, 15.399396116974053, 22.147051076612065, 27.026614222359573, 44.566220734037259, 44.078075496086726, 91.338453331354202, 77.653974070304727, 165.76624382852506, 147.83029120770976, 146.35353694510263, 99.214909240790945, 65.261681531847557, 58.700399360289673, 34.099342109976497, 29.651622179353467, 18.849097825959049, 16.059093761394511, 13.133124938105075, 11.338462673842358, 8.7517061416953563, 7.5675834428185675, 7.1301831132348097, 5.8976209996629647, 5.3908701504578165, 5.4767794038379076, 5.8159952878399785, 6.4594660557219132, 7.1187881891372955, 8.0486546171077809, 10.548598460428188, 11.836714579435059, 13.433899198972929, 17.430516204833697, 24.968491799996333, 32.93952944330524, 57.177884093679054, 53.375296048832141, 114.19776495947798, 118.15132417284869, 178.63578678355586, 373.60823131669019, 163.52979203882796, 160.24793865518112, 69.971045180964367, 59.880411689763726, 34.302795951832763, 31.905227459883484, 22.921744826480438, 18.659998164390412, 13.785151925105746, 12.060831155359033, 10.256048021590846, 8.4599769870087602, 7.4405650580225213, 6.4024098578192588, 5.8777570769595933, 5.6472990693532674, 5.7472695906024622, 6.5906881398505668, 7.2289667101344008, 8.7163999068023195, 11.399293029930499, 11.992469004096606, 14.735821975464788, 18.426404144385724, 28.66816229850712, 32.588562049134516, 61.993039771960206, 63.837661879419088, 158.90321565708933, 141.37671573357554, 414.22422969876766, 356.46238810538273, 290.06783038865245, 225.59390630676842, 100.98276829758977, 91.691889335245619, 43.285550133972016, 40.503138381798749, 26.803938103683674, 21.540972163896271, 17.792540785133639, 14.056179340078506, 10.84836966442117, 9.3209224203195813, 7.8556092062941412, 6.8252966967815567, 6.3582342010947119, 6.0744238279118923, 6.2827863632965206, 6.606585163220883, 8.2623074625085593, 9.3586975241911592, 11.640978884779955, 13.342699317421838, 17.296816509483932, 22.60582022039592, 33.069491090524764, 35.918272816149603, 77.649689466739304, 85.296077399229731, 203.15162979817504, 271.63698834940351, 374.90366628545223, 747.45313809997936, 306.93195832405206, 376.64744495733714, 116.76781276597193, 103.58591233236646, 52.630934346953964, 41.896421037553985, 29.725858725465734, 24.153222030769193, 20.643784740763849, 16.902165529440701, 13.121694879148574, 9.9814777112217961, 8.4717730733339316, 7.3366871058004506, 6.8496831982856659, 6.2883229388812003, 7.0442060411780965, 8.0604380452509936, 8.9591957313528034, 10.40882856661349, 13.397071796412414, 16.131654569456249, 22.144491394300825, 25.615021546435344, 40.226583433899208, 44.672376324283235, 85.567113182097643, 105.95282903225828, 298.36000265745565, 307.54977114778819, 645.9614121973724, 835.14389492248984, 512.67235981711053, 491.99029211309386, 166.70872880265185, 177.29565831054779, 65.639482430818575, 65.229522054396938, 45.810504396910396, 30.503495373532761, 23.560923080173971, 18.804030398726255, 16.292785679101371, 12.701378035616358, 10.378269159275604, 8.6807340620832214, 7.5915323421249852, 7.2681515499390352, 7.4173871264629581, 8.8573627978869904, 10.364401595593863, 11.65888462925604, 16.823078359396849, 19.91641866758215, 25.001453363505686, 28.31859256730182, 42.047895128628411, 52.5866397932556, 117.99279203678799, 168.11833297683248, 339.57693755905132, 602.78945521124683, 575.84605817489012, 1655.110641943653, 428.26170612042955, 532.10468308026725, 243.7977381142021, 166.94308947555166, 88.111783673752683, 92.997872357952346, 59.942241598726952, 38.618352638886499, 28.755794586161898, 22.71051405085084, 19.437247877391968, 15.231685744885109, 12.153630271581999, 9.8512979659284898, 9.0449476750100377, 8.4814596475391344, 8.3521719629346407, 10.039166730615969, 11.879784189493675, 14.114074884510734, 17.663953414249978, 21.286505123099776, 28.774499596319639, 38.943190919202728, 68.918403190937497, 65.896409871808544, 123.46347336694488, 199.11678861892523, 355.64805874163045, 474.06373686518356, 1107.4422783913496, 984.41049770348843, 815.85074837225181, 775.23575614375761, 273.92630278831501, 252.63182137130985, 111.28266970072293, 99.372032348096738, 60.83763087499851, 45.645009020283112, 36.908082411505283, 27.013361134530022, 21.576487249184932, 18.648763248771502, 14.768605661776908, 12.046190961831442, 10.575558887972219, 9.6753965965616082, 9.9180360789582664, 11.326670941483108, 14.591336257090044, 16.88229911294021, 23.015774601871662, 25.983945716982106, 36.109063293014408, 49.03950825563831, 89.938945070024914, 109.59850796272681, 133.72435362068057, 338.97998181689348, 367.74073917398209, 999.69929532757897, 694.18752080971819, 3103.247947012359, 571.91471358300578, 796.83467383546474, 376.32680369835435, 199.77708080210391, 136.28687846912629, 109.08321361427504, 70.699184140809436, 51.550546699271379, 43.783667443733499, 32.767703049824149, 28.843093953252076, 24.191492945877858, 17.780247836887195, 14.323695266188444, 12.534926448772453, 11.554737628486032, 12.047936614807259, 12.823063914611335, 16.384534464689928, 19.175053589853043, 25.236762604525165, 31.105878831006304, 44.902325426247451, 49.392087964292365, 77.618781225119008, 104.58138455482161, 154.6103662752277, 201.53841636767004, 549.34301727365869, 752.81814346176634, 1415.2337173839583, 4621.9583294760132, 796.99783843130297, 1746.1261590593119, 497.02834719870856, 350.74973626382069, 169.44044949721726, 180.68252449032624, 131.28843074347478, 69.641961050084447, 57.668339838268842, 38.934743351431905, 36.827824955920356, 29.753917874884323, 21.80969609662602, 16.679039087380357, 13.095932326486084, 12.868626938575838, 12.905268434713202, 14.567417800537427, 18.667040937787927, 24.216782409074952, 30.634459542886628, 36.063389145893439, 49.07312675198979, 55.491719795512452, 102.11362429348968, 137.27956630294753, 168.53157442290532, 414.07061143445821, 628.37101334838928, 1388.3341571422957, 1569.7087860062475, 13155.613426817548, 1764.3970599036886, 3554.1418329345083, 1002.4311488284069, 467.75549674428527, 329.4298401862315, 268.62846926573025, 168.65094690401969, 97.660119608993, 72.05947971074437, 45.570220260185501, 38.320413578940503, 33.821722307900103, 25.182119519265683, 18.218896084560566, 14.866315284596766, 14.232776105799996, 15.053935075225828, 16.371866219790657, 21.966647147933109, 28.877176436297923, 35.028553697203037, 40.777478884094542, 60.482972761941951, 82.275357677734107, 171.59960210222522, 197.20815781182262, 252.15177845425956, 383.13279083281282, 1400.1475599443277, 2812.4738667722154, 3416.7436429144982, 12599.263825927617, 3622.9684974910801, 5206.7688479804747, 1902.8385884755519, 1144.8252089743219, 711.66550404730719, 456.93769304342817, 238.43595357759864, 133.8729941689642, 97.518896272497358, 54.320387908275166, 41.847677620126085, 35.71723276926113, 26.276495829612255, 20.022228188848846, 15.990808141800953, 15.422836018027411, 14.766368476202668, 18.019210888715723, 26.681133724080873, 32.936640633650477, 41.192651249931764, 50.820570501635224, 81.30134061470001, 110.43978615629425, 212.43602421277993, 359.3048107396736, 515.14459200644205, 805.20630634633051, 1626.8549963375588, 5397.5422498759854, 3215.125406898349], \"imag\": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, \"imag\": [0.0, -0.14902020441330027, -0.67710495110878655, -0.6881801226004951, 0.029443579937724847, -0.20094871849937471, -0.68791245552521774, -0.72827812731264463, 0.078068344484514218, 0.41313375345763731, -0.11919960000393952, -0.71935556472958995, -0.033994075615829664, 0.79310271815610678, 1.0485412757882202, 0.31963459583846549, 0.0, -0.31963459583845072, -1.0485412757882226, -0.79310271815610678, 0.033994075615829379, 0.71935556472959095, 0.11919960000393916, -0.41313375345763476, -0.078068344484514218, 0.72827812731264185, 0.68791245552521862, 0.20094871849937485, -0.029443579937724836, 0.68818012260049433, 0.67710495110878632, 0.14902020441330027, 1.1657398208090677, -0.38761332589064507, -2.5163414932492363, -2.5847428019012222, 1.7065268205659907, -0.26659947141883028, -1.7612103334384195, -0.72822101015527074, 0.12179041297535136, 0.18687402270680736, -0.12109853545440831, -0.38401966930786352, -0.088335680660082488, 0.055468788382486998, -0.088649319780239585, 0.10356786689233256, 1.1808955745571665, -0.062779809082666185, -0.91400202990551882, -0.6085517196782837, 0.0094930924522060312, 0.20081299805530148, -0.06803304935655391, 0.012577652358335469, 0.033553295747053846, -0.13629795514777901, -0.55322476205333171, 0.16665348831683371, 1.6347625123407883, -1.2112325279336729, -2.7678867797785314, -1.1631005581009268, 0.53321212268228979, 0.65777424026102749, -0.0059595089834900304, 0.64333558032637317, -0.013400706408967681, -1.6693935905986217, -0.063469706678883048, 0.54580806133266158, -0.065590467240471795, -0.42286579957171455, -0.20235216162881253, 0.49440559267811185, 0.3198533678523926, -1.0020973416135801, -0.94614545335921363, -0.32112572063647837, 0.67188974240307031, 0.12355783613973209, 0.29355063118446922, 0.63795269671082688, 0.21171161290294277, -0.40654495049723688, -0.14885884441008196, 0.40518645419156046, 0.25176669622887876, -0.4761471503847452, -1.2694305395629708, -0.50115245917544937, 1.7379359185439549, -1.5104148448809891, -1.8127000456147733, 1.3511857905116147, -2.2248814745809709, -2.9260010474168467, 2.8988227737472689, 2.4923883909800804, -1.3958450829260902, -0.082278705724815937, 2.2133069351689647, 1.0491520212286578, -0.079840002578371538, -0.49590260672839781, -0.029646930580498103, 0.78872177906031093, 0.19612727406574681, -0.75096042381039763, -0.61442756278477972, -0.34589242057405933, -0.55827984508264517, -0.057639041847566158, 0.56000672509604699, 1.1779553213485192, 0.34297063731481625, -0.31700999971207366, -0.056952598408498582, 0.1857688253715537, 0.059515398961152523, -0.23070889488422375, -0.067289667533411021, -0.45052222849242474, -0.042895027980831071, 1.6598740406764962, 1.7912379411122816, -0.11630227482832883, -2.003866342355487, -2.7192489258221713, 0.9217002223108024, 0.99386370915341038, -0.45711185122492165, 0.97539351588020684, 0.30440417133895387, -0.076378287793857885, 0.10477257582077601, 0.078900323673397929, 0.2630152461937153, 0.031794382449249342, -0.11240615902951592, 0.23783868068434, 0.44775143101136344, -0.20105686300455952, -1.0552137607230396, -0.51401383512929344, 0.054526011609804782, -0.026488236207787865, 0.16590740229872669, 0.18522424653870803, 0.046314810086569159, -0.24537254610227913, -0.28481464669570439, 0.34829742340973674, 1.0879631977925206, 1.2627265059936403, -0.49634217295171235, 1.3751434251570953, 2.5572924798905374, -2.3835279088157275, -0.34512363817546704, 0.04627556386614428, -0.28363975810469, -0.2387205493926067, 1.1836766662488489, 0.7304559467631897, -1.0994633527727609, -0.56900890379210023, -0.052741079187555495, 0.36596287984784248, 0.15532358639646346, -0.36091327743771645, -0.19067540763230895, 0.71462283256924886, 0.60857599156682896, 0.051411148277875428, -0.20391538842359699, -0.25954108900834599, -0.53918948446164328, -0.5935512086649235, -0.13740024164207204, 0.43579638717256186, 0.22502803407041108, -0.23772213393956157, -0.22688331070114534, 0.42727537166712742, 0.47834844059991255, 0.32734133863952164, -0.52361461628388295, -0.20363203779578987, 0.71022032181918715, 0.2819659388244356, 1.3792526471429849, 1.5283654352438392, -1.3044681939973228, -1.1436891608956035, 1.3490121369222494, 0.71922211831958782, -0.27032254521482335, -0.33653973458463504, -0.15391447881479364, 0.12480482561109964, -0.053989084045087433, -0.18576918773324888, 0.077197958779916712, 0.29699641531309923, -0.11903191000719174, 0.22681336512596068, 0.54520489108855463, 0.040990511598931259, -0.20653728920388259, -0.37081845053148882, -0.07530964105542165, 0.12159159821884764, 0.14350417348960001, 0.043165763689791151, -0.057977138737883523, -0.1379293882828701, -0.37919334928832643, -0.48456288814685777, 0.97887759552535047, 0.57420771517448999, -1.1922323352837048, -0.13841464698630696, 0.7604729654567205, 0.58367944495087776, -0.034817975520708581, 0.18370340800622625, -0.031292542572728878, -0.067318712633041858, 0.33696607725615524, 0.05414244352918586, -0.020415046981723958, -0.074435708294427722, -0.05732302224609874, 0.14754486034992467, 0.17049224676424324, -0.35431714454113261, -0.378008901790788, -0.088220333609354634, 0.20519624064542319, 0.17151350221764664, 0.17699487940227424, 0.19591419189057305, 0.0065199157977709234, -0.1674811218328473, -0.10967941676700359, 0.13440132102674274, 0.069755270915603892, -0.34407110156451998, -0.47647271020395277, 0.24778628953900186, 0.94881647182464612, 0.71445852536721188, -0.69300717410155177, -0.23252823659006602, -0.70126327582172698, -0.73508712834563017, 0.77441038277434426, 0.80063078785779984, -0.29211349969120898, -0.50261897876845574, -0.15844491832687652, 0.10672884533820617, 0.083096171746834438, -0.061219034404081496, 0.041606427790415887, 0.31036717878062553, 0.16259404663751506, -0.36128817330809687, -0.29370929634970039, -0.3179547262684097, -0.4515155411552858, -0.033181026716305836, 0.29522952049075729, 0.48699666134020275, 0.18589909016841552, -0.2294714118021266, -0.20114354017885722, -0.003121578634498275, 0.059620355744470117, -0.08629332168254554, -0.013702104296225414, 0.27636362870999703, -0.20367519268137141, -0.071823375624897781, 0.65390853098071755, 0.57936885621079115, -0.082507324096629489, 0.056565164700343597, 0.30313037910422419, 0.046580925466156033, -0.14205860955679683, -0.10567626674414661, -0.14942985439330783, 0.021649684970292335, 0.030697590171757046, -0.022837521893794246, 0.043322807027412293, 0.15694334998636744, 0.01091806619852779, 0.020198601252688204, 0.29902161442575942, -0.15020855085379564, -0.40608170156430695, -0.21661403238492213, 0.10933934038264595, 0.1999075728830931, 0.14959651238129035, 0.047092746667091859, -0.040888308386862755, -0.1125167716796989, -0.043845680385689492, 0.15335701874304222, 0.24380570184994388, -0.1171131305850218, -0.57195255260213129, -0.37275928254301222, 0.52232110568095647, 0.45087452742355255, 0.45399067647357039, 0.4510373698265433, -0.25445646061023242, -0.54674967268083918, -0.081775771006690631, 0.2737673334004137, 0.18625608494518781, 0.012289477611188196, -0.028787447589128854, -0.055397340673381909, -0.033006645910307206, -0.3893684484392882, -0.59052876986306613, 0.35206862979259157, 0.75972882974271683, 0.47741066022580114, 0.61795462873852247, -0.010739694431020583, -0.30365007670052568, -0.79734464193821375, -0.40014152475128489, 0.35743197872152449, 0.33543159046029042, -0.048324103015847428, -0.1196515677085014, 0.073496444899392971, 0.11953255023805801, -0.055918533770930395, 0.0274579890256498, -0.087565507326424513, -0.47798364115462866, -0.30556827592707503, -0.053529165520136063, -0.064762544527802626, -0.40460920017095653, -0.121109915711457, 0.34242949885797147, 0.25707377311839885, 0.18878454879876447, 0.05963524828049447, -0.042881345638875606, 0.080317301592987653, -0.066661209183029674, -0.78426965250242053, -0.67203925142686172, 0.38802788881902983, 0.13118499909748943, 0.3117062095733994, 0.51892211454846937, 0.28497632977966614, -0.6374756986952439, -0.78570616426150541, -0.55004558199035003, 0.081464209729413414, 0.32078878775035424, 0.10057675741278467, -0.038856958620208222, -0.093816614253325048, -0.12197711394968046, 0.10773217761141921, 0.53279302352225322, 0.49767840692700166, -0.40074591616539607, -0.4686202607911239, -0.47347988353308479, -0.38787976346044234, 0.0026864061776988978, 0.3750647268903417, 0.15775363291879776, -0.12070461118398887, 0.046341940929038844, 0.069762555352500089, 0.036760253935025015, 0.11153094686031426, -0.23193620085952527, -0.025338164060148199, 0.83717158631584143, 0.14069991818818439, -0.80636013277763063, -1.117979830240589, -0.53116916718597551, -0.29647728355917563, 0.43255465109120794, 1.0682488929022527, 0.7439367652619796, -0.27653752308302104, -0.43736635010141273, -0.051946126514290911, 0.075483221784175089, 0.041517261114611535, 0.089698476442270109, 0.18582746405096062, 0.11108661545235869, 0.17635934890910801, 0.26257982919312395, 0.014915731745956722, -0.051592883258874553, -0.15702165108916452, 0.26018009521205254, 0.10187767444835746, -0.5266864552492494, -0.19184365339748963, 0.12365061867406398, -0.0040460672180273232, -0.10695443147688474, -0.38062982787546124, -0.23013531228214942, 1.4911852257492946, 1.8656257067805557, -0.31189832297292175, -1.8409665915911073, -1.3523062385443718, -0.59758078449912422, -0.4109826389978809, 0.64471434504327652, 1.2836469730056959, 1.499792380953558, -0.050007892106663135, -0.70097924672910039, -0.37676357011449496, 0.039596089571393787, 0.16672200998370845, 0.27616851123315678, 0.25535752279806784, -0.25821883180569144, -0.71643423075370694, -0.2869241470876478, 0.19246225810939122, -0.48949334565382685, -0.6758600491934259, -0.60078389394518394, -0.1042403296189125, 0.33526929000920908, 0.41773479752161374, -0.015233071039077716, -0.23129559015563347, -0.27890178606409965, -0.36644166250128341, 0.53421537629701843, 1.5124695265818406, 0.46952715514837384, -1.6086255934377758, -0.58627286749798335, 0.2521262787687128, 0.81274320419200763, 1.0066444599512538, 0.13589799436620603, -0.52681222515518755, -0.80035014449929209, 0.17170214273365031, 0.32102965848797577, 0.015298055895547559, -0.0095152173876638588, -0.05852775349790857, -0.29325388964527122, -0.23187846370788526, 0.12261389073580377, 0.13365949638292357, 0.34550584055022809, 0.32834338818238823, -0.63681653846377151, -0.14332768166025622, -0.050699039849278892, 0.076799367032860139, 0.62304231858822723, 0.13934878438080031, -0.36565795334395523, -0.22525673769874993, 0.058882171297733404, 0.45328032825037023, 0.67278513933730488, -0.62930489911730125, -2.1514876673114358, -0.38381606543972158, 1.7701780351745315, 2.2434589636984619, 1.3655631816809142, 0.67716955795129208, 0.23622587273603302, -1.2645365769339125, -1.1592659817915987, 0.22681074823924935, 1.0532421029439241, 0.47375681144418214, -0.017283859373080118, -0.31852036401253409, -0.42276437548587065, -0.20851072339742521, 0.32537663103197029, 0.67802433082994906, 0.64221455700256691, -0.19334381074242141, 0.0, 0.98534755955725073, 0.93082832187418163, 0.090975734109736334, -0.23547278252877649, -0.42043029453907255, -0.16156648245217306, 0.14891910968678568, 0.27252999755409263, 0.21807537509429559, -0.1793267317851967, -1.3886930910143056, -1.2475969582391058, 0.82617687521947225, 1.688041333210945, 0.93307675660552747, 0.0, -0.93307675660552858, -1.688041333210949, -0.82617687521947558, 1.2475969582391047, 1.3886930910143054, 0.17932673178519704, -0.21807537509429575, -0.27252999755409263, -0.14891910968678598, 0.16156648245217331, 0.42043029453907194, 0.23547278252877635, -0.090975734109735945, -0.93082832187418285, -0.9853475595572504, 0.63681653846377428, 0.19334381074242313, -0.64221455700256724, -0.67802433082995051, -0.32537663103196973, 0.20851072339742566, 0.42276437548587059, 0.31852036401253342, 0.017283859373080232, -0.47375681144418219, -1.0532421029439241, -0.22681074823925124, 1.1592659817916007, 1.2645365769339141, -0.23622587273603313, -0.67716955795129263, -1.3655631816809146, -2.2434589636984619, -1.7701780351745346, 0.38381606543971747, 2.1514876673114336, 0.62930489911730425, -0.67278513933730544, -0.45328032825037173, -0.058882171297733529, 0.22525673769874915, 0.36565795334395551, -0.1393487843807989, -0.6230423185882269, -0.076799367032859514, 0.050699039849279363, 0.14332768166025514, 0.48949334565382807, -0.32834338818238801, -0.34550584055022948, -0.13365949638292388, -0.12261389073580344, 0.23187846370788381, 0.29325388964527066, 0.058527753497908265, 0.0095152173876637894, -0.015298055895547204, -0.32102965848797627, -0.17170214273365259, 0.80035014449929354, 0.52681222515519222, -0.13589799436620179, -1.0066444599512541, -0.81274320419201052, -0.25212627876871579, 0.5862728674979838, 1.6086255934377784, -0.46952715514837307, -1.5124695265818422, -0.53421537629701898, 0.36644166250128374, 0.27890178606409988, 0.23129559015563281, 0.01523307103907798, -0.41773479752161302, -0.33526929000920919, 0.1042403296189123, 0.6007838939451835, 0.67586004919342602, 0.051592883258874796, -0.19246225810939102, 0.28692414708764713, 0.71643423075370816, 0.25821883180569155, -0.25535752279806728, -0.27616851123315733, -0.16672200998370851, -0.039596089571393857, 0.37676357011449418, 0.70097924672910006, 0.05000789210666385, -1.4997923809535563, -1.2836469730056956, -0.64471434504327885, 0.41098263899788057, 0.59758078449912211, 1.352306238544366, 1.8409665915911118, 0.31189832297292347, -1.8656257067805575, -1.4911852257492944, 0.23013531228214901, 0.3806298278754614, 0.10695443147688473, 0.0040460672180278982, -0.12365061867406386, 0.19184365339748918, 0.52668645524924984, -0.10187767444835667, -0.26018009521205249, 0.15702165108916435, 0.47347988353308512, -0.014915731745956694, -0.26257982919312345, -0.17635934890910804, -0.11108661545235819, -0.18582746405096062, -0.089698476442269984, -0.041517261114611431, -0.075483221784175006, 0.051946126514290501, 0.43736635010141267, 0.27653752308302265, -0.74393676526197827, -1.068248892902254, -0.43255465109120911, 0.29647728355917641, 0.53116916718597607, 1.1179798302405872, 0.80636013277763019, -0.14069991818818398, -0.83717158631584188, 0.025338164060147935, 0.2319362008595256, -0.11153094686031419, -0.036760253935025175, -0.069762555352499631, -0.046341940929038775, 0.12070461118398874, -0.15775363291879749, -0.37506472689034165, -0.0026864061776987339, 0.38787976346044295, 0.053529165520136666, 0.46862026079112395, 0.40074591616539496, -0.49767840692700188, -0.53279302352225388, -0.1077321776114199, 0.12197711394968033, 0.093816614253324923, 0.038856958620208139, -0.10057675741278502, -0.32078878775035391, -0.081464209729413262, 0.55004558199034881, 0.78570616426150586, 0.63747569869524534, -0.28497632977966464, -0.51892211454846815, -0.31170620957339795, -0.13118499909748749, -0.38802788881902978, 0.67203925142686127, 0.78426965250242042, 0.06666120918302984, -0.080317301592987847, 0.042881345638875745, -0.05963524828049447, -0.18878454879876405, -0.25707377311839802, -0.34242949885797153, 0.12110991571145559, 0.40460920017095686, 0.064762544527803223, -0.45399067647357122, 0.30556827592707503, 0.47798364115462999, 0.087565507326423986, -0.027457989025650414, 0.055918533770930486, -0.11953255023805759, -0.073496444899393262, 0.11965156770850158, 0.048324103015847719, -0.33543159046028986, -0.35743197872152471, 0.40014152475128417, 0.79734464193821419, 0.30365007670052546, 0.010739694431020585, -0.61795462873852236, -0.4774106602258017, -0.75972882974271716, -0.35206862979259274, 0.59052876986306602, 0.38936844843928831, 0.033006645910306921, 0.055397340673381999, 0.028787447589128854, -0.012289477611188065, -0.18625608494518778, -0.2737673334004137, 0.08177577100669034, 0.54674967268084007, 0.25445646061023275, -0.45103736982654352, 0.082507324096629073, -0.45087452742355144, -0.52232110568095624, 0.37275928254301144, 0.5719525526021314, 0.11711313058502268, -0.24380570184994438, -0.15335701874304256, 0.043845680385689638, 0.11251677167969909, 0.040888308386862651, -0.047092746667091887, -0.14959651238128985, -0.19990757288309219, -0.10933934038264552, 0.21661403238492188, 0.40608170156430567, 0.15020855085379528, -0.29902161442575986, -0.020198601252688145, -0.010918066198527492, -0.15694334998636708, -0.043322807027412154, 0.022837521893794229, -0.030697590171757067, -0.02164968497029204, 0.14942985439330775, 0.10567626674414606, 0.14205860955679689, -0.0465809254661547, -0.30313037910422319, -0.05656516470034452, 0.70126327582172698, -0.57936885621079104, -0.65390853098071722, 0.071823375624897504, 0.20367519268137155, -0.2763636287099972, 0.013702104296225327, 0.086293321682545693, -0.059620355744470117, 0.0031215786344983188, 0.20114354017885719, 0.22947141180212641, -0.1858990901684156, -0.48699666134020314, -0.29522952049075735, 0.033181026716305816, 0.4515155411552858, 0.31795472626840998, 0.29370929634969961, 0.36128817330809659, -0.16259404663751492, -0.3103671787806257, -0.041606427790415977, 0.061219034404081517, -0.083096171746834438, -0.10672884533820629, 0.1584449183268766, 0.50261897876845563, 0.29211349969120898, -0.80063078785779973, -0.77441038277434415, 0.73508712834562984, -0.7604729654567195, 0.23252823659006566, 0.69300717410155133, -0.71445852536721133, -0.94881647182464579, -0.247786289539003, 0.47647271020395332, 0.34407110156452003, -0.06975527091560392, -0.13440132102674238, 0.10967941676700353, 0.16748112183284758, -0.0065199157977711844, -0.19591419189057413, -0.17699487940227479, -0.17151350221764519, -0.20519624064542319, 0.088220333609354384, 0.37800890179078739, 0.35431714454113228, -0.17049224676424349, -0.14754486034992517, 0.05732302224609858, 0.074435708294427874, 0.020415046981723993, -0.054142443529185957, -0.33696607725615474, 0.067318712633042552, 0.031292542572729155, -0.183703408006228, 0.034817975520707763, -0.58367944495087642, -1.3792526471429849, 0.1384146469863056, 1.1922323352837043, -0.57420771517448999, -0.97887759552535036, 0.48456288814685816, 0.37919334928832632, 0.13792938828286982, 0.057977138737883592, -0.043165763689791442, -0.14350417348959951, -0.12159159821884727, 0.0753096410554214, 0.37081845053148832, 0.20653728920388284, -0.040990511598931294, -0.5452048910885553, -0.22681336512596068, 0.11903191000719161, -0.29699641531309889, -0.077197958779916934, 0.18576918773324919, 0.053989084045087239, -0.12480482561109926, 0.15391447881479356, 0.33653973458463499, 0.27032254521482346, -0.71922211831958716, -1.3490121369222496, 1.143689160895601, 1.3044681939973219, -1.5283654352438407, 0.34512363817546499, -0.28196593882443538, -0.71022032181918571, 0.20363203779578934, 0.52361461628388117, -0.32734133863952108, -0.47834844059991177, -0.4272753716671272, 0.22688331070114495, 0.23772213393956154, -0.22502803407041136, -0.43579638717256142, 0.13740024164207254, 0.59355120866492272, 0.53918948446164539, 0.25954108900834527, 0.20391538842359649, -0.051411148277873762, -0.60857599156682773, -0.71462283256924997, 0.19067540763230911, 0.36091327743771712, -0.15532358639646357, -0.36596287984784226, 0.052741079187555578, 0.56900890379209967, 1.0994633527727615, -0.73045594676318792, -1.18367666624885, 0.23872054939260659, 0.28363975810469044, -0.046275563866146709, 2.0038663423554866, 2.3835279088157284, -2.5572924798905374, -1.3751434251570973, 0.49634217295171212, -1.2627265059936426, -1.0879631977925208, -0.34829742340973796, 0.28481464669570433, 0.24537254610228046, -0.046314810086569187, -0.18522424653870898, -0.16590740229872719, 0.026488236207788063, -0.054526011609805532, 0.514013835129293, 1.0552137607230383, 0.20105686300456052, -0.44775143101136289, -0.23783868068434011, 0.11240615902951644, -0.031794382449249259, -0.26301524619371552, -0.078900323673398332, -0.10477257582077593, 0.076378287793858177, -0.30440417133895292, -0.97539351588020617, 0.45711185122492154, -0.99386370915341027, -0.92170022231080229, 2.7192489258221721, 2.2248814745809713, 0.11630227482833386, -1.7912379411122841, -1.6598740406764991, 0.042895027980832189, 0.45052222849242363, 0.067289667533409939, 0.23070889488422444, -0.059515398961152315, -0.18576882537155384, 0.056952598408498437, 0.31700999971207372, -0.3429706373148162, -1.1779553213485197, -0.56000672509604887, 0.057639041847566339, 0.55827984508264517, 0.34589242057405939, 0.6144275627847795, 0.75096042381039751, -0.19612727406574634, -0.78872177906031049, 0.029646930580497943, 0.49590260672839631, 0.079840002578371469, -1.0491520212286569, -2.2133069351689625, 0.082278705724815757, 1.3958450829260909, -2.4923883909800781, -2.8988227737472685, 2.926001047416845, -0.53321212268228979, -1.3511857905116138, 1.8127000456147735, 1.5104148448809913, -1.7379359185439534, 0.50115245917545159, 1.2694305395629717, 0.47614715038474426, -0.25176669622887887, -0.40518645419156096, 0.14885884441008229, 0.4065449504972391, -0.21171161290294366, -0.63795269671082933, -0.29355063118447033, -0.12355783613972898, -0.67188974240307053, 0.32112572063647804, 0.94614545335921341, 1.0020973416135777, -0.3198533678523926, -0.49440559267811113, 0.20235216162881259, 0.42286579957171511, 0.065590467240471767, -0.54580806133266224, 0.063469706678882465, 1.6693935905986201, 0.013400706408968283, -0.64333558032637317, 0.0059595089834898612, -0.65777424026102704, -1.1657398208090681, 1.1631005581009257, 2.7678867797785287, 1.2112325279336758, -1.6347625123407896, -0.16665348831683333, 0.5532247620533326, 0.13629795514777876, -0.033553295747053943, -0.012577652358336237, 0.068033049356555603, -0.20081299805530076, -0.0094930924522065932, 0.60855171967828092, 0.91400202990551482, 0.062779809082669502, -1.1808955745571674, -0.10356786689233179, 0.08864931978023799, -0.055468788382486117, 0.088335680660082266, 0.38401966930786247, 0.12109853545440752, -0.18687402270680636, -0.12179041297535122, 0.72822101015526997, 1.7612103334384188, 0.26659947141883078, -1.7065268205659894, 2.5847428019012186, 2.5163414932492363, 0.3876133258906464], \"height\": 32, \"width\": 32, \"top\": {\"real\": [28423.105313214044, 28674.724231095144, -722.69366896540907, 9225.7770064733304, 1497.6465357448014, 760.04278979701394, 247.10162746021342, 151.72529893327805, -4.8884885781823266, -16.133735393751934, -0.18360891080128469, 2.3500990684470797, -0.33005469194377962, 4.1571470713537551, 9.5943595112319517, -8.8624203891274274, -22.052590313243808, -8.8624203891274416, 9.5943595112320637, 4.1571470713537408, -0.33005469194377934, 2.3500990684471894, -0.18360891080150321, -16.133735393751511, -4.8884885781823266, 151.72529893327811, 247.10162746021339, 760.04278979701553, 1497.6465357448021, 9225.777006473334, -722.69366896540839, 28674.724231095115, 25390.170503473099, 2752.5053486176007, -7213.0026112046817, -848.38159326591301, 982.95511309135748, 457.86146922204989, -46.175546007130123, -28.684822585718617, 4.5612631126941601, 36.180920465642473, 1.491875160093084, -21.191137754573024, 2.8803824684767365, 32.414130280804258, 20.161840527236397, -4.0194858939287581, -5.5658589086089485, -1.4949158508676244, -19.561354112987054, -17.959748575409641, 0.86872374588173218, 25.323206346284437, 8.3348052170650675, -41.926948021480371, -20.687109086504861, 218.3167491556907, 546.49872794031398, 514.9954980598236, 620.49539711803413, 4452.6929959791041, -174.99103969876961, 2133.8618335997025, 26666.274860226469, 9631.0824500605449, -10095.4436331661, -4944.5276302554494, 770.97093894980139, 234.73611402062764, -189.92210588558362, -126.31904474729288, -4.4359398121268772, 25.844521173618485, 1.2207482283869857, -12.318944408119624, 7.2506028858091991, 18.769456353148023, 2.7720670784771717, 0.13907690271807935, 9.7740131156133714, 6.2313507558256029, -20.012525822291419, -16.040469196891664, 3.7834180501306807, 18.113814308198215, 6.9628905148897537, -1.8812165005783674, -3.1507841384785769, 24.526337675319898, 193.3623500499944, 465.72794392086701, 284.66528985874095, -3081.1066694335791, -9076.4400559658607, 1118.2132640961638, 5705.1501208043383, 397.85150159824235, -2822.6768689275941, 728.40381948841912, 1249.2695734137342, 82.616255878071726, -93.950748347298983, -33.623549275177439, -5.1522911915584819, -7.2338183321331133, -7.001283565832134, 11.310122449566075, 7.3973207504467258, -10.314744048939033, -17.670460817927417, 0.86416108685457238, -1.7856630822843305, 4.9636496941116963, 3.7892183180180301, 4.3540479322804604, 0.81912298615372481, -8.9239476494738241, -0.63615178952006057, 26.029536485331942, 20.179218397178587, -95.964038421947748, -279.42683310552798, -11.991282367617261, 1111.9285745591587, 12.384349101876612, -5014.4780810602624, -931.02314429185174, -2935.685284408914, -1215.2968180059599, 2222.0566542865231, 1545.4091719722733, -307.58274676435752, -163.25068439377958, 122.1532745420013, 76.416221889183532, 3.1644160240378296, -19.634567061108559, -1.3809484232923637, 15.595649759531634, 4.7705608814238305, -10.468288519634084, -9.7282165445191495, -3.892040076973144, -8.4797405266260863, -0.5408298481218079, 13.233921729082965, 15.992639239497516, 3.5976801907925586, -15.812600063085762, -8.7583525837485485, 13.529650759569922, 11.041451779488147, -36.837920974757942, -116.57081449547842, -177.82612582226329, 206.8817050386096, 1116.6649976696201, 1551.5341746851843, 206.06587874917457, 221.21501338856706, 949.59692563201861, 2377.7643188321972, 271.30602644407116, -752.63562664968606, -131.94201270845676, 66.794183325011446, 26.328209125885053, -2.6512991036295719, -7.060878043009799, 3.4956142029525408, 4.0712276182145608, -0.49091417497970008, -0.54247114501895244, 2.5929708279440629, -2.2683391883792092, -3.9697444489461264, 0.64738652825819076, 4.555701357906309, 5.0432051545575858, 1.8637246814391786, -2.1415599665130838, -3.0402232986351168, -7.5278540025228704, -9.1564876386533562, 18.733705732232028, 116.47631097371497, 62.470104114045292, -587.35890158810116, -665.30895184878261, 1602.7477447230021, 2320.4028678586192, 84.3231427941042, 335.33509531572889, 111.12995285997569, -246.89163612982301, 99.59266396905916, 121.29447232003599, -19.935724961316957, -24.271547137145927, -9.9392605214134129, 3.6463495838243953, 2.4659870551932221, -4.9118061115950002, -3.9830584925921726, 3.1158463847663604, 4.6325922286854171, 0.7426231797993057, 2.6761268245222913, 0.75707810610464332, -2.0529004071821726, -5.4726123906428121, -3.3500885842682195, 4.7318552060186496, 3.3081314176561212, -7.5747009667011485, -9.660327017316277, 13.948321679490391, 60.920555877786029, 51.912766255688908, -200.57409151559827, -358.55234539419581, 389.87395397760162, 626.9468569152699, 385.67355889894168, 266.46730452215979, -754.85949807698285, -357.47689087779764, 198.35300746583653, 104.20178335269868, 0.2335042399832746, -13.459048177551795, -2.4931441622280337, 3.3591145464251499, -0.87332830625456936, -5.0562417941567173, -2.0170485858323599, 2.3079461733716489, 1.2848757720394648, 1.0044515769395077, 2.2715095300739048, 1.0357721766880663, -1.8190548566089728, -3.9293196367766434, -3.2116043474898985, 1.2474845862739923, 2.207161661351936, 0.30672454240560637, -1.2664097847556852, 1.1634429445003909, -12.548270616696369, -13.623126322836848, 148.11914826060797, 160.05821428876476, -517.73406283289592, -683.78444654557211, 232.19478887738595, 129.53848012256918, -30.629684625724426, 14.007085088982263, -28.536726784912368, -22.150721493101905, 7.4458049666709201, 6.5426060710782901, 2.7181624419475532, -0.21791167804934167, -2.1894859760859342, -0.30261213114781382, 1.6929032656017511, 0.075295172141104427, -2.5525542005113677, 0.092868468976744334, 0.059811282681573222, 0.44341981227717964, 0.7816687865488906, 1.8071322433818207, 1.0194826794166407, -1.7022885447654383, -1.6578557975757291, 1.4780948040669197, 2.3190205805607031, -2.0993082250693513, -8.8242080507891387, 6.7426676795129614, 63.308016957216438, 32.614432065456008, -214.97833639893088, -154.136284333817, -153.00121169652448, -168.20144264926009, 132.73656142769508, 108.19035464369672, -32.411936148940164, -29.299646468639978, 0.48512698058416193, 5.624023137620874, 1.3789304004393061, -2.3621905210139289, -1.2100039550542188, 4.3583730663879736, 4.4422506314578856, -3.3529459489445013, -3.2593326279479276, -2.3921307524924811, -2.978651033636929, -0.78921784490688773, 2.0776847434633869, 4.6706759151301158, 3.7169173278476082, -1.8762573022143243, -3.6928619255631911, -0.82171694591384903, 1.0313698171467438, -0.47387208215225501, 4.5050179323404294, 12.279477314121408, -23.426373610246564, -47.509829762735897, 96.770610724801742, 142.54719834919302, -140.65053169937673, -123.6545784250871, -20.023908130365463, 5.7599623270112001, 10.838125249555288, 8.3690034326252576, -0.61869787578431057, -1.9872713177733001, -0.88566790635833359, -1.3475268812751358, 0.76129128976144478, 4.1066846542201834, 0.69320146991960074, -1.2677968128954245, 0.81553632831789258, -1.6303291884460738, -2.2291497640151472, -1.5668982951183865, 1.2058440679467928, 2.0699393017293768, 1.4972394562433364, -0.45863502618354141, -1.2690924739742997, -0.78463693252535771, -0.71980764244508078, 0.10250612713533153, 2.393822328408012, -0.41309740564872016, -15.44378212490165, 0.6609566018409474, 72.351368761661817, 25.384635851249769, 24.183834027615426, 48.560459752587064, -30.885786753212521, -41.646585437272115, 4.9406680758638473, 9.7637208498293564, -2.6994657893152145, -2.3673227042220928, 0.99131130124397382, 1.9229365129251841, 1.0659834826624002, -5.2481714738530103, -7.2759438909005807, 4.8682061863604567, 9.822573727789889, 5.6528275472549172, 2.0386422190351761, 0.27431668194701375, -2.1164683881366688, -6.0913412323542273, -4.1102964274349301, 3.1073479985221883, 4.720787089742764, 1.4415919680128015, 0.049935137368385736, 0.23499648430732389, -3.983837312738201, -10.315757961787851, 3.7701904804417365, 17.40344272954281, -26.485594572094836, -57.180963546905772, 56.164057478325546, 74.232658958160258, -2.1566648897744729, -33.253025139779027, -16.080807358669208, -7.6408862919476457, -0.061535710181698199, 4.3516423276699152, 3.0483876930594445, 1.4396821019147403, -2.1531487354432772, -12.330021507307762, -6.784080497103278, 6.2189314368004602, 6.5359347127328817, 5.8394886675864184, 6.5502057137602838, 2.8897971357633669, -4.5807084372558364, -7.1480702421459901, -3.5449281234624839, 3.1166956033252706, 5.7654746814446929, 1.4593710853505601, 0.079551299266885034, 1.7754263793290057, 1.1602778115858083, -4.1621952562095537, -6.1090111539332135, -21.585708623899716, -64.660963126416291, -42.918674159823304, -12.637618832694352, -23.660098526273554, -32.757377164957738, -16.139835139531076, -8.8214501105659302, -0.074083275956097649, 9.2347297800775099, 4.0583945463193585, -1.3379386144670409, -1.0708228123536387, -3.7494033803061741, -1.4014962110675557, 6.3397919866467625, -0.03663393601032304, -6.5449789794813107, -2.0617294503879311, 2.9031092319630374, 1.9851413256277737, 1.0607201932740675, 2.7050589244056695, 2.9910202735510598, -2.6114709035663148, -2.998378794740129, -0.21466478532365837, -0.045062120129980232, 0.26663892053888355, 4.6476599377621559, 4.3038853444793466, -6.8220974094569344, -12.449318624888502, -10.129633105210658, -14.243655171088259, -24.590264561101538, -60.147765518061014, -2.4700759029582726, 27.756533006476555, 4.2749753092209222, 1.5109008418257455, 2.3037162841058008, -3.3991123070026288, -2.3657348243984693, -1.7285717434362748, 1.4807803344279866, 11.452735641829591, 12.838038879276603, -0.48093805977912302, -8.4823730361517384, -10.096707565442667, -5.1613641497068938, -2.6506938623127332, 9.4081369631901755, 9.4967470257992304, 1.5732629424154292, -6.2329583900406389, -7.3741953717279571, -0.66458216201047882, 2.3894666174155379, 0.72026798365788192, -2.7056126524381918, -1.4278421900811593, 6.2735441200134945, 15.997118782527094, 32.340859723792008, 29.293996905608573, 6.5830123071218694, -6.0118236769643065, 35.32705272368031, 28.93384981751958, 4.6778289682139205, -4.8626411358427797, -9.0689375245571853, -5.8403695985513542, -0.88764146409061928, 0.44619327315923196, 2.0930545096716431, 8.2346460399114871, 4.4412927362425512, -3.9444092199360696, -3.9225599509162312, 0.038172103710441746, -1.1645390667947013, 3.8468081061273272, 3.825131103533594, 0.73794607986345129, -4.4683377641176865, -3.1226055206334693, -1.659659462142453, -1.5916869216083986, 0.66773943004769798, 3.4159390288117701, 1.5141668200491456, 0.24760595741359728, -0.60433400901725032, -18.385421885703135, -9.3028295113894721, 25.73026622408986, 16.23212758885586, 17.912434056418146, -8.8649857221999238, -22.650006821252305, -4.6057627844621933, 3.1371579845110453, -0.064465121107319889, -0.7788946841662594, -1.4905827462536891, -1.6111207980069511, 3.9054962114874257, 1.1954905638175628, -5.7282279624444916, -8.3976603765003119, -2.0078722367450874, 4.7029696271178913, 9.1972361583870761, 4.7029696271178825, -2.0078722367450905, -8.3976603765003119, -5.7282279624444836, 1.1954905638175473, 3.9054962114874288, -1.6111207980069395, -1.4905827462536891, -0.77889468416625518, -0.064465121107317946, 3.1371579845110462, -4.6057627844621942, -22.650006821252259, -8.8649857221999415, 17.912434056418164, 6.583012307121729, 25.730266224089799, -9.3028295113894721, -18.385421885703128, -0.60433400901726175, 0.24760595741359434, 1.5141668200491516, 3.415939028811767, 0.66773943004769509, -1.5916869216084077, -1.6596594621424434, -3.1226055206334529, -4.4683377641176723, 0.73794607986344696, 3.8251311035336037, 3.8468081061273467, -1.1645390667946849, 0.038172103710459718, -3.9225599509162259, -3.9444092199360838, 4.4412927362425298, 8.2346460399114854, 2.0930545096716502, 0.44619327315923041, -0.88764146409061584, -5.8403695985513515, -9.0689375245571728, -4.862641135842777, 4.6778289682139134, 28.933849817519487, 35.327052723680374, -6.0118236769642888, -24.590264561101595, 29.293996905608687, 32.340859723791993, 15.997118782527064, 6.2735441200134687, -1.4278421900811535, -2.7056126524381958, 0.72026798365787437, 2.3894666174155401, -0.66458216201047282, -7.3741953717279607, -6.2329583900406416, 1.5732629424154319, 9.4967470257992108, 9.4081369631901666, -2.6506938623127225, -5.1613641497068841, -10.096707565442674, -8.4823730361517544, -0.48093805977915227, 12.83803887927658, 11.452735641829598, 1.4807803344279824, -1.7285717434362824, -2.3657348243984719, -3.3991123070026203, 2.3037162841058088, 1.5109008418257512, 4.2749753092209266, 27.756533006476598, -2.470075902958246, -60.147765518061043, -12.637618832694358, -14.243655171088175, -10.12963310521061, -12.449318624888507, -6.8220974094569566, 4.3038853444793421, 4.6476599377621488, 0.26663892053888499, -0.045062120129979372, -0.21466478532365083, -2.998378794740133, -2.6114709035663206, 2.9910202735510656, 2.7050589244056806, 1.0607201932740935, 1.9851413256277779, 2.9031092319630249, -2.0617294503879293, -6.5449789794813169, -0.036633936010327744, 6.339791986646766, -1.4014962110675422, -3.7494033803061728, -1.0708228123536432, -1.3379386144670453, 4.0583945463193594, 9.2347297800775188, -0.074083275956095859, -8.8214501105659284, -16.139835139531023, -32.757377164957752, -23.660098526273632, 56.164057478325425, -42.918674159823318, -64.660963126416391, -21.585708623899666, -6.1090111539332215, -4.1621952562095581, 1.1602778115858134, 1.775426379329013, 0.079551299266884423, 1.4593710853505546, 5.7654746814447053, 3.1166956033252631, -3.5449281234624781, -7.1480702421459874, -4.5807084372558347, 2.8897971357633647, 6.5502057137602785, 5.8394886675864104, 6.5359347127329022, 6.2189314368004851, -6.78408049710327, -12.330021507307773, -2.1531487354432741, 1.439682101914743, 3.04838769305944, 4.3516423276699179, -0.061535710181697623, -7.6408862919476563, -16.080807358669187, -33.253025139779005, -2.1566648897745, 74.232658958160258, 24.183834027615593, -57.180963546905936, -26.485594572094925, 17.403442729542817, 3.7701904804417596, -10.315757961787877, -3.9838373127381965, 0.23499648430733011, 0.049935137368386437, 1.4415919680127984, 4.7207870897427613, 3.1073479985221901, -4.1102964274349274, -6.0913412323542424, -2.1164683881366799, 0.27431668194701325, 2.0386422190351805, 5.6528275472549048, 9.822573727789889, 4.8682061863604691, -7.2759438909005807, -5.2481714738530263, 1.0659834826623993, 1.9229365129251905, 0.99131130124397682, -2.3673227042220857, -2.699465789315211, 9.7637208498293848, 4.9406680758638624, -41.646585437272229, -30.885786753212596, 48.560459752587221, -140.65053169937659, 25.384635851249651, 72.351368761661789, 0.66095660184101279, -15.443782124901649, -0.41309740564871933, 2.3938223284080151, 0.10250612713533497, -0.71980764244507844, -0.78463693252535704, -1.2690924739742999, -0.45863502618354285, 1.4972394562433307, 2.0699393017293644, 1.2058440679467857, -1.5668982951183805, -2.2291497640151445, -1.6303291884460729, 0.81553632831788769, -1.2677968128954307, 0.69320146991959397, 4.1066846542201878, 0.76129128976144589, -1.3475268812751391, -0.88566790635833126, -1.9872713177733001, -0.61869787578431157, 8.3690034326252771, 10.838125249555295, 5.7599623270111371, -20.023908130365466, -123.65457842508674, -153.00121169652476, 142.547198349193, 96.770610724801799, -47.509829762735976, -23.426373610246678, 12.279477314121431, 4.505017932340448, -0.47387208215225296, 1.0313698171467449, -0.82171694591384781, -3.6928619255631867, -1.8762573022143267, 3.7169173278476135, 4.6706759151301114, 2.0776847434633798, -0.78921784490688629, -2.9786510336369223, -2.3921307524924669, -3.2593326279479267, -3.3529459489444933, 4.4422506314578865, 4.3583730663879798, -1.2100039550542185, -2.3621905210139329, 1.3789304004393068, 5.6240231376208731, 0.48512698058415527, -29.29964646863997, -32.411936148940157, 108.19035464369668, 132.73656142769508, -168.20144264926049, 232.19478887738595, -154.13628433381695, -214.97833639893091, 32.614432065455887, 63.308016957216388, 6.7426676795129818, -8.8242080507891405, -2.0993082250693487, 2.3190205805607031, 1.4780948040669208, -1.657855797575728, -1.7022885447654388, 1.0194826794166389, 1.8071322433818233, 0.78166878654889338, 0.44341981227717431, 0.059811282681573222, 0.092868468976748497, -2.5525542005113593, 0.075295172141105315, 1.6929032656017555, -0.30261213114781177, -2.1894859760859413, -0.21791167804934622, 2.7181624419475532, 6.5426060710782918, 7.4458049666709138, -22.150721493101912, -28.536726784912382, 14.007085088982294, -30.629684625724458, 129.53848012256904, 385.67355889894196, -683.78444654557279, -517.73406283289592, 160.05821428876459, 148.1191482606082, -13.623126322836866, -12.548270616696426, 1.1634429445003742, -1.2664097847556794, 0.30672454240560415, 2.2071616613519298, 1.2474845862739898, -3.2116043474898839, -3.9293196367766487, -1.8190548566089664, 1.0357721766880712, 2.2715095300739065, 1.0044515769394997, 1.2848757720394559, 2.3079461733716413, -2.0170485858323568, -5.0562417941567217, -0.87332830625457158, 3.3591145464251335, -2.4931441622280368, -13.459048177551766, 0.23350423998331427, 104.20178335269858, 198.35300746583647, -357.47689087779742, -754.85949807698285, 266.46730452215979, 84.323142794104228, 626.94685691527002, 389.87395397760116, -358.55234539419558, -200.57409151559838, 51.912766255688851, 60.920555877786029, 13.948321679490393, -9.6603270173162681, -7.5747009667011582, 3.3081314176561238, 4.7318552060186576, -3.3500885842682231, -5.472612390642829, -2.0529004071821806, 0.75707810610465265, 2.676126824522286, 0.74262317979931325, 4.6325922286854091, 3.1158463847663604, -3.9830584925921673, -4.9118061115949914, 2.4659870551932261, 3.6463495838243847, -9.9392605214134129, -24.271547137145948, -19.935724961316961, 121.29447232003592, 99.592663969059103, -246.89163612982315, 111.12995285997523, 335.33509531572906, 221.21501338856802, 2320.4028678586192, 1602.7477447230024, -665.30895184878284, -587.35890158810128, 62.470104114045164, 116.47631097371504, 18.733705732232092, -9.1564876386533669, -7.5278540025228837, -3.0402232986351114, -2.1415599665130745, 1.8637246814391684, 5.0432051545575796, 4.5557013579063117, 0.64738652825819132, -3.9697444489461211, -2.2683391883791986, 2.59297082794407, -0.54247114501893734, -0.49091417497970297, 4.0712276182145537, 3.4956142029525421, -7.0608780430097635, -2.6512991036295777, 26.328209125884918, 66.794183325011389, -131.94201270845636, -752.63562664968617, 271.3060264440702, 2377.7643188321958, 949.59692563201872, -2935.685284408913, 206.06587874917372, 1551.534174685185, 1116.6649976696197, 206.88170503860968, -177.82612582226307, -116.57081449547834, -36.837920974758035, 11.041451779488151, 13.529650759569909, -8.7583525837485361, -15.812600063085752, 3.5976801907925351, 15.992639239497519, 13.233921729082972, -0.54082984812181611, -8.479740526626081, -3.8920400769731613, -9.7282165445191335, -10.468288519634076, 4.7705608814238323, 15.595649759531605, -1.3809484232923479, -19.634567061108552, 3.1644160240378296, 76.416221889183575, 122.15327454200114, -163.25068439377961, -307.58274676435752, 1545.4091719722737, 2222.0566542865222, -1215.2968180059584, 5705.1501208043328, -931.02314429184867, -5014.4780810602606, 12.384349101875989, 1111.9285745591585, -11.991282367617289, -279.42683310552832, -95.964038421947791, 20.179218397178591, 26.029536485331974, -0.63615178952006546, -8.9239476494738614, 0.81912298615373047, 4.354047932280479, 3.7892183180180292, 4.9636496941116457, -1.7856630822843349, 0.86416108685458326, -17.670460817927413, -10.314744048939055, 7.3973207504467204, 11.310122449566087, -7.0012835658321206, -7.2338183321331515, -5.1522911915584801, -33.623549275177297, -93.950748347298841, 82.616255878071172, 1249.2695734137344, 728.4038194884231, -2822.6768689275882, 397.85150159823706, 26666.274860226469, 1118.2132640961736, -9076.4400559658625, -3081.1066694335805, 284.6652898587414, 465.72794392086666, 193.36235004999409, 24.526337675320004, -3.1507841384785733, -1.8812165005783184, 6.9628905148897147, 18.113814308198211, 3.7834180501306891, -16.040469196891639, -20.012525822291416, 6.2313507558256083, 9.7740131156133696, 0.1390769027181136, 2.7720670784771526, 18.76945635314798, 7.2506028858092133, -12.318944408119592, 1.2207482283869953, 25.844521173618411, -4.435939812126878, -126.31904474729296, -189.92210588558356, 234.73611402062767, 770.97093894980162, -4944.5276302554457, -10095.4436331661, 9631.082450060534, 25390.170503473091, 2133.8618335997035, -174.99103969877373, 4452.6929959791023, 620.49539711803243, 514.99549805982349, 546.49872794031364, 218.31674915569133, -20.687109086504822, -41.926948021480328, 8.3348052170650853, 25.323206346284447, 0.86872374588174384, -17.959748575409694, -19.561354112987079, -1.4949158508675975, -5.5658589086089423, -4.0194858939287954, 20.161840527236293, 32.414130280804187, 2.8803824684767667, -21.191137754573067, 1.4918751600931279, 36.180920465642465, 4.5612631126941521, -28.684822585719061, -46.175546007129988, 457.86146922204938, 982.95511309135657, -848.38159326591563, -7213.0026112046844, 2752.5053486175875], \"imag\": [0.0, -3169.9451614941381, -2389.0092924747519, -2824.6185770767256, 47.140985329040632, -205.51829185355012, -383.71835019762682, -205.9732988135564, 11.332172552374439, 43.76909201728548, -7.034291101336307, -32.133345787281364, -1.2408409398708855, 22.626534078219475, 22.834188196398234, 5.8606054504390173, 0.0, -5.8606054504387375, -22.834188196398308, -22.626534078219454, 1.2408409398708751, 32.133345787281435, 7.0342911013362928, -43.769092017285352, -11.332172552374439, 205.97329881355589, 383.71835019762727, 205.51829185355027, -47.140985329040632, 2824.6185770767256, 2389.009292474751, 3169.9451614941386, 14687.463554763033, -1246.2254521233822, -13582.059524928778, -4205.001741520543, 1374.1061578688877, -137.33727593318653, -632.81134552884873, -154.70037614560013, 13.450507164884565, 15.193108572125329, -6.1542966587055341, -15.818788310912929, -2.909480569030046, 1.479970160345879, -1.5973907882613358, 1.5293212848264928, 18.21275880080945, -1.003899882219808, -18.30035720783934, -15.99060672422979, 0.33906699281555863, 8.403557604549265, -3.6955816316308372, 1.2265587756840484, 4.4918801658948704, -32.498332906337446, -252.78924650714879, 118.6015387642415, 1871.5173348139303, -2304.7799937689852, -14411.746659687838, -4213.8766814139526, 7014.7325605010174, 2247.44595388478, -16.760963274859961, 900.76474301933899, -5.1342500455989466, -420.94056280958415, -12.516743930999253, 93.660446148871657, -5.3964791524595173, -25.576180637452808, -8.2514109979697761, 17.318312851322737, 9.236462137217643, -22.012718711107286, -15.490166786860247, -4.834205749446653, 9.5628562714065293, 1.836849747935801, 5.3481684451070093, 16.065001056209898, 7.1604513809609767, -15.578970641484018, -6.7835303274441205, 29.197525074885235, 24.587565667273296, -80.302667778037872, -341.00518268197084, -165.09457453510524, 812.92907888826301, -1514.0868881615295, -6442.5930626817562, 2384.0282361623322, -10283.309463536394, -4592.9695519937077, 4024.534672295305, 1566.1446188979135, -577.97842695498832, -13.866559817282136, 303.84181615530144, 107.13271532249853, -4.4304590515519831, -24.335491476624799, -1.0691687945057899, 24.162065431216654, 4.7495715205351985, -14.018208973927269, -8.9506230152518427, -4.4638345370409525, -7.1842950536944761, -0.75483699139922611, 9.34037405707282, 25.690847574014661, 10.204720176161787, -11.674788778672609, -2.2174348022320634, 10.712979752882786, 4.1447690963328192, -30.289408767911031, -12.158067002051448, -76.336688904244483, -15.045419751305701, 825.0044509954804, 3127.7274260756976, -92.692661642821449, -6218.4941130018287, -3848.3727657836507, 693.87265018831545, 545.97208874512432, -92.125598598764668, 150.80594875272075, 31.835009702890954, -5.9283896106206289, 5.1749362811852588, 3.5428080098191677, 8.1813203788089979, 0.80238728202918663, -2.1553941232205127, 3.896876060708947, 5.7415452177174027, -2.4223203414509196, -12.192718147122756, -6.4431256169971434, 0.78101397437949727, -0.4709674045364774, 4.0135477523785683, 5.3424403453362856, 1.5176299437256986, -10.74330995836436, -14.68235074512339, 24.624343673414469, 118.67852190927127, 172.09305386209979, -99.157790391266047, 517.50332981617737, 2037.7393191154626, -1363.1746812874464, -339.74333242555031, 32.123918954310476, -283.55446630414355, -87.787271289656218, 401.24269480211609, 97.679749329289763, -120.49954302359174, -51.176060542512822, -2.5863965882294027, 13.214576791319574, 4.0359196374926878, -8.3066986443292503, -3.2190392651304429, 10.42730204701207, 6.8931399993642719, 0.50989762348064183, -1.9729622551402084, -2.7447920706561999, -6.4951794944364067, -8.7659237408433199, -2.5623445767069972, 9.4029551910696547, 6.0787635497373449, -8.7738681104802421, -10.356090763505474, 25.994421343462481, 47.534456712956128, 36.427418067214397, -132.28171420843677, -55.780171242651143, 550.58818821416037, 230.04212220540037, 2282.8157342153072, 1692.5764998210254, -618.40106666814791, -406.75082987636517, 268.61096451191207, 88.797660850068112, -17.813285237066509, -23.19378111787497, -5.993920933714092, 3.5911964041653288, -1.1492389141172172, -3.281418277923168, 1.0895777711511168, 3.5282533189728529, -1.1949811908258732, 1.894384229023907, 4.6241332834085442, 0.37075703258422543, -2.0346603770225924, -4.5067903456406357, -1.1470927861162812, 2.3634060343879923, 3.2590535483912988, 1.2412658338184401, -2.2389815887732318, -8.267796716016413, -35.26417469610022, -42.695700376724766, 163.41685001540142, 139.99054216726472, -634.39240892418218, -59.277692870412778, 635.10435435478166, 336.10950761267088, -20.987908495686451, 62.381440709915225, -5.2608500919337384, -7.9431228598947987, 17.719913727215761, 2.2765757875228916, -0.5781253977177655, -1.861000889502646, -1.1416693103444284, 2.4821587471930475, 1.9877494352069631, -3.6722851782283747, -3.348161983991842, -0.65436436680629395, 1.4913973744886961, 1.3020502991963898, 1.5364454784416322, 2.0332502155623371, 0.082811915307875697, -2.7287340233180468, -2.0624150870013023, 3.1666191865848514, 2.1277795836536475, -15.762070711071239, -31.080087158567022, 16.264563798793048, 168.22104098804192, 119.10647254618513, -340.95280202269214, -119.21079977674056, -524.16143614722125, -474.83791951425451, 238.16973599672059, 238.87620399289383, -30.950251690797295, -43.007655043750781, -7.0781110181685483, 4.2933368018010754, 2.128510229721456, -1.3556643805285902, 0.67118052098401426, 4.1580113773740086, 1.6924135574018535, -3.2368514600901537, -2.3674255865410236, -2.2397386036010594, -2.8392755347081424, -0.22727952120054792, 2.1660066162361877, 4.1257252023454543, 1.8555476250524485, -3.0110538491549583, -3.3997614112807475, -0.064441197381949922, 1.4400236898496321, -2.5651430892865172, -0.57406913069513732, 14.545275998521815, -21.097880653370396, -8.386658477188135, 246.29297742969297, 177.82681762874435, -29.410757783669329, 21.206487630199256, 82.341423257084315, 9.4629909259569072, -12.117042155983494, -8.2057292966872932, -5.3672622769763416, 0.7159440642377497, 0.69394420462213224, -0.39501642572828111, 0.57804318775345176, 1.8269742232979342, 0.10217887910111716, 0.16688705386232044, 1.9755117613475777, -0.94372823495475977, -2.4667123640612325, -1.3772827491468491, 0.74627343874194729, 1.5703957699483431, 1.3943774862563845, 0.51087952435755024, -0.57473339559817926, -2.0019592491226121, -0.94447858069522983, 4.1105720381539621, 9.8748960802998482, -5.0693062852843767, -52.44341015820585, -37.642264259816841, 117.83245857703734, 130.78419594725884, 169.61465367155833, 186.83060708175802, -35.974218698264572, -86.880281148446372, -5.2203740194539208, 16.971669187755321, 6.0698179812651247, 0.35231673872141245, -0.53044914356261097, -0.81632535007713047, -0.39583117800855089, -4.4385250403688277, -5.1472849145985213, 2.545092404453277, 5.0071357876878793, 2.743807769745191, 3.4897745997776024, -0.063125314946314764, -1.9440922443950184, -5.9326946820069502, -3.385188090942465, 3.6658395382201929, 4.0455837767151035, -0.6661551017179177, -2.2326980338070728, 1.6846667556373658, 3.8137132042051891, -1.9181620538698931, 1.6441956870289249, -6.1270500694313146, -76.595893205927055, -49.969516616017785, -7.9132321269474106, -11.568908095829089, -47.805112772715709, -13.830481688679152, 18.277275877397457, 14.698934402888547, 6.2184742035979967, 1.4890022076822711, -0.74744399004349582, 1.078974533533704, -0.78904970661953722, -8.2729456489475783, -5.409011823874466, 2.7622883519807897, 0.8473850486901422, 1.8128818460693508, 2.8420219491550718, 1.5362703897962247, -3.7595900673998903, -5.6022288243818803, -4.1625158390656765, 0.71295082461726678, 3.6372516960945322, 1.3208871209715871, -0.62400754176455042, -1.768358539761187, -3.6168192973638713, 3.6735963806245331, 31.275163257132462, 32.479329698147204, -39.759969700967346, -68.584232650917357, -57.469468975158698, -64.297371445934317, 0.20861011566533649, 34.25783205331058, 6.9534765415767215, -5.3793483456417883, 1.2524657598045081, 1.5450348766267965, 0.56608571170600441, 1.3866526144820828, -2.467818437504425, -0.23634501606433136, 6.3450244574570114, 0.9543505178876851, -4.984602859992024, -6.3381420012322005, -2.7435850611580781, -1.5807425386703018, 2.421504137076397, 6.8428975986621223, 5.3939316426610251, -2.3287200765196823, -4.7978450785431628, -0.63133403867009485, 1.1146429476849253, 0.7514356381637266, 2.2717048597800691, 5.5350475212285941, 5.1571773922734927, 9.2792987920179275, 21.682075132354747, 1.4867450129376456, -4.4700114725605324, -18.272390809448236, 16.714318324621598, 7.3089787270008628, -20.071959549384122, -7.0841774280620697, 3.2022160216960311, -0.077988270864014025, -1.5775612503840553, -4.3715375274672654, -2.1765426316142653, 13.260687049653976, 13.879467714343647, -1.8852486869718339, -10.527030755482089, -6.8369811071974125, -3.0333474188096656, -2.1407969562984661, 3.722272454853548, 7.6257272547055521, 10.117490783509389, -0.39109059001006397, -6.9982476982268125, -4.2960092579610025, 0.55901791170159865, 2.6155137759572247, 6.5895285486459425, 7.4061452615413605, -10.366283361455007, -35.34703723782264, -16.933453520111545, 16.224692124004221, -34.34332526355967, -71.738587010679367, -34.450969879654501, -6.2640778700882249, 11.746214635705909, 13.031958951769729, -0.3480472785242843, -3.9968553356395629, -3.964707435958017, -4.2096432311062548, 4.9158294568057652, 12.338227697160551, 3.5088489717994391, -9.6887588471648289, -3.3007173968474173, 1.3223986051066356, 3.9779056054352555, 5.2139034331477543, 0.73966749617948313, -3.1538649748494341, -5.201358311154781, 1.2046804216345655, 2.9426249963390902, 0.16125203808628796, -0.12580690156457183, -1.0212362026563724, -6.277158135649886, -5.6679546723264744, 4.2381986446151707, 5.7560371617010828, 18.621646756873353, 24.734309444721209, -36.387091300098106, -10.759792351985398, -2.2461784763603254, 3.6933656200181786, 20.866503857704814, 3.7918232583171383, -8.2103085682208885, -3.9258378390443029, 0.83382202471681166, 4.801181266459511, 6.1897358407630447, -4.7613942589703724, -14.056893094185043, -2.2289578077004246, 10.245900399003714, 12.011271759567334, 7.3710550588087713, 3.5515726304902269, 1.2929923686914595, -7.4124476338006691, -7.5787947999111838, 1.7154740370529804, 9.3123854476054735, 4.9777565316787626, -0.24109318982965802, -5.1766732320109883, -9.3092191729240525, -5.246693773893865, 10.274800595678272, 28.322088715789157, 27.586929135138202, -13.506737972920812, 0.0, 72.992093909712537, 40.674766306359388, 3.6677612059140889, -7.0101784555215705, -11.074353780690299, -3.5600519087446321, 2.4941865000982566, 3.5007885216085395, 2.2952423730960096, -1.6579656325825838, -10.397334640078137, -8.5183394179138396, 4.679962930220257, 8.9265575080577193, 4.8985021447705659, 0.0, -4.8985021447705712, -8.9265575080577282, -4.6799629302202739, 8.5183394179138361, 10.397334640078139, 1.6579656325825878, -2.2952423730960114, -3.5007885216085395, -2.4941865000982615, 3.5600519087446361, 11.074353780690284, 7.010178455521566, -3.6677612059140743, -40.674766306359437, -72.992093909712509, 36.387091300098248, 13.506737972920931, -27.586929135138188, -28.322088715789224, -10.274800595678252, 5.2466937738938775, 9.3092191729240525, 5.1766732320109785, 0.24109318982965933, -4.9777565316787626, -9.3123854476054682, -1.7154740370529937, 7.5787947999111918, 7.4124476338006797, -1.2929923686914602, -3.5515726304902286, -7.3710550588087731, -12.011271759567332, -10.245900399003729, 2.2289578077004006, 14.05689309418503, 4.7613942589703955, -6.1897358407630483, -4.8011812664595261, -0.83382202471681333, 3.9258378390442905, 8.2103085682208921, -3.7918232583171019, -20.866503857704799, -3.6933656200181462, 2.2461784763603472, 10.759792351985324, 34.343325263559734, -24.734309444721188, -18.621646756873407, -5.7560371617010961, -4.2381986446151565, 5.6679546723264433, 6.2771581356498745, 1.0212362026563664, 0.12580690156457094, -0.16125203808628427, -2.9426249963390938, -1.2046804216345817, 5.2013583111547899, 3.1538649748494616, -0.73966749617946026, -5.2139034331477525, -3.9779056054352657, -1.322398605106651, 3.3007173968474182, 9.6887588471648343, -3.5088489717994329, -12.338227697160564, -4.9158294568057723, 4.2096432311062539, 3.9647074359580197, 3.9968553356395535, 0.34804727852429029, -13.031958951769711, -11.746214635705918, 6.2640778700882196, 34.450969879654494, 71.738587010679424, 4.4700114725605502, -16.224692124004207, 16.933453520111492, 35.34703723782269, 10.366283361455015, -7.4061452615413437, -6.5895285486459567, -2.615513775957226, -0.55901791170159942, 4.2960092579609945, 6.9982476982268116, 0.39109059001006968, -10.117490783509375, -7.6257272547055521, -3.7222724548535622, 2.1407969562984639, 3.0333474188096563, 6.8369811071973849, 10.527030755482111, 1.8852486869718446, -13.879467714343662, -13.260687049653979, 2.1765426316142595, 4.3715375274672708, 1.5775612503840555, 0.077988270864025142, -3.2022160216960267, 7.0841774280620511, 20.071959549384133, -7.3089787270008086, -16.714318324621601, 18.272390809448193, 57.469468975158712, -1.4867450129376421, -21.682075132354715, -9.2792987920179293, -5.1571773922734714, -5.5350475212285986, -2.2717048597800669, -0.75143563816372472, -1.114642947684924, 0.63133403867008997, 4.7978450785431628, 2.3287200765196983, -5.3939316426610153, -6.842897598662133, -2.4215041370764028, 1.5807425386703056, 2.7435850611580817, 6.3381420012321907, 4.9846028599920196, -0.95435051788768221, -6.3450244574570167, 0.23634501606432906, 2.4678184375044308, -1.3866526144820814, -0.56608571170600686, -1.5450348766267858, -1.2524657598045066, 5.3793483456417848, -6.9534765415767081, -34.25783205331058, -0.20861011566532392, 64.297371445934417, 7.9132321269475003, 68.584232650917386, 39.759969700967275, -32.479329698147232, -31.275163257132508, -3.6735963806245575, 3.616819297363866, 1.7683585397611854, 0.6240075417645492, -1.3208871209715913, -3.6372516960945265, -0.71295082461726456, 4.1625158390656667, 5.6022288243818847, 3.7595900673999001, -1.5362703897962169, -2.842021949155066, -1.8128818460693434, -0.8473850486901302, -2.7622883519807888, 5.4090118238744633, 8.2729456489475819, 0.78904970661953955, -1.0789745335337066, 0.74744399004349849, -1.4890022076822718, -6.2184742035979834, -14.69893440288851, -18.277275877397457, 13.830481688678995, 47.805112772715752, 11.568908095829199, -169.61465367155867, 49.969516616017778, 76.595893205927254, 6.1270500694312791, -1.6441956870289614, 1.918162053869898, -3.8137132042051767, -1.6846667556373722, 2.2326980338070745, 0.66615510171792158, -4.0455837767150955, -3.6658395382201951, 3.3851880909424605, 5.9326946820069546, 1.9440922443950184, 0.063125314946314778, -3.4897745997776015, -2.7438077697451946, -5.0071357876878766, -2.5450924044532854, 5.1472849145985169, 4.4385250403688321, 0.39583117800854778, 0.81632535007713181, 0.53044914356261075, -0.35231673872140901, -6.0698179812651212, -16.971669187755335, 5.2203740194539012, 86.880281148446528, 35.974218698264636, -186.83060708175819, 29.41075778366919, -130.78419594725855, -117.83245857703733, 37.64226425981672, 52.443410158205879, 5.0693062852844104, -9.8748960802998642, -4.1105720381539701, 0.94447858069523327, 2.0019592491226157, 0.57473339559817749, -0.5108795243575508, -1.3943774862563805, -1.570395769948336, -0.74627343874194474, 1.3772827491468478, 2.4667123640612241, 0.94372823495475699, -1.9755117613475803, -0.16688705386232, -0.10217887910111442, -1.8269742232979298, -0.57804318775345009, 0.39501642572828077, -0.69394420462213291, -0.71594406423774049, 5.367262276976339, 8.2057292966872506, 12.117042155983503, -9.4629909259566443, -82.341423257084145, -21.206487630199604, 524.16143614722125, -177.82681762874424, -246.29297742969288, 8.386658477188103, 21.097880653370403, -14.545275998521824, 0.57406913069513366, 2.5651430892865226, -1.4400236898496321, 0.064441197381950838, 3.3997614112807506, 3.0110538491549557, -1.8555476250524514, -4.1257252023454569, -2.1660066162361895, 0.22727952120054773, 2.8392755347081424, 2.2397386036010616, 2.3674255865410174, 3.236851460090151, -1.6924135574018513, -4.1580113773740104, -0.67118052098401537, 1.3556643805285893, -2.128510229721456, -4.2933368018010798, 7.0781110181685527, 43.007655043750773, 30.950251690797295, -238.87620399289392, -238.16973599672059, 474.83791951425417, -635.10435435478075, 119.21079977674036, 340.95280202269191, -119.10647254618499, -168.22104098804189, -16.264563798793112, 31.080087158567054, 15.762070711071249, -2.1277795836536488, -3.1666191865848456, 2.0624150870013005, 2.7287340233180508, -0.082811915307879028, -2.0332502155623482, -1.5364454784416388, -1.3020502991963789, -1.4913973744886957, 0.65436436680629262, 3.3481619839918371, 3.6722851782283725, -1.987749435206966, -2.4821587471930564, 1.1416693103444246, 1.8610008895026517, 0.5781253977177665, -2.2765757875228969, -17.719913727215747, 7.9431228598948822, 5.2608500919337864, -62.381440709915822, 20.987908495685961, -336.10950761266997, -2282.8157342153086, 59.27769287041221, 634.3924089241824, -139.99054216726466, -163.41685001540142, 42.695700376724787, 35.264174696100213, 8.2677967160164005, 2.2389815887732354, -1.2412658338184486, -3.2590535483912864, -2.3634060343879861, 1.1470927861162765, 4.5067903456406286, 2.0346603770225951, -0.37075703258422554, -4.6241332834085505, -1.8943842290239064, 1.1949811908258721, -3.5282533189728493, -1.0895777711511203, 3.281418277923172, 1.1492389141172139, -3.591196404165319, 5.9939209337140893, 23.193781117874966, 17.813285237066506, -88.797660850068027, -268.61096451191219, 406.75082987636472, 618.40106666814768, -1692.5764998210257, 339.74333242554815, -230.04212220540018, -550.58818821415935, 55.780171242650994, 132.2817142084364, -36.427418067214319, -47.534456712956064, -25.994421343462484, 10.356090763505458, 8.773868110480235, -6.0787635497373476, -9.4029551910696316, 2.5623445767070061, 8.7659237408433039, 6.4951794944364281, 2.7447920706561946, 1.972962255140204, -0.50989762348062517, -6.8931399993642568, -10.427302047012086, 3.2190392651304447, 8.3066986443292699, -4.0359196374926896, -13.214576791319564, 2.5863965882294058, 51.176060542512751, 120.49954302359184, -97.679749329289564, -401.24269480211632, 87.787271289656246, 283.554466304144, -32.12391895431216, 6218.4941130018287, 1363.174681287448, -2037.7393191154631, -517.5033298161776, 99.157790391266019, -172.09305386210005, -118.67852190927132, -24.624343673414536, 14.682350745123385, 10.743309958364414, -1.5176299437256995, -5.3424403453363087, -4.013547752378579, 0.47096740453648078, -0.7810139743795077, 6.4431256169971372, 12.192718147122749, 2.4223203414509316, -5.7415452177173938, -3.8968760607089528, 2.1553941232205212, -0.80238728202918486, -8.1813203788090068, -3.5428080098191872, -5.1749362811852562, 5.9283896106206555, -31.835009702890844, -150.80594875272081, 92.125598598764682, -545.97208874512432, -693.87265018831545, 3848.372765783648, 10283.309463536396, 92.692661642825414, -3127.7274260757022, -825.00445099548233, 15.045419751306099, 76.336688904244284, 12.158067002051251, 30.289408767911102, -4.1447690963328059, -10.712979752882784, 2.2174348022320558, 11.674788778672612, -10.204720176161779, -25.690847574014658, -9.3403740570728662, 0.75483699139922822, 7.1842950536944734, 4.4638345370409516, 8.9506230152518249, 14.018208973927262, -4.7495715205351878, -24.162065431216647, 1.0691687945057857, 24.335491476624739, 4.4304590515519813, -107.13271532249837, -303.84181615530116, 13.866559817282113, 577.97842695498844, -1566.1446188979132, -4024.5346722953059, 4592.969551993704, -7014.7325605010174, -2384.0282361623326, 6442.5930626817571, 1514.086888161532, -812.92907888826267, 165.09457453510592, 341.00518268197106, 80.302667778037787, -24.587565667273314, -29.197525074885242, 6.783530327444133, 15.578970641484096, -7.1604513809610006, -16.065001056209955, -5.3481684451070297, -1.8368497479357557, -9.5628562714065364, 4.8342057494466477, 15.490166786860224, 22.012718711107244, -9.236462137217643, -17.318312851322709, 8.2514109979697903, 25.57618063745285, 5.3964791524595155, -93.660446148871785, 12.516743930999144, 420.94056280958409, 5.1342500455991793, -900.76474301933945, 16.760963274859485, -2247.4459538847777, -14687.463554763033, 4213.8766814139472, 14411.746659687837, 2304.7799937689902, -1871.5173348139317, -118.60153876424121, 252.7892465071493, 32.498332906337396, -4.4918801658948837, -1.2265587756841234, 3.6955816316309309, -8.4035576045492331, -0.33906699281557884, 15.990606724229716, 18.300357207839266, 1.0038998822198608, -18.212758800809453, -1.5293212848264821, 1.5973907882613065, -1.4799701603458557, 2.909480569030038, 15.818788310912904, 6.1542966587054897, -15.193108572125247, -13.450507164884552, 154.70037614559999, 632.81134552884851, 137.3372759331867, -1374.1061578688873, 4205.0017415205384, 13582.05952492878, 1246.225452123387]}};\n\n/*\n * MOSSE correlation filter\n *\n * Optional parameters to constructor:\n *   drawResponse {canvasElement} : draws the correlation filter output on the given canvas element (default is none)\n *   psrThreshold {number} : peak-to-sidelobe-ratio threshold to use when updating filter while tracking (default is 10)\n *   eta {number} : adjusts how much new input affects the mosse filter, when updating filter while tracking\n *     number should be between 0 and 1 (default is 0.1)\n *   convertToGrayscale {boolean} : whether to convert canvas output to grayscale (default is true)\n *     if this is set to false, we assume all channels are equal and only grab values from red channel\n *\n * @author auduno / github.com/auduno\n */\n\nfunction mosseFilter(params) {\n    \n    var _filter, _top, _bottom;\n    var _fft;\n    var _w,_h;\n    var _im_part;\n    var _arrlen;\n    var _cc;\n    var _image_array;\n    \n    this.psr_prev = undefined;\n    this.peak_prev = undefined;\n    var updateable = false;\n    \n    if (!params) params = {};\n    // setup of canvas for drawing responses, if given\n    if (params.drawResponse === undefined) {\n        params.drawResponse = false;\n    } else {\n        if (params.drawResponse.tagName != 'CANVAS') {\n            params.drawResponse = false;\n        } else {\n            var responseContext = params.drawResponse.getContext('2d');\n        }\n    }\n    if (params.psrThreshold === undefined) params.psrThreshold = 10;\n    if (params.eta === undefined) params.eta = 0.10;\n    if (params.convertToGrayscale === undefined) params.convertToGrayscale = true;\n    \n    this.load = function(filter) {\n        // initialize filter width and height\n        _w = filter.width;\n        _h = filter.height;\n        _arrlen = _w*_h;\n        _filter = [filter.real, filter.imag];\n        // handling top and bottom when they're not present\n        if (filter.top && filter.bottom) {\n          updateable = true;\n          _top = [filter.top.real, filter.top.imag];\n          _bottom = [filter.bottom.real, filter.bottom.imag];\n        }\n        \n        // initialize fft to given width\n        _fft = new FFT();\n        _fft.init(filter.width);\n        \n        // set up temporary variables\n        if(typeof Float64Array !== 'undefined') {\n            _im_part = new Float64Array(_arrlen);\n            _image_array = new Float64Array(_arrlen);\n        } else {\n            _im_part = new Array(_arrlen);\n            _image_array = new Array(_arrlen);\n        }\n        var canvas = document.createElement(\"canvas\");\n        canvas.setAttribute('width', _w);\n        canvas.setAttribute('height', _h);\n        _cc = canvas.getContext('2d');\n    };\n    \n    this.init = function(w,h) {\n        // initialize filter width and height for a blank filter\n        _w = w;\n        _h = h;\n        _arrlen = _w*_h;\n        \n        _filter = [[],[]];\n        _top = [[],[]];\n        _bottom = [[],[]];\n        for (var i = 0;i < _arrlen;i++) {\n            _filter[0][i] = 0;\n            _filter[1][i] = 0;\n            _top[0][i] = 0;\n            _top[1][i] = 0;\n            _bottom[0][i] = 0;\n            _bottom[1][i] = 0;\n        }\n        updateable = true;\n        \n        // initialize fft to given width\n        _fft = new FFT();\n        _fft.init(w);\n        \n        // set up temporary variables\n        if(typeof Float64Array !== 'undefined') {\n            _im_part = new Float64Array(_arrlen);\n        } else {\n            _im_part = new Array(_arrlen);\n        }\n        var canvas = document.createElement(\"canvas\");\n        canvas.setAttribute('width', _w);\n        canvas.setAttribute('height', _h);\n        _cc = canvas.getContext('2d');\n    };\n    \n    // fft function\n    this.fft = function(array) {\n        // not in-place\n        \n        var cn = new Array(_arrlen);\n        for (var i = 0;i < _arrlen;i++) {\n          cn[i] = 0.0;\n        }\n        \n        _fft.fft2d(array,cn);\n        return [array, cn];\n    };\n    \n    // fft function\n    this.fft_inplace = function(array) {\n        // in-place\n        \n        for (var i = 0;i < _arrlen;i++) {\n          _im_part[i] = 0.0;\n        }\n        \n        _fft.fft2d(array,_im_part);\n        return [array, _im_part];\n    };\n    \n    this.ifft = function(rn, cn) {\n        // in-place\n        _fft.ifft2d(rn, cn);\n        return rn;\n    };\n\n    // peak to sidelobe ratio function (optional)\n    this.psr = function(array) {\n        // proper\n        var sum = 0;\n        var max = 0;\n        var maxpos = [0, 0];\n        var sdo = 0;\n        var val;\n        for (var x = 0;x < _w;x++) {\n            for (var y = 0;y < _h;y++) {\n                val = array[(y*_w)+x];\n                sum += val;\n                sdo += (val*val);\n                if (max < val) {\n                    max = val;\n                    maxpos = [x,y];\n                }\n            }\n        }\n        \n        // subtract values around peak\n        for (var x = -5;x < 6;x++) {\n            for (var y = -5;y < 6;y++) {\n                if (Math.sqrt(x*x+y*y) < 5) {\n                    val = array[((maxpos[1]+y)*_w)+(maxpos[0]+x)];\n                    sdo -= (val*val);\n                    sum -= val;\n                }\n            }\n        }\n        \n        var mean = sum/array.length;\n        var sd = Math.sqrt((sdo/array.length)-(mean*mean));\n        \n        // get mean/variance of output around peak\n        var psr = (max-mean)/sd;\n        return psr;\n    };\n    \n    this.getResponse = function(imageData) {\n        // in-place\n        \n        // preprocess\n        var prepImage = preprocess(imageData);\n        prepImage = cosine_window(prepImage);\n        \n        // filter\n        var res = this.fft_inplace(prepImage);\n        \n        // elementwise multiplication with filter\n        complex_mult_inplace(res, _filter);\n        \n        // do inverse 2d fft\n        var filtered = this.ifft(res[0],res[1]);\n        return filtered;\n    };\n    \n    this.track = function(input, left, top, width, height, updateFilter, gaussianPrior, calcPSR) {\n        // finds position of filter in input image\n        \n        if (!_filter) {\n            console.log(\"Mosse-filter needs to be initialized or trained before starting tracking.\");\n            return false;\n        }\n        \n        if (input.tagName == \"VIDEO\" || input.tagName == \"IMG\") {\n            // scale selection according to original source image\n            var videoLeft = Math.round((left/input.width)*input.videoWidth);\n            var videoTop = Math.round((top/input.height)*input.videoHeight);\n            var videoWidth = Math.round((width/input.width)*input.videoWidth);\n            var videoHeight = Math.round((height/input.height)*input.videoHeight);\n            _cc.drawImage(input, videoLeft, videoTop, videoWidth, videoHeight, 0, 0, _w, _h);\n        } else if (input.tagName == \"CANVAS\") {\n            _cc.drawImage(input, left, top, width, height, 0, 0, _w, _h);\n        }\n        \n        var image = _cc.getImageData(0,0,_w,_h);\n        var id = image.data;\n        \n        if (params.convertToGrayscale) {\n            // convert to grayscale\n            for (var i = 0;i < _arrlen;i++) {\n                _image_array[i] = id[(4*i)]*0.3;\n                _image_array[i] += id[(4*i)+1]*0.59;\n                _image_array[i] += id[(4*i)+2]*0.11;\n            } \n        } else {\n            // use only one channel\n            for (var i = 0;i < _arrlen;i++) {\n                _image_array[i] = id[(4*i)];\n            } \n        }\n        \n        // preprocess\n        var prepImage = preprocess(_image_array);\n        prepImage = cosine_window(prepImage);\n        \n        // filter\n        var res = this.fft_inplace(prepImage);\n        // elementwise multiplication with filter\n        var nures = complex_mult(res, _filter);\n        // do inverse 2d fft\n        var filtered = this.ifft(nures[0],nures[1]);\n        \n        // find max and min\n        var max = 0;\n        var min = 0;\n        var maxpos = [0, 0];\n        \n        //method using centered gaussian prior\n        if (gaussianPrior) {\n            var prior, dx, dy;\n            var variance = 128;\n            for (var x = 0;x < _w;x++) {\n                for (var y = 0;y < _h;y++) {\n                    dx = x - _w/2;\n                    dy = y - _h/2;\n                    prior = Math.exp(-0.5*((dx*dx)+(dy*dy))/variance);\n                    if ((filtered[(y*_w)+x]*prior) > max) {\n                        max = filtered[(y*_w)+x]*prior;\n                        maxpos = [x,y];\n                    }\n                    if (filtered[(y*_w)+x] < min) {\n                        min = filtered[(y*_w)+x];\n                    }\n                }\n            }\n        } else {\n            for (var x = 0;x < _w;x++) {\n                for (var y = 0;y < _h;y++) {\n                    if (filtered[(y*_w)+x] > max) {\n                        max = filtered[(y*_w)+x];\n                        maxpos = [x,y];\n                    }\n                    if (filtered[(y*_w)+x] < min) {\n                        min = filtered[(y*_w)+x];\n                    }\n                }\n            }\n        }\n        this.peak_prev = max;\n        \n        if (params.drawResponse) {\n            // draw response\n            var diff = max-min;\n            var dc = document.createElement('canvas');\n            dc.setAttribute('width', 32);\n            dc.setAttribute('height', 32);\n            var dcc = dc.getContext('2d');\n            var psci = dcc.createImageData(32, 32);\n            var pscidata = psci.data;\n            for (var j = 0;j < 32*32;j++) {\n                //draw with priors\n                //var val = filtered[j]*Math.exp(-0.5*(((j%_w - _w/2)*(j%_w -_w/2))+((Math.floor(j/_h)-(_h/2))*(Math.floor(j/_h)-(_h/2))))/128);\n                var val = filtered[j];\n                val = Math.round((val+Math.abs(min))*(255/diff));\n                pscidata[j*4] = val;\n                pscidata[(j*4)+1] = val;\n                pscidata[(j*4)+2] = val;\n                pscidata[(j*4)+3] = 255;\n            }\n            dcc.putImageData(psci, 0, 0);\n            responseContext.drawImage(dc, left, top, width, width);\n        }\n        \n        if (calcPSR) {\n          this.psr_prev = this.psr(filtered);\n        }\n        \n        if (updateFilter) {\n            if (!updateable) {\n                console.log(\"The loaded filter does not support updating. Ignoring parameter 'updateFilter'.\");\n            } else {\n                if (calcPSR) {\n                  var psr = this.psr_prev;\n                } else {\n                  var psr = this.psr(filtered);\n                }\n                \n                if (psr > params.psrThreshold) {\n                    // create target\n                    var target = [];\n                    var nux = maxpos[0];\n                    var nuy = maxpos[1];\n                    for (var x = 0;x < _w;x++) {\n                        for (var y = 0;y < _h;y++) {\n                            target[(y*_w)+x] = Math.exp(-(((x-nux)*(x-nux))+((y-nuy)*(y-nuy)))/(2*2));\n                        }\n                    }\n                    \n                    //fft target\n                    target = this.fft(target);\n                    \n                    // create filter\n                    var res_conj = complex_conj(res);\n                    var fuTop = complex_mult(target,res_conj);\n                    var fuBottom = complex_mult(res,res_conj);\n                    \n                    // add up\n                    var eta = params.eta;\n                    for (var i = 0;i < _arrlen;i++) {\n                        _top[0][i] = eta*fuTop[0][i] + (1-eta)*_top[0][i];\n                        _top[1][i] = eta*fuTop[1][i] + (1-eta)*_top[1][i];\n                        _bottom[0][i] = eta*fuBottom[0][i] + (1-eta)*_bottom[0][i];\n                        _bottom[1][i] = eta*fuBottom[1][i] + (1-eta)*_bottom[1][i];\n                    }\n                    \n                    _filter = complex_div(_top,_bottom);\n                }\n            }\n        }\n        \n        /*if (psr < 5) {\n          maxpos = [_w/2,_h/2]; \n        }*/\n        \n        maxpos[0] = maxpos[0]*(width/_w);\n        maxpos[1] = maxpos[1]*(width/_h);\n        \n        // check if output is strong enough\n        // if not, return false?\n        if (max < 0) {\n          return false;\n        } else {\n          return maxpos;\n        }\n    };\n    \n    this.train = function(input, left, top, width, height) {\n        \n        if (!updateable) {\n          console.log(\"The loaded filter does not support updating. Unable to do training.\");\n          return false;\n        }\n        \n        if (input.tagName == \"VIDEO\" || input.tagName == \"IMG\") {\n            // scale selection according to original source image\n            var videoLeft = Math.round((left/input.width)*input.videoWidth);\n            var videoTop = Math.round((top/input.height)*input.videoHeight);\n            var videoWidth = Math.round((width/input.width)*input.videoWidth);\n            var videoHeight = Math.round((height/input.height)*input.videoHeight);\n            _cc.drawImage(input, videoLeft, videoTop, videoWidth, videoHeight, 0, 0, _w, _h);\n        } else if (input.tagName == \"CANVAS\") {\n            _cc.drawImage(input, left, top, width, height, 0, 0, _w, _h);\n        }\n        \n        var image = _cc.getImageData(0,0,_w,_h);\n        var id = image.data;\n         \n        // convert to grayscale\n        for (var i = 0;i < _arrlen;i++) {\n            _image_array[i] = id[(4*i)]*0.3;\n            _image_array[i] += id[(4*i)+1]*0.59;\n            _image_array[i] += id[(4*i)+2]*0.11;\n        }\n        \n        // preprocess\n        var prepImage = preprocess(_image_array);\n        prepImage = cosine_window(prepImage);\n        \n        // create target\n        var target = [];\n        var nux = _w/2;\n        var nuy = _h/2;\n        for (var x = 0;x < _w;x++) {\n            for (var y = 0;y < _h;y++) {\n                target[(y*_w)+x] = Math.exp(-(((x-nux)*(x-nux))+((y-nuy)*(y-nuy)))/(2*2));\n            }\n        }\n        \n        //fft target\n        target = this.fft(target);\n        \n        // filter\n        var res = this.fft(prepImage);\n        // create filter\n        var res_conj = complex_conj(res);\n        var fuTop = complex_mult(target,res_conj);\n        var fuBottom = complex_mult(res,res_conj);\n        \n        // add up\n        var eta = params.eta;\n        for (var i = 0;i < _arrlen;i++) {\n            _top[0][i] = eta*fuTop[0][i] + (1-eta)*_top[0][i];\n            _top[1][i] = eta*fuTop[1][i] + (1-eta)*_top[1][i];\n            _bottom[0][i] = eta*fuBottom[0][i] + (1-eta)*_bottom[0][i];\n            _bottom[1][i] = eta*fuBottom[1][i] + (1-eta)*_bottom[1][i];\n        }\n        \n        _filter = complex_div(_top,_bottom);\n        \n        return true;\n    };\n    \n    var preprocess = function(array) {\n        // in-place\n        \n        // log adjusting\n        for (var i = 0;i < _arrlen;i++) {\n          array[i] = Math.log(array[i]+1);\n        }\n        \n        // normalize to mean 0 and norm 1\n        var mean = 0;\n        for (var i = 0;i < _arrlen;i++) {\n          mean += array[i];\n        }\n        mean /= _arrlen;\n        \n        for (var i = 0;i < _arrlen;i++) {\n          array[i] -= mean;\n        }\n        var norm = 0.0;\n        for (var i = 0;i < _arrlen;i++) {\n          norm += (array[i]*array[i]);\n        }\n        norm = Math.sqrt(norm);\n        if (norm !== 0) {\n            for (var i = 0;i < _arrlen;i++) {\n              array[i] /= norm;\n            }\n        }\n        \n        return array;\n    };\n    \n    var cosine_window = function(array) {\n        // calculate rect cosine window (in-place)\n        var pos = 0;\n        for (var i = 0;i < _w;i++) {\n            for (var j = 0;j < _h;j++) {\n                //pos = (i%_w)+(j*_w);\n                var cww = Math.sin((Math.PI*i)/(_w-1));\n                var cwh = Math.sin((Math.PI*j)/(_h-1));\n                array[pos] = Math.min(cww,cwh)*array[pos];\n                pos++;\n            }\n        }\n        \n        return array;\n    };\n    \n    var complex_mult = function(cn1, cn2) {\n        // not in-place\n        var re_part = new Array(_w);\n        var im_part = new Array(_w);\n        var nucn = [re_part, im_part];\n        for (var r = 0;r < _arrlen;r++) {\n            nucn[0][r] = (cn1[0][r]*cn2[0][r]) - (cn1[1][r]*cn2[1][r]);\n            nucn[1][r] = (cn1[0][r]*cn2[1][r]) + (cn1[1][r]*cn2[0][r]);\n        }\n        return nucn;\n    };\n    \n    var complex_mult_inplace = function(cn1, cn2) {\n        // in-place\n        var temp1, temp2;\n        for (var r = 0;r < _arrlen;r++) {\n            temp1 = (cn1[0][r]*cn2[0][r]) - (cn1[1][r]*cn2[1][r]);\n            temp2 = (cn1[0][r]*cn2[1][r]) + (cn1[1][r]*cn2[0][r]);\n            cn1[0][r] = temp1;\n            cn1[1][r] = temp2;\n        }\n    };\n    \n    var complex_conj = function(cn) {\n        // not in-place (TODO)\n        var nucn = [[],[]];\n        for (var i = 0;i < _arrlen;i++) {\n            nucn[0][i] = cn[0][i];\n            nucn[1][i] = -cn[1][i];\n        }\n        return nucn;\n    };\n    \n    var complex_div = function(cn1, cn2) {\n        // not in-place (TODO)\n        var nucn = [[],[]];\n        for (var r = 0;r < _arrlen;r++) {\n            nucn[0][r] = ((cn1[0][r]*cn2[0][r])+(cn1[1][r]*cn2[1][r])) / ((cn2[0][r]*cn2[0][r]) + (cn2[1][r]*cn2[1][r]));\n            nucn[1][r] = ((cn1[1][r]*cn2[0][r])-(cn1[0][r]*cn2[1][r])) / ((cn2[0][r]*cn2[0][r]) + (cn2[1][r]*cn2[1][r]));\n        }\n        return nucn;\n    };\n}\n\nvar mosse = {\n    mosseFilter : mosseFilter,\n    filters : {\n        left_eye_filter : left_eye_filter,\n        right_eye_filter : right_eye_filter,\n        mouth_filter : mouth_filter,\n        nose_filter : nose_filter,\n        face_filter : face_filter\n    }\n};\n\nvar jsfeat_1 = createCommonjsModule(function (module) {\n/**\n * @author Eugene Zatepyakin / http://inspirit.ru/\n */\n\n// namespace ?\nvar jsfeat = jsfeat || { REVISION: 'ALPHA' };\n\n// PATCHED IN to avoid loading the jsfeat library twice\nwindow.jsfeat = jsfeat;\n\n/**\n * @author Eugene Zatepyakin / http://inspirit.ru/\n */\n\n(function(global) {\n    \"use strict\";\n    //\n\n    // CONSTANTS\n    var EPSILON = 0.0000001192092896;\n    var FLT_MIN = 1E-37;\n\n    // implementation from CCV project\n    // currently working only with u8,s32,f32\n    var U8_t = 0x0100,\n        S32_t = 0x0200,\n        F32_t = 0x0400,\n        S64_t = 0x0800,\n        F64_t = 0x1000;\n\n    var C1_t = 0x01,\n        C2_t = 0x02,\n        C3_t = 0x03,\n        C4_t = 0x04;\n\n    var _data_type_size = new Int32Array([ -1, 1, 4, -1, 4, -1, -1, -1, 8, -1, -1, -1, -1, -1, -1, -1, 8 ]);\n\n    var get_data_type = (function () {\n        return function(type) {\n            return (type & 0xFF00);\n        }\n    })();\n\n    var get_channel = (function () {\n        return function(type) {\n            return (type & 0xFF);\n        }\n    })();\n\n    var get_data_type_size = (function () {\n        return function(type) {\n            return _data_type_size[(type & 0xFF00) >> 8];\n        }\n    })();\n\n    // color conversion\n    var COLOR_RGBA2GRAY = 0;\n    var COLOR_RGB2GRAY = 1;\n    var COLOR_BGRA2GRAY = 2;\n    var COLOR_BGR2GRAY = 3;\n\n    // box blur option\n    var BOX_BLUR_NOSCALE = 0x01;\n    // svd options\n    var SVD_U_T = 0x01;\n    var SVD_V_T = 0x02;\n\n    var data_t = (function () {\n        function data_t(size_in_bytes, buffer) {\n            // we need align size to multiple of 8\n            this.size = ((size_in_bytes + 7) | 0) & -8;\n            if (typeof buffer === \"undefined\") { \n                this.buffer = new ArrayBuffer(this.size);\n            } else {\n                this.buffer = buffer;\n                this.size = buffer.length;\n            }\n            this.u8 = new Uint8Array(this.buffer);\n            this.i32 = new Int32Array(this.buffer);\n            this.f32 = new Float32Array(this.buffer);\n            this.f64 = new Float64Array(this.buffer);\n        }\n        return data_t;\n    })();\n\n    var matrix_t = (function () {\n        // columns, rows, data_type\n        function matrix_t(c, r, data_type, data_buffer) {\n            this.type = get_data_type(data_type)|0;\n            this.channel = get_channel(data_type)|0;\n            this.cols = c|0;\n            this.rows = r|0;\n            if (typeof data_buffer === \"undefined\") { \n                this.allocate();\n            } else {\n                this.buffer = data_buffer;\n                // data user asked for\n                this.data = this.type&U8_t ? this.buffer.u8 : (this.type&S32_t ? this.buffer.i32 : (this.type&F32_t ? this.buffer.f32 : this.buffer.f64));\n            }\n        }\n        matrix_t.prototype.allocate = function() {\n            // clear references\n            delete this.data;\n            delete this.buffer;\n            //\n            this.buffer = new data_t((this.cols * get_data_type_size(this.type) * this.channel) * this.rows);\n            this.data = this.type&U8_t ? this.buffer.u8 : (this.type&S32_t ? this.buffer.i32 : (this.type&F32_t ? this.buffer.f32 : this.buffer.f64));\n        };\n        matrix_t.prototype.copy_to = function(other) {\n            var od = other.data, td = this.data;\n            var i = 0, n = (this.cols*this.rows*this.channel)|0;\n            for(; i < n-4; i+=4) {\n                od[i] = td[i];\n                od[i+1] = td[i+1];\n                od[i+2] = td[i+2];\n                od[i+3] = td[i+3];\n            }\n            for(; i < n; ++i) {\n                od[i] = td[i];\n            }\n        };\n        matrix_t.prototype.resize = function(c, r, ch) {\n            if (typeof ch === \"undefined\") { ch = this.channel; }\n            // relocate buffer only if new size doesnt fit\n            var new_size = (c * get_data_type_size(this.type) * ch) * r;\n            if(new_size > this.buffer.size) {\n                this.cols = c;\n                this.rows = r;\n                this.channel = ch;\n                this.allocate();\n            } else {\n                this.cols = c;\n                this.rows = r;\n                this.channel = ch;\n            }\n        };\n\n        return matrix_t;\n    })();\n\n    var pyramid_t = (function () {\n\n        function pyramid_t(levels) {\n            this.levels = levels|0;\n            this.data = new Array(levels);\n            this.pyrdown = jsfeat.imgproc.pyrdown;\n        }\n\n        pyramid_t.prototype.allocate = function(start_w, start_h, data_type) {\n            var i = this.levels;\n            while(--i >= 0) {\n                this.data[i] = new matrix_t(start_w >> i, start_h >> i, data_type);\n            }\n        };\n\n        pyramid_t.prototype.build = function(input, skip_first_level) {\n            if (typeof skip_first_level === \"undefined\") { skip_first_level = true; }\n            // just copy data to first level\n            var i = 2, a = input, b = this.data[0];\n            if(!skip_first_level) {\n                var j=input.cols*input.rows;\n                while(--j >= 0) {\n                    b.data[j] = input.data[j];\n                }\n            }\n            b = this.data[1];\n            this.pyrdown(a, b);\n            for(; i < this.levels; ++i) {\n                a = b;\n                b = this.data[i];\n                this.pyrdown(a, b);\n            }\n        };\n\n        return pyramid_t;\n    })();\n\n    var keypoint_t = (function () {\n        function keypoint_t(x,y,score,level,angle) {\n            if (typeof x === \"undefined\") { x=0; }\n            if (typeof y === \"undefined\") { y=0; }\n            if (typeof score === \"undefined\") { score=0; }\n            if (typeof level === \"undefined\") { level=0; }\n            if (typeof angle === \"undefined\") { angle=-1.0; }\n\n            this.x = x;\n            this.y = y;\n            this.score = score;\n            this.level = level;\n            this.angle = angle;\n        }\n        return keypoint_t;\n    })();\n\n\n    // data types\n    global.U8_t = U8_t;\n    global.S32_t = S32_t;\n    global.F32_t = F32_t;\n    global.S64_t = S64_t;\n    global.F64_t = F64_t;\n    // data channels\n    global.C1_t = C1_t;\n    global.C2_t = C2_t;\n    global.C3_t = C3_t;\n    global.C4_t = C4_t;\n\n    // popular formats\n    global.U8C1_t = U8_t | C1_t;\n    global.U8C3_t = U8_t | C3_t;\n    global.U8C4_t = U8_t | C4_t;\n\n    global.F32C1_t = F32_t | C1_t;\n    global.F32C2_t = F32_t | C2_t;\n    global.S32C1_t = S32_t | C1_t;\n    global.S32C2_t = S32_t | C2_t;\n\n    // constants\n    global.EPSILON = EPSILON;\n    global.FLT_MIN = FLT_MIN;\n\n    // color convert\n    global.COLOR_RGBA2GRAY = COLOR_RGBA2GRAY;\n    global.COLOR_RGB2GRAY = COLOR_RGB2GRAY;\n    global.COLOR_BGRA2GRAY = COLOR_BGRA2GRAY;\n    global.COLOR_BGR2GRAY = COLOR_BGR2GRAY;\n\n    // options\n    global.BOX_BLUR_NOSCALE = BOX_BLUR_NOSCALE;\n    global.SVD_U_T = SVD_U_T;\n    global.SVD_V_T = SVD_V_T;\n\n    global.get_data_type = get_data_type;\n    global.get_channel = get_channel;\n    global.get_data_type_size = get_data_type_size;\n\n    global.data_t = data_t;\n    global.matrix_t = matrix_t;\n    global.pyramid_t = pyramid_t;\n    global.keypoint_t = keypoint_t;\n\n})(jsfeat);\n/**\n * @author Eugene Zatepyakin / http://inspirit.ru/\n */\n\n(function(global) {\n    \"use strict\";\n    //\n\n    var cache = (function() {\n\n        // very primitive array cache, still need testing if it helps\n        // of course V8 has its own powerful cache sys but i'm not sure\n        // it caches several multichannel 640x480 buffer creations each frame\n\n        var _pool_node_t = (function () {\n            function _pool_node_t(size_in_bytes) {\n                this.next = null;\n                this.data = new jsfeat.data_t(size_in_bytes);\n                this.size = this.data.size;\n                this.buffer = this.data.buffer;\n                this.u8 = this.data.u8;\n                this.i32 = this.data.i32;\n                this.f32 = this.data.f32;\n                this.f64 = this.data.f64;\n            }\n            _pool_node_t.prototype.resize = function(size_in_bytes) {\n                delete this.data;\n                this.data = new jsfeat.data_t(size_in_bytes);\n                this.size = this.data.size;\n                this.buffer = this.data.buffer;\n                this.u8 = this.data.u8;\n                this.i32 = this.data.i32;\n                this.f32 = this.data.f32;\n                this.f64 = this.data.f64;\n            };\n            return _pool_node_t;\n        })();\n\n        var _pool_head, _pool_tail;\n        var _pool_size = 0;\n\n        return {\n\n            allocate: function(capacity, data_size) {\n                _pool_head = _pool_tail = new _pool_node_t(data_size);\n                for (var i = 0; i < capacity; ++i) {\n                    var node = new _pool_node_t(data_size);\n                    _pool_tail = _pool_tail.next = node;\n\n                    _pool_size++;\n                }\n            },\n\n            get_buffer: function(size_in_bytes) {\n                // assume we have enough free nodes\n                var node = _pool_head;\n                _pool_head = _pool_head.next;\n                _pool_size--;\n\n                if(size_in_bytes > node.size) {\n                    node.resize(size_in_bytes);\n                }\n\n                return node;\n            },\n\n            put_buffer: function(node) {\n                _pool_tail = _pool_tail.next = node;\n                _pool_size++;\n            }\n        };\n    })();\n\n    global.cache = cache;\n    // for now we dont need more than 30 buffers\n    // if having cache sys really helps we can add auto extending sys\n    cache.allocate(30, 640*4);\n\n})(jsfeat);\n/**\n * @author Eugene Zatepyakin / http://inspirit.ru/\n */\n\n(function(global) {\n    \"use strict\";\n    //\n\n    var math = (function() {\n\n        var qsort_stack = new Int32Array(48*2);\n\n        return {\n            get_gaussian_kernel: function(size, sigma, kernel, data_type) {\n                var i=0,x=0.0,t=0.0,sigma_x=0.0,scale_2x=0.0;\n                var sum = 0.0;\n                var kern_node = jsfeat.cache.get_buffer(size<<2);\n                var _kernel = kern_node.f32;//new Float32Array(size);\n\n                if((size&1) == 1 && size <= 7 && sigma <= 0) {\n                    switch(size>>1) {\n                        case 0:\n                        _kernel[0] = 1.0;\n                        sum = 1.0;\n                        break;\n                        case 1:\n                        _kernel[0] = 0.25, _kernel[1] = 0.5, _kernel[2] = 0.25;\n                        sum = 0.25+0.5+0.25;\n                        break;\n                        case 2:\n                        _kernel[0] = 0.0625, _kernel[1] = 0.25, _kernel[2] = 0.375, \n                        _kernel[3] = 0.25, _kernel[4] = 0.0625;\n                        sum = 0.0625+0.25+0.375+0.25+0.0625;\n                        break;\n                        case 3:\n                        _kernel[0] = 0.03125, _kernel[1] = 0.109375, _kernel[2] = 0.21875, \n                        _kernel[3] = 0.28125, _kernel[4] = 0.21875, _kernel[5] = 0.109375, _kernel[6] = 0.03125;\n                        sum = 0.03125+0.109375+0.21875+0.28125+0.21875+0.109375+0.03125;\n                        break;\n                    }\n                } else {\n                    sigma_x = sigma > 0 ? sigma : ((size-1)*0.5 - 1.0)*0.3 + 0.8;\n                    scale_2x = -0.5/(sigma_x*sigma_x);\n\n                    for( ; i < size; ++i )\n                    {\n                        x = i - (size-1)*0.5;\n                        t = Math.exp(scale_2x*x*x);\n\n                        _kernel[i] = t;\n                        sum += t;\n                    }\n                }\n\n                if(data_type & jsfeat.U8_t) {\n                    // int based kernel\n                    sum = 256.0/sum;\n                    for (i = 0; i < size; ++i) {\n                        kernel[i] = (_kernel[i] * sum + 0.5)|0;\n                    }\n                } else {\n                    // classic kernel\n                    sum = 1.0/sum;\n                    for (i = 0; i < size; ++i) {\n                        kernel[i] = _kernel[i] * sum;\n                    }\n                }\n\n                jsfeat.cache.put_buffer(kern_node);\n            },\n\n            // model is 3x3 matrix_t\n            perspective_4point_transform: function(model, src_x0, src_y0, dst_x0, dst_y0,\n                                                        src_x1, src_y1, dst_x1, dst_y1,\n                                                        src_x2, src_y2, dst_x2, dst_y2,\n                                                        src_x3, src_y3, dst_x3, dst_y3) {\n                var t1 = src_x0;\n                var t2 = src_x2;\n                var t4 = src_y1;\n                var t5 = t1 * t2 * t4;\n                var t6 = src_y3;\n                var t7 = t1 * t6;\n                var t8 = t2 * t7;\n                var t9 = src_y2;\n                var t10 = t1 * t9;\n                var t11 = src_x1;\n                var t14 = src_y0;\n                var t15 = src_x3;\n                var t16 = t14 * t15;\n                var t18 = t16 * t11;\n                var t20 = t15 * t11 * t9;\n                var t21 = t15 * t4;\n                var t24 = t15 * t9;\n                var t25 = t2 * t4;\n                var t26 = t6 * t2;\n                var t27 = t6 * t11;\n                var t28 = t9 * t11;\n                var t30 = 1.0 / (t21-t24 - t25 + t26 - t27 + t28);\n                var t32 = t1 * t15;\n                var t35 = t14 * t11;\n                var t41 = t4 * t1;\n                var t42 = t6 * t41;\n                var t43 = t14 * t2;\n                var t46 = t16 * t9;\n                var t48 = t14 * t9 * t11;\n                var t51 = t4 * t6 * t2;\n                var t55 = t6 * t14;\n                var Hr0 = -(t8-t5 + t10 * t11 - t11 * t7 - t16 * t2 + t18 - t20 + t21 * t2) * t30;\n                var Hr1 = (t5 - t8 - t32 * t4 + t32 * t9 + t18 - t2 * t35 + t27 * t2 - t20) * t30;\n                var Hr2 = t1;\n                var Hr3 = (-t9 * t7 + t42 + t43 * t4 - t16 * t4 + t46 - t48 + t27 * t9 - t51) * t30;\n                var Hr4 = (-t42 + t41 * t9 - t55 * t2 + t46 - t48 + t55 * t11 + t51 - t21 * t9) * t30;\n                var Hr5 = t14;\n                var Hr6 = (-t10 + t41 + t43 - t35 + t24 - t21 - t26 + t27) * t30;\n                var Hr7 = (-t7 + t10 + t16 - t43 + t27 - t28 - t21 + t25) * t30;\n                \n                t1 = dst_x0;\n                t2 = dst_x2;\n                t4 = dst_y1;\n                t5 = t1 * t2 * t4;\n                t6 = dst_y3;\n                t7 = t1 * t6;\n                t8 = t2 * t7;\n                t9 = dst_y2;\n                t10 = t1 * t9;\n                t11 = dst_x1;\n                t14 = dst_y0;\n                t15 = dst_x3;\n                t16 = t14 * t15;\n                t18 = t16 * t11;\n                t20 = t15 * t11 * t9;\n                t21 = t15 * t4;\n                t24 = t15 * t9;\n                t25 = t2 * t4;\n                t26 = t6 * t2;\n                t27 = t6 * t11;\n                t28 = t9 * t11;\n                t30 = 1.0 / (t21-t24 - t25 + t26 - t27 + t28);\n                t32 = t1 * t15;\n                t35 = t14 * t11;\n                t41 = t4 * t1;\n                t42 = t6 * t41;\n                t43 = t14 * t2;\n                t46 = t16 * t9;\n                t48 = t14 * t9 * t11;\n                t51 = t4 * t6 * t2;\n                t55 = t6 * t14;\n                var Hl0 = -(t8-t5 + t10 * t11 - t11 * t7 - t16 * t2 + t18 - t20 + t21 * t2) * t30;\n                var Hl1 = (t5 - t8 - t32 * t4 + t32 * t9 + t18 - t2 * t35 + t27 * t2 - t20) * t30;\n                var Hl2 = t1;\n                var Hl3 = (-t9 * t7 + t42 + t43 * t4 - t16 * t4 + t46 - t48 + t27 * t9 - t51) * t30;\n                var Hl4 = (-t42 + t41 * t9 - t55 * t2 + t46 - t48 + t55 * t11 + t51 - t21 * t9) * t30;\n                var Hl5 = t14;\n                var Hl6 = (-t10 + t41 + t43 - t35 + t24 - t21 - t26 + t27) * t30;\n                var Hl7 = (-t7 + t10 + t16 - t43 + t27 - t28 - t21 + t25) * t30;\n\n                // the following code computes R = Hl * inverse Hr\n                t2 = Hr4-Hr7*Hr5;\n                t4 = Hr0*Hr4;\n                t5 = Hr0*Hr5;\n                t7 = Hr3*Hr1;\n                t8 = Hr2*Hr3;\n                t10 = Hr1*Hr6;\n                var t12 = Hr2*Hr6;\n                t15 = 1.0 / (t4-t5*Hr7-t7+t8*Hr7+t10*Hr5-t12*Hr4);\n                t18 = -Hr3+Hr5*Hr6;\n                var t23 = -Hr3*Hr7+Hr4*Hr6;\n                t28 = -Hr1+Hr2*Hr7;\n                var t31 = Hr0-t12;\n                t35 = Hr0*Hr7-t10;\n                t41 = -Hr1*Hr5+Hr2*Hr4;\n                var t44 = t5-t8;\n                var t47 = t4-t7;\n                t48 = t2*t15;\n                var t49 = t28*t15;\n                var t50 = t41*t15;\n                var mat = model.data;\n                mat[0] = Hl0*t48+Hl1*(t18*t15)-Hl2*(t23*t15);\n                mat[1] = Hl0*t49+Hl1*(t31*t15)-Hl2*(t35*t15);\n                mat[2] = -Hl0*t50-Hl1*(t44*t15)+Hl2*(t47*t15);\n                mat[3] = Hl3*t48+Hl4*(t18*t15)-Hl5*(t23*t15);\n                mat[4] = Hl3*t49+Hl4*(t31*t15)-Hl5*(t35*t15);\n                mat[5] = -Hl3*t50-Hl4*(t44*t15)+Hl5*(t47*t15);\n                mat[6] = Hl6*t48+Hl7*(t18*t15)-t23*t15;\n                mat[7] = Hl6*t49+Hl7*(t31*t15)-t35*t15;\n                mat[8] = -Hl6*t50-Hl7*(t44*t15)+t47*t15;\n            },\n\n            // The current implementation was derived from *BSD system qsort():\n            // Copyright (c) 1992, 1993\n            // The Regents of the University of California.  All rights reserved.\n            qsort: function(array, low, high, cmp) {\n                var isort_thresh = 7;\n                var t,ta,tb,tc;\n                var sp = 0,left=0,right=0,i=0,n=0,m=0,ptr=0,ptr2=0,d=0;\n                var left0=0,left1=0,right0=0,right1=0,pivot=0,a=0,b=0,c=0,swap_cnt=0;\n\n                var stack = qsort_stack;\n\n                if( (high-low+1) <= 1 ) return;\n\n                stack[0] = low;\n                stack[1] = high;\n\n                while( sp >= 0 ) {\n                \n                    left = stack[sp<<1];\n                    right = stack[(sp<<1)+1];\n                    sp--;\n\n                    for(;;) {\n                        n = (right - left) + 1;\n\n                        if( n <= isort_thresh ) {\n                        //insert_sort:\n                            for( ptr = left + 1; ptr <= right; ptr++ ) {\n                                for( ptr2 = ptr; ptr2 > left && cmp(array[ptr2],array[ptr2-1]); ptr2--) {\n                                    t = array[ptr2];\n                                    array[ptr2] = array[ptr2-1];\n                                    array[ptr2-1] = t;\n                                }\n                            }\n                            break;\n                        } else {\n                            swap_cnt = 0;\n\n                            left0 = left;\n                            right0 = right;\n                            pivot = left + (n>>1);\n\n                            if( n > 40 ) {\n                                d = n >> 3;\n                                a = left, b = left + d, c = left + (d<<1);\n                                ta = array[a],tb = array[b],tc = array[c];\n                                left = cmp(ta, tb) ? (cmp(tb, tc) ? b : (cmp(ta, tc) ? c : a))\n                                                  : (cmp(tc, tb) ? b : (cmp(ta, tc) ? a : c));\n\n                                a = pivot - d, b = pivot, c = pivot + d;\n                                ta = array[a],tb = array[b],tc = array[c];\n                                pivot = cmp(ta, tb) ? (cmp(tb, tc) ? b : (cmp(ta, tc) ? c : a))\n                                                  : (cmp(tc, tb) ? b : (cmp(ta, tc) ? a : c));\n\n                                a = right - (d<<1), b = right - d, c = right;\n                                ta = array[a],tb = array[b],tc = array[c];\n                                right = cmp(ta, tb) ? (cmp(tb, tc) ? b : (cmp(ta, tc) ? c : a))\n                                                  : (cmp(tc, tb) ? b : (cmp(ta, tc) ? a : c));\n                            }\n\n                            a = left, b = pivot, c = right;\n                            ta = array[a],tb = array[b],tc = array[c];\n                            pivot = cmp(ta, tb) ? (cmp(tb, tc) ? b : (cmp(ta, tc) ? c : a))   \n                                               : (cmp(tc, tb) ? b : (cmp(ta, tc) ? a : c));\n                            if( pivot != left0 ) {\n                                t = array[pivot];\n                                array[pivot] = array[left0];\n                                array[left0] = t;\n                                pivot = left0;\n                            }\n                            left = left1 = left0 + 1;\n                            right = right1 = right0;\n\n                            ta = array[pivot];\n                            for(;;) {\n                                while( left <= right && !cmp(ta, array[left]) ) {\n                                    if( !cmp(array[left], ta) ) {\n                                        if( left > left1 ) {\n                                            t = array[left1];\n                                            array[left1] = array[left];\n                                            array[left] = t;\n                                        }\n                                        swap_cnt = 1;\n                                        left1++;\n                                    }\n                                    left++;\n                                }\n\n                                while( left <= right && !cmp(array[right], ta) ) {\n                                    if( !cmp(ta, array[right]) ) {\n                                        if( right < right1 ) {\n                                            t = array[right1];\n                                            array[right1] = array[right];\n                                            array[right] = t;\n                                        }\n                                        swap_cnt = 1;\n                                        right1--;\n                                    }\n                                    right--;\n                                }\n\n                                if( left > right ) break;\n                                \n                                t = array[left];\n                                array[left] = array[right];\n                                array[right] = t;\n                                swap_cnt = 1;\n                                left++;\n                                right--;\n                            }\n\n                            if( swap_cnt == 0 ) {\n                                left = left0, right = right0;\n                                //goto insert_sort;\n                                for( ptr = left + 1; ptr <= right; ptr++ ) {\n                                    for( ptr2 = ptr; ptr2 > left && cmp(array[ptr2],array[ptr2-1]); ptr2--) {\n                                        t = array[ptr2];\n                                        array[ptr2] = array[ptr2-1];\n                                        array[ptr2-1] = t;\n                                    }\n                                }\n                                break;\n                            }\n\n                            n = Math.min( (left1 - left0), (left - left1) );\n                            m = (left-n)|0;\n                            for( i = 0; i < n; ++i,++m ) {\n                                t = array[left0+i];\n                                array[left0+i] = array[m];\n                                array[m] = t;\n                            }\n\n                            n = Math.min( (right0 - right1), (right1 - right) );\n                            m = (right0-n+1)|0;\n                            for( i = 0; i < n; ++i,++m ) {\n                                t = array[left+i];\n                                array[left+i] = array[m];\n                                array[m] = t;\n                            }\n                            n = (left - left1);\n                            m = (right1 - right);\n                            if( n > 1 ) {\n                                if( m > 1 ) {\n                                    if( n > m ) {\n                                        ++sp;\n                                        stack[sp<<1] = left0;\n                                        stack[(sp<<1)+1] = left0 + n - 1;\n                                        left = right0 - m + 1, right = right0;\n                                    } else {\n                                        ++sp;\n                                        stack[sp<<1] = right0 - m + 1;\n                                        stack[(sp<<1)+1] = right0;\n                                        left = left0, right = left0 + n - 1;\n                                    }\n                                } else {\n                                    left = left0, right = left0 + n - 1;\n                                }\n                            }\n                            else if( m > 1 )\n                                left = right0 - m + 1, right = right0;\n                            else\n                                break;\n                        }\n                    }\n                }\n            },\n\n            median: function(array, low, high) {\n                var w;\n                var middle=0,ll=0,hh=0,median=(low+high)>>1;\n                for (;;) {\n                    if (high <= low) return array[median];\n                    if (high == (low + 1)) {\n                        if (array[low] > array[high]) {\n                            w = array[low];\n                            array[low] = array[high];\n                            array[high] = w;\n                        }\n                        return array[median];\n                    }\n                    middle = ((low + high) >> 1);\n                    if (array[middle] > array[high]) {\n                        w = array[middle];\n                        array[middle] = array[high];\n                        array[high] = w;\n                    }\n                    if (array[low] > array[high]) {\n                        w = array[low];\n                        array[low] = array[high];\n                        array[high] = w;\n                    }\n                    if (array[middle] > array[low]) {\n                        w = array[middle];\n                        array[middle] = array[low];\n                        array[low] = w;\n                    }\n                    ll = (low + 1);\n                    w = array[middle];\n                    array[middle] = array[ll];\n                    array[ll] = w;\n                    hh = high;\n                    for (;;) {\n                        do ++ll; while (array[low] > array[ll]);\n                        do --hh; while (array[hh] > array[low]);\n                        if (hh < ll) break;\n                        w = array[ll];\n                        array[ll] = array[hh];\n                        array[hh] = w;\n                    }\n                    w = array[low];\n                    array[low] = array[hh];\n                    array[hh] = w;\n                    if (hh <= median)\n                        low = ll;\n                    else if (hh >= median)\n                        high = (hh - 1);\n                }\n                return 0;\n            }\n        };\n\n    })();\n\n    global.math = math;\n\n})(jsfeat);\n/**\n * @author Eugene Zatepyakin / http://inspirit.ru/\n *\n */\n\n(function(global) {\n    \"use strict\";\n    //\n\n    var matmath = (function() {\n        \n        return {\n            identity: function(M, value) {\n                if (typeof value === \"undefined\") { value=1; }\n                var src=M.data;\n                var rows=M.rows, cols=M.cols, cols_1=(cols+1)|0;\n                var len = rows * cols;\n                var k = len;\n                while(--len >= 0) src[len] = 0.0;\n                len = k;\n                k = 0;\n                while(k < len)  {\n                    src[k] = value;\n                    k = k + cols_1;\n                }\n            },\n\n            transpose: function(At, A) {\n                var i=0,j=0,nrows=A.rows,ncols=A.cols;\n                var Ai=0,Ati=0,pAt=0;\n                var ad=A.data,atd=At.data;\n\n                for (; i < nrows; Ati += 1, Ai += ncols, i++) {\n                    pAt = Ati;\n                    for (j = 0; j < ncols; pAt += nrows, j++) atd[pAt] = ad[Ai+j];\n                }\n            },\n\n            // C = A * B\n            multiply: function(C, A, B) {\n                var i=0,j=0,k=0;\n                var Ap=0,pA=0,pB=0,p_B=0,Cp=0;\n                var ncols=A.cols,nrows=A.rows,mcols=B.cols;\n                var ad=A.data,bd=B.data,cd=C.data;\n                var sum=0.0;\n\n                for (; i < nrows; Ap += ncols, i++) {\n                    for (p_B = 0, j = 0; j < mcols; Cp++, p_B++, j++) {\n                        pB = p_B;\n                        pA = Ap;\n                        sum = 0.0;\n                        for (k = 0; k < ncols; pA++, pB += mcols, k++) {\n                            sum += ad[pA] * bd[pB];\n                        }\n                        cd[Cp] = sum;\n                    }\n                }\n            },\n\n            // C = A * B'\n            multiply_ABt: function(C, A, B) {\n                var i=0,j=0,k=0;\n                var Ap=0,pA=0,pB=0,Cp=0;\n                var ncols=A.cols,nrows=A.rows,mrows=B.rows;\n                var ad=A.data,bd=B.data,cd=C.data;\n                var sum=0.0;\n\n                for (; i < nrows; Ap += ncols, i++) {\n                    for (pB = 0, j = 0; j < mrows; Cp++, j++) {\n                        pA = Ap;\n                        sum = 0.0;\n                        for (k = 0; k < ncols; pA++, pB++, k++) {\n                            sum += ad[pA] * bd[pB];\n                        }\n                        cd[Cp] = sum;\n                    }\n                }\n            },\n\n            // C = A' * B\n            multiply_AtB: function(C, A, B) {\n                var i=0,j=0,k=0;\n                var Ap=0,pA=0,pB=0,p_B=0,Cp=0;\n                var ncols=A.cols,nrows=A.rows,mcols=B.cols;\n                var ad=A.data,bd=B.data,cd=C.data;\n                var sum=0.0;\n\n                for (; i < ncols; Ap++, i++) {\n                    for (p_B = 0, j = 0; j < mcols; Cp++, p_B++, j++) {\n                        pB = p_B;\n                        pA = Ap;\n                        sum = 0.0;\n                        for (k = 0; k < nrows; pA += ncols, pB += mcols, k++) {\n                            sum += ad[pA] * bd[pB];\n                        }\n                        cd[Cp] = sum;\n                    }\n                }\n            },\n\n            // C = A * A'\n            multiply_AAt: function(C, A) {\n                var i=0,j=0,k=0;\n                var pCdiag=0,p_A=0,pA=0,pB=0,pC=0,pCt=0;\n                var ncols=A.cols,nrows=A.rows;\n                var ad=A.data,cd=C.data;\n                var sum=0.0;\n\n                for (; i < nrows; pCdiag += nrows + 1, p_A = pA, i++) {\n                    pC = pCdiag;\n                    pCt = pCdiag;\n                    pB = p_A; \n                    for (j = i; j < nrows; pC++, pCt += nrows, j++) {\n                        pA = p_A;\n                        sum = 0.0;\n                        for (k = 0; k < ncols; k++) {\n                            sum += ad[pA++] * ad[pB++];\n                        }\n                        cd[pC] = sum;\n                        cd[pCt] = sum;\n                    }\n                }\n            },\n\n            // C = A' * A\n            multiply_AtA: function(C, A) {\n                var i=0,j=0,k=0;\n                var p_A=0,pA=0,pB=0,p_C=0,pC=0,p_CC=0;\n                var ncols=A.cols,nrows=A.rows;\n                var ad=A.data,cd=C.data;\n                var sum=0.0;\n\n                for (; i < ncols; p_C += ncols, i++) {\n                    p_A = i;\n                    p_CC = p_C + i;\n                    pC = p_CC;\n                    for (j = i; j < ncols; pC++, p_CC += ncols, j++) {\n                        pA = p_A;\n                        pB = j;\n                        sum = 0.0;\n                        for (k = 0; k < nrows; pA += ncols, pB += ncols, k++) {\n                            sum += ad[pA] * ad[pB];\n                        }\n                        cd[pC] = sum;\n                        cd[p_CC] = sum;\n                    }\n                }\n            },\n\n            // various small matrix operations\n            identity_3x3: function(M, value) {\n                if (typeof value === \"undefined\") { value=1; }\n                var dt=M.data;\n                dt[0] = dt[4] = dt[8] = value;\n                dt[1] = dt[2] = dt[3] = 0;\n                dt[5] = dt[6] = dt[7] = 0;\n            },\n\n            invert_3x3: function(from, to) {\n                var A = from.data, invA = to.data;\n                var t1 = A[4];\n                var t2 = A[8];\n                var t4 = A[5];\n                var t5 = A[7];\n                var t8 = A[0];\n\n                var t9 = t8*t1;\n                var t11 = t8*t4;\n                var t13 = A[3];\n                var t14 = A[1];\n                var t15 = t13*t14;\n                var t17 = A[2];\n                var t18 = t13*t17;\n                var t20 = A[6];\n                var t21 = t20*t14;\n                var t23 = t20*t17;\n                var t26 = 1.0/(t9*t2-t11*t5-t15*t2+t18*t5+t21*t4-t23*t1);\n                invA[0] = (t1*t2-t4*t5)*t26;\n                invA[1] = -(t14*t2-t17*t5)*t26;\n                invA[2] = -(-t14*t4+t17*t1)*t26;\n                invA[3] = -(t13*t2-t4*t20)*t26;\n                invA[4] = (t8*t2-t23)*t26;\n                invA[5] = -(t11-t18)*t26;\n                invA[6] = -(-t13*t5+t1*t20)*t26;\n                invA[7] = -(t8*t5-t21)*t26;\n                invA[8] = (t9-t15)*t26;\n            },\n            // C = A * B\n            multiply_3x3: function(C, A, B) {\n                var Cd=C.data, Ad=A.data, Bd=B.data;\n                var m1_0 = Ad[0], m1_1 = Ad[1], m1_2 = Ad[2];\n                var m1_3 = Ad[3], m1_4 = Ad[4], m1_5 = Ad[5];\n                var m1_6 = Ad[6], m1_7 = Ad[7], m1_8 = Ad[8];\n\n                var m2_0 = Bd[0], m2_1 = Bd[1], m2_2 = Bd[2];\n                var m2_3 = Bd[3], m2_4 = Bd[4], m2_5 = Bd[5];\n                var m2_6 = Bd[6], m2_7 = Bd[7], m2_8 = Bd[8];\n\n                Cd[0] = m1_0 * m2_0 + m1_1 * m2_3 + m1_2 * m2_6;\n                Cd[1] = m1_0 * m2_1 + m1_1 * m2_4 + m1_2 * m2_7;\n                Cd[2] = m1_0 * m2_2 + m1_1 * m2_5 + m1_2 * m2_8;\n                Cd[3] = m1_3 * m2_0 + m1_4 * m2_3 + m1_5 * m2_6;\n                Cd[4] = m1_3 * m2_1 + m1_4 * m2_4 + m1_5 * m2_7;\n                Cd[5] = m1_3 * m2_2 + m1_4 * m2_5 + m1_5 * m2_8;\n                Cd[6] = m1_6 * m2_0 + m1_7 * m2_3 + m1_8 * m2_6;\n                Cd[7] = m1_6 * m2_1 + m1_7 * m2_4 + m1_8 * m2_7;\n                Cd[8] = m1_6 * m2_2 + m1_7 * m2_5 + m1_8 * m2_8;\n            },\n\n            mat3x3_determinant: function(M) {\n                var md=M.data;\n                return  md[0] * md[4] * md[8] -\n                        md[0] * md[5] * md[7] -\n                        md[3] * md[1] * md[8] +\n                        md[3] * md[2] * md[7] +\n                        md[6] * md[1] * md[5] -\n                        md[6] * md[2] * md[4];\n            },\n\n            determinant_3x3: function(M11, M12, M13, \n                                      M21, M22, M23, \n                                      M31, M32, M33) {\n                return  M11 * M22 * M33 - M11 * M23 * M32 -\n                          M21 * M12 * M33 + M21 * M13 * M32 +\n                          M31 * M12 * M23 - M31 * M13 * M22;\n            }\n        };\n\n    })();\n\n    global.matmath = matmath;\n\n})(jsfeat);\n/**\n * @author Eugene Zatepyakin / http://inspirit.ru/\n *\n */\n\n(function(global) {\n    \"use strict\";\n    //\n\n    var linalg = (function() {\n\n        var swap = function(A, i0, i1, t) {\n            t = A[i0];\n            A[i0] = A[i1];\n            A[i1] = t;\n        };\n\n        var hypot = function(a, b) {\n            a = Math.abs(a);\n            b = Math.abs(b);\n            if( a > b ) {\n                b /= a;\n                return a*Math.sqrt(1.0 + b*b);\n            }\n            if( b > 0 ) {\n                a /= b;\n                return b*Math.sqrt(1.0 + a*a);\n            }\n            return 0.0;\n        };\n\n        var JacobiImpl = function(A, astep, W, V, vstep, n) {\n            var eps = jsfeat.EPSILON;\n            var i=0,j=0,k=0,m=0,l=0,idx=0,_in=0,_in2=0;\n            var iters=0,max_iter=n*n*30;\n            var mv=0.0,val=0.0,p=0.0,y=0.0,t=0.0,s=0.0,c=0.0,a0=0.0,b0=0.0;\n\n            var indR_buff = jsfeat.cache.get_buffer(n<<2);\n            var indC_buff = jsfeat.cache.get_buffer(n<<2);\n            var indR = indR_buff.i32;\n            var indC = indC_buff.i32;\n\n            if(V) {\n                for(; i < n; i++) {\n                    k = i*vstep;\n                    for(j = 0; j < n; j++) {\n                        V[k + j] = 0.0;\n                    }\n                    V[k + i] = 1.0;\n                }\n            }\n\n            for(k = 0; k < n; k++) {\n                W[k] = A[(astep + 1)*k];\n                if(k < n - 1) {\n                    for(m = k+1, mv = Math.abs(A[astep*k + m]), i = k+2; i < n; i++) {\n                        val = Math.abs(A[astep*k+i]);\n                        if(mv < val)\n                            mv = val, m = i;\n                    }\n                    indR[k] = m;\n                }\n                if(k > 0) {\n                    for(m = 0, mv = Math.abs(A[k]), i = 1; i < k; i++) {\n                        val = Math.abs(A[astep*i+k]);\n                        if(mv < val)\n                            mv = val, m = i;\n                    }\n                    indC[k] = m;\n                }\n            }\n\n            if(n > 1) for( ; iters < max_iter; iters++) {\n                // find index (k,l) of pivot p\n                for(k = 0, mv = Math.abs(A[indR[0]]), i = 1; i < n-1; i++) {\n                    val = Math.abs(A[astep*i + indR[i]]);\n                    if( mv < val )\n                        mv = val, k = i;\n                }\n                l = indR[k];\n                for(i = 1; i < n; i++) {\n                    val = Math.abs(A[astep*indC[i] + i]);\n                    if( mv < val )\n                        mv = val, k = indC[i], l = i;\n                }\n                \n                p = A[astep*k + l];\n\n                if(Math.abs(p) <= eps) break;\n\n                y = (W[l] - W[k])*0.5;\n                t = Math.abs(y) + hypot(p, y);\n                s = hypot(p, t);\n                c = t/s;\n                s = p/s; t = (p/t)*p;\n                if(y < 0)\n                    s = -s, t = -t;\n                A[astep*k + l] = 0;\n                \n                W[k] -= t;\n                W[l] += t;\n                \n                // rotate rows and columns k and l\n                for (i = 0; i < k; i++) {\n                    _in = (astep * i + k);\n                    _in2 = (astep * i + l);\n                    a0 = A[_in];\n                    b0 = A[_in2];\n                    A[_in] = a0 * c - b0 * s;\n                    A[_in2] = a0 * s + b0 * c;\n                }\n                for (i = (k + 1); i < l; i++) {\n                    _in = (astep * k + i);\n                    _in2 = (astep * i + l);\n                    a0 = A[_in];\n                    b0 = A[_in2];\n                    A[_in] = a0 * c - b0 * s;\n                    A[_in2] = a0 * s + b0 * c;\n                }\n                i = l + 1;\n                _in = (astep * k + i);\n                _in2 = (astep * l + i);\n                for (; i < n; i++, _in++, _in2++) {\n                    a0 = A[_in];\n                    b0 = A[_in2];\n                    A[_in] = a0 * c - b0 * s;\n                    A[_in2] = a0 * s + b0 * c;\n                }\n                \n                // rotate eigenvectors\n                if (V) {\n                    _in = vstep * k;\n                    _in2 = vstep * l;\n                    for (i = 0; i < n; i++, _in++, _in2++) {\n                        a0 = V[_in];\n                        b0 = V[_in2];\n                        V[_in] = a0 * c - b0 * s;\n                        V[_in2] = a0 * s + b0 * c;\n                    }\n                }\n                \n                for(j = 0; j < 2; j++) {\n                    idx = j == 0 ? k : l;\n                    if(idx < n - 1) {\n                        for(m = idx+1, mv = Math.abs(A[astep*idx + m]), i = idx+2; i < n; i++) {\n                            val = Math.abs(A[astep*idx+i]);\n                            if( mv < val )\n                                mv = val, m = i;\n                        }\n                        indR[idx] = m;\n                    }\n                    if(idx > 0) {\n                        for(m = 0, mv = Math.abs(A[idx]), i = 1; i < idx; i++) {\n                            val = Math.abs(A[astep*i+idx]);\n                            if( mv < val )\n                                mv = val, m = i;\n                        }\n                        indC[idx] = m;\n                    }\n                }\n            }\n\n            // sort eigenvalues & eigenvectors\n            for(k = 0; k < n-1; k++) {\n                m = k;\n                for(i = k+1; i < n; i++) {\n                    if(W[m] < W[i])\n                        m = i;\n                }\n                if(k != m) {\n                    swap(W, m, k, mv);\n                    if(V) {\n                        for(i = 0; i < n; i++) {\n                            swap(V, vstep*m + i, vstep*k + i, mv);\n                        }\n                    }\n                }\n            }\n\n\n            jsfeat.cache.put_buffer(indR_buff);\n            jsfeat.cache.put_buffer(indC_buff);\n        };\n\n        var JacobiSVDImpl = function(At, astep, _W, Vt, vstep, m, n, n1) {\n            var eps = jsfeat.EPSILON * 2.0;\n            var minval = jsfeat.FLT_MIN;\n            var i=0,j=0,k=0,iter=0,max_iter=Math.max(m, 30);\n            var Ai=0,Aj=0,Vi=0,Vj=0,changed=0;\n            var c=0.0, s=0.0, t=0.0;\n            var t0=0.0,t1=0.0,sd=0.0,beta=0.0,gamma=0.0,delta=0.0,a=0.0,p=0.0,b=0.0;\n            var seed = 0x1234;\n            var val=0.0,val0=0.0,asum=0.0;\n\n            var W_buff = jsfeat.cache.get_buffer(n<<3);\n            var W = W_buff.f64;\n            \n            for(; i < n; i++) {\n                for(k = 0, sd = 0; k < m; k++) {\n                    t = At[i*astep + k];\n                    sd += t*t;\n                }\n                W[i] = sd;\n                \n                if(Vt) {\n                    for(k = 0; k < n; k++) {\n                        Vt[i*vstep + k] = 0;\n                    }\n                    Vt[i*vstep + i] = 1;\n                }\n            }\n            \n            for(; iter < max_iter; iter++) {\n                changed = 0;\n                \n                for(i = 0; i < n-1; i++) {\n                    for(j = i+1; j < n; j++) {\n                        Ai = (i*astep)|0, Aj = (j*astep)|0;\n                        a = W[i], p = 0, b = W[j];\n                        \n                        k = 2;\n                        p += At[Ai]*At[Aj];\n                        p += At[Ai+1]*At[Aj+1];\n\n                        for(; k < m; k++)\n                            p += At[Ai+k]*At[Aj+k];\n                        \n                        if(Math.abs(p) <= eps*Math.sqrt(a*b)) continue;\n                        \n                        p *= 2.0;\n                        beta = a - b, gamma = hypot(p, beta);\n                        if( beta < 0 ) {\n                            delta = (gamma - beta)*0.5;\n                            s = Math.sqrt(delta/gamma);\n                            c = (p/(gamma*s*2.0));\n                        } else {\n                            c = Math.sqrt((gamma + beta)/(gamma*2.0));\n                            s = (p/(gamma*c*2.0));\n                        }\n                        \n                        a=0.0, b=0.0;\n                        \n                        k = 2; // unroll\n                        t0 = c*At[Ai] + s*At[Aj];\n                        t1 = -s*At[Ai] + c*At[Aj];\n                        At[Ai] = t0; At[Aj] = t1;\n                        a += t0*t0; b += t1*t1;\n\n                        t0 = c*At[Ai+1] + s*At[Aj+1];\n                        t1 = -s*At[Ai+1] + c*At[Aj+1];\n                        At[Ai+1] = t0; At[Aj+1] = t1;\n                        a += t0*t0; b += t1*t1;\n\n                        for( ; k < m; k++ )\n                        {\n                            t0 = c*At[Ai+k] + s*At[Aj+k];\n                            t1 = -s*At[Ai+k] + c*At[Aj+k];\n                            At[Ai+k] = t0; At[Aj+k] = t1;\n                            \n                            a += t0*t0; b += t1*t1;\n                        }\n                        \n                        W[i] = a; W[j] = b;\n                        \n                        changed = 1;\n                        \n                        if(Vt) {\n                            Vi = (i*vstep)|0, Vj = (j*vstep)|0;\n\n                            k = 2;\n                            t0 = c*Vt[Vi] + s*Vt[Vj];\n                            t1 = -s*Vt[Vi] + c*Vt[Vj];\n                            Vt[Vi] = t0; Vt[Vj] = t1;\n\n                            t0 = c*Vt[Vi+1] + s*Vt[Vj+1];\n                            t1 = -s*Vt[Vi+1] + c*Vt[Vj+1];\n                            Vt[Vi+1] = t0; Vt[Vj+1] = t1;\n\n                            for(; k < n; k++) {\n                                t0 = c*Vt[Vi+k] + s*Vt[Vj+k];\n                                t1 = -s*Vt[Vi+k] + c*Vt[Vj+k];\n                                Vt[Vi+k] = t0; Vt[Vj+k] = t1;\n                            }\n                        }\n                    }\n                }\n                if(changed == 0) break;\n            }\n            \n            for(i = 0; i < n; i++) {\n                for(k = 0, sd = 0; k < m; k++) {\n                    t = At[i*astep + k];\n                    sd += t*t;\n                }\n                W[i] = Math.sqrt(sd);\n            }\n            \n            for(i = 0; i < n-1; i++) {\n                j = i;\n                for(k = i+1; k < n; k++) {\n                    if(W[j] < W[k])\n                        j = k;\n                }\n                if(i != j) {\n                    swap(W, i, j, sd);\n                    if(Vt) {\n                        for(k = 0; k < m; k++) {\n                            swap(At, i*astep + k, j*astep + k, t);\n                        }\n                        \n                        for(k = 0; k < n; k++) {\n                            swap(Vt, i*vstep + k, j*vstep + k, t);\n                        }\n                    }\n                }\n            }\n            \n            for(i = 0; i < n; i++) {\n                _W[i] = W[i];\n            }\n            \n            if(!Vt) {\n                jsfeat.cache.put_buffer(W_buff);\n                return;\n            }\n\n            for(i = 0; i < n1; i++) {\n\n                sd = i < n ? W[i] : 0;\n                \n                while(sd <= minval) {\n                    // if we got a zero singular value, then in order to get the corresponding left singular vector\n                    // we generate a random vector, project it to the previously computed left singular vectors,\n                    // subtract the projection and normalize the difference.\n                    val0 = (1.0/m);\n                    for(k = 0; k < m; k++) {\n                        seed = (seed * 214013 + 2531011);\n                        val = (((seed >> 16) & 0x7fff) & 256) != 0 ? val0 : -val0;\n                        At[i*astep + k] = val;\n                    }\n                    for(iter = 0; iter < 2; iter++) {\n                        for(j = 0; j < i; j++) {\n                            sd = 0;\n                            for(k = 0; k < m; k++) {\n                                sd += At[i*astep + k]*At[j*astep + k];\n                            }\n                            asum = 0.0;\n                            for(k = 0; k < m; k++) {\n                                t = (At[i*astep + k] - sd*At[j*astep + k]);\n                                At[i*astep + k] = t;\n                                asum += Math.abs(t);\n                            }\n                            asum = asum ? 1.0/asum : 0;\n                            for(k = 0; k < m; k++) {\n                                At[i*astep + k] *= asum;\n                            }\n                        }\n                    }\n                    sd = 0;\n                    for(k = 0; k < m; k++) {\n                        t = At[i*astep + k];\n                        sd += t*t;\n                    }\n                    sd = Math.sqrt(sd);\n                }\n                \n                s = (1.0/sd);\n                for(k = 0; k < m; k++) {\n                    At[i*astep + k] *= s;\n                }\n            }\n\n            jsfeat.cache.put_buffer(W_buff);\n        };\n        \n        return {\n\n            lu_solve: function(A, B) {\n                var i=0,j=0,k=0,p=1,astep=A.cols;\n                var ad=A.data, bd=B.data;\n                var t,alpha,d,s;\n\n                for(i = 0; i < astep; i++) {\n                    k = i;                    \n                    for(j = i+1; j < astep; j++) {\n                        if(Math.abs(ad[j*astep + i]) > Math.abs(ad[k*astep+i])) {\n                            k = j;\n                        }\n                    }\n                    \n                    if(Math.abs(ad[k*astep+i]) < jsfeat.EPSILON) {\n                        return 0; // FAILED\n                    }\n                    \n                    if(k != i) {\n                        for(j = i; j < astep; j++ ) {\n                            swap(ad, i*astep+j, k*astep+j, t);\n                        }\n                        \n                        swap(bd, i, k, t);\n                        p = -p;\n                    }\n                    \n                    d = -1.0/ad[i*astep+i];\n                    \n                    for(j = i+1; j < astep; j++) {\n                        alpha = ad[j*astep+i]*d;\n                        \n                        for(k = i+1; k < astep; k++) {\n                            ad[j*astep+k] += alpha*ad[i*astep+k];\n                        }\n                        \n                        bd[j] += alpha*bd[i];\n                    }\n                    \n                    ad[i*astep+i] = -d;\n                }\n                \n                for(i = astep-1; i >= 0; i--) {\n                    s = bd[i];\n                    for(k = i+1; k < astep; k++) {\n                        s -= ad[i*astep+k]*bd[k];\n                    }\n                    bd[i] = s*ad[i*astep+i];\n                }\n\n                return 1; // OK\n            },\n\n            cholesky_solve: function(A, B) {\n                var col=0,row=0,col2=0,cs=0,rs=0,i=0,j=0;\n                var size = A.cols;\n                var ad=A.data, bd=B.data;\n                var val,inv_diag;\n\n                for (col = 0; col < size; col++) {\n                    inv_diag = 1.0;\n                    cs = (col * size);\n                    rs = cs;\n                    for (row = col; row < size; row++)\n                    {\n                        // correct for the parts of cholesky already computed\n                        val = ad[(rs+col)];\n                        for (col2 = 0; col2 < col; col2++) {\n                            val -= ad[(col2*size+col)] * ad[(rs+col2)];\n                        }\n                        if (row == col) {\n                            // this is the diagonal element so don't divide\n                            ad[(rs+col)] = val;\n                            if(val == 0) {\n                                return 0;\n                            }\n                            inv_diag = 1.0 / val;\n                        } else {\n                            // cache the value without division in the upper half\n                            ad[(cs+row)] = val;\n                            // divide my the diagonal element for all others\n                            ad[(rs+col)] = val * inv_diag;\n                        }\n                        rs = (rs + size);\n                    }\n                }\n\n                // first backsub through L\n                cs = 0;\n                for (i = 0; i < size; i++) {\n                    val = bd[i];\n                    for (j = 0; j < i; j++) {\n                        val -= ad[(cs+j)] * bd[j];\n                    }\n                    bd[i] = val;\n                    cs = (cs + size);\n                }\n                // backsub through diagonal\n                cs = 0;\n                for (i = 0; i < size; i++) {\n                    bd[i] /= ad[(cs + i)];\n                    cs = (cs + size);\n                }\n                // backsub through L Transpose\n                i = (size-1);\n                for (; i >= 0; i--) {\n                    val = bd[i];\n                    j = (i + 1);\n                    cs = (j * size);\n                    for (; j < size; j++) {\n                        val -= ad[(cs + i)] * bd[j];\n                        cs = (cs + size);\n                    }\n                    bd[i] = val;\n                }\n\n                return 1;\n            },\n\n            svd_decompose: function(A, W, U, V, options) {\n                if (typeof options === \"undefined\") { options = 0; }\n                var at=0,i=0,j=0,_m=A.rows,_n=A.cols,m=_m,n=_n;\n                var dt = A.type | jsfeat.C1_t; // we only work with single channel\n\n                if(m < n) {\n                    at = 1;\n                    i = m;\n                    m = n;\n                    n = i;\n                }\n\n                var a_buff = jsfeat.cache.get_buffer((m*m)<<3);\n                var w_buff = jsfeat.cache.get_buffer(n<<3);\n                var v_buff = jsfeat.cache.get_buffer((n*n)<<3);\n\n                var a_mt = new jsfeat.matrix_t(m, m, dt, a_buff.data);\n                var w_mt = new jsfeat.matrix_t(1, n, dt, w_buff.data);\n                var v_mt = new jsfeat.matrix_t(n, n, dt, v_buff.data);\n\n                if(at == 0) {\n                    // transpose\n                    jsfeat.matmath.transpose(a_mt, A);\n                } else {\n                    for(i = 0; i < _n*_m; i++) {\n                        a_mt.data[i] = A.data[i];\n                    }\n                    for(; i < n*m; i++) {\n                        a_mt.data[i] = 0;\n                    }\n                }\n\n                JacobiSVDImpl(a_mt.data, m, w_mt.data, v_mt.data, n, m, n, m);\n\n                if(W) {\n                    for(i=0; i < n; i++) {\n                        W.data[i] = w_mt.data[i];\n                    }\n                    for(; i < _n; i++) {\n                        W.data[i] = 0;\n                    }\n                }\n\n                if (at == 0) {\n                    if(U && (options & jsfeat.SVD_U_T)) {\n                        i = m*m;\n                        while(--i >= 0) {\n                            U.data[i] = a_mt.data[i];\n                        }\n                    } else if(U) {\n                        jsfeat.matmath.transpose(U, a_mt);\n                    }\n\n                    if(V && (options & jsfeat.SVD_V_T)) {\n                        i = n*n;\n                        while(--i >= 0) {\n                            V.data[i] = v_mt.data[i];\n                        }\n                    } else if(V) {\n                        jsfeat.matmath.transpose(V, v_mt);\n                    }\n                } else {\n                    if(U && (options & jsfeat.SVD_U_T)) {\n                        i = n*n;\n                        while(--i >= 0) {\n                            U.data[i] = v_mt.data[i];\n                        }\n                    } else if(U) {\n                        jsfeat.matmath.transpose(U, v_mt);\n                    }\n\n                    if(V && (options & jsfeat.SVD_V_T)) {\n                        i = m*m;\n                        while(--i >= 0) {\n                            V.data[i] = a_mt.data[i];\n                        }\n                    } else if(V) {\n                        jsfeat.matmath.transpose(V, a_mt);\n                    }\n                }\n\n                jsfeat.cache.put_buffer(a_buff);\n                jsfeat.cache.put_buffer(w_buff);\n                jsfeat.cache.put_buffer(v_buff);\n\n            },\n\n            svd_solve: function(A, X, B) {\n                var i=0,j=0,k=0;\n                var pu=0,pv=0;\n                var nrows=A.rows,ncols=A.cols;\n                var sum=0.0,xsum=0.0,tol=0.0;\n                var dt = A.type | jsfeat.C1_t;\n\n                var u_buff = jsfeat.cache.get_buffer((nrows*nrows)<<3);\n                var w_buff = jsfeat.cache.get_buffer(ncols<<3);\n                var v_buff = jsfeat.cache.get_buffer((ncols*ncols)<<3);\n\n                var u_mt = new jsfeat.matrix_t(nrows, nrows, dt, u_buff.data);\n                var w_mt = new jsfeat.matrix_t(1, ncols, dt, w_buff.data);\n                var v_mt = new jsfeat.matrix_t(ncols, ncols, dt, v_buff.data);\n\n                var bd = B.data, ud = u_mt.data, wd = w_mt.data, vd = v_mt.data;\n\n                this.svd_decompose(A, w_mt, u_mt, v_mt, 0);\n\n                tol = jsfeat.EPSILON * wd[0] * ncols;\n\n                for (; i < ncols; i++, pv += ncols) {\n                    xsum = 0.0;\n                    for(j = 0; j < ncols; j++) {\n                        if(wd[j] > tol) {\n                            for(k = 0, sum = 0.0, pu = 0; k < nrows; k++, pu += ncols) {\n                                sum += ud[pu + j] * bd[k];\n                            }\n                            xsum += sum * vd[pv + j] / wd[j];\n                        }\n                    }\n                    X.data[i] = xsum;\n                }\n\n                jsfeat.cache.put_buffer(u_buff);\n                jsfeat.cache.put_buffer(w_buff);\n                jsfeat.cache.put_buffer(v_buff);\n            },\n\n            svd_invert: function(Ai, A) {\n                var i=0,j=0,k=0;\n                var pu=0,pv=0,pa=0;\n                var nrows=A.rows,ncols=A.cols;\n                var sum=0.0,tol=0.0;\n                var dt = A.type | jsfeat.C1_t;\n\n                var u_buff = jsfeat.cache.get_buffer((nrows*nrows)<<3);\n                var w_buff = jsfeat.cache.get_buffer(ncols<<3);\n                var v_buff = jsfeat.cache.get_buffer((ncols*ncols)<<3);\n\n                var u_mt = new jsfeat.matrix_t(nrows, nrows, dt, u_buff.data);\n                var w_mt = new jsfeat.matrix_t(1, ncols, dt, w_buff.data);\n                var v_mt = new jsfeat.matrix_t(ncols, ncols, dt, v_buff.data);\n\n                var id = Ai.data, ud = u_mt.data, wd = w_mt.data, vd = v_mt.data;\n\n                this.svd_decompose(A, w_mt, u_mt, v_mt, 0);\n\n                tol = jsfeat.EPSILON * wd[0] * ncols;\n\n                for (; i < ncols; i++, pv += ncols) {\n                    for (j = 0, pu = 0; j < nrows; j++, pa++) {\n                        for (k = 0, sum = 0.0; k < ncols; k++, pu++) {\n                            if (wd[k] > tol) sum += vd[pv + k] * ud[pu] / wd[k];\n                        }\n                        id[pa] = sum;\n                    }\n                }\n\n                jsfeat.cache.put_buffer(u_buff);\n                jsfeat.cache.put_buffer(w_buff);\n                jsfeat.cache.put_buffer(v_buff);\n            },\n\n            eigenVV: function(A, vects, vals) {\n                var n=A.cols,i=n*n;\n                var dt = A.type | jsfeat.C1_t;\n\n                var a_buff = jsfeat.cache.get_buffer((n*n)<<3);\n                var w_buff = jsfeat.cache.get_buffer(n<<3);\n                var a_mt = new jsfeat.matrix_t(n, n, dt, a_buff.data);\n                var w_mt = new jsfeat.matrix_t(1, n, dt, w_buff.data);\n\n                while(--i >= 0) {\n                    a_mt.data[i] = A.data[i];\n                }\n\n                JacobiImpl(a_mt.data, n, w_mt.data, vects ? vects.data : null, n, n);\n\n                if(vals) {\n                    while(--n >= 0) {\n                        vals.data[n] = w_mt.data[n];\n                    }\n                }\n\n                jsfeat.cache.put_buffer(a_buff);\n                jsfeat.cache.put_buffer(w_buff);\n            }\n\n        };\n\n    })();\n\n    global.linalg = linalg;\n\n})(jsfeat);\n/**\n * @author Eugene Zatepyakin / http://inspirit.ru/\n *\n */\n\n(function(global) {\n    \"use strict\";\n    //\n\n    var motion_model = (function() {\n\n    \tvar sqr = function(x) {\n    \t\treturn x*x;\n    \t};\n\n    \t// does isotropic normalization\n    \tvar iso_normalize_points = function(from, to, T0, T1, count) {\n\t\t\tvar i=0;\n\t\t    var cx0=0.0, cy0=0.0, d0=0.0, s0=0.0;\n\t\t    var cx1=0.0, cy1=0.0, d1=0.0, s1=0.0;\n\t\t    var dx=0.0,dy=0.0;\n\n\t\t    for (; i < count; ++i) {\n\t\t        cx0 += from[i].x;\n\t\t        cy0 += from[i].y;\n\t\t        cx1 += to[i].x;\n\t\t        cy1 += to[i].y;\n\t\t    }\n\n\t\t    cx0 /= count; cy0 /= count;\n\t\t    cx1 /= count; cy1 /= count;\n\n\t\t    for (i = 0; i < count; ++i) {\n\t\t        dx = from[i].x - cx0;\n\t\t        dy = from[i].y - cy0;\n\t\t        d0 += Math.sqrt(dx*dx + dy*dy);\n\t\t        dx = to[i].x - cx1;\n\t\t        dy = to[i].y - cy1;\n\t\t        d1 += Math.sqrt(dx*dx + dy*dy);\n\t\t    }\n\n\t\t    d0 /= count; d1 /= count;\n\n\t\t    s0 = Math.SQRT2 / d0; s1 = Math.SQRT2 / d1;\n\n\t\t    T0[0] = T0[4] = s0;\n\t\t    T0[2] = -cx0*s0;\n\t\t    T0[5] = -cy0*s0;\n\t\t    T0[1] = T0[3] = T0[6] = T0[7] = 0.0;\n\t\t    T0[8] = 1.0;\n\n\t\t    T1[0] = T1[4] = s1;\n\t\t    T1[2] = -cx1*s1;\n\t\t    T1[5] = -cy1*s1;\n\t\t    T1[1] = T1[3] = T1[6] = T1[7] = 0.0;\n\t\t    T1[8] = 1.0;\n\t\t};\n\n\t\tvar have_collinear_points = function(points, count) {\n\t\t    var j=0,k=0,i=(count-1)|0;\n\t\t    var dx1=0.0,dy1=0.0,dx2=0.0,dy2=0.0;\n\n\t\t    // check that the i-th selected point does not belong\n\t\t    // to a line connecting some previously selected points\n\t\t    for(; j < i; ++j) {\n\t\t        dx1 = points[j].x - points[i].x;\n\t\t        dy1 = points[j].y - points[i].y;\n\t\t        for(k = 0; k < j; ++k) {\n\t\t            dx2 = points[k].x - points[i].x;\n\t\t            dy2 = points[k].y - points[i].y;\n\t\t            if( Math.abs(dx2*dy1 - dy2*dx1) <= jsfeat.EPSILON*(Math.abs(dx1) + Math.abs(dy1) + Math.abs(dx2) + Math.abs(dy2)))\n\t\t                return true;\n\t\t        }\n\t\t    }\n\t\t    return false;\n\t\t};\n\n\t\tvar T0 = new jsfeat.matrix_t(3, 3, jsfeat.F32_t|jsfeat.C1_t);\n    \tvar T1 = new jsfeat.matrix_t(3, 3, jsfeat.F32_t|jsfeat.C1_t);\n    \tvar AtA = new jsfeat.matrix_t(6, 6, jsfeat.F32_t|jsfeat.C1_t);\n    \tvar AtB = new jsfeat.matrix_t(6, 1, jsfeat.F32_t|jsfeat.C1_t);\n    \t\n    \tvar affine2d = (function () {\n\n\t        function affine2d() {\n\t        \t// empty constructor\n\t        }\n\n\t        affine2d.prototype.run = function(from, to, model, count) {\n\t        \tvar i=0,j=0;\n\t        \tvar dt=model.type|jsfeat.C1_t;\n\t        \tvar md=model.data, t0d=T0.data, t1d=T1.data;\n\t        \tvar pt0,pt1,px=0.0,py=0.0;\n\n\t            iso_normalize_points(from, to, t0d, t1d, count);\n\n\t            var a_buff = jsfeat.cache.get_buffer((2*count*6)<<3);\n                var b_buff = jsfeat.cache.get_buffer((2*count)<<3);\n\n                var a_mt = new jsfeat.matrix_t(6, 2*count, dt, a_buff.data);\n                var b_mt = new jsfeat.matrix_t(1, 2*count, dt, b_buff.data);\n                var ad=a_mt.data, bd=b_mt.data;\n\n\t\t\t    for (; i < count; ++i) {\n\t\t\t    \tpt0 = from[i];\n\t\t\t        pt1 = to[i];\n\n\t\t\t        px = t0d[0]*pt0.x + t0d[1]*pt0.y + t0d[2];\n\t\t\t        py = t0d[3]*pt0.x + t0d[4]*pt0.y + t0d[5];\n\n\t\t\t        j = i*2*6;\n\t\t\t        ad[j]=px, ad[j+1]=py, ad[j+2]=1.0, ad[j+3]=0.0, ad[j+4]=0.0, ad[j+5]=0.0;\n\n\t\t\t        j += 6;\n\t\t\t        ad[j]=0.0, ad[j+1]=0.0, ad[j+2]=0.0, ad[j+3]=px, ad[j+4]=py, ad[j+5]=1.0;\n\n\t\t\t        bd[i<<1] = t1d[0]*pt1.x + t1d[1]*pt1.y + t1d[2];\n\t\t\t        bd[(i<<1)+1] = t1d[3]*pt1.x + t1d[4]*pt1.y + t1d[5];\n\t\t\t    }\n\n\t\t\t    jsfeat.matmath.multiply_AtA(AtA, a_mt);\n\t\t\t    jsfeat.matmath.multiply_AtB(AtB, a_mt, b_mt);\n\n\t\t\t    jsfeat.linalg.lu_solve(AtA, AtB);\n\n\t\t\t    md[0] = AtB.data[0], md[1]=AtB.data[1], md[2]=AtB.data[2];\n\t\t\t    md[3] = AtB.data[3], md[4]=AtB.data[4], md[5]=AtB.data[5];\n\t\t\t    md[6] = 0.0, md[7] = 0.0, md[8] = 1.0; // fill last row\n\n\t\t\t    // denormalize\n\t\t\t    jsfeat.matmath.invert_3x3(T1, T1);\n\t\t\t    jsfeat.matmath.multiply_3x3(model, T1, model);\n\t\t\t    jsfeat.matmath.multiply_3x3(model, model, T0);\n\n\t\t\t    // free buffer\n\t\t\t    jsfeat.cache.put_buffer(a_buff);\n\t\t\t    jsfeat.cache.put_buffer(b_buff);\n\n\t\t\t    return 1;\n\t        };\n\n\t        affine2d.prototype.error = function(from, to, model, err, count) {\n\t        \tvar i=0;\n\t        \tvar pt0,pt1;\n\t        \tvar m=model.data;\n\n\t\t\t    for (; i < count; ++i) {\n\t\t\t        pt0 = from[i];\n\t\t\t        pt1 = to[i];\n\n\t\t\t        err[i] = sqr(pt1.x - m[0]*pt0.x - m[1]*pt0.y - m[2]) +\n\t\t\t                 sqr(pt1.y - m[3]*pt0.x - m[4]*pt0.y - m[5]);\n\t\t\t    }\n\t        };\n\n\t        affine2d.prototype.check_subset = function(from, to, count) {\n\t            return true; // all good\n\t        };\n\n\t        return affine2d;\n\t    })();\n\n\t    var mLtL = new jsfeat.matrix_t(9, 9, jsfeat.F32_t|jsfeat.C1_t);\n\t    var Evec = new jsfeat.matrix_t(9, 9, jsfeat.F32_t|jsfeat.C1_t);\n\n\t    var homography2d = (function () {\n\n\t        function homography2d() {\n\t        \t// empty constructor\n\t        \t//this.T0 = new jsfeat.matrix_t(3, 3, jsfeat.F32_t|jsfeat.C1_t);\n\t        \t//this.T1 = new jsfeat.matrix_t(3, 3, jsfeat.F32_t|jsfeat.C1_t);\n\t        \t//this.mLtL = new jsfeat.matrix_t(9, 9, jsfeat.F32_t|jsfeat.C1_t);\n\t        \t//this.Evec = new jsfeat.matrix_t(9, 9, jsfeat.F32_t|jsfeat.C1_t);\n\t        }\n\n\t        homography2d.prototype.run = function(from, to, model, count) {\n\t        \tvar i=0,j=0;\n\t        \tvar md=model.data, t0d=T0.data, t1d=T1.data;\n\t        \tvar LtL=mLtL.data, evd=Evec.data;\n\t        \tvar x=0.0,y=0.0,X=0.0,Y=0.0;\n\n\t\t\t    // norm\n\t\t\t\tvar smx=0.0, smy=0.0, cmx=0.0, cmy=0.0, sMx=0.0, sMy=0.0, cMx=0.0, cMy=0.0;\n\n\t\t\t\tfor(; i < count; ++i) {\n\t\t\t\t    cmx += to[i].x;\n\t\t\t\t    cmy += to[i].y;\n\t\t\t\t    cMx += from[i].x;\n\t\t\t\t    cMy += from[i].y;\n\t\t\t\t}\n\n\t\t\t    cmx /= count; cmy /= count;\n\t\t\t    cMx /= count; cMy /= count;\n\n\t\t\t    for(i = 0; i < count; ++i)\n\t\t\t    {\n\t\t\t\t    smx += Math.abs(to[i].x - cmx);\n\t\t\t\t    smy += Math.abs(to[i].y - cmy);\n\t\t\t\t    sMx += Math.abs(from[i].x - cMx);\n\t\t\t\t    sMy += Math.abs(from[i].y - cMy);\n\t\t\t\t}\n\n\t\t\t    if( Math.abs(smx) < jsfeat.EPSILON \n\t\t\t    \t|| Math.abs(smy) < jsfeat.EPSILON \n\t\t\t    \t|| Math.abs(sMx) < jsfeat.EPSILON \n\t\t\t    \t|| Math.abs(sMy) < jsfeat.EPSILON ) return 0;\n\n\t\t\t    smx = count/smx; smy = count/smy;\n\t\t\t    sMx = count/sMx; sMy = count/sMy;\n\n\t\t\t    t0d[0] = sMx; \tt0d[1] = 0; \tt0d[2] = -cMx*sMx; \n\t\t\t    t0d[3] = 0; \tt0d[4] = sMy; \tt0d[5] = -cMy*sMy; \n\t\t\t    t0d[6] = 0; \tt0d[7] = 0; \tt0d[8] = 1;\n\n\t\t\t\tt1d[0] = 1.0/smx; \tt1d[1] = 0; \t\tt1d[2] = cmx;\n\t\t\t\tt1d[3] = 0; \t\tt1d[4] = 1.0/smy; \tt1d[5] = cmy;\n\t\t\t\tt1d[6] = 0; \t\tt1d[7] = 0; \t\tt1d[8] = 1;\n\t\t\t\t//\n\n\t\t\t\t// construct system\n\t\t\t\ti = 81;\n\t\t\t\twhile(--i >= 0) {\n\t\t\t\t\tLtL[i] = 0.0;\n\t\t\t\t}\n\t\t\t\tfor(i = 0; i < count; ++i) {\n\t\t\t\t\tx = (to[i].x - cmx) * smx;\n\t\t\t\t\ty = (to[i].y - cmy) * smy;\n\t\t\t\t\tX = (from[i].x - cMx) * sMx;\n\t\t\t\t\tY = (from[i].y - cMy) * sMy;\n\n\t\t\t\t\tLtL[0] += X*X;\n\t\t\t\t\tLtL[1] += X*Y;\n\t\t\t\t\tLtL[2] += X;\n\n\t\t\t\t\tLtL[6] += X*-x*X;\n\t\t\t\t\tLtL[7] += X*-x*Y;\n\t\t\t\t\tLtL[8] += X*-x;\n\t\t\t\t\tLtL[10] += Y*Y;\n\t\t\t\t\tLtL[11] += Y;\n\n\t\t\t\t\tLtL[15] += Y*-x*X;\n\t\t\t\t\tLtL[16] += Y*-x*Y;\n\t\t\t\t\tLtL[17] += Y*-x;\n\t\t\t\t\tLtL[20] += 1.0;\n\n\t\t\t\t\tLtL[24] += -x*X;\n\t\t\t\t\tLtL[25] += -x*Y;\n\t\t\t\t\tLtL[26] += -x;\n\t\t\t\t\tLtL[30] += X*X;\n\t\t\t\t\tLtL[31] += X*Y;\n\t\t\t\t\tLtL[32] += X;\n\t\t\t\t\tLtL[33] += X*-y*X;\n\t\t\t\t\tLtL[34] += X*-y*Y;\n\t\t\t\t\tLtL[35] += X*-y;\n\t\t\t\t\tLtL[40] += Y*Y;\n\t\t\t\t\tLtL[41] += Y;\n\t\t\t\t\tLtL[42] += Y*-y*X;\n\t\t\t\t\tLtL[43] += Y*-y*Y;\n\t\t\t\t\tLtL[44] += Y*-y;\n\t\t\t\t\tLtL[50] += 1.0;\n\t\t\t\t\tLtL[51] += -y*X;\n\t\t\t\t\tLtL[52] += -y*Y;\n\t\t\t\t\tLtL[53] += -y;\n\t\t\t\t\tLtL[60] += -x*X*-x*X + -y*X*-y*X;\n\t\t\t\t\tLtL[61] += -x*X*-x*Y + -y*X*-y*Y;\n\t\t\t\t\tLtL[62] += -x*X*-x + -y*X*-y;\n\t\t\t\t\tLtL[70] += -x*Y*-x*Y + -y*Y*-y*Y;\n\t\t\t\t\tLtL[71] += -x*Y*-x + -y*Y*-y;\n\t\t\t\t\tLtL[80] += -x*-x + -y*-y;\n\t\t\t\t}\n\t\t\t\t//\n\n\t\t\t\t// symmetry\n\t\t\t    for(i = 0; i < 9; ++i) {\n\t\t\t        for(j = 0; j < i; ++j)\n\t\t\t            LtL[i*9+j] = LtL[j*9+i];\n\t\t\t    }\n\n\t\t\t\tjsfeat.linalg.eigenVV(mLtL, Evec);\n\n\t\t\t\tmd[0]=evd[72], md[1]=evd[73], md[2]=evd[74];\n\t\t\t    md[3]=evd[75], md[4]=evd[76], md[5]=evd[77];\n\t\t\t    md[6]=evd[78], md[7]=evd[79], md[8]=evd[80];\n\n\t\t\t\t// denormalize\n\t\t\t    jsfeat.matmath.multiply_3x3(model, T1, model);\n\t\t\t    jsfeat.matmath.multiply_3x3(model, model, T0);\n\n\t\t\t    // set bottom right to 1.0\n\t\t\t    x = 1.0/md[8];\n\t\t\t    md[0] *= x; md[1] *= x; md[2] *= x;\n\t\t\t    md[3] *= x; md[4] *= x; md[5] *= x;\n\t\t\t    md[6] *= x; md[7] *= x; md[8] = 1.0;\n\n\t\t\t    return 1;\n\t        };\n\n\t        homography2d.prototype.error = function(from, to, model, err, count) {\n\t        \tvar i=0;\n\t        \tvar pt0,pt1,ww=0.0,dx=0.0,dy=0.0;\n\t        \tvar m=model.data;\n\n\t\t\t    for (; i < count; ++i) {\n\t\t\t        pt0 = from[i];\n\t\t\t        pt1 = to[i];\n\n\t\t\t        ww = 1.0/(m[6]*pt0.x + m[7]*pt0.y + 1.0);\n\t\t\t        dx = (m[0]*pt0.x + m[1]*pt0.y + m[2])*ww - pt1.x;\n\t\t\t        dy = (m[3]*pt0.x + m[4]*pt0.y + m[5])*ww - pt1.y;\n\t\t\t        err[i] = (dx*dx + dy*dy);\n\t\t\t    }\n\t        };\n\n\t        homography2d.prototype.check_subset = function(from, to, count) {\n\t        \t// seems to reject good subsets actually\n\t        \t//if( have_collinear_points(from, count) || have_collinear_points(to, count) ) {\n        \t\t\t//return false;\n        \t\t//}\n        \t\tif( count == 4 ) {\n\t\t\t        var negative = 0;\n\n\t\t\t        var fp0=from[0],fp1=from[1],fp2=from[2],fp3=from[3];\n\t\t\t        var tp0=to[0],tp1=to[1],tp2=to[2],tp3=to[3];\n\n\t\t\t        // set1\n\t\t\t        var A11=fp0.x, A12=fp0.y, A13=1.0;\n\t\t\t        var A21=fp1.x, A22=fp1.y, A23=1.0;\n\t\t\t        var A31=fp2.x, A32=fp2.y, A33=1.0;\n\n\t\t\t        var B11=tp0.x, B12=tp0.y, B13=1.0;\n\t\t\t        var B21=tp1.x, B22=tp1.y, B23=1.0;\n\t\t\t        var B31=tp2.x, B32=tp2.y, B33=1.0;\n\n\t\t\t        var detA = jsfeat.matmath.determinant_3x3(A11,A12,A13, A21,A22,A23, A31,A32,A33);\n\t\t\t\t\tvar detB = jsfeat.matmath.determinant_3x3(B11,B12,B13, B21,B22,B23, B31,B32,B33);\n\n\t\t\t\t\tif(detA*detB < 0) negative++;\n\n\t\t\t\t\t// set2\n\t\t\t\t\tA11=fp1.x, A12=fp1.y;\n\t\t\t        A21=fp2.x, A22=fp2.y;\n\t\t\t        A31=fp3.x, A32=fp3.y;\n\n\t\t\t        B11=tp1.x, B12=tp1.y;\n\t\t\t        B21=tp2.x, B22=tp2.y;\n\t\t\t        B31=tp3.x, B32=tp3.y;\n\n\t\t\t        detA = jsfeat.matmath.determinant_3x3(A11,A12,A13, A21,A22,A23, A31,A32,A33);\n\t\t\t\t\tdetB = jsfeat.matmath.determinant_3x3(B11,B12,B13, B21,B22,B23, B31,B32,B33);\n\n\t\t\t\t\tif(detA*detB < 0) negative++;\n\n\t\t\t\t\t// set3\n\t\t\t\t\tA11=fp0.x, A12=fp0.y;\n\t\t\t        A21=fp2.x, A22=fp2.y;\n\t\t\t        A31=fp3.x, A32=fp3.y;\n\n\t\t\t        B11=tp0.x, B12=tp0.y;\n\t\t\t        B21=tp2.x, B22=tp2.y;\n\t\t\t        B31=tp3.x, B32=tp3.y;\n\n\t\t\t        detA = jsfeat.matmath.determinant_3x3(A11,A12,A13, A21,A22,A23, A31,A32,A33);\n\t\t\t\t\tdetB = jsfeat.matmath.determinant_3x3(B11,B12,B13, B21,B22,B23, B31,B32,B33);\n\n\t\t\t\t\tif(detA*detB < 0) negative++;\n\n\t\t\t\t\t// set4\n\t\t\t\t\tA11=fp0.x, A12=fp0.y;\n\t\t\t        A21=fp1.x, A22=fp1.y;\n\t\t\t        A31=fp3.x, A32=fp3.y;\n\n\t\t\t        B11=tp0.x, B12=tp0.y;\n\t\t\t        B21=tp1.x, B22=tp1.y;\n\t\t\t        B31=tp3.x, B32=tp3.y;\n\n\t\t\t        detA = jsfeat.matmath.determinant_3x3(A11,A12,A13, A21,A22,A23, A31,A32,A33);\n\t\t\t\t\tdetB = jsfeat.matmath.determinant_3x3(B11,B12,B13, B21,B22,B23, B31,B32,B33);\n\n\t\t\t\t\tif(detA*detB < 0) negative++;\n\n\t\t\t        if(negative != 0 && negative != 4) {\n\t\t\t        \treturn false;\n\t\t\t        }\n\t\t\t    }\n\t            return true; // all good\n\t        };\n\n\t        return homography2d;\n\t    })();\n\n\t    return {\n\n    \t\taffine2d:affine2d,\n    \t\thomography2d:homography2d\n\n    \t};\n\n    })();\n\n    var ransac_params_t = (function () {\n        function ransac_params_t(size, thresh, eps, prob) {\n            if (typeof size === \"undefined\") { size=0; }\n            if (typeof thresh === \"undefined\") { thresh=0.5; }\n            if (typeof eps === \"undefined\") { eps=0.5; }\n            if (typeof prob === \"undefined\") { prob=0.99; }\n\n            this.size = size;\n            this.thresh = thresh;\n            this.eps = eps;\n            this.prob = prob;\n        }\n        ransac_params_t.prototype.update_iters = function(_eps, max_iters) {\n\t        var num = Math.log(1 - this.prob);\n\t        var denom = Math.log(1 - Math.pow(1 - _eps, this.size));\n\t        return (denom >= 0 || -num >= max_iters*(-denom) ? max_iters : Math.round(num/denom))|0;\n        };\n        return ransac_params_t;\n    })();\n\n    var motion_estimator = (function() {\n\n    \tvar get_subset = function(kernel, from, to, need_cnt, max_cnt, from_sub, to_sub) {\n    \t\tvar max_try = 1000;\n    \t\tvar indices = [];\n\t\t    var i=0, j=0, ssiter=0, idx_i=0, ok=false;\n\t\t    for(; ssiter < max_try; ++ssiter)  {\n\t\t        i = 0;\n\t\t        for (; i < need_cnt && ssiter < max_try;) {\n\t\t            ok = false;\n\t\t            idx_i = 0;\n\t\t            while (!ok) {\n\t\t                ok = true;\n\t\t                idx_i = indices[i] = Math.floor(Math.random() * max_cnt)|0;\n\t\t                for (j = 0; j < i; ++j) {\n\t\t                    if (idx_i == indices[j])\n\t\t                    { ok = false; break; }\n\t\t                }\n\t\t            }\n\t\t            from_sub[i] = from[idx_i];\n\t\t            to_sub[i] = to[idx_i];\n\t\t            if( !kernel.check_subset( from_sub, to_sub, i+1 ) ) {\n\t\t                ssiter++;\n\t\t                continue;\n\t\t            }\n\t\t            ++i;\n\t\t        }\n\t\t        break;\n\t\t    }\n\n\t\t    return (i == need_cnt && ssiter < max_try);\n    \t};\n\n    \tvar find_inliers = function(kernel, model, from, to, count, thresh, err, mask) {\n    \t\tvar numinliers = 0, i=0, f=0;\n    \t\tvar t = thresh*thresh;\n\n    \t\tkernel.error(from, to, model, err, count);\n\n\t\t    for(; i < count; ++i) {\n\t\t        f = err[i] <= t;\n\t\t        mask[i] = f;\n\t\t        numinliers += f;\n\t\t    }\n\t\t    return numinliers;\n    \t};\n\n    \treturn {\n\n    \t\transac: function(params, kernel, from, to, count, model, mask, max_iters) {\n    \t\t\tif (typeof max_iters === \"undefined\") { max_iters=1000; }\n\n    \t\t\tif(count < params.size) return false;\n\n    \t\t\tvar model_points = params.size;\n\t\t\t    var niters = max_iters, iter=0;\n\t\t\t    var result = false;\n\n\t\t\t    var subset0 = [];\n\t\t\t    var subset1 = [];\n\t\t\t    var found = false;\n\n\t\t\t    var mc=model.cols,mr=model.rows;\n                var dt = model.type | jsfeat.C1_t;\n\n\t\t\t    var m_buff = jsfeat.cache.get_buffer((mc*mr)<<3);\n\t\t\t    var ms_buff = jsfeat.cache.get_buffer(count);\n\t\t\t    var err_buff = jsfeat.cache.get_buffer(count<<2);\n\t\t\t    var M = new jsfeat.matrix_t(mc, mr, dt, m_buff.data);\n\t\t\t    var curr_mask = new jsfeat.matrix_t(count, 1, jsfeat.U8C1_t, ms_buff.data);\n\n\t\t\t    var inliers_max = -1, numinliers=0;\n\t\t\t    var nmodels = 0;\n\n\t\t\t    var err = err_buff.f32;\n\n\t\t\t    // special case\n\t\t\t    if(count == model_points) {\n\t\t\t        if(kernel.run(from, to, M, count) <= 0) {\n\t\t\t        \tjsfeat.cache.put_buffer(m_buff);\n\t\t\t        \tjsfeat.cache.put_buffer(ms_buff);\n\t\t\t        \tjsfeat.cache.put_buffer(err_buff);\n\t\t\t        \treturn false;\n\t\t\t        }\n\n\t\t\t        M.copy_to(model);\n\t\t\t        if(mask) {\n\t\t\t        \twhile(--count >= 0) {\n\t\t\t        \t\tmask.data[count] = 1;\n\t\t\t        \t}\n\t\t\t        }\n\t\t\t        jsfeat.cache.put_buffer(m_buff);\n\t\t\t        jsfeat.cache.put_buffer(ms_buff);\n\t\t\t        jsfeat.cache.put_buffer(err_buff);\n\t\t\t        return true;\n\t\t\t    }\n\n\t\t\t    for (; iter < niters; ++iter) {\n\t\t\t        // generate subset\n\t\t\t        found = get_subset(kernel, from, to, model_points, count, subset0, subset1);\n\t\t\t        if(!found) {\n\t\t\t            if(iter == 0) {\n\t\t\t            \tjsfeat.cache.put_buffer(m_buff);\n\t\t\t            \tjsfeat.cache.put_buffer(ms_buff);\n\t\t\t            \tjsfeat.cache.put_buffer(err_buff);\n\t\t\t                return false;\n\t\t\t            }\n\t\t\t            break;\n\t\t\t        }\n\n\t\t\t        nmodels = kernel.run( subset0, subset1, M, model_points );\n\t\t\t        if(nmodels <= 0)\n\t\t\t            continue;\n\n\t\t\t        // TODO handle multimodel output\n\n\t\t\t        numinliers = find_inliers(kernel, M, from, to, count, params.thresh, err, curr_mask.data);\n\n\t\t\t        if( numinliers > Math.max(inliers_max, model_points-1) ) {\n\t\t\t            M.copy_to(model);\n\t\t\t            inliers_max = numinliers;\n\t\t\t            if(mask) curr_mask.copy_to(mask);\n\t\t\t            niters = params.update_iters((count - numinliers)/count, niters);\n\t\t\t            result = true;\n\t\t\t        }\n\t\t\t    }\n\n\t\t\t    jsfeat.cache.put_buffer(m_buff);\n\t\t\t    jsfeat.cache.put_buffer(ms_buff);\n\t\t\t    jsfeat.cache.put_buffer(err_buff);\n\n\t\t\t    return result;\n    \t\t},\n\n    \t\tlmeds: function(params, kernel, from, to, count, model, mask, max_iters) {\n    \t\t\tif (typeof max_iters === \"undefined\") { max_iters=1000; }\n\n    \t\t\tif(count < params.size) return false;\n\n    \t\t\tvar model_points = params.size;\n\t\t\t    var niters = max_iters, iter=0;\n\t\t\t    var result = false;\n\n\t\t\t    var subset0 = [];\n\t\t\t    var subset1 = [];\n\t\t\t    var found = false;\n\n\t\t\t    var mc=model.cols,mr=model.rows;\n                var dt = model.type | jsfeat.C1_t;\n\n\t\t\t    var m_buff = jsfeat.cache.get_buffer((mc*mr)<<3);\n\t\t\t    var ms_buff = jsfeat.cache.get_buffer(count);\n\t\t\t    var err_buff = jsfeat.cache.get_buffer(count<<2);\n\t\t\t    var M = new jsfeat.matrix_t(mc, mr, dt, m_buff.data);\n\t\t\t    var curr_mask = new jsfeat.matrix_t(count, 1, jsfeat.U8_t|jsfeat.C1_t, ms_buff.data);\n\n\t\t\t    var numinliers=0;\n\t\t\t    var nmodels = 0;\n\n\t\t\t    var err = err_buff.f32;\n\t\t\t    var min_median = 1000000000.0, sigma=0.0, median=0.0;\n\n\t\t\t    params.eps = 0.45;\n\t\t\t    niters = params.update_iters(params.eps, niters);\n\n\t\t\t    // special case\n\t\t\t    if(count == model_points) {\n\t\t\t        if(kernel.run(from, to, M, count) <= 0) {\n\t\t\t        \tjsfeat.cache.put_buffer(m_buff);\n\t\t\t        \tjsfeat.cache.put_buffer(ms_buff);\n\t\t\t        \tjsfeat.cache.put_buffer(err_buff);\n\t\t\t        \treturn false;\n\t\t\t        }\n\n\t\t\t        M.copy_to(model);\n\t\t\t        if(mask) {\n\t\t\t        \twhile(--count >= 0) {\n\t\t\t        \t\tmask.data[count] = 1;\n\t\t\t        \t}\n\t\t\t        }\n\t\t\t        jsfeat.cache.put_buffer(m_buff);\n\t\t\t        jsfeat.cache.put_buffer(ms_buff);\n\t\t\t        jsfeat.cache.put_buffer(err_buff);\n\t\t\t        return true;\n\t\t\t    }\n\n\t\t\t    for (; iter < niters; ++iter) {\n\t\t\t        // generate subset\n\t\t\t        found = get_subset(kernel, from, to, model_points, count, subset0, subset1);\n\t\t\t        if(!found) {\n\t\t\t            if(iter == 0) {\n\t\t\t            \tjsfeat.cache.put_buffer(m_buff);\n\t\t\t            \tjsfeat.cache.put_buffer(ms_buff);\n\t\t\t            \tjsfeat.cache.put_buffer(err_buff);\n\t\t\t                return false;\n\t\t\t            }\n\t\t\t            break;\n\t\t\t        }\n\n\t\t\t        nmodels = kernel.run( subset0, subset1, M, model_points );\n\t\t\t        if(nmodels <= 0)\n\t\t\t            continue;\n\n\t\t\t        // TODO handle multimodel output\n\n\t\t\t        kernel.error(from, to, M, err, count);\n\t\t\t        median = jsfeat.math.median(err, 0, count-1);\n\n\t\t\t        if(median < min_median) {\n\t\t\t            min_median = median;\n\t\t\t            M.copy_to(model);\n\t\t\t            result = true;\n\t\t\t        }\n\t\t\t    }\n\n\t\t\t    if(result) {\n\t\t\t        sigma = 2.5*1.4826*(1 + 5.0/(count - model_points))*Math.sqrt(min_median);\n\t\t\t        sigma = Math.max(sigma, 0.001);\n\n\t\t\t        numinliers = find_inliers(kernel, model, from, to, count, sigma, err, curr_mask.data);\n\t\t\t        if(mask) curr_mask.copy_to(mask);\n\t\t\t        \n\t\t\t        result = numinliers >= model_points;\n\t\t\t    }\n\n\t\t\t    jsfeat.cache.put_buffer(m_buff);\n\t\t\t    jsfeat.cache.put_buffer(ms_buff);\n\t\t\t    jsfeat.cache.put_buffer(err_buff);\n\n\t\t\t    return result;\n    \t\t}\n\n    \t};\n\n    })();\n\n    global.ransac_params_t = ransac_params_t;\n    global.motion_model = motion_model;\n    global.motion_estimator = motion_estimator;\n\n})(jsfeat);\n/**\n * @author Eugene Zatepyakin / http://inspirit.ru/\n */\n\n(function(global) {\n    \"use strict\";\n    //\n\n    var imgproc = (function() {\n\n        var _resample_u8 = function(src, dst, nw, nh) {\n            var xofs_count=0;\n            var ch=src.channel,w=src.cols,h=src.rows;\n            var src_d=src.data,dst_d=dst.data;\n            var scale_x = w / nw, scale_y = h / nh;\n            var inv_scale_256 = (scale_x * scale_y * 0x10000)|0;\n            var dx=0,dy=0,sx=0,sy=0,sx1=0,sx2=0,i=0,k=0,fsx1=0.0,fsx2=0.0;\n            var a=0,b=0,dxn=0,alpha=0,beta=0,beta1=0;\n\n            var buf_node = jsfeat.cache.get_buffer((nw*ch)<<2);\n            var sum_node = jsfeat.cache.get_buffer((nw*ch)<<2);\n            var xofs_node = jsfeat.cache.get_buffer((w*2*3)<<2);\n\n            var buf = buf_node.i32;\n            var sum = sum_node.i32;\n            var xofs = xofs_node.i32;\n\n            for (; dx < nw; dx++) {\n                fsx1 = dx * scale_x, fsx2 = fsx1 + scale_x;\n                sx1 = (fsx1 + 1.0 - 1e-6)|0, sx2 = fsx2|0;\n                sx1 = Math.min(sx1, w - 1);\n                sx2 = Math.min(sx2, w - 1);\n\n                if(sx1 > fsx1) {\n                    xofs[k++] = (dx * ch)|0;\n                    xofs[k++] = ((sx1 - 1)*ch)|0; \n                    xofs[k++] = ((sx1 - fsx1) * 0x100)|0;\n                    xofs_count++;\n                }\n                for(sx = sx1; sx < sx2; sx++){\n                    xofs_count++;\n                    xofs[k++] = (dx * ch)|0;\n                    xofs[k++] = (sx * ch)|0;\n                    xofs[k++] = 256;\n                }\n                if(fsx2 - sx2 > 1e-3) {\n                    xofs_count++;\n                    xofs[k++] = (dx * ch)|0;\n                    xofs[k++] = (sx2 * ch)|0;\n                    xofs[k++] = ((fsx2 - sx2) * 256)|0;\n                }\n            }\n\n            for (dx = 0; dx < nw * ch; dx++) {\n                buf[dx] = sum[dx] = 0;\n            }\n            dy = 0;\n            for (sy = 0; sy < h; sy++) {\n                a = w * sy;\n                for (k = 0; k < xofs_count; k++) {\n                    dxn = xofs[k*3];\n                    sx1 = xofs[k*3+1];\n                    alpha = xofs[k*3+2];\n                    for (i = 0; i < ch; i++) {\n                        buf[dxn + i] += src_d[a+sx1+i] * alpha;\n                    }\n                }\n                if ((dy + 1) * scale_y <= sy + 1 || sy == h - 1) {\n                    beta = (Math.max(sy + 1 - (dy + 1) * scale_y, 0.0) * 256)|0;\n                    beta1 = 256 - beta;\n                    b = nw * dy;\n                    if (beta <= 0) {\n                        for (dx = 0; dx < nw * ch; dx++) {\n                            dst_d[b+dx] = Math.min(Math.max((sum[dx] + buf[dx] * 256) / inv_scale_256, 0), 255);\n                            sum[dx] = buf[dx] = 0;\n                        }\n                    } else {\n                        for (dx = 0; dx < nw * ch; dx++) {\n                            dst_d[b+dx] = Math.min(Math.max((sum[dx] + buf[dx] * beta1) / inv_scale_256, 0), 255);\n                            sum[dx] = buf[dx] * beta;\n                            buf[dx] = 0;\n                        }\n                    }\n                    dy++;\n                } else {\n                    for(dx = 0; dx < nw * ch; dx++) {\n                        sum[dx] += buf[dx] * 256;\n                        buf[dx] = 0;\n                    }\n                }\n            }\n\n            jsfeat.cache.put_buffer(sum_node);\n            jsfeat.cache.put_buffer(buf_node);\n            jsfeat.cache.put_buffer(xofs_node);\n        };\n\n        var _resample = function(src, dst, nw, nh) {\n            var xofs_count=0;\n            var ch=src.channel,w=src.cols,h=src.rows;\n            var src_d=src.data,dst_d=dst.data;\n            var scale_x = w / nw, scale_y = h / nh;\n            var scale = 1.0 / (scale_x * scale_y);\n            var dx=0,dy=0,sx=0,sy=0,sx1=0,sx2=0,i=0,k=0,fsx1=0.0,fsx2=0.0;\n            var a=0,b=0,dxn=0,alpha=0.0,beta=0.0,beta1=0.0;\n\n            var buf_node = jsfeat.cache.get_buffer((nw*ch)<<2);\n            var sum_node = jsfeat.cache.get_buffer((nw*ch)<<2);\n            var xofs_node = jsfeat.cache.get_buffer((w*2*3)<<2);\n\n            var buf = buf_node.f32;\n            var sum = sum_node.f32;\n            var xofs = xofs_node.f32;\n\n            for (; dx < nw; dx++) {\n                fsx1 = dx * scale_x, fsx2 = fsx1 + scale_x;\n                sx1 = (fsx1 + 1.0 - 1e-6)|0, sx2 = fsx2|0;\n                sx1 = Math.min(sx1, w - 1);\n                sx2 = Math.min(sx2, w - 1);\n\n                if(sx1 > fsx1) {\n                    xofs_count++;\n                    xofs[k++] = ((sx1 - 1)*ch)|0;\n                    xofs[k++] = (dx * ch)|0;\n                    xofs[k++] = (sx1 - fsx1) * scale;\n                }\n                for(sx = sx1; sx < sx2; sx++){\n                    xofs_count++;\n                    xofs[k++] = (sx * ch)|0;\n                    xofs[k++] = (dx * ch)|0; \n                    xofs[k++] = scale;\n                }\n                if(fsx2 - sx2 > 1e-3) {\n                    xofs_count++;\n                    xofs[k++] = (sx2 * ch)|0;\n                    xofs[k++] = (dx * ch)|0;\n                    xofs[k++] = (fsx2 - sx2) * scale;\n                }\n            }\n\n            for (dx = 0; dx < nw * ch; dx++) {\n                buf[dx] = sum[dx] = 0;\n            }\n            dy = 0;\n            for (sy = 0; sy < h; sy++) {\n                a = w * sy;\n                for (k = 0; k < xofs_count; k++) {\n                    sx1 = xofs[k*3]|0;\n                    dxn = xofs[k*3+1]|0;\n                    alpha = xofs[k*3+2];\n                    for (i = 0; i < ch; i++) {\n                        buf[dxn + i] += src_d[a+sx1+i] * alpha;\n                    }\n                }\n                if ((dy + 1) * scale_y <= sy + 1 || sy == h - 1) {\n                    beta = Math.max(sy + 1 - (dy + 1) * scale_y, 0.0);\n                    beta1 = 1.0 - beta;\n                    b = nw * dy;\n                    if (Math.abs(beta) < 1e-3) {\n                        for (dx = 0; dx < nw * ch; dx++) {\n                            dst_d[b+dx] = sum[dx] + buf[dx];\n                            sum[dx] = buf[dx] = 0;\n                        }\n                    } else {\n                        for (dx = 0; dx < nw * ch; dx++) {\n                            dst_d[b+dx] = sum[dx] + buf[dx] * beta1;\n                            sum[dx] = buf[dx] * beta;\n                            buf[dx] = 0;\n                        }\n                    }\n                    dy++;\n                } else {\n                    for(dx = 0; dx < nw * ch; dx++) {\n                        sum[dx] += buf[dx]; \n                        buf[dx] = 0;\n                    }\n                }\n            }\n            jsfeat.cache.put_buffer(sum_node);\n            jsfeat.cache.put_buffer(buf_node);\n            jsfeat.cache.put_buffer(xofs_node);\n        };\n\n        var _convol_u8 = function(buf, src_d, dst_d, w, h, filter, kernel_size, half_kernel) {\n            var i=0,j=0,k=0,sp=0,dp=0,sum=0,sum1=0,sum2=0,sum3=0,f0=filter[0],fk=0;\n            var w2=w<<1,w3=w*3,w4=w<<2;\n            // hor pass\n            for (; i < h; ++i) { \n                sum = src_d[sp];\n                for (j = 0; j < half_kernel; ++j) {\n                    buf[j] = sum;\n                }\n                for (j = 0; j <= w-2; j+=2) {\n                    buf[j + half_kernel] = src_d[sp+j];\n                    buf[j + half_kernel+1] = src_d[sp+j+1];\n                }\n                for (; j < w; ++j) {\n                    buf[j + half_kernel] = src_d[sp+j];\n                }\n                sum = src_d[sp+w-1];\n                for (j = w; j < half_kernel + w; ++j) {\n                    buf[j + half_kernel] = sum;\n                }\n                for (j = 0; j <= w-4; j+=4) {\n                    sum = buf[j] * f0, \n                    sum1 = buf[j+1] * f0,\n                    sum2 = buf[j+2] * f0,\n                    sum3 = buf[j+3] * f0;\n                    for (k = 1; k < kernel_size; ++k) {\n                        fk = filter[k];\n                        sum += buf[k + j] * fk;\n                        sum1 += buf[k + j+1] * fk;\n                        sum2 += buf[k + j+2] * fk;\n                        sum3 += buf[k + j+3] * fk;\n                    }\n                    dst_d[dp+j] = Math.min(sum >> 8, 255);\n                    dst_d[dp+j+1] = Math.min(sum1 >> 8, 255);\n                    dst_d[dp+j+2] = Math.min(sum2 >> 8, 255);\n                    dst_d[dp+j+3] = Math.min(sum3 >> 8, 255);\n                }\n                for (; j < w; ++j) {\n                    sum = buf[j] * f0;\n                    for (k = 1; k < kernel_size; ++k) {\n                        sum += buf[k + j] * filter[k];\n                    }\n                    dst_d[dp+j] = Math.min(sum >> 8, 255);\n                }\n                sp += w;\n                dp += w;\n            }\n\n            // vert pass\n            for (i = 0; i < w; ++i) {\n                sum = dst_d[i];\n                for (j = 0; j < half_kernel; ++j) {\n                    buf[j] = sum;\n                }\n                k = i;\n                for (j = 0; j <= h-2; j+=2, k+=w2) {\n                    buf[j+half_kernel] = dst_d[k];\n                    buf[j+half_kernel+1] = dst_d[k+w];\n                }\n                for (; j < h; ++j, k+=w) {\n                    buf[j+half_kernel] = dst_d[k];\n                }\n                sum = dst_d[(h-1)*w + i];\n                for (j = h; j < half_kernel + h; ++j) {\n                    buf[j + half_kernel] = sum;\n                }\n                dp = i;\n                for (j = 0; j <= h-4; j+=4, dp+=w4) { \n                    sum = buf[j] * f0, \n                    sum1 = buf[j+1] * f0,\n                    sum2 = buf[j+2] * f0,\n                    sum3 = buf[j+3] * f0;\n                    for (k = 1; k < kernel_size; ++k) {\n                        fk = filter[k];\n                        sum += buf[k + j] * fk;\n                        sum1 += buf[k + j+1] * fk;\n                        sum2 += buf[k + j+2] * fk;\n                        sum3 += buf[k + j+3] * fk;\n                    }\n                    dst_d[dp] = Math.min(sum >> 8, 255);\n                    dst_d[dp+w] = Math.min(sum1 >> 8, 255);\n                    dst_d[dp+w2] = Math.min(sum2 >> 8, 255);\n                    dst_d[dp+w3] = Math.min(sum3 >> 8, 255);\n                }\n                for (; j < h; ++j, dp+=w) {\n                    sum = buf[j] * f0;\n                    for (k = 1; k < kernel_size; ++k) {\n                        sum += buf[k + j] * filter[k];\n                    }\n                    dst_d[dp] = Math.min(sum >> 8, 255);\n                }\n            }\n        };\n\n        var _convol = function(buf, src_d, dst_d, w, h, filter, kernel_size, half_kernel) {\n            var i=0,j=0,k=0,sp=0,dp=0,sum=0.0,sum1=0.0,sum2=0.0,sum3=0.0,f0=filter[0],fk=0.0;\n            var w2=w<<1,w3=w*3,w4=w<<2;\n            // hor pass\n            for (; i < h; ++i) { \n                sum = src_d[sp];\n                for (j = 0; j < half_kernel; ++j) {\n                    buf[j] = sum;\n                }\n                for (j = 0; j <= w-2; j+=2) {\n                    buf[j + half_kernel] = src_d[sp+j];\n                    buf[j + half_kernel+1] = src_d[sp+j+1];\n                }\n                for (; j < w; ++j) {\n                    buf[j + half_kernel] = src_d[sp+j];\n                }\n                sum = src_d[sp+w-1];\n                for (j = w; j < half_kernel + w; ++j) {\n                    buf[j + half_kernel] = sum;\n                }\n                for (j = 0; j <= w-4; j+=4) {\n                    sum = buf[j] * f0, \n                    sum1 = buf[j+1] * f0,\n                    sum2 = buf[j+2] * f0,\n                    sum3 = buf[j+3] * f0;\n                    for (k = 1; k < kernel_size; ++k) {\n                        fk = filter[k];\n                        sum += buf[k + j] * fk;\n                        sum1 += buf[k + j+1] * fk;\n                        sum2 += buf[k + j+2] * fk;\n                        sum3 += buf[k + j+3] * fk;\n                    }\n                    dst_d[dp+j] = sum;\n                    dst_d[dp+j+1] = sum1;\n                    dst_d[dp+j+2] = sum2;\n                    dst_d[dp+j+3] = sum3;\n                }\n                for (; j < w; ++j) {\n                    sum = buf[j] * f0;\n                    for (k = 1; k < kernel_size; ++k) {\n                        sum += buf[k + j] * filter[k];\n                    }\n                    dst_d[dp+j] = sum;\n                }\n                sp += w;\n                dp += w;\n            }\n\n            // vert pass\n            for (i = 0; i < w; ++i) {\n                sum = dst_d[i];\n                for (j = 0; j < half_kernel; ++j) {\n                    buf[j] = sum;\n                }\n                k = i;\n                for (j = 0; j <= h-2; j+=2, k+=w2) {\n                    buf[j+half_kernel] = dst_d[k];\n                    buf[j+half_kernel+1] = dst_d[k+w];\n                }\n                for (; j < h; ++j, k+=w) {\n                    buf[j+half_kernel] = dst_d[k];\n                }\n                sum = dst_d[(h-1)*w + i];\n                for (j = h; j < half_kernel + h; ++j) {\n                    buf[j + half_kernel] = sum;\n                }\n                dp = i;\n                for (j = 0; j <= h-4; j+=4, dp+=w4) { \n                    sum = buf[j] * f0, \n                    sum1 = buf[j+1] * f0,\n                    sum2 = buf[j+2] * f0,\n                    sum3 = buf[j+3] * f0;\n                    for (k = 1; k < kernel_size; ++k) {\n                        fk = filter[k];\n                        sum += buf[k + j] * fk;\n                        sum1 += buf[k + j+1] * fk;\n                        sum2 += buf[k + j+2] * fk;\n                        sum3 += buf[k + j+3] * fk;\n                    }\n                    dst_d[dp] = sum;\n                    dst_d[dp+w] = sum1;\n                    dst_d[dp+w2] = sum2;\n                    dst_d[dp+w3] = sum3;\n                }\n                for (; j < h; ++j, dp+=w) {\n                    sum = buf[j] * f0;\n                    for (k = 1; k < kernel_size; ++k) {\n                        sum += buf[k + j] * filter[k];\n                    }\n                    dst_d[dp] = sum;\n                }\n            }\n        };\n\n        return {\n            // TODO: add support for RGB/BGR order\n            // for raw arrays\n            grayscale: function(src, w, h, dst, code) {\n                // this is default image data representation in browser\n                if (typeof code === \"undefined\") { code = jsfeat.COLOR_RGBA2GRAY; }\n                var x=0, y=0, i=0, j=0, ir=0,jr=0;\n                var coeff_r = 4899, coeff_g = 9617, coeff_b = 1868, cn = 4;\n\n                if(code == jsfeat.COLOR_BGRA2GRAY || code == jsfeat.COLOR_BGR2GRAY) {\n                    coeff_r = 1868;\n                    coeff_b = 4899;\n                }\n                if(code == jsfeat.COLOR_RGB2GRAY || code == jsfeat.COLOR_BGR2GRAY) {\n                    cn = 3;\n                }\n                var cn2 = cn<<1, cn3 = (cn*3)|0;\n\n                dst.resize(w, h, 1);\n                var dst_u8 = dst.data;\n\n                for(y = 0; y < h; ++y, j+=w, i+=w*cn) {\n                    for(x = 0, ir = i, jr = j; x <= w-4; x+=4, ir+=cn<<2, jr+=4) {\n                        dst_u8[jr]     = (src[ir] * coeff_r + src[ir+1] * coeff_g + src[ir+2] * coeff_b + 8192) >> 14;\n                        dst_u8[jr + 1] = (src[ir+cn] * coeff_r + src[ir+cn+1] * coeff_g + src[ir+cn+2] * coeff_b + 8192) >> 14;\n                        dst_u8[jr + 2] = (src[ir+cn2] * coeff_r + src[ir+cn2+1] * coeff_g + src[ir+cn2+2] * coeff_b + 8192) >> 14;\n                        dst_u8[jr + 3] = (src[ir+cn3] * coeff_r + src[ir+cn3+1] * coeff_g + src[ir+cn3+2] * coeff_b + 8192) >> 14;\n                    }\n                    for (; x < w; ++x, ++jr, ir+=cn) {\n                        dst_u8[jr] = (src[ir] * coeff_r + src[ir+1] * coeff_g + src[ir+2] * coeff_b + 8192) >> 14;\n                    }\n                }\n            },\n            // derived from CCV library\n            resample: function(src, dst, nw, nh) {\n                var h=src.rows,w=src.cols;\n                if (h > nh && w > nw) {\n                    dst.resize(nw, nh, src.channel);\n                    // using the fast alternative (fix point scale, 0x100 to avoid overflow)\n                    if (src.type&jsfeat.U8_t && dst.type&jsfeat.U8_t && h * w / (nh * nw) < 0x100) {\n                        _resample_u8(src, dst, nw, nh);\n                    } else {\n                        _resample(src, dst, nw, nh);\n                    }\n                }\n            },\n\n            box_blur_gray: function(src, dst, radius, options) {\n                if (typeof options === \"undefined\") { options = 0; }\n                var w=src.cols, h=src.rows, h2=h<<1, w2=w<<1;\n                var i=0,x=0,y=0,end=0;\n                var windowSize = ((radius << 1) + 1)|0;\n                var radiusPlusOne = (radius + 1)|0, radiusPlus2 = (radiusPlusOne+1)|0;\n                var scale = options&jsfeat.BOX_BLUR_NOSCALE ? 1 : (1.0 / (windowSize*windowSize));\n\n                var tmp_buff = jsfeat.cache.get_buffer((w*h)<<2);\n\n                var sum=0, dstIndex=0, srcIndex = 0, nextPixelIndex=0, previousPixelIndex=0;\n                var data_i32 = tmp_buff.i32; // to prevent overflow\n                var data_u8 = src.data;\n                var hold=0;\n\n                dst.resize(w, h, src.channel);\n\n                // first pass\n                // no need to scale \n                //data_u8 = src.data;\n                //data_i32 = tmp;\n                for (y = 0; y < h; ++y) {\n                    dstIndex = y;\n                    sum = radiusPlusOne * data_u8[srcIndex];\n\n                    for(i = (srcIndex+1)|0, end=(srcIndex+radius)|0; i <= end; ++i) {\n                        sum += data_u8[i];\n                    }\n\n                    nextPixelIndex = (srcIndex + radiusPlusOne)|0;\n                    previousPixelIndex = srcIndex;\n                    hold = data_u8[previousPixelIndex];\n                    for(x = 0; x < radius; ++x, dstIndex += h) {\n                        data_i32[dstIndex] = sum;\n                        sum += data_u8[nextPixelIndex]- hold;\n                        nextPixelIndex ++;\n                    }\n                    for(; x < w-radiusPlus2; x+=2, dstIndex += h2) {\n                        data_i32[dstIndex] = sum;\n                        sum += data_u8[nextPixelIndex]- data_u8[previousPixelIndex];\n\n                        data_i32[dstIndex+h] = sum;\n                        sum += data_u8[nextPixelIndex+1]- data_u8[previousPixelIndex+1];\n\n                        nextPixelIndex +=2;\n                        previousPixelIndex +=2;\n                    }\n                    for(; x < w-radiusPlusOne; ++x, dstIndex += h) {\n                        data_i32[dstIndex] = sum;\n                        sum += data_u8[nextPixelIndex]- data_u8[previousPixelIndex];\n\n                        nextPixelIndex ++;\n                        previousPixelIndex ++;\n                    }\n                    \n                    hold = data_u8[nextPixelIndex-1];\n                    for(; x < w; ++x, dstIndex += h) {\n                        data_i32[dstIndex] = sum;\n\n                        sum += hold- data_u8[previousPixelIndex];\n                        previousPixelIndex ++;\n                    }\n\n                    srcIndex += w;\n                }\n                //\n                // second pass\n                srcIndex = 0;\n                //data_i32 = tmp; // this is a transpose\n                data_u8 = dst.data;\n\n                // dont scale result\n                if(scale == 1) {\n                    for (y = 0; y < w; ++y) {\n                        dstIndex = y;\n                        sum = radiusPlusOne * data_i32[srcIndex];\n\n                        for(i = (srcIndex+1)|0, end=(srcIndex+radius)|0; i <= end; ++i) {\n                            sum += data_i32[i];\n                        }\n\n                        nextPixelIndex = srcIndex + radiusPlusOne;\n                        previousPixelIndex = srcIndex;\n                        hold = data_i32[previousPixelIndex];\n\n                        for(x = 0; x < radius; ++x, dstIndex += w) {\n                            data_u8[dstIndex] = sum;\n                            sum += data_i32[nextPixelIndex]- hold;\n                            nextPixelIndex ++;\n                        }\n                        for(; x < h-radiusPlus2; x+=2, dstIndex += w2) {\n                            data_u8[dstIndex] = sum;\n                            sum += data_i32[nextPixelIndex]- data_i32[previousPixelIndex];\n\n                            data_u8[dstIndex+w] = sum;\n                            sum += data_i32[nextPixelIndex+1]- data_i32[previousPixelIndex+1];\n\n                            nextPixelIndex +=2;\n                            previousPixelIndex +=2;\n                        }\n                        for(; x < h-radiusPlusOne; ++x, dstIndex += w) {\n                            data_u8[dstIndex] = sum;\n\n                            sum += data_i32[nextPixelIndex]- data_i32[previousPixelIndex];\n                            nextPixelIndex ++;\n                            previousPixelIndex ++;\n                        }\n                        hold = data_i32[nextPixelIndex-1];\n                        for(; x < h; ++x, dstIndex += w) {\n                            data_u8[dstIndex] = sum;\n\n                            sum += hold- data_i32[previousPixelIndex];\n                            previousPixelIndex ++;\n                        }\n\n                        srcIndex += h;\n                    }\n                } else {\n                    for (y = 0; y < w; ++y) {\n                        dstIndex = y;\n                        sum = radiusPlusOne * data_i32[srcIndex];\n\n                        for(i = (srcIndex+1)|0, end=(srcIndex+radius)|0; i <= end; ++i) {\n                            sum += data_i32[i];\n                        }\n\n                        nextPixelIndex = srcIndex + radiusPlusOne;\n                        previousPixelIndex = srcIndex;\n                        hold = data_i32[previousPixelIndex];\n\n                        for(x = 0; x < radius; ++x, dstIndex += w) {\n                            data_u8[dstIndex] = sum*scale;\n                            sum += data_i32[nextPixelIndex]- hold;\n                            nextPixelIndex ++;\n                        }\n                        for(; x < h-radiusPlus2; x+=2, dstIndex += w2) {\n                            data_u8[dstIndex] = sum*scale;\n                            sum += data_i32[nextPixelIndex]- data_i32[previousPixelIndex];\n\n                            data_u8[dstIndex+w] = sum*scale;\n                            sum += data_i32[nextPixelIndex+1]- data_i32[previousPixelIndex+1];\n\n                            nextPixelIndex +=2;\n                            previousPixelIndex +=2;\n                        }\n                        for(; x < h-radiusPlusOne; ++x, dstIndex += w) {\n                            data_u8[dstIndex] = sum*scale;\n\n                            sum += data_i32[nextPixelIndex]- data_i32[previousPixelIndex];\n                            nextPixelIndex ++;\n                            previousPixelIndex ++;\n                        }\n                        hold = data_i32[nextPixelIndex-1];\n                        for(; x < h; ++x, dstIndex += w) {\n                            data_u8[dstIndex] = sum*scale;\n\n                            sum += hold- data_i32[previousPixelIndex];\n                            previousPixelIndex ++;\n                        }\n\n                        srcIndex += h;\n                    }\n                }\n\n                jsfeat.cache.put_buffer(tmp_buff);\n            },\n\n            gaussian_blur: function(src, dst, kernel_size, sigma) {\n                if (typeof sigma === \"undefined\") { sigma = 0.0; }\n                if (typeof kernel_size === \"undefined\") { kernel_size = 0; }\n                kernel_size = kernel_size == 0 ? (Math.max(1, (4.0 * sigma + 1.0 - 1e-8)) * 2 + 1)|0 : kernel_size;\n                var half_kernel = kernel_size >> 1;\n                var w = src.cols, h = src.rows;\n                var data_type = src.type, is_u8 = data_type&jsfeat.U8_t;\n\n                dst.resize(w, h, src.channel);\n\n                var src_d = src.data, dst_d = dst.data;\n                var buf,filter,buf_sz=(kernel_size + Math.max(h, w))|0;\n\n                var buf_node = jsfeat.cache.get_buffer(buf_sz<<2);\n                var filt_node = jsfeat.cache.get_buffer(kernel_size<<2);\n\n                if(is_u8) {\n                    buf = buf_node.i32;\n                    filter = filt_node.i32;\n                } else if(data_type&jsfeat.S32_t) {\n                    buf = buf_node.i32;\n                    filter = filt_node.f32;\n                } else {\n                    buf = buf_node.f32;\n                    filter = filt_node.f32;\n                }\n\n                jsfeat.math.get_gaussian_kernel(kernel_size, sigma, filter, data_type);\n\n                if(is_u8) {\n                    _convol_u8(buf, src_d, dst_d, w, h, filter, kernel_size, half_kernel);\n                } else {\n                    _convol(buf, src_d, dst_d, w, h, filter, kernel_size, half_kernel);\n                }\n\n                jsfeat.cache.put_buffer(buf_node);\n                jsfeat.cache.put_buffer(filt_node);\n            },\n            hough_transform: function( img, rho_res, theta_res, threshold ) {\n                var image = img.data;\n\n                var width = img.cols;\n                var height = img.rows;\n                var step = width;\n\n                min_theta = 0.0;\n                max_theta = Math.PI;\n\n                numangle = Math.round((max_theta - min_theta) / theta_res);\n                numrho = Math.round(((width + height) * 2 + 1) / rho_res);\n                irho = 1.0 / rho_res;\n\n                var accum = new Int32Array((numangle+2) * (numrho+2)); //typed arrays are initialized to 0\n                var tabSin = new Float32Array(numangle);\n                var tabCos = new Float32Array(numangle);\n\n                var n=0;\n                var ang = min_theta;\n                for(; n < numangle; n++ ) {\n                    tabSin[n] = Math.sin(ang) * irho;\n                    tabCos[n] = Math.cos(ang) * irho;\n                    ang += theta_res;\n                }\n\n                // stage 1. fill accumulator\n                for( var i = 0; i < height; i++ ) {\n                    for( var j = 0; j < width; j++ ) {\n                        if( image[i * step + j] != 0 ) {\n                            //console.log(r, (n+1) * (numrho+2) + r+1, tabCos[n], tabSin[n]);\n                            for(var n = 0; n < numangle; n++ ) {\n                                var r = Math.round( j * tabCos[n] + i * tabSin[n] );\n                                r += (numrho - 1) / 2;\n                                accum[(n+1) * (numrho+2) + r+1] += 1;\n                            }\n                        }\n                    }\n                }\n\n                // stage 2. find local maximums\n                //TODO: Consider making a vector class that uses typed arrays\n                _sort_buf = new Array();\n                for(var r = 0; r < numrho; r++ ) {\n                    for(var n = 0; n < numangle; n++ ) {\n                        var base = (n+1) * (numrho+2) + r+1;\n                        if( accum[base] > threshold &&\n                            accum[base] > accum[base - 1] && accum[base] >= accum[base + 1] &&\n                            accum[base] > accum[base - numrho - 2] && accum[base] >= accum[base + numrho + 2] ) {\n                            _sort_buf.push(base);\n                        }\n                    }\n                }\n\n                // stage 3. sort the detected lines by accumulator value\n                _sort_buf.sort(function(l1, l2) {\n                    return accum[l1] > accum[l2] || (accum[l1] == accum[l2] && l1 < l2);\n                });\n\n                // stage 4. store the first min(total,linesMax) lines to the output buffer\n                linesMax = Math.min(numangle*numrho, _sort_buf.length);\n                scale = 1.0 / (numrho+2);\n                lines = new Array();\n                for( var i = 0; i < linesMax; i++ ) {\n                    var idx = _sort_buf[i];\n                    var n = Math.floor(idx*scale) - 1;\n                    var r = idx - (n+1)*(numrho+2) - 1;\n                    var lrho = (r - (numrho - 1)*0.5) * rho_res;\n                    var langle = n * theta_res;\n                    lines.push([lrho, langle]);\n                }\n                return lines;\n            },\n            // assume we always need it for u8 image\n            pyrdown: function(src, dst, sx, sy) {\n                // this is needed for bbf\n                if (typeof sx === \"undefined\") { sx = 0; }\n                if (typeof sy === \"undefined\") { sy = 0; }\n\n                var w = src.cols, h = src.rows;\n                var w2 = w >> 1, h2 = h >> 1;\n                var _w2 = w2 - (sx << 1), _h2 = h2 - (sy << 1);\n                var x=0,y=0,sptr=sx+sy*w,sline=0,dptr=0,dline=0;\n\n                dst.resize(w2, h2, src.channel);\n\n                var src_d = src.data, dst_d = dst.data;\n\n                for(y = 0; y < _h2; ++y) {\n                    sline = sptr;\n                    dline = dptr;\n                    for(x = 0; x <= _w2-2; x+=2, dline+=2, sline += 4) {\n                        dst_d[dline] = (src_d[sline] + src_d[sline+1] +\n                                            src_d[sline+w] + src_d[sline+w+1] + 2) >> 2;\n                        dst_d[dline+1] = (src_d[sline+2] + src_d[sline+3] +\n                                            src_d[sline+w+2] + src_d[sline+w+3] + 2) >> 2;\n                    }\n                    for(; x < _w2; ++x, ++dline, sline += 2) {\n                        dst_d[dline] = (src_d[sline] + src_d[sline+1] +\n                                            src_d[sline+w] + src_d[sline+w+1] + 2) >> 2;\n                    }\n                    sptr += w << 1;\n                    dptr += w2;\n                }\n            },\n\n            // dst: [gx,gy,...]\n            scharr_derivatives: function(src, dst) {\n                var w = src.cols, h = src.rows;\n                var dstep = w<<1,x=0,y=0,x1=0,a,b,c,d,e,f;\n                var srow0=0,srow1=0,srow2=0,drow=0;\n                var trow0,trow1;\n\n                dst.resize(w, h, 2); // 2 channel output gx, gy\n\n                var img = src.data, gxgy=dst.data;\n\n                var buf0_node = jsfeat.cache.get_buffer((w+2)<<2);\n                var buf1_node = jsfeat.cache.get_buffer((w+2)<<2);\n\n                if(src.type&jsfeat.U8_t || src.type&jsfeat.S32_t) {\n                    trow0 = buf0_node.i32;\n                    trow1 = buf1_node.i32;\n                } else {\n                    trow0 = buf0_node.f32;\n                    trow1 = buf1_node.f32;\n                }\n\n                for(; y < h; ++y, srow1+=w) {\n                    srow0 = ((y > 0 ? y-1 : 1)*w)|0;\n                    srow2 = ((y < h-1 ? y+1 : h-2)*w)|0;\n                    drow = (y*dstep)|0;\n                    // do vertical convolution\n                    for(x = 0, x1 = 1; x <= w-2; x+=2, x1+=2) {\n                        a = img[srow0+x], b = img[srow2+x];\n                        trow0[x1] = ( (a + b)*3 + (img[srow1+x])*10 );\n                        trow1[x1] = ( b - a );\n                        //\n                        a = img[srow0+x+1], b = img[srow2+x+1];\n                        trow0[x1+1] = ( (a + b)*3 + (img[srow1+x+1])*10 );\n                        trow1[x1+1] = ( b - a );\n                    }\n                    for(; x < w; ++x, ++x1) {\n                        a = img[srow0+x], b = img[srow2+x];\n                        trow0[x1] = ( (a + b)*3 + (img[srow1+x])*10 );\n                        trow1[x1] = ( b - a );\n                    }\n                    // make border\n                    x = (w + 1)|0;\n                    trow0[0] = trow0[1]; trow0[x] = trow0[w];\n                    trow1[0] = trow1[1]; trow1[x] = trow1[w];\n                    // do horizontal convolution, interleave the results and store them\n                    for(x = 0; x <= w-4; x+=4) {\n                        a = trow1[x+2], b = trow1[x+1], c = trow1[x+3], d = trow1[x+4],\n                        e = trow0[x+2], f = trow0[x+3];\n                        gxgy[drow++] = ( e - trow0[x] );\n                        gxgy[drow++] = ( (a + trow1[x])*3 + b*10 );\n                        gxgy[drow++] = ( f - trow0[x+1] );\n                        gxgy[drow++] = ( (c + b)*3 + a*10 );\n\n                        gxgy[drow++] = ( (trow0[x+4] - e) );\n                        gxgy[drow++] = ( ((d + a)*3 + c*10) );\n                        gxgy[drow++] = ( (trow0[x+5] - f) );\n                        gxgy[drow++] = ( ((trow1[x+5] + c)*3 + d*10) );\n                    }\n                    for(; x < w; ++x) {\n                        gxgy[drow++] = ( (trow0[x+2] - trow0[x]) );\n                        gxgy[drow++] = ( ((trow1[x+2] + trow1[x])*3 + trow1[x+1]*10) );\n                    }\n                }\n                jsfeat.cache.put_buffer(buf0_node);\n                jsfeat.cache.put_buffer(buf1_node);\n            },\n\n            // compute gradient using Sobel kernel [1 2 1] * [-1 0 1]^T\n            // dst: [gx,gy,...]\n            sobel_derivatives: function(src, dst) {\n                var w = src.cols, h = src.rows;\n                var dstep = w<<1,x=0,y=0,x1=0,a,b,c,d,e,f;\n                var srow0=0,srow1=0,srow2=0,drow=0;\n                var trow0,trow1;\n\n                dst.resize(w, h, 2); // 2 channel output gx, gy\n\n                var img = src.data, gxgy=dst.data;\n\n                var buf0_node = jsfeat.cache.get_buffer((w+2)<<2);\n                var buf1_node = jsfeat.cache.get_buffer((w+2)<<2);\n\n                if(src.type&jsfeat.U8_t || src.type&jsfeat.S32_t) {\n                    trow0 = buf0_node.i32;\n                    trow1 = buf1_node.i32;\n                } else {\n                    trow0 = buf0_node.f32;\n                    trow1 = buf1_node.f32;\n                }\n\n                for(; y < h; ++y, srow1+=w) {\n                    srow0 = ((y > 0 ? y-1 : 1)*w)|0;\n                    srow2 = ((y < h-1 ? y+1 : h-2)*w)|0;\n                    drow = (y*dstep)|0;\n                    // do vertical convolution\n                    for(x = 0, x1 = 1; x <= w-2; x+=2, x1+=2) {\n                        a = img[srow0+x], b = img[srow2+x];\n                        trow0[x1] = ( (a + b) + (img[srow1+x]*2) );\n                        trow1[x1] = ( b - a );\n                        //\n                        a = img[srow0+x+1], b = img[srow2+x+1];\n                        trow0[x1+1] = ( (a + b) + (img[srow1+x+1]*2) );\n                        trow1[x1+1] = ( b - a );\n                    }\n                    for(; x < w; ++x, ++x1) {\n                        a = img[srow0+x], b = img[srow2+x];\n                        trow0[x1] = ( (a + b) + (img[srow1+x]*2) );\n                        trow1[x1] = ( b - a );\n                    }\n                    // make border\n                    x = (w + 1)|0;\n                    trow0[0] = trow0[1]; trow0[x] = trow0[w];\n                    trow1[0] = trow1[1]; trow1[x] = trow1[w];\n                    // do horizontal convolution, interleave the results and store them\n                    for(x = 0; x <= w-4; x+=4) {\n                        a = trow1[x+2], b = trow1[x+1], c = trow1[x+3], d = trow1[x+4],\n                        e = trow0[x+2], f = trow0[x+3];\n                        gxgy[drow++] = ( e - trow0[x] );\n                        gxgy[drow++] = ( a + trow1[x] + b*2 );\n                        gxgy[drow++] = ( f - trow0[x+1] );\n                        gxgy[drow++] = ( c + b + a*2 );\n\n                        gxgy[drow++] = ( trow0[x+4] - e );\n                        gxgy[drow++] = ( d + a + c*2 );\n                        gxgy[drow++] = ( trow0[x+5] - f );\n                        gxgy[drow++] = ( trow1[x+5] + c + d*2 );\n                    }\n                    for(; x < w; ++x) {\n                        gxgy[drow++] = ( trow0[x+2] - trow0[x] );\n                        gxgy[drow++] = ( trow1[x+2] + trow1[x] + trow1[x+1]*2 );\n                    }\n                }\n                jsfeat.cache.put_buffer(buf0_node);\n                jsfeat.cache.put_buffer(buf1_node);\n            },\n\n            // please note: \n            // dst_(type) size should be cols = src.cols+1, rows = src.rows+1\n            compute_integral_image: function(src, dst_sum, dst_sqsum, dst_tilted) {\n                var w0=src.cols|0,h0=src.rows|0,src_d=src.data;\n                var w1=(w0+1)|0;\n                var s=0,s2=0,p=0,pup=0,i=0,j=0,v=0,k=0;\n\n                if(dst_sum && dst_sqsum) {\n                    // fill first row with zeros\n                    for(; i < w1; ++i) {\n                        dst_sum[i] = 0, dst_sqsum[i] = 0;\n                    }\n                    p = (w1+1)|0, pup = 1;\n                    for(i = 0, k = 0; i < h0; ++i, ++p, ++pup) {\n                        s = s2 = 0;\n                        for(j = 0; j <= w0-2; j+=2, k+=2, p+=2, pup+=2) {\n                            v = src_d[k];\n                            s += v, s2 += v*v;\n                            dst_sum[p] = dst_sum[pup] + s;\n                            dst_sqsum[p] = dst_sqsum[pup] + s2;\n\n                            v = src_d[k+1];\n                            s += v, s2 += v*v;\n                            dst_sum[p+1] = dst_sum[pup+1] + s;\n                            dst_sqsum[p+1] = dst_sqsum[pup+1] + s2;\n                        }\n                        for(; j < w0; ++j, ++k, ++p, ++pup) {\n                            v = src_d[k];\n                            s += v, s2 += v*v;\n                            dst_sum[p] = dst_sum[pup] + s;\n                            dst_sqsum[p] = dst_sqsum[pup] + s2;\n                        }\n                    }\n                } else if(dst_sum) {\n                    // fill first row with zeros\n                    for(; i < w1; ++i) {\n                        dst_sum[i] = 0;\n                    }\n                    p = (w1+1)|0, pup = 1;\n                    for(i = 0, k = 0; i < h0; ++i, ++p, ++pup) {\n                        s = 0;\n                        for(j = 0; j <= w0-2; j+=2, k+=2, p+=2, pup+=2) {\n                            s += src_d[k];\n                            dst_sum[p] = dst_sum[pup] + s;\n                            s += src_d[k+1];\n                            dst_sum[p+1] = dst_sum[pup+1] + s;\n                        }\n                        for(; j < w0; ++j, ++k, ++p, ++pup) {\n                            s += src_d[k];\n                            dst_sum[p] = dst_sum[pup] + s;\n                        }\n                    }\n                } else if(dst_sqsum) {\n                    // fill first row with zeros\n                    for(; i < w1; ++i) {\n                        dst_sqsum[i] = 0;\n                    }\n                    p = (w1+1)|0, pup = 1;\n                    for(i = 0, k = 0; i < h0; ++i, ++p, ++pup) {\n                        s2 = 0;\n                        for(j = 0; j <= w0-2; j+=2, k+=2, p+=2, pup+=2) {\n                            v = src_d[k];\n                            s2 += v*v;\n                            dst_sqsum[p] = dst_sqsum[pup] + s2;\n                            v = src_d[k+1];\n                            s2 += v*v;\n                            dst_sqsum[p+1] = dst_sqsum[pup+1] + s2;\n                        }\n                        for(; j < w0; ++j, ++k, ++p, ++pup) {\n                            v = src_d[k];\n                            s2 += v*v;\n                            dst_sqsum[p] = dst_sqsum[pup] + s2;\n                        }\n                    }\n                }\n\n                if(dst_tilted) {\n                    // fill first row with zeros\n                    for(i = 0; i < w1; ++i) {\n                        dst_tilted[i] = 0;\n                    }\n                    // diagonal\n                    p = (w1+1)|0, pup = 0;\n                    for(i = 0, k = 0; i < h0; ++i, ++p, ++pup) {\n                        for(j = 0; j <= w0-2; j+=2, k+=2, p+=2, pup+=2) {\n                            dst_tilted[p] = src_d[k] + dst_tilted[pup];\n                            dst_tilted[p+1] = src_d[k+1] + dst_tilted[pup+1];\n                        }\n                        for(; j < w0; ++j, ++k, ++p, ++pup) {\n                            dst_tilted[p] = src_d[k] + dst_tilted[pup];\n                        }\n                    }\n                    // diagonal\n                    p = (w1+w0)|0, pup = w0;\n                    for(i = 0; i < h0; ++i, p+=w1, pup+=w1) {\n                        dst_tilted[p] += dst_tilted[pup];\n                    }\n\n                    for(j = w0-1; j > 0; --j) {\n                        p = j+h0*w1, pup=p-w1;\n                        for(i = h0; i > 0; --i, p-=w1, pup-=w1) {\n                            dst_tilted[p] += dst_tilted[pup] + dst_tilted[pup+1];\n                        }\n                    }\n                }\n            },\n            equalize_histogram: function(src, dst) {\n                var w=src.cols,h=src.rows,src_d=src.data;\n\n                dst.resize(w, h, src.channel);\n\n                var dst_d=dst.data,size=w*h;\n                var i=0,prev=0,hist0,norm;\n\n                var hist0_node = jsfeat.cache.get_buffer(256<<2);\n                hist0 = hist0_node.i32;\n                for(; i < 256; ++i) hist0[i] = 0;\n                for (i = 0; i < size; ++i) {\n                    ++hist0[src_d[i]];\n                }\n\n                prev = hist0[0];\n                for (i = 1; i < 256; ++i) {\n                    prev = hist0[i] += prev;\n                }\n\n                norm = 255 / size;\n                for (i = 0; i < size; ++i) {\n                    dst_d[i] = (hist0[src_d[i]] * norm + 0.5)|0;\n                }\n                jsfeat.cache.put_buffer(hist0_node);\n            },\n\n            canny: function(src, dst, low_thresh, high_thresh) {\n                var w=src.cols,h=src.rows,src_d=src.data;\n\n                dst.resize(w, h, src.channel);\n                \n                var dst_d=dst.data;\n                var i=0,j=0,grad=0,w2=w<<1,_grad=0,suppress=0,f=0,x=0,y=0,s=0;\n                var tg22x=0,tg67x=0;\n\n                // cache buffers\n                var dxdy_node = jsfeat.cache.get_buffer((h * w2)<<2);\n                var buf_node = jsfeat.cache.get_buffer((3 * (w + 2))<<2);\n                var map_node = jsfeat.cache.get_buffer(((h+2) * (w + 2))<<2);\n                var stack_node = jsfeat.cache.get_buffer((h * w)<<2);\n                \n\n                var buf = buf_node.i32;\n                var map = map_node.i32;\n                var stack = stack_node.i32;\n                var dxdy = dxdy_node.i32;\n                var dxdy_m = new jsfeat.matrix_t(w, h, jsfeat.S32C2_t, dxdy_node.data);\n                var row0=1,row1=(w+2+1)|0,row2=(2*(w+2)+1)|0,map_w=(w+2)|0,map_i=(map_w+1)|0,stack_i=0;\n\n                this.sobel_derivatives(src, dxdy_m);\n\n                if(low_thresh > high_thresh) {\n                    i = low_thresh;\n                    low_thresh = high_thresh;\n                    high_thresh = i;\n                }\n\n                i = (3 * (w + 2))|0;\n                while(--i>=0) {\n                    buf[i] = 0;\n                }\n\n                i = ((h+2) * (w + 2))|0;\n                while(--i>=0) {\n                    map[i] = 0;\n                }\n\n                for (; j < w; ++j, grad+=2) {\n                    //buf[row1+j] = Math.abs(dxdy[grad]) + Math.abs(dxdy[grad+1]);\n                    x = dxdy[grad], y = dxdy[grad+1];\n                    //buf[row1+j] = x*x + y*y;\n                    buf[row1+j] = ((x ^ (x >> 31)) - (x >> 31)) + ((y ^ (y >> 31)) - (y >> 31));\n                }\n\n                for(i=1; i <= h; ++i, grad+=w2) {\n                    if(i == h) {\n                        j = row2+w;\n                        while(--j>=row2) {\n                            buf[j] = 0;\n                        }\n                    } else {\n                        for (j = 0; j < w; j++) {\n                            //buf[row2+j] =  Math.abs(dxdy[grad+(j<<1)]) + Math.abs(dxdy[grad+(j<<1)+1]);\n                            x = dxdy[grad+(j<<1)], y = dxdy[grad+(j<<1)+1];\n                            //buf[row2+j] = x*x + y*y;\n                            buf[row2+j] = ((x ^ (x >> 31)) - (x >> 31)) + ((y ^ (y >> 31)) - (y >> 31));\n                        }\n                    }\n                    _grad = (grad - w2)|0;\n                    map[map_i-1] = 0;\n                    suppress = 0;\n                    for(j = 0; j < w; ++j, _grad+=2) {\n                        f = buf[row1+j];\n                        if (f > low_thresh) {\n                            x = dxdy[_grad];\n                            y = dxdy[_grad+1];\n                            s = x ^ y;\n                            // seems ot be faster than Math.abs\n                            x = ((x ^ (x >> 31)) - (x >> 31))|0;\n                            y = ((y ^ (y >> 31)) - (y >> 31))|0;\n                            //x * tan(22.5) x * tan(67.5) == 2 * x + x * tan(22.5)\n                            tg22x = x * 13573;\n                            tg67x = tg22x + ((x + x) << 15);\n                            y <<= 15;\n                            if (y < tg22x) {\n                                if (f > buf[row1+j-1] && f >= buf[row1+j+1]) {\n                                    if (f > high_thresh && !suppress && map[map_i+j-map_w] != 2) {\n                                        map[map_i+j] = 2;\n                                        suppress = 1;\n                                        stack[stack_i++] = map_i + j;\n                                    } else {\n                                        map[map_i+j] = 1;\n                                    }\n                                    continue;\n                                }\n                            } else if (y > tg67x) {\n                                if (f > buf[row0+j] && f >= buf[row2+j]) {\n                                    if (f > high_thresh && !suppress && map[map_i+j-map_w] != 2) {\n                                        map[map_i+j] = 2;\n                                        suppress = 1;\n                                        stack[stack_i++] = map_i + j;\n                                    } else {\n                                        map[map_i+j] = 1;\n                                    }\n                                    continue;\n                                }\n                            } else {\n                                s = s < 0 ? -1 : 1;\n                                if (f > buf[row0+j-s] && f > buf[row2+j+s]) {\n                                    if (f > high_thresh && !suppress && map[map_i+j-map_w] != 2) {\n                                        map[map_i+j] = 2;\n                                        suppress = 1;\n                                        stack[stack_i++] = map_i + j;\n                                    } else {\n                                        map[map_i+j] = 1;\n                                    }\n                                    continue;\n                                }\n                            }\n                        }\n                        map[map_i+j] = 0;\n                        suppress = 0;\n                    }\n                    map[map_i+w] = 0;\n                    map_i += map_w;\n                    j = row0;\n                    row0 = row1;\n                    row1 = row2;\n                    row2 = j;\n                }\n\n                j = map_i - map_w - 1;\n                for(i = 0; i < map_w; ++i, ++j) {\n                    map[j] = 0;\n                }\n                // path following\n                while(stack_i > 0) {\n                    map_i = stack[--stack_i];\n                    map_i -= map_w+1;\n                    if(map[map_i] == 1) map[map_i] = 2, stack[stack_i++] = map_i;\n                    map_i += 1;\n                    if(map[map_i] == 1) map[map_i] = 2, stack[stack_i++] = map_i;\n                    map_i += 1;\n                    if(map[map_i] == 1) map[map_i] = 2, stack[stack_i++] = map_i;\n                    map_i += map_w;\n                    if(map[map_i] == 1) map[map_i] = 2, stack[stack_i++] = map_i;\n                    map_i -= 2;\n                    if(map[map_i] == 1) map[map_i] = 2, stack[stack_i++] = map_i;\n                    map_i += map_w;\n                    if(map[map_i] == 1) map[map_i] = 2, stack[stack_i++] = map_i;\n                    map_i += 1;\n                    if(map[map_i] == 1) map[map_i] = 2, stack[stack_i++] = map_i;\n                    map_i += 1;\n                    if(map[map_i] == 1) map[map_i] = 2, stack[stack_i++] = map_i;\n                }\n\n                map_i = map_w + 1;\n                row0 = 0;\n                for(i = 0; i < h; ++i, map_i+=map_w) {\n                    for(j = 0; j < w; ++j) {\n                        dst_d[row0++] = (map[map_i+j] == 2) * 0xff;\n                    }\n                }\n\n                // free buffers\n                jsfeat.cache.put_buffer(dxdy_node);\n                jsfeat.cache.put_buffer(buf_node);\n                jsfeat.cache.put_buffer(map_node);\n                jsfeat.cache.put_buffer(stack_node);\n            },\n            // transform is 3x3 matrix_t\n            warp_perspective: function(src, dst, transform, fill_value) {\n                if (typeof fill_value === \"undefined\") { fill_value = 0; }\n                var src_width=src.cols|0, src_height=src.rows|0, dst_width=dst.cols|0, dst_height=dst.rows|0;\n                var src_d=src.data, dst_d=dst.data;\n                var x=0,y=0,off=0,ixs=0,iys=0,xs=0.0,ys=0.0,xs0=0.0,ys0=0.0,ws=0.0,sc=0.0,a=0.0,b=0.0,p0=0.0,p1=0.0;\n                var td=transform.data;\n                var m00=td[0],m01=td[1],m02=td[2],\n                    m10=td[3],m11=td[4],m12=td[5],\n                    m20=td[6],m21=td[7],m22=td[8];\n\n                for(var dptr = 0; y < dst_height; ++y) {\n                    xs0 = m01 * y + m02,\n                    ys0 = m11 * y + m12,\n                    ws  = m21 * y + m22;\n                    for(x = 0; x < dst_width; ++x, ++dptr, xs0+=m00, ys0+=m10, ws+=m20) {\n                        sc = 1.0 / ws;\n                        xs = xs0 * sc, ys = ys0 * sc;\n                        ixs = xs | 0, iys = ys | 0;\n\n                        if(xs > 0 && ys > 0 && ixs < (src_width - 1) && iys < (src_height - 1)) {\n                            a = Math.max(xs - ixs, 0.0);\n                            b = Math.max(ys - iys, 0.0);\n                            off = (src_width*iys + ixs)|0;\n\n                            p0 = src_d[off] +  a * (src_d[off+1] - src_d[off]);\n                            p1 = src_d[off+src_width] + a * (src_d[off+src_width+1] - src_d[off+src_width]);\n\n                            dst_d[dptr] = p0 + b * (p1 - p0);\n                        }\n                        else dst_d[dptr] = fill_value;\n                    }\n                }\n            },\n            // transform is 3x3 or 2x3 matrix_t only first 6 values referenced\n            warp_affine: function(src, dst, transform, fill_value) {\n                if (typeof fill_value === \"undefined\") { fill_value = 0; }\n                var src_width=src.cols, src_height=src.rows, dst_width=dst.cols, dst_height=dst.rows;\n                var src_d=src.data, dst_d=dst.data;\n                var x=0,y=0,off=0,ixs=0,iys=0,xs=0.0,ys=0.0,a=0.0,b=0.0,p0=0.0,p1=0.0;\n                var td=transform.data;\n                var m00=td[0],m01=td[1],m02=td[2],\n                    m10=td[3],m11=td[4],m12=td[5];\n\n                for(var dptr = 0; y < dst_height; ++y) {\n                    xs = m01 * y + m02;\n                    ys = m11 * y + m12;\n                    for(x = 0; x < dst_width; ++x, ++dptr, xs+=m00, ys+=m10) {\n                        ixs = xs | 0; iys = ys | 0;\n\n                        if(ixs >= 0 && iys >= 0 && ixs < (src_width - 1) && iys < (src_height - 1)) {\n                            a = xs - ixs;\n                            b = ys - iys;\n                            off = src_width*iys + ixs;\n\n                            p0 = src_d[off] +  a * (src_d[off+1] - src_d[off]);\n                            p1 = src_d[off+src_width] + a * (src_d[off+src_width+1] - src_d[off+src_width]);\n\n                            dst_d[dptr] = p0 + b * (p1 - p0);\n                        }\n                        else dst_d[dptr] = fill_value;\n                    }\n                }\n            },\n            \n            // Basic RGB Skin detection filter\n            // from http://popscan.blogspot.fr/2012/08/skin-detection-in-digital-images.html\n            skindetector: function(src,dst) {\n                var r,g,b,j;\n                var i = src.width*src.height;\n                while(i--){\n                    j = i*4;\n                    r = src.data[j];\n                    g = src.data[j+1];\n                    b = src.data[j+2];\n                    if((r>95)&&(g>40)&&(b>20)\n                     &&(r>g)&&(r>b)\n                     &&(r-Math.min(g,b)>15)\n                     &&(Math.abs(r-g)>15)){\n                         dst[i] = 255;\n                    } else {\n                        dst[i] = 0;\n                    }\n                }                \n            }\n        };\n    })();\n\n    global.imgproc = imgproc;\n\n})(jsfeat);\n/**\n * @author Eugene Zatepyakin / http://inspirit.ru/\n *\n * This is FAST corner detector, contributed to OpenCV by the author, Edward Rosten.\n */\n\n/*\nThe references are:\n * Machine learning for high-speed corner detection,\n   E. Rosten and T. Drummond, ECCV 2006\n * Faster and better: A machine learning approach to corner detection\n   E. Rosten, R. Porter and T. Drummond, PAMI, 2009  \n*/\n\n(function(global) {\n    \"use strict\";\n    //\n    var fast_corners = (function() {\n\n        var offsets16 = new Int32Array([0, 3, 1, 3, 2, 2, 3, 1, 3, 0, 3, -1, 2, -2, 1, -3, 0, -3, -1, -3, -2, -2, -3, -1, -3, 0, -3, 1, -2, 2, -1, 3]);\n\n        var threshold_tab = new Uint8Array(512);\n        var pixel_off = new Int32Array(25);\n        var score_diff = new Int32Array(25);\n\n        // private functions\n        var _cmp_offsets = function(pixel, step, pattern_size) {\n            var k = 0;\n            var offsets = offsets16;\n            for( ; k < pattern_size; ++k ) {\n                pixel[k] = offsets[k<<1] + offsets[(k<<1)+1] * step;\n            }\n            for( ; k < 25; ++k ) {\n                pixel[k] = pixel[k - pattern_size];\n            }\n        },\n\n        _cmp_score_16 = function(src, off, pixel, d, threshold) {\n            var N = 25, k = 0, v = src[off];\n            var a0 = threshold,a=0,b0=0,b=0;\n\n            for( ; k < N; ++k ) {\n                d[k] = v - src[off+pixel[k]];\n            }\n\n            for( k = 0; k < 16; k += 2 ) {\n                a = Math.min(d[k+1], d[k+2]);\n                a = Math.min(a, d[k+3]);\n\n                if( a <= a0 ) continue;\n\n                a = Math.min(a, d[k+4]);\n                a = Math.min(a, d[k+5]);\n                a = Math.min(a, d[k+6]);\n                a = Math.min(a, d[k+7]);\n                a = Math.min(a, d[k+8]);\n                a0 = Math.max(a0, Math.min(a, d[k]));\n                a0 = Math.max(a0, Math.min(a, d[k+9]));\n            }\n\n            b0 = -a0;\n            for( k = 0; k < 16; k += 2 ) {\n                b = Math.max(d[k+1], d[k+2]);\n                b = Math.max(b, d[k+3]);\n                b = Math.max(b, d[k+4]);\n                b = Math.max(b, d[k+5]);\n\n                if( b >= b0 ) continue;\n                b = Math.max(b, d[k+6]);\n                b = Math.max(b, d[k+7]);\n                b = Math.max(b, d[k+8]);\n                b0 = Math.min(b0, Math.max(b, d[k]));\n                b0 = Math.min(b0, Math.max(b, d[k+9]));\n            }\n\n            return -b0-1;\n        };\n\n        var _threshold = 20;\n\n        return {\n            set_threshold: function(threshold) {\n                _threshold = Math.min(Math.max(threshold, 0), 255);\n                for (var i = -255; i <= 255; ++i) {\n                    threshold_tab[(i + 255)] = (i < -_threshold ? 1 : (i > _threshold ? 2 : 0));\n                }\n                return _threshold;\n            },\n            \n            detect: function(src, corners, border) {\n                if (typeof border === \"undefined\") { border = 3; }\n\n                var K = 8, N = 25;\n                var img = src.data, w = src.cols, h = src.rows;\n                var i=0, j=0, k=0, vt=0, x=0, m3=0;\n                var buf_node = jsfeat.cache.get_buffer(3 * w);\n                var cpbuf_node = jsfeat.cache.get_buffer(((w+1)*3)<<2);\n                var buf = buf_node.u8;\n                var cpbuf = cpbuf_node.i32;\n                var pixel = pixel_off;\n                var sd = score_diff;\n                var sy = Math.max(3, border);\n                var ey = Math.min((h-2), (h-border));\n                var sx = Math.max(3, border);\n                var ex = Math.min((w - 3), (w - border));\n                var _count = 0, corners_cnt = 0, pt;\n                var score_func = _cmp_score_16;\n                var thresh_tab = threshold_tab;\n                var threshold = _threshold;\n\n                var v=0,tab=0,d=0,ncorners=0,cornerpos=0,curr=0,ptr=0,prev=0,pprev=0;\n                var jp1=0,jm1=0,score=0;\n\n                _cmp_offsets(pixel, w, 16);\n\n                // local vars are faster?\n                var pixel0 = pixel[0];\n                var pixel1 = pixel[1];\n                var pixel2 = pixel[2];\n                var pixel3 = pixel[3];\n                var pixel4 = pixel[4];\n                var pixel5 = pixel[5];\n                var pixel6 = pixel[6];\n                var pixel7 = pixel[7];\n                var pixel8 = pixel[8];\n                var pixel9 = pixel[9];\n                var pixel10 = pixel[10];\n                var pixel11 = pixel[11];\n                var pixel12 = pixel[12];\n                var pixel13 = pixel[13];\n                var pixel14 = pixel[14];\n                var pixel15 = pixel[15];\n\n                for(i = 0; i < w*3; ++i) {\n                    buf[i] = 0;\n                }\n\n                for(i = sy; i < ey; ++i) {\n                    ptr = ((i * w) + sx)|0;\n                    m3 = (i - 3)%3;\n                    curr = (m3*w)|0;\n                    cornerpos = (m3*(w+1))|0;\n                    for (j = 0; j < w; ++j) buf[curr+j] = 0;\n                    ncorners = 0;\n                    \n                    if( i < (ey - 1) ) {\n                        j = sx;\n                        \n                        for( ; j < ex; ++j, ++ptr ) {\n                            v = img[ptr];\n                            tab = ( - v + 255 );\n                            d = ( thresh_tab[tab+img[ptr+pixel0]] | thresh_tab[tab+img[ptr+pixel8]] );\n                            \n                            if( d == 0 ) {\n                                continue;\n                            }\n                            \n                            d &= ( thresh_tab[tab+img[ptr+pixel2]] | thresh_tab[tab+img[ptr+pixel10]] );\n                            d &= ( thresh_tab[tab+img[ptr+pixel4]] | thresh_tab[tab+img[ptr+pixel12]] );\n                            d &= ( thresh_tab[tab+img[ptr+pixel6]] | thresh_tab[tab+img[ptr+pixel14]] );\n                            \n                            if( d == 0 ) {\n                                continue;\n                            }\n                            \n                            d &= ( thresh_tab[tab+img[ptr+pixel1]] | thresh_tab[tab+img[ptr+pixel9]] );\n                            d &= ( thresh_tab[tab+img[ptr+pixel3]] | thresh_tab[tab+img[ptr+pixel11]] );\n                            d &= ( thresh_tab[tab+img[ptr+pixel5]] | thresh_tab[tab+img[ptr+pixel13]] );\n                            d &= ( thresh_tab[tab+img[ptr+pixel7]] | thresh_tab[tab+img[ptr+pixel15]] );\n                            \n                            if( d & 1 ) {\n                                vt = (v - threshold);\n                                _count = 0;\n                                \n                                for( k = 0; k < N; ++k ) {\n                                    x = img[(ptr+pixel[k])];\n                                    if(x < vt) {\n                                        ++_count;\n                                        if( _count > K ) {\n                                            ++ncorners;\n                                            cpbuf[cornerpos+ncorners] = j;\n                                            buf[curr+j] = score_func(img, ptr, pixel, sd, threshold);\n                                            break;\n                                        }\n                                    }\n                                    else {\n                                        _count = 0;\n                                    }\n                                }\n                            }\n                            \n                            if( d & 2 ) {\n                                vt = (v + threshold);\n                                _count = 0;\n                                \n                                for( k = 0; k < N; ++k ) {\n                                    x = img[(ptr+pixel[k])];\n                                    if(x > vt) {\n                                        ++_count;\n                                        if( _count > K ) {\n                                            ++ncorners;\n                                            cpbuf[cornerpos+ncorners] = j;\n                                            buf[curr+j] = score_func(img, ptr, pixel, sd, threshold);\n                                            break;\n                                        }\n                                    }\n                                    else {\n                                        _count = 0;\n                                    }\n                                }\n                            }\n                        }\n                    }\n                    \n                    cpbuf[cornerpos+w] = ncorners;\n            \n                    if ( i == sy ) {\n                        continue;\n                    }\n                    \n                    m3 = (i - 4 + 3)%3;\n                    prev = (m3*w)|0;\n                    cornerpos = (m3*(w+1))|0;\n                    m3 = (i - 5 + 3)%3;\n                    pprev = (m3*w)|0;\n\n                    ncorners = cpbuf[cornerpos+w];\n                    \n                    for( k = 0; k < ncorners; ++k ) {\n                        j = cpbuf[cornerpos+k];\n                        jp1 = (j+1)|0;\n                        jm1 = (j-1)|0;\n                        score = buf[prev+j];\n                        if( (score > buf[prev+jp1] && score > buf[prev+jm1] &&\n                            score > buf[pprev+jm1] && score > buf[pprev+j] && score > buf[pprev+jp1] &&\n                            score > buf[curr+jm1] && score > buf[curr+j] && score > buf[curr+jp1]) ) {\n                            // save corner\n                            pt = corners[corners_cnt];\n                            pt.x = j, pt.y = (i-1), pt.score = score;\n                            corners_cnt++;\n                        }\n                    }\n                } // y loop\n                jsfeat.cache.put_buffer(buf_node);\n                jsfeat.cache.put_buffer(cpbuf_node);\n                return corners_cnt;\n            }\n        };\n    })();\n\n    global.fast_corners = fast_corners;\n    fast_corners.set_threshold(20); // set default\n\n})(jsfeat);\n/**\n * @author Eugene Zatepyakin / http://inspirit.ru/\n *\n * Copyright 2007 Computer Vision Lab,\n * Ecole Polytechnique Federale de Lausanne (EPFL), Switzerland.\n * @author Vincent Lepetit (http://cvlab.epfl.ch/~lepetit)\n */\n\n(function(global) {\n    \"use strict\";\n    //\n\n    var yape06 = (function() {\n        \n        var compute_laplacian = function(src, dst, w, h, Dxx, Dyy, sx,sy, ex,ey) {\n            var y=0,x=0,yrow=(sy*w+sx)|0,row=yrow;\n\n            for(y = sy; y < ey; ++y, yrow+=w, row = yrow) {\n                for(x = sx; x < ex; ++x, ++row) {\n                    dst[row] = -4 * src[row] + src[row+Dxx] + src[row-Dxx] + src[row+Dyy] + src[row-Dyy];\n                }\n            }\n        };\n\n        var hessian_min_eigen_value = function(src, off, tr, Dxx, Dyy, Dxy, Dyx) {\n            var Ixx = -2 * src[off] + src[off + Dxx] + src[off - Dxx];\n            var Iyy = -2 * src[off] + src[off + Dyy] + src[off - Dyy];\n            var Ixy = src[off + Dxy] + src[off - Dxy] - src[off + Dyx] - src[off - Dyx];\n            var sqrt_delta = ( Math.sqrt(((Ixx - Iyy) * (Ixx - Iyy) + 4 * Ixy * Ixy) ) )|0;\n\n            return Math.min(Math.abs(tr - sqrt_delta), Math.abs(-(tr + sqrt_delta)));\n        };\n\n        return {\n\n            laplacian_threshold: 30,\n            min_eigen_value_threshold: 25,\n\n            detect: function(src, points, border) {\n                if (typeof border === \"undefined\") { border = 5; }\n                var x=0,y=0;\n                var w=src.cols, h=src.rows, srd_d=src.data;\n                var Dxx = 5, Dyy = (5 * w)|0;\n                var Dxy = (3 + 3 * w)|0, Dyx = (3 - 3 * w)|0;\n                var lap_buf = jsfeat.cache.get_buffer((w*h)<<2);\n                var laplacian = lap_buf.i32;\n                var lv=0, row=0,rowx=0,min_eigen_value=0,pt;\n                var number_of_points = 0;\n                var lap_thresh = this.laplacian_threshold;\n                var eigen_thresh = this.min_eigen_value_threshold;\n\n                var sx = Math.max(5, border)|0;\n                var sy = Math.max(3, border)|0;\n                var ex = Math.min(w-5, w-border)|0;\n                var ey = Math.min(h-3, h-border)|0;\n\n                x = w*h;\n                while(--x>=0) {laplacian[x]=0;}\n                compute_laplacian(srd_d, laplacian, w, h, Dxx, Dyy, sx,sy, ex,ey);\n\n                row = (sy*w+sx)|0;\n                for(y = sy; y < ey; ++y, row += w) {\n                    for(x = sx, rowx=row; x < ex; ++x, ++rowx) {\n\n                        lv = laplacian[rowx];\n                        if ((lv < -lap_thresh &&\n                            lv < laplacian[rowx - 1]      && lv < laplacian[rowx + 1] &&\n                            lv < laplacian[rowx - w]     && lv < laplacian[rowx + w] &&\n                            lv < laplacian[rowx - w - 1] && lv < laplacian[rowx + w - 1] &&\n                            lv < laplacian[rowx - w + 1] && lv < laplacian[rowx + w + 1])\n                            ||\n                            (lv > lap_thresh &&\n                            lv > laplacian[rowx - 1]      && lv > laplacian[rowx + 1] &&\n                            lv > laplacian[rowx - w]     && lv > laplacian[rowx + w] &&\n                            lv > laplacian[rowx - w - 1] && lv > laplacian[rowx + w - 1] &&\n                            lv > laplacian[rowx - w + 1] && lv > laplacian[rowx + w + 1])\n                            ) {\n\n                            min_eigen_value = hessian_min_eigen_value(srd_d, rowx, lv, Dxx, Dyy, Dxy, Dyx);\n                            if (min_eigen_value > eigen_thresh) {\n                                pt = points[number_of_points];\n                                pt.x = x, pt.y = y, pt.score = min_eigen_value;\n                                ++number_of_points;\n                                ++x, ++rowx; // skip next pixel since this is maxima in 3x3\n                            }\n                        }\n                    }\n                }\n\n                jsfeat.cache.put_buffer(lap_buf);\n\n                return number_of_points;\n            }\n\n        };\n    })();\n\n    global.yape06 = yape06;\n\n})(jsfeat);\n/**\n * @author Eugene Zatepyakin / http://inspirit.ru/\n *\n * Copyright 2007 Computer Vision Lab,\n * Ecole Polytechnique Federale de Lausanne (EPFL), Switzerland.\n */\n\n(function(global) {\n    \"use strict\";\n    //\n\n    var yape = (function() {\n\n        var precompute_directions = function(step, dirs, R) {\n            var i = 0;\n            var x, y;\n\n            x = R;\n            for(y = 0; y < x; y++, i++)\n            {\n                x = (Math.sqrt((R * R - y * y)) + 0.5)|0;\n                dirs[i] = (x + step * y);\n            }\n            for(x-- ; x < y && x >= 0; x--, i++)\n            {\n                y = (Math.sqrt((R * R - x * x)) + 0.5)|0;\n                dirs[i] = (x + step * y);\n            }\n            for( ; -x < y; x--, i++)\n            {\n                y = (Math.sqrt((R * R - x * x)) + 0.5)|0;\n                dirs[i] = (x + step * y);\n            }\n            for(y-- ; y >= 0; y--, i++)\n            {\n                x = (-Math.sqrt((R * R - y * y)) - 0.5)|0;\n                dirs[i] = (x + step * y);\n            }\n            for(; y > x; y--, i++)\n            {\n                x = (-Math.sqrt((R * R - y * y)) - 0.5)|0;\n                dirs[i] = (x + step * y);\n            }\n            for(x++ ; x <= 0; x++, i++)\n            {\n                y = (-Math.sqrt((R * R - x * x)) - 0.5)|0;\n                dirs[i] = (x + step * y);\n            }\n            for( ; x < -y; x++, i++)\n            {\n                y = (-Math.sqrt((R * R - x * x)) - 0.5)|0;\n                dirs[i] = (x + step * y);\n            }\n            for(y++ ; y < 0; y++, i++)\n            {\n                x = (Math.sqrt((R * R - y * y)) + 0.5)|0;\n                dirs[i] = (x + step * y);\n            }\n\n            dirs[i] = dirs[0];\n            dirs[i + 1] = dirs[1];\n            return i;\n        };\n\n        var third_check = function (Sb, off, step) {\n            var n = 0;\n            if(Sb[off+1]   != 0) n++;\n            if(Sb[off-1]   != 0) n++;\n            if(Sb[off+step]   != 0) n++;\n            if(Sb[off+step+1] != 0) n++;\n            if(Sb[off+step-1] != 0) n++;\n            if(Sb[off-step]   != 0) n++;\n            if(Sb[off-step+1] != 0) n++;\n            if(Sb[off-step-1] != 0) n++;\n\n            return n;\n        };\n\n        var is_local_maxima = function(p, off, v, step, neighborhood) {\n            var x, y;\n\n            if (v > 0) {\n                off -= step*neighborhood;\n                for (y= -neighborhood; y<=neighborhood; ++y) {\n                    for (x= -neighborhood; x<=neighborhood; ++x) {\n                        if (p[off+x] > v) return false;\n                    }\n                    off += step;\n                }\n            } else {\n                off -= step*neighborhood;\n                for (y= -neighborhood; y<=neighborhood; ++y) {\n                    for (x= -neighborhood; x<=neighborhood; ++x) {\n                        if (p[off+x] < v) return false;\n                    }\n                    off += step;\n                }\n            }\n            return true;\n        };\n\n        var perform_one_point = function(I, x, Scores, Im, Ip, dirs, opposite, dirs_nb) {\n          var score = 0;\n          var a = 0, b = (opposite - 1)|0;\n          var A=0, B0=0, B1=0, B2=0;\n          var state=0;\n\n          // WE KNOW THAT NOT(A ~ I0 & B1 ~ I0):\n          A = I[x+dirs[a]];\n          if ((A <= Ip)) {\n            if ((A >= Im)) { // A ~ I0\n              B0 = I[x+dirs[b]];\n              if ((B0 <= Ip)) {\n                if ((B0 >= Im)) { Scores[x] = 0; return; }\n                else {\n                  b++; B1 = I[x+dirs[b]];\n                  if ((B1 > Ip)) {\n                    b++; B2 = I[x+dirs[b]];\n                    if ((B2 > Ip)) state = 3;\n                    else if ((B2 < Im)) state = 6;\n                    else { Scores[x] = 0; return; } // A ~ I0, B2 ~ I0\n                  }\n                  else/* if ((B1 < Im))*/ {\n                    b++; B2 = I[x+dirs[b]];\n                    if ((B2 > Ip)) state = 7;\n                    else if ((B2 < Im)) state = 2;\n                    else { Scores[x] = 0; return; } // A ~ I0, B2 ~ I0\n                  }\n                  //else { Scores[x] = 0; return; } // A ~ I0, B1 ~ I0\n                }\n              }\n              else { // B0 < I0\n                b++; B1 = I[x+dirs[b]];\n                if ((B1 > Ip)) {\n                  b++; B2 = I[x+dirs[b]];\n                  if ((B2 > Ip)) state = 3;\n                  else if ((B2 < Im)) state = 6;\n                  else { Scores[x] = 0; return; } // A ~ I0, B2 ~ I0\n                }\n                else if ((B1 < Im)) {\n                  b++; B2 = I[x+dirs[b]];\n                  if ((B2 > Ip)) state = 7;\n                  else if ((B2 < Im)) state = 2;\n                  else { Scores[x] = 0; return; } // A ~ I0, B2 ~ I0\n                }\n                else { Scores[x] = 0; return; } // A ~ I0, B1 ~ I0\n              }\n            }\n            else { // A > I0\n              B0 = I[x+dirs[b]];\n              if ((B0 > Ip)) { Scores[x] = 0; return; }\n                b++; B1 = I[x+dirs[b]];\n              if ((B1 > Ip)) { Scores[x] = 0; return; }\n                b++; B2 = I[x+dirs[b]];\n              if ((B2 > Ip)) { Scores[x] = 0; return; }\n                state = 1;\n            }\n          }\n          else // A < I0\n          {\n            B0 = I[x+dirs[b]];\n            if ((B0 < Im)) { Scores[x] = 0; return; }\n              b++; B1 = I[x+dirs[b]];\n            if ((B1 < Im)) { Scores[x] = 0; return; }\n              b++; B2 = I[x+dirs[b]];\n            if ((B2 < Im)) { Scores[x] = 0; return; }\n              state = 0;\n          }\n\n          for(a = 1; a <= opposite; a++)\n          {\n            A = I[x+dirs[a]];\n\n            switch(state)\n            {\n            case 0:\n              if ((A > Ip)) {\n                B1 = B2; b++; B2 = I[x+dirs[b]];\n                if ((B2 < Im)) { Scores[x] = 0; return; }\n                  { score -= A + B1; state = 0; break; }\n              }\n              if ((A < Im)) {\n                if ((B1 > Ip)) { Scores[x] = 0; return; }\n                  if ((B2 > Ip)) { Scores[x] = 0; return; }\n                    B1 = B2; b++; B2 = I[x+dirs[b]];\n                if ((B2 > Ip)) { Scores[x] = 0; return; }\n                  { score -= A + B1; state = 8; break; }\n              } \n              // A ~ I0\n              if ((B1 <= Ip)) { Scores[x] = 0; return; }\n                if ((B2 <= Ip)) { Scores[x] = 0; return; }\n                  B1 = B2; b++; B2 = I[x+dirs[b]];\n              if ((B2 > Ip)) { score -= A + B1; state = 3; break; };\n              if ((B2 < Im)) { score -= A + B1; state = 6; break; };\n              { Scores[x] = 0; return; }\n\n            case 1:\n              if ((A < Im)) {\n                B1 = B2; b++; B2 = I[x+dirs[b]];\n                if ((B2 > Ip)) { Scores[x] = 0; return; }\n                  { score -= A + B1; state = 1; break; }\n              }\n              if ((A > Ip)) {\n                if ((B1 < Im)) { Scores[x] = 0; return; }\n                  if ((B2 < Im)) { Scores[x] = 0; return; }\n                    B1 = B2; b++; B2 = I[x+dirs[b]];\n                if ((B2 < Im)) { Scores[x] = 0; return; }\n                  { score -= A + B1; state = 9; break; }\n              }\n              // A ~ I0\n              if ((B1 >= Im)) { Scores[x] = 0; return; }\n                if ((B2 >= Im)) { Scores[x] = 0; return; }\n                  B1 = B2; b++; B2 = I[x+dirs[b]];\n              if ((B2 < Im)) { score -= A + B1; state = 2; break; };\n              if ((B2 > Ip)) { score -= A + B1; state = 7; break; };\n              { Scores[x] = 0; return; }\n\n            case 2:\n              if ((A > Ip)) { Scores[x] = 0; return; }\n                B1 = B2; b++; B2 = I[x+dirs[b]];\n              if ((A < Im))\n              {\n                if ((B2 > Ip)) { Scores[x] = 0; return; }\n                  { score -= A + B1; state = 4; break; }\n              } \n              // A ~ I0\n              if ((B2 > Ip)) { score -= A + B1; state = 7; break; };\n              if ((B2 < Im)) { score -= A + B1; state = 2; break; };\n              { Scores[x] = 0; return; } // A ~ I0, B2 ~ I0\n\n            case 3:\n              if ((A < Im)) { Scores[x] = 0; return; }\n                B1 = B2; b++; B2 = I[x+dirs[b]];\n              if ((A > Ip)) {\n                if ((B2 < Im)) { Scores[x] = 0; return; }\n                  { score -= A + B1; state = 5; break; }\n              }\n              // A ~ I0\n              if ((B2 > Ip)) { score -= A + B1; state = 3; break; };\n              if ((B2 < Im)) { score -= A + B1; state = 6; break; };\n              { Scores[x] = 0; return; }\n\n            case 4:\n              if ((A > Ip)) { Scores[x] = 0; return; }\n                if ((A < Im)) {\n                  B1 = B2; b++; B2 = I[x+dirs[b]];\n                  if ((B2 > Ip)) { Scores[x] = 0; return; }\n                    { score -= A + B1; state = 1; break; }\n                }\n                if ((B2 >= Im)) { Scores[x] = 0; return; }\n                  B1 = B2; b++; B2 = I[x+dirs[b]];\n                if ((B2 < Im)) { score -= A + B1; state = 2; break; };\n                if ((B2 > Ip)) { score -= A + B1; state = 7; break; };\n                { Scores[x] = 0; return; }\n\n            case 5:\n              if ((A < Im)) { Scores[x] = 0; return; }\n                if ((A > Ip)) {\n                  B1 = B2; b++; B2 = I[x+dirs[b]];\n                  if ((B2 < Im)) { Scores[x] = 0; return; }\n                    { score -= A + B1; state = 0; break; }\n                }\n                // A ~ I0\n                if ((B2 <= Ip)) { Scores[x] = 0; return; }\n                  B1 = B2; b++; B2 = I[x+dirs[b]];\n                if ((B2 > Ip)) { score -= A + B1; state = 3; break; };\n                if ((B2 < Im)) { score -= A + B1; state = 6; break; };\n                { Scores[x] = 0; return; }\n\n            case 7:\n              if ((A > Ip)) { Scores[x] = 0; return; }\n                if ((A < Im)) { Scores[x] = 0; return; }\n                  B1 = B2; b++; B2 = I[x+dirs[b]];\n              // A ~ I0\n              if ((B2 > Ip)) { score -= A + B1; state = 3; break; };\n              if ((B2 < Im)) { score -= A + B1; state = 6; break; };\n              { Scores[x] = 0; return; } // A ~ I0, B2 ~ I0\n\n            case 6:\n              if ((A > Ip)) { Scores[x] = 0; return; }\n                if ((A < Im)) { Scores[x] = 0; return; }\n                  B1 = B2; b++; B2 = I[x+dirs[b]];\n              // A ~ I0\n              if ((B2 < Im)) { score -= A + B1; state = 2; break; };\n              if ((B2 > Ip)) { score -= A + B1; state = 7; break; };\n              { Scores[x] = 0; return; } // A ~ I0, B2 ~ I0\n\n            case 8:\n              if ((A > Ip)) {\n                if ((B2 < Im)) { Scores[x] = 0; return; }\n                  B1 = B2; b++; B2 = I[x+dirs[b]];\n                if ((B2 < Im)) { Scores[x] = 0; return; }\n                  { score -= A + B1; state = 9; break; }\n              }\n              if ((A < Im)) {\n                B1 = B2; b++; B2 = I[x+dirs[b]];\n                if ((B2 > Ip)) { Scores[x] = 0; return; }\n                  { score -= A + B1; state = 1; break; }\n              }\n              { Scores[x] = 0; return; }\n\n            case 9:\n              if ((A < Im)) {\n                if ((B2 > Ip)) { Scores[x] = 0; return; }\n                  B1 = B2; b++; B2 = I[x+dirs[b]];\n                if ((B2 > Ip)) { Scores[x] = 0; return; }\n                  { score -= A + B1; state = 8; break; }\n              }\n              if ((A > Ip)) {\n                B1 = B2; b++; B2 = I[x+dirs[b]];\n                if ((B2 < Im)) { Scores[x] = 0; return; }\n                  { score -= A + B1; state = 0; break; }\n              }\n              { Scores[x] = 0; return; }\n\n            default:\n              //\"PB default\";\n              break;\n            } // switch(state)\n          } // for(a...)\n\n          Scores[x] = (score + dirs_nb * I[x]);\n        };\n\n        var lev_table_t = (function () {\n            function lev_table_t(w, h, r) {\n                this.dirs = new Int32Array(1024);\n                this.dirs_count = precompute_directions(w, this.dirs, r)|0;\n                this.scores = new Int32Array(w*h);\n                this.radius = r|0;\n            }\n            return lev_table_t;\n        })();\n        \n        return {\n\n            level_tables: [],\n            tau: 7,\n\n            init: function(width, height, radius, pyramid_levels) {\n                if (typeof pyramid_levels === \"undefined\") { pyramid_levels = 1; }\n                var i;\n                radius = Math.min(radius, 7);\n                radius = Math.max(radius, 3);\n                for(i = 0; i < pyramid_levels; ++i) {\n                    this.level_tables[i] = new lev_table_t(width>>i, height>>i, radius);\n                }\n            },\n\n            detect: function(src, points, border) {\n                if (typeof border === \"undefined\") { border = 4; }\n                var t = this.level_tables[0];\n                var R = t.radius|0, Rm1 = (R-1)|0;\n                var dirs = t.dirs;\n                var dirs_count = t.dirs_count|0;\n                var opposite = dirs_count >> 1;\n                var img = src.data, w=src.cols|0, h=src.rows|0,hw=w>>1;\n                var scores = t.scores;\n                var x=0,y=0,row=0,rowx=0,ip=0,im=0,abs_score=0, score=0;\n                var tau = this.tau|0;\n                var number_of_points = 0, pt;\n\n                var sx = Math.max(R+1, border)|0;\n                var sy = Math.max(R+1, border)|0;\n                var ex = Math.min(w-R-2, w-border)|0;\n                var ey = Math.min(h-R-2, h-border)|0;\n\n                row = (sy*w+sx)|0;\n                for(y = sy; y < ey; ++y, row+=w) {\n                    for(x = sx, rowx = row; x < ex; ++x, ++rowx) {\n                        ip = img[rowx] + tau, im = img[rowx] - tau;\n\n                        if (im<img[rowx+R] && img[rowx+R]<ip && im<img[rowx-R] && img[rowx-R]<ip) {\n                            scores[rowx] = 0;\n                        } else {\n                            perform_one_point(img, rowx, scores, im, ip, dirs, opposite, dirs_count);\n                        }\n                    }\n                }\n\n                // local maxima\n                row = (sy*w+sx)|0;\n                for(y = sy; y < ey; ++y, row+=w) {\n                    for(x = sx, rowx = row; x < ex; ++x, ++rowx) {\n                        score = scores[rowx];\n                        abs_score = Math.abs(score);\n                        if(abs_score < 5) {\n                            // if this pixel is 0, the next one will not be good enough. Skip it.\n                            ++x, ++rowx;\n                        } else {\n                            if(third_check(scores, rowx, w) >= 3 && is_local_maxima(scores, rowx, score, hw, R)) {\n                                pt = points[number_of_points];\n                                pt.x = x, pt.y = y, pt.score = abs_score;\n                                ++number_of_points;\n\n                                x += Rm1, rowx += Rm1;\n                            }\n                        }\n                    }\n                }\n\n                return number_of_points;\n            }\n        };\n\n    })();\n\n    global.yape = yape;\n\n})(jsfeat);\n/**\n * @author Eugene Zatepyakin / http://inspirit.ru/\n *\n * Original implementation derived from OpenCV,\n * @authors Ethan Rublee, Vincent Rabaud, Gary Bradski\n */\n\n(function(global) {\n    \"use strict\";\n    //\n\n    var orb = (function() {\n\n    \tvar bit_pattern_31_ = new Int32Array([\n\t\t    8,-3, 9,5/*mean (0), correlation (0)*/,\n\t\t    4,2, 7,-12/*mean (1.12461e-05), correlation (0.0437584)*/,\n\t\t    -11,9, -8,2/*mean (3.37382e-05), correlation (0.0617409)*/,\n\t\t    7,-12, 12,-13/*mean (5.62303e-05), correlation (0.0636977)*/,\n\t\t    2,-13, 2,12/*mean (0.000134953), correlation (0.085099)*/,\n\t\t    1,-7, 1,6/*mean (0.000528565), correlation (0.0857175)*/,\n\t\t    -2,-10, -2,-4/*mean (0.0188821), correlation (0.0985774)*/,\n\t\t    -13,-13, -11,-8/*mean (0.0363135), correlation (0.0899616)*/,\n\t\t    -13,-3, -12,-9/*mean (0.121806), correlation (0.099849)*/,\n\t\t    10,4, 11,9/*mean (0.122065), correlation (0.093285)*/,\n\t\t    -13,-8, -8,-9/*mean (0.162787), correlation (0.0942748)*/,\n\t\t    -11,7, -9,12/*mean (0.21561), correlation (0.0974438)*/,\n\t\t    7,7, 12,6/*mean (0.160583), correlation (0.130064)*/,\n\t\t    -4,-5, -3,0/*mean (0.228171), correlation (0.132998)*/,\n\t\t    -13,2, -12,-3/*mean (0.00997526), correlation (0.145926)*/,\n\t\t    -9,0, -7,5/*mean (0.198234), correlation (0.143636)*/,\n\t\t    12,-6, 12,-1/*mean (0.0676226), correlation (0.16689)*/,\n\t\t    -3,6, -2,12/*mean (0.166847), correlation (0.171682)*/,\n\t\t    -6,-13, -4,-8/*mean (0.101215), correlation (0.179716)*/,\n\t\t    11,-13, 12,-8/*mean (0.200641), correlation (0.192279)*/,\n\t\t    4,7, 5,1/*mean (0.205106), correlation (0.186848)*/,\n\t\t    5,-3, 10,-3/*mean (0.234908), correlation (0.192319)*/,\n\t\t    3,-7, 6,12/*mean (0.0709964), correlation (0.210872)*/,\n\t\t    -8,-7, -6,-2/*mean (0.0939834), correlation (0.212589)*/,\n\t\t    -2,11, -1,-10/*mean (0.127778), correlation (0.20866)*/,\n\t\t    -13,12, -8,10/*mean (0.14783), correlation (0.206356)*/,\n\t\t    -7,3, -5,-3/*mean (0.182141), correlation (0.198942)*/,\n\t\t    -4,2, -3,7/*mean (0.188237), correlation (0.21384)*/,\n\t\t    -10,-12, -6,11/*mean (0.14865), correlation (0.23571)*/,\n\t\t    5,-12, 6,-7/*mean (0.222312), correlation (0.23324)*/,\n\t\t    5,-6, 7,-1/*mean (0.229082), correlation (0.23389)*/,\n\t\t    1,0, 4,-5/*mean (0.241577), correlation (0.215286)*/,\n\t\t    9,11, 11,-13/*mean (0.00338507), correlation (0.251373)*/,\n\t\t    4,7, 4,12/*mean (0.131005), correlation (0.257622)*/,\n\t\t    2,-1, 4,4/*mean (0.152755), correlation (0.255205)*/,\n\t\t    -4,-12, -2,7/*mean (0.182771), correlation (0.244867)*/,\n\t\t    -8,-5, -7,-10/*mean (0.186898), correlation (0.23901)*/,\n\t\t    4,11, 9,12/*mean (0.226226), correlation (0.258255)*/,\n\t\t    0,-8, 1,-13/*mean (0.0897886), correlation (0.274827)*/,\n\t\t    -13,-2, -8,2/*mean (0.148774), correlation (0.28065)*/,\n\t\t    -3,-2, -2,3/*mean (0.153048), correlation (0.283063)*/,\n\t\t    -6,9, -4,-9/*mean (0.169523), correlation (0.278248)*/,\n\t\t    8,12, 10,7/*mean (0.225337), correlation (0.282851)*/,\n\t\t    0,9, 1,3/*mean (0.226687), correlation (0.278734)*/,\n\t\t    7,-5, 11,-10/*mean (0.00693882), correlation (0.305161)*/,\n\t\t    -13,-6, -11,0/*mean (0.0227283), correlation (0.300181)*/,\n\t\t    10,7, 12,1/*mean (0.125517), correlation (0.31089)*/,\n\t\t    -6,-3, -6,12/*mean (0.131748), correlation (0.312779)*/,\n\t\t    10,-9, 12,-4/*mean (0.144827), correlation (0.292797)*/,\n\t\t    -13,8, -8,-12/*mean (0.149202), correlation (0.308918)*/,\n\t\t    -13,0, -8,-4/*mean (0.160909), correlation (0.310013)*/,\n\t\t    3,3, 7,8/*mean (0.177755), correlation (0.309394)*/,\n\t\t    5,7, 10,-7/*mean (0.212337), correlation (0.310315)*/,\n\t\t    -1,7, 1,-12/*mean (0.214429), correlation (0.311933)*/,\n\t\t    3,-10, 5,6/*mean (0.235807), correlation (0.313104)*/,\n\t\t    2,-4, 3,-10/*mean (0.00494827), correlation (0.344948)*/,\n\t\t    -13,0, -13,5/*mean (0.0549145), correlation (0.344675)*/,\n\t\t    -13,-7, -12,12/*mean (0.103385), correlation (0.342715)*/,\n\t\t    -13,3, -11,8/*mean (0.134222), correlation (0.322922)*/,\n\t\t    -7,12, -4,7/*mean (0.153284), correlation (0.337061)*/,\n\t\t    6,-10, 12,8/*mean (0.154881), correlation (0.329257)*/,\n\t\t    -9,-1, -7,-6/*mean (0.200967), correlation (0.33312)*/,\n\t\t    -2,-5, 0,12/*mean (0.201518), correlation (0.340635)*/,\n\t\t    -12,5, -7,5/*mean (0.207805), correlation (0.335631)*/,\n\t\t    3,-10, 8,-13/*mean (0.224438), correlation (0.34504)*/,\n\t\t    -7,-7, -4,5/*mean (0.239361), correlation (0.338053)*/,\n\t\t    -3,-2, -1,-7/*mean (0.240744), correlation (0.344322)*/,\n\t\t    2,9, 5,-11/*mean (0.242949), correlation (0.34145)*/,\n\t\t    -11,-13, -5,-13/*mean (0.244028), correlation (0.336861)*/,\n\t\t    -1,6, 0,-1/*mean (0.247571), correlation (0.343684)*/,\n\t\t    5,-3, 5,2/*mean (0.000697256), correlation (0.357265)*/,\n\t\t    -4,-13, -4,12/*mean (0.00213675), correlation (0.373827)*/,\n\t\t    -9,-6, -9,6/*mean (0.0126856), correlation (0.373938)*/,\n\t\t    -12,-10, -8,-4/*mean (0.0152497), correlation (0.364237)*/,\n\t\t    10,2, 12,-3/*mean (0.0299933), correlation (0.345292)*/,\n\t\t    7,12, 12,12/*mean (0.0307242), correlation (0.366299)*/,\n\t\t    -7,-13, -6,5/*mean (0.0534975), correlation (0.368357)*/,\n\t\t    -4,9, -3,4/*mean (0.099865), correlation (0.372276)*/,\n\t\t    7,-1, 12,2/*mean (0.117083), correlation (0.364529)*/,\n\t\t    -7,6, -5,1/*mean (0.126125), correlation (0.369606)*/,\n\t\t    -13,11, -12,5/*mean (0.130364), correlation (0.358502)*/,\n\t\t    -3,7, -2,-6/*mean (0.131691), correlation (0.375531)*/,\n\t\t    7,-8, 12,-7/*mean (0.160166), correlation (0.379508)*/,\n\t\t    -13,-7, -11,-12/*mean (0.167848), correlation (0.353343)*/,\n\t\t    1,-3, 12,12/*mean (0.183378), correlation (0.371916)*/,\n\t\t    2,-6, 3,0/*mean (0.228711), correlation (0.371761)*/,\n\t\t    -4,3, -2,-13/*mean (0.247211), correlation (0.364063)*/,\n\t\t    -1,-13, 1,9/*mean (0.249325), correlation (0.378139)*/,\n\t\t    7,1, 8,-6/*mean (0.000652272), correlation (0.411682)*/,\n\t\t    1,-1, 3,12/*mean (0.00248538), correlation (0.392988)*/,\n\t\t    9,1, 12,6/*mean (0.0206815), correlation (0.386106)*/,\n\t\t    -1,-9, -1,3/*mean (0.0364485), correlation (0.410752)*/,\n\t\t    -13,-13, -10,5/*mean (0.0376068), correlation (0.398374)*/,\n\t\t    7,7, 10,12/*mean (0.0424202), correlation (0.405663)*/,\n\t\t    12,-5, 12,9/*mean (0.0942645), correlation (0.410422)*/,\n\t\t    6,3, 7,11/*mean (0.1074), correlation (0.413224)*/,\n\t\t    5,-13, 6,10/*mean (0.109256), correlation (0.408646)*/,\n\t\t    2,-12, 2,3/*mean (0.131691), correlation (0.416076)*/,\n\t\t    3,8, 4,-6/*mean (0.165081), correlation (0.417569)*/,\n\t\t    2,6, 12,-13/*mean (0.171874), correlation (0.408471)*/,\n\t\t    9,-12, 10,3/*mean (0.175146), correlation (0.41296)*/,\n\t\t    -8,4, -7,9/*mean (0.183682), correlation (0.402956)*/,\n\t\t    -11,12, -4,-6/*mean (0.184672), correlation (0.416125)*/,\n\t\t    1,12, 2,-8/*mean (0.191487), correlation (0.386696)*/,\n\t\t    6,-9, 7,-4/*mean (0.192668), correlation (0.394771)*/,\n\t\t    2,3, 3,-2/*mean (0.200157), correlation (0.408303)*/,\n\t\t    6,3, 11,0/*mean (0.204588), correlation (0.411762)*/,\n\t\t    3,-3, 8,-8/*mean (0.205904), correlation (0.416294)*/,\n\t\t    7,8, 9,3/*mean (0.213237), correlation (0.409306)*/,\n\t\t    -11,-5, -6,-4/*mean (0.243444), correlation (0.395069)*/,\n\t\t    -10,11, -5,10/*mean (0.247672), correlation (0.413392)*/,\n\t\t    -5,-8, -3,12/*mean (0.24774), correlation (0.411416)*/,\n\t\t    -10,5, -9,0/*mean (0.00213675), correlation (0.454003)*/,\n\t\t    8,-1, 12,-6/*mean (0.0293635), correlation (0.455368)*/,\n\t\t    4,-6, 6,-11/*mean (0.0404971), correlation (0.457393)*/,\n\t\t    -10,12, -8,7/*mean (0.0481107), correlation (0.448364)*/,\n\t\t    4,-2, 6,7/*mean (0.050641), correlation (0.455019)*/,\n\t\t    -2,0, -2,12/*mean (0.0525978), correlation (0.44338)*/,\n\t\t    -5,-8, -5,2/*mean (0.0629667), correlation (0.457096)*/,\n\t\t    7,-6, 10,12/*mean (0.0653846), correlation (0.445623)*/,\n\t\t    -9,-13, -8,-8/*mean (0.0858749), correlation (0.449789)*/,\n\t\t    -5,-13, -5,-2/*mean (0.122402), correlation (0.450201)*/,\n\t\t    8,-8, 9,-13/*mean (0.125416), correlation (0.453224)*/,\n\t\t    -9,-11, -9,0/*mean (0.130128), correlation (0.458724)*/,\n\t\t    1,-8, 1,-2/*mean (0.132467), correlation (0.440133)*/,\n\t\t    7,-4, 9,1/*mean (0.132692), correlation (0.454)*/,\n\t\t    -2,1, -1,-4/*mean (0.135695), correlation (0.455739)*/,\n\t\t    11,-6, 12,-11/*mean (0.142904), correlation (0.446114)*/,\n\t\t    -12,-9, -6,4/*mean (0.146165), correlation (0.451473)*/,\n\t\t    3,7, 7,12/*mean (0.147627), correlation (0.456643)*/,\n\t\t    5,5, 10,8/*mean (0.152901), correlation (0.455036)*/,\n\t\t    0,-4, 2,8/*mean (0.167083), correlation (0.459315)*/,\n\t\t    -9,12, -5,-13/*mean (0.173234), correlation (0.454706)*/,\n\t\t    0,7, 2,12/*mean (0.18312), correlation (0.433855)*/,\n\t\t    -1,2, 1,7/*mean (0.185504), correlation (0.443838)*/,\n\t\t    5,11, 7,-9/*mean (0.185706), correlation (0.451123)*/,\n\t\t    3,5, 6,-8/*mean (0.188968), correlation (0.455808)*/,\n\t\t    -13,-4, -8,9/*mean (0.191667), correlation (0.459128)*/,\n\t\t    -5,9, -3,-3/*mean (0.193196), correlation (0.458364)*/,\n\t\t    -4,-7, -3,-12/*mean (0.196536), correlation (0.455782)*/,\n\t\t    6,5, 8,0/*mean (0.1972), correlation (0.450481)*/,\n\t\t    -7,6, -6,12/*mean (0.199438), correlation (0.458156)*/,\n\t\t    -13,6, -5,-2/*mean (0.211224), correlation (0.449548)*/,\n\t\t    1,-10, 3,10/*mean (0.211718), correlation (0.440606)*/,\n\t\t    4,1, 8,-4/*mean (0.213034), correlation (0.443177)*/,\n\t\t    -2,-2, 2,-13/*mean (0.234334), correlation (0.455304)*/,\n\t\t    2,-12, 12,12/*mean (0.235684), correlation (0.443436)*/,\n\t\t    -2,-13, 0,-6/*mean (0.237674), correlation (0.452525)*/,\n\t\t    4,1, 9,3/*mean (0.23962), correlation (0.444824)*/,\n\t\t    -6,-10, -3,-5/*mean (0.248459), correlation (0.439621)*/,\n\t\t    -3,-13, -1,1/*mean (0.249505), correlation (0.456666)*/,\n\t\t    7,5, 12,-11/*mean (0.00119208), correlation (0.495466)*/,\n\t\t    4,-2, 5,-7/*mean (0.00372245), correlation (0.484214)*/,\n\t\t    -13,9, -9,-5/*mean (0.00741116), correlation (0.499854)*/,\n\t\t    7,1, 8,6/*mean (0.0208952), correlation (0.499773)*/,\n\t\t    7,-8, 7,6/*mean (0.0220085), correlation (0.501609)*/,\n\t\t    -7,-4, -7,1/*mean (0.0233806), correlation (0.496568)*/,\n\t\t    -8,11, -7,-8/*mean (0.0236505), correlation (0.489719)*/,\n\t\t    -13,6, -12,-8/*mean (0.0268781), correlation (0.503487)*/,\n\t\t    2,4, 3,9/*mean (0.0323324), correlation (0.501938)*/,\n\t\t    10,-5, 12,3/*mean (0.0399235), correlation (0.494029)*/,\n\t\t    -6,-5, -6,7/*mean (0.0420153), correlation (0.486579)*/,\n\t\t    8,-3, 9,-8/*mean (0.0548021), correlation (0.484237)*/,\n\t\t    2,-12, 2,8/*mean (0.0616622), correlation (0.496642)*/,\n\t\t    -11,-2, -10,3/*mean (0.0627755), correlation (0.498563)*/,\n\t\t    -12,-13, -7,-9/*mean (0.0829622), correlation (0.495491)*/,\n\t\t    -11,0, -10,-5/*mean (0.0843342), correlation (0.487146)*/,\n\t\t    5,-3, 11,8/*mean (0.0929937), correlation (0.502315)*/,\n\t\t    -2,-13, -1,12/*mean (0.113327), correlation (0.48941)*/,\n\t\t    -1,-8, 0,9/*mean (0.132119), correlation (0.467268)*/,\n\t\t    -13,-11, -12,-5/*mean (0.136269), correlation (0.498771)*/,\n\t\t    -10,-2, -10,11/*mean (0.142173), correlation (0.498714)*/,\n\t\t    -3,9, -2,-13/*mean (0.144141), correlation (0.491973)*/,\n\t\t    2,-3, 3,2/*mean (0.14892), correlation (0.500782)*/,\n\t\t    -9,-13, -4,0/*mean (0.150371), correlation (0.498211)*/,\n\t\t    -4,6, -3,-10/*mean (0.152159), correlation (0.495547)*/,\n\t\t    -4,12, -2,-7/*mean (0.156152), correlation (0.496925)*/,\n\t\t    -6,-11, -4,9/*mean (0.15749), correlation (0.499222)*/,\n\t\t    6,-3, 6,11/*mean (0.159211), correlation (0.503821)*/,\n\t\t    -13,11, -5,5/*mean (0.162427), correlation (0.501907)*/,\n\t\t    11,11, 12,6/*mean (0.16652), correlation (0.497632)*/,\n\t\t    7,-5, 12,-2/*mean (0.169141), correlation (0.484474)*/,\n\t\t    -1,12, 0,7/*mean (0.169456), correlation (0.495339)*/,\n\t\t    -4,-8, -3,-2/*mean (0.171457), correlation (0.487251)*/,\n\t\t    -7,1, -6,7/*mean (0.175), correlation (0.500024)*/,\n\t\t    -13,-12, -8,-13/*mean (0.175866), correlation (0.497523)*/,\n\t\t    -7,-2, -6,-8/*mean (0.178273), correlation (0.501854)*/,\n\t\t    -8,5, -6,-9/*mean (0.181107), correlation (0.494888)*/,\n\t\t    -5,-1, -4,5/*mean (0.190227), correlation (0.482557)*/,\n\t\t    -13,7, -8,10/*mean (0.196739), correlation (0.496503)*/,\n\t\t    1,5, 5,-13/*mean (0.19973), correlation (0.499759)*/,\n\t\t    1,0, 10,-13/*mean (0.204465), correlation (0.49873)*/,\n\t\t    9,12, 10,-1/*mean (0.209334), correlation (0.49063)*/,\n\t\t    5,-8, 10,-9/*mean (0.211134), correlation (0.503011)*/,\n\t\t    -1,11, 1,-13/*mean (0.212), correlation (0.499414)*/,\n\t\t    -9,-3, -6,2/*mean (0.212168), correlation (0.480739)*/,\n\t\t    -1,-10, 1,12/*mean (0.212731), correlation (0.502523)*/,\n\t\t    -13,1, -8,-10/*mean (0.21327), correlation (0.489786)*/,\n\t\t    8,-11, 10,-6/*mean (0.214159), correlation (0.488246)*/,\n\t\t    2,-13, 3,-6/*mean (0.216993), correlation (0.50287)*/,\n\t\t    7,-13, 12,-9/*mean (0.223639), correlation (0.470502)*/,\n\t\t    -10,-10, -5,-7/*mean (0.224089), correlation (0.500852)*/,\n\t\t    -10,-8, -8,-13/*mean (0.228666), correlation (0.502629)*/,\n\t\t    4,-6, 8,5/*mean (0.22906), correlation (0.498305)*/,\n\t\t    3,12, 8,-13/*mean (0.233378), correlation (0.503825)*/,\n\t\t    -4,2, -3,-3/*mean (0.234323), correlation (0.476692)*/,\n\t\t    5,-13, 10,-12/*mean (0.236392), correlation (0.475462)*/,\n\t\t    4,-13, 5,-1/*mean (0.236842), correlation (0.504132)*/,\n\t\t    -9,9, -4,3/*mean (0.236977), correlation (0.497739)*/,\n\t\t    0,3, 3,-9/*mean (0.24314), correlation (0.499398)*/,\n\t\t    -12,1, -6,1/*mean (0.243297), correlation (0.489447)*/,\n\t\t    3,2, 4,-8/*mean (0.00155196), correlation (0.553496)*/,\n\t\t    -10,-10, -10,9/*mean (0.00239541), correlation (0.54297)*/,\n\t\t    8,-13, 12,12/*mean (0.0034413), correlation (0.544361)*/,\n\t\t    -8,-12, -6,-5/*mean (0.003565), correlation (0.551225)*/,\n\t\t    2,2, 3,7/*mean (0.00835583), correlation (0.55285)*/,\n\t\t    10,6, 11,-8/*mean (0.00885065), correlation (0.540913)*/,\n\t\t    6,8, 8,-12/*mean (0.0101552), correlation (0.551085)*/,\n\t\t    -7,10, -6,5/*mean (0.0102227), correlation (0.533635)*/,\n\t\t    -3,-9, -3,9/*mean (0.0110211), correlation (0.543121)*/,\n\t\t    -1,-13, -1,5/*mean (0.0113473), correlation (0.550173)*/,\n\t\t    -3,-7, -3,4/*mean (0.0140913), correlation (0.554774)*/,\n\t\t    -8,-2, -8,3/*mean (0.017049), correlation (0.55461)*/,\n\t\t    4,2, 12,12/*mean (0.01778), correlation (0.546921)*/,\n\t\t    2,-5, 3,11/*mean (0.0224022), correlation (0.549667)*/,\n\t\t    6,-9, 11,-13/*mean (0.029161), correlation (0.546295)*/,\n\t\t    3,-1, 7,12/*mean (0.0303081), correlation (0.548599)*/,\n\t\t    11,-1, 12,4/*mean (0.0355151), correlation (0.523943)*/,\n\t\t    -3,0, -3,6/*mean (0.0417904), correlation (0.543395)*/,\n\t\t    4,-11, 4,12/*mean (0.0487292), correlation (0.542818)*/,\n\t\t    2,-4, 2,1/*mean (0.0575124), correlation (0.554888)*/,\n\t\t    -10,-6, -8,1/*mean (0.0594242), correlation (0.544026)*/,\n\t\t    -13,7, -11,1/*mean (0.0597391), correlation (0.550524)*/,\n\t\t    -13,12, -11,-13/*mean (0.0608974), correlation (0.55383)*/,\n\t\t    6,0, 11,-13/*mean (0.065126), correlation (0.552006)*/,\n\t\t    0,-1, 1,4/*mean (0.074224), correlation (0.546372)*/,\n\t\t    -13,3, -9,-2/*mean (0.0808592), correlation (0.554875)*/,\n\t\t    -9,8, -6,-3/*mean (0.0883378), correlation (0.551178)*/,\n\t\t    -13,-6, -8,-2/*mean (0.0901035), correlation (0.548446)*/,\n\t\t    5,-9, 8,10/*mean (0.0949843), correlation (0.554694)*/,\n\t\t    2,7, 3,-9/*mean (0.0994152), correlation (0.550979)*/,\n\t\t    -1,-6, -1,-1/*mean (0.10045), correlation (0.552714)*/,\n\t\t    9,5, 11,-2/*mean (0.100686), correlation (0.552594)*/,\n\t\t    11,-3, 12,-8/*mean (0.101091), correlation (0.532394)*/,\n\t\t    3,0, 3,5/*mean (0.101147), correlation (0.525576)*/,\n\t\t    -1,4, 0,10/*mean (0.105263), correlation (0.531498)*/,\n\t\t    3,-6, 4,5/*mean (0.110785), correlation (0.540491)*/,\n\t\t    -13,0, -10,5/*mean (0.112798), correlation (0.536582)*/,\n\t\t    5,8, 12,11/*mean (0.114181), correlation (0.555793)*/,\n\t\t    8,9, 9,-6/*mean (0.117431), correlation (0.553763)*/,\n\t\t    7,-4, 8,-12/*mean (0.118522), correlation (0.553452)*/,\n\t\t    -10,4, -10,9/*mean (0.12094), correlation (0.554785)*/,\n\t\t    7,3, 12,4/*mean (0.122582), correlation (0.555825)*/,\n\t\t    9,-7, 10,-2/*mean (0.124978), correlation (0.549846)*/,\n\t\t    7,0, 12,-2/*mean (0.127002), correlation (0.537452)*/,\n\t\t    -1,-6, 0,-11/*mean (0.127148), correlation (0.547401)*/\n\t\t]);\n\n\t    var H = new jsfeat.matrix_t(3, 3, jsfeat.F32_t|jsfeat.C1_t);\n\t    var patch_img = new jsfeat.matrix_t(32, 32, jsfeat.U8_t|jsfeat.C1_t);\n\n\t    var rectify_patch = function(src, dst, angle, px, py, psize) {\n\t    \tvar cosine = Math.cos(angle);\n\t    \tvar sine   = Math.sin(angle);\n\n\t        H.data[0] = cosine, H.data[1] = -sine,    H.data[2] = (-cosine + sine  ) * psize*0.5 + px,\n\t        H.data[3] = sine,   H.data[4] =  cosine,  H.data[5] = (-sine   - cosine) * psize*0.5 + py;\n\n\t        jsfeat.imgproc.warp_affine(src, dst, H, 128);\n\t    };\n\n    \treturn {\n\n    \t\tdescribe: function(src, corners, count, descriptors) {\n    \t\t\tvar DESCR_SIZE = 32; // bytes;\n\t\t\t\tvar i=0,b=0,px=0.0,py=0.0,angle=0.0;\n\t\t\t\tvar t0=0, t1=0, val=0;\n\t\t\t\tvar img = src.data, w = src.cols, h = src.rows;\n\t\t\t\tvar patch_d = patch_img.data;\n\t\t\t\tvar patch_off = 16*32 + 16; // center of patch\n\t\t\t\tvar patt=0;\n\n\t\t\t\tif(!(descriptors.type&jsfeat.U8_t)) {\n\t\t\t\t\t// relocate to U8 type\n\t\t\t\t\tdescriptors.type = jsfeat.U8_t;\n\t\t\t\t\tdescriptors.cols = DESCR_SIZE;\n\t                descriptors.rows = count;\n\t                descriptors.channel = 1;\n\t\t\t\t\tdescriptors.allocate();\n\t\t\t\t} else {\n\t\t\t\t\tdescriptors.resize(DESCR_SIZE, count, 1);\n\t\t\t\t}\n\n\t\t\t\tvar descr_d = descriptors.data;\n\t\t\t\tvar descr_off = 0;\n\n\t\t\t\tfor(i = 0; i < count; ++i) {\n\t\t\t\t\tpx = corners[i].x;\n\t\t\t\t\tpy = corners[i].y;\n\t\t\t\t\tangle = corners[i].angle;\n\n\t\t\t\t\trectify_patch(src, patch_img, angle, px, py, 32);\n\n\t\t\t\t\t// describe the patch\n\t\t\t\t\tpatt = 0;\n\t\t\t\t\tfor (b = 0; b < DESCR_SIZE; ++b) {\n\t\t\t            \n\t\t\t            t0 = patch_d[patch_off + bit_pattern_31_[patt+1] * 32 + bit_pattern_31_[patt]]; patt += 2;\n\t\t\t            t1 = patch_d[patch_off + bit_pattern_31_[patt+1] * 32 + bit_pattern_31_[patt]]; patt += 2;\n\t\t\t            val = (t0 < t1)|0;\n\t\t\t            \n\t\t\t            t0 = patch_d[patch_off + bit_pattern_31_[patt+1] * 32 + bit_pattern_31_[patt]]; patt += 2;\n\t\t\t            t1 = patch_d[patch_off + bit_pattern_31_[patt+1] * 32 + bit_pattern_31_[patt]]; patt += 2;\n\t\t\t            val |= (t0 < t1) << 1;\n\t\t\t            \n\t\t\t            t0 = patch_d[patch_off + bit_pattern_31_[patt+1] * 32 + bit_pattern_31_[patt]]; patt += 2;\n\t\t\t            t1 = patch_d[patch_off + bit_pattern_31_[patt+1] * 32 + bit_pattern_31_[patt]]; patt += 2;\n\t\t\t            val |= (t0 < t1) << 2;\n\t\t\t            \n\t\t\t            t0 = patch_d[patch_off + bit_pattern_31_[patt+1] * 32 + bit_pattern_31_[patt]]; patt += 2;\n\t\t\t            t1 = patch_d[patch_off + bit_pattern_31_[patt+1] * 32 + bit_pattern_31_[patt]]; patt += 2;\n\t\t\t            val |= (t0 < t1) << 3;\n\t\t\t            \n\t\t\t            t0 = patch_d[patch_off + bit_pattern_31_[patt+1] * 32 + bit_pattern_31_[patt]]; patt += 2;\n\t\t\t            t1 = patch_d[patch_off + bit_pattern_31_[patt+1] * 32 + bit_pattern_31_[patt]]; patt += 2;\n\t\t\t            val |= (t0 < t1) << 4;\n\t\t\t            \n\t\t\t            t0 = patch_d[patch_off + bit_pattern_31_[patt+1] * 32 + bit_pattern_31_[patt]]; patt += 2;\n\t\t\t            t1 = patch_d[patch_off + bit_pattern_31_[patt+1] * 32 + bit_pattern_31_[patt]]; patt += 2;\n\t\t\t            val |= (t0 < t1) << 5;\n\t\t\t            \n\t\t\t            t0 = patch_d[patch_off + bit_pattern_31_[patt+1] * 32 + bit_pattern_31_[patt]]; patt += 2;\n\t\t\t            t1 = patch_d[patch_off + bit_pattern_31_[patt+1] * 32 + bit_pattern_31_[patt]]; patt += 2;\n\t\t\t            val |= (t0 < t1) << 6;\n\t\t\t            \n\t\t\t            t0 = patch_d[patch_off + bit_pattern_31_[patt+1] * 32 + bit_pattern_31_[patt]]; patt += 2;\n\t\t\t            t1 = patch_d[patch_off + bit_pattern_31_[patt+1] * 32 + bit_pattern_31_[patt]]; patt += 2;\n\t\t\t            val |= (t0 < t1) << 7;\n\t\t\t            \n\t\t\t            descr_d[descr_off+b] = val;\n\t\t\t        }\n\t\t\t        descr_off += DESCR_SIZE;\n\t\t\t\t}\n    \t\t}\n    \t};\n    })();\n\n    global.orb = orb;\n\n})(jsfeat);\n/**\n * @author Eugene Zatepyakin / http://inspirit.ru/\n *\n * this code is a rewrite from OpenCV's Lucas-Kanade optical flow implementation\n */\n\n(function(global) {\n    \"use strict\";\n    //\n    var optical_flow_lk = (function() {\n\n        // short link to shar deriv\n        var scharr_deriv = jsfeat.imgproc.scharr_derivatives;\n\n        return {\n            track: function(prev_pyr, curr_pyr, prev_xy, curr_xy, count, win_size, max_iter, status, eps, min_eigen_threshold) {\n                if (typeof max_iter === \"undefined\") { max_iter = 30; }\n                if (typeof status === \"undefined\") { status = new Uint8Array(count); }\n                if (typeof eps === \"undefined\") { eps = 0.01; }\n                if (typeof min_eigen_threshold === \"undefined\") { min_eigen_threshold = 0.0001; }\n\n                var half_win = (win_size-1)*0.5;\n                var win_area = (win_size*win_size)|0;\n                var win_area2 = win_area << 1;\n                var prev_imgs = prev_pyr.data, next_imgs = curr_pyr.data;\n                var img_prev=prev_imgs[0].data,img_next=next_imgs[0].data;\n                var w0 = prev_imgs[0].cols, h0 = prev_imgs[0].rows,lw=0,lh=0;\n\n                var iwin_node = jsfeat.cache.get_buffer(win_area<<2);\n                var deriv_iwin_node = jsfeat.cache.get_buffer(win_area2<<2);\n                var deriv_lev_node = jsfeat.cache.get_buffer((h0*(w0<<1))<<2);\n\n                var deriv_m = new jsfeat.matrix_t(w0, h0, jsfeat.S32C2_t, deriv_lev_node.data);\n\n                var iwin_buf = iwin_node.i32;\n                var deriv_iwin = deriv_iwin_node.i32;\n                var deriv_lev = deriv_lev_node.i32;\n\n                var dstep=0,src=0,dsrc=0,iptr=0,diptr=0,jptr=0;\n                var lev_sc=0.0,prev_x=0.0,prev_y=0.0,next_x=0.0,next_y=0.0;\n                var prev_delta_x=0.0,prev_delta_y=0.0,delta_x=0.0,delta_y=0.0;\n                var iprev_x=0,iprev_y=0,inext_x=0,inext_y=0;\n                var i=0,j=0,x=0,y=0,level=0,ptid=0,iter=0;\n                var brd_tl=0,brd_r=0,brd_b=0;\n                var a=0.0,b=0.0,b1=0.0,b2=0.0;\n\n                // fixed point math\n                var W_BITS14 = 14;\n                var W_BITS4 = 14;\n                var W_BITS1m5 = W_BITS4 - 5;\n                var W_BITS1m51 = (1 << ((W_BITS1m5) - 1));\n                var W_BITS14_ = (1 << W_BITS14);\n                var W_BITS41 = (1 << ((W_BITS4) - 1));\n                var FLT_SCALE = 1.0/(1 << 20);\n                var iw00=0,iw01=0,iw10=0,iw11=0,ival=0,ixval=0,iyval=0;\n                var A11=0.0,A12=0.0,A22=0.0,D=0.0,min_eig=0.0;\n\n                var FLT_EPSILON = 0.00000011920929;\n                eps *= eps;\n\n                // reset status\n                for(; i < count; ++i) {\n                    status[i] = 1;\n                }\n\n                var max_level = (prev_pyr.levels - 1)|0;\n                level = max_level;\n\n                for(; level >= 0; --level) {\n                    lev_sc = (1.0/(1 << level));\n                    lw = w0 >> level;\n                    lh = h0 >> level;\n                    dstep = lw << 1;\n                    img_prev = prev_imgs[level].data;\n                    img_next = next_imgs[level].data;\n                    \n                    brd_r = (lw - win_size)|0;\n                    brd_b = (lh - win_size)|0;\n\n                    // calculate level derivatives\n                    scharr_deriv(prev_imgs[level], deriv_m);\n\n                    // iterate through points\n                    for(ptid = 0; ptid < count; ++ptid) {\n                        i = ptid << 1;\n                        j = i + 1;\n                        prev_x = prev_xy[i]*lev_sc;\n                        prev_y = prev_xy[j]*lev_sc;\n\n                        if( level == max_level ) {\n                            next_x = prev_x;\n                            next_y = prev_y;\n                        } else {\n                            next_x = curr_xy[i]*2.0;\n                            next_y = curr_xy[j]*2.0;\n                        }\n                        curr_xy[i] = next_x;\n                        curr_xy[j] = next_y;\n\n                        prev_x -= half_win;\n                        prev_y -= half_win;\n                        iprev_x = prev_x|0;\n                        iprev_y = prev_y|0;\n\n                        // border check\n                        x = (iprev_x <= brd_tl)|(iprev_x >= brd_r)|(iprev_y <= brd_tl)|(iprev_y >= brd_b);\n                        if( x != 0 ) {\n                            if( level == 0 ) {\n                                status[ptid] = 0;\n                            }\n                            continue;\n                        }\n\n                        a = prev_x - iprev_x;\n                        b = prev_y - iprev_y;\n                        iw00 = (((1.0 - a)*(1.0 - b)*W_BITS14_) + 0.5)|0;\n                        iw01 = ((a*(1.0 - b)*W_BITS14_) + 0.5)|0;\n                        iw10 = (((1.0 - a)*b*W_BITS14_) + 0.5)|0;\n                        iw11 = (W_BITS14_ - iw00 - iw01 - iw10);\n\n                        A11 = 0.0, A12 = 0.0, A22 = 0.0;\n\n                        // extract the patch from the first image, compute covariation matrix of derivatives\n                        for( y = 0; y < win_size; ++y ) {\n                            src = ( (y + iprev_y)*lw + iprev_x )|0;\n                            dsrc = src << 1;\n\n                            iptr = (y*win_size)|0;\n                            diptr = iptr << 1;\n                            for(x = 0 ; x < win_size; ++x, ++src, ++iptr, dsrc += 2) {\n                                ival = ( (img_prev[src])*iw00 + (img_prev[src+1])*iw01 +\n                                        (img_prev[src+lw])*iw10 + (img_prev[src+lw+1])*iw11 );\n                                ival = (((ival) + W_BITS1m51) >> (W_BITS1m5));\n\n                                ixval = ( deriv_lev[dsrc]*iw00 + deriv_lev[dsrc+2]*iw01 +\n                                        deriv_lev[dsrc+dstep]*iw10 + deriv_lev[dsrc+dstep+2]*iw11 );\n                                ixval = (((ixval) + W_BITS41) >> (W_BITS4));\n\n                                iyval = ( deriv_lev[dsrc+1]*iw00 + deriv_lev[dsrc+3]*iw01 + deriv_lev[dsrc+dstep+1]*iw10 +\n                                        deriv_lev[dsrc+dstep+3]*iw11 );\n                                iyval = (((iyval) + W_BITS41) >> (W_BITS4));\n\n                                iwin_buf[iptr] = ival;\n                                deriv_iwin[diptr++] = ixval;\n                                deriv_iwin[diptr++] = iyval;\n\n                                A11 += ixval*ixval;\n                                A12 += ixval*iyval;\n                                A22 += iyval*iyval;\n                            }\n                        }\n\n                        A11 *= FLT_SCALE; A12 *= FLT_SCALE; A22 *= FLT_SCALE;\n\n                        D = A11*A22 - A12*A12;\n                        min_eig = (A22 + A11 - Math.sqrt((A11-A22)*(A11-A22) + 4.0*A12*A12)) / win_area2;\n\n                        if( min_eig < min_eigen_threshold || D < FLT_EPSILON )\n                        {\n                            if( level == 0 ) {\n                                status[ptid] = 0;\n                            }\n                            continue;\n                        }\n\n                        D = 1.0/D;\n\n                        next_x -= half_win;\n                        next_y -= half_win;\n                        prev_delta_x = 0.0;\n                        prev_delta_y = 0.0;\n\n                        for( iter = 0; iter < max_iter; ++iter ) {\n                            inext_x = next_x|0;\n                            inext_y = next_y|0;\n\n                            x = (inext_x <= brd_tl)|(inext_x >= brd_r)|(inext_y <= brd_tl)|(inext_y >= brd_b);\n                            if( x != 0 ) {\n                                if( level == 0 ) {\n                                    status[ptid] = 0;\n                                }\n                                break;\n                            }\n\n                            a = next_x - inext_x;\n                            b = next_y - inext_y;\n                            iw00 = (((1.0 - a)*(1.0 - b)*W_BITS14_) + 0.5)|0;\n                            iw01 = ((a*(1.0 - b)*W_BITS14_) + 0.5)|0;\n                            iw10 = (((1.0 - a)*b*W_BITS14_) + 0.5)|0;\n                            iw11 = (W_BITS14_ - iw00 - iw01 - iw10);\n                            b1 = 0.0, b2 = 0.0;\n\n                            for( y = 0; y < win_size; ++y ) {\n                                jptr = ( (y + inext_y)*lw + inext_x )|0;\n\n                                iptr = (y*win_size)|0;\n                                diptr = iptr << 1;\n                                for( x = 0 ; x < win_size; ++x, ++jptr, ++iptr ) {\n                                    ival = ( (img_next[jptr])*iw00 + (img_next[jptr+1])*iw01 +\n                                            (img_next[jptr+lw])*iw10 + (img_next[jptr+lw+1])*iw11 );\n                                    ival = (((ival) + W_BITS1m51) >> (W_BITS1m5));\n                                    ival = (ival - iwin_buf[iptr]);\n\n                                    b1 += ival * deriv_iwin[diptr++];\n                                    b2 += ival * deriv_iwin[diptr++];\n                                }\n                            }\n\n                            b1 *= FLT_SCALE;\n                            b2 *= FLT_SCALE;\n\n                            delta_x = ((A12*b2 - A22*b1) * D);\n                            delta_y = ((A12*b1 - A11*b2) * D);\n\n                            next_x += delta_x;\n                            next_y += delta_y;\n                            curr_xy[i] = next_x + half_win;\n                            curr_xy[j] = next_y + half_win;\n\n                            if( delta_x*delta_x + delta_y*delta_y <= eps ) {\n                                break;\n                            }\n\n                            if( iter > 0 && Math.abs(delta_x + prev_delta_x) < 0.01 &&\n                                            Math.abs(delta_y + prev_delta_y) < 0.01 ) {\n                                curr_xy[i] -= delta_x*0.5;\n                                curr_xy[j] -= delta_y*0.5;\n                                break;\n                            }\n\n                            prev_delta_x = delta_x;\n                            prev_delta_y = delta_y;\n                        }\n                    } // points loop\n                } // levels loop\n\n                jsfeat.cache.put_buffer(iwin_node);\n                jsfeat.cache.put_buffer(deriv_iwin_node);\n                jsfeat.cache.put_buffer(deriv_lev_node);\n            }\n        };\n    })();\n\n    global.optical_flow_lk = optical_flow_lk;\n\n})(jsfeat);\n/**\n * @author Eugene Zatepyakin / http://inspirit.ru/\n *\n * this code is a rewrite from https://github.com/mtschirs/js-objectdetect implementation\n * @author Martin Tschirsich / http://www.tu-darmstadt.de/~m_t\n */\n\n(function(global) {\n    \"use strict\";\n    //\n    var haar = (function() {\n\n        var _group_func = function(r1, r2) {\n            var distance = (r1.width * 0.25 + 0.5)|0;\n\n            return r2.x <= r1.x + distance &&\n                   r2.x >= r1.x - distance &&\n                   r2.y <= r1.y + distance &&\n                   r2.y >= r1.y - distance &&\n                   r2.width <= (r1.width * 1.5 + 0.5)|0 &&\n                   (r2.width * 1.5 + 0.5)|0 >= r1.width;\n        };\n        \n        return {\n\n            edges_density: 0.07,\n\n            detect_single_scale: function(int_sum, int_sqsum, int_tilted, int_canny_sum, width, height, scale, classifier) {\n                var win_w = (classifier.size[0] * scale)|0,\n                    win_h = (classifier.size[1] * scale)|0,\n                    step_x = (0.5 * scale + 1.5)|0,\n                    step_y = step_x;\n                var i,j,k,x,y,ex=(width-win_w)|0,ey=(height-win_h)|0;\n                var w1=(width+1)|0,edge_dens,mean,variance,std;\n                var inv_area = 1.0 / (win_w * win_h);\n                var stages,stage,trees,tree,sn,tn,fn,found=true,stage_thresh,stage_sum,tree_sum,feature,features;\n                var fi_a,fi_b,fi_c,fi_d,fw,fh;\n\n                var ii_a=0,ii_b=win_w,ii_c=win_h*w1,ii_d=ii_c+win_w;\n                var edges_thresh = ((win_w*win_h) * 0xff * this.edges_density)|0;\n                // if too much gradient we also can skip\n                //var edges_thresh_high = ((win_w*win_h) * 0xff * 0.3)|0;\n\n                var rects = [];\n                for(y = 0; y < ey; y += step_y) {\n                    ii_a = y * w1;\n                    for(x = 0; x < ex; x += step_x, ii_a += step_x) {\n\n                        mean =    int_sum[ii_a] \n                                - int_sum[ii_a+ii_b]\n                                - int_sum[ii_a+ii_c]\n                                + int_sum[ii_a+ii_d];\n\n                        // canny prune\n                        if(int_canny_sum) {\n                            edge_dens = (int_canny_sum[ii_a] \n                                        - int_canny_sum[ii_a+ii_b]\n                                        - int_canny_sum[ii_a+ii_c]\n                                        + int_canny_sum[ii_a+ii_d]);\n                            if(edge_dens < edges_thresh || mean < 20) {\n                                x += step_x, ii_a += step_x;\n                                continue;\n                            }\n                        }\n\n                        mean *= inv_area;\n                        variance = (int_sqsum[ii_a] \n                                    - int_sqsum[ii_a+ii_b]\n                                    - int_sqsum[ii_a+ii_c]\n                                    + int_sqsum[ii_a+ii_d]) * inv_area - mean * mean;\n\n                        std = variance > 0. ? Math.sqrt(variance) : 1;\n\n                        stages = classifier.complexClassifiers;\n                        sn = stages.length;\n                        found =  true;\n                        for(i = 0; i < sn; ++i) {\n                            stage = stages[i];\n                            stage_thresh = stage.threshold;\n                            trees = stage.simpleClassifiers;\n                            tn = trees.length;\n                            stage_sum = 0;\n                            for(j = 0; j < tn; ++j) {\n                                tree = trees[j];\n                                tree_sum = 0;\n                                features = tree.features;\n                                fn = features.length;\n                                if(tree.tilted === 1) {\n                                    for(k=0; k < fn; ++k) {\n                                        feature = features[k];\n                                        fi_a = ~~(x + feature[0] * scale) + ~~(y + feature[1] * scale) * w1;\n                                        fw = ~~(feature[2] * scale);\n                                        fh = ~~(feature[3] * scale);\n                                        fi_b = fw * w1;\n                                        fi_c =  fh * w1;\n\n                                        tree_sum += (int_tilted[fi_a]\n                                                    - int_tilted[fi_a + fw + fi_b]\n                                                    - int_tilted[fi_a - fh + fi_c]\n                                                    + int_tilted[fi_a + fw - fh + fi_b + fi_c]) * feature[4];\n                                    }\n                                } else {\n                                    for(k=0; k < fn; ++k) {\n                                        feature = features[k];\n                                        fi_a = ~~(x + feature[0] * scale) + ~~(y + feature[1] * scale) * w1;\n                                        fw = ~~(feature[2] * scale);\n                                        fh = ~~(feature[3] * scale);\n                                        fi_c = fh * w1;\n\n                                        tree_sum += (int_sum[fi_a] \n                                                    - int_sum[fi_a+fw]\n                                                    - int_sum[fi_a+fi_c]\n                                                    + int_sum[fi_a+fi_c+fw]) * feature[4];\n                                    }\n                                }\n                                stage_sum += (tree_sum * inv_area < tree.threshold * std) ? tree.left_val : tree.right_val;\n                            }\n                            if (stage_sum < stage_thresh) {\n                                found = false;\n                                break;\n                            }\n                        }\n                        \n                        if(found) {\n                            rects.push({\"x\" : x,\n                                        \"y\" : y,\n                                        \"width\" : win_w,\n                                        \"height\" : win_h,\n                                        \"neighbor\" : 1,\n                                        \"confidence\" : stage_sum});\n                            x += step_x, ii_a += step_x;\n                        }\n                    }\n                }\n                return rects;\n            },\n\n            detect_multi_scale: function(int_sum, int_sqsum, int_tilted, int_canny_sum, width, height, classifier, scale_factor, scale_min) {\n                if (typeof scale_factor === \"undefined\") { scale_factor = 1.2; }\n                if (typeof scale_min === \"undefined\") { scale_min = 1.0; }\n                var win_w = classifier.size[0];\n                var win_h = classifier.size[1];\n                var rects = [];\n                while (scale_min * win_w < width && scale_min * win_h < height) {\n                    rects = rects.concat(this.detect_single_scale(int_sum, int_sqsum, int_tilted, int_canny_sum, width, height, scale_min, classifier));\n                    scale_min *= scale_factor;\n                }\n                return rects;\n            },\n\n            // OpenCV method to group detected rectangles\n            group_rectangles: function(rects, min_neighbors) {\n                if (typeof min_neighbors === \"undefined\") { min_neighbors = 1; }\n                var i, j, n = rects.length;\n                var node = [];\n                for (i = 0; i < n; ++i) {\n                    node[i] = {\"parent\" : -1,\n                               \"element\" : rects[i],\n                               \"rank\" : 0};\n                }\n                for (i = 0; i < n; ++i) {\n                    if (!node[i].element)\n                        continue;\n                    var root = i;\n                    while (node[root].parent != -1)\n                        root = node[root].parent;\n                    for (j = 0; j < n; ++j) {\n                        if( i != j && node[j].element && _group_func(node[i].element, node[j].element)) {\n                            var root2 = j;\n\n                            while (node[root2].parent != -1)\n                                root2 = node[root2].parent;\n\n                            if(root2 != root) {\n                                if(node[root].rank > node[root2].rank)\n                                    node[root2].parent = root;\n                                else {\n                                    node[root].parent = root2;\n                                    if (node[root].rank == node[root2].rank)\n                                    node[root2].rank++;\n                                    root = root2;\n                                }\n\n                                /* compress path from node2 to the root: */\n                                var temp, node2 = j;\n                                while (node[node2].parent != -1) {\n                                    temp = node2;\n                                    node2 = node[node2].parent;\n                                    node[temp].parent = root;\n                                }\n\n                                /* compress path from node to the root: */\n                                node2 = i;\n                                while (node[node2].parent != -1) {\n                                    temp = node2;\n                                    node2 = node[node2].parent;\n                                    node[temp].parent = root;\n                                }\n                            }\n                        }\n                    }\n                }\n                var idx_seq = [];\n                var class_idx = 0;\n                for(i = 0; i < n; i++) {\n                    j = -1;\n                    var node1 = i;\n                    if(node[node1].element) {\n                        while (node[node1].parent != -1)\n                            node1 = node[node1].parent;\n                        if(node[node1].rank >= 0)\n                            node[node1].rank = ~class_idx++;\n                        j = ~node[node1].rank;\n                    }\n                    idx_seq[i] = j;\n                }\n                \n                var comps = [];\n                for (i = 0; i < class_idx+1; ++i) {\n                    comps[i] = {\"neighbors\" : 0,\n                                \"x\" : 0,\n                                \"y\" : 0,\n                                \"width\" : 0,\n                                \"height\" : 0,\n                                \"confidence\" : 0};\n                }\n\n                // count number of neighbors\n                for(i = 0; i < n; ++i) {\n                    var r1 = rects[i];\n                    var idx = idx_seq[i];\n\n                    if (comps[idx].neighbors == 0)\n                        comps[idx].confidence = r1.confidence;\n\n                    ++comps[idx].neighbors;\n\n                    comps[idx].x += r1.x;\n                    comps[idx].y += r1.y;\n                    comps[idx].width += r1.width;\n                    comps[idx].height += r1.height;\n                    comps[idx].confidence = Math.max(comps[idx].confidence, r1.confidence);\n                }\n\n                var seq2 = [];\n                // calculate average bounding box\n                for(i = 0; i < class_idx; ++i) {\n                    n = comps[i].neighbors;\n                    if (n >= min_neighbors)\n                        seq2.push({\"x\" : (comps[i].x * 2 + n) / (2 * n),\n                                   \"y\" : (comps[i].y * 2 + n) / (2 * n),\n                                   \"width\" : (comps[i].width * 2 + n) / (2 * n),\n                                   \"height\" : (comps[i].height * 2 + n) / (2 * n),\n                                   \"neighbors\" : comps[i].neighbors,\n                                   \"confidence\" : comps[i].confidence});\n                }\n\n                var result_seq = [];\n                n = seq2.length;\n                // filter out small face rectangles inside large face rectangles\n                for(i = 0; i < n; ++i) {\n                    var r1 = seq2[i];\n                    var flag = true;\n                    for(j = 0; j < n; ++j) {\n                        var r2 = seq2[j];\n                        var distance = (r2.width * 0.25 + 0.5)|0;\n\n                        if(i != j &&\n                           r1.x >= r2.x - distance &&\n                           r1.y >= r2.y - distance &&\n                           r1.x + r1.width <= r2.x + r2.width + distance &&\n                           r1.y + r1.height <= r2.y + r2.height + distance &&\n                           (r2.neighbors > Math.max(3, r1.neighbors) || r1.neighbors < 3)) {\n                            flag = false;\n                            break;\n                        }\n                    }\n\n                    if(flag)\n                        result_seq.push(r1);\n                }\n                return result_seq;\n            }\n        };\n\n    })();\n\n    global.haar = haar;\n\n})(jsfeat);\n/**\n * BBF: Brightness Binary Feature\n *\n * @author Eugene Zatepyakin / http://inspirit.ru/\n *\n * this code is a rewrite from https://github.com/liuliu/ccv implementation\n * @author Liu Liu / http://liuliu.me/\n *\n * The original paper refers to: YEF∗ Real-Time Object Detection, Yotam Abramson and Bruno Steux\n */\n\n(function(global) {\n    \"use strict\";\n    //\n    var bbf = (function() {\n\n        var _group_func = function(r1, r2) {\n            var distance = (r1.width * 0.25 + 0.5)|0;\n\n            return r2.x <= r1.x + distance &&\n                   r2.x >= r1.x - distance &&\n                   r2.y <= r1.y + distance &&\n                   r2.y >= r1.y - distance &&\n                   r2.width <= (r1.width * 1.5 + 0.5)|0 &&\n                   (r2.width * 1.5 + 0.5)|0 >= r1.width;\n        };\n\n        var img_pyr = new jsfeat.pyramid_t(1);\n\n        return {\n\n            interval: 4,\n            scale: 1.1486,\n            next: 5,\n            scale_to: 1,\n\n            // make features local copy\n            // to avoid array allocation with each scale\n            // this is strange but array works faster than Int32 version???\n            prepare_cascade: function(cascade) {\n                var sn = cascade.stage_classifier.length;\n                for (var j = 0; j < sn; j++) {\n                    var orig_feature = cascade.stage_classifier[j].feature;\n                    var f_cnt = cascade.stage_classifier[j].count;\n                    var feature = cascade.stage_classifier[j]._feature = new Array(f_cnt);\n                    for (var k = 0; k < f_cnt; k++) {\n                        feature[k] = {\"size\" : orig_feature[k].size,\n                                      \"px\" : new Array(orig_feature[k].size),\n                                      \"pz\" : new Array(orig_feature[k].size),\n                                      \"nx\" : new Array(orig_feature[k].size),\n                                      \"nz\" : new Array(orig_feature[k].size)};\n                    }\n                }\n            },\n\n            build_pyramid: function(src, min_width, min_height, interval) {\n                if (typeof interval === \"undefined\") { interval = 4; }\n\n                var sw=src.cols,sh=src.rows;\n                var i=0,nw=0,nh=0;\n                var new_pyr=false;\n                var src0=src,src1=src;\n                var data_type = jsfeat.U8_t | jsfeat.C1_t;\n\n                this.interval = interval;\n                this.scale = Math.pow(2, 1 / (this.interval + 1));\n                this.next = (this.interval + 1)|0;\n                this.scale_to = (Math.log(Math.min(sw / min_width, sh / min_height)) / Math.log(this.scale))|0;\n\n                var pyr_l = ((this.scale_to + this.next * 2) * 4) | 0;\n                if(img_pyr.levels != pyr_l) {\n                    img_pyr.levels = pyr_l;\n                    img_pyr.data = new Array(pyr_l);\n                    new_pyr = true;\n                    img_pyr.data[0] = src; // first is src\n                }\n\n                for (i = 1; i <= this.interval; ++i) {\n                    nw = (sw / Math.pow(this.scale, i))|0;\n                    nh = (sh / Math.pow(this.scale, i))|0;\n                    src0 = img_pyr.data[i<<2];\n                    if(new_pyr || nw != src0.cols || nh != src0.rows) {\n                        img_pyr.data[i<<2] = new jsfeat.matrix_t(nw, nh, data_type);\n                        src0 = img_pyr.data[i<<2];\n                    }\n                    jsfeat.imgproc.resample(src, src0, nw, nh);\n                }\n                for (i = this.next; i < this.scale_to + this.next * 2; ++i) {\n                    src1 = img_pyr.data[(i << 2) - (this.next << 2)];\n                    src0 = img_pyr.data[i<<2];\n                    nw = src1.cols >> 1;\n                    nh = src1.rows >> 1;\n                    if(new_pyr || nw != src0.cols || nh != src0.rows) {\n                        img_pyr.data[i<<2] = new jsfeat.matrix_t(nw, nh, data_type);\n                        src0 = img_pyr.data[i<<2];\n                    }\n                    jsfeat.imgproc.pyrdown(src1, src0);\n                }\n                for (i = this.next * 2; i < this.scale_to + this.next * 2; ++i) {\n                    src1 = img_pyr.data[(i << 2) - (this.next << 2)];\n                    nw = src1.cols >> 1;\n                    nh = src1.rows >> 1;\n                    src0 = img_pyr.data[(i<<2)+1];\n                    if(new_pyr || nw != src0.cols || nh != src0.rows) {\n                        img_pyr.data[(i<<2)+1] = new jsfeat.matrix_t(nw, nh, data_type);\n                        src0 = img_pyr.data[(i<<2)+1];\n                    }\n                    jsfeat.imgproc.pyrdown(src1, src0, 1, 0);\n                    //\n                    src0 = img_pyr.data[(i<<2)+2];\n                    if(new_pyr || nw != src0.cols || nh != src0.rows) {\n                        img_pyr.data[(i<<2)+2] = new jsfeat.matrix_t(nw, nh, data_type);\n                        src0 = img_pyr.data[(i<<2)+2];\n                    }\n                    jsfeat.imgproc.pyrdown(src1, src0, 0, 1);\n                    //\n                    src0 = img_pyr.data[(i<<2)+3];\n                    if(new_pyr || nw != src0.cols || nh != src0.rows) {\n                        img_pyr.data[(i<<2)+3] = new jsfeat.matrix_t(nw, nh, data_type);\n                        src0 = img_pyr.data[(i<<2)+3];\n                    }\n                    jsfeat.imgproc.pyrdown(src1, src0, 1, 1);\n                }\n                return img_pyr;\n            },\n\n            detect: function(pyramid, cascade) {\n                var interval = this.interval;\n                var scale = this.scale;\n                var next = this.next;\n                var scale_upto = this.scale_to;\n                var i=0,j=0,k=0,n=0,x=0,y=0,q=0,sn=0,f_cnt=0,q_cnt=0,p=0,pmin=0,nmax=0,f=0,i4=0,qw=0,qh=0;\n                var sum=0.0, alpha, feature, orig_feature, feature_k, feature_o, flag = true, shortcut=true;\n                var scale_x = 1.0, scale_y = 1.0;\n                var dx = [0, 1, 0, 1];\n                var dy = [0, 0, 1, 1];\n                var seq = [];\n                var pyr=pyramid.data, bpp = 1, bpp2 = 2, bpp4 = 4;\n\n                var u8 = [], u8o = [0,0,0];\n                var step = [0,0,0];\n                var paddings = [0,0,0];\n\n                for (i = 0; i < scale_upto; i++) {\n                    i4 = (i<<2);\n                    qw = pyr[i4 + (next << 3)].cols - (cascade.width >> 2);\n                    qh = pyr[i4 + (next << 3)].rows - (cascade.height >> 2);\n                    step[0] = pyr[i4].cols * bpp;\n                    step[1] = pyr[i4 + (next << 2)].cols * bpp;\n                    step[2] = pyr[i4 + (next << 3)].cols * bpp;\n                    paddings[0] = (pyr[i4].cols * bpp4) - (qw * bpp4);\n                    paddings[1] = (pyr[i4 + (next << 2)].cols * bpp2) - (qw * bpp2);\n                    paddings[2] = (pyr[i4 + (next << 3)].cols * bpp) - (qw * bpp);\n                    sn = cascade.stage_classifier.length;\n                    for (j = 0; j < sn; j++) {\n                        orig_feature = cascade.stage_classifier[j].feature;\n                        feature = cascade.stage_classifier[j]._feature;\n                        f_cnt = cascade.stage_classifier[j].count;\n                        for (k = 0; k < f_cnt; k++) {\n                            feature_k = feature[k];\n                            feature_o = orig_feature[k];\n                            q_cnt = feature_o.size|0;\n                            for (q = 0; q < q_cnt; q++) {\n                                feature_k.px[q] = (feature_o.px[q] * bpp) + feature_o.py[q] * step[feature_o.pz[q]];\n                                feature_k.pz[q] = feature_o.pz[q];\n                                feature_k.nx[q] = (feature_o.nx[q] * bpp) + feature_o.ny[q] * step[feature_o.nz[q]];\n                                feature_k.nz[q] = feature_o.nz[q];\n                            }\n                        }\n                    }\n                    u8[0] = pyr[i4].data; u8[1] = pyr[i4 + (next<<2)].data;\n                    for (q = 0; q < 4; q++) {\n                        u8[2] = pyr[i4 + (next<<3) + q].data;\n                        u8o[0] = (dx[q]*bpp2) + dy[q] * (pyr[i4].cols*bpp2); \n                        u8o[1] = (dx[q]*bpp) + dy[q] * (pyr[i4 + (next<<2)].cols*bpp); \n                        u8o[2] = 0;\n                        for (y = 0; y < qh; y++) {\n                            for (x = 0; x < qw; x++) {\n                                sum = 0;\n                                flag = true;\n                                sn = cascade.stage_classifier.length;\n                                for (j = 0; j < sn; j++) {\n                                    sum = 0;\n                                    alpha = cascade.stage_classifier[j].alpha;\n                                    feature = cascade.stage_classifier[j]._feature;\n                                    f_cnt = cascade.stage_classifier[j].count;\n                                    for (k = 0; k < f_cnt; k++) {\n                                        feature_k = feature[k];\n                                        pmin = u8[feature_k.pz[0]][u8o[feature_k.pz[0]] + feature_k.px[0]];\n                                        nmax = u8[feature_k.nz[0]][u8o[feature_k.nz[0]] + feature_k.nx[0]];\n                                        if (pmin <= nmax) {\n                                            sum += alpha[k << 1];\n                                        } else {\n                                            shortcut = true;\n                                            q_cnt = feature_k.size;\n                                            for (f = 1; f < q_cnt; f++) {\n                                                if (feature_k.pz[f] >= 0) {\n                                                    p = u8[feature_k.pz[f]][u8o[feature_k.pz[f]] + feature_k.px[f]];\n                                                    if (p < pmin) {\n                                                        if (p <= nmax) {\n                                                            shortcut = false;\n                                                            break;\n                                                        }\n                                                        pmin = p;\n                                                    }\n                                                }\n                                                if (feature_k.nz[f] >= 0) {\n                                                    n = u8[feature_k.nz[f]][u8o[feature_k.nz[f]] + feature_k.nx[f]];\n                                                    if (n > nmax) {\n                                                        if (pmin <= n) {\n                                                            shortcut = false;\n                                                            break;\n                                                        }\n                                                        nmax = n;\n                                                    }\n                                                }\n                                            }\n                                            sum += (shortcut) ? alpha[(k << 1) + 1] : alpha[k << 1];\n                                        }\n                                    }\n                                    if (sum < cascade.stage_classifier[j].threshold) {\n                                        flag = false;\n                                        break;\n                                    }\n                                }\n                                if (flag) {\n                                    seq.push({\"x\" : (x * 4 + dx[q] * 2) * scale_x,\n                                              \"y\" : (y * 4 + dy[q] * 2) * scale_y,\n                                              \"width\" : cascade.width * scale_x,\n                                              \"height\" : cascade.height * scale_y,\n                                              \"neighbor\" : 1,\n                                              \"confidence\" : sum});\n                                    ++x;\n                                    u8o[0] += bpp4;\n                                    u8o[1] += bpp2;\n                                    u8o[2] += bpp;\n                                }\n                                u8o[0] += bpp4;\n                                u8o[1] += bpp2;\n                                u8o[2] += bpp;\n                            }\n                            u8o[0] += paddings[0];\n                            u8o[1] += paddings[1];\n                            u8o[2] += paddings[2];\n                        }\n                    }\n                    scale_x *= scale;\n                    scale_y *= scale;\n                }\n\n                return seq;\n            },\n\n            // OpenCV method to group detected rectangles\n            group_rectangles: function(rects, min_neighbors) {\n                if (typeof min_neighbors === \"undefined\") { min_neighbors = 1; }\n                var i, j, n = rects.length;\n                var node = [];\n                for (i = 0; i < n; ++i) {\n                    node[i] = {\"parent\" : -1,\n                               \"element\" : rects[i],\n                               \"rank\" : 0};\n                }\n                for (i = 0; i < n; ++i) {\n                    if (!node[i].element)\n                        continue;\n                    var root = i;\n                    while (node[root].parent != -1)\n                        root = node[root].parent;\n                    for (j = 0; j < n; ++j) {\n                        if( i != j && node[j].element && _group_func(node[i].element, node[j].element)) {\n                            var root2 = j;\n\n                            while (node[root2].parent != -1)\n                                root2 = node[root2].parent;\n\n                            if(root2 != root) {\n                                if(node[root].rank > node[root2].rank)\n                                    node[root2].parent = root;\n                                else {\n                                    node[root].parent = root2;\n                                    if (node[root].rank == node[root2].rank)\n                                    node[root2].rank++;\n                                    root = root2;\n                                }\n\n                                /* compress path from node2 to the root: */\n                                var temp, node2 = j;\n                                while (node[node2].parent != -1) {\n                                    temp = node2;\n                                    node2 = node[node2].parent;\n                                    node[temp].parent = root;\n                                }\n\n                                /* compress path from node to the root: */\n                                node2 = i;\n                                while (node[node2].parent != -1) {\n                                    temp = node2;\n                                    node2 = node[node2].parent;\n                                    node[temp].parent = root;\n                                }\n                            }\n                        }\n                    }\n                }\n                var idx_seq = [];\n                var class_idx = 0;\n                for(i = 0; i < n; i++) {\n                    j = -1;\n                    var node1 = i;\n                    if(node[node1].element) {\n                        while (node[node1].parent != -1)\n                            node1 = node[node1].parent;\n                        if(node[node1].rank >= 0)\n                            node[node1].rank = ~class_idx++;\n                        j = ~node[node1].rank;\n                    }\n                    idx_seq[i] = j;\n                }\n                \n                var comps = [];\n                for (i = 0; i < class_idx+1; ++i) {\n                    comps[i] = {\"neighbors\" : 0,\n                                \"x\" : 0,\n                                \"y\" : 0,\n                                \"width\" : 0,\n                                \"height\" : 0,\n                                \"confidence\" : 0};\n                }\n\n                // count number of neighbors\n                for(i = 0; i < n; ++i) {\n                    var r1 = rects[i];\n                    var idx = idx_seq[i];\n\n                    if (comps[idx].neighbors == 0)\n                        comps[idx].confidence = r1.confidence;\n\n                    ++comps[idx].neighbors;\n\n                    comps[idx].x += r1.x;\n                    comps[idx].y += r1.y;\n                    comps[idx].width += r1.width;\n                    comps[idx].height += r1.height;\n                    comps[idx].confidence = Math.max(comps[idx].confidence, r1.confidence);\n                }\n\n                var seq2 = [];\n                // calculate average bounding box\n                for(i = 0; i < class_idx; ++i) {\n                    n = comps[i].neighbors;\n                    if (n >= min_neighbors)\n                        seq2.push({\"x\" : (comps[i].x * 2 + n) / (2 * n),\n                                   \"y\" : (comps[i].y * 2 + n) / (2 * n),\n                                   \"width\" : (comps[i].width * 2 + n) / (2 * n),\n                                   \"height\" : (comps[i].height * 2 + n) / (2 * n),\n                                   \"neighbors\" : comps[i].neighbors,\n                                   \"confidence\" : comps[i].confidence});\n                }\n\n                var result_seq = [];\n                n = seq2.length;\n                // filter out small face rectangles inside large face rectangles\n                for(i = 0; i < n; ++i) {\n                    var r1 = seq2[i];\n                    var flag = true;\n                    for(j = 0; j < n; ++j) {\n                        var r2 = seq2[j];\n                        var distance = (r2.width * 0.25 + 0.5)|0;\n\n                        if(i != j &&\n                           r1.x >= r2.x - distance &&\n                           r1.y >= r2.y - distance &&\n                           r1.x + r1.width <= r2.x + r2.width + distance &&\n                           r1.y + r1.height <= r2.y + r2.height + distance &&\n                           (r2.neighbors > Math.max(3, r1.neighbors) || r1.neighbors < 3)) {\n                            flag = false;\n                            break;\n                        }\n                    }\n\n                    if(flag)\n                        result_seq.push(r1);\n                }\n                return result_seq;\n            }\n\n        };\n\n    })();\n\n    global.bbf = bbf;\n\n})(jsfeat);\n/**\n * @author Eugene Zatepyakin / http://inspirit.ru/\n */\n\n(function(lib) {\n    \"use strict\";\n\n    {\n        // in commonjs, or when AMD wrapping has been applied, define its namespaces as exports\n        module.exports = lib;\n    }\n})(jsfeat);\n});\n\nvar findFaceWorker = function(e) {\n\tvar window = self;\n\n\tvar jsfeat=jsfeat||{REVISION:\"ALPHA\"};(function(r){var o=1.192092896e-7;var l=1e-37;var m=256,i=512,h=1024,x=2048,w=4096;var A=1,n=2,b=3,p=4;var z=new Int32Array([-1,1,4,-1,4,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,8]);var y=(function(){return function(B){return(B&65280)}})();var k=(function(){return function(B){return(B&255)}})();var c=(function(){return function(B){return z[(B&65280)>>8]}})();var a=0;var f=1;var e=2;var u=3;var d=1;var s=1;var g=2;var v=(function(){function B(D,C){this.size=((D+7)|0)&-8;if(typeof C===\"undefined\"){this.buffer=new ArrayBuffer(this.size);}else{this.buffer=C;this.size=C.length;}this.u8=new Uint8Array(this.buffer);this.i32=new Int32Array(this.buffer);this.f32=new Float32Array(this.buffer);this.f64=new Float64Array(this.buffer);}return B})();var q=(function(){function B(F,D,E,C){this.type=y(E)|0;this.channel=k(E)|0;this.cols=F|0;this.rows=D|0;if(typeof C===\"undefined\"){this.allocate();}else{this.buffer=C;this.data=this.type&m?this.buffer.u8:(this.type&i?this.buffer.i32:(this.type&h?this.buffer.f32:this.buffer.f64));}}B.prototype.allocate=function(){delete this.data;delete this.buffer;this.buffer=new v((this.cols*c(this.type)*this.channel)*this.rows);this.data=this.type&m?this.buffer.u8:(this.type&i?this.buffer.i32:(this.type&h?this.buffer.f32:this.buffer.f64));};B.prototype.copy_to=function(D){var C=D.data,G=this.data;var E=0,F=(this.cols*this.rows*this.channel)|0;for(;E<F-4;E+=4){C[E]=G[E];C[E+1]=G[E+1];C[E+2]=G[E+2];C[E+3]=G[E+3];}for(;E<F;++E){C[E]=G[E];}};B.prototype.resize=function(F,D,C){if(typeof C===\"undefined\"){C=this.channel;}var E=(F*c(this.type)*C)*D;if(E>this.buffer.size){this.cols=F;this.rows=D;this.channel=C;this.allocate();}else{this.cols=F;this.rows=D;this.channel=C;}};return B})();var t=(function(){function B(C){this.levels=C|0;this.data=new Array(C);this.pyrdown=jsfeat.imgproc.pyrdown;}B.prototype.allocate=function(C,E,F){var D=this.levels;while(--D>=0){this.data[D]=new q(C>>D,E>>D,F);}};B.prototype.build=function(F,E){if(typeof E===\"undefined\"){E=true;}var H=2,D=F,C=this.data[0];if(!E){var G=F.cols*F.rows;while(--G>=0){C.data[G]=F.data[G];}}C=this.data[1];this.pyrdown(D,C);for(;H<this.levels;++H){D=C;C=this.data[H];this.pyrdown(D,C);}};return B})();var j=(function(){function B(C,G,E,F,D){if(typeof C===\"undefined\"){C=0;}if(typeof G===\"undefined\"){G=0;}if(typeof E===\"undefined\"){E=0;}if(typeof F===\"undefined\"){F=0;}if(typeof D===\"undefined\"){D=-1;}this.x=C;this.y=G;this.score=E;this.level=F;this.angle=D;}return B})();r.U8_t=m;r.S32_t=i;r.F32_t=h;r.S64_t=x;r.F64_t=w;r.C1_t=A;r.C2_t=n;r.C3_t=b;r.C4_t=p;r.U8C1_t=m|A;r.U8C3_t=m|b;r.U8C4_t=m|p;r.F32C1_t=h|A;r.F32C2_t=h|n;r.S32C1_t=i|A;r.S32C2_t=i|n;r.EPSILON=o;r.FLT_MIN=l;r.COLOR_RGBA2GRAY=a;r.COLOR_RGB2GRAY=f;r.COLOR_BGRA2GRAY=e;r.COLOR_BGR2GRAY=u;r.BOX_BLUR_NOSCALE=d;r.SVD_U_T=s;r.SVD_V_T=g;r.get_data_type=y;r.get_channel=k;r.get_data_type_size=c;r.data_t=v;r.matrix_t=q;r.pyramid_t=t;r.keypoint_t=j;})(jsfeat);(function(b){var a=(function(){var f=(function(){function g(h){this.next=null;this.data=new jsfeat.data_t(h);this.size=this.data.size;this.buffer=this.data.buffer;this.u8=this.data.u8;this.i32=this.data.i32;this.f32=this.data.f32;this.f64=this.data.f64;}g.prototype.resize=function(h){delete this.data;this.data=new jsfeat.data_t(h);this.size=this.data.size;this.buffer=this.data.buffer;this.u8=this.data.u8;this.i32=this.data.i32;this.f32=this.data.f32;this.f64=this.data.f64;};return g})();var e,c;var d=0;return{allocate:function(g,k){e=c=new f(k);for(var h=0;h<g;++h){var j=new f(k);c=c.next=j;d++;}},get_buffer:function(g){var h=e;e=e.next;d--;if(g>h.size){h.resize(g);}return h},put_buffer:function(g){c=c.next=g;d++;}}})();b.cache=a;a.allocate(30,640*4);})(jsfeat);(function(b){var a=(function(){var c=new Int32Array(48*2);return{get_gaussian_kernel:function(p,m,e,l){var f=0,j=0,o=0,n=0,d=0;var g=0;var h=jsfeat.cache.get_buffer(p<<2);var k=h.f32;if((p&1)==1&&p<=7&&m<=0){switch(p>>1){case 0:k[0]=1;g=1;break;case 1:k[0]=0.25,k[1]=0.5,k[2]=0.25;g=0.25+0.5+0.25;break;case 2:k[0]=0.0625,k[1]=0.25,k[2]=0.375,k[3]=0.25,k[4]=0.0625;g=0.0625+0.25+0.375+0.25+0.0625;break;case 3:k[0]=0.03125,k[1]=0.109375,k[2]=0.21875,k[3]=0.28125,k[4]=0.21875,k[5]=0.109375,k[6]=0.03125;g=0.03125+0.109375+0.21875+0.28125+0.21875+0.109375+0.03125;break}}else{n=m>0?m:((p-1)*0.5-1)*0.3+0.8;d=-0.5/(n*n);for(;f<p;++f){j=f-(p-1)*0.5;o=Math.exp(d*j*j);k[f]=o;g+=o;}}if(l&jsfeat.U8_t){g=256/g;for(f=0;f<p;++f){e[f]=(k[f]*g+0.5)|0;}}else{g=1/g;for(f=0;f<p;++f){e[f]=k[f]*g;}}jsfeat.cache.put_buffer(h);},perspective_4point_transform:function(x,B,r,w,g,A,q,v,f,z,p,u,e,y,o,t,d){var Y=B;var X=z;var W=q;var V=Y*X*W;var U=o;var T=Y*U;var S=X*T;var R=p;var n=Y*R;var m=A;var k=r;var j=y;var i=k*j;var h=i*m;var ax=j*m*R;var aw=j*W;var aq=j*R;var ao=X*W;var am=U*X;var aj=U*m;var ag=R*m;var Q=1/(aw-aq-ao+am-aj+ag);var O=Y*j;var N=k*m;var M=W*Y;var L=U*M;var K=k*X;var I=i*R;var G=k*R*m;var D=W*U*X;var C=U*k;var av=-(S-V+n*m-m*T-i*X+h-ax+aw*X)*Q;var au=(V-S-O*W+O*R+h-X*N+aj*X-ax)*Q;var ar=Y;var ap=(-R*T+L+K*W-i*W+I-G+aj*R-D)*Q;var an=(-L+M*R-C*X+I-G+C*m+D-aw*R)*Q;var al=k;var ai=(-n+M+K-N+aq-aw-am+aj)*Q;var af=(-T+n+i-K+aj-ag-aw+ao)*Q;Y=w;X=u;W=f;V=Y*X*W;U=d;T=Y*U;S=X*T;R=e;n=Y*R;m=v;k=g;j=t;i=k*j;h=i*m;ax=j*m*R;aw=j*W;aq=j*R;ao=X*W;am=U*X;aj=U*m;ag=R*m;Q=1/(aw-aq-ao+am-aj+ag);O=Y*j;N=k*m;M=W*Y;L=U*M;K=k*X;I=i*R;G=k*R*m;D=W*U*X;C=U*k;var ak=-(S-V+n*m-m*T-i*X+h-ax+aw*X)*Q;var ah=(V-S-O*W+O*R+h-X*N+aj*X-ax)*Q;var ae=Y;var ad=(-R*T+L+K*W-i*W+I-G+aj*R-D)*Q;var ac=(-L+M*R-C*X+I-G+C*m+D-aw*R)*Q;var ab=k;var aa=(-n+M+K-N+aq-aw-am+aj)*Q;var Z=(-T+n+i-K+aj-ag-aw+ao)*Q;X=an-af*al;W=av*an;V=av*al;T=ap*au;S=ar*ap;n=au*ai;var l=ar*ai;j=1/(W-V*af-T+S*af+n*al-l*an);h=-ap+al*ai;var at=-ap*af+an*ai;ag=-au+ar*af;var P=av-l;N=av*af-n;M=-au*al+ar*an;var J=V-S;var H=W-T;G=X*j;var F=ag*j;var E=M*j;var s=x.data;s[0]=ak*G+ah*(h*j)-ae*(at*j);s[1]=ak*F+ah*(P*j)-ae*(N*j);s[2]=-ak*E-ah*(J*j)+ae*(H*j);s[3]=ad*G+ac*(h*j)-ab*(at*j);s[4]=ad*F+ac*(P*j)-ab*(N*j);s[5]=-ad*E-ac*(J*j)+ab*(H*j);s[6]=aa*G+Z*(h*j)-at*j;s[7]=aa*F+Z*(P*j)-N*j;s[8]=-aa*E-Z*(J*j)+H*j;},qsort:function(o,J,s,u){var D=7;var v,r,q,p;var C=0,j=0,G=0,B=0,z=0,A=0,e=0,y=0,E=0;var x=0,w=0,h=0,g=0,l=0,I=0,H=0,F=0,f=0;var k=c;if((s-J+1)<=1){return}k[0]=J;k[1]=s;while(C>=0){j=k[C<<1];G=k[(C<<1)+1];C--;for(;;){z=(G-j)+1;if(z<=D){for(e=j+1;e<=G;e++){for(y=e;y>j&&u(o[y],o[y-1]);y--){v=o[y];o[y]=o[y-1];o[y-1]=v;}}break}else{f=0;x=j;h=G;l=j+(z>>1);if(z>40){E=z>>3;I=j,H=j+E,F=j+(E<<1);r=o[I],q=o[H],p=o[F];j=u(r,q)?(u(q,p)?H:(u(r,p)?F:I)):(u(p,q)?H:(u(r,p)?I:F));I=l-E,H=l,F=l+E;r=o[I],q=o[H],p=o[F];l=u(r,q)?(u(q,p)?H:(u(r,p)?F:I)):(u(p,q)?H:(u(r,p)?I:F));I=G-(E<<1),H=G-E,F=G;r=o[I],q=o[H],p=o[F];G=u(r,q)?(u(q,p)?H:(u(r,p)?F:I)):(u(p,q)?H:(u(r,p)?I:F));}I=j,H=l,F=G;r=o[I],q=o[H],p=o[F];l=u(r,q)?(u(q,p)?H:(u(r,p)?F:I)):(u(p,q)?H:(u(r,p)?I:F));if(l!=x){v=o[l];o[l]=o[x];o[x]=v;l=x;}j=w=x+1;G=g=h;r=o[l];for(;;){while(j<=G&&!u(r,o[j])){if(!u(o[j],r)){if(j>w){v=o[w];o[w]=o[j];o[j]=v;}f=1;w++;}j++;}while(j<=G&&!u(o[G],r)){if(!u(r,o[G])){if(G<g){v=o[g];o[g]=o[G];o[G]=v;}f=1;g--;}G--;}if(j>G){break}v=o[j];o[j]=o[G];o[G]=v;f=1;j++;G--;}if(f==0){j=x,G=h;for(e=j+1;e<=G;e++){for(y=e;y>j&&u(o[y],o[y-1]);y--){v=o[y];o[y]=o[y-1];o[y-1]=v;}}break}z=Math.min((w-x),(j-w));A=(j-z)|0;for(B=0;B<z;++B,++A){v=o[x+B];o[x+B]=o[A];o[A]=v;}z=Math.min((h-g),(g-G));A=(h-z+1)|0;for(B=0;B<z;++B,++A){v=o[j+B];o[j+B]=o[A];o[A]=v;}z=(j-w);A=(g-G);if(z>1){if(A>1){if(z>A){++C;k[C<<1]=x;k[(C<<1)+1]=x+z-1;j=h-A+1,G=h;}else{++C;k[C<<1]=h-A+1;k[(C<<1)+1]=h;j=x,G=x+z-1;}}else{j=x,G=x+z-1;}}else{if(A>1){j=h-A+1,G=h;}else{break}}}}}},median:function(k,d,i){var e;var f=0,j=0,g=0,h=(d+i)>>1;for(;;){if(i<=d){return k[h]}if(i==(d+1)){if(k[d]>k[i]){e=k[d];k[d]=k[i];k[i]=e;}return k[h]}f=((d+i)>>1);if(k[f]>k[i]){e=k[f];k[f]=k[i];k[i]=e;}if(k[d]>k[i]){e=k[d];k[d]=k[i];k[i]=e;}if(k[f]>k[d]){e=k[f];k[f]=k[d];k[d]=e;}j=(d+1);e=k[f];k[f]=k[j];k[j]=e;g=i;for(;;){do{++j;}while(k[d]>k[j]);do{--g;}while(k[g]>k[d]);if(g<j){break}e=k[j];k[j]=k[g];k[g]=e;}e=k[d];k[d]=k[g];k[g]=e;if(g<=h){d=j;}else{if(g>=h){i=(g-1);}}}return 0}}})();b.math=a;})(jsfeat);(function(b){var a=(function(){return{identity:function(j,g){if(typeof g===\"undefined\"){g=1;}var i=j.data;var f=j.rows,h=j.cols,e=(h+1)|0;var c=f*h;var d=c;while(--c>=0){i[c]=0;}c=d;d=0;while(d<c){i[d]=g;d=d+e;}},transpose:function(f,d){var l=0,h=0,k=d.rows,c=d.cols;var n=0,e=0,m=0;var o=d.data,g=f.data;for(;l<k;e+=1,n+=c,l++){m=e;for(h=0;h<c;m+=k,h++){g[m]=o[n+h];}}},multiply:function(l,n,m){var u=0,s=0,o=0;var r=0,t=0,q=0,w=0,g=0;var f=n.cols,e=n.rows,p=m.cols;var v=n.data,d=m.data,h=l.data;var c=0;for(;u<e;r+=f,u++){for(w=0,s=0;s<p;g++,w++,s++){q=w;t=r;c=0;for(o=0;o<f;t++,q+=p,o++){c+=v[t]*d[q];}h[g]=c;}}},multiply_ABt:function(c,g,d){var p=0,n=0,m=0;var r=0,l=0,f=0,u=0;var e=g.cols,o=g.rows,q=d.rows;var v=g.data,t=d.data,h=c.data;var s=0;for(;p<o;r+=e,p++){for(f=0,n=0;n<q;u++,n++){l=r;s=0;for(m=0;m<e;l++,f++,m++){s+=v[l]*t[f];}h[u]=s;}}},multiply_AtB:function(l,n,m){var u=0,s=0,o=0;var r=0,t=0,q=0,w=0,g=0;var f=n.cols,e=n.rows,p=m.cols;var v=n.data,d=m.data,h=l.data;var c=0;for(;u<f;r++,u++){for(w=0,s=0;s<p;g++,w++,s++){q=w;t=r;c=0;for(o=0;o<e;t+=f,q+=p,o++){c+=v[t]*d[q];}h[g]=c;}}},multiply_AAt:function(d,h){var q=0,o=0,n=0;var c=0,r=0,m=0,g=0,e=0,u=0;var f=h.cols,p=h.rows;var t=h.data,l=d.data;var s=0;for(;q<p;c+=p+1,r=m,q++){e=c;u=c;g=r;for(o=q;o<p;e++,u+=p,o++){m=r;s=0;for(n=0;n<f;n++){s+=t[m++]*t[g++];}l[e]=s;l[u]=s;}}},multiply_AtA:function(c,g){var r=0,p=0,n=0;var s=0,m=0,f=0,o=0,d=0,l=0;var e=g.cols,q=g.rows;var u=g.data,h=c.data;var t=0;for(;r<e;o+=e,r++){s=r;l=o+r;d=l;for(p=r;p<e;d++,l+=e,p++){m=s;f=p;t=0;for(n=0;n<q;m+=e,f+=e,n++){t+=u[m]*u[f];}h[d]=t;h[l]=t;}}},identity_3x3:function(e,d){if(typeof d===\"undefined\"){d=1;}var c=e.data;c[0]=c[4]=c[8]=d;c[1]=c[2]=c[3]=0;c[5]=c[6]=c[7]=0;},invert_3x3:function(s,e){var o=s.data,h=e.data;var n=o[4];var m=o[8];var l=o[5];var k=o[7];var j=o[0];var i=j*n;var v=j*l;var u=o[3];var t=o[1];var r=u*t;var q=o[2];var p=u*q;var g=o[6];var f=g*t;var d=g*q;var c=1/(i*m-v*k-r*m+p*k+f*l-d*n);h[0]=(n*m-l*k)*c;h[1]=-(t*m-q*k)*c;h[2]=-(-t*l+q*n)*c;h[3]=-(u*m-l*g)*c;h[4]=(j*m-d)*c;h[5]=-(v-p)*c;h[6]=-(-u*k+n*g)*c;h[7]=-(j*k-f)*c;h[8]=(i-r)*c;},multiply_3x3:function(r,v,t){var y=r.data,z=v.data,l=t.data;var x=z[0],w=z[1],u=z[2];var s=z[3],q=z[4],p=z[5];var o=z[6],n=z[7],m=z[8];var k=l[0],j=l[1],i=l[2];var h=l[3],g=l[4],f=l[5];var e=l[6],d=l[7],c=l[8];y[0]=x*k+w*h+u*e;y[1]=x*j+w*g+u*d;y[2]=x*i+w*f+u*c;y[3]=s*k+q*h+p*e;y[4]=s*j+q*g+p*d;y[5]=s*i+q*f+p*c;y[6]=o*k+n*h+m*e;y[7]=o*j+n*g+m*d;y[8]=o*i+n*f+m*c;},mat3x3_determinant:function(d){var c=d.data;return c[0]*c[4]*c[8]-c[0]*c[5]*c[7]-c[3]*c[1]*c[8]+c[3]*c[2]*c[7]+c[6]*c[1]*c[5]-c[6]*c[2]*c[4]},determinant_3x3:function(h,g,f,e,d,c,k,j,i){return h*d*i-h*c*j-e*g*i+e*f*j+k*g*c-k*f*d}}})();b.matmath=a;})(jsfeat);(function(b){var a=(function(){var f=function(g,j,i,h){h=g[j];g[j]=g[i];g[i]=h;};var d=function(h,g){h=Math.abs(h);g=Math.abs(g);if(h>g){g/=h;return h*Math.sqrt(1+g*g)}if(g>0){h/=g;return g*Math.sqrt(1+h*h)}return 0};var c=function(H,o,q,r,h,I){var C=jsfeat.EPSILON;var N=0,M=0,L=0,J=0,K=0,D=0,R=0,G=0;var u=0,v=I*I*30;var E=0,U=0,F=0,x=0,z=0,B=0,Q=0,T=0,w=0;var P=jsfeat.cache.get_buffer(I<<2);var S=jsfeat.cache.get_buffer(I<<2);var O=P.i32;var g=S.i32;if(r){for(;N<I;N++){L=N*h;for(M=0;M<I;M++){r[L+M]=0;}r[L+N]=1;}}for(L=0;L<I;L++){q[L]=H[(o+1)*L];if(L<I-1){for(J=L+1,E=Math.abs(H[o*L+J]),N=L+2;N<I;N++){U=Math.abs(H[o*L+N]);if(E<U){E=U,J=N;}}O[L]=J;}if(L>0){for(J=0,E=Math.abs(H[L]),N=1;N<L;N++){U=Math.abs(H[o*N+L]);if(E<U){E=U,J=N;}}g[L]=J;}}if(I>1){for(;u<v;u++){for(L=0,E=Math.abs(H[O[0]]),N=1;N<I-1;N++){U=Math.abs(H[o*N+O[N]]);if(E<U){E=U,L=N;}}K=O[L];for(N=1;N<I;N++){U=Math.abs(H[o*g[N]+N]);if(E<U){E=U,L=g[N],K=N;}}F=H[o*L+K];if(Math.abs(F)<=C){break}x=(q[K]-q[L])*0.5;z=Math.abs(x)+d(F,x);B=d(F,z);Q=z/B;B=F/B;z=(F/z)*F;if(x<0){B=-B,z=-z;}H[o*L+K]=0;q[L]-=z;q[K]+=z;for(N=0;N<L;N++){R=(o*N+L);G=(o*N+K);T=H[R];w=H[G];H[R]=T*Q-w*B;H[G]=T*B+w*Q;}for(N=(L+1);N<K;N++){R=(o*L+N);G=(o*N+K);T=H[R];w=H[G];H[R]=T*Q-w*B;H[G]=T*B+w*Q;}N=K+1;R=(o*L+N);G=(o*K+N);for(;N<I;N++,R++,G++){T=H[R];w=H[G];H[R]=T*Q-w*B;H[G]=T*B+w*Q;}if(r){R=h*L;G=h*K;for(N=0;N<I;N++,R++,G++){T=r[R];w=r[G];r[R]=T*Q-w*B;r[G]=T*B+w*Q;}}for(M=0;M<2;M++){D=M==0?L:K;if(D<I-1){for(J=D+1,E=Math.abs(H[o*D+J]),N=D+2;N<I;N++){U=Math.abs(H[o*D+N]);if(E<U){E=U,J=N;}}O[D]=J;}if(D>0){for(J=0,E=Math.abs(H[D]),N=1;N<D;N++){U=Math.abs(H[o*N+D]);if(E<U){E=U,J=N;}}g[D]=J;}}}}for(L=0;L<I-1;L++){J=L;for(N=L+1;N<I;N++){if(q[J]<q[N]){J=N;}}if(L!=J){f(q,J,L,E);if(r){for(N=0;N<I;N++){f(r,h*J+N,h*L+N,E);}}}}jsfeat.cache.put_buffer(P);jsfeat.cache.put_buffer(S);};var e=function(D,l,h,M,v,T,S,E){var C=jsfeat.EPSILON*2;var q=jsfeat.FLT_MIN;var X=0,V=0,U=0,A=0,u=Math.max(T,30);var K=0,J=0,R=0,Q=0,F=0;var Y=0,O=0,N=0;var H=0,G=0,x=0,I=0,w=0,L=0,aa=0,P=0,Z=0;var z=4660;var B=0,y=0,o=0;var r=jsfeat.cache.get_buffer(S<<3);var g=r.f64;for(;X<S;X++){for(U=0,x=0;U<T;U++){N=D[X*l+U];x+=N*N;}g[X]=x;if(M){for(U=0;U<S;U++){M[X*v+U]=0;}M[X*v+X]=1;}}for(;A<u;A++){F=0;for(X=0;X<S-1;X++){for(V=X+1;V<S;V++){K=(X*l)|0,J=(V*l)|0;aa=g[X],P=0,Z=g[V];U=2;P+=D[K]*D[J];P+=D[K+1]*D[J+1];for(;U<T;U++){P+=D[K+U]*D[J+U];}if(Math.abs(P)<=C*Math.sqrt(aa*Z)){continue}P*=2;I=aa-Z,w=d(P,I);if(I<0){L=(w-I)*0.5;O=Math.sqrt(L/w);Y=(P/(w*O*2));}else{Y=Math.sqrt((w+I)/(w*2));O=(P/(w*Y*2));}aa=0,Z=0;U=2;H=Y*D[K]+O*D[J];G=-O*D[K]+Y*D[J];D[K]=H;D[J]=G;aa+=H*H;Z+=G*G;H=Y*D[K+1]+O*D[J+1];G=-O*D[K+1]+Y*D[J+1];D[K+1]=H;D[J+1]=G;aa+=H*H;Z+=G*G;for(;U<T;U++){H=Y*D[K+U]+O*D[J+U];G=-O*D[K+U]+Y*D[J+U];D[K+U]=H;D[J+U]=G;aa+=H*H;Z+=G*G;}g[X]=aa;g[V]=Z;F=1;if(M){R=(X*v)|0,Q=(V*v)|0;U=2;H=Y*M[R]+O*M[Q];G=-O*M[R]+Y*M[Q];M[R]=H;M[Q]=G;H=Y*M[R+1]+O*M[Q+1];G=-O*M[R+1]+Y*M[Q+1];M[R+1]=H;M[Q+1]=G;for(;U<S;U++){H=Y*M[R+U]+O*M[Q+U];G=-O*M[R+U]+Y*M[Q+U];M[R+U]=H;M[Q+U]=G;}}}}if(F==0){break}}for(X=0;X<S;X++){for(U=0,x=0;U<T;U++){N=D[X*l+U];x+=N*N;}g[X]=Math.sqrt(x);}for(X=0;X<S-1;X++){V=X;for(U=X+1;U<S;U++){if(g[V]<g[U]){V=U;}}if(X!=V){f(g,X,V,x);if(M){for(U=0;U<T;U++){f(D,X*l+U,V*l+U,N);}for(U=0;U<S;U++){f(M,X*v+U,V*v+U,N);}}}}for(X=0;X<S;X++){h[X]=g[X];}if(!M){jsfeat.cache.put_buffer(r);return}for(X=0;X<E;X++){x=X<S?g[X]:0;while(x<=q){y=(1/T);for(U=0;U<T;U++){z=(z*214013+2531011);B=(((z>>16)&32767)&256)!=0?y:-y;D[X*l+U]=B;}for(A=0;A<2;A++){for(V=0;V<X;V++){x=0;for(U=0;U<T;U++){x+=D[X*l+U]*D[V*l+U];}o=0;for(U=0;U<T;U++){N=(D[X*l+U]-x*D[V*l+U]);D[X*l+U]=N;o+=Math.abs(N);}o=o?1/o:0;for(U=0;U<T;U++){D[X*l+U]*=o;}}}x=0;for(U=0;U<T;U++){N=D[X*l+U];x+=N*N;}x=Math.sqrt(x);}O=(1/x);for(U=0;U<T;U++){D[X*l+U]*=O;}}jsfeat.cache.put_buffer(r);};return{lu_solve:function(l,g){var q=0,o=0,n=0,h=1,v=l.cols;var w=l.data,r=g.data;var x,m,u,y;for(q=0;q<v;q++){n=q;for(o=q+1;o<v;o++){if(Math.abs(w[o*v+q])>Math.abs(w[n*v+q])){n=o;}}if(Math.abs(w[n*v+q])<jsfeat.EPSILON){return 0}if(n!=q){for(o=q;o<v;o++){f(w,q*v+o,n*v+o,x);}f(r,q,n,x);h=-h;}u=-1/w[q*v+q];for(o=q+1;o<v;o++){m=w[o*v+q]*u;for(n=q+1;n<v;n++){w[o*v+n]+=m*w[q*v+n];}r[o]+=m*r[q];}w[q*v+q]=-u;}for(q=v-1;q>=0;q--){y=r[q];for(n=q+1;n<v;n++){y-=w[q*v+n]*r[n];}r[q]=y*w[q*v+q];}return 1},cholesky_solve:function(h,g){var l=0,v=0,r=0,s=0,n=0,p=0,o=0;var u=h.cols;var t=h.data,q=g.data;var k,m;for(l=0;l<u;l++){m=1;s=(l*u);n=s;for(v=l;v<u;v++){k=t[(n+l)];for(r=0;r<l;r++){k-=t[(r*u+l)]*t[(n+r)];}if(v==l){t[(n+l)]=k;if(k==0){return 0}m=1/k;}else{t[(s+v)]=k;t[(n+l)]=k*m;}n=(n+u);}}s=0;for(p=0;p<u;p++){k=q[p];for(o=0;o<p;o++){k-=t[(s+o)]*q[o];}q[p]=k;s=(s+u);}s=0;for(p=0;p<u;p++){q[p]/=t[(s+p)];s=(s+u);}p=(u-1);for(;p>=0;p--){k=q[p];o=(p+1);s=(o*u);for(;o<u;o++){k-=t[(s+p)]*q[o];s=(s+u);}q[p]=k;}return 1},svd_decompose:function(t,k,p,l,o){if(typeof o===\"undefined\"){o=0;}var r=0,z=0,x=0,g=t.rows,D=t.cols,w=g,v=D;var s=t.type|jsfeat.C1_t;if(w<v){r=1;z=w;w=v;v=z;}var q=jsfeat.cache.get_buffer((w*w)<<3);var h=jsfeat.cache.get_buffer(v<<3);var C=jsfeat.cache.get_buffer((v*v)<<3);var u=new jsfeat.matrix_t(w,w,s,q.data);var B=new jsfeat.matrix_t(1,v,s,h.data);var y=new jsfeat.matrix_t(v,v,s,C.data);if(r==0){jsfeat.matmath.transpose(u,t);}else{for(z=0;z<D*g;z++){u.data[z]=t.data[z];}for(;z<v*w;z++){u.data[z]=0;}}e(u.data,w,B.data,y.data,v,w,v,w);if(k){for(z=0;z<v;z++){k.data[z]=B.data[z];}for(;z<D;z++){k.data[z]=0;}}if(r==0){if(p&&(o&jsfeat.SVD_U_T)){z=w*w;while(--z>=0){p.data[z]=u.data[z];}}else{if(p){jsfeat.matmath.transpose(p,u);}}if(l&&(o&jsfeat.SVD_V_T)){z=v*v;while(--z>=0){l.data[z]=y.data[z];}}else{if(l){jsfeat.matmath.transpose(l,y);}}}else{if(p&&(o&jsfeat.SVD_U_T)){z=v*v;while(--z>=0){p.data[z]=y.data[z];}}else{if(p){jsfeat.matmath.transpose(p,y);}}if(l&&(o&jsfeat.SVD_V_T)){z=w*w;while(--z>=0){l.data[z]=u.data[z];}}else{if(l){jsfeat.matmath.transpose(l,u);}}}jsfeat.cache.put_buffer(q);jsfeat.cache.put_buffer(h);jsfeat.cache.put_buffer(C);},svd_solve:function(v,l,s){var E=0,C=0,z=0;var w=0,u=0;var o=v.rows,p=v.cols;var h=0,I=0,x=0;var r=v.type|jsfeat.C1_t;var F=jsfeat.cache.get_buffer((o*o)<<3);var m=jsfeat.cache.get_buffer(p<<3);var H=jsfeat.cache.get_buffer((p*p)<<3);var t=new jsfeat.matrix_t(o,o,r,F.data);var G=new jsfeat.matrix_t(1,p,r,m.data);var D=new jsfeat.matrix_t(p,p,r,H.data);var n=s.data,y=t.data,q=G.data,g=D.data;this.svd_decompose(v,G,t,D,0);x=jsfeat.EPSILON*q[0]*p;for(;E<p;E++,u+=p){I=0;for(C=0;C<p;C++){if(q[C]>x){for(z=0,h=0,w=0;z<o;z++,w+=p){h+=y[w+C]*n[z];}I+=h*g[u+C]/q[C];}}l.data[E]=I;}jsfeat.cache.put_buffer(F);jsfeat.cache.put_buffer(m);jsfeat.cache.put_buffer(H);},svd_invert:function(E,t){var C=0,z=0,y=0;var v=0,s=0,h=0;var n=t.rows,o=t.cols;var l=0,w=0;var q=t.type|jsfeat.C1_t;var D=jsfeat.cache.get_buffer((n*n)<<3);var m=jsfeat.cache.get_buffer(o<<3);var G=jsfeat.cache.get_buffer((o*o)<<3);var u=new jsfeat.matrix_t(n,n,q,D.data);var F=new jsfeat.matrix_t(1,o,q,m.data);var B=new jsfeat.matrix_t(o,o,q,G.data);var r=E.data,x=u.data,p=F.data,g=B.data;this.svd_decompose(t,F,u,B,0);w=jsfeat.EPSILON*p[0]*o;for(;C<o;C++,s+=o){for(z=0,v=0;z<n;z++,h++){for(y=0,l=0;y<o;y++,v++){if(p[y]>w){l+=g[s+y]*x[v]/p[y];}}r[h]=l;}}jsfeat.cache.put_buffer(D);jsfeat.cache.put_buffer(m);jsfeat.cache.put_buffer(G);},eigenVV:function(j,p,r){var k=j.cols,m=k*k;var g=j.type|jsfeat.C1_t;var o=jsfeat.cache.get_buffer((k*k)<<3);var h=jsfeat.cache.get_buffer(k<<3);var l=new jsfeat.matrix_t(k,k,g,o.data);var q=new jsfeat.matrix_t(1,k,g,h.data);while(--m>=0){l.data[m]=j.data[m];}c(l.data,k,q.data,p?p.data:null,k,k);if(r){while(--k>=0){r.data[k]=q.data[k];}}jsfeat.cache.put_buffer(o);jsfeat.cache.put_buffer(h);}}})();b.linalg=a;})(jsfeat);(function(a){var c=(function(){var m=function(p){return p*p};var e=function(z,A,x,w,u){var t=0;var y=0,s=0,q=0,C=0;var v=0,r=0,p=0,B=0;var E=0,D=0;for(;t<u;++t){y+=z[t].x;s+=z[t].y;v+=A[t].x;r+=A[t].y;}y/=u;s/=u;v/=u;r/=u;for(t=0;t<u;++t){E=z[t].x-y;D=z[t].y-s;q+=Math.sqrt(E*E+D*D);E=A[t].x-v;D=A[t].y-r;p+=Math.sqrt(E*E+D*D);}q/=u;p/=u;C=Math.SQRT2/q;B=Math.SQRT2/p;x[0]=x[4]=C;x[2]=-y*C;x[5]=-s*C;x[1]=x[3]=x[6]=x[7]=0;x[8]=1;w[0]=w[4]=B;w[2]=-v*B;w[5]=-r*B;w[1]=w[3]=w[6]=w[7]=0;w[8]=1;};var h=function(x,u){var q=0,p=0,r=(u-1)|0;var w=0,t=0,v=0,s=0;for(;q<r;++q){w=x[q].x-x[r].x;t=x[q].y-x[r].y;for(p=0;p<q;++p){v=x[p].x-x[r].x;s=x[p].y-x[r].y;if(Math.abs(v*t-s*w)<=jsfeat.EPSILON*(Math.abs(w)+Math.abs(t)+Math.abs(v)+Math.abs(s))){return true}}}return false};var k=new jsfeat.matrix_t(3,3,jsfeat.F32_t|jsfeat.C1_t);var i=new jsfeat.matrix_t(3,3,jsfeat.F32_t|jsfeat.C1_t);var o=new jsfeat.matrix_t(6,6,jsfeat.F32_t|jsfeat.C1_t);var n=new jsfeat.matrix_t(6,1,jsfeat.F32_t|jsfeat.C1_t);var j=(function(){function p(){}p.prototype.run=function(D,q,r,t){var G=0,F=0;var B=r.type|jsfeat.C1_t;var J=r.data,v=k.data,E=i.data;var x,w,A=0,z=0;e(D,q,v,E,t);var u=jsfeat.cache.get_buffer((2*t*6)<<3);var y=jsfeat.cache.get_buffer((2*t)<<3);var C=new jsfeat.matrix_t(6,2*t,B,u.data);var H=new jsfeat.matrix_t(1,2*t,B,y.data);var I=C.data,s=H.data;for(;G<t;++G){x=D[G];w=q[G];A=v[0]*x.x+v[1]*x.y+v[2];z=v[3]*x.x+v[4]*x.y+v[5];F=G*2*6;I[F]=A,I[F+1]=z,I[F+2]=1,I[F+3]=0,I[F+4]=0,I[F+5]=0;F+=6;I[F]=0,I[F+1]=0,I[F+2]=0,I[F+3]=A,I[F+4]=z,I[F+5]=1;s[G<<1]=E[0]*w.x+E[1]*w.y+E[2];s[(G<<1)+1]=E[3]*w.x+E[4]*w.y+E[5];}jsfeat.matmath.multiply_AtA(o,C);jsfeat.matmath.multiply_AtB(n,C,H);jsfeat.linalg.lu_solve(o,n);J[0]=n.data[0],J[1]=n.data[1],J[2]=n.data[2];J[3]=n.data[3],J[4]=n.data[4],J[5]=n.data[5];J[6]=0,J[7]=0,J[8]=1;jsfeat.matmath.invert_3x3(i,i);jsfeat.matmath.multiply_3x3(r,i,r);jsfeat.matmath.multiply_3x3(r,r,k);jsfeat.cache.put_buffer(u);jsfeat.cache.put_buffer(y);return 1};p.prototype.error=function(v,w,t,r,u){var s=0;var y,x;var q=t.data;for(;s<u;++s){y=v[s];x=w[s];r[s]=m(x.x-q[0]*y.x-q[1]*y.y-q[2])+m(x.y-q[3]*y.x-q[4]*y.y-q[5]);}};p.prototype.check_subset=function(s,r,q){return true};return p})();var g=new jsfeat.matrix_t(9,9,jsfeat.F32_t|jsfeat.C1_t);var f=new jsfeat.matrix_t(9,9,jsfeat.F32_t|jsfeat.C1_t);var l=(function(){function p(){}p.prototype.run=function(I,r,v,C){var L=0,K=0;var O=v.data,D=k.data,J=i.data;var M=g.data,N=f.data;var H=0,G=0,s=0,q=0;var u=0,t=0,B=0,A=0,z=0,w=0,F=0,E=0;for(;L<C;++L){B+=r[L].x;A+=r[L].y;F+=I[L].x;E+=I[L].y;}B/=C;A/=C;F/=C;E/=C;for(L=0;L<C;++L){u+=Math.abs(r[L].x-B);t+=Math.abs(r[L].y-A);z+=Math.abs(I[L].x-F);w+=Math.abs(I[L].y-E);}if(Math.abs(u)<jsfeat.EPSILON||Math.abs(t)<jsfeat.EPSILON||Math.abs(z)<jsfeat.EPSILON||Math.abs(w)<jsfeat.EPSILON){return 0}u=C/u;t=C/t;z=C/z;w=C/w;D[0]=z;D[1]=0;D[2]=-F*z;D[3]=0;D[4]=w;D[5]=-E*w;D[6]=0;D[7]=0;D[8]=1;J[0]=1/u;J[1]=0;J[2]=B;J[3]=0;J[4]=1/t;J[5]=A;J[6]=0;J[7]=0;J[8]=1;L=81;while(--L>=0){M[L]=0;}for(L=0;L<C;++L){H=(r[L].x-B)*u;G=(r[L].y-A)*t;s=(I[L].x-F)*z;q=(I[L].y-E)*w;M[0]+=s*s;M[1]+=s*q;M[2]+=s;M[6]+=s*-H*s;M[7]+=s*-H*q;M[8]+=s*-H;M[10]+=q*q;M[11]+=q;M[15]+=q*-H*s;M[16]+=q*-H*q;M[17]+=q*-H;M[20]+=1;M[24]+=-H*s;M[25]+=-H*q;M[26]+=-H;M[30]+=s*s;M[31]+=s*q;M[32]+=s;M[33]+=s*-G*s;M[34]+=s*-G*q;M[35]+=s*-G;M[40]+=q*q;M[41]+=q;M[42]+=q*-G*s;M[43]+=q*-G*q;M[44]+=q*-G;M[50]+=1;M[51]+=-G*s;M[52]+=-G*q;M[53]+=-G;M[60]+=-H*s*-H*s+-G*s*-G*s;M[61]+=-H*s*-H*q+-G*s*-G*q;M[62]+=-H*s*-H+-G*s*-G;M[70]+=-H*q*-H*q+-G*q*-G*q;M[71]+=-H*q*-H+-G*q*-G;M[80]+=-H*-H+-G*-G;}for(L=0;L<9;++L){for(K=0;K<L;++K){M[L*9+K]=M[K*9+L];}}jsfeat.linalg.eigenVV(g,f);O[0]=N[72],O[1]=N[73],O[2]=N[74];O[3]=N[75],O[4]=N[76],O[5]=N[77];O[6]=N[78],O[7]=N[79],O[8]=N[80];jsfeat.matmath.multiply_3x3(v,i,v);jsfeat.matmath.multiply_3x3(v,v,k);H=1/O[8];O[0]*=H;O[1]*=H;O[2]*=H;O[3]*=H;O[4]*=H;O[5]*=H;O[6]*=H;O[7]*=H;O[8]=1;return 1};p.prototype.error=function(w,x,u,r,v){var t=0;var z,y,s=0,B=0,A=0;var q=u.data;for(;t<v;++t){z=w[t];y=x[t];s=1/(q[6]*z.x+q[7]*z.y+1);B=(q[0]*z.x+q[1]*z.y+q[2])*s-y.x;A=(q[3]*z.x+q[4]*z.y+q[5])*s-y.y;r[t]=(B*B+A*A);}};p.prototype.check_subset=function(M,s,B){if(B==4){var N=0;var I=M[0],H=M[1],G=M[2],E=M[3];var A=s[0],y=s[1],w=s[2],u=s[3];var L=I.x,K=I.y,J=1;var V=H.x,U=H.y,T=1;var z=G.x,x=G.y,v=1;var t=A.x,r=A.y,q=1;var F=y.x,D=y.y,C=1;var Q=w.x,P=w.y,O=1;var S=jsfeat.matmath.determinant_3x3(L,K,J,V,U,T,z,x,v);var R=jsfeat.matmath.determinant_3x3(t,r,q,F,D,C,Q,P,O);if(S*R<0){N++;}L=H.x,K=H.y;V=G.x,U=G.y;z=E.x,x=E.y;t=y.x,r=y.y;F=w.x,D=w.y;Q=u.x,P=u.y;S=jsfeat.matmath.determinant_3x3(L,K,J,V,U,T,z,x,v);R=jsfeat.matmath.determinant_3x3(t,r,q,F,D,C,Q,P,O);if(S*R<0){N++;}L=I.x,K=I.y;V=G.x,U=G.y;z=E.x,x=E.y;t=A.x,r=A.y;F=w.x,D=w.y;Q=u.x,P=u.y;S=jsfeat.matmath.determinant_3x3(L,K,J,V,U,T,z,x,v);R=jsfeat.matmath.determinant_3x3(t,r,q,F,D,C,Q,P,O);if(S*R<0){N++;}L=I.x,K=I.y;V=H.x,U=H.y;z=E.x,x=E.y;t=A.x,r=A.y;F=y.x,D=y.y;Q=u.x,P=u.y;S=jsfeat.matmath.determinant_3x3(L,K,J,V,U,T,z,x,v);R=jsfeat.matmath.determinant_3x3(t,r,q,F,D,C,Q,P,O);if(S*R<0){N++;}if(N!=0&&N!=4){return false}}return true};return p})();return{affine2d:j,homography2d:l}})();var b=(function(){function e(h,i,f,g){if(typeof h===\"undefined\"){h=0;}if(typeof i===\"undefined\"){i=0.5;}if(typeof f===\"undefined\"){f=0.5;}if(typeof g===\"undefined\"){g=0.99;}this.size=h;this.thresh=i;this.eps=f;this.prob=g;}e.prototype.update_iters=function(g,i){var h=Math.log(1-this.prob);var f=Math.log(1-Math.pow(1-g,this.size));return(f>=0||-h>=i*(-f)?i:Math.round(h/f))|0};return e})();var d=(function(){var e=function(l,q,r,p,t,m,g){var v=1000;var s=[];var n=0,k=0,u=0,h=0,o=false;for(;u<v;++u){n=0;for(;n<p&&u<v;){o=false;h=0;while(!o){o=true;h=s[n]=Math.floor(Math.random()*t)|0;for(k=0;k<n;++k){if(h==s[k]){o=false;break}}}m[n]=q[h];g[n]=r[h];if(!l.check_subset(m,g,n+1)){u++;continue}++n;}break}return(n==p&&u<v)};var f=function(k,m,p,q,o,g,h,s){var j=0,l=0,n=0;var r=g*g;k.error(p,q,m,h,o);for(;l<o;++l){n=h[l]<=r;s[l]=n;j+=n;}return j};return{ransac:function(E,m,x,i,l,j,y,g){if(typeof g===\"undefined\"){g=1000;}if(l<E.size){return false}var v=E.size;var A=g,z=0;var q=false;var D=[];var C=[];var r=false;var G=j.cols,w=j.rows;var u=j.type|jsfeat.C1_t;var B=jsfeat.cache.get_buffer((G*w)<<3);var h=jsfeat.cache.get_buffer(l);var t=jsfeat.cache.get_buffer(l<<2);var o=new jsfeat.matrix_t(G,w,u,B.data);var s=new jsfeat.matrix_t(l,1,jsfeat.U8C1_t,h.data);var F=-1,p=0;var n=0;var k=t.f32;if(l==v){if(m.run(x,i,o,l)<=0){jsfeat.cache.put_buffer(B);jsfeat.cache.put_buffer(h);jsfeat.cache.put_buffer(t);return false}o.copy_to(j);if(y){while(--l>=0){y.data[l]=1;}}jsfeat.cache.put_buffer(B);jsfeat.cache.put_buffer(h);jsfeat.cache.put_buffer(t);return true}for(;z<A;++z){r=e(m,x,i,v,l,D,C);if(!r){if(z==0){jsfeat.cache.put_buffer(B);jsfeat.cache.put_buffer(h);jsfeat.cache.put_buffer(t);return false}break}n=m.run(D,C,o,v);if(n<=0){continue}p=f(m,o,x,i,l,E.thresh,k,s.data);if(p>Math.max(F,v-1)){o.copy_to(j);F=p;if(y){s.copy_to(y);}A=E.update_iters((l-p)/l,A);q=true;}}jsfeat.cache.put_buffer(B);jsfeat.cache.put_buffer(h);jsfeat.cache.put_buffer(t);return q},lmeds:function(H,n,z,i,l,j,B,g){if(typeof g===\"undefined\"){g=1000;}if(l<H.size){return false}var w=H.size;var D=g,C=0;var r=false;var G=[];var F=[];var s=false;var I=j.cols,y=j.rows;var v=j.type|jsfeat.C1_t;var E=jsfeat.cache.get_buffer((I*y)<<3);var h=jsfeat.cache.get_buffer(l);var u=jsfeat.cache.get_buffer(l<<2);var p=new jsfeat.matrix_t(I,y,v,E.data);var t=new jsfeat.matrix_t(l,1,jsfeat.U8_t|jsfeat.C1_t,h.data);var q=0;var o=0;var k=u.f32;var A=1000000000,x=0,m=0;H.eps=0.45;D=H.update_iters(H.eps,D);if(l==w){if(n.run(z,i,p,l)<=0){jsfeat.cache.put_buffer(E);jsfeat.cache.put_buffer(h);jsfeat.cache.put_buffer(u);return false}p.copy_to(j);if(B){while(--l>=0){B.data[l]=1;}}jsfeat.cache.put_buffer(E);jsfeat.cache.put_buffer(h);jsfeat.cache.put_buffer(u);return true}for(;C<D;++C){s=e(n,z,i,w,l,G,F);if(!s){if(C==0){jsfeat.cache.put_buffer(E);jsfeat.cache.put_buffer(h);jsfeat.cache.put_buffer(u);return false}break}o=n.run(G,F,p,w);if(o<=0){continue}n.error(z,i,p,k,l);m=jsfeat.math.median(k,0,l-1);if(m<A){A=m;p.copy_to(j);r=true;}}if(r){x=2.5*1.4826*(1+5/(l-w))*Math.sqrt(A);x=Math.max(x,0.001);q=f(n,j,z,i,l,x,k,t.data);if(B){t.copy_to(B);}r=q>=w;}jsfeat.cache.put_buffer(E);jsfeat.cache.put_buffer(h);jsfeat.cache.put_buffer(u);return r}}})();a.ransac_params_t=b;a.motion_model=c;a.motion_estimator=d;})(jsfeat);(function(b){var a=(function(){var c=function(q,S,O,p){var r=0;var y=q.channel,v=q.cols,J=q.rows;var P=q.data,m=S.data;var I=v/O,H=J/p;var n=(I*H*65536)|0;var x=0,u=0,C=0,A=0,t=0,s=0,G=0,F=0,D=0,B=0;var Q=0,N=0,K=0,o=0,M=0,E=0;var l=jsfeat.cache.get_buffer((O*y)<<2);var g=jsfeat.cache.get_buffer((O*y)<<2);var R=jsfeat.cache.get_buffer((v*2*3)<<2);var L=l.i32;var j=g.i32;var z=R.i32;for(;x<O;x++){D=x*I,B=D+I;t=(D+1-0.000001)|0,s=B|0;t=Math.min(t,v-1);s=Math.min(s,v-1);if(t>D){z[F++]=(x*y)|0;z[F++]=((t-1)*y)|0;z[F++]=((t-D)*256)|0;r++;}for(C=t;C<s;C++){r++;z[F++]=(x*y)|0;z[F++]=(C*y)|0;z[F++]=256;}if(B-s>0.001){r++;z[F++]=(x*y)|0;z[F++]=(s*y)|0;z[F++]=((B-s)*256)|0;}}for(x=0;x<O*y;x++){L[x]=j[x]=0;}u=0;for(A=0;A<J;A++){Q=v*A;for(F=0;F<r;F++){K=z[F*3];t=z[F*3+1];o=z[F*3+2];for(G=0;G<y;G++){L[K+G]+=P[Q+t+G]*o;}}if((u+1)*H<=A+1||A==J-1){M=(Math.max(A+1-(u+1)*H,0)*256)|0;E=256-M;N=O*u;if(M<=0){for(x=0;x<O*y;x++){m[N+x]=Math.min(Math.max((j[x]+L[x]*256)/n,0),255);j[x]=L[x]=0;}}else{for(x=0;x<O*y;x++){m[N+x]=Math.min(Math.max((j[x]+L[x]*E)/n,0),255);j[x]=L[x]*M;L[x]=0;}}u++;}else{for(x=0;x<O*y;x++){j[x]+=L[x]*256;L[x]=0;}}}jsfeat.cache.put_buffer(g);jsfeat.cache.put_buffer(l);jsfeat.cache.put_buffer(R);};var f=function(p,S,N,o){var q=0;var x=p.channel,u=p.cols,I=p.rows;var O=p.data,m=S.data;var H=u/N,G=I/o;var Q=1/(H*G);var v=0,t=0,B=0,z=0,s=0,r=0,F=0,E=0,C=0,A=0;var P=0,M=0,J=0,n=0,L=0,D=0;var l=jsfeat.cache.get_buffer((N*x)<<2);var g=jsfeat.cache.get_buffer((N*x)<<2);var R=jsfeat.cache.get_buffer((u*2*3)<<2);var K=l.f32;var j=g.f32;var y=R.f32;for(;v<N;v++){C=v*H,A=C+H;s=(C+1-0.000001)|0,r=A|0;s=Math.min(s,u-1);r=Math.min(r,u-1);if(s>C){q++;y[E++]=((s-1)*x)|0;y[E++]=(v*x)|0;y[E++]=(s-C)*Q;}for(B=s;B<r;B++){q++;y[E++]=(B*x)|0;y[E++]=(v*x)|0;y[E++]=Q;}if(A-r>0.001){q++;y[E++]=(r*x)|0;y[E++]=(v*x)|0;y[E++]=(A-r)*Q;}}for(v=0;v<N*x;v++){K[v]=j[v]=0;}t=0;for(z=0;z<I;z++){P=u*z;for(E=0;E<q;E++){s=y[E*3]|0;J=y[E*3+1]|0;n=y[E*3+2];for(F=0;F<x;F++){K[J+F]+=O[P+s+F]*n;}}if((t+1)*G<=z+1||z==I-1){L=Math.max(z+1-(t+1)*G,0);D=1-L;M=N*t;if(Math.abs(L)<0.001){for(v=0;v<N*x;v++){m[M+v]=j[v]+K[v];j[v]=K[v]=0;}}else{for(v=0;v<N*x;v++){m[M+v]=j[v]+K[v]*D;j[v]=K[v]*L;K[v]=0;}}t++;}else{for(v=0;v<N*x;v++){j[v]+=K[v];K[v]=0;}}}jsfeat.cache.put_buffer(g);jsfeat.cache.put_buffer(l);jsfeat.cache.put_buffer(R);};var e=function(D,F,m,s,B,t,g,n){var z=0,y=0,x=0,A=0,u=0,l=0,G=0,E=0,C=0,v=t[0],r=0;var q=s<<1,p=s*3,o=s<<2;for(;z<B;++z){l=F[A];for(y=0;y<n;++y){D[y]=l;}for(y=0;y<=s-2;y+=2){D[y+n]=F[A+y];D[y+n+1]=F[A+y+1];}for(;y<s;++y){D[y+n]=F[A+y];}l=F[A+s-1];for(y=s;y<n+s;++y){D[y+n]=l;}for(y=0;y<=s-4;y+=4){l=D[y]*v,G=D[y+1]*v,E=D[y+2]*v,C=D[y+3]*v;for(x=1;x<g;++x){r=t[x];l+=D[x+y]*r;G+=D[x+y+1]*r;E+=D[x+y+2]*r;C+=D[x+y+3]*r;}m[u+y]=Math.min(l>>8,255);m[u+y+1]=Math.min(G>>8,255);m[u+y+2]=Math.min(E>>8,255);m[u+y+3]=Math.min(C>>8,255);}for(;y<s;++y){l=D[y]*v;for(x=1;x<g;++x){l+=D[x+y]*t[x];}m[u+y]=Math.min(l>>8,255);}A+=s;u+=s;}for(z=0;z<s;++z){l=m[z];for(y=0;y<n;++y){D[y]=l;}x=z;for(y=0;y<=B-2;y+=2,x+=q){D[y+n]=m[x];D[y+n+1]=m[x+s];}for(;y<B;++y,x+=s){D[y+n]=m[x];}l=m[(B-1)*s+z];for(y=B;y<n+B;++y){D[y+n]=l;}u=z;for(y=0;y<=B-4;y+=4,u+=o){l=D[y]*v,G=D[y+1]*v,E=D[y+2]*v,C=D[y+3]*v;for(x=1;x<g;++x){r=t[x];l+=D[x+y]*r;G+=D[x+y+1]*r;E+=D[x+y+2]*r;C+=D[x+y+3]*r;}m[u]=Math.min(l>>8,255);m[u+s]=Math.min(G>>8,255);m[u+q]=Math.min(E>>8,255);m[u+p]=Math.min(C>>8,255);}for(;y<B;++y,u+=s){l=D[y]*v;for(x=1;x<g;++x){l+=D[x+y]*t[x];}m[u]=Math.min(l>>8,255);}}};var d=function(D,F,m,s,B,t,g,n){var z=0,y=0,x=0,A=0,u=0,l=0,G=0,E=0,C=0,v=t[0],r=0;var q=s<<1,p=s*3,o=s<<2;for(;z<B;++z){l=F[A];for(y=0;y<n;++y){D[y]=l;}for(y=0;y<=s-2;y+=2){D[y+n]=F[A+y];D[y+n+1]=F[A+y+1];}for(;y<s;++y){D[y+n]=F[A+y];}l=F[A+s-1];for(y=s;y<n+s;++y){D[y+n]=l;}for(y=0;y<=s-4;y+=4){l=D[y]*v,G=D[y+1]*v,E=D[y+2]*v,C=D[y+3]*v;for(x=1;x<g;++x){r=t[x];l+=D[x+y]*r;G+=D[x+y+1]*r;E+=D[x+y+2]*r;C+=D[x+y+3]*r;}m[u+y]=l;m[u+y+1]=G;m[u+y+2]=E;m[u+y+3]=C;}for(;y<s;++y){l=D[y]*v;for(x=1;x<g;++x){l+=D[x+y]*t[x];}m[u+y]=l;}A+=s;u+=s;}for(z=0;z<s;++z){l=m[z];for(y=0;y<n;++y){D[y]=l;}x=z;for(y=0;y<=B-2;y+=2,x+=q){D[y+n]=m[x];D[y+n+1]=m[x+s];}for(;y<B;++y,x+=s){D[y+n]=m[x];}l=m[(B-1)*s+z];for(y=B;y<n+B;++y){D[y+n]=l;}u=z;for(y=0;y<=B-4;y+=4,u+=o){l=D[y]*v,G=D[y+1]*v,E=D[y+2]*v,C=D[y+3]*v;for(x=1;x<g;++x){r=t[x];l+=D[x+y]*r;G+=D[x+y+1]*r;E+=D[x+y+2]*r;C+=D[x+y+3]*r;}m[u]=l;m[u+s]=G;m[u+q]=E;m[u+p]=C;}for(;y<B;++y,u+=s){l=D[y]*v;for(x=1;x<g;++x){l+=D[x+y]*t[x];}m[u]=l;}}};return{grayscale:function(n,r,A,D,g){if(typeof g===\"undefined\"){g=jsfeat.COLOR_RGBA2GRAY;}var q=0,p=0,z=0,v=0,m=0,u=0;var s=4899,B=9617,C=1868,o=4;if(g==jsfeat.COLOR_BGRA2GRAY||g==jsfeat.COLOR_BGR2GRAY){s=1868;C=4899;}if(g==jsfeat.COLOR_RGB2GRAY||g==jsfeat.COLOR_BGR2GRAY){o=3;}var l=o<<1,k=(o*3)|0;D.resize(r,A,1);var t=D.data;for(p=0;p<A;++p,v+=r,z+=r*o){for(q=0,m=z,u=v;q<=r-4;q+=4,m+=o<<2,u+=4){t[u]=(n[m]*s+n[m+1]*B+n[m+2]*C+8192)>>14;t[u+1]=(n[m+o]*s+n[m+o+1]*B+n[m+o+2]*C+8192)>>14;t[u+2]=(n[m+l]*s+n[m+l+1]*B+n[m+l+2]*C+8192)>>14;t[u+3]=(n[m+k]*s+n[m+k+1]*B+n[m+k+2]*C+8192)>>14;}for(;q<r;++q,++u,m+=o){t[u]=(n[m]*s+n[m+1]*B+n[m+2]*C+8192)>>14;}}},resample:function(l,m,i,k){var j=l.rows,g=l.cols;if(j>k&&g>i){m.resize(i,k,l.channel);if(l.type&jsfeat.U8_t&&m.type&jsfeat.U8_t&&j*g/(k*i)<256){c(l,m,i,k);}else{f(l,m,i,k);}}},box_blur_gray:function(r,J,n,l){if(typeof l===\"undefined\"){l=0;}var z=r.cols,E=r.rows,s=E<<1,v=z<<1;var D=0,u=0,t=0,m=0;var B=((n<<1)+1)|0;var p=(n+1)|0,H=(p+1)|0;var I=l&jsfeat.BOX_BLUR_NOSCALE?1:(1/(B*B));var C=jsfeat.cache.get_buffer((z*E)<<2);var j=0,G=0,o=0,q=0,k=0;var F=C.i32;var g=r.data;var A=0;J.resize(z,E,r.channel);for(t=0;t<E;++t){G=t;j=p*g[o];for(D=(o+1)|0,m=(o+n)|0;D<=m;++D){j+=g[D];}q=(o+p)|0;k=o;A=g[k];for(u=0;u<n;++u,G+=E){F[G]=j;j+=g[q]-A;q++;}for(;u<z-H;u+=2,G+=s){F[G]=j;j+=g[q]-g[k];F[G+E]=j;j+=g[q+1]-g[k+1];q+=2;k+=2;}for(;u<z-p;++u,G+=E){F[G]=j;j+=g[q]-g[k];q++;k++;}A=g[q-1];for(;u<z;++u,G+=E){F[G]=j;j+=A-g[k];k++;}o+=z;}o=0;g=J.data;if(I==1){for(t=0;t<z;++t){G=t;j=p*F[o];for(D=(o+1)|0,m=(o+n)|0;D<=m;++D){j+=F[D];}q=o+p;k=o;A=F[k];for(u=0;u<n;++u,G+=z){g[G]=j;j+=F[q]-A;q++;}for(;u<E-H;u+=2,G+=v){g[G]=j;j+=F[q]-F[k];g[G+z]=j;j+=F[q+1]-F[k+1];q+=2;k+=2;}for(;u<E-p;++u,G+=z){g[G]=j;j+=F[q]-F[k];q++;k++;}A=F[q-1];for(;u<E;++u,G+=z){g[G]=j;j+=A-F[k];k++;}o+=E;}}else{for(t=0;t<z;++t){G=t;j=p*F[o];for(D=(o+1)|0,m=(o+n)|0;D<=m;++D){j+=F[D];}q=o+p;k=o;A=F[k];for(u=0;u<n;++u,G+=z){g[G]=j*I;j+=F[q]-A;q++;}for(;u<E-H;u+=2,G+=v){g[G]=j*I;j+=F[q]-F[k];g[G+z]=j*I;j+=F[q+1]-F[k+1];q+=2;k+=2;}for(;u<E-p;++u,G+=z){g[G]=j*I;j+=F[q]-F[k];q++;k++;}A=F[q-1];for(;u<E;++u,G+=z){g[G]=j*I;j+=A-F[k];k++;}o+=E;}}jsfeat.cache.put_buffer(C);},gaussian_blur:function(g,s,r,v){if(typeof v===\"undefined\"){v=0;}if(typeof r===\"undefined\"){r=0;}r=r==0?(Math.max(1,(4*v+1-1e-8))*2+1)|0:r;var x=r>>1;var t=g.cols,p=g.rows;var u=g.type,n=u&jsfeat.U8_t;s.resize(t,p,g.channel);var m=g.data,j=s.data;var k,i,q=(r+Math.max(p,t))|0;var l=jsfeat.cache.get_buffer(q<<2);var o=jsfeat.cache.get_buffer(r<<2);if(n){k=l.i32;i=o.i32;}else{if(u&jsfeat.S32_t){k=l.i32;i=o.f32;}else{k=l.f32;i=o.f32;}}jsfeat.math.get_gaussian_kernel(r,v,i,u);if(n){e(k,m,j,t,p,i,r,x);}else{d(k,m,j,t,p,i,r,x);}jsfeat.cache.put_buffer(l);jsfeat.cache.put_buffer(o);},pyrdown:function(k,A,s,r){if(typeof s===\"undefined\"){s=0;}if(typeof r===\"undefined\"){r=0;}var q=k.cols,t=k.rows;var p=q>>1,l=t>>1;var B=p-(s<<1),u=l-(r<<1);var o=0,n=0,g=s+r*q,m=0,v=0,i=0;A.resize(p,l,k.channel);var z=k.data,j=A.data;for(n=0;n<u;++n){m=g;i=v;for(o=0;o<=B-2;o+=2,i+=2,m+=4){j[i]=(z[m]+z[m+1]+z[m+q]+z[m+q+1]+2)>>2;j[i+1]=(z[m+2]+z[m+3]+z[m+q+2]+z[m+q+3]+2)>>2;}for(;o<B;++o,++i,m+=2){j[i]=(z[m]+z[m+1]+z[m+q]+z[m+q+1]+2)>>2;}g+=q<<1;v+=p;}},scharr_derivatives:function(j,G){var p=j.cols,s=j.rows;var H=p<<1,o=0,m=0,u=0,E,D,C,B,A,z;var v=0,t=0,r=0,i=0;var n,l;G.resize(p,s,2);var F=j.data,g=G.data;var k=jsfeat.cache.get_buffer((p+2)<<2);var q=jsfeat.cache.get_buffer((p+2)<<2);if(j.type&jsfeat.U8_t||j.type&jsfeat.S32_t){n=k.i32;l=q.i32;}else{n=k.f32;l=q.f32;}for(;m<s;++m,t+=p){v=((m>0?m-1:1)*p)|0;r=((m<s-1?m+1:s-2)*p)|0;i=(m*H)|0;for(o=0,u=1;o<=p-2;o+=2,u+=2){E=F[v+o],D=F[r+o];n[u]=((E+D)*3+(F[t+o])*10);l[u]=(D-E);E=F[v+o+1],D=F[r+o+1];n[u+1]=((E+D)*3+(F[t+o+1])*10);l[u+1]=(D-E);}for(;o<p;++o,++u){E=F[v+o],D=F[r+o];n[u]=((E+D)*3+(F[t+o])*10);l[u]=(D-E);}o=(p+1)|0;n[0]=n[1];n[o]=n[p];l[0]=l[1];l[o]=l[p];for(o=0;o<=p-4;o+=4){E=l[o+2],D=l[o+1],C=l[o+3],B=l[o+4],A=n[o+2],z=n[o+3];g[i++]=(A-n[o]);g[i++]=((E+l[o])*3+D*10);g[i++]=(z-n[o+1]);g[i++]=((C+D)*3+E*10);g[i++]=((n[o+4]-A));g[i++]=(((B+E)*3+C*10));g[i++]=((n[o+5]-z));g[i++]=(((l[o+5]+C)*3+B*10));}for(;o<p;++o){g[i++]=((n[o+2]-n[o]));g[i++]=(((l[o+2]+l[o])*3+l[o+1]*10));}}jsfeat.cache.put_buffer(k);jsfeat.cache.put_buffer(q);},sobel_derivatives:function(j,G){var p=j.cols,s=j.rows;var H=p<<1,o=0,m=0,u=0,E,D,C,B,A,z;var v=0,t=0,r=0,i=0;var n,l;G.resize(p,s,2);var F=j.data,g=G.data;var k=jsfeat.cache.get_buffer((p+2)<<2);var q=jsfeat.cache.get_buffer((p+2)<<2);if(j.type&jsfeat.U8_t||j.type&jsfeat.S32_t){n=k.i32;l=q.i32;}else{n=k.f32;l=q.f32;}for(;m<s;++m,t+=p){v=((m>0?m-1:1)*p)|0;r=((m<s-1?m+1:s-2)*p)|0;i=(m*H)|0;for(o=0,u=1;o<=p-2;o+=2,u+=2){E=F[v+o],D=F[r+o];n[u]=((E+D)+(F[t+o]*2));l[u]=(D-E);E=F[v+o+1],D=F[r+o+1];n[u+1]=((E+D)+(F[t+o+1]*2));l[u+1]=(D-E);}for(;o<p;++o,++u){E=F[v+o],D=F[r+o];n[u]=((E+D)+(F[t+o]*2));l[u]=(D-E);}o=(p+1)|0;n[0]=n[1];n[o]=n[p];l[0]=l[1];l[o]=l[p];for(o=0;o<=p-4;o+=4){E=l[o+2],D=l[o+1],C=l[o+3],B=l[o+4],A=n[o+2],z=n[o+3];g[i++]=(A-n[o]);g[i++]=(E+l[o]+D*2);g[i++]=(z-n[o+1]);g[i++]=(C+D+E*2);g[i++]=(n[o+4]-A);g[i++]=(B+E+C*2);g[i++]=(n[o+5]-z);g[i++]=(l[o+5]+C+B*2);}for(;o<p;++o){g[i++]=(n[o+2]-n[o]);g[i++]=(l[o+2]+l[o]+l[o+1]*2);}}jsfeat.cache.put_buffer(k);jsfeat.cache.put_buffer(q);},compute_integral_image:function(g,l,y,u){var t=g.cols|0,w=g.rows|0,o=g.data;var r=(t+1)|0;var B=0,z=0,h=0,x=0,q=0,n=0,A=0,m=0;if(l&&y){for(;q<r;++q){l[q]=0,y[q]=0;}h=(r+1)|0,x=1;for(q=0,m=0;q<w;++q,++h,++x){B=z=0;for(n=0;n<=t-2;n+=2,m+=2,h+=2,x+=2){A=o[m];B+=A,z+=A*A;l[h]=l[x]+B;y[h]=y[x]+z;A=o[m+1];B+=A,z+=A*A;l[h+1]=l[x+1]+B;y[h+1]=y[x+1]+z;}for(;n<t;++n,++m,++h,++x){A=o[m];B+=A,z+=A*A;l[h]=l[x]+B;y[h]=y[x]+z;}}}else{if(l){for(;q<r;++q){l[q]=0;}h=(r+1)|0,x=1;for(q=0,m=0;q<w;++q,++h,++x){B=0;for(n=0;n<=t-2;n+=2,m+=2,h+=2,x+=2){B+=o[m];l[h]=l[x]+B;B+=o[m+1];l[h+1]=l[x+1]+B;}for(;n<t;++n,++m,++h,++x){B+=o[m];l[h]=l[x]+B;}}}else{if(y){for(;q<r;++q){y[q]=0;}h=(r+1)|0,x=1;for(q=0,m=0;q<w;++q,++h,++x){z=0;for(n=0;n<=t-2;n+=2,m+=2,h+=2,x+=2){A=o[m];z+=A*A;y[h]=y[x]+z;A=o[m+1];z+=A*A;y[h+1]=y[x+1]+z;}for(;n<t;++n,++m,++h,++x){A=o[m];z+=A*A;y[h]=y[x]+z;}}}}}if(u){for(q=0;q<r;++q){u[q]=0;}h=(r+1)|0,x=0;for(q=0,m=0;q<w;++q,++h,++x){for(n=0;n<=t-2;n+=2,m+=2,h+=2,x+=2){u[h]=o[m]+u[x];u[h+1]=o[m+1]+u[x+1];}for(;n<t;++n,++m,++h,++x){u[h]=o[m]+u[x];}}h=(r+t)|0,x=t;for(q=0;q<w;++q,h+=r,x+=r){u[h]+=u[x];}for(n=t-1;n>0;--n){h=n+w*r,x=h-r;for(q=w;q>0;--q,h-=r,x-=r){u[h]+=u[x]+u[x+1];}}}},equalize_histogram:function(j,r){var s=j.cols,q=j.rows,o=j.data;r.resize(s,q,j.channel);var l=r.data,t=s*q;var p=0,n=0,k,g;var m=jsfeat.cache.get_buffer(256<<2);k=m.i32;for(;p<256;++p){k[p]=0;}for(p=0;p<t;++p){++k[o[p]];}n=k[0];for(p=1;p<256;++p){n=k[p]+=n;}g=255/t;for(p=0;p<t;++p){l[p]=(k[o[p]]*g+0.5)|0;}jsfeat.cache.put_buffer(m);},canny:function(u,V,E,k){var C=u.cols,L=u.rows,S=u.data;V.resize(C,L,u.channel);var o=V.data;var K=0,H=0,q=0,A=C<<1,R=0,J=0,N=0,z=0,v=0,D=0;var g=0,U=0;var p=jsfeat.cache.get_buffer((L*A)<<2);var m=jsfeat.cache.get_buffer((3*(C+2))<<2);var n=jsfeat.cache.get_buffer(((L+2)*(C+2))<<2);var t=jsfeat.cache.get_buffer((L*C)<<2);var Q=m.i32;var T=n.i32;var r=t.i32;var G=p.i32;var l=new jsfeat.matrix_t(C,L,jsfeat.S32C2_t,p.data);var P=1,O=(C+2+1)|0,M=(2*(C+2)+1)|0,B=(C+2)|0,I=(B+1)|0,F=0;this.sobel_derivatives(u,l);if(E>k){K=E;E=k;k=K;}K=(3*(C+2))|0;while(--K>=0){Q[K]=0;}K=((L+2)*(C+2))|0;while(--K>=0){T[K]=0;}for(;H<C;++H,q+=2){z=G[q],v=G[q+1];Q[O+H]=((z^(z>>31))-(z>>31))+((v^(v>>31))-(v>>31));}for(K=1;K<=L;++K,q+=A){if(K==L){H=M+C;while(--H>=M){Q[H]=0;}}else{for(H=0;H<C;H++){z=G[q+(H<<1)],v=G[q+(H<<1)+1];Q[M+H]=((z^(z>>31))-(z>>31))+((v^(v>>31))-(v>>31));}}R=(q-A)|0;T[I-1]=0;J=0;for(H=0;H<C;++H,R+=2){N=Q[O+H];if(N>E){z=G[R];v=G[R+1];D=z^v;z=((z^(z>>31))-(z>>31))|0;v=((v^(v>>31))-(v>>31))|0;g=z*13573;U=g+((z+z)<<15);v<<=15;if(v<g){if(N>Q[O+H-1]&&N>=Q[O+H+1]){if(N>k&&!J&&T[I+H-B]!=2){T[I+H]=2;J=1;r[F++]=I+H;}else{T[I+H]=1;}continue}}else{if(v>U){if(N>Q[P+H]&&N>=Q[M+H]){if(N>k&&!J&&T[I+H-B]!=2){T[I+H]=2;J=1;r[F++]=I+H;}else{T[I+H]=1;}continue}}else{D=D<0?-1:1;if(N>Q[P+H-D]&&N>Q[M+H+D]){if(N>k&&!J&&T[I+H-B]!=2){T[I+H]=2;J=1;r[F++]=I+H;}else{T[I+H]=1;}continue}}}}T[I+H]=0;J=0;}T[I+C]=0;I+=B;H=P;P=O;O=M;M=H;}H=I-B-1;for(K=0;K<B;++K,++H){T[H]=0;}while(F>0){I=r[--F];I-=B+1;if(T[I]==1){T[I]=2,r[F++]=I;}I+=1;if(T[I]==1){T[I]=2,r[F++]=I;}I+=1;if(T[I]==1){T[I]=2,r[F++]=I;}I+=B;if(T[I]==1){T[I]=2,r[F++]=I;}I-=2;if(T[I]==1){T[I]=2,r[F++]=I;}I+=B;if(T[I]==1){T[I]=2,r[F++]=I;}I+=1;if(T[I]==1){T[I]=2,r[F++]=I;}I+=1;if(T[I]==1){T[I]=2,r[F++]=I;}}I=B+1;P=0;for(K=0;K<L;++K,I+=B){for(H=0;H<C;++H){o[P++]=(T[I+H]==2)*255;}}jsfeat.cache.put_buffer(p);jsfeat.cache.put_buffer(m);jsfeat.cache.put_buffer(n);jsfeat.cache.put_buffer(t);},warp_perspective:function(t,D,A,r){if(typeof r===\"undefined\"){r=0;}var l=t.cols|0,v=t.rows|0,L=D.cols|0,j=D.rows|0;var H=t.data,q=D.data;var F=0,E=0,G=0,u=0,k=0,C=0,p=0,h=0,O=0,P=0,s=0,R=0,Q=0,N=0,M=0;var i=A.data;var o=i[0],n=i[1],m=i[2],K=i[3],J=i[4],I=i[5],B=i[6],z=i[7],w=i[8];for(var g=0;E<j;++E){h=n*E+m,O=J*E+I,P=z*E+w;for(F=0;F<L;++F,++g,h+=o,O+=K,P+=B){s=1/P;C=h*s,p=O*s;u=C|0,k=p|0;if(C>0&&p>0&&u<(l-1)&&k<(v-1)){R=Math.max(C-u,0);Q=Math.max(p-k,0);G=(l*k+u)|0;N=H[G]+R*(H[G+1]-H[G]);M=H[G+l]+R*(H[G+l+1]-H[G+l]);q[g]=N+Q*(M-N);}else{q[g]=r;}}}},warp_affine:function(k,K,p,J){if(typeof J===\"undefined\"){J=0;}var u=k.cols,z=k.rows,j=K.cols,v=K.rows;var E=k.data,i=K.data;var o=0,n=0,I=0,q=0,A=0,m=0,w=0,G=0,D=0,h=0,g=0;var l=p.data;var t=l[0],s=l[1],r=l[2],H=l[3],F=l[4],C=l[5];for(var B=0;n<v;++n){m=s*n+r;w=F*n+C;for(o=0;o<j;++o,++B,m+=t,w+=H){q=m|0;A=w|0;if(q>=0&&A>=0&&q<(u-1)&&A<(z-1)){G=m-q;D=w-A;I=u*A+q;h=E[I]+G*(E[I+1]-E[I]);g=E[I+u]+G*(E[I+u+1]-E[I+u]);i[B]=h+D*(g-h);}else{i[B]=J;}}}},skindetector:function(o,p){var n,m,h,k;var l=o.width*o.height;while(l--){k=l*4;n=o.data[k];m=o.data[k+1];h=o.data[k+2];if((n>95)&&(m>40)&&(h>20)&&(n>m)&&(n>h)&&(n-Math.min(m,h)>15)&&(Math.abs(n-m)>15)){p[l]=255;}else{p[l]=0;}}}}})();b.imgproc=a;})(jsfeat);(function(a){var b=(function(){var h=new Int32Array([0,3,1,3,2,2,3,1,3,0,3,-1,2,-2,1,-3,0,-3,-1,-3,-2,-2,-3,-1,-3,0,-3,1,-2,2,-1,3]);var f=new Uint8Array(512);var e=new Int32Array(25);var i=new Int32Array(25);var d=function(l,n,o){var j=0;var m=h;for(;j<o;++j){l[j]=m[j<<1]+m[(j<<1)+1]*n;}for(;j<25;++j){l[j]=l[j-o];}},g=function(j,n,l,r,p){var q=25,o=0,w=j[n];var m=p,t=0,u=0,s=0;for(;o<q;++o){r[o]=w-j[n+l[o]];}for(o=0;o<16;o+=2){t=Math.min(r[o+1],r[o+2]);t=Math.min(t,r[o+3]);if(t<=m){continue}t=Math.min(t,r[o+4]);t=Math.min(t,r[o+5]);t=Math.min(t,r[o+6]);t=Math.min(t,r[o+7]);t=Math.min(t,r[o+8]);m=Math.max(m,Math.min(t,r[o]));m=Math.max(m,Math.min(t,r[o+9]));}u=-m;for(o=0;o<16;o+=2){s=Math.max(r[o+1],r[o+2]);s=Math.max(s,r[o+3]);s=Math.max(s,r[o+4]);s=Math.max(s,r[o+5]);if(s>=u){continue}s=Math.max(s,r[o+6]);s=Math.max(s,r[o+7]);s=Math.max(s,r[o+8]);u=Math.min(u,Math.max(s,r[o]));u=Math.min(u,Math.max(s,r[o+9]));}return -u-1};var c=20;return{set_threshold:function(j){c=Math.min(Math.max(j,0),255);for(var k=-255;k<=255;++k){f[(k+255)]=(k<-c?1:(k>c?2:0));}return c},detect:function(L,H,D){if(typeof D===\"undefined\"){D=3;}var A=8,t=25;var u=L.data,X=L.cols,ar=L.rows;var ap=0,an=0,al=0,E=0,W=0,aq=0;var B=jsfeat.cache.get_buffer(3*X);var O=jsfeat.cache.get_buffer(((X+1)*3)<<2);var I=B.u8;var F=O.i32;var M=e;var J=i;var y=Math.max(3,D);var Z=Math.min((ar-2),(ar-D));var z=Math.max(3,D);var aa=Math.min((X-3),(X-D));var ah=0,P=0,C;var Q=g;var G=f;var p=c;var Y=0,ao=0,au=0,aw=0,U=0,V=0,av=0,R=0,at=0;var T=0,S=0,o=0;d(M,X,16);var am=M[0];var ak=M[1];var aj=M[2];var ai=M[3];var ag=M[4];var af=M[5];var ae=M[6];var ad=M[7];var ac=M[8];var ab=M[9];var s=M[10];var r=M[11];var q=M[12];var n=M[13];var m=M[14];var l=M[15];for(ap=0;ap<X*3;++ap){I[ap]=0;}for(ap=y;ap<Z;++ap){av=((ap*X)+z)|0;aq=(ap-3)%3;V=(aq*X)|0;U=(aq*(X+1))|0;for(an=0;an<X;++an){I[V+an]=0;}aw=0;if(ap<(Z-1)){an=z;for(;an<aa;++an,++av){Y=u[av];ao=(-Y+255);au=(G[ao+u[av+am]]|G[ao+u[av+ac]]);if(au==0){continue}au&=(G[ao+u[av+aj]]|G[ao+u[av+s]]);au&=(G[ao+u[av+ag]]|G[ao+u[av+q]]);au&=(G[ao+u[av+ae]]|G[ao+u[av+m]]);if(au==0){continue}au&=(G[ao+u[av+ak]]|G[ao+u[av+ab]]);au&=(G[ao+u[av+ai]]|G[ao+u[av+r]]);au&=(G[ao+u[av+af]]|G[ao+u[av+n]]);au&=(G[ao+u[av+ad]]|G[ao+u[av+l]]);if(au&1){E=(Y-p);ah=0;for(al=0;al<t;++al){W=u[(av+M[al])];if(W<E){++ah;if(ah>A){++aw;F[U+aw]=an;I[V+an]=Q(u,av,M,J,p);break}}else{ah=0;}}}if(au&2){E=(Y+p);ah=0;for(al=0;al<t;++al){W=u[(av+M[al])];if(W>E){++ah;if(ah>A){++aw;F[U+aw]=an;I[V+an]=Q(u,av,M,J,p);break}}else{ah=0;}}}}}F[U+X]=aw;if(ap==y){continue}aq=(ap-4+3)%3;R=(aq*X)|0;U=(aq*(X+1))|0;aq=(ap-5+3)%3;at=(aq*X)|0;aw=F[U+X];for(al=0;al<aw;++al){an=F[U+al];T=(an+1)|0;S=(an-1)|0;o=I[R+an];if((o>I[R+T]&&o>I[R+S]&&o>I[at+S]&&o>I[at+an]&&o>I[at+T]&&o>I[V+S]&&o>I[V+an]&&o>I[V+T])){C=H[P];C.x=an,C.y=(ap-1),C.score=o;P++;}}}jsfeat.cache.put_buffer(B);jsfeat.cache.put_buffer(O);return P}}})();a.fast_corners=b;b.set_threshold(20);})(jsfeat);(function(b){var a=(function(){var d=function(e,l,q,i,r,g,p,n,k,j){var m=0,o=0,f=(n*q+p)|0,s=f;for(m=n;m<j;++m,f+=q,s=f){for(o=p;o<k;++o,++s){l[s]=-4*e[s]+e[s+r]+e[s-r]+e[s+g]+e[s-g];}}};var c=function(e,f,k,m,g,l,h){var o=-2*e[f]+e[f+m]+e[f-m];var i=-2*e[f]+e[f+g]+e[f-g];var n=e[f+l]+e[f-l]-e[f+h]-e[f-h];var j=(Math.sqrt(((o-i)*(o-i)+4*n*n)))|0;return Math.min(Math.abs(k-j),Math.abs(-(k+j)))};return{laplacian_threshold:30,min_eigen_value_threshold:25,detect:function(l,A,z){if(typeof z===\"undefined\"){z=5;}var o=0,n=0;var p=l.cols,B=l.rows,q=l.data;var H=5,f=(5*p)|0;var G=(3+3*p)|0,g=(3-3*p)|0;var e=jsfeat.cache.get_buffer((p*B)<<2);var j=e.i32;var i=0,k=0,m=0,r=0,v;var u=0;var F=this.laplacian_threshold;var D=this.min_eigen_value_threshold;var t=Math.max(5,z)|0;var s=Math.max(3,z)|0;var E=Math.min(p-5,p-z)|0;var C=Math.min(B-3,B-z)|0;o=p*B;while(--o>=0){j[o]=0;}d(q,j,p,B,H,f,t,s,E,C);k=(s*p+t)|0;for(n=s;n<C;++n,k+=p){for(o=t,m=k;o<E;++o,++m){i=j[m];if((i<-F&&i<j[m-1]&&i<j[m+1]&&i<j[m-p]&&i<j[m+p]&&i<j[m-p-1]&&i<j[m+p-1]&&i<j[m-p+1]&&i<j[m+p+1])||(i>F&&i>j[m-1]&&i>j[m+1]&&i>j[m-p]&&i>j[m+p]&&i>j[m-p-1]&&i>j[m+p-1]&&i>j[m-p+1]&&i>j[m+p+1])){r=c(q,m,i,H,f,G,g);if(r>D){v=A[u];v.x=o,v.y=n,v.score=r;++u;++o,++m;}}}}jsfeat.cache.put_buffer(e);return u}}})();b.yape06=a;})(jsfeat);(function(a){var b=(function(){var d=function(l,m,k){var j=0;var h,n;h=k;for(n=0;n<h;n++,j++){h=(Math.sqrt((k*k-n*n))+0.5)|0;m[j]=(h+l*n);}for(h--;h<n&&h>=0;h--,j++){n=(Math.sqrt((k*k-h*h))+0.5)|0;m[j]=(h+l*n);}for(;-h<n;h--,j++){n=(Math.sqrt((k*k-h*h))+0.5)|0;m[j]=(h+l*n);}for(n--;n>=0;n--,j++){h=(-Math.sqrt((k*k-n*n))-0.5)|0;m[j]=(h+l*n);}for(;n>h;n--,j++){h=(-Math.sqrt((k*k-n*n))-0.5)|0;m[j]=(h+l*n);}for(h++;h<=0;h++,j++){n=(-Math.sqrt((k*k-h*h))-0.5)|0;m[j]=(h+l*n);}for(;h<-n;h++,j++){n=(-Math.sqrt((k*k-h*h))-0.5)|0;m[j]=(h+l*n);}for(n++;n<0;n++,j++){h=(Math.sqrt((k*k-n*n))+0.5)|0;m[j]=(h+l*n);}m[j]=m[0];m[j+1]=m[1];return j};var g=function(h,j,i){var k=0;if(h[j+1]!=0){k++;}if(h[j-1]!=0){k++;}if(h[j+i]!=0){k++;}if(h[j+i+1]!=0){k++;}if(h[j+i-1]!=0){k++;}if(h[j-i]!=0){k++;}if(h[j-i+1]!=0){k++;}if(h[j-i-1]!=0){k++;}return k};var c=function(l,m,i,k,j){var h,n;if(i>0){m-=k*j;for(n=-j;n<=j;++n){for(h=-j;h<=j;++h){if(l[m+h]>i){return false}}m+=k;}}else{m-=k*j;for(n=-j;n<=j;++n){for(h=-j;h<=j;++h){if(l[m+h]<i){return false}}m+=k;}}return true};var e=function(s,r,m,u,p,i,l,n){var k=0;var q=0,o=(l-1)|0;var j=0,w=0,v=0,t=0;var h=0;j=s[r+i[q]];if((j<=p)){if((j>=u)){w=s[r+i[o]];if((w<=p)){if((w>=u)){m[r]=0;return}else{o++;v=s[r+i[o]];if((v>p)){o++;t=s[r+i[o]];if((t>p)){h=3;}else{if((t<u)){h=6;}else{m[r]=0;return}}}else{o++;t=s[r+i[o]];if((t>p)){h=7;}else{if((t<u)){h=2;}else{m[r]=0;return}}}}}else{o++;v=s[r+i[o]];if((v>p)){o++;t=s[r+i[o]];if((t>p)){h=3;}else{if((t<u)){h=6;}else{m[r]=0;return}}}else{if((v<u)){o++;t=s[r+i[o]];if((t>p)){h=7;}else{if((t<u)){h=2;}else{m[r]=0;return}}}else{m[r]=0;return}}}}else{w=s[r+i[o]];if((w>p)){m[r]=0;return}o++;v=s[r+i[o]];if((v>p)){m[r]=0;return}o++;t=s[r+i[o]];if((t>p)){m[r]=0;return}h=1;}}else{w=s[r+i[o]];if((w<u)){m[r]=0;return}o++;v=s[r+i[o]];if((v<u)){m[r]=0;return}o++;t=s[r+i[o]];if((t<u)){m[r]=0;return}h=0;}for(q=1;q<=l;q++){j=s[r+i[q]];switch(h){case 0:if((j>p)){v=t;o++;t=s[r+i[o]];if((t<u)){m[r]=0;return}k-=j+v;h=0;break}if((j<u)){if((v>p)){m[r]=0;return}if((t>p)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((t>p)){m[r]=0;return}k-=j+v;h=8;break}if((v<=p)){m[r]=0;return}if((t<=p)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((t>p)){k-=j+v;h=3;break}if((t<u)){k-=j+v;h=6;break}m[r]=0;return;case 1:if((j<u)){v=t;o++;t=s[r+i[o]];if((t>p)){m[r]=0;return}k-=j+v;h=1;break}if((j>p)){if((v<u)){m[r]=0;return}if((t<u)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((t<u)){m[r]=0;return}k-=j+v;h=9;break}if((v>=u)){m[r]=0;return}if((t>=u)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((t<u)){k-=j+v;h=2;break}if((t>p)){k-=j+v;h=7;break}m[r]=0;return;case 2:if((j>p)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((j<u)){if((t>p)){m[r]=0;return}k-=j+v;h=4;break}if((t>p)){k-=j+v;h=7;break}if((t<u)){k-=j+v;h=2;break}m[r]=0;return;case 3:if((j<u)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((j>p)){if((t<u)){m[r]=0;return}k-=j+v;h=5;break}if((t>p)){k-=j+v;h=3;break}if((t<u)){k-=j+v;h=6;break}m[r]=0;return;case 4:if((j>p)){m[r]=0;return}if((j<u)){v=t;o++;t=s[r+i[o]];if((t>p)){m[r]=0;return}k-=j+v;h=1;break}if((t>=u)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((t<u)){k-=j+v;h=2;break}if((t>p)){k-=j+v;h=7;break}m[r]=0;return;case 5:if((j<u)){m[r]=0;return}if((j>p)){v=t;o++;t=s[r+i[o]];if((t<u)){m[r]=0;return}k-=j+v;h=0;break}if((t<=p)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((t>p)){k-=j+v;h=3;break}if((t<u)){k-=j+v;h=6;break}m[r]=0;return;case 7:if((j>p)){m[r]=0;return}if((j<u)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((t>p)){k-=j+v;h=3;break}if((t<u)){k-=j+v;h=6;break}m[r]=0;return;case 6:if((j>p)){m[r]=0;return}if((j<u)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((t<u)){k-=j+v;h=2;break}if((t>p)){k-=j+v;h=7;break}m[r]=0;return;case 8:if((j>p)){if((t<u)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((t<u)){m[r]=0;return}k-=j+v;h=9;break}if((j<u)){v=t;o++;t=s[r+i[o]];if((t>p)){m[r]=0;return}k-=j+v;h=1;break}m[r]=0;return;case 9:if((j<u)){if((t>p)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((t>p)){m[r]=0;return}k-=j+v;h=8;break}if((j>p)){v=t;o++;t=s[r+i[o]];if((t<u)){m[r]=0;return}k-=j+v;h=0;break}m[r]=0;return;default:break}}m[r]=(k+n*s[r]);};var f=(function(){function h(i,j,k){this.dirs=new Int32Array(1024);this.dirs_count=d(i,this.dirs,k)|0;this.scores=new Int32Array(i*j);this.radius=k|0;}return h})();return{level_tables:[],tau:7,init:function(m,j,h,l){if(typeof l===\"undefined\"){l=1;}var k;h=Math.min(h,7);h=Math.max(h,3);for(k=0;k<l;++k){this.level_tables[k]=new f(m>>k,j>>k,h);}},detect:function(k,J,G){if(typeof G===\"undefined\"){G=4;}var A=this.level_tables[0];var i=A.radius|0,q=(i-1)|0;var m=A.dirs;var n=A.dirs_count|0;var v=n>>1;var O=k.data,u=k.cols|0,K=k.rows|0,N=u>>1;var H=A.scores;var s=0,r=0,j=0,l=0,o=0,p=0,z=0,I=0;var F=this.tau|0;var D=0,E;var C=Math.max(i+1,G)|0;var B=Math.max(i+1,G)|0;var M=Math.min(u-i-2,u-G)|0;var L=Math.min(K-i-2,K-G)|0;j=(B*u+C)|0;for(r=B;r<L;++r,j+=u){for(s=C,l=j;s<M;++s,++l){o=O[l]+F,p=O[l]-F;if(p<O[l+i]&&O[l+i]<o&&p<O[l-i]&&O[l-i]<o){H[l]=0;}else{e(O,l,H,p,o,m,v,n);}}}j=(B*u+C)|0;for(r=B;r<L;++r,j+=u){for(s=C,l=j;s<M;++s,++l){I=H[l];z=Math.abs(I);if(z<5){++s,++l;}else{if(g(H,l,u)>=3&&c(H,l,I,N,i)){E=J[D];E.x=s,E.y=r,E.score=z;++D;s+=q,l+=q;}}}}return D}}})();a.yape=b;})(jsfeat);(function(b){var a=(function(){var d=new Int32Array([8,-3,9,5,4,2,7,-12,-11,9,-8,2,7,-12,12,-13,2,-13,2,12,1,-7,1,6,-2,-10,-2,-4,-13,-13,-11,-8,-13,-3,-12,-9,10,4,11,9,-13,-8,-8,-9,-11,7,-9,12,7,7,12,6,-4,-5,-3,0,-13,2,-12,-3,-9,0,-7,5,12,-6,12,-1,-3,6,-2,12,-6,-13,-4,-8,11,-13,12,-8,4,7,5,1,5,-3,10,-3,3,-7,6,12,-8,-7,-6,-2,-2,11,-1,-10,-13,12,-8,10,-7,3,-5,-3,-4,2,-3,7,-10,-12,-6,11,5,-12,6,-7,5,-6,7,-1,1,0,4,-5,9,11,11,-13,4,7,4,12,2,-1,4,4,-4,-12,-2,7,-8,-5,-7,-10,4,11,9,12,0,-8,1,-13,-13,-2,-8,2,-3,-2,-2,3,-6,9,-4,-9,8,12,10,7,0,9,1,3,7,-5,11,-10,-13,-6,-11,0,10,7,12,1,-6,-3,-6,12,10,-9,12,-4,-13,8,-8,-12,-13,0,-8,-4,3,3,7,8,5,7,10,-7,-1,7,1,-12,3,-10,5,6,2,-4,3,-10,-13,0,-13,5,-13,-7,-12,12,-13,3,-11,8,-7,12,-4,7,6,-10,12,8,-9,-1,-7,-6,-2,-5,0,12,-12,5,-7,5,3,-10,8,-13,-7,-7,-4,5,-3,-2,-1,-7,2,9,5,-11,-11,-13,-5,-13,-1,6,0,-1,5,-3,5,2,-4,-13,-4,12,-9,-6,-9,6,-12,-10,-8,-4,10,2,12,-3,7,12,12,12,-7,-13,-6,5,-4,9,-3,4,7,-1,12,2,-7,6,-5,1,-13,11,-12,5,-3,7,-2,-6,7,-8,12,-7,-13,-7,-11,-12,1,-3,12,12,2,-6,3,0,-4,3,-2,-13,-1,-13,1,9,7,1,8,-6,1,-1,3,12,9,1,12,6,-1,-9,-1,3,-13,-13,-10,5,7,7,10,12,12,-5,12,9,6,3,7,11,5,-13,6,10,2,-12,2,3,3,8,4,-6,2,6,12,-13,9,-12,10,3,-8,4,-7,9,-11,12,-4,-6,1,12,2,-8,6,-9,7,-4,2,3,3,-2,6,3,11,0,3,-3,8,-8,7,8,9,3,-11,-5,-6,-4,-10,11,-5,10,-5,-8,-3,12,-10,5,-9,0,8,-1,12,-6,4,-6,6,-11,-10,12,-8,7,4,-2,6,7,-2,0,-2,12,-5,-8,-5,2,7,-6,10,12,-9,-13,-8,-8,-5,-13,-5,-2,8,-8,9,-13,-9,-11,-9,0,1,-8,1,-2,7,-4,9,1,-2,1,-1,-4,11,-6,12,-11,-12,-9,-6,4,3,7,7,12,5,5,10,8,0,-4,2,8,-9,12,-5,-13,0,7,2,12,-1,2,1,7,5,11,7,-9,3,5,6,-8,-13,-4,-8,9,-5,9,-3,-3,-4,-7,-3,-12,6,5,8,0,-7,6,-6,12,-13,6,-5,-2,1,-10,3,10,4,1,8,-4,-2,-2,2,-13,2,-12,12,12,-2,-13,0,-6,4,1,9,3,-6,-10,-3,-5,-3,-13,-1,1,7,5,12,-11,4,-2,5,-7,-13,9,-9,-5,7,1,8,6,7,-8,7,6,-7,-4,-7,1,-8,11,-7,-8,-13,6,-12,-8,2,4,3,9,10,-5,12,3,-6,-5,-6,7,8,-3,9,-8,2,-12,2,8,-11,-2,-10,3,-12,-13,-7,-9,-11,0,-10,-5,5,-3,11,8,-2,-13,-1,12,-1,-8,0,9,-13,-11,-12,-5,-10,-2,-10,11,-3,9,-2,-13,2,-3,3,2,-9,-13,-4,0,-4,6,-3,-10,-4,12,-2,-7,-6,-11,-4,9,6,-3,6,11,-13,11,-5,5,11,11,12,6,7,-5,12,-2,-1,12,0,7,-4,-8,-3,-2,-7,1,-6,7,-13,-12,-8,-13,-7,-2,-6,-8,-8,5,-6,-9,-5,-1,-4,5,-13,7,-8,10,1,5,5,-13,1,0,10,-13,9,12,10,-1,5,-8,10,-9,-1,11,1,-13,-9,-3,-6,2,-1,-10,1,12,-13,1,-8,-10,8,-11,10,-6,2,-13,3,-6,7,-13,12,-9,-10,-10,-5,-7,-10,-8,-8,-13,4,-6,8,5,3,12,8,-13,-4,2,-3,-3,5,-13,10,-12,4,-13,5,-1,-9,9,-4,3,0,3,3,-9,-12,1,-6,1,3,2,4,-8,-10,-10,-10,9,8,-13,12,12,-8,-12,-6,-5,2,2,3,7,10,6,11,-8,6,8,8,-12,-7,10,-6,5,-3,-9,-3,9,-1,-13,-1,5,-3,-7,-3,4,-8,-2,-8,3,4,2,12,12,2,-5,3,11,6,-9,11,-13,3,-1,7,12,11,-1,12,4,-3,0,-3,6,4,-11,4,12,2,-4,2,1,-10,-6,-8,1,-13,7,-11,1,-13,12,-11,-13,6,0,11,-13,0,-1,1,4,-13,3,-9,-2,-9,8,-6,-3,-13,-6,-8,-2,5,-9,8,10,2,7,3,-9,-1,-6,-1,-1,9,5,11,-2,11,-3,12,-8,3,0,3,5,-1,4,0,10,3,-6,4,5,-13,0,-10,5,5,8,12,11,8,9,9,-6,7,-4,8,-12,-10,4,-10,9,7,3,12,4,9,-7,10,-2,7,0,12,-2,-1,-6,0,-11]);var c=new jsfeat.matrix_t(3,3,jsfeat.F32_t|jsfeat.C1_t);var f=new jsfeat.matrix_t(32,32,jsfeat.U8_t|jsfeat.C1_t);var e=function(l,n,k,i,h,j){var m=Math.cos(k);var g=Math.sin(k);c.data[0]=m,c.data[1]=-g,c.data[2]=(-m+g)*j*0.5+i,c.data[3]=g,c.data[4]=m,c.data[5]=(-g-m)*j*0.5+h;jsfeat.imgproc.warp_affine(l,n,c,128);};return{describe:function(j,u,g,B){var r=32;var x=0,A=0,q=0,p=0,z=0;var o=0,m=0,D=0;var C=j.data,n=j.cols,y=j.rows;var t=f.data;var v=16*32+16;var k=0;if(!(B.type&jsfeat.U8_t)){B.type=jsfeat.U8_t;B.cols=r;B.rows=g;B.channel=1;B.allocate();}else{B.resize(r,g,1);}var l=B.data;var s=0;for(x=0;x<g;++x){q=u[x].x;p=u[x].y;z=u[x].angle;e(j,f,z,q,p,32);k=0;for(A=0;A<r;++A){o=t[v+d[k+1]*32+d[k]];k+=2;m=t[v+d[k+1]*32+d[k]];k+=2;D=(o<m)|0;o=t[v+d[k+1]*32+d[k]];k+=2;m=t[v+d[k+1]*32+d[k]];k+=2;D|=(o<m)<<1;o=t[v+d[k+1]*32+d[k]];k+=2;m=t[v+d[k+1]*32+d[k]];k+=2;D|=(o<m)<<2;o=t[v+d[k+1]*32+d[k]];k+=2;m=t[v+d[k+1]*32+d[k]];k+=2;D|=(o<m)<<3;o=t[v+d[k+1]*32+d[k]];k+=2;m=t[v+d[k+1]*32+d[k]];k+=2;D|=(o<m)<<4;o=t[v+d[k+1]*32+d[k]];k+=2;m=t[v+d[k+1]*32+d[k]];k+=2;D|=(o<m)<<5;o=t[v+d[k+1]*32+d[k]];k+=2;m=t[v+d[k+1]*32+d[k]];k+=2;D|=(o<m)<<6;o=t[v+d[k+1]*32+d[k]];k+=2;m=t[v+d[k+1]*32+d[k]];k+=2;D|=(o<m)<<7;l[s+A]=D;}s+=r;}}}})();b.orb=a;})(jsfeat);(function(b){var a=(function(){var c=jsfeat.imgproc.scharr_derivatives;return{track:function(n,u,ap,aL,k,N,R,K,f,q){if(typeof R===\"undefined\"){R=30;}if(typeof K===\"undefined\"){K=new Uint8Array(k);}if(typeof f===\"undefined\"){f=0.01;}if(typeof q===\"undefined\"){q=0.0001;}var e=(N-1)*0.5;var h=(N*N)|0;var aa=h<<1;var r=n.data,S=u.data;var g=r[0].data,F=S[0].data;var M=r[0].cols,aB=r[0].rows,ay=0,aH=0;var az=jsfeat.cache.get_buffer(h<<2);var s=jsfeat.cache.get_buffer(aa<<2);var t=jsfeat.cache.get_buffer((aB*(M<<1))<<2);var V=new jsfeat.matrix_t(M,aB,jsfeat.S32C2_t,t.data);var w=az.i32;var ac=s.i32;var aA=t.i32;var ab=0,I=0,aM=0,at=0,aI=0,au=0;var am=0,aF=0,aD=0,af=0,ae=0;var E=0,z=0,Y=0,W=0;var p=0,o=0,aE=0,aC=0;var Q=0,P=0,J=0,H=0,ai=0,ak=0,l=0;var d=0,A=0,O=0;var U=0,T=0,aw=0,av=0;var ah=14;var C=14;var Z=C-5;var ax=(1<<((Z)-1));var ad=(1<<ah);var m=(1<<((C)-1));var X=1/(1<<20);var aK=0,aJ=0,ar=0,aq=0,al=0,v=0,B=0;var ao=0,an=0,ag=0,aj=0,aG=0;var G=1.1920929e-7;f*=f;for(;Q<k;++Q){K[Q]=1;}var L=(n.levels-1)|0;ai=L;for(;ai>=0;--ai){am=(1/(1<<ai));ay=M>>ai;aH=aB>>ai;ab=ay<<1;g=r[ai].data;F=S[ai].data;A=(ay-N)|0;O=(aH-N)|0;c(r[ai],V);for(ak=0;ak<k;++ak){Q=ak<<1;P=Q+1;aF=ap[Q]*am;aD=ap[P]*am;if(ai==L){af=aF;ae=aD;}else{af=aL[Q]*2;ae=aL[P]*2;}aL[Q]=af;aL[P]=ae;aF-=e;aD-=e;p=aF|0;o=aD|0;J=(p<=d)|(p>=A)|(o<=d)|(o>=O);if(J!=0){if(ai==0){K[ak]=0;}continue}U=aF-p;T=aD-o;aK=(((1-U)*(1-T)*ad)+0.5)|0;aJ=((U*(1-T)*ad)+0.5)|0;ar=(((1-U)*T*ad)+0.5)|0;aq=(ad-aK-aJ-ar);ao=0,an=0,ag=0;for(H=0;H<N;++H){I=((H+o)*ay+p)|0;aM=I<<1;at=(H*N)|0;aI=at<<1;for(J=0;J<N;++J,++I,++at,aM+=2){al=((g[I])*aK+(g[I+1])*aJ+(g[I+ay])*ar+(g[I+ay+1])*aq);al=(((al)+ax)>>(Z));v=(aA[aM]*aK+aA[aM+2]*aJ+aA[aM+ab]*ar+aA[aM+ab+2]*aq);v=(((v)+m)>>(C));B=(aA[aM+1]*aK+aA[aM+3]*aJ+aA[aM+ab+1]*ar+aA[aM+ab+3]*aq);B=(((B)+m)>>(C));w[at]=al;ac[aI++]=v;ac[aI++]=B;ao+=v*v;an+=v*B;ag+=B*B;}}ao*=X;an*=X;ag*=X;aj=ao*ag-an*an;aG=(ag+ao-Math.sqrt((ao-ag)*(ao-ag)+4*an*an))/aa;if(aG<q||aj<G){if(ai==0){K[ak]=0;}continue}aj=1/aj;af-=e;ae-=e;E=0;z=0;for(l=0;l<R;++l){aE=af|0;aC=ae|0;J=(aE<=d)|(aE>=A)|(aC<=d)|(aC>=O);if(J!=0){if(ai==0){K[ak]=0;}break}U=af-aE;T=ae-aC;aK=(((1-U)*(1-T)*ad)+0.5)|0;aJ=((U*(1-T)*ad)+0.5)|0;ar=(((1-U)*T*ad)+0.5)|0;aq=(ad-aK-aJ-ar);aw=0,av=0;for(H=0;H<N;++H){au=((H+aC)*ay+aE)|0;at=(H*N)|0;aI=at<<1;for(J=0;J<N;++J,++au,++at){al=((F[au])*aK+(F[au+1])*aJ+(F[au+ay])*ar+(F[au+ay+1])*aq);al=(((al)+ax)>>(Z));al=(al-w[at]);aw+=al*ac[aI++];av+=al*ac[aI++];}}aw*=X;av*=X;Y=((an*av-ag*aw)*aj);W=((an*aw-ao*av)*aj);af+=Y;ae+=W;aL[Q]=af+e;aL[P]=ae+e;if(Y*Y+W*W<=f){break}if(l>0&&Math.abs(Y+E)<0.01&&Math.abs(W+z)<0.01){aL[Q]-=Y*0.5;aL[P]-=W*0.5;break}E=Y;z=W;}}}jsfeat.cache.put_buffer(az);jsfeat.cache.put_buffer(s);jsfeat.cache.put_buffer(t);}}})();b.optical_flow_lk=a;})(jsfeat);(function(b){var a=(function(){var c=function(e,d){var f=(e.width*0.25+0.5)|0;return d.x<=e.x+f&&d.x>=e.x-f&&d.y<=e.y+f&&d.y>=e.y-f&&d.width<=(e.width*1.5+0.5)|0&&(d.width*1.5+0.5)|0>=e.width};return{edges_density:0.07,detect_single_scale:function(E,ad,af,q,d,f,D,B){var z=(B.size[0]*D)|0,N=(B.size[1]*D)|0,V=(0.5*D+1.5)|0,U=V;var Z,X,W,Q,O,T=(d-z)|0,R=(f-N)|0;var H=(d+1)|0,w,p,r,S;var e=1/(z*N);var t,o,l,u,s,ae,A,g=true,L,h,n,G,m;var M,K,J,I,v,C;var ac=0,ab=z,aa=N*H,Y=aa+z;var F=((z*N)*255*this.edges_density)|0;var P=[];for(O=0;O<R;O+=U){ac=O*H;for(Q=0;Q<T;Q+=V,ac+=V){p=E[ac]-E[ac+ab]-E[ac+aa]+E[ac+Y];if(q){w=(q[ac]-q[ac+ab]-q[ac+aa]+q[ac+Y]);if(w<F||p<20){Q+=V,ac+=V;continue}}p*=e;r=(ad[ac]-ad[ac+ab]-ad[ac+aa]+ad[ac+Y])*e-p*p;S=r>0?Math.sqrt(r):1;t=B.complexClassifiers;s=t.length;g=true;for(Z=0;Z<s;++Z){o=t[Z];L=o.threshold;l=o.simpleClassifiers;ae=l.length;h=0;for(X=0;X<ae;++X){u=l[X];n=0;m=u.features;A=m.length;if(u.tilted===1){for(W=0;W<A;++W){G=m[W];M=~~(Q+G[0]*D)+~~(O+G[1]*D)*H;v=~~(G[2]*D);C=~~(G[3]*D);K=v*H;J=C*H;n+=(af[M]-af[M+v+K]-af[M-C+J]+af[M+v-C+K+J])*G[4];}}else{for(W=0;W<A;++W){G=m[W];M=~~(Q+G[0]*D)+~~(O+G[1]*D)*H;v=~~(G[2]*D);C=~~(G[3]*D);J=C*H;n+=(E[M]-E[M+v]-E[M+J]+E[M+J+v])*G[4];}}h+=(n*e<u.threshold*S)?u.left_val:u.right_val;}if(h<L){g=false;break}}if(g){P.push({x:Q,y:O,width:z,height:N,neighbor:1,confidence:h});Q+=V,ac+=V;}}}return P},detect_multi_scale:function(e,m,f,h,d,n,i,g,k){if(typeof g===\"undefined\"){g=1.2;}if(typeof k===\"undefined\"){k=1;}var o=i.size[0];var j=i.size[1];var l=[];while(k*o<d&&k*j<n){l=l.concat(this.detect_single_scale(e,m,f,h,d,n,k,i));k*=g;}return l},group_rectangles:function(g,l){if(typeof l===\"undefined\"){l=1;}var y,v,q=g.length;var r=[];for(y=0;y<q;++y){r[y]={parent:-1,element:g[y],rank:0};}for(y=0;y<q;++y){if(!r[y].element){continue}var t=y;while(r[t].parent!=-1){t=r[t].parent;}for(v=0;v<q;++v){if(y!=v&&r[v].element&&c(r[y].element,r[v].element)){var s=v;while(r[s].parent!=-1){s=r[s].parent;}if(s!=t){if(r[t].rank>r[s].rank){r[s].parent=t;}else{r[t].parent=s;if(r[t].rank==r[s].rank){r[s].rank++;}t=s;}var A,d=v;while(r[d].parent!=-1){A=d;d=r[d].parent;r[A].parent=t;}d=y;while(r[d].parent!=-1){A=d;d=r[d].parent;r[A].parent=t;}}}}}var w=[];var o=0;for(y=0;y<q;y++){v=-1;var e=y;if(r[e].element){while(r[e].parent!=-1){e=r[e].parent;}if(r[e].rank>=0){r[e].rank=~o++;}v=~r[e].rank;}w[y]=v;}var m=[];for(y=0;y<o+1;++y){m[y]={neighbors:0,x:0,y:0,width:0,height:0,confidence:0};}for(y=0;y<q;++y){var z=g[y];var k=w[y];if(m[k].neighbors==0){m[k].confidence=z.confidence;}++m[k].neighbors;m[k].x+=z.x;m[k].y+=z.y;m[k].width+=z.width;m[k].height+=z.height;m[k].confidence=Math.max(m[k].confidence,z.confidence);}var h=[];for(y=0;y<o;++y){q=m[y].neighbors;if(q>=l){h.push({x:(m[y].x*2+q)/(2*q),y:(m[y].y*2+q)/(2*q),width:(m[y].width*2+q)/(2*q),height:(m[y].height*2+q)/(2*q),neighbors:m[y].neighbors,confidence:m[y].confidence});}}var p=[];q=h.length;for(y=0;y<q;++y){var z=h[y];var x=true;for(v=0;v<q;++v){var u=h[v];var f=(u.width*0.25+0.5)|0;if(y!=v&&z.x>=u.x-f&&z.y>=u.y-f&&z.x+z.width<=u.x+u.width+f&&z.y+z.height<=u.y+u.height+f&&(u.neighbors>Math.max(3,z.neighbors)||z.neighbors<3)){x=false;break}}if(x){p.push(z);}}return p}}})();b.haar=a;})(jsfeat);(function(a){var b=(function(){var c=function(f,e){var g=(f.width*0.25+0.5)|0;return e.x<=f.x+g&&e.x>=f.x-g&&e.y<=f.y+g&&e.y>=f.y-g&&e.width<=(f.width*1.5+0.5)|0&&(e.width*1.5+0.5)|0>=f.width};var d=new jsfeat.pyramid_t(1);return{interval:4,scale:1.1486,next:5,scale_to:1,prepare_cascade:function(g){var m=g.stage_classifier.length;for(var h=0;h<m;h++){var l=g.stage_classifier[h].feature;var e=g.stage_classifier[h].count;var i=g.stage_classifier[h]._feature=new Array(e);for(var f=0;f<e;f++){i[f]={size:l[f].size,px:new Array(l[f].size),pz:new Array(l[f].size),nx:new Array(l[f].size),nz:new Array(l[f].size)};}}},build_pyramid:function(e,k,s,f){if(typeof f===\"undefined\"){f=4;}var q=e.cols,m=e.rows;var l=0,n=0,h=0;var p=false;var j=e,g=e;var r=jsfeat.U8_t|jsfeat.C1_t;this.interval=f;this.scale=Math.pow(2,1/(this.interval+1));this.next=(this.interval+1)|0;this.scale_to=(Math.log(Math.min(q/k,m/s))/Math.log(this.scale))|0;var o=((this.scale_to+this.next*2)*4)|0;if(d.levels!=o){d.levels=o;d.data=new Array(o);p=true;d.data[0]=e;}for(l=1;l<=this.interval;++l){n=(q/Math.pow(this.scale,l))|0;h=(m/Math.pow(this.scale,l))|0;j=d.data[l<<2];if(p||n!=j.cols||h!=j.rows){d.data[l<<2]=new jsfeat.matrix_t(n,h,r);j=d.data[l<<2];}jsfeat.imgproc.resample(e,j,n,h);}for(l=this.next;l<this.scale_to+this.next*2;++l){g=d.data[(l<<2)-(this.next<<2)];j=d.data[l<<2];n=g.cols>>1;h=g.rows>>1;if(p||n!=j.cols||h!=j.rows){d.data[l<<2]=new jsfeat.matrix_t(n,h,r);j=d.data[l<<2];}jsfeat.imgproc.pyrdown(g,j);}for(l=this.next*2;l<this.scale_to+this.next*2;++l){g=d.data[(l<<2)-(this.next<<2)];n=g.cols>>1;h=g.rows>>1;j=d.data[(l<<2)+1];if(p||n!=j.cols||h!=j.rows){d.data[(l<<2)+1]=new jsfeat.matrix_t(n,h,r);j=d.data[(l<<2)+1];}jsfeat.imgproc.pyrdown(g,j,1,0);j=d.data[(l<<2)+2];if(p||n!=j.cols||h!=j.rows){d.data[(l<<2)+2]=new jsfeat.matrix_t(n,h,r);j=d.data[(l<<2)+2];}jsfeat.imgproc.pyrdown(g,j,0,1);j=d.data[(l<<2)+3];if(p||n!=j.cols||h!=j.rows){d.data[(l<<2)+3]=new jsfeat.matrix_t(n,h,r);j=d.data[(l<<2)+3];}jsfeat.imgproc.pyrdown(g,j,1,1);}return d},detect:function(G,L){var h=this.interval;var N=this.scale;var m=this.next;var l=this.scale_to;var ab=0,aa=0,Z=0,W=0,S=0,R=0,U=0,B=0,J=0,I=0,V=0,ae=0,M=0,ad=0,w=0,Y=0,g=0;var E=0,X,Q,D,H,F,O=true,o=true;var z=1,v=1;var s=[0,1,0,1];var r=[0,0,1,1];var K=[];var C=G.data,ac=1,u=2,t=4;var A=[],e=[0,0,0];var P=[0,0,0];var T=[0,0,0];for(ab=0;ab<l;ab++){w=(ab<<2);Y=C[w+(m<<3)].cols-(L.width>>2);g=C[w+(m<<3)].rows-(L.height>>2);P[0]=C[w].cols*ac;P[1]=C[w+(m<<2)].cols*ac;P[2]=C[w+(m<<3)].cols*ac;T[0]=(C[w].cols*t)-(Y*t);T[1]=(C[w+(m<<2)].cols*u)-(Y*u);T[2]=(C[w+(m<<3)].cols*ac)-(Y*ac);B=L.stage_classifier.length;for(aa=0;aa<B;aa++){D=L.stage_classifier[aa].feature;Q=L.stage_classifier[aa]._feature;J=L.stage_classifier[aa].count;for(Z=0;Z<J;Z++){H=Q[Z];F=D[Z];I=F.size|0;for(U=0;U<I;U++){H.px[U]=(F.px[U]*ac)+F.py[U]*P[F.pz[U]];H.pz[U]=F.pz[U];H.nx[U]=(F.nx[U]*ac)+F.ny[U]*P[F.nz[U]];H.nz[U]=F.nz[U];}}}A[0]=C[w].data;A[1]=C[w+(m<<2)].data;for(U=0;U<4;U++){A[2]=C[w+(m<<3)+U].data;e[0]=(s[U]*u)+r[U]*(C[w].cols*u);e[1]=(s[U]*ac)+r[U]*(C[w+(m<<2)].cols*ac);e[2]=0;for(R=0;R<g;R++){for(S=0;S<Y;S++){E=0;O=true;B=L.stage_classifier.length;for(aa=0;aa<B;aa++){E=0;X=L.stage_classifier[aa].alpha;Q=L.stage_classifier[aa]._feature;J=L.stage_classifier[aa].count;for(Z=0;Z<J;Z++){H=Q[Z];ae=A[H.pz[0]][e[H.pz[0]]+H.px[0]];M=A[H.nz[0]][e[H.nz[0]]+H.nx[0]];if(ae<=M){E+=X[Z<<1];}else{o=true;I=H.size;for(ad=1;ad<I;ad++){if(H.pz[ad]>=0){V=A[H.pz[ad]][e[H.pz[ad]]+H.px[ad]];if(V<ae){if(V<=M){o=false;break}ae=V;}}if(H.nz[ad]>=0){W=A[H.nz[ad]][e[H.nz[ad]]+H.nx[ad]];if(W>M){if(ae<=W){o=false;break}M=W;}}}E+=(o)?X[(Z<<1)+1]:X[Z<<1];}}if(E<L.stage_classifier[aa].threshold){O=false;break}}if(O){K.push({x:(S*4+s[U]*2)*z,y:(R*4+r[U]*2)*v,width:L.width*z,height:L.height*v,neighbor:1,confidence:E});++S;e[0]+=t;e[1]+=u;e[2]+=ac;}e[0]+=t;e[1]+=u;e[2]+=ac;}e[0]+=T[0];e[1]+=T[1];e[2]+=T[2];}}z*=N;v*=N;}return K},group_rectangles:function(h,m){if(typeof m===\"undefined\"){m=1;}var z,w,r=h.length;var s=[];for(z=0;z<r;++z){s[z]={parent:-1,element:h[z],rank:0};}for(z=0;z<r;++z){if(!s[z].element){continue}var u=z;while(s[u].parent!=-1){u=s[u].parent;}for(w=0;w<r;++w){if(z!=w&&s[w].element&&c(s[z].element,s[w].element)){var t=w;while(s[t].parent!=-1){t=s[t].parent;}if(t!=u){if(s[u].rank>s[t].rank){s[t].parent=u;}else{s[u].parent=t;if(s[u].rank==s[t].rank){s[t].rank++;}u=t;}var B,e=w;while(s[e].parent!=-1){B=e;e=s[e].parent;s[B].parent=u;}e=z;while(s[e].parent!=-1){B=e;e=s[e].parent;s[B].parent=u;}}}}}var x=[];var p=0;for(z=0;z<r;z++){w=-1;var f=z;if(s[f].element){while(s[f].parent!=-1){f=s[f].parent;}if(s[f].rank>=0){s[f].rank=~p++;}w=~s[f].rank;}x[z]=w;}var o=[];for(z=0;z<p+1;++z){o[z]={neighbors:0,x:0,y:0,width:0,height:0,confidence:0};}for(z=0;z<r;++z){var A=h[z];var l=x[z];if(o[l].neighbors==0){o[l].confidence=A.confidence;}++o[l].neighbors;o[l].x+=A.x;o[l].y+=A.y;o[l].width+=A.width;o[l].height+=A.height;o[l].confidence=Math.max(o[l].confidence,A.confidence);}var k=[];for(z=0;z<p;++z){r=o[z].neighbors;if(r>=m){k.push({x:(o[z].x*2+r)/(2*r),y:(o[z].y*2+r)/(2*r),width:(o[z].width*2+r)/(2*r),height:(o[z].height*2+r)/(2*r),neighbors:o[z].neighbors,confidence:o[z].confidence});}}var q=[];r=k.length;for(z=0;z<r;++z){var A=k[z];var y=true;for(w=0;w<r;++w){var v=k[w];var g=(v.width*0.25+0.5)|0;if(z!=w&&A.x>=v.x-g&&A.y>=v.y-g&&A.x+A.width<=v.x+v.width+g&&A.y+A.height<=v.y+v.height+g&&(v.neighbors>Math.max(3,A.neighbors)||A.neighbors<3)){y=false;break}}if(y){q.push(A);}}return q}}})();a.bbf=b;})(jsfeat);(function(a){if(typeof module===\"undefined\"||typeof module.exports===\"undefined\"){window.jsfeat=a;}else{module.exports=a;}})(jsfeat);\n\n\t/**\n\t * this cascade is derived from https://github.com/mtschirs/js-objectdetect implementation\n\t * @author Martin Tschirsich / http://www.tu-darmstadt.de/~m_t\n\t */\n\tjsfeat.haar.frontalface = {complexClassifiers:[{simpleClassifiers:[{features:[[3,7,14,4,-1.],[3,9,14,2,2.]],threshold:4.0141958743333817e-003,right_val:0.8378106951713562,left_val:0.0337941907346249},{features:[[1,2,18,4,-1.],[7,2,6,4,3.]],threshold:0.0151513395830989,right_val:0.7488812208175659,left_val:0.1514132022857666},{features:[[1,7,15,9,-1.],[1,10,15,3,3.]],threshold:4.2109931819140911e-003,right_val:0.6374819874763489,left_val:0.0900492817163467}],threshold:0.8226894140243530},{simpleClassifiers:[{features:[[5,6,2,6,-1.],[5,9,2,3,2.]],threshold:1.6227109590545297e-003,right_val:0.7110946178436279,left_val:0.0693085864186287},{features:[[7,5,6,3,-1.],[9,5,2,3,3.]],threshold:2.2906649392098188e-003,right_val:0.6668692231178284,left_val:0.1795803010463715},{features:[[4,0,12,9,-1.],[4,3,12,3,3.]],threshold:5.0025708042085171e-003,right_val:0.6554006934165955,left_val:0.1693672984838486},{features:[[6,9,10,8,-1.],[6,13,10,4,2.]],threshold:7.9659894108772278e-003,right_val:0.0914145186543465,left_val:0.5866332054138184},{features:[[3,6,14,8,-1.],[3,10,14,4,2.]],threshold:-3.5227010957896709e-003,right_val:0.6031895875930786,left_val:0.1413166970014572},{features:[[14,1,6,10,-1.],[14,1,3,10,2.]],threshold:0.0366676896810532,right_val:0.7920318245887756,left_val:0.3675672113895416},{features:[[7,8,5,12,-1.],[7,12,5,4,3.]],threshold:9.3361474573612213e-003,right_val:0.2088509947061539,left_val:0.6161385774612427},{features:[[1,1,18,3,-1.],[7,1,6,3,3.]],threshold:8.6961314082145691e-003,right_val:0.6360273957252502,left_val:0.2836230993270874},{features:[[1,8,17,2,-1.],[1,9,17,1,2.]],threshold:1.1488880263641477e-003,right_val:0.5800700783729553,left_val:0.2223580926656723},{features:[[16,6,4,2,-1.],[16,7,4,1,2.]],threshold:-2.1484689787030220e-003,right_val:0.5787054896354675,left_val:0.2406464070081711},{features:[[5,17,2,2,-1.],[5,18,2,1,2.]],threshold:2.1219060290604830e-003,right_val:0.1362237036228180,left_val:0.5559654831886292},{features:[[14,2,6,12,-1.],[14,2,3,12,2.]],threshold:-0.0939491465687752,right_val:0.4717740118503571,left_val:0.8502737283706665},{features:[[4,0,4,12,-1.],[4,0,2,6,2.],[6,6,2,6,2.]],threshold:1.3777789426967502e-003,right_val:0.2834529876708984,left_val:0.5993673801422119},{features:[[2,11,18,8,-1.],[8,11,6,8,3.]],threshold:0.0730631574988365,right_val:0.7060034275054932,left_val:0.4341886043548584},{features:[[5,7,10,2,-1.],[5,8,10,1,2.]],threshold:3.6767389974556863e-004,right_val:0.6051574945449829,left_val:0.3027887940406799},{features:[[15,11,5,3,-1.],[15,12,5,1,3.]],threshold:-6.0479710809886456e-003,right_val:0.5675256848335266,left_val:0.1798433959484100}],threshold:6.9566087722778320},{simpleClassifiers:[{features:[[5,3,10,9,-1.],[5,6,10,3,3.]],threshold:-0.0165106896311045,right_val:0.1424857974052429,left_val:0.6644225120544434},{features:[[9,4,2,14,-1.],[9,11,2,7,2.]],threshold:2.7052499353885651e-003,right_val:0.1288477033376694,left_val:0.6325352191925049},{features:[[3,5,4,12,-1.],[3,9,4,4,3.]],threshold:2.8069869149476290e-003,right_val:0.6193193197250366,left_val:0.1240288019180298},{features:[[4,5,12,5,-1.],[8,5,4,5,3.]],threshold:-1.5402400167658925e-003,right_val:0.5670015811920166,left_val:0.1432143002748489},{features:[[5,6,10,8,-1.],[5,10,10,4,2.]],threshold:-5.6386279175058007e-004,right_val:0.5905207991600037,left_val:0.1657433062791824},{features:[[8,0,6,9,-1.],[8,3,6,3,3.]],threshold:1.9253729842603207e-003,right_val:0.5738824009895325,left_val:0.2695507109165192},{features:[[9,12,1,8,-1.],[9,16,1,4,2.]],threshold:-5.0214841030538082e-003,right_val:0.5782774090766907,left_val:0.1893538981676102},{features:[[0,7,20,6,-1.],[0,9,20,2,3.]],threshold:2.6365420781075954e-003,right_val:0.5695425868034363,left_val:0.2309329062700272},{features:[[7,0,6,17,-1.],[9,0,2,17,3.]],threshold:-1.5127769438549876e-003,right_val:0.5956642031669617,left_val:0.2759602069854736},{features:[[9,0,6,4,-1.],[11,0,2,4,3.]],threshold:-0.0101574398577213,right_val:0.5522047281265259,left_val:0.1732538044452667},{features:[[5,1,6,4,-1.],[7,1,2,4,3.]],threshold:-0.0119536602869630,right_val:0.5559014081954956,left_val:0.1339409947395325},{features:[[12,1,6,16,-1.],[14,1,2,16,3.]],threshold:4.8859491944313049e-003,right_val:0.6188849210739136,left_val:0.3628703951835632},{features:[[0,5,18,8,-1.],[0,5,9,4,2.],[9,9,9,4,2.]],threshold:-0.0801329165697098,right_val:0.5475944876670837,left_val:0.0912110507488251},{features:[[8,15,10,4,-1.],[13,15,5,2,2.],[8,17,5,2,2.]],threshold:1.0643280111253262e-003,right_val:0.5711399912834168,left_val:0.3715142905712128},{features:[[3,1,4,8,-1.],[3,1,2,4,2.],[5,5,2,4,2.]],threshold:-1.3419450260698795e-003,right_val:0.3318097889423370,left_val:0.5953313708305359},{features:[[3,6,14,10,-1.],[10,6,7,5,2.],[3,11,7,5,2.]],threshold:-0.0546011403203011,right_val:0.5602846145629883,left_val:0.1844065934419632},{features:[[2,1,6,16,-1.],[4,1,2,16,3.]],threshold:2.9071690514683723e-003,right_val:0.6131715178489685,left_val:0.3594244122505188},{features:[[0,18,20,2,-1.],[0,19,20,1,2.]],threshold:7.4718717951327562e-004,right_val:0.3459562957286835,left_val:0.5994353294372559},{features:[[8,13,4,3,-1.],[8,14,4,1,3.]],threshold:4.3013808317482471e-003,right_val:0.6990845203399658,left_val:0.4172652065753937},{features:[[9,14,2,3,-1.],[9,15,2,1,3.]],threshold:4.5017572119832039e-003,right_val:0.7801457047462463,left_val:0.4509715139865875},{features:[[0,12,9,6,-1.],[0,14,9,2,3.]],threshold:0.0241385009139776,right_val:0.1319826990365982,left_val:0.5438212752342224}],threshold:9.4985427856445313},{simpleClassifiers:[{features:[[5,7,3,4,-1.],[5,9,3,2,2.]],threshold:1.9212230108678341e-003,right_val:0.6199870705604553,left_val:0.1415266990661621},{features:[[9,3,2,16,-1.],[9,11,2,8,2.]],threshold:-1.2748669541906565e-004,right_val:0.1884928941726685,left_val:0.6191074252128601},{features:[[3,6,13,8,-1.],[3,10,13,4,2.]],threshold:5.1409931620582938e-004,right_val:0.5857927799224854,left_val:0.1487396955490112},{features:[[12,3,8,2,-1.],[12,3,4,2,2.]],threshold:4.1878609918057919e-003,right_val:0.6359239816665649,left_val:0.2746909856796265},{features:[[8,8,4,12,-1.],[8,12,4,4,3.]],threshold:5.1015717908740044e-003,right_val:0.2175628989934921,left_val:0.5870851278305054},{features:[[11,3,8,6,-1.],[15,3,4,3,2.],[11,6,4,3,2.]],threshold:-2.1448440384119749e-003,right_val:0.2979590892791748,left_val:0.5880944728851318},{features:[[7,1,6,19,-1.],[9,1,2,19,3.]],threshold:-2.8977119363844395e-003,right_val:0.5876647233963013,left_val:0.2373327016830444},{features:[[9,0,6,4,-1.],[11,0,2,4,3.]],threshold:-0.0216106791049242,right_val:0.5194202065467835,left_val:0.1220654994249344},{features:[[3,1,9,3,-1.],[6,1,3,3,3.]],threshold:-4.6299318782985210e-003,right_val:0.5817409157752991,left_val:0.2631230950355530},{features:[[8,15,10,4,-1.],[13,15,5,2,2.],[8,17,5,2,2.]],threshold:5.9393711853772402e-004,right_val:0.5698544979095459,left_val:0.3638620078563690},{features:[[0,3,6,10,-1.],[3,3,3,10,2.]],threshold:0.0538786612451077,right_val:0.7559366226196289,left_val:0.4303531050682068},{features:[[3,4,15,15,-1.],[3,9,15,5,3.]],threshold:1.8887349870055914e-003,right_val:0.5613427162170410,left_val:0.2122603058815002},{features:[[6,5,8,6,-1.],[6,7,8,2,3.]],threshold:-2.3635339457541704e-003,right_val:0.2642767131328583,left_val:0.5631849169731140},{features:[[4,4,12,10,-1.],[10,4,6,5,2.],[4,9,6,5,2.]],threshold:0.0240177996456623,right_val:0.2751705944538117,left_val:0.5797107815742493},{features:[[6,4,4,4,-1.],[8,4,2,4,2.]],threshold:2.0543030404951423e-004,right_val:0.5752568840980530,left_val:0.2705242037773132},{features:[[15,11,1,2,-1.],[15,12,1,1,2.]],threshold:8.4790197433903813e-004,right_val:0.2334876954555512,left_val:0.5435624718666077},{features:[[3,11,2,2,-1.],[3,12,2,1,2.]],threshold:1.4091329649090767e-003,right_val:0.2063155025243759,left_val:0.5319424867630005},{features:[[16,11,1,3,-1.],[16,12,1,1,3.]],threshold:1.4642629539594054e-003,right_val:0.3068861067295075,left_val:0.5418980717658997},{features:[[3,15,6,4,-1.],[3,15,3,2,2.],[6,17,3,2,2.]],threshold:1.6352549428120255e-003,right_val:0.6112868189811707,left_val:0.3695372939109802},{features:[[6,7,8,2,-1.],[6,8,8,1,2.]],threshold:8.3172752056270838e-004,right_val:0.6025236248970032,left_val:0.3565036952495575},{features:[[3,11,1,3,-1.],[3,12,1,1,3.]],threshold:-2.0998890977352858e-003,right_val:0.5362827181816101,left_val:0.1913982033729553},{features:[[6,0,12,2,-1.],[6,1,12,1,2.]],threshold:-7.4213981861248612e-004,right_val:0.5529310107231140,left_val:0.3835555016994476},{features:[[9,14,2,3,-1.],[9,15,2,1,3.]],threshold:3.2655049581080675e-003,right_val:0.7101895809173584,left_val:0.4312896132469177},{features:[[7,15,6,2,-1.],[7,16,6,1,2.]],threshold:8.9134991867467761e-004,right_val:0.6391963958740234,left_val:0.3984830975532532},{features:[[0,5,4,6,-1.],[0,7,4,2,3.]],threshold:-0.0152841797098517,right_val:0.5433713793754578,left_val:0.2366732954978943},{features:[[4,12,12,2,-1.],[8,12,4,2,3.]],threshold:4.8381411470472813e-003,right_val:0.3239189088344574,left_val:0.5817500948905945},{features:[[6,3,1,9,-1.],[6,6,1,3,3.]],threshold:-9.1093179071322083e-004,right_val:0.2911868989467621,left_val:0.5540593862533569},{features:[[10,17,3,2,-1.],[11,17,1,2,3.]],threshold:-6.1275060288608074e-003,right_val:0.5196629166603088,left_val:0.1775255054235458},{features:[[9,9,2,2,-1.],[9,10,2,1,2.]],threshold:-4.4576259097084403e-004,right_val:0.5533593893051148,left_val:0.3024170100688934},{features:[[7,6,6,4,-1.],[9,6,2,4,3.]],threshold:0.0226465407758951,right_val:0.6975377202033997,left_val:0.4414930939674377},{features:[[7,17,3,2,-1.],[8,17,1,2,3.]],threshold:-1.8804960418492556e-003,right_val:0.5497952103614807,left_val:0.2791394889354706},{features:[[10,17,3,3,-1.],[11,17,1,3,3.]],threshold:7.0889107882976532e-003,right_val:0.2385547012090683,left_val:0.5263199210166931},{features:[[8,12,3,2,-1.],[8,13,3,1,2.]],threshold:1.7318050377070904e-003,right_val:0.6983600854873657,left_val:0.4319379031658173},{features:[[9,3,6,2,-1.],[11,3,2,2,3.]],threshold:-6.8482700735330582e-003,right_val:0.5390920042991638,left_val:0.3082042932510376},{features:[[3,11,14,4,-1.],[3,13,14,2,2.]],threshold:-1.5062530110299122e-005,right_val:0.3120366036891937,left_val:0.5521922111511231},{features:[[1,10,18,4,-1.],[10,10,9,2,2.],[1,12,9,2,2.]],threshold:0.0294755697250366,right_val:0.1770603060722351,left_val:0.5401322841644287},{features:[[0,10,3,3,-1.],[0,11,3,1,3.]],threshold:8.1387329846620560e-003,right_val:0.1211019009351730,left_val:0.5178617835044861},{features:[[9,1,6,6,-1.],[11,1,2,6,3.]],threshold:0.0209429506212473,right_val:0.3311221897602081,left_val:0.5290294289588928},{features:[[8,7,3,6,-1.],[9,7,1,6,3.]],threshold:-9.5665529370307922e-003,right_val:0.4451968967914581,left_val:0.7471994161605835}],threshold:18.4129695892333980},{simpleClassifiers:[{features:[[1,0,18,9,-1.],[1,3,18,3,3.]],threshold:-2.8206960996612906e-004,right_val:0.6076732277870178,left_val:0.2064086049795151},{features:[[12,10,2,6,-1.],[12,13,2,3,2.]],threshold:1.6790600493550301e-003,right_val:0.1255383938550949,left_val:0.5851997137069702},{features:[[0,5,19,8,-1.],[0,9,19,4,2.]],threshold:6.9827912375330925e-004,right_val:0.5728961229324341,left_val:0.0940184295177460},{features:[[7,0,6,9,-1.],[9,0,2,9,3.]],threshold:7.8959012171253562e-004,right_val:0.5694308876991272,left_val:0.1781987994909287},{features:[[5,3,6,1,-1.],[7,3,2,1,3.]],threshold:-2.8560499195009470e-003,right_val:0.5788664817810059,left_val:0.1638399064540863},{features:[[11,3,6,1,-1.],[13,3,2,1,3.]],threshold:-3.8122469559311867e-003,right_val:0.5508564710617065,left_val:0.2085440009832382},{features:[[5,10,4,6,-1.],[5,13,4,3,2.]],threshold:1.5896620461717248e-003,right_val:0.1857215017080307,left_val:0.5702760815620422},{features:[[11,3,6,1,-1.],[13,3,2,1,3.]],threshold:0.0100783398374915,right_val:0.2189770042896271,left_val:0.5116943120956421},{features:[[4,4,12,6,-1.],[4,6,12,2,3.]],threshold:-0.0635263025760651,right_val:0.4043813049793243,left_val:0.7131379842758179},{features:[[15,12,2,6,-1.],[15,14,2,2,3.]],threshold:-9.1031491756439209e-003,right_val:0.5463973283767700,left_val:0.2567181885242462},{features:[[9,3,2,2,-1.],[10,3,1,2,2.]],threshold:-2.4035000242292881e-003,right_val:0.5590974092483521,left_val:0.1700665950775147},{features:[[9,3,3,1,-1.],[10,3,1,1,3.]],threshold:1.5226360410451889e-003,right_val:0.2619054019451141,left_val:0.5410556793212891},{features:[[1,1,4,14,-1.],[3,1,2,14,2.]],threshold:0.0179974399507046,right_val:0.6535220742225647,left_val:0.3732436895370483},{features:[[9,0,4,4,-1.],[11,0,2,2,2.],[9,2,2,2,2.]],threshold:-6.4538191072642803e-003,right_val:0.5537446141242981,left_val:0.2626481950283051},{features:[[7,5,1,14,-1.],[7,12,1,7,2.]],threshold:-0.0118807600811124,right_val:0.5544745922088623,left_val:0.2003753930330277},{features:[[19,0,1,4,-1.],[19,2,1,2,2.]],threshold:1.2713660253211856e-003,right_val:0.3031975924968720,left_val:0.5591902732849121},{features:[[5,5,6,4,-1.],[8,5,3,4,2.]],threshold:1.1376109905540943e-003,right_val:0.5646508932113648,left_val:0.2730407118797302},{features:[[9,18,3,2,-1.],[10,18,1,2,3.]],threshold:-4.2651998810470104e-003,right_val:0.5461820960044861,left_val:0.1405909061431885},{features:[[8,18,3,2,-1.],[9,18,1,2,3.]],threshold:-2.9602861031889915e-003,right_val:0.5459290146827698,left_val:0.1795035004615784},{features:[[4,5,12,6,-1.],[4,7,12,2,3.]],threshold:-8.8448226451873779e-003,right_val:0.2809219956398010,left_val:0.5736783146858215},{features:[[3,12,2,6,-1.],[3,14,2,2,3.]],threshold:-6.6430689767003059e-003,right_val:0.5503826141357422,left_val:0.2370675951242447},{features:[[10,8,2,12,-1.],[10,12,2,4,3.]],threshold:3.9997808635234833e-003,right_val:0.3304282128810883,left_val:0.5608199834823608},{features:[[7,18,3,2,-1.],[8,18,1,2,3.]],threshold:-4.1221720166504383e-003,right_val:0.5378993153572083,left_val:0.1640105992555618},{features:[[9,0,6,2,-1.],[11,0,2,2,3.]],threshold:0.0156249096617103,right_val:0.2288603931665421,left_val:0.5227649211883545},{features:[[5,11,9,3,-1.],[5,12,9,1,3.]],threshold:-0.0103564197197557,right_val:0.4252927899360657,left_val:0.7016193866729736},{features:[[9,0,6,2,-1.],[11,0,2,2,3.]],threshold:-8.7960809469223022e-003,right_val:0.5355830192565918,left_val:0.2767347097396851},{features:[[1,1,18,5,-1.],[7,1,6,5,3.]],threshold:0.1622693985700607,right_val:0.7442579269409180,left_val:0.4342240095138550},{features:[[8,0,4,4,-1.],[10,0,2,2,2.],[8,2,2,2,2.]],threshold:4.5542530715465546e-003,right_val:0.2582125067710877,left_val:0.5726485848426819},{features:[[3,12,1,3,-1.],[3,13,1,1,3.]],threshold:-2.1309209987521172e-003,right_val:0.5361018776893616,left_val:0.2106848061084747},{features:[[8,14,5,3,-1.],[8,15,5,1,3.]],threshold:-0.0132084200158715,right_val:0.4552468061447144,left_val:0.7593790888786316},{features:[[5,4,10,12,-1.],[5,4,5,6,2.],[10,10,5,6,2.]],threshold:-0.0659966766834259,right_val:0.5344039797782898,left_val:0.1252475976943970},{features:[[9,6,9,12,-1.],[9,10,9,4,3.]],threshold:7.9142656177282333e-003,right_val:0.5601043105125427,left_val:0.3315384089946747},{features:[[2,2,12,14,-1.],[2,2,6,7,2.],[8,9,6,7,2.]],threshold:0.0208942797034979,right_val:0.2768838107585907,left_val:0.5506049990653992}],threshold:15.3241395950317380},{simpleClassifiers:[{features:[[4,7,12,2,-1.],[8,7,4,2,3.]],threshold:1.1961159761995077e-003,right_val:0.6156241297721863,left_val:0.1762690991163254},{features:[[7,4,6,4,-1.],[7,6,6,2,2.]],threshold:-1.8679830245673656e-003,right_val:0.1832399964332581,left_val:0.6118106842041016},{features:[[4,5,11,8,-1.],[4,9,11,4,2.]],threshold:-1.9579799845814705e-004,right_val:0.5723816156387329,left_val:0.0990442633628845},{features:[[3,10,16,4,-1.],[3,12,16,2,2.]],threshold:-8.0255657667294145e-004,right_val:0.2377282977104187,left_val:0.5579879879951477},{features:[[0,0,16,2,-1.],[0,1,16,1,2.]],threshold:-2.4510810617357492e-003,right_val:0.5858935117721558,left_val:0.2231457978487015},{features:[[7,5,6,2,-1.],[9,5,2,2,3.]],threshold:5.0361850298941135e-004,right_val:0.5794103741645813,left_val:0.2653993964195252},{features:[[3,2,6,10,-1.],[3,2,3,5,2.],[6,7,3,5,2.]],threshold:4.0293349884450436e-003,right_val:0.2484865039587021,left_val:0.5803827047348023},{features:[[10,5,8,15,-1.],[10,10,8,5,3.]],threshold:-0.0144517095759511,right_val:0.5484204888343811,left_val:0.1830351948738098},{features:[[3,14,8,6,-1.],[3,14,4,3,2.],[7,17,4,3,2.]],threshold:2.0380979403853416e-003,right_val:0.6051092743873596,left_val:0.3363558948040009},{features:[[14,2,2,2,-1.],[14,3,2,1,2.]],threshold:-1.6155190533027053e-003,right_val:0.5441246032714844,left_val:0.2286642044782639},{features:[[1,10,7,6,-1.],[1,13,7,3,2.]],threshold:3.3458340913057327e-003,right_val:0.2392338067293167,left_val:0.5625913143157959},{features:[[15,4,4,3,-1.],[15,4,2,3,2.]],threshold:1.6379579901695251e-003,right_val:0.5964621901512146,left_val:0.3906993865966797},{features:[[2,9,14,6,-1.],[2,9,7,3,2.],[9,12,7,3,2.]],threshold:0.0302512105554342,right_val:0.1575746983289719,left_val:0.5248482227325440},{features:[[5,7,10,4,-1.],[5,9,10,2,2.]],threshold:0.0372519902884960,right_val:0.6748418807983398,left_val:0.4194310903549194},{features:[[6,9,8,8,-1.],[6,9,4,4,2.],[10,13,4,4,2.]],threshold:-0.0251097902655602,right_val:0.5473451018333435,left_val:0.1882549971342087},{features:[[14,1,3,2,-1.],[14,2,3,1,2.]],threshold:-5.3099058568477631e-003,right_val:0.5227110981941223,left_val:0.1339973062276840},{features:[[1,4,4,2,-1.],[3,4,2,2,2.]],threshold:1.2086479691788554e-003,right_val:0.6109635829925537,left_val:0.3762088119983673},{features:[[11,10,2,8,-1.],[11,14,2,4,2.]],threshold:-0.0219076797366142,right_val:0.5404006838798523,left_val:0.2663142979145050},{features:[[0,0,5,3,-1.],[0,1,5,1,3.]],threshold:5.4116579703986645e-003,right_val:0.2232273072004318,left_val:0.5363578796386719},{features:[[2,5,18,8,-1.],[11,5,9,4,2.],[2,9,9,4,2.]],threshold:0.0699463263154030,right_val:0.2453698068857193,left_val:0.5358232855796814},{features:[[6,6,1,6,-1.],[6,9,1,3,2.]],threshold:3.4520021290518343e-004,right_val:0.5376930236816406,left_val:0.2409671992063522},{features:[[19,1,1,3,-1.],[19,2,1,1,3.]],threshold:1.2627709656953812e-003,right_val:0.3155693113803864,left_val:0.5425856709480286},{features:[[7,6,6,6,-1.],[9,6,2,6,3.]],threshold:0.0227195098996162,right_val:0.6597865223884583,left_val:0.4158405959606171},{features:[[19,1,1,3,-1.],[19,2,1,1,3.]],threshold:-1.8111000536009669e-003,right_val:0.5505244731903076,left_val:0.2811253070831299},{features:[[3,13,2,3,-1.],[3,14,2,1,3.]],threshold:3.3469670452177525e-003,right_val:0.1891465038061142,left_val:0.5260028243064880},{features:[[8,4,8,12,-1.],[12,4,4,6,2.],[8,10,4,6,2.]],threshold:4.0791751234792173e-004,right_val:0.3344210088253021,left_val:0.5673509240150452},{features:[[5,2,6,3,-1.],[7,2,2,3,3.]],threshold:0.0127347996458411,right_val:0.2395612001419067,left_val:0.5343592166900635},{features:[[6,1,9,10,-1.],[6,6,9,5,2.]],threshold:-7.3119727894663811e-003,right_val:0.4022207856178284,left_val:0.6010890007019043},{features:[[0,4,6,12,-1.],[2,4,2,12,3.]],threshold:-0.0569487512111664,right_val:0.4543190896511078,left_val:0.8199151158332825},{features:[[15,13,2,3,-1.],[15,14,2,1,3.]],threshold:-5.0116591155529022e-003,right_val:0.5357710719108582,left_val:0.2200281023979187},{features:[[7,14,5,3,-1.],[7,15,5,1,3.]],threshold:6.0334368608891964e-003,right_val:0.7181751132011414,left_val:0.4413081109523773},{features:[[15,13,3,3,-1.],[15,14,3,1,3.]],threshold:3.9437441155314445e-003,right_val:0.2791733145713806,left_val:0.5478860735893250},{features:[[6,14,8,3,-1.],[6,15,8,1,3.]],threshold:-3.6591119132936001e-003,right_val:0.3989723920822144,left_val:0.6357867717742920},{features:[[15,13,3,3,-1.],[15,14,3,1,3.]],threshold:-3.8456181064248085e-003,right_val:0.5300664901733398,left_val:0.3493686020374298},{features:[[2,13,3,3,-1.],[2,14,3,1,3.]],threshold:-7.1926261298358440e-003,right_val:0.5229672789573669,left_val:0.1119614988565445},{features:[[4,7,12,12,-1.],[10,7,6,6,2.],[4,13,6,6,2.]],threshold:-0.0527989417314529,right_val:0.5453451275825501,left_val:0.2387102991342545},{features:[[9,7,2,6,-1.],[10,7,1,6,2.]],threshold:-7.9537667334079742e-003,right_val:0.4439376890659332,left_val:0.7586917877197266},{features:[[8,9,5,2,-1.],[8,10,5,1,2.]],threshold:-2.7344180271029472e-003,right_val:0.5489321947097778,left_val:0.2565476894378662},{features:[[8,6,3,4,-1.],[9,6,1,4,3.]],threshold:-1.8507939530536532e-003,right_val:0.4252474904060364,left_val:0.6734347939491272},{features:[[9,6,2,8,-1.],[9,10,2,4,2.]],threshold:0.0159189198166132,right_val:0.2292661964893341,left_val:0.5488352775573731},{features:[[7,7,3,6,-1.],[8,7,1,6,3.]],threshold:-1.2687679845839739e-003,right_val:0.4022389948368073,left_val:0.6104331016540527},{features:[[11,3,3,3,-1.],[12,3,1,3,3.]],threshold:6.2883910723030567e-003,right_val:0.1536193042993546,left_val:0.5310853123664856},{features:[[5,4,6,1,-1.],[7,4,2,1,3.]],threshold:-6.2259892001748085e-003,right_val:0.5241606235504150,left_val:0.1729111969470978},{features:[[5,6,10,3,-1.],[5,7,10,1,3.]],threshold:-0.0121325999498367,right_val:0.4325182139873505,left_val:0.6597759723663330}],threshold:21.0106391906738280},{simpleClassifiers:[{features:[[7,3,6,9,-1.],[7,6,6,3,3.]],threshold:-3.9184908382594585e-003,right_val:0.1469330936670303,left_val:0.6103435158729553},{features:[[6,7,9,1,-1.],[9,7,3,1,3.]],threshold:1.5971299726516008e-003,right_val:0.5896466970443726,left_val:0.2632363140583038},{features:[[2,8,16,8,-1.],[2,12,16,4,2.]],threshold:0.0177801102399826,right_val:0.1760361939668655,left_val:0.5872874259948731},{features:[[14,6,2,6,-1.],[14,9,2,3,2.]],threshold:6.5334769897162914e-004,right_val:0.5596066117286682,left_val:0.1567801982164383},{features:[[1,5,6,15,-1.],[1,10,6,5,3.]],threshold:-2.8353091329336166e-004,right_val:0.5732036232948303,left_val:0.1913153976202011},{features:[[10,0,6,9,-1.],[10,3,6,3,3.]],threshold:1.6104689566418529e-003,right_val:0.5623080730438232,left_val:0.2914913892745972},{features:[[6,6,7,14,-1.],[6,13,7,7,2.]],threshold:-0.0977506190538406,right_val:0.5648233294487000,left_val:0.1943476945161820},{features:[[13,7,3,6,-1.],[13,9,3,2,3.]],threshold:5.5182358482852578e-004,right_val:0.5504639744758606,left_val:0.3134616911411285},{features:[[1,8,15,4,-1.],[6,8,5,4,3.]],threshold:-0.0128582203760743,right_val:0.5760142803192139,left_val:0.2536481916904450},{features:[[11,2,3,10,-1.],[11,7,3,5,2.]],threshold:4.1530239395797253e-003,right_val:0.3659774065017700,left_val:0.5767722129821777},{features:[[3,7,4,6,-1.],[3,9,4,2,3.]],threshold:1.7092459602281451e-003,right_val:0.5918939113616943,left_val:0.2843191027641296},{features:[[13,3,6,10,-1.],[15,3,2,10,3.]],threshold:7.5217359699308872e-003,right_val:0.6183109283447266,left_val:0.4052427113056183},{features:[[5,7,8,10,-1.],[5,7,4,5,2.],[9,12,4,5,2.]],threshold:2.2479810286313295e-003,right_val:0.3135401010513306,left_val:0.5783755183219910},{features:[[4,4,12,12,-1.],[10,4,6,6,2.],[4,10,6,6,2.]],threshold:0.0520062111318111,right_val:0.1916636973619461,left_val:0.5541312098503113},{features:[[1,4,6,9,-1.],[3,4,2,9,3.]],threshold:0.0120855299755931,right_val:0.6644591093063355,left_val:0.4032655954360962},{features:[[11,3,2,5,-1.],[11,3,1,5,2.]],threshold:1.4687820112158079e-005,right_val:0.5709382891654968,left_val:0.3535977900028229},{features:[[7,3,2,5,-1.],[8,3,1,5,2.]],threshold:7.1395188570022583e-006,right_val:0.5610269904136658,left_val:0.3037444949150085},{features:[[10,14,2,3,-1.],[10,15,2,1,3.]],threshold:-4.6001640148460865e-003,right_val:0.4580326080322266,left_val:0.7181087136268616},{features:[[5,12,6,2,-1.],[8,12,3,2,2.]],threshold:2.0058949012309313e-003,right_val:0.2953684031963348,left_val:0.5621951818466187},{features:[[9,14,2,3,-1.],[9,15,2,1,3.]],threshold:4.5050270855426788e-003,right_val:0.7619017958641052,left_val:0.4615387916564941},{features:[[4,11,12,6,-1.],[4,14,12,3,2.]],threshold:0.0117468303069472,right_val:0.1772529035806656,left_val:0.5343837141990662},{features:[[11,11,5,9,-1.],[11,14,5,3,3.]],threshold:-0.0583163388073444,right_val:0.5340772271156311,left_val:0.1686245948076248},{features:[[6,15,3,2,-1.],[6,16,3,1,2.]],threshold:2.3629379575140774e-004,right_val:0.6026803851127625,left_val:0.3792056143283844},{features:[[11,0,3,5,-1.],[12,0,1,5,3.]],threshold:-7.8156180679798126e-003,right_val:0.5324323773384094,left_val:0.1512867063283920},{features:[[5,5,6,7,-1.],[8,5,3,7,2.]],threshold:-0.0108761601150036,right_val:0.5319945216178894,left_val:0.2081822007894516},{features:[[13,0,1,9,-1.],[13,3,1,3,3.]],threshold:-2.7745519764721394e-003,right_val:0.5210328102111816,left_val:0.4098246991634369},{features:[[3,2,4,8,-1.],[3,2,2,4,2.],[5,6,2,4,2.]],threshold:-7.8276381827890873e-004,right_val:0.3478842079639435,left_val:0.5693274140357971},{features:[[13,12,4,6,-1.],[13,14,4,2,3.]],threshold:0.0138704096898437,right_val:0.2257698029279709,left_val:0.5326750874519348},{features:[[3,12,4,6,-1.],[3,14,4,2,3.]],threshold:-0.0236749108880758,right_val:0.5200707912445068,left_val:0.1551305055618286},{features:[[13,11,3,4,-1.],[13,13,3,2,2.]],threshold:-1.4879409718560055e-005,right_val:0.3820176124572754,left_val:0.5500566959381104},{features:[[4,4,4,3,-1.],[4,5,4,1,3.]],threshold:3.6190641112625599e-003,right_val:0.6639748215675354,left_val:0.4238683879375458},{features:[[7,5,11,8,-1.],[7,9,11,4,2.]],threshold:-0.0198171101510525,right_val:0.5382357835769653,left_val:0.2150038033723831},{features:[[7,8,3,4,-1.],[8,8,1,4,3.]],threshold:-3.8154039066284895e-003,right_val:0.4215297102928162,left_val:0.6675711274147034},{features:[[9,1,6,1,-1.],[11,1,2,1,3.]],threshold:-4.9775829538702965e-003,right_val:0.5386328101158142,left_val:0.2267289012670517},{features:[[5,5,3,3,-1.],[5,6,3,1,3.]],threshold:2.2441020701080561e-003,right_val:0.6855735778808594,left_val:0.4308691024780273},{features:[[0,9,20,6,-1.],[10,9,10,3,2.],[0,12,10,3,2.]],threshold:0.0122824599966407,right_val:0.3467479050159454,left_val:0.5836614966392517},{features:[[8,6,3,5,-1.],[9,6,1,5,3.]],threshold:-2.8548699337989092e-003,right_val:0.4311453998088837,left_val:0.7016944885253906},{features:[[11,0,1,3,-1.],[11,1,1,1,3.]],threshold:-3.7875669077038765e-003,right_val:0.5224946141242981,left_val:0.2895345091819763},{features:[[4,2,4,2,-1.],[4,3,4,1,2.]],threshold:-1.2201230274513364e-003,right_val:0.5481644868850708,left_val:0.2975570857524872},{features:[[12,6,4,3,-1.],[12,7,4,1,3.]],threshold:0.0101605998352170,right_val:0.8182697892189026,left_val:0.4888817965984345},{features:[[5,0,6,4,-1.],[7,0,2,4,3.]],threshold:-0.0161745697259903,right_val:0.5239992737770081,left_val:0.1481492966413498},{features:[[9,7,3,8,-1.],[10,7,1,8,3.]],threshold:0.0192924607545137,right_val:0.7378190755844116,left_val:0.4786309897899628},{features:[[9,7,2,2,-1.],[10,7,1,2,2.]],threshold:-3.2479539513587952e-003,right_val:0.4470643997192383,left_val:0.7374222874641419},{features:[[6,7,14,4,-1.],[13,7,7,2,2.],[6,9,7,2,2.]],threshold:-9.3803480267524719e-003,right_val:0.5537996292114258,left_val:0.3489154875278473},{features:[[0,5,3,6,-1.],[0,7,3,2,3.]],threshold:-0.0126061299815774,right_val:0.5315443277359009,left_val:0.2379686981439591},{features:[[13,11,3,4,-1.],[13,13,3,2,2.]],threshold:-0.0256219301372766,right_val:0.5138769745826721,left_val:0.1964688003063202},{features:[[4,11,3,4,-1.],[4,13,3,2,2.]],threshold:-7.5741496402770281e-005,right_val:0.3365853130817413,left_val:0.5590522885322571},{features:[[5,9,12,8,-1.],[11,9,6,4,2.],[5,13,6,4,2.]],threshold:-0.0892108827829361,right_val:0.5162634849548340,left_val:0.0634046569466591},{features:[[9,12,1,3,-1.],[9,13,1,1,3.]],threshold:-2.7670480776578188e-003,right_val:0.4490706026554108,left_val:0.7323467731475830},{features:[[10,15,2,4,-1.],[10,17,2,2,2.]],threshold:2.7152578695677221e-004,right_val:0.5985518097877502,left_val:0.4114834964275360}],threshold:23.9187908172607420},{simpleClassifiers:[{features:[[7,7,6,1,-1.],[9,7,2,1,3.]],threshold:1.4786219689995050e-003,right_val:0.6643316745758057,left_val:0.2663545012474060},{features:[[12,3,6,6,-1.],[15,3,3,3,2.],[12,6,3,3,2.]],threshold:-1.8741659587249160e-003,right_val:0.2518512904644013,left_val:0.6143848896026611},{features:[[0,4,10,6,-1.],[0,6,10,2,3.]],threshold:-1.7151009524241090e-003,right_val:0.2397463023662567,left_val:0.5766341090202332},{features:[[8,3,8,14,-1.],[12,3,4,7,2.],[8,10,4,7,2.]],threshold:-1.8939269939437509e-003,right_val:0.2529144883155823,left_val:0.5682045817375183},{features:[[4,4,7,15,-1.],[4,9,7,5,3.]],threshold:-5.3006052039563656e-003,right_val:0.5556079745292664,left_val:0.1640675961971283},{features:[[12,2,6,8,-1.],[15,2,3,4,2.],[12,6,3,4,2.]],threshold:-0.0466625317931175,right_val:0.4762830138206482,left_val:0.6123154163360596},{features:[[2,2,6,8,-1.],[2,2,3,4,2.],[5,6,3,4,2.]],threshold:-7.9431332414969802e-004,right_val:0.2839404046535492,left_val:0.5707858800888062},{features:[[2,13,18,7,-1.],[8,13,6,7,3.]],threshold:0.0148916700854898,right_val:0.6006367206573486,left_val:0.4089672863483429},{features:[[4,3,8,14,-1.],[4,3,4,7,2.],[8,10,4,7,2.]],threshold:-1.2046529445797205e-003,right_val:0.2705289125442505,left_val:0.5712450742721558},{features:[[18,1,2,6,-1.],[18,3,2,2,3.]],threshold:6.0619381256401539e-003,right_val:0.3262225985527039,left_val:0.5262504220008850},{features:[[9,11,2,3,-1.],[9,12,2,1,3.]],threshold:-2.5286648888140917e-003,right_val:0.4199256896972656,left_val:0.6853830814361572},{features:[[18,1,2,6,-1.],[18,3,2,2,3.]],threshold:-5.9010218828916550e-003,right_val:0.5434812903404236,left_val:0.3266282081604004},{features:[[0,1,2,6,-1.],[0,3,2,2,3.]],threshold:5.6702760048210621e-003,right_val:0.2319003939628601,left_val:0.5468410849571228},{features:[[1,5,18,6,-1.],[1,7,18,2,3.]],threshold:-3.0304100364446640e-003,right_val:0.2708238065242767,left_val:0.5570667982101440},{features:[[0,2,6,7,-1.],[3,2,3,7,2.]],threshold:2.9803649522364140e-003,right_val:0.5890625715255737,left_val:0.3700568974018097},{features:[[7,3,6,14,-1.],[7,10,6,7,2.]],threshold:-0.0758405104279518,right_val:0.5419948101043701,left_val:0.2140070050954819},{features:[[3,7,13,10,-1.],[3,12,13,5,2.]],threshold:0.0192625392228365,right_val:0.2726590037345886,left_val:0.5526772141456604},{features:[[11,15,2,2,-1.],[11,16,2,1,2.]],threshold:1.8888259364757687e-004,right_val:0.6017209887504578,left_val:0.3958011865615845},{features:[[2,11,16,4,-1.],[2,11,8,2,2.],[10,13,8,2,2.]],threshold:0.0293695498257875,right_val:0.1435758024454117,left_val:0.5241373777389526},{features:[[13,7,6,4,-1.],[16,7,3,2,2.],[13,9,3,2,2.]],threshold:1.0417619487270713e-003,right_val:0.5929983258247376,left_val:0.3385409116744995},{features:[[6,10,3,9,-1.],[6,13,3,3,3.]],threshold:2.6125640142709017e-003,right_val:0.3021597862243652,left_val:0.5485377907752991},{features:[[14,6,1,6,-1.],[14,9,1,3,2.]],threshold:9.6977467183023691e-004,right_val:0.5532032847404480,left_val:0.3375276029109955},{features:[[5,10,4,1,-1.],[7,10,2,1,2.]],threshold:5.9512659208849072e-004,right_val:0.3359399139881134,left_val:0.5631743073463440},{features:[[3,8,15,5,-1.],[8,8,5,5,3.]],threshold:-0.1015655994415283,right_val:0.5230425000190735,left_val:0.0637350380420685},{features:[[1,6,5,4,-1.],[1,8,5,2,2.]],threshold:0.0361566990613937,right_val:0.1029528975486755,left_val:0.5136963129043579},{features:[[3,1,17,6,-1.],[3,3,17,2,3.]],threshold:3.4624140243977308e-003,right_val:0.5558289289474487,left_val:0.3879320025444031},{features:[[6,7,8,2,-1.],[10,7,4,2,2.]],threshold:0.0195549800992012,right_val:0.1875859946012497,left_val:0.5250086784362793},{features:[[9,7,3,2,-1.],[10,7,1,2,3.]],threshold:-2.3121440317481756e-003,right_val:0.4679641127586365,left_val:0.6672028899192810},{features:[[8,7,3,2,-1.],[9,7,1,2,3.]],threshold:-1.8605289515107870e-003,right_val:0.4334670901298523,left_val:0.7163379192352295},{features:[[8,9,4,2,-1.],[8,10,4,1,2.]],threshold:-9.4026362057775259e-004,right_val:0.5650203227996826,left_val:0.3021360933780670},{features:[[8,8,4,3,-1.],[8,9,4,1,3.]],threshold:-5.2418331615626812e-003,right_val:0.5250256061553955,left_val:0.1820009052753449},{features:[[9,5,6,4,-1.],[9,5,3,4,2.]],threshold:1.1729019752237946e-004,right_val:0.5445973277091980,left_val:0.3389188051223755},{features:[[8,13,4,3,-1.],[8,14,4,1,3.]],threshold:1.1878840159624815e-003,right_val:0.6253563165664673,left_val:0.4085349142551422},{features:[[4,7,12,6,-1.],[10,7,6,3,2.],[4,10,6,3,2.]],threshold:-0.0108813596889377,right_val:0.5700082778930664,left_val:0.3378399014472961},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:1.7354859737679362e-003,right_val:0.6523038744926453,left_val:0.4204635918140411},{features:[[9,7,3,3,-1.],[9,8,3,1,3.]],threshold:-6.5119052305817604e-003,right_val:0.5428143739700317,left_val:0.2595216035842896},{features:[[7,4,3,8,-1.],[8,4,1,8,3.]],threshold:-1.2136430013924837e-003,right_val:0.3977893888950348,left_val:0.6165143847465515},{features:[[10,0,3,6,-1.],[11,0,1,6,3.]],threshold:-0.0103542404249310,right_val:0.5219504833221436,left_val:0.1628028005361557},{features:[[6,3,4,8,-1.],[8,3,2,8,2.]],threshold:5.5858830455690622e-004,right_val:0.5503574013710022,left_val:0.3199650943279266},{features:[[14,3,6,13,-1.],[14,3,3,13,2.]],threshold:0.0152996499091387,right_val:0.6122388243675232,left_val:0.4103994071483612},{features:[[8,13,3,6,-1.],[8,16,3,3,2.]],threshold:-0.0215882100164890,right_val:0.5197384953498840,left_val:0.1034912988543510},{features:[[14,3,6,13,-1.],[14,3,3,13,2.]],threshold:-0.1283462941646576,right_val:0.4893102943897247,left_val:0.8493865132331848},{features:[[0,7,10,4,-1.],[0,7,5,2,2.],[5,9,5,2,2.]],threshold:-2.2927189711481333e-003,right_val:0.5471575260162354,left_val:0.3130157887935638},{features:[[14,3,6,13,-1.],[14,3,3,13,2.]],threshold:0.0799151062965393,right_val:0.6073989272117615,left_val:0.4856320917606354},{features:[[0,3,6,13,-1.],[3,3,3,13,2.]],threshold:-0.0794410929083824,right_val:0.4624533057212830,left_val:0.8394674062728882},{features:[[9,1,4,1,-1.],[9,1,2,1,2.]],threshold:-5.2800010889768600e-003,right_val:0.5306698083877564,left_val:0.1881695985794067},{features:[[8,0,2,1,-1.],[9,0,1,1,2.]],threshold:1.0463109938427806e-003,right_val:0.2583065927028656,left_val:0.5271229147911072},{features:[[10,16,4,4,-1.],[12,16,2,2,2.],[10,18,2,2,2.]],threshold:2.6317298761568964e-004,right_val:0.5735440850257874,left_val:0.4235304892063141},{features:[[9,6,2,3,-1.],[10,6,1,3,2.]],threshold:-3.6173160187900066e-003,right_val:0.4495444893836975,left_val:0.6934396028518677},{features:[[4,5,12,2,-1.],[8,5,4,2,3.]],threshold:0.0114218797534704,right_val:0.4138193130493164,left_val:0.5900921225547791},{features:[[8,7,3,5,-1.],[9,7,1,5,3.]],threshold:-1.9963278900831938e-003,right_val:0.4327239990234375,left_val:0.6466382741928101}],threshold:24.5278797149658200},{simpleClassifiers:[{features:[[6,4,8,6,-1.],[6,6,8,2,3.]],threshold:-9.9691245704889297e-003,right_val:0.2482212036848068,left_val:0.6142324209213257},{features:[[9,5,2,12,-1.],[9,11,2,6,2.]],threshold:7.3073059320449829e-004,right_val:0.2321965992450714,left_val:0.5704951882362366},{features:[[4,6,6,8,-1.],[4,10,6,4,2.]],threshold:6.4045301405712962e-004,right_val:0.5814933180809021,left_val:0.2112251967191696},{features:[[12,2,8,5,-1.],[12,2,4,5,2.]],threshold:4.5424019917845726e-003,right_val:0.5866311788558960,left_val:0.2950482070446014},{features:[[0,8,18,3,-1.],[0,9,18,1,3.]],threshold:9.2477443104144186e-005,right_val:0.5791326761245728,left_val:0.2990990877151489},{features:[[8,12,4,8,-1.],[8,16,4,4,2.]],threshold:-8.6603146046400070e-003,right_val:0.5635542273521423,left_val:0.2813029885292053},{features:[[0,2,8,5,-1.],[4,2,4,5,2.]],threshold:8.0515816807746887e-003,right_val:0.6054757237434387,left_val:0.3535369038581848},{features:[[13,11,3,4,-1.],[13,13,3,2,2.]],threshold:4.3835240649059415e-004,right_val:0.2731510996818543,left_val:0.5596532225608826},{features:[[5,11,6,1,-1.],[7,11,2,1,3.]],threshold:-9.8168973636347800e-005,right_val:0.3638561069965363,left_val:0.5978031754493713},{features:[[11,3,3,1,-1.],[12,3,1,1,3.]],threshold:-1.1298790341243148e-003,right_val:0.5432729125022888,left_val:0.2755252122879028},{features:[[7,13,5,3,-1.],[7,14,5,1,3.]],threshold:6.4356150105595589e-003,right_val:0.7069833278656006,left_val:0.4305641949176788},{features:[[11,11,7,6,-1.],[11,14,7,3,2.]],threshold:-0.0568293295800686,right_val:0.5294997096061707,left_val:0.2495242953300476},{features:[[2,11,7,6,-1.],[2,14,7,3,2.]],threshold:4.0668169967830181e-003,right_val:0.2497723996639252,left_val:0.5478553175926209},{features:[[12,14,2,6,-1.],[12,16,2,2,3.]],threshold:4.8164798499783501e-005,right_val:0.5706356167793274,left_val:0.3938601016998291},{features:[[8,14,3,3,-1.],[8,15,3,1,3.]],threshold:6.1795017682015896e-003,right_val:0.7394766807556152,left_val:0.4407606124877930},{features:[[11,0,3,5,-1.],[12,0,1,5,3.]],threshold:6.4985752105712891e-003,right_val:0.2479152977466583,left_val:0.5445243120193481},{features:[[6,1,4,9,-1.],[8,1,2,9,2.]],threshold:-1.0211090557277203e-003,right_val:0.5338971018791199,left_val:0.2544766962528229},{features:[[10,3,6,1,-1.],[12,3,2,1,3.]],threshold:-5.4247528314590454e-003,right_val:0.5324069261550903,left_val:0.2718858122825623},{features:[[8,8,3,4,-1.],[8,10,3,2,2.]],threshold:-1.0559899965301156e-003,right_val:0.5534508824348450,left_val:0.3178288042545319},{features:[[8,12,4,2,-1.],[8,13,4,1,2.]],threshold:6.6465808777138591e-004,right_val:0.6558194160461426,left_val:0.4284219145774841},{features:[[5,18,4,2,-1.],[5,19,4,1,2.]],threshold:-2.7524109464138746e-004,right_val:0.3810262978076935,left_val:0.5902860760688782},{features:[[2,1,18,6,-1.],[2,3,18,2,3.]],threshold:4.2293202131986618e-003,right_val:0.5709385871887207,left_val:0.3816489875316620},{features:[[6,0,3,2,-1.],[7,0,1,2,3.]],threshold:-3.2868210691958666e-003,right_val:0.5259544253349304,left_val:0.1747743934392929},{features:[[13,8,6,2,-1.],[16,8,3,1,2.],[13,9,3,1,2.]],threshold:1.5611879643984139e-004,right_val:0.5725612044334412,left_val:0.3601722121238709},{features:[[6,10,3,6,-1.],[6,13,3,3,2.]],threshold:-7.3621381488919724e-006,right_val:0.3044497072696686,left_val:0.5401858091354370},{features:[[0,13,20,4,-1.],[10,13,10,2,2.],[0,15,10,2,2.]],threshold:-0.0147672500461340,right_val:0.5573434829711914,left_val:0.3220770061016083},{features:[[7,7,6,5,-1.],[9,7,2,5,3.]],threshold:0.0244895908981562,right_val:0.6518812775611877,left_val:0.4301528036594391},{features:[[11,0,2,2,-1.],[11,1,2,1,2.]],threshold:-3.7652091123163700e-004,right_val:0.5598236918449402,left_val:0.3564583063125610},{features:[[1,8,6,2,-1.],[1,8,3,1,2.],[4,9,3,1,2.]],threshold:7.3657688517414499e-006,right_val:0.5561897754669190,left_val:0.3490782976150513},{features:[[0,2,20,2,-1.],[10,2,10,1,2.],[0,3,10,1,2.]],threshold:-0.0150999398902059,right_val:0.5335299968719482,left_val:0.1776272058486939},{features:[[7,14,5,3,-1.],[7,15,5,1,3.]],threshold:-3.8316650316119194e-003,right_val:0.4221394062042236,left_val:0.6149687767028809},{features:[[7,13,6,6,-1.],[10,13,3,3,2.],[7,16,3,3,2.]],threshold:0.0169254001230001,right_val:0.2166585028171539,left_val:0.5413014888763428},{features:[[9,12,2,3,-1.],[9,13,2,1,3.]],threshold:-3.0477850232273340e-003,right_val:0.4354617893695831,left_val:0.6449490785598755},{features:[[16,11,1,6,-1.],[16,13,1,2,3.]],threshold:3.2140589319169521e-003,right_val:0.3523217141628265,left_val:0.5400155186653137},{features:[[3,11,1,6,-1.],[3,13,1,2,3.]],threshold:-4.0023201145231724e-003,right_val:0.5338417291641235,left_val:0.2774524092674255},{features:[[4,4,14,12,-1.],[11,4,7,6,2.],[4,10,7,6,2.]],threshold:7.4182129465043545e-003,right_val:0.3702817857265472,left_val:0.5676739215850830},{features:[[5,4,3,3,-1.],[5,5,3,1,3.]],threshold:-8.8764587417244911e-003,right_val:0.4583688974380493,left_val:0.7749221920967102},{features:[[12,3,3,3,-1.],[13,3,1,3,3.]],threshold:2.7311739977449179e-003,right_val:0.3996661007404327,left_val:0.5338721871376038},{features:[[6,6,8,3,-1.],[6,7,8,1,3.]],threshold:-2.5082379579544067e-003,right_val:0.3777498900890350,left_val:0.5611963272094727},{features:[[12,3,3,3,-1.],[13,3,1,3,3.]],threshold:-8.0541074275970459e-003,right_val:0.5179182887077332,left_val:0.2915228903293610},{features:[[3,1,4,10,-1.],[3,1,2,5,2.],[5,6,2,5,2.]],threshold:-9.7938813269138336e-004,right_val:0.3700192868709564,left_val:0.5536432862281799},{features:[[5,7,10,2,-1.],[5,7,5,2,2.]],threshold:-5.8745909482240677e-003,right_val:0.5679376125335693,left_val:0.3754391074180603},{features:[[8,7,3,3,-1.],[9,7,1,3,3.]],threshold:-4.4936719350516796e-003,right_val:0.4480949938297272,left_val:0.7019699215888977},{features:[[15,12,2,3,-1.],[15,13,2,1,3.]],threshold:-5.4389229044318199e-003,right_val:0.5313386917114258,left_val:0.2310364991426468},{features:[[7,8,3,4,-1.],[8,8,1,4,3.]],threshold:-7.5094640487805009e-004,right_val:0.4129343032836914,left_val:0.5864868760108948},{features:[[13,4,1,12,-1.],[13,10,1,6,2.]],threshold:1.4528800420521293e-005,right_val:0.5619621276855469,left_val:0.3732407093048096},{features:[[4,5,12,12,-1.],[4,5,6,6,2.],[10,11,6,6,2.]],threshold:0.0407580696046352,right_val:0.2720521986484528,left_val:0.5312091112136841},{features:[[7,14,7,3,-1.],[7,15,7,1,3.]],threshold:6.6505931317806244e-003,right_val:0.6693493723869324,left_val:0.4710015952587128},{features:[[3,12,2,3,-1.],[3,13,2,1,3.]],threshold:4.5759351924061775e-003,right_val:0.1637275964021683,left_val:0.5167819261550903},{features:[[3,2,14,2,-1.],[10,2,7,1,2.],[3,3,7,1,2.]],threshold:6.5269311890006065e-003,right_val:0.2938531935214996,left_val:0.5397608876228333},{features:[[0,1,3,10,-1.],[1,1,1,10,3.]],threshold:-0.0136603796854615,right_val:0.4532200098037720,left_val:0.7086488008499146},{features:[[9,0,6,5,-1.],[11,0,2,5,3.]],threshold:0.0273588690906763,right_val:0.3589231967926025,left_val:0.5206481218338013},{features:[[5,7,6,2,-1.],[8,7,3,2,2.]],threshold:6.2197551596909761e-004,right_val:0.5441123247146606,left_val:0.3507075905799866},{features:[[7,1,6,10,-1.],[7,6,6,5,2.]],threshold:-3.3077080734074116e-003,right_val:0.4024891853332520,left_val:0.5859522819519043},{features:[[1,1,18,3,-1.],[7,1,6,3,3.]],threshold:-0.0106311095878482,right_val:0.4422602951526642,left_val:0.6743267178535461},{features:[[16,3,3,6,-1.],[16,5,3,2,3.]],threshold:0.0194416493177414,right_val:0.1797904968261719,left_val:0.5282716155052185}],threshold:27.1533508300781250},{simpleClassifiers:[{features:[[6,3,7,6,-1.],[6,6,7,3,2.]],threshold:-5.5052167735993862e-003,right_val:0.2626559138298035,left_val:0.5914731025695801},{features:[[4,7,12,2,-1.],[8,7,4,2,3.]],threshold:1.9562279339879751e-003,right_val:0.5741627216339111,left_val:0.2312581986188889},{features:[[0,4,17,10,-1.],[0,9,17,5,2.]],threshold:-8.8924784213304520e-003,right_val:0.5626654028892517,left_val:0.1656530052423477},{features:[[3,4,15,16,-1.],[3,12,15,8,2.]],threshold:0.0836383774876595,right_val:0.1957294940948486,left_val:0.5423449873924255},{features:[[7,15,6,4,-1.],[7,17,6,2,2.]],threshold:1.2282270472496748e-003,right_val:0.5992503762245178,left_val:0.3417904078960419},{features:[[15,2,4,9,-1.],[15,2,2,9,2.]],threshold:5.7629169896245003e-003,right_val:0.6079903841018677,left_val:0.3719581961631775},{features:[[2,3,3,2,-1.],[2,4,3,1,2.]],threshold:-1.6417410224676132e-003,right_val:0.5576915740966797,left_val:0.2577486038208008},{features:[[13,6,7,9,-1.],[13,9,7,3,3.]],threshold:3.4113149158656597e-003,right_val:0.5514171719551086,left_val:0.2950749099254608},{features:[[8,11,4,3,-1.],[8,12,4,1,3.]],threshold:-0.0110693201422691,right_val:0.4477078914642334,left_val:0.7569358944892883},{features:[[0,2,20,6,-1.],[10,2,10,3,2.],[0,5,10,3,2.]],threshold:0.0348659716546535,right_val:0.2669621109962463,left_val:0.5583708882331848},{features:[[3,2,6,10,-1.],[3,2,3,5,2.],[6,7,3,5,2.]],threshold:6.5701099811121821e-004,right_val:0.2988890111446381,left_val:0.5627313256263733},{features:[[13,10,3,4,-1.],[13,12,3,2,2.]],threshold:-0.0243391301482916,right_val:0.5108863115310669,left_val:0.2771185040473938},{features:[[4,10,3,4,-1.],[4,12,3,2,2.]],threshold:5.9435202274471521e-004,right_val:0.3120341897010803,left_val:0.5580651760101318},{features:[[7,5,6,3,-1.],[9,5,2,3,3.]],threshold:2.2971509024500847e-003,right_val:0.5679075717926025,left_val:0.3330250084400177},{features:[[7,6,6,8,-1.],[7,10,6,4,2.]],threshold:-3.7801829166710377e-003,right_val:0.5344808101654053,left_val:0.2990534901618958},{features:[[0,11,20,6,-1.],[0,14,20,3,2.]],threshold:-0.1342066973447800,right_val:0.5392568111419678,left_val:0.1463858932256699},{features:[[4,13,4,6,-1.],[4,13,2,3,2.],[6,16,2,3,2.]],threshold:7.5224548345431685e-004,right_val:0.5692734718322754,left_val:0.3746953904628754},{features:[[6,0,8,12,-1.],[10,0,4,6,2.],[6,6,4,6,2.]],threshold:-0.0405455417931080,right_val:0.5484297871589661,left_val:0.2754747867584229},{features:[[2,0,15,2,-1.],[2,1,15,1,2.]],threshold:1.2572970008477569e-003,right_val:0.5756075978279114,left_val:0.3744584023952484},{features:[[9,12,2,3,-1.],[9,13,2,1,3.]],threshold:-7.4249948374927044e-003,right_val:0.4728231132030487,left_val:0.7513859272003174},{features:[[3,12,1,2,-1.],[3,13,1,1,2.]],threshold:5.0908129196614027e-004,right_val:0.2932321131229401,left_val:0.5404896736145020},{features:[[9,11,2,3,-1.],[9,12,2,1,3.]],threshold:-1.2808450264856219e-003,right_val:0.4273349046707153,left_val:0.6169779896736145},{features:[[7,3,3,1,-1.],[8,3,1,1,3.]],threshold:-1.8348860321566463e-003,right_val:0.5206472277641296,left_val:0.2048496007919312},{features:[[17,7,3,6,-1.],[17,9,3,2,3.]],threshold:0.0274848695844412,right_val:0.1675522029399872,left_val:0.5252984762191773},{features:[[7,2,3,2,-1.],[8,2,1,2,3.]],threshold:2.2372419480234385e-003,right_val:0.2777658104896545,left_val:0.5267782807350159},{features:[[11,4,5,3,-1.],[11,5,5,1,3.]],threshold:-8.8635291904211044e-003,right_val:0.4812048971652985,left_val:0.6954557895660400},{features:[[4,4,5,3,-1.],[4,5,5,1,3.]],threshold:4.1753971017897129e-003,right_val:0.6349195837974548,left_val:0.4291887879371643},{features:[[19,3,1,2,-1.],[19,4,1,1,2.]],threshold:-1.7098189564421773e-003,right_val:0.5361248850822449,left_val:0.2930536866188049},{features:[[5,5,4,3,-1.],[5,6,4,1,3.]],threshold:6.5328548662364483e-003,right_val:0.7409694194793701,left_val:0.4495325088500977},{features:[[17,7,3,6,-1.],[17,9,3,2,3.]],threshold:-9.5372907817363739e-003,right_val:0.5416501760482788,left_val:0.3149119913578033},{features:[[0,7,3,6,-1.],[0,9,3,2,3.]],threshold:0.0253109894692898,right_val:0.1311707943677902,left_val:0.5121892094612122},{features:[[14,2,6,9,-1.],[14,5,6,3,3.]],threshold:0.0364609695971012,right_val:0.2591339945793152,left_val:0.5175911784172058},{features:[[0,4,5,6,-1.],[0,6,5,2,3.]],threshold:0.0208543296903372,right_val:0.1582316011190414,left_val:0.5137140154838562},{features:[[10,5,6,2,-1.],[12,5,2,2,3.]],threshold:-8.7207747856155038e-004,right_val:0.4398978948593140,left_val:0.5574309825897217},{features:[[4,5,6,2,-1.],[6,5,2,2,3.]],threshold:-1.5227000403683633e-005,right_val:0.3708069920539856,left_val:0.5548940896987915},{features:[[8,1,4,6,-1.],[8,3,4,2,3.]],threshold:-8.4316509310156107e-004,right_val:0.5554211139678955,left_val:0.3387419879436493},{features:[[0,2,3,6,-1.],[0,4,3,2,3.]],threshold:3.6037859972566366e-003,right_val:0.3411171138286591,left_val:0.5358061790466309},{features:[[6,6,8,3,-1.],[6,7,8,1,3.]],threshold:-6.8057891912758350e-003,right_val:0.4345862865447998,left_val:0.6125202775001526},{features:[[0,1,5,9,-1.],[0,4,5,3,3.]],threshold:-0.0470216609537601,right_val:0.5193738937377930,left_val:0.2358165979385376},{features:[[16,0,4,15,-1.],[16,0,2,15,2.]],threshold:-0.0369541086256504,right_val:0.4760943949222565,left_val:0.7323111295700073},{features:[[1,10,3,2,-1.],[1,11,3,1,2.]],threshold:1.0439479956403375e-003,right_val:0.3411330878734589,left_val:0.5419455170631409},{features:[[14,4,1,10,-1.],[14,9,1,5,2.]],threshold:-2.1050689974799752e-004,right_val:0.5554947257041931,left_val:0.2821694016456604},{features:[[0,1,4,12,-1.],[2,1,2,12,2.]],threshold:-0.0808315873146057,right_val:0.4697434902191162,left_val:0.9129930138587952},{features:[[11,11,4,2,-1.],[11,11,2,2,2.]],threshold:-3.6579059087671340e-004,right_val:0.3978292942047119,left_val:0.6022670269012451},{features:[[5,11,4,2,-1.],[7,11,2,2,2.]],threshold:-1.2545920617412776e-004,right_val:0.3845539987087250,left_val:0.5613213181495667},{features:[[3,8,15,5,-1.],[8,8,5,5,3.]],threshold:-0.0687864869832993,right_val:0.5300496816635132,left_val:0.2261611968278885},{features:[[0,0,6,10,-1.],[3,0,3,10,2.]],threshold:0.0124157899990678,right_val:0.5828812122344971,left_val:0.4075691998004913},{features:[[11,4,3,2,-1.],[12,4,1,2,3.]],threshold:-4.7174817882478237e-003,right_val:0.5267757773399353,left_val:0.2827253937721252},{features:[[8,12,3,8,-1.],[8,16,3,4,2.]],threshold:0.0381368584930897,right_val:0.1023615971207619,left_val:0.5074741244316101},{features:[[8,14,5,3,-1.],[8,15,5,1,3.]],threshold:-2.8168049175292253e-003,right_val:0.4359692931175232,left_val:0.6169006824493408},{features:[[7,14,4,3,-1.],[7,15,4,1,3.]],threshold:8.1303603947162628e-003,right_val:0.7606095075607300,left_val:0.4524433016777039},{features:[[11,4,3,2,-1.],[12,4,1,2,3.]],threshold:6.0056019574403763e-003,right_val:0.1859712004661560,left_val:0.5240408778190613},{features:[[3,15,14,4,-1.],[3,15,7,2,2.],[10,17,7,2,2.]],threshold:0.0191393196582794,right_val:0.2332071959972382,left_val:0.5209379196166992},{features:[[2,2,16,4,-1.],[10,2,8,2,2.],[2,4,8,2,2.]],threshold:0.0164457596838474,right_val:0.3264234960079193,left_val:0.5450702905654907},{features:[[0,8,6,12,-1.],[3,8,3,12,2.]],threshold:-0.0373568907380104,right_val:0.4533241987228394,left_val:0.6999046802520752},{features:[[5,7,10,2,-1.],[5,7,5,2,2.]],threshold:-0.0197279006242752,right_val:0.5412809848785400,left_val:0.2653664946556091},{features:[[9,7,2,5,-1.],[10,7,1,5,2.]],threshold:6.6972579807043076e-003,right_val:0.7138652205467224,left_val:0.4480566084384918},{features:[[13,7,6,4,-1.],[16,7,3,2,2.],[13,9,3,2,2.]],threshold:7.4457528535276651e-004,right_val:0.5471320152282715,left_val:0.4231350123882294},{features:[[0,13,8,2,-1.],[0,14,8,1,2.]],threshold:1.1790640419349074e-003,right_val:0.3130455017089844,left_val:0.5341702103614807},{features:[[13,7,6,4,-1.],[16,7,3,2,2.],[13,9,3,2,2.]],threshold:0.0349806100130081,right_val:0.3430530130863190,left_val:0.5118659734725952},{features:[[1,7,6,4,-1.],[1,7,3,2,2.],[4,9,3,2,2.]],threshold:5.6859792675822973e-004,right_val:0.5468639731407166,left_val:0.3532187044620514},{features:[[12,6,1,12,-1.],[12,12,1,6,2.]],threshold:-0.0113406497985125,right_val:0.5348700881004334,left_val:0.2842353880405426},{features:[[9,5,2,6,-1.],[10,5,1,6,2.]],threshold:-6.6228108480572701e-003,right_val:0.4492664933204651,left_val:0.6883640289306641},{features:[[14,12,2,3,-1.],[14,13,2,1,3.]],threshold:-8.0160330981016159e-003,right_val:0.5224308967590332,left_val:0.1709893941879273},{features:[[4,12,2,3,-1.],[4,13,2,1,3.]],threshold:1.4206819469109178e-003,right_val:0.2993383109569550,left_val:0.5290846228599548},{features:[[8,12,4,3,-1.],[8,13,4,1,3.]],threshold:-2.7801711112260818e-003,right_val:0.4460499882698059,left_val:0.6498854160308838},{features:[[5,2,2,4,-1.],[5,2,1,2,2.],[6,4,1,2,2.]],threshold:-1.4747589593753219e-003,right_val:0.5388113260269165,left_val:0.3260438144207001},{features:[[5,5,11,3,-1.],[5,6,11,1,3.]],threshold:-0.0238303393125534,right_val:0.4801219999790192,left_val:0.7528941035270691},{features:[[7,6,4,12,-1.],[7,12,4,6,2.]],threshold:6.9369790144264698e-003,right_val:0.3261427879333496,left_val:0.5335165858268738},{features:[[12,13,8,5,-1.],[12,13,4,5,2.]],threshold:8.2806255668401718e-003,right_val:0.5737829804420471,left_val:0.4580394029617310},{features:[[7,6,1,12,-1.],[7,12,1,6,2.]],threshold:-0.0104395002126694,right_val:0.5233827829360962,left_val:0.2592320144176483}],threshold:34.5541114807128910},{simpleClassifiers:[{features:[[1,2,6,3,-1.],[4,2,3,3,2.]],threshold:7.2006587870419025e-003,right_val:0.6849808096885681,left_val:0.3258886039257050},{features:[[9,5,6,10,-1.],[12,5,3,5,2.],[9,10,3,5,2.]],threshold:-2.8593589086085558e-003,right_val:0.2537829875946045,left_val:0.5838881134986877},{features:[[5,5,8,12,-1.],[5,5,4,6,2.],[9,11,4,6,2.]],threshold:6.8580528022721410e-004,right_val:0.2812424004077911,left_val:0.5708081722259522},{features:[[0,7,20,6,-1.],[0,9,20,2,3.]],threshold:7.9580191522836685e-003,right_val:0.5544260740280151,left_val:0.2501051127910614},{features:[[4,2,2,2,-1.],[4,3,2,1,2.]],threshold:-1.2124150525778532e-003,right_val:0.5433350205421448,left_val:0.2385368049144745},{features:[[4,18,12,2,-1.],[8,18,4,2,3.]],threshold:7.9426132142543793e-003,right_val:0.6220757961273193,left_val:0.3955070972442627},{features:[[7,4,4,16,-1.],[7,12,4,8,2.]],threshold:2.4630590341985226e-003,right_val:0.2992357909679413,left_val:0.5639708042144775},{features:[[7,6,7,8,-1.],[7,10,7,4,2.]],threshold:-6.0396599583327770e-003,right_val:0.5411676764488220,left_val:0.2186512947082520},{features:[[6,3,3,1,-1.],[7,3,1,1,3.]],threshold:-1.2988339876756072e-003,right_val:0.5364584922790527,left_val:0.2350706011056900},{features:[[11,15,2,4,-1.],[11,17,2,2,2.]],threshold:2.2299369447864592e-004,right_val:0.5729606151580811,left_val:0.3804112970829010},{features:[[3,5,4,8,-1.],[3,9,4,4,2.]],threshold:1.4654280385002494e-003,right_val:0.5258268713951111,left_val:0.2510167956352234},{features:[[7,1,6,12,-1.],[7,7,6,6,2.]],threshold:-8.1210042117163539e-004,right_val:0.3851158916950226,left_val:0.5992823839187622},{features:[[4,6,6,2,-1.],[6,6,2,2,3.]],threshold:-1.3836020370945334e-003,right_val:0.3636586964130402,left_val:0.5681396126747131},{features:[[16,4,4,6,-1.],[16,6,4,2,3.]],threshold:-0.0279364492744207,right_val:0.5377560257911682,left_val:0.1491317003965378},{features:[[3,3,5,2,-1.],[3,4,5,1,2.]],threshold:-4.6919551095925272e-004,right_val:0.5572484731674194,left_val:0.3692429959774017},{features:[[9,11,2,3,-1.],[9,12,2,1,3.]],threshold:-4.9829659983515739e-003,right_val:0.4532504081726074,left_val:0.6758509278297424},{features:[[2,16,4,2,-1.],[2,17,4,1,2.]],threshold:1.8815309740602970e-003,right_val:0.2932539880275726,left_val:0.5368022918701172},{features:[[7,13,6,6,-1.],[10,13,3,3,2.],[7,16,3,3,2.]],threshold:-0.0190675500780344,right_val:0.5330067276954651,left_val:0.1649377048015595},{features:[[7,0,3,4,-1.],[8,0,1,4,3.]],threshold:-4.6906559728085995e-003,right_val:0.5119361877441406,left_val:0.1963925957679749},{features:[[8,15,4,3,-1.],[8,16,4,1,3.]],threshold:5.9777139686048031e-003,right_val:0.7008398175239563,left_val:0.4671171903610230},{features:[[0,4,4,6,-1.],[0,6,4,2,3.]],threshold:-0.0333031304180622,right_val:0.5104162096977234,left_val:0.1155416965484619},{features:[[5,6,12,3,-1.],[9,6,4,3,3.]],threshold:0.0907441079616547,right_val:0.1306173056364059,left_val:0.5149660110473633},{features:[[7,6,6,14,-1.],[9,6,2,14,3.]],threshold:9.3555898638442159e-004,right_val:0.5439859032630920,left_val:0.3605481088161469},{features:[[9,7,3,3,-1.],[10,7,1,3,3.]],threshold:0.0149016501381993,right_val:0.7687569856643677,left_val:0.4886212050914764},{features:[[6,12,2,4,-1.],[6,14,2,2,2.]],threshold:6.1594118596985936e-004,right_val:0.3240939080715179,left_val:0.5356813073158264},{features:[[10,12,7,6,-1.],[10,14,7,2,3.]],threshold:-0.0506709888577461,right_val:0.5230404138565064,left_val:0.1848621964454651},{features:[[1,0,15,2,-1.],[1,1,15,1,2.]],threshold:6.8665749859064817e-004,right_val:0.5517945885658264,left_val:0.3840579986572266},{features:[[14,0,6,6,-1.],[14,0,3,6,2.]],threshold:8.3712432533502579e-003,right_val:0.6131753921508789,left_val:0.4288564026355743},{features:[[5,3,3,1,-1.],[6,3,1,1,3.]],threshold:-1.2953069526702166e-003,right_val:0.5280737876892090,left_val:0.2913674116134644},{features:[[14,0,6,6,-1.],[14,0,3,6,2.]],threshold:-0.0419416800141335,right_val:0.4856030941009522,left_val:0.7554799914360046},{features:[[0,3,20,10,-1.],[0,8,20,5,2.]],threshold:-0.0235293805599213,right_val:0.5256081223487854,left_val:0.2838279902935028},{features:[[14,0,6,6,-1.],[14,0,3,6,2.]],threshold:0.0408574491739273,right_val:0.6277297139167786,left_val:0.4870935082435608},{features:[[0,0,6,6,-1.],[3,0,3,6,2.]],threshold:-0.0254068691283464,right_val:0.4575029015541077,left_val:0.7099707722663879},{features:[[19,15,1,2,-1.],[19,16,1,1,2.]],threshold:-4.1415440500713885e-004,right_val:0.5469412207603455,left_val:0.4030886888504028},{features:[[0,2,4,8,-1.],[2,2,2,8,2.]],threshold:0.0218241196125746,right_val:0.6768701076507568,left_val:0.4502024054527283},{features:[[2,1,18,4,-1.],[11,1,9,2,2.],[2,3,9,2,2.]],threshold:0.0141140399500728,right_val:0.3791700005531311,left_val:0.5442860722541809},{features:[[8,12,1,2,-1.],[8,13,1,1,2.]],threshold:6.7214590671937913e-005,right_val:0.5873476266860962,left_val:0.4200463891029358},{features:[[5,2,10,6,-1.],[10,2,5,3,2.],[5,5,5,3,2.]],threshold:-7.9417638480663300e-003,right_val:0.5585265755653381,left_val:0.3792561888694763},{features:[[9,7,2,4,-1.],[10,7,1,4,2.]],threshold:-7.2144409641623497e-003,right_val:0.4603548943996429,left_val:0.7253103852272034},{features:[[9,7,3,3,-1.],[10,7,1,3,3.]],threshold:2.5817339774221182e-003,right_val:0.5900238752365112,left_val:0.4693301916122437},{features:[[4,5,12,8,-1.],[8,5,4,8,3.]],threshold:0.1340931951999664,right_val:0.1808844953775406,left_val:0.5149213075637817},{features:[[15,15,4,3,-1.],[15,16,4,1,3.]],threshold:2.2962710354477167e-003,right_val:0.3717867136001587,left_val:0.5399743914604187},{features:[[8,18,3,1,-1.],[9,18,1,1,3.]],threshold:-2.1575849968940020e-003,right_val:0.5148863792419434,left_val:0.2408495992422104},{features:[[9,13,4,3,-1.],[9,14,4,1,3.]],threshold:-4.9196188338100910e-003,right_val:0.4738740026950836,left_val:0.6573588252067566},{features:[[7,13,4,3,-1.],[7,14,4,1,3.]],threshold:1.6267469618469477e-003,right_val:0.6303114295005798,left_val:0.4192821979522705},{features:[[19,15,1,2,-1.],[19,16,1,1,2.]],threshold:3.3413388882763684e-004,right_val:0.3702101111412048,left_val:0.5540298223495483},{features:[[0,15,8,4,-1.],[0,17,8,2,2.]],threshold:-0.0266980808228254,right_val:0.5101410746574402,left_val:0.1710917949676514},{features:[[9,3,6,4,-1.],[11,3,2,4,3.]],threshold:-0.0305618792772293,right_val:0.5168793797492981,left_val:0.1904218047857285},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:2.8511548880487680e-003,right_val:0.6313853859901428,left_val:0.4447506964206696},{features:[[3,14,14,6,-1.],[3,16,14,2,3.]],threshold:-0.0362114794552326,right_val:0.5377349257469177,left_val:0.2490727007389069},{features:[[6,3,6,6,-1.],[6,6,6,3,2.]],threshold:-2.4115189444273710e-003,right_val:0.3664236962795258,left_val:0.5381243228912354},{features:[[5,11,10,6,-1.],[5,14,10,3,2.]],threshold:-7.7253201743587852e-004,right_val:0.3541550040245056,left_val:0.5530232191085815},{features:[[3,10,3,4,-1.],[4,10,1,4,3.]],threshold:2.9481729143299162e-004,right_val:0.5667243003845215,left_val:0.4132699072360992},{features:[[13,9,2,2,-1.],[13,9,1,2,2.]],threshold:-6.2334560789167881e-003,right_val:0.5198668837547302,left_val:0.0987872332334518},{features:[[5,3,6,4,-1.],[7,3,2,4,3.]],threshold:-0.0262747295200825,right_val:0.5028107166290283,left_val:0.0911274924874306},{features:[[9,7,3,3,-1.],[10,7,1,3,3.]],threshold:5.3212260827422142e-003,right_val:0.6222720742225647,left_val:0.4726648926734924},{features:[[2,12,2,3,-1.],[2,13,2,1,3.]],threshold:-4.1129058226943016e-003,right_val:0.5137804746627808,left_val:0.2157457023859024},{features:[[9,8,3,12,-1.],[9,12,3,4,3.]],threshold:3.2457809429615736e-003,right_val:0.3721776902675629,left_val:0.5410770773887634},{features:[[3,14,4,6,-1.],[3,14,2,3,2.],[5,17,2,3,2.]],threshold:-0.0163597092032433,right_val:0.4685291945934296,left_val:0.7787874937057495},{features:[[16,15,2,2,-1.],[16,16,2,1,2.]],threshold:3.2166109303943813e-004,right_val:0.4240373969078064,left_val:0.5478987097740173},{features:[[2,15,2,2,-1.],[2,16,2,1,2.]],threshold:6.4452440710738301e-004,right_val:0.3501324951648712,left_val:0.5330560803413391},{features:[[8,12,4,3,-1.],[8,13,4,1,3.]],threshold:-7.8909732401371002e-003,right_val:0.4726569056510925,left_val:0.6923521161079407},{features:[[0,7,20,1,-1.],[10,7,10,1,2.]],threshold:0.0483362115919590,right_val:0.0757492035627365,left_val:0.5055900216102600},{features:[[7,6,8,3,-1.],[7,6,4,3,2.]],threshold:-7.5178127735853195e-004,right_val:0.5538573861122131,left_val:0.3783741891384125},{features:[[5,7,8,2,-1.],[9,7,4,2,2.]],threshold:-2.4953910615295172e-003,right_val:0.5359612107276917,left_val:0.3081651031970978},{features:[[9,7,3,5,-1.],[10,7,1,5,3.]],threshold:-2.2385010961443186e-003,right_val:0.4649342894554138,left_val:0.6633958816528320},{features:[[8,7,3,5,-1.],[9,7,1,5,3.]],threshold:-1.7988430336117744e-003,right_val:0.4347187876701355,left_val:0.6596844792366028},{features:[[11,1,3,5,-1.],[12,1,1,5,3.]],threshold:8.7860915809869766e-003,right_val:0.2315579950809479,left_val:0.5231832861900330},{features:[[6,2,3,6,-1.],[7,2,1,6,3.]],threshold:3.6715380847454071e-003,right_val:0.2977376878261566,left_val:0.5204250216484070},{features:[[14,14,6,5,-1.],[14,14,3,5,2.]],threshold:-0.0353364497423172,right_val:0.4861505031585693,left_val:0.7238878011703491},{features:[[9,8,2,2,-1.],[9,9,2,1,2.]],threshold:-6.9189240457490087e-004,right_val:0.5229824781417847,left_val:0.3105022013187408},{features:[[10,7,1,3,-1.],[10,8,1,1,3.]],threshold:-3.3946109469980001e-003,right_val:0.5210173726081848,left_val:0.3138968050479889},{features:[[6,6,2,2,-1.],[6,6,1,1,2.],[7,7,1,1,2.]],threshold:9.8569283727556467e-004,right_val:0.6585097908973694,left_val:0.4536580145359039},{features:[[2,11,18,4,-1.],[11,11,9,2,2.],[2,13,9,2,2.]],threshold:-0.0501631014049053,right_val:0.5198916792869568,left_val:0.1804454028606415},{features:[[6,6,2,2,-1.],[6,6,1,1,2.],[7,7,1,1,2.]],threshold:-2.2367259953171015e-003,right_val:0.4651359021663666,left_val:0.7255702018737793},{features:[[0,15,20,2,-1.],[0,16,20,1,2.]],threshold:7.4326287722215056e-004,right_val:0.5898545980453491,left_val:0.4412921071052551},{features:[[4,14,2,3,-1.],[4,15,2,1,3.]],threshold:-9.3485182151198387e-004,right_val:0.5366017818450928,left_val:0.3500052988529205},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:0.0174979399889708,right_val:0.8315284848213196,left_val:0.4912194907665253},{features:[[8,7,2,3,-1.],[8,8,2,1,3.]],threshold:-1.5200000489130616e-003,right_val:0.5370560288429260,left_val:0.3570275902748108},{features:[[9,10,2,3,-1.],[9,11,2,1,3.]],threshold:7.8003940870985389e-004,right_val:0.5967335104942322,left_val:0.4353772103786469}],threshold:39.1072883605957030},{simpleClassifiers:[{features:[[5,4,10,4,-1.],[5,6,10,2,2.]],threshold:-9.9945552647113800e-003,right_val:0.3054533004760742,left_val:0.6162583231925964},{features:[[9,7,6,4,-1.],[12,7,3,2,2.],[9,9,3,2,2.]],threshold:-1.1085229925811291e-003,right_val:0.3155578076839447,left_val:0.5818294882774353},{features:[[4,7,3,6,-1.],[4,9,3,2,3.]],threshold:1.0364380432292819e-003,right_val:0.5692911744117737,left_val:0.2552052140235901},{features:[[11,15,4,4,-1.],[13,15,2,2,2.],[11,17,2,2,2.]],threshold:6.8211311008781195e-004,right_val:0.5934931039810181,left_val:0.3685089945793152},{features:[[7,8,4,2,-1.],[7,9,4,1,2.]],threshold:-6.8057340104132891e-004,right_val:0.5474792122840881,left_val:0.2332392036914825},{features:[[13,1,4,3,-1.],[13,1,2,3,2.]],threshold:2.6068789884448051e-004,right_val:0.5667545795440674,left_val:0.3257457017898560},{features:[[5,15,4,4,-1.],[5,15,2,2,2.],[7,17,2,2,2.]],threshold:5.1607372006401420e-004,right_val:0.5845472812652588,left_val:0.3744716942310333},{features:[[9,5,4,7,-1.],[9,5,2,7,2.]],threshold:8.5007521556690335e-004,right_val:0.5522807240486145,left_val:0.3420371115207672},{features:[[5,6,8,3,-1.],[9,6,4,3,2.]],threshold:-1.8607829697430134e-003,right_val:0.5375424027442932,left_val:0.2804419994354248},{features:[[9,9,2,2,-1.],[9,10,2,1,2.]],threshold:-1.5033970121294260e-003,right_val:0.5498952269554138,left_val:0.2579050958156586},{features:[[7,15,5,3,-1.],[7,16,5,1,3.]],threshold:2.3478909861296415e-003,right_val:0.6313710808753967,left_val:0.4175156056880951},{features:[[11,10,4,3,-1.],[11,10,2,3,2.]],threshold:-2.8880240279249847e-004,right_val:0.4052666127681732,left_val:0.5865169763565064},{features:[[6,9,8,10,-1.],[6,14,8,5,2.]],threshold:8.9405477046966553e-003,right_val:0.2318654060363770,left_val:0.5211141109466553},{features:[[10,11,6,2,-1.],[10,11,3,2,2.]],threshold:-0.0193277392536402,right_val:0.5241525769233704,left_val:0.2753432989120483},{features:[[4,11,6,2,-1.],[7,11,3,2,2.]],threshold:-2.0202060113660991e-004,right_val:0.3677195906639099,left_val:0.5722978711128235},{features:[[11,3,8,1,-1.],[11,3,4,1,2.]],threshold:2.1179069299250841e-003,right_val:0.5542430877685547,left_val:0.4466108083724976},{features:[[6,3,3,2,-1.],[7,3,1,2,3.]],threshold:-1.7743760254234076e-003,right_val:0.5300959944725037,left_val:0.2813253104686737},{features:[[14,5,6,5,-1.],[14,5,3,5,2.]],threshold:4.2234458960592747e-003,right_val:0.5795428156852722,left_val:0.4399709999561310},{features:[[7,5,2,12,-1.],[7,11,2,6,2.]],threshold:-0.0143752200528979,right_val:0.5292059183120728,left_val:0.2981117963790894},{features:[[8,11,4,3,-1.],[8,12,4,1,3.]],threshold:-0.0153491804376245,right_val:0.4748171865940094,left_val:0.7705215215682983},{features:[[4,1,2,3,-1.],[5,1,1,3,2.]],threshold:1.5152279956964776e-005,right_val:0.5576897263526917,left_val:0.3718844056129456},{features:[[18,3,2,6,-1.],[18,5,2,2,3.]],threshold:-9.1293919831514359e-003,right_val:0.5286766886711121,left_val:0.3615196049213409},{features:[[0,3,2,6,-1.],[0,5,2,2,3.]],threshold:2.2512159775942564e-003,right_val:0.3486298024654388,left_val:0.5364704728126526},{features:[[9,12,2,3,-1.],[9,13,2,1,3.]],threshold:-4.9696918576955795e-003,right_val:0.4676836133003235,left_val:0.6927651762962341},{features:[[7,13,4,3,-1.],[7,14,4,1,3.]],threshold:-0.0128290103748441,right_val:0.4660735130310059,left_val:0.7712153792381287},{features:[[18,0,2,6,-1.],[18,2,2,2,3.]],threshold:-9.3660065904259682e-003,right_val:0.5351287722587585,left_val:0.3374983966350555},{features:[[0,0,2,6,-1.],[0,2,2,2,3.]],threshold:3.2452319283038378e-003,right_val:0.3289610147476196,left_val:0.5325189828872681},{features:[[8,14,6,3,-1.],[8,15,6,1,3.]],threshold:-0.0117235602810979,right_val:0.4754300117492676,left_val:0.6837652921676636},{features:[[7,4,2,4,-1.],[8,4,1,4,2.]],threshold:2.9257940695970319e-005,right_val:0.5360502004623413,left_val:0.3572087883949280},{features:[[8,5,4,6,-1.],[8,7,4,2,3.]],threshold:-2.2244219508138485e-005,right_val:0.3552064001560211,left_val:0.5541427135467529},{features:[[6,4,2,2,-1.],[7,4,1,2,2.]],threshold:5.0881509669125080e-003,right_val:0.1256462037563324,left_val:0.5070844292640686},{features:[[3,14,14,4,-1.],[10,14,7,2,2.],[3,16,7,2,2.]],threshold:0.0274296794086695,right_val:0.1625818014144898,left_val:0.5269560217857361},{features:[[6,15,6,2,-1.],[6,15,3,1,2.],[9,16,3,1,2.]],threshold:-6.4142867922782898e-003,right_val:0.4584197103977203,left_val:0.7145588994026184},{features:[[14,15,6,2,-1.],[14,16,6,1,2.]],threshold:3.3479959238320589e-003,right_val:0.3494696915149689,left_val:0.5398612022399902},{features:[[2,12,12,8,-1.],[2,16,12,4,2.]],threshold:-0.0826354920864105,right_val:0.5160226225852966,left_val:0.2439192980527878},{features:[[7,7,7,2,-1.],[7,8,7,1,2.]],threshold:1.0261740535497665e-003,right_val:0.5767908096313477,left_val:0.3886891901493073},{features:[[0,2,18,2,-1.],[0,3,18,1,2.]],threshold:-1.6307090409100056e-003,right_val:0.5347700715065002,left_val:0.3389458060264587},{features:[[9,6,2,5,-1.],[9,6,1,5,2.]],threshold:2.4546680506318808e-003,right_val:0.6387246847152710,left_val:0.4601413905620575},{features:[[7,5,3,8,-1.],[8,5,1,8,3.]],threshold:-9.9476519972085953e-004,right_val:0.4120396077632904,left_val:0.5769879221916199},{features:[[9,6,3,4,-1.],[10,6,1,4,3.]],threshold:0.0154091902077198,right_val:0.7089822292327881,left_val:0.4878709018230438},{features:[[4,13,3,2,-1.],[4,14,3,1,2.]],threshold:1.1784400558099151e-003,right_val:0.2895244956016541,left_val:0.5263553261756897},{features:[[9,4,6,3,-1.],[11,4,2,3,3.]],threshold:-0.0277019198983908,right_val:0.5219606757164002,left_val:0.1498828977346420},{features:[[5,4,6,3,-1.],[7,4,2,3,3.]],threshold:-0.0295053999871016,right_val:0.4999816119670868,left_val:0.0248933192342520},{features:[[14,11,5,2,-1.],[14,12,5,1,2.]],threshold:4.5159430010244250e-004,right_val:0.4029662907123566,left_val:0.5464622974395752},{features:[[1,2,6,9,-1.],[3,2,2,9,3.]],threshold:7.1772639639675617e-003,right_val:0.5866296887397766,left_val:0.4271056950092316},{features:[[14,6,6,13,-1.],[14,6,3,13,2.]],threshold:-0.0741820484399796,right_val:0.4919027984142304,left_val:0.6874179244041443},{features:[[3,6,14,8,-1.],[3,6,7,4,2.],[10,10,7,4,2.]],threshold:-0.0172541607171297,right_val:0.5348739027976990,left_val:0.3370676040649414},{features:[[16,0,4,11,-1.],[16,0,2,11,2.]],threshold:0.0148515598848462,right_val:0.6129904985427856,left_val:0.4626792967319489},{features:[[3,4,12,12,-1.],[3,4,6,6,2.],[9,10,6,6,2.]],threshold:0.0100020002573729,right_val:0.3423453867435455,left_val:0.5346122980117798},{features:[[11,4,5,3,-1.],[11,5,5,1,3.]],threshold:2.0138120744377375e-003,right_val:0.5824304223060608,left_val:0.4643830060958862},{features:[[4,11,4,2,-1.],[4,12,4,1,2.]],threshold:1.5135470312088728e-003,right_val:0.2856149971485138,left_val:0.5196396112442017},{features:[[10,7,2,2,-1.],[10,7,1,2,2.]],threshold:3.1381431035697460e-003,right_val:0.5958529710769653,left_val:0.4838162958621979},{features:[[8,7,2,2,-1.],[9,7,1,2,2.]],threshold:-5.1450440660119057e-003,right_val:0.4741412103176117,left_val:0.8920302987098694},{features:[[9,17,3,2,-1.],[10,17,1,2,3.]],threshold:-4.4736708514392376e-003,right_val:0.5337278842926025,left_val:0.2033942937850952},{features:[[5,6,3,3,-1.],[5,7,3,1,3.]],threshold:1.9628470763564110e-003,right_val:0.6725863218307495,left_val:0.4571633934974670},{features:[[10,0,3,3,-1.],[11,0,1,3,3.]],threshold:5.4260450415313244e-003,right_val:0.2845670878887177,left_val:0.5271108150482178},{features:[[5,6,6,2,-1.],[5,6,3,1,2.],[8,7,3,1,2.]],threshold:4.9611460417509079e-004,right_val:0.5718597769737244,left_val:0.4138312935829163},{features:[[12,16,4,3,-1.],[12,17,4,1,3.]],threshold:9.3728788197040558e-003,right_val:0.2804847061634064,left_val:0.5225151181221008},{features:[[3,12,3,2,-1.],[3,13,3,1,2.]],threshold:6.0500897234305739e-004,right_val:0.3314523994922638,left_val:0.5236768722534180},{features:[[9,12,3,2,-1.],[9,13,3,1,2.]],threshold:5.6792551185935736e-004,right_val:0.6276971101760864,left_val:0.4531059861183167},{features:[[1,11,16,4,-1.],[1,11,8,2,2.],[9,13,8,2,2.]],threshold:0.0246443394571543,right_val:0.2017143964767456,left_val:0.5130851864814758},{features:[[12,4,3,3,-1.],[12,5,3,1,3.]],threshold:-0.0102904504165053,right_val:0.4876641035079956,left_val:0.7786595225334168},{features:[[4,4,5,3,-1.],[4,5,5,1,3.]],threshold:2.0629419013857841e-003,right_val:0.5881264209747315,left_val:0.4288598895072937},{features:[[12,16,4,3,-1.],[12,17,4,1,3.]],threshold:-5.0519481301307678e-003,right_val:0.5286008715629578,left_val:0.3523977994918823},{features:[[5,4,3,3,-1.],[5,5,3,1,3.]],threshold:-5.7692620903253555e-003,right_val:0.4588094055652618,left_val:0.6841086149215698},{features:[[9,0,2,2,-1.],[9,1,2,1,2.]],threshold:-4.5789941214025021e-004,right_val:0.5485978126525879,left_val:0.3565520048141480},{features:[[8,9,4,2,-1.],[8,10,4,1,2.]],threshold:-7.5918837683275342e-004,right_val:0.5254197120666504,left_val:0.3368793129920960},{features:[[8,8,4,3,-1.],[8,9,4,1,3.]],threshold:-1.7737259622663260e-003,right_val:0.5454015135765076,left_val:0.3422161042690277},{features:[[0,13,6,3,-1.],[2,13,2,3,3.]],threshold:-8.5610467940568924e-003,right_val:0.4485856890678406,left_val:0.6533612012863159},{features:[[16,14,3,2,-1.],[16,15,3,1,2.]],threshold:1.7277270089834929e-003,right_val:0.3925352990627289,left_val:0.5307580232620239},{features:[[1,18,18,2,-1.],[7,18,6,2,3.]],threshold:-0.0281996093690395,right_val:0.4588584005832672,left_val:0.6857458949089050},{features:[[16,14,3,2,-1.],[16,15,3,1,2.]],threshold:-1.7781109781935811e-003,right_val:0.5369856953620911,left_val:0.4037851095199585},{features:[[1,14,3,2,-1.],[1,15,3,1,2.]],threshold:3.3177141449414194e-004,right_val:0.3705750107765198,left_val:0.5399798750877380},{features:[[7,14,6,3,-1.],[7,15,6,1,3.]],threshold:2.6385399978607893e-003,right_val:0.6452730894088745,left_val:0.4665437042713165},{features:[[5,14,8,3,-1.],[5,15,8,1,3.]],threshold:-2.1183069329708815e-003,right_val:0.4064677059650421,left_val:0.5914781093597412},{features:[[10,6,4,14,-1.],[10,6,2,14,2.]],threshold:-0.0147732896730304,right_val:0.5294762849807739,left_val:0.3642038106918335},{features:[[6,6,4,14,-1.],[8,6,2,14,2.]],threshold:-0.0168154407292604,right_val:0.5144972801208496,left_val:0.2664231956005096},{features:[[13,5,2,3,-1.],[13,6,2,1,3.]],threshold:-6.3370140269398689e-003,right_val:0.4852097928524017,left_val:0.6779531240463257},{features:[[7,16,6,1,-1.],[9,16,2,1,3.]],threshold:-4.4560048991115764e-005,right_val:0.4153054058551788,left_val:0.5613964796066284},{features:[[9,12,3,3,-1.],[9,13,3,1,3.]],threshold:-1.0240620467811823e-003,right_val:0.4566304087638855,left_val:0.5964478254318237},{features:[[7,0,3,3,-1.],[8,0,1,3,3.]],threshold:-2.3161689750850201e-003,right_val:0.5188159942626953,left_val:0.2976115047931671},{features:[[4,0,16,18,-1.],[4,9,16,9,2.]],threshold:0.5321757197380066,right_val:0.2202631980180740,left_val:0.5187839269638062},{features:[[1,1,16,14,-1.],[1,8,16,7,2.]],threshold:-0.1664305031299591,right_val:0.5060343146324158,left_val:0.1866022944450378},{features:[[3,9,15,4,-1.],[8,9,5,4,3.]],threshold:0.1125352978706360,right_val:0.1185022965073586,left_val:0.5212125182151794},{features:[[6,12,7,3,-1.],[6,13,7,1,3.]],threshold:9.3046864494681358e-003,right_val:0.6826149225234985,left_val:0.4589937031269074},{features:[[14,15,2,3,-1.],[14,16,2,1,3.]],threshold:-4.6255099587142467e-003,right_val:0.5225008726119995,left_val:0.3079940974712372},{features:[[2,3,16,14,-1.],[2,3,8,7,2.],[10,10,8,7,2.]],threshold:-0.1111646965146065,right_val:0.5080801844596863,left_val:0.2101044058799744},{features:[[16,2,4,18,-1.],[18,2,2,9,2.],[16,11,2,9,2.]],threshold:-0.0108884396031499,right_val:0.4790464043617249,left_val:0.5765355229377747},{features:[[4,15,2,3,-1.],[4,16,2,1,3.]],threshold:5.8564301580190659e-003,right_val:0.1563598960638046,left_val:0.5065100193023682},{features:[[16,2,4,18,-1.],[18,2,2,9,2.],[16,11,2,9,2.]],threshold:0.0548543892800808,right_val:0.7230510711669922,left_val:0.4966914951801300},{features:[[1,1,8,3,-1.],[1,2,8,1,3.]],threshold:-0.0111973397433758,right_val:0.5098798274993897,left_val:0.2194979041814804},{features:[[8,11,4,3,-1.],[8,12,4,1,3.]],threshold:4.4069071300327778e-003,right_val:0.6770902872085571,left_val:0.4778401851654053},{features:[[5,11,5,9,-1.],[5,14,5,3,3.]],threshold:-0.0636652931571007,right_val:0.5081024169921875,left_val:0.1936362981796265},{features:[[16,0,4,11,-1.],[16,0,2,11,2.]],threshold:-9.8081491887569427e-003,right_val:0.4810341000556946,left_val:0.5999063253402710},{features:[[7,0,6,1,-1.],[9,0,2,1,3.]],threshold:-2.1717099007219076e-003,right_val:0.5235472917556763,left_val:0.3338333964347839},{features:[[16,3,3,7,-1.],[17,3,1,7,3.]],threshold:-0.0133155202493072,right_val:0.4919213056564331,left_val:0.6617069840431213},{features:[[1,3,3,7,-1.],[2,3,1,7,3.]],threshold:2.5442079640924931e-003,right_val:0.6082184910774231,left_val:0.4488744139671326},{features:[[7,8,6,12,-1.],[7,12,6,4,3.]],threshold:0.0120378397405148,right_val:0.3292432129383087,left_val:0.5409392118453980},{features:[[0,0,4,11,-1.],[2,0,2,11,2.]],threshold:-0.0207010507583618,right_val:0.4594995975494385,left_val:0.6819120049476624},{features:[[14,0,6,20,-1.],[14,0,3,20,2.]],threshold:0.0276082791388035,right_val:0.5767282843589783,left_val:0.4630792140960693},{features:[[0,3,1,2,-1.],[0,4,1,1,2.]],threshold:1.2370620388537645e-003,right_val:0.2635016143321991,left_val:0.5165379047393799},{features:[[5,5,10,8,-1.],[10,5,5,4,2.],[5,9,5,4,2.]],threshold:-0.0376693382859230,right_val:0.5278980135917664,left_val:0.2536393105983734},{features:[[4,7,12,4,-1.],[4,7,6,2,2.],[10,9,6,2,2.]],threshold:-1.8057259730994701e-003,right_val:0.5517500042915344,left_val:0.3985156118869782}],threshold:50.6104812622070310},{simpleClassifiers:[{features:[[2,1,6,4,-1.],[5,1,3,4,2.]],threshold:4.4299028813838959e-003,right_val:0.6335226297378540,left_val:0.2891018092632294},{features:[[9,7,6,4,-1.],[12,7,3,2,2.],[9,9,3,2,2.]],threshold:-2.3813319858163595e-003,right_val:0.3477487862110138,left_val:0.6211789250373840},{features:[[5,6,2,6,-1.],[5,9,2,3,2.]],threshold:2.2915711160749197e-003,right_val:0.5582118034362793,left_val:0.2254412025213242},{features:[[9,16,6,4,-1.],[12,16,3,2,2.],[9,18,3,2,2.]],threshold:9.9457940086722374e-004,right_val:0.5930070877075195,left_val:0.3711710870265961},{features:[[9,4,2,12,-1.],[9,10,2,6,2.]],threshold:7.7164667891338468e-004,right_val:0.3347995877265930,left_val:0.5651720166206360},{features:[[7,1,6,18,-1.],[9,1,2,18,3.]],threshold:-1.1386410333216190e-003,right_val:0.5508630871772766,left_val:0.3069126009941101},{features:[[4,12,12,2,-1.],[8,12,4,2,3.]],threshold:-1.6403039626311511e-004,right_val:0.3699047863483429,left_val:0.5762827992439270},{features:[[8,8,6,2,-1.],[8,9,6,1,2.]],threshold:2.9793529392918572e-005,right_val:0.5437911152839661,left_val:0.2644244134426117},{features:[[8,0,3,6,-1.],[9,0,1,6,3.]],threshold:8.5774902254343033e-003,right_val:0.1795724928379059,left_val:0.5051138997077942},{features:[[11,18,3,2,-1.],[11,19,3,1,2.]],threshold:-2.6032689493149519e-004,right_val:0.4446826875209808,left_val:0.5826969146728516},{features:[[1,1,17,4,-1.],[1,3,17,2,2.]],threshold:-6.1404630541801453e-003,right_val:0.5346971750259399,left_val:0.3113852143287659},{features:[[11,8,4,12,-1.],[11,8,2,12,2.]],threshold:-0.0230869501829147,right_val:0.5331197977066040,left_val:0.3277946114540100},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:-0.0142436502501369,right_val:0.4588063061237335,left_val:0.7381709814071655},{features:[[12,3,2,17,-1.],[12,3,1,17,2.]],threshold:0.0194871295243502,right_val:0.2274471968412399,left_val:0.5256630778312683},{features:[[4,7,6,1,-1.],[6,7,2,1,3.]],threshold:-9.6681108698248863e-004,right_val:0.3815006911754608,left_val:0.5511230826377869},{features:[[18,3,2,3,-1.],[18,4,2,1,3.]],threshold:3.1474709976464510e-003,right_val:0.2543726861476898,left_val:0.5425636768341065},{features:[[8,4,3,4,-1.],[8,6,3,2,2.]],threshold:-1.8026070029009134e-004,right_val:0.3406304121017456,left_val:0.5380191802978516},{features:[[4,5,12,10,-1.],[4,10,12,5,2.]],threshold:-6.0266260989010334e-003,right_val:0.5420572161674500,left_val:0.3035801947116852},{features:[[5,18,4,2,-1.],[7,18,2,2,2.]],threshold:4.4462960795499384e-004,right_val:0.5660110116004944,left_val:0.3990997076034546},{features:[[17,2,3,6,-1.],[17,4,3,2,3.]],threshold:2.2609760053455830e-003,right_val:0.3940688073635101,left_val:0.5562806725502014},{features:[[7,7,6,6,-1.],[9,7,2,6,3.]],threshold:0.0511330589652061,right_val:0.7118561863899231,left_val:0.4609653949737549},{features:[[17,2,3,6,-1.],[17,4,3,2,3.]],threshold:-0.0177863091230392,right_val:0.5322144031524658,left_val:0.2316166013479233},{features:[[8,0,3,4,-1.],[9,0,1,4,3.]],threshold:-4.9679628573358059e-003,right_val:0.5122029185295105,left_val:0.2330771982669830},{features:[[9,14,2,3,-1.],[9,15,2,1,3.]],threshold:2.0667689386755228e-003,right_val:0.6455488204956055,left_val:0.4657444059848785},{features:[[0,12,6,3,-1.],[0,13,6,1,3.]],threshold:7.4413768015801907e-003,right_val:0.2361633926630020,left_val:0.5154392123222351},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:-3.6277279723435640e-003,right_val:0.4476661086082459,left_val:0.6219773292541504},{features:[[3,12,2,3,-1.],[3,13,2,1,3.]],threshold:-5.3530759178102016e-003,right_val:0.5102208256721497,left_val:0.1837355047464371},{features:[[5,6,12,7,-1.],[9,6,4,7,3.]],threshold:0.1453091949224472,right_val:0.1535930931568146,left_val:0.5145987272262573},{features:[[0,2,3,6,-1.],[0,4,3,2,3.]],threshold:2.4394490756094456e-003,right_val:0.3624661862850189,left_val:0.5343660116195679},{features:[[14,6,1,3,-1.],[14,7,1,1,3.]],threshold:-3.1283390708267689e-003,right_val:0.4845592081546783,left_val:0.6215007901191711},{features:[[2,0,3,14,-1.],[3,0,1,14,3.]],threshold:1.7940260004252195e-003,right_val:0.5824198126792908,left_val:0.4299261868000031},{features:[[12,14,5,6,-1.],[12,16,5,2,3.]],threshold:0.0362538211047649,right_val:0.1439467966556549,left_val:0.5260334014892578},{features:[[4,14,5,6,-1.],[4,16,5,2,3.]],threshold:-5.1746722310781479e-003,right_val:0.5287045240402222,left_val:0.3506538867950440},{features:[[11,10,2,2,-1.],[12,10,1,1,2.],[11,11,1,1,2.]],threshold:6.5383297624066472e-004,right_val:0.6122040152549744,left_val:0.4809640944004059},{features:[[5,0,3,14,-1.],[6,0,1,14,3.]],threshold:-0.0264802295714617,right_val:0.5045586228370667,left_val:0.1139362007379532},{features:[[10,15,2,3,-1.],[10,16,2,1,3.]],threshold:-3.0440660193562508e-003,right_val:0.4794734120368958,left_val:0.6352095007896423},{features:[[0,2,2,3,-1.],[0,3,2,1,3.]],threshold:3.6993520334362984e-003,right_val:0.2498510926961899,left_val:0.5131118297576904},{features:[[5,11,12,6,-1.],[5,14,12,3,2.]],threshold:-3.6762931267730892e-004,right_val:0.3709532022476196,left_val:0.5421394705772400},{features:[[6,11,3,9,-1.],[6,14,3,3,3.]],threshold:-0.0413822606205940,right_val:0.5081691741943359,left_val:0.1894959956407547},{features:[[11,10,2,2,-1.],[12,10,1,1,2.],[11,11,1,1,2.]],threshold:-1.0532729793339968e-003,right_val:0.4783608913421631,left_val:0.6454367041587830},{features:[[5,6,1,3,-1.],[5,7,1,1,3.]],threshold:-2.1648600231856108e-003,right_val:0.4499826133251190,left_val:0.6215031147003174},{features:[[4,9,13,3,-1.],[4,10,13,1,3.]],threshold:-5.6747748749330640e-004,right_val:0.5419334769248962,left_val:0.3712610900402069},{features:[[1,7,15,6,-1.],[6,7,5,6,3.]],threshold:0.1737584024667740,right_val:0.1215742006897926,left_val:0.5023643970489502},{features:[[4,5,12,6,-1.],[8,5,4,6,3.]],threshold:-2.9049699660390615e-003,right_val:0.5381883978843689,left_val:0.3240267932415009},{features:[[8,10,4,3,-1.],[8,11,4,1,3.]],threshold:1.2299539521336555e-003,right_val:0.5703486204147339,left_val:0.4165507853031158},{features:[[15,14,1,3,-1.],[15,15,1,1,3.]],threshold:-5.4329237900674343e-004,right_val:0.5547549128532410,left_val:0.3854042887687683},{features:[[1,11,5,3,-1.],[1,12,5,1,3.]],threshold:-8.3297258242964745e-003,right_val:0.5097082853317261,left_val:0.2204494029283524},{features:[[7,1,7,12,-1.],[7,7,7,6,2.]],threshold:-1.0417630255687982e-004,right_val:0.4303036034107208,left_val:0.5607066154479981},{features:[[0,1,6,10,-1.],[0,1,3,5,2.],[3,6,3,5,2.]],threshold:0.0312047004699707,right_val:0.6982004046440125,left_val:0.4621657133102417},{features:[[16,1,4,3,-1.],[16,2,4,1,3.]],threshold:7.8943502157926559e-003,right_val:0.2269068062305450,left_val:0.5269594192504883},{features:[[5,5,2,3,-1.],[5,6,2,1,3.]],threshold:-4.3645310215651989e-003,right_val:0.4537956118583679,left_val:0.6359223127365112},{features:[[12,2,3,5,-1.],[13,2,1,5,3.]],threshold:7.6793059706687927e-003,right_val:0.2740483880043030,left_val:0.5274767875671387},{features:[[0,3,4,6,-1.],[0,5,4,2,3.]],threshold:-0.0254311393946409,right_val:0.5071732997894287,left_val:0.2038519978523254},{features:[[8,12,4,2,-1.],[8,13,4,1,2.]],threshold:8.2000601105391979e-004,right_val:0.6119868159294128,left_val:0.4587455093860626},{features:[[8,18,3,1,-1.],[9,18,1,1,3.]],threshold:2.9284600168466568e-003,right_val:0.2028204947710037,left_val:0.5071274042129517},{features:[[11,10,2,2,-1.],[12,10,1,1,2.],[11,11,1,1,2.]],threshold:4.5256470912136137e-005,right_val:0.5430821776390076,left_val:0.4812104105949402},{features:[[7,10,2,2,-1.],[7,10,1,1,2.],[8,11,1,1,2.]],threshold:1.3158309739083052e-003,right_val:0.6779323220252991,left_val:0.4625813961029053},{features:[[11,11,4,4,-1.],[11,13,4,2,2.]],threshold:1.5870389761403203e-003,right_val:0.3431465029716492,left_val:0.5386291742324829},{features:[[8,12,3,8,-1.],[9,12,1,8,3.]],threshold:-0.0215396601706743,right_val:0.5003222823143005,left_val:0.0259425006806850},{features:[[13,0,6,3,-1.],[13,1,6,1,3.]],threshold:0.0143344802781940,right_val:0.1590632945299149,left_val:0.5202844738960266},{features:[[8,8,3,4,-1.],[9,8,1,4,3.]],threshold:-8.3881383761763573e-003,right_val:0.4648044109344482,left_val:0.7282481193542481},{features:[[5,7,10,10,-1.],[10,7,5,5,2.],[5,12,5,5,2.]],threshold:9.1906841844320297e-003,right_val:0.3923191130161285,left_val:0.5562356710433960},{features:[[3,18,8,2,-1.],[3,18,4,1,2.],[7,19,4,1,2.]],threshold:-5.8453059755265713e-003,right_val:0.4629127979278565,left_val:0.6803392767906189},{features:[[10,2,6,8,-1.],[12,2,2,8,3.]],threshold:-0.0547077991068363,right_val:0.5206125974655151,left_val:0.2561671137809753},{features:[[4,2,6,8,-1.],[6,2,2,8,3.]],threshold:9.1142775490880013e-003,right_val:0.3053877055644989,left_val:0.5189620256423950},{features:[[11,0,3,7,-1.],[12,0,1,7,3.]],threshold:-0.0155750000849366,right_val:0.5169094800949097,left_val:0.1295074969530106},{features:[[7,11,2,1,-1.],[8,11,1,1,2.]],threshold:-1.2050600344082341e-004,right_val:0.4230825006961823,left_val:0.5735098123550415},{features:[[15,14,1,3,-1.],[15,15,1,1,3.]],threshold:1.2273970060050488e-003,right_val:0.4079791903495789,left_val:0.5289878249168396},{features:[[7,15,2,2,-1.],[7,15,1,1,2.],[8,16,1,1,2.]],threshold:-1.2186600361019373e-003,right_val:0.4574409127235413,left_val:0.6575639843940735},{features:[[15,14,1,3,-1.],[15,15,1,1,3.]],threshold:-3.3256649039685726e-003,right_val:0.5195019841194153,left_val:0.3628047108650208},{features:[[6,0,3,7,-1.],[7,0,1,7,3.]],threshold:-0.0132883097976446,right_val:0.5043488740921021,left_val:0.1284265965223312},{features:[[18,1,2,7,-1.],[18,1,1,7,2.]],threshold:-3.3839771058410406e-003,right_val:0.4757505953311920,left_val:0.6292240023612976},{features:[[2,0,8,20,-1.],[2,10,8,10,2.]],threshold:-0.2195422053337097,right_val:0.5065013766288757,left_val:0.1487731933593750},{features:[[3,0,15,6,-1.],[3,2,15,2,3.]],threshold:4.9111708067357540e-003,right_val:0.5665838718414307,left_val:0.4256102144718170},{features:[[4,3,12,2,-1.],[4,4,12,1,2.]],threshold:-1.8744950648397207e-004,right_val:0.5586857199668884,left_val:0.4004144072532654},{features:[[16,0,4,5,-1.],[16,0,2,5,2.]],threshold:-5.2178641781210899e-003,right_val:0.4812706112861633,left_val:0.6009116172790527},{features:[[7,0,3,4,-1.],[8,0,1,4,3.]],threshold:-1.1111519997939467e-003,right_val:0.5287089943885803,left_val:0.3514933884143829},{features:[[16,0,4,5,-1.],[16,0,2,5,2.]],threshold:4.4036400504410267e-003,right_val:0.5924085974693298,left_val:0.4642275869846344},{features:[[1,7,6,13,-1.],[3,7,2,13,3.]],threshold:0.1229949966073036,right_val:0.0691524818539619,left_val:0.5025529265403748},{features:[[16,0,4,5,-1.],[16,0,2,5,2.]],threshold:-0.0123135102912784,right_val:0.4934012889862061,left_val:0.5884591937065125},{features:[[0,0,4,5,-1.],[2,0,2,5,2.]],threshold:4.1471039876341820e-003,right_val:0.5893477797508240,left_val:0.4372239112854004},{features:[[14,12,3,6,-1.],[14,14,3,2,3.]],threshold:-3.5502649843692780e-003,right_val:0.5396270155906677,left_val:0.4327551126480103},{features:[[3,12,3,6,-1.],[3,14,3,2,3.]],threshold:-0.0192242693156004,right_val:0.5068330764770508,left_val:0.1913134008646011},{features:[[16,1,4,3,-1.],[16,2,4,1,3.]],threshold:1.4395059552043676e-003,right_val:0.4243533015251160,left_val:0.5308178067207336},{features:[[8,7,2,10,-1.],[8,7,1,5,2.],[9,12,1,5,2.]],threshold:-6.7751999013125896e-003,right_val:0.4540086090564728,left_val:0.6365395784378052},{features:[[11,11,4,4,-1.],[11,13,4,2,2.]],threshold:7.0119630545377731e-003,right_val:0.3026199936866760,left_val:0.5189834237098694},{features:[[0,1,4,3,-1.],[0,2,4,1,3.]],threshold:5.4014651104807854e-003,right_val:0.2557682991027832,left_val:0.5105062127113342},{features:[[13,4,1,3,-1.],[13,5,1,1,3.]],threshold:9.0274988906458020e-004,right_val:0.5861827731132507,left_val:0.4696914851665497},{features:[[7,15,3,5,-1.],[8,15,1,5,3.]],threshold:0.0114744501188397,right_val:0.1527177989482880,left_val:0.5053645968437195},{features:[[9,7,3,5,-1.],[10,7,1,5,3.]],threshold:-6.7023430019617081e-003,right_val:0.4890604019165039,left_val:0.6508980989456177},{features:[[8,7,3,5,-1.],[9,7,1,5,3.]],threshold:-2.0462959073483944e-003,right_val:0.4514600038528442,left_val:0.6241816878318787},{features:[[10,6,4,14,-1.],[10,6,2,14,2.]],threshold:-9.9951568990945816e-003,right_val:0.5400953888893127,left_val:0.3432781100273132},{features:[[0,5,5,6,-1.],[0,7,5,2,3.]],threshold:-0.0357007086277008,right_val:0.5074077844619751,left_val:0.1878059059381485},{features:[[9,5,6,4,-1.],[9,5,3,4,2.]],threshold:4.5584561303257942e-004,right_val:0.5402569770812988,left_val:0.3805277049541473},{features:[[0,0,18,10,-1.],[6,0,6,10,3.]],threshold:-0.0542606003582478,right_val:0.4595097005367279,left_val:0.6843714714050293},{features:[[10,6,4,14,-1.],[10,6,2,14,2.]],threshold:6.0600461438298225e-003,right_val:0.4500527977943420,left_val:0.5502905249595642},{features:[[6,6,4,14,-1.],[8,6,2,14,2.]],threshold:-6.4791832119226456e-003,right_val:0.5310757160186768,left_val:0.3368858098983765},{features:[[13,4,1,3,-1.],[13,5,1,1,3.]],threshold:-1.4939469983801246e-003,right_val:0.4756175875663757,left_val:0.6487640142440796},{features:[[5,1,2,3,-1.],[6,1,1,3,2.]],threshold:1.4610530342906713e-005,right_val:0.5451064109802246,left_val:0.4034579098224640},{features:[[18,1,2,18,-1.],[19,1,1,9,2.],[18,10,1,9,2.]],threshold:-7.2321938350796700e-003,right_val:0.4824739992618561,left_val:0.6386873722076416},{features:[[2,1,4,3,-1.],[2,2,4,1,3.]],threshold:-4.0645818226039410e-003,right_val:0.5157335996627808,left_val:0.2986421883106232},{features:[[18,1,2,18,-1.],[19,1,1,9,2.],[18,10,1,9,2.]],threshold:0.0304630808532238,right_val:0.7159956097602844,left_val:0.5022199749946594},{features:[[1,14,4,6,-1.],[1,14,2,3,2.],[3,17,2,3,2.]],threshold:-8.0544911324977875e-003,right_val:0.4619275033473969,left_val:0.6492452025413513},{features:[[10,11,7,6,-1.],[10,13,7,2,3.]],threshold:0.0395051389932632,right_val:0.2450613975524902,left_val:0.5150570869445801},{features:[[0,10,6,10,-1.],[0,10,3,5,2.],[3,15,3,5,2.]],threshold:8.4530208259820938e-003,right_val:0.6394037008285523,left_val:0.4573669135570526},{features:[[11,0,3,4,-1.],[12,0,1,4,3.]],threshold:-1.1688120430335402e-003,right_val:0.5483661293983460,left_val:0.3865512013435364},{features:[[5,10,5,6,-1.],[5,13,5,3,2.]],threshold:2.8070670086890459e-003,right_val:0.2701480090618134,left_val:0.5128579139709473},{features:[[14,6,1,8,-1.],[14,10,1,4,2.]],threshold:4.7365209320560098e-004,right_val:0.5387461185455322,left_val:0.4051581919193268},{features:[[1,7,18,6,-1.],[1,7,9,3,2.],[10,10,9,3,2.]],threshold:0.0117410803213716,right_val:0.3719413876533508,left_val:0.5295950174331665},{features:[[9,7,2,2,-1.],[9,7,1,2,2.]],threshold:3.1833238899707794e-003,right_val:0.6895126104354858,left_val:0.4789406955242157},{features:[[5,9,4,5,-1.],[7,9,2,5,2.]],threshold:7.0241501089185476e-004,right_val:0.3918080925941467,left_val:0.5384489297866821}],threshold:54.6200714111328130},{simpleClassifiers:[{features:[[7,6,6,3,-1.],[9,6,2,3,3.]],threshold:0.0170599296689034,right_val:0.7142534852027893,left_val:0.3948527872562408},{features:[[1,0,18,4,-1.],[7,0,6,4,3.]],threshold:0.0218408405780792,right_val:0.6090016961097717,left_val:0.3370316028594971},{features:[[7,15,2,4,-1.],[7,17,2,2,2.]],threshold:2.4520049919374287e-004,right_val:0.5987902283668518,left_val:0.3500576019287109},{features:[[1,0,19,9,-1.],[1,3,19,3,3.]],threshold:8.3272606134414673e-003,right_val:0.5697240829467773,left_val:0.3267528116703033},{features:[[3,7,3,6,-1.],[3,9,3,2,3.]],threshold:5.7148298947140574e-004,right_val:0.5531656742095947,left_val:0.3044599890708923},{features:[[13,7,4,4,-1.],[15,7,2,2,2.],[13,9,2,2,2.]],threshold:6.7373987985774875e-004,right_val:0.5672631263732910,left_val:0.3650012016296387},{features:[[3,7,4,4,-1.],[3,7,2,2,2.],[5,9,2,2,2.]],threshold:3.4681590477703139e-005,right_val:0.5388727188110352,left_val:0.3313541114330292},{features:[[9,6,10,8,-1.],[9,10,10,4,2.]],threshold:-5.8563398197293282e-003,right_val:0.5498778820037842,left_val:0.2697942852973938},{features:[[3,8,14,12,-1.],[3,14,14,6,2.]],threshold:8.5102273151278496e-003,right_val:0.2762879133224487,left_val:0.5269358158111572},{features:[[6,5,10,12,-1.],[11,5,5,6,2.],[6,11,5,6,2.]],threshold:-0.0698172077536583,right_val:0.5259246826171875,left_val:0.2909603118896484},{features:[[9,11,2,3,-1.],[9,12,2,1,3.]],threshold:-8.6113670840859413e-004,right_val:0.4073697924613953,left_val:0.5892577171325684},{features:[[9,5,6,5,-1.],[9,5,3,5,2.]],threshold:9.7149249631911516e-004,right_val:0.5415862202644348,left_val:0.3523564040660858},{features:[[9,4,2,4,-1.],[9,6,2,2,2.]],threshold:-1.4727490452060010e-005,right_val:0.3503156006336212,left_val:0.5423017740249634},{features:[[9,5,6,5,-1.],[9,5,3,5,2.]],threshold:0.0484202913939953,right_val:0.3411195874214172,left_val:0.5193945765495300},{features:[[5,5,6,5,-1.],[8,5,3,5,2.]],threshold:1.3257140526548028e-003,right_val:0.5335376262664795,left_val:0.3157769143581390},{features:[[11,2,6,1,-1.],[13,2,2,1,3.]],threshold:1.4922149603080470e-005,right_val:0.5536553859710693,left_val:0.4451299905776978},{features:[[3,2,6,1,-1.],[5,2,2,1,3.]],threshold:-2.7173398993909359e-003,right_val:0.5248088836669922,left_val:0.3031741976737976},{features:[[13,5,2,3,-1.],[13,6,2,1,3.]],threshold:2.9219500720500946e-003,right_val:0.6606041789054871,left_val:0.4781453013420105},{features:[[0,10,1,4,-1.],[0,12,1,2,2.]],threshold:-1.9804988987743855e-003,right_val:0.5287625193595886,left_val:0.3186308145523071},{features:[[13,5,2,3,-1.],[13,6,2,1,3.]],threshold:-4.0012109093368053e-003,right_val:0.4749928116798401,left_val:0.6413596868515015},{features:[[8,18,3,2,-1.],[9,18,1,2,3.]],threshold:-4.3491991236805916e-003,right_val:0.5098996758460999,left_val:0.1507498025894165},{features:[[6,15,9,2,-1.],[6,16,9,1,2.]],threshold:1.3490889687091112e-003,right_val:0.5881167054176331,left_val:0.4316158890724182},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:0.0185970701277256,right_val:0.9089794158935547,left_val:0.4735553860664368},{features:[[18,4,2,4,-1.],[18,6,2,2,2.]],threshold:-1.8562379991635680e-003,right_val:0.5577837228775024,left_val:0.3553189039230347},{features:[[5,5,2,3,-1.],[5,6,2,1,3.]],threshold:2.2940430790185928e-003,right_val:0.6580877900123596,left_val:0.4500094950199127},{features:[[15,16,3,2,-1.],[15,17,3,1,2.]],threshold:2.9982850537635386e-004,right_val:0.3975878953933716,left_val:0.5629242062568665},{features:[[0,0,3,9,-1.],[0,3,3,3,3.]],threshold:3.5455459728837013e-003,right_val:0.3605485856533051,left_val:0.5381547212600708},{features:[[9,7,3,3,-1.],[9,8,3,1,3.]],threshold:9.6104722470045090e-003,right_val:0.1796745955944061,left_val:0.5255997180938721},{features:[[8,7,3,3,-1.],[8,8,3,1,3.]],threshold:-6.2783220782876015e-003,right_val:0.5114030241966248,left_val:0.2272856980562210},{features:[[9,5,2,6,-1.],[9,5,1,6,2.]],threshold:3.4598479978740215e-003,right_val:0.6608219146728516,left_val:0.4626308083534241},{features:[[8,6,3,4,-1.],[9,6,1,4,3.]],threshold:-1.3112019514665008e-003,right_val:0.4436857998371124,left_val:0.6317539811134338},{features:[[7,6,8,12,-1.],[11,6,4,6,2.],[7,12,4,6,2.]],threshold:2.6876179035753012e-003,right_val:0.4054022133350372,left_val:0.5421109795570374},{features:[[5,6,8,12,-1.],[5,6,4,6,2.],[9,12,4,6,2.]],threshold:3.9118169806897640e-003,right_val:0.3273454904556274,left_val:0.5358477830886841},{features:[[12,4,3,3,-1.],[12,5,3,1,3.]],threshold:-0.0142064504325390,right_val:0.4975781142711639,left_val:0.7793576717376709},{features:[[2,16,3,2,-1.],[2,17,3,1,2.]],threshold:7.1705528534948826e-004,right_val:0.3560903966426849,left_val:0.5297319889068604},{features:[[12,4,3,3,-1.],[12,5,3,1,3.]],threshold:1.6635019565001130e-003,right_val:0.5816481709480286,left_val:0.4678094089031220},{features:[[2,12,6,6,-1.],[2,14,6,2,3.]],threshold:3.3686188980937004e-003,right_val:0.3446420133113861,left_val:0.5276734232902527},{features:[[7,13,6,3,-1.],[7,14,6,1,3.]],threshold:0.0127995302900672,right_val:0.7472159266471863,left_val:0.4834679961204529},{features:[[6,14,6,3,-1.],[6,15,6,1,3.]],threshold:3.3901201095432043e-003,right_val:0.6401721239089966,left_val:0.4511859118938446},{features:[[14,15,5,3,-1.],[14,16,5,1,3.]],threshold:4.7070779837667942e-003,right_val:0.3555220961570740,left_val:0.5335658788681030},{features:[[5,4,3,3,-1.],[5,5,3,1,3.]],threshold:1.4819339849054813e-003,right_val:0.5772724151611328,left_val:0.4250707030296326},{features:[[14,15,5,3,-1.],[14,16,5,1,3.]],threshold:-6.9995759986341000e-003,right_val:0.5292900204658508,left_val:0.3003320097923279},{features:[[5,3,6,2,-1.],[7,3,2,2,3.]],threshold:0.0159390103071928,right_val:0.1675581932067871,left_val:0.5067319273948669},{features:[[8,15,4,3,-1.],[8,16,4,1,3.]],threshold:7.6377349905669689e-003,right_val:0.7085601091384888,left_val:0.4795069992542267},{features:[[1,15,5,3,-1.],[1,16,5,1,3.]],threshold:6.7334040068089962e-003,right_val:0.2162470072507858,left_val:0.5133113265037537},{features:[[8,13,4,6,-1.],[10,13,2,3,2.],[8,16,2,3,2.]],threshold:-0.0128588099032640,right_val:0.5251371860504150,left_val:0.1938841938972473},{features:[[7,8,3,3,-1.],[8,8,1,3,3.]],threshold:-6.2270800117403269e-004,right_val:0.4197868108749390,left_val:0.5686538219451904},{features:[[12,0,5,4,-1.],[12,2,5,2,2.]],threshold:-5.2651681471616030e-004,right_val:0.5429695844650269,left_val:0.4224168956279755},{features:[[0,2,20,2,-1.],[0,2,10,1,2.],[10,3,10,1,2.]],threshold:0.0110750999301672,right_val:0.2514517903327942,left_val:0.5113775134086609},{features:[[1,0,18,4,-1.],[7,0,6,4,3.]],threshold:-0.0367282517254353,right_val:0.4849618971347809,left_val:0.7194662094116211},{features:[[4,3,6,1,-1.],[6,3,2,1,3.]],threshold:-2.8207109426148236e-004,right_val:0.5394446253776550,left_val:0.3840261995792389},{features:[[4,18,13,2,-1.],[4,19,13,1,2.]],threshold:-2.7489690110087395e-003,right_val:0.4569182097911835,left_val:0.5937088727951050},{features:[[2,10,3,6,-1.],[2,12,3,2,3.]],threshold:0.0100475195795298,right_val:0.2802298069000244,left_val:0.5138576030731201},{features:[[14,12,6,8,-1.],[17,12,3,4,2.],[14,16,3,4,2.]],threshold:-8.1497840583324432e-003,right_val:0.4636121094226837,left_val:0.6090037226676941},{features:[[4,13,10,6,-1.],[4,13,5,3,2.],[9,16,5,3,2.]],threshold:-6.8833888508379459e-003,right_val:0.5254660248756409,left_val:0.3458611071109772},{features:[[14,12,1,2,-1.],[14,13,1,1,2.]],threshold:-1.4039360394235700e-005,right_val:0.4082083106040955,left_val:0.5693104267120361},{features:[[8,13,4,3,-1.],[8,14,4,1,3.]],threshold:1.5498419525101781e-003,right_val:0.5806517004966736,left_val:0.4350537061691284},{features:[[14,12,2,2,-1.],[14,13,2,1,2.]],threshold:-6.7841499112546444e-003,right_val:0.5182775259017944,left_val:0.1468873023986816},{features:[[4,12,2,2,-1.],[4,13,2,1,2.]],threshold:2.1705629478674382e-004,right_val:0.3456174135208130,left_val:0.5293524265289307},{features:[[8,12,9,2,-1.],[8,13,9,1,2.]],threshold:3.1198898795992136e-004,right_val:0.5942413806915283,left_val:0.4652450978755951},{features:[[9,14,2,3,-1.],[9,15,2,1,3.]],threshold:5.4507530294358730e-003,right_val:0.7024846076965332,left_val:0.4653508961200714},{features:[[11,10,3,6,-1.],[11,13,3,3,2.]],threshold:-2.5818689027801156e-004,right_val:0.3768967092037201,left_val:0.5497295260429382},{features:[[5,6,9,12,-1.],[5,12,9,6,2.]],threshold:-0.0174425393342972,right_val:0.5457497835159302,left_val:0.3919087946414948},{features:[[11,10,3,6,-1.],[11,13,3,3,2.]],threshold:-0.0453435294330120,right_val:0.5154908895492554,left_val:0.1631357073783875},{features:[[6,10,3,6,-1.],[6,13,3,3,2.]],threshold:1.9190689781680703e-003,right_val:0.2791895866394043,left_val:0.5145897865295410},{features:[[5,4,11,3,-1.],[5,5,11,1,3.]],threshold:-6.0177869163453579e-003,right_val:0.4756332933902741,left_val:0.6517636179924011},{features:[[7,1,5,10,-1.],[7,6,5,5,2.]],threshold:-4.0720738470554352e-003,right_val:0.4092685878276825,left_val:0.5514652729034424},{features:[[2,8,18,2,-1.],[2,9,18,1,2.]],threshold:3.9855059003457427e-004,right_val:0.5285550951957703,left_val:0.3165240883827210},{features:[[7,17,5,3,-1.],[7,18,5,1,3.]],threshold:-6.5418570302426815e-003,right_val:0.4652808904647827,left_val:0.6853377819061279},{features:[[5,9,12,1,-1.],[9,9,4,1,3.]],threshold:3.4845089539885521e-003,right_val:0.4502759873867035,left_val:0.5484588146209717},{features:[[0,14,6,6,-1.],[0,14,3,3,2.],[3,17,3,3,2.]],threshold:-0.0136967804282904,right_val:0.4572555124759674,left_val:0.6395779848098755},{features:[[5,9,12,1,-1.],[9,9,4,1,3.]],threshold:-0.0173471402376890,right_val:0.5181614756584168,left_val:0.2751072943210602},{features:[[3,9,12,1,-1.],[7,9,4,1,3.]],threshold:-4.0885428898036480e-003,right_val:0.5194984078407288,left_val:0.3325636088848114},{features:[[14,10,6,7,-1.],[14,10,3,7,2.]],threshold:-9.4687901437282562e-003,right_val:0.4851819872856140,left_val:0.5942280888557434},{features:[[1,0,16,2,-1.],[1,1,16,1,2.]],threshold:1.7084840219467878e-003,right_val:0.5519806146621704,left_val:0.4167110919952393},{features:[[10,9,10,9,-1.],[10,12,10,3,3.]],threshold:9.4809094443917274e-003,right_val:0.4208514988422394,left_val:0.5433894991874695},{features:[[0,1,10,2,-1.],[5,1,5,2,2.]],threshold:-4.7389650717377663e-003,right_val:0.4560655057430267,left_val:0.6407189965248108},{features:[[17,3,2,3,-1.],[17,4,2,1,3.]],threshold:6.5761050209403038e-003,right_val:0.2258227020502091,left_val:0.5214555263519287},{features:[[1,3,2,3,-1.],[1,4,2,1,3.]],threshold:-2.1690549328923225e-003,right_val:0.5156704783439636,left_val:0.3151527941226959},{features:[[9,7,3,6,-1.],[10,7,1,6,3.]],threshold:0.0146601703017950,right_val:0.6689941287040710,left_val:0.4870837032794952},{features:[[6,5,4,3,-1.],[8,5,2,3,2.]],threshold:1.7231999663636088e-004,right_val:0.5251078009605408,left_val:0.3569748997688294},{features:[[7,5,6,6,-1.],[9,5,2,6,3.]],threshold:-0.0218037609010935,right_val:0.4966329932212830,left_val:0.8825920820236206},{features:[[3,4,12,12,-1.],[3,4,6,6,2.],[9,10,6,6,2.]],threshold:-0.0947361066937447,right_val:0.5061113834381104,left_val:0.1446162015199661},{features:[[9,2,6,15,-1.],[11,2,2,15,3.]],threshold:5.5825551971793175e-003,right_val:0.4238066077232361,left_val:0.5396478772163391},{features:[[2,2,6,17,-1.],[4,2,2,17,3.]],threshold:1.9517090404406190e-003,right_val:0.5497786998748779,left_val:0.4170410931110382},{features:[[14,10,6,7,-1.],[14,10,3,7,2.]],threshold:0.0121499001979828,right_val:0.5664274096488953,left_val:0.4698367118835449},{features:[[0,10,6,7,-1.],[3,10,3,7,2.]],threshold:-7.5169620104134083e-003,right_val:0.4463135898113251,left_val:0.6267772912979126},{features:[[9,2,6,15,-1.],[11,2,2,15,3.]],threshold:-0.0716679096221924,right_val:0.5221003293991089,left_val:0.3097011148929596},{features:[[5,2,6,15,-1.],[7,2,2,15,3.]],threshold:-0.0882924199104309,right_val:0.5006365180015564,left_val:0.0811238884925842},{features:[[17,9,3,6,-1.],[17,11,3,2,3.]],threshold:0.0310630798339844,right_val:0.1282255947589874,left_val:0.5155503749847412},{features:[[6,7,6,6,-1.],[8,7,2,6,3.]],threshold:0.0466218404471874,right_val:0.7363960742950440,left_val:0.4699777960777283},{features:[[1,10,18,6,-1.],[10,10,9,3,2.],[1,13,9,3,2.]],threshold:-0.0121894897893071,right_val:0.5518996715545654,left_val:0.3920530080795288},{features:[[0,9,10,9,-1.],[0,12,10,3,3.]],threshold:0.0130161102861166,right_val:0.3685136139392853,left_val:0.5260658264160156},{features:[[8,15,4,3,-1.],[8,16,4,1,3.]],threshold:-3.4952899441123009e-003,right_val:0.4716280996799469,left_val:0.6339294910430908},{features:[[5,12,3,4,-1.],[5,14,3,2,2.]],threshold:-4.4015039748046547e-005,right_val:0.3776184916496277,left_val:0.5333027243614197},{features:[[3,3,16,12,-1.],[3,9,16,6,2.]],threshold:-0.1096649020910263,right_val:0.5198346972465515,left_val:0.1765342056751251},{features:[[1,1,12,12,-1.],[1,1,6,6,2.],[7,7,6,6,2.]],threshold:-9.0279558207839727e-004,right_val:0.3838908076286316,left_val:0.5324159860610962},{features:[[10,4,2,4,-1.],[11,4,1,2,2.],[10,6,1,2,2.]],threshold:7.1126641705632210e-004,right_val:0.5755224227905273,left_val:0.4647929966449738},{features:[[0,9,10,2,-1.],[0,9,5,1,2.],[5,10,5,1,2.]],threshold:-3.1250279862433672e-003,right_val:0.5166770815849304,left_val:0.3236708939075470},{features:[[9,11,3,3,-1.],[9,12,3,1,3.]],threshold:2.4144679773598909e-003,right_val:0.6459717750549316,left_val:0.4787439107894898},{features:[[3,12,9,2,-1.],[3,13,9,1,2.]],threshold:4.4391240226104856e-004,right_val:0.6010255813598633,left_val:0.4409308135509491},{features:[[9,9,2,2,-1.],[9,10,2,1,2.]],threshold:-2.2611189342569560e-004,right_val:0.5493255853652954,left_val:0.4038113951683044}],threshold:50.1697311401367190},{simpleClassifiers:[{features:[[3,4,13,6,-1.],[3,6,13,2,3.]],threshold:-0.0469012893736362,right_val:0.3743801116943359,left_val:0.6600171923637390},{features:[[9,7,6,4,-1.],[12,7,3,2,2.],[9,9,3,2,2.]],threshold:-1.4568349579349160e-003,right_val:0.3437797129154205,left_val:0.5783991217613220},{features:[[1,0,6,8,-1.],[4,0,3,8,2.]],threshold:5.5598369799554348e-003,right_val:0.5908216238021851,left_val:0.3622266948223114},{features:[[9,5,2,12,-1.],[9,11,2,6,2.]],threshold:7.3170487303286791e-004,right_val:0.2873558104038239,left_val:0.5500419139862061},{features:[[4,4,3,10,-1.],[4,9,3,5,2.]],threshold:1.3318009441718459e-003,right_val:0.5431019067764282,left_val:0.2673169970512390},{features:[[6,17,8,3,-1.],[6,18,8,1,3.]],threshold:2.4347059661522508e-004,right_val:0.5741388797760010,left_val:0.3855027854442596},{features:[[0,5,10,6,-1.],[0,7,10,2,3.]],threshold:-3.0512469820678234e-003,right_val:0.3462845087051392,left_val:0.5503209829330444},{features:[[13,2,3,2,-1.],[13,3,3,1,2.]],threshold:-6.8657199153676629e-004,right_val:0.5429509282112122,left_val:0.3291221857070923},{features:[[7,5,4,5,-1.],[9,5,2,5,2.]],threshold:1.4668200165033340e-003,right_val:0.5351811051368713,left_val:0.3588382005691528},{features:[[12,14,3,6,-1.],[12,16,3,2,3.]],threshold:3.2021870720200241e-004,right_val:0.5700234174728394,left_val:0.4296841919422150},{features:[[1,11,8,2,-1.],[1,12,8,1,2.]],threshold:7.4122188379988074e-004,right_val:0.3366870880126953,left_val:0.5282164812088013},{features:[[7,13,6,3,-1.],[7,14,6,1,3.]],threshold:3.8330298848450184e-003,right_val:0.6257336139678955,left_val:0.4559567868709564},{features:[[0,5,3,6,-1.],[0,7,3,2,3.]],threshold:-0.0154564399272203,right_val:0.5129452943801880,left_val:0.2350116968154907},{features:[[13,2,3,2,-1.],[13,3,3,1,2.]],threshold:2.6796779129654169e-003,right_val:0.4155062139034271,left_val:0.5329415202140808},{features:[[4,14,4,6,-1.],[4,14,2,3,2.],[6,17,2,3,2.]],threshold:2.8296569362282753e-003,right_val:0.5804538130760193,left_val:0.4273087978363037},{features:[[13,2,3,2,-1.],[13,3,3,1,2.]],threshold:-3.9444249123334885e-003,right_val:0.5202686190605164,left_val:0.2912611961364746},{features:[[8,2,4,12,-1.],[8,6,4,4,3.]],threshold:2.7179559692740440e-003,right_val:0.3585677146911621,left_val:0.5307688117027283},{features:[[14,0,6,8,-1.],[17,0,3,4,2.],[14,4,3,4,2.]],threshold:5.9077627956867218e-003,right_val:0.5941585898399353,left_val:0.4703775048255920},{features:[[7,17,3,2,-1.],[8,17,1,2,3.]],threshold:-4.2240349575877190e-003,right_val:0.5088796019554138,left_val:0.2141567021608353},{features:[[8,12,4,2,-1.],[8,13,4,1,2.]],threshold:4.0725888684391975e-003,right_val:0.6841061115264893,left_val:0.4766413867473602},{features:[[6,0,8,12,-1.],[6,0,4,6,2.],[10,6,4,6,2.]],threshold:0.0101495301350951,right_val:0.3748497068881989,left_val:0.5360798835754395},{features:[[14,0,2,10,-1.],[15,0,1,5,2.],[14,5,1,5,2.]],threshold:-1.8864999583456665e-004,right_val:0.3853805065155029,left_val:0.5720130205154419},{features:[[5,3,8,6,-1.],[5,3,4,3,2.],[9,6,4,3,2.]],threshold:-4.8864358104765415e-003,right_val:0.5340958833694458,left_val:0.3693122863769531},{features:[[14,0,6,10,-1.],[17,0,3,5,2.],[14,5,3,5,2.]],threshold:0.0261584799736738,right_val:0.6059989929199219,left_val:0.4962374866008759},{features:[[9,14,1,2,-1.],[9,15,1,1,2.]],threshold:4.8560759751126170e-004,right_val:0.6012468934059143,left_val:0.4438945949077606},{features:[[15,10,4,3,-1.],[15,11,4,1,3.]],threshold:0.0112687097862363,right_val:0.1840388029813767,left_val:0.5244250297546387},{features:[[8,14,2,3,-1.],[8,15,2,1,3.]],threshold:-2.8114619199186563e-003,right_val:0.4409897029399872,left_val:0.6060283780097961},{features:[[3,13,14,4,-1.],[10,13,7,2,2.],[3,15,7,2,2.]],threshold:-5.6112729944288731e-003,right_val:0.5589237213134766,left_val:0.3891170918941498},{features:[[1,10,4,3,-1.],[1,11,4,1,3.]],threshold:8.5680093616247177e-003,right_val:0.2062619030475617,left_val:0.5069345831871033},{features:[[9,11,6,1,-1.],[11,11,2,1,3.]],threshold:-3.8172779022715986e-004,right_val:0.4192610979080200,left_val:0.5882201790809631},{features:[[5,11,6,1,-1.],[7,11,2,1,3.]],threshold:-1.7680290329735726e-004,right_val:0.4003368914127350,left_val:0.5533605813980103},{features:[[3,5,16,15,-1.],[3,10,16,5,3.]],threshold:6.5112537704408169e-003,right_val:0.5444191098213196,left_val:0.3310146927833557},{features:[[6,12,4,2,-1.],[8,12,2,2,2.]],threshold:-6.5948683186434209e-005,right_val:0.3944905996322632,left_val:0.5433831810951233},{features:[[4,4,12,10,-1.],[10,4,6,5,2.],[4,9,6,5,2.]],threshold:6.9939051754772663e-003,right_val:0.4192714095115662,left_val:0.5600358247756958},{features:[[8,6,3,4,-1.],[9,6,1,4,3.]],threshold:-4.6744439750909805e-003,right_val:0.4604960978031158,left_val:0.6685466766357422},{features:[[8,12,4,8,-1.],[10,12,2,4,2.],[8,16,2,4,2.]],threshold:0.0115898502990603,right_val:0.2926830053329468,left_val:0.5357121229171753},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:0.0130078401416540,right_val:0.7307463288307190,left_val:0.4679817855358124},{features:[[12,2,3,2,-1.],[13,2,1,2,3.]],threshold:-1.1008579749614000e-003,right_val:0.5415065288543701,left_val:0.3937501013278961},{features:[[8,15,3,2,-1.],[8,16,3,1,2.]],threshold:6.0472649056464434e-004,right_val:0.5604041218757629,left_val:0.4242376089096069},{features:[[6,0,9,14,-1.],[9,0,3,14,3.]],threshold:-0.0144948400557041,right_val:0.5293182730674744,left_val:0.3631210029125214},{features:[[9,6,2,3,-1.],[10,6,1,3,2.]],threshold:-5.3056948818266392e-003,right_val:0.4621821045875549,left_val:0.6860452294349670},{features:[[10,8,2,3,-1.],[10,9,2,1,3.]],threshold:-8.1829127157106996e-004,right_val:0.5420439243316650,left_val:0.3944096863269806},{features:[[0,9,4,6,-1.],[0,11,4,2,3.]],threshold:-0.0190775208175182,right_val:0.5037891864776611,left_val:0.1962621957063675},{features:[[6,0,8,2,-1.],[6,1,8,1,2.]],threshold:3.5549470339901745e-004,right_val:0.5613973140716553,left_val:0.4086259007453919},{features:[[6,14,7,3,-1.],[6,15,7,1,3.]],threshold:1.9679730758070946e-003,right_val:0.5926123261451721,left_val:0.4489121139049530},{features:[[8,10,8,9,-1.],[8,13,8,3,3.]],threshold:6.9189141504466534e-003,right_val:0.3728385865688324,left_val:0.5335925817489624},{features:[[5,2,3,2,-1.],[6,2,1,2,3.]],threshold:2.9872779268771410e-003,right_val:0.2975643873214722,left_val:0.5111321210861206},{features:[[14,1,6,8,-1.],[17,1,3,4,2.],[14,5,3,4,2.]],threshold:-6.2264618463814259e-003,right_val:0.4824537932872772,left_val:0.5541489720344544},{features:[[0,1,6,8,-1.],[0,1,3,4,2.],[3,5,3,4,2.]],threshold:0.0133533002808690,right_val:0.6414797902107239,left_val:0.4586423933506012},{features:[[1,2,18,6,-1.],[10,2,9,3,2.],[1,5,9,3,2.]],threshold:0.0335052385926247,right_val:0.3429994881153107,left_val:0.5392425060272217},{features:[[9,3,2,1,-1.],[10,3,1,1,2.]],threshold:-2.5294460356235504e-003,right_val:0.5013315081596375,left_val:0.1703713983297348},{features:[[13,2,4,6,-1.],[15,2,2,3,2.],[13,5,2,3,2.]],threshold:-1.2801629491150379e-003,right_val:0.4697405099868774,left_val:0.5305461883544922},{features:[[5,4,3,3,-1.],[5,5,3,1,3.]],threshold:7.0687388069927692e-003,right_val:0.6436504721641541,left_val:0.4615545868873596},{features:[[13,5,1,3,-1.],[13,6,1,1,3.]],threshold:9.6880499040707946e-004,right_val:0.6043894290924072,left_val:0.4833599030971527},{features:[[2,16,5,3,-1.],[2,17,5,1,3.]],threshold:3.9647659286856651e-003,right_val:0.3231816887855530,left_val:0.5187637209892273},{features:[[13,2,4,6,-1.],[15,2,2,3,2.],[13,5,2,3,2.]],threshold:-0.0220577307045460,right_val:0.5200980901718140,left_val:0.4079256951808929},{features:[[3,2,4,6,-1.],[3,2,2,3,2.],[5,5,2,3,2.]],threshold:-6.6906312713399529e-004,right_val:0.3815600872039795,left_val:0.5331609249114990},{features:[[13,5,1,2,-1.],[13,6,1,1,2.]],threshold:-6.7009328631684184e-004,right_val:0.4688901901245117,left_val:0.5655422210693359},{features:[[5,5,2,2,-1.],[5,6,2,1,2.]],threshold:7.4284552829340100e-004,right_val:0.6287400126457214,left_val:0.4534381031990051},{features:[[13,9,2,2,-1.],[13,9,1,2,2.]],threshold:2.2227810695767403e-003,right_val:0.3303655982017517,left_val:0.5350633263587952},{features:[[5,9,2,2,-1.],[6,9,1,2,2.]],threshold:-5.4130521602928638e-003,right_val:0.5005434751510620,left_val:0.1113687008619309},{features:[[13,17,3,2,-1.],[13,18,3,1,2.]],threshold:-1.4520040167553816e-005,right_val:0.4325133860111237,left_val:0.5628737807273865},{features:[[6,16,4,4,-1.],[6,16,2,2,2.],[8,18,2,2,2.]],threshold:2.3369169502984732e-004,right_val:0.5447791218757629,left_val:0.4165835082530975},{features:[[9,16,2,3,-1.],[9,17,2,1,3.]],threshold:4.2894547805190086e-003,right_val:0.6778649091720581,left_val:0.4860391020774841},{features:[[0,13,9,6,-1.],[0,15,9,2,3.]],threshold:5.9103150852024555e-003,right_val:0.3612113893032074,left_val:0.5262305140495300},{features:[[9,14,2,6,-1.],[9,17,2,3,2.]],threshold:0.0129005396738648,right_val:0.3250288069248200,left_val:0.5319377183914185},{features:[[9,15,2,3,-1.],[9,16,2,1,3.]],threshold:4.6982979401946068e-003,right_val:0.6665925979614258,left_val:0.4618245065212250},{features:[[1,10,18,6,-1.],[1,12,18,2,3.]],threshold:0.0104398597031832,right_val:0.3883604109287262,left_val:0.5505670905113220},{features:[[8,11,4,2,-1.],[8,12,4,1,2.]],threshold:3.0443191062659025e-003,right_val:0.7301844954490662,left_val:0.4697853028774262},{features:[[7,9,6,2,-1.],[7,10,6,1,2.]],threshold:-6.1593751888722181e-004,right_val:0.5464984178543091,left_val:0.3830839097499847},{features:[[8,8,2,3,-1.],[8,9,2,1,3.]],threshold:-3.4247159492224455e-003,right_val:0.5089530944824219,left_val:0.2566300034523010},{features:[[17,5,3,4,-1.],[18,5,1,4,3.]],threshold:-9.3538565561175346e-003,right_val:0.4940795898437500,left_val:0.6469966173171997},{features:[[1,19,18,1,-1.],[7,19,6,1,3.]],threshold:0.0523389987647533,right_val:0.7878770828247070,left_val:0.4745982885360718},{features:[[9,0,3,2,-1.],[10,0,1,2,3.]],threshold:3.5765620414167643e-003,right_val:0.2748498022556305,left_val:0.5306664705276489},{features:[[1,8,1,6,-1.],[1,10,1,2,3.]],threshold:7.1555317845195532e-004,right_val:0.4041908979415894,left_val:0.5413125753402710},{features:[[12,17,8,3,-1.],[12,17,4,3,2.]],threshold:-0.0105166798457503,right_val:0.4815283119678497,left_val:0.6158512234687805},{features:[[0,5,3,4,-1.],[1,5,1,4,3.]],threshold:7.7347927726805210e-003,right_val:0.7028980851173401,left_val:0.4695805907249451},{features:[[9,7,2,3,-1.],[9,8,2,1,3.]],threshold:-4.3226778507232666e-003,right_val:0.5304684042930603,left_val:0.2849566042423248},{features:[[7,11,2,2,-1.],[7,11,1,1,2.],[8,12,1,1,2.]],threshold:-2.5534399319440126e-003,right_val:0.4688892066478729,left_val:0.7056984901428223},{features:[[11,3,2,5,-1.],[11,3,1,5,2.]],threshold:1.0268510231981054e-004,right_val:0.5573464035987854,left_val:0.3902932107448578},{features:[[7,3,2,5,-1.],[8,3,1,5,2.]],threshold:7.1395188570022583e-006,right_val:0.5263987779617310,left_val:0.3684231936931610},{features:[[15,13,2,3,-1.],[15,14,2,1,3.]],threshold:-1.6711989883333445e-003,right_val:0.5387271046638489,left_val:0.3849175870418549},{features:[[5,6,2,3,-1.],[5,7,2,1,3.]],threshold:4.9260449595749378e-003,right_val:0.7447251081466675,left_val:0.4729771912097931},{features:[[4,19,15,1,-1.],[9,19,5,1,3.]],threshold:4.3908702209591866e-003,right_val:0.5591921806335449,left_val:0.4809181094169617},{features:[[1,19,15,1,-1.],[6,19,5,1,3.]],threshold:-0.0177936293184757,right_val:0.4676927030086517,left_val:0.6903678178787231},{features:[[15,13,2,3,-1.],[15,14,2,1,3.]],threshold:2.0469669252634048e-003,right_val:0.3308162093162537,left_val:0.5370690226554871},{features:[[5,0,4,15,-1.],[7,0,2,15,2.]],threshold:0.0298914890736341,right_val:0.3309059143066406,left_val:0.5139865279197693},{features:[[9,6,2,5,-1.],[9,6,1,5,2.]],threshold:1.5494900289922953e-003,right_val:0.6078342795372009,left_val:0.4660237133502960},{features:[[9,5,2,7,-1.],[10,5,1,7,2.]],threshold:1.4956969534978271e-003,right_val:0.5863919854164124,left_val:0.4404835999011993},{features:[[16,11,3,3,-1.],[16,12,3,1,3.]],threshold:9.5885928021743894e-004,right_val:0.4208523035049439,left_val:0.5435971021652222},{features:[[1,11,3,3,-1.],[1,12,3,1,3.]],threshold:4.9643701640889049e-004,right_val:0.4000622034072876,left_val:0.5370578169822693},{features:[[6,6,8,3,-1.],[6,7,8,1,3.]],threshold:-2.7280810754746199e-003,right_val:0.4259642958641052,left_val:0.5659412741661072},{features:[[0,15,6,2,-1.],[0,16,6,1,2.]],threshold:2.3026480339467525e-003,right_val:0.3350869119167328,left_val:0.5161657929420471},{features:[[1,0,18,6,-1.],[7,0,6,6,3.]],threshold:0.2515163123607636,right_val:0.7147309780120850,left_val:0.4869661927223206},{features:[[6,0,3,4,-1.],[7,0,1,4,3.]],threshold:-4.6328022144734859e-003,right_val:0.5083789825439453,left_val:0.2727448940277100},{features:[[14,10,4,10,-1.],[16,10,2,5,2.],[14,15,2,5,2.]],threshold:-0.0404344908893108,right_val:0.5021767020225525,left_val:0.6851438879966736},{features:[[3,2,3,2,-1.],[4,2,1,2,3.]],threshold:1.4972220014897175e-005,right_val:0.5522555112838745,left_val:0.4284465014934540},{features:[[11,2,2,2,-1.],[11,3,2,1,2.]],threshold:-2.4050309730228037e-004,right_val:0.5390074849128723,left_val:0.4226118922233582},{features:[[2,10,4,10,-1.],[2,10,2,5,2.],[4,15,2,5,2.]],threshold:0.0236578397452831,right_val:0.7504366040229797,left_val:0.4744631946086884},{features:[[0,13,20,6,-1.],[10,13,10,3,2.],[0,16,10,3,2.]],threshold:-8.1449104472994804e-003,right_val:0.5538362860679627,left_val:0.4245058894157410},{features:[[0,5,2,15,-1.],[1,5,1,15,2.]],threshold:-3.6992130335420370e-003,right_val:0.4529713094234467,left_val:0.5952357053756714},{features:[[1,7,18,4,-1.],[10,7,9,2,2.],[1,9,9,2,2.]],threshold:-6.7718601785600185e-003,right_val:0.5473399758338928,left_val:0.4137794077396393},{features:[[0,0,2,17,-1.],[1,0,1,17,2.]],threshold:4.2669530957937241e-003,right_val:0.5797994136810303,left_val:0.4484114944934845},{features:[[2,6,16,6,-1.],[10,6,8,3,2.],[2,9,8,3,2.]],threshold:1.7791989957913756e-003,right_val:0.4432444870471954,left_val:0.5624858736991882},{features:[[8,14,1,3,-1.],[8,15,1,1,3.]],threshold:1.6774770338088274e-003,right_val:0.6364241838455200,left_val:0.4637751877307892},{features:[[8,15,4,2,-1.],[8,16,4,1,2.]],threshold:1.1732629500329494e-003,right_val:0.5914415717124939,left_val:0.4544503092765808},{features:[[5,2,8,2,-1.],[5,2,4,1,2.],[9,3,4,1,2.]],threshold:8.6998171173036098e-004,right_val:0.3885917961597443,left_val:0.5334752798080444},{features:[[6,11,8,6,-1.],[6,14,8,3,2.]],threshold:7.6378340600058436e-004,right_val:0.3744941949844360,left_val:0.5398585200309753},{features:[[9,13,2,2,-1.],[9,14,2,1,2.]],threshold:1.5684569370932877e-004,right_val:0.5614616274833679,left_val:0.4317873120307922},{features:[[18,4,2,6,-1.],[18,6,2,2,3.]],threshold:-0.0215113703161478,right_val:0.5185542702674866,left_val:0.1785925030708313},{features:[[9,12,2,2,-1.],[9,13,2,1,2.]],threshold:1.3081369979772717e-004,right_val:0.5682849884033203,left_val:0.4342499077320099},{features:[[18,4,2,6,-1.],[18,6,2,2,3.]],threshold:0.0219920407980680,right_val:0.2379394024610519,left_val:0.5161716938018799},{features:[[9,13,1,3,-1.],[9,14,1,1,3.]],threshold:-8.0136500764638186e-004,right_val:0.4466426968574524,left_val:0.5986763238906860},{features:[[18,4,2,6,-1.],[18,6,2,2,3.]],threshold:-8.2736099138855934e-003,right_val:0.5251057147979736,left_val:0.4108217954635620},{features:[[0,4,2,6,-1.],[0,6,2,2,3.]],threshold:3.6831789184361696e-003,right_val:0.3397518098354340,left_val:0.5173814296722412},{features:[[9,12,3,3,-1.],[9,13,3,1,3.]],threshold:-7.9525681212544441e-003,right_val:0.4845924079418182,left_val:0.6888983249664307},{features:[[3,13,2,3,-1.],[3,14,2,1,3.]],threshold:1.5382299898192286e-003,right_val:0.3454113900661469,left_val:0.5178567171096802},{features:[[13,13,4,3,-1.],[13,14,4,1,3.]],threshold:-0.0140435304492712,right_val:0.5188667774200440,left_val:0.1678421050310135},{features:[[5,4,3,3,-1.],[5,5,3,1,3.]],threshold:1.4315890148282051e-003,right_val:0.5655773878097534,left_val:0.4368256926536560},{features:[[5,2,10,6,-1.],[5,4,10,2,3.]],threshold:-0.0340142287313938,right_val:0.4959217011928558,left_val:0.7802296280860901},{features:[[3,13,4,3,-1.],[3,14,4,1,3.]],threshold:-0.0120272999629378,right_val:0.5032231807708740,left_val:0.1585101038217545},{features:[[3,7,15,5,-1.],[8,7,5,5,3.]],threshold:0.1331661939620972,right_val:0.2755128145217896,left_val:0.5163304805755615},{features:[[3,7,12,2,-1.],[7,7,4,2,3.]],threshold:-1.5221949433907866e-003,right_val:0.5214552283287048,left_val:0.3728317916393280},{features:[[10,3,3,9,-1.],[11,3,1,9,3.]],threshold:-9.3929271679371595e-004,right_val:0.4511165022850037,left_val:0.5838379263877869},{features:[[8,6,4,6,-1.],[10,6,2,6,2.]],threshold:0.0277197398245335,right_val:0.7331544756889343,left_val:0.4728286862373352},{features:[[9,7,4,3,-1.],[9,8,4,1,3.]],threshold:3.1030150130391121e-003,right_val:0.4101563096046448,left_val:0.5302202105522156},{features:[[0,9,4,9,-1.],[2,9,2,9,2.]],threshold:0.0778612196445465,right_val:0.1272961944341660,left_val:0.4998334050178528},{features:[[9,13,3,5,-1.],[10,13,1,5,3.]],threshold:-0.0158549398183823,right_val:0.5165656208992004,left_val:0.0508333593606949},{features:[[7,7,6,3,-1.],[9,7,2,3,3.]],threshold:-4.9725300632417202e-003,right_val:0.4684231877326965,left_val:0.6798133850097656},{features:[[9,7,3,5,-1.],[10,7,1,5,3.]],threshold:-9.7676506265997887e-004,right_val:0.4788931906223297,left_val:0.6010771989822388},{features:[[5,7,8,2,-1.],[9,7,4,2,2.]],threshold:-2.4647710379213095e-003,right_val:0.5220503807067871,left_val:0.3393397927284241},{features:[[5,9,12,2,-1.],[9,9,4,2,3.]],threshold:-6.7937700077891350e-003,right_val:0.5239663124084473,left_val:0.4365136921405792},{features:[[5,6,10,3,-1.],[10,6,5,3,2.]],threshold:0.0326080210506916,right_val:0.2425214946269989,left_val:0.5052723884582520},{features:[[10,12,3,1,-1.],[11,12,1,1,3.]],threshold:-5.8514421107247472e-004,right_val:0.4758574068546295,left_val:0.5733973979949951},{features:[[0,1,11,15,-1.],[0,6,11,5,3.]],threshold:-0.0296326000243425,right_val:0.5263597965240479,left_val:0.3892289102077484}],threshold:66.6691207885742190},{simpleClassifiers:[{features:[[1,0,18,6,-1.],[7,0,6,6,3.]],threshold:0.0465508513152599,right_val:0.6240522861480713,left_val:0.3276950120925903},{features:[[7,7,6,1,-1.],[9,7,2,1,3.]],threshold:7.9537127166986465e-003,right_val:0.6942939162254334,left_val:0.4256485104560852},{features:[[5,16,6,4,-1.],[5,16,3,2,2.],[8,18,3,2,2.]],threshold:6.8221561377868056e-004,right_val:0.5900732874870300,left_val:0.3711487054824829},{features:[[6,5,9,8,-1.],[6,9,9,4,2.]],threshold:-1.9348249770700932e-004,right_val:0.5300545096397400,left_val:0.2041133940219879},{features:[[5,10,2,6,-1.],[5,13,2,3,2.]],threshold:-2.6710508973337710e-004,right_val:0.3103179037570953,left_val:0.5416126251220703},{features:[[7,6,8,10,-1.],[11,6,4,5,2.],[7,11,4,5,2.]],threshold:2.7818060480058193e-003,right_val:0.3467069864273071,left_val:0.5277832746505737},{features:[[5,6,8,10,-1.],[5,6,4,5,2.],[9,11,4,5,2.]],threshold:-4.6779078547842801e-004,right_val:0.3294492065906525,left_val:0.5308231115341187},{features:[[9,5,2,2,-1.],[9,6,2,1,2.]],threshold:-3.0335160772665404e-005,right_val:0.3852097094058991,left_val:0.5773872733116150},{features:[[5,12,8,2,-1.],[5,13,8,1,2.]],threshold:7.8038009814918041e-004,right_val:0.6150057911872864,left_val:0.4317438900470734},{features:[[10,2,8,2,-1.],[10,3,8,1,2.]],threshold:-4.2553851380944252e-003,right_val:0.5324292778968811,left_val:0.2933903932571411},{features:[[4,0,2,10,-1.],[4,0,1,5,2.],[5,5,1,5,2.]],threshold:-2.4735610350035131e-004,right_val:0.3843030035495758,left_val:0.5468844771385193},{features:[[9,10,2,2,-1.],[9,11,2,1,2.]],threshold:-1.4724259381182492e-004,right_val:0.5755587220191956,left_val:0.4281542897224426},{features:[[2,8,15,3,-1.],[2,9,15,1,3.]],threshold:1.1864770203828812e-003,right_val:0.5471466183662415,left_val:0.3747301101684570},{features:[[8,13,4,3,-1.],[8,14,4,1,3.]],threshold:2.3936580400913954e-003,right_val:0.6111528873443604,left_val:0.4537783861160278},{features:[[7,2,3,2,-1.],[8,2,1,2,3.]],threshold:-1.5390539774671197e-003,right_val:0.5189538002014160,left_val:0.2971341907978058},{features:[[7,13,6,3,-1.],[7,14,6,1,3.]],threshold:-7.1968790143728256e-003,right_val:0.4726476967334747,left_val:0.6699066758155823},{features:[[9,9,2,2,-1.],[9,10,2,1,2.]],threshold:-4.1499789222143590e-004,right_val:0.5260317921638489,left_val:0.3384954035282135},{features:[[17,2,3,6,-1.],[17,4,3,2,3.]],threshold:4.4359830208122730e-003,right_val:0.3920140862464905,left_val:0.5399122238159180},{features:[[1,5,3,4,-1.],[2,5,1,4,3.]],threshold:2.6606200262904167e-003,right_val:0.6119617819786072,left_val:0.4482578039169312},{features:[[14,8,4,6,-1.],[14,10,4,2,3.]],threshold:-1.5287200221791863e-003,right_val:0.5340266227722168,left_val:0.3711237907409668},{features:[[1,4,3,8,-1.],[2,4,1,8,3.]],threshold:-4.7397250309586525e-003,right_val:0.4455145001411438,left_val:0.6031088232994080},{features:[[8,13,4,6,-1.],[8,16,4,3,2.]],threshold:-0.0148291299119592,right_val:0.5341861844062805,left_val:0.2838754057884216},{features:[[3,14,2,2,-1.],[3,15,2,1,2.]],threshold:9.2275557108223438e-004,right_val:0.3361653983592987,left_val:0.5209547281265259},{features:[[14,8,4,6,-1.],[14,10,4,2,3.]],threshold:0.0835298076272011,right_val:0.0811644494533539,left_val:0.5119969844818115},{features:[[2,8,4,6,-1.],[2,10,4,2,3.]],threshold:-7.5633148662745953e-004,right_val:0.5189831256866455,left_val:0.3317120075225830},{features:[[10,14,1,6,-1.],[10,17,1,3,2.]],threshold:9.8403859883546829e-003,right_val:0.2334959059953690,left_val:0.5247598290443420},{features:[[7,5,3,6,-1.],[8,5,1,6,3.]],threshold:-1.5953830443322659e-003,right_val:0.4295622110366821,left_val:0.5750094056129456},{features:[[11,2,2,6,-1.],[12,2,1,3,2.],[11,5,1,3,2.]],threshold:3.4766020689858124e-005,right_val:0.5564029216766357,left_val:0.4342445135116577},{features:[[6,6,6,5,-1.],[8,6,2,5,3.]],threshold:0.0298629105091095,right_val:0.6579188108444214,left_val:0.4579147100448608},{features:[[17,1,3,6,-1.],[17,3,3,2,3.]],threshold:0.0113255903124809,right_val:0.3673888146877289,left_val:0.5274311900138855},{features:[[8,7,3,5,-1.],[9,7,1,5,3.]],threshold:-8.7828645482659340e-003,right_val:0.4642167091369629,left_val:0.7100368738174439},{features:[[9,18,3,2,-1.],[10,18,1,2,3.]],threshold:4.3639959767460823e-003,right_val:0.2705877125263214,left_val:0.5279216170310974},{features:[[8,18,3,2,-1.],[9,18,1,2,3.]],threshold:4.1804728098213673e-003,right_val:0.2449083030223846,left_val:0.5072525143623352},{features:[[12,3,5,2,-1.],[12,4,5,1,2.]],threshold:-4.5668511302210391e-004,right_val:0.5548691153526306,left_val:0.4283105134963989},{features:[[7,1,5,12,-1.],[7,7,5,6,2.]],threshold:-3.7140368949621916e-003,right_val:0.4103653132915497,left_val:0.5519387722015381},{features:[[1,0,18,4,-1.],[7,0,6,4,3.]],threshold:-0.0253042895346880,right_val:0.4869889020919800,left_val:0.6867002248764038},{features:[[4,2,2,2,-1.],[4,3,2,1,2.]],threshold:-3.4454080741852522e-004,right_val:0.5287693142890930,left_val:0.3728874027729034},{features:[[11,14,4,2,-1.],[13,14,2,1,2.],[11,15,2,1,2.]],threshold:-8.3935231668874621e-004,right_val:0.4616062045097351,left_val:0.6060152053833008},{features:[[0,2,3,6,-1.],[0,4,3,2,3.]],threshold:0.0172800496220589,right_val:0.1819823980331421,left_val:0.5049635767936707},{features:[[9,7,2,3,-1.],[9,8,2,1,3.]],threshold:-6.3595077954232693e-003,right_val:0.5232778787612915,left_val:0.1631239950656891},{features:[[5,5,1,3,-1.],[5,6,1,1,3.]],threshold:1.0298109846189618e-003,right_val:0.6176549196243286,left_val:0.4463278055191040},{features:[[10,10,6,1,-1.],[10,10,3,1,2.]],threshold:1.0117109632119536e-003,right_val:0.4300698935985565,left_val:0.5473384857177734},{features:[[4,10,6,1,-1.],[7,10,3,1,2.]],threshold:-0.0103088002651930,right_val:0.5000867247581482,left_val:0.1166985034942627},{features:[[9,17,3,3,-1.],[9,18,3,1,3.]],threshold:5.4682018235325813e-003,right_val:0.6719213724136353,left_val:0.4769287109375000},{features:[[4,14,1,3,-1.],[4,15,1,1,3.]],threshold:-9.1696460731327534e-004,right_val:0.5178164839744568,left_val:0.3471089899539948},{features:[[12,5,3,3,-1.],[12,6,3,1,3.]],threshold:2.3922820109874010e-003,right_val:0.6216310858726502,left_val:0.4785236120223999},{features:[[4,5,12,3,-1.],[4,6,12,1,3.]],threshold:-7.5573818758130074e-003,right_val:0.4410085082054138,left_val:0.5814796090126038},{features:[[9,8,2,3,-1.],[9,9,2,1,3.]],threshold:-7.7024032361805439e-004,right_val:0.5465722084045410,left_val:0.3878000080585480},{features:[[4,9,3,3,-1.],[5,9,1,3,3.]],threshold:-8.7125990539789200e-003,right_val:0.4995836019515991,left_val:0.1660051047801971},{features:[[6,0,9,17,-1.],[9,0,3,17,3.]],threshold:-0.0103063201531768,right_val:0.5274233818054199,left_val:0.4093391001224518},{features:[[9,12,1,3,-1.],[9,13,1,1,3.]],threshold:-2.0940979011356831e-003,right_val:0.4572280049324036,left_val:0.6206194758415222},{features:[[9,5,2,15,-1.],[9,10,2,5,3.]],threshold:6.8099051713943481e-003,right_val:0.4155600070953369,left_val:0.5567759275436401},{features:[[8,14,2,3,-1.],[8,15,2,1,3.]],threshold:-1.0746059706434608e-003,right_val:0.4353024959564209,left_val:0.5638927817344666},{features:[[10,14,1,3,-1.],[10,15,1,1,3.]],threshold:2.1550289820879698e-003,right_val:0.6749758124351502,left_val:0.4826265871524811},{features:[[7,1,6,5,-1.],[9,1,2,5,3.]],threshold:0.0317423194646835,right_val:0.1883248984813690,left_val:0.5048379898071289},{features:[[0,0,20,2,-1.],[0,0,10,2,2.]],threshold:-0.0783827230334282,right_val:0.5260158181190491,left_val:0.2369548976421356},{features:[[2,13,5,3,-1.],[2,14,5,1,3.]],threshold:5.7415119372308254e-003,right_val:0.2776469886302948,left_val:0.5048828721046448},{features:[[9,11,2,3,-1.],[9,12,2,1,3.]],threshold:-2.9014600440859795e-003,right_val:0.4693317115306854,left_val:0.6238604784011841},{features:[[2,5,9,15,-1.],[2,10,9,5,3.]],threshold:-2.6427931152284145e-003,right_val:0.5169777274131775,left_val:0.3314141929149628},{features:[[5,0,12,10,-1.],[11,0,6,5,2.],[5,5,6,5,2.]],threshold:-0.1094966009259224,right_val:0.5183441042900085,left_val:0.2380045056343079},{features:[[5,1,2,3,-1.],[6,1,1,3,2.]],threshold:7.4075913289561868e-005,right_val:0.5362150073051453,left_val:0.4069635868072510},{features:[[10,7,6,1,-1.],[12,7,2,1,3.]],threshold:-5.0593802006915212e-004,right_val:0.4374594092369080,left_val:0.5506706237792969},{features:[[3,1,2,10,-1.],[3,1,1,5,2.],[4,6,1,5,2.]],threshold:-8.2131777890026569e-004,right_val:0.4209375977516174,left_val:0.5525709986686707},{features:[[13,7,2,1,-1.],[13,7,1,1,2.]],threshold:-6.0276539443293586e-005,right_val:0.4748266041278839,left_val:0.5455474853515625},{features:[[4,13,4,6,-1.],[4,15,4,2,3.]],threshold:6.8065142259001732e-003,right_val:0.3424577116966248,left_val:0.5157995820045471},{features:[[13,7,2,1,-1.],[13,7,1,1,2.]],threshold:1.7202789895236492e-003,right_val:0.6331263780593872,left_val:0.5013207793235779},{features:[[5,7,2,1,-1.],[6,7,1,1,2.]],threshold:-1.3016929733566940e-004,right_val:0.4226869940757752,left_val:0.5539718270301819},{features:[[2,12,18,4,-1.],[11,12,9,2,2.],[2,14,9,2,2.]],threshold:-4.8016388900578022e-003,right_val:0.5430780053138733,left_val:0.4425095021724701},{features:[[5,7,2,2,-1.],[5,7,1,1,2.],[6,8,1,1,2.]],threshold:-2.5399310979992151e-003,right_val:0.4697605073451996,left_val:0.7145782113075256},{features:[[16,3,4,2,-1.],[16,4,4,1,2.]],threshold:-1.4278929447755218e-003,right_val:0.5399605035781860,left_val:0.4070445001125336},{features:[[0,2,2,18,-1.],[0,2,1,9,2.],[1,11,1,9,2.]],threshold:-0.0251425504684448,right_val:0.4747352004051209,left_val:0.7884690761566162},{features:[[1,2,18,4,-1.],[10,2,9,2,2.],[1,4,9,2,2.]],threshold:-3.8899609353393316e-003,right_val:0.5577110052108765,left_val:0.4296191930770874},{features:[[9,14,1,3,-1.],[9,15,1,1,3.]],threshold:4.3947459198534489e-003,right_val:0.7023944258689880,left_val:0.4693162143230438},{features:[[2,12,18,4,-1.],[11,12,9,2,2.],[2,14,9,2,2.]],threshold:0.0246784202754498,right_val:0.3812510073184967,left_val:0.5242322087287903},{features:[[0,12,18,4,-1.],[0,12,9,2,2.],[9,14,9,2,2.]],threshold:0.0380476787686348,right_val:0.1687828004360199,left_val:0.5011739730834961},{features:[[11,4,5,3,-1.],[11,5,5,1,3.]],threshold:7.9424865543842316e-003,right_val:0.6369568109512329,left_val:0.4828582108020783},{features:[[6,4,7,3,-1.],[6,5,7,1,3.]],threshold:-1.5110049862414598e-003,right_val:0.4487667977809906,left_val:0.5906485915184021},{features:[[13,17,3,3,-1.],[13,18,3,1,3.]],threshold:6.4201741479337215e-003,right_val:0.2990570068359375,left_val:0.5241097807884216},{features:[[8,1,3,4,-1.],[9,1,1,4,3.]],threshold:-2.9802159406244755e-003,right_val:0.5078489780426025,left_val:0.3041465878486633},{features:[[11,4,2,4,-1.],[11,4,1,4,2.]],threshold:-7.4580078944563866e-004,right_val:0.5256826281547546,left_val:0.4128139019012451},{features:[[0,17,9,3,-1.],[3,17,3,3,3.]],threshold:-0.0104709500446916,right_val:0.4494296014308929,left_val:0.5808395147323608},{features:[[11,0,2,8,-1.],[12,0,1,4,2.],[11,4,1,4,2.]],threshold:9.3369204550981522e-003,right_val:0.2658948898315430,left_val:0.5246552824974060},{features:[[0,8,6,12,-1.],[0,8,3,6,2.],[3,14,3,6,2.]],threshold:0.0279369000345469,right_val:0.7087256908416748,left_val:0.4674955010414124},{features:[[10,7,4,12,-1.],[10,13,4,6,2.]],threshold:7.4277678504586220e-003,right_val:0.3758518099784851,left_val:0.5409486889839172},{features:[[5,3,8,14,-1.],[5,10,8,7,2.]],threshold:-0.0235845092684031,right_val:0.5238550901412964,left_val:0.3758639991283417},{features:[[14,10,6,1,-1.],[14,10,3,1,2.]],threshold:1.1452640173956752e-003,right_val:0.5804247260093689,left_val:0.4329578876495361},{features:[[0,4,10,4,-1.],[0,6,10,2,2.]],threshold:-4.3468660442158580e-004,right_val:0.3873069882392883,left_val:0.5280618071556091},{features:[[10,0,5,8,-1.],[10,4,5,4,2.]],threshold:0.0106485402211547,right_val:0.5681251883506775,left_val:0.4902113080024719},{features:[[8,1,4,8,-1.],[8,1,2,4,2.],[10,5,2,4,2.]],threshold:-3.9418050437234342e-004,right_val:0.4318251013755798,left_val:0.5570880174636841},{features:[[9,11,6,1,-1.],[11,11,2,1,3.]],threshold:-1.3270479394122958e-004,right_val:0.4343554973602295,left_val:0.5658439993858337},{features:[[8,9,3,4,-1.],[9,9,1,4,3.]],threshold:-2.0125510636717081e-003,right_val:0.4537523984909058,left_val:0.6056739091873169},{features:[[18,4,2,6,-1.],[18,6,2,2,3.]],threshold:2.4854319635778666e-003,right_val:0.4138010144233704,left_val:0.5390477180480957},{features:[[8,8,3,4,-1.],[9,8,1,4,3.]],threshold:1.8237880431115627e-003,right_val:0.5717188715934753,left_val:0.4354828894138336},{features:[[7,1,13,3,-1.],[7,2,13,1,3.]],threshold:-0.0166566595435143,right_val:0.5216122865676880,left_val:0.3010913133621216},{features:[[7,13,6,1,-1.],[9,13,2,1,3.]],threshold:8.0349558265879750e-004,right_val:0.3818396925926209,left_val:0.5300151109695435},{features:[[12,11,3,6,-1.],[12,13,3,2,3.]],threshold:3.4170378930866718e-003,right_val:0.4241400063037872,left_val:0.5328028798103333},{features:[[5,11,6,1,-1.],[7,11,2,1,3.]],threshold:-3.6222729249857366e-004,right_val:0.4186977148056030,left_val:0.5491728186607361},{features:[[1,4,18,10,-1.],[10,4,9,5,2.],[1,9,9,5,2.]],threshold:-0.1163002029061317,right_val:0.5226451158523560,left_val:0.1440722048282623},{features:[[8,6,4,9,-1.],[8,9,4,3,3.]],threshold:-0.0146950101479888,right_val:0.4715717136859894,left_val:0.7747725248336792},{features:[[8,6,4,3,-1.],[8,7,4,1,3.]],threshold:2.1972130052745342e-003,right_val:0.3315644860267639,left_val:0.5355433821678162},{features:[[8,7,3,3,-1.],[9,7,1,3,3.]],threshold:-4.6965209185145795e-004,right_val:0.4458136856555939,left_val:0.5767235159873962},{features:[[14,15,4,3,-1.],[14,16,4,1,3.]],threshold:6.5144998952746391e-003,right_val:0.3647888898849487,left_val:0.5215674042701721},{features:[[5,10,3,10,-1.],[6,10,1,10,3.]],threshold:0.0213000606745481,right_val:0.1567950993776321,left_val:0.4994204938411713},{features:[[8,15,4,3,-1.],[8,16,4,1,3.]],threshold:3.1881409231573343e-003,right_val:0.6287270188331604,left_val:0.4742200076580048},{features:[[0,8,1,6,-1.],[0,10,1,2,3.]],threshold:9.0019777417182922e-004,right_val:0.3943752050399780,left_val:0.5347954034805298},{features:[[10,15,1,3,-1.],[10,16,1,1,3.]],threshold:-5.1772277802228928e-003,right_val:0.5013138055801392,left_val:0.6727191805839539},{features:[[2,15,4,3,-1.],[2,16,4,1,3.]],threshold:-4.3764649890363216e-003,right_val:0.5128793120384216,left_val:0.3106675148010254},{features:[[18,3,2,8,-1.],[19,3,1,4,2.],[18,7,1,4,2.]],threshold:2.6299960445612669e-003,right_val:0.5755215883255005,left_val:0.4886310100555420},{features:[[0,3,2,8,-1.],[0,3,1,4,2.],[1,7,1,4,2.]],threshold:-2.0458688959479332e-003,right_val:0.4558076858520508,left_val:0.6025794148445129},{features:[[3,7,14,10,-1.],[10,7,7,5,2.],[3,12,7,5,2.]],threshold:0.0694827064871788,right_val:0.2185259014368057,left_val:0.5240747928619385},{features:[[0,7,19,3,-1.],[0,8,19,1,3.]],threshold:0.0240489393472672,right_val:0.2090622037649155,left_val:0.5011867284774780},{features:[[12,6,3,3,-1.],[12,7,3,1,3.]],threshold:3.1095340382307768e-003,right_val:0.7108548283576965,left_val:0.4866712093353272},{features:[[0,6,1,3,-1.],[0,7,1,1,3.]],threshold:-1.2503260513767600e-003,right_val:0.5156195163726807,left_val:0.3407891094684601},{features:[[12,6,3,3,-1.],[12,7,3,1,3.]],threshold:-1.0281190043315291e-003,right_val:0.4439432024955750,left_val:0.5575572252273560},{features:[[5,6,3,3,-1.],[5,7,3,1,3.]],threshold:-8.8893622159957886e-003,right_val:0.4620442092418671,left_val:0.6402000784873962},{features:[[8,2,4,2,-1.],[8,3,4,1,2.]],threshold:-6.1094801640138030e-004,right_val:0.5448899865150452,left_val:0.3766441941261292},{features:[[6,3,4,12,-1.],[8,3,2,12,2.]],threshold:-5.7686357758939266e-003,right_val:0.5133677124977112,left_val:0.3318648934364319},{features:[[13,6,2,3,-1.],[13,7,2,1,3.]],threshold:1.8506490159779787e-003,right_val:0.6406934857368469,left_val:0.4903570115566254},{features:[[0,10,20,4,-1.],[0,12,20,2,2.]],threshold:-0.0997994691133499,right_val:0.5015562176704407,left_val:0.1536051034927368},{features:[[2,0,17,14,-1.],[2,7,17,7,2.]],threshold:-0.3512834906578064,right_val:0.5174378752708435,left_val:0.0588231310248375},{features:[[0,0,6,10,-1.],[0,0,3,5,2.],[3,5,3,5,2.]],threshold:-0.0452445708215237,right_val:0.4677872955799103,left_val:0.6961488723754883},{features:[[14,6,6,4,-1.],[14,6,3,4,2.]],threshold:0.0714815780520439,right_val:0.1038092970848084,left_val:0.5167986154556274},{features:[[0,6,6,4,-1.],[3,6,3,4,2.]],threshold:2.1895780228078365e-003,right_val:0.5532060861587524,left_val:0.4273078143596649},{features:[[13,2,7,2,-1.],[13,3,7,1,2.]],threshold:-5.9242651332169771e-004,right_val:0.5276389122009277,left_val:0.4638943970203400},{features:[[0,2,7,2,-1.],[0,3,7,1,2.]],threshold:1.6788389766588807e-003,right_val:0.3932034969329834,left_val:0.5301648974418640},{features:[[6,11,14,2,-1.],[13,11,7,1,2.],[6,12,7,1,2.]],threshold:-2.2163488902151585e-003,right_val:0.4757033884525299,left_val:0.5630694031715393},{features:[[8,5,2,2,-1.],[8,5,1,1,2.],[9,6,1,1,2.]],threshold:1.1568699846975505e-004,right_val:0.5535702705383301,left_val:0.4307535886764526},{features:[[13,9,2,3,-1.],[13,9,1,3,2.]],threshold:-7.2017288766801357e-003,right_val:0.5193064212799072,left_val:0.1444882005453110},{features:[[1,1,3,12,-1.],[2,1,1,12,3.]],threshold:8.9081272017210722e-004,right_val:0.5593621134757996,left_val:0.4384432137012482},{features:[[17,4,1,3,-1.],[17,5,1,1,3.]],threshold:1.9605009583756328e-004,right_val:0.4705956876277924,left_val:0.5340415835380554},{features:[[2,4,1,3,-1.],[2,5,1,1,3.]],threshold:5.2022142335772514e-004,right_val:0.3810079097747803,left_val:0.5213856101036072},{features:[[14,5,1,3,-1.],[14,6,1,1,3.]],threshold:9.4588572392240167e-004,right_val:0.6130738854408264,left_val:0.4769414961338043},{features:[[7,16,2,3,-1.],[7,17,2,1,3.]],threshold:9.1698471806012094e-005,right_val:0.5429363250732422,left_val:0.4245009124279022},{features:[[8,13,4,6,-1.],[10,13,2,3,2.],[8,16,2,3,2.]],threshold:2.1833200007677078e-003,right_val:0.4191075861454010,left_val:0.5457730889320374},{features:[[5,5,1,3,-1.],[5,6,1,1,3.]],threshold:-8.6039671441540122e-004,right_val:0.4471659958362579,left_val:0.5764588713645935},{features:[[16,0,4,20,-1.],[16,0,2,20,2.]],threshold:-0.0132362395524979,right_val:0.4695009887218475,left_val:0.6372823119163513},{features:[[5,1,2,6,-1.],[5,1,1,3,2.],[6,4,1,3,2.]],threshold:4.3376701069064438e-004,right_val:0.3945829868316650,left_val:0.5317873954772949}],threshold:67.6989212036132810},{simpleClassifiers:[{features:[[5,4,10,4,-1.],[5,6,10,2,2.]],threshold:-0.0248471498489380,right_val:0.3873311877250671,left_val:0.6555516719818115},{features:[[15,2,4,12,-1.],[15,2,2,12,2.]],threshold:6.1348611488938332e-003,right_val:0.5973997712135315,left_val:0.3748072087764740},{features:[[7,6,4,12,-1.],[7,12,4,6,2.]],threshold:6.4498498104512691e-003,right_val:0.2548811137676239,left_val:0.5425491929054260},{features:[[14,5,1,8,-1.],[14,9,1,4,2.]],threshold:6.3491211039945483e-004,right_val:0.5387253761291504,left_val:0.2462442070245743},{features:[[1,4,14,10,-1.],[1,4,7,5,2.],[8,9,7,5,2.]],threshold:1.4023890253156424e-003,right_val:0.3528657853603363,left_val:0.5594322085380554},{features:[[11,6,6,14,-1.],[14,6,3,7,2.],[11,13,3,7,2.]],threshold:3.0044000595808029e-004,right_val:0.5765938162803650,left_val:0.3958503901958466},{features:[[3,6,6,14,-1.],[3,6,3,7,2.],[6,13,3,7,2.]],threshold:1.0042409849120304e-004,right_val:0.5534998178482056,left_val:0.3698996901512146},{features:[[4,9,15,2,-1.],[9,9,5,2,3.]],threshold:-5.0841490738093853e-003,right_val:0.5547800064086914,left_val:0.3711090981960297},{features:[[7,14,6,3,-1.],[7,15,6,1,3.]],threshold:-0.0195372607558966,right_val:0.4579297006130219,left_val:0.7492755055427551},{features:[[6,3,14,4,-1.],[13,3,7,2,2.],[6,5,7,2,2.]],threshold:-7.4532740654831287e-006,right_val:0.3904069960117340,left_val:0.5649787187576294},{features:[[1,9,15,2,-1.],[6,9,5,2,3.]],threshold:-3.6079459823668003e-003,right_val:0.5267801284790039,left_val:0.3381088078022003},{features:[[6,11,8,9,-1.],[6,14,8,3,3.]],threshold:2.0697501022368670e-003,right_val:0.3714388906955719,left_val:0.5519291162490845},{features:[[7,4,3,8,-1.],[8,4,1,8,3.]],threshold:-4.6463840408250690e-004,right_val:0.4113566875457764,left_val:0.5608214735984802},{features:[[14,6,2,6,-1.],[14,9,2,3,2.]],threshold:7.5490452582016587e-004,right_val:0.5329356193542481,left_val:0.3559206128120422},{features:[[5,7,6,4,-1.],[5,7,3,2,2.],[8,9,3,2,2.]],threshold:-9.8322238773107529e-004,right_val:0.3763205111026764,left_val:0.5414795875549316},{features:[[1,1,18,19,-1.],[7,1,6,19,3.]],threshold:-0.0199406407773495,right_val:0.4705299139022827,left_val:0.6347903013229370},{features:[[1,2,6,5,-1.],[4,2,3,5,2.]],threshold:3.7680300883948803e-003,right_val:0.5563716292381287,left_val:0.3913489878177643},{features:[[12,17,6,2,-1.],[12,18,6,1,2.]],threshold:-9.4528505578637123e-003,right_val:0.5215116739273071,left_val:0.2554892897605896},{features:[[2,17,6,2,-1.],[2,18,6,1,2.]],threshold:2.9560849070549011e-003,right_val:0.3063920140266419,left_val:0.5174679160118103},{features:[[17,3,3,6,-1.],[17,5,3,2,3.]],threshold:9.1078737750649452e-003,right_val:0.2885963022708893,left_val:0.5388448238372803},{features:[[8,17,3,3,-1.],[8,18,3,1,3.]],threshold:1.8219229532405734e-003,right_val:0.5852196812629700,left_val:0.4336043000221252},{features:[[10,13,2,6,-1.],[10,16,2,3,2.]],threshold:0.0146887395530939,right_val:0.2870005965232849,left_val:0.5287361741065979},{features:[[7,13,6,3,-1.],[7,14,6,1,3.]],threshold:-0.0143879903480411,right_val:0.4647370874881744,left_val:0.7019448876380920},{features:[[17,3,3,6,-1.],[17,5,3,2,3.]],threshold:-0.0189866498112679,right_val:0.5247011780738831,left_val:0.2986552119255066},{features:[[8,13,2,3,-1.],[8,14,2,1,3.]],threshold:1.1527639580890536e-003,right_val:0.5931661725044251,left_val:0.4323473870754242},{features:[[9,3,6,2,-1.],[11,3,2,2,3.]],threshold:0.0109336702153087,right_val:0.3130319118499756,left_val:0.5286864042282105},{features:[[0,3,3,6,-1.],[0,5,3,2,3.]],threshold:-0.0149327302351594,right_val:0.5084077119827271,left_val:0.2658419013023377},{features:[[8,5,4,6,-1.],[8,7,4,2,3.]],threshold:-2.9970539617352188e-004,right_val:0.3740724027156830,left_val:0.5463526844978333},{features:[[5,5,3,2,-1.],[5,6,3,1,2.]],threshold:4.1677621193230152e-003,right_val:0.7435721755027771,left_val:0.4703496992588043},{features:[[10,1,3,4,-1.],[11,1,1,4,3.]],threshold:-6.3905320130288601e-003,right_val:0.5280538201332092,left_val:0.2069258987903595},{features:[[1,2,5,9,-1.],[1,5,5,3,3.]],threshold:4.5029609464108944e-003,right_val:0.3483543097972870,left_val:0.5182648897171021},{features:[[13,6,2,3,-1.],[13,7,2,1,3.]],threshold:-9.2040365561842918e-003,right_val:0.4932360053062439,left_val:0.6803777217864990},{features:[[0,6,14,3,-1.],[7,6,7,3,2.]],threshold:0.0813272595405579,right_val:0.2253051996231079,left_val:0.5058398842811585},{features:[[2,11,18,8,-1.],[2,15,18,4,2.]],threshold:-0.1507928073406220,right_val:0.5264679789543152,left_val:0.2963424921035767},{features:[[5,6,2,3,-1.],[5,7,2,1,3.]],threshold:3.3179009333252907e-003,right_val:0.7072932124137878,left_val:0.4655495882034302},{features:[[10,6,4,2,-1.],[12,6,2,1,2.],[10,7,2,1,2.]],threshold:7.7402801252901554e-004,right_val:0.5668237805366516,left_val:0.4780347943305969},{features:[[6,6,4,2,-1.],[6,6,2,1,2.],[8,7,2,1,2.]],threshold:6.8199541419744492e-004,right_val:0.5722156763076782,left_val:0.4286996126174927},{features:[[10,1,3,4,-1.],[11,1,1,4,3.]],threshold:5.3671570494771004e-003,right_val:0.3114621937274933,left_val:0.5299307107925415},{features:[[7,1,2,7,-1.],[8,1,1,7,2.]],threshold:9.7018666565418243e-005,right_val:0.5269461870193481,left_val:0.3674638867378235},{features:[[4,2,15,14,-1.],[4,9,15,7,2.]],threshold:-0.1253408938646317,right_val:0.5245791077613831,left_val:0.2351492047309876},{features:[[8,7,3,2,-1.],[9,7,1,2,3.]],threshold:-5.2516269497573376e-003,right_val:0.4693767130374908,left_val:0.7115936875343323},{features:[[2,3,18,4,-1.],[11,3,9,2,2.],[2,5,9,2,2.]],threshold:-7.8342109918594360e-003,right_val:0.5409085750579834,left_val:0.4462651014328003},{features:[[9,7,2,2,-1.],[10,7,1,2,2.]],threshold:-1.1310069821774960e-003,right_val:0.4417662024497986,left_val:0.5945618748664856},{features:[[13,9,2,3,-1.],[13,9,1,3,2.]],threshold:1.7601120052859187e-003,right_val:0.3973453044891357,left_val:0.5353249907493591},{features:[[5,2,6,2,-1.],[7,2,2,2,3.]],threshold:-8.1581249833106995e-004,right_val:0.5264726877212524,left_val:0.3760268092155457},{features:[[9,5,2,7,-1.],[9,5,1,7,2.]],threshold:-3.8687589112669230e-003,right_val:0.4749819934368134,left_val:0.6309912800788879},{features:[[5,9,2,3,-1.],[6,9,1,3,2.]],threshold:1.5207129763439298e-003,right_val:0.3361223936080933,left_val:0.5230181813240051},{features:[[6,0,14,18,-1.],[6,9,14,9,2.]],threshold:0.5458673834800720,right_val:0.1172635033726692,left_val:0.5167139768600464},{features:[[2,16,6,3,-1.],[2,17,6,1,3.]],threshold:0.0156501904129982,right_val:0.1393294930458069,left_val:0.4979439079761505},{features:[[9,7,3,6,-1.],[10,7,1,6,3.]],threshold:-0.0117318602278829,right_val:0.4921196103096008,left_val:0.7129650712013245},{features:[[7,8,4,3,-1.],[7,9,4,1,3.]],threshold:-6.1765122227370739e-003,right_val:0.5049701929092407,left_val:0.2288102954626083},{features:[[7,12,6,3,-1.],[7,13,6,1,3.]],threshold:2.2457661107182503e-003,right_val:0.6048725843429565,left_val:0.4632433950901032},{features:[[9,12,2,3,-1.],[9,13,2,1,3.]],threshold:-5.1915869116783142e-003,right_val:0.4602192938327789,left_val:0.6467421054840088},{features:[[7,12,6,2,-1.],[9,12,2,2,3.]],threshold:-0.0238278806209564,right_val:0.5226079225540161,left_val:0.1482000946998596},{features:[[5,11,4,6,-1.],[5,14,4,3,2.]],threshold:1.0284580057486892e-003,right_val:0.3375957012176514,left_val:0.5135489106178284},{features:[[11,12,7,2,-1.],[11,13,7,1,2.]],threshold:-0.0100788502022624,right_val:0.5303567051887512,left_val:0.2740561068058014},{features:[[6,10,8,6,-1.],[6,10,4,3,2.],[10,13,4,3,2.]],threshold:2.6168930344283581e-003,right_val:0.3972454071044922,left_val:0.5332670807838440},{features:[[11,10,3,4,-1.],[11,12,3,2,2.]],threshold:5.4385367548093200e-004,right_val:0.4063411951065064,left_val:0.5365604162216187},{features:[[9,16,2,3,-1.],[9,17,2,1,3.]],threshold:5.3510512225329876e-003,right_val:0.6889045834541321,left_val:0.4653759002685547},{features:[[13,3,1,9,-1.],[13,6,1,3,3.]],threshold:-1.5274790348485112e-003,right_val:0.3624723851680756,left_val:0.5449501276016235},{features:[[1,13,14,6,-1.],[1,15,14,2,3.]],threshold:-0.0806244164705276,right_val:0.5000287294387817,left_val:0.1656087040901184},{features:[[13,6,1,6,-1.],[13,9,1,3,2.]],threshold:0.0221920292824507,right_val:0.2002808004617691,left_val:0.5132731199264526},{features:[[0,4,3,8,-1.],[1,4,1,8,3.]],threshold:7.3100631125271320e-003,right_val:0.6366536021232605,left_val:0.4617947936058044},{features:[[18,0,2,18,-1.],[18,0,1,18,2.]],threshold:-6.4063072204589844e-003,right_val:0.4867860972881317,left_val:0.5916250944137573},{features:[[2,3,6,2,-1.],[2,4,6,1,2.]],threshold:-7.6415040530264378e-004,right_val:0.5315797924995422,left_val:0.3888409137725830},{features:[[9,0,8,6,-1.],[9,2,8,2,3.]],threshold:7.6734489994123578e-004,right_val:0.5605279803276062,left_val:0.4159064888954163},{features:[[6,6,1,6,-1.],[6,9,1,3,2.]],threshold:6.1474501853808761e-004,right_val:0.5120148062705994,left_val:0.3089022040367127},{features:[[14,8,6,3,-1.],[14,9,6,1,3.]],threshold:-5.0105270929634571e-003,right_val:0.5207306146621704,left_val:0.3972199857234955},{features:[[0,0,2,18,-1.],[1,0,1,18,2.]],threshold:-8.6909132078289986e-003,right_val:0.4608575999736786,left_val:0.6257408261299133},{features:[[1,18,18,2,-1.],[10,18,9,1,2.],[1,19,9,1,2.]],threshold:-0.0163914598524570,right_val:0.5242266058921814,left_val:0.2085209935903549},{features:[[3,15,2,2,-1.],[3,16,2,1,2.]],threshold:4.0973909199237823e-004,right_val:0.3780320882797241,left_val:0.5222427248954773},{features:[[8,14,5,3,-1.],[8,15,5,1,3.]],threshold:-2.5242289993911982e-003,right_val:0.4611890017986298,left_val:0.5803927183151245},{features:[[8,14,2,3,-1.],[8,15,2,1,3.]],threshold:5.0945312250405550e-004,right_val:0.5846015810966492,left_val:0.4401271939277649},{features:[[12,3,3,3,-1.],[13,3,1,3,3.]],threshold:1.9656419754028320e-003,right_val:0.4184590876102448,left_val:0.5322325229644775},{features:[[7,5,6,2,-1.],[9,5,2,2,3.]],threshold:5.6298897834494710e-004,right_val:0.5234565734863281,left_val:0.3741844892501831},{features:[[15,5,5,2,-1.],[15,6,5,1,2.]],threshold:-6.7946797935292125e-004,right_val:0.5356478095054627,left_val:0.4631041884422302},{features:[[0,5,5,2,-1.],[0,6,5,1,2.]],threshold:7.2856349870562553e-003,right_val:0.2377564013004303,left_val:0.5044670104980469},{features:[[17,14,1,6,-1.],[17,17,1,3,2.]],threshold:-0.0174594894051552,right_val:0.5050435066223145,left_val:0.7289121150970459},{features:[[2,9,9,3,-1.],[5,9,3,3,3.]],threshold:-0.0254217498004436,right_val:0.4678100049495697,left_val:0.6667134761810303},{features:[[12,3,3,3,-1.],[13,3,1,3,3.]],threshold:-1.5647639520466328e-003,right_val:0.5323626995086670,left_val:0.4391759037971497},{features:[[0,0,4,18,-1.],[2,0,2,18,2.]],threshold:0.0114443600177765,right_val:0.5680012106895447,left_val:0.4346440136432648},{features:[[17,6,1,3,-1.],[17,7,1,1,3.]],threshold:-6.7352550104260445e-004,right_val:0.5296812057495117,left_val:0.4477140903472900},{features:[[2,14,1,6,-1.],[2,17,1,3,2.]],threshold:9.3194209039211273e-003,right_val:0.7462607026100159,left_val:0.4740200042724609},{features:[[19,8,1,2,-1.],[19,9,1,1,2.]],threshold:1.3328490604180843e-004,right_val:0.4752134978771210,left_val:0.5365061759948731},{features:[[5,3,3,3,-1.],[6,3,1,3,3.]],threshold:-7.8815799206495285e-003,right_val:0.5015255212783814,left_val:0.1752219051122665},{features:[[9,16,2,3,-1.],[9,17,2,1,3.]],threshold:-5.7985680177807808e-003,right_val:0.4896200895309448,left_val:0.7271236777305603},{features:[[2,6,1,3,-1.],[2,7,1,1,3.]],threshold:-3.8922499516047537e-004,right_val:0.5344941020011902,left_val:0.4003908932209015},{features:[[12,4,8,2,-1.],[16,4,4,1,2.],[12,5,4,1,2.]],threshold:-1.9288610201328993e-003,right_val:0.4803955852985382,left_val:0.5605612993240356},{features:[[0,4,8,2,-1.],[0,4,4,1,2.],[4,5,4,1,2.]],threshold:8.4214154630899429e-003,right_val:0.7623608708381653,left_val:0.4753246903419495},{features:[[2,16,18,4,-1.],[2,18,18,2,2.]],threshold:8.1655876711010933e-003,right_val:0.4191643893718720,left_val:0.5393261909484863},{features:[[7,15,2,4,-1.],[7,17,2,2,2.]],threshold:4.8280550981871784e-004,right_val:0.5399821996688843,left_val:0.4240800142288208},{features:[[4,0,14,3,-1.],[4,1,14,1,3.]],threshold:-2.7186630759388208e-003,right_val:0.5424923896789551,left_val:0.4244599938392639},{features:[[0,0,4,20,-1.],[2,0,2,20,2.]],threshold:-0.0125072300434113,right_val:0.4550411105155945,left_val:0.5895841717720032},{features:[[12,4,4,8,-1.],[14,4,2,4,2.],[12,8,2,4,2.]],threshold:-0.0242865197360516,right_val:0.5189179778099060,left_val:0.2647134959697723},{features:[[6,7,2,2,-1.],[6,7,1,1,2.],[7,8,1,1,2.]],threshold:-2.9676330741494894e-003,right_val:0.4749749898910523,left_val:0.7347682714462280},{features:[[10,6,2,3,-1.],[10,7,2,1,3.]],threshold:-0.0125289997085929,right_val:0.5177599787712097,left_val:0.2756049931049347},{features:[[8,7,3,2,-1.],[8,8,3,1,2.]],threshold:-1.0104000102728605e-003,right_val:0.5144724249839783,left_val:0.3510560989379883},{features:[[8,2,6,12,-1.],[8,8,6,6,2.]],threshold:-2.1348530426621437e-003,right_val:0.4667319953441620,left_val:0.5637925863265991},{features:[[4,0,11,12,-1.],[4,4,11,4,3.]],threshold:0.0195642597973347,right_val:0.6137639880180359,left_val:0.4614573121070862},{features:[[14,9,6,11,-1.],[16,9,2,11,3.]],threshold:-0.0971463471651077,right_val:0.5193555951118469,left_val:0.2998378872871399},{features:[[0,14,4,3,-1.],[0,15,4,1,3.]],threshold:4.5014568604528904e-003,right_val:0.3045755922794342,left_val:0.5077884793281555},{features:[[9,10,2,3,-1.],[9,11,2,1,3.]],threshold:6.3706971704959869e-003,right_val:0.6887500882148743,left_val:0.4861018955707550},{features:[[5,11,3,2,-1.],[5,12,3,1,2.]],threshold:-9.0721528977155685e-003,right_val:0.5017563104629517,left_val:0.1673395931720734},{features:[[9,15,3,3,-1.],[10,15,1,3,3.]],threshold:-5.3537208586931229e-003,right_val:0.5242633223533630,left_val:0.2692756950855255},{features:[[8,8,3,4,-1.],[9,8,1,4,3.]],threshold:-0.0109328404068947,right_val:0.4736028909683228,left_val:0.7183864116668701},{features:[[9,15,3,3,-1.],[10,15,1,3,3.]],threshold:8.2356072962284088e-003,right_val:0.2389862984418869,left_val:0.5223966836929321},{features:[[7,7,3,2,-1.],[8,7,1,2,3.]],threshold:-1.0038160253316164e-003,right_val:0.4433943033218384,left_val:0.5719355940818787},{features:[[2,10,16,4,-1.],[10,10,8,2,2.],[2,12,8,2,2.]],threshold:4.0859128348529339e-003,right_val:0.4148836135864258,left_val:0.5472841858863831},{features:[[2,3,4,17,-1.],[4,3,2,17,2.]],threshold:0.1548541933298111,right_val:0.0610615983605385,left_val:0.4973812103271484},{features:[[15,13,2,7,-1.],[15,13,1,7,2.]],threshold:2.0897459762636572e-004,right_val:0.5423889160156250,left_val:0.4709174036979675},{features:[[2,2,6,1,-1.],[5,2,3,1,2.]],threshold:3.3316991175524890e-004,right_val:0.5300992131233215,left_val:0.4089626967906952},{features:[[5,2,12,4,-1.],[9,2,4,4,3.]],threshold:-0.0108134001493454,right_val:0.4957334101200104,left_val:0.6104369759559631},{features:[[6,0,8,12,-1.],[6,0,4,6,2.],[10,6,4,6,2.]],threshold:0.0456560105085373,right_val:0.2866660058498383,left_val:0.5069689154624939},{features:[[13,7,2,2,-1.],[14,7,1,1,2.],[13,8,1,1,2.]],threshold:1.2569549726322293e-003,right_val:0.6318171024322510,left_val:0.4846917092800140},{features:[[0,12,20,6,-1.],[0,14,20,2,3.]],threshold:-0.1201507002115250,right_val:0.4980959892272949,left_val:0.0605261400341988},{features:[[14,7,2,3,-1.],[14,7,1,3,2.]],threshold:-1.0533799650147557e-004,right_val:0.4708042144775391,left_val:0.5363109707832336},{features:[[0,8,9,12,-1.],[3,8,3,12,3.]],threshold:-0.2070319056510925,right_val:0.4979098141193390,left_val:0.0596603304147720},{features:[[3,0,16,2,-1.],[3,0,8,2,2.]],threshold:1.2909180077258497e-004,right_val:0.5377997756004334,left_val:0.4712977111339569},{features:[[6,15,3,3,-1.],[6,16,3,1,3.]],threshold:3.8818528992123902e-004,right_val:0.5534191131591797,left_val:0.4363538026809692},{features:[[8,15,6,3,-1.],[8,16,6,1,3.]],threshold:-2.9243610333651304e-003,right_val:0.4825215935707092,left_val:0.5811185836791992},{features:[[0,10,1,6,-1.],[0,12,1,2,3.]],threshold:8.3882332546636462e-004,right_val:0.4038138985633850,left_val:0.5311700105667114},{features:[[10,9,4,3,-1.],[10,10,4,1,3.]],threshold:-1.9061550265178084e-003,right_val:0.5260015130043030,left_val:0.3770701885223389},{features:[[9,15,2,3,-1.],[9,16,2,1,3.]],threshold:8.9514348655939102e-003,right_val:0.7682183980941773,left_val:0.4766167998313904},{features:[[5,7,10,1,-1.],[5,7,5,1,2.]],threshold:0.0130834598094225,right_val:0.3062222003936768,left_val:0.5264462828636169},{features:[[4,0,12,19,-1.],[10,0,6,19,2.]],threshold:-0.2115933001041412,right_val:0.4695810079574585,left_val:0.6737198233604431},{features:[[0,6,20,6,-1.],[10,6,10,3,2.],[0,9,10,3,2.]],threshold:3.1493250280618668e-003,right_val:0.4386953115463257,left_val:0.5644835233688355},{features:[[3,6,2,2,-1.],[3,6,1,1,2.],[4,7,1,1,2.]],threshold:3.9754100725986063e-004,right_val:0.5895630121231079,left_val:0.4526061117649078},{features:[[15,6,2,2,-1.],[16,6,1,1,2.],[15,7,1,1,2.]],threshold:-1.3814480043947697e-003,right_val:0.4942413866519928,left_val:0.6070582270622253},{features:[[3,6,2,2,-1.],[3,6,1,1,2.],[4,7,1,1,2.]],threshold:-5.8122188784182072e-004,right_val:0.4508252143859863,left_val:0.5998213291168213},{features:[[14,4,1,12,-1.],[14,10,1,6,2.]],threshold:-2.3905329871922731e-003,right_val:0.5223848223686218,left_val:0.4205588996410370},{features:[[2,5,16,10,-1.],[2,5,8,5,2.],[10,10,8,5,2.]],threshold:0.0272689294070005,right_val:0.3563301861286163,left_val:0.5206447243690491},{features:[[9,17,3,2,-1.],[10,17,1,2,3.]],threshold:-3.7658358924090862e-003,right_val:0.5218814015388489,left_val:0.3144704103469849},{features:[[1,4,2,2,-1.],[1,5,2,1,2.]],threshold:-1.4903489500284195e-003,right_val:0.5124437212944031,left_val:0.3380196094512940},{features:[[5,0,15,5,-1.],[10,0,5,5,3.]],threshold:-0.0174282304942608,right_val:0.4919725954532623,left_val:0.5829960703849793},{features:[[0,0,15,5,-1.],[5,0,5,5,3.]],threshold:-0.0152780301868916,right_val:0.4617887139320374,left_val:0.6163144707679749},{features:[[11,2,2,17,-1.],[11,2,1,17,2.]],threshold:0.0319956094026566,right_val:0.1712764054536820,left_val:0.5166357159614563},{features:[[7,2,2,17,-1.],[8,2,1,17,2.]],threshold:-3.8256710395216942e-003,right_val:0.5131387710571289,left_val:0.3408012092113495},{features:[[15,11,2,9,-1.],[15,11,1,9,2.]],threshold:-8.5186436772346497e-003,right_val:0.4997941851615906,left_val:0.6105518937110901},{features:[[3,11,2,9,-1.],[4,11,1,9,2.]],threshold:9.0641621500253677e-004,right_val:0.5582311153411865,left_val:0.4327270984649658},{features:[[5,16,14,4,-1.],[5,16,7,4,2.]],threshold:0.0103448498994112,right_val:0.5452420115470886,left_val:0.4855653047561646}],threshold:69.2298736572265630},{simpleClassifiers:[{features:[[1,4,18,1,-1.],[7,4,6,1,3.]],threshold:7.8981826081871986e-003,right_val:0.5946462154388428,left_val:0.3332524895668030},{features:[[13,7,6,4,-1.],[16,7,3,2,2.],[13,9,3,2,2.]],threshold:1.6170160379260778e-003,right_val:0.5577868819236755,left_val:0.3490641117095947},{features:[[9,8,2,12,-1.],[9,12,2,4,3.]],threshold:-5.5449741194024682e-004,right_val:0.3291530013084412,left_val:0.5542566180229187},{features:[[12,1,6,6,-1.],[12,3,6,2,3.]],threshold:1.5428980113938451e-003,right_val:0.5545979142189026,left_val:0.3612579107284546},{features:[[5,2,6,6,-1.],[5,2,3,3,2.],[8,5,3,3,2.]],threshold:-1.0329450014978647e-003,right_val:0.5576140284538269,left_val:0.3530139029026032},{features:[[9,16,6,4,-1.],[12,16,3,2,2.],[9,18,3,2,2.]],threshold:7.7698158565908670e-004,right_val:0.5645321011543274,left_val:0.3916778862476349},{features:[[1,2,18,3,-1.],[7,2,6,3,3.]],threshold:0.1432030051946640,right_val:0.7023633122444153,left_val:0.4667482078075409},{features:[[7,4,9,10,-1.],[7,9,9,5,2.]],threshold:-7.3866490274667740e-003,right_val:0.5289257764816284,left_val:0.3073684871196747},{features:[[5,9,4,4,-1.],[7,9,2,4,2.]],threshold:-6.2936742324382067e-004,right_val:0.4037049114704132,left_val:0.5622118115425110},{features:[[11,10,3,6,-1.],[11,13,3,3,2.]],threshold:7.8893528552725911e-004,right_val:0.3557874858379364,left_val:0.5267661213874817},{features:[[7,11,5,3,-1.],[7,12,5,1,3.]],threshold:-0.0122280502691865,right_val:0.4625549912452698,left_val:0.6668320894241333},{features:[[7,11,6,6,-1.],[10,11,3,3,2.],[7,14,3,3,2.]],threshold:3.5420239437371492e-003,right_val:0.3869673013687134,left_val:0.5521438121795654},{features:[[0,0,10,9,-1.],[0,3,10,3,3.]],threshold:-1.0585320414975286e-003,right_val:0.5320926904678345,left_val:0.3628678023815155},{features:[[13,14,1,6,-1.],[13,16,1,2,3.]],threshold:1.4935660146875307e-005,right_val:0.5363323092460632,left_val:0.4632444977760315},{features:[[0,2,3,6,-1.],[0,4,3,2,3.]],threshold:5.2537708543241024e-003,right_val:0.3265708982944489,left_val:0.5132231712341309},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:-8.2338023930788040e-003,right_val:0.4774140119552612,left_val:0.6693689823150635},{features:[[6,14,1,6,-1.],[6,16,1,2,3.]],threshold:2.1866810129722580e-005,right_val:0.5457931160926819,left_val:0.4053862094879150},{features:[[9,15,2,3,-1.],[9,16,2,1,3.]],threshold:-3.8150229956954718e-003,right_val:0.4793178141117096,left_val:0.6454995870590210},{features:[[6,4,3,3,-1.],[7,4,1,3,3.]],threshold:1.1105879675596952e-003,right_val:0.3529678881168366,left_val:0.5270407199859619},{features:[[9,0,11,3,-1.],[9,1,11,1,3.]],threshold:-5.7707689702510834e-003,right_val:0.5352957844734192,left_val:0.3803547024726868},{features:[[0,6,20,3,-1.],[0,7,20,1,3.]],threshold:-3.0158339068293571e-003,right_val:0.3887133002281189,left_val:0.5339403152465820},{features:[[10,1,1,2,-1.],[10,2,1,1,2.]],threshold:-8.5453689098358154e-004,right_val:0.5273603796958923,left_val:0.3564616143703461},{features:[[9,6,2,6,-1.],[10,6,1,6,2.]],threshold:0.0110505102202296,right_val:0.6849737763404846,left_val:0.4671907126903534},{features:[[5,8,12,1,-1.],[9,8,4,1,3.]],threshold:0.0426058396697044,right_val:0.0702200904488564,left_val:0.5151473283767700},{features:[[3,8,12,1,-1.],[7,8,4,1,3.]],threshold:-3.0781750101596117e-003,right_val:0.5152602195739746,left_val:0.3041661083698273},{features:[[9,7,3,5,-1.],[10,7,1,5,3.]],threshold:-5.4815728217363358e-003,right_val:0.4897229969501495,left_val:0.6430295705795288},{features:[[3,9,6,2,-1.],[6,9,3,2,2.]],threshold:3.1881860923022032e-003,right_val:0.3826209902763367,left_val:0.5307493209838867},{features:[[12,9,3,3,-1.],[12,10,3,1,3.]],threshold:3.5947180003859103e-004,right_val:0.5421904921531677,left_val:0.4650047123432159},{features:[[7,0,6,1,-1.],[9,0,2,1,3.]],threshold:-4.0705031715333462e-003,right_val:0.5079116225242615,left_val:0.2849679887294769},{features:[[12,9,3,3,-1.],[12,10,3,1,3.]],threshold:-0.0145941702648997,right_val:0.5128461718559265,left_val:0.2971645891666412},{features:[[7,10,2,1,-1.],[8,10,1,1,2.]],threshold:-1.1947689927183092e-004,right_val:0.4343082010746002,left_val:0.5631098151206970},{features:[[6,4,9,13,-1.],[9,4,3,13,3.]],threshold:-6.9344649091362953e-004,right_val:0.5359959006309509,left_val:0.4403578042984009},{features:[[6,8,4,2,-1.],[6,9,4,1,2.]],threshold:1.4834799912932795e-005,right_val:0.5164697766304016,left_val:0.3421008884906769},{features:[[16,2,4,6,-1.],[16,2,2,6,2.]],threshold:9.0296985581517220e-003,right_val:0.6114075183868408,left_val:0.4639343023300171},{features:[[0,17,6,3,-1.],[0,18,6,1,3.]],threshold:-8.0640818923711777e-003,right_val:0.5075494050979614,left_val:0.2820158898830414},{features:[[10,10,3,10,-1.],[10,15,3,5,2.]],threshold:0.0260621197521687,right_val:0.2688778042793274,left_val:0.5208905935287476},{features:[[8,7,3,5,-1.],[9,7,1,5,3.]],threshold:0.0173146594315767,right_val:0.6738539934158325,left_val:0.4663713872432709},{features:[[10,4,4,3,-1.],[10,4,2,3,2.]],threshold:0.0226666405797005,right_val:0.2212723940610886,left_val:0.5209349989891052},{features:[[8,4,3,8,-1.],[9,4,1,8,3.]],threshold:-2.1965929772704840e-003,right_val:0.4538190066814423,left_val:0.6063101291656494},{features:[[6,6,9,13,-1.],[9,6,3,13,3.]],threshold:-9.5282476395368576e-003,right_val:0.5247430801391602,left_val:0.4635204970836639},{features:[[6,0,8,12,-1.],[6,0,4,6,2.],[10,6,4,6,2.]],threshold:8.0943619832396507e-003,right_val:0.3913882076740265,left_val:0.5289440155029297},{features:[[14,2,6,8,-1.],[16,2,2,8,3.]],threshold:-0.0728773325681686,right_val:0.4990234971046448,left_val:0.7752001881599426},{features:[[6,0,3,6,-1.],[7,0,1,6,3.]],threshold:-6.9009521976113319e-003,right_val:0.5048090219497681,left_val:0.2428039014339447},{features:[[14,2,6,8,-1.],[16,2,2,8,3.]],threshold:-0.0113082397729158,right_val:0.4842376112937927,left_val:0.5734364986419678},{features:[[0,5,6,6,-1.],[0,8,6,3,2.]],threshold:0.0596132017672062,right_val:0.2524977028369904,left_val:0.5029836297035217},{features:[[9,12,6,2,-1.],[12,12,3,1,2.],[9,13,3,1,2.]],threshold:-2.8624620754271746e-003,right_val:0.4898459911346436,left_val:0.6073045134544373},{features:[[8,17,3,2,-1.],[9,17,1,2,3.]],threshold:4.4781449250876904e-003,right_val:0.2220316976308823,left_val:0.5015289187431335},{features:[[11,6,2,2,-1.],[12,6,1,1,2.],[11,7,1,1,2.]],threshold:-1.7513240454718471e-003,right_val:0.4933868944644928,left_val:0.6614428758621216},{features:[[1,9,18,2,-1.],[7,9,6,2,3.]],threshold:0.0401634201407433,right_val:0.3741044998168945,left_val:0.5180878043174744},{features:[[11,6,2,2,-1.],[12,6,1,1,2.],[11,7,1,1,2.]],threshold:3.4768949262797832e-004,right_val:0.5818032026290894,left_val:0.4720416963100433},{features:[[3,4,12,8,-1.],[7,4,4,8,3.]],threshold:2.6551650371402502e-003,right_val:0.5221335887908936,left_val:0.3805010914802551},{features:[[13,11,5,3,-1.],[13,12,5,1,3.]],threshold:-8.7706279009580612e-003,right_val:0.5231295228004456,left_val:0.2944166064262390},{features:[[9,10,2,3,-1.],[9,11,2,1,3.]],threshold:-5.5122091434895992e-003,right_val:0.4722816944122315,left_val:0.7346177101135254},{features:[[14,7,2,3,-1.],[14,7,1,3,2.]],threshold:6.8672042107209563e-004,right_val:0.4242413043975830,left_val:0.5452876091003418},{features:[[5,4,1,3,-1.],[5,5,1,1,3.]],threshold:5.6019669864326715e-004,right_val:0.5601285099983215,left_val:0.4398862123489380},{features:[[13,4,2,3,-1.],[13,5,2,1,3.]],threshold:2.4143769405782223e-003,right_val:0.6136621832847595,left_val:0.4741686880588532},{features:[[5,4,2,3,-1.],[5,5,2,1,3.]],threshold:-1.5680900542065501e-003,right_val:0.4516409933567047,left_val:0.6044552922248840},{features:[[9,8,2,3,-1.],[9,9,2,1,3.]],threshold:-3.6827491130679846e-003,right_val:0.5294982194900513,left_val:0.2452459037303925},{features:[[8,9,2,2,-1.],[8,10,2,1,2.]],threshold:-2.9409190756268799e-004,right_val:0.5251451134681702,left_val:0.3732838034629822},{features:[[15,14,1,4,-1.],[15,16,1,2,2.]],threshold:4.2847759323194623e-004,right_val:0.4065535068511963,left_val:0.5498809814453125},{features:[[3,12,2,2,-1.],[3,13,2,1,2.]],threshold:-4.8817070201039314e-003,right_val:0.4999957084655762,left_val:0.2139908969402313},{features:[[12,15,2,2,-1.],[13,15,1,1,2.],[12,16,1,1,2.]],threshold:2.7272020815871656e-004,right_val:0.5813428759574890,left_val:0.4650287032127380},{features:[[9,13,2,2,-1.],[9,14,2,1,2.]],threshold:2.0947199664078653e-004,right_val:0.5572792887687683,left_val:0.4387486875057221},{features:[[4,11,14,9,-1.],[4,14,14,3,3.]],threshold:0.0485011897981167,right_val:0.3212889134883881,left_val:0.5244972705841065},{features:[[7,13,4,3,-1.],[7,14,4,1,3.]],threshold:-4.5166411437094212e-003,right_val:0.4545882046222687,left_val:0.6056813001632690},{features:[[15,14,1,4,-1.],[15,16,1,2,2.]],threshold:-0.0122916800901294,right_val:0.5152214169502258,left_val:0.2040929049253464},{features:[[4,14,1,4,-1.],[4,16,1,2,2.]],threshold:4.8549679922871292e-004,right_val:0.3739503026008606,left_val:0.5237604975700378},{features:[[14,0,6,13,-1.],[16,0,2,13,3.]],threshold:0.0305560491979122,right_val:0.5938246250152588,left_val:0.4960533976554871},{features:[[4,1,2,12,-1.],[4,1,1,6,2.],[5,7,1,6,2.]],threshold:-1.5105320198927075e-004,right_val:0.4145204126834869,left_val:0.5351303815841675},{features:[[11,14,6,6,-1.],[14,14,3,3,2.],[11,17,3,3,2.]],threshold:2.4937440175563097e-003,right_val:0.5514941215515137,left_val:0.4693366885185242},{features:[[3,14,6,6,-1.],[3,14,3,3,2.],[6,17,3,3,2.]],threshold:-0.0123821301385760,right_val:0.4681667983531952,left_val:0.6791396737098694},{features:[[14,17,3,2,-1.],[14,18,3,1,2.]],threshold:-5.1333461888134480e-003,right_val:0.5229160189628601,left_val:0.3608739078044891},{features:[[3,17,3,2,-1.],[3,18,3,1,2.]],threshold:5.1919277757406235e-004,right_val:0.3633613884449005,left_val:0.5300073027610779},{features:[[14,0,6,13,-1.],[16,0,2,13,3.]],threshold:0.1506042033433914,right_val:0.2211782038211823,left_val:0.5157316923141480},{features:[[0,0,6,13,-1.],[2,0,2,13,3.]],threshold:7.7144149690866470e-003,right_val:0.5776609182357788,left_val:0.4410496950149536},{features:[[10,10,7,6,-1.],[10,12,7,2,3.]],threshold:9.4443522393703461e-003,right_val:0.3756650090217590,left_val:0.5401855111122131},{features:[[6,15,2,2,-1.],[6,15,1,1,2.],[7,16,1,1,2.]],threshold:2.5006249779835343e-004,right_val:0.5607374906539917,left_val:0.4368270933628082},{features:[[6,11,8,6,-1.],[10,11,4,3,2.],[6,14,4,3,2.]],threshold:-3.3077150583267212e-003,right_val:0.5518230795860291,left_val:0.4244799017906189},{features:[[7,6,2,2,-1.],[7,6,1,1,2.],[8,7,1,1,2.]],threshold:7.4048910755664110e-004,right_val:0.5900576710700989,left_val:0.4496962130069733},{features:[[2,2,16,6,-1.],[10,2,8,3,2.],[2,5,8,3,2.]],threshold:0.0440920516848564,right_val:0.3156355023384094,left_val:0.5293493270874023},{features:[[5,4,3,3,-1.],[5,5,3,1,3.]],threshold:3.3639909233897924e-003,right_val:0.5848662257194519,left_val:0.4483296871185303},{features:[[11,7,3,10,-1.],[11,12,3,5,2.]],threshold:-3.9760079234838486e-003,right_val:0.5483639240264893,left_val:0.4559507071971893},{features:[[6,7,3,10,-1.],[6,12,3,5,2.]],threshold:2.7716930489987135e-003,right_val:0.3792484104633331,left_val:0.5341786146163940},{features:[[10,7,3,2,-1.],[11,7,1,2,3.]],threshold:-2.4123019829858094e-004,right_val:0.4576973021030426,left_val:0.5667188763618469},{features:[[8,12,4,2,-1.],[8,13,4,1,2.]],threshold:4.9425667384639382e-004,right_val:0.5628787279129028,left_val:0.4421244859695435},{features:[[10,1,1,3,-1.],[10,2,1,1,3.]],threshold:-3.8876468897797167e-004,right_val:0.5391063094139099,left_val:0.4288370907306671},{features:[[1,2,4,18,-1.],[1,2,2,9,2.],[3,11,2,9,2.]],threshold:-0.0500488989055157,right_val:0.4703742861747742,left_val:0.6899513006210327},{features:[[12,4,4,12,-1.],[12,10,4,6,2.]],threshold:-0.0366354808211327,right_val:0.5191826224327087,left_val:0.2217779010534287},{features:[[0,0,1,6,-1.],[0,2,1,2,3.]],threshold:2.4273579474538565e-003,right_val:0.3497397899627686,left_val:0.5136224031448364},{features:[[9,11,2,3,-1.],[9,12,2,1,3.]],threshold:1.9558030180633068e-003,right_val:0.6408380866050720,left_val:0.4826192855834961},{features:[[8,7,4,3,-1.],[8,8,4,1,3.]],threshold:-1.7494610510766506e-003,right_val:0.5272685289382935,left_val:0.3922835886478424},{features:[[10,7,3,2,-1.],[11,7,1,2,3.]],threshold:0.0139550799503922,right_val:0.8416504859924316,left_val:0.5078201889991760},{features:[[7,7,3,2,-1.],[8,7,1,2,3.]],threshold:-2.1896739781368524e-004,right_val:0.4314234852790833,left_val:0.5520489811897278},{features:[[9,4,6,1,-1.],[11,4,2,1,3.]],threshold:-1.5131309628486633e-003,right_val:0.5382571220397949,left_val:0.3934605121612549},{features:[[8,7,2,3,-1.],[9,7,1,3,2.]],threshold:-4.3622800149023533e-003,right_val:0.4736475944519043,left_val:0.7370628714561462},{features:[[12,7,8,6,-1.],[16,7,4,3,2.],[12,10,4,3,2.]],threshold:0.0651605874300003,right_val:0.3281595110893250,left_val:0.5159279704093933},{features:[[0,7,8,6,-1.],[0,7,4,3,2.],[4,10,4,3,2.]],threshold:-2.3567399475723505e-003,right_val:0.5172886252403259,left_val:0.3672826886177063},{features:[[18,2,2,10,-1.],[19,2,1,5,2.],[18,7,1,5,2.]],threshold:0.0151466596871614,right_val:0.6687604188919067,left_val:0.5031493902206421},{features:[[0,2,6,4,-1.],[3,2,3,4,2.]],threshold:-0.0228509604930878,right_val:0.4709596931934357,left_val:0.6767519712448120},{features:[[9,4,6,1,-1.],[11,4,2,1,3.]],threshold:4.8867650330066681e-003,right_val:0.4059878885746002,left_val:0.5257998108863831},{features:[[7,15,2,2,-1.],[7,15,1,1,2.],[8,16,1,1,2.]],threshold:1.7619599821045995e-003,right_val:0.6688278913497925,left_val:0.4696272909641266},{features:[[11,13,1,6,-1.],[11,16,1,3,2.]],threshold:-1.2942519970238209e-003,right_val:0.5344281792640686,left_val:0.4320712983608246},{features:[[8,13,1,6,-1.],[8,16,1,3,2.]],threshold:0.0109299495816231,right_val:0.1637486070394516,left_val:0.4997706115245819},{features:[[14,3,2,1,-1.],[14,3,1,1,2.]],threshold:2.9958489903947338e-005,right_val:0.5633224248886108,left_val:0.4282417893409729},{features:[[8,15,2,3,-1.],[8,16,2,1,3.]],threshold:-6.5884361974895000e-003,right_val:0.4700526893138886,left_val:0.6772121191024780},{features:[[12,15,7,4,-1.],[12,17,7,2,2.]],threshold:3.2527779694646597e-003,right_val:0.4536148905754089,left_val:0.5313397049903870},{features:[[4,14,12,3,-1.],[4,15,12,1,3.]],threshold:-4.0435739792883396e-003,right_val:0.4413388967514038,left_val:0.5660061836242676},{features:[[10,3,3,2,-1.],[11,3,1,2,3.]],threshold:-1.2523540062829852e-003,right_val:0.5356451869010925,left_val:0.3731913864612579},{features:[[4,12,2,2,-1.],[4,13,2,1,2.]],threshold:1.9246719602961093e-004,right_val:0.3738811016082764,left_val:0.5189986228942871},{features:[[10,11,4,6,-1.],[10,14,4,3,2.]],threshold:-0.0385896712541580,right_val:0.5188810825347900,left_val:0.2956373989582062},{features:[[7,13,2,2,-1.],[7,13,1,1,2.],[8,14,1,1,2.]],threshold:1.5489870565943420e-004,right_val:0.5509533286094666,left_val:0.4347135126590729},{features:[[4,11,14,4,-1.],[11,11,7,2,2.],[4,13,7,2,2.]],threshold:-0.0337638482451439,right_val:0.5195475816726685,left_val:0.3230330049991608},{features:[[1,18,18,2,-1.],[7,18,6,2,3.]],threshold:-8.2657067105174065e-003,right_val:0.4552114009857178,left_val:0.5975489020347595},{features:[[11,18,2,2,-1.],[12,18,1,1,2.],[11,19,1,1,2.]],threshold:1.4481440302915871e-005,right_val:0.5497426986694336,left_val:0.4745678007602692},{features:[[7,18,2,2,-1.],[7,18,1,1,2.],[8,19,1,1,2.]],threshold:1.4951299817766994e-005,right_val:0.5480644106864929,left_val:0.4324473142623901},{features:[[12,18,8,2,-1.],[12,19,8,1,2.]],threshold:-0.0187417995184660,right_val:0.5178533196449280,left_val:0.1580052971839905},{features:[[7,14,6,2,-1.],[7,15,6,1,2.]],threshold:1.7572239739820361e-003,right_val:0.5773764252662659,left_val:0.4517636895179749},{features:[[8,12,4,8,-1.],[10,12,2,4,2.],[8,16,2,4,2.]],threshold:-3.1391119118779898e-003,right_val:0.5460842251777649,left_val:0.4149647951126099},{features:[[4,9,3,3,-1.],[4,10,3,1,3.]],threshold:6.6656779381446540e-005,right_val:0.5293084979057312,left_val:0.4039090871810913},{features:[[7,10,6,2,-1.],[9,10,2,2,3.]],threshold:6.7743421532213688e-003,right_val:0.6121956110000610,left_val:0.4767651855945587},{features:[[5,0,4,15,-1.],[7,0,2,15,2.]],threshold:-7.3868161998689175e-003,right_val:0.5187280774116516,left_val:0.3586258888244629},{features:[[8,6,12,14,-1.],[12,6,4,14,3.]],threshold:0.0140409301966429,right_val:0.5576155781745911,left_val:0.4712139964103699},{features:[[5,16,3,3,-1.],[5,17,3,1,3.]],threshold:-5.5258329957723618e-003,right_val:0.5039281249046326,left_val:0.2661027014255524},{features:[[8,1,12,19,-1.],[12,1,4,19,3.]],threshold:0.3868423998355866,right_val:0.2525899112224579,left_val:0.5144339799880981},{features:[[3,0,3,2,-1.],[3,1,3,1,2.]],threshold:1.1459240340627730e-004,right_val:0.5423371195793152,left_val:0.4284994900226593},{features:[[10,12,4,5,-1.],[10,12,2,5,2.]],threshold:-0.0184675697237253,right_val:0.5213062167167664,left_val:0.3885835111141205},{features:[[6,12,4,5,-1.],[8,12,2,5,2.]],threshold:-4.5907011372037232e-004,right_val:0.4235909879207611,left_val:0.5412563085556030},{features:[[11,11,2,2,-1.],[12,11,1,1,2.],[11,12,1,1,2.]],threshold:1.2527540093287826e-003,right_val:0.6624091267585754,left_val:0.4899305105209351},{features:[[0,2,3,6,-1.],[0,4,3,2,3.]],threshold:1.4910609461367130e-003,right_val:0.4040051996707916,left_val:0.5286778211593628},{features:[[11,11,2,2,-1.],[12,11,1,1,2.],[11,12,1,1,2.]],threshold:-7.5435562757775187e-004,right_val:0.4795120060443878,left_val:0.6032990217208862},{features:[[7,6,4,10,-1.],[7,11,4,5,2.]],threshold:-6.9478838704526424e-003,right_val:0.5373504161834717,left_val:0.4084401130676270},{features:[[11,11,2,2,-1.],[12,11,1,1,2.],[11,12,1,1,2.]],threshold:2.8092920547351241e-004,right_val:0.5759382247924805,left_val:0.4846062958240509},{features:[[2,13,5,2,-1.],[2,14,5,1,2.]],threshold:9.6073717577382922e-004,right_val:0.3554979860782623,left_val:0.5164741277694702},{features:[[11,11,2,2,-1.],[12,11,1,1,2.],[11,12,1,1,2.]],threshold:-2.6883929967880249e-004,right_val:0.4731765985488892,left_val:0.5677582025527954},{features:[[7,11,2,2,-1.],[7,11,1,1,2.],[8,12,1,1,2.]],threshold:2.1599370520561934e-003,right_val:0.7070567011833191,left_val:0.4731487035751343},{features:[[14,13,3,3,-1.],[14,14,3,1,3.]],threshold:5.6235301308333874e-003,right_val:0.2781791985034943,left_val:0.5240243077278137},{features:[[3,13,3,3,-1.],[3,14,3,1,3.]],threshold:-5.0243991427123547e-003,right_val:0.5062304139137268,left_val:0.2837013900279999},{features:[[9,14,2,3,-1.],[9,15,2,1,3.]],threshold:-9.7611639648675919e-003,right_val:0.4934569001197815,left_val:0.7400717735290527},{features:[[8,7,3,3,-1.],[8,8,3,1,3.]],threshold:4.1515100747346878e-003,right_val:0.3407008051872253,left_val:0.5119131207466126},{features:[[13,5,3,3,-1.],[13,6,3,1,3.]],threshold:6.2465080991387367e-003,right_val:0.6579058766365051,left_val:0.4923788011074066},{features:[[0,9,5,3,-1.],[0,10,5,1,3.]],threshold:-7.0597478188574314e-003,right_val:0.5032842159271240,left_val:0.2434711009263992},{features:[[13,5,3,3,-1.],[13,6,3,1,3.]],threshold:-2.0587709732353687e-003,right_val:0.4695087075233460,left_val:0.5900310873985291},{features:[[9,12,2,8,-1.],[9,12,1,4,2.],[10,16,1,4,2.]],threshold:-2.4146060459315777e-003,right_val:0.5189201831817627,left_val:0.3647317886352539},{features:[[11,7,2,2,-1.],[12,7,1,1,2.],[11,8,1,1,2.]],threshold:-1.4817609917372465e-003,right_val:0.4940128028392792,left_val:0.6034948229789734},{features:[[0,16,6,4,-1.],[3,16,3,4,2.]],threshold:-6.3016400672495365e-003,right_val:0.4560427963733673,left_val:0.5818989872932434},{features:[[10,6,2,3,-1.],[10,7,2,1,3.]],threshold:3.4763428848236799e-003,right_val:0.3483993113040924,left_val:0.5217475891113281},{features:[[9,5,2,6,-1.],[9,7,2,2,3.]],threshold:-0.0222508702427149,right_val:0.5032082796096802,left_val:0.2360700070858002},{features:[[12,15,8,4,-1.],[12,15,4,4,2.]],threshold:-0.0306125506758690,right_val:0.4914919137954712,left_val:0.6499186754226685},{features:[[0,14,8,6,-1.],[4,14,4,6,2.]],threshold:0.0130574796348810,right_val:0.5683764219284058,left_val:0.4413323104381561},{features:[[9,0,3,2,-1.],[10,0,1,2,3.]],threshold:-6.0095742810517550e-004,right_val:0.5333483219146729,left_val:0.4359731078147888},{features:[[4,15,4,2,-1.],[6,15,2,2,2.]],threshold:-4.1514250915497541e-004,right_val:0.4326060116291046,left_val:0.5504062771797180},{features:[[12,7,3,13,-1.],[13,7,1,13,3.]],threshold:-0.0137762902304530,right_val:0.5201548933982849,left_val:0.4064112901687622},{features:[[5,7,3,13,-1.],[6,7,1,13,3.]],threshold:-0.0322965085506439,right_val:0.4977194964885712,left_val:0.0473519712686539},{features:[[9,6,3,9,-1.],[9,9,3,3,3.]],threshold:0.0535569787025452,right_val:0.6666939258575440,left_val:0.4881733059883118},{features:[[4,4,7,12,-1.],[4,10,7,6,2.]],threshold:8.1889545544981956e-003,right_val:0.4240820109844208,left_val:0.5400037169456482},{features:[[12,12,2,2,-1.],[13,12,1,1,2.],[12,13,1,1,2.]],threshold:2.1055320394225419e-004,right_val:0.5563852787017822,left_val:0.4802047908306122},{features:[[6,12,2,2,-1.],[6,12,1,1,2.],[7,13,1,1,2.]],threshold:-2.4382730480283499e-003,right_val:0.4773685038089752,left_val:0.7387793064117432},{features:[[8,9,4,2,-1.],[10,9,2,1,2.],[8,10,2,1,2.]],threshold:3.2835570164024830e-003,right_val:0.3171291947364807,left_val:0.5288546085357666},{features:[[3,6,2,2,-1.],[3,6,1,1,2.],[4,7,1,1,2.]],threshold:2.3729570675641298e-003,right_val:0.7060170769691467,left_val:0.4750812947750092},{features:[[16,6,3,2,-1.],[16,7,3,1,2.]],threshold:-1.4541699783876538e-003,right_val:0.5330739021301270,left_val:0.3811730146408081}],threshold:79.2490768432617190},{simpleClassifiers:[{features:[[0,7,19,4,-1.],[0,9,19,2,2.]],threshold:0.0557552389800549,right_val:0.6806036829948425,left_val:0.4019156992435455},{features:[[10,2,10,1,-1.],[10,2,5,1,2.]],threshold:2.4730248842388391e-003,right_val:0.5965719819068909,left_val:0.3351148962974548},{features:[[9,4,2,12,-1.],[9,10,2,6,2.]],threshold:-3.5031698644161224e-004,right_val:0.3482286930084229,left_val:0.5557708144187927},{features:[[12,18,4,1,-1.],[12,18,2,1,2.]],threshold:5.4167630150914192e-004,right_val:0.5693380832672119,left_val:0.4260858893394470},{features:[[1,7,6,4,-1.],[1,7,3,2,2.],[4,9,3,2,2.]],threshold:7.7193678589537740e-004,right_val:0.5433688759803772,left_val:0.3494240045547485},{features:[[12,0,6,13,-1.],[14,0,2,13,3.]],threshold:-1.5999219613149762e-003,right_val:0.5484359264373779,left_val:0.4028499126434326},{features:[[2,0,6,13,-1.],[4,0,2,13,3.]],threshold:-1.1832080053864047e-004,right_val:0.5425465106964111,left_val:0.3806901872158051},{features:[[10,5,8,8,-1.],[10,9,8,4,2.]],threshold:3.2909031142480671e-004,right_val:0.5429521799087524,left_val:0.2620100080966950},{features:[[8,3,2,5,-1.],[9,3,1,5,2.]],threshold:2.9518108931370080e-004,right_val:0.5399264097213745,left_val:0.3799768984317780},{features:[[8,4,9,1,-1.],[11,4,3,1,3.]],threshold:9.0466710389591753e-005,right_val:0.5440226197242737,left_val:0.4433645009994507},{features:[[3,4,9,1,-1.],[6,4,3,1,3.]],threshold:1.5007190086180344e-005,right_val:0.5409119725227356,left_val:0.3719654977321625},{features:[[1,0,18,10,-1.],[7,0,6,10,3.]],threshold:0.1393561065196991,right_val:0.4479042887687683,left_val:0.5525395870208740},{features:[[7,17,5,3,-1.],[7,18,5,1,3.]],threshold:1.6461990308016539e-003,right_val:0.5772169828414917,left_val:0.4264501035213471},{features:[[7,11,6,1,-1.],[9,11,2,1,3.]],threshold:4.9984431825578213e-004,right_val:0.5685871243476868,left_val:0.4359526038169861},{features:[[2,2,3,2,-1.],[2,3,3,1,2.]],threshold:-1.0971280280500650e-003,right_val:0.5205408930778503,left_val:0.3390136957168579},{features:[[8,12,4,2,-1.],[8,13,4,1,2.]],threshold:6.6919892560690641e-004,right_val:0.5980659723281860,left_val:0.4557456076145172},{features:[[6,10,3,6,-1.],[6,13,3,3,2.]],threshold:8.6471042595803738e-004,right_val:0.2944033145904541,left_val:0.5134841203689575},{features:[[11,4,2,4,-1.],[11,4,1,4,2.]],threshold:-2.7182599296793342e-004,right_val:0.5377181172370911,left_val:0.3906578123569489},{features:[[7,4,2,4,-1.],[8,4,1,4,2.]],threshold:3.0249499104684219e-005,right_val:0.5225688815116882,left_val:0.3679609894752502},{features:[[9,6,2,4,-1.],[9,6,1,4,2.]],threshold:-8.5225896909832954e-003,right_val:0.4892365038394928,left_val:0.7293102145195007},{features:[[6,13,8,3,-1.],[6,14,8,1,3.]],threshold:1.6705560265108943e-003,right_val:0.5696138143539429,left_val:0.4345324933528900},{features:[[9,15,3,4,-1.],[10,15,1,4,3.]],threshold:-7.1433838456869125e-003,right_val:0.5225623846054077,left_val:0.2591280043125153},{features:[[9,2,2,17,-1.],[10,2,1,17,2.]],threshold:-0.0163193698972464,right_val:0.4651575982570648,left_val:0.6922279000282288},{features:[[7,0,6,1,-1.],[9,0,2,1,3.]],threshold:4.8034260980784893e-003,right_val:0.3286302983760834,left_val:0.5352262854576111},{features:[[8,15,3,4,-1.],[9,15,1,4,3.]],threshold:-7.5421929359436035e-003,right_val:0.5034546256065369,left_val:0.2040544003248215},{features:[[7,13,7,3,-1.],[7,14,7,1,3.]],threshold:-0.0143631100654602,right_val:0.4889059066772461,left_val:0.6804888844490051},{features:[[8,16,3,3,-1.],[9,16,1,3,3.]],threshold:8.9063588529825211e-004,right_val:0.3895480930805206,left_val:0.5310695767402649},{features:[[6,2,8,10,-1.],[6,7,8,5,2.]],threshold:-4.4060191139578819e-003,right_val:0.4372426867485046,left_val:0.5741562843322754},{features:[[2,5,8,8,-1.],[2,9,8,4,2.]],threshold:-1.8862540309783071e-004,right_val:0.5098205208778381,left_val:0.2831785976886749},{features:[[14,16,2,2,-1.],[14,17,2,1,2.]],threshold:-3.7979281041771173e-003,right_val:0.5246580243110657,left_val:0.3372507989406586},{features:[[4,16,2,2,-1.],[4,17,2,1,2.]],threshold:1.4627049677073956e-004,right_val:0.3911710083484650,left_val:0.5306674242019653},{features:[[10,11,4,6,-1.],[10,14,4,3,2.]],threshold:-4.9164638767251745e-005,right_val:0.3942720890045166,left_val:0.5462496280670166},{features:[[6,11,4,6,-1.],[6,14,4,3,2.]],threshold:-0.0335825011134148,right_val:0.5048211812973023,left_val:0.2157824039459229},{features:[[10,14,1,3,-1.],[10,15,1,1,3.]],threshold:-3.5339309833943844e-003,right_val:0.4872696995735169,left_val:0.6465312242507935},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:5.0144111737608910e-003,right_val:0.6248074769973755,left_val:0.4617668092250824},{features:[[10,0,4,6,-1.],[12,0,2,3,2.],[10,3,2,3,2.]],threshold:0.0188173707574606,right_val:0.2000052034854889,left_val:0.5220689177513123},{features:[[0,3,20,2,-1.],[0,4,20,1,2.]],threshold:-1.3434339780360460e-003,right_val:0.5301619768142700,left_val:0.4014537930488586},{features:[[12,0,8,2,-1.],[16,0,4,1,2.],[12,1,4,1,2.]],threshold:1.7557960236445069e-003,right_val:0.5653169751167297,left_val:0.4794039130210877},{features:[[2,12,10,8,-1.],[2,16,10,4,2.]],threshold:-0.0956374630331993,right_val:0.5006706714630127,left_val:0.2034195065498352},{features:[[17,7,2,10,-1.],[18,7,1,5,2.],[17,12,1,5,2.]],threshold:-0.0222412291914225,right_val:0.5046340227127075,left_val:0.7672473192214966},{features:[[1,7,2,10,-1.],[1,7,1,5,2.],[2,12,1,5,2.]],threshold:-0.0155758196488023,right_val:0.4755851030349731,left_val:0.7490342259407044},{features:[[15,10,3,6,-1.],[15,12,3,2,3.]],threshold:5.3599118255078793e-003,right_val:0.4004670977592468,left_val:0.5365303754806519},{features:[[4,4,6,2,-1.],[6,4,2,2,3.]],threshold:-0.0217634998261929,right_val:0.4964174926280975,left_val:0.0740154981613159},{features:[[0,5,20,6,-1.],[0,7,20,2,3.]],threshold:-0.1656159013509750,right_val:0.5218086242675781,left_val:0.2859103083610535},{features:[[0,0,8,2,-1.],[0,0,4,1,2.],[4,1,4,1,2.]],threshold:1.6461320046801120e-004,right_val:0.5380793213844299,left_val:0.4191615879535675},{features:[[1,0,18,4,-1.],[7,0,6,4,3.]],threshold:-8.9077502489089966e-003,right_val:0.4877404868602753,left_val:0.6273192763328552},{features:[[1,13,6,2,-1.],[1,14,6,1,2.]],threshold:8.6346449097618461e-004,right_val:0.3671025931835175,left_val:0.5159940719604492},{features:[[10,8,3,4,-1.],[11,8,1,4,3.]],threshold:-1.3751760125160217e-003,right_val:0.4579083919525147,left_val:0.5884376764297485},{features:[[6,1,6,1,-1.],[8,1,2,1,3.]],threshold:-1.4081239933148026e-003,right_val:0.5139945149421692,left_val:0.3560509979724884},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:-3.9342888630926609e-003,right_val:0.4664272069931030,left_val:0.5994288921356201},{features:[[1,6,18,2,-1.],[10,6,9,2,2.]],threshold:-0.0319669283926487,right_val:0.5144183039665222,left_val:0.3345462083816528},{features:[[15,11,1,2,-1.],[15,12,1,1,2.]],threshold:-1.5089280168467667e-005,right_val:0.4414057135581970,left_val:0.5582656264305115},{features:[[6,5,1,2,-1.],[6,6,1,1,2.]],threshold:5.1994470413774252e-004,right_val:0.6168993711471558,left_val:0.4623680114746094},{features:[[13,4,1,3,-1.],[13,5,1,1,3.]],threshold:-3.4220460802316666e-003,right_val:0.4974805116653442,left_val:0.6557074785232544},{features:[[2,15,1,2,-1.],[2,16,1,1,2.]],threshold:1.7723299970384687e-004,right_val:0.3901908099651337,left_val:0.5269501805305481},{features:[[12,4,4,3,-1.],[12,5,4,1,3.]],threshold:1.5716759953647852e-003,right_val:0.5790457725524902,left_val:0.4633373022079468},{features:[[0,0,7,3,-1.],[0,1,7,1,3.]],threshold:-8.9041329920291901e-003,right_val:0.5053591132164002,left_val:0.2689608037471771},{features:[[9,12,6,2,-1.],[9,12,3,2,2.]],threshold:4.0677518700249493e-004,right_val:0.4329898953437805,left_val:0.5456603169441223},{features:[[5,4,2,3,-1.],[5,5,2,1,3.]],threshold:6.7604780197143555e-003,right_val:0.6689761877059937,left_val:0.4648993909358978},{features:[[18,4,2,3,-1.],[18,5,2,1,3.]],threshold:2.9100088868290186e-003,right_val:0.3377839922904968,left_val:0.5309703946113586},{features:[[3,0,8,6,-1.],[3,2,8,2,3.]],threshold:1.3885459629818797e-003,right_val:0.5349133014678955,left_val:0.4074738919734955},{features:[[0,2,20,6,-1.],[10,2,10,3,2.],[0,5,10,3,2.]],threshold:-0.0767642632126808,right_val:0.5228242278099060,left_val:0.1992176026105881},{features:[[4,7,2,4,-1.],[5,7,1,4,2.]],threshold:-2.2688310127705336e-004,right_val:0.4253072142601013,left_val:0.5438501834869385},{features:[[3,10,15,2,-1.],[8,10,5,2,3.]],threshold:-6.3094152137637138e-003,right_val:0.5378909707069397,left_val:0.4259178936481476},{features:[[3,0,12,11,-1.],[9,0,6,11,2.]],threshold:-0.1100727990269661,right_val:0.4721749126911163,left_val:0.6904156804084778},{features:[[13,0,2,6,-1.],[13,0,1,6,2.]],threshold:2.8619659133255482e-004,right_val:0.5548306107521057,left_val:0.4524914920330048},{features:[[0,19,2,1,-1.],[1,19,1,1,2.]],threshold:2.9425329557852820e-005,right_val:0.4236463904380798,left_val:0.5370373725891113},{features:[[16,10,4,10,-1.],[18,10,2,5,2.],[16,15,2,5,2.]],threshold:-0.0248865708708763,right_val:0.4969303905963898,left_val:0.6423557996749878},{features:[[4,8,10,3,-1.],[4,9,10,1,3.]],threshold:0.0331488512456417,right_val:0.1613811999559403,left_val:0.4988475143909454},{features:[[14,12,3,3,-1.],[14,13,3,1,3.]],threshold:7.8491691965609789e-004,right_val:0.4223009049892426,left_val:0.5416026115417481},{features:[[0,10,4,10,-1.],[0,10,2,5,2.],[2,15,2,5,2.]],threshold:4.7087189741432667e-003,right_val:0.6027557849884033,left_val:0.4576328992843628},{features:[[18,3,2,6,-1.],[18,5,2,2,3.]],threshold:2.4144479539245367e-003,right_val:0.4422498941421509,left_val:0.5308973193168640},{features:[[6,6,1,3,-1.],[6,7,1,1,3.]],threshold:1.9523180089890957e-003,right_val:0.6663324832916260,left_val:0.4705634117126465},{features:[[7,7,7,2,-1.],[7,8,7,1,2.]],threshold:1.3031980488449335e-003,right_val:0.5526962280273438,left_val:0.4406126141548157},{features:[[0,3,2,6,-1.],[0,5,2,2,3.]],threshold:4.4735497795045376e-003,right_val:0.3301498889923096,left_val:0.5129023790359497},{features:[[11,1,3,1,-1.],[12,1,1,1,3.]],threshold:-2.6652868837118149e-003,right_val:0.5175036191940308,left_val:0.3135471045970917},{features:[[5,0,2,6,-1.],[6,0,1,6,2.]],threshold:1.3666770246345550e-004,right_val:0.5306876897811890,left_val:0.4119370877742767},{features:[[1,1,18,14,-1.],[7,1,6,14,3.]],threshold:-0.0171264503151178,right_val:0.4836578965187073,left_val:0.6177806258201599},{features:[[4,6,8,3,-1.],[8,6,4,3,2.]],threshold:-2.6601430727168918e-004,right_val:0.5169736742973328,left_val:0.3654330968856812},{features:[[9,12,6,2,-1.],[9,12,3,2,2.]],threshold:-0.0229323804378510,right_val:0.5163992047309876,left_val:0.3490915000438690},{features:[[5,12,6,2,-1.],[8,12,3,2,2.]],threshold:2.3316550068557262e-003,right_val:0.3709389865398407,left_val:0.5166299939155579},{features:[[10,7,3,5,-1.],[11,7,1,5,3.]],threshold:0.0169256608933210,right_val:0.8053988218307495,left_val:0.5014736056327820},{features:[[7,7,3,5,-1.],[8,7,1,5,3.]],threshold:-8.9858826249837875e-003,right_val:0.4657020866870880,left_val:0.6470788717269898},{features:[[13,0,3,10,-1.],[14,0,1,10,3.]],threshold:-0.0118746999651194,right_val:0.5258755087852478,left_val:0.3246378898620606},{features:[[4,11,3,2,-1.],[4,12,3,1,2.]],threshold:1.9350569345988333e-004,right_val:0.3839643895626068,left_val:0.5191941857337952},{features:[[17,3,3,6,-1.],[18,3,1,6,3.]],threshold:5.8713490143418312e-003,right_val:0.6187043190002441,left_val:0.4918133914470673},{features:[[1,8,18,10,-1.],[1,13,18,5,2.]],threshold:-0.2483879029750824,right_val:0.4988150000572205,left_val:0.1836802959442139},{features:[[13,0,3,10,-1.],[14,0,1,10,3.]],threshold:0.0122560001909733,right_val:0.3632029891014099,left_val:0.5227053761482239},{features:[[9,14,2,3,-1.],[9,15,2,1,3.]],threshold:8.3990179700776935e-004,right_val:0.5774148106575012,left_val:0.4490250051021576},{features:[[16,3,3,7,-1.],[17,3,1,7,3.]],threshold:2.5407369248569012e-003,right_val:0.5858299136161804,left_val:0.4804787039756775},{features:[[4,0,3,10,-1.],[5,0,1,10,3.]],threshold:-0.0148224299773574,right_val:0.5023537278175354,left_val:0.2521049976348877},{features:[[16,3,3,7,-1.],[17,3,1,7,3.]],threshold:-5.7973959483206272e-003,right_val:0.4853715002536774,left_val:0.5996695756912231},{features:[[0,9,1,2,-1.],[0,10,1,1,2.]],threshold:7.2662148158997297e-004,right_val:0.3671779930591583,left_val:0.5153716802597046},{features:[[18,1,2,10,-1.],[18,1,1,10,2.]],threshold:-0.0172325801104307,right_val:0.4994656145572662,left_val:0.6621719002723694},{features:[[0,1,2,10,-1.],[1,1,1,10,2.]],threshold:7.8624086454510689e-003,right_val:0.6256101727485657,left_val:0.4633395075798035},{features:[[10,16,3,4,-1.],[11,16,1,4,3.]],threshold:-4.7343620099127293e-003,right_val:0.5281885266304016,left_val:0.3615573048591614},{features:[[2,8,3,3,-1.],[3,8,1,3,3.]],threshold:8.3048478700220585e-004,right_val:0.5550957918167114,left_val:0.4442889094352722},{features:[[11,0,2,6,-1.],[12,0,1,3,2.],[11,3,1,3,2.]],threshold:7.6602199114859104e-003,right_val:0.2613354921340942,left_val:0.5162935256958008},{features:[[7,0,2,6,-1.],[7,0,1,3,2.],[8,3,1,3,2.]],threshold:-4.1048377752304077e-003,right_val:0.5019031763076782,left_val:0.2789632081985474},{features:[[16,3,3,7,-1.],[17,3,1,7,3.]],threshold:4.8512578941881657e-003,right_val:0.5661668181419373,left_val:0.4968984127044678},{features:[[1,3,3,7,-1.],[2,3,1,7,3.]],threshold:9.9896453320980072e-004,right_val:0.5551813244819641,left_val:0.4445607960224152},{features:[[14,1,6,16,-1.],[16,1,2,16,3.]],threshold:-0.2702363133430481,right_val:0.5151314139366150,left_val:0.0293882098048925},{features:[[0,1,6,16,-1.],[2,1,2,16,3.]],threshold:-0.0130906803533435,right_val:0.4447459876537323,left_val:0.5699399709701538},{features:[[2,0,16,8,-1.],[10,0,8,4,2.],[2,4,8,4,2.]],threshold:-9.4342790544033051e-003,right_val:0.5487895011901856,left_val:0.4305466115474701},{features:[[6,8,5,3,-1.],[6,9,5,1,3.]],threshold:-1.5482039889320731e-003,right_val:0.5128080844879150,left_val:0.3680317103862763},{features:[[9,7,3,3,-1.],[10,7,1,3,3.]],threshold:5.3746132180094719e-003,right_val:0.6101555824279785,left_val:0.4838916957378388},{features:[[8,8,4,3,-1.],[8,9,4,1,3.]],threshold:1.5786769799888134e-003,right_val:0.4118548035621643,left_val:0.5325223207473755},{features:[[9,6,2,4,-1.],[9,6,1,4,2.]],threshold:3.6856050137430429e-003,right_val:0.6252303123474121,left_val:0.4810948073863983},{features:[[0,7,15,1,-1.],[5,7,5,1,3.]],threshold:9.3887019902467728e-003,right_val:0.3629410862922669,left_val:0.5200229883193970},{features:[[8,2,7,9,-1.],[8,5,7,3,3.]],threshold:0.0127926301211119,right_val:0.6738016009330750,left_val:0.4961709976196289},{features:[[1,7,16,4,-1.],[1,7,8,2,2.],[9,9,8,2,2.]],threshold:-3.3661040943115950e-003,right_val:0.5283598899841309,left_val:0.4060279130935669},{features:[[6,12,8,2,-1.],[6,13,8,1,2.]],threshold:3.9771420415490866e-004,right_val:0.5900775194168091,left_val:0.4674113988876343},{features:[[8,11,3,3,-1.],[8,12,3,1,3.]],threshold:1.4868030557408929e-003,right_val:0.6082053780555725,left_val:0.4519116878509522},{features:[[4,5,14,10,-1.],[11,5,7,5,2.],[4,10,7,5,2.]],threshold:-0.0886867493391037,right_val:0.5180991888046265,left_val:0.2807899117469788},{features:[[4,12,3,2,-1.],[4,13,3,1,2.]],threshold:-7.4296112870797515e-005,right_val:0.4087625145912170,left_val:0.5295584201812744},{features:[[9,11,6,1,-1.],[11,11,2,1,3.]],threshold:-1.4932939848222304e-005,right_val:0.4538542926311493,left_val:0.5461400151252747},{features:[[4,9,7,6,-1.],[4,11,7,2,3.]],threshold:5.9162238612771034e-003,right_val:0.4192134141921997,left_val:0.5329161286354065},{features:[[7,10,6,3,-1.],[7,11,6,1,3.]],threshold:1.1141640134155750e-003,right_val:0.5706217288970947,left_val:0.4512017965316773},{features:[[9,11,2,2,-1.],[9,12,2,1,2.]],threshold:8.9249362645205110e-005,right_val:0.5897638201713562,left_val:0.4577805995941162},{features:[[0,5,20,6,-1.],[0,7,20,2,3.]],threshold:2.5319510605186224e-003,right_val:0.3357639014720917,left_val:0.5299603939056397},{features:[[6,4,6,1,-1.],[8,4,2,1,3.]],threshold:0.0124262003228068,right_val:0.1346601992845535,left_val:0.4959059059619904},{features:[[9,11,6,1,-1.],[11,11,2,1,3.]],threshold:0.0283357501029968,right_val:6.1043637106195092e-004,left_val:0.5117079019546509},{features:[[5,11,6,1,-1.],[7,11,2,1,3.]],threshold:6.6165882162749767e-003,right_val:0.7011628150939941,left_val:0.4736349880695343},{features:[[10,16,3,4,-1.],[11,16,1,4,3.]],threshold:8.0468766391277313e-003,right_val:0.3282819986343384,left_val:0.5216417908668518},{features:[[8,7,3,3,-1.],[9,7,1,3,3.]],threshold:-1.1193980462849140e-003,right_val:0.4563739001750946,left_val:0.5809860825538635},{features:[[2,12,16,8,-1.],[2,16,16,4,2.]],threshold:0.0132775902748108,right_val:0.4103901088237763,left_val:0.5398362278938294},{features:[[0,15,15,2,-1.],[0,16,15,1,2.]],threshold:4.8794739996083081e-004,right_val:0.5410590767860413,left_val:0.4249286055564880},{features:[[15,4,5,6,-1.],[15,6,5,2,3.]],threshold:0.0112431701272726,right_val:0.3438215851783752,left_val:0.5269963741302490},{features:[[9,5,2,4,-1.],[10,5,1,4,2.]],threshold:-8.9896668214350939e-004,right_val:0.4456613063812256,left_val:0.5633075833320618},{features:[[8,10,9,6,-1.],[8,12,9,2,3.]],threshold:6.6677159629762173e-003,right_val:0.4362679123878479,left_val:0.5312889218330383},{features:[[2,19,15,1,-1.],[7,19,5,1,3.]],threshold:0.0289472993463278,right_val:0.6575797796249390,left_val:0.4701794981956482},{features:[[10,16,3,4,-1.],[11,16,1,4,3.]],threshold:-0.0234000496566296,right_val:0.5137398838996887,left_val:0.},{features:[[0,15,20,4,-1.],[0,17,20,2,2.]],threshold:-0.0891170501708984,right_val:0.4942430853843689,left_val:0.0237452797591686},{features:[[10,16,3,4,-1.],[11,16,1,4,3.]],threshold:-0.0140546001493931,right_val:0.5117511153221130,left_val:0.3127323091030121},{features:[[7,16,3,4,-1.],[8,16,1,4,3.]],threshold:8.1239398568868637e-003,right_val:0.2520025968551636,left_val:0.5009049177169800},{features:[[9,16,3,3,-1.],[9,17,3,1,3.]],threshold:-4.9964650534093380e-003,right_val:0.4927811920642853,left_val:0.6387143731117249},{features:[[8,11,4,6,-1.],[8,14,4,3,2.]],threshold:3.1253970228135586e-003,right_val:0.3680452108383179,left_val:0.5136849880218506},{features:[[9,6,2,12,-1.],[9,10,2,4,3.]],threshold:6.7669642157852650e-003,right_val:0.4363631904125214,left_val:0.5509843826293945},{features:[[8,17,4,3,-1.],[8,18,4,1,3.]],threshold:-2.3711440153419971e-003,right_val:0.4586946964263916,left_val:0.6162335276603699},{features:[[9,18,8,2,-1.],[13,18,4,1,2.],[9,19,4,1,2.]],threshold:-5.3522791713476181e-003,right_val:0.4920490980148315,left_val:0.6185457706451416},{features:[[1,18,8,2,-1.],[1,19,8,1,2.]],threshold:-0.0159688591957092,right_val:0.4983252882957459,left_val:0.1382617950439453},{features:[[13,5,6,15,-1.],[15,5,2,15,3.]],threshold:4.7676060348749161e-003,right_val:0.5490046143531799,left_val:0.4688057899475098},{features:[[9,8,2,2,-1.],[9,9,2,1,2.]],threshold:-2.4714691098779440e-003,right_val:0.5003952980041504,left_val:0.2368514984846115},{features:[[9,5,2,3,-1.],[9,5,1,3,2.]],threshold:-7.1033788844943047e-004,right_val:0.4721533060073853,left_val:0.5856394171714783},{features:[[1,5,6,15,-1.],[3,5,2,15,3.]],threshold:-0.1411755979061127,right_val:0.4961591064929962,left_val:0.0869000628590584},{features:[[4,1,14,8,-1.],[11,1,7,4,2.],[4,5,7,4,2.]],threshold:0.1065180972218514,right_val:0.1741005033254623,left_val:0.5138837099075317},{features:[[2,4,4,16,-1.],[2,4,2,8,2.],[4,12,2,8,2.]],threshold:-0.0527447499334812,right_val:0.4772881865501404,left_val:0.7353636026382446},{features:[[12,4,3,12,-1.],[12,10,3,6,2.]],threshold:-4.7431760467588902e-003,right_val:0.5292701721191406,left_val:0.3884406089782715},{features:[[4,5,10,12,-1.],[4,5,5,6,2.],[9,11,5,6,2.]],threshold:9.9676765967160463e-004,right_val:0.4003424048423767,left_val:0.5223492980003357},{features:[[9,14,2,3,-1.],[9,15,2,1,3.]],threshold:8.0284131690859795e-003,right_val:0.7212964296340942,left_val:0.4959106147289276},{features:[[5,4,2,3,-1.],[5,5,2,1,3.]],threshold:8.6025858763605356e-004,right_val:0.5538476109504700,left_val:0.4444884061813355},{features:[[12,2,4,10,-1.],[14,2,2,5,2.],[12,7,2,5,2.]],threshold:9.3191501218825579e-004,right_val:0.4163244068622589,left_val:0.5398371219635010},{features:[[6,4,7,3,-1.],[6,5,7,1,3.]],threshold:-2.5082060601562262e-003,right_val:0.4562500119209290,left_val:0.5854265093803406},{features:[[2,0,18,2,-1.],[11,0,9,1,2.],[2,1,9,1,2.]],threshold:-2.1378761157393456e-003,right_val:0.5280259251594544,left_val:0.4608069062232971},{features:[[0,0,18,2,-1.],[0,0,9,1,2.],[9,1,9,1,2.]],threshold:-2.1546049974858761e-003,right_val:0.5255997180938721,left_val:0.3791126906871796},{features:[[13,13,4,6,-1.],[15,13,2,3,2.],[13,16,2,3,2.]],threshold:-7.6214009895920753e-003,right_val:0.4952073991298676,left_val:0.5998609066009522},{features:[[3,13,4,6,-1.],[3,13,2,3,2.],[5,16,2,3,2.]],threshold:2.2055360022932291e-003,right_val:0.5588530898094177,left_val:0.4484206140041351},{features:[[10,12,2,6,-1.],[10,15,2,3,2.]],threshold:1.2586950324475765e-003,right_val:0.4423840939998627,left_val:0.5450747013092041},{features:[[5,9,10,10,-1.],[5,9,5,5,2.],[10,14,5,5,2.]],threshold:-5.0926720723509789e-003,right_val:0.5263035893440247,left_val:0.4118275046348572},{features:[[11,4,4,2,-1.],[13,4,2,1,2.],[11,5,2,1,2.]],threshold:-2.5095739401876926e-003,right_val:0.4998494982719421,left_val:0.5787907838821411},{features:[[7,12,6,8,-1.],[10,12,3,8,2.]],threshold:-0.0773275569081306,right_val:0.4811120033264160,left_val:0.8397865891456604},{features:[[12,2,4,10,-1.],[14,2,2,5,2.],[12,7,2,5,2.]],threshold:-0.0414858199656010,right_val:0.5176993012428284,left_val:0.2408611029386520},{features:[[8,11,2,1,-1.],[9,11,1,1,2.]],threshold:1.0355669655837119e-004,right_val:0.5417054295539856,left_val:0.4355360865592957},{features:[[10,5,1,12,-1.],[10,9,1,4,3.]],threshold:1.3255809899419546e-003,right_val:0.4894095063209534,left_val:0.5453971028327942},{features:[[0,11,6,9,-1.],[3,11,3,9,2.]],threshold:-8.0598732456564903e-003,right_val:0.4577918946743012,left_val:0.5771024227142334},{features:[[12,2,4,10,-1.],[14,2,2,5,2.],[12,7,2,5,2.]],threshold:0.0190586205571890,right_val:0.3400475084781647,left_val:0.5169867873191834},{features:[[4,2,4,10,-1.],[4,2,2,5,2.],[6,7,2,5,2.]],threshold:-0.0350578911602497,right_val:0.5000503063201904,left_val:0.2203243970870972},{features:[[11,4,4,2,-1.],[13,4,2,1,2.],[11,5,2,1,2.]],threshold:5.7296059094369411e-003,right_val:0.6597570776939392,left_val:0.5043408274650574},{features:[[0,14,6,3,-1.],[0,15,6,1,3.]],threshold:-0.0116483299061656,right_val:0.4996652901172638,left_val:0.2186284959316254},{features:[[11,4,4,2,-1.],[13,4,2,1,2.],[11,5,2,1,2.]],threshold:1.4544479781761765e-003,right_val:0.5503727793693543,left_val:0.5007681846618652},{features:[[6,1,3,2,-1.],[7,1,1,2,3.]],threshold:-2.5030909455381334e-004,right_val:0.5241670012474060,left_val:0.4129841029644013},{features:[[11,4,4,2,-1.],[13,4,2,1,2.],[11,5,2,1,2.]],threshold:-8.2907272735610604e-004,right_val:0.4974496066570282,left_val:0.5412868261337280},{features:[[5,4,4,2,-1.],[5,4,2,1,2.],[7,5,2,1,2.]],threshold:1.0862209601327777e-003,right_val:0.5879228711128235,left_val:0.4605529904365540},{features:[[13,0,2,12,-1.],[14,0,1,6,2.],[13,6,1,6,2.]],threshold:2.0000500080641359e-004,right_val:0.4705209136009216,left_val:0.5278854966163635},{features:[[6,0,3,10,-1.],[7,0,1,10,3.]],threshold:2.9212920926511288e-003,right_val:0.3755536973476410,left_val:0.5129609704017639},{features:[[3,0,17,8,-1.],[3,4,17,4,2.]],threshold:0.0253874007612467,right_val:0.5790768265724182,left_val:0.4822691977024078},{features:[[0,4,20,4,-1.],[0,6,20,2,2.]],threshold:-3.1968469265848398e-003,right_val:0.3962840139865875,left_val:0.5248395204544067}],threshold:87.6960296630859380},{simpleClassifiers:[{features:[[0,3,8,2,-1.],[4,3,4,2,2.]],threshold:5.8031738735735416e-003,right_val:0.5961983203887940,left_val:0.3498983979225159},{features:[[8,11,4,3,-1.],[8,12,4,1,3.]],threshold:-9.0003069490194321e-003,right_val:0.4478552043437958,left_val:0.6816636919975281},{features:[[5,7,6,4,-1.],[5,7,3,2,2.],[8,9,3,2,2.]],threshold:-1.1549659539014101e-003,right_val:0.3578251004219055,left_val:0.5585706233978272},{features:[[8,3,4,9,-1.],[8,6,4,3,3.]],threshold:-1.1069850297644734e-003,right_val:0.3050428032875061,left_val:0.5365036129951477},{features:[[8,15,1,4,-1.],[8,17,1,2,2.]],threshold:1.0308309720130637e-004,right_val:0.5344635844230652,left_val:0.3639095127582550},{features:[[4,5,12,7,-1.],[8,5,4,7,3.]],threshold:-5.0984839908778667e-003,right_val:0.5504264831542969,left_val:0.2859157025814056},{features:[[4,2,4,10,-1.],[4,2,2,5,2.],[6,7,2,5,2.]],threshold:8.2572200335562229e-004,right_val:0.3476041853427887,left_val:0.5236523747444153},{features:[[3,0,17,2,-1.],[3,1,17,1,2.]],threshold:9.9783325567841530e-003,right_val:0.6219646930694580,left_val:0.4750322103500366},{features:[[2,2,16,15,-1.],[2,7,16,5,3.]],threshold:-0.0374025292694569,right_val:0.5278062820434570,left_val:0.3343375921249390},{features:[[15,2,5,2,-1.],[15,3,5,1,2.]],threshold:4.8548257909715176e-003,right_val:0.3700444102287293,left_val:0.5192180871963501},{features:[[9,3,2,2,-1.],[10,3,1,2,2.]],threshold:-1.8664470408111811e-003,right_val:0.5091944932937622,left_val:0.2929843962192535},{features:[[4,5,16,15,-1.],[4,10,16,5,3.]],threshold:0.0168888904154301,right_val:0.5431225895881653,left_val:0.3686845898628235},{features:[[7,13,5,6,-1.],[7,16,5,3,2.]],threshold:-5.8372621424496174e-003,right_val:0.5221335887908936,left_val:0.3632183969020844},{features:[[10,7,3,2,-1.],[11,7,1,2,3.]],threshold:-1.4713739510625601e-003,right_val:0.4700650870800018,left_val:0.5870683789253235},{features:[[8,3,3,1,-1.],[9,3,1,1,3.]],threshold:-1.1522950371727347e-003,right_val:0.5140954256057739,left_val:0.3195894956588745},{features:[[9,16,3,3,-1.],[9,17,3,1,3.]],threshold:-4.2560300789773464e-003,right_val:0.4814921021461487,left_val:0.6301859021186829},{features:[[0,2,5,2,-1.],[0,3,5,1,2.]],threshold:-6.7378291860222816e-003,right_val:0.5025808215141296,left_val:0.1977048069238663},{features:[[12,5,4,3,-1.],[12,6,4,1,3.]],threshold:0.0113826701417565,right_val:0.6867045760154724,left_val:0.4954132139682770},{features:[[1,7,12,1,-1.],[5,7,4,1,3.]],threshold:5.1794708706438541e-003,right_val:0.3350647985935211,left_val:0.5164427757263184},{features:[[7,5,6,14,-1.],[7,12,6,7,2.]],threshold:-0.1174378991127014,right_val:0.5234413743019104,left_val:0.2315246015787125},{features:[[0,0,8,10,-1.],[0,0,4,5,2.],[4,5,4,5,2.]],threshold:0.0287034492939711,right_val:0.6722521185874939,left_val:0.4664297103881836},{features:[[9,1,3,2,-1.],[10,1,1,2,3.]],threshold:4.8231030814349651e-003,right_val:0.2723532915115356,left_val:0.5220875144004822},{features:[[8,1,3,2,-1.],[9,1,1,2,3.]],threshold:2.6798530016094446e-003,right_val:0.2906948924064636,left_val:0.5079277157783508},{features:[[12,4,3,3,-1.],[12,5,3,1,3.]],threshold:8.0504082143306732e-003,right_val:0.6395021080970764,left_val:0.4885950982570648},{features:[[7,4,6,16,-1.],[7,12,6,8,2.]],threshold:4.8054959625005722e-003,right_val:0.3656663894653320,left_val:0.5197256803512573},{features:[[12,4,3,3,-1.],[12,5,3,1,3.]],threshold:-2.2420159075409174e-003,right_val:0.4763701856136322,left_val:0.6153467893600464},{features:[[2,3,2,6,-1.],[2,5,2,2,3.]],threshold:-0.0137577103450894,right_val:0.5030903220176697,left_val:0.2637344896793366},{features:[[14,2,6,9,-1.],[14,5,6,3,3.]],threshold:-0.1033829972147942,right_val:0.5182461142539978,left_val:0.2287521958351135},{features:[[5,4,3,3,-1.],[5,5,3,1,3.]],threshold:-9.4432085752487183e-003,right_val:0.4694949090480804,left_val:0.6953303813934326},{features:[[9,17,3,2,-1.],[10,17,1,2,3.]],threshold:8.0271181650459766e-004,right_val:0.4268783926963806,left_val:0.5450655221939087},{features:[[5,5,2,3,-1.],[5,6,2,1,3.]],threshold:-4.1945669800043106e-003,right_val:0.4571642875671387,left_val:0.6091387867927551},{features:[[13,11,3,6,-1.],[13,13,3,2,3.]],threshold:0.0109422104433179,right_val:0.3284547030925751,left_val:0.5241063237190247},{features:[[3,14,2,6,-1.],[3,17,2,3,2.]],threshold:-5.7841069065034389e-004,right_val:0.4179368913173676,left_val:0.5387929081916809},{features:[[14,3,6,2,-1.],[14,4,6,1,2.]],threshold:-2.0888620056211948e-003,right_val:0.5301715731620789,left_val:0.4292691051959992},{features:[[0,8,16,2,-1.],[0,9,16,1,2.]],threshold:3.2383969519287348e-003,right_val:0.5220744013786316,left_val:0.3792347908020020},{features:[[14,3,6,2,-1.],[14,4,6,1,2.]],threshold:4.9075027927756310e-003,right_val:0.4126757979393005,left_val:0.5237283110618591},{features:[[0,0,5,6,-1.],[0,2,5,2,3.]],threshold:-0.0322779417037964,right_val:0.4994502067565918,left_val:0.1947655975818634},{features:[[12,5,4,3,-1.],[12,6,4,1,3.]],threshold:-8.9711230248212814e-003,right_val:0.4929032027721405,left_val:0.6011285185813904},{features:[[4,11,3,6,-1.],[4,13,3,2,3.]],threshold:0.0153210898861289,right_val:0.2039822041988373,left_val:0.5009753704071045},{features:[[12,5,4,3,-1.],[12,6,4,1,3.]],threshold:2.0855569746345282e-003,right_val:0.5721694827079773,left_val:0.4862189888954163},{features:[[9,5,1,3,-1.],[9,6,1,1,3.]],threshold:5.0615021027624607e-003,right_val:0.1801805943250656,left_val:0.5000218749046326},{features:[[12,5,4,3,-1.],[12,6,4,1,3.]],threshold:-3.7174751050770283e-003,right_val:0.4897592961788178,left_val:0.5530117154121399},{features:[[6,6,8,12,-1.],[6,12,8,6,2.]],threshold:-0.0121705001220107,right_val:0.5383723974227905,left_val:0.4178605973720551},{features:[[12,5,4,3,-1.],[12,6,4,1,3.]],threshold:4.6248398721218109e-003,right_val:0.5761327147483826,left_val:0.4997169971466065},{features:[[5,12,9,2,-1.],[8,12,3,2,3.]],threshold:-2.1040429419372231e-004,right_val:0.4097681045532227,left_val:0.5331807136535645},{features:[[12,5,4,3,-1.],[12,6,4,1,3.]],threshold:-0.0146417804062366,right_val:0.5051776170730591,left_val:0.5755925178527832},{features:[[4,5,4,3,-1.],[4,6,4,1,3.]],threshold:3.3199489116668701e-003,right_val:0.6031805872917175,left_val:0.4576976895332336},{features:[[6,6,9,2,-1.],[9,6,3,2,3.]],threshold:3.7236879579722881e-003,right_val:0.5415883064270020,left_val:0.4380396902561188},{features:[[4,11,1,3,-1.],[4,12,1,1,3.]],threshold:8.2951161311939359e-004,right_val:0.3702219128608704,left_val:0.5163031816482544},{features:[[14,12,6,6,-1.],[14,12,3,6,2.]],threshold:-0.0114084901288152,right_val:0.4862565100193024,left_val:0.6072946786880493},{features:[[7,0,3,7,-1.],[8,0,1,7,3.]],threshold:-4.5320121571421623e-003,right_val:0.5088962912559509,left_val:0.3292475938796997},{features:[[9,8,3,3,-1.],[10,8,1,3,3.]],threshold:5.1276017911732197e-003,right_val:0.6122708916664124,left_val:0.4829767942428589},{features:[[8,8,3,3,-1.],[9,8,1,3,3.]],threshold:9.8583158105611801e-003,right_val:0.6556177139282227,left_val:0.4660679996013641},{features:[[5,10,11,3,-1.],[5,11,11,1,3.]],threshold:0.0369859188795090,right_val:0.1690472066402435,left_val:0.5204849243164063},{features:[[5,7,10,1,-1.],[10,7,5,1,2.]],threshold:4.6491161920130253e-003,right_val:0.3725225031375885,left_val:0.5167322158813477},{features:[[9,7,3,2,-1.],[10,7,1,2,3.]],threshold:-4.2664702050387859e-003,right_val:0.4987342953681946,left_val:0.6406493186950684},{features:[[8,7,3,2,-1.],[9,7,1,2,3.]],threshold:-4.7956590424291790e-004,right_val:0.4464873969554901,left_val:0.5897293090820313},{features:[[11,9,4,2,-1.],[11,9,2,2,2.]],threshold:3.6827160511165857e-003,right_val:0.3472662866115570,left_val:0.5441560745239258},{features:[[5,9,4,2,-1.],[7,9,2,2,2.]],threshold:-0.0100598800927401,right_val:0.5004829764366150,left_val:0.2143162935972214},{features:[[14,10,2,4,-1.],[14,12,2,2,2.]],threshold:-3.0361840617842972e-004,right_val:0.4590323865413666,left_val:0.5386424064636231},{features:[[7,7,3,2,-1.],[8,7,1,2,3.]],threshold:-1.4545479789376259e-003,right_val:0.4497095048427582,left_val:0.5751184225082398},{features:[[14,17,6,3,-1.],[14,18,6,1,3.]],threshold:1.6515209572389722e-003,right_val:0.4238520860671997,left_val:0.5421937704086304},{features:[[4,5,12,12,-1.],[4,5,6,6,2.],[10,11,6,6,2.]],threshold:-7.8468639403581619e-003,right_val:0.5258157253265381,left_val:0.4077920913696289},{features:[[6,9,8,8,-1.],[10,9,4,4,2.],[6,13,4,4,2.]],threshold:-5.1259850151836872e-003,right_val:0.5479453206062317,left_val:0.4229275882244110},{features:[[0,4,15,4,-1.],[5,4,5,4,3.]],threshold:-0.0368909612298012,right_val:0.4674678146839142,left_val:0.6596375703811646},{features:[[13,2,4,1,-1.],[13,2,2,1,2.]],threshold:2.4035639944486320e-004,right_val:0.5573202967643738,left_val:0.4251135885715485},{features:[[4,12,2,2,-1.],[4,13,2,1,2.]],threshold:-1.5150169929256663e-005,right_val:0.4074114859104157,left_val:0.5259246826171875},{features:[[8,13,4,3,-1.],[8,14,4,1,3.]],threshold:2.2108471021056175e-003,right_val:0.5886352062225342,left_val:0.4671722948551178},{features:[[9,13,2,3,-1.],[9,14,2,1,3.]],threshold:-1.1568620102480054e-003,right_val:0.4487161934375763,left_val:0.5711066126823425},{features:[[13,11,2,3,-1.],[13,12,2,1,3.]],threshold:4.9996292218565941e-003,right_val:0.2898327112197876,left_val:0.5264198184013367},{features:[[7,12,4,4,-1.],[7,12,2,2,2.],[9,14,2,2,2.]],threshold:-1.4656189596280456e-003,right_val:0.5197871923446655,left_val:0.3891738057136536},{features:[[10,11,2,2,-1.],[11,11,1,1,2.],[10,12,1,1,2.]],threshold:-1.1975039960816503e-003,right_val:0.4927955865859985,left_val:0.5795872807502747},{features:[[8,17,3,2,-1.],[9,17,1,2,3.]],threshold:-4.4954330660402775e-003,right_val:0.5012555122375488,left_val:0.2377603054046631},{features:[[10,11,2,2,-1.],[11,11,1,1,2.],[10,12,1,1,2.]],threshold:1.4997160178609192e-004,right_val:0.5617607831954956,left_val:0.4876626133918762},{features:[[0,17,6,3,-1.],[0,18,6,1,3.]],threshold:2.6391509454697371e-003,right_val:0.3765509128570557,left_val:0.5168088078498840},{features:[[10,11,2,2,-1.],[11,11,1,1,2.],[10,12,1,1,2.]],threshold:-2.9368131072260439e-004,right_val:0.4874630868434906,left_val:0.5446649193763733},{features:[[8,11,2,2,-1.],[8,11,1,1,2.],[9,12,1,1,2.]],threshold:1.4211760135367513e-003,right_val:0.6691331863403320,left_val:0.4687897861003876},{features:[[12,5,8,4,-1.],[12,5,4,4,2.]],threshold:0.0794276371598244,right_val:0.2732945978641510,left_val:0.5193443894386292},{features:[[0,5,8,4,-1.],[4,5,4,4,2.]],threshold:0.0799375027418137,right_val:0.1782083958387375,left_val:0.4971731007099152},{features:[[13,2,4,1,-1.],[13,2,2,1,2.]],threshold:0.0110892597585917,right_val:0.3209475874900818,left_val:0.5165994763374329},{features:[[3,2,4,1,-1.],[5,2,2,1,2.]],threshold:1.6560709627810866e-004,right_val:0.5307276248931885,left_val:0.4058471918106079},{features:[[10,0,4,2,-1.],[12,0,2,1,2.],[10,1,2,1,2.]],threshold:-5.3354292176663876e-003,right_val:0.5158129930496216,left_val:0.3445056974887848},{features:[[7,12,3,1,-1.],[8,12,1,1,3.]],threshold:1.1287260567769408e-003,right_val:0.6075533032417297,left_val:0.4594863057136536},{features:[[8,11,4,8,-1.],[10,11,2,4,2.],[8,15,2,4,2.]],threshold:-0.0219692196696997,right_val:0.5228595733642578,left_val:0.1680400967597961},{features:[[9,9,2,2,-1.],[9,10,2,1,2.]],threshold:-2.1775320055894554e-004,right_val:0.5215672850608826,left_val:0.3861596882343292},{features:[[3,18,15,2,-1.],[3,19,15,1,2.]],threshold:2.0200149447191507e-004,right_val:0.4363039135932922,left_val:0.5517979264259338},{features:[[2,6,2,12,-1.],[2,6,1,6,2.],[3,12,1,6,2.]],threshold:-0.0217331498861313,right_val:0.4789851009845734,left_val:0.7999460101127625},{features:[[9,8,2,3,-1.],[9,9,2,1,3.]],threshold:-8.4399932529777288e-004,right_val:0.5374773144721985,left_val:0.4085975885391235},{features:[[7,10,3,2,-1.],[8,10,1,2,3.]],threshold:-4.3895249837078154e-004,right_val:0.4366143047809601,left_val:0.5470405220985413},{features:[[11,11,3,1,-1.],[12,11,1,1,3.]],threshold:1.5092400135472417e-003,right_val:0.5842149257659912,left_val:0.4988996982574463},{features:[[6,11,3,1,-1.],[7,11,1,1,3.]],threshold:-3.5547839943319559e-003,right_val:0.4721005856990814,left_val:0.6753690242767334},{features:[[9,2,4,2,-1.],[11,2,2,1,2.],[9,3,2,1,2.]],threshold:4.8191400128416717e-004,right_val:0.4357109069824219,left_val:0.5415853857994080},{features:[[4,12,2,3,-1.],[4,13,2,1,3.]],threshold:-6.0264398343861103e-003,right_val:0.4991880953311920,left_val:0.2258509993553162},{features:[[2,1,18,3,-1.],[8,1,6,3,3.]],threshold:-0.0116681400686502,right_val:0.4927498996257782,left_val:0.6256554722785950},{features:[[5,1,4,14,-1.],[7,1,2,14,2.]],threshold:-2.8718370012938976e-003,right_val:0.5245801806449890,left_val:0.3947784900665283},{features:[[8,16,12,3,-1.],[8,16,6,3,2.]],threshold:0.0170511696487665,right_val:0.5794224143028259,left_val:0.4752511084079742},{features:[[1,17,18,3,-1.],[7,17,6,3,3.]],threshold:-0.0133520802482963,right_val:0.4544535875320435,left_val:0.6041104793548584},{features:[[9,14,2,6,-1.],[9,17,2,3,2.]],threshold:-3.9301801007241011e-004,right_val:0.5544905066490173,left_val:0.4258275926113129},{features:[[9,12,1,8,-1.],[9,16,1,4,2.]],threshold:3.0483349692076445e-003,right_val:0.3780272901058197,left_val:0.5233420133590698},{features:[[9,14,2,3,-1.],[9,15,2,1,3.]],threshold:-4.3579288758337498e-003,right_val:0.4838674068450928,left_val:0.6371889114379883},{features:[[9,6,2,12,-1.],[9,10,2,4,3.]],threshold:5.6661018170416355e-003,right_val:0.4163666069507599,left_val:0.5374705791473389},{features:[[12,9,3,3,-1.],[12,10,3,1,3.]],threshold:6.0677339206449687e-005,right_val:0.5311625003814697,left_val:0.4638795852661133},{features:[[0,1,4,8,-1.],[2,1,2,8,2.]],threshold:0.0367381609976292,right_val:0.6466524004936218,left_val:0.4688656032085419},{features:[[9,1,6,2,-1.],[12,1,3,1,2.],[9,2,3,1,2.]],threshold:8.6528137326240540e-003,right_val:0.2188657969236374,left_val:0.5204318761825562},{features:[[1,3,12,14,-1.],[1,10,12,7,2.]],threshold:-0.1537135988473892,right_val:0.4958840012550354,left_val:0.1630371958017349},{features:[[8,12,4,2,-1.],[10,12,2,1,2.],[8,13,2,1,2.]],threshold:-4.1560421232134104e-004,right_val:0.4696458876132965,left_val:0.5774459242820740},{features:[[1,9,10,2,-1.],[1,9,5,1,2.],[6,10,5,1,2.]],threshold:-1.2640169588848948e-003,right_val:0.5217198133468628,left_val:0.3977175951004028},{features:[[8,15,4,3,-1.],[8,16,4,1,3.]],threshold:-3.5473341122269630e-003,right_val:0.4808315038681030,left_val:0.6046528220176697},{features:[[6,8,8,3,-1.],[6,9,8,1,3.]],threshold:3.0019069527043030e-005,right_val:0.5228201150894165,left_val:0.3996723890304565},{features:[[9,15,5,3,-1.],[9,16,5,1,3.]],threshold:1.3113019522279501e-003,right_val:0.5765997767448425,left_val:0.4712158143520355},{features:[[8,7,4,3,-1.],[8,8,4,1,3.]],threshold:-1.3374709524214268e-003,right_val:0.5253170132637024,left_val:0.4109584987163544},{features:[[7,7,6,2,-1.],[7,8,6,1,2.]],threshold:0.0208767093718052,right_val:0.1757981926202774,left_val:0.5202993750572205},{features:[[5,7,8,2,-1.],[5,7,4,1,2.],[9,8,4,1,2.]],threshold:-7.5497948564589024e-003,right_val:0.4694975018501282,left_val:0.6566609740257263},{features:[[12,9,3,3,-1.],[12,10,3,1,3.]],threshold:0.0241885501891375,right_val:0.3370220959186554,left_val:0.5128673911094666},{features:[[4,7,4,2,-1.],[4,8,4,1,2.]],threshold:-2.9358828905969858e-003,right_val:0.4694541096687317,left_val:0.6580786705017090},{features:[[14,2,6,9,-1.],[14,5,6,3,3.]],threshold:0.0575579293072224,right_val:0.2775259912014008,left_val:0.5146445035934448},{features:[[4,9,3,3,-1.],[5,9,1,3,3.]],threshold:-1.1343370424583554e-003,right_val:0.5192667245864868,left_val:0.3836601972579956},{features:[[12,9,3,3,-1.],[12,10,3,1,3.]],threshold:0.0168169997632504,right_val:0.6177260875701904,left_val:0.5085592865943909},{features:[[0,2,6,9,-1.],[0,5,6,3,3.]],threshold:5.0535178743302822e-003,right_val:0.3684791922569275,left_val:0.5138763189315796},{features:[[17,3,3,6,-1.],[18,3,1,6,3.]],threshold:-4.5874710194766521e-003,right_val:0.4835202097892761,left_val:0.5989655256271362},{features:[[0,3,3,6,-1.],[1,3,1,6,3.]],threshold:1.6882460331544280e-003,right_val:0.5723056793212891,left_val:0.4509486854076386},{features:[[17,14,1,2,-1.],[17,15,1,1,2.]],threshold:-1.6554000321775675e-003,right_val:0.5243319272994995,left_val:0.3496770858764648},{features:[[4,9,4,3,-1.],[6,9,2,3,2.]],threshold:-0.0193738006055355,right_val:0.4968712925910950,left_val:0.1120536997914314},{features:[[12,9,3,3,-1.],[12,10,3,1,3.]],threshold:0.0103744501248002,right_val:0.4395213127136231,left_val:0.5148196816444397},{features:[[5,9,3,3,-1.],[5,10,3,1,3.]],threshold:1.4973050565458834e-004,right_val:0.5269886851310730,left_val:0.4084999859333038},{features:[[9,5,6,8,-1.],[12,5,3,4,2.],[9,9,3,4,2.]],threshold:-0.0429819300770760,right_val:0.5018504261970520,left_val:0.6394104957580566},{features:[[5,5,6,8,-1.],[5,5,3,4,2.],[8,9,3,4,2.]],threshold:8.3065936341881752e-003,right_val:0.6698353290557861,left_val:0.4707553982734680},{features:[[16,1,4,6,-1.],[16,4,4,3,2.]],threshold:-4.1285790503025055e-003,right_val:0.5323647260665894,left_val:0.4541369080543518},{features:[[1,0,6,20,-1.],[3,0,2,20,3.]],threshold:1.7399420030415058e-003,right_val:0.5439866185188294,left_val:0.4333961904048920},{features:[[12,11,3,2,-1.],[13,11,1,2,3.]],threshold:1.1739750334527344e-004,right_val:0.5543426275253296,left_val:0.4579687118530273},{features:[[5,11,3,2,-1.],[6,11,1,2,3.]],threshold:1.8585780344437808e-004,right_val:0.5426754951477051,left_val:0.4324643909931183},{features:[[9,4,6,1,-1.],[11,4,2,1,3.]],threshold:5.5587692186236382e-003,right_val:0.3550611138343811,left_val:0.5257220864295960},{features:[[0,0,8,3,-1.],[4,0,4,3,2.]],threshold:-7.9851560294628143e-003,right_val:0.4630635976791382,left_val:0.6043018102645874},{features:[[15,0,2,5,-1.],[15,0,1,5,2.]],threshold:6.0594122624024749e-004,right_val:0.5533195137977600,left_val:0.4598254859447479},{features:[[4,1,3,2,-1.],[5,1,1,2,3.]],threshold:-2.2983040253166109e-004,right_val:0.5322461128234863,left_val:0.4130752086639404},{features:[[7,0,6,15,-1.],[9,0,2,15,3.]],threshold:4.3740210821852088e-004,right_val:0.5409289002418518,left_val:0.4043039977550507},{features:[[6,11,3,1,-1.],[7,11,1,1,3.]],threshold:2.9482020181603730e-004,right_val:0.5628852248191834,left_val:0.4494963884353638},{features:[[12,0,3,4,-1.],[13,0,1,4,3.]],threshold:0.0103126596659422,right_val:0.2704316973686218,left_val:0.5177510976791382},{features:[[5,4,6,1,-1.],[7,4,2,1,3.]],threshold:-7.7241109684109688e-003,right_val:0.4980553984642029,left_val:0.1988019049167633},{features:[[12,7,3,2,-1.],[12,8,3,1,2.]],threshold:-4.6797208487987518e-003,right_val:0.5018296241760254,left_val:0.6644750237464905},{features:[[0,1,4,6,-1.],[0,4,4,3,2.]],threshold:-5.0755459815263748e-003,right_val:0.5185269117355347,left_val:0.3898304998874664},{features:[[12,7,3,2,-1.],[12,8,3,1,2.]],threshold:2.2479740437120199e-003,right_val:0.5660336017608643,left_val:0.4801808893680573},{features:[[2,16,3,3,-1.],[2,17,3,1,3.]],threshold:8.3327008178457618e-004,right_val:0.3957188129425049,left_val:0.5210919976234436},{features:[[13,8,6,10,-1.],[16,8,3,5,2.],[13,13,3,5,2.]],threshold:-0.0412793308496475,right_val:0.5007054209709168,left_val:0.6154541969299316},{features:[[0,9,5,2,-1.],[0,10,5,1,2.]],threshold:-5.0930189900100231e-004,right_val:0.5228403806686401,left_val:0.3975942134857178},{features:[[12,11,2,2,-1.],[13,11,1,1,2.],[12,12,1,1,2.]],threshold:1.2568780221045017e-003,right_val:0.5939183235168457,left_val:0.4979138076305389},{features:[[3,15,3,3,-1.],[3,16,3,1,3.]],threshold:8.0048497766256332e-003,right_val:0.1633366048336029,left_val:0.4984497129917145},{features:[[12,7,3,2,-1.],[12,8,3,1,2.]],threshold:-1.1879300000146031e-003,right_val:0.4942624866962433,left_val:0.5904964804649353},{features:[[5,7,3,2,-1.],[5,8,3,1,2.]],threshold:6.1948952497914433e-004,right_val:0.5328726172447205,left_val:0.4199557900428772},{features:[[9,5,9,9,-1.],[9,8,9,3,3.]],threshold:6.6829859279096127e-003,right_val:0.4905889034271240,left_val:0.5418602824211121},{features:[[5,0,3,7,-1.],[6,0,1,7,3.]],threshold:-3.7062340416014194e-003,right_val:0.5138000249862671,left_val:0.3725939095020294},{features:[[5,2,12,5,-1.],[9,2,4,5,3.]],threshold:-0.0397394113242626,right_val:0.5050346851348877,left_val:0.6478961110115051},{features:[[6,11,2,2,-1.],[6,11,1,1,2.],[7,12,1,1,2.]],threshold:1.4085009461268783e-003,right_val:0.6377884149551392,left_val:0.4682339131832123},{features:[[15,15,3,2,-1.],[15,16,3,1,2.]],threshold:3.9322688826359808e-004,right_val:0.4150482118129730,left_val:0.5458530187606812},{features:[[2,15,3,2,-1.],[2,16,3,1,2.]],threshold:-1.8979819724336267e-003,right_val:0.5149704217910767,left_val:0.3690159916877747},{features:[[14,12,6,8,-1.],[17,12,3,4,2.],[14,16,3,4,2.]],threshold:-0.0139704402536154,right_val:0.4811357855796814,left_val:0.6050562858581543},{features:[[2,8,15,6,-1.],[7,8,5,6,3.]],threshold:-0.1010081991553307,right_val:0.4992361962795258,left_val:0.2017080038785934},{features:[[2,2,18,17,-1.],[8,2,6,17,3.]],threshold:-0.0173469204455614,right_val:0.4899486005306244,left_val:0.5713148713111877},{features:[[5,1,4,1,-1.],[7,1,2,1,2.]],threshold:1.5619759506080300e-004,right_val:0.5392642021179199,left_val:0.4215388894081116},{features:[[5,2,12,5,-1.],[9,2,4,5,3.]],threshold:0.1343892961740494,right_val:0.3767612874507904,left_val:0.5136151909828186},{features:[[3,2,12,5,-1.],[7,2,4,5,3.]],threshold:-0.0245822407305241,right_val:0.4747906923294067,left_val:0.7027357816696167},{features:[[4,9,12,4,-1.],[10,9,6,2,2.],[4,11,6,2,2.]],threshold:-3.8553720805794001e-003,right_val:0.5427716970443726,left_val:0.4317409098148346},{features:[[5,15,6,2,-1.],[5,15,3,1,2.],[8,16,3,1,2.]],threshold:-2.3165249731391668e-003,right_val:0.4618647992610931,left_val:0.5942698717117310},{features:[[10,14,2,3,-1.],[10,15,2,1,3.]],threshold:-4.8518120311200619e-003,right_val:0.4884895086288452,left_val:0.6191568970680237},{features:[[0,13,20,2,-1.],[0,13,10,1,2.],[10,14,10,1,2.]],threshold:2.4699938949197531e-003,right_val:0.4017199873924255,left_val:0.5256664752960205},{features:[[4,9,12,8,-1.],[10,9,6,4,2.],[4,13,6,4,2.]],threshold:0.0454969592392445,right_val:0.2685773968696594,left_val:0.5237867832183838},{features:[[8,13,3,6,-1.],[8,16,3,3,2.]],threshold:-0.0203195996582508,right_val:0.4979738891124725,left_val:0.2130445986986160},{features:[[10,12,2,2,-1.],[10,13,2,1,2.]],threshold:2.6994998916052282e-004,right_val:0.5543122291564941,left_val:0.4814041852951050},{features:[[9,12,2,2,-1.],[9,12,1,1,2.],[10,13,1,1,2.]],threshold:-1.8232699949294329e-003,right_val:0.4709989130496979,left_val:0.6482579708099365},{features:[[4,11,14,4,-1.],[11,11,7,2,2.],[4,13,7,2,2.]],threshold:-6.3015790656208992e-003,right_val:0.5306236147880554,left_val:0.4581927955150604},{features:[[8,5,4,2,-1.],[8,6,4,1,2.]],threshold:-2.4139499873854220e-004,right_val:0.4051763117313385,left_val:0.5232086777687073},{features:[[10,10,6,3,-1.],[12,10,2,3,3.]],threshold:-1.0330369696021080e-003,right_val:0.4789193868637085,left_val:0.5556201934814453},{features:[[2,14,1,2,-1.],[2,15,1,1,2.]],threshold:1.8041160365100950e-004,right_val:0.4011810123920441,left_val:0.5229442715644836},{features:[[13,8,6,12,-1.],[16,8,3,6,2.],[13,14,3,6,2.]],threshold:-0.0614078603684902,right_val:0.5010703206062317,left_val:0.6298682093620300},{features:[[1,8,6,12,-1.],[1,8,3,6,2.],[4,14,3,6,2.]],threshold:-0.0695439130067825,right_val:0.4773184061050415,left_val:0.7228280901908875},{features:[[10,0,6,10,-1.],[12,0,2,10,3.]],threshold:-0.0705426633358002,right_val:0.5182529091835022,left_val:0.2269513010978699},{features:[[5,11,8,4,-1.],[5,11,4,2,2.],[9,13,4,2,2.]],threshold:2.4423799477517605e-003,right_val:0.4098151028156281,left_val:0.5237097144126892},{features:[[10,16,8,4,-1.],[14,16,4,2,2.],[10,18,4,2,2.]],threshold:1.5494349645450711e-003,right_val:0.5468043088912964,left_val:0.4773750901222229},{features:[[7,7,6,6,-1.],[9,7,2,6,3.]],threshold:-0.0239142198115587,right_val:0.4783824980258942,left_val:0.7146975994110107},{features:[[10,2,4,10,-1.],[10,2,2,10,2.]],threshold:-0.0124536901712418,right_val:0.5241122841835022,left_val:0.2635296881198883},{features:[[6,1,4,9,-1.],[8,1,2,9,2.]],threshold:-2.0760179904755205e-004,right_val:0.5113608837127686,left_val:0.3623757064342499},{features:[[12,19,2,1,-1.],[12,19,1,1,2.]],threshold:2.9781080229440704e-005,right_val:0.5432801842689514,left_val:0.4705932140350342}],threshold:90.2533493041992190},{simpleClassifiers:[{features:[[1,2,4,9,-1.],[3,2,2,9,2.]],threshold:0.0117727499455214,right_val:0.6421167254447937,left_val:0.3860518932342529},{features:[[7,5,6,4,-1.],[9,5,2,4,3.]],threshold:0.0270375702530146,right_val:0.6754038929939270,left_val:0.4385654926300049},{features:[[9,4,2,4,-1.],[9,6,2,2,2.]],threshold:-3.6419500247575343e-005,right_val:0.3423315882682800,left_val:0.5487101078033447},{features:[[14,5,2,8,-1.],[14,9,2,4,2.]],threshold:1.9995409529656172e-003,right_val:0.5400317907333374,left_val:0.3230532109737396},{features:[[7,6,5,12,-1.],[7,12,5,6,2.]],threshold:4.5278300531208515e-003,right_val:0.2935043871402741,left_val:0.5091639757156372},{features:[[14,6,2,6,-1.],[14,9,2,3,2.]],threshold:4.7890920541249216e-004,right_val:0.5344064235687256,left_val:0.4178153872489929},{features:[[4,6,2,6,-1.],[4,9,2,3,2.]],threshold:1.1720920447260141e-003,right_val:0.5132070779800415,left_val:0.2899182140827179},{features:[[8,15,10,4,-1.],[13,15,5,2,2.],[8,17,5,2,2.]],threshold:9.5305702416226268e-004,right_val:0.5560845136642456,left_val:0.4280124902725220},{features:[[6,18,2,2,-1.],[7,18,1,2,2.]],threshold:1.5099150004971307e-005,right_val:0.5404760241508484,left_val:0.4044871926307678},{features:[[11,3,6,2,-1.],[11,4,6,1,2.]],threshold:-6.0817901976406574e-004,right_val:0.5503466129302979,left_val:0.4271768927574158},{features:[[2,0,16,6,-1.],[2,2,16,2,3.]],threshold:3.3224520739167929e-003,right_val:0.5369734764099121,left_val:0.3962723910808563},{features:[[11,3,6,2,-1.],[11,4,6,1,2.]],threshold:-1.1037490330636501e-003,right_val:0.5237749814987183,left_val:0.4727177917957306},{features:[[4,11,10,3,-1.],[4,12,10,1,3.]],threshold:-1.4350269921123981e-003,right_val:0.4223509132862091,left_val:0.5603008270263672},{features:[[11,3,6,2,-1.],[11,4,6,1,2.]],threshold:2.0767399109899998e-003,right_val:0.4732725918292999,left_val:0.5225917100906372},{features:[[3,3,6,2,-1.],[3,4,6,1,2.]],threshold:-1.6412809782195836e-004,right_val:0.5432739853858948,left_val:0.3999075889587402},{features:[[16,0,4,7,-1.],[16,0,2,7,2.]],threshold:8.8302437216043472e-003,right_val:0.6027327179908752,left_val:0.4678385853767395},{features:[[0,14,9,6,-1.],[0,16,9,2,3.]],threshold:-0.0105520701035857,right_val:0.5213974714279175,left_val:0.3493967056274414},{features:[[9,16,3,3,-1.],[9,17,3,1,3.]],threshold:-2.2731600329279900e-003,right_val:0.4749062955379486,left_val:0.6185818910598755},{features:[[4,6,6,2,-1.],[6,6,2,2,3.]],threshold:-8.4786332445219159e-004,right_val:0.3843482136726379,left_val:0.5285341143608093},{features:[[15,11,1,3,-1.],[15,12,1,1,3.]],threshold:1.2081359745934606e-003,right_val:0.3447335958480835,left_val:0.5360640883445740},{features:[[5,5,2,3,-1.],[5,6,2,1,3.]],threshold:2.6512730401009321e-003,right_val:0.6193962097167969,left_val:0.4558292031288147},{features:[[10,9,2,2,-1.],[10,10,2,1,2.]],threshold:-1.1012479662895203e-003,right_val:0.5327628254890442,left_val:0.3680230081081390},{features:[[3,1,4,3,-1.],[5,1,2,3,2.]],threshold:4.9561518244445324e-004,right_val:0.5274940729141235,left_val:0.3960595130920410},{features:[[16,0,4,7,-1.],[16,0,2,7,2.]],threshold:-0.0439017713069916,right_val:0.4992839097976685,left_val:0.7020444869995117},{features:[[0,0,20,1,-1.],[10,0,10,1,2.]],threshold:0.0346903502941132,right_val:0.2766602933406830,left_val:0.5049164295196533},{features:[[15,11,1,3,-1.],[15,12,1,1,3.]],threshold:-2.7442190330475569e-003,right_val:0.5274971127510071,left_val:0.2672632932662964},{features:[[0,4,3,4,-1.],[1,4,1,4,3.]],threshold:3.3316588960587978e-003,right_val:0.6001101732254028,left_val:0.4579482972621918},{features:[[16,3,3,6,-1.],[16,5,3,2,3.]],threshold:-0.0200445707887411,right_val:0.5235717892646790,left_val:0.3171594142913818},{features:[[1,3,3,6,-1.],[1,5,3,2,3.]],threshold:1.3492030557245016e-003,right_val:0.4034324884414673,left_val:0.5265362858772278},{features:[[6,2,12,6,-1.],[12,2,6,3,2.],[6,5,6,3,2.]],threshold:2.9702018946409225e-003,right_val:0.4571984112262726,left_val:0.5332456827163696},{features:[[8,10,4,3,-1.],[8,11,4,1,3.]],threshold:6.3039981760084629e-003,right_val:0.6034635901451111,left_val:0.4593310952186585},{features:[[4,2,14,6,-1.],[11,2,7,3,2.],[4,5,7,3,2.]],threshold:-0.0129365902394056,right_val:0.5372971296310425,left_val:0.4437963962554932},{features:[[9,11,2,3,-1.],[9,12,2,1,3.]],threshold:4.0148729458451271e-003,right_val:0.6437833905220032,left_val:0.4680323898792267},{features:[[15,13,2,3,-1.],[15,14,2,1,3.]],threshold:-2.6401679497212172e-003,right_val:0.5314332842826843,left_val:0.3709631860256195},{features:[[8,12,4,3,-1.],[8,13,4,1,3.]],threshold:0.0139184398576617,right_val:0.7130808830261231,left_val:0.4723555147647858},{features:[[15,11,1,3,-1.],[15,12,1,1,3.]],threshold:-4.5087869511917233e-004,right_val:0.5370404124259949,left_val:0.4492394030094147},{features:[[7,13,5,2,-1.],[7,14,5,1,2.]],threshold:2.5384349282830954e-004,right_val:0.5514402985572815,left_val:0.4406864047050476},{features:[[7,12,6,3,-1.],[7,13,6,1,3.]],threshold:2.2710000630468130e-003,right_val:0.5967984199523926,left_val:0.4682416915893555},{features:[[5,11,4,4,-1.],[5,13,4,2,2.]],threshold:2.4120779708027840e-003,right_val:0.3018598854541779,left_val:0.5079392194747925},{features:[[11,4,3,3,-1.],[12,4,1,3,3.]],threshold:-3.6025670851813629e-005,right_val:0.4471096992492676,left_val:0.5601037144660950},{features:[[6,4,3,3,-1.],[7,4,1,3,3.]],threshold:-7.4905529618263245e-003,right_val:0.4989944100379944,left_val:0.2207535058259964},{features:[[16,5,3,6,-1.],[17,5,1,6,3.]],threshold:-0.0175131205469370,right_val:0.5017648935317993,left_val:0.6531215906143189},{features:[[3,6,12,7,-1.],[7,6,4,7,3.]],threshold:0.1428163051605225,right_val:0.1482062041759491,left_val:0.4967963099479675},{features:[[16,5,3,6,-1.],[17,5,1,6,3.]],threshold:5.5345268920063972e-003,right_val:0.5954223871231079,left_val:0.4898946881294251},{features:[[3,13,2,3,-1.],[3,14,2,1,3.]],threshold:-9.6323591424152255e-004,right_val:0.5196074247360230,left_val:0.3927116990089417},{features:[[16,5,3,6,-1.],[17,5,1,6,3.]],threshold:-2.0370010752230883e-003,right_val:0.4884858131408691,left_val:0.5613325238227844},{features:[[1,5,3,6,-1.],[2,5,1,6,3.]],threshold:1.6614829655736685e-003,right_val:0.5578880906105042,left_val:0.4472880065441132},{features:[[1,9,18,1,-1.],[7,9,6,1,3.]],threshold:-3.1188090797513723e-003,right_val:0.5397477746009827,left_val:0.3840532898902893},{features:[[0,9,8,7,-1.],[4,9,4,7,2.]],threshold:-6.4000617712736130e-003,right_val:0.4533218145370483,left_val:0.5843983888626099},{features:[[12,11,8,2,-1.],[12,12,8,1,2.]],threshold:3.1319601112045348e-004,right_val:0.4234727919101715,left_val:0.5439221858978272},{features:[[0,11,8,2,-1.],[0,12,8,1,2.]],threshold:-0.0182220991700888,right_val:0.4958404898643494,left_val:0.1288464963436127},{features:[[9,13,2,3,-1.],[9,14,2,1,3.]],threshold:8.7969247251749039e-003,right_val:0.7153480052947998,left_val:0.4951297938823700},{features:[[4,10,12,4,-1.],[4,10,6,2,2.],[10,12,6,2,2.]],threshold:-4.2395070195198059e-003,right_val:0.5194936990737915,left_val:0.3946599960327148},{features:[[9,3,3,7,-1.],[10,3,1,7,3.]],threshold:9.7086271271109581e-003,right_val:0.6064900159835815,left_val:0.4897503852844238},{features:[[7,2,3,5,-1.],[8,2,1,5,3.]],threshold:-3.9934171363711357e-003,right_val:0.5060828924179077,left_val:0.3245440125465393},{features:[[9,12,4,6,-1.],[11,12,2,3,2.],[9,15,2,3,2.]],threshold:-0.0167850591242313,right_val:0.5203778743743897,left_val:0.1581953018903732},{features:[[8,7,3,6,-1.],[9,7,1,6,3.]],threshold:0.0182720907032490,right_val:0.6626979112625122,left_val:0.4680935144424439},{features:[[15,4,4,2,-1.],[15,5,4,1,2.]],threshold:5.6872838176786900e-003,right_val:0.3512184917926788,left_val:0.5211697816848755},{features:[[8,7,3,3,-1.],[9,7,1,3,3.]],threshold:-1.0739039862528443e-003,right_val:0.4529845118522644,left_val:0.5768386125564575},{features:[[14,2,6,4,-1.],[14,4,6,2,2.]],threshold:-3.7093870341777802e-003,right_val:0.5313581228256226,left_val:0.4507763087749481},{features:[[7,16,6,1,-1.],[9,16,2,1,3.]],threshold:-2.1110709349159151e-004,right_val:0.4333376884460449,left_val:0.5460820198059082},{features:[[15,13,2,3,-1.],[15,14,2,1,3.]],threshold:1.0670139454305172e-003,right_val:0.4078390896320343,left_val:0.5371856093406677},{features:[[8,7,3,10,-1.],[9,7,1,10,3.]],threshold:3.5943021066486835e-003,right_val:0.5643836259841919,left_val:0.4471287131309509},{features:[[11,10,2,6,-1.],[11,12,2,2,3.]],threshold:-5.1776031032204628e-003,right_val:0.5280330181121826,left_val:0.4499393105506897},{features:[[6,10,4,1,-1.],[8,10,2,1,2.]],threshold:-2.5414369883947074e-004,right_val:0.4407708048820496,left_val:0.5516173243522644},{features:[[10,9,2,2,-1.],[10,10,2,1,2.]],threshold:6.3522560521960258e-003,right_val:0.2465227991342545,left_val:0.5194190144538879},{features:[[8,9,2,2,-1.],[8,10,2,1,2.]],threshold:-4.4205080484971404e-004,right_val:0.5139682292938232,left_val:0.3830705881118774},{features:[[12,7,2,2,-1.],[13,7,1,1,2.],[12,8,1,1,2.]],threshold:7.4488727841526270e-004,right_val:0.5974786877632141,left_val:0.4891090989112854},{features:[[5,7,2,2,-1.],[5,7,1,1,2.],[6,8,1,1,2.]],threshold:-3.5116379149258137e-003,right_val:0.4768764972686768,left_val:0.7413681745529175},{features:[[13,0,3,14,-1.],[14,0,1,14,3.]],threshold:-0.0125409103929996,right_val:0.5252826809883118,left_val:0.3648819029331207},{features:[[4,0,3,14,-1.],[5,0,1,14,3.]],threshold:9.4931852072477341e-003,right_val:0.3629586994647980,left_val:0.5100492835044861},{features:[[13,4,3,14,-1.],[14,4,1,14,3.]],threshold:0.0129611501470208,right_val:0.4333561062812805,left_val:0.5232442021369934},{features:[[9,14,2,3,-1.],[9,15,2,1,3.]],threshold:4.7209449112415314e-003,right_val:0.6331052780151367,left_val:0.4648149013519287},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:-2.3119079414755106e-003,right_val:0.4531058073043823,left_val:0.5930309891700745},{features:[[4,2,3,16,-1.],[5,2,1,16,3.]],threshold:-2.8262299019843340e-003,right_val:0.5257101058959961,left_val:0.3870477974414825},{features:[[7,2,8,10,-1.],[7,7,8,5,2.]],threshold:-1.4311339473351836e-003,right_val:0.4561854898929596,left_val:0.5522503256797791},{features:[[6,14,7,3,-1.],[6,15,7,1,3.]],threshold:1.9378310535103083e-003,right_val:0.5736966729164124,left_val:0.4546220898628235},{features:[[9,2,10,12,-1.],[14,2,5,6,2.],[9,8,5,6,2.]],threshold:2.6343559147790074e-004,right_val:0.4571875035762787,left_val:0.5345739126205444},{features:[[6,7,8,2,-1.],[6,8,8,1,2.]],threshold:7.8257522545754910e-004,right_val:0.5220187902450562,left_val:0.3967815935611725},{features:[[8,13,4,6,-1.],[8,16,4,3,2.]],threshold:-0.0195504408329725,right_val:0.5243508219718933,left_val:0.2829642891883850},{features:[[6,6,1,3,-1.],[6,7,1,1,3.]],threshold:4.3914958951063454e-004,right_val:0.5899090170860291,left_val:0.4590066969394684},{features:[[16,2,4,6,-1.],[16,4,4,2,3.]],threshold:0.0214520003646612,right_val:0.2855378985404968,left_val:0.5231410861015320},{features:[[6,6,4,2,-1.],[6,6,2,1,2.],[8,7,2,1,2.]],threshold:5.8973580598831177e-004,right_val:0.5506421923637390,left_val:0.4397256970405579},{features:[[16,2,4,6,-1.],[16,4,4,2,3.]],threshold:-0.0261576101183891,right_val:0.5189175009727478,left_val:0.3135079145431519},{features:[[0,2,4,6,-1.],[0,4,4,2,3.]],threshold:-0.0139598604291677,right_val:0.5040717720985413,left_val:0.3213272988796234},{features:[[9,6,2,6,-1.],[9,6,1,6,2.]],threshold:-6.3699018210172653e-003,right_val:0.4849506914615631,left_val:0.6387544870376587},{features:[[3,4,6,10,-1.],[3,9,6,5,2.]],threshold:-8.5613820701837540e-003,right_val:0.5032019019126892,left_val:0.2759132087230682},{features:[[9,5,2,6,-1.],[9,5,1,6,2.]],threshold:9.6622901037335396e-004,right_val:0.5834879279136658,left_val:0.4685640931129456},{features:[[3,13,2,3,-1.],[3,14,2,1,3.]],threshold:7.6550268568098545e-004,right_val:0.3896422088146210,left_val:0.5175207257270813},{features:[[13,13,3,2,-1.],[13,14,3,1,2.]],threshold:-8.1833340227603912e-003,right_val:0.5208122134208679,left_val:0.2069136947393417},{features:[[2,16,10,4,-1.],[2,16,5,2,2.],[7,18,5,2,2.]],threshold:-9.3976939097046852e-003,right_val:0.4641222953796387,left_val:0.6134091019630432},{features:[[5,6,10,6,-1.],[10,6,5,3,2.],[5,9,5,3,2.]],threshold:4.8028980381786823e-003,right_val:0.4395219981670380,left_val:0.5454108119010925},{features:[[7,14,1,3,-1.],[7,15,1,1,3.]],threshold:-3.5680569708347321e-003,right_val:0.4681093990802765,left_val:0.6344485282897949},{features:[[14,16,6,3,-1.],[14,17,6,1,3.]],threshold:4.0733120404183865e-003,right_val:0.4015620052814484,left_val:0.5292683243751526},{features:[[5,4,3,3,-1.],[5,5,3,1,3.]],threshold:1.2568129459396005e-003,right_val:0.5452824831008911,left_val:0.4392988085746765},{features:[[7,4,10,3,-1.],[7,5,10,1,3.]],threshold:-2.9065010603517294e-003,right_val:0.4863379895687103,left_val:0.5898832082748413},{features:[[0,4,5,4,-1.],[0,6,5,2,2.]],threshold:-2.4409340694546700e-003,right_val:0.5247421860694885,left_val:0.4069364964962006},{features:[[13,11,3,9,-1.],[13,14,3,3,3.]],threshold:0.0248307008296251,right_val:0.3682524859905243,left_val:0.5182725787162781},{features:[[4,11,3,9,-1.],[4,14,3,3,3.]],threshold:-0.0488540083169937,right_val:0.4961281120777130,left_val:0.1307577937841415},{features:[[9,7,2,1,-1.],[9,7,1,1,2.]],threshold:-1.6110379947349429e-003,right_val:0.4872662127017975,left_val:0.6421005725860596},{features:[[5,0,6,17,-1.],[7,0,2,17,3.]],threshold:-0.0970094799995422,right_val:0.4950988888740540,left_val:0.0477693490684032},{features:[[10,3,6,3,-1.],[10,3,3,3,2.]],threshold:1.1209240183234215e-003,right_val:0.5354745984077454,left_val:0.4616267085075378},{features:[[2,2,15,4,-1.],[7,2,5,4,3.]],threshold:-1.3064090162515640e-003,right_val:0.4638805985450745,left_val:0.6261854171752930},{features:[[8,2,8,2,-1.],[12,2,4,1,2.],[8,3,4,1,2.]],threshold:4.5771620352752507e-004,right_val:0.4646640121936798,left_val:0.5384417772293091},{features:[[8,1,3,6,-1.],[8,3,3,2,3.]],threshold:-6.3149951165542006e-004,right_val:0.5130257010459900,left_val:0.3804047107696533},{features:[[9,17,2,2,-1.],[9,18,2,1,2.]],threshold:1.4505970466416329e-004,right_val:0.5664461851119995,left_val:0.4554310142993927},{features:[[0,0,2,14,-1.],[1,0,1,14,2.]],threshold:-0.0164745505899191,right_val:0.4715859889984131,left_val:0.6596958041191101},{features:[[12,0,7,3,-1.],[12,1,7,1,3.]],threshold:0.0133695797994733,right_val:0.3035964965820313,left_val:0.5195466279983521},{features:[[1,14,1,2,-1.],[1,15,1,1,2.]],threshold:1.0271780047332868e-004,right_val:0.4107066094875336,left_val:0.5229176282882690},{features:[[14,12,2,8,-1.],[15,12,1,4,2.],[14,16,1,4,2.]],threshold:-5.5311559699475765e-003,right_val:0.4960907101631165,left_val:0.6352887749671936},{features:[[1,0,7,3,-1.],[1,1,7,1,3.]],threshold:-2.6187049224972725e-003,right_val:0.5140984058380127,left_val:0.3824546039104462},{features:[[14,12,2,8,-1.],[15,12,1,4,2.],[14,16,1,4,2.]],threshold:5.0834268331527710e-003,right_val:0.6220818758010864,left_val:0.4950439929962158},{features:[[6,0,8,12,-1.],[6,0,4,6,2.],[10,6,4,6,2.]],threshold:0.0798181593418121,right_val:0.1322475969791412,left_val:0.4952335953712463},{features:[[6,1,8,9,-1.],[6,4,8,3,3.]],threshold:-0.0992265865206718,right_val:0.5008416771888733,left_val:0.7542728781700134},{features:[[5,2,2,2,-1.],[5,3,2,1,2.]],threshold:-6.5174017800018191e-004,right_val:0.5130121111869812,left_val:0.3699302971363068},{features:[[13,14,6,6,-1.],[16,14,3,3,2.],[13,17,3,3,2.]],threshold:-0.0189968496561050,right_val:0.4921202957630158,left_val:0.6689178943634033},{features:[[0,17,20,2,-1.],[0,17,10,1,2.],[10,18,10,1,2.]],threshold:0.0173468999564648,right_val:0.1859198063611984,left_val:0.4983300864696503},{features:[[10,3,2,6,-1.],[11,3,1,3,2.],[10,6,1,3,2.]],threshold:5.5082101607695222e-004,right_val:0.5522121787071228,left_val:0.4574424028396606},{features:[[5,12,6,2,-1.],[8,12,3,2,2.]],threshold:2.0056050270795822e-003,right_val:0.3856469988822937,left_val:0.5131744742393494},{features:[[10,7,6,13,-1.],[10,7,3,13,2.]],threshold:-7.7688191086053848e-003,right_val:0.5434309244155884,left_val:0.4361700117588043},{features:[[5,15,10,5,-1.],[10,15,5,5,2.]],threshold:0.0508782789111137,right_val:0.6840639710426331,left_val:0.4682720899581909},{features:[[10,4,4,10,-1.],[10,4,2,10,2.]],threshold:-2.2901780903339386e-003,right_val:0.5306099057197571,left_val:0.4329245090484619},{features:[[5,7,2,1,-1.],[6,7,1,1,2.]],threshold:-1.5715380141045898e-004,right_val:0.4378164112567902,left_val:0.5370057225227356},{features:[[10,3,6,7,-1.],[10,3,3,7,2.]],threshold:0.1051924005150795,right_val:0.0673614665865898,left_val:0.5137274265289307},{features:[[4,3,6,7,-1.],[7,3,3,7,2.]],threshold:2.7198919560760260e-003,right_val:0.5255665183067322,left_val:0.4112060964107513},{features:[[1,7,18,5,-1.],[7,7,6,5,3.]],threshold:0.0483377799391747,right_val:0.4438967108726502,left_val:0.5404623746871948},{features:[[3,17,4,3,-1.],[5,17,2,3,2.]],threshold:9.5703761326149106e-004,right_val:0.5399510860443115,left_val:0.4355969130992889},{features:[[8,14,12,6,-1.],[14,14,6,3,2.],[8,17,6,3,2.]],threshold:-0.0253712590783834,right_val:0.5031024813652039,left_val:0.5995175242424011},{features:[[0,13,20,4,-1.],[0,13,10,2,2.],[10,15,10,2,2.]],threshold:0.0524579510092735,right_val:0.1398351043462753,left_val:0.4950287938117981},{features:[[4,5,14,2,-1.],[11,5,7,1,2.],[4,6,7,1,2.]],threshold:-0.0123656298965216,right_val:0.4964106082916260,left_val:0.6397299170494080},{features:[[1,2,10,12,-1.],[1,2,5,6,2.],[6,8,5,6,2.]],threshold:-0.1458971947431564,right_val:0.4946322143077850,left_val:0.1001669988036156},{features:[[6,1,14,3,-1.],[6,2,14,1,3.]],threshold:-0.0159086007624865,right_val:0.5208340883255005,left_val:0.3312329947948456},{features:[[8,16,2,3,-1.],[8,17,2,1,3.]],threshold:3.9486068999394774e-004,right_val:0.5426102876663208,left_val:0.4406363964080811},{features:[[9,17,3,2,-1.],[10,17,1,2,3.]],threshold:-5.2454001270234585e-003,right_val:0.5189967155456543,left_val:0.2799589931964874},{features:[[5,15,4,2,-1.],[5,15,2,1,2.],[7,16,2,1,2.]],threshold:-5.0421799533069134e-003,right_val:0.4752142131328583,left_val:0.6987580060958862},{features:[[10,15,1,3,-1.],[10,16,1,1,3.]],threshold:2.9812189750373363e-003,right_val:0.6307479739189148,left_val:0.4983288943767548},{features:[[8,16,4,4,-1.],[8,16,2,2,2.],[10,18,2,2,2.]],threshold:-7.2884308174252510e-003,right_val:0.5026869773864746,left_val:0.2982333004474640},{features:[[6,11,8,6,-1.],[6,14,8,3,2.]],threshold:1.5094350092113018e-003,right_val:0.3832970857620239,left_val:0.5308442115783691},{features:[[2,13,5,2,-1.],[2,14,5,1,2.]],threshold:-9.3340799212455750e-003,right_val:0.4969817101955414,left_val:0.2037964016199112},{features:[[13,14,6,6,-1.],[16,14,3,3,2.],[13,17,3,3,2.]],threshold:0.0286671407520771,right_val:0.6928027272224426,left_val:0.5025696754455566},{features:[[1,9,18,4,-1.],[7,9,6,4,3.]],threshold:0.1701968014240265,right_val:0.1476442962884903,left_val:0.4960052967071533},{features:[[13,14,6,6,-1.],[16,14,3,3,2.],[13,17,3,3,2.]],threshold:-3.2614478841423988e-003,right_val:0.4826056063175201,left_val:0.5603063702583313},{features:[[0,2,1,6,-1.],[0,4,1,2,3.]],threshold:5.5769277969375253e-004,right_val:0.4129633009433746,left_val:0.5205562114715576},{features:[[5,0,15,20,-1.],[5,10,15,10,2.]],threshold:0.3625833988189697,right_val:0.3768612146377564,left_val:0.5221652984619141},{features:[[1,14,6,6,-1.],[1,14,3,3,2.],[4,17,3,3,2.]],threshold:-0.0116151301190257,right_val:0.4637489914894104,left_val:0.6022682785987854},{features:[[8,14,4,6,-1.],[10,14,2,3,2.],[8,17,2,3,2.]],threshold:-4.0795197710394859e-003,right_val:0.5337479114532471,left_val:0.4070447087287903},{features:[[7,11,2,1,-1.],[8,11,1,1,2.]],threshold:5.7204300537705421e-004,right_val:0.5900393128395081,left_val:0.4601835012435913},{features:[[9,17,3,2,-1.],[10,17,1,2,3.]],threshold:6.7543348995968699e-004,right_val:0.4345428943634033,left_val:0.5398252010345459},{features:[[8,17,3,2,-1.],[9,17,1,2,3.]],threshold:6.3295697327703238e-004,right_val:0.4051358997821808,left_val:0.5201563239097595},{features:[[12,14,4,6,-1.],[14,14,2,3,2.],[12,17,2,3,2.]],threshold:1.2435320531949401e-003,right_val:0.5547441244125366,left_val:0.4642387926578522},{features:[[4,14,4,6,-1.],[4,14,2,3,2.],[6,17,2,3,2.]],threshold:-4.7363857738673687e-003,right_val:0.4672552049160004,left_val:0.6198567152023315},{features:[[13,14,2,6,-1.],[14,14,1,3,2.],[13,17,1,3,2.]],threshold:-6.4658462069928646e-003,right_val:0.5019000768661499,left_val:0.6837332844734192},{features:[[5,14,2,6,-1.],[5,14,1,3,2.],[6,17,1,3,2.]],threshold:3.5017321351915598e-004,right_val:0.5363622903823853,left_val:0.4344803094863892},{features:[[7,0,6,12,-1.],[7,4,6,4,3.]],threshold:1.5754920605104417e-004,right_val:0.5732020735740662,left_val:0.4760079085826874},{features:[[0,7,12,2,-1.],[4,7,4,2,3.]],threshold:9.9774366244673729e-003,right_val:0.3635039925575256,left_val:0.5090985894203186},{features:[[10,3,3,13,-1.],[11,3,1,13,3.]],threshold:-4.1464529931545258e-004,right_val:0.4593802094459534,left_val:0.5570064783096314},{features:[[7,3,3,13,-1.],[8,3,1,13,3.]],threshold:-3.5888899583369493e-004,right_val:0.4339134991168976,left_val:0.5356845855712891},{features:[[10,8,6,3,-1.],[10,9,6,1,3.]],threshold:4.0463250479660928e-004,right_val:0.5436776876449585,left_val:0.4439803063869476},{features:[[3,11,3,2,-1.],[4,11,1,2,3.]],threshold:-8.2184787606820464e-004,right_val:0.5176299214363098,left_val:0.4042294919490814},{features:[[13,12,6,8,-1.],[16,12,3,4,2.],[13,16,3,4,2.]],threshold:5.9467419050633907e-003,right_val:0.5633779764175415,left_val:0.4927651882171631},{features:[[7,6,6,5,-1.],[9,6,2,5,3.]],threshold:-0.0217533893883228,right_val:0.4800840914249420,left_val:0.8006293773651123},{features:[[17,11,2,7,-1.],[17,11,1,7,2.]],threshold:-0.0145403798669577,right_val:0.5182222723960877,left_val:0.3946054875850678},{features:[[3,13,8,2,-1.],[7,13,4,2,2.]],threshold:-0.0405107699334621,right_val:0.4935792982578278,left_val:0.0213249903172255},{features:[[6,9,8,3,-1.],[6,10,8,1,3.]],threshold:-5.8458268176764250e-004,right_val:0.5314025282859802,left_val:0.4012795984745026},{features:[[4,3,4,3,-1.],[4,4,4,1,3.]],threshold:5.5151800625026226e-003,right_val:0.5896260738372803,left_val:0.4642418920993805},{features:[[11,3,4,3,-1.],[11,4,4,1,3.]],threshold:-6.0626221820712090e-003,right_val:0.5016477704048157,left_val:0.6502159237861633},{features:[[1,4,17,12,-1.],[1,8,17,4,3.]],threshold:0.0945358425378799,right_val:0.4126827120780945,left_val:0.5264708995819092},{features:[[11,3,4,3,-1.],[11,4,4,1,3.]],threshold:4.7315051779150963e-003,right_val:0.5892447829246521,left_val:0.4879199862480164},{features:[[4,8,6,3,-1.],[4,9,6,1,3.]],threshold:-5.2571471314877272e-004,right_val:0.5189412832260132,left_val:0.3917280137538910},{features:[[12,3,5,3,-1.],[12,4,5,1,3.]],threshold:-2.5464049540460110e-003,right_val:0.4985705912113190,left_val:0.5837599039077759},{features:[[1,11,2,7,-1.],[2,11,1,7,2.]],threshold:-0.0260756891220808,right_val:0.4955821931362152,left_val:0.1261983960866928},{features:[[15,12,2,8,-1.],[16,12,1,4,2.],[15,16,1,4,2.]],threshold:-5.4779709316790104e-003,right_val:0.5010265707969666,left_val:0.5722513794898987},{features:[[4,8,11,3,-1.],[4,9,11,1,3.]],threshold:5.1337741315364838e-003,right_val:0.4226376116275787,left_val:0.5273262262344360},{features:[[9,13,6,2,-1.],[12,13,3,1,2.],[9,14,3,1,2.]],threshold:4.7944980906322598e-004,right_val:0.5819587111473084,left_val:0.4450066983699799},{features:[[6,13,4,3,-1.],[6,14,4,1,3.]],threshold:-2.1114079281687737e-003,right_val:0.4511714875698090,left_val:0.5757653117179871},{features:[[9,12,3,3,-1.],[10,12,1,3,3.]],threshold:-0.0131799904629588,right_val:0.5160734057426453,left_val:0.1884381026029587},{features:[[5,3,3,3,-1.],[5,4,3,1,3.]],threshold:-4.7968099825084209e-003,right_val:0.4736118912696838,left_val:0.6589789986610413},{features:[[9,4,2,3,-1.],[9,5,2,1,3.]],threshold:6.7483168095350266e-003,right_val:0.3356395065784454,left_val:0.5259429812431335},{features:[[0,2,16,3,-1.],[0,3,16,1,3.]],threshold:1.4623369788751006e-003,right_val:0.4264092147350311,left_val:0.5355271100997925},{features:[[15,12,2,8,-1.],[16,12,1,4,2.],[15,16,1,4,2.]],threshold:4.7645159065723419e-003,right_val:0.5786827802658081,left_val:0.5034406781196594},{features:[[3,12,2,8,-1.],[3,12,1,4,2.],[4,16,1,4,2.]],threshold:6.8066660314798355e-003,right_val:0.6677829027175903,left_val:0.4756605029106140},{features:[[14,13,3,6,-1.],[14,15,3,2,3.]],threshold:3.6608621012419462e-003,right_val:0.4311546981334686,left_val:0.5369611978530884},{features:[[3,13,3,6,-1.],[3,15,3,2,3.]],threshold:0.0214496403932571,right_val:0.1888816058635712,left_val:0.4968641996383667},{features:[[6,5,10,2,-1.],[11,5,5,1,2.],[6,6,5,1,2.]],threshold:4.1678901761770248e-003,right_val:0.5815368890762329,left_val:0.4930733144283295},{features:[[2,14,14,6,-1.],[2,17,14,3,2.]],threshold:8.6467564105987549e-003,right_val:0.4132595062255859,left_val:0.5205205082893372},{features:[[10,14,1,3,-1.],[10,15,1,1,3.]],threshold:-3.6114078829996288e-004,right_val:0.4800927937030792,left_val:0.5483555197715759},{features:[[4,16,2,2,-1.],[4,16,1,1,2.],[5,17,1,1,2.]],threshold:1.0808729566633701e-003,right_val:0.6041421294212341,left_val:0.4689902067184448},{features:[[10,6,2,3,-1.],[10,7,2,1,3.]],threshold:5.7719959877431393e-003,right_val:0.3053277134895325,left_val:0.5171142220497131},{features:[[0,17,20,2,-1.],[0,17,10,1,2.],[10,18,10,1,2.]],threshold:1.5720770461484790e-003,right_val:0.4178803861141205,left_val:0.5219978094100952},{features:[[13,6,1,3,-1.],[13,7,1,1,3.]],threshold:-1.9307859474793077e-003,right_val:0.4812920093536377,left_val:0.5860369801521301},{features:[[8,13,3,2,-1.],[9,13,1,2,3.]],threshold:-7.8926272690296173e-003,right_val:0.4971733987331390,left_val:0.1749276965856552},{features:[[12,2,3,3,-1.],[13,2,1,3,3.]],threshold:-2.2224679123610258e-003,right_val:0.5212848186492920,left_val:0.4342589080333710},{features:[[3,18,2,2,-1.],[3,18,1,1,2.],[4,19,1,1,2.]],threshold:1.9011989934369922e-003,right_val:0.6892055273056030,left_val:0.4765186905860901},{features:[[9,16,3,4,-1.],[10,16,1,4,3.]],threshold:2.7576119173318148e-003,right_val:0.4337486028671265,left_val:0.5262191295623779},{features:[[6,6,1,3,-1.],[6,7,1,1,3.]],threshold:5.1787449046969414e-003,right_val:0.7843729257583618,left_val:0.4804069101810455},{features:[[13,1,5,2,-1.],[13,2,5,1,2.]],threshold:-9.0273341629654169e-004,right_val:0.5353423953056335,left_val:0.4120846986770630},{features:[[7,14,6,2,-1.],[7,14,3,1,2.],[10,15,3,1,2.]],threshold:5.1797959022223949e-003,right_val:0.6425960063934326,left_val:0.4740372896194458},{features:[[11,3,3,4,-1.],[12,3,1,4,3.]],threshold:-0.0101140001788735,right_val:0.5175017714500427,left_val:0.2468792051076889},{features:[[1,13,12,6,-1.],[5,13,4,6,3.]],threshold:-0.0186170600354671,right_val:0.4628978967666626,left_val:0.5756294131278992},{features:[[14,11,5,2,-1.],[14,12,5,1,2.]],threshold:5.9225959703326225e-003,right_val:0.3214271068572998,left_val:0.5169625878334045},{features:[[2,15,14,4,-1.],[2,15,7,2,2.],[9,17,7,2,2.]],threshold:-6.2945079989731312e-003,right_val:0.5141636729240418,left_val:0.3872014880180359},{features:[[3,7,14,2,-1.],[10,7,7,1,2.],[3,8,7,1,2.]],threshold:6.5353019163012505e-003,right_val:0.6310489773750305,left_val:0.4853048920631409},{features:[[1,11,4,2,-1.],[1,12,4,1,2.]],threshold:1.0878399480134249e-003,right_val:0.3723258972167969,left_val:0.5117315053939819},{features:[[14,0,6,14,-1.],[16,0,2,14,3.]],threshold:-0.0225422400981188,right_val:0.4887112975120544,left_val:0.5692740082740784},{features:[[4,11,1,3,-1.],[4,12,1,1,3.]],threshold:-3.0065660830587149e-003,right_val:0.5003992915153503,left_val:0.2556012868881226},{features:[[14,0,6,14,-1.],[16,0,2,14,3.]],threshold:7.4741272255778313e-003,right_val:0.5675926804542542,left_val:0.4810872972011566},{features:[[1,10,3,7,-1.],[2,10,1,7,3.]],threshold:0.0261623207479715,right_val:0.1777237057685852,left_val:0.4971194863319397},{features:[[8,12,9,2,-1.],[8,13,9,1,2.]],threshold:9.4352738233283162e-004,right_val:0.5491250753402710,left_val:0.4940010905265808},{features:[[0,6,20,1,-1.],[10,6,10,1,2.]],threshold:0.0333632417023182,right_val:0.2790724039077759,left_val:0.5007612109184265},{features:[[8,4,4,4,-1.],[8,4,2,4,2.]],threshold:-0.0151186501607299,right_val:0.4973031878471375,left_val:0.7059578895568848},{features:[[0,0,2,2,-1.],[0,1,2,1,2.]],threshold:9.8648946732282639e-004,right_val:0.3776761889457703,left_val:0.5128620266914368}],threshold:104.7491989135742200},{simpleClassifiers:[{features:[[5,3,10,9,-1.],[5,6,10,3,3.]],threshold:-0.0951507985591888,right_val:0.4017286896705627,left_val:0.6470757126808167},{features:[[15,2,4,10,-1.],[15,2,2,10,2.]],threshold:6.2702340073883533e-003,right_val:0.5746449232101440,left_val:0.3999822139739990},{features:[[8,2,2,7,-1.],[9,2,1,7,2.]],threshold:3.0018089455552399e-004,right_val:0.5538809895515442,left_val:0.3558770120143890},{features:[[7,4,12,1,-1.],[11,4,4,1,3.]],threshold:1.1757409665733576e-003,right_val:0.5382617712020874,left_val:0.4256534874439240},{features:[[3,4,9,1,-1.],[6,4,3,1,3.]],threshold:4.4235268433112651e-005,right_val:0.5589926838874817,left_val:0.3682908117771149},{features:[[15,10,1,4,-1.],[15,12,1,2,2.]],threshold:-2.9936920327600092e-005,right_val:0.4020367860794067,left_val:0.5452470183372498},{features:[[4,10,6,4,-1.],[7,10,3,4,2.]],threshold:3.0073199886828661e-003,right_val:0.3317843973636627,left_val:0.5239058136940002},{features:[[15,9,1,6,-1.],[15,12,1,3,2.]],threshold:-0.0105138896033168,right_val:0.5307983756065369,left_val:0.4320689141750336},{features:[[7,17,6,3,-1.],[7,18,6,1,3.]],threshold:8.3476826548576355e-003,right_val:0.6453298926353455,left_val:0.4504637122154236},{features:[[14,3,2,16,-1.],[15,3,1,8,2.],[14,11,1,8,2.]],threshold:-3.1492270063608885e-003,right_val:0.5370525121688843,left_val:0.4313425123691559},{features:[[4,9,1,6,-1.],[4,12,1,3,2.]],threshold:-1.4435649973165710e-005,right_val:0.3817971944808960,left_val:0.5326603055000305},{features:[[12,1,5,2,-1.],[12,2,5,1,2.]],threshold:-4.2855090578086674e-004,right_val:0.5382009744644165,left_val:0.4305163919925690},{features:[[6,18,4,2,-1.],[6,18,2,1,2.],[8,19,2,1,2.]],threshold:1.5062429883982986e-004,right_val:0.5544965267181397,left_val:0.4235970973968506},{features:[[2,4,16,10,-1.],[10,4,8,5,2.],[2,9,8,5,2.]],threshold:0.0715598315000534,right_val:0.2678802907466888,left_val:0.5303059816360474},{features:[[6,5,1,10,-1.],[6,10,1,5,2.]],threshold:8.4095180500298738e-004,right_val:0.5205433964729309,left_val:0.3557108938694000},{features:[[4,8,15,2,-1.],[9,8,5,2,3.]],threshold:0.0629865005612373,right_val:0.2861376106739044,left_val:0.5225362777709961},{features:[[1,8,15,2,-1.],[6,8,5,2,3.]],threshold:-3.3798629883676767e-003,right_val:0.5201697945594788,left_val:0.3624185919761658},{features:[[9,5,3,6,-1.],[9,7,3,2,3.]],threshold:-1.1810739670181647e-004,right_val:0.3959893882274628,left_val:0.5474476814270020},{features:[[5,7,8,2,-1.],[9,7,4,2,2.]],threshold:-5.4505601292476058e-004,right_val:0.5215715765953064,left_val:0.3740422129631043},{features:[[9,11,2,3,-1.],[9,12,2,1,3.]],threshold:-1.8454910023137927e-003,right_val:0.4584448933601379,left_val:0.5893052220344544},{features:[[1,0,16,3,-1.],[1,1,16,1,3.]],threshold:-4.3832371011376381e-004,right_val:0.5385351181030273,left_val:0.4084582030773163},{features:[[11,2,7,2,-1.],[11,3,7,1,2.]],threshold:-2.4000830017030239e-003,right_val:0.5293580293655396,left_val:0.3777455091476440},{features:[[5,1,10,18,-1.],[5,7,10,6,3.]],threshold:-0.0987957417964935,right_val:0.5070089101791382,left_val:0.2963612079620361},{features:[[17,4,3,2,-1.],[18,4,1,2,3.]],threshold:3.1798239797353745e-003,right_val:0.6726443767547607,left_val:0.4877632856369019},{features:[[8,13,1,3,-1.],[8,14,1,1,3.]],threshold:3.2406419632025063e-004,right_val:0.5561109781265259,left_val:0.4366911053657532},{features:[[3,14,14,6,-1.],[3,16,14,2,3.]],threshold:-0.0325472503900528,right_val:0.5308616161346436,left_val:0.3128157854080200},{features:[[0,2,3,4,-1.],[1,2,1,4,3.]],threshold:-7.7561130747199059e-003,right_val:0.4639872014522553,left_val:0.6560224890708923},{features:[[12,1,5,2,-1.],[12,2,5,1,2.]],threshold:0.0160272493958473,right_val:0.3141897916793823,left_val:0.5172680020332336},{features:[[3,1,5,2,-1.],[3,2,5,1,2.]],threshold:7.1002350523485802e-006,right_val:0.5336294770240784,left_val:0.4084446132183075},{features:[[10,13,2,3,-1.],[10,14,2,1,3.]],threshold:7.3422808200120926e-003,right_val:0.6603465080261231,left_val:0.4966922104358673},{features:[[8,13,2,3,-1.],[8,14,2,1,3.]],threshold:-1.6970280557870865e-003,right_val:0.4500182867050171,left_val:0.5908237099647522},{features:[[14,12,2,3,-1.],[14,13,2,1,3.]],threshold:2.4118260480463505e-003,right_val:0.3599720895290375,left_val:0.5315160751342773},{features:[[7,2,2,3,-1.],[7,3,2,1,3.]],threshold:-5.5300937965512276e-003,right_val:0.4996814131736755,left_val:0.2334040999412537},{features:[[5,6,10,4,-1.],[10,6,5,2,2.],[5,8,5,2,2.]],threshold:-2.6478730142116547e-003,right_val:0.4684734046459198,left_val:0.5880935788154602},{features:[[9,13,1,6,-1.],[9,16,1,3,2.]],threshold:0.0112956296652555,right_val:0.1884590983390808,left_val:0.4983777105808258},{features:[[10,12,2,2,-1.],[11,12,1,1,2.],[10,13,1,1,2.]],threshold:-6.6952878842130303e-004,right_val:0.4799019992351532,left_val:0.5872138142585754},{features:[[4,12,2,3,-1.],[4,13,2,1,3.]],threshold:1.4410680159926414e-003,right_val:0.3501011133193970,left_val:0.5131189227104187},{features:[[14,4,6,6,-1.],[14,6,6,2,3.]],threshold:2.4637870956212282e-003,right_val:0.4117639064788818,left_val:0.5339372158050537},{features:[[8,17,2,3,-1.],[8,18,2,1,3.]],threshold:3.3114518737420440e-004,right_val:0.5398246049880981,left_val:0.4313383102416992},{features:[[16,4,4,6,-1.],[16,6,4,2,3.]],threshold:-0.0335572697222233,right_val:0.5179154872894287,left_val:0.2675336897373200},{features:[[0,4,4,6,-1.],[0,6,4,2,3.]],threshold:0.0185394193977118,right_val:0.2317177057266235,left_val:0.4973869919776917},{features:[[14,6,2,3,-1.],[14,6,1,3,2.]],threshold:-2.9698139405809343e-004,right_val:0.4643664062023163,left_val:0.5529708266258240},{features:[[4,9,8,1,-1.],[8,9,4,1,2.]],threshold:-4.5577259152196348e-004,right_val:0.4469191133975983,left_val:0.5629584193229675},{features:[[8,12,4,3,-1.],[8,13,4,1,3.]],threshold:-0.0101589802652597,right_val:0.4925918877124786,left_val:0.6706212759017944},{features:[[5,12,10,6,-1.],[5,14,10,2,3.]],threshold:-2.2413829356082715e-005,right_val:0.3912901878356934,left_val:0.5239421725273132},{features:[[11,12,1,2,-1.],[11,13,1,1,2.]],threshold:7.2034963523037732e-005,right_val:0.5501788854598999,left_val:0.4799438118934631},{features:[[8,15,4,2,-1.],[8,16,4,1,2.]],threshold:-6.9267209619283676e-003,right_val:0.4698084890842438,left_val:0.6930009722709656},{features:[[6,9,8,8,-1.],[10,9,4,4,2.],[6,13,4,4,2.]],threshold:-7.6997838914394379e-003,right_val:0.5480883121490479,left_val:0.4099623858928680},{features:[[7,12,4,6,-1.],[7,12,2,3,2.],[9,15,2,3,2.]],threshold:-7.3130549862980843e-003,right_val:0.5057886242866516,left_val:0.3283475935459137},{features:[[10,11,3,1,-1.],[11,11,1,1,3.]],threshold:1.9650589674711227e-003,right_val:0.6398249864578247,left_val:0.4978047013282776},{features:[[9,7,2,10,-1.],[9,7,1,5,2.],[10,12,1,5,2.]],threshold:7.1647600270807743e-003,right_val:0.6222137212753296,left_val:0.4661160111427307},{features:[[8,0,6,6,-1.],[10,0,2,6,3.]],threshold:-0.0240786392241716,right_val:0.5222162008285523,left_val:0.2334644943475723},{features:[[3,11,2,6,-1.],[3,13,2,2,3.]],threshold:-0.0210279691964388,right_val:0.4938226044178009,left_val:0.1183653995394707},{features:[[16,12,1,2,-1.],[16,13,1,1,2.]],threshold:3.6017020465806127e-004,right_val:0.4116711020469666,left_val:0.5325019955635071},{features:[[1,14,6,6,-1.],[1,14,3,3,2.],[4,17,3,3,2.]],threshold:-0.0172197297215462,right_val:0.4664269089698792,left_val:0.6278762221336365},{features:[[13,1,3,6,-1.],[14,1,1,6,3.]],threshold:-7.8672142699360847e-003,right_val:0.5249736905097961,left_val:0.3403415083885193},{features:[[8,8,2,2,-1.],[8,9,2,1,2.]],threshold:-4.4777389848604798e-004,right_val:0.5086259245872498,left_val:0.3610411882400513},{features:[[9,9,3,3,-1.],[10,9,1,3,3.]],threshold:5.5486010387539864e-003,right_val:0.6203498244285584,left_val:0.4884265959262848},{features:[[8,7,3,3,-1.],[8,8,3,1,3.]],threshold:-6.9461148232221603e-003,right_val:0.5011097192764282,left_val:0.2625930011272430},{features:[[14,0,2,3,-1.],[14,0,1,3,2.]],threshold:1.3569870498031378e-004,right_val:0.5628312230110169,left_val:0.4340794980525971},{features:[[1,0,18,9,-1.],[7,0,6,9,3.]],threshold:-0.0458802506327629,right_val:0.4696274995803833,left_val:0.6507998704910278},{features:[[11,5,4,15,-1.],[11,5,2,15,2.]],threshold:-0.0215825606137514,right_val:0.5287616848945618,left_val:0.3826502859592438},{features:[[5,5,4,15,-1.],[7,5,2,15,2.]],threshold:-0.0202095396816731,right_val:0.5074477195739746,left_val:0.3233368098735809},{features:[[14,0,2,3,-1.],[14,0,1,3,2.]],threshold:5.8496710844337940e-003,right_val:0.4489670991897583,left_val:0.5177603960037231},{features:[[4,0,2,3,-1.],[5,0,1,3,2.]],threshold:-5.7476379879517481e-005,right_val:0.5246363878250122,left_val:0.4020850956439972},{features:[[11,12,2,2,-1.],[12,12,1,1,2.],[11,13,1,1,2.]],threshold:-1.1513100471347570e-003,right_val:0.4905154109001160,left_val:0.6315072178840637},{features:[[7,12,2,2,-1.],[7,12,1,1,2.],[8,13,1,1,2.]],threshold:1.9862831104546785e-003,right_val:0.6497151255607605,left_val:0.4702459871768951},{features:[[12,0,3,4,-1.],[13,0,1,4,3.]],threshold:-5.2719512023031712e-003,right_val:0.5227652788162231,left_val:0.3650383949279785},{features:[[4,11,3,3,-1.],[4,12,3,1,3.]],threshold:1.2662699446082115e-003,right_val:0.3877618014812470,left_val:0.5166100859642029},{features:[[12,7,4,2,-1.],[12,8,4,1,2.]],threshold:-6.2919440679252148e-003,right_val:0.5023847818374634,left_val:0.7375894188880920},{features:[[8,10,3,2,-1.],[9,10,1,2,3.]],threshold:6.7360111279413104e-004,right_val:0.5495585799217224,left_val:0.4423226118087769},{features:[[9,9,3,2,-1.],[10,9,1,2,3.]],threshold:-1.0523450328037143e-003,right_val:0.4859583079814911,left_val:0.5976396203041077},{features:[[8,9,3,2,-1.],[9,9,1,2,3.]],threshold:-4.4216238893568516e-004,right_val:0.4398930966854096,left_val:0.5955939292907715},{features:[[12,0,3,4,-1.],[13,0,1,4,3.]],threshold:1.1747940443456173e-003,right_val:0.4605058133602142,left_val:0.5349888205528259},{features:[[5,0,3,4,-1.],[6,0,1,4,3.]],threshold:5.2457437850534916e-003,right_val:0.2941577136516571,left_val:0.5049191117286682},{features:[[4,14,12,4,-1.],[10,14,6,2,2.],[4,16,6,2,2.]],threshold:-0.0245397202670574,right_val:0.5218586921691895,left_val:0.2550177872180939},{features:[[8,13,2,3,-1.],[8,14,2,1,3.]],threshold:7.3793041519820690e-004,right_val:0.5490816235542297,left_val:0.4424861073493958},{features:[[10,10,3,8,-1.],[10,14,3,4,2.]],threshold:1.4233799884095788e-003,right_val:0.4081355929374695,left_val:0.5319514274597168},{features:[[8,10,4,8,-1.],[8,10,2,4,2.],[10,14,2,4,2.]],threshold:-2.4149110540747643e-003,right_val:0.5238950252532959,left_val:0.4087659120559692},{features:[[10,8,3,1,-1.],[11,8,1,1,3.]],threshold:-1.2165299849584699e-003,right_val:0.4908052980899811,left_val:0.5674579143524170},{features:[[9,12,1,6,-1.],[9,15,1,3,2.]],threshold:-1.2438809499144554e-003,right_val:0.5256118178367615,left_val:0.4129425883293152},{features:[[10,8,3,1,-1.],[11,8,1,1,3.]],threshold:6.1942739412188530e-003,right_val:0.7313653230667114,left_val:0.5060194134712219},{features:[[7,8,3,1,-1.],[8,8,1,1,3.]],threshold:-1.6607169527560472e-003,right_val:0.4596369862556458,left_val:0.5979632139205933},{features:[[5,2,15,14,-1.],[5,9,15,7,2.]],threshold:-0.0273162592202425,right_val:0.5308842062950134,left_val:0.4174365103244782},{features:[[2,1,2,10,-1.],[2,1,1,5,2.],[3,6,1,5,2.]],threshold:-1.5845570014789701e-003,right_val:0.4519486129283905,left_val:0.5615804791450501},{features:[[14,14,2,3,-1.],[14,15,2,1,3.]],threshold:-1.5514739789068699e-003,right_val:0.5360785126686096,left_val:0.4076187014579773},{features:[[2,7,3,3,-1.],[3,7,1,3,3.]],threshold:3.8446558755822480e-004,right_val:0.5430442094802856,left_val:0.4347293972969055},{features:[[17,4,3,3,-1.],[17,5,3,1,3.]],threshold:-0.0146722598001361,right_val:0.5146093964576721,left_val:0.1659304946660996},{features:[[0,4,3,3,-1.],[0,5,3,1,3.]],threshold:8.1608882173895836e-003,right_val:0.1884745955467224,left_val:0.4961819052696228},{features:[[13,5,6,2,-1.],[16,5,3,1,2.],[13,6,3,1,2.]],threshold:1.1121659772470593e-003,right_val:0.6093816161155701,left_val:0.4868263900279999},{features:[[4,19,12,1,-1.],[8,19,4,1,3.]],threshold:-7.2603770531713963e-003,right_val:0.4690375924110413,left_val:0.6284325122833252},{features:[[12,12,2,4,-1.],[12,14,2,2,2.]],threshold:-2.4046430189628154e-004,right_val:0.4046044051647186,left_val:0.5575000047683716},{features:[[3,15,1,3,-1.],[3,16,1,1,3.]],threshold:-2.3348190006799996e-004,right_val:0.5252848267555237,left_val:0.4115762114524841},{features:[[11,16,6,4,-1.],[11,16,3,4,2.]],threshold:5.5736480280756950e-003,right_val:0.5690100789070129,left_val:0.4730072915554047},{features:[[2,10,3,10,-1.],[3,10,1,10,3.]],threshold:0.0306237693876028,right_val:0.1740095019340515,left_val:0.4971886873245239},{features:[[12,8,2,4,-1.],[12,8,1,4,2.]],threshold:9.2074798885732889e-004,right_val:0.4354872107505798,left_val:0.5372117757797241},{features:[[6,8,2,4,-1.],[7,8,1,4,2.]],threshold:-4.3550739064812660e-005,right_val:0.4347316920757294,left_val:0.5366883873939514},{features:[[10,14,2,3,-1.],[10,14,1,3,2.]],threshold:-6.6452710889279842e-003,right_val:0.5160533189773560,left_val:0.3435518145561218},{features:[[5,1,10,3,-1.],[10,1,5,3,2.]],threshold:0.0432219989597797,right_val:0.7293652892112732,left_val:0.4766792058944702},{features:[[10,7,3,2,-1.],[11,7,1,2,3.]],threshold:2.2331769578158855e-003,right_val:0.5633171200752258,left_val:0.5029315948486328},{features:[[5,6,9,2,-1.],[8,6,3,2,3.]],threshold:3.1829739455133677e-003,right_val:0.5192136764526367,left_val:0.4016092121601105},{features:[[9,8,2,2,-1.],[9,9,2,1,2.]],threshold:-1.8027749320026487e-004,right_val:0.5417919754981995,left_val:0.4088315963745117},{features:[[2,11,16,6,-1.],[2,11,8,3,2.],[10,14,8,3,2.]],threshold:-5.2934689447283745e-003,right_val:0.5243561863899231,left_val:0.4075677096843720},{features:[[12,7,2,2,-1.],[13,7,1,1,2.],[12,8,1,1,2.]],threshold:1.2750959722325206e-003,right_val:0.6387010812759399,left_val:0.4913282990455627},{features:[[9,5,2,3,-1.],[9,6,2,1,3.]],threshold:4.3385322205722332e-003,right_val:0.2947346866130829,left_val:0.5031672120094299},{features:[[9,7,3,2,-1.],[10,7,1,2,3.]],threshold:8.5250744596123695e-003,right_val:0.6308869123458862,left_val:0.4949789047241211},{features:[[5,1,8,12,-1.],[5,7,8,6,2.]],threshold:-9.4266352243721485e-004,right_val:0.4285649955272675,left_val:0.5328366756439209},{features:[[13,5,2,2,-1.],[13,6,2,1,2.]],threshold:1.3609660090878606e-003,right_val:0.5941501259803772,left_val:0.4991525113582611},{features:[[5,5,2,2,-1.],[5,6,2,1,2.]],threshold:4.4782509212382138e-004,right_val:0.5854480862617493,left_val:0.4573504030704498},{features:[[12,4,3,3,-1.],[12,5,3,1,3.]],threshold:1.3360050506889820e-003,right_val:0.5849052071571350,left_val:0.4604358971118927},{features:[[4,14,2,3,-1.],[4,15,2,1,3.]],threshold:-6.0967548051849008e-004,right_val:0.5229423046112061,left_val:0.3969388902187347},{features:[[12,4,3,3,-1.],[12,5,3,1,3.]],threshold:-2.3656780831515789e-003,right_val:0.4898357093334198,left_val:0.5808320045471191},{features:[[5,4,3,3,-1.],[5,5,3,1,3.]],threshold:1.0734340175986290e-003,right_val:0.5470039248466492,left_val:0.4351210892200470},{features:[[9,14,2,6,-1.],[10,14,1,3,2.],[9,17,1,3,2.]],threshold:2.1923359017819166e-003,right_val:0.3842903971672058,left_val:0.5355060100555420},{features:[[8,14,3,2,-1.],[9,14,1,2,3.]],threshold:5.4968618787825108e-003,right_val:0.2827191948890686,left_val:0.5018138885498047},{features:[[9,5,6,6,-1.],[11,5,2,6,3.]],threshold:-0.0753688216209412,right_val:0.5148826837539673,left_val:0.1225076019763947},{features:[[5,5,6,6,-1.],[7,5,2,6,3.]],threshold:0.0251344703137875,right_val:0.7025446295738220,left_val:0.4731766879558563},{features:[[13,13,1,2,-1.],[13,14,1,1,2.]],threshold:-2.9358599931583740e-005,right_val:0.4656086862087250,left_val:0.5430532097816467},{features:[[0,2,10,2,-1.],[0,3,10,1,2.]],threshold:-5.8355910005047917e-004,right_val:0.5190119743347168,left_val:0.4031040072441101},{features:[[13,13,1,2,-1.],[13,14,1,1,2.]],threshold:-2.6639450807124376e-003,right_val:0.5161771178245544,left_val:0.4308126866817474},{features:[[5,7,2,2,-1.],[5,7,1,1,2.],[6,8,1,1,2.]],threshold:-1.3804089976474643e-003,right_val:0.4695515930652618,left_val:0.6219829916954041},{features:[[13,5,2,7,-1.],[13,5,1,7,2.]],threshold:1.2313219485804439e-003,right_val:0.4425831139087677,left_val:0.5379363894462585},{features:[[6,13,1,2,-1.],[6,14,1,1,2.]],threshold:-1.4644179827882908e-005,right_val:0.4222503006458283,left_val:0.5281640291213989},{features:[[11,0,3,7,-1.],[12,0,1,7,3.]],threshold:-0.0128188095986843,right_val:0.5179932713508606,left_val:0.2582092881202698},{features:[[0,3,2,16,-1.],[0,3,1,8,2.],[1,11,1,8,2.]],threshold:0.0228521898388863,right_val:0.7609264254570007,left_val:0.4778693020343781},{features:[[11,0,3,7,-1.],[12,0,1,7,3.]],threshold:8.2305970136076212e-004,right_val:0.4671724140644074,left_val:0.5340992212295532},{features:[[6,0,3,7,-1.],[7,0,1,7,3.]],threshold:0.0127701200544834,right_val:0.1472366005182266,left_val:0.4965761005878449},{features:[[11,16,8,4,-1.],[11,16,4,4,2.]],threshold:-0.0500515103340149,right_val:0.5016592144966126,left_val:0.6414994001388550},{features:[[1,16,8,4,-1.],[5,16,4,4,2.]],threshold:0.0157752707600594,right_val:0.5685362219810486,left_val:0.4522320032119751},{features:[[13,5,2,7,-1.],[13,5,1,7,2.]],threshold:-0.0185016207396984,right_val:0.5137959122657776,left_val:0.2764748930931091},{features:[[5,5,2,7,-1.],[6,5,1,7,2.]],threshold:2.4626250378787518e-003,right_val:0.3795408010482788,left_val:0.5141941905021668},{features:[[18,6,2,14,-1.],[18,13,2,7,2.]],threshold:0.0629161670804024,right_val:0.6580433845520020,left_val:0.5060648918151856},{features:[[6,10,3,4,-1.],[6,12,3,2,2.]],threshold:-2.1648500478477217e-005,right_val:0.4019886851310730,left_val:0.5195388197898865},{features:[[14,7,1,2,-1.],[14,8,1,1,2.]],threshold:2.1180990152060986e-003,right_val:0.5954458713531494,left_val:0.4962365031242371},{features:[[0,1,18,6,-1.],[0,1,9,3,2.],[9,4,9,3,2.]],threshold:-0.0166348908096552,right_val:0.5175446867942810,left_val:0.3757933080196381},{features:[[14,7,1,2,-1.],[14,8,1,1,2.]],threshold:-2.8899470344185829e-003,right_val:0.5057178735733032,left_val:0.6624013781547546},{features:[[0,6,2,14,-1.],[0,13,2,7,2.]],threshold:0.0767832621932030,right_val:0.8047714829444885,left_val:0.4795796871185303},{features:[[17,0,3,12,-1.],[18,0,1,12,3.]],threshold:3.9170677773654461e-003,right_val:0.5719941854476929,left_val:0.4937882125377655},{features:[[0,6,18,3,-1.],[0,7,18,1,3.]],threshold:-0.0726706013083458,right_val:0.4943903982639313,left_val:0.0538945607841015},{features:[[6,0,14,16,-1.],[6,8,14,8,2.]],threshold:0.5403950214385986,right_val:0.1143338978290558,left_val:0.5129774212837219},{features:[[0,0,3,12,-1.],[1,0,1,12,3.]],threshold:2.9510019812732935e-003,right_val:0.5698574185371399,left_val:0.4528343975543976},{features:[[13,0,3,7,-1.],[14,0,1,7,3.]],threshold:3.4508369863033295e-003,right_val:0.4218730926513672,left_val:0.5357726812362671},{features:[[5,7,1,2,-1.],[5,8,1,1,2.]],threshold:-4.2077939724549651e-004,right_val:0.4637925922870636,left_val:0.5916172862052918},{features:[[14,4,6,6,-1.],[14,6,6,2,3.]],threshold:3.3051050268113613e-003,right_val:0.4382042884826660,left_val:0.5273385047912598},{features:[[5,7,7,2,-1.],[5,8,7,1,2.]],threshold:4.7735060798004270e-004,right_val:0.5181884765625000,left_val:0.4046528041362763},{features:[[8,6,6,9,-1.],[8,9,6,3,3.]],threshold:-0.0259285103529692,right_val:0.5089386105537415,left_val:0.7452235817909241},{features:[[5,4,6,1,-1.],[7,4,2,1,3.]],threshold:-2.9729790985584259e-003,right_val:0.5058795213699341,left_val:0.3295435905456543},{features:[[13,0,6,4,-1.],[16,0,3,2,2.],[13,2,3,2,2.]],threshold:5.8508329093456268e-003,right_val:0.5793024897575378,left_val:0.4857144057750702},{features:[[1,2,18,12,-1.],[1,6,18,4,3.]],threshold:-0.0459675192832947,right_val:0.5380653142929077,left_val:0.4312731027603149},{features:[[3,2,17,12,-1.],[3,6,17,4,3.]],threshold:0.1558596044778824,right_val:0.1684713959693909,left_val:0.5196170210838318},{features:[[5,14,7,3,-1.],[5,15,7,1,3.]],threshold:0.0151648297905922,right_val:0.6735026836395264,left_val:0.4735757112503052},{features:[[10,14,1,3,-1.],[10,15,1,1,3.]],threshold:-1.0604249546304345e-003,right_val:0.4775702953338623,left_val:0.5822926759719849},{features:[[3,14,3,3,-1.],[3,15,3,1,3.]],threshold:6.6476291976869106e-003,right_val:0.2319535017013550,left_val:0.4999198913574219},{features:[[14,4,6,6,-1.],[14,6,6,2,3.]],threshold:-0.0122311301529408,right_val:0.5262982249259949,left_val:0.4750893115997315},{features:[[0,4,6,6,-1.],[0,6,6,2,3.]],threshold:5.6528882123529911e-003,right_val:0.3561818897724152,left_val:0.5069767832756043},{features:[[12,5,4,3,-1.],[12,6,4,1,3.]],threshold:1.2977829901501536e-003,right_val:0.5619062781333923,left_val:0.4875693917274475},{features:[[4,5,4,3,-1.],[4,6,4,1,3.]],threshold:0.0107815898954868,right_val:0.6782308220863342,left_val:0.4750770032405853},{features:[[18,0,2,6,-1.],[18,2,2,2,3.]],threshold:2.8654779307544231e-003,right_val:0.4290736019611359,left_val:0.5305461883544922},{features:[[8,1,4,9,-1.],[10,1,2,9,2.]],threshold:2.8663428965955973e-003,right_val:0.5539351105690002,left_val:0.4518479108810425},{features:[[6,6,8,2,-1.],[6,6,4,2,2.]],threshold:-5.1983320154249668e-003,right_val:0.5434188842773438,left_val:0.4149119853973389},{features:[[6,5,4,2,-1.],[6,5,2,1,2.],[8,6,2,1,2.]],threshold:5.3739990107715130e-003,right_val:0.6507657170295715,left_val:0.4717896878719330},{features:[[10,5,2,3,-1.],[10,6,2,1,3.]],threshold:-0.0146415298804641,right_val:0.5161777138710022,left_val:0.2172164022922516},{features:[[9,5,1,3,-1.],[9,6,1,1,3.]],threshold:-1.5042580344015732e-005,right_val:0.4298836886882782,left_val:0.5337383747100830},{features:[[9,10,2,2,-1.],[9,11,2,1,2.]],threshold:-1.1875660129589960e-004,right_val:0.5582447052001953,left_val:0.4604594111442566},{features:[[0,8,4,3,-1.],[0,9,4,1,3.]],threshold:0.0169955305755138,right_val:0.0738800764083862,left_val:0.4945895075798035},{features:[[6,0,8,6,-1.],[6,3,8,3,2.]],threshold:-0.0350959412753582,right_val:0.4977591037750244,left_val:0.7005509138107300},{features:[[1,0,6,4,-1.],[1,0,3,2,2.],[4,2,3,2,2.]],threshold:2.4217350874096155e-003,right_val:0.5477694272994995,left_val:0.4466265141963959},{features:[[13,0,3,7,-1.],[14,0,1,7,3.]],threshold:-9.6340337768197060e-004,right_val:0.5313338041305542,left_val:0.4714098870754242},{features:[[9,16,2,2,-1.],[9,17,2,1,2.]],threshold:1.6391130338888615e-004,right_val:0.5342242121696472,left_val:0.4331546127796173},{features:[[11,4,6,10,-1.],[11,9,6,5,2.]],threshold:-0.0211414601653814,right_val:0.5204498767852783,left_val:0.2644700109958649},{features:[[0,10,19,2,-1.],[0,11,19,1,2.]],threshold:8.7775202700868249e-004,right_val:0.4152742922306061,left_val:0.5208349823951721},{features:[[9,5,8,9,-1.],[9,8,8,3,3.]],threshold:-0.0279439203441143,right_val:0.5018811821937561,left_val:0.6344125270843506},{features:[[4,0,3,7,-1.],[5,0,1,7,3.]],threshold:6.7297378554940224e-003,right_val:0.3500863909721375,left_val:0.5050438046455383},{features:[[8,6,4,12,-1.],[10,6,2,6,2.],[8,12,2,6,2.]],threshold:0.0232810396701097,right_val:0.6968677043914795,left_val:0.4966318011283875},{features:[[0,2,6,4,-1.],[0,4,6,2,2.]],threshold:-0.0116449799388647,right_val:0.5049629807472229,left_val:0.3300260007381439},{features:[[8,15,4,3,-1.],[8,16,4,1,3.]],threshold:0.0157643090933561,right_val:0.7321153879165649,left_val:0.4991598129272461},{features:[[8,0,3,7,-1.],[9,0,1,7,3.]],threshold:-1.3611479662358761e-003,right_val:0.5160670876502991,left_val:0.3911735117435455},{features:[[9,5,3,4,-1.],[10,5,1,4,3.]],threshold:-8.1522337859496474e-004,right_val:0.4949719011783600,left_val:0.5628911256790161},{features:[[8,5,3,4,-1.],[9,5,1,4,3.]],threshold:-6.0066272271797061e-004,right_val:0.4550595879554749,left_val:0.5853595137596130},{features:[[7,6,6,1,-1.],[9,6,2,1,3.]],threshold:4.9715518252924085e-004,right_val:0.5443599224090576,left_val:0.4271470010280609},{features:[[7,14,4,4,-1.],[7,14,2,2,2.],[9,16,2,2,2.]],threshold:2.3475370835512877e-003,right_val:0.3887656927108765,left_val:0.5143110752105713},{features:[[13,14,4,6,-1.],[15,14,2,3,2.],[13,17,2,3,2.]],threshold:-8.9261569082736969e-003,right_val:0.4971720874309540,left_val:0.6044502258300781},{features:[[7,8,1,8,-1.],[7,12,1,4,2.]],threshold:-0.0139199104160070,right_val:0.5000367760658264,left_val:0.2583160996437073},{features:[[16,0,2,8,-1.],[17,0,1,4,2.],[16,4,1,4,2.]],threshold:1.0209949687123299e-003,right_val:0.5560358166694641,left_val:0.4857374131679535},{features:[[2,0,2,8,-1.],[2,0,1,4,2.],[3,4,1,4,2.]],threshold:-2.7441629208624363e-003,right_val:0.4645777046680450,left_val:0.5936884880065918},{features:[[6,1,14,3,-1.],[6,2,14,1,3.]],threshold:-0.0162001308053732,right_val:0.5193495154380798,left_val:0.3163014948368073},{features:[[7,9,3,10,-1.],[7,14,3,5,2.]],threshold:4.3331980705261230e-003,right_val:0.3458878993988037,left_val:0.5061224102973938},{features:[[9,14,2,2,-1.],[9,15,2,1,2.]],threshold:5.8497930876910686e-004,right_val:0.5870177745819092,left_val:0.4779017865657806},{features:[[7,7,6,8,-1.],[7,11,6,4,2.]],threshold:-2.2466450463980436e-003,right_val:0.5374773144721985,left_val:0.4297851026058197},{features:[[9,7,3,6,-1.],[9,10,3,3,2.]],threshold:2.3146099410951138e-003,right_val:0.4640969932079315,left_val:0.5438671708106995},{features:[[7,13,3,3,-1.],[7,14,3,1,3.]],threshold:8.7679121643304825e-003,right_val:0.6771789789199829,left_val:0.4726893007755280},{features:[[9,9,2,2,-1.],[9,10,2,1,2.]],threshold:-2.2448020172305405e-004,right_val:0.5428048968315125,left_val:0.4229173064231873},{features:[[0,1,18,2,-1.],[6,1,6,2,3.]],threshold:-7.4336021207273006e-003,right_val:0.4683673977851868,left_val:0.6098880767822266},{features:[[7,1,6,14,-1.],[7,8,6,7,2.]],threshold:-2.3189240600913763e-003,right_val:0.4424242079257965,left_val:0.5689436793327332},{features:[[1,9,18,1,-1.],[7,9,6,1,3.]],threshold:-2.1042178850620985e-003,right_val:0.5187087059020996,left_val:0.3762221038341522},{features:[[9,7,2,2,-1.],[9,7,1,2,2.]],threshold:4.6034841216169298e-004,right_val:0.5771207213401794,left_val:0.4699405133724213},{features:[[9,3,2,9,-1.],[10,3,1,9,2.]],threshold:1.0547629790380597e-003,right_val:0.5601701736450195,left_val:0.4465216994285584},{features:[[18,14,2,3,-1.],[18,15,2,1,3.]],threshold:8.7148818420246243e-004,right_val:0.3914709091186523,left_val:0.5449805259704590},{features:[[7,11,3,1,-1.],[8,11,1,1,3.]],threshold:3.3364820410497487e-004,right_val:0.5645738840103149,left_val:0.4564009010791779},{features:[[10,8,3,4,-1.],[11,8,1,4,3.]],threshold:-1.4853250468149781e-003,right_val:0.4692778885364533,left_val:0.5747377872467041},{features:[[7,14,3,6,-1.],[8,14,1,6,3.]],threshold:3.0251620337367058e-003,right_val:0.3762814104557037,left_val:0.5166196823120117},{features:[[10,8,3,4,-1.],[11,8,1,4,3.]],threshold:5.0280741415917873e-003,right_val:0.6151527166366577,left_val:0.5002111792564392},{features:[[7,8,3,4,-1.],[8,8,1,4,3.]],threshold:-5.8164511574432254e-004,right_val:0.4390751123428345,left_val:0.5394598245620728},{features:[[7,9,6,9,-1.],[7,12,6,3,3.]],threshold:0.0451415292918682,right_val:0.2063035964965820,left_val:0.5188326835632324},{features:[[0,14,2,3,-1.],[0,15,2,1,3.]],threshold:-1.0795620037242770e-003,right_val:0.5137907266616821,left_val:0.3904685080051422},{features:[[11,12,1,2,-1.],[11,13,1,1,2.]],threshold:1.5995999274309725e-004,right_val:0.5427504181861877,left_val:0.4895322918891907},{features:[[4,3,8,3,-1.],[8,3,4,3,2.]],threshold:-0.0193592701107264,right_val:0.4773507118225098,left_val:0.6975228786468506},{features:[[0,4,20,6,-1.],[0,4,10,6,2.]],threshold:0.2072550952434540,right_val:0.3034991919994354,left_val:0.5233635902404785},{features:[[9,14,1,3,-1.],[9,15,1,1,3.]],threshold:-4.1953290929086506e-004,right_val:0.4460186064243317,left_val:0.5419396758079529},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:2.2582069505006075e-003,right_val:0.6027408838272095,left_val:0.4815764129161835},{features:[[0,15,14,4,-1.],[0,17,14,2,2.]],threshold:-6.7811207845807076e-003,right_val:0.5183305740356445,left_val:0.3980278968811035},{features:[[1,14,18,6,-1.],[1,17,18,3,2.]],threshold:0.0111543098464608,right_val:0.4188759922981262,left_val:0.5431231856346130},{features:[[0,0,10,6,-1.],[0,0,5,3,2.],[5,3,5,3,2.]],threshold:0.0431624315679073,right_val:0.6522961258888245,left_val:0.4738228023052216}],threshold:105.7611007690429700}],size:[20,20],tilted:false};\n\n\tvar imageData = e.data.imageData,\n\t\tw = e.data.w,\n\t\th = e.data.h,\n\t\tvideoWidth = e.data.videoWidth,\n\t\tparams = e.data.params;\n\n\tvar img_u8 = new jsfeat.matrix_t(w, h, jsfeat.U8_t | jsfeat.C1_t),\n\t\tedg = new jsfeat.matrix_t(w, h, jsfeat.U8_t | jsfeat.C1_t),\n\t\tii_sum = new Int32Array((w+1)*(h+1)),\n\t\tii_sqsum = new Int32Array((w+1)*(h+1)),\n\t\tii_tilted = new Int32Array((w+1)*(h+1)),\n\t\tii_canny = new Int32Array((w+1)*(h+1));\n\n\tvar classifier = jsfeat.haar.frontalface;\n\n\tjsfeat.imgproc.grayscale(imageData.data, w, h, img_u8);\n\n\t// possible params\n\tif (params.equalizeHistogram) {\n\t\tjsfeat.imgproc.equalize_histogram(img_u8, img_u8);\n\t}\n\t//jsfeat.imgproc.gaussian_blur(img_u8, img_u8, 3);\n\n\tjsfeat.imgproc.compute_integral_image(img_u8, ii_sum, ii_sqsum, classifier.tilted ? ii_tilted : null);\n\n\tif(params.useCanny) {\n\t\tjsfeat.imgproc.canny(img_u8, edg, 10, 50);\n\t\tjsfeat.imgproc.compute_integral_image(edg, ii_canny, null, null);\n\t}\n\n\tjsfeat.haar.edgesDensity = params.edgesDensity;\n\tvar rects = jsfeat.haar.detect_multi_scale(ii_sum, ii_sqsum, ii_tilted, params.useCanny? ii_canny : null, img_u8.cols, img_u8.rows, classifier, params.scaleFactor, params.minScale);\n\trects = jsfeat.haar.group_rectangles(rects, params.min_neighbors);\n\n\tfor (var i = rects.length-1;i >= 0;i--) {\n\t\tif (rects[i].confidence < params.confidenceThreshold) {\n\t\t\trects.splice(i,1);\n\t\t}\n\t}\n\n\tvar rl = rects.length;\n\tif (rl == 0) {\n\t\tself.postMessage({\n\t\t\tfaces: []\n\t\t});\n\t} else {\n\t\tvar best = rects[0];\n\t\tfor (var i = 1;i < rl;i++) {\n\t\t\tif (rects[i].neighbors > best.neighbors) {\n\t\t\t\tbest = rects[i];\n\t\t\t} else if (rects[i].neighbors == best.neighbors) {\n\t\t\t\t// if (rects[i].width > best.width) best = rects[i]; // use biggest rect\n\t\t\t\tif (rects[i].confidence > best.confidence) best = rects[i]; // use most confident rect\n\t\t\t}\n\t\t}\n\n\t\tvar sc = videoWidth / img_u8.cols;\n\t\tbest.x = (best.x*sc)|0;\n\t\tbest.y = (best.y*sc)|0;\n\t\tbest.width = (best.width*sc)|0;\n\t\tbest.height = (best.height*sc)|0;\n\n\t\tself.postMessage({\n\t\t\tfaces: [best]\n\t\t});\n\t}\n};\n\n// import { drawDetection, drawFacialPoints, drawBoundingBox } from './utils/debugging.js';\n\nvar faceDetection = function(pdmModel, params) {\n\n\t// processes an image, detects a face and returns the initial face parameters for clmtrackr\n\t//   calls a callback function when it's done\n\t//   optionally uses web workers\n\n\tif (params === undefined) params = {};\n\tif (params.workSize === undefined) params.workSize = 200;\n\tif (params.minScale === undefined) params.minScale = 2;\n\tif (params.scaleFactor === undefined) params.scaleFactor = 1.15;\n\tif (params.useCanny === undefined) params.useCanny = false;\n\tif (params.edgesDensity === undefined) params.edgesDensity = 0.13;\n\tif (params.equalizeHistogram === undefined) params.equalizeHistogram = false;\n\tif (params.min_neighbors === undefined) params.min_neighbors = 2;\n\tif (params.confidenceThreshold === undefined) params.confidenceThreshold = 106.1;\n\tif (params.useWebWorkers === undefined) params.useWebWorkers = true;\n\n\t// disable web workers if not exists\n\tif (!window.Worker) params.useWebWorkers = false;\n\n\tvar msxmin, msymin, msymax;\n\tvar msmodelheight;\n\tvar element;\n\n\tvar model = pdmModel;\n\n\tvar mosseFilter = mosse.mosseFilter;\n\tvar left_eye_filter = mosse.filters.left_eye_filter;\n\tvar right_eye_filter = mosse.filters.right_eye_filter;\n\tvar nose_filter = mosse.filters.nose_filter;\n\n\tvar mossef_lefteye, mossef_righteye, mossef_nose;\n\tvar right_eye_position = [0.0,0.0];\n\tvar left_eye_position = [0.0,0.0];\n\tvar nose_position = [0.0,0.0];\n\n\tif (model.hints && mosseFilter && left_eye_filter && right_eye_filter && nose_filter) {\n\t\tmossef_lefteye = new mosseFilter();\n\t\tmossef_lefteye.load(left_eye_filter);\n\t\tmossef_righteye = new mosseFilter();\n\t\tmossef_righteye.load(right_eye_filter);\n\t\tmossef_nose = new mosseFilter();\n\t\tmossef_nose.load(nose_filter);\n\t} else {\n\t\tconsole.log('MOSSE filters not found, using rough approximation for initialization.');\n\t}\n\n\t// load mean shape\n\tvar meanShape = model.shapeModel.meanShape;\n\tvar numPatches = model.patchModel.numPatches;\n\n\t// get max and mins, width and height of meanshape\n\tmsymax = 0;\n\tmsxmin = msymin = 1000000;\n\tfor (var i = 0;i < numPatches;i++) {\n\t\tif (meanShape[i][0] < msxmin) msxmin = meanShape[i][0];\n\t\tif (meanShape[i][1] < msymin) msymin = meanShape[i][1];\n\t\tif (meanShape[i][1] > msymax) msymax = meanShape[i][1];\n\t}\n\tmsmodelheight = msymax-msymin;\n\n\tvar jf = new jsfeat_face(params);\n\n\tthis.init = function(video) {\n\t\telement = video;\n\n\t\tjf.init(element);\n\t};\n\n\tvar getBoundingBox = function(box) {\n\t\treturn new Promise(function(resolve, reject) {\n\t\t\tif (box) {\n\t\t\t\tresolve({x : box[0], y : box[1], width : box[2], height : box[3]});\n\t\t\t} else {\n\t\t\t\tresolve(jf.findFace());\n\t\t\t}\n\t\t});\n\t};\n\n\tvar getFinegrainedPosition = function(candidate) {\n\t\tvar translateX, translateY, scaling, rotation;\n\t\tvar x = candidate.x;\n\t\tvar y = candidate.y;\n\t\tvar w = candidate.width;\n\t\tvar h = candidate.height;\n\n\t\t// var debugCC = document.getElementById('overlay2').getContext('2d')\n\t\tif (model.hints && mosseFilter && left_eye_filter && right_eye_filter && nose_filter) {\n\t\t\tvar noseFilterWidth = w * 4.5/10;\n\t\t\tvar eyeFilterWidth = w * 6/10;\n\n\t\t\t// detect position of eyes and nose via mosse filter\n\t\t\tvar nose_result = mossef_nose.track(element, Math.round(x+(w/2)-(noseFilterWidth/2)), Math.round(y+h*(5/8)-(noseFilterWidth/2)), noseFilterWidth, noseFilterWidth, false);\n\t\t\tvar right_result = mossef_righteye.track(element, Math.round(x+(w*3/4)-(eyeFilterWidth/2)), Math.round(y+h*(2/5)-(eyeFilterWidth/2)), eyeFilterWidth, eyeFilterWidth, false);\n\t\t\tvar left_result = mossef_lefteye.track(element, Math.round(x+(w/4)-(eyeFilterWidth/2)), Math.round(y+h*(2/5)-(eyeFilterWidth/2)), eyeFilterWidth, eyeFilterWidth, false);\n\t\t\tright_eye_position[0] = Math.round(x+(w*3/4)-(eyeFilterWidth/2))+right_result[0];\n\t\t\tright_eye_position[1] = Math.round(y+h*(2/5)-(eyeFilterWidth/2))+right_result[1];\n\t\t\tleft_eye_position[0] = Math.round(x+(w/4)-(eyeFilterWidth/2))+left_result[0];\n\t\t\tleft_eye_position[1] = Math.round(y+h*(2/5)-(eyeFilterWidth/2))+left_result[1];\n\t\t\tnose_position[0] = Math.round(x+(w/2)-(noseFilterWidth/2))+nose_result[0];\n\t\t\tnose_position[1] = Math.round(y+h*(5/8)-(noseFilterWidth/2))+nose_result[1];\n\n\t\t\t// drawDetection(debugCC, candidate, [left_eye_position, right_eye_positions, nose_position]);\n\n\t\t\t// get eye and nose positions of model\n\t\t\tvar lep = model.hints.leftEye;\n\t\t\tvar rep = model.hints.rightEye;\n\t\t\tvar mep = model.hints.nose;\n\n\t\t\t// get scaling, rotation, etc. via procrustes analysis\n\t\t\tvar procrustes_params = procrustes([left_eye_position, right_eye_position, nose_position], [lep, rep, mep]);\n\t\t\ttranslateX = procrustes_params[0];\n\t\t\ttranslateY = procrustes_params[1];\n\t\t\tscaling = procrustes_params[2];\n\t\t\trotation = procrustes_params[3];\n\n\t\t\t// drawFacialPoints(debugCC, [lep, rep, mep], procrustes_params);\n\t\t} else {\n\t\t\t// drawBoundingBox(debugCC, [x,y,w,h]);\n\t\t\tscaling = w/msmodelheight;\n\t\t\trotation = 0;\n\t\t\ttranslateX = x-(msxmin*scaling)+0.1*w;\n\t\t\ttranslateY = y-(msymin*scaling)+0.25*h;\n\t\t}\n\n\t\treturn [scaling, rotation, translateX, translateY];\n\t};\n\n\t// get initial starting point for model\n\tthis.getInitialPosition = function(box) {\n\t\treturn new Promise(function(resolve, reject) {\n\t\t\tgetBoundingBox(box)\n\t\t\t\t.then(getFinegrainedPosition)\n\t\t\t\t.then(resolve)\n\t\t\t\t.catch(reject);\n\t\t});\n\t};\n\n\t// procrustes analysis\n\tfunction procrustes(template, shape) {\n\t\t// assume template and shape is a vector of x,y-coordinates\n\t\t//i.e. template = [[x1,y1], [x2,y2], [x3,y3]];\n\t\tvar templateClone = [];\n\t\tvar shapeClone = [];\n\t\tfor (var i = 0;i < template.length;i++) {\n\t\t\ttemplateClone[i] = [template[i][0], template[i][1]];\n\t\t}\n\t\tfor (var i = 0;i < shape.length;i++) {\n\t\t\tshapeClone[i] = [shape[i][0], shape[i][1]];\n\t\t}\n\t\tshape = shapeClone;\n\t\ttemplate = templateClone;\n\n\t\t// calculate translation\n\t\tvar templateMean = [0.0, 0.0];\n\t\tfor (var i = 0;i < template.length;i++) {\n\t\t\ttemplateMean[0] += template[i][0];\n\t\t\ttemplateMean[1] += template[i][1];\n\t\t}\n\t\ttemplateMean[0] /= template.length;\n\t\ttemplateMean[1] /= template.length;\n\n\t\tvar shapeMean = [0.0, 0.0];\n\t\tfor (var i = 0;i < shape.length;i++) {\n\t\t\tshapeMean[0] += shape[i][0];\n\t\t\tshapeMean[1] += shape[i][1];\n\t\t}\n\t\tshapeMean[0] /= shape.length;\n\t\tshapeMean[1] /= shape.length;\n\n\t\tvar translationX = templateMean[0] - shapeMean[0];\n\t\tvar translationY = templateMean[1] - shapeMean[1];\n\n\t\t// centralize\n\t\tfor (var i = 0;i < shape.length;i++) {\n\t\t\tshape[i][0] -= shapeMean[0];\n\t\t\tshape[i][1] -= shapeMean[1];\n\t\t}\n\t\tfor (var i = 0;i < template.length;i++) {\n\t\t\ttemplate[i][0] -= templateMean[0];\n\t\t\ttemplate[i][1] -= templateMean[1];\n\t\t}\n\n\t\t// scaling\n\n\t\tvar scaleS = 0.0;\n\t\tfor (var i = 0;i < shape.length;i++) {\n\t\t\tscaleS += ((shape[i][0])*(shape[i][0]));\n\t\t\tscaleS += ((shape[i][1])*(shape[i][1]));\n\t\t}\n\t\tscaleS = Math.sqrt(scaleS/shape.length);\n\n\t\tvar scaleT = 0.0;\n\t\tfor (var i = 0;i < template.length;i++) {\n\t\t\tscaleT += ((template[i][0])*(template[i][0]));\n\t\t\tscaleT += ((template[i][1])*(template[i][1]));\n\t\t}\n\t\tscaleT = Math.sqrt(scaleT/template.length);\n\n\t\tvar scaling = scaleT/scaleS;\n\n\t\tfor (var i = 0;i < shape.length;i++) {\n\t\t\tshape[i][0] *= scaling;\n\t\t\tshape[i][1] *= scaling;\n\t\t}\n\n\t\t// rotation\n\n\t\tvar top = 0.0;\n\t\tvar bottom = 0.0;\n\t\tfor (var i = 0;i < shape.length;i++) {\n\t\t\ttop += (shape[i][0]*template[i][1] - shape[i][1]*template[i][0]);\n\t\t\tbottom += (shape[i][0]*template[i][0] + shape[i][1]*template[i][1]);\n\t\t}\n\t\tvar rotation = Math.atan(top/bottom);\n\n\t\ttranslationX += (shapeMean[0]-(scaling*Math.cos(-rotation)*shapeMean[0])-(scaling*shapeMean[1]*Math.sin(-rotation)));\n\t\ttranslationY += (shapeMean[1]+(scaling*Math.sin(-rotation)*shapeMean[0])-(scaling*shapeMean[1]*Math.cos(-rotation)));\n\n\t\treturn [translationX, translationY, scaling, rotation];\n\t}\n};\n\n// simple wrapper for jsfeat face detector that can run as a webworker\nvar jsfeat_face = function(parameters) {\n\n\tvar params = parameters;\n\tvar maxWorkSize = params.workSize;\n\tvar useWebWorkers = params.useWebWorkers;\n\n\tvar work_canvas = document.createElement('canvas');\n\tvar work_ctx = work_canvas.getContext('2d');\n\n\tvar videoWidth, videoHeight, scale, video, w, h;\n\tvar img_u8, edg, ii_sum, ii_sqsum, ii_tilted, ii_canny, classifier;\n\tvar worker;\n\n\tif (useWebWorkers) {\n\t\t// Courtesy of stackoverflow\n\t\tWorker.createURL = function(func_or_string) {\n\t\t\tvar str = (typeof func_or_string === 'function')?func_or_string.toString():func_or_string;\n\t\t\tvar blob = new Blob(['\\'use strict\\';\\nself.onmessage ='+str], { type: 'text/javascript' });\n\t\t\treturn window.URL.createObjectURL(blob);\n\t\t};\n\n\t\tWorker.create = function(func_or_string) {\n\t\t\treturn new Worker(Worker.createURL(func_or_string));\n\t\t};\n\n\t\tworker = Worker.create(findFaceWorker);\n\t}\n\n\tthis.init = function(element) {\n\t\tvideo = element;\n\t\tvideoWidth = video.width;\n\t\tvideoHeight = video.height;\n\n\t\t// scale down canvas we do detection on (to reduce noisy detections)\n\t\tscale = Math.min(maxWorkSize/videoWidth, maxWorkSize/videoHeight);\n\t\tw = (videoWidth*scale)|0;\n\t\th = (videoHeight*scale)|0;\n\n\t\twork_canvas.height = h;\n\t\twork_canvas.width = w;\n\n\t\tif (!useWebWorkers) {\n\t\t\timg_u8 = new jsfeat_1.matrix_t(w, h, jsfeat_1.U8_t | jsfeat_1.C1_t);\n\t\t\tedg = new jsfeat_1.matrix_t(w, h, jsfeat_1.U8_t | jsfeat_1.C1_t);\n\t\t\tii_sum = new Int32Array((w+1)*(h+1));\n\t\t\tii_sqsum = new Int32Array((w+1)*(h+1));\n\t\t\tii_tilted = new Int32Array((w+1)*(h+1));\n\t\t\tii_canny = new Int32Array((w+1)*(h+1));\n\t\t\tclassifier = jsfeat_1.haar.frontalface;\n\t\t}\n\t};\n\n\tthis.findFace = function () {\n\t\twork_ctx.drawImage(video, 0, 0, work_canvas.width, work_canvas.height);\n\t\tvar imageData = work_ctx.getImageData(0, 0, work_canvas.width, work_canvas.height);\n\n\t\treturn new Promise(function(resolve, reject) {\n\t\t\tif (useWebWorkers) {\n\t\t\t\tworker.addEventListener('message', function (e) {\n\t\t\t\t\tif (e.data.faces.length > 0) {\n\t\t\t\t\t\tresolve(e.data.faces[0]);\n\t\t\t\t\t} else {\n                        // PATCHED IN improved error handling\n                        const error = new Error(\"no face found (by web worker)\");\n                        error.code = \"NO_FACE_FOUND\";\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t}.bind(this), false);\n\n\t\t\t\tworker.postMessage({\n\t\t\t\t\tw: work_canvas.width,\n\t\t\t\t\th: work_canvas.height,\n\t\t\t\t\tvideoWidth: videoWidth,\n\t\t\t\t\timageData:imageData,\n\t\t\t\t\tparams: params\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tjsfeat_1.imgproc.grayscale(imageData.data, work_canvas.width, work_canvas.height, img_u8);\n\n\t\t\t\t// possible params\n\t\t\t\tif(params.equalizeHistogram) {\n\t\t\t\t\tjsfeat_1.imgproc.equalize_histogram(img_u8, img_u8);\n\t\t\t\t}\n\t\t\t\t//jsfeat.imgproc.gaussian_blur(img_u8, img_u8, 3);\n\n\t\t\t\tjsfeat_1.imgproc.compute_integral_image(img_u8, ii_sum, ii_sqsum, classifier.tilted ? ii_tilted : null);\n\n\t\t\t\tif(params.useCanny) {\n\t\t\t\t\tjsfeat_1.imgproc.canny(img_u8, edg, 10, 50);\n\t\t\t\t\tjsfeat_1.imgproc.compute_integral_image(edg, ii_canny, null, null);\n\t\t\t\t}\n\n\t\t\t\tjsfeat_1.haar.edgesDensity = params.edgesDensity;\n\t\t\t\tvar rects = jsfeat_1.haar.detect_multi_scale(ii_sum, ii_sqsum, ii_tilted, params.useCanny? ii_canny : null, img_u8.cols, img_u8.rows, classifier, params.scaleFactor, params.minScale);\n\t\t\t\trects = jsfeat_1.haar.group_rectangles(rects, params.min_neighbors);\n\n\t\t\t\tfor (var i = rects.length-1;i >= 0;i--) {\n\t\t\t\t\tif (rects[i].confidence < params.confidenceThreshold) {\n\t\t\t\t\t\trects.splice(i,1);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar rl = rects.length;\n\t\t\t\tif (rl == 0) {\n                    // PATCHED IN improved error handling\n                    const error = new Error(\"no face found (by HAAR detector)\");\n                    error.code = \"NO_FACE_FOUND\";\n\t\t\t\t\treject(error);\n\t\t\t\t} else {\n\t\t\t\t\tvar best = rects[0];\n\t\t\t\t\tfor (var i = 1; i < rl; i++) {\n\t\t\t\t\t\tif (rects[i].neighbors > best.neighbors) {\n\t\t\t\t\t\t\tbest = rects[i];\n\t\t\t\t\t\t} else if (rects[i].neighbors == best.neighbors) {\n\t\t\t\t\t\t\t// if (rects[i].width > best.width) best = rects[i]; // use biggest rect\n\t\t\t\t\t\t\tif (rects[i].confidence > best.confidence) best = rects[i]; // use most confident rect\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvar sc = videoWidth / img_u8.cols;\n\t\t\t\t\tbest.x = (best.x*sc)|0;\n\t\t\t\t\tbest.y = (best.y*sc)|0;\n\t\t\t\t\tbest.width = (best.width*sc)|0;\n\t\t\t\t\tbest.height = (best.height*sc)|0;\n\n\t\t\t\t\tresolve(best);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n};\n\n/**\n * this cascade is derived from https://github.com/mtschirs/js-objectdetect implementation\n * @author Martin Tschirsich / http://www.tu-darmstadt.de/~m_t\n */\njsfeat_1.haar.frontalface = {complexClassifiers:[{simpleClassifiers:[{features:[[3,7,14,4,-1.],[3,9,14,2,2.]],threshold:4.0141958743333817e-003,right_val:0.8378106951713562,left_val:0.0337941907346249},{features:[[1,2,18,4,-1.],[7,2,6,4,3.]],threshold:0.0151513395830989,right_val:0.7488812208175659,left_val:0.1514132022857666},{features:[[1,7,15,9,-1.],[1,10,15,3,3.]],threshold:4.2109931819140911e-003,right_val:0.6374819874763489,left_val:0.0900492817163467}],threshold:0.8226894140243530},{simpleClassifiers:[{features:[[5,6,2,6,-1.],[5,9,2,3,2.]],threshold:1.6227109590545297e-003,right_val:0.7110946178436279,left_val:0.0693085864186287},{features:[[7,5,6,3,-1.],[9,5,2,3,3.]],threshold:2.2906649392098188e-003,right_val:0.6668692231178284,left_val:0.1795803010463715},{features:[[4,0,12,9,-1.],[4,3,12,3,3.]],threshold:5.0025708042085171e-003,right_val:0.6554006934165955,left_val:0.1693672984838486},{features:[[6,9,10,8,-1.],[6,13,10,4,2.]],threshold:7.9659894108772278e-003,right_val:0.0914145186543465,left_val:0.5866332054138184},{features:[[3,6,14,8,-1.],[3,10,14,4,2.]],threshold:-3.5227010957896709e-003,right_val:0.6031895875930786,left_val:0.1413166970014572},{features:[[14,1,6,10,-1.],[14,1,3,10,2.]],threshold:0.0366676896810532,right_val:0.7920318245887756,left_val:0.3675672113895416},{features:[[7,8,5,12,-1.],[7,12,5,4,3.]],threshold:9.3361474573612213e-003,right_val:0.2088509947061539,left_val:0.6161385774612427},{features:[[1,1,18,3,-1.],[7,1,6,3,3.]],threshold:8.6961314082145691e-003,right_val:0.6360273957252502,left_val:0.2836230993270874},{features:[[1,8,17,2,-1.],[1,9,17,1,2.]],threshold:1.1488880263641477e-003,right_val:0.5800700783729553,left_val:0.2223580926656723},{features:[[16,6,4,2,-1.],[16,7,4,1,2.]],threshold:-2.1484689787030220e-003,right_val:0.5787054896354675,left_val:0.2406464070081711},{features:[[5,17,2,2,-1.],[5,18,2,1,2.]],threshold:2.1219060290604830e-003,right_val:0.1362237036228180,left_val:0.5559654831886292},{features:[[14,2,6,12,-1.],[14,2,3,12,2.]],threshold:-0.0939491465687752,right_val:0.4717740118503571,left_val:0.8502737283706665},{features:[[4,0,4,12,-1.],[4,0,2,6,2.],[6,6,2,6,2.]],threshold:1.3777789426967502e-003,right_val:0.2834529876708984,left_val:0.5993673801422119},{features:[[2,11,18,8,-1.],[8,11,6,8,3.]],threshold:0.0730631574988365,right_val:0.7060034275054932,left_val:0.4341886043548584},{features:[[5,7,10,2,-1.],[5,8,10,1,2.]],threshold:3.6767389974556863e-004,right_val:0.6051574945449829,left_val:0.3027887940406799},{features:[[15,11,5,3,-1.],[15,12,5,1,3.]],threshold:-6.0479710809886456e-003,right_val:0.5675256848335266,left_val:0.1798433959484100}],threshold:6.9566087722778320},{simpleClassifiers:[{features:[[5,3,10,9,-1.],[5,6,10,3,3.]],threshold:-0.0165106896311045,right_val:0.1424857974052429,left_val:0.6644225120544434},{features:[[9,4,2,14,-1.],[9,11,2,7,2.]],threshold:2.7052499353885651e-003,right_val:0.1288477033376694,left_val:0.6325352191925049},{features:[[3,5,4,12,-1.],[3,9,4,4,3.]],threshold:2.8069869149476290e-003,right_val:0.6193193197250366,left_val:0.1240288019180298},{features:[[4,5,12,5,-1.],[8,5,4,5,3.]],threshold:-1.5402400167658925e-003,right_val:0.5670015811920166,left_val:0.1432143002748489},{features:[[5,6,10,8,-1.],[5,10,10,4,2.]],threshold:-5.6386279175058007e-004,right_val:0.5905207991600037,left_val:0.1657433062791824},{features:[[8,0,6,9,-1.],[8,3,6,3,3.]],threshold:1.9253729842603207e-003,right_val:0.5738824009895325,left_val:0.2695507109165192},{features:[[9,12,1,8,-1.],[9,16,1,4,2.]],threshold:-5.0214841030538082e-003,right_val:0.5782774090766907,left_val:0.1893538981676102},{features:[[0,7,20,6,-1.],[0,9,20,2,3.]],threshold:2.6365420781075954e-003,right_val:0.5695425868034363,left_val:0.2309329062700272},{features:[[7,0,6,17,-1.],[9,0,2,17,3.]],threshold:-1.5127769438549876e-003,right_val:0.5956642031669617,left_val:0.2759602069854736},{features:[[9,0,6,4,-1.],[11,0,2,4,3.]],threshold:-0.0101574398577213,right_val:0.5522047281265259,left_val:0.1732538044452667},{features:[[5,1,6,4,-1.],[7,1,2,4,3.]],threshold:-0.0119536602869630,right_val:0.5559014081954956,left_val:0.1339409947395325},{features:[[12,1,6,16,-1.],[14,1,2,16,3.]],threshold:4.8859491944313049e-003,right_val:0.6188849210739136,left_val:0.3628703951835632},{features:[[0,5,18,8,-1.],[0,5,9,4,2.],[9,9,9,4,2.]],threshold:-0.0801329165697098,right_val:0.5475944876670837,left_val:0.0912110507488251},{features:[[8,15,10,4,-1.],[13,15,5,2,2.],[8,17,5,2,2.]],threshold:1.0643280111253262e-003,right_val:0.5711399912834168,left_val:0.3715142905712128},{features:[[3,1,4,8,-1.],[3,1,2,4,2.],[5,5,2,4,2.]],threshold:-1.3419450260698795e-003,right_val:0.3318097889423370,left_val:0.5953313708305359},{features:[[3,6,14,10,-1.],[10,6,7,5,2.],[3,11,7,5,2.]],threshold:-0.0546011403203011,right_val:0.5602846145629883,left_val:0.1844065934419632},{features:[[2,1,6,16,-1.],[4,1,2,16,3.]],threshold:2.9071690514683723e-003,right_val:0.6131715178489685,left_val:0.3594244122505188},{features:[[0,18,20,2,-1.],[0,19,20,1,2.]],threshold:7.4718717951327562e-004,right_val:0.3459562957286835,left_val:0.5994353294372559},{features:[[8,13,4,3,-1.],[8,14,4,1,3.]],threshold:4.3013808317482471e-003,right_val:0.6990845203399658,left_val:0.4172652065753937},{features:[[9,14,2,3,-1.],[9,15,2,1,3.]],threshold:4.5017572119832039e-003,right_val:0.7801457047462463,left_val:0.4509715139865875},{features:[[0,12,9,6,-1.],[0,14,9,2,3.]],threshold:0.0241385009139776,right_val:0.1319826990365982,left_val:0.5438212752342224}],threshold:9.4985427856445313},{simpleClassifiers:[{features:[[5,7,3,4,-1.],[5,9,3,2,2.]],threshold:1.9212230108678341e-003,right_val:0.6199870705604553,left_val:0.1415266990661621},{features:[[9,3,2,16,-1.],[9,11,2,8,2.]],threshold:-1.2748669541906565e-004,right_val:0.1884928941726685,left_val:0.6191074252128601},{features:[[3,6,13,8,-1.],[3,10,13,4,2.]],threshold:5.1409931620582938e-004,right_val:0.5857927799224854,left_val:0.1487396955490112},{features:[[12,3,8,2,-1.],[12,3,4,2,2.]],threshold:4.1878609918057919e-003,right_val:0.6359239816665649,left_val:0.2746909856796265},{features:[[8,8,4,12,-1.],[8,12,4,4,3.]],threshold:5.1015717908740044e-003,right_val:0.2175628989934921,left_val:0.5870851278305054},{features:[[11,3,8,6,-1.],[15,3,4,3,2.],[11,6,4,3,2.]],threshold:-2.1448440384119749e-003,right_val:0.2979590892791748,left_val:0.5880944728851318},{features:[[7,1,6,19,-1.],[9,1,2,19,3.]],threshold:-2.8977119363844395e-003,right_val:0.5876647233963013,left_val:0.2373327016830444},{features:[[9,0,6,4,-1.],[11,0,2,4,3.]],threshold:-0.0216106791049242,right_val:0.5194202065467835,left_val:0.1220654994249344},{features:[[3,1,9,3,-1.],[6,1,3,3,3.]],threshold:-4.6299318782985210e-003,right_val:0.5817409157752991,left_val:0.2631230950355530},{features:[[8,15,10,4,-1.],[13,15,5,2,2.],[8,17,5,2,2.]],threshold:5.9393711853772402e-004,right_val:0.5698544979095459,left_val:0.3638620078563690},{features:[[0,3,6,10,-1.],[3,3,3,10,2.]],threshold:0.0538786612451077,right_val:0.7559366226196289,left_val:0.4303531050682068},{features:[[3,4,15,15,-1.],[3,9,15,5,3.]],threshold:1.8887349870055914e-003,right_val:0.5613427162170410,left_val:0.2122603058815002},{features:[[6,5,8,6,-1.],[6,7,8,2,3.]],threshold:-2.3635339457541704e-003,right_val:0.2642767131328583,left_val:0.5631849169731140},{features:[[4,4,12,10,-1.],[10,4,6,5,2.],[4,9,6,5,2.]],threshold:0.0240177996456623,right_val:0.2751705944538117,left_val:0.5797107815742493},{features:[[6,4,4,4,-1.],[8,4,2,4,2.]],threshold:2.0543030404951423e-004,right_val:0.5752568840980530,left_val:0.2705242037773132},{features:[[15,11,1,2,-1.],[15,12,1,1,2.]],threshold:8.4790197433903813e-004,right_val:0.2334876954555512,left_val:0.5435624718666077},{features:[[3,11,2,2,-1.],[3,12,2,1,2.]],threshold:1.4091329649090767e-003,right_val:0.2063155025243759,left_val:0.5319424867630005},{features:[[16,11,1,3,-1.],[16,12,1,1,3.]],threshold:1.4642629539594054e-003,right_val:0.3068861067295075,left_val:0.5418980717658997},{features:[[3,15,6,4,-1.],[3,15,3,2,2.],[6,17,3,2,2.]],threshold:1.6352549428120255e-003,right_val:0.6112868189811707,left_val:0.3695372939109802},{features:[[6,7,8,2,-1.],[6,8,8,1,2.]],threshold:8.3172752056270838e-004,right_val:0.6025236248970032,left_val:0.3565036952495575},{features:[[3,11,1,3,-1.],[3,12,1,1,3.]],threshold:-2.0998890977352858e-003,right_val:0.5362827181816101,left_val:0.1913982033729553},{features:[[6,0,12,2,-1.],[6,1,12,1,2.]],threshold:-7.4213981861248612e-004,right_val:0.5529310107231140,left_val:0.3835555016994476},{features:[[9,14,2,3,-1.],[9,15,2,1,3.]],threshold:3.2655049581080675e-003,right_val:0.7101895809173584,left_val:0.4312896132469177},{features:[[7,15,6,2,-1.],[7,16,6,1,2.]],threshold:8.9134991867467761e-004,right_val:0.6391963958740234,left_val:0.3984830975532532},{features:[[0,5,4,6,-1.],[0,7,4,2,3.]],threshold:-0.0152841797098517,right_val:0.5433713793754578,left_val:0.2366732954978943},{features:[[4,12,12,2,-1.],[8,12,4,2,3.]],threshold:4.8381411470472813e-003,right_val:0.3239189088344574,left_val:0.5817500948905945},{features:[[6,3,1,9,-1.],[6,6,1,3,3.]],threshold:-9.1093179071322083e-004,right_val:0.2911868989467621,left_val:0.5540593862533569},{features:[[10,17,3,2,-1.],[11,17,1,2,3.]],threshold:-6.1275060288608074e-003,right_val:0.5196629166603088,left_val:0.1775255054235458},{features:[[9,9,2,2,-1.],[9,10,2,1,2.]],threshold:-4.4576259097084403e-004,right_val:0.5533593893051148,left_val:0.3024170100688934},{features:[[7,6,6,4,-1.],[9,6,2,4,3.]],threshold:0.0226465407758951,right_val:0.6975377202033997,left_val:0.4414930939674377},{features:[[7,17,3,2,-1.],[8,17,1,2,3.]],threshold:-1.8804960418492556e-003,right_val:0.5497952103614807,left_val:0.2791394889354706},{features:[[10,17,3,3,-1.],[11,17,1,3,3.]],threshold:7.0889107882976532e-003,right_val:0.2385547012090683,left_val:0.5263199210166931},{features:[[8,12,3,2,-1.],[8,13,3,1,2.]],threshold:1.7318050377070904e-003,right_val:0.6983600854873657,left_val:0.4319379031658173},{features:[[9,3,6,2,-1.],[11,3,2,2,3.]],threshold:-6.8482700735330582e-003,right_val:0.5390920042991638,left_val:0.3082042932510376},{features:[[3,11,14,4,-1.],[3,13,14,2,2.]],threshold:-1.5062530110299122e-005,right_val:0.3120366036891937,left_val:0.5521922111511231},{features:[[1,10,18,4,-1.],[10,10,9,2,2.],[1,12,9,2,2.]],threshold:0.0294755697250366,right_val:0.1770603060722351,left_val:0.5401322841644287},{features:[[0,10,3,3,-1.],[0,11,3,1,3.]],threshold:8.1387329846620560e-003,right_val:0.1211019009351730,left_val:0.5178617835044861},{features:[[9,1,6,6,-1.],[11,1,2,6,3.]],threshold:0.0209429506212473,right_val:0.3311221897602081,left_val:0.5290294289588928},{features:[[8,7,3,6,-1.],[9,7,1,6,3.]],threshold:-9.5665529370307922e-003,right_val:0.4451968967914581,left_val:0.7471994161605835}],threshold:18.4129695892333980},{simpleClassifiers:[{features:[[1,0,18,9,-1.],[1,3,18,3,3.]],threshold:-2.8206960996612906e-004,right_val:0.6076732277870178,left_val:0.2064086049795151},{features:[[12,10,2,6,-1.],[12,13,2,3,2.]],threshold:1.6790600493550301e-003,right_val:0.1255383938550949,left_val:0.5851997137069702},{features:[[0,5,19,8,-1.],[0,9,19,4,2.]],threshold:6.9827912375330925e-004,right_val:0.5728961229324341,left_val:0.0940184295177460},{features:[[7,0,6,9,-1.],[9,0,2,9,3.]],threshold:7.8959012171253562e-004,right_val:0.5694308876991272,left_val:0.1781987994909287},{features:[[5,3,6,1,-1.],[7,3,2,1,3.]],threshold:-2.8560499195009470e-003,right_val:0.5788664817810059,left_val:0.1638399064540863},{features:[[11,3,6,1,-1.],[13,3,2,1,3.]],threshold:-3.8122469559311867e-003,right_val:0.5508564710617065,left_val:0.2085440009832382},{features:[[5,10,4,6,-1.],[5,13,4,3,2.]],threshold:1.5896620461717248e-003,right_val:0.1857215017080307,left_val:0.5702760815620422},{features:[[11,3,6,1,-1.],[13,3,2,1,3.]],threshold:0.0100783398374915,right_val:0.2189770042896271,left_val:0.5116943120956421},{features:[[4,4,12,6,-1.],[4,6,12,2,3.]],threshold:-0.0635263025760651,right_val:0.4043813049793243,left_val:0.7131379842758179},{features:[[15,12,2,6,-1.],[15,14,2,2,3.]],threshold:-9.1031491756439209e-003,right_val:0.5463973283767700,left_val:0.2567181885242462},{features:[[9,3,2,2,-1.],[10,3,1,2,2.]],threshold:-2.4035000242292881e-003,right_val:0.5590974092483521,left_val:0.1700665950775147},{features:[[9,3,3,1,-1.],[10,3,1,1,3.]],threshold:1.5226360410451889e-003,right_val:0.2619054019451141,left_val:0.5410556793212891},{features:[[1,1,4,14,-1.],[3,1,2,14,2.]],threshold:0.0179974399507046,right_val:0.6535220742225647,left_val:0.3732436895370483},{features:[[9,0,4,4,-1.],[11,0,2,2,2.],[9,2,2,2,2.]],threshold:-6.4538191072642803e-003,right_val:0.5537446141242981,left_val:0.2626481950283051},{features:[[7,5,1,14,-1.],[7,12,1,7,2.]],threshold:-0.0118807600811124,right_val:0.5544745922088623,left_val:0.2003753930330277},{features:[[19,0,1,4,-1.],[19,2,1,2,2.]],threshold:1.2713660253211856e-003,right_val:0.3031975924968720,left_val:0.5591902732849121},{features:[[5,5,6,4,-1.],[8,5,3,4,2.]],threshold:1.1376109905540943e-003,right_val:0.5646508932113648,left_val:0.2730407118797302},{features:[[9,18,3,2,-1.],[10,18,1,2,3.]],threshold:-4.2651998810470104e-003,right_val:0.5461820960044861,left_val:0.1405909061431885},{features:[[8,18,3,2,-1.],[9,18,1,2,3.]],threshold:-2.9602861031889915e-003,right_val:0.5459290146827698,left_val:0.1795035004615784},{features:[[4,5,12,6,-1.],[4,7,12,2,3.]],threshold:-8.8448226451873779e-003,right_val:0.2809219956398010,left_val:0.5736783146858215},{features:[[3,12,2,6,-1.],[3,14,2,2,3.]],threshold:-6.6430689767003059e-003,right_val:0.5503826141357422,left_val:0.2370675951242447},{features:[[10,8,2,12,-1.],[10,12,2,4,3.]],threshold:3.9997808635234833e-003,right_val:0.3304282128810883,left_val:0.5608199834823608},{features:[[7,18,3,2,-1.],[8,18,1,2,3.]],threshold:-4.1221720166504383e-003,right_val:0.5378993153572083,left_val:0.1640105992555618},{features:[[9,0,6,2,-1.],[11,0,2,2,3.]],threshold:0.0156249096617103,right_val:0.2288603931665421,left_val:0.5227649211883545},{features:[[5,11,9,3,-1.],[5,12,9,1,3.]],threshold:-0.0103564197197557,right_val:0.4252927899360657,left_val:0.7016193866729736},{features:[[9,0,6,2,-1.],[11,0,2,2,3.]],threshold:-8.7960809469223022e-003,right_val:0.5355830192565918,left_val:0.2767347097396851},{features:[[1,1,18,5,-1.],[7,1,6,5,3.]],threshold:0.1622693985700607,right_val:0.7442579269409180,left_val:0.4342240095138550},{features:[[8,0,4,4,-1.],[10,0,2,2,2.],[8,2,2,2,2.]],threshold:4.5542530715465546e-003,right_val:0.2582125067710877,left_val:0.5726485848426819},{features:[[3,12,1,3,-1.],[3,13,1,1,3.]],threshold:-2.1309209987521172e-003,right_val:0.5361018776893616,left_val:0.2106848061084747},{features:[[8,14,5,3,-1.],[8,15,5,1,3.]],threshold:-0.0132084200158715,right_val:0.4552468061447144,left_val:0.7593790888786316},{features:[[5,4,10,12,-1.],[5,4,5,6,2.],[10,10,5,6,2.]],threshold:-0.0659966766834259,right_val:0.5344039797782898,left_val:0.1252475976943970},{features:[[9,6,9,12,-1.],[9,10,9,4,3.]],threshold:7.9142656177282333e-003,right_val:0.5601043105125427,left_val:0.3315384089946747},{features:[[2,2,12,14,-1.],[2,2,6,7,2.],[8,9,6,7,2.]],threshold:0.0208942797034979,right_val:0.2768838107585907,left_val:0.5506049990653992}],threshold:15.3241395950317380},{simpleClassifiers:[{features:[[4,7,12,2,-1.],[8,7,4,2,3.]],threshold:1.1961159761995077e-003,right_val:0.6156241297721863,left_val:0.1762690991163254},{features:[[7,4,6,4,-1.],[7,6,6,2,2.]],threshold:-1.8679830245673656e-003,right_val:0.1832399964332581,left_val:0.6118106842041016},{features:[[4,5,11,8,-1.],[4,9,11,4,2.]],threshold:-1.9579799845814705e-004,right_val:0.5723816156387329,left_val:0.0990442633628845},{features:[[3,10,16,4,-1.],[3,12,16,2,2.]],threshold:-8.0255657667294145e-004,right_val:0.2377282977104187,left_val:0.5579879879951477},{features:[[0,0,16,2,-1.],[0,1,16,1,2.]],threshold:-2.4510810617357492e-003,right_val:0.5858935117721558,left_val:0.2231457978487015},{features:[[7,5,6,2,-1.],[9,5,2,2,3.]],threshold:5.0361850298941135e-004,right_val:0.5794103741645813,left_val:0.2653993964195252},{features:[[3,2,6,10,-1.],[3,2,3,5,2.],[6,7,3,5,2.]],threshold:4.0293349884450436e-003,right_val:0.2484865039587021,left_val:0.5803827047348023},{features:[[10,5,8,15,-1.],[10,10,8,5,3.]],threshold:-0.0144517095759511,right_val:0.5484204888343811,left_val:0.1830351948738098},{features:[[3,14,8,6,-1.],[3,14,4,3,2.],[7,17,4,3,2.]],threshold:2.0380979403853416e-003,right_val:0.6051092743873596,left_val:0.3363558948040009},{features:[[14,2,2,2,-1.],[14,3,2,1,2.]],threshold:-1.6155190533027053e-003,right_val:0.5441246032714844,left_val:0.2286642044782639},{features:[[1,10,7,6,-1.],[1,13,7,3,2.]],threshold:3.3458340913057327e-003,right_val:0.2392338067293167,left_val:0.5625913143157959},{features:[[15,4,4,3,-1.],[15,4,2,3,2.]],threshold:1.6379579901695251e-003,right_val:0.5964621901512146,left_val:0.3906993865966797},{features:[[2,9,14,6,-1.],[2,9,7,3,2.],[9,12,7,3,2.]],threshold:0.0302512105554342,right_val:0.1575746983289719,left_val:0.5248482227325440},{features:[[5,7,10,4,-1.],[5,9,10,2,2.]],threshold:0.0372519902884960,right_val:0.6748418807983398,left_val:0.4194310903549194},{features:[[6,9,8,8,-1.],[6,9,4,4,2.],[10,13,4,4,2.]],threshold:-0.0251097902655602,right_val:0.5473451018333435,left_val:0.1882549971342087},{features:[[14,1,3,2,-1.],[14,2,3,1,2.]],threshold:-5.3099058568477631e-003,right_val:0.5227110981941223,left_val:0.1339973062276840},{features:[[1,4,4,2,-1.],[3,4,2,2,2.]],threshold:1.2086479691788554e-003,right_val:0.6109635829925537,left_val:0.3762088119983673},{features:[[11,10,2,8,-1.],[11,14,2,4,2.]],threshold:-0.0219076797366142,right_val:0.5404006838798523,left_val:0.2663142979145050},{features:[[0,0,5,3,-1.],[0,1,5,1,3.]],threshold:5.4116579703986645e-003,right_val:0.2232273072004318,left_val:0.5363578796386719},{features:[[2,5,18,8,-1.],[11,5,9,4,2.],[2,9,9,4,2.]],threshold:0.0699463263154030,right_val:0.2453698068857193,left_val:0.5358232855796814},{features:[[6,6,1,6,-1.],[6,9,1,3,2.]],threshold:3.4520021290518343e-004,right_val:0.5376930236816406,left_val:0.2409671992063522},{features:[[19,1,1,3,-1.],[19,2,1,1,3.]],threshold:1.2627709656953812e-003,right_val:0.3155693113803864,left_val:0.5425856709480286},{features:[[7,6,6,6,-1.],[9,6,2,6,3.]],threshold:0.0227195098996162,right_val:0.6597865223884583,left_val:0.4158405959606171},{features:[[19,1,1,3,-1.],[19,2,1,1,3.]],threshold:-1.8111000536009669e-003,right_val:0.5505244731903076,left_val:0.2811253070831299},{features:[[3,13,2,3,-1.],[3,14,2,1,3.]],threshold:3.3469670452177525e-003,right_val:0.1891465038061142,left_val:0.5260028243064880},{features:[[8,4,8,12,-1.],[12,4,4,6,2.],[8,10,4,6,2.]],threshold:4.0791751234792173e-004,right_val:0.3344210088253021,left_val:0.5673509240150452},{features:[[5,2,6,3,-1.],[7,2,2,3,3.]],threshold:0.0127347996458411,right_val:0.2395612001419067,left_val:0.5343592166900635},{features:[[6,1,9,10,-1.],[6,6,9,5,2.]],threshold:-7.3119727894663811e-003,right_val:0.4022207856178284,left_val:0.6010890007019043},{features:[[0,4,6,12,-1.],[2,4,2,12,3.]],threshold:-0.0569487512111664,right_val:0.4543190896511078,left_val:0.8199151158332825},{features:[[15,13,2,3,-1.],[15,14,2,1,3.]],threshold:-5.0116591155529022e-003,right_val:0.5357710719108582,left_val:0.2200281023979187},{features:[[7,14,5,3,-1.],[7,15,5,1,3.]],threshold:6.0334368608891964e-003,right_val:0.7181751132011414,left_val:0.4413081109523773},{features:[[15,13,3,3,-1.],[15,14,3,1,3.]],threshold:3.9437441155314445e-003,right_val:0.2791733145713806,left_val:0.5478860735893250},{features:[[6,14,8,3,-1.],[6,15,8,1,3.]],threshold:-3.6591119132936001e-003,right_val:0.3989723920822144,left_val:0.6357867717742920},{features:[[15,13,3,3,-1.],[15,14,3,1,3.]],threshold:-3.8456181064248085e-003,right_val:0.5300664901733398,left_val:0.3493686020374298},{features:[[2,13,3,3,-1.],[2,14,3,1,3.]],threshold:-7.1926261298358440e-003,right_val:0.5229672789573669,left_val:0.1119614988565445},{features:[[4,7,12,12,-1.],[10,7,6,6,2.],[4,13,6,6,2.]],threshold:-0.0527989417314529,right_val:0.5453451275825501,left_val:0.2387102991342545},{features:[[9,7,2,6,-1.],[10,7,1,6,2.]],threshold:-7.9537667334079742e-003,right_val:0.4439376890659332,left_val:0.7586917877197266},{features:[[8,9,5,2,-1.],[8,10,5,1,2.]],threshold:-2.7344180271029472e-003,right_val:0.5489321947097778,left_val:0.2565476894378662},{features:[[8,6,3,4,-1.],[9,6,1,4,3.]],threshold:-1.8507939530536532e-003,right_val:0.4252474904060364,left_val:0.6734347939491272},{features:[[9,6,2,8,-1.],[9,10,2,4,2.]],threshold:0.0159189198166132,right_val:0.2292661964893341,left_val:0.5488352775573731},{features:[[7,7,3,6,-1.],[8,7,1,6,3.]],threshold:-1.2687679845839739e-003,right_val:0.4022389948368073,left_val:0.6104331016540527},{features:[[11,3,3,3,-1.],[12,3,1,3,3.]],threshold:6.2883910723030567e-003,right_val:0.1536193042993546,left_val:0.5310853123664856},{features:[[5,4,6,1,-1.],[7,4,2,1,3.]],threshold:-6.2259892001748085e-003,right_val:0.5241606235504150,left_val:0.1729111969470978},{features:[[5,6,10,3,-1.],[5,7,10,1,3.]],threshold:-0.0121325999498367,right_val:0.4325182139873505,left_val:0.6597759723663330}],threshold:21.0106391906738280},{simpleClassifiers:[{features:[[7,3,6,9,-1.],[7,6,6,3,3.]],threshold:-3.9184908382594585e-003,right_val:0.1469330936670303,left_val:0.6103435158729553},{features:[[6,7,9,1,-1.],[9,7,3,1,3.]],threshold:1.5971299726516008e-003,right_val:0.5896466970443726,left_val:0.2632363140583038},{features:[[2,8,16,8,-1.],[2,12,16,4,2.]],threshold:0.0177801102399826,right_val:0.1760361939668655,left_val:0.5872874259948731},{features:[[14,6,2,6,-1.],[14,9,2,3,2.]],threshold:6.5334769897162914e-004,right_val:0.5596066117286682,left_val:0.1567801982164383},{features:[[1,5,6,15,-1.],[1,10,6,5,3.]],threshold:-2.8353091329336166e-004,right_val:0.5732036232948303,left_val:0.1913153976202011},{features:[[10,0,6,9,-1.],[10,3,6,3,3.]],threshold:1.6104689566418529e-003,right_val:0.5623080730438232,left_val:0.2914913892745972},{features:[[6,6,7,14,-1.],[6,13,7,7,2.]],threshold:-0.0977506190538406,right_val:0.5648233294487000,left_val:0.1943476945161820},{features:[[13,7,3,6,-1.],[13,9,3,2,3.]],threshold:5.5182358482852578e-004,right_val:0.5504639744758606,left_val:0.3134616911411285},{features:[[1,8,15,4,-1.],[6,8,5,4,3.]],threshold:-0.0128582203760743,right_val:0.5760142803192139,left_val:0.2536481916904450},{features:[[11,2,3,10,-1.],[11,7,3,5,2.]],threshold:4.1530239395797253e-003,right_val:0.3659774065017700,left_val:0.5767722129821777},{features:[[3,7,4,6,-1.],[3,9,4,2,3.]],threshold:1.7092459602281451e-003,right_val:0.5918939113616943,left_val:0.2843191027641296},{features:[[13,3,6,10,-1.],[15,3,2,10,3.]],threshold:7.5217359699308872e-003,right_val:0.6183109283447266,left_val:0.4052427113056183},{features:[[5,7,8,10,-1.],[5,7,4,5,2.],[9,12,4,5,2.]],threshold:2.2479810286313295e-003,right_val:0.3135401010513306,left_val:0.5783755183219910},{features:[[4,4,12,12,-1.],[10,4,6,6,2.],[4,10,6,6,2.]],threshold:0.0520062111318111,right_val:0.1916636973619461,left_val:0.5541312098503113},{features:[[1,4,6,9,-1.],[3,4,2,9,3.]],threshold:0.0120855299755931,right_val:0.6644591093063355,left_val:0.4032655954360962},{features:[[11,3,2,5,-1.],[11,3,1,5,2.]],threshold:1.4687820112158079e-005,right_val:0.5709382891654968,left_val:0.3535977900028229},{features:[[7,3,2,5,-1.],[8,3,1,5,2.]],threshold:7.1395188570022583e-006,right_val:0.5610269904136658,left_val:0.3037444949150085},{features:[[10,14,2,3,-1.],[10,15,2,1,3.]],threshold:-4.6001640148460865e-003,right_val:0.4580326080322266,left_val:0.7181087136268616},{features:[[5,12,6,2,-1.],[8,12,3,2,2.]],threshold:2.0058949012309313e-003,right_val:0.2953684031963348,left_val:0.5621951818466187},{features:[[9,14,2,3,-1.],[9,15,2,1,3.]],threshold:4.5050270855426788e-003,right_val:0.7619017958641052,left_val:0.4615387916564941},{features:[[4,11,12,6,-1.],[4,14,12,3,2.]],threshold:0.0117468303069472,right_val:0.1772529035806656,left_val:0.5343837141990662},{features:[[11,11,5,9,-1.],[11,14,5,3,3.]],threshold:-0.0583163388073444,right_val:0.5340772271156311,left_val:0.1686245948076248},{features:[[6,15,3,2,-1.],[6,16,3,1,2.]],threshold:2.3629379575140774e-004,right_val:0.6026803851127625,left_val:0.3792056143283844},{features:[[11,0,3,5,-1.],[12,0,1,5,3.]],threshold:-7.8156180679798126e-003,right_val:0.5324323773384094,left_val:0.1512867063283920},{features:[[5,5,6,7,-1.],[8,5,3,7,2.]],threshold:-0.0108761601150036,right_val:0.5319945216178894,left_val:0.2081822007894516},{features:[[13,0,1,9,-1.],[13,3,1,3,3.]],threshold:-2.7745519764721394e-003,right_val:0.5210328102111816,left_val:0.4098246991634369},{features:[[3,2,4,8,-1.],[3,2,2,4,2.],[5,6,2,4,2.]],threshold:-7.8276381827890873e-004,right_val:0.3478842079639435,left_val:0.5693274140357971},{features:[[13,12,4,6,-1.],[13,14,4,2,3.]],threshold:0.0138704096898437,right_val:0.2257698029279709,left_val:0.5326750874519348},{features:[[3,12,4,6,-1.],[3,14,4,2,3.]],threshold:-0.0236749108880758,right_val:0.5200707912445068,left_val:0.1551305055618286},{features:[[13,11,3,4,-1.],[13,13,3,2,2.]],threshold:-1.4879409718560055e-005,right_val:0.3820176124572754,left_val:0.5500566959381104},{features:[[4,4,4,3,-1.],[4,5,4,1,3.]],threshold:3.6190641112625599e-003,right_val:0.6639748215675354,left_val:0.4238683879375458},{features:[[7,5,11,8,-1.],[7,9,11,4,2.]],threshold:-0.0198171101510525,right_val:0.5382357835769653,left_val:0.2150038033723831},{features:[[7,8,3,4,-1.],[8,8,1,4,3.]],threshold:-3.8154039066284895e-003,right_val:0.4215297102928162,left_val:0.6675711274147034},{features:[[9,1,6,1,-1.],[11,1,2,1,3.]],threshold:-4.9775829538702965e-003,right_val:0.5386328101158142,left_val:0.2267289012670517},{features:[[5,5,3,3,-1.],[5,6,3,1,3.]],threshold:2.2441020701080561e-003,right_val:0.6855735778808594,left_val:0.4308691024780273},{features:[[0,9,20,6,-1.],[10,9,10,3,2.],[0,12,10,3,2.]],threshold:0.0122824599966407,right_val:0.3467479050159454,left_val:0.5836614966392517},{features:[[8,6,3,5,-1.],[9,6,1,5,3.]],threshold:-2.8548699337989092e-003,right_val:0.4311453998088837,left_val:0.7016944885253906},{features:[[11,0,1,3,-1.],[11,1,1,1,3.]],threshold:-3.7875669077038765e-003,right_val:0.5224946141242981,left_val:0.2895345091819763},{features:[[4,2,4,2,-1.],[4,3,4,1,2.]],threshold:-1.2201230274513364e-003,right_val:0.5481644868850708,left_val:0.2975570857524872},{features:[[12,6,4,3,-1.],[12,7,4,1,3.]],threshold:0.0101605998352170,right_val:0.8182697892189026,left_val:0.4888817965984345},{features:[[5,0,6,4,-1.],[7,0,2,4,3.]],threshold:-0.0161745697259903,right_val:0.5239992737770081,left_val:0.1481492966413498},{features:[[9,7,3,8,-1.],[10,7,1,8,3.]],threshold:0.0192924607545137,right_val:0.7378190755844116,left_val:0.4786309897899628},{features:[[9,7,2,2,-1.],[10,7,1,2,2.]],threshold:-3.2479539513587952e-003,right_val:0.4470643997192383,left_val:0.7374222874641419},{features:[[6,7,14,4,-1.],[13,7,7,2,2.],[6,9,7,2,2.]],threshold:-9.3803480267524719e-003,right_val:0.5537996292114258,left_val:0.3489154875278473},{features:[[0,5,3,6,-1.],[0,7,3,2,3.]],threshold:-0.0126061299815774,right_val:0.5315443277359009,left_val:0.2379686981439591},{features:[[13,11,3,4,-1.],[13,13,3,2,2.]],threshold:-0.0256219301372766,right_val:0.5138769745826721,left_val:0.1964688003063202},{features:[[4,11,3,4,-1.],[4,13,3,2,2.]],threshold:-7.5741496402770281e-005,right_val:0.3365853130817413,left_val:0.5590522885322571},{features:[[5,9,12,8,-1.],[11,9,6,4,2.],[5,13,6,4,2.]],threshold:-0.0892108827829361,right_val:0.5162634849548340,left_val:0.0634046569466591},{features:[[9,12,1,3,-1.],[9,13,1,1,3.]],threshold:-2.7670480776578188e-003,right_val:0.4490706026554108,left_val:0.7323467731475830},{features:[[10,15,2,4,-1.],[10,17,2,2,2.]],threshold:2.7152578695677221e-004,right_val:0.5985518097877502,left_val:0.4114834964275360}],threshold:23.9187908172607420},{simpleClassifiers:[{features:[[7,7,6,1,-1.],[9,7,2,1,3.]],threshold:1.4786219689995050e-003,right_val:0.6643316745758057,left_val:0.2663545012474060},{features:[[12,3,6,6,-1.],[15,3,3,3,2.],[12,6,3,3,2.]],threshold:-1.8741659587249160e-003,right_val:0.2518512904644013,left_val:0.6143848896026611},{features:[[0,4,10,6,-1.],[0,6,10,2,3.]],threshold:-1.7151009524241090e-003,right_val:0.2397463023662567,left_val:0.5766341090202332},{features:[[8,3,8,14,-1.],[12,3,4,7,2.],[8,10,4,7,2.]],threshold:-1.8939269939437509e-003,right_val:0.2529144883155823,left_val:0.5682045817375183},{features:[[4,4,7,15,-1.],[4,9,7,5,3.]],threshold:-5.3006052039563656e-003,right_val:0.5556079745292664,left_val:0.1640675961971283},{features:[[12,2,6,8,-1.],[15,2,3,4,2.],[12,6,3,4,2.]],threshold:-0.0466625317931175,right_val:0.4762830138206482,left_val:0.6123154163360596},{features:[[2,2,6,8,-1.],[2,2,3,4,2.],[5,6,3,4,2.]],threshold:-7.9431332414969802e-004,right_val:0.2839404046535492,left_val:0.5707858800888062},{features:[[2,13,18,7,-1.],[8,13,6,7,3.]],threshold:0.0148916700854898,right_val:0.6006367206573486,left_val:0.4089672863483429},{features:[[4,3,8,14,-1.],[4,3,4,7,2.],[8,10,4,7,2.]],threshold:-1.2046529445797205e-003,right_val:0.2705289125442505,left_val:0.5712450742721558},{features:[[18,1,2,6,-1.],[18,3,2,2,3.]],threshold:6.0619381256401539e-003,right_val:0.3262225985527039,left_val:0.5262504220008850},{features:[[9,11,2,3,-1.],[9,12,2,1,3.]],threshold:-2.5286648888140917e-003,right_val:0.4199256896972656,left_val:0.6853830814361572},{features:[[18,1,2,6,-1.],[18,3,2,2,3.]],threshold:-5.9010218828916550e-003,right_val:0.5434812903404236,left_val:0.3266282081604004},{features:[[0,1,2,6,-1.],[0,3,2,2,3.]],threshold:5.6702760048210621e-003,right_val:0.2319003939628601,left_val:0.5468410849571228},{features:[[1,5,18,6,-1.],[1,7,18,2,3.]],threshold:-3.0304100364446640e-003,right_val:0.2708238065242767,left_val:0.5570667982101440},{features:[[0,2,6,7,-1.],[3,2,3,7,2.]],threshold:2.9803649522364140e-003,right_val:0.5890625715255737,left_val:0.3700568974018097},{features:[[7,3,6,14,-1.],[7,10,6,7,2.]],threshold:-0.0758405104279518,right_val:0.5419948101043701,left_val:0.2140070050954819},{features:[[3,7,13,10,-1.],[3,12,13,5,2.]],threshold:0.0192625392228365,right_val:0.2726590037345886,left_val:0.5526772141456604},{features:[[11,15,2,2,-1.],[11,16,2,1,2.]],threshold:1.8888259364757687e-004,right_val:0.6017209887504578,left_val:0.3958011865615845},{features:[[2,11,16,4,-1.],[2,11,8,2,2.],[10,13,8,2,2.]],threshold:0.0293695498257875,right_val:0.1435758024454117,left_val:0.5241373777389526},{features:[[13,7,6,4,-1.],[16,7,3,2,2.],[13,9,3,2,2.]],threshold:1.0417619487270713e-003,right_val:0.5929983258247376,left_val:0.3385409116744995},{features:[[6,10,3,9,-1.],[6,13,3,3,3.]],threshold:2.6125640142709017e-003,right_val:0.3021597862243652,left_val:0.5485377907752991},{features:[[14,6,1,6,-1.],[14,9,1,3,2.]],threshold:9.6977467183023691e-004,right_val:0.5532032847404480,left_val:0.3375276029109955},{features:[[5,10,4,1,-1.],[7,10,2,1,2.]],threshold:5.9512659208849072e-004,right_val:0.3359399139881134,left_val:0.5631743073463440},{features:[[3,8,15,5,-1.],[8,8,5,5,3.]],threshold:-0.1015655994415283,right_val:0.5230425000190735,left_val:0.0637350380420685},{features:[[1,6,5,4,-1.],[1,8,5,2,2.]],threshold:0.0361566990613937,right_val:0.1029528975486755,left_val:0.5136963129043579},{features:[[3,1,17,6,-1.],[3,3,17,2,3.]],threshold:3.4624140243977308e-003,right_val:0.5558289289474487,left_val:0.3879320025444031},{features:[[6,7,8,2,-1.],[10,7,4,2,2.]],threshold:0.0195549800992012,right_val:0.1875859946012497,left_val:0.5250086784362793},{features:[[9,7,3,2,-1.],[10,7,1,2,3.]],threshold:-2.3121440317481756e-003,right_val:0.4679641127586365,left_val:0.6672028899192810},{features:[[8,7,3,2,-1.],[9,7,1,2,3.]],threshold:-1.8605289515107870e-003,right_val:0.4334670901298523,left_val:0.7163379192352295},{features:[[8,9,4,2,-1.],[8,10,4,1,2.]],threshold:-9.4026362057775259e-004,right_val:0.5650203227996826,left_val:0.3021360933780670},{features:[[8,8,4,3,-1.],[8,9,4,1,3.]],threshold:-5.2418331615626812e-003,right_val:0.5250256061553955,left_val:0.1820009052753449},{features:[[9,5,6,4,-1.],[9,5,3,4,2.]],threshold:1.1729019752237946e-004,right_val:0.5445973277091980,left_val:0.3389188051223755},{features:[[8,13,4,3,-1.],[8,14,4,1,3.]],threshold:1.1878840159624815e-003,right_val:0.6253563165664673,left_val:0.4085349142551422},{features:[[4,7,12,6,-1.],[10,7,6,3,2.],[4,10,6,3,2.]],threshold:-0.0108813596889377,right_val:0.5700082778930664,left_val:0.3378399014472961},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:1.7354859737679362e-003,right_val:0.6523038744926453,left_val:0.4204635918140411},{features:[[9,7,3,3,-1.],[9,8,3,1,3.]],threshold:-6.5119052305817604e-003,right_val:0.5428143739700317,left_val:0.2595216035842896},{features:[[7,4,3,8,-1.],[8,4,1,8,3.]],threshold:-1.2136430013924837e-003,right_val:0.3977893888950348,left_val:0.6165143847465515},{features:[[10,0,3,6,-1.],[11,0,1,6,3.]],threshold:-0.0103542404249310,right_val:0.5219504833221436,left_val:0.1628028005361557},{features:[[6,3,4,8,-1.],[8,3,2,8,2.]],threshold:5.5858830455690622e-004,right_val:0.5503574013710022,left_val:0.3199650943279266},{features:[[14,3,6,13,-1.],[14,3,3,13,2.]],threshold:0.0152996499091387,right_val:0.6122388243675232,left_val:0.4103994071483612},{features:[[8,13,3,6,-1.],[8,16,3,3,2.]],threshold:-0.0215882100164890,right_val:0.5197384953498840,left_val:0.1034912988543510},{features:[[14,3,6,13,-1.],[14,3,3,13,2.]],threshold:-0.1283462941646576,right_val:0.4893102943897247,left_val:0.8493865132331848},{features:[[0,7,10,4,-1.],[0,7,5,2,2.],[5,9,5,2,2.]],threshold:-2.2927189711481333e-003,right_val:0.5471575260162354,left_val:0.3130157887935638},{features:[[14,3,6,13,-1.],[14,3,3,13,2.]],threshold:0.0799151062965393,right_val:0.6073989272117615,left_val:0.4856320917606354},{features:[[0,3,6,13,-1.],[3,3,3,13,2.]],threshold:-0.0794410929083824,right_val:0.4624533057212830,left_val:0.8394674062728882},{features:[[9,1,4,1,-1.],[9,1,2,1,2.]],threshold:-5.2800010889768600e-003,right_val:0.5306698083877564,left_val:0.1881695985794067},{features:[[8,0,2,1,-1.],[9,0,1,1,2.]],threshold:1.0463109938427806e-003,right_val:0.2583065927028656,left_val:0.5271229147911072},{features:[[10,16,4,4,-1.],[12,16,2,2,2.],[10,18,2,2,2.]],threshold:2.6317298761568964e-004,right_val:0.5735440850257874,left_val:0.4235304892063141},{features:[[9,6,2,3,-1.],[10,6,1,3,2.]],threshold:-3.6173160187900066e-003,right_val:0.4495444893836975,left_val:0.6934396028518677},{features:[[4,5,12,2,-1.],[8,5,4,2,3.]],threshold:0.0114218797534704,right_val:0.4138193130493164,left_val:0.5900921225547791},{features:[[8,7,3,5,-1.],[9,7,1,5,3.]],threshold:-1.9963278900831938e-003,right_val:0.4327239990234375,left_val:0.6466382741928101}],threshold:24.5278797149658200},{simpleClassifiers:[{features:[[6,4,8,6,-1.],[6,6,8,2,3.]],threshold:-9.9691245704889297e-003,right_val:0.2482212036848068,left_val:0.6142324209213257},{features:[[9,5,2,12,-1.],[9,11,2,6,2.]],threshold:7.3073059320449829e-004,right_val:0.2321965992450714,left_val:0.5704951882362366},{features:[[4,6,6,8,-1.],[4,10,6,4,2.]],threshold:6.4045301405712962e-004,right_val:0.5814933180809021,left_val:0.2112251967191696},{features:[[12,2,8,5,-1.],[12,2,4,5,2.]],threshold:4.5424019917845726e-003,right_val:0.5866311788558960,left_val:0.2950482070446014},{features:[[0,8,18,3,-1.],[0,9,18,1,3.]],threshold:9.2477443104144186e-005,right_val:0.5791326761245728,left_val:0.2990990877151489},{features:[[8,12,4,8,-1.],[8,16,4,4,2.]],threshold:-8.6603146046400070e-003,right_val:0.5635542273521423,left_val:0.2813029885292053},{features:[[0,2,8,5,-1.],[4,2,4,5,2.]],threshold:8.0515816807746887e-003,right_val:0.6054757237434387,left_val:0.3535369038581848},{features:[[13,11,3,4,-1.],[13,13,3,2,2.]],threshold:4.3835240649059415e-004,right_val:0.2731510996818543,left_val:0.5596532225608826},{features:[[5,11,6,1,-1.],[7,11,2,1,3.]],threshold:-9.8168973636347800e-005,right_val:0.3638561069965363,left_val:0.5978031754493713},{features:[[11,3,3,1,-1.],[12,3,1,1,3.]],threshold:-1.1298790341243148e-003,right_val:0.5432729125022888,left_val:0.2755252122879028},{features:[[7,13,5,3,-1.],[7,14,5,1,3.]],threshold:6.4356150105595589e-003,right_val:0.7069833278656006,left_val:0.4305641949176788},{features:[[11,11,7,6,-1.],[11,14,7,3,2.]],threshold:-0.0568293295800686,right_val:0.5294997096061707,left_val:0.2495242953300476},{features:[[2,11,7,6,-1.],[2,14,7,3,2.]],threshold:4.0668169967830181e-003,right_val:0.2497723996639252,left_val:0.5478553175926209},{features:[[12,14,2,6,-1.],[12,16,2,2,3.]],threshold:4.8164798499783501e-005,right_val:0.5706356167793274,left_val:0.3938601016998291},{features:[[8,14,3,3,-1.],[8,15,3,1,3.]],threshold:6.1795017682015896e-003,right_val:0.7394766807556152,left_val:0.4407606124877930},{features:[[11,0,3,5,-1.],[12,0,1,5,3.]],threshold:6.4985752105712891e-003,right_val:0.2479152977466583,left_val:0.5445243120193481},{features:[[6,1,4,9,-1.],[8,1,2,9,2.]],threshold:-1.0211090557277203e-003,right_val:0.5338971018791199,left_val:0.2544766962528229},{features:[[10,3,6,1,-1.],[12,3,2,1,3.]],threshold:-5.4247528314590454e-003,right_val:0.5324069261550903,left_val:0.2718858122825623},{features:[[8,8,3,4,-1.],[8,10,3,2,2.]],threshold:-1.0559899965301156e-003,right_val:0.5534508824348450,left_val:0.3178288042545319},{features:[[8,12,4,2,-1.],[8,13,4,1,2.]],threshold:6.6465808777138591e-004,right_val:0.6558194160461426,left_val:0.4284219145774841},{features:[[5,18,4,2,-1.],[5,19,4,1,2.]],threshold:-2.7524109464138746e-004,right_val:0.3810262978076935,left_val:0.5902860760688782},{features:[[2,1,18,6,-1.],[2,3,18,2,3.]],threshold:4.2293202131986618e-003,right_val:0.5709385871887207,left_val:0.3816489875316620},{features:[[6,0,3,2,-1.],[7,0,1,2,3.]],threshold:-3.2868210691958666e-003,right_val:0.5259544253349304,left_val:0.1747743934392929},{features:[[13,8,6,2,-1.],[16,8,3,1,2.],[13,9,3,1,2.]],threshold:1.5611879643984139e-004,right_val:0.5725612044334412,left_val:0.3601722121238709},{features:[[6,10,3,6,-1.],[6,13,3,3,2.]],threshold:-7.3621381488919724e-006,right_val:0.3044497072696686,left_val:0.5401858091354370},{features:[[0,13,20,4,-1.],[10,13,10,2,2.],[0,15,10,2,2.]],threshold:-0.0147672500461340,right_val:0.5573434829711914,left_val:0.3220770061016083},{features:[[7,7,6,5,-1.],[9,7,2,5,3.]],threshold:0.0244895908981562,right_val:0.6518812775611877,left_val:0.4301528036594391},{features:[[11,0,2,2,-1.],[11,1,2,1,2.]],threshold:-3.7652091123163700e-004,right_val:0.5598236918449402,left_val:0.3564583063125610},{features:[[1,8,6,2,-1.],[1,8,3,1,2.],[4,9,3,1,2.]],threshold:7.3657688517414499e-006,right_val:0.5561897754669190,left_val:0.3490782976150513},{features:[[0,2,20,2,-1.],[10,2,10,1,2.],[0,3,10,1,2.]],threshold:-0.0150999398902059,right_val:0.5335299968719482,left_val:0.1776272058486939},{features:[[7,14,5,3,-1.],[7,15,5,1,3.]],threshold:-3.8316650316119194e-003,right_val:0.4221394062042236,left_val:0.6149687767028809},{features:[[7,13,6,6,-1.],[10,13,3,3,2.],[7,16,3,3,2.]],threshold:0.0169254001230001,right_val:0.2166585028171539,left_val:0.5413014888763428},{features:[[9,12,2,3,-1.],[9,13,2,1,3.]],threshold:-3.0477850232273340e-003,right_val:0.4354617893695831,left_val:0.6449490785598755},{features:[[16,11,1,6,-1.],[16,13,1,2,3.]],threshold:3.2140589319169521e-003,right_val:0.3523217141628265,left_val:0.5400155186653137},{features:[[3,11,1,6,-1.],[3,13,1,2,3.]],threshold:-4.0023201145231724e-003,right_val:0.5338417291641235,left_val:0.2774524092674255},{features:[[4,4,14,12,-1.],[11,4,7,6,2.],[4,10,7,6,2.]],threshold:7.4182129465043545e-003,right_val:0.3702817857265472,left_val:0.5676739215850830},{features:[[5,4,3,3,-1.],[5,5,3,1,3.]],threshold:-8.8764587417244911e-003,right_val:0.4583688974380493,left_val:0.7749221920967102},{features:[[12,3,3,3,-1.],[13,3,1,3,3.]],threshold:2.7311739977449179e-003,right_val:0.3996661007404327,left_val:0.5338721871376038},{features:[[6,6,8,3,-1.],[6,7,8,1,3.]],threshold:-2.5082379579544067e-003,right_val:0.3777498900890350,left_val:0.5611963272094727},{features:[[12,3,3,3,-1.],[13,3,1,3,3.]],threshold:-8.0541074275970459e-003,right_val:0.5179182887077332,left_val:0.2915228903293610},{features:[[3,1,4,10,-1.],[3,1,2,5,2.],[5,6,2,5,2.]],threshold:-9.7938813269138336e-004,right_val:0.3700192868709564,left_val:0.5536432862281799},{features:[[5,7,10,2,-1.],[5,7,5,2,2.]],threshold:-5.8745909482240677e-003,right_val:0.5679376125335693,left_val:0.3754391074180603},{features:[[8,7,3,3,-1.],[9,7,1,3,3.]],threshold:-4.4936719350516796e-003,right_val:0.4480949938297272,left_val:0.7019699215888977},{features:[[15,12,2,3,-1.],[15,13,2,1,3.]],threshold:-5.4389229044318199e-003,right_val:0.5313386917114258,left_val:0.2310364991426468},{features:[[7,8,3,4,-1.],[8,8,1,4,3.]],threshold:-7.5094640487805009e-004,right_val:0.4129343032836914,left_val:0.5864868760108948},{features:[[13,4,1,12,-1.],[13,10,1,6,2.]],threshold:1.4528800420521293e-005,right_val:0.5619621276855469,left_val:0.3732407093048096},{features:[[4,5,12,12,-1.],[4,5,6,6,2.],[10,11,6,6,2.]],threshold:0.0407580696046352,right_val:0.2720521986484528,left_val:0.5312091112136841},{features:[[7,14,7,3,-1.],[7,15,7,1,3.]],threshold:6.6505931317806244e-003,right_val:0.6693493723869324,left_val:0.4710015952587128},{features:[[3,12,2,3,-1.],[3,13,2,1,3.]],threshold:4.5759351924061775e-003,right_val:0.1637275964021683,left_val:0.5167819261550903},{features:[[3,2,14,2,-1.],[10,2,7,1,2.],[3,3,7,1,2.]],threshold:6.5269311890006065e-003,right_val:0.2938531935214996,left_val:0.5397608876228333},{features:[[0,1,3,10,-1.],[1,1,1,10,3.]],threshold:-0.0136603796854615,right_val:0.4532200098037720,left_val:0.7086488008499146},{features:[[9,0,6,5,-1.],[11,0,2,5,3.]],threshold:0.0273588690906763,right_val:0.3589231967926025,left_val:0.5206481218338013},{features:[[5,7,6,2,-1.],[8,7,3,2,2.]],threshold:6.2197551596909761e-004,right_val:0.5441123247146606,left_val:0.3507075905799866},{features:[[7,1,6,10,-1.],[7,6,6,5,2.]],threshold:-3.3077080734074116e-003,right_val:0.4024891853332520,left_val:0.5859522819519043},{features:[[1,1,18,3,-1.],[7,1,6,3,3.]],threshold:-0.0106311095878482,right_val:0.4422602951526642,left_val:0.6743267178535461},{features:[[16,3,3,6,-1.],[16,5,3,2,3.]],threshold:0.0194416493177414,right_val:0.1797904968261719,left_val:0.5282716155052185}],threshold:27.1533508300781250},{simpleClassifiers:[{features:[[6,3,7,6,-1.],[6,6,7,3,2.]],threshold:-5.5052167735993862e-003,right_val:0.2626559138298035,left_val:0.5914731025695801},{features:[[4,7,12,2,-1.],[8,7,4,2,3.]],threshold:1.9562279339879751e-003,right_val:0.5741627216339111,left_val:0.2312581986188889},{features:[[0,4,17,10,-1.],[0,9,17,5,2.]],threshold:-8.8924784213304520e-003,right_val:0.5626654028892517,left_val:0.1656530052423477},{features:[[3,4,15,16,-1.],[3,12,15,8,2.]],threshold:0.0836383774876595,right_val:0.1957294940948486,left_val:0.5423449873924255},{features:[[7,15,6,4,-1.],[7,17,6,2,2.]],threshold:1.2282270472496748e-003,right_val:0.5992503762245178,left_val:0.3417904078960419},{features:[[15,2,4,9,-1.],[15,2,2,9,2.]],threshold:5.7629169896245003e-003,right_val:0.6079903841018677,left_val:0.3719581961631775},{features:[[2,3,3,2,-1.],[2,4,3,1,2.]],threshold:-1.6417410224676132e-003,right_val:0.5576915740966797,left_val:0.2577486038208008},{features:[[13,6,7,9,-1.],[13,9,7,3,3.]],threshold:3.4113149158656597e-003,right_val:0.5514171719551086,left_val:0.2950749099254608},{features:[[8,11,4,3,-1.],[8,12,4,1,3.]],threshold:-0.0110693201422691,right_val:0.4477078914642334,left_val:0.7569358944892883},{features:[[0,2,20,6,-1.],[10,2,10,3,2.],[0,5,10,3,2.]],threshold:0.0348659716546535,right_val:0.2669621109962463,left_val:0.5583708882331848},{features:[[3,2,6,10,-1.],[3,2,3,5,2.],[6,7,3,5,2.]],threshold:6.5701099811121821e-004,right_val:0.2988890111446381,left_val:0.5627313256263733},{features:[[13,10,3,4,-1.],[13,12,3,2,2.]],threshold:-0.0243391301482916,right_val:0.5108863115310669,left_val:0.2771185040473938},{features:[[4,10,3,4,-1.],[4,12,3,2,2.]],threshold:5.9435202274471521e-004,right_val:0.3120341897010803,left_val:0.5580651760101318},{features:[[7,5,6,3,-1.],[9,5,2,3,3.]],threshold:2.2971509024500847e-003,right_val:0.5679075717926025,left_val:0.3330250084400177},{features:[[7,6,6,8,-1.],[7,10,6,4,2.]],threshold:-3.7801829166710377e-003,right_val:0.5344808101654053,left_val:0.2990534901618958},{features:[[0,11,20,6,-1.],[0,14,20,3,2.]],threshold:-0.1342066973447800,right_val:0.5392568111419678,left_val:0.1463858932256699},{features:[[4,13,4,6,-1.],[4,13,2,3,2.],[6,16,2,3,2.]],threshold:7.5224548345431685e-004,right_val:0.5692734718322754,left_val:0.3746953904628754},{features:[[6,0,8,12,-1.],[10,0,4,6,2.],[6,6,4,6,2.]],threshold:-0.0405455417931080,right_val:0.5484297871589661,left_val:0.2754747867584229},{features:[[2,0,15,2,-1.],[2,1,15,1,2.]],threshold:1.2572970008477569e-003,right_val:0.5756075978279114,left_val:0.3744584023952484},{features:[[9,12,2,3,-1.],[9,13,2,1,3.]],threshold:-7.4249948374927044e-003,right_val:0.4728231132030487,left_val:0.7513859272003174},{features:[[3,12,1,2,-1.],[3,13,1,1,2.]],threshold:5.0908129196614027e-004,right_val:0.2932321131229401,left_val:0.5404896736145020},{features:[[9,11,2,3,-1.],[9,12,2,1,3.]],threshold:-1.2808450264856219e-003,right_val:0.4273349046707153,left_val:0.6169779896736145},{features:[[7,3,3,1,-1.],[8,3,1,1,3.]],threshold:-1.8348860321566463e-003,right_val:0.5206472277641296,left_val:0.2048496007919312},{features:[[17,7,3,6,-1.],[17,9,3,2,3.]],threshold:0.0274848695844412,right_val:0.1675522029399872,left_val:0.5252984762191773},{features:[[7,2,3,2,-1.],[8,2,1,2,3.]],threshold:2.2372419480234385e-003,right_val:0.2777658104896545,left_val:0.5267782807350159},{features:[[11,4,5,3,-1.],[11,5,5,1,3.]],threshold:-8.8635291904211044e-003,right_val:0.4812048971652985,left_val:0.6954557895660400},{features:[[4,4,5,3,-1.],[4,5,5,1,3.]],threshold:4.1753971017897129e-003,right_val:0.6349195837974548,left_val:0.4291887879371643},{features:[[19,3,1,2,-1.],[19,4,1,1,2.]],threshold:-1.7098189564421773e-003,right_val:0.5361248850822449,left_val:0.2930536866188049},{features:[[5,5,4,3,-1.],[5,6,4,1,3.]],threshold:6.5328548662364483e-003,right_val:0.7409694194793701,left_val:0.4495325088500977},{features:[[17,7,3,6,-1.],[17,9,3,2,3.]],threshold:-9.5372907817363739e-003,right_val:0.5416501760482788,left_val:0.3149119913578033},{features:[[0,7,3,6,-1.],[0,9,3,2,3.]],threshold:0.0253109894692898,right_val:0.1311707943677902,left_val:0.5121892094612122},{features:[[14,2,6,9,-1.],[14,5,6,3,3.]],threshold:0.0364609695971012,right_val:0.2591339945793152,left_val:0.5175911784172058},{features:[[0,4,5,6,-1.],[0,6,5,2,3.]],threshold:0.0208543296903372,right_val:0.1582316011190414,left_val:0.5137140154838562},{features:[[10,5,6,2,-1.],[12,5,2,2,3.]],threshold:-8.7207747856155038e-004,right_val:0.4398978948593140,left_val:0.5574309825897217},{features:[[4,5,6,2,-1.],[6,5,2,2,3.]],threshold:-1.5227000403683633e-005,right_val:0.3708069920539856,left_val:0.5548940896987915},{features:[[8,1,4,6,-1.],[8,3,4,2,3.]],threshold:-8.4316509310156107e-004,right_val:0.5554211139678955,left_val:0.3387419879436493},{features:[[0,2,3,6,-1.],[0,4,3,2,3.]],threshold:3.6037859972566366e-003,right_val:0.3411171138286591,left_val:0.5358061790466309},{features:[[6,6,8,3,-1.],[6,7,8,1,3.]],threshold:-6.8057891912758350e-003,right_val:0.4345862865447998,left_val:0.6125202775001526},{features:[[0,1,5,9,-1.],[0,4,5,3,3.]],threshold:-0.0470216609537601,right_val:0.5193738937377930,left_val:0.2358165979385376},{features:[[16,0,4,15,-1.],[16,0,2,15,2.]],threshold:-0.0369541086256504,right_val:0.4760943949222565,left_val:0.7323111295700073},{features:[[1,10,3,2,-1.],[1,11,3,1,2.]],threshold:1.0439479956403375e-003,right_val:0.3411330878734589,left_val:0.5419455170631409},{features:[[14,4,1,10,-1.],[14,9,1,5,2.]],threshold:-2.1050689974799752e-004,right_val:0.5554947257041931,left_val:0.2821694016456604},{features:[[0,1,4,12,-1.],[2,1,2,12,2.]],threshold:-0.0808315873146057,right_val:0.4697434902191162,left_val:0.9129930138587952},{features:[[11,11,4,2,-1.],[11,11,2,2,2.]],threshold:-3.6579059087671340e-004,right_val:0.3978292942047119,left_val:0.6022670269012451},{features:[[5,11,4,2,-1.],[7,11,2,2,2.]],threshold:-1.2545920617412776e-004,right_val:0.3845539987087250,left_val:0.5613213181495667},{features:[[3,8,15,5,-1.],[8,8,5,5,3.]],threshold:-0.0687864869832993,right_val:0.5300496816635132,left_val:0.2261611968278885},{features:[[0,0,6,10,-1.],[3,0,3,10,2.]],threshold:0.0124157899990678,right_val:0.5828812122344971,left_val:0.4075691998004913},{features:[[11,4,3,2,-1.],[12,4,1,2,3.]],threshold:-4.7174817882478237e-003,right_val:0.5267757773399353,left_val:0.2827253937721252},{features:[[8,12,3,8,-1.],[8,16,3,4,2.]],threshold:0.0381368584930897,right_val:0.1023615971207619,left_val:0.5074741244316101},{features:[[8,14,5,3,-1.],[8,15,5,1,3.]],threshold:-2.8168049175292253e-003,right_val:0.4359692931175232,left_val:0.6169006824493408},{features:[[7,14,4,3,-1.],[7,15,4,1,3.]],threshold:8.1303603947162628e-003,right_val:0.7606095075607300,left_val:0.4524433016777039},{features:[[11,4,3,2,-1.],[12,4,1,2,3.]],threshold:6.0056019574403763e-003,right_val:0.1859712004661560,left_val:0.5240408778190613},{features:[[3,15,14,4,-1.],[3,15,7,2,2.],[10,17,7,2,2.]],threshold:0.0191393196582794,right_val:0.2332071959972382,left_val:0.5209379196166992},{features:[[2,2,16,4,-1.],[10,2,8,2,2.],[2,4,8,2,2.]],threshold:0.0164457596838474,right_val:0.3264234960079193,left_val:0.5450702905654907},{features:[[0,8,6,12,-1.],[3,8,3,12,2.]],threshold:-0.0373568907380104,right_val:0.4533241987228394,left_val:0.6999046802520752},{features:[[5,7,10,2,-1.],[5,7,5,2,2.]],threshold:-0.0197279006242752,right_val:0.5412809848785400,left_val:0.2653664946556091},{features:[[9,7,2,5,-1.],[10,7,1,5,2.]],threshold:6.6972579807043076e-003,right_val:0.7138652205467224,left_val:0.4480566084384918},{features:[[13,7,6,4,-1.],[16,7,3,2,2.],[13,9,3,2,2.]],threshold:7.4457528535276651e-004,right_val:0.5471320152282715,left_val:0.4231350123882294},{features:[[0,13,8,2,-1.],[0,14,8,1,2.]],threshold:1.1790640419349074e-003,right_val:0.3130455017089844,left_val:0.5341702103614807},{features:[[13,7,6,4,-1.],[16,7,3,2,2.],[13,9,3,2,2.]],threshold:0.0349806100130081,right_val:0.3430530130863190,left_val:0.5118659734725952},{features:[[1,7,6,4,-1.],[1,7,3,2,2.],[4,9,3,2,2.]],threshold:5.6859792675822973e-004,right_val:0.5468639731407166,left_val:0.3532187044620514},{features:[[12,6,1,12,-1.],[12,12,1,6,2.]],threshold:-0.0113406497985125,right_val:0.5348700881004334,left_val:0.2842353880405426},{features:[[9,5,2,6,-1.],[10,5,1,6,2.]],threshold:-6.6228108480572701e-003,right_val:0.4492664933204651,left_val:0.6883640289306641},{features:[[14,12,2,3,-1.],[14,13,2,1,3.]],threshold:-8.0160330981016159e-003,right_val:0.5224308967590332,left_val:0.1709893941879273},{features:[[4,12,2,3,-1.],[4,13,2,1,3.]],threshold:1.4206819469109178e-003,right_val:0.2993383109569550,left_val:0.5290846228599548},{features:[[8,12,4,3,-1.],[8,13,4,1,3.]],threshold:-2.7801711112260818e-003,right_val:0.4460499882698059,left_val:0.6498854160308838},{features:[[5,2,2,4,-1.],[5,2,1,2,2.],[6,4,1,2,2.]],threshold:-1.4747589593753219e-003,right_val:0.5388113260269165,left_val:0.3260438144207001},{features:[[5,5,11,3,-1.],[5,6,11,1,3.]],threshold:-0.0238303393125534,right_val:0.4801219999790192,left_val:0.7528941035270691},{features:[[7,6,4,12,-1.],[7,12,4,6,2.]],threshold:6.9369790144264698e-003,right_val:0.3261427879333496,left_val:0.5335165858268738},{features:[[12,13,8,5,-1.],[12,13,4,5,2.]],threshold:8.2806255668401718e-003,right_val:0.5737829804420471,left_val:0.4580394029617310},{features:[[7,6,1,12,-1.],[7,12,1,6,2.]],threshold:-0.0104395002126694,right_val:0.5233827829360962,left_val:0.2592320144176483}],threshold:34.5541114807128910},{simpleClassifiers:[{features:[[1,2,6,3,-1.],[4,2,3,3,2.]],threshold:7.2006587870419025e-003,right_val:0.6849808096885681,left_val:0.3258886039257050},{features:[[9,5,6,10,-1.],[12,5,3,5,2.],[9,10,3,5,2.]],threshold:-2.8593589086085558e-003,right_val:0.2537829875946045,left_val:0.5838881134986877},{features:[[5,5,8,12,-1.],[5,5,4,6,2.],[9,11,4,6,2.]],threshold:6.8580528022721410e-004,right_val:0.2812424004077911,left_val:0.5708081722259522},{features:[[0,7,20,6,-1.],[0,9,20,2,3.]],threshold:7.9580191522836685e-003,right_val:0.5544260740280151,left_val:0.2501051127910614},{features:[[4,2,2,2,-1.],[4,3,2,1,2.]],threshold:-1.2124150525778532e-003,right_val:0.5433350205421448,left_val:0.2385368049144745},{features:[[4,18,12,2,-1.],[8,18,4,2,3.]],threshold:7.9426132142543793e-003,right_val:0.6220757961273193,left_val:0.3955070972442627},{features:[[7,4,4,16,-1.],[7,12,4,8,2.]],threshold:2.4630590341985226e-003,right_val:0.2992357909679413,left_val:0.5639708042144775},{features:[[7,6,7,8,-1.],[7,10,7,4,2.]],threshold:-6.0396599583327770e-003,right_val:0.5411676764488220,left_val:0.2186512947082520},{features:[[6,3,3,1,-1.],[7,3,1,1,3.]],threshold:-1.2988339876756072e-003,right_val:0.5364584922790527,left_val:0.2350706011056900},{features:[[11,15,2,4,-1.],[11,17,2,2,2.]],threshold:2.2299369447864592e-004,right_val:0.5729606151580811,left_val:0.3804112970829010},{features:[[3,5,4,8,-1.],[3,9,4,4,2.]],threshold:1.4654280385002494e-003,right_val:0.5258268713951111,left_val:0.2510167956352234},{features:[[7,1,6,12,-1.],[7,7,6,6,2.]],threshold:-8.1210042117163539e-004,right_val:0.3851158916950226,left_val:0.5992823839187622},{features:[[4,6,6,2,-1.],[6,6,2,2,3.]],threshold:-1.3836020370945334e-003,right_val:0.3636586964130402,left_val:0.5681396126747131},{features:[[16,4,4,6,-1.],[16,6,4,2,3.]],threshold:-0.0279364492744207,right_val:0.5377560257911682,left_val:0.1491317003965378},{features:[[3,3,5,2,-1.],[3,4,5,1,2.]],threshold:-4.6919551095925272e-004,right_val:0.5572484731674194,left_val:0.3692429959774017},{features:[[9,11,2,3,-1.],[9,12,2,1,3.]],threshold:-4.9829659983515739e-003,right_val:0.4532504081726074,left_val:0.6758509278297424},{features:[[2,16,4,2,-1.],[2,17,4,1,2.]],threshold:1.8815309740602970e-003,right_val:0.2932539880275726,left_val:0.5368022918701172},{features:[[7,13,6,6,-1.],[10,13,3,3,2.],[7,16,3,3,2.]],threshold:-0.0190675500780344,right_val:0.5330067276954651,left_val:0.1649377048015595},{features:[[7,0,3,4,-1.],[8,0,1,4,3.]],threshold:-4.6906559728085995e-003,right_val:0.5119361877441406,left_val:0.1963925957679749},{features:[[8,15,4,3,-1.],[8,16,4,1,3.]],threshold:5.9777139686048031e-003,right_val:0.7008398175239563,left_val:0.4671171903610230},{features:[[0,4,4,6,-1.],[0,6,4,2,3.]],threshold:-0.0333031304180622,right_val:0.5104162096977234,left_val:0.1155416965484619},{features:[[5,6,12,3,-1.],[9,6,4,3,3.]],threshold:0.0907441079616547,right_val:0.1306173056364059,left_val:0.5149660110473633},{features:[[7,6,6,14,-1.],[9,6,2,14,3.]],threshold:9.3555898638442159e-004,right_val:0.5439859032630920,left_val:0.3605481088161469},{features:[[9,7,3,3,-1.],[10,7,1,3,3.]],threshold:0.0149016501381993,right_val:0.7687569856643677,left_val:0.4886212050914764},{features:[[6,12,2,4,-1.],[6,14,2,2,2.]],threshold:6.1594118596985936e-004,right_val:0.3240939080715179,left_val:0.5356813073158264},{features:[[10,12,7,6,-1.],[10,14,7,2,3.]],threshold:-0.0506709888577461,right_val:0.5230404138565064,left_val:0.1848621964454651},{features:[[1,0,15,2,-1.],[1,1,15,1,2.]],threshold:6.8665749859064817e-004,right_val:0.5517945885658264,left_val:0.3840579986572266},{features:[[14,0,6,6,-1.],[14,0,3,6,2.]],threshold:8.3712432533502579e-003,right_val:0.6131753921508789,left_val:0.4288564026355743},{features:[[5,3,3,1,-1.],[6,3,1,1,3.]],threshold:-1.2953069526702166e-003,right_val:0.5280737876892090,left_val:0.2913674116134644},{features:[[14,0,6,6,-1.],[14,0,3,6,2.]],threshold:-0.0419416800141335,right_val:0.4856030941009522,left_val:0.7554799914360046},{features:[[0,3,20,10,-1.],[0,8,20,5,2.]],threshold:-0.0235293805599213,right_val:0.5256081223487854,left_val:0.2838279902935028},{features:[[14,0,6,6,-1.],[14,0,3,6,2.]],threshold:0.0408574491739273,right_val:0.6277297139167786,left_val:0.4870935082435608},{features:[[0,0,6,6,-1.],[3,0,3,6,2.]],threshold:-0.0254068691283464,right_val:0.4575029015541077,left_val:0.7099707722663879},{features:[[19,15,1,2,-1.],[19,16,1,1,2.]],threshold:-4.1415440500713885e-004,right_val:0.5469412207603455,left_val:0.4030886888504028},{features:[[0,2,4,8,-1.],[2,2,2,8,2.]],threshold:0.0218241196125746,right_val:0.6768701076507568,left_val:0.4502024054527283},{features:[[2,1,18,4,-1.],[11,1,9,2,2.],[2,3,9,2,2.]],threshold:0.0141140399500728,right_val:0.3791700005531311,left_val:0.5442860722541809},{features:[[8,12,1,2,-1.],[8,13,1,1,2.]],threshold:6.7214590671937913e-005,right_val:0.5873476266860962,left_val:0.4200463891029358},{features:[[5,2,10,6,-1.],[10,2,5,3,2.],[5,5,5,3,2.]],threshold:-7.9417638480663300e-003,right_val:0.5585265755653381,left_val:0.3792561888694763},{features:[[9,7,2,4,-1.],[10,7,1,4,2.]],threshold:-7.2144409641623497e-003,right_val:0.4603548943996429,left_val:0.7253103852272034},{features:[[9,7,3,3,-1.],[10,7,1,3,3.]],threshold:2.5817339774221182e-003,right_val:0.5900238752365112,left_val:0.4693301916122437},{features:[[4,5,12,8,-1.],[8,5,4,8,3.]],threshold:0.1340931951999664,right_val:0.1808844953775406,left_val:0.5149213075637817},{features:[[15,15,4,3,-1.],[15,16,4,1,3.]],threshold:2.2962710354477167e-003,right_val:0.3717867136001587,left_val:0.5399743914604187},{features:[[8,18,3,1,-1.],[9,18,1,1,3.]],threshold:-2.1575849968940020e-003,right_val:0.5148863792419434,left_val:0.2408495992422104},{features:[[9,13,4,3,-1.],[9,14,4,1,3.]],threshold:-4.9196188338100910e-003,right_val:0.4738740026950836,left_val:0.6573588252067566},{features:[[7,13,4,3,-1.],[7,14,4,1,3.]],threshold:1.6267469618469477e-003,right_val:0.6303114295005798,left_val:0.4192821979522705},{features:[[19,15,1,2,-1.],[19,16,1,1,2.]],threshold:3.3413388882763684e-004,right_val:0.3702101111412048,left_val:0.5540298223495483},{features:[[0,15,8,4,-1.],[0,17,8,2,2.]],threshold:-0.0266980808228254,right_val:0.5101410746574402,left_val:0.1710917949676514},{features:[[9,3,6,4,-1.],[11,3,2,4,3.]],threshold:-0.0305618792772293,right_val:0.5168793797492981,left_val:0.1904218047857285},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:2.8511548880487680e-003,right_val:0.6313853859901428,left_val:0.4447506964206696},{features:[[3,14,14,6,-1.],[3,16,14,2,3.]],threshold:-0.0362114794552326,right_val:0.5377349257469177,left_val:0.2490727007389069},{features:[[6,3,6,6,-1.],[6,6,6,3,2.]],threshold:-2.4115189444273710e-003,right_val:0.3664236962795258,left_val:0.5381243228912354},{features:[[5,11,10,6,-1.],[5,14,10,3,2.]],threshold:-7.7253201743587852e-004,right_val:0.3541550040245056,left_val:0.5530232191085815},{features:[[3,10,3,4,-1.],[4,10,1,4,3.]],threshold:2.9481729143299162e-004,right_val:0.5667243003845215,left_val:0.4132699072360992},{features:[[13,9,2,2,-1.],[13,9,1,2,2.]],threshold:-6.2334560789167881e-003,right_val:0.5198668837547302,left_val:0.0987872332334518},{features:[[5,3,6,4,-1.],[7,3,2,4,3.]],threshold:-0.0262747295200825,right_val:0.5028107166290283,left_val:0.0911274924874306},{features:[[9,7,3,3,-1.],[10,7,1,3,3.]],threshold:5.3212260827422142e-003,right_val:0.6222720742225647,left_val:0.4726648926734924},{features:[[2,12,2,3,-1.],[2,13,2,1,3.]],threshold:-4.1129058226943016e-003,right_val:0.5137804746627808,left_val:0.2157457023859024},{features:[[9,8,3,12,-1.],[9,12,3,4,3.]],threshold:3.2457809429615736e-003,right_val:0.3721776902675629,left_val:0.5410770773887634},{features:[[3,14,4,6,-1.],[3,14,2,3,2.],[5,17,2,3,2.]],threshold:-0.0163597092032433,right_val:0.4685291945934296,left_val:0.7787874937057495},{features:[[16,15,2,2,-1.],[16,16,2,1,2.]],threshold:3.2166109303943813e-004,right_val:0.4240373969078064,left_val:0.5478987097740173},{features:[[2,15,2,2,-1.],[2,16,2,1,2.]],threshold:6.4452440710738301e-004,right_val:0.3501324951648712,left_val:0.5330560803413391},{features:[[8,12,4,3,-1.],[8,13,4,1,3.]],threshold:-7.8909732401371002e-003,right_val:0.4726569056510925,left_val:0.6923521161079407},{features:[[0,7,20,1,-1.],[10,7,10,1,2.]],threshold:0.0483362115919590,right_val:0.0757492035627365,left_val:0.5055900216102600},{features:[[7,6,8,3,-1.],[7,6,4,3,2.]],threshold:-7.5178127735853195e-004,right_val:0.5538573861122131,left_val:0.3783741891384125},{features:[[5,7,8,2,-1.],[9,7,4,2,2.]],threshold:-2.4953910615295172e-003,right_val:0.5359612107276917,left_val:0.3081651031970978},{features:[[9,7,3,5,-1.],[10,7,1,5,3.]],threshold:-2.2385010961443186e-003,right_val:0.4649342894554138,left_val:0.6633958816528320},{features:[[8,7,3,5,-1.],[9,7,1,5,3.]],threshold:-1.7988430336117744e-003,right_val:0.4347187876701355,left_val:0.6596844792366028},{features:[[11,1,3,5,-1.],[12,1,1,5,3.]],threshold:8.7860915809869766e-003,right_val:0.2315579950809479,left_val:0.5231832861900330},{features:[[6,2,3,6,-1.],[7,2,1,6,3.]],threshold:3.6715380847454071e-003,right_val:0.2977376878261566,left_val:0.5204250216484070},{features:[[14,14,6,5,-1.],[14,14,3,5,2.]],threshold:-0.0353364497423172,right_val:0.4861505031585693,left_val:0.7238878011703491},{features:[[9,8,2,2,-1.],[9,9,2,1,2.]],threshold:-6.9189240457490087e-004,right_val:0.5229824781417847,left_val:0.3105022013187408},{features:[[10,7,1,3,-1.],[10,8,1,1,3.]],threshold:-3.3946109469980001e-003,right_val:0.5210173726081848,left_val:0.3138968050479889},{features:[[6,6,2,2,-1.],[6,6,1,1,2.],[7,7,1,1,2.]],threshold:9.8569283727556467e-004,right_val:0.6585097908973694,left_val:0.4536580145359039},{features:[[2,11,18,4,-1.],[11,11,9,2,2.],[2,13,9,2,2.]],threshold:-0.0501631014049053,right_val:0.5198916792869568,left_val:0.1804454028606415},{features:[[6,6,2,2,-1.],[6,6,1,1,2.],[7,7,1,1,2.]],threshold:-2.2367259953171015e-003,right_val:0.4651359021663666,left_val:0.7255702018737793},{features:[[0,15,20,2,-1.],[0,16,20,1,2.]],threshold:7.4326287722215056e-004,right_val:0.5898545980453491,left_val:0.4412921071052551},{features:[[4,14,2,3,-1.],[4,15,2,1,3.]],threshold:-9.3485182151198387e-004,right_val:0.5366017818450928,left_val:0.3500052988529205},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:0.0174979399889708,right_val:0.8315284848213196,left_val:0.4912194907665253},{features:[[8,7,2,3,-1.],[8,8,2,1,3.]],threshold:-1.5200000489130616e-003,right_val:0.5370560288429260,left_val:0.3570275902748108},{features:[[9,10,2,3,-1.],[9,11,2,1,3.]],threshold:7.8003940870985389e-004,right_val:0.5967335104942322,left_val:0.4353772103786469}],threshold:39.1072883605957030},{simpleClassifiers:[{features:[[5,4,10,4,-1.],[5,6,10,2,2.]],threshold:-9.9945552647113800e-003,right_val:0.3054533004760742,left_val:0.6162583231925964},{features:[[9,7,6,4,-1.],[12,7,3,2,2.],[9,9,3,2,2.]],threshold:-1.1085229925811291e-003,right_val:0.3155578076839447,left_val:0.5818294882774353},{features:[[4,7,3,6,-1.],[4,9,3,2,3.]],threshold:1.0364380432292819e-003,right_val:0.5692911744117737,left_val:0.2552052140235901},{features:[[11,15,4,4,-1.],[13,15,2,2,2.],[11,17,2,2,2.]],threshold:6.8211311008781195e-004,right_val:0.5934931039810181,left_val:0.3685089945793152},{features:[[7,8,4,2,-1.],[7,9,4,1,2.]],threshold:-6.8057340104132891e-004,right_val:0.5474792122840881,left_val:0.2332392036914825},{features:[[13,1,4,3,-1.],[13,1,2,3,2.]],threshold:2.6068789884448051e-004,right_val:0.5667545795440674,left_val:0.3257457017898560},{features:[[5,15,4,4,-1.],[5,15,2,2,2.],[7,17,2,2,2.]],threshold:5.1607372006401420e-004,right_val:0.5845472812652588,left_val:0.3744716942310333},{features:[[9,5,4,7,-1.],[9,5,2,7,2.]],threshold:8.5007521556690335e-004,right_val:0.5522807240486145,left_val:0.3420371115207672},{features:[[5,6,8,3,-1.],[9,6,4,3,2.]],threshold:-1.8607829697430134e-003,right_val:0.5375424027442932,left_val:0.2804419994354248},{features:[[9,9,2,2,-1.],[9,10,2,1,2.]],threshold:-1.5033970121294260e-003,right_val:0.5498952269554138,left_val:0.2579050958156586},{features:[[7,15,5,3,-1.],[7,16,5,1,3.]],threshold:2.3478909861296415e-003,right_val:0.6313710808753967,left_val:0.4175156056880951},{features:[[11,10,4,3,-1.],[11,10,2,3,2.]],threshold:-2.8880240279249847e-004,right_val:0.4052666127681732,left_val:0.5865169763565064},{features:[[6,9,8,10,-1.],[6,14,8,5,2.]],threshold:8.9405477046966553e-003,right_val:0.2318654060363770,left_val:0.5211141109466553},{features:[[10,11,6,2,-1.],[10,11,3,2,2.]],threshold:-0.0193277392536402,right_val:0.5241525769233704,left_val:0.2753432989120483},{features:[[4,11,6,2,-1.],[7,11,3,2,2.]],threshold:-2.0202060113660991e-004,right_val:0.3677195906639099,left_val:0.5722978711128235},{features:[[11,3,8,1,-1.],[11,3,4,1,2.]],threshold:2.1179069299250841e-003,right_val:0.5542430877685547,left_val:0.4466108083724976},{features:[[6,3,3,2,-1.],[7,3,1,2,3.]],threshold:-1.7743760254234076e-003,right_val:0.5300959944725037,left_val:0.2813253104686737},{features:[[14,5,6,5,-1.],[14,5,3,5,2.]],threshold:4.2234458960592747e-003,right_val:0.5795428156852722,left_val:0.4399709999561310},{features:[[7,5,2,12,-1.],[7,11,2,6,2.]],threshold:-0.0143752200528979,right_val:0.5292059183120728,left_val:0.2981117963790894},{features:[[8,11,4,3,-1.],[8,12,4,1,3.]],threshold:-0.0153491804376245,right_val:0.4748171865940094,left_val:0.7705215215682983},{features:[[4,1,2,3,-1.],[5,1,1,3,2.]],threshold:1.5152279956964776e-005,right_val:0.5576897263526917,left_val:0.3718844056129456},{features:[[18,3,2,6,-1.],[18,5,2,2,3.]],threshold:-9.1293919831514359e-003,right_val:0.5286766886711121,left_val:0.3615196049213409},{features:[[0,3,2,6,-1.],[0,5,2,2,3.]],threshold:2.2512159775942564e-003,right_val:0.3486298024654388,left_val:0.5364704728126526},{features:[[9,12,2,3,-1.],[9,13,2,1,3.]],threshold:-4.9696918576955795e-003,right_val:0.4676836133003235,left_val:0.6927651762962341},{features:[[7,13,4,3,-1.],[7,14,4,1,3.]],threshold:-0.0128290103748441,right_val:0.4660735130310059,left_val:0.7712153792381287},{features:[[18,0,2,6,-1.],[18,2,2,2,3.]],threshold:-9.3660065904259682e-003,right_val:0.5351287722587585,left_val:0.3374983966350555},{features:[[0,0,2,6,-1.],[0,2,2,2,3.]],threshold:3.2452319283038378e-003,right_val:0.3289610147476196,left_val:0.5325189828872681},{features:[[8,14,6,3,-1.],[8,15,6,1,3.]],threshold:-0.0117235602810979,right_val:0.4754300117492676,left_val:0.6837652921676636},{features:[[7,4,2,4,-1.],[8,4,1,4,2.]],threshold:2.9257940695970319e-005,right_val:0.5360502004623413,left_val:0.3572087883949280},{features:[[8,5,4,6,-1.],[8,7,4,2,3.]],threshold:-2.2244219508138485e-005,right_val:0.3552064001560211,left_val:0.5541427135467529},{features:[[6,4,2,2,-1.],[7,4,1,2,2.]],threshold:5.0881509669125080e-003,right_val:0.1256462037563324,left_val:0.5070844292640686},{features:[[3,14,14,4,-1.],[10,14,7,2,2.],[3,16,7,2,2.]],threshold:0.0274296794086695,right_val:0.1625818014144898,left_val:0.5269560217857361},{features:[[6,15,6,2,-1.],[6,15,3,1,2.],[9,16,3,1,2.]],threshold:-6.4142867922782898e-003,right_val:0.4584197103977203,left_val:0.7145588994026184},{features:[[14,15,6,2,-1.],[14,16,6,1,2.]],threshold:3.3479959238320589e-003,right_val:0.3494696915149689,left_val:0.5398612022399902},{features:[[2,12,12,8,-1.],[2,16,12,4,2.]],threshold:-0.0826354920864105,right_val:0.5160226225852966,left_val:0.2439192980527878},{features:[[7,7,7,2,-1.],[7,8,7,1,2.]],threshold:1.0261740535497665e-003,right_val:0.5767908096313477,left_val:0.3886891901493073},{features:[[0,2,18,2,-1.],[0,3,18,1,2.]],threshold:-1.6307090409100056e-003,right_val:0.5347700715065002,left_val:0.3389458060264587},{features:[[9,6,2,5,-1.],[9,6,1,5,2.]],threshold:2.4546680506318808e-003,right_val:0.6387246847152710,left_val:0.4601413905620575},{features:[[7,5,3,8,-1.],[8,5,1,8,3.]],threshold:-9.9476519972085953e-004,right_val:0.4120396077632904,left_val:0.5769879221916199},{features:[[9,6,3,4,-1.],[10,6,1,4,3.]],threshold:0.0154091902077198,right_val:0.7089822292327881,left_val:0.4878709018230438},{features:[[4,13,3,2,-1.],[4,14,3,1,2.]],threshold:1.1784400558099151e-003,right_val:0.2895244956016541,left_val:0.5263553261756897},{features:[[9,4,6,3,-1.],[11,4,2,3,3.]],threshold:-0.0277019198983908,right_val:0.5219606757164002,left_val:0.1498828977346420},{features:[[5,4,6,3,-1.],[7,4,2,3,3.]],threshold:-0.0295053999871016,right_val:0.4999816119670868,left_val:0.0248933192342520},{features:[[14,11,5,2,-1.],[14,12,5,1,2.]],threshold:4.5159430010244250e-004,right_val:0.4029662907123566,left_val:0.5464622974395752},{features:[[1,2,6,9,-1.],[3,2,2,9,3.]],threshold:7.1772639639675617e-003,right_val:0.5866296887397766,left_val:0.4271056950092316},{features:[[14,6,6,13,-1.],[14,6,3,13,2.]],threshold:-0.0741820484399796,right_val:0.4919027984142304,left_val:0.6874179244041443},{features:[[3,6,14,8,-1.],[3,6,7,4,2.],[10,10,7,4,2.]],threshold:-0.0172541607171297,right_val:0.5348739027976990,left_val:0.3370676040649414},{features:[[16,0,4,11,-1.],[16,0,2,11,2.]],threshold:0.0148515598848462,right_val:0.6129904985427856,left_val:0.4626792967319489},{features:[[3,4,12,12,-1.],[3,4,6,6,2.],[9,10,6,6,2.]],threshold:0.0100020002573729,right_val:0.3423453867435455,left_val:0.5346122980117798},{features:[[11,4,5,3,-1.],[11,5,5,1,3.]],threshold:2.0138120744377375e-003,right_val:0.5824304223060608,left_val:0.4643830060958862},{features:[[4,11,4,2,-1.],[4,12,4,1,2.]],threshold:1.5135470312088728e-003,right_val:0.2856149971485138,left_val:0.5196396112442017},{features:[[10,7,2,2,-1.],[10,7,1,2,2.]],threshold:3.1381431035697460e-003,right_val:0.5958529710769653,left_val:0.4838162958621979},{features:[[8,7,2,2,-1.],[9,7,1,2,2.]],threshold:-5.1450440660119057e-003,right_val:0.4741412103176117,left_val:0.8920302987098694},{features:[[9,17,3,2,-1.],[10,17,1,2,3.]],threshold:-4.4736708514392376e-003,right_val:0.5337278842926025,left_val:0.2033942937850952},{features:[[5,6,3,3,-1.],[5,7,3,1,3.]],threshold:1.9628470763564110e-003,right_val:0.6725863218307495,left_val:0.4571633934974670},{features:[[10,0,3,3,-1.],[11,0,1,3,3.]],threshold:5.4260450415313244e-003,right_val:0.2845670878887177,left_val:0.5271108150482178},{features:[[5,6,6,2,-1.],[5,6,3,1,2.],[8,7,3,1,2.]],threshold:4.9611460417509079e-004,right_val:0.5718597769737244,left_val:0.4138312935829163},{features:[[12,16,4,3,-1.],[12,17,4,1,3.]],threshold:9.3728788197040558e-003,right_val:0.2804847061634064,left_val:0.5225151181221008},{features:[[3,12,3,2,-1.],[3,13,3,1,2.]],threshold:6.0500897234305739e-004,right_val:0.3314523994922638,left_val:0.5236768722534180},{features:[[9,12,3,2,-1.],[9,13,3,1,2.]],threshold:5.6792551185935736e-004,right_val:0.6276971101760864,left_val:0.4531059861183167},{features:[[1,11,16,4,-1.],[1,11,8,2,2.],[9,13,8,2,2.]],threshold:0.0246443394571543,right_val:0.2017143964767456,left_val:0.5130851864814758},{features:[[12,4,3,3,-1.],[12,5,3,1,3.]],threshold:-0.0102904504165053,right_val:0.4876641035079956,left_val:0.7786595225334168},{features:[[4,4,5,3,-1.],[4,5,5,1,3.]],threshold:2.0629419013857841e-003,right_val:0.5881264209747315,left_val:0.4288598895072937},{features:[[12,16,4,3,-1.],[12,17,4,1,3.]],threshold:-5.0519481301307678e-003,right_val:0.5286008715629578,left_val:0.3523977994918823},{features:[[5,4,3,3,-1.],[5,5,3,1,3.]],threshold:-5.7692620903253555e-003,right_val:0.4588094055652618,left_val:0.6841086149215698},{features:[[9,0,2,2,-1.],[9,1,2,1,2.]],threshold:-4.5789941214025021e-004,right_val:0.5485978126525879,left_val:0.3565520048141480},{features:[[8,9,4,2,-1.],[8,10,4,1,2.]],threshold:-7.5918837683275342e-004,right_val:0.5254197120666504,left_val:0.3368793129920960},{features:[[8,8,4,3,-1.],[8,9,4,1,3.]],threshold:-1.7737259622663260e-003,right_val:0.5454015135765076,left_val:0.3422161042690277},{features:[[0,13,6,3,-1.],[2,13,2,3,3.]],threshold:-8.5610467940568924e-003,right_val:0.4485856890678406,left_val:0.6533612012863159},{features:[[16,14,3,2,-1.],[16,15,3,1,2.]],threshold:1.7277270089834929e-003,right_val:0.3925352990627289,left_val:0.5307580232620239},{features:[[1,18,18,2,-1.],[7,18,6,2,3.]],threshold:-0.0281996093690395,right_val:0.4588584005832672,left_val:0.6857458949089050},{features:[[16,14,3,2,-1.],[16,15,3,1,2.]],threshold:-1.7781109781935811e-003,right_val:0.5369856953620911,left_val:0.4037851095199585},{features:[[1,14,3,2,-1.],[1,15,3,1,2.]],threshold:3.3177141449414194e-004,right_val:0.3705750107765198,left_val:0.5399798750877380},{features:[[7,14,6,3,-1.],[7,15,6,1,3.]],threshold:2.6385399978607893e-003,right_val:0.6452730894088745,left_val:0.4665437042713165},{features:[[5,14,8,3,-1.],[5,15,8,1,3.]],threshold:-2.1183069329708815e-003,right_val:0.4064677059650421,left_val:0.5914781093597412},{features:[[10,6,4,14,-1.],[10,6,2,14,2.]],threshold:-0.0147732896730304,right_val:0.5294762849807739,left_val:0.3642038106918335},{features:[[6,6,4,14,-1.],[8,6,2,14,2.]],threshold:-0.0168154407292604,right_val:0.5144972801208496,left_val:0.2664231956005096},{features:[[13,5,2,3,-1.],[13,6,2,1,3.]],threshold:-6.3370140269398689e-003,right_val:0.4852097928524017,left_val:0.6779531240463257},{features:[[7,16,6,1,-1.],[9,16,2,1,3.]],threshold:-4.4560048991115764e-005,right_val:0.4153054058551788,left_val:0.5613964796066284},{features:[[9,12,3,3,-1.],[9,13,3,1,3.]],threshold:-1.0240620467811823e-003,right_val:0.4566304087638855,left_val:0.5964478254318237},{features:[[7,0,3,3,-1.],[8,0,1,3,3.]],threshold:-2.3161689750850201e-003,right_val:0.5188159942626953,left_val:0.2976115047931671},{features:[[4,0,16,18,-1.],[4,9,16,9,2.]],threshold:0.5321757197380066,right_val:0.2202631980180740,left_val:0.5187839269638062},{features:[[1,1,16,14,-1.],[1,8,16,7,2.]],threshold:-0.1664305031299591,right_val:0.5060343146324158,left_val:0.1866022944450378},{features:[[3,9,15,4,-1.],[8,9,5,4,3.]],threshold:0.1125352978706360,right_val:0.1185022965073586,left_val:0.5212125182151794},{features:[[6,12,7,3,-1.],[6,13,7,1,3.]],threshold:9.3046864494681358e-003,right_val:0.6826149225234985,left_val:0.4589937031269074},{features:[[14,15,2,3,-1.],[14,16,2,1,3.]],threshold:-4.6255099587142467e-003,right_val:0.5225008726119995,left_val:0.3079940974712372},{features:[[2,3,16,14,-1.],[2,3,8,7,2.],[10,10,8,7,2.]],threshold:-0.1111646965146065,right_val:0.5080801844596863,left_val:0.2101044058799744},{features:[[16,2,4,18,-1.],[18,2,2,9,2.],[16,11,2,9,2.]],threshold:-0.0108884396031499,right_val:0.4790464043617249,left_val:0.5765355229377747},{features:[[4,15,2,3,-1.],[4,16,2,1,3.]],threshold:5.8564301580190659e-003,right_val:0.1563598960638046,left_val:0.5065100193023682},{features:[[16,2,4,18,-1.],[18,2,2,9,2.],[16,11,2,9,2.]],threshold:0.0548543892800808,right_val:0.7230510711669922,left_val:0.4966914951801300},{features:[[1,1,8,3,-1.],[1,2,8,1,3.]],threshold:-0.0111973397433758,right_val:0.5098798274993897,left_val:0.2194979041814804},{features:[[8,11,4,3,-1.],[8,12,4,1,3.]],threshold:4.4069071300327778e-003,right_val:0.6770902872085571,left_val:0.4778401851654053},{features:[[5,11,5,9,-1.],[5,14,5,3,3.]],threshold:-0.0636652931571007,right_val:0.5081024169921875,left_val:0.1936362981796265},{features:[[16,0,4,11,-1.],[16,0,2,11,2.]],threshold:-9.8081491887569427e-003,right_val:0.4810341000556946,left_val:0.5999063253402710},{features:[[7,0,6,1,-1.],[9,0,2,1,3.]],threshold:-2.1717099007219076e-003,right_val:0.5235472917556763,left_val:0.3338333964347839},{features:[[16,3,3,7,-1.],[17,3,1,7,3.]],threshold:-0.0133155202493072,right_val:0.4919213056564331,left_val:0.6617069840431213},{features:[[1,3,3,7,-1.],[2,3,1,7,3.]],threshold:2.5442079640924931e-003,right_val:0.6082184910774231,left_val:0.4488744139671326},{features:[[7,8,6,12,-1.],[7,12,6,4,3.]],threshold:0.0120378397405148,right_val:0.3292432129383087,left_val:0.5409392118453980},{features:[[0,0,4,11,-1.],[2,0,2,11,2.]],threshold:-0.0207010507583618,right_val:0.4594995975494385,left_val:0.6819120049476624},{features:[[14,0,6,20,-1.],[14,0,3,20,2.]],threshold:0.0276082791388035,right_val:0.5767282843589783,left_val:0.4630792140960693},{features:[[0,3,1,2,-1.],[0,4,1,1,2.]],threshold:1.2370620388537645e-003,right_val:0.2635016143321991,left_val:0.5165379047393799},{features:[[5,5,10,8,-1.],[10,5,5,4,2.],[5,9,5,4,2.]],threshold:-0.0376693382859230,right_val:0.5278980135917664,left_val:0.2536393105983734},{features:[[4,7,12,4,-1.],[4,7,6,2,2.],[10,9,6,2,2.]],threshold:-1.8057259730994701e-003,right_val:0.5517500042915344,left_val:0.3985156118869782}],threshold:50.6104812622070310},{simpleClassifiers:[{features:[[2,1,6,4,-1.],[5,1,3,4,2.]],threshold:4.4299028813838959e-003,right_val:0.6335226297378540,left_val:0.2891018092632294},{features:[[9,7,6,4,-1.],[12,7,3,2,2.],[9,9,3,2,2.]],threshold:-2.3813319858163595e-003,right_val:0.3477487862110138,left_val:0.6211789250373840},{features:[[5,6,2,6,-1.],[5,9,2,3,2.]],threshold:2.2915711160749197e-003,right_val:0.5582118034362793,left_val:0.2254412025213242},{features:[[9,16,6,4,-1.],[12,16,3,2,2.],[9,18,3,2,2.]],threshold:9.9457940086722374e-004,right_val:0.5930070877075195,left_val:0.3711710870265961},{features:[[9,4,2,12,-1.],[9,10,2,6,2.]],threshold:7.7164667891338468e-004,right_val:0.3347995877265930,left_val:0.5651720166206360},{features:[[7,1,6,18,-1.],[9,1,2,18,3.]],threshold:-1.1386410333216190e-003,right_val:0.5508630871772766,left_val:0.3069126009941101},{features:[[4,12,12,2,-1.],[8,12,4,2,3.]],threshold:-1.6403039626311511e-004,right_val:0.3699047863483429,left_val:0.5762827992439270},{features:[[8,8,6,2,-1.],[8,9,6,1,2.]],threshold:2.9793529392918572e-005,right_val:0.5437911152839661,left_val:0.2644244134426117},{features:[[8,0,3,6,-1.],[9,0,1,6,3.]],threshold:8.5774902254343033e-003,right_val:0.1795724928379059,left_val:0.5051138997077942},{features:[[11,18,3,2,-1.],[11,19,3,1,2.]],threshold:-2.6032689493149519e-004,right_val:0.4446826875209808,left_val:0.5826969146728516},{features:[[1,1,17,4,-1.],[1,3,17,2,2.]],threshold:-6.1404630541801453e-003,right_val:0.5346971750259399,left_val:0.3113852143287659},{features:[[11,8,4,12,-1.],[11,8,2,12,2.]],threshold:-0.0230869501829147,right_val:0.5331197977066040,left_val:0.3277946114540100},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:-0.0142436502501369,right_val:0.4588063061237335,left_val:0.7381709814071655},{features:[[12,3,2,17,-1.],[12,3,1,17,2.]],threshold:0.0194871295243502,right_val:0.2274471968412399,left_val:0.5256630778312683},{features:[[4,7,6,1,-1.],[6,7,2,1,3.]],threshold:-9.6681108698248863e-004,right_val:0.3815006911754608,left_val:0.5511230826377869},{features:[[18,3,2,3,-1.],[18,4,2,1,3.]],threshold:3.1474709976464510e-003,right_val:0.2543726861476898,left_val:0.5425636768341065},{features:[[8,4,3,4,-1.],[8,6,3,2,2.]],threshold:-1.8026070029009134e-004,right_val:0.3406304121017456,left_val:0.5380191802978516},{features:[[4,5,12,10,-1.],[4,10,12,5,2.]],threshold:-6.0266260989010334e-003,right_val:0.5420572161674500,left_val:0.3035801947116852},{features:[[5,18,4,2,-1.],[7,18,2,2,2.]],threshold:4.4462960795499384e-004,right_val:0.5660110116004944,left_val:0.3990997076034546},{features:[[17,2,3,6,-1.],[17,4,3,2,3.]],threshold:2.2609760053455830e-003,right_val:0.3940688073635101,left_val:0.5562806725502014},{features:[[7,7,6,6,-1.],[9,7,2,6,3.]],threshold:0.0511330589652061,right_val:0.7118561863899231,left_val:0.4609653949737549},{features:[[17,2,3,6,-1.],[17,4,3,2,3.]],threshold:-0.0177863091230392,right_val:0.5322144031524658,left_val:0.2316166013479233},{features:[[8,0,3,4,-1.],[9,0,1,4,3.]],threshold:-4.9679628573358059e-003,right_val:0.5122029185295105,left_val:0.2330771982669830},{features:[[9,14,2,3,-1.],[9,15,2,1,3.]],threshold:2.0667689386755228e-003,right_val:0.6455488204956055,left_val:0.4657444059848785},{features:[[0,12,6,3,-1.],[0,13,6,1,3.]],threshold:7.4413768015801907e-003,right_val:0.2361633926630020,left_val:0.5154392123222351},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:-3.6277279723435640e-003,right_val:0.4476661086082459,left_val:0.6219773292541504},{features:[[3,12,2,3,-1.],[3,13,2,1,3.]],threshold:-5.3530759178102016e-003,right_val:0.5102208256721497,left_val:0.1837355047464371},{features:[[5,6,12,7,-1.],[9,6,4,7,3.]],threshold:0.1453091949224472,right_val:0.1535930931568146,left_val:0.5145987272262573},{features:[[0,2,3,6,-1.],[0,4,3,2,3.]],threshold:2.4394490756094456e-003,right_val:0.3624661862850189,left_val:0.5343660116195679},{features:[[14,6,1,3,-1.],[14,7,1,1,3.]],threshold:-3.1283390708267689e-003,right_val:0.4845592081546783,left_val:0.6215007901191711},{features:[[2,0,3,14,-1.],[3,0,1,14,3.]],threshold:1.7940260004252195e-003,right_val:0.5824198126792908,left_val:0.4299261868000031},{features:[[12,14,5,6,-1.],[12,16,5,2,3.]],threshold:0.0362538211047649,right_val:0.1439467966556549,left_val:0.5260334014892578},{features:[[4,14,5,6,-1.],[4,16,5,2,3.]],threshold:-5.1746722310781479e-003,right_val:0.5287045240402222,left_val:0.3506538867950440},{features:[[11,10,2,2,-1.],[12,10,1,1,2.],[11,11,1,1,2.]],threshold:6.5383297624066472e-004,right_val:0.6122040152549744,left_val:0.4809640944004059},{features:[[5,0,3,14,-1.],[6,0,1,14,3.]],threshold:-0.0264802295714617,right_val:0.5045586228370667,left_val:0.1139362007379532},{features:[[10,15,2,3,-1.],[10,16,2,1,3.]],threshold:-3.0440660193562508e-003,right_val:0.4794734120368958,left_val:0.6352095007896423},{features:[[0,2,2,3,-1.],[0,3,2,1,3.]],threshold:3.6993520334362984e-003,right_val:0.2498510926961899,left_val:0.5131118297576904},{features:[[5,11,12,6,-1.],[5,14,12,3,2.]],threshold:-3.6762931267730892e-004,right_val:0.3709532022476196,left_val:0.5421394705772400},{features:[[6,11,3,9,-1.],[6,14,3,3,3.]],threshold:-0.0413822606205940,right_val:0.5081691741943359,left_val:0.1894959956407547},{features:[[11,10,2,2,-1.],[12,10,1,1,2.],[11,11,1,1,2.]],threshold:-1.0532729793339968e-003,right_val:0.4783608913421631,left_val:0.6454367041587830},{features:[[5,6,1,3,-1.],[5,7,1,1,3.]],threshold:-2.1648600231856108e-003,right_val:0.4499826133251190,left_val:0.6215031147003174},{features:[[4,9,13,3,-1.],[4,10,13,1,3.]],threshold:-5.6747748749330640e-004,right_val:0.5419334769248962,left_val:0.3712610900402069},{features:[[1,7,15,6,-1.],[6,7,5,6,3.]],threshold:0.1737584024667740,right_val:0.1215742006897926,left_val:0.5023643970489502},{features:[[4,5,12,6,-1.],[8,5,4,6,3.]],threshold:-2.9049699660390615e-003,right_val:0.5381883978843689,left_val:0.3240267932415009},{features:[[8,10,4,3,-1.],[8,11,4,1,3.]],threshold:1.2299539521336555e-003,right_val:0.5703486204147339,left_val:0.4165507853031158},{features:[[15,14,1,3,-1.],[15,15,1,1,3.]],threshold:-5.4329237900674343e-004,right_val:0.5547549128532410,left_val:0.3854042887687683},{features:[[1,11,5,3,-1.],[1,12,5,1,3.]],threshold:-8.3297258242964745e-003,right_val:0.5097082853317261,left_val:0.2204494029283524},{features:[[7,1,7,12,-1.],[7,7,7,6,2.]],threshold:-1.0417630255687982e-004,right_val:0.4303036034107208,left_val:0.5607066154479981},{features:[[0,1,6,10,-1.],[0,1,3,5,2.],[3,6,3,5,2.]],threshold:0.0312047004699707,right_val:0.6982004046440125,left_val:0.4621657133102417},{features:[[16,1,4,3,-1.],[16,2,4,1,3.]],threshold:7.8943502157926559e-003,right_val:0.2269068062305450,left_val:0.5269594192504883},{features:[[5,5,2,3,-1.],[5,6,2,1,3.]],threshold:-4.3645310215651989e-003,right_val:0.4537956118583679,left_val:0.6359223127365112},{features:[[12,2,3,5,-1.],[13,2,1,5,3.]],threshold:7.6793059706687927e-003,right_val:0.2740483880043030,left_val:0.5274767875671387},{features:[[0,3,4,6,-1.],[0,5,4,2,3.]],threshold:-0.0254311393946409,right_val:0.5071732997894287,left_val:0.2038519978523254},{features:[[8,12,4,2,-1.],[8,13,4,1,2.]],threshold:8.2000601105391979e-004,right_val:0.6119868159294128,left_val:0.4587455093860626},{features:[[8,18,3,1,-1.],[9,18,1,1,3.]],threshold:2.9284600168466568e-003,right_val:0.2028204947710037,left_val:0.5071274042129517},{features:[[11,10,2,2,-1.],[12,10,1,1,2.],[11,11,1,1,2.]],threshold:4.5256470912136137e-005,right_val:0.5430821776390076,left_val:0.4812104105949402},{features:[[7,10,2,2,-1.],[7,10,1,1,2.],[8,11,1,1,2.]],threshold:1.3158309739083052e-003,right_val:0.6779323220252991,left_val:0.4625813961029053},{features:[[11,11,4,4,-1.],[11,13,4,2,2.]],threshold:1.5870389761403203e-003,right_val:0.3431465029716492,left_val:0.5386291742324829},{features:[[8,12,3,8,-1.],[9,12,1,8,3.]],threshold:-0.0215396601706743,right_val:0.5003222823143005,left_val:0.0259425006806850},{features:[[13,0,6,3,-1.],[13,1,6,1,3.]],threshold:0.0143344802781940,right_val:0.1590632945299149,left_val:0.5202844738960266},{features:[[8,8,3,4,-1.],[9,8,1,4,3.]],threshold:-8.3881383761763573e-003,right_val:0.4648044109344482,left_val:0.7282481193542481},{features:[[5,7,10,10,-1.],[10,7,5,5,2.],[5,12,5,5,2.]],threshold:9.1906841844320297e-003,right_val:0.3923191130161285,left_val:0.5562356710433960},{features:[[3,18,8,2,-1.],[3,18,4,1,2.],[7,19,4,1,2.]],threshold:-5.8453059755265713e-003,right_val:0.4629127979278565,left_val:0.6803392767906189},{features:[[10,2,6,8,-1.],[12,2,2,8,3.]],threshold:-0.0547077991068363,right_val:0.5206125974655151,left_val:0.2561671137809753},{features:[[4,2,6,8,-1.],[6,2,2,8,3.]],threshold:9.1142775490880013e-003,right_val:0.3053877055644989,left_val:0.5189620256423950},{features:[[11,0,3,7,-1.],[12,0,1,7,3.]],threshold:-0.0155750000849366,right_val:0.5169094800949097,left_val:0.1295074969530106},{features:[[7,11,2,1,-1.],[8,11,1,1,2.]],threshold:-1.2050600344082341e-004,right_val:0.4230825006961823,left_val:0.5735098123550415},{features:[[15,14,1,3,-1.],[15,15,1,1,3.]],threshold:1.2273970060050488e-003,right_val:0.4079791903495789,left_val:0.5289878249168396},{features:[[7,15,2,2,-1.],[7,15,1,1,2.],[8,16,1,1,2.]],threshold:-1.2186600361019373e-003,right_val:0.4574409127235413,left_val:0.6575639843940735},{features:[[15,14,1,3,-1.],[15,15,1,1,3.]],threshold:-3.3256649039685726e-003,right_val:0.5195019841194153,left_val:0.3628047108650208},{features:[[6,0,3,7,-1.],[7,0,1,7,3.]],threshold:-0.0132883097976446,right_val:0.5043488740921021,left_val:0.1284265965223312},{features:[[18,1,2,7,-1.],[18,1,1,7,2.]],threshold:-3.3839771058410406e-003,right_val:0.4757505953311920,left_val:0.6292240023612976},{features:[[2,0,8,20,-1.],[2,10,8,10,2.]],threshold:-0.2195422053337097,right_val:0.5065013766288757,left_val:0.1487731933593750},{features:[[3,0,15,6,-1.],[3,2,15,2,3.]],threshold:4.9111708067357540e-003,right_val:0.5665838718414307,left_val:0.4256102144718170},{features:[[4,3,12,2,-1.],[4,4,12,1,2.]],threshold:-1.8744950648397207e-004,right_val:0.5586857199668884,left_val:0.4004144072532654},{features:[[16,0,4,5,-1.],[16,0,2,5,2.]],threshold:-5.2178641781210899e-003,right_val:0.4812706112861633,left_val:0.6009116172790527},{features:[[7,0,3,4,-1.],[8,0,1,4,3.]],threshold:-1.1111519997939467e-003,right_val:0.5287089943885803,left_val:0.3514933884143829},{features:[[16,0,4,5,-1.],[16,0,2,5,2.]],threshold:4.4036400504410267e-003,right_val:0.5924085974693298,left_val:0.4642275869846344},{features:[[1,7,6,13,-1.],[3,7,2,13,3.]],threshold:0.1229949966073036,right_val:0.0691524818539619,left_val:0.5025529265403748},{features:[[16,0,4,5,-1.],[16,0,2,5,2.]],threshold:-0.0123135102912784,right_val:0.4934012889862061,left_val:0.5884591937065125},{features:[[0,0,4,5,-1.],[2,0,2,5,2.]],threshold:4.1471039876341820e-003,right_val:0.5893477797508240,left_val:0.4372239112854004},{features:[[14,12,3,6,-1.],[14,14,3,2,3.]],threshold:-3.5502649843692780e-003,right_val:0.5396270155906677,left_val:0.4327551126480103},{features:[[3,12,3,6,-1.],[3,14,3,2,3.]],threshold:-0.0192242693156004,right_val:0.5068330764770508,left_val:0.1913134008646011},{features:[[16,1,4,3,-1.],[16,2,4,1,3.]],threshold:1.4395059552043676e-003,right_val:0.4243533015251160,left_val:0.5308178067207336},{features:[[8,7,2,10,-1.],[8,7,1,5,2.],[9,12,1,5,2.]],threshold:-6.7751999013125896e-003,right_val:0.4540086090564728,left_val:0.6365395784378052},{features:[[11,11,4,4,-1.],[11,13,4,2,2.]],threshold:7.0119630545377731e-003,right_val:0.3026199936866760,left_val:0.5189834237098694},{features:[[0,1,4,3,-1.],[0,2,4,1,3.]],threshold:5.4014651104807854e-003,right_val:0.2557682991027832,left_val:0.5105062127113342},{features:[[13,4,1,3,-1.],[13,5,1,1,3.]],threshold:9.0274988906458020e-004,right_val:0.5861827731132507,left_val:0.4696914851665497},{features:[[7,15,3,5,-1.],[8,15,1,5,3.]],threshold:0.0114744501188397,right_val:0.1527177989482880,left_val:0.5053645968437195},{features:[[9,7,3,5,-1.],[10,7,1,5,3.]],threshold:-6.7023430019617081e-003,right_val:0.4890604019165039,left_val:0.6508980989456177},{features:[[8,7,3,5,-1.],[9,7,1,5,3.]],threshold:-2.0462959073483944e-003,right_val:0.4514600038528442,left_val:0.6241816878318787},{features:[[10,6,4,14,-1.],[10,6,2,14,2.]],threshold:-9.9951568990945816e-003,right_val:0.5400953888893127,left_val:0.3432781100273132},{features:[[0,5,5,6,-1.],[0,7,5,2,3.]],threshold:-0.0357007086277008,right_val:0.5074077844619751,left_val:0.1878059059381485},{features:[[9,5,6,4,-1.],[9,5,3,4,2.]],threshold:4.5584561303257942e-004,right_val:0.5402569770812988,left_val:0.3805277049541473},{features:[[0,0,18,10,-1.],[6,0,6,10,3.]],threshold:-0.0542606003582478,right_val:0.4595097005367279,left_val:0.6843714714050293},{features:[[10,6,4,14,-1.],[10,6,2,14,2.]],threshold:6.0600461438298225e-003,right_val:0.4500527977943420,left_val:0.5502905249595642},{features:[[6,6,4,14,-1.],[8,6,2,14,2.]],threshold:-6.4791832119226456e-003,right_val:0.5310757160186768,left_val:0.3368858098983765},{features:[[13,4,1,3,-1.],[13,5,1,1,3.]],threshold:-1.4939469983801246e-003,right_val:0.4756175875663757,left_val:0.6487640142440796},{features:[[5,1,2,3,-1.],[6,1,1,3,2.]],threshold:1.4610530342906713e-005,right_val:0.5451064109802246,left_val:0.4034579098224640},{features:[[18,1,2,18,-1.],[19,1,1,9,2.],[18,10,1,9,2.]],threshold:-7.2321938350796700e-003,right_val:0.4824739992618561,left_val:0.6386873722076416},{features:[[2,1,4,3,-1.],[2,2,4,1,3.]],threshold:-4.0645818226039410e-003,right_val:0.5157335996627808,left_val:0.2986421883106232},{features:[[18,1,2,18,-1.],[19,1,1,9,2.],[18,10,1,9,2.]],threshold:0.0304630808532238,right_val:0.7159956097602844,left_val:0.5022199749946594},{features:[[1,14,4,6,-1.],[1,14,2,3,2.],[3,17,2,3,2.]],threshold:-8.0544911324977875e-003,right_val:0.4619275033473969,left_val:0.6492452025413513},{features:[[10,11,7,6,-1.],[10,13,7,2,3.]],threshold:0.0395051389932632,right_val:0.2450613975524902,left_val:0.5150570869445801},{features:[[0,10,6,10,-1.],[0,10,3,5,2.],[3,15,3,5,2.]],threshold:8.4530208259820938e-003,right_val:0.6394037008285523,left_val:0.4573669135570526},{features:[[11,0,3,4,-1.],[12,0,1,4,3.]],threshold:-1.1688120430335402e-003,right_val:0.5483661293983460,left_val:0.3865512013435364},{features:[[5,10,5,6,-1.],[5,13,5,3,2.]],threshold:2.8070670086890459e-003,right_val:0.2701480090618134,left_val:0.5128579139709473},{features:[[14,6,1,8,-1.],[14,10,1,4,2.]],threshold:4.7365209320560098e-004,right_val:0.5387461185455322,left_val:0.4051581919193268},{features:[[1,7,18,6,-1.],[1,7,9,3,2.],[10,10,9,3,2.]],threshold:0.0117410803213716,right_val:0.3719413876533508,left_val:0.5295950174331665},{features:[[9,7,2,2,-1.],[9,7,1,2,2.]],threshold:3.1833238899707794e-003,right_val:0.6895126104354858,left_val:0.4789406955242157},{features:[[5,9,4,5,-1.],[7,9,2,5,2.]],threshold:7.0241501089185476e-004,right_val:0.3918080925941467,left_val:0.5384489297866821}],threshold:54.6200714111328130},{simpleClassifiers:[{features:[[7,6,6,3,-1.],[9,6,2,3,3.]],threshold:0.0170599296689034,right_val:0.7142534852027893,left_val:0.3948527872562408},{features:[[1,0,18,4,-1.],[7,0,6,4,3.]],threshold:0.0218408405780792,right_val:0.6090016961097717,left_val:0.3370316028594971},{features:[[7,15,2,4,-1.],[7,17,2,2,2.]],threshold:2.4520049919374287e-004,right_val:0.5987902283668518,left_val:0.3500576019287109},{features:[[1,0,19,9,-1.],[1,3,19,3,3.]],threshold:8.3272606134414673e-003,right_val:0.5697240829467773,left_val:0.3267528116703033},{features:[[3,7,3,6,-1.],[3,9,3,2,3.]],threshold:5.7148298947140574e-004,right_val:0.5531656742095947,left_val:0.3044599890708923},{features:[[13,7,4,4,-1.],[15,7,2,2,2.],[13,9,2,2,2.]],threshold:6.7373987985774875e-004,right_val:0.5672631263732910,left_val:0.3650012016296387},{features:[[3,7,4,4,-1.],[3,7,2,2,2.],[5,9,2,2,2.]],threshold:3.4681590477703139e-005,right_val:0.5388727188110352,left_val:0.3313541114330292},{features:[[9,6,10,8,-1.],[9,10,10,4,2.]],threshold:-5.8563398197293282e-003,right_val:0.5498778820037842,left_val:0.2697942852973938},{features:[[3,8,14,12,-1.],[3,14,14,6,2.]],threshold:8.5102273151278496e-003,right_val:0.2762879133224487,left_val:0.5269358158111572},{features:[[6,5,10,12,-1.],[11,5,5,6,2.],[6,11,5,6,2.]],threshold:-0.0698172077536583,right_val:0.5259246826171875,left_val:0.2909603118896484},{features:[[9,11,2,3,-1.],[9,12,2,1,3.]],threshold:-8.6113670840859413e-004,right_val:0.4073697924613953,left_val:0.5892577171325684},{features:[[9,5,6,5,-1.],[9,5,3,5,2.]],threshold:9.7149249631911516e-004,right_val:0.5415862202644348,left_val:0.3523564040660858},{features:[[9,4,2,4,-1.],[9,6,2,2,2.]],threshold:-1.4727490452060010e-005,right_val:0.3503156006336212,left_val:0.5423017740249634},{features:[[9,5,6,5,-1.],[9,5,3,5,2.]],threshold:0.0484202913939953,right_val:0.3411195874214172,left_val:0.5193945765495300},{features:[[5,5,6,5,-1.],[8,5,3,5,2.]],threshold:1.3257140526548028e-003,right_val:0.5335376262664795,left_val:0.3157769143581390},{features:[[11,2,6,1,-1.],[13,2,2,1,3.]],threshold:1.4922149603080470e-005,right_val:0.5536553859710693,left_val:0.4451299905776978},{features:[[3,2,6,1,-1.],[5,2,2,1,3.]],threshold:-2.7173398993909359e-003,right_val:0.5248088836669922,left_val:0.3031741976737976},{features:[[13,5,2,3,-1.],[13,6,2,1,3.]],threshold:2.9219500720500946e-003,right_val:0.6606041789054871,left_val:0.4781453013420105},{features:[[0,10,1,4,-1.],[0,12,1,2,2.]],threshold:-1.9804988987743855e-003,right_val:0.5287625193595886,left_val:0.3186308145523071},{features:[[13,5,2,3,-1.],[13,6,2,1,3.]],threshold:-4.0012109093368053e-003,right_val:0.4749928116798401,left_val:0.6413596868515015},{features:[[8,18,3,2,-1.],[9,18,1,2,3.]],threshold:-4.3491991236805916e-003,right_val:0.5098996758460999,left_val:0.1507498025894165},{features:[[6,15,9,2,-1.],[6,16,9,1,2.]],threshold:1.3490889687091112e-003,right_val:0.5881167054176331,left_val:0.4316158890724182},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:0.0185970701277256,right_val:0.9089794158935547,left_val:0.4735553860664368},{features:[[18,4,2,4,-1.],[18,6,2,2,2.]],threshold:-1.8562379991635680e-003,right_val:0.5577837228775024,left_val:0.3553189039230347},{features:[[5,5,2,3,-1.],[5,6,2,1,3.]],threshold:2.2940430790185928e-003,right_val:0.6580877900123596,left_val:0.4500094950199127},{features:[[15,16,3,2,-1.],[15,17,3,1,2.]],threshold:2.9982850537635386e-004,right_val:0.3975878953933716,left_val:0.5629242062568665},{features:[[0,0,3,9,-1.],[0,3,3,3,3.]],threshold:3.5455459728837013e-003,right_val:0.3605485856533051,left_val:0.5381547212600708},{features:[[9,7,3,3,-1.],[9,8,3,1,3.]],threshold:9.6104722470045090e-003,right_val:0.1796745955944061,left_val:0.5255997180938721},{features:[[8,7,3,3,-1.],[8,8,3,1,3.]],threshold:-6.2783220782876015e-003,right_val:0.5114030241966248,left_val:0.2272856980562210},{features:[[9,5,2,6,-1.],[9,5,1,6,2.]],threshold:3.4598479978740215e-003,right_val:0.6608219146728516,left_val:0.4626308083534241},{features:[[8,6,3,4,-1.],[9,6,1,4,3.]],threshold:-1.3112019514665008e-003,right_val:0.4436857998371124,left_val:0.6317539811134338},{features:[[7,6,8,12,-1.],[11,6,4,6,2.],[7,12,4,6,2.]],threshold:2.6876179035753012e-003,right_val:0.4054022133350372,left_val:0.5421109795570374},{features:[[5,6,8,12,-1.],[5,6,4,6,2.],[9,12,4,6,2.]],threshold:3.9118169806897640e-003,right_val:0.3273454904556274,left_val:0.5358477830886841},{features:[[12,4,3,3,-1.],[12,5,3,1,3.]],threshold:-0.0142064504325390,right_val:0.4975781142711639,left_val:0.7793576717376709},{features:[[2,16,3,2,-1.],[2,17,3,1,2.]],threshold:7.1705528534948826e-004,right_val:0.3560903966426849,left_val:0.5297319889068604},{features:[[12,4,3,3,-1.],[12,5,3,1,3.]],threshold:1.6635019565001130e-003,right_val:0.5816481709480286,left_val:0.4678094089031220},{features:[[2,12,6,6,-1.],[2,14,6,2,3.]],threshold:3.3686188980937004e-003,right_val:0.3446420133113861,left_val:0.5276734232902527},{features:[[7,13,6,3,-1.],[7,14,6,1,3.]],threshold:0.0127995302900672,right_val:0.7472159266471863,left_val:0.4834679961204529},{features:[[6,14,6,3,-1.],[6,15,6,1,3.]],threshold:3.3901201095432043e-003,right_val:0.6401721239089966,left_val:0.4511859118938446},{features:[[14,15,5,3,-1.],[14,16,5,1,3.]],threshold:4.7070779837667942e-003,right_val:0.3555220961570740,left_val:0.5335658788681030},{features:[[5,4,3,3,-1.],[5,5,3,1,3.]],threshold:1.4819339849054813e-003,right_val:0.5772724151611328,left_val:0.4250707030296326},{features:[[14,15,5,3,-1.],[14,16,5,1,3.]],threshold:-6.9995759986341000e-003,right_val:0.5292900204658508,left_val:0.3003320097923279},{features:[[5,3,6,2,-1.],[7,3,2,2,3.]],threshold:0.0159390103071928,right_val:0.1675581932067871,left_val:0.5067319273948669},{features:[[8,15,4,3,-1.],[8,16,4,1,3.]],threshold:7.6377349905669689e-003,right_val:0.7085601091384888,left_val:0.4795069992542267},{features:[[1,15,5,3,-1.],[1,16,5,1,3.]],threshold:6.7334040068089962e-003,right_val:0.2162470072507858,left_val:0.5133113265037537},{features:[[8,13,4,6,-1.],[10,13,2,3,2.],[8,16,2,3,2.]],threshold:-0.0128588099032640,right_val:0.5251371860504150,left_val:0.1938841938972473},{features:[[7,8,3,3,-1.],[8,8,1,3,3.]],threshold:-6.2270800117403269e-004,right_val:0.4197868108749390,left_val:0.5686538219451904},{features:[[12,0,5,4,-1.],[12,2,5,2,2.]],threshold:-5.2651681471616030e-004,right_val:0.5429695844650269,left_val:0.4224168956279755},{features:[[0,2,20,2,-1.],[0,2,10,1,2.],[10,3,10,1,2.]],threshold:0.0110750999301672,right_val:0.2514517903327942,left_val:0.5113775134086609},{features:[[1,0,18,4,-1.],[7,0,6,4,3.]],threshold:-0.0367282517254353,right_val:0.4849618971347809,left_val:0.7194662094116211},{features:[[4,3,6,1,-1.],[6,3,2,1,3.]],threshold:-2.8207109426148236e-004,right_val:0.5394446253776550,left_val:0.3840261995792389},{features:[[4,18,13,2,-1.],[4,19,13,1,2.]],threshold:-2.7489690110087395e-003,right_val:0.4569182097911835,left_val:0.5937088727951050},{features:[[2,10,3,6,-1.],[2,12,3,2,3.]],threshold:0.0100475195795298,right_val:0.2802298069000244,left_val:0.5138576030731201},{features:[[14,12,6,8,-1.],[17,12,3,4,2.],[14,16,3,4,2.]],threshold:-8.1497840583324432e-003,right_val:0.4636121094226837,left_val:0.6090037226676941},{features:[[4,13,10,6,-1.],[4,13,5,3,2.],[9,16,5,3,2.]],threshold:-6.8833888508379459e-003,right_val:0.5254660248756409,left_val:0.3458611071109772},{features:[[14,12,1,2,-1.],[14,13,1,1,2.]],threshold:-1.4039360394235700e-005,right_val:0.4082083106040955,left_val:0.5693104267120361},{features:[[8,13,4,3,-1.],[8,14,4,1,3.]],threshold:1.5498419525101781e-003,right_val:0.5806517004966736,left_val:0.4350537061691284},{features:[[14,12,2,2,-1.],[14,13,2,1,2.]],threshold:-6.7841499112546444e-003,right_val:0.5182775259017944,left_val:0.1468873023986816},{features:[[4,12,2,2,-1.],[4,13,2,1,2.]],threshold:2.1705629478674382e-004,right_val:0.3456174135208130,left_val:0.5293524265289307},{features:[[8,12,9,2,-1.],[8,13,9,1,2.]],threshold:3.1198898795992136e-004,right_val:0.5942413806915283,left_val:0.4652450978755951},{features:[[9,14,2,3,-1.],[9,15,2,1,3.]],threshold:5.4507530294358730e-003,right_val:0.7024846076965332,left_val:0.4653508961200714},{features:[[11,10,3,6,-1.],[11,13,3,3,2.]],threshold:-2.5818689027801156e-004,right_val:0.3768967092037201,left_val:0.5497295260429382},{features:[[5,6,9,12,-1.],[5,12,9,6,2.]],threshold:-0.0174425393342972,right_val:0.5457497835159302,left_val:0.3919087946414948},{features:[[11,10,3,6,-1.],[11,13,3,3,2.]],threshold:-0.0453435294330120,right_val:0.5154908895492554,left_val:0.1631357073783875},{features:[[6,10,3,6,-1.],[6,13,3,3,2.]],threshold:1.9190689781680703e-003,right_val:0.2791895866394043,left_val:0.5145897865295410},{features:[[5,4,11,3,-1.],[5,5,11,1,3.]],threshold:-6.0177869163453579e-003,right_val:0.4756332933902741,left_val:0.6517636179924011},{features:[[7,1,5,10,-1.],[7,6,5,5,2.]],threshold:-4.0720738470554352e-003,right_val:0.4092685878276825,left_val:0.5514652729034424},{features:[[2,8,18,2,-1.],[2,9,18,1,2.]],threshold:3.9855059003457427e-004,right_val:0.5285550951957703,left_val:0.3165240883827210},{features:[[7,17,5,3,-1.],[7,18,5,1,3.]],threshold:-6.5418570302426815e-003,right_val:0.4652808904647827,left_val:0.6853377819061279},{features:[[5,9,12,1,-1.],[9,9,4,1,3.]],threshold:3.4845089539885521e-003,right_val:0.4502759873867035,left_val:0.5484588146209717},{features:[[0,14,6,6,-1.],[0,14,3,3,2.],[3,17,3,3,2.]],threshold:-0.0136967804282904,right_val:0.4572555124759674,left_val:0.6395779848098755},{features:[[5,9,12,1,-1.],[9,9,4,1,3.]],threshold:-0.0173471402376890,right_val:0.5181614756584168,left_val:0.2751072943210602},{features:[[3,9,12,1,-1.],[7,9,4,1,3.]],threshold:-4.0885428898036480e-003,right_val:0.5194984078407288,left_val:0.3325636088848114},{features:[[14,10,6,7,-1.],[14,10,3,7,2.]],threshold:-9.4687901437282562e-003,right_val:0.4851819872856140,left_val:0.5942280888557434},{features:[[1,0,16,2,-1.],[1,1,16,1,2.]],threshold:1.7084840219467878e-003,right_val:0.5519806146621704,left_val:0.4167110919952393},{features:[[10,9,10,9,-1.],[10,12,10,3,3.]],threshold:9.4809094443917274e-003,right_val:0.4208514988422394,left_val:0.5433894991874695},{features:[[0,1,10,2,-1.],[5,1,5,2,2.]],threshold:-4.7389650717377663e-003,right_val:0.4560655057430267,left_val:0.6407189965248108},{features:[[17,3,2,3,-1.],[17,4,2,1,3.]],threshold:6.5761050209403038e-003,right_val:0.2258227020502091,left_val:0.5214555263519287},{features:[[1,3,2,3,-1.],[1,4,2,1,3.]],threshold:-2.1690549328923225e-003,right_val:0.5156704783439636,left_val:0.3151527941226959},{features:[[9,7,3,6,-1.],[10,7,1,6,3.]],threshold:0.0146601703017950,right_val:0.6689941287040710,left_val:0.4870837032794952},{features:[[6,5,4,3,-1.],[8,5,2,3,2.]],threshold:1.7231999663636088e-004,right_val:0.5251078009605408,left_val:0.3569748997688294},{features:[[7,5,6,6,-1.],[9,5,2,6,3.]],threshold:-0.0218037609010935,right_val:0.4966329932212830,left_val:0.8825920820236206},{features:[[3,4,12,12,-1.],[3,4,6,6,2.],[9,10,6,6,2.]],threshold:-0.0947361066937447,right_val:0.5061113834381104,left_val:0.1446162015199661},{features:[[9,2,6,15,-1.],[11,2,2,15,3.]],threshold:5.5825551971793175e-003,right_val:0.4238066077232361,left_val:0.5396478772163391},{features:[[2,2,6,17,-1.],[4,2,2,17,3.]],threshold:1.9517090404406190e-003,right_val:0.5497786998748779,left_val:0.4170410931110382},{features:[[14,10,6,7,-1.],[14,10,3,7,2.]],threshold:0.0121499001979828,right_val:0.5664274096488953,left_val:0.4698367118835449},{features:[[0,10,6,7,-1.],[3,10,3,7,2.]],threshold:-7.5169620104134083e-003,right_val:0.4463135898113251,left_val:0.6267772912979126},{features:[[9,2,6,15,-1.],[11,2,2,15,3.]],threshold:-0.0716679096221924,right_val:0.5221003293991089,left_val:0.3097011148929596},{features:[[5,2,6,15,-1.],[7,2,2,15,3.]],threshold:-0.0882924199104309,right_val:0.5006365180015564,left_val:0.0811238884925842},{features:[[17,9,3,6,-1.],[17,11,3,2,3.]],threshold:0.0310630798339844,right_val:0.1282255947589874,left_val:0.5155503749847412},{features:[[6,7,6,6,-1.],[8,7,2,6,3.]],threshold:0.0466218404471874,right_val:0.7363960742950440,left_val:0.4699777960777283},{features:[[1,10,18,6,-1.],[10,10,9,3,2.],[1,13,9,3,2.]],threshold:-0.0121894897893071,right_val:0.5518996715545654,left_val:0.3920530080795288},{features:[[0,9,10,9,-1.],[0,12,10,3,3.]],threshold:0.0130161102861166,right_val:0.3685136139392853,left_val:0.5260658264160156},{features:[[8,15,4,3,-1.],[8,16,4,1,3.]],threshold:-3.4952899441123009e-003,right_val:0.4716280996799469,left_val:0.6339294910430908},{features:[[5,12,3,4,-1.],[5,14,3,2,2.]],threshold:-4.4015039748046547e-005,right_val:0.3776184916496277,left_val:0.5333027243614197},{features:[[3,3,16,12,-1.],[3,9,16,6,2.]],threshold:-0.1096649020910263,right_val:0.5198346972465515,left_val:0.1765342056751251},{features:[[1,1,12,12,-1.],[1,1,6,6,2.],[7,7,6,6,2.]],threshold:-9.0279558207839727e-004,right_val:0.3838908076286316,left_val:0.5324159860610962},{features:[[10,4,2,4,-1.],[11,4,1,2,2.],[10,6,1,2,2.]],threshold:7.1126641705632210e-004,right_val:0.5755224227905273,left_val:0.4647929966449738},{features:[[0,9,10,2,-1.],[0,9,5,1,2.],[5,10,5,1,2.]],threshold:-3.1250279862433672e-003,right_val:0.5166770815849304,left_val:0.3236708939075470},{features:[[9,11,3,3,-1.],[9,12,3,1,3.]],threshold:2.4144679773598909e-003,right_val:0.6459717750549316,left_val:0.4787439107894898},{features:[[3,12,9,2,-1.],[3,13,9,1,2.]],threshold:4.4391240226104856e-004,right_val:0.6010255813598633,left_val:0.4409308135509491},{features:[[9,9,2,2,-1.],[9,10,2,1,2.]],threshold:-2.2611189342569560e-004,right_val:0.5493255853652954,left_val:0.4038113951683044}],threshold:50.1697311401367190},{simpleClassifiers:[{features:[[3,4,13,6,-1.],[3,6,13,2,3.]],threshold:-0.0469012893736362,right_val:0.3743801116943359,left_val:0.6600171923637390},{features:[[9,7,6,4,-1.],[12,7,3,2,2.],[9,9,3,2,2.]],threshold:-1.4568349579349160e-003,right_val:0.3437797129154205,left_val:0.5783991217613220},{features:[[1,0,6,8,-1.],[4,0,3,8,2.]],threshold:5.5598369799554348e-003,right_val:0.5908216238021851,left_val:0.3622266948223114},{features:[[9,5,2,12,-1.],[9,11,2,6,2.]],threshold:7.3170487303286791e-004,right_val:0.2873558104038239,left_val:0.5500419139862061},{features:[[4,4,3,10,-1.],[4,9,3,5,2.]],threshold:1.3318009441718459e-003,right_val:0.5431019067764282,left_val:0.2673169970512390},{features:[[6,17,8,3,-1.],[6,18,8,1,3.]],threshold:2.4347059661522508e-004,right_val:0.5741388797760010,left_val:0.3855027854442596},{features:[[0,5,10,6,-1.],[0,7,10,2,3.]],threshold:-3.0512469820678234e-003,right_val:0.3462845087051392,left_val:0.5503209829330444},{features:[[13,2,3,2,-1.],[13,3,3,1,2.]],threshold:-6.8657199153676629e-004,right_val:0.5429509282112122,left_val:0.3291221857070923},{features:[[7,5,4,5,-1.],[9,5,2,5,2.]],threshold:1.4668200165033340e-003,right_val:0.5351811051368713,left_val:0.3588382005691528},{features:[[12,14,3,6,-1.],[12,16,3,2,3.]],threshold:3.2021870720200241e-004,right_val:0.5700234174728394,left_val:0.4296841919422150},{features:[[1,11,8,2,-1.],[1,12,8,1,2.]],threshold:7.4122188379988074e-004,right_val:0.3366870880126953,left_val:0.5282164812088013},{features:[[7,13,6,3,-1.],[7,14,6,1,3.]],threshold:3.8330298848450184e-003,right_val:0.6257336139678955,left_val:0.4559567868709564},{features:[[0,5,3,6,-1.],[0,7,3,2,3.]],threshold:-0.0154564399272203,right_val:0.5129452943801880,left_val:0.2350116968154907},{features:[[13,2,3,2,-1.],[13,3,3,1,2.]],threshold:2.6796779129654169e-003,right_val:0.4155062139034271,left_val:0.5329415202140808},{features:[[4,14,4,6,-1.],[4,14,2,3,2.],[6,17,2,3,2.]],threshold:2.8296569362282753e-003,right_val:0.5804538130760193,left_val:0.4273087978363037},{features:[[13,2,3,2,-1.],[13,3,3,1,2.]],threshold:-3.9444249123334885e-003,right_val:0.5202686190605164,left_val:0.2912611961364746},{features:[[8,2,4,12,-1.],[8,6,4,4,3.]],threshold:2.7179559692740440e-003,right_val:0.3585677146911621,left_val:0.5307688117027283},{features:[[14,0,6,8,-1.],[17,0,3,4,2.],[14,4,3,4,2.]],threshold:5.9077627956867218e-003,right_val:0.5941585898399353,left_val:0.4703775048255920},{features:[[7,17,3,2,-1.],[8,17,1,2,3.]],threshold:-4.2240349575877190e-003,right_val:0.5088796019554138,left_val:0.2141567021608353},{features:[[8,12,4,2,-1.],[8,13,4,1,2.]],threshold:4.0725888684391975e-003,right_val:0.6841061115264893,left_val:0.4766413867473602},{features:[[6,0,8,12,-1.],[6,0,4,6,2.],[10,6,4,6,2.]],threshold:0.0101495301350951,right_val:0.3748497068881989,left_val:0.5360798835754395},{features:[[14,0,2,10,-1.],[15,0,1,5,2.],[14,5,1,5,2.]],threshold:-1.8864999583456665e-004,right_val:0.3853805065155029,left_val:0.5720130205154419},{features:[[5,3,8,6,-1.],[5,3,4,3,2.],[9,6,4,3,2.]],threshold:-4.8864358104765415e-003,right_val:0.5340958833694458,left_val:0.3693122863769531},{features:[[14,0,6,10,-1.],[17,0,3,5,2.],[14,5,3,5,2.]],threshold:0.0261584799736738,right_val:0.6059989929199219,left_val:0.4962374866008759},{features:[[9,14,1,2,-1.],[9,15,1,1,2.]],threshold:4.8560759751126170e-004,right_val:0.6012468934059143,left_val:0.4438945949077606},{features:[[15,10,4,3,-1.],[15,11,4,1,3.]],threshold:0.0112687097862363,right_val:0.1840388029813767,left_val:0.5244250297546387},{features:[[8,14,2,3,-1.],[8,15,2,1,3.]],threshold:-2.8114619199186563e-003,right_val:0.4409897029399872,left_val:0.6060283780097961},{features:[[3,13,14,4,-1.],[10,13,7,2,2.],[3,15,7,2,2.]],threshold:-5.6112729944288731e-003,right_val:0.5589237213134766,left_val:0.3891170918941498},{features:[[1,10,4,3,-1.],[1,11,4,1,3.]],threshold:8.5680093616247177e-003,right_val:0.2062619030475617,left_val:0.5069345831871033},{features:[[9,11,6,1,-1.],[11,11,2,1,3.]],threshold:-3.8172779022715986e-004,right_val:0.4192610979080200,left_val:0.5882201790809631},{features:[[5,11,6,1,-1.],[7,11,2,1,3.]],threshold:-1.7680290329735726e-004,right_val:0.4003368914127350,left_val:0.5533605813980103},{features:[[3,5,16,15,-1.],[3,10,16,5,3.]],threshold:6.5112537704408169e-003,right_val:0.5444191098213196,left_val:0.3310146927833557},{features:[[6,12,4,2,-1.],[8,12,2,2,2.]],threshold:-6.5948683186434209e-005,right_val:0.3944905996322632,left_val:0.5433831810951233},{features:[[4,4,12,10,-1.],[10,4,6,5,2.],[4,9,6,5,2.]],threshold:6.9939051754772663e-003,right_val:0.4192714095115662,left_val:0.5600358247756958},{features:[[8,6,3,4,-1.],[9,6,1,4,3.]],threshold:-4.6744439750909805e-003,right_val:0.4604960978031158,left_val:0.6685466766357422},{features:[[8,12,4,8,-1.],[10,12,2,4,2.],[8,16,2,4,2.]],threshold:0.0115898502990603,right_val:0.2926830053329468,left_val:0.5357121229171753},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:0.0130078401416540,right_val:0.7307463288307190,left_val:0.4679817855358124},{features:[[12,2,3,2,-1.],[13,2,1,2,3.]],threshold:-1.1008579749614000e-003,right_val:0.5415065288543701,left_val:0.3937501013278961},{features:[[8,15,3,2,-1.],[8,16,3,1,2.]],threshold:6.0472649056464434e-004,right_val:0.5604041218757629,left_val:0.4242376089096069},{features:[[6,0,9,14,-1.],[9,0,3,14,3.]],threshold:-0.0144948400557041,right_val:0.5293182730674744,left_val:0.3631210029125214},{features:[[9,6,2,3,-1.],[10,6,1,3,2.]],threshold:-5.3056948818266392e-003,right_val:0.4621821045875549,left_val:0.6860452294349670},{features:[[10,8,2,3,-1.],[10,9,2,1,3.]],threshold:-8.1829127157106996e-004,right_val:0.5420439243316650,left_val:0.3944096863269806},{features:[[0,9,4,6,-1.],[0,11,4,2,3.]],threshold:-0.0190775208175182,right_val:0.5037891864776611,left_val:0.1962621957063675},{features:[[6,0,8,2,-1.],[6,1,8,1,2.]],threshold:3.5549470339901745e-004,right_val:0.5613973140716553,left_val:0.4086259007453919},{features:[[6,14,7,3,-1.],[6,15,7,1,3.]],threshold:1.9679730758070946e-003,right_val:0.5926123261451721,left_val:0.4489121139049530},{features:[[8,10,8,9,-1.],[8,13,8,3,3.]],threshold:6.9189141504466534e-003,right_val:0.3728385865688324,left_val:0.5335925817489624},{features:[[5,2,3,2,-1.],[6,2,1,2,3.]],threshold:2.9872779268771410e-003,right_val:0.2975643873214722,left_val:0.5111321210861206},{features:[[14,1,6,8,-1.],[17,1,3,4,2.],[14,5,3,4,2.]],threshold:-6.2264618463814259e-003,right_val:0.4824537932872772,left_val:0.5541489720344544},{features:[[0,1,6,8,-1.],[0,1,3,4,2.],[3,5,3,4,2.]],threshold:0.0133533002808690,right_val:0.6414797902107239,left_val:0.4586423933506012},{features:[[1,2,18,6,-1.],[10,2,9,3,2.],[1,5,9,3,2.]],threshold:0.0335052385926247,right_val:0.3429994881153107,left_val:0.5392425060272217},{features:[[9,3,2,1,-1.],[10,3,1,1,2.]],threshold:-2.5294460356235504e-003,right_val:0.5013315081596375,left_val:0.1703713983297348},{features:[[13,2,4,6,-1.],[15,2,2,3,2.],[13,5,2,3,2.]],threshold:-1.2801629491150379e-003,right_val:0.4697405099868774,left_val:0.5305461883544922},{features:[[5,4,3,3,-1.],[5,5,3,1,3.]],threshold:7.0687388069927692e-003,right_val:0.6436504721641541,left_val:0.4615545868873596},{features:[[13,5,1,3,-1.],[13,6,1,1,3.]],threshold:9.6880499040707946e-004,right_val:0.6043894290924072,left_val:0.4833599030971527},{features:[[2,16,5,3,-1.],[2,17,5,1,3.]],threshold:3.9647659286856651e-003,right_val:0.3231816887855530,left_val:0.5187637209892273},{features:[[13,2,4,6,-1.],[15,2,2,3,2.],[13,5,2,3,2.]],threshold:-0.0220577307045460,right_val:0.5200980901718140,left_val:0.4079256951808929},{features:[[3,2,4,6,-1.],[3,2,2,3,2.],[5,5,2,3,2.]],threshold:-6.6906312713399529e-004,right_val:0.3815600872039795,left_val:0.5331609249114990},{features:[[13,5,1,2,-1.],[13,6,1,1,2.]],threshold:-6.7009328631684184e-004,right_val:0.4688901901245117,left_val:0.5655422210693359},{features:[[5,5,2,2,-1.],[5,6,2,1,2.]],threshold:7.4284552829340100e-004,right_val:0.6287400126457214,left_val:0.4534381031990051},{features:[[13,9,2,2,-1.],[13,9,1,2,2.]],threshold:2.2227810695767403e-003,right_val:0.3303655982017517,left_val:0.5350633263587952},{features:[[5,9,2,2,-1.],[6,9,1,2,2.]],threshold:-5.4130521602928638e-003,right_val:0.5005434751510620,left_val:0.1113687008619309},{features:[[13,17,3,2,-1.],[13,18,3,1,2.]],threshold:-1.4520040167553816e-005,right_val:0.4325133860111237,left_val:0.5628737807273865},{features:[[6,16,4,4,-1.],[6,16,2,2,2.],[8,18,2,2,2.]],threshold:2.3369169502984732e-004,right_val:0.5447791218757629,left_val:0.4165835082530975},{features:[[9,16,2,3,-1.],[9,17,2,1,3.]],threshold:4.2894547805190086e-003,right_val:0.6778649091720581,left_val:0.4860391020774841},{features:[[0,13,9,6,-1.],[0,15,9,2,3.]],threshold:5.9103150852024555e-003,right_val:0.3612113893032074,left_val:0.5262305140495300},{features:[[9,14,2,6,-1.],[9,17,2,3,2.]],threshold:0.0129005396738648,right_val:0.3250288069248200,left_val:0.5319377183914185},{features:[[9,15,2,3,-1.],[9,16,2,1,3.]],threshold:4.6982979401946068e-003,right_val:0.6665925979614258,left_val:0.4618245065212250},{features:[[1,10,18,6,-1.],[1,12,18,2,3.]],threshold:0.0104398597031832,right_val:0.3883604109287262,left_val:0.5505670905113220},{features:[[8,11,4,2,-1.],[8,12,4,1,2.]],threshold:3.0443191062659025e-003,right_val:0.7301844954490662,left_val:0.4697853028774262},{features:[[7,9,6,2,-1.],[7,10,6,1,2.]],threshold:-6.1593751888722181e-004,right_val:0.5464984178543091,left_val:0.3830839097499847},{features:[[8,8,2,3,-1.],[8,9,2,1,3.]],threshold:-3.4247159492224455e-003,right_val:0.5089530944824219,left_val:0.2566300034523010},{features:[[17,5,3,4,-1.],[18,5,1,4,3.]],threshold:-9.3538565561175346e-003,right_val:0.4940795898437500,left_val:0.6469966173171997},{features:[[1,19,18,1,-1.],[7,19,6,1,3.]],threshold:0.0523389987647533,right_val:0.7878770828247070,left_val:0.4745982885360718},{features:[[9,0,3,2,-1.],[10,0,1,2,3.]],threshold:3.5765620414167643e-003,right_val:0.2748498022556305,left_val:0.5306664705276489},{features:[[1,8,1,6,-1.],[1,10,1,2,3.]],threshold:7.1555317845195532e-004,right_val:0.4041908979415894,left_val:0.5413125753402710},{features:[[12,17,8,3,-1.],[12,17,4,3,2.]],threshold:-0.0105166798457503,right_val:0.4815283119678497,left_val:0.6158512234687805},{features:[[0,5,3,4,-1.],[1,5,1,4,3.]],threshold:7.7347927726805210e-003,right_val:0.7028980851173401,left_val:0.4695805907249451},{features:[[9,7,2,3,-1.],[9,8,2,1,3.]],threshold:-4.3226778507232666e-003,right_val:0.5304684042930603,left_val:0.2849566042423248},{features:[[7,11,2,2,-1.],[7,11,1,1,2.],[8,12,1,1,2.]],threshold:-2.5534399319440126e-003,right_val:0.4688892066478729,left_val:0.7056984901428223},{features:[[11,3,2,5,-1.],[11,3,1,5,2.]],threshold:1.0268510231981054e-004,right_val:0.5573464035987854,left_val:0.3902932107448578},{features:[[7,3,2,5,-1.],[8,3,1,5,2.]],threshold:7.1395188570022583e-006,right_val:0.5263987779617310,left_val:0.3684231936931610},{features:[[15,13,2,3,-1.],[15,14,2,1,3.]],threshold:-1.6711989883333445e-003,right_val:0.5387271046638489,left_val:0.3849175870418549},{features:[[5,6,2,3,-1.],[5,7,2,1,3.]],threshold:4.9260449595749378e-003,right_val:0.7447251081466675,left_val:0.4729771912097931},{features:[[4,19,15,1,-1.],[9,19,5,1,3.]],threshold:4.3908702209591866e-003,right_val:0.5591921806335449,left_val:0.4809181094169617},{features:[[1,19,15,1,-1.],[6,19,5,1,3.]],threshold:-0.0177936293184757,right_val:0.4676927030086517,left_val:0.6903678178787231},{features:[[15,13,2,3,-1.],[15,14,2,1,3.]],threshold:2.0469669252634048e-003,right_val:0.3308162093162537,left_val:0.5370690226554871},{features:[[5,0,4,15,-1.],[7,0,2,15,2.]],threshold:0.0298914890736341,right_val:0.3309059143066406,left_val:0.5139865279197693},{features:[[9,6,2,5,-1.],[9,6,1,5,2.]],threshold:1.5494900289922953e-003,right_val:0.6078342795372009,left_val:0.4660237133502960},{features:[[9,5,2,7,-1.],[10,5,1,7,2.]],threshold:1.4956969534978271e-003,right_val:0.5863919854164124,left_val:0.4404835999011993},{features:[[16,11,3,3,-1.],[16,12,3,1,3.]],threshold:9.5885928021743894e-004,right_val:0.4208523035049439,left_val:0.5435971021652222},{features:[[1,11,3,3,-1.],[1,12,3,1,3.]],threshold:4.9643701640889049e-004,right_val:0.4000622034072876,left_val:0.5370578169822693},{features:[[6,6,8,3,-1.],[6,7,8,1,3.]],threshold:-2.7280810754746199e-003,right_val:0.4259642958641052,left_val:0.5659412741661072},{features:[[0,15,6,2,-1.],[0,16,6,1,2.]],threshold:2.3026480339467525e-003,right_val:0.3350869119167328,left_val:0.5161657929420471},{features:[[1,0,18,6,-1.],[7,0,6,6,3.]],threshold:0.2515163123607636,right_val:0.7147309780120850,left_val:0.4869661927223206},{features:[[6,0,3,4,-1.],[7,0,1,4,3.]],threshold:-4.6328022144734859e-003,right_val:0.5083789825439453,left_val:0.2727448940277100},{features:[[14,10,4,10,-1.],[16,10,2,5,2.],[14,15,2,5,2.]],threshold:-0.0404344908893108,right_val:0.5021767020225525,left_val:0.6851438879966736},{features:[[3,2,3,2,-1.],[4,2,1,2,3.]],threshold:1.4972220014897175e-005,right_val:0.5522555112838745,left_val:0.4284465014934540},{features:[[11,2,2,2,-1.],[11,3,2,1,2.]],threshold:-2.4050309730228037e-004,right_val:0.5390074849128723,left_val:0.4226118922233582},{features:[[2,10,4,10,-1.],[2,10,2,5,2.],[4,15,2,5,2.]],threshold:0.0236578397452831,right_val:0.7504366040229797,left_val:0.4744631946086884},{features:[[0,13,20,6,-1.],[10,13,10,3,2.],[0,16,10,3,2.]],threshold:-8.1449104472994804e-003,right_val:0.5538362860679627,left_val:0.4245058894157410},{features:[[0,5,2,15,-1.],[1,5,1,15,2.]],threshold:-3.6992130335420370e-003,right_val:0.4529713094234467,left_val:0.5952357053756714},{features:[[1,7,18,4,-1.],[10,7,9,2,2.],[1,9,9,2,2.]],threshold:-6.7718601785600185e-003,right_val:0.5473399758338928,left_val:0.4137794077396393},{features:[[0,0,2,17,-1.],[1,0,1,17,2.]],threshold:4.2669530957937241e-003,right_val:0.5797994136810303,left_val:0.4484114944934845},{features:[[2,6,16,6,-1.],[10,6,8,3,2.],[2,9,8,3,2.]],threshold:1.7791989957913756e-003,right_val:0.4432444870471954,left_val:0.5624858736991882},{features:[[8,14,1,3,-1.],[8,15,1,1,3.]],threshold:1.6774770338088274e-003,right_val:0.6364241838455200,left_val:0.4637751877307892},{features:[[8,15,4,2,-1.],[8,16,4,1,2.]],threshold:1.1732629500329494e-003,right_val:0.5914415717124939,left_val:0.4544503092765808},{features:[[5,2,8,2,-1.],[5,2,4,1,2.],[9,3,4,1,2.]],threshold:8.6998171173036098e-004,right_val:0.3885917961597443,left_val:0.5334752798080444},{features:[[6,11,8,6,-1.],[6,14,8,3,2.]],threshold:7.6378340600058436e-004,right_val:0.3744941949844360,left_val:0.5398585200309753},{features:[[9,13,2,2,-1.],[9,14,2,1,2.]],threshold:1.5684569370932877e-004,right_val:0.5614616274833679,left_val:0.4317873120307922},{features:[[18,4,2,6,-1.],[18,6,2,2,3.]],threshold:-0.0215113703161478,right_val:0.5185542702674866,left_val:0.1785925030708313},{features:[[9,12,2,2,-1.],[9,13,2,1,2.]],threshold:1.3081369979772717e-004,right_val:0.5682849884033203,left_val:0.4342499077320099},{features:[[18,4,2,6,-1.],[18,6,2,2,3.]],threshold:0.0219920407980680,right_val:0.2379394024610519,left_val:0.5161716938018799},{features:[[9,13,1,3,-1.],[9,14,1,1,3.]],threshold:-8.0136500764638186e-004,right_val:0.4466426968574524,left_val:0.5986763238906860},{features:[[18,4,2,6,-1.],[18,6,2,2,3.]],threshold:-8.2736099138855934e-003,right_val:0.5251057147979736,left_val:0.4108217954635620},{features:[[0,4,2,6,-1.],[0,6,2,2,3.]],threshold:3.6831789184361696e-003,right_val:0.3397518098354340,left_val:0.5173814296722412},{features:[[9,12,3,3,-1.],[9,13,3,1,3.]],threshold:-7.9525681212544441e-003,right_val:0.4845924079418182,left_val:0.6888983249664307},{features:[[3,13,2,3,-1.],[3,14,2,1,3.]],threshold:1.5382299898192286e-003,right_val:0.3454113900661469,left_val:0.5178567171096802},{features:[[13,13,4,3,-1.],[13,14,4,1,3.]],threshold:-0.0140435304492712,right_val:0.5188667774200440,left_val:0.1678421050310135},{features:[[5,4,3,3,-1.],[5,5,3,1,3.]],threshold:1.4315890148282051e-003,right_val:0.5655773878097534,left_val:0.4368256926536560},{features:[[5,2,10,6,-1.],[5,4,10,2,3.]],threshold:-0.0340142287313938,right_val:0.4959217011928558,left_val:0.7802296280860901},{features:[[3,13,4,3,-1.],[3,14,4,1,3.]],threshold:-0.0120272999629378,right_val:0.5032231807708740,left_val:0.1585101038217545},{features:[[3,7,15,5,-1.],[8,7,5,5,3.]],threshold:0.1331661939620972,right_val:0.2755128145217896,left_val:0.5163304805755615},{features:[[3,7,12,2,-1.],[7,7,4,2,3.]],threshold:-1.5221949433907866e-003,right_val:0.5214552283287048,left_val:0.3728317916393280},{features:[[10,3,3,9,-1.],[11,3,1,9,3.]],threshold:-9.3929271679371595e-004,right_val:0.4511165022850037,left_val:0.5838379263877869},{features:[[8,6,4,6,-1.],[10,6,2,6,2.]],threshold:0.0277197398245335,right_val:0.7331544756889343,left_val:0.4728286862373352},{features:[[9,7,4,3,-1.],[9,8,4,1,3.]],threshold:3.1030150130391121e-003,right_val:0.4101563096046448,left_val:0.5302202105522156},{features:[[0,9,4,9,-1.],[2,9,2,9,2.]],threshold:0.0778612196445465,right_val:0.1272961944341660,left_val:0.4998334050178528},{features:[[9,13,3,5,-1.],[10,13,1,5,3.]],threshold:-0.0158549398183823,right_val:0.5165656208992004,left_val:0.0508333593606949},{features:[[7,7,6,3,-1.],[9,7,2,3,3.]],threshold:-4.9725300632417202e-003,right_val:0.4684231877326965,left_val:0.6798133850097656},{features:[[9,7,3,5,-1.],[10,7,1,5,3.]],threshold:-9.7676506265997887e-004,right_val:0.4788931906223297,left_val:0.6010771989822388},{features:[[5,7,8,2,-1.],[9,7,4,2,2.]],threshold:-2.4647710379213095e-003,right_val:0.5220503807067871,left_val:0.3393397927284241},{features:[[5,9,12,2,-1.],[9,9,4,2,3.]],threshold:-6.7937700077891350e-003,right_val:0.5239663124084473,left_val:0.4365136921405792},{features:[[5,6,10,3,-1.],[10,6,5,3,2.]],threshold:0.0326080210506916,right_val:0.2425214946269989,left_val:0.5052723884582520},{features:[[10,12,3,1,-1.],[11,12,1,1,3.]],threshold:-5.8514421107247472e-004,right_val:0.4758574068546295,left_val:0.5733973979949951},{features:[[0,1,11,15,-1.],[0,6,11,5,3.]],threshold:-0.0296326000243425,right_val:0.5263597965240479,left_val:0.3892289102077484}],threshold:66.6691207885742190},{simpleClassifiers:[{features:[[1,0,18,6,-1.],[7,0,6,6,3.]],threshold:0.0465508513152599,right_val:0.6240522861480713,left_val:0.3276950120925903},{features:[[7,7,6,1,-1.],[9,7,2,1,3.]],threshold:7.9537127166986465e-003,right_val:0.6942939162254334,left_val:0.4256485104560852},{features:[[5,16,6,4,-1.],[5,16,3,2,2.],[8,18,3,2,2.]],threshold:6.8221561377868056e-004,right_val:0.5900732874870300,left_val:0.3711487054824829},{features:[[6,5,9,8,-1.],[6,9,9,4,2.]],threshold:-1.9348249770700932e-004,right_val:0.5300545096397400,left_val:0.2041133940219879},{features:[[5,10,2,6,-1.],[5,13,2,3,2.]],threshold:-2.6710508973337710e-004,right_val:0.3103179037570953,left_val:0.5416126251220703},{features:[[7,6,8,10,-1.],[11,6,4,5,2.],[7,11,4,5,2.]],threshold:2.7818060480058193e-003,right_val:0.3467069864273071,left_val:0.5277832746505737},{features:[[5,6,8,10,-1.],[5,6,4,5,2.],[9,11,4,5,2.]],threshold:-4.6779078547842801e-004,right_val:0.3294492065906525,left_val:0.5308231115341187},{features:[[9,5,2,2,-1.],[9,6,2,1,2.]],threshold:-3.0335160772665404e-005,right_val:0.3852097094058991,left_val:0.5773872733116150},{features:[[5,12,8,2,-1.],[5,13,8,1,2.]],threshold:7.8038009814918041e-004,right_val:0.6150057911872864,left_val:0.4317438900470734},{features:[[10,2,8,2,-1.],[10,3,8,1,2.]],threshold:-4.2553851380944252e-003,right_val:0.5324292778968811,left_val:0.2933903932571411},{features:[[4,0,2,10,-1.],[4,0,1,5,2.],[5,5,1,5,2.]],threshold:-2.4735610350035131e-004,right_val:0.3843030035495758,left_val:0.5468844771385193},{features:[[9,10,2,2,-1.],[9,11,2,1,2.]],threshold:-1.4724259381182492e-004,right_val:0.5755587220191956,left_val:0.4281542897224426},{features:[[2,8,15,3,-1.],[2,9,15,1,3.]],threshold:1.1864770203828812e-003,right_val:0.5471466183662415,left_val:0.3747301101684570},{features:[[8,13,4,3,-1.],[8,14,4,1,3.]],threshold:2.3936580400913954e-003,right_val:0.6111528873443604,left_val:0.4537783861160278},{features:[[7,2,3,2,-1.],[8,2,1,2,3.]],threshold:-1.5390539774671197e-003,right_val:0.5189538002014160,left_val:0.2971341907978058},{features:[[7,13,6,3,-1.],[7,14,6,1,3.]],threshold:-7.1968790143728256e-003,right_val:0.4726476967334747,left_val:0.6699066758155823},{features:[[9,9,2,2,-1.],[9,10,2,1,2.]],threshold:-4.1499789222143590e-004,right_val:0.5260317921638489,left_val:0.3384954035282135},{features:[[17,2,3,6,-1.],[17,4,3,2,3.]],threshold:4.4359830208122730e-003,right_val:0.3920140862464905,left_val:0.5399122238159180},{features:[[1,5,3,4,-1.],[2,5,1,4,3.]],threshold:2.6606200262904167e-003,right_val:0.6119617819786072,left_val:0.4482578039169312},{features:[[14,8,4,6,-1.],[14,10,4,2,3.]],threshold:-1.5287200221791863e-003,right_val:0.5340266227722168,left_val:0.3711237907409668},{features:[[1,4,3,8,-1.],[2,4,1,8,3.]],threshold:-4.7397250309586525e-003,right_val:0.4455145001411438,left_val:0.6031088232994080},{features:[[8,13,4,6,-1.],[8,16,4,3,2.]],threshold:-0.0148291299119592,right_val:0.5341861844062805,left_val:0.2838754057884216},{features:[[3,14,2,2,-1.],[3,15,2,1,2.]],threshold:9.2275557108223438e-004,right_val:0.3361653983592987,left_val:0.5209547281265259},{features:[[14,8,4,6,-1.],[14,10,4,2,3.]],threshold:0.0835298076272011,right_val:0.0811644494533539,left_val:0.5119969844818115},{features:[[2,8,4,6,-1.],[2,10,4,2,3.]],threshold:-7.5633148662745953e-004,right_val:0.5189831256866455,left_val:0.3317120075225830},{features:[[10,14,1,6,-1.],[10,17,1,3,2.]],threshold:9.8403859883546829e-003,right_val:0.2334959059953690,left_val:0.5247598290443420},{features:[[7,5,3,6,-1.],[8,5,1,6,3.]],threshold:-1.5953830443322659e-003,right_val:0.4295622110366821,left_val:0.5750094056129456},{features:[[11,2,2,6,-1.],[12,2,1,3,2.],[11,5,1,3,2.]],threshold:3.4766020689858124e-005,right_val:0.5564029216766357,left_val:0.4342445135116577},{features:[[6,6,6,5,-1.],[8,6,2,5,3.]],threshold:0.0298629105091095,right_val:0.6579188108444214,left_val:0.4579147100448608},{features:[[17,1,3,6,-1.],[17,3,3,2,3.]],threshold:0.0113255903124809,right_val:0.3673888146877289,left_val:0.5274311900138855},{features:[[8,7,3,5,-1.],[9,7,1,5,3.]],threshold:-8.7828645482659340e-003,right_val:0.4642167091369629,left_val:0.7100368738174439},{features:[[9,18,3,2,-1.],[10,18,1,2,3.]],threshold:4.3639959767460823e-003,right_val:0.2705877125263214,left_val:0.5279216170310974},{features:[[8,18,3,2,-1.],[9,18,1,2,3.]],threshold:4.1804728098213673e-003,right_val:0.2449083030223846,left_val:0.5072525143623352},{features:[[12,3,5,2,-1.],[12,4,5,1,2.]],threshold:-4.5668511302210391e-004,right_val:0.5548691153526306,left_val:0.4283105134963989},{features:[[7,1,5,12,-1.],[7,7,5,6,2.]],threshold:-3.7140368949621916e-003,right_val:0.4103653132915497,left_val:0.5519387722015381},{features:[[1,0,18,4,-1.],[7,0,6,4,3.]],threshold:-0.0253042895346880,right_val:0.4869889020919800,left_val:0.6867002248764038},{features:[[4,2,2,2,-1.],[4,3,2,1,2.]],threshold:-3.4454080741852522e-004,right_val:0.5287693142890930,left_val:0.3728874027729034},{features:[[11,14,4,2,-1.],[13,14,2,1,2.],[11,15,2,1,2.]],threshold:-8.3935231668874621e-004,right_val:0.4616062045097351,left_val:0.6060152053833008},{features:[[0,2,3,6,-1.],[0,4,3,2,3.]],threshold:0.0172800496220589,right_val:0.1819823980331421,left_val:0.5049635767936707},{features:[[9,7,2,3,-1.],[9,8,2,1,3.]],threshold:-6.3595077954232693e-003,right_val:0.5232778787612915,left_val:0.1631239950656891},{features:[[5,5,1,3,-1.],[5,6,1,1,3.]],threshold:1.0298109846189618e-003,right_val:0.6176549196243286,left_val:0.4463278055191040},{features:[[10,10,6,1,-1.],[10,10,3,1,2.]],threshold:1.0117109632119536e-003,right_val:0.4300698935985565,left_val:0.5473384857177734},{features:[[4,10,6,1,-1.],[7,10,3,1,2.]],threshold:-0.0103088002651930,right_val:0.5000867247581482,left_val:0.1166985034942627},{features:[[9,17,3,3,-1.],[9,18,3,1,3.]],threshold:5.4682018235325813e-003,right_val:0.6719213724136353,left_val:0.4769287109375000},{features:[[4,14,1,3,-1.],[4,15,1,1,3.]],threshold:-9.1696460731327534e-004,right_val:0.5178164839744568,left_val:0.3471089899539948},{features:[[12,5,3,3,-1.],[12,6,3,1,3.]],threshold:2.3922820109874010e-003,right_val:0.6216310858726502,left_val:0.4785236120223999},{features:[[4,5,12,3,-1.],[4,6,12,1,3.]],threshold:-7.5573818758130074e-003,right_val:0.4410085082054138,left_val:0.5814796090126038},{features:[[9,8,2,3,-1.],[9,9,2,1,3.]],threshold:-7.7024032361805439e-004,right_val:0.5465722084045410,left_val:0.3878000080585480},{features:[[4,9,3,3,-1.],[5,9,1,3,3.]],threshold:-8.7125990539789200e-003,right_val:0.4995836019515991,left_val:0.1660051047801971},{features:[[6,0,9,17,-1.],[9,0,3,17,3.]],threshold:-0.0103063201531768,right_val:0.5274233818054199,left_val:0.4093391001224518},{features:[[9,12,1,3,-1.],[9,13,1,1,3.]],threshold:-2.0940979011356831e-003,right_val:0.4572280049324036,left_val:0.6206194758415222},{features:[[9,5,2,15,-1.],[9,10,2,5,3.]],threshold:6.8099051713943481e-003,right_val:0.4155600070953369,left_val:0.5567759275436401},{features:[[8,14,2,3,-1.],[8,15,2,1,3.]],threshold:-1.0746059706434608e-003,right_val:0.4353024959564209,left_val:0.5638927817344666},{features:[[10,14,1,3,-1.],[10,15,1,1,3.]],threshold:2.1550289820879698e-003,right_val:0.6749758124351502,left_val:0.4826265871524811},{features:[[7,1,6,5,-1.],[9,1,2,5,3.]],threshold:0.0317423194646835,right_val:0.1883248984813690,left_val:0.5048379898071289},{features:[[0,0,20,2,-1.],[0,0,10,2,2.]],threshold:-0.0783827230334282,right_val:0.5260158181190491,left_val:0.2369548976421356},{features:[[2,13,5,3,-1.],[2,14,5,1,3.]],threshold:5.7415119372308254e-003,right_val:0.2776469886302948,left_val:0.5048828721046448},{features:[[9,11,2,3,-1.],[9,12,2,1,3.]],threshold:-2.9014600440859795e-003,right_val:0.4693317115306854,left_val:0.6238604784011841},{features:[[2,5,9,15,-1.],[2,10,9,5,3.]],threshold:-2.6427931152284145e-003,right_val:0.5169777274131775,left_val:0.3314141929149628},{features:[[5,0,12,10,-1.],[11,0,6,5,2.],[5,5,6,5,2.]],threshold:-0.1094966009259224,right_val:0.5183441042900085,left_val:0.2380045056343079},{features:[[5,1,2,3,-1.],[6,1,1,3,2.]],threshold:7.4075913289561868e-005,right_val:0.5362150073051453,left_val:0.4069635868072510},{features:[[10,7,6,1,-1.],[12,7,2,1,3.]],threshold:-5.0593802006915212e-004,right_val:0.4374594092369080,left_val:0.5506706237792969},{features:[[3,1,2,10,-1.],[3,1,1,5,2.],[4,6,1,5,2.]],threshold:-8.2131777890026569e-004,right_val:0.4209375977516174,left_val:0.5525709986686707},{features:[[13,7,2,1,-1.],[13,7,1,1,2.]],threshold:-6.0276539443293586e-005,right_val:0.4748266041278839,left_val:0.5455474853515625},{features:[[4,13,4,6,-1.],[4,15,4,2,3.]],threshold:6.8065142259001732e-003,right_val:0.3424577116966248,left_val:0.5157995820045471},{features:[[13,7,2,1,-1.],[13,7,1,1,2.]],threshold:1.7202789895236492e-003,right_val:0.6331263780593872,left_val:0.5013207793235779},{features:[[5,7,2,1,-1.],[6,7,1,1,2.]],threshold:-1.3016929733566940e-004,right_val:0.4226869940757752,left_val:0.5539718270301819},{features:[[2,12,18,4,-1.],[11,12,9,2,2.],[2,14,9,2,2.]],threshold:-4.8016388900578022e-003,right_val:0.5430780053138733,left_val:0.4425095021724701},{features:[[5,7,2,2,-1.],[5,7,1,1,2.],[6,8,1,1,2.]],threshold:-2.5399310979992151e-003,right_val:0.4697605073451996,left_val:0.7145782113075256},{features:[[16,3,4,2,-1.],[16,4,4,1,2.]],threshold:-1.4278929447755218e-003,right_val:0.5399605035781860,left_val:0.4070445001125336},{features:[[0,2,2,18,-1.],[0,2,1,9,2.],[1,11,1,9,2.]],threshold:-0.0251425504684448,right_val:0.4747352004051209,left_val:0.7884690761566162},{features:[[1,2,18,4,-1.],[10,2,9,2,2.],[1,4,9,2,2.]],threshold:-3.8899609353393316e-003,right_val:0.5577110052108765,left_val:0.4296191930770874},{features:[[9,14,1,3,-1.],[9,15,1,1,3.]],threshold:4.3947459198534489e-003,right_val:0.7023944258689880,left_val:0.4693162143230438},{features:[[2,12,18,4,-1.],[11,12,9,2,2.],[2,14,9,2,2.]],threshold:0.0246784202754498,right_val:0.3812510073184967,left_val:0.5242322087287903},{features:[[0,12,18,4,-1.],[0,12,9,2,2.],[9,14,9,2,2.]],threshold:0.0380476787686348,right_val:0.1687828004360199,left_val:0.5011739730834961},{features:[[11,4,5,3,-1.],[11,5,5,1,3.]],threshold:7.9424865543842316e-003,right_val:0.6369568109512329,left_val:0.4828582108020783},{features:[[6,4,7,3,-1.],[6,5,7,1,3.]],threshold:-1.5110049862414598e-003,right_val:0.4487667977809906,left_val:0.5906485915184021},{features:[[13,17,3,3,-1.],[13,18,3,1,3.]],threshold:6.4201741479337215e-003,right_val:0.2990570068359375,left_val:0.5241097807884216},{features:[[8,1,3,4,-1.],[9,1,1,4,3.]],threshold:-2.9802159406244755e-003,right_val:0.5078489780426025,left_val:0.3041465878486633},{features:[[11,4,2,4,-1.],[11,4,1,4,2.]],threshold:-7.4580078944563866e-004,right_val:0.5256826281547546,left_val:0.4128139019012451},{features:[[0,17,9,3,-1.],[3,17,3,3,3.]],threshold:-0.0104709500446916,right_val:0.4494296014308929,left_val:0.5808395147323608},{features:[[11,0,2,8,-1.],[12,0,1,4,2.],[11,4,1,4,2.]],threshold:9.3369204550981522e-003,right_val:0.2658948898315430,left_val:0.5246552824974060},{features:[[0,8,6,12,-1.],[0,8,3,6,2.],[3,14,3,6,2.]],threshold:0.0279369000345469,right_val:0.7087256908416748,left_val:0.4674955010414124},{features:[[10,7,4,12,-1.],[10,13,4,6,2.]],threshold:7.4277678504586220e-003,right_val:0.3758518099784851,left_val:0.5409486889839172},{features:[[5,3,8,14,-1.],[5,10,8,7,2.]],threshold:-0.0235845092684031,right_val:0.5238550901412964,left_val:0.3758639991283417},{features:[[14,10,6,1,-1.],[14,10,3,1,2.]],threshold:1.1452640173956752e-003,right_val:0.5804247260093689,left_val:0.4329578876495361},{features:[[0,4,10,4,-1.],[0,6,10,2,2.]],threshold:-4.3468660442158580e-004,right_val:0.3873069882392883,left_val:0.5280618071556091},{features:[[10,0,5,8,-1.],[10,4,5,4,2.]],threshold:0.0106485402211547,right_val:0.5681251883506775,left_val:0.4902113080024719},{features:[[8,1,4,8,-1.],[8,1,2,4,2.],[10,5,2,4,2.]],threshold:-3.9418050437234342e-004,right_val:0.4318251013755798,left_val:0.5570880174636841},{features:[[9,11,6,1,-1.],[11,11,2,1,3.]],threshold:-1.3270479394122958e-004,right_val:0.4343554973602295,left_val:0.5658439993858337},{features:[[8,9,3,4,-1.],[9,9,1,4,3.]],threshold:-2.0125510636717081e-003,right_val:0.4537523984909058,left_val:0.6056739091873169},{features:[[18,4,2,6,-1.],[18,6,2,2,3.]],threshold:2.4854319635778666e-003,right_val:0.4138010144233704,left_val:0.5390477180480957},{features:[[8,8,3,4,-1.],[9,8,1,4,3.]],threshold:1.8237880431115627e-003,right_val:0.5717188715934753,left_val:0.4354828894138336},{features:[[7,1,13,3,-1.],[7,2,13,1,3.]],threshold:-0.0166566595435143,right_val:0.5216122865676880,left_val:0.3010913133621216},{features:[[7,13,6,1,-1.],[9,13,2,1,3.]],threshold:8.0349558265879750e-004,right_val:0.3818396925926209,left_val:0.5300151109695435},{features:[[12,11,3,6,-1.],[12,13,3,2,3.]],threshold:3.4170378930866718e-003,right_val:0.4241400063037872,left_val:0.5328028798103333},{features:[[5,11,6,1,-1.],[7,11,2,1,3.]],threshold:-3.6222729249857366e-004,right_val:0.4186977148056030,left_val:0.5491728186607361},{features:[[1,4,18,10,-1.],[10,4,9,5,2.],[1,9,9,5,2.]],threshold:-0.1163002029061317,right_val:0.5226451158523560,left_val:0.1440722048282623},{features:[[8,6,4,9,-1.],[8,9,4,3,3.]],threshold:-0.0146950101479888,right_val:0.4715717136859894,left_val:0.7747725248336792},{features:[[8,6,4,3,-1.],[8,7,4,1,3.]],threshold:2.1972130052745342e-003,right_val:0.3315644860267639,left_val:0.5355433821678162},{features:[[8,7,3,3,-1.],[9,7,1,3,3.]],threshold:-4.6965209185145795e-004,right_val:0.4458136856555939,left_val:0.5767235159873962},{features:[[14,15,4,3,-1.],[14,16,4,1,3.]],threshold:6.5144998952746391e-003,right_val:0.3647888898849487,left_val:0.5215674042701721},{features:[[5,10,3,10,-1.],[6,10,1,10,3.]],threshold:0.0213000606745481,right_val:0.1567950993776321,left_val:0.4994204938411713},{features:[[8,15,4,3,-1.],[8,16,4,1,3.]],threshold:3.1881409231573343e-003,right_val:0.6287270188331604,left_val:0.4742200076580048},{features:[[0,8,1,6,-1.],[0,10,1,2,3.]],threshold:9.0019777417182922e-004,right_val:0.3943752050399780,left_val:0.5347954034805298},{features:[[10,15,1,3,-1.],[10,16,1,1,3.]],threshold:-5.1772277802228928e-003,right_val:0.5013138055801392,left_val:0.6727191805839539},{features:[[2,15,4,3,-1.],[2,16,4,1,3.]],threshold:-4.3764649890363216e-003,right_val:0.5128793120384216,left_val:0.3106675148010254},{features:[[18,3,2,8,-1.],[19,3,1,4,2.],[18,7,1,4,2.]],threshold:2.6299960445612669e-003,right_val:0.5755215883255005,left_val:0.4886310100555420},{features:[[0,3,2,8,-1.],[0,3,1,4,2.],[1,7,1,4,2.]],threshold:-2.0458688959479332e-003,right_val:0.4558076858520508,left_val:0.6025794148445129},{features:[[3,7,14,10,-1.],[10,7,7,5,2.],[3,12,7,5,2.]],threshold:0.0694827064871788,right_val:0.2185259014368057,left_val:0.5240747928619385},{features:[[0,7,19,3,-1.],[0,8,19,1,3.]],threshold:0.0240489393472672,right_val:0.2090622037649155,left_val:0.5011867284774780},{features:[[12,6,3,3,-1.],[12,7,3,1,3.]],threshold:3.1095340382307768e-003,right_val:0.7108548283576965,left_val:0.4866712093353272},{features:[[0,6,1,3,-1.],[0,7,1,1,3.]],threshold:-1.2503260513767600e-003,right_val:0.5156195163726807,left_val:0.3407891094684601},{features:[[12,6,3,3,-1.],[12,7,3,1,3.]],threshold:-1.0281190043315291e-003,right_val:0.4439432024955750,left_val:0.5575572252273560},{features:[[5,6,3,3,-1.],[5,7,3,1,3.]],threshold:-8.8893622159957886e-003,right_val:0.4620442092418671,left_val:0.6402000784873962},{features:[[8,2,4,2,-1.],[8,3,4,1,2.]],threshold:-6.1094801640138030e-004,right_val:0.5448899865150452,left_val:0.3766441941261292},{features:[[6,3,4,12,-1.],[8,3,2,12,2.]],threshold:-5.7686357758939266e-003,right_val:0.5133677124977112,left_val:0.3318648934364319},{features:[[13,6,2,3,-1.],[13,7,2,1,3.]],threshold:1.8506490159779787e-003,right_val:0.6406934857368469,left_val:0.4903570115566254},{features:[[0,10,20,4,-1.],[0,12,20,2,2.]],threshold:-0.0997994691133499,right_val:0.5015562176704407,left_val:0.1536051034927368},{features:[[2,0,17,14,-1.],[2,7,17,7,2.]],threshold:-0.3512834906578064,right_val:0.5174378752708435,left_val:0.0588231310248375},{features:[[0,0,6,10,-1.],[0,0,3,5,2.],[3,5,3,5,2.]],threshold:-0.0452445708215237,right_val:0.4677872955799103,left_val:0.6961488723754883},{features:[[14,6,6,4,-1.],[14,6,3,4,2.]],threshold:0.0714815780520439,right_val:0.1038092970848084,left_val:0.5167986154556274},{features:[[0,6,6,4,-1.],[3,6,3,4,2.]],threshold:2.1895780228078365e-003,right_val:0.5532060861587524,left_val:0.4273078143596649},{features:[[13,2,7,2,-1.],[13,3,7,1,2.]],threshold:-5.9242651332169771e-004,right_val:0.5276389122009277,left_val:0.4638943970203400},{features:[[0,2,7,2,-1.],[0,3,7,1,2.]],threshold:1.6788389766588807e-003,right_val:0.3932034969329834,left_val:0.5301648974418640},{features:[[6,11,14,2,-1.],[13,11,7,1,2.],[6,12,7,1,2.]],threshold:-2.2163488902151585e-003,right_val:0.4757033884525299,left_val:0.5630694031715393},{features:[[8,5,2,2,-1.],[8,5,1,1,2.],[9,6,1,1,2.]],threshold:1.1568699846975505e-004,right_val:0.5535702705383301,left_val:0.4307535886764526},{features:[[13,9,2,3,-1.],[13,9,1,3,2.]],threshold:-7.2017288766801357e-003,right_val:0.5193064212799072,left_val:0.1444882005453110},{features:[[1,1,3,12,-1.],[2,1,1,12,3.]],threshold:8.9081272017210722e-004,right_val:0.5593621134757996,left_val:0.4384432137012482},{features:[[17,4,1,3,-1.],[17,5,1,1,3.]],threshold:1.9605009583756328e-004,right_val:0.4705956876277924,left_val:0.5340415835380554},{features:[[2,4,1,3,-1.],[2,5,1,1,3.]],threshold:5.2022142335772514e-004,right_val:0.3810079097747803,left_val:0.5213856101036072},{features:[[14,5,1,3,-1.],[14,6,1,1,3.]],threshold:9.4588572392240167e-004,right_val:0.6130738854408264,left_val:0.4769414961338043},{features:[[7,16,2,3,-1.],[7,17,2,1,3.]],threshold:9.1698471806012094e-005,right_val:0.5429363250732422,left_val:0.4245009124279022},{features:[[8,13,4,6,-1.],[10,13,2,3,2.],[8,16,2,3,2.]],threshold:2.1833200007677078e-003,right_val:0.4191075861454010,left_val:0.5457730889320374},{features:[[5,5,1,3,-1.],[5,6,1,1,3.]],threshold:-8.6039671441540122e-004,right_val:0.4471659958362579,left_val:0.5764588713645935},{features:[[16,0,4,20,-1.],[16,0,2,20,2.]],threshold:-0.0132362395524979,right_val:0.4695009887218475,left_val:0.6372823119163513},{features:[[5,1,2,6,-1.],[5,1,1,3,2.],[6,4,1,3,2.]],threshold:4.3376701069064438e-004,right_val:0.3945829868316650,left_val:0.5317873954772949}],threshold:67.6989212036132810},{simpleClassifiers:[{features:[[5,4,10,4,-1.],[5,6,10,2,2.]],threshold:-0.0248471498489380,right_val:0.3873311877250671,left_val:0.6555516719818115},{features:[[15,2,4,12,-1.],[15,2,2,12,2.]],threshold:6.1348611488938332e-003,right_val:0.5973997712135315,left_val:0.3748072087764740},{features:[[7,6,4,12,-1.],[7,12,4,6,2.]],threshold:6.4498498104512691e-003,right_val:0.2548811137676239,left_val:0.5425491929054260},{features:[[14,5,1,8,-1.],[14,9,1,4,2.]],threshold:6.3491211039945483e-004,right_val:0.5387253761291504,left_val:0.2462442070245743},{features:[[1,4,14,10,-1.],[1,4,7,5,2.],[8,9,7,5,2.]],threshold:1.4023890253156424e-003,right_val:0.3528657853603363,left_val:0.5594322085380554},{features:[[11,6,6,14,-1.],[14,6,3,7,2.],[11,13,3,7,2.]],threshold:3.0044000595808029e-004,right_val:0.5765938162803650,left_val:0.3958503901958466},{features:[[3,6,6,14,-1.],[3,6,3,7,2.],[6,13,3,7,2.]],threshold:1.0042409849120304e-004,right_val:0.5534998178482056,left_val:0.3698996901512146},{features:[[4,9,15,2,-1.],[9,9,5,2,3.]],threshold:-5.0841490738093853e-003,right_val:0.5547800064086914,left_val:0.3711090981960297},{features:[[7,14,6,3,-1.],[7,15,6,1,3.]],threshold:-0.0195372607558966,right_val:0.4579297006130219,left_val:0.7492755055427551},{features:[[6,3,14,4,-1.],[13,3,7,2,2.],[6,5,7,2,2.]],threshold:-7.4532740654831287e-006,right_val:0.3904069960117340,left_val:0.5649787187576294},{features:[[1,9,15,2,-1.],[6,9,5,2,3.]],threshold:-3.6079459823668003e-003,right_val:0.5267801284790039,left_val:0.3381088078022003},{features:[[6,11,8,9,-1.],[6,14,8,3,3.]],threshold:2.0697501022368670e-003,right_val:0.3714388906955719,left_val:0.5519291162490845},{features:[[7,4,3,8,-1.],[8,4,1,8,3.]],threshold:-4.6463840408250690e-004,right_val:0.4113566875457764,left_val:0.5608214735984802},{features:[[14,6,2,6,-1.],[14,9,2,3,2.]],threshold:7.5490452582016587e-004,right_val:0.5329356193542481,left_val:0.3559206128120422},{features:[[5,7,6,4,-1.],[5,7,3,2,2.],[8,9,3,2,2.]],threshold:-9.8322238773107529e-004,right_val:0.3763205111026764,left_val:0.5414795875549316},{features:[[1,1,18,19,-1.],[7,1,6,19,3.]],threshold:-0.0199406407773495,right_val:0.4705299139022827,left_val:0.6347903013229370},{features:[[1,2,6,5,-1.],[4,2,3,5,2.]],threshold:3.7680300883948803e-003,right_val:0.5563716292381287,left_val:0.3913489878177643},{features:[[12,17,6,2,-1.],[12,18,6,1,2.]],threshold:-9.4528505578637123e-003,right_val:0.5215116739273071,left_val:0.2554892897605896},{features:[[2,17,6,2,-1.],[2,18,6,1,2.]],threshold:2.9560849070549011e-003,right_val:0.3063920140266419,left_val:0.5174679160118103},{features:[[17,3,3,6,-1.],[17,5,3,2,3.]],threshold:9.1078737750649452e-003,right_val:0.2885963022708893,left_val:0.5388448238372803},{features:[[8,17,3,3,-1.],[8,18,3,1,3.]],threshold:1.8219229532405734e-003,right_val:0.5852196812629700,left_val:0.4336043000221252},{features:[[10,13,2,6,-1.],[10,16,2,3,2.]],threshold:0.0146887395530939,right_val:0.2870005965232849,left_val:0.5287361741065979},{features:[[7,13,6,3,-1.],[7,14,6,1,3.]],threshold:-0.0143879903480411,right_val:0.4647370874881744,left_val:0.7019448876380920},{features:[[17,3,3,6,-1.],[17,5,3,2,3.]],threshold:-0.0189866498112679,right_val:0.5247011780738831,left_val:0.2986552119255066},{features:[[8,13,2,3,-1.],[8,14,2,1,3.]],threshold:1.1527639580890536e-003,right_val:0.5931661725044251,left_val:0.4323473870754242},{features:[[9,3,6,2,-1.],[11,3,2,2,3.]],threshold:0.0109336702153087,right_val:0.3130319118499756,left_val:0.5286864042282105},{features:[[0,3,3,6,-1.],[0,5,3,2,3.]],threshold:-0.0149327302351594,right_val:0.5084077119827271,left_val:0.2658419013023377},{features:[[8,5,4,6,-1.],[8,7,4,2,3.]],threshold:-2.9970539617352188e-004,right_val:0.3740724027156830,left_val:0.5463526844978333},{features:[[5,5,3,2,-1.],[5,6,3,1,2.]],threshold:4.1677621193230152e-003,right_val:0.7435721755027771,left_val:0.4703496992588043},{features:[[10,1,3,4,-1.],[11,1,1,4,3.]],threshold:-6.3905320130288601e-003,right_val:0.5280538201332092,left_val:0.2069258987903595},{features:[[1,2,5,9,-1.],[1,5,5,3,3.]],threshold:4.5029609464108944e-003,right_val:0.3483543097972870,left_val:0.5182648897171021},{features:[[13,6,2,3,-1.],[13,7,2,1,3.]],threshold:-9.2040365561842918e-003,right_val:0.4932360053062439,left_val:0.6803777217864990},{features:[[0,6,14,3,-1.],[7,6,7,3,2.]],threshold:0.0813272595405579,right_val:0.2253051996231079,left_val:0.5058398842811585},{features:[[2,11,18,8,-1.],[2,15,18,4,2.]],threshold:-0.1507928073406220,right_val:0.5264679789543152,left_val:0.2963424921035767},{features:[[5,6,2,3,-1.],[5,7,2,1,3.]],threshold:3.3179009333252907e-003,right_val:0.7072932124137878,left_val:0.4655495882034302},{features:[[10,6,4,2,-1.],[12,6,2,1,2.],[10,7,2,1,2.]],threshold:7.7402801252901554e-004,right_val:0.5668237805366516,left_val:0.4780347943305969},{features:[[6,6,4,2,-1.],[6,6,2,1,2.],[8,7,2,1,2.]],threshold:6.8199541419744492e-004,right_val:0.5722156763076782,left_val:0.4286996126174927},{features:[[10,1,3,4,-1.],[11,1,1,4,3.]],threshold:5.3671570494771004e-003,right_val:0.3114621937274933,left_val:0.5299307107925415},{features:[[7,1,2,7,-1.],[8,1,1,7,2.]],threshold:9.7018666565418243e-005,right_val:0.5269461870193481,left_val:0.3674638867378235},{features:[[4,2,15,14,-1.],[4,9,15,7,2.]],threshold:-0.1253408938646317,right_val:0.5245791077613831,left_val:0.2351492047309876},{features:[[8,7,3,2,-1.],[9,7,1,2,3.]],threshold:-5.2516269497573376e-003,right_val:0.4693767130374908,left_val:0.7115936875343323},{features:[[2,3,18,4,-1.],[11,3,9,2,2.],[2,5,9,2,2.]],threshold:-7.8342109918594360e-003,right_val:0.5409085750579834,left_val:0.4462651014328003},{features:[[9,7,2,2,-1.],[10,7,1,2,2.]],threshold:-1.1310069821774960e-003,right_val:0.4417662024497986,left_val:0.5945618748664856},{features:[[13,9,2,3,-1.],[13,9,1,3,2.]],threshold:1.7601120052859187e-003,right_val:0.3973453044891357,left_val:0.5353249907493591},{features:[[5,2,6,2,-1.],[7,2,2,2,3.]],threshold:-8.1581249833106995e-004,right_val:0.5264726877212524,left_val:0.3760268092155457},{features:[[9,5,2,7,-1.],[9,5,1,7,2.]],threshold:-3.8687589112669230e-003,right_val:0.4749819934368134,left_val:0.6309912800788879},{features:[[5,9,2,3,-1.],[6,9,1,3,2.]],threshold:1.5207129763439298e-003,right_val:0.3361223936080933,left_val:0.5230181813240051},{features:[[6,0,14,18,-1.],[6,9,14,9,2.]],threshold:0.5458673834800720,right_val:0.1172635033726692,left_val:0.5167139768600464},{features:[[2,16,6,3,-1.],[2,17,6,1,3.]],threshold:0.0156501904129982,right_val:0.1393294930458069,left_val:0.4979439079761505},{features:[[9,7,3,6,-1.],[10,7,1,6,3.]],threshold:-0.0117318602278829,right_val:0.4921196103096008,left_val:0.7129650712013245},{features:[[7,8,4,3,-1.],[7,9,4,1,3.]],threshold:-6.1765122227370739e-003,right_val:0.5049701929092407,left_val:0.2288102954626083},{features:[[7,12,6,3,-1.],[7,13,6,1,3.]],threshold:2.2457661107182503e-003,right_val:0.6048725843429565,left_val:0.4632433950901032},{features:[[9,12,2,3,-1.],[9,13,2,1,3.]],threshold:-5.1915869116783142e-003,right_val:0.4602192938327789,left_val:0.6467421054840088},{features:[[7,12,6,2,-1.],[9,12,2,2,3.]],threshold:-0.0238278806209564,right_val:0.5226079225540161,left_val:0.1482000946998596},{features:[[5,11,4,6,-1.],[5,14,4,3,2.]],threshold:1.0284580057486892e-003,right_val:0.3375957012176514,left_val:0.5135489106178284},{features:[[11,12,7,2,-1.],[11,13,7,1,2.]],threshold:-0.0100788502022624,right_val:0.5303567051887512,left_val:0.2740561068058014},{features:[[6,10,8,6,-1.],[6,10,4,3,2.],[10,13,4,3,2.]],threshold:2.6168930344283581e-003,right_val:0.3972454071044922,left_val:0.5332670807838440},{features:[[11,10,3,4,-1.],[11,12,3,2,2.]],threshold:5.4385367548093200e-004,right_val:0.4063411951065064,left_val:0.5365604162216187},{features:[[9,16,2,3,-1.],[9,17,2,1,3.]],threshold:5.3510512225329876e-003,right_val:0.6889045834541321,left_val:0.4653759002685547},{features:[[13,3,1,9,-1.],[13,6,1,3,3.]],threshold:-1.5274790348485112e-003,right_val:0.3624723851680756,left_val:0.5449501276016235},{features:[[1,13,14,6,-1.],[1,15,14,2,3.]],threshold:-0.0806244164705276,right_val:0.5000287294387817,left_val:0.1656087040901184},{features:[[13,6,1,6,-1.],[13,9,1,3,2.]],threshold:0.0221920292824507,right_val:0.2002808004617691,left_val:0.5132731199264526},{features:[[0,4,3,8,-1.],[1,4,1,8,3.]],threshold:7.3100631125271320e-003,right_val:0.6366536021232605,left_val:0.4617947936058044},{features:[[18,0,2,18,-1.],[18,0,1,18,2.]],threshold:-6.4063072204589844e-003,right_val:0.4867860972881317,left_val:0.5916250944137573},{features:[[2,3,6,2,-1.],[2,4,6,1,2.]],threshold:-7.6415040530264378e-004,right_val:0.5315797924995422,left_val:0.3888409137725830},{features:[[9,0,8,6,-1.],[9,2,8,2,3.]],threshold:7.6734489994123578e-004,right_val:0.5605279803276062,left_val:0.4159064888954163},{features:[[6,6,1,6,-1.],[6,9,1,3,2.]],threshold:6.1474501853808761e-004,right_val:0.5120148062705994,left_val:0.3089022040367127},{features:[[14,8,6,3,-1.],[14,9,6,1,3.]],threshold:-5.0105270929634571e-003,right_val:0.5207306146621704,left_val:0.3972199857234955},{features:[[0,0,2,18,-1.],[1,0,1,18,2.]],threshold:-8.6909132078289986e-003,right_val:0.4608575999736786,left_val:0.6257408261299133},{features:[[1,18,18,2,-1.],[10,18,9,1,2.],[1,19,9,1,2.]],threshold:-0.0163914598524570,right_val:0.5242266058921814,left_val:0.2085209935903549},{features:[[3,15,2,2,-1.],[3,16,2,1,2.]],threshold:4.0973909199237823e-004,right_val:0.3780320882797241,left_val:0.5222427248954773},{features:[[8,14,5,3,-1.],[8,15,5,1,3.]],threshold:-2.5242289993911982e-003,right_val:0.4611890017986298,left_val:0.5803927183151245},{features:[[8,14,2,3,-1.],[8,15,2,1,3.]],threshold:5.0945312250405550e-004,right_val:0.5846015810966492,left_val:0.4401271939277649},{features:[[12,3,3,3,-1.],[13,3,1,3,3.]],threshold:1.9656419754028320e-003,right_val:0.4184590876102448,left_val:0.5322325229644775},{features:[[7,5,6,2,-1.],[9,5,2,2,3.]],threshold:5.6298897834494710e-004,right_val:0.5234565734863281,left_val:0.3741844892501831},{features:[[15,5,5,2,-1.],[15,6,5,1,2.]],threshold:-6.7946797935292125e-004,right_val:0.5356478095054627,left_val:0.4631041884422302},{features:[[0,5,5,2,-1.],[0,6,5,1,2.]],threshold:7.2856349870562553e-003,right_val:0.2377564013004303,left_val:0.5044670104980469},{features:[[17,14,1,6,-1.],[17,17,1,3,2.]],threshold:-0.0174594894051552,right_val:0.5050435066223145,left_val:0.7289121150970459},{features:[[2,9,9,3,-1.],[5,9,3,3,3.]],threshold:-0.0254217498004436,right_val:0.4678100049495697,left_val:0.6667134761810303},{features:[[12,3,3,3,-1.],[13,3,1,3,3.]],threshold:-1.5647639520466328e-003,right_val:0.5323626995086670,left_val:0.4391759037971497},{features:[[0,0,4,18,-1.],[2,0,2,18,2.]],threshold:0.0114443600177765,right_val:0.5680012106895447,left_val:0.4346440136432648},{features:[[17,6,1,3,-1.],[17,7,1,1,3.]],threshold:-6.7352550104260445e-004,right_val:0.5296812057495117,left_val:0.4477140903472900},{features:[[2,14,1,6,-1.],[2,17,1,3,2.]],threshold:9.3194209039211273e-003,right_val:0.7462607026100159,left_val:0.4740200042724609},{features:[[19,8,1,2,-1.],[19,9,1,1,2.]],threshold:1.3328490604180843e-004,right_val:0.4752134978771210,left_val:0.5365061759948731},{features:[[5,3,3,3,-1.],[6,3,1,3,3.]],threshold:-7.8815799206495285e-003,right_val:0.5015255212783814,left_val:0.1752219051122665},{features:[[9,16,2,3,-1.],[9,17,2,1,3.]],threshold:-5.7985680177807808e-003,right_val:0.4896200895309448,left_val:0.7271236777305603},{features:[[2,6,1,3,-1.],[2,7,1,1,3.]],threshold:-3.8922499516047537e-004,right_val:0.5344941020011902,left_val:0.4003908932209015},{features:[[12,4,8,2,-1.],[16,4,4,1,2.],[12,5,4,1,2.]],threshold:-1.9288610201328993e-003,right_val:0.4803955852985382,left_val:0.5605612993240356},{features:[[0,4,8,2,-1.],[0,4,4,1,2.],[4,5,4,1,2.]],threshold:8.4214154630899429e-003,right_val:0.7623608708381653,left_val:0.4753246903419495},{features:[[2,16,18,4,-1.],[2,18,18,2,2.]],threshold:8.1655876711010933e-003,right_val:0.4191643893718720,left_val:0.5393261909484863},{features:[[7,15,2,4,-1.],[7,17,2,2,2.]],threshold:4.8280550981871784e-004,right_val:0.5399821996688843,left_val:0.4240800142288208},{features:[[4,0,14,3,-1.],[4,1,14,1,3.]],threshold:-2.7186630759388208e-003,right_val:0.5424923896789551,left_val:0.4244599938392639},{features:[[0,0,4,20,-1.],[2,0,2,20,2.]],threshold:-0.0125072300434113,right_val:0.4550411105155945,left_val:0.5895841717720032},{features:[[12,4,4,8,-1.],[14,4,2,4,2.],[12,8,2,4,2.]],threshold:-0.0242865197360516,right_val:0.5189179778099060,left_val:0.2647134959697723},{features:[[6,7,2,2,-1.],[6,7,1,1,2.],[7,8,1,1,2.]],threshold:-2.9676330741494894e-003,right_val:0.4749749898910523,left_val:0.7347682714462280},{features:[[10,6,2,3,-1.],[10,7,2,1,3.]],threshold:-0.0125289997085929,right_val:0.5177599787712097,left_val:0.2756049931049347},{features:[[8,7,3,2,-1.],[8,8,3,1,2.]],threshold:-1.0104000102728605e-003,right_val:0.5144724249839783,left_val:0.3510560989379883},{features:[[8,2,6,12,-1.],[8,8,6,6,2.]],threshold:-2.1348530426621437e-003,right_val:0.4667319953441620,left_val:0.5637925863265991},{features:[[4,0,11,12,-1.],[4,4,11,4,3.]],threshold:0.0195642597973347,right_val:0.6137639880180359,left_val:0.4614573121070862},{features:[[14,9,6,11,-1.],[16,9,2,11,3.]],threshold:-0.0971463471651077,right_val:0.5193555951118469,left_val:0.2998378872871399},{features:[[0,14,4,3,-1.],[0,15,4,1,3.]],threshold:4.5014568604528904e-003,right_val:0.3045755922794342,left_val:0.5077884793281555},{features:[[9,10,2,3,-1.],[9,11,2,1,3.]],threshold:6.3706971704959869e-003,right_val:0.6887500882148743,left_val:0.4861018955707550},{features:[[5,11,3,2,-1.],[5,12,3,1,2.]],threshold:-9.0721528977155685e-003,right_val:0.5017563104629517,left_val:0.1673395931720734},{features:[[9,15,3,3,-1.],[10,15,1,3,3.]],threshold:-5.3537208586931229e-003,right_val:0.5242633223533630,left_val:0.2692756950855255},{features:[[8,8,3,4,-1.],[9,8,1,4,3.]],threshold:-0.0109328404068947,right_val:0.4736028909683228,left_val:0.7183864116668701},{features:[[9,15,3,3,-1.],[10,15,1,3,3.]],threshold:8.2356072962284088e-003,right_val:0.2389862984418869,left_val:0.5223966836929321},{features:[[7,7,3,2,-1.],[8,7,1,2,3.]],threshold:-1.0038160253316164e-003,right_val:0.4433943033218384,left_val:0.5719355940818787},{features:[[2,10,16,4,-1.],[10,10,8,2,2.],[2,12,8,2,2.]],threshold:4.0859128348529339e-003,right_val:0.4148836135864258,left_val:0.5472841858863831},{features:[[2,3,4,17,-1.],[4,3,2,17,2.]],threshold:0.1548541933298111,right_val:0.0610615983605385,left_val:0.4973812103271484},{features:[[15,13,2,7,-1.],[15,13,1,7,2.]],threshold:2.0897459762636572e-004,right_val:0.5423889160156250,left_val:0.4709174036979675},{features:[[2,2,6,1,-1.],[5,2,3,1,2.]],threshold:3.3316991175524890e-004,right_val:0.5300992131233215,left_val:0.4089626967906952},{features:[[5,2,12,4,-1.],[9,2,4,4,3.]],threshold:-0.0108134001493454,right_val:0.4957334101200104,left_val:0.6104369759559631},{features:[[6,0,8,12,-1.],[6,0,4,6,2.],[10,6,4,6,2.]],threshold:0.0456560105085373,right_val:0.2866660058498383,left_val:0.5069689154624939},{features:[[13,7,2,2,-1.],[14,7,1,1,2.],[13,8,1,1,2.]],threshold:1.2569549726322293e-003,right_val:0.6318171024322510,left_val:0.4846917092800140},{features:[[0,12,20,6,-1.],[0,14,20,2,3.]],threshold:-0.1201507002115250,right_val:0.4980959892272949,left_val:0.0605261400341988},{features:[[14,7,2,3,-1.],[14,7,1,3,2.]],threshold:-1.0533799650147557e-004,right_val:0.4708042144775391,left_val:0.5363109707832336},{features:[[0,8,9,12,-1.],[3,8,3,12,3.]],threshold:-0.2070319056510925,right_val:0.4979098141193390,left_val:0.0596603304147720},{features:[[3,0,16,2,-1.],[3,0,8,2,2.]],threshold:1.2909180077258497e-004,right_val:0.5377997756004334,left_val:0.4712977111339569},{features:[[6,15,3,3,-1.],[6,16,3,1,3.]],threshold:3.8818528992123902e-004,right_val:0.5534191131591797,left_val:0.4363538026809692},{features:[[8,15,6,3,-1.],[8,16,6,1,3.]],threshold:-2.9243610333651304e-003,right_val:0.4825215935707092,left_val:0.5811185836791992},{features:[[0,10,1,6,-1.],[0,12,1,2,3.]],threshold:8.3882332546636462e-004,right_val:0.4038138985633850,left_val:0.5311700105667114},{features:[[10,9,4,3,-1.],[10,10,4,1,3.]],threshold:-1.9061550265178084e-003,right_val:0.5260015130043030,left_val:0.3770701885223389},{features:[[9,15,2,3,-1.],[9,16,2,1,3.]],threshold:8.9514348655939102e-003,right_val:0.7682183980941773,left_val:0.4766167998313904},{features:[[5,7,10,1,-1.],[5,7,5,1,2.]],threshold:0.0130834598094225,right_val:0.3062222003936768,left_val:0.5264462828636169},{features:[[4,0,12,19,-1.],[10,0,6,19,2.]],threshold:-0.2115933001041412,right_val:0.4695810079574585,left_val:0.6737198233604431},{features:[[0,6,20,6,-1.],[10,6,10,3,2.],[0,9,10,3,2.]],threshold:3.1493250280618668e-003,right_val:0.4386953115463257,left_val:0.5644835233688355},{features:[[3,6,2,2,-1.],[3,6,1,1,2.],[4,7,1,1,2.]],threshold:3.9754100725986063e-004,right_val:0.5895630121231079,left_val:0.4526061117649078},{features:[[15,6,2,2,-1.],[16,6,1,1,2.],[15,7,1,1,2.]],threshold:-1.3814480043947697e-003,right_val:0.4942413866519928,left_val:0.6070582270622253},{features:[[3,6,2,2,-1.],[3,6,1,1,2.],[4,7,1,1,2.]],threshold:-5.8122188784182072e-004,right_val:0.4508252143859863,left_val:0.5998213291168213},{features:[[14,4,1,12,-1.],[14,10,1,6,2.]],threshold:-2.3905329871922731e-003,right_val:0.5223848223686218,left_val:0.4205588996410370},{features:[[2,5,16,10,-1.],[2,5,8,5,2.],[10,10,8,5,2.]],threshold:0.0272689294070005,right_val:0.3563301861286163,left_val:0.5206447243690491},{features:[[9,17,3,2,-1.],[10,17,1,2,3.]],threshold:-3.7658358924090862e-003,right_val:0.5218814015388489,left_val:0.3144704103469849},{features:[[1,4,2,2,-1.],[1,5,2,1,2.]],threshold:-1.4903489500284195e-003,right_val:0.5124437212944031,left_val:0.3380196094512940},{features:[[5,0,15,5,-1.],[10,0,5,5,3.]],threshold:-0.0174282304942608,right_val:0.4919725954532623,left_val:0.5829960703849793},{features:[[0,0,15,5,-1.],[5,0,5,5,3.]],threshold:-0.0152780301868916,right_val:0.4617887139320374,left_val:0.6163144707679749},{features:[[11,2,2,17,-1.],[11,2,1,17,2.]],threshold:0.0319956094026566,right_val:0.1712764054536820,left_val:0.5166357159614563},{features:[[7,2,2,17,-1.],[8,2,1,17,2.]],threshold:-3.8256710395216942e-003,right_val:0.5131387710571289,left_val:0.3408012092113495},{features:[[15,11,2,9,-1.],[15,11,1,9,2.]],threshold:-8.5186436772346497e-003,right_val:0.4997941851615906,left_val:0.6105518937110901},{features:[[3,11,2,9,-1.],[4,11,1,9,2.]],threshold:9.0641621500253677e-004,right_val:0.5582311153411865,left_val:0.4327270984649658},{features:[[5,16,14,4,-1.],[5,16,7,4,2.]],threshold:0.0103448498994112,right_val:0.5452420115470886,left_val:0.4855653047561646}],threshold:69.2298736572265630},{simpleClassifiers:[{features:[[1,4,18,1,-1.],[7,4,6,1,3.]],threshold:7.8981826081871986e-003,right_val:0.5946462154388428,left_val:0.3332524895668030},{features:[[13,7,6,4,-1.],[16,7,3,2,2.],[13,9,3,2,2.]],threshold:1.6170160379260778e-003,right_val:0.5577868819236755,left_val:0.3490641117095947},{features:[[9,8,2,12,-1.],[9,12,2,4,3.]],threshold:-5.5449741194024682e-004,right_val:0.3291530013084412,left_val:0.5542566180229187},{features:[[12,1,6,6,-1.],[12,3,6,2,3.]],threshold:1.5428980113938451e-003,right_val:0.5545979142189026,left_val:0.3612579107284546},{features:[[5,2,6,6,-1.],[5,2,3,3,2.],[8,5,3,3,2.]],threshold:-1.0329450014978647e-003,right_val:0.5576140284538269,left_val:0.3530139029026032},{features:[[9,16,6,4,-1.],[12,16,3,2,2.],[9,18,3,2,2.]],threshold:7.7698158565908670e-004,right_val:0.5645321011543274,left_val:0.3916778862476349},{features:[[1,2,18,3,-1.],[7,2,6,3,3.]],threshold:0.1432030051946640,right_val:0.7023633122444153,left_val:0.4667482078075409},{features:[[7,4,9,10,-1.],[7,9,9,5,2.]],threshold:-7.3866490274667740e-003,right_val:0.5289257764816284,left_val:0.3073684871196747},{features:[[5,9,4,4,-1.],[7,9,2,4,2.]],threshold:-6.2936742324382067e-004,right_val:0.4037049114704132,left_val:0.5622118115425110},{features:[[11,10,3,6,-1.],[11,13,3,3,2.]],threshold:7.8893528552725911e-004,right_val:0.3557874858379364,left_val:0.5267661213874817},{features:[[7,11,5,3,-1.],[7,12,5,1,3.]],threshold:-0.0122280502691865,right_val:0.4625549912452698,left_val:0.6668320894241333},{features:[[7,11,6,6,-1.],[10,11,3,3,2.],[7,14,3,3,2.]],threshold:3.5420239437371492e-003,right_val:0.3869673013687134,left_val:0.5521438121795654},{features:[[0,0,10,9,-1.],[0,3,10,3,3.]],threshold:-1.0585320414975286e-003,right_val:0.5320926904678345,left_val:0.3628678023815155},{features:[[13,14,1,6,-1.],[13,16,1,2,3.]],threshold:1.4935660146875307e-005,right_val:0.5363323092460632,left_val:0.4632444977760315},{features:[[0,2,3,6,-1.],[0,4,3,2,3.]],threshold:5.2537708543241024e-003,right_val:0.3265708982944489,left_val:0.5132231712341309},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:-8.2338023930788040e-003,right_val:0.4774140119552612,left_val:0.6693689823150635},{features:[[6,14,1,6,-1.],[6,16,1,2,3.]],threshold:2.1866810129722580e-005,right_val:0.5457931160926819,left_val:0.4053862094879150},{features:[[9,15,2,3,-1.],[9,16,2,1,3.]],threshold:-3.8150229956954718e-003,right_val:0.4793178141117096,left_val:0.6454995870590210},{features:[[6,4,3,3,-1.],[7,4,1,3,3.]],threshold:1.1105879675596952e-003,right_val:0.3529678881168366,left_val:0.5270407199859619},{features:[[9,0,11,3,-1.],[9,1,11,1,3.]],threshold:-5.7707689702510834e-003,right_val:0.5352957844734192,left_val:0.3803547024726868},{features:[[0,6,20,3,-1.],[0,7,20,1,3.]],threshold:-3.0158339068293571e-003,right_val:0.3887133002281189,left_val:0.5339403152465820},{features:[[10,1,1,2,-1.],[10,2,1,1,2.]],threshold:-8.5453689098358154e-004,right_val:0.5273603796958923,left_val:0.3564616143703461},{features:[[9,6,2,6,-1.],[10,6,1,6,2.]],threshold:0.0110505102202296,right_val:0.6849737763404846,left_val:0.4671907126903534},{features:[[5,8,12,1,-1.],[9,8,4,1,3.]],threshold:0.0426058396697044,right_val:0.0702200904488564,left_val:0.5151473283767700},{features:[[3,8,12,1,-1.],[7,8,4,1,3.]],threshold:-3.0781750101596117e-003,right_val:0.5152602195739746,left_val:0.3041661083698273},{features:[[9,7,3,5,-1.],[10,7,1,5,3.]],threshold:-5.4815728217363358e-003,right_val:0.4897229969501495,left_val:0.6430295705795288},{features:[[3,9,6,2,-1.],[6,9,3,2,2.]],threshold:3.1881860923022032e-003,right_val:0.3826209902763367,left_val:0.5307493209838867},{features:[[12,9,3,3,-1.],[12,10,3,1,3.]],threshold:3.5947180003859103e-004,right_val:0.5421904921531677,left_val:0.4650047123432159},{features:[[7,0,6,1,-1.],[9,0,2,1,3.]],threshold:-4.0705031715333462e-003,right_val:0.5079116225242615,left_val:0.2849679887294769},{features:[[12,9,3,3,-1.],[12,10,3,1,3.]],threshold:-0.0145941702648997,right_val:0.5128461718559265,left_val:0.2971645891666412},{features:[[7,10,2,1,-1.],[8,10,1,1,2.]],threshold:-1.1947689927183092e-004,right_val:0.4343082010746002,left_val:0.5631098151206970},{features:[[6,4,9,13,-1.],[9,4,3,13,3.]],threshold:-6.9344649091362953e-004,right_val:0.5359959006309509,left_val:0.4403578042984009},{features:[[6,8,4,2,-1.],[6,9,4,1,2.]],threshold:1.4834799912932795e-005,right_val:0.5164697766304016,left_val:0.3421008884906769},{features:[[16,2,4,6,-1.],[16,2,2,6,2.]],threshold:9.0296985581517220e-003,right_val:0.6114075183868408,left_val:0.4639343023300171},{features:[[0,17,6,3,-1.],[0,18,6,1,3.]],threshold:-8.0640818923711777e-003,right_val:0.5075494050979614,left_val:0.2820158898830414},{features:[[10,10,3,10,-1.],[10,15,3,5,2.]],threshold:0.0260621197521687,right_val:0.2688778042793274,left_val:0.5208905935287476},{features:[[8,7,3,5,-1.],[9,7,1,5,3.]],threshold:0.0173146594315767,right_val:0.6738539934158325,left_val:0.4663713872432709},{features:[[10,4,4,3,-1.],[10,4,2,3,2.]],threshold:0.0226666405797005,right_val:0.2212723940610886,left_val:0.5209349989891052},{features:[[8,4,3,8,-1.],[9,4,1,8,3.]],threshold:-2.1965929772704840e-003,right_val:0.4538190066814423,left_val:0.6063101291656494},{features:[[6,6,9,13,-1.],[9,6,3,13,3.]],threshold:-9.5282476395368576e-003,right_val:0.5247430801391602,left_val:0.4635204970836639},{features:[[6,0,8,12,-1.],[6,0,4,6,2.],[10,6,4,6,2.]],threshold:8.0943619832396507e-003,right_val:0.3913882076740265,left_val:0.5289440155029297},{features:[[14,2,6,8,-1.],[16,2,2,8,3.]],threshold:-0.0728773325681686,right_val:0.4990234971046448,left_val:0.7752001881599426},{features:[[6,0,3,6,-1.],[7,0,1,6,3.]],threshold:-6.9009521976113319e-003,right_val:0.5048090219497681,left_val:0.2428039014339447},{features:[[14,2,6,8,-1.],[16,2,2,8,3.]],threshold:-0.0113082397729158,right_val:0.4842376112937927,left_val:0.5734364986419678},{features:[[0,5,6,6,-1.],[0,8,6,3,2.]],threshold:0.0596132017672062,right_val:0.2524977028369904,left_val:0.5029836297035217},{features:[[9,12,6,2,-1.],[12,12,3,1,2.],[9,13,3,1,2.]],threshold:-2.8624620754271746e-003,right_val:0.4898459911346436,left_val:0.6073045134544373},{features:[[8,17,3,2,-1.],[9,17,1,2,3.]],threshold:4.4781449250876904e-003,right_val:0.2220316976308823,left_val:0.5015289187431335},{features:[[11,6,2,2,-1.],[12,6,1,1,2.],[11,7,1,1,2.]],threshold:-1.7513240454718471e-003,right_val:0.4933868944644928,left_val:0.6614428758621216},{features:[[1,9,18,2,-1.],[7,9,6,2,3.]],threshold:0.0401634201407433,right_val:0.3741044998168945,left_val:0.5180878043174744},{features:[[11,6,2,2,-1.],[12,6,1,1,2.],[11,7,1,1,2.]],threshold:3.4768949262797832e-004,right_val:0.5818032026290894,left_val:0.4720416963100433},{features:[[3,4,12,8,-1.],[7,4,4,8,3.]],threshold:2.6551650371402502e-003,right_val:0.5221335887908936,left_val:0.3805010914802551},{features:[[13,11,5,3,-1.],[13,12,5,1,3.]],threshold:-8.7706279009580612e-003,right_val:0.5231295228004456,left_val:0.2944166064262390},{features:[[9,10,2,3,-1.],[9,11,2,1,3.]],threshold:-5.5122091434895992e-003,right_val:0.4722816944122315,left_val:0.7346177101135254},{features:[[14,7,2,3,-1.],[14,7,1,3,2.]],threshold:6.8672042107209563e-004,right_val:0.4242413043975830,left_val:0.5452876091003418},{features:[[5,4,1,3,-1.],[5,5,1,1,3.]],threshold:5.6019669864326715e-004,right_val:0.5601285099983215,left_val:0.4398862123489380},{features:[[13,4,2,3,-1.],[13,5,2,1,3.]],threshold:2.4143769405782223e-003,right_val:0.6136621832847595,left_val:0.4741686880588532},{features:[[5,4,2,3,-1.],[5,5,2,1,3.]],threshold:-1.5680900542065501e-003,right_val:0.4516409933567047,left_val:0.6044552922248840},{features:[[9,8,2,3,-1.],[9,9,2,1,3.]],threshold:-3.6827491130679846e-003,right_val:0.5294982194900513,left_val:0.2452459037303925},{features:[[8,9,2,2,-1.],[8,10,2,1,2.]],threshold:-2.9409190756268799e-004,right_val:0.5251451134681702,left_val:0.3732838034629822},{features:[[15,14,1,4,-1.],[15,16,1,2,2.]],threshold:4.2847759323194623e-004,right_val:0.4065535068511963,left_val:0.5498809814453125},{features:[[3,12,2,2,-1.],[3,13,2,1,2.]],threshold:-4.8817070201039314e-003,right_val:0.4999957084655762,left_val:0.2139908969402313},{features:[[12,15,2,2,-1.],[13,15,1,1,2.],[12,16,1,1,2.]],threshold:2.7272020815871656e-004,right_val:0.5813428759574890,left_val:0.4650287032127380},{features:[[9,13,2,2,-1.],[9,14,2,1,2.]],threshold:2.0947199664078653e-004,right_val:0.5572792887687683,left_val:0.4387486875057221},{features:[[4,11,14,9,-1.],[4,14,14,3,3.]],threshold:0.0485011897981167,right_val:0.3212889134883881,left_val:0.5244972705841065},{features:[[7,13,4,3,-1.],[7,14,4,1,3.]],threshold:-4.5166411437094212e-003,right_val:0.4545882046222687,left_val:0.6056813001632690},{features:[[15,14,1,4,-1.],[15,16,1,2,2.]],threshold:-0.0122916800901294,right_val:0.5152214169502258,left_val:0.2040929049253464},{features:[[4,14,1,4,-1.],[4,16,1,2,2.]],threshold:4.8549679922871292e-004,right_val:0.3739503026008606,left_val:0.5237604975700378},{features:[[14,0,6,13,-1.],[16,0,2,13,3.]],threshold:0.0305560491979122,right_val:0.5938246250152588,left_val:0.4960533976554871},{features:[[4,1,2,12,-1.],[4,1,1,6,2.],[5,7,1,6,2.]],threshold:-1.5105320198927075e-004,right_val:0.4145204126834869,left_val:0.5351303815841675},{features:[[11,14,6,6,-1.],[14,14,3,3,2.],[11,17,3,3,2.]],threshold:2.4937440175563097e-003,right_val:0.5514941215515137,left_val:0.4693366885185242},{features:[[3,14,6,6,-1.],[3,14,3,3,2.],[6,17,3,3,2.]],threshold:-0.0123821301385760,right_val:0.4681667983531952,left_val:0.6791396737098694},{features:[[14,17,3,2,-1.],[14,18,3,1,2.]],threshold:-5.1333461888134480e-003,right_val:0.5229160189628601,left_val:0.3608739078044891},{features:[[3,17,3,2,-1.],[3,18,3,1,2.]],threshold:5.1919277757406235e-004,right_val:0.3633613884449005,left_val:0.5300073027610779},{features:[[14,0,6,13,-1.],[16,0,2,13,3.]],threshold:0.1506042033433914,right_val:0.2211782038211823,left_val:0.5157316923141480},{features:[[0,0,6,13,-1.],[2,0,2,13,3.]],threshold:7.7144149690866470e-003,right_val:0.5776609182357788,left_val:0.4410496950149536},{features:[[10,10,7,6,-1.],[10,12,7,2,3.]],threshold:9.4443522393703461e-003,right_val:0.3756650090217590,left_val:0.5401855111122131},{features:[[6,15,2,2,-1.],[6,15,1,1,2.],[7,16,1,1,2.]],threshold:2.5006249779835343e-004,right_val:0.5607374906539917,left_val:0.4368270933628082},{features:[[6,11,8,6,-1.],[10,11,4,3,2.],[6,14,4,3,2.]],threshold:-3.3077150583267212e-003,right_val:0.5518230795860291,left_val:0.4244799017906189},{features:[[7,6,2,2,-1.],[7,6,1,1,2.],[8,7,1,1,2.]],threshold:7.4048910755664110e-004,right_val:0.5900576710700989,left_val:0.4496962130069733},{features:[[2,2,16,6,-1.],[10,2,8,3,2.],[2,5,8,3,2.]],threshold:0.0440920516848564,right_val:0.3156355023384094,left_val:0.5293493270874023},{features:[[5,4,3,3,-1.],[5,5,3,1,3.]],threshold:3.3639909233897924e-003,right_val:0.5848662257194519,left_val:0.4483296871185303},{features:[[11,7,3,10,-1.],[11,12,3,5,2.]],threshold:-3.9760079234838486e-003,right_val:0.5483639240264893,left_val:0.4559507071971893},{features:[[6,7,3,10,-1.],[6,12,3,5,2.]],threshold:2.7716930489987135e-003,right_val:0.3792484104633331,left_val:0.5341786146163940},{features:[[10,7,3,2,-1.],[11,7,1,2,3.]],threshold:-2.4123019829858094e-004,right_val:0.4576973021030426,left_val:0.5667188763618469},{features:[[8,12,4,2,-1.],[8,13,4,1,2.]],threshold:4.9425667384639382e-004,right_val:0.5628787279129028,left_val:0.4421244859695435},{features:[[10,1,1,3,-1.],[10,2,1,1,3.]],threshold:-3.8876468897797167e-004,right_val:0.5391063094139099,left_val:0.4288370907306671},{features:[[1,2,4,18,-1.],[1,2,2,9,2.],[3,11,2,9,2.]],threshold:-0.0500488989055157,right_val:0.4703742861747742,left_val:0.6899513006210327},{features:[[12,4,4,12,-1.],[12,10,4,6,2.]],threshold:-0.0366354808211327,right_val:0.5191826224327087,left_val:0.2217779010534287},{features:[[0,0,1,6,-1.],[0,2,1,2,3.]],threshold:2.4273579474538565e-003,right_val:0.3497397899627686,left_val:0.5136224031448364},{features:[[9,11,2,3,-1.],[9,12,2,1,3.]],threshold:1.9558030180633068e-003,right_val:0.6408380866050720,left_val:0.4826192855834961},{features:[[8,7,4,3,-1.],[8,8,4,1,3.]],threshold:-1.7494610510766506e-003,right_val:0.5272685289382935,left_val:0.3922835886478424},{features:[[10,7,3,2,-1.],[11,7,1,2,3.]],threshold:0.0139550799503922,right_val:0.8416504859924316,left_val:0.5078201889991760},{features:[[7,7,3,2,-1.],[8,7,1,2,3.]],threshold:-2.1896739781368524e-004,right_val:0.4314234852790833,left_val:0.5520489811897278},{features:[[9,4,6,1,-1.],[11,4,2,1,3.]],threshold:-1.5131309628486633e-003,right_val:0.5382571220397949,left_val:0.3934605121612549},{features:[[8,7,2,3,-1.],[9,7,1,3,2.]],threshold:-4.3622800149023533e-003,right_val:0.4736475944519043,left_val:0.7370628714561462},{features:[[12,7,8,6,-1.],[16,7,4,3,2.],[12,10,4,3,2.]],threshold:0.0651605874300003,right_val:0.3281595110893250,left_val:0.5159279704093933},{features:[[0,7,8,6,-1.],[0,7,4,3,2.],[4,10,4,3,2.]],threshold:-2.3567399475723505e-003,right_val:0.5172886252403259,left_val:0.3672826886177063},{features:[[18,2,2,10,-1.],[19,2,1,5,2.],[18,7,1,5,2.]],threshold:0.0151466596871614,right_val:0.6687604188919067,left_val:0.5031493902206421},{features:[[0,2,6,4,-1.],[3,2,3,4,2.]],threshold:-0.0228509604930878,right_val:0.4709596931934357,left_val:0.6767519712448120},{features:[[9,4,6,1,-1.],[11,4,2,1,3.]],threshold:4.8867650330066681e-003,right_val:0.4059878885746002,left_val:0.5257998108863831},{features:[[7,15,2,2,-1.],[7,15,1,1,2.],[8,16,1,1,2.]],threshold:1.7619599821045995e-003,right_val:0.6688278913497925,left_val:0.4696272909641266},{features:[[11,13,1,6,-1.],[11,16,1,3,2.]],threshold:-1.2942519970238209e-003,right_val:0.5344281792640686,left_val:0.4320712983608246},{features:[[8,13,1,6,-1.],[8,16,1,3,2.]],threshold:0.0109299495816231,right_val:0.1637486070394516,left_val:0.4997706115245819},{features:[[14,3,2,1,-1.],[14,3,1,1,2.]],threshold:2.9958489903947338e-005,right_val:0.5633224248886108,left_val:0.4282417893409729},{features:[[8,15,2,3,-1.],[8,16,2,1,3.]],threshold:-6.5884361974895000e-003,right_val:0.4700526893138886,left_val:0.6772121191024780},{features:[[12,15,7,4,-1.],[12,17,7,2,2.]],threshold:3.2527779694646597e-003,right_val:0.4536148905754089,left_val:0.5313397049903870},{features:[[4,14,12,3,-1.],[4,15,12,1,3.]],threshold:-4.0435739792883396e-003,right_val:0.4413388967514038,left_val:0.5660061836242676},{features:[[10,3,3,2,-1.],[11,3,1,2,3.]],threshold:-1.2523540062829852e-003,right_val:0.5356451869010925,left_val:0.3731913864612579},{features:[[4,12,2,2,-1.],[4,13,2,1,2.]],threshold:1.9246719602961093e-004,right_val:0.3738811016082764,left_val:0.5189986228942871},{features:[[10,11,4,6,-1.],[10,14,4,3,2.]],threshold:-0.0385896712541580,right_val:0.5188810825347900,left_val:0.2956373989582062},{features:[[7,13,2,2,-1.],[7,13,1,1,2.],[8,14,1,1,2.]],threshold:1.5489870565943420e-004,right_val:0.5509533286094666,left_val:0.4347135126590729},{features:[[4,11,14,4,-1.],[11,11,7,2,2.],[4,13,7,2,2.]],threshold:-0.0337638482451439,right_val:0.5195475816726685,left_val:0.3230330049991608},{features:[[1,18,18,2,-1.],[7,18,6,2,3.]],threshold:-8.2657067105174065e-003,right_val:0.4552114009857178,left_val:0.5975489020347595},{features:[[11,18,2,2,-1.],[12,18,1,1,2.],[11,19,1,1,2.]],threshold:1.4481440302915871e-005,right_val:0.5497426986694336,left_val:0.4745678007602692},{features:[[7,18,2,2,-1.],[7,18,1,1,2.],[8,19,1,1,2.]],threshold:1.4951299817766994e-005,right_val:0.5480644106864929,left_val:0.4324473142623901},{features:[[12,18,8,2,-1.],[12,19,8,1,2.]],threshold:-0.0187417995184660,right_val:0.5178533196449280,left_val:0.1580052971839905},{features:[[7,14,6,2,-1.],[7,15,6,1,2.]],threshold:1.7572239739820361e-003,right_val:0.5773764252662659,left_val:0.4517636895179749},{features:[[8,12,4,8,-1.],[10,12,2,4,2.],[8,16,2,4,2.]],threshold:-3.1391119118779898e-003,right_val:0.5460842251777649,left_val:0.4149647951126099},{features:[[4,9,3,3,-1.],[4,10,3,1,3.]],threshold:6.6656779381446540e-005,right_val:0.5293084979057312,left_val:0.4039090871810913},{features:[[7,10,6,2,-1.],[9,10,2,2,3.]],threshold:6.7743421532213688e-003,right_val:0.6121956110000610,left_val:0.4767651855945587},{features:[[5,0,4,15,-1.],[7,0,2,15,2.]],threshold:-7.3868161998689175e-003,right_val:0.5187280774116516,left_val:0.3586258888244629},{features:[[8,6,12,14,-1.],[12,6,4,14,3.]],threshold:0.0140409301966429,right_val:0.5576155781745911,left_val:0.4712139964103699},{features:[[5,16,3,3,-1.],[5,17,3,1,3.]],threshold:-5.5258329957723618e-003,right_val:0.5039281249046326,left_val:0.2661027014255524},{features:[[8,1,12,19,-1.],[12,1,4,19,3.]],threshold:0.3868423998355866,right_val:0.2525899112224579,left_val:0.5144339799880981},{features:[[3,0,3,2,-1.],[3,1,3,1,2.]],threshold:1.1459240340627730e-004,right_val:0.5423371195793152,left_val:0.4284994900226593},{features:[[10,12,4,5,-1.],[10,12,2,5,2.]],threshold:-0.0184675697237253,right_val:0.5213062167167664,left_val:0.3885835111141205},{features:[[6,12,4,5,-1.],[8,12,2,5,2.]],threshold:-4.5907011372037232e-004,right_val:0.4235909879207611,left_val:0.5412563085556030},{features:[[11,11,2,2,-1.],[12,11,1,1,2.],[11,12,1,1,2.]],threshold:1.2527540093287826e-003,right_val:0.6624091267585754,left_val:0.4899305105209351},{features:[[0,2,3,6,-1.],[0,4,3,2,3.]],threshold:1.4910609461367130e-003,right_val:0.4040051996707916,left_val:0.5286778211593628},{features:[[11,11,2,2,-1.],[12,11,1,1,2.],[11,12,1,1,2.]],threshold:-7.5435562757775187e-004,right_val:0.4795120060443878,left_val:0.6032990217208862},{features:[[7,6,4,10,-1.],[7,11,4,5,2.]],threshold:-6.9478838704526424e-003,right_val:0.5373504161834717,left_val:0.4084401130676270},{features:[[11,11,2,2,-1.],[12,11,1,1,2.],[11,12,1,1,2.]],threshold:2.8092920547351241e-004,right_val:0.5759382247924805,left_val:0.4846062958240509},{features:[[2,13,5,2,-1.],[2,14,5,1,2.]],threshold:9.6073717577382922e-004,right_val:0.3554979860782623,left_val:0.5164741277694702},{features:[[11,11,2,2,-1.],[12,11,1,1,2.],[11,12,1,1,2.]],threshold:-2.6883929967880249e-004,right_val:0.4731765985488892,left_val:0.5677582025527954},{features:[[7,11,2,2,-1.],[7,11,1,1,2.],[8,12,1,1,2.]],threshold:2.1599370520561934e-003,right_val:0.7070567011833191,left_val:0.4731487035751343},{features:[[14,13,3,3,-1.],[14,14,3,1,3.]],threshold:5.6235301308333874e-003,right_val:0.2781791985034943,left_val:0.5240243077278137},{features:[[3,13,3,3,-1.],[3,14,3,1,3.]],threshold:-5.0243991427123547e-003,right_val:0.5062304139137268,left_val:0.2837013900279999},{features:[[9,14,2,3,-1.],[9,15,2,1,3.]],threshold:-9.7611639648675919e-003,right_val:0.4934569001197815,left_val:0.7400717735290527},{features:[[8,7,3,3,-1.],[8,8,3,1,3.]],threshold:4.1515100747346878e-003,right_val:0.3407008051872253,left_val:0.5119131207466126},{features:[[13,5,3,3,-1.],[13,6,3,1,3.]],threshold:6.2465080991387367e-003,right_val:0.6579058766365051,left_val:0.4923788011074066},{features:[[0,9,5,3,-1.],[0,10,5,1,3.]],threshold:-7.0597478188574314e-003,right_val:0.5032842159271240,left_val:0.2434711009263992},{features:[[13,5,3,3,-1.],[13,6,3,1,3.]],threshold:-2.0587709732353687e-003,right_val:0.4695087075233460,left_val:0.5900310873985291},{features:[[9,12,2,8,-1.],[9,12,1,4,2.],[10,16,1,4,2.]],threshold:-2.4146060459315777e-003,right_val:0.5189201831817627,left_val:0.3647317886352539},{features:[[11,7,2,2,-1.],[12,7,1,1,2.],[11,8,1,1,2.]],threshold:-1.4817609917372465e-003,right_val:0.4940128028392792,left_val:0.6034948229789734},{features:[[0,16,6,4,-1.],[3,16,3,4,2.]],threshold:-6.3016400672495365e-003,right_val:0.4560427963733673,left_val:0.5818989872932434},{features:[[10,6,2,3,-1.],[10,7,2,1,3.]],threshold:3.4763428848236799e-003,right_val:0.3483993113040924,left_val:0.5217475891113281},{features:[[9,5,2,6,-1.],[9,7,2,2,3.]],threshold:-0.0222508702427149,right_val:0.5032082796096802,left_val:0.2360700070858002},{features:[[12,15,8,4,-1.],[12,15,4,4,2.]],threshold:-0.0306125506758690,right_val:0.4914919137954712,left_val:0.6499186754226685},{features:[[0,14,8,6,-1.],[4,14,4,6,2.]],threshold:0.0130574796348810,right_val:0.5683764219284058,left_val:0.4413323104381561},{features:[[9,0,3,2,-1.],[10,0,1,2,3.]],threshold:-6.0095742810517550e-004,right_val:0.5333483219146729,left_val:0.4359731078147888},{features:[[4,15,4,2,-1.],[6,15,2,2,2.]],threshold:-4.1514250915497541e-004,right_val:0.4326060116291046,left_val:0.5504062771797180},{features:[[12,7,3,13,-1.],[13,7,1,13,3.]],threshold:-0.0137762902304530,right_val:0.5201548933982849,left_val:0.4064112901687622},{features:[[5,7,3,13,-1.],[6,7,1,13,3.]],threshold:-0.0322965085506439,right_val:0.4977194964885712,left_val:0.0473519712686539},{features:[[9,6,3,9,-1.],[9,9,3,3,3.]],threshold:0.0535569787025452,right_val:0.6666939258575440,left_val:0.4881733059883118},{features:[[4,4,7,12,-1.],[4,10,7,6,2.]],threshold:8.1889545544981956e-003,right_val:0.4240820109844208,left_val:0.5400037169456482},{features:[[12,12,2,2,-1.],[13,12,1,1,2.],[12,13,1,1,2.]],threshold:2.1055320394225419e-004,right_val:0.5563852787017822,left_val:0.4802047908306122},{features:[[6,12,2,2,-1.],[6,12,1,1,2.],[7,13,1,1,2.]],threshold:-2.4382730480283499e-003,right_val:0.4773685038089752,left_val:0.7387793064117432},{features:[[8,9,4,2,-1.],[10,9,2,1,2.],[8,10,2,1,2.]],threshold:3.2835570164024830e-003,right_val:0.3171291947364807,left_val:0.5288546085357666},{features:[[3,6,2,2,-1.],[3,6,1,1,2.],[4,7,1,1,2.]],threshold:2.3729570675641298e-003,right_val:0.7060170769691467,left_val:0.4750812947750092},{features:[[16,6,3,2,-1.],[16,7,3,1,2.]],threshold:-1.4541699783876538e-003,right_val:0.5330739021301270,left_val:0.3811730146408081}],threshold:79.2490768432617190},{simpleClassifiers:[{features:[[0,7,19,4,-1.],[0,9,19,2,2.]],threshold:0.0557552389800549,right_val:0.6806036829948425,left_val:0.4019156992435455},{features:[[10,2,10,1,-1.],[10,2,5,1,2.]],threshold:2.4730248842388391e-003,right_val:0.5965719819068909,left_val:0.3351148962974548},{features:[[9,4,2,12,-1.],[9,10,2,6,2.]],threshold:-3.5031698644161224e-004,right_val:0.3482286930084229,left_val:0.5557708144187927},{features:[[12,18,4,1,-1.],[12,18,2,1,2.]],threshold:5.4167630150914192e-004,right_val:0.5693380832672119,left_val:0.4260858893394470},{features:[[1,7,6,4,-1.],[1,7,3,2,2.],[4,9,3,2,2.]],threshold:7.7193678589537740e-004,right_val:0.5433688759803772,left_val:0.3494240045547485},{features:[[12,0,6,13,-1.],[14,0,2,13,3.]],threshold:-1.5999219613149762e-003,right_val:0.5484359264373779,left_val:0.4028499126434326},{features:[[2,0,6,13,-1.],[4,0,2,13,3.]],threshold:-1.1832080053864047e-004,right_val:0.5425465106964111,left_val:0.3806901872158051},{features:[[10,5,8,8,-1.],[10,9,8,4,2.]],threshold:3.2909031142480671e-004,right_val:0.5429521799087524,left_val:0.2620100080966950},{features:[[8,3,2,5,-1.],[9,3,1,5,2.]],threshold:2.9518108931370080e-004,right_val:0.5399264097213745,left_val:0.3799768984317780},{features:[[8,4,9,1,-1.],[11,4,3,1,3.]],threshold:9.0466710389591753e-005,right_val:0.5440226197242737,left_val:0.4433645009994507},{features:[[3,4,9,1,-1.],[6,4,3,1,3.]],threshold:1.5007190086180344e-005,right_val:0.5409119725227356,left_val:0.3719654977321625},{features:[[1,0,18,10,-1.],[7,0,6,10,3.]],threshold:0.1393561065196991,right_val:0.4479042887687683,left_val:0.5525395870208740},{features:[[7,17,5,3,-1.],[7,18,5,1,3.]],threshold:1.6461990308016539e-003,right_val:0.5772169828414917,left_val:0.4264501035213471},{features:[[7,11,6,1,-1.],[9,11,2,1,3.]],threshold:4.9984431825578213e-004,right_val:0.5685871243476868,left_val:0.4359526038169861},{features:[[2,2,3,2,-1.],[2,3,3,1,2.]],threshold:-1.0971280280500650e-003,right_val:0.5205408930778503,left_val:0.3390136957168579},{features:[[8,12,4,2,-1.],[8,13,4,1,2.]],threshold:6.6919892560690641e-004,right_val:0.5980659723281860,left_val:0.4557456076145172},{features:[[6,10,3,6,-1.],[6,13,3,3,2.]],threshold:8.6471042595803738e-004,right_val:0.2944033145904541,left_val:0.5134841203689575},{features:[[11,4,2,4,-1.],[11,4,1,4,2.]],threshold:-2.7182599296793342e-004,right_val:0.5377181172370911,left_val:0.3906578123569489},{features:[[7,4,2,4,-1.],[8,4,1,4,2.]],threshold:3.0249499104684219e-005,right_val:0.5225688815116882,left_val:0.3679609894752502},{features:[[9,6,2,4,-1.],[9,6,1,4,2.]],threshold:-8.5225896909832954e-003,right_val:0.4892365038394928,left_val:0.7293102145195007},{features:[[6,13,8,3,-1.],[6,14,8,1,3.]],threshold:1.6705560265108943e-003,right_val:0.5696138143539429,left_val:0.4345324933528900},{features:[[9,15,3,4,-1.],[10,15,1,4,3.]],threshold:-7.1433838456869125e-003,right_val:0.5225623846054077,left_val:0.2591280043125153},{features:[[9,2,2,17,-1.],[10,2,1,17,2.]],threshold:-0.0163193698972464,right_val:0.4651575982570648,left_val:0.6922279000282288},{features:[[7,0,6,1,-1.],[9,0,2,1,3.]],threshold:4.8034260980784893e-003,right_val:0.3286302983760834,left_val:0.5352262854576111},{features:[[8,15,3,4,-1.],[9,15,1,4,3.]],threshold:-7.5421929359436035e-003,right_val:0.5034546256065369,left_val:0.2040544003248215},{features:[[7,13,7,3,-1.],[7,14,7,1,3.]],threshold:-0.0143631100654602,right_val:0.4889059066772461,left_val:0.6804888844490051},{features:[[8,16,3,3,-1.],[9,16,1,3,3.]],threshold:8.9063588529825211e-004,right_val:0.3895480930805206,left_val:0.5310695767402649},{features:[[6,2,8,10,-1.],[6,7,8,5,2.]],threshold:-4.4060191139578819e-003,right_val:0.4372426867485046,left_val:0.5741562843322754},{features:[[2,5,8,8,-1.],[2,9,8,4,2.]],threshold:-1.8862540309783071e-004,right_val:0.5098205208778381,left_val:0.2831785976886749},{features:[[14,16,2,2,-1.],[14,17,2,1,2.]],threshold:-3.7979281041771173e-003,right_val:0.5246580243110657,left_val:0.3372507989406586},{features:[[4,16,2,2,-1.],[4,17,2,1,2.]],threshold:1.4627049677073956e-004,right_val:0.3911710083484650,left_val:0.5306674242019653},{features:[[10,11,4,6,-1.],[10,14,4,3,2.]],threshold:-4.9164638767251745e-005,right_val:0.3942720890045166,left_val:0.5462496280670166},{features:[[6,11,4,6,-1.],[6,14,4,3,2.]],threshold:-0.0335825011134148,right_val:0.5048211812973023,left_val:0.2157824039459229},{features:[[10,14,1,3,-1.],[10,15,1,1,3.]],threshold:-3.5339309833943844e-003,right_val:0.4872696995735169,left_val:0.6465312242507935},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:5.0144111737608910e-003,right_val:0.6248074769973755,left_val:0.4617668092250824},{features:[[10,0,4,6,-1.],[12,0,2,3,2.],[10,3,2,3,2.]],threshold:0.0188173707574606,right_val:0.2000052034854889,left_val:0.5220689177513123},{features:[[0,3,20,2,-1.],[0,4,20,1,2.]],threshold:-1.3434339780360460e-003,right_val:0.5301619768142700,left_val:0.4014537930488586},{features:[[12,0,8,2,-1.],[16,0,4,1,2.],[12,1,4,1,2.]],threshold:1.7557960236445069e-003,right_val:0.5653169751167297,left_val:0.4794039130210877},{features:[[2,12,10,8,-1.],[2,16,10,4,2.]],threshold:-0.0956374630331993,right_val:0.5006706714630127,left_val:0.2034195065498352},{features:[[17,7,2,10,-1.],[18,7,1,5,2.],[17,12,1,5,2.]],threshold:-0.0222412291914225,right_val:0.5046340227127075,left_val:0.7672473192214966},{features:[[1,7,2,10,-1.],[1,7,1,5,2.],[2,12,1,5,2.]],threshold:-0.0155758196488023,right_val:0.4755851030349731,left_val:0.7490342259407044},{features:[[15,10,3,6,-1.],[15,12,3,2,3.]],threshold:5.3599118255078793e-003,right_val:0.4004670977592468,left_val:0.5365303754806519},{features:[[4,4,6,2,-1.],[6,4,2,2,3.]],threshold:-0.0217634998261929,right_val:0.4964174926280975,left_val:0.0740154981613159},{features:[[0,5,20,6,-1.],[0,7,20,2,3.]],threshold:-0.1656159013509750,right_val:0.5218086242675781,left_val:0.2859103083610535},{features:[[0,0,8,2,-1.],[0,0,4,1,2.],[4,1,4,1,2.]],threshold:1.6461320046801120e-004,right_val:0.5380793213844299,left_val:0.4191615879535675},{features:[[1,0,18,4,-1.],[7,0,6,4,3.]],threshold:-8.9077502489089966e-003,right_val:0.4877404868602753,left_val:0.6273192763328552},{features:[[1,13,6,2,-1.],[1,14,6,1,2.]],threshold:8.6346449097618461e-004,right_val:0.3671025931835175,left_val:0.5159940719604492},{features:[[10,8,3,4,-1.],[11,8,1,4,3.]],threshold:-1.3751760125160217e-003,right_val:0.4579083919525147,left_val:0.5884376764297485},{features:[[6,1,6,1,-1.],[8,1,2,1,3.]],threshold:-1.4081239933148026e-003,right_val:0.5139945149421692,left_val:0.3560509979724884},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:-3.9342888630926609e-003,right_val:0.4664272069931030,left_val:0.5994288921356201},{features:[[1,6,18,2,-1.],[10,6,9,2,2.]],threshold:-0.0319669283926487,right_val:0.5144183039665222,left_val:0.3345462083816528},{features:[[15,11,1,2,-1.],[15,12,1,1,2.]],threshold:-1.5089280168467667e-005,right_val:0.4414057135581970,left_val:0.5582656264305115},{features:[[6,5,1,2,-1.],[6,6,1,1,2.]],threshold:5.1994470413774252e-004,right_val:0.6168993711471558,left_val:0.4623680114746094},{features:[[13,4,1,3,-1.],[13,5,1,1,3.]],threshold:-3.4220460802316666e-003,right_val:0.4974805116653442,left_val:0.6557074785232544},{features:[[2,15,1,2,-1.],[2,16,1,1,2.]],threshold:1.7723299970384687e-004,right_val:0.3901908099651337,left_val:0.5269501805305481},{features:[[12,4,4,3,-1.],[12,5,4,1,3.]],threshold:1.5716759953647852e-003,right_val:0.5790457725524902,left_val:0.4633373022079468},{features:[[0,0,7,3,-1.],[0,1,7,1,3.]],threshold:-8.9041329920291901e-003,right_val:0.5053591132164002,left_val:0.2689608037471771},{features:[[9,12,6,2,-1.],[9,12,3,2,2.]],threshold:4.0677518700249493e-004,right_val:0.4329898953437805,left_val:0.5456603169441223},{features:[[5,4,2,3,-1.],[5,5,2,1,3.]],threshold:6.7604780197143555e-003,right_val:0.6689761877059937,left_val:0.4648993909358978},{features:[[18,4,2,3,-1.],[18,5,2,1,3.]],threshold:2.9100088868290186e-003,right_val:0.3377839922904968,left_val:0.5309703946113586},{features:[[3,0,8,6,-1.],[3,2,8,2,3.]],threshold:1.3885459629818797e-003,right_val:0.5349133014678955,left_val:0.4074738919734955},{features:[[0,2,20,6,-1.],[10,2,10,3,2.],[0,5,10,3,2.]],threshold:-0.0767642632126808,right_val:0.5228242278099060,left_val:0.1992176026105881},{features:[[4,7,2,4,-1.],[5,7,1,4,2.]],threshold:-2.2688310127705336e-004,right_val:0.4253072142601013,left_val:0.5438501834869385},{features:[[3,10,15,2,-1.],[8,10,5,2,3.]],threshold:-6.3094152137637138e-003,right_val:0.5378909707069397,left_val:0.4259178936481476},{features:[[3,0,12,11,-1.],[9,0,6,11,2.]],threshold:-0.1100727990269661,right_val:0.4721749126911163,left_val:0.6904156804084778},{features:[[13,0,2,6,-1.],[13,0,1,6,2.]],threshold:2.8619659133255482e-004,right_val:0.5548306107521057,left_val:0.4524914920330048},{features:[[0,19,2,1,-1.],[1,19,1,1,2.]],threshold:2.9425329557852820e-005,right_val:0.4236463904380798,left_val:0.5370373725891113},{features:[[16,10,4,10,-1.],[18,10,2,5,2.],[16,15,2,5,2.]],threshold:-0.0248865708708763,right_val:0.4969303905963898,left_val:0.6423557996749878},{features:[[4,8,10,3,-1.],[4,9,10,1,3.]],threshold:0.0331488512456417,right_val:0.1613811999559403,left_val:0.4988475143909454},{features:[[14,12,3,3,-1.],[14,13,3,1,3.]],threshold:7.8491691965609789e-004,right_val:0.4223009049892426,left_val:0.5416026115417481},{features:[[0,10,4,10,-1.],[0,10,2,5,2.],[2,15,2,5,2.]],threshold:4.7087189741432667e-003,right_val:0.6027557849884033,left_val:0.4576328992843628},{features:[[18,3,2,6,-1.],[18,5,2,2,3.]],threshold:2.4144479539245367e-003,right_val:0.4422498941421509,left_val:0.5308973193168640},{features:[[6,6,1,3,-1.],[6,7,1,1,3.]],threshold:1.9523180089890957e-003,right_val:0.6663324832916260,left_val:0.4705634117126465},{features:[[7,7,7,2,-1.],[7,8,7,1,2.]],threshold:1.3031980488449335e-003,right_val:0.5526962280273438,left_val:0.4406126141548157},{features:[[0,3,2,6,-1.],[0,5,2,2,3.]],threshold:4.4735497795045376e-003,right_val:0.3301498889923096,left_val:0.5129023790359497},{features:[[11,1,3,1,-1.],[12,1,1,1,3.]],threshold:-2.6652868837118149e-003,right_val:0.5175036191940308,left_val:0.3135471045970917},{features:[[5,0,2,6,-1.],[6,0,1,6,2.]],threshold:1.3666770246345550e-004,right_val:0.5306876897811890,left_val:0.4119370877742767},{features:[[1,1,18,14,-1.],[7,1,6,14,3.]],threshold:-0.0171264503151178,right_val:0.4836578965187073,left_val:0.6177806258201599},{features:[[4,6,8,3,-1.],[8,6,4,3,2.]],threshold:-2.6601430727168918e-004,right_val:0.5169736742973328,left_val:0.3654330968856812},{features:[[9,12,6,2,-1.],[9,12,3,2,2.]],threshold:-0.0229323804378510,right_val:0.5163992047309876,left_val:0.3490915000438690},{features:[[5,12,6,2,-1.],[8,12,3,2,2.]],threshold:2.3316550068557262e-003,right_val:0.3709389865398407,left_val:0.5166299939155579},{features:[[10,7,3,5,-1.],[11,7,1,5,3.]],threshold:0.0169256608933210,right_val:0.8053988218307495,left_val:0.5014736056327820},{features:[[7,7,3,5,-1.],[8,7,1,5,3.]],threshold:-8.9858826249837875e-003,right_val:0.4657020866870880,left_val:0.6470788717269898},{features:[[13,0,3,10,-1.],[14,0,1,10,3.]],threshold:-0.0118746999651194,right_val:0.5258755087852478,left_val:0.3246378898620606},{features:[[4,11,3,2,-1.],[4,12,3,1,2.]],threshold:1.9350569345988333e-004,right_val:0.3839643895626068,left_val:0.5191941857337952},{features:[[17,3,3,6,-1.],[18,3,1,6,3.]],threshold:5.8713490143418312e-003,right_val:0.6187043190002441,left_val:0.4918133914470673},{features:[[1,8,18,10,-1.],[1,13,18,5,2.]],threshold:-0.2483879029750824,right_val:0.4988150000572205,left_val:0.1836802959442139},{features:[[13,0,3,10,-1.],[14,0,1,10,3.]],threshold:0.0122560001909733,right_val:0.3632029891014099,left_val:0.5227053761482239},{features:[[9,14,2,3,-1.],[9,15,2,1,3.]],threshold:8.3990179700776935e-004,right_val:0.5774148106575012,left_val:0.4490250051021576},{features:[[16,3,3,7,-1.],[17,3,1,7,3.]],threshold:2.5407369248569012e-003,right_val:0.5858299136161804,left_val:0.4804787039756775},{features:[[4,0,3,10,-1.],[5,0,1,10,3.]],threshold:-0.0148224299773574,right_val:0.5023537278175354,left_val:0.2521049976348877},{features:[[16,3,3,7,-1.],[17,3,1,7,3.]],threshold:-5.7973959483206272e-003,right_val:0.4853715002536774,left_val:0.5996695756912231},{features:[[0,9,1,2,-1.],[0,10,1,1,2.]],threshold:7.2662148158997297e-004,right_val:0.3671779930591583,left_val:0.5153716802597046},{features:[[18,1,2,10,-1.],[18,1,1,10,2.]],threshold:-0.0172325801104307,right_val:0.4994656145572662,left_val:0.6621719002723694},{features:[[0,1,2,10,-1.],[1,1,1,10,2.]],threshold:7.8624086454510689e-003,right_val:0.6256101727485657,left_val:0.4633395075798035},{features:[[10,16,3,4,-1.],[11,16,1,4,3.]],threshold:-4.7343620099127293e-003,right_val:0.5281885266304016,left_val:0.3615573048591614},{features:[[2,8,3,3,-1.],[3,8,1,3,3.]],threshold:8.3048478700220585e-004,right_val:0.5550957918167114,left_val:0.4442889094352722},{features:[[11,0,2,6,-1.],[12,0,1,3,2.],[11,3,1,3,2.]],threshold:7.6602199114859104e-003,right_val:0.2613354921340942,left_val:0.5162935256958008},{features:[[7,0,2,6,-1.],[7,0,1,3,2.],[8,3,1,3,2.]],threshold:-4.1048377752304077e-003,right_val:0.5019031763076782,left_val:0.2789632081985474},{features:[[16,3,3,7,-1.],[17,3,1,7,3.]],threshold:4.8512578941881657e-003,right_val:0.5661668181419373,left_val:0.4968984127044678},{features:[[1,3,3,7,-1.],[2,3,1,7,3.]],threshold:9.9896453320980072e-004,right_val:0.5551813244819641,left_val:0.4445607960224152},{features:[[14,1,6,16,-1.],[16,1,2,16,3.]],threshold:-0.2702363133430481,right_val:0.5151314139366150,left_val:0.0293882098048925},{features:[[0,1,6,16,-1.],[2,1,2,16,3.]],threshold:-0.0130906803533435,right_val:0.4447459876537323,left_val:0.5699399709701538},{features:[[2,0,16,8,-1.],[10,0,8,4,2.],[2,4,8,4,2.]],threshold:-9.4342790544033051e-003,right_val:0.5487895011901856,left_val:0.4305466115474701},{features:[[6,8,5,3,-1.],[6,9,5,1,3.]],threshold:-1.5482039889320731e-003,right_val:0.5128080844879150,left_val:0.3680317103862763},{features:[[9,7,3,3,-1.],[10,7,1,3,3.]],threshold:5.3746132180094719e-003,right_val:0.6101555824279785,left_val:0.4838916957378388},{features:[[8,8,4,3,-1.],[8,9,4,1,3.]],threshold:1.5786769799888134e-003,right_val:0.4118548035621643,left_val:0.5325223207473755},{features:[[9,6,2,4,-1.],[9,6,1,4,2.]],threshold:3.6856050137430429e-003,right_val:0.6252303123474121,left_val:0.4810948073863983},{features:[[0,7,15,1,-1.],[5,7,5,1,3.]],threshold:9.3887019902467728e-003,right_val:0.3629410862922669,left_val:0.5200229883193970},{features:[[8,2,7,9,-1.],[8,5,7,3,3.]],threshold:0.0127926301211119,right_val:0.6738016009330750,left_val:0.4961709976196289},{features:[[1,7,16,4,-1.],[1,7,8,2,2.],[9,9,8,2,2.]],threshold:-3.3661040943115950e-003,right_val:0.5283598899841309,left_val:0.4060279130935669},{features:[[6,12,8,2,-1.],[6,13,8,1,2.]],threshold:3.9771420415490866e-004,right_val:0.5900775194168091,left_val:0.4674113988876343},{features:[[8,11,3,3,-1.],[8,12,3,1,3.]],threshold:1.4868030557408929e-003,right_val:0.6082053780555725,left_val:0.4519116878509522},{features:[[4,5,14,10,-1.],[11,5,7,5,2.],[4,10,7,5,2.]],threshold:-0.0886867493391037,right_val:0.5180991888046265,left_val:0.2807899117469788},{features:[[4,12,3,2,-1.],[4,13,3,1,2.]],threshold:-7.4296112870797515e-005,right_val:0.4087625145912170,left_val:0.5295584201812744},{features:[[9,11,6,1,-1.],[11,11,2,1,3.]],threshold:-1.4932939848222304e-005,right_val:0.4538542926311493,left_val:0.5461400151252747},{features:[[4,9,7,6,-1.],[4,11,7,2,3.]],threshold:5.9162238612771034e-003,right_val:0.4192134141921997,left_val:0.5329161286354065},{features:[[7,10,6,3,-1.],[7,11,6,1,3.]],threshold:1.1141640134155750e-003,right_val:0.5706217288970947,left_val:0.4512017965316773},{features:[[9,11,2,2,-1.],[9,12,2,1,2.]],threshold:8.9249362645205110e-005,right_val:0.5897638201713562,left_val:0.4577805995941162},{features:[[0,5,20,6,-1.],[0,7,20,2,3.]],threshold:2.5319510605186224e-003,right_val:0.3357639014720917,left_val:0.5299603939056397},{features:[[6,4,6,1,-1.],[8,4,2,1,3.]],threshold:0.0124262003228068,right_val:0.1346601992845535,left_val:0.4959059059619904},{features:[[9,11,6,1,-1.],[11,11,2,1,3.]],threshold:0.0283357501029968,right_val:6.1043637106195092e-004,left_val:0.5117079019546509},{features:[[5,11,6,1,-1.],[7,11,2,1,3.]],threshold:6.6165882162749767e-003,right_val:0.7011628150939941,left_val:0.4736349880695343},{features:[[10,16,3,4,-1.],[11,16,1,4,3.]],threshold:8.0468766391277313e-003,right_val:0.3282819986343384,left_val:0.5216417908668518},{features:[[8,7,3,3,-1.],[9,7,1,3,3.]],threshold:-1.1193980462849140e-003,right_val:0.4563739001750946,left_val:0.5809860825538635},{features:[[2,12,16,8,-1.],[2,16,16,4,2.]],threshold:0.0132775902748108,right_val:0.4103901088237763,left_val:0.5398362278938294},{features:[[0,15,15,2,-1.],[0,16,15,1,2.]],threshold:4.8794739996083081e-004,right_val:0.5410590767860413,left_val:0.4249286055564880},{features:[[15,4,5,6,-1.],[15,6,5,2,3.]],threshold:0.0112431701272726,right_val:0.3438215851783752,left_val:0.5269963741302490},{features:[[9,5,2,4,-1.],[10,5,1,4,2.]],threshold:-8.9896668214350939e-004,right_val:0.4456613063812256,left_val:0.5633075833320618},{features:[[8,10,9,6,-1.],[8,12,9,2,3.]],threshold:6.6677159629762173e-003,right_val:0.4362679123878479,left_val:0.5312889218330383},{features:[[2,19,15,1,-1.],[7,19,5,1,3.]],threshold:0.0289472993463278,right_val:0.6575797796249390,left_val:0.4701794981956482},{features:[[10,16,3,4,-1.],[11,16,1,4,3.]],threshold:-0.0234000496566296,right_val:0.5137398838996887,left_val:0.},{features:[[0,15,20,4,-1.],[0,17,20,2,2.]],threshold:-0.0891170501708984,right_val:0.4942430853843689,left_val:0.0237452797591686},{features:[[10,16,3,4,-1.],[11,16,1,4,3.]],threshold:-0.0140546001493931,right_val:0.5117511153221130,left_val:0.3127323091030121},{features:[[7,16,3,4,-1.],[8,16,1,4,3.]],threshold:8.1239398568868637e-003,right_val:0.2520025968551636,left_val:0.5009049177169800},{features:[[9,16,3,3,-1.],[9,17,3,1,3.]],threshold:-4.9964650534093380e-003,right_val:0.4927811920642853,left_val:0.6387143731117249},{features:[[8,11,4,6,-1.],[8,14,4,3,2.]],threshold:3.1253970228135586e-003,right_val:0.3680452108383179,left_val:0.5136849880218506},{features:[[9,6,2,12,-1.],[9,10,2,4,3.]],threshold:6.7669642157852650e-003,right_val:0.4363631904125214,left_val:0.5509843826293945},{features:[[8,17,4,3,-1.],[8,18,4,1,3.]],threshold:-2.3711440153419971e-003,right_val:0.4586946964263916,left_val:0.6162335276603699},{features:[[9,18,8,2,-1.],[13,18,4,1,2.],[9,19,4,1,2.]],threshold:-5.3522791713476181e-003,right_val:0.4920490980148315,left_val:0.6185457706451416},{features:[[1,18,8,2,-1.],[1,19,8,1,2.]],threshold:-0.0159688591957092,right_val:0.4983252882957459,left_val:0.1382617950439453},{features:[[13,5,6,15,-1.],[15,5,2,15,3.]],threshold:4.7676060348749161e-003,right_val:0.5490046143531799,left_val:0.4688057899475098},{features:[[9,8,2,2,-1.],[9,9,2,1,2.]],threshold:-2.4714691098779440e-003,right_val:0.5003952980041504,left_val:0.2368514984846115},{features:[[9,5,2,3,-1.],[9,5,1,3,2.]],threshold:-7.1033788844943047e-004,right_val:0.4721533060073853,left_val:0.5856394171714783},{features:[[1,5,6,15,-1.],[3,5,2,15,3.]],threshold:-0.1411755979061127,right_val:0.4961591064929962,left_val:0.0869000628590584},{features:[[4,1,14,8,-1.],[11,1,7,4,2.],[4,5,7,4,2.]],threshold:0.1065180972218514,right_val:0.1741005033254623,left_val:0.5138837099075317},{features:[[2,4,4,16,-1.],[2,4,2,8,2.],[4,12,2,8,2.]],threshold:-0.0527447499334812,right_val:0.4772881865501404,left_val:0.7353636026382446},{features:[[12,4,3,12,-1.],[12,10,3,6,2.]],threshold:-4.7431760467588902e-003,right_val:0.5292701721191406,left_val:0.3884406089782715},{features:[[4,5,10,12,-1.],[4,5,5,6,2.],[9,11,5,6,2.]],threshold:9.9676765967160463e-004,right_val:0.4003424048423767,left_val:0.5223492980003357},{features:[[9,14,2,3,-1.],[9,15,2,1,3.]],threshold:8.0284131690859795e-003,right_val:0.7212964296340942,left_val:0.4959106147289276},{features:[[5,4,2,3,-1.],[5,5,2,1,3.]],threshold:8.6025858763605356e-004,right_val:0.5538476109504700,left_val:0.4444884061813355},{features:[[12,2,4,10,-1.],[14,2,2,5,2.],[12,7,2,5,2.]],threshold:9.3191501218825579e-004,right_val:0.4163244068622589,left_val:0.5398371219635010},{features:[[6,4,7,3,-1.],[6,5,7,1,3.]],threshold:-2.5082060601562262e-003,right_val:0.4562500119209290,left_val:0.5854265093803406},{features:[[2,0,18,2,-1.],[11,0,9,1,2.],[2,1,9,1,2.]],threshold:-2.1378761157393456e-003,right_val:0.5280259251594544,left_val:0.4608069062232971},{features:[[0,0,18,2,-1.],[0,0,9,1,2.],[9,1,9,1,2.]],threshold:-2.1546049974858761e-003,right_val:0.5255997180938721,left_val:0.3791126906871796},{features:[[13,13,4,6,-1.],[15,13,2,3,2.],[13,16,2,3,2.]],threshold:-7.6214009895920753e-003,right_val:0.4952073991298676,left_val:0.5998609066009522},{features:[[3,13,4,6,-1.],[3,13,2,3,2.],[5,16,2,3,2.]],threshold:2.2055360022932291e-003,right_val:0.5588530898094177,left_val:0.4484206140041351},{features:[[10,12,2,6,-1.],[10,15,2,3,2.]],threshold:1.2586950324475765e-003,right_val:0.4423840939998627,left_val:0.5450747013092041},{features:[[5,9,10,10,-1.],[5,9,5,5,2.],[10,14,5,5,2.]],threshold:-5.0926720723509789e-003,right_val:0.5263035893440247,left_val:0.4118275046348572},{features:[[11,4,4,2,-1.],[13,4,2,1,2.],[11,5,2,1,2.]],threshold:-2.5095739401876926e-003,right_val:0.4998494982719421,left_val:0.5787907838821411},{features:[[7,12,6,8,-1.],[10,12,3,8,2.]],threshold:-0.0773275569081306,right_val:0.4811120033264160,left_val:0.8397865891456604},{features:[[12,2,4,10,-1.],[14,2,2,5,2.],[12,7,2,5,2.]],threshold:-0.0414858199656010,right_val:0.5176993012428284,left_val:0.2408611029386520},{features:[[8,11,2,1,-1.],[9,11,1,1,2.]],threshold:1.0355669655837119e-004,right_val:0.5417054295539856,left_val:0.4355360865592957},{features:[[10,5,1,12,-1.],[10,9,1,4,3.]],threshold:1.3255809899419546e-003,right_val:0.4894095063209534,left_val:0.5453971028327942},{features:[[0,11,6,9,-1.],[3,11,3,9,2.]],threshold:-8.0598732456564903e-003,right_val:0.4577918946743012,left_val:0.5771024227142334},{features:[[12,2,4,10,-1.],[14,2,2,5,2.],[12,7,2,5,2.]],threshold:0.0190586205571890,right_val:0.3400475084781647,left_val:0.5169867873191834},{features:[[4,2,4,10,-1.],[4,2,2,5,2.],[6,7,2,5,2.]],threshold:-0.0350578911602497,right_val:0.5000503063201904,left_val:0.2203243970870972},{features:[[11,4,4,2,-1.],[13,4,2,1,2.],[11,5,2,1,2.]],threshold:5.7296059094369411e-003,right_val:0.6597570776939392,left_val:0.5043408274650574},{features:[[0,14,6,3,-1.],[0,15,6,1,3.]],threshold:-0.0116483299061656,right_val:0.4996652901172638,left_val:0.2186284959316254},{features:[[11,4,4,2,-1.],[13,4,2,1,2.],[11,5,2,1,2.]],threshold:1.4544479781761765e-003,right_val:0.5503727793693543,left_val:0.5007681846618652},{features:[[6,1,3,2,-1.],[7,1,1,2,3.]],threshold:-2.5030909455381334e-004,right_val:0.5241670012474060,left_val:0.4129841029644013},{features:[[11,4,4,2,-1.],[13,4,2,1,2.],[11,5,2,1,2.]],threshold:-8.2907272735610604e-004,right_val:0.4974496066570282,left_val:0.5412868261337280},{features:[[5,4,4,2,-1.],[5,4,2,1,2.],[7,5,2,1,2.]],threshold:1.0862209601327777e-003,right_val:0.5879228711128235,left_val:0.4605529904365540},{features:[[13,0,2,12,-1.],[14,0,1,6,2.],[13,6,1,6,2.]],threshold:2.0000500080641359e-004,right_val:0.4705209136009216,left_val:0.5278854966163635},{features:[[6,0,3,10,-1.],[7,0,1,10,3.]],threshold:2.9212920926511288e-003,right_val:0.3755536973476410,left_val:0.5129609704017639},{features:[[3,0,17,8,-1.],[3,4,17,4,2.]],threshold:0.0253874007612467,right_val:0.5790768265724182,left_val:0.4822691977024078},{features:[[0,4,20,4,-1.],[0,6,20,2,2.]],threshold:-3.1968469265848398e-003,right_val:0.3962840139865875,left_val:0.5248395204544067}],threshold:87.6960296630859380},{simpleClassifiers:[{features:[[0,3,8,2,-1.],[4,3,4,2,2.]],threshold:5.8031738735735416e-003,right_val:0.5961983203887940,left_val:0.3498983979225159},{features:[[8,11,4,3,-1.],[8,12,4,1,3.]],threshold:-9.0003069490194321e-003,right_val:0.4478552043437958,left_val:0.6816636919975281},{features:[[5,7,6,4,-1.],[5,7,3,2,2.],[8,9,3,2,2.]],threshold:-1.1549659539014101e-003,right_val:0.3578251004219055,left_val:0.5585706233978272},{features:[[8,3,4,9,-1.],[8,6,4,3,3.]],threshold:-1.1069850297644734e-003,right_val:0.3050428032875061,left_val:0.5365036129951477},{features:[[8,15,1,4,-1.],[8,17,1,2,2.]],threshold:1.0308309720130637e-004,right_val:0.5344635844230652,left_val:0.3639095127582550},{features:[[4,5,12,7,-1.],[8,5,4,7,3.]],threshold:-5.0984839908778667e-003,right_val:0.5504264831542969,left_val:0.2859157025814056},{features:[[4,2,4,10,-1.],[4,2,2,5,2.],[6,7,2,5,2.]],threshold:8.2572200335562229e-004,right_val:0.3476041853427887,left_val:0.5236523747444153},{features:[[3,0,17,2,-1.],[3,1,17,1,2.]],threshold:9.9783325567841530e-003,right_val:0.6219646930694580,left_val:0.4750322103500366},{features:[[2,2,16,15,-1.],[2,7,16,5,3.]],threshold:-0.0374025292694569,right_val:0.5278062820434570,left_val:0.3343375921249390},{features:[[15,2,5,2,-1.],[15,3,5,1,2.]],threshold:4.8548257909715176e-003,right_val:0.3700444102287293,left_val:0.5192180871963501},{features:[[9,3,2,2,-1.],[10,3,1,2,2.]],threshold:-1.8664470408111811e-003,right_val:0.5091944932937622,left_val:0.2929843962192535},{features:[[4,5,16,15,-1.],[4,10,16,5,3.]],threshold:0.0168888904154301,right_val:0.5431225895881653,left_val:0.3686845898628235},{features:[[7,13,5,6,-1.],[7,16,5,3,2.]],threshold:-5.8372621424496174e-003,right_val:0.5221335887908936,left_val:0.3632183969020844},{features:[[10,7,3,2,-1.],[11,7,1,2,3.]],threshold:-1.4713739510625601e-003,right_val:0.4700650870800018,left_val:0.5870683789253235},{features:[[8,3,3,1,-1.],[9,3,1,1,3.]],threshold:-1.1522950371727347e-003,right_val:0.5140954256057739,left_val:0.3195894956588745},{features:[[9,16,3,3,-1.],[9,17,3,1,3.]],threshold:-4.2560300789773464e-003,right_val:0.4814921021461487,left_val:0.6301859021186829},{features:[[0,2,5,2,-1.],[0,3,5,1,2.]],threshold:-6.7378291860222816e-003,right_val:0.5025808215141296,left_val:0.1977048069238663},{features:[[12,5,4,3,-1.],[12,6,4,1,3.]],threshold:0.0113826701417565,right_val:0.6867045760154724,left_val:0.4954132139682770},{features:[[1,7,12,1,-1.],[5,7,4,1,3.]],threshold:5.1794708706438541e-003,right_val:0.3350647985935211,left_val:0.5164427757263184},{features:[[7,5,6,14,-1.],[7,12,6,7,2.]],threshold:-0.1174378991127014,right_val:0.5234413743019104,left_val:0.2315246015787125},{features:[[0,0,8,10,-1.],[0,0,4,5,2.],[4,5,4,5,2.]],threshold:0.0287034492939711,right_val:0.6722521185874939,left_val:0.4664297103881836},{features:[[9,1,3,2,-1.],[10,1,1,2,3.]],threshold:4.8231030814349651e-003,right_val:0.2723532915115356,left_val:0.5220875144004822},{features:[[8,1,3,2,-1.],[9,1,1,2,3.]],threshold:2.6798530016094446e-003,right_val:0.2906948924064636,left_val:0.5079277157783508},{features:[[12,4,3,3,-1.],[12,5,3,1,3.]],threshold:8.0504082143306732e-003,right_val:0.6395021080970764,left_val:0.4885950982570648},{features:[[7,4,6,16,-1.],[7,12,6,8,2.]],threshold:4.8054959625005722e-003,right_val:0.3656663894653320,left_val:0.5197256803512573},{features:[[12,4,3,3,-1.],[12,5,3,1,3.]],threshold:-2.2420159075409174e-003,right_val:0.4763701856136322,left_val:0.6153467893600464},{features:[[2,3,2,6,-1.],[2,5,2,2,3.]],threshold:-0.0137577103450894,right_val:0.5030903220176697,left_val:0.2637344896793366},{features:[[14,2,6,9,-1.],[14,5,6,3,3.]],threshold:-0.1033829972147942,right_val:0.5182461142539978,left_val:0.2287521958351135},{features:[[5,4,3,3,-1.],[5,5,3,1,3.]],threshold:-9.4432085752487183e-003,right_val:0.4694949090480804,left_val:0.6953303813934326},{features:[[9,17,3,2,-1.],[10,17,1,2,3.]],threshold:8.0271181650459766e-004,right_val:0.4268783926963806,left_val:0.5450655221939087},{features:[[5,5,2,3,-1.],[5,6,2,1,3.]],threshold:-4.1945669800043106e-003,right_val:0.4571642875671387,left_val:0.6091387867927551},{features:[[13,11,3,6,-1.],[13,13,3,2,3.]],threshold:0.0109422104433179,right_val:0.3284547030925751,left_val:0.5241063237190247},{features:[[3,14,2,6,-1.],[3,17,2,3,2.]],threshold:-5.7841069065034389e-004,right_val:0.4179368913173676,left_val:0.5387929081916809},{features:[[14,3,6,2,-1.],[14,4,6,1,2.]],threshold:-2.0888620056211948e-003,right_val:0.5301715731620789,left_val:0.4292691051959992},{features:[[0,8,16,2,-1.],[0,9,16,1,2.]],threshold:3.2383969519287348e-003,right_val:0.5220744013786316,left_val:0.3792347908020020},{features:[[14,3,6,2,-1.],[14,4,6,1,2.]],threshold:4.9075027927756310e-003,right_val:0.4126757979393005,left_val:0.5237283110618591},{features:[[0,0,5,6,-1.],[0,2,5,2,3.]],threshold:-0.0322779417037964,right_val:0.4994502067565918,left_val:0.1947655975818634},{features:[[12,5,4,3,-1.],[12,6,4,1,3.]],threshold:-8.9711230248212814e-003,right_val:0.4929032027721405,left_val:0.6011285185813904},{features:[[4,11,3,6,-1.],[4,13,3,2,3.]],threshold:0.0153210898861289,right_val:0.2039822041988373,left_val:0.5009753704071045},{features:[[12,5,4,3,-1.],[12,6,4,1,3.]],threshold:2.0855569746345282e-003,right_val:0.5721694827079773,left_val:0.4862189888954163},{features:[[9,5,1,3,-1.],[9,6,1,1,3.]],threshold:5.0615021027624607e-003,right_val:0.1801805943250656,left_val:0.5000218749046326},{features:[[12,5,4,3,-1.],[12,6,4,1,3.]],threshold:-3.7174751050770283e-003,right_val:0.4897592961788178,left_val:0.5530117154121399},{features:[[6,6,8,12,-1.],[6,12,8,6,2.]],threshold:-0.0121705001220107,right_val:0.5383723974227905,left_val:0.4178605973720551},{features:[[12,5,4,3,-1.],[12,6,4,1,3.]],threshold:4.6248398721218109e-003,right_val:0.5761327147483826,left_val:0.4997169971466065},{features:[[5,12,9,2,-1.],[8,12,3,2,3.]],threshold:-2.1040429419372231e-004,right_val:0.4097681045532227,left_val:0.5331807136535645},{features:[[12,5,4,3,-1.],[12,6,4,1,3.]],threshold:-0.0146417804062366,right_val:0.5051776170730591,left_val:0.5755925178527832},{features:[[4,5,4,3,-1.],[4,6,4,1,3.]],threshold:3.3199489116668701e-003,right_val:0.6031805872917175,left_val:0.4576976895332336},{features:[[6,6,9,2,-1.],[9,6,3,2,3.]],threshold:3.7236879579722881e-003,right_val:0.5415883064270020,left_val:0.4380396902561188},{features:[[4,11,1,3,-1.],[4,12,1,1,3.]],threshold:8.2951161311939359e-004,right_val:0.3702219128608704,left_val:0.5163031816482544},{features:[[14,12,6,6,-1.],[14,12,3,6,2.]],threshold:-0.0114084901288152,right_val:0.4862565100193024,left_val:0.6072946786880493},{features:[[7,0,3,7,-1.],[8,0,1,7,3.]],threshold:-4.5320121571421623e-003,right_val:0.5088962912559509,left_val:0.3292475938796997},{features:[[9,8,3,3,-1.],[10,8,1,3,3.]],threshold:5.1276017911732197e-003,right_val:0.6122708916664124,left_val:0.4829767942428589},{features:[[8,8,3,3,-1.],[9,8,1,3,3.]],threshold:9.8583158105611801e-003,right_val:0.6556177139282227,left_val:0.4660679996013641},{features:[[5,10,11,3,-1.],[5,11,11,1,3.]],threshold:0.0369859188795090,right_val:0.1690472066402435,left_val:0.5204849243164063},{features:[[5,7,10,1,-1.],[10,7,5,1,2.]],threshold:4.6491161920130253e-003,right_val:0.3725225031375885,left_val:0.5167322158813477},{features:[[9,7,3,2,-1.],[10,7,1,2,3.]],threshold:-4.2664702050387859e-003,right_val:0.4987342953681946,left_val:0.6406493186950684},{features:[[8,7,3,2,-1.],[9,7,1,2,3.]],threshold:-4.7956590424291790e-004,right_val:0.4464873969554901,left_val:0.5897293090820313},{features:[[11,9,4,2,-1.],[11,9,2,2,2.]],threshold:3.6827160511165857e-003,right_val:0.3472662866115570,left_val:0.5441560745239258},{features:[[5,9,4,2,-1.],[7,9,2,2,2.]],threshold:-0.0100598800927401,right_val:0.5004829764366150,left_val:0.2143162935972214},{features:[[14,10,2,4,-1.],[14,12,2,2,2.]],threshold:-3.0361840617842972e-004,right_val:0.4590323865413666,left_val:0.5386424064636231},{features:[[7,7,3,2,-1.],[8,7,1,2,3.]],threshold:-1.4545479789376259e-003,right_val:0.4497095048427582,left_val:0.5751184225082398},{features:[[14,17,6,3,-1.],[14,18,6,1,3.]],threshold:1.6515209572389722e-003,right_val:0.4238520860671997,left_val:0.5421937704086304},{features:[[4,5,12,12,-1.],[4,5,6,6,2.],[10,11,6,6,2.]],threshold:-7.8468639403581619e-003,right_val:0.5258157253265381,left_val:0.4077920913696289},{features:[[6,9,8,8,-1.],[10,9,4,4,2.],[6,13,4,4,2.]],threshold:-5.1259850151836872e-003,right_val:0.5479453206062317,left_val:0.4229275882244110},{features:[[0,4,15,4,-1.],[5,4,5,4,3.]],threshold:-0.0368909612298012,right_val:0.4674678146839142,left_val:0.6596375703811646},{features:[[13,2,4,1,-1.],[13,2,2,1,2.]],threshold:2.4035639944486320e-004,right_val:0.5573202967643738,left_val:0.4251135885715485},{features:[[4,12,2,2,-1.],[4,13,2,1,2.]],threshold:-1.5150169929256663e-005,right_val:0.4074114859104157,left_val:0.5259246826171875},{features:[[8,13,4,3,-1.],[8,14,4,1,3.]],threshold:2.2108471021056175e-003,right_val:0.5886352062225342,left_val:0.4671722948551178},{features:[[9,13,2,3,-1.],[9,14,2,1,3.]],threshold:-1.1568620102480054e-003,right_val:0.4487161934375763,left_val:0.5711066126823425},{features:[[13,11,2,3,-1.],[13,12,2,1,3.]],threshold:4.9996292218565941e-003,right_val:0.2898327112197876,left_val:0.5264198184013367},{features:[[7,12,4,4,-1.],[7,12,2,2,2.],[9,14,2,2,2.]],threshold:-1.4656189596280456e-003,right_val:0.5197871923446655,left_val:0.3891738057136536},{features:[[10,11,2,2,-1.],[11,11,1,1,2.],[10,12,1,1,2.]],threshold:-1.1975039960816503e-003,right_val:0.4927955865859985,left_val:0.5795872807502747},{features:[[8,17,3,2,-1.],[9,17,1,2,3.]],threshold:-4.4954330660402775e-003,right_val:0.5012555122375488,left_val:0.2377603054046631},{features:[[10,11,2,2,-1.],[11,11,1,1,2.],[10,12,1,1,2.]],threshold:1.4997160178609192e-004,right_val:0.5617607831954956,left_val:0.4876626133918762},{features:[[0,17,6,3,-1.],[0,18,6,1,3.]],threshold:2.6391509454697371e-003,right_val:0.3765509128570557,left_val:0.5168088078498840},{features:[[10,11,2,2,-1.],[11,11,1,1,2.],[10,12,1,1,2.]],threshold:-2.9368131072260439e-004,right_val:0.4874630868434906,left_val:0.5446649193763733},{features:[[8,11,2,2,-1.],[8,11,1,1,2.],[9,12,1,1,2.]],threshold:1.4211760135367513e-003,right_val:0.6691331863403320,left_val:0.4687897861003876},{features:[[12,5,8,4,-1.],[12,5,4,4,2.]],threshold:0.0794276371598244,right_val:0.2732945978641510,left_val:0.5193443894386292},{features:[[0,5,8,4,-1.],[4,5,4,4,2.]],threshold:0.0799375027418137,right_val:0.1782083958387375,left_val:0.4971731007099152},{features:[[13,2,4,1,-1.],[13,2,2,1,2.]],threshold:0.0110892597585917,right_val:0.3209475874900818,left_val:0.5165994763374329},{features:[[3,2,4,1,-1.],[5,2,2,1,2.]],threshold:1.6560709627810866e-004,right_val:0.5307276248931885,left_val:0.4058471918106079},{features:[[10,0,4,2,-1.],[12,0,2,1,2.],[10,1,2,1,2.]],threshold:-5.3354292176663876e-003,right_val:0.5158129930496216,left_val:0.3445056974887848},{features:[[7,12,3,1,-1.],[8,12,1,1,3.]],threshold:1.1287260567769408e-003,right_val:0.6075533032417297,left_val:0.4594863057136536},{features:[[8,11,4,8,-1.],[10,11,2,4,2.],[8,15,2,4,2.]],threshold:-0.0219692196696997,right_val:0.5228595733642578,left_val:0.1680400967597961},{features:[[9,9,2,2,-1.],[9,10,2,1,2.]],threshold:-2.1775320055894554e-004,right_val:0.5215672850608826,left_val:0.3861596882343292},{features:[[3,18,15,2,-1.],[3,19,15,1,2.]],threshold:2.0200149447191507e-004,right_val:0.4363039135932922,left_val:0.5517979264259338},{features:[[2,6,2,12,-1.],[2,6,1,6,2.],[3,12,1,6,2.]],threshold:-0.0217331498861313,right_val:0.4789851009845734,left_val:0.7999460101127625},{features:[[9,8,2,3,-1.],[9,9,2,1,3.]],threshold:-8.4399932529777288e-004,right_val:0.5374773144721985,left_val:0.4085975885391235},{features:[[7,10,3,2,-1.],[8,10,1,2,3.]],threshold:-4.3895249837078154e-004,right_val:0.4366143047809601,left_val:0.5470405220985413},{features:[[11,11,3,1,-1.],[12,11,1,1,3.]],threshold:1.5092400135472417e-003,right_val:0.5842149257659912,left_val:0.4988996982574463},{features:[[6,11,3,1,-1.],[7,11,1,1,3.]],threshold:-3.5547839943319559e-003,right_val:0.4721005856990814,left_val:0.6753690242767334},{features:[[9,2,4,2,-1.],[11,2,2,1,2.],[9,3,2,1,2.]],threshold:4.8191400128416717e-004,right_val:0.4357109069824219,left_val:0.5415853857994080},{features:[[4,12,2,3,-1.],[4,13,2,1,3.]],threshold:-6.0264398343861103e-003,right_val:0.4991880953311920,left_val:0.2258509993553162},{features:[[2,1,18,3,-1.],[8,1,6,3,3.]],threshold:-0.0116681400686502,right_val:0.4927498996257782,left_val:0.6256554722785950},{features:[[5,1,4,14,-1.],[7,1,2,14,2.]],threshold:-2.8718370012938976e-003,right_val:0.5245801806449890,left_val:0.3947784900665283},{features:[[8,16,12,3,-1.],[8,16,6,3,2.]],threshold:0.0170511696487665,right_val:0.5794224143028259,left_val:0.4752511084079742},{features:[[1,17,18,3,-1.],[7,17,6,3,3.]],threshold:-0.0133520802482963,right_val:0.4544535875320435,left_val:0.6041104793548584},{features:[[9,14,2,6,-1.],[9,17,2,3,2.]],threshold:-3.9301801007241011e-004,right_val:0.5544905066490173,left_val:0.4258275926113129},{features:[[9,12,1,8,-1.],[9,16,1,4,2.]],threshold:3.0483349692076445e-003,right_val:0.3780272901058197,left_val:0.5233420133590698},{features:[[9,14,2,3,-1.],[9,15,2,1,3.]],threshold:-4.3579288758337498e-003,right_val:0.4838674068450928,left_val:0.6371889114379883},{features:[[9,6,2,12,-1.],[9,10,2,4,3.]],threshold:5.6661018170416355e-003,right_val:0.4163666069507599,left_val:0.5374705791473389},{features:[[12,9,3,3,-1.],[12,10,3,1,3.]],threshold:6.0677339206449687e-005,right_val:0.5311625003814697,left_val:0.4638795852661133},{features:[[0,1,4,8,-1.],[2,1,2,8,2.]],threshold:0.0367381609976292,right_val:0.6466524004936218,left_val:0.4688656032085419},{features:[[9,1,6,2,-1.],[12,1,3,1,2.],[9,2,3,1,2.]],threshold:8.6528137326240540e-003,right_val:0.2188657969236374,left_val:0.5204318761825562},{features:[[1,3,12,14,-1.],[1,10,12,7,2.]],threshold:-0.1537135988473892,right_val:0.4958840012550354,left_val:0.1630371958017349},{features:[[8,12,4,2,-1.],[10,12,2,1,2.],[8,13,2,1,2.]],threshold:-4.1560421232134104e-004,right_val:0.4696458876132965,left_val:0.5774459242820740},{features:[[1,9,10,2,-1.],[1,9,5,1,2.],[6,10,5,1,2.]],threshold:-1.2640169588848948e-003,right_val:0.5217198133468628,left_val:0.3977175951004028},{features:[[8,15,4,3,-1.],[8,16,4,1,3.]],threshold:-3.5473341122269630e-003,right_val:0.4808315038681030,left_val:0.6046528220176697},{features:[[6,8,8,3,-1.],[6,9,8,1,3.]],threshold:3.0019069527043030e-005,right_val:0.5228201150894165,left_val:0.3996723890304565},{features:[[9,15,5,3,-1.],[9,16,5,1,3.]],threshold:1.3113019522279501e-003,right_val:0.5765997767448425,left_val:0.4712158143520355},{features:[[8,7,4,3,-1.],[8,8,4,1,3.]],threshold:-1.3374709524214268e-003,right_val:0.5253170132637024,left_val:0.4109584987163544},{features:[[7,7,6,2,-1.],[7,8,6,1,2.]],threshold:0.0208767093718052,right_val:0.1757981926202774,left_val:0.5202993750572205},{features:[[5,7,8,2,-1.],[5,7,4,1,2.],[9,8,4,1,2.]],threshold:-7.5497948564589024e-003,right_val:0.4694975018501282,left_val:0.6566609740257263},{features:[[12,9,3,3,-1.],[12,10,3,1,3.]],threshold:0.0241885501891375,right_val:0.3370220959186554,left_val:0.5128673911094666},{features:[[4,7,4,2,-1.],[4,8,4,1,2.]],threshold:-2.9358828905969858e-003,right_val:0.4694541096687317,left_val:0.6580786705017090},{features:[[14,2,6,9,-1.],[14,5,6,3,3.]],threshold:0.0575579293072224,right_val:0.2775259912014008,left_val:0.5146445035934448},{features:[[4,9,3,3,-1.],[5,9,1,3,3.]],threshold:-1.1343370424583554e-003,right_val:0.5192667245864868,left_val:0.3836601972579956},{features:[[12,9,3,3,-1.],[12,10,3,1,3.]],threshold:0.0168169997632504,right_val:0.6177260875701904,left_val:0.5085592865943909},{features:[[0,2,6,9,-1.],[0,5,6,3,3.]],threshold:5.0535178743302822e-003,right_val:0.3684791922569275,left_val:0.5138763189315796},{features:[[17,3,3,6,-1.],[18,3,1,6,3.]],threshold:-4.5874710194766521e-003,right_val:0.4835202097892761,left_val:0.5989655256271362},{features:[[0,3,3,6,-1.],[1,3,1,6,3.]],threshold:1.6882460331544280e-003,right_val:0.5723056793212891,left_val:0.4509486854076386},{features:[[17,14,1,2,-1.],[17,15,1,1,2.]],threshold:-1.6554000321775675e-003,right_val:0.5243319272994995,left_val:0.3496770858764648},{features:[[4,9,4,3,-1.],[6,9,2,3,2.]],threshold:-0.0193738006055355,right_val:0.4968712925910950,left_val:0.1120536997914314},{features:[[12,9,3,3,-1.],[12,10,3,1,3.]],threshold:0.0103744501248002,right_val:0.4395213127136231,left_val:0.5148196816444397},{features:[[5,9,3,3,-1.],[5,10,3,1,3.]],threshold:1.4973050565458834e-004,right_val:0.5269886851310730,left_val:0.4084999859333038},{features:[[9,5,6,8,-1.],[12,5,3,4,2.],[9,9,3,4,2.]],threshold:-0.0429819300770760,right_val:0.5018504261970520,left_val:0.6394104957580566},{features:[[5,5,6,8,-1.],[5,5,3,4,2.],[8,9,3,4,2.]],threshold:8.3065936341881752e-003,right_val:0.6698353290557861,left_val:0.4707553982734680},{features:[[16,1,4,6,-1.],[16,4,4,3,2.]],threshold:-4.1285790503025055e-003,right_val:0.5323647260665894,left_val:0.4541369080543518},{features:[[1,0,6,20,-1.],[3,0,2,20,3.]],threshold:1.7399420030415058e-003,right_val:0.5439866185188294,left_val:0.4333961904048920},{features:[[12,11,3,2,-1.],[13,11,1,2,3.]],threshold:1.1739750334527344e-004,right_val:0.5543426275253296,left_val:0.4579687118530273},{features:[[5,11,3,2,-1.],[6,11,1,2,3.]],threshold:1.8585780344437808e-004,right_val:0.5426754951477051,left_val:0.4324643909931183},{features:[[9,4,6,1,-1.],[11,4,2,1,3.]],threshold:5.5587692186236382e-003,right_val:0.3550611138343811,left_val:0.5257220864295960},{features:[[0,0,8,3,-1.],[4,0,4,3,2.]],threshold:-7.9851560294628143e-003,right_val:0.4630635976791382,left_val:0.6043018102645874},{features:[[15,0,2,5,-1.],[15,0,1,5,2.]],threshold:6.0594122624024749e-004,right_val:0.5533195137977600,left_val:0.4598254859447479},{features:[[4,1,3,2,-1.],[5,1,1,2,3.]],threshold:-2.2983040253166109e-004,right_val:0.5322461128234863,left_val:0.4130752086639404},{features:[[7,0,6,15,-1.],[9,0,2,15,3.]],threshold:4.3740210821852088e-004,right_val:0.5409289002418518,left_val:0.4043039977550507},{features:[[6,11,3,1,-1.],[7,11,1,1,3.]],threshold:2.9482020181603730e-004,right_val:0.5628852248191834,left_val:0.4494963884353638},{features:[[12,0,3,4,-1.],[13,0,1,4,3.]],threshold:0.0103126596659422,right_val:0.2704316973686218,left_val:0.5177510976791382},{features:[[5,4,6,1,-1.],[7,4,2,1,3.]],threshold:-7.7241109684109688e-003,right_val:0.4980553984642029,left_val:0.1988019049167633},{features:[[12,7,3,2,-1.],[12,8,3,1,2.]],threshold:-4.6797208487987518e-003,right_val:0.5018296241760254,left_val:0.6644750237464905},{features:[[0,1,4,6,-1.],[0,4,4,3,2.]],threshold:-5.0755459815263748e-003,right_val:0.5185269117355347,left_val:0.3898304998874664},{features:[[12,7,3,2,-1.],[12,8,3,1,2.]],threshold:2.2479740437120199e-003,right_val:0.5660336017608643,left_val:0.4801808893680573},{features:[[2,16,3,3,-1.],[2,17,3,1,3.]],threshold:8.3327008178457618e-004,right_val:0.3957188129425049,left_val:0.5210919976234436},{features:[[13,8,6,10,-1.],[16,8,3,5,2.],[13,13,3,5,2.]],threshold:-0.0412793308496475,right_val:0.5007054209709168,left_val:0.6154541969299316},{features:[[0,9,5,2,-1.],[0,10,5,1,2.]],threshold:-5.0930189900100231e-004,right_val:0.5228403806686401,left_val:0.3975942134857178},{features:[[12,11,2,2,-1.],[13,11,1,1,2.],[12,12,1,1,2.]],threshold:1.2568780221045017e-003,right_val:0.5939183235168457,left_val:0.4979138076305389},{features:[[3,15,3,3,-1.],[3,16,3,1,3.]],threshold:8.0048497766256332e-003,right_val:0.1633366048336029,left_val:0.4984497129917145},{features:[[12,7,3,2,-1.],[12,8,3,1,2.]],threshold:-1.1879300000146031e-003,right_val:0.4942624866962433,left_val:0.5904964804649353},{features:[[5,7,3,2,-1.],[5,8,3,1,2.]],threshold:6.1948952497914433e-004,right_val:0.5328726172447205,left_val:0.4199557900428772},{features:[[9,5,9,9,-1.],[9,8,9,3,3.]],threshold:6.6829859279096127e-003,right_val:0.4905889034271240,left_val:0.5418602824211121},{features:[[5,0,3,7,-1.],[6,0,1,7,3.]],threshold:-3.7062340416014194e-003,right_val:0.5138000249862671,left_val:0.3725939095020294},{features:[[5,2,12,5,-1.],[9,2,4,5,3.]],threshold:-0.0397394113242626,right_val:0.5050346851348877,left_val:0.6478961110115051},{features:[[6,11,2,2,-1.],[6,11,1,1,2.],[7,12,1,1,2.]],threshold:1.4085009461268783e-003,right_val:0.6377884149551392,left_val:0.4682339131832123},{features:[[15,15,3,2,-1.],[15,16,3,1,2.]],threshold:3.9322688826359808e-004,right_val:0.4150482118129730,left_val:0.5458530187606812},{features:[[2,15,3,2,-1.],[2,16,3,1,2.]],threshold:-1.8979819724336267e-003,right_val:0.5149704217910767,left_val:0.3690159916877747},{features:[[14,12,6,8,-1.],[17,12,3,4,2.],[14,16,3,4,2.]],threshold:-0.0139704402536154,right_val:0.4811357855796814,left_val:0.6050562858581543},{features:[[2,8,15,6,-1.],[7,8,5,6,3.]],threshold:-0.1010081991553307,right_val:0.4992361962795258,left_val:0.2017080038785934},{features:[[2,2,18,17,-1.],[8,2,6,17,3.]],threshold:-0.0173469204455614,right_val:0.4899486005306244,left_val:0.5713148713111877},{features:[[5,1,4,1,-1.],[7,1,2,1,2.]],threshold:1.5619759506080300e-004,right_val:0.5392642021179199,left_val:0.4215388894081116},{features:[[5,2,12,5,-1.],[9,2,4,5,3.]],threshold:0.1343892961740494,right_val:0.3767612874507904,left_val:0.5136151909828186},{features:[[3,2,12,5,-1.],[7,2,4,5,3.]],threshold:-0.0245822407305241,right_val:0.4747906923294067,left_val:0.7027357816696167},{features:[[4,9,12,4,-1.],[10,9,6,2,2.],[4,11,6,2,2.]],threshold:-3.8553720805794001e-003,right_val:0.5427716970443726,left_val:0.4317409098148346},{features:[[5,15,6,2,-1.],[5,15,3,1,2.],[8,16,3,1,2.]],threshold:-2.3165249731391668e-003,right_val:0.4618647992610931,left_val:0.5942698717117310},{features:[[10,14,2,3,-1.],[10,15,2,1,3.]],threshold:-4.8518120311200619e-003,right_val:0.4884895086288452,left_val:0.6191568970680237},{features:[[0,13,20,2,-1.],[0,13,10,1,2.],[10,14,10,1,2.]],threshold:2.4699938949197531e-003,right_val:0.4017199873924255,left_val:0.5256664752960205},{features:[[4,9,12,8,-1.],[10,9,6,4,2.],[4,13,6,4,2.]],threshold:0.0454969592392445,right_val:0.2685773968696594,left_val:0.5237867832183838},{features:[[8,13,3,6,-1.],[8,16,3,3,2.]],threshold:-0.0203195996582508,right_val:0.4979738891124725,left_val:0.2130445986986160},{features:[[10,12,2,2,-1.],[10,13,2,1,2.]],threshold:2.6994998916052282e-004,right_val:0.5543122291564941,left_val:0.4814041852951050},{features:[[9,12,2,2,-1.],[9,12,1,1,2.],[10,13,1,1,2.]],threshold:-1.8232699949294329e-003,right_val:0.4709989130496979,left_val:0.6482579708099365},{features:[[4,11,14,4,-1.],[11,11,7,2,2.],[4,13,7,2,2.]],threshold:-6.3015790656208992e-003,right_val:0.5306236147880554,left_val:0.4581927955150604},{features:[[8,5,4,2,-1.],[8,6,4,1,2.]],threshold:-2.4139499873854220e-004,right_val:0.4051763117313385,left_val:0.5232086777687073},{features:[[10,10,6,3,-1.],[12,10,2,3,3.]],threshold:-1.0330369696021080e-003,right_val:0.4789193868637085,left_val:0.5556201934814453},{features:[[2,14,1,2,-1.],[2,15,1,1,2.]],threshold:1.8041160365100950e-004,right_val:0.4011810123920441,left_val:0.5229442715644836},{features:[[13,8,6,12,-1.],[16,8,3,6,2.],[13,14,3,6,2.]],threshold:-0.0614078603684902,right_val:0.5010703206062317,left_val:0.6298682093620300},{features:[[1,8,6,12,-1.],[1,8,3,6,2.],[4,14,3,6,2.]],threshold:-0.0695439130067825,right_val:0.4773184061050415,left_val:0.7228280901908875},{features:[[10,0,6,10,-1.],[12,0,2,10,3.]],threshold:-0.0705426633358002,right_val:0.5182529091835022,left_val:0.2269513010978699},{features:[[5,11,8,4,-1.],[5,11,4,2,2.],[9,13,4,2,2.]],threshold:2.4423799477517605e-003,right_val:0.4098151028156281,left_val:0.5237097144126892},{features:[[10,16,8,4,-1.],[14,16,4,2,2.],[10,18,4,2,2.]],threshold:1.5494349645450711e-003,right_val:0.5468043088912964,left_val:0.4773750901222229},{features:[[7,7,6,6,-1.],[9,7,2,6,3.]],threshold:-0.0239142198115587,right_val:0.4783824980258942,left_val:0.7146975994110107},{features:[[10,2,4,10,-1.],[10,2,2,10,2.]],threshold:-0.0124536901712418,right_val:0.5241122841835022,left_val:0.2635296881198883},{features:[[6,1,4,9,-1.],[8,1,2,9,2.]],threshold:-2.0760179904755205e-004,right_val:0.5113608837127686,left_val:0.3623757064342499},{features:[[12,19,2,1,-1.],[12,19,1,1,2.]],threshold:2.9781080229440704e-005,right_val:0.5432801842689514,left_val:0.4705932140350342}],threshold:90.2533493041992190},{simpleClassifiers:[{features:[[1,2,4,9,-1.],[3,2,2,9,2.]],threshold:0.0117727499455214,right_val:0.6421167254447937,left_val:0.3860518932342529},{features:[[7,5,6,4,-1.],[9,5,2,4,3.]],threshold:0.0270375702530146,right_val:0.6754038929939270,left_val:0.4385654926300049},{features:[[9,4,2,4,-1.],[9,6,2,2,2.]],threshold:-3.6419500247575343e-005,right_val:0.3423315882682800,left_val:0.5487101078033447},{features:[[14,5,2,8,-1.],[14,9,2,4,2.]],threshold:1.9995409529656172e-003,right_val:0.5400317907333374,left_val:0.3230532109737396},{features:[[7,6,5,12,-1.],[7,12,5,6,2.]],threshold:4.5278300531208515e-003,right_val:0.2935043871402741,left_val:0.5091639757156372},{features:[[14,6,2,6,-1.],[14,9,2,3,2.]],threshold:4.7890920541249216e-004,right_val:0.5344064235687256,left_val:0.4178153872489929},{features:[[4,6,2,6,-1.],[4,9,2,3,2.]],threshold:1.1720920447260141e-003,right_val:0.5132070779800415,left_val:0.2899182140827179},{features:[[8,15,10,4,-1.],[13,15,5,2,2.],[8,17,5,2,2.]],threshold:9.5305702416226268e-004,right_val:0.5560845136642456,left_val:0.4280124902725220},{features:[[6,18,2,2,-1.],[7,18,1,2,2.]],threshold:1.5099150004971307e-005,right_val:0.5404760241508484,left_val:0.4044871926307678},{features:[[11,3,6,2,-1.],[11,4,6,1,2.]],threshold:-6.0817901976406574e-004,right_val:0.5503466129302979,left_val:0.4271768927574158},{features:[[2,0,16,6,-1.],[2,2,16,2,3.]],threshold:3.3224520739167929e-003,right_val:0.5369734764099121,left_val:0.3962723910808563},{features:[[11,3,6,2,-1.],[11,4,6,1,2.]],threshold:-1.1037490330636501e-003,right_val:0.5237749814987183,left_val:0.4727177917957306},{features:[[4,11,10,3,-1.],[4,12,10,1,3.]],threshold:-1.4350269921123981e-003,right_val:0.4223509132862091,left_val:0.5603008270263672},{features:[[11,3,6,2,-1.],[11,4,6,1,2.]],threshold:2.0767399109899998e-003,right_val:0.4732725918292999,left_val:0.5225917100906372},{features:[[3,3,6,2,-1.],[3,4,6,1,2.]],threshold:-1.6412809782195836e-004,right_val:0.5432739853858948,left_val:0.3999075889587402},{features:[[16,0,4,7,-1.],[16,0,2,7,2.]],threshold:8.8302437216043472e-003,right_val:0.6027327179908752,left_val:0.4678385853767395},{features:[[0,14,9,6,-1.],[0,16,9,2,3.]],threshold:-0.0105520701035857,right_val:0.5213974714279175,left_val:0.3493967056274414},{features:[[9,16,3,3,-1.],[9,17,3,1,3.]],threshold:-2.2731600329279900e-003,right_val:0.4749062955379486,left_val:0.6185818910598755},{features:[[4,6,6,2,-1.],[6,6,2,2,3.]],threshold:-8.4786332445219159e-004,right_val:0.3843482136726379,left_val:0.5285341143608093},{features:[[15,11,1,3,-1.],[15,12,1,1,3.]],threshold:1.2081359745934606e-003,right_val:0.3447335958480835,left_val:0.5360640883445740},{features:[[5,5,2,3,-1.],[5,6,2,1,3.]],threshold:2.6512730401009321e-003,right_val:0.6193962097167969,left_val:0.4558292031288147},{features:[[10,9,2,2,-1.],[10,10,2,1,2.]],threshold:-1.1012479662895203e-003,right_val:0.5327628254890442,left_val:0.3680230081081390},{features:[[3,1,4,3,-1.],[5,1,2,3,2.]],threshold:4.9561518244445324e-004,right_val:0.5274940729141235,left_val:0.3960595130920410},{features:[[16,0,4,7,-1.],[16,0,2,7,2.]],threshold:-0.0439017713069916,right_val:0.4992839097976685,left_val:0.7020444869995117},{features:[[0,0,20,1,-1.],[10,0,10,1,2.]],threshold:0.0346903502941132,right_val:0.2766602933406830,left_val:0.5049164295196533},{features:[[15,11,1,3,-1.],[15,12,1,1,3.]],threshold:-2.7442190330475569e-003,right_val:0.5274971127510071,left_val:0.2672632932662964},{features:[[0,4,3,4,-1.],[1,4,1,4,3.]],threshold:3.3316588960587978e-003,right_val:0.6001101732254028,left_val:0.4579482972621918},{features:[[16,3,3,6,-1.],[16,5,3,2,3.]],threshold:-0.0200445707887411,right_val:0.5235717892646790,left_val:0.3171594142913818},{features:[[1,3,3,6,-1.],[1,5,3,2,3.]],threshold:1.3492030557245016e-003,right_val:0.4034324884414673,left_val:0.5265362858772278},{features:[[6,2,12,6,-1.],[12,2,6,3,2.],[6,5,6,3,2.]],threshold:2.9702018946409225e-003,right_val:0.4571984112262726,left_val:0.5332456827163696},{features:[[8,10,4,3,-1.],[8,11,4,1,3.]],threshold:6.3039981760084629e-003,right_val:0.6034635901451111,left_val:0.4593310952186585},{features:[[4,2,14,6,-1.],[11,2,7,3,2.],[4,5,7,3,2.]],threshold:-0.0129365902394056,right_val:0.5372971296310425,left_val:0.4437963962554932},{features:[[9,11,2,3,-1.],[9,12,2,1,3.]],threshold:4.0148729458451271e-003,right_val:0.6437833905220032,left_val:0.4680323898792267},{features:[[15,13,2,3,-1.],[15,14,2,1,3.]],threshold:-2.6401679497212172e-003,right_val:0.5314332842826843,left_val:0.3709631860256195},{features:[[8,12,4,3,-1.],[8,13,4,1,3.]],threshold:0.0139184398576617,right_val:0.7130808830261231,left_val:0.4723555147647858},{features:[[15,11,1,3,-1.],[15,12,1,1,3.]],threshold:-4.5087869511917233e-004,right_val:0.5370404124259949,left_val:0.4492394030094147},{features:[[7,13,5,2,-1.],[7,14,5,1,2.]],threshold:2.5384349282830954e-004,right_val:0.5514402985572815,left_val:0.4406864047050476},{features:[[7,12,6,3,-1.],[7,13,6,1,3.]],threshold:2.2710000630468130e-003,right_val:0.5967984199523926,left_val:0.4682416915893555},{features:[[5,11,4,4,-1.],[5,13,4,2,2.]],threshold:2.4120779708027840e-003,right_val:0.3018598854541779,left_val:0.5079392194747925},{features:[[11,4,3,3,-1.],[12,4,1,3,3.]],threshold:-3.6025670851813629e-005,right_val:0.4471096992492676,left_val:0.5601037144660950},{features:[[6,4,3,3,-1.],[7,4,1,3,3.]],threshold:-7.4905529618263245e-003,right_val:0.4989944100379944,left_val:0.2207535058259964},{features:[[16,5,3,6,-1.],[17,5,1,6,3.]],threshold:-0.0175131205469370,right_val:0.5017648935317993,left_val:0.6531215906143189},{features:[[3,6,12,7,-1.],[7,6,4,7,3.]],threshold:0.1428163051605225,right_val:0.1482062041759491,left_val:0.4967963099479675},{features:[[16,5,3,6,-1.],[17,5,1,6,3.]],threshold:5.5345268920063972e-003,right_val:0.5954223871231079,left_val:0.4898946881294251},{features:[[3,13,2,3,-1.],[3,14,2,1,3.]],threshold:-9.6323591424152255e-004,right_val:0.5196074247360230,left_val:0.3927116990089417},{features:[[16,5,3,6,-1.],[17,5,1,6,3.]],threshold:-2.0370010752230883e-003,right_val:0.4884858131408691,left_val:0.5613325238227844},{features:[[1,5,3,6,-1.],[2,5,1,6,3.]],threshold:1.6614829655736685e-003,right_val:0.5578880906105042,left_val:0.4472880065441132},{features:[[1,9,18,1,-1.],[7,9,6,1,3.]],threshold:-3.1188090797513723e-003,right_val:0.5397477746009827,left_val:0.3840532898902893},{features:[[0,9,8,7,-1.],[4,9,4,7,2.]],threshold:-6.4000617712736130e-003,right_val:0.4533218145370483,left_val:0.5843983888626099},{features:[[12,11,8,2,-1.],[12,12,8,1,2.]],threshold:3.1319601112045348e-004,right_val:0.4234727919101715,left_val:0.5439221858978272},{features:[[0,11,8,2,-1.],[0,12,8,1,2.]],threshold:-0.0182220991700888,right_val:0.4958404898643494,left_val:0.1288464963436127},{features:[[9,13,2,3,-1.],[9,14,2,1,3.]],threshold:8.7969247251749039e-003,right_val:0.7153480052947998,left_val:0.4951297938823700},{features:[[4,10,12,4,-1.],[4,10,6,2,2.],[10,12,6,2,2.]],threshold:-4.2395070195198059e-003,right_val:0.5194936990737915,left_val:0.3946599960327148},{features:[[9,3,3,7,-1.],[10,3,1,7,3.]],threshold:9.7086271271109581e-003,right_val:0.6064900159835815,left_val:0.4897503852844238},{features:[[7,2,3,5,-1.],[8,2,1,5,3.]],threshold:-3.9934171363711357e-003,right_val:0.5060828924179077,left_val:0.3245440125465393},{features:[[9,12,4,6,-1.],[11,12,2,3,2.],[9,15,2,3,2.]],threshold:-0.0167850591242313,right_val:0.5203778743743897,left_val:0.1581953018903732},{features:[[8,7,3,6,-1.],[9,7,1,6,3.]],threshold:0.0182720907032490,right_val:0.6626979112625122,left_val:0.4680935144424439},{features:[[15,4,4,2,-1.],[15,5,4,1,2.]],threshold:5.6872838176786900e-003,right_val:0.3512184917926788,left_val:0.5211697816848755},{features:[[8,7,3,3,-1.],[9,7,1,3,3.]],threshold:-1.0739039862528443e-003,right_val:0.4529845118522644,left_val:0.5768386125564575},{features:[[14,2,6,4,-1.],[14,4,6,2,2.]],threshold:-3.7093870341777802e-003,right_val:0.5313581228256226,left_val:0.4507763087749481},{features:[[7,16,6,1,-1.],[9,16,2,1,3.]],threshold:-2.1110709349159151e-004,right_val:0.4333376884460449,left_val:0.5460820198059082},{features:[[15,13,2,3,-1.],[15,14,2,1,3.]],threshold:1.0670139454305172e-003,right_val:0.4078390896320343,left_val:0.5371856093406677},{features:[[8,7,3,10,-1.],[9,7,1,10,3.]],threshold:3.5943021066486835e-003,right_val:0.5643836259841919,left_val:0.4471287131309509},{features:[[11,10,2,6,-1.],[11,12,2,2,3.]],threshold:-5.1776031032204628e-003,right_val:0.5280330181121826,left_val:0.4499393105506897},{features:[[6,10,4,1,-1.],[8,10,2,1,2.]],threshold:-2.5414369883947074e-004,right_val:0.4407708048820496,left_val:0.5516173243522644},{features:[[10,9,2,2,-1.],[10,10,2,1,2.]],threshold:6.3522560521960258e-003,right_val:0.2465227991342545,left_val:0.5194190144538879},{features:[[8,9,2,2,-1.],[8,10,2,1,2.]],threshold:-4.4205080484971404e-004,right_val:0.5139682292938232,left_val:0.3830705881118774},{features:[[12,7,2,2,-1.],[13,7,1,1,2.],[12,8,1,1,2.]],threshold:7.4488727841526270e-004,right_val:0.5974786877632141,left_val:0.4891090989112854},{features:[[5,7,2,2,-1.],[5,7,1,1,2.],[6,8,1,1,2.]],threshold:-3.5116379149258137e-003,right_val:0.4768764972686768,left_val:0.7413681745529175},{features:[[13,0,3,14,-1.],[14,0,1,14,3.]],threshold:-0.0125409103929996,right_val:0.5252826809883118,left_val:0.3648819029331207},{features:[[4,0,3,14,-1.],[5,0,1,14,3.]],threshold:9.4931852072477341e-003,right_val:0.3629586994647980,left_val:0.5100492835044861},{features:[[13,4,3,14,-1.],[14,4,1,14,3.]],threshold:0.0129611501470208,right_val:0.4333561062812805,left_val:0.5232442021369934},{features:[[9,14,2,3,-1.],[9,15,2,1,3.]],threshold:4.7209449112415314e-003,right_val:0.6331052780151367,left_val:0.4648149013519287},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:-2.3119079414755106e-003,right_val:0.4531058073043823,left_val:0.5930309891700745},{features:[[4,2,3,16,-1.],[5,2,1,16,3.]],threshold:-2.8262299019843340e-003,right_val:0.5257101058959961,left_val:0.3870477974414825},{features:[[7,2,8,10,-1.],[7,7,8,5,2.]],threshold:-1.4311339473351836e-003,right_val:0.4561854898929596,left_val:0.5522503256797791},{features:[[6,14,7,3,-1.],[6,15,7,1,3.]],threshold:1.9378310535103083e-003,right_val:0.5736966729164124,left_val:0.4546220898628235},{features:[[9,2,10,12,-1.],[14,2,5,6,2.],[9,8,5,6,2.]],threshold:2.6343559147790074e-004,right_val:0.4571875035762787,left_val:0.5345739126205444},{features:[[6,7,8,2,-1.],[6,8,8,1,2.]],threshold:7.8257522545754910e-004,right_val:0.5220187902450562,left_val:0.3967815935611725},{features:[[8,13,4,6,-1.],[8,16,4,3,2.]],threshold:-0.0195504408329725,right_val:0.5243508219718933,left_val:0.2829642891883850},{features:[[6,6,1,3,-1.],[6,7,1,1,3.]],threshold:4.3914958951063454e-004,right_val:0.5899090170860291,left_val:0.4590066969394684},{features:[[16,2,4,6,-1.],[16,4,4,2,3.]],threshold:0.0214520003646612,right_val:0.2855378985404968,left_val:0.5231410861015320},{features:[[6,6,4,2,-1.],[6,6,2,1,2.],[8,7,2,1,2.]],threshold:5.8973580598831177e-004,right_val:0.5506421923637390,left_val:0.4397256970405579},{features:[[16,2,4,6,-1.],[16,4,4,2,3.]],threshold:-0.0261576101183891,right_val:0.5189175009727478,left_val:0.3135079145431519},{features:[[0,2,4,6,-1.],[0,4,4,2,3.]],threshold:-0.0139598604291677,right_val:0.5040717720985413,left_val:0.3213272988796234},{features:[[9,6,2,6,-1.],[9,6,1,6,2.]],threshold:-6.3699018210172653e-003,right_val:0.4849506914615631,left_val:0.6387544870376587},{features:[[3,4,6,10,-1.],[3,9,6,5,2.]],threshold:-8.5613820701837540e-003,right_val:0.5032019019126892,left_val:0.2759132087230682},{features:[[9,5,2,6,-1.],[9,5,1,6,2.]],threshold:9.6622901037335396e-004,right_val:0.5834879279136658,left_val:0.4685640931129456},{features:[[3,13,2,3,-1.],[3,14,2,1,3.]],threshold:7.6550268568098545e-004,right_val:0.3896422088146210,left_val:0.5175207257270813},{features:[[13,13,3,2,-1.],[13,14,3,1,2.]],threshold:-8.1833340227603912e-003,right_val:0.5208122134208679,left_val:0.2069136947393417},{features:[[2,16,10,4,-1.],[2,16,5,2,2.],[7,18,5,2,2.]],threshold:-9.3976939097046852e-003,right_val:0.4641222953796387,left_val:0.6134091019630432},{features:[[5,6,10,6,-1.],[10,6,5,3,2.],[5,9,5,3,2.]],threshold:4.8028980381786823e-003,right_val:0.4395219981670380,left_val:0.5454108119010925},{features:[[7,14,1,3,-1.],[7,15,1,1,3.]],threshold:-3.5680569708347321e-003,right_val:0.4681093990802765,left_val:0.6344485282897949},{features:[[14,16,6,3,-1.],[14,17,6,1,3.]],threshold:4.0733120404183865e-003,right_val:0.4015620052814484,left_val:0.5292683243751526},{features:[[5,4,3,3,-1.],[5,5,3,1,3.]],threshold:1.2568129459396005e-003,right_val:0.5452824831008911,left_val:0.4392988085746765},{features:[[7,4,10,3,-1.],[7,5,10,1,3.]],threshold:-2.9065010603517294e-003,right_val:0.4863379895687103,left_val:0.5898832082748413},{features:[[0,4,5,4,-1.],[0,6,5,2,2.]],threshold:-2.4409340694546700e-003,right_val:0.5247421860694885,left_val:0.4069364964962006},{features:[[13,11,3,9,-1.],[13,14,3,3,3.]],threshold:0.0248307008296251,right_val:0.3682524859905243,left_val:0.5182725787162781},{features:[[4,11,3,9,-1.],[4,14,3,3,3.]],threshold:-0.0488540083169937,right_val:0.4961281120777130,left_val:0.1307577937841415},{features:[[9,7,2,1,-1.],[9,7,1,1,2.]],threshold:-1.6110379947349429e-003,right_val:0.4872662127017975,left_val:0.6421005725860596},{features:[[5,0,6,17,-1.],[7,0,2,17,3.]],threshold:-0.0970094799995422,right_val:0.4950988888740540,left_val:0.0477693490684032},{features:[[10,3,6,3,-1.],[10,3,3,3,2.]],threshold:1.1209240183234215e-003,right_val:0.5354745984077454,left_val:0.4616267085075378},{features:[[2,2,15,4,-1.],[7,2,5,4,3.]],threshold:-1.3064090162515640e-003,right_val:0.4638805985450745,left_val:0.6261854171752930},{features:[[8,2,8,2,-1.],[12,2,4,1,2.],[8,3,4,1,2.]],threshold:4.5771620352752507e-004,right_val:0.4646640121936798,left_val:0.5384417772293091},{features:[[8,1,3,6,-1.],[8,3,3,2,3.]],threshold:-6.3149951165542006e-004,right_val:0.5130257010459900,left_val:0.3804047107696533},{features:[[9,17,2,2,-1.],[9,18,2,1,2.]],threshold:1.4505970466416329e-004,right_val:0.5664461851119995,left_val:0.4554310142993927},{features:[[0,0,2,14,-1.],[1,0,1,14,2.]],threshold:-0.0164745505899191,right_val:0.4715859889984131,left_val:0.6596958041191101},{features:[[12,0,7,3,-1.],[12,1,7,1,3.]],threshold:0.0133695797994733,right_val:0.3035964965820313,left_val:0.5195466279983521},{features:[[1,14,1,2,-1.],[1,15,1,1,2.]],threshold:1.0271780047332868e-004,right_val:0.4107066094875336,left_val:0.5229176282882690},{features:[[14,12,2,8,-1.],[15,12,1,4,2.],[14,16,1,4,2.]],threshold:-5.5311559699475765e-003,right_val:0.4960907101631165,left_val:0.6352887749671936},{features:[[1,0,7,3,-1.],[1,1,7,1,3.]],threshold:-2.6187049224972725e-003,right_val:0.5140984058380127,left_val:0.3824546039104462},{features:[[14,12,2,8,-1.],[15,12,1,4,2.],[14,16,1,4,2.]],threshold:5.0834268331527710e-003,right_val:0.6220818758010864,left_val:0.4950439929962158},{features:[[6,0,8,12,-1.],[6,0,4,6,2.],[10,6,4,6,2.]],threshold:0.0798181593418121,right_val:0.1322475969791412,left_val:0.4952335953712463},{features:[[6,1,8,9,-1.],[6,4,8,3,3.]],threshold:-0.0992265865206718,right_val:0.5008416771888733,left_val:0.7542728781700134},{features:[[5,2,2,2,-1.],[5,3,2,1,2.]],threshold:-6.5174017800018191e-004,right_val:0.5130121111869812,left_val:0.3699302971363068},{features:[[13,14,6,6,-1.],[16,14,3,3,2.],[13,17,3,3,2.]],threshold:-0.0189968496561050,right_val:0.4921202957630158,left_val:0.6689178943634033},{features:[[0,17,20,2,-1.],[0,17,10,1,2.],[10,18,10,1,2.]],threshold:0.0173468999564648,right_val:0.1859198063611984,left_val:0.4983300864696503},{features:[[10,3,2,6,-1.],[11,3,1,3,2.],[10,6,1,3,2.]],threshold:5.5082101607695222e-004,right_val:0.5522121787071228,left_val:0.4574424028396606},{features:[[5,12,6,2,-1.],[8,12,3,2,2.]],threshold:2.0056050270795822e-003,right_val:0.3856469988822937,left_val:0.5131744742393494},{features:[[10,7,6,13,-1.],[10,7,3,13,2.]],threshold:-7.7688191086053848e-003,right_val:0.5434309244155884,left_val:0.4361700117588043},{features:[[5,15,10,5,-1.],[10,15,5,5,2.]],threshold:0.0508782789111137,right_val:0.6840639710426331,left_val:0.4682720899581909},{features:[[10,4,4,10,-1.],[10,4,2,10,2.]],threshold:-2.2901780903339386e-003,right_val:0.5306099057197571,left_val:0.4329245090484619},{features:[[5,7,2,1,-1.],[6,7,1,1,2.]],threshold:-1.5715380141045898e-004,right_val:0.4378164112567902,left_val:0.5370057225227356},{features:[[10,3,6,7,-1.],[10,3,3,7,2.]],threshold:0.1051924005150795,right_val:0.0673614665865898,left_val:0.5137274265289307},{features:[[4,3,6,7,-1.],[7,3,3,7,2.]],threshold:2.7198919560760260e-003,right_val:0.5255665183067322,left_val:0.4112060964107513},{features:[[1,7,18,5,-1.],[7,7,6,5,3.]],threshold:0.0483377799391747,right_val:0.4438967108726502,left_val:0.5404623746871948},{features:[[3,17,4,3,-1.],[5,17,2,3,2.]],threshold:9.5703761326149106e-004,right_val:0.5399510860443115,left_val:0.4355969130992889},{features:[[8,14,12,6,-1.],[14,14,6,3,2.],[8,17,6,3,2.]],threshold:-0.0253712590783834,right_val:0.5031024813652039,left_val:0.5995175242424011},{features:[[0,13,20,4,-1.],[0,13,10,2,2.],[10,15,10,2,2.]],threshold:0.0524579510092735,right_val:0.1398351043462753,left_val:0.4950287938117981},{features:[[4,5,14,2,-1.],[11,5,7,1,2.],[4,6,7,1,2.]],threshold:-0.0123656298965216,right_val:0.4964106082916260,left_val:0.6397299170494080},{features:[[1,2,10,12,-1.],[1,2,5,6,2.],[6,8,5,6,2.]],threshold:-0.1458971947431564,right_val:0.4946322143077850,left_val:0.1001669988036156},{features:[[6,1,14,3,-1.],[6,2,14,1,3.]],threshold:-0.0159086007624865,right_val:0.5208340883255005,left_val:0.3312329947948456},{features:[[8,16,2,3,-1.],[8,17,2,1,3.]],threshold:3.9486068999394774e-004,right_val:0.5426102876663208,left_val:0.4406363964080811},{features:[[9,17,3,2,-1.],[10,17,1,2,3.]],threshold:-5.2454001270234585e-003,right_val:0.5189967155456543,left_val:0.2799589931964874},{features:[[5,15,4,2,-1.],[5,15,2,1,2.],[7,16,2,1,2.]],threshold:-5.0421799533069134e-003,right_val:0.4752142131328583,left_val:0.6987580060958862},{features:[[10,15,1,3,-1.],[10,16,1,1,3.]],threshold:2.9812189750373363e-003,right_val:0.6307479739189148,left_val:0.4983288943767548},{features:[[8,16,4,4,-1.],[8,16,2,2,2.],[10,18,2,2,2.]],threshold:-7.2884308174252510e-003,right_val:0.5026869773864746,left_val:0.2982333004474640},{features:[[6,11,8,6,-1.],[6,14,8,3,2.]],threshold:1.5094350092113018e-003,right_val:0.3832970857620239,left_val:0.5308442115783691},{features:[[2,13,5,2,-1.],[2,14,5,1,2.]],threshold:-9.3340799212455750e-003,right_val:0.4969817101955414,left_val:0.2037964016199112},{features:[[13,14,6,6,-1.],[16,14,3,3,2.],[13,17,3,3,2.]],threshold:0.0286671407520771,right_val:0.6928027272224426,left_val:0.5025696754455566},{features:[[1,9,18,4,-1.],[7,9,6,4,3.]],threshold:0.1701968014240265,right_val:0.1476442962884903,left_val:0.4960052967071533},{features:[[13,14,6,6,-1.],[16,14,3,3,2.],[13,17,3,3,2.]],threshold:-3.2614478841423988e-003,right_val:0.4826056063175201,left_val:0.5603063702583313},{features:[[0,2,1,6,-1.],[0,4,1,2,3.]],threshold:5.5769277969375253e-004,right_val:0.4129633009433746,left_val:0.5205562114715576},{features:[[5,0,15,20,-1.],[5,10,15,10,2.]],threshold:0.3625833988189697,right_val:0.3768612146377564,left_val:0.5221652984619141},{features:[[1,14,6,6,-1.],[1,14,3,3,2.],[4,17,3,3,2.]],threshold:-0.0116151301190257,right_val:0.4637489914894104,left_val:0.6022682785987854},{features:[[8,14,4,6,-1.],[10,14,2,3,2.],[8,17,2,3,2.]],threshold:-4.0795197710394859e-003,right_val:0.5337479114532471,left_val:0.4070447087287903},{features:[[7,11,2,1,-1.],[8,11,1,1,2.]],threshold:5.7204300537705421e-004,right_val:0.5900393128395081,left_val:0.4601835012435913},{features:[[9,17,3,2,-1.],[10,17,1,2,3.]],threshold:6.7543348995968699e-004,right_val:0.4345428943634033,left_val:0.5398252010345459},{features:[[8,17,3,2,-1.],[9,17,1,2,3.]],threshold:6.3295697327703238e-004,right_val:0.4051358997821808,left_val:0.5201563239097595},{features:[[12,14,4,6,-1.],[14,14,2,3,2.],[12,17,2,3,2.]],threshold:1.2435320531949401e-003,right_val:0.5547441244125366,left_val:0.4642387926578522},{features:[[4,14,4,6,-1.],[4,14,2,3,2.],[6,17,2,3,2.]],threshold:-4.7363857738673687e-003,right_val:0.4672552049160004,left_val:0.6198567152023315},{features:[[13,14,2,6,-1.],[14,14,1,3,2.],[13,17,1,3,2.]],threshold:-6.4658462069928646e-003,right_val:0.5019000768661499,left_val:0.6837332844734192},{features:[[5,14,2,6,-1.],[5,14,1,3,2.],[6,17,1,3,2.]],threshold:3.5017321351915598e-004,right_val:0.5363622903823853,left_val:0.4344803094863892},{features:[[7,0,6,12,-1.],[7,4,6,4,3.]],threshold:1.5754920605104417e-004,right_val:0.5732020735740662,left_val:0.4760079085826874},{features:[[0,7,12,2,-1.],[4,7,4,2,3.]],threshold:9.9774366244673729e-003,right_val:0.3635039925575256,left_val:0.5090985894203186},{features:[[10,3,3,13,-1.],[11,3,1,13,3.]],threshold:-4.1464529931545258e-004,right_val:0.4593802094459534,left_val:0.5570064783096314},{features:[[7,3,3,13,-1.],[8,3,1,13,3.]],threshold:-3.5888899583369493e-004,right_val:0.4339134991168976,left_val:0.5356845855712891},{features:[[10,8,6,3,-1.],[10,9,6,1,3.]],threshold:4.0463250479660928e-004,right_val:0.5436776876449585,left_val:0.4439803063869476},{features:[[3,11,3,2,-1.],[4,11,1,2,3.]],threshold:-8.2184787606820464e-004,right_val:0.5176299214363098,left_val:0.4042294919490814},{features:[[13,12,6,8,-1.],[16,12,3,4,2.],[13,16,3,4,2.]],threshold:5.9467419050633907e-003,right_val:0.5633779764175415,left_val:0.4927651882171631},{features:[[7,6,6,5,-1.],[9,6,2,5,3.]],threshold:-0.0217533893883228,right_val:0.4800840914249420,left_val:0.8006293773651123},{features:[[17,11,2,7,-1.],[17,11,1,7,2.]],threshold:-0.0145403798669577,right_val:0.5182222723960877,left_val:0.3946054875850678},{features:[[3,13,8,2,-1.],[7,13,4,2,2.]],threshold:-0.0405107699334621,right_val:0.4935792982578278,left_val:0.0213249903172255},{features:[[6,9,8,3,-1.],[6,10,8,1,3.]],threshold:-5.8458268176764250e-004,right_val:0.5314025282859802,left_val:0.4012795984745026},{features:[[4,3,4,3,-1.],[4,4,4,1,3.]],threshold:5.5151800625026226e-003,right_val:0.5896260738372803,left_val:0.4642418920993805},{features:[[11,3,4,3,-1.],[11,4,4,1,3.]],threshold:-6.0626221820712090e-003,right_val:0.5016477704048157,left_val:0.6502159237861633},{features:[[1,4,17,12,-1.],[1,8,17,4,3.]],threshold:0.0945358425378799,right_val:0.4126827120780945,left_val:0.5264708995819092},{features:[[11,3,4,3,-1.],[11,4,4,1,3.]],threshold:4.7315051779150963e-003,right_val:0.5892447829246521,left_val:0.4879199862480164},{features:[[4,8,6,3,-1.],[4,9,6,1,3.]],threshold:-5.2571471314877272e-004,right_val:0.5189412832260132,left_val:0.3917280137538910},{features:[[12,3,5,3,-1.],[12,4,5,1,3.]],threshold:-2.5464049540460110e-003,right_val:0.4985705912113190,left_val:0.5837599039077759},{features:[[1,11,2,7,-1.],[2,11,1,7,2.]],threshold:-0.0260756891220808,right_val:0.4955821931362152,left_val:0.1261983960866928},{features:[[15,12,2,8,-1.],[16,12,1,4,2.],[15,16,1,4,2.]],threshold:-5.4779709316790104e-003,right_val:0.5010265707969666,left_val:0.5722513794898987},{features:[[4,8,11,3,-1.],[4,9,11,1,3.]],threshold:5.1337741315364838e-003,right_val:0.4226376116275787,left_val:0.5273262262344360},{features:[[9,13,6,2,-1.],[12,13,3,1,2.],[9,14,3,1,2.]],threshold:4.7944980906322598e-004,right_val:0.5819587111473084,left_val:0.4450066983699799},{features:[[6,13,4,3,-1.],[6,14,4,1,3.]],threshold:-2.1114079281687737e-003,right_val:0.4511714875698090,left_val:0.5757653117179871},{features:[[9,12,3,3,-1.],[10,12,1,3,3.]],threshold:-0.0131799904629588,right_val:0.5160734057426453,left_val:0.1884381026029587},{features:[[5,3,3,3,-1.],[5,4,3,1,3.]],threshold:-4.7968099825084209e-003,right_val:0.4736118912696838,left_val:0.6589789986610413},{features:[[9,4,2,3,-1.],[9,5,2,1,3.]],threshold:6.7483168095350266e-003,right_val:0.3356395065784454,left_val:0.5259429812431335},{features:[[0,2,16,3,-1.],[0,3,16,1,3.]],threshold:1.4623369788751006e-003,right_val:0.4264092147350311,left_val:0.5355271100997925},{features:[[15,12,2,8,-1.],[16,12,1,4,2.],[15,16,1,4,2.]],threshold:4.7645159065723419e-003,right_val:0.5786827802658081,left_val:0.5034406781196594},{features:[[3,12,2,8,-1.],[3,12,1,4,2.],[4,16,1,4,2.]],threshold:6.8066660314798355e-003,right_val:0.6677829027175903,left_val:0.4756605029106140},{features:[[14,13,3,6,-1.],[14,15,3,2,3.]],threshold:3.6608621012419462e-003,right_val:0.4311546981334686,left_val:0.5369611978530884},{features:[[3,13,3,6,-1.],[3,15,3,2,3.]],threshold:0.0214496403932571,right_val:0.1888816058635712,left_val:0.4968641996383667},{features:[[6,5,10,2,-1.],[11,5,5,1,2.],[6,6,5,1,2.]],threshold:4.1678901761770248e-003,right_val:0.5815368890762329,left_val:0.4930733144283295},{features:[[2,14,14,6,-1.],[2,17,14,3,2.]],threshold:8.6467564105987549e-003,right_val:0.4132595062255859,left_val:0.5205205082893372},{features:[[10,14,1,3,-1.],[10,15,1,1,3.]],threshold:-3.6114078829996288e-004,right_val:0.4800927937030792,left_val:0.5483555197715759},{features:[[4,16,2,2,-1.],[4,16,1,1,2.],[5,17,1,1,2.]],threshold:1.0808729566633701e-003,right_val:0.6041421294212341,left_val:0.4689902067184448},{features:[[10,6,2,3,-1.],[10,7,2,1,3.]],threshold:5.7719959877431393e-003,right_val:0.3053277134895325,left_val:0.5171142220497131},{features:[[0,17,20,2,-1.],[0,17,10,1,2.],[10,18,10,1,2.]],threshold:1.5720770461484790e-003,right_val:0.4178803861141205,left_val:0.5219978094100952},{features:[[13,6,1,3,-1.],[13,7,1,1,3.]],threshold:-1.9307859474793077e-003,right_val:0.4812920093536377,left_val:0.5860369801521301},{features:[[8,13,3,2,-1.],[9,13,1,2,3.]],threshold:-7.8926272690296173e-003,right_val:0.4971733987331390,left_val:0.1749276965856552},{features:[[12,2,3,3,-1.],[13,2,1,3,3.]],threshold:-2.2224679123610258e-003,right_val:0.5212848186492920,left_val:0.4342589080333710},{features:[[3,18,2,2,-1.],[3,18,1,1,2.],[4,19,1,1,2.]],threshold:1.9011989934369922e-003,right_val:0.6892055273056030,left_val:0.4765186905860901},{features:[[9,16,3,4,-1.],[10,16,1,4,3.]],threshold:2.7576119173318148e-003,right_val:0.4337486028671265,left_val:0.5262191295623779},{features:[[6,6,1,3,-1.],[6,7,1,1,3.]],threshold:5.1787449046969414e-003,right_val:0.7843729257583618,left_val:0.4804069101810455},{features:[[13,1,5,2,-1.],[13,2,5,1,2.]],threshold:-9.0273341629654169e-004,right_val:0.5353423953056335,left_val:0.4120846986770630},{features:[[7,14,6,2,-1.],[7,14,3,1,2.],[10,15,3,1,2.]],threshold:5.1797959022223949e-003,right_val:0.6425960063934326,left_val:0.4740372896194458},{features:[[11,3,3,4,-1.],[12,3,1,4,3.]],threshold:-0.0101140001788735,right_val:0.5175017714500427,left_val:0.2468792051076889},{features:[[1,13,12,6,-1.],[5,13,4,6,3.]],threshold:-0.0186170600354671,right_val:0.4628978967666626,left_val:0.5756294131278992},{features:[[14,11,5,2,-1.],[14,12,5,1,2.]],threshold:5.9225959703326225e-003,right_val:0.3214271068572998,left_val:0.5169625878334045},{features:[[2,15,14,4,-1.],[2,15,7,2,2.],[9,17,7,2,2.]],threshold:-6.2945079989731312e-003,right_val:0.5141636729240418,left_val:0.3872014880180359},{features:[[3,7,14,2,-1.],[10,7,7,1,2.],[3,8,7,1,2.]],threshold:6.5353019163012505e-003,right_val:0.6310489773750305,left_val:0.4853048920631409},{features:[[1,11,4,2,-1.],[1,12,4,1,2.]],threshold:1.0878399480134249e-003,right_val:0.3723258972167969,left_val:0.5117315053939819},{features:[[14,0,6,14,-1.],[16,0,2,14,3.]],threshold:-0.0225422400981188,right_val:0.4887112975120544,left_val:0.5692740082740784},{features:[[4,11,1,3,-1.],[4,12,1,1,3.]],threshold:-3.0065660830587149e-003,right_val:0.5003992915153503,left_val:0.2556012868881226},{features:[[14,0,6,14,-1.],[16,0,2,14,3.]],threshold:7.4741272255778313e-003,right_val:0.5675926804542542,left_val:0.4810872972011566},{features:[[1,10,3,7,-1.],[2,10,1,7,3.]],threshold:0.0261623207479715,right_val:0.1777237057685852,left_val:0.4971194863319397},{features:[[8,12,9,2,-1.],[8,13,9,1,2.]],threshold:9.4352738233283162e-004,right_val:0.5491250753402710,left_val:0.4940010905265808},{features:[[0,6,20,1,-1.],[10,6,10,1,2.]],threshold:0.0333632417023182,right_val:0.2790724039077759,left_val:0.5007612109184265},{features:[[8,4,4,4,-1.],[8,4,2,4,2.]],threshold:-0.0151186501607299,right_val:0.4973031878471375,left_val:0.7059578895568848},{features:[[0,0,2,2,-1.],[0,1,2,1,2.]],threshold:9.8648946732282639e-004,right_val:0.3776761889457703,left_val:0.5128620266914368}],threshold:104.7491989135742200},{simpleClassifiers:[{features:[[5,3,10,9,-1.],[5,6,10,3,3.]],threshold:-0.0951507985591888,right_val:0.4017286896705627,left_val:0.6470757126808167},{features:[[15,2,4,10,-1.],[15,2,2,10,2.]],threshold:6.2702340073883533e-003,right_val:0.5746449232101440,left_val:0.3999822139739990},{features:[[8,2,2,7,-1.],[9,2,1,7,2.]],threshold:3.0018089455552399e-004,right_val:0.5538809895515442,left_val:0.3558770120143890},{features:[[7,4,12,1,-1.],[11,4,4,1,3.]],threshold:1.1757409665733576e-003,right_val:0.5382617712020874,left_val:0.4256534874439240},{features:[[3,4,9,1,-1.],[6,4,3,1,3.]],threshold:4.4235268433112651e-005,right_val:0.5589926838874817,left_val:0.3682908117771149},{features:[[15,10,1,4,-1.],[15,12,1,2,2.]],threshold:-2.9936920327600092e-005,right_val:0.4020367860794067,left_val:0.5452470183372498},{features:[[4,10,6,4,-1.],[7,10,3,4,2.]],threshold:3.0073199886828661e-003,right_val:0.3317843973636627,left_val:0.5239058136940002},{features:[[15,9,1,6,-1.],[15,12,1,3,2.]],threshold:-0.0105138896033168,right_val:0.5307983756065369,left_val:0.4320689141750336},{features:[[7,17,6,3,-1.],[7,18,6,1,3.]],threshold:8.3476826548576355e-003,right_val:0.6453298926353455,left_val:0.4504637122154236},{features:[[14,3,2,16,-1.],[15,3,1,8,2.],[14,11,1,8,2.]],threshold:-3.1492270063608885e-003,right_val:0.5370525121688843,left_val:0.4313425123691559},{features:[[4,9,1,6,-1.],[4,12,1,3,2.]],threshold:-1.4435649973165710e-005,right_val:0.3817971944808960,left_val:0.5326603055000305},{features:[[12,1,5,2,-1.],[12,2,5,1,2.]],threshold:-4.2855090578086674e-004,right_val:0.5382009744644165,left_val:0.4305163919925690},{features:[[6,18,4,2,-1.],[6,18,2,1,2.],[8,19,2,1,2.]],threshold:1.5062429883982986e-004,right_val:0.5544965267181397,left_val:0.4235970973968506},{features:[[2,4,16,10,-1.],[10,4,8,5,2.],[2,9,8,5,2.]],threshold:0.0715598315000534,right_val:0.2678802907466888,left_val:0.5303059816360474},{features:[[6,5,1,10,-1.],[6,10,1,5,2.]],threshold:8.4095180500298738e-004,right_val:0.5205433964729309,left_val:0.3557108938694000},{features:[[4,8,15,2,-1.],[9,8,5,2,3.]],threshold:0.0629865005612373,right_val:0.2861376106739044,left_val:0.5225362777709961},{features:[[1,8,15,2,-1.],[6,8,5,2,3.]],threshold:-3.3798629883676767e-003,right_val:0.5201697945594788,left_val:0.3624185919761658},{features:[[9,5,3,6,-1.],[9,7,3,2,3.]],threshold:-1.1810739670181647e-004,right_val:0.3959893882274628,left_val:0.5474476814270020},{features:[[5,7,8,2,-1.],[9,7,4,2,2.]],threshold:-5.4505601292476058e-004,right_val:0.5215715765953064,left_val:0.3740422129631043},{features:[[9,11,2,3,-1.],[9,12,2,1,3.]],threshold:-1.8454910023137927e-003,right_val:0.4584448933601379,left_val:0.5893052220344544},{features:[[1,0,16,3,-1.],[1,1,16,1,3.]],threshold:-4.3832371011376381e-004,right_val:0.5385351181030273,left_val:0.4084582030773163},{features:[[11,2,7,2,-1.],[11,3,7,1,2.]],threshold:-2.4000830017030239e-003,right_val:0.5293580293655396,left_val:0.3777455091476440},{features:[[5,1,10,18,-1.],[5,7,10,6,3.]],threshold:-0.0987957417964935,right_val:0.5070089101791382,left_val:0.2963612079620361},{features:[[17,4,3,2,-1.],[18,4,1,2,3.]],threshold:3.1798239797353745e-003,right_val:0.6726443767547607,left_val:0.4877632856369019},{features:[[8,13,1,3,-1.],[8,14,1,1,3.]],threshold:3.2406419632025063e-004,right_val:0.5561109781265259,left_val:0.4366911053657532},{features:[[3,14,14,6,-1.],[3,16,14,2,3.]],threshold:-0.0325472503900528,right_val:0.5308616161346436,left_val:0.3128157854080200},{features:[[0,2,3,4,-1.],[1,2,1,4,3.]],threshold:-7.7561130747199059e-003,right_val:0.4639872014522553,left_val:0.6560224890708923},{features:[[12,1,5,2,-1.],[12,2,5,1,2.]],threshold:0.0160272493958473,right_val:0.3141897916793823,left_val:0.5172680020332336},{features:[[3,1,5,2,-1.],[3,2,5,1,2.]],threshold:7.1002350523485802e-006,right_val:0.5336294770240784,left_val:0.4084446132183075},{features:[[10,13,2,3,-1.],[10,14,2,1,3.]],threshold:7.3422808200120926e-003,right_val:0.6603465080261231,left_val:0.4966922104358673},{features:[[8,13,2,3,-1.],[8,14,2,1,3.]],threshold:-1.6970280557870865e-003,right_val:0.4500182867050171,left_val:0.5908237099647522},{features:[[14,12,2,3,-1.],[14,13,2,1,3.]],threshold:2.4118260480463505e-003,right_val:0.3599720895290375,left_val:0.5315160751342773},{features:[[7,2,2,3,-1.],[7,3,2,1,3.]],threshold:-5.5300937965512276e-003,right_val:0.4996814131736755,left_val:0.2334040999412537},{features:[[5,6,10,4,-1.],[10,6,5,2,2.],[5,8,5,2,2.]],threshold:-2.6478730142116547e-003,right_val:0.4684734046459198,left_val:0.5880935788154602},{features:[[9,13,1,6,-1.],[9,16,1,3,2.]],threshold:0.0112956296652555,right_val:0.1884590983390808,left_val:0.4983777105808258},{features:[[10,12,2,2,-1.],[11,12,1,1,2.],[10,13,1,1,2.]],threshold:-6.6952878842130303e-004,right_val:0.4799019992351532,left_val:0.5872138142585754},{features:[[4,12,2,3,-1.],[4,13,2,1,3.]],threshold:1.4410680159926414e-003,right_val:0.3501011133193970,left_val:0.5131189227104187},{features:[[14,4,6,6,-1.],[14,6,6,2,3.]],threshold:2.4637870956212282e-003,right_val:0.4117639064788818,left_val:0.5339372158050537},{features:[[8,17,2,3,-1.],[8,18,2,1,3.]],threshold:3.3114518737420440e-004,right_val:0.5398246049880981,left_val:0.4313383102416992},{features:[[16,4,4,6,-1.],[16,6,4,2,3.]],threshold:-0.0335572697222233,right_val:0.5179154872894287,left_val:0.2675336897373200},{features:[[0,4,4,6,-1.],[0,6,4,2,3.]],threshold:0.0185394193977118,right_val:0.2317177057266235,left_val:0.4973869919776917},{features:[[14,6,2,3,-1.],[14,6,1,3,2.]],threshold:-2.9698139405809343e-004,right_val:0.4643664062023163,left_val:0.5529708266258240},{features:[[4,9,8,1,-1.],[8,9,4,1,2.]],threshold:-4.5577259152196348e-004,right_val:0.4469191133975983,left_val:0.5629584193229675},{features:[[8,12,4,3,-1.],[8,13,4,1,3.]],threshold:-0.0101589802652597,right_val:0.4925918877124786,left_val:0.6706212759017944},{features:[[5,12,10,6,-1.],[5,14,10,2,3.]],threshold:-2.2413829356082715e-005,right_val:0.3912901878356934,left_val:0.5239421725273132},{features:[[11,12,1,2,-1.],[11,13,1,1,2.]],threshold:7.2034963523037732e-005,right_val:0.5501788854598999,left_val:0.4799438118934631},{features:[[8,15,4,2,-1.],[8,16,4,1,2.]],threshold:-6.9267209619283676e-003,right_val:0.4698084890842438,left_val:0.6930009722709656},{features:[[6,9,8,8,-1.],[10,9,4,4,2.],[6,13,4,4,2.]],threshold:-7.6997838914394379e-003,right_val:0.5480883121490479,left_val:0.4099623858928680},{features:[[7,12,4,6,-1.],[7,12,2,3,2.],[9,15,2,3,2.]],threshold:-7.3130549862980843e-003,right_val:0.5057886242866516,left_val:0.3283475935459137},{features:[[10,11,3,1,-1.],[11,11,1,1,3.]],threshold:1.9650589674711227e-003,right_val:0.6398249864578247,left_val:0.4978047013282776},{features:[[9,7,2,10,-1.],[9,7,1,5,2.],[10,12,1,5,2.]],threshold:7.1647600270807743e-003,right_val:0.6222137212753296,left_val:0.4661160111427307},{features:[[8,0,6,6,-1.],[10,0,2,6,3.]],threshold:-0.0240786392241716,right_val:0.5222162008285523,left_val:0.2334644943475723},{features:[[3,11,2,6,-1.],[3,13,2,2,3.]],threshold:-0.0210279691964388,right_val:0.4938226044178009,left_val:0.1183653995394707},{features:[[16,12,1,2,-1.],[16,13,1,1,2.]],threshold:3.6017020465806127e-004,right_val:0.4116711020469666,left_val:0.5325019955635071},{features:[[1,14,6,6,-1.],[1,14,3,3,2.],[4,17,3,3,2.]],threshold:-0.0172197297215462,right_val:0.4664269089698792,left_val:0.6278762221336365},{features:[[13,1,3,6,-1.],[14,1,1,6,3.]],threshold:-7.8672142699360847e-003,right_val:0.5249736905097961,left_val:0.3403415083885193},{features:[[8,8,2,2,-1.],[8,9,2,1,2.]],threshold:-4.4777389848604798e-004,right_val:0.5086259245872498,left_val:0.3610411882400513},{features:[[9,9,3,3,-1.],[10,9,1,3,3.]],threshold:5.5486010387539864e-003,right_val:0.6203498244285584,left_val:0.4884265959262848},{features:[[8,7,3,3,-1.],[8,8,3,1,3.]],threshold:-6.9461148232221603e-003,right_val:0.5011097192764282,left_val:0.2625930011272430},{features:[[14,0,2,3,-1.],[14,0,1,3,2.]],threshold:1.3569870498031378e-004,right_val:0.5628312230110169,left_val:0.4340794980525971},{features:[[1,0,18,9,-1.],[7,0,6,9,3.]],threshold:-0.0458802506327629,right_val:0.4696274995803833,left_val:0.6507998704910278},{features:[[11,5,4,15,-1.],[11,5,2,15,2.]],threshold:-0.0215825606137514,right_val:0.5287616848945618,left_val:0.3826502859592438},{features:[[5,5,4,15,-1.],[7,5,2,15,2.]],threshold:-0.0202095396816731,right_val:0.5074477195739746,left_val:0.3233368098735809},{features:[[14,0,2,3,-1.],[14,0,1,3,2.]],threshold:5.8496710844337940e-003,right_val:0.4489670991897583,left_val:0.5177603960037231},{features:[[4,0,2,3,-1.],[5,0,1,3,2.]],threshold:-5.7476379879517481e-005,right_val:0.5246363878250122,left_val:0.4020850956439972},{features:[[11,12,2,2,-1.],[12,12,1,1,2.],[11,13,1,1,2.]],threshold:-1.1513100471347570e-003,right_val:0.4905154109001160,left_val:0.6315072178840637},{features:[[7,12,2,2,-1.],[7,12,1,1,2.],[8,13,1,1,2.]],threshold:1.9862831104546785e-003,right_val:0.6497151255607605,left_val:0.4702459871768951},{features:[[12,0,3,4,-1.],[13,0,1,4,3.]],threshold:-5.2719512023031712e-003,right_val:0.5227652788162231,left_val:0.3650383949279785},{features:[[4,11,3,3,-1.],[4,12,3,1,3.]],threshold:1.2662699446082115e-003,right_val:0.3877618014812470,left_val:0.5166100859642029},{features:[[12,7,4,2,-1.],[12,8,4,1,2.]],threshold:-6.2919440679252148e-003,right_val:0.5023847818374634,left_val:0.7375894188880920},{features:[[8,10,3,2,-1.],[9,10,1,2,3.]],threshold:6.7360111279413104e-004,right_val:0.5495585799217224,left_val:0.4423226118087769},{features:[[9,9,3,2,-1.],[10,9,1,2,3.]],threshold:-1.0523450328037143e-003,right_val:0.4859583079814911,left_val:0.5976396203041077},{features:[[8,9,3,2,-1.],[9,9,1,2,3.]],threshold:-4.4216238893568516e-004,right_val:0.4398930966854096,left_val:0.5955939292907715},{features:[[12,0,3,4,-1.],[13,0,1,4,3.]],threshold:1.1747940443456173e-003,right_val:0.4605058133602142,left_val:0.5349888205528259},{features:[[5,0,3,4,-1.],[6,0,1,4,3.]],threshold:5.2457437850534916e-003,right_val:0.2941577136516571,left_val:0.5049191117286682},{features:[[4,14,12,4,-1.],[10,14,6,2,2.],[4,16,6,2,2.]],threshold:-0.0245397202670574,right_val:0.5218586921691895,left_val:0.2550177872180939},{features:[[8,13,2,3,-1.],[8,14,2,1,3.]],threshold:7.3793041519820690e-004,right_val:0.5490816235542297,left_val:0.4424861073493958},{features:[[10,10,3,8,-1.],[10,14,3,4,2.]],threshold:1.4233799884095788e-003,right_val:0.4081355929374695,left_val:0.5319514274597168},{features:[[8,10,4,8,-1.],[8,10,2,4,2.],[10,14,2,4,2.]],threshold:-2.4149110540747643e-003,right_val:0.5238950252532959,left_val:0.4087659120559692},{features:[[10,8,3,1,-1.],[11,8,1,1,3.]],threshold:-1.2165299849584699e-003,right_val:0.4908052980899811,left_val:0.5674579143524170},{features:[[9,12,1,6,-1.],[9,15,1,3,2.]],threshold:-1.2438809499144554e-003,right_val:0.5256118178367615,left_val:0.4129425883293152},{features:[[10,8,3,1,-1.],[11,8,1,1,3.]],threshold:6.1942739412188530e-003,right_val:0.7313653230667114,left_val:0.5060194134712219},{features:[[7,8,3,1,-1.],[8,8,1,1,3.]],threshold:-1.6607169527560472e-003,right_val:0.4596369862556458,left_val:0.5979632139205933},{features:[[5,2,15,14,-1.],[5,9,15,7,2.]],threshold:-0.0273162592202425,right_val:0.5308842062950134,left_val:0.4174365103244782},{features:[[2,1,2,10,-1.],[2,1,1,5,2.],[3,6,1,5,2.]],threshold:-1.5845570014789701e-003,right_val:0.4519486129283905,left_val:0.5615804791450501},{features:[[14,14,2,3,-1.],[14,15,2,1,3.]],threshold:-1.5514739789068699e-003,right_val:0.5360785126686096,left_val:0.4076187014579773},{features:[[2,7,3,3,-1.],[3,7,1,3,3.]],threshold:3.8446558755822480e-004,right_val:0.5430442094802856,left_val:0.4347293972969055},{features:[[17,4,3,3,-1.],[17,5,3,1,3.]],threshold:-0.0146722598001361,right_val:0.5146093964576721,left_val:0.1659304946660996},{features:[[0,4,3,3,-1.],[0,5,3,1,3.]],threshold:8.1608882173895836e-003,right_val:0.1884745955467224,left_val:0.4961819052696228},{features:[[13,5,6,2,-1.],[16,5,3,1,2.],[13,6,3,1,2.]],threshold:1.1121659772470593e-003,right_val:0.6093816161155701,left_val:0.4868263900279999},{features:[[4,19,12,1,-1.],[8,19,4,1,3.]],threshold:-7.2603770531713963e-003,right_val:0.4690375924110413,left_val:0.6284325122833252},{features:[[12,12,2,4,-1.],[12,14,2,2,2.]],threshold:-2.4046430189628154e-004,right_val:0.4046044051647186,left_val:0.5575000047683716},{features:[[3,15,1,3,-1.],[3,16,1,1,3.]],threshold:-2.3348190006799996e-004,right_val:0.5252848267555237,left_val:0.4115762114524841},{features:[[11,16,6,4,-1.],[11,16,3,4,2.]],threshold:5.5736480280756950e-003,right_val:0.5690100789070129,left_val:0.4730072915554047},{features:[[2,10,3,10,-1.],[3,10,1,10,3.]],threshold:0.0306237693876028,right_val:0.1740095019340515,left_val:0.4971886873245239},{features:[[12,8,2,4,-1.],[12,8,1,4,2.]],threshold:9.2074798885732889e-004,right_val:0.4354872107505798,left_val:0.5372117757797241},{features:[[6,8,2,4,-1.],[7,8,1,4,2.]],threshold:-4.3550739064812660e-005,right_val:0.4347316920757294,left_val:0.5366883873939514},{features:[[10,14,2,3,-1.],[10,14,1,3,2.]],threshold:-6.6452710889279842e-003,right_val:0.5160533189773560,left_val:0.3435518145561218},{features:[[5,1,10,3,-1.],[10,1,5,3,2.]],threshold:0.0432219989597797,right_val:0.7293652892112732,left_val:0.4766792058944702},{features:[[10,7,3,2,-1.],[11,7,1,2,3.]],threshold:2.2331769578158855e-003,right_val:0.5633171200752258,left_val:0.5029315948486328},{features:[[5,6,9,2,-1.],[8,6,3,2,3.]],threshold:3.1829739455133677e-003,right_val:0.5192136764526367,left_val:0.4016092121601105},{features:[[9,8,2,2,-1.],[9,9,2,1,2.]],threshold:-1.8027749320026487e-004,right_val:0.5417919754981995,left_val:0.4088315963745117},{features:[[2,11,16,6,-1.],[2,11,8,3,2.],[10,14,8,3,2.]],threshold:-5.2934689447283745e-003,right_val:0.5243561863899231,left_val:0.4075677096843720},{features:[[12,7,2,2,-1.],[13,7,1,1,2.],[12,8,1,1,2.]],threshold:1.2750959722325206e-003,right_val:0.6387010812759399,left_val:0.4913282990455627},{features:[[9,5,2,3,-1.],[9,6,2,1,3.]],threshold:4.3385322205722332e-003,right_val:0.2947346866130829,left_val:0.5031672120094299},{features:[[9,7,3,2,-1.],[10,7,1,2,3.]],threshold:8.5250744596123695e-003,right_val:0.6308869123458862,left_val:0.4949789047241211},{features:[[5,1,8,12,-1.],[5,7,8,6,2.]],threshold:-9.4266352243721485e-004,right_val:0.4285649955272675,left_val:0.5328366756439209},{features:[[13,5,2,2,-1.],[13,6,2,1,2.]],threshold:1.3609660090878606e-003,right_val:0.5941501259803772,left_val:0.4991525113582611},{features:[[5,5,2,2,-1.],[5,6,2,1,2.]],threshold:4.4782509212382138e-004,right_val:0.5854480862617493,left_val:0.4573504030704498},{features:[[12,4,3,3,-1.],[12,5,3,1,3.]],threshold:1.3360050506889820e-003,right_val:0.5849052071571350,left_val:0.4604358971118927},{features:[[4,14,2,3,-1.],[4,15,2,1,3.]],threshold:-6.0967548051849008e-004,right_val:0.5229423046112061,left_val:0.3969388902187347},{features:[[12,4,3,3,-1.],[12,5,3,1,3.]],threshold:-2.3656780831515789e-003,right_val:0.4898357093334198,left_val:0.5808320045471191},{features:[[5,4,3,3,-1.],[5,5,3,1,3.]],threshold:1.0734340175986290e-003,right_val:0.5470039248466492,left_val:0.4351210892200470},{features:[[9,14,2,6,-1.],[10,14,1,3,2.],[9,17,1,3,2.]],threshold:2.1923359017819166e-003,right_val:0.3842903971672058,left_val:0.5355060100555420},{features:[[8,14,3,2,-1.],[9,14,1,2,3.]],threshold:5.4968618787825108e-003,right_val:0.2827191948890686,left_val:0.5018138885498047},{features:[[9,5,6,6,-1.],[11,5,2,6,3.]],threshold:-0.0753688216209412,right_val:0.5148826837539673,left_val:0.1225076019763947},{features:[[5,5,6,6,-1.],[7,5,2,6,3.]],threshold:0.0251344703137875,right_val:0.7025446295738220,left_val:0.4731766879558563},{features:[[13,13,1,2,-1.],[13,14,1,1,2.]],threshold:-2.9358599931583740e-005,right_val:0.4656086862087250,left_val:0.5430532097816467},{features:[[0,2,10,2,-1.],[0,3,10,1,2.]],threshold:-5.8355910005047917e-004,right_val:0.5190119743347168,left_val:0.4031040072441101},{features:[[13,13,1,2,-1.],[13,14,1,1,2.]],threshold:-2.6639450807124376e-003,right_val:0.5161771178245544,left_val:0.4308126866817474},{features:[[5,7,2,2,-1.],[5,7,1,1,2.],[6,8,1,1,2.]],threshold:-1.3804089976474643e-003,right_val:0.4695515930652618,left_val:0.6219829916954041},{features:[[13,5,2,7,-1.],[13,5,1,7,2.]],threshold:1.2313219485804439e-003,right_val:0.4425831139087677,left_val:0.5379363894462585},{features:[[6,13,1,2,-1.],[6,14,1,1,2.]],threshold:-1.4644179827882908e-005,right_val:0.4222503006458283,left_val:0.5281640291213989},{features:[[11,0,3,7,-1.],[12,0,1,7,3.]],threshold:-0.0128188095986843,right_val:0.5179932713508606,left_val:0.2582092881202698},{features:[[0,3,2,16,-1.],[0,3,1,8,2.],[1,11,1,8,2.]],threshold:0.0228521898388863,right_val:0.7609264254570007,left_val:0.4778693020343781},{features:[[11,0,3,7,-1.],[12,0,1,7,3.]],threshold:8.2305970136076212e-004,right_val:0.4671724140644074,left_val:0.5340992212295532},{features:[[6,0,3,7,-1.],[7,0,1,7,3.]],threshold:0.0127701200544834,right_val:0.1472366005182266,left_val:0.4965761005878449},{features:[[11,16,8,4,-1.],[11,16,4,4,2.]],threshold:-0.0500515103340149,right_val:0.5016592144966126,left_val:0.6414994001388550},{features:[[1,16,8,4,-1.],[5,16,4,4,2.]],threshold:0.0157752707600594,right_val:0.5685362219810486,left_val:0.4522320032119751},{features:[[13,5,2,7,-1.],[13,5,1,7,2.]],threshold:-0.0185016207396984,right_val:0.5137959122657776,left_val:0.2764748930931091},{features:[[5,5,2,7,-1.],[6,5,1,7,2.]],threshold:2.4626250378787518e-003,right_val:0.3795408010482788,left_val:0.5141941905021668},{features:[[18,6,2,14,-1.],[18,13,2,7,2.]],threshold:0.0629161670804024,right_val:0.6580433845520020,left_val:0.5060648918151856},{features:[[6,10,3,4,-1.],[6,12,3,2,2.]],threshold:-2.1648500478477217e-005,right_val:0.4019886851310730,left_val:0.5195388197898865},{features:[[14,7,1,2,-1.],[14,8,1,1,2.]],threshold:2.1180990152060986e-003,right_val:0.5954458713531494,left_val:0.4962365031242371},{features:[[0,1,18,6,-1.],[0,1,9,3,2.],[9,4,9,3,2.]],threshold:-0.0166348908096552,right_val:0.5175446867942810,left_val:0.3757933080196381},{features:[[14,7,1,2,-1.],[14,8,1,1,2.]],threshold:-2.8899470344185829e-003,right_val:0.5057178735733032,left_val:0.6624013781547546},{features:[[0,6,2,14,-1.],[0,13,2,7,2.]],threshold:0.0767832621932030,right_val:0.8047714829444885,left_val:0.4795796871185303},{features:[[17,0,3,12,-1.],[18,0,1,12,3.]],threshold:3.9170677773654461e-003,right_val:0.5719941854476929,left_val:0.4937882125377655},{features:[[0,6,18,3,-1.],[0,7,18,1,3.]],threshold:-0.0726706013083458,right_val:0.4943903982639313,left_val:0.0538945607841015},{features:[[6,0,14,16,-1.],[6,8,14,8,2.]],threshold:0.5403950214385986,right_val:0.1143338978290558,left_val:0.5129774212837219},{features:[[0,0,3,12,-1.],[1,0,1,12,3.]],threshold:2.9510019812732935e-003,right_val:0.5698574185371399,left_val:0.4528343975543976},{features:[[13,0,3,7,-1.],[14,0,1,7,3.]],threshold:3.4508369863033295e-003,right_val:0.4218730926513672,left_val:0.5357726812362671},{features:[[5,7,1,2,-1.],[5,8,1,1,2.]],threshold:-4.2077939724549651e-004,right_val:0.4637925922870636,left_val:0.5916172862052918},{features:[[14,4,6,6,-1.],[14,6,6,2,3.]],threshold:3.3051050268113613e-003,right_val:0.4382042884826660,left_val:0.5273385047912598},{features:[[5,7,7,2,-1.],[5,8,7,1,2.]],threshold:4.7735060798004270e-004,right_val:0.5181884765625000,left_val:0.4046528041362763},{features:[[8,6,6,9,-1.],[8,9,6,3,3.]],threshold:-0.0259285103529692,right_val:0.5089386105537415,left_val:0.7452235817909241},{features:[[5,4,6,1,-1.],[7,4,2,1,3.]],threshold:-2.9729790985584259e-003,right_val:0.5058795213699341,left_val:0.3295435905456543},{features:[[13,0,6,4,-1.],[16,0,3,2,2.],[13,2,3,2,2.]],threshold:5.8508329093456268e-003,right_val:0.5793024897575378,left_val:0.4857144057750702},{features:[[1,2,18,12,-1.],[1,6,18,4,3.]],threshold:-0.0459675192832947,right_val:0.5380653142929077,left_val:0.4312731027603149},{features:[[3,2,17,12,-1.],[3,6,17,4,3.]],threshold:0.1558596044778824,right_val:0.1684713959693909,left_val:0.5196170210838318},{features:[[5,14,7,3,-1.],[5,15,7,1,3.]],threshold:0.0151648297905922,right_val:0.6735026836395264,left_val:0.4735757112503052},{features:[[10,14,1,3,-1.],[10,15,1,1,3.]],threshold:-1.0604249546304345e-003,right_val:0.4775702953338623,left_val:0.5822926759719849},{features:[[3,14,3,3,-1.],[3,15,3,1,3.]],threshold:6.6476291976869106e-003,right_val:0.2319535017013550,left_val:0.4999198913574219},{features:[[14,4,6,6,-1.],[14,6,6,2,3.]],threshold:-0.0122311301529408,right_val:0.5262982249259949,left_val:0.4750893115997315},{features:[[0,4,6,6,-1.],[0,6,6,2,3.]],threshold:5.6528882123529911e-003,right_val:0.3561818897724152,left_val:0.5069767832756043},{features:[[12,5,4,3,-1.],[12,6,4,1,3.]],threshold:1.2977829901501536e-003,right_val:0.5619062781333923,left_val:0.4875693917274475},{features:[[4,5,4,3,-1.],[4,6,4,1,3.]],threshold:0.0107815898954868,right_val:0.6782308220863342,left_val:0.4750770032405853},{features:[[18,0,2,6,-1.],[18,2,2,2,3.]],threshold:2.8654779307544231e-003,right_val:0.4290736019611359,left_val:0.5305461883544922},{features:[[8,1,4,9,-1.],[10,1,2,9,2.]],threshold:2.8663428965955973e-003,right_val:0.5539351105690002,left_val:0.4518479108810425},{features:[[6,6,8,2,-1.],[6,6,4,2,2.]],threshold:-5.1983320154249668e-003,right_val:0.5434188842773438,left_val:0.4149119853973389},{features:[[6,5,4,2,-1.],[6,5,2,1,2.],[8,6,2,1,2.]],threshold:5.3739990107715130e-003,right_val:0.6507657170295715,left_val:0.4717896878719330},{features:[[10,5,2,3,-1.],[10,6,2,1,3.]],threshold:-0.0146415298804641,right_val:0.5161777138710022,left_val:0.2172164022922516},{features:[[9,5,1,3,-1.],[9,6,1,1,3.]],threshold:-1.5042580344015732e-005,right_val:0.4298836886882782,left_val:0.5337383747100830},{features:[[9,10,2,2,-1.],[9,11,2,1,2.]],threshold:-1.1875660129589960e-004,right_val:0.5582447052001953,left_val:0.4604594111442566},{features:[[0,8,4,3,-1.],[0,9,4,1,3.]],threshold:0.0169955305755138,right_val:0.0738800764083862,left_val:0.4945895075798035},{features:[[6,0,8,6,-1.],[6,3,8,3,2.]],threshold:-0.0350959412753582,right_val:0.4977591037750244,left_val:0.7005509138107300},{features:[[1,0,6,4,-1.],[1,0,3,2,2.],[4,2,3,2,2.]],threshold:2.4217350874096155e-003,right_val:0.5477694272994995,left_val:0.4466265141963959},{features:[[13,0,3,7,-1.],[14,0,1,7,3.]],threshold:-9.6340337768197060e-004,right_val:0.5313338041305542,left_val:0.4714098870754242},{features:[[9,16,2,2,-1.],[9,17,2,1,2.]],threshold:1.6391130338888615e-004,right_val:0.5342242121696472,left_val:0.4331546127796173},{features:[[11,4,6,10,-1.],[11,9,6,5,2.]],threshold:-0.0211414601653814,right_val:0.5204498767852783,left_val:0.2644700109958649},{features:[[0,10,19,2,-1.],[0,11,19,1,2.]],threshold:8.7775202700868249e-004,right_val:0.4152742922306061,left_val:0.5208349823951721},{features:[[9,5,8,9,-1.],[9,8,8,3,3.]],threshold:-0.0279439203441143,right_val:0.5018811821937561,left_val:0.6344125270843506},{features:[[4,0,3,7,-1.],[5,0,1,7,3.]],threshold:6.7297378554940224e-003,right_val:0.3500863909721375,left_val:0.5050438046455383},{features:[[8,6,4,12,-1.],[10,6,2,6,2.],[8,12,2,6,2.]],threshold:0.0232810396701097,right_val:0.6968677043914795,left_val:0.4966318011283875},{features:[[0,2,6,4,-1.],[0,4,6,2,2.]],threshold:-0.0116449799388647,right_val:0.5049629807472229,left_val:0.3300260007381439},{features:[[8,15,4,3,-1.],[8,16,4,1,3.]],threshold:0.0157643090933561,right_val:0.7321153879165649,left_val:0.4991598129272461},{features:[[8,0,3,7,-1.],[9,0,1,7,3.]],threshold:-1.3611479662358761e-003,right_val:0.5160670876502991,left_val:0.3911735117435455},{features:[[9,5,3,4,-1.],[10,5,1,4,3.]],threshold:-8.1522337859496474e-004,right_val:0.4949719011783600,left_val:0.5628911256790161},{features:[[8,5,3,4,-1.],[9,5,1,4,3.]],threshold:-6.0066272271797061e-004,right_val:0.4550595879554749,left_val:0.5853595137596130},{features:[[7,6,6,1,-1.],[9,6,2,1,3.]],threshold:4.9715518252924085e-004,right_val:0.5443599224090576,left_val:0.4271470010280609},{features:[[7,14,4,4,-1.],[7,14,2,2,2.],[9,16,2,2,2.]],threshold:2.3475370835512877e-003,right_val:0.3887656927108765,left_val:0.5143110752105713},{features:[[13,14,4,6,-1.],[15,14,2,3,2.],[13,17,2,3,2.]],threshold:-8.9261569082736969e-003,right_val:0.4971720874309540,left_val:0.6044502258300781},{features:[[7,8,1,8,-1.],[7,12,1,4,2.]],threshold:-0.0139199104160070,right_val:0.5000367760658264,left_val:0.2583160996437073},{features:[[16,0,2,8,-1.],[17,0,1,4,2.],[16,4,1,4,2.]],threshold:1.0209949687123299e-003,right_val:0.5560358166694641,left_val:0.4857374131679535},{features:[[2,0,2,8,-1.],[2,0,1,4,2.],[3,4,1,4,2.]],threshold:-2.7441629208624363e-003,right_val:0.4645777046680450,left_val:0.5936884880065918},{features:[[6,1,14,3,-1.],[6,2,14,1,3.]],threshold:-0.0162001308053732,right_val:0.5193495154380798,left_val:0.3163014948368073},{features:[[7,9,3,10,-1.],[7,14,3,5,2.]],threshold:4.3331980705261230e-003,right_val:0.3458878993988037,left_val:0.5061224102973938},{features:[[9,14,2,2,-1.],[9,15,2,1,2.]],threshold:5.8497930876910686e-004,right_val:0.5870177745819092,left_val:0.4779017865657806},{features:[[7,7,6,8,-1.],[7,11,6,4,2.]],threshold:-2.2466450463980436e-003,right_val:0.5374773144721985,left_val:0.4297851026058197},{features:[[9,7,3,6,-1.],[9,10,3,3,2.]],threshold:2.3146099410951138e-003,right_val:0.4640969932079315,left_val:0.5438671708106995},{features:[[7,13,3,3,-1.],[7,14,3,1,3.]],threshold:8.7679121643304825e-003,right_val:0.6771789789199829,left_val:0.4726893007755280},{features:[[9,9,2,2,-1.],[9,10,2,1,2.]],threshold:-2.2448020172305405e-004,right_val:0.5428048968315125,left_val:0.4229173064231873},{features:[[0,1,18,2,-1.],[6,1,6,2,3.]],threshold:-7.4336021207273006e-003,right_val:0.4683673977851868,left_val:0.6098880767822266},{features:[[7,1,6,14,-1.],[7,8,6,7,2.]],threshold:-2.3189240600913763e-003,right_val:0.4424242079257965,left_val:0.5689436793327332},{features:[[1,9,18,1,-1.],[7,9,6,1,3.]],threshold:-2.1042178850620985e-003,right_val:0.5187087059020996,left_val:0.3762221038341522},{features:[[9,7,2,2,-1.],[9,7,1,2,2.]],threshold:4.6034841216169298e-004,right_val:0.5771207213401794,left_val:0.4699405133724213},{features:[[9,3,2,9,-1.],[10,3,1,9,2.]],threshold:1.0547629790380597e-003,right_val:0.5601701736450195,left_val:0.4465216994285584},{features:[[18,14,2,3,-1.],[18,15,2,1,3.]],threshold:8.7148818420246243e-004,right_val:0.3914709091186523,left_val:0.5449805259704590},{features:[[7,11,3,1,-1.],[8,11,1,1,3.]],threshold:3.3364820410497487e-004,right_val:0.5645738840103149,left_val:0.4564009010791779},{features:[[10,8,3,4,-1.],[11,8,1,4,3.]],threshold:-1.4853250468149781e-003,right_val:0.4692778885364533,left_val:0.5747377872467041},{features:[[7,14,3,6,-1.],[8,14,1,6,3.]],threshold:3.0251620337367058e-003,right_val:0.3762814104557037,left_val:0.5166196823120117},{features:[[10,8,3,4,-1.],[11,8,1,4,3.]],threshold:5.0280741415917873e-003,right_val:0.6151527166366577,left_val:0.5002111792564392},{features:[[7,8,3,4,-1.],[8,8,1,4,3.]],threshold:-5.8164511574432254e-004,right_val:0.4390751123428345,left_val:0.5394598245620728},{features:[[7,9,6,9,-1.],[7,12,6,3,3.]],threshold:0.0451415292918682,right_val:0.2063035964965820,left_val:0.5188326835632324},{features:[[0,14,2,3,-1.],[0,15,2,1,3.]],threshold:-1.0795620037242770e-003,right_val:0.5137907266616821,left_val:0.3904685080051422},{features:[[11,12,1,2,-1.],[11,13,1,1,2.]],threshold:1.5995999274309725e-004,right_val:0.5427504181861877,left_val:0.4895322918891907},{features:[[4,3,8,3,-1.],[8,3,4,3,2.]],threshold:-0.0193592701107264,right_val:0.4773507118225098,left_val:0.6975228786468506},{features:[[0,4,20,6,-1.],[0,4,10,6,2.]],threshold:0.2072550952434540,right_val:0.3034991919994354,left_val:0.5233635902404785},{features:[[9,14,1,3,-1.],[9,15,1,1,3.]],threshold:-4.1953290929086506e-004,right_val:0.4460186064243317,left_val:0.5419396758079529},{features:[[8,14,4,3,-1.],[8,15,4,1,3.]],threshold:2.2582069505006075e-003,right_val:0.6027408838272095,left_val:0.4815764129161835},{features:[[0,15,14,4,-1.],[0,17,14,2,2.]],threshold:-6.7811207845807076e-003,right_val:0.5183305740356445,left_val:0.3980278968811035},{features:[[1,14,18,6,-1.],[1,17,18,3,2.]],threshold:0.0111543098464608,right_val:0.4188759922981262,left_val:0.5431231856346130},{features:[[0,0,10,6,-1.],[0,0,5,3,2.],[5,3,5,3,2.]],threshold:0.0431624315679073,right_val:0.6522961258888245,left_val:0.4738228023052216}],threshold:105.7611007690429700}],size:[20,20],tilted:false};\n\n/**\n * Fast Fourier Transform\n * 1D-FFT/IFFT, 2D-FFT/IFFT (radix-2)\n *\n * @author ryo / github.com/wellflat\n * Based on https://github.com/wellflat/javascript-labs with some tiny optimizations\n */\n\nfunction FFT$1() {\n\n\tvar _n = 0,          // order\n\t\t_bitrev = null,  // bit reversal table\n\t\t_cstb = null;    // sin/cos table\n\tvar _tre, _tim;\n\n\tthis.init = function (n) {\n\t\tif(n !== 0 && (n & (n - 1)) === 0) {\n\t\t\t_n = n;\n\t\t\t_setVariables();\n\t\t\t_makeBitReversal();\n\t\t\t_makeCosSinTable();\n\t\t} else {\n\t\t\tthrow new Error('init: radix-2 required');\n\t\t}\n\t};\n\n\t// 1D-FFT\n\tthis.fft1d = function (re, im) {\n\t\tfft(re, im, 1);\n\t};\n\n\t// 1D-IFFT\n\tthis.ifft1d = function (re, im) {\n\t\tvar n = 1/_n;\n\t\tfft(re, im, -1);\n\t\tfor(var i=0; i<_n; i++) {\n\t\t\tre[i] *= n;\n\t\t\tim[i] *= n;\n\t\t}\n\t};\n\n\t// 2D-FFT\n\tthis.fft2d = function (re, im) {\n\t\tvar i = 0;\n\t\t// x-axis\n\t\tfor(var y=0; y<_n; y++) {\n\t\t\ti = y*_n;\n\t\t\tfor(var x1=0; x1<_n; x1++) {\n\t\t\t\t_tre[x1] = re[x1 + i];\n\t\t\t\t_tim[x1] = im[x1 + i];\n\t\t\t}\n\t\t\tthis.fft1d(_tre, _tim);\n\t\t\tfor(var x2=0; x2<_n; x2++) {\n\t\t\t\tre[x2 + i] = _tre[x2];\n\t\t\t\tim[x2 + i] = _tim[x2];\n\t\t\t}\n\t\t}\n\n\t\t// y-axis\n\t\tfor(var x=0; x<_n; x++) {\n\t\t\tfor(var y1=0; y1<_n; y1++) {\n\t\t\t\ti = x + y1*_n;\n\t\t\t\t_tre[y1] = re[i];\n\t\t\t\t_tim[y1] = im[i];\n\t\t\t}\n\t\t\tthis.fft1d(_tre, _tim);\n\t\t\tfor(var y2=0; y2<_n; y2++) {\n\t\t\t\ti = x + y2*_n;\n\t\t\t\tre[i] = _tre[y2];\n\t\t\t\tim[i] = _tim[y2];\n\t\t\t}\n\t\t}\n\t};\n\n\t// 2D-IFFT\n\tthis.ifft2d = function (re, im) {\n\t\tvar i = 0;\n\t\t// x-axis\n\t\tfor(var y=0; y<_n; y++) {\n\t\t\ti = y*_n;\n\t\t\tfor(var x1=0; x1<_n; x1++) {\n\t\t\t\t_tre[x1] = re[x1 + i];\n\t\t\t\t_tim[x1] = im[x1 + i];\n\t\t\t}\n\t\t\tthis.ifft1d(_tre, _tim);\n\t\t\tfor(var x2=0; x2<_n; x2++) {\n\t\t\t\tre[x2 + i] = _tre[x2];\n\t\t\t\tim[x2 + i] = _tim[x2];\n\t\t\t}\n\t\t}\n\t\t// y-axis\n\t\tfor(var x=0; x<_n; x++) {\n\t\t\tfor(var y1=0; y1<_n; y1++) {\n\t\t\t\ti = x + y1*_n;\n\t\t\t\t_tre[y1] = re[i];\n\t\t\t\t_tim[y1] = im[i];\n\t\t\t}\n\t\t\tthis.ifft1d(_tre, _tim);\n\t\t\tfor(var y2=0; y2<_n; y2++) {\n\t\t\t\ti = x + y2*_n;\n\t\t\t\tre[i] = _tre[y2];\n\t\t\t\tim[i] = _tim[y2];\n\t\t\t}\n\t\t}\n\t};\n\n\t// 2D-IFFT, real-valued\n\t// only outputs the real valued part\n\tthis.real_ifft2d = function (re, im) {\n\t\tvar i2;\n\t\tvar i = 0;\n\t\t// x-axis\n\t\tfor(var y=0; y<_n; y++) {\n\t\t\ti = y*_n;\n\t\t\tfor(var x1=0; x1<_n; x1++) {\n\t\t\t\t_tre[x1] = re[x1 + i];\n\t\t\t\t_tim[x1] = im[x1 + i];\n\t\t\t}\n\t\t\tthis.ifft1d(_tre, _tim);\n\t\t\tfor(var x2=0; x2<_n; x2++) {\n\t\t\t\tre[x2 + i] = _tre[x2];\n\t\t\t\tim[x2 + i] = _tim[x2];\n\t\t\t}\n\t\t}\n\t\t// y-axis\n\t\tvar halfn = _n/2;\n\t\tvar rowIdx = 0;\n\t\tfor(var x=0; x<_n; x+=2) {\n\t\t\t//untangle\n\t\t\ti = x;\n\t\t\ti2 = x+1;\n\t\t\t_tre[0] = re[0 + i];\n\t\t\t_tim[0] = re[0 + i2];\n\t\t\t_tre[_n/2] = re[(halfn*_n) + i];\n\t\t\t_tim[_n/2] = re[(halfn*_n) + i2];\n\t\t\tfor (var x2=1;x2<halfn;x2++) {\n\t\t\t\trowIdx = x2*_n;\n\t\t\t\t_tre[x2] = re[rowIdx+i] - im[rowIdx + i2];\n\t\t\t\t_tre[_n - x2] = re[rowIdx+i] + im[rowIdx + i2];\n\t\t\t\t_tim[x2] = im[rowIdx+i] + re[rowIdx+i2];\n\t\t\t\t_tim[_n - x2] = re[rowIdx+i2] - im[rowIdx+i];\n\t\t\t}\n\t\t\tthis.ifft1d(_tre, _tim);\n\t\t\tfor(var y2=0; y2<_n; y2++) {\n\t\t\t\ti = x + y2*_n;\n\t\t\t\ti2 = (x + 1) + y2*_n;\n\t\t\t\tre[i] = _tre[y2];\n\t\t\t\tre[i2] = _tim[y2];\n\t\t\t}\n\t\t}\n\t};\n\n\t// 2D-FFT, real-valued only\n\t// ignores the imaginary input\n\t//   see:\n\t// http://www.inf.fu-berlin.de/lehre/SS12/SP-Par/download/fft1.pdf\n\t// http://cnx.org/content/m12021/latest/\n\t// http://images.apple.com/acg/pdf/g4fft.pdf\n\t// http://www.ti.com/lit/an/spra291/spra291.pdf\n\tthis.real_fft2d = function (re, im) {\n\t\tvar i = 0, i2 = 0;\n\t\t// x-axis\n\t\tfor(var y=0; y<_n; y += 2) {\n\t\t\ti = y*_n;\n\t\t\ti2 = (y+1)*_n;\n\t\t\t// tangle\n\t\t\tfor(var x1=0; x1<_n; x1++) {\n\t\t\t\t_tre[x1] = re[x1 + i];\n\t\t\t\t_tim[x1] = re[x1 + i2];\n\t\t\t}\n\t\t\tthis.fft1d(_tre, _tim);\n\t\t\t// untangle\n\t\t\tre[0 + i] = _tre[0];\n\t\t\tre[0 + i2] = _tim[0];\n\t\t\tim[0 + i] = 0;\n\t\t\tim[0 + i2] = 0;\n\t\t\tre[_n/2 + i] = _tre[_n/2];\n\t\t\tre[_n/2 + i2] = _tim[_n/2];\n\t\t\tim[_n/2 + i] = 0;\n\t\t\tim[_n/2 + i2] = 0;\n\t\t\tfor(var x2=1;x2<(_n/2);x2++) {\n\t\t\t\tre[x2 + i] = 0.5 * (_tre[x2] + _tre[_n - x2]);\n\t\t\t\tim[x2 + i] = 0.5 * (_tim[x2] - _tim[_n - x2]);\n\t\t\t\tre[x2 + i2] = 0.5 * (_tim[x2] + _tim[_n - x2]);\n\t\t\t\tim[x2 + i2] = -0.5 * (_tre[x2] - _tre[_n - x2]);\n\t\t\t\tre[(_n-x2) + i] = re[x2 + i];\n\t\t\t\tim[(_n-x2) + i] = -im[x2 + i];\n\t\t\t\tre[(_n-x2) + i2] = re[x2 + i2];\n\t\t\t\tim[(_n-x2) + i2] = -im[x2 + i2];\n\t\t\t}\n\t\t}\n\t\t// y-axis\n\t\tfor(var x=0; x<_n; x++) {\n\t\t\tfor(var y1=0; y1<_n; y1++) {\n\t\t\t\ti = x + y1*_n;\n\t\t\t\t_tre[y1] = re[i];\n\t\t\t\t_tim[y1] = im[i];\n\t\t\t}\n\t\t\tthis.fft1d(_tre, _tim);\n\t\t\tfor(var y2=0; y2<_n; y2++) {\n\t\t\t\ti = x + y2*_n;\n\t\t\t\tre[i] = _tre[y2];\n\t\t\t\tim[i] = _tim[y2];\n\t\t\t}\n\t\t}\n\t};\n\n\t// core operation of FFT\n\tfunction fft(re, im, inv) {\n\t\tvar d, h, ik, m, tmp, wr, wi, xr, xi,\n\t\t\tn4 = _n >> 2;\n\t\t// bit reversal\n\t\tfor(var l=0; l<_n; l++) {\n\t\t\tm = _bitrev[l];\n\t\t\tif(l < m) {\n\t\t\t\ttmp = re[l];\n\t\t\t\tre[l] = re[m];\n\t\t\t\tre[m] = tmp;\n\t\t\t\ttmp = im[l];\n\t\t\t\tim[l] = im[m];\n\t\t\t\tim[m] = tmp;\n\t\t\t}\n\t\t}\n\t\t// butterfly operation\n\t\t//butfly(re,im,inv,n4);\n\t\tfor(var k=1; k<_n; k<<=1) {\n\t\t\th = 0;\n\t\t\td = _n/(k << 1);\n\t\t\tfor(var j=0; j<k; j++) {\n\t\t\t\twr = _cstb[h + n4];\n\t\t\t\twi = inv*_cstb[h];\n\t\t\t\tfor(var i=j; i<_n; i+=(k<<1)) {\n\t\t\t\t\tik = i + k;\n\t\t\t\t\txr = wr*re[ik] + wi*im[ik];\n\t\t\t\t\txi = wr*im[ik] - wi*re[ik];\n\t\t\t\t\tre[ik] = re[i] - xr;\n\t\t\t\t\tre[i] += xr;\n\t\t\t\t\tim[ik] = im[i] - xi;\n\t\t\t\t\tim[i] += xi;\n\t\t\t\t}\n\t\t\t\th += d;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction _setVariables() {\n\t\tif(typeof Uint8Array !== 'undefined') {\n\t\t\t_bitrev = new Uint8Array(_n);\n\t\t} else {\n\t\t\t_bitrev = new Array(_n);\n\t\t}\n\t\tif(typeof Float64Array !== 'undefined') {\n\t\t\t_cstb = new Float64Array(_n*1.25);\n\t\t\t_tre = new Float64Array(_n);\n\t\t\t_tim = new Float64Array(_n);\n\t\t} else {\n\t\t\t_cstb = new Array(_n*1.25);\n\t\t\t_tre = new Array(_n);\n\t\t\t_tim = new Array(_n);\n\t\t}\n\t}\n\n\t// make bit reversal table\n\tfunction _makeBitReversal() {\n\t\tvar i = 0,\n\t\t\tj = 0,\n\t\t\tk = 0;\n\t\t_bitrev[0] = 0;\n\t\twhile(++i < _n) {\n\t\t\tk = _n >> 1;\n\t\t\twhile(k <= j) {\n\t\t\t\tj -= k;\n\t\t\t\tk >>= 1;\n\t\t\t}\n\t\t\tj += k;\n\t\t\t_bitrev[i] = j;\n\t\t}\n\t}\n\n\t// make trigonometric function table\n\tfunction _makeCosSinTable() {\n\t\tvar n2 = _n >> 1,\n\t\t\tn4 = _n >> 2,\n\t\t\tn8 = _n >> 3,\n\t\t\tn2p4 = n2 + n4,\n\t\t\tt = Math.sin(Math.PI/_n),\n\t\t\tdc = 2*t*t,\n\t\t\tds = Math.sqrt(dc*(2 - dc)),\n\t\t\tc = _cstb[n4] = 1,\n\t\t\ts = _cstb[0] = 0;\n\t\tt = 2*dc;\n\t\tfor(var i=1; i<n8; i++) {\n\t\t\tc -= dc;\n\t\t\tdc += t*c;\n\t\t\ts += ds;\n\t\t\tds -= t*s;\n\t\t\t_cstb[i] = s;\n\t\t\t_cstb[n4 - i] = c;\n\t\t}\n\t\tif(n8 !== 0) {\n\t\t\t_cstb[n8] = Math.sqrt(0.5);\n\t\t}\n\t\tfor(var j=0; j<n4; j++) {\n\t\t\t_cstb[n2 - j]  = _cstb[j];\n\t\t}\n\t\tfor(var k=0; k<n2p4; k++) {\n\t\t\t_cstb[k + n2] = -_cstb[k];\n\t\t}\n\t}\n}\n\nvar svmFilter = function() {\n\n\tvar _fft, fft_filters, responses, biases;\n\tvar fft_size, filterLength, filter_width, search_width, num_patches;\n\tvar temp_imag_part, temp_real_part;\n\n\t// fft function\n\tthis.fft_inplace = function(array, _im_part) {\n\t\t// in-place\n\n\t\tif (typeof _im_part == 'undefined') {\n\t\t\t_im_part = temp_imag_part;\n\t\t}\n\n\t\tfor (var i = 0;i < filterLength;i++) {\n\t\t\t_im_part[i] = 0.0;\n\t\t}\n\n\t\t_fft.real_fft2d(array,_im_part);\n\n\t\treturn [array, _im_part];\n\t};\n\n\tthis.ifft = function(rn, cn) {\n\t\t// in-place\n\t\t_fft.real_ifft2d(rn, cn);\n\t\treturn rn;\n\t};\n\n\tvar complex_mult_inplace = function(cn1, cn2) {\n\t\t// in-place, cn1 is the one modified\n\t\tvar temp1, temp2;\n\t\tfor (var r = 0;r < filterLength;r++) {\n\t\t\ttemp1 = (cn1[0][r]*cn2[0][r]) - (cn1[1][r]*cn2[1][r]);\n\t\t\ttemp2 = (cn1[0][r]*cn2[1][r]) + (cn1[1][r]*cn2[0][r]);\n\t\t\tcn1[0][r] = temp1;\n\t\t\tcn1[1][r] = temp2;\n\t\t}\n\t};\n\n\tthis.init = function(filter_input, bias_input, numPatches, filterWidth, searchWidth) {\n\t\t// calculate needed size of fft (has to be power of two)\n\t\tfft_size = upperPowerOfTwo(filterWidth-1+searchWidth);\n\t\tfilterLength = fft_size*fft_size;\n\t\t_fft = new FFT$1();\n\t\t_fft.init(fft_size);\n\t\tfft_filters = Array(numPatches);\n\t\tvar fft_filter;\n\t\tvar edge = (filterWidth-1)/2;\n\n\t\tfor (var i = 0;i < numPatches;i++) {\n\t\t\tvar flar_fi0 = new Float64Array(filterLength);\n\t\t\tvar flar_fi1 = new Float64Array(filterLength);\n\n\t\t\t// load filter\n\t\t\tvar xOffset, yOffset;\n\t\t\tfor (var j = 0;j < filterWidth;j++) {\n\t\t\t\tfor (var k = 0;k < filterWidth;k++) {\n\t\t\t\t\t// TODO : rotate filter\n\n\t\t\t\t\txOffset = k < edge ? (fft_size-edge) : (-edge);\n\t\t\t\t\tyOffset = j < edge ? (fft_size-edge) : (-edge);\n\t\t\t\t\tflar_fi0[k+xOffset+((j+yOffset)*fft_size)] = filter_input[i][(filterWidth-1-j)+((filterWidth-1-k)*filterWidth)];\n\n\t\t\t\t\t/*xOffset = k < edge ? (fft_size-edge) : (-edge);\n\t\t\t\t\tyOffset = j < edge ? (fft_size-edge) : (-edge);\n\t\t\t\t\tflar_fi0[k+xOffset+((j+yOffset)*fft_size)] = filter_input[i][k+(j*filterWidth)];*/\n\n\t\t\t\t\t//console.log(k + ','+ j+':' + (k+xOffset+((j+yOffset)*fft_size)))\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// fft it and store\n\t\t\tfft_filter = this.fft_inplace(flar_fi0, flar_fi1);\n\t\t\tfft_filters[i] = fft_filter;\n\n\t\t}\n\n\t\t// set up biases\n\t\tbiases = new Float64Array(numPatches);\n\t\tfor (var i = 0;i < numPatches;i++) {\n\t\t\tbiases[i] = bias_input[i];\n\t\t}\n\n\t\tresponses = Array(numPatches);\n\t\ttemp_imag_part = Array(numPatches);\n\t\tfor (var i = 0;i < numPatches;i++) {\n\t\t\tresponses[i] = new Float64Array(searchWidth*searchWidth);\n\t\t\ttemp_imag_part[i] = new Float64Array(searchWidth*searchWidth);\n\t\t}\n\t\ttemp_real_part = new Float64Array(filterLength);\n\n\t\tnum_patches = numPatches;\n\t\tfilter_width = filterWidth;\n\t\tsearch_width = searchWidth;\n\t};\n\n\tthis.getResponses = function(patches) {\n\t\tvar response, edge;\n\t\tvar patch_width = filter_width-1+search_width;\n\t\tfor (var i = 0;i < num_patches;i++) {\n\t\t\t// reset zeroes in temp_real_part\n\t\t\tfor (var j = 0;j < fft_size*fft_size;j++) {\n\t\t\t\ttemp_real_part[j] = 0.0;\n\t\t\t}\n\n\t\t\t// normalize patches to 0-1\n\t\t\tpatches[i] = normalizePatches(patches[i]);\n\n\t\t\t// patch must be padded (with zeroes) to match fft size\n\t\t\tfor (var j = 0;j < patch_width;j++) {\n\t\t\t\tfor (var k = 0;k < patch_width;k++) {\n\t\t\t\t\ttemp_real_part[j + (fft_size*k)] = patches[i][k + (patch_width*j)];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//drawData(document.getElementById('sketch').getContext('2d'), temp_real_part, 32, 32, false, 0, 0);\n\n\t\t\t// fft it\n\t\t\tresponse = this.fft_inplace(temp_real_part);\n\n\t\t\t// multiply pointwise with filter\n\t\t\tcomplex_mult_inplace(response, fft_filters[i]);\n\n\t\t\t// inverse fft it\n\t\t\tresponse = this.ifft(response[0], response[1]);\n\n\t\t\t// crop out edges\n\t\t\tedge = (filter_width-1)/2;\n\t\t\tfor (var j = 0;j < search_width;j++) {\n\t\t\t\tfor (var k = 0;k < search_width;k++) {\n\t\t\t\t\tresponses[i][j + (k*search_width)] = response[edge + k + ((j+edge)*(fft_size))];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// add bias\n\t\t\tfor (var j = 0;j < search_width*search_width;j++) {\n\t\t\t\tresponses[i][j] += biases[i];\n\t\t\t}\n\n\t\t\t// logistic transformation\n\t\t\tresponses[i] = logisticResponse(responses[i]);\n\n\t\t\t/*responses[i] = new Float64Array(32*32)\n\t\t\tfor (var j = 0;j < 32;j++) {\n\t\t\t\tfor (var k = 0;k < 32;k++) {\n\t\t\t\t\tresponses[i][k + (j*(32))] = response[k + (j*(32))]\n\t\t\t\t}\n\t\t\t}*/\n\n\t\t\t// normalization?\n\t\t\tinplaceNormalizeFilterMatrix(responses[i]);\n\t\t}\n\n\t\treturn responses;\n\t};\n\n\tvar normalizePatches = function(patch) {\n\t\tvar patch_width = filter_width-1+search_width;\n\t\tvar max = 0;\n\t\tvar min = 1000;\n\t\tvar value;\n\t\tfor (var j = 0;j < patch_width;j++) {\n\t\t\tfor (var k = 0;k < patch_width;k++) {\n\t\t\t\tvalue = patch[k + (patch_width*j)];\n\t\t\t\tif (value < min) {\n\t\t\t\t\tmin = value;\n\t\t\t\t}\n\t\t\t\tif (value > max) {\n\t\t\t\t\tmax = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tvar scale = max-min;\n\t\tfor (var j = 0;j < patch_width;j++) {\n\t\t\tfor (var k = 0;k < patch_width;k++) {\n\t\t\t\tpatch[k + (patch_width*j)] = (patch[k + (patch_width*j)]-min)/scale;\n\t\t\t}\n\t\t}\n\t\treturn patch;\n\t};\n\n\tvar logisticResponse = function(response) {\n\t\t// create probability by doing logistic transformation\n\t\tfor (var j = 0;j < search_width;j++) {\n\t\t\tfor (var k = 0;k < search_width;k++) {\n\t\t\t\tresponse[j + (k*search_width)] = 1.0/(1.0 + Math.exp(- (response[j + (k*search_width)] - 1.0 )));\n\t\t\t}\n\t\t}\n\t\treturn response;\n\t};\n\n\tvar upperPowerOfTwo = function(x) {\n\t\tx--;\n\t\tx |= x >> 1;\n\t\tx |= x >> 2;\n\t\tx |= x >> 4;\n\t\tx |= x >> 8;\n\t\tx |= x >> 16;\n\t\tx++;\n\t\treturn x;\n\t};\n\n\tvar inplaceNormalizeFilterMatrix = function(response) {\n\t\t// normalize responses to lie within [0,1]\n\t\tvar msize = response.length;\n\t\tvar max = 0;\n\t\tvar min = 1;\n\n\t\tfor (var i = 0;i < msize;i++) {\n\t\t\tmax = response[i] > max ? response[i] : max;\n\t\t\tmin = response[i] < min ? response[i] : min;\n\t\t}\n\t\tvar dist = max-min;\n\n\t\tif (dist == 0) {\n\t\t\t//console.log('a patchresponse was monotone, causing normalization to fail. Leaving it unchanged.');\n\t\t} else {\n\t\t\tfor (var i = 0;i < msize;i++) {\n\t\t\t\tresponse[i] = (response[i]-min)/dist;\n\t\t\t}\n\t\t}\n\t};\n};\n\nvar webglUtils = createCommonjsModule(function (module, exports) {\n// This code is based on webgl-utils.js authored by Gregg Tavares, license below:\n/*\n * Copyright (c) 2011, Gregg Tavares\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * * Redistributions of source code must retain the above copyright notice,\n *   this list of conditions and the following disclaimer.\n *\n * * Redistributions in binary form must reproduce the above copyright notice,\n *   this list of conditions and the following disclaimer in the documentation\n *   and/or other materials provided with the distribution.\n *\n *  * Neither the name of greggman.com nor the names of its contributors\n *   may be used to endorse or promote products derived from this software\n *   without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\n * IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n(function(){\n\nvar LOGGING_ENABLED = true;\n\n/**\n * Wrapped logging function.\n * @param {string} msg The message to log.\n */\nconst log = function (msg) {\n  if (!LOGGING_ENABLED) { return; }\n  if (window.console && window.console.log) {\n    window.console.log(msg);\n  }\n};\n\n/**\n * Wrapped logging function.\n * @param {string} msg The message to log.\n */\nconst error = function (msg) {\n  if (!LOGGING_ENABLED) { return; }\n  if (window.console) {\n    if (window.console.error) {\n      window.console.error(msg);\n    } else if (window.console.log) {\n      window.console.log(msg);\n    }\n  }\n  throw msg;\n};\n\n/**\n * Turn off all logging.\n */\nconst loggingOff = function () {\n  LOGGING_ENABLED = false;\n};\n\n/**\n * Check if the page is embedded.\n * @return {boolean} True of we are in an iframe\n */\nconst isInIFrame = function () {\n  return window !== window.top;\n};\n\n/**\n * Converts a WebGL enum to a string\n * @param {!WebGLContext} gl The WebGLContext to use.\n * @param {number} value The enum value.\n * @return {string} The enum as a string.\n */\nconst glEnumToString = function (gl, value) {\n  for (var p in gl) {\n    if (gl[p] === value) {\n      return p;\n    }\n  }\n  return '0x' + value.toString(16);\n};\n\n\n/**\n * Creates the HTLM for a failure message\n * @param {string} canvasContainerId id of container of th\n *        canvas.\n * @return {string} The html.\n */\nconst makeFailHTML = function (msg) {\n  return '' +\n    '<table style=\"background-color: #8CE; width: 100%; height: 100%;\"><tr>' +\n    '<td align=\"center\">' +\n    '<div style=\"display: table-cell; vertical-align: middle;\">' +\n    '<div style=\"\">' + msg + '</div>' +\n    '</div>' +\n    '</td></tr></table>';\n};\n\n\n/**\n * Mesasge for getting a webgl browser\n * @type {string}\n */\n// const GET_A_WEBGL_BROWSER = '' +\n//   'This page requires a browser that supports WebGL.<br/>' +\n//   '<a href=\"http://get.webgl.org\">Click here to upgrade your browser.</a>';\n\n\n/**\n * Mesasge for need better hardware\n * @type {string}\n */\n// const OTHER_PROBLEM = '' +\n//   \"It doesn't appear your computer can support WebGL.<br/>\" +\n//   '<a href=\"http://get.webgl.org/troubleshooting/\">Click here for more information.</a>';\n\n\n/**\n * Creates a webgl context. If creation fails it will\n * change the contents of the container of the <canvas>\n * tag to an error message with the correct links for WebGL.\n * @param {Element} canvas. The canvas element to create a\n *     context from.\n * @param {WebGLContextCreationAttirbutes} optAttribs Any\n *     creation attributes you want to pass in.\n * @return {WebGLRenderingContext} The created context.\n */\nconst setupWebGL = function (canvas, optAttribs) {\n  // const showLink = function (str) {\n  //   var container = canvas.parentNode;\n  //   if (container) {\n  //     container.innerHTML = makeFailHTML(str);\n  //   }\n  // };\n\n  if (!window.WebGLRenderingContext) {\n    // showLink(GET_A_WEBGL_BROWSER);\n    return null;\n  }\n\n  var context = create3DContext(canvas, optAttribs);\n  if (!context) {\n    // showLink(OTHER_PROBLEM);\n    return null;\n  }\n  return context;\n};\n\n\n/**\n * Creates a webgl context.\n * @param {!Canvas} canvas The canvas tag to get context\n *     from. If one is not passed in one will be created.\n * @return {!WebGLContext} The created context.\n */\nconst create3DContext = function (canvas, optAttribs) {\n  var names = ['webgl', 'experimental-webgl'];\n  var context = null;\n  for (var ii = 0; ii < names.length; ++ii) {\n    try {\n      context = canvas.getContext(names[ii], optAttribs);\n    } catch (e) {}\n    if (context) {\n      break;\n    }\n  }\n  return context;\n};\n\nconst updateCSSIfInIFrame = function () {\n  if (isInIFrame()) {\n    document.body.className = 'iframe';\n  }\n};\n\n/**\n * Gets a WebGL context.\n * makes its backing store the size it is displayed.\n */\nconst getWebGLContext = function (canvas) {\n  if (isInIFrame()) {\n    updateCSSIfInIFrame();\n\n    // make the canvas backing store the size it's displayed.\n    canvas.width = canvas.clientWidth;\n    canvas.height = canvas.clientHeight;\n  }\n\n  var gl = setupWebGL(canvas);\n  return gl;\n};\n\n\n/**\n * Loads a shader.\n * @param {!WebGLContext} gl The WebGLContext to use.\n * @param {string} shaderSource The shader source.\n * @param {number} shaderType The type of shader.\n * @param {function(string): void) optErrorCallback callback for errors.\n * @return {!WebGLShader} The created shader.\n */\nconst loadShader = function (gl, shaderSource, shaderType, optErrorCallback) {\n  var errFn = optErrorCallback || error;\n  // Create the shader object\n  var shader = gl.createShader(shaderType);\n\n  // Load the shader source\n  gl.shaderSource(shader, shaderSource);\n\n  // Compile the shader\n  gl.compileShader(shader);\n\n  // Check the compile status\n  var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n  if (!compiled) {\n    // Something went wrong during compilation; get the error\n    var lastError = gl.getShaderInfoLog(shader);\n    errFn(\"*** Error compiling shader '\" + shader + \"':\" + lastError);\n    gl.deleteShader(shader);\n    return null;\n  }\n\n  return shader;\n};\n\n\n/**\n * Creates a program, attaches shaders, binds attrib locations, links the\n * program and calls useProgram.\n * @param {!Array.<!WebGLShader>} shaders The shaders to attach\n * @param {!Array.<string>} optAttribs The attribs names.\n * @param {!Array.<number>} optLocations The locations for the attribs.\n */\nconst loadProgram = function (gl, shaders, optAttribs, optLocations) {\n  var program = gl.createProgram();\n  for (var i = 0; i < shaders.length; ++i) {\n    gl.attachShader(program, shaders[i]);\n  }\n  if (optAttribs) {\n    for (var i = 0; i < optAttribs.length; ++i) {\n      gl.bindAttribLocation(\n          program,\n          optLocations ? optLocations[i] : i,\n          optAttribs[i]);\n    }\n  }\n  gl.linkProgram(program);\n\n  // Check the link status\n  const linked = gl.getProgramParameter(program, gl.LINK_STATUS);\n  if (!linked) {\n    // something went wrong with the link\n    const lastError = gl.getProgramInfoLog(program);\n    error('Error in program linking:' + lastError);\n\n    gl.deleteProgram(program);\n    return null;\n  }\n  return program;\n};\n\n\n/**\n * Loads a shader from a script tag.\n * @param {!WebGLContext} gl The WebGLContext to use.\n * @param {string} scriptId The id of the script tag.\n * @param {number} optShaderType The type of shader. If not passed in it will\n *     be derived from the type of the script tag.\n * @param {function(string): void) optErrorCallback callback for errors.\n * @return {!WebGLShader} The created shader.\n */\nconst createShaderFromScript = function (\n  gl, scriptId, optShaderType, optErrorCallback\n) {\n  var shaderSource = '';\n  var shaderType;\n  var shaderScript = document.getElementById(scriptId);\n  if (!shaderScript) {\n    throw new Error('*** Error: unknown script element' + scriptId);\n  }\n  shaderSource = shaderScript.text;\n\n  if (!optShaderType) {\n    if (shaderScript.type === 'x-shader/x-vertex') {\n      shaderType = gl.VERTEX_SHADER;\n    } else if (shaderScript.type === 'x-shader/x-fragment') {\n      shaderType = gl.FRAGMENT_SHADER;\n    } else if (\n      shaderType !== gl.VERTEX_SHADER &&\n      shaderType !== gl.FRAGMENT_SHADER\n    ) {\n      throw new Error('*** Error: unknown shader type');\n    }\n  }\n\n  return loadShader(\n    gl,\n    shaderSource,\n    optShaderType || shaderType,\n    optErrorCallback\n  );\n};\n\n{\n  module.exports = {\n    setupWebGL : setupWebGL,\n    createProgram : loadProgram,\n    createShaderFromScript : createShaderFromScript,\n    getWebGLContext : getWebGLContext,\n    loadShader : loadShader\n  };\n}\n\n}());\n});\n\nvar webglUtils_1 = webglUtils.setupWebGL;\nvar webglUtils_2 = webglUtils.createProgram;\nvar webglUtils_5 = webglUtils.loadShader;\n\nvar webglFilter = function() {\n\n\t/*\n\t * Textures:\n\t * 0 : raw filter\n\t * 1 : patches\n\t * 2 : finished response\n\t * 3 : grad/lbp treated patches\n\t * 4 : sobel filter\n\t * 5 : lbp filter\n\t *\n\t * Routing:\n\t *         (              )  0/4/5 --\\\n\t *         (              )          _\\|\n\t * 1 ----> ( ---------->3 ) ----------> 2\n\t *         lbpResponse/      patchResponse\n\t *         gradientResponse\n\t */\n\n\tvar gl, canvas;\n\tvar filterWidth, filterHeight, patchWidth, patchHeight, numPatches, canvasWidth, canvasHeight;\n\tvar patchResponseProgram, patchDrawProgram;\n\tvar fbo, numBlocks, patchTex;\n\tvar drawRectBuffer, drawLayerBuffer, drawImageBuffer, rttTexture;\n\tvar texCoordBuffer, texCoordLocation, apositionBuffer;\n\tvar newCanvasWidth, newCanvasBlockHeight, newCanvasHeight;\n\tvar drawOutRectangles, drawOutImages, drawOutLayer;\n\tvar patchCells, textureWidth, textureHeight, patchSize, patchArray;\n\tvar biases;\n\n\tvar lbpResponseProgram;\n\tvar lbpTexCoordLocation, lbpTexCoordBuffer, lbpPositionLocation, lbpAPositionBuffer;\n\n\tvar gradientResponseProgram;\n\tvar gbo, gradTexCoordLocation, gradTexCoordBuffer, gradPositionLocation, gradAPositionBuffer;\n\n\tvar lbpInit = false;\n\tvar sobelInit = false;\n\tvar rawInit = false;\n\n\tvar lbpResponseVS = [\n\t\t'attribute vec2 a_texCoord;',\n\t\t'attribute vec2 a_position;',\n\t\t'',\n\t\t'varying vec2 v_texCoord;',\n\t\t'',\n\t\t'void main() {',\n\t\t'   // transform coordinates to regular coordinates',\n\t\t'   gl_Position = vec4(a_position,0.0,1.0);',\n\t\t' ',\n\t\t'   // pass the texCoord to the fragment shader',\n\t\t'   v_texCoord = a_texCoord;',\n\t\t'}'\n\t].join('\\n');\n\tvar lbpResponseFS;\n\n\tvar gradientResponseVS = [\n\t\t'attribute vec2 a_texCoord;',\n\t\t'attribute vec2 a_position;',\n\t\t'',\n\t\t'varying vec2 v_texCoord;',\n\t\t'',\n\t\t'void main() {',\n\t\t'   // transform coordinates to regular coordinates',\n\t\t'   gl_Position = vec4(a_position,0.0,1.0);',\n\t\t' ',\n\t\t'   // pass the texCoord to the fragment shader',\n\t\t'   v_texCoord = a_texCoord;',\n\t\t'}'\n\t].join('\\n');\n\tvar gradientResponseFS;\n\n\tvar patchResponseVS;\n\tvar patchResponseFS;\n\n\tvar drawResponsesVS = [\n\t\t'attribute vec2 a_texCoord_draw;',\n\t\t'attribute vec2 a_position_draw;',\n\t\t'attribute float a_patchChoice_draw;',\n\t\t'',\n\t\t'uniform vec2 u_resolutiondraw;',\n\t\t'',\n\t\t'varying vec2 v_texCoord;',\n\t\t'varying float v_select;',\n\t\t'',\n\t\t'void main() {',\n\t\t'   // convert the rectangle from pixels to 0.0 to 1.0',\n\t\t'   vec2 zeroToOne = a_position_draw / u_resolutiondraw;',\n\t\t'',\n\t\t'   // convert from 0->1 to 0->2',\n\t\t'   vec2 zeroToTwo = zeroToOne * 2.0;',\n\t\t'',\n\t\t'   // convert from 0->2 to -1->+1 (clipspace)',\n\t\t'   vec2 clipSpace = zeroToTwo - 1.0;',\n\t\t'   ',\n\t\t'   // transform coordinates to regular coordinates',\n\t\t'   gl_Position = vec4(clipSpace * vec2(1.0, 1.0), 0, 1);',\n\t\t'',\n\t\t'   // pass the texCoord to the fragment shader',\n\t\t'   v_texCoord = a_texCoord_draw;',\n\t\t'   ',\n\t\t'   v_select = a_patchChoice_draw;',\n\t\t'}'\n\t].join('\\n');\n\n\tvar drawResponsesFS = [\n\t\t'precision mediump float;',\n\t\t'',\n\t\t'// our responses',\n\t\t'uniform sampler2D u_responses;',\n\t\t'',\n\t\t'// the texCoords passed in from the vertex shader.',\n\t\t'varying vec2 v_texCoord;',\n\t\t'varying float v_select;',\n\t\t'',\n\t\t'const vec4 bit_shift = vec4(256.0*256.0*256.0, 256.0*256.0, 256.0, 1.0);',\n\t\t'const vec4 bit_mask  = vec4(0.0, 1.0/256.0, 1.0/256.0, 1.0/256.0);',\n\t\t'',\n\t\t'// packing code from here http://stackoverflow.com/questions/9882716/packing-float-into-vec4-how-does-this-code-work',\n\t\t'void main() {',\n\t\t'  vec4 colorSum = texture2D(u_responses, v_texCoord);',\n\t\t'  float value = 0.0;',\n\t\t'  if (v_select < 0.1) {',\n\t\t'    value = colorSum[0];',\n\t\t'  } else if (v_select > 0.9 && v_select < 1.1) {',\n\t\t'    value = colorSum[1];',\n\t\t'  } else if (v_select > 1.9 && v_select < 2.1) {',\n\t\t'    value = colorSum[2];',\n\t\t'  } else if (v_select > 2.9 && v_select < 3.1) {',\n\t\t'    value = colorSum[3];',\n\t\t'  } else {',\n\t\t'    value = 1.0;',\n\t\t'  }',\n\t\t'  ',\n\t\t'  vec4 res = fract(value * bit_shift);',\n\t\t'  res -= res.xxyz * bit_mask;',\n\t\t'  ',\n\t\t'  //gl_FragColor = vec4(value, value, value, value);',\n\t\t'  //gl_FragColor = vec4(1.0, value, 1.0, 1.0);',\n\t\t'  gl_FragColor = res;',\n\t\t'}'\n\t].join('\\n');\n\n\tthis.init = function(filters, bias, nP, pW, pH, fW, fH) {\n\t\t// we assume filterVector goes from left to right, rowwise, i.e. row-major order\n\n\t\tif (fW != fH) {\n\t\t\talert('filter width and height must be same size!');\n\t\t\treturn;\n\t\t}\n\n\t\t// if filter width is not odd, alert\n\t\tif (fW % 2 == 0 || fH % 2 == 0) {\n\t\t\talert('filters used in svm must be of odd dimensions!');\n\t\t\treturn;\n\t\t}\n\n\t\t// setup variables\n\t\tbiases = bias;\n\t\tfilterWidth = fW;\n\t\tfilterHeight = fH;\n\t\tpatchWidth = pW;\n\t\tpatchHeight = pH;\n\t\tnumPatches = nP;\n\t\tnumBlocks = Math.floor(numPatches / 4) + Math.ceil((numPatches % 4)/4);\n\t\tcanvasWidth = patchWidth;\n\t\tcanvasHeight = patchHeight*numBlocks;\n\t\tnewCanvasWidth = patchWidth-filterWidth+1;\n\t\tnewCanvasBlockHeight = patchHeight-filterWidth+1;\n\t\tnewCanvasHeight = newCanvasBlockHeight*numPatches;\n\t\tpatchCells = (Math.floor(numPatches / 4) + Math.ceil((numPatches % 4)/4));\n\t\ttextureWidth = patchWidth;\n\t\ttextureHeight = patchHeight*patchCells;\n\t\tpatchSize = patchWidth*patchHeight;\n\t\tpatchArray = new Float32Array(patchSize*patchCells*4);\n\t\tvar opp = [1/patchWidth, 1/(patchHeight*numBlocks)];\n\n\t\t// write out shaders\n\t\tpatchResponseFS = [\n\t\t\t'precision mediump float;',\n\t\t\t'',\n\t\t\t'const vec2 u_onePixelPatches = vec2('+(1/patchWidth).toFixed(10)+','+(1/(patchHeight*numBlocks)).toFixed(10)+');',\n\t\t\t'const vec2 u_onePixelFilters = vec2('+(1/filterWidth).toFixed(10)+','+(1/(filterHeight*numBlocks)).toFixed(10)+');',\n\t\t\t'const float u_halffilterwidth = '+((filterWidth-1.0)/2).toFixed(1)+';',\n\t\t\t'const float u_halffilterheight = '+((filterHeight-1.0)/2).toFixed(1)+';',\n\t\t\t'',\n\t\t\t'// our patches',\n\t\t\t'uniform sampler2D u_patches;',\n\t\t\t'// our filters',\n\t\t\t'uniform sampler2D u_filters;',\n\t\t\t'',\n\t\t\t'// the texCoords passed in from the vertex shader.',\n\t\t\t'varying vec2 v_texCoord;',\n\t\t\t'varying vec2 v_texCoordFilters; // this should give us correct filter',\n\t\t\t'',\n\t\t\t'void main() {',\n\t\t\t'  vec4 colorSum = vec4(0.0, 0.0, 0.0, 0.0);',\n\t\t\t'  vec4 maxn = vec4(0.0, 0.0, 0.0, 0.0);',\n\t\t\t'  vec4 minn = vec4(256.0, 256.0, 256.0, 256.0);',\n\t\t\t'  vec4 scale = vec4(0.0, 0.0, 0.0, 0.0);',\n\t\t\t'  vec4 patchValue = vec4(0.0, 0.0, 0.0, 0.0);',\n\t\t\t'  vec4 filterValue = vec4(0.0, 0.0, 0.0, 0.0);',\n\t\t\t'  vec4 filterTemp = vec4(0.0, 0.0, 0.0, 0.0);',\n\t\t\t'  for (int w = 0;w < '+filterWidth+';w++) {',\n\t\t\t'    for (int h = 0;h < '+filterHeight+';h++) {',\n\t\t\t'      patchValue = texture2D(u_patches, v_texCoord + u_onePixelPatches * vec2(float(w)-u_halffilterwidth, float(h)-u_halffilterheight));',\n\t\t\t'      filterValue = texture2D(u_filters, v_texCoordFilters + u_onePixelFilters * vec2(float(w)-u_halffilterwidth, float(h)-u_halffilterheight));',\n\t\t\t'      maxn = max(patchValue, maxn);',\n\t\t\t'      minn = min(patchValue, minn);',\n\t\t\t'      colorSum += patchValue*filterValue;',\n\t\t\t'      filterTemp += filterValue;',\n\t\t\t'    } ',\n\t\t\t'  }',\n\t\t\t'  scale = maxn-minn;',\n\t\t\t'  colorSum = (colorSum-(minn*filterTemp))/scale;',\n\t\t\t'  // logistic transformation',\n\t\t\t'  colorSum = 1.0/(1.0 + exp(- (colorSum) ));',\n\t\t\t'  gl_FragColor = colorSum;',\n\t\t\t'}'\n\t\t].join('\\n');\n\n\t\tpatchResponseVS = [\n\t\t\t'attribute vec2 a_texCoord;',\n\t\t\t'attribute vec2 a_position;',\n\t\t\t'',\n\t\t\t'const vec2 u_resolution = vec2('+canvasWidth.toFixed(1)+','+canvasHeight.toFixed(1)+');',\n\t\t\t'const float u_patchHeight = '+(1/numBlocks).toFixed(10)+';',\n\t\t\t'const float u_filterHeight = '+(1/numBlocks).toFixed(10)+';',\n\t\t\t'const vec2 u_midpoint = vec2(0.5 ,'+(1/(numBlocks*2)).toFixed(10)+');',\n\t\t\t'',\n\t\t\t'varying vec2 v_texCoord;',\n\t\t\t'varying vec2 v_texCoordFilters;',\n\t\t\t'',\n\t\t\t'void main() {',\n\t\t\t'   // convert the rectangle from pixels to 0.0 to 1.0',\n\t\t\t'   vec2 zeroToOne = a_position / u_resolution;',\n\t\t\t'',\n\t\t\t'   // convert from 0->1 to 0->2',\n\t\t\t'   vec2 zeroToTwo = zeroToOne * 2.0;',\n\t\t\t'',\n\t\t\t'   // convert from 0->2 to -1->+1 (clipspace)',\n\t\t\t'   vec2 clipSpace = zeroToTwo - 1.0;',\n\t\t\t'   ',\n\t\t\t'   // transform coordinates to regular coordinates',\n\t\t\t'   gl_Position = vec4(clipSpace * vec2(1.0, 1.0), 0, 1);',\n\t\t\t' ',\n\t\t\t'   // pass the texCoord to the fragment shader',\n\t\t\t'   v_texCoord = a_texCoord;',\n\t\t\t'   ',\n\t\t\t'   // set the filtertexture coordinate based on number filter to use',\n\t\t\t'   v_texCoordFilters = u_midpoint + vec2(0.0, u_filterHeight * floor(a_texCoord[1]/u_patchHeight));',\n\t\t\t'}'\n\t\t].join('\\n');\n\n\t\tif ('lbp' in filters) {\n\t\t\t// lbpResponseFragment\n\t\t\tlbpResponseFS = [\n\t\t\t\t'precision mediump float;',\n\t\t\t\t'',\n\t\t\t\t'uniform vec2 u_onePixelPatches;',\n\t\t\t\t'',\n\t\t\t\t'// our patches',\n\t\t\t\t'uniform sampler2D u_patches;',\n\t\t\t\t'',\n\t\t\t\t'// the texCoords passed in from the vertex shader.',\n\t\t\t\t'varying vec2 v_texCoord;',\n\t\t\t\t'',\n\t\t\t\t'void main() {',\n\t\t\t\t'  vec4 topLeft = texture2D(u_patches, v_texCoord + vec2(-'+opp[0].toFixed(5)+', -'+opp[1].toFixed(5)+'));',\n\t\t\t\t'  vec4 topMid = texture2D(u_patches, v_texCoord + vec2(0.0, -'+opp[1].toFixed(5)+'));',\n\t\t\t\t'  vec4 topRight = texture2D(u_patches, v_texCoord + vec2('+opp[0].toFixed(5)+', -'+opp[1].toFixed(5)+'));',\n\t\t\t\t'  vec4 midLeft = texture2D(u_patches, v_texCoord + vec2(-'+opp[0].toFixed(5)+', 0.0));',\n\t\t\t\t'  vec4 midMid = texture2D(u_patches, v_texCoord);',\n\t\t\t\t'  vec4 midRight = texture2D(u_patches, v_texCoord + vec2('+opp[0].toFixed(5)+', 0.0));',\n\t\t\t\t'  vec4 bottomLeft = texture2D(u_patches, v_texCoord + vec2(-'+opp[0].toFixed(5)+', '+opp[1].toFixed(5)+'));',\n\t\t\t\t'  vec4 bottomMid = texture2D(u_patches, v_texCoord + vec2(0.0, '+opp[1].toFixed(5)+'));',\n\t\t\t\t'  vec4 bottomRight = texture2D(u_patches, v_texCoord + vec2('+opp[0].toFixed(5)+', '+opp[1].toFixed(5)+'));',\n\t\t\t\t'  vec4 lbp = step(midMid, midRight)*1.0 + step(midMid, topRight)*2.0 + step(midMid, topMid)*4.0;',\n\t\t\t\t'  lbp = lbp + step(midMid, topLeft)*8.0 + step(midMid, midLeft)*16.0 + step(midMid, bottomLeft)*32.0;',\n\t\t\t\t'  lbp = lbp + step(midMid, bottomMid)*64.0 + step(midMid, bottomRight)*128.0;',\n\t\t\t\t'  gl_FragColor = lbp;',\n\t\t\t\t'}'\n\t\t\t].join('\\n');\n\t\t}\n\n\t\tif ('sobel' in filters) {\n\t\t\t// gradResponseFragment\n\t\t\tgradientResponseFS = [\n\t\t\t\t'precision mediump float;',\n\t\t\t\t'',\n\t\t\t\t'uniform vec2 u_onePixelPatches;',\n\t\t\t\t'',\n\t\t\t\t'// our patches',\n\t\t\t\t'uniform sampler2D u_patches;',\n\t\t\t\t'',\n\t\t\t\t'// the texCoords passed in from the vertex shader.',\n\t\t\t\t'varying vec2 v_texCoord;',\n\t\t\t\t'',\n\t\t\t\t'void main() {',\n\t\t\t\t'  vec4 bottomLeft = texture2D(u_patches, v_texCoord + vec2(-'+opp[0].toFixed(5)+', '+opp[1].toFixed(5)+'));',\n\t\t\t\t'  vec4 bottomRight = texture2D(u_patches, v_texCoord + vec2('+opp[0].toFixed(5)+', '+opp[1].toFixed(5)+'));',\n\t\t\t\t'  vec4 topLeft = texture2D(u_patches, v_texCoord + vec2(-'+opp[0].toFixed(5)+', -'+opp[1].toFixed(5)+'));',\n\t\t\t\t'  vec4 topRight = texture2D(u_patches, v_texCoord + vec2('+opp[0].toFixed(5)+', -'+opp[1].toFixed(5)+'));',\n\t\t\t\t'  vec4 dx = (',\n\t\t\t\t'    bottomLeft +',\n\t\t\t\t'    (texture2D(u_patches, v_texCoord + vec2(-'+opp[0].toFixed(5)+', 0.0))*vec4(2.0,2.0,2.0,2.0)) +',\n\t\t\t\t'    topLeft -',\n\t\t\t\t'    bottomRight -',\n\t\t\t\t'    (texture2D(u_patches, v_texCoord + vec2('+opp[0].toFixed(5)+', 0.0))*vec4(2.0,2.0,2.0,2.0)) -',\n\t\t\t\t'    topRight)/4.0;',\n\t\t\t\t'  vec4 dy = (',\n\t\t\t\t'    bottomLeft +',\n\t\t\t\t'    (texture2D(u_patches, v_texCoord + vec2(0.0, '+opp[1].toFixed(5)+'))*vec4(2.0,2.0,2.0,2.0)) +',\n\t\t\t\t'    bottomRight -',\n\t\t\t\t'    topLeft -',\n\t\t\t\t'    (texture2D(u_patches, v_texCoord + vec2(0.0, -'+opp[1].toFixed(5)+'))*vec4(2.0,2.0,2.0,2.0)) -',\n\t\t\t\t'    topRight)/4.0;',\n\t\t\t\t'  vec4 gradient = sqrt((dx*dx) + (dy*dy));',\n\t\t\t\t'  gl_FragColor = gradient;',\n\t\t\t\t'}'\n\t\t\t].join('\\n');\n\t\t}\n\n\t\t//create webglcanvas\n\t\tcanvas = document.createElement('canvas');\n\t\tcanvas.setAttribute('width', (patchWidth-filterWidth+1)+'px');\n\t\tcanvas.setAttribute('height', ((patchHeight-filterHeight+1)*numPatches)+'px');\n\t\tcanvas.setAttribute('id', 'renderCanvas');\n\t\tcanvas.setAttribute('style', 'display:none;');\n\t\t//document.body.appendChild(canvas);\n\t\tgl = webglUtils_1(canvas, {\n\t\t\tpremultipliedAlpha: false,\n\t\t\tpreserveDrawingBuffer : true,\n\t\t\tantialias : false\n\t\t});\n\n\n\t\t// check for float textures support and fail if not\n\t\tif (!gl.getExtension('OES_texture_float')) {\n\t\t\talert('Your graphics card does not support floating point textures! :(');\n\t\t\treturn;\n\t\t}\n\n\t\t/** insert filters into textures **/\n\t\tif ('raw' in filters) {\n\t\t\tinsertFilter(filters['raw'], gl.TEXTURE0);\n\t\t\trawInit = true;\n\t\t}\n\t\tif ('sobel' in filters) {\n\t\t\tinsertFilter(filters['sobel'], gl.TEXTURE4);\n\t\t\tsobelInit = true;\n\t\t}\n\t\tif ('lbp' in filters) {\n\t\t\tinsertFilter(filters['lbp'], gl.TEXTURE5);\n\t\t\tlbpInit = true;\n\t\t}\n\n\t\t/** calculate vertices for calculating responses **/\n\n\t\t// vertex rectangles to draw out\n\t\tvar rectangles = [];\n\t\tvar halfFilter = (filterWidth-1)/2;\n\t\tvar yOffset;\n\t\tfor (var i = 0;i < numBlocks;i++) {\n\t\t\tyOffset = i*patchHeight;\n\t\t\t//first triangle\n\t\t\trectangles = rectangles.concat([\n\t\t\t\thalfFilter, yOffset+halfFilter,\n\t\t\t\tpatchWidth-halfFilter, yOffset+halfFilter,\n\t\t\t\thalfFilter, yOffset+patchHeight-halfFilter\n\t\t\t]);\n\t\t\t//second triangle\n\t\t\trectangles = rectangles.concat([\n\t\t\t\thalfFilter, yOffset+patchHeight-halfFilter,\n\t\t\t\tpatchWidth-halfFilter, yOffset+halfFilter,\n\t\t\t\tpatchWidth-halfFilter, yOffset+patchHeight-halfFilter\n\t\t\t]);\n\t\t}\n\t\trectangles = new Float32Array(rectangles);\n\n\t\t// image rectangles to draw out\n\t\tvar irectangles = [];\n\t\tfor (var i = 0;i < rectangles.length;i++) {\n\t\t\tif (i % 2 == 0) {\n\t\t\t\tirectangles[i] = rectangles[i]/canvasWidth;\n\t\t\t} else {\n\t\t\t\tirectangles[i] = rectangles[i]/canvasHeight;\n\t\t\t}\n\t\t}\n\t\tirectangles = new Float32Array(irectangles);\n\n\t\tif ('lbp' in filters || 'sobel' in filters) {\n\t\t\tvar topCoord = 1.0 - 2/(patchHeight*numBlocks);\n\t\t\tvar bottomCoord = 1.0 - 2/numBlocks + 2/(patchHeight*numBlocks);\n\t\t\tvar yOffset;\n\t\t\t// calculate position of vertex rectangles for gradient/lbp program\n\t\t\tvar gradRectangles = [];\n\t\t\tfor (var i = 0;i < numBlocks;i++) {\n\t\t\t\tyOffset = i * (2/numBlocks);\n\t\t\t\t//first triangle\n\t\t\t\tgradRectangles = gradRectangles.concat([\n\t\t\t\t\t-1.0, topCoord - yOffset,\n\t\t\t\t\t1.0, topCoord - yOffset,\n\t\t\t\t\t-1.0, bottomCoord - yOffset\n\t\t\t\t]);\n\t\t\t\t//second triangle\n\t\t\t\tgradRectangles = gradRectangles.concat([\n\t\t\t\t\t-1.0, bottomCoord - yOffset,\n\t\t\t\t\t1.0, topCoord - yOffset,\n\t\t\t\t\t1.0, bottomCoord - yOffset\n\t\t\t\t]);\n\t\t\t}\n\t\t\tgradRectangles = new Float32Array(gradRectangles);\n\n\t\t\ttopCoord = 1.0 - 1/(patchHeight*numBlocks);\n\t\t\tbottomCoord = 1.0 - 1/numBlocks + 1/(patchHeight*numBlocks);\n\t\t\t// calculate position of image rectangles to draw out\n\t\t\tvar gradIRectangles = [];\n\t\t\tfor (var i = 0;i < numBlocks;i++) {\n\t\t\t\tyOffset = i * (1/numBlocks);\n\t\t\t\t//first triangle\n\t\t\t\tgradIRectangles = gradIRectangles.concat([\n\t\t\t\t\t0.0, topCoord - yOffset,\n\t\t\t\t\t1.0, topCoord - yOffset,\n\t\t\t\t\t0.0, bottomCoord - yOffset\n\t\t\t\t]);\n\t\t\t\t//second triangle\n\t\t\t\tgradIRectangles = gradIRectangles.concat([\n\t\t\t\t\t0.0, bottomCoord - yOffset,\n\t\t\t\t\t1.0, topCoord - yOffset,\n\t\t\t\t\t1.0, bottomCoord - yOffset\n\t\t\t\t]);\n\t\t\t}\n\t\t\tgradIRectangles = new Float32Array(gradIRectangles);\n\t\t}\n\n\t\t// vertices for drawing out responses\n\n\t\t// drawOutRectangles\n\t\tdrawOutRectangles = new Float32Array(12*numPatches);\n\t\tvar yOffset, indexOffset;\n\t\tfor (var i = 0;i < numPatches;i++) {\n\t\t\tyOffset = i*newCanvasBlockHeight;\n\t\t\tindexOffset = i*12;\n\n\t\t\t//first triangle\n\t\t\tdrawOutRectangles[indexOffset] = 0.0;\n\t\t\tdrawOutRectangles[indexOffset+1] = yOffset;\n\t\t\tdrawOutRectangles[indexOffset+2] = newCanvasWidth;\n\t\t\tdrawOutRectangles[indexOffset+3] = yOffset;\n\t\t\tdrawOutRectangles[indexOffset+4] = 0.0;\n\t\t\tdrawOutRectangles[indexOffset+5] = yOffset+newCanvasBlockHeight;\n\n\t\t\t//second triangle\n\t\t\tdrawOutRectangles[indexOffset+6] = 0.0;\n\t\t\tdrawOutRectangles[indexOffset+7] = yOffset+newCanvasBlockHeight;\n\t\t\tdrawOutRectangles[indexOffset+8] = newCanvasWidth;\n\t\t\tdrawOutRectangles[indexOffset+9] = yOffset;\n\t\t\tdrawOutRectangles[indexOffset+10] = newCanvasWidth;\n\t\t\tdrawOutRectangles[indexOffset+11] = yOffset+newCanvasBlockHeight;\n\t\t}\n\n\t\t// images\n\t\tdrawOutImages = new Float32Array(numPatches*12);\n\t\tvar halfFilterWidth = ((filterWidth-1)/2)/patchWidth;\n\t\tvar halfFilterHeight = ((filterWidth-1)/2)/(patchHeight*patchCells);\n\t\tvar patchHeightT = patchHeight / (patchHeight*patchCells);\n\t\tfor (var i = 0;i < numPatches;i++) {\n\t\t\tyOffset = Math.floor(i / 4)*patchHeightT;\n\t\t\tindexOffset = i*12;\n\n\t\t\t//first triangle\n\t\t\tdrawOutImages[indexOffset] = halfFilterWidth;\n\t\t\tdrawOutImages[indexOffset+1] = yOffset+halfFilterHeight;\n\t\t\tdrawOutImages[indexOffset+2] = 1.0-halfFilterWidth;\n\t\t\tdrawOutImages[indexOffset+3] = yOffset+halfFilterHeight;\n\t\t\tdrawOutImages[indexOffset+4] = halfFilterWidth;\n\t\t\tdrawOutImages[indexOffset+5] = yOffset+patchHeightT-halfFilterHeight;\n\n\t\t\t//second triangle\n\t\t\tdrawOutImages[indexOffset+6] = halfFilterWidth;\n\t\t\tdrawOutImages[indexOffset+7] = yOffset+patchHeightT-halfFilterHeight;\n\t\t\tdrawOutImages[indexOffset+8] = 1.0-halfFilterWidth;\n\t\t\tdrawOutImages[indexOffset+9] = yOffset+halfFilterHeight;\n\t\t\tdrawOutImages[indexOffset+10] = 1.0-halfFilterWidth;\n\t\t\tdrawOutImages[indexOffset+11] = yOffset+patchHeightT-halfFilterHeight;\n\t\t}\n\n\t\t// layer\n\t\tdrawOutLayer = new Float32Array(numPatches*6);\n\t\tvar layernum;\n\t\tfor (var i = 0;i < numPatches;i++) {\n\t\t\tlayernum = i % 4;\n\t\t\tindexOffset = i*6;\n\t\t\tdrawOutLayer[indexOffset] = layernum;\n\t\t\tdrawOutLayer[indexOffset+1] = layernum;\n\t\t\tdrawOutLayer[indexOffset+2] = layernum;\n\t\t\tdrawOutLayer[indexOffset+3] = layernum;\n\t\t\tdrawOutLayer[indexOffset+4] = layernum;\n\t\t\tdrawOutLayer[indexOffset+5] = layernum;\n\t\t}\n\n\t\t/** set up programs and load attributes etc **/\n\n\t\tif ('sobel' in filters) {\n\t\t\tvar grVertexShader = webglUtils_5(gl, gradientResponseVS, gl.VERTEX_SHADER);\n\t\t\tvar grFragmentShader = webglUtils_5(gl, gradientResponseFS, gl.FRAGMENT_SHADER);\n\t\t\tgradientResponseProgram = webglUtils_2(gl, [grVertexShader, grFragmentShader]);\n\t\t\tgl.useProgram(gradientResponseProgram);\n\n\t\t\t// set up vertices with rectangles\n\t\t\tgradPositionLocation = gl.getAttribLocation(gradientResponseProgram, 'a_position');\n\t\t\tgradAPositionBuffer = gl.createBuffer();\n\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, gradAPositionBuffer);\n\t\t\tgl.bufferData(gl.ARRAY_BUFFER, gradRectangles, gl.STATIC_DRAW);\n\t\t\tgl.enableVertexAttribArray(gradPositionLocation);\n\t\t\tgl.vertexAttribPointer(gradPositionLocation, 2, gl.FLOAT, false, 0, 0);\n\n\t\t\t// set up texture positions\n\t\t\tgradTexCoordLocation = gl.getAttribLocation(gradientResponseProgram, 'a_texCoord');\n\t\t\tgradTexCoordBuffer = gl.createBuffer();\n\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, gradTexCoordBuffer);\n\t\t\tgl.bufferData(gl.ARRAY_BUFFER, gradIRectangles, gl.STATIC_DRAW);\n\t\t\tgl.enableVertexAttribArray(gradTexCoordLocation);\n\t\t\tgl.vertexAttribPointer(gradTexCoordLocation, 2, gl.FLOAT, false, 0, 0);\n\n\t\t\t// set up patches texture in gradientResponseProgram\n\t\t\tgl.uniform1i(gl.getUniformLocation(gradientResponseProgram, 'u_patches'), 1);\n\t\t}\n\t\tif ('lbp' in filters) {\n\t\t\tvar lbpVertexShader = webglUtils_5(gl, lbpResponseVS, gl.VERTEX_SHADER);\n\t\t\tvar lbpFragmentShader = webglUtils_5(gl, lbpResponseFS, gl.FRAGMENT_SHADER);\n\t\t\tlbpResponseProgram = webglUtils_2(gl, [lbpVertexShader, lbpFragmentShader]);\n\t\t\tgl.useProgram(lbpResponseProgram);\n\n\t\t\t// set up vertices with rectangles\n\t\t\tlbpPositionLocation = gl.getAttribLocation(lbpResponseProgram, 'a_position');\n\t\t\tlbpAPositionBuffer = gl.createBuffer();\n\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, lbpAPositionBuffer);\n\t\t\tgl.bufferData(gl.ARRAY_BUFFER, gradRectangles, gl.STATIC_DRAW);\n\t\t\tgl.enableVertexAttribArray(lbpPositionLocation);\n\t\t\tgl.vertexAttribPointer(lbpPositionLocation, 2, gl.FLOAT, false, 0, 0);\n\n\t\t\t// set up texture positions\n\t\t\tgradTexCoordLocation = gl.getAttribLocation(lbpResponseProgram, 'a_texCoord');\n\t\t\tlbpTexCoordBuffer = gl.createBuffer();\n\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, lbpTexCoordBuffer);\n\t\t\tgl.bufferData(gl.ARRAY_BUFFER, gradIRectangles, gl.STATIC_DRAW);\n\t\t\tgl.enableVertexAttribArray(lbpTexCoordLocation);\n\t\t\tgl.vertexAttribPointer(lbpTexCoordLocation, 2, gl.FLOAT, false, 0, 0);\n\n\t\t\t// set up patches texture in lbpResponseProgram\n\t\t\tgl.uniform1i(gl.getUniformLocation(lbpResponseProgram, 'u_patches'), 1);\n\t\t}\n\n\t\t// setup patchdraw program\n\t\tvar drVertexShader = webglUtils_5(gl, drawResponsesVS, gl.VERTEX_SHADER);\n\t\tvar drFragmentShader = webglUtils_5(gl, drawResponsesFS, gl.FRAGMENT_SHADER);\n\t\tpatchDrawProgram = webglUtils_2(gl, [drVertexShader, drFragmentShader]);\n\t\tgl.useProgram(patchDrawProgram);\n\n\t\t// set the resolution/dimension of the canvas\n\t\tvar resolutionLocation = gl.getUniformLocation(patchDrawProgram, 'u_resolutiondraw');\n\t\tgl.uniform2f(resolutionLocation, newCanvasWidth, newCanvasHeight);\n\n\t\t// set u_responses\n\t\tvar responsesLocation = gl.getUniformLocation(patchDrawProgram, 'u_responses');\n\t\tgl.uniform1i(responsesLocation, 2);\n\n\t\t// setup patchresponse program\n\t\tvar prVertexShader = webglUtils_5(gl, patchResponseVS, gl.VERTEX_SHADER);\n\t\tvar prFragmentShader = webglUtils_5(gl, patchResponseFS, gl.FRAGMENT_SHADER);\n\t\tpatchResponseProgram = webglUtils_2(gl, [prVertexShader, prFragmentShader]);\n\t\tgl.useProgram(patchResponseProgram);\n\n\t\t// set up vertices with rectangles\n\t\tvar positionLocation = gl.getAttribLocation(patchResponseProgram, 'a_position');\n\t\tapositionBuffer = gl.createBuffer();\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, apositionBuffer);\n\t\tgl.bufferData(gl.ARRAY_BUFFER, rectangles, gl.STATIC_DRAW);\n\t\tgl.enableVertexAttribArray(positionLocation);\n\t\tgl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n\t\t// set up texture positions\n\t\ttexCoordLocation = gl.getAttribLocation(patchResponseProgram, 'a_texCoord');\n\t\ttexCoordBuffer = gl.createBuffer();\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n\t\tgl.bufferData(gl.ARRAY_BUFFER, irectangles, gl.STATIC_DRAW);\n\t\tgl.enableVertexAttribArray(texCoordLocation);\n\t\tgl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);\n\n\t\tif ('lbp' in filters || 'sobel' in filters) {\n\t\t\t// set up gradient/lbp buffer (also used for lbp)\n\t\t\tgl.activeTexture(gl.TEXTURE3);\n\t\t\tvar gradients = gl.createTexture();\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, gradients);\n\t\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, patchWidth, patchHeight*numBlocks, 0, gl.RGBA, gl.FLOAT, null);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\n\t\t\t// set up gradient/lbp framebuffer\n\t\t\tgbo = gl.createFramebuffer();\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, gbo);\n\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, gradients, 0);\n\t\t}\n\n\t\t// set up buffer to draw to\n\t\tgl.activeTexture(gl.TEXTURE2);\n\t\trttTexture = gl.createTexture();\n\t\tgl.bindTexture(gl.TEXTURE_2D, rttTexture);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, patchWidth, patchHeight*numBlocks, 0, gl.RGBA, gl.FLOAT, null);\n\n\t\t// set up response framebuffer\n\t\tfbo = gl.createFramebuffer();\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, rttTexture, 0);\n\n\t\tgl.viewport(0, 0, patchWidth, patchHeight*numBlocks);\n\n\t\t/* initialize some textures and buffers used later on */\n\n\t\tpatchTex = gl.createTexture();\n\t\tdrawRectBuffer = gl.createBuffer();\n\t\tdrawImageBuffer = gl.createBuffer();\n\t\tdrawLayerBuffer = gl.createBuffer();\n\t};\n\n\tthis.getRawResponses = function(patches) {\n\t\t// TODO: check patches correct length/dimension\n\n\t\tinsertPatches(patches);\n\n\t\t// switch to correct program\n\t\tgl.useProgram(patchResponseProgram);\n\n\t\t// set u_patches to point to texture 1\n\t\tgl.uniform1i(gl.getUniformLocation(patchResponseProgram, 'u_patches'), 1);\n\n\t\t// set u_filters to point to correct filter\n\t\tgl.uniform1i(gl.getUniformLocation(patchResponseProgram, 'u_filters'), 0);\n\n\t\t// set up vertices with rectangles\n\t\tvar positionLocation = gl.getAttribLocation(patchResponseProgram, 'a_position');\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, apositionBuffer);\n\t\tgl.enableVertexAttribArray(positionLocation);\n\t\tgl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n\t\t// set up texture positions\n\t\tvar texCoordLocation = gl.getAttribLocation(patchResponseProgram, 'a_texCoord');\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n\t\tgl.enableVertexAttribArray(texCoordLocation);\n\t\tgl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);\n\n\t\t// set framebuffer to the original one if not already using it\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n\n\t\tgl.viewport(0, 0, patchWidth, patchHeight*numBlocks);\n\n\t\tgl.clearColor(0.0, 0.0, 0.0, 1.0);\n\t\tgl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER);\n\n\t\t// draw to framebuffer\n\t\tgl.drawArrays(gl.TRIANGLES, 0, patchCells*6);\n\n\t\t//gl.finish();\n\n\t\tvar responses = drawOut('raw');\n\n\t\treturn responses;\n\t};\n\n\tthis.getSobelResponses = function(patches) {\n\t\t// check that it is initialized\n\t\tif (!sobelInit) return;\n\n\t\tinsertPatches(patches);\n\n\t\t/* do sobel filter on patches */\n\n\t\t// switch to correct program\n\t\tgl.useProgram(gradientResponseProgram);\n\n\t\t// set up vertices with rectangles\n\t\tvar gradPositionLocation = gl.getAttribLocation(gradientResponseProgram, 'a_position');\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, gradAPositionBuffer);\n\t\tgl.enableVertexAttribArray(gradPositionLocation);\n\t\tgl.vertexAttribPointer(gradPositionLocation, 2, gl.FLOAT, false, 0, 0);\n\n\t\t// set up texture positions\n\t\tvar gradTexCoordLocation = gl.getAttribLocation(gradientResponseProgram, 'a_texCoord');\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, gradTexCoordBuffer);\n\t\tgl.enableVertexAttribArray(gradTexCoordLocation);\n\t\tgl.vertexAttribPointer(gradTexCoordLocation, 2, gl.FLOAT, false, 0, 0);\n\n\t\t// set framebuffer to the original one if not already using it\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, gbo);\n\n\t\tgl.viewport(0, 0, patchWidth, patchHeight*numBlocks);\n\n\t\tgl.clearColor(0.0, 0.0, 0.0, 1.0);\n\t\tgl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER);\n\n\t\t// draw to framebuffer\n\t\tgl.drawArrays(gl.TRIANGLES, 0, patchCells*6);\n\n\t\t/* calculate responses */\n\n\t\tgl.useProgram(patchResponseProgram);\n\n\t\t// set patches and filters to point to correct textures\n\t\tgl.uniform1i(gl.getUniformLocation(patchResponseProgram, 'u_filters'), 4);\n\t\tgl.uniform1i(gl.getUniformLocation(patchResponseProgram, 'u_patches'), 3);\n\n\t\tvar positionLocation = gl.getAttribLocation(patchResponseProgram, 'a_position');\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, apositionBuffer);\n\t\tgl.enableVertexAttribArray(positionLocation);\n\t\tgl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n\t\t// set up texture positions\n\t\tvar texCoordLocation = gl.getAttribLocation(patchResponseProgram, 'a_texCoord');\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n\t\tgl.enableVertexAttribArray(texCoordLocation);\n\t\tgl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);\n\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n\t\tgl.viewport(0, 0, patchWidth, patchHeight*numBlocks);\n\n\t\tgl.clearColor(0.0, 0.0, 0.0, 1.0);\n\t\tgl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER);\n\n\t\t// draw to framebuffer\n\t\tgl.drawArrays(gl.TRIANGLES, 0, patchCells*6);\n\n\t\t/* get the responses */\n\n\t\tvar responses = drawOut('sobel');\n\n\t\treturn responses;\n\t};\n\n\tthis.getLBPResponses = function(patches) {\n\t\t// check that it is initialized\n\t\tif (!lbpInit) return;\n\n\t\tinsertPatches(patches);\n\n\t\t/* do sobel filter on patches */\n\n\t\t// switch to correct program\n\t\tgl.useProgram(lbpResponseProgram);\n\n\t\t// set up vertices with rectangles\n\t\tvar lbpPositionLocation = gl.getAttribLocation(lbpResponseProgram, 'a_position');\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, lbpAPositionBuffer);\n\t\tgl.enableVertexAttribArray(lbpPositionLocation);\n\t\tgl.vertexAttribPointer(lbpPositionLocation, 2, gl.FLOAT, false, 0, 0);\n\n\t\t// set up texture positions\n\t\tvar lbpTexCoordLocation = gl.getAttribLocation(lbpResponseProgram, 'a_texCoord');\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, lbpTexCoordBuffer);\n\t\tgl.enableVertexAttribArray(lbpTexCoordLocation);\n\t\tgl.vertexAttribPointer(lbpTexCoordLocation, 2, gl.FLOAT, false, 0, 0);\n\n\t\t// set framebuffer to the original one if not already using it\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, gbo);\n\n\t\tgl.viewport(0, 0, patchWidth, patchHeight*numBlocks);\n\n\t\tgl.clearColor(0.0, 0.0, 0.0, 1.0);\n\t\tgl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER);\n\n\t\t// draw to framebuffer\n\t\tgl.drawArrays(gl.TRIANGLES, 0, patchCells*6);\n\n\t\t/* calculate responses */\n\n\t\tgl.useProgram(patchResponseProgram);\n\n\t\tgl.uniform1i(gl.getUniformLocation(patchResponseProgram, 'u_filters'), 5);\n\t\tgl.uniform1i(gl.getUniformLocation(patchResponseProgram, 'u_patches'), 3);\n\n\t\tvar positionLocation = gl.getAttribLocation(patchResponseProgram, 'a_position');\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, apositionBuffer);\n\t\tgl.enableVertexAttribArray(positionLocation);\n\t\tgl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n\t\t// set up texture positions\n\t\tvar texCoordLocation = gl.getAttribLocation(patchResponseProgram, 'a_texCoord');\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n\t\tgl.enableVertexAttribArray(texCoordLocation);\n\t\tgl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);\n\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n\t\tgl.viewport(0, 0, patchWidth, patchHeight*numBlocks);\n\n\t\tgl.clearColor(0.0, 0.0, 0.0, 1.0);\n\t\tgl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER);\n\n\t\t// draw to framebuffer\n\t\tgl.drawArrays(gl.TRIANGLES, 0, patchCells*6);\n\n\t\t/* get the responses */\n\n\t\tvar responses = drawOut('lbp');\n\n\t\treturn responses;\n\t};\n\n\tvar insertPatches = function(patches) {\n\t\t// pass patches into texture, each patch in either r, g, b or a\n\t\tvar patchArrayIndex = 0;\n\t\tvar patchesIndex1 = 0;\n\t\tvar patchesIndex2 = 0;\n\t\tfor (var i = 0;i < patchCells;i++) {\n\t\t\tfor (var j = 0;j < patchHeight;j++) {\n\t\t\t\tfor (var k = 0;k < patchWidth;k++) {\n\t\t\t\t\tpatchesIndex1 = i*4;\n\t\t\t\t\tpatchesIndex2 = (j*patchWidth) + k;\n\t\t\t\t\tpatchArrayIndex = ((patchSize*i) + patchesIndex2)*4;\n\n\t\t\t\t\t//set r with first patch\n\t\t\t\t\tif (patchesIndex1 < numPatches) {\n\t\t\t\t\t\tpatchArray[patchArrayIndex] = patches[patchesIndex1][patchesIndex2];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpatchArray[patchArrayIndex] = 0;\n\t\t\t\t\t}\n\t\t\t\t\t//set g with 2nd patch\n\t\t\t\t\tif (patchesIndex1+1 < numPatches) {\n\t\t\t\t\t\tpatchArray[patchArrayIndex + 1] = patches[patchesIndex1+1][patchesIndex2];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpatchArray[patchArrayIndex + 1] = 0;\n\t\t\t\t\t}\n\t\t\t\t\t//set b with 3rd patch\n\t\t\t\t\tif (patchesIndex1+2 < numPatches) {\n\t\t\t\t\t\tpatchArray[patchArrayIndex + 2] = patches[patchesIndex1+2][patchesIndex2];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpatchArray[patchArrayIndex + 2] = 0;\n\t\t\t\t\t}\n\t\t\t\t\t//set a with 4th patch\n\t\t\t\t\tif (patchesIndex1+3 < numPatches) {\n\t\t\t\t\t\tpatchArray[patchArrayIndex + 3] = patches[patchesIndex1+3][patchesIndex2];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpatchArray[patchArrayIndex + 3] = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// pass texture into an uniform\n\t\tgl.activeTexture(gl.TEXTURE1);\n\t\tgl.bindTexture(gl.TEXTURE_2D, patchTex);\n\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, textureWidth, textureHeight, 0, gl.RGBA, gl.FLOAT, patchArray);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\t};\n\n\tvar insertFilter = function(filter, textureNum) {\n\t\tvar filterSize = filterWidth*filterHeight;\n\t\tvar filterArray = new Float32Array(filterSize*(numBlocks)*4);\n\t\tfor (var i = 0;i < numBlocks;i++) {\n\t\t\tfor (var j = 0;j < filterHeight;j++) {\n\t\t\t\tfor (var k = 0;k < filterWidth;k++) {\n\t\t\t\t\t//set r with first filter\n\t\t\t\t\tif (i*4 < filter.length) {\n\t\t\t\t\t\tfilterArray[((filterSize*i) + (j*filterWidth) + k)*4] = filter[i*4][(j*filterWidth) + k];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfilterArray[((filterSize*i) + (j*filterWidth) + k)*4] = 0;\n\t\t\t\t\t}\n\t\t\t\t\t//set g with 2nd filter\n\t\t\t\t\tif ((i*4 + 1) < filter.length) {\n\t\t\t\t\t\tfilterArray[((filterSize*i) + (j*filterWidth) + k)*4 + 1] = filter[(i*4)+1][(j*filterWidth) + k];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfilterArray[((filterSize*i) + (j*filterWidth) + k)*4 + 1] = 0;\n\t\t\t\t\t}\n\t\t\t\t\t//set b with 3rd filter\n\t\t\t\t\tif ((i*4 + 2) < filter.length) {\n\t\t\t\t\t\tfilterArray[((filterSize*i) + (j*filterWidth) + k)*4 + 2] = filter[(i*4)+2][(j*filterWidth) + k];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfilterArray[((filterSize*i) + (j*filterWidth) + k)*4 + 2] = 0;\n\t\t\t\t\t}\n\t\t\t\t\t//set a with 4th filter\n\t\t\t\t\tif ((i*4 + 3) < filter.length) {\n\t\t\t\t\t\tfilterArray[((filterSize*i) + (j*filterWidth) + k)*4 + 3] = filter[(i*4)+3][(j*filterWidth) + k];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfilterArray[((filterSize*i) + (j*filterWidth) + k)*4 + 3] = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tgl.activeTexture(textureNum);\n\t\tvar filterTexture = gl.createTexture();\n\t\tgl.bindTexture(gl.TEXTURE_2D, filterTexture);\n\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, filterWidth, filterHeight*numBlocks, 0, gl.RGBA, gl.FLOAT, filterArray);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\t};\n\n\tvar drawOut = function(type) {\n\t\t// switch programs\n\t\tgl.useProgram(patchDrawProgram);\n\n\t\t// bind canvas buffer\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t\tgl.viewport(0, 0, newCanvasWidth, newCanvasHeight);\n\n\t\tgl.clearColor(0.0, 0.0, 0.0, 1.0);\n\t\tgl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER);\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, drawRectBuffer);\n\t\tgl.bufferData(\n\t\t\tgl.ARRAY_BUFFER,\n\t\t\tdrawOutRectangles,\n\t\t\tgl.STATIC_DRAW);\n\t\tvar positionLocation = gl.getAttribLocation(patchDrawProgram, 'a_position_draw');\n\t\tgl.enableVertexAttribArray(positionLocation);\n\t\tgl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, drawImageBuffer);\n\t\tgl.bufferData(\n\t\t\tgl.ARRAY_BUFFER,\n\t\t\tdrawOutImages,\n\t\t\tgl.STATIC_DRAW);\n\t\tvar textureLocation = gl.getAttribLocation(patchDrawProgram, 'a_texCoord_draw');\n\t\tgl.enableVertexAttribArray(textureLocation);\n\t\tgl.vertexAttribPointer(textureLocation, 2, gl.FLOAT, false, 0, 0);\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, drawLayerBuffer);\n\t\tgl.bufferData(\n\t\t\tgl.ARRAY_BUFFER,\n\t\t\tdrawOutLayer,\n\t\t\tgl.STATIC_DRAW);\n\t\tvar layerLocation = gl.getAttribLocation(patchDrawProgram, 'a_patchChoice_draw');\n\t\tgl.enableVertexAttribArray(layerLocation);\n\t\tgl.vertexAttribPointer(layerLocation, 1, gl.FLOAT, false, 0, 0);\n\n\t\t// draw out\n\t\tgl.drawArrays(gl.TRIANGLES, 0, numPatches*6);\n\n\t\tvar responses = getOutput();\n\t\tresponses = unpackToFloat(responses);\n\t\tresponses = splitArray(responses, numPatches);\n\t\tresponses = addBias(responses, biases[type]);\n\n\t\t// normalize responses to lie within [0,1]\n\t\tvar rl = responses.length;\n\t\tfor (var i = 0;i < rl;i++) {\n\t\t\tresponses[i] = normalizeFilterMatrix(responses[i]);\n\t\t}\n\n\t\treturn responses;\n\t};\n\n\tvar addBias = function(responses, bias) {\n\t\t// do a little trick to add bias in the logit function\n\t\tvar biasMult;\n\t\tfor (var i = 0;i < responses.length;i++) {\n\t\t\tbiasMult = Math.exp(bias[i]);\n\t\t\tfor (var j = 0;j < responses[i].length;j++) {\n\t\t\t\tresponses[i][j] = 1/(1+((1-responses[i][j])/(responses[i][j]*biasMult)));\n\t\t\t}\n\t\t}\n\t\treturn responses;\n\t};\n\n\tvar splitArray = function(array, parts) {\n\t\tvar sp = [];\n\t\tvar al = array.length;\n\t\tvar splitlength = al/parts;\n\t\tvar ta = [];\n\t\tfor (var i = 0;i < al;i++) {\n\t\t\tif (i % splitlength == 0) {\n\t\t\t\tif (i != 0) {\n\t\t\t\t\tsp.push(ta);\n\t\t\t\t}\n\t\t\t\tta = [];\n\t\t\t}\n\t\t\tta.push(array[i]);\n\t\t}\n\t\tsp.push(ta);\n\t\treturn sp;\n\t};\n\n\tvar getOutput = function() {\n\t\t// get data\n\t\tvar pixelValues = new Uint8Array(4*canvas.width*canvas.height);\n\t\tgl.readPixels(0, 0, canvas.width, canvas.height, gl.RGBA, gl.UNSIGNED_BYTE, pixelValues);\n\t\treturn pixelValues;\n\t};\n\n\tvar unpackToFloat = function(array) {\n\t\t// convert packed floats to proper floats : see http://stackoverflow.com/questions/9882716/packing-float-into-vec4-how-does-this-code-work\n\t\tvar newArray = [];\n\t\tvar al = array.length;\n\t\tfor (var i = 0;i < al;i+=4) {\n\t\t\tnewArray[(i / 4) >> 0] = ((array[i]/(256*256*256*256))+(array[i+1]/(256*256*256))+(array[i+2]/(256*256))+(array[i+3]/256));\n\t\t}\n\t\treturn newArray;\n\t};\n\n\tvar normalizeFilterMatrix = function(response) {\n\t\t// normalize responses to lie within [0,1]\n\t\tvar msize = response.length;\n\t\tvar max = 0;\n\t\tvar min = 1;\n\n\t\tfor (var i = 0;i < msize;i++) {\n\t\t\tmax = response[i] > max ? response[i] : max;\n\t\t\tmin = response[i] < min ? response[i] : min;\n\t\t}\n\t\tvar dist = max-min;\n\n\t\tif (dist == 0) {\n\t\t\t//console.log('a patchresponse was monotone, causing normalization to fail. Leaving it unchanged.');\n\t\t\tresponse = response.map(function() {return 1});\n\t\t} else {\n\t\t\tfor (var i = 0;i < msize;i++) {\n\t\t\t\tresponse[i] = (response[i]-min)/dist;\n\t\t\t}\n\t\t}\n\n\t\treturn response;\n\t};\n};\n\nvar mosseFilterResponses = function() {\n\n\tvar filters = [];\n\tvar responses = [];\n\tvar num_Patches = 0;\n\n\tthis.init = function(filter_input, numPatches, filterWidth, filterHeight) {\n\t\t// load filters, make fft ready\n\n\t\tfor (var i = 0;i < numPatches;i++) {\n\t\t\tvar temp = {};\n\t\t\ttemp.width = filterWidth;\n\t\t\ttemp.height = filterHeight;\n\t\t\tvar filterLength = filterWidth*filterHeight;\n\t\t\tvar flar_fi0 = new Float64Array(filterLength);\n\t\t\tvar flar_fi1 = new Float64Array(filterLength);\n\t\t\tfor (var j = 0;j < filterLength;j++) {\n\t\t\t\tflar_fi0[j] = filter_input[i][0][j];\n\t\t\t\tflar_fi1[j] = filter_input[i][1][j];\n\t\t\t}\n\t\t\ttemp.real = flar_fi0;\n\t\t\ttemp.imag = flar_fi1;\n\t\t\tfilters[i] = new mosse.mosseFilter();\n\t\t\tfilters[i].load(temp);\n\t\t}\n\n\t\tnum_Patches = numPatches;\n\t};\n\n\tthis.getResponses = function(patches) {\n\t\tfor (var i = 0;i < num_Patches;i++) {\n\t\t\tresponses[i] = filters[i].getResponse(patches[i]);\n\t\t\t//responses[i] = logisticResponse(responses[i]);\n\t\t\tresponses[i] = normalizeFilterMatrix(responses[i]);\n\t\t}\n\n\t\treturn responses;\n\t};\n\n\tvar logisticResponse = function(response) {\n\t\t// create probability by doing logistic transformation\n\t\tvar filter_size = response.length;\n\t\tfor (var j = 0;j < filter_size;j++) {\n\t\t\tresponse[j] = 1.0/(1.0 + Math.exp(- (response[j]-1.0) ));\n\t\t}\n\t\treturn response;\n\t};\n\n\tvar normalizeFilterMatrix = function(response) {\n\t\t// normalize responses to lie within [0,1]\n\t\tvar msize = response.length;\n\t\tvar max = 0;\n\t\tvar min = 1;\n\n\t\tfor (var i = 0;i < msize;i++) {\n\t\t\tmax = response[i] > max ? response[i] : max;\n\t\t\tmin = response[i] < min ? response[i] : min;\n\t\t}\n\t\tvar dist = max-min;\n\n\t\tif (dist == 0) {\n\t\t\tconsole.log('a patchresponse was monotone, causing normalization to fail. Leaving it unchanged.');\n\t\t\tresponse = response.map(function() {return 1});\n\t\t} else {\n\t\t\tfor (var i = 0;i < msize;i++) {\n\t\t\t\tresponse[i] = (response[i]-min)/dist;\n\t\t\t}\n\t\t}\n\n\t\treturn response;\n\t};\n};\n\nvar model_pca_20_svm = createCommonjsModule(function (module, exports) {\n(function (global) {\n  'use strict';\n\n  var pModel = {\n    \"scoring\": {\n      \"size\": [20, 22],\n      \"bias\": -1.3970965781063711,\n      \"coef\": [-0.019443206312618266, -0.0084626551369373984, -0.0056439963412376806, -0.0030632716896851417, 0.0050581938798613096, 0.0038671999692946632, 0.0073781421893252819, 0.008408844556368901, 0.0021079916674897471, 0.0088021517989660455, 0.0084634202851292546, 0.0091341881048755593, 0.0021677708519095705, 0.0057905826022958259, 0.010027042924308791, 0.010018015835686447, 0.011074574130386098, -0.00061695783617744283, -0.0060840083569450205, -0.0094487678808903661, -0.012441209862965338, -0.0038650406223106025, -0.00031049888008515014, 0.003187872856386012, 0.0078183021180926356, 0.010960251877128001, 0.012100913210202307, 0.012289318801648701, 0.012872315936395949, 0.0134197639066574, 0.012863004278393353, 0.012570470005854794, 0.0144288424245574, 0.013339430524005279, 0.013248442014867023, 0.012998181709015256, 0.0080561986303109411, 0.0014670228332206666, -0.011928206846124195, -0.0097909276659884133, -0.019951337591485003, -0.014601516863452837, -0.013174779761633797, -0.0060514903696567476, -0.0010407140556988824, 0.0054650997555345483, 0.010448591237341475, 0.014061216421035866, 0.015918382919452134, 0.016360925963435087, 0.02175676516818845, 0.017301016139781272, 0.014195207612699818, 0.012452400847919372, 0.010454129710215853, 0.0040883019269826832, -0.0014194361456059026, -0.0038498599142176948, -0.010769873280441659, -0.011758097810167857, -0.0046927302624985654, -0.0022134112349382041, -0.0039804434067522172, -0.012186682535867691, -0.011886732829841436, -0.008198434083715244, 0.0028353930104073055, 0.0070820189528775831, 0.012238372017639833, 0.016348014515026394, 0.020980251210150468, 0.01731275318263429, 0.01186526524722499, 0.007237133559106634, 0.0028787582373227981, -0.007467321804467685, -0.012293394385884527, -0.014833951237083715, -0.0083886394867411403, -0.001277206299448029, -0.0043237762267366413, -0.00079995554890789644, -0.0090446939377834615, -0.015715154398522533, -0.016374353020164909, -0.018048467332774626, -0.012034275948581882, -0.0072430439975880896, 0.00051252407841081971, 0.013091943912572559, 0.018570409085074381, 0.013098815816852492, 0.0008591564011330168, -0.0064555113363009954, -0.014574145037132261, -0.018221531408352937, -0.01805986873321162, -0.016665959992610131, -0.016742981997331947, -0.012862200876738698, -0.037408776782215991, -0.026830315322269691, -0.036692867895355551, -0.034788073944897399, -0.021885031967903899, -0.024484660949111742, -0.028068870569776663, -0.018631752402912666, 0.00033862502266578511, 0.01559117928255003, 0.021178968053305464, 0.015184030917486158, 0.002942909802540911, -0.014374637994945122, -0.025568052116952664, -0.025717989966112242, -0.023218559873459776, -0.043064179414035626, -0.042244667490572319, -0.040560989397592062, -0.029282249261991376, -0.037097180414959283, -0.050209371445049687, -0.043175446636272506, -0.038799263945784764, -0.037913350312177137, -0.024596940746816367, -0.013391546719824746, 0.0026176056292311106, 0.0161600431397954, 0.021950494557360537, 0.018824694902420232, 0.006927363884398058, -0.0067099747768306958, -0.018258612142465137, -0.031150030943545643, -0.030987027023796063, -0.033628054995754796, -0.043437053800875543, -0.034534827602693656, -0.0027688241949539527, -0.0045492751804971556, -0.0029637241504820444, -0.0034067004234806259, -0.0058158675916083176, -0.0050003474884839725, -0.0052189027673953392, -0.0035094302696121191, 0.0048075866050476977, 0.015230282965296896, 0.017877023790346995, 0.015060123226282708, 0.0068301148455019063, -0.00074735425779775112, -0.0047129224250249081, -0.0020172475601060438, -0.0028733715759857248, -3.2165259563759688e-05, 0.0052576318460990619, 0.0043528918718454875, 0.016945619656148794, 0.015930900625567117, 0.013751773645422991, 0.010130474427749569, 0.0080480898297084717, 0.0066539674397816983, 0.0068324700348844428, 0.0069577044114707276, 0.0040399129489101342, 0.011715241103133139, 0.017439724961211336, 0.014273924944517397, 0.0061485975492234337, 0.0064501329867605404, 0.0064154824267410098, 0.0087972617488658849, 0.0085371084737999835, 0.0087282112830335563, 0.011782866421798245, 0.016746943082334282, 0.022118218282678175, 0.020835875059091086, 0.018311801034637344, 0.01589801188949137, 0.017833422960512931, 0.01556573659143182, 0.014048773907766661, 0.0092415766206588174, 0.008151842723012729, 0.011230814598071655, 0.01256801671117759, 0.012111623945116202, 0.0098381741274288295, 0.0073611628026903006, 0.0095541157333664112, 0.011727533965135649, 0.018125902932239795, 0.019469248207063541, 0.017398513191690286, 0.021144199041044975, 0.021132145666912093, 0.019499184169656004, 0.019592876054570843, 0.02028149781228069, 0.017450605090846959, 0.01415914728419608, 0.0062290511445100638, 0.0038367364618697264, 0.0070206311493656928, 0.0096561161467108754, 0.011406409148288063, 0.0073273774756050288, 0.0046725824974188255, 0.0052535602992445293, 0.00018758422847375771, 0.0081523629612461953, 0.012760089024104778, 0.021600004613459223, 0.02330330354276354, 0.023745752734397885, 0.018230549428489853, 0.020013388637927079, 0.019842171101705101, 0.018799688221643948, 0.010638029835974899, 0.00047497591850582786, -0.0071779359181283857, -0.0013492660142831474, 0.0015382005340972228, 0.0026091901041104195, 0.00054046824549715592, -0.00049664221846118756, -0.0004620349686195485, -0.0052440228766081143, -0.0052152354482096451, -0.010002649985436339, 0.0014386382744505852, 0.012845063185194877, 0.020827676960957435, 0.02373841052172394, 0.015716685713465389, 0.01638066669873605, 0.014902611437895159, 0.0073730357797861029, 0.0019356373041797752, -0.0061999712321189927, -0.0091165414771389678, -0.008810991502401562, -0.014849548271736901, -0.002088752298238026, 0.0052140970488441726, 0.0010527273675475608, -0.010321625138183299, -0.016207678046552692, -0.012439252596672909, -0.013087206027715756, -0.0027969969285832111, 0.0023632017053047227, 0.011157492323637063, 0.018368837091378775, 0.009522424063657664, 0.010552085697652452, 0.0065611074700353111, -0.0015314856230301123, -0.0032492038209889869, -0.0031329857351426339, -0.0009277374824954263, -0.0020968871213430215, -0.002752601764726735, 0.00094388371290420677, 5.9164336949845309e-05, -0.0017254679888374039, -0.0034420772687673035, -0.0045773609585904318, -0.0025304599008137956, -0.00038215561598060812, 0.00057078584536244593, 0.0031325966195568239, 0.0060237831417333659, 0.01158476991744758, 0.0016262584963572593, 0.0032288122743198387, 0.0012532877511827127, 0.00062747794288786391, 0.0023766730707680218, 0.0028182202873619686, 0.0023771129569157626, -0.0033402786707182365, -0.0048954226369167918, 0.0030746977489523515, 0.0062648590670420657, 0.0050231159304044643, 0.00044657525636142406, -0.0048270904988737106, -0.0040237200076292511, 0.0024988183457590458, 0.0054580394659512529, 0.0072880311920233637, 0.0036009634090189563, 0.010569246292394684, -0.0045836905885612515, 0.00057936439982262571, 0.00102991877614139, 0.0030014799750564766, 0.0036675159287522449, 0.0044718005821969111, 0.0068927421100514214, 0.0039124352937196984, 0.007139428500837236, 0.010304447674314087, 0.012609007891982103, 0.008958913992549505, 0.0086037912511740151, 0.0055408494888294774, 0.0046721790312300258, 0.0047921200350865495, 0.0058818201004558757, 0.0056047225724042979, 0.0054112450019911731, 0.0073264985149536482, -0.0027341865318231302, -0.0027247005346668829, -0.0034900498414649531, -0.0079957154687285564, -0.0040761105067111218, -0.0020778048501128819, -0.0028478822594267903, -0.0039662744056797195, -0.0026161203530461301, 0.00092611267411275692, 0.0017426886986748021, 0.00055187058776232881, -0.0013723391980049371, -0.0045995868862228262, -0.004201475995629732, -0.0054721778518871953, -0.002341678055566526, -0.0025440841811939178, -0.0078777546807155367, 5.340267621167532e-05, 0.0046873465713941241, 0.0021887942815206605, 0.0013036188253628853, -0.001369820467079858, -0.015804998363084376, -0.016267691007421516, -0.018900936626522147, -0.017659450320792951, -0.011812605534381678, -0.0034436129735933847, -0.0023483321715621502, -0.0050111463464252073, -0.0050922386240516513, -0.015030789874247219, -0.020198024497642013, -0.021620507739756673, -0.018586140603325793, -0.018723839025246693, -0.0055722698499209482, 0.0064480458300502788, 0.0026822651632485931, 0.0060010017569890623, 0.0039986244661379938, 0.0050813259426419084, -0.0059114072323689293, -0.027745788024718613, -0.029251292823436387, -0.023066523347947315, -0.017210413752997977, -0.015963112589643183, -0.021075188283476324, -0.023666705491108494, -0.020005598090990763, -0.019062969033403668, -0.017792117192348619, -0.025322677372927888, -0.020971240352056199, -0.003436645553932082, 0.0043350896839554273, 0.0084557183627534376, -0.0063213373221792614, -0.0012841346959162978, -0.0012350140140767124, 0.004020967306281667, 0.0092274867614143326, 0.0045264965008091395, 0.0041315898134410677, 0.00077108445452623935, 0.0017580819918377949, -0.0011577021001876594, -0.0036195352433658614, -0.0037319908665914719, -0.001666179302724247, 0.0031110879435167255, 0.0014906582671670387, 0.0048443015054418677, 0.0059990829294203933, 0.0084750979219295353, 0.0055827168912293912, 0.0025145315352065756, -0.0046319230006191276, -0.0076182514283882324, -0.0046593775053102001, -0.0031253513278243637, 0.0074653367528114828, 0.010125926733440484, 0.0094747053616804754, 0.0035657571954442512, 0.0057833695060832482, 0.003888133034710705, 0.0019960148005530504, 0.0015056031401225207, 0.0011132050024144288, 0.0054876547928768482, 0.0047365733649033419, 0.0072106350627162141, 0.010077746417547511, 0.0038570243972044947, -0.003118757327733293, 8.694979275512165e-05, -0.021441387266543339, -0.0072102976069877674, -0.0078359058223554552, -0.00594066743311885, -0.0016100298225058601, 0.0053450064816458259, 0.0071049496578081076, 0.010196875445129471, 0.0057577873293374569, 0.0074570800047582559, 0.0062731053175082022, 0.0076242083673520502, 0.0068436930933054993, 0.0070021422399430639, 0.0087250840640590785, 0.0089995789681808595, 0.0034314447644411355, -0.001989159567628072, -0.007896602411841893, -0.010924672368545567]\n    },\n    \"path\": {\n      \"normal\": [\n        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],\n        [15, 16, 17, 18],\n        [19, 20, 21, 22],\n        [23, 63, 24, 64, 25, 65, 26, 66, 23],\n        [28, 67, 29, 68, 30, 69, 31, 70, 28],\n        [34, 35, 36, 42, 37, 43, 38, 39, 40],\n        [33, 41, 62],\n        [44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 44, 56, 57, 58, 50, 59, 60, 61, 44],\n        27, 32\n      ],\n      \"vertices\": [\n        // jawline\n        [0,1,23,0],\n        [1,23,66,1],\n        [1,2,66,1],\n        [2,66,26,2],\n        [2,26,35,2],\n        [2,35,36,2],\n        [2,36,3,2],\n        [36,44,45,36],\n        [3,4,44,3],\n        [3,44,36,3],\n        [4,44,55,4],\n        [4,5,55,4],\n        [5,55,54,5],\n        [5,6,54,5],\n        [6,53,54,6],\n        [6,7,53,6],\n        [7,8,53,7],\n        [8,52,53,8],\n        [8,9,52,8],\n        [9,51,52,9],\n        [9,10,51,9],\n        [10,50,51,10],\n        [10,11,50,10],\n        [11,38,50,11],\n        [11,12,38,11],\n        [12,38,39,12],\n        [12,31,39,12],\n        [12,31,70,12],\n        [12,13,70,12],\n        [13,28,70,13],\n        [13,14,28,13],\n        // right eyebrow\n        [14,15,28,14],\n        [15,28,67,15],\n        [15,16,67,15],\n        [16,67,29,16],\n        [16,17,29,16],\n        [17,68,29,17],\n        [17,18,68,17],\n        [18,68,30,18],\n        [18,30,33,18],\n        // below eyes\n        [30,40,69,30],\n        [39,40,69,39],\n        [39,31,69,39],\n        [26,65,35,26],\n        [34,35,65,34],\n        [25,34,65,25],\n        // left eyebrow\n        [22,25,33,22],\n        [22,25,64,22],\n        [21,22,64,21],\n        [21,24,64,21],\n        [20,21,24,20],\n        [20,24,63,20],\n        [19,20,63,19],\n        [19,23,63,19],\n        [19,23,0,19],\n        // below nose\n        [36,45,46,36],\n        [36,42,46,36],\n        [42,37,46,42],\n        [37,46,47,37],\n        [46,37,47,46],\n        [37,47,48,37],\n        [38,48,49,38],\n        [37,43,48,37],\n        [43,38,48,43],\n        [38,49,50,38],\n        // nose region\n        [22,18,33,22],\n        [40,41,30,40],\n        [25,33,41,25],\n        [33,41,30,33],\n        [25,34,41,25],\n        [41,40,62,41],\n        [34,41,62,34],\n        [34,35,62,34],\n        [35,36,62,35],\n        [36,42,62,36],\n        [42,37,62,42],\n        [37,43,62,37],\n        [43,38,62,43],\n        [38,39,62,38],\n        [39,40,62,39],\n        // mouth\n        [44,45,61,44],\n        [45,46,61,45],\n        [46,47,61,46],\n        [47,61,60,47],\n        [47,59,60,47],\n        [47,48,59,47],\n        [48,49,59,48],\n        [49,50,59,49],\n        [50,51,58,50],\n        [51,52,58,51],\n        [52,57,58,52],\n        [52,53,57,52],\n        [53,54,57,53],\n        [54,56,57,54],\n        [54,55,56,54],\n        [44,55,56,44],\n        // left eye\n        [23,63,27,23],\n        [63,24,27,63],\n        [24,64,27,24],\n        [64,25,27,64],\n        [25,65,27,25],\n        [65,26,27,65],\n        [26,66,27,26],\n        [66,23,27,66],\n        // right eye\n        [28,67,32,28],\n        [67,29,32,67],\n        [29,68,32,29],\n        [68,30,32,68],\n        [30,69,32,30],\n        [69,31,32,69],\n        [31,70,32,31],\n        [28,32,70,28]\n      ]\n    },\n    \"patchModel\": {\n      \"patchType\": \"SVM\",\n      \"bias\": {\n        \"raw\": [-0.964306520867, -1.03566919244, -0.874989992149, -0.916328634351, -0.84503678968, -0.844297101434, -0.738523173234, -0.808714131663, -0.726541145855, -0.843675312327, -0.869822246614, -0.917260263832, -0.873711733476, -1.02671396751, -0.98146088848, -0.873014174242, -1.02044597636, -1.05803547484, -1.22124828051, -0.881683950651, -1.03317042471, -1.05134750237, -1.24054665894, -1.16383797435, -1.06699587696, -1.23916761432, -1.18767751229, -1.12345203915, -1.13546600331, -1.08024044629, -1.24021266444, -1.16700091429, -1.11195019559, -0.729540672833, -1.12391599663, -1.3005410545, -1.31472443469, -1.08705339489, -1.33623226644, -1.32469845456, -1.11491083141, -0.762875763426, -1.12163285295, -1.09863140074, -1.29945157973, -1.27843894877, -1.00589316549, -0.912330645934, -0.962922353705, -1.25265133142, -1.29458347282, -1.15225762288, -1.00045652806, -0.887710450269, -1.01416634829, -1.19650803217, -1.03872671577, -0.86719070075, -1.008904644, -1.12379151191, -0.950687461141, -1.12241433736, -0.889224862634, -1.11762094609, -1.22489133968, -1.24702333407, -1.24517637612, -1.09819559472, -1.2104134101, -1.2217112657, -1.17731763127],\n        \"sobel\": [-0.83934766225, -0.62721260575, -0.558840580329, -0.699564404116, -0.711116468654, -0.800405507582, -0.800598028802, -1.11367567263, -0.800716892269, -0.800194374505, -0.719852733547, -0.699662339749, -0.583473094463, -0.656586463686, -0.82585939445, -0.777588904797, -0.772328358153, -0.858083769483, -0.819377339675, -0.764279660704, -0.799960100345, -0.867018791717, -0.823023270097, -0.742640730114, -1.00863469391, -0.717177931342, -0.795282566734, -0.882814402127, -0.781504747967, -0.996713581871, -0.712255820555, -0.811275119279, -0.961002025204, -1.20550193802, -0.862430611162, -0.755762286162, -0.788966054175, -0.962730404866, -0.785589168563, -0.783168017095, -0.891439881469, -1.08053052724, -0.818953010952, -0.823990582718, -0.610975113014, -0.706369334087, -0.83607795072, -0.86536700094, -0.861887789379, -0.706860677903, -0.604669076545, -0.638959509959, -0.600205200156, -0.601208908689, -0.600265306283, -0.666594192176, -0.706937637112, -0.806432197551, -0.701267093778, -0.697408794637, -0.851407473703, -0.696453841977, -1.00957402773, -0.888081735997, -0.883778307995, -0.801014108655, -0.802707601144, -0.902478661063, -0.867497240701, -0.826525935114, -0.828361611411],\n        \"lbp\": [-1.2775026474, -0.801223028353, -0.800091623644, -0.800009851969, -0.706840077597, -0.771744181593, -0.764756730848, -0.668987349384, -0.722732252285, -0.669412768606, -0.599571546235, -0.799859783453, -0.800085025062, -0.800151690407, -0.800453693963, -0.770896454141, -0.657297455691, -0.599810309052, -0.583090394926, -0.952970571559, -0.7654582373, -0.799938792024, -0.727414989246, -1.31723075305, -1.14076054405, -1.33781061842, -1.40029321489, -1.29006497698, -1.28367040173, -1.15693629435, -1.21680694398, -1.40041878805, -1.29047691479, -0.928378863331, -0.926795080454, -0.921170431637, -0.911039053934, -0.843072087859, -0.863356945439, -0.975893430292, -0.891645275689, -1.19772729821, -0.994481526443, -0.974741126221, -0.796142704788, -0.771301703397, -0.911422811844, -0.920856682866, -0.865902542856, -0.849751055127, -0.806605497263, -1.05057278424, -1.21923288747, -1.3182935345, -1.30915908452, -0.608079191461, -0.939755202343, -1.10582615252, -1.02794612196, -0.913831959238, -0.874524304042, -0.818753505759, -1.06509012802, -1.18557061801, -1.18891869024, -1.3461331468, -1.39693404573, -1.19088607628, -1.13830203374, -1.37361790282, -1.39128680085]\n      },\n      \"weights\": {\n        \"raw\": [\n          [-0.00641929350098569, 0.029808749809618604, -0.026783847528159686, -0.022626445601288438, -0.067696544783929641, -0.33308017010587532, 0.028196651717386736, 0.18244853629138108, 0.015034328565348129, 0.067852736181546511, 0.066707601028042948, 0.043757744772933718, -0.049432046935464227, 0.028764976579739795, -0.023780221712776294, -0.019043996534914023, -0.14597609954565341, 0.076748129651230637, 0.10031267415956342, 0.022404267686006132, 0.039489304810642681, -0.069172555941927991, 0.064453930612007271, -0.03568078024136126, 0.029477578218046946, 0.013670321310075631, -0.040086746434879458, -0.16483725729324836, 0.060739714509717116, 0.1342127393151894, 0.02422269183439342, -0.023179439720271901, -0.023938362360883966, 0.00080564472822024918, -0.020188203981491876, 0.035394353296754666, 0.0205064246422616, 0.028993448164401289, -0.15875938903288647, 0.086380176300005287, 0.069612353949308661, -0.0051496283178931873, -0.086212516632916264, -0.11615256372599751, -0.10171915312404266, 0.05044362294149464, -0.010944856179506302, -0.0019939577905011829, -0.082496323737375032, -0.19805282268418445, 0.14503065839704138, 0.10472965706111854, -0.054504100655757171, 0.058558989674775644, 0.02150968078817124, 0.01730546008925736, 0.05479743583896092, 0.081449861658568032, -0.015926761159011912, -0.026645825852455899, -0.29395789604640399, 0.26045433455042083, -0.014750981039322313, 0.013565969503019568, -0.052043696631421672, -0.068507656016080665, 0.026714598423665525, 0.015030040573038209, -0.0036695544345779346, 0.0038325864743167098, -0.029296334816602605, -0.2168604461047042, 0.23218142341105868, -0.00327038976446066, 0.0010937576464049442, 0.022865074396730092, -0.0024710599676689565, 0.027138580199090406, -0.016798852895205371, 0.052896545591113953, 0.0068773632280050567, -0.11534615443720748, -0.20002833023471947, 0.26776687274414374, -0.012990564848598472, 0.014507044952519324, -0.028376794482919257, 0.0061821648519400502, 0.088921914606219496, -0.029268623822226371, 0.023549402065920405, 0.0050119768662514469, -0.10302390187256479, -0.11265110616376864, 0.2362166399750627, -0.023189771813893006, 0.0035722520614683423, -0.034182137066625137, 0.050630393094575593, 0.010945258403000244, -0.0026518946618147438, -0.025155322122281942, 0.028530077090590744, -0.13115618895267522, -0.093256001395012889, 0.16420560614466395, -0.010547265652414012, 0.035550139332521893, -0.020259214475918323, 0.022466567725035011, 0.034170311222605998, 0.11907609035635143, -0.0015743444390024786, -0.064020366156778002, -0.22057027736788293, -0.072309973907480174, 0.30204671935473221, 0.023274069917025395, 0.063584377222264996, 0.042978528220157006, 0.1184620505912367],\n          [0.16667514507181941, -0.061056496077366282, 0.0069211233964510538, 0.017084537322497012, -0.2260817686595176, -0.3734473319351409, 0.079940868263823905, 0.16478474110226196, 0.022649460741459224, 0.05289358066562716, 0.029321578215087005, -0.065686830769126472, -0.017175099236391184, 0.05342642508666981, 0.13196524692583625, -0.038915970355677662, -0.22142105635118151, 0.17018889180755431, 0.037968714516855254, 0.032433038579621432, 0.013114263754535838, -0.0047139766817905979, 0.01449378481921762, 0.016836144088159047, -0.035382521979389493, 0.06459440929029997, -0.16864194241367311, -0.18183649747692435, 0.22011199704153209, 0.017097680726078424, 0.044439120834852616, -0.065744647597146183, 0.1020917702829201, 0.012977428388828996, 0.019775964936306969, -0.020715077614501087, 0.037536099617302823, 0.073188143789734553, -0.2573933108232303, 0.17910460975300116, -0.012201308491933793, -0.012488637353357972, -0.027937934041822002, 0.090839519859215512, 0.056061692281274847, -0.029592134951326149, 0.083797375549624048, 0.026909019608009989, 0.028447256194293238, -0.26724295246437862, 0.17601512398468455, 0.05747403764496381, -0.021754451570897559, -0.016094120395692652, 0.034960605520111765, -0.066136093799398984, -0.086822275816825112, 0.021267627399376515, 0.024913839061514578, 0.083351248045442958, -0.21233918154488879, 0.14528347788592133, 0.052103220110131521, 0.0060526935312730304, 0.0041057956922075783, 0.073742527231735508, -0.063150982285070517, 0.071706513280739251, 0.050276967845660783, 0.059473860357975208, 0.041092776845037343, -0.23158549693983016, 0.039824353302363641, 0.035168096441852537, -0.03932662577032886, -0.046713411712221917, -0.029438846368243326, 0.03037322262500354, 0.010642421674176408, 0.035443098233173931, -0.064897369310492531, -0.032863903246691833, -0.15394029962311223, 0.011777952930909712, 0.17418487412288675, -0.05475758571404693, 0.047924066013688642, 0.054346490005779069, -0.0033548564463232317, 0.023589666170022047, -0.024599944457705122, 0.06065500572988429, 0.13656620662733865, -0.09366338113990888, -0.047444407722275428, 0.062872719444471176, -0.022728230791896249, -0.027266120729298168, 0.12949378554678781, -0.016064969466370635, -0.029023009596784263, -0.055703343306378029, -0.084010725120186397, 0.067582673095362464, -0.021201313484205356, -0.12021659219227125, 0.094859360168578946, -0.023785622470961085, -0.031181057005649077, -0.0045461011994782641, -0.00096878041950868021, 0.075435938022599638, 0.010017282477206416, 0.06897995798959812, 0.077147960801012536, 0.01605850787004124, -0.19045442262141093, -0.010877182945437318, 0.12221413195895285, -0.035115541235648702, 0.061957485103634649],\n          [0.0011017024675275405, -0.10082831174460544, 8.594795150784762e-05, -0.0044220494782738484, -0.096739526280002486, -0.13240523784777558, 0.13984373949584222, -0.0031378754168676498, 0.068399621371189656, 0.041644858137291046, 0.12466035423467051, 0.057468796042489417, 0.073611208985683574, -0.010863604812754085, 0.0048406348200145249, 0.016396206458863971, -0.021671035744779854, 0.044733205419186794, 0.067921565834977882, -0.01587229208239721, -0.055943430884781355, 0.01970238776563854, 0.01861633041967882, -0.0056589566846889511, 0.034037512362465189, 0.034411475082115867, -0.10871009154186473, -0.08095953984145883, 0.067427623282556901, -0.019879897471494754, -0.01366520816807866, 0.035789793103949114, 0.066231396371961834, -0.045917999777744078, -0.00420191665726459, 0.021126802087625032, 0.040187642280355346, -0.036664394872269489, -0.030092902147062638, 0.0088117404767308755, 0.0024160167750989087, -0.038592533464695079, -0.031144322454676222, 0.03504205275969649, -0.018244427580942767, 0.018916000565823501, 0.00082420366538178691, 0.092474565072900916, 0.073297169128542394, -0.024311595897201867, -0.0027452015976400512, 0.067920732187453939, 0.0011865809331642052, -0.02829414542225548, 0.042812086020618187, -0.022452858987935732, 0.02261009594352785, -0.028250777066103218, 0.043262591064003333, 0.092532390695239303, -0.15324339008135635, 0.050211260469539359, 0.013929622339187875, -0.00089781384686685173, -0.063661201005958332, 0.0048485523557203342, 0.078580094123552602, 0.02575794561866239, -0.032352350433290294, 0.028485056134963452, 0.023621395691399441, -0.2117470445371154, 0.10461485137190293, 0.047597936964786855, -0.013272615927845698, -0.060311993172769994, 0.021931281439721451, -0.05466583518135374, 0.024589654496216209, -0.053142641146117948, 0.04992839103128853, -0.024452908798012384, -0.13669941087219498, 0.013882012829174228, 0.1070905994912941, -0.030277288574973339, 0.045488870557272854, 0.021158864845617006, 0.0045504704709340218, 0.05214959922096879, -0.031124914087522559, -0.025892240716889583, 0.051505846702740755, -0.15850714978032798, -0.077434100579077431, 0.14442197585402719, 0.025520694414871425, -0.013359740227537047, -0.032691479720369884, -0.050760755770619531, 0.0067267124662175881, 0.053582968166709294, -0.066091329071098104, 0.028319458261919814, -0.023395468585636847, -0.12189855936069849, 0.1264108145125255, 0.041070402257636952, -0.038345327797452616, -0.0051037835899539882, 0.01115753611454251, -0.025558001982792473, -0.015803280214702852, -0.014570255682172791, 0.058581784915518444, 0.048613151833675504, -0.29657491636724309, -0.067645659352775264, 0.13108882918808282, 0.054569929796482737, 0.062523971903905642],\n          [-0.025232963701757677, 0.022348786079614824, -0.072258840316720419, -0.18573054835716424, 0.061153715684906157, 0.16052559660045873, 0.035735222876137188, 0.032645819538200907, 0.049972870544935558, -0.017744962590501873, 0.12327939069776968, -0.0020676327098313324, 0.01746290767019347, 0.062789463078491509, -0.11704698186369022, -0.065254587170476969, 0.094525133189958851, 0.044950125896693824, -0.028763679134251888, -0.0075590072060936625, -0.018042703509056443, -0.042766926478698966, 0.0064726653302440013, -0.024498528948216539, 0.015095977860562756, 0.011479770091646538, -0.22511989496614118, 0.13749975960271679, 0.042174383146931602, -0.00097973927564777574, 0.0053458653222245162, 0.0066958708608460676, 0.052938783244498341, 0.028662885704672569, 0.0083788264626524778, 0.00039142479042951484, 0.058935919636454462, -0.20560278009245425, 0.079502781298950373, 0.10223896059315847, -0.041137991907932381, 0.027330073389672568, -0.010752121223537789, -0.0022306851331074934, -0.0079242014779485268, -0.0082794956479350576, -0.032085062337155419, 0.086122599207560518, -0.12113263279497796, -0.12790727680874353, 0.13902963426409898, 0.0088539666043742082, -0.035846424270882665, 0.004579108178465921, -0.043586755702451435, -0.026440306229895939, 0.012179387770686292, 0.074041872436307762, 0.01288390088442623, 0.063137802503704196, -0.30013379565775622, 0.19884603307627666, 0.063815797070558927, 0.049734977180621504, -0.059941845556548135, 0.066082316837520416, 0.018259553212376337, 0.017779633684347013, -0.030632372504305949, -0.05294008910372007, 0.12680914791412304, -0.23860332882902754, -0.072937437856311613, 0.12736775458078498, 0.063565918341235095, -0.051172875061062162, 0.0097790501145352954, -0.0043407042674837651, -0.016155615544080057, -0.0091923923303261629, 0.050665742508667524, 0.0060984721656736629, 0.017307742609543222, -0.20367784360158347, 0.12046177714866035, 0.012913438963355811, -0.0092051845719411662, 0.035362756301432471, 0.030747952698754938, -0.0068483304259888619, 0.060769663776634064, -0.024830671275067155, 0.032204825588141653, 0.088512986534959648, -0.20132344254131007, 0.0025484138158970229, 0.140122587765108, 0.019618593851209051, 0.030770253761956967, -0.044844034190508676, 0.010829012004067717, -0.018604574580413091, 0.0048701187231226031, -0.053835622525193277, 0.065655732448266627, -0.087834494458251325, -0.10019900548070505, 0.019098697970462999, 0.032625675487211764, 0.013786208177970036, 0.01459298085632256, -0.02245319975032244, 0.023627062323695644, 0.044567875847249791, 0.051820387537472895, 0.058960832030794469, 0.011808887606369993, -0.24302913455395336, -0.10331035325930389, 0.043122221975443853, 0.044784114116775492],\n          [-0.11131891807709643, -0.14268474406555598, -0.11319512819486531, 0.16616863430344642, 0.21669051126658584, 0.14580497808064175, 0.015659490036423723, 0.081299765772630261, -0.024809345136602795, 0.040210442226760873, 0.1147788050575636, 0.018929993321792474, -0.080897366155457673, -0.05933670525564233, -0.10482248256522532, 0.10573530196882865, 0.063140871798500697, 0.059506144939088096, -0.10685781396759031, 0.034082096511914323, -0.044928786246672847, -0.023391401657096106, -0.021033602025377948, 0.011729129297605986, -0.12518841502550898, -0.24524516894120252, 0.07503634089773896, 0.16915003534917084, -0.01104335485702547, 0.018698016558333488, 0.0089193810606012641, -0.0095742068835864974, 0.074951376080238705, 0.052515621176523086, 0.00076255674614852942, 0.14447253116659836, -0.16116755572117158, -0.29435350805617738, 0.21097730948472182, 0.15322391116769629, -0.031396770107823796, -0.073199499622068412, -0.00058138919552927493, 0.038373648087908357, 0.071661242983008577, -0.02522805699198942, 0.094355619055900272, -0.0055066260275108136, -0.31676942832713584, -0.17017797276453395, 0.20181171910078166, 0.038951035449355131, 0.020699071667054786, 0.0073524959093896058, 0.01925107008541585, 0.027713365493689732, 0.022207504221021385, 0.017801567429584678, 0.1612676210022263, -0.0097926541627393199, -0.39692367057618455, -0.016344797834207933, 0.084334965049200059, 0.12332269298102864, 0.04685154450642956, 0.0026367553827924689, -0.01561848475266879, -0.0094365420154359086, -0.02615768632490699, 0.093091816231290578, 0.015836673962272785, -0.036104175954425388, -0.25194637763515748, 0.066518889227065711, 0.088768723733041136, -0.054177349140414666, 0.11363104423136496, -0.074336096915664576, 0.026411919672457762, -0.0069934713872144005, -0.011837151565905812, 0.20495766925622727, 0.040652574469842911, -0.1095170141673022, -0.19525613842871348, -0.026690291071139877, 0.025635090198280266, 0.084142487180791703, 0.081560517413446651, 0.033899581274340673, -0.04177793659445489, -0.009501675246059646, 0.014146738677450046, -0.0083456640397739645, 0.066156053917280688, -0.13607639700339172, -0.075200076822236159, -0.099487351506951205, 0.097954762781141, -0.068031338341652869, -0.028816943621433999, 0.062116569439491787, -0.056509543958784436, -0.01645775253059964, 0.078178705767746479, -0.011547980097176877, 0.054587296091729326, -0.017563000385479949, -0.072691438517766077, -0.034856075950508381, 0.058573711770738279, -0.060289020490556899, -0.012302959633281041, 0.052155478089966123, 0.075227692092241769, 0.053726915546722931, 0.0021832390619121317, -0.0023449235386490269, 0.069001946478247533, -0.05514982572329348, -0.18138153837504351],\n          [-0.23224131638764922, 0.079034696624463316, 0.20679180641094769, 0.17116975450055194, 0.060393255799023757, 0.070072109804855828, -0.061904660241219982, 0.10747334033766655, 0.014331963987671489, -0.032561864821210422, 0.096136650220496528, -0.11702112011574746, -0.1864804302468564, -0.072635832330671626, 0.12519462388086205, 0.070887202616322975, -0.032713296482814992, -0.014132673438533166, 0.0038161968326955314, 0.065966068281342619, 0.020457399865123169, 0.05133413578390264, -0.001116824372617925, -0.086503852575327167, -0.17856252353561719, -0.024882107163551152, 0.17291742960211148, 0.076636137948616748, 0.095776267371189924, -0.076644083681563224, -0.054109190285893664, -0.037610346895478264, 0.10646735039870757, 0.0051060331651450463, 0.056304468483811307, -0.028154521230155018, -0.31728669213013388, -0.058091370831929535, 0.11556013989779028, 0.065723490886578348, 0.030550971916660702, 0.041747103093391622, -0.069587858250691484, 0.092461263966589977, 0.052299010395004661, -0.010485795012401211, 0.011062345730906517, -0.04525324732355647, -0.23598087205664336, -0.070892557463706443, 0.10680685304416297, 0.11990972610746585, -0.020183291742381704, 0.00057273018272969989, 0.096563026611294442, 0.084394132743400782, 0.0061097222161349135, 0.052438465571678999, 0.012127916344441741, -0.025706403873987399, -0.37425731880779622, -0.12768740978352261, 0.057044219322174475, 0.11342314858398521, 0.089909015291416469, 0.088758601800430922, -0.017367003795174522, 0.058573936936146223, 0.0024241782448618243, 0.081099658324097532, 0.071614519911280788, -0.015636202687439121, -0.21764039015095288, -0.20280985898846876, -0.10017064401745751, 0.076481246330856831, 0.072072476074846584, 0.074831950513515946, -0.071669127112894582, 0.0033343139896645224, -0.020106231127842517, 0.12484552374687989, 0.088741504624313003, 0.01253935252290507, -0.080371651389196677, -0.20667576524399633, -0.042824689058188217, -0.041960654306219244, -0.011319310972225209, 0.0087351053188495856, -0.0073465804795511402, -0.014035434722362766, 0.060980934347515808, 0.0044957219640220231, 0.060136042340486653, 0.12862638541641686, -0.043407117384264018, -0.17199184431209702, -0.12411968467220214, -0.067878366625261699, -0.01454311580267198, 0.01330421418710441, 0.086616156710090195, -0.050869444187172472, 0.05903651637207552, -0.030082478432639181, -0.039150691833121767, -0.013410175971461852, 0.082024132616958054, -0.18429763963038856, 0.043819988293125167, 0.031005210064727645, 0.010111390046324928, -0.0064173858317888854, 0.024542598321298154, 0.0033265330575526358, 0.040210215896558238, 0.10549988851835322, 0.066466013297427518, 0.049201722388277136, -0.093932153614813801],\n          [-0.12203267064152819, -0.036980237066742305, 0.12682937376396922, 0.10063288694137082, 0.082154198268033315, 0.031376504219097656, 0.0761930646076317, 0.029643540312019309, 0.067195157731181732, 0.014606114158926237, 0.21693479369516466, -0.091990999910650448, -0.11495742760629782, -0.057854374414651549, 0.026983308635638359, 0.053703744190506393, -0.0273941556868533, 0.062050781886751671, -0.014064800119151746, -0.030464390345027792, 0.050223229862306498, 0.069522169458366395, -0.047915080066377513, -0.076312738072256109, -0.10542836060878844, -0.069963062747160215, 0.063887809768190862, 0.047703502973526726, 0.049625632114663767, 7.9371105783654361e-07, 0.066938020168000531, 0.022331267930076198, -0.013204459193458515, -0.051208345754393744, 0.017251686675046174, -0.16855866147278023, -0.081718362687205809, -0.051493312235764005, 0.044258122147233556, 0.079860750571469824, 0.040256904905908247, 0.061167900966640459, -0.04445412975620007, 0.076058551537300789, 0.024484533213087259, 0.0237388901616193, 0.022211385002816955, -0.03909556756500325, -0.26993986747191345, -0.13809797457481326, 0.10638240754104332, 0.074164534665666665, 0.1361114507013107, 0.08862011177027157, 0.023942633928693842, 0.05945503505976131, 0.018810531601996444, 0.13332855116668979, 0.019080517712641562, 0.040953668701707469, -0.19369280785037196, -0.33096708018422843, -0.31537163999459777, -0.051011822183710684, 0.10153083596477822, 0.10646364340542763, 0.014630901225096263, -0.0037911814153038514, -0.031174186442994762, 0.12574438878630761, 0.082746608550893844, 0.13910378358879222, 0.015618015934354273, -0.097010031619152184, -0.25736850771835984, -0.23890047875932624, -0.39201416081419432, 0.014631649728319138, -0.0049576516790900346, 0.03224914217266181, 0.01990648283333149, 0.0090030712698045481, 0.026111426002791746, 0.062897867831994483, 0.14638901620146211, 0.10175160175705127, -0.008366542972654184, -0.22694639696488025, 0.016644643336980125, 0.010640427487024477, -0.033902595425888096, -0.058870306001172809, 0.022391466116807472, 0.010861548153134476, 0.028661031141596176, -0.0089732366008385203, 0.052004121536959068, 0.030892998140363448, -0.066298768516542983, -0.045462972141964375, -0.036534075016049508, 0.058255109985203259, -0.090300770932724164, 0.087529180603695578, -0.048367137056150394, -0.021869920641280391, -0.061934612997809474, 0.02284265461094593, 0.087099015316751405, -0.038225524845750966, 0.042582590594014876, 0.046403954163031218, 0.038044057338396199, 0.013279662526628024, -0.024475870996729501, 0.042648427075458788, 0.021205045270171127, 0.02354074407698388, -0.0073299199474954058, 0.0090776722049553393, 0.072704385543697653],\n          [0.076135322944236056, 0.075928742328769658, 0.10248245044059716, 0.12142390869553117, 0.061858857352832766, 0.025464191080837695, 0.048676474818140573, 0.030285797856824295, 0.11128631305542007, 0.19455327377882989, 0.11002956054185524, 0.074606814265492927, 0.013898060531860643, -0.012868505144617515, 0.038119746657903283, 0.0071484624304063438, -0.037389694906732461, 0.027891841345889026, -0.0040180772778207266, 0.051191664743506379, -0.051415059933379359, -0.065947905104447993, -0.077216280637459084, 0.078792274560627332, -0.014940451970767085, -0.042428171172985307, -0.022773622035877988, 0.0095521053133781186, 0.089224973018742798, 0.0026288446459537393, 0.027795289276907741, -0.011245376233293055, 0.0027789702559120602, -0.084646263411087108, 0.1085122984586782, 0.064787488385146461, 0.071774533015530245, 0.101565447736036, 0.13538683839366522, 0.022702180797543253, 0.081382504391220065, 0.10182220145207069, 0.13414599015766171, -0.067254735812403973, -0.25199554524555356, -0.131377327178401, -0.16365674311148973, -0.018740825554245097, -0.062882807469171645, -0.022204060979254633, -0.072308264704348132, -0.060021508605704321, -0.15902262422755242, -0.23762263561888841, -0.27876101597724223, -0.040263587475045666, -0.08015604055016233, -0.054338910081926026, -0.19775317420562621, -0.28232046584273385, -0.23353688528539848, -0.28871468579830523, -0.14101654202670044, -0.1025403206842016, -0.091079191318669123, -7.6021920519903069e-05, 0.084333775651217177, 0.025776875645890322, 0.027110928294315155, 0.12586947033203832, 0.1709457201826477, 0.12107947589739056, 0.23253719852668123, 0.022508442929942168, 0.10869072456768857, 0.1033561446413986, -0.0044697029388135806, -0.019043623385769329, -0.038539230833867344, 0.059623205301912882, -0.028372504860633661, -0.029359754569747713, 0.00087516511679762042, -0.065918072203459618, -0.069356242665201281, 0.023580387356890727, 0.021727207917053997, 0.039570606452870798, -0.029876932333496215, 0.038706340217221941, 0.054322914583595866, -0.04361035086891106, -0.014678116576553712, -0.039396900573428928, 0.028347288864635375, 0.13841137622066219, -0.090660897476471158, 0.036895873473620874, -0.037229162146948817, -0.009894930351075984, -0.0452390438366378, -0.027744940547884053, 0.041940095444971182, 0.010553985420084559, -0.12123151432640322, -0.0087493439495505976, -0.022343273408815235, -0.036722825249752025, -0.074235049496179872, 0.13502817700337175, 0.046152107059304906, -0.00089713083287275286, 0.055904759652944447, 0.072800550242982834, -0.014134363015890009, 0.047445934632441455, 0.085859047433199678, 0.055070485986852061, 0.022278702781022022, 0.064172293392803822, -0.070765699060726217],\n          [0.11799509004720471, 0.078210409621760235, 0.1281616951498617, -0.020597034003169923, 0.014336534229225872, 0.11621450358247642, 0.089056433936686774, 0.054438463796402992, 0.040501447910613234, 0.077088744908712675, -0.1658906017777812, 0.098327915917565289, -0.028103337633236192, -0.02658838870983915, 0.024054753355259639, 0.072814336465874374, -0.012893740245567331, 0.081294224250996139, -0.019638851124383461, -0.059461355471660093, -0.070719091722531727, -0.12759442479018229, 0.02999311492449748, 0.0019697445298409999, 0.026356695570939392, 0.077456177036917817, -0.0065799057399700267, 0.034984205817837566, -0.011141116727752032, 0.037205943512359313, -0.07804833218835576, -0.042937280919520593, -0.12753528913147499, 0.02845913050306173, -0.02514121956008758, 0.032110847590650193, 0.042951761529577637, 0.11294381552310545, 0.02004775184404517, 0.051515900309122342, -0.235725744910211, -0.072308382261543402, -0.019056219840507427, 0.0030321142503065279, 0.096971125196596036, 0.075809718303164492, 0.1171582304881571, 0.10956914475118423, -0.0024781197540262312, -0.06415838742812259, -0.26848100360863303, -0.059754498941204257, 0.061910526180559394, -0.021664296531182625, 0.086110025927143202, 0.053233513020111881, 0.17175441242058409, 0.028047054519386466, -0.085902980821043862, -0.33611410752827631, -0.28144114222203132, -0.0080330325783590784, 0.10513880861366756, -0.016382627034826625, 0.06894681074416012, 0.032997961272869761, -0.25750942110661729, -0.14536580095096197, -0.35542177348703685, -0.31543540234741724, -0.015389034147835323, 0.25815532917511536, 0.089607429737832672, 0.024873996600298487, 0.068810039618355481, 0.034890175702158258, 0.0094402391459942059, -0.33170429456025141, -0.084021507130023668, 0.050999687890954576, 0.11407450625706317, 0.12380980581221895, 0.061541685739852497, 0.024537508065533231, -0.051412691100538532, -0.037969145008949989, -0.083159219869618037, 0.060974023868713867, -0.069682639993999873, 0.013136896914555662, 0.054335436144424709, 0.086375749604332752, 0.025768018275164228, -0.03028474620608318, 0.0046745647931875633, 0.014048250096520054, 0.0039043180440717223, -0.013243528792716869, -0.010234982174629259, -0.034348718626758923, 0.089306699417503188, 0.023672596441143168, -0.074063880914324018, -0.039416266912232933, -0.051467563793051355, 0.0066514091767777561, -0.0056021073234813201, 0.037530284479276185, 0.022917723699947115, -0.028514057580272867, 0.047001295013920974, 0.011663892903344658, 0.031577429128105267, 0.03674321708145567, 0.00016789538350847621, -0.032412649376776737, 0.061176715259990133, -0.014965782274795558, 0.027963582472569012, 0.049596015432228538, 0.017493695904998829],\n          [0.095111827476955541, -0.061598206035035019, -0.027848508902761582, 0.16285091177508479, 0.011485186070697095, 0.088227631418343583, 0.033476841560767329, 0.21311907036597436, 0.12562992528833603, 0.0056585342726571952, -0.19669291509156339, 0.12201627871631479, 0.065003875747784906, -0.064637578476232027, 0.0076011270434201972, -0.014992832356838792, -0.01371412582796748, 0.065189835192035667, 0.060501772887085942, -0.007320488021864191, -0.15837390579360289, -0.11374672007199678, -0.011219765388015224, -0.037241451866588046, -0.003534620740694161, 0.01418414744662963, -0.018804529282363244, 0.0022002993190636394, 0.086304123895880422, 0.050730302973426275, -0.19347784099407583, -0.024336852899701306, -0.022104084039211852, 0.11856239536141804, -0.0040746848315117296, -0.02163636804096198, 0.032834767679033816, 0.080034473148409696, 0.18177097586869298, 0.04019529190670533, -0.27026796515043489, -0.046764731646186594, 0.008852085437052834, -0.0095398107877663063, 0.073838224250254575, 0.0022341455913789526, 0.080946842014086626, 0.064911153319107226, 0.06885287564917604, 0.052927148605433058, -0.41010712091394702, -0.0033883005740702465, -0.076620464606964478, 0.028026719104762239, 0.076992030561192998, 0.13499559219777985, 0.0010835539682531592, -0.0094521558900973468, 0.1189809113716918, -0.10886395857171732, -0.31839062100092569, -0.079536575816365779, 0.088035400227267108, -0.01994821470243107, 0.055031181510797132, 0.017355891747403651, 0.11548823748390151, 0.047318802613544472, 0.0035588736908875526, -0.19090242902977161, -0.16923224535916537, -0.10343904409632039, 0.11611444215342794, 0.030139907826970232, 0.092037927739449271, -0.00052811116545577533, -0.0198996720404131, 0.11041139740159193, -0.11354626622456132, -0.13266289678027732, -0.16827719486229559, -0.036676195585965438, 0.078177366758504091, 0.065049146958536752, 0.061265895750100163, -0.045421314698528795, 0.038673845042327876, 0.026641279640920345, -0.10482185618696178, -0.10700981328292422, -0.065258746439048387, 0.10279723823243007, 0.025140628570866255, 0.078995252659308457, 0.055586249229617551, -0.028236723374775799, -0.0025877363105662674, 0.033127455377752982, -0.028093023704546808, -0.19114920828266518, -0.084372445040405197, 0.032752181200734989, 0.044573421483901268, 0.078569580177818454, -0.076167973158059274, -0.011917584687660975, 0.03886281331675661, -0.044585012472417355, -0.041774790744191534, 0.06654393572162462, -0.20856381862218065, 0.16839377975033309, 0.028096195344995425, 0.02974664466893967, -0.028107306876337092, 0.040206628818593826, -0.0050223327946646058, 0.061683180967305642, 0.11123093181504413, 0.0025290457228258033, -0.02120297614281566],\n          [0.090435635035851059, -0.042297079072951133, 0.079436400340748309, 0.03842552427230031, 0.018479439174666504, 0.15188772712119619, 0.24325152032590197, 0.11801556793669821, -0.080156795814110504, -0.21178228375212024, -0.13218981199435309, 0.01847519834858842, 0.092018443323332436, -0.050722043815425485, -0.068374560672083723, -0.01537540593449041, 0.031479819423878536, 0.087358407307766756, -0.06835423776229127, -0.14664172724239749, -0.00015826019866193447, 0.015682235993107141, 0.051709128927825823, 0.0087470901747511848, -0.082975597424275058, 0.061059290685490167, 0.055712846563533064, 0.11256404620171304, 0.12009580657518015, -0.2412015915622755, -0.014823455006292133, -0.021320510868446968, -0.0064826789690396042, 0.011517249723710349, -0.0029378978150773061, -0.036511890813033382, 0.040278214553535516, 0.0514440140450457, 0.17560605653482164, -0.16559846575808021, -0.17723807338794942, 0.06664090603454581, 0.025443982377752639, 0.01188465218452904, 0.0289513499031155, -0.062269615752451546, 0.0081510081877681634, 0.074139239966066889, 0.15951734948521942, -0.023426085135995006, -0.39782174976422469, -0.10908536196954385, 0.19810719075019201, -0.03969354994135716, 0.074717236518908187, 0.067657462341092572, 0.0023721387419759488, 0.050106233821570277, 0.11669499140233328, 0.10445484529679147, -0.18066291770941748, -0.13732855962266888, 0.12305831238941373, 0.037248666546407946, 0.04039521027170892, -0.013511371889906032, -0.012463530395042041, -0.011253154667815578, 0.057263714594404463, 0.064123734742731392, -0.18290915356692017, -0.28693729905644189, 0.16662290255364237, 0.052133698720201724, -0.034519972646288311, -0.0020692840094172008, 0.067412513930324325, 0.069378551503912617, 0.017341484161215288, 0.11249597819545545, -0.12114447333731211, -0.16394194327719122, 0.042618534271810712, 0.0082442390404487698, 0.032211543301204119, 0.0013431370481797045, 0.059793575679882971, -0.04185352167064698, 0.16141583247142297, 0.025290287768054538, -0.092771950162634342, -0.22159811768357779, -0.017539993864623925, 0.044684688362074843, 0.076526300295055832, 0.056281907644482626, -0.038322569525682852, -0.024136451744282625, -0.063727184521766261, 0.1019524390722753, -0.11143716683774609, -0.13769182869235727, 0.05085564633400147, 0.0118757042451966, 0.075788152179100177, -0.076290068823641047, -0.081411313673654603, 0.072941798976396161, 0.068768484681585834, -0.033997564379039544, -0.16790192551365551, -0.13094257760158287, 0.030092743795544198, -0.020741964391416696, 0.00030251423268644675, 0.088642737579611705, 0.052492146460725884, 0.087007777517176865, 0.024692689071073824, -0.11263451468661019, 0.075663957633193252],\n          [0.10661930608242243, -0.024041018022432886, 0.023732105856747315, 0.012547179712792927, 0.066200152687718561, 0.072880838736859632, 0.14195980975544101, -0.1884630302757157, -0.10001494467301893, -0.030399364707448071, 0.0065084325390564329, 0.035395980550384912, -0.016756476798346576, 0.039963413543780302, -0.032920761282429711, -0.005227900049309453, 0.1455513515779632, -0.045218123785947764, -0.15712918904629083, 0.019388410485656385, 0.069073426062715243, -0.0298852890481313, -0.013668142441217765, 0.03550729334105425, -0.033905353229976301, -0.066398064416859415, 0.069367258226956524, 0.099068467801844279, -0.16176946602990219, -0.049743685317054989, 0.049417327248947623, 0.11584329961758463, -0.0099765335337247824, -0.0058946153093775433, 0.024852267791530103, -0.022953834411929233, 0.03536477637026525, 0.07091098453159729, 0.16506591436250806, -0.20260600332750361, 0.0040822600350435972, -0.020994635237100143, -0.01738045300747007, -0.068169477874611903, -0.016583306399167802, 0.016335356838440979, 0.017414685172079863, -0.065509544776204645, 0.17533271724699692, -0.077797629050437453, -0.16426179882147435, 0.067990824370129876, 0.015164258343913037, 0.0078509177957392234, 0.023952622885856464, -0.022724061899056167, 0.0064689725623074124, -0.0046862624418039511, 0.023956271557396727, 0.17796984486026562, -0.14583559757339518, -0.064279230905094187, 0.0072858891690116556, 0.10176352460866914, -0.053758388167071028, 0.031829796138471395, -0.0069310877889054157, 0.011744209650540821, -0.022880287482633932, 0.061704359435578809, 0.073774321721628233, -0.20953311948246117, 0.022856913389839799, 0.054729377378656588, -0.019111901041743054, -0.030210238863132122, 0.0030313274697504888, 0.015874354673913807, -0.0064522920827583541, -0.029379891777454897, 0.17844565039391092, -0.071104527084354163, -0.12962834428996683, 0.074504436810004751, 0.028226182768918535, 0.028593401178049288, -0.019591476910773509, 0.026274691487893291, 0.049329376791844029, -0.002525771203732069, 0.015184190784585549, 0.079377622440195347, -0.19505648192438618, -0.03458185384929216, 0.03928442530245542, -0.060961853070715478, 0.032104621984227109, 0.0010087208719327459, -0.0029091919090189974, 0.001344468156507149, 0.0050237130033507146, 0.10378546719878355, 0.022547607122337512, -0.11488746863511244, -0.022120532171003134, 0.043655327718427159, 0.0067756961208252711, 0.025228229845891133, -0.019273769704258592, 0.021906840282590274, 0.076111022214773325, 0.017667767612816868, -0.015508848470761019, -0.23798198014252242, -0.10029292828221784, 0.068962427478186386, -0.00958082155355134, 0.071808069871878891, 0.0096924544958174944, 0.0089571169770431072, -0.0082774624735039715],\n          [0.1471154036752462, 0.048703759783120179, 0.038281571450254931, 0.073332082613442248, 0.092603314662736677, -0.069406279440535595, -0.18039118017356837, 0.030461887926973671, -0.076527801539272758, -0.028459829410684742, 0.0039885048607745666, 0.091531066997998373, -0.097047418603899732, -0.021416261913473872, 0.022880799394652915, 0.11630110494121575, -0.11091349044337311, 0.0052601237488336672, -0.0013446292981080382, 0.019772833215237998, -0.010680526542495961, 0.087901717718307917, -0.0062327763337505782, -0.022953022264458001, -0.011871195380737234, 0.0057627067153195322, 0.090589963902581616, -0.032591156196510603, -0.028720174599054245, 0.018764947431906404, 0.034198398065046542, 0.092483125928658885, -0.039035757837943871, 0.046060971646470147, -0.031919717673297834, 0.035975657614667797, -0.021429646453529204, 0.087312129030033464, -0.10752464144662353, 0.00152080949832821, 0.010463878802001378, 0.017720821018342062, -0.05437049272297912, -0.041948832895335277, 0.025352619756942793, -0.033214062148915535, -0.021243138027047942, -0.00088239905902148807, 0.12798500264531565, -0.14587827997097436, 0.0049154556879893313, 0.1154467113814605, 0.02439416473282259, 0.02683709160566132, -0.0070260419087720058, -0.020081222854955234, 0.023704875110253917, 0.022950424614096271, -0.05338528177481898, 0.083134108349852701, -0.19190518676745988, 0.028255792687062964, 0.051622701485504116, 0.026882922200025916, 0.0083776169731257372, -0.0056709911085335123, -0.015187911842930016, -0.052821700067161415, 0.0039064424714551904, 0.0052811518294068188, 0.10527786608533028, -0.15535307659177727, 0.012627301510895916, 0.033272060865199279, -0.016015509511655836, 0.04732339385165741, 0.029676033680461018, 0.06267237670914183, 0.020359709219910163, -0.056328413014882728, 0.062032262935028198, 0.13944415500977614, -0.1628837619018858, -0.062736195828590677, 0.0089073506518793991, -0.0034474543722587785, -0.016188172373634228, -0.058357780371563008, -0.038566049097796054, -0.0077422478015098661, -0.045254853975222942, 0.13886799518652831, 0.084801544603633774, -0.19493114682149953, 0.067962054023332316, -0.039669253652282341, -0.042999032230963616, 0.056922793567282359, 0.021310369562604587, 0.023652100423593919, 0.0053850398495440266, -0.031872155789865561, 0.12124236413591115, -0.096718330401961303, -0.094640869713099041, 0.050053309978650297, -0.04109568378358891, 0.06766934251303211, -0.013020222193800675, -0.017936312558531065, 0.030884587986413262, 0.017940556925031451, 0.12318151667620229, 0.08261243140085138, -0.19694230673329102, -0.084587141943991251, -0.0036587752660823189, 0.046190769885896037, -0.015214414660308498, -0.037796750375678645, -0.037660099586230414],\n          [0.028789729303638767, 0.024918790237205758, 0.046183744885366841, 0.11406524547975325, 0.12089401164677463, -0.33167640134016596, -0.30199214061986152, 0.075505027729564439, 0.015980848677207844, -0.03024616910429527, 0.070777799814993519, 0.021705154508264698, -0.014784416452853898, -0.092797386946284491, 0.073387121329044847, 0.21513353226194643, -0.13135516496728, -0.041009990688083156, 0.0027232866435380892, 0.10443594986053156, 0.019234702313893629, 0.026668393094573431, 0.077454342178145008, 0.037704653988272871, 0.028345891762078392, -0.0099781631348617068, 0.1639247590037968, -0.12998366709084602, -0.16954434602341487, 0.044201694038575996, 0.022535303634435802, -0.080570085581980172, 0.02832273196113292, 0.030852307058754604, -0.057281262906963837, -0.03064229252466788, 0.027439907981706396, 0.19418932496000404, -0.21394127367168303, -0.10822827097568048, 0.078776286858231487, -0.054726484054016263, -0.0018935512700742757, 0.027554055035958841, 0.12724208320232813, -0.05340181008736572, 0.032579369535054831, -0.0053668763896144028, 0.14925943338428535, -0.15555203727220704, 0.0070014801681935442, 0.047596654249176279, 0.15762506351670039, -0.0017752319114590492, -0.078479537238969374, 0.047380596780860498, -0.054017353379027869, -0.010809602185791731, 0.031689669706736825, 0.23862777088364684, -0.17967729863408127, -0.0025414623844454364, -0.0044922745473988529, -0.033450167802196534, 0.07325147963052886, -0.0025312860424687696, 0.047270334273701482, -0.018763729160332636, -0.085707081658790152, 0.037456334474121222, 0.24243173611028618, -0.25408665358619748, 0.043294141064992922, 0.040148143400007677, 0.013087435326473265, -0.019853324596188479, -0.023225826183980121, 0.030177002977477579, 0.030922203127136713, -0.040952858219118968, -0.0059330615062766906, 0.059823934711038376, -0.22840162828405616, 0.053835864895732992, 0.039215482051845246, -0.019168216146914205, 0.036601452638986925, 0.0071216981552001818, 0.0055194916843240016, 0.017118320543367746, -0.010329430802956993, 0.022891605120926584, 0.10730721508339976, -0.081071689415751644, -0.052731168737865868, 0.020938629685354523, 0.027472939746776587, 0.008732138872189002, -0.0119734318888386, 0.029541130454324258, 0.025437531916789852, -0.0032417425087455515, 0.092169001321697072, -0.063484712261834525, -0.084864201819236137, -0.0055455400012650313, 0.047829727088973206, -0.038728523143896021, 0.02165612388923753, -0.048404026188333428, 0.081106144087281604, -0.050252564268459365, 0.062538501508640792, 0.050008949642628864, -0.066834069762764486, -0.22862797363149073, 0.13880779851328123, 0.081956893470613898, -0.036534284594068323, -0.019723956545588499, 0.074252965588473677],\n          [0.080974544767873219, 0.056529870095499507, 0.032547574600199997, 0.10152684966806072, 0.0464353057497012, -0.21467483931903908, -0.20894615765238955, -0.014892577371206056, 0.020894015871834565, -0.0067217043883879002, 0.035252062080693092, -0.0060354856627079095, -0.027461302429899262, 0.010095861403046108, 0.054592365636949441, 0.16828861382181534, -0.17463234553413226, 0.021867928311703422, -0.041396141212343973, 0.019379712333095322, 0.012675043495296218, -0.02769514972624032, -0.041243567743035461, 0.016051533116298963, -0.0010186840048578699, 0.14437795805818579, 0.078407639716172844, -0.21215391984114734, -0.057680895739320961, 0.12664817413140378, -0.12395328524150205, 0.071773066877171471, 0.0075741150072376473, -0.051866325466372237, 0.038444728263650779, -0.11281826148125848, -0.013662478929553454, 0.21924860974778201, -0.14332413200544142, -0.054997300283757516, 0.0029602719156689994, 0.047502977291317666, -0.028485684862829264, 0.020466736113513295, -0.10612328436560343, 0.011155779036764471, 0.013002308851003064, 0.023295819752587626, 0.26377227907343925, -0.25931147876901078, -0.081091456814604682, -0.00039674384915672212, 0.042663298620291695, -0.0029478976003412261, -0.02670641642999412, -0.089310251851631675, -0.0050439093556460951, -0.0055020483002672232, -0.045366799032015917, 0.23013430030607201, -0.090115553552161928, -0.21358662268181244, 0.06901078184379858, 0.01987760740252234, 0.0044608961159714605, 0.029591032895087147, -0.035016870610203282, -0.016930134483468168, -0.028665218589185693, -0.014126514695311079, 0.23223335474778181, 0.020022276028697689, -0.25100707629932978, 0.089307267281698258, -0.0077044707387584482, 0.033183418337549606, 0.0097764251174143058, 0.034273315295213935, 0.020164835552348936, -0.01004293041366619, 0.0084137731647092734, 0.23502650629556968, -0.024429730500986124, -0.16831605537549821, 0.0005290142948826404, -0.023487633169125, 0.096815945866332007, -0.036177879497560572, 0.002670053453748697, 0.0060485344731694285, -0.03294986612777788, -0.029843164527927693, 0.14655979582549006, 0.0353911847412616, -0.20847127037801366, -0.057891906038571958, -0.01027014008034767, 0.076537736942186227, 0.082781522415119449, 0.11258631635960367, -0.016599499535918771, -0.093947583003786694, -0.02515826814708777, 0.13710963679628882, 0.13285152491933369, -0.22309506076529734, -0.12553570046740603, 0.025110108883222501, -0.03021547801359524, -0.011748686689746581, 0.14400425060338853, 0.043163516328968393, 0.08594108251756169, 0.035184741390128088, 0.17622159819914116, 0.19444104428116626, -0.23633459893577083, -0.077389181598155027, 0.014638957467814989, 0.022800332745270047, 0.083545736652882466],\n          [0.12261253014406985, 0.16705127800103603, 0.19069455483447878, 0.064200785381356679, -0.00016272403782892353, -0.065942849362023062, -0.0079351060474115581, -0.057893265858712836, -0.05400622028081925, -0.10458693453007292, -0.054179967940119297, 0.066989678608242287, -0.099219853272594943, 0.062446370884785274, 0.09094500180354774, 0.028277578410574628, -0.047069391853415257, -0.0071510316033549098, -0.050252538655332246, -0.01470682832330765, 0.095479720545435506, -0.11061849427089886, -0.14255959604920565, 0.026858767731697888, -0.1946544063779132, 0.18484819329409546, 0.17890314023634024, 0.15499366437705026, -0.028241535246141571, 0.04479597904441586, -0.058444080996440717, 0.013625007131520706, -0.079692834360266224, -0.11450496688056046, -0.12377645767247314, -0.065906435468448987, -0.15742481688127266, 0.12985425042057541, 0.20266035853202718, 0.038497383031025165, -0.025653639466894002, 0.075725823765211642, -0.022083431516520723, -0.085486667503959793, 0.032080522906880071, -0.16479464568215729, -0.22037943812265476, -0.2229737334363267, -0.38061125130213119, 0.12775872709984104, 0.31739568607954666, -0.015834239969060679, 0.055459428402900815, 0.011929160033288685, 0.024193127246187052, 0.090970615276012703, 0.16123203632279148, 0.0089117801154802584, -0.017294928512088706, -0.35854082366702061, -0.48144436153782677, 0.033786213483589664, 0.1209940431097762, -0.022527387589338276, 0.049459009623695566, -0.029490765269415273, 0.25612944261482823, 0.11469128278773146, 0.12808084965382249, 0.11403331019353928, 0.30506897046132081, -0.19904848217033866, -0.20053793259626246, 0.039641205203277907, -0.04376670404571352, 0.033609985206833295, 0.0098996640661796406, 0.11272141584817373, 0.18547440193507447, 0.1524434424661974, 0.06114521088463705, 0.11826241926353079, 0.12074606754768391, -0.019667238146597897, -0.00048386258516668057, -0.12175688660479972, 0.036172066069231526, -0.11868521523662726, -0.1250203703417119, 0.035904919227186707, 0.017839906841583555, 0.060859449561677506, 0.09635166317000958, -0.049212492625574339, -0.045372607382002661, -0.055897345716822311, -0.0023764214791030455, -0.038382865278286389, 0.0064116033781553214, -0.17558791205718122, 0.0023250224817987636, -0.051727259802616457, -0.057790529308374375, 0.013791061402471952, 0.13644846669520244, -0.010155313334871414, -0.017625717203356758, 0.073652902143451521, 0.00069328545240087552, -0.050008478647772345, -0.31927888126001952, -0.18353351499079812, -0.085538235823548719, -0.073096290012328813, 0.090190178210760405, 0.10660823241153998, 0.090351417639498541, 0.132917195679079, -0.011857357267916729, 0.052935295307996386, 0.043012618340511746],\n          [0.063687026559832702, -0.027474493344771159, 0.04079252412326359, 0.033944293702633618, 0.067493996598322739, -0.084202990537866812, -0.024906649626728283, 0.0091583686944553405, -0.068820170460425684, 0.0031107283830948407, -0.097108585049124174, 0.11878373624948577, 0.03710017079293685, -0.089402710046412398, 0.021829275829537725, 0.05069263318004659, 0.012340313923680318, -0.023685785769386569, -0.026839662252448132, 0.034846261621930025, -0.016166129228329065, -0.027864958300899939, 0.12115538210609175, 0.0037368644565901332, 0.13531841970369599, 0.021592046315438054, 0.018171005730945711, 0.015072771881264005, 0.070400883694442765, 0.0022893852554199817, -0.038531873505113653, 0.073412597254778611, -0.029637114380846583, 0.14796659731395348, 0.12294211400056784, 0.068355321789079659, 0.16846933987145341, 0.09208858358733514, 0.124710416844108, 0.069410300558010035, 0.0028282096799201462, 0.028941147392732833, -0.082405863861783321, -0.099340106662704333, -0.0023105045076858566, -0.044477583601388274, 0.0008809594027263945, -0.085099107788483452, -0.0064586485698500881, -0.044295114180264411, 0.10095939402980549, 0.14859114322412731, 0.14469873810179945, 0.078675636968335211, 0.04110277787821804, -0.185748731574369, -0.17064830498300138, -0.17155221512879462, -0.25171330168462724, -0.27337273571997955, -0.21265235556569007, -0.17172557194975863, 0.027527124955349591, 0.05618012242699108, 0.12158172746105769, 0.079338486628700106, -0.12195189294100098, -0.13969446903752442, -0.026572222761012301, -0.0741704803065521, -0.145127075010832, -0.11500093509170173, -0.18278877520622416, -0.24714583432028586, -0.13747760229803679, -0.068392610369592363, 0.098671592870279712, -0.16740306756901749, 0.075274076124663886, -0.0044961465547186386, 0.13260037497576577, 0.31234055497812679, 0.15517911386484973, 0.066459928203915386, -0.015467888667656748, -0.030267329366836557, -0.056259518407299938, -0.038215914691253711, 0.067128719543084317, 0.12318688834042112, 0.18468566964642463, 0.086525001219784597, 0.095783539484994351, 0.15930761904527679, 0.07562987308980218, 0.11756704875720572, -0.0760161520649867, -0.011817169363246532, -0.051957377094306409, 0.17488796559917713, 0.14148464642191833, 0.086956838317260601, 0.081058475663970134, 0.046958772348784622, 0.04918174254075236, 0.0034109923824553051, 0.015580943744111141, 0.026515084298382431, -0.062878886731464731, -0.056347428448159036, -0.093781274466081921, -0.23964397537244131, -0.13258713878159228, -0.084365859336627824, -0.12790680365138707, -0.070083706938090157, -0.044961907635326953, 0.049251298465303128, 0.072446618696754353, -0.016196819754861112, 0.10029423625804029],\n          [0.022794829328282723, 0.031855402221378282, 0.024367172994907871, -0.088290566246083876, 0.07232262276136471, -0.06292516861381596, -0.0040861461107614544, -7.972988029088246e-05, 0.01396609724411256, -0.025131035729871201, 0.017075722683559433, 0.043144050114759525, -0.077791172190580238, 0.048533511736318036, 0.007217025612539632, -0.035475136878956898, 0.035691767227550089, -0.0053752350421711753, 0.043053703162239151, 0.036425942921316332, 0.026331797944731436, 0.018922402485978082, 0.034424572379380902, -0.043306530520506897, -0.023769315918517941, 0.080993967723216903, 0.0014022744912380036, 0.06800816187289091, 0.095104587086617953, 0.10798396936955548, 0.024411086728309606, 0.043708025161000461, 0.056510394828046859, 0.038012989404389352, -0.016918964127942582, 0.13076340620049531, 0.11446285199173112, 0.21239109093247169, 0.28795590334995447, 0.092687450807731803, 0.096764008832141674, 0.07011596892193131, 0.046944677248436581, -0.028109521724954359, 0.18643956244021581, 0.077870719895705293, 0.11792219460655051, -0.035608267559333939, -0.036648812158749919, -0.13441333664206742, -0.1209205303400708, -0.15624385122841139, -0.17025727483799705, -0.12517931808717464, -0.14934420137275992, 0.15932332483022202, 0.04839021776339017, -0.10847969953324497, -0.12255999835004713, -0.19725754430522846, -0.15715530383375914, -0.21752678931536223, -0.20062628687872636, -0.092267339908223348, -0.020573472312880911, -0.071636670998092289, 0.063397599343820776, -0.10020592169765151, -0.15580361490286621, -0.14943697528943115, -0.11920849551682298, -0.081202276537251969, -0.11695355604037566, -0.0067283708261298564, -0.046837938954313707, -0.0077863170130979195, 0.019980965641957497, -0.121667094665772, -0.11522589823910821, -0.057471776109635317, -0.052229100647856727, -0.046891079021213228, 0.061574055807871869, 0.11811240080682403, 0.17401725345189034, 0.1337150650275799, 0.19272562298101481, 0.13837697707498475, -0.043682489526108231, -0.035940773077983296, 0.011031099888345858, 0.066035108027198322, 0.16273538350576014, 0.1001587158991207, 0.15018677215060725, 0.051560799730643869, 0.058405889573942382, 0.020232732914280432, 0.080342157059325445, -0.066884304721525012, 0.043091772020143498, 0.061075670741261745, 0.043764943962592874, 0.031379229244833627, -0.0054635333665592478, 0.039411450527978564, -0.017169301013184327, -0.027826140912018828, -0.0047148996567287563, 0.0361035243729722, 0.054667230314029543, 0.046239563591323717, -0.045456067930868489, 0.049402252710789213, -0.04766846057913162, -0.014224514341087915, -0.059509471495879943, -0.13173838602104682, -0.010384251552911242, -0.087812211124107614, -0.077603311445163858],\n          [-0.032355994688810757, 0.018326722847476676, 0.017295570021311088, -0.027670634962396815, -0.0076809391049930537, -0.041376685856530981, -0.015061630610395491, -0.043781136658973818, 0.036477149712398793, 0.044228566218286886, 0.18106239449231315, 0.042891343822209826, -0.020853245724294339, -0.024082163468429868, 0.041552139122004575, -0.014678545508214125, -0.040841976375840028, 0.017432021695089089, 0.0070216535002669556, 0.12929994168147696, 0.15511189221305455, 0.24789881463360725, 0.01524433890020907, -0.016082932861742782, -0.051589389728025764, -0.092487374266571665, 0.045744016738876361, 0.057516818919086221, 0.16869815200400168, 0.26354710842333462, 0.13879401206280972, 0.1425191292736655, -0.078455509137512092, 0.0045617718808213525, -0.04996569794639541, 0.080368671629425376, 0.050146780922382769, 0.06747673498101589, 0.13151901964758053, 0.16708907133321474, 0.014140597465528995, -0.095378223856770333, -0.20288372470514504, -0.39934020254115926, 0.018782728033396659, 0.055848444235998176, -0.0052730281141155078, 0.094883628210799084, 0.092662084190120605, 0.026342391088602909, -0.086838950610960156, -0.21345767462167456, -0.282107822115785, -0.14895903217754436, -0.15887716612865338, 0.014524384805330928, 0.064105061659619905, 0.015209021241474052, 0.094836346474780439, 0.056562751972782294, -0.16636322513631874, -0.24132070876596301, -0.25962368835745592, -0.1398205940714011, -0.15531689505376495, 0.011694908155279474, 0.032010611040571693, -0.037560894238744175, 0.066607787477416219, -0.0076642057689953885, -0.04070977708688811, -0.04226030127644731, -0.090011860309571437, 0.069266838681682319, 0.15114898488461287, 0.15845318802936526, 0.15653535363742821, 0.057963227558536959, -0.031603242011597907, -0.0055733045265627945, -0.063345205711261135, 0.014274572871990451, 0.031680599603069681, 0.039820176716201153, 0.093415859365416617, 0.11919257043750534, 0.03989717150118903, 0.1715005214515096, 0.0032916843093048626, 0.0044846669425230717, -0.021098541490893137, 0.025809720767491551, -0.13673281369087914, -1.2468117886521579e-05, 0.045303630981452153, -0.0526550700395952, 0.020909495487494364, 0.084789679870713369, -0.063339110924672634, 0.091376945056866526, 0.07252165751693404, -0.079209926148198551, -0.067293987453879475, -0.043909917127449488, 0.029396455943145994, 0.023947405883684936, 0.017167025821694201, 0.030553476010320116, -0.058621689983054601, -0.0098426856925661194, 0.20196311694537442, -0.023668678155415387, -0.014001946149787309, -0.03728327654318217, -0.023078128502029227, 0.015589706964187003, -0.013168968136987605, -0.031499036112030365, -0.039786236033770211, 0.054516325604152802, -0.040512968956863807],\n          [-0.11874501434881572, -0.082292851061515113, -0.095608167868605196, -0.020577868342219752, -0.051846289507618271, -0.010859373167837721, -0.022716678939708967, 0.12820642967693277, 0.20208152628630544, 0.10326830535107219, 0.19572108975580454, 0.018529266875907807, -0.062343764039584887, 0.036176725353944533, 0.041069933083660609, 0.0079762012687746575, -0.10314299674810966, 0.0064955171797952682, 0.12398900983956046, 0.024168115641601748, 0.030884610087337075, -0.074999137996260248, -0.040399947069967329, -0.026348341528788261, -0.0040063358136547406, -0.098214201253041297, -0.033435982999113351, 0.11941221649994889, 0.25555588605475288, 0.038960204213761458, -0.072604474132352964, -0.080306295039947226, -0.10380646122757918, -0.057320493242450338, 0.015515746045367804, 0.06255592200477092, -0.07382948751156268, 0.092347107622607685, 0.19891060046749282, 0.16973365981683389, -0.044617838703860296, -0.17458925689074178, -0.16855591416735904, -0.12959176095156721, 0.0028653211948725388, 0.039281815318144675, 0.051811040864348151, 0.054229861553504496, 0.13870864137978747, 0.27288253125832607, -0.31438783480893878, -0.43930197285264261, -0.1406383436455399, -0.11423051269906785, 0.04779660456302437, -0.065061505106159614, -0.0042604236376508481, 0.02946332359287078, 0.025104961380266577, 0.14743399932390186, -0.34597564760602995, -0.42017229785052612, 0.035072831557282497, 0.07959646999214702, 0.13322835735966732, 0.13339746737800906, -0.061957613945008899, 0.068920425307499353, -0.038536206573474313, 0.047215262988980017, -0.14334497896799611, -0.21161459673878405, 0.14176441081563174, 0.17098183292990443, 0.14174756095000518, 0.037859045933541086, 0.31085728227189657, -0.02922935514410599, 0.015150100201128183, 0.034324197511492696, -0.011781519634235918, -0.077397115828606117, 0.00082481393952203719, 0.042534961830221429, 0.04985424198595359, 0.13020790077736055, 0.20732411001715473, 0.070041942881345881, -0.037026860217250213, -0.031791667690004716, -0.064806164590905407, -0.08258662171950007, -0.074375301162423885, 0.01385894189294383, 0.15057409353019663, 0.13055028224014828, 0.023193912685637932, -0.079370911864438495, -0.076747220775197508, -0.056515387156161861, 0.070663010357839617, -0.082980693850575146, 0.03859091949287638, 0.03688503261834894, 0.10304253122200434, 0.02858154892479417, -0.11389454646540841, -0.023276097872029958, -0.02020813146390732, -0.14669512203229218, 0.023730566407701478, -0.018262941034164024, 0.11113049123798203, 0.017809780077411436, 0.20203876814616534, 0.050784801616453046, 0.061469567589563318, -0.0075507512091273071, 0.00039041405665547757, -0.14721537985673849, -0.36919673052117485],\n          [-0.11817248565975272, 0.050807995924907354, 0.027086462019090568, -0.058324085983108412, -0.069751886972065691, -0.021026807770255104, -0.0010775384566174273, 0.074350384938426592, -0.0083996536342961781, 0.024897232303854835, 0.087435612841062521, -0.019098985323464851, -0.046097891900699461, -0.039781451834335679, 0.0088894731980628458, 0.0075569224053487344, -0.019310705820979837, 0.055367812483190761, 0.044255697213517686, 0.003269187287821218, -0.010373408718694646, 0.072601121525306539, -0.0081003549893320786, -0.024375359119167946, -0.0051757404707577122, -0.007608303655937336, -0.038607745687823228, 0.092478375023070991, 0.00029773934680776826, 0.041278394763053186, 0.081715888790276012, 0.024739987393328, 0.18485522219427483, -0.025644712781172099, -0.025676231567332224, -0.069747146376060248, 0.054381153884765894, 0.049824898758326436, 0.13026732540299155, 0.17109724133509682, 0.059607917528576915, 0.0898551064946915, 0.095437277162761069, 0.15876422270859231, -0.059133757610202321, 0.090976556591518709, 0.095108813979450674, 0.11556486887071599, 0.17970536904884052, 0.033055045328156785, -0.035525492509829046, -0.10877929753051407, -0.05079396460228644, -0.076391322443933374, -0.056757989672368857, 0.13477312348229739, 0.12869357538617032, 0.13013531388087007, 0.0063887122121179842, -0.08972948672558663, -0.31295031978607873, -0.28325157301095855, -0.22477218093756324, -0.2145675780259611, -0.13307930518541367, -0.26981212419965894, 0.0050165855664531731, -0.080398088607170237, -0.085216248619270157, -0.18399362322745855, -0.23965470437008415, -0.12035412983362095, -0.076983583068044717, -0.018020432830199287, -0.023775391914850265, -0.10766179954942284, -0.16700211823558328, 0.015040770227884616, 0.042510381440078737, -0.1295843290841098, 0.029351080812140877, -0.019785888214935599, 0.12163685368807528, 0.19449321821046042, 0.18157312421218158, 0.13917958348474402, 0.036259259826054727, -0.059330356189887357, -0.053816217365371406, -0.058012192775396779, -0.024991060464911681, -0.039656092354391499, 0.16051410507047068, 0.14621181331244598, 0.076529241884836105, 0.20617689470457351, 0.086129886089688273, 0.23683312856300526, 0.17799588816524972, -0.031568685911075867, -0.011339033584039513, 0.0075929000196447577, 0.036795050434868116, 0.033074275171315504, 0.02413735006868855, 0.025795926857207403, 0.01249666081014379, -0.019552843326395453, 0.052849908133605947, 0.090518035422685661, -0.012948046871117346, 0.077671915299142413, 0.03560950915943991, 0.077328247554565535, -0.037094066672885492, -0.0047151073853557868, -0.059216558245230588, -0.13706040241569367, -0.084997996513450039, -0.2036404817250472, -0.1023980466551825],\n          [0.0032466543865972697, -0.0050619149620753506, -0.021817810555513489, 0.020873615011084853, -0.023531149044787023, 0.03236851492334604, 0.023279668597308872, -0.069079320177640346, 0.028858662573673435, -0.022912200910692751, 0.03504956758463669, 0.021373318115011183, 0.043177163021661899, 0.031000576507821495, -0.022727992508285319, -0.041130337906935252, -0.011956655086753407, -0.0073657698466143146, 0.019513062456004551, 0.05648936597537918, -0.018006917494647098, 0.023594044549755097, -0.060974710958634132, 0.13275136748820646, -0.02028861314235185, 0.093323469753408897, 0.18375935802888299, 0.093307762526131197, 0.017002171822373846, 0.029001128392942721, -0.032620309649792054, -0.077144466336661721, -0.026312985524931123, -0.03637619977745446, 0.030016539993203389, 0.081068448718876446, 0.17134303640361637, 0.1454521161962567, 0.14411586594973091, 0.25089534021606852, 0.1895315775753576, 0.10961959096303461, 0.11868995411865033, 0.097649074161421504, 0.017539178062786528, -0.16076583519696661, -0.08944189051045412, -0.1662700174191715, -0.19945945515698124, -0.12053950329957802, -0.099974797166572635, -0.0030787654511070864, 0.17592486845741467, 0.0094047611238743667, 0.24137587097504254, -0.10616945372175415, -0.041295263909978092, -0.18662857060598367, -0.10128658810243146, -0.15612237408478322, -0.19263459821003462, -0.26517496264532614, -0.21075478738597611, -0.15240183455933287, -0.016383869315923158, 0.10147080642825733, 0.0087661143103210659, 0.033117317571517424, 0.022841544673590577, -0.12277060576748028, -0.10456605790706747, -0.046810877427083952, -0.051309908127680354, -0.12955150951531408, -0.085883187288628787, -0.21065306139257753, 0.067423551686227948, 0.074090258222003588, 0.082147407869472167, 0.095756878907326509, 0.12800788880163314, 0.19242466407747882, -0.010488011809805561, 0.0024629531735309296, -0.014172878937930886, -0.069938838753530824, -0.071937788454647211, -0.07364200527100781, 0.031404273448011791, 0.1105219490341731, 0.082629216504521888, 0.072224220830742203, 0.081941428822504034, 0.14730626716129064, 0.1368836421937018, 0.093927882429139575, 0.026163487559181867, -0.034217252732886977, -0.096253676626479767, 0.052568923694275654, 0.058021118675766356, -0.069486623440566414, 0.10387349833640262, 0.016885436566802817, 0.005752374710489408, -0.033857627300573193, 0.099199719978274481, 0.0027587586225816252, 0.028883082517926831, 0.0077987727191536071, -0.026129748383045506, -0.10092939633783646, -0.059725181550862289, -0.16032203807483622, -0.026295964226010465, -0.081817026646661545, 0.019856334497422835, 0.011592637104098677, 0.033535731395388457, -0.037190296797926556, 0.039208766263747495],\n          [0.15105659815179459, 0.0077705624895111625, 0.040428021684616372, -0.0017942995443031018, -0.041653694509876826, -0.068590774376822525, 0.0062987842177157083, 0.026863472745659034, -0.032303950577093066, -0.019033355915254568, 0.0079979595266923831, 0.27835546979835657, 0.068631274711118018, 0.1003446445291738, 0.096879765477730584, -0.0033597601637389563, 0.054326134689200528, -0.055941674871638272, -0.0054187285410067509, -0.0077552385763832027, 0.0045759439983336231, -0.00017646288706738011, -0.0094759828186700423, 0.20486066918593301, 0.23125707799370063, 0.16313521549416574, 0.098539105674318173, -0.0099257073687919195, 0.053672343529954342, -0.088888704815857006, 0.023933003966042796, 0.012746466899076839, 0.013847645420023147, -0.39203581787528585, -0.21351183585569017, -0.17917201633539981, 0.010686831818043349, 0.16695352916474759, 0.20160459511575174, 0.16448815854770155, 0.011414537180906403, -0.026561248426133832, 0.0072564580788328503, -0.0063508243919336849, -0.16007115781686321, -0.15188987832197204, -0.22445870647203575, -0.21974868512281032, -0.14907696976575383, -0.011673426129634679, 0.10655889056027106, 0.1667289488285415, 0.027289163008064776, -0.0080445463310044318, 0.075809327117707645, 0.02383788693419224, -0.060318784128438871, -0.15808704038753496, -0.15079581692449417, -0.21784799920378062, -0.18411391886373429, -0.034761650797478574, -0.003078110011040372, 0.1443522382170338, 0.098191594014337011, 0.018899511324318399, 0.14330730009269013, 0.13334147887544215, 0.10003033854405316, -0.011990871182064697, -0.081183725373317125, -0.091853226128579088, -0.059061176343404506, -0.03070241061676092, 0.0091317924222779762, 0.030031451106893217, -0.029165609653882929, 0.11124860010301604, 0.10478624646896353, 0.060405900026046816, 0.13088294144967497, 0.094446823325321699, 0.046888440627548239, -0.099894170503190327, 0.00043866828312585926, -0.079159018990778859, -0.03095799592580474, 0.051180956797886826, 0.036532200341151982, -0.026313715866520357, 0.048771540558330301, -0.019626512408325483, 0.041811742473138486, 0.020274853199404738, -0.035311251861491172, -0.035700435347725573, 0.037776391130845591, -0.015390360725990176, 0.10246466374888295, -0.0044949551663046594, 0.0051588081839975541, 0.03834429330297548, 0.052952011747411765, -0.020141415030883712, 0.038911185997862419, -0.025809969050729711, -0.054106671252965456, -0.059080808671793307, -0.019798138018163675, 0.05184924826995934, -0.073763175158423316, -0.038340916613003422, -0.066879624217449418, -0.018985614490330482, 0.048710428169965542, -0.019808728907500892, 0.010561838400676829, -0.024562749419368719, -0.01514121795616151, -0.047958337256937988, 0.21088916658617063],\n          [-0.12519121067655439, -0.11688358418954034, -0.058961154017472692, 0.042235378754734682, 0.027384636957009777, 0.073378477292935396, 0.19970246516712672, 0.18078323729328397, 0.17754089590649072, -0.12635528181833747, 0.083209749590412954, 0.029824111195079443, -0.0015424767491013895, -0.016459376017527724, 0.077533561237047313, 0.00013267738458831377, 0.093750279161917041, -0.044726997300741589, -0.19635306229962388, -0.22782377363617864, 0.1158824654511761, 0.28944469131076977, -0.068772338411748027, 0.010802089827676834, -0.007867632781378895, 0.079851071307127916, 0.21292640866678078, -0.0089784453788348019, -0.068417876998138935, 0.022956354752557615, -0.026211043907313703, 0.057828305945572214, -0.079483020254072362, -0.016171715594615801, 0.062689315224603068, -0.021796237786981598, 0.12691374422028867, -0.04752547764539633, -0.049301283041039312, 0.048206477749446197, -0.2171608705725426, 0.02813017983255572, 0.12406052692394327, -0.086131120950002402, 0.07689460503666104, 0.03813505264063799, 0.011628762315091006, 0.070698493776356452, 0.0084135336178128677, -0.11267273154459259, -0.39754842405378749, 0.07304069354916054, 0.16994373683501546, -0.11001260539983146, -0.24501206201543754, -0.016540271332897986, 0.037588646441523585, 0.12220568704299391, 0.04683975277378849, -0.19361692505980962, -0.50340607287084882, -0.46224605745397018, 0.30127286167836509, 0.3851257612605975, -0.19298521871344812, -0.50882871676217767, 0.057766291481131202, 0.085915688210784893, 0.0025825469644762365, -0.15401989963515647, -0.081066644575465197, 0.13998594331352224, 0.17360289429870265, -0.0082113317756247854, 0.034164433476710707, 0.033688177254881144, -0.15383945741404872, -0.0035717910256200143, 0.011347483637652627, -0.017873166525061147, 0.039146796587724922, 0.1063684799467139, 0.076247636399764285, 0.13995849083497702, -0.12176042704433512, -0.064375482208107571, 0.022871601462242333, 0.20473954746266876, 0.014948129510764279, -0.039363453803276216, 0.024752228243803808, 0.062530143477564123, 0.0078273499345180124, 0.087539876894555071, -0.034542935964575638, 0.058746443283951399, -0.075126285975756629, 0.076597485120775147, 0.19454209279112086, 0.021682122234847927, -0.073488695501302631, -0.058082679101971291, 0.012328447567534092, 0.076038878132540511, -0.036913472724451113, -0.018862970847490845, -0.079316521304031273, 0.016093982880941032, -0.18419160468838913, 0.049226683231961221, -0.061457314990918277, 0.0282830319555805, 0.10422016934925292, 0.018036735639772688, 0.062905112558747867, 0.07205279732777245, 0.012387870117812391, 0.090730029290315317, 0.11439343988109769, 0.10142758766032614, 0.19506458179923916],\n          [-0.037471547940615017, 0.079003059168883338, -0.118094514839233, -0.011575517807246187, -0.047354837158948428, -0.043819905087823359, -0.02204068674980534, -0.015582330906619458, -0.060450140546324756, 0.0056710709178786414, 0.087342199767917988, -0.047484586855564871, 0.055578468629173532, 0.014640579783893624, 0.10885390788005234, 0.072560750440575611, 0.053636006213721381, -0.017555923047039936, 0.042133507853188069, -0.02906136252712694, -0.12501847301134028, -0.017196570903083498, -0.01339795071661689, 0.011501218082141058, 0.027702359090996088, 0.02741155292168642, 0.029974564956617343, 0.073364263125587581, 0.010914273919724583, 0.075409891966110643, 0.13043893685947877, 0.023410994104295653, -0.0048253685633425289, 0.074978432218179375, 0.054355304633943134, 0.04204747510162269, -0.0154640673353326, 0.022630801443203577, -0.063888237541103121, -0.040446308747273431, -0.11272446316765139, -0.077311881416412265, 0.01898064857748586, 0.079484126473140709, 0.042423015302388865, -0.00069403510352408077, -0.069229088452786164, 0.077430303792640126, 0.20473753110391857, 0.28719237966682659, 0.30503589992248753, 0.32550043922428146, 0.14073163480952872, -0.015200746246803488, -0.041860347134460144, 0.17135640555161447, 0.1527355824602927, 0.15944325028772327, -0.046360679758357518, -0.22276635585078641, -0.34374202605941701, -0.38756252285531489, -0.37352669157727963, -0.17546418763106925, 0.024941844858314459, 0.038533485282303062, 0.12621571033694096, -0.29897191326894157, -0.47416602764115157, -0.40533769987763618, -0.044666674782561915, 0.12588265080168398, 0.1850321413968945, 0.074481724923722986, -0.10021514102767744, -0.34731763668724608, -0.099282213883217618, -0.29837506102690192, -0.18662023586706711, 0.035652126252033491, 0.4013035269477947, 0.06080080045364062, -0.020916204012535085, -0.017432090909172804, 0.0064526884627329265, 0.31447123310066399, 0.27814266592693648, -0.042857339346656316, -0.10711074543649843, 0.12304888506893627, 0.34204207221679617, 0.11781479381803128, -0.098207505292465483, -0.22534157766971744, -0.17336955460421499, 0.025185350745410999, -0.11167805937105306, 0.2142012132418766, -0.043950058435965438, -0.023906769270708315, -0.065584638845817445, 0.092040652752376897, -0.035310034547302485, -0.13396895532331693, -0.03899490443982933, -0.12154265439434478, -0.13006356630340574, -0.17041731619250497, 0.11042010979150567, 0.092651247387164362, 0.13111238457685057, 0.058001891637747924, -0.002652110312396515, 0.15722347821642979, 0.066071308703285564, 0.039488088992435756, 0.039274482749949047, 0.19071883885744992, 0.10773181848300134, -0.02812558988695802, 0.05797883312162265],\n          [0.14781185661120058, -0.039386331432373266, -0.022921264342725164, 0.05388189603876585, 0.12598813182555718, 0.028202774466358597, 0.0346074867144123, -0.042381312562632507, 0.03884963956920999, 0.036410085655850757, 0.16289756506012004, 0.089845238615583675, -0.046052810070111194, -0.082095780414563016, -0.22396972511791116, -0.11679212172424258, 0.10053680749504602, -0.0082322488230325598, -0.010907332253094121, -0.029537833982867273, 0.004945131369650824, 0.10219160122974023, 0.18663745104851179, 0.21337195182960642, 0.096928017302127814, 0.082225401499670267, -0.042534134329079154, -0.052259406449906821, -0.020309120595503272, -0.10672463441898887, -0.088221307987328218, -0.15579389025604545, 0.23092722621811365, -0.079955537176635005, -0.13801119251604682, -0.056966288552968501, -0.28523441407005473, -0.0068234259848855387, 0.2637658797263801, 0.035256610529995847, -0.00096948078976237528, -0.13354739530762744, -0.095292234694563882, 0.10809316225785848, -0.22622473692942502, 0.13750964405633209, 0.30588685236073848, 0.47089738278075627, -0.26225597341681434, -0.24291657949567241, 0.22231836629884105, 0.090543741709712147, 0.043301288770093399, -0.055195333115474088, 0.012450074560341884, -0.48338662295767298, -0.41101568836876001, 0.015182853563479719, 0.26867003611558071, -0.18587591997040018, -0.65746047656761675, -0.37080281699249629, 0.26181673556057816, 0.20685619441423742, -0.062913466536091131, -0.0046315163613586535, -0.3460271088384187, -0.057875831473219591, -0.080073663390408306, -0.060732968283770707, -0.063131722240472088, 0.33222972618047136, 0.16004023907285109, 0.084047102099867474, -0.02976989350386039, 0.045421274875539708, 0.034504304163254118, 0.37536242338238812, 0.088935618162099092, 0.18255926007618903, 0.079936172529676358, 0.2352440711079648, 0.11129319261560268, 0.10974139035902221, -0.04722071086520177, -0.11616310797947724, -0.067309805824712979, 0.034599132623224643, 0.23285705965606096, 0.13190349282962149, -0.041749284399034449, -0.18971912136060662, -0.070314124515462983, -0.044339814683120031, -0.052799114165529494, -0.12425748565008495, 0.045487854774525521, -0.13703396222511421, 0.059172195354677021, -0.056679024139974353, -0.074184736695846645, -0.096952474536131261, -0.021836418526120411, -0.065731207012367593, 0.021349416929545006, -0.083419025939874075, 0.052566367769086797, -0.0026602316535740966, 0.03873498024493624, 0.068175817228078084, 0.22646127086716095, 0.082890232397643551, 0.035399054654756332, 0.067320652970741954, 0.14239677197520148, 0.085138769088166116, 0.050369804354669645, 0.0010887532169456537, -0.018280111009442837, -0.017225924618171629, 0.08422037289529935],\n          [0.11800749409978381, 0.048641544731680905, -0.10678911358350332, 0.0052911179909213013, 0.23136181762806476, 0.17221088012028055, 0.17682279225882522, 0.20044631087373868, 0.052122439652192432, -0.1402595079578749, 0.02243868573975058, -0.019828048061208629, -0.1373081753593374, 0.092577186980583981, 0.20995915555570394, -0.16372378150074623, -0.15700734079198975, -0.1736927596916677, -0.058053772103850598, -0.0157237265316914, 0.019398599613700079, -0.049310374137502805, -0.11375225205060403, -0.014247453019732223, 0.070739494942123643, -0.088327713510229194, -0.13682329114661984, -0.078888479596802466, 0.053144758392313945, -0.19437922851131084, -0.0001706889902193115, 0.13424778030432938, 0.0093320725261308857, -0.18143139441084224, 0.12020647648261903, 0.2963908916390815, -0.0090974650834537152, 0.039855885453729201, -0.08463057056034079, 0.036931552840693979, -0.14788894891447979, 0.19686627422843606, 0.40663533420008574, -0.14336283673708961, -0.18437286091816663, -0.0387524786508332, 0.29570661700880807, 0.053688982795111487, -0.19564754353990196, -0.34486385728508229, -0.50121307000769089, -0.40626297518108834, 0.13382493808540968, -0.00028761919063780006, -0.20091903070867112, 0.11021116432324056, -0.18695906308384752, -0.23952005130108939, -0.18820014759183346, -0.020408212645899093, -0.10626227681963624, 0.10776229335456736, 0.19941878614236833, -0.058276572887897449, 0.027521741134965361, 0.18134851852604528, 0.068694879008434961, 0.014109730230775254, 0.019795706580671063, -0.069519445032426547, 0.085998705252793864, 0.25121683554261642, 0.24991886206451533, 0.20675478705920156, 0.093802467043084675, -0.071505683581074439, 0.083956608622508533, 0.042664222469544988, -0.044897975149803877, 0.075633229451364206, 0.18470969085810693, 0.092312097921409986, 0.16477123155033629, 0.067407467708452601, -0.035391492159634129, -0.10051173548067931, -0.14948457456306743, -0.0859115996358253, 0.11899616835413444, 0.022232039948935078, -0.059604180367185379, -0.083714134795981943, -0.12267228192899818, -0.071817553655208671, -0.061364854031334182, -0.037122355027120003, -0.024043277802218023, -0.0077183350586837451, -0.027902500393156213, -0.070228976844589688, 0.067283048218790914, -0.022096929111434786, 0.030068653546629937, 0.016508794156056245, 0.0079910228125650851, 0.053657963888500304, -0.01697467785547141, 0.037888483605591022, -0.10340431444912367, 0.093947011691645294, 0.17568681512805212, 0.053193274463334841, 0.08332828325168111, -0.012241690018234677, 0.11152581385082602, 8.8777513975901723e-05, -0.005979464667969045, 0.079576229035330182, -0.011219166299368227, 0.13062677267175682, 0.13093666750650848],\n          [0.14423093057173975, -0.01008076678423761, 0.0073771044594135079, 0.06526902731825053, 0.055848605823902463, 0.052363879757229073, -0.022518577948855645, -0.0099854054434987405, 0.0074881193579894086, -0.0076370273996572077, 0.095115364997393592, 0.007486862308122141, 0.015230162163870492, 0.040217891425159108, -0.085367149632064321, -0.17282741030837942, 0.011588285357802999, -0.058982003588632453, -0.091214201593042485, -0.05548553721852835, -0.085056179953925282, -0.012889357099271234, 0.082191503484511957, -0.088215541467796518, -0.17609926241410598, 0.020767875260274078, 0.2973162999706101, 0.3447305749860291, 0.35075038554356563, 0.1675765045908931, -0.084317445336159924, -0.087650324477682576, -0.0293005697765467, 0.0082197597979237341, -0.14178517944724803, 0.20163787497778121, 0.30622658040655926, -0.089834272556955141, -0.32991154377532589, -0.23770186950896088, 0.14059485558234217, 0.22935018848257269, -0.06954897481239436, 0.13056609682447454, -0.031497286218108517, 0.0079273791460638954, 0.084811544151839932, -0.29146270301832411, -0.12913123455806388, 0.070966051055694937, -0.089486674726494908, -0.076857196283176318, -0.031866717999322773, -0.094905571386768056, -0.076821230076016489, -0.28837628451753605, 0.087799542000800465, 0.20019432782413554, -0.17096915847133118, 0.015333878953658897, -0.28908252284426406, -0.029526689505982969, -0.31385369627251253, 0.043040218080409316, 0.45576781944785838, -0.1807055900807637, -0.13846940283256665, 0.042622648402573862, 0.27231737835653241, -0.1914801913205901, -0.11016274974475865, -0.1176991482916686, -0.20542229438804735, -0.34623488704400734, 0.23754568531606332, 0.28599972207005381, -0.077962987774282691, 0.034879273993081605, -0.026162450274433972, 0.12712327036253446, 0.14403182667963604, -0.034148887052881882, -0.088550823688096886, -0.027745606072896507, 0.12772199691917124, 0.10001931959841266, -0.18643104606782843, 0.041460676340255576, 0.057714352211809129, -0.083881954200237321, -0.08331277637087868, 0.026147419256119429, 0.057512048083849625, 0.098776858052545713, 0.20838336844764122, 0.081416267386434524, -0.031359090867443505, 0.010864074615252003, 0.054167724377707081, 0.036335766553862711, -0.037734056827963769, -0.058460234722864275, -0.050705505416570866, 0.072100006992938254, 0.077237371527939302, 0.032034189952567169, 0.083688285950466373, -0.018740931617032101, -0.068236920761726133, -0.067252452363989135, 0.12643108826975322, 0.092411361850814722, -0.032832183242141391, 0.10360749350388331, -0.020641674722677181, 0.050396061289050213, 0.014052376131391174, -0.024231363336231871, -0.050093755663369793, 0.02935370249151292, 0.10979499165058046],\n          [0.06063756206193438, 0.01163357669854459, 0.114137229829593, 0.11754589579378544, 0.020855057347248462, 0.10974930449157309, -0.044990292936782972, -0.011032547892272426, -0.053612766250269506, -0.044758197602911942, -0.10039035625686599, 0.13435448459204191, -0.024159164234305225, -0.084524427779703759, -0.091960375514529014, 0.10788802496504861, 0.045998078232354078, 0.055275005037989197, 0.064358819860857688, 0.015789766512200487, 0.020929919215574633, 0.040826832309231398, 0.13163339908596128, 0.059409419123521795, -0.026657113464773563, -0.14316517070653423, -0.105418542401858, 0.073237495897091331, 0.082433610114087633, 0.062596323749943172, -0.0031044464340264921, -0.085840139114289393, -0.052855154813073679, -0.058037038079642167, 0.029721950798359945, 0.092669209363733129, -0.14987389757269964, -0.13353796595923728, 0.050257684298183003, 0.014996004118443262, 0.11313878950895426, 0.052153057368792013, 0.010577754712894294, 0.013768087181216748, -0.23145094612919812, -0.067586869609837341, 0.14187556860642475, 0.21502139869877795, -0.23699602207891432, -0.28070386994651997, 0.02443305911955751, 0.017265628634335395, 0.017657686358856672, 0.026414327638663804, 0.088077975768645664, -0.19378616438963833, -0.33747330456037095, 0.10010384808690605, 0.36813409114715889, -0.03425924318529136, -0.51529004919317145, -0.21455976987161104, -0.029064252143607, 0.029684271548058694, 0.11428024956830421, 0.035997243237144733, -0.31780545305858621, -0.038939002809603523, 0.17082631104569121, -0.01983209806788927, -0.015434962482212933, 0.2106729777023667, -0.062119854775684574, -0.026936094188691473, -0.055531104083698879, -0.025879857930813016, -0.056537020588972059, 0.082251513253328801, 0.13249378757784364, -0.050895123398873254, -0.023068884844874127, -0.0065804143547715382, -0.029028619952673668, 0.16670678797071425, 0.037287239549273613, 0.032006611053345235, 0.022985541868513731, 0.033097970061269799, 0.25106958648152244, 0.055247679841358477, -0.078427286178819333, -0.065179530102563055, 0.001902992764642758, 0.015118472262848806, 0.031629329933778927, 0.074470568205687399, 0.032407934317240886, 0.033762676771467104, -0.055109213717668359, 0.029518107237236926, -0.0055725182709008697, -0.022571921481206444, 0.0049782603577565171, -0.034892861951486748, 0.030152277838361469, -0.046317536194844577, 0.017217424448456212, -0.090595438047663929, 0.010986708242086585, 0.01475361802999256, 0.11880942290428557, -0.018853830715500133, 0.054570000910600755, 0.052880256948674695, 0.083387882797340704, 0.068291238632331608, 0.06359772129360039, 0.051886923283943703, 0.083087116244159473, 0.021602565983420394, -0.059861424749677705],\n          [0.090807144739521728, 0.044777130492487688, -0.006004236596012319, -0.050363433256047141, -0.038872008341752945, -0.12117244583538275, 0.022973279126560026, -0.031712447829596702, 0.038054148427954987, 0.0045987409431256232, -0.035659664256043694, -0.035674765832077376, -0.092990150201568755, -0.039162611712276169, -0.0069043930890978211, 0.0138362499846926, 0.030660708367506589, 0.070549138758469826, 0.029410046912296789, -0.012521892141359542, 0.051323314480405155, -0.0037634551331882926, -0.070013831056655887, 0.010860732256468469, 0.032726783187564529, 0.13748613225137779, 0.058183973556349577, 0.13750969320900669, 0.078720320702839214, 0.10378646515411444, -0.028949114370941081, 0.062081587953289247, -0.036944529962483555, 0.11289672176654392, 0.034425804553726264, 0.044915048986542611, -0.057007183048689347, -0.15438271229617534, -0.082871023728730175, -0.12982282763653841, -0.043611665688003953, 0.065964351753196288, 0.036324136181226305, 0.063713986037557943, 0.021735179394400311, -0.078258563769408679, -0.036956657136625479, 0.13355366389737111, 0.28201274882919508, 0.32487155668793438, 0.33827072272042519, 0.18538129082837551, 0.073223331977013348, 0.019788327920499546, 0.13765137512483783, 0.078068271126673666, 0.085180243301805444, -0.069125794874328461, -0.090878572811101455, -0.22904348013123638, -0.33513853608255195, -0.34107144821645707, -0.35147873150944769, -0.1429837248305727, 0.07534805803134563, 0.14776217747988318, -0.045855701305787699, -0.24152324430590322, -0.21753420627734718, -0.13093602087760289, 0.020511261336832037, 0.097671657751413093, 0.14601331736207362, -0.12506767652167178, -0.37252357673151071, -0.40823904893654289, -0.045905807544792537, -0.1600759086755924, 0.07937818266133348, 0.3143974221346838, 0.19157945898080572, 0.029030655452761761, -0.114833479865943, 0.076726138229785495, 0.30135114571366528, 0.27545746842581786, -0.0068620750320619456, -0.36522476092942752, -0.06701923494448854, 0.20620489038853418, 0.052499913955829466, -0.13265239911713711, -0.078950246082188896, -0.20641980579765501, -0.24381499902372766, -0.086797680638089778, 0.23653031161361043, 0.22019310254213031, -0.036973082188424586, -0.049162482847655051, 0.14625921591989249, 0.14505339243853665, -0.22743035761938601, -0.082066104556589428, -0.12119372823467633, -0.043181682543043637, -0.098016045425190226, 0.029470016170797184, 0.13747267623604109, 0.0062917025392471571, 0.16322306590540175, -0.091363535583626032, 0.073287696619824344, 0.11422898762272718, 0.085210422866565244, 0.15331572095963925, -0.072660538227662871, 0.20466593159451976, 0.026700931142256593, 0.036011074297831958, 0.078827707903718985],\n          [0.18112261990369827, 0.073305524770505379, 0.040735943579691819, -0.030592173175515824, -0.014723051663569992, -0.009717724172896347, 0.12724950542153152, 0.030397078051933549, -0.058889198178995419, -0.026611166982695778, 0.066681046712227979, 0.066608088167588356, -0.071918745225061601, -0.0083165323796249163, -0.017286314033053696, 0.038602764286622113, 0.067083551068678124, -0.070282103290758444, -0.069690686774509569, -0.025274574618584636, -0.11014662057019094, 0.24938498020809974, 0.13937639935994262, -0.057197841279870723, -0.073330994310649739, -0.14479112276604489, 0.052420027937541525, -0.12934942016932524, 0.030685317385975658, 0.061611117116273553, -0.10213214383142413, 0.2239301020176982, 0.11685706457732412, 0.16687464021324355, -0.11110520756446859, -0.17122260866286426, 0.056581869983290053, -0.048939035687679822, 0.15917940910095132, 0.19178174933281159, -0.34144279330828603, -0.00029346936519335232, -0.046900947355914019, -0.19493783020620092, 0.045412349490724202, -0.0095033676128255251, -0.029117126455099909, 0.041409793887313237, 0.23150478397061292, 0.052448688728174223, -0.56727135983775523, 0.3002926921538524, 0.46090762088909437, 0.068318962350056037, -0.37007579263516616, 0.042656412910046834, -0.13943043649625064, 0.11478477562923234, 0.26740569898461908, -0.10448691247946103, -0.66827654091869537, -0.28237532775707574, 0.17754279911040999, 0.17370357234732237, -0.17216489065584101, -0.47505336754415434, 0.054836276830569283, -0.030162397455766779, 0.068492907597162797, 0.14670950434159008, 0.0071731840592088869, 0.29965767091965445, 0.20250028242592366, -0.17784337927349159, -0.11561865754268655, -0.1332395677790339, -0.097221853473992981, -0.028986446755459486, -0.035807336045180493, -0.10615355684023776, -0.13901885393191493, 0.016240710560221847, 0.17310497729481505, 0.19618607123165227, 0.11531910216918494, 0.085863326480380184, 0.16627387139600339, 0.31073734902957373, 0.046358990626833282, -0.0066805547685416106, -0.11949504899391879, 0.049149985727881776, -0.11684899113755934, -0.077621953166553875, -0.15566484457471233, -0.042823410792438815, -0.075958529389046639, -0.047231781924106236, 0.18266592599709178, 0.10710563631894213, -0.031804445585158589, 0.064099712602439879, -0.083339571598682299, 0.088606450058975411, -0.049001943443667206, -0.060791129502278038, -0.011938566068193671, -0.02896633660169206, -0.020442949029082044, 0.030720122959175578, 0.060613751104797636, -0.039897663267117758, 0.063701418129868514, 0.047368750939173282, 0.029398381107522881, 0.10605597723541271, 0.087012599833984572, 0.067143725554758865, -0.017892266631649029, 0.069807565811236316, 0.20793552791413253],\n          [-0.036185256591647091, -0.068423651398025559, 0.033948269018981292, 0.25798065842164275, 0.055754688409832748, 0.14928617791426527, 0.20629310863112724, 0.22367188663579815, -0.046033543143111158, -0.10954993360673064, 0.12202419922148086, 0.033686025185198282, -0.11811717921720266, 0.12833540839950633, -0.12897362866582851, -0.056304284939988458, -0.29473302723096206, -0.025196026459084302, -0.049804206349577773, 0.052953771957786361, -0.067019497571920966, -0.068226576443395942, -0.047831454949617075, 0.026913257256672624, 0.088734110838903008, -0.19263180519366901, -0.011955075780035074, 0.086306410506485354, -0.16802175795413904, -0.083379279329359596, 0.087895961497153119, 0.12511813454172754, -0.12767661265744493, -0.21930070432606474, 0.40484999864474031, 0.2168179404643775, -0.07267430101361208, -0.087649129132667633, -0.11089339548416925, 0.015296021762153431, -0.11229804131529554, 0.29574346278635255, 0.080991374361556789, -0.1694969856716752, -0.097181118387015888, -0.076489518459058936, 0.24095855252989079, -0.24206344311267508, -0.33278560146628966, -0.40823989525531124, -0.16983118669484359, -0.11497220840475923, 0.28957955830284815, 0.028529279547082176, -0.048023491796640019, 0.06300024473077781, -0.030721874577941871, -0.066963046815232144, -0.01101372815939157, 0.075931514278543541, -0.08086212076080368, -0.16771239481709987, 0.10099670337031591, -0.24229068894050565, -0.31554893398183759, 0.037389060449040057, 0.15550442487747781, -0.021450780534793025, 0.078024125916309389, 0.22670078648533437, 0.30001803369505781, 0.24803967528041221, 0.095538681661574226, -0.038034563476046522, -0.028631619824097732, 0.0083028097894310426, 0.096554125387373055, -0.093655781707343108, -0.17003471525346986, -0.046727860698759775, 0.05438730002622244, -0.011590570354357996, 0.19038974433125128, 0.080097088742329736, 0.18123484236756301, 0.11932337787747498, 0.021024215763941437, 0.0092451671870699692, 0.06740553047068025, 0.017941188287962664, -0.040749800063489494, -0.082440526483723894, -0.11871195451512397, -0.13318249702629348, -0.054036326779098989, -0.081001677321437121, -0.026663685971886258, -0.010406736043617935, 0.076209039356496408, 0.011611786985809086, -0.0056684023812064444, -0.030538187745098727, 0.020575247317142609, 0.053927702112941525, 0.047348833795707576, -0.03821865610616923, 0.034336636225753531, -0.00018565997117961364, -0.026356654841611753, 0.080691162917547063, 0.12906802891828614, 0.05459184679453908, 0.056561011261114173, 0.048193611888173539, -0.032352041989720359, 0.015293367697285426, 0.016804531631558026, 0.13319266151582276, 0.0038584083011071468, 0.11727652977520774, 0.10128996888306026],\n          [0.087039001828216278, -0.086030861922398769, 0.02399938271861143, -0.055000802538298317, -0.045275456153332991, 0.02871882797765658, 0.023278548014906846, 0.0072154124696548489, 0.079226988438582377, -0.032632312594033867, 0.15267091964537238, 0.044269487995447235, 0.10051883763832034, -0.11766420459825427, 0.067446412530414279, -0.016434712072576442, 0.030052598489340509, 0.10105556654675149, -0.10170349865733713, -0.066476723006283572, 0.012013167877748929, 0.0062464935422486007, -0.057659973131322387, -0.11952174430584045, -0.014950531682345641, -0.030954419784185765, 0.18711958320008767, 0.21588294444934941, 0.18760853314788856, 0.095822570293348813, -0.040221853955554603, -0.073249810582964661, 0.0042778218861511397, 0.055781737968025463, 0.082192357333136706, -0.012445928409250004, 0.17705102429087519, 0.1158017657021186, -0.24107364819029131, -0.085836786800409015, 0.1500735566893015, 0.2849842667051099, -0.14535341708480665, 0.010094356111924016, 0.095916706708640942, -0.29873458100190536, 0.17874640390204541, -0.22302317330187477, -0.1748799384747195, -0.043712845610052481, -0.11620374099610192, -0.23806617911756578, 0.0043003795719866941, 0.054212231978947381, -0.11567683342313427, -0.29339006649020949, 0.12100456390445283, 0.44189519506953484, -0.15496760773507526, -0.022722335616015554, -0.21405336749991405, -0.020547287844339426, -0.27084401995117324, -0.095044199035620808, 0.28060020656129225, -0.27074453207286275, -0.1368725199810682, 0.17055001589057026, 0.3385971361439663, -0.27109736561922526, -0.35586064666592582, -0.26534732401781719, 0.082943137915921422, -0.35846678240511359, 0.34730776588311096, 0.15494380599014224, -0.10539865152649901, 0.094828052386711173, -0.10941051423376011, 0.019908568726464734, 0.13261552724999176, -0.049724811043381112, -0.10696620165908551, -0.25438708553660488, 0.17440858544741758, 0.106900230981372, -0.077671145816967782, -0.0093718677367089637, 0.11752430326382256, 0.025752119860827101, 0.068028195805426836, 0.109859958346973, 0.19781198384741466, 0.20369617905172333, 0.17359025162546643, 0.16858127865343278, -0.071588287733521772, -0.02785843176203006, 0.026995181216372979, -0.04796739911574098, -0.17448260318173581, -0.096431568764831985, -0.070820859598049485, 0.12975749185900132, 0.10168587218941928, -0.012905483555157513, -0.0072144888762498138, -0.076308659554720201, -0.07477688141721188, 0.049861846430829346, 0.13897204424792844, -0.016419927285720337, 0.087860802033879568, -0.035559429860732017, -0.03426567268440027, -0.041158346357247827, 0.11153373670141298, 0.021064007443562835, 0.066653748395789317, 0.031122571004505259, 0.21873333106656628],\n          [0.024271907098944792, 0.2115259074770901, 0.10968836638996259, 0.059160601041090916, -0.042249507377398132, -0.087479837752595893, -0.010602704832708497, 0.082454879411166984, 0.12207559803506536, 0.17548011074082592, 0.04848664317003136, -0.10566377044967423, 0.0072712864412497608, 0.0048264824945599694, -0.037108321821793577, 0.036969189242625711, 0.05926595272339992, -0.091124279486143517, 0.016031767906761155, -0.026239172447726146, -0.059021935429157561, -0.088672703904945402, -0.07726406615726103, 0.056275133223160842, -0.051047381915993131, 0.023387814606544439, -0.017324327411277735, 0.012251187743591036, 0.02566561133241816, -0.020852848518282376, 0.0066968345396523909, 0.073686269601061574, -0.099902583451108237, -0.12413190403188956, -0.018048937015446576, -0.018586297307219612, -0.044793005705344127, 0.017307608148219817, 0.10244118561809155, 0.00032799800220171399, 0.0064671351799718869, -0.1022459225049749, -0.025294477732110757, -0.034441569418776949, -0.12789282327046789, -0.022149310544806594, 0.014835263850125215, 0.12138287707221934, 0.031882958581233231, 0.032470116515611644, 0.0090956520749568559, -0.063478661603039985, 0.10606577340598457, -0.099169451323734906, -0.16381989457362639, -0.14343340117378295, -0.032182651726264416, -0.058018044565288848, 0.022916145133555329, 0.040150146384349723, 0.10591359904659681, 0.1170336117688416, 0.051143184046494997, 0.024664034757263892, 0.022331370571566023, -0.14794372876832823, -0.046225532247637063, -0.05297556705197623, 0.017633358715772832, -0.083088039795379154, 0.039154465132006294, 0.083558775558834938, 0.074371516444640615, -0.010152289765342187, 0.0052220614930217485, -0.094777308466158713, -0.071076534981956443, -0.019630080815721984, -0.04040811670233907, -0.046652571732075071, -0.012628590876755261, 0.026326307291913001, 0.057107467446696494, 0.091724178404241782, -0.0027241597818778163, -0.15413869342653225, 0.04417172095985869, -0.037480373466733836, -0.05858180541180702, -0.10281951751655544, -0.030064069517148434, -0.030479321832951416, 0.092607838224174358, 0.044944678809903021, 0.045404097144968888, -0.010356704162888877, 0.0060040972999510778, -0.074053150092477205, -0.041776885656914911, -0.00050145365557355964, -0.034990913951661012, -0.036125660846155677, -0.045100434109200879, 0.025861248849615631, -0.053218496064615241, 0.012117104458325631, 0.12779186353261135, -0.16438404194145712, -0.012740091450395306, 0.01918508147926716, 0.084770906418973543, 0.019614329268121566, -0.034807211174255628, -0.0017216001979017959, 0.15755321182059503, 0.005374991982287608, 0.039443870135585729, 0.14282549594886118, -0.047934404701260411, -0.10055944078648103, 0.083257395587425245],\n          [-0.12767186993116422, -0.06241249849097049, -0.094140716145740932, -0.064796146543488364, -0.017809834236761531, -0.069099772207516424, -0.023074608267024246, -0.017483825565269805, -0.066452845435443095, -0.036871983239677726, 0.24167468985862534, -0.043100584664250055, 0.08879797960904616, 0.074578914712187833, 0.041306113766767155, 0.04109954163943659, 0.054754800348057686, 0.084086640696184295, -0.0097247769253423731, -0.049452947316442196, -0.081132742094774932, 0.064802809772454922, 0.05833403551933676, 0.048858263974498307, 0.0030690275504097336, -0.037721688147944021, 0.054194193438541857, 0.0081353567184947462, 0.012381719155275236, -0.008132915823203319, -0.053456058684966092, -0.091653069394634301, 0.064630353359554749, -0.0018237773961607869, 0.079983168612036179, -0.085168321622783483, 0.078833820035233801, -0.036841407005709259, 0.14405274156018966, 0.015136780025423867, -0.15091802612252794, -0.03598558709040784, 0.070900917613708564, 0.0031644970002940084, 0.012721805049422611, 0.017055461026181423, 0.035740435535686108, 0.020664246268072436, 0.28800157393241543, -0.043946476897746549, -0.069904503860334685, -0.028875975086598206, 0.013241447478979717, -0.093932780131541327, 0.0073548190708109971, 0.021222759365131662, 0.088674320104961624, 0.15572293451123756, 0.18553868377788824, 0.051415801134578276, -0.30813751116397192, -0.15349895484431902, 0.01561395969351688, 0.033258092794341457, 0.0072740466714379393, 0.068545921699466134, 0.15637538018177105, 0.027911256742741787, 0.1847624277661041, 0.017476811293658551, -0.32882514199767582, -0.27338241826081056, -0.08244213190925273, 0.040346052358642762, -0.010354560475994028, 0.048333017143236193, 0.10853011009473441, 0.20222782945874304, 0.060163816193484057, -0.016735356900245406, -0.16834359646244612, -0.29914164075483063, 0.034354440985680856, 0.045517620346114396, 0.020287847648788881, 5.4206367187566162e-05, 0.055521485631890424, 0.078561317020316615, 0.16849991072472859, -0.070184288770934952, -0.079488584515101129, -0.29650023726543373, 0.10263152418119534, 0.11173763966050175, 0.13931259707716614, 0.026570560269986006, 0.081658242149475119, 0.081827919547926536, 0.083098416955329532, 0.11143074354409321, -0.13932942872613946, -0.22917697770142686, -0.064351927083360766, 0.16181167668638935, 0.25167259170475459, 0.042480647223290487, 0.088318184963021157, 0.10703227267716384, 0.097667451839827321, 0.24656917917661206, 0.00077543877160522051, -0.20364545582535332, -0.12891190757060239, 0.074371886138294263, 0.25015791541828036, -0.0027411825679765148, -0.091129709053736851, -0.23136145870314523, -0.30385031086279557, -0.14845722077749013, -0.10313261555912184],\n          [0.0047305556866473752, -0.025050870591785984, -0.005842007282679279, 0.023076556888947108, -0.0021831092635067884, 0.093205071661306538, 0.16891912625347902, 0.13474245274119315, -0.019108929587973292, -0.10105317234996111, 0.062619436337983753, 0.016839567168991848, 0.011719509323776495, -0.0013487517864658599, 0.038407227731668533, 0.054230563051407069, 0.20955349223966924, 0.051310567307636279, -0.17892491374001546, -0.15156726115951782, -0.10802521892872952, 0.021081696304648248, 0.050526595868324198, 0.037028535648191252, 0.084085596639643281, 0.097194453007745693, 0.11629929727819752, 0.10291870790396596, -0.16562571881514881, -0.29210660437891028, -0.054202915411147468, -0.025850956821510424, 0.13697807226452141, -0.071432726430219529, 0.10357501123134705, -0.058266512397853069, 0.041898607209367007, 0.12303154344508641, -0.1285936576462311, -0.32801177977089907, -0.028641152078696178, 0.13915118347077776, 0.070612445915567146, 0.17863196007696969, 0.036740485328499439, 0.082604223960309545, 0.0015218003492134188, 0.093695825356748572, -0.11859178530895662, -0.24264276329284795, -0.17081519888982888, 0.31937266012049381, 0.10806272202525118, -0.025075843766076897, 0.28906166338986189, 0.16912014921604904, -0.005992530361836397, 0.11216887671301161, -0.1176651180296165, -0.05510479012461407, -0.35074938302019909, 0.075521671212450681, 0.29101950812834954, 0.032924045727232419, 0.073924910009075834, 0.13285512889163054, 0.1103248869067967, 0.017465838707485977, -0.0088770703779607191, -0.12337468108094925, -0.026449945142423825, -0.032574433800492478, -0.17411766159108377, 0.27114933838313676, 0.1301898019063164, -0.072333049559248908, -0.22304228227998185, -0.0049242594509487925, 0.062008119511538555, -0.054842880821889942, -0.077836691900670815, 0.062096463032945602, 0.21462918302865225, -0.09288225705487943, -0.28272760465120711, -0.21340003804680172, -0.17286126694845591, -0.23320368259912649, 0.10997606955733633, -0.0075161519634147494, -0.11006988886634309, -0.0034270246972780347, 0.078591067637549195, 0.1034985859689351, 0.25431078837659582, -0.15926510728994611, -0.27033600479296438, -0.10635029202050295, 0.048934737872389451, -0.021263028799828415, -0.12238693572764943, 0.0070054754811662637, -0.04236502584618259, 0.067623405016993571, -0.048466809027905976, 0.15102700530288016, 0.2213293088726995, 0.039738160929680112, -0.084479657158357022, 0.051462208774941877, -7.7551610484782874e-07, -0.0097437119571726627, -0.011728655305820936, 0.091254840741111343, 0.030319653452282984, -0.0098683560365388154, -0.004386704329111514, -0.063744543491559419, 0.18971937116088505, 0.08390672246062883, 0.081622381542222025],\n          [0.35396637364646399, 0.22349346524339189, 0.057983505942766994, -0.17547583945845743, -0.28193274673617186, -0.03504651024167714, -0.061419133419918656, 0.073064245338727629, 0.061645400882380796, 0.077309357575596288, 0.17389344512954749, 0.092584703746148855, -0.19128325987736688, -0.21873404610448355, -0.15487049984698836, 0.14901919885041942, 0.20523341842652873, 0.089397794393503149, 0.029360736601431098, 0.18968274233971363, 0.069481373869200808, 0.22547823381719437, 0.093546279977833852, -0.13281477240705325, -0.17716124650576809, -0.13345922159593621, 0.26005342174676893, 0.18501277795048918, 0.053589401248721524, -0.047950155872760955, -0.068453658862863989, 0.090671100822677791, 0.11835517359698741, 0.067373868734555004, -0.079589464966329709, 0.00040370973759143447, -0.18012258798893063, 0.090180248658778828, 0.17515551139257118, 0.066704136479836085, -0.32348954157841836, -0.43601738248961186, -0.1534376785143956, 0.078031085272144002, 0.0026002087661166073, -0.0068308168925726304, 0.25009089531454276, 0.086593094914715368, -0.29449998435488312, -0.28057849042944571, -0.21672085891086823, 0.0075953856677573595, -0.057357345275004787, 0.050785649925778303, -0.13227728339293254, 0.063816280146555493, -0.024929518821545885, 0.10319690016698474, 0.27361857287431979, 0.10838211070562667, -0.10088643508412568, -0.36636108447635718, -0.09977069874425773, 0.16157118049598923, 0.055579136554848696, -0.12792118168652652, -0.097782153150597462, 0.038950029262396463, -0.011346882847028943, -0.0057840540928373249, 0.16160380601420921, 0.2273189551175043, 0.17202324199924374, 0.11473390762833699, -0.025009740014433152, -0.012532965249099831, -0.1828653485672124, 0.0058619984820548476, 0.087637062619453948, -0.037284740577833916, -0.02890657791152753, -0.012640604713656682, 0.029752428424497962, 0.023715793388017523, 0.018978087051175017, -0.06887159345950368, 0.062344085837286789, -0.029720895993875521, -0.027411765498387287, 0.09285676183975064, -0.017030576469534799, -0.04056883608692545, 0.028206942400903268, -0.066991014330880186, 0.018045780660311594, 0.027421414987953724, 0.026028854880743246, -0.012256884841293818, 0.071946006217973257, 0.13443066125142392, -0.055826414183730286, 0.029494113298897784, 0.067669224917485588, -0.096083771061904272, 0.029156671668710249, -0.0005704450156028551, -0.1012677530478366, -0.024999495171495589, 0.11149857559031927, 0.068080180726917794, -0.0045362338010440234, -0.029235465914513481, -0.10839343595243112, -0.030880965310150249, -0.021535888254581387, 0.03491673509206554, -0.055572778438482448, 0.14692935465907733, 0.057092970001380278, 0.070053770867175985, 0.092829523250909013],\n          [0.090301552796241635, -0.032233505100053642, 0.086011434142149595, 0.057656041238979189, 0.085001738116853548, -0.018556863703405688, 0.10987613215108859, 0.15413524848686627, 0.039385960963009475, 0.047346588747911561, 0.13260893050724268, 0.17209307394684362, 0.087976535623989646, 0.10797764580249691, 0.063004634660501796, -0.025038437509689246, 0.0015666115477200454, 0.04229801081355139, -0.010856979351061558, 0.038565031477648642, 0.091150434541133613, 0.070429356807998139, -0.33965440443849049, -0.2162661542877142, -0.079793049304100055, 0.052481904095551563, 0.1173724758043013, 0.1235642779570921, 0.14985928358577055, 0.15132449797129932, -0.02085384010086927, -0.27884211234458556, -0.36994374970749644, -0.23348038589121675, -0.35031284933769036, -0.21235792854120503, -0.009620330055204282, 0.168787422376413, 0.10884138052914208, 0.19509683780071668, -0.022160352730551752, -0.13795256421389535, -0.38229992177549788, -0.15708260361782242, 0.24650430788233268, 0.21040788017836443, 0.0038881876095126638, -0.15092402578388575, -0.14972725998264072, -0.27657824988539942, -0.13642930996703762, -0.20644056003736766, -0.10322436864055039, 0.20311966005105042, 0.24971877621575894, 0.098784307030971588, 0.050021919690342045, 0.11216084960540927, 0.0082124981118818358, -0.15895814488393667, -0.24966006782360367, -0.22420253854921096, -0.081867096459771707, 0.16097051245293995, 0.13084583517748466, 0.089777023623677607, 0.0095536365062260098, -0.045308319112909445, -0.023384874480698578, 0.057270281510571203, 0.11323262469471058, 0.14403681369736615, 0.076514156970479155, 0.16610902479691686, 0.0012913967538901033, -0.061224715322185846, 0.023338315929245221, 0.046302661766759359, 0.046502337732860347, 0.053080092678231772, -0.022080323199307, -0.016463338605887348, -0.024589895117440461, 0.036155104538384816, 0.016852672260662831, 0.03835086922298872, -0.031623293130520203, -0.015008982063713011, -0.0025600166682885062, -0.044171433583490446, 0.020136310828580251, 0.03892295204420082, 0.023164046669806176, 0.018929516041055958, 0.016294884187040823, -0.026449976012229093, -0.031755575007436365, 0.037952166059081735, 0.047830269361228368, 0.039080927021283712, 0.01265262678231073, 0.019181657421850795, 0.052408264758088366, 0.067771582431651697, 0.071083943252673878, -0.036646443840120682, 0.13604484537303868, 0.010094694913875435, 0.020674151088393357, 0.050958350828004075, -0.017289306861633491, -0.021563726054119672, -0.011484727923504814, -0.076476788674643414, 0.0025912469716748779, -0.035059742648288747, 0.022443138066393878, -0.022650773632337605, -0.01342746115044742, -0.084684063476957949, -0.027860149727744976],\n          [0.22047100243692846, 0.13488498444135597, -0.0045313544299433878, -0.027832268966114612, 0.0031927903565839161, -0.11096409714434197, -0.14950903865889092, -0.26496526299411616, -0.004669726241513586, 0.18622994506205637, 0.43026644909049377, 0.083650446683214003, 0.057112586332003418, 0.14220244940637913, 0.1016853991938502, 0.097731276097744971, 0.2161248251313766, 0.15446657647109191, -0.13859854879935934, -0.29659395784427101, -0.17497364047276279, 0.19817698639992809, 0.16783396706831674, 0.035357281142304853, -0.028902513964357626, -0.021290874734355772, 0.087221013119957516, 0.16958557489322851, 0.29274282835495519, -0.061146597980816189, -0.15119828846582967, -0.14884448122495453, -0.039189658439811349, 0.04540786676769229, -0.078471457860983126, -0.27300141965542785, -0.38645698179771798, -0.059759522056491488, 0.17695994497522133, 0.15889943771092974, -0.090045267182307334, -0.0058036165937682405, -0.029934384123982583, 0.053751431227512886, 0.037133238140849054, 0.040634697159956309, -0.048019970488356739, -0.21069772609168491, -0.14410169096947742, -0.1866709303028477, -0.28265061246537715, -0.00363691950510249, 0.22240739851855151, 0.039353302240806409, -0.0086785807805936782, -0.15037741713755109, -0.012859139058527952, 0.1563515063208134, 0.042299197355116808, -0.29267625263739372, -0.40523406706284226, 0.096518104499962884, 0.2315533468508727, 0.135427422332347, 0.01229163523628965, -0.052368935922538475, -0.13532074699031243, -0.033103483521052836, 0.073327802260493347, 0.044657022603828728, 0.086151403532568324, 0.27385346109454989, 0.16267484580953551, 0.061525738630854601, -0.019745008995468723, 0.10503228658291718, -0.019420795585633283, -0.10476767983876313, -0.0051748307516162606, -0.06961208659767662, 0.013174971860819291, 0.080847233272621694, 0.064601373562742065, -0.021748261542462316, -0.0094288809818305584, -0.016281819632491139, -0.036344465904989187, 0.030459415820729141, 0.056433611785583565, 0.11018103278275186, -0.043666018041548925, -0.0042555610080999562, -0.073124175104948314, 0.029156650518305273, -0.045782313305331397, -0.018177965266959403, -0.026033702937208858, 0.062742395087324265, 0.057057268610088474, 0.11269084904432485, -0.014280509829636322, 0.066092093382691647, -0.026887244247685523, 0.015276292205476869, 0.0076592093566998989, -0.048902893444263441, -0.10791896457597597, 0.093210147136255278, 0.028852996778161395, 0.032763059790276036, -0.01149082145704293, 0.17616247675226981, 0.10570157158224326, 0.021852869595400226, -0.0058603280864050755, 0.0052495755756189894, 0.020608001100407239, 0.026462048552561179, -0.082618285821472695, -0.079352185250698343, -0.012264971540938308],\n          [0.024463212331441789, -0.027351907989107187, -0.0232645712975229, 0.11579335581687163, 0.12541294100753281, 0.071655620396774033, 0.059075996322128593, -0.021125383858022619, -0.052190274486374033, -0.0033401470291263557, -0.0084537171130643907, 0.080912403859005846, -0.057403073303803696, -0.1672123397226157, -0.15800496262021979, 0.063753554033199628, 0.195605998224537, 0.071413940170310636, 0.11891901474904588, 0.037161100558367188, 0.077086909312383337, 0.03586257381477892, 0.13139726047159417, -0.11150130163799671, -0.040614316851042415, -0.26027911447712615, -0.1892555532237831, 0.066082525575113987, 0.13273683807010106, 0.034848598443093043, 0.019787968851060656, 0.014094611768949439, 0.062232334317776306, 0.14344093791872772, 0.042856056841363191, 0.10733309533450026, 0.0098223854071513642, -0.23833993172951007, -0.21248877298655605, 0.084273584887845615, 0.0088423427141846866, 0.032948207740492258, 0.071733972455376521, 0.0063216999920338857, 0.19400277202336147, 0.014862104507331025, 0.10869294352091964, 0.19642768165098223, 0.010298200186124436, -0.29226294005774311, -0.080019152716796188, -0.013688342983296166, 0.11310866378660053, 0.012927749370945735, 0.15630089388412413, 0.25797164469348988, 0.0068688176426959513, 0.15135988266283087, 0.20516522088286016, 0.22377486701123539, -0.37618706807030639, -0.13386204003429708, -0.020440964154418019, -0.013775408344473918, 0.040573335802585292, 0.055189437367301808, -0.12708652754184502, -0.058209551446079658, -0.0084420051400804774, 0.17522715535241881, 0.033370120570514139, -0.18112622842082776, 0.034219233108481489, -0.11090094662237482, -0.14629941730977009, -0.0069698882479145852, 0.094796259830696034, -0.23704721824065272, -0.15881064516551835, -0.22841097862649351, -0.054433255322752165, -0.1747399426720595, 0.067643525175629673, 0.085915102193942036, 0.063463884214538815, -0.020900619067225519, -0.038395072191063258, 0.071985712612591041, -0.052570940540983442, -0.09266739122762524, -0.13826762537196235, -0.2490025436972389, 0.047882934688813134, 0.31223581965614494, 0.088266033197671831, -0.062809904286240392, 0.034915131736476576, -0.069708063347414362, -0.0018865257473194841, 0.098095420033629588, -0.05581304445284347, -0.060679329007625814, 0.056061870616646428, 0.17983405258220592, 0.074313751222269048, -0.027044632224345715, -0.00044358577837397273, -0.067457849836666001, -0.045453145630404389, 0.042968907664273942, 0.079381122903214502, 0.058880837077551956, 0.16904284405336217, 0.010963007005239452, 0.042321454350631033, -0.071452129585915999, 0.043645640277912456, 0.077058380034888352, 0.080223556633121973, -0.017561401109477071, -0.044481960782109489],\n          [0.084549471065337153, 0.014073183835550993, -0.1230740160197884, -0.061069283663190171, 0.030869726497065195, -0.093121154654422861, -0.025168085495502299, 0.015403998680830158, -0.056965654755122053, -0.1083328369385506, -0.16715071572866108, 0.12222148379971674, 0.013801001029832352, -0.10225459810121829, 0.0023687253436320416, 0.087394156533916814, 0.049218002428967747, 0.029333823960360647, -0.00088026105741263738, 0.11339493779706229, 0.079529564235923347, 0.064893491794769623, 0.076669307484134988, -0.063082264841880814, 0.037023338894633273, -0.059661049037454804, 0.016600380137564735, 0.091314257319891151, -0.011485508114042087, -0.099932453619522549, 0.065159532762354602, -0.037572072667034676, 0.014463355503503431, 0.067621978582367848, 0.002545821510838972, 0.015802700036307044, -0.10993602991728399, -0.069419149357140775, 0.021295475983666365, 0.060596105301526815, 0.026423669980028666, 0.0099005578969671576, 0.065389743283916738, 0.043327597311754604, 0.0095510727918731442, -0.076474755187026844, -0.034130568923233656, -0.075098926490430609, -0.049786970498281125, -0.0042179442640507409, 0.20027598699372212, -0.001573509922832908, 0.11546201651339859, -0.0078019181260196996, 0.047540267194441585, 0.0074073899524036285, -0.0035661452397871829, 0.050505679244823312, 0.075847133121496879, -0.14425580282111874, -0.24270846769727125, -0.046072578225007529, 0.24352730974674286, 0.10854500954947886, 0.021318739646681309, 0.18208436906265801, 0.070465106497684504, 0.030956011752212256, 0.021330978755012248, 0.016480979771810872, 0.0086198233570560084, -0.2974229047198671, -0.41813209224239584, -0.16138204950131452, 0.14572029672416026, 0.1694280555459074, 0.15422865108745415, 0.11272693480731671, 0.046495243397517025, -0.023984750652771926, 0.12619529270753593, 0.029740806671949657, -0.012887870344092549, -0.11865448348338473, -0.25933005916694418, -0.10806327708697712, 0.041596362223892985, 0.18022097944719229, 0.10169601556475943, 0.018289098449946008, 0.13183884426091172, -0.0044659810184938323, 0.052209042897218866, 0.17237101496311741, 0.14892400045574139, -0.11529855402495276, -0.29240160552568695, -0.13273718724417694, 0.14348887171904712, 0.12546368827384355, 0.11969887802419291, 0.0966060351971295, 0.083929200710457522, 0.24096145794638008, 0.18159138797074309, 0.21525720611281124, 0.094817137460618234, -0.17303248008130043, -0.16750824599204639, 0.053188636818327979, -0.014842848833645155, -0.13262816340908251, -0.22760143827483528, -0.2847413352046097, -0.26749569041165883, -0.11356293770181579, 0.12871811981161485, 0.20940394327208089, 0.038067867730537372, -0.18388869167744798, -0.098721772725600787],\n          [-0.2933214566389058, -0.076673570165451121, -0.030749933623699748, 0.12027682321697916, 0.12710910454233743, 0.051896661997998111, 0.13913969924673966, 0.11540205050551869, -0.06812516368464866, -0.0090238207290792988, -0.2910170972813963, -0.061268943436541726, -0.054506350086854553, 0.051033716593179984, 0.012541368369093815, -0.0064693249273340206, 0.017938091969742803, -0.054229542502671674, 0.011335519373694994, -0.025653575674649303, 0.048300304626844079, -0.11406149945577017, -0.024236484184631396, 0.097939513655933591, -0.043137424355738627, -0.070786255514511884, -0.068496593636333397, 0.096857543753862019, -0.061432181096106472, -0.038063832392768171, 0.057071174742847973, -0.035894598788348775, 0.015329272078617107, 0.056504250005295659, -0.01033577367928705, 0.027053972547184557, -0.034952760442069394, -0.012868480551019405, 0.076342833435914359, 0.047322298319982879, -0.037462598161052602, -0.0093979451424250349, -0.014027283741116559, 0.064562173772655232, 0.053721717716616442, -0.067590362010537211, 0.013910951636928501, -0.016445194379612716, -0.019461686721338484, 0.010439817092615947, 0.09941813341186459, -0.092003058246228286, -0.018110229860505461, -0.069116492139218416, 0.090085270093186898, 0.054159665897273314, -0.0018642885725487952, 0.0040597588270554694, -0.085946011876088801, 0.1086179140161275, 0.027099949435567414, 0.09914159471687442, 0.00066682087757463648, -0.057660689819417535, 0.024056864968152455, 0.068221400186677966, 0.03672191197686131, -0.0013717096205560289, -0.028205736414335034, -0.045759999314944469, 0.053361593077059094, 0.052631114994282018, 0.0098103929417969124, -0.012203636403062709, -0.16438519522356373, -0.021001549026839584, 0.10556807205560682, 0.13827298919396377, -0.0070213145166122017, -0.16276133871590864, -0.18906392185671284, 0.059904133889352951, 0.10225970117457966, 0.074039764882703321, 0.0042851859251910318, -0.1845936659626026, -0.069683794916369668, 0.14111364483842084, 0.12749376377877644, -0.10699417534257408, -0.058972794911818865, -0.027184342145305414, 0.092294147272745874, 0.042730772598910421, 0.029013756855529385, 0.091552924634042257, -0.075056709683407635, -0.13842728606415003, 0.004980535912558804, 0.0097376951913064926, -0.17762638306662676, -0.053055611222672334, 0.0051212513850458323, -0.031160068246315981, 0.018285642027540898, -0.062989410545790991, 0.0087672622600651062, 0.045406407408064592, -0.15525094289000227, -0.1042418032870643, -0.33859461490814169, 0.00092931377130833423, 0.071523799097884699, 0.24813145448099272, 0.17764819914849853, 0.054741690878753094, 0.12448607192690106, 0.21578173215435317, 0.11743015273985927, 0.11810059765594877, -0.27756282596086734],\n          [0.23860743861101838, 0.037220481391505231, 0.031909831457287416, -0.14966246683358922, -0.098549852233202243, -0.095091345307753761, -0.030802604768789821, -0.04066312098825503, 0.017506583940867015, 0.028513850752452302, 0.083059648764879507, 0.0012190679580447311, -0.033228792087639888, -0.063142105345760022, 0.035544952402444221, -0.02360819898883483, 0.022431271094160515, -0.018827603717675528, 0.052735695833279514, 0.04158050289699862, 0.031033870999142746, -0.020524724375181047, -0.074377554313755104, -0.058851568777864349, -0.018416900291008273, -0.020185360544406894, 0.056555515730563666, -0.0026618188225642214, 0.052187819479918976, 0.12531509017121725, 0.019467695962588835, 0.096993280631948425, 0.052629314471473787, -0.095668337004786982, -0.10779966462682439, 0.047013332046528231, 0.1288079363853076, 0.1184985604004099, 0.046938525319026703, 0.011551507295904942, -0.10251614984375894, 0.034819153945653339, 0.089993485601405826, 0.11883560873126586, -0.026071450999984924, -0.10858930623330341, -0.02899296545303913, 0.12481231448842042, 0.240071552691944, 0.40869246369383216, 0.26105260304455458, 0.050071705679084866, -0.0099467245426242412, -0.032287346107244264, -0.037881104375152352, -0.042540536708484497, 0.18047392726709921, 0.1072902350620442, 0.056244968162698569, -0.45229392780009436, -0.8393105202937271, -0.32646697573387123, 0.14835849608015655, 0.1562873589444303, 0.14740464227965588, 0.048455507232141037, 0.083156966084078382, 0.096330955575823676, -0.042531142223404261, 0.024991947578161741, -0.13244791761311936, -0.16920198721111196, -0.46440542591162931, -0.34744594651326566, -0.047380042881461047, 0.014762318653552681, 0.056736228592421528, 0.03669477148484114, 0.013278997131524375, -0.054247783597366338, -0.01483859686236641, 0.16411279929712191, 0.28499310141872169, 0.33270153991512441, 0.077932645611871798, -0.21057989235427169, -0.1802826760596537, -0.28799247125492472, 0.049020040266471457, -0.037057503544318783, 0.0052054814540925462, -0.01712557992945455, -0.0034699488895449798, 0.11284391028265023, 0.050041748407580855, 0.039230018094625674, 0.083778617870413213, 0.030109655245779202, -0.10733376231898197, 0.052780693840456264, 0.030825522124256793, 0.04821793526249081, -1.217969571825489e-05, 0.037877834340168115, -0.1130077331768389, 0.025972330279050104, -0.040361720693582716, 0.060662551316001928, -0.0029175588675382641, 0.019233415533092907, -0.023247268944077137, -0.024268033659365251, -0.048050957148744342, -0.039100512532260122, 0.055724286161657241, 0.01959390543904424, 0.0019309926921863563, 0.052874955099626461, 0.11053404299243735, 0.059716361896183456, 0.065829387455870025],\n          [0.067033514999894656, 0.026572971026187026, 0.061902556598039754, -0.05061268032779824, -0.071246860564967429, -0.061282119254154305, -0.13243988526229811, -0.07738291307031675, -0.032986299158761272, 0.050994057269436274, 0.23205864835108797, -0.017426477727532821, 0.016764191996464284, -0.0045262873127560194, 0.072679551937369191, 0.072143276669484363, -0.025652321290280722, 0.011718912127102923, 0.015719207964445966, -0.14235466059508073, -0.012765609360204759, -0.055815189675494613, 0.062228430692006592, 0.11098589289358554, 0.1277675820548782, 0.039053987447355679, -0.010542995704417739, 0.052521557010413458, 0.04550010649059387, 0.0047551996119335541, 0.040037242307058615, -0.041869690382639844, -0.077743643710486338, 0.036622756449570762, 0.026947327196116463, 0.00487126551883902, 0.011449791638995233, -0.012157643728774703, 0.024207033059366057, 0.083283458792015805, 0.079838002453690701, 0.073616421497002385, -0.072412475297118195, -0.039880892956012777, 0.090274964350828088, -0.0059397628704566316, -0.079683192948853412, -0.055948766561327426, 0.16964650730513986, 0.46194226585948911, 0.274371381660658, 0.17637187708430974, 0.0055754869681963956, -0.040969322056490821, -0.048391146086037493, 0.025694944612614096, 0.099982967744116455, 0.12605224667151532, 0.27677019407409076, -0.090382459188317776, -0.72366729365820226, -0.66542016392832304, -0.093850604192478121, 0.12499856033014405, 0.090997511837360642, 0.018067463940727141, 0.023895781307986239, 0.11109874613217101, 0.033726182042769393, -0.22604680738211497, -0.55798448073756512, -0.23540780599042138, -0.094804503513252869, -0.091208459114291623, 0.007777282093728341, 0.13248330185889684, 0.039860046929418358, -0.25215810577191916, -0.20250122934799764, -0.17881248119439586, -0.11431317224159114, 0.29676856770910492, 0.227171515318765, 0.27410464679565072, 0.049648773580817623, -0.056866369619851614, -0.064784777105461808, 0.037313367193882563, -0.11706718911764522, -0.052501869400952868, 0.047052857758273475, 0.024035553726984002, 0.13017390712450239, 0.056206121471782292, -0.040237669313721178, 0.048845435975711976, -0.010397341013248448, 0.0059061057848477233, 0.038085874448897966, -0.010126504089425892, -0.011702353668809645, -0.036778984080859556, 0.010230544538505373, 0.010568912857967669, -0.005032312616026352, 0.0022982360713862809, 0.017050551716730533, 0.016180147956727883, 0.046102997696378212, 0.010501996704126618, 0.092567315720886861, 0.079400948339318683, 0.10570431930113847, 0.10682942997287241, 0.057218561045001268, -0.049670976577548959, 0.042693039359605639, -0.038684015991685583, -0.039503682631983172, -0.020740434284436046, 0.014243631289787631],\n          [0.062853191788539597, 0.070714896930592464, 0.0043518201422265285, -0.02666655406813033, 0.044525492329128127, 0.0088609265224199457, -0.059431945920266613, 0.12208756283717534, 0.10823813013338997, -0.025642885151491657, 0.055452978682526785, -0.030909671398170552, 0.0048754534319613851, -0.1108275207792192, -0.028823536945349906, -0.0050464099159451686, -0.0020801916092238332, 0.06515373811494736, 0.0042318087539451182, -0.016502458630955161, 0.039368681711714523, 0.14469597694100828, 0.036147418183642199, -0.025105477318655298, -0.0029752642733928553, -0.027230567529541769, -0.026500280856010971, 0.052083733475320179, 0.15939093133651491, 0.029110857419989741, 0.0058879547498108253, 0.070683657600627628, -0.10501891349904791, -0.012994883599022608, -0.027730543376280184, -0.038084041899524274, -0.028850174915976398, 0.088899107687582232, 0.12716053788475778, 0.09387808681070002, 0.12445983906256813, -0.06046361458863396, -0.12925780819854998, 0.058858708256970163, 0.16394889767626275, 0.066258764981399543, 0.0403244530383884, -0.035531467041199284, 0.074782760422794525, 0.027441833600079138, -0.034548445862494469, -0.15237542888927019, -0.13604857549753155, 0.065146735415548912, -0.0074264748840444511, 0.0046040279752218305, 0.078351950102189191, 0.12973383797047089, 0.095681579137167697, 0.10648034656296729, -0.471163369507132, -0.76254054291835849, -0.3582093555686478, -0.013245699569145133, -0.13302631896461331, -0.10815491503392521, 0.012182904199392754, 0.014156573471716255, -0.026231788982935246, -0.040059881323019783, 0.013820645260828969, 0.24427073416124961, 0.30739954052096252, 0.050527595012709481, -0.02309562329583871, 0.03293769077258174, 0.08587868851219474, 0.041107882586519373, -0.00067550084020043255, 0.038300058206411747, -0.054725024091938995, -0.03259687179316071, 0.078231031652147634, 0.16873039089887609, 0.085156469724609371, -0.075477381020669948, 0.075845844149791966, -0.065615868802515548, 0.026372053076710963, -0.012261443544603602, 0.018816373445303562, -0.046021026430705159, 0.063676911857429019, 0.009164298437269125, 0.021381107032976132, 0.010298974711400581, 0.025836499120846023, -0.0032034037426122638, 0.093859948209638583, -0.044506983815036136, -0.0094275346624950306, 0.014356944789664046, 0.00037736419603631721, -0.047078136939779545, -0.00096697063118341472, -0.010146754282597689, 0.0099516872802271478, -0.00041655889524723488, -0.035460419946042106, 0.013200958086152861, -0.034597677731442178, -0.040735749134576782, 0.051473603477795754, -0.03068228734251964, 0.033804134588586013, 0.04377149062165768, 0.089866716879267672, 0.0076301954407810429, 0.042985878682231804, 0.0073348284023678628, 0.08949838726656334],\n          [0.15588564481934239, 0.015629940083505309, 0.07753118222162185, 0.035198943491464685, 0.098615000408114981, 0.069220367786417589, -0.051015845370300447, 0.013531733492920819, -0.16689427943715818, -0.077939155723077788, 0.021709195750235555, 0.051427622717783311, -0.064348894516704488, -0.015227872851937468, 0.012758529221202047, -0.012491873951225668, -0.052544744154776057, -0.069039899751267175, 0.050431254230985517, 0.036663595165987328, 0.10484513386583763, 0.086415560548891199, 0.050031783118376666, 0.056993606178994877, -0.0025489629815944048, -0.00079079854412655859, 0.001499228924733878, -0.18328932679013349, -0.0010930528968453174, -0.051995220652956559, 0.007617813274078844, 0.050139617755528193, 0.083660718861030547, -0.028368100712067607, -0.057670540943290494, -0.024746519800128597, -0.17552062616716269, -0.053853554159497635, -0.049492415048262267, 0.028095804788870901, 0.16656739764514511, 0.17516444743795742, 0.1107778641386053, 0.23647066109018683, -0.019600601715928354, 0.0020068984825111352, -0.10475575204030461, -0.053073335318213274, 0.078984284067687066, 0.28336794782700825, 0.35165561151087343, 0.20795642216210236, -0.0051422812718408401, -0.066193759629023963, -0.049047262144416459, -0.035658104876826635, -0.053201855164002887, 0.076802578461626705, 0.29382065156517917, 0.27041543845259264, 0.32595175559668715, -0.14797046003969899, -0.18679187035905376, -0.049878575994829755, -0.099670598900649929, -0.040295774069118412, 0.022961845644245041, 0.11787385733947886, -0.072577437649429505, 0.15220959346283963, -0.11057067643262666, -0.27508873178974369, -0.22643642891650884, -0.21711971918615147, -0.065673550190076299, -0.052040181244765185, -0.091959698571150356, 0.052341425230670466, -0.029014278335724536, -0.026486649395131429, -0.099176081239430308, -0.11757437729038858, -0.13254020998829666, -0.07632698439949917, 0.079955224567499511, -0.17744204932338672, 0.080375905404569209, -0.073856215327577773, 0.08773958673979658, -0.13914743753820652, 0.009984405808856886, -0.058680483231997344, -0.057028749498486214, -0.079793724629746182, 0.0015768478264207159, -0.0041526349144124231, 0.03459730460531342, 0.0086645871269026842, 0.057269417282438451, -0.026265220900470704, 0.048093551927189358, 0.021793273125612952, -0.11755126367641769, 0.00049936995779083226, -0.09136988608727073, 0.17327200177522672, 0.031572859497950911, 0.022296920170734737, 0.0028040719529331959, 0.1205545883355781, 0.22973360335482984, 0.053206330310550984, -0.014610065818932663, 0.1166412205908703, 0.082758175315321217, -0.089171794728513082, 0.061309463622492497, -0.041123681778030372, 0.0013240930679478125, -0.022404870056693074, 0.066513648330478348],\n          [0.10641476126921573, 0.094791860020083718, -0.031528574545001298, -0.068662742567365098, -0.045583264706049009, -0.044170709745188025, -0.062373368500344591, -0.040882035203785007, 0.036680666666222828, -0.031890639174042112, -0.088635427534217007, 0.072486055817956696, 0.001791308761835142, 0.071618106508292478, -0.1084084708991033, 0.055537208628036988, 0.02079069078849588, 0.052668231377405089, -0.011257567794659987, -0.084503145472767896, -0.055354602162358317, 0.069470736791248017, -0.028454654127522738, -0.092204125208372456, -0.059138644586120663, -0.0088604191876885396, 0.013755932301681914, 0.013007606849729902, 0.11916500018693715, -0.0054766771048394558, -0.0046385496941247772, 0.10607177324908609, 0.13190402522499708, 0.033044593081882234, -0.0059853447957998185, -0.063203008712939046, 0.042930422332914636, -0.077520137322837177, 0.10193484761260346, -0.12768024901465561, -0.091566872598170757, -0.057976474892979336, -0.13595312824385677, -0.048451573720558666, 0.011191570795142991, -0.0068851380519260597, -0.096621451088916122, 0.081772431435869347, -0.049007285728546249, 0.1976245378232617, 0.18536337530011557, 0.054459053626504439, -0.08541554314837492, -0.1103049477795886, 0.26784310566965119, -0.04245325920849799, 0.07976003455399179, 0.15028246342565876, 0.27326896910753634, 0.2358435331414003, 0.029238235516672061, 0.14907460060498415, 0.31048708671669695, 0.40128067591951677, 0.38540963021580366, 0.27326818523111684, 0.15636736514996508, 0.14854725998180202, 0.13416742860268516, -0.1553995297347727, -0.21625457306714183, -0.28189178550902477, -0.25441318585728456, -0.24392409898023509, -0.045056214003550595, -0.13583884555523959, -0.36046526211729601, 0.054109881966403969, -0.27377967101430223, -0.087568631307608627, -0.027320638024760924, -0.03926220394642365, 0.17562805271419396, 0.0038011471806441294, -0.11815538049076468, -0.14961832586766177, -0.071034737335284814, -0.11256171108967788, -0.067347567015697357, 0.043317495301606501, -0.1030173747997237, -0.1512534418799959, -0.045348211292946861, -0.2275535515430907, 0.050199653444878589, -0.029910369292175915, -0.1088343982348304, -0.0018044946393091232, -0.14575679126759761, 0.009524471365601167, 0.017124703501667587, -0.0035126745298030559, -0.058372842364167565, 0.089840061068809596, -0.043367454110254694, 0.096738746749035681, 0.03700212707151404, 0.086995071846397459, 0.0198918856448589, 0.021144677203969078, -0.093457039994106067, 0.027112758749156501, -0.10194181462653785, 0.083879262506938779, 0.075075983857442727, 0.050127083431861647, 0.088653279727832768, 0.020525237657478601, 0.086115788747519101, -0.0054914080731565951, 0.14180153649129834],\n          [-0.023176335194873693, -0.024544621317998089, -0.032357875793335142, 0.061548317450878437, -0.028031573107483762, -0.11117017121562775, -0.028557173365205218, 0.034625006110213255, -0.076972642567779373, -0.011745965892935112, -0.0099597650513476577, -0.054283551601990401, 0.04796909671149692, -0.058234554069283725, 0.03220334560199091, 0.03182887188613838, -0.0085908775377060292, -0.018539673712725524, 0.059493326671222202, 0.032667167660611757, 0.011822214610879928, 0.011903166151583794, -0.091302949805953146, 0.010420910286473448, 0.047573929466955864, -0.010085595935941855, -0.082131001411481733, -0.035237661500281195, -0.0095365997252577495, -0.002108262261587307, -0.011204831036011803, -0.10622317570891325, 0.0088673069092282952, 0.080682046586781658, -0.09053303518527786, 0.0092003318540036794, 0.047579680643652283, -0.00347364060163316, -0.2609501387739116, -0.1992357096012872, 0.12707903816980357, 0.076817114916749113, 0.0089467730959269243, -0.017430379757375963, 0.27183434461804845, 0.29540869945884163, 0.24001157736704778, 0.32834666729756479, 0.30453119348124091, 0.15738308915167651, 0.27144447211271683, 0.27186726673366013, 0.31737875140339933, 0.17968138137001657, 0.34963615466399944, 0.17947799656684207, -0.19852203981785516, -0.23131890333905614, -0.30348558107287027, -0.018142171891952316, 0.32801789455109143, 0.10087717573413153, -0.27373136424469352, -0.34405448357850948, -0.10799042948918298, -0.028605058848439946, -0.19185111341784114, -0.027745548740637616, -0.010639473223188992, -0.06235838944179839, -0.22873300656916182, -0.17306684979686754, -0.10579424926972862, -0.12594712705414679, 0.0052133744642944568, -0.033020737140507975, -0.071928733715963894, -0.084042374013380106, 0.03728925720093966, -0.14901085254024224, -0.051877974664164613, -0.062449829977762557, -0.14709231061360803, 0.018448830420891835, 0.0039521338112389198, -0.079257066628676154, -0.068341989568304076, -0.12331516121995928, -0.099563492941295281, -0.12282998155312592, -0.0063813760831064326, 0.15237343336881881, 0.056225478570189891, -0.0045106920049706734, -0.057588436403930618, 0.098402612054188085, 0.02709244060964458, -0.0051265278718723162, -0.1788182638868932, 0.012716901548097112, 0.014254282884224326, 0.10921274021001333, 0.12698286341450832, -0.04126909131947766, 0.085520492564099979, 0.04384704473182563, 0.024665056914998047, 0.12247197871922337, 0.13439823365742171, 0.056199865709336619, -0.07048736575183942, 0.050114961739481753, -0.0003055425117918717, -0.0023066782999414809, 0.054045599348802625, -0.058889848964733808, 0.056481833161273906, -0.074701257036599966, 0.054306583047584442, -0.0024484691527146898, -0.12795957386439072],\n          [-0.0087719423838811122, -0.087902685556123586, -0.055052346930590697, -0.053894719312888591, -0.021765025216602493, -0.032496201274909917, -0.053936524545242788, -0.05960180358333237, 0.018682206945497708, -0.024041856926648959, 0.18080120923175, 0.013387152203562694, -0.019460024812665497, 0.08584050842604711, -0.042959888333166781, 0.056139979747190913, -0.0074822617478288514, 0.072637952230176689, -0.0457731161083395, -0.0079074374072526862, -0.039617671594911967, 0.062009468577001868, 0.06967381700346785, -0.0017890764951173505, -0.017922949357011164, -0.017328735082365487, 0.10429286568139526, -0.075336563592980688, -0.019897609787032887, 0.066497132377735496, -0.041929713620319324, -0.017542325191820356, -0.049375050497253652, 0.04705546281032482, -0.11658200494772165, -0.050367703232498756, -0.08774512274558624, 0.10296881777328262, 0.0010435280990956572, -0.11190238889003506, -0.058552489144718556, -0.093601922420016692, -0.058917359043089, 0.124279868888969, 0.20421984908202209, -0.08692730923047455, -0.15846153558915144, -0.044231150294403901, 0.14028149426418587, 0.20301345397769968, 0.20996770156750841, 0.078368373517043163, 0.023616204532563738, 0.046474099815913654, -0.10918733172647779, 0.34227918211166714, 0.40922200549215987, 0.32977893025607696, 0.35276397881502514, 0.17347731354344686, 0.049654055979477453, 0.046852605375659315, 0.18540273672730367, 0.2348705535220503, 0.074066027456603012, 0.090895328013838622, -0.35637081936313159, -0.17890098216840339, 0.067023781694075441, -0.1450909663576207, -0.2414525478367974, -0.31352143109573821, -0.2085394028841733, -0.1694233082437144, -0.05072999227745726, 0.07083911431869358, 0.11262033996513801, -0.05565357077731857, -0.18252807611047162, -0.095111033685357782, -0.20810789102436822, -0.085215792202067098, -0.037808309132582603, 0.20962708773356045, -0.087518828092840728, -0.0083270949222766927, -0.18306482243805655, 0.012319186741073546, -0.16489228124607314, 0.07423361221491917, -0.11013637802070915, 0.00018776862044833642, 0.0033474012470800438, 0.10043781830311685, -0.24009618845722649, -0.055213512452654788, -0.098806399955303242, -0.014981735119631731, -0.1254106702918007, -0.035863038056541618, 0.046213717459946638, -0.11767772671757684, 0.075696958238519407, 0.25102280647850195, -0.1506185088468181, 0.10273881268388778, -0.14457410135153065, -0.0084315930228874431, 0.073821935984905274, 0.034203057734345316, 0.12997695973099549, 0.064946501430307446, 0.1003816513120292, -0.04268279073187238, 0.034385732695719776, 0.1329989256859449, 0.084680513253248088, 0.16750112561515856, -0.14488980909132015, 0.097226090484736558, -0.17221966876845224],\n          [-0.032220950917092345, 0.0081917299168678126, -0.08028184906386833, -0.081381381904831074, -0.06384203481562005, -0.015615271736948433, 0.10708665173062173, 0.080651308228208707, 0.054345297791378977, 0.027073639464279806, 0.16812503709317206, 0.1341526646829076, 0.038631043495105599, -0.0055507367765743609, 0.042334555898426843, -0.028373758652471104, 0.0039598584650343688, -0.06359711746689202, 0.056587509472392425, -0.027554813118545185, -0.0017875113664636427, 0.0041025698499825153, 0.092718998685582421, 0.0086585130443419065, 0.10683629867740597, -0.074195758215517701, -0.06305739990406109, -0.021523442626893499, 0.0092341320266679933, -0.14610356759412479, 0.014750802208444519, -0.0052164932593612573, 0.0032641614965498306, 0.097806834221344979, 0.12926590150531192, 0.06269754981180288, 0.27475421176426429, 0.092446065608718181, -0.12768877877435683, -0.14805761147879182, -0.019825200460864806, -0.0086314590567921345, 0.01448064785908898, -0.0089873586037065994, 0.10470942538393144, -0.11054476667297426, 0.0075035505378642127, 0.060005840448525999, 0.31710299191646102, 0.32324440176708602, 0.10720495398460449, -0.058101525474285445, -0.031760977729127976, -0.1142935909746058, -0.031550903709047007, 0.0017246932881514604, -0.032140984544803027, -0.01313116025549961, -0.14824372987991144, -0.10766487248252816, 0.10593875445284681, 0.40021227496345418, 0.19725349113949914, 0.083747523144874783, -0.030750695721978777, -0.028330043664018603, -0.099873850179229756, -0.2603924703966779, -0.02597866375704655, -0.074313555789072977, -0.14253780748212694, -0.27783688778439536, -0.10552358523835495, -0.011202718784634674, 0.12855854774382316, -0.0003920736373502591, 0.071696717198538498, -0.06071544811269014, 0.079554834222746146, -0.044449538129453167, -0.036239302802330287, -0.054950113420475968, -0.07587822560403587, -0.13219044743679167, -0.11463986228711373, -0.014321816516995132, 0.054633054493314868, -0.0021865578330653515, 0.047599214666799061, 0.071590563880558955, -0.061806931357610687, -0.098703279639705627, -0.17720783806969967, -0.050444583088944242, -0.088158091500455199, 0.17305912499532888, -0.18012041201202472, -0.13789844469843426, 0.069654839313687877, 0.1066025347744837, 0.042994905989906691, 0.1324687310724105, 0.10691785253509371, 0.063925231237494759, 0.084949424182349784, -0.14824978071410777, -0.17981670747688494, 0.079887216519016369, 0.0099878844963017417, 0.091658809499199995, 0.0039475808537077287, -0.022988366514234783, -0.025003961189405333, 0.022312743486262065, 0.032106124489561169, 0.0060978045024435712, -0.0091097809264211807, 0.13841562948388741, 0.05721814889507093, 0.034249424231449693, 0.14165895482659591],\n          [0.077403080391101178, 0.0027902789135363509, 0.085848659908945121, 0.081621580183346434, 0.044686861117663595, -0.010720512150544551, 0.000766928295162006, 0.10466386076912294, -0.015221602350874539, 0.00096214663821529711, 0.10250217221999841, 0.10103126553498611, -0.028640249406738497, -0.050144288137646154, 0.088029509421074015, -0.039184290019048773, 0.027942178534501191, -0.10921729182270348, -0.091551121886366701, 0.038578400934963716, -0.047089437070028148, 0.0082248556916629662, -0.016698052118169729, 0.14190580766416327, 0.023164625852484036, 0.072603303858135557, 0.11866577336553505, 0.014093258001003195, 0.0047638608409522332, -0.012686837885249339, -0.036660213196534036, -0.077416767630940422, 0.049268385768219111, -0.044394153830466104, -0.17871803212100118, 0.028784448095554194, -0.0103622383273788, 0.15180646423700633, 0.21859707883104096, 0.11630023909217539, -0.092580368552828127, -0.019700955892187733, -0.045860659847962018, 0.029996643776362769, 0.022719309002418732, 0.025101662257832447, -0.085650564281123734, -0.12410629154164783, -0.18246293106608358, 0.091966008812621805, 0.087081001569446523, 0.10736116620783882, 0.028110496703318152, 0.11507649255715754, 0.038288111619517784, -0.074857538348946706, 0.0003646230535695183, -0.075728095243027413, -0.25811646164981222, -0.60691515717629596, -0.57736366547659346, -0.1230196932349347, 0.10818482658632861, 0.016912673562240535, 0.13529133328209006, 0.090044145360448649, -0.017373878996459924, 0.016143047062772586, 0.0074705525731126043, 0.038153120918174875, 0.13808042440556922, 0.23128272372791026, 0.062212166782940587, -0.00078105935242136354, -0.0088352484968890338, 0.015948358629724879, -0.0005022452937268676, 0.11232364734385331, 0.010961615375259789, -0.063961968540285671, 0.042697690474159465, 0.075697683234001015, 0.18797108390738509, -0.034270718560830339, -0.076010292391831616, 0.040711497962504541, 0.003927652671956227, -0.008113852698322141, -0.015998115624021494, -0.060356186306471743, 0.025951586831793848, 0.042163344429453686, 0.082425729708358278, 0.14260227985381085, -0.042848628451185186, -0.063341469459500324, 0.0092863458678610518, 0.029863814690498799, 0.0060823890399176739, 0.059612446109644765, 0.030082023913450849, -0.027239380162663276, -0.0073658703526070556, -0.015225093891979673, 0.044419085486733505, -0.0053691160288692197, 0.022425434671702167, -0.0082635729409229006, -0.040836893779866157, -0.015422443671092656, 0.061348129149263644, -0.052846129433506105, 0.094365596248035394, 0.014525718078802685, 0.0037072160051032756, 0.044122648659048434, 0.045794925597176121, -0.030930673355086962, 0.017194230501010505, -0.019462858484744144, 0.001243582445288452],\n          [0.084113665034921459, -0.025621034960445016, -0.023221811619521998, 0.053008052188471377, 0.1722413378552653, 0.012469440442448243, 0.075121540622525046, 0.040763448249123868, 0.098100783614578663, 0.041479003131258046, 0.12635977517681399, 0.070298444019280537, -0.050007246720496723, -0.0054840870702999311, 0.03040544684160737, -0.089754664462184497, -0.21540766402304359, 0.017230102171692269, -0.13556988205821849, 0.095618226286922736, -0.11059773025824354, 0.10124548152459008, -0.076498060646510518, -0.00028541240089785536, -0.026245513796004843, -0.019479552802034616, -0.39778025123942529, -0.062143591902259168, -0.024341092169919532, -0.012826724183031463, -0.014661926972310418, -0.11254901345954736, 0.16096037573300526, -0.11227786126177444, -0.068532532992675615, -0.16356466589407062, -0.19653804062868085, 0.031038393193058594, 0.13193348705643318, -0.083422963041591094, -0.040715685787325567, 0.013809808214387778, 0.039665847545365757, 0.0099887743329398759, -0.047952715523986306, 0.0006100311386056656, 0.10343067208630369, 0.24890751819447962, 0.3578226490040739, -0.20933412648627439, -0.039926382349098469, 0.19419655464006366, 0.032188369668813749, -0.040503633096404479, -0.0032348476784208602, 0.17053386793770461, 0.35047600865548467, 0.24645797779268205, -0.12388716569831495, 0.017230415937178875, -0.20274807116351118, 0.13927324407566935, -0.014868221439288953, -0.11606370921716812, 0.050406898699637798, 0.052284706862743335, 0.2179885999524844, -0.056957003125337274, -0.20647158156376177, -0.045778722576096192, -0.174715212494163, 0.052739805693730518, 0.099133675550291595, 0.094364060620869411, -0.060202372775518737, -0.043715737000694935, 0.056370290784785199, -0.0085890329179779956, -0.096057005222036973, 0.019767425753796281, 0.0089128377885082377, -0.043514983487809494, 0.071434017069269745, 0.03636602312918305, 0.013983885718858599, 0.073847542491404544, 0.064069902818033903, -0.1243079073528052, -0.077473394951124958, -0.0030770402418191234, 0.012411573849515189, -0.077233395464899518, 0.052213298166160438, 0.098480901187919578, -0.044983495910957086, 0.0093175449591838683, -0.014435731895740433, -0.018574666756547009, -0.016642124460499341, -0.20214085319841704, 0.023000105666364901, -0.056257873953405604, -0.01762107897153789, 0.019130131746270068, 0.020007586924534165, 0.03483339161645628, -0.066635058968322142, 0.019122648234895845, 0.10427685298428223, 0.026510785405202311, 0.16286923233388592, 0.02793257220207912, 0.049606524388094764, 0.050049491429857901, 0.1019360210121309, -0.025880325806131227, 0.058534465646414693, -0.061180519358758872, 0.17253450900113493, -0.13459923259367187, -0.090407597313012622],\n          [-0.027550816137581063, 0.20556735223558539, 0.08213180283129054, -0.042570327563692591, 0.01586831912703765, 0.0093698333764795361, -0.11462856052306328, 0.044711856850138204, -0.15995802392503708, 0.11865990971326171, 0.0673921974401607, -0.13862721846117479, -0.24991581191756615, -0.12741658368348494, -0.048942245808076282, -0.10908521327615617, -0.015851721850914276, 0.030010677013469683, -0.15749365231887502, -0.053420943220933284, -0.025662830013189836, -0.011092925627943839, 0.058388641152087056, 0.088244561781003344, -0.053728117004780987, -0.068366341306591, 0.0026508458051404948, 0.097817872697453651, 0.016895869777799971, 0.029099746903975626, 0.15597074244969705, -0.017162667301283602, -0.047857867586063488, -0.066641357291646677, -0.041049665489416423, -0.029341908735795189, 0.18068461986324288, 0.23841021509849827, 0.10720477806483233, 0.0032504209495289177, -0.16875590654789738, -0.055651624441500805, 0.037864293059399243, 0.14496557145479333, 0.30165038928541399, 0.21780633210507225, 0.2478067430020475, 0.20611438223970449, -0.030505045384812982, -0.22354863754123386, -0.22057742020428542, 0.026160777231004489, -0.014489792871384327, -0.0013992789264812011, -0.032142807111526076, 0.069858404495879517, 0.12952310052385177, 0.062134024665833537, -0.095850197369784784, -0.15005742280797291, -0.048690422387721657, 0.027625676945502317, 0.087751539276551271, 0.059382068636311708, -0.15547685553596879, -0.0089930406367377536, -0.2169595372240255, -0.20894528496184284, -0.17492068880682238, -0.10306183600146183, -0.083259534728607171, 0.10865204818788957, 0.060744670090415315, 0.050196375528596446, 0.059347173941546122, 0.080550163011289838, 0.096041183403468094, -0.1792150255632714, -0.086359515761684963, -0.19861633026471431, -0.085305595365594317, 0.073404453468704292, -0.00060915535289933487, 0.017864996966518068, 0.015229839479410548, -0.028738700704038833, -0.030631095956117516, 0.083546542374686478, -0.015199467885082363, 0.0079196568766907727, 0.10542259168905797, 0.045879590738125489, -0.016176817524772791, -0.064404029773047405, 0.056449523541363983, -0.0011675857621973734, 0.0019961877116474042, 0.067416701497825943, -0.0068872964750457538, 0.034855870056329508, 0.017610685547011118, -0.064974529939064218, 0.072135113039659637, -0.038534030205095104, -0.014020364161441437, 0.00029360239040131242, 0.12282296947714948, -0.084526078839246968, 0.072733520082105957, -0.026199337777164058, 0.2622823203473173, 0.056466937642953463, 0.026818371415154252, 0.093991868595920028, 0.035828326553373244, 0.18170527988919383, -0.015152288577127748, -0.017615532167961634, -0.0031861578874696761, -0.021179342150732736, -0.15213715846860609],\n          [-0.13774523436409969, 0.038746368626390894, -0.00070857044653628576, 0.049355010027965204, -0.088279225323666277, 0.3384991916323753, -0.064154782872609478, 0.013423151043787954, -0.019629041697081684, -0.074514483376996052, -0.090355781264570376, 0.096941216713528164, -0.11910664582618065, -0.15100751467224666, -0.013947233410068524, -0.28747834932862831, -0.37903665180179325, -0.2028061966058827, -0.1130350051672437, 0.025054091741846772, -0.081018737004221672, 0.092552127718648639, 0.00082246462611298282, 0.24245844724477272, 0.12843614602564724, 0.13562020313059403, 0.08959454097829489, 0.23076896835282149, 0.17282137454049196, 0.15120139028220045, 0.2108003848913195, 0.13274188314172597, -0.11296580760432726, -0.23425804061193015, -0.15388856567280207, 0.047550247591945885, 0.13675765224748537, 0.14970887500641089, -0.014598687955070258, 0.02452413980077512, 0.15008479234563366, 0.021969575372334967, -0.017209314441183898, -0.12566589356298841, 0.057462149793583807, -0.12422822668708502, 0.027717976800794235, 0.076470028456385508, 0.15084174315157894, 0.16363419431275902, 0.10314072255216514, 0.098604445511354985, -0.077889086218999121, -0.1661031133394909, -0.015523729349795651, 0.033968447572520016, -0.0064287733234517919, -0.077784123694540519, -0.13138597183951684, -0.16492537584704581, -0.13707718063627361, -0.24996598417430377, -0.099387315671480653, -0.041816272470969071, 0.063392795262038587, 0.084656792003326736, 0.073596111775181064, 0.0096742751571591568, -0.056184484902255249, -0.09782611167515598, -0.20167456268371736, -0.035743089697776065, -0.053853754214006649, -0.094088602733082519, -0.11120588730571836, -0.037671666252394119, 0.031541190146133206, 0.092725555798098935, -0.02405726855688603, 0.006010846171522255, 0.026069243416314662, 0.052952378460022542, -0.00074538711425108095, -0.039415421335204141, 0.00012581754959352376, -0.074805820908263931, 0.010523867284072515, 0.062406077528648747, 0.015813904262298846, -0.064838239938092582, 0.031265967377395135, 0.027507834966997668, 0.00012699672107176554, 0.05079690966459828, 0.078969877915991929, 0.098317505905439417, 0.054192666869303546, -0.013030640855035372, 0.049683315230003938, 0.083508971632165918, 0.011784477594072869, 0.091871680671077899, -0.0066226790079174785, -0.047956123703921293, -0.017090317814363196, -0.078740979480628748, -0.046730705240827737, 0.018513947238313962, 0.071499897543357865, 0.064736690247935547, -0.032650670337155206, 0.061363794900654349, -0.039888121585693735, 0.06940981414444819, 0.077977297819488783, 0.066133719833712273, 0.05598211257429133, 0.072595488855594997, -0.053844526913953562, 0.09608563004350644, -0.028805713693717965],\n          [0.044235218750753806, 0.03452490583678916, -0.1304293688025541, -0.03539195098364023, 0.017969397644679183, 0.035178036504637217, -0.010788443554145211, -0.0016502053765038854, 0.039150364258434663, 0.21472717137309544, -0.094799579619150101, -0.028715342944390494, 0.054860337568606081, -0.039323795503948329, -0.071940860906896581, -0.11930894160210025, 0.0078117674331285164, -0.13496527011108017, -0.22468220163734792, -0.041963716626139388, -0.18840317509998969, -0.12848466572254685, 0.032762146633843053, -0.0022056152468009141, 0.10277613826454918, 0.0012177391079194258, 0.077762844802185094, 0.014832783378042141, 0.2549270879104647, -0.14122761490223984, -0.02812892511916594, -0.090593423291392555, 0.078746303030107434, -0.013334851815846885, -0.013098417976838569, -0.085997431567791716, 0.0011500587455686162, -0.096291957570617565, 0.16218222843705965, -0.026280879180661507, 0.4059162672347385, 0.2242570275495756, 0.088914801219090844, 0.087380936685669458, 0.043235742271058968, 0.10434670998406992, -0.02968326553011473, -0.096106796162175004, -0.16572721595924714, -0.17366678905777666, -0.030961339846240048, 0.059505554081166881, 0.049325908092511556, 0.12756582867533076, 0.23979790342729132, 0.12399889130520506, -0.27711805486247987, 0.10320304516755278, 0.071366923473124746, 0.066138985335745387, -0.017570740572059176, -0.21848821035302129, -0.096325738578736123, -0.013236997628355902, 0.14099804783148318, 0.048656476054380837, 0.030847391971354002, 0.12062557790469333, 0.031940378289510442, 0.012663844222798573, 0.053034778014022767, 0.023358934432241123, 0.073600738663428589, -0.10514949440993024, -0.16524216303765682, -0.25669075988459938, -0.26896594887147668, 0.018565946082153541, 0.093589512766167254, 0.028127974684171123, 0.018696901200308494, -0.015875163077901967, -0.0079379097617384188, 0.030609616137362825, -0.015794143119850355, -0.095236312837370815, -0.029087387305527151, -0.13651567962256067, -0.073683058450215624, 0.054901623218963372, -0.060990796740251554, 0.093170395781096649, -0.0023871205690264331, -0.026190765199777231, -0.04798880819540316, 0.019891792536779831, 0.053632284454708232, 0.021996415436857979, -0.058484829619743363, -0.0082971666182568952, 0.085922982573187742, 0.0078349537872220328, 0.0074972747215579123, 0.033528171976771326, 0.034258795986853316, 0.040069268495681584, 0.016642170052174849, 0.033376554888908505, 0.0094589897400608781, 0.052064551717063458, -0.084929444469789464, -0.091861293774294875, -0.072335293109873536, 0.017511044864076567, 0.083822791083669079, 0.029829413251507158, 0.022676448560172629, 0.092823512749215645, 0.027104627928702215, 0.049933127943481807, 0.25204397185842226],\n          [0.045017070595711133, 0.0498642789949671, 0.082320969156012919, 0.11789478363532714, 0.11183772343297438, -0.1253322045343096, 0.073011089356233294, 0.077003721577057399, -0.03717900545496422, 0.11530429785134244, 0.05730001513322304, 0.097848781670201404, -0.03060524384717013, -0.0069899183498422779, -0.043814689161140008, -0.041086107026221175, -0.10156550268991253, -0.030984257446209529, 0.062242270842820177, -0.085659902110209532, -0.031199205006548048, 0.09466362301479106, 0.18696360752101071, -0.1661308799155149, -0.0090085495016999778, -0.12606646172545299, 0.061744312534455212, -0.10058744884305808, -0.32554386979332489, -0.093972833934417715, -0.084099675017452177, -0.19412666055289363, -0.073752883041483294, 0.093206668950364335, 0.053698626158480575, -0.030509976495433661, 0.035499265069312287, -0.088218415409939618, 0.14081935255976538, -0.015418397657317465, -0.14008063599426096, -0.021415771106654449, 0.073017887242636206, -0.17726620239081409, 0.049670987591142773, 0.034513230883957385, 0.10331367544756308, -0.039224198145387315, 0.032001387649784233, -0.31709931967548438, 0.36394741418078808, 0.15239466974253513, 0.12006928728376079, 0.012632970433185474, 0.13528479946899857, -0.043263351294103289, -0.041986389073361857, 0.069839057237599783, 0.0010105840343706679, -0.001177493293526035, -0.011794825581052382, -0.14348506855517926, 0.022137252763930207, -0.039687582510860714, 0.26218159086991571, 0.19436953435957777, 0.11018262120789611, 0.022791444872238911, -0.097374550971521742, -0.016625841483821784, 0.15980938407436601, 0.079561148796989944, -0.075451842770343128, -0.028023527278215769, -0.12778377344107292, -0.070600952976917736, 0.075854745502590859, -0.061104114583229563, -0.034255065348455287, 0.047000517227076224, 0.085956850425998793, 0.04282729750891924, 0.035824417662887978, -0.0061231911453551446, -0.038509250299150546, 0.052491286674368046, -0.012429025518286289, 0.027802410046689319, -0.045633571810510726, 0.057329919165400409, -0.074157742801148993, 0.0012829945233095302, 0.04703190758387131, 0.024833428093670173, 0.037204577451850254, -0.028766340858447596, 0.04836022604994912, -0.053270097737550898, -0.1225368009934108, 0.037120069768975875, -0.089284007907524526, 0.064955297078712851, 0.077539064409025166, -0.027111775203657915, 0.09566272146318118, -0.024483731157729047, -0.036211650145923778, -0.093915798725000027, -0.017320414345298095, -0.10222122825099972, -0.08839882935836986, 0.018021145195601808, 0.014346493014463765, -0.0045931108148111605, -0.041330999096111307, 0.03707125175822254, 0.032109088650756609, 0.1327316051894474, 0.075109541167208693, 0.02562779748474479, 0.14212920960470612],\n          [0.15729146952739428, -0.052978575964526695, -0.0026258454378078749, 0.07899544804862188, 0.082044056126512888, -0.13536453065722548, -0.013649345776134983, -0.013140590068438054, 0.01151285607422449, 0.051596177430297457, 0.025550220473819302, -0.039487220487149505, -0.034658288058216052, 0.072490544458391787, -0.11567294550509376, 0.067863801617483122, 0.068650773394936471, 0.073985890698350126, -0.16153712899081113, 0.040446464260465734, 0.071466438250948588, -0.11469018047321458, 0.054050503923005255, -0.041043012191213868, 0.14996547269454152, -0.25422330965645823, 0.1969719351437533, 0.11290777964377821, -0.020530641521012943, 0.12889998621276044, -0.10368261923120013, 0.096091901965415991, 0.15324884079071813, 0.051489779311227196, 0.033559562206468427, -0.20829917204727766, 0.022893590362530233, -0.26249604314109187, 0.01920855427735553, 0.23588413973673644, 0.012602139087501865, 0.20972078789304485, 0.092568536380977479, 0.10590976891238137, 0.074213758099456212, 0.028278486131047539, -0.034766214821145405, 0.025387015471766056, -0.21114625235885243, -0.18142723897056606, -0.036903154611340375, 0.074542244212791459, -0.073942717333307595, -0.12923367863313379, -0.10286993284460598, -0.0020478562727464372, 0.0070327870476685345, 0.041658770263764591, -0.030913879256598803, 0.20126029986072963, -0.36149406972284098, -0.5918877032494142, -0.34765190314312044, -0.29917756970453346, -0.043195465679216768, -0.30777208287521557, -0.054570873464765829, 0.035677453144259269, 0.033779035010883279, -0.11152465910750621, 0.11790825287438664, 0.50742402779615148, 0.23855694673921737, 0.10488558912344918, 0.074814936164492321, -0.010757602002390856, 0.098422174417897912, 0.068011512986524178, 0.040081067317637512, -0.17815840391411603, 0.015218382958913604, -0.043044787072747059, 0.069478785978807592, 0.26248348656437781, 0.1306172564649099, 0.15898046016824569, 0.098913085077125359, 0.16690881596534685, -0.045455788389378013, -0.051217783957418925, 0.088651764746293119, -0.024238261127295962, -0.12061118524458514, -0.13932561033045077, -0.098447824398158607, 0.084104128443532489, 0.03609504694316075, 0.064677179270859433, 0.019556502245895897, 0.054584837489264737, 0.011804485067672219, 0.04962752013073167, 0.03158019227826489, -0.042127606074900098, -0.037246845366204762, -0.00090228035552694652, 0.05127558828330446, 0.017591411946701482, 0.020608297506701782, 0.12021482673005342, 0.039021952316670633, 0.021711754771879227, 0.047172199479969562, 0.11457521712485876, 0.065529260941908848, 0.057133065165575314, -0.064145843313717532, -0.079153570089738917, -0.084203588908724702, -0.13317811959911652, -0.097193108721414789],\n          [0.016239054180390664, 0.0039662727937494063, -0.0045546608488466339, 0.013554085633964541, 0.04287384927044155, -0.15274614529097097, -0.027274870950224753, 0.009662815968977459, 0.00030503272333276543, 0.032218254842854788, -0.036021236700139334, -0.042600552093793376, -0.041216087356306746, 0.070225279182411185, 0.088251463799817353, -0.11943869442811812, 0.016009417433122689, -0.025892296238322871, 0.043718898111848606, 0.046349743840285895, -0.045519881760365574, 0.057802463286196488, 0.03299849377053235, -0.074789027962275934, 0.085612573613843404, -0.082967036772006134, 0.12226353323600213, 0.056995647983886233, 0.22311371083336579, -0.12892292639894809, 0.028711597590839549, -0.082294811006116686, 0.074670881436146558, 0.024025896326078336, 0.07065603601313146, 0.052863436123422466, 0.13162507032318282, 0.083850012252808775, 0.019373316885252463, 0.068601186045407672, 0.16045426623761011, 0.14512299636928327, 0.090971987176700866, -0.11720878638068641, -0.10960101740165, -0.22989932998426871, -0.040375493650495087, -0.20170065712267327, 0.21032193985451469, 0.028436766808479619, 0.064868788568131358, -0.18348723541305237, -0.17888322479271676, -0.24993108343054868, -0.1218218035048543, -0.032694964791572315, -0.0037869041619365135, -0.24885660964872919, -0.15602019937684342, -0.42475936671170156, -0.42360041816934524, -0.36080165394257169, -0.18904408350207366, -0.056628034016529188, 0.0019947298303030075, 0.0099847288775674753, 0.1075269031323472, 0.21965496214815466, 0.18511412087840118, 0.19939690136264532, 0.23706194766652711, 0.1585535076891107, 0.23755501089495354, 0.24026771887297607, 0.14806350471741694, 0.22743537801775957, 0.12507232761343839, -0.12207706841814078, 0.041225407558751273, 0.12974091028573875, 0.13877343222126551, 0.092819074272623342, 0.041456933016731201, 0.12810971742453969, 0.086282278039654381, 0.046482152214626163, 0.03598526522115604, -0.14999835453581617, -0.061994753063569302, -0.12774624354082473, -0.055468530754657547, -0.072055656326832668, -0.031200201377666728, -0.021697705969703371, -0.020319605794475559, -0.011808386343022212, -0.10716560570031625, -0.082342449185127842, -0.019256109946120217, 0.066678811003636818, -0.041536723571689332, -0.040687519600928507, 0.044724573527092748, -0.068305216896473495, 0.035585363893159354, 0.026945608802347733, -0.011423097664885327, 0.061366414602964534, -0.049741414287749496, 0.054484604133461456, 0.14247436696258881, 0.03770989015507005, 0.014814583813689983, -0.12196638284522934, -0.040852970973417571, -0.0048072698419944909, -0.093844453345438394, -0.11066938503473484, -0.01308544267539942, 0.020003661283812341, 0.11572349318879958],\n          [0.02861973429703818, 0.054226325319119265, 0.017678757532143818, -0.054622115279891297, 0.00068166158543815636, -0.061011028044801754, 0.025449624542795035, 0.039248763551355731, -0.017614050568012716, 0.086689068955178875, 0.12901578182703599, -0.059155840152992877, -0.033658287075804989, -0.11303253492598647, -0.0094407403287756972, 0.038300106001050702, -0.024382057855670103, 0.13094817594507807, -0.17637051833702583, -0.042536434179399618, 0.024839476402364308, 0.025341112503526046, 0.073379240915845495, 0.12490394236296019, 0.052334528402483899, 0.01959442719741869, 0.014409551889643532, 0.06939173936687891, 0.10114636722821412, -0.017834270494535995, -0.0052538748958707721, -0.049449629111543728, -0.018515125726140946, 0.02732694249374093, 0.09763594846358073, 0.13398387575020193, 0.028128579416720284, 0.10345916561982525, 0.14559912798485353, -0.062225750838370064, -0.043205385313047517, -0.13615012492801842, 0.0094595802241661097, 0.077643293280986139, -0.01883839881610818, 0.040124806139584204, 0.046082762604961053, 0.11596384414343883, 0.041671199210061065, -0.035255123832835487, -0.24210069103686924, 0.1341304895480569, -0.12174034267618312, -0.0024940337740440369, 0.019159096554587522, -0.28596248479682318, -0.064486219660767827, -0.3159404613081046, -0.32103692755655011, -0.52703621320348082, -0.523706814301239, -0.2219710388945374, 0.078177953209590229, 0.037152776634131052, 0.079429350175809904, 0.054710873615715222, -0.030973473678087608, -0.17109338841301949, 0.096071725904511768, 0.02326460744017457, 0.18229765892428224, 0.50841537933922254, 0.36327137375759511, -0.17442768533982334, -0.075940774557052448, 0.084582691420455519, -0.08264079354279294, 0.24078778306714929, 0.12327508787645428, 3.0311214018877153e-05, 0.20734217619087927, 0.13348805342234585, 0.14204478537466711, -0.016683009143729791, 0.0026274236589628186, -0.050599783470677923, -0.093501642534019186, 0.049346638059468484, 0.027169521962694204, 0.0088066775641548883, 0.29974077633101837, -0.017370887640425853, 0.060472611475062152, -0.083274580137458892, -0.048734360258655733, -0.12258982430184573, 0.07453840474434334, 0.0016868192049145497, -0.046678375687987328, 0.10225565600123501, 0.096413382614769089, -0.085167675344914512, 0.011074699633376178, -0.058526124313595766, -0.032743113966618241, -0.1722075038150731, 0.10625699459128871, 0.045122620395145224, 0.063156899424295448, -0.023657194122683647, -0.086189421429932939, -0.097155679216888668, -0.11778596011866641, -0.0018160616946504698, -0.01837453110222613, -0.022154736774935388, 0.069072543182675333, 0.061842701091324143, 0.057417191163580447, 0.030372244451354793, 0.089787775464562541],\n          [-0.001637558807711853, -0.01523399155873769, 0.033084196663500154, 0.010429688997138621, 0.026387307256101139, -0.055493049532405039, -0.089867986082774118, 0.031318369429763571, -0.060212072041702008, 0.060345081620277463, 0.033637859079548624, 0.074907674442576552, 0.06734422144223931, 0.045408985332457019, -0.016588163375265065, 0.11808910368697124, 0.10674593565355751, 0.014356560764954368, -0.00029905420194112353, 0.032489925736142289, -0.079691004870107801, 0.0021152438820417965, 0.12842998293419816, 0.027685506112132927, 0.051037174605280025, 0.0095027734141051382, -0.088577143955959933, 0.072415217616874708, 0.18758587336750721, -0.046260082649078216, 0.032834457400313488, 0.00027333660832160045, -0.0056258729733840926, 0.051335227757921958, -0.028997953896369527, 0.010803615722912593, 0.039278862874021811, 0.059934818237191961, -0.036672818526105114, 0.0020455805172246433, 0.08420494892293047, 0.078722497431976415, 0.072927829328334359, 0.0029102454584164217, -0.014711323072181468, 0.061978949521715912, -0.0058613640044295964, -0.0065096004647029956, 0.15462308680710604, 0.10998731441673203, 0.055119939764749493, 0.05724647785751881, 0.08467350723014512, 0.045415614831981893, -0.027011213416260203, -0.41690504010919505, -0.2381619432525145, -0.26802740977048395, -0.42973960239470188, -0.47128936696927559, -0.47538117711853761, -0.23332878411143415, -0.02866052018803172, -0.046785685844234697, -0.013910661881944619, 0.063557340319003772, 0.20816618228755654, 0.1268039069069368, 0.19584967158175218, 0.24120710644978025, 0.34247879950952587, 0.22000223848712153, 0.036993585153171818, -0.24940743884977212, -0.12911855055552002, 0.0067607783858616433, -0.016380373357314598, 0.023975770224144183, 0.17281340795556549, 0.06774703585492528, 0.099348094695161412, 0.035397538040306792, -0.034631661821791018, 0.1100865505604692, 0.005313191434559647, -0.1852260149514699, -0.015871161665418073, 0.0086230437445217883, 0.038923750125692352, -0.014894463369033356, -0.015235500642311592, 0.0015905054090605206, -0.025942083213375461, -0.048032891124765054, 0.056968059211618904, -0.0053550471186975812, 0.070041367697070894, -0.019904063376663322, 0.10013072647581948, -0.030663141377206063, 0.014936482187214051, -0.053377077668385668, -0.046191143798223082, -0.049737104601448617, -0.032034940192103359, -0.026289206287861282, -0.0073802153527658398, -0.0085776521075193179, -0.067451013841572996, 0.036964969790641428, 0.012119189183510626, -0.012732265280952129, -0.014067660545222016, 0.011208506370721377, -0.0034197755020493881, 0.12161984708872418, -0.090967033228651281, 0.062061367658091768, -0.023761385872915743, 0.11195006309284704, 0.10944483983918517],\n          [-0.061429217767686103, -0.024854862147621323, 0.037533900593050687, 0.053055218475401428, -0.029090391144677347, -0.076607532589230393, -0.056250478754706124, 0.03851333502343017, 0.0094111122857806068, 0.027627758598813779, -0.040484333944467571, 0.062572284138447634, 0.018534104488487108, 0.099953923075381451, -0.011584012590548413, -0.027052354458091218, -0.0059961345960441587, -0.021253583302654644, -0.031551826484526257, 0.13841564062729481, 0.0044654988962283121, 0.079158575949980478, 0.09330712693847118, 0.021057360335951708, -0.020072455903489106, 0.0078349261993443525, 0.10646163879333373, 0.11394158834484362, 0.095624007084734647, -0.00037973373006179589, -0.010566642708017659, -0.021229433197596272, 0.11951412079200276, 0.15658745914488753, 0.051156677361355526, -0.06149908185714912, 0.080077841970438823, -0.060312781555823307, 0.10862415451751303, 0.090833457141346358, 0.037749802298128181, 0.12669250756084155, 0.019289318800248804, 0.11166309161116607, -0.1161166273753233, -0.038270596780716613, -0.013961859511050188, 0.057456373007881457, 0.035911303378527666, 0.11685366316626331, 0.020811499706270893, 0.042274819174293238, -0.11786932199756393, -0.20631689099465444, -0.10339540502604118, -0.032371044845522869, -0.14327246772273436, -0.25192334370553027, -0.43351265016373064, -0.32253010533464199, -0.39759972190268117, -0.39288382422516366, -0.39114382180517604, -0.24669511513347489, -0.087920593700299116, -0.088613432773507361, -0.15980594976718124, 0.18785644160235501, 0.19150833663803338, 0.46363761289278804, 0.15919333829593552, 0.19352833505902622, 0.23198389189372812, 0.41944067807959584, 0.29116622643028034, 0.13265224163991357, -0.041280875296069018, 0.024460830389148203, -0.058649245871120803, -0.0484310682254976, 0.074458524703983509, 0.038048304115812073, -0.040110091881074464, 0.059869902924825739, 0.052511568070781466, -0.0090562152269471445, 0.023537459561038466, -0.06819758275382648, -0.058682078489213363, -0.031437612709725359, 0.057289605620930092, 0.09631916110523682, -0.010631903539778567, -0.072422830632186297, 0.026755462358263725, 0.018665513895049689, -0.035082729434644327, 0.0033658937666455023, -0.025999751547288244, 0.051530594005125122, -0.095877639344744012, -0.072903503224737154, -0.067948463067868003, 0.0043261175722517503, -0.0040117811540246531, -0.0054864150036365369, -0.0070406076984890556, -0.023664491880765207, -0.021348914552691282, -0.055764945037704343, 0.076203461056541313, 0.057794773037288215, 0.004991409560975428, -0.014553984524648442, -0.029743957901801635, -0.057165125367652947, -0.0010086458792998715, -0.035361751471046692, -0.0047530832054770919, -0.011301320960084231, 0.11501077964365991],\n          [0.15173553770142628, -0.014179130345110133, 0.016877350096463503, -0.077204656983401884, 0.07810802077917843, -0.13112570903713622, 0.002753461595534773, 0.051910634906651945, 0.028947846824779341, 0.050208812521650187, -0.004579484116651808, -0.10684515347432511, 0.011155331270464766, 0.065186111881263234, -0.13027319256310377, -0.080144308959196983, 0.10735864824242532, 0.048879724645552361, 0.015758793271349616, 0.12191464251681002, 0.096984668731898774, -0.008083344199497508, 0.02070520927773202, -0.081937807089683207, 0.0046465366987262363, 0.05614793344286019, 0.16628267002053893, 0.04618252947477354, 0.077657994922063114, -0.019960907459527263, -0.096538343643650965, 0.079466046122461123, 0.25805196379883999, 0.007762217116777187, 0.069519575178526374, 0.0095238196373019363, 0.26151693837929407, 0.086788350648662874, -0.037402260798162723, 0.069485740614805419, 0.071694722362200328, 0.13258033500501015, -0.02145849038805818, 0.056046350520208621, -0.00039374783734824614, 0.03222219258902316, 0.18458145122623904, -0.042539782956061298, -0.012963640462772971, 0.170102640969749, -0.023561860478587326, 0.051152948285101807, -0.1316626386662188, 0.02066528156095445, -0.24022517587189773, 0.038647270662851535, -0.025858147741203062, -0.08145590938506822, -0.11686693255496608, 0.044401292680239651, -0.35730505607122431, -0.64580488622829257, -0.40587964607656341, -0.30571259666730671, -0.12682355113036897, -0.33497937322424648, 0.015693363372025454, -0.078712326242700498, -0.043104245874849255, -0.15482305108138567, -0.23546372175602243, 0.11116967724198698, 0.45544745949997928, 0.18491255398354933, 0.29246815522355635, 0.19673022854984701, 0.1971071562521477, 0.073292239939430431, 0.0082411542973328047, -0.11506545091726129, -0.0097698594083774834, -0.10085941287032674, 0.068419957471663198, -0.054338184555724992, 0.077438069850143426, 0.17116462221553444, 0.0012880410065990583, 0.13426211870566188, 0.11060346830231947, -0.073247383642716754, 0.037258219358590916, -0.012266626223890298, 0.07365939898386821, 0.043783414774759152, -0.10714901521414893, 0.086654095775271639, -0.068763019687166305, -0.058722296121373203, 0.044547323244407605, -0.055317944470135778, 0.033044549367641826, 0.057546028232389426, 0.0013722198605476341, 0.024825635569633846, -0.12204262640334872, -0.10189632816975304, 0.054772548849134656, -0.079577832810170182, -0.03822925555621319, 0.036494728908033278, 0.13217334923490376, 0.057211373582709266, -0.025832313366592516, -0.054716283139663077, 0.013913569251103083, 0.1233331303710279, 0.0048703487927865205, 0.0051743609192116194, 0.028390246160885126, -0.021507757354650846, -0.034672329558215337],\n          [-0.0056383990198644179, -0.034134669652071015, -0.022985171274173141, -0.060424905116766223, 0.054918574572591805, 0.068880856398085097, -0.0070134853831463756, -0.00648857975984031, -0.074996514150436733, -0.002575895078660656, 0.023015025445107737, 0.0083652936395193778, -0.031176094638168075, 0.04257338372246873, -0.066108851141710501, 0.029356311647627392, -0.013291948615577448, 0.056361974052678648, 0.034219482611279453, -0.012594934239664096, -0.014011911140779154, -0.062380978120753092, -0.071139980976335282, 0.0024195852417379371, -0.035945491331999854, 0.045638008001674502, -0.0047183763310553184, 0.066745235874213119, 0.045300106270492593, -0.044478673970143032, 0.089640508954303269, -0.096496181994925961, -0.027741072518757348, -0.0057167706753694508, 0.015013223612745458, -0.024603266772382323, 0.0013274270991194131, -0.035626865786564946, 0.017128923114182848, -0.045972517229731127, 0.0070036531582612499, -0.043147491260715071, -0.029564377599491043, -0.020695369020395371, -0.079784746542254759, 0.026833980742834287, -0.0019308823001443487, 0.083257616741787083, 0.1073292905313316, 0.074876843281655947, 0.04849810672333138, 0.09169820062468502, 0.04818495710565103, 0.052095948996421212, 0.0076798336966644315, 0.10519490110752421, 0.022530132067634476, 0.12672233854609458, 0.059196502607268456, 0.073165601756717547, 0.11595348012337076, 0.056154381226182701, 0.12932878620836885, 0.088424364447093076, 0.030086554964170939, 0.069155625788998448, 0.12091856805585206, -0.089931598708795482, -0.01901478695671717, -0.044734780540160696, 0.11875971731148252, 0.0019621703161090687, 0.098962626854570676, -0.014935988916705181, -0.058156651049639019, -0.030280527562952381, 0.039004290751598267, -0.084990899063584049, -0.046013083127367377, -0.014913760028022027, 0.021155606661541995, 0.064215604532574938, -0.023980009754675097, 0.028088175416754846, -0.015711319084152214, 0.055354677326641441, -0.10471526203870407, -0.089682724627139304, -0.285340049872218, -0.18318938265740103, -0.080773536226484838, 0.0051664926844681297, 0.057862500220190766, 0.064363929659878055, 0.089305276057643879, 0.033737553106247584, -0.12462760155848271, -0.15876787514393648, -0.3559472010693181, 0.09512910727572213, -0.14724808649647816, -0.20315881235781566, -0.084142690865390807, -0.21320097373742838, -0.18018782707193445, -0.21194408543671259, -0.10022760576175327, -0.021533171965098907, -0.037309088773028909, 0.12624286755807518, 0.22034948666962345, 0.18909901249809574, 0.15892762405783045, 0.012004127757768795, 0.05401853470010004, -0.028528312561415387, 0.0032335748506411056, -0.0066271780398669822, 0.08469326627498211, 0.11628744535951219, 0.19103429211412726],\n          [-0.086320145870854931, -0.042516109128475088, -0.0087762457752190298, 0.021241060023051747, 0.0047851426838899369, -0.035472062577375424, 0.0066937243438659755, -0.00018713747041253226, 0.0082764260933883976, 0.038739768015236681, -0.068077755324487108, -0.050241928574835407, 0.005362760135839445, -0.046723041558019832, 0.094159253636089596, 0.025986870656512701, 0.028402847338834608, 0.12799263106977857, 0.052174185297818504, 0.03174223717567129, 0.043516542799932806, 0.10029999162817296, 0.0098879715083901587, -0.035094445123424634, -0.007013648134597858, 0.06906108560461019, 0.096710723211050592, 0.081381162486572428, 0.057644504950450134, 0.011067196959459139, -0.018381106688349691, -0.082601705729948863, -0.052683720386780014, -0.019959970942575705, 0.019919134901318802, 0.074764134214878319, 0.0037733543810442721, -0.0014401279343240897, -0.10890764410839328, -0.057901568753596977, 0.062402857017999663, 0.10607261825733119, 0.093355866166383666, 0.16321573911501755, -0.044311905242035599, -0.0066519319038783609, 0.024113039196997976, 0.064553442056319327, 0.15171280458638239, 0.30457768060707258, 0.087041706132401087, -0.1300649085600688, -0.11937696051908048, 0.026590394860137298, -0.061874328052457871, 0.099972551939148752, 0.063820348697113671, 0.1176673091939654, 0.1041271101548924, -0.064651383836351634, -0.64838832442120542, -0.57718682640452723, -0.036255792881924792, 0.17483800093943763, -0.082878993225198747, -0.052895537911918783, 0.093450779297526765, 0.13222855504871267, -0.0031158955676405808, -0.20504263887375321, -0.56713098560646558, -0.17042057724882412, 0.5127831574851569, 0.08057209143675742, -0.069034813778198756, -0.076493686008414857, -0.0087908313214440509, 0.063359179277283378, -0.019296007009984323, -0.26310778686915193, -0.2643185488881028, 0.0043899974918117923, 0.41748261831713607, 0.23966204304538938, -0.073562286976180655, -0.095509848197381481, -0.23474683230766644, 0.028298339134101541, 0.061074713423239807, -0.16176706647884559, -0.0028366628109293551, 0.09422220116207343, 0.12827497526492809, 0.14706895212081389, 0.07130221932440324, -0.074737279889640948, -0.23885224275969291, -0.085022204291187037, -0.071470035260692039, 0.0091790645587277592, -0.00092605797513910237, 0.084223960477746732, 0.073149894313199529, -0.027624077571723846, -0.10044220817006712, -0.0028872784191937562, 0.084866079586548959, 0.010310191760266263, -0.00054869280830070755, 0.084217742322492933, 0.0054030147214450402, 0.095305448601468015, 0.021416282988412971, 0.032093023880259933, 0.095157599788670486, -0.064421030882217095, 0.028974651903107149, -0.0069885504710366086, 0.15811077547403324, 0.077388062511628844, 0.22282468960474461],\n          [0.076468088841762316, 0.094525480369675952, 0.013417457238376423, -0.065411302473434824, 0.0022049098738461115, -0.19542909991536384, -0.01036325544715716, 0.00068240056414065053, -0.025036329876752375, 0.10709994456938719, 0.17509342504686981, 0.14614357796041205, 0.053718089360122373, 0.033398784940497278, 0.05851426192031009, 0.10088626385947798, 0.12393259984256801, 0.00030036795350879553, -0.072506053021494155, -0.053549467701917083, -0.068974945061981693, 0.068142910765739376, -0.0032046953892697905, -0.023764344412627286, -0.033057372612734337, -0.046769398096507681, -0.12086069080136047, 0.13198139059769748, 0.010909080970491494, 0.11805853563674065, 0.00055654489186848788, -0.0058049086792519716, 0.035993036729574671, -0.0082657161673258817, 0.06835085226718729, 0.030100108849902718, 0.11300169606234395, 0.049423358201738793, -0.18768681794943032, -0.089816229291464017, 0.12209444756370379, 0.065398341021977502, -0.23087808851819352, 0.013400992883371765, -0.096887032265275258, 0.09659335704424854, 0.089714531995257141, -0.0038843040921827804, 0.12013144346588932, 0.37404235084965881, 0.21211466109416433, -0.011527049200226763, -0.049283581516932851, 0.018754604765659974, -0.082644951395777433, 0.10817924171979713, -0.058116213333392674, -0.049761441433128661, 0.038467810528975951, -0.27345429596810805, -0.84643475711205407, -0.29645101227395931, 0.088275591343327284, 0.11386954716890384, -0.043246196130588041, 0.0080366797469389184, -0.10745428649421408, -0.31046605943055011, -0.044147921462402942, -0.1780528735930817, 0.27176076889250983, 0.52374603988343083, -0.34603331319263742, -0.25552652026400441, 0.041698726893088206, 0.17631040231935152, 0.089000463451089376, -0.034971907472605007, 0.015213546106438838, -0.16155001168047278, -0.0044616122955418308, -0.19608326491524342, 0.52390737300255208, 0.38353319497536614, -0.18308498375136645, -0.36865739333612096, -0.051599769698091352, 0.18507587383644392, -0.03905957968438431, -0.11293732152378697, -0.29448175156766543, -0.24257847708785274, -0.020336287901657812, 0.16460493865286885, 0.042028560709745783, -0.034578770254525062, -0.080621311330306228, 0.0023780590689402997, 0.097090140036115533, 0.25587417177669869, -0.25284237850182822, 0.061610630265467842, 0.096069531106907025, -0.0530490597234618, -0.016158178823568958, -0.051427555078757459, 0.15564444153816212, 0.18885757011599216, 0.008434900332647044, -0.048989097338605264, 0.17712068560704061, 0.19164022835084701, 0.18133053179257821, 0.13611731878917838, 0.16529628517400261, -0.029342409275796733, -0.042788443152580583, -0.05354612070195941, 0.043048475539918307, 0.00043498176350832696, 0.043391550136365135],\n          [-0.067392496195279539, 0.15603790499391812, 0.33005542485267503, 0.17019472884597617, -0.0097698948495494181, -0.11247473585306066, -0.094639604761681095, -0.024494294275221998, -0.0039792348017262669, 0.10994471173246248, 0.034232693599063196, 0.17574157070401114, -0.058307873942274629, -0.086035618850559076, -0.089377803027838487, 0.13060740524380768, 0.083342578777239079, 0.045589343153219719, -0.021500197744655239, -0.0396176985432692, -0.040282895436041813, -0.05490829999440229, -0.029620701005614619, 0.033422070447237745, -0.18107420807866342, 0.062628310049176433, -0.15452481995687467, 0.16302391245774031, -0.19245645289137592, 0.025898631717022558, 0.13801998524859399, 0.04258082061725732, -0.10231719535275768, -0.047878669979998692, -0.084651539536313797, -0.10421201862848327, -0.11475351378970063, -0.077447511407303965, 0.1751315391960965, 0.31630961804401514, -0.21234361067848667, -0.13717780192340084, 0.032256315027359303, 0.16117460365654565, 0.12436610992083444, -0.1960223209372981, -0.10316972333420724, -0.17989050580766375, -0.030776595813913885, 0.36723472811894087, 0.26822822948346281, -0.14255591471090923, -0.34284397107479048, -0.1686302689762979, 0.20717723978005761, -0.043610297940625702, -0.21591071858781744, -0.35645281884894064, -0.35914145172088552, -0.356538210400283, -0.22838433437597963, -0.25414794447519751, -0.027037660554611806, 0.10429938241738665, 0.070313100422815272, 0.19633410406749333, 0.011469003363448749, 0.056100652037588905, 0.20979311430234168, 0.31382740777390794, 0.36266090418492758, 0.15632710796745802, 0.043118215553735822, 0.15941891562233157, 0.13799810456009839, 0.082456547922922868, -0.097362706765706603, 0.017535763817111305, 0.18875412500763653, 0.1322991804906124, 0.093159878677258945, 0.10015739152045183, 0.041771828139582301, -0.16461226846925919, -0.010269758847271757, -0.016121723288740217, -0.10277571356356704, -0.093042910656409489, -0.049186781888682446, 0.011398226094967184, -0.0002700750754074388, 0.0074397035104696863, -0.20028112611108601, -0.11832761511884456, 0.015078283473006854, -0.018452548998716053, -0.036365176981792632, -0.020537843773772754, 0.067467358606416949, 0.098981148732411567, -0.0055674402731293593, -0.092027331571991416, -0.011441078700565044, 0.040493420073942243, 0.072106906433957396, 0.047544507543730935, -0.010627683042822508, 0.010378739620038546, -0.037361124694111458, 0.049440729101802861, 0.23172672133978298, 0.066224037066196395, 0.053604258546808725, 0.070224030431698115, 0.00044743519172646407, -0.024040752967206758, 0.017027400054980629, 0.082502176517533055, 0.04411754553266678, 0.094445759480196179, 0.026070122517550864],\n          [-0.014874410513740596, 0.0064652695167254359, 0.18058268416301498, 0.10639801800645622, 0.1462435538011862, -0.18549085716772629, -0.11946585223026567, 0.13336875353850036, 0.1431606374421438, 0.21268324578348111, 0.074573037321912006, -0.02366332846738356, 0.00030162505180833521, 0.034923909748155624, 0.0004976437330811434, -0.27860795914035602, 0.019649427691563706, 0.22428728221168509, 0.10634587212193486, -0.055747191566415763, -0.1720320898158253, 0.14652429997383487, 0.083678061663021136, 0.080059996853547033, 0.12676990913561681, -0.20960004749175651, -0.11992969772303724, 0.079651052418806614, -7.0500155170752365e-05, -0.13159968070216072, -0.12185636491051369, -0.12212386528350992, -0.063471599790802455, 0.11591606931628659, -0.0003121176220944738, -0.16158531692072389, -0.20509977937167723, -0.015211020089078528, 0.33419363858602386, -0.021197972311742794, 0.051573854058283256, -0.081190824612454526, -0.024248010908752227, 0.031952786144903177, 0.089889994122808292, -0.055347674287966539, -0.19026769408809097, -0.20571271554392964, -0.0034200030533805825, 0.42337060834486751, 0.27260930919391929, -0.084997674317356983, -0.27009030033562559, -0.26984679182059201, -0.17357361480162312, 0.04962098882240612, -0.0035750137874818316, 0.036592663452975821, 0.0086359424090483965, -0.27032750814312834, -0.39994957932057346, -0.17183609797060095, -0.24083907079152436, -0.20001978264666828, -0.25264329034684119, 0.04388992532969703, -0.064259834604107113, 0.074043933060256278, -0.0141401497703907, 0.12916245281008937, 0.13074274654586848, 0.027929401203914232, 0.018943370061503276, 0.12690634935975603, 0.28764725653855128, 0.28887242369486649, 0.29998179562162908, -0.03702797972780987, 0.049533958877091146, -0.018197380038773844, 0.19754195456455448, -0.004838219692821645, -0.067001942206080342, 0.095328743007717764, -0.077328594117775401, 0.097921602001023816, 0.11726746577896972, 0.051206198923195473, 0.014744273305796744, 0.07451554959247797, 0.076594731593470355, -0.10212719204511148, -0.01010359791820685, 0.053405269433162157, 0.025967683489007781, 0.04284255334511395, -0.031649551549700956, -0.10112182853935778, -0.06200392753579289, 0.080996710847300729, -0.096227422002488489, 0.0027222873646967627, 0.0032193461798180056, 0.028018068894715878, -0.08039298406512714, -0.068243680675678459, -0.0065763377264938458, -0.10138976161964301, 0.0057770284685309745, -0.0019333108741061561, -0.028478055121693616, 0.078148481244774387, 0.0046718269408599078, 0.086525505520541446, 0.075149875794137733, 0.080911904001598672, 0.14299067937575605, 0.058254811658775857, 0.060032259045003374, 0.069309198206046474, 0.13733947078713762],\n          [-0.026403086547123783, -0.020917609288306105, -0.035101904048185611, -0.014306912310371803, -0.0042972195364363863, -0.058077881414638405, 0.038178564444327087, -0.0028111815245872307, -0.0038941084518951119, 0.0018813296297546939, -0.10078688565961993, 0.021583238308296865, 0.073511926370810235, 0.054528482565529779, 0.18987936161675673, 0.13986078152038808, 0.072940725148909008, 0.059256836874555796, 0.031090669459266307, -0.015844740201760396, -0.02361837940991314, -0.064937204109534769, 0.075642983811850889, -0.079466195820172975, -0.020769014944646391, -0.1040432783776685, -0.033012967133522031, 0.072788464701810857, 0.10548105228938642, 0.0019405459380496259, -0.0070425924572238563, -0.028398618166747935, 0.04518643635595633, -0.019186199862506761, 0.10714569627787791, 0.11822684975817753, 0.038571217188388802, -0.027458148938472732, -0.098264611636292687, 0.056390894688735219, 0.0401565173462511, 0.12886782282388654, -0.031555895682836455, -0.02313957239134061, 0.069122427442892292, 0.025102249881310351, 0.029789415685897214, -0.070652870595506262, 0.016314783301103308, 0.28688684230956962, 0.1702619783984527, 0.012540634976734383, 0.070850865861622578, 0.0048605100782281585, 0.033197753461072857, -0.091328697630636863, -0.15097408737648729, -0.024120509010246885, -0.024570140846357655, -0.41480944335467018, -0.77687153219324112, -0.27460992951941543, 0.13785951824037135, 0.13544781633672992, 0.13313817386432886, 0.082652802520245455, 0.089237854154998297, -0.044081186993255472, -0.076883101321275515, 0.12600419964023202, 0.40959366052382118, 0.087069283116805757, -0.46621168156582082, -0.43761485411451395, -0.10812067804268631, 0.01768640051563608, 0.12729816882590003, -0.064747448694650156, -0.10763464536172436, -0.08524826938436865, -0.23150319320387719, 0.15315343856469926, 0.55619678100250369, 0.23774692046366147, -0.1666896681928125, -0.17715538120217467, -0.16976838686613122, 0.025008504484853387, 0.060377572120923748, -0.20713294145422401, -0.18646194822017553, -0.08066176191384393, -0.0061085279041063756, 0.13478699831707003, 0.05663233125435585, 0.17462609841438137, 0.017491495363805537, -0.015088475844073315, -0.051792080298022347, 0.086678653491882515, -0.043885434378402269, 0.048343192446375916, -0.11502969777881612, 0.14059893815190727, -0.062258291133083843, -0.1133470132940385, -0.064953910797987582, 0.027741435654062445, 0.11898150752091059, 0.030260843676813906, 0.1715435352553567, 0.057333117013068161, 0.16205339464116109, 0.098608813006722904, 0.073912318801590465, -0.090815553665590618, -0.010370607459546058, 0.092275726044843492, 0.11030039690306363, -0.0058808178655301233, 0.033150477829288559],\n          [0.26549778400602297, -0.0011965636289475029, -0.022916846645374064, 0.042429672318282589, -0.13811673855846254, -0.037430883372056925, -0.040559761655224888, -0.023933501028027243, 0.079258690792885986, -0.034521886198656038, 0.17450462509358011, 0.041790623206738556, -0.022740750277082458, -0.0013539969792274592, -0.10138864950556396, -0.053305913995103191, 0.058908760919113429, 0.093372903179051017, 0.050140067951328054, 0.0084539027069934353, 0.021166550278200705, 0.10388208219238029, 0.0076348046928304547, 0.013138640062169096, -0.075217338734674163, 0.015069141903176639, 0.24056352482102478, 0.064464323761281916, -0.061520565707010158, -0.084694104843374141, -0.06805808373087846, -0.010291588861849124, -0.035798773818091045, -0.047137578793397347, -0.030265001058571481, 0.025114433975426814, 0.16953416528873916, -0.081754314336625597, -0.16483577488792853, -0.090215602604801506, 0.19963523508019926, 0.18826320002737132, 0.045614733683874802, 0.10861139159661171, -0.028328921848054453, -0.10351624721954029, 0.075321623520557809, -0.034012524380715156, -0.05869582193122358, 0.44090992264428214, 0.084019251874953446, -0.012849576849437369, -0.04246094681649424, 0.13375661768225128, -0.12950865617271876, 0.0026410719089161178, 0.044977821596146744, -0.090312411108535592, 0.055733826199718409, 0.060061106002439482, -0.71527711468395772, -0.2823457778181207, 0.031272225391427405, 0.11880824524917351, -0.004276759953008441, -0.011347995604354372, 0.0023675469047975545, 0.00043485509660366739, 0.18958682252204556, -0.085759813410154359, -0.45257574229053438, 0.15961507301364802, 0.31736731659376055, -0.062412313090533911, -0.33746000415329924, -0.24412114938634538, -0.06141338958196621, 0.13078793636510849, 0.20848205264195724, -0.20955124959973886, -0.28812988786360966, 0.14444443144018609, 0.46815272589228218, 0.085138932615497556, -0.22658732896395356, -0.027717075192951288, -0.16856281398342385, -0.13753538355338668, 0.15059745895188464, 0.00078477376683321054, -0.17890918828775537, -0.067288794701022059, 0.11813620983475538, 0.1093966751655376, 0.10647641748777864, -0.077849502674635002, -0.24214140318686445, -0.15597210638677117, 0.018451936251225459, -0.065300427051986951, 0.042693539088593954, 0.11063899895595043, 0.13459602826469319, 0.03073808878575153, -0.014969922588453921, 0.039307213284366038, 0.041004905630175364, -0.028333785559137958, 0.015742037834556716, 0.1142681683436582, 0.021003468182292317, 0.0077221565554255883, -0.00084805796798508026, 0.056396970533902469, -0.11249629487295199, -0.064031279727990664, 0.026888150461400945, 0.12621843363263308, 0.25061555337122832, 0.11067999815380504, 0.26256731149626561],\n          [0.072041366938857376, -0.022942168421451581, 0.20654586373496231, 0.0021517723151043971, -0.14297221024604706, 0.00060653444070969675, -0.058092024602730497, 0.13818306134022745, 0.17791598188652985, 0.1233364171367471, 0.0044528518545720458, -0.046059785461132652, -0.071586300701623362, -0.10073784448195211, -0.073740011819088014, -0.018045859949657725, -0.11863305748309075, 0.17617564045249434, 0.14977841506896911, -0.060747330352864684, -0.0027955678212599061, 0.16785791445724135, -0.1069842654168507, 0.082999543239617682, 0.12903189836552459, 0.047202915960078598, -0.030333770559695314, 0.099121495138076013, -0.051746600816636498, -0.20797950839871948, -0.0060523253550806566, -0.24640179139614737, 0.0025429730685309904, 0.056675953090986081, 0.13754251807005335, -0.079126091054087175, -0.17638998336346334, 0.055182291054404795, 0.29992999912154811, -0.12374985838286831, -0.15473061907953733, -0.015285688493998806, -0.0054135361559385919, -0.085840477677166474, 0.22138328866134657, -0.13129536918746371, -0.33146872033096603, -0.21124338516694569, 0.24711637651267865, 0.46372432064270608, 0.002706170884996334, -0.24160873975021052, -0.10141666077006732, -0.18322786018052334, 0.11158412852904591, 0.16760494025045042, 0.029994319879768874, 0.025682099122424931, -0.11958702177240098, -0.33142254026746104, -0.15444906222705926, -0.16381735574030895, -0.18306921419312999, -0.40205221035750643, -0.26593698021713486, -0.15682020509672343, -0.0002611999532893261, -0.028755553239042705, 0.27424611760615036, 0.21592566014741185, 0.2548708412154177, 0.097667264438525039, 0.20034297265732981, 0.19878852497931995, 0.30685861615553289, 0.17246611044410129, 0.018739306158119473, -0.031064357609991294, 0.02636646794424298, -0.18776759014039729, -0.1548117904943781, -0.037429208180667362, -0.11875155323060346, 0.10726451368176571, 0.17942453854019957, 0.11733499751282206, 0.0052778895571915507, 0.23971575743086301, 0.0079700671972805642, -0.05150273918961891, 0.055320037436683178, -0.040007912106383381, -0.092708107077101642, -0.031471166411299017, -0.098759311933464516, -0.092930223695402298, 0.055517948982359747, -0.037796492017755555, -0.0063425594979251848, 0.024882508886736474, 0.034983156636445717, 0.071931496060268246, -0.031592475014589311, -0.08635043298071296, -0.0090016951668947798, 0.071457472968914776, -0.060721615092941987, -0.14319100457707667, -0.048321071596804911, 0.081485340665029743, -0.028272073748030507, 0.063683871776067519, 0.0055479754033408712, 0.11811279082577647, 0.1406537167258409, 0.0040600159105901035, -0.01371930228275231, 0.12724155992658021, 0.099627352699487401, 0.13231658613798591, 0.13873127011038072],\n          [-0.027795762801489036, 0.19015374353251102, 0.097864499370304614, 0.12602658180552559, -0.033269074628986733, -0.089500715499542943, 0.04755987206442841, 0.073741060179395967, 0.10899124384412755, 0.010865871673477301, -0.057265695902511626, 0.17802866217244057, -0.063866674386830136, 0.018021373487705536, 0.025918690785187992, 0.052575744386986367, -0.021274343355739661, -0.13048583355248472, 0.029635938133951767, 0.021720608681606558, 0.074926473794418733, 0.05982963712461653, -0.076901179289292132, -0.026484578757325183, -0.15053176420715175, -0.13725487193154184, 0.087833236099425338, 0.066023074778773477, -0.09194730471659307, -0.2149017706218482, -0.020022004139598079, 0.061471356479686365, 0.041399022424228001, 0.031512385832822058, -0.015300106252072884, 0.026068470255320511, -0.033971179507359804, -0.056571591160507355, 0.18971099504863476, 0.088995348857820136, -0.15964206297954237, -0.1658659652422706, -0.11188281516561152, 0.12234793752765391, -0.052307886639272771, -0.37845338665931738, -0.096613913262061174, -0.069048222879974586, 0.06616884325249589, 0.45010838044304829, 0.11905472109942555, -0.089092894933614275, -0.12904510069418687, -0.036526361323872623, 0.054821578766419167, 0.024810152389095064, -0.29747232226539949, -0.29999245801199964, -0.30525086777987692, 0.020996924029338435, -0.24088524064845188, -0.24200960208227415, -0.089790636212287028, 0.040398429108714586, 0.02526034075506383, 0.02738946668147809, 0.27071204540517796, 0.36231522138833033, 0.17799155604913797, 0.14461290644587801, 0.039188380670349868, -0.12174172594558236, 0.062379698671313509, 0.053786808004118926, 0.077565363377853025, 0.08914298237579163, -0.082913498201941188, 0.047935941038607571, 0.032227521369624083, 0.1350352800448287, 0.01205967148514378, -0.0045403010495765339, 0.04815794062847277, 0.081651621340802089, 0.042005542551939397, 0.00094719895582431185, 0.013451602816859323, 0.046158292820973189, -0.086770110141339035, -0.019510393108648688, -0.011154645591627543, 0.027566377877780268, 0.061728447633688933, 0.01211458002765884, -0.023208391928071358, -0.031607312720043738, 0.059642540508696808, -0.036765889133114592, -0.015928896212769141, 0.0064080901614296526, -0.081899254344496963, -0.029769584611185507, -0.088820881932459628, -0.028070658348809674, -0.023691860637635141, -0.019599361049671284, 0.057438128582313362, -0.038195671616113237, -0.011284460479520503, 0.039955132103732395, 0.099447536075713397, 0.068549557521697391, 0.073047585512767549, 0.062482862870410376, 0.026345779828657455, 0.051335172427723452, 0.055074573131097329, 0.05467724826002196, 0.024905693805908301, 0.045383956637533654, 0.032908498475190132]\n        ],\n        \"sobel\": [\n          [0.021622445358756535, -0.039044416006162902, -0.037053874418492755, -0.070221762884057529, -0.14277178789038111, 0.010719228314107376, 0.23521416713985532, 0.042585931839459745, -0.066838617434589909, -0.035785952249555719, -0.04059161986118337, -0.04764960919347714, 0.015365501205621496, -0.0089412911030321875, -0.018093607051941449, -0.041156433480069976, 0.059193526101543679, 0.034970124073028692, 0.008553519349948524, -0.012132573309561322, 0.037118604219805298, 0.0111042284552757, 0.013666753799685936, 0.057115927906324922, -0.039502379569608656, 0.0017172576948862456, -0.10081077815789569, 0.037477947956047315, 0.16094952648226463, -0.067174391154844304, -0.034197546339512892, 0.043780102673210156, -0.028950198305796655, -0.075338573644424867, -0.037953071524472706, 0.015621349282515417, -0.0062936629565303812, -0.11863605824421611, 0.049183193707198238, 0.17069808619279628, -0.019042518561221543, -0.04243830041050764, -0.017632482496080508, -0.075731520983345624, 0.0095324271735924976, 0.032929665395846554, -0.014258152251170213, -0.0098967025572965356, -0.080727554710942118, 0.076950547720302298, 0.13010453872990779, -0.11441193151685329, 0.020647144228869374, 0.0074901484299721502, 0.029524457284514791, -0.012759212791825812, -0.0093580562023970887, -0.0058362056553335484, 0.064104388310505842, -0.16470494179736736, 0.094417901873677768, 0.13506762949639728, -0.044141557668112785, -0.052786309985618965, -0.010841128696787369, -0.0066630125429543163, -0.023002077304622413, 0.028816328444530765, 0.041660776154130552, -0.032027957181329177, -0.061564972379557034, 0.13252072121529024, 0.13006898279253504, -0.12914934815826734, 0.0036201984235415957, 0.036105422059974968, -0.012106081202489141, 0.0040581921012012682, -0.061907628638589444, 0.0076003677847962282, 0.036719522198239138, -0.14105768367312649, 0.20291678804533386, 0.060388661168118758, -0.096589560951574671, 0.054589139338588007, -0.10018987380801381, 0.041122915048875108, -0.036635205055412415, 0.11599660938438668, -0.072959009619801077, 0.0058380920703229103, -0.080459185128702371, 0.15241049645522284, 0.064258128129055292, -0.099760237579099881, -0.038508522408432909, 0.0044401907717541295, -0.027741747177757195, -0.03436923493861925, -0.015116464251280038, 0.0058884423068488005, 0.046096447137350165, -0.057576787493043513, 0.10122734774744221, 0.074735445752117727, -0.082870214204482526, 0.016464177481322798, -0.035808109707655661, -0.034750714642449623, -0.0037473815699105711, -0.026826464835886445, 0.0056597480426354915, -0.067769751698199487, 0.0568032112071548, 0.22043446790836069, 0.017122291321192216, -0.14459243689689222, -0.079001488823724236, -0.044799531513801144, -0.099981836109005212],\n          [-0.039421733196747563, -0.057937375185619755, 0.074729383153290238, -0.048044786321738378, -0.037187904273169307, 0.052702736653325186, 0.26142655681091542, -0.061948912592336147, -0.10675064435044604, 0.031812102150842861, -0.051384587313130461, -0.0060010201665935334, -0.00075896323127177395, -0.0050347123305201219, -0.041064685490394513, -0.017208529601601026, -0.0095905987638112492, 0.1312641811720012, -0.051457805250329162, -8.2456846587079802e-05, -0.063001416106639091, 0.00662330181235226, 0.0045051030283342064, -0.0083206197174064897, 0.034912618703663689, 0.012366610223709981, -0.059276577400723146, 0.052288462081552911, 0.15469918793188286, -0.051591770863725732, -0.045778765567233509, -0.0078960352945247718, -0.018756915070729453, -0.094971301563454444, 0.065529490603964152, -0.029158529667124129, 0.046869488668256493, -0.070024824171941891, 0.062730640085547337, 0.12065622163679911, -0.068657561209928358, -0.019058676809837402, 0.0074337488818226119, -0.067123189259470334, 0.02052950643564122, 0.013044402474017169, 0.0035087666835479231, -0.012030134512047277, -0.097183241294960532, 0.028501913912727009, 0.15192055414504166, -0.070640175383792636, -0.075748676174115875, 0.031913417912056846, -0.031981916836030161, -0.023049214827213602, -0.030048256280766128, -0.003272100719358767, 0.060009116628550338, -0.10610745181060459, 0.071599910972010128, 0.029747261693937183, -0.05575743675365958, 0.010540784627845606, -0.038579439103590962, -0.013055960468351072, -0.046603955087347805, 0.045824656843064061, -0.011912196563431354, -0.011526854332901983, -0.09532744148529379, 0.051839761132369919, 0.069491936832294085, -0.078788466397808288, -0.022076046119921762, 0.055685206611929355, -0.028690189358575251, -0.010750075363214893, -0.03415858882057192, -0.038029784044701004, 0.057878914546968016, -0.13134480414052568, 0.085607992375635905, 0.12614414610906796, -0.044827306225034641, -0.049757164378562924, -0.024712106659159953, -0.071507148759382411, -0.024192130054643594, 0.01362951330665179, 0.048433953081083739, 0.024359386660730259, -0.0051155106774921633, -0.1051390039795366, 0.14444393915678838, -0.0088548431670526818, -0.068772016948969117, 0.041548890783175252, -0.034167152155519381, -0.021582188034119092, 0.030182799067988354, -0.0040014629061505859, -0.0083662081635181747, 0.026868483822945988, -0.022177672343113145, 0.083313762448314871, 0.010010211142558997, -0.030072184867643174, 0.037843489218722132, -0.070383902910739399, -0.083548620924597278, -0.036391935661160918, -0.016615937603765441, 0.062407519296053184, -0.091602024121955034, -0.0068430434289176237, 0.095085963164938239, 0.048338691169388215, -0.027514079584110885, -0.13108991117518859, -0.096683781412949532],\n          [0.026521552932905021, -0.045757706968443369, -0.0065411884067677981, -0.085061179165153294, 0.14722881834024182, 0.047880871068860825, -0.019733975062189213, -0.051041982772424166, -0.06667461611485706, -0.018868367139866095, -0.041407892531913994, -0.1135165849534281, 0.06494420088328412, 0.02647152281327755, -0.00090233232791716786, 0.012634138439591477, 0.016736706302279282, 0.0066229675581288353, -0.027195497182580936, -0.013683547901060635, -0.053134066940332091, -0.037126651114853963, -0.022632575689387369, -0.0018942229311252846, 0.033462110153666749, -0.1182492365861096, 0.020164248753763356, 0.11022756484626357, -0.034399331322643348, -0.004049118679745123, 0.015540800383945969, -0.018762684144165639, 0.031382890856517, -0.034906110659518569, 0.0084090652945358179, -0.044334707129056128, -0.018500134350316173, -0.03677441221924304, 0.11924665863029466, -0.066556956316230043, -0.0157217782738675, 0.0088049969447932253, -0.073061057426566628, 0.024309817051911063, -0.0022227005091241224, -0.027084812593866206, 0.11300564532044208, -0.089657724195424393, -0.069330694925671552, 0.1522788162456262, -0.11814107191405709, 0.041522705944297272, -0.055858865503919525, 0.03589699264499422, -0.022839973856335079, -0.062359056865698051, 0.017954041686744696, -0.0023516930568763042, 0.024292471256874525, -0.020140941604535046, 0.16616378156217479, -0.060547479040507682, -0.095993631877149627, -0.035171531857736707, 0.00017003372512303105, -0.054486904900661617, 0.0051046874832875108, -0.024970809646617714, -0.026948648737005924, 0.13211777318770576, -0.015912595374394843, 0.14876817147359678, 0.079640820231395598, -0.11230282633524796, -0.0092441791382505342, 0.058819068131640312, -0.077920153621443, -0.090482271757585608, 0.11102826856966876, 0.042626094052885727, -0.002195518726305995, -0.036122267119977257, 0.047146706015838369, 0.18615910807929142, -0.063269368645278462, -0.06350591196288817, -0.029534950411274838, -0.029986821385842868, -0.01600285092423518, -0.030794045583080902, 0.0070419278101264172, -0.030444390319950831, -0.12718798875016957, 0.041134467878119835, 0.20405185525846614, -0.029811157180004131, -0.08705268526814279, -0.016364346582207326, -0.037891810417653854, -0.026401963421238878, -0.013779084822577579, -0.013032137299750876, -0.053538279554311299, -0.056779607970010679, -0.079377223053779367, 0.1823700488331369, 0.04187996112061794, -0.046827200345602865, -0.01941969694818884, -0.032796142514734263, -0.17044345125001231, -0.05402585591400131, -0.012647256817941261, -0.067305588382767928, -0.10224311399966124, -0.34971902980023623, 0.21798581432121136, 0.33121516682963281, -0.020319476107282762, -0.12056665218545416, -0.11656639490906624],\n          [-0.034745756067027414, 0.011922066572062268, -0.098449291804937236, 0.18031082717496805, 0.17476539334005353, -0.046518346780788547, -0.10946016872645539, -0.075727469917264756, -0.004279528158131065, -0.017696596899397482, -0.093983562864041803, -0.010800135732187889, -0.0045569323185074284, -0.031379361612413698, -0.11850675752648224, 0.2367012443070334, -0.014785597277977354, -0.063302331262239414, 0.022536827576278201, -0.025071938686129294, -0.0027915071853978554, -0.020334914936012752, -0.026008027089296101, 0.010703003018176116, -0.043029867343547329, -0.047195519513412248, 0.12321706281055818, 0.071786005282978516, -0.065282274004568347, -0.067638221239958093, -0.030061503019037598, 0.0027284619191995756, -0.030746019874450269, 0.034300317469793756, -0.01548496672283399, 0.00061797218192791159, -0.12212293111148122, 0.050022803331177507, 0.14679567560544277, -0.084454888753618507, -0.010415558440521971, 0.017746373390555303, -0.037888913263606695, -0.0042452861377769227, -0.074445323746479414, -0.011522402982276407, 0.0065317653275813771, -0.093067685671222949, 0.00025768497943800921, 0.23352117567061204, -0.0049839681159744506, -0.070961394834865091, -0.040406385819728594, 0.0038935193964216783, -0.063087695343447811, 0.0028549201129295862, -0.011365105715306072, -0.0051871840857717968, -0.011323145685494362, -0.15258276867230808, 0.10052717621074529, 0.12368458705231265, -0.077847390546605971, -0.059471418250267638, 0.028026328084379253, 0.048885641757861406, -0.019665152356733828, -0.017240548423916428, -0.041027265162514856, 0.0011509894918183342, -0.082241935288892523, 0.078604867885532073, 0.16228781290785055, -0.010523700344121451, -0.030965934865738454, -0.041503959227228673, -0.039718938540816928, -0.038748556042536665, 0.051470420149172191, 0.030039107409380247, -0.051469295929946292, -0.06031302048942426, -0.081417936654068115, 0.17732474397593703, 0.025219765376655087, -0.012727987606368688, -0.064523296079121037, -0.013167312882832634, -0.013895314055951707, -0.049375572219517737, 0.014179550428987366, 0.00062312741669435373, 0.007284514890717856, -0.10894474372759466, 0.027784507036578657, 0.19201834106729118, -0.085036361549911121, 0.023988581116611958, -0.022828104571709931, -0.014372052338263167, -0.026342474575395736, -0.0055467921457708243, -0.019470544310970943, -0.033931503651495665, -0.0091536544294716152, -0.036739492608220362, 0.10446088448224827, 0.020969726335668189, 0.024776193018576149, -0.078829730104535034, -0.053245132855933908, -0.010433310611867591, -0.010210640679316214, -0.051308025398501503, 0.037884008160365974, -0.099324142895464845, -0.12671107025252934, 0.083828567543130963, 0.12485291624334745, -0.019875141138885395, 0.021159178415280137],\n          [-0.073813428578515319, 0.0455540146431333, 0.21317974541835555, 0.054485804091818982, -0.10981511144389543, -0.10268425646919861, -0.046501163519200653, -0.055663971820637946, -0.020862778212020025, -0.0016239951963715644, -0.002629558452717437, 0.0099974094135370853, -0.1034433191717149, -0.0080814385350999121, 0.20536698014540328, 0.06126371127783943, -0.059836319781441494, -0.038790294476037351, -0.053677695944028214, 0.019923647746113771, 0.00067536759966540377, -0.035726207464042412, -0.035441015599980488, -0.024733560212268406, -0.15079839806148979, 0.10615849316820197, 0.18684548267040532, -0.064070280932145493, -0.067087150871195628, -0.0055311193006368775, -0.086092934395195775, 0.061425846472940575, -0.035219155593812501, -0.039575091828705944, 0.049801600957609174, -0.033980895382327146, -0.11533858246663227, 0.18080146842113642, 0.12760232482142872, -0.083273979291499017, 0.0040506256439491184, -0.0099808928737386143, -0.067759137702010225, 0.0026835543791823638, -0.0080343381743012698, 0.023532332559458254, 0.043117469529290763, -0.14058656961156304, -0.0016268330065314137, 0.15585324976494819, 0.069626580205874283, -0.1243686355938375, -0.026479623846533681, 0.020383199203834142, -0.028768935662109356, -0.0062857702132087974, -0.028321313745657696, -0.01168709222463879, -0.029152829240080027, -0.094922161457253018, 0.052872274283144463, 0.11087851911197262, 0.054251608937427767, -0.053296632141531824, -0.027558550405789028, -0.03854510047924891, 0.011349127429016066, -0.026961940685359908, -0.0058849527355114006, 0.00206567265274352, -0.06205567284106403, 0.027107120468617331, 0.076720226540601719, 0.0095546142954107578, 0.062120958180423839, -0.032629976188592258, -0.021507467744680639, -0.052784084736165693, 0.0030423247653671021, -0.0080315707017271191, -0.063924511094123684, -0.00021021475214931008, -0.10024981203982601, 0.1015512962019214, 0.064157555723561771, -0.069916492771215075, 0.082103122053598113, -0.046503334103402447, -0.0048848007312446012, -0.02758565365129036, -0.0140809555182348, 0.019042840231226918, -0.033131129031483485, -0.0089135928143168203, -0.054256262048008735, 0.11973166937117143, -0.018268580157864991, -0.023883645532026994, 0.049231832011293608, -0.014577787660792423, 0.046127787170430763, -0.075110202669192799, 0.046626886126717067, -0.041747134956936049, -0.03251487077000792, -0.054338733400030953, 0.017222361404870275, 0.11676824759018707, -0.026438027156220366, -0.032102992542435496, -0.055241109787953276, 0.056235913315409988, 0.009962320928060292, -0.032473557036913243, -0.019767314495135732, -0.029422259501493818, -0.05097365566473705, -0.086442579719706786, 0.012598629009327726, 0.066122215427308853, 0.01211368001348305],\n          [0.0004667357969735525, 0.00054849626182419664, -0.00013618713228205742, -0.00013253085166550519, -0.00080157461570931794, -2.691133605066146e-05, -0.00065764288432581446, -3.6579683998914057e-05, -5.4660118200278811e-05, 0.00014604635132977641, -0.0001696182636010491, -0.00015906228894248253, 0.00011235296245967744, 0.00050518233975373769, 0.00015356454550761702, -0.00031323963237401761, -0.00044300984864449697, 0.00053200461227834563, 2.3644509619358614e-05, -8.4831714279420429e-05, -0.00027200405736615936, 0.00022416316434788062, -7.1194625315486616e-05, -0.0001921201138109542, 0.00057396177783196486, 0.00035815207686277155, 0.00031159259445471095, -4.6937311155920448e-05, -0.00065506326926790702, -0.00011995580027392686, -4.2348005140095457e-05, 0.00010587326804443578, -7.9322550005703508e-05, -2.3721764802441496e-05, -0.00017040147572136739, -0.00057593165429725875, 0.00065222177121013831, 0.0002665414702900902, 0.00035667127123066925, -7.7691777858289972e-05, -3.8172905741614115e-05, 0.00010049476721076365, -0.00012168481580056376, -4.0491064147097386e-05, -4.8159547975361617e-05, -0.00023287151964227542, -5.0225019821443275e-05, -0.00080182622897892767, 0.0010438945255279268, 6.1969706422453793e-05, 0.00028901935081157955, 0.00010579037778190963, -0.0002724803030345158, -0.00018248333714674828, -9.7893609415735343e-05, 5.6122266787632407e-05, -2.4109435187230215e-05, -8.256402305014017e-05, 1.2275769358770228e-05, -0.0011837300475309662, 0.0010387599962857208, -0.00030106456925788061, -8.2942949550413037e-05, 0.00046305034318953886, -3.4941522492179002e-05, 0.00026047826388847961, 8.0063314441238695e-05, -0.00023204308256855825, 0.00028043251942060473, -0.00017992926522449743, 0.00024111256847714896, -0.00077707368713531705, 0.00087258670230551394, -0.00047310681975866464, -4.8903566618300337e-05, 0.00030165105394839128, 0.0001523693782892032, -0.0003214720006770571, 0.00014500490168671901, -0.00014868675403801115, -8.4069171507120122e-05, -1.1488930694997235e-05, -7.3103538477843621e-05, -0.00027257580575307944, 0.0010045581248467467, -0.0006063389015931106, -0.00030283901680250476, 0.00023946215844236965, 4.0874050688199964e-05, 0.00020668776684328811, 4.6264165950036471e-05, 0.00022120225803604759, -0.00025433190468929917, -6.962082684627835e-05, -0.00011541458342628763, -0.00025522292698570287, 0.00090807721332292896, -0.0001479625967791515, -0.00027356753032273425, -0.00019226090250733943, 0.00015027389750788632, -0.0001041059494256247, -0.00012272487478783012, 0.00033766836773768683, -0.00040885269632123106, 1.4064712871159069e-05, -6.0893502923708986e-05, -1.2270143878473361e-05, 0.00046367307715139069, 0.00018271794499197247, -3.3562064556917105e-05, -0.0001861452801387312, 0.00024747597697189313, -0.0002203964126913302, -0.0002655235806198683, -4.8267361401083814e-05, -0.00013654454453562725, -0.00016522236506379823, -9.985241041834958e-05, -7.3084705394677342e-05, 7.6496751819820884e-05],\n          [0.00014192493009219931, -1.0849997241092063e-05, 0.0001677566369007906, -0.00011605018962013852, 6.6756115456784171e-05, -0.00015562939648154986, 6.4164428186169048e-05, -0.00016144031937152109, -1.1567201873632915e-05, -2.9389666004610293e-05, -0.00018545690110512159, -0.00014192965770924021, 0.00015688900011993565, -0.00022987170475181201, 0.00050601894856794338, 1.147904121199389e-05, -3.5358004185095937e-05, 5.4151378378504422e-05, 0.0001162675133458968, 3.7185858557914342e-05, 5.9553590523481192e-05, 3.1314783550819014e-05, 1.2057174878739307e-05, -9.6695987945233375e-05, 0.0001044847847413502, -0.00015507143992373601, 0.00022022799757739214, 8.3866880430806534e-05, -0.00012962060856349517, -6.7578262074236006e-05, -1.3555990987554334e-05, -3.5737704882077281e-05, -4.5808795552465531e-05, -6.3548782069412779e-06, -0.00015612384897251141, 7.0085223497301508e-05, 0.00029763597940726805, -0.00010577343553129503, 0.00012730480076296458, 1.2399248204064683e-05, 1.8645837807265697e-05, 0.00024212785489370614, -0.00015872860498579444, 8.3707241213322459e-05, -0.00032597535960855739, 0.00041133058083372975, -8.8687656587524422e-05, -0.00049296444707497278, 0.00020605423444788884, 9.3561174143157178e-05, 0.00024762885023246056, 0.00036524470776032325, -0.00023688791970755824, 0.00033172236655580611, 1.2629398500677014e-05, 0.00024080466741264323, -0.0004006372668640644, -5.9563129205519871e-05, 0.00028033907001259045, -0.00028345593539583214, 0.0001339187071822609, 3.0493512604909401e-06, -0.00034838001372515526, 0.00059746238210751923, -9.9846486972976489e-05, 0.00041453928701537524, -0.00023073595005270592, 0.00034208508615191091, -0.00016580817990245744, 3.9765764453518482e-05, -0.00027830373100982964, 0.00012537929853667987, 1.4736238159517717e-05, 0.00027567237234161351, -0.0004888438970630446, 8.7212866113350884e-06, -2.0493341142208132e-05, 0.00020499966401848688, -0.00032257655852790945, 0.00032032979815644486, -0.00024321547888298814, 2.9086686149870644e-05, -0.00028867101368240666, 3.0825398830508499e-05, -3.6797589493049732e-05, 0.00029228356787954629, 0.00052891319033434442, -0.0002405873549854512, -0.00029898967584843228, 0.00023190078400971148, -0.0002429945590425725, 0.00012631644056069861, 6.8365713355195146e-05, 0.00010549540200119334, -7.3225818539288112e-05, -0.0001018216734522126, -7.6341945218480478e-05, -0.00040021222480832175, 0.00051868831128347101, 0.00045282278366730322, -0.00025642054830855854, -5.3312433065010739e-05, -0.00015071920454498566, 0.00026346273973178874, 1.5723135233985941e-05, -0.00010611552565827076, 0.00010030771494402846, -0.00022901452791959653, 0.00029515413913742961, -0.000378103168520591, -0.00048426748955096577, 0.00022179377366644826, -6.5521532191739271e-05, 0.00033674118948758686, -0.00046179298814816305, 0.00010507012245129441, -8.1386075936565327e-05, -8.5409170546155155e-05, -8.8995879690176305e-05, -7.5853311223957054e-05, 2.6564465721370945e-05],\n          [-0.010683117891894434, -0.026203517318029858, -0.035348631234462732, -0.0089039476697588757, -0.078264832133459569, 0.014533495211292522, -0.039735497439144417, 0.0028868136525013826, 0.0082563432282671927, -0.036876327986247723, 0.0019617637025766575, 0.052924193889526149, 0.035478526483873563, 0.021452215773512737, -0.012058498396393419, 0.032415748027272206, 0.0081487313430126454, -0.0082878430591127438, -0.011301795333024143, 0.045191867790093425, 0.044327234784062801, 0.019363765884505585, 0.11356516329476325, -0.032979098377165179, 0.075697516409139673, 0.019096851467574182, 0.0083417566704703065, -0.0060608317184354613, -0.024521250232898754, -0.0062563950604268004, -0.019424549966013421, 0.042617826976536294, 0.11771045618920394, 0.14806853397919761, 0.07242131632098367, 0.05825312332492652, 0.036446775225891515, 0.061850429851318528, 0.049704669459738865, 0.055430561498123407, 0.070266675660789452, 0.10791776313079825, 0.053117037443650719, 0.12942596556811628, -0.037520978380153586, 0.09370958660148157, 0.067576770360366523, 0.068724981441630334, 0.076126783309853729, 0.12311586010135872, 0.083411336336100567, 0.039387077762465639, 0.056425147284172514, 0.014237983090907416, 0.05663383500458416, -0.0075863136735932618, -0.083041404471318359, -0.033129983631350668, -0.027636238642020229, -0.047768510607462976, -0.063296204253032298, -0.062578786189099095, -0.046277350408935075, -0.0014999128228245229, 0.03590831793842944, -0.15153224136771898, -0.067460025003045793, 0.052979163538064387, -0.025619303894120496, 0.037941615130038006, 0.064910895081062597, 0.02230202042681128, 0.055270751907329552, 0.092705497561621455, 0.018963378238524085, -0.053973086464825723, 0.0083301495482443391, -0.021218159929265457, -0.030570605486973344, -0.0021454021899788445, -0.026875831051993617, -0.049042673990263554, 0.0051260754520939906, -0.0069454575735653475, -0.055541305029020473, -0.024578161869174033, 0.015168445899802574, -0.068003320439275344, -0.00048112098031016792, -0.056520449187868235, 0.049669608030607104, 0.016316278463441431, -0.034085744774588048, 0.063066726935569931, -0.0080033228303419916, 0.033385837489126907, -0.044575967029709188, -0.023441355247158995, -0.044509209526914333, -0.037161871027802405, 0.0073190175238074615, -0.073157626655641225, -0.011373417119033976, 0.072030602760077223, -0.018015670069586549, -0.00013858608242610544, 0.028374321207992069, -0.025567271987302419, -0.013903313076025374, 0.052807958873996745, -0.038318416663269968, -0.022987196513577734, 0.0062781886098834845, 0.029733530440722515, -0.090236504820046956, 0.0094683723177513002, -0.067606870737129718, -0.012207168455778569, 0.0039498809113422051, 0.0017680506907682904, -0.13205065018196771],\n          [-0.00048965833343866949, -9.6133835888349839e-05, 9.5024409277118249e-05, -9.4831286650623459e-06, -0.00027318400850575436, -1.2859674043262659e-05, -0.00018753431578469315, 0.00025359827484301711, 0.00013593197045175948, 0.00010671640250792952, 0.0002520834422912871, 0.00030575486026798715, -1.8677323289251202e-05, -0.0001359879426809929, -1.8596724042641011e-07, 0.00018716058456554746, -2.9456499708931105e-05, 1.740372235658344e-05, 0.00029170983943693773, -1.6893395160838542e-05, 0.00029142657372808328, 9.8200013060809055e-06, -0.00012201675367805309, -0.0001821511041478624, 5.8727835859570532e-06, -2.3871151498152526e-05, -0.00016916476120136525, -7.7175542381152651e-05, 0.00053887625860423588, -7.5954327703381397e-05, 0.00047546289643572714, -0.00048532553637742337, 0.00025243488298501968, -5.2889703167802171e-05, 0.00026631391925304587, -5.7069012077345938e-06, 9.4805004026109196e-06, 0.00012583697976619596, 0.00045284900761148605, -3.7921325421477747e-05, 0.00010519128394604477, -0.00021574981428573378, 0.00013058799005061239, -0.00055512020354029647, 0.0001429939062747021, -1.5370391169694519e-06, 8.0653707619851578e-05, 0.0004067755777601087, 0.00038999196381222373, 3.6877374512293837e-05, -2.6107472160714212e-05, -8.5583627116723321e-05, -0.00015583615391241354, -0.00011965945062380329, -3.6535280401381234e-05, 0.00054094084831822487, 0.00037630623255849316, 0.00052269658935158447, 0.0001311189140969643, -0.00040060332113688729, -0.00026993542547641691, -4.3072617173671446e-05, -4.6582954130174048e-05, 0.00011704093153555931, -0.00025561950600206523, -9.7988597560771939e-06, 0.00028045364993524793, -0.00016083954183774771, -0.00025723583975659214, -0.00046505036856739346, 0.0004039314021320739, 0.00034091132239879793, -0.00019370884391506013, -0.00012426188246242656, 0.00014610355538470163, 4.8874632263766482e-05, -0.00016902502798560315, -0.00037191521627369384, -0.00021579609440836728, 0.00039961530180981919, 0.00079812645123661374, 6.5350682398865323e-05, -0.0006637329476850487, 1.4201540184693995e-05, -3.0668778868838537e-05, -0.00013015400162084967, 1.1834065800214733e-06, -6.0452686671833011e-05, 0.00046003104033802422, 0.00029649152999927653, -9.7422158500198863e-05, -0.00054615394798594036, -0.00054555045433753169, 0.00030505150102402845, -0.00012282307114507701, 3.1042354130282612e-05, 0.0001268834643597741, -1.1535964674028176e-05, -0.000176869063298763, 0.00011095223633189599, -0.00059224455990757041, 0.00021684456404430508, -0.00045799378668898855, 0.00057995315228567129, -0.00013936531291453697, -0.00021220643616092633, -5.4136569800536383e-05, 3.6608907478852953e-05, 4.5939329531563544e-05, 0.00021478664432446337, -0.00032699755621773408, 0.00012689634262805921, -0.00034230468492685989, 0.00034767742030643312, -0.00067549072348433575, -4.1513304792857586e-05, 0.00018063222856385536, -0.0001881377600047654, 2.8973339703669554e-06, 1.3507237580291653e-05, -0.00041261401631562805],\n          [-0.00013436781157403349, 0.00012210804930180494, -8.2414422599333403e-05, -5.7301863805120368e-05, -0.00030739486254432319, -2.2492441595647894e-05, -0.00017176271831247786, -7.7101711693922104e-05, 4.7107570331945958e-05, 0.00017636492999561354, 0.00032836342762108256, 4.1087699566198788e-05, 4.9949350228714606e-05, -0.00011875800957268645, -0.00023943950047199125, 6.1005765033241011e-05, -5.478607070270522e-05, -0.00036631651977345886, 0.00016730329224556167, 0.00025493108839291095, 2.2226604097883018e-05, -4.460834588607826e-05, 4.8917262263498129e-05, 4.1964097110273185e-05, -6.1314318202332352e-05, 0.00022686166653692816, -8.9247938207914768e-05, -0.00019302109650852495, 0.00023804561802531765, 5.5691335582086499e-05, 0.00016699837552209412, 0.00017965604481385428, -0.00038349627139956134, 3.1918639160310319e-05, -0.00021914285377726619, 0.00033657077159139626, -0.00015380926340578804, -0.00012640377325787849, 7.8443598190786057e-05, -2.5921418374194594e-05, 0.00038527701539335657, -1.4538798784193008e-05, -0.0004928838914605993, 0.0001028736165327223, -6.4383123833527955e-05, 0.00023810111270487072, -0.0003138610278263735, 0.00014008262478101469, -5.8913029426684027e-05, 0.00032747301458163625, 0.00039023015135071504, -7.447541605180158e-05, -0.00041729123414768754, -5.2260202109827292e-06, 0.00012735624759406539, 3.6629059847052489e-05, 6.5628761203077868e-05, 0.00021839305017589544, -0.00011813071478151277, 0.00021698143307999351, 9.6287514756765447e-05, -0.00026080214823867576, -0.00039654273422187053, 0.0001167125140248762, -4.0162626760084641e-05, -9.6609081976166411e-05, 0.00019201207703931078, 3.5894679076095559e-05, -0.00013215815809999171, -2.2031139214596929e-05, -9.3108375419856393e-05, 0.00025391719334226688, -4.0757163905339486e-06, -0.00012808461454903692, -0.00015139230658256335, 0.00022616830885492656, -0.00010182951161811366, -2.148301565258609e-05, 0.00028356599204855393, -0.00028490640829138825, -4.2891750138746021e-05, 0.00041455916689240452, -0.00012603793107361649, -0.00039707365188554333, 7.6033479427833894e-05, 0.00029653613924018885, -0.00021374066277618509, 2.327117911399279e-06, 9.5164172314900208e-05, -0.00068014772917070199, 0.00037026320560729076, 0.00019251368934372626, 0.00013551091552941458, -0.00031120640022949675, 9.6849928779750571e-05, -0.00011268464289018038, -0.00023013062013480662, 0.00015401847444745237, 6.4205342809563193e-05, -0.00034974297656181069, 0.00064853396513063488, -4.4729954720712506e-05, 0.00021224544758897262, -0.00034308486716421273, -3.7733988311935626e-05, -3.8868349370377309e-05, 8.6498659390518706e-05, 0.00014456882901125664, -0.00014732698311536454, -2.7613250230533459e-05, 0.00026354361705206719, -9.6315009198065515e-05, -8.0323755983983947e-05, -0.00018998607556105357, -5.9127250430376921e-05, 0.00014091011956727205, -0.00012996537552621701, -5.035229587568163e-06, -0.00015231914400671252, 0.00023099545000895144, -0.00021587551857769893],\n          [-0.011113779995796793, -0.03264498365428932, 0.032393323977037813, -0.053019160588067986, -0.052289631646412357, -0.14090905182270536, -0.10662971417607917, 0.076743291125837804, 0.19183514586283293, 0.090512780806032617, -0.098345016495789458, -0.011356541223655056, 0.036592642227365337, -0.05386114520342726, 0.021336401858911159, -0.047044247520027484, -0.079543004866070119, 0.069134815260962129, 0.16070569312483246, 0.0038456939033156331, -0.086695570600295979, -0.030081196583984296, 0.022665182076173018, -0.023072771394334196, -0.018331023996742943, 0.0011057635434971857, -0.10917005303651976, -0.046906120609124184, 0.10879721410619564, 0.17214824601663198, -0.16345419009446593, 0.047387129776087451, -0.050130663511261289, -0.029615346796994284, -0.03838162551818361, 0.0016626820450895159, -0.034779798819093558, -0.070943150474272645, 0.077909629347024584, 0.23019976126978281, -0.14284459018595042, -0.033305599050588101, -0.012579026667957113, 0.008416322955214002, -0.032993580574607821, -0.048339483281004764, -0.019525308661791051, -0.06984453532422541, 0.014727444216795713, 0.14996686179447366, 0.078031653033860421, -0.15724129008645732, -0.0040330836908469385, 0.020646425620089916, -0.010654017089976087, -0.068656231122255579, 0.024297601174406921, -0.0024877247232191202, -0.030227587432549025, 0.090227014733457928, 0.080842697753928994, -0.086654876220284532, 0.012959715152821044, 0.018917133744079905, -0.045623035776481892, -0.032739391111555147, -0.036378708143565655, -0.052934938098819245, 0.0072628401319736191, 0.025315816651209383, 0.065354988831480165, 0.050830135881118316, -0.051373434850408066, 0.012062843823364068, -0.053921495179175792, 0.0041695268579246721, -0.0082264831168346701, -0.011220404620470506, -0.0075848833821621966, 0.059000048222753509, -0.039920656848886502, 0.11125743952652592, -0.021519034940123919, -0.057332486848285534, 0.0055259953878360642, -0.004210488740013946, 0.0091543763669089812, -0.029533996573194402, -0.0046618916800951343, 0.086826792205214331, -0.087905681977735253, 0.060049094735024719, 0.082239574433654317, -0.067950997259202672, -0.052836508855635379, -0.08178791847111451, 0.043805514127629036, -0.035918644150708633, 0.030943034122503259, 0.048873707654045383, -0.078419292949069422, 0.036039114074194384, 0.15301950458013516, -0.0020635318713273093, -0.062144295014710749, -0.0042182974120457458, 0.018342722938454691, -0.006300758423097505, -0.011523161046205615, -0.047258227242310442, -0.028717665984571757, 0.078801626072277128, 0.069201975729093201, -0.080059626916277549, -0.14106514638245227, -0.025481816722181624, -0.020508997543042289, -0.01550940323134436, -0.0094705410641920743, 0.014878235172793254, -0.0034914923955158606],\n          [-0.049718431000340013, -0.035758892423982919, -0.022242832727659471, -0.035623182950114192, -0.068946269831888563, -0.14441155948249546, 0.23465172605260556, 0.15846679355786267, -0.065971982658149603, -0.018535961144545934, -0.024797174426993557, -0.0076368074855745118, 0.0066227612551196706, -0.017526536442783753, -0.010789194077319021, -0.040286032320290231, -0.0056961640316873343, 0.13973218361056991, -0.042841041755946108, -0.030912602586234482, -0.050612857016701492, -0.014451167351557435, -0.033321133339262024, -0.05328285157863482, 0.0084956582707995769, -0.033398618106686311, -0.10205034437720886, 0.030196139746642148, 0.2111090058125159, -0.085711586785949756, -0.030766677319517009, 0.0065005921075326949, -0.032107623303140612, 0.010380556950672306, 0.037670595949217942, -0.056206087740664497, -0.03260370052730352, -0.1561008405998785, 0.15115473184883424, 0.087468002407858153, -0.079714267429888366, 0.018202271840872142, -0.0045105431343512043, 0.026832614720378654, -0.043425866989209555, -0.026066523869096081, -0.02528972705916014, -0.042096869598745652, -0.070925721200100544, 0.23530476499553221, 0.011520678728863858, -0.095816584560911452, -0.018725466710660395, -0.037048558120658111, -0.026821912497833961, -0.01958185753544785, 0.044676748759910678, 0.028809635953963519, -0.05826188687569988, 0.024776575417213054, 0.12549740842491305, -0.035929129393416859, -0.087118885673774085, -0.0026901477265302994, 0.0046237475146514552, -0.018050296026597318, 0.016779033899148251, -0.012651134169698123, -0.089944685004007208, -0.061952592133401846, 0.10990524701743055, 0.15037999590612067, -0.090163580684813671, -0.035133862878716476, 0.019258114736171422, -0.023010078969621379, -0.026283022557721171, -0.066214843146827421, 0.0036081782275008047, -0.019205792810695364, -0.020171831093293915, 0.1989806157237472, -0.024158681457602471, -0.048082389466265169, -0.027408223538038137, -0.075525139612688572, 0.064454122161252458, -0.058575382013248689, -0.0086368186115048165, -0.0086035574489204472, -0.06007705027057858, 0.045971736951263456, 0.1261833313396889, 0.022410860296875529, -0.11049746928652586, 0.0069619169388782584, -0.0094112963401279358, 0.015502770454642434, -0.048438381054499359, -0.04682917755552031, -0.00022238890926721058, 0.0014117579120073859, 0.089525343812046881, 0.079141464963506603, -0.092462497930681176, -0.018048972610507721, 0.0014867057354299527, 0.0047595475949270549, -0.0017287964469103294, -0.027304885422683407, -0.032110966856619273, -0.017611444082195685, 0.073415867740449725, 0.11601887154016219, -0.044348274914784672, -0.098407184448392707, -0.0088182813632140204, -0.042990020804917144, -0.039402653777542929, 0.014836527788627827, -0.050635006343958483],\n          [-0.068700619776660254, -0.032923512495656206, -0.028684838657940429, -0.027346807901848392, -0.012437513369475654, 0.04530776482700738, 0.14146963669196641, -0.024737285685323483, 0.021872256378449306, -0.029614351891534337, 0.0014704403181207623, 0.00061449227400070527, -0.065002449904543999, 0.036643808233299588, -0.032209783114478335, -0.013719980201209792, 0.00426188928669817, 0.043978918430192894, -0.046107785040272825, -0.020623098141049494, 0.092668229881848918, -0.085226509118630056, -0.047326937943777285, 0.056895689933855451, -0.038867744245311142, -0.0917328495389379, -0.0024675929250557657, 0.054788109957318712, 0.092324754023680886, -0.083976508299966168, -0.022272456922531034, -0.015278750110002501, -0.037660821714487036, 0.0079480050392521789, 0.035560068131964134, -0.051925142923762622, 0.0048634554998182172, -0.05161245009194064, 0.069926770229373256, 0.019603910194766427, -0.058129948226766356, 0.034120468186704639, -0.02278922943675725, 0.0056803547423852491, -0.011190673015587217, -0.045209539216465838, 0.042701687889130674, -0.027745655178843524, -0.083075835673998288, 0.15661348719695239, -0.028533516906845684, -0.064018904490445727, 0.0071637332946361681, 0.010946513456513277, -0.026171760394870333, -0.039176510971348735, -0.052625382319528485, -0.032610615849156512, -0.024151118786911202, -0.029592259235384895, 0.14367118076515981, -0.017566095578734467, -0.054659523961357363, 0.057155438782691928, 0.029811006572219523, -0.061339856579619337, 0.040778203393560836, 0.011699351049567291, -0.0088243741839378435, -0.13867569479385672, 0.0070547616779323835, 0.13839794109305759, 0.034595641270555019, 0.011188421962504996, 0.048423842059529723, 0.010037686002641197, -0.0018497520280923579, -0.03785572945780738, -0.043325856166240725, 0.0080411887462800754, -0.13690073357640112, 0.15427462008814505, 0.053185882421555128, -0.062848800580544401, 0.098908008073918904, 0.024336051774163703, 0.0012517787347508663, -0.02085091104539423, -0.010458871685104971, -0.013997622908016392, -0.062995080399173814, -0.12717711870320439, 0.18117010896522742, 0.12557740084057686, -0.13691773676225652, -0.022943723539645338, -0.023607554390057763, -0.0059308586972001906, -0.029008536818149494, -0.11052936897449649, 0.01676636486201016, -0.0299062367975718, -0.010995032071071418, 0.17825885072525774, 0.052695253789213546, -0.15856871540171691, 0.018373413764860413, -0.062619297278227404, 0.02519282178146548, -0.0018928521098937135, -0.067840528056599431, -0.050794234172886574, -0.10116936098857549, 0.13362153032125096, 0.3407549635188265, -0.12171874249866213, -0.21070461874955115, -0.083359485995745247, -0.078475687667453164, -0.029251874573081954, -0.22249275032005275],\n          [-0.06557132981627023, 0.057387702833085238, -0.13424650578557906, -0.095896584636417009, 0.24651372455616202, 0.14475023251856034, -0.10963067096889349, 0.025484984396096345, -0.0066750222960001646, 0.018031088995289345, -0.072827217628290308, 0.03072620730408979, -0.044556908489582235, -0.015540996433387919, -0.05684501901116374, 0.085633232484377222, 0.10033013618746886, -0.03742948303225134, -0.062461794161772756, -0.033926854157860981, 0.014833446973797017, -0.031363558199583357, -0.023246290106997476, -0.032758472101354803, 0.02961216484574446, -0.098209283771892336, 0.077943952125225799, 0.095671313752652476, -0.083245612577197897, 0.020905717661596379, 0.050810743632591124, -0.039132208011026501, 0.038703668840843024, -0.040633395391036504, 0.00067527853135830943, 0.013989351386346478, -0.13054119279823606, 0.045163670832086458, 0.11112335558160061, -0.063735525164717574, 0.037782451346632551, 0.017424010888546733, 0.061583223515939242, -0.063673752054099628, -0.085357765364971541, 0.034715298877846669, -0.0030215396455599607, -0.074514610988951263, 0.12038888042278573, 0.11914516519976012, -0.066498159580288485, -0.05748981868984826, 0.021247874106887919, -0.043395801614457857, 0.056092405859263811, -0.05090562582130901, 0.030755476067636615, -0.01704186923067369, -0.086372670819938935, 0.043707175171625617, 0.071729094880973843, -0.046172009255220331, -0.12569107869407672, 0.062777551061848486, -0.054877769372877368, 0.0098492983016237878, 0.042534935799133616, -0.025427465203307967, 0.0048504140831612669, -0.034534331263074952, 0.057141387115833393, 0.071824130085929444, -0.078856689082400497, 0.046186589384248661, 0.014021943501927311, -0.0059724118990401249, -0.059074101001239145, -0.052311447457610932, -0.018659392189258467, 0.016795417135235888, -0.048576100654742473, 0.005696565881307656, 0.17000984187958204, -0.14025171691578273, -0.014920288189935977, -0.02450105995756531, 0.067679703872773542, -0.052641577006571058, -0.077081344604230786, 0.042504990176632659, -0.035988224869212784, -0.048450595717557901, 0.047674683252699607, 0.055032983271467065, -0.064761096554407135, 0.020292721123239928, 0.0052680731730131965, -0.008724092125284879, -0.060606693409500888, -0.069110808496291656, 0.024795838594949066, -0.027097938518918639, -0.0012386914962327609, 0.015076588937461598, 0.055874096614049337, -0.027944142757713664, 0.0052288086550267444, -0.048321181890514542, 0.085961844501422302, -0.0020462600675238323, -0.11993808096408821, -0.049600877387059851, -0.092973801829541652, -0.031980349139618128, 0.15102131486065962, 0.082755130102661653, -0.05812569461482564, 0.041661463970234, -0.037047057993232331, 0.00087626833626111805, -0.080283390973512447],\n          [-0.034048621962106597, -0.013918394846682072, -0.06548772211399817, -0.047310073653148807, 0.23782208982702535, 0.10576669895809315, -0.16563976884791567, -0.0108553004703765, -0.078836410655958505, -0.050020076625922213, -0.082311636984324865, 0.0046221592868833806, 0.027970146226042773, 0.0058953162542283617, -0.040403941884181518, 0.085253805301136465, 0.028249211911977573, -0.056799025228174559, -0.038359856825438986, 0.064561651783710705, -0.004954534081803498, -0.0026872237095931402, 0.015597774984475364, -0.018251513667145277, -0.059710086387074215, -0.057150732848946277, 0.13137766031471873, 0.056842489251044542, -0.023477089345610051, -0.04715337162739789, 0.00085770297510117874, 0.011008761901938887, 0.0056123703931996918, -0.055914997492275034, -0.028097049059282828, 0.048624529525826458, -0.09611678916961594, 0.13044452791174554, 0.1272054903208456, -0.12259017298086688, -0.022445774624546361, 0.0076033086689639515, -0.007813929706646499, -0.040902985091359895, -0.00098022228977209802, 0.010151778602803127, -0.055308792888781488, -0.09226196374306854, 0.078710234946180416, 0.14963503373654086, -0.059601167114054721, -0.075910372743932211, 0.069756019388331106, -0.012391419754460144, 0.016171610667790957, -0.01017022339581132, -0.0099408597626345213, 0.057862818914423922, -0.053500193833918241, 0.0023150521701103197, 0.24267633702175795, -0.1627124626737711, 0.0030389904814953246, -0.0019134583602005394, -0.031934733720563539, 0.031240729347724282, -0.013447900401826515, 0.018762854504427245, -0.027194103497078681, -0.063834611729319063, -0.019315034866382974, 0.17296296924653209, 0.0047779566564492282, -0.046724087968013847, 0.00063750179780768315, 0.012018498525607005, -0.049906231428034672, 0.0631023423942359, -0.059113148710084523, -0.0019439172858828069, -0.014409167351918703, -0.015148208183996925, 0.15802729853460101, -0.009547054530539667, -0.14207668185762945, 0.10783009215784571, -0.029316341593904699, 0.0049958861272639266, -0.027229716588043594, -0.027547849025221866, 0.011938104583316997, -0.054219992876510435, -0.092135020260128445, 0.23665714027812351, 0.043819126959151938, -0.041978283190380716, -0.0056029326770753868, -0.027255334727821774, 0.0096145043238918745, -0.041549931903191728, -0.034068436330191069, -0.012401382536206651, -0.041537969321840174, -0.049314333651992288, 0.16482326808377185, 0.042083362292458376, -0.1097240094748354, 0.066033601812019324, -0.0077249598120593538, 0.0029248566859087777, -0.080850631612695664, -0.057690051594666086, -0.037836445771667115, -0.093750009831868486, -0.14353454214499062, 0.17090805592445343, 0.14406736607449203, -0.019806817871862357, -0.037179860963505104, -0.013199402310805103, -0.047378006725271239],\n          [-0.089355795589857873, -0.043598613334664152, -0.040685490869347668, -0.056314801498742351, -0.064317257271733375, -0.036305703402461552, 0.087124549743226198, -0.025232182382037796, 0.060762583071081767, -0.016932442688114099, -0.040974561824924392, 0.0011692733530746166, -0.023469947694595206, 0.039360151665226911, -0.004433224342906196, -0.014202479654525112, -0.070463664877363302, 0.013142057597150633, 0.0033619826211813905, -0.010205721175565105, 0.039510232304449916, 0.020167450302709292, 0.056938011555847157, 0.034174491642619889, -0.062666774603916287, 0.083900397057253467, -0.0039050936206950077, -0.12023709783757955, -0.019127477277872861, 0.068195203204562405, 0.004239692936547787, -0.024727068518684399, 0.013195391150686318, 0.10092335285374379, 0.083732978098471689, 0.093601488222699147, -0.028064279101364227, 0.1530929534721796, 0.01908068436728888, -0.13458558446941826, -0.041819118595992209, 0.023907908538223728, -0.0036807630455928317, 0.007893862945026961, 0.064006968331711225, -0.027474745577589776, -0.014962346779522961, 0.019431039040092461, -0.10421624372835411, 0.18788293784249166, 0.0038646939965042704, -0.021850967831761797, -0.071620009503902279, -0.0073304196952225197, 0.023479102591966762, -0.032992466061732159, 0.074771930860797808, 0.11997396053811867, 0.16652757445893027, -0.043450925728879812, -0.19633494915962973, -0.015120380697294114, 0.015595534851796003, -0.041435710686911043, 0.075826650575169657, -0.0062698135667015216, -0.13523262558321089, -0.13542793759250013, -0.079399992955661691, 0.013399321738180064, 0.29846443483321561, 0.12612688550553225, -0.082084690167688573, 0.034499018867023584, -0.060887460666349029, 0.028443725041023785, -0.036122039638383077, 0.0051284231998723478, -0.04605609290697394, -0.18431251645987262, -0.209810670926456, -0.12018234374910172, 0.095623809719311254, 0.012101575052632325, -0.022524769880679987, -0.045282477028056718, -0.012822428753938651, 0.043771209187441484, 0.080442241536594447, 0.053685027638862681, 0.040661690320921172, -0.010274132182098798, -0.10557211882546326, -0.073595782434368109, 0.038444068551446525, -0.01907471602474492, 0.012245888918847134, -0.0015393549215302338, -0.021036517265939442, 0.05518243063690028, 0.044093645228280701, 0.028389644682731155, 0.0097436040384290198, -0.041472720807566095, -0.055377684790392047, -0.016991109046279269, -0.0081617619250853313, 0.0076016249396629494, -0.0066456574053765025, 0.040565096868620157, 0.081751315687418724, 0.050780047897429154, 0.1155676026022933, 0.055483067679641382, -0.057897491813207046, -0.1105898575072263, -0.071828681966453228, 0.061970511290256887, -0.030281369882132307, 0.019304831483575841, 0.054296933756856992],\n          [-0.2437388912119279, -0.072313525080502913, -0.041971984175469032, -0.14300397257914568, 0.061522596957557102, -0.030205439566140864, -0.020864680638780005, -0.047647886319076141, -0.004129658790494567, 0.04027736046562435, 0.0059092092920419587, -0.061426215758847547, -0.049227621653249579, -0.070004334019369369, -0.064272761487378705, -0.026633980149117817, -0.065741384613963089, -0.051050316403064497, 0.0043410772798304284, -0.016116178354041721, -0.031515372710218439, 0.037031195841364675, -0.1228147574490851, -0.030325889054245894, -0.047121946899635309, 0.006945477959475678, -0.12020262635091686, 0.033919560718345204, -0.036501468385288172, -0.023249455180030049, -0.11560461380300818, 0.038387197660639291, -0.0026532986572997824, 0.061601452701894321, 0.10391565419224812, 0.10819008673388165, 0.068685203069905748, 0.11775867403705874, 0.017679110509122742, -0.058901821293154327, -0.020290611595912264, 0.0001469059966410502, -0.12261361036045612, -0.010208071253787782, 0.25551979619962417, 0.13824223662087887, 0.14467947383464419, 0.13522961725652033, 0.19144244169061975, 0.3152710823580756, 0.11571778386301039, 0.11681561560364913, 0.032566473003269106, -0.050278128345735251, -0.13473831638652176, 0.00889663273590241, -0.06668638820919999, -0.10871364490994836, -0.18658986296561081, -0.34157171141342124, -0.34638493808149179, -0.011264008251140406, 0.029142444614928986, 0.12461122431395127, 0.10800578593966685, -0.022809897357387282, -0.047431594853249527, -0.016065811361968149, -0.012088172884114928, 0.13024386066616567, 0.16585917678227963, 0.08223171490137017, -0.18073427281823529, -0.23905771961269479, -0.0034760942387594002, -0.0025528511815767485, -0.0080703270400058758, 0.035854903717420804, 0.060889803984584323, 0.05280523963556441, -0.0033159964189498209, 0.12385169566242266, 0.18824042049023279, 0.29210060042127328, 0.11943421064782488, -0.07449416534755314, -0.037461734684461859, -0.023737648801047031, 0.072598572988186116, -0.00045486095293109652, 0.00074298234712233402, -0.0015928557141097338, -0.17246645124725063, -0.15444027225745488, -0.13465384352760257, 0.032776686516006764, 0.070859809216384226, -0.0004770524214243281, -0.032343629149890175, -0.039986157743816128, -0.074752388387847202, -0.069851711472991157, -0.082819246951454234, 0.032778177162039637, -0.0042937782327582136, -0.015012757926196954, 0.01819273756147026, -5.6098151787711825e-05, 0.019859569434228445, 0.033074166094270323, 0.016572156520835511, 0.091964106413136654, 0.073376911105508508, 0.098478285913656774, 0.036105178755291706, 0.050869520986871988, 0.010385433683375911, 0.040242105632122271, -0.070134750890519848, 0.0028041075844665309, -0.10929235377523264],\n          [-0.076118949202517425, -0.019269106767557935, -0.031754535045991392, -0.046455653491455862, -0.040704384737309626, -0.050843290857606804, -0.021973706618717698, -0.025543401663111642, -0.07416056040918946, -0.013170588459795768, -0.11347265323402626, -0.057227893055629329, -0.029590820633760687, -0.034243625770240413, 0.0061905334896895231, -0.0094644557199642584, -0.044625667555150392, -0.10436846800575, -0.028686249322612808, -0.041090017647881019, -0.046151869816618452, 0.0098325948939372923, -0.067695778385091526, -0.028012701414139411, -0.071396857165263158, -0.075353072177860636, -0.10565554313610695, -0.075522794580878821, -0.026283961786762969, -0.031035439373623519, 0.045981881415172052, -0.029752407317735798, 0.011392587697051898, -0.1039429255200454, -0.034764441427698627, -0.037846056000007268, 0.00012123885743986484, 0.091278706547537475, 0.14577205157542866, 0.1104215855219802, 0.18869952301023718, 0.10738370259626208, 0.13268927139759373, 0.010378228400827957, -0.052734405426765968, 0.07627991587110855, 0.13003488750036463, 0.24685954687761555, 0.21183725748584104, 0.24704340387352622, 0.22867523573571288, 0.036921057188982587, -0.028737222239043028, -0.070384615788671751, 0.0055155357845693004, 0.11568430941686651, 0.10660133014829948, 0.19511953592195094, 0.045422489839321928, -0.075768281672479496, -0.18361820859428674, -0.31804072962510349, -0.19549450758187809, -0.077995164144666299, -0.031296132745874644, -0.077327917406273622, 0.12870564027407561, 0.041486516535153339, -0.13922180905243858, -0.20395686432544152, -0.1572834919140717, -0.072166722893366869, 0.086563963129244234, 0.10757801321268952, 0.081809003061111898, 0.066724060401920929, 0.047445258557963374, 0.017639198538912979, -0.1058218276867447, -0.056754378546732487, 0.048224352355707559, 0.14306872525152498, 0.12358807932424302, 0.071726754535007084, -0.018593224747300865, 0.069247194070239257, 0.0029737893381716479, -0.0012683824671753524, 0.0058616562424005786, -0.039955178776990612, 0.069868180941963884, 0.014017003861568525, -0.046600910938925849, -0.047068333385668161, -0.046681863281231521, -0.024440679090069646, -0.037553368502167325, -0.059138302137312151, 0.039269526323743462, -0.033803159785026828, -0.016677251343357832, -0.036287370622927695, -0.033653158506393541, -0.081054618119207861, 0.022448731777965539, -0.051864605704516141, -0.0022564588924538012, 0.0065500568568099202, 0.019613695988714784, 0.035674619157173841, -0.088137935604942944, -0.049861006869088897, -0.046523335250325093, 0.015602894296518968, 0.070302678780579275, 0.025611762172576102, 0.06845737037990568, 0.035739036571478075, 0.014800222944481767, 0.028993857532204525, 0.026773523645769501],\n          [-0.058789866419249687, -0.03992289616881476, -0.010605417103711993, -0.018499457729712329, -0.004865080190320413, -0.060301330529616955, 0.00031834469339242499, -0.12557104846760686, -0.080004274046988455, -0.13698273850528309, -0.22799077610365462, -0.025563254532452423, 0.031596931721125744, 0.034180802606017344, -0.050379683190577049, -0.036900574597293838, -0.020122798822353932, -0.11425996362570746, -0.082449949096166764, -0.12939384502163268, -0.015453432533256775, 0.16525998969962169, 0.0054733899561779098, -0.021933035683807854, -0.058344539474112764, 0.022961713249665269, -0.037437068374264519, -0.1277856597415159, -0.028890639336882469, -0.0028919209327963741, 0.26948646721448222, 0.1755823507659644, 0.34733594380543498, -0.099005604765418503, -0.03282593950620348, -0.065174445338135711, -0.02845735040351216, -0.062602372298509845, 0.032022397582957891, 0.15695159271707296, 0.34154299673599708, 0.20280139720653914, 0.12458150522764966, -0.093375723727740126, -0.072239020683553506, 0.0090947163917505652, -0.044389015283926039, -0.052574599103869434, 0.029479831254029615, 0.26924859691625802, 0.22826750438753873, -0.0022877017320989818, -0.1114646531276304, -0.13529114203352183, -0.15036111092012305, -0.085842755314764929, -0.024536907507225265, 0.0086890807497300507, 0.021944209642358908, 0.16653403493301283, 0.08152009064661242, -0.14404674546435942, -0.14990102541427039, -0.11121323411132536, 0.0010729953777799395, 0.098095234511134735, -0.034221197248638688, 0.0040175961684953184, -0.018012784825030465, 0.073210106805800909, -0.0072272106254334667, -0.015972640001127802, -0.061003687664664949, 0.054833426188111108, 0.067576339145725264, 0.074127017865976058, -0.042423930579678311, -0.037337363882495159, 0.022891392960963857, -0.0034269311956898834, 0.04377607969407446, -0.0055550198865683478, -0.060684852096268893, -0.045928233440519814, -0.0088830951753407356, -0.077574617772135271, -0.073068573889404992, -0.0075845224916686986, -0.05870405744262968, 0.032429727788504017, 0.11139987187807623, -0.061069384823273565, -0.022957481391546936, -0.081456668310723568, 0.013486103859614872, -0.10699268871745335, 0.026815142447461103, -0.046958076560392775, -0.0095643677181986124, -0.0078126265354927348, 0.021325652288010453, 0.027800587316513206, 0.056728645862545959, -0.07588999178312969, 0.001849623431887229, 0.022933740393987989, 0.013435613550251885, -0.030879626804123601, -0.0049468588623556402, 0.0040992199004741686, -0.0091408161111731587, 0.10871928144408688, 0.020712482757044768, -0.030869482809578623, -0.0019257988508574048, -0.011927083397448635, -0.081405740634482276, 0.063922112367951894, -0.010456133387573327, 0.03707660212821462, 0.088835355921773829],\n          [-0.036641259174083958, -0.022318782338815249, 0.024522274312524583, 0.033440491760940591, 0.088325318805097308, -0.078447223191200052, -0.047208492835296774, -0.047259416670676881, -0.025215781435357056, -0.015414996185524978, -0.092115101238035485, 0.044024131261608312, -0.0091153987713104428, 0.0048974270909144524, 0.030833576332085333, -0.020765236921067881, -0.020723615749795563, -0.012243854655765614, -0.046289817377706238, 0.018593204344671412, 0.0051453347328788007, 0.034378456965152134, -0.060076223671287794, 0.057462262515044049, -0.029604759889713811, -0.032984761062248569, 0.019793815460092429, -0.091801878345608684, -0.03956459119173994, 0.14253192152349636, -0.01806439485632861, 0.012289491688936907, 0.04911968723662781, 0.057131455553269941, -0.0053968509987426319, -0.027773037404305069, -0.0045553437237598471, -0.016293864219002016, -0.1018126126459068, 0.21507853086133841, -0.039233573544075251, -0.01388758790666203, 0.045506921385831317, 0.12176852006259906, -0.0049585365213533662, 0.012483286148479648, 0.00022150651974826852, -0.0047489494995995168, -0.056359601414396263, 0.17519663761795012, -0.055694439201051764, -0.082196839716537948, 0.064537741077840327, 0.04748422973872729, -0.0028928449210207825, -0.015338697146168576, 0.002703261150090952, 0.0067497963183427712, -0.040248133668722312, 0.078968141080816637, -0.10963403655958821, -0.17062543905350416, 0.22859560603386642, 0.07851962872419016, 0.0080330152274108758, -0.01142427708908322, -0.015145649505435649, -0.023532868284188511, 0.0099659612341810866, -0.026743099199774509, -0.042414654589513018, -0.049675570929287774, 0.29646343280477494, 0.025690805425905093, -0.048511227932622428, -0.10023827450589579, -0.16647012418573801, 0.026747181544677607, 0.034918992877789233, -0.012381071612453791, 0.031328960840184238, -0.03808798675298581, 0.13554403224476577, -0.038600519161136035, -0.15955152669761682, -0.18650119722295797, -0.057062155489439867, -0.012769517962987352, 0.014753730819575053, -0.034539139458789864, 0.006058740052616929, -0.0098108713410034829, 0.069117277622840978, -0.071244146237570763, -0.13192760007023469, -0.031815896848603233, 0.027197733872446832, 0.044915537687674, 0.13641539907523023, 0.051541344109272018, -0.023022917497770818, -0.0075024647062180427, 0.0075301826652961409, -0.059347528011641199, -0.044234947284663123, -0.011581128699856197, 0.0014665467844986665, 0.047135698296650763, 0.015656423092764042, 0.066012956376650042, 0.058200473354046559, -0.015586985696736753, 0.0052092264230974294, 0.014817241711833552, 0.018388023474896837, -0.086675877098822782, -0.067044063522772729, -0.0035215449899233878, 0.064161373931149845, 0.065318498548821255, 0.067259148989151349],\n          [0.0045060454140400386, 0.045655120374964497, -0.0064830700717017822, -0.0032628436084326529, -0.010410124902832244, -0.03702402040624643, -0.036963266474149589, -0.091093906028424584, -0.11864573227941409, -0.064289797687791306, -0.19247581164633484, -0.001736762598627155, -0.0097469459578441008, 0.0016447907097145286, -0.040872882087491146, -0.014221224057596007, -0.035842689053500638, 0.016146856355897986, -0.039843139194713842, -0.093130420560655763, -0.0023746538984200771, -0.13830477342208627, 0.028428452224738408, -0.013697468079493669, -0.11156935100514298, -0.0089864206453983495, -0.080752864691162371, 0.012804209858369449, -0.062406450316134982, -0.010725880834214149, -0.033419853775967602, -0.013381072105187686, -0.12601376127960781, -0.0011651414984304651, -0.096302794160834315, -0.033960833636545611, -0.07271627207480294, 0.035903231272948394, -0.050366776129811802, 0.039465836216112535, 0.089595240957993455, 0.080323722760925531, 0.15694230593686581, 0.13046741922551686, -0.10541702655016309, -0.055080126117310738, -0.0081043441898794311, 0.049795401559017696, 0.085050117897638097, 0.33220650657354384, 0.25591351064686196, 0.17170416430885482, 0.11686339946258112, 0.11405546450621301, 0.22946835883838218, -0.012135608835537007, 0.083665324516254844, 0.13743718640771305, 0.20760286167445086, 0.024810385626267768, -0.25485287037990362, -0.37635120927444349, -0.27148633180868637, -0.10307518032579147, -0.073758021077069053, 0.006322005152026515, -0.0071614241191596956, 0.024394639535414139, -0.030595356710155303, -0.22377146981167628, -0.21688041618965234, -0.060604397244649409, 0.18640642704652977, 0.1411775414679666, 0.071715708604953896, 0.013663567087826838, -0.059637629532230764, -0.079133304381083139, 0.051501100412118382, -0.10958403078776109, 0.040357653528253698, 0.24551987265937023, 0.19850031772812765, 0.13276295660894386, -0.0033277520526472926, 0.095717281270899235, 0.0060754811619981117, 0.070214032074900512, -0.060295737352707629, 0.023305858534584164, 0.036241683301989451, 0.094785196684708778, -0.051030541969498217, -0.048582060783967027, -0.13620414142167206, -0.042785196097045466, -0.055491249841953014, 0.0010026144494500872, 0.011273492179008152, -0.0070417417384625314, -0.02690303608673969, 0.012495419954788797, -0.0049652674891686524, 0.014207910106334196, -0.058316356599182127, 0.020100992201083454, -0.055565658068763756, -0.058257850577289112, -0.12154724005307756, 0.036276619232864585, -0.11927424459722163, 0.1109090327897103, -0.087204589244144426, -0.0029129212052817939, -0.025028390260139831, 0.012106502056846706, 0.068613886378663252, 0.071374295120005704, 0.098125263845276922, 0.14037322438964439, -0.0029560423417013919],\n          [-0.086666708451327651, -0.065564519145399541, -0.023817463535297907, -0.020440748189549322, -0.071969614065115983, 0.00028668951002261411, -0.048727572694679672, -0.025160320872547617, -0.071502198767284489, 0.0094940082400308788, -0.072386589094650886, -0.025153788858944419, 0.023459850224754719, -0.05950332009913685, -0.045615311205432989, -0.083519770284241707, -0.085543219025638439, 0.013730208280768347, -0.021148981295175229, -0.0073162588177247967, -0.037712812535064255, -0.074773800976601495, 0.03462239265337725, -0.02547365067836567, 0.030186212545732116, -0.019963247487852623, -0.04969209404043104, -0.11327298065324004, -0.074519227217117595, -0.12603792583344542, -0.037063997844313232, -0.024954205133118107, -0.083735964905377686, 0.024750173546374571, 0.059330282701814688, 0.062204749968921932, 0.17133136972067453, 0.16121648224746851, 0.16387294452638612, 0.058308117323603761, 0.025830807003138445, -0.043479982176188162, -0.041636429687936197, -0.12914102690849677, -0.040109360336824149, 0.020146168363946934, -0.0014664956647692795, 0.091342016467911402, 0.11971706786628006, 0.23880056181382195, 0.30997519288915309, 0.24621925944009149, 0.18586785581035009, 0.12052801882874073, -0.0034211287368824117, -0.030529992172357766, -0.032290577650566622, -0.07619354278341188, -0.1960657681886227, -0.20015100244650072, -0.19677279724795954, -0.18308786989283266, -0.00055713480106216878, 0.13743504158235739, 0.12949126333024466, 0.20559599476304927, 0.02351134428016869, 0.016946777735827437, 0.073623968286197633, 0.065649323472256313, 0.062699413579597518, -0.05017906172626907, -0.092252062144122904, -0.22544582106641978, -0.14498855282877299, 0.019198250206979468, 0.08296161046033787, -0.019486237898005958, 0.011992512029289193, 0.041329981058323459, 0.07636271244077264, 0.031761554053674354, 0.15907477211435514, 0.10336465086935449, 0.039866126496747839, 0.021911878458555786, -0.15923424669690406, -0.013828911493878555, 0.076214097730179772, -0.018094163035829308, -0.022784108454190939, -0.07576679032280903, -0.00479472472165271, -0.12287034163039613, 0.031158696953220461, -0.051655022084203854, 0.096187316481263704, 0.0095670984140750134, -0.031623662424778903, -0.052567997778793368, -0.0031420233178607662, 0.023308733927797941, -0.0023387082999069553, -0.0094487986093912645, -0.04582399432870362, -0.0054810246023805631, -0.081257910575128434, -0.053087043188049285, -0.0010084105650565306, -0.10300285383556548, 0.05010294929397674, 0.039084033656922076, 0.00078260416687278567, 0.06658472055870629, 0.019512702741612473, 0.078540493706748191, 0.012933307469298647, 0.061861312662757253, -0.037748621235955342, -0.044013957061032435, -0.058653414400645094],\n          [-0.23765593793991233, -0.10644252010202958, -0.14205331737791968, -0.033409658821102896, -0.051746525740039011, -0.04902914905506061, -0.010142689387288009, -0.045800121111205794, 0.034452092003027894, -0.037462523290761315, -0.052617568352887403, 0.10954838938856398, -0.13610118046500422, -0.0095471511929971949, -0.12706132231951731, -0.092228798361772418, 0.021263651882758011, -0.080027642431201571, -0.0100550311904971, -0.021203318677089002, 0.016576191285134906, -0.028370386427869553, 0.33291003086902288, 0.28090106038207852, 0.12847553299199477, 0.033792763942573037, -0.023904470117744384, -0.16851016358623308, -0.0060729181420751625, -0.023245122034615213, -0.056640550891660243, -0.012010707479483837, -0.098774094475144666, -0.064504327550212237, 0.10265691959773923, 0.25554233719714792, 0.24276990386303868, 0.21966976582871933, 0.11091090952626349, -0.10183584175603527, -0.087459644795301786, -0.0029720828981545685, -0.00012924753214214532, -0.025079977013448711, -0.086435061104407823, -0.18087547713194091, -0.11352267862578171, 0.032889611202360142, 0.15787019926944854, 0.23051337575410985, 0.14879854133516468, 0.032437611765298205, -0.057059196511395328, -0.069308077657970535, -0.082356064599434647, 0.04228548674166778, 0.043412923933183953, -0.072264826939583221, -0.16689179449726901, -0.16026349114722624, 0.028474874784694099, 0.18131198489108219, 0.041852912264988044, 0.0049306527163999643, -0.00083249749637829239, -0.047831996372009418, 0.0010252465231246899, 0.017497628114831826, 0.074031972038296395, 0.054062759312123537, -0.0048788678858039461, -0.1017614042122941, 0.018693005132704797, 0.0076210492973557671, 0.0085934586035815354, 0.029130058487575196, -0.076722340878408429, -0.04443504101988021, -0.041904181084809797, -0.042181657033595429, -0.027448364698935662, 0.043452694941417874, -0.014281471541844684, -0.11364364120314924, 0.021624342767224931, 0.059887867734099376, 0.048249692701759446, -0.025917915651940925, 0.02805763343822287, -0.035965266748084215, 0.010590677166796214, -0.061232693431225199, -0.057899063583557495, -0.08844340564057801, 0.0012600977398065059, 0.015191608284153623, 0.014315608183696132, 0.039038170262391945, -0.011070372964504849, 0.0044675582793348174, 0.0051525001918035183, -0.076856408464383241, 0.024632015663543207, -0.046933647548906957, -0.0043118009452010539, -0.041968903018102854, -0.01569526374931584, 0.013525540172630385, 0.048796773614702041, 0.00035467155966114033, 0.071901198369965086, 0.016274926781300325, 0.070923477382927924, -0.00882484521729196, 0.043457848227967125, -0.01463905425635062, -0.013191689698509215, -0.037524320749473053, 0.024708931479837257, 0.057086614057279259, 0.0058576139736190606],\n          [-0.024541961538258487, 0.03267163162338621, 0.11772757167816214, -0.034174233168758797, -0.0717426324714492, -0.16174536289395333, 0.014164562611569745, 0.019531072825155295, -0.054978468415161165, -0.0038956868428951796, -0.090196113790009247, 0.064812251885165414, -0.0472339389168712, -0.019133679594543138, -0.080948115948705671, -0.1101849445159255, 0.10726549986933923, 0.11986161329611322, -0.13898042378726411, 0.029469805860096759, -0.069941197461236101, 0.10165481762063706, 0.0042591037232074525, -0.049347547297978321, -0.083661416571785413, -0.087655843717195536, 0.020522117345934385, 0.080191817405819127, -0.15728279592142505, -0.028885847231444647, 0.073544321095523182, 0.20706344381077879, 0.066144278705455667, -0.069631881661333023, -0.055387270887946399, -0.0099158960524032974, -0.039717793915661548, 0.14583324737347106, -0.022727060768185453, 0.017713374718806421, 0.28062075184074708, 0.07576339464353285, -0.15759577923577814, 0.12669291481079187, -0.0065957965533044935, -0.023038500644189407, -0.016203548822575214, 0.011443563605701524, 0.031044733818071997, 0.099390009396605278, -0.05047331939795989, -0.030750723936850188, -0.15956288120485115, 0.01286776308068685, -0.1670547469453125, -0.047963831961764791, -0.077402955827408276, 0.025311426471354537, 0.040894848866229114, 0.090108524928684319, -0.3117498185712026, 0.059978928418208476, 0.17392049002395632, 0.068215126727969963, 0.22655017146929168, -0.11277740982522262, 0.015117918949874534, -0.062899724806877555, -0.069945490124479578, -0.044909742287021881, 0.14433444462851913, 0.29232937226395989, 0.1955873798585851, -0.057850714258981209, -0.014726496195370711, 0.088840761160314488, 0.26941150721674784, -0.054033771011003262, 0.0111591965306495, 0.024544359195103477, -0.0050102759877621028, 0.12289773365466525, -0.042268194241055185, -0.045072456104567213, -0.023985660885704002, -0.018776641626454649, -0.064872108441076909, 0.17923288498496057, 0.017718431179447353, 0.012676757235305675, -0.084141918563022666, 0.0927046391653705, -0.14741704405082073, -0.077405293524682478, -0.041954355353188345, -0.018944672617029513, 0.060652295217796734, -0.044563097079480543, -0.046248836126650289, 0.033353665903115184, -0.0018617038323594237, -0.067677746878476538, -0.023333614214616976, 0.0136221936446786, -0.012602435194539463, 0.056141915908750409, -0.019617155818133693, -0.093416021391092674, 0.025935720217831887, -0.2107611868683418, 0.040245343412419005, -0.077188871326229633, 0.01421259796769439, -0.11506917731449372, -0.080209944956327744, -0.12403747829586499, -0.034792135391462455, -0.051307124154093234, -0.044478904070419822, -0.042402134083612701, -0.074816944103372168],\n          [0.011580340758841009, 0.076463412301783149, 0.00079803404858471978, 0.048838428314634974, 0.12248324878819095, 0.013743650358534375, 0.018861138121382369, 0.011586008838870166, 0.045389746032794658, 0.031693376594253822, 0.074989649112201823, -0.009866261755352353, -0.10340488386695112, -0.071572160434485707, 0.0043787474738315128, -0.07778860136521136, -0.019559075604586286, 0.012039914910358105, 0.0018614793888236656, 0.017976562122428465, -0.04708343149187328, -0.0071367900965603071, -0.17555550753460089, -0.080029090945432202, -0.031800223769076583, -0.057597347069660187, -0.022591430940203699, -0.024015557136778228, 0.020306356095828103, 0.0070646865909845908, -0.049745509295279933, 0.010918207861832434, -0.0079759574056427959, -0.057844329934535914, 0.040415092756685103, 0.05051297898637875, -0.028679830302952441, -0.088878085058129219, -0.11596341833461316, -0.14726999841028157, -0.12186458373388864, -0.013719238451893214, 0.0032337827790390591, -0.10004453617576921, -0.017783520567117159, -0.043426790290178846, 0.002516237987708639, 0.031180239925685315, 0.092564938676877706, 0.021358915086836516, 0.17681853360539368, 0.06626948027510339, -0.056798463424251405, 0.020214558939605977, -0.088730140207167144, -0.019043455841855041, 0.12149386494436711, 0.039670736228732052, 0.12658659654781676, 0.25102106759056364, 0.313616299442317, 0.22183627286461596, 0.1359746158531317, 0.10115711474812561, -0.24302403404704537, 0.0097296125255306402, 0.18356713494692423, -0.026126940847291485, 0.034416695001123848, -0.0047517120355681092, -0.19721799705664833, -0.3026191738381685, -0.31481960231473161, -0.1434027289225949, 0.093247316689862428, 0.26017905533217356, -0.15231835953736883, -0.11886377910271781, -7.950240878037973e-05, 0.14995167348160249, -0.07737337854954085, -0.01599863660324637, 0.2521561754016366, 0.22726143797909176, 0.051761936974425632, -0.070375767384878163, 0.039304142728632772, 0.046344087243253736, -0.018432448385731964, 0.22509099226938978, 0.059917659545538168, 0.046242964966830113, 0.11839665900852914, -0.19506738398455795, -0.14025844275720523, 0.057466302603268626, 0.11019012358572904, -0.013541932475265537, 0.047028476991846445, 0.024667584373991497, -0.0058190883316349695, -0.087336525273645438, 0.089096154875776434, 0.06500967167977309, -0.043338205557104159, -0.019092524599200814, 0.14832868404659605, 0.078021069640875934, 0.070724212934028391, -0.031358410965025847, -0.072958714026414753, -0.13112668083166459, -0.086263740082819146, -0.072841242282538562, 0.077042927232936959, 0.077562899744286179, 0.10315256178304716, -0.053457712000654738, -0.045827447338993611, -0.02900391837847402, -0.22848349838247778],\n          [-0.069051215490355838, -0.13695919912679141, -0.0056563275282749768, 0.017174473739632906, 0.054750990465431963, -0.059932166353439724, -0.015330830129175563, -0.0068192284467516124, 0.0012622017178931346, -0.019229773264106312, -0.059761024322663912, 0.078692856969722169, 0.1089393724650921, -0.075681394444025663, -0.20952756667787314, -0.005312913294763244, 0.10044708684084892, -0.11640309355112993, 0.024356159573992391, -0.0012586164900474876, 0.05069107388375764, 6.7084393214669399e-05, 0.20191076124513427, -0.045181133059133377, 0.10144127341109486, 0.11705452040763065, -0.22632970742930147, 0.0184688808155756, -0.0013541832015389887, -0.12017877991510166, 0.016842236983854095, 0.052652180804933044, 0.083145511130703426, 0.057329748095278965, -0.040374712776183777, -0.11575057028044615, 0.11707621621679364, 0.069672785018686567, -0.13863634203166464, -0.079607983082249159, -0.022216919274236187, 0.033593966744265236, -0.11362588566413499, 0.10269722191626784, -0.24155215048670942, 0.018756954826990843, 0.27956157401899873, 0.039218371860729156, 0.073588480345744861, -0.044888999157036903, 0.13769429349072093, 0.0032477373467352548, 0.022428521170885826, -0.038465640538281942, 0.031154883554520594, -0.16441653723937766, 0.23625286909405968, -0.081428432405938125, -0.011107263657897232, -0.062666400207005535, -0.17075494746168615, 0.27269490990139, 0.031157268147637196, -0.055470185891144386, -0.006952885879328791, -0.053436281993972892, 0.42537068414459028, 0.018283114946247542, 0.13283560236845615, -0.015069149158958085, 0.10328347994406929, 0.44999154699931465, -0.0011928954570129824, -0.16086510891352077, -0.12774404557332408, -0.042099179368697587, -0.0018649195557395998, 0.24605932528385696, 0.074298264981605869, 6.9784477611684395e-05, -0.052135626941050443, -0.086745017818760359, -0.22499073514863255, -0.045344789395678611, 0.033108065913800402, 0.032025942933416617, -0.053699697308726382, 0.033624356023422591, -0.12434062876294572, -0.13435098170091592, -0.10102320426887956, -0.10333974326967209, -0.072744104098523374, 0.030026079255193142, -0.027686487813203597, 0.0035344601119742178, -0.059592180823454702, 0.031353387154932702, -0.031956460680317295, -0.18985564540590008, -0.066673937571019595, -0.030281628842088536, 0.015287505098408646, 0.010680344185151468, 0.044316674060265779, -0.0092002144294807825, 0.044711089149172344, 0.032936423173475296, -0.028902000094102702, -0.019831895072516134, -0.1083289835481895, 0.017001459487365853, -0.016581037303639058, -0.047452480796807951, 0.01964408724082841, -0.043525154566764424, 0.022793656727439479, -0.031968227415916144, -0.1191326261973889, -0.012951530456903462, -0.077945906276183335],\n          [-0.0042180435203333227, -0.177849827056837, 0.10345176940428125, 0.14691821176034053, 0.032856437685713946, 0.069906188728512633, -0.0063945110693917079, 0.012858674522952751, -0.031362305638645026, 0.048788464134757729, -0.21008276813725216, -0.14262226241092743, 0.27350682670700188, 0.13675983935772454, -0.29666625074261765, 0.13073198270538819, 0.052879354221863011, 0.20819060117120861, 0.054692335523337222, -0.070712189277451695, -0.0072302981622757783, -0.037876207980575435, 0.016205298964287681, 0.032611323558465855, -0.21236590603680106, 0.19488138090854343, -0.050183688887998762, -0.10106171926311576, -0.19451804410928483, -0.097570273334807611, 0.14803373393480754, -0.11936458691698297, 0.090357091614167315, 0.0059923455004580184, 0.025455653887793486, -0.019228242751246096, 0.084191785333891184, -0.1088352303605908, -0.19709666326225239, -0.084653777829652263, -0.086888144789493554, 0.36808967859442904, 0.10964208390108912, -0.06453781682173701, 0.015795651214486534, 0.0372255583573948, 0.043017883593270814, 0.11952788902899536, 0.10395017914010175, 0.04553068266111155, 0.05441345422005224, 0.24912633653507255, 0.002223137297252974, -0.10580881478072197, 0.090087613906571426, 0.16662136065460986, -0.15730886509144254, -0.091248525393662711, -0.053757621594197856, 0.022178794252692133, 0.27116243919778504, 0.33866879890439228, 0.14040194814605061, -0.051936697245067276, 0.013903415563632955, -0.065676039555647242, -0.12825582201243901, 0.19222801891437483, 0.066176686136318968, 0.073803898255870817, 0.14569502232430348, 0.071160030480564657, -0.0095456596009633743, -0.10489910337220464, -0.081457920709183701, -0.078985379590762378, -0.11641729288088618, 0.02271274135586502, -0.040783573204296208, -0.0056622589430029863, 0.0036835932550680038, -0.066780309193843077, -0.12713315993774849, -0.1586600519695244, -0.063328586222237665, -0.055759758783947483, -0.037458086574487418, -0.022460685295330809, -0.022028900024817097, -0.011882201801517509, -0.046972799168275001, -0.14701204551638941, -0.037217728702544514, -0.082831218869885689, -0.0016295615745458014, -0.021758715372862947, 0.059906725662667415, -0.013176728966978149, 0.064518845785987863, -0.040907493521731432, -0.02724481426696284, -0.014614954526350594, 0.11052684024818323, 0.027444907166189095, 0.022162414399074806, 0.0024547001841418916, -0.01609068146442251, -0.058966580405083346, 0.021584412865348603, 0.032765251105065299, -0.1716263843502637, 0.038525696603424579, -0.10090104298395008, -0.082755480397067163, -0.12651405684060268, -0.031346851498544215, -0.051126139081003386, -0.088046305344413461, -0.003187155224522592, -0.027110133357033151, -0.11431300136421083],\n          [-0.066924227135342934, 0.041699164002372696, -0.10385522794561593, 0.055675362062145774, -0.074260470462326228, -0.091189960480717175, -0.045789683018577006, -0.053408546616140973, 0.0016410632283570901, -0.010001962022561817, 0.021791861105379333, -0.051951291323868297, -0.070200622462203655, 0.097279876582038807, -0.15048632688284508, 0.12149505097298019, 0.015842805768137305, 0.01783019614395083, 0.028679225099310354, -0.13093015859478119, -0.0032724249962371582, -0.076392560780105201, 0.023827921599709007, -0.10048639075186741, 0.057647734800977908, 0.14769797654526404, -0.058573134153914214, 0.036566470887259887, -0.038113001252617282, -0.035949645768287825, 0.13214950219821359, -0.11750728810678948, -0.027309528175229383, -0.15554238984918572, 0.18384157344434507, 0.10897982741577553, -0.055054919090396615, 0.23295461106984391, 0.16692460259498326, 0.34350821795606212, -0.061818935287900251, -0.024811829586858465, 0.079963429313170714, -0.18727278866453625, 0.077134089493061789, 0.20554995099374251, -0.025108602454572731, -0.016911421678591866, 0.027522221377421628, -0.18467242934043285, -0.12870450689623072, 0.2705100330044119, -0.23570033354568337, 0.1600690210988466, 0.060772731257298589, -0.040057046042739526, 0.0061976917126070254, -0.21240599027215282, 0.22776373257918395, -0.24459850621169732, -0.11110091474536704, -0.32900610024199545, -0.065957274593286902, 0.38918437667082284, -0.037061988998483932, -0.013214304459370309, 0.11361559841851943, -0.13116091416864151, 0.26148934106645616, 0.13109860511874102, -0.02559270333763761, -0.10769559173489475, -0.029541835495651814, 0.21030527945911404, 0.20083517469185433, -0.15455102744651888, 0.098485941721442954, 0.053759144210784301, 0.082713231452363006, -0.24255028029402606, 0.025733657047261198, 0.17680889892790308, 0.23330773415315006, 0.27752776373592319, 0.17725610536084593, -0.16258826629493126, -0.17144766528315306, 0.083644424511134546, 0.016994501600820736, -0.071477397540526386, 0.074912024363340463, -0.07565486524045649, 0.021346987911851578, 0.12285156854226099, 0.031741176745010577, -0.079711919211636756, -0.010975662352579296, 0.020719019955012588, -0.14947464235426425, -0.05912634010598853, 0.025068359943792605, -0.076954325737705429, 0.01069978220983156, -0.035726380166860028, 0.010452571251196202, -0.020801433687767192, -0.10029057450694524, -0.05347120776294563, -0.048791402971955875, -0.043406971496632182, -0.10411181696202407, -0.0096115795367616441, -0.040122338177384982, -0.046812122680620266, -0.064058112417089225, -0.14541168506254615, -0.075679730264006442, -0.032466738656732913, 0.0079790695503431444, -0.07581427323024105, 0.020303485166861458],\n          [-7.0956605279434704e-06, -0.095051438182964521, -0.087881575580860127, 0.0047062408698162472, -0.098027263270710638, -0.0027616522983207395, -0.097227127279984199, -0.063000737106212207, 0.1183446266588927, 0.054456621706851616, -0.0099413502699212952, -0.070139195335673504, 0.058249435624697594, 0.03289065810180454, -0.077908796650873274, 0.12060553802938856, 0.041916937919234294, -0.12018601094319402, 0.024991064566815515, -0.15610551053004948, 0.027447361841557171, 0.0061691806469063477, 0.22277923739993141, 0.07777153698627623, 0.15813994477460777, -0.017009298898611493, -0.14311974342433334, 0.17959497330783272, 0.051525754847030057, -0.11409305598330613, 0.0087348047214590788, -0.11631550153784051, 0.014926258001363192, 0.035969081785568666, -0.053625843536913562, -0.023997302411323432, 0.19964826933410396, 0.036096776017663271, -0.049210808628064102, 0.12245938533273446, 0.060611269299314152, -0.095796932751361336, -0.069519386575027736, -0.050249772835886296, -0.0058375428161391262, -0.012563499903927425, -0.14780320613165895, 0.031772227910289275, 0.1340288392048273, -0.15156587379880926, 0.12631446141014752, -0.0052889953007679499, -0.0019668259446668848, 0.054030336420065141, -0.063631403170866352, -0.34919842820174568, 0.086316002230514569, 0.1498086851219177, -0.01958777908962751, 0.12206293626181336, -0.19933801771288356, -0.048029128706853393, 0.052601068176454692, 0.038693350122585096, -0.093007050474004316, -0.025563344264592822, 0.177347641964092, 0.22163601611492076, 0.094680687451677889, 0.037985353513600273, 0.0088876390621224696, 0.33248829688044318, 0.16504809583361016, -0.0078675683065857933, -0.004089442342142393, -0.073882292576678388, -0.023509082885282934, 0.38130178103352774, -0.019291678040942513, -0.086843448560368325, -0.040173020823503824, -0.04644318688990192, -0.10185859440346755, 0.16438891805551265, 0.0026682289367386675, 0.076749174458747987, -0.067947692216907357, -0.0010386668473387935, -0.1071413883705663, -0.030576591810295518, 0.032786203858462565, -0.0055510882120406793, 0.020069023492512786, -0.017109613552384946, -0.1436550284492504, -0.016711779362517481, -0.069886123624812627, 0.011359667056578288, 0.0048980919655428265, -0.071130858325672064, -0.065545434771973304, -0.079794688129113223, -0.069727649875106712, 0.057019363580092276, -0.021992787171872023, 0.015178002477788638, -0.00020471363886212166, -0.025514430736042228, -0.026882894230500245, -0.045297853805246369, -0.15832593006621121, -0.031428749312098873, -0.0062888408902217752, -0.0057807583295211989, -0.087719175812133982, -0.014850613830471766, -0.098570157493344357, -0.1178588681684648, -0.058161768326308934, 0.025496330937214109, -0.027500922923648384],\n          [0.033385872123633739, 0.029449410773330013, 0.050373165760226532, 0.033759553320561811, 0.043978212175572511, 0.083180076982955681, 0.071686676768404664, 0.026805901274190462, -0.040212948527338761, 0.074455765899692133, -0.015556797943286706, -0.0052349749182220018, -0.019241697521412499, 0.055811600772115361, -0.061555692140009097, 0.022157119108767706, -0.037499771041887051, -0.091842013395178321, 0.0021346112094529357, -0.077528445870580553, -0.070339569427925713, -0.021843780086959141, -0.028323350880137224, 0.00011164923792164605, -0.063043678969301159, 0.0312281473289511, -0.027814517961888829, -0.023586402460836806, 0.014274870264679794, -0.0099112948624283936, -0.039421607735394437, -0.036124694755188508, -0.14334911700158648, -0.030906231546069748, 0.026456805364020539, -0.055731905472351545, -0.099791023065150669, -0.11300163966955051, -0.096702307648394478, -0.14134937562707614, -0.095762099342366805, 0.012996731697811542, 0.061452509807262426, -0.10845706522050219, -0.095954535650827094, -0.026481658468726504, -0.09342212328404359, 0.025974710463679895, 0.048411867352889076, 0.13854747029920722, 0.0089877939638353527, 0.1412865429641629, 0.018873766998065353, 0.0068619328268330129, 0.066028998755879767, -0.069576990925801802, -0.13630992697783664, 0.053261035495914627, 0.17932579331025728, 0.20451416645740492, 0.25417885834428638, 0.42794011719114639, 0.08044763293045501, 0.060807812906450633, 0.050979231912287287, 0.068724551062169986, -0.079585125467176915, 0.16947242780377064, 0.071750399564743134, -0.17602834598556363, -0.20609506703378996, -0.27585183265236618, -0.45996207117951626, 0.041977085392240453, 0.14013188266658397, -0.10129069427591146, 0.042032097653530609, 0.0010700558006018247, 0.033269813089743, 0.045261284159797271, 0.18492968093047082, 0.11250515788380208, 0.079146011997887886, 0.27604374526273284, -0.29337379824901733, -0.032404962081403643, 0.24482947691686244, -0.11730122219590641, -0.00039308173073460823, -0.082855210467204926, 0.14722185737303153, -0.050887412106644436, -0.11313790447392723, -0.045971837803545731, -0.12976452682175901, 0.36520902694991747, -0.091821999799496623, 0.085864390337494809, 0.076512715542274651, 0.1029210140799042, 0.0027325839402362467, 0.070586710333678859, 0.10533730048009346, 0.11195874976952475, -0.072147843907271553, 0.04958613688607464, -0.031050732598035459, 0.14407295372271284, -0.085587606300639052, 0.087228804147073041, -0.17190628673080169, -0.11561123789185015, -0.092875168889563639, 0.029308812125760478, 0.03997500953017151, 0.12185883649720056, 0.10737184929932188, -0.039136971459624983, -0.08075374206140308, -0.053377354274828807, -0.19749855557352708],\n          [-0.078856631490001827, 0.028609754041207199, 0.028065667582647003, -0.021834041252276289, -0.071731644229173191, 0.041943503021699281, 0.0034420782526643334, 0.099852416772104879, -0.07205432251463359, -0.14404103188347261, -0.099453272442615065, 0.030831458745725907, 0.029895496253457346, 0.0015406398850859385, 0.05063743421782619, -0.061536371482124472, 0.02259540959954133, 0.058299280629769371, -0.21504560821843677, -0.10742200693101064, 0.13531193618860787, 0.1292569094640518, -0.023228953646059501, 0.081512184345085004, 0.00055798660700738349, -0.098023802602571472, -0.066933869931841583, 0.030281268644703027, -0.19700701283846223, -0.07452246871817525, 0.29428494587030196, -0.019357176004156089, 0.097885648631463901, 0.086819751550199789, -0.043231492206504837, -0.018463852192367017, 0.062745383271060842, 0.0092971348018957081, -0.24863827359607188, 0.010777357730302948, 0.2316312466976955, -0.085329575508557826, -0.1144533554642945, 0.083801285402681849, 0.075830927030971565, -0.014032603342417981, 0.049484524164173316, -0.021590806395398253, 0.01544196314913996, 0.086162432936096586, -0.044102733314784051, 0.12334022048862069, 0.0731644245704271, 0.1088690387955715, -0.15316811061648344, -0.078737489667754818, -0.017284888207398728, -0.039703575150386236, -0.056905519161583623, 0.18660214037769024, -0.023526673216460528, 0.0097119105430037156, -0.11068696302980902, -0.0033322120127640339, 0.22171201468168639, -0.14381135593764638, -0.044159431475442788, 0.056899281315330237, -0.062535558479373796, -0.096715665724386363, -0.042463185527764596, 0.33605398681131693, 0.12771999969210951, 0.029306037892139189, 0.05296083974268942, 0.018388136003953504, 0.5836401595356645, 0.078369782006029357, -0.14774018856780891, 0.079310575246893361, -0.13568107571099638, 0.033726128645812273, -0.19371960002191677, -0.048923336377734009, -0.079048275095496057, -0.09345765767848567, 0.0084687991049249428, 0.02446655940112101, 0.024072807776000009, 0.045654023909503204, -0.049520678628329894, 0.11131277121530644, -0.082671959669512629, -0.01281734719311349, -0.058436346732921529, -0.090027065890889588, -0.061291547168362749, -0.12266871096386792, -0.10084079570396901, -0.038685969609545547, -0.034857542952191456, -0.00069531684714200376, -0.05711976301891046, 0.065894606637351888, 0.076843927132624321, -0.0099221911757089998, 0.038382533425733813, -0.0018487126462470374, -0.03501906580527725, -0.16441171510027652, -0.08279114832431804, -0.066047134941834895, -0.081932618886619485, -0.010547381209761031, -0.051038369726976479, -0.025578508207813648, 0.00959733436024926, 0.0049533230583025667, -0.061062803017560258, 0.033453744496612564, -0.12571424039710155],\n          [-0.079439136902308832, -0.09707485383450068, 0.069013639062420487, -0.074505761065334339, 0.075011587478881175, 0.15666344682780237, -0.081193505392068127, 0.092118683011617047, 0.16894882838291519, -0.064300711893237078, -0.10649892578590311, -0.20661689203008798, 0.1403179918871823, -0.13859623598009607, 0.15068161397003726, 0.0818655854637374, -0.014124777365337841, 0.15933582287539705, -0.056122956200266111, -0.14961952361740766, 0.26418260048580505, 0.00014354663354841646, -0.0073547177374536712, 0.079306683498707897, 0.020928941460220271, -0.10994253368145199, -0.1737068099917021, -0.023790675949004782, -0.086918445142954964, -0.0043349673789482186, -0.085954954881572246, -0.029420848660444726, -0.0090500058502500022, 0.041530999507431957, -0.069423567534389233, 0.24688351427911395, 0.20546023916088876, -0.17598878843872648, -0.24389316703559294, -0.19015439770039061, 0.22071277516100238, 0.077210599045731132, 0.014424585107587845, 0.0067033339564058075, 0.14557756666221139, -0.10028307012545846, -0.046263766310684282, 0.17807074556144536, 0.23207365188169671, 0.068919009550189744, 0.13997442592318893, 0.08843295944139111, -0.06619014796452205, 0.039954930324093148, 0.044429111474699981, -0.081010967478443885, 0.068410955264807463, -0.048059234788064731, -0.0052523124756469336, 0.19319439038918368, 0.22920446006103862, 0.086101063476146392, 0.031256459311461635, -0.017769668585097209, -0.081514861804228012, 0.05257244191659842, 0.0065146809658001778, -0.17665071040880326, -0.019856913059721516, 0.081102049633683185, 0.043277973324065216, 0.1177242078686942, 0.11137298745761917, -0.00073261542200567242, 0.091978290618997344, 0.082389423312920304, 0.034022525912699247, -0.053097609779258953, 0.099288071298097996, -0.10854924126379789, -0.17742490622599222, -0.1788673671646884, -0.14114600439166541, -0.064004772896817302, -0.0530848482065642, -0.001659672063313692, -0.070676871764606644, -0.098803538640278576, -0.055944765770140174, -0.0052751644189938454, 0.032007780955169478, 0.057629819382953605, -0.019709560268588652, -0.057823914219534894, -0.068256964756672839, 0.027890820691469885, -0.076656239311701027, -0.023631977229926458, 0.019705542780305209, 0.062780023228323073, 0.0043080812012436104, -0.0068539298994425221, -0.06958545243479107, 0.056698946025054167, 0.04217344775125749, -0.02598409561655364, -0.033097604108995968, 0.0095921823100812154, 0.041800833565904215, -0.050819206523713883, -0.10689758970874308, -0.015847929055034071, -0.060764599912676534, -0.0062175219913371549, -0.085347310202452731, -0.097474869441167511, -0.059282139115269104, -0.035577269192877056, -0.075014161045616631, -0.060536079286523312, -0.11817678424233188],\n          [-0.024906089757269871, -0.0020839929168818827, 0.03600621465641745, 0.040388199406629903, 0.0046367828095772237, -0.050097408580542964, -0.019438803749024975, -0.099398454194897373, -0.039682250621000295, -0.0028157838678664303, 0.003598249335640377, -0.054099425886740632, 0.098751567366142629, -0.13208302404353375, -0.18035374659388975, -0.0043732111233372346, 0.052329318134350926, -0.04335824692063206, 0.17086900465322874, -0.087788905809879941, -0.044980405576590651, -0.03163490494923718, 0.070376930420080558, -0.22835180537374491, -0.053228685368124661, 0.20061806426747758, -0.010253623864425198, 0.015916215379575709, 0.11152189577260957, -0.12242970393701272, 0.20444421875737073, -0.11370776685859571, -0.079913946642613046, -0.15288251066153316, 0.013009551196509275, 0.24933943719410992, -0.15783799994383102, 0.14723844916068518, 0.12653772742745573, 0.087844531937603762, 0.15842166298167773, 0.048090301745894584, 0.30801127557408381, -0.11761230465763839, -0.09838866239110361, 0.21453595775800124, -0.1423387911053251, -0.0057875034434971828, 0.14715035050010203, 0.037047259467474523, -0.050841281845606351, 0.14408577985508386, -0.2038513895714491, 0.12419113537768206, 0.16468328842666694, 0.012860540177512661, -0.060259991855088471, 0.075149602462860884, 0.32707138878173159, -0.40030305735760485, -0.26935994114991207, -0.27607955331013073, -0.11367870913437449, 0.18759384386653338, -0.1163031684096954, 0.011359887068835964, 0.09104201353611753, -0.023930250513817877, 0.027145616702753089, 0.26867810752766969, -0.040944043069847058, -0.051185346442636469, -0.062555156572748197, 0.1472213528555063, 0.17279204270125498, -0.045587324746883026, 0.040778081769105995, 0.077307454201848841, -0.045917861885393978, -0.14679289792741518, 0.058857192810905033, 0.30472542738820174, 0.2683300390974695, 0.20924065894919816, 0.21225020570051081, -0.22492319213360987, -0.1053571313533698, 0.10129898309130989, -0.058699658556484721, -0.056962291919962646, -0.053784567323456531, -0.064199356290904355, -0.023276261041638765, 0.1463492641852929, 0.17298005397684749, -0.17279567370535234, -0.028270599211786665, 0.054369003114690263, -0.10106883014481371, -0.14024347735480464, 0.018313526646667293, -0.037983673629831183, -0.065301664052257818, -0.012949891765581065, -0.094604107423927594, -0.11534207274853202, 0.0076674644006928493, 0.066321539829234916, -0.050400969350873806, 0.0074219548220236372, 0.028869570811624359, -0.015979869180987795, 0.0047547098123721819, -0.023242027383037541, -0.10363187962188126, -0.08083238636814595, -0.038313754638492299, -0.086839600348980459, -0.019540426477005362, 0.031333439883288614, -0.15193982135608425],\n          [0.26630462964519636, 0.030128294989303788, -0.11791438037260804, -0.11737308015815517, -0.062861100017125554, -0.096766046107599188, -0.082199316172390957, -0.08602044544779823, -0.075246502052840794, -0.029806813487391677, 0.24281116497344327, 0.067042165401364526, -0.0073445552680056064, 0.019073705951446834, 0.02402774328620054, -0.022036865798413671, -0.041360734184431945, -0.021551677954214206, -0.020934734000922058, 0.0016783573161842508, 0.044653551257398255, 0.047330499149608574, 0.070320918539436658, 0.0049339384317501345, 0.068284358255943409, 0.0027795836778768818, -0.0466896472535712, -0.055777797336017988, -0.053408170439317705, -0.00010746082973150939, 0.053647124251753928, 0.014169718568750114, 0.02905438269701309, 0.023031619273586216, 0.00066727081308550005, -0.00051462984272446916, 0.0056491204378612469, -0.0020259322895197036, -0.016498390040156383, -0.022442940786663319, -0.035029164960025241, 0.063846154826204329, 0.044687185096032603, 0.058668246749611672, -0.045157147571444921, 0.06041887311954984, 0.040368811541336383, 0.099232499506447247, 0.048066185349036866, -0.046324953034900501, -0.00080887873698461902, 0.11409453701686445, -0.00033137478785196135, 0.03735595742910118, -0.0079674076739742593, -0.049741034524289095, 0.13611114777264577, 0.023766455706096472, 0.053497687988346081, 0.015733350480013578, -0.063824933259796907, 0.033330568088863713, 0.027844489959796326, 0.081691899842932555, 0.09714592419415595, -0.064828174985232315, 0.01437395739678209, -0.047331107121522768, 0.044196999907911393, 0.10629752929835162, 0.073542689176749262, -0.04442637013096748, 0.049683512301096674, 0.068365456286007917, 0.081523009768297947, -0.015087145755708103, -0.0019638115525515282, 0.039051783324939186, -0.017850512607641256, 0.02370779603383788, 0.06201068601506067, 0.073783766823374425, -0.091844803840924111, 0.010696782251581938, 0.086036514718463936, 0.094596207999147933, -0.074054927866882767, 0.027915857377493219, -0.037642014739791167, -0.040193374604089255, 0.0024468858328299675, 0.1274974581652491, 0.0093404351484588644, -0.040375276072868213, -0.090114609127803932, 0.10326418667261725, 0.02917729347842522, -0.0077046231605733149, -0.030226724173417804, -0.02693842944612336, 0.03299558344045618, 0.037655280816208281, 0.060384055506334661, -0.011607343174437262, -0.088458663756049549, -0.0089621130215228745, 0.041335212079519151, 0.025264577237378585, 0.032067053817915525, 0.023830466137715112, -0.079345931632774758, -0.11617934147005861, 0.035620949281212844, 0.10013927849222683, -0.048809475943344949, -0.11446551821055255, -0.095813017973671741, 0.016305663265873432, 0.11707531676597775, -0.06319976004011861, -0.16222515899222084],\n          [0.056794304038679966, 0.10167830608861393, -0.016503737435740885, 0.0046764347911659732, -0.015979430307930184, -0.047920295093506274, -0.055022283646318906, -0.10379295727074533, -0.049717862262312687, 0.10568238875466442, -0.031174132439086774, 0.083704603950004272, -0.091368133200752627, 0.057269302584031172, 0.018684874349729957, -0.032113253507965796, -0.001736967749467095, -0.072079756116517402, -0.09935581393877263, -0.024667483850197125, 0.08617572294614978, 0.040040155644135919, -0.15099062261616583, -0.00067872303189795563, -0.015247157304283773, -0.052523565344750653, 0.042551307369904048, -0.14444354746621113, -0.0065487046921334988, -0.071842610189861628, -0.012850025711011279, 0.014122793694046731, -0.0033943022739370415, -0.039640354001140646, -0.0031247601407242975, -0.04585791859357094, 0.0019020572673282693, -0.12415842588927675, 0.073896324144092557, -0.045015519750068421, -0.042377317003355355, -0.018876095794982992, 0.066199553272244749, -0.038229410201656738, -0.081067787682230996, -0.03945825059342991, -0.021573688648487861, -0.08753783022136527, 0.033366036076064857, 0.13641185499907951, -0.063205201260604499, -0.0012659096018193816, 0.0057982623571657815, -0.01152673538233475, -0.0079257311321652285, -0.14126097140944649, -0.034964896400424342, -0.05417735615198177, 0.098662735854543188, 0.31744333379137851, 0.039452304758183607, -0.12302035212752997, 0.090307702196104955, -0.018426534125878427, 0.0076069917669535497, -0.063786017925961197, -0.13634861844502966, 0.021706398551087892, 0.088489197364119254, 0.24006998601480642, -0.038574376291261439, -0.20903973825035016, -0.028547940107015453, 0.088542726499488494, -0.021390725008154893, 0.044285016775694894, -0.026993312698921287, -0.064465983803312712, 0.12944644855572515, 0.19089244056580751, -0.030480082660302492, -0.11056842407420524, -0.030936086975706011, 0.11334521747158818, -0.035129148248064457, -0.086017765013793296, -0.0072168706451755035, -0.10752750376129108, 0.04312283194476934, 0.16933458944871088, 0.04045539432256913, -0.23664539634671644, 0.11812030967359738, 0.075939969650854852, -0.10351739032237361, -0.030300589898196291, 0.086878456898969891, 0.020132080229428105, -0.023337176463668542, 0.1929319867081439, 0.022201478223351577, -0.099101135273428051, 0.15510108808703874, 0.063727924452699231, -0.2536830626984794, -0.11398510745687342, -0.060714100288377329, 0.014445183346757966, -0.078060776119834835, 0.019868445241697584, 0.0081798453460741917, -0.058441780232701836, -0.12524948970895577, -0.042729684478892374, -0.10578506496128201, 0.082761699659597399, 0.22610842991965319, 0.19472107409175121, 0.13770970450022119, 0.25212791464266937, 0.073498142085367354],\n          [-0.091381241401881697, -0.058079620328844089, -0.076530504628475743, -0.0199353534219689, -0.11698549667840648, -0.049621401738281688, -0.077132621657016204, 0.15067146207913978, -0.050781047593468576, -0.02068608682311579, -0.07749948573069973, -0.096758567391562439, 0.0077571560895567868, -0.0095979406212449749, -0.099565859084337058, 0.0051600482008870227, -0.052061725176615475, 0.21007930845912845, 0.065151157684292277, -0.07131801809693715, 0.018812215208894742, -0.00086442135402349518, -0.046564358647237104, 0.013463679946637018, -0.049760289181046941, -0.075120052315886143, -0.016205730606521709, 0.20370769256587995, 0.21631569735613507, -0.21639898101726901, -0.010174498767059056, -0.080744395481969419, 0.00065762540281793375, -0.10941455592056311, 0.0051919514244158776, -0.061527253139188519, -0.01884736889232981, 0.21787195260154674, 0.22243219444192475, -0.15575200547256071, -0.10816017929215728, 0.0051881907601944027, 0.031785513639906941, -0.11820319244612582, -0.091955481834663816, -0.065886002565202856, 0.045741458364707437, 0.16229065484815031, 0.18370330017469805, -0.081324008115822286, -0.096899444925845776, 0.11220947396556524, -0.12652409273694068, -0.056954083685135951, 0.0037198361414339312, -0.040598532368215791, 0.039300218532823339, 0.11791439151540004, 0.0326000042015889, -0.021776978247445074, -0.040529054786980857, 0.01854198366161787, -0.085732791470378808, -0.004251519029603433, 0.031088165635845141, 0.10946916476597079, -0.030520300750865037, 0.024588867262970132, 0.031028281179074996, -0.026058776582265818, -0.034739864282203929, 0.042015930066768251, -0.15813943081690485, 0.098811275146536204, 0.17664760200291613, 0.12060292796297431, 0.28365889513274267, -0.0098819391479129104, 0.020720424432064774, 0.041373041991295892, -0.021038365304358167, -0.095202664058810157, 0.14910980302517288, -0.025721833368892062, -0.12819902853565343, -0.023631492175036073, -0.031597247870627954, 0.10824280634239519, -0.091173425222870613, 0.063567445633335107, 0.021728192985388861, -0.10568636568278675, -0.03165356681046462, -0.0087472418572157873, 0.14635866247530055, 0.137170585551738, 0.040902403217571118, -0.017771123105949502, 0.038560203534045476, 0.039245273632345951, 0.056815291462562527, -0.11183679663036641, 0.064817659114458095, -0.0814319418691829, -0.03407437639196588, -0.11203464618304287, 0.15240885057308393, 0.13533724849720771, 0.068633687203628974, -0.036633006460861393, -0.046692920364638499, -0.033281368663026875, 0.0071094850495891995, -0.024376962431089298, -0.086464142800486851, -0.048461882500802841, -0.085872378316760006, -0.17119204490022732, -0.12548065175775711, -0.10025652608610795, -0.067724150717968543],\n          [-0.11048795383128253, 0.17729666058333263, 0.16552135430896192, 0.034404289623548884, -0.089588724846092802, -0.0098956908398675769, -0.092669573892880996, -0.06203414994882403, -0.13027990600802769, -0.02774126581005951, -0.033782876400120204, 0.068485642196071284, 0.075989574144754934, -0.036571377943051521, -0.027073113771866435, 0.051358605941092213, -0.12486678803139802, -0.11937553330158295, 0.00027670008133570678, 0.039242940114803171, -0.065341658588557533, -0.032591209892933931, 0.0094873995209515255, 0.077228802276500336, -0.11978965646742909, 0.065175622098800165, -0.0045330682114145572, -0.093210957468272904, 0.20829565218067517, 0.034407695510313439, 0.20900868773517667, 0.18059530210220634, 0.080546449898943231, 0.011691715187434483, -0.1036261996342592, 0.089440339361349333, -0.18290277626865079, -0.17449211585023297, 0.20463646978781697, 0.16205227161355945, 0.1248389858520476, -0.033920943885589638, 0.0050538696227267789, 0.011335298516995454, -0.001853830495579134, -0.13334091118720467, 0.13244272444684829, 0.131632260424145, -0.095949574197512086, -0.14905751361173961, -0.1371680896219323, 0.078006860735210071, 0.22398467991789892, 0.060077091359143922, 0.080459089156971392, -0.044226547302833194, -0.02641690246856537, -0.021047236515817119, -0.022107985555041423, 0.27081392806687543, 0.20243579723370436, 0.052508427611470655, -0.081686945424025187, -0.028000437521812652, -0.069004413488459787, -0.019947203774680143, -0.065108523571595467, 0.087304868895712956, -0.077077120690107775, -0.18137313212262005, -0.11403701580048946, 0.1344871234635103, 0.23244603542157677, 0.055124623486195068, -0.066463747876115559, -0.091451832072540304, 0.018849225191806832, -0.024654340248073531, -0.024966200161235935, -0.091424575201207697, 0.072527831499301726, -0.065216059830789028, -0.11921754880632893, -0.17337893909947941, -0.057219238952144341, 0.0067422534626652882, 0.011248995976294755, 0.068047811183628626, 0.049614879488339002, -0.097275846898811927, 0.0082358567684881357, -0.015023386519351074, -0.053933000536622519, 0.022181719818654445, -0.078603056286837239, -0.096990160520272428, 0.053341686179560657, 0.038592658381352868, 0.073273892990471573, -0.0027339150021431086, 0.0087236349272764163, -0.056654841529851035, 0.0089929406550926932, -0.047992111069460372, -0.072470382965599156, 0.013556901031652455, -0.0027078537211853854, -0.020808961745466689, -0.023685877670394262, -0.082885320875324089, -0.024581734079028472, 0.011675698399989887, 0.010268763903630733, 0.00027727025909281972, -0.10403456880151318, -0.031328630320557459, -0.048762641369514532, 0.013870483338988132, 0.009776937951070902, -0.0016096606912818917, -0.11084797308275902],\n          [-0.30333471569576326, -0.098154450360570744, 0.0015410657868983949, 0.045929458780550832, -0.065355998121677139, -0.13987052383343457, -0.083088561382526641, 0.082669066314702278, 0.061904779698073738, -0.11069374343220081, -0.28290200253357906, 0.22673155788863875, 0.18594415935524841, 0.071854402503120182, -0.030528580748157334, 0.028577245402910886, 0.031060985030853229, -0.043861615284254557, -0.044105176677454817, 0.022159810237959286, 0.21654680444315066, 0.30278316304132502, 0.012213805294510331, 0.086126585521097476, 0.18984475627300115, 0.17496536348485808, -0.084862281907876494, -0.081456542808588703, 0.01832638457011089, 0.13673417025774948, 0.27284413141414504, 0.094612335659298857, -0.07613963041950092, 0.062933406187327873, -0.097443958251205609, -0.068403980749692395, 0.0096655524754083975, 0.095040552086250632, 0.15936905785590366, 0.072995084064054722, 0.031252763725467911, -0.16546942109824656, -0.16677751455927864, 0.12669754079805604, 0.22204531073147377, 0.1873578562466022, -0.037621658900903542, -0.15711170707975403, -0.17298791364700297, -0.082555273200012824, -0.14455053081729527, -0.22415305552359763, 0.042542402815446807, 0.1038139770409886, 0.20625177708368309, -0.15880889026588421, -0.075658865558639876, -0.021485883747037457, 0.10891607713839715, 0.091092897473454199, -0.010416568160451598, 0.069543852325783792, 0.16542830711077747, 0.065217336152304003, -0.0148176716125085, -0.20521529011852879, -0.14264824540169307, 0.019756071252460615, 0.0058040644663103075, 0.039643334769194863, 0.15659048313489107, 0.22864706757459258, 0.14254650813759029, 0.057073186388449368, -0.053152191307381427, -0.034477291485900341, -0.077598395442579862, -0.066725783977938199, -0.064230325525589035, -0.089991097501851386, 0.028289830388051281, -0.066129155191647263, -0.11896201994465391, -0.082558170326111818, 0.012810697942117068, -0.024384133696020396, 0.015087500169279289, -0.13601461458960581, -0.075236980328811445, 0.039014121011195529, 0.02815424125400038, -0.055013916259284479, -0.008254101582952672, 0.002655866524947384, -0.021125020025650129, -0.023746573840204926, -0.042683164777021068, -0.059495722156300584, -0.019042694817947538, -0.12936213546879713, -0.026222299825073875, -0.025812691605142032, -0.041703863747776904, -0.0661914684158392, -0.097506063642520957, -0.058396072583561887, -0.089961267739098516, -0.0037007256822108175, 0.0011179813727885506, -0.10090477889016067, 0.064140298767104573, 0.010238148607735212, 0.06440364812729471, 0.076684547115576734, 0.039151433631154905, -0.025802896171529727, -0.00019835521728821248, 0.071841486242385455, 0.13125162014433939, 0.046056658246170903, 0.053499157763845701],\n          [-0.12965724207701509, -0.037580246387615174, -0.067610081744866102, -0.10396968869944452, -0.050146681143041577, -0.11661839201437256, -0.0134094248817632, -0.003812121401652345, 0.14551889487217159, 0.20960814138138711, -0.11572556521584892, 0.038199771776252472, 0.053736720825050086, -0.033780376813536642, -0.013778088995604357, -0.12296410846003263, -0.190779199296427, 0.063623184193675034, 0.072719948625815545, -0.18712323706253348, 0.13564826018751774, 0.10041735856871029, 0.0663871462462544, 0.075875100621604977, 0.10518317164208223, 0.14542272105614312, 0.12359189084318592, -0.033750642430414049, -0.1168093845370131, 0.047363177697914378, -0.078115158492371495, -0.0068072546065389011, 0.022330740883073977, 0.043345000603673689, 0.0061772562098951697, 0.10018581879835563, 0.12543189326433035, 0.29106180455164443, 0.15950577579932912, -0.041016614728731443, -0.24664638490921542, 0.10243965713284461, -0.022249340976419691, -0.03998099582023288, -0.054513454865913025, 0.10149283919617619, 0.12490712516373728, 0.024443018843315022, -0.1715648928173428, 0.0098209256442637616, -0.099464482677069699, 0.10892786493077161, 0.10795471728528551, -0.03038255212780229, -0.052093742890319261, 0.081082286817464475, -0.096274050930638774, -0.036267436417549877, 0.075185345713630086, 0.096808220000748818, 0.02028571579311067, 0.33290510761917347, 0.01733913364880374, -0.16522028580434994, -0.0040897062381491101, -0.051775053344798386, 0.065670470719540894, -0.032772885393817147, -0.085058808488073845, -0.11929889732683205, 0.092455936215032175, 0.25655461456536199, -0.13119179078724852, -0.099868329749784879, -0.033238669040386949, -0.014474294906370588, 0.022015269325752353, -0.0068706343634212103, 0.030438728104146773, 0.038215294505712517, -9.8671203312486466e-06, -0.13106943853344732, -0.11029667516487467, -0.05651270541297225, -0.035091478549347271, -0.021024591609859103, -0.037796865064866875, 0.0024114282376300894, 0.066872760480572752, 0.06279809114300125, 0.015860273651693568, -0.066417984558896942, -0.044395452917303999, -0.056739278057440889, -0.074490614504174629, -0.0017445397987308903, -0.001856208967092543, -0.031296834327762674, -0.080379010855047062, -0.032932702209649889, -0.039466027214634262, 0.026868758362947193, 0.052720469111467889, 0.017821499479210093, -0.0812792524309323, -0.0098243462809757751, -0.035827346651628185, -0.018665339965729243, -0.030414846245718247, -0.025397750118409348, -0.12699585584653394, -0.051270046062598378, -0.059492797705412472, -0.012977814302096748, -0.040201161068129737, -0.0063003255036662778, -0.059572314072736721, -0.060873397857079979, 0.025500546592364254, 0.056765099592826794, 0.012716285965905683],\n          [-0.053342785646891183, 0.00524567552363564, -0.047374753370638178, 0.094781074251503727, -0.040976740413566221, -0.096552554457401962, -0.074881802597734803, -0.046657906236577507, -0.091330632489740368, -0.040717971184299956, -0.093076755058470406, 0.0037318258071586674, 0.0012979923922400161, -0.072971306435051883, 0.057699016112258382, 0.21677924213445596, 0.062692077375228986, -0.044090195812729369, -0.023130229334030562, -0.021606172607987695, -0.016753725645425696, -0.089114918695803486, -0.018011910259290234, -0.048665499037987205, -0.038883468315214373, -0.1600836076867248, 0.12324454290748962, 0.16213596071632191, 0.081890999010858709, -0.026691379256621572, -0.078939099722900294, -0.035177884757280425, -0.070559193083664304, -0.081449629456742917, 0.041254495310394122, -0.0082409283980089815, -0.06410405058088145, -0.19223363085057119, 0.19698561203334053, 0.075457705890398047, 0.10168065244977331, -0.011407968361767371, -0.027454319260572038, -0.096909253770893336, -0.027762551704027569, -0.099431835349921047, -0.065804778038646372, 0.0079576419011488393, -0.031079452139909713, -0.025254998311881022, 0.13286239727231575, 0.10025133561412032, 0.065637269228549927, -0.003144015511429633, -0.044383514517180048, 0.055436478646850723, 0.059891048250770511, -0.0098526217416507553, -0.15354872527543872, 0.1700617723129286, -0.1844295002128809, 0.068014427221688975, 0.029876275367864972, 0.10799501360998554, 0.085618199850133345, -0.10413623068849565, 0.24464749614213879, 0.10562029167251738, 0.15464122158870292, 0.11486770498168064, -0.16275359615761803, -0.10100376605498677, 0.095138924293591193, -0.10761116645534677, 0.017873153892635395, 0.11423888867213229, -0.0018411500448220972, 0.086874147832482249, 0.16367347677496105, 0.044733386292518801, -0.094761623273037748, -0.14397973597021768, 0.21757349732675985, -0.034529293295072087, -0.12834039570251105, 0.039442131452955824, 0.052146536402598725, -0.0027754429203348772, 0.092486771466581935, -0.10000875137392633, 0.0219682748340118, 0.076096240514652802, 0.26484488873456774, -0.068778998021732471, -0.13150962876054156, 0.0011599240934269256, -0.068092913704283053, -0.027604333874574859, 0.0055121360660488131, -0.074848915014377543, 0.031133754790612762, 0.10057960203336513, 0.16473981410325628, -0.021659253601673652, -0.084824882710566013, -0.016801310205887945, 0.022993395502963216, 0.017167179382408942, -0.056374112089754111, -0.032324211286495264, -0.018053909855479569, -0.050023765149209809, -0.14089885860421936, -0.13965160319931622, -0.11870197019087025, -0.062036231181908014, -0.04101797266105614, -0.050867286670802161, -0.058573069820662169, 0.021580959803428883, -0.042699365835973099],\n          [0.019902842485734224, 0.15561506976085307, -0.028017485754111875, -0.17651276038235375, -0.039197701387862535, -0.060229014076549556, 0.040413897080862501, 0.0039324663973003132, 0.035474887918963999, 0.086187127716139331, 0.066211423470236119, -0.011482759449640119, 0.021711326088798229, 0.011537755053333605, -0.031843183714078183, -0.08491361323535157, -0.023265192234759174, -0.11448125258912051, 0.039181067323331403, -0.056998902182359298, -0.064776818516311493, 0.063733692782339729, -0.043075172605832698, 0.05638433416632907, 0.025730822225084077, -0.10729102468091503, -0.043117991855032033, -0.053657854256318194, 0.01584487603201426, 0.013290760860429117, 0.010200015604431685, -0.0031793878712187678, -0.11412253559205487, 0.030883839158126154, 0.021462269136898211, 0.034969864237521547, -0.079456104230846078, -0.085031737678128175, 0.11503343538242178, -0.10993782268920241, -0.089572802157924417, -0.0039431094236408934, -0.04578774281544791, -0.029069481413135097, -0.029312843103912124, -0.0022281839533548724, -0.015461174173461611, 0.08016859253876335, -0.096417465851594955, 0.068169543109748931, 0.14488842713652675, -0.020620161448456426, -0.12127975627620319, 0.0035402670006761464, -0.10860121905429683, -0.025759025070910151, -0.015907799649678353, -0.019318209958923922, 0.027711942877274104, -0.010691765460204925, -0.11261913121914686, 0.22919127543697509, 0.19547240621082879, 0.062576613714025703, -0.032437508756967479, -0.17049052524689434, -0.054887759421750289, -0.0086606964527578961, -0.032470312195105946, 0.050117935111423713, 0.038409765488664892, -0.15181868441017379, -0.17238837635837911, 0.17800490245662465, 0.15774737196971728, 0.11238684789419333, -0.11549538053161687, -0.1051441923254989, 0.029627428418807066, 0.010047460882148362, -0.03595190922317814, 0.015687349765215325, 0.10710721567720438, -0.041276051064384339, -0.23137836087848457, 0.10813840323639234, 0.20398998249936215, -0.014741356900987223, -0.062683408610174352, -0.049411487995288605, -0.035967710177904844, 0.041871499068939354, -0.072184903859897467, -0.083863872617445712, 0.098734320072343104, 0.11031868253657633, -0.22002867944446203, 0.12779602690138148, 0.14218707015954651, -0.0011896001696623804, 0.079366530371097477, 0.043588532242198656, -0.035424574718560489, -0.054609455641465063, -0.16492582250638183, -0.17557350746334122, 0.15889132124334202, 0.0041503307895962432, -0.10134763057667201, 0.19023517186356353, 0.084659592208096879, 0.11510279765301401, 0.16224249442600286, 0.17763576210351251, 0.22133908024822241, 0.14596218529396179, 0.02887144459288063, -0.10378678936442846, -0.067205691571172455, -0.088716399430536996, -0.041101641158728192],\n          [0.15920136420084935, 0.060406604769127695, 0.058122346605073032, 0.00477008922714715, 0.019787104327780913, 0.087203596056315003, 0.030264199678037729, 0.017304599070370644, 0.085575429473619624, 0.023958591314004331, 0.12884963809652478, 0.068599905466411953, -0.045567154593245292, 0.064960440039459111, -0.057217993135935161, -0.025447705395343731, 0.0909487087326179, -0.079769498949750814, 0.036730991722000075, -0.038480072535680726, 0.006076468777062756, 0.062315581478503454, 0.002067988991471037, 0.0065579719955623714, -0.0043517925373637197, 0.0096289999341297033, 0.029116266207693448, 0.01426370898438685, 0.029690457152439259, -0.081627383427878258, 0.046850542350542257, 0.006214888501193401, 0.018397271891386333, -0.012561848571951174, -0.040551619526904017, 0.028504081990583418, -0.011486869296661643, -0.059191179697348155, 0.022429209245582032, 0.078039055277124986, -0.015415531651337386, 0.019964992266425875, -0.066503829548354446, -0.0013193086595682316, -0.10842019255646421, -0.03697337790527494, -0.020534261687351601, 0.040747539700920002, 0.053337194618316, -0.00116709964776604, -0.0095601528497191515, 0.016298910205605192, 0.0077277626889895347, 0.00037443623014628974, -0.19227631613374657, -0.13238394826418348, -0.030124775371821032, -0.015887858135493947, 0.025013961658704745, 0.027518775349448854, 0.024198826147774258, -0.047760885812468984, 0.12256242261650652, -0.055852213081364149, 0.065026093917872521, -0.1285269471537781, -0.059058110817278908, -0.032314037012273589, -0.050141311125915716, 0.08014056175866828, 0.035775922639718939, -0.052897492514335016, 0.0028741733491999197, 0.082628087231978217, -0.021869185345972597, -0.069854074675508887, -0.068575988216225736, -0.064584701819010937, -0.00693137015502477, -0.063835739267782257, 0.065183894970587242, 0.085579887773321761, -0.089783371778548476, 0.02413243559151125, 0.12236645633019359, -0.0081031241390048803, -0.10893007981107913, -0.041047520032544138, -0.040485575357566729, -0.018772198351639475, 0.024153345138070187, 0.10036333221955367, 0.068740306407003446, -0.10245398888523655, -0.016349166098083526, 0.0070380009438652663, 0.12265704999147381, -0.043113460086378494, 0.013370230023298443, 0.016729136801514881, -0.039288684774408056, 0.057728476425995087, 0.041012638786676131, -0.049978733723102124, -0.032347506063964117, -0.08817543486159464, 0.099869944360031201, 0.065600331696059444, -0.015359581783002035, -0.028528989655607573, -0.037199051460136613, 0.15244521122136684, 0.18336254107941996, 0.054287847035064243, -0.046369032846879508, -0.1119122723959507, -0.11519151048090097, -0.022731910011617007, 0.11225252067886338, 0.28560328365377685, -0.067985252020442657],\n          [0.058958788260075945, -0.021876278629613638, 0.037612479257211687, -0.099005159575964105, -0.1165516680699821, 0.021078862330256215, 0.015957444616884531, 0.059647685916549217, -0.065505591575810915, -0.083395277179433458, -0.18213933265545079, 0.084305230751524365, -0.025710617818550302, -0.0014530727721881326, 0.062922294533444001, 0.010828617512124508, 0.077505124497846897, -0.066208360763709506, -0.055002695608746162, -0.061510630819380879, 0.068900345436844659, -0.055539144857880557, -0.020784660567228427, 0.089398233599742291, 0.1288331620004711, -0.12816590368747446, -0.0096792212613234004, -0.11505461495101575, 0.073195596999562046, 0.013390797267512064, 0.063157106796453089, -0.11664356591893797, -0.087677499975957904, 0.064068527412859982, 0.089552329159210686, -0.012366311546488887, -0.084841814209484792, -0.30992838085367469, -0.31591124672801529, -0.19715224674545362, 0.020969019898039606, 0.14193745471028157, 0.061843173279961985, 0.073936168201219551, -0.01304258854189852, -0.07497702247252562, -0.20603881883896738, -0.070945540809535773, 0.28309265451797216, 0.57742199459415977, 0.31262023603175498, -0.083661619056098951, -0.0039166593479060124, -0.007008189710296639, 0.040088156481113336, -0.049394984833606687, -0.029191264319536905, -0.081163508484737398, 0.19268793954258898, 0.21144872967342784, -0.29773471400507556, 0.12406492440813296, 0.3660537274903351, 0.093082413567314573, -0.024580539876515733, 0.10110689340406492, -0.062910539274161195, -0.0034612665515367895, 0.029116324782821203, 0.0020626436307547343, 0.10964075240294091, 0.064158923379264071, -0.21854402897708003, -0.12925232991277491, -0.079675200291648277, -0.01811196962139593, 0.035957827281212953, -0.046726417696597952, -0.060929938641963624, 0.01119071426640683, 0.02353396464233623, 0.072568418302712129, 0.23270637226267299, 0.33170083850101384, -0.057955687348093615, -0.12545830581187295, -0.039267158405268378, -0.056155244480238127, -0.046609200143938004, 0.060498849366474053, -0.043016662084753868, 0.024841779701571622, -0.099367884763605085, -0.16431861879138088, -0.15146165000437428, -0.0017544026515488691, 0.17032294123573102, 0.064867648206299922, 0.15233819334655943, -0.032910847411962485, -0.0071731964963948833, -0.0081380849704634252, -0.050724307248593621, 0.011173233429224511, -0.062101699142451269, -0.052308817017819691, 0.00051654855856720847, -0.0075192043437920311, 0.039091511248705406, 0.071465889129755322, 0.0063359942967715424, -0.095630124560084281, -0.025392132057811982, -0.10041647140235001, -0.097928005682022187, -0.027282327996318675, -0.038112131251473808, 0.012061424608286169, -0.035596588506541682, -0.052821862323290544, -0.11313037428451306],\n          [-0.15324006372195415, -0.061965612404142049, -0.020864586176693893, -0.0004281080429524662, 0.0730549833543368, -0.061347651024975337, -0.031466364007885647, -0.10327863822100901, 0.057558435766753083, 0.011198077448874383, 0.045234383554630685, -0.064711224992117677, -0.067011155811770431, -0.0057205043684774096, -0.028643015431602602, -0.037131071599513364, 0.053748889551759958, -0.054199304651787503, 0.021887370672747687, 0.016189862073254922, -0.019016514253116644, 0.11379602147808761, -0.11165312886440776, -0.0087496200052688267, -0.014474316621162608, -0.026251634435374149, -0.002710236678190989, -0.030990248737400521, -0.04127464832894278, -0.11453289829380965, 0.047907282053055035, 0.038421978515818717, 0.015082505447196207, 0.028769815253706164, 0.01684473164289961, 0.094727188915121593, 0.20593647137919804, -0.15159924031985617, -0.24555118979497925, -0.27707522357288905, -0.18048921280574989, -0.011307677999135979, 0.11441322835116891, -0.014636046617138777, 0.079198125709557601, 0.012007403858779957, 0.0072428501587866109, -0.18640141319376874, 0.16780516380957566, 0.56826306685500816, 0.34085510546495534, 0.15391020895285537, -0.22202084848747994, -0.093193681017569682, -0.005005130632420085, 0.080166786371967738, -0.0010856269574332431, 0.033973275724025434, 0.29561270160331643, 0.36482758672358029, -0.31466398989768735, 0.062497098572653162, 0.21968853798387469, -0.026684311034055108, -0.054686227873073694, -0.15194326555534887, 0.054278240860889532, 0.07409840320590326, 0.0050038364543304997, -0.11139002424195973, -0.29694277435857414, -0.0028083524198520352, 0.085921492659009169, 0.054283294807933521, 0.041159753010144698, -0.040069399672292144, 0.020583515255041856, -0.032968306498467749, -0.12400399212637832, -0.12690204319933657, -0.087864335801985299, 0.25943260806255236, 0.25468901684408091, 0.11148837097156279, 0.016197234685087623, -0.035512335618043525, 0.062529085678797003, -0.061876366590392667, 0.042653661514922003, 0.1456886858554321, 0.100266511239698, 0.049106374130385599, -0.1692085663504731, -0.15021472143352776, -0.036437790125085939, -0.094174544970770241, 0.052142701469356942, -0.02443775761673006, -0.043904470755572772, 0.097322253365795447, 0.025963340060584358, 0.04495779540761817, 0.015315696105485712, 0.028566823650113198, -0.099804513025419234, -0.056574603633366818, -0.0025488357793481964, -0.066924339863506169, 0.010193965172470135, -0.0061765952954370151, -0.10526334482403006, -0.064591418118637667, -0.0082273846843367929, -0.028937589097058611, -0.0021874049091571094, 0.0064020706434689961, -0.082473697153836373, -0.10584367018509927, -0.016046741087392458, -0.065096168336001459, -0.076610989193125839],\n          [-0.039511428419417599, -0.0080173333971271382, -0.016551615434322393, 0.0756169606326558, -0.029722132603671139, -0.025034558630525398, -0.072171220087672988, -0.092474182124173826, -0.075211870880661391, -0.044360430478935647, -0.069348984382251233, -0.022490503780794903, -0.0057147316926908116, 0.052051258112528066, -0.054607716916367378, -0.058372621238702842, -0.060777353546059718, -0.077336809794399691, -0.045476724941883415, 0.030772582414215349, -0.11620967239502454, 0.10797792795409909, -0.027779187806584747, 0.042775504075928825, -0.029085091874604285, 0.070665070823427989, -0.10670180015368308, -0.12972554862345784, -0.061184746782739483, 0.022941312169178836, -0.01197768577248755, 0.16487084184278611, -0.048341409303366112, -0.026936350074678175, -0.048056362033197193, 0.032473762460042528, -0.13513407425749813, -0.11294851883996024, 0.028315126778450446, 0.10779312846779725, 0.13718980587277638, 0.094828465533259992, -0.029662193522414011, 0.1321112375584729, -0.11093428808802747, 0.029166874149281159, -0.065792824284420015, -0.082565002818216271, 0.024708088751542928, 0.22293675583854181, 0.23881873192468081, 0.084903111184386287, 0.040208497032350327, 0.076545573835757594, -0.06123753763864033, 0.0063284441525853219, -0.051374467063856455, 0.062827084295813851, -0.036988261540257486, 0.22358537142740625, 0.048437402611115017, -0.25353214195075419, -0.19261045779830849, -0.019422340552033769, -0.062847643771965708, -0.036853496173419903, -0.12964946819383125, 0.044458755188555237, -0.12226738775925999, -0.075998647776664346, -0.066285036198489203, 0.2852615582722664, 0.39166626094060492, 0.21583615293103556, -0.00059671763801670552, 0.028281927318908495, 0.14150420560575661, 0.029357515776456754, -0.0073652568066015778, -0.018181855688694376, 0.0045056549707617743, -0.11281100988725729, -0.12216102487292639, -0.045821897312377555, 0.027683086807535735, 0.044114075431245875, 0.012960273742704111, -0.01033045914794202, 0.017525421607595383, -0.026815178240449843, -0.038433562205767026, -0.023176466057391931, 0.018238150229464657, -0.10609098396328405, -0.0078365274088666032, -0.1692715238790774, 0.055230115768598605, -0.038599121201013137, -0.030083122414206388, 0.033498786150872692, 0.064549273785100114, -0.054456334956194834, -0.00056162434047704601, -0.12305574145274481, -0.052312038879843335, -0.0062559873241414682, 0.066658808641008482, -0.083661410065433844, -0.0050756577353415835, -0.053945762783515969, -0.00027041140698932931, -0.029193425089981271, 0.060243323194549399, -0.018406883366667015, -0.031509946993241944, -0.02305392310291406, -0.14523023321109388, -0.083398220870461837, 0.0083801401834026554, -0.054527177498857458, 0.0051808659359899312],\n          [-0.065848619594800789, -0.053261079120780402, 0.035473933387924081, -0.043773076764098175, -0.042948902519114054, -0.035839763275580229, -0.03670964756282482, -0.035889928945933514, 0.0084303424035014791, 0.070959935481377259, -0.039990937836020757, 0.00062919576125276822, 0.02301560832911255, -0.01209375762579383, 0.023507991177519026, -0.0043852583759025239, -0.017754505089411822, -0.098393451339086613, -0.025598526153569709, -0.093253517869822292, -0.060084598840034829, -0.0067732954612012303, 0.0047322343217982392, 0.0098854552921198643, -0.0079343145894890839, -0.048435067329455274, -0.011810163769240992, -0.044468277499084281, 0.029161537175831059, -0.052373485912767012, -0.012794443685316442, -0.073999770655031175, -0.11228628800766731, 0.00053718856153291486, 0.054814439087026594, -0.058611861795578993, 0.031704764448120752, -0.0076501524160651341, -0.10568592093548473, -0.19589466237166098, -0.12315650606608049, -0.011442858954517257, 0.11925985331634427, 0.0010363876176450598, -0.099823252161576004, -0.010168708525203837, -0.077187879437463067, -0.066004695514408407, -0.28363396719594336, -0.093300462947429247, 0.03526227396896657, 0.1315555866231668, 0.091980662692318527, -0.0081160541251212113, 0.12425322308370529, -0.043160319385198737, -0.010050897456012592, -0.025512330079287684, -0.054800141064251164, 0.020003986809914401, 0.31672436340823878, 0.27826309013079648, 0.13789936294639166, 0.048833669604749802, -0.033553110848946716, -0.043105117290175021, -0.046986705987033792, -0.0079365698973256626, 0.048609259060924025, 0.091879922847580314, 0.23510886392711264, 0.016599220831810764, -0.12371629321306805, -0.063234562962815682, -0.089970415822645783, 0.010187402027455342, 0.072231276389250101, 0.013954273076743703, 0.061917245142637543, -0.043802817323688611, 0.043710574812090564, 0.034237891220848124, -0.14964785672058278, -0.021062558513936316, -0.0065214932642196285, 0.10036739854860938, 0.025703084368196946, -0.023339141967235796, 0.039960562146232739, -0.062023256504603302, 0.019839319918413791, 0.12567284760581157, -0.12435675118258002, 0.051042313590592921, 0.05395714565825474, -0.016946352293375488, 0.04332098462941552, 0.03818482834599253, 0.067064810396032543, -0.092507745085479834, 0.13190717572685476, 0.078818792684562711, -0.087287307293906408, 0.13682219566390141, 0.022366303998031124, -0.0032543902188911095, 0.11492942524291971, -0.070293221413877185, -0.0097661701896662682, 0.079120220441492722, -0.13762756714606011, -0.026907508147589007, -0.12733408978979363, 0.086009164316699582, 0.011950067353004187, -0.0089315833809120327, -0.049144400030709225, -0.044693326486270502, 0.01772819118739517, 0.012376530468464944, -0.085355211057613248],\n          [-0.15926058536081383, 0.084896584812555423, 0.010352869323630227, 0.024130584286049001, -0.009902524763821266, 0.016912897049950096, 0.073092475986395414, 0.082369501233162098, 0.0043022384356816712, 0.083855432144435457, 0.032979428566029964, -0.034178053263341474, -0.029838590632024091, -0.10512208483111922, -0.008974556089922564, 0.036813559154062092, -0.020708179559887629, -0.010090767452007834, -0.072879198018760527, -0.0016777678298555698, -0.076743314512725452, 0.036399119709258167, -0.022292045391296408, -0.079820967715901137, -0.031169859791016094, -0.023949824087409338, -0.09000717940002298, 0.049463895166498989, -0.011624433079905679, -0.012190094457130381, -0.038313237174491976, -0.013830623631471112, -0.049168224717006298, -0.087380247558461244, 0.036253216857834919, -0.13554744530431564, 0.023838368099940645, 0.050095096402370184, -0.053271595872730261, -0.085011920306738001, 0.0061676064127104344, 0.0016709301712408975, -0.013992899617507056, -0.062742876584451587, -0.056305160151194564, -0.080727059672253937, -0.042390280602992117, -0.14776692164523289, -0.097021309585960669, -0.070734044703521598, -0.015526870018377249, -0.2258827744334686, -0.12300661118492401, -0.11675473231723006, -0.16926423521447898, -0.11923817183461347, -0.012360787613125972, -0.053242566102073702, 0.030546117724330767, 0.11823686169287259, 0.1835792066113906, 0.16422671841790268, 0.13230129923057396, -0.066626949058822132, 0.034498938620505855, 0.23002917423607563, -0.10642345721363024, 0.095720714414564798, 0.18783595134907466, 0.1135920030571944, 0.025587855512019128, -0.067439730759943028, -0.04765764814588825, 0.10204615431399511, 0.30589644738015032, 0.1207425327574773, -0.019907430927027056, 0.079052792051151108, 0.091497228092328589, 0.053534935883382609, -0.0018597176390167877, -0.036332301992695111, -0.067753380558353393, -0.038232412213873655, 0.0085333812446309193, -0.16436890766057954, -0.041481437968170019, -0.024498004464789828, 0.10683536971967762, 0.011812992251597404, -0.1175917440126058, -0.012836857177767773, 0.0010457282789089889, 0.072147347565764422, 0.12614593084743808, -0.055281692968689629, -0.0069995168866165275, 0.060200941049300377, 0.019190774932036525, -0.00068959398576445841, -0.015094903464007381, 0.082564956168390671, 0.029352696699322452, 0.02052763134499494, -0.031246302084582171, -0.059332749185159739, 0.096753036088350022, 0.037229564658005795, 0.02552939083091145, 0.056861247331111683, -0.023450845541740421, -0.023607393595097947, 0.01954177012013153, 0.019437963266884198, 0.044548459713283819, 0.038280883907943236, 0.061662221134642245, -0.088155201525030202, 0.079304082788044877, -0.051664305162406034, 0.077757861731466968],\n          [-0.061708370720548342, 0.047170428243489285, 0.012296886297672109, 0.0048086430115889811, 0.089273037261738325, 0.03230033333916793, 0.0099210922415796515, 0.077314960663833185, 0.0072189861909926004, -0.0057895901610497437, -0.027110780745009062, -0.13988755144130377, -0.056492694825430186, 0.043740683484729231, -0.001146343682998166, -0.087113548760168219, -0.049878803860526635, -0.044601413295294053, 0.037026759136881797, -0.019657603932586268, 0.0018226974562157855, -0.13718210083603291, -0.023654469782779481, 0.023928892232900345, -0.06122045854429186, -0.029673384135270382, 0.020848245415982687, 0.078336447612606816, -0.040875528946684489, -0.039873516281161016, -0.055583967404462552, 0.080912317767847408, -0.15785957027200945, -0.10648703433887595, -0.13229515155412883, -0.043310171649513257, -0.10793874347611057, -0.087527306016331546, -0.10889258052047679, -0.094200174396959033, -0.068306135251702482, -0.04422556269513133, -0.13934687419321917, -0.1704639053008461, -0.21416865484332515, 0.055183328393643288, 0.11437493872756643, 0.20663278657310677, -0.10572022382588278, -0.17195276126460635, -0.070753945164719556, 0.056465453539173864, 0.14099415930836151, 0.1946078610379961, -0.082660101380364309, 0.18247573517682947, 0.11507042684035029, -0.012083622193608423, 0.071742093963169731, 0.19214713056103003, 0.19212718354463745, 0.17144674880884414, 0.15448386542420869, -0.010181744325890758, -0.075106220762733905, 0.17626659048346999, 0.072929611062275981, -0.085362521503941843, -0.101891980495703, -0.093910933641212807, 0.0033217473718428897, -0.0056858529460113855, 0.010932950962091154, -0.1295062582171746, -0.046960749909438458, 0.0032455130187898154, -0.0090717781099731581, 0.0068370840428534224, 0.052015337511096507, 0.01835745774621482, 0.012669751254791792, -0.074411187515711824, -0.063973999886746402, -0.029665290241513848, 0.058058821799073575, -0.018533488843353246, 0.010601655483648394, 0.081067124952225955, 0.020392890895924158, -0.022919324383815623, 0.12127224411021978, 0.0071001462180422178, 0.12312966006288995, 0.13042358466157222, 0.046876831123739637, 0.042704169294137791, 0.068078423886842515, 0.046053854796515033, -0.0067836016920987396, 0.045065140276322649, 0.032495429886824072, -0.043798472997901496, 0.039504422768531992, -0.050502036141981343, -0.02941424277017704, -0.072356052312286992, 0.010414642546130649, -0.037595357550694798, -0.024335687688017353, 0.025902421447803838, -0.0063118171276183854, 0.028123124281161538, 0.02743154969855563, 0.0088219909651752332, 0.010829518047857936, 0.021827682953003358, 0.043520974366854995, 0.0035936083619636447, 0.056883805856356655, 0.040877092282017878, 0.015956636369652812],\n          [-0.0083507468620479183, 0.061639371991654111, 0.063042641119523318, -0.015296208138174606, 0.10245170405475104, 0.0039985678533539099, 0.077652024216616294, 0.030021244554642851, -0.021835994938437471, 0.056396603655322688, -0.15006956293703871, 0.010032941582169524, 0.0050163763218688817, -0.018546011439547875, 0.015951124664690213, -0.0011364559207565524, 0.011706775239053238, -0.058604015442668633, 0.0015384317043948658, -0.092476074016002344, -0.061290397480221234, -0.064372135135045749, -0.036227342676995969, -0.027815877384510204, -0.024540854835821482, -0.03665117868630987, 0.017808195417626349, -0.13330602418496687, 0.093825439776295122, -0.063647339534804878, -0.050293417559033632, 0.040497807859436338, -0.093307118406317613, -0.051282463447807104, -0.013632758698631245, 0.0051772510548923657, 0.028088081363910312, -0.069493637727032959, 0.029169511310514418, -0.065714751210128819, -0.0095799664282084675, -0.0075631952942880921, -0.046689398469438127, -0.036037308824896461, -0.16326411718263986, -0.068090435834012641, -0.090402159417016945, -0.189584820342072, -0.10038557840858034, -0.081409742082743278, -0.053687695693256356, -0.16229791121556614, -0.053231203082402576, -0.075002109435830411, -0.12647068989268548, 0.18340634478038664, 0.016324182102231133, -0.095198942566774997, 0.046462085929464936, 0.13804558707599751, 0.26953073102703096, 0.10023542270642752, 0.053013201346585902, 0.043485094470545015, -0.012145589101238131, -0.056648567004507461, 0.022122779976736926, 0.14925047779460079, 0.20113371911375733, 0.15087642306265311, 0.081589939721924146, -0.094399747262114364, -0.0019980179561955858, 0.10064758348146532, 0.14323151379670465, 0.13388503720638026, -0.013345742399046789, -0.027656328955928452, -0.098837422849065534, -0.015845908439641777, -0.029293403577799304, -0.12585250537276885, -0.076534053854507705, -0.025133636251120382, -0.078349075129356405, -0.02574433170418873, 0.038564326983106453, 0.084352144623457942, 0.034971800593565937, 0.021597995522587295, -0.0096451137676172999, -0.024148476054881025, 0.035439018890817242, 0.094838888204336252, 0.013834291541066517, 0.047416120389632277, -0.052763377378187162, 0.099286557947731571, -0.042715908236761815, 0.065423720561164633, 0.012164923448017582, 0.048080933808946395, 0.046868409986020515, 0.043736365228833965, 0.033547437900394127, -0.046381661633450463, 0.062765142428707038, 0.024133154758299614, -0.097568717053638926, 0.13228826368262767, 0.043959645127688234, 0.0069923806816005706, 0.029834519712280835, -0.02842119488910682, -0.042758777280284009, 0.050490465625002964, 0.050638143272702621, 0.044201806819941999, 0.015928366919704041, 0.050283819730028469, -0.094578811274961511],\n          [-0.0093002340146824125, 0.066420687864649622, -0.057988261829786683, 0.030467914093403506, -0.088942632863114157, -0.014873330866996408, -0.06903000288081293, -0.05977259337654181, -0.024750165724362155, 0.076980585184517628, -0.11219177639078851, -0.00026098838462658425, -0.10643324365636619, 0.046966125920151987, -0.10536876322983255, -0.073429349480272951, -0.017258600082246129, -0.0097549083090397049, 0.028937359707606723, 0.058320145229388498, -0.10852363274246603, 0.0093034019216029201, 0.0032394886759010109, -0.11758435763177846, -0.030716524173680759, -0.012968473875358794, -0.072432676585988245, -0.02951516712700545, -0.030306917069408162, -0.010562351852173165, 0.00059347532650239152, 0.045901836344348218, 0.009959243815588284, -0.14726958069576429, 0.10665865350902941, -0.058288735861848573, -0.081332140906973854, -0.10522554630509694, -0.092706118193706472, -0.080448776925478707, -0.054722262004125631, 0.035003945293075787, 0.018233850654384959, -0.064682184713342458, 0.082552298558358356, 0.043969243290146544, 0.10735340934065053, 0.17551198745608881, 0.028146227406542355, -0.093032253049539659, -0.080991883086283231, -0.17304587761466295, -0.08397564913817572, -0.082186994451058898, 0.026086345132597978, -0.024523009144156466, 0.061837165471639872, -0.0031532579414115108, 0.0138867394019625, 0.22791162384791516, 0.17839063189638452, 0.16802924166508618, -0.02242358838747683, -0.070478648225526089, 0.075631000143473515, -0.13496798278125824, 0.061914443579036908, -0.013965499326545715, -0.040287173996164619, 0.0049442314234498172, -0.14234850191040116, 0.13422797072590037, 0.0044641492895416265, 0.17884346888192523, 0.033152160970333064, -0.084186014593884625, 0.022681908276631663, 0.069503167546493966, -0.10838151310589246, 0.025867188572352328, 0.062726350687918833, 0.051958392475047875, -0.15684747676320326, 0.13621424644871002, -0.077635757069622086, 0.027664309706770987, 0.099426252087916597, -0.024066482717244451, 0.018369096774303477, 0.11490785777152708, 0.017998296859149974, -0.024584275074312559, -0.072970928250824352, 0.070923228278133063, -0.084294490518602633, 0.14548924260173943, -0.081488578294887343, -0.046883067570820579, 0.065571023838321571, 0.082578114864735361, -0.036743335018587939, 0.054909713394909312, -0.024501097951853828, 0.19599838240616638, -0.047414397145733048, 0.0027762441038286303, 0.030268059356193769, 0.14718296789670926, 0.043111866833212033, -0.045242662159025837, -0.056666701926203059, 0.011024035468495882, -0.037469678178404013, 0.034539200168746578, -0.093469946147855573, -0.030232213433933387, 0.092526075272763977, 0.0033730560801506935, -0.074954887684573437, -0.056309553485681563, -0.12734695058277604],\n          [-0.074008406292552564, 0.059418218830081374, -0.16185533770248933, -0.095113775751815649, -0.054156530748324355, -0.09524659355343601, -0.027700374104369613, 0.13095967694644639, -0.082898147730574467, 0.043236330248349053, -0.073265765844677394, -0.010406688952704322, -0.17908099782642803, 0.11214349559047893, 0.011254398841125272, -0.07213174644946746, 0.011242646811143842, -0.12960939072644068, 0.01738837182774236, 0.052081850613964469, -0.016141307058450453, -0.0031876314325390964, 0.0604762980771201, 0.12062873361043944, -0.11552428611131449, 0.053112984787895695, -0.11175835774514202, -0.085344942760827144, -0.10341778301339327, -0.077512128518261517, 0.022696330581442322, -0.061166227958907707, -0.02680129950339076, -0.013512513628398493, 0.072871648911960699, 0.21355653955799342, -0.06105176975794184, 0.23221322645596984, -0.006049593164551087, -0.11934471718699403, -0.048734896641230797, -0.0037696701788163915, 0.0015806523808981135, -0.059016242821538792, 0.1691633875802479, -0.10636213299345615, 0.013867670987275399, 0.13029048317364064, 0.17375284613983333, 0.36096974973474127, 0.072557346833875574, -0.050622427061095779, -0.061396795580056514, 0.012028170399798491, -0.059738878843501417, -0.15920195495822725, 0.073525564169076851, 0.01066435580390359, -0.12349031715778719, -0.20862800209268534, -0.24386438086421988, 0.22269546157582101, 0.046982082135201012, -0.10969479870317536, 0.046793880429372367, -0.067828443916568087, 0.15296218972876791, -0.074195141988218055, 0.042910924531490646, -0.0147654055974203, 0.37959648332332935, 0.41757874715387594, 0.021898097003166472, -0.11237855306165129, -0.043153207830735951, -0.0018388342246165729, -0.065448802775457518, -0.010369032880327395, 0.043814853347705546, -0.0090643466570875519, 0.10571938625442225, -0.044969836340908724, -0.060017098930422549, -0.12351913057017941, 0.072888367558094025, -0.073015583002772777, 0.024488919824195432, -0.046994862580658568, 0.0061025804809166778, 0.032988941004012923, -0.05586087652942285, 0.033548851659122456, -0.10250477896692914, -0.085369660888008486, -0.091447097764426569, -0.071752973305231893, 0.0060015981451380443, 0.0048780288701872482, 0.091777742044399785, -0.063911243276619789, -0.10839434894029129, 0.14049866674905956, -0.16291269836434877, 0.049227460809667313, -0.053956655700712897, -0.025757221007218452, -0.059498509327258808, 0.029021784211283319, 0.037106210375188055, -0.043182242815119842, 0.0044685625872698392, 0.037890914860866522, -0.12462488658167202, -0.015315868709315207, -0.099421564094155007, -0.057912073130086672, -0.070463075067971545, -0.069349456777686752, 0.036224904169083069, -0.0096669174590530253, 0.0072113489889556875],\n          [0.00054000377819494582, 0.019228224673755647, -0.0041211476935454003, 0.010351942594428495, 0.0060644135516636222, 0.030583158266134808, 0.018242859270646162, -0.011484714916580121, -0.012453527735116602, -0.013982904116162584, -0.073494945256138519, 0.00061003908987491105, -0.035456925731861377, 0.0091981481987587037, -0.0079306422406691113, -0.031346516850493486, 0.056360544230430694, 0.022269255182565641, 0.02097553828852184, 0.021592667245958069, 0.022292447571617122, -0.036376354666677192, -0.004893428694286564, 0.018803611912471426, 0.021642092128736024, 0.022979352605310751, 0.057278991872406218, -0.062846882957114797, 0.0080146423492344007, 0.001741066749290629, 0.023316260549374829, -0.0019692454830054218, -0.0097663509133344983, 0.026552602939686681, 0.019311702846604575, -0.040478949128969023, 0.042963456569752451, -0.0055572047143666106, 0.040028541338850074, 0.039092247288585756, -0.014760769957556222, 0.039287083950504967, -0.028685719461485404, -0.013542811096967075, 0.042796941924027478, 0.0093264852956811625, 0.071104573120828796, -0.012855025544723991, 0.0048120974901788259, -0.019345118328359015, -0.0068647366946253605, 0.060026504369553271, -0.051710217047649373, -0.0088037835413147456, 0.0085936562322940259, 0.011216837793947578, 0.0043659955128466099, -0.052365485216350149, 0.018585701567693985, -0.043301048775860274, 0.017257179405366647, 0.033163069502218985, -0.063371870872828223, 0.022236310454164437, -0.010282665078434856, -0.029097248102949336, -0.072928557864272242, -0.0065263865825004024, 0.021707948805501379, -0.012869723919694227, -0.036092446130363755, 0.049588404031142494, 0.0037685978390409776, -0.0354492999119638, -0.0174997172625617, 0.0017064827547835885, 0.027702634451048022, 0.010552265815024279, -0.015110098334354602, 0.010755306598934415, -0.042384518316625354, 0.055155751834777625, -0.046341678141637581, -0.025334054233096058, -0.031804391467191218, 0.0074468314164195526, 0.014822972242049056, -0.04150177712089112, 0.055659760596936877, -0.015163449841913621, -0.033479207943135934, -0.038074300748303883, 0.018025384518394062, -0.042187806169951603, -0.068458630665157463, 0.03254289254551393, -0.043000247054897869, -0.017041867015704329, 0.031343919493743794, -0.079988199511458247, 0.016715851151657413, 0.032905055715790735, 0.070750458478696737, -0.02652191057953172, 0.0097948892817532884, -0.008359095601141911, -0.022132176548511583, -0.010266695795141155, 0.027387007127093858, -0.019456613274216179, 0.047471229897352391, 0.0064639452494934177, -0.036820611388149953, -0.014924071652059345, -0.048381451190304049, -0.035401457202280787, -0.0011683979389548946, -0.054012963892719104, 0.079190962502102447, -0.046040607646046963, 0.010260604991224952],\n          [-0.0001569077120156144, -0.00010972965005487043, 8.6821335664521299e-05, 0.00028959182937081038, 0.00013336820101180619, -0.00020448462499146614, 0.0004636545850201651, -0.0001952429751545387, 0.00033248408073506541, 0.00026250426925845949, -9.9022792602876386e-05, 0.00023043331960011237, 0.00033250215597799282, 0.00015431271343276792, -0.00017517735947227692, 0.00017580915476165387, -2.7857926473168204e-05, 0.00010573427076637082, -0.00016548039725969299, -0.00010017127208199195, -9.3138582793007851e-05, 7.6297189543994559e-05, 8.4224838605342217e-05, -9.3286798510637536e-05, -0.00028719968349017605, 0.00021350040915488894, -0.0003150556862943979, 0.00045188552513562852, -0.0005495709535034074, 0.00054579146755674018, 4.2926655116619361e-05, 0.00052308254239302049, -0.00068598038313558152, 0.00018154537313607583, -0.00019968317282380993, 0.00023651893221749917, 8.5020480110765267e-06, 0.0004909646746514007, -0.00041196038371525689, 0.00037236304958472577, -0.00014792807116663712, -0.00020787769585125376, -0.00031631921796769491, 0.0003509716053853168, -0.00053024827751745746, 0.00019205484079722751, -0.00035924357541414903, -0.00014479534658806692, -8.220562624946387e-05, -0.00026762194550129792, -0.00032865721811569347, -0.00013872646247882828, 0.00019337977765215147, -2.8930782715007319e-05, -0.00021530682683792296, 0.00050075583422803938, 1.2869664429884797e-05, 0.0002877888733890388, 2.1516688855943711e-05, -0.0003850355075187134, 0.00026923989061119341, 0.00020120455885001831, 7.1269908071457111e-05, 0.00025510516920475984, -0.0005497530710414731, 7.0801300207756768e-05, -0.00031443494990798099, 7.2727814539388924e-05, -6.7647317771771243e-05, -0.000105969532620806, 0.0002042525509826365, -2.2660407178250186e-05, -0.00046405924788414654, 0.00029312274831753277, -0.00057910649202903841, 0.00046348258977586126, -0.00018921419605052309, -6.8310692835912151e-05, -0.00011583420771371644, 0.00024261083736967087, -0.00013788873457702688, 0.0004658190984066779, -0.00037781566966009483, 0.00087162452307387728, -0.0006364250227483409, 0.00019146350082690361, -0.00030213932128696913, 0.0001548061422106152, 0.000359478662719067, 0.00034064528670862265, -0.00013396590679365383, 0.0006282001548930799, -0.00026281686425658202, 0.00062900456753615941, -0.00083565053741081752, 0.00055501251620770908, -0.00039221531463511788, 3.0416452512397468e-05, -0.00021895611944867249, -0.00025050813688963502, 7.579225944163992e-05, 0.00032480822488636235, -0.00028410221135238486, 5.0197060845594277e-05, -7.6049710996853315e-05, 0.00029722546826794691, -0.00059771003008261131, 4.8137549730292717e-05, -0.0001438309620388073, 0.00046738458634185825, -0.00043149354775268156, -2.2304724232195816e-05, -0.00053506357248750067, -0.00011828488032837592, -0.00021777877913900512, -0.00010840223620667971, -0.0008066009231476462, 0.00028972319720168074, -0.00013991311235211912, 0.00043597630491348099, -0.00043607463640516625],\n          [0.00079929115048048283, -3.0120444183670547e-05, -9.6683286293641757e-07, 0.00086494515998912502, 0.00050305294849800619, -3.4861905346544875e-05, 0.00042196435679157235, 0.00065681743351262561, 0.00012927605196788594, -0.00026826496297133184, 0.00070485728728817559, -0.00045054232451688381, 0.00062841852757652972, 0.00021810609410295723, -0.00022766549944826936, -0.00057437187197429546, 0.00016670399815210679, -0.00045504871054576762, -0.00051896406488366464, 0.00016278501839328552, 0.00078467988668153021, -0.00020117424541528373, 0.0008133233405210466, -0.00054661334706784803, -4.6455199192108054e-05, 0.00039251101344009443, 0.00089045431724624202, 0.00044803263329346033, 0.00067252439816681275, 0.00034323953360750059, 2.970582797436061e-05, -0.00033407540980814887, 0.00020838216438882895, -0.0014686441499898312, 0.0013210643314603837, 0.00036229797084270932, -0.00042100922626168297, -0.0010662328062863852, -0.00047868856534150767, -0.0011025209542825376, -0.00011142308623937613, 0.0003605454081693979, 0.00080536848328376098, -0.0010504288820343197, 0.0012459778440163868, -0.0012889417769073701, -0.00010349556762601422, -0.00032598744524173912, 0.0008195978542099927, -0.00032869537508760371, 0.00078427904311249158, -0.00031027891242364769, -0.00013199686164484803, -0.0012037863711194877, 0.00056966626743207988, -0.0015831212285748082, 0.0012383789939280389, -0.00020329286471698974, 0.00054441517775214582, -0.00047971421799346964, 0.00036398024475242652, 3.0135996240618357e-06, 0.00034630267917200308, -0.00016208082819759925, 0.00076531009349528958, -0.0004374341893310929, 0.00035576070800035636, -0.00024010306236346007, 0.00021524875497277648, -0.00065504769214781017, 0.00036034608435831644, -0.00028137429763217675, -0.00014369965739139887, -0.00019791219870676433, -0.00050361569379568649, 0.00056144872177278649, -0.00023162087151370331, -0.0004190557849820635, -4.5824271728219651e-05, -7.5822332618488003e-05, 0.00080031407570023763, 0.00055839973489382397, 2.2265876928228429e-05, 0.00089772546330477848, -9.8580631232442206e-05, 0.0011729728289751398, -0.00052769578439227499, -0.00056096133489415972, 0.00010460229482414998, 0.00047497799203599991, 0.00073708806200396479, -5.6914197126341215e-05, -0.00031024215768372942, 0.00087524112410012483, -0.00044804418685771147, 0.00049555628484605416, -0.00070264579048571682, 0.00085455641871353544, 0.00012341905578699096, -0.00093546710283165697, 0.00037822251053991601, -0.00032902309441029502, 0.00056646914676724593, 0.00025216417640113158, -0.00037243077631573997, 0.00061576720559803309, -0.00048527538553305369, 0.00051397678370687996, -0.00076368821209107408, -0.0002717643717346516, -0.00036517822732572668, -0.0012782404754204373, -0.00037035199188238405, -0.0012045089669873877, -0.00051115856617512181, -0.00047596944593941704, -0.00072161260682115057, -0.00037669329780016733, -0.00075398515762274687, 0.00013432829456021169, -0.00059059014732752192],\n          [-0.00025150140763611817, 0.00020005435484797551, 0.00019417083739569404, -5.7923010958152443e-05, 0.00055863820768581925, -0.00029404960975239897, 0.00046418988043501249, 0.00016919725054860514, -0.0001365681365060609, 0.00014340737825123363, -2.7245579659461233e-05, -0.00017462744794458128, 0.0004320870347869557, -0.00024872373436234194, 0.00033850066080495095, -0.00042824500087672388, 0.00045274589383560021, -0.00033817558566411835, -0.00015836618254124374, 0.00037188063032157683, 4.0013223047928148e-05, 0.00029638131479669633, -1.1757971572848584e-06, -0.0001744667552400006, 0.0001268511029074151, -0.00025760998701211679, 0.00047735971540077606, -0.00015834145077744249, 0.00011916420387451162, 0.00015943376359087678, 9.3650022541307172e-05, 0.00013240084078796482, 2.5813088587590515e-05, 7.7538776799327379e-06, -0.00041105076291241384, 0.00045452204783612738, -4.040458358791927e-05, -0.00042518565093397536, 2.9496406138524887e-05, 0.00022369184176485946, -0.00022326384816004656, -5.9696847652630737e-05, 9.5900199581322714e-05, -0.00021800428194160856, -6.6285576454976763e-05, 0.0006383470103711519, -0.00035775911240443345, -0.00043585234193858034, 0.00055520311419225742, -0.00046867848529014242, -0.00036668240995048861, 0.00044104545236546815, -0.00016743491057120887, -0.00015286382598361098, -0.00042267651180960325, 0.00017696200882469978, -0.00087954556419632575, 0.00041465822593126441, 0.00030450324586917162, 6.846537634285204e-06, 0.00021324027853833406, 5.5444233738137332e-05, -0.00045538727717156589, 0.00036257374232944806, 5.8126129137410108e-05, 0.00048701098444248843, -0.0010394561974651842, 0.0011088516063339896, -0.00047446710387000549, -0.00021639705414199396, -0.00030264565453152321, -0.00031876669624713905, 0.00018256793655110101, 0.00022085306808071166, -0.00045708478654703222, -0.00016764562120866666, -0.00038680711837089563, 0.00023465496957380009, -0.00089058592344853351, 2.7029323083889965e-05, -0.00019392260432311614, 0.00043159570786490569, 0.0001466476034520035, 0.00020276998330380014, -0.00016623775962797588, 3.3772960168344411e-05, -6.9000858996467757e-06, 0.0003173325151770612, 0.00013183707157224346, -0.00026275451596236401, 0.00030496779772497273, -0.00022988038412455076, -0.00034410662962488809, 0.00033974096399670022, -9.4370346309838749e-05, 0.00015929656150039573, 0.0002208318439938517, 0.00023298688340578377, 0.00026684718412763758, -0.00042236166617067028, 0.0010171866741304654, -0.00066560749024659172, 0.00023102910516509278, -5.1105334736391728e-05, -0.00025247439169374941, 0.00027604436336503557, -0.00017760551435710054, -0.00010325189793795159, 8.8214957933602754e-05, -0.00022473324648105992, -9.1082737484730111e-05, -0.00032298641944957397, 0.00049768435071036133, 8.618913329085944e-05, -0.00027278781263277881, -0.00012650947795273654, -0.00052227277756379986, -5.2140779588955022e-05, -0.00031611240635322224, 0.00017884485805307976, -0.00037941318770559661],\n          [-0.17866885726802303, -0.01004627890548361, -0.042589675487805567, -0.065934664074428745, 0.052273011858990394, 0.03312160535571991, 0.027950496866449639, 0.034597017771390251, 0.040653401856438627, -0.006028884452193628, 0.012100171644170557, -0.005823115292745859, -0.07582851399159081, 0.11466944513385099, 0.020113986866166972, 0.068302399730251775, 0.053667514905722302, -0.0019151045898751218, 0.0032161515425703988, -0.02286773204984241, -0.036064260364357094, 0.0030444356366628143, 0.0050268251131806128, -0.016159035960289652, 0.01343428575788129, 0.046278393980945166, -0.019863576518606291, 0.033081554152618362, -0.011511204742527398, -0.02336066267834247, 0.048030531271691712, 0.072162863127648066, -0.034706965262833941, 0.015742792044845896, -0.04365784041015932, 0.052989886160218033, -0.00057782844346462858, 0.053685241409785159, 0.056409616043422858, 0.031927074543435394, 0.076208252276906155, 0.035084748498761961, 0.016016932367084777, 0.097829252626441224, -0.010932961737962918, -0.057604724295680525, -0.046117493596561435, 0.11586835368372229, 0.016630360691506946, -0.072380612241233516, -0.02721078987250658, 0.10400189079503686, -0.049863708111842611, 0.013157090965211962, 0.068758075593380402, -0.086093382914331593, 0.10550940203644331, -0.051925636293921058, -0.08457695827736228, -0.023868518013074047, 0.11534819907311766, -0.029927793894114596, -0.098805321065736557, 0.08174885118680475, -0.1060908740185344, 0.031317095721549532, -0.028082259348080146, 0.079441855776121006, -0.093214174572659181, -0.069858116578834631, 0.1070256004886421, -0.071547923438654293, 0.064465129204212171, -0.099164651058250175, -0.013469569177392421, 0.034352271480565931, -0.10594412155782011, -0.03578650235512626, -0.011063899652176858, 0.01837774789897521, -0.039253607512632752, -0.14016878911229191, -0.03721312667737868, 0.011543278654149135, 0.0046564754198335154, -0.076081218695912403, 0.021616522856597421, 0.0056963747245355328, -0.054225456412860529, 0.039976482103285263, -0.014191880258275905, -0.056038754162233653, -0.085955467898357049, 0.022657092076657198, -0.0022047701913627767, 0.0023519724649996229, -0.0086408360440515565, -0.064880638505246765, -0.0055523419967167011, 0.079595981567899043, -0.011189689119441921, 0.019694004932030575, -0.0090801628377648672, 0.0030332790803103706, -0.11172688994501827, -0.037768645256787345, 0.14407928948205997, 0.0085417960067592294, 0.051063118511239784, -0.013809133479955219, -0.018804152269311619, -0.07472568370647939, 0.06221295634359636, -0.031173033698703514, 0.023265775517157146, -0.013229707925293089, -0.088087391935272305, -0.16850726894231444, 0.014989271963221966, -0.045790255154309852, 0.038301569939229688],\n          [-0.12471960559298051, 0.016331688001818473, 0.010132274081235342, 0.0072416673905218165, -0.059929049564220245, 0.014888737012368864, -0.052418796845186043, 0.022430681494682764, -0.043701832681609432, 0.021372011063678874, -0.066551867105933471, -0.076751551449093222, 0.031454085069049939, 0.00050698620363882289, 0.048208537020902352, -0.043606360639726817, -0.026401547797884867, 0.11494953428588206, -0.00084487993298972171, 0.041763229275026299, 0.01662088156180045, 0.095743595922567412, 0.016932325856871336, -0.031217493839729042, 0.021554336392332216, -0.061228351827234268, 0.081696206527506948, -0.055099500179900118, -0.095301583024627504, -0.031351972335037837, -0.035124606327755464, -0.028837124821496515, -0.047884715408835349, 0.060702425126256093, 0.080684564761646177, -0.039627899139767567, 0.064709803419545964, 0.013113165039676609, 0.16301141390375001, 0.12824898952567468, 0.074636476814154057, -0.016897285990514471, 0.010567173254586882, 0.0033568218888065868, -0.041216089414404501, 0.083780621282672774, 0.10218950832276399, -0.048555074093876056, 0.095493142695549343, -0.12104629625143107, -0.1493368753465891, -0.038946784830535597, 0.053670879181312289, 0.10886118501283593, 0.0623983957252945, -0.064004861565808618, -0.0011642109155079912, -0.017989480311898197, 0.10376420696530403, -0.021666202371688252, 0.20636172793169102, 0.067515676746473546, 0.022594628822994373, -0.10875049523175929, -0.15367838830228961, -0.10156435275826153, -0.056219286606131964, 0.0048935577385261636, 0.080508839991384598, -0.048986994532721484, -0.054673573535446829, 0.034417241571081683, 0.13788724353627765, 0.17933790589816131, 0.22694206874489239, 0.16714737286853379, 0.28887901477932182, -0.0045505039085086373, 0.12853746432697205, -0.14688209250590184, 0.039803550389166095, 0.001161697593967297, -0.19133864743440931, -0.11485627148408395, -0.040556116529253762, -0.07701433461570141, -0.064919136067342759, -0.17402303487112258, -0.069451907977663707, -0.17069839255636562, 0.097553381246305429, -0.012417013824468703, 0.008779997988951951, 0.033808465522018064, -0.040323952860908119, -0.12350740477425591, -0.071103775036993527, -0.032842030960087386, -0.025256511130247631, -0.13557637802150552, 0.13026525943758985, -0.098978661007624966, 0.016539720299720638, -0.055393829003122938, -0.017477845213565581, 0.082533142084316155, -0.0052692792534465727, 0.023714959705274333, -0.025127637792893034, -0.054493603758074591, -0.0065251479532096798, -0.19551796620580655, 0.00051533084431857473, -0.12469764291808262, -0.010402114917957516, -0.040854371970225421, -0.050091277739518963, 0.0061714297831496267, -0.022234206683905616, 0.02500462259196987, 0.053771861975124485],\n          [-0.06953146063004409, -0.027855167396772469, 0.018198128969876097, 0.015264256008671422, -0.021354522403683483, -0.060614589679217915, 0.0074260205660308318, 0.044909342578395892, -0.022290100457800159, -0.045038114215761482, -0.055530719421861996, 0.0902442269939355, -0.0038080752412905372, 0.0018190374684997207, -0.023994658931284905, 0.022637227704013697, 0.034385575661622605, -0.0041323426627789817, -0.015239537988315635, 0.059722981968446186, 0.0035446565552159082, 0.10857055311904133, 0.015827587897896331, 0.0089878658118320159, 0.021416627127059842, -0.026000364715464741, -0.072053616087858346, 0.0067502383554667415, -0.043797404208141606, -0.086222116691012249, 0.0012469216786467549, 0.0139677771449414, -0.018800069260904509, 0.091106469337856627, 0.071482857933576227, 0.053141334521401601, 0.0091480821350588895, 0.0032188812978254239, 0.10531967232382244, 0.013069231097604272, 0.11321624512420622, 0.024085428042357526, 0.10571237447906545, 0.097249430799325298, -0.040356773391022248, -0.052072201970584105, 0.0094838487447085687, 0.023224654347251975, 0.048982273381055874, -0.077047377168934061, -0.016369059725570845, -0.0483990050185562, -0.017518918630372055, -0.048725264078332518, -0.090695565054201857, 0.14584898982636468, 0.020202497107516055, 0.052473273376908665, -0.0059210182550390594, 0.0022813027410172881, 0.011431314884242511, 0.098601714425802095, 0.035390606662766999, 0.11802445684529828, 0.014488333933066366, 0.14985625484032264, -0.083365081182869311, 0.02604166398390495, 0.057536223475310372, 0.10289686959448127, 0.13376253308792016, 0.098599279015396224, 0.11296262694625853, 0.066811519947584497, -0.030392332219791651, 0.037677148170599001, -0.080465409013379868, -0.013433044614551137, -0.079050272382343106, -0.086927785491348469, -0.13723308506024745, -0.16180861780403702, -0.1559436708245299, -0.15633705073107523, -0.15765816424278123, -0.019054153693685204, -0.066428041346772757, -0.040315394300378581, -0.15529720969926392, 0.12101901933989367, 0.0073739433496777876, -0.039042313006326899, 0.044864452505471414, -0.031074257750175131, -0.037869139729967256, 0.02693566917864209, -0.025703296599595565, 0.030655452436583908, -0.0083294916392306975, 0.030463719734315588, -0.016822379770469454, 0.010025642600714306, 0.023941947007600384, 0.0037369192163097253, -0.0062061382772640519, 0.040478298614511805, 0.015199733590990229, 0.035362093609806654, 0.035113913555059863, -0.10029441782907185, -0.10610472749034416, -0.052099942445672578, -0.0037985170316418085, 0.029290155294759784, 0.020763196785263893, 0.037574297260543371, 0.050568193891647441, 0.0025948365095440178, -0.034033364904604929, -0.031897318483976964, -0.072552877764797324],\n          [-0.074150761326980147, -0.00066986401946685092, -0.038515158134214342, -0.023181050413543618, -0.032101285996002565, -0.016813865511960804, -0.043281469336209986, -0.034096544273423686, 0.01015713603552236, 0.030027201044358451, -0.13569617378270427, 0.05532035184255174, 0.041422683304832522, 0.054237693471711729, 0.075158352517811028, -0.0045611635231176673, 0.0049336835448356223, -0.027804205731258878, 0.037859313146976444, -0.010636484133250523, 0.043039074634147079, -0.031109281470661186, -0.026842848775607248, -0.03367029747858763, 0.0053081926498119852, -0.039719826466191911, -0.011433401479806288, 0.0018726799542050226, -0.030624975101159628, -0.0029380651582422979, -0.0095989319691330288, -0.013587888941593039, -0.0090228406954841085, 0.013981082758308103, -0.027132225331696645, -0.066722260341411405, 0.029996307562002861, 0.10810874336228038, 0.073932536945285954, 0.094596891288321466, 0.021326989785555719, 0.0051895327288904308, 0.090625514956272496, -0.0014967572066416635, 0.095691596028677217, 0.071032806785292307, 0.093121494030091692, 0.086410233422467064, -0.082911827913294739, -0.063317188738201691, 0.058040828225321459, 0.094123280130627499, 0.048289462433899338, 0.0065600637976757845, -0.017978915242308827, -0.10529465762835961, -0.099505376903884918, -0.11641428549809074, -0.16336914552196619, -0.03066309873006054, 0.037327302518737379, 0.021715752289796372, -0.036984427993582598, 0.10584212495392706, -0.038900837284283257, 0.042388662040559938, 0.15761090374525039, 0.14948261048000774, 0.15123269083375968, 0.26082790242726567, 0.24549601207125132, 0.20845042919094864, 0.014092314529055919, -0.081544305437015088, -0.12046457900197742, 0.19946559288633667, -0.12279301434870472, 0.043147465336577269, -0.0039359433149267903, 0.041944507737883142, -0.14662824409559153, -0.16841554816441323, -0.21746364722425923, -0.14593598626028459, 0.12453643290997443, -0.018239200160202453, -0.09647557951641697, 0.096744958348161519, -0.16116049604787364, -0.10959035389321688, -0.18407080190584757, 0.028717350720618054, 0.017940145844063823, 0.067712609426401407, 0.070426899449170036, -0.11002871292121127, 0.093083619307167409, 0.015479935983498054, -0.15557089262678336, -0.014144367587187956, 0.032512137754861198, 0.05556774883075101, -0.017472918751953406, -0.029533628631708192, -0.038827731306693092, -0.03021232345401817, 0.045497082764698535, -0.15437986410128418, 0.13419753386333874, -0.20134066892161695, 0.062249155617802823, 0.024284286780838271, -0.036965190357203068, 0.004665449800701868, 0.019888261193014966, -0.083467980409420606, -0.016566558945081397, -0.083160175930132627, 0.0045192184141086209, -0.15565975294086548, -0.091842377438527273],\n          [-0.066489372545755529, -0.047718799252733826, -0.09410351655788475, -0.013599740258147358, -0.045530705171441511, -0.085061538345857085, -0.063093532506485611, -0.053820778098933868, -0.1222176787662156, 0.047517892917907548, -0.10543817119017407, -0.12135417994296471, 0.020628638474339593, 0.038231355833956926, -0.043392365131814319, 0.0044224749450447378, -0.038085077795412883, -0.079830174085868372, -0.028985978187303432, -0.065505748977689585, -0.088402519021417422, 0.0075685626418508772, 0.014599611957773671, -0.0022052017437265842, 0.018238800652908803, 0.066199495089427851, 0.014132567520511584, -0.018584781288268692, 0.0097275167736109152, -0.013372741092406291, -0.13951730470879722, -0.099454439128528874, 0.0024536802212185172, 0.023325717552923071, 0.052273179874949491, -0.0078433789568586876, -0.019449100540297075, -0.03793640930232544, 0.006026659571149097, 0.040309888608414196, 0.06132376182771021, 0.12961234902069763, -0.05246356331115444, -0.092316625226469162, 0.12501372859645493, -0.023511024540922139, 0.068699855508214253, 0.081178430452994624, 0.081636331620792119, 0.13284552600960509, 0.11443480169918706, 0.031137356793659591, 0.03957361525706285, 0.064206693867907672, -0.026585623441445331, -0.069602244432452998, -0.006882701260322803, -0.086642203201899415, -0.12201442995127351, -0.087602601453127441, -0.097081289635905094, -0.14353417247406297, -0.032404092368745641, 0.016664803245589305, -0.028877650787150662, 0.046660756524674038, 0.1676934927534405, 0.081856698021962743, 0.1329811871153378, 0.15796978913910928, 0.15420647629486711, 0.23507941566445101, 0.10845077567152385, -0.02663613626038222, 0.10225924257045012, 0.074815640105395723, -0.067484345697152587, 0.014558971240431304, -0.031796943969915691, -0.060628238131727054, -0.091575240277000952, -0.021836966217199869, -0.1828633961798013, 0.094501673222211161, 0.013464938214634688, 0.017062888577847678, 0.047282001792194439, 0.10222149429615252, 0.0032626808542848551, 0.014576952315965966, 0.053700266574035892, 0.04846835624654347, 0.0033060862248684986, 0.10214575008785104, -0.077242394031282607, 0.018934507344396237, 0.00098413451682097947, 0.047211817912021947, -0.042523626918625143, -0.059478892430034694, -0.043645446723720886, 0.0072259828467460575, -0.045364397904695007, 0.0015257865026378006, 0.033942020440189763, -0.062868543989156617, -0.011162136740504053, -0.026181503928468051, 0.11832542908426394, -0.11894486304453102, 0.0030266795551997794, -0.019806603799353117, -0.020184767444436195, -0.0019914632003974475, -0.028348567852824622, -0.051936208080729802, -0.114547660653914, 0.016934758716036884, -0.037824591697152236, -0.01375883701059563, -0.14176618903476443],\n          [-0.12379363868138007, -0.022793163596252192, -0.056572016200135848, -0.039201119991114218, -0.014505658462787643, -0.14164430469555672, -0.066772525835277804, -0.01689199875955201, 0.018395341706225341, -0.060257373814153137, -0.11708273412158036, -0.16991897990888952, 0.02268184312792898, -0.037431787558444535, 0.0278362850257034, -0.10391555593395135, -0.024895792104006661, -0.10240649559419762, 0.027892065133358145, 0.037030240290622553, 0.025269076865704919, -0.18054736103209962, -0.13783839666730963, 0.03215416365047865, 0.10446321758795965, 0.042116319344015371, 0.0035951247503783063, 0.065346577329699312, 0.022452948281901614, -0.0013754778263451381, -0.030524202281055096, 0.030663561315706717, -0.09877455975225044, 0.21124607085784919, 0.031922562444243588, -0.034705389173491433, 0.036621988513888717, -0.010853119077650658, -0.0073890345339706932, 0.0056782910255717134, 0.029566782664102689, 0.096433520675437784, 0.029157767155665329, 0.29856892064118878, -0.07919582633844692, 0.00025703866042990631, 0.030975751575185936, -0.077561027711158165, 0.10470636569751657, 0.1428460407644222, 0.099401781103168885, -0.040836585779750967, -0.11174053722087644, -0.067308311411080401, -0.18341503352838884, 0.13979526699252226, -0.041934973700445265, -0.092866471596007444, 0.019653227675469925, -0.090390148741556695, -0.20734375167567454, -0.072877904472334984, 0.0027432574380281405, 0.0061245885209975925, 0.094598126228364096, 0.15505695773274958, 0.041295097014746554, 0.006098921880011085, 0.20246902024512597, 0.18772782665817625, 0.14967157503073222, 0.29059802382753935, 0.18823387968962019, 0.15999395370095998, 0.11915607104783087, 0.056017723784593507, -0.02792887117414139, 0.056676427194019247, 0.014381577347003349, -0.043592335358605627, -0.10690022762213068, -0.06224823853094813, -0.17877352623373868, -0.092288169841172746, -0.18022508861455536, -0.061398773420600558, 0.0666828177706692, 0.095796826575196115, -0.075610336916687143, 0.033484310787615143, 0.0090710017296596057, 0.0023841350072704715, 0.012849690649430291, 0.0037371676082230965, 0.056507739912754651, 0.071820826637994356, 0.074186721529350602, -0.027905258130710861, -0.084135488182671275, 0.10542017164154836, 0.028027285290237042, 0.065445007475626482, 0.064161641086581678, 0.03294077475246366, 0.0054020657546699907, 0.035715241209970591, 0.0077120039679083111, -0.035145762312081205, 0.095730503021840191, 0.068293341444558953, -0.1743073123711078, -0.053416372888697425, -0.043073098090359502, -0.075042084240128315, -0.0026001415644313353, -0.026744723242628617, -0.014014546902059697, -0.037147009442388884, -0.029554069220702237, -0.052552735398048014, -0.20455065610576798],\n          [-0.080336718914324784, 0.031542907328002801, -0.080333284552386419, -0.16579677604599055, -0.012897402202476056, -0.10178589629685617, -0.017890795871391321, -0.047932174101883621, -0.069572714289158219, -0.013085371055274415, -0.06403048933442046, -0.04738918650528029, -0.048253300258942214, 0.010624097533814846, -0.088303853599706453, -0.024800418220789627, -0.017016233501825004, -0.0731122923145789, 0.01795798282892851, 0.020031779934763197, 0.026270539591568495, -0.10026542176987073, -0.055354197675606544, -0.019202819676109054, -0.17886561336922624, -0.047929449603121586, -0.015476611158838961, -0.036580931341111331, -0.0013977731542055873, -0.024379638918464477, -0.013239317850851168, -0.016219240360668748, 0.033455910961528168, 0.031281534097803848, -0.11781030984741167, 0.08675961993407609, 0.096838260201831047, 0.0075779597881384594, 0.04020793008597133, 0.039796641743254979, -0.007964327106749873, 0.057675226481024938, 0.065973169052705491, 0.076368677904105231, -0.094338220047695015, 0.027581810662796059, 0.17673036090517169, 0.0080281795881781692, 0.079733536301333036, 0.14711146045229179, 0.066918272520925415, 0.050334009299972608, 0.001155762195899003, 0.013615235385982936, 0.0030149122423125882, -0.0015609840824338042, 0.13349258506848927, -0.080526523771321704, 0.050306757732385049, -0.13744070442042641, -0.073796305193363679, -0.031880400975331472, -0.057867003215660712, -0.065217491770658081, -0.066794148181761118, -0.088250637948153923, 0.0096844572434620149, -0.042763801342421685, 0.094637934686230163, -0.066201626509630768, 0.13555077154373779, 0.15162691406173393, 0.11508260905995207, 0.091265965106029301, 0.14083962832741773, 0.12798665154188912, 0.2063621060271425, 0.028581014482874013, 0.14481738942061018, -0.064493408628708213, 0.14635053020889283, -0.03932501773954096, -0.049277809721883913, -0.080228288656955471, 0.016307833788669575, -0.064651428896592297, -0.0779270812226531, -0.029574158180475041, -0.024416232437453507, -0.13305347995208761, 0.13699379135763934, -0.022414216362762814, -0.005868709852490793, 0.0049991943700797639, 0.070540277709872645, -0.0003799065544888118, -0.011858514238347152, 0.094750691888543861, 0.032188664060007421, -0.084874702797453586, 0.14236331721498632, -0.035524545957734237, -0.025841070343849228, -0.0789528097144718, 0.048317846092030999, -0.082026719163858675, 0.043364294508417431, 0.0027045844775661172, -0.027920654078814632, -0.071950926204345095, -0.099679715705843941, -0.1207171044051677, 0.027685856470463906, -0.065396577120716684, 0.041932056613189474, -0.063470441933357852, 0.015317705347783588, -0.088954618003619201, -0.0024258796088682186, -0.055981681173908476, 0.02502279163090345],\n          [-0.16063469325056712, -0.05067950894114695, -0.017602698377438247, -0.0024719881205989246, 0.025626936786392211, 0.0064474558094759424, 0.040905232267662323, -0.019412107970519368, 0.010907705003810574, -0.05700007695501437, -0.16989061568410888, -0.047847975558597475, 0.045770960450897138, 0.036605131005038968, -0.034700480386556126, -0.038814165043767439, 0.059925472084798384, -0.045041592097425781, 0.0044791344272125319, 0.010085652451881422, 0.017232862062283152, -0.014699311623237801, -0.031158529886819011, 0.054785786247363535, -0.045018671355357719, 0.027938316028020466, -0.050947638456247675, -0.058027574321254612, -0.018142649252876362, -0.073467281992698821, 0.029761358083885719, 0.020105401337809463, -0.03083009871677686, 0.0089384529359374659, 0.0094917883425194721, 0.031257493638173192, -0.074324621899297436, 0.047502293228496903, -0.087202881668554666, 0.019497480457585127, 0.018801723895544558, -0.020783146883739074, 0.037407226253197187, 0.01202907895240941, -0.085640174497543325, -0.01250123023712826, -0.027083881602897025, 0.012926155302517221, -0.020812027426987748, -0.14055809283539628, -0.11374506591076419, 0.017924843458942127, -0.028516516145943489, 0.04585868851160263, -0.13117828388950331, -0.17389092870879497, 0.053714156567446165, 0.032300075701893374, 0.057520195145752226, 0.05904654140586256, -0.11508635724303731, 0.043565776393052071, 0.059536594262724729, 0.076599133764207433, 0.014207229570090983, -0.1199427514262921, 0.0034830414572159379, 0.08308252095344841, 0.068672949782330364, 0.06634459181806078, 0.084012567514670983, 0.10863093494536288, 0.036021688136296692, 0.12380137951173706, 0.043236576328048351, 0.059399643665654131, 0.042445309474632237, 0.12789338744678247, 0.014244324437140979, 0.067136246650945752, 0.086699105492600792, 0.059557262090246026, 0.01809855186232609, 0.010713420148594992, -0.00059579884010052542, 0.061343460083962291, -0.0001398559588360257, 0.22412677713663717, 0.088013675847793266, -0.058215067302030736, -0.0012260538656294895, 0.042305970671931085, 0.052067344797856172, 0.075414674705730864, 0.077471176915617654, 0.045711382613932913, 0.017695427073964477, -0.0030658636257887804, -0.02962365327526081, 0.12896765936351437, 0.042183866960819091, -0.039394998979108344, -0.041007428922027155, -0.13390483965174424, -0.042499818684505593, -0.05819462525466032, -0.09519971864692886, -0.049990903182070265, -0.035359428820787173, 0.15859976300873996, -0.11702120905543276, 0.022050407195940078, 0.048192823572219948, -0.0056565047319631634, 0.055321599542422356, 0.0039771126512435362, 0.0088791472452440304, 0.03097294566737252, 0.036136614851221327, 0.077636657455759733, -0.11747304066916951],\n          [0.0032106468813388467, 0.088885172720810104, 0.10096080668798724, 0.022292605842750123, -0.071525453247951051, 0.00574314306889687, 0.065381001294423258, 0.008264090951624635, -0.052297923633555253, 0.055063249156703478, 0.042135956165554989, -0.0027337283351114711, 0.061070962060578285, -0.10701158010008113, -0.055827956173158652, -0.065032694832464877, -0.011795338702579206, -0.16486859585693212, 0.021281059707202635, 0.011339055054131499, 0.015607579889776426, -0.085750449282884861, 0.0043087122389073168, -0.0028333671241141632, -0.075704651954975333, -0.095023634532319393, -0.024443325177031752, -0.0048742931725701613, 0.05373563149718516, -0.046164464204305776, -0.0933941298749114, -0.089491902135308304, -0.070094066124814669, -0.034764911995005567, -0.11036613659441624, -0.041699289757935284, 0.048555414105324039, 0.037316594330165868, -0.0091258495682343954, -0.02483773607684505, -0.10811625353969287, -0.011196019395676729, 0.062000571065406324, -0.030908870870323263, -0.20817374216641296, 0.02840804114908593, -0.03422871356001763, 0.015547093956459614, 0.042037769469384534, 0.14900049504903043, -0.077828081337516036, 0.33343667124234072, 0.36268347456674099, 0.18381088902743745, 0.18801989730141397, -0.026760107917241149, 0.0010510016353630809, 0.04098821271669377, 0.14354810186479433, 0.14720129753717756, -0.22198578529791352, 0.31511902115816237, -0.097933631284173289, -0.34108764393991897, -0.17922303207403625, -0.075037516162488077, -0.060600402883750376, -0.019190950400804669, 0.16686302854511445, -0.012989494224628011, -0.34656568745617206, 0.14668241885677219, -0.053557529052454082, -0.24973215975275748, 0.24117194525976043, 0.06744086845556567, 0.11113519003246129, -0.17424338350633975, 0.12201079994643065, -0.092746950927085375, -0.065790817932440571, 0.35855596322291078, 0.22608246117392661, -0.11160227633029404, 0.3057247528769656, -0.10906402198659501, -0.15714103185870401, 0.068395565832379809, -0.040921771078119888, 0.0013632455963754134, 0.10794141319894564, 0.11370966065944016, 0.05701046666820303, -0.082634473203882411, 0.046327777049956803, 0.056396935402095699, 0.020212301071998881, -0.029754364902733033, 0.054466892130944161, -0.014207485080892181, 0.09398894647188305, 0.044572073845120443, -0.073566232664765058, -0.15318361570533576, -0.061212185339614172, 0.026710531000834609, 0.036455363958898757, 0.13879792308934241, 0.23979908542525458, 0.11099690466514582, -0.12734356041026987, -0.070921107619058815, -0.084031488042458663, -0.052911204994505273, 0.0080270279483869375, -0.048337382618909748, -0.040315087393064393, -0.089109265448894498, -0.10259547678103018, -0.091800365225332997, -0.21140522933050648],\n          [-0.070541898294382954, 0.055085384725324385, 0.10152834971804957, 0.023622039667971106, 0.029955712367899665, -0.026059948581330213, 0.11064289610687274, 0.024489022629065639, 0.021970470387027496, 0.020456590772125735, -0.041116693610535521, -0.024812216615053395, 0.0095703813283907063, -0.048146399939075685, -0.0415428906870009, -0.0045487046086217439, -0.022900698211748033, -0.10095741160721779, -0.032652208533819588, 0.037091125467489772, 0.014636490326762966, -0.010920356400900416, -0.02620802388201364, -0.14214922225914331, -0.1328932262467217, -0.033250828448682102, 0.0054751584145303622, 0.091854391607495395, 0.036012195904709637, -0.080267047096344496, -0.02961991599551142, 0.026872737466068011, 0.024976155299922739, -0.10102174245681092, 0.10923707161980402, 0.070655061966962251, -0.10935696983924399, -0.32088041870161305, -0.20436936980030787, 0.050938666453356984, 0.046305961616782271, -0.052624691159288021, -0.10829047665507778, 0.090882846941261863, 0.19174066515666341, 0.12934192659574403, 0.11859841393368513, 0.26210791199518413, 0.43760372512053292, -0.073859947159134118, -0.076583679569516755, 0.10680813952910222, -0.089974391000751788, -0.061555396291372189, -0.092350841658524696, 0.024140264345503374, 0.029438378546550566, -0.01563817377224519, -0.149531624982499, -0.10876112523177132, 0.19097881484789375, -0.049896292556932682, -0.16239346086432074, 0.046709908191980121, -0.033452494674046207, 0.0046310617213296502, 0.0064216883730265698, -0.12476862042997607, -0.031313709978211708, 0.0042103020860465371, -0.025365848313462613, 0.063684281624447031, 0.13395358129694848, -0.065578135598012649, 0.057463929084066473, 0.17256882128548656, -0.11823900246670159, 0.060333559941145434, 0.0037599080210207157, -0.038200462163356909, 0.066276004488180856, 0.25634069005457549, -0.093935031031732064, 0.13649945906964844, 0.0034794918389711334, -0.072761719812314288, 0.029458016256965223, -0.015677874033259744, 0.19131561225163415, -0.12071257308516789, -0.049397234429007029, 0.077175842050914406, -0.030486255311673066, 0.049783169498945609, -0.057532752863027073, 0.14083206176111882, 0.17408755180270033, 0.009344634962950172, -0.12819205088510488, 0.097921797602201988, 0.1484657616745283, 0.21719783447349841, 0.044315601741240343, 0.11561949899769568, 0.079276552023405805, -0.12048788468641375, -0.04967266400627008, -0.032827416046744835, 0.0090015538375795498, -0.13278686515158378, -0.20143225012684127, -0.012865208501911994, -0.05226303626701382, -0.05920262987618654, -0.11792756657567573, -0.18198524247067943, -0.00074838377765898412, -0.13713941392620788, -0.061325425375407194, 0.019950339910709103, -0.062147365713498569],\n          [0.051024887449384534, -0.019223957182048931, -0.0091744618546339037, -0.022468174999506808, 0.021117503507854546, -0.017503811543560385, -0.22284744975320528, 0.022524903374325514, -0.0024244960757924712, -0.09669110978372604, -0.025360870037480849, 0.073434608083223593, 0.15108583605808631, 0.11522226443939282, 0.12970385672228196, -0.078929081412293864, 0.097198425724444398, 0.21130504158510516, -0.24960514180766633, -0.011817596006589312, 0.064527752619131462, -0.085347869009334901, 0.049274344563864814, -0.061577460717206725, 0.063000636986332417, -0.043023349305368858, 0.069051463619963616, -0.09609209741271528, -0.061694173137081795, 0.18034406030249844, -0.16664450863414379, -0.051093562238691319, 0.06917571184956009, -0.11903894138190432, -0.085789849163004972, -0.20469477506639042, -0.037005982899997764, 0.034798731541538161, 0.063283307686923376, 0.14789727159527061, -0.066932830661805331, 0.1370086179892735, 0.0071805490139787067, -0.062055289428567216, 0.22475761134030817, -0.07322221407641237, -0.080357922936194939, -0.11455643304613655, 0.20483233186130478, 0.10475578834704286, 0.10684387147188838, -0.10691746278338331, 0.018058380084354078, 0.12868991682224998, -0.071026767781369002, 0.044129913597283861, 0.12003274537827949, 0.14236952685647059, 0.2190537724998522, 0.069722814432948976, -0.08245383109483935, -0.10618366730381419, 0.079817401692356071, 0.17121755891446927, 0.11078325008253855, -0.15750058347569248, -0.026069272820390225, 0.17501467279210839, 0.19358075940702646, 0.15583357970340797, 0.1314463732378697, 0.10802544440564531, -0.015809166657440241, -0.066108299277505417, -0.14852678093276445, -0.054744536677585956, -0.065217128725905391, -0.026931855854101287, 0.017929035819714334, -0.025775341056924528, -0.12464418113700747, -0.13001928465651194, -0.23174171618582257, -0.066900407583412314, -0.03709918303218513, -0.030813190076789343, 0.11264856069224632, -0.035279582432038409, -0.06628848394994874, -0.094885511316959062, -0.13366242376792553, -0.077209892711532127, -0.094368973509414381, 0.053335878160273763, 0.041074067958430979, -0.044715009215503601, 0.14382963030480442, -0.054988125961259349, -0.0022013354694158885, 0.021968655062323525, 0.032943999375576301, -0.0067769203537865596, 0.055702627244551682, 0.051114355169129717, -0.0071487492413514087, -0.050493456857222105, 0.11605609625221396, -0.10773904713211513, -0.017706549245958297, -0.029669410521942108, -0.16640935186157127, -0.048751600204259019, -0.074769821455474811, -0.066227226009553525, -0.10651310165824517, -0.00092592029991533063, -0.0045899177380518182, -0.041812504602206868, -0.029841850511205213, 0.040029808070416978, -0.11834854906365051],\n          [-0.14161129968710029, -0.061296967431052014, 0.0081528021970500054, 0.095805261150028409, -0.1214127956380826, -0.15258322744582525, 0.14459270305794539, 0.10275339944853681, -0.076911198841414979, 0.010478075151826548, -0.064039029125021005, -0.084813043528063153, 0.025051235358785943, 0.087180794533482028, -0.20873218012341008, 0.0040298784271375204, 0.39082631888817743, -0.018288190749202606, -0.19371161443949322, 0.21355438299293414, 0.19218769418470427, 0.051337448826137444, -0.099999229754227564, 0.065604462250388712, -0.033196627957087541, 0.077857375844632745, 0.22272869520521954, -0.096601683736006277, -0.13244590058883512, 0.22634536048380136, -0.023759721621360811, -0.16636289752872985, 0.024375919555805453, 0.01118486694572602, 0.0090202885193231622, 0.01738778004965464, -0.043080447051755857, -0.064752417676871371, -0.15373325493809581, 0.1030300818297557, -0.086295964021762886, -0.18748306121414288, -0.083187547465909659, -0.03706603563440538, -0.091363337934458527, 0.043056498585826733, -0.0076223164368175653, -0.072300257528729178, 0.18949250084010411, 0.091582898551156061, 0.093209834464958313, 0.078433318552627251, -0.086071434197630858, -0.16935758248124871, 0.21392186250732342, -0.076880494683872147, 0.1402483451766991, 0.18838915415855717, 0.1152888395062736, -0.16631002548138826, -0.13317013948622, -0.019452425619901188, 0.013015089132922257, 0.28543941281728724, 0.23881984846112189, 0.23929137572253439, -0.02547786873886692, 0.0117330467833913, -0.031329573296911523, 0.026405820579143084, 0.17735025822121503, 0.15386780686160581, 0.02287846002087459, 0.15423023351465021, 0.10953014299545374, 0.19864560710489487, -0.10957662520495322, 0.004096363221989148, -0.0032426759955409418, -0.064959771096032265, 0.0023590326963191174, -0.082443728464586391, -0.087192941443454491, 0.0056234248083327464, -0.024093687385405751, -0.12474400395578267, -0.14738765659502367, -0.13843396166689709, -0.094736599019599688, 0.043475674535487348, -0.022122242308695854, -0.05800862114062226, 0.074104094697999404, 0.02746811155866092, -0.068145973484399658, -0.086381198469412904, -0.072754777541353594, 0.01615999106259601, -0.095064179193335305, -0.055944272676650919, 0.024970060878891819, -0.092155618763515842, 0.020485700004193069, -0.0495383796436729, 0.062127427369453307, 0.010981352953109556, 0.0281069884335561, -0.023412794627361646, -0.011846497332482567, -0.041460283596954112, -0.12375563021141642, -0.007547760161504144, -0.035060694212351605, -0.054382050709510382, -0.1278750006993222, -0.06311331594403119, -0.0786704970157521, -0.0052472339656002079, -0.027462118424014734, -0.04814512084639927, -0.097095104463997481],\n          [0.035455977436737243, 0.012809942897525101, 0.018180045357868893, -0.0038058205145671403, -0.047339142890578501, 0.008615195889998109, -0.046294359253758216, 0.016896391023979114, 0.073402760628239458, 0.057853718952836961, 0.046801239911643658, 0.017572755691014366, -0.023834114056900314, -0.028005108801406949, -0.06170353602256768, 0.0041492518341007534, -0.099934491404056913, -0.074151439249343809, -0.097134157834440793, -0.050639923311780105, -0.051915740613493869, 0.046339971767650957, -0.10129345971353371, -0.010697452082017556, -0.13071299055096386, 0.065224314051882337, 0.035157185372583166, 0.078444236629937963, 0.020870147580858485, -0.0830089239809709, -0.041877105840284014, -0.032513609221769081, -0.065938639791909268, -0.081371766652620733, -0.042073049920613614, 0.11944084377042556, -0.19373361811893469, -0.14790789457158546, -0.091870520419793419, -0.021840321854902631, 0.047335657392996534, 0.060396938302831077, -0.07953507862322387, -0.04669220242777411, 0.19614607438362058, 0.15002481494362754, 0.22469015540171652, 0.4336980233057709, 0.17626836068479479, 0.085002991074548617, 0.17628001447054742, -0.089798104842342991, -0.10576233006915464, -0.00490481488295888, -0.064591709504694866, -0.076503661467680131, -0.048692615426703015, -0.19597570662883559, -0.27569298690784427, 0.26254751209472921, -0.056874362198840442, -0.10875561753818253, 0.27052154823814067, 0.2063604487272373, -0.0015736429213762324, -0.17758806144586672, -0.0015425548641356899, 0.050842447030100948, 0.092668112807239883, 0.030409316616439044, -0.43178847946646337, 0.36701605407304039, -0.059155527136146031, -0.34464726238122173, 0.10848868139611262, 0.10612621366138617, -0.049251160488806033, 0.16014445150386469, -0.12372249481679706, -0.15509121511818685, 0.10449868648330295, 0.1609037713099512, -0.14487084764912184, 0.43188545598260436, 0.11981190997739517, -0.13832753618194632, 0.011269255569863787, -0.081012227269308429, 0.17513077192869736, -0.046057084014966006, 0.033710883104789563, -0.01526891657845986, 0.18262045149400891, -0.10024918536752747, -0.097021078480102316, 0.066110972626649445, 0.15775023905966529, 0.10256401881259318, -0.065278008956546119, 0.019464702453137826, 0.18820857985638101, 0.076080517225552272, 0.20711454885952529, -0.009713325447248497, -0.067601022770299377, -0.045103764368489015, -0.047137892479800776, -0.043049664063698055, 0.029932336717446141, 0.0056790774310926523, -0.17630517422062925, -0.030884369614532808, -0.020628025119333808, -0.10197146214534561, -0.11425424743932233, -0.020673918969270674, -0.024767884264564922, -0.074424950506940507, -0.055048990658499254, -0.037227045102696574, -0.16215779511908984],\n          [-0.07004854198277595, 0.085300667599954416, 0.0028140785761861914, 0.010033301281905325, 0.089867623592597673, 0.052912807279738502, -0.050135511453302736, -0.022285839005171091, 0.045302414609929523, -0.030119412353457265, 0.021823370321703377, -0.0060856428833483836, 0.023125728063449959, 0.014528954043079753, -0.0015683794659443039, -0.027995624014821439, -0.16607590496950553, 0.078730103754242331, 0.036994242953970073, -0.016141830613884009, 0.06880105102941908, -0.043417173628397525, 0.038981169845932473, -0.066540457403796618, 0.0031039127673838261, -0.013008774392859419, -0.092595121588066404, 0.12644069271642389, 0.040772818622368645, -0.085448406785026368, -0.13739227291848727, -0.13311138084893973, -0.11021206177568971, 0.070762580804387104, 0.08026074315831877, -0.16877857679840644, -0.05206002447695942, 0.13425360508864773, -0.10535134533195308, -0.33737573498423878, -0.070808291113453367, 0.057003657841298426, 0.092279918372553824, -0.011615223103444766, -0.05091285023944582, -0.16069489160844241, -0.048847803217798323, 0.071389129185656347, -0.043639202430883289, -0.13394293080575723, 0.30515544278533629, 0.23788255098353511, 0.20977385697294298, 0.12056019868772624, 0.252825166497261, -0.0023561720800214826, -0.035137059913897026, 0.049604725798679972, -0.10416358483192441, -0.14206356834350237, 0.25291808177088004, -0.038235474676427975, -0.053226677896758709, -0.16540845786613148, -0.014617042590940904, 0.02880120515663584, -0.10096787597225529, 0.10737683950894401, 0.12267043383933657, -0.058069637469088484, 0.07352676227256455, 0.010539954637614604, -0.051688256904700788, -0.072824552067626475, 0.11389405098260616, -0.099763013941535167, -0.099681076524513995, -0.0083154924851436066, 0.02878172341423068, -0.016643684462931133, -0.10306462657645374, 0.17421739601581576, -0.012649043926851018, 0.26025794182930068, 0.13061127474097123, -0.13680683615114592, -0.055878226752606029, 0.098670144436524707, -0.13970261425268571, 0.029744590816758114, 0.073907056540957833, 0.1684324925668621, 0.08906251617397061, -0.081254083870154856, 0.0080562412391433046, 0.15433309501581671, 0.061774969198347712, -0.05038568057644794, 0.19950920633649696, -0.095579333074787581, -0.078848113914305407, 0.066656901533640664, -0.07772986657418926, -0.059687592569233103, -0.0023500722459320737, -0.0046282038086771929, 0.075460714684052924, 0.11777073451853808, 0.24712980105754503, -0.021968024854625706, -0.093773910434377064, -0.011643488223564324, -0.055253337050732328, -0.067446244455495186, -0.097859711494188872, -0.067747061381834131, -0.11419175135531312, -0.15447612433882574, -0.053913847600707908, -0.072082530188140578, -0.10185711157346036],\n          [-0.014135164933848525, -0.083516200530839357, 0.025061773696956152, 0.075977313837335109, -0.15437088222766421, -0.04240467277326615, -0.034524278854966582, 0.1318746103998901, -0.018956619417625505, -0.0026675236384224726, 0.10305833569336915, 0.040329893324884791, -0.10561491356176617, 0.017365472828129225, -0.1593697493161278, 0.032279086189098444, 0.10529509601866645, 0.075027736842911114, -0.11928350111773782, 0.10401492407708587, 0.14421269322823677, 0.0071286351316720287, -0.079992301428582629, 0.014274946401273955, -0.038729777215095025, -0.13694960123251429, 0.186445386861957, -0.065110687724615285, -0.14101483402071849, 0.22619054701312596, -0.0019016328709244301, -0.049331211684928558, 0.014047517480666363, -0.033852195689686469, -0.028526407496796823, 0.086229830449351855, 0.10755614463917934, -0.040378243554949227, 0.040168336461144302, 0.25442368338483701, -0.3499242547867164, -0.11829463044440175, -0.11321507805468442, -0.036040402153841591, 0.0091418924051510815, 0.015127629290737882, 0.048542079162587376, -0.11506255204173602, 0.081696307746731978, 0.17250695232340318, 0.15415826584650585, 0.10510570127990954, -0.21704507894326638, -0.14596864247047642, 0.1970892398119917, -0.12398828975192644, 0.10066494813730779, 0.12172147584675422, 0.12480836369060534, -0.055987894617694878, -0.21828759073305709, 0.080538081042609941, 0.23046289660391583, 0.31883071306960742, 0.20521924642268785, 0.0081842939400904868, -0.054334680492246989, -0.11191127753279448, -0.0056946625135289586, -0.04305552710584918, -0.040460404096243685, 0.10030692443116394, -0.060036553045197671, 0.14527330616853071, 0.25790754371580937, 0.16199120552860652, 0.049309451989560361, 0.0040739095783849238, 0.11099001371044198, -0.020691143951251361, -0.11143944147535105, -0.081094875651466974, -0.11638633381884322, -0.038956249190972861, -0.1298485818109307, -0.22365399252260121, -0.0058588467993392259, -0.03608666892894484, -0.077144042211452088, -0.047407377167887781, 0.027428548856661739, 0.099597053423751136, 0.040004259955310414, -0.073006673209536049, -0.017635812509909359, -0.07207223200520288, -0.0031645685054547332, -0.065567214011750335, -0.10478061295325353, 0.009440525764280297, 0.025831878010087357, -0.038820039872570433, 0.027511569211728273, 0.036751337723812103, 0.040562322742325699, -0.0038665480911575581, 0.012355677864371528, -0.053858176855473526, -0.00065956354595068066, -0.0026597994151184197, -0.11895782317212758, 0.022143400716859319, -0.046808396987253115, -0.074910221874449304, 0.018173403762517575, -0.066412768816517184, -0.03312873600388673, -0.12808543381027454, 0.0050880558741760937, -0.088215241900397035, -0.11219840847108876],\n          [-0.036364274597361676, 0.056083891847620769, -0.054614528430129372, 0.12841266882397054, 0.034694915130257929, -0.099268838937359272, 0.035218360577730458, 0.0017050223771709963, -0.053720515111571325, -0.10469756632201047, -0.057793517872112406, -0.0079504586166561902, 0.079079001374876626, 0.17475876751746433, -0.073745536055607713, 0.14078752799492825, 0.17945289782476989, -0.028798495109090064, -0.053413953610016891, 0.088642497593947489, 0.0067588194601195459, -0.13125029810181102, 0.03217045565830174, -0.07593804991299713, -0.045683415387781846, 0.098321469102132006, -0.11054865427299748, -0.085251684099912406, 0.19879712870261834, 0.020722064313346493, 0.022471477480525272, 0.082375788173085274, -0.11575790465692171, 0.032842645738555103, -0.083484194971592596, -0.077331550720375883, -0.11177282516936979, 0.024984273273181961, -0.030403360600728728, -0.029024515371594548, -0.10371511880806172, 0.011701378243922171, 0.0093277747988130214, 0.002431192271711265, 0.15006757232014231, -0.21394797471762256, -0.11853920458017891, -0.0019533526563885917, 0.18177937076706377, 0.054954598440171316, 0.1551092512502385, 0.030060622456317722, -0.019865094069587117, 0.070850991969667099, -0.00048596237286066242, 0.17946399285467196, 0.30638569966633139, 0.14694241644943901, 0.10067729378037348, -0.073081243699588155, -0.083394453453312839, -0.13131133309870838, 0.02608780563916567, 0.15390102230569283, 0.14965704056352619, -0.12432072266765236, -0.055197512874001355, 0.23539003120249477, 0.23071437717412627, 0.17815006433908051, 0.032433010859872255, 0.085250215236998952, 0.10099385760580901, 0.076038809649047315, -0.013731917856005003, 0.0186901648513353, -0.032924756112736785, -0.22858777194216445, -0.12675914211780165, -0.11187142301820072, -0.12231050055181397, -0.022442794199238097, 0.014664186213991334, -0.049708524052554312, -0.031971360150189108, -0.03211971771044804, 0.044761469162405726, -0.048496783217227474, -0.035899743760748851, -0.059853454803789952, -0.046858773572646534, -0.054268508959597561, -0.025596949047592216, -0.059820464842134907, -0.029518961263161905, 0.0036297431646178518, -0.020509064754665129, -0.0015230193399059302, -0.090002680596330681, -0.026575598812970537, -0.010828662191731439, -0.0095882629855936694, -0.0089047256965019833, 0.0029521526762387035, 0.003804200299764901, 0.061865649665059336, 0.033689817096841081, -0.066066128467731536, -0.02437191906735954, -0.034185476570230244, -0.10893624295233989, 0.0071168280186506665, -0.09401277488927702, -0.018408076739696223, -0.057181782869844225, -0.026056248846387006, -0.088889605365135904, -0.10212222492182724, -0.043049828055051656, -0.085050747749882583, -0.026051110695555976]\n        ], \"lbp\": [\n          [-0.027900321369488244, -0.0060441994553984916, -0.029117905545804415, -0.012327610537342652, 0.061854476662081867, 0.095671317895324293, 0.045971729446465374, 0.01553067346468753, -0.012023121825700329, -0.040293165022942272, -0.033221733066527162, -0.0035958268721606613, -0.013857406372198591, -0.034503775174297223, 0.017543175352255434, 0.036807902994090223, 0.084770163856199093, 0.060825220456424196, -0.0093584374782611293, -0.048192584791248279, -0.0065946784148823052, -0.030168034388727068, -0.007336172112964571, -0.049812230351494888, -0.028525647622325873, -0.0089851436778563571, 0.037542932347811336, 0.07584997109273485, 0.040463627176522118, -0.0202219777393636, -0.010643448968773972, -0.025973324357000831, -0.029295410910686326, -0.049585573800075042, -0.016454172237658507, -0.013482276454755721, -0.034207328190167335, 0.069169117093015112, 0.043414738683023937, 0.066514631750824477, -0.028013646641570675, -0.0028085168494333609, 0.012846026283526629, -0.020229423320994658, 0.026363734996447397, -0.02400313852588018, -0.071418628861473987, 0.019799399074940063, 0.047961802211596821, 0.090395789173746133, 0.054870436486652595, -0.015562181031975555, -0.0052396854064607895, -0.01338270347368932, -0.0017450580356042078, 0.00097397016632680411, -0.034245488638524155, -0.029304216678874513, -0.015762970169531754, 0.01232351078031502, 0.11024357683264789, 0.0052690576096130134, -0.0082710664495191447, 0.029191444997078354, 0.010481969078390848, 0.0048675356582309672, -0.0043579148871963208, -0.025720306996157922, -0.06530772196855876, 0.016283145128269706, 0.042681321861108915, 0.074985247321301865, 0.016473247914334525, 0.013771073119619424, 0.0024092712098635191, 0.02402373658667337, 0.033110911546988531, -0.056874923774983661, -0.027797079980336641, -0.033810769624174404, 0.015078596551516596, 0.048209545205572732, 0.11415003087810688, -0.0050453148806184067, -0.02453712965304819, -0.0046878076136616098, 0.030698630375551105, 0.036164393720748929, -0.017659727315601441, -0.02758989133869354, -0.023775739038709096, -0.0031653848755319783, 0.043853892725709331, 0.093522192523850758, -0.0015598570273860773, -0.019099238204545323, 0.041500642827912271, -0.0029952551344066894, 0.02004832980498979, -0.025805960318499716, -0.014023218349180466, -0.052045089337890343, -0.0089676761596982277, 0.059688184012493893, 0.082792114958395474, 0.021692573098100312, -0.012200151839688603, -0.0040158722713318634, 0.048254090507913572, 0.0050565259058356522, -0.029779592751576791, -0.045801516188543855, -0.02221712686320438, -0.026806365466397059, 0.08055750324533141, 0.11124706386872835, 0.024835176089393517, 0.013030726244874311, 0.026214268291071548, 0.0092541421104222928, 0.054743249486413466],\n          [-8.7334058636959547e-05, 3.7445117935188191e-05, -1.6718852112379556e-05, 2.6449717430186009e-05, 0.00026446237412404601, 0.00018012006397465953, 0.0001307947973358814, -8.9233727162704377e-05, 8.7778261435746477e-05, -2.8629705583770731e-05, 0.00019466262098214414, 4.0175132952787601e-05, -2.4470034822768327e-05, -5.5302995306328803e-05, -9.4642365284064098e-05, 0.00013992126181657828, 0.00025974343567526995, 0.00010836805931595294, -2.8508338861643612e-05, 2.061224391589761e-06, -5.4546501619936929e-05, 0.00011548126318818193, -0.0001788968780262537, 1.0106236414454163e-06, -1.6477072134012073e-05, -5.4462479167990247e-05, 4.6056613212522041e-05, 0.00020886964911843303, -5.9860313621762362e-06, 3.9146617021777741e-05, -0.00015653886989401913, -5.0893371838153789e-05, 8.3828512715357351e-05, -3.9259965209559669e-05, 2.9022913523094052e-06, -5.5656299347785557e-05, -3.9745247630351005e-05, 8.2727825803138866e-05, 0.00021615221821938771, 0.00016964902161820464, -0.00015046509771197286, -3.9211986704516637e-05, -4.1804257750674423e-05, 9.8942673641209088e-05, -3.7700357389545795e-05, -2.1777257226037079e-05, -0.00010841746095995551, -0.00011250296826445516, -2.8088672225879026e-05, 0.00024500271057997097, 0.00011698005994424145, 0.00013699860971772872, -0.00011632402760545536, 3.8758627518911681e-05, -5.0383597695171332e-05, -5.6491249769561463e-05, 4.1858840099188652e-05, 0.00010510216324040138, -9.5908590272430344e-05, -8.2666457891138537e-05, 0.00014673240802820162, 0.00017376564896403636, -6.6785749466828637e-05, 7.6117972374779332e-05, -0.00016836279120163201, 0.00012436785920524364, 2.572483873684861e-05, -6.2337391140390188e-05, -0.00015376902099116518, -2.748263618047534e-05, -2.8455141653132252e-05, 0.0001245843209365903, 0.00015628289279003135, -2.4736989716003788e-05, -2.091205958625747e-05, 4.3221191511700133e-05, -1.0154715937089193e-05, -9.9849401355839133e-05, 0.00014166961818393338, -9.9758503461578121e-05, -5.3681414486151866e-05, 2.4697228767074902e-05, 1.8249672491638027e-05, 0.00019364243897489978, -7.2708659052964433e-05, 3.8335032297432542e-05, -1.941096106845841e-05, -3.2115893129546109e-05, 5.1948009027611569e-05, -3.8286652867905793e-05, 9.7189147669228537e-05, -0.00011816184055358711, -0.00016089510526324721, 0.00011623698043458554, 4.9146090188779967e-05, 0.00010181714739832155, -1.4287799392848771e-05, 4.3291869782970463e-05, -1.9967142031866378e-05, -1.7367657007066883e-05, -1.9582956908605959e-05, -3.2832817909847489e-05, -5.3813630280598324e-05, -5.6207569526993666e-05, -5.3241932910777154e-05, 0.00024615067562027901, 9.7553256739707516e-05, 2.184380833295408e-05, 3.0258380552987147e-05, -5.3699454869285401e-05, -2.5230762735903084e-05, -5.8324496095124025e-05, -4.7049519791985783e-05, 3.6195180921022346e-05, -2.9440640435682286e-05, -6.9516912145691108e-05, 0.00012456823815416661, -3.5053968305372846e-05, 2.1986527300186251e-05, -1.5332062580714734e-05, -2.3047309958091743e-05],\n          [-3.6084043411983239e-05, -1.9306572941766697e-05, 6.6469627400028188e-05, -6.9626706859858556e-05, 5.3717685606707692e-05, 8.63369060391736e-05, 8.2142164694962855e-05, -8.1711140914987948e-05, 4.0205836428920672e-05, 7.8479400685671497e-05, -4.9039572793939737e-05, 5.7453551592964724e-05, -0.00010018086975340998, -2.6147792389851886e-05, 7.1198224997405762e-05, 2.5682689442775401e-05, 0.00011929111371736115, 2.7860714214499385e-05, 3.2654486739197575e-06, -5.5573777784770351e-05, -2.4040836230674462e-05, -3.7015814775545261e-05, -0.00013308586174926723, 1.923769352976841e-05, -2.7445843212351578e-05, -1.199439585908063e-05, 3.5032215132376919e-05, 9.4889623314988944e-05, 4.1828095702725956e-05, -3.4147434353455977e-05, 3.1692057309944382e-05, -0.00012748342849396022, -1.5840876485394284e-05, 4.7073815318422058e-05, -5.4219379703623893e-05, -2.7057823555193261e-05, 1.957250209402156e-06, -4.2885362544764494e-06, 5.1784247492511759e-05, 9.7614017595303026e-05, 2.6206437789333403e-05, -3.840723379957417e-05, -4.3620727456269992e-05, 6.1282931602328416e-05, -4.1484546914841158e-05, -1.8991776069687133e-05, -3.8766273328664363e-05, 2.4842026175204979e-05, 1.943116733871264e-05, 5.7022083599506113e-05, 3.6943371778189182e-05, -2.2802079412020948e-05, 5.8533333908400431e-05, -3.8134075295223613e-05, -0.00010733273350739298, -2.1349054282106955e-05, 2.0212901591327992e-05, -1.0308234675579855e-05, -0.00013178259714422685, 9.2792721038507942e-06, -6.406096160121999e-06, 0.00010489353656312206, -3.6972486442386071e-05, 1.9205959162101743e-05, -2.5119901163566229e-05, 6.6677926942838254e-06, -5.3173101432296699e-05, 1.5595662104549764e-05, 4.2063861440242226e-05, -0.00011208840161249227, -8.0476085046677498e-05, 8.680420622040122e-05, 8.6344181199115091e-05, 2.8719099287293631e-05, -5.3155476409198592e-05, -5.4570646040804499e-05, 2.7740013315707968e-05, 3.1290284801600062e-06, 1.8897139614309187e-06, -0.00012179101932861119, 6.6840019799997014e-05, -0.00010633851278423791, 3.5859740502247259e-05, 0.00015372154099424235, 9.3482108860959943e-05, -5.1252862294083688e-05, -1.1146007599487084e-05, -1.9744343489652011e-05, -7.8768975259988112e-05, -7.5893435004921461e-05, 1.324648660373383e-07, -0.00019713417520837023, -1.337483475241652e-05, -3.2243587432437271e-05, 4.5963036203394009e-05, 1.3630966931021948e-06, 6.1090824316110785e-05, -3.7063944354813472e-05, 5.3774349412737815e-05, 2.8714809252497475e-05, 4.3068787919792184e-06, -5.9398600734514111e-05, 9.4064471326807484e-05, -0.00012585758504905786, 5.0460919318804677e-05, 0.00013218227218045244, 9.0391008869705747e-05, -6.4299214936155979e-05, 6.1428536959399344e-05, 7.239739626676775e-07, -6.366839054444684e-05, 4.8758759963537721e-05, 1.370601692269463e-06, -9.7972856753872155e-05, 2.9714662401220159e-05, -0.00017065450862235659, 5.6129420667599961e-07, 0.00013050423194534838, 3.9512648229014097e-05, -3.0858474698957153e-05, -8.077273509681307e-05],\n          [-0.00010041713705304361, -7.5004427981998842e-05, 7.7578836709558431e-05, 0.00015060096637672937, 0.00010272729354795368, -1.3455811985058075e-06, -8.513816673568278e-05, 9.5277958304541138e-06, -5.125057113741175e-05, 2.1937041723950335e-06, -2.9906736665197275e-05, -1.7822507535654366e-05, 1.5920560761634173e-05, -4.2619825694686919e-07, 7.5621519507984916e-05, 0.00012391090326623749, -3.7227119771730648e-05, -5.1851912943837175e-05, -8.0359665516151202e-05, 7.6556506706648296e-06, -2.9340700929650354e-05, 8.21553152150125e-05, -6.0163498557478517e-07, -9.0231354808785729e-05, -0.00014677611474230284, 5.8459186367564031e-05, 0.00012920305793076987, 6.872786215014054e-05, -5.083503031854536e-05, -4.9057975777679064e-05, 1.4667265166828924e-05, 2.286695792285548e-06, -4.0793147414804661e-05, 3.1833081357390651e-05, -4.6139907270008307e-05, -0.00013108954174256143, -4.5014849167218651e-06, 0.00013512478717948309, 8.2693053849276603e-05, 3.7212849225235281e-05, -0.00021401767748336522, 1.2160803497153136e-05, 9.9526098024278753e-07, -4.0751249249773927e-05, -5.3363285595225268e-05, 1.3589464997432535e-05, -3.4575952982748501e-05, -8.6226276956346756e-05, 0.00012833142734719472, 0.00017949919377930994, -7.6588263679235394e-05, -5.9446820945188023e-06, -3.3933589792761384e-05, 5.9031307218506898e-05, -2.015941600058864e-05, 6.8480128461272105e-06, -3.5080450032940217e-05, -0.00010776252403311049, -6.0092138186616101e-05, -2.1591874499028371e-05, 0.0002085712636860533, 0.00013308075647107918, -0.00019038894948568419, -4.8311736467392813e-05, -4.4977282909152566e-05, 9.0492245632955992e-06, -5.3993236004005844e-05, 3.1275503979513383e-05, -3.2914668064622926e-06, -0.00013006251102497951, -6.2666458502351387e-05, 5.4666608924943544e-05, 0.00011702845908493319, 1.0892085020900236e-05, -0.00019162055407114659, 1.7055725050175042e-05, 2.974210675293909e-05, 1.5551139561116503e-05, -4.5023716002432629e-05, -6.5835168557154544e-06, -0.00012255723604855578, -3.9207372768674739e-05, 5.7719587707099479e-05, 0.00026173109381898325, 0.00011301129674169685, -5.0802156995757072e-05, -0.00012438693915498879, -0.00011512378434027151, -3.3743545817560561e-05, -3.5132235241363229e-05, -4.6345900066929873e-05, 1.5030465562238389e-05, -7.9108333110193552e-05, -0.00013976057205664083, 0.00019173792465106837, 0.0002331493622096184, -3.2682257327322451e-05, -2.227669270683898e-05, -0.00013159576482307811, -5.3703861605495715e-05, 4.6651971536551334e-06, -2.9729790998640759e-06, -7.4266730748546658e-05, -5.389279737498141e-05, -1.316760153250926e-05, -7.3089820491645252e-05, 0.00020790545462955686, 0.00015786906649726715, -6.9607449746187828e-05, -7.3261780378834282e-05, -1.4507107393861574e-05, 1.3219651490949808e-05, -6.5930835653411554e-05, 8.7110618181049371e-05, -6.5267580373248521e-05, -9.1012781288057377e-05, -5.19613620658093e-05, 0.0001223100464897317, 0.00015993077204011844, 5.6612364799854542e-07, -6.6482888690664547e-05],\n          [-0.018520133751243464, 0.033336491324542555, 0.060819720527029927, 0.040323418834132499, -0.049047834696932316, -0.063470960442844934, -0.041691385681480758, -0.044039608866153525, 0.011258972442574882, -0.025539787514069722, 0.043103535419798611, -0.028504032717188526, 0.021790396749209295, 0.044813183605805482, 0.072342677373923595, -0.0054580991763535022, -0.068820734524706939, -0.027963615041034923, -0.043243973359288305, -0.0078418754694789261, 0.024040296276847006, -0.035356451324435254, -0.00086042742890664065, 0.0096467844413907385, 0.029019444355814925, 0.067022867313017098, 0.057029519949577098, -0.043873902116144253, -0.075663372407398011, -0.046868046699417951, -0.018264867445612423, -0.0074626900784457925, -0.021262044142767906, -0.0082441046273046235, 0.0029955900266555547, -0.0089729220855647492, 0.061100791900219963, 0.099636125742843085, 0.01246798784414134, -0.10296028529728725, -0.052371289202456622, -0.027534950783727603, -0.029445539405478512, -0.014438110426238521, -0.020597801030636742, -0.0069192729388266542, -0.0068353911578240287, 0.046888843535454167, 0.095419422615776378, 0.11952740651114951, -0.071759879152842584, -0.097543349347774588, -0.038581839090091406, -0.011359375549234043, 0.0096414218165537698, -0.019377865703622918, -0.027301905307660128, -0.018976931848243853, -0.0097874220322787808, 0.052494465523833397, 0.13673694152340612, 0.079522839381611823, -0.12204275357398138, -0.086659087964125608, -0.050788452961220157, -0.0095706052201628006, -0.031867426563525113, 0.0065403023175219614, -0.013821229136400558, -0.025841844477207752, 0.039927962074705635, 0.078783857519568928, 0.14509479705134329, 0.015223051588865631, -0.15795321280384766, -0.07811502424267372, -0.035586118805957023, -0.0074434198140412022, -0.003139865749646073, -0.0037907036206188023, -0.017030151899642937, -0.028687071734543906, 0.033231292617662847, 0.078112982645069926, 0.14321815919795058, -0.019232041974005604, -0.14758943164396549, -0.079879348969855837, -0.0083758813479438005, -0.0013328452184675349, -0.0069555223602641852, -0.013965719003215596, -0.0084517142743534557, -0.030635979725422979, 0.062564657139202229, 0.097483933781118526, 0.098393109491561992, -0.075765704484413554, -0.13450497059632649, 0.014088590669959079, -0.011155752837349455, -0.013224455473029723, 0.016020761294862018, -0.0092009384061512017, -0.026044280280468072, -0.0089942622699424254, 0.040511999855926281, 0.13765939646555747, 0.019532039084030235, -0.113685740386246, -0.014674643494660689, 0.010068963393355071, -0.0027238337107524657, -0.029503771627642287, 0.023985321668865342, -0.030691543491141608, 0.00075273240464540647, 0.016509439032383569, 0.052598123173995245, 0.093807407073263682, -0.010161298965641691],\n          [0.022420101691410947, -0.012639778282766856, -0.054967524914303248, -0.096783598284995914, -0.029278797210954027, -0.027140150032464422, -0.0090862764272963831, -0.01436525543604809, -0.0036874965912717952, 0.046401379667166204, 0.06944892468679216, 0.046437605749818221, 0.054029149328551414, -0.014720520773996864, -0.062916130856065233, -0.098775700155922658, -0.045678178604865977, -0.010326416710093567, 0.0033233465331775174, -0.0034083775958032849, 0.018489145293850089, 0.061679618222812545, 0.030027128801833766, 0.056347586928367471, 0.025440360022667211, -0.0079353236613027636, -0.090410021555884179, -0.12919633261589189, -0.034536772506999741, -0.018948700084980397, -0.0010618822071395313, 0.013098312160546995, 0.032363848313171489, 0.050549191984487554, 0.031990411924285006, 0.050348641795340286, 0.055949633963116994, -0.021494030157359074, -0.10945006672723176, -0.09734195910364446, -0.069733612116043384, 0.00046788820631171735, 0.0088096432516313414, 0.021994342501025908, 0.0027410119068893707, 0.039372454591750629, 0.046870579313232824, 0.065600872379856318, 0.050120908492025634, -0.016483195978918071, -0.12612174723616837, -0.11190212135650279, -0.047331697359264666, -0.01726103679627998, 0.012596718517964785, -0.0075349876913478053, 0.0038005877790431991, 0.051789101650355995, 0.056092751053536116, 0.084082295492619821, 0.077148767905369536, 0.011050271359062259, -0.12128857542605344, -0.12084191927896829, -0.053176729528096434, -0.02708040311428029, -0.0075678521991022762, -0.01607121542877013, -0.019007628063393803, 0.030912220436668407, 0.061182793511099738, 0.067857694007842001, 0.11648893540497803, 0.051234448548712098, -0.062047768790331637, -0.12295702506362237, -0.11728242791483995, -0.00044317389712395395, -0.0022492229405423753, -0.027298027461083098, -0.0037412679982248703, 0.018339305301497556, 0.014062213845781296, 0.042776761103683739, 0.12121831309988876, 0.043922241629075237, -0.060790512107661343, -0.14710686167847625, 0.016829211914154221, 0.0097743210845070427, -0.02655745267922931, 0.01411019215769007, 0.0015911500130474376, 0.0048095535457472055, 0.029093722335047395, 0.02204063036696597, 0.11057315594923375, 0.028480643798939262, -0.10628170570505348, -0.035908284128103249, 0.0133539331015953, -0.0026337425678592541, 0.0037217642215676694, 0.01211758091302224, -0.017185123404806685, 0.037539560931704963, 0.021332506924666678, 0.037076669230181408, 0.034944297335335751, 0.0038125076728691906, -0.011494533354137266, -0.0025310349463153192, 0.017794319144349827, -0.0060675629645619775, 0.0061802385692899253, 0.023087539721666911, -0.0090737645476416107, 0.039516536947320213, 0.034463079883642105, 0.032448600915701092, 0.034402984786170009],\n          [0.0068336647996234817, -0.018868811143753335, -0.059136035832249842, -0.028733110863327534, -0.04829617939991479, -0.013674449873764477, 0.021589567751534984, -0.011045509577009407, -9.2586309830101649e-05, -0.019604821913896741, -0.043554281780948161, -0.0067654209020675676, -0.02068305720368354, -0.030701868023452029, -0.028849057542991427, -0.017812677518967715, -0.045031832483275663, -0.060820037371985124, -0.010178321392366178, 0.015937284977666402, -0.016985093495210109, -0.040648498140976104, 0.062808978784564026, 0.033289631093537754, 0.0086340994321458635, -0.010322738843516595, -0.059032523363236167, -0.063911207518901086, -0.04096234057148166, -0.027001415147463827, -0.034989832948803361, -0.028182307754725123, -0.042998203295550722, 0.069170072619876719, 0.043703797355855584, 0.052829105392347621, 0.047980736517133415, -0.062746508827205477, -0.07875819635466827, -0.075127670879345507, -0.067143876925195398, -0.066726399172545248, -0.041696339372405265, -0.060750152079557279, 0.024187583912489444, 0.068640938449234204, 0.041598533606845969, 0.078906569214333658, 0.083979421652039477, -0.0038263845041486728, -0.12006341244852366, -0.11316397468328382, -0.13578926241060613, -0.093037742063093384, -0.094331325266374944, 0.039374839837024993, 0.0018502894554712629, 0.00098403884557300703, 0.043251075195119761, 0.10289600250798445, 0.10139457516638843, 0.098296318213992984, 0.0015172138792846615, -0.091353309472808869, -0.14408600311908051, -0.17601217218477397, 0.0027216978532337011, 0.0050459512202331094, 0.013052368344425278, -0.02268381542321192, 0.0018963147223881672, 0.058561197832169565, 0.10081746684744355, 0.1284091469146558, 0.081889066464071528, 0.020432446864236044, -0.041167990010434322, -0.0055028747128956224, -0.0065942601568496836, 0.014863290940840906, 0.0037309761431811826, -0.0055733957673353585, -0.0095154141766328471, -0.0085635423630069374, 0.013253049308240551, 0.048732591229276791, 0.06968257130273349, 0.046720703389001979, 0.017479981197113373, 0.013140374943216824, 0.0057338967701967298, -0.012003741816435577, 0.023955505761992523, -0.030000657870097674, 0.047563304649765062, 0.0077259610173529046, 0.033237902464347463, 0.017011399778159172, 0.061533921370621733, 0.020212718731567866, 0.017305311353954009, 0.0022897792857957105, 0.0016835294612028012, 0.0010206390840901067, 0.017475023171824131, -0.017949934386931946, 0.016500074421584708, -0.011803197631711164, 0.0071375865755149634, 0.020110991820133289, 0.0066510650617606984, -0.035354962478288801, 0.027934388454869896, 0.0035907122794057167, -0.011547179475815586, 0.022730843153114938, 0.0063450556387456142, 0.063988285390432748, 0.033769980297886006, 0.019839431713957675, 0.040068406254536615],\n          [-0.091835947946248234, -0.046604387675826101, -0.041676874531984251, -0.033930262028828845, -0.035175875655805863, -0.0080453626545488738, -0.0090216589851604481, -0.02121447197147619, -0.062925485862957847, -0.05369020745787989, -0.061858807625239501, -0.06937986410985425, -0.020603691282656961, -0.034830971939882417, -0.019889322846467439, -0.011468099868646962, -0.0094847742535054055, -0.025059650809968075, -0.013132163916809988, -0.034373831808455289, -0.029388799791445819, -0.054678738402223398, -0.040920673499650034, -0.079026490477792366, -0.031301237226933717, -0.0071872341290014803, 0.0034458433272600772, -0.042065809644383292, -0.021031719352458608, -0.001277101170823379, -0.005576040960812231, -0.04990522219778968, -0.067835745978871653, -0.025379854810453996, -0.06049669189310318, -0.095683850344630256, -0.066897542916176167, -0.065214493641294946, -0.042633834046964025, -0.077401334220438017, -0.069225159677055934, -0.046596567405820979, -0.048532202776120179, -0.039853128982711955, 0.058791987986470867, 0.019029808637362255, -0.024286125044301457, -0.032536348362445913, -0.054850631234694594, -0.029159852423518498, -0.017140255241788596, -0.025126219632764957, -0.021866221424523921, 0.028552819914696353, 0.039991900782009912, 0.097745845928933414, 0.075003405416456781, 0.07430547425958485, 0.046933143764967475, 0.098596680830569355, 0.069830184507780863, 0.076647971552195535, 0.055005419110830067, 0.032350115276010255, 0.096665962740361017, 0.010918853676894331, 0.022113519271821657, 0.052322536591560803, -0.012178262012994243, -0.010455542631323735, -0.018880441466414811, 0.0047199732120972978, 0.0026889619208184806, 0.018985019723820939, -0.0023284725516955788, 0.0062286539593777134, 0.029915434795143629, 0.035545042009691323, 0.031166989162956585, 0.023817329421070923, -0.027070265784234368, 0.012571032012612495, -0.010191882170487051, 0.038027976545602443, 0.021583936786457751, 0.0041709730151021779, 0.0055753825352771154, 0.017282900358889321, 0.012313387276719573, 0.014888890182775907, 0.0026555936507575845, 0.0041491311841516786, 0.0089247523949147946, -0.035192223449134509, 0.014939222809458778, 0.014096628107623346, 0.0038994744074676031, 0.0038988514456372763, 0.017266521138772535, 0.034244356006098528, 0.049763931691756066, -0.005218910309326261, 0.026330780935207528, 0.0018007141228710017, 0.040201841967386298, 0.008387995416966193, 0.0089671250498080113, 0.021011865402405266, 0.0053809467478302536, 0.011462851184232362, -0.0066133988743292821, 0.045841349785302882, 0.047592090089117703, -0.01138244385540027, -0.00070927480002307142, 0.0074075056026355335, 0.0019847009079824521, -0.030303270976541313, 0.018517753986476031, 0.026216734168329519, 0.034368064491053237],\n          [-0.027531037432672691, -0.04099006670908386, -0.026965623295530559, -0.012312380363310317, -0.039447686525463981, -0.03666523046247578, -0.037447390315664068, -0.022587619011761463, -0.062582100174721697, -0.033423508713191781, -0.0076373179884149161, -0.033315735899947165, -0.0039483412696357774, -0.016273510510130911, -0.012992687546803472, -0.034372636966254512, -0.03435111582313348, -0.051089306183329297, -0.046268014832446261, 0.033800057143038305, -0.0073586595715814766, 0.019133386626946858, -0.058297854363401749, -0.031082988073954963, 0.0083772509744956935, -0.037071324198600958, -0.023704461959529924, -0.039291684655309064, -0.048263910448506031, -0.012347480993205387, 0.035773003788554164, 0.037156659417232431, 0.026570153340676375, -0.037942266517026105, -0.024176653665932857, -0.031307061474069642, -0.054205313513014206, -0.06768275375230659, -0.053316198087527286, -0.010338522140239293, 0.029942502875344803, 0.014711352823963025, 0.049805637603742653, 0.052371502049621543, -0.10703071666798925, -0.045011199304251487, -0.092731348345214376, -0.085093349694216031, -0.063610110950440779, -0.0095235206492992573, 0.042742365251146427, 0.043444162762555597, 0.046036485816212142, 0.028778886437521231, 0.047907150554463943, -0.12009138239136509, -0.11012922541438776, -0.078798363732678192, -0.018737247881031881, 0.031173984486382707, 0.095074649576190343, 0.060365097674145295, 0.019220554797620699, 0.01388973862340221, -0.0076666833910165461, 0.016336606646977139, -0.0089402055834871645, -0.009503128569333559, 0.069645335781562456, 0.10401039886252086, 0.052459790243731555, -0.026938277073398003, 0.004284176371855913, -0.010856375573225323, 0.01605273011301905, -0.02894886868907141, 0.00023294115249347658, 0.10367861418152627, 0.050069068200320935, 0.03685333261379678, 0.0065038291189368977, 0.0055476321647372102, -0.001084420000763836, -0.0013256537401329926, -0.0055543179731149875, 0.04532956341916991, 0.0065356074227495148, 0.00060778524209767829, 0.072038703955503394, 0.028968613954759095, 0.01396712994861575, -0.0072270944036459395, 0.0072231709415025436, 0.0088564229032674913, -0.012818406202984009, 0.0018158551557052593, -0.011048631845851281, 0.0081952063010873877, 0.012550415026440526, 0.030696565794881558, 0.067975847115216093, -0.022209795527931789, 0.017373946107885192, -0.0058381708959014574, -0.016933088119923018, -0.020606794484921063, -0.0037043871743785168, 0.0029398368329221804, 0.0096078974834835768, 0.0041619321053977393, 0.051668501796067898, 0.0039989461136227533, 0.031118179883235883, 0.026294533996712728, 0.01753286865508474, 0.025533735463243126, 0.015158623449280213, -0.0079480930999361321, 0.0038964542185176585, -0.0053933087386399264, 0.021361178289641174],\n          [0.012975868416211518, 0.019239320212785932, 0.015861069262982933, -0.050083983501051685, -0.014830404072943748, -0.042428924530810298, -0.0546374523172155, -0.087876214943823805, -0.026658677207938124, -0.015590232984336386, 0.036899434494932132, 0.024659476737796934, 0.0020171111101438682, 0.017921834795381661, -0.027324028879693207, -0.013180029299528148, -0.055753129702174518, -0.049084869856142327, -0.022370349979819272, -0.004286198645007025, 0.041588558750575308, 0.026714819884015438, 0.033049974332900536, 0.0089521448811692717, -0.017401493840176877, 0.0075428243019341618, -0.059296477399313652, -0.055868974136098246, -0.057660433887213092, -0.042846351191628017, 0.014163595597386905, 0.016126409391757648, 0.045832162409125146, -0.03439907801328182, 0.024141395323280069, -0.034808445161098753, -0.040342652019852668, -0.071211354083205405, -0.066220814617881887, -0.021197302763752403, 0.040154246023236077, 0.026897565966803642, 0.041075505774253465, 0.013102896697572107, -0.054802347574740791, -0.036158434286273147, -0.0256495795872312, -0.031709300211612938, -0.07192249463955766, 0.0018536114632540868, 0.06135675209286226, -0.0047182623867055755, 0.040748587019009241, 0.013385521369616127, 0.022021140563933967, -0.071345017456805687, -0.032751414465768555, -0.061368302060063384, -0.077484017233162547, 0.040235459113155417, 0.068103358625634269, 0.052652304806050272, 0.037109981850323923, -0.0069502207163615664, 0.0099627248261238005, -0.013836396194806236, -0.1076545781769893, -0.055495023231610416, -0.03496995103010396, 0.011211930076389209, 0.071812499425325693, 0.073452579592106007, 0.011482805374590529, 0.0046876216072186004, -0.018292746840584097, 0.034170522532356445, -0.010280828511826764, -0.11953193347980212, -0.027928919333068614, 0.039183167556650897, 0.054784445312102498, 0.058364392086528799, 0.010347645401137313, 0.024383436691158888, -0.037224914576266671, 0.018329010676908897, -0.021362338634851388, 0.016317900816211706, -0.036988609665871267, 0.02534543374576112, 0.049929079774209781, 0.046243114162446489, -0.0049605182450543489, 0.0034919992815497097, -0.044846569032337441, 0.0083151693429875384, -0.0013347971554703852, -0.03179501043076588, 0.008411224541488016, 0.04299524896058729, 0.010370090496971934, 0.032726802355203644, 0.017613621443155619, -0.017879863195363097, 0.01304441155731989, 0.0031245950737431721, 0.017805613201477818, -0.0083911278501079337, 0.006798248666313525, -0.013767337935693395, 0.056008431245866491, 0.046170998183484704, -0.0067630944098937273, -0.011002116865157521, 0.021424043858876557, 0.024102164398572545, 0.034701661533462574, 0.021782351862351945, -0.020308680817982358, -0.016830911622128797, -0.0089977505477456202],\n          [-0.00053288722928734877, 0.01181232486259727, -0.0097595448326459004, -0.032900195859997115, -0.040055309118167202, -0.087664118249866321, -0.054682271367624567, -0.012138385460291765, 0.0081352895357042071, 0.058249646659419167, 0.030708308006623514, -0.015344928171805335, -0.017993990035881716, 0.0049203910914597283, -0.013878741210342176, -0.030835237792518008, -0.057101218092033765, -0.032671359607370866, -0.0037749689752403365, 0.046975259888485603, 0.027796476796038583, 0.0092523091282655789, -0.018920714229260328, -0.017057777895009705, -0.0026666003038471045, -0.032119731896417023, -0.044973722999436631, -0.055383689969028219, -0.009123266518274652, 0.042052749594025995, 0.0059455404022271778, 0.052199892821319531, 0.013921729795046189, -0.019417768980458633, -0.0042120805724511906, -0.016059476497225951, -0.019873270609575895, -0.0632108563907854, -0.06190209155478818, 0.010727975525090354, 0.048801088568173723, 0.037392797038495587, 0.0072673632685977124, 0.012809806033498544, -0.0034510716108627883, 0.016898125070602375, -0.022589640104992519, -0.062363076360741024, -0.060954585959324542, 0.018029070106769074, 0.071600992694912186, 0.039034855273469921, 0.020918995904994631, 0.016561765175755305, -0.023866961496342709, -0.027629495788895585, -0.029461697539283106, -0.055111224665105978, -0.068953324385477396, -0.031776432477510531, 0.038108515593093778, 0.032616236844622878, -0.0056891246860652223, 0.0095690633852811985, -0.019286757729714242, 0.0062446121687075654, -0.028641062503210957, -0.044571632732540445, -0.056247188104149033, -0.035749753102891232, 0.073365539091992032, 0.067655332791377198, 0.026480919164869672, -0.022367434017255376, -0.0069125347125725614, 0.0098899156936733956, -0.013395387566733363, -0.059837543834672623, -0.055071395971080822, -0.057234682668758363, 0.026937252303024146, 0.056778003501821217, 0.045512331377432672, 0.010489795280571829, -0.021873444057054492, 0.00025673627436038904, -0.0091984359947323291, -0.0032360325511277127, -0.098453946376152596, -0.056634390573377422, 0.040879143636173176, 0.053707788468343107, 0.021417408905106447, 0.03366002971067647, -0.024266957419143365, -0.039720531313110208, 0.025845458247811957, -0.0036737275747508319, -0.0019562811556378054, -0.092075643980856242, 0.0071537732617090663, 0.048235488203754229, 0.031953649727852425, 0.003989147112834171, 0.013123842004803394, 0.011507174787329752, 0.0048599025473536617, -0.028069938515581847, -0.01371471244881068, 0.0044504142002205899, 0.011633142638130397, 0.016824865792836985, 0.044010419049233987, 0.043598608889422096, 0.010461702283433252, -0.011713831073031492, 0.023350032280673588, 0.025824508444130562, -0.040208662190134595, 0.022221624473925089, -0.018983577713146488],\n          [-0.00012902298195700823, -6.2039143102904371e-06, 3.2701886255415841e-05, -3.1071238546384605e-05, -7.8012389908108104e-05, -1.2260737746391803e-06, -9.3428634947009467e-06, 7.5833942839328289e-05, 1.8838025439401641e-05, 3.8241995713984844e-05, -5.8626520388890824e-05, 1.2707156678677667e-05, -2.0943050504294153e-05, 7.2618095238986824e-05, -0.00010859928908422273, -2.8985456628716211e-05, -0.00016736251968167692, 5.8133891860739917e-05, 0.00011171839620466306, 1.7754895131873172e-05, -9.451887160561584e-05, 2.1444236751338823e-05, 4.6865300624759562e-05, -4.638768128616827e-05, -8.9560896987736505e-06, 2.9042840169843376e-05, -8.1942849377705101e-05, -6.1236466778755941e-05, -1.1152819677964776e-05, 0.00010188996994199562, -2.219289260330104e-05, -2.2868962134298121e-05, -0.00011509542457514149, -4.9758057323850968e-05, -1.9393139160640838e-05, -9.4734362441235842e-05, -3.0802279410412688e-05, -1.1207452486435205e-05, -8.8749274811722153e-05, 0.00013300646840005981, -3.5925271800810177e-05, 0.00013742103255615784, -0.00011808493242440599, 2.241467472778591e-05, 2.3854116688329374e-05, -4.5322376845374768e-05, 3.4573180042879459e-05, -4.6142794075512694e-05, -7.5348994747592712e-05, 8.1387747235452806e-05, 3.3796552020320947e-05, 8.4447120378403073e-05, -9.0274895458430926e-06, 7.0080857293354504e-05, -6.1460029718581055e-05, -5.3967745923230769e-05, 2.2718206186092202e-05, -0.00015616234415340852, -5.6948505482531941e-05, -7.4115836868962615e-05, -6.348787135312256e-05, 7.5446184729599519e-05, 4.4606522477112776e-05, -0.00010450123996736185, 9.5752201968071771e-05, -4.4579197955377237e-05, 9.0414806759177291e-05, 7.3014201662432998e-06, -6.6094432640280421e-05, -0.00017393323793045423, 0.00014375964009427644, 0.00014113080383144211, -1.4170194328547159e-06, 9.805969688744115e-06, 6.5253060614042357e-05, -0.00013047653881412095, 3.4993317070665386e-05, -0.00010216225080474789, -8.4219700147578113e-05, -9.7025062000797874e-06, -8.5183069646590538e-05, -1.8574643331822427e-05, 3.8637504285300153e-05, 7.924976063334796e-05, -9.6774013405367953e-05, -6.2754497545105745e-05, 0.00014663167384857193, 1.7006970539279118e-05, 5.5150673017173579e-06, -5.1711502024315639e-05, -0.00014948514404445907, 4.8590777832147047e-05, 3.8820345659114353e-05, 4.3569583440402574e-05, 1.1474225398808158e-05, 7.3156504448345511e-05, -3.8172280966974892e-06, -6.3707580509990425e-05, 7.2659510936171068e-05, -0.00010594170361082414, -6.3344621752967588e-05, -5.4025363748051725e-05, 8.3061403910164588e-05, 0.00010798285789356821, -1.8400164812460568e-05, -4.9804496028007378e-05, 3.6572621350011714e-05, -4.7481622172728527e-05, 1.7943415993419156e-05, 4.7690435629216266e-05, -1.2465656421243882e-05, -0.00019635305944052869, 2.48024743702141e-06, 0.00015032297597119496, 9.5319611595749698e-05, 2.4341784711353828e-05, 8.4135307912430735e-06, -1.0237800380508144e-05, 1.7639768025006289e-05, -4.9211961308678887e-05, -6.4779795722127997e-06],\n          [-2.1081829939189364e-05, -8.3620881162482352e-05, -7.9323901484131551e-05, -5.6369563666456841e-05, -2.5225019111016402e-05, 6.7038340261255428e-05, 1.8979428320805604e-05, -3.6383667643090627e-05, 6.3535381529804258e-05, 5.820117801163101e-05, 4.1579935042042955e-05, -8.0246257085953183e-05, -7.7024543088595118e-05, 8.015274585669932e-05, -0.00014513612413195485, -2.5225497027576353e-05, 0.00016501583478403825, 2.6271142708690046e-05, 2.5316005334570513e-05, -6.7103148717620464e-05, -1.1803827654757997e-05, -3.7280704814898497e-05, 5.2411115100495795e-06, 1.9188281117332165e-06, -4.1461064150758939e-05, 2.4848310095391263e-05, -0.00010693164000688581, 2.6294649429827789e-05, 0.00024742918857803727, -1.3795393578770743e-05, 5.7821874727727318e-05, -6.3546201653433363e-05, 7.9184859554841738e-06, -2.9438053918515172e-05, -5.1191789614749364e-05, -5.229702720297184e-05, -0.00015826280154122114, 4.4709933911597777e-05, 0.00010006580584785707, -1.5725171825552758e-05, 0.00011394254284542574, -1.2176783409917694e-05, -6.2006183805807247e-06, 1.6735056790493242e-05, -3.2321218056508699e-05, 7.0455310764595564e-05, -1.1204046406237695e-05, -3.7759252495142039e-05, -9.6707313847678444e-05, 8.5280328383621697e-05, 0.00010626012688529703, -7.9059523137930466e-05, 8.7526351723081312e-05, -6.0072534243107534e-05, 2.90057435677212e-06, -2.231589629678437e-05, -6.2577199005761815e-05, 5.1834601699592012e-05, -7.8178877034198557e-05, 2.8746546782532946e-05, 9.1197009731421724e-05, -8.5285435194773496e-05, 1.5505315731474678e-05, -4.3117674284669292e-05, 5.1101985086758703e-05, -2.5995519087103932e-05, 9.5403159591622017e-06, 5.4456486999133005e-05, -0.00012492021323487425, -8.4468616262168552e-05, -9.000869760849206e-05, 4.617292956130177e-05, 7.131283142743387e-05, -0.00011470771088624421, -1.4346991649049484e-05, 9.7453713062413318e-05, -4.1037923649930581e-05, 4.6700567506506845e-05, -3.9864452388190625e-05, 2.8496279151997124e-05, -9.066823994197191e-05, -4.4743333617536891e-05, 2.8884441623257457e-05, 0.00010540785842768621, 3.850540540015733e-05, -0.00015698623100240949, 7.3335058638763877e-06, 4.9803028096866153e-05, 4.7614922439986993e-05, 2.1925161837212364e-05, -6.8629674967009865e-05, -0.00015530778840890948, -3.100212558819124e-05, 6.3968237768941005e-05, -3.1106521259080533e-05, 9.1934837059831501e-05, 2.6946272223389578e-05, -5.4282762803284628e-05, 4.019534042066982e-05, -2.9248092071432023e-05, 2.7237642583656692e-05, 9.8185766607061667e-05, -4.2389429439307238e-05, 4.37933802041688e-05, 1.6481438603041521e-05, 9.6248410750655877e-05, -3.3118875722210842e-05, 6.7699125022684103e-06, 1.8952909147867698e-05, 2.9371419846995129e-05, 1.8803983863591715e-05, -0.00019186119469311551, -5.361492348410202e-05, -6.4625196625645032e-05, 6.2101642194700582e-05, 0.00011142710960054477, 2.7597534422937219e-05, -2.5794525775165963e-05, 6.4102040847752173e-06, 4.3683270110482682e-06, -6.8056030788576048e-06],\n          [8.7288421870321264e-05, -0.00016058377648589737, 4.2400373088111865e-05, -5.4107084248774395e-05, 3.0344295765780732e-05, 8.8236089089935299e-05, 0.00018665417186519012, -1.0617952797905769e-05, 4.8858460377767388e-05, 2.5608835436190377e-05, -0.00010410765791478177, 7.9333875062426173e-05, 0.00011912193130779857, -0.00017617567516805917, -0.00011561862531249794, -0.00015414695744926516, 0.00014088130997128717, 0.00016468128155683326, 0.00011507720929629026, -0.00015709778676884618, 0.00010763417094498772, -9.118060462058597e-05, -5.5086539995887829e-05, 5.9474220836819866e-06, -8.6291073686201622e-05, -0.00012420251221447246, -0.00010346788082849325, 9.3599593697178099e-05, 0.00026254729278605779, 6.4222765577659057e-06, 7.2572661937003226e-05, -4.033497396762134e-05, 6.7905724745284668e-05, -2.93776948290119e-05, -2.3486357610992304e-05, -8.3910324209424228e-05, -0.00020864486749087939, -6.7755590215695969e-05, 0.0001515708034109664, 0.00017533733335889368, 9.5332896045297044e-05, -7.861973811299286e-05, -1.9995583621156693e-05, -3.9618775529985661e-05, -0.00010062395102337484, -4.9007295684973088e-05, -3.3360058372429793e-05, -6.022956312257328e-05, -0.00015274074428942797, 5.8063262650909908e-05, 0.00017946285495735103, -1.3678668845418327e-05, -7.8757246044701288e-05, 2.392826356772957e-06, -2.3839343828305911e-05, -9.248265240540364e-05, 2.9770206634176059e-05, -0.00014104067824765015, -4.8579147311816374e-05, -0.00017751495448386015, 0.00018735013824282797, 0.00010606389466041302, 0.00010933903734035946, 4.3269015151447881e-06, -7.1743566359979186e-05, 7.0321014536656851e-05, -8.93257874152939e-05, -3.4592052390203243e-05, -0.00011018808045150374, -0.00019880825872508473, 5.2018749766881422e-07, 8.5410387895845825e-05, 0.00020004668933091391, -2.2823030905125513e-05, -6.622604266612233e-05, -1.4683429230855091e-05, -9.0830073547348844e-05, -7.0533087103265366e-05, -4.3155104080978553e-06, -6.6612089885383471e-05, -0.00012962736237221795, -8.4205562721053305e-05, 0.00019015519131662401, 4.6517997794389906e-05, 6.5029919190847871e-05, 2.5248133705620211e-05, 4.9506668943670649e-05, 5.4034388762582352e-05, -8.5820743604511545e-05, -9.1440849227466376e-05, -0.00013511882193446021, -6.0564085048693712e-05, 2.1193874455255248e-05, 0.00015210079798582028, 0.00017075069883851484, -9.0844790719107459e-05, 5.4302802042653642e-05, 0.00010180348435486356, -6.0323087261991346e-05, -9.446302123957586e-05, -3.2240495441221377e-05, -0.00012010188056445995, -0.00012404303956506726, 4.4630583568044946e-05, 5.2507061058221227e-05, 0.00017356731784019808, -7.6959696971629126e-06, -2.8710064423776577e-06, -3.4925643861908121e-05, 6.2447442756253732e-05, -0.00017903527875390193, -2.0437146053053435e-05, -0.00018575226473759824, -0.00012521765442334218, -2.4217309442219341e-05, 0.00014051754345432033, -8.2035171331245466e-07, 8.7475802753541048e-05, 2.4934621660151039e-05, 6.4845825162306749e-05, -6.3934442578149898e-05],\n          [3.539459461619765e-05, -6.807572297566275e-05, -6.0927166479846084e-05, -0.00015316315161422248, 7.3480222355239155e-05, 9.7563808442280298e-05, -1.2450172577060936e-05, -1.4500568661798829e-05, -7.3970664566741506e-05, -4.0340386747484986e-06, -3.8654627032383426e-05, 1.4379221778954175e-05, 3.4687131743454946e-06, -0.0001584469264043209, -7.2931081155691132e-05, -0.00011775139382447231, 7.4047592217506633e-05, 0.00013239001684919123, 4.7081715214836173e-06, 8.9098227572539934e-05, -3.4630714238897964e-06, 5.0421055899113609e-05, 2.6442780926408394e-05, 8.6582559483544541e-06, -3.7941259438345476e-05, -0.0001398658685568422, 4.0145443855138518e-05, -5.4757761041059061e-05, 2.303092327018974e-05, 1.535566924483478e-05, -7.6915169280877826e-07, 2.6449624305313613e-05, 3.4036177513768751e-06, 3.916281041301678e-05, 0.00015363454768414775, 3.3088056267130406e-05, -0.00016826406184210219, -0.00014952301925194589, 3.5498105323300555e-05, 4.88793394428505e-06, 4.9269962297551761e-05, 3.206760857812907e-06, 6.9986096689830801e-07, -5.7017488941165685e-05, 0.00012398343835970382, 2.8576108184866222e-05, 4.4996957731510689e-05, -7.6581956260302758e-05, -0.00017982376102392873, 7.7913987986955036e-05, 9.182050843792311e-05, 2.0136049025466763e-05, 5.9720574201015814e-05, -9.1171378305762718e-06, 2.2421059441793401e-05, 9.2991945137864407e-05, 1.5504680551996219e-05, 7.2486851610271963e-05, -8.9180203210073236e-05, -0.00025973470234600185, 3.0931649627910485e-05, 9.1341641323305949e-05, 2.3131495582390249e-05, 1.2246773344729012e-05, 4.2369277568246599e-05, 5.3252080969970472e-05, 0.00012342596764605002, 8.7665076725869373e-05, 1.2940257800994875e-05, -8.4930704521106549e-05, -0.00012907568039395578, -1.2681617590354355e-06, 0.0001043685768841035, 0.00013644771823127788, 1.6057523568244192e-05, -4.4318088826156288e-05, -7.4065080743923595e-05, 8.9411278556494889e-05, 4.0459656558203272e-05, 4.7207547890018575e-06, -1.2596513258189557e-05, -0.00010567536025424262, -9.4991903417787626e-05, 2.7651247338847385e-05, 7.609666823792105e-05, -1.9995057402716343e-06, 6.7764367183351104e-05, 3.5254672333742687e-05, 3.2643123012973674e-05, 2.1440245180040507e-05, 3.8887571817136646e-05, -0.00012810855432182633, -0.00019782945249277595, -7.7662951400422897e-05, 0.00014426765708057399, -2.1274432415119282e-05, 0.00012320100907245446, 1.0102538176598452e-05, -1.605497818817081e-05, 5.7714933317881689e-05, -5.6046568401510455e-05, -1.7521004885695524e-05, 2.7609299548841948e-05, -0.00021782421795693563, -0.00010669318029415953, 0.00020791845527659558, 0.00011483573627234234, 1.3285234615884045e-06, 3.8059477856533053e-05, -1.2194043980374991e-05, 3.8422458442419205e-05, 0.00012682223060628273, -4.4551723471827898e-05, -3.6962727574252341e-05, -0.00019867893992770206, -7.9969698622255254e-05, 3.4788527334016846e-05, 0.00019429872846807102, -9.2258251254903612e-06, -2.1814133753517151e-07, 7.6668947854130476e-05],\n          [-0.040989361407028427, -0.072592926530304011, -0.020477833122960813, -0.025777644705128749, 0.022397648046425161, 0.0030979965185144592, -0.025475041444791693, 0.0014983432415610135, 0.013473198352794237, 0.015343737042018784, 0.013699123091301883, -0.042585561573300484, -0.04138694292044983, -0.088632835869019461, -0.058018494615619191, 0.015073506060712692, 0.0039591744812569069, -0.0024599044551481515, 0.018532342878064281, -0.0072520896771801763, 0.039351067096824496, -0.010583759958094123, 0.031659008994451787, 0.0049459978895588508, -0.023228219899002735, -0.098922351529419611, -0.083752279838564703, -0.038392682480552429, -0.0084343370007130825, 0.0076728523005259591, 0.048785186591904672, 0.017104325073902631, 0.020754499614758781, 0.049112315782768368, 0.05763971849416781, 0.019838597096741267, -0.002711097174265778, -0.10015290955737972, -0.1320216915887979, -0.062977989737248996, 0.025823602205800371, 0.015879808082835109, 0.023625409629796024, -0.0046384308741842795, 0.026114060550781391, 0.091319153616595122, 0.15889496663514957, 0.077891023551431793, 0.095775074298850682, -0.12439872197360356, -0.14160536960462869, -0.075509861563522143, -0.02844030015622347, 0.021985439206375433, 0.015548610852228811, -0.0023889058702177349, 0.034888033953786937, 0.071073458263117534, 0.14647023139119036, 0.20034906031914418, 0.16005422621447674, -0.086760118043380546, -0.13617760143493793, -0.015931290696152286, 0.005887974985659461, 0.0084439895294871475, -0.095816033487544763, -0.06971296020482845, -0.017803306714053436, 0.027850106601549955, 0.099568377990365997, 0.18576028306369899, 0.10917191640951349, -0.064365376981623867, -0.053216331409250542, -0.029502881465266584, -0.0098622631787540771, -0.10680613413351928, -0.14825732796410135, -0.11347081176660601, -0.064061353902307328, 0.0027156666630031856, 0.091809632965261706, 0.11261031536840553, 0.043783501816099038, -0.0270698877015552, -0.022521165339643115, -0.010411461095651862, -0.062429490602539911, -0.078462922695807291, -0.099126684507961943, -0.097931900585343207, -0.053658802519860244, 0.020026860523391449, 0.097467511896917089, 0.045269155637793823, 3.4982892145374311e-05, 0.00096205693095272049, -0.0042046666568070074, 0.012970749419225602, -0.018376496479439189, -0.044256889054004316, -0.076150433998355901, -0.039790311947249343, -0.03211080346166089, 0.060508684856887124, 0.066025243127584496, 0.043696389663569632, -0.0062411434380450354, 0.0065600929269337555, 0.070876692004307851, 0.055992154723297945, 0.017986548813861334, -0.0038241581051177281, 0.011310267599780391, -0.010487970918616498, 0.020902380949651758, -0.0025446887362083059, 0.059004430404734909, -0.013398145289176891, 0.0035443428720070419],\n          [0.030346036175779943, 0.0060729291720623552, -0.039343234393949156, 0.015518327303993051, 0.026091031799842485, 0.05707488929867742, -0.0076810101047968676, -0.0080709248858639449, 0.016419173022353517, 0.0028420019312691766, -0.013730810525757281, -0.01952233856199849, -0.016220877105556714, 0.014953867372257727, -0.034021908696086872, -0.013762279640316323, 0.024752967636295586, 0.039530055629976274, 0.0045832864073847429, 0.0083765062096497409, 0.036851407285838494, 0.055084117544986336, -0.056975578544102429, -0.029317707997872627, -0.025594697243718541, -0.0209462093989107, -0.058040406822408838, -0.013577428197324267, -0.010020990828990349, -0.0018451035217218088, 0.020025419779784451, -0.0075917489409040063, 0.015631011927141059, -0.082665619369575963, -0.080551448664543737, -0.050440509420469251, -0.072777006043539996, -0.062636415930186193, -0.071288814601525669, -0.044269272303937818, -0.019290397771040843, -0.00063643565990734174, 0.035648090161244705, 0.0080665566901492874, -0.069973032306163641, -0.072405787021877846, -0.062813161592231409, -0.060859099341869331, -0.10296927011026999, -0.074726837298926568, -0.077151004103565929, -0.089632117423250057, -0.060207561869611841, -0.036005373570064905, 0.030580152351007542, 0.018237066287994937, 0.02174043579052555, 0.026790712318865414, 0.078394679005428389, 0.079774453891859387, 0.048844596953047867, -0.011284404445060854, -0.042892655919123217, -0.060469291421125677, -0.07771702221123683, -0.041768476829136147, 0.11044800435479082, 0.084453033189816312, 0.058716658475689382, 0.11796990936830279, 0.15001483899962584, 0.14682265151923721, 0.13948544434843163, 0.071900535535049409, 0.022951582623399639, -0.037573009410766148, -0.064497267516120824, 0.10514145685057832, 0.014295615161356343, 0.047946276454789161, -0.018432919080500723, -0.0048603160651503538, 0.039432239140443998, 0.090925443024842678, 0.075278132366418865, 0.081170655224668736, 0.0073833672168802864, 0.00032987076164094076, 0.022814449998299069, -0.0086827680648501639, -0.048521183046406041, -0.019108747944309772, -0.065560745830540057, -0.080182991518368607, 0.0032263375068990836, -0.00099658547565971249, 0.052424135738000213, 0.022385739723059378, 0.039120492922030209, -0.031163626046383244, -0.063939589567716518, -0.07911716509669843, -0.078917040495979945, -0.058880520828822197, -0.10110781394222774, -0.05114064572351204, 0.014884135572375071, -0.014461306825219532, 0.036091619454282908, 0.039865935139445363, -0.028625117209377549, 0.02387850967371026, -0.02520581913037356, -0.023467115929623323, -0.076187598481757157, -0.040233406732182481, -0.051995660903622447, -0.040468336476741307, -0.026854374302776318, 0.026999904989888759, 0.070255583454977802],\n          [-0.0028030032154688772, 0.040758904890067268, 4.1767863328545651e-06, 0.020260138546443159, -0.0059647140070275915, 0.05181012213641132, 0.02634646200863381, 0.012264698464511966, -0.010147315743495306, -0.03354793984589477, -0.019732136738390867, -0.0022577603782329772, -0.016261980311150601, -0.017314099330176039, 0.014344127941805743, 0.037970408394952859, -0.01383697548566333, 0.016742082124341348, -0.030123200807178369, -0.027735921784170836, -0.002268324918850477, -0.01917565837724932, -0.015693411602399308, 0.013113857326043843, -0.036320774018331614, -0.063043192413591909, 0.0049614486973488248, -0.036804629569037517, -0.037438386219278155, -0.023603350699011483, -0.0072298451341650145, -0.059868515686104032, -0.041755559167967415, -0.034103966764113251, -0.037695383284049352, -0.019865628782664548, -0.037320716015948836, -0.02961465787379973, -0.062378820692505714, -0.077726227410309545, -0.064330260920173826, -0.067627424844985615, -0.066911336391702644, -0.051813667955715265, -0.064044427932397077, -0.040497690544443715, -0.068570648963837993, -0.064781691548234432, -0.077465204305072172, -0.059300747266943024, -0.045729121636768441, -0.033973317009316689, -0.014236662779295712, -0.0051403679981302051, -0.015748032805591644, -0.12090686617751288, -0.11592358261333773, -0.04603582196444924, -0.026967258372596087, -0.0013908674792289851, 0.070814456498094619, 0.069291900499805825, 0.071816590137885883, 0.074605172083137966, 0.095414524189679439, 0.10748657093841106, -0.095995837009767118, -0.0040975794639001714, 0.045306386276777189, 0.075554395869981195, 0.11845891486270177, 0.084776040800571786, 0.084263987235035837, 0.10125452225992537, 0.073977388593481214, 0.080838313693573999, 0.054211476638108123, 0.020058468071589643, 0.071877396983204195, 0.073614039598840109, 0.090269964916123019, 0.047955914710934591, 0.043147097517420303, -0.0011985739101095343, -0.013094268546257911, -0.030256147604258272, -0.0095366918389557919, 0.016708576234233975, 0.061142458735716491, 0.081217451112605782, 0.010385841248297306, 0.037777595415280037, -0.018148165795748364, -0.025190339821193043, -0.047771796894360688, -0.061855276889718092, -0.053652712540413733, -0.051551732136435637, -0.034374232230165572, 0.019703032705119687, 0.040214664876207923, 0.0094462636189203749, -0.022748100395121915, 0.0069180366776436381, -0.015913447714255638, -0.02702812779628725, -0.014329312669455431, -0.027715089020423824, -0.062068298599209024, -0.062014863808505023, -0.021183572775251798, -0.039143122374945834, 0.022829943433131737, 0.0032038909949711619, 0.00034299573515796187, -0.012230615709466378, -0.00321123286886877, -0.025262706824797615, -0.0022994727249915775, -0.027050395247399217, -0.039549420763164561],\n          [0.065220937475473084, 0.025071384298351367, 0.019912107113077518, 0.019312893018644271, 0.022456599328416219, 0.038123430189094545, 0.0055996572848110715, -0.012446229774174283, -0.020127115717722095, -0.019608397123268811, -0.051920391537350181, -0.003802076622644604, 0.02754021132514629, -0.031394259292046901, -0.018499328737516675, -0.028503473075545686, 0.010984204362234747, -0.0021914954953508982, -0.019643099824274573, -0.042421207289507476, -0.08150780546124696, -0.072243889331467748, -0.0017841827891482871, -0.010892973047937691, -0.0094800158033443715, -0.0041070641350081693, -0.031710787864217896, -0.025316943368023079, -0.048904598523338408, -0.039097937616454012, -0.066266518850005215, -0.057170442088922122, -0.12354156377380103, 0.0019260014740339094, 0.010454913576309843, -0.047326416677592284, -0.01495404872484582, -0.014952122468299345, -0.060398890698931722, -0.051481889909297689, -0.056998707528354522, -0.05627894012903209, -0.0082531761509003106, -0.0047280014663064196, -0.024889267516539609, -0.046324614411320443, -0.027070396350913073, -0.03551136665508927, -0.041562027780064917, -0.042411071747144299, -0.058674084084012826, 0.022288023763534795, 0.042564482569643847, 0.091510651781399763, 0.10752994926292046, -0.023190276830083741, -0.016616935256775666, -0.083807089690502004, -0.058259488808172902, -0.07074223249458611, 0.025573920295602542, 0.11913595016311473, 0.12549016018794748, 0.12135882291557651, 0.11708353956070845, 0.086422717935291424, -0.00030667403806635199, -0.03844014599380597, -0.049405321408958772, -0.092975443881900155, -0.03284956400921088, 0.10352519252428011, 0.1495830558840523, 0.086083576215801955, 0.035830958340715563, 0.024742932326467473, 0.036726117488561486, -0.0024422161164114609, 0.00040112728912663695, -0.052518659689077332, -0.044570270280448174, -0.034618820381680696, 0.049818549902821328, 0.0024548081543993572, 0.026915963481285166, 0.00043142435222983527, 0.012653778112578708, -0.051855646667650884, 0.030046740129158762, 0.00061640821688112302, -0.031155023683595174, -0.044323068746703012, 0.0045373176149612893, -0.0071958412445839864, 0.0063657993250404304, 0.018539257939901993, -0.030330920312567851, -0.031773666542542808, -0.0088228132461829062, -0.015163459489751625, -0.058175569457230444, -0.0040183309769827903, 0.018491731360507427, 0.0022898116286867859, -0.025630328318981953, -0.031896766124389749, 0.020493167081276655, -0.0060866772039110534, 0.0079194766798410254, -0.020676688933417536, -0.031624660983727432, -0.028353726901198459, -0.05878024973072718, 0.016740816129427953, 0.026376082128799203, 0.015891236744592419, 0.048440426175221846, -0.0032500905630761939, 0.0044459428797915534, -0.016655671281387799, 0.0096495524818720826],\n          [0.038712194178439893, 0.012490504356042306, 0.025251907017849726, -0.00063429003793935568, 0.03592838646617745, 0.023762703799074122, 0.040774989926937774, -0.023414811564391472, -0.048639833740482294, -0.050012993742178324, -0.064429231547649846, 0.021779562035487404, 0.049861519461227979, -0.018288852383901953, 0.035889988699122341, 0.020066404067603016, 0.049563142262502483, 0.0077522337501277072, -0.055571126615815716, -0.068510835596184025, -0.057716925501775554, -0.034900580413033497, 0.021956366706459132, 0.035414544709005326, 0.026124404566658876, 0.0017094541674472288, 0.034316099935257596, -0.027522376974677576, -0.099289021369931285, -0.072699424099411505, -0.040033682201417037, -0.0025525135698269523, -0.002910098811699801, 0.021515199868527068, 0.040227070486607036, 0.036476407601091332, 0.031515192940717834, -0.0086615704493458838, -0.13841198674869082, -0.11458519361763039, 0.010450235100959555, -0.0035535572148689162, 0.071253276886399569, 0.042723571343138186, 0.0093416587003654419, -0.012870114338850977, 0.032545576670786378, -0.015625402120347201, -0.1166589992557556, -0.14109288836317121, 0.067348402717295516, 0.076093181341659599, 0.11561514970947856, 0.050225495205762929, 0.042124269950079882, 0.02144480828358869, -0.0084782658103722819, -0.012099681800612577, -0.03095626225613321, -0.11121071517451651, 0.08286092692880892, 0.14790102050186232, 0.10500772996280258, 0.046748436389971462, 0.019903102032436296, 0.030520336087391395, 0.018229439697434548, -0.010089005330986278, 0.001308077365090185, -0.046366176234370893, 0.044459976275507344, 0.10593917475179987, 0.079518755787114162, 0.019359952078597017, -0.005288773156741304, -0.072262116264494303, -0.063106627791123013, -0.0032666604463477689, 0.031860165644442898, 0.01864598039125592, -0.012064807733087081, 0.084958238907565181, 0.04802342664859964, 0.005601477454409115, -0.071195354950384843, -0.070333235397725374, -0.10990854275232402, -0.1177120894307484, 0.019377435122344126, 0.026706728888751419, 0.073583862415767962, 0.054153278022732301, 0.025448394821031554, 0.0040382013610863465, -0.054678863283269957, -0.089932995823321094, -0.071996417021936918, -0.062770298499433386, -0.065225875464714131, 0.038396171047075017, 0.016151719170832315, 0.027022919493260036, 0.082904215002364987, 0.047186912351547414, -0.0007951610725080438, -0.095891032022590528, -0.049461949437344832, -0.072304694379190848, -0.011679870201172761, -0.03019370550552411, 0.014156325508013962, 0.050859597296224669, 0.039189955160956538, 0.061498796624547394, 0.022736333947648714, 0.015951433136659473, 0.015999485485705945, -0.043222982001008485, -0.024248450132379966, 0.040111753431796314, 0.060524773249175837],\n          [0.0024768759755275302, 0.023654123616632314, 0.0065904790765780874, 0.029715029129248505, 0.016981592598277626, 0.035002323306005056, 0.015060065696298572, 0.0023775406467376609, 0.015462766613147202, 0.0082508228535331379, 0.045204211891526569, 0.029099062971049541, 0.037371073946768252, 0.048546717205389139, 0.039674546516756559, 0.025867829117725033, 0.014831551938788254, -0.0075820940876098059, -0.020930287111501134, -0.032499439495609725, -0.0018020463301167342, 0.043937967078790628, 0.028725701880571525, 0.0010439011442610552, 0.042588108222669757, 0.017847587041736074, 0.0022798348220216258, -0.004587349161816804, -0.0088422374374940368, -0.040477333059008636, -0.084833179199067868, -0.075253592768237038, -0.043639965989430526, 0.048831110435565261, 0.031624229858512876, 0.012489522167499711, -0.044447404162642853, -0.023793861367563091, -0.09439256686884244, -0.072032359608776186, -0.0647083446116518, -0.064216711834332502, -0.11171103897265756, -0.098730030535537361, 0.034790924045997138, -0.0062696265352133948, -0.037764001610176845, -0.066031600218691366, -0.085654849487946563, -0.056461446300125208, -0.067826191654306867, -0.060587570752587347, -0.060359414639319361, -0.0751011736397387, -0.11166068555690369, -0.049682643011916917, -0.032238361809498267, -0.086484331579425255, -0.054274490762439093, 0.010712582267959646, 0.05148433045951871, 0.072737308199540607, 0.066174010870382105, 0.047052504278498768, 0.01457256785498192, -0.037236312562938446, -0.038926353894852897, -0.045892840879106347, 0.010370006985215077, 0.11284308997633244, 0.12481359471847972, 0.11597764568809359, 0.11519355137781671, 0.11439984797014933, 0.11282552440063413, 0.072652367921491337, 0.069633041676226207, 0.01208106094914059, -0.012907318992784259, 0.078196952096765804, 0.084842433468674594, 0.025448732267674412, 0.03331830161640717, -0.0032466624596392407, -0.00077916004722033971, 0.019237134849348372, 0.040467729220002191, 0.081825040597662269, 0.032173008592532942, 0.0072246459578335781, 0.035145895408776745, 0.032218364331414756, -0.004156953045711051, -0.032283733334807226, -0.048063813532225441, -0.036307980564993167, -0.0088796328542093544, -0.05064778668384444, -0.00020999998824228205, 0.029706187708307435, 0.032099114896280957, 0.0077899941541672846, -0.0059912168184391018, -0.037977889970615276, -0.032942632694837909, -0.074827929106081326, -0.08659379822525845, -0.070294616151199862, -0.021597866813346515, -0.034674752012622045, 0.039149518450188769, 0.016074895570088787, 0.0072486058613543264, -0.021666046904459044, -0.015742207167039945, -0.05712862549021637, -0.069825857774372807, -0.04304681823818908, -0.00021744057288860825, 0.0031613995838588056, -0.005483972769325985],\n          [0.0078584091809587239, 0.010417579110589992, 0.015826355571398901, 0.027799757333554075, 0.037504301634208481, 0.021889790101079235, 0.038404904299075615, 0.033823662292883222, -0.015110545900434889, 0.020273256963547384, 0.032943002507679647, -0.0012523671626505639, -0.020725236647321815, -0.012427007685905524, 0.015267851215295052, 0.015474020823992577, 0.021471502743067288, 0.031768288951377815, 0.012185070684608057, 0.0036406626398330366, -0.0025327193617110944, 0.0078853574405562885, -0.042335704666714866, -0.056683453836849029, -0.026575160075451746, -0.028598384095741225, -0.042657752775160783, -0.041423915179024752, -0.036798184223634865, -0.038262807915101713, 0.0019026661303272879, 0.0093814405628215997, 0.0084715945489586136, -0.045038182654970449, -0.075791753641229712, -0.059375219468428109, -0.061831665311961263, -0.043298853126234195, -0.043800781365845892, -0.051617842166787962, -0.06561103766772261, -0.047247281088380666, -0.057968313986108362, -0.0096926997405703125, -0.0009781358811463553, -0.0011437786713959204, -0.03286534603195844, -0.03543397020422262, -0.072328933800212672, -0.040236082624187208, -0.06694954641402831, -0.082126388033458689, -0.062803853478933039, -0.081491583056840441, -0.067532179029439018, 0.09455840560652598, 0.050160391480084388, 0.085678836867230254, 0.046323368625148131, 0.055992607831429286, 0.048911953221190102, 0.031194793059301035, -0.0026453507092326911, -0.040343576884242428, -0.097032593515522902, -0.10038707585163729, 0.0739805809466271, 0.044680789118382247, 0.049529551721828768, 0.11289040045432666, 0.077052640980907514, 0.08763910565106886, 0.090660770031109728, 0.083977779480882225, 0.064049007217798604, 0.02432712562725322, -0.042320375772835706, -0.0021388818804320281, 0.0059538906304443806, 0.0021758658789993446, -0.0093587766742978112, 0.02428998075376837, 0.02607694341280449, 0.078772783324117121, 0.091982202732447615, 0.064361385528919693, 0.081984130680270037, 0.028646331657783269, -0.042604626187250638, -0.039659301448687317, -0.023542389520778348, -0.044811266972915445, -0.037047417039871328, -0.027700762351676803, 0.0033550142769088881, -0.013100169049559234, 0.05927068198924744, 0.0462821833376071, 0.087354800090269857, -0.053790152494941693, -0.052155542043995237, -0.05679486910467426, -0.021944281329168733, -0.031143592336575283, -0.032408839769337699, -0.013571281557370071, -0.031193974331133204, -0.024377807778057786, 0.029148757012459989, 0.030672698641111273, -0.022977914200020516, -0.011077006000089942, -0.005511238658071696, -0.016195245042137235, -0.010223061193558224, -0.0017693869577628148, -0.016982213231712635, 0.023120107237225143, -0.0046448944161024547, -0.0051816660513786528, -0.022733320422779334],\n          [-0.0090421114800203067, 0.017452648291795582, -0.017831824210342989, -0.0037291040947286724, 0.039064969998310481, 0.02317336140566292, 0.017934159994940135, 0.013098455548679191, 0.045167700869445056, 0.042194405025245518, 0.040022284994525766, -0.12964953846391289, -0.098695979295591207, -0.057791701915265933, -0.036039163287215216, -0.028193969502811, -0.0054251636725232699, -0.0069512490121659137, 0.020700356583589666, -0.027658839175524981, 0.015383455695099066, 0.029921130490476885, -0.10604073203109947, -0.13745243530604678, -0.10216024104657673, -0.082044560977983155, -0.062542359265559622, -0.0060266314348334099, -0.034856310541847978, -0.019904486880246444, 0.00031967817856416725, -0.032389674206707089, 0.02439765120257871, 0.10508921937209786, -0.013046874416846273, -0.077743955313128527, -0.12222903080184096, -0.11250348266352571, -0.074496424196395211, -0.056697350656609337, -0.041103845003295766, -0.036650131470619435, -0.010932005853568957, -0.016449841939567944, 0.15622348456563409, 0.096726642307413055, 0.054041690574303913, -0.0030989655565997892, -0.046208134463465035, -0.065923493353222368, -0.065578917403099152, -0.059507067127686442, 0.0088062798799869793, -0.037442732388913005, -0.017902872235218317, 0.092956218539764199, 0.14428628109803446, 0.15460969896616991, 0.1048812845736138, 0.074650094161246447, 0.031358758882895854, -0.04452428857515188, -0.028002592637281058, -0.074285506534393586, -0.017952472566438823, -0.023442772221301825, 0.00067036565834080464, 0.048256451782623298, 0.064112377935327092, 0.12605612565913182, 0.11963258828536688, 0.10488112893887513, 0.033679327685633892, -0.060980339086270673, -0.043663902054247729, -0.023617241119377099, 0.010588509810459399, -0.042280794649115334, -0.020903906039379281, 0.0042454596033642683, -0.00023866951219775334, 0.036855270749386923, 0.064226116507300965, 0.058946958099653515, -0.0015713950413312611, -0.0095707447875607171, -0.013147541392034126, 0.01220983149141934, -0.05139007557791643, -0.055205672622494331, -0.033651076834393279, -0.030728487231012208, -0.0069395759324256887, -0.011575545867157727, 0.0073685965063561426, 0.069747145603705707, -0.01352110025060841, 0.0065960127234735433, -0.019525371968609762, -0.017643912421121496, -0.036983208587429477, -0.032526065041563926, -0.059542328663049392, -0.021432558932001102, -0.036208028263420761, 0.00082772178238150421, 0.048327127751533125, 0.057950807377417229, 0.00157328627865716, 0.0068908384829364025, 0.04482168429267052, -0.0029221677687706754, 0.001555929650738838, 0.015954469458610742, -0.025599595653019336, 0.047827295986180768, 0.0062288949733256688, 0.021267131642709981, 0.057035735175472703, 0.018964085848628326, -0.042249457791622765],\n          [0.082567408275720941, 0.055832613072691675, 0.037656390091085033, -0.025000895212346053, -0.028412812812500174, -0.050161619093851889, -0.064108798123226451, -0.085322773771942473, -0.01353721252260974, 0.013708942774828675, 0.018599027844067556, 0.075347485030620276, 0.062559343055246922, -0.03128511392926582, -0.042802981085729774, -0.031429420711545787, -0.073826763416081242, -0.024221657973838032, 0.0076412601149810772, 0.024211901395114054, -0.059471082878315346, -0.030880411920166984, 0.067967009546189686, 0.04082287464016688, 0.010013710465744799, -0.076238220410531951, -0.068200014146132609, -0.03367028790032036, 0.0026545839293711116, -0.046483364330604897, -0.013765405332683583, -0.027634708597073385, -0.061826223020465573, 0.031594341220290985, 0.021366233937152687, -0.013394045470305607, -0.094757756449669439, -0.049118966746885373, -0.045552478080449647, -9.1106347612770686e-05, 0.0079383464198565928, 0.011254760704320157, -0.006576707889103077, -0.047661893009333725, 0.044446166087195968, -0.00093206421252194083, -0.0095390604213271557, -0.050732858964937649, -0.086831280616566725, 0.032526279694198093, 0.092701707289924745, 0.0094083798882231232, -0.023484064976748834, 0.0092934449765007306, 0.02279135558872019, 0.039002806478279112, -0.008609839726177404, -0.034767835308972636, -0.031883916942249346, 0.066428675225469649, 0.15091207989976943, 0.13215693372891743, -0.059200843092382029, -0.13695949641012162, 0.048045367981310844, 0.098721373524397166, 0.012407354261466811, 0.015256770812382667, 0.052010168560839946, 0.10320819909661162, 0.04245915005083583, 0.088724399991559885, 0.068938951136573001, 0.01700823743506874, -0.085317525028892435, -0.018126337068159522, 0.1151877033509508, -0.02501683859550265, 0.019451431676204792, 0.022494547242750674, 0.052600283738925238, 0.03386730293679828, 0.032216970357249304, 0.059359611168712786, 0.014140731647494846, -0.025091371779791677, -0.026683396681205493, 0.040958328581346411, -0.050855525747530585, 0.0049323754481217317, -0.00049816712567916054, 0.0165528823762962, -0.0059580238260248993, 0.045306611135122, 0.057897639956120503, 0.042726052702478742, -0.0017969310686201884, -0.014382085486339657, -0.037002141588783934, 0.025110698146086761, -0.00016281815464665172, 0.024515446575861129, 0.021258758684308279, 0.02440056095349824, 0.036876396850616146, 0.039422926098447282, 0.040371042135130944, -0.00092562301771988154, -0.0052628779193808206, 0.0093270497285016501, -0.011241199658509435, 0.0019912846764176652, -0.025004542955752537, -0.0056085835864598393, 0.014352464943112106, 0.050873140541023154, 0.10004246984101947, 0.064681249139415239, 0.046195695636661947, 0.069300630286532647, 0.029510327635330871],\n          [0.031888415387708945, 0.017285328668591005, 0.042744527705477556, 0.03122774045587115, 0.025513813891834124, 0.023253690464280233, 0.017244825416223117, 0.0091143993389209352, 0.061254787835178667, 0.028607811797974354, -0.017058017936675305, 0.031260250011373267, -0.02279872758399017, -0.027837704295921042, -0.031937522919072092, -0.0079426595101877613, 0.0022781874855602822, -0.0029790518398695341, 0.014262174386869931, -0.011888449098713878, 0.10179674598415357, 0.017490236098508173, -0.02165996876082555, -0.029500462768637277, -0.017844168428477268, -0.0065925436789264179, -0.055317992740958985, -0.009073270159867055, 0.00041946738785142434, -0.056492643690931717, -0.073201827719489312, -0.04664521751707891, 0.062081869164307177, -0.03133901253116169, -0.065409572850245706, -0.026259743760947321, -0.028514182658014458, 0.010511476228221489, 0.02613935213955948, 0.033080893278420273, 0.010410015030915412, 0.0083593994733951738, -0.066648409600459646, -0.061126901668253825, -0.060660381708882702, -0.029413222816308055, -0.014383044755888905, -0.061112839649371503, -0.086766346192871005, -0.11103482776376336, -0.09555898737155176, -0.06964802327565453, -0.044427747427205108, 0.025755829147256798, 0.0069560148421303133, -0.081587604416162807, -0.10519239832835522, -0.071335786418767255, 0.00057041734117410647, 0.01381305071587418, 0.02671011460828427, 0.049812200550972158, 0.093581918010311488, -0.021925041934278508, -0.055497660342767811, 0.0065150133739862448, -0.054554119234424388, 0.00830487062795153, 0.13185407364756932, 0.1221341345788353, 0.011707416843401106, -0.025907153899071139, -0.024819747703220919, 0.054010873733490401, 0.13634127194350476, 0.1239665593358083, -0.0094684152953362077, 0.082360263679196688, 0.12981624266421773, 0.03824468200113923, -0.028862798409555725, -0.012401760304334902, -0.029028735431258695, 0.0060991842887090728, -0.0040297230866682713, -0.04688451714216009, -0.0033330755921011992, 0.055326238808625749, 0.1303088292739335, 0.014467140584733071, -0.059526756731551528, -0.024457345180703714, -0.0011606998001983324, 0.049886658808720834, -0.021188637788723458, 0.0053422931322432837, 0.019766544177656983, -0.075051486751190319, 0.0555814059557561, 0.11043646644803568, 0.071964938687580013, -0.090663298598382638, -0.035117192369403236, 0.048069490373574331, 0.041133552052815187, 0.083493841136462049, 0.029110800123453531, 0.031266615170663099, -0.039507972523892779, 0.027490662445642008, 0.092284055227579875, 0.066698389632811675, 0.0046770738712216178, -0.057627559498254564, 0.035842091912123522, 0.082677685179469218, 0.097331854898258463, 0.050682016519834582, -0.010180548751966102, -0.033100630833083927, 0.0060053227921194573],\n          [-0.017680769530502086, 0.0050575359825280469, 0.025215835784359819, -0.0050258332473204909, -0.05703325304593862, -0.052107314429079093, -0.045596915669796345, -0.0066502467091907602, -0.0040890258536624702, -0.003602657066238215, 0.054264533749242831, -0.041054754537631868, -0.0014472636395811613, 0.034596974606557113, 0.060835620970621208, 0.029247288961593898, -0.072140352884815212, -0.079672750193131428, 0.0063943947450929156, -0.00075078758391063094, -0.0024171227661776481, 0.00014142207761613443, -0.071900657382605787, -0.071309977692602319, -0.070946767853089718, -0.033682470049253795, 0.059045673260628345, 0.098589338565389609, -0.0012453848467233811, -0.01886197406327271, 0.070384962538390106, -0.0038593266123758303, -0.035716458393740325, -0.028903911986307623, 0.022169135417800519, -0.0056379833253350636, 0.015211997809574936, -0.077801426518747177, -0.029803914664715693, 0.019461806372238301, 0.066876022242886704, 0.074347040390291497, 0.075531131612437005, -0.047354917440969799, 0.038231304234948887, -0.014507685304722101, -0.088435278499214176, -0.10062367804515003, 0.067343499222200565, 0.024924241317476573, -0.092546195735034087, -0.014997924286342293, 0.027950457247449642, 0.066063768451511823, 0.021890400355813813, 0.13086032772885903, 0.090325158487119389, -0.051343743059489008, -0.10634460607642149, 0.041577154860304527, 0.18956400875634438, 0.15361519295302384, -0.11769518397502723, -0.063931131406821079, 0.053765417183016397, 0.012820707173704704, 0.167023415641573, 0.091883459451496383, 0.046064066872463991, 0.025159894360370735, 0.071125103615519797, 0.035423035999105047, -0.002838856695844709, -0.062881344605136932, -0.078523790463108811, 0.0060488942027592946, 0.03132431227969934, 0.057799944092782066, 0.035258713861660206, -0.015525519214079311, -0.051490678426958481, -0.070998438684272358, -0.088339548926410272, -0.063258396382083443, 0.00058157944958722729, -0.016398858534322075, 0.063472042872487172, 0.059448129985677542, -0.07202298014311552, -0.020115104672309998, 0.019270115460302426, 0.043044608199681589, 0.00016106438180805288, 0.009691999561702698, 0.0068556383978288504, 0.049380946460201247, -0.0045235379987111357, 0.032977942564106202, 0.0312528099407361, 0.056899719241569002, 0.028262649207511509, 0.035152375519136879, 0.035461884262258922, 0.039852047474645012, 0.019659199103084442, 0.033958299060307638, -0.019839700512063366, 0.059036824142858109, 0.0097260124868806426, -0.014938126441501644, 0.019066829899126298, 0.070681909220785974, 0.067102293590922832, 0.069012992594614686, 0.010044929257701042, -0.0063893114284036059, 0.0050956154428648042, -0.045817829646248108, 0.058780525393498484, 0.015058802906741012, 0.0093868702997460529],\n          [-0.059247418607529398, 0.0021432691584650498, 0.003053764423463598, 0.00585551031972327, -0.085630217055580576, -0.071756493495543111, -0.042450305971163171, -0.042689147138431187, -0.011110262401512888, -0.0079405339217739623, 0.027079022725668131, -0.027546655085047056, 0.039877525719018654, -0.032474059766464794, -0.046922091139332156, 0.033617721815522757, -0.034287802568748103, -0.043372117290399935, 0.041613978045622203, -0.043095118331613398, -0.010110834614272646, 0.022894839712910425, 0.075386609934159521, 0.009212959623099537, -0.08827817592255309, 0.037397659635345859, -0.0022263066749607652, 0.0099245075234207572, -0.020030347390232447, 0.056811150198365509, 0.0073928398206897228, -0.0781863011094375, -0.0081464259829627586, 0.079203527612630331, -0.049193984035058869, -0.10782004673639323, -0.041093953548195783, 0.036883013437131441, 0.037669473568050518, 0.013220385631969353, 0.053407888162839971, -0.026733606753513141, -0.12858397516523337, 0.021075355334599859, 0.12903555239275516, 0.017326720125844478, -0.14567221562979574, -0.082472121566578308, 0.058956938749701163, 0.11485586936136895, 0.1285955897812025, 0.095518552742746426, -0.061066124259299644, -0.0067976743155836045, 0.11055046294774236, 0.11155870568673898, 0.11891259668944891, 0.017851730403568578, 0.00062816999621169434, -0.005602233426512779, 0.077624806223943812, 0.060406967434973535, 0.059516586297504614, 0.027001848941292254, -0.044412198771888872, -0.02565017828887654, 0.068363333459277184, 0.063020564366818924, 0.059444497458773948, 0.010334144455870962, 0.042110605756137134, 0.0154145426818727, 0.0023343740302978946, -0.027062765771009509, -0.053547005048963876, 0.024499224751391858, -0.05226763051205905, 0.088856993121431069, 0.023557929383932572, -0.013779427079024981, -0.023579161648517932, -0.062755190864561161, -0.078234101715106377, -0.04428664124215103, -0.05597874471510085, 0.032155339112342099, 0.054400692992883637, 0.048229610031197051, 0.045141190902855795, 0.038704798976786192, 0.085911390919109945, 0.004357866690440651, 0.012844338732011615, 0.010882943225392516, 0.028932161983739102, 0.064841494314718556, 0.0083150497181525597, 0.028736590709835023, 0.052023311678142746, 0.033414052448422112, -0.0015520060820524428, 0.042606687446733821, 0.022301779226108837, 0.022174303630313905, -0.019435737837121839, -0.00050395773291792012, -0.0052139822121909096, 0.03017407278550048, -0.0046409824519108023, 0.049755854435395347, 0.0048321724860692639, 0.052625745447092698, -0.0043469856762714323, 0.024475775577038505, -0.0014550689238583339, 0.0025587670842842497, 0.02335062238389126, 0.00075945420194640373, 0.067061312439412685, 0.066720064906692217, -0.036179831263457696],\n          [-0.057111668714524069, -0.031888560395926815, -0.020364646131771198, 0.0031373605136144483, 0.013436737732060224, 0.0059512553325854946, 0.0080221362250533727, -0.0033221874193103476, -0.004827846253580151, -0.026659247927967398, -0.062783175554247617, -0.076967276770677301, -0.033637293299445814, 0.026369958665574775, 0.013899807316877229, 0.041920953666546329, 0.050480088450960914, 0.040061952380199911, 0.044564528130835168, 0.0069941117747924636, 0.03093737186111541, -0.0062436290541180578, -0.046320908761036353, 0.011237053256609078, 0.03625881873734127, 0.008296320294636228, -0.10315152186935141, -0.12978400882646329, -0.10762360396379125, -0.028238442365860296, 0.077774908415915764, 0.057645200841886443, 0.020682314424331508, 0.015698799166135785, 0.023614524698368555, -0.041771874129604925, -0.12746951561572256, -0.031282550658931839, -0.012702497649368927, -0.031002821266721811, -0.053233125623346492, -0.11694882872058675, 0.019915333787276241, 0.030434079899803762, 0.034286620375398126, -0.042572007349056584, -0.084215624143568424, 0.069861287834688535, -0.012204622606775559, -0.018891406834175561, 0.019639551076716097, 0.077724504862555804, -0.080366494513686909, -0.015106150328832637, 0.034588469301179037, 0.11597907830248098, -0.022649572331124024, -0.10542134577114659, 0.064909164241530898, -0.0032238315195849358, 0.10106249830020778, 0.028244619862228884, 0.13831334399041184, -0.029406130060508649, -0.1747975534137946, 0.10110596129570967, 0.10656117039170004, 0.0077235863703064567, -0.14344418956701926, 0.050109495007546564, 0.086715745692903579, 0.093089685501030639, 0.12450293694496621, 0.12884230003597821, -0.070419779564091803, -0.12323154963040814, 0.070753486613016892, 0.12050632408764064, 0.010233622798694719, -0.097733233903663133, -0.059331174485382117, 0.058782895880653968, 0.085326083200578981, 0.076775855235002285, 0.029787153121228482, -0.018648323277872803, -0.021041250623019279, -0.00034304860813555438, 0.084298241516976985, 0.056835020648177442, 0.053326494938013475, -0.039638663459144921, -0.0050145752734991195, 0.013779029282405111, -0.010485661499173113, -0.007234560404816931, -0.011950044363487594, -0.002596863452470205, -0.039481955312791167, 0.092829813875564882, 0.04294346095881349, -0.0075415218000726147, 0.01831664591755916, -0.039130110094255752, -0.041539280566723305, -0.027051679902780887, -0.042059150111380464, 0.051858253540492213, -0.038626104291501345, 0.089621659475075818, 0.071389073995249491, 0.086449311698936798, 0.055650817209077025, 0.013638815876452798, 0.017995842737628248, -0.01801617871484959, 0.063458705330672521, 0.053363636563368205, 0.074742248974209113, 0.070779246477809463, 0.038021312100079668],\n          [0.016782329804763754, 0.022184009254756339, -0.017610151854017764, -0.083789286898927368, -0.061012255632239214, -0.049436805730274716, -0.016010628978889538, -0.0012930764671227057, 0.018100227337522104, 0.042203188910774361, 0.091115107725438613, -0.030973163753086161, -0.0032195286052498912, 0.0016759860931787329, -0.014121001324428797, -0.048981904044656924, -0.010745318377515141, -0.097652326517780441, -0.082418824248892006, -0.0086675634058914763, 0.038492534598761105, 0.038421970823334595, -0.023684080137090627, -0.042571211439382639, 0.02767445118866517, -0.0045846119818084147, -0.029036296488781282, -0.014288492306115716, -0.036492483953748919, -0.073188419406786581, -0.058473938306242701, 0.061157356628457379, 0.037513132599877139, -0.044262690874014056, 0.037080163847070004, 0.0088659608282077099, 0.00080272687834155587, -0.029635044582425114, -0.061890394619628558, 0.0038985935655814069, -0.055588932181221483, -0.064825910358400518, -0.040454364747733541, 0.071936402641623182, 0.051467957240617299, 0.016629850744416953, -0.040009434139141736, -0.019115829817856561, 0.091904921049085792, 0.06837146364091487, -0.035381668896085239, -0.031695935446360804, -0.023950933267367816, -0.0394003966580148, 0.03763781004513285, 0.1197050728253103, 0.089542091951175892, -0.048321863792027797, -0.10361580068468161, 0.03196026187380821, 0.22708318047185561, 0.096992802612123799, 0.026709846902001309, -0.043788789977080037, -0.030431230119196698, -0.036199091708226813, 0.11281418451835055, 0.058353797638634589, -0.064975276585847841, -0.065781446400588514, -0.0084482038519338096, 0.091241523771951369, 0.12717594497795892, 0.076435365308040473, 0.05263655140428726, -0.011143586147963506, -0.036137839085706183, 0.069124578846449444, 0.013398711580413412, 0.029824240574494128, -0.003761299877294923, 0.0021895992476564027, 0.063411958556754897, 0.05214012614545932, 0.05038609451252047, 0.035324986438009076, -0.021229516140167864, -0.041481082779968939, -0.02340383743107953, 0.025148825203493166, -0.0071054288136557786, 0.029757691086840125, 0.0085264919185421041, 0.049978808930559324, 0.047608485947021148, 0.007387529728713386, 0.023177640471752005, -0.034372485157573206, -0.02211841910582997, -0.03255077177054265, -0.0095360632808114149, 0.02395181727198023, 0.0097167002818091229, 0.033561780635984223, 0.044589517984731777, 0.040595502460242246, 0.032653779800933931, 0.0057648668309821221, -0.015195338017169461, -0.04482684339688519, 0.07120843129770589, 0.041893263952033938, 0.048927297048636464, 0.073827844317264732, 0.065244542220815133, -0.0017292511368722507, 0.058389555203693405, 0.046492272714646857, -0.044448592181834709, 0.0032057986445928333, -0.083491824073505749],\n          [-0.021979451476262124, 0.041749536510466173, 0.036317482818499322, 0.019303759385788856, 0.043331105658738031, 0.039532451044482823, -0.03647609905532502, 0.012807077503951922, 0.022713576127722859, 0.026792414564902785, 0.017780821834078364, 0.021847416207194322, 0.035542788551473518, 0.022495282054875682, -0.019211730168732774, 0.046687383535703716, 0.032073200197188671, -0.028686832095504631, -0.06812268823509858, 0.001294075100742806, -0.034564145835298599, 0.050972273139714794, 0.017344511387778011, 0.035613261169431379, -0.047698589768029459, -0.033623331365756862, -0.032521260678616007, -0.0013900797467142137, -0.038202063259482284, -0.031763114785060997, -0.046960749111957488, -0.049070236071480984, 0.017434726053958804, -0.030703215315142654, -0.057162301791745529, -0.0037112416196131703, 0.0060696367369069372, 0.038135057103153125, 0.011368938851434945, 0.043811886314067822, -0.034217588390491993, -0.05354120670482268, -0.039937408320660416, -0.061769626775271688, -0.035240350915125673, 0.0016450283116066916, -0.019800744266528034, -0.07722000486464739, -0.075502378494275851, -0.087592049096889849, -0.11012945508577086, -0.061232503015605372, -0.038229892765514702, -0.064265277827533399, -0.052614544822152443, -0.023205841324039467, 0.011034902978061789, -0.00097880135493109283, 0.015271729427483255, 0.010026868737236877, 0.057985348035531209, 0.070840729971491434, 0.019039403044224391, -0.041761958313936615, -0.15551177552373613, -0.07628198734805558, 0.017047176529394591, 0.093014754421786722, 0.093581458110479965, 0.043402580662633972, 0.0066461038347559332, -0.028933285567003395, 0.071468870303731766, 0.099203191964259974, 0.16737897607114252, 0.069043657929340946, -0.07749686881409408, 0.099573378334475354, 0.048571278979090152, -0.0641451014524268, -0.017708931611072284, -0.033773357420827717, -0.036770341744953708, 0.021125297287466011, -0.03253144131642647, 0.016179841472347585, 0.090577750229154597, 0.10585324720051341, 0.10393909903192404, -0.039146928692158481, -0.030447885188444671, -0.0058756393399591045, 0.0049200955007691616, 0.065014535940290191, 0.02355974270510458, 0.0086861952813323678, -0.066304296641173113, -0.0023589044880598853, 0.10485324285454203, 0.041243799776074036, -0.0046939490366109116, -0.050265505473230082, 0.079897314990575993, 0.051811860629177822, 0.05936381965465605, 0.063038602309119562, -0.0096553750564754778, -0.069242556576336475, -0.047051759275558228, 0.071057903450201951, -0.034427035272532699, 0.033352431404995275, -0.038713428810432646, 0.040541117523422751, 0.067513694210917949, 0.082805954892964315, 0.10708141658638523, 0.017928056812146861, 0.0011601162267517867, -0.043673577511548753, 0.12867110066084922],\n          [-0.051871694661995885, -0.019280829936621956, -0.054682607758164609, 0.0009447920461082629, -0.013017072859738549, -0.012890228722627788, -0.035616894294724373, 0.0014514513795995301, 0.042883217734102162, -0.010520379849197729, 0.007557764016209687, -0.022057597937526343, -0.029115164929706994, 0.0012528790852251032, 0.023269338421732191, -0.067474514241851885, -0.039425127112679564, 0.047182643334052331, 0.018571000663569977, -0.031453248579785112, -0.0042627544710682353, -0.065390808213087154, -0.062309588573350783, -0.00018350956129405474, 0.03407593431333647, 0.020712134681679213, -0.015816412935546649, 0.036106476966187746, -0.0057176038296621896, -0.0078034581275657263, 0.022001767580951286, -0.075063089515289755, -0.056833269479676471, -0.078487811169271574, 0.053314994300153781, 0.08979192045945919, 0.065579735163271619, -0.02013808088107881, -0.069354719259617226, -0.012900359094848712, 0.06749429214896617, 0.0052091689986741314, -0.0050445817378490798, -0.034013340544313847, -0.049220624377965441, 0.036992846717020605, 0.073527164422162408, 0.023626785644426024, -0.12668833039918156, -0.049929820048297914, 0.13709290290146586, -0.043083359856046347, -0.11283440510072536, -0.022957546531399264, -0.016380363567833241, -0.061480443278703056, 0.083722789203042061, 0.026145798642064663, -0.10930012120125338, 0.093485417462155301, 0.21229414611822872, 0.12152486504801896, -0.0085143078714366941, -0.11195109821400444, 0.0087569591283611289, 0.11393373946480671, -0.058279470412456076, -0.0080421662325995125, -0.0037127964633908161, -0.090611461392314269, -0.023750445832424479, -0.0033262359419465592, 0.051599394503568374, 0.11794682063279016, 0.05218760955456582, 0.051040480785423475, 0.13055799836266763, -0.01221412005055704, 0.036431789368042852, 0.036670703720440317, -0.0078012137698507981, -0.080637182319625592, -0.098441747577097227, -0.03508837974768049, -0.032648567450681995, -0.016984796908047974, -0.027536458166992319, 0.06115870091554932, -0.0051669231621845379, 0.054346612146431938, 0.045746752439773088, 0.064739446750120125, 0.049552711275373883, 0.018862295590649777, 0.048983187153556228, 0.062541985576739914, 0.0072514834621828835, -0.023346720324739785, -0.075601926169402353, -0.057354038392425574, -0.017630696493874162, 0.02294588190926191, 0.090873111715422297, 0.0042984842735071613, 0.028246302042173196, 0.0087607006248174284, 0.07435181540431253, 0.035004927442402321, 0.031603063242742584, 0.034524004650933401, -0.076590160387399964, -0.017921124400819347, 0.0062988574109997869, -0.013815145103657209, 0.080616454932859072, 0.019781761084500894, 0.075647735229095237, 0.043189525185656379, 0.074149096904190248, 0.04770033275626058, 0.080840156186910761],\n          [0.026722003554860107, 0.011659299846958612, -0.030401027328402285, -0.078933516409380317, -0.025083013651028968, -0.051258138411005405, -0.063738133597399105, -0.045360978905662902, -0.0072454540129453099, -0.0016165196721033143, -0.089855064600654358, 0.0097207854833627934, 0.032566632530092121, -0.063546487797010456, 0.0040586505412308974, -0.011780242044409216, 0.046622082528177268, -0.0061913239369574095, -0.00040805875755831446, -0.038285077303976116, -0.045803388237714085, 0.00013567048096911616, 0.071841011636230273, -0.0035184890415564662, -0.054904449860221666, 0.02924191756204008, -0.01689557308935365, -0.018744528704994677, 0.075716926828176739, 0.019648278025953467, -0.043885654656954369, -0.018293295448074808, 0.029236899127084933, 0.079480753652723696, -0.10678554242785285, -0.13518893526708742, -0.0021617736445511959, 0.057839422567807532, 0.046852963852851211, 0.010613998677874176, 0.039439684131787889, -0.09285753056846846, -0.05413777579109947, 0.041015207873276241, 0.06345089058106948, 0.047469937132271711, -0.11150623495169829, 0.024332828493630963, 0.10456565053537453, 0.11492526729638461, 0.064349122666039232, 0.024960207207532441, -0.12312652337245503, -0.0357276852240003, 0.056357845948048858, 0.035122396434681416, 0.040853396388258245, 0.0048171237774400641, -0.018877573782764997, 0.063834223394559408, 0.099594433304481159, 0.10457424633849259, -0.0059323860818025122, 0.051540993351738555, 0.043792467918237224, 0.06682182319421423, -0.022981366626334779, 0.012623816899516915, -0.027434183623551101, -0.037320166273082822, -0.040760599767723449, 0.0054311112775042138, 0.077856612886341992, 0.061025832668360973, 0.06291439314075388, 0.039278945628749652, 0.051551436211894681, 0.068228206982137857, 0.053793243256798989, 0.033116294799969533, -0.087230566689965136, -0.062413283562578893, -0.082179387336970056, -0.049408458616677628, -0.051359759856891118, 0.01704176534606279, 0.0083052629894674324, 0.057973181889856361, 0.049273067989623984, 0.050549115680086437, 0.054189519887507934, 0.076357459282641149, -0.020159764614916531, -0.01496772437088123, -0.008318755358141354, 0.032399494222174856, 0.029724547489281376, 0.081167503706311317, 0.0010766805091777659, 0.003132081148303891, 0.039599122177480288, 0.032665101862452292, -0.0076123889523127567, 0.01439000505445691, -0.024144476806805197, 0.015900895762450868, 0.036463449654478043, 0.0059983182179931529, 0.0073771085938482096, 0.068757588979111023, 0.0018450028156024381, 0.058983317021274982, 0.061022660493410763, 0.019189271609420328, 0.052228673471552065, 0.022903569800211365, 0.0093545739337794684, -0.022264194312743783, 0.028742917273488648, 0.031821039680558945, 0.031024768487282525],\n          [-0.024931914403123902, 0.0067371102591031948, -0.007391490442242972, 0.017496948430487498, 0.023422622609065046, -0.0094928852122032684, -0.021940305477306223, 0.00025349416488679166, -0.041633427271842161, -0.046280330971315689, -0.06778901544234435, -0.024673968258041953, -0.029907852335896074, -0.0063449215025076638, 0.038828302806607679, 0.06846252343470445, 0.027205296230138769, 0.034295058790694666, 0.020017420759176036, -0.044147644646415102, -0.059872005422267019, -0.051482095492071264, 0.011124069340270715, 0.016763058258717323, 0.050886840442624481, 0.02549815480352427, -0.0939546655207978, -0.092391189277661337, -0.032479032153627907, 0.034462594953754824, 0.059969474942545953, 0.025584824798319902, -0.054353591667338476, -0.021502238752819661, 0.051546501452992721, -0.034007866675401628, -0.10294183533637649, -0.068214384945964324, -0.036091128635311429, -0.035862209668492087, -0.066950369902671863, -0.0788669358196743, 0.01348990123782938, -0.0092991627936537726, 0.051242254594595721, 0.063155120324530495, -0.057574046015223528, 0.018890388699001628, -0.042698436177047515, 0.0063897190194895787, 0.035993788676757676, 0.10789490348622735, -0.068180236257618904, -0.075881929824815911, -0.019747504672663209, 0.10735747383087241, -0.03869822606166641, -0.15857079396383206, 0.077711698878954072, 0.0027821735741544867, 0.033503358473603001, 0.044529328438383697, 0.11469939192954226, 0.03762916616171235, -0.11802211992760672, 0.089816131200894628, 0.14094896752231051, -0.021944857285476876, -0.18628488220757861, 0.05722715554404334, 0.17885030648332761, 0.12350597080986565, 0.03287297640709165, 0.13094265605576585, -0.079054276690131695, -0.098874284973658105, 0.07103695210415123, 0.024172138802402793, 0.044359819339575904, -0.051012505698565642, -0.039065923553229673, 0.10490932756038186, 0.12042204998724948, 0.16359720010359963, -0.0083141685472531146, -0.029805224335517175, -0.023079186944148275, 0.059849592266809526, -0.035424217542300893, -0.025330293256378603, -0.034242830366423213, -0.063441839555084145, -0.046964192520516257, 0.00071815932595863455, 0.022784193984670673, 0.0091085690333239377, 0.017544256490621302, 0.028537852311277645, 0.080903467002397131, 0.062288009683574119, 0.048189715163459962, 0.021557195959710354, -0.022313472699576162, -0.091203959029137333, -0.048678117782736216, -0.018880976433473903, 0.02319770864597645, 0.011883122070171566, 0.040745024174235034, 0.055217772192963144, 0.0752915524448943, 0.12950685960404881, 0.034066733228072771, 0.055263332392194921, 0.00092956340022609663, 0.0025829434849187483, -0.012623470754591415, 0.045045466234092293, 0.035721398778730123, 0.073251215610966064, 0.094939799788321122],\n          [-0.054693996761883468, -0.036142257709420977, 0.012139987915473143, -0.015154402745934992, 0.0068463302216838166, -0.0093136851521987245, -0.048684400948289616, -0.049430372046362539, -0.041064971222999513, -0.077253849675155653, -0.052659701580420708, 0.02644006417674272, -0.035825803881623458, 0.00018949187702807166, 0.020886062450068934, -0.00065949460591928355, 0.022071058438621102, 0.0040313708607001772, -0.035333022236136671, -0.028226767346863704, -0.01809822098267436, -0.020234382561405761, 0.015320984616764413, -0.0014404272920333708, 0.011179661842263149, 0.011479905349418697, 0.050415046288148357, 0.011825597601556187, -0.0058861573381156773, -0.010693467291456787, -0.052711803776757507, -0.039587295536248207, -0.015153382931397254, 0.021776177677289621, 0.018485275683894062, 0.017270703576438604, 0.025545107202705496, 0.003552691996951074, -0.0072077192628247633, -0.016927777585758572, 0.01010327735896166, -0.011396759513419105, -0.054135995207295812, -0.008775918099563268, 0.045428799230222999, 0.026078742599032825, 0.018401462157094414, -0.010304766106153093, 0.031175273783970961, -0.022964877769659248, 0.0073488459201091344, -0.033664533213207795, 0.0040173488287653797, 0.00073105699963767201, 0.00092920767763406131, 0.038455564657623509, 0.051027184464204699, 0.032163653730152494, 0.003091909476963195, -0.01805086224294028, -0.037580600034212458, -0.042983404923079879, -0.032973836490514191, 0.0034357039654534238, -0.0029191330430502482, 0.049102114568624511, 0.045968351963145374, 0.037533034565610877, 0.053551748804077495, 0.0025191362420830836, -0.04750855266321341, -0.072788896259128044, -0.064427335224849849, -0.041220523667029399, -0.026780660598796205, 0.045893029004908492, 0.043426979158010505, 0.063353229422186602, 0.057675805158847071, 0.04031026644948954, 0.041067495849464855, -0.051029374332638877, -0.081222848002171583, -0.10623271352478328, -0.040384319505111455, 0.012698889514418027, 0.027850330309453372, 0.073422603729637589, 0.013872383376783981, 0.086837219868510659, 0.078231498196284319, 0.025402065662503196, -0.0085959304722693069, -0.1009426660553958, -0.079770896634910687, -0.089307575006007389, 0.015197805521062258, 0.061289339594082198, 0.065948610641877861, 0.041035546434975201, 0.059557826909646928, 0.080006232863982965, 0.074882607029051015, -0.014113346378857847, -0.032420747653342651, -0.11384852443855065, -0.10291516846863054, -0.012980508793377513, 0.052220406103339362, 0.12082717968395887, 0.10605397357987933, 0.086255183281375047, 0.08321354397182873, 0.048514817007833, 0.044243911058542376, -0.042578630343806573, -0.10029735035508303, -0.10409726347948557, -0.086307810468093438, 0.033369049739091161, 0.16060915775050888],\n          [0.12273861405978125, 0.042814508752045621, 0.018061966478661248, 0.0053062383942378208, 0.035823523447581954, 0.010649293754868217, 0.016551078536122706, 0.01489993969426269, 0.067444152505856128, 0.0014205983259976962, 0.017061484842956845, 0.10625529836546962, 0.035660360418095283, 0.002751078412191129, -0.012307530679996168, -0.013785633291103078, -0.05132782373436337, -0.086000385495835899, 0.051802568141879196, 0.03904805873472704, 0.047853825999159286, -0.026265747542033639, 0.030741255453331229, 0.039406757558914624, -0.0082191970520293089, 0.0099449690730434304, -0.011588775094071746, -0.069863331862633757, -0.071219401021746773, 0.026730481405145667, 0.064361266677040244, 0.049962478130168061, -0.024025875808116548, 0.063809323364770701, -0.014373658398046024, 0.023604867877091828, -0.042856616912313392, -0.030014181333617398, -0.098897121704490082, -0.04373899159435149, 0.034309424166718241, 0.071347736418952548, 0.03761434445919945, -0.00082170423945062548, 0.020111151000193242, -0.0023310749229815061, -0.015928238873940369, -0.024231713696889132, -0.1221269192682253, -0.077411569100787531, 0.0032849717401806887, -0.010022001408555678, 0.084366733947847855, 0.068284080213949994, 0.027109602968543318, -0.034520822432145569, 0.0059705622321129803, -0.054405452170679082, -0.058782564084633948, -0.10071244219183988, 0.0067297619046283036, 0.052325883194804468, 0.021602083823943383, 0.033365772587175026, 0.060449981481694115, 0.028671597117484994, -0.069275563884935831, -0.046529106869698536, -0.071031022601829363, -0.068871541073595624, 0.046653811370795717, 0.13893639005159752, 0.088206715220373294, 0.0091340091832131931, 0.033848018094446569, 0.047381238825923169, 0.043417512003515984, -0.099682793139969056, -0.072929356853561139, -0.076420909130552717, 0.030782008777859689, 0.14194448580394009, 0.1054078132040758, 0.050343613237156831, 0.042627816282501868, 0.0019869408179327142, 0.002912892694045377, 0.033417927689340168, -0.10626474257229218, -0.089797364954523645, -0.012630641916284824, 0.10656465605540676, 0.081787444241139498, 0.015706150749096585, -0.0081474894960576333, 0.017962048380179174, -0.0076820753247799078, -0.018533162764163613, -0.025747232327919242, -0.06863640651652167, -0.016416507375672674, 0.05202743487028412, 0.08441518809008719, -0.031665719212890506, -0.081384934590939706, -0.042068123788522205, 0.00053001779352805818, -0.034027551289153801, -0.036058497578668941, -0.094126599607925632, -0.028723845930421731, 0.036956160575588454, 0.11399236758087031, 0.047784293848876058, -0.084617974292537104, -0.1041988894674926, -0.096930663266632036, -0.038842231479212945, -0.019078175570027882, -0.045970102698338858, -0.1043619020843051],\n          [0.065757941109192197, 0.074777897508991442, 0.018292785286432484, 0.028173020338814948, -0.0089483449436603552, -0.052545580386797019, -0.1087949901255694, -0.039787230769942346, 0.0030209786294805308, 0.043861504558306494, 0.020559045374589795, 0.04470571436425777, 0.012784570202518724, 0.016258299543353186, -0.038126906658306502, -0.037497943202709987, -0.1176914965804748, -0.048822632662462465, 0.039098390799118754, 0.067055649329849032, 0.075500071483937753, 0.076145526827718329, -0.04103203468659232, 0.015971731655258753, -0.037660696603424096, -0.03882889344260633, -0.10585017234815822, -0.049772329981684821, 0.0044956232113971175, 0.11402219053620558, 0.090970410758093978, 0.082806478184774074, 0.059837386632622405, -0.013124940068416517, -0.029059840714413719, -0.0085931859468618976, -0.055642225665546378, -0.08586524174843943, -0.010731942001337424, 0.12910594217065441, 0.033630584320905196, 0.034969345305899749, 0.022613172456202865, 0.023083805067396955, -0.026126622747118175, -0.036555728898516215, -0.03454946027988387, -0.009697212267244612, -0.039485260868956623, 0.044563725924654886, 0.10334272388553382, -0.022990981360463417, -0.068461711924414873, -0.026650640178318748, -0.04235340979767379, -0.063143412724810472, -0.038670479860085677, -0.032190500890796184, 0.0024621208503444285, 0.033854260568938976, 0.10018347106209433, 0.039049779541599661, -0.14322204153577417, -0.06792156608979899, -0.083174058543035695, -0.086985543398739873, -0.049996676858093628, -0.069642162140837696, -0.017580665091978198, 0.045666600981940773, 0.064474542322985828, 0.066381323532462677, 0.049759120323402989, -0.16687707277418293, -0.10148113813854155, -0.045651850601446282, -0.025088926732828348, -0.046920284310850276, -0.063091363282112678, 0.0092456865886239858, 0.038333207077261205, 0.061578125540969059, 0.056229950013552389, 0.077372534333749188, 0.043186131128634953, -0.038313312025859518, 0.011391766806405483, 0.029085717674323781, -0.087357953773625374, -0.045745395595645708, 0.035034140501439034, 0.038753107277930694, 0.01028453604755696, -0.017745509526202401, 0.011578683352821917, 0.10678493475168932, 0.12920759729821871, 0.062105404373375861, 0.031614742242985883, -0.03599156339869132, -0.03580586208307926, 0.032429174955818194, 0.013349521240161158, -0.00025561537496165965, -0.0075836537904609078, -0.057809872184653305, -0.02737962405414552, 0.077504449878040088, 0.13303768141468877, 0.070151605162437541, -0.018705354807535012, -0.015887137408581595, -0.012405772738829302, -0.036314766817913874, -0.057460340751641914, -0.034056167300506576, -0.07157545200554731, -0.068299510308264991, 0.0017292217190058162, 0.06083852156997098, 0.15051364383348281],\n          [-0.120254202400746, -0.096169017184156325, -0.017372420837296856, 0.11248443570944938, 0.14311280665471804, 0.082528015127987145, 0.040999748265665256, -0.0022276752168216667, 0.010467790781802488, 0.023760234093264703, -0.028258264318314828, -0.084469173229205441, -0.06310610366941509, 0.034557979503718569, 0.080540040228858856, 0.030927414852254288, -0.055931722549191307, -0.02359479370263956, -0.021307923642893911, -0.06310798271161458, -0.073253467634114292, -0.058338840997439398, -0.045165611251598459, 0.026985236670137049, 0.084702435833259607, 0.041280837981018503, -0.12024366873436408, -0.10042897365913865, -0.049765123602586149, -0.027095288662972609, -0.010458303155168436, -0.089462141062869843, -0.1289437118045591, -0.010213525065954888, 0.053979540894161043, 0.069468772869540479, 0.12952759376479325, -0.14182340494484172, -0.14285062277610125, -0.0528606979553762, 0.063969476799177832, 0.053939270199952309, -0.022029152784641744, -0.10818698528187731, 0.016491832436736686, 0.038639318505357401, 0.024020989335001519, 0.065592897425442109, 0.16112502640598336, 0.023615052509284043, 0.043352450132583868, 0.0076979018918599679, 0.043112121029937528, 0.00071987756274229098, -0.045960857982681895, -0.0069127442592640644, -0.0077204882201102748, -0.031891871843114539, -0.017036960892809219, 0.035037325548395559, 0.16303059281511678, 0.17418427554606328, 0.057001247041575748, 0.022916289242805976, -0.010513114683071652, -0.052886209418476507, -0.0043129908452952349, -0.0018884698638378054, -0.044790060375371074, -0.032320374513797531, -0.048960971185410075, -0.0094052564622430085, 0.052253286388732362, 0.14016474879016858, 0.04065676611467136, 0.024408426423858556, 0.029985555367538438, -0.033973239042800897, -0.017546572766816648, -0.037345271053038906, -0.061375928930807219, -0.03937344145819692, -0.054467136784434225, 0.037876693223627467, 0.09858135152652249, 0.08915095169603543, 0.012958414651170758, 0.027624783264719604, -0.0058828017121677761, -0.057086791129319164, 0.00032844804874246347, -0.037840469280978235, -0.033695751439804925, 0.025912743632823754, -0.017024947537232993, 0.06774754790560647, 0.064529829344964221, 0.059856281606444586, -0.0040794712071662576, -0.064492010817941703, -0.022926783895192725, -0.068256941312238154, -0.038787091103630163, 0.015688747762662825, 5.5171662105987784e-05, 0.032388446527829046, 0.053502152462023958, 0.062621310565998928, 0.011267099083652837, -0.039490456581147762, -0.094319475634422542, -0.047548409339035126, -0.0091541278282420042, -0.048201431835308582, -0.012240843418624294, 0.0012540759296775089, 0.016595878790118618, 0.020434407588746067, 0.036700109021096272, -0.0026055496863919281, -0.039180334358498638],\n          [-0.039044382493438445, -0.014031835439091891, -0.01717497943397446, -0.041781540002782738, -0.059373536092440463, -0.0085344327706754902, -0.016300069172747539, -0.037294900567202499, -0.017549755907846534, -0.078447962882527866, -0.02004008529828297, -0.056768697829428338, -0.059967040212345959, -0.049253129103857415, -0.069471541008027285, -0.071902666850531496, -0.044718491551717546, -0.03636510105928939, -0.0034411563298461321, -0.046411031373760819, -0.028589990691112652, -0.083768492808513548, 0.095116180742419232, 0.062452246419035309, -0.024833981241255007, -0.097858575559795102, -0.1127986872143521, -0.088067854572432464, -0.08883593725007502, -0.068545154777893094, 0.0011510544062942052, 0.068272249927958051, 0.080893673619898535, 0.1353343839303309, 0.18057622473716234, 0.089392921016127391, -0.03771266910646548, -0.18004516845335108, -0.16759680953524253, -0.11135480418062912, -0.046002363039963315, 0.067488034958263582, 0.16040808091097752, 0.16020908007929302, 0.032242746883539272, 0.072926540225657518, 0.1267341164708839, 0.076774965852314164, -0.027586193949245066, -0.060585053483984741, -0.065958103899050796, 0.04618881719914493, 0.06405321366734254, 0.066545184375501457, 0.04695382149034999, 0.0044609113824994155, 0.0091618342219318277, 0.041960317974973543, 0.090848513403254741, 0.099018853508946403, 0.090333756224992956, 0.067825639738709226, 0.012714203390510964, -0.0052083322470473023, 0.011531736842481339, 0.046913351524415829, -0.0026789314124194552, 0.028085116456833342, 0.027040588615283353, 0.015104267552866583, 0.059852806875527353, 0.032101419463347713, 0.025279126213945874, -0.045499782999878127, -0.0092654514634481905, 0.032695973667332234, 0.0058023061141843219, -0.0018139112732011575, -0.0029108731958343292, 0.010427305260203787, -9.6032476966920188e-05, 0.021288607450265881, 0.041079801640464084, 0.016357363013747531, -0.032396279409626833, -0.0096468473033134161, -0.015146538620363123, 0.013412806275636471, -0.0013427741295518741, 0.038224090646334606, -0.01337749153937268, 0.026455615442210673, 0.022399735833748824, 0.0083203718092760871, 0.0021986789243084309, -0.014293946476503921, -0.011197610424383816, -0.025764602165002509, -0.0044402614564183623, 0.026453211631295465, -0.016392272773541029, -0.011847008501585585, -0.030834902384847707, 0.0092711300250400749, 0.0079231656727102029, 0.015033519474474451, -0.027785535484879158, -0.03370942439196669, -0.015542452577597912, 0.00048635059573182279, -0.026694531555004813, -0.012724799179976064, -0.013286763364002738, -0.042306321931516747, -0.033424166864698804, 0.0087293255484813519, -0.030242759324034616, -0.013050994461220922, -0.037603985335936958, -0.048537758115318075, -0.061784216202301949],\n          [-0.064895613231398419, -0.020224286971327814, 0.015905264409012548, 0.013551842188797097, 0.082225664059696169, 0.052591399404863487, 0.042257887471961172, 0.07064771573560033, -0.0011991945255137408, -0.034366640312061339, -0.072360555553281497, -0.056223603404509992, -0.046254629023798989, -0.030584855242000546, -0.034996133864494572, -0.043017778242875414, -0.074116618465999901, -0.058193036991492836, 0.099174902047441449, 0.085979159623767315, 0.0260790473140005, -0.090335795957093609, -0.10362582311773169, -0.05683029227387211, -0.032955228570346592, -0.035953196903694445, -0.083669598501602105, -0.14307384019801234, -0.17021343406030898, 0.056559505125885055, 0.1353903981543188, 0.11264594916548558, 0.011673755450064008, -0.065805649175016551, -0.015916968368203999, 0.049371535828759125, 0.032602131500708426, -0.023482372439204213, -0.14884937691675146, -0.14122378994790352, 0.038947574553526224, 0.090754777377725832, 0.11462434476555877, 0.049232968649695563, -0.020681162710889808, 0.0059189166530157098, 0.048035670932309434, 0.048756668898357711, 0.015029939401784822, -0.0045822873172906703, 0.044145082900123096, 0.050071852397185944, 0.0094509750493274383, 0.024378668316836539, 0.052749214069398115, 0.0064390139543627628, -0.0002811989012708239, -0.0064546940403005376, 0.067241804853012926, 0.14641906683964209, 0.12089002549596747, 0.045524123195999813, -0.027903819777222599, -0.020728023595215268, 0.011972589684504081, 0.023139835261794185, 0.062288213971794335, 0.0030852567167743063, -0.010563156113489056, 0.054746231145096608, 0.10798773024900726, 0.014816168604569607, -0.067729122880713061, -0.069428819952578644, -0.039672679449664974, 0.0072944844869031189, 0.031665801169246242, 0.077903468071470375, 0.03314357843621181, -0.011090195620338333, 0.025953154918250638, 0.040728866157606014, 0.015524058836610692, -0.021280018049330086, -0.074601124345350517, -0.032634705813619005, -0.040767214304249212, 0.029068927489674708, 0.050403637093174664, 0.016601304925128416, 0.0082563132518792444, 0.040076199043347638, 0.031009017378264954, 0.02125830223035903, -0.0026364504616102971, -0.025393115408776517, -0.040100437968749382, -0.05110548671081025, -0.067993377103616609, -0.00046432557130123052, -0.0039876483166379033, 0.022729109377199703, 0.039555964359429222, 0.053830169668727355, -0.0014414045704570968, 0.037267802189446919, -0.022231980521954575, -0.034050491080049324, -0.073951655494023091, -0.043557983601915228, 0.0063278734791331892, -0.079884297677682306, -0.05179614099105008, -0.012967977410458104, 0.016769677941412969, 0.03933948218335899, -0.014906721458355397, -0.021082645685981671, 0.00037445636334414081, -0.082723281977227794, -0.1030737258893234],\n          [-0.037002829518880356, -0.051800501938286336, -0.060853004537176597, -0.0094150409945243096, -0.034328030870577425, 0.0033825861478738173, 0.012446709688320332, 0.028263939384084974, 0.051241250294029178, 0.029467212390683409, 0.094296073781751158, 0.017996331462246259, 0.074494909584215466, 0.018562434067668762, 0.0011775208660011255, -0.03343642198912352, -0.035845758685869263, -0.02469974718432548, -0.024948855129499292, -0.024856433920733188, 0.022654621557346655, 0.013969959583284512, -0.015621110631660393, 0.08434398198734791, 0.12526052771855398, 0.058408231821464381, 0.045127451768280695, -0.043164240869397401, -0.1023993834271598, -0.096781070009609851, 0.0053916393051223234, -0.033844402314595262, -0.012657848528438927, 0.0013785476814248063, 0.011572904307556139, 0.068403154355265131, 0.052980959912984543, 0.1266701829984114, 0.035045725726125722, -0.068960202229844197, -0.060072231451733973, -0.062720555693278807, -0.030009692601680373, -0.0092089352686221815, -0.053346169244103861, -0.051521839481652648, -0.019671024276837101, -0.055873607630573113, 0.041978873563040947, 0.1638861354064878, 0.00106361294464159, -0.053910040513112212, -0.068153591022086388, -0.055292950731728449, -0.039462171388406658, -0.095725937501121905, -0.092290911359049418, -0.11338803995859958, -0.13838339127374222, -0.0357462740536892, 0.22606772554633187, 0.12813795776647591, -0.0024481614307838503, -0.033611168519571522, -0.051839059280132632, -0.084236132619828999, -0.029032249699063171, -0.058898794655031249, -0.11075161830580202, -0.15312117095255712, -0.020724783620647211, 0.16842588938808492, 0.12743855198340154, 0.080331925597410064, 0.021566448195444857, -0.082352620029737575, -0.069017983250065099, 0.049857379267076132, 0.040106054682231364, -0.055333820775483558, -0.042096211664252689, 0.066708704425261028, 0.042419812012600137, 0.069011669576221873, 0.079983677018715033, 0.034371804092794715, -0.017332099818488572, -0.083009418854646341, 0.042453939466233076, 0.051060642403565164, 0.07316878819733981, 0.10110928490296386, 0.015416346633545026, -0.074121651760900326, 0.037506205371324909, 0.056372316384434969, 0.069802712453019444, 0.022830083664882234, -0.088476191224756862, 0.056380990619929745, 0.11796759975891001, 0.085159502068178794, 0.0057506785680517813, -0.052150252418282778, 0.00071341189171907071, -0.033052078906102914, 0.042466154564593551, 0.066152570678099751, 0.041058972780051016, -0.07491213514221709, 0.059832650863602857, 0.050036282518436601, 0.073439101106600166, -0.035055451687694333, -0.043213965757215783, -0.028433835254721582, -0.049722879871748019, -0.042468775260800257, 0.0058211813366477044, 0.0033813738235871967, -0.064579878516043021],\n          [-0.05204926560099437, -0.057237880289236279, -0.0083905804002989276, 0.0062458102695772955, 0.035746619926900439, 0.078399463599589062, 0.078852151476007562, 0.065079376584073825, 0.051674438501644049, 0.056599491625845932, 0.1112401778738227, -0.049451770190799972, -0.03311327028822704, -0.04470398589450323, -0.0069392182793978074, -0.023794576977256759, 0.010055161607694707, 0.051861925861248687, 0.032051221900923126, 0.0034551032431236958, 0.060342507325651218, 0.071820561865178004, -0.011974167972497493, -0.026068365839870898, -0.020182681121343846, -0.013949638537375686, -0.050699316492772886, -0.020355931447011116, 0.029014508674471667, 0.044992661189607805, 0.04170522023063189, 0.033987569666887124, 0.042094071544786019, -0.031292621485756067, 0.022301326642790088, -0.01743554965010255, 0.0086405189226159418, -0.033429116543261993, -0.059143520853118206, 0.0055852565804648813, 0.0041508387138344781, 0.049460528858195588, 0.050859527708305804, 0.079934023736357787, 0.0095959128701056558, 0.025688470585585318, 0.0055600019316925584, 0.013382028934657897, -0.058013808148885737, -0.089499818472389137, -0.071592085149893764, -0.019107360505553072, -0.0082744851179119318, 0.032585012634967978, 0.046701290308840598, -0.0096067810012472332, -0.020512636464317932, -0.0038438246468142923, 0.014613700602723453, 0.068186284724516349, -0.01830963397214188, -0.11322752216975147, -0.09640633091246717, -0.052403236939622524, 0.027222341781097337, 0.030317752268627929, 0.019657001659076179, -0.0096600042345343605, -0.018626726339795667, 0.0081908090585838672, 0.12179883942046363, 0.1508103124239786, 0.075806639792132646, -0.062761170942153277, -0.10013344453499878, -0.068245483773719195, -0.022265844067301123, 0.00065583914591630342, -0.015208724489903314, 0.018866572887032564, 0.0052684885324918579, 0.065684028931326841, 0.10986728461260108, 0.14928723727825088, 0.059434744289182703, -0.060185571636217253, -0.089354598820007264, -0.066216926969791326, -0.023535680546190665, -0.054962379947465514, -0.059013306627190822, 0.019989607048620271, 0.0054003206627150548, 0.032462771758462849, 0.045866640394699523, 0.10505871662329165, 0.055755510306947052, -0.059889616340963951, -0.092315810433916068, -0.071619045947736437, -0.075031199722232336, -0.062253911446631852, -0.04694709230045966, -0.048116321043479529, -0.036582441951753884, -0.061107036339067312, 0.036504990974571036, 0.10110597080448579, 0.051177845114249831, -0.044432074886152584, -0.10159227266715132, -0.077158568747903805, -0.030393198761254205, -0.050071313080747346, -0.074595676179791612, -0.073458542100526297, -0.078358062777158496, -0.030278657221277715, 0.084453877904946462, 0.12337283504154144, 0.062469168412561921],\n          [0.11115260218147537, 0.051560842999883991, -0.019027323692840041, -0.053735438913629183, -0.0071101075931705657, -0.060331674975749636, -0.01273389146899935, -0.083913899585844304, -0.0068742819184818144, 0.036449537875718169, 0.057484281155208095, 0.1019949723289555, 0.082976543297385519, 0.018623799266703829, -0.020037210469670844, -0.058991687133825438, -0.0043094092108171798, -0.061801131907737672, -0.032137171525331368, -0.019997943427430342, 0.029477714358382982, 0.09332163289552993, 0.070136049723979091, 0.057019933758274077, 0.053899973004219538, -0.0026387634530392612, -0.0087944700091126295, -0.044886516736232299, -0.03176715948743207, -0.042173672069529447, -0.032508457873831956, 0.034115235511423689, 0.093105995907237046, 0.018636796052156644, 0.046735806088687395, 0.021858174501294951, 0.027569212512874617, -0.0019748228182896871, -0.020011467438642447, -0.038263327232506431, -0.041760709971461987, -0.030814576931739321, 0.028817248098680567, 0.07178725501146116, -0.009708063399979483, 0.040408045290464156, 0.047902942272710962, 0.049152309684650786, 0.016182293978584075, -0.017238522908897977, -0.040468598163172567, -0.045702820531370383, -0.016281604371356659, 0.0034546404119755736, 0.034807390777535141, -0.018385622040759317, 0.01969433114929478, 0.067998668027008519, 0.064831298138631047, -0.014464528171849848, 0.011124972290677312, -0.0612303154617381, -0.076620988117942754, -0.023624167810504887, -0.0028778143977437054, 0.037589255674998712, -0.069263304031074682, 0.0031359656960172622, 0.057377595091023581, 0.052691820606641286, 0.017399699182203937, -0.018570302353960122, -0.046213889206180463, -0.066632711107939349, 0.004937253121457652, -0.0038828611488524456, 0.025713646541403734, -0.083379308461335996, 0.0056691392712922076, 0.11608252277008832, 0.073533161219590859, 0.03822657644961075, -0.077118650194350102, -0.055463194241750072, -0.04304259780973764, -0.019189005860534236, 0.017297615166657204, -0.023170677964515524, -0.097271316382778222, 0.026385141514079502, 0.084668815279573317, 0.092504840629287294, 0.016711157910872847, -0.044362782624102759, -0.0454511239473053, -0.049550862988714514, 0.013625451869519002, 0.020561667154105095, -0.030006622146731568, -0.063980647406975705, 0.075872467722288658, 0.053120016709717416, 0.065923774906762364, 0.031465876517252786, -0.012255926181853973, -0.031398789946512198, -0.01876926970569838, -0.040221379151225214, -0.0015619003771453512, -0.0069604389489614123, 0.060783419102048972, 0.075568709103222456, 0.05225568745879651, 0.078139550494287488, 0.038095011814273147, 0.052434561149658568, 0.048883832083824116, -0.055025867820072974, -0.045282107044195954, -0.041013497771644633, 0.099043866859741717],\n          [-0.11203549175295996, -0.039741638112244869, 0.011060178958798239, 0.068771522760862389, 0.091947029926868651, 0.063013461864849213, 0.053208457143949908, 0.020539339513306422, 0.038057193997243076, 0.038787465988623426, 0.028121764350374646, -0.044919650035753551, -0.028946060113256775, 0.038249964049902802, 0.064448692316739498, 0.074566886448479031, 0.056117982339109772, 0.057712083798571012, -0.019732262989866904, 0.012262999619765316, 0.0040347651881646211, 0.043113689501805767, 0.0036261933857882275, 0.040928710043322158, 0.053219648605966417, 0.046769367826384994, -0.017166264963499114, 0.0054891268723304132, -0.020480699308758406, -0.022929172836275616, -0.019377222102737297, -0.050393274670934379, -0.028341154356359134, 0.044368745080340603, 0.034906291107670129, -0.011071953214126184, -0.065544146068916828, -0.057326320735171105, -0.098654044879250974, -0.021150583208668992, -0.038971057948257913, -0.051954652796451138, -0.065697052369735887, -0.076668618468381175, 0.057536826222298318, 0.0059026131536024304, -0.046203872539273341, -0.082611420120622253, -0.084852191816498154, -0.079141430325910062, -0.097004168435828902, -0.076062125522098539, -0.06316389153647553, -0.083320929461625837, -0.057460537409920194, 0.02780118613240987, -0.018767946276596975, -0.029691882937965902, -0.014540521259465585, 0.08390634737694766, 0.20739444418621977, 0.046700493845665721, -0.060571735762272969, -0.1303813417107452, -0.13805261674986721, -0.12358535758970328, 0.0074710539580880447, -0.022238309187360118, -0.0067832182121356881, 0.00050856838356390724, 0.12335224504872636, 0.15023440850791586, 0.24255876784390559, 0.13265122710423893, -0.036349215955504527, -0.096342261434848489, -0.12379973942082877, -0.005922294079732774, 0.0092528719228638871, -0.0086414366404968038, 0.014911679170252864, -0.0069709626853085849, 0.062192115575895698, 0.048857235728622855, 0.099736221902574501, 0.10382748525934579, -0.0017267232813016238, -0.03337998864511238, -0.041015759215952706, 0.028074948889879575, -0.024175373112944334, 0.00037851506203986224, 0.028290086601225291, -0.017177690879414606, 0.012211197073898714, 0.021090624041023867, 0.04880110436342628, 0.058893006766919061, 0.041186307677804096, -0.050228037757938743, -0.06358869101157405, -0.01627885622405395, -0.0047556909859505087, 0.019166267525767756, -0.0042859855426942489, 0.072221293664227526, 0.027667668809319687, 0.0076072348731966626, 0.046251642681222054, 0.045327516936598013, -0.058087271467788915, -0.052568654253287897, -0.044762413503640928, -0.023155518065321151, -0.00017763235014638958, 0.052359997711985393, 0.017613369441475152, 0.026754240173532909, -0.0071592410268532612, 0.021450091526662492, 0.026061341438602878],\n          [0.074443033622211968, 0.025009703449449541, -0.0072387396885091188, -0.034581203239581096, 0.0075069226962646007, 0.05053220778206742, 0.097728950382035856, 0.10515405254550375, -0.0020885631160830892, -0.06460650708474773, -0.071900877008339387, 0.062709555161575961, 0.04810964818959447, -0.0061288197958455914, -0.048707571007934714, -0.028878035144916103, 0.049283029611296138, 0.10301464073332151, 0.091885368660922062, 0.1083066909121139, -0.0069201860463068421, -0.0710800467482154, -0.032385403501740219, -0.041456597157549895, -0.037318284584525352, -0.037271263481650524, -0.04033581670492567, -0.030542208455988901, 0.027846343886639854, 0.051125764403077464, 0.039457863125580993, 0.061533816212355034, -0.0088597136956959643, -0.058002594376894451, -0.036151038770433672, -0.039853560057399352, -0.048559742972093256, -0.05876298366017621, -0.083101870117629206, -0.091875530060523458, -0.077266837651363607, 0.00086206636286371985, 0.064567560492729381, 0.05176416503907634, -0.08735727608117326, -0.053385067235642, -0.019429217609104946, -0.023415415744384521, -0.085630336992695857, -0.12611138326972099, -0.086691614144378967, -0.12449403321207964, -0.05512595439100107, 0.030267444104458113, 0.083602405077763398, -0.12583781900425739, -0.091278147423601561, -0.073530346048646777, -0.085045520153049808, 0.011889706660064834, 0.13738456218349074, 0.12691757918372121, -0.020511658061573332, -0.083331527006269501, -0.045688290860109199, 0.094721631783419011, -0.1176819000585845, -0.11560656474484407, -0.060549525031994025, 0.081984888033411141, 0.1704420734813879, 0.11965727243025565, 0.11254484229099559, 0.074741052413934445, -0.025737622919062741, -0.033587219072488843, 0.03411352154081515, 0.051552692766032665, -0.020222946025836006, 0.045690451059582811, 0.056071133353337008, 0.020997592772981258, 0.044561510792265002, 0.02939148849213119, 0.026725272806523891, 0.013325176508616088, -0.019772518292927338, 0.0027475572519997937, 0.12423204721233166, 0.045549710745386038, 0.018947387510806379, 0.0057239875049261008, -0.0058699208305394712, 0.0050369550657840267, 0.043724054901299908, 0.019509400602205587, -0.0018887858002489578, -0.0096177381092612257, -0.013199600334816992, 0.10143636127977371, 0.08518214265041664, -0.013319980029247946, 0.0029189074659387582, 0.010087593201327683, 0.009493285904375974, 0.017930356539244602, 0.031406637685000433, 0.011733720402003947, -0.050901070261947852, -0.015735781911257421, 0.029231279797781562, 0.048511610011102664, 0.013899380735429394, -0.031157761675669398, -0.040662087603105253, -0.0083011423756094577, 0.043045372058056516, -0.01096803936953996, -0.0012438578375955772, -0.022626520337825511, -0.11765611182461798],\n          [-0.039873480685186327, 0.00012184835774546317, 0.018432499523696314, -0.06030489971984803, 0.014643208225874137, 0.012981315846513394, -0.0070294048340999865, -0.055624566982403527, -0.011913096749220649, 0.0084124976996370008, 0.010420634562858239, 0.014232327032235419, 0.0046832226936113219, 0.032819982634319213, 0.01320726418626594, -0.023533808891275709, -0.011404581263416494, -0.042582175203416311, -0.018915023456131434, -0.049511208703627144, -0.01836613958153846, -0.0058433446262533108, 0.02231630230741475, 0.021334764569425978, 0.034666291388462299, 0.060010301185060864, -0.034246065227552185, -0.047005499650124551, -0.047921871802546437, -0.041048831403235529, -0.026713641204057077, -0.038789996127014961, -0.018331240491325174, 0.037976867862023977, 0.028813877664190697, 0.019770359402909235, 0.03728944535318747, -0.066962988411517793, -0.10295356437958489, -0.090035338267466014, -0.060415802785235138, -0.030821512733484054, 0.02401335406847712, -0.023615740770755671, 0.014617912689912915, 0.0051973456583133126, -0.0053408769578060511, 0.019716826597634293, -0.078766904193264292, -0.029296548169388054, -0.023280430828030781, -0.014403388911157673, -0.0092263628747704454, -0.033409036299127719, -0.020726200729135634, -0.035931925994181074, -0.023010380673947554, -0.039252395604041306, -0.016760733401697973, 0.053608280303007586, 0.13329950551225564, 0.16489717632675976, 0.090281268337484705, 0.045229665505339148, 0.017404381514372763, 0.013597897839994186, -0.047297713743641646, -0.067622094327431645, -0.027195636559411811, 0.065506393613748479, 0.02232560477300298, 0.046885888199241804, 0.043068894433184998, 0.12018260070272857, 0.084302508484961486, 0.02067188016168707, 0.020184511766629731, -0.071050894359262914, -0.079541739094958583, -0.016269072364149793, 0.033354715485268173, 0.028706024706301091, -0.012011749840849373, -0.015402866346903674, 0.031358471867631604, 0.10476667408686299, 0.0025587486589462027, 0.02110857377048439, -0.039307670372500075, -0.093767551228405063, -0.022120949123226506, 0.023658016755843218, 0.001624116197708074, 0.011496266326477288, -0.039666836714535372, 0.010910001919740123, 0.063815810827050498, 0.062964749256176525, 0.011666021976556945, -0.024049027553408542, -0.0027908618863511994, -0.053241603898009714, -0.014763231808325047, -0.0095880408564158331, -0.031086972870322235, -0.030644620324520727, 0.010272461123314607, 0.03748199758443737, 0.060317495169656093, 0.024907320438576977, -0.045599623540660161, -0.020357685838190937, -0.062106166980994727, 0.036986556057447252, -0.038453069856899391, -0.044856589426634154, -0.034310651524162267, -0.011783723308224799, 0.018762824804810944, 0.061657489154879043, 0.040804009950206069],\n          [-0.030967376640442579, -0.034704706474157576, -0.030029036584246833, -0.073209132466448931, -0.048949076143639865, -0.038640662410442561, 0.051474764052445811, 0.074236855663231974, 0.11134675135754504, 0.076704056724054892, 0.047486303599635876, -0.068455613733398521, -0.035128511996496081, -0.0025321681540545343, -0.057133697514561765, -0.053440600419679241, 0.017148650385363479, 0.052110170662047414, 0.058782183168318736, 0.047056961446036369, 0.040322325256064898, 0.0078030024380692647, -0.05608339456723066, -0.04684682593449583, -0.0065577385795995147, 0.015471094977111979, 0.0066614780906229729, 0.052620395249402485, 0.00019300929351519225, 0.077547069508788119, 0.050313782394810311, -0.024569188095571692, 0.034662886943856788, -0.0044029950458541103, -0.038893398080935566, 0.018694283839760885, 0.035428018363409447, 0.060685907655044814, 0.0587413540716437, 0.0014872430743369924, -0.045756325846127051, -0.047944642008308877, -0.09281792081715598, -0.021043716683786656, 0.007562208390103603, 0.0087802886352499401, 0.024402794551533658, -0.01824493391613341, 0.0056819486787151258, -0.122005902409504, -0.11277710237979818, -0.054719494073167244, -0.090166889383778037, -0.032774893151098286, -0.079640484686983273, -0.0081433425803733028, 0.036415554732213973, -0.029719246379058512, -0.08343173036099473, -0.097009718713933338, -0.078382336396330896, -0.061852431233739499, -0.023645551992256014, -0.040447890302015635, -0.078556226205249061, -0.035218950640358182, -0.027448566314184852, -0.0024221651587159679, -0.0086513582329476105, -0.069055941187435799, -0.046263515682347614, -0.026683587106414781, 0.0085151284734774242, 0.01510527176030271, 0.031314100341752416, 0.036056075842148129, 0.025591220637012156, 0.0051353834527485057, -0.023005349498057173, 0.02104724020668694, -0.014202301085685001, -0.043601992702429357, 0.014083946209181006, 0.047988366041463205, 0.0040768949537646898, 0.040069615686237701, 0.031368092441017473, 0.041401907932681482, 0.0083542366285301942, 0.053523984896854969, 0.038346576189893421, -0.0075354880301602006, 0.03383654934661684, 0.037701959013775557, 0.023170719193185016, 0.00063874518894980505, 0.022456779814042073, 0.058804006814905982, 0.033465949399417834, 0.011933873490689997, -0.0031202988762389951, 0.016068746672777481, 0.037621893043980711, -0.010942651485316122, 0.046299383766535571, -0.0027637682590763851, 4.2316925059140975e-06, -0.0038944346280027366, 0.0096576323773187346, -0.01850966706940272, -0.054006078059137416, 0.017238219091326883, 0.0091596910151990184, 0.028996863874777658, 0.033952601882988653, 0.070753339834244089, 0.0037809506474898429, 0.027199587204016329, 0.0091419719045753873, 0.027115188408680799, 0.012709694003767591],\n          [-0.059221606655608681, -0.0013807397121916331, 0.027612645957779638, 0.10526838045136652, 0.056162190642178922, 0.063381996846630956, 0.0052813907213748162, 0.022701227707487698, 0.023071399548784132, 0.011640586008089752, 0.037100581562280036, -0.096537301671241846, -0.037974704225794617, 0.00038732579738916815, 0.050625050016267568, 0.065086729085677475, 0.0010273202640978113, 0.01030282761678826, 0.0050327500226482608, 0.050959342703142202, 0.053161832471559013, 0.03088817116176755, -0.021359024956780739, -0.030126662636484423, 0.014336380788901357, 0.044081582390044685, 0.045143284913980009, 0.01394262266053127, -0.074479563024112405, -0.021194650491958511, 0.010166296540795764, 0.028011887127611046, -0.022728767470732637, -0.033769750654749603, 0.0042313533530659725, 0.022686514054856353, 0.046542045913330762, 0.11310013896650321, -0.0045051511040681974, 0.072383588936866153, 0.037891919978813249, 0.044639985453488233, 0.053304796345090825, 0.055297501218708925, -0.025259737537897203, 0.023523250437604698, 0.029550788938781603, -0.057103923688581644, -0.037228050464029057, -0.040334547113759743, -0.066002394454861085, 0.051805877339979295, 0.09092132214492693, 0.015823331139374411, -0.038665412143877739, 0.0092906515574926254, -0.028826426019922906, -0.074980989084462088, -0.05787442193814954, -0.10795622255952429, -0.046546338514420166, -0.11181899441749669, -0.10192418752175381, -0.085702414165345311, -0.093905868491930569, -0.14398389568329137, -0.056828585605448137, -0.06626357512710776, -0.071883231030884079, -0.05541027253169447, -0.0092822545503814802, 0.0018363519548447033, -0.0066183382174312272, -0.011825162483750359, -0.092520252931136554, -0.088262059348965707, 0.0069521222062057519, -0.025393087237703255, -0.0063946991298149333, -0.043361744350810506, -0.02217358952694239, 0.0077218815463931945, -0.025334117749954241, -0.0083152640572634468, 0.037370584638286568, 0.012798906233440717, 0.015685495564438989, -0.0096592020340569573, -0.0057848888032873691, -0.010756955350811635, 0.017757324648215944, 0.044529547669743041, 0.0041941047626251615, 0.054645185961794018, 0.039709597938149141, 0.033910773481424995, 0.065271769100368901, 0.034889848272914054, 0.095387104413498985, 0.012473593139358034, -0.0089935075779601324, 0.044380357060880754, 0.030765480187302234, 0.018886724239982972, 0.031787912403243176, 0.031673790743440955, 0.020196643029900062, -0.0012983094411241694, 0.046204156701180166, 0.043616528938776683, 0.052279675166504697, 0.035528670172807794, 0.048752827422166391, -0.010956478364744832, -0.010948307255129602, 0.0023335073954288315, 0.00082619959707538188, -0.028699221681917506, 0.014221929018802294, -0.0098068806836790964, -0.035272762342824268],\n          [0.062946872449031063, 0.064519394879077666, 0.032897359514565301, -0.045711891879663097, 0.020599391374711062, 0.063655199236485299, 0.014615769796257505, -0.027440870743054617, 0.035616222562863675, 0.0094036093827168515, 0.056507446197265193, 0.031272529009901337, -0.011034554575282393, 0.038887056697409605, -0.021343232536083438, -0.016082974355130925, 0.03398009131937528, 0.052626400504158947, -0.02529516749703499, -0.026548720706405481, 0.030680991925506617, 0.027583071986928488, 0.080966719325337916, 0.035373199613146035, 0.034900256392934439, -0.012798813313152833, 0.04319156099995615, 0.022703220357838422, 0.050265373853632632, 0.0003437400231437425, -0.012567197236507482, 0.073429633782059245, 0.0065301063919971924, 0.017281768786973933, 0.049276004779088722, -0.02725340162513791, -0.0086520578662400288, 0.047527074820523915, 0.17861942818684309, 0.086809068021657401, -0.019355178240588661, -0.041870304853726628, -0.055304753608100707, 0.078290837231694221, -0.12690621836570407, -0.096279890589654596, -0.092541121932859904, -0.10216764911335079, -0.041913347291723559, -0.0061568695399335446, -0.02394181893475637, -0.05181154571828913, -0.12530688042526772, -0.097862179590048642, -0.10634083467860724, -0.088741745636640959, -0.060958836535120312, -0.031993056376924268, -0.036846220231738974, -0.092274010347915825, -0.11353320653734295, -0.036146695566072848, 0.011596830638808633, -0.013143670931630894, -0.063917360565445863, -0.11042459480083613, -0.012415575911984202, -0.061286683792012901, -0.019683898333121175, -0.02351836883559362, -0.0066523400160384549, -0.014484754457127935, 0.018028020927321566, 0.008084275012827935, 0.036972370716564971, -0.018618144071885362, -0.10924354613828609, 0.030523206341700047, 0.01298880090453846, 0.040120142620378607, 0.061496119916373056, 0.048449961530989391, 0.01921366891131086, 0.021510068544701624, 0.07209312331150311, 0.037410161917291698, 0.049160122975013168, -0.013141343062868835, 0.060642537004008013, 0.022194682981879085, 0.05129865380619493, 0.013217705879822975, 0.041765969490498975, 0.010615751276552232, -0.010207688567782834, -0.00057559828671693847, 0.076314244622539648, 0.017510356925100834, 0.060847396478783206, 0.03300347337813607, 0.048984734512022551, -0.0064822252096019221, -0.0021063249759751858, 0.010622816122664164, 0.028538830399705187, 0.028618408701009158, -0.023485260352655107, -0.0028276174189336839, 0.044105954184393642, 0.022574759621766721, -0.025473428596684167, 0.026401062552437127, -0.029859950686759645, -0.035148145207273412, -0.028004242193563095, -0.010874515898578971, -0.02520644976850539, -0.031472616887933583, -0.013822064554071298, -0.01097289405425797, 0.076092357186882495],\n          [0.03690386612248002, 0.056002218089369685, -0.010951719270400923, 0.040331097511643155, -0.0037441455323561496, 0.049112125114183058, 0.0079169665374183087, 0.11344386642727713, 0.0007563312264983052, -0.037482571931358309, -0.018735772189985789, 0.011744945269622539, 0.036505508708255696, 0.053399713960056966, 0.023086150106013142, 0.0044152509684453195, -0.0036748654077677217, 0.049656981135381167, 0.0045969535450092955, 0.040392794162983123, -0.029097892231179194, -0.074893865276321803, 0.0016705057712694963, -0.032135738557994634, 0.036750173986759005, 0.032029774955991561, -0.025110352420147287, 0.022110635776293401, -0.011118779729623884, 0.027123502587836187, 0.061095462079700222, -0.024783808630182078, -0.059955925032526225, 0.013711673076898898, 0.036557533368247498, 0.084110261886928162, 0.055950231294746772, -0.020007452447925414, 0.020788588159875922, 0.049865734304206946, 0.039021923151225379, 0.088845664746401071, 0.012344115511745107, -0.05538843672808838, -0.0283890960033647, 0.025833332510384673, 0.10641983969927944, 0.052722918301459212, -0.05478356057464559, -0.10190284716601143, -0.049794325260415453, -0.0069085612468734042, 0.018752575433158634, 0.0082097852631209702, 0.013268033828822395, -0.18180783799950825, -0.12595865108667029, -0.094587062767344646, -0.027564647202767342, -0.064339970972324884, -0.091630782859498369, -0.092278488340619053, -0.075570027119632732, -0.11647913534085745, 0.0033701825247711877, 0.029872248721253027, -0.049119870012074435, -0.10950490287540141, -0.082985533821943222, -0.020757266879069626, 0.032839871737627147, 0.027498688090949394, -0.051265177840992882, -0.028726904129193459, -0.074362520404752469, -0.078828379945006022, -0.048211245977380933, 0.024174951415566678, 0.0074472807679010818, -0.0074232491688529523, -0.00077866185976915858, 0.056674802683761974, 0.022479560933966962, -0.022053321065962445, -0.025989291569709812, 0.0064102606195954315, -0.020235352690214578, -0.064838171573315492, 0.081539627065815912, 0.050559787196516853, 0.027640931483737141, 0.056668491330416827, 0.031151110583386293, 0.039877476311591838, 0.032443819125262119, 0.042982667461244774, -0.0018215713348507297, 0.0070637700109989279, -0.0058429795351756103, 0.067603762059298383, 0.03091253675538988, 0.028071888777783896, -0.0010850231199715735, 0.015534670537972986, 0.043687190194000733, 0.01938400318015672, 0.032939688927880212, 0.057370488644266582, 0.0076083295877509421, 0.0044986928101548411, -0.011421955766557471, -0.029081272069140879, -0.0036106413708782165, -0.0032691409082095807, -0.063551586196383944, -0.022937264529547606, 0.0091467010626821721, -0.011390797309113472, 0.068187506046327936, 0.003884385505889279, 0.071448625051746401],\n          [0.093670053378816731, -0.0060185803724412124, 0.064975253447979997, 0.057204813928574239, 0.032039357303312588, 0.017360690928795997, -0.054310388367495258, -0.074304010831156467, -0.022133608826072002, -0.03441434222392329, 0.0044162963247191128, 0.028938348016603214, 0.01658488166499885, 0.025525405954675534, 0.035893961967071938, 0.0076746895655852576, -0.0019368459518004297, 0.0066707535959328046, -0.1042360605814506, -0.00055454840969697966, 0.0022380826663202374, -0.02840948162941799, -0.004017714090244609, -0.013989051801159828, 0.02542809328073873, 0.064148365472184235, 0.077485765766674375, 0.034007352893400962, 0.046771269374739369, 0.054056001025575479, -0.068291615724358462, -0.01191564128605152, -0.08236908091325304, -0.034026953075964254, -0.093926696408503804, -0.028299026068272781, -0.083187856060272347, 0.0068670213408899561, 0.07996019523365458, 0.063771902655339469, 0.00087634234802598868, 0.020691801513151017, -0.012739227946535911, -0.018539467931270818, -0.082159033883173249, -0.035509269486481018, -0.0903794995968909, -0.072582351048290333, -0.10221116757608581, -0.10665056526245895, 0.00090250733424238061, 0.015334595491633053, 0.046227730069698332, 0.038103240152997334, -0.0062461221580594889, -0.06724561414366495, -0.053325522122090241, -0.0029145163841420574, -0.055345741892996264, -0.055246137408700977, -0.11556942735569369, -0.12678748176917243, -0.018650402834112373, 0.0201115675159311, 0.0072374544322631939, 0.013539302016072579, 0.039109407585483882, 0.051641698907963052, 0.0078965365952058768, 0.023870730531144614, -0.017458058805458504, 0.018892420656760625, -0.10504680212429973, -0.089680004128360968, -0.04272524613046922, 0.026724916448450958, 0.011635965581891422, 0.084889133812557832, 0.034194689506569786, 0.065857255458405553, 0.0042427078937929356, -0.012401464228490738, 0.042722865239520375, 0.033509236615387683, -0.0086452874579218859, -0.091769778804805302, 0.020750157767451382, 0.01987667311893981, 0.010694698759597054, 0.047156458758485842, 0.044111484618501104, -0.014434725200227233, 0.071373855704184225, 0.03475623227161978, 0.040578493255194692, -0.0071662870654205096, 0.025407664409730447, 0.043339417631733802, 0.010480242779609582, -0.0087307063681051136, -0.013411411822995711, -0.020394509035250141, 0.0060121542292144725, 0.024188238197290803, 0.041668193822485079, 0.041183226601004416, 0.10243115564821167, -0.02940584456446451, 0.0031099245285817669, 0.0030508999908164854, -0.017382195539308282, 0.0048263750639246927, -0.026781565476663695, 0.011942148044968376, 0.0024678281518802359, 0.040929003265524629, 0.080622599957161575, 0.029178579118654943, 0.043038714976740611, 0.0055501733506574946, 0.00027909537625575576],\n          [-0.033397311394149677, 0.0096415007713644973, -0.018236744035314625, -0.034138584815056695, -0.0024438916753326198, 0.0055087071850375355, -0.0026268037119103198, -0.028241098838151658, 0.0052159942036530127, -0.021235364030436632, -0.047073948370721506, -0.026121704506604584, -0.027138348751118566, -0.048107435408362653, -0.040211279822578397, -0.030102378969085283, -0.0032792712208641666, 0.059678613392050002, 0.006758383300518157, 0.030667242997798105, 0.0095436115343644611, -0.016919082533258429, 0.0038233095813847151, -0.058995625065273824, -0.030890606711754587, -0.058149589871913064, -0.0815351815818076, -0.0063579538770199284, -0.017080813200946385, 0.043337478406891949, 0.062983597436613734, 0.040401309594868401, 0.0072034023998875183, 0.011592685433827972, -0.0033021456500918062, -0.057816788607124699, -0.037812512707325552, -0.12425681152290456, -0.10985738895947982, -0.093812839880628898, 0.065001290338761564, 0.034843561028987141, 0.056616004034855671, -0.014925007654415651, -0.021164736244188381, -0.0032162052770800531, -0.012309755363306994, -0.017827196918306518, 0.035551161867388673, -0.07046756271563373, -0.034864456303405046, -0.017196442705869938, 0.02847927116818913, -0.022806581184283581, 0.03213417823424855, 0.026469237488508546, 0.009589558238125101, 0.035119287178089001, 0.13550727924378436, 0.13688661973317756, 0.16247997796144609, 0.015875158167285394, -0.020831151874117201, -0.0011812318416458828, -0.019841048216886314, -0.088082464896673471, 0.030457768879803171, 0.026063097480707995, 0.047026463061375465, 0.070569136656278841, 0.062916792803278332, 0.049798812429405107, 0.085485860229359792, 0.035141696932625741, -0.020167444245680122, -0.061685159646736681, -0.092847554814415742, -0.0015896852645350262, 0.016608882932934957, 0.055001587269276467, 0.070867931570141707, 0.013234850523530295, -0.00082083705696721354, 0.038004857877911483, 0.07357330886595341, -0.035371927316790286, -0.031697507137062611, -0.086248516693940486, 0.010390223430695129, 0.020133865530716527, 0.013595826448211168, 0.055294702876020299, 0.0095627226336793825, -0.021797178139167303, -0.0091913269986637625, 0.042724178575335753, 0.02896574564861093, -0.04832930579382462, -0.097000076388255058, -0.035392090036565821, -0.0091230528722667514, 0.047734194414938147, 0.024899519254075436, 0.040201783336123773, -0.042437436186437194, -0.0088865115923605353, 0.0034760730494084874, -0.012834489181082792, -0.011082107946660119, -0.086373612626070725, 0.010906720579881624, 0.001585372406144106, 0.059934049355052657, 0.039390631946712135, 0.025936130645470831, 0.018352465543086088, -0.066654985053579988, -0.036968952314477735, 3.6890828317398539e-05, -0.037622268779505898, -0.087738993271721605],\n          [-0.0096923145306643255, -0.014831123980443256, -0.020109046114375438, -0.041529783531830268, -0.079112823290570247, -0.028439541923334352, -0.047215277761511222, 0.017919873457542868, -0.043730620825476289, -0.0083077673092849316, 0.0080637615090816683, -0.042847844269627344, 0.015732582480551337, -0.035877042331939335, -0.020274620631426151, 0.0060017334212957209, -0.011038427925582694, -0.0079321859154538772, 0.0024669467939925456, -0.047174751648789807, 0.019484888947581012, 0.038912158226446558, 0.039176172588516966, 0.0053797578511889238, 0.01139452493864973, 0.022134514065384248, 0.10262246569682075, 0.060645448427255277, -0.0049047335544548376, -0.026337548147820675, -0.00031049715236153297, 0.021471089177500111, -0.02913111856188328, 0.049020954146217169, 0.04824653180085528, 0.087540872822502711, 0.07299558540439087, 0.019711133472069112, 0.053346275999322679, 0.068713013463729239, 0.0089235415332704765, -0.0091036040048159544, 0.0059129844090943101, -0.012742345396119917, 0.056214606413909123, 0.063790565651105968, -0.020641135671904988, -0.030946926450396303, -0.016711976557631042, 0.1127244564225961, 0.02689697887910851, -0.013567479905524482, -0.017090058647780196, 0.01477668396540264, -0.010781920436714542, -0.006922091337546267, -0.089428459457285198, -0.067232570801827068, -0.026910735478631764, 0.035336793970009189, 0.16956999523533778, -0.0065457838988597361, -0.024077365950438537, 0.032166605250999306, -0.017459200412506121, -0.040088844438940743, -0.099301197361124693, -0.011984969849644441, -0.027641332988394961, 0.012259320892963398, 0.099469618921912001, 0.030178783959567166, 0.017806737961083313, -0.031243892294941327, 0.036952968809518559, -0.062248228689263954, -0.018966613344436702, -0.066056215647809571, -0.02680077856103967, -0.012533495449249166, 0.024584778032468828, 0.056249746142491924, 0.041206463201368705, -0.010337287195679248, -0.044756156557245824, -0.072391192005918537, -0.0056600512539719122, -0.022191532906063322, -0.02597985228049178, -0.0048569317681961439, 0.0022456495424232501, 0.048041845230600719, 0.021878224718166694, -0.031093682711296713, 0.03107864582201561, 0.028619968620320131, -0.059947445075684995, 0.016801646203229784, -0.0025822067852190656, 0.084438821665531974, -0.003253904863717641, 0.02175579697998456, 0.044396143599607973, -0.0081787327528522191, 0.04342802310153146, -0.012815929012254187, 0.014790808529243901, -0.028622217225797268, -0.048854772240751264, -0.035404776408354405, 0.070880645278505183, 0.054724662067758528, 0.086068694846379121, 0.049869516112302004, 0.024134618019859611, 0.016045127809092008, 0.021408152684806558, -0.0019594348922353459, -0.052756609552716119, -0.046484303325115398, -0.068062813120118207],\n          [-0.044331925230770723, -0.054329522119882984, -0.051769461081186574, -0.01525353279808098, -0.01070122111548966, 0.0092804570085843405, -0.0062410209171876582, 0.020071586960402881, 0.063349260545734795, -0.04992151146932073, -0.024847935737445589, 0.061077328397192293, 0.073126703765815121, 0.034270104298964765, 0.035888286964653064, 0.065558812412295553, 0.0050893801576369253, -0.01742526677567887, 0.06410303374113939, 0.063690998960531819, 0.011936936642071773, 0.0065558893104545879, 0.059351618349500423, 0.036170614252957374, 0.073144876020142385, 0.043276296735218094, -0.0077362104397021465, -0.022748848048502378, 0.004668960540261835, -0.00069002660498715396, 0.063939712901835977, -0.014966710082811807, 0.0030727592791528514, 0.026662644906728487, 0.052820346942979893, 0.017109036507216773, -0.022408542987520336, -0.087084724994147211, -0.097569765420874172, 0.021721228084129754, 0.051712419939002871, 0.032756768677244273, 0.017819938585971133, -0.037825552779906096, -0.099906582374084577, -0.11007916981172988, -0.063039969832338297, -0.11065720406183299, -0.056463971331915969, 0.026810997895988217, 0.075619829451265996, 0.073184027699837118, 0.035501377120659039, -0.023904618994720753, -0.017844665146339908, -0.11756514198915489, -0.12168288991626966, -0.083114279850997466, -0.034920888410994, 0.046766450072332821, 0.058773833741353781, 0.010496365445282875, -0.0022130497808088385, 0.051099528389418059, 0.024774714859440425, 0.023471290407304626, 0.015631876716462951, 0.017970346390513474, 0.0019335540535132985, 0.03051462142073259, -0.031110061550176205, 0.03360548749067617, 0.036258212592403839, -0.022201080422089837, -0.023002827294496608, 0.014758321300040728, -0.0070368058672472117, 0.11790263516593479, 0.049474341493852388, 0.062413173309873948, 0.052777269288969954, 0.0094326378468209612, 0.032163792810796982, -0.0071375680551991191, 0.0032748797229581496, 0.0067896199680393572, 0.022973239078915367, -0.030044038850916659, 0.095054792203179583, 0.077918278809296693, 0.025170796867169457, 0.03248633395739102, 0.00548093487382893, 0.046288431253225307, -0.0048346651023808999, 0.010140951369667767, 0.0064050414683687936, -0.016192674375299247, -0.020769896639595678, 0.071543155267954142, 0.041811635752456604, -0.0011513813928812448, -0.0069609227018348346, 0.016359548418687996, 0.025002761420305327, 0.02055238314967053, -0.0015891153508810953, 0.036688265432544012, -0.059254810876512506, -0.004524146766604867, -0.022764896844005511, 0.055697322831434269, 0.058835090349322952, -0.017695954014236001, 0.01434475115987981, -0.020605598415603534, 0.021010015372295208, -0.022474770741166539, -0.040296790452836906, -0.040551682538183538, -0.036579658592001969],\n          [0.048679672604873575, -0.0052210780917486968, 0.011189809961728723, -0.014770773614183955, -0.034142207536203256, -0.028004372616342227, 0.0059493580101942483, 0.015102059175930433, 0.019900835917708519, 0.039960819331958518, 0.0038194214559740605, 0.01388991934048571, 0.075502995650847393, 0.05989103883686564, 0.075512404372436573, 0.073756282062729772, 0.10697289779941345, 0.068740762469562872, 0.048031325115771309, 0.042366249770111879, -4.2026778606093357e-05, -0.012109444919293957, -0.011318629446975792, -0.037381626729477938, -0.021548420500173249, 0.018481632817077147, -0.0052013341004672684, 0.027476505756756441, -0.013858276037494007, 0.043728377691453817, -0.02503235093554558, -0.029686717094650691, -0.019073492339460648, 0.033491515961355481, -0.065963899461171427, -0.062341635557177519, -0.075624328092431956, -0.053585585183758444, -0.02877361255805902, 0.0066218070173488103, -0.10035769919352369, -0.089046460941984568, -0.046139804006717938, 0.07297541439744247, 0.08725084363158328, 0.045168092371441648, -0.05333664579595656, -0.082409439250664893, -0.091444433373020814, -0.074425623111224221, -0.092126329411898994, -0.037674636051740117, -0.0056525304036601151, 0.067513154505640993, 0.093934210469869675, 0.0092896691237717884, 0.018516434326696123, 0.037297581799338571, -0.021567249747191534, -0.034818877231227827, -0.02178280374647603, -0.02580882232156104, -0.036853163117586477, 0.005007242741758529, -0.0054865350633394733, 0.03688895314986719, 0.02030363893313307, 0.062349708701591948, 0.038517231153257302, 0.067307645991564954, 0.058616348298225311, -0.0042177704428246199, 0.054673040661478024, 0.039230731169713394, 0.031392491178710777, 0.043919434454236447, 0.043292679240196676, 0.01880512733348403, 0.017382645623532596, 0.059661624010023243, 0.033698675096640159, 0.013341888531181467, 0.08421015245705174, 0.025430986838139963, 0.012904413846026745, 0.065431122065089942, 0.011197289986359183, 0.029135622794168346, 0.062540987885654917, 0.045382776129875506, -0.0053462603961966226, -0.017266787058448405, 0.020420174075574692, 0.013123043389498143, 0.01525904905961481, -0.018730258477720974, 0.023824284687915143, 0.052818399981128895, 0.015447226033022343, -0.012489602024893638, 0.014683734340722451, -0.02685260219002731, 0.028989118420292514, -0.0048952379910385084, 0.024941536558213226, 0.080074825915833162, 0.013282727442137699, -0.030419960916935621, -0.0077058669293919302, 0.0057615039328642731, -0.022997491985162988, -0.031813252703541905, -0.0074071331247387365, 0.0074685762164737393, 0.066651669608706721, -0.043189594128709249, 0.0087486094318929737, 0.035607481241798619, 0.0093449129697469185, -0.060325944063403136, -0.02989706486831599],\n          [-0.021246880546086595, -0.022203836487912819, 0.086827201278774843, -0.025228269953020035, 0.046971762650786793, -0.032032705567453051, -0.018784965671998312, -0.004315941436901353, -0.0418268952943677, -0.06928924256853522, -0.0081666516254654542, -0.017438229004257164, -0.024335471310471764, 0.028654380266214648, 0.072066491882920122, 0.016590540091147674, 0.024633229035089028, 0.078139556365993512, 0.056622200409004196, 0.037502807115330446, 0.037840229470096992, 0.032000001430608604, 0.013106472326739116, 0.012369223564270927, -0.028705902974894969, 0.0050659301606566509, 0.013853418541047425, 0.00055953040940459609, 0.020322571781100932, 0.07527603584001831, 0.091912646107956533, 0.11098583412431406, 0.078216838723305357, 0.015546123816145365, -0.01174475399733392, 0.051737996061461511, -0.012734123174444889, 0.016768985632801714, -0.044365898602312492, -0.099553508533813909, -0.050100281868429075, -0.0572477447691047, 0.016222179759918118, 0.067599657169812671, -0.008648050879736989, -0.0032868833097521172, 0.0085922588825274523, 0.046767940575399347, 0.072793826165235873, 0.045294967050798711, -0.084825295102879616, -0.14860512013508548, -0.051316060883006345, -0.12479434422523886, -0.085078856704692979, -0.0057128248462955805, 0.044162552063783153, -0.001048023139082116, 0.030855043319812047, 0.035139310135952784, 0.072277327757524351, 0.053917648452753389, -0.044671527799533012, -0.082684884460253502, -0.10599899450799834, -0.15447137644238773, -0.011133194850090913, 0.028927718717327938, 0.0038563782177809536, 0.016247602026169011, 0.017415917794260313, -0.021407239152637751, 0.026964006691972034, 0.028130757592115849, 0.025157803866096017, 0.037924085124599397, -0.0046849643873905084, -0.027697413203631536, -0.041378992383391267, 0.0087612328882413319, 0.0052052300046328374, 0.043900410523183886, 0.077610211778951319, 0.023415755123284865, 0.060860467661889836, 0.035574343781129072, 0.071927577630225378, 0.064070926820927313, 0.013357966646117945, -0.048365636178152809, 0.029793021490433041, 0.005225453074711478, 0.001772380719733067, 0.043271021300702546, 0.061871883282456325, 0.060250041239335972, 0.0059220775592172988, 0.067275053929414422, 0.10149603554983715, -0.030661903793952457, 0.00089428604746767844, -0.057645311311752261, 0.033294846298777651, 0.024005678533927544, 0.0049160862915328327, -0.018549226060485483, 0.028088385775127147, 0.023382362593578041, 0.034065125172518744, 0.07678838837073973, -0.057670084152690565, -0.034527649268692978, 0.021760161147630741, -0.072333662591223591, -0.00053618118175239454, 0.029546492159811099, 0.0043528145210185842, 0.0050096626752825398, 0.045672332663587202, 0.027025414018034634, 0.047574909566606413],\n          [8.4608016445507188e-05, -0.00051458603662822393, -0.00065583344160838331, 0.00020678855120534164, -0.0011087422000772406, 1.7282608213937956e-05, -0.00069139299457388927, -0.00067753460732458931, 7.4613346472338082e-06, -0.00070526584292512906, 0.00036510757807054156, -0.00022612583636142519, 0.00083733124736023318, -0.00038556424752306945, -0.00020677490024442052, 0.00010703864033769633, 0.00015849441156012833, -0.00023178848590595102, -0.00023816000343533997, -0.000420628080187814, -0.00035892451039670759, -0.0010410723256383952, -0.00070994799374692746, 0.0007230031202940905, -0.00024735560793927303, 0.0004891872672126707, 0.00024923784651577352, 0.00060668980402729254, 0.0014982106812944096, 0.00053619751642124819, 0.00050086941012989633, 0.00089806877848291194, 0.00023875283911756195, 0.0001569025840717983, -5.4315342210856099e-05, 0.00056173407996628483, -0.00015464198944174475, 0.0003080961595964592, 0.0010477498266872332, 0.0005403071450221222, 0.0020027631503172446, 0.00073696212701762631, 0.00041837758978503781, 0.0011534221243659493, -0.0014158435817800425, -1.73851858713929e-05, -0.00033269545836868853, 0.00025908994851942674, -6.7895175314192091e-05, 0.0020025402967875014, -0.00060120961823892718, -0.00063728772747552453, 0.00088528834369269727, 0.00051385231712379464, 0.00080076929798790497, -0.00021374130033396943, -0.00012763782981460581, -0.00032299201148121293, -5.5463761258908728e-05, -0.00038413195736432953, 0.00098095746371240633, 0.0016769261261450272, -0.0002368271084003809, -0.00047131327166750892, -0.0011833841321572391, 0.00011652969229286516, -0.00069780759172321442, -0.00081516216404033115, 0.00031471538464767062, 3.2977760094066362e-05, -0.00074268117841487513, 9.2834374935888298e-05, 0.0016276084011049713, 0.00052039347413883026, 0.0003285769128429112, -0.00090914431575088526, -0.00066273949795000141, -0.00049429425680350917, 0.00081787103240475723, -0.00028646816494606181, -0.00047774822091328339, -0.0011287002050334449, -0.00014958608778612575, 0.00067727909838368253, 0.0018426861751217457, 0.00042127435964937898, -0.0011897602501548844, -0.0021020944752171283, 0.00025862501872599489, -0.00028164777099942001, -6.7871288290041742e-06, 0.00010673321891338397, -0.00081946733629025144, -0.00050655780311133561, -0.00045739009384393806, 0.0012233134687435353, 0.0012483089084911257, 0.00023366693745787998, -0.00049653822033247572, -0.00060431039974054301, 0.00048856312080340636, -0.00039402287572039285, -0.00030282982425909599, -0.00048297968441542161, -0.00045029888856688155, 6.8065154860727506e-05, 0.00029380813408220671, 0.00080750067552030902, 0.0010027117298195727, 0.0012117980796380462, -0.00031499882641429153, -0.00096615449547508142, -0.00016520767145138809, -0.00025930083458174102, 0.00070444567594835084, -0.00051524971604912512, -4.9950991088697216e-05, 0.00023269835482522989, 0.00098128070058338401, 0.0017427389161336626, 0.0012748954300746823],\n          [-0.09216726473640563, 0.0056728742547598144, -0.0093745125247278963, -0.013062003758843106, 0.026810754174940429, 0.049001345358430204, -0.021651121797821183, 0.037001156569604607, 0.0042183127400313627, 0.0018620748056430826, -0.00028650345860718393, 0.0053573451925248185, -0.024952282021024397, -0.053963168016106317, 0.02220135440090492, -0.013351422685652972, 0.012385499720994092, -0.018031103648731638, 0.025521909572096997, 0.01253732595969557, -0.011991546378321899, 0.045186572016900094, -0.0094335083884424294, -0.0044184293091944493, -0.013784342121793192, 0.025926061962200528, -0.04105356169652366, -0.03889277471178329, -0.039895674599080957, 0.035441461163177923, 0.023677237357549445, -0.041021777310156667, -0.057695608854404799, -0.01762676919993638, -0.020216604797755007, 0.027628137586160582, -0.018841264850454086, -0.015264367494595166, -0.042662519918908834, -0.076631880879329428, -0.057528782374830695, -0.014904729302692682, -0.066897780001713703, -0.06532989573225445, -0.0076505652205603458, -0.048586565493310384, 0.085981797610375443, 0.023144594932235765, 0.069502587525011622, 0.023606740362224744, -0.03701131089094889, -0.086463629853619134, 0.0048593320315824251, -0.047933152033371423, -0.065202394397951363, -0.0083087466099175528, 0.0036048909369455263, -0.014176009427905843, 0.086524500164412141, 0.025019184064985066, 0.18351010232889509, 0.1773063621666941, 0.05264594509899273, 0.046296374049865419, 0.017268040614808002, 0.091744326777185067, -0.011476730811934746, -0.0031098305214721789, -0.044720850821788796, 0.035194984568811871, 0.035161502690833665, -0.085225661297846492, 0.059125980810968093, 0.14804082639627478, 0.094893897974964725, 0.10021021442994898, 0.09479988677758025, 0.016819487190214488, -0.001620802251457232, 0.0056983698526431037, 0.024660235147196684, -0.001744068586085468, -0.031929007957278016, -0.08234588274111157, -0.036631877507097843, -0.00060561413909040454, -0.0084923776484023029, 0.029092555992398725, 0.021733620396429669, -0.019868686758322113, 0.0049377342712525838, 0.0354455889830066, 0.035659507135636787, 0.057301879108241027, -0.038291855034349676, -0.061603790001514017, -0.062081937237464455, -0.043689034974759226, -0.019286854706340784, -0.015927077135257463, 0.020688030294743746, 0.0061874980221431662, 0.0079544756336816427, 0.038210084103014429, 0.017747129076694818, 0.018299098668275414, -0.071993890721030018, -0.04880614394384078, -0.041477514541540167, -0.074196014839536834, -0.043570050319461741, -0.024269573468651304, 0.048012036866646256, -0.0022007186161765308, -0.012800711217039476, 0.05287613915145286, 0.06224964320115732, 0.025342119373221679, 0.0028708573689360251, -0.041475224097980136, -0.016770635320925542],\n          [0.020791522234705886, -0.026685059276677248, 0.0052683881367612678, -0.034938985350819116, 0.021609135295030821, 0.072759833840912294, 0.041388662663081791, -0.022050570784842675, -0.03766921280042098, -0.038135589145765356, 0.056138069483269673, 0.01870086519715047, 0.024053272871131241, -0.044521548367207869, -0.0072802659094019905, 0.025521806490733729, 0.055898032390660567, 0.020086252624459025, 0.022257708387705265, -0.043113185738142573, 0.025460765149070363, -0.041999586106773602, -0.022103861342994947, 0.020436961749637446, -0.0089104142150475685, -0.040754212701411704, -0.044989111609801367, 0.014513662447400134, -0.024972880286720952, 0.041775700269714146, -0.020617899446434662, -0.027451770104515237, -0.0581210200819193, -0.01972807133154101, -0.064863569531781962, -0.065429246017521078, -0.034021394098613274, -0.070154069814679601, -0.047185801462871463, -0.066864913651470764, -0.066928175305740994, -0.045242116038150926, -0.041527188035858031, 0.0090971915515874469, 0.066566987623413135, 0.09217912843511486, 0.035601037862094155, -0.031646183711611257, -0.084854398526009359, -0.078071918455593067, -0.058063889054538138, 0.027433416517916739, 0.038430683267361994, 0.093545180120055263, 0.020820155765660042, 0.053867582404908895, 0.080126804974505278, 0.12823246066629901, 0.10909482374666421, 0.12328440515687174, 0.10908470088869585, 0.12750021442141796, 0.089820420443205415, 0.13206669887005298, 0.040999003255566858, 0.058589622623364139, -0.028140612810618193, 0.011014387203399659, 0.010818445027512502, 0.057563125740994966, 0.043454150260847313, 0.0638052153810197, 0.039304942349605, 0.014669342715182604, 0.031072595757211559, -0.064253742074883269, -0.058945218947391416, 0.01193269465678194, -0.088116225981897403, -0.13130241652649149, -0.083772332396980051, -0.057941723086485299, -0.054054451777421325, -0.052884392643230117, -0.09093972499912327, -0.054181261740231752, -0.048566262449049533, 0.041761684409925268, 0.052504158945313288, 0.04064045371279662, -0.017347415771619662, -0.076719756803110536, -0.061854859388876034, -0.020823169528688797, -0.062266455107789991, -0.047703214610949791, -0.040227307948697298, 0.046901220891254883, 0.057527412627830121, 0.02543790657840345, 0.069956528520047301, -0.0081337298400100972, -0.020791993788821496, -0.040001890418240753, -0.05758450686937977, -0.023269358988961084, -0.04372684111076177, -0.025274229592385768, 0.047881871341667451, 0.055113090538271091, 0.041259701309823663, 0.030577926161307056, 0.04016185297326795, 0.077325910227506373, 0.049074284090185986, 0.020718323049837589, 0.05262692548423558, 0.057604266834923888, 0.051058314474601463, 0.023973320452055122, 0.10154029156391102],\n          [0.038641739990258633, -0.0050244591541973721, 0.0046136555572029725, -0.0067584458968164562, 0.03142115173410135, 0.043863820713166662, -0.0015664513032071729, -0.080587538587864549, 0.023010888007158094, -0.031974497946145916, -0.045852604775241584, 0.0073321619577446512, 0.024538236370796981, 0.026493986359803483, 0.012817297004288597, 0.015872668762235975, 0.010885319603060616, -0.025021809184165841, 0.03751411496590415, -0.046294554576462262, 0.011215007929641349, -0.02865689693597509, -0.015741373908333564, 0.010582364969449747, -0.0060245340950563914, -0.0021638463212280828, -0.012232405683626778, -0.038573436738902116, -0.034196779922251591, 0.021758828506470554, 0.0040701402954654298, 0.033018994443948589, -0.051703841216797261, -0.053297422863193972, -0.087986965234679054, -0.036088517832627981, -0.024713800986492014, -0.045558468938308061, -0.06323440947763162, -0.0079875844696831663, -0.0012689882118882348, 0.047524990788468238, 0.014455312192059422, -0.018256989781913674, -0.027677988718192631, -0.073305419918544265, -0.062178446834711937, -0.056046138548416793, -0.061582574394783318, -0.013981639384921803, 0.036486130784949389, -0.018426595901044535, 0.072796751112711278, -0.0075590705083293415, -0.024644110824231222, 0.06168186724387318, 0.060668636974430631, 0.037713982535211056, 0.078054934945803039, 0.14418916995002865, 0.15559892027908628, 0.067521632288650851, 0.019945580585251987, 0.026658612914922927, -0.012069655500885873, 0.0057425840485807404, 0.083144548120109421, 0.11628270848199979, 0.053997152612150712, 0.074409611827373545, 0.067028727192838367, -0.054231046134796825, 0.0039030350681543971, 0.062433312935196959, 0.025820518574058156, -0.026726551682383845, -0.010193345611774624, 0.020415993983784991, 0.060395051991757931, 0.011092152032282707, -0.04696569874087772, -0.07052421722415371, -0.072561804228264887, -0.027650589315538845, 0.068449933489119735, 0.03300031824163617, 0.041736298644040548, 0.011928446975795447, -0.054917381191681824, -0.051653802268125909, -0.028773541890526888, -0.037452616870395278, -0.082340063854409298, 0.012374637017067137, -0.0058925331814810994, 0.11104715646061467, 0.016941481040333578, 0.03319422535043131, -0.00183737049680259, -0.095054133079783387, -0.05896573649709879, -0.040233306687047658, -0.046408592586160452, 0.0083076855640988323, 0.044775412494742942, 0.063589932355388373, -0.010508998580612362, 0.066094053744825035, -0.0027753074050847724, -0.010075721966416776, -0.050323575669113996, -0.0068444216705598714, -0.0041475728122527351, -0.0038945396282382776, 0.028366828254517029, 0.032085016082864043, 0.029300197945124618, 0.0032286359611920848, 0.071385590020760878, 0.023726429769362518, -0.071250665399322441],\n          [0.10872537789851011, 0.014278189525074661, 0.012273877115053775, -0.0081392543273338877, 0.057053104705377521, 0.042321601806311455, 0.03332397665498274, -0.0094696243183966938, 0.022832248497195895, -0.060308217357328699, -0.029388353818991391, 0.047862958793470828, -0.010046448412779706, -0.018988029533582834, -0.039885552090269713, -0.040504055383590309, -0.014328694386006549, 0.066888009783769464, 0.054680567071356045, 0.036468027087737401, 0.027426069930502159, -0.041156646091381657, -0.071083792516037081, -0.038858148067829321, -0.052404651812680655, -0.037439793873889099, -0.072141553723678531, -0.064831984361939266, -0.093370898670026015, 0.012492784149001596, -0.012992603451236887, 0.012827984972397261, 0.028495833153019318, -0.088967419902127892, -0.059144923132213638, -0.073603628874425425, 0.0014228258212915287, -0.061365580816495208, -0.054662891582800743, -0.10167804607960763, -0.086349086183820561, -0.013058338568626704, -0.020967276930948797, -0.02496861635421278, -0.00867806660644585, -0.05092789276026935, -0.012321465172884127, -0.00979595224133116, -0.06038602061828513, -0.073566019699290497, -0.098900952710465395, -0.095044913253043817, -0.050810313973777735, -0.020639393298860699, 0.0068008806732431596, 0.15285717060929618, 0.097545372872726313, 0.11067705492765795, 0.11229427860410809, 0.18427633371321137, 0.11307184167377732, -0.0045716220662144038, 0.0064434015987714695, -0.052854132609023295, -0.020146160375414821, 0.0036234729462064491, 0.055736679511239132, 0.046045942922945615, 0.022877085053644025, 0.019701551970110434, -0.044509960624947387, 0.026260060577445368, 0.0012791409413432393, 0.11282744913606092, 0.045955737539801839, -0.036756266818064348, 0.013792875001360963, -0.00031411118081339784, -0.024157026907081533, -0.0076891189431453205, -0.018310688556061716, -0.036924502766096871, 0.01587681789027176, -0.00074296065299485348, 0.04435085579041969, 0.093549734756817104, 0.034106620050054992, 0.0074666958029946731, -0.055729238389459056, -0.024914950480349144, -0.040394064221819001, -0.014479423659402343, -0.021786228199499567, 0.034462836766090535, 0.019018078277086774, 0.019995937468091644, 0.057264247676035301, 0.04080735202882977, -0.028382616191986051, 0.012260696627029324, 0.036426534866617746, -0.022902539374817468, 0.0068340274728649064, -0.0095408080735063794, 0.021714345796159974, -0.002425244709437491, 0.026186714013621812, 0.06273849289505809, 0.013100065944167471, 0.02184527152625354, -0.0064556273106626955, -0.018059624197655194, -0.011501119699467793, 0.011069356592404581, -0.0076555726632192645, -0.060373289292683437, 0.018730638535199164, 0.010878747575572504, 0.039313330705399122, 0.050533322267807532, 0.030800301775522385],\n          [0.040802901586182709, 0.065103705890545233, 0.01571760146393637, -0.042967026067333894, 0.053812288839959845, 0.074783021511556802, 0.057112073514354537, -0.0020897181911366594, -0.031444155008721532, 0.03665938914354934, 0.079577902386804983, -0.014494517062943354, 0.023853876703959682, -0.085960234475358457, 0.016421056516635474, 0.053098980528390891, 0.044587319319406481, 0.075787383037682066, -0.020575193628669223, -0.052303363133645836, -0.0027125538469783411, -0.025364536060143633, -0.075564109154979769, -0.039844635860099079, -0.035503765834440412, -0.031982916804728603, 0.016275057515532626, -0.014982688136025823, 0.0085162879583037827, -0.010415191123769537, -0.080245107677651376, -0.068933869414995408, -0.082117266151384732, -0.10868042731437648, -0.11517402154338535, -0.052169980652789334, -0.078002618803070467, -0.084743043622459768, -0.090079412279082061, -0.045560705318270327, -0.099137819733507423, -0.089931119548774821, -0.071756723384732823, -0.1011983905001102, -0.026108924802754015, -0.02895558848827974, -0.052952747867330424, -0.040651011278506941, -0.062403675645972413, -0.062530867826569025, -0.047639683852648468, 0.021549892035432196, 0.042011742541525871, -0.0014168202056091244, -0.060017710153938739, 0.050238665733522286, 0.094413292104875743, 0.14252847594850043, 0.12070740630935128, 0.11697697498229397, 0.098975653037204459, 0.12840555821628419, 0.1092645611216749, 0.10934335033079282, 0.037269298258601313, 0.022780470067651784, 0.044473900840241241, -0.0060598467528648128, 0.0061609144853983725, -0.0064768658816174163, 0.034870432574956867, 0.039379809714831654, -0.0013957543834296031, -0.028962960938971525, 0.0046569189597002736, 0.043727516840792277, -0.006941018795027367, 0.018088182930952126, 0.0082023947523770183, -0.009919468949588936, -0.060300576196604963, -0.04961731590236345, 0.032033275510473247, -0.01701144350548291, -0.040658744671612526, -0.017714249349095157, -0.017210598588884591, 0.055569751424096779, 0.064732172425609261, 0.0142514421392548, -0.026792644729731044, -0.037619803421594447, -0.035454019366795209, -0.0033597142606219474, -0.0018841722971697202, -0.03513935986915321, 0.001299552487248638, -0.020445085521288382, 0.037428045865738391, 0.021313292534809361, 0.054608035940519203, 0.044538080793511958, -0.025502640115099909, -0.045072000923970221, 0.014585725040689751, -0.031780543877902773, 0.0068856119179188241, 0.0054808839404315718, 0.010447966359669152, 0.036007093277555829, 0.072977664284250968, 0.0081451532648436076, 0.018677942155355585, 0.0022220414820895706, 0.038133960894140659, -0.022256466219839181, 0.018473324676275091, -0.019158933928994693, 0.053864036371846072, 0.0041178771402385003, 0.042051744426760795],\n          [-0.11959471143292481, 0.00046908871164344848, -0.017806537583872739, 0.060028987830965261, 0.010482881406572234, 0.1134097871181696, 0.060972001775857071, 0.0095573140622628831, 0.024171870288714075, 0.011559219957486627, 0.074094322684175498, -0.0015330263524836879, -0.042433991686828154, 0.0093887703280045344, 0.054396766959822755, 0.0498214705214945, 0.0059163111595279677, 0.023110497561564927, -0.025327700927906302, -0.071391862957095473, 0.0028116491031619471, 0.040639736088270678, 0.023985187089475772, 0.00080593035361482476, -0.017294104303814381, 0.019318061091531672, -0.051785631407524797, -0.06040231096160379, -0.051630865282623027, -0.026410009167490766, -0.025387094238179267, -0.086705148484331765, -0.031667117402875984, -0.03259729996049833, 0.0060777751022725451, -0.030850143895008959, -0.10889563458102586, -0.059264340142843021, -0.058026751391014861, -0.065550940259139531, -0.076388204506250154, -0.014694324172739949, -0.1161029182457609, -0.13336448135124818, -0.013871869353886061, -0.071354914609700726, -0.046295795137470362, -0.046341257133683728, -0.059803897951158161, -0.0556899798471754, -0.088752078300497958, -0.0092766852217181367, -0.010765871754746199, -0.013689713283032208, -0.058953596738130137, 0.018926773961227689, -0.027282178971395361, -0.039857478520104385, 0.012549232916158878, 0.010688241731306974, 0.080319165930301445, 0.15262100299518466, 0.086960661319310489, 0.15252525992290902, 0.069463873136678234, 0.11198174180776471, 0.01737147006474421, 0.015812778630970917, 0.032806003786103988, 0.017746821396218554, 0.073544673139239528, -0.032110260377912717, 0.019566763627964195, 0.029618292548164962, 0.038786297055650301, 0.032627871772587649, 0.069816775578256801, -0.0062508202311634649, 0.051458415560465681, 0.030408800781210513, 0.046777479573010872, 0.040002134296522718, -0.02008807639444515, -0.01263470418907111, -0.045249735132798174, -0.034253925513510058, -0.021875531092695553, -0.045998549423427841, -0.024164107680801648, 0.0075636530397308332, -0.00091421816686280792, 0.035702717797856873, 0.088574974690186048, -0.013734861595105412, -0.0098033211306002566, -0.04282565326207903, -0.0012702256209832369, 0.012700494745847814, -0.043166253351587705, -0.032268233451616377, -0.0035432592129699403, 0.0067580471025863592, -0.0053453862422648962, 0.023287783646401855, 0.074292726072946569, 0.019466527108545371, -0.017987962764354493, -0.0012524056877380139, 0.022263654018090235, 0.0012391427069160937, 0.0013565429618937579, -0.0046713438401512937, 0.016578328153419922, 0.036584208476039909, 0.001097170617763564, 0.011356767972489225, 0.053430214295184963, -0.00068444374047767209, -0.0384483419844764, -0.00058389549992762108, 0.0032910175381761254],\n          [0.0087136750269642335, 0.021184676494079766, 0.044118373966988256, 0.040648025991879715, 0.032447241186740375, -0.013324459836625741, -0.020142424050336942, -0.025882484787532859, -0.0024840579433286908, -0.019010478599687353, -0.002112799546736252, 0.009101832461506542, 0.039625693797873313, 0.017970409804111777, 0.037360151074966881, 0.019343344984558475, 0.014756799698268486, -0.0010528464090698991, -0.025961909366916235, -0.010285595270832736, -0.011165374267784578, -0.0019598758278640237, 0.0087081620119244998, 0.034494100706365091, 0.028652254710913989, 0.040299978182407034, 0.033374343071050708, 0.050349542304153089, 0.0063625956689595461, -0.024011839291926199, -0.042233372866263372, 0.022057516258499003, 0.053376443527016197, 0.020620147730700943, 0.029540439011999847, 0.057651788173259826, 0.067979091933384042, 0.062646746017868765, 0.049240173935889892, 0.021169919247216541, 0.011453866008363397, 0.010299220942533334, -0.0018357416874219962, 0.055929573434282689, -0.011231564367321699, 0.032042065774273598, 0.01571280002325131, -0.0070039251490842721, -0.009101648993736014, 0.016511365940874906, -0.019704911391892579, -0.039092331240561939, -0.045771081107692201, -0.0077691616125735372, 0.049862458553556741, -0.06736549253306108, -0.076963070633090172, -0.040595361000206484, -0.030389356872258563, -0.092514337569437666, -0.057211588696462493, -0.00095436298004251963, -0.045682047502914935, -0.036818864364637389, -0.068243509434178257, -0.027587536268803375, -0.041645167478661045, -0.04303078919819505, -0.054497722201413787, -0.068638447295754565, -0.09778610861618825, -0.065713312081331784, -0.052881969043814835, -0.01339699229959858, -0.019033794283482786, -0.023493218289815446, -0.036063450059278426, 0.027782266928957237, 0.012906654330914466, -0.017337278434917267, -0.064487941544117314, -0.099835383781717732, -0.10289791170276469, -0.064663551431551017, -0.0641236728999387, 0.010795364389364459, 0.024949528393138493, 0.018119888699965225, 0.10433442726226234, 0.10219165136667126, 0.013336681266255849, -0.023600080179398731, -0.089887755873483743, -0.10446013110840585, -0.11164381762372182, -0.051551762026531431, 0.045266919305088242, 0.069677166083149861, 0.13697123941472913, 0.064482888607458697, 0.098551199117389618, 0.09360636141971522, 0.037819160682802944, -0.0035166197905182836, -0.0028484068050251173, -0.031608943165469139, 0.0046811946910951807, 0.017171967845917853, 0.10536533016879272, 0.082514398940340364, 0.010270426109688261, 0.04723579496187133, 0.079022702429357855, 0.073711303154692515, 0.040152485755633946, 0.077664793581362607, 0.044442834049414938, 0.014455191975205124, 0.022399756108926826, 0.017224699650463141, 0.064738964118889505],\n          [0.086171813825423521, 0.043276344722271272, 0.030057182293563189, -0.012272805932473568, -0.0084497919375918426, 0.033191584991409173, -0.034725622268988551, 0.018176702115917775, -0.0097127781766898486, 0.0085166182323308352, 0.030226931221559766, 0.052416098527926294, 0.051668837837120909, -0.013910386317496911, -0.014892754899464261, -0.030204392408315697, -0.023348595772105338, -0.039154056656942125, -0.020299148174262385, -0.026870214226325, -0.021026881302678255, -0.048342252841896659, 0.050216024122317592, 0.0017508003206529706, 0.01784781112040023, -0.035663337208851044, -0.055701361822959372, -0.034565501095180508, -0.0001449409970588969, -0.011843034224678937, -0.030725274086672746, 0.037181115372523707, -0.014334667924480585, 0.026402505410657532, -0.02157219826244711, -0.050784579030140373, -0.0067591136459494716, -0.057082366222224006, 0.0016645285356211514, -0.0041546960728905628, -0.028755773827423173, -0.03714082137578157, -0.058966690069682928, -0.016029429438384403, -0.0031721930051920033, 0.0023077585454026051, -0.048021525210782345, -0.093376311841670362, -0.055542556473841764, -0.11398186442053326, -0.027456752012806465, 0.016614108182758672, 0.0027741155498583747, -0.016348951668857664, -0.072146978965869676, 0.0015395126311125717, -0.052682834934778711, -0.060378727516170197, -0.068266862134838471, -0.036771885672760463, 0.11935191252954988, 0.10244934755298962, 0.027542982076475292, -0.032070419062542696, -0.022385148133489435, 0.056289823602901912, -0.034119337486394785, -0.069686895736583362, -0.049955802720861683, 0.029733455414129237, 0.20068856127367213, 0.1162085020692212, -0.043410251863060023, -0.0030593783022195981, 0.00063195918916066768, -0.0015553440469552871, 0.065277285494402815, 0.010466423234828076, -0.020040852081297265, 0.061755629831554908, 0.12136556526370923, 0.078247187170092367, -0.08072517073390352, -0.075077412337979363, 0.012154159684612222, 0.036821934539862315, 0.02472102052087196, 0.040715988579243925, 0.021622540244536845, 0.038658271107198355, 0.052578818327128657, 0.083631018106240448, 0.04788200302645329, -0.075156815694368884, -0.050687783633637906, -0.0088389729616671769, 0.091034820744931355, 0.078447244012908812, 0.06227592062517176, 0.060594909680654375, 0.01693797817353428, 0.06408103556895299, -0.014547815241575009, 0.065658196419567896, 0.018129490859442446, -0.08798530089434585, -0.026622130825924434, 0.060886174973499241, 0.077750707436133701, 0.066437874598894484, 0.019421765119352175, 0.048504723287502369, 0.07041372195878251, 0.035827424258234999, 0.083548417322279078, 0.060027813387995552, -0.005432499769252413, -0.0020892485624801555, -0.030512250542840812, -0.00047303040700700464, -0.023511765584947494],\n          [-0.019836270599180916, -0.0017613217539587485, 0.020980704061465912, 0.032444977290163338, 0.035482360716385192, 0.051463914122762917, 0.01387059443680283, 0.012773320795543788, -0.0056081410148611094, -0.011615184428147185, -0.044318141985502046, -0.060123468169623585, -0.014777416807908089, -0.0053582542779810755, -0.054379500064678565, -0.04137798510918636, -0.048976925694358256, 0.076953418090969714, 0.026914330698442304, -0.0014016954910277407, 0.0097461019716972574, 0.0046963778137781992, -0.0069130491706136665, -0.040628477563491361, 0.034128908242092887, 0.011113734772594072, 0.026923522254639856, -0.034901970199125179, -0.083572453474777542, -0.017956322789516803, -0.013806163282359438, -0.06239361835505905, -0.0041426826588957799, -0.037637167036336384, -0.037724529658588551, -0.013774694560670805, -0.057704817420390679, 0.0048236498871859993, 0.07228227823302627, 0.032161882846836277, -0.065744929925494702, -0.043635280281107837, 0.00026056292826356561, -0.019142520605292868, -0.028407833505873292, -0.057929038649120537, -0.05076593603511028, 0.034535717074437706, -0.092192499765500688, -0.10532839199459904, -0.012076014852148213, 0.047512930831949463, 0.0020511676860901244, -0.026304839763800526, 0.059014485786431731, -0.04121884738294615, -0.037908511573603157, -0.035253683963737445, -0.003764225518756617, 0.1058253214787373, 0.15061197856457278, -0.044965430671133816, -0.038672944035853724, 0.032859085087083864, 0.036836423091902562, 0.091521334284663594, 0.067930349704352549, 0.001657465766571567, 0.011255029837672278, 0.019714575278699853, -0.046029623685046345, -0.0051819605809679953, 0.13027259585766382, 0.076244041762153464, -0.062532299911886025, -0.073583991135358184, 0.077174533475065421, 0.049432650608868409, 0.035864444263751481, 0.035719679749892569, 0.020318474287435453, 0.02861748003954917, -0.18444657518134203, -0.027969189014098672, 0.14692467780203242, 0.14809587852238354, -0.03290596643929547, -0.022816759205720398, 0.081642802242600315, 0.073319424746687803, 0.096551558434272475, 0.057497490294592224, 0.019593324904571427, -0.060101281088941985, -0.055289785260653201, 0.077752523928707032, 0.082231188321325199, 0.043012682164453975, -0.084998541929117044, 0.047226746411041548, 0.11708089871954172, 0.073957832946588489, 0.068481921009760804, -0.025787797068816443, -0.042547833499527232, -0.028797349310348233, -0.028665140255539324, -0.050465025239779027, 0.0099282727284533898, 0.0074795255927929058, 0.035767022417524885, 0.013422682869269679, 0.059916646550554516, -0.017252353019081054, 0.00014025453940576249, -0.028232578424891228, -0.037232130930961754, 0.03807283410302556, 0.017200727451423696, 0.048123699773181455, 0.082874942910174415],\n          [0.0081889230474460895, -0.058861620555009528, -0.043961481598665794, -0.063177035412865831, -0.018314195969373462, 0.034878450378990955, 0.035304175797457732, 0.014293668892683664, -0.027456916509392928, -0.068367628925221052, 0.001669119251847942, -0.040967945915871377, -0.03943941310209053, -0.021637978943057967, -0.037684292945808551, -0.017747783335439818, -0.042288824584737462, -0.0018176642328489589, 0.030934243801926706, 0.011733255516551085, 0.02708984163398926, 0.0017191072696037882, 0.043276004610731736, -0.072532619647830976, -0.030223836313618479, 0.021071961346727626, -0.0074147497494400638, -0.043925229543362393, 0.020288776715248001, -0.034527237586023503, 3.0471360021155913e-05, 0.026067397032741996, 0.088540464798406104, 0.01413941347644106, 0.022766394260563719, -0.0018480555055750275, 0.042675799328757251, 0.017054471283286493, -0.096746137235194679, -0.10757348404679792, 0.070754873906539423, 0.01575558139579953, 0.0096692478638847699, -0.0032289840854645077, -0.015101060431773538, 0.057926005617948362, 0.05010944609735675, 0.03438493002343132, 0.05420170443576617, -0.15712629885767235, -0.10755100231803701, 0.054215855416940288, 0.15265730024840482, 0.055888119645312602, -0.095941401277040039, 0.03328672046334586, 0.09353086897835676, 0.14384249052592857, 0.12025171427727349, 0.055496873043967186, 0.036285296296363331, 0.066833079592868674, 0.042161382611612397, 0.047587995565539137, 0.021867654432298031, -0.0564119641379216, 0.067603194336726846, 0.031338290457222959, 0.050713005156545185, 0.052148045957678787, 0.018648322758803917, -0.050759157693301679, -0.044588001217457346, -0.039312995512573896, -0.059936417610193665, -0.055184693439938245, -0.019957035127630418, 0.050192754841022036, -7.1757395827626302e-05, -0.033091702048858869, -0.034428104974273177, -0.034413465790208278, -0.023267082967762434, 0.031901848606379901, 0.020238538810505934, 0.0042221466771613057, 0.015602237108089854, 0.060847091700473442, 0.041401859346669609, -0.0034146015221089565, -0.0074559961064889491, -0.015893641385376203, 0.056392351962400708, 0.063354540983474289, 0.0087304477448395465, 0.013014118991186936, -0.0020131002441534374, 0.045231849909967176, 0.035378207480516677, 0.082600299684899986, 0.033715599170522123, 0.016512586361955336, 0.015814071825167364, -0.016536993108816449, 0.022388288048192512, -0.012153283754204335, 0.024539743316687932, 0.023108504039178981, 0.0067064141727297411, 0.01196006995554437, 0.01808564781799793, 0.022564539714186704, 0.029240080645026825, 0.0070031422851894731, 0.042819312072206572, 0.063646286047359391, 0.071444911692377322, 0.025002430371161628, -0.02988386458099207, -0.044839473616139255, 0.0048106139958749294],\n          [0.00760442586653437, -0.031647161439197435, -0.063172441009770042, -0.074495313815639272, -0.018994314341887673, 0.052826629441971945, 0.032890225420068343, -0.013629701917450165, -0.064807806031904142, -0.029393773930843553, -0.036471213615816359, -0.0098221768646617295, -0.03512116201717283, -0.03943473473657854, -0.028818473185370876, 0.03850092276204857, -0.0049328775196173652, -0.027624833158639117, -0.067846866445995579, -0.0011073069182334881, -0.05184142360008933, -0.055930573972024514, -0.01741185166520046, -0.057527466793733051, -0.055499304805210641, 0.028375118140619545, 0.035910848122856304, -0.01496101773521763, 0.011606597964401194, -0.0075876694292307534, -0.0045075356731610269, -0.0082002978749069391, 0.013779697793775076, -0.050073087994743797, -0.04908451276428849, 0.070063159827065333, 0.041211290659651782, 0.044221912404898908, -0.092510156542300173, -0.017245900432612329, 0.0054614497516805513, 0.0057317904111747475, 0.033492765079685211, 0.0086141350275894379, 0.019265007144101023, 0.0091441578432992152, 0.05844498925238964, 0.11212586773198896, 0.0075004000045361648, -0.14040933702091665, -0.13224491934624966, 0.046900879586457916, 0.043118887082018047, 0.082579685212893703, 0.068683773505795701, 0.041317670630771582, 0.085514694418916445, 0.023787162317564083, 0.088925450535202996, 0.13628690428327328, 0.0054697771027137181, -0.086543108426525212, 0.025964600319029363, 0.10587654052203503, 0.094459611375660418, 0.081346300231989077, 0.041592204326461928, 0.0066817887839110994, 0.077674394412019773, 0.0056683876342300127, 0.042096017073306194, 0.032191303817394351, 0.030452658585607126, -0.025984256753419858, 0.025271063575447547, 0.034211665699899252, -0.011964155896605516, 0.037076527694802561, 0.04508649436861286, 0.0051587756376244853, 0.02880706384910163, 0.038599720493081482, 0.024875515796822671, -0.013891640751740861, 0.021755723908671087, -0.065358451817548596, -0.061057887606313227, -0.024592482102494873, -0.0075328437080993543, 0.019986689878947826, 0.040909136201569898, 0.040437015091600761, 0.040034799263731949, 0.018812605341074366, -0.030276192569776476, -0.030270565458533134, -0.016190643318727164, 0.006809905422805987, 0.037916482000601909, -0.038319315218418547, 0.010306777237133882, 0.015829001844016963, 0.040800282130470392, 0.05615449330992818, 0.04786297945430712, 0.034288336490960442, 0.060681491982977377, 0.0032702943730984618, 0.0013152591778692133, 0.060954595988390148, -0.040791733055038019, 0.016183415755703048, 0.019528209635753736, 0.028893550793992792, -0.0012918699135948258, 0.034618023394595597, 0.043405940357484581, 0.029089370346889853, 0.0088268285651632861, 0.018259597579594153, 0.075373115466755555],\n          [0.027450771793035074, 0.041262824664966939, -0.013144559153806662, 0.012207909150661903, 0.0092477333330207509, -0.012848538408191307, 0.0045635591482721073, 0.010876267701812489, 0.02890459475433247, 0.026391802511985279, 0.010732731929258464, 0.015032366451770748, -0.029908421422182082, 0.021411606012816192, -0.057536773751919248, -0.053416159980357834, -0.048865576382574959, -0.035570469790391759, -0.018461415692559838, -0.0029790588112649907, 0.032112270223907544, 0.051477612075197313, -0.0057662482825229858, -0.017766588527875229, -0.028238377182112806, 0.023528561546172357, -0.04216007246124067, -0.041032389593882487, -0.06680999261373205, -0.039632149520821544, -0.022226688774540718, -0.0041149160188688749, 0.032302323242771602, -0.013890604091560638, -0.034276275118401742, -0.0051502741378656337, -0.021066308656931813, 0.022151630661472133, -0.0022992341581987014, -0.062769638896883875, -0.019723620835675727, -0.057691275310445302, -0.042378894883198112, 0.028983236593136813, -0.019395597488888486, -0.029331542199886471, -0.010745732705029043, -0.013921448513401852, -0.029609437928951193, -0.12537702206143342, -0.095617188384870627, -0.035129241573632897, -0.039982481822552207, 0.0090952641871177801, -0.022086955744048412, 0.029136077983963546, -0.032593887678401656, -0.020183882523267208, 0.061602041888744921, 0.15458403910635235, 0.16957224934392182, -0.040427938845436127, -0.14425377583803428, -0.071643094865452436, -0.042253187333205683, -0.027875249558229672, 0.058879183410993005, -0.00047065192114704134, -0.043920137358857254, 0.05496654067473021, -0.069296625387029825, 0.11118740085537496, 0.2366565621922726, 0.12148462555955851, -0.011433917074149466, -0.048194932808641386, -0.079327638115028978, 0.0017254253058667443, 0.037708824963847712, 0.042182164843196458, 0.035829815786488792, -0.073357898816589731, -0.14576211923026078, 0.048290332077963939, 0.14879922368454307, 0.10064792412919202, 0.063705043016025004, -0.030692614056442261, 0.056255605990735619, 0.10255361685355899, 0.078604273448134934, 0.0164658420906807, -0.0056463798547232141, -0.13298053803801668, -0.028765330682998365, 0.05939355800317566, 0.1402292273171811, 0.011410410356375363, 0.016039694083752262, 0.032382125330787596, 0.10195998512893362, 0.061382477156473686, 0.082411738292981068, -0.063666416770640277, -0.018779258750025916, -0.038365933733688989, 0.077993417865157774, 0.037853307835213006, 0.040996995997873285, 0.011082725441736859, -0.0056644922101654026, -0.014754708114634627, 0.018864758145484002, 0.0075267868116950659, 0.014018215345551104, -0.010120746615713067, 0.019767300172685923, 0.0399406347657522, 0.099260521955006772, 0.052915278088062984, 0.022179211937403773],\n          [-0.09716085296718216, 0.021642032331918873, 0.029135209902749426, 0.013999315045878299, 0.059316507135864754, 0.033067474971013311, 0.0085646291438248312, 0.010286012651575784, -0.0083817553445004675, 0.018753974201751927, -0.030375458058801961, -0.041904429008824615, -0.055862255737819402, -0.010903003336047129, 0.068264567248243077, 0.026035515966818988, -0.0012923504068929892, -0.0017623356640995083, 0.005468527639103056, -0.021755603593697069, -0.049505653044107159, -0.066112447625837761, -0.022252491484929221, -0.0081982834517316944, -0.037367281479721751, 0.012774986112044792, -0.062950628458933039, -0.045045256304144507, 0.048001463004758223, 0.030007357346820335, -0.0018969086500039145, -0.015723154153853357, -0.055120061189717733, -0.012097061948313372, 0.0026362460701923537, -0.072632828079189402, -0.068872601631521924, 0.017772853215430318, 0.072338704068217213, 0.018535361160719493, -0.045281275098323914, -0.011332122576621917, -0.027280199109967439, -0.058723208914210012, 0.026327853635139689, -0.010818050423826983, -0.030610533234455353, -0.028512931740957648, 0.0012488868339177971, -0.11197453226805695, -0.055269858760533572, 0.01115586891047237, 0.0082228892980596331, -0.032306255269305653, -0.01502375948544021, 0.049382773019192819, 0.015328141296235664, 0.037662383891850018, -0.035013020016662372, -0.029449621040367344, 0.12073107144262626, 0.022860361772779912, -0.023256473556698243, -0.083648467631806001, 0.0074002327452034888, 0.010004461021878228, 0.099371522997238476, -0.025221784791065922, -0.096640580498928999, 0.053094250603911208, 0.15893756445998802, 0.033387109550868377, -0.04808482373966641, -0.010053840415886486, 0.037823846526014906, 0.039700388908815387, 0.054256090345082275, -0.02401468040990247, -0.02904286935058728, 0.046138517230890852, 0.16216994825276426, 0.016089864404032872, -0.091198675686446171, -0.076360513817770065, 0.031988084842499293, 0.036454996777462445, 0.025464944340111234, 0.074147409146892329, -0.046979415183956125, -0.049629380484653082, 0.079771651767589866, 0.087758100333019146, 0.049828916696142006, -0.03045459513307306, -0.024452096514010858, 0.0670092926908578, 0.1175218881400763, 0.11426518181326391, 0.074066541158350152, 0.0062338373377257422, -0.043366039912113838, -0.039950077856114423, -0.035409502206233817, -0.035863781498548762, 0.01781322399419219, -0.024727256297427454, -0.022275869771454817, 0.076761480744383326, 0.062045464769250311, 0.069837551721133845, 0.073012923366347696, 0.060190713224507614, -0.025405925372675192, 0.023372682335303596, 0.030477986314785502, -0.0002301213960560905, -0.026087148164954402, -0.019019953457663552, -0.036714807308876246, 0.058817728969904087, 0.068381158254896449],\n          [-0.011512245145694655, -0.033323501539032144, -0.077599795617108003, 0.030092014051291281, 0.036890045147122533, 0.015052871160868519, 0.028016899365407681, -0.01018960630350095, -0.078317704208198474, -0.059233122702466653, -0.01852728410941332, 0.053961496737718939, -0.026974467838019357, -0.01804059271627316, 0.044307115164341854, 0.015818943834284213, -0.031953640726807273, -0.02740130304193715, -0.046790507127582773, -0.020608188350333664, -0.026272324411271628, -0.080186654850075562, 0.083845698779704644, 0.001406750687297384, -0.04985438587843697, -0.021416757758446515, 0.066537065419636068, -0.0073244717556784477, -0.018144551509999312, -0.015182424540353442, -0.045130661218423247, 0.029947581486485145, 0.0064481392557531048, 0.042274921462388107, -0.074358994945938048, -0.014176533090006271, 0.077655160397082798, -0.010551243188291676, -0.12637948483078057, -0.033586964208765883, 0.062817071093444254, 0.0053909310356757764, 0.025794636422243125, 0.059721803691538844, -0.082995318825107134, 0.0042617087053962791, 0.10584522112949336, 0.071364312990742557, -0.026422021145727979, -0.16100970751240665, -0.054720311746107982, 0.048999446881141787, 0.075434840832607986, 0.010535530941215229, -0.048016579048604152, -0.080339712203917474, 0.039576695247329777, 0.036637245201813592, 0.12098760898076155, 0.1354854848272127, 0.051194513568370764, 0.018225873276029245, 0.085661323891760843, 0.18621829874239049, 0.10338152957413216, 0.023906079145933318, -0.0041822936350238149, -0.10643206407862182, -0.078124959614174122, -0.073468903649519218, -0.048419863477576881, 0.015108685112589434, -0.03264596890745973, 0.036235615700722507, 0.0080904621985001118, 0.11267954130800725, 0.10278655485723889, 0.04428157837866404, 0.010681413475295332, 0.048922714210986845, 0.05487352908643979, -0.018064605730554309, -0.018189270455657311, -0.071125211325311799, -0.10260837121452346, -0.052490034378075492, 0.024031776304340315, 0.019694437269126286, 0.049636749977074832, 0.032195647589762615, 0.0083280385163384298, 0.070138954785336591, 0.067549912235517831, 0.057433630830398048, 0.020438461876702188, 0.0032421342973983297, -0.050695230761191784, -0.015383897879732399, 0.020203015057404895, -0.015662916885770546, 0.031709069862233888, 0.012505528157918055, 0.02862303507568463, 0.05946324529661641, 0.011987063839091858, 0.029655839160397587, -0.0016058379565756595, 0.032924927535037493, 0.031881210667308521, 0.050423216186573444, 0.015557492045852508, 0.021385779192598299, 0.0099932753661932591, 0.01435070815322266, 0.039479442983270135, 0.066851597833738896, 0.040296519398888356, 0.0099526419122588083, -0.0023557651823443021, 0.01814873401521766, 0.059119163848392789],\n          [-0.015757148978644712, -0.049129440678390021, -0.023997668342014205, -0.0210026283214945, -0.0015357942036982875, 0.0021065236794876874, -0.037107041689779741, -0.042351598868691012, -0.061162744591386403, -0.034051484714528485, -0.022720119467757083, -0.060739564477761535, -0.026757001184959561, 0.00055934070843080205, -0.022616038258239973, 0.0070861976821720955, 0.013566118550461286, -0.002811474898052356, -0.038580343099048009, -0.014823359019323232, -0.034835879559876048, -0.026656015152450085, -0.019477669860262788, -0.012106727392046226, 0.0042483765645461719, 0.016084907645647312, 0.00066552379900409325, 0.0016008277659419479, 0.020524088921093323, 0.061832709878829155, 0.0036079221207767423, -0.069861609806567429, -0.027833309957886129, -0.032568850186226357, 0.045124349364128763, -0.020541851129595723, 0.0062259884473188087, -0.01720385416905687, -0.06713753737721917, -0.021510388883911769, 0.10815002779082451, 0.037209771283314999, -0.006027660384665387, -0.016395255789040913, 0.027666465419402944, 0.073069001175329412, 0.050575531097015479, 0.042567636344617243, -0.040728282661866906, -0.1802492901591394, -0.05180382591629118, 0.068698953085444853, 0.10468627376672648, 0.046930524622527739, -0.024345410159748448, 0.081518930532773398, 0.13437717506819735, 0.12767282811582661, 0.058828417946620012, -0.065397413329707027, -0.010971808997436964, 0.015964690557018213, 0.064316346804789856, 0.092047644756938635, 0.079924220572783422, 0.0045625327525128379, -0.018286902500448191, 0.017429694084018413, 0.076145282866436848, 0.042835485463588514, 0.080206981146474676, 0.03611723597888207, 0.047379298714446218, -0.019874915866582681, 0.037657544445781559, 0.026115602677467167, 0.07158768649462971, -0.057638081455141071, -0.08380678196623717, -0.020457096575091122, -0.0066815930156417236, -0.010481709236786138, 0.0098188814326595486, -0.018910890692478463, 0.027174343530639883, 0.0048186838638660939, 0.0084831162501448551, 0.046647277306884644, 0.074896293430210287, -0.0027052061320910203, -0.052390985898152595, -0.035810710910889471, -0.010963380484187036, 0.036472476309506702, 0.015668137547351885, 0.031880374182724422, 0.028320973681942418, 0.029976561112701736, -0.0029437318832178684, 0.034619959909237122, 0.085724767242456062, 0.014661848811874373, 0.057456266218902825, -0.0077949735252234144, 0.056966918817289783, 0.039173853530589081, -4.3950988622729753e-05, 0.039524712301200832, 0.033815106883289522, -0.053148463650792468, 0.046135279317716708, 0.034368318225618644, 0.025850606000479254, 0.04364205260106227, 0.028915316089906759, -0.0046553412351980628, 0.04069494423398308, 0.050441914764901605, 0.023379190793916069, -0.0043673996422118923, -0.067829031610357429]\n        ]\n      },\n      \"numPatches\": 71,\n      \"patchSize\": [11, 11],\n      \"canvasSize\": [114, 102]\n    },\n    \"shapeModel\": {\n      \"eigenVectors\": [\n        [-0.25918455544134117, -0.04931221385289683, -0.13803814349503365, -0.050835603939836389, 0.00068526965694575893, -0.019143738616150919, 0.023318915050125469, -0.016196086952925716, 0.0036093752391787967, -0.23833211080603259, 0.020657546002336193, -0.015932434823103549, 0.064261608443706916, -0.090634823520771873, 0.022055884293867813, -0.093725674338304407, 0.055117695896951036, -0.053233288056152572, 0.0062574485928118722, -0.094495464626663847],\n        [-0.015370973540248745, -0.27558869894124727, 0.043057403787850598, -0.017591738525834334, -0.095866808468540898, 0.0374588242132479, 0.028917777439805392, 0.1301742315782318, 0.063868665266122795, 0.093354241092818813, 0.031861264081329624, 0.020242117972802134, 0.27294001002937818, -0.13041313331164875, -0.0031444285383698803, 0.065211427933209776, 0.23796562485879649, -0.14726562188674308, 0.036056872536145354, -0.1295200257644685],\n        [-0.27438982091500397, -0.039852896309116981, -0.13450394922360476, -0.02978745313734707, -0.079525846479578263, -0.11664515605739997, 0.035665518184535103, 0.002417177334119754, 0.071000059730337906, -0.19400193419982176, 0.047707150663056336, -0.060782105477894047, 0.075256164849826432, -0.086536933340027627, -0.01049404960505459, 0.0038623295139433526, 0.019088595829792152, -0.010833090632415429, 0.017289975723166609, -0.048709062934321569],\n        [-6.061111652085234e-05, -0.29074417421901644, 0.061164679549491507, -0.040564059065553715, -0.096173988191784646, -0.0062410078701849517, 0.098421939897005872, 0.12644765063670191, 0.052339831131799547, 0.14548890663706876, 0.019044522282414742, 0.11593290854472875, 0.11303783009345467, -0.2265378936630382, -0.026028516734775083, 0.14284328457404893, 0.10352737588140382, -0.031495507236198358, -0.047636212684011393, -0.031405728625543],\n        [-0.28061079598099281, -0.028500046273409296, -0.1334817649766244, -0.048224158070504508, -0.11475625312727053, -0.16357836516870289, 0.048639735952709248, 0.010323257138876579, 0.0443093902362139, -0.1122958426982017, 0.056896751191640699, -0.046270327611954258, -0.037397127347545092, -0.13317587328341315, -0.010863704903627043, 0.039312364878041281, -0.010946095593356596, -0.012651374705749084, 0.01110571327997853, 0.030546324103711924],\n        [0.014069445433529164, -0.25865071929613004, 0.06560840664757342, -0.045936250949625834, -0.077032475339967266, -0.012716551912464895, 0.12470762874060179, 0.11891551534656634, -0.013669877748084244, 0.1204323060226194, 0.011009487547689111, 0.19012847506135711, -0.03216941527475374, -0.17265241492952857, -0.036626526966033413, 0.11828907037835129, -0.077253487513163063, 0.04910794244586042, -0.088365360868488049, 0.034692232042363554],\n        [-0.26489741712968851, -0.016037983258916397, -0.15478385413970339, -0.054519082640759414, -0.11072137606892071, -0.13806773721053522, 0.08315118429370677, -0.00084688851852063318, -0.066659068943074468, -0.014543116847374027, 0.052713555008319181, 0.02738844249422287, -0.14573813333209454, -0.069109651372657108, 0.0058712282175771742, 0.038653027715924451, 0.035448688300325895, -0.027970894206667783, -0.0058316372883610388, -0.012350421356814981],\n        [0.046354114624841548, -0.20340754175093081, 0.067448564665621949, -0.041981284856941324, -0.013920156097499539, -0.049310247697232024, 0.10476409205774134, 0.16148555792101416, -0.057377287008889992, 0.068718208751115062, -0.055874799238903254, 0.29988249724968391, -0.16587089947669748, -0.018901809319898571, -0.021824056547298361, 0.010150208790264993, -0.15609860291657318, 0.1312205105925727, -0.13142200190156222, 0.1313708927136652],\n        [-0.20187217065452481, 0.0034527151175131731, -0.14526611889720326, -0.05454907575651035, -0.077670454771007258, -0.099693213880673814, 0.11162648299874731, -0.02756432531919592, -0.17000009910036681, 0.05281736505253104, 0.0046486044929276646, 0.1380118729404875, -0.22662371465236356, 0.025099449481837843, 0.057390225910467232, -0.010585092198184265, 0.062813389289858523, -0.066384169837743451, 0.029034161785279667, -0.11014692197967303],\n        [0.059919400550256997, -0.17456494999571195, 0.045546642557409332, -0.02138218670533986, 0.056054364424078185, -0.055753394121748678, 0.050949925906493082, 0.14366157895544562, -0.05830434414633804, -0.039881695287267399, -0.029733515204826259, 0.24120260128368567, -0.15389614651721623, 0.099337119716714856, -0.0079105830001858224, -0.091413272768399764, -0.17108589062548851, 0.079535911804176379, -0.070080057453948172, 0.10304814751540158],\n        [-0.11406660762823512, 0.0077005020180582742, -0.09712804940172437, -0.048797807796913756, -0.034682059363515927, -0.034999010561767685, 0.08692061344032842, -0.095835584563062681, -0.20896282413005149, 0.082039982644742646, -0.038156988159574197, 0.17097326940727633, -0.22949142171270936, 0.12076557157672954, 0.083445432006383657, -0.068849538566075189, 0.10657376324662199, -0.11111649307286262, 0.14356689523278729, -0.14730065680490895],\n        [0.050548778821860631, -0.13771378257629774, -0.0080120262544440511, -0.0015714671798822168, 0.11898190894868126, -0.070033187766031402, 0.016790814058871895, 0.1115574984393187, -0.082310332466199038, -0.17681195482737475, 0.031785253577691228, 0.1357465923958473, -0.030874986613362576, 0.14056871465194681, 0.01192742650959086, -0.12276147059314364, -0.089723294438478984, 0.026135494001851646, -0.012284577171365987, 0.045455675500381779],\n        [-0.010279976005766538, -0.0013953711369666941, -0.04250049853613809, -0.040683978397024659, -3.7807469383838166e-05, 0.035049138884785544, 0.013909369315673437, -0.1642247505591371, -0.15344312139650054, 0.063720470459392275, -0.0320687619302093, 0.093030342984283365, -0.10431016285986502, 0.21547866370529961, 0.062045477425420881, -0.097500495716327684, 0.082375488307347727, -0.15217807555912072, 0.21187698224878029, -0.078833239119551118],\n        [0.020506937371916202, -0.080791931896572647, -0.076177957918269826, 0.048751387201977775, 0.16094247296613129, -0.084899633131099411, 0.019595650306679674, 0.042553966112101993, -0.09219934929892451, -0.29635110512711466, 0.068276859562881098, 0.016316501361075333, 0.097753223293390701, 0.078153996089610878, 0.043342705639799292, -0.075376215034118968, 0.033022672135110301, 0.059877672085514894, 0.024112321053863524, -0.088305909642851566],\n        [0.040972435984073623, -0.0012967065227411441, -0.0020002072259834333, 0.0014908104373190423, 0.0030002881861055167, -0.0021443336138593531, 0.00056119264462986193, -0.19612476201187881, -0.0017679409974512839, -0.005915857570869501, 0.0012463328686438402, 0.024610291061966494, 0.0022006976231346842, 0.22487906560306467, -0.00058423344006947042, -0.082013296389981449, 0.00042633285032667168, 0.0033161283064071234, 0.27617149440602085, -0.0016608591645283499],\n        [-0.00080695403900045968, -0.065839220606613555, -0.10155889748442845, 0.075694689232978118, 0.15233719604557805, -0.10887679778045856, 0.028494100773441226, 0.0038626863414954055, -0.089765768359496567, -0.30037286375515754, 0.063281539229365746, -0.00048470083109641848, 0.1117386345766342, -0.0044290036927669973, -0.029663978449883902, 0.0016152557001810619, 0.021646704240411981, 0.16837372165287368, -0.0054392104719929515, -0.084328775256603178],\n        [-0.011079460967186748, -0.0017868787382064001, 0.039468046485298627, 0.042572005521116126, 0.0063748590623499482, -0.038364866443237666, -0.013127007549216979, -0.16577295084318866, 0.14969379516837522, -0.075339827378120047, 0.034732282019907856, 0.092315739679176251, 0.10807828706143377, 0.21223426285676972, -0.060290750609962682, -0.09445696025894304, -0.081011345255935258, 0.15441773571152759, 0.21076325569431353, 0.075295075514214896],\n        [-0.020086262263831419, -0.080784221136093515, -0.077792332238160178, 0.047111656712928704, 0.16081617519949246, -0.083453740869734394, 0.020128133010894365, -0.0360546459811006, -0.098169645018887586, -0.29361230607088495, 0.066961209884496664, -0.019966901109739643, 0.093570222859445912, -0.086577822140769686, 0.045752123360719078, 0.0791568260887245, 0.036240583447840397, 0.053839253272887647, -0.032436240265909071, -0.091341473993148653],\n        [-0.11596849930813256, -0.013116985772102267, 0.096737255583673187, 0.048698089400280059, 0.039340055065449797, 0.032214325050749303, -0.08619207218565357, -0.10015382155604448, 0.20555982124599514, -0.088938300452201954, 0.03937893647811963, 0.1654956838827967, 0.22809775661613474, 0.11513705136942748, -0.082911080726013248, -0.063962435697576758, -0.11002395504744786, 0.11205940383716617, 0.1439392637120111, 0.14897623582114547],\n        [-0.046018226654389961, -0.13730378118266232, -0.011830212484348301, -0.0034916534255774868, 0.11752403995019094, -0.071356957547947811, 0.020200276481911836, -0.1076974779384491, -0.090474375313770575, -0.17344452956176146, 0.030258179923130457, -0.14237336413481283, -0.039887226837474088, -0.14521482782108197, 0.015203825792165698, 0.12537720862495605, -0.085457392267481364, 0.02174003429599114, 0.0066221299522591405, 0.039620488272067433],\n        [-0.2040749366376528, -0.010323501069181723, 0.14694685748653932, 0.053664853798831569, 0.07981735270651405, 0.097420623037042547, -0.10953377373376602, -0.033199598310539855, 0.16757254284815026, -0.054346740346640714, -0.0058157513624386148, 0.12840753724004372, 0.22038833739666719, 0.021168603923268747, -0.057657198208393295, -0.0069775024105939165, -0.069501154359836337, 0.069464401864851408, 0.031771035766236862, 0.11411900652766432],\n        [-0.051924253325491068, -0.17429362677494198, 0.039791494349163466, -0.023513465098568491, 0.052952634705427687, -0.059635560339677464, 0.055305687484985627, -0.1424648306435416, -0.064952853084940268, -0.037771093229790866, -0.029527419227873053, -0.24644974400170233, -0.16270006974558165, -0.10024837118797988, -0.0056447186125896803, 0.091759168888906895, -0.16847994951283402, 0.076860367844075961, 0.068882496250225952, 0.09863121958635232],\n        [-0.26651717704026873, 0.0080164106263588761, 0.15731959607269588, 0.052823798159396113, 0.11008740922723979, 0.13601908508035385, -0.078961634198715797, -0.0072046965504718591, 0.064348155222560377, 0.017237605925488529, -0.054872736396182065, 0.015559383693739215, 0.13909397820541167, -0.068311802263162552, -0.0067259934445731695, 0.038223390076617916, -0.04156755263603501, 0.033115987080266057, -0.00065239724213180667, 0.017513549002972584],\n        [-0.03588787939011167, -0.20388129416118475, 0.061301672646978556, -0.044095407904282118, -0.018268995429649042, -0.05470840045462301, 0.10795691158419214, -0.16132698157729128, -0.059957480403291671, 0.068092285932813801, -0.053755882208369909, -0.3007283566909435, -0.17148068120730831, 0.021608331263090086, -0.021575953678715676, -0.011664293426726147, -0.15458176445677577, 0.1300174016145369, 0.13154970526426454, 0.13078272042359684],\n        [-0.2809471673004571, 0.018293619273973799, 0.13596157055287497, 0.046378029155166152, 0.11163412106971948, 0.16295080001590137, -0.043691675935328148, 0.0056329745488485471, -0.044813277771594974, 0.11695075889501491, -0.05641913180049743, -0.053720719978482434, 0.03610146135197502, -0.12627443909954122, 0.0094131173123349898, 0.034624267714095353, 0.0078957648480725562, 0.014575180101932733, 0.014576471105685423, -0.029156635373887185],\n        [-0.0030095351372760588, -0.25957232272307262, 0.060301707578672363, -0.04779944544237455, -0.081491244326026321, -0.019147559060772947, 0.12652610020709304, -0.11922977407437629, -0.011914602642074834, 0.11591728350468518, 0.013241249151964583, -0.18815914671221168, -0.033616973409560061, 0.17776230094115714, -0.037025879925952965, -0.11974525580807824, -0.077624578833955071, 0.048571714178185676, 0.087859549048355606, 0.035868084615777118],\n        [-0.27417464809767067, 0.028373991287752209, 0.13680799115243847, 0.028167150771118182, 0.075677341587864086, 0.11630896046960627, -0.031762513797499781, -0.002563550650307844, -0.068884128538267364, 0.1995800873684675, -0.046920279658476186, -0.065299807041030028, -0.070746960308591109, -0.077549936108553166, 0.0094610434231444662, -0.0017650943059575458, -0.014997421039161352, 0.0095845597607114308, 0.019152234841120983, 0.047434694682454287],\n        [0.010864613936708935, -0.29208790595457063, 0.055821178220925659, -0.041705477694428728, -0.099230722224523796, -0.010829050067781528, 0.099749938133941091, -0.12644476780740671, 0.055094856748521673, 0.13773729035274815, 0.020908213939107564, -0.11344971939308535, 0.11591336845781641, 0.22976959221520196, -0.026421533223327465, -0.14288458971934956, 0.10419870157452782, -0.0318976338136387, 0.046918481646092865, -0.033299284419085695],\n        [-0.25837833137347876, 0.038422717347508448, 0.13962647397057357, 0.050103509953396942, -0.0044594765706110371, 0.020603827321857861, -0.02216219920682656, -0.021309114011150192, -0.0010917590066734501, 0.2418230933395254, -0.019386994764398195, -0.016717109149155869, -0.053464810497761417, -0.085429543562532892, -0.022162591507878665, -0.09622067935685491, -0.045705099076477906, 0.047393448869087945, 0.0048328631429115712, 0.089322356732992353],\n        [0.025564398752122981, -0.27731664250606558, 0.037588786187509049, -0.019579739085062099, -0.095765482451470027, 0.03667599404697252, 0.029813530107823345, -0.12943556489477503, 0.063961254324508471, 0.083897561937034196, 0.032649943180716366, -0.019599083680427811, 0.27525863734504508, 0.13388072923874367, -0.0022735435936609982, -0.061470425631865222, 0.23995133451147066, -0.14924747016700576, -0.036275296743394379, -0.13314032633541523],\n        [-0.041103875384795478, 0.038239853031118279, 0.089308340197752648, 0.10751656645645798, -0.15823655809172577, -0.20815985286534691, -0.056779787102027732, 0.031965366692216453, -0.036292401444057432, -0.01028392045647775, -0.22616361790176892, 0.0035659176428170783, 0.061194979549606385, -0.077356786233732905, 0.10905509076128247, -0.32122938814240976, -0.062436557004036941, 0.045060861466935012, -0.13893160149555642, -0.075946865540707897],\n        [-0.00058625790621224356, -0.028013371862265588, 0.033925327852879071, 0.096975699528199108, 0.12885275561493442, -0.1343267701212868, -0.054634853688639656, -0.18670671387006435, 0.12024253293549851, -0.016775889537029812, -0.37344128248102121, 0.16617216199661805, -0.043638146038944767, -0.021518964566529398, 0.088330233282570475, -0.099975305795148767, 0.11085010836922597, -0.017708386232239637, -0.082914213924979024, -0.0077088662798212998],\n        [0.027140406330796465, 0.023191258515235343, 0.068434406926246014, 0.071893202281616386, -0.14539857122015881, -0.16792155660430991, -0.070781226760149307, 0.066657108411771637, -0.076044747467265861, -0.034879855298791729, -0.27800383194452666, 0.061320468907899509, 0.072299824382141803, -0.023704580444342142, -0.04401851516889442, -0.27110695514654515, -0.046476184600678129, 0.00043869932085638733, -0.123130650146417, -0.15560608030108736],\n        [0.0076812184072904523, 0.0270311651114079, 0.051859835503390045, 0.093607017053067176, 0.23700136702110891, -0.11818205744677762, 0.012899446976310756, -0.13978186955176913, 0.10628086971480236, 0.053511612608857485, -0.1084063259342577, 0.14453111355415171, -0.046948170771035469, -0.028787155822266295, -0.027495091326601381, 0.054014240557880865, 0.070313223463565402, -0.078649587711269939, -0.033769719376426907, 0.11645995186870747],\n        [0.059718922428571741, 0.019365231759092102, 0.039768313524315972, 0.029429966402313459, -0.099502797903459367, -0.095192410148050341, -0.037385318448383657, 0.087589530307537841, -0.063223996440049848, -0.023055656510996579, -0.11333588796545234, 0.070632460945445522, 0.040519800690015498, -0.016140269978734072, -0.20118930063482968, -0.13465123232579196, -0.11306409222256064, -0.21054801092291384, -0.043694131861398491, -0.05304245009937468],\n        [0.0041644730679859399, 0.070451588741912277, 0.057002625903047041, 0.12331122141071403, 0.23820814567299181, -0.13581472991575944, 0.032580608751462875, -0.092174145754420192, 0.027563573177978199, 0.12746487446937488, 0.12378971431383365, 0.10985577224508172, -0.021825682517284502, -0.040456493338143169, -0.0041164909929070218, 0.063284870734335225, -0.0047004007689977496, -0.052424157462174416, -0.018129540228518343, -0.030724004702528798],\n        [0.072668914107824084, 0.016043138606478196, 0.026273691374946138, 0.003534210656636574, -0.059452568136465732, -0.049834770359896835, -0.023930069153882849, 0.10364100685763086, -0.062651308587342996, -0.0089580363305431388, 0.013307479894258992, 0.068490119380549511, 0.042476545594048995, -0.012886684482588185, -0.32344815313001357, -0.10205399447154681, -0.17376613813501907, -0.23316498095342783, -0.011128358009024508, 0.0081901718752386641],\n        [0.00094691433464800026, 0.086262349909223726, 0.056561901106857174, 0.14777082451223772, 0.20316466873179587, -0.15155458483522241, 0.024606362028327177, -0.059727599838801694, -0.081607162628284866, 0.20453126101362504, 0.20790338659205185, 0.061225806497161923, 0.028168686557436835, -0.03613120581327809, 0.026537321190343684, 0.0399906464556435, -0.049028578602568942, -0.014036011010793178, -0.0096336013044976583, -0.23758677297853398],\n        [-0.041048915985355559, -0.039313219925048652, -0.087903278890068839, -0.10361478783196754, 0.16318740146031308, 0.20270933480404102, 0.054584517473603988, 0.039292121166248098, 0.040998785186190767, 0.009615397758339965, 0.21128404722349167, -0.0029798466635748131, -0.062865767668902076, -0.076449491545646189, -0.10549253270595446, -0.31704376863591516, 0.066752841216077483, -0.045723181789561418, -0.13555912932484426, 0.075584434365469327],\n        [0.0022042609665398039, -0.026485960470782596, 0.037415518961758119, 0.1011339414049796, 0.12252229572983372, -0.14241885794880885, -0.056828178864929177, 0.18530329432091194, 0.11872027940742755, -0.017167807538024354, -0.38205683466253854, -0.16618370469188254, -0.041194763832225485, 0.024548186385952311, 0.09255575874027222, 0.112546125407831, 0.1083057171416579, -0.015920390263162824, 0.088320321679712793, -0.010693282303843322],\n        [0.026816912653847814, -0.022108926689108781, -0.066339365110991089, -0.068151690447571606, 0.154617702418614, 0.16313793805226023, 0.071234250106644068, 0.072109302523390373, 0.08017056572858236, 0.036959816474844275, 0.27351976347701962, 0.055582028975215948, -0.074092332445527556, -0.022552708724486555, 0.042901765024783274, -0.27302351570941347, 0.049208713355905966, -0.003535172477924954, -0.12170548706792439, 0.1600709991585626],\n        [-0.0087439103230266685, 0.027923354373289518, 0.054514211233918808, 0.096365207751641604, 0.23109253250922421, -0.12470228964547822, 0.010102445531173702, 0.13704885861179808, 0.10320420183042034, 0.052096726920325277, -0.1192686088871901, -0.14683351370610781, -0.044064970409795748, 0.029698195291400976, -0.029206990301820602, -0.043297565538332972, 0.068428704932438536, -0.078571322120720946, 0.03859177852602421, 0.11024267705524989],\n        [0.059508635688315326, -0.01657619560715708, -0.037493005500270155, -0.024551786635688039, 0.10880503745780122, 0.089770908937590918, 0.038639182155073365, 0.091150946000188748, 0.064260277665368251, 0.028056683600415983, 0.11812219496600855, 0.066252134990526679, -0.041347760355287144, -0.014534786232973301, 0.20087119446951981, -0.13703864218459774, 0.11279133483747732, 0.20832054150697926, -0.042946400162149997, 0.05179156411057094],\n        [-0.0065126653897697728, 0.071159456831373979, 0.058524291187230383, 0.12437439455627154, 0.23410551313326314, -0.13945759111788802, 0.031083302663808848, 0.088653843731240148, 0.025052764449437451, 0.12645821454533035, 0.11923113656771699, -0.1125517207508219, -0.020213297081514984, 0.041060640001920251, -0.012035091209235904, -0.057933925975352643, -0.0091486339462259602, -0.060673793152006633, 0.019835929550468437, -0.032788715505280473],\n        [0.07257527558866439, -0.012634132825075228, -0.024026201740383193, 0.0022869797091045522, 0.067406035601524444, 0.043828689541326828, 0.024880382727502041, 0.10591239790125603, 0.059389455848107335, 0.017004471070657168, -0.0051110016551842363, 0.066026250938385003, -0.0413344685392531, -0.011454031274301169, 0.32424222491809251, -0.10354947723779616, 0.17170089296042518, 0.23243149868662624, -0.010740406772858133, -0.017538756921170968],\n        [-0.0038075054296584183, 0.08682715010851387, 0.057552559849395196, 0.14779538878396109, 0.20066618261034311, -0.15339929104950317, 0.023645037900407406, 0.055600435751653965, -0.084010761179813057, 0.20401992821861864, 0.20826613944580338, -0.063875112688849336, 0.029819348392480016, 0.036610597346155127, 0.013781028965228558, -0.035941276484260015, -0.055832567903871658, -0.02320595540794813, 0.010064307647554213, -0.23708004052505138],\n        [-0.023504007886404551, -0.039047800473709746, -0.085567297317111615, -0.079150315989127945, 0.12465270020306099, 0.13891518919190615, 0.024300699494946811, 0.066995320302391054, -0.036811078599646774, -0.0058878608825939736, -0.090782550970527828, -0.0042989063216246773, 0.043496107700883378, 0.062508429522197345, -0.078226082145878048, 0.043008728528105333, -0.0069160402174302023, -0.042679506006784697, -0.01902871870181784, -0.015975265866074697],\n        [-0.0073612866881341606, -0.021107032591126607, 0.039763310309730814, 0.055625685982699735, -0.049656312820928236, 0.08481039531092055, -0.11231670001231263, 0.12600108757905643, -0.023631913679965172, -0.057175431216096452, -0.0059588667870986217, -0.12646241348822884, -0.03442652732340299, 0.013453138542856213, 0.017896987050537695, -0.076871198151648765, 0.010909247964377937, -0.022517785800987001, 0.0081302635992548909, -0.034045787038876937],\n        [0.016948514923620445, -0.02193513643769434, -0.063152363053562643, -0.05279979640116144, 0.10435342424836205, 0.10824853130712549, 0.033041462823043537, 0.08633503164767041, -0.015563261507495417, 0.0087724257539355619, -0.091029953142718001, 0.005261084458105819, 0.0074128482411619833, 0.12677166922406993, -0.010973650363561953, 0.12218436711438121, -0.032292648360242045, -0.041307828155396936, 0.0097001513532332835, -0.046119921825401256],\n        [-0.0066832172944956327, 0.0080822202324519078, 0.046932304539841756, 0.080999330413291576, -0.021246022388930752, 0.077223007894173301, -0.1208024553957209, 0.097572471349082826, -0.098662078545974516, -0.081071918722385755, -0.00075065076725868026, -0.10367608652818795, -0.10332194965606889, 0.018813730318266546, -0.010497200676673153, -0.061595641076937518, 0.18741244184973282, -0.10373942661667772, 0.0019642020598160115, 0.19296689375226381],\n        [0.0011332836074734035, -0.011108535310006282, -0.044177040561706557, -0.026937857839190442, 0.058202747644603162, 0.067660378971863971, 0.01252332721829966, 0.086955312557543449, 0.014537206052818295, -0.0024289122507333647, -0.067246547639804657, 0.010135633490719997, -0.021703799990268176, 0.059668358321338308, 0.090059081877064975, 0.058504432644668598, -0.095514911708738368, -0.060412988824551053, -0.017228627814190295, -0.065438091003328161],\n        [0.0015010210285302467, 0.012001351176920534, 0.026456098121273891, 0.050506276299144316, -0.059043613350488425, 0.092763446808496491, -0.059215687883914112, 0.051446206696285059, -0.03372817088174114, -0.013303363349763798, 0.052355162524900162, -0.072966497652211054, -0.013674015384355876, 0.03057299590116571, -0.00012694541907415412, -0.036559417235039519, -0.07723897190816445, 0.00060168847264390314, 0.0056980306445756287, -0.095808032622795122],\n        [0.0045410658335984311, -0.029739632923257285, -0.061285405847324483, -0.051928527681961829, 0.095878693787256303, 0.10776669151268725, 0.018083231455709298, 0.11656925567843941, -0.018095403188716327, 0.0028618652877730761, -0.1116403729402848, -0.0016145266116992633, 0.018507271803891171, 0.085962991157207722, -0.0049371044283928944, 0.10296554953916494, -0.034908946306265815, -0.032021722740051613, 0.026463113300104341, -0.058609101108032663],\n        [-0.0038940101674299864, 0.01249229063887494, 0.035153288200359269, 0.021732063618845297, -0.075236503021887086, 0.11222268661870922, -0.1223327365171915, 0.089597851601173534, -0.025863497436002837, -0.0013532772920339293, 0.037452430817598512, -0.095172396847614027, -0.025294237043152014, 0.0092336770328444798, 0.045197831390106642, -0.060782377972329979, -0.10825269327067877, 0.10079245210813292, -0.015704918925440504, -0.15393418284118934],\n        [-0.0022816888324770947, -0.024060777904828332, -0.064375093915972514, -0.051683675703232124, 0.082586761882057172, 0.10799981168598963, 0.011766005324578267, 0.13475702007336832, -0.022040198973617333, 0.002726563752619001, -0.078307843630374088, -0.00853731897183721, 0.018274693017327637, 0.14968884350468206, 0.011604584974515436, 0.20993316574217549, -0.039923368624747504, -0.056634414817972573, 0.061774450547349605, -0.10280319608126552],\n        [-0.0045581789111749909, -0.00066198929864758874, 0.030116361303995344, 0.052015237018933534, -0.057149166326883417, 0.10832378488024449, -0.12176894478021971, 0.094733181412691519, -0.053777107185287908, -0.066173515321594226, 0.02667771816372827, -0.096802491865775248, -0.073708163708604835, 0.014542543817590731, 0.0079362155357385559, -0.062350724930571956, 0.0114457464518416, -0.02293387196898488, -0.0045563429569467628, -0.014345756963712557],\n        [-0.02319593145002526, 0.038186433726972717, 0.08706661401447259, 0.081279187172167727, -0.12651124179728229, -0.13546806794789074, -0.028704304423922179, 0.061982096023738401, 0.035852029667403952, 0.0036320225960270566, 0.090477520800764724, 0.00068386220739691012, -0.044817915269828791, 0.06193024001847991, 0.078870109330660007, 0.046002165330352646, 0.0073402265804111229, 0.041759774758871937, -0.019334089807545696, 0.014622330486136953],\n        [0.0082810441729772831, -0.022628164438439315, 0.036363277368764858, 0.052466019430260261, -0.044709627260733048, 0.09021438636649573, -0.11127276398624342, -0.12854130381332382, -0.025063016988668928, -0.057362925765527095, -0.0095287923605207759, 0.1265336119507815, -0.032687178519142643, -0.01590396394734752, 0.014802970227304249, 0.075118124442728321, 0.010628470124414376, -0.024180821376674457, -0.0073747062951664902, -0.034648408127107316],\n        [0.017198522016467425, 0.022236361949753605, 0.064951340141844366, 0.055948184803736797, -0.10510905763267528, -0.10512394373069515, -0.03777241447816871, 0.082426181285644662, 0.011666390781661908, -0.011957815046176372, 0.090929803683901009, 0.0093392317964502772, -0.011475382834925737, 0.12593257195353708, 0.010551815031581582, 0.12451493177521945, 0.039646936943170577, 0.03719107313677409, 0.0096152888906913137, 0.053682193055150589],\n        [0.0060106898082263171, 0.0072122605101080043, 0.044409296126462966, 0.078857533847899383, -0.017120649032104904, 0.081425388748712191, -0.11940777277719844, -0.10089623131434634, -0.099198367818690861, -0.080663635662292399, -0.0043343566705041454, 0.10338853261811562, -0.10294994506346151, -0.023790752142643957, -0.010921145722281386, 0.056736886871193083, 0.18599558835956628, -0.10528546614138183, -0.0023446205569316245, 0.19100128644165718],\n        [0.0010733023256969559, 0.01157247180697759, 0.045184485859170752, 0.028905643369866726, -0.060482443709835215, -0.063955365071974413, -0.014845222571675594, 0.084862194545056543, -0.015853973269866806, 0.0019032111181755047, 0.069255873790655065, 0.013000816134354817, 0.021148557038695486, 0.058418279958511371, -0.08999424051007307, 0.059898583580402356, 0.092399570333022443, 0.06038983059651247, -0.017439626135533855, 0.061614920444553849],\n        [-0.0015444798414713842, 0.011554647683167758, 0.0246961186876711, 0.049406435936464904, -0.05670610296740488, 0.095355625030301761, -0.058676663018436867, -0.054830160517857759, -0.03312961518654288, -0.013388684721706963, 0.049666740963896033, 0.072510824197000667, -0.014517994556078053, -0.032898717753508326, 0.0034192131689155551, 0.034227464304296157, -0.080939956402453508, -0.0017775286940463495, -0.005015237764972166, -0.098310347613168508],\n        [0.0046908702369999706, 0.030208451863458361, 0.062622034091439752, 0.052743953778594359, -0.098766764690733908, -0.10326437154591862, -0.022886037597294896, 0.11295095822829268, 0.017062999846528665, -0.0029129309928138786, 0.11302847979225221, 0.0021341214358619517, -0.019488875651691228, 0.08553275343853213, 0.0067129322364770753, 0.10527899609166107, 0.030619444487241902, 0.035965574913564891, 0.027060969805652244, 0.052502519649912253],\n        [0.0037121867556401582, 0.011311610311061645, 0.032712925387670642, 0.019670534211132365, -0.071402951632534434, 0.11637895325503753, -0.12152584485104628, -0.094118262926394095, -0.026555943824720034, -0.0012395424097627105, 0.03302756727713687, 0.095162163403298403, -0.024545901145632716, -0.01261129372682537, 0.044968383374253566, 0.056680991926790526, -0.10954327798574533, 0.099453439107694774, 0.014650759610565341, -0.15612253139789609],\n        [-0.0021004419336657651, 0.024016053328674791, 0.065510998051054106, 0.053691686183182048, -0.084772954903796452, -0.10365082949147385, -0.016551511206833645, 0.13092241552622599, 0.019905643125049638, -0.0053300195908336321, 0.07929754711756351, -0.0047191176774989373, -0.021162766878001702, 0.14900015141933146, -0.011283098688825861, 0.21222541347290966, 0.040343082701711962, 0.055687478374924389, 0.061905950329526664, 0.10215861174289849],\n        [0.0046444851811399722, -0.0016088647336668569, 0.027558248660570186, 0.04993986434842837, -0.053853008893656552, 0.11249225413654093, -0.12121122997047816, -0.099965750296801714, -0.054603232503147428, -0.066014840536623001, 0.023573672637086641, 0.097063578004294562, -0.072931441095314686, -0.020425237513237268, 0.0083869895337177064, 0.054036292009652237, 0.0098648949467138435, -0.025146056897783802, 0.0021204516891783834, -0.018382489334929881],\n        [0.081810771753296499, 0.0013428505322772349, 0.00052034004062908137, 0.0014149728204025361, -5.5785446345156184e-05, 0.00050436857578441802, 0.00014499662069079183, 0.053461428336135319, -0.0023340734387916891, -0.00054673940084752561, 0.0024140020816934941, 0.050804016409159894, 0.0020717140421122162, -0.043036085806402301, -0.0041824626647224408, -0.048410973331845873, -0.0026616866809261075, -0.0028679704469060968, 0.023711183240833517, -0.00077900682440931561],\n        [-0.0016112669680105572, 0.068182145216188247, 0.026419842982680058, 0.071844095823552181, -0.0028324607335239714, 0.025608904825977018, 0.0073620856604533986, -0.0010529253262692335, -0.11851068329922455, -0.027760249058210628, 0.12256899523055254, -0.0010005874743438097, 0.10518959800104026, 0.0008475977185642829, -0.21236114512593507, 0.0009534563792407331, -0.13514497960633581, -0.14561887029600593, -0.00046699286059298517, -0.039553438859890044],\n        [0.093166740094738354, -0.014400575595609583, -0.02425869037887983, -0.036742157033356856, 0.00078129167135466688, 0.019454205498741453, -0.0039861327960365994, -0.02099317038141546, -0.038746820011047511, 0.022798678000079339, -0.026621044116277828, 0.0015937490043979945, 0.056984551915887666, -0.12002685484945716, -0.024167878123722158, -0.0052871980258868368, -0.06641761215588543, 0.13427170902105776, 0.12116397276410566, 0.017717186022320208],\n        [-0.0043276594230666661, 0.10938077275025079, 0.025032360614155796, -0.053334284454520042, -0.076358196693512861, 0.04166704372049216, 0.12200349265013893, 0.019618940666931924, -0.0087274878540610709, -0.02790569419575932, -0.0020209270918830997, -0.037179968015268169, 0.085756673591485144, -0.004389545295775843, 0.18879471579957491, -0.013536420311015865, -0.080458557180323409, -0.096480592550878083, 0.0087287715663233352, 0.10538650345322242],\n        [0.068925789004882776, -0.0038994871276475762, -0.038483088818842055, -0.053421640113207228, 0.020614388358821466, -0.02427508186739339, -0.033834645110336244, -0.0013678098316814412, -0.040894256133445342, -0.0036977002778182584, -0.022243390064701673, -0.0092915975150358755, 0.047028873154851922, -0.13509260700221762, 0.039418674703283973, -0.023948367571516027, -0.17001516730115412, -0.072578057599643309, 0.1202115539637188, 0.10088447004350533],\n        [-0.0035850918142771512, 0.098584534210232375, 0.036484755081029566, -0.078370073077591376, -0.060738169839910622, 0.024631053138221219, 0.11530991223411222, 0.025280805195852688, 0.02033204974869221, -0.017891370222691924, -0.012565485446069457, -0.029378799703956352, 0.056812766852860047, 0.016354624703901362, 0.17160493997741857, -0.027596329561658473, -0.057952679396500159, -0.014688921034535446, 0.0048945221808571505, 0.096282275263389047],\n        [0.082029257315952384, -0.0074757163649968785, -0.024317219559781427, -0.059450697624626736, 0.015388354923859244, -0.017755496878605441, -0.031009613692150929, 0.014232679001682458, -0.045997650792277849, 0.014613540618649851, -0.029813283030589052, -0.025341296256074276, 0.057084476163641755, -0.13353605511897121, 0.028972212579385332, -0.022874981819277038, -0.15035368981841191, -0.014709236489244142, 0.11573380339300179, 0.087448158866064024],\n        [0.0031065122369682264, 0.097354708154303596, 0.048803407878371549, -0.089656786129114069, -0.053981454541723428, 0.01618876328493523, 0.10550879640444577, 0.028379974224971769, 0.022378952453626672, -0.012573185226640944, -0.023347021041790376, -0.037642437913027099, 0.067803785546888304, 0.010191767475728952, 0.14003184385552006, -0.021789923937985227, -0.031733332445823145, 0.0074465847536980302, 0.0062392987933809346, 0.02754136582668306],\n        [0.1387392468659556, 0.0029894476997011136, 0.00093655830249406418, -0.00071956529721012004, -0.0008872730067093457, 0.00037083649983887671, 0.0039663222876059846, 0.011515406413235096, -0.001605791484448746, -0.00059454204947576147, -0.00015462731808354332, -0.021428183483375163, 0.0017941691288204662, -0.18742897143429363, 0.00028052668699122749, -0.061963185529603594, 0.0010059641470246006, -0.00058911793994807001, 0.18354627085177028, 0.001104489680699863],\n        [-0.0027324759423598926, 0.15178677915220828, 0.047552987208318576, -0.03653534359011034, -0.045050566340589578, 0.018828922114365518, 0.20138679301047269, -0.00022679646676340305, -0.081532758522211576, -0.030187389720664079, -0.0078510764992025268, 0.00042202907381617971, 0.091097480429496794, 0.0036914223402121347, 0.014243514709650809, 0.00122036783099561, 0.051077012598222192, -0.029911984964390393, -0.0036149523710262976, 0.056079566555546495],\n        [0.081843326175564626, 0.011303243144873897, 0.026219987228758131, 0.055874374446870795, -0.017501931484022883, 0.018379157328786692, 0.035139955952998056, 0.013104185338561095, 0.046843147349681404, -0.015097274885653114, 0.028870878407626664, -0.023839480142389981, -0.054370445929998568, -0.13383379839837584, -0.023436016295804645, -0.021999268190288232, 0.1489875979432729, 0.014991037574045143, 0.11539838184369516, -0.086295907464403285],\n        [-0.0063339904172092188, 0.096984855670291956, 0.047808075231963468, -0.091928118806094347, -0.053333678815841917, 0.015477089583819052, 0.10420597754290616, -0.028918375044037915, 0.020550448601090406, -0.011988029328599841, -0.02450280834026132, 0.038611055599596503, 0.069998895439423989, -0.0049259057318324553, 0.14106402636925069, 0.022673724386324326, -0.037628873079354773, 0.0068616364698298798, -0.010791457969181364, 0.030963263322166375],\n        [0.069013500164363681, 0.0077782114133199123, 0.039889826275969542, 0.050294404698156978, -0.022989956636996347, 0.02522610009548568, 0.038348713762754429, -0.0023621762657445875, 0.041663113891177821, 0.0029903632691728448, 0.021731376833849146, -0.0081276070323543018, -0.04475541031321123, -0.1356318045872692, -0.032631192325708366, -0.022843195367171557, 0.16760144609996055, 0.071943400497696125, 0.11992561030559708, -0.097015137991933759],\n        [0.00086837107609009359, 0.098354541392438252, 0.03494119686036181, -0.080412765420858859, -0.059879380230085794, 0.023656125049108481, 0.11388825761211437, -0.025207342945575004, 0.018706078492882101, -0.018023091946400036, -0.013431570532555042, 0.029721871750519709, 0.058620462599582583, -0.01102269478220743, 0.17302396547131629, 0.028517891577622866, -0.064602054354914035, -0.01753527789696872, -0.0096240348389936663, 0.10017991728015548],\n        [0.093264891131244823, 0.01869625635332417, 0.025225522728041395, 0.034613636044571898, -0.0037872760428480719, -0.017798486629238417, 0.0087869071633989888, -0.021749382668845366, 0.038373129017708049, -0.02387977956539547, 0.026520826150974057, 0.0030564676199522, -0.053563707436167715, -0.11976093779742616, 0.031582894163982841, -0.0047501037484688367, 0.063198064822796177, -0.13796648876910192, 0.12072631763615553, -0.013553871931192441],\n        [0.00065587974480378023, 0.10872892910029817, 0.024057766727453193, -0.054739640129557052, -0.076268218539154262, 0.042400737230636511, 0.12175192703198599, -0.018777124089696604, -0.010246368849578542, -0.026986359795397864, -0.0030675587070682357, 0.037088381781813853, 0.087933926719009473, 0.009112177063499604, 0.18769670173732864, 0.013734105437928577, -0.08301134398793153, -0.091118848539309905, -0.013492812125432366, 0.10600238839912123],\n        [0.15198329888645534, 0.0028006329231055624, 0.00074600501456857128, 0.00047877576221698378, -0.00028276186426712897, 0.00046544182592499889, 0.0027810265190758971, 0.014577335068213435, -0.0023713561635063558, -7.4399427398391733e-05, 0.00042809416639977911, 0.032335351595210671, 0.0025660999077709401, -0.11258044828872535, -0.0019629261392470339, -0.068299111724211686, -0.00085203598771659819, -0.001085913705477137, 0.13519669471746937, 0.00036773380244120628],\n        [-0.0029933181650393316, 0.14219986221144601, 0.03787779876667053, 0.024309450501608269, -0.014357004020670722, 0.023632430715189428, 0.14120436296966274, -0.00028710129453176221, -0.12040368336844545, -0.0037775705046386573, 0.0217361336336362, -0.00063684625884668155, 0.13029163882764647, 0.00221727718347658, -0.099665980582218289, 0.0013451541931120844, -0.0432614353180815, -0.055136386499758307, -0.0026627052124549278, 0.018671385173615346],\n        [0.1316377984929808, -0.02362242079673707, -0.010985661443978204, -0.039968343205424334, 0.011570505836073249, 0.033205834150693059, -0.051170416514177627, -0.014142357469543666, -0.040076184864964268, 0.014047529939951571, -0.038612435433181186, -0.0061341283358575102, 0.019089531531501298, -0.16518066221941546, 0.03038866293059846, -0.0032824916332468497, -0.11074112146459174, -0.013923765545995706, 0.17523174961640861, 0.020527889008506092],\n        [-0.01333077899561892, 0.15174038102342471, 0.050439117821201064, -0.032633802973101728, -0.024681537713083592, 0.047849917736861383, 0.19726449414187786, 0.024421895341756646, -0.12826274594269291, -0.0096122374810214146, -0.051464351914932593, -0.034670744528944086, 0.12764585703241688, 0.0036731932047622887, 0.04396417565977026, -0.024460064437484951, 0.038083140431675586, 0.0069072900028640674, -0.0048465499204577989, 0.038264694747099537],\n        [0.13206061186311063, 0.029578852069042368, 0.012963173373203693, 0.038652398078394837, -0.012533364143145624, -0.031296001493739657, 0.058897988383271399, -0.015092997962523761, 0.034994783686450703, -0.01441511635728865, 0.036556092321482714, -0.0047642170603121895, -0.014048695159930489, -0.16519719776774375, -0.028634015353771358, -0.0023168354615989029, 0.11215475975367495, 0.014184941121037223, 0.17528669136738098, -0.01900530438792368],\n        [0.0081372264961395695, 0.15069257947128609, 0.049967444401719879, -0.034182242142128616, -0.024206810868850334, 0.049120284400353223, 0.19509669177023312, -0.023846103652028865, -0.1297412721720777, -0.0090516643337693273, -0.052944799577375898, 0.034885387950180834, 0.12829851595375544, 0.002833614167307253, 0.045126630063328788, 0.024570343445953734, 0.033693195647928866, 0.0063536877131480183, -0.0020569271343593674, 0.039043302836162586],\n        [-0.0038309214028131441, -0.006327609729933484, -0.052088333861299019, -0.18060229644188955, 0.066849870072778358, -0.12575488626154094, -0.2125060648853131, -0.073443087091755968, -0.16677568935528311, 0.074329338740259696, 0.013077140393708553, -0.062464753970647387, 0.12874919357305487, 0.012954480511230384, 0.029466872112777671, 0.0018815134527229026, 0.01668552514963443, -0.033447189900894674, -0.18253121075591622, 0.065848575934592049],\n        [0.0040363724128006729, 0.0054285031489339237, -0.044557203531833921, -0.17695699954660296, 0.0049670275463198459, -0.10595366487499482, -0.15416871677359822, 0.058039359533206859, 0.23028436557624588, -0.0065144055070889047, 0.086590768314136965, -0.058097017518508931, -0.016970687725788164, 0.018175711463983675, 0.14783066559284957, -0.078001208441342826, -0.097636412590754701, -0.23238594617718841, 0.021669545651174356, 0.02589071093035987],\n        [0.066274862156580475, 0.010935323985695435, 0.014806079420386867, -0.12123528814039794, 0.02855589378925754, -0.036047598017287408, -0.10364050007965218, -0.075579190193593049, -0.14632862610243588, 0.04639984248265229, -0.037991214935095025, -0.05285698609791422, 0.077592314922658084, -0.036722314655055044, -0.06038133373732392, 0.045720314892436477, 0.040593347514767376, 0.17850961871979443, -0.11243932211559991, 0.010951767221505329],\n        [0.00064917569290233825, 0.075925963194159299, 0.0174751696005488, -0.19376068891082923, 0.0040828318816701452, -0.031841460036281556, -0.044576969573996782, 0.030139223137968539, 0.14151154571182542, -0.021340478372072667, 0.010565323177547331, -0.049083297160211432, -0.090521299110574008, 0.019607952775614269, -0.10735829803366925, -0.035450005106403344, 0.0033882421104407122, -0.0017408685781109632, 0.013726786778436431, -0.052913524981135822],\n        [0.10398820287198415, 0.002555304662503209, 0.0092925475363547921, -0.039068549667282911, 0.0011161779327457165, -0.0035912785865321356, -0.041179596831509013, -0.062868314541723383, -0.065948016538531801, 0.030964888548817092, -0.014728513450262418, -0.042241476052874177, 0.064679635499551844, -0.073966411482394828, -0.027365421654483347, 0.052599561053486892, 0.011955557066130695, 0.12005062922777424, -0.03260051882859781, -0.005169167432061912],\n        [-0.0023092618200368058, 0.1119484805026983, 0.046231968719573899, -0.16547162937327961, 0.0046113699175225863, -0.010780969312844432, 0.051679447504111693, 0.011460267729800142, 0.08980407463741813, -0.034390966251272775, -0.051200507366371613, -0.020256685820207513, -0.08342543815233526, 0.0026742274714927723, -0.23595294011547635, -0.023520579545326849, 0.056009972045851487, 0.075816529529921281, 0.0087273605289674705, -0.033058495383148763],\n        [0.1120645151564317, 0.0022079729500584741, 0.00098928742937460612, -0.003301014092801275, 0.00025018449162577777, -0.00015106332155457444, 0.00091684303783099363, -0.063279768671292175, 0.0017042671887136874, -0.00032171922161875388, -0.0013785209562622491, -0.052334921761096997, -0.0015448840382170492, -0.053191625186315088, -0.0044536651788212962, 0.059985955751636004, 0.0014679630382097369, 0.0015595511447703578, -0.019700230648099601, -0.00085419779416753654],\n        [-0.0022071158563591849, 0.1121080333929546, 0.050230265803129975, -0.16760630973155033, 0.01270291438164515, -0.0076701174698927919, 0.046551960656267183, 0.0012462979974182488, 0.086532782431857316, -0.016335032202010345, -0.069993282025136702, 0.0010307387266987771, -0.078440232404101987, 0.0010476115406416152, -0.22613123252942074, -0.0011814261982336107, 0.074534631098160928, 0.079184942827846119, 0.00038799696207817563, -0.043371199284965904],\n        [0.10399848794160393, 0.0018546282231649443, -0.0074649658195946539, 0.032522836809174546, -0.00093374048841793583, 0.0031639948630730577, 0.043182531456502818, -0.063270806840101071, 0.069432893861544234, -0.032295013728537755, 0.012701080887017291, -0.041411114897206752, -0.067914338774211269, -0.074014348575406799, 0.018053595514753489, 0.053484889263948468, -0.0097409030935217272, -0.11697226908769014, -0.032918875737885253, 0.0038634864930026259],\n        [-0.0017870457628367537, 0.1119622803578736, 0.046562008727237675, -0.16688162507129661, 0.0046517431565028695, -0.010914014738721261, 0.05001793145007153, -0.0089759518469328132, 0.087137741288496093, -0.033145059523410833, -0.051740734507055609, 0.021904227503264234, -0.080813993640496004, 0.00024026050450727578, -0.23684746977845314, 0.021431241345078487, 0.05643728484132754, 0.080484706574742798, -0.0074369529950133462, -0.03323639392378238],\n        [0.066197905559296805, -0.007937272624853435, -0.014106515811415555, 0.11351197925830203, -0.028372988239404456, 0.034765891745263566, 0.10180491786473986, -0.076707305856766231, 0.15178714152250369, -0.04720413741476337, 0.038377760867838853, -0.05088335009753632, -0.08109640280587968, -0.037465896519152928, 0.056107295015633704, 0.047080696866891356, -0.040428456400197134, -0.17843973287559281, -0.1128926164266072, -0.013026734771989946],\n        [-0.003258233035928045, 0.076297659865239037, 0.018044604513067886, -0.19838404729853476, 0.0052040488702490692, -0.033236135022211573, -0.048623226669103181, -0.027139933490635631, 0.13564014175458514, -0.01949694361924361, 0.0090612326347666739, 0.051126467923420758, -0.087395917408481461, -0.018146812493972552, -0.10965254701379751, 0.033622284848530311, 0.0049839703200505025, 0.0052892655613498776, -0.0092888637319964926, -0.052441267265233169],\n        [-0.0039868820031456502, 0.0065364490733629474, 0.050293508064377906, 0.17349459134769435, -0.066602452923475206, 0.12148545825215637, 0.20627090330577347, -0.075671422129284432, 0.17571376211231018, -0.074528200706336797, -0.0096575032954606538, -0.060128753635612778, -0.12931756777555675, 0.012228769086885426, -0.02362321502366381, 0.0049513379063351008, -0.020517001886349622, 0.024271097161742621, -0.18324289428534218, -0.064778069009668593],\n        [-0.003882400409842432, 0.0051751449104026556, -0.04657361868699695, -0.18393095427827572, 0.0075953772763110682, -0.11082307499956565, -0.16241654870757216, -0.055102542314522565, 0.22353901984468466, -0.003582649320105733, 0.08703852818268723, 0.060511502372577727, -0.011888050816356367, -0.018671696740185807, 0.14887627733685901, 0.077866635114920285, -0.096903707084442264, -0.23352271053475368, -0.014465607580724772, 0.028463408799233134],\n        [0.030970322681001344, 0.0047092200014083761, -0.0075287381199665099, 0.16357528456660905, -0.052689892202482637, 0.089603666894719117, 0.14218940432389821, -0.10513747604797508, 0.14519927390557394, -0.054724870498712809, -0.029363608692248001, -0.050838750489416849, -0.061890285829241144, 0.044141490765737125, -0.050417517293536961, 0.025015137007616546, -0.016424178217207281, 0.044950698551189411, -0.2067799302490973, -0.068404093672558383],\n        [-0.0061910554636544247, 0.025490142152652336, -0.17773317220354787, -0.011649348642623007, -0.033779282406239355, -0.037805216091529065, -0.10672838541759473, -0.042820997106558227, 0.11269092441672976, 0.087330253747772396, 0.0073968040077101753, 0.043681348504218676, 0.017817631930504733, -0.025762018942079048, 0.053616783973747938, 0.05392914604451754, -0.045882436605483475, -0.054493601747828906, -0.018289999358621918, 0.050792370931913529],\n        [0.072541861006159419, 0.006476680970671134, -0.026270676170072199, 0.11039354583740993, -0.034051788978890947, 0.048185260694194772, 0.068956955964512401, -0.088822070980787649, 0.083965194657350153, -0.032425744904939727, -0.026027916755625602, -0.062975614492549584, -0.033734092336045483, 0.050170467939578731, -0.0071563112069314367, 0.036377300918928768, -0.027785475091142361, 0.045788377840654343, -0.16056788078199066, -0.044453878673682577],\n        [-0.0046479508538619374, 0.046087217023970839, -0.27900795030851655, 0.098063569589822888, -0.061903898032388743, 0.015660875349017691, -0.064717698941130067, -0.035866374649349185, 0.014465297947944376, 0.15613902852083919, -0.056401659837762089, 0.029190158094928927, 0.06489892032450216, -0.012065605931256339, 0.018024896454018453, 0.032618292440983028, 0.022591293266887181, 0.09812652322448133, -0.011371173195259793, 0.053107627097234475],\n        [0.092348192058670925, 0.0010952096884211909, -0.0059954126082538226, 0.0025490185537617518, -0.0015525730855718725, 0.00060010147540871892, -0.00090016832239136872, -0.096893901856154083, -0.00043212015089025225, 0.003109771883908815, -0.0013362209789642928, -0.068512309872291427, 0.0017057933812730085, 0.027410918821544273, -0.00020315778991813945, 0.051832972363327026, 0.00062915076693509831, 0.0030023947570177061, -0.12667198858307449, 0.0010261238764925802],\n        [-0.0018188019527347944, 0.055608382484283542, -0.30441220616984355, 0.12942434694989627, -0.078830637539146028, 0.03046966505748637, -0.045705315521775092, 0.0019083299193569704, -0.021940549726592977, 0.15789614188725432, -0.06784553503059583, 0.0013493531405928255, 0.086610273619572284, -0.00053985932553349931, -0.010315171793919409, -0.0010208528098808126, 0.031944619243145525, 0.1524441554727779, 0.0024948107272665665, 0.052100606489871464],\n        [0.072668617825301429, -0.0046569824991961615, 0.015264415714518009, -0.10644670145937027, 0.031587927348150538, -0.047531249409710249, -0.071451728359471056, -0.087340958401163751, -0.083330512075594679, 0.03854854525064836, 0.023786927187687674, -0.064076134823726288, 0.036263315230795352, 0.050606642360040699, 0.0078604886212777329, 0.035064751329812231, 0.028653455870299018, -0.041889155266448416, -0.1599956242713681, 0.04651050844387359],\n        [0.0017880236959115089, 0.046306495045648009, -0.27982598588173846, 0.10233424838085241, -0.063196675309032335, 0.017546016482861838, -0.061952343350116838, 0.039335913735030842, 0.017760194700190777, 0.15474118656366273, -0.057382765514220439, -0.026687867962290814, 0.063520318115506472, 0.010080796040363754, 0.017729139880527298, -0.034025346994416339, 0.021479725887446274, 0.09985333633117191, 0.017684686388847928, 0.05131607924740187],\n        [0.031190077233784839, -0.0037018982930456636, 0.0005246879936731259, -0.16390712475261301, 0.051318978608620253, -0.091022753824708383, -0.14628154898705953, -0.10336987404471408, -0.14064948860692097, 0.058121044994734826, 0.029632085365876047, -0.052519270838883962, 0.062543856649474996, 0.045121634388888533, 0.052489570288457181, 0.022872287624848182, 0.014604828763976164, -0.047061515545538023, -0.20589940927102812, 0.070350987521525382],\n        [0.004966803486139159, 0.02565579952003115, -0.17789178480673115, -0.0051995673065931896, -0.03582774197123851, -0.034247770305137808, -0.10104693652841799, 0.046927559098234456, 0.11832072913574611, 0.08510774817530592, 0.0062348810597435385, -0.041645707450159532, 0.015366895686711617, 0.024003977526008316, 0.051590024080869948, -0.054872291107689583, -0.046493554346182915, -0.052681416896737082, 0.026417738211326147, 0.048059583131722365],\n        [0.057822167916677866, 0.0015818691524278872, -0.0086989311774794305, -0.10253564278062774, 0.025956947528960845, -0.056268310823976389, -0.10131954273559655, -0.10023331381082408, -0.11388888765265529, 0.05842928132354492, 0.015546668169134321, -0.071095203622811659, 0.06231399292864441, 0.036858492295635148, -0.0010999714881740621, 0.026105216445068306, 0.061097310720830501, 0.077303858214289992, -0.18755963663306235, 0.047389410510084273],\n        [0.0013806130436272196, 0.028279785525396724, -0.24779758418898035, 0.092947078419168605, -0.038757957330367888, 0.0028008391133760783, 0.01252921060623961, 0.044696812467934832, 0.077376575265403702, 0.071988012448027799, 0.010778528628600051, -0.031045644082364751, 0.0010043548601519081, 0.0066662232244777365, -0.12622795800741801, -0.045083852480253137, -0.044807980460019228, 0.017776390020602231, 0.016228237723703562, 0.056646065257650355],\n        [0.08743934914534307, 0.00080254649884021882, -0.0057786355332734261, 0.0027136736414979869, -0.00091802840943314655, 0.00011137735951005171, 0.00064188936915962668, -0.10811931560815041, 0.00033513970260685885, 0.0014622751318325126, -0.00028756414198402813, -0.059023549879327397, 0.00068450082974115685, 0.025379280968380467, -0.0033295795726401762, 0.027241769541909207, 2.5402298056486418e-05, 0.0016213486083215725, -0.13466444154822188, 0.0019403531333068763],\n        [-0.0017221220624478687, 0.040748646711902918, -0.29340552623742644, 0.13778457530947336, -0.046612146936721104, 0.0056550949769633985, 0.032591411425749707, 0.0021294149671227474, 0.017016446225115087, 0.074245832271085804, -0.014600835771580457, 0.0011624715696626617, 0.034754973731009088, -0.00049984612319328887, -0.1690566987716989, -0.00053652792257516575, 0.0012897810540676788, 0.082322658852477748, 0.0026522224614447111, 0.098519854537740509],\n        [0.057722966076044338, -0.00046713096417426854, -0.0010648000347449808, 0.10611590201326676, -0.02746290579936882, 0.056334957908550129, 0.10173430596600778, -0.10191551293463318, 0.11684725680985987, -0.055549455027095192, -0.015110209275042964, -0.069817653430995413, -0.062226122825756187, 0.036567427603391177, -0.0038710846599720981, 0.027860140717788494, -0.062814236601042656, -0.076543967770580645, -0.18805317015343495, -0.045122231921033401],\n        [-0.0036562798504169839, 0.028320140678325608, -0.24794793875814208, 0.088837676506122579, -0.037705850825817878, 0.00058311248019061101, 0.0085300555789909818, -0.040715481890351971, 0.072832216131135635, 0.074232828980148546, 0.011382317260704876, 0.033820929378822563, 0.0034571782525573127, -0.0081123501438758478, -0.12617338080416468, 0.04402100225222013, -0.042367536752229679, 0.020806430133868493, -0.0088305259631811031, 0.05846808637309852],\n        [0.06632787150069476, 0.0005024945974418921, 0.00068789731494344527, 0.099052827103458627, -0.027081197212793062, 0.043963347280316291, 0.085985928084049035, -0.064402105970983711, 0.11344648894176523, -0.045255083619287213, -0.0033627481062759495, -0.065526585575091861, -0.065674092536073009, -0.020837968861429697, 0.024402999253028874, 0.015466292580588225, -0.049326952278705233, -0.099548532965597292, -0.11056103199623027, -0.052035175908553173],\n        [-0.0034584653198352355, 0.081730476144182482, 0.042050903254929328, -0.20673617233092098, -0.019186781291530772, -0.017709312635985481, -0.062968880438414046, -0.020672760790206416, 0.10430012736186442, 0.0046453384558402724, 0.0023476603249214939, 0.04000959099000892, -0.060975072974956919, 0.0036578431925638182, -0.017462918205026205, 0.022780444868397098, 0.078177903575462684, 0.099431926790962424, -0.0024518885244070067, -0.12599928693973769],\n        [0.097128615119178252, 0.0021091910624301854, 0.0011487974317803925, -0.0036646797964441928, -0.00020402199216735107, -0.0002950630790080626, 0.00015780066191907344, -0.082650389488317363, 0.0016065974001583869, -0.00015594162162705649, -5.4727904831485806e-05, -0.048473628411413568, -0.0013575663381852705, -0.037546402774221881, -0.0016561616161499832, 0.026718742004923881, 0.0026342928535636671, 0.0026626671036050439, -0.042087730824440769, -0.0029947917415798823],\n        [-0.0019129526080266935, 0.10709246327169396, 0.05832925663349231, -0.18607114049263718, -0.010359050961291636, -0.014981588209040738, 0.0080122004553344981, 0.0016278032784891297, 0.081573678237876118, -0.0079178091943084804, -0.0027787649219276709, 0.00095469037395777079, -0.068929328310090771, 0.00073947815503061336, -0.084090261052632717, -0.00052622687082184809, 0.13375408026912178, 0.13519475977153123, 0.00082891982293697986, -0.1520581185386175],\n        [0.066412611420979081, 0.0027160178727324764, 0.00096838289061252475, -0.10711621231805085, 0.026304719983661629, -0.044626555190009395, -0.088398635285978924, -0.063538176615308029, -0.10925171370014186, 0.04540289816921849, 0.0034525790352213999, -0.067051140879800644, 0.063222280478838544, -0.020965836164988375, -0.025071674259481383, 0.014557322724614043, 0.052366940659376415, 0.1033864484065217, -0.11037875047163209, 0.047033623955948213],\n        [0.00084413531333646472, 0.081686880699964534, 0.042045379078425649, -0.20267566347704935, -0.020238219422379647, -0.015964530372102555, -0.059534368323843435, 0.023192550627061579, 0.10868617885682233, 0.0028598252732636277, 0.0022134321387772254, -0.037398466479719547, -0.063513693057426587, -0.0028345153014708558, -0.016488512201080392, -0.023371761373115647, 0.076175037607720986, 0.095435112861314508, 0.0068033078519711999, -0.12795045157687654],\n        [0.20703888776046808, 0.0040955306438840667, 0.00091829030602567484, -0.00029318224193783675, -0.00055127789316487255, -0.00022805224437934772, 0.0051995057930183932, -0.0070650309926390707, -0.0025937632986591107, -0.00022702125921550729, -0.00086173305987560507, 0.0039240564283781008, 0.0027605436927608689, -0.18348670413797583, -0.00045015275908286324, -0.021588694232823304, 0.00096281376926177914, -0.00018547586884016306, 0.23464452882669662, 0.0015329766435944019],\n        [-0.0040776405575057902, 0.20794724236737283, 0.046625444523509314, -0.014886090234270774, -0.027990687319841629, -0.011579167501817512, 0.26400068400072507, 0.00013914611514436953, -0.13169622503382422, -0.01152682006741342, -0.043753796281685783, -7.7284474501817166e-05, 0.14016436409825117, 0.0036137792018137043, -0.022856140762930171, 0.00042519034051920836, 0.048886087210756428, -0.0094173866110174916, -0.0046213349467353892, 0.077835644112284094],\n        [0.001600149798509044, -0.029891049610734331, -0.073100016972691292, -0.058468287694032256, 0.11859715192490811, 0.12934983734389552, 0.032157533878495161, 0.082573315128634459, -0.041100473797450493, -0.0057089075464736442, -0.11638049064707184, -0.0053600186457387336, 0.0098026006087696335, 0.099418622679411317, -0.049008089369327941, 0.096626712331893835, 0.019636547733371066, -0.043651581474207432, 0.0051686639646904564, 0.0072428841031747272],\n        [-0.0084655797579516363, -0.0046796039747889337, 0.045349170381251615, 0.075740338407896624, -0.034637874980380609, 0.082185012813799529, -0.12096517723818774, 0.11907027593886906, -0.077532966005268225, -0.07891922561825053, -0.012653839329841899, -0.11579889444409854, -0.086081021299873675, 0.014700684484061042, -0.0022790983807368559, -0.072634107643920642, 0.13958423960770075, -0.080189569403226982, 0.0020189064619431322, 0.12988268130836492],\n        [0.01424380662597859, -0.014200096866361181, -0.056192009903351103, -0.043173116638536083, 0.080962018527769866, 0.084430862834772316, 0.022292726265859285, 0.0819540031923333, 0.021520036248995907, 0.023644742127952947, -0.069978359098797141, 0.010578253533974168, 0.0055637826130301481, 0.10753640013705529, 0.04781691310140064, 0.10988794493865349, -0.10152366815496501, -0.038775585391088246, 0.009852910151646431, -0.10479520228312821],\n        [-0.0019267548176591992, 0.0089253887142499537, 0.038395556537414034, 0.072665186105416488, -0.035316486177484258, 0.085965924697292445, -0.095827634585293003, 0.067000919870278841, -0.079359015546978925, -0.060241496386490526, 0.022959701461265629, -0.082723836506042564, -0.073346522132294159, 0.034408742374915882, -0.038907662769628905, -0.046992930274581561, 0.098012549165148996, -0.061028767847837867, 0.00076321736854494809, 0.10756844632916053],\n        [0.0059814141378770683, -0.019986810144644714, -0.052159516892456757, -0.044470068674562206, 0.076646118870655117, 0.092443985277207139, 0.004678028369475922, 0.10415240351429292, 0.0046581309098169387, 0.0051387821644296996, -0.096441880503777305, 0.0059706943668324346, -0.0081662190478821537, 0.083068312844982603, 0.047686224996273292, 0.097270615186996257, -0.082539469495457859, -0.026822366473815737, 0.0086196546781417416, -0.097324503721316472],\n        [-0.0021942894961033254, 0.014672723795261092, 0.0297720048321981, 0.032614772081342773, -0.070295075024643439, 0.11259463615333912, -0.099268692243530854, 0.067976663605742033, -0.030441862025488736, -0.007886017458831291, 0.043349675685024236, -0.085122999155765849, -0.02423614615027082, 0.010447936760906771, 0.034457826074821618, -0.043728626489175956, -0.10420367455137278, 0.051653432878078387, -0.0020921056059804294, -0.13233775532920924],\n        [-0.0042059935392670346, -0.036744548164445875, -0.071150072959197758, -0.055275730345418772, 0.11733258745742503, 0.12551113047364854, 0.026702116872438945, 0.098002215324570499, -0.032058017685709768, -0.0047389532692274257, -0.10681090062656813, 0.0020600345006132207, 0.030173430742514089, 0.081617365370315068, -0.060517548931821992, 0.076498984061509942, 0.010560607875077087, -0.048467808387472493, 0.0058354971872773553, -0.010407245460860998],\n        [-0.0044631564451177276, -0.00045295155675293449, 0.035712505776059139, 0.033807803564813034, -0.072124316297525748, 0.10250509947932059, -0.1226494724455383, 0.11180724612070779, -0.025713763387405553, -0.018860328071287888, 0.019240580467794626, -0.11284980000963721, -0.030120981721104612, 0.016747429515335161, 0.051983556502342557, -0.066147016249778562, -0.080512483822065731, 0.055429747589261724, -0.0091079370182397448, -0.11890323290806679],\n        [0.0019322395797021119, 0.029683610868556625, 0.074828944142974155, 0.061405208380541323, -0.11986904124223763, -0.12601350788764124, -0.036895578153987703, 0.077820909748784958, 0.038015754250682834, 0.0025970500443394723, 0.11579199621960418, -0.00079630137938405913, -0.013184423524449153, 0.098762687832966226, 0.048880345050464534, 0.099411734305558719, -0.014125215491144956, 0.040460280290956802, 0.0050851616444164346, -0.0021231601220420642],\n        [0.0083960091842815946, -0.0058529296934387584, 0.042435702587835022, 0.073379424307888352, -0.02994127217609336, 0.087214405816630577, -0.11960517297381305, -0.12222924768386143, -0.079091163809245135, -0.079082811840663722, -0.017226487294788227, 0.11592014345432393, -0.085628290786705655, -0.018603874644254632, -0.0042070156653518124, 0.068773121287758837, 0.14024917911015872, -0.081846156446419099, -0.0022208560358934135, 0.13006714598651917],\n        [0.014308626336015217, 0.014540520423140585, 0.057660251751921007, 0.046000814992156927, -0.082289813667776351, -0.080980494820433804, -0.026048634371759079, 0.079252299607605575, -0.024628094656255289, -0.02599840397250559, 0.070828125770320438, 0.01382728639225384, -0.0084474740718789628, 0.10609816881106175, -0.049311813835476996, 0.11165306622847265, 0.10530416416182468, 0.036342518602119435, 0.0098152177824551573, 0.10894942298282573],\n        [0.0013644133178536335, 0.0083593409153309445, 0.036153230930321134, 0.070908901359961918, -0.03210123372298971, 0.089223709106505664, -0.094875549231313291, -0.070175885527856877, -0.078450125954942412, -0.059263772307063395, 0.020186511169956366, 0.08224316825811924, -0.0730705697779436, -0.038616285181248482, -0.036994707959346715, 0.04262966971973222, 0.09393906535445655, -0.062508222411948575, -0.0011505820661768321, 0.10335873595850939],\n        [0.0060631753715524039, 0.020549046454011372, 0.053291335098044221, 0.045719783410926723, -0.079354536584653024, -0.087938902453332982, -0.0085830875044931674, 0.101395065582099, -0.0058531614203063097, -0.005445307614197795, 0.098073976573685884, 0.0093177669338030018, 0.007205592342012423, 0.08259250865896775, -0.046292474156033811, 0.098916989702066069, 0.078372460116979403, 0.028835410650639128, 0.0086953465132257254, 0.092038254344599224],\n        [0.0019570707435616432, 0.01387436820763277, 0.027695145380569608, 0.030838478735115384, -0.067222634834479697, 0.11614728554614781, -0.099007513947460796, -0.072024930603050749, -0.030234841632456377, -0.0076775633166532029, 0.039518676801310174, 0.084821892196893151, -0.024538894693039576, -0.013710634372263898, 0.036308740940865211, 0.039864702454276729, -0.10737284251528514, 0.050557250359913708, 0.0017510858493843574, -0.13606726368738839],\n        [-0.0040269958559816504, 0.036698218288480453, 0.072501070354695815, 0.056564040810879776, -0.12008147931184913, -0.12137767813607811, -0.031510710584075563, 0.09352382549573536, 0.031020682241923343, 0.0039926562394971814, 0.10748566435040698, 0.0065018775352949773, -0.031336039816478478, 0.080894644984347966, 0.062517461426333687, 0.07904418680908222, -0.013722582803368383, 0.05061275847617297, 0.0061895952050397204, 0.0057173813576256987],\n        [0.0046253055555129877, -0.0018994102698154198, 0.032883289803905605, 0.031605114052025748, -0.067448435171749935, 0.10736758608785574, -0.12150296809183195, -0.115579360433701, -0.02695610132653348, -0.019032297528091081, 0.015019999618782623, 0.11268117275248012, -0.028909549827634367, -0.019948111144142567, 0.04956037623096271, 0.063083586239858991, -0.080034225248293553, 0.053478351200525617, 0.0088711022623346666, -0.11922080818583679]\n      ],\n      \"numEvalues\": 20,\n      \"eigenValues\": [\n        448.2615028731629,\n        152.88433766749935,\n        77.079422234111703,\n        38.340488190771154,\n        27.754350120854401,\n        15.293153116152746,\n        13.085890189100295,\n        10.196616391772121,\n        7.2364679411701438,\n        6.5964537073839553,\n        5.7388999381293884,\n        5.6223215910853748,\n        4.6227291984146053,\n        4.393149515511058,\n        3.9714381417641094,\n        3.5791364382171165,\n        3.4263759023353697,\n        3.078849017302407,\n        2.6395798573836098,\n        2.4414195196560233\n      ],\n      \"numPtsPerSample\": 71,\n      \"nonRegularizedVectors\": [0],\n      \"meanShape\": [\n        [25.011254225136952, 34.815173567571549],\n        [24.381567267455893, 45.626763203908808],\n        [25.830707280728745, 56.164927637057076],\n        [28.675368741312013, 66.695735954974964],\n        [33.59842962462659, 75.549155778418879],\n        [40.332640541597783, 82.561857303541444],\n        [48.359309091167063, 87.999836114954576],\n        [57.763839129670998, 89.783311477497705],\n        [67.090852037871969, 87.63091750236714],\n        [74.897176557764965, 81.881107153483129],\n        [81.35004130814275, 74.608685557615786],\n        [85.920682599877409, 65.568286826736994],\n        [88.348489374468954, 54.933637000847114],\n        [89.381567267455921, 44.346585170183118],\n        [88.326664228593643, 33.56817361245254],\n        [81.566856326247773, 27.444862527091914],\n        [76.619772918209833, 25.17298033285374],\n        [69.153548565650397, 25.746811251285578],\n        [63.337202235413088, 27.340674714612589],\n        [31.524715699235657, 28.430444822342793],\n        [36.378507746326761, 25.965533928582431],\n        [43.861536613791145, 26.244938607124027],\n        [49.736130518962113, 27.608548456866743],\n        [35.982434927065498, 35.443406084328842],\n        [41.74296700227427, 32.491136119230305],\n        [48.056933854020826, 35.383200094731308],\n        [41.827893337283342, 37.01094114500529],\n        [41.960848751111143, 34.61071899652552],\n        [77.388728098024785, 34.627907207783039],\n        [71.516418152976826, 31.904746609209838],\n        [65.321222211179702, 35.043179129766543],\n        [71.609524186972465, 36.424390535431939],\n        [71.382163563407005, 34.031264828125074],\n        [56.645668790714296, 33.009120609139984],\n        [50.194189402484938, 46.941098052316647],\n        [47.456988308925929, 51.770997981023982],\n        [50.07251572822895, 55.035267306968535],\n        [57.101339593814998, 56.145435575714828],\n        [64.081000008569561, 54.759369555253215],\n        [66.565969098022094, 51.394645712515057],\n        [63.640714233003223, 46.676268118194287],\n        [56.826129496946521, 42.171866411747999],\n        [52.142251303692888, 53.25579760946124],\n        [61.942803190976235, 53.062775282622852],\n        [45.090870407180603, 66.45744111296608],\n        [49.30691311256561, 63.535961653371373],\n        [54.022310354591866, 62.360055474188812],\n        [57.235786373192525, 62.971861611246879],\n        [60.422680620195308, 62.233999883085119],\n        [65.180722218119797, 63.223326242164035],\n        [69.508528157121361, 65.976534203943174],\n        [66.692952911540658, 69.861040892668086],\n        [62.796902525468738, 72.430437387210816],\n        [57.438793685614598, 73.279393032509802],\n        [52.051412524023078, 72.642070314310331],\n        [48.057213957229465, 70.228072641153915],\n        [51.312826281003822, 68.334857344858165],\n        [57.355342381712035, 69.042220849614353],\n        [63.365320267430491, 68.097482913273097],\n        [63.302666508653772, 65.1057867536814],\n        [57.283082963456252, 65.373307571221233],\n        [51.257633954541575, 65.343014232008443],\n        [56.997384601005933, 50.86720524009678],\n        [38.345016967805378, 33.379866011204456],\n        [45.43217757469057, 33.213084051757619],\n        [45.102977179460538, 36.387811845290685],\n        [38.616928471611573, 36.562115185290565],\n        [74.946726694421386, 32.658993629837994],\n        [67.858495092410578, 32.771396681549788],\n        [68.312444531975871, 35.930700302534717],\n        [74.800326543573135, 35.849481471486683]\n      ]\n    },\n    \"hints\": {\n      \"rightEye\": [71.382163563407005, 34.031264828125074],\n      \"leftEye\": [41.960848751111143, 34.61071899652552],\n      \"nose\": [56.997384601005933, 50.86720524009678]\n    }\n  };\n\n  // CommonJS and Node.js module support\n  {\n    // Support Node.js specific `module.exports` (which can be a function)\n    if ('object' !== 'undefined' && module.exports) {\n      exports = module.exports = pModel;\n    }\n    // But always support CommonJS module 1.1.1 spec (`exports` cannot be a function)\n    exports.pModel = pModel;\n  }\n})(commonjsGlobal);\n});\n\n// webgl setup tests\n\n/*\n * Test whether we can render to floating point texture\n */\nvar canRenderToFloatTexture = function(webGLContext) {\n    var renderingSupported = false;\n    var gl = webGLContext;\n\n    // setup the texture\n    var texture = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 2, 2, 0, gl.RGBA, gl.FLOAT, null);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n\n    // setup the framebuffer\n    var framebuffer = gl.createFramebuffer();\n    gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n    gl.framebufferTexture2D(\n        gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n\n    // check the framebuffer\n    var check = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n    if (check == gl.FRAMEBUFFER_COMPLETE) {\n        renderingSupported = true;\n    }\n\n    // cleanup\n    gl.deleteTexture(texture);\n    gl.deleteFramebuffer(framebuffer);\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n    return renderingSupported\n};\n\nvar version = \"1.1.2\";\n\n/**\n * clmtrackr library (https://www.github.com/auduno/clmtrackr/)\n *\n * Copyright (c) 2013, Audun Mathias Øygard\n *\n * Permission 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 *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n//import { drawPatches } from './utils.debugging.js';\n\nvar DEFAULT_MODEL = model_pca_20_svm;\n\n// polyfills\nindex.polyfill();\nif (!window.Promise) window.Promise = promise;\n\nvar clm = {\n\ttracker : function(params) {\n\n\t\tif (!params) params = {};\n\t\tif (params.constantVelocity === undefined) params.constantVelocity = true;\n\t\tif (params.searchWindow === undefined) params.searchWindow = 11;\n\t\tif (params.useWebGL === undefined) params.useWebGL = true;\n\t\tif (params.scoreThreshold === undefined) params.scoreThreshold = 0.5;\n\t\tif (params.stopOnConvergence === undefined) params.stopOnConvergence = false;\n\t\tif (params.weightPoints === undefined) params.weightPoints = undefined;\n\t\tif (params.sharpenResponse === undefined) params.sharpenResponse = false;\n\t\tif (params.faceDetection === undefined) params.faceDetection = {};\n\n\t\t/** @type {Number} Minimum convergence before firing `clmtrackrConverged` event. */\n\t\tvar convergenceThreshold = 0.5;\n\n\t\tvar numPatches, patchSize, numParameters, patchType;\n\t\tvar gaussianPD;\n\t\tvar eigenVectors, eigenValues;\n\t\tvar sketchCC, sketchW, sketchH, sketchCanvas;\n\t\tvar weights, model, biases;\n\n\t\tvar sobelInit = false;\n\t\tvar lbpInit = false;\n\n\t\tvar currentParameters = [];\n\t\tvar currentPositions = [];\n\t\tvar previousParameters = [];\n\t\tvar previousPositions = [];\n\n\t\tvar patches = [];\n\t\tvar responses = [];\n\t\tvar meanShape = [];\n\n\t\tvar responseMode = 'single';\n\t\tvar responseList = ['raw'];\n\t\tvar responseIndex = 0;\n\n\t\t/*\n\t\tIt's possible to experiment with the sequence of variances used for the finding the maximum in the KDE.\n\t\tThis sequence is pretty arbitrary, but was found to be okay using some manual testing.\n\t\t*/\n\t\tvar varianceSeq = [10,5,1];\n\t\t//var varianceSeq = [3,1.5,0.75];\n\t\t//var varianceSeq = [6,3,0.75];\n\t\tvar PDMVariance = 0.7;\n\n\t\tvar relaxation = 0.1;\n\n\t\tvar first = true;\n\t\tvar detectingFace = false;\n\n\t\tvar convergenceLimit = 0.01;\n\n\t\tvar searchWindow;\n\t\tvar modelWidth, modelHeight;\n\t\tvar halfSearchWindow, vecProbs, responsePixels;\n\n\t\tif(typeof Float64Array !== 'undefined') {\n\t\t\tvar updatePosition = new Float64Array(2);\n\t\t\tvar vecpos = new Float64Array(2);\n\t\t} else {\n\t\t\tvar updatePosition = new Array(2);\n\t\t\tvar vecpos = new Array(2);\n\t\t}\n\t\tvar pw, pl, pdataLength;\n\n\t\tvar facecheck_count = 0;\n\n\t\tvar webglFi, svmFi, mosseCalc;\n\n\t\tvar scoringCanvas = document.createElement('canvas');\n\t\tvar scoringContext = scoringCanvas.getContext('2d');\n\t\tvar msxmin, msymin, msxmax, msymax;\n\t\tvar msmodelwidth, msmodelheight;\n\t\tvar scoringWeights, scoringBias;\n\t\tvar scoringHistory = [];\n\t\tvar meanscore = 0;\n\n\t\tvar runnerTimeout, runnerElement, runnerBox;\n\n\t\tvar pointWeights;\n\n\t\tvar halfPI = Math.PI/2;\n\n\t\tvar faceDetector;\n\n\t\t/*\n\t\t *\tload model data, initialize filters, etc.\n\t\t *\n\t\t *\t@param\t<Object>\tpdm model object\n\t\t */\n\t\tthis.init = function(pdmmodel) {\n\t\t\t// default model is pca 20 svm model\n\t\t\tif (pdmmodel === undefined) pdmmodel = DEFAULT_MODEL;\n\n\t\t\tmodel = pdmmodel;\n\n\t\t\t// load from model\n\t\t\tpatchType = model.patchModel.patchType;\n\t\t\tnumPatches = model.patchModel.numPatches;\n\t\t\tpatchSize = model.patchModel.patchSize[0];\n\t\t\tif (patchType == 'MOSSE') {\n\t\t\t\tsearchWindow = patchSize;\n\t\t\t} else {\n\t\t\t\tsearchWindow = params.searchWindow;\n\t\t\t}\n\t\t\tnumParameters = model.shapeModel.numEvalues;\n\t\t\tmodelWidth = model.patchModel.canvasSize[0];\n\t\t\tmodelHeight = model.patchModel.canvasSize[1];\n\n\t\t\t// set up canvas to work on\n\t\t\tsketchCanvas = document.createElement('canvas');\n\t\t\tsketchCC = sketchCanvas.getContext('2d');\n\n\t\t\tsketchW = sketchCanvas.width = modelWidth + (searchWindow-1) + patchSize-1;\n\t\t\tsketchH = sketchCanvas.height = modelHeight + (searchWindow-1) + patchSize-1;\n\n\t\t\t// load eigenvectors\n\t\t\teigenVectors = numeric1_2_6.rep([numPatches*2,numParameters],0.0);\n\t\t\tfor (var i = 0;i < numPatches*2;i++) {\n\t\t\t\tfor (var j = 0;j < numParameters;j++) {\n\t\t\t\t\teigenVectors[i][j] = model.shapeModel.eigenVectors[i][j];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// load mean shape\n\t\t\tfor (var i = 0; i < numPatches;i++) {\n\t\t\t\tmeanShape[i] = [model.shapeModel.meanShape[i][0], model.shapeModel.meanShape[i][1]];\n\t\t\t}\n\n\t\t\t// get max and mins, width and height of meanshape\n\t\t\tmsxmax = msymax = 0;\n\t\t\tmsxmin = msymin = 1000000;\n\t\t\tfor (var i = 0;i < numPatches;i++) {\n\t\t\t\tif (meanShape[i][0] < msxmin) msxmin = meanShape[i][0];\n\t\t\t\tif (meanShape[i][1] < msymin) msymin = meanShape[i][1];\n\t\t\t\tif (meanShape[i][0] > msxmax) msxmax = meanShape[i][0];\n\t\t\t\tif (meanShape[i][1] > msymax) msymax = meanShape[i][1];\n\t\t\t}\n\t\t\tmsmodelwidth = msxmax-msxmin;\n\t\t\tmsmodelheight = msymax-msymin;\n\n\t\t\t// get scoringweights if they exist\n\t\t\tif (model.scoring) {\n\t\t\t\tscoringWeights = new Float64Array(model.scoring.coef);\n\t\t\t\tscoringBias = model.scoring.bias;\n\t\t\t\tscoringCanvas.width = model.scoring.size[0];\n\t\t\t\tscoringCanvas.height = model.scoring.size[1];\n\t\t\t}\n\n\t\t\t// load eigenvalues\n\t\t\teigenValues = model.shapeModel.eigenValues;\n\n\t\t\tweights = model.patchModel.weights;\n\t\t\tbiases = model.patchModel.bias;\n\n\t\t\t// precalculate gaussianPriorDiagonal\n\t\t\tgaussianPD = numeric1_2_6.rep([numParameters+4, numParameters+4],0);\n\t\t\t// set values and append manual inverse\n\t\t\tfor (var i = 0;i < numParameters;i++) {\n\t\t\t\tif (model.shapeModel.nonRegularizedVectors.indexOf(i) >= 0) {\n\t\t\t\t\tgaussianPD[i+4][i+4] = 1/10000000;\n\t\t\t\t} else {\n\t\t\t\t\tgaussianPD[i+4][i+4] = 1/eigenValues[i];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (var i = 0;i < numParameters+4;i++) {\n\t\t\t\tcurrentParameters[i] = 0;\n\t\t\t}\n\n\t\t\tif (patchType == 'SVM') {\n\t\t\t\tvar webGLContext;\n\t\t\t\tvar webGLTestCanvas = document.createElement('canvas');\n\t\t\t\tif (window.WebGLRenderingContext) {\n\t\t\t\t\twebGLContext = webGLTestCanvas.getContext('webgl') || webGLTestCanvas.getContext('experimental-webgl');\n\t\t\t\t\tif (!webGLContext || !webGLContext.getExtension('OES_texture_float')) {\n\t\t\t\t\t\twebGLContext = null;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// test whether it's possible to render to float texture\n\t\t\t\t\t\tif (!canRenderToFloatTexture(webGLContext)) {\n\t\t\t\t\t\t\twebGLContext = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (webGLContext && params.useWebGL && (typeof(webglFilter) !== 'undefined')) {\n\t\t\t\t\twebglFi = new webglFilter();\n\t\t\t\t\ttry {\n\t\t\t\t\t\twebglFi.init(weights, biases, numPatches, searchWindow+patchSize-1, searchWindow+patchSize-1, patchSize, patchSize);\n\t\t\t\t\t\tif ('lbp' in weights) lbpInit = true;\n\t\t\t\t\t\tif ('sobel' in weights) sobelInit = true;\n\t\t\t\t\t}\n\t\t\t\t\tcatch(err) {\n\t\t\t\t\t\tconsole.error(err);\n\t\t\t\t\t\talert('There was a problem setting up webGL programs, falling back to slightly slower javascript version. :(');\n\t\t\t\t\t\twebglFi = undefined;\n\t\t\t\t\t\tsvmFi = new svmFilter();\n\t\t\t\t\t\tsvmFi.init(weights['raw'], biases['raw'], numPatches, patchSize, searchWindow);\n\t\t\t\t\t}\n\t\t\t\t} else if (typeof(svmFilter) !== 'undefined') {\n\t\t\t\t\t// use fft convolution if no webGL is available\n\t\t\t\t\tsvmFi = new svmFilter();\n\t\t\t\t\tsvmFi.init(weights['raw'], biases['raw'], numPatches, patchSize, searchWindow);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('Could not initiate filters, please make sure that svmfilter.js or svmfilter_conv_js.js is loaded.');\n\t\t\t\t}\n\t\t\t} else if (patchType == 'MOSSE') {\n\t\t\t\tmosseCalc = new mosseFilterResponses();\n\t\t\t\tmosseCalc.init(weights, numPatches, patchSize, patchSize);\n\t\t\t}\n\n\t\t\tif (patchType == 'SVM') {\n\t\t\t\tpw = pl = patchSize+searchWindow-1;\n\t\t\t} else {\n\t\t\t\tpw = pl = searchWindow;\n\t\t\t}\n\t\t\tpdataLength = pw*pl;\n\t\t\thalfSearchWindow = (searchWindow-1)/2;\n\t\t\tresponsePixels = searchWindow*searchWindow;\n\t\t\tif(typeof Float64Array !== 'undefined') {\n\t\t\t\tvecProbs = new Float64Array(responsePixels);\n\t\t\t\tfor (var i = 0;i < numPatches;i++) {\n\t\t\t\t\tpatches[i] = new Float64Array(pdataLength);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvecProbs = new Array(responsePixels);\n\t\t\t\tfor (var i = 0;i < numPatches;i++) {\n\t\t\t\t\tpatches[i] = new Array(pdataLength);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (params.weightPoints) {\n\t\t\t\t// weighting of points\n\t\t\t\tpointWeights = [];\n\t\t\t\tfor (var i = 0;i < numPatches;i++) {\n\t\t\t\t\tif (i in params.weightPoints) {\n\t\t\t\t\t\tpointWeights[(i*2)] = params.weightPoints[i];\n\t\t\t\t\t\tpointWeights[(i*2)+1] = params.weightPoints[i];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpointWeights[(i*2)] = 1;\n\t\t\t\t\t\tpointWeights[(i*2)+1] = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpointWeights = numeric1_2_6.diag(pointWeights);\n\t\t\t}\n\n\t\t\tfaceDetector = new faceDetection(model, params.faceDetection);\n\t\t};\n\n        // PATCHED IN to support external control of the interval\n\t\t/*\n\t\t *\tinitializes the tracker for use without start(), using an external interval or no regular interval\n\t\t */\n\t\tthis.initFaceDetector = function(element, box) {\n\t\t\t// check if model is initalized, else return false\n\t\t\tif (typeof(model) === 'undefined') {\n\t\t\t\tconsole.log('tracker needs to be initalized before initFaceDetector() or start().');\n\t\t\t\treturn false;\n            }\n            \n\t\t\tfaceDetector.init(element);\n\t\t};\n\n\t\t/*\n\t\t *\tstarts the tracker to run on a regular interval\n\t\t */\n\t\tthis.start = function(element, box) {\n\t\t\t// check if model is initalized, else return false\n\t\t\tif (typeof(model) === 'undefined') {\n\t\t\t\tconsole.log('tracker needs to be initalized before starting to track.');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t//check if a runnerelement already exists, if not, use passed parameters\n\t\t\tif (typeof(runnerElement) === 'undefined') {\n\t\t\t\trunnerElement = element;\n\t\t\t\trunnerBox = box;\n\t\t\t}\n\n\t\t\tfaceDetector.init(element);\n\n\t\t\t// start named timeout function\n\t\t\trunnerTimeout = requestAnimationFrame(runnerFunction);\n\t\t};\n\n\t\tvar runnerFunction = function() {\n\t\t\trunnerTimeout = requestAnimationFrame(runnerFunction);\n\t\t\t// schedule as many iterations as we can during each request\n\t\t\tvar startTime = (new Date()).getTime();\n\t\t\twhile (((new Date()).getTime() - startTime) < 16) {\n\t\t\t\tvar tracking = this.track(runnerElement, runnerBox);\n\t\t\t\tif (!tracking) break;\n\t\t\t}\n\t\t}.bind(this);\n\n\t\t/*\n\t\t *\tstop the running tracker\n\t\t */\n\t\tthis.stop = function() {\n\t\t\t// stop the running tracker if any exists\n\t\t\tcancelAnimationFrame(runnerTimeout);\n\t\t};\n\n\t\t/*\n\t\t *  element : canvas or video element\n\t\t *  TODO: should be able to take img element as well\n\t\t */\n\t\tthis.track = function(element, box) {\n\t\t\temitEvent('clmtrackrBeforeTrack');\n\n\t\t\tvar scaling, translateX, translateY, rotation;\n\t\t\tvar ptch, px, py;\n\n\t\t\tif (first) {\n\t\t\t\tif (!detectingFace) {\n\t\t\t\t\tdetectingFace = true;\n\n\t\t\t\t\t// this returns a Promise\n\t\t\t\t\tfaceDetector.getInitialPosition(box)\n\t\t\t\t\t\t.then(function (result) {\n\t\t\t\t\t\t\tscaling = result[0];\n\t\t\t\t\t\t\trotation = result[1];\n\t\t\t\t\t\t\ttranslateX = result[2];\n\t\t\t\t\t\t\ttranslateY = result[3];\n\n\t\t\t\t\t\t\tcurrentParameters[0] = (scaling*Math.cos(rotation))-1;\n\t\t\t\t\t\t\tcurrentParameters[1] = (scaling*Math.sin(rotation));\n\t\t\t\t\t\t\tcurrentParameters[2] = translateX;\n\t\t\t\t\t\t\tcurrentParameters[3] = translateY;\n\n\t\t\t\t\t\t\tcurrentPositions = calculatePositions(currentParameters, true);\n\n\t\t\t\t\t\t\tfirst = false;\n\t\t\t\t\t\t\tdetectingFace = false;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(function (error) {\n                            // PATCHED IN improved error handling\n                            if (!error.code === \"NO_FACE_FOUND\") {\n\t\t\t\t\t\t\t    detectingFace = false;\n                                throw error;\n                            }\n\t\t\t\t\t\t\t// send an event on no face found\n\t\t\t\t\t\t\temitEvent('clmtrackrNotFound');\n\n\t\t\t\t\t\t\tdetectingFace = false;\n\t\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t} else {\n\t\t\t\tfacecheck_count += 1;\n\n\t\t\t\tif (params.constantVelocity) {\n\t\t\t\t\t// calculate where to get patches via constant velocity prediction\n\t\t\t\t\tif (previousParameters.length >= 2) {\n\t\t\t\t\t\tfor (var i = 0;i < currentParameters.length;i++) {\n\t\t\t\t\t\t\tcurrentParameters[i] = (relaxation)*previousParameters[1][i] + (1-relaxation)*((2*previousParameters[1][i]) - previousParameters[0][i]);\n\t\t\t\t\t\t\t//currentParameters[i] = (3*previousParameters[2][i]) - (3*previousParameters[1][i]) + previousParameters[0][i];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// change translation, rotation and scale parameters\n\t\t\t\trotation = halfPI - Math.atan((currentParameters[0]+1)/currentParameters[1]);\n\t\t\t\tif (rotation > halfPI) {\n\t\t\t\t\trotation -= Math.PI;\n\t\t\t\t}\n\t\t\t\tscaling = currentParameters[1] / Math.sin(rotation);\n\t\t\t\ttranslateX = currentParameters[2];\n\t\t\t\ttranslateY = currentParameters[3];\n\t\t\t}\n\n\t\t\t// copy canvas to a new dirty canvas\n\t\t\tsketchCC.save();\n\n\t\t\t// clear canvas\n\t\t\tsketchCC.clearRect(0, 0, sketchW, sketchH);\n\n\t\t\tsketchCC.scale(1/scaling, 1/scaling);\n\t\t\tsketchCC.rotate(-rotation);\n\t\t\tsketchCC.translate(-translateX, -translateY);\n\n\t\t\tsketchCC.drawImage(element, 0, 0, element.width, element.height);\n\n\t\t\tsketchCC.restore();\n\t\t\t//\tget cropped images around new points based on model parameters (not scaled and translated)\n\t\t\tvar patchPositions = calculatePositions(currentParameters, false);\n\n\t\t\t// check whether tracking is ok\n\t\t\tif (scoringWeights && (facecheck_count % 10 == 0)) {\n\t\t\t\tif (!checkTracking()) {\n\t\t\t\t\t// reset all parameters\n\t\t\t\t\tresetParameters();\n\n\t\t\t\t\t// send event to signal that tracking was lost\n\t\t\t\t\temitEvent('clmtrackrLost');\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tvar pdata, pmatrix, grayscaleColor;\n\t\t\tfor (var i = 0; i < numPatches; i++) {\n\t\t\t\tpx = patchPositions[i][0]-(pw/2);\n\t\t\t\tpy = patchPositions[i][1]-(pl/2);\n\t\t\t\tptch = sketchCC.getImageData(Math.round(px), Math.round(py), pw, pl);\n\t\t\t\tpdata = ptch.data;\n\n\t\t\t\t// convert to grayscale\n\t\t\t\tpmatrix = patches[i];\n\t\t\t\tfor (var j = 0;j < pdataLength;j++) {\n\t\t\t\t\tgrayscaleColor = pdata[j*4]*0.3 + pdata[(j*4)+1]*0.59 + pdata[(j*4)+2]*0.11;\n\t\t\t\t\tpmatrix[j] = grayscaleColor;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// draw weights for debugging\n\t\t\t//drawPatches(sketchCC, weights, patchSize, patchPositions, function(x) {return x*2000+127});\n\n\t\t\t// draw patches for debugging\n\t\t\t//drawPatches(sketchCC, patches, pw, patchPositions, false, [27,32,44,50]);\n\n\t\t\tif (patchType == 'SVM') {\n\t\t\t\tif (typeof(webglFi) !== 'undefined') {\n\t\t\t\t\tresponses = getWebGLResponses(patches);\n\t\t\t\t} else if (typeof(svmFi) !== 'undefined') {\n\t\t\t\t\tresponses = svmFi.getResponses(patches);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('SVM-filters do not seem to be initiated properly.');\n\t\t\t\t}\n\t\t\t} else if (patchType == 'MOSSE') {\n\t\t\t\tresponses = mosseCalc.getResponses(patches);\n\t\t\t}\n\n\t\t\t// option to increase sharpness of responses\n\t\t\tif (params.sharpenResponse) {\n\t\t\t\tfor (var i = 0;i < numPatches;i++) {\n\t\t\t\t\tfor (var j = 0;j < responses[i].length;j++) {\n\t\t\t\t\t\tresponses[i][j] = Math.pow(responses[i][j], params.sharpenResponse);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// draw responses for debugging\n\t\t\t//drawPatches(sketchCC, responses, searchWindow, patchPositions, function(x) {return x*255});\n\n\t\t\t// iterate until convergence or max 10, 20 iterations?:\n\t\t\tvar originalPositions = currentPositions;\n\t\t\tvar jac;\n\t\t\tvar meanshiftVectors = [];\n\n\t\t\tfor (var i = 0; i < varianceSeq.length; i++) {\n\n\t\t\t\t// calculate jacobian\n\t\t\t\tjac = createJacobian(currentParameters, eigenVectors);\n\n\t\t\t\t// for debugging\n\t\t\t\t//var debugMVs = [];\n\n\t\t\t\tvar opj0, opj1;\n\n\t\t\t\tfor (var j = 0;j < numPatches;j++) {\n\t\t\t\t\topj0 = originalPositions[j][0]-((searchWindow-1)*scaling/2);\n\t\t\t\t\topj1 = originalPositions[j][1]-((searchWindow-1)*scaling/2);\n\n\t\t\t\t\t// calculate PI x gaussians\n\t\t\t\t\tvar vpsum = gpopt(searchWindow, currentPositions[j], updatePosition, vecProbs, responses, opj0, opj1, j, varianceSeq[i], scaling);\n\n\t\t\t\t\t// calculate meanshift-vector\n\t\t\t\t\tgpopt2(searchWindow, vecpos, updatePosition, vecProbs, vpsum, opj0, opj1, scaling);\n\t\t\t\t\t//var debugMatrixMV = gpopt2(searchWindow, vecpos, updatePosition, vecProbs, vpsum, opj0, opj1);\n\n\t\t\t\t\tmeanshiftVectors[j] = [vecpos[0] - currentPositions[j][0], vecpos[1] - currentPositions[j][1]];\n\n\t\t\t\t\t//debugMVs[j] = debugMatrixMV;\n\t\t\t\t}\n\n\t\t\t\t// draw meanshiftVector for debugging\n\t\t\t\t//drawPatches(sketchCC, debugMVs, searchWindow, patchPositions, function(x) {return x*255*500});\n\n\t\t\t\tvar meanShiftVector = numeric1_2_6.rep([numPatches*2, 1],0.0);\n\t\t\t\tfor (var k = 0;k < numPatches;k++) {\n\t\t\t\t\tmeanShiftVector[k*2][0] = meanshiftVectors[k][0];\n\t\t\t\t\tmeanShiftVector[(k*2)+1][0] = meanshiftVectors[k][1];\n\t\t\t\t}\n\n\t\t\t\t// compute pdm parameter update\n\t\t\t\t//var prior = numeric.mul(gaussianPD, PDMVariance);\n\t\t\t\tvar prior = numeric1_2_6.mul(gaussianPD, varianceSeq[i]);\n\t\t\t\tvar jtj;\n\t\t\t\tif (params.weightPoints) {\n\t\t\t\t\tjtj = numeric1_2_6.dot(numeric1_2_6.transpose(jac), numeric1_2_6.dot(pointWeights, jac));\n\t\t\t\t} else {\n\t\t\t\t\tjtj = numeric1_2_6.dot(numeric1_2_6.transpose(jac), jac);\n\t\t\t\t}\n\t\t\t\tvar cpMatrix = numeric1_2_6.rep([numParameters+4, 1],0.0);\n\t\t\t\tfor (var l = 0;l < (numParameters+4);l++) {\n\t\t\t\t\tcpMatrix[l][0] = currentParameters[l];\n\t\t\t\t}\n\t\t\t\tvar priorP = numeric1_2_6.dot(prior, cpMatrix);\n\t\t\t\tvar jtv;\n\t\t\t\tif (params.weightPoints) {\n\t\t\t\t\tjtv = numeric1_2_6.dot(numeric1_2_6.transpose(jac), numeric1_2_6.dot(pointWeights, meanShiftVector));\n\t\t\t\t} else {\n\t\t\t\t\tjtv = numeric1_2_6.dot(numeric1_2_6.transpose(jac), meanShiftVector);\n\t\t\t\t}\n\t\t\t\tvar paramUpdateLeft = numeric1_2_6.add(prior, jtj);\n\t\t\t\tvar paramUpdateRight = numeric1_2_6.sub(priorP, jtv);\n\n\t\t\t\tvar paramUpdate = numeric1_2_6.dot(numeric1_2_6.inv(paramUpdateLeft), paramUpdateRight);\n\t\t\t\t//var paramUpdate = numeric.solve(paramUpdateLeft, paramUpdateRight, true);\n\n\t\t\t\tvar oldPositions = currentPositions;\n\n\t\t\t\t// update estimated parameters\n\t\t\t\tfor (var k = 0;k < numParameters+4;k++) {\n\t\t\t\t\tcurrentParameters[k] -= paramUpdate[k];\n\t\t\t\t}\n\n\t\t\t\t// clipping of parameters if they're too high\n\t\t\t\tvar clip;\n\t\t\t\tfor (var k = 0;k < numParameters;k++) {\n\t\t\t\t\tclip = Math.abs(3*Math.sqrt(eigenValues[k]));\n\t\t\t\t\tif (Math.abs(currentParameters[k+4]) > clip) {\n\t\t\t\t\t\tif (currentParameters[k+4] > 0) {\n\t\t\t\t\t\t\tcurrentParameters[k+4] = clip;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcurrentParameters[k+4] = -clip;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// update current coordinates\n\t\t\t\tcurrentPositions = calculatePositions(currentParameters, true);\n\n\t\t\t\t// check if converged\n\t\t\t\t// calculate norm of parameterdifference\n\t\t\t\tvar positionNorm = 0;\n\t\t\t\tvar pnsq_x, pnsq_y;\n\t\t\t\tfor (var k = 0;k < currentPositions.length;k++) {\n\t\t\t\t\tpnsq_x = (currentPositions[k][0]-oldPositions[k][0]);\n\t\t\t\t\tpnsq_y = (currentPositions[k][1]-oldPositions[k][1]);\n\t\t\t\t\tpositionNorm += ((pnsq_x*pnsq_x) + (pnsq_y*pnsq_y));\n\t\t\t\t}\n\n\t\t\t\t// if norm < limit, then break\n\t\t\t\tif (positionNorm < convergenceLimit) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif (params.constantVelocity) {\n\t\t\t\t// add current parameter to array of previous parameters\n\t\t\t\tpreviousParameters.push(currentParameters.slice());\n\t\t\t\tif (previousParameters.length == 3) {\n\t\t\t\t\tpreviousParameters.shift();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// store positions, for checking convergence\n\t\t\tif (previousPositions.length == 10) {\n\t\t\t\tpreviousPositions.shift();\n\t\t\t}\n\t\t\tpreviousPositions.push(currentPositions.slice(0));\n\n\t\t\t// send an event on each iteration\n\t\t\temitEvent('clmtrackrIteration');\n\n\t\t\t// we must get a score before we can say we've converged\n\t\t\tif (scoringHistory.length >= 5 && this.getConvergence() < convergenceThreshold) {\n\t\t\t\tif (params.stopOnConvergence) {\n\t\t\t\t\tthis.stop();\n\t\t\t\t}\n\n\t\t\t\temitEvent('clmtrackrConverged');\n\t\t\t}\n\n\t\t\t// return new points\n\t\t\treturn currentPositions;\n\t\t};\n\n\t\tfunction resetParameters() {\n\t\t\tfirst = true;\n\t\t\tscoringHistory = [];\n\t\t\tpreviousParameters = [];\n\t\t\tcurrentPositions = [];\n\t\t\tpreviousPositions = [];\n\t\t\tfor (var i = 0;i < currentParameters.length;i++) {\n\t\t\t\tcurrentParameters[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t *\treset tracking, so that track() will start a new detection\n\t\t */\n\t\tthis.reset = function() {\n\t\t\tresetParameters();\n\t\t\trunnerElement = undefined;\n\t\t\trunnerBox = undefined;\n\t\t};\n\n\t\t/*\n\t\t *\tdraw model on given canvas\n\t\t */\n\t\tthis.draw = function(canvas, pv, path, customColor) {\n\t\t\t// if no previous points, just draw in the middle of canvas\n\n\t\t\tvar params;\n\t\t\tif (pv === undefined) {\n\t\t\t\tparams = currentParameters.slice(0);\n\t\t\t} else {\n\t\t\t\tparams = pv.slice(0);\n\t\t\t}\n\n            var cc = canvas.getContext('2d');\n            // customColor parameter is PATCHED IN\n            if (!customColor) {\n                cc.fillStyle = 'rgb(200,200,200)';\n                cc.strokeStyle = this.getScore() < 0.5 ? 'rgb(255,255,0)' : 'rgb(130,255,50)';\n                //cc.lineWidth = 1;\n            }\n\n\t\t\tvar paths;\n\t\t\tif (path === undefined) {\n\t\t\t\tpaths = model.path.normal;\n\t\t\t} else {\n\t\t\t\tpaths = model.path[path];\n\t\t\t}\n\n\t\t\tfor (var i = 0;i < paths.length;i++) {\n\t\t\t\tif (typeof(paths[i]) == 'number') {\n\t\t\t\t\tdrawPoint(cc, paths[i], params);\n\t\t\t\t} else {\n\t\t\t\t\tdrawPath(cc, paths[i], params);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t/*\n\t\t * \tget the score of the current model fit\n\t\t *\t(based on svm of face according to current model)\n\t\t */\n\t\tthis.getScore = function() {\n\t\t\treturn meanscore;\n\t\t};\n\n\t\t/*\n\t\t *\tcalculate positions based on parameters\n\t\t */\n\t\tthis.calculatePositions = function(parameters) {\n\t\t\treturn calculatePositions(parameters, true);\n\t\t};\n\n\t\t/*\n\t\t *\tget coordinates of current model fit\n\t\t */\n\t\tthis.getCurrentPosition = function() {\n\t\t\tif (first) {\n\t\t\t\treturn false;\n\t\t\t} else {\n\t\t\t\treturn currentPositions;\n\t\t\t}\n\t\t};\n\n\t\t/*\n\t\t *\tget parameters of current model fit\n\t\t */\n\t\tthis.getCurrentParameters = function() {\n\t\t\treturn currentParameters;\n\t\t};\n\n\t\t/*\n\t\t *\tGet the average of recent model movements\n\t\t *\tUsed for checking whether model fit has converged\n\t\t */\n\t\tthis.getConvergence = function() {\n\t\t\tif (previousPositions.length < 10) return 999999;\n\n\t\t\tvar prevX = 0.0;\n\t\t\tvar prevY = 0.0;\n\t\t\tvar currX = 0.0;\n\t\t\tvar currY = 0.0;\n\n\t\t\t// average 5 previous positions\n\t\t\tfor (var i = 0;i < 5;i++) {\n\t\t\t\tfor (var j = 0;j < numPatches;j++) {\n\t\t\t\t\tprevX += previousPositions[i][j][0];\n\t\t\t\t\tprevY += previousPositions[i][j][1];\n\t\t\t\t}\n\t\t\t}\n\t\t\tprevX /= 5;\n\t\t\tprevY /= 5;\n\n\t\t\t// average 5 positions before that\n\t\t\tfor (var i = 5;i < 10;i++) {\n\t\t\t\tfor (var j = 0;j < numPatches;j++) {\n\t\t\t\t\tcurrX += previousPositions[i][j][0];\n\t\t\t\t\tcurrY += previousPositions[i][j][1];\n\t\t\t\t}\n\t\t\t}\n\t\t\tcurrX /= 5;\n\t\t\tcurrY /= 5;\n\n\t\t\t// calculate difference\n\t\t\tvar diffX = currX-prevX;\n\t\t\tvar diffY = currY-prevY;\n\t\t\tvar msavg = ((diffX*diffX) + (diffY*diffY));\n\t\t\tmsavg /= previousPositions.length;\n\t\t\treturn msavg;\n\t\t};\n\n\t\t/*\n\t\t * Set response mode (only useful if webGL is available)\n\t\t * mode : either \"single\", \"blend\" or \"cycle\"\n\t\t * list : array of values \"raw\", \"sobel\", \"lbp\"\n\t\t */\n\t\tthis.setResponseMode = function(mode, list) {\n\t\t\t// clmtrackr must be initialized with model first\n\t\t\tif (typeof(model) === 'undefined') {\n\t\t\t\tconsole.log('Clmtrackr has not been initialized with a model yet. No changes made.');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// must check whether webGL or not\n\t\t\tif (typeof(webglFi) === 'undefined') {\n\t\t\t\tconsole.log('Responsemodes are only allowed when using webGL. In pure JS, only \"raw\" mode is available.');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (['single', 'blend', 'cycle'].indexOf(mode) < 0) {\n\t\t\t\tconsole.log('Tried to set an unknown responsemode : \"'+mode+'\". No changes made.');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!(list instanceof Array)) {\n\t\t\t\tconsole.log('List in setResponseMode must be an array of strings! No changes made.');\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tfor (var i = 0;i < list.length;i++) {\n\t\t\t\t\tif (['raw', 'sobel', 'lbp'].indexOf(list[i]) < 0) {\n\t\t\t\t\t\tconsole.log('Unknown element in responsemode list : \"'+list[i]+'\". No changes made.');\n\t\t\t\t\t}\n\t\t\t\t\t// check whether filters are initialized\n\t\t\t\t\tif (list[i] == 'sobel' && sobelInit == false) {\n\t\t\t\t\t\tconsole.log('The sobel filters have not been initialized! No changes made.');\n\t\t\t\t\t}\n\t\t\t\t\tif (list[i] == 'lbp' && lbpInit == false) {\n\t\t\t\t\t\tconsole.log('The LBP filters have not been initialized! No changes made.');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// reset index\n\t\t\tresponseIndex = 0;\n\t\t\tresponseMode = mode;\n\t\t\tresponseList = list;\n\t\t};\n\n\n\t\tvar getWebGLResponsesType = function(type, patches) {\n\t\t\tif (type == 'lbp') {\n\t\t\t\treturn webglFi.getLBPResponses(patches);\n\t\t\t} else if (type == 'raw') {\n\t\t\t\treturn webglFi.getRawResponses(patches);\n\t\t\t} else if (type == 'sobel') {\n\t\t\t\treturn webglFi.getSobelResponses(patches);\n\t\t\t}\n\t\t};\n\n\t\tvar getWebGLResponses = function(patches) {\n\t\t\tif (responseMode == 'single') {\n\t\t\t\treturn getWebGLResponsesType(responseList[0], patches);\n\t\t\t} else if (responseMode == 'cycle') {\n\t\t\t\tvar response = getWebGLResponsesType(responseList[responseIndex], patches);\n\t\t\t\tresponseIndex++;\n\t\t\t\tif (responseIndex >= responseList.length) responseIndex = 0;\n\t\t\t\treturn response;\n\t\t\t} else {\n\t\t\t\t// blend\n\t\t\t\tvar responses = [];\n\t\t\t\tfor (var i = 0;i < responseList.length;i++) {\n\t\t\t\t\tresponses[i] = getWebGLResponsesType(responseList[i], patches);\n\t\t\t\t}\n\t\t\t\tvar blendedResponses = [];\n\t\t\t\tvar searchWindowSize = searchWindow * searchWindow;\n\t\t\t\tfor (var i = 0;i < numPatches;i++) {\n\t\t\t\t\tvar response = Array(searchWindowSize);\n\t\t\t\t\tfor (var k = 0;k < searchWindowSize;k++) response[k] = 0;\n\t\t\t\t\tfor (var j = 0;j < responseList.length;j++) {\n\t\t\t\t\t\tfor (var k = 0;k < searchWindowSize;k++) {\n\t\t\t\t\t\t\tresponse[k] += (responses[j][i][k]/responseList.length);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tblendedResponses[i] = response;\n\t\t\t\t}\n\t\t\t\treturn blendedResponses;\n\t\t\t}\n\t\t};\n\n\t\t// generates the jacobian matrix used for optimization calculations\n\t\tvar createJacobian = function(parameters, eigenVectors) {\n\n\t\t\tvar jacobian = numeric1_2_6.rep([2*numPatches, numParameters+4],0.0);\n\t\t\tvar j0,j1;\n\t\t\tfor (var i = 0;i < numPatches;i ++) {\n\t\t\t\t// 1\n\t\t\t\tj0 = meanShape[i][0];\n\t\t\t\tj1 = meanShape[i][1];\n\t\t\t\tfor (var p = 0;p < numParameters;p++) {\n\t\t\t\t\tj0 += parameters[p+4]*eigenVectors[i*2][p];\n\t\t\t\t\tj1 += parameters[p+4]*eigenVectors[(i*2)+1][p];\n\t\t\t\t}\n\t\t\t\tjacobian[i*2][0] = j0;\n\t\t\t\tjacobian[(i*2)+1][0] = j1;\n\t\t\t\t// 2\n\t\t\t\tj0 = meanShape[i][1];\n\t\t\t\tj1 = meanShape[i][0];\n\t\t\t\tfor (var p = 0;p < numParameters;p++) {\n\t\t\t\t\tj0 += parameters[p+4]*eigenVectors[(i*2)+1][p];\n\t\t\t\t\tj1 += parameters[p+4]*eigenVectors[i*2][p];\n\t\t\t\t}\n\t\t\t\tjacobian[i*2][1] = -j0;\n\t\t\t\tjacobian[(i*2)+1][1] = j1;\n\t\t\t\t// 3\n\t\t\t\tjacobian[i*2][2] = 1;\n\t\t\t\tjacobian[(i*2)+1][2] = 0;\n\t\t\t\t// 4\n\t\t\t\tjacobian[i*2][3] = 0;\n\t\t\t\tjacobian[(i*2)+1][3] = 1;\n\t\t\t\t// the rest\n\t\t\t\tfor (var j = 0;j < numParameters;j++) {\n\t\t\t\t\tj0 = parameters[0]*eigenVectors[i*2][j] - parameters[1]*eigenVectors[(i*2)+1][j] + eigenVectors[i*2][j];\n\t\t\t\t\tj1 = parameters[0]*eigenVectors[(i*2)+1][j] + parameters[1]*eigenVectors[i*2][j] + eigenVectors[(i*2)+1][j];\n\t\t\t\t\tjacobian[i*2][j+4] = j0;\n\t\t\t\t\tjacobian[(i*2)+1][j+4] = j1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn jacobian;\n\t\t};\n\n\t\t// calculate positions from parameters\n\t\tvar calculatePositions = function(parameters, useTransforms) {\n\t\t\tvar x, y, a, b;\n\t\t\tvar numParameters = parameters.length;\n\t\t\tvar positions = [];\n\t\t\tfor (var i = 0;i < numPatches;i++) {\n\t\t\t\tx = meanShape[i][0];\n\t\t\t\ty = meanShape[i][1];\n\t\t\t\tfor (var j = 0;j < numParameters-4;j++) {\n\t\t\t\t\tx += model.shapeModel.eigenVectors[(i*2)][j]*parameters[j+4];\n\t\t\t\t\ty += model.shapeModel.eigenVectors[(i*2)+1][j]*parameters[j+4];\n\t\t\t\t}\n\t\t\t\tif (useTransforms) {\n\t\t\t\t\ta = parameters[0]*x - parameters[1]*y + parameters[2];\n\t\t\t\t\tb = parameters[0]*y + parameters[1]*x + parameters[3];\n\t\t\t\t\tx += a;\n\t\t\t\t\ty += b;\n\t\t\t\t}\n\t\t\t\tpositions[i] = [x,y];\n\t\t\t}\n\n\t\t\treturn positions;\n\t\t};\n\n\t\t// part one of meanshift calculation\n\t\tvar gpopt = function(responseWidth, currentPositionsj, updatePosition, vecProbs, responses, opj0, opj1, j, variance, scaling) {\n\t\t\tvar pos_idx = 0;\n\t\t\tvar vpsum = 0;\n\t\t\tvar dx, dy;\n\t\t\tfor (var k = 0;k < responseWidth;k++) {\n\t\t\t\tupdatePosition[1] = opj1+(k*scaling);\n\t\t\t\tfor (var l = 0;l < responseWidth;l++) {\n\t\t\t\t\tupdatePosition[0] = opj0+(l*scaling);\n\n\t\t\t\t\tdx = currentPositionsj[0] - updatePosition[0];\n\t\t\t\t\tdy = currentPositionsj[1] - updatePosition[1];\n\t\t\t\t\tvecProbs[pos_idx] = responses[j][pos_idx] * Math.exp(-0.5*((dx*dx)+(dy*dy))/(variance*scaling));\n\n\t\t\t\t\tvpsum += vecProbs[pos_idx];\n\t\t\t\t\tpos_idx++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn vpsum;\n\t\t};\n\n\t\t// part two of meanshift calculation\n\t\tvar gpopt2 = function(responseWidth, vecpos, updatePosition, vecProbs, vpsum, opj0, opj1, scaling) {\n\t\t\t//for debugging\n\t\t\t//var vecmatrix = [];\n\n\t\t\tvar pos_idx = 0;\n\t\t\tvar vecsum = 0;\n\t\t\tvecpos[0] = 0;\n\t\t\tvecpos[1] = 0;\n\t\t\tfor (var k = 0;k < responseWidth;k++) {\n\t\t\t\tupdatePosition[1] = opj1+(k*scaling);\n\t\t\t\tfor (var l = 0;l < responseWidth;l++) {\n\t\t\t\t\tupdatePosition[0] = opj0+(l*scaling);\n\t\t\t\t\tvecsum = vecProbs[pos_idx]/vpsum;\n\n\t\t\t\t\t//vecmatrix[k*responseWidth + l] = vecsum;\n\n\t\t\t\t\tvecpos[0] += vecsum*updatePosition[0];\n\t\t\t\t\tvecpos[1] += vecsum*updatePosition[1];\n\t\t\t\t\tpos_idx++;\n\t\t\t\t}\n\t\t\t}\n\t\t\t//return vecmatrix;\n\t\t};\n\n\t\t// calculate score of current fit\n\t\tvar checkTracking = function() {\n\t\t\tvar trackingImgW = 20;\n\t\t\tvar trackingImgH = 22;\n\n\t\t\tscoringContext.drawImage(sketchCanvas, Math.round(msxmin+(msmodelwidth/4.5)), Math.round(msymin-(msmodelheight/12)), Math.round(msmodelwidth-(msmodelwidth*2/4.5)), Math.round(msmodelheight-(msmodelheight/12)), 0, 0, trackingImgW, trackingImgH);\n\t\t\t// getImageData of canvas\n\t\t\tvar imgData = scoringContext.getImageData(0,0,trackingImgW,trackingImgH);\n\t\t\t// convert data to grayscale\n\t\t\tvar trackingImgSize = trackingImgW * trackingImgH;\n\t\t\tvar scoringData = new Array(trackingImgSize);\n\t\t\tvar scdata = imgData.data;\n\t\t\tvar scmax = 0;\n\t\t\tfor (var i = 0;i < trackingImgSize;i++) {\n\t\t\t\tscoringData[i] = scdata[i*4]*0.3 + scdata[(i*4)+1]*0.59 + scdata[(i*4)+2]*0.11;\n\t\t\t\tscoringData[i] = Math.log(scoringData[i]+1);\n\t\t\t\tif (scoringData[i] > scmax) scmax = scoringData[i];\n\t\t\t}\n\n\t\t\tif (scmax > 0) {\n\t\t\t\t// normalize & multiply by svmFilter\n\t\t\t\tvar mean = 0;\n\t\t\t\tfor (var i = 0;i < trackingImgSize;i++) {\n\t\t\t\t\tmean += scoringData[i];\n\t\t\t\t}\n\t\t\t\tmean /= trackingImgSize;\n\t\t\t\tvar sd = 0;\n\t\t\t\tfor (var i = 0;i < trackingImgSize;i++) {\n\t\t\t\t\tsd += (scoringData[i]-mean)*(scoringData[i]-mean);\n\t\t\t\t}\n\t\t\t\tsd /= trackingImgSize;\n\t\t\t\tsd = Math.sqrt(sd);\n\n\t\t\t\tvar score = 0;\n\t\t\t\tfor (var i = 0;i < trackingImgSize;i++) {\n\t\t\t\t\tscoringData[i] = (scoringData[i]-mean)/sd;\n\t\t\t\t\tscore += (scoringData[i])*scoringWeights[i];\n\t\t\t\t}\n\t\t\t\tscore += scoringBias;\n\t\t\t\tscore = 1/(1+Math.exp(-score));\n\n\t\t\t\tif (scoringHistory.length == 5) {\n\t\t\t\t\tscoringHistory.shift();\n\t\t\t\t}\n\t\t\t\tscoringHistory.push(score);\n\n\t\t\t\tif (scoringHistory.length > 4) {\n\t\t\t\t\t// get average\n\t\t\t\t\tmeanscore = 0;\n\t\t\t\t\tfor (var i = 0;i < 5;i++) {\n\t\t\t\t\t\tmeanscore += scoringHistory[i];\n\t\t\t\t\t}\n\t\t\t\t\tmeanscore /= 5;\n\t\t\t\t\t// if below threshold, then reset (return false)\n\t\t\t\t\tif (meanscore < params.scoreThreshold) return false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\n\t\t// draw a parametrized line on a canvas\n\t\tvar drawPath = function(canvasContext, path, dp) {\n\t\t\tcanvasContext.beginPath();\n\t\t\tvar i, x, y, a, b;\n\t\t\tfor (var p = 0;p < path.length;p++) {\n\t\t\t\ti = path[p]*2;\n\t\t\t\tx = meanShape[i/2][0];\n\t\t\t\ty = meanShape[i/2][1];\n\t\t\t\tfor (var j = 0;j < numParameters;j++) {\n\t\t\t\t\tx += model.shapeModel.eigenVectors[i][j]*dp[j+4];\n\t\t\t\t\ty += model.shapeModel.eigenVectors[i+1][j]*dp[j+4];\n\t\t\t\t}\n\t\t\t\ta = dp[0]*x - dp[1]*y + dp[2];\n\t\t\t\tb = dp[0]*y + dp[1]*x + dp[3];\n\t\t\t\tx += a;\n\t\t\t\ty += b;\n\n\t\t\t\tif (i == 0) {\n\t\t\t\t\tcanvasContext.moveTo(x,y);\n\t\t\t\t} else {\n\t\t\t\t\tcanvasContext.lineTo(x,y);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcanvasContext.moveTo(0,0);\n\t\t\tcanvasContext.closePath();\n\t\t\tcanvasContext.stroke();\n\t\t};\n\n\t\t// draw a point on a canvas\n\t\tfunction drawPoint(canvasContext, point, dp) {\n\t\t\tvar i, x, y, a, b;\n\t\t\ti = point*2;\n\t\t\tx = meanShape[i/2][0];\n\t\t\ty = meanShape[i/2][1];\n\t\t\tfor (var j = 0;j < numParameters;j++) {\n\t\t\t\tx += model.shapeModel.eigenVectors[i][j]*dp[j+4];\n\t\t\t\ty += model.shapeModel.eigenVectors[i+1][j]*dp[j+4];\n\t\t\t}\n\t\t\ta = dp[0]*x - dp[1]*y + dp[2];\n\t\t\tb = dp[0]*y + dp[1]*x + dp[3];\n\t\t\tx += a;\n\t\t\ty += b;\n\t\t\tcanvasContext.beginPath();\n\t\t\tcanvasContext.arc(x, y, 1, 0, Math.PI*2, true);\n\t\t\tcanvasContext.closePath();\n\t\t\tcanvasContext.fill();\n\t\t}\n\n\t\treturn true;\n\t},\n\tversion : version\n};\n\nreturn clm;\n\n})));\n"
  },
  {
    "path": "lib/tracky-mouse/core/lib/facemesh/blazeface/model.json",
    "content": "{\"format\": \"graph-model\", \"generatedBy\": \"1.15.0\", \"convertedBy\": \"TensorFlow.js Converter v1.3.2\", \"userDefinedMetadata\": {\"signature\": {\"inputs\": {\"input:0\": {\"name\": \"input:0\", \"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"-1\"}, {\"size\": \"128\"}, {\"size\": \"128\"}, {\"size\": \"3\"}]}}}, \"outputs\": {\"Identity:0\": {\"name\": \"Identity:0\", \"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"-1\"}, {\"size\": \"-1\"}, {\"size\": \"17\"}]}}}}}, \"modelTopology\": {\"node\": [{\"name\": \"input\", \"op\": \"Placeholder\", \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"shape\": {\"shape\": {\"dim\": [{\"size\": \"-1\"}, {\"size\": \"128\"}, {\"size\": \"128\"}, {\"size\": \"3\"}]}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"5\"}, {\"size\": \"5\"}, {\"size\": \"3\"}, {\"size\": \"24\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_16/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"96\"}, {\"size\": \"96\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"24\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_1/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"24\"}, {\"size\": \"24\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_16/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"96\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_1/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"24\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_2/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"24\"}, {\"size\": \"28\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_2/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"28\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_3/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"28\"}, {\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_3/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_4/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"32\"}, {\"size\": \"36\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_4/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"36\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_5/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"36\"}, {\"size\": \"42\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_5/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"42\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_6/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"42\"}, {\"size\": \"48\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_6/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"48\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_7/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"48\"}, {\"size\": \"56\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_7/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"56\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_8/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"56\"}, {\"size\": \"64\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_8/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"64\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_9/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"64\"}, {\"size\": \"72\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_9/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"72\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_10/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"72\"}, {\"size\": \"80\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_10/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"80\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_11/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"80\"}, {\"size\": \"88\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_11/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"88\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_12/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"88\"}, {\"size\": \"96\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_12/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"96\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_13/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"96\"}, {\"size\": \"96\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_13/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"96\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_14/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"96\"}, {\"size\": \"96\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_14/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"96\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_15/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"96\"}, {\"size\": \"96\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_15/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"96\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"24\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/channel_padding/Pad/paddings\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_INT32\", \"tensorShape\": {\"dim\": [{\"size\": \"4\"}, {\"size\": \"2\"}]}}}, \"dtype\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_1/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"24\"}, {\"size\": \"1\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_2/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"28\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_3/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"32\"}, {\"size\": \"1\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/channel_padding_3/Pad/paddings\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_INT32\", \"tensorShape\": {\"dim\": [{\"size\": \"4\"}, {\"size\": \"2\"}]}}}, \"dtype\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_4/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"36\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_5/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"42\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/channel_padding_5/Pad/paddings\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_INT32\", \"tensorShape\": {\"dim\": [{\"size\": \"4\"}, {\"size\": \"2\"}]}}}, \"dtype\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_6/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"48\"}, {\"size\": \"1\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_7/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"56\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_8/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"64\"}, {\"size\": \"1\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_9/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"72\"}, {\"size\": \"1\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_10/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"80\"}, {\"size\": \"1\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/classificator_8/Conv2D/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"88\"}, {\"size\": \"2\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/classificator_8/BiasAdd/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"2\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/reshape/strided_slice/stack\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"dtype\": {\"type\": \"DT_INT32\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_INT32\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/reshape/strided_slice/stack_1\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_INT32\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/reshape/Reshape/shape/1\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_INT32\", \"tensorShape\": {}}}, \"dtype\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/reshape/Reshape/shape/2\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_INT32\", \"tensorShape\": {}}}, \"dtype\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_11/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"88\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_12/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"96\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_13/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"96\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_14/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"96\"}, {\"size\": \"1\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_15/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"96\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/classificator_16/Conv2D/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"96\"}, {\"size\": \"6\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/classificator_16/BiasAdd/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"6\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/regressor_8/Conv2D/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"88\"}, {\"size\": \"32\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/regressor_8/BiasAdd/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/reshape_1/Reshape/shape/2\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_INT32\", \"tensorShape\": {}}}, \"dtype\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/regressor_16/Conv2D/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"96\"}, {\"size\": \"96\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/regressor_16/BiasAdd/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"96\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/objects/concat/axis\", \"op\": \"Const\", \"input\": [\"^input\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_INT32\", \"tensorShape\": {}}}, \"dtype\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/activation/Relu\", \"op\": \"_FusedConv2D\", \"input\": [\"input\", \"StatefulPartitionedCall/model/conv2d/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\", \"UmVsdQ==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/activation/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d/depthwise/ReadVariableOp\"], \"attr\": {\"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_1/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d/depthwise\", \"StatefulPartitionedCall/model/conv2d_1/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_1/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/add/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/activation/Relu\", \"StatefulPartitionedCall/model/batch_normalization_v1_1/FusedBatchNormV3\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/activation_1/Relu\", \"op\": \"Relu\", \"input\": [\"StatefulPartitionedCall/model/add/add\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/channel_padding/Pad\", \"op\": \"Pad\", \"input\": [\"StatefulPartitionedCall/model/activation_1/Relu\", \"StatefulPartitionedCall/model/channel_padding/Pad/paddings\"], \"attr\": {\"Tpaddings\": {\"type\": \"DT_INT32\"}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_1/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/activation_1/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_1/depthwise/ReadVariableOp\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_2/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_1/depthwise\", \"StatefulPartitionedCall/model/conv2d_2/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_2/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/add_1/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_2/FusedBatchNormV3\", \"StatefulPartitionedCall/model/channel_padding/Pad\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/activation_2/Relu\", \"op\": \"Relu\", \"input\": [\"StatefulPartitionedCall/model/add_1/add\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/max_pooling2d/MaxPool\", \"op\": \"MaxPool\", \"input\": [\"StatefulPartitionedCall/model/activation_2/Relu\"], \"attr\": {\"ksize\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_2/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/activation_2/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_2/depthwise/ReadVariableOp\"], \"attr\": {\"padding\": {\"s\": \"U0FNRQ==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/channel_padding_1/Pad\", \"op\": \"Pad\", \"input\": [\"StatefulPartitionedCall/model/max_pooling2d/MaxPool\", \"StatefulPartitionedCall/model/channel_padding/Pad/paddings\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"Tpaddings\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_3/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_2/depthwise\", \"StatefulPartitionedCall/model/conv2d_3/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_3/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}}}, {\"name\": \"StatefulPartitionedCall/model/add_2/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_3/FusedBatchNormV3\", \"StatefulPartitionedCall/model/channel_padding_1/Pad\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/activation_3/Relu\", \"op\": \"Relu\", \"input\": [\"StatefulPartitionedCall/model/add_2/add\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/channel_padding_2/Pad\", \"op\": \"Pad\", \"input\": [\"StatefulPartitionedCall/model/activation_3/Relu\", \"StatefulPartitionedCall/model/channel_padding/Pad/paddings\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"Tpaddings\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_3/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/activation_3/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_3/depthwise/ReadVariableOp\"], \"attr\": {\"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_4/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_3/depthwise\", \"StatefulPartitionedCall/model/conv2d_4/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_4/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}}}, {\"name\": \"StatefulPartitionedCall/model/add_3/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_4/FusedBatchNormV3\", \"StatefulPartitionedCall/model/channel_padding_2/Pad\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/activation_4/Relu\", \"op\": \"Relu\", \"input\": [\"StatefulPartitionedCall/model/add_3/add\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/channel_padding_3/Pad\", \"op\": \"Pad\", \"input\": [\"StatefulPartitionedCall/model/activation_4/Relu\", \"StatefulPartitionedCall/model/channel_padding_3/Pad/paddings\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"Tpaddings\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_4/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/activation_4/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_4/depthwise/ReadVariableOp\"], \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_5/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_4/depthwise\", \"StatefulPartitionedCall/model/conv2d_5/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_5/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/add_4/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_5/FusedBatchNormV3\", \"StatefulPartitionedCall/model/channel_padding_3/Pad\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/activation_5/Relu\", \"op\": \"Relu\", \"input\": [\"StatefulPartitionedCall/model/add_4/add\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/max_pooling2d_1/MaxPool\", \"op\": \"MaxPool\", \"input\": [\"StatefulPartitionedCall/model/activation_5/Relu\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"ksize\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_5/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/activation_5/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_5/depthwise/ReadVariableOp\"], \"attr\": {\"strides\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/channel_padding_4/Pad\", \"op\": \"Pad\", \"input\": [\"StatefulPartitionedCall/model/max_pooling2d_1/MaxPool\", \"StatefulPartitionedCall/model/channel_padding_3/Pad/paddings\"], \"attr\": {\"Tpaddings\": {\"type\": \"DT_INT32\"}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_6/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_5/depthwise\", \"StatefulPartitionedCall/model/conv2d_6/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_6/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}}}, {\"name\": \"StatefulPartitionedCall/model/add_5/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_6/FusedBatchNormV3\", \"StatefulPartitionedCall/model/channel_padding_4/Pad\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/activation_6/Relu\", \"op\": \"Relu\", \"input\": [\"StatefulPartitionedCall/model/add_5/add\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/channel_padding_5/Pad\", \"op\": \"Pad\", \"input\": [\"StatefulPartitionedCall/model/activation_6/Relu\", \"StatefulPartitionedCall/model/channel_padding_5/Pad/paddings\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"Tpaddings\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_6/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/activation_6/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_6/depthwise/ReadVariableOp\"], \"attr\": {\"padding\": {\"s\": \"U0FNRQ==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_7/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_6/depthwise\", \"StatefulPartitionedCall/model/conv2d_7/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_7/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/add_6/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_7/FusedBatchNormV3\", \"StatefulPartitionedCall/model/channel_padding_5/Pad\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/activation_7/Relu\", \"op\": \"Relu\", \"input\": [\"StatefulPartitionedCall/model/add_6/add\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/channel_padding_6/Pad\", \"op\": \"Pad\", \"input\": [\"StatefulPartitionedCall/model/activation_7/Relu\", \"StatefulPartitionedCall/model/channel_padding_5/Pad/paddings\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"Tpaddings\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_7/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/activation_7/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_7/depthwise/ReadVariableOp\"], \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_8/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_7/depthwise\", \"StatefulPartitionedCall/model/conv2d_8/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_8/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}}}, {\"name\": \"StatefulPartitionedCall/model/add_7/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_8/FusedBatchNormV3\", \"StatefulPartitionedCall/model/channel_padding_6/Pad\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/activation_8/Relu\", \"op\": \"Relu\", \"input\": [\"StatefulPartitionedCall/model/add_7/add\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/channel_padding_7/Pad\", \"op\": \"Pad\", \"input\": [\"StatefulPartitionedCall/model/activation_8/Relu\", \"StatefulPartitionedCall/model/channel_padding_5/Pad/paddings\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"Tpaddings\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_8/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/activation_8/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_8/depthwise/ReadVariableOp\"], \"attr\": {\"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_9/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_8/depthwise\", \"StatefulPartitionedCall/model/conv2d_9/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_9/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}}}, {\"name\": \"StatefulPartitionedCall/model/add_8/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_9/FusedBatchNormV3\", \"StatefulPartitionedCall/model/channel_padding_7/Pad\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/activation_9/Relu\", \"op\": \"Relu\", \"input\": [\"StatefulPartitionedCall/model/add_8/add\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/channel_padding_8/Pad\", \"op\": \"Pad\", \"input\": [\"StatefulPartitionedCall/model/activation_9/Relu\", \"StatefulPartitionedCall/model/channel_padding_5/Pad/paddings\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"Tpaddings\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_9/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/activation_9/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_9/depthwise/ReadVariableOp\"], \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_10/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_9/depthwise\", \"StatefulPartitionedCall/model/conv2d_10/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_10/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/add_9/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_10/FusedBatchNormV3\", \"StatefulPartitionedCall/model/channel_padding_8/Pad\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/activation_10/Relu\", \"op\": \"Relu\", \"input\": [\"StatefulPartitionedCall/model/add_9/add\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/channel_padding_9/Pad\", \"op\": \"Pad\", \"input\": [\"StatefulPartitionedCall/model/activation_10/Relu\", \"StatefulPartitionedCall/model/channel_padding_5/Pad/paddings\"], \"attr\": {\"Tpaddings\": {\"type\": \"DT_INT32\"}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_10/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/activation_10/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_10/depthwise/ReadVariableOp\"], \"attr\": {\"padding\": {\"s\": \"U0FNRQ==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_11/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_10/depthwise\", \"StatefulPartitionedCall/model/conv2d_11/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_11/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/add_10/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_11/FusedBatchNormV3\", \"StatefulPartitionedCall/model/channel_padding_9/Pad\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/activation_11/Relu\", \"op\": \"Relu\", \"input\": [\"StatefulPartitionedCall/model/add_10/add\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/max_pooling2d_2/MaxPool\", \"op\": \"MaxPool\", \"input\": [\"StatefulPartitionedCall/model/activation_11/Relu\"], \"attr\": {\"ksize\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}}}, {\"name\": \"StatefulPartitionedCall/model/classificator_8/BiasAdd\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/activation_11/Relu\", \"StatefulPartitionedCall/model/classificator_8/Conv2D/ReadVariableOp\", \"StatefulPartitionedCall/model/classificator_8/BiasAdd/ReadVariableOp\"], \"device\": \"/device:CPU:0\", \"attr\": {\"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_11/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/activation_11/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_11/depthwise/ReadVariableOp\"], \"attr\": {\"padding\": {\"s\": \"U0FNRQ==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/regressor_8/BiasAdd\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/activation_11/Relu\", \"StatefulPartitionedCall/model/regressor_8/Conv2D/ReadVariableOp\", \"StatefulPartitionedCall/model/regressor_8/BiasAdd/ReadVariableOp\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/channel_padding_10/Pad\", \"op\": \"Pad\", \"input\": [\"StatefulPartitionedCall/model/max_pooling2d_2/MaxPool\", \"StatefulPartitionedCall/model/channel_padding_5/Pad/paddings\"], \"attr\": {\"Tpaddings\": {\"type\": \"DT_INT32\"}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/reshape/Shape\", \"op\": \"Shape\", \"input\": [\"StatefulPartitionedCall/model/classificator_8/BiasAdd\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"out_type\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_12/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_11/depthwise\", \"StatefulPartitionedCall/model/conv2d_12/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_12/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/reshape_1/Shape\", \"op\": \"Shape\", \"input\": [\"StatefulPartitionedCall/model/regressor_8/BiasAdd\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"out_type\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/reshape/strided_slice\", \"op\": \"StridedSlice\", \"input\": [\"StatefulPartitionedCall/model/reshape/Shape\", \"StatefulPartitionedCall/model/reshape/strided_slice/stack\", \"StatefulPartitionedCall/model/reshape/strided_slice/stack_1\", \"StatefulPartitionedCall/model/reshape/strided_slice/stack_1\"], \"attr\": {\"T\": {\"type\": \"DT_INT32\"}, \"Index\": {\"type\": \"DT_INT32\"}, \"shrink_axis_mask\": {\"i\": \"1\"}, \"begin_mask\": {\"i\": \"0\"}, \"ellipsis_mask\": {\"i\": \"0\"}, \"new_axis_mask\": {\"i\": \"0\"}, \"end_mask\": {\"i\": \"0\"}}}, {\"name\": \"StatefulPartitionedCall/model/add_11/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_12/FusedBatchNormV3\", \"StatefulPartitionedCall/model/channel_padding_10/Pad\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/reshape_1/strided_slice\", \"op\": \"StridedSlice\", \"input\": [\"StatefulPartitionedCall/model/reshape_1/Shape\", \"StatefulPartitionedCall/model/reshape/strided_slice/stack\", \"StatefulPartitionedCall/model/reshape/strided_slice/stack_1\", \"StatefulPartitionedCall/model/reshape/strided_slice/stack_1\"], \"attr\": {\"shrink_axis_mask\": {\"i\": \"1\"}, \"begin_mask\": {\"i\": \"0\"}, \"ellipsis_mask\": {\"i\": \"0\"}, \"new_axis_mask\": {\"i\": \"0\"}, \"end_mask\": {\"i\": \"0\"}, \"T\": {\"type\": \"DT_INT32\"}, \"Index\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/reshape/Reshape/shape\", \"op\": \"Pack\", \"input\": [\"StatefulPartitionedCall/model/reshape/strided_slice\", \"StatefulPartitionedCall/model/reshape/Reshape/shape/1\", \"StatefulPartitionedCall/model/reshape/Reshape/shape/2\"], \"attr\": {\"T\": {\"type\": \"DT_INT32\"}, \"axis\": {\"i\": \"0\"}, \"N\": {\"i\": \"3\"}}}, {\"name\": \"StatefulPartitionedCall/model/activation_12/Relu\", \"op\": \"Relu\", \"input\": [\"StatefulPartitionedCall/model/add_11/add\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/reshape_1/Reshape/shape\", \"op\": \"Pack\", \"input\": [\"StatefulPartitionedCall/model/reshape_1/strided_slice\", \"StatefulPartitionedCall/model/reshape/Reshape/shape/1\", \"StatefulPartitionedCall/model/reshape_1/Reshape/shape/2\"], \"attr\": {\"T\": {\"type\": \"DT_INT32\"}, \"axis\": {\"i\": \"0\"}, \"N\": {\"i\": \"3\"}}}, {\"name\": \"StatefulPartitionedCall/model/reshape/Reshape\", \"op\": \"Reshape\", \"input\": [\"StatefulPartitionedCall/model/classificator_8/BiasAdd\", \"StatefulPartitionedCall/model/reshape/Reshape/shape\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"Tshape\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_12/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/activation_12/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_12/depthwise/ReadVariableOp\"], \"attr\": {\"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/reshape_1/Reshape\", \"op\": \"Reshape\", \"input\": [\"StatefulPartitionedCall/model/regressor_8/BiasAdd\", \"StatefulPartitionedCall/model/reshape_1/Reshape/shape\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"Tshape\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_13/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_12/depthwise\", \"StatefulPartitionedCall/model/conv2d_13/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_13/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}, \"num_args\": {\"i\": \"1\"}}}, {\"name\": \"StatefulPartitionedCall/model/add_12/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/activation_12/Relu\", \"StatefulPartitionedCall/model/batch_normalization_v1_13/FusedBatchNormV3\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/activation_13/Relu\", \"op\": \"Relu\", \"input\": [\"StatefulPartitionedCall/model/add_12/add\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_13/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/activation_13/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_13/depthwise/ReadVariableOp\"], \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_14/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_13/depthwise\", \"StatefulPartitionedCall/model/conv2d_14/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_14/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/add_13/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/activation_13/Relu\", \"StatefulPartitionedCall/model/batch_normalization_v1_14/FusedBatchNormV3\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/activation_14/Relu\", \"op\": \"Relu\", \"input\": [\"StatefulPartitionedCall/model/add_13/add\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_14/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/activation_14/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_14/depthwise/ReadVariableOp\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_15/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_14/depthwise\", \"StatefulPartitionedCall/model/conv2d_15/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_15/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/add_14/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/activation_14/Relu\", \"StatefulPartitionedCall/model/batch_normalization_v1_15/FusedBatchNormV3\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/activation_15/Relu\", \"op\": \"Relu\", \"input\": [\"StatefulPartitionedCall/model/add_14/add\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_15/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/activation_15/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_15/depthwise/ReadVariableOp\"], \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_16/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_15/depthwise\", \"StatefulPartitionedCall/model/conv2d_16/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_16/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/add_15/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/activation_15/Relu\", \"StatefulPartitionedCall/model/batch_normalization_v1_16/FusedBatchNormV3\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/activation_16/Relu\", \"op\": \"Relu\", \"input\": [\"StatefulPartitionedCall/model/add_15/add\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/classificator_16/BiasAdd\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/activation_16/Relu\", \"StatefulPartitionedCall/model/classificator_16/Conv2D/ReadVariableOp\", \"StatefulPartitionedCall/model/classificator_16/BiasAdd/ReadVariableOp\"], \"device\": \"/device:CPU:0\", \"attr\": {\"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}}}, {\"name\": \"StatefulPartitionedCall/model/regressor_16/BiasAdd\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/activation_16/Relu\", \"StatefulPartitionedCall/model/regressor_16/Conv2D/ReadVariableOp\", \"StatefulPartitionedCall/model/regressor_16/BiasAdd/ReadVariableOp\"], \"device\": \"/device:CPU:0\", \"attr\": {\"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"U0FNRQ==\"}}}, {\"name\": \"StatefulPartitionedCall/model/reshape_2/Shape\", \"op\": \"Shape\", \"input\": [\"StatefulPartitionedCall/model/classificator_16/BiasAdd\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"out_type\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/reshape_3/Shape\", \"op\": \"Shape\", \"input\": [\"StatefulPartitionedCall/model/regressor_16/BiasAdd\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"out_type\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/reshape_2/strided_slice\", \"op\": \"StridedSlice\", \"input\": [\"StatefulPartitionedCall/model/reshape_2/Shape\", \"StatefulPartitionedCall/model/reshape/strided_slice/stack\", \"StatefulPartitionedCall/model/reshape/strided_slice/stack_1\", \"StatefulPartitionedCall/model/reshape/strided_slice/stack_1\"], \"attr\": {\"shrink_axis_mask\": {\"i\": \"1\"}, \"begin_mask\": {\"i\": \"0\"}, \"ellipsis_mask\": {\"i\": \"0\"}, \"new_axis_mask\": {\"i\": \"0\"}, \"end_mask\": {\"i\": \"0\"}, \"Index\": {\"type\": \"DT_INT32\"}, \"T\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/reshape_3/strided_slice\", \"op\": \"StridedSlice\", \"input\": [\"StatefulPartitionedCall/model/reshape_3/Shape\", \"StatefulPartitionedCall/model/reshape/strided_slice/stack\", \"StatefulPartitionedCall/model/reshape/strided_slice/stack_1\", \"StatefulPartitionedCall/model/reshape/strided_slice/stack_1\"], \"attr\": {\"T\": {\"type\": \"DT_INT32\"}, \"Index\": {\"type\": \"DT_INT32\"}, \"shrink_axis_mask\": {\"i\": \"1\"}, \"ellipsis_mask\": {\"i\": \"0\"}, \"begin_mask\": {\"i\": \"0\"}, \"new_axis_mask\": {\"i\": \"0\"}, \"end_mask\": {\"i\": \"0\"}}}, {\"name\": \"StatefulPartitionedCall/model/reshape_2/Reshape/shape\", \"op\": \"Pack\", \"input\": [\"StatefulPartitionedCall/model/reshape_2/strided_slice\", \"StatefulPartitionedCall/model/reshape/Reshape/shape/1\", \"StatefulPartitionedCall/model/reshape/Reshape/shape/2\"], \"attr\": {\"T\": {\"type\": \"DT_INT32\"}, \"axis\": {\"i\": \"0\"}, \"N\": {\"i\": \"3\"}}}, {\"name\": \"StatefulPartitionedCall/model/reshape_3/Reshape/shape\", \"op\": \"Pack\", \"input\": [\"StatefulPartitionedCall/model/reshape_3/strided_slice\", \"StatefulPartitionedCall/model/reshape/Reshape/shape/1\", \"StatefulPartitionedCall/model/reshape_1/Reshape/shape/2\"], \"attr\": {\"T\": {\"type\": \"DT_INT32\"}, \"axis\": {\"i\": \"0\"}, \"N\": {\"i\": \"3\"}}}, {\"name\": \"StatefulPartitionedCall/model/reshape_2/Reshape\", \"op\": \"Reshape\", \"input\": [\"StatefulPartitionedCall/model/classificator_16/BiasAdd\", \"StatefulPartitionedCall/model/reshape_2/Reshape/shape\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"Tshape\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/reshape_3/Reshape\", \"op\": \"Reshape\", \"input\": [\"StatefulPartitionedCall/model/regressor_16/BiasAdd\", \"StatefulPartitionedCall/model/reshape_3/Reshape/shape\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"Tshape\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/classificators/concat\", \"op\": \"ConcatV2\", \"input\": [\"StatefulPartitionedCall/model/reshape/Reshape\", \"StatefulPartitionedCall/model/reshape_2/Reshape\", \"StatefulPartitionedCall/model/reshape/Reshape/shape/2\"], \"attr\": {\"Tidx\": {\"type\": \"DT_INT32\"}, \"T\": {\"type\": \"DT_FLOAT\"}, \"N\": {\"i\": \"2\"}}}, {\"name\": \"StatefulPartitionedCall/model/regressors/concat\", \"op\": \"ConcatV2\", \"input\": [\"StatefulPartitionedCall/model/reshape_1/Reshape\", \"StatefulPartitionedCall/model/reshape_3/Reshape\", \"StatefulPartitionedCall/model/reshape/Reshape/shape/2\"], \"attr\": {\"Tidx\": {\"type\": \"DT_INT32\"}, \"T\": {\"type\": \"DT_FLOAT\"}, \"N\": {\"i\": \"2\"}}}, {\"name\": \"StatefulPartitionedCall/model/objects/concat\", \"op\": \"ConcatV2\", \"input\": [\"StatefulPartitionedCall/model/classificators/concat\", \"StatefulPartitionedCall/model/regressors/concat\", \"StatefulPartitionedCall/model/objects/concat/axis\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"N\": {\"i\": \"2\"}, \"Tidx\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"Identity\", \"op\": \"Identity\", \"input\": [\"StatefulPartitionedCall/model/objects/concat\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}], \"versions\": {\"producer\": 134, \"minConsumer\": 12}}, \"weightsManifest\": [{\"paths\": [\"group1-shard1of1.bin\"], \"weights\": [{\"name\": \"StatefulPartitionedCall/model/conv2d/Conv2D_weights\", \"shape\": [5, 5, 3, 24], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_16/Conv2D_weights\", \"shape\": [1, 1, 96, 96], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d/Conv2D_bn_offset\", \"shape\": [24], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_1/Conv2D_weights\", \"shape\": [1, 1, 24, 24], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_16/Conv2D_bn_offset\", \"shape\": [96], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_1/Conv2D_bn_offset\", \"shape\": [24], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_2/Conv2D_weights\", \"shape\": [1, 1, 24, 28], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_2/Conv2D_bn_offset\", \"shape\": [28], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_3/Conv2D_weights\", \"shape\": [1, 1, 28, 32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_3/Conv2D_bn_offset\", \"shape\": [32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_4/Conv2D_weights\", \"shape\": [1, 1, 32, 36], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_4/Conv2D_bn_offset\", \"shape\": [36], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_5/Conv2D_weights\", \"shape\": [1, 1, 36, 42], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_5/Conv2D_bn_offset\", \"shape\": [42], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_6/Conv2D_weights\", \"shape\": [1, 1, 42, 48], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_6/Conv2D_bn_offset\", \"shape\": [48], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_7/Conv2D_weights\", \"shape\": [1, 1, 48, 56], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_7/Conv2D_bn_offset\", \"shape\": [56], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_8/Conv2D_weights\", \"shape\": [1, 1, 56, 64], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_8/Conv2D_bn_offset\", \"shape\": [64], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_9/Conv2D_weights\", \"shape\": [1, 1, 64, 72], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_9/Conv2D_bn_offset\", \"shape\": [72], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_10/Conv2D_weights\", \"shape\": [1, 1, 72, 80], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_10/Conv2D_bn_offset\", \"shape\": [80], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_11/Conv2D_weights\", \"shape\": [1, 1, 80, 88], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_11/Conv2D_bn_offset\", \"shape\": [88], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_12/Conv2D_weights\", \"shape\": [1, 1, 88, 96], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_12/Conv2D_bn_offset\", \"shape\": [96], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_13/Conv2D_weights\", \"shape\": [1, 1, 96, 96], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_13/Conv2D_bn_offset\", \"shape\": [96], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_14/Conv2D_weights\", \"shape\": [1, 1, 96, 96], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_14/Conv2D_bn_offset\", \"shape\": [96], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_15/Conv2D_weights\", \"shape\": [1, 1, 96, 96], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_15/Conv2D_bn_offset\", \"shape\": [96], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d/depthwise/ReadVariableOp\", \"shape\": [3, 3, 24, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/channel_padding/Pad/paddings\", \"shape\": [4, 2], \"dtype\": \"int32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_1/depthwise/ReadVariableOp\", \"shape\": [3, 3, 24, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_2/depthwise/ReadVariableOp\", \"shape\": [3, 3, 28, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_3/depthwise/ReadVariableOp\", \"shape\": [3, 3, 32, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/channel_padding_3/Pad/paddings\", \"shape\": [4, 2], \"dtype\": \"int32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_4/depthwise/ReadVariableOp\", \"shape\": [3, 3, 36, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_5/depthwise/ReadVariableOp\", \"shape\": [3, 3, 42, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/channel_padding_5/Pad/paddings\", \"shape\": [4, 2], \"dtype\": \"int32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_6/depthwise/ReadVariableOp\", \"shape\": [3, 3, 48, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_7/depthwise/ReadVariableOp\", \"shape\": [3, 3, 56, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_8/depthwise/ReadVariableOp\", \"shape\": [3, 3, 64, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_9/depthwise/ReadVariableOp\", \"shape\": [3, 3, 72, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_10/depthwise/ReadVariableOp\", \"shape\": [3, 3, 80, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/classificator_8/Conv2D/ReadVariableOp\", \"shape\": [1, 1, 88, 2], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/classificator_8/BiasAdd/ReadVariableOp\", \"shape\": [2], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/reshape/strided_slice/stack\", \"shape\": [1], \"dtype\": \"int32\"}, {\"name\": \"StatefulPartitionedCall/model/reshape/strided_slice/stack_1\", \"shape\": [1], \"dtype\": \"int32\"}, {\"name\": \"StatefulPartitionedCall/model/reshape/Reshape/shape/1\", \"shape\": [], \"dtype\": \"int32\"}, {\"name\": \"StatefulPartitionedCall/model/reshape/Reshape/shape/2\", \"shape\": [], \"dtype\": \"int32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_11/depthwise/ReadVariableOp\", \"shape\": [3, 3, 88, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_12/depthwise/ReadVariableOp\", \"shape\": [3, 3, 96, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_13/depthwise/ReadVariableOp\", \"shape\": [3, 3, 96, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_14/depthwise/ReadVariableOp\", \"shape\": [3, 3, 96, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_15/depthwise/ReadVariableOp\", \"shape\": [3, 3, 96, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/classificator_16/Conv2D/ReadVariableOp\", \"shape\": [1, 1, 96, 6], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/classificator_16/BiasAdd/ReadVariableOp\", \"shape\": [6], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/regressor_8/Conv2D/ReadVariableOp\", \"shape\": [1, 1, 88, 32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/regressor_8/BiasAdd/ReadVariableOp\", \"shape\": [32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/reshape_1/Reshape/shape/2\", \"shape\": [], \"dtype\": \"int32\"}, {\"name\": \"StatefulPartitionedCall/model/regressor_16/Conv2D/ReadVariableOp\", \"shape\": [1, 1, 96, 96], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/regressor_16/BiasAdd/ReadVariableOp\", \"shape\": [96], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/objects/concat/axis\", \"shape\": [], \"dtype\": \"int32\"}]}]}"
  },
  {
    "path": "lib/tracky-mouse/core/lib/facemesh/facemesh/model.json",
    "content": "{\"format\": \"graph-model\", \"generatedBy\": \"1.15.0\", \"convertedBy\": \"TensorFlow.js Converter v1.5.2\", \"userDefinedMetadata\": {\"signature\": {\"inputs\": {\"input_1:0\": {\"name\": \"input_1:0\", \"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"192\"}, {\"size\": \"192\"}, {\"size\": \"3\"}]}}}, \"outputs\": {\"Identity_1:0\": {\"name\": \"Identity_1:0\", \"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"266\"}]}}, \"Identity_2:0\": {\"name\": \"Identity_2:0\", \"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}]}}, \"Identity:0\": {\"name\": \"Identity:0\", \"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1404\"}]}}}}}, \"modelTopology\": {\"node\": [{\"name\": \"input_1\", \"op\": \"Placeholder\", \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"shape\": {\"shape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"192\"}, {\"size\": \"192\"}, {\"size\": \"3\"}]}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"16\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"16\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_1/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"16\"}, {\"size\": \"16\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_1/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"16\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_2/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"16\"}, {\"size\": \"16\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_2/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"16\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_3/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"16\"}, {\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_19/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"32\"}, {\"size\": \"32\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_3/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_4/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"32\"}, {\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_4/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_5/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"32\"}, {\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_19/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_5/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_6/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"32\"}, {\"size\": \"64\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_6/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"64\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_7/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"64\"}, {\"size\": \"64\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_7/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"64\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_8/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"64\"}, {\"size\": \"64\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_8/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"64\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_9/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"64\"}, {\"size\": \"128\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_9/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_10/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_10/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"128\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_11/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_11/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_12/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_12/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_13/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}, {\"size\": \"128\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_13/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_14/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_14/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_15/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_15/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_27/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_27/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_21/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_25/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"32\"}, {\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_21/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"128\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_28/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}, {\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_28/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_16/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_25/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_16/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_22/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_22/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_29/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"32\"}, {\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_29/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_17/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_17/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_23/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_23/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"128\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_18/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}, {\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_18/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_24/Conv2D_weights\", \"op\": \"Const\", \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}, {\"size\": \"32\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_24/Conv2D_bn_offset\", \"op\": \"Const\", \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"32\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"16\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"16\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_1/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"16\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_1/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"16\"}, {\"size\": \"1\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_2/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"16\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/channel_padding/Pad/paddings\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_INT32\", \"tensorShape\": {\"dim\": [{\"size\": \"4\"}, {\"size\": \"2\"}]}}}, \"dtype\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_2/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"16\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_3/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_3/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"32\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_4/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_4/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"32\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_5/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/channel_padding_1/Pad/paddings\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_INT32\", \"tensorShape\": {\"dim\": [{\"size\": \"4\"}, {\"size\": \"2\"}]}}}, \"dtype\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_5/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"32\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_6/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"64\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_6/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"64\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_7/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"64\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_7/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"64\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_8/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"64\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/channel_padding_2/Pad/paddings\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_INT32\", \"tensorShape\": {\"dim\": [{\"size\": \"4\"}, {\"size\": \"2\"}]}}}, \"dtype\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_8/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"64\"}, {\"size\": \"1\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_9/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_9/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"128\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_10/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_10/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"128\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_11/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_11/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"128\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_12/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_12/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"128\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_13/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_13/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"128\"}, {\"size\": \"1\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_14/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_14/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"128\"}, {\"size\": \"1\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_15/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_15/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"128\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_16/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_16/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"128\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_17/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_18/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_17/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"32\"}, {\"size\": \"1\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_19/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_20/Conv2D/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"32\"}, {\"size\": \"1404\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_20/BiasAdd/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1404\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/output_mesh/Reshape/shape\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_INT32\", \"tensorShape\": {\"dim\": [{\"size\": \"2\"}]}}}, \"dtype\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_22/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"128\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_23/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"32\"}, {\"size\": \"1\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_30/BiasAdd/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_30/Conv2D/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"32\"}, {\"size\": \"1\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_18/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"128\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_27/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_19/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"128\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_20/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_26/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"32\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_21/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_26/BiasAdd/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"266\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_20/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"128\"}, {\"size\": \"1\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_22/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_26/Conv2D/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"32\"}, {\"size\": \"266\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_21/depthwise/ReadVariableOp\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"3\"}, {\"size\": \"3\"}, {\"size\": \"32\"}, {\"size\": \"1\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_23/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"dtype\": {\"type\": \"DT_FLOAT\"}, \"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"32\"}]}}}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_24/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"32\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_25/Neg\", \"op\": \"Const\", \"input\": [\"^input_1\"], \"attr\": {\"value\": {\"tensor\": {\"dtype\": \"DT_FLOAT\", \"tensorShape\": {\"dim\": [{\"size\": \"1\"}, {\"size\": \"1\"}, {\"size\": \"128\"}]}}}, \"dtype\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"input_1\", \"StatefulPartitionedCall/model/conv2d/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d/Conv2D_bn_offset\", \"StatefulPartitionedCall/model/p_re_lu/Neg\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}, \"num_args\": {\"i\": \"2\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\", \"UHJlbHU=\"]}}}}, {\"name\": \"Func/StatefulPartitionedCall/output_control_node/_204\", \"op\": \"NoOp\", \"input\": [\"^StatefulPartitionedCall/model/conv2d_20/BiasAdd/ReadVariableOp\", \"^StatefulPartitionedCall/model/conv2d_20/Conv2D/ReadVariableOp\", \"^StatefulPartitionedCall/model/conv2d_26/BiasAdd/ReadVariableOp\", \"^StatefulPartitionedCall/model/conv2d_26/Conv2D/ReadVariableOp\", \"^StatefulPartitionedCall/model/conv2d_30/BiasAdd/ReadVariableOp\", \"^StatefulPartitionedCall/model/conv2d_30/Conv2D/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_1/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_10/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_11/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_12/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_13/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_14/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_15/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_16/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_17/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_18/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_19/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_2/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_20/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_21/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_22/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_23/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_3/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_4/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_5/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_6/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_7/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_8/depthwise/ReadVariableOp\", \"^StatefulPartitionedCall/model/depthwise_conv2d_9/depthwise/ReadVariableOp\"]}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1/FusedBatchNormV3\", \"StatefulPartitionedCall/model/depthwise_conv2d/depthwise/ReadVariableOp\"], \"attr\": {\"padding\": {\"s\": \"U0FNRQ==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_1/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d/depthwise\", \"StatefulPartitionedCall/model/conv2d_1/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_1/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}}}, {\"name\": \"StatefulPartitionedCall/model/add/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_1/FusedBatchNormV3\", \"StatefulPartitionedCall/model/batch_normalization_v1/FusedBatchNormV3\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_1/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add/add\", \"StatefulPartitionedCall/model/p_re_lu_1/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_1/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_1/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_1/depthwise/ReadVariableOp\"], \"attr\": {\"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_2/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_1/depthwise\", \"StatefulPartitionedCall/model/conv2d_2/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_2/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/add_1/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_2/FusedBatchNormV3\", \"StatefulPartitionedCall/model/p_re_lu_1/Relu\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_2/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_1/add\", \"StatefulPartitionedCall/model/p_re_lu_2/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/max_pooling2d/MaxPool\", \"op\": \"MaxPool\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_2/Relu\"], \"attr\": {\"strides\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"ksize\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_2/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_2/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_2/depthwise/ReadVariableOp\"], \"attr\": {\"strides\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/channel_padding/Pad\", \"op\": \"Pad\", \"input\": [\"StatefulPartitionedCall/model/max_pooling2d/MaxPool\", \"StatefulPartitionedCall/model/channel_padding/Pad/paddings\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"Tpaddings\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_3/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_2/depthwise\", \"StatefulPartitionedCall/model/conv2d_3/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_3/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/add_2/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_3/FusedBatchNormV3\", \"StatefulPartitionedCall/model/channel_padding/Pad\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_3/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_2/add\", \"StatefulPartitionedCall/model/p_re_lu_3/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_3/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_3/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_3/depthwise/ReadVariableOp\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_4/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_3/depthwise\", \"StatefulPartitionedCall/model/conv2d_4/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_4/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/add_3/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_4/FusedBatchNormV3\", \"StatefulPartitionedCall/model/p_re_lu_3/Relu\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_4/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_3/add\", \"StatefulPartitionedCall/model/p_re_lu_4/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_4/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_4/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_4/depthwise/ReadVariableOp\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_5/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_4/depthwise\", \"StatefulPartitionedCall/model/conv2d_5/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_5/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/add_4/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_5/FusedBatchNormV3\", \"StatefulPartitionedCall/model/p_re_lu_4/Relu\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_5/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_4/add\", \"StatefulPartitionedCall/model/p_re_lu_5/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/max_pooling2d_1/MaxPool\", \"op\": \"MaxPool\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_5/Relu\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"ksize\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"padding\": {\"s\": \"VkFMSUQ=\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_5/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_5/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_5/depthwise/ReadVariableOp\"], \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/channel_padding_1/Pad\", \"op\": \"Pad\", \"input\": [\"StatefulPartitionedCall/model/max_pooling2d_1/MaxPool\", \"StatefulPartitionedCall/model/channel_padding_1/Pad/paddings\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"Tpaddings\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_6/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_5/depthwise\", \"StatefulPartitionedCall/model/conv2d_6/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_6/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}}}, {\"name\": \"StatefulPartitionedCall/model/add_5/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_6/FusedBatchNormV3\", \"StatefulPartitionedCall/model/channel_padding_1/Pad\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_6/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_5/add\", \"StatefulPartitionedCall/model/p_re_lu_6/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_6/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_6/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_6/depthwise/ReadVariableOp\"], \"attr\": {\"padding\": {\"s\": \"U0FNRQ==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_7/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_6/depthwise\", \"StatefulPartitionedCall/model/conv2d_7/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_7/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}}}, {\"name\": \"StatefulPartitionedCall/model/add_6/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_7/FusedBatchNormV3\", \"StatefulPartitionedCall/model/p_re_lu_6/Relu\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_7/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_6/add\", \"StatefulPartitionedCall/model/p_re_lu_7/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_7/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_7/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_7/depthwise/ReadVariableOp\"], \"attr\": {\"padding\": {\"s\": \"U0FNRQ==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_8/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_7/depthwise\", \"StatefulPartitionedCall/model/conv2d_8/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_8/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/add_7/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_8/FusedBatchNormV3\", \"StatefulPartitionedCall/model/p_re_lu_7/Relu\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_8/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_7/add\", \"StatefulPartitionedCall/model/p_re_lu_8/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/max_pooling2d_2/MaxPool\", \"op\": \"MaxPool\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_8/Relu\"], \"attr\": {\"ksize\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_8/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_8/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_8/depthwise/ReadVariableOp\"], \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/channel_padding_2/Pad\", \"op\": \"Pad\", \"input\": [\"StatefulPartitionedCall/model/max_pooling2d_2/MaxPool\", \"StatefulPartitionedCall/model/channel_padding_2/Pad/paddings\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"Tpaddings\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_9/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_8/depthwise\", \"StatefulPartitionedCall/model/conv2d_9/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_9/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/add_8/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_9/FusedBatchNormV3\", \"StatefulPartitionedCall/model/channel_padding_2/Pad\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_9/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_8/add\", \"StatefulPartitionedCall/model/p_re_lu_9/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_9/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_9/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_9/depthwise/ReadVariableOp\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_10/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_9/depthwise\", \"StatefulPartitionedCall/model/conv2d_10/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_10/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/add_9/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_10/FusedBatchNormV3\", \"StatefulPartitionedCall/model/p_re_lu_9/Relu\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_10/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_9/add\", \"StatefulPartitionedCall/model/p_re_lu_10/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_10/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_10/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_10/depthwise/ReadVariableOp\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_11/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_10/depthwise\", \"StatefulPartitionedCall/model/conv2d_11/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_11/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}}}, {\"name\": \"StatefulPartitionedCall/model/add_10/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_11/FusedBatchNormV3\", \"StatefulPartitionedCall/model/p_re_lu_10/Relu\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_11/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_10/add\", \"StatefulPartitionedCall/model/p_re_lu_11/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/max_pooling2d_3/MaxPool\", \"op\": \"MaxPool\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_11/Relu\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"ksize\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"padding\": {\"s\": \"VkFMSUQ=\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_11/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_11/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_11/depthwise/ReadVariableOp\"], \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_12/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_11/depthwise\", \"StatefulPartitionedCall/model/conv2d_12/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_12/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}}}, {\"name\": \"StatefulPartitionedCall/model/add_11/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_12/FusedBatchNormV3\", \"StatefulPartitionedCall/model/max_pooling2d_3/MaxPool\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_12/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_11/add\", \"StatefulPartitionedCall/model/p_re_lu_12/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_12/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_12/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_12/depthwise/ReadVariableOp\"], \"attr\": {\"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_13/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_12/depthwise\", \"StatefulPartitionedCall/model/conv2d_13/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_13/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/add_12/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_13/FusedBatchNormV3\", \"StatefulPartitionedCall/model/p_re_lu_12/Relu\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_13/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_12/add\", \"StatefulPartitionedCall/model/p_re_lu_13/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_13/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_13/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_13/depthwise/ReadVariableOp\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_14/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_13/depthwise\", \"StatefulPartitionedCall/model/conv2d_14/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_14/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/add_13/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_14/FusedBatchNormV3\", \"StatefulPartitionedCall/model/p_re_lu_13/Relu\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_14/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_13/add\", \"StatefulPartitionedCall/model/p_re_lu_14/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/max_pooling2d_4/MaxPool\", \"op\": \"MaxPool\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_14/Relu\"], \"attr\": {\"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"ksize\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_14/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_14/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_14/depthwise/ReadVariableOp\"], \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_22/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_14/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_22/depthwise/ReadVariableOp\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_18/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_14/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_18/depthwise/ReadVariableOp\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"2\", \"2\", \"1\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_15/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_14/depthwise\", \"StatefulPartitionedCall/model/conv2d_15/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_15/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_25/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_22/depthwise\", \"StatefulPartitionedCall/model/conv2d_27/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_27/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_20/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_18/depthwise\", \"StatefulPartitionedCall/model/conv2d_21/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_21/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/add_14/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_15/FusedBatchNormV3\", \"StatefulPartitionedCall/model/max_pooling2d_4/MaxPool\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/add_22/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_25/FusedBatchNormV3\", \"StatefulPartitionedCall/model/max_pooling2d_4/MaxPool\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/add_18/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_20/FusedBatchNormV3\", \"StatefulPartitionedCall/model/max_pooling2d_4/MaxPool\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_15/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_14/add\", \"StatefulPartitionedCall/model/p_re_lu_15/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_25/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_22/add\", \"StatefulPartitionedCall/model/p_re_lu_25/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_20/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_18/add\", \"StatefulPartitionedCall/model/p_re_lu_20/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_15/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_15/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_15/depthwise/ReadVariableOp\"], \"attr\": {\"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_26/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_25/Relu\", \"StatefulPartitionedCall/model/conv2d_28/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_28/Conv2D_bn_offset\", \"StatefulPartitionedCall/model/p_re_lu_26/Neg\"], \"device\": \"/device:CPU:0\", \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"2\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\", \"UHJlbHU=\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_19/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_20/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_19/depthwise/ReadVariableOp\"], \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_16/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_15/depthwise\", \"StatefulPartitionedCall/model/conv2d_16/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_16/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_21/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_19/depthwise\", \"StatefulPartitionedCall/model/conv2d_22/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_22/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/add_15/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_16/FusedBatchNormV3\", \"StatefulPartitionedCall/model/p_re_lu_15/Relu\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/add_19/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_21/FusedBatchNormV3\", \"StatefulPartitionedCall/model/p_re_lu_20/Relu\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_16/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_15/add\", \"StatefulPartitionedCall/model/p_re_lu_16/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_21/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_19/add\", \"StatefulPartitionedCall/model/p_re_lu_21/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_23/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_26/FusedBatchNormV3\", \"StatefulPartitionedCall/model/depthwise_conv2d_23/depthwise/ReadVariableOp\"], \"attr\": {\"padding\": {\"s\": \"U0FNRQ==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_27/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_23/depthwise\", \"StatefulPartitionedCall/model/conv2d_29/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_29/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_16/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_16/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_16/depthwise/ReadVariableOp\"], \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}}}, {\"name\": \"StatefulPartitionedCall/model/add_23/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_27/FusedBatchNormV3\", \"StatefulPartitionedCall/model/batch_normalization_v1_26/FusedBatchNormV3\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_20/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_21/Relu\", \"StatefulPartitionedCall/model/depthwise_conv2d_20/depthwise/ReadVariableOp\"], \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_17/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_16/depthwise\", \"StatefulPartitionedCall/model/conv2d_17/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_17/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_27/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_23/add\", \"StatefulPartitionedCall/model/p_re_lu_27/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_22/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_20/depthwise\", \"StatefulPartitionedCall/model/conv2d_23/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_23/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/add_16/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_17/FusedBatchNormV3\", \"StatefulPartitionedCall/model/p_re_lu_16/Relu\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/add_20/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_22/FusedBatchNormV3\", \"StatefulPartitionedCall/model/p_re_lu_21/Relu\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_17/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_16/add\", \"StatefulPartitionedCall/model/p_re_lu_17/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_22/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_20/add\", \"StatefulPartitionedCall/model/p_re_lu_22/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/conv2d_30/BiasAdd\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_27/Relu\", \"StatefulPartitionedCall/model/conv2d_30/Conv2D/ReadVariableOp\", \"StatefulPartitionedCall/model/conv2d_30/BiasAdd/ReadVariableOp\"], \"device\": \"/device:CPU:0\", \"attr\": {\"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"3\", \"3\", \"1\"]}}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}}}, {\"name\": \"StatefulPartitionedCall/model/activation/Sigmoid\", \"op\": \"Sigmoid\", \"input\": [\"StatefulPartitionedCall/model/conv2d_30/BiasAdd\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_18/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_17/Relu\", \"StatefulPartitionedCall/model/conv2d_18/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_18/Conv2D_bn_offset\", \"StatefulPartitionedCall/model/p_re_lu_18/Neg\"], \"device\": \"/device:CPU:0\", \"attr\": {\"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"2\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\", \"UHJlbHU=\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/output_faceflag/Reshape\", \"op\": \"Reshape\", \"input\": [\"StatefulPartitionedCall/model/activation/Sigmoid\", \"StatefulPartitionedCall/model/output_mesh/Reshape/shape\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"Tshape\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_23/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_22/Relu\", \"StatefulPartitionedCall/model/conv2d_24/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_24/Conv2D_bn_offset\", \"StatefulPartitionedCall/model/p_re_lu_23/Neg\"], \"device\": \"/device:CPU:0\", \"attr\": {\"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\", \"UHJlbHU=\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"2\"}}}, {\"name\": \"Identity_2\", \"op\": \"Identity\", \"input\": [\"StatefulPartitionedCall/model/output_faceflag/Reshape\", \"^Func/StatefulPartitionedCall/output_control_node/_204\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_17/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_18/FusedBatchNormV3\", \"StatefulPartitionedCall/model/depthwise_conv2d_17/depthwise/ReadVariableOp\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}}}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_21/depthwise\", \"op\": \"DepthwiseConv2dNative\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_23/FusedBatchNormV3\", \"StatefulPartitionedCall/model/depthwise_conv2d_21/depthwise/ReadVariableOp\"], \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"padding\": {\"s\": \"U0FNRQ==\"}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_19/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_17/depthwise\", \"StatefulPartitionedCall/model/conv2d_19/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_19/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/batch_normalization_v1_24/FusedBatchNormV3\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/depthwise_conv2d_21/depthwise\", \"StatefulPartitionedCall/model/conv2d_25/Conv2D_weights\", \"StatefulPartitionedCall/model/conv2d_25/Conv2D_bn_offset\"], \"device\": \"/device:CPU:0\", \"attr\": {\"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}, \"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}, \"num_args\": {\"i\": \"1\"}}}, {\"name\": \"StatefulPartitionedCall/model/add_17/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_19/FusedBatchNormV3\", \"StatefulPartitionedCall/model/batch_normalization_v1_18/FusedBatchNormV3\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/add_21/add\", \"op\": \"AddV2\", \"input\": [\"StatefulPartitionedCall/model/batch_normalization_v1_24/FusedBatchNormV3\", \"StatefulPartitionedCall/model/batch_normalization_v1_23/FusedBatchNormV3\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_19/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_17/add\", \"StatefulPartitionedCall/model/p_re_lu_19/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_24/Relu\", \"op\": \"Prelu\", \"input\": [\"StatefulPartitionedCall/model/add_21/add\", \"StatefulPartitionedCall/model/p_re_lu_24/Neg\"]}, {\"name\": \"StatefulPartitionedCall/model/conv2d_20/BiasAdd\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_19/Relu\", \"StatefulPartitionedCall/model/conv2d_20/Conv2D/ReadVariableOp\", \"StatefulPartitionedCall/model/conv2d_20/BiasAdd/ReadVariableOp\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"3\", \"3\", \"1\"]}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"explicit_paddings\": {\"list\": {}}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/conv2d_26/BiasAdd\", \"op\": \"_FusedConv2D\", \"input\": [\"StatefulPartitionedCall/model/p_re_lu_24/Relu\", \"StatefulPartitionedCall/model/conv2d_26/Conv2D/ReadVariableOp\", \"StatefulPartitionedCall/model/conv2d_26/BiasAdd/ReadVariableOp\"], \"device\": \"/device:CPU:0\", \"attr\": {\"dilations\": {\"list\": {\"i\": [\"1\", \"1\", \"1\", \"1\"]}}, \"T\": {\"type\": \"DT_FLOAT\"}, \"strides\": {\"list\": {\"i\": [\"1\", \"3\", \"3\", \"1\"]}}, \"data_format\": {\"s\": \"TkhXQw==\"}, \"explicit_paddings\": {\"list\": {}}, \"use_cudnn_on_gpu\": {\"b\": true}, \"num_args\": {\"i\": \"1\"}, \"epsilon\": {\"f\": 0.0}, \"padding\": {\"s\": \"VkFMSUQ=\"}, \"fused_ops\": {\"list\": {\"s\": [\"Qmlhc0FkZA==\"]}}}}, {\"name\": \"StatefulPartitionedCall/model/output_mesh/Reshape\", \"op\": \"Reshape\", \"input\": [\"StatefulPartitionedCall/model/conv2d_20/BiasAdd\", \"StatefulPartitionedCall/model/output_mesh/Reshape/shape\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"Tshape\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"StatefulPartitionedCall/model/output_contours/Reshape\", \"op\": \"Reshape\", \"input\": [\"StatefulPartitionedCall/model/conv2d_26/BiasAdd\", \"StatefulPartitionedCall/model/output_mesh/Reshape/shape\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}, \"Tshape\": {\"type\": \"DT_INT32\"}}}, {\"name\": \"Identity\", \"op\": \"Identity\", \"input\": [\"StatefulPartitionedCall/model/output_mesh/Reshape\", \"^Func/StatefulPartitionedCall/output_control_node/_204\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}, {\"name\": \"Identity_1\", \"op\": \"Identity\", \"input\": [\"StatefulPartitionedCall/model/output_contours/Reshape\", \"^Func/StatefulPartitionedCall/output_control_node/_204\"], \"attr\": {\"T\": {\"type\": \"DT_FLOAT\"}}}], \"versions\": {\"producer\": 134}}, \"weightsManifest\": [{\"paths\": [\"group1-shard1of1.bin\"], \"weights\": [{\"name\": \"StatefulPartitionedCall/model/conv2d/Conv2D_weights\", \"shape\": [3, 3, 3, 16], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d/Conv2D_bn_offset\", \"shape\": [16], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_1/Conv2D_weights\", \"shape\": [1, 1, 16, 16], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_1/Conv2D_bn_offset\", \"shape\": [16], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_2/Conv2D_weights\", \"shape\": [1, 1, 16, 16], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_2/Conv2D_bn_offset\", \"shape\": [16], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_3/Conv2D_weights\", \"shape\": [1, 1, 16, 32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_19/Conv2D_weights\", \"shape\": [1, 1, 32, 32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_3/Conv2D_bn_offset\", \"shape\": [32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_4/Conv2D_weights\", \"shape\": [1, 1, 32, 32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_4/Conv2D_bn_offset\", \"shape\": [32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_5/Conv2D_weights\", \"shape\": [1, 1, 32, 32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_19/Conv2D_bn_offset\", \"shape\": [32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_5/Conv2D_bn_offset\", \"shape\": [32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_6/Conv2D_weights\", \"shape\": [1, 1, 32, 64], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_6/Conv2D_bn_offset\", \"shape\": [64], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_7/Conv2D_weights\", \"shape\": [1, 1, 64, 64], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_7/Conv2D_bn_offset\", \"shape\": [64], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_8/Conv2D_weights\", \"shape\": [1, 1, 64, 64], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_8/Conv2D_bn_offset\", \"shape\": [64], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_9/Conv2D_weights\", \"shape\": [1, 1, 64, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_9/Conv2D_bn_offset\", \"shape\": [128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_10/Conv2D_weights\", \"shape\": [1, 1, 128, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_10/Conv2D_bn_offset\", \"shape\": [128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_11/Conv2D_weights\", \"shape\": [1, 1, 128, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_11/Conv2D_bn_offset\", \"shape\": [128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_12/Conv2D_weights\", \"shape\": [1, 1, 128, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_12/Conv2D_bn_offset\", \"shape\": [128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_13/Conv2D_weights\", \"shape\": [1, 1, 128, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_13/Conv2D_bn_offset\", \"shape\": [128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_14/Conv2D_weights\", \"shape\": [1, 1, 128, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_14/Conv2D_bn_offset\", \"shape\": [128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_15/Conv2D_weights\", \"shape\": [1, 1, 128, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_15/Conv2D_bn_offset\", \"shape\": [128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_27/Conv2D_weights\", \"shape\": [1, 1, 128, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_27/Conv2D_bn_offset\", \"shape\": [128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_21/Conv2D_weights\", \"shape\": [1, 1, 128, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_25/Conv2D_weights\", \"shape\": [1, 1, 32, 32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_21/Conv2D_bn_offset\", \"shape\": [128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_28/Conv2D_weights\", \"shape\": [1, 1, 128, 32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_28/Conv2D_bn_offset\", \"shape\": [32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_16/Conv2D_weights\", \"shape\": [1, 1, 128, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_25/Conv2D_bn_offset\", \"shape\": [32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_16/Conv2D_bn_offset\", \"shape\": [128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_22/Conv2D_weights\", \"shape\": [1, 1, 128, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_22/Conv2D_bn_offset\", \"shape\": [128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_29/Conv2D_weights\", \"shape\": [1, 1, 32, 32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_29/Conv2D_bn_offset\", \"shape\": [32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_17/Conv2D_weights\", \"shape\": [1, 1, 128, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_17/Conv2D_bn_offset\", \"shape\": [128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_23/Conv2D_weights\", \"shape\": [1, 1, 128, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_23/Conv2D_bn_offset\", \"shape\": [128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_18/Conv2D_weights\", \"shape\": [1, 1, 128, 32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_18/Conv2D_bn_offset\", \"shape\": [32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_24/Conv2D_weights\", \"shape\": [1, 1, 128, 32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_24/Conv2D_bn_offset\", \"shape\": [32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu/Neg\", \"shape\": [1, 1, 16], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d/depthwise/ReadVariableOp\", \"shape\": [3, 3, 16, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_1/Neg\", \"shape\": [1, 1, 16], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_1/depthwise/ReadVariableOp\", \"shape\": [3, 3, 16, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_2/Neg\", \"shape\": [1, 1, 16], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/channel_padding/Pad/paddings\", \"shape\": [4, 2], \"dtype\": \"int32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_2/depthwise/ReadVariableOp\", \"shape\": [3, 3, 16, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_3/Neg\", \"shape\": [1, 1, 32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_3/depthwise/ReadVariableOp\", \"shape\": [3, 3, 32, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_4/Neg\", \"shape\": [1, 1, 32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_4/depthwise/ReadVariableOp\", \"shape\": [3, 3, 32, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_5/Neg\", \"shape\": [1, 1, 32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/channel_padding_1/Pad/paddings\", \"shape\": [4, 2], \"dtype\": \"int32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_5/depthwise/ReadVariableOp\", \"shape\": [3, 3, 32, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_6/Neg\", \"shape\": [1, 1, 64], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_6/depthwise/ReadVariableOp\", \"shape\": [3, 3, 64, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_7/Neg\", \"shape\": [1, 1, 64], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_7/depthwise/ReadVariableOp\", \"shape\": [3, 3, 64, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_8/Neg\", \"shape\": [1, 1, 64], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/channel_padding_2/Pad/paddings\", \"shape\": [4, 2], \"dtype\": \"int32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_8/depthwise/ReadVariableOp\", \"shape\": [3, 3, 64, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_9/Neg\", \"shape\": [1, 1, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_9/depthwise/ReadVariableOp\", \"shape\": [3, 3, 128, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_10/Neg\", \"shape\": [1, 1, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_10/depthwise/ReadVariableOp\", \"shape\": [3, 3, 128, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_11/Neg\", \"shape\": [1, 1, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_11/depthwise/ReadVariableOp\", \"shape\": [3, 3, 128, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_12/Neg\", \"shape\": [1, 1, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_12/depthwise/ReadVariableOp\", \"shape\": [3, 3, 128, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_13/Neg\", \"shape\": [1, 1, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_13/depthwise/ReadVariableOp\", \"shape\": [3, 3, 128, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_14/Neg\", \"shape\": [1, 1, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_14/depthwise/ReadVariableOp\", \"shape\": [3, 3, 128, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_15/Neg\", \"shape\": [1, 1, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_15/depthwise/ReadVariableOp\", \"shape\": [3, 3, 128, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_16/Neg\", \"shape\": [1, 1, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_16/depthwise/ReadVariableOp\", \"shape\": [3, 3, 128, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_17/Neg\", \"shape\": [1, 1, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_18/Neg\", \"shape\": [1, 1, 32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_17/depthwise/ReadVariableOp\", \"shape\": [3, 3, 32, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_19/Neg\", \"shape\": [1, 1, 32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_20/Conv2D/ReadVariableOp\", \"shape\": [3, 3, 32, 1404], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_20/BiasAdd/ReadVariableOp\", \"shape\": [1404], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/output_mesh/Reshape/shape\", \"shape\": [2], \"dtype\": \"int32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_22/depthwise/ReadVariableOp\", \"shape\": [3, 3, 128, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_23/depthwise/ReadVariableOp\", \"shape\": [3, 3, 32, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_30/BiasAdd/ReadVariableOp\", \"shape\": [1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_30/Conv2D/ReadVariableOp\", \"shape\": [3, 3, 32, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_18/depthwise/ReadVariableOp\", \"shape\": [3, 3, 128, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_27/Neg\", \"shape\": [1, 1, 32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_19/depthwise/ReadVariableOp\", \"shape\": [3, 3, 128, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_20/Neg\", \"shape\": [1, 1, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_26/Neg\", \"shape\": [1, 1, 32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_21/Neg\", \"shape\": [1, 1, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_26/BiasAdd/ReadVariableOp\", \"shape\": [266], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_20/depthwise/ReadVariableOp\", \"shape\": [3, 3, 128, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_22/Neg\", \"shape\": [1, 1, 128], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/conv2d_26/Conv2D/ReadVariableOp\", \"shape\": [3, 3, 32, 266], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/depthwise_conv2d_21/depthwise/ReadVariableOp\", \"shape\": [3, 3, 32, 1], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_23/Neg\", \"shape\": [1, 1, 32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_24/Neg\", \"shape\": [1, 1, 32], \"dtype\": \"float32\"}, {\"name\": \"StatefulPartitionedCall/model/p_re_lu_25/Neg\", \"shape\": [1, 1, 128], \"dtype\": \"float32\"}]}]}"
  },
  {
    "path": "lib/tracky-mouse/core/lib/facemesh/facemesh.js",
    "content": "getModelURL = (modelName) => `${location.href.replace(/\\/[^/]*$/, \"\")}/lib/facemesh/${modelName}/model.json`;\n/**\n    * @license\n    * Copyright 2020 Google LLC. All Rights Reserved.\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!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?e(exports,require(\"@tensorflow/tfjs-core\"),require(\"@tensorflow/tfjs-converter\")):\"function\"==typeof define&&define.amd?define([\"exports\",\"@tensorflow/tfjs-core\",\"@tensorflow/tfjs-converter\"],e):e((t=t||self).facemesh={},t.tf,t.tf)}(this,(function(t,e,n){\"use strict\";var o=function(){return(o=Object.assign||function(t){for(var e,n=1,o=arguments.length;n<o;n++)for(var r in e=arguments[n])Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}).apply(this,arguments)};function r(t,e,n,o){return new(n||(n=Promise))((function(r,i){function s(t){try{c(o.next(t))}catch(t){i(t)}}function a(t){try{c(o.throw(t))}catch(t){i(t)}}function c(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,a)}c((o=o.apply(t,e||[])).next())}))}function i(t,e){var n,o,r,i,s={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},\"function\"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError(\"Generator is already executing.\");for(;s;)try{if(n=1,o&&(r=2&i[0]?o.return:i[0]?o.throw||((r=o.return)&&r.call(o),0):o.next)&&!(r=r.call(o,i[1])).done)return r;switch(o=0,r&&(i=[2&i[0],r.value]),i[0]){case 0:case 1:r=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,o=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!(r=s.trys,(r=r.length>0&&r[r.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!r||i[1]>r[0]&&i[1]<r[3])){s.label=i[1];break}if(6===i[0]&&s.label<r[1]){s.label=r[1],r=i;break}if(r&&s.label<r[2]){s.label=r[2],s.ops.push(i);break}r[2]&&s.ops.pop(),s.trys.pop();continue}i=e.call(t,s)}catch(t){i=[6,t],o=0}finally{n=r=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}}const s=t=>({startEndTensor:t,startPoint:e.slice(t,[0,0],[-1,2]),endPoint:e.slice(t,[0,2],[-1,2])}),a={strides:[8,16],anchors:[2,6]};function c(t,n){let o,r,i;if(t.topLeft instanceof e.Tensor&&t.bottomRight instanceof e.Tensor){const[s,a]=e.tidy(()=>[e.concat([e.sub(n-1,t.topLeft.slice(0,1)),t.topLeft.slice(1,1)]),e.concat([e.sub(n-1,t.bottomRight.slice(0,1)),t.bottomRight.slice(1,1)])]);o=s,r=a,null!=t.landmarks&&(i=e.tidy(()=>{const o=e.sub(e.tensor1d([n-1,0]),t.landmarks),r=e.tensor1d([1,-1]);return e.mul(o,r)}))}else{const[e,s]=t.topLeft,[a,c]=t.bottomRight;o=[n-1-e,s],r=[n-1-a,c],null!=t.landmarks&&(i=t.landmarks.map(t=>[n-1-t[0],t[1]]))}const s={topLeft:o,bottomRight:r};return null!=i&&(s.landmarks=i),null!=t.probability&&(s.probability=t.probability instanceof e.Tensor?t.probability.clone():t.probability),s}function u(t,n){return e.tidy(()=>{let o;return o=t.hasOwnProperty(\"box\")?t.box:t,((t,n)=>{const o=e.mul(t.startPoint,n),r=e.mul(t.endPoint,n),i=e.concat2d([o,r],1);return s(i)})(o,n).startEndTensor.squeeze()})}class h{constructor(t,n,o,r,i,s){this.blazeFaceModel=t,this.width=n,this.height=o,this.maxFaces=r,this.anchorsData=function(t,e,n){const o=[];for(let r=0;r<n.strides.length;r++){const i=n.strides[r],s=Math.floor((e+i-1)/i),a=Math.floor((t+i-1)/i),c=n.anchors[r];for(let t=0;t<s;t++){const e=i*(t+.5);for(let t=0;t<a;t++){const n=i*(t+.5);for(let t=0;t<c;t++)o.push([n,e])}}}return o}(n,o,a),this.anchors=e.tensor2d(this.anchorsData),this.inputSizeData=[n,o],this.inputSize=e.tensor1d([n,o]),this.iouThreshold=i,this.scoreThreshold=s}async getBoundingBoxes(t,n,o=!0){const[r,i,a]=e.tidy(()=>{const n=t.resizeBilinear([this.width,this.height]),o=e.mul(e.sub(n.div(255),.5),2),r=this.blazeFaceModel.predict(o).squeeze(),i=function(t,n,o){const r=e.slice(t,[0,1],[-1,2]),i=e.add(r,n),s=e.slice(t,[0,3],[-1,2]),a=e.div(s,o),c=e.div(i,o),u=e.div(a,2),h=e.sub(c,u),l=e.add(c,u),d=e.mul(h,o),f=e.mul(l,o);return e.concat2d([d,f],1)}(r,this.anchors,this.inputSize),s=e.slice(r,[0,0],[-1,1]);return[r,i,e.sigmoid(s).squeeze()]}),c=console.warn;console.warn=()=>{};const u=e.image.nonMaxSuppression(i,a,this.maxFaces,this.iouThreshold,this.scoreThreshold);console.warn=c;const h=await u.array();u.dispose();let l=h.map(t=>e.slice(i,[t,0],[1,-1]));n||(l=await Promise.all(l.map(async t=>{const e=await t.array();return t.dispose(),e})));const d=t.shape[1],f=t.shape[2];let p;p=n?e.div([f,d],this.inputSize):[f/this.inputSizeData[0],d/this.inputSizeData[1]];const m=[];for(let t=0;t<l.length;t++){const i=l[t],c=e.tidy(()=>{const c=s(i instanceof e.Tensor?i:e.tensor2d(i));if(!o)return c;const u=h[t];let l;return l=n?this.anchors.slice([u,0],[1,2]):this.anchorsData[u],{box:c,landmarks:e.slice(r,[u,5],[1,-1]).squeeze().reshape([6,-1]),probability:e.slice(a,[u],[1]),anchor:l}});m.push(c)}return i.dispose(),a.dispose(),r.dispose(),{boxes:m,scaleFactor:p}}async estimateFaces(t,n=!1,o=!1,r=!0){const[,i]=function(t){return t instanceof e.Tensor?[t.shape[0],t.shape[1]]:[t.height,t.width]}(t),s=e.tidy(()=>(t instanceof e.Tensor||(t=e.browser.fromPixels(t)),t.toFloat().expandDims(0))),{boxes:a,scaleFactor:h}=await this.getBoundingBoxes(s,n,r);return s.dispose(),n?a.map(t=>{const e=u(t,h);let n={topLeft:e.slice([0],[2]),bottomRight:e.slice([2],[2])};if(r){const{landmarks:e,probability:o,anchor:r}=t,i=e.add(r).mul(h);n.landmarks=i,n.probability=o}return o&&(n=c(n,i)),n}):Promise.all(a.map(async t=>{const e=u(t,h);let n;if(r){const[o,r,i]=await Promise.all([t.landmarks,e,t.probability].map(async t=>t.array())),s=t.anchor,[a,c]=h,u=o.map(t=>[(t[0]+s[0])*a,(t[1]+s[1])*c]);n={topLeft:r.slice(0,2),bottomRight:r.slice(2),landmarks:u,probability:i},(t=>{t.startEndTensor.dispose(),t.startPoint.dispose(),t.endPoint.dispose()})(t.box),t.landmarks.dispose(),t.probability.dispose()}else{const t=await e.array();n={topLeft:t.slice(0,2),bottomRight:t.slice(2)}}return e.dispose(),o&&(n=c(n,i)),n}))}}async function l({maxFaces:t=10,inputWidth:e=128,inputHeight:o=128,iouThreshold:r=.3,scoreThreshold:i=.75}={}){const s=await n.loadGraphModel(getModelURL(\"blazeface\"),{fromTFHub:!1});return new h(s,e,o,t,r,i)}var d={silhouette:[10,338,297,332,284,251,389,356,454,323,361,288,397,365,379,378,400,377,152,148,176,149,150,136,172,58,132,93,234,127,162,21,54,103,67,109],lipsUpperOuter:[61,185,40,39,37,0,267,269,270,409,291],lipsLowerOuter:[146,91,181,84,17,314,405,321,375,291],lipsUpperInner:[78,191,80,81,82,13,312,311,310,415,308],lipsLowerInner:[78,95,88,178,87,14,317,402,318,324,308],rightEyeUpper0:[246,161,160,159,158,157,173],rightEyeLower0:[33,7,163,144,145,153,154,155,133],rightEyeUpper1:[247,30,29,27,28,56,190],rightEyeLower1:[130,25,110,24,23,22,26,112,243],rightEyeUpper2:[113,225,224,223,222,221,189],rightEyeLower2:[226,31,228,229,230,231,232,233,244],rightEyeLower3:[143,111,117,118,119,120,121,128,245],rightEyebrowUpper:[156,70,63,105,66,107,55,193],rightEyebrowLower:[35,124,46,53,52,65],leftEyeUpper0:[466,388,387,386,385,384,398],leftEyeLower0:[263,249,390,373,374,380,381,382,362],leftEyeUpper1:[467,260,259,257,258,286,414],leftEyeLower1:[359,255,339,254,253,252,256,341,463],leftEyeUpper2:[342,445,444,443,442,441,413],leftEyeLower2:[446,261,448,449,450,451,452,453,464],leftEyeLower3:[372,340,346,347,348,349,350,357,465],leftEyebrowUpper:[383,300,293,334,296,336,285,417],leftEyebrowLower:[265,353,276,283,282,295],midwayBetweenEyes:[168],noseTip:[1],noseBottom:[2],noseRightCorner:[98],noseLeftCorner:[327],rightCheek:[205],leftCheek:[425]};function f(t){return[Math.abs(t.endPoint[0]-t.startPoint[0]),Math.abs(t.endPoint[1]-t.startPoint[1])]}function p(t){return[t.startPoint[0]+(t.endPoint[0]-t.startPoint[0])/2,t.startPoint[1]+(t.endPoint[1]-t.startPoint[1])/2]}function m(t,e){void 0===e&&(e=1.5);var n=p(t),o=f(t),r=[e*o[0]/2,e*o[1]/2];return{startPoint:[n[0]-r[0],n[1]-r[1]],endPoint:[n[0]+r[0],n[1]+r[1]],landmarks:t.landmarks}}function b(t,e){var n,o=Math.PI/2-Math.atan2(-(e[1]-t[1]),e[0]-t[0]);return(n=o)-2*Math.PI*Math.floor((n+Math.PI)/(2*Math.PI))}function g(t,e){return[[1,0,t],[0,1,e],[0,0,1]]}function y(t,e){for(var n=0,o=0;o<t.length;o++)n+=t[o]*e[o];return n}function P(t,e){for(var n=[],o=0;o<t.length;o++)n.push(t[o][e]);return n}function v(t,e){for(var n=[],o=t.length,r=0;r<o;r++){n.push([]);for(var i=0;i<o;i++)n[r].push(y(t[r],P(e,i)))}return n}function w(t,e){var n=Math.cos(t),o=Math.sin(t),r=[[n,-o,0],[o,n,0],[0,0,1]],i=v(g(e[0],e[1]),r);return v(i,g(-e[0],-e[1]))}var x=[1,168],M=[3,2],E=function(){function t(t,e,n,o,r,i){this.regionsOfInterest=[],this.runsWithoutFaceDetector=0,this.boundingBoxDetector=t,this.meshDetector=e,this.meshWidth=n,this.meshHeight=o,this.maxContinuousChecks=r,this.maxFaces=i}return t.prototype.transformRawCoords=function(t,e,n,o){var r,i,s,a,c=this,u=f({startPoint:e.startPoint,endPoint:e.endPoint}),h=[u[0]/this.meshWidth,u[1]/this.meshHeight],l=t.map((function(t){return[h[0]*(t[0]-c.meshWidth/2),h[1]*(t[1]-c.meshHeight/2),t[2]]})),d=w(n,[0,0]),m=l.map((function(t){return function(t,e){return[y(t,e[0]),y(t,e[1])]}(t,d).concat([t[2]])})),b=(i=[[(r=o)[0][0],r[1][0]],[r[0][1],r[1][1]]],s=[r[0][2],r[1][2]],a=[-y(i[0],s),-y(i[1],s)],[i[0].concat(a[0]),i[1].concat(a[1]),[0,0,1]]),g=p({startPoint:e.startPoint,endPoint:e.endPoint}).concat([1]),P=[y(g,b[0]),y(g,b[1])];return m.map((function(t){return[t[0]+P[0],t[1]+P[1],t[2]]}))},t.prototype.predict=function(t){return r(this,void 0,void 0,(function(){var n,r,s,a,c=this;return i(this,(function(i){switch(i.label){case 0:return this.shouldUpdateRegionsOfInterest()?(!1,!0,[4,this.boundingBoxDetector.getBoundingBoxes(t,!1,!0)]):[3,2];case 1:return n=i.sent(),r=n.boxes,s=n.scaleFactor,0===r.length?(this.regionsOfInterest=[],[2,null]):(a=r.map((function(t){var e,n,r={startPoint:t.box.startPoint.squeeze().arraySync(),endPoint:t.box.endPoint.squeeze().arraySync()},i=m((n=s,{startPoint:[(e=r).startPoint[0]*n[0],e.startPoint[1]*n[1]],endPoint:[e.endPoint[0]*n[0],e.endPoint[1]*n[1]]}));return o({},i,{landmarks:t.landmarks.arraySync()})})),r.forEach((function(t){null!=t&&null!=t.startPoint&&(t.startEndTensor.dispose(),t.startPoint.dispose(),t.endPoint.dispose())})),this.updateRegionsOfInterest(a),this.runsWithoutFaceDetector=0,[3,3]);case 2:this.runsWithoutFaceDetector++,i.label=3;case 3:return[2,e.tidy((function(){return c.regionsOfInterest.map((function(n,r){var i;if(468===n.landmarks.length){var s=x[0],a=x[1];i=b(n.landmarks[s],n.landmarks[a])}else{s=M[0],a=M[1];i=b(n.landmarks[s],n.landmarks[a])}var u=p({startPoint:n.startPoint,endPoint:n.endPoint}),h=[u[0]/t.shape[2],u[1]/t.shape[1]],l=e.image.rotateWithOffset(t,i,0,h),d=w(-i,u),f=function(t,n,o){var r=n.shape[1],i=n.shape[2],s=[[t.startPoint[1]/r,t.startPoint[0]/i,t.endPoint[1]/r,t.endPoint[0]/i]];return e.image.cropAndResize(n,s,[0],o)}({startPoint:n.startPoint,endPoint:n.endPoint},l,[c.meshHeight,c.meshWidth]).div(255),m=c.meshDetector.predict(f),g=m[1],y=m[2],P=e.reshape(y,[-1,3]),v=P.arraySync(),E=c.transformRawCoords(v,n,i,d),L=e.tensor2d(E),k=c.calculateLandmarksBoundingBox(E);return c.regionsOfInterest[r]=o({},k,{landmarks:L.arraySync()}),{coords:P,scaledCoords:L,box:k,flag:g.squeeze()}}))}))]}}))}))},t.prototype.updateRegionsOfInterest=function(t){for(var e=0;e<t.length;e++){var n=t[e],o=this.regionsOfInterest[e],r=0;if(o&&o.startPoint){var i=n.startPoint,s=i[0],a=i[1],c=n.endPoint,u=c[0],h=c[1],l=o.startPoint,d=l[0],f=l[1],p=o.endPoint,m=p[0],b=p[1],g=Math.max(s,d),y=Math.max(a,f),P=(Math.min(u,m)-g)*(Math.min(h,b)-y);r=P/((u-s)*(h-a)+(m-d)*(b-a)-P)}r<.25&&(this.regionsOfInterest[e]=n)}this.regionsOfInterest=this.regionsOfInterest.slice(0,t.length)},t.prototype.clearRegionOfInterest=function(t){null!=this.regionsOfInterest[t]&&(this.regionsOfInterest=this.regionsOfInterest.slice(0,t).concat(this.regionsOfInterest.slice(t+1)))},t.prototype.shouldUpdateRegionsOfInterest=function(){var t=this.regionsOfInterest.length,e=0===t;return 1===this.maxFaces||e?e:t!==this.maxFaces&&this.runsWithoutFaceDetector>=this.maxContinuousChecks},t.prototype.calculateLandmarksBoundingBox=function(t){var e=t.map((function(t){return t[0]})),n=t.map((function(t){return t[1]})),o={startPoint:[Math.min.apply(Math,e),Math.min.apply(Math,n)],endPoint:[Math.max.apply(Math,e),Math.max.apply(Math,n)]};return m({startPoint:o.startPoint,endPoint:o.endPoint})},t}(),L=[[.499976992607117,.652534008026123],[.500025987625122,.547487020492554],[.499974012374878,.602371990680695],[.482113003730774,.471979022026062],[.500150978565216,.527155995368958],[.499909996986389,.498252987861633],[.499523013830185,.40106201171875],[.289712011814117,.380764007568359],[.499954998493195,.312398016452789],[.499987006187439,.269918978214264],[.500023007392883,.107050001621246],[.500023007392883,.666234016418457],[.5000159740448,.679224014282227],[.500023007392883,.692348003387451],[.499976992607117,.695277988910675],[.499976992607117,.70593398809433],[.499976992607117,.719385027885437],[.499976992607117,.737019002437592],[.499967992305756,.781370997428894],[.499816000461578,.562981009483337],[.473773002624512,.573909997940063],[.104906998574734,.254140973091125],[.365929991006851,.409575998783112],[.338757991790771,.41302502155304],[.311120003461838,.409460008144379],[.274657994508743,.389131009578705],[.393361985683441,.403706014156342],[.345234006643295,.344011008739471],[.370094001293182,.346076011657715],[.319321990013123,.347265005111694],[.297903001308441,.353591024875641],[.24779200553894,.410809993743896],[.396889001131058,.842755019664764],[.280097991228104,.375599980354309],[.106310002505779,.399955987930298],[.2099249958992,.391353011131287],[.355807989835739,.534406006336212],[.471751004457474,.65040397644043],[.474155008792877,.680191993713379],[.439785003662109,.657229006290436],[.414617002010345,.66654098033905],[.450374007225037,.680860996246338],[.428770989179611,.682690978050232],[.374971002340317,.727805018424988],[.486716985702515,.547628998756409],[.485300987958908,.527395009994507],[.257764995098114,.314490020275116],[.401223003864288,.455172002315521],[.429818987846375,.548614978790283],[.421351999044418,.533740997314453],[.276895999908447,.532056987285614],[.483370006084442,.499586999416351],[.33721199631691,.282882988452911],[.296391993761063,.293242990970612],[.169294998049736,.193813979625702],[.447580009698868,.302609980106354],[.392390012741089,.353887975215912],[.354490011930466,.696784019470215],[.067304998636246,.730105042457581],[.442739009857178,.572826027870178],[.457098007202148,.584792017936707],[.381974011659622,.694710969924927],[.392388999462128,.694203019142151],[.277076005935669,.271932005882263],[.422551989555359,.563233017921448],[.385919004678726,.281364023685455],[.383103013038635,.255840003490448],[.331431001424789,.119714021682739],[.229923993349075,.232002973556519],[.364500999450684,.189113974571228],[.229622006416321,.299540996551514],[.173287004232407,.278747975826263],[.472878992557526,.666198015213013],[.446828007698059,.668527007102966],[.422762006521225,.673889994621277],[.445307999849319,.580065965652466],[.388103008270264,.693961024284363],[.403039008378983,.706539988517761],[.403629004955292,.693953037261963],[.460041999816895,.557139039039612],[.431158006191254,.692366003990173],[.452181994915009,.692366003990173],[.475387006998062,.692366003990173],[.465828001499176,.779190003871918],[.472328990697861,.736225962638855],[.473087012767792,.717857003211975],[.473122000694275,.704625964164734],[.473033010959625,.695277988910675],[.427942007780075,.695277988910675],[.426479011774063,.703539967536926],[.423162013292313,.711845993995667],[.4183090031147,.720062971115112],[.390094995498657,.639572978019714],[.013953999616206,.560034036636353],[.499913990497589,.58014702796936],[.413199990987778,.69539999961853],[.409626007080078,.701822996139526],[.468080013990402,.601534962654114],[.422728985548019,.585985004901886],[.463079988956451,.593783974647522],[.37211999297142,.47341400384903],[.334562003612518,.496073007583618],[.411671012639999,.546965003013611],[.242175996303558,.14767599105835],[.290776997804642,.201445996761322],[.327338010072708,.256527006626129],[.399509996175766,.748921036720276],[.441727995872498,.261676013469696],[.429764986038208,.187834024429321],[.412198007106781,.108901023864746],[.288955003023148,.398952007293701],[.218936994671822,.435410976409912],[.41278201341629,.398970007896423],[.257135003805161,.355440020561218],[.427684992551804,.437960982322693],[.448339998722076,.536936044692993],[.178560003638268,.45755398273468],[.247308000922203,.457193970680237],[.286267012357712,.467674970626831],[.332827985286713,.460712015628815],[.368755996227264,.447206974029541],[.398963987827301,.432654976844788],[.476410001516342,.405806005001068],[.189241006970406,.523923993110657],[.228962004184723,.348950982093811],[.490725994110107,.562400996685028],[.404670000076294,.485132992267609],[.019469000399113,.401564002037048],[.426243007183075,.420431017875671],[.396993011236191,.548797011375427],[.266469985246658,.376977026462555],[.439121007919312,.51895797252655],[.032313998788595,.644356966018677],[.419054001569748,.387154996395111],[.462783008813858,.505746960639954],[.238978996872902,.779744982719421],[.198220998048782,.831938028335571],[.107550002634525,.540755033493042],[.183610007166862,.740257024765015],[.134409993886948,.333683013916016],[.385764002799988,.883153975009918],[.490967005491257,.579378008842468],[.382384985685349,.508572995662689],[.174399003386497,.397670984268188],[.318785011768341,.39623498916626],[.343364000320435,.400596976280212],[.396100014448166,.710216999053955],[.187885001301765,.588537991046906],[.430987000465393,.944064974784851],[.318993002176285,.898285031318665],[.266247987747192,.869701027870178],[.500023007392883,.190576016902924],[.499976992607117,.954452991485596],[.366169989109039,.398822009563446],[.393207013607025,.39553701877594],[.410373002290726,.391080021858215],[.194993004202843,.342101991176605],[.388664990663528,.362284004688263],[.365961998701096,.355970978736877],[.343364000320435,.355356991291046],[.318785011768341,.35834002494812],[.301414996385574,.363156020641327],[.058132998645306,.319076001644135],[.301414996385574,.387449026107788],[.499987989664078,.618434011936188],[.415838003158569,.624195992946625],[.445681989192963,.566076993942261],[.465844005346298,.620640993118286],[.49992299079895,.351523995399475],[.288718998432159,.819945991039276],[.335278987884521,.852819979190826],[.440512001514435,.902418971061707],[.128294005990028,.791940987110138],[.408771991729736,.373893976211548],[.455606997013092,.451801002025604],[.499877005815506,.908990025520325],[.375436991453171,.924192011356354],[.11421000212431,.615022003650665],[.448662012815475,.695277988910675],[.4480200111866,.704632043838501],[.447111994028091,.715808033943176],[.444831997156143,.730794012546539],[.430011987686157,.766808986663818],[.406787008047104,.685672998428345],[.400738000869751,.681069016456604],[.392399996519089,.677703022956848],[.367855995893478,.663918972015381],[.247923001646996,.601333022117615],[.452769994735718,.420849978923798],[.43639200925827,.359887003898621],[.416164010763168,.368713974952698],[.413385987281799,.692366003990173],[.228018000721931,.683571994304657],[.468268007040024,.352671027183533],[.411361992359161,.804327011108398],[.499989002943039,.469825029373169],[.479153990745544,.442654013633728],[.499974012374878,.439637005329132],[.432112008333206,.493588984012604],[.499886006116867,.866917014122009],[.49991300702095,.821729004383087],[.456548988819122,.819200992584229],[.344549000263214,.745438992977142],[.37890899181366,.574010014533997],[.374292999505997,.780184984207153],[.319687992334366,.570737957954407],[.357154995203018,.604269981384277],[.295284003019333,.621580958366394],[.447750002145767,.862477004528046],[.410986006259918,.508723020553589],[.31395098567009,.775308012962341],[.354128003120422,.812552988529205],[.324548006057739,.703992962837219],[.189096003770828,.646299958229065],[.279776990413666,.71465802192688],[.1338230073452,.682700991630554],[.336768001317978,.644733011722565],[.429883986711502,.466521978378296],[.455527991056442,.548622965812683],[.437114000320435,.558896005153656],[.467287987470627,.529924988746643],[.414712011814117,.335219979286194],[.37704598903656,.322777986526489],[.344107985496521,.320150971412659],[.312875986099243,.32233202457428],[.283526003360748,.333190023899078],[.241245999932289,.382785975933075],[.102986000478268,.468762993812561],[.267612010240555,.424560010433197],[.297879010438919,.433175981044769],[.333433985710144,.433878004550934],[.366427004337311,.426115989685059],[.396012008190155,.416696012020111],[.420121014118195,.41022801399231],[.007561000064015,.480777025222778],[.432949006557465,.569517970085144],[.458638995885849,.479089021682739],[.473466008901596,.545744001865387],[.476087987422943,.563830018043518],[.468472003936768,.555056989192963],[.433990985155106,.582361996173859],[.483518004417419,.562983989715576],[.482482999563217,.57784903049469],[.42645001411438,.389798998832703],[.438998997211456,.39649498462677],[.450067013502121,.400434017181396],[.289712011814117,.368252992630005],[.276670008897781,.363372981548309],[.517862021923065,.471948027610779],[.710287988185883,.380764007568359],[.526226997375488,.573909997940063],[.895093023777008,.254140973091125],[.634069979190826,.409575998783112],[.661242008209229,.41302502155304],[.688880026340485,.409460008144379],[.725341975688934,.389131009578705],[.606630027294159,.40370500087738],[.654766023159027,.344011008739471],[.629905998706818,.346076011657715],[.680678009986877,.347265005111694],[.702096998691559,.353591024875641],[.75221198797226,.410804986953735],[.602918028831482,.842862963676453],[.719901978969574,.375599980354309],[.893692970275879,.399959981441498],[.790081977844238,.391354024410248],[.643998026847839,.534487962722778],[.528249025344849,.65040397644043],[.525849997997284,.680191040039062],[.560214996337891,.657229006290436],[.585384011268616,.66654098033905],[.549625992774963,.680860996246338],[.57122802734375,.682691991329193],[.624852001667023,.72809898853302],[.513050019741058,.547281980514526],[.51509702205658,.527251958847046],[.742246985435486,.314507007598877],[.598631024360657,.454979002475739],[.570338010787964,.548575043678284],[.578631997108459,.533622980117798],[.723087012767792,.532054007053375],[.516445994377136,.499638974666595],[.662801027297974,.282917976379395],[.70362401008606,.293271005153656],[.830704987049103,.193813979625702],[.552385985851288,.302568018436432],[.607609987258911,.353887975215912],[.645429015159607,.696707010269165],[.932694971561432,.730105042457581],[.557260990142822,.572826027870178],[.542901992797852,.584792017936707],[.6180260181427,.694710969924927],[.607590973377228,.694203019142151],[.722943007946014,.271963000297546],[.577413976192474,.563166975975037],[.614082992076874,.281386971473694],[.616907000541687,.255886018276215],[.668509006500244,.119913995265961],[.770092010498047,.232020974159241],[.635536015033722,.189248979091644],[.77039098739624,.299556016921997],[.826722025871277,.278755009174347],[.527121007442474,.666198015213013],[.553171992301941,.668527007102966],[.577238023281097,.673889994621277],[.554691970348358,.580065965652466],[.611896991729736,.693961024284363],[.59696102142334,.706539988517761],[.596370995044708,.693953037261963],[.539958000183105,.557139039039612],[.568841993808746,.692366003990173],[.547818005084991,.692366003990173],[.52461302280426,.692366003990173],[.534089982509613,.779141008853912],[.527670979499817,.736225962638855],[.526912987232208,.717857003211975],[.526877999305725,.704625964164734],[.526966989040375,.695277988910675],[.572058022022247,.695277988910675],[.573521018028259,.703539967536926],[.57683801651001,.711845993995667],[.581691026687622,.720062971115112],[.609944999217987,.639909982681274],[.986046016216278,.560034036636353],[.5867999792099,.69539999961853],[.590372025966644,.701822996139526],[.531915009021759,.601536989212036],[.577268004417419,.585934996604919],[.536915004253387,.593786001205444],[.627542972564697,.473352015018463],[.665585994720459,.495950996875763],[.588353991508484,.546862006187439],[.757824003696442,.14767599105835],[.709249973297119,.201507985591888],[.672684013843536,.256581008434296],[.600408971309662,.74900496006012],[.55826598405838,.261672019958496],[.570303976535797,.187870979309082],[.588165998458862,.109044015407562],[.711045026779175,.398952007293701],[.781069993972778,.435405015945435],[.587247014045715,.398931980133057],[.742869973182678,.355445981025696],[.572156012058258,.437651991844177],[.55186802148819,.536570012569427],[.821442008018494,.457556009292603],[.752701997756958,.457181990146637],[.71375697851181,.467626988887787],[.66711300611496,.460672974586487],[.631101012229919,.447153985500336],[.6008620262146,.432473003864288],[.523481011390686,.405627012252808],[.810747981071472,.523926019668579],[.771045982837677,.348959028720856],[.509127020835876,.562718033790588],[.595292985439301,.485023975372314],[.980530977249146,.401564002037048],[.573499977588654,.420000016689301],[.602994978427887,.548687994480133],[.733529984951019,.376977026462555],[.560611009597778,.519016981124878],[.967685997486115,.644356966018677],[.580985009670258,.387160003185272],[.537728011608124,.505385041236877],[.760966002941132,.779752969741821],[.801778972148895,.831938028335571],[.892440974712372,.54076099395752],[.816350996494293,.740260004997253],[.865594983100891,.333687007427216],[.614073991775513,.883246004581451],[.508952975273132,.579437971115112],[.617941975593567,.508316040039062],[.825608015060425,.397674977779388],[.681214988231659,.39623498916626],[.656635999679565,.400596976280212],[.603900015354156,.710216999053955],[.81208598613739,.588539004325867],[.56801301240921,.944564998149872],[.681007981300354,.898285031318665],[.733752012252808,.869701027870178],[.633830010890961,.398822009563446],[.606792986392975,.39553701877594],[.589659988880157,.391062021255493],[.805015981197357,.342108011245728],[.611334979534149,.362284004688263],[.634037971496582,.355970978736877],[.656635999679565,.355356991291046],[.681214988231659,.35834002494812],[.698584973812103,.363156020641327],[.941866993904114,.319076001644135],[.698584973812103,.387449026107788],[.584177017211914,.624107003211975],[.554318010807037,.566076993942261],[.534153997898102,.62064003944397],[.711217999458313,.819975018501282],[.664629995822906,.852871000766754],[.559099972248077,.902631998062134],[.871706008911133,.791940987110138],[.591234028339386,.373893976211548],[.544341027736664,.451583981513977],[.624562978744507,.924192011356354],[.88577002286911,.615028977394104],[.551338016986847,.695277988910675],[.551980018615723,.704632043838501],[.552887976169586,.715808033943176],[.555167973041534,.730794012546539],[.569944024085999,.767035007476807],[.593203008174896,.685675978660583],[.599261999130249,.681069016456604],[.607599973678589,.677703022956848],[.631937980651855,.663500010967255],[.752032995223999,.601315021514893],[.547226011753082,.420395016670227],[.563543975353241,.359827995300293],[.583841025829315,.368713974952698],[.586614012718201,.692366003990173],[.771915018558502,.683578014373779],[.531597018241882,.352482974529266],[.588370978832245,.804440975189209],[.52079701423645,.442565023899078],[.567984998226166,.493479013442993],[.543282985687256,.819254994392395],[.655317008495331,.745514988899231],[.621008992195129,.574018001556396],[.625559985637665,.78031200170517],[.680198013782501,.570719003677368],[.64276397228241,.604337990283966],[.704662978649139,.621529996395111],[.552012026309967,.862591981887817],[.589071989059448,.508637011051178],[.685944974422455,.775357007980347],[.645735025405884,.812640011310577],[.675342977046967,.703978002071381],[.810858011245728,.646304965019226],[.72012197971344,.714666962623596],[.866151988506317,.682704985141754],[.663187026977539,.644596993923187],[.570082008838654,.466325998306274],[.544561982154846,.548375964164734],[.562758982181549,.558784961700439],[.531987011432648,.530140042304993],[.585271000862122,.335177004337311],[.622952997684479,.32277899980545],[.655896008014679,.320163011550903],[.687132000923157,.322345972061157],[.716481983661652,.333200991153717],[.758756995201111,.382786989212036],[.897013008594513,.468769013881683],[.732392013072968,.424547016620636],[.70211398601532,.433162987232208],[.66652500629425,.433866024017334],[.633504986763,.426087975502014],[.603875994682312,.416586995124817],[.579657971858978,.409945011138916],[.992439985275269,.480777025222778],[.567192018032074,.569419980049133],[.54136598110199,.478899002075195],[.526564002037048,.546118021011353],[.523913025856018,.563830018043518],[.531529009342194,.555056989192963],[.566035985946655,.582329034805298],[.51631098985672,.563053965568542],[.5174720287323,.577877044677734],[.573594987392426,.389806985855103],[.560697972774506,.395331978797913],[.549755990505219,.399751007556915],[.710287988185883,.368252992630005],[.723330020904541,.363372981548309]];function k(t,e,n){return r(this,void 0,void 0,(function(){return i(this,(function(o){return[2,l({maxFaces:t,iouThreshold:e,scoreThreshold:n})]}))}))}function O(){return r(this,void 0,void 0,(function(){return i(this,(function(t){return[2,n.loadGraphModel(getModelURL(\"facemesh\"),{fromTFHub:!1})]}))}))}function B(t,n){if(t.mesh instanceof e.Tensor){var o=e.tidy((function(){var o=e.tensor1d([n-1,0,0]),r=e.tensor1d([1,-1,1]);return e.tidy((function(){return[e.concat([e.sub(n-1,t.boundingBox.topLeft.slice(0,1)),t.boundingBox.topLeft.slice(1,1)]),e.concat([e.sub(n-1,t.boundingBox.bottomRight.slice(0,1)),t.boundingBox.bottomRight.slice(1,1)]),e.sub(o,t.mesh).mul(r),e.sub(o,t.scaledMesh).mul(r)]}))})),r=o[0],i=o[1],s=o[2],a=o[3];return Object.assign({},t,{boundingBox:{topLeft:r,bottomRight:i},mesh:s,scaledMesh:a})}return Object.assign({},t,{boundingBox:{topLeft:[n-1-t.boundingBox.topLeft[0],t.boundingBox.topLeft[1]],bottomRight:[n-1-t.boundingBox.bottomRight[0],t.boundingBox.bottomRight[1]]},mesh:t.mesh.map((function(t){var e=t.slice(0);return e[0]=n-1-t[0],e})),scaledMesh:t.scaledMesh.map((function(t){var e=t.slice(0);return e[0]=n-1-t[0],e}))})}var I=function(){function t(t,e,n,o,r){this.pipeline=new E(t,e,192,192,n,r),this.detectionConfidence=o}return t.getAnnotations=function(){return d},t.getUVCoords=function(){return L},t.prototype.estimateFaces=function(t,n,o){return void 0===n&&(n=!1),void 0===o&&(o=!1),r(this,void 0,void 0,(function(){var s,a,c,u,h,l=this;return i(this,(function(f){switch(f.label){case 0:return s=function(t){return t instanceof e.Tensor?[t.shape[0],t.shape[1]]:[t.height,t.width]}(t),a=s[1],c=e.tidy((function(){return t instanceof e.Tensor||(t=e.browser.fromPixels(t)),t.toFloat().expandDims(0)})),\"webgl\"!==e.getBackend()?[3,2]:(h=e.env().get(\"WEBGL_PACK_DEPTHWISECONV\"),e.env().set(\"WEBGL_PACK_DEPTHWISECONV\",!0),[4,this.pipeline.predict(c)]);case 1:return u=f.sent(),e.env().set(\"WEBGL_PACK_DEPTHWISECONV\",h),[3,4];case 2:return[4,this.pipeline.predict(c)];case 3:u=f.sent(),f.label=4;case 4:return c.dispose(),null!=u&&u.length>0?[2,Promise.all(u.map((function(t,s){return r(l,void 0,void 0,(function(){var c,u,h,l,f,p,m,b,g,y,P,v,w,x,M=this;return i(this,(function(E){switch(E.label){case 0:return c=t.coords,u=t.scaledCoords,h=t.box,l=t.flag,f=[l],n||(f=f.concat([c,u])),[4,Promise.all(f.map((function(t){return r(M,void 0,void 0,(function(){return i(this,(function(e){return[2,t.array()]}))}))})))];case 1:if(p=E.sent(),m=p[0],l.dispose(),m<this.detectionConfidence&&this.pipeline.clearRegionOfInterest(s),n)return b={faceInViewConfidence:m,mesh:c,scaledMesh:u,boundingBox:{topLeft:e.tensor1d(h.startPoint),bottomRight:e.tensor1d(h.endPoint)}},o?[2,B(b,a)]:[2,b];for(x in g=p.slice(1),y=g[0],P=g[1],u.dispose(),c.dispose(),v={faceInViewConfidence:m,boundingBox:{topLeft:h.startPoint,bottomRight:h.endPoint},mesh:y,scaledMesh:P},o&&(v=B(v,a)),w={},d)w[x]=d[x].map((function(t){return v.scaledMesh[t]}));return v.annotations=w,[2,v]}}))}))})))]:[2,[]]}}))}))},t}();t.FaceMesh=I,t.load=function(t){var e=void 0===t?{}:t,n=e.maxContinuousChecks,o=void 0===n?5:n,s=e.detectionConfidence,a=void 0===s?.9:s,c=e.maxFaces,u=void 0===c?10:c,h=e.iouThreshold,l=void 0===h?.3:h,d=e.scoreThreshold,f=void 0===d?.75:d;return r(this,void 0,void 0,(function(){var t,e,n;return i(this,(function(r){switch(r.label){case 0:return[4,Promise.all([k(u,l,f),O()])];case 1:return t=r.sent(),e=t[0],n=t[1],[2,new I(e,n,o,a,u)]}}))}))},Object.defineProperty(t,\"__esModule\",{value:!0})}));\n"
  },
  {
    "path": "lib/tracky-mouse/core/lib/jsfeat-min.js",
    "content": "var jsfeat=jsfeat||{REVISION:\"ALPHA\"};(function(r){var o=1.192092896e-7;var l=1e-37;var m=256,i=512,h=1024,x=2048,w=4096;var A=1,n=2,b=3,p=4;var z=new Int32Array([-1,1,4,-1,4,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,8]);var y=(function(){return function(B){return(B&65280)}})();var k=(function(){return function(B){return(B&255)}})();var c=(function(){return function(B){return z[(B&65280)>>8]}})();var a=0;var f=1;var e=2;var u=3;var d=1;var s=1;var g=2;var v=(function(){function B(D,C){this.size=((D+7)|0)&-8;if(typeof C===\"undefined\"){this.buffer=new ArrayBuffer(this.size)}else{this.buffer=C;this.size=C.length}this.u8=new Uint8Array(this.buffer);this.i32=new Int32Array(this.buffer);this.f32=new Float32Array(this.buffer);this.f64=new Float64Array(this.buffer)}return B})();var q=(function(){function B(F,D,E,C){this.type=y(E)|0;this.channel=k(E)|0;this.cols=F|0;this.rows=D|0;if(typeof C===\"undefined\"){this.allocate()}else{this.buffer=C;this.data=this.type&m?this.buffer.u8:(this.type&i?this.buffer.i32:(this.type&h?this.buffer.f32:this.buffer.f64))}}B.prototype.allocate=function(){delete this.data;delete this.buffer;this.buffer=new v((this.cols*c(this.type)*this.channel)*this.rows);this.data=this.type&m?this.buffer.u8:(this.type&i?this.buffer.i32:(this.type&h?this.buffer.f32:this.buffer.f64))};B.prototype.copy_to=function(D){var C=D.data,G=this.data;var E=0,F=(this.cols*this.rows*this.channel)|0;for(;E<F-4;E+=4){C[E]=G[E];C[E+1]=G[E+1];C[E+2]=G[E+2];C[E+3]=G[E+3]}for(;E<F;++E){C[E]=G[E]}};B.prototype.resize=function(F,D,C){if(typeof C===\"undefined\"){C=this.channel}var E=(F*c(this.type)*C)*D;if(E>this.buffer.size){this.cols=F;this.rows=D;this.channel=C;this.allocate()}else{this.cols=F;this.rows=D;this.channel=C}};return B})();var t=(function(){function B(C){this.levels=C|0;this.data=new Array(C);this.pyrdown=jsfeat.imgproc.pyrdown}B.prototype.allocate=function(C,E,F){var D=this.levels;while(--D>=0){this.data[D]=new q(C>>D,E>>D,F)}};B.prototype.build=function(F,E){if(typeof E===\"undefined\"){E=true}var H=2,D=F,C=this.data[0];if(!E){var G=F.cols*F.rows;while(--G>=0){C.data[G]=F.data[G]}}C=this.data[1];this.pyrdown(D,C);for(;H<this.levels;++H){D=C;C=this.data[H];this.pyrdown(D,C)}};return B})();var j=(function(){function B(C,G,E,F,D){if(typeof C===\"undefined\"){C=0}if(typeof G===\"undefined\"){G=0}if(typeof E===\"undefined\"){E=0}if(typeof F===\"undefined\"){F=0}if(typeof D===\"undefined\"){D=-1}this.x=C;this.y=G;this.score=E;this.level=F;this.angle=D}return B})();r.U8_t=m;r.S32_t=i;r.F32_t=h;r.S64_t=x;r.F64_t=w;r.C1_t=A;r.C2_t=n;r.C3_t=b;r.C4_t=p;r.U8C1_t=m|A;r.U8C3_t=m|b;r.U8C4_t=m|p;r.F32C1_t=h|A;r.F32C2_t=h|n;r.S32C1_t=i|A;r.S32C2_t=i|n;r.EPSILON=o;r.FLT_MIN=l;r.COLOR_RGBA2GRAY=a;r.COLOR_RGB2GRAY=f;r.COLOR_BGRA2GRAY=e;r.COLOR_BGR2GRAY=u;r.BOX_BLUR_NOSCALE=d;r.SVD_U_T=s;r.SVD_V_T=g;r.get_data_type=y;r.get_channel=k;r.get_data_type_size=c;r.data_t=v;r.matrix_t=q;r.pyramid_t=t;r.keypoint_t=j})(jsfeat);(function(b){var a=(function(){var f=(function(){function g(h){this.next=null;this.data=new jsfeat.data_t(h);this.size=this.data.size;this.buffer=this.data.buffer;this.u8=this.data.u8;this.i32=this.data.i32;this.f32=this.data.f32;this.f64=this.data.f64}g.prototype.resize=function(h){delete this.data;this.data=new jsfeat.data_t(h);this.size=this.data.size;this.buffer=this.data.buffer;this.u8=this.data.u8;this.i32=this.data.i32;this.f32=this.data.f32;this.f64=this.data.f64};return g})();var e,c;var d=0;return{allocate:function(g,k){e=c=new f(k);for(var h=0;h<g;++h){var j=new f(k);c=c.next=j;d++}},get_buffer:function(g){var h=e;e=e.next;d--;if(g>h.size){h.resize(g)}return h},put_buffer:function(g){c=c.next=g;d++}}})();b.cache=a;a.allocate(30,640*4)})(jsfeat);(function(b){var a=(function(){var c=new Int32Array(48*2);return{get_gaussian_kernel:function(p,m,e,l){var f=0,j=0,o=0,n=0,d=0;var g=0;var h=jsfeat.cache.get_buffer(p<<2);var k=h.f32;if((p&1)==1&&p<=7&&m<=0){switch(p>>1){case 0:k[0]=1;g=1;break;case 1:k[0]=0.25,k[1]=0.5,k[2]=0.25;g=0.25+0.5+0.25;break;case 2:k[0]=0.0625,k[1]=0.25,k[2]=0.375,k[3]=0.25,k[4]=0.0625;g=0.0625+0.25+0.375+0.25+0.0625;break;case 3:k[0]=0.03125,k[1]=0.109375,k[2]=0.21875,k[3]=0.28125,k[4]=0.21875,k[5]=0.109375,k[6]=0.03125;g=0.03125+0.109375+0.21875+0.28125+0.21875+0.109375+0.03125;break}}else{n=m>0?m:((p-1)*0.5-1)*0.3+0.8;d=-0.5/(n*n);for(;f<p;++f){j=f-(p-1)*0.5;o=Math.exp(d*j*j);k[f]=o;g+=o}}if(l&jsfeat.U8_t){g=256/g;for(f=0;f<p;++f){e[f]=(k[f]*g+0.5)|0}}else{g=1/g;for(f=0;f<p;++f){e[f]=k[f]*g}}jsfeat.cache.put_buffer(h)},perspective_4point_transform:function(x,B,r,w,g,A,q,v,f,z,p,u,e,y,o,t,d){var Y=B;var X=z;var W=q;var V=Y*X*W;var U=o;var T=Y*U;var S=X*T;var R=p;var n=Y*R;var m=A;var k=r;var j=y;var i=k*j;var h=i*m;var ax=j*m*R;var aw=j*W;var aq=j*R;var ao=X*W;var am=U*X;var aj=U*m;var ag=R*m;var Q=1/(aw-aq-ao+am-aj+ag);var O=Y*j;var N=k*m;var M=W*Y;var L=U*M;var K=k*X;var I=i*R;var G=k*R*m;var D=W*U*X;var C=U*k;var av=-(S-V+n*m-m*T-i*X+h-ax+aw*X)*Q;var au=(V-S-O*W+O*R+h-X*N+aj*X-ax)*Q;var ar=Y;var ap=(-R*T+L+K*W-i*W+I-G+aj*R-D)*Q;var an=(-L+M*R-C*X+I-G+C*m+D-aw*R)*Q;var al=k;var ai=(-n+M+K-N+aq-aw-am+aj)*Q;var af=(-T+n+i-K+aj-ag-aw+ao)*Q;Y=w;X=u;W=f;V=Y*X*W;U=d;T=Y*U;S=X*T;R=e;n=Y*R;m=v;k=g;j=t;i=k*j;h=i*m;ax=j*m*R;aw=j*W;aq=j*R;ao=X*W;am=U*X;aj=U*m;ag=R*m;Q=1/(aw-aq-ao+am-aj+ag);O=Y*j;N=k*m;M=W*Y;L=U*M;K=k*X;I=i*R;G=k*R*m;D=W*U*X;C=U*k;var ak=-(S-V+n*m-m*T-i*X+h-ax+aw*X)*Q;var ah=(V-S-O*W+O*R+h-X*N+aj*X-ax)*Q;var ae=Y;var ad=(-R*T+L+K*W-i*W+I-G+aj*R-D)*Q;var ac=(-L+M*R-C*X+I-G+C*m+D-aw*R)*Q;var ab=k;var aa=(-n+M+K-N+aq-aw-am+aj)*Q;var Z=(-T+n+i-K+aj-ag-aw+ao)*Q;X=an-af*al;W=av*an;V=av*al;T=ap*au;S=ar*ap;n=au*ai;var l=ar*ai;j=1/(W-V*af-T+S*af+n*al-l*an);h=-ap+al*ai;var at=-ap*af+an*ai;ag=-au+ar*af;var P=av-l;N=av*af-n;M=-au*al+ar*an;var J=V-S;var H=W-T;G=X*j;var F=ag*j;var E=M*j;var s=x.data;s[0]=ak*G+ah*(h*j)-ae*(at*j);s[1]=ak*F+ah*(P*j)-ae*(N*j);s[2]=-ak*E-ah*(J*j)+ae*(H*j);s[3]=ad*G+ac*(h*j)-ab*(at*j);s[4]=ad*F+ac*(P*j)-ab*(N*j);s[5]=-ad*E-ac*(J*j)+ab*(H*j);s[6]=aa*G+Z*(h*j)-at*j;s[7]=aa*F+Z*(P*j)-N*j;s[8]=-aa*E-Z*(J*j)+H*j},qsort:function(o,J,s,u){var D=7;var v,r,q,p;var C=0,j=0,G=0,B=0,z=0,A=0,e=0,y=0,E=0;var x=0,w=0,h=0,g=0,l=0,I=0,H=0,F=0,f=0;var k=c;if((s-J+1)<=1){return}k[0]=J;k[1]=s;while(C>=0){j=k[C<<1];G=k[(C<<1)+1];C--;for(;;){z=(G-j)+1;if(z<=D){for(e=j+1;e<=G;e++){for(y=e;y>j&&u(o[y],o[y-1]);y--){v=o[y];o[y]=o[y-1];o[y-1]=v}}break}else{f=0;x=j;h=G;l=j+(z>>1);if(z>40){E=z>>3;I=j,H=j+E,F=j+(E<<1);r=o[I],q=o[H],p=o[F];j=u(r,q)?(u(q,p)?H:(u(r,p)?F:I)):(u(p,q)?H:(u(r,p)?I:F));I=l-E,H=l,F=l+E;r=o[I],q=o[H],p=o[F];l=u(r,q)?(u(q,p)?H:(u(r,p)?F:I)):(u(p,q)?H:(u(r,p)?I:F));I=G-(E<<1),H=G-E,F=G;r=o[I],q=o[H],p=o[F];G=u(r,q)?(u(q,p)?H:(u(r,p)?F:I)):(u(p,q)?H:(u(r,p)?I:F))}I=j,H=l,F=G;r=o[I],q=o[H],p=o[F];l=u(r,q)?(u(q,p)?H:(u(r,p)?F:I)):(u(p,q)?H:(u(r,p)?I:F));if(l!=x){v=o[l];o[l]=o[x];o[x]=v;l=x}j=w=x+1;G=g=h;r=o[l];for(;;){while(j<=G&&!u(r,o[j])){if(!u(o[j],r)){if(j>w){v=o[w];o[w]=o[j];o[j]=v}f=1;w++}j++}while(j<=G&&!u(o[G],r)){if(!u(r,o[G])){if(G<g){v=o[g];o[g]=o[G];o[G]=v}f=1;g--}G--}if(j>G){break}v=o[j];o[j]=o[G];o[G]=v;f=1;j++;G--}if(f==0){j=x,G=h;for(e=j+1;e<=G;e++){for(y=e;y>j&&u(o[y],o[y-1]);y--){v=o[y];o[y]=o[y-1];o[y-1]=v}}break}z=Math.min((w-x),(j-w));A=(j-z)|0;for(B=0;B<z;++B,++A){v=o[x+B];o[x+B]=o[A];o[A]=v}z=Math.min((h-g),(g-G));A=(h-z+1)|0;for(B=0;B<z;++B,++A){v=o[j+B];o[j+B]=o[A];o[A]=v}z=(j-w);A=(g-G);if(z>1){if(A>1){if(z>A){++C;k[C<<1]=x;k[(C<<1)+1]=x+z-1;j=h-A+1,G=h}else{++C;k[C<<1]=h-A+1;k[(C<<1)+1]=h;j=x,G=x+z-1}}else{j=x,G=x+z-1}}else{if(A>1){j=h-A+1,G=h}else{break}}}}}},median:function(k,d,i){var e;var f=0,j=0,g=0,h=(d+i)>>1;for(;;){if(i<=d){return k[h]}if(i==(d+1)){if(k[d]>k[i]){e=k[d];k[d]=k[i];k[i]=e}return k[h]}f=((d+i)>>1);if(k[f]>k[i]){e=k[f];k[f]=k[i];k[i]=e}if(k[d]>k[i]){e=k[d];k[d]=k[i];k[i]=e}if(k[f]>k[d]){e=k[f];k[f]=k[d];k[d]=e}j=(d+1);e=k[f];k[f]=k[j];k[j]=e;g=i;for(;;){do{++j}while(k[d]>k[j]);do{--g}while(k[g]>k[d]);if(g<j){break}e=k[j];k[j]=k[g];k[g]=e}e=k[d];k[d]=k[g];k[g]=e;if(g<=h){d=j}else{if(g>=h){i=(g-1)}}}return 0}}})();b.math=a})(jsfeat);(function(b){var a=(function(){return{identity:function(j,g){if(typeof g===\"undefined\"){g=1}var i=j.data;var f=j.rows,h=j.cols,e=(h+1)|0;var c=f*h;var d=c;while(--c>=0){i[c]=0}c=d;d=0;while(d<c){i[d]=g;d=d+e}},transpose:function(f,d){var l=0,h=0,k=d.rows,c=d.cols;var n=0,e=0,m=0;var o=d.data,g=f.data;for(;l<k;e+=1,n+=c,l++){m=e;for(h=0;h<c;m+=k,h++){g[m]=o[n+h]}}},multiply:function(l,n,m){var u=0,s=0,o=0;var r=0,t=0,q=0,w=0,g=0;var f=n.cols,e=n.rows,p=m.cols;var v=n.data,d=m.data,h=l.data;var c=0;for(;u<e;r+=f,u++){for(w=0,s=0;s<p;g++,w++,s++){q=w;t=r;c=0;for(o=0;o<f;t++,q+=p,o++){c+=v[t]*d[q]}h[g]=c}}},multiply_ABt:function(c,g,d){var p=0,n=0,m=0;var r=0,l=0,f=0,u=0;var e=g.cols,o=g.rows,q=d.rows;var v=g.data,t=d.data,h=c.data;var s=0;for(;p<o;r+=e,p++){for(f=0,n=0;n<q;u++,n++){l=r;s=0;for(m=0;m<e;l++,f++,m++){s+=v[l]*t[f]}h[u]=s}}},multiply_AtB:function(l,n,m){var u=0,s=0,o=0;var r=0,t=0,q=0,w=0,g=0;var f=n.cols,e=n.rows,p=m.cols;var v=n.data,d=m.data,h=l.data;var c=0;for(;u<f;r++,u++){for(w=0,s=0;s<p;g++,w++,s++){q=w;t=r;c=0;for(o=0;o<e;t+=f,q+=p,o++){c+=v[t]*d[q]}h[g]=c}}},multiply_AAt:function(d,h){var q=0,o=0,n=0;var c=0,r=0,m=0,g=0,e=0,u=0;var f=h.cols,p=h.rows;var t=h.data,l=d.data;var s=0;for(;q<p;c+=p+1,r=m,q++){e=c;u=c;g=r;for(o=q;o<p;e++,u+=p,o++){m=r;s=0;for(n=0;n<f;n++){s+=t[m++]*t[g++]}l[e]=s;l[u]=s}}},multiply_AtA:function(c,g){var r=0,p=0,n=0;var s=0,m=0,f=0,o=0,d=0,l=0;var e=g.cols,q=g.rows;var u=g.data,h=c.data;var t=0;for(;r<e;o+=e,r++){s=r;l=o+r;d=l;for(p=r;p<e;d++,l+=e,p++){m=s;f=p;t=0;for(n=0;n<q;m+=e,f+=e,n++){t+=u[m]*u[f]}h[d]=t;h[l]=t}}},identity_3x3:function(e,d){if(typeof d===\"undefined\"){d=1}var c=e.data;c[0]=c[4]=c[8]=d;c[1]=c[2]=c[3]=0;c[5]=c[6]=c[7]=0},invert_3x3:function(s,e){var o=s.data,h=e.data;var n=o[4];var m=o[8];var l=o[5];var k=o[7];var j=o[0];var i=j*n;var v=j*l;var u=o[3];var t=o[1];var r=u*t;var q=o[2];var p=u*q;var g=o[6];var f=g*t;var d=g*q;var c=1/(i*m-v*k-r*m+p*k+f*l-d*n);h[0]=(n*m-l*k)*c;h[1]=-(t*m-q*k)*c;h[2]=-(-t*l+q*n)*c;h[3]=-(u*m-l*g)*c;h[4]=(j*m-d)*c;h[5]=-(v-p)*c;h[6]=-(-u*k+n*g)*c;h[7]=-(j*k-f)*c;h[8]=(i-r)*c},multiply_3x3:function(r,v,t){var y=r.data,z=v.data,l=t.data;var x=z[0],w=z[1],u=z[2];var s=z[3],q=z[4],p=z[5];var o=z[6],n=z[7],m=z[8];var k=l[0],j=l[1],i=l[2];var h=l[3],g=l[4],f=l[5];var e=l[6],d=l[7],c=l[8];y[0]=x*k+w*h+u*e;y[1]=x*j+w*g+u*d;y[2]=x*i+w*f+u*c;y[3]=s*k+q*h+p*e;y[4]=s*j+q*g+p*d;y[5]=s*i+q*f+p*c;y[6]=o*k+n*h+m*e;y[7]=o*j+n*g+m*d;y[8]=o*i+n*f+m*c},mat3x3_determinant:function(d){var c=d.data;return c[0]*c[4]*c[8]-c[0]*c[5]*c[7]-c[3]*c[1]*c[8]+c[3]*c[2]*c[7]+c[6]*c[1]*c[5]-c[6]*c[2]*c[4]},determinant_3x3:function(h,g,f,e,d,c,k,j,i){return h*d*i-h*c*j-e*g*i+e*f*j+k*g*c-k*f*d}}})();b.matmath=a})(jsfeat);(function(b){var a=(function(){var f=function(g,j,i,h){h=g[j];g[j]=g[i];g[i]=h};var d=function(h,g){h=Math.abs(h);g=Math.abs(g);if(h>g){g/=h;return h*Math.sqrt(1+g*g)}if(g>0){h/=g;return g*Math.sqrt(1+h*h)}return 0};var c=function(H,o,q,r,h,I){var C=jsfeat.EPSILON;var N=0,M=0,L=0,J=0,K=0,D=0,R=0,G=0;var u=0,v=I*I*30;var E=0,U=0,F=0,x=0,z=0,B=0,Q=0,T=0,w=0;var P=jsfeat.cache.get_buffer(I<<2);var S=jsfeat.cache.get_buffer(I<<2);var O=P.i32;var g=S.i32;if(r){for(;N<I;N++){L=N*h;for(M=0;M<I;M++){r[L+M]=0}r[L+N]=1}}for(L=0;L<I;L++){q[L]=H[(o+1)*L];if(L<I-1){for(J=L+1,E=Math.abs(H[o*L+J]),N=L+2;N<I;N++){U=Math.abs(H[o*L+N]);if(E<U){E=U,J=N}}O[L]=J}if(L>0){for(J=0,E=Math.abs(H[L]),N=1;N<L;N++){U=Math.abs(H[o*N+L]);if(E<U){E=U,J=N}}g[L]=J}}if(I>1){for(;u<v;u++){for(L=0,E=Math.abs(H[O[0]]),N=1;N<I-1;N++){U=Math.abs(H[o*N+O[N]]);if(E<U){E=U,L=N}}K=O[L];for(N=1;N<I;N++){U=Math.abs(H[o*g[N]+N]);if(E<U){E=U,L=g[N],K=N}}F=H[o*L+K];if(Math.abs(F)<=C){break}x=(q[K]-q[L])*0.5;z=Math.abs(x)+d(F,x);B=d(F,z);Q=z/B;B=F/B;z=(F/z)*F;if(x<0){B=-B,z=-z}H[o*L+K]=0;q[L]-=z;q[K]+=z;for(N=0;N<L;N++){R=(o*N+L);G=(o*N+K);T=H[R];w=H[G];H[R]=T*Q-w*B;H[G]=T*B+w*Q}for(N=(L+1);N<K;N++){R=(o*L+N);G=(o*N+K);T=H[R];w=H[G];H[R]=T*Q-w*B;H[G]=T*B+w*Q}N=K+1;R=(o*L+N);G=(o*K+N);for(;N<I;N++,R++,G++){T=H[R];w=H[G];H[R]=T*Q-w*B;H[G]=T*B+w*Q}if(r){R=h*L;G=h*K;for(N=0;N<I;N++,R++,G++){T=r[R];w=r[G];r[R]=T*Q-w*B;r[G]=T*B+w*Q}}for(M=0;M<2;M++){D=M==0?L:K;if(D<I-1){for(J=D+1,E=Math.abs(H[o*D+J]),N=D+2;N<I;N++){U=Math.abs(H[o*D+N]);if(E<U){E=U,J=N}}O[D]=J}if(D>0){for(J=0,E=Math.abs(H[D]),N=1;N<D;N++){U=Math.abs(H[o*N+D]);if(E<U){E=U,J=N}}g[D]=J}}}}for(L=0;L<I-1;L++){J=L;for(N=L+1;N<I;N++){if(q[J]<q[N]){J=N}}if(L!=J){f(q,J,L,E);if(r){for(N=0;N<I;N++){f(r,h*J+N,h*L+N,E)}}}}jsfeat.cache.put_buffer(P);jsfeat.cache.put_buffer(S)};var e=function(D,l,h,M,v,T,S,E){var C=jsfeat.EPSILON*2;var q=jsfeat.FLT_MIN;var X=0,V=0,U=0,A=0,u=Math.max(T,30);var K=0,J=0,R=0,Q=0,F=0;var Y=0,O=0,N=0;var H=0,G=0,x=0,I=0,w=0,L=0,aa=0,P=0,Z=0;var z=4660;var B=0,y=0,o=0;var r=jsfeat.cache.get_buffer(S<<3);var g=r.f64;for(;X<S;X++){for(U=0,x=0;U<T;U++){N=D[X*l+U];x+=N*N}g[X]=x;if(M){for(U=0;U<S;U++){M[X*v+U]=0}M[X*v+X]=1}}for(;A<u;A++){F=0;for(X=0;X<S-1;X++){for(V=X+1;V<S;V++){K=(X*l)|0,J=(V*l)|0;aa=g[X],P=0,Z=g[V];U=2;P+=D[K]*D[J];P+=D[K+1]*D[J+1];for(;U<T;U++){P+=D[K+U]*D[J+U]}if(Math.abs(P)<=C*Math.sqrt(aa*Z)){continue}P*=2;I=aa-Z,w=d(P,I);if(I<0){L=(w-I)*0.5;O=Math.sqrt(L/w);Y=(P/(w*O*2))}else{Y=Math.sqrt((w+I)/(w*2));O=(P/(w*Y*2))}aa=0,Z=0;U=2;H=Y*D[K]+O*D[J];G=-O*D[K]+Y*D[J];D[K]=H;D[J]=G;aa+=H*H;Z+=G*G;H=Y*D[K+1]+O*D[J+1];G=-O*D[K+1]+Y*D[J+1];D[K+1]=H;D[J+1]=G;aa+=H*H;Z+=G*G;for(;U<T;U++){H=Y*D[K+U]+O*D[J+U];G=-O*D[K+U]+Y*D[J+U];D[K+U]=H;D[J+U]=G;aa+=H*H;Z+=G*G}g[X]=aa;g[V]=Z;F=1;if(M){R=(X*v)|0,Q=(V*v)|0;U=2;H=Y*M[R]+O*M[Q];G=-O*M[R]+Y*M[Q];M[R]=H;M[Q]=G;H=Y*M[R+1]+O*M[Q+1];G=-O*M[R+1]+Y*M[Q+1];M[R+1]=H;M[Q+1]=G;for(;U<S;U++){H=Y*M[R+U]+O*M[Q+U];G=-O*M[R+U]+Y*M[Q+U];M[R+U]=H;M[Q+U]=G}}}}if(F==0){break}}for(X=0;X<S;X++){for(U=0,x=0;U<T;U++){N=D[X*l+U];x+=N*N}g[X]=Math.sqrt(x)}for(X=0;X<S-1;X++){V=X;for(U=X+1;U<S;U++){if(g[V]<g[U]){V=U}}if(X!=V){f(g,X,V,x);if(M){for(U=0;U<T;U++){f(D,X*l+U,V*l+U,N)}for(U=0;U<S;U++){f(M,X*v+U,V*v+U,N)}}}}for(X=0;X<S;X++){h[X]=g[X]}if(!M){jsfeat.cache.put_buffer(r);return}for(X=0;X<E;X++){x=X<S?g[X]:0;while(x<=q){y=(1/T);for(U=0;U<T;U++){z=(z*214013+2531011);B=(((z>>16)&32767)&256)!=0?y:-y;D[X*l+U]=B}for(A=0;A<2;A++){for(V=0;V<X;V++){x=0;for(U=0;U<T;U++){x+=D[X*l+U]*D[V*l+U]}o=0;for(U=0;U<T;U++){N=(D[X*l+U]-x*D[V*l+U]);D[X*l+U]=N;o+=Math.abs(N)}o=o?1/o:0;for(U=0;U<T;U++){D[X*l+U]*=o}}}x=0;for(U=0;U<T;U++){N=D[X*l+U];x+=N*N}x=Math.sqrt(x)}O=(1/x);for(U=0;U<T;U++){D[X*l+U]*=O}}jsfeat.cache.put_buffer(r)};return{lu_solve:function(l,g){var q=0,o=0,n=0,h=1,v=l.cols;var w=l.data,r=g.data;var x,m,u,y;for(q=0;q<v;q++){n=q;for(o=q+1;o<v;o++){if(Math.abs(w[o*v+q])>Math.abs(w[n*v+q])){n=o}}if(Math.abs(w[n*v+q])<jsfeat.EPSILON){return 0}if(n!=q){for(o=q;o<v;o++){f(w,q*v+o,n*v+o,x)}f(r,q,n,x);h=-h}u=-1/w[q*v+q];for(o=q+1;o<v;o++){m=w[o*v+q]*u;for(n=q+1;n<v;n++){w[o*v+n]+=m*w[q*v+n]}r[o]+=m*r[q]}w[q*v+q]=-u}for(q=v-1;q>=0;q--){y=r[q];for(n=q+1;n<v;n++){y-=w[q*v+n]*r[n]}r[q]=y*w[q*v+q]}return 1},cholesky_solve:function(h,g){var l=0,v=0,r=0,s=0,n=0,p=0,o=0;var u=h.cols;var t=h.data,q=g.data;var k,m;for(l=0;l<u;l++){m=1;s=(l*u);n=s;for(v=l;v<u;v++){k=t[(n+l)];for(r=0;r<l;r++){k-=t[(r*u+l)]*t[(n+r)]}if(v==l){t[(n+l)]=k;if(k==0){return 0}m=1/k}else{t[(s+v)]=k;t[(n+l)]=k*m}n=(n+u)}}s=0;for(p=0;p<u;p++){k=q[p];for(o=0;o<p;o++){k-=t[(s+o)]*q[o]}q[p]=k;s=(s+u)}s=0;for(p=0;p<u;p++){q[p]/=t[(s+p)];s=(s+u)}p=(u-1);for(;p>=0;p--){k=q[p];o=(p+1);s=(o*u);for(;o<u;o++){k-=t[(s+p)]*q[o];s=(s+u)}q[p]=k}return 1},svd_decompose:function(t,k,p,l,o){if(typeof o===\"undefined\"){o=0}var r=0,z=0,x=0,g=t.rows,D=t.cols,w=g,v=D;var s=t.type|jsfeat.C1_t;if(w<v){r=1;z=w;w=v;v=z}var q=jsfeat.cache.get_buffer((w*w)<<3);var h=jsfeat.cache.get_buffer(v<<3);var C=jsfeat.cache.get_buffer((v*v)<<3);var u=new jsfeat.matrix_t(w,w,s,q.data);var B=new jsfeat.matrix_t(1,v,s,h.data);var y=new jsfeat.matrix_t(v,v,s,C.data);if(r==0){jsfeat.matmath.transpose(u,t)}else{for(z=0;z<D*g;z++){u.data[z]=t.data[z]}for(;z<v*w;z++){u.data[z]=0}}e(u.data,w,B.data,y.data,v,w,v,w);if(k){for(z=0;z<v;z++){k.data[z]=B.data[z]}for(;z<D;z++){k.data[z]=0}}if(r==0){if(p&&(o&jsfeat.SVD_U_T)){z=w*w;while(--z>=0){p.data[z]=u.data[z]}}else{if(p){jsfeat.matmath.transpose(p,u)}}if(l&&(o&jsfeat.SVD_V_T)){z=v*v;while(--z>=0){l.data[z]=y.data[z]}}else{if(l){jsfeat.matmath.transpose(l,y)}}}else{if(p&&(o&jsfeat.SVD_U_T)){z=v*v;while(--z>=0){p.data[z]=y.data[z]}}else{if(p){jsfeat.matmath.transpose(p,y)}}if(l&&(o&jsfeat.SVD_V_T)){z=w*w;while(--z>=0){l.data[z]=u.data[z]}}else{if(l){jsfeat.matmath.transpose(l,u)}}}jsfeat.cache.put_buffer(q);jsfeat.cache.put_buffer(h);jsfeat.cache.put_buffer(C)},svd_solve:function(v,l,s){var E=0,C=0,z=0;var w=0,u=0;var o=v.rows,p=v.cols;var h=0,I=0,x=0;var r=v.type|jsfeat.C1_t;var F=jsfeat.cache.get_buffer((o*o)<<3);var m=jsfeat.cache.get_buffer(p<<3);var H=jsfeat.cache.get_buffer((p*p)<<3);var t=new jsfeat.matrix_t(o,o,r,F.data);var G=new jsfeat.matrix_t(1,p,r,m.data);var D=new jsfeat.matrix_t(p,p,r,H.data);var n=s.data,y=t.data,q=G.data,g=D.data;this.svd_decompose(v,G,t,D,0);x=jsfeat.EPSILON*q[0]*p;for(;E<p;E++,u+=p){I=0;for(C=0;C<p;C++){if(q[C]>x){for(z=0,h=0,w=0;z<o;z++,w+=p){h+=y[w+C]*n[z]}I+=h*g[u+C]/q[C]}}l.data[E]=I}jsfeat.cache.put_buffer(F);jsfeat.cache.put_buffer(m);jsfeat.cache.put_buffer(H)},svd_invert:function(E,t){var C=0,z=0,y=0;var v=0,s=0,h=0;var n=t.rows,o=t.cols;var l=0,w=0;var q=t.type|jsfeat.C1_t;var D=jsfeat.cache.get_buffer((n*n)<<3);var m=jsfeat.cache.get_buffer(o<<3);var G=jsfeat.cache.get_buffer((o*o)<<3);var u=new jsfeat.matrix_t(n,n,q,D.data);var F=new jsfeat.matrix_t(1,o,q,m.data);var B=new jsfeat.matrix_t(o,o,q,G.data);var r=E.data,x=u.data,p=F.data,g=B.data;this.svd_decompose(t,F,u,B,0);w=jsfeat.EPSILON*p[0]*o;for(;C<o;C++,s+=o){for(z=0,v=0;z<n;z++,h++){for(y=0,l=0;y<o;y++,v++){if(p[y]>w){l+=g[s+y]*x[v]/p[y]}}r[h]=l}}jsfeat.cache.put_buffer(D);jsfeat.cache.put_buffer(m);jsfeat.cache.put_buffer(G)},eigenVV:function(j,p,r){var k=j.cols,m=k*k;var g=j.type|jsfeat.C1_t;var o=jsfeat.cache.get_buffer((k*k)<<3);var h=jsfeat.cache.get_buffer(k<<3);var l=new jsfeat.matrix_t(k,k,g,o.data);var q=new jsfeat.matrix_t(1,k,g,h.data);while(--m>=0){l.data[m]=j.data[m]}c(l.data,k,q.data,p?p.data:null,k,k);if(r){while(--k>=0){r.data[k]=q.data[k]}}jsfeat.cache.put_buffer(o);jsfeat.cache.put_buffer(h)}}})();b.linalg=a})(jsfeat);(function(a){var c=(function(){var m=function(p){return p*p};var e=function(z,A,x,w,u){var t=0;var y=0,s=0,q=0,C=0;var v=0,r=0,p=0,B=0;var E=0,D=0;for(;t<u;++t){y+=z[t].x;s+=z[t].y;v+=A[t].x;r+=A[t].y}y/=u;s/=u;v/=u;r/=u;for(t=0;t<u;++t){E=z[t].x-y;D=z[t].y-s;q+=Math.sqrt(E*E+D*D);E=A[t].x-v;D=A[t].y-r;p+=Math.sqrt(E*E+D*D)}q/=u;p/=u;C=Math.SQRT2/q;B=Math.SQRT2/p;x[0]=x[4]=C;x[2]=-y*C;x[5]=-s*C;x[1]=x[3]=x[6]=x[7]=0;x[8]=1;w[0]=w[4]=B;w[2]=-v*B;w[5]=-r*B;w[1]=w[3]=w[6]=w[7]=0;w[8]=1};var h=function(x,u){var q=0,p=0,r=(u-1)|0;var w=0,t=0,v=0,s=0;for(;q<r;++q){w=x[q].x-x[r].x;t=x[q].y-x[r].y;for(p=0;p<q;++p){v=x[p].x-x[r].x;s=x[p].y-x[r].y;if(Math.abs(v*t-s*w)<=jsfeat.EPSILON*(Math.abs(w)+Math.abs(t)+Math.abs(v)+Math.abs(s))){return true}}}return false};var k=new jsfeat.matrix_t(3,3,jsfeat.F32_t|jsfeat.C1_t);var i=new jsfeat.matrix_t(3,3,jsfeat.F32_t|jsfeat.C1_t);var o=new jsfeat.matrix_t(6,6,jsfeat.F32_t|jsfeat.C1_t);var n=new jsfeat.matrix_t(6,1,jsfeat.F32_t|jsfeat.C1_t);var j=(function(){function p(){}p.prototype.run=function(D,q,r,t){var G=0,F=0;var B=r.type|jsfeat.C1_t;var J=r.data,v=k.data,E=i.data;var x,w,A=0,z=0;e(D,q,v,E,t);var u=jsfeat.cache.get_buffer((2*t*6)<<3);var y=jsfeat.cache.get_buffer((2*t)<<3);var C=new jsfeat.matrix_t(6,2*t,B,u.data);var H=new jsfeat.matrix_t(1,2*t,B,y.data);var I=C.data,s=H.data;for(;G<t;++G){x=D[G];w=q[G];A=v[0]*x.x+v[1]*x.y+v[2];z=v[3]*x.x+v[4]*x.y+v[5];F=G*2*6;I[F]=A,I[F+1]=z,I[F+2]=1,I[F+3]=0,I[F+4]=0,I[F+5]=0;F+=6;I[F]=0,I[F+1]=0,I[F+2]=0,I[F+3]=A,I[F+4]=z,I[F+5]=1;s[G<<1]=E[0]*w.x+E[1]*w.y+E[2];s[(G<<1)+1]=E[3]*w.x+E[4]*w.y+E[5]}jsfeat.matmath.multiply_AtA(o,C);jsfeat.matmath.multiply_AtB(n,C,H);jsfeat.linalg.lu_solve(o,n);J[0]=n.data[0],J[1]=n.data[1],J[2]=n.data[2];J[3]=n.data[3],J[4]=n.data[4],J[5]=n.data[5];J[6]=0,J[7]=0,J[8]=1;jsfeat.matmath.invert_3x3(i,i);jsfeat.matmath.multiply_3x3(r,i,r);jsfeat.matmath.multiply_3x3(r,r,k);jsfeat.cache.put_buffer(u);jsfeat.cache.put_buffer(y);return 1};p.prototype.error=function(v,w,t,r,u){var s=0;var y,x;var q=t.data;for(;s<u;++s){y=v[s];x=w[s];r[s]=m(x.x-q[0]*y.x-q[1]*y.y-q[2])+m(x.y-q[3]*y.x-q[4]*y.y-q[5])}};p.prototype.check_subset=function(s,r,q){return true};return p})();var g=new jsfeat.matrix_t(9,9,jsfeat.F32_t|jsfeat.C1_t);var f=new jsfeat.matrix_t(9,9,jsfeat.F32_t|jsfeat.C1_t);var l=(function(){function p(){}p.prototype.run=function(I,r,v,C){var L=0,K=0;var O=v.data,D=k.data,J=i.data;var M=g.data,N=f.data;var H=0,G=0,s=0,q=0;var u=0,t=0,B=0,A=0,z=0,w=0,F=0,E=0;for(;L<C;++L){B+=r[L].x;A+=r[L].y;F+=I[L].x;E+=I[L].y}B/=C;A/=C;F/=C;E/=C;for(L=0;L<C;++L){u+=Math.abs(r[L].x-B);t+=Math.abs(r[L].y-A);z+=Math.abs(I[L].x-F);w+=Math.abs(I[L].y-E)}if(Math.abs(u)<jsfeat.EPSILON||Math.abs(t)<jsfeat.EPSILON||Math.abs(z)<jsfeat.EPSILON||Math.abs(w)<jsfeat.EPSILON){return 0}u=C/u;t=C/t;z=C/z;w=C/w;D[0]=z;D[1]=0;D[2]=-F*z;D[3]=0;D[4]=w;D[5]=-E*w;D[6]=0;D[7]=0;D[8]=1;J[0]=1/u;J[1]=0;J[2]=B;J[3]=0;J[4]=1/t;J[5]=A;J[6]=0;J[7]=0;J[8]=1;L=81;while(--L>=0){M[L]=0}for(L=0;L<C;++L){H=(r[L].x-B)*u;G=(r[L].y-A)*t;s=(I[L].x-F)*z;q=(I[L].y-E)*w;M[0]+=s*s;M[1]+=s*q;M[2]+=s;M[6]+=s*-H*s;M[7]+=s*-H*q;M[8]+=s*-H;M[10]+=q*q;M[11]+=q;M[15]+=q*-H*s;M[16]+=q*-H*q;M[17]+=q*-H;M[20]+=1;M[24]+=-H*s;M[25]+=-H*q;M[26]+=-H;M[30]+=s*s;M[31]+=s*q;M[32]+=s;M[33]+=s*-G*s;M[34]+=s*-G*q;M[35]+=s*-G;M[40]+=q*q;M[41]+=q;M[42]+=q*-G*s;M[43]+=q*-G*q;M[44]+=q*-G;M[50]+=1;M[51]+=-G*s;M[52]+=-G*q;M[53]+=-G;M[60]+=-H*s*-H*s+-G*s*-G*s;M[61]+=-H*s*-H*q+-G*s*-G*q;M[62]+=-H*s*-H+-G*s*-G;M[70]+=-H*q*-H*q+-G*q*-G*q;M[71]+=-H*q*-H+-G*q*-G;M[80]+=-H*-H+-G*-G}for(L=0;L<9;++L){for(K=0;K<L;++K){M[L*9+K]=M[K*9+L]}}jsfeat.linalg.eigenVV(g,f);O[0]=N[72],O[1]=N[73],O[2]=N[74];O[3]=N[75],O[4]=N[76],O[5]=N[77];O[6]=N[78],O[7]=N[79],O[8]=N[80];jsfeat.matmath.multiply_3x3(v,i,v);jsfeat.matmath.multiply_3x3(v,v,k);H=1/O[8];O[0]*=H;O[1]*=H;O[2]*=H;O[3]*=H;O[4]*=H;O[5]*=H;O[6]*=H;O[7]*=H;O[8]=1;return 1};p.prototype.error=function(w,x,u,r,v){var t=0;var z,y,s=0,B=0,A=0;var q=u.data;for(;t<v;++t){z=w[t];y=x[t];s=1/(q[6]*z.x+q[7]*z.y+1);B=(q[0]*z.x+q[1]*z.y+q[2])*s-y.x;A=(q[3]*z.x+q[4]*z.y+q[5])*s-y.y;r[t]=(B*B+A*A)}};p.prototype.check_subset=function(M,s,B){if(B==4){var N=0;var I=M[0],H=M[1],G=M[2],E=M[3];var A=s[0],y=s[1],w=s[2],u=s[3];var L=I.x,K=I.y,J=1;var V=H.x,U=H.y,T=1;var z=G.x,x=G.y,v=1;var t=A.x,r=A.y,q=1;var F=y.x,D=y.y,C=1;var Q=w.x,P=w.y,O=1;var S=jsfeat.matmath.determinant_3x3(L,K,J,V,U,T,z,x,v);var R=jsfeat.matmath.determinant_3x3(t,r,q,F,D,C,Q,P,O);if(S*R<0){N++}L=H.x,K=H.y;V=G.x,U=G.y;z=E.x,x=E.y;t=y.x,r=y.y;F=w.x,D=w.y;Q=u.x,P=u.y;S=jsfeat.matmath.determinant_3x3(L,K,J,V,U,T,z,x,v);R=jsfeat.matmath.determinant_3x3(t,r,q,F,D,C,Q,P,O);if(S*R<0){N++}L=I.x,K=I.y;V=G.x,U=G.y;z=E.x,x=E.y;t=A.x,r=A.y;F=w.x,D=w.y;Q=u.x,P=u.y;S=jsfeat.matmath.determinant_3x3(L,K,J,V,U,T,z,x,v);R=jsfeat.matmath.determinant_3x3(t,r,q,F,D,C,Q,P,O);if(S*R<0){N++}L=I.x,K=I.y;V=H.x,U=H.y;z=E.x,x=E.y;t=A.x,r=A.y;F=y.x,D=y.y;Q=u.x,P=u.y;S=jsfeat.matmath.determinant_3x3(L,K,J,V,U,T,z,x,v);R=jsfeat.matmath.determinant_3x3(t,r,q,F,D,C,Q,P,O);if(S*R<0){N++}if(N!=0&&N!=4){return false}}return true};return p})();return{affine2d:j,homography2d:l}})();var b=(function(){function e(h,i,f,g){if(typeof h===\"undefined\"){h=0}if(typeof i===\"undefined\"){i=0.5}if(typeof f===\"undefined\"){f=0.5}if(typeof g===\"undefined\"){g=0.99}this.size=h;this.thresh=i;this.eps=f;this.prob=g}e.prototype.update_iters=function(g,i){var h=Math.log(1-this.prob);var f=Math.log(1-Math.pow(1-g,this.size));return(f>=0||-h>=i*(-f)?i:Math.round(h/f))|0};return e})();var d=(function(){var e=function(l,q,r,p,t,m,g){var v=1000;var s=[];var n=0,k=0,u=0,h=0,o=false;for(;u<v;++u){n=0;for(;n<p&&u<v;){o=false;h=0;while(!o){o=true;h=s[n]=Math.floor(Math.random()*t)|0;for(k=0;k<n;++k){if(h==s[k]){o=false;break}}}m[n]=q[h];g[n]=r[h];if(!l.check_subset(m,g,n+1)){u++;continue}++n}break}return(n==p&&u<v)};var f=function(k,m,p,q,o,g,h,s){var j=0,l=0,n=0;var r=g*g;k.error(p,q,m,h,o);for(;l<o;++l){n=h[l]<=r;s[l]=n;j+=n}return j};return{ransac:function(E,m,x,i,l,j,y,g){if(typeof g===\"undefined\"){g=1000}if(l<E.size){return false}var v=E.size;var A=g,z=0;var q=false;var D=[];var C=[];var r=false;var G=j.cols,w=j.rows;var u=j.type|jsfeat.C1_t;var B=jsfeat.cache.get_buffer((G*w)<<3);var h=jsfeat.cache.get_buffer(l);var t=jsfeat.cache.get_buffer(l<<2);var o=new jsfeat.matrix_t(G,w,u,B.data);var s=new jsfeat.matrix_t(l,1,jsfeat.U8C1_t,h.data);var F=-1,p=0;var n=0;var k=t.f32;if(l==v){if(m.run(x,i,o,l)<=0){jsfeat.cache.put_buffer(B);jsfeat.cache.put_buffer(h);jsfeat.cache.put_buffer(t);return false}o.copy_to(j);if(y){while(--l>=0){y.data[l]=1}}jsfeat.cache.put_buffer(B);jsfeat.cache.put_buffer(h);jsfeat.cache.put_buffer(t);return true}for(;z<A;++z){r=e(m,x,i,v,l,D,C);if(!r){if(z==0){jsfeat.cache.put_buffer(B);jsfeat.cache.put_buffer(h);jsfeat.cache.put_buffer(t);return false}break}n=m.run(D,C,o,v);if(n<=0){continue}p=f(m,o,x,i,l,E.thresh,k,s.data);if(p>Math.max(F,v-1)){o.copy_to(j);F=p;if(y){s.copy_to(y)}A=E.update_iters((l-p)/l,A);q=true}}jsfeat.cache.put_buffer(B);jsfeat.cache.put_buffer(h);jsfeat.cache.put_buffer(t);return q},lmeds:function(H,n,z,i,l,j,B,g){if(typeof g===\"undefined\"){g=1000}if(l<H.size){return false}var w=H.size;var D=g,C=0;var r=false;var G=[];var F=[];var s=false;var I=j.cols,y=j.rows;var v=j.type|jsfeat.C1_t;var E=jsfeat.cache.get_buffer((I*y)<<3);var h=jsfeat.cache.get_buffer(l);var u=jsfeat.cache.get_buffer(l<<2);var p=new jsfeat.matrix_t(I,y,v,E.data);var t=new jsfeat.matrix_t(l,1,jsfeat.U8_t|jsfeat.C1_t,h.data);var q=0;var o=0;var k=u.f32;var A=1000000000,x=0,m=0;H.eps=0.45;D=H.update_iters(H.eps,D);if(l==w){if(n.run(z,i,p,l)<=0){jsfeat.cache.put_buffer(E);jsfeat.cache.put_buffer(h);jsfeat.cache.put_buffer(u);return false}p.copy_to(j);if(B){while(--l>=0){B.data[l]=1}}jsfeat.cache.put_buffer(E);jsfeat.cache.put_buffer(h);jsfeat.cache.put_buffer(u);return true}for(;C<D;++C){s=e(n,z,i,w,l,G,F);if(!s){if(C==0){jsfeat.cache.put_buffer(E);jsfeat.cache.put_buffer(h);jsfeat.cache.put_buffer(u);return false}break}o=n.run(G,F,p,w);if(o<=0){continue}n.error(z,i,p,k,l);m=jsfeat.math.median(k,0,l-1);if(m<A){A=m;p.copy_to(j);r=true}}if(r){x=2.5*1.4826*(1+5/(l-w))*Math.sqrt(A);x=Math.max(x,0.001);q=f(n,j,z,i,l,x,k,t.data);if(B){t.copy_to(B)}r=q>=w}jsfeat.cache.put_buffer(E);jsfeat.cache.put_buffer(h);jsfeat.cache.put_buffer(u);return r}}})();a.ransac_params_t=b;a.motion_model=c;a.motion_estimator=d})(jsfeat);(function(b){var a=(function(){var c=function(q,S,O,p){var r=0;var y=q.channel,v=q.cols,J=q.rows;var P=q.data,m=S.data;var I=v/O,H=J/p;var n=(I*H*65536)|0;var x=0,u=0,C=0,A=0,t=0,s=0,G=0,F=0,D=0,B=0;var Q=0,N=0,K=0,o=0,M=0,E=0;var l=jsfeat.cache.get_buffer((O*y)<<2);var g=jsfeat.cache.get_buffer((O*y)<<2);var R=jsfeat.cache.get_buffer((v*2*3)<<2);var L=l.i32;var j=g.i32;var z=R.i32;for(;x<O;x++){D=x*I,B=D+I;t=(D+1-0.000001)|0,s=B|0;t=Math.min(t,v-1);s=Math.min(s,v-1);if(t>D){z[F++]=(x*y)|0;z[F++]=((t-1)*y)|0;z[F++]=((t-D)*256)|0;r++}for(C=t;C<s;C++){r++;z[F++]=(x*y)|0;z[F++]=(C*y)|0;z[F++]=256}if(B-s>0.001){r++;z[F++]=(x*y)|0;z[F++]=(s*y)|0;z[F++]=((B-s)*256)|0}}for(x=0;x<O*y;x++){L[x]=j[x]=0}u=0;for(A=0;A<J;A++){Q=v*A;for(F=0;F<r;F++){K=z[F*3];t=z[F*3+1];o=z[F*3+2];for(G=0;G<y;G++){L[K+G]+=P[Q+t+G]*o}}if((u+1)*H<=A+1||A==J-1){M=(Math.max(A+1-(u+1)*H,0)*256)|0;E=256-M;N=O*u;if(M<=0){for(x=0;x<O*y;x++){m[N+x]=Math.min(Math.max((j[x]+L[x]*256)/n,0),255);j[x]=L[x]=0}}else{for(x=0;x<O*y;x++){m[N+x]=Math.min(Math.max((j[x]+L[x]*E)/n,0),255);j[x]=L[x]*M;L[x]=0}}u++}else{for(x=0;x<O*y;x++){j[x]+=L[x]*256;L[x]=0}}}jsfeat.cache.put_buffer(g);jsfeat.cache.put_buffer(l);jsfeat.cache.put_buffer(R)};var f=function(p,S,N,o){var q=0;var x=p.channel,u=p.cols,I=p.rows;var O=p.data,m=S.data;var H=u/N,G=I/o;var Q=1/(H*G);var v=0,t=0,B=0,z=0,s=0,r=0,F=0,E=0,C=0,A=0;var P=0,M=0,J=0,n=0,L=0,D=0;var l=jsfeat.cache.get_buffer((N*x)<<2);var g=jsfeat.cache.get_buffer((N*x)<<2);var R=jsfeat.cache.get_buffer((u*2*3)<<2);var K=l.f32;var j=g.f32;var y=R.f32;for(;v<N;v++){C=v*H,A=C+H;s=(C+1-0.000001)|0,r=A|0;s=Math.min(s,u-1);r=Math.min(r,u-1);if(s>C){q++;y[E++]=((s-1)*x)|0;y[E++]=(v*x)|0;y[E++]=(s-C)*Q}for(B=s;B<r;B++){q++;y[E++]=(B*x)|0;y[E++]=(v*x)|0;y[E++]=Q}if(A-r>0.001){q++;y[E++]=(r*x)|0;y[E++]=(v*x)|0;y[E++]=(A-r)*Q}}for(v=0;v<N*x;v++){K[v]=j[v]=0}t=0;for(z=0;z<I;z++){P=u*z;for(E=0;E<q;E++){s=y[E*3]|0;J=y[E*3+1]|0;n=y[E*3+2];for(F=0;F<x;F++){K[J+F]+=O[P+s+F]*n}}if((t+1)*G<=z+1||z==I-1){L=Math.max(z+1-(t+1)*G,0);D=1-L;M=N*t;if(Math.abs(L)<0.001){for(v=0;v<N*x;v++){m[M+v]=j[v]+K[v];j[v]=K[v]=0}}else{for(v=0;v<N*x;v++){m[M+v]=j[v]+K[v]*D;j[v]=K[v]*L;K[v]=0}}t++}else{for(v=0;v<N*x;v++){j[v]+=K[v];K[v]=0}}}jsfeat.cache.put_buffer(g);jsfeat.cache.put_buffer(l);jsfeat.cache.put_buffer(R)};var e=function(D,F,m,s,B,t,g,n){var z=0,y=0,x=0,A=0,u=0,l=0,G=0,E=0,C=0,v=t[0],r=0;var q=s<<1,p=s*3,o=s<<2;for(;z<B;++z){l=F[A];for(y=0;y<n;++y){D[y]=l}for(y=0;y<=s-2;y+=2){D[y+n]=F[A+y];D[y+n+1]=F[A+y+1]}for(;y<s;++y){D[y+n]=F[A+y]}l=F[A+s-1];for(y=s;y<n+s;++y){D[y+n]=l}for(y=0;y<=s-4;y+=4){l=D[y]*v,G=D[y+1]*v,E=D[y+2]*v,C=D[y+3]*v;for(x=1;x<g;++x){r=t[x];l+=D[x+y]*r;G+=D[x+y+1]*r;E+=D[x+y+2]*r;C+=D[x+y+3]*r}m[u+y]=Math.min(l>>8,255);m[u+y+1]=Math.min(G>>8,255);m[u+y+2]=Math.min(E>>8,255);m[u+y+3]=Math.min(C>>8,255)}for(;y<s;++y){l=D[y]*v;for(x=1;x<g;++x){l+=D[x+y]*t[x]}m[u+y]=Math.min(l>>8,255)}A+=s;u+=s}for(z=0;z<s;++z){l=m[z];for(y=0;y<n;++y){D[y]=l}x=z;for(y=0;y<=B-2;y+=2,x+=q){D[y+n]=m[x];D[y+n+1]=m[x+s]}for(;y<B;++y,x+=s){D[y+n]=m[x]}l=m[(B-1)*s+z];for(y=B;y<n+B;++y){D[y+n]=l}u=z;for(y=0;y<=B-4;y+=4,u+=o){l=D[y]*v,G=D[y+1]*v,E=D[y+2]*v,C=D[y+3]*v;for(x=1;x<g;++x){r=t[x];l+=D[x+y]*r;G+=D[x+y+1]*r;E+=D[x+y+2]*r;C+=D[x+y+3]*r}m[u]=Math.min(l>>8,255);m[u+s]=Math.min(G>>8,255);m[u+q]=Math.min(E>>8,255);m[u+p]=Math.min(C>>8,255)}for(;y<B;++y,u+=s){l=D[y]*v;for(x=1;x<g;++x){l+=D[x+y]*t[x]}m[u]=Math.min(l>>8,255)}}};var d=function(D,F,m,s,B,t,g,n){var z=0,y=0,x=0,A=0,u=0,l=0,G=0,E=0,C=0,v=t[0],r=0;var q=s<<1,p=s*3,o=s<<2;for(;z<B;++z){l=F[A];for(y=0;y<n;++y){D[y]=l}for(y=0;y<=s-2;y+=2){D[y+n]=F[A+y];D[y+n+1]=F[A+y+1]}for(;y<s;++y){D[y+n]=F[A+y]}l=F[A+s-1];for(y=s;y<n+s;++y){D[y+n]=l}for(y=0;y<=s-4;y+=4){l=D[y]*v,G=D[y+1]*v,E=D[y+2]*v,C=D[y+3]*v;for(x=1;x<g;++x){r=t[x];l+=D[x+y]*r;G+=D[x+y+1]*r;E+=D[x+y+2]*r;C+=D[x+y+3]*r}m[u+y]=l;m[u+y+1]=G;m[u+y+2]=E;m[u+y+3]=C}for(;y<s;++y){l=D[y]*v;for(x=1;x<g;++x){l+=D[x+y]*t[x]}m[u+y]=l}A+=s;u+=s}for(z=0;z<s;++z){l=m[z];for(y=0;y<n;++y){D[y]=l}x=z;for(y=0;y<=B-2;y+=2,x+=q){D[y+n]=m[x];D[y+n+1]=m[x+s]}for(;y<B;++y,x+=s){D[y+n]=m[x]}l=m[(B-1)*s+z];for(y=B;y<n+B;++y){D[y+n]=l}u=z;for(y=0;y<=B-4;y+=4,u+=o){l=D[y]*v,G=D[y+1]*v,E=D[y+2]*v,C=D[y+3]*v;for(x=1;x<g;++x){r=t[x];l+=D[x+y]*r;G+=D[x+y+1]*r;E+=D[x+y+2]*r;C+=D[x+y+3]*r}m[u]=l;m[u+s]=G;m[u+q]=E;m[u+p]=C}for(;y<B;++y,u+=s){l=D[y]*v;for(x=1;x<g;++x){l+=D[x+y]*t[x]}m[u]=l}}};return{grayscale:function(n,r,A,D,g){if(typeof g===\"undefined\"){g=jsfeat.COLOR_RGBA2GRAY}var q=0,p=0,z=0,v=0,m=0,u=0;var s=4899,B=9617,C=1868,o=4;if(g==jsfeat.COLOR_BGRA2GRAY||g==jsfeat.COLOR_BGR2GRAY){s=1868;C=4899}if(g==jsfeat.COLOR_RGB2GRAY||g==jsfeat.COLOR_BGR2GRAY){o=3}var l=o<<1,k=(o*3)|0;D.resize(r,A,1);var t=D.data;for(p=0;p<A;++p,v+=r,z+=r*o){for(q=0,m=z,u=v;q<=r-4;q+=4,m+=o<<2,u+=4){t[u]=(n[m]*s+n[m+1]*B+n[m+2]*C+8192)>>14;t[u+1]=(n[m+o]*s+n[m+o+1]*B+n[m+o+2]*C+8192)>>14;t[u+2]=(n[m+l]*s+n[m+l+1]*B+n[m+l+2]*C+8192)>>14;t[u+3]=(n[m+k]*s+n[m+k+1]*B+n[m+k+2]*C+8192)>>14}for(;q<r;++q,++u,m+=o){t[u]=(n[m]*s+n[m+1]*B+n[m+2]*C+8192)>>14}}},resample:function(l,m,i,k){var j=l.rows,g=l.cols;if(j>k&&g>i){m.resize(i,k,l.channel);if(l.type&jsfeat.U8_t&&m.type&jsfeat.U8_t&&j*g/(k*i)<256){c(l,m,i,k)}else{f(l,m,i,k)}}},box_blur_gray:function(r,J,n,l){if(typeof l===\"undefined\"){l=0}var z=r.cols,E=r.rows,s=E<<1,v=z<<1;var D=0,u=0,t=0,m=0;var B=((n<<1)+1)|0;var p=(n+1)|0,H=(p+1)|0;var I=l&jsfeat.BOX_BLUR_NOSCALE?1:(1/(B*B));var C=jsfeat.cache.get_buffer((z*E)<<2);var j=0,G=0,o=0,q=0,k=0;var F=C.i32;var g=r.data;var A=0;J.resize(z,E,r.channel);for(t=0;t<E;++t){G=t;j=p*g[o];for(D=(o+1)|0,m=(o+n)|0;D<=m;++D){j+=g[D]}q=(o+p)|0;k=o;A=g[k];for(u=0;u<n;++u,G+=E){F[G]=j;j+=g[q]-A;q++}for(;u<z-H;u+=2,G+=s){F[G]=j;j+=g[q]-g[k];F[G+E]=j;j+=g[q+1]-g[k+1];q+=2;k+=2}for(;u<z-p;++u,G+=E){F[G]=j;j+=g[q]-g[k];q++;k++}A=g[q-1];for(;u<z;++u,G+=E){F[G]=j;j+=A-g[k];k++}o+=z}o=0;g=J.data;if(I==1){for(t=0;t<z;++t){G=t;j=p*F[o];for(D=(o+1)|0,m=(o+n)|0;D<=m;++D){j+=F[D]}q=o+p;k=o;A=F[k];for(u=0;u<n;++u,G+=z){g[G]=j;j+=F[q]-A;q++}for(;u<E-H;u+=2,G+=v){g[G]=j;j+=F[q]-F[k];g[G+z]=j;j+=F[q+1]-F[k+1];q+=2;k+=2}for(;u<E-p;++u,G+=z){g[G]=j;j+=F[q]-F[k];q++;k++}A=F[q-1];for(;u<E;++u,G+=z){g[G]=j;j+=A-F[k];k++}o+=E}}else{for(t=0;t<z;++t){G=t;j=p*F[o];for(D=(o+1)|0,m=(o+n)|0;D<=m;++D){j+=F[D]}q=o+p;k=o;A=F[k];for(u=0;u<n;++u,G+=z){g[G]=j*I;j+=F[q]-A;q++}for(;u<E-H;u+=2,G+=v){g[G]=j*I;j+=F[q]-F[k];g[G+z]=j*I;j+=F[q+1]-F[k+1];q+=2;k+=2}for(;u<E-p;++u,G+=z){g[G]=j*I;j+=F[q]-F[k];q++;k++}A=F[q-1];for(;u<E;++u,G+=z){g[G]=j*I;j+=A-F[k];k++}o+=E}}jsfeat.cache.put_buffer(C)},gaussian_blur:function(g,s,r,v){if(typeof v===\"undefined\"){v=0}if(typeof r===\"undefined\"){r=0}r=r==0?(Math.max(1,(4*v+1-1e-8))*2+1)|0:r;var x=r>>1;var t=g.cols,p=g.rows;var u=g.type,n=u&jsfeat.U8_t;s.resize(t,p,g.channel);var m=g.data,j=s.data;var k,i,q=(r+Math.max(p,t))|0;var l=jsfeat.cache.get_buffer(q<<2);var o=jsfeat.cache.get_buffer(r<<2);if(n){k=l.i32;i=o.i32}else{if(u&jsfeat.S32_t){k=l.i32;i=o.f32}else{k=l.f32;i=o.f32}}jsfeat.math.get_gaussian_kernel(r,v,i,u);if(n){e(k,m,j,t,p,i,r,x)}else{d(k,m,j,t,p,i,r,x)}jsfeat.cache.put_buffer(l);jsfeat.cache.put_buffer(o)},pyrdown:function(k,A,s,r){if(typeof s===\"undefined\"){s=0}if(typeof r===\"undefined\"){r=0}var q=k.cols,t=k.rows;var p=q>>1,l=t>>1;var B=p-(s<<1),u=l-(r<<1);var o=0,n=0,g=s+r*q,m=0,v=0,i=0;A.resize(p,l,k.channel);var z=k.data,j=A.data;for(n=0;n<u;++n){m=g;i=v;for(o=0;o<=B-2;o+=2,i+=2,m+=4){j[i]=(z[m]+z[m+1]+z[m+q]+z[m+q+1]+2)>>2;j[i+1]=(z[m+2]+z[m+3]+z[m+q+2]+z[m+q+3]+2)>>2}for(;o<B;++o,++i,m+=2){j[i]=(z[m]+z[m+1]+z[m+q]+z[m+q+1]+2)>>2}g+=q<<1;v+=p}},scharr_derivatives:function(j,G){var p=j.cols,s=j.rows;var H=p<<1,o=0,m=0,u=0,E,D,C,B,A,z;var v=0,t=0,r=0,i=0;var n,l;G.resize(p,s,2);var F=j.data,g=G.data;var k=jsfeat.cache.get_buffer((p+2)<<2);var q=jsfeat.cache.get_buffer((p+2)<<2);if(j.type&jsfeat.U8_t||j.type&jsfeat.S32_t){n=k.i32;l=q.i32}else{n=k.f32;l=q.f32}for(;m<s;++m,t+=p){v=((m>0?m-1:1)*p)|0;r=((m<s-1?m+1:s-2)*p)|0;i=(m*H)|0;for(o=0,u=1;o<=p-2;o+=2,u+=2){E=F[v+o],D=F[r+o];n[u]=((E+D)*3+(F[t+o])*10);l[u]=(D-E);E=F[v+o+1],D=F[r+o+1];n[u+1]=((E+D)*3+(F[t+o+1])*10);l[u+1]=(D-E)}for(;o<p;++o,++u){E=F[v+o],D=F[r+o];n[u]=((E+D)*3+(F[t+o])*10);l[u]=(D-E)}o=(p+1)|0;n[0]=n[1];n[o]=n[p];l[0]=l[1];l[o]=l[p];for(o=0;o<=p-4;o+=4){E=l[o+2],D=l[o+1],C=l[o+3],B=l[o+4],A=n[o+2],z=n[o+3];g[i++]=(A-n[o]);g[i++]=((E+l[o])*3+D*10);g[i++]=(z-n[o+1]);g[i++]=((C+D)*3+E*10);g[i++]=((n[o+4]-A));g[i++]=(((B+E)*3+C*10));g[i++]=((n[o+5]-z));g[i++]=(((l[o+5]+C)*3+B*10))}for(;o<p;++o){g[i++]=((n[o+2]-n[o]));g[i++]=(((l[o+2]+l[o])*3+l[o+1]*10))}}jsfeat.cache.put_buffer(k);jsfeat.cache.put_buffer(q)},sobel_derivatives:function(j,G){var p=j.cols,s=j.rows;var H=p<<1,o=0,m=0,u=0,E,D,C,B,A,z;var v=0,t=0,r=0,i=0;var n,l;G.resize(p,s,2);var F=j.data,g=G.data;var k=jsfeat.cache.get_buffer((p+2)<<2);var q=jsfeat.cache.get_buffer((p+2)<<2);if(j.type&jsfeat.U8_t||j.type&jsfeat.S32_t){n=k.i32;l=q.i32}else{n=k.f32;l=q.f32}for(;m<s;++m,t+=p){v=((m>0?m-1:1)*p)|0;r=((m<s-1?m+1:s-2)*p)|0;i=(m*H)|0;for(o=0,u=1;o<=p-2;o+=2,u+=2){E=F[v+o],D=F[r+o];n[u]=((E+D)+(F[t+o]*2));l[u]=(D-E);E=F[v+o+1],D=F[r+o+1];n[u+1]=((E+D)+(F[t+o+1]*2));l[u+1]=(D-E)}for(;o<p;++o,++u){E=F[v+o],D=F[r+o];n[u]=((E+D)+(F[t+o]*2));l[u]=(D-E)}o=(p+1)|0;n[0]=n[1];n[o]=n[p];l[0]=l[1];l[o]=l[p];for(o=0;o<=p-4;o+=4){E=l[o+2],D=l[o+1],C=l[o+3],B=l[o+4],A=n[o+2],z=n[o+3];g[i++]=(A-n[o]);g[i++]=(E+l[o]+D*2);g[i++]=(z-n[o+1]);g[i++]=(C+D+E*2);g[i++]=(n[o+4]-A);g[i++]=(B+E+C*2);g[i++]=(n[o+5]-z);g[i++]=(l[o+5]+C+B*2)}for(;o<p;++o){g[i++]=(n[o+2]-n[o]);g[i++]=(l[o+2]+l[o]+l[o+1]*2)}}jsfeat.cache.put_buffer(k);jsfeat.cache.put_buffer(q)},compute_integral_image:function(g,l,y,u){var t=g.cols|0,w=g.rows|0,o=g.data;var r=(t+1)|0;var B=0,z=0,h=0,x=0,q=0,n=0,A=0,m=0;if(l&&y){for(;q<r;++q){l[q]=0,y[q]=0}h=(r+1)|0,x=1;for(q=0,m=0;q<w;++q,++h,++x){B=z=0;for(n=0;n<=t-2;n+=2,m+=2,h+=2,x+=2){A=o[m];B+=A,z+=A*A;l[h]=l[x]+B;y[h]=y[x]+z;A=o[m+1];B+=A,z+=A*A;l[h+1]=l[x+1]+B;y[h+1]=y[x+1]+z}for(;n<t;++n,++m,++h,++x){A=o[m];B+=A,z+=A*A;l[h]=l[x]+B;y[h]=y[x]+z}}}else{if(l){for(;q<r;++q){l[q]=0}h=(r+1)|0,x=1;for(q=0,m=0;q<w;++q,++h,++x){B=0;for(n=0;n<=t-2;n+=2,m+=2,h+=2,x+=2){B+=o[m];l[h]=l[x]+B;B+=o[m+1];l[h+1]=l[x+1]+B}for(;n<t;++n,++m,++h,++x){B+=o[m];l[h]=l[x]+B}}}else{if(y){for(;q<r;++q){y[q]=0}h=(r+1)|0,x=1;for(q=0,m=0;q<w;++q,++h,++x){z=0;for(n=0;n<=t-2;n+=2,m+=2,h+=2,x+=2){A=o[m];z+=A*A;y[h]=y[x]+z;A=o[m+1];z+=A*A;y[h+1]=y[x+1]+z}for(;n<t;++n,++m,++h,++x){A=o[m];z+=A*A;y[h]=y[x]+z}}}}}if(u){for(q=0;q<r;++q){u[q]=0}h=(r+1)|0,x=0;for(q=0,m=0;q<w;++q,++h,++x){for(n=0;n<=t-2;n+=2,m+=2,h+=2,x+=2){u[h]=o[m]+u[x];u[h+1]=o[m+1]+u[x+1]}for(;n<t;++n,++m,++h,++x){u[h]=o[m]+u[x]}}h=(r+t)|0,x=t;for(q=0;q<w;++q,h+=r,x+=r){u[h]+=u[x]}for(n=t-1;n>0;--n){h=n+w*r,x=h-r;for(q=w;q>0;--q,h-=r,x-=r){u[h]+=u[x]+u[x+1]}}}},equalize_histogram:function(j,r){var s=j.cols,q=j.rows,o=j.data;r.resize(s,q,j.channel);var l=r.data,t=s*q;var p=0,n=0,k,g;var m=jsfeat.cache.get_buffer(256<<2);k=m.i32;for(;p<256;++p){k[p]=0}for(p=0;p<t;++p){++k[o[p]]}n=k[0];for(p=1;p<256;++p){n=k[p]+=n}g=255/t;for(p=0;p<t;++p){l[p]=(k[o[p]]*g+0.5)|0}jsfeat.cache.put_buffer(m)},canny:function(u,V,E,k){var C=u.cols,L=u.rows,S=u.data;V.resize(C,L,u.channel);var o=V.data;var K=0,H=0,q=0,A=C<<1,R=0,J=0,N=0,z=0,v=0,D=0;var g=0,U=0;var p=jsfeat.cache.get_buffer((L*A)<<2);var m=jsfeat.cache.get_buffer((3*(C+2))<<2);var n=jsfeat.cache.get_buffer(((L+2)*(C+2))<<2);var t=jsfeat.cache.get_buffer((L*C)<<2);var Q=m.i32;var T=n.i32;var r=t.i32;var G=p.i32;var l=new jsfeat.matrix_t(C,L,jsfeat.S32C2_t,p.data);var P=1,O=(C+2+1)|0,M=(2*(C+2)+1)|0,B=(C+2)|0,I=(B+1)|0,F=0;this.sobel_derivatives(u,l);if(E>k){K=E;E=k;k=K}K=(3*(C+2))|0;while(--K>=0){Q[K]=0}K=((L+2)*(C+2))|0;while(--K>=0){T[K]=0}for(;H<C;++H,q+=2){z=G[q],v=G[q+1];Q[O+H]=((z^(z>>31))-(z>>31))+((v^(v>>31))-(v>>31))}for(K=1;K<=L;++K,q+=A){if(K==L){H=M+C;while(--H>=M){Q[H]=0}}else{for(H=0;H<C;H++){z=G[q+(H<<1)],v=G[q+(H<<1)+1];Q[M+H]=((z^(z>>31))-(z>>31))+((v^(v>>31))-(v>>31))}}R=(q-A)|0;T[I-1]=0;J=0;for(H=0;H<C;++H,R+=2){N=Q[O+H];if(N>E){z=G[R];v=G[R+1];D=z^v;z=((z^(z>>31))-(z>>31))|0;v=((v^(v>>31))-(v>>31))|0;g=z*13573;U=g+((z+z)<<15);v<<=15;if(v<g){if(N>Q[O+H-1]&&N>=Q[O+H+1]){if(N>k&&!J&&T[I+H-B]!=2){T[I+H]=2;J=1;r[F++]=I+H}else{T[I+H]=1}continue}}else{if(v>U){if(N>Q[P+H]&&N>=Q[M+H]){if(N>k&&!J&&T[I+H-B]!=2){T[I+H]=2;J=1;r[F++]=I+H}else{T[I+H]=1}continue}}else{D=D<0?-1:1;if(N>Q[P+H-D]&&N>Q[M+H+D]){if(N>k&&!J&&T[I+H-B]!=2){T[I+H]=2;J=1;r[F++]=I+H}else{T[I+H]=1}continue}}}}T[I+H]=0;J=0}T[I+C]=0;I+=B;H=P;P=O;O=M;M=H}H=I-B-1;for(K=0;K<B;++K,++H){T[H]=0}while(F>0){I=r[--F];I-=B+1;if(T[I]==1){T[I]=2,r[F++]=I}I+=1;if(T[I]==1){T[I]=2,r[F++]=I}I+=1;if(T[I]==1){T[I]=2,r[F++]=I}I+=B;if(T[I]==1){T[I]=2,r[F++]=I}I-=2;if(T[I]==1){T[I]=2,r[F++]=I}I+=B;if(T[I]==1){T[I]=2,r[F++]=I}I+=1;if(T[I]==1){T[I]=2,r[F++]=I}I+=1;if(T[I]==1){T[I]=2,r[F++]=I}}I=B+1;P=0;for(K=0;K<L;++K,I+=B){for(H=0;H<C;++H){o[P++]=(T[I+H]==2)*255}}jsfeat.cache.put_buffer(p);jsfeat.cache.put_buffer(m);jsfeat.cache.put_buffer(n);jsfeat.cache.put_buffer(t)},warp_perspective:function(t,D,A,r){if(typeof r===\"undefined\"){r=0}var l=t.cols|0,v=t.rows|0,L=D.cols|0,j=D.rows|0;var H=t.data,q=D.data;var F=0,E=0,G=0,u=0,k=0,C=0,p=0,h=0,O=0,P=0,s=0,R=0,Q=0,N=0,M=0;var i=A.data;var o=i[0],n=i[1],m=i[2],K=i[3],J=i[4],I=i[5],B=i[6],z=i[7],w=i[8];for(var g=0;E<j;++E){h=n*E+m,O=J*E+I,P=z*E+w;for(F=0;F<L;++F,++g,h+=o,O+=K,P+=B){s=1/P;C=h*s,p=O*s;u=C|0,k=p|0;if(C>0&&p>0&&u<(l-1)&&k<(v-1)){R=Math.max(C-u,0);Q=Math.max(p-k,0);G=(l*k+u)|0;N=H[G]+R*(H[G+1]-H[G]);M=H[G+l]+R*(H[G+l+1]-H[G+l]);q[g]=N+Q*(M-N)}else{q[g]=r}}}},warp_affine:function(k,K,p,J){if(typeof J===\"undefined\"){J=0}var u=k.cols,z=k.rows,j=K.cols,v=K.rows;var E=k.data,i=K.data;var o=0,n=0,I=0,q=0,A=0,m=0,w=0,G=0,D=0,h=0,g=0;var l=p.data;var t=l[0],s=l[1],r=l[2],H=l[3],F=l[4],C=l[5];for(var B=0;n<v;++n){m=s*n+r;w=F*n+C;for(o=0;o<j;++o,++B,m+=t,w+=H){q=m|0;A=w|0;if(q>=0&&A>=0&&q<(u-1)&&A<(z-1)){G=m-q;D=w-A;I=u*A+q;h=E[I]+G*(E[I+1]-E[I]);g=E[I+u]+G*(E[I+u+1]-E[I+u]);i[B]=h+D*(g-h)}else{i[B]=J}}}},skindetector:function(o,p){var n,m,h,k;var l=o.width*o.height;while(l--){k=l*4;n=o.data[k];m=o.data[k+1];h=o.data[k+2];if((n>95)&&(m>40)&&(h>20)&&(n>m)&&(n>h)&&(n-Math.min(m,h)>15)&&(Math.abs(n-m)>15)){p[l]=255}else{p[l]=0}}}}})();b.imgproc=a})(jsfeat);(function(a){var b=(function(){var h=new Int32Array([0,3,1,3,2,2,3,1,3,0,3,-1,2,-2,1,-3,0,-3,-1,-3,-2,-2,-3,-1,-3,0,-3,1,-2,2,-1,3]);var f=new Uint8Array(512);var e=new Int32Array(25);var i=new Int32Array(25);var d=function(l,n,o){var j=0;var m=h;for(;j<o;++j){l[j]=m[j<<1]+m[(j<<1)+1]*n}for(;j<25;++j){l[j]=l[j-o]}},g=function(j,n,l,r,p){var q=25,o=0,w=j[n];var m=p,t=0,u=0,s=0;for(;o<q;++o){r[o]=w-j[n+l[o]]}for(o=0;o<16;o+=2){t=Math.min(r[o+1],r[o+2]);t=Math.min(t,r[o+3]);if(t<=m){continue}t=Math.min(t,r[o+4]);t=Math.min(t,r[o+5]);t=Math.min(t,r[o+6]);t=Math.min(t,r[o+7]);t=Math.min(t,r[o+8]);m=Math.max(m,Math.min(t,r[o]));m=Math.max(m,Math.min(t,r[o+9]))}u=-m;for(o=0;o<16;o+=2){s=Math.max(r[o+1],r[o+2]);s=Math.max(s,r[o+3]);s=Math.max(s,r[o+4]);s=Math.max(s,r[o+5]);if(s>=u){continue}s=Math.max(s,r[o+6]);s=Math.max(s,r[o+7]);s=Math.max(s,r[o+8]);u=Math.min(u,Math.max(s,r[o]));u=Math.min(u,Math.max(s,r[o+9]))}return -u-1};var c=20;return{set_threshold:function(j){c=Math.min(Math.max(j,0),255);for(var k=-255;k<=255;++k){f[(k+255)]=(k<-c?1:(k>c?2:0))}return c},detect:function(L,H,D){if(typeof D===\"undefined\"){D=3}var A=8,t=25;var u=L.data,X=L.cols,ar=L.rows;var ap=0,an=0,al=0,E=0,W=0,aq=0;var B=jsfeat.cache.get_buffer(3*X);var O=jsfeat.cache.get_buffer(((X+1)*3)<<2);var I=B.u8;var F=O.i32;var M=e;var J=i;var y=Math.max(3,D);var Z=Math.min((ar-2),(ar-D));var z=Math.max(3,D);var aa=Math.min((X-3),(X-D));var ah=0,P=0,C;var Q=g;var G=f;var p=c;var Y=0,ao=0,au=0,aw=0,U=0,V=0,av=0,R=0,at=0;var T=0,S=0,o=0;d(M,X,16);var am=M[0];var ak=M[1];var aj=M[2];var ai=M[3];var ag=M[4];var af=M[5];var ae=M[6];var ad=M[7];var ac=M[8];var ab=M[9];var s=M[10];var r=M[11];var q=M[12];var n=M[13];var m=M[14];var l=M[15];for(ap=0;ap<X*3;++ap){I[ap]=0}for(ap=y;ap<Z;++ap){av=((ap*X)+z)|0;aq=(ap-3)%3;V=(aq*X)|0;U=(aq*(X+1))|0;for(an=0;an<X;++an){I[V+an]=0}aw=0;if(ap<(Z-1)){an=z;for(;an<aa;++an,++av){Y=u[av];ao=(-Y+255);au=(G[ao+u[av+am]]|G[ao+u[av+ac]]);if(au==0){continue}au&=(G[ao+u[av+aj]]|G[ao+u[av+s]]);au&=(G[ao+u[av+ag]]|G[ao+u[av+q]]);au&=(G[ao+u[av+ae]]|G[ao+u[av+m]]);if(au==0){continue}au&=(G[ao+u[av+ak]]|G[ao+u[av+ab]]);au&=(G[ao+u[av+ai]]|G[ao+u[av+r]]);au&=(G[ao+u[av+af]]|G[ao+u[av+n]]);au&=(G[ao+u[av+ad]]|G[ao+u[av+l]]);if(au&1){E=(Y-p);ah=0;for(al=0;al<t;++al){W=u[(av+M[al])];if(W<E){++ah;if(ah>A){++aw;F[U+aw]=an;I[V+an]=Q(u,av,M,J,p);break}}else{ah=0}}}if(au&2){E=(Y+p);ah=0;for(al=0;al<t;++al){W=u[(av+M[al])];if(W>E){++ah;if(ah>A){++aw;F[U+aw]=an;I[V+an]=Q(u,av,M,J,p);break}}else{ah=0}}}}}F[U+X]=aw;if(ap==y){continue}aq=(ap-4+3)%3;R=(aq*X)|0;U=(aq*(X+1))|0;aq=(ap-5+3)%3;at=(aq*X)|0;aw=F[U+X];for(al=0;al<aw;++al){an=F[U+al];T=(an+1)|0;S=(an-1)|0;o=I[R+an];if((o>I[R+T]&&o>I[R+S]&&o>I[at+S]&&o>I[at+an]&&o>I[at+T]&&o>I[V+S]&&o>I[V+an]&&o>I[V+T])){C=H[P];C.x=an,C.y=(ap-1),C.score=o;P++}}}jsfeat.cache.put_buffer(B);jsfeat.cache.put_buffer(O);return P}}})();a.fast_corners=b;b.set_threshold(20)})(jsfeat);(function(b){var a=(function(){var d=function(e,l,q,i,r,g,p,n,k,j){var m=0,o=0,f=(n*q+p)|0,s=f;for(m=n;m<j;++m,f+=q,s=f){for(o=p;o<k;++o,++s){l[s]=-4*e[s]+e[s+r]+e[s-r]+e[s+g]+e[s-g]}}};var c=function(e,f,k,m,g,l,h){var o=-2*e[f]+e[f+m]+e[f-m];var i=-2*e[f]+e[f+g]+e[f-g];var n=e[f+l]+e[f-l]-e[f+h]-e[f-h];var j=(Math.sqrt(((o-i)*(o-i)+4*n*n)))|0;return Math.min(Math.abs(k-j),Math.abs(-(k+j)))};return{laplacian_threshold:30,min_eigen_value_threshold:25,detect:function(l,A,z){if(typeof z===\"undefined\"){z=5}var o=0,n=0;var p=l.cols,B=l.rows,q=l.data;var H=5,f=(5*p)|0;var G=(3+3*p)|0,g=(3-3*p)|0;var e=jsfeat.cache.get_buffer((p*B)<<2);var j=e.i32;var i=0,k=0,m=0,r=0,v;var u=0;var F=this.laplacian_threshold;var D=this.min_eigen_value_threshold;var t=Math.max(5,z)|0;var s=Math.max(3,z)|0;var E=Math.min(p-5,p-z)|0;var C=Math.min(B-3,B-z)|0;o=p*B;while(--o>=0){j[o]=0}d(q,j,p,B,H,f,t,s,E,C);k=(s*p+t)|0;for(n=s;n<C;++n,k+=p){for(o=t,m=k;o<E;++o,++m){i=j[m];if((i<-F&&i<j[m-1]&&i<j[m+1]&&i<j[m-p]&&i<j[m+p]&&i<j[m-p-1]&&i<j[m+p-1]&&i<j[m-p+1]&&i<j[m+p+1])||(i>F&&i>j[m-1]&&i>j[m+1]&&i>j[m-p]&&i>j[m+p]&&i>j[m-p-1]&&i>j[m+p-1]&&i>j[m-p+1]&&i>j[m+p+1])){r=c(q,m,i,H,f,G,g);if(r>D){v=A[u];v.x=o,v.y=n,v.score=r;++u;++o,++m}}}}jsfeat.cache.put_buffer(e);return u}}})();b.yape06=a})(jsfeat);(function(a){var b=(function(){var d=function(l,m,k){var j=0;var h,n;h=k;for(n=0;n<h;n++,j++){h=(Math.sqrt((k*k-n*n))+0.5)|0;m[j]=(h+l*n)}for(h--;h<n&&h>=0;h--,j++){n=(Math.sqrt((k*k-h*h))+0.5)|0;m[j]=(h+l*n)}for(;-h<n;h--,j++){n=(Math.sqrt((k*k-h*h))+0.5)|0;m[j]=(h+l*n)}for(n--;n>=0;n--,j++){h=(-Math.sqrt((k*k-n*n))-0.5)|0;m[j]=(h+l*n)}for(;n>h;n--,j++){h=(-Math.sqrt((k*k-n*n))-0.5)|0;m[j]=(h+l*n)}for(h++;h<=0;h++,j++){n=(-Math.sqrt((k*k-h*h))-0.5)|0;m[j]=(h+l*n)}for(;h<-n;h++,j++){n=(-Math.sqrt((k*k-h*h))-0.5)|0;m[j]=(h+l*n)}for(n++;n<0;n++,j++){h=(Math.sqrt((k*k-n*n))+0.5)|0;m[j]=(h+l*n)}m[j]=m[0];m[j+1]=m[1];return j};var g=function(h,j,i){var k=0;if(h[j+1]!=0){k++}if(h[j-1]!=0){k++}if(h[j+i]!=0){k++}if(h[j+i+1]!=0){k++}if(h[j+i-1]!=0){k++}if(h[j-i]!=0){k++}if(h[j-i+1]!=0){k++}if(h[j-i-1]!=0){k++}return k};var c=function(l,m,i,k,j){var h,n;if(i>0){m-=k*j;for(n=-j;n<=j;++n){for(h=-j;h<=j;++h){if(l[m+h]>i){return false}}m+=k}}else{m-=k*j;for(n=-j;n<=j;++n){for(h=-j;h<=j;++h){if(l[m+h]<i){return false}}m+=k}}return true};var e=function(s,r,m,u,p,i,l,n){var k=0;var q=0,o=(l-1)|0;var j=0,w=0,v=0,t=0;var h=0;j=s[r+i[q]];if((j<=p)){if((j>=u)){w=s[r+i[o]];if((w<=p)){if((w>=u)){m[r]=0;return}else{o++;v=s[r+i[o]];if((v>p)){o++;t=s[r+i[o]];if((t>p)){h=3}else{if((t<u)){h=6}else{m[r]=0;return}}}else{o++;t=s[r+i[o]];if((t>p)){h=7}else{if((t<u)){h=2}else{m[r]=0;return}}}}}else{o++;v=s[r+i[o]];if((v>p)){o++;t=s[r+i[o]];if((t>p)){h=3}else{if((t<u)){h=6}else{m[r]=0;return}}}else{if((v<u)){o++;t=s[r+i[o]];if((t>p)){h=7}else{if((t<u)){h=2}else{m[r]=0;return}}}else{m[r]=0;return}}}}else{w=s[r+i[o]];if((w>p)){m[r]=0;return}o++;v=s[r+i[o]];if((v>p)){m[r]=0;return}o++;t=s[r+i[o]];if((t>p)){m[r]=0;return}h=1}}else{w=s[r+i[o]];if((w<u)){m[r]=0;return}o++;v=s[r+i[o]];if((v<u)){m[r]=0;return}o++;t=s[r+i[o]];if((t<u)){m[r]=0;return}h=0}for(q=1;q<=l;q++){j=s[r+i[q]];switch(h){case 0:if((j>p)){v=t;o++;t=s[r+i[o]];if((t<u)){m[r]=0;return}k-=j+v;h=0;break}if((j<u)){if((v>p)){m[r]=0;return}if((t>p)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((t>p)){m[r]=0;return}k-=j+v;h=8;break}if((v<=p)){m[r]=0;return}if((t<=p)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((t>p)){k-=j+v;h=3;break}if((t<u)){k-=j+v;h=6;break}m[r]=0;return;case 1:if((j<u)){v=t;o++;t=s[r+i[o]];if((t>p)){m[r]=0;return}k-=j+v;h=1;break}if((j>p)){if((v<u)){m[r]=0;return}if((t<u)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((t<u)){m[r]=0;return}k-=j+v;h=9;break}if((v>=u)){m[r]=0;return}if((t>=u)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((t<u)){k-=j+v;h=2;break}if((t>p)){k-=j+v;h=7;break}m[r]=0;return;case 2:if((j>p)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((j<u)){if((t>p)){m[r]=0;return}k-=j+v;h=4;break}if((t>p)){k-=j+v;h=7;break}if((t<u)){k-=j+v;h=2;break}m[r]=0;return;case 3:if((j<u)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((j>p)){if((t<u)){m[r]=0;return}k-=j+v;h=5;break}if((t>p)){k-=j+v;h=3;break}if((t<u)){k-=j+v;h=6;break}m[r]=0;return;case 4:if((j>p)){m[r]=0;return}if((j<u)){v=t;o++;t=s[r+i[o]];if((t>p)){m[r]=0;return}k-=j+v;h=1;break}if((t>=u)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((t<u)){k-=j+v;h=2;break}if((t>p)){k-=j+v;h=7;break}m[r]=0;return;case 5:if((j<u)){m[r]=0;return}if((j>p)){v=t;o++;t=s[r+i[o]];if((t<u)){m[r]=0;return}k-=j+v;h=0;break}if((t<=p)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((t>p)){k-=j+v;h=3;break}if((t<u)){k-=j+v;h=6;break}m[r]=0;return;case 7:if((j>p)){m[r]=0;return}if((j<u)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((t>p)){k-=j+v;h=3;break}if((t<u)){k-=j+v;h=6;break}m[r]=0;return;case 6:if((j>p)){m[r]=0;return}if((j<u)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((t<u)){k-=j+v;h=2;break}if((t>p)){k-=j+v;h=7;break}m[r]=0;return;case 8:if((j>p)){if((t<u)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((t<u)){m[r]=0;return}k-=j+v;h=9;break}if((j<u)){v=t;o++;t=s[r+i[o]];if((t>p)){m[r]=0;return}k-=j+v;h=1;break}m[r]=0;return;case 9:if((j<u)){if((t>p)){m[r]=0;return}v=t;o++;t=s[r+i[o]];if((t>p)){m[r]=0;return}k-=j+v;h=8;break}if((j>p)){v=t;o++;t=s[r+i[o]];if((t<u)){m[r]=0;return}k-=j+v;h=0;break}m[r]=0;return;default:break}}m[r]=(k+n*s[r])};var f=(function(){function h(i,j,k){this.dirs=new Int32Array(1024);this.dirs_count=d(i,this.dirs,k)|0;this.scores=new Int32Array(i*j);this.radius=k|0}return h})();return{level_tables:[],tau:7,init:function(m,j,h,l){if(typeof l===\"undefined\"){l=1}var k;h=Math.min(h,7);h=Math.max(h,3);for(k=0;k<l;++k){this.level_tables[k]=new f(m>>k,j>>k,h)}},detect:function(k,J,G){if(typeof G===\"undefined\"){G=4}var A=this.level_tables[0];var i=A.radius|0,q=(i-1)|0;var m=A.dirs;var n=A.dirs_count|0;var v=n>>1;var O=k.data,u=k.cols|0,K=k.rows|0,N=u>>1;var H=A.scores;var s=0,r=0,j=0,l=0,o=0,p=0,z=0,I=0;var F=this.tau|0;var D=0,E;var C=Math.max(i+1,G)|0;var B=Math.max(i+1,G)|0;var M=Math.min(u-i-2,u-G)|0;var L=Math.min(K-i-2,K-G)|0;j=(B*u+C)|0;for(r=B;r<L;++r,j+=u){for(s=C,l=j;s<M;++s,++l){o=O[l]+F,p=O[l]-F;if(p<O[l+i]&&O[l+i]<o&&p<O[l-i]&&O[l-i]<o){H[l]=0}else{e(O,l,H,p,o,m,v,n)}}}j=(B*u+C)|0;for(r=B;r<L;++r,j+=u){for(s=C,l=j;s<M;++s,++l){I=H[l];z=Math.abs(I);if(z<5){++s,++l}else{if(g(H,l,u)>=3&&c(H,l,I,N,i)){E=J[D];E.x=s,E.y=r,E.score=z;++D;s+=q,l+=q}}}}return D}}})();a.yape=b})(jsfeat);(function(b){var a=(function(){var d=new Int32Array([8,-3,9,5,4,2,7,-12,-11,9,-8,2,7,-12,12,-13,2,-13,2,12,1,-7,1,6,-2,-10,-2,-4,-13,-13,-11,-8,-13,-3,-12,-9,10,4,11,9,-13,-8,-8,-9,-11,7,-9,12,7,7,12,6,-4,-5,-3,0,-13,2,-12,-3,-9,0,-7,5,12,-6,12,-1,-3,6,-2,12,-6,-13,-4,-8,11,-13,12,-8,4,7,5,1,5,-3,10,-3,3,-7,6,12,-8,-7,-6,-2,-2,11,-1,-10,-13,12,-8,10,-7,3,-5,-3,-4,2,-3,7,-10,-12,-6,11,5,-12,6,-7,5,-6,7,-1,1,0,4,-5,9,11,11,-13,4,7,4,12,2,-1,4,4,-4,-12,-2,7,-8,-5,-7,-10,4,11,9,12,0,-8,1,-13,-13,-2,-8,2,-3,-2,-2,3,-6,9,-4,-9,8,12,10,7,0,9,1,3,7,-5,11,-10,-13,-6,-11,0,10,7,12,1,-6,-3,-6,12,10,-9,12,-4,-13,8,-8,-12,-13,0,-8,-4,3,3,7,8,5,7,10,-7,-1,7,1,-12,3,-10,5,6,2,-4,3,-10,-13,0,-13,5,-13,-7,-12,12,-13,3,-11,8,-7,12,-4,7,6,-10,12,8,-9,-1,-7,-6,-2,-5,0,12,-12,5,-7,5,3,-10,8,-13,-7,-7,-4,5,-3,-2,-1,-7,2,9,5,-11,-11,-13,-5,-13,-1,6,0,-1,5,-3,5,2,-4,-13,-4,12,-9,-6,-9,6,-12,-10,-8,-4,10,2,12,-3,7,12,12,12,-7,-13,-6,5,-4,9,-3,4,7,-1,12,2,-7,6,-5,1,-13,11,-12,5,-3,7,-2,-6,7,-8,12,-7,-13,-7,-11,-12,1,-3,12,12,2,-6,3,0,-4,3,-2,-13,-1,-13,1,9,7,1,8,-6,1,-1,3,12,9,1,12,6,-1,-9,-1,3,-13,-13,-10,5,7,7,10,12,12,-5,12,9,6,3,7,11,5,-13,6,10,2,-12,2,3,3,8,4,-6,2,6,12,-13,9,-12,10,3,-8,4,-7,9,-11,12,-4,-6,1,12,2,-8,6,-9,7,-4,2,3,3,-2,6,3,11,0,3,-3,8,-8,7,8,9,3,-11,-5,-6,-4,-10,11,-5,10,-5,-8,-3,12,-10,5,-9,0,8,-1,12,-6,4,-6,6,-11,-10,12,-8,7,4,-2,6,7,-2,0,-2,12,-5,-8,-5,2,7,-6,10,12,-9,-13,-8,-8,-5,-13,-5,-2,8,-8,9,-13,-9,-11,-9,0,1,-8,1,-2,7,-4,9,1,-2,1,-1,-4,11,-6,12,-11,-12,-9,-6,4,3,7,7,12,5,5,10,8,0,-4,2,8,-9,12,-5,-13,0,7,2,12,-1,2,1,7,5,11,7,-9,3,5,6,-8,-13,-4,-8,9,-5,9,-3,-3,-4,-7,-3,-12,6,5,8,0,-7,6,-6,12,-13,6,-5,-2,1,-10,3,10,4,1,8,-4,-2,-2,2,-13,2,-12,12,12,-2,-13,0,-6,4,1,9,3,-6,-10,-3,-5,-3,-13,-1,1,7,5,12,-11,4,-2,5,-7,-13,9,-9,-5,7,1,8,6,7,-8,7,6,-7,-4,-7,1,-8,11,-7,-8,-13,6,-12,-8,2,4,3,9,10,-5,12,3,-6,-5,-6,7,8,-3,9,-8,2,-12,2,8,-11,-2,-10,3,-12,-13,-7,-9,-11,0,-10,-5,5,-3,11,8,-2,-13,-1,12,-1,-8,0,9,-13,-11,-12,-5,-10,-2,-10,11,-3,9,-2,-13,2,-3,3,2,-9,-13,-4,0,-4,6,-3,-10,-4,12,-2,-7,-6,-11,-4,9,6,-3,6,11,-13,11,-5,5,11,11,12,6,7,-5,12,-2,-1,12,0,7,-4,-8,-3,-2,-7,1,-6,7,-13,-12,-8,-13,-7,-2,-6,-8,-8,5,-6,-9,-5,-1,-4,5,-13,7,-8,10,1,5,5,-13,1,0,10,-13,9,12,10,-1,5,-8,10,-9,-1,11,1,-13,-9,-3,-6,2,-1,-10,1,12,-13,1,-8,-10,8,-11,10,-6,2,-13,3,-6,7,-13,12,-9,-10,-10,-5,-7,-10,-8,-8,-13,4,-6,8,5,3,12,8,-13,-4,2,-3,-3,5,-13,10,-12,4,-13,5,-1,-9,9,-4,3,0,3,3,-9,-12,1,-6,1,3,2,4,-8,-10,-10,-10,9,8,-13,12,12,-8,-12,-6,-5,2,2,3,7,10,6,11,-8,6,8,8,-12,-7,10,-6,5,-3,-9,-3,9,-1,-13,-1,5,-3,-7,-3,4,-8,-2,-8,3,4,2,12,12,2,-5,3,11,6,-9,11,-13,3,-1,7,12,11,-1,12,4,-3,0,-3,6,4,-11,4,12,2,-4,2,1,-10,-6,-8,1,-13,7,-11,1,-13,12,-11,-13,6,0,11,-13,0,-1,1,4,-13,3,-9,-2,-9,8,-6,-3,-13,-6,-8,-2,5,-9,8,10,2,7,3,-9,-1,-6,-1,-1,9,5,11,-2,11,-3,12,-8,3,0,3,5,-1,4,0,10,3,-6,4,5,-13,0,-10,5,5,8,12,11,8,9,9,-6,7,-4,8,-12,-10,4,-10,9,7,3,12,4,9,-7,10,-2,7,0,12,-2,-1,-6,0,-11]);var c=new jsfeat.matrix_t(3,3,jsfeat.F32_t|jsfeat.C1_t);var f=new jsfeat.matrix_t(32,32,jsfeat.U8_t|jsfeat.C1_t);var e=function(l,n,k,i,h,j){var m=Math.cos(k);var g=Math.sin(k);c.data[0]=m,c.data[1]=-g,c.data[2]=(-m+g)*j*0.5+i,c.data[3]=g,c.data[4]=m,c.data[5]=(-g-m)*j*0.5+h;jsfeat.imgproc.warp_affine(l,n,c,128)};return{describe:function(j,u,g,B){var r=32;var x=0,A=0,q=0,p=0,z=0;var o=0,m=0,D=0;var C=j.data,n=j.cols,y=j.rows;var t=f.data;var v=16*32+16;var k=0;if(!(B.type&jsfeat.U8_t)){B.type=jsfeat.U8_t;B.cols=r;B.rows=g;B.channel=1;B.allocate()}else{B.resize(r,g,1)}var l=B.data;var s=0;for(x=0;x<g;++x){q=u[x].x;p=u[x].y;z=u[x].angle;e(j,f,z,q,p,32);k=0;for(A=0;A<r;++A){o=t[v+d[k+1]*32+d[k]];k+=2;m=t[v+d[k+1]*32+d[k]];k+=2;D=(o<m)|0;o=t[v+d[k+1]*32+d[k]];k+=2;m=t[v+d[k+1]*32+d[k]];k+=2;D|=(o<m)<<1;o=t[v+d[k+1]*32+d[k]];k+=2;m=t[v+d[k+1]*32+d[k]];k+=2;D|=(o<m)<<2;o=t[v+d[k+1]*32+d[k]];k+=2;m=t[v+d[k+1]*32+d[k]];k+=2;D|=(o<m)<<3;o=t[v+d[k+1]*32+d[k]];k+=2;m=t[v+d[k+1]*32+d[k]];k+=2;D|=(o<m)<<4;o=t[v+d[k+1]*32+d[k]];k+=2;m=t[v+d[k+1]*32+d[k]];k+=2;D|=(o<m)<<5;o=t[v+d[k+1]*32+d[k]];k+=2;m=t[v+d[k+1]*32+d[k]];k+=2;D|=(o<m)<<6;o=t[v+d[k+1]*32+d[k]];k+=2;m=t[v+d[k+1]*32+d[k]];k+=2;D|=(o<m)<<7;l[s+A]=D}s+=r}}}})();b.orb=a})(jsfeat);(function(b){var a=(function(){var c=jsfeat.imgproc.scharr_derivatives;return{track:function(n,u,ap,aL,k,N,R,K,f,q){if(typeof R===\"undefined\"){R=30}if(typeof K===\"undefined\"){K=new Uint8Array(k)}if(typeof f===\"undefined\"){f=0.01}if(typeof q===\"undefined\"){q=0.0001}var e=(N-1)*0.5;var h=(N*N)|0;var aa=h<<1;var r=n.data,S=u.data;var g=r[0].data,F=S[0].data;var M=r[0].cols,aB=r[0].rows,ay=0,aH=0;var az=jsfeat.cache.get_buffer(h<<2);var s=jsfeat.cache.get_buffer(aa<<2);var t=jsfeat.cache.get_buffer((aB*(M<<1))<<2);var V=new jsfeat.matrix_t(M,aB,jsfeat.S32C2_t,t.data);var w=az.i32;var ac=s.i32;var aA=t.i32;var ab=0,I=0,aM=0,at=0,aI=0,au=0;var am=0,aF=0,aD=0,af=0,ae=0;var E=0,z=0,Y=0,W=0;var p=0,o=0,aE=0,aC=0;var Q=0,P=0,J=0,H=0,ai=0,ak=0,l=0;var d=0,A=0,O=0;var U=0,T=0,aw=0,av=0;var ah=14;var C=14;var Z=C-5;var ax=(1<<((Z)-1));var ad=(1<<ah);var m=(1<<((C)-1));var X=1/(1<<20);var aK=0,aJ=0,ar=0,aq=0,al=0,v=0,B=0;var ao=0,an=0,ag=0,aj=0,aG=0;var G=1.1920929e-7;f*=f;for(;Q<k;++Q){K[Q]=1}var L=(n.levels-1)|0;ai=L;for(;ai>=0;--ai){am=(1/(1<<ai));ay=M>>ai;aH=aB>>ai;ab=ay<<1;g=r[ai].data;F=S[ai].data;A=(ay-N)|0;O=(aH-N)|0;c(r[ai],V);for(ak=0;ak<k;++ak){Q=ak<<1;P=Q+1;aF=ap[Q]*am;aD=ap[P]*am;if(ai==L){af=aF;ae=aD}else{af=aL[Q]*2;ae=aL[P]*2}aL[Q]=af;aL[P]=ae;aF-=e;aD-=e;p=aF|0;o=aD|0;J=(p<=d)|(p>=A)|(o<=d)|(o>=O);if(J!=0){if(ai==0){K[ak]=0}continue}U=aF-p;T=aD-o;aK=(((1-U)*(1-T)*ad)+0.5)|0;aJ=((U*(1-T)*ad)+0.5)|0;ar=(((1-U)*T*ad)+0.5)|0;aq=(ad-aK-aJ-ar);ao=0,an=0,ag=0;for(H=0;H<N;++H){I=((H+o)*ay+p)|0;aM=I<<1;at=(H*N)|0;aI=at<<1;for(J=0;J<N;++J,++I,++at,aM+=2){al=((g[I])*aK+(g[I+1])*aJ+(g[I+ay])*ar+(g[I+ay+1])*aq);al=(((al)+ax)>>(Z));v=(aA[aM]*aK+aA[aM+2]*aJ+aA[aM+ab]*ar+aA[aM+ab+2]*aq);v=(((v)+m)>>(C));B=(aA[aM+1]*aK+aA[aM+3]*aJ+aA[aM+ab+1]*ar+aA[aM+ab+3]*aq);B=(((B)+m)>>(C));w[at]=al;ac[aI++]=v;ac[aI++]=B;ao+=v*v;an+=v*B;ag+=B*B}}ao*=X;an*=X;ag*=X;aj=ao*ag-an*an;aG=(ag+ao-Math.sqrt((ao-ag)*(ao-ag)+4*an*an))/aa;if(aG<q||aj<G){if(ai==0){K[ak]=0}continue}aj=1/aj;af-=e;ae-=e;E=0;z=0;for(l=0;l<R;++l){aE=af|0;aC=ae|0;J=(aE<=d)|(aE>=A)|(aC<=d)|(aC>=O);if(J!=0){if(ai==0){K[ak]=0}break}U=af-aE;T=ae-aC;aK=(((1-U)*(1-T)*ad)+0.5)|0;aJ=((U*(1-T)*ad)+0.5)|0;ar=(((1-U)*T*ad)+0.5)|0;aq=(ad-aK-aJ-ar);aw=0,av=0;for(H=0;H<N;++H){au=((H+aC)*ay+aE)|0;at=(H*N)|0;aI=at<<1;for(J=0;J<N;++J,++au,++at){al=((F[au])*aK+(F[au+1])*aJ+(F[au+ay])*ar+(F[au+ay+1])*aq);al=(((al)+ax)>>(Z));al=(al-w[at]);aw+=al*ac[aI++];av+=al*ac[aI++]}}aw*=X;av*=X;Y=((an*av-ag*aw)*aj);W=((an*aw-ao*av)*aj);af+=Y;ae+=W;aL[Q]=af+e;aL[P]=ae+e;if(Y*Y+W*W<=f){break}if(l>0&&Math.abs(Y+E)<0.01&&Math.abs(W+z)<0.01){aL[Q]-=Y*0.5;aL[P]-=W*0.5;break}E=Y;z=W}}}jsfeat.cache.put_buffer(az);jsfeat.cache.put_buffer(s);jsfeat.cache.put_buffer(t)}}})();b.optical_flow_lk=a})(jsfeat);(function(b){var a=(function(){var c=function(e,d){var f=(e.width*0.25+0.5)|0;return d.x<=e.x+f&&d.x>=e.x-f&&d.y<=e.y+f&&d.y>=e.y-f&&d.width<=(e.width*1.5+0.5)|0&&(d.width*1.5+0.5)|0>=e.width};return{edges_density:0.07,detect_single_scale:function(E,ad,af,q,d,f,D,B){var z=(B.size[0]*D)|0,N=(B.size[1]*D)|0,V=(0.5*D+1.5)|0,U=V;var Z,X,W,Q,O,T=(d-z)|0,R=(f-N)|0;var H=(d+1)|0,w,p,r,S;var e=1/(z*N);var t,o,l,u,s,ae,A,g=true,L,h,n,G,m;var M,K,J,I,v,C;var ac=0,ab=z,aa=N*H,Y=aa+z;var F=((z*N)*255*this.edges_density)|0;var P=[];for(O=0;O<R;O+=U){ac=O*H;for(Q=0;Q<T;Q+=V,ac+=V){p=E[ac]-E[ac+ab]-E[ac+aa]+E[ac+Y];if(q){w=(q[ac]-q[ac+ab]-q[ac+aa]+q[ac+Y]);if(w<F||p<20){Q+=V,ac+=V;continue}}p*=e;r=(ad[ac]-ad[ac+ab]-ad[ac+aa]+ad[ac+Y])*e-p*p;S=r>0?Math.sqrt(r):1;t=B.complexClassifiers;s=t.length;g=true;for(Z=0;Z<s;++Z){o=t[Z];L=o.threshold;l=o.simpleClassifiers;ae=l.length;h=0;for(X=0;X<ae;++X){u=l[X];n=0;m=u.features;A=m.length;if(u.tilted===1){for(W=0;W<A;++W){G=m[W];M=~~(Q+G[0]*D)+~~(O+G[1]*D)*H;v=~~(G[2]*D);C=~~(G[3]*D);K=v*H;J=C*H;n+=(af[M]-af[M+v+K]-af[M-C+J]+af[M+v-C+K+J])*G[4]}}else{for(W=0;W<A;++W){G=m[W];M=~~(Q+G[0]*D)+~~(O+G[1]*D)*H;v=~~(G[2]*D);C=~~(G[3]*D);J=C*H;n+=(E[M]-E[M+v]-E[M+J]+E[M+J+v])*G[4]}}h+=(n*e<u.threshold*S)?u.left_val:u.right_val}if(h<L){g=false;break}}if(g){P.push({x:Q,y:O,width:z,height:N,neighbor:1,confidence:h});Q+=V,ac+=V}}}return P},detect_multi_scale:function(e,m,f,h,d,n,i,g,k){if(typeof g===\"undefined\"){g=1.2}if(typeof k===\"undefined\"){k=1}var o=i.size[0];var j=i.size[1];var l=[];while(k*o<d&&k*j<n){l=l.concat(this.detect_single_scale(e,m,f,h,d,n,k,i));k*=g}return l},group_rectangles:function(g,l){if(typeof l===\"undefined\"){l=1}var y,v,q=g.length;var r=[];for(y=0;y<q;++y){r[y]={parent:-1,element:g[y],rank:0}}for(y=0;y<q;++y){if(!r[y].element){continue}var t=y;while(r[t].parent!=-1){t=r[t].parent}for(v=0;v<q;++v){if(y!=v&&r[v].element&&c(r[y].element,r[v].element)){var s=v;while(r[s].parent!=-1){s=r[s].parent}if(s!=t){if(r[t].rank>r[s].rank){r[s].parent=t}else{r[t].parent=s;if(r[t].rank==r[s].rank){r[s].rank++}t=s}var A,d=v;while(r[d].parent!=-1){A=d;d=r[d].parent;r[A].parent=t}d=y;while(r[d].parent!=-1){A=d;d=r[d].parent;r[A].parent=t}}}}}var w=[];var o=0;for(y=0;y<q;y++){v=-1;var e=y;if(r[e].element){while(r[e].parent!=-1){e=r[e].parent}if(r[e].rank>=0){r[e].rank=~o++}v=~r[e].rank}w[y]=v}var m=[];for(y=0;y<o+1;++y){m[y]={neighbors:0,x:0,y:0,width:0,height:0,confidence:0}}for(y=0;y<q;++y){var z=g[y];var k=w[y];if(m[k].neighbors==0){m[k].confidence=z.confidence}++m[k].neighbors;m[k].x+=z.x;m[k].y+=z.y;m[k].width+=z.width;m[k].height+=z.height;m[k].confidence=Math.max(m[k].confidence,z.confidence)}var h=[];for(y=0;y<o;++y){q=m[y].neighbors;if(q>=l){h.push({x:(m[y].x*2+q)/(2*q),y:(m[y].y*2+q)/(2*q),width:(m[y].width*2+q)/(2*q),height:(m[y].height*2+q)/(2*q),neighbors:m[y].neighbors,confidence:m[y].confidence})}}var p=[];q=h.length;for(y=0;y<q;++y){var z=h[y];var x=true;for(v=0;v<q;++v){var u=h[v];var f=(u.width*0.25+0.5)|0;if(y!=v&&z.x>=u.x-f&&z.y>=u.y-f&&z.x+z.width<=u.x+u.width+f&&z.y+z.height<=u.y+u.height+f&&(u.neighbors>Math.max(3,z.neighbors)||z.neighbors<3)){x=false;break}}if(x){p.push(z)}}return p}}})();b.haar=a})(jsfeat);(function(a){var b=(function(){var c=function(f,e){var g=(f.width*0.25+0.5)|0;return e.x<=f.x+g&&e.x>=f.x-g&&e.y<=f.y+g&&e.y>=f.y-g&&e.width<=(f.width*1.5+0.5)|0&&(e.width*1.5+0.5)|0>=f.width};var d=new jsfeat.pyramid_t(1);return{interval:4,scale:1.1486,next:5,scale_to:1,prepare_cascade:function(g){var m=g.stage_classifier.length;for(var h=0;h<m;h++){var l=g.stage_classifier[h].feature;var e=g.stage_classifier[h].count;var i=g.stage_classifier[h]._feature=new Array(e);for(var f=0;f<e;f++){i[f]={size:l[f].size,px:new Array(l[f].size),pz:new Array(l[f].size),nx:new Array(l[f].size),nz:new Array(l[f].size)}}}},build_pyramid:function(e,k,s,f){if(typeof f===\"undefined\"){f=4}var q=e.cols,m=e.rows;var l=0,n=0,h=0;var p=false;var j=e,g=e;var r=jsfeat.U8_t|jsfeat.C1_t;this.interval=f;this.scale=Math.pow(2,1/(this.interval+1));this.next=(this.interval+1)|0;this.scale_to=(Math.log(Math.min(q/k,m/s))/Math.log(this.scale))|0;var o=((this.scale_to+this.next*2)*4)|0;if(d.levels!=o){d.levels=o;d.data=new Array(o);p=true;d.data[0]=e}for(l=1;l<=this.interval;++l){n=(q/Math.pow(this.scale,l))|0;h=(m/Math.pow(this.scale,l))|0;j=d.data[l<<2];if(p||n!=j.cols||h!=j.rows){d.data[l<<2]=new jsfeat.matrix_t(n,h,r);j=d.data[l<<2]}jsfeat.imgproc.resample(e,j,n,h)}for(l=this.next;l<this.scale_to+this.next*2;++l){g=d.data[(l<<2)-(this.next<<2)];j=d.data[l<<2];n=g.cols>>1;h=g.rows>>1;if(p||n!=j.cols||h!=j.rows){d.data[l<<2]=new jsfeat.matrix_t(n,h,r);j=d.data[l<<2]}jsfeat.imgproc.pyrdown(g,j)}for(l=this.next*2;l<this.scale_to+this.next*2;++l){g=d.data[(l<<2)-(this.next<<2)];n=g.cols>>1;h=g.rows>>1;j=d.data[(l<<2)+1];if(p||n!=j.cols||h!=j.rows){d.data[(l<<2)+1]=new jsfeat.matrix_t(n,h,r);j=d.data[(l<<2)+1]}jsfeat.imgproc.pyrdown(g,j,1,0);j=d.data[(l<<2)+2];if(p||n!=j.cols||h!=j.rows){d.data[(l<<2)+2]=new jsfeat.matrix_t(n,h,r);j=d.data[(l<<2)+2]}jsfeat.imgproc.pyrdown(g,j,0,1);j=d.data[(l<<2)+3];if(p||n!=j.cols||h!=j.rows){d.data[(l<<2)+3]=new jsfeat.matrix_t(n,h,r);j=d.data[(l<<2)+3]}jsfeat.imgproc.pyrdown(g,j,1,1)}return d},detect:function(G,L){var h=this.interval;var N=this.scale;var m=this.next;var l=this.scale_to;var ab=0,aa=0,Z=0,W=0,S=0,R=0,U=0,B=0,J=0,I=0,V=0,ae=0,M=0,ad=0,w=0,Y=0,g=0;var E=0,X,Q,D,H,F,O=true,o=true;var z=1,v=1;var s=[0,1,0,1];var r=[0,0,1,1];var K=[];var C=G.data,ac=1,u=2,t=4;var A=[],e=[0,0,0];var P=[0,0,0];var T=[0,0,0];for(ab=0;ab<l;ab++){w=(ab<<2);Y=C[w+(m<<3)].cols-(L.width>>2);g=C[w+(m<<3)].rows-(L.height>>2);P[0]=C[w].cols*ac;P[1]=C[w+(m<<2)].cols*ac;P[2]=C[w+(m<<3)].cols*ac;T[0]=(C[w].cols*t)-(Y*t);T[1]=(C[w+(m<<2)].cols*u)-(Y*u);T[2]=(C[w+(m<<3)].cols*ac)-(Y*ac);B=L.stage_classifier.length;for(aa=0;aa<B;aa++){D=L.stage_classifier[aa].feature;Q=L.stage_classifier[aa]._feature;J=L.stage_classifier[aa].count;for(Z=0;Z<J;Z++){H=Q[Z];F=D[Z];I=F.size|0;for(U=0;U<I;U++){H.px[U]=(F.px[U]*ac)+F.py[U]*P[F.pz[U]];H.pz[U]=F.pz[U];H.nx[U]=(F.nx[U]*ac)+F.ny[U]*P[F.nz[U]];H.nz[U]=F.nz[U]}}}A[0]=C[w].data;A[1]=C[w+(m<<2)].data;for(U=0;U<4;U++){A[2]=C[w+(m<<3)+U].data;e[0]=(s[U]*u)+r[U]*(C[w].cols*u);e[1]=(s[U]*ac)+r[U]*(C[w+(m<<2)].cols*ac);e[2]=0;for(R=0;R<g;R++){for(S=0;S<Y;S++){E=0;O=true;B=L.stage_classifier.length;for(aa=0;aa<B;aa++){E=0;X=L.stage_classifier[aa].alpha;Q=L.stage_classifier[aa]._feature;J=L.stage_classifier[aa].count;for(Z=0;Z<J;Z++){H=Q[Z];ae=A[H.pz[0]][e[H.pz[0]]+H.px[0]];M=A[H.nz[0]][e[H.nz[0]]+H.nx[0]];if(ae<=M){E+=X[Z<<1]}else{o=true;I=H.size;for(ad=1;ad<I;ad++){if(H.pz[ad]>=0){V=A[H.pz[ad]][e[H.pz[ad]]+H.px[ad]];if(V<ae){if(V<=M){o=false;break}ae=V}}if(H.nz[ad]>=0){W=A[H.nz[ad]][e[H.nz[ad]]+H.nx[ad]];if(W>M){if(ae<=W){o=false;break}M=W}}}E+=(o)?X[(Z<<1)+1]:X[Z<<1]}}if(E<L.stage_classifier[aa].threshold){O=false;break}}if(O){K.push({x:(S*4+s[U]*2)*z,y:(R*4+r[U]*2)*v,width:L.width*z,height:L.height*v,neighbor:1,confidence:E});++S;e[0]+=t;e[1]+=u;e[2]+=ac}e[0]+=t;e[1]+=u;e[2]+=ac}e[0]+=T[0];e[1]+=T[1];e[2]+=T[2]}}z*=N;v*=N}return K},group_rectangles:function(h,m){if(typeof m===\"undefined\"){m=1}var z,w,r=h.length;var s=[];for(z=0;z<r;++z){s[z]={parent:-1,element:h[z],rank:0}}for(z=0;z<r;++z){if(!s[z].element){continue}var u=z;while(s[u].parent!=-1){u=s[u].parent}for(w=0;w<r;++w){if(z!=w&&s[w].element&&c(s[z].element,s[w].element)){var t=w;while(s[t].parent!=-1){t=s[t].parent}if(t!=u){if(s[u].rank>s[t].rank){s[t].parent=u}else{s[u].parent=t;if(s[u].rank==s[t].rank){s[t].rank++}u=t}var B,e=w;while(s[e].parent!=-1){B=e;e=s[e].parent;s[B].parent=u}e=z;while(s[e].parent!=-1){B=e;e=s[e].parent;s[B].parent=u}}}}}var x=[];var p=0;for(z=0;z<r;z++){w=-1;var f=z;if(s[f].element){while(s[f].parent!=-1){f=s[f].parent}if(s[f].rank>=0){s[f].rank=~p++}w=~s[f].rank}x[z]=w}var o=[];for(z=0;z<p+1;++z){o[z]={neighbors:0,x:0,y:0,width:0,height:0,confidence:0}}for(z=0;z<r;++z){var A=h[z];var l=x[z];if(o[l].neighbors==0){o[l].confidence=A.confidence}++o[l].neighbors;o[l].x+=A.x;o[l].y+=A.y;o[l].width+=A.width;o[l].height+=A.height;o[l].confidence=Math.max(o[l].confidence,A.confidence)}var k=[];for(z=0;z<p;++z){r=o[z].neighbors;if(r>=m){k.push({x:(o[z].x*2+r)/(2*r),y:(o[z].y*2+r)/(2*r),width:(o[z].width*2+r)/(2*r),height:(o[z].height*2+r)/(2*r),neighbors:o[z].neighbors,confidence:o[z].confidence})}}var q=[];r=k.length;for(z=0;z<r;++z){var A=k[z];var y=true;for(w=0;w<r;++w){var v=k[w];var g=(v.width*0.25+0.5)|0;if(z!=w&&A.x>=v.x-g&&A.y>=v.y-g&&A.x+A.width<=v.x+v.width+g&&A.y+A.height<=v.y+v.height+g&&(v.neighbors>Math.max(3,A.neighbors)||A.neighbors<3)){y=false;break}}if(y){q.push(A)}}return q}}})();a.bbf=b})(jsfeat);(function(a){if(typeof module===\"undefined\"||typeof module.exports===\"undefined\"){window.jsfeat=a}else{module.exports=a}})(jsfeat);"
  },
  {
    "path": "lib/tracky-mouse/core/lib/no-eval.js",
    "content": "// @generated by eval-is-evil.html\n// \n// This is a monkey patch that replaces eval and Function\n// with versions that and only run code known ahead of time.\n// They do not use the real eval and Function, and thus\n// the Content Security Policy (CSP) can be tightened.\n(()=> {\n\tconst evalMap = new Map();\n\tevalMap.set(\"1+0\", function() { return (1+0); });\n\tevalMap.set(\"0+1\", function() { return (0+1); });\n\tevalMap.set(\"1+0\", function() { return (1+0); });\n\tevalMap.set(\"0+1\", function() { return (0+1); });\n\tevalMap.set(\"1-0\", function() { return (1-0); });\n\tevalMap.set(\"0-1\", function() { return (0-1); });\n\tevalMap.set(\"1-0\", function() { return (1-0); });\n\tevalMap.set(\"0-1\", function() { return (0-1); });\n\tevalMap.set(\"1*0\", function() { return (1*0); });\n\tevalMap.set(\"0*1\", function() { return (0*1); });\n\tevalMap.set(\"1*0\", function() { return (1*0); });\n\tevalMap.set(\"0*1\", function() { return (0*1); });\n\tevalMap.set(\"1/0\", function() { return (1/0); });\n\tevalMap.set(\"0/1\", function() { return (0/1); });\n\tevalMap.set(\"1/0\", function() { return (1/0); });\n\tevalMap.set(\"1%0\", function() { return (1%0); });\n\tevalMap.set(\"0%1\", function() { return (0%1); });\n\tevalMap.set(\"1%0\", function() { return (1%0); });\n\tevalMap.set(\"1&&0\", function() { return (1&&0); });\n\tevalMap.set(\"0&&1\", function() { return (0&&1); });\n\tevalMap.set(\"1&&0\", function() { return (1&&0); });\n\tevalMap.set(\"0&&1\", function() { return (0&&1); });\n\tevalMap.set(\"1||0\", function() { return (1||0); });\n\tevalMap.set(\"0||1\", function() { return (0||1); });\n\tevalMap.set(\"1||0\", function() { return (1||0); });\n\tevalMap.set(\"0||1\", function() { return (0||1); });\n\tevalMap.set(\"1===0\", function() { return (1===0); });\n\tevalMap.set(\"0===1\", function() { return (0===1); });\n\tevalMap.set(\"1===0\", function() { return (1===0); });\n\tevalMap.set(\"0===1\", function() { return (0===1); });\n\tevalMap.set(\"1!==0\", function() { return (1!==0); });\n\tevalMap.set(\"0!==1\", function() { return (0!==1); });\n\tevalMap.set(\"1!==0\", function() { return (1!==0); });\n\tevalMap.set(\"0!==1\", function() { return (0!==1); });\n\tevalMap.set(\"1<0\", function() { return (1<0); });\n\tevalMap.set(\"0<1\", function() { return (0<1); });\n\tevalMap.set(\"1<0\", function() { return (1<0); });\n\tevalMap.set(\"0<1\", function() { return (0<1); });\n\tevalMap.set(\"1>0\", function() { return (1>0); });\n\tevalMap.set(\"0>1\", function() { return (0>1); });\n\tevalMap.set(\"1>0\", function() { return (1>0); });\n\tevalMap.set(\"0>1\", function() { return (0>1); });\n\tevalMap.set(\"1<=0\", function() { return (1<=0); });\n\tevalMap.set(\"0<=1\", function() { return (0<=1); });\n\tevalMap.set(\"1<=0\", function() { return (1<=0); });\n\tevalMap.set(\"0<=1\", function() { return (0<=1); });\n\tevalMap.set(\"1>=0\", function() { return (1>=0); });\n\tevalMap.set(\"0>=1\", function() { return (0>=1); });\n\tevalMap.set(\"1>=0\", function() { return (1>=0); });\n\tevalMap.set(\"0>=1\", function() { return (0>=1); });\n\tevalMap.set(\"1&0\", function() { return (1&0); });\n\tevalMap.set(\"0&1\", function() { return (0&1); });\n\tevalMap.set(\"1&0\", function() { return (1&0); });\n\tevalMap.set(\"0&1\", function() { return (0&1); });\n\tevalMap.set(\"1|0\", function() { return (1|0); });\n\tevalMap.set(\"0|1\", function() { return (0|1); });\n\tevalMap.set(\"1|0\", function() { return (1|0); });\n\tevalMap.set(\"0|1\", function() { return (0|1); });\n\tevalMap.set(\"1^0\", function() { return (1^0); });\n\tevalMap.set(\"0^1\", function() { return (0^1); });\n\tevalMap.set(\"1^0\", function() { return (1^0); });\n\tevalMap.set(\"0^1\", function() { return (0^1); });\n\tevalMap.set(\"1<<0\", function() { return (1<<0); });\n\tevalMap.set(\"0<<1\", function() { return (0<<1); });\n\tevalMap.set(\"1<<0\", function() { return (1<<0); });\n\tevalMap.set(\"0<<1\", function() { return (0<<1); });\n\tevalMap.set(\"1>>0\", function() { return (1>>0); });\n\tevalMap.set(\"0>>1\", function() { return (0>>1); });\n\tevalMap.set(\"1>>0\", function() { return (1>>0); });\n\tevalMap.set(\"0>>1\", function() { return (0>>1); });\n\tevalMap.set(\"1>>>0\", function() { return (1>>>0); });\n\tevalMap.set(\"0>>>1\", function() { return (0>>>1); });\n\tevalMap.set(\"1>>>0\", function() { return (1>>>0); });\n\tevalMap.set(\"0>>>1\", function() { return (0>>>1); });\n\tconst functionMap = new Map();\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] + y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] + y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x + y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x + y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] + y\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] + y\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.addVV, VS = numeric.addVS, SV = numeric.addSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x += y\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.addVV, VS = numeric.addVS, SV = numeric.addSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x += y\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] += x[i]\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] += x[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] += x\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] += x\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.addeqV, S = numeric.addeqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.addeqV, S = numeric.addeqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] - y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] - y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x - y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x - y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] - y\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] - y\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.subVV, VS = numeric.subVS, SV = numeric.subSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x -= y\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.subVV, VS = numeric.subVS, SV = numeric.subSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x -= y\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] -= x[i]\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] -= x[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] -= x\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] -= x\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.subeqV, S = numeric.subeqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.subeqV, S = numeric.subeqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] * y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] * y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x * y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x * y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] * y\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] * y\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.mulVV, VS = numeric.mulVS, SV = numeric.mulSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x *= y\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.mulVV, VS = numeric.mulVS, SV = numeric.mulSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x *= y\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] *= x[i]\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] *= x[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] *= x\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] *= x\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.muleqV, S = numeric.muleqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.muleqV, S = numeric.muleqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] / y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] / y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x / y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x / y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] / y\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] / y\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.divVV, VS = numeric.divVS, SV = numeric.divSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x /= y\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.divVV, VS = numeric.divVS, SV = numeric.divSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x /= y\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] /= x[i]\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] /= x[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] /= x\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] /= x\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.diveqV, S = numeric.diveqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.diveqV, S = numeric.diveqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] % y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] % y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x % y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x % y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] % y\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] % y\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.modVV, VS = numeric.modVS, SV = numeric.modSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x %= y\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.modVV, VS = numeric.modVS, SV = numeric.modSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x %= y\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] %= x[i]\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] %= x[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] %= x\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] %= x\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.modeqV, S = numeric.modeqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.modeqV, S = numeric.modeqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] && y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] && y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x && y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x && y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] && y\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] && y\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.andVV, VS = numeric.andVS, SV = numeric.andSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x = x && y\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.andVV, VS = numeric.andVS, SV = numeric.andSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x = x && y\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = ret[i] && x[i]\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = ret[i] && x[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = ret[i] && x\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = ret[i] && x\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.andeqV, S = numeric.andeqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.andeqV, S = numeric.andeqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] || y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] || y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x || y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x || y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] || y\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] || y\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.orVV, VS = numeric.orVS, SV = numeric.orSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x = x || y\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.orVV, VS = numeric.orVS, SV = numeric.orSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x = x || y\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = ret[i] || x[i]\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = ret[i] || x[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = ret[i] || x\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = ret[i] || x\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.oreqV, S = numeric.oreqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.oreqV, S = numeric.oreqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] === y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] === y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x === y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x === y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] === y\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] === y\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.eqVV, VS = numeric.eqVS, SV = numeric.eqSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x = x === y\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.eqVV, VS = numeric.eqVS, SV = numeric.eqSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x = x === y\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = ret[i] === x[i]\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = ret[i] === x[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = ret[i] === x\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = ret[i] === x\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.eqeqV, S = numeric.eqeqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.eqeqV, S = numeric.eqeqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] !== y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] !== y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x !== y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x !== y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] !== y\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] !== y\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.neqVV, VS = numeric.neqVS, SV = numeric.neqSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x = x !== y\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.neqVV, VS = numeric.neqVS, SV = numeric.neqSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x = x !== y\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = ret[i] !== x[i]\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = ret[i] !== x[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = ret[i] !== x\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = ret[i] !== x\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.neqeqV, S = numeric.neqeqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.neqeqV, S = numeric.neqeqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] < y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] < y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x < y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x < y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] < y\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] < y\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.ltVV, VS = numeric.ltVS, SV = numeric.ltSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x = x < y\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.ltVV, VS = numeric.ltVS, SV = numeric.ltSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x = x < y\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = ret[i] < x[i]\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = ret[i] < x[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = ret[i] < x\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = ret[i] < x\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.lteqV, S = numeric.lteqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.lteqV, S = numeric.lteqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] > y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] > y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x > y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x > y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] > y\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] > y\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.gtVV, VS = numeric.gtVS, SV = numeric.gtSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x = x > y\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.gtVV, VS = numeric.gtVS, SV = numeric.gtSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x = x > y\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = ret[i] > x[i]\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = ret[i] > x[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = ret[i] > x\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = ret[i] > x\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.gteqV, S = numeric.gteqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.gteqV, S = numeric.gteqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] <= y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] <= y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x <= y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x <= y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] <= y\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] <= y\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.leqVV, VS = numeric.leqVS, SV = numeric.leqSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x = x <= y\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.leqVV, VS = numeric.leqVS, SV = numeric.leqSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x = x <= y\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = ret[i] <= x[i]\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = ret[i] <= x[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = ret[i] <= x\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = ret[i] <= x\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.leqeqV, S = numeric.leqeqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.leqeqV, S = numeric.leqeqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] >= y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] >= y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x >= y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x >= y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] >= y\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] >= y\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.geqVV, VS = numeric.geqVS, SV = numeric.geqSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x = x >= y\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.geqVV, VS = numeric.geqVS, SV = numeric.geqSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x = x >= y\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = ret[i] >= x[i]\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = ret[i] >= x[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = ret[i] >= x\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = ret[i] >= x\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.geqeqV, S = numeric.geqeqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.geqeqV, S = numeric.geqeqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] & y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] & y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x & y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x & y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] & y\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] & y\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.bandVV, VS = numeric.bandVS, SV = numeric.bandSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x &= y\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.bandVV, VS = numeric.bandVS, SV = numeric.bandSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x &= y\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] &= x[i]\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] &= x[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] &= x\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] &= x\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.bandeqV, S = numeric.bandeqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.bandeqV, S = numeric.bandeqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] | y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] | y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x | y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x | y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] | y\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] | y\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.borVV, VS = numeric.borVS, SV = numeric.borSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x |= y\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.borVV, VS = numeric.borVS, SV = numeric.borSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x |= y\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] |= x[i]\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] |= x[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] |= x\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] |= x\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.boreqV, S = numeric.boreqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.boreqV, S = numeric.boreqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] ^ y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] ^ y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x ^ y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x ^ y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] ^ y\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] ^ y\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.bxorVV, VS = numeric.bxorVS, SV = numeric.bxorSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x ^= y\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.bxorVV, VS = numeric.bxorVS, SV = numeric.bxorSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x ^= y\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] ^= x[i]\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] ^= x[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] ^= x\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] ^= x\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.bxoreqV, S = numeric.bxoreqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.bxoreqV, S = numeric.bxoreqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] << y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] << y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x << y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x << y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] << y\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] << y\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.lshiftVV, VS = numeric.lshiftVS, SV = numeric.lshiftSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x <<= y\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.lshiftVV, VS = numeric.lshiftVS, SV = numeric.lshiftSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x <<= y\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] <<= x[i]\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] <<= x[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] <<= x\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] <<= x\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.lshifteqV, S = numeric.lshifteqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.lshifteqV, S = numeric.lshifteqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] >> y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] >> y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x >> y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x >> y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] >> y\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] >> y\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.rshiftVV, VS = numeric.rshiftVS, SV = numeric.rshiftSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x >>= y\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.rshiftVV, VS = numeric.rshiftVS, SV = numeric.rshiftSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x >>= y\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] >>= x[i]\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] >>= x[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] >>= x\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] >>= x\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.rshifteqV, S = numeric.rshifteqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.rshifteqV, S = numeric.rshifteqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] >>> y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] >>> y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x >>> y[i]\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x >>> y[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = x[i] >>> y\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = x[i] >>> y\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.rrshiftVV, VS = numeric.rrshiftVS, SV = numeric.rrshiftSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x >>>= y\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.rrshiftVV, VS = numeric.rrshiftVS, SV = numeric.rrshiftSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x >>>= y\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] >>>= x[i]\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] >>>= x[i]\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] >>>= x\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] >>>= x\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.rrshifteqV, S = numeric.rrshifteqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.rrshifteqV, S = numeric.rrshifteqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\nvar atan2 = Math.atan2;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = atan2(x[i],y[i])\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\nvar atan2 = Math.atan2;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = atan2(x[i],y[i])\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\nvar atan2 = Math.atan2;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = atan2(x,y[i])\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\nvar atan2 = Math.atan2;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = atan2(x,y[i])\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\nvar atan2 = Math.atan2;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = atan2(x[i],y)\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\nvar atan2 = Math.atan2;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = atan2(x[i],y)\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.atan2VV, VS = numeric.atan2VS, SV = numeric.atan2SV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x = atan2(x,y)\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.atan2VV, VS = numeric.atan2VS, SV = numeric.atan2SV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x = atan2(x,y)\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\nvar atan2 = Math.atan2;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = atan2(ret[i],x[i])\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\nvar atan2 = Math.atan2;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = atan2(ret[i],x[i])\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\nvar atan2 = Math.atan2;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = atan2(ret[i],x)\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\nvar atan2 = Math.atan2;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = atan2(ret[i],x)\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.atan2eqV, S = numeric.atan2eqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.atan2eqV, S = numeric.atan2eqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\nvar pow = Math.pow;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = pow(x[i],y[i])\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\nvar pow = Math.pow;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = pow(x[i],y[i])\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\nvar pow = Math.pow;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = pow(x,y[i])\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\nvar pow = Math.pow;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = pow(x,y[i])\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\nvar pow = Math.pow;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = pow(x[i],y)\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\nvar pow = Math.pow;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = pow(x[i],y)\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.powVV, VS = numeric.powVS, SV = numeric.powSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x = pow(x,y)\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.powVV, VS = numeric.powVS, SV = numeric.powSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x = pow(x,y)\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\nvar pow = Math.pow;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = pow(ret[i],x[i])\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\nvar pow = Math.pow;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = pow(ret[i],x[i])\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\nvar pow = Math.pow;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = pow(ret[i],x)\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\nvar pow = Math.pow;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = pow(ret[i],x)\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.poweqV, S = numeric.poweqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.poweqV, S = numeric.poweqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\nvar max = Math.max;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = max(x[i],y[i])\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\nvar max = Math.max;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = max(x[i],y[i])\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\nvar max = Math.max;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = max(x,y[i])\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\nvar max = Math.max;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = max(x,y[i])\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\nvar max = Math.max;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = max(x[i],y)\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\nvar max = Math.max;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = max(x[i],y)\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.maxVV, VS = numeric.maxVS, SV = numeric.maxSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x = max(x,y)\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.maxVV, VS = numeric.maxVS, SV = numeric.maxSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x = max(x,y)\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\nvar max = Math.max;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = max(ret[i],x[i])\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\nvar max = Math.max;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = max(ret[i],x[i])\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\nvar max = Math.max;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = max(ret[i],x)\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\nvar max = Math.max;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = max(ret[i],x)\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.maxeqV, S = numeric.maxeqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.maxeqV, S = numeric.maxeqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\nvar min = Math.min;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = min(x[i],y[i])\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\nvar min = Math.min;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = min(x[i],y[i])\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = y.length;\\\\nvar i, ret = Array(_n);\\\\nvar min = Math.min;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = min(x,y[i])\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = y.length;\nvar i, ret = Array(_n);\nvar min = Math.min;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = min(x,y[i])\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\nvar min = Math.min;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = min(x[i],y)\\\\n}\\\\nreturn ret;\\\"}\", function(x,y) { var _n = x.length;\nvar i, ret = Array(_n);\nvar min = Math.min;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = min(x[i],y)\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar VV = numeric.minVV, VS = numeric.minVS, SV = numeric.minSV;\\\\nvar dim = numeric.dim;\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof x === \\\\\\\"object\\\\\\\") {\\\\n      if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(x),0,VV);\\\\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\\\\n  } else if(typeof y === \\\\\\\"object\\\\\\\") x = numeric._biforeach2(x,y,dim(y),0,SV);\\\\n  else x = min(x,y)\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric.minVV, VS = numeric.minVS, SV = numeric.minSV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof x === \"object\") {\n      if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(x),0,VV);\n      else x = numeric._biforeach2(x,y,dim(x),0,VS);\n  } else if(typeof y === \"object\") x = numeric._biforeach2(x,y,dim(y),0,SV);\n  else x = min(x,y)\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i;\\\\nvar min = Math.min;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = min(ret[i],x[i])\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = x.length;\nvar i;\nvar min = Math.min;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = min(ret[i],x[i])\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\",\\\"x\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\nvar min = Math.min;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = min(ret[i],x)\\\\n}\\\\nreturn ret;\\\"}\", function(ret,x) { var _n = ret.length;\nvar i;\nvar min = Math.min;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = min(ret[i],x)\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var n = arguments.length, i, x = arguments[0], y;\\\\nvar V = numeric.mineqV, S = numeric.mineqS\\\\nvar s = numeric.dim(x);\\\\nfor(i=1;i!==n;++i) { \\\\n  y = arguments[i];\\\\n  if(typeof y === \\\\\\\"object\\\\\\\") numeric._biforeach(x,y,s,0,V);\\\\n  else numeric._biforeach(x,y,s,0,S);\\\\n}\\\\nreturn x;\\\\n\\\"}\", function() { var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric.mineqV, S = numeric.mineqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n  y = arguments[i];\n  if(typeof y === \"object\") numeric._biforeach(x,y,s,0,V);\n  else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = -(ret[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(ret) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = -(ret[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return -x\\\\nvar i;\\\\nvar V = numeric.negeqV;\\\\nvar s = numeric.dim(x);\\\\nnumeric._foreach(x,s,0,V);\\\\nreturn x;\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return -x\nvar i;\nvar V = numeric.negeqV;\nvar s = numeric.dim(x);\nnumeric._foreach(x,s,0,V);\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = -(x[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(x) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = -(x[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return -(x)\\\\nvar i;\\\\nvar V = numeric.negV;\\\\nvar s = numeric.dim(x);\\\\nreturn numeric._foreach2(x,s,0,V);\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return -(x)\nvar i;\nvar V = numeric.negV;\nvar s = numeric.dim(x);\nreturn numeric._foreach2(x,s,0,V);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = !(ret[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(ret) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = !(ret[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return !x\\\\nvar i;\\\\nvar V = numeric.noteqV;\\\\nvar s = numeric.dim(x);\\\\nnumeric._foreach(x,s,0,V);\\\\nreturn x;\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return !x\nvar i;\nvar V = numeric.noteqV;\nvar s = numeric.dim(x);\nnumeric._foreach(x,s,0,V);\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = !(x[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(x) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = !(x[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return !(x)\\\\nvar i;\\\\nvar V = numeric.notV;\\\\nvar s = numeric.dim(x);\\\\nreturn numeric._foreach2(x,s,0,V);\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return !(x)\nvar i;\nvar V = numeric.notV;\nvar s = numeric.dim(x);\nreturn numeric._foreach2(x,s,0,V);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = ~(ret[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(ret) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = ~(ret[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return ~x\\\\nvar i;\\\\nvar V = numeric.bnoteqV;\\\\nvar s = numeric.dim(x);\\\\nnumeric._foreach(x,s,0,V);\\\\nreturn x;\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return ~x\nvar i;\nvar V = numeric.bnoteqV;\nvar s = numeric.dim(x);\nnumeric._foreach(x,s,0,V);\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = ~(x[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(x) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = ~(x[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return ~(x)\\\\nvar i;\\\\nvar V = numeric.bnotV;\\\\nvar s = numeric.dim(x);\\\\nreturn numeric._foreach2(x,s,0,V);\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return ~(x)\nvar i;\nvar V = numeric.bnotV;\nvar s = numeric.dim(x);\nreturn numeric._foreach2(x,s,0,V);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = (ret[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(ret) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = (ret[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return x\\\\nvar i;\\\\nvar V = numeric.cloneeqV;\\\\nvar s = numeric.dim(x);\\\\nnumeric._foreach(x,s,0,V);\\\\nreturn x;\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return x\nvar i;\nvar V = numeric.cloneeqV;\nvar s = numeric.dim(x);\nnumeric._foreach(x,s,0,V);\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = (x[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(x) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = (x[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return (x)\\\\nvar i;\\\\nvar V = numeric.cloneV;\\\\nvar s = numeric.dim(x);\\\\nreturn numeric._foreach2(x,s,0,V);\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return (x)\nvar i;\nvar V = numeric.cloneV;\nvar s = numeric.dim(x);\nreturn numeric._foreach2(x,s,0,V);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\nvar abs = Math.abs;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = abs(ret[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(ret) { var _n = ret.length;\nvar i;\nvar abs = Math.abs;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = abs(ret[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return absx\\\\nvar i;\\\\nvar V = numeric.abseqV;\\\\nvar s = numeric.dim(x);\\\\nnumeric._foreach(x,s,0,V);\\\\nreturn x;\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return absx\nvar i;\nvar V = numeric.abseqV;\nvar s = numeric.dim(x);\nnumeric._foreach(x,s,0,V);\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\nvar abs = Math.abs;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = abs(x[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(x) { var _n = x.length;\nvar i, ret = Array(_n);\nvar abs = Math.abs;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = abs(x[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return abs(x)\\\\nvar i;\\\\nvar V = numeric.absV;\\\\nvar s = numeric.dim(x);\\\\nreturn numeric._foreach2(x,s,0,V);\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return abs(x)\nvar i;\nvar V = numeric.absV;\nvar s = numeric.dim(x);\nreturn numeric._foreach2(x,s,0,V);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\nvar acos = Math.acos;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = acos(ret[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(ret) { var _n = ret.length;\nvar i;\nvar acos = Math.acos;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = acos(ret[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return acosx\\\\nvar i;\\\\nvar V = numeric.acoseqV;\\\\nvar s = numeric.dim(x);\\\\nnumeric._foreach(x,s,0,V);\\\\nreturn x;\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return acosx\nvar i;\nvar V = numeric.acoseqV;\nvar s = numeric.dim(x);\nnumeric._foreach(x,s,0,V);\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\nvar acos = Math.acos;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = acos(x[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(x) { var _n = x.length;\nvar i, ret = Array(_n);\nvar acos = Math.acos;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = acos(x[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return acos(x)\\\\nvar i;\\\\nvar V = numeric.acosV;\\\\nvar s = numeric.dim(x);\\\\nreturn numeric._foreach2(x,s,0,V);\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return acos(x)\nvar i;\nvar V = numeric.acosV;\nvar s = numeric.dim(x);\nreturn numeric._foreach2(x,s,0,V);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\nvar asin = Math.asin;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = asin(ret[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(ret) { var _n = ret.length;\nvar i;\nvar asin = Math.asin;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = asin(ret[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return asinx\\\\nvar i;\\\\nvar V = numeric.asineqV;\\\\nvar s = numeric.dim(x);\\\\nnumeric._foreach(x,s,0,V);\\\\nreturn x;\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return asinx\nvar i;\nvar V = numeric.asineqV;\nvar s = numeric.dim(x);\nnumeric._foreach(x,s,0,V);\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\nvar asin = Math.asin;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = asin(x[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(x) { var _n = x.length;\nvar i, ret = Array(_n);\nvar asin = Math.asin;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = asin(x[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return asin(x)\\\\nvar i;\\\\nvar V = numeric.asinV;\\\\nvar s = numeric.dim(x);\\\\nreturn numeric._foreach2(x,s,0,V);\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return asin(x)\nvar i;\nvar V = numeric.asinV;\nvar s = numeric.dim(x);\nreturn numeric._foreach2(x,s,0,V);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\nvar atan = Math.atan;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = atan(ret[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(ret) { var _n = ret.length;\nvar i;\nvar atan = Math.atan;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = atan(ret[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return atanx\\\\nvar i;\\\\nvar V = numeric.ataneqV;\\\\nvar s = numeric.dim(x);\\\\nnumeric._foreach(x,s,0,V);\\\\nreturn x;\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return atanx\nvar i;\nvar V = numeric.ataneqV;\nvar s = numeric.dim(x);\nnumeric._foreach(x,s,0,V);\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\nvar atan = Math.atan;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = atan(x[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(x) { var _n = x.length;\nvar i, ret = Array(_n);\nvar atan = Math.atan;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = atan(x[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return atan(x)\\\\nvar i;\\\\nvar V = numeric.atanV;\\\\nvar s = numeric.dim(x);\\\\nreturn numeric._foreach2(x,s,0,V);\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return atan(x)\nvar i;\nvar V = numeric.atanV;\nvar s = numeric.dim(x);\nreturn numeric._foreach2(x,s,0,V);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\nvar ceil = Math.ceil;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = ceil(ret[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(ret) { var _n = ret.length;\nvar i;\nvar ceil = Math.ceil;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = ceil(ret[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return ceilx\\\\nvar i;\\\\nvar V = numeric.ceileqV;\\\\nvar s = numeric.dim(x);\\\\nnumeric._foreach(x,s,0,V);\\\\nreturn x;\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return ceilx\nvar i;\nvar V = numeric.ceileqV;\nvar s = numeric.dim(x);\nnumeric._foreach(x,s,0,V);\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\nvar ceil = Math.ceil;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = ceil(x[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(x) { var _n = x.length;\nvar i, ret = Array(_n);\nvar ceil = Math.ceil;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = ceil(x[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return ceil(x)\\\\nvar i;\\\\nvar V = numeric.ceilV;\\\\nvar s = numeric.dim(x);\\\\nreturn numeric._foreach2(x,s,0,V);\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return ceil(x)\nvar i;\nvar V = numeric.ceilV;\nvar s = numeric.dim(x);\nreturn numeric._foreach2(x,s,0,V);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\nvar cos = Math.cos;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = cos(ret[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(ret) { var _n = ret.length;\nvar i;\nvar cos = Math.cos;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = cos(ret[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return cosx\\\\nvar i;\\\\nvar V = numeric.coseqV;\\\\nvar s = numeric.dim(x);\\\\nnumeric._foreach(x,s,0,V);\\\\nreturn x;\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return cosx\nvar i;\nvar V = numeric.coseqV;\nvar s = numeric.dim(x);\nnumeric._foreach(x,s,0,V);\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\nvar cos = Math.cos;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = cos(x[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(x) { var _n = x.length;\nvar i, ret = Array(_n);\nvar cos = Math.cos;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = cos(x[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return cos(x)\\\\nvar i;\\\\nvar V = numeric.cosV;\\\\nvar s = numeric.dim(x);\\\\nreturn numeric._foreach2(x,s,0,V);\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return cos(x)\nvar i;\nvar V = numeric.cosV;\nvar s = numeric.dim(x);\nreturn numeric._foreach2(x,s,0,V);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\nvar exp = Math.exp;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = exp(ret[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(ret) { var _n = ret.length;\nvar i;\nvar exp = Math.exp;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = exp(ret[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return expx\\\\nvar i;\\\\nvar V = numeric.expeqV;\\\\nvar s = numeric.dim(x);\\\\nnumeric._foreach(x,s,0,V);\\\\nreturn x;\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return expx\nvar i;\nvar V = numeric.expeqV;\nvar s = numeric.dim(x);\nnumeric._foreach(x,s,0,V);\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\nvar exp = Math.exp;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = exp(x[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(x) { var _n = x.length;\nvar i, ret = Array(_n);\nvar exp = Math.exp;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = exp(x[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return exp(x)\\\\nvar i;\\\\nvar V = numeric.expV;\\\\nvar s = numeric.dim(x);\\\\nreturn numeric._foreach2(x,s,0,V);\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return exp(x)\nvar i;\nvar V = numeric.expV;\nvar s = numeric.dim(x);\nreturn numeric._foreach2(x,s,0,V);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\nvar floor = Math.floor;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = floor(ret[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(ret) { var _n = ret.length;\nvar i;\nvar floor = Math.floor;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = floor(ret[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return floorx\\\\nvar i;\\\\nvar V = numeric.flooreqV;\\\\nvar s = numeric.dim(x);\\\\nnumeric._foreach(x,s,0,V);\\\\nreturn x;\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return floorx\nvar i;\nvar V = numeric.flooreqV;\nvar s = numeric.dim(x);\nnumeric._foreach(x,s,0,V);\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\nvar floor = Math.floor;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = floor(x[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(x) { var _n = x.length;\nvar i, ret = Array(_n);\nvar floor = Math.floor;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = floor(x[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return floor(x)\\\\nvar i;\\\\nvar V = numeric.floorV;\\\\nvar s = numeric.dim(x);\\\\nreturn numeric._foreach2(x,s,0,V);\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return floor(x)\nvar i;\nvar V = numeric.floorV;\nvar s = numeric.dim(x);\nreturn numeric._foreach2(x,s,0,V);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\nvar log = Math.log;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = log(ret[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(ret) { var _n = ret.length;\nvar i;\nvar log = Math.log;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = log(ret[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return logx\\\\nvar i;\\\\nvar V = numeric.logeqV;\\\\nvar s = numeric.dim(x);\\\\nnumeric._foreach(x,s,0,V);\\\\nreturn x;\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return logx\nvar i;\nvar V = numeric.logeqV;\nvar s = numeric.dim(x);\nnumeric._foreach(x,s,0,V);\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\nvar log = Math.log;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = log(x[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(x) { var _n = x.length;\nvar i, ret = Array(_n);\nvar log = Math.log;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = log(x[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return log(x)\\\\nvar i;\\\\nvar V = numeric.logV;\\\\nvar s = numeric.dim(x);\\\\nreturn numeric._foreach2(x,s,0,V);\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return log(x)\nvar i;\nvar V = numeric.logV;\nvar s = numeric.dim(x);\nreturn numeric._foreach2(x,s,0,V);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\nvar round = Math.round;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = round(ret[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(ret) { var _n = ret.length;\nvar i;\nvar round = Math.round;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = round(ret[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return roundx\\\\nvar i;\\\\nvar V = numeric.roundeqV;\\\\nvar s = numeric.dim(x);\\\\nnumeric._foreach(x,s,0,V);\\\\nreturn x;\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return roundx\nvar i;\nvar V = numeric.roundeqV;\nvar s = numeric.dim(x);\nnumeric._foreach(x,s,0,V);\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\nvar round = Math.round;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = round(x[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(x) { var _n = x.length;\nvar i, ret = Array(_n);\nvar round = Math.round;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = round(x[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return round(x)\\\\nvar i;\\\\nvar V = numeric.roundV;\\\\nvar s = numeric.dim(x);\\\\nreturn numeric._foreach2(x,s,0,V);\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return round(x)\nvar i;\nvar V = numeric.roundV;\nvar s = numeric.dim(x);\nreturn numeric._foreach2(x,s,0,V);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\nvar sin = Math.sin;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = sin(ret[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(ret) { var _n = ret.length;\nvar i;\nvar sin = Math.sin;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = sin(ret[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return sinx\\\\nvar i;\\\\nvar V = numeric.sineqV;\\\\nvar s = numeric.dim(x);\\\\nnumeric._foreach(x,s,0,V);\\\\nreturn x;\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return sinx\nvar i;\nvar V = numeric.sineqV;\nvar s = numeric.dim(x);\nnumeric._foreach(x,s,0,V);\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\nvar sin = Math.sin;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = sin(x[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(x) { var _n = x.length;\nvar i, ret = Array(_n);\nvar sin = Math.sin;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = sin(x[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return sin(x)\\\\nvar i;\\\\nvar V = numeric.sinV;\\\\nvar s = numeric.dim(x);\\\\nreturn numeric._foreach2(x,s,0,V);\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return sin(x)\nvar i;\nvar V = numeric.sinV;\nvar s = numeric.dim(x);\nreturn numeric._foreach2(x,s,0,V);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\nvar sqrt = Math.sqrt;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = sqrt(ret[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(ret) { var _n = ret.length;\nvar i;\nvar sqrt = Math.sqrt;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = sqrt(ret[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return sqrtx\\\\nvar i;\\\\nvar V = numeric.sqrteqV;\\\\nvar s = numeric.dim(x);\\\\nnumeric._foreach(x,s,0,V);\\\\nreturn x;\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return sqrtx\nvar i;\nvar V = numeric.sqrteqV;\nvar s = numeric.dim(x);\nnumeric._foreach(x,s,0,V);\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\nvar sqrt = Math.sqrt;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = sqrt(x[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(x) { var _n = x.length;\nvar i, ret = Array(_n);\nvar sqrt = Math.sqrt;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = sqrt(x[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return sqrt(x)\\\\nvar i;\\\\nvar V = numeric.sqrtV;\\\\nvar s = numeric.dim(x);\\\\nreturn numeric._foreach2(x,s,0,V);\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return sqrt(x)\nvar i;\nvar V = numeric.sqrtV;\nvar s = numeric.dim(x);\nreturn numeric._foreach2(x,s,0,V);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\nvar tan = Math.tan;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = tan(ret[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(ret) { var _n = ret.length;\nvar i;\nvar tan = Math.tan;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = tan(ret[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return tanx\\\\nvar i;\\\\nvar V = numeric.taneqV;\\\\nvar s = numeric.dim(x);\\\\nnumeric._foreach(x,s,0,V);\\\\nreturn x;\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return tanx\nvar i;\nvar V = numeric.taneqV;\nvar s = numeric.dim(x);\nnumeric._foreach(x,s,0,V);\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\nvar tan = Math.tan;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = tan(x[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(x) { var _n = x.length;\nvar i, ret = Array(_n);\nvar tan = Math.tan;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = tan(x[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return tan(x)\\\\nvar i;\\\\nvar V = numeric.tanV;\\\\nvar s = numeric.dim(x);\\\\nreturn numeric._foreach2(x,s,0,V);\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return tan(x)\nvar i;\nvar V = numeric.tanV;\nvar s = numeric.dim(x);\nreturn numeric._foreach2(x,s,0,V);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = isNaN(ret[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(ret) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = isNaN(ret[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return isNaNx\\\\nvar i;\\\\nvar V = numeric.isNaNeqV;\\\\nvar s = numeric.dim(x);\\\\nnumeric._foreach(x,s,0,V);\\\\nreturn x;\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return isNaNx\nvar i;\nvar V = numeric.isNaNeqV;\nvar s = numeric.dim(x);\nnumeric._foreach(x,s,0,V);\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = isNaN(x[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(x) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = isNaN(x[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return isNaN(x)\\\\nvar i;\\\\nvar V = numeric.isNaNV;\\\\nvar s = numeric.dim(x);\\\\nreturn numeric._foreach2(x,s,0,V);\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return isNaN(x)\nvar i;\nvar V = numeric.isNaNV;\nvar s = numeric.dim(x);\nreturn numeric._foreach2(x,s,0,V);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"ret\\\"],\\\"code\\\":\\\"var _n = ret.length;\\\\nvar i;\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = isFinite(ret[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(ret) { var _n = ret.length;\nvar i;\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = isFinite(ret[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return isFinitex\\\\nvar i;\\\\nvar V = numeric.isFiniteeqV;\\\\nvar s = numeric.dim(x);\\\\nnumeric._foreach(x,s,0,V);\\\\nreturn x;\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return isFinitex\nvar i;\nvar V = numeric.isFiniteeqV;\nvar s = numeric.dim(x);\nnumeric._foreach(x,s,0,V);\nreturn x;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var _n = x.length;\\\\nvar i, ret = Array(_n);\\\\n\\\\nfor(i=_n-1;i!==-1;--i) {\\\\nret[i] = isFinite(x[i]);\\\\n}\\\\nreturn ret;\\\"}\", function(x) { var _n = x.length;\nvar i, ret = Array(_n);\n\nfor(i=_n-1;i!==-1;--i) {\nret[i] = isFinite(x[i]);\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"if(typeof x !== \\\\\\\"object\\\\\\\") return isFinite(x)\\\\nvar i;\\\\nvar V = numeric.isFiniteV;\\\\nvar s = numeric.dim(x);\\\\nreturn numeric._foreach2(x,s,0,V);\\\\n\\\"}\", function(x) { if(typeof x !== \"object\") return isFinite(x)\nvar i;\nvar V = numeric.isFiniteV;\nvar s = numeric.dim(x);\nreturn numeric._foreach2(x,s,0,V);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var n = x.length;\\\\nvar i,xi;\\\\nvar accum = false;;\\\\nfor(i=n-1;i!==-1;--i) { \\\\n    xi = x[i];\\\\n    if(xi) return true;;\\\\n}\\\\nreturn accum;\\\"}\", function(x) { var n = x.length;\nvar i,xi;\nvar accum = false;;\nfor(i=n-1;i!==-1;--i) { \n    xi = x[i];\n    if(xi) return true;;\n}\nreturn accum; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"s\\\",\\\"k\\\"],\\\"code\\\":\\\"var accum = false;if(typeof x !== \\\\\\\"object\\\\\\\") {    xi = x;\\\\nif(xi) return true;;\\\\n    return accum;\\\\n}if(typeof s === \\\\\\\"undefined\\\\\\\") s = numeric.dim(x);\\\\nif(typeof k === \\\\\\\"undefined\\\\\\\") k = 0;\\\\nif(k === s.length-1) return numeric.anyV(x);\\\\nvar xi;\\\\nvar n = x.length, i;\\\\nfor(i=n-1;i!==-1;--i) {\\\\n   xi = arguments.callee(x[i]);\\\\nif(xi) return true;;\\\\n}\\\\nreturn accum;\\\\n\\\"}\", function(x,s,k) { var accum = false;if(typeof x !== \"object\") {    xi = x;\nif(xi) return true;;\n    return accum;\n}if(typeof s === \"undefined\") s = numeric.dim(x);\nif(typeof k === \"undefined\") k = 0;\nif(k === s.length-1) return numeric.anyV(x);\nvar xi;\nvar n = x.length, i;\nfor(i=n-1;i!==-1;--i) {\n   xi = arguments.callee(x[i]);\nif(xi) return true;;\n}\nreturn accum;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var n = x.length;\\\\nvar i,xi;\\\\nvar accum = true;;\\\\nfor(i=n-1;i!==-1;--i) { \\\\n    xi = x[i];\\\\n    if(!xi) return false;;\\\\n}\\\\nreturn accum;\\\"}\", function(x) { var n = x.length;\nvar i,xi;\nvar accum = true;;\nfor(i=n-1;i!==-1;--i) { \n    xi = x[i];\n    if(!xi) return false;;\n}\nreturn accum; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"s\\\",\\\"k\\\"],\\\"code\\\":\\\"var accum = true;if(typeof x !== \\\\\\\"object\\\\\\\") {    xi = x;\\\\nif(!xi) return false;;\\\\n    return accum;\\\\n}if(typeof s === \\\\\\\"undefined\\\\\\\") s = numeric.dim(x);\\\\nif(typeof k === \\\\\\\"undefined\\\\\\\") k = 0;\\\\nif(k === s.length-1) return numeric.allV(x);\\\\nvar xi;\\\\nvar n = x.length, i;\\\\nfor(i=n-1;i!==-1;--i) {\\\\n   xi = arguments.callee(x[i]);\\\\nif(!xi) return false;;\\\\n}\\\\nreturn accum;\\\\n\\\"}\", function(x,s,k) { var accum = true;if(typeof x !== \"object\") {    xi = x;\nif(!xi) return false;;\n    return accum;\n}if(typeof s === \"undefined\") s = numeric.dim(x);\nif(typeof k === \"undefined\") k = 0;\nif(k === s.length-1) return numeric.allV(x);\nvar xi;\nvar n = x.length, i;\nfor(i=n-1;i!==-1;--i) {\n   xi = arguments.callee(x[i]);\nif(!xi) return false;;\n}\nreturn accum;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var n = x.length;\\\\nvar i,xi;\\\\nvar accum = 0;;\\\\nfor(i=n-1;i!==-1;--i) { \\\\n    xi = x[i];\\\\n    accum += xi;;\\\\n}\\\\nreturn accum;\\\"}\", function(x) { var n = x.length;\nvar i,xi;\nvar accum = 0;;\nfor(i=n-1;i!==-1;--i) { \n    xi = x[i];\n    accum += xi;;\n}\nreturn accum; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"s\\\",\\\"k\\\"],\\\"code\\\":\\\"var accum = 0;if(typeof x !== \\\\\\\"object\\\\\\\") {    xi = x;\\\\naccum += xi;;\\\\n    return accum;\\\\n}if(typeof s === \\\\\\\"undefined\\\\\\\") s = numeric.dim(x);\\\\nif(typeof k === \\\\\\\"undefined\\\\\\\") k = 0;\\\\nif(k === s.length-1) return numeric.sumV(x);\\\\nvar xi;\\\\nvar n = x.length, i;\\\\nfor(i=n-1;i!==-1;--i) {\\\\n   xi = arguments.callee(x[i]);\\\\naccum += xi;;\\\\n}\\\\nreturn accum;\\\\n\\\"}\", function(x,s,k) { var accum = 0;if(typeof x !== \"object\") {    xi = x;\naccum += xi;;\n    return accum;\n}if(typeof s === \"undefined\") s = numeric.dim(x);\nif(typeof k === \"undefined\") k = 0;\nif(k === s.length-1) return numeric.sumV(x);\nvar xi;\nvar n = x.length, i;\nfor(i=n-1;i!==-1;--i) {\n   xi = arguments.callee(x[i]);\naccum += xi;;\n}\nreturn accum;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var n = x.length;\\\\nvar i,xi;\\\\nvar accum = 1;;\\\\nfor(i=n-1;i!==-1;--i) { \\\\n    xi = x[i];\\\\n    accum *= xi;;\\\\n}\\\\nreturn accum;\\\"}\", function(x) { var n = x.length;\nvar i,xi;\nvar accum = 1;;\nfor(i=n-1;i!==-1;--i) { \n    xi = x[i];\n    accum *= xi;;\n}\nreturn accum; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"s\\\",\\\"k\\\"],\\\"code\\\":\\\"var accum = 1;if(typeof x !== \\\\\\\"object\\\\\\\") {    xi = x;\\\\naccum *= xi;;\\\\n    return accum;\\\\n}if(typeof s === \\\\\\\"undefined\\\\\\\") s = numeric.dim(x);\\\\nif(typeof k === \\\\\\\"undefined\\\\\\\") k = 0;\\\\nif(k === s.length-1) return numeric.prodV(x);\\\\nvar xi;\\\\nvar n = x.length, i;\\\\nfor(i=n-1;i!==-1;--i) {\\\\n   xi = arguments.callee(x[i]);\\\\naccum *= xi;;\\\\n}\\\\nreturn accum;\\\\n\\\"}\", function(x,s,k) { var accum = 1;if(typeof x !== \"object\") {    xi = x;\naccum *= xi;;\n    return accum;\n}if(typeof s === \"undefined\") s = numeric.dim(x);\nif(typeof k === \"undefined\") k = 0;\nif(k === s.length-1) return numeric.prodV(x);\nvar xi;\nvar n = x.length, i;\nfor(i=n-1;i!==-1;--i) {\n   xi = arguments.callee(x[i]);\naccum *= xi;;\n}\nreturn accum;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var n = x.length;\\\\nvar i,xi;\\\\nvar accum = 0;;\\\\nfor(i=n-1;i!==-1;--i) { \\\\n    xi = x[i];\\\\n    accum += xi*xi;;\\\\n}\\\\nreturn accum;\\\"}\", function(x) { var n = x.length;\nvar i,xi;\nvar accum = 0;;\nfor(i=n-1;i!==-1;--i) { \n    xi = x[i];\n    accum += xi*xi;;\n}\nreturn accum; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"s\\\",\\\"k\\\"],\\\"code\\\":\\\"var accum = 0;if(typeof x !== \\\\\\\"object\\\\\\\") {    xi = x;\\\\naccum += xi*xi;;\\\\n    return accum;\\\\n}if(typeof s === \\\\\\\"undefined\\\\\\\") s = numeric.dim(x);\\\\nif(typeof k === \\\\\\\"undefined\\\\\\\") k = 0;\\\\nif(k === s.length-1) return numeric.norm2SquaredV(x);\\\\nvar xi;\\\\nvar n = x.length, i;\\\\nfor(i=n-1;i!==-1;--i) {\\\\n   xi = arguments.callee(x[i]);\\\\naccum += xi*xi;;\\\\n}\\\\nreturn accum;\\\\n\\\"}\", function(x,s,k) { var accum = 0;if(typeof x !== \"object\") {    xi = x;\naccum += xi*xi;;\n    return accum;\n}if(typeof s === \"undefined\") s = numeric.dim(x);\nif(typeof k === \"undefined\") k = 0;\nif(k === s.length-1) return numeric.norm2SquaredV(x);\nvar xi;\nvar n = x.length, i;\nfor(i=n-1;i!==-1;--i) {\n   xi = arguments.callee(x[i]);\naccum += xi*xi;;\n}\nreturn accum;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var n = x.length;\\\\nvar i,xi;\\\\nvar accum = 0, max = Math.max, abs = Math.abs;;\\\\nfor(i=n-1;i!==-1;--i) { \\\\n    xi = x[i];\\\\n    accum = max(accum,abs(xi));;\\\\n}\\\\nreturn accum;\\\"}\", function(x) { var n = x.length;\nvar i,xi;\nvar accum = 0, max = Math.max, abs = Math.abs;;\nfor(i=n-1;i!==-1;--i) { \n    xi = x[i];\n    accum = max(accum,abs(xi));;\n}\nreturn accum; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"s\\\",\\\"k\\\"],\\\"code\\\":\\\"var accum = 0, max = Math.max, abs = Math.abs;if(typeof x !== \\\\\\\"object\\\\\\\") {    xi = x;\\\\naccum = max(accum,abs(xi));;\\\\n    return accum;\\\\n}if(typeof s === \\\\\\\"undefined\\\\\\\") s = numeric.dim(x);\\\\nif(typeof k === \\\\\\\"undefined\\\\\\\") k = 0;\\\\nif(k === s.length-1) return numeric.norminfV(x);\\\\nvar xi;\\\\nvar n = x.length, i;\\\\nfor(i=n-1;i!==-1;--i) {\\\\n   xi = arguments.callee(x[i]);\\\\naccum = max(accum,abs(xi));;\\\\n}\\\\nreturn accum;\\\\n\\\"}\", function(x,s,k) { var accum = 0, max = Math.max, abs = Math.abs;if(typeof x !== \"object\") {    xi = x;\naccum = max(accum,abs(xi));;\n    return accum;\n}if(typeof s === \"undefined\") s = numeric.dim(x);\nif(typeof k === \"undefined\") k = 0;\nif(k === s.length-1) return numeric.norminfV(x);\nvar xi;\nvar n = x.length, i;\nfor(i=n-1;i!==-1;--i) {\n   xi = arguments.callee(x[i]);\naccum = max(accum,abs(xi));;\n}\nreturn accum;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var n = x.length;\\\\nvar i,xi;\\\\nvar accum = 0, abs = Math.abs;;\\\\nfor(i=n-1;i!==-1;--i) { \\\\n    xi = x[i];\\\\n    accum += abs(xi);\\\\n}\\\\nreturn accum;\\\"}\", function(x) { var n = x.length;\nvar i,xi;\nvar accum = 0, abs = Math.abs;;\nfor(i=n-1;i!==-1;--i) { \n    xi = x[i];\n    accum += abs(xi);\n}\nreturn accum; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"s\\\",\\\"k\\\"],\\\"code\\\":\\\"var accum = 0, abs = Math.abs;if(typeof x !== \\\\\\\"object\\\\\\\") {    xi = x;\\\\naccum += abs(xi);\\\\n    return accum;\\\\n}if(typeof s === \\\\\\\"undefined\\\\\\\") s = numeric.dim(x);\\\\nif(typeof k === \\\\\\\"undefined\\\\\\\") k = 0;\\\\nif(k === s.length-1) return numeric.norm1V(x);\\\\nvar xi;\\\\nvar n = x.length, i;\\\\nfor(i=n-1;i!==-1;--i) {\\\\n   xi = arguments.callee(x[i]);\\\\naccum += abs(xi);\\\\n}\\\\nreturn accum;\\\\n\\\"}\", function(x,s,k) { var accum = 0, abs = Math.abs;if(typeof x !== \"object\") {    xi = x;\naccum += abs(xi);\n    return accum;\n}if(typeof s === \"undefined\") s = numeric.dim(x);\nif(typeof k === \"undefined\") k = 0;\nif(k === s.length-1) return numeric.norm1V(x);\nvar xi;\nvar n = x.length, i;\nfor(i=n-1;i!==-1;--i) {\n   xi = arguments.callee(x[i]);\naccum += abs(xi);\n}\nreturn accum;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var n = x.length;\\\\nvar i,xi;\\\\nvar accum = -Infinity, max = Math.max;;\\\\nfor(i=n-1;i!==-1;--i) { \\\\n    xi = x[i];\\\\n    accum = max(accum,xi);;\\\\n}\\\\nreturn accum;\\\"}\", function(x) { var n = x.length;\nvar i,xi;\nvar accum = -Infinity, max = Math.max;;\nfor(i=n-1;i!==-1;--i) { \n    xi = x[i];\n    accum = max(accum,xi);;\n}\nreturn accum; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"s\\\",\\\"k\\\"],\\\"code\\\":\\\"var accum = -Infinity, max = Math.max;if(typeof x !== \\\\\\\"object\\\\\\\") {    xi = x;\\\\naccum = max(accum,xi);;\\\\n    return accum;\\\\n}if(typeof s === \\\\\\\"undefined\\\\\\\") s = numeric.dim(x);\\\\nif(typeof k === \\\\\\\"undefined\\\\\\\") k = 0;\\\\nif(k === s.length-1) return numeric.supV(x);\\\\nvar xi;\\\\nvar n = x.length, i;\\\\nfor(i=n-1;i!==-1;--i) {\\\\n   xi = arguments.callee(x[i]);\\\\naccum = max(accum,xi);;\\\\n}\\\\nreturn accum;\\\\n\\\"}\", function(x,s,k) { var accum = -Infinity, max = Math.max;if(typeof x !== \"object\") {    xi = x;\naccum = max(accum,xi);;\n    return accum;\n}if(typeof s === \"undefined\") s = numeric.dim(x);\nif(typeof k === \"undefined\") k = 0;\nif(k === s.length-1) return numeric.supV(x);\nvar xi;\nvar n = x.length, i;\nfor(i=n-1;i!==-1;--i) {\n   xi = arguments.callee(x[i]);\naccum = max(accum,xi);;\n}\nreturn accum;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\"],\\\"code\\\":\\\"var n = x.length;\\\\nvar i,xi;\\\\nvar accum = Infinity, min = Math.min;;\\\\nfor(i=n-1;i!==-1;--i) { \\\\n    xi = x[i];\\\\n    accum = min(accum,xi);;\\\\n}\\\\nreturn accum;\\\"}\", function(x) { var n = x.length;\nvar i,xi;\nvar accum = Infinity, min = Math.min;;\nfor(i=n-1;i!==-1;--i) { \n    xi = x[i];\n    accum = min(accum,xi);;\n}\nreturn accum; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"s\\\",\\\"k\\\"],\\\"code\\\":\\\"var accum = Infinity, min = Math.min;if(typeof x !== \\\\\\\"object\\\\\\\") {    xi = x;\\\\naccum = min(accum,xi);;\\\\n    return accum;\\\\n}if(typeof s === \\\\\\\"undefined\\\\\\\") s = numeric.dim(x);\\\\nif(typeof k === \\\\\\\"undefined\\\\\\\") k = 0;\\\\nif(k === s.length-1) return numeric.infV(x);\\\\nvar xi;\\\\nvar n = x.length, i;\\\\nfor(i=n-1;i!==-1;--i) {\\\\n   xi = arguments.callee(x[i]);\\\\naccum = min(accum,xi);;\\\\n}\\\\nreturn accum;\\\\n\\\"}\", function(x,s,k) { var accum = Infinity, min = Math.min;if(typeof x !== \"object\") {    xi = x;\naccum = min(accum,xi);;\n    return accum;\n}if(typeof s === \"undefined\") s = numeric.dim(x);\nif(typeof k === \"undefined\") k = 0;\nif(k === s.length-1) return numeric.infV(x);\nvar xi;\nvar n = x.length, i;\nfor(i=n-1;i!==-1;--i) {\n   xi = arguments.callee(x[i]);\naccum = min(accum,xi);;\n}\nreturn accum;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\",\\\"_s\\\",\\\"_k\\\"],\\\"code\\\":\\\"if(typeof _s === \\\\\\\"undefined\\\\\\\") _s = numeric.dim(y);\\\\nif(typeof _k === \\\\\\\"undefined\\\\\\\") _k = 0;\\\\nvar _n = _s[_k];\\\\nvar i, ret = Array(_n);\\\\nif(_k < _s.length-1) {\\\\n    for(i=_n-1;i>=0;i--) ret[i] = arguments.callee(x[i],y[i],_s,_k+1);\\\\n    return ret;\\\\n}\\\\nvar round = Math.round;\\\\nfor(i=_n-1;i!==-1;--i) {\\\\n    ret[i] = round(x[i]/y[i])*y[i];\\\\n}\\\\nreturn ret;\\\"}\", function(x,y,_s,_k) { if(typeof _s === \"undefined\") _s = numeric.dim(y);\nif(typeof _k === \"undefined\") _k = 0;\nvar _n = _s[_k];\nvar i, ret = Array(_n);\nif(_k < _s.length-1) {\n    for(i=_n-1;i>=0;i--) ret[i] = arguments.callee(x[i],y[i],_s,_k+1);\n    return ret;\n}\nvar round = Math.round;\nfor(i=_n-1;i!==-1;--i) {\n    ret[i] = round(x[i]/y[i])*y[i];\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\",\\\"_s\\\",\\\"_k\\\"],\\\"code\\\":\\\"if(typeof _s === \\\\\\\"undefined\\\\\\\") _s = numeric.dim(x);\\\\nif(typeof _k === \\\\\\\"undefined\\\\\\\") _k = 0;\\\\nvar _n = _s[_k];\\\\nvar i, ret = Array(_n);\\\\nif(_k < _s.length-1) {\\\\n    for(i=_n-1;i>=0;i--) ret[i] = arguments.callee(x[i],y,_s,_k+1);\\\\n    return ret;\\\\n}\\\\nvar round = Math.round;\\\\nfor(i=_n-1;i!==-1;--i) {\\\\n    ret[i] = round(x[i]/y)*y;\\\\n}\\\\nreturn ret;\\\"}\", function(x,y,_s,_k) { if(typeof _s === \"undefined\") _s = numeric.dim(x);\nif(typeof _k === \"undefined\") _k = 0;\nvar _n = _s[_k];\nvar i, ret = Array(_n);\nif(_k < _s.length-1) {\n    for(i=_n-1;i>=0;i--) ret[i] = arguments.callee(x[i],y,_s,_k+1);\n    return ret;\n}\nvar round = Math.round;\nfor(i=_n-1;i!==-1;--i) {\n    ret[i] = round(x[i]/y)*y;\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"x\\\",\\\"y\\\",\\\"_s\\\",\\\"_k\\\"],\\\"code\\\":\\\"if(typeof _s === \\\\\\\"undefined\\\\\\\") _s = numeric.dim(y);\\\\nif(typeof _k === \\\\\\\"undefined\\\\\\\") _k = 0;\\\\nvar _n = _s[_k];\\\\nvar i, ret = Array(_n);\\\\nif(_k < _s.length-1) {\\\\n    for(i=_n-1;i>=0;i--) ret[i] = arguments.callee(x,y[i],_s,_k+1);\\\\n    return ret;\\\\n}\\\\nvar round = Math.round;\\\\nfor(i=_n-1;i!==-1;--i) {\\\\n    ret[i] = round(x/y[i])*y[i];\\\\n}\\\\nreturn ret;\\\"}\", function(x,y,_s,_k) { if(typeof _s === \"undefined\") _s = numeric.dim(y);\nif(typeof _k === \"undefined\") _k = 0;\nvar _n = _s[_k];\nvar i, ret = Array(_n);\nif(_k < _s.length-1) {\n    for(i=_n-1;i>=0;i--) ret[i] = arguments.callee(x,y[i],_s,_k+1);\n    return ret;\n}\nvar round = Math.round;\nfor(i=_n-1;i!==-1;--i) {\n    ret[i] = round(x/y[i])*y[i];\n}\nreturn ret; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[[\\\"y\\\"]],\\\"code\\\":\\\"var x = this;\\\\nif(!(y instanceof numeric.T)) { y = new numeric.T(y); }\\\\nvar add = numeric.add;\\\\n\\\\nif(x.y) {  if(y.y) {    return new numeric.T(add(x.x,y.x),add(x.y,y.y));\\\\n  }\\\\n  return new numeric.T(add(x.x,y.x),x.y);\\\\n}\\\\nif(y.y) {\\\\n  return new numeric.T(add(x.x,y.x),y.y);\\\\n}\\\\nreturn new numeric.T(add(x.x,y.x));\\\\n\\\"}\", function(y) { var x = this;\nif(!(y instanceof numeric.T)) { y = new numeric.T(y); }\nvar add = numeric.add;\n\nif(x.y) {  if(y.y) {    return new numeric.T(add(x.x,y.x),add(x.y,y.y));\n  }\n  return new numeric.T(add(x.x,y.x),x.y);\n}\nif(y.y) {\n  return new numeric.T(add(x.x,y.x),y.y);\n}\nreturn new numeric.T(add(x.x,y.x));\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[[\\\"y\\\"]],\\\"code\\\":\\\"var x = this;\\\\nif(!(y instanceof numeric.T)) { y = new numeric.T(y); }\\\\nvar sub = numeric.sub;\\\\nvar neg = numeric.neg;\\\\n\\\\nif(x.y) {  if(y.y) {    return new numeric.T(sub(x.x,y.x),sub(x.y,y.y));\\\\n  }\\\\n  return new numeric.T(sub(x.x,y.x),x.y);\\\\n}\\\\nif(y.y) {\\\\n  return new numeric.T(sub(x.x,y.x),neg(y.y));\\\\n}\\\\nreturn new numeric.T(sub(x.x,y.x));\\\\n\\\"}\", function(y) { var x = this;\nif(!(y instanceof numeric.T)) { y = new numeric.T(y); }\nvar sub = numeric.sub;\nvar neg = numeric.neg;\n\nif(x.y) {  if(y.y) {    return new numeric.T(sub(x.x,y.x),sub(x.y,y.y));\n  }\n  return new numeric.T(sub(x.x,y.x),x.y);\n}\nif(y.y) {\n  return new numeric.T(sub(x.x,y.x),neg(y.y));\n}\nreturn new numeric.T(sub(x.x,y.x));\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[[\\\"y\\\"]],\\\"code\\\":\\\"var x = this;\\\\nif(!(y instanceof numeric.T)) { y = new numeric.T(y); }\\\\nvar add = numeric.add;\\\\nvar sub = numeric.sub;\\\\nvar mul = numeric.mul;\\\\n\\\\nif(x.y) {  if(y.y) {    return new numeric.T(sub(mul(x.x,y.x),mul(x.y,y.y)),add(mul(x.x,y.y),mul(x.y,y.x)));\\\\n  }\\\\n  return new numeric.T(mul(x.x,y.x),mul(x.y,y.x));\\\\n}\\\\nif(y.y) {\\\\n  return new numeric.T(mul(x.x,y.x),mul(x.x,y.y));\\\\n}\\\\nreturn new numeric.T(mul(x.x,y.x));\\\\n\\\"}\", function(y) { var x = this;\nif(!(y instanceof numeric.T)) { y = new numeric.T(y); }\nvar add = numeric.add;\nvar sub = numeric.sub;\nvar mul = numeric.mul;\n\nif(x.y) {  if(y.y) {    return new numeric.T(sub(mul(x.x,y.x),mul(x.y,y.y)),add(mul(x.x,y.y),mul(x.y,y.x)));\n  }\n  return new numeric.T(mul(x.x,y.x),mul(x.y,y.x));\n}\nif(y.y) {\n  return new numeric.T(mul(x.x,y.x),mul(x.x,y.y));\n}\nreturn new numeric.T(mul(x.x,y.x));\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[[\\\"y\\\"]],\\\"code\\\":\\\"var x = this;\\\\nif(!(y instanceof numeric.T)) { y = new numeric.T(y); }\\\\nvar dot = numeric.dot;\\\\nvar add = numeric.add;\\\\nvar sub = numeric.sub;\\\\n\\\\nif(x.y) {  if(y.y) {    return new numeric.T(sub(dot(x.x,y.x),dot(x.y,y.y)),add(dot(x.x,y.y),dot(x.y,y.x)));\\\\n  }\\\\n  return new numeric.T(dot(x.x,y.x),dot(x.y,y.x));\\\\n}\\\\nif(y.y) {\\\\n  return new numeric.T(dot(x.x,y.x),dot(x.x,y.y));\\\\n}\\\\nreturn new numeric.T(dot(x.x,y.x));\\\\n\\\"}\", function(y) { var x = this;\nif(!(y instanceof numeric.T)) { y = new numeric.T(y); }\nvar dot = numeric.dot;\nvar add = numeric.add;\nvar sub = numeric.sub;\n\nif(x.y) {  if(y.y) {    return new numeric.T(sub(dot(x.x,y.x),dot(x.y,y.y)),add(dot(x.x,y.y),dot(x.y,y.x)));\n  }\n  return new numeric.T(dot(x.x,y.x),dot(x.y,y.x));\n}\nif(y.y) {\n  return new numeric.T(dot(x.x,y.x),dot(x.x,y.y));\n}\nreturn new numeric.T(dot(x.x,y.x));\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var x = this;\\\\nvar ex = numeric.exp(x.x), cos = numeric.cos, sin = numeric.sin, mul = numeric.mul;\\\\nif(x.y) {  return new numeric.T(mul(cos(x.y),ex),mul(sin(x.y),ex));\\\\n}\\\\nreturn new numeric.T(ex);\\\\n\\\"}\", function() { var x = this;\nvar ex = numeric.exp(x.x), cos = numeric.cos, sin = numeric.sin, mul = numeric.mul;\nif(x.y) {  return new numeric.T(mul(cos(x.y),ex),mul(sin(x.y),ex));\n}\nreturn new numeric.T(ex);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var x = this;\\\\n\\\\nif(x.y) {  return new numeric.T(x.x,numeric.neg(x.y));;\\\\n}\\\\nreturn new numeric.T(x.x);;\\\\n\\\"}\", function() { var x = this;\n\nif(x.y) {  return new numeric.T(x.x,numeric.neg(x.y));;\n}\nreturn new numeric.T(x.x);;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var x = this;\\\\nvar neg = numeric.neg;\\\\nif(x.y) {  return new numeric.T(neg(x.x),neg(x.y));;\\\\n}\\\\nreturn new numeric.T(neg(x.x));;\\\\n\\\"}\", function() { var x = this;\nvar neg = numeric.neg;\nif(x.y) {  return new numeric.T(neg(x.x),neg(x.y));;\n}\nreturn new numeric.T(neg(x.x));;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var x = this;\\\\n\\\\nif(x.y) {  return x.exp().sub(x.neg().exp()).div(new numeric.T(0,2));;\\\\n}\\\\nreturn new numeric.T(numeric.sin(x.x));\\\\n\\\"}\", function() { var x = this;\n\nif(x.y) {  return x.exp().sub(x.neg().exp()).div(new numeric.T(0,2));;\n}\nreturn new numeric.T(numeric.sin(x.x));\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var x = this;\\\\n\\\\nif(x.y) {  return x.exp().add(x.neg().exp()).div(2);;\\\\n}\\\\nreturn new numeric.T(numeric.cos(x.x));\\\\n\\\"}\", function() { var x = this;\n\nif(x.y) {  return x.exp().add(x.neg().exp()).div(2);;\n}\nreturn new numeric.T(numeric.cos(x.x));\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var x = this;\\\\nvar mul = numeric.mul;\\\\nif(x.y) {  return new numeric.T(numeric.sqrt(numeric.add(mul(x.x,x.x),mul(x.y,x.y))));;\\\\n}\\\\nreturn new numeric.T(numeric.abs(x.x));;\\\\n\\\"}\", function() { var x = this;\nvar mul = numeric.mul;\nif(x.y) {  return new numeric.T(numeric.sqrt(numeric.add(mul(x.x,x.x),mul(x.y,x.y))));;\n}\nreturn new numeric.T(numeric.abs(x.x));;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var x = this;\\\\n\\\\nif(x.y) {  var theta = new numeric.T(numeric.atan2(x.y,x.x)), r = x.abs();\\\\nreturn new numeric.T(numeric.log(r.x),theta.x);;\\\\n}\\\\nreturn new numeric.T(numeric.log(x.x));;\\\\n\\\"}\", function() { var x = this;\n\nif(x.y) {  var theta = new numeric.T(numeric.atan2(x.y,x.x)), r = x.abs();\nreturn new numeric.T(numeric.log(r.x),theta.x);;\n}\nreturn new numeric.T(numeric.log(x.x));;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[],\\\"code\\\":\\\"var x = this;\\\\n\\\\nif(x.y) {  var f = numeric.norm2Squared;\\\\nreturn Math.sqrt(f(x.x)+f(x.y));;\\\\n}\\\\nreturn numeric.norm2(x.x);;\\\\n\\\"}\", function() { var x = this;\n\nif(x.y) {  var f = numeric.norm2Squared;\nreturn Math.sqrt(f(x.x)+f(x.y));;\n}\nreturn numeric.norm2(x.x);;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"var Xi = X[0], Xj = X[1], Xv = X[2];\\\\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\\\\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\\\\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\\\\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\\\\nvar xk,yk,zk;\\\\nvar i,j,j0,j1,k,p=0;\\\\nfor(i=0;i<n;++i) {\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Xj[j];\\\\n    x[k] = 1;\\\\n    Zj[p] = k;\\\\n    ++p;\\\\n  }\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Yj[j];\\\\n    y[k] = Yv[j];\\\\n    if(x[k] === 0) {\\\\n      Zj[p] = k;\\\\n      ++p;\\\\n    }\\\\n  }\\\\n  Zi[i+1] = p;\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\\\\n  j0 = Zi[i]; j1 = Zi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Zj[j];\\\\n    xk = x[k];\\\\n    yk = y[k];\\\\nzk = xk +yk;\\\\n    Zv[j] = zk;\\\\n  }\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\\\\n}\\\\nreturn [Zi,Zj,Zv];\\\"}\", function(X,Y) { var Xi = X[0], Xj = X[1], Xv = X[2];\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\nvar xk,yk,zk;\nvar i,j,j0,j1,k,p=0;\nfor(i=0;i<n;++i) {\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Xj[j];\n    x[k] = 1;\n    Zj[p] = k;\n    ++p;\n  }\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Yj[j];\n    y[k] = Yv[j];\n    if(x[k] === 0) {\n      Zj[p] = k;\n      ++p;\n    }\n  }\n  Zi[i+1] = p;\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\n  j0 = Zi[i]; j1 = Zi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Zj[j];\n    xk = x[k];\n    yk = y[k];\nzk = xk +yk;\n    Zv[j] = zk;\n  }\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\n}\nreturn [Zi,Zj,Zv]; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"if(typeof X === \\\\\\\"number\\\\\\\") return [Y[0],Y[1],numeric.add(X,Y[2])];\\\\nif(typeof Y === \\\\\\\"number\\\\\\\") return [X[0],X[1],numeric.add(X[2],Y)];\\\\nreturn numeric.ccsaddMM(X,Y);\\\\n\\\"}\", function(X,Y) { if(typeof X === \"number\") return [Y[0],Y[1],numeric.add(X,Y[2])];\nif(typeof Y === \"number\") return [X[0],X[1],numeric.add(X[2],Y)];\nreturn numeric.ccsaddMM(X,Y);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"var Xi = X[0], Xj = X[1], Xv = X[2];\\\\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\\\\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\\\\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\\\\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\\\\nvar xk,yk,zk;\\\\nvar i,j,j0,j1,k,p=0;\\\\nfor(i=0;i<n;++i) {\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Xj[j];\\\\n    x[k] = 1;\\\\n    Zj[p] = k;\\\\n    ++p;\\\\n  }\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Yj[j];\\\\n    y[k] = Yv[j];\\\\n    if(x[k] === 0) {\\\\n      Zj[p] = k;\\\\n      ++p;\\\\n    }\\\\n  }\\\\n  Zi[i+1] = p;\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\\\\n  j0 = Zi[i]; j1 = Zi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Zj[j];\\\\n    xk = x[k];\\\\n    yk = y[k];\\\\nzk = xk -yk;\\\\n    Zv[j] = zk;\\\\n  }\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\\\\n}\\\\nreturn [Zi,Zj,Zv];\\\"}\", function(X,Y) { var Xi = X[0], Xj = X[1], Xv = X[2];\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\nvar xk,yk,zk;\nvar i,j,j0,j1,k,p=0;\nfor(i=0;i<n;++i) {\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Xj[j];\n    x[k] = 1;\n    Zj[p] = k;\n    ++p;\n  }\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Yj[j];\n    y[k] = Yv[j];\n    if(x[k] === 0) {\n      Zj[p] = k;\n      ++p;\n    }\n  }\n  Zi[i+1] = p;\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\n  j0 = Zi[i]; j1 = Zi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Zj[j];\n    xk = x[k];\n    yk = y[k];\nzk = xk -yk;\n    Zv[j] = zk;\n  }\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\n}\nreturn [Zi,Zj,Zv]; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"if(typeof X === \\\\\\\"number\\\\\\\") return [Y[0],Y[1],numeric.sub(X,Y[2])];\\\\nif(typeof Y === \\\\\\\"number\\\\\\\") return [X[0],X[1],numeric.sub(X[2],Y)];\\\\nreturn numeric.ccssubMM(X,Y);\\\\n\\\"}\", function(X,Y) { if(typeof X === \"number\") return [Y[0],Y[1],numeric.sub(X,Y[2])];\nif(typeof Y === \"number\") return [X[0],X[1],numeric.sub(X[2],Y)];\nreturn numeric.ccssubMM(X,Y);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"var Xi = X[0], Xj = X[1], Xv = X[2];\\\\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\\\\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\\\\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\\\\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\\\\nvar xk,yk,zk;\\\\nvar i,j,j0,j1,k,p=0;\\\\nfor(i=0;i<n;++i) {\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Xj[j];\\\\n    x[k] = 1;\\\\n    Zj[p] = k;\\\\n    ++p;\\\\n  }\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Yj[j];\\\\n    y[k] = Yv[j];\\\\n    if(x[k] === 0) {\\\\n      Zj[p] = k;\\\\n      ++p;\\\\n    }\\\\n  }\\\\n  Zi[i+1] = p;\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\\\\n  j0 = Zi[i]; j1 = Zi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Zj[j];\\\\n    xk = x[k];\\\\n    yk = y[k];\\\\nzk = xk *yk;\\\\n    Zv[j] = zk;\\\\n  }\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\\\\n}\\\\nreturn [Zi,Zj,Zv];\\\"}\", function(X,Y) { var Xi = X[0], Xj = X[1], Xv = X[2];\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\nvar xk,yk,zk;\nvar i,j,j0,j1,k,p=0;\nfor(i=0;i<n;++i) {\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Xj[j];\n    x[k] = 1;\n    Zj[p] = k;\n    ++p;\n  }\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Yj[j];\n    y[k] = Yv[j];\n    if(x[k] === 0) {\n      Zj[p] = k;\n      ++p;\n    }\n  }\n  Zi[i+1] = p;\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\n  j0 = Zi[i]; j1 = Zi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Zj[j];\n    xk = x[k];\n    yk = y[k];\nzk = xk *yk;\n    Zv[j] = zk;\n  }\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\n}\nreturn [Zi,Zj,Zv]; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"if(typeof X === \\\\\\\"number\\\\\\\") return [Y[0],Y[1],numeric.mul(X,Y[2])];\\\\nif(typeof Y === \\\\\\\"number\\\\\\\") return [X[0],X[1],numeric.mul(X[2],Y)];\\\\nreturn numeric.ccsmulMM(X,Y);\\\\n\\\"}\", function(X,Y) { if(typeof X === \"number\") return [Y[0],Y[1],numeric.mul(X,Y[2])];\nif(typeof Y === \"number\") return [X[0],X[1],numeric.mul(X[2],Y)];\nreturn numeric.ccsmulMM(X,Y);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"var Xi = X[0], Xj = X[1], Xv = X[2];\\\\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\\\\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\\\\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\\\\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\\\\nvar xk,yk,zk;\\\\nvar i,j,j0,j1,k,p=0;\\\\nfor(i=0;i<n;++i) {\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Xj[j];\\\\n    x[k] = 1;\\\\n    Zj[p] = k;\\\\n    ++p;\\\\n  }\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Yj[j];\\\\n    y[k] = Yv[j];\\\\n    if(x[k] === 0) {\\\\n      Zj[p] = k;\\\\n      ++p;\\\\n    }\\\\n  }\\\\n  Zi[i+1] = p;\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\\\\n  j0 = Zi[i]; j1 = Zi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Zj[j];\\\\n    xk = x[k];\\\\n    yk = y[k];\\\\nzk = xk /yk;\\\\n    Zv[j] = zk;\\\\n  }\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\\\\n}\\\\nreturn [Zi,Zj,Zv];\\\"}\", function(X,Y) { var Xi = X[0], Xj = X[1], Xv = X[2];\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\nvar xk,yk,zk;\nvar i,j,j0,j1,k,p=0;\nfor(i=0;i<n;++i) {\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Xj[j];\n    x[k] = 1;\n    Zj[p] = k;\n    ++p;\n  }\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Yj[j];\n    y[k] = Yv[j];\n    if(x[k] === 0) {\n      Zj[p] = k;\n      ++p;\n    }\n  }\n  Zi[i+1] = p;\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\n  j0 = Zi[i]; j1 = Zi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Zj[j];\n    xk = x[k];\n    yk = y[k];\nzk = xk /yk;\n    Zv[j] = zk;\n  }\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\n}\nreturn [Zi,Zj,Zv]; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"if(typeof X === \\\\\\\"number\\\\\\\") return NaN;\\\\nif(typeof Y === \\\\\\\"number\\\\\\\") return [X[0],X[1],numeric.div(X[2],Y)];\\\\nreturn NaN;\\\\n\\\"}\", function(X,Y) { if(typeof X === \"number\") return NaN;\nif(typeof Y === \"number\") return [X[0],X[1],numeric.div(X[2],Y)];\nreturn NaN;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"var Xi = X[0], Xj = X[1], Xv = X[2];\\\\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\\\\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\\\\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\\\\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\\\\nvar xk,yk,zk;\\\\nvar i,j,j0,j1,k,p=0;\\\\nfor(i=0;i<n;++i) {\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Xj[j];\\\\n    x[k] = 1;\\\\n    Zj[p] = k;\\\\n    ++p;\\\\n  }\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Yj[j];\\\\n    y[k] = Yv[j];\\\\n    if(x[k] === 0) {\\\\n      Zj[p] = k;\\\\n      ++p;\\\\n    }\\\\n  }\\\\n  Zi[i+1] = p;\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\\\\n  j0 = Zi[i]; j1 = Zi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Zj[j];\\\\n    xk = x[k];\\\\n    yk = y[k];\\\\nzk = xk %yk;\\\\n    Zv[j] = zk;\\\\n  }\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\\\\n}\\\\nreturn [Zi,Zj,Zv];\\\"}\", function(X,Y) { var Xi = X[0], Xj = X[1], Xv = X[2];\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\nvar xk,yk,zk;\nvar i,j,j0,j1,k,p=0;\nfor(i=0;i<n;++i) {\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Xj[j];\n    x[k] = 1;\n    Zj[p] = k;\n    ++p;\n  }\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Yj[j];\n    y[k] = Yv[j];\n    if(x[k] === 0) {\n      Zj[p] = k;\n      ++p;\n    }\n  }\n  Zi[i+1] = p;\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\n  j0 = Zi[i]; j1 = Zi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Zj[j];\n    xk = x[k];\n    yk = y[k];\nzk = xk %yk;\n    Zv[j] = zk;\n  }\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\n}\nreturn [Zi,Zj,Zv]; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"if(typeof X === \\\\\\\"number\\\\\\\") return NaN;\\\\nif(typeof Y === \\\\\\\"number\\\\\\\") return [X[0],X[1],numeric.mod(X[2],Y)];\\\\nreturn NaN;\\\\n\\\"}\", function(X,Y) { if(typeof X === \"number\") return NaN;\nif(typeof Y === \"number\") return [X[0],X[1],numeric.mod(X[2],Y)];\nreturn NaN;\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"var Xi = X[0], Xj = X[1], Xv = X[2];\\\\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\\\\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\\\\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\\\\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\\\\nvar xk,yk,zk;\\\\nvar i,j,j0,j1,k,p=0;\\\\nfor(i=0;i<n;++i) {\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Xj[j];\\\\n    x[k] = 1;\\\\n    Zj[p] = k;\\\\n    ++p;\\\\n  }\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Yj[j];\\\\n    y[k] = Yv[j];\\\\n    if(x[k] === 0) {\\\\n      Zj[p] = k;\\\\n      ++p;\\\\n    }\\\\n  }\\\\n  Zi[i+1] = p;\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\\\\n  j0 = Zi[i]; j1 = Zi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Zj[j];\\\\n    xk = x[k];\\\\n    yk = y[k];\\\\nzk = xk &&yk;\\\\n    Zv[j] = zk;\\\\n  }\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\\\\n}\\\\nreturn [Zi,Zj,Zv];\\\"}\", function(X,Y) { var Xi = X[0], Xj = X[1], Xv = X[2];\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\nvar xk,yk,zk;\nvar i,j,j0,j1,k,p=0;\nfor(i=0;i<n;++i) {\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Xj[j];\n    x[k] = 1;\n    Zj[p] = k;\n    ++p;\n  }\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Yj[j];\n    y[k] = Yv[j];\n    if(x[k] === 0) {\n      Zj[p] = k;\n      ++p;\n    }\n  }\n  Zi[i+1] = p;\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\n  j0 = Zi[i]; j1 = Zi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Zj[j];\n    xk = x[k];\n    yk = y[k];\nzk = xk &&yk;\n    Zv[j] = zk;\n  }\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\n}\nreturn [Zi,Zj,Zv]; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"if(typeof X === \\\\\\\"number\\\\\\\") return [Y[0],Y[1],numeric.and(X,Y[2])];\\\\nif(typeof Y === \\\\\\\"number\\\\\\\") return [X[0],X[1],numeric.and(X[2],Y)];\\\\nreturn numeric.ccsandMM(X,Y);\\\\n\\\"}\", function(X,Y) { if(typeof X === \"number\") return [Y[0],Y[1],numeric.and(X,Y[2])];\nif(typeof Y === \"number\") return [X[0],X[1],numeric.and(X[2],Y)];\nreturn numeric.ccsandMM(X,Y);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"var Xi = X[0], Xj = X[1], Xv = X[2];\\\\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\\\\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\\\\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\\\\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\\\\nvar xk,yk,zk;\\\\nvar i,j,j0,j1,k,p=0;\\\\nfor(i=0;i<n;++i) {\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Xj[j];\\\\n    x[k] = 1;\\\\n    Zj[p] = k;\\\\n    ++p;\\\\n  }\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Yj[j];\\\\n    y[k] = Yv[j];\\\\n    if(x[k] === 0) {\\\\n      Zj[p] = k;\\\\n      ++p;\\\\n    }\\\\n  }\\\\n  Zi[i+1] = p;\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\\\\n  j0 = Zi[i]; j1 = Zi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Zj[j];\\\\n    xk = x[k];\\\\n    yk = y[k];\\\\nzk = xk ||yk;\\\\n    Zv[j] = zk;\\\\n  }\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\\\\n}\\\\nreturn [Zi,Zj,Zv];\\\"}\", function(X,Y) { var Xi = X[0], Xj = X[1], Xv = X[2];\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\nvar xk,yk,zk;\nvar i,j,j0,j1,k,p=0;\nfor(i=0;i<n;++i) {\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Xj[j];\n    x[k] = 1;\n    Zj[p] = k;\n    ++p;\n  }\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Yj[j];\n    y[k] = Yv[j];\n    if(x[k] === 0) {\n      Zj[p] = k;\n      ++p;\n    }\n  }\n  Zi[i+1] = p;\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\n  j0 = Zi[i]; j1 = Zi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Zj[j];\n    xk = x[k];\n    yk = y[k];\nzk = xk ||yk;\n    Zv[j] = zk;\n  }\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\n}\nreturn [Zi,Zj,Zv]; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"if(typeof X === \\\\\\\"number\\\\\\\") return [Y[0],Y[1],numeric.or(X,Y[2])];\\\\nif(typeof Y === \\\\\\\"number\\\\\\\") return [X[0],X[1],numeric.or(X[2],Y)];\\\\nreturn numeric.ccsorMM(X,Y);\\\\n\\\"}\", function(X,Y) { if(typeof X === \"number\") return [Y[0],Y[1],numeric.or(X,Y[2])];\nif(typeof Y === \"number\") return [X[0],X[1],numeric.or(X[2],Y)];\nreturn numeric.ccsorMM(X,Y);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"var Xi = X[0], Xj = X[1], Xv = X[2];\\\\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\\\\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\\\\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\\\\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\\\\nvar xk,yk,zk;\\\\nvar i,j,j0,j1,k,p=0;\\\\nfor(i=0;i<n;++i) {\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Xj[j];\\\\n    x[k] = 1;\\\\n    Zj[p] = k;\\\\n    ++p;\\\\n  }\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Yj[j];\\\\n    y[k] = Yv[j];\\\\n    if(x[k] === 0) {\\\\n      Zj[p] = k;\\\\n      ++p;\\\\n    }\\\\n  }\\\\n  Zi[i+1] = p;\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\\\\n  j0 = Zi[i]; j1 = Zi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Zj[j];\\\\n    xk = x[k];\\\\n    yk = y[k];\\\\nzk = xk ===yk;\\\\n    Zv[j] = zk;\\\\n  }\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\\\\n}\\\\nreturn [Zi,Zj,Zv];\\\"}\", function(X,Y) { var Xi = X[0], Xj = X[1], Xv = X[2];\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\nvar xk,yk,zk;\nvar i,j,j0,j1,k,p=0;\nfor(i=0;i<n;++i) {\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Xj[j];\n    x[k] = 1;\n    Zj[p] = k;\n    ++p;\n  }\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Yj[j];\n    y[k] = Yv[j];\n    if(x[k] === 0) {\n      Zj[p] = k;\n      ++p;\n    }\n  }\n  Zi[i+1] = p;\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\n  j0 = Zi[i]; j1 = Zi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Zj[j];\n    xk = x[k];\n    yk = y[k];\nzk = xk ===yk;\n    Zv[j] = zk;\n  }\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\n}\nreturn [Zi,Zj,Zv]; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"if(typeof X === \\\\\\\"number\\\\\\\") return [Y[0],Y[1],numeric.eq(X,Y[2])];\\\\nif(typeof Y === \\\\\\\"number\\\\\\\") return [X[0],X[1],numeric.eq(X[2],Y)];\\\\nreturn numeric.ccseqMM(X,Y);\\\\n\\\"}\", function(X,Y) { if(typeof X === \"number\") return [Y[0],Y[1],numeric.eq(X,Y[2])];\nif(typeof Y === \"number\") return [X[0],X[1],numeric.eq(X[2],Y)];\nreturn numeric.ccseqMM(X,Y);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"var Xi = X[0], Xj = X[1], Xv = X[2];\\\\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\\\\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\\\\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\\\\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\\\\nvar xk,yk,zk;\\\\nvar i,j,j0,j1,k,p=0;\\\\nfor(i=0;i<n;++i) {\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Xj[j];\\\\n    x[k] = 1;\\\\n    Zj[p] = k;\\\\n    ++p;\\\\n  }\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Yj[j];\\\\n    y[k] = Yv[j];\\\\n    if(x[k] === 0) {\\\\n      Zj[p] = k;\\\\n      ++p;\\\\n    }\\\\n  }\\\\n  Zi[i+1] = p;\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\\\\n  j0 = Zi[i]; j1 = Zi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Zj[j];\\\\n    xk = x[k];\\\\n    yk = y[k];\\\\nzk = xk !==yk;\\\\n    Zv[j] = zk;\\\\n  }\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\\\\n}\\\\nreturn [Zi,Zj,Zv];\\\"}\", function(X,Y) { var Xi = X[0], Xj = X[1], Xv = X[2];\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\nvar xk,yk,zk;\nvar i,j,j0,j1,k,p=0;\nfor(i=0;i<n;++i) {\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Xj[j];\n    x[k] = 1;\n    Zj[p] = k;\n    ++p;\n  }\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Yj[j];\n    y[k] = Yv[j];\n    if(x[k] === 0) {\n      Zj[p] = k;\n      ++p;\n    }\n  }\n  Zi[i+1] = p;\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\n  j0 = Zi[i]; j1 = Zi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Zj[j];\n    xk = x[k];\n    yk = y[k];\nzk = xk !==yk;\n    Zv[j] = zk;\n  }\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\n}\nreturn [Zi,Zj,Zv]; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"if(typeof X === \\\\\\\"number\\\\\\\") return [Y[0],Y[1],numeric.neq(X,Y[2])];\\\\nif(typeof Y === \\\\\\\"number\\\\\\\") return [X[0],X[1],numeric.neq(X[2],Y)];\\\\nreturn numeric.ccsneqMM(X,Y);\\\\n\\\"}\", function(X,Y) { if(typeof X === \"number\") return [Y[0],Y[1],numeric.neq(X,Y[2])];\nif(typeof Y === \"number\") return [X[0],X[1],numeric.neq(X[2],Y)];\nreturn numeric.ccsneqMM(X,Y);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"var Xi = X[0], Xj = X[1], Xv = X[2];\\\\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\\\\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\\\\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\\\\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\\\\nvar xk,yk,zk;\\\\nvar i,j,j0,j1,k,p=0;\\\\nfor(i=0;i<n;++i) {\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Xj[j];\\\\n    x[k] = 1;\\\\n    Zj[p] = k;\\\\n    ++p;\\\\n  }\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Yj[j];\\\\n    y[k] = Yv[j];\\\\n    if(x[k] === 0) {\\\\n      Zj[p] = k;\\\\n      ++p;\\\\n    }\\\\n  }\\\\n  Zi[i+1] = p;\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\\\\n  j0 = Zi[i]; j1 = Zi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Zj[j];\\\\n    xk = x[k];\\\\n    yk = y[k];\\\\nzk = xk <yk;\\\\n    Zv[j] = zk;\\\\n  }\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\\\\n}\\\\nreturn [Zi,Zj,Zv];\\\"}\", function(X,Y) { var Xi = X[0], Xj = X[1], Xv = X[2];\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\nvar xk,yk,zk;\nvar i,j,j0,j1,k,p=0;\nfor(i=0;i<n;++i) {\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Xj[j];\n    x[k] = 1;\n    Zj[p] = k;\n    ++p;\n  }\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Yj[j];\n    y[k] = Yv[j];\n    if(x[k] === 0) {\n      Zj[p] = k;\n      ++p;\n    }\n  }\n  Zi[i+1] = p;\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\n  j0 = Zi[i]; j1 = Zi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Zj[j];\n    xk = x[k];\n    yk = y[k];\nzk = xk <yk;\n    Zv[j] = zk;\n  }\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\n}\nreturn [Zi,Zj,Zv]; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"if(typeof X === \\\\\\\"number\\\\\\\") return [Y[0],Y[1],numeric.lt(X,Y[2])];\\\\nif(typeof Y === \\\\\\\"number\\\\\\\") return [X[0],X[1],numeric.lt(X[2],Y)];\\\\nreturn numeric.ccsltMM(X,Y);\\\\n\\\"}\", function(X,Y) { if(typeof X === \"number\") return [Y[0],Y[1],numeric.lt(X,Y[2])];\nif(typeof Y === \"number\") return [X[0],X[1],numeric.lt(X[2],Y)];\nreturn numeric.ccsltMM(X,Y);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"var Xi = X[0], Xj = X[1], Xv = X[2];\\\\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\\\\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\\\\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\\\\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\\\\nvar xk,yk,zk;\\\\nvar i,j,j0,j1,k,p=0;\\\\nfor(i=0;i<n;++i) {\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Xj[j];\\\\n    x[k] = 1;\\\\n    Zj[p] = k;\\\\n    ++p;\\\\n  }\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Yj[j];\\\\n    y[k] = Yv[j];\\\\n    if(x[k] === 0) {\\\\n      Zj[p] = k;\\\\n      ++p;\\\\n    }\\\\n  }\\\\n  Zi[i+1] = p;\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\\\\n  j0 = Zi[i]; j1 = Zi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Zj[j];\\\\n    xk = x[k];\\\\n    yk = y[k];\\\\nzk = xk >yk;\\\\n    Zv[j] = zk;\\\\n  }\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\\\\n}\\\\nreturn [Zi,Zj,Zv];\\\"}\", function(X,Y) { var Xi = X[0], Xj = X[1], Xv = X[2];\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\nvar xk,yk,zk;\nvar i,j,j0,j1,k,p=0;\nfor(i=0;i<n;++i) {\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Xj[j];\n    x[k] = 1;\n    Zj[p] = k;\n    ++p;\n  }\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Yj[j];\n    y[k] = Yv[j];\n    if(x[k] === 0) {\n      Zj[p] = k;\n      ++p;\n    }\n  }\n  Zi[i+1] = p;\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\n  j0 = Zi[i]; j1 = Zi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Zj[j];\n    xk = x[k];\n    yk = y[k];\nzk = xk >yk;\n    Zv[j] = zk;\n  }\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\n}\nreturn [Zi,Zj,Zv]; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"if(typeof X === \\\\\\\"number\\\\\\\") return [Y[0],Y[1],numeric.gt(X,Y[2])];\\\\nif(typeof Y === \\\\\\\"number\\\\\\\") return [X[0],X[1],numeric.gt(X[2],Y)];\\\\nreturn numeric.ccsgtMM(X,Y);\\\\n\\\"}\", function(X,Y) { if(typeof X === \"number\") return [Y[0],Y[1],numeric.gt(X,Y[2])];\nif(typeof Y === \"number\") return [X[0],X[1],numeric.gt(X[2],Y)];\nreturn numeric.ccsgtMM(X,Y);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"var Xi = X[0], Xj = X[1], Xv = X[2];\\\\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\\\\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\\\\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\\\\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\\\\nvar xk,yk,zk;\\\\nvar i,j,j0,j1,k,p=0;\\\\nfor(i=0;i<n;++i) {\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Xj[j];\\\\n    x[k] = 1;\\\\n    Zj[p] = k;\\\\n    ++p;\\\\n  }\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Yj[j];\\\\n    y[k] = Yv[j];\\\\n    if(x[k] === 0) {\\\\n      Zj[p] = k;\\\\n      ++p;\\\\n    }\\\\n  }\\\\n  Zi[i+1] = p;\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\\\\n  j0 = Zi[i]; j1 = Zi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Zj[j];\\\\n    xk = x[k];\\\\n    yk = y[k];\\\\nzk = xk <=yk;\\\\n    Zv[j] = zk;\\\\n  }\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\\\\n}\\\\nreturn [Zi,Zj,Zv];\\\"}\", function(X,Y) { var Xi = X[0], Xj = X[1], Xv = X[2];\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\nvar xk,yk,zk;\nvar i,j,j0,j1,k,p=0;\nfor(i=0;i<n;++i) {\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Xj[j];\n    x[k] = 1;\n    Zj[p] = k;\n    ++p;\n  }\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Yj[j];\n    y[k] = Yv[j];\n    if(x[k] === 0) {\n      Zj[p] = k;\n      ++p;\n    }\n  }\n  Zi[i+1] = p;\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\n  j0 = Zi[i]; j1 = Zi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Zj[j];\n    xk = x[k];\n    yk = y[k];\nzk = xk <=yk;\n    Zv[j] = zk;\n  }\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\n}\nreturn [Zi,Zj,Zv]; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"if(typeof X === \\\\\\\"number\\\\\\\") return [Y[0],Y[1],numeric.leq(X,Y[2])];\\\\nif(typeof Y === \\\\\\\"number\\\\\\\") return [X[0],X[1],numeric.leq(X[2],Y)];\\\\nreturn numeric.ccsleqMM(X,Y);\\\\n\\\"}\", function(X,Y) { if(typeof X === \"number\") return [Y[0],Y[1],numeric.leq(X,Y[2])];\nif(typeof Y === \"number\") return [X[0],X[1],numeric.leq(X[2],Y)];\nreturn numeric.ccsleqMM(X,Y);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"var Xi = X[0], Xj = X[1], Xv = X[2];\\\\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\\\\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\\\\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\\\\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\\\\nvar xk,yk,zk;\\\\nvar i,j,j0,j1,k,p=0;\\\\nfor(i=0;i<n;++i) {\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Xj[j];\\\\n    x[k] = 1;\\\\n    Zj[p] = k;\\\\n    ++p;\\\\n  }\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Yj[j];\\\\n    y[k] = Yv[j];\\\\n    if(x[k] === 0) {\\\\n      Zj[p] = k;\\\\n      ++p;\\\\n    }\\\\n  }\\\\n  Zi[i+1] = p;\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\\\\n  j0 = Zi[i]; j1 = Zi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Zj[j];\\\\n    xk = x[k];\\\\n    yk = y[k];\\\\nzk = xk >=yk;\\\\n    Zv[j] = zk;\\\\n  }\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\\\\n}\\\\nreturn [Zi,Zj,Zv];\\\"}\", function(X,Y) { var Xi = X[0], Xj = X[1], Xv = X[2];\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\nvar xk,yk,zk;\nvar i,j,j0,j1,k,p=0;\nfor(i=0;i<n;++i) {\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Xj[j];\n    x[k] = 1;\n    Zj[p] = k;\n    ++p;\n  }\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Yj[j];\n    y[k] = Yv[j];\n    if(x[k] === 0) {\n      Zj[p] = k;\n      ++p;\n    }\n  }\n  Zi[i+1] = p;\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\n  j0 = Zi[i]; j1 = Zi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Zj[j];\n    xk = x[k];\n    yk = y[k];\nzk = xk >=yk;\n    Zv[j] = zk;\n  }\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\n}\nreturn [Zi,Zj,Zv]; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"if(typeof X === \\\\\\\"number\\\\\\\") return [Y[0],Y[1],numeric.geq(X,Y[2])];\\\\nif(typeof Y === \\\\\\\"number\\\\\\\") return [X[0],X[1],numeric.geq(X[2],Y)];\\\\nreturn numeric.ccsgeqMM(X,Y);\\\\n\\\"}\", function(X,Y) { if(typeof X === \"number\") return [Y[0],Y[1],numeric.geq(X,Y[2])];\nif(typeof Y === \"number\") return [X[0],X[1],numeric.geq(X[2],Y)];\nreturn numeric.ccsgeqMM(X,Y);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"var Xi = X[0], Xj = X[1], Xv = X[2];\\\\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\\\\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\\\\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\\\\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\\\\nvar xk,yk,zk;\\\\nvar i,j,j0,j1,k,p=0;\\\\nfor(i=0;i<n;++i) {\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Xj[j];\\\\n    x[k] = 1;\\\\n    Zj[p] = k;\\\\n    ++p;\\\\n  }\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Yj[j];\\\\n    y[k] = Yv[j];\\\\n    if(x[k] === 0) {\\\\n      Zj[p] = k;\\\\n      ++p;\\\\n    }\\\\n  }\\\\n  Zi[i+1] = p;\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\\\\n  j0 = Zi[i]; j1 = Zi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Zj[j];\\\\n    xk = x[k];\\\\n    yk = y[k];\\\\nzk = xk &yk;\\\\n    Zv[j] = zk;\\\\n  }\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\\\\n}\\\\nreturn [Zi,Zj,Zv];\\\"}\", function(X,Y) { var Xi = X[0], Xj = X[1], Xv = X[2];\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\nvar xk,yk,zk;\nvar i,j,j0,j1,k,p=0;\nfor(i=0;i<n;++i) {\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Xj[j];\n    x[k] = 1;\n    Zj[p] = k;\n    ++p;\n  }\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Yj[j];\n    y[k] = Yv[j];\n    if(x[k] === 0) {\n      Zj[p] = k;\n      ++p;\n    }\n  }\n  Zi[i+1] = p;\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\n  j0 = Zi[i]; j1 = Zi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Zj[j];\n    xk = x[k];\n    yk = y[k];\nzk = xk &yk;\n    Zv[j] = zk;\n  }\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\n}\nreturn [Zi,Zj,Zv]; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"if(typeof X === \\\\\\\"number\\\\\\\") return [Y[0],Y[1],numeric.band(X,Y[2])];\\\\nif(typeof Y === \\\\\\\"number\\\\\\\") return [X[0],X[1],numeric.band(X[2],Y)];\\\\nreturn numeric.ccsbandMM(X,Y);\\\\n\\\"}\", function(X,Y) { if(typeof X === \"number\") return [Y[0],Y[1],numeric.band(X,Y[2])];\nif(typeof Y === \"number\") return [X[0],X[1],numeric.band(X[2],Y)];\nreturn numeric.ccsbandMM(X,Y);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"var Xi = X[0], Xj = X[1], Xv = X[2];\\\\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\\\\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\\\\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\\\\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\\\\nvar xk,yk,zk;\\\\nvar i,j,j0,j1,k,p=0;\\\\nfor(i=0;i<n;++i) {\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Xj[j];\\\\n    x[k] = 1;\\\\n    Zj[p] = k;\\\\n    ++p;\\\\n  }\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Yj[j];\\\\n    y[k] = Yv[j];\\\\n    if(x[k] === 0) {\\\\n      Zj[p] = k;\\\\n      ++p;\\\\n    }\\\\n  }\\\\n  Zi[i+1] = p;\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\\\\n  j0 = Zi[i]; j1 = Zi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Zj[j];\\\\n    xk = x[k];\\\\n    yk = y[k];\\\\nzk = xk |yk;\\\\n    Zv[j] = zk;\\\\n  }\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\\\\n}\\\\nreturn [Zi,Zj,Zv];\\\"}\", function(X,Y) { var Xi = X[0], Xj = X[1], Xv = X[2];\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\nvar xk,yk,zk;\nvar i,j,j0,j1,k,p=0;\nfor(i=0;i<n;++i) {\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Xj[j];\n    x[k] = 1;\n    Zj[p] = k;\n    ++p;\n  }\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Yj[j];\n    y[k] = Yv[j];\n    if(x[k] === 0) {\n      Zj[p] = k;\n      ++p;\n    }\n  }\n  Zi[i+1] = p;\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\n  j0 = Zi[i]; j1 = Zi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Zj[j];\n    xk = x[k];\n    yk = y[k];\nzk = xk |yk;\n    Zv[j] = zk;\n  }\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\n}\nreturn [Zi,Zj,Zv]; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"if(typeof X === \\\\\\\"number\\\\\\\") return [Y[0],Y[1],numeric.bor(X,Y[2])];\\\\nif(typeof Y === \\\\\\\"number\\\\\\\") return [X[0],X[1],numeric.bor(X[2],Y)];\\\\nreturn numeric.ccsborMM(X,Y);\\\\n\\\"}\", function(X,Y) { if(typeof X === \"number\") return [Y[0],Y[1],numeric.bor(X,Y[2])];\nif(typeof Y === \"number\") return [X[0],X[1],numeric.bor(X[2],Y)];\nreturn numeric.ccsborMM(X,Y);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"var Xi = X[0], Xj = X[1], Xv = X[2];\\\\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\\\\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\\\\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\\\\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\\\\nvar xk,yk,zk;\\\\nvar i,j,j0,j1,k,p=0;\\\\nfor(i=0;i<n;++i) {\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Xj[j];\\\\n    x[k] = 1;\\\\n    Zj[p] = k;\\\\n    ++p;\\\\n  }\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Yj[j];\\\\n    y[k] = Yv[j];\\\\n    if(x[k] === 0) {\\\\n      Zj[p] = k;\\\\n      ++p;\\\\n    }\\\\n  }\\\\n  Zi[i+1] = p;\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\\\\n  j0 = Zi[i]; j1 = Zi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Zj[j];\\\\n    xk = x[k];\\\\n    yk = y[k];\\\\nzk = xk ^yk;\\\\n    Zv[j] = zk;\\\\n  }\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\\\\n}\\\\nreturn [Zi,Zj,Zv];\\\"}\", function(X,Y) { var Xi = X[0], Xj = X[1], Xv = X[2];\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\nvar xk,yk,zk;\nvar i,j,j0,j1,k,p=0;\nfor(i=0;i<n;++i) {\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Xj[j];\n    x[k] = 1;\n    Zj[p] = k;\n    ++p;\n  }\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Yj[j];\n    y[k] = Yv[j];\n    if(x[k] === 0) {\n      Zj[p] = k;\n      ++p;\n    }\n  }\n  Zi[i+1] = p;\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\n  j0 = Zi[i]; j1 = Zi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Zj[j];\n    xk = x[k];\n    yk = y[k];\nzk = xk ^yk;\n    Zv[j] = zk;\n  }\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\n}\nreturn [Zi,Zj,Zv]; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"if(typeof X === \\\\\\\"number\\\\\\\") return [Y[0],Y[1],numeric.bxor(X,Y[2])];\\\\nif(typeof Y === \\\\\\\"number\\\\\\\") return [X[0],X[1],numeric.bxor(X[2],Y)];\\\\nreturn numeric.ccsbxorMM(X,Y);\\\\n\\\"}\", function(X,Y) { if(typeof X === \"number\") return [Y[0],Y[1],numeric.bxor(X,Y[2])];\nif(typeof Y === \"number\") return [X[0],X[1],numeric.bxor(X[2],Y)];\nreturn numeric.ccsbxorMM(X,Y);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"var Xi = X[0], Xj = X[1], Xv = X[2];\\\\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\\\\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\\\\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\\\\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\\\\nvar xk,yk,zk;\\\\nvar i,j,j0,j1,k,p=0;\\\\nfor(i=0;i<n;++i) {\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Xj[j];\\\\n    x[k] = 1;\\\\n    Zj[p] = k;\\\\n    ++p;\\\\n  }\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Yj[j];\\\\n    y[k] = Yv[j];\\\\n    if(x[k] === 0) {\\\\n      Zj[p] = k;\\\\n      ++p;\\\\n    }\\\\n  }\\\\n  Zi[i+1] = p;\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\\\\n  j0 = Zi[i]; j1 = Zi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Zj[j];\\\\n    xk = x[k];\\\\n    yk = y[k];\\\\nzk = xk <<yk;\\\\n    Zv[j] = zk;\\\\n  }\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\\\\n}\\\\nreturn [Zi,Zj,Zv];\\\"}\", function(X,Y) { var Xi = X[0], Xj = X[1], Xv = X[2];\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\nvar xk,yk,zk;\nvar i,j,j0,j1,k,p=0;\nfor(i=0;i<n;++i) {\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Xj[j];\n    x[k] = 1;\n    Zj[p] = k;\n    ++p;\n  }\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Yj[j];\n    y[k] = Yv[j];\n    if(x[k] === 0) {\n      Zj[p] = k;\n      ++p;\n    }\n  }\n  Zi[i+1] = p;\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\n  j0 = Zi[i]; j1 = Zi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Zj[j];\n    xk = x[k];\n    yk = y[k];\nzk = xk <<yk;\n    Zv[j] = zk;\n  }\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\n}\nreturn [Zi,Zj,Zv]; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"if(typeof X === \\\\\\\"number\\\\\\\") return [Y[0],Y[1],numeric.lshift(X,Y[2])];\\\\nif(typeof Y === \\\\\\\"number\\\\\\\") return [X[0],X[1],numeric.lshift(X[2],Y)];\\\\nreturn numeric.ccslshiftMM(X,Y);\\\\n\\\"}\", function(X,Y) { if(typeof X === \"number\") return [Y[0],Y[1],numeric.lshift(X,Y[2])];\nif(typeof Y === \"number\") return [X[0],X[1],numeric.lshift(X[2],Y)];\nreturn numeric.ccslshiftMM(X,Y);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"var Xi = X[0], Xj = X[1], Xv = X[2];\\\\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\\\\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\\\\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\\\\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\\\\nvar xk,yk,zk;\\\\nvar i,j,j0,j1,k,p=0;\\\\nfor(i=0;i<n;++i) {\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Xj[j];\\\\n    x[k] = 1;\\\\n    Zj[p] = k;\\\\n    ++p;\\\\n  }\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Yj[j];\\\\n    y[k] = Yv[j];\\\\n    if(x[k] === 0) {\\\\n      Zj[p] = k;\\\\n      ++p;\\\\n    }\\\\n  }\\\\n  Zi[i+1] = p;\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\\\\n  j0 = Zi[i]; j1 = Zi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Zj[j];\\\\n    xk = x[k];\\\\n    yk = y[k];\\\\nzk = xk >>yk;\\\\n    Zv[j] = zk;\\\\n  }\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\\\\n}\\\\nreturn [Zi,Zj,Zv];\\\"}\", function(X,Y) { var Xi = X[0], Xj = X[1], Xv = X[2];\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\nvar xk,yk,zk;\nvar i,j,j0,j1,k,p=0;\nfor(i=0;i<n;++i) {\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Xj[j];\n    x[k] = 1;\n    Zj[p] = k;\n    ++p;\n  }\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Yj[j];\n    y[k] = Yv[j];\n    if(x[k] === 0) {\n      Zj[p] = k;\n      ++p;\n    }\n  }\n  Zi[i+1] = p;\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\n  j0 = Zi[i]; j1 = Zi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Zj[j];\n    xk = x[k];\n    yk = y[k];\nzk = xk >>yk;\n    Zv[j] = zk;\n  }\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\n}\nreturn [Zi,Zj,Zv]; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"if(typeof X === \\\\\\\"number\\\\\\\") return [Y[0],Y[1],numeric.rshift(X,Y[2])];\\\\nif(typeof Y === \\\\\\\"number\\\\\\\") return [X[0],X[1],numeric.rshift(X[2],Y)];\\\\nreturn numeric.ccsrshiftMM(X,Y);\\\\n\\\"}\", function(X,Y) { if(typeof X === \"number\") return [Y[0],Y[1],numeric.rshift(X,Y[2])];\nif(typeof Y === \"number\") return [X[0],X[1],numeric.rshift(X[2],Y)];\nreturn numeric.ccsrshiftMM(X,Y);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"var Xi = X[0], Xj = X[1], Xv = X[2];\\\\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\\\\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\\\\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\\\\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\\\\nvar xk,yk,zk;\\\\nvar i,j,j0,j1,k,p=0;\\\\nfor(i=0;i<n;++i) {\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Xj[j];\\\\n    x[k] = 1;\\\\n    Zj[p] = k;\\\\n    ++p;\\\\n  }\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Yj[j];\\\\n    y[k] = Yv[j];\\\\n    if(x[k] === 0) {\\\\n      Zj[p] = k;\\\\n      ++p;\\\\n    }\\\\n  }\\\\n  Zi[i+1] = p;\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\\\\n  j0 = Zi[i]; j1 = Zi[i+1];\\\\n  for(j=j0;j!==j1;++j) {\\\\n    k = Zj[j];\\\\n    xk = x[k];\\\\n    yk = y[k];\\\\nzk = xk >>>yk;\\\\n    Zv[j] = zk;\\\\n  }\\\\n  j0 = Xi[i]; j1 = Xi[i+1];\\\\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\\\\n  j0 = Yi[i]; j1 = Yi[i+1];\\\\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\\\\n}\\\\nreturn [Zi,Zj,Zv];\\\"}\", function(X,Y) { var Xi = X[0], Xj = X[1], Xv = X[2];\nvar Yi = Y[0], Yj = Y[1], Yv = Y[2];\nvar n = Xi.length-1,m = Math.max(numeric.sup(Xj),numeric.sup(Yj))+1;\nvar Zi = numeric.rep([n+1],0), Zj = [], Zv = [];\nvar x = numeric.rep([m],0),y = numeric.rep([m],0);\nvar xk,yk,zk;\nvar i,j,j0,j1,k,p=0;\nfor(i=0;i<n;++i) {\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Xj[j];\n    x[k] = 1;\n    Zj[p] = k;\n    ++p;\n  }\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Yj[j];\n    y[k] = Yv[j];\n    if(x[k] === 0) {\n      Zj[p] = k;\n      ++p;\n    }\n  }\n  Zi[i+1] = p;\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = Xv[j];\n  j0 = Zi[i]; j1 = Zi[i+1];\n  for(j=j0;j!==j1;++j) {\n    k = Zj[j];\n    xk = x[k];\n    yk = y[k];\nzk = xk >>>yk;\n    Zv[j] = zk;\n  }\n  j0 = Xi[i]; j1 = Xi[i+1];\n  for(j=j0;j!==j1;++j) x[Xj[j]] = 0;\n  j0 = Yi[i]; j1 = Yi[i+1];\n  for(j=j0;j!==j1;++j) y[Yj[j]] = 0;\n}\nreturn [Zi,Zj,Zv]; });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"X\\\",\\\"Y\\\"],\\\"code\\\":\\\"if(typeof X === \\\\\\\"number\\\\\\\") return [Y[0],Y[1],numeric.rrshift(X,Y[2])];\\\\nif(typeof Y === \\\\\\\"number\\\\\\\") return [X[0],X[1],numeric.rrshift(X[2],Y)];\\\\nreturn numeric.ccsrrshiftMM(X,Y);\\\\n\\\"}\", function(X,Y) { if(typeof X === \"number\") return [Y[0],Y[1],numeric.rrshift(X,Y[2])];\nif(typeof Y === \"number\") return [X[0],X[1],numeric.rrshift(X[2],Y)];\nreturn numeric.ccsrrshiftMM(X,Y);\n });\n\tfunctionMap.set(\"{\\\"argNames\\\":[\\\"r\\\"],\\\"code\\\":\\\"regeneratorRuntime = r\\\"}\", function(r) { regeneratorRuntime = r });\n\t\n\tconst eval = (code) => {\n\t\tconst fn = evalMap.get(code);\n\t\tif (fn) {\n\t\t\treturn fn();\n\t\t} else {\n\t\t\tthrow new Error(\"Prevented eval of code not seen ahead-of-time on De-eval()-er page: \" + code);\n\t\t}\n\t};\n\tconst Function = function (...args) {\n\t\tconst argNames = args.slice(0, -1);\n\t\tconst code = args.slice(-1)[0];\n\t\tconst key = JSON.stringify({argNames, code});\n\t\tconst fn = functionMap.get(key);\n\t\tif (fn) {\n\t\t\treturn fn;\n\t\t} else {\n\t\t\tthrow new Error(\"Prevented Function constructor called with arguments not seen ahead-of-time on De-eval()-er page: \" + JSON.stringify(args));\n\t\t}\n\t};\n\t// ------------------------------------------------------------\n\t// Option 1. Insert original library code here.\n\t// If the original library uses ES modules, you would need to ensure\n\t// import/export statements remain at the top level,\n\t// as they're not allowed within a function.\n\t// This is the cleanest option, as it requires no globals to be added or modified.\n\t/*__ORIGINAL_LIBRARY_CODE__*/;\n\n\t// Option 2. Export eval and Function globally:\n\t// globalThis.eval = eval;\n\t// globalThis.Function = Function;\n\t// This is the simplest option, but it may conflict with other code.\n\t\n\t// Option 3. Export eval and Function to a namespace:\n\tglobalThis.ClmtrackrAntiEval = { eval, Function };\n\t// This requires patching the library to use the namespace,\n\t// e.g. with const { eval, Function } = globalThis.ClmtrackrAntiEval ?? globalThis;\n\t// The fallback to globalThis allows to run without the generated monkey patch loaded,\n\t// which makes possible running the code collection process on the modified library,\n\t// which may or may not be useful.\n\t// (If you're updating the library, you'll likely have an unpatched version to run against anyway,\n\t// but if you're using an automated patching solution, it may be patched as soon as you update it,\n\t// and, another reason to re-run the code collection process is to trigger new code paths that weren't previously run.)\n\t// ------------------------------------------------------------\n})();"
  },
  {
    "path": "lib/tracky-mouse/core/lib/stats.js",
    "content": "(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.Stats = factory());\n}(this, (function () { 'use strict';\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar Stats = function () {\n\n\tvar mode = 0;\n\n\tvar container = document.createElement( 'div' );\n\tcontainer.style.cssText = 'position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000';\n\tcontainer.addEventListener( 'click', function ( event ) {\n\n\t\tevent.preventDefault();\n\t\tshowPanel( ++ mode % container.children.length );\n\n\t}, false );\n\n\t//\n\n\tfunction addPanel( panel ) {\n\n\t\tcontainer.appendChild( panel.dom );\n\t\treturn panel;\n\n\t}\n\n\tfunction showPanel( id ) {\n\n\t\tfor ( var i = 0; i < container.children.length; i ++ ) {\n\n\t\t\tcontainer.children[ i ].style.display = i === id ? 'block' : 'none';\n\n\t\t}\n\n\t\tmode = id;\n\n\t}\n\n\t//\n\n\tvar beginTime = ( performance || Date ).now(), prevTime = beginTime, frames = 0;\n\n\tvar fpsPanel = addPanel( new Stats.Panel( 'FPS', '#0ff', '#002' ) );\n\tvar msPanel = addPanel( new Stats.Panel( 'MS', '#0f0', '#020' ) );\n\n\tif ( self.performance && self.performance.memory ) {\n\n\t\tvar memPanel = addPanel( new Stats.Panel( 'MB', '#f08', '#201' ) );\n\n\t}\n\n\tshowPanel( 0 );\n\n\treturn {\n\n\t\tREVISION: 16,\n\n\t\tdom: container,\n\n\t\taddPanel: addPanel,\n\t\tshowPanel: showPanel,\n\n\t\tbegin: function () {\n\n\t\t\tbeginTime = ( performance || Date ).now();\n\n\t\t},\n\n\t\tend: function () {\n\n\t\t\tframes ++;\n\n\t\t\tvar time = ( performance || Date ).now();\n\n\t\t\tmsPanel.update( time - beginTime, 200 );\n\n\t\t\tif ( time >= prevTime + 1000 ) {\n\n\t\t\t\tfpsPanel.update( ( frames * 1000 ) / ( time - prevTime ), 100 );\n\n\t\t\t\tprevTime = time;\n\t\t\t\tframes = 0;\n\n\t\t\t\tif ( memPanel ) {\n\n\t\t\t\t\tvar memory = performance.memory;\n\t\t\t\t\tmemPanel.update( memory.usedJSHeapSize / 1048576, memory.jsHeapSizeLimit / 1048576 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn time;\n\n\t\t},\n\n\t\tupdate: function () {\n\n\t\t\tbeginTime = this.end();\n\n\t\t},\n\n\t\t// Backwards Compatibility\n\n\t\tdomElement: container,\n\t\tsetMode: showPanel\n\n\t};\n\n};\n\nStats.Panel = function ( name, fg, bg ) {\n\n\tvar min = Infinity, max = 0, round = Math.round;\n\tvar PR = round( window.devicePixelRatio || 1 );\n\n\tvar WIDTH = 80 * PR, HEIGHT = 48 * PR,\n\t\t\tTEXT_X = 3 * PR, TEXT_Y = 2 * PR,\n\t\t\tGRAPH_X = 3 * PR, GRAPH_Y = 15 * PR,\n\t\t\tGRAPH_WIDTH = 74 * PR, GRAPH_HEIGHT = 30 * PR;\n\n\tvar canvas = document.createElement( 'canvas' );\n\tcanvas.width = WIDTH;\n\tcanvas.height = HEIGHT;\n\tcanvas.style.cssText = 'width:80px;height:48px';\n\n\tvar context = canvas.getContext( '2d' );\n\tcontext.font = 'bold ' + ( 9 * PR ) + 'px Helvetica,Arial,sans-serif';\n\tcontext.textBaseline = 'top';\n\n\tcontext.fillStyle = bg;\n\tcontext.fillRect( 0, 0, WIDTH, HEIGHT );\n\n\tcontext.fillStyle = fg;\n\tcontext.fillText( name, TEXT_X, TEXT_Y );\n\tcontext.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );\n\n\tcontext.fillStyle = bg;\n\tcontext.globalAlpha = 0.9;\n\tcontext.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );\n\n\treturn {\n\n\t\tdom: canvas,\n\n\t\tupdate: function ( value, maxValue ) {\n\n\t\t\tmin = Math.min( min, value );\n\t\t\tmax = Math.max( max, value );\n\n\t\t\tcontext.fillStyle = bg;\n\t\t\tcontext.globalAlpha = 1;\n\t\t\tcontext.fillRect( 0, 0, WIDTH, GRAPH_Y );\n\t\t\tcontext.fillStyle = fg;\n\t\t\tcontext.fillText( round( value ) + ' ' + name + ' (' + round( min ) + '-' + round( max ) + ')', TEXT_X, TEXT_Y );\n\n\t\t\tcontext.drawImage( canvas, GRAPH_X + PR, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT, GRAPH_X, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT );\n\n\t\t\tcontext.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, GRAPH_HEIGHT );\n\n\t\t\tcontext.fillStyle = bg;\n\t\t\tcontext.globalAlpha = 0.9;\n\t\t\tcontext.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, round( ( 1 - ( value / maxValue ) ) * GRAPH_HEIGHT ) );\n\n\t\t}\n\n\t};\n\n};\n\nreturn Stats;\n\n})));\n"
  },
  {
    "path": "lib/tracky-mouse/core/lib/tf.js",
    "content": "/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\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(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(global = global || self, factory(global.tf = global.tf || {}));\n}(this, (function (exports) { 'use strict';\n\n\tvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n\tfunction unwrapExports (x) {\n\t\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n\t}\n\n\tfunction createCommonjsModule(fn, module) {\n\t\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n\t}\n\n\tfunction getCjsExportFromNamespace (n) {\n\t\treturn n && n['default'] || n;\n\t}\n\n\tfunction commonjsRequire () {\n\t\tthrow new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs');\n\t}\n\n\tvar check = function check(it) {\n\t  return it && it.Math == Math && it;\n\t}; // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\n\n\n\tvar global_1 = // eslint-disable-next-line no-undef\n\tcheck(typeof globalThis == 'object' && globalThis) || check(typeof window == 'object' && window) || check(typeof self == 'object' && self) || check(typeof commonjsGlobal == 'object' && commonjsGlobal) || // eslint-disable-next-line no-new-func\n\tFunction('return this')();\n\n\tvar fails = function fails(exec) {\n\t  try {\n\t    return !!exec();\n\t  } catch (error) {\n\t    return true;\n\t  }\n\t};\n\n\tvar descriptors = !fails(function () {\n\t  return Object.defineProperty({}, 1, {\n\t    get: function get() {\n\t      return 7;\n\t    }\n\t  })[1] != 7;\n\t});\n\n\t'use strict';\n\n\tvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\n\tvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; // Nashorn ~ JDK8 bug\n\n\tvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({\n\t  1: 2\n\t}, 1); // `Object.prototype.propertyIsEnumerable` method implementation\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\n\n\tvar f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n\t  var descriptor = getOwnPropertyDescriptor(this, V);\n\t  return !!descriptor && descriptor.enumerable;\n\t} : nativePropertyIsEnumerable;\n\tvar objectPropertyIsEnumerable = {\n\t  f: f\n\t};\n\n\tvar createPropertyDescriptor = function createPropertyDescriptor(bitmap, value) {\n\t  return {\n\t    enumerable: !(bitmap & 1),\n\t    configurable: !(bitmap & 2),\n\t    writable: !(bitmap & 4),\n\t    value: value\n\t  };\n\t};\n\n\tvar toString = {}.toString;\n\n\tvar classofRaw = function classofRaw(it) {\n\t  return toString.call(it).slice(8, -1);\n\t};\n\n\tvar split = ''.split; // fallback for non-array-like ES3 and non-enumerable old V8 strings\n\n\tvar indexedObject = fails(function () {\n\t  // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n\t  // eslint-disable-next-line no-prototype-builtins\n\t  return !Object('z').propertyIsEnumerable(0);\n\t}) ? function (it) {\n\t  return classofRaw(it) == 'String' ? split.call(it, '') : Object(it);\n\t} : Object;\n\n\t// `RequireObjectCoercible` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\n\tvar requireObjectCoercible = function requireObjectCoercible(it) {\n\t  if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n\t  return it;\n\t};\n\n\tvar toIndexedObject = function toIndexedObject(it) {\n\t  return indexedObject(requireObjectCoercible(it));\n\t};\n\n\tvar isObject = function isObject(it) {\n\t  return typeof it === 'object' ? it !== null : typeof it === 'function';\n\t};\n\n\t// https://tc39.github.io/ecma262/#sec-toprimitive\n\t// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n\t// and the second argument - flag - preferred type is a string\n\n\tvar toPrimitive = function toPrimitive(input, PREFERRED_STRING) {\n\t  if (!isObject(input)) return input;\n\t  var fn, val;\n\t  if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n\t  if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n\t  if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n\t  throw TypeError(\"Can't convert object to primitive value\");\n\t};\n\n\tvar hasOwnProperty = {}.hasOwnProperty;\n\n\tvar has = function has(it, key) {\n\t  return hasOwnProperty.call(it, key);\n\t};\n\n\tvar document$1 = global_1.document; // typeof document.createElement is 'object' in old IE\n\n\tvar EXISTS = isObject(document$1) && isObject(document$1.createElement);\n\n\tvar documentCreateElement = function documentCreateElement(it) {\n\t  return EXISTS ? document$1.createElement(it) : {};\n\t};\n\n\tvar ie8DomDefine = !descriptors && !fails(function () {\n\t  return Object.defineProperty(documentCreateElement('div'), 'a', {\n\t    get: function get() {\n\t      return 7;\n\t    }\n\t  }).a != 7;\n\t});\n\n\tvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; // `Object.getOwnPropertyDescriptor` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n\n\tvar f$1 = descriptors ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n\t  O = toIndexedObject(O);\n\t  P = toPrimitive(P, true);\n\t  if (ie8DomDefine) try {\n\t    return nativeGetOwnPropertyDescriptor(O, P);\n\t  } catch (error) {\n\t    /* empty */\n\t  }\n\t  if (has(O, P)) return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(O, P), O[P]);\n\t};\n\tvar objectGetOwnPropertyDescriptor = {\n\t  f: f$1\n\t};\n\n\tvar anObject = function anObject(it) {\n\t  if (!isObject(it)) {\n\t    throw TypeError(String(it) + ' is not an object');\n\t  }\n\n\t  return it;\n\t};\n\n\tvar nativeDefineProperty = Object.defineProperty; // `Object.defineProperty` method\n\t// https://tc39.github.io/ecma262/#sec-object.defineproperty\n\n\tvar f$2 = descriptors ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n\t  anObject(O);\n\t  P = toPrimitive(P, true);\n\t  anObject(Attributes);\n\t  if (ie8DomDefine) try {\n\t    return nativeDefineProperty(O, P, Attributes);\n\t  } catch (error) {\n\t    /* empty */\n\t  }\n\t  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n\t  if ('value' in Attributes) O[P] = Attributes.value;\n\t  return O;\n\t};\n\tvar objectDefineProperty = {\n\t  f: f$2\n\t};\n\n\tvar createNonEnumerableProperty = descriptors ? function (object, key, value) {\n\t  return objectDefineProperty.f(object, key, createPropertyDescriptor(1, value));\n\t} : function (object, key, value) {\n\t  object[key] = value;\n\t  return object;\n\t};\n\n\tvar setGlobal = function setGlobal(key, value) {\n\t  try {\n\t    createNonEnumerableProperty(global_1, key, value);\n\t  } catch (error) {\n\t    global_1[key] = value;\n\t  }\n\n\t  return value;\n\t};\n\n\tvar SHARED = '__core-js_shared__';\n\tvar store = global_1[SHARED] || setGlobal(SHARED, {});\n\tvar sharedStore = store;\n\n\tvar functionToString = Function.toString; // this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\n\n\tif (typeof sharedStore.inspectSource != 'function') {\n\t  sharedStore.inspectSource = function (it) {\n\t    return functionToString.call(it);\n\t  };\n\t}\n\n\tvar inspectSource = sharedStore.inspectSource;\n\n\tvar WeakMap$1 = global_1.WeakMap;\n\tvar nativeWeakMap = typeof WeakMap$1 === 'function' && /native code/.test(inspectSource(WeakMap$1));\n\n\tvar isPure = false;\n\n\tvar shared = createCommonjsModule(function (module) {\n\t  (module.exports = function (key, value) {\n\t    return sharedStore[key] || (sharedStore[key] = value !== undefined ? value : {});\n\t  })('versions', []).push({\n\t    version: '3.6.5',\n\t    mode: isPure ? 'pure' : 'global',\n\t    copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n\t  });\n\t});\n\n\tvar id = 0;\n\tvar postfix = Math.random();\n\n\tvar uid = function uid(key) {\n\t  return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n\t};\n\n\tvar keys = shared('keys');\n\n\tvar sharedKey = function sharedKey(key) {\n\t  return keys[key] || (keys[key] = uid(key));\n\t};\n\n\tvar hiddenKeys = {};\n\n\tvar WeakMap$2 = global_1.WeakMap;\n\tvar set, get, has$1;\n\n\tvar enforce = function enforce(it) {\n\t  return has$1(it) ? get(it) : set(it, {});\n\t};\n\n\tvar getterFor = function getterFor(TYPE) {\n\t  return function (it) {\n\t    var state;\n\n\t    if (!isObject(it) || (state = get(it)).type !== TYPE) {\n\t      throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n\t    }\n\n\t    return state;\n\t  };\n\t};\n\n\tif (nativeWeakMap) {\n\t  var store$1 = new WeakMap$2();\n\t  var wmget = store$1.get;\n\t  var wmhas = store$1.has;\n\t  var wmset = store$1.set;\n\n\t  set = function set(it, metadata) {\n\t    wmset.call(store$1, it, metadata);\n\t    return metadata;\n\t  };\n\n\t  get = function get(it) {\n\t    return wmget.call(store$1, it) || {};\n\t  };\n\n\t  has$1 = function has(it) {\n\t    return wmhas.call(store$1, it);\n\t  };\n\t} else {\n\t  var STATE = sharedKey('state');\n\t  hiddenKeys[STATE] = true;\n\n\t  set = function set(it, metadata) {\n\t    createNonEnumerableProperty(it, STATE, metadata);\n\t    return metadata;\n\t  };\n\n\t  get = function get(it) {\n\t    return has(it, STATE) ? it[STATE] : {};\n\t  };\n\n\t  has$1 = function has$1(it) {\n\t    return has(it, STATE);\n\t  };\n\t}\n\n\tvar internalState = {\n\t  set: set,\n\t  get: get,\n\t  has: has$1,\n\t  enforce: enforce,\n\t  getterFor: getterFor\n\t};\n\tvar internalState_1 = internalState.set;\n\tvar internalState_2 = internalState.get;\n\tvar internalState_3 = internalState.has;\n\tvar internalState_4 = internalState.enforce;\n\tvar internalState_5 = internalState.getterFor;\n\n\tvar redefine = createCommonjsModule(function (module) {\n\t  var getInternalState = internalState.get;\n\t  var enforceInternalState = internalState.enforce;\n\t  var TEMPLATE = String(String).split('String');\n\t  (module.exports = function (O, key, value, options) {\n\t    var unsafe = options ? !!options.unsafe : false;\n\t    var simple = options ? !!options.enumerable : false;\n\t    var noTargetGet = options ? !!options.noTargetGet : false;\n\n\t    if (typeof value == 'function') {\n\t      if (typeof key == 'string' && !has(value, 'name')) createNonEnumerableProperty(value, 'name', key);\n\t      enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : '');\n\t    }\n\n\t    if (O === global_1) {\n\t      if (simple) O[key] = value;else setGlobal(key, value);\n\t      return;\n\t    } else if (!unsafe) {\n\t      delete O[key];\n\t    } else if (!noTargetGet && O[key]) {\n\t      simple = true;\n\t    }\n\n\t    if (simple) O[key] = value;else createNonEnumerableProperty(O, key, value); // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n\t  })(Function.prototype, 'toString', function toString() {\n\t    return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n\t  });\n\t});\n\n\tvar path = global_1;\n\n\tvar aFunction = function aFunction(variable) {\n\t  return typeof variable == 'function' ? variable : undefined;\n\t};\n\n\tvar getBuiltIn = function getBuiltIn(namespace, method) {\n\t  return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global_1[namespace]) : path[namespace] && path[namespace][method] || global_1[namespace] && global_1[namespace][method];\n\t};\n\n\tvar ceil = Math.ceil;\n\tvar floor = Math.floor; // `ToInteger` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-tointeger\n\n\tvar toInteger = function toInteger(argument) {\n\t  return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n\t};\n\n\tvar min = Math.min; // `ToLength` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-tolength\n\n\tvar toLength = function toLength(argument) {\n\t  return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n\t};\n\n\tvar max = Math.max;\n\tvar min$1 = Math.min; // Helper for a popular repeating case of the spec:\n\t// Let integer be ? ToInteger(index).\n\t// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\n\n\tvar toAbsoluteIndex = function toAbsoluteIndex(index, length) {\n\t  var integer = toInteger(index);\n\t  return integer < 0 ? max(integer + length, 0) : min$1(integer, length);\n\t};\n\n\tvar createMethod = function createMethod(IS_INCLUDES) {\n\t  return function ($this, el, fromIndex) {\n\t    var O = toIndexedObject($this);\n\t    var length = toLength(O.length);\n\t    var index = toAbsoluteIndex(fromIndex, length);\n\t    var value; // Array#includes uses SameValueZero equality algorithm\n\t    // eslint-disable-next-line no-self-compare\n\n\t    if (IS_INCLUDES && el != el) while (length > index) {\n\t      value = O[index++]; // eslint-disable-next-line no-self-compare\n\n\t      if (value != value) return true; // Array#indexOf ignores holes, Array#includes - not\n\t    } else for (; length > index; index++) {\n\t      if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n\t    }\n\t    return !IS_INCLUDES && -1;\n\t  };\n\t};\n\n\tvar arrayIncludes = {\n\t  // `Array.prototype.includes` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n\t  includes: createMethod(true),\n\t  // `Array.prototype.indexOf` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n\t  indexOf: createMethod(false)\n\t};\n\tvar arrayIncludes_1 = arrayIncludes.includes;\n\tvar arrayIncludes_2 = arrayIncludes.indexOf;\n\n\tvar indexOf = arrayIncludes.indexOf;\n\n\tvar objectKeysInternal = function objectKeysInternal(object, names) {\n\t  var O = toIndexedObject(object);\n\t  var i = 0;\n\t  var result = [];\n\t  var key;\n\n\t  for (key in O) {\n\t    !has(hiddenKeys, key) && has(O, key) && result.push(key);\n\t  } // Don't enum bug & hidden keys\n\n\n\t  while (names.length > i) {\n\t    if (has(O, key = names[i++])) {\n\t      ~indexOf(result, key) || result.push(key);\n\t    }\n\t  }\n\n\t  return result;\n\t};\n\n\t// IE8- don't enum bug keys\n\tvar enumBugKeys = ['constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'valueOf'];\n\n\tvar hiddenKeys$1 = enumBugKeys.concat('length', 'prototype'); // `Object.getOwnPropertyNames` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n\n\tvar f$3 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n\t  return objectKeysInternal(O, hiddenKeys$1);\n\t};\n\n\tvar objectGetOwnPropertyNames = {\n\t  f: f$3\n\t};\n\n\tvar f$4 = Object.getOwnPropertySymbols;\n\tvar objectGetOwnPropertySymbols = {\n\t  f: f$4\n\t};\n\n\tvar ownKeys = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n\t  var keys = objectGetOwnPropertyNames.f(anObject(it));\n\t  var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\n\t  return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n\t};\n\n\tvar copyConstructorProperties = function copyConstructorProperties(target, source) {\n\t  var keys = ownKeys(source);\n\t  var defineProperty = objectDefineProperty.f;\n\t  var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\n\n\t  for (var i = 0; i < keys.length; i++) {\n\t    var key = keys[i];\n\t    if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n\t  }\n\t};\n\n\tvar replacement = /#|\\.prototype\\./;\n\n\tvar isForced = function isForced(feature, detection) {\n\t  var value = data[normalize(feature)];\n\t  return value == POLYFILL ? true : value == NATIVE ? false : typeof detection == 'function' ? fails(detection) : !!detection;\n\t};\n\n\tvar normalize = isForced.normalize = function (string) {\n\t  return String(string).replace(replacement, '.').toLowerCase();\n\t};\n\n\tvar data = isForced.data = {};\n\tvar NATIVE = isForced.NATIVE = 'N';\n\tvar POLYFILL = isForced.POLYFILL = 'P';\n\tvar isForced_1 = isForced;\n\n\tvar getOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;\n\t/*\n\t  options.target      - name of the target object\n\t  options.global      - target is the global object\n\t  options.stat        - export as static methods of target\n\t  options.proto       - export as prototype methods of target\n\t  options.real        - real prototype method for the `pure` version\n\t  options.forced      - export even if the native feature is available\n\t  options.bind        - bind methods to the target, required for the `pure` version\n\t  options.wrap        - wrap constructors to preventing global pollution, required for the `pure` version\n\t  options.unsafe      - use the simple assignment of property instead of delete + defineProperty\n\t  options.sham        - add a flag to not completely full polyfills\n\t  options.enumerable  - export as enumerable property\n\t  options.noTargetGet - prevent calling a getter on target\n\t*/\n\n\tvar _export = function _export(options, source) {\n\t  var TARGET = options.target;\n\t  var GLOBAL = options.global;\n\t  var STATIC = options.stat;\n\t  var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n\n\t  if (GLOBAL) {\n\t    target = global_1;\n\t  } else if (STATIC) {\n\t    target = global_1[TARGET] || setGlobal(TARGET, {});\n\t  } else {\n\t    target = (global_1[TARGET] || {}).prototype;\n\t  }\n\n\t  if (target) for (key in source) {\n\t    sourceProperty = source[key];\n\n\t    if (options.noTargetGet) {\n\t      descriptor = getOwnPropertyDescriptor$1(target, key);\n\t      targetProperty = descriptor && descriptor.value;\n\t    } else targetProperty = target[key];\n\n\t    FORCED = isForced_1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); // contained in target\n\n\t    if (!FORCED && targetProperty !== undefined) {\n\t      if (typeof sourceProperty === typeof targetProperty) continue;\n\t      copyConstructorProperties(sourceProperty, targetProperty);\n\t    } // add a flag to not completely full polyfills\n\n\n\t    if (options.sham || targetProperty && targetProperty.sham) {\n\t      createNonEnumerableProperty(sourceProperty, 'sham', true);\n\t    } // extend global\n\n\n\t    redefine(target, key, sourceProperty, options);\n\t  }\n\t};\n\n\tvar nativeSymbol = !!Object.getOwnPropertySymbols && !fails(function () {\n\t  // Chrome 38 Symbol has incorrect toString conversion\n\t  // eslint-disable-next-line no-undef\n\t  return !String(Symbol());\n\t});\n\n\tvar useSymbolAsUid = nativeSymbol // eslint-disable-next-line no-undef\n\t&& !Symbol.sham // eslint-disable-next-line no-undef\n\t&& typeof Symbol.iterator == 'symbol';\n\n\t// https://tc39.github.io/ecma262/#sec-isarray\n\n\tvar isArray = Array.isArray || function isArray(arg) {\n\t  return classofRaw(arg) == 'Array';\n\t};\n\n\t// https://tc39.github.io/ecma262/#sec-toobject\n\n\tvar toObject = function toObject(argument) {\n\t  return Object(requireObjectCoercible(argument));\n\t};\n\n\t// https://tc39.github.io/ecma262/#sec-object.keys\n\n\tvar objectKeys = Object.keys || function keys(O) {\n\t  return objectKeysInternal(O, enumBugKeys);\n\t};\n\n\t// https://tc39.github.io/ecma262/#sec-object.defineproperties\n\n\tvar objectDefineProperties = descriptors ? Object.defineProperties : function defineProperties(O, Properties) {\n\t  anObject(O);\n\t  var keys = objectKeys(Properties);\n\t  var length = keys.length;\n\t  var index = 0;\n\t  var key;\n\n\t  while (length > index) {\n\t    objectDefineProperty.f(O, key = keys[index++], Properties[key]);\n\t  }\n\n\t  return O;\n\t};\n\n\tvar html = getBuiltIn('document', 'documentElement');\n\n\tvar GT = '>';\n\tvar LT = '<';\n\tvar PROTOTYPE = 'prototype';\n\tvar SCRIPT = 'script';\n\tvar IE_PROTO = sharedKey('IE_PROTO');\n\n\tvar EmptyConstructor = function EmptyConstructor() {\n\t  /* empty */\n\t};\n\n\tvar scriptTag = function scriptTag(content) {\n\t  return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n\t}; // Create object with fake `null` prototype: use ActiveX Object with cleared prototype\n\n\n\tvar NullProtoObjectViaActiveX = function NullProtoObjectViaActiveX(activeXDocument) {\n\t  activeXDocument.write(scriptTag(''));\n\t  activeXDocument.close();\n\t  var temp = activeXDocument.parentWindow.Object;\n\t  activeXDocument = null; // avoid memory leak\n\n\t  return temp;\n\t}; // Create object with fake `null` prototype: use iframe Object with cleared prototype\n\n\n\tvar NullProtoObjectViaIFrame = function NullProtoObjectViaIFrame() {\n\t  // Thrash, waste and sodomy: IE GC bug\n\t  var iframe = documentCreateElement('iframe');\n\t  var JS = 'java' + SCRIPT + ':';\n\t  var iframeDocument;\n\t  iframe.style.display = 'none';\n\t  html.appendChild(iframe); // https://github.com/zloirock/core-js/issues/475\n\n\t  iframe.src = String(JS);\n\t  iframeDocument = iframe.contentWindow.document;\n\t  iframeDocument.open();\n\t  iframeDocument.write(scriptTag('document.F=Object'));\n\t  iframeDocument.close();\n\t  return iframeDocument.F;\n\t}; // Check for document.domain and active x support\n\t// No need to use active x approach when document.domain is not set\n\t// see https://github.com/es-shims/es5-shim/issues/150\n\t// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n\t// avoid IE GC bug\n\n\n\tvar activeXDocument;\n\n\tvar _NullProtoObject = function NullProtoObject() {\n\t  try {\n\t    /* global ActiveXObject */\n\t    activeXDocument = document.domain && new ActiveXObject('htmlfile');\n\t  } catch (error) {\n\t    /* ignore */\n\t  }\n\n\t  _NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n\t  var length = enumBugKeys.length;\n\n\t  while (length--) {\n\t    delete _NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n\t  }\n\n\t  return _NullProtoObject();\n\t};\n\n\thiddenKeys[IE_PROTO] = true; // `Object.create` method\n\t// https://tc39.github.io/ecma262/#sec-object.create\n\n\tvar objectCreate = Object.create || function create(O, Properties) {\n\t  var result;\n\n\t  if (O !== null) {\n\t    EmptyConstructor[PROTOTYPE] = anObject(O);\n\t    result = new EmptyConstructor();\n\t    EmptyConstructor[PROTOTYPE] = null; // add \"__proto__\" for Object.getPrototypeOf polyfill\n\n\t    result[IE_PROTO] = O;\n\t  } else result = _NullProtoObject();\n\n\t  return Properties === undefined ? result : objectDefineProperties(result, Properties);\n\t};\n\n\tvar nativeGetOwnPropertyNames = objectGetOwnPropertyNames.f;\n\tvar toString$1 = {}.toString;\n\tvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : [];\n\n\tvar getWindowNames = function getWindowNames(it) {\n\t  try {\n\t    return nativeGetOwnPropertyNames(it);\n\t  } catch (error) {\n\t    return windowNames.slice();\n\t  }\n\t}; // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\n\n\n\tvar f$5 = function getOwnPropertyNames(it) {\n\t  return windowNames && toString$1.call(it) == '[object Window]' ? getWindowNames(it) : nativeGetOwnPropertyNames(toIndexedObject(it));\n\t};\n\n\tvar objectGetOwnPropertyNamesExternal = {\n\t  f: f$5\n\t};\n\n\tvar WellKnownSymbolsStore = shared('wks');\n\tvar Symbol$1 = global_1.Symbol;\n\tvar createWellKnownSymbol = useSymbolAsUid ? Symbol$1 : Symbol$1 && Symbol$1.withoutSetter || uid;\n\n\tvar wellKnownSymbol = function wellKnownSymbol(name) {\n\t  if (!has(WellKnownSymbolsStore, name)) {\n\t    if (nativeSymbol && has(Symbol$1, name)) WellKnownSymbolsStore[name] = Symbol$1[name];else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n\t  }\n\n\t  return WellKnownSymbolsStore[name];\n\t};\n\n\tvar f$6 = wellKnownSymbol;\n\tvar wellKnownSymbolWrapped = {\n\t  f: f$6\n\t};\n\n\tvar defineProperty = objectDefineProperty.f;\n\n\tvar defineWellKnownSymbol = function defineWellKnownSymbol(NAME) {\n\t  var Symbol = path.Symbol || (path.Symbol = {});\n\t  if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {\n\t    value: wellKnownSymbolWrapped.f(NAME)\n\t  });\n\t};\n\n\tvar defineProperty$1 = objectDefineProperty.f;\n\tvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\n\tvar setToStringTag = function setToStringTag(it, TAG, STATIC) {\n\t  if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n\t    defineProperty$1(it, TO_STRING_TAG, {\n\t      configurable: true,\n\t      value: TAG\n\t    });\n\t  }\n\t};\n\n\tvar aFunction$1 = function aFunction(it) {\n\t  if (typeof it != 'function') {\n\t    throw TypeError(String(it) + ' is not a function');\n\t  }\n\n\t  return it;\n\t};\n\n\tvar functionBindContext = function functionBindContext(fn, that, length) {\n\t  aFunction$1(fn);\n\t  if (that === undefined) return fn;\n\n\t  switch (length) {\n\t    case 0:\n\t      return function () {\n\t        return fn.call(that);\n\t      };\n\n\t    case 1:\n\t      return function (a) {\n\t        return fn.call(that, a);\n\t      };\n\n\t    case 2:\n\t      return function (a, b) {\n\t        return fn.call(that, a, b);\n\t      };\n\n\t    case 3:\n\t      return function (a, b, c) {\n\t        return fn.call(that, a, b, c);\n\t      };\n\t  }\n\n\t  return function ()\n\t  /* ...args */\n\t  {\n\t    return fn.apply(that, arguments);\n\t  };\n\t};\n\n\tvar SPECIES = wellKnownSymbol('species'); // `ArraySpeciesCreate` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\n\n\tvar arraySpeciesCreate = function arraySpeciesCreate(originalArray, length) {\n\t  var C;\n\n\t  if (isArray(originalArray)) {\n\t    C = originalArray.constructor; // cross-realm fallback\n\n\t    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;else if (isObject(C)) {\n\t      C = C[SPECIES];\n\t      if (C === null) C = undefined;\n\t    }\n\t  }\n\n\t  return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n\t};\n\n\tvar push = [].push; // `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\n\n\tvar createMethod$1 = function createMethod(TYPE) {\n\t  var IS_MAP = TYPE == 1;\n\t  var IS_FILTER = TYPE == 2;\n\t  var IS_SOME = TYPE == 3;\n\t  var IS_EVERY = TYPE == 4;\n\t  var IS_FIND_INDEX = TYPE == 6;\n\t  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n\t  return function ($this, callbackfn, that, specificCreate) {\n\t    var O = toObject($this);\n\t    var self = indexedObject(O);\n\t    var boundFunction = functionBindContext(callbackfn, that, 3);\n\t    var length = toLength(self.length);\n\t    var index = 0;\n\t    var create = specificCreate || arraySpeciesCreate;\n\t    var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n\t    var value, result;\n\n\t    for (; length > index; index++) {\n\t      if (NO_HOLES || index in self) {\n\t        value = self[index];\n\t        result = boundFunction(value, index, O);\n\n\t        if (TYPE) {\n\t          if (IS_MAP) target[index] = result; // map\n\t          else if (result) switch (TYPE) {\n\t              case 3:\n\t                return true;\n\t              // some\n\n\t              case 5:\n\t                return value;\n\t              // find\n\n\t              case 6:\n\t                return index;\n\t              // findIndex\n\n\t              case 2:\n\t                push.call(target, value);\n\t              // filter\n\t            } else if (IS_EVERY) return false; // every\n\t        }\n\t      }\n\t    }\n\n\t    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n\t  };\n\t};\n\n\tvar arrayIteration = {\n\t  // `Array.prototype.forEach` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n\t  forEach: createMethod$1(0),\n\t  // `Array.prototype.map` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.map\n\t  map: createMethod$1(1),\n\t  // `Array.prototype.filter` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n\t  filter: createMethod$1(2),\n\t  // `Array.prototype.some` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.some\n\t  some: createMethod$1(3),\n\t  // `Array.prototype.every` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.every\n\t  every: createMethod$1(4),\n\t  // `Array.prototype.find` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.find\n\t  find: createMethod$1(5),\n\t  // `Array.prototype.findIndex` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\n\t  findIndex: createMethod$1(6)\n\t};\n\tvar arrayIteration_1 = arrayIteration.forEach;\n\tvar arrayIteration_2 = arrayIteration.map;\n\tvar arrayIteration_3 = arrayIteration.filter;\n\tvar arrayIteration_4 = arrayIteration.some;\n\tvar arrayIteration_5 = arrayIteration.every;\n\tvar arrayIteration_6 = arrayIteration.find;\n\tvar arrayIteration_7 = arrayIteration.findIndex;\n\n\t'use strict';\n\n\tvar $forEach = arrayIteration.forEach;\n\tvar HIDDEN = sharedKey('hidden');\n\tvar SYMBOL = 'Symbol';\n\tvar PROTOTYPE$1 = 'prototype';\n\tvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\tvar setInternalState = internalState.set;\n\tvar getInternalState = internalState.getterFor(SYMBOL);\n\tvar ObjectPrototype = Object[PROTOTYPE$1];\n\tvar $Symbol = global_1.Symbol;\n\tvar $stringify = getBuiltIn('JSON', 'stringify');\n\tvar nativeGetOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;\n\tvar nativeDefineProperty$1 = objectDefineProperty.f;\n\tvar nativeGetOwnPropertyNames$1 = objectGetOwnPropertyNamesExternal.f;\n\tvar nativePropertyIsEnumerable$1 = objectPropertyIsEnumerable.f;\n\tvar AllSymbols = shared('symbols');\n\tvar ObjectPrototypeSymbols = shared('op-symbols');\n\tvar StringToSymbolRegistry = shared('string-to-symbol-registry');\n\tvar SymbolToStringRegistry = shared('symbol-to-string-registry');\n\tvar WellKnownSymbolsStore$1 = shared('wks');\n\tvar QObject = global_1.QObject; // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\n\n\tvar USE_SETTER = !QObject || !QObject[PROTOTYPE$1] || !QObject[PROTOTYPE$1].findChild; // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\n\n\tvar setSymbolDescriptor = descriptors && fails(function () {\n\t  return objectCreate(nativeDefineProperty$1({}, 'a', {\n\t    get: function get() {\n\t      return nativeDefineProperty$1(this, 'a', {\n\t        value: 7\n\t      }).a;\n\t    }\n\t  })).a != 7;\n\t}) ? function (O, P, Attributes) {\n\t  var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor$1(ObjectPrototype, P);\n\t  if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];\n\t  nativeDefineProperty$1(O, P, Attributes);\n\n\t  if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {\n\t    nativeDefineProperty$1(ObjectPrototype, P, ObjectPrototypeDescriptor);\n\t  }\n\t} : nativeDefineProperty$1;\n\n\tvar wrap = function wrap(tag, description) {\n\t  var symbol = AllSymbols[tag] = objectCreate($Symbol[PROTOTYPE$1]);\n\t  setInternalState(symbol, {\n\t    type: SYMBOL,\n\t    tag: tag,\n\t    description: description\n\t  });\n\t  if (!descriptors) symbol.description = description;\n\t  return symbol;\n\t};\n\n\tvar isSymbol = useSymbolAsUid ? function (it) {\n\t  return typeof it == 'symbol';\n\t} : function (it) {\n\t  return Object(it) instanceof $Symbol;\n\t};\n\n\tvar $defineProperty = function defineProperty(O, P, Attributes) {\n\t  if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);\n\t  anObject(O);\n\t  var key = toPrimitive(P, true);\n\t  anObject(Attributes);\n\n\t  if (has(AllSymbols, key)) {\n\t    if (!Attributes.enumerable) {\n\t      if (!has(O, HIDDEN)) nativeDefineProperty$1(O, HIDDEN, createPropertyDescriptor(1, {}));\n\t      O[HIDDEN][key] = true;\n\t    } else {\n\t      if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;\n\t      Attributes = objectCreate(Attributes, {\n\t        enumerable: createPropertyDescriptor(0, false)\n\t      });\n\t    }\n\n\t    return setSymbolDescriptor(O, key, Attributes);\n\t  }\n\n\t  return nativeDefineProperty$1(O, key, Attributes);\n\t};\n\n\tvar $defineProperties = function defineProperties(O, Properties) {\n\t  anObject(O);\n\t  var properties = toIndexedObject(Properties);\n\t  var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));\n\t  $forEach(keys, function (key) {\n\t    if (!descriptors || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);\n\t  });\n\t  return O;\n\t};\n\n\tvar $create = function create(O, Properties) {\n\t  return Properties === undefined ? objectCreate(O) : $defineProperties(objectCreate(O), Properties);\n\t};\n\n\tvar $propertyIsEnumerable = function propertyIsEnumerable(V) {\n\t  var P = toPrimitive(V, true);\n\t  var enumerable = nativePropertyIsEnumerable$1.call(this, P);\n\t  if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;\n\t  return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;\n\t};\n\n\tvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {\n\t  var it = toIndexedObject(O);\n\t  var key = toPrimitive(P, true);\n\t  if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;\n\t  var descriptor = nativeGetOwnPropertyDescriptor$1(it, key);\n\n\t  if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {\n\t    descriptor.enumerable = true;\n\t  }\n\n\t  return descriptor;\n\t};\n\n\tvar $getOwnPropertyNames = function getOwnPropertyNames(O) {\n\t  var names = nativeGetOwnPropertyNames$1(toIndexedObject(O));\n\t  var result = [];\n\t  $forEach(names, function (key) {\n\t    if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);\n\t  });\n\t  return result;\n\t};\n\n\tvar $getOwnPropertySymbols = function getOwnPropertySymbols(O) {\n\t  var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;\n\t  var names = nativeGetOwnPropertyNames$1(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));\n\t  var result = [];\n\t  $forEach(names, function (key) {\n\t    if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) {\n\t      result.push(AllSymbols[key]);\n\t    }\n\t  });\n\t  return result;\n\t}; // `Symbol` constructor\n\t// https://tc39.github.io/ecma262/#sec-symbol-constructor\n\n\n\tif (!nativeSymbol) {\n\t  $Symbol = function Symbol() {\n\t    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');\n\t    var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);\n\t    var tag = uid(description);\n\n\t    var setter = function setter(value) {\n\t      if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);\n\t      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n\t      setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));\n\t    };\n\n\t    if (descriptors && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, {\n\t      configurable: true,\n\t      set: setter\n\t    });\n\t    return wrap(tag, description);\n\t  };\n\n\t  redefine($Symbol[PROTOTYPE$1], 'toString', function toString() {\n\t    return getInternalState(this).tag;\n\t  });\n\t  redefine($Symbol, 'withoutSetter', function (description) {\n\t    return wrap(uid(description), description);\n\t  });\n\t  objectPropertyIsEnumerable.f = $propertyIsEnumerable;\n\t  objectDefineProperty.f = $defineProperty;\n\t  objectGetOwnPropertyDescriptor.f = $getOwnPropertyDescriptor;\n\t  objectGetOwnPropertyNames.f = objectGetOwnPropertyNamesExternal.f = $getOwnPropertyNames;\n\t  objectGetOwnPropertySymbols.f = $getOwnPropertySymbols;\n\n\t  wellKnownSymbolWrapped.f = function (name) {\n\t    return wrap(wellKnownSymbol(name), name);\n\t  };\n\n\t  if (descriptors) {\n\t    // https://github.com/tc39/proposal-Symbol-description\n\t    nativeDefineProperty$1($Symbol[PROTOTYPE$1], 'description', {\n\t      configurable: true,\n\t      get: function description() {\n\t        return getInternalState(this).description;\n\t      }\n\t    });\n\n\t    if (!isPure) {\n\t      redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, {\n\t        unsafe: true\n\t      });\n\t    }\n\t  }\n\t}\n\n\t_export({\n\t  global: true,\n\t  wrap: true,\n\t  forced: !nativeSymbol,\n\t  sham: !nativeSymbol\n\t}, {\n\t  Symbol: $Symbol\n\t});\n\t$forEach(objectKeys(WellKnownSymbolsStore$1), function (name) {\n\t  defineWellKnownSymbol(name);\n\t});\n\t_export({\n\t  target: SYMBOL,\n\t  stat: true,\n\t  forced: !nativeSymbol\n\t}, {\n\t  // `Symbol.for` method\n\t  // https://tc39.github.io/ecma262/#sec-symbol.for\n\t  'for': function _for(key) {\n\t    var string = String(key);\n\t    if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];\n\t    var symbol = $Symbol(string);\n\t    StringToSymbolRegistry[string] = symbol;\n\t    SymbolToStringRegistry[symbol] = string;\n\t    return symbol;\n\t  },\n\t  // `Symbol.keyFor` method\n\t  // https://tc39.github.io/ecma262/#sec-symbol.keyfor\n\t  keyFor: function keyFor(sym) {\n\t    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');\n\t    if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];\n\t  },\n\t  useSetter: function useSetter() {\n\t    USE_SETTER = true;\n\t  },\n\t  useSimple: function useSimple() {\n\t    USE_SETTER = false;\n\t  }\n\t});\n\t_export({\n\t  target: 'Object',\n\t  stat: true,\n\t  forced: !nativeSymbol,\n\t  sham: !descriptors\n\t}, {\n\t  // `Object.create` method\n\t  // https://tc39.github.io/ecma262/#sec-object.create\n\t  create: $create,\n\t  // `Object.defineProperty` method\n\t  // https://tc39.github.io/ecma262/#sec-object.defineproperty\n\t  defineProperty: $defineProperty,\n\t  // `Object.defineProperties` method\n\t  // https://tc39.github.io/ecma262/#sec-object.defineproperties\n\t  defineProperties: $defineProperties,\n\t  // `Object.getOwnPropertyDescriptor` method\n\t  // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n\t  getOwnPropertyDescriptor: $getOwnPropertyDescriptor\n\t});\n\t_export({\n\t  target: 'Object',\n\t  stat: true,\n\t  forced: !nativeSymbol\n\t}, {\n\t  // `Object.getOwnPropertyNames` method\n\t  // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n\t  getOwnPropertyNames: $getOwnPropertyNames,\n\t  // `Object.getOwnPropertySymbols` method\n\t  // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols\n\t  getOwnPropertySymbols: $getOwnPropertySymbols\n\t}); // Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n\t// https://bugs.chromium.org/p/v8/issues/detail?id=3443\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true,\n\t  forced: fails(function () {\n\t    objectGetOwnPropertySymbols.f(1);\n\t  })\n\t}, {\n\t  getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n\t    return objectGetOwnPropertySymbols.f(toObject(it));\n\t  }\n\t}); // `JSON.stringify` method behavior with symbols\n\t// https://tc39.github.io/ecma262/#sec-json.stringify\n\n\tif ($stringify) {\n\t  var FORCED_JSON_STRINGIFY = !nativeSymbol || fails(function () {\n\t    var symbol = $Symbol(); // MS Edge converts symbol values to JSON as {}\n\n\t    return $stringify([symbol]) != '[null]' // WebKit converts symbol values to JSON as null\n\t    || $stringify({\n\t      a: symbol\n\t    }) != '{}' // V8 throws on boxed symbols\n\t    || $stringify(Object(symbol)) != '{}';\n\t  });\n\t  _export({\n\t    target: 'JSON',\n\t    stat: true,\n\t    forced: FORCED_JSON_STRINGIFY\n\t  }, {\n\t    // eslint-disable-next-line no-unused-vars\n\t    stringify: function stringify(it, replacer, space) {\n\t      var args = [it];\n\t      var index = 1;\n\t      var $replacer;\n\n\t      while (arguments.length > index) {\n\t        args.push(arguments[index++]);\n\t      }\n\n\t      $replacer = replacer;\n\t      if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n\n\t      if (!isArray(replacer)) replacer = function replacer(key, value) {\n\t        if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n\t        if (!isSymbol(value)) return value;\n\t      };\n\t      args[1] = replacer;\n\t      return $stringify.apply(null, args);\n\t    }\n\t  });\n\t} // `Symbol.prototype[@@toPrimitive]` method\n\t// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive\n\n\n\tif (!$Symbol[PROTOTYPE$1][TO_PRIMITIVE]) {\n\t  createNonEnumerableProperty($Symbol[PROTOTYPE$1], TO_PRIMITIVE, $Symbol[PROTOTYPE$1].valueOf);\n\t} // `Symbol.prototype[@@toStringTag]` property\n\t// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag\n\n\n\tsetToStringTag($Symbol, SYMBOL);\n\thiddenKeys[HIDDEN] = true;\n\tvar es_symbol = {};\n\n\t// https://tc39.github.io/ecma262/#sec-symbol.asynciterator\n\n\tdefineWellKnownSymbol('asyncIterator');\n\tvar es_symbol_asyncIterator = {};\n\n\t// https://tc39.github.io/ecma262/#sec-symbol.prototype.description\n\n\t'use strict';\n\n\tvar defineProperty$2 = objectDefineProperty.f;\n\tvar NativeSymbol = global_1.Symbol;\n\n\tif (descriptors && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) || // Safari 12 bug\n\tNativeSymbol().description !== undefined)) {\n\t  var EmptyStringDescriptionStore = {}; // wrap Symbol constructor for correct work with undefined description\n\n\t  var SymbolWrapper = function Symbol() {\n\t    var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);\n\t    var result = this instanceof SymbolWrapper ? new NativeSymbol(description) // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'\n\t    : description === undefined ? NativeSymbol() : NativeSymbol(description);\n\t    if (description === '') EmptyStringDescriptionStore[result] = true;\n\t    return result;\n\t  };\n\n\t  copyConstructorProperties(SymbolWrapper, NativeSymbol);\n\t  var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;\n\t  symbolPrototype.constructor = SymbolWrapper;\n\t  var symbolToString = symbolPrototype.toString;\n\t  var native = String(NativeSymbol('test')) == 'Symbol(test)';\n\t  var regexp = /^Symbol\\((.*)\\)[^)]+$/;\n\t  defineProperty$2(symbolPrototype, 'description', {\n\t    configurable: true,\n\t    get: function description() {\n\t      var symbol = isObject(this) ? this.valueOf() : this;\n\t      var string = symbolToString.call(symbol);\n\t      if (has(EmptyStringDescriptionStore, symbol)) return '';\n\t      var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1');\n\t      return desc === '' ? undefined : desc;\n\t    }\n\t  });\n\t  _export({\n\t    global: true,\n\t    forced: true\n\t  }, {\n\t    Symbol: SymbolWrapper\n\t  });\n\t}\n\n\tvar es_symbol_description = {};\n\n\t// https://tc39.github.io/ecma262/#sec-symbol.hasinstance\n\n\tdefineWellKnownSymbol('hasInstance');\n\tvar es_symbol_hasInstance = {};\n\n\t// https://tc39.github.io/ecma262/#sec-symbol.isconcatspreadable\n\n\tdefineWellKnownSymbol('isConcatSpreadable');\n\tvar es_symbol_isConcatSpreadable = {};\n\n\t// https://tc39.github.io/ecma262/#sec-symbol.iterator\n\n\tdefineWellKnownSymbol('iterator');\n\tvar es_symbol_iterator = {};\n\n\t// https://tc39.github.io/ecma262/#sec-symbol.match\n\n\tdefineWellKnownSymbol('match');\n\tvar es_symbol_match = {};\n\n\tdefineWellKnownSymbol('matchAll');\n\tvar es_symbol_matchAll = {};\n\n\t// https://tc39.github.io/ecma262/#sec-symbol.replace\n\n\tdefineWellKnownSymbol('replace');\n\tvar es_symbol_replace = {};\n\n\t// https://tc39.github.io/ecma262/#sec-symbol.search\n\n\tdefineWellKnownSymbol('search');\n\tvar es_symbol_search = {};\n\n\t// https://tc39.github.io/ecma262/#sec-symbol.species\n\n\tdefineWellKnownSymbol('species');\n\tvar es_symbol_species = {};\n\n\t// https://tc39.github.io/ecma262/#sec-symbol.split\n\n\tdefineWellKnownSymbol('split');\n\tvar es_symbol_split = {};\n\n\t// https://tc39.github.io/ecma262/#sec-symbol.toprimitive\n\n\tdefineWellKnownSymbol('toPrimitive');\n\tvar es_symbol_toPrimitive = {};\n\n\t// https://tc39.github.io/ecma262/#sec-symbol.tostringtag\n\n\tdefineWellKnownSymbol('toStringTag');\n\tvar es_symbol_toStringTag = {};\n\n\t// https://tc39.github.io/ecma262/#sec-symbol.unscopables\n\n\tdefineWellKnownSymbol('unscopables');\n\tvar es_symbol_unscopables = {};\n\n\t'use strict';\n\n\tvar nativeAssign = Object.assign;\n\tvar defineProperty$3 = Object.defineProperty; // `Object.assign` method\n\t// https://tc39.github.io/ecma262/#sec-object.assign\n\n\tvar objectAssign = !nativeAssign || fails(function () {\n\t  // should have correct order of operations (Edge bug)\n\t  if (descriptors && nativeAssign({\n\t    b: 1\n\t  }, nativeAssign(defineProperty$3({}, 'a', {\n\t    enumerable: true,\n\t    get: function get() {\n\t      defineProperty$3(this, 'b', {\n\t        value: 3,\n\t        enumerable: false\n\t      });\n\t    }\n\t  }), {\n\t    b: 2\n\t  })).b !== 1) return true; // should work with symbols and should have deterministic property order (V8 bug)\n\n\t  var A = {};\n\t  var B = {}; // eslint-disable-next-line no-undef\n\n\t  var symbol = Symbol();\n\t  var alphabet = 'abcdefghijklmnopqrst';\n\t  A[symbol] = 7;\n\t  alphabet.split('').forEach(function (chr) {\n\t    B[chr] = chr;\n\t  });\n\t  return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n\t}) ? function assign(target, source) {\n\t  // eslint-disable-line no-unused-vars\n\t  var T = toObject(target);\n\t  var argumentsLength = arguments.length;\n\t  var index = 1;\n\t  var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\n\t  var propertyIsEnumerable = objectPropertyIsEnumerable.f;\n\n\t  while (argumentsLength > index) {\n\t    var S = indexedObject(arguments[index++]);\n\t    var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n\t    var length = keys.length;\n\t    var j = 0;\n\t    var key;\n\n\t    while (length > j) {\n\t      key = keys[j++];\n\t      if (!descriptors || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n\t    }\n\t  }\n\n\t  return T;\n\t} : nativeAssign;\n\n\t// https://tc39.github.io/ecma262/#sec-object.assign\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true,\n\t  forced: Object.assign !== objectAssign\n\t}, {\n\t  assign: objectAssign\n\t});\n\tvar es_object_assign = {};\n\n\t// https://tc39.github.io/ecma262/#sec-object.create\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true,\n\t  sham: !descriptors\n\t}, {\n\t  create: objectCreate\n\t});\n\tvar es_object_create = {};\n\n\t// https://tc39.github.io/ecma262/#sec-object.defineproperty\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true,\n\t  forced: !descriptors,\n\t  sham: !descriptors\n\t}, {\n\t  defineProperty: objectDefineProperty.f\n\t});\n\tvar es_object_defineProperty = {};\n\n\t// https://tc39.github.io/ecma262/#sec-object.defineproperties\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true,\n\t  forced: !descriptors,\n\t  sham: !descriptors\n\t}, {\n\t  defineProperties: objectDefineProperties\n\t});\n\tvar es_object_defineProperties = {};\n\n\tvar propertyIsEnumerable = objectPropertyIsEnumerable.f; // `Object.{ entries, values }` methods implementation\n\n\tvar createMethod$2 = function createMethod(TO_ENTRIES) {\n\t  return function (it) {\n\t    var O = toIndexedObject(it);\n\t    var keys = objectKeys(O);\n\t    var length = keys.length;\n\t    var i = 0;\n\t    var result = [];\n\t    var key;\n\n\t    while (length > i) {\n\t      key = keys[i++];\n\n\t      if (!descriptors || propertyIsEnumerable.call(O, key)) {\n\t        result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n\t      }\n\t    }\n\n\t    return result;\n\t  };\n\t};\n\n\tvar objectToArray = {\n\t  // `Object.entries` method\n\t  // https://tc39.github.io/ecma262/#sec-object.entries\n\t  entries: createMethod$2(true),\n\t  // `Object.values` method\n\t  // https://tc39.github.io/ecma262/#sec-object.values\n\t  values: createMethod$2(false)\n\t};\n\tvar objectToArray_1 = objectToArray.entries;\n\tvar objectToArray_2 = objectToArray.values;\n\n\tvar $entries = objectToArray.entries; // `Object.entries` method\n\t// https://tc39.github.io/ecma262/#sec-object.entries\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true\n\t}, {\n\t  entries: function entries(O) {\n\t    return $entries(O);\n\t  }\n\t});\n\tvar es_object_entries = {};\n\n\tvar freezing = !fails(function () {\n\t  return Object.isExtensible(Object.preventExtensions({}));\n\t});\n\n\tvar internalMetadata = createCommonjsModule(function (module) {\n\t  var defineProperty = objectDefineProperty.f;\n\t  var METADATA = uid('meta');\n\t  var id = 0;\n\n\t  var isExtensible = Object.isExtensible || function () {\n\t    return true;\n\t  };\n\n\t  var setMetadata = function setMetadata(it) {\n\t    defineProperty(it, METADATA, {\n\t      value: {\n\t        objectID: 'O' + ++id,\n\t        // object ID\n\t        weakData: {} // weak collections IDs\n\n\t      }\n\t    });\n\t  };\n\n\t  var fastKey = function fastKey(it, create) {\n\t    // return a primitive with prefix\n\t    if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n\n\t    if (!has(it, METADATA)) {\n\t      // can't set metadata to uncaught frozen object\n\t      if (!isExtensible(it)) return 'F'; // not necessary to add metadata\n\n\t      if (!create) return 'E'; // add missing metadata\n\n\t      setMetadata(it); // return object ID\n\t    }\n\n\t    return it[METADATA].objectID;\n\t  };\n\n\t  var getWeakData = function getWeakData(it, create) {\n\t    if (!has(it, METADATA)) {\n\t      // can't set metadata to uncaught frozen object\n\t      if (!isExtensible(it)) return true; // not necessary to add metadata\n\n\t      if (!create) return false; // add missing metadata\n\n\t      setMetadata(it); // return the store of weak collections IDs\n\t    }\n\n\t    return it[METADATA].weakData;\n\t  }; // add metadata on freeze-family methods calling\n\n\n\t  var onFreeze = function onFreeze(it) {\n\t    if (freezing && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);\n\t    return it;\n\t  };\n\n\t  var meta = module.exports = {\n\t    REQUIRED: false,\n\t    fastKey: fastKey,\n\t    getWeakData: getWeakData,\n\t    onFreeze: onFreeze\n\t  };\n\t  hiddenKeys[METADATA] = true;\n\t});\n\tvar internalMetadata_1 = internalMetadata.REQUIRED;\n\tvar internalMetadata_2 = internalMetadata.fastKey;\n\tvar internalMetadata_3 = internalMetadata.getWeakData;\n\tvar internalMetadata_4 = internalMetadata.onFreeze;\n\n\tvar onFreeze = internalMetadata.onFreeze;\n\tvar nativeFreeze = Object.freeze;\n\tvar FAILS_ON_PRIMITIVES = fails(function () {\n\t  nativeFreeze(1);\n\t}); // `Object.freeze` method\n\t// https://tc39.github.io/ecma262/#sec-object.freeze\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true,\n\t  forced: FAILS_ON_PRIMITIVES,\n\t  sham: !freezing\n\t}, {\n\t  freeze: function freeze(it) {\n\t    return nativeFreeze && isObject(it) ? nativeFreeze(onFreeze(it)) : it;\n\t  }\n\t});\n\tvar es_object_freeze = {};\n\n\tvar iterators = {};\n\n\tvar ITERATOR = wellKnownSymbol('iterator');\n\tvar ArrayPrototype = Array.prototype; // check on default Array iterator\n\n\tvar isArrayIteratorMethod = function isArrayIteratorMethod(it) {\n\t  return it !== undefined && (iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n\t};\n\n\tvar TO_STRING_TAG$1 = wellKnownSymbol('toStringTag');\n\tvar test = {};\n\ttest[TO_STRING_TAG$1] = 'z';\n\tvar toStringTagSupport = String(test) === '[object z]';\n\n\tvar TO_STRING_TAG$2 = wellKnownSymbol('toStringTag'); // ES3 wrong here\n\n\tvar CORRECT_ARGUMENTS = classofRaw(function () {\n\t  return arguments;\n\t}()) == 'Arguments'; // fallback for IE11 Script Access Denied error\n\n\tvar tryGet = function tryGet(it, key) {\n\t  try {\n\t    return it[key];\n\t  } catch (error) {\n\t    /* empty */\n\t  }\n\t}; // getting tag from ES6+ `Object.prototype.toString`\n\n\n\tvar classof = toStringTagSupport ? classofRaw : function (it) {\n\t  var O, tag, result;\n\t  return it === undefined ? 'Undefined' : it === null ? 'Null' // @@toStringTag case\n\t  : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG$2)) == 'string' ? tag // builtinTag case\n\t  : CORRECT_ARGUMENTS ? classofRaw(O) // ES3 arguments fallback\n\t  : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n\t};\n\n\tvar ITERATOR$1 = wellKnownSymbol('iterator');\n\n\tvar getIteratorMethod = function getIteratorMethod(it) {\n\t  if (it != undefined) return it[ITERATOR$1] || it['@@iterator'] || iterators[classof(it)];\n\t};\n\n\tvar callWithSafeIterationClosing = function callWithSafeIterationClosing(iterator, fn, value, ENTRIES) {\n\t  try {\n\t    return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value); // 7.4.6 IteratorClose(iterator, completion)\n\t  } catch (error) {\n\t    var returnMethod = iterator['return'];\n\t    if (returnMethod !== undefined) anObject(returnMethod.call(iterator));\n\t    throw error;\n\t  }\n\t};\n\n\tvar iterate_1 = createCommonjsModule(function (module) {\n\t  var Result = function Result(stopped, result) {\n\t    this.stopped = stopped;\n\t    this.result = result;\n\t  };\n\n\t  var iterate = module.exports = function (iterable, fn, that, AS_ENTRIES, IS_ITERATOR) {\n\t    var boundFunction = functionBindContext(fn, that, AS_ENTRIES ? 2 : 1);\n\t    var iterator, iterFn, index, length, result, next, step;\n\n\t    if (IS_ITERATOR) {\n\t      iterator = iterable;\n\t    } else {\n\t      iterFn = getIteratorMethod(iterable);\n\t      if (typeof iterFn != 'function') throw TypeError('Target is not iterable'); // optimisation for array iterators\n\n\t      if (isArrayIteratorMethod(iterFn)) {\n\t        for (index = 0, length = toLength(iterable.length); length > index; index++) {\n\t          result = AS_ENTRIES ? boundFunction(anObject(step = iterable[index])[0], step[1]) : boundFunction(iterable[index]);\n\t          if (result && result instanceof Result) return result;\n\t        }\n\n\t        return new Result(false);\n\t      }\n\n\t      iterator = iterFn.call(iterable);\n\t    }\n\n\t    next = iterator.next;\n\n\t    while (!(step = next.call(iterator)).done) {\n\t      result = callWithSafeIterationClosing(iterator, boundFunction, step.value, AS_ENTRIES);\n\t      if (typeof result == 'object' && result && result instanceof Result) return result;\n\t    }\n\n\t    return new Result(false);\n\t  };\n\n\t  iterate.stop = function (result) {\n\t    return new Result(true, result);\n\t  };\n\t});\n\n\t'use strict';\n\n\tvar createProperty = function createProperty(object, key, value) {\n\t  var propertyKey = toPrimitive(key);\n\t  if (propertyKey in object) objectDefineProperty.f(object, propertyKey, createPropertyDescriptor(0, value));else object[propertyKey] = value;\n\t};\n\n\t// https://github.com/tc39/proposal-object-from-entries\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true\n\t}, {\n\t  fromEntries: function fromEntries(iterable) {\n\t    var obj = {};\n\t    iterate_1(iterable, function (k, v) {\n\t      createProperty(obj, k, v);\n\t    }, undefined, true);\n\t    return obj;\n\t  }\n\t});\n\tvar es_object_fromEntries = {};\n\n\tvar nativeGetOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f;\n\tvar FAILS_ON_PRIMITIVES$1 = fails(function () {\n\t  nativeGetOwnPropertyDescriptor$2(1);\n\t});\n\tvar FORCED = !descriptors || FAILS_ON_PRIMITIVES$1; // `Object.getOwnPropertyDescriptor` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true,\n\t  forced: FORCED,\n\t  sham: !descriptors\n\t}, {\n\t  getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {\n\t    return nativeGetOwnPropertyDescriptor$2(toIndexedObject(it), key);\n\t  }\n\t});\n\tvar es_object_getOwnPropertyDescriptor = {};\n\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true,\n\t  sham: !descriptors\n\t}, {\n\t  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n\t    var O = toIndexedObject(object);\n\t    var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\n\t    var keys = ownKeys(O);\n\t    var result = {};\n\t    var index = 0;\n\t    var key, descriptor;\n\n\t    while (keys.length > index) {\n\t      descriptor = getOwnPropertyDescriptor(O, key = keys[index++]);\n\t      if (descriptor !== undefined) createProperty(result, key, descriptor);\n\t    }\n\n\t    return result;\n\t  }\n\t});\n\tvar es_object_getOwnPropertyDescriptors = {};\n\n\tvar nativeGetOwnPropertyNames$2 = objectGetOwnPropertyNamesExternal.f;\n\tvar FAILS_ON_PRIMITIVES$2 = fails(function () {\n\t  return !Object.getOwnPropertyNames(1);\n\t}); // `Object.getOwnPropertyNames` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true,\n\t  forced: FAILS_ON_PRIMITIVES$2\n\t}, {\n\t  getOwnPropertyNames: nativeGetOwnPropertyNames$2\n\t});\n\tvar es_object_getOwnPropertyNames = {};\n\n\tvar correctPrototypeGetter = !fails(function () {\n\t  function F() {\n\t    /* empty */\n\t  }\n\n\t  F.prototype.constructor = null;\n\t  return Object.getPrototypeOf(new F()) !== F.prototype;\n\t});\n\n\tvar IE_PROTO$1 = sharedKey('IE_PROTO');\n\tvar ObjectPrototype$1 = Object.prototype; // `Object.getPrototypeOf` method\n\t// https://tc39.github.io/ecma262/#sec-object.getprototypeof\n\n\tvar objectGetPrototypeOf = correctPrototypeGetter ? Object.getPrototypeOf : function (O) {\n\t  O = toObject(O);\n\t  if (has(O, IE_PROTO$1)) return O[IE_PROTO$1];\n\n\t  if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n\t    return O.constructor.prototype;\n\t  }\n\n\t  return O instanceof Object ? ObjectPrototype$1 : null;\n\t};\n\n\tvar FAILS_ON_PRIMITIVES$3 = fails(function () {\n\t  objectGetPrototypeOf(1);\n\t}); // `Object.getPrototypeOf` method\n\t// https://tc39.github.io/ecma262/#sec-object.getprototypeof\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true,\n\t  forced: FAILS_ON_PRIMITIVES$3,\n\t  sham: !correctPrototypeGetter\n\t}, {\n\t  getPrototypeOf: function getPrototypeOf(it) {\n\t    return objectGetPrototypeOf(toObject(it));\n\t  }\n\t});\n\tvar es_object_getPrototypeOf = {};\n\n\t// `SameValue` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-samevalue\n\tvar sameValue = Object.is || function is(x, y) {\n\t  // eslint-disable-next-line no-self-compare\n\t  return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n\t};\n\n\t// https://tc39.github.io/ecma262/#sec-object.is\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true\n\t}, {\n\t  is: sameValue\n\t});\n\tvar es_object_is = {};\n\n\tvar nativeIsExtensible = Object.isExtensible;\n\tvar FAILS_ON_PRIMITIVES$4 = fails(function () {\n\t  nativeIsExtensible(1);\n\t}); // `Object.isExtensible` method\n\t// https://tc39.github.io/ecma262/#sec-object.isextensible\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true,\n\t  forced: FAILS_ON_PRIMITIVES$4\n\t}, {\n\t  isExtensible: function isExtensible(it) {\n\t    return isObject(it) ? nativeIsExtensible ? nativeIsExtensible(it) : true : false;\n\t  }\n\t});\n\tvar es_object_isExtensible = {};\n\n\tvar nativeIsFrozen = Object.isFrozen;\n\tvar FAILS_ON_PRIMITIVES$5 = fails(function () {\n\t  nativeIsFrozen(1);\n\t}); // `Object.isFrozen` method\n\t// https://tc39.github.io/ecma262/#sec-object.isfrozen\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true,\n\t  forced: FAILS_ON_PRIMITIVES$5\n\t}, {\n\t  isFrozen: function isFrozen(it) {\n\t    return isObject(it) ? nativeIsFrozen ? nativeIsFrozen(it) : false : true;\n\t  }\n\t});\n\tvar es_object_isFrozen = {};\n\n\tvar nativeIsSealed = Object.isSealed;\n\tvar FAILS_ON_PRIMITIVES$6 = fails(function () {\n\t  nativeIsSealed(1);\n\t}); // `Object.isSealed` method\n\t// https://tc39.github.io/ecma262/#sec-object.issealed\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true,\n\t  forced: FAILS_ON_PRIMITIVES$6\n\t}, {\n\t  isSealed: function isSealed(it) {\n\t    return isObject(it) ? nativeIsSealed ? nativeIsSealed(it) : false : true;\n\t  }\n\t});\n\tvar es_object_isSealed = {};\n\n\tvar FAILS_ON_PRIMITIVES$7 = fails(function () {\n\t  objectKeys(1);\n\t}); // `Object.keys` method\n\t// https://tc39.github.io/ecma262/#sec-object.keys\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true,\n\t  forced: FAILS_ON_PRIMITIVES$7\n\t}, {\n\t  keys: function keys(it) {\n\t    return objectKeys(toObject(it));\n\t  }\n\t});\n\tvar es_object_keys = {};\n\n\tvar onFreeze$1 = internalMetadata.onFreeze;\n\tvar nativePreventExtensions = Object.preventExtensions;\n\tvar FAILS_ON_PRIMITIVES$8 = fails(function () {\n\t  nativePreventExtensions(1);\n\t}); // `Object.preventExtensions` method\n\t// https://tc39.github.io/ecma262/#sec-object.preventextensions\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true,\n\t  forced: FAILS_ON_PRIMITIVES$8,\n\t  sham: !freezing\n\t}, {\n\t  preventExtensions: function preventExtensions(it) {\n\t    return nativePreventExtensions && isObject(it) ? nativePreventExtensions(onFreeze$1(it)) : it;\n\t  }\n\t});\n\tvar es_object_preventExtensions = {};\n\n\tvar onFreeze$2 = internalMetadata.onFreeze;\n\tvar nativeSeal = Object.seal;\n\tvar FAILS_ON_PRIMITIVES$9 = fails(function () {\n\t  nativeSeal(1);\n\t}); // `Object.seal` method\n\t// https://tc39.github.io/ecma262/#sec-object.seal\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true,\n\t  forced: FAILS_ON_PRIMITIVES$9,\n\t  sham: !freezing\n\t}, {\n\t  seal: function seal(it) {\n\t    return nativeSeal && isObject(it) ? nativeSeal(onFreeze$2(it)) : it;\n\t  }\n\t});\n\tvar es_object_seal = {};\n\n\tvar aPossiblePrototype = function aPossiblePrototype(it) {\n\t  if (!isObject(it) && it !== null) {\n\t    throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n\t  }\n\n\t  return it;\n\t};\n\n\t// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n\t// Works with __proto__ only. Old v8 can't work with null proto objects.\n\n\t/* eslint-disable no-proto */\n\n\tvar objectSetPrototypeOf = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n\t  var CORRECT_SETTER = false;\n\t  var test = {};\n\t  var setter;\n\n\t  try {\n\t    setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n\t    setter.call(test, []);\n\t    CORRECT_SETTER = test instanceof Array;\n\t  } catch (error) {\n\t    /* empty */\n\t  }\n\n\t  return function setPrototypeOf(O, proto) {\n\t    anObject(O);\n\t    aPossiblePrototype(proto);\n\t    if (CORRECT_SETTER) setter.call(O, proto);else O.__proto__ = proto;\n\t    return O;\n\t  };\n\t}() : undefined);\n\n\t// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true\n\t}, {\n\t  setPrototypeOf: objectSetPrototypeOf\n\t});\n\tvar es_object_setPrototypeOf = {};\n\n\tvar $values = objectToArray.values; // `Object.values` method\n\t// https://tc39.github.io/ecma262/#sec-object.values\n\n\t_export({\n\t  target: 'Object',\n\t  stat: true\n\t}, {\n\t  values: function values(O) {\n\t    return $values(O);\n\t  }\n\t});\n\tvar es_object_values = {};\n\n\t'use strict'; // `Object.prototype.toString` method implementation\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\n\n\n\tvar objectToString = toStringTagSupport ? {}.toString : function toString() {\n\t  return '[object ' + classof(this) + ']';\n\t};\n\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\n\n\tif (!toStringTagSupport) {\n\t  redefine(Object.prototype, 'toString', objectToString, {\n\t    unsafe: true\n\t  });\n\t}\n\n\tvar es_object_toString = {};\n\n\t'use strict'; // Forced replacement object prototype accessors methods\n\n\n\tvar objectPrototypeAccessorsForced = isPure || !fails(function () {\n\t  var key = Math.random(); // In FF throws only define methods\n\t  // eslint-disable-next-line no-undef, no-useless-call\n\n\t  __defineSetter__.call(null, key, function () {\n\t    /* empty */\n\t  });\n\n\t  delete global_1[key];\n\t});\n\n\t'use strict'; // `Object.prototype.__defineGetter__` method\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.__defineGetter__\n\n\n\tif (descriptors) {\n\t  _export({\n\t    target: 'Object',\n\t    proto: true,\n\t    forced: objectPrototypeAccessorsForced\n\t  }, {\n\t    __defineGetter__: function __defineGetter__(P, getter) {\n\t      objectDefineProperty.f(toObject(this), P, {\n\t        get: aFunction$1(getter),\n\t        enumerable: true,\n\t        configurable: true\n\t      });\n\t    }\n\t  });\n\t}\n\n\tvar es_object_defineGetter = {};\n\n\t'use strict'; // `Object.prototype.__defineSetter__` method\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.__defineSetter__\n\n\n\tif (descriptors) {\n\t  _export({\n\t    target: 'Object',\n\t    proto: true,\n\t    forced: objectPrototypeAccessorsForced\n\t  }, {\n\t    __defineSetter__: function __defineSetter__(P, setter) {\n\t      objectDefineProperty.f(toObject(this), P, {\n\t        set: aFunction$1(setter),\n\t        enumerable: true,\n\t        configurable: true\n\t      });\n\t    }\n\t  });\n\t}\n\n\tvar es_object_defineSetter = {};\n\n\t'use strict';\n\n\tvar getOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f; // `Object.prototype.__lookupGetter__` method\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.__lookupGetter__\n\n\tif (descriptors) {\n\t  _export({\n\t    target: 'Object',\n\t    proto: true,\n\t    forced: objectPrototypeAccessorsForced\n\t  }, {\n\t    __lookupGetter__: function __lookupGetter__(P) {\n\t      var O = toObject(this);\n\t      var key = toPrimitive(P, true);\n\t      var desc;\n\n\t      do {\n\t        if (desc = getOwnPropertyDescriptor$2(O, key)) return desc.get;\n\t      } while (O = objectGetPrototypeOf(O));\n\t    }\n\t  });\n\t}\n\n\tvar es_object_lookupGetter = {};\n\n\t'use strict';\n\n\tvar getOwnPropertyDescriptor$3 = objectGetOwnPropertyDescriptor.f; // `Object.prototype.__lookupSetter__` method\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.__lookupSetter__\n\n\tif (descriptors) {\n\t  _export({\n\t    target: 'Object',\n\t    proto: true,\n\t    forced: objectPrototypeAccessorsForced\n\t  }, {\n\t    __lookupSetter__: function __lookupSetter__(P) {\n\t      var O = toObject(this);\n\t      var key = toPrimitive(P, true);\n\t      var desc;\n\n\t      do {\n\t        if (desc = getOwnPropertyDescriptor$3(O, key)) return desc.set;\n\t      } while (O = objectGetPrototypeOf(O));\n\t    }\n\t  });\n\t}\n\n\tvar es_object_lookupSetter = {};\n\n\t'use strict';\n\n\tvar slice = [].slice;\n\tvar factories = {};\n\n\tvar construct = function construct(C, argsLength, args) {\n\t  if (!(argsLength in factories)) {\n\t    for (var list = [], i = 0; i < argsLength; i++) {\n\t      list[i] = 'a[' + i + ']';\n\t    } // eslint-disable-next-line no-new-func\n\n\n\t    factories[argsLength] = Function('C,a', 'return new C(' + list.join(',') + ')');\n\t  }\n\n\t  return factories[argsLength](C, args);\n\t}; // `Function.prototype.bind` method implementation\n\t// https://tc39.github.io/ecma262/#sec-function.prototype.bind\n\n\n\tvar functionBind = Function.bind || function bind(that\n\t/* , ...args */\n\t) {\n\t  var fn = aFunction$1(this);\n\t  var partArgs = slice.call(arguments, 1);\n\n\t  var boundFunction = function bound()\n\t  /* args... */\n\t  {\n\t    var args = partArgs.concat(slice.call(arguments));\n\t    return this instanceof boundFunction ? construct(fn, args.length, args) : fn.apply(that, args);\n\t  };\n\n\t  if (isObject(fn.prototype)) boundFunction.prototype = fn.prototype;\n\t  return boundFunction;\n\t};\n\n\t// https://tc39.github.io/ecma262/#sec-function.prototype.bind\n\n\t_export({\n\t  target: 'Function',\n\t  proto: true\n\t}, {\n\t  bind: functionBind\n\t});\n\tvar es_function_bind = {};\n\n\tvar defineProperty$4 = objectDefineProperty.f;\n\tvar FunctionPrototype = Function.prototype;\n\tvar FunctionPrototypeToString = FunctionPrototype.toString;\n\tvar nameRE = /^\\s*function ([^ (]*)/;\n\tvar NAME = 'name'; // Function instances `.name` property\n\t// https://tc39.github.io/ecma262/#sec-function-instances-name\n\n\tif (descriptors && !(NAME in FunctionPrototype)) {\n\t  defineProperty$4(FunctionPrototype, NAME, {\n\t    configurable: true,\n\t    get: function get() {\n\t      try {\n\t        return FunctionPrototypeToString.call(this).match(nameRE)[1];\n\t      } catch (error) {\n\t        return '';\n\t      }\n\t    }\n\t  });\n\t}\n\n\tvar es_function_name = {};\n\n\t'use strict';\n\n\tvar HAS_INSTANCE = wellKnownSymbol('hasInstance');\n\tvar FunctionPrototype$1 = Function.prototype; // `Function.prototype[@@hasInstance]` method\n\t// https://tc39.github.io/ecma262/#sec-function.prototype-@@hasinstance\n\n\tif (!(HAS_INSTANCE in FunctionPrototype$1)) {\n\t  objectDefineProperty.f(FunctionPrototype$1, HAS_INSTANCE, {\n\t    value: function value(O) {\n\t      if (typeof this != 'function' || !isObject(O)) return false;\n\t      if (!isObject(this.prototype)) return O instanceof this; // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:\n\n\t      while (O = objectGetPrototypeOf(O)) {\n\t        if (this.prototype === O) return true;\n\t      }\n\n\t      return false;\n\t    }\n\t  });\n\t}\n\n\tvar es_function_hasInstance = {};\n\n\t// https://github.com/tc39/proposal-global\n\n\t_export({\n\t  global: true\n\t}, {\n\t  globalThis: global_1\n\t});\n\tvar es_globalThis = {};\n\n\t'use strict'; // `Array.from` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.from\n\n\n\tvar arrayFrom = function from(arrayLike\n\t/* , mapfn = undefined, thisArg = undefined */\n\t) {\n\t  var O = toObject(arrayLike);\n\t  var C = typeof this == 'function' ? this : Array;\n\t  var argumentsLength = arguments.length;\n\t  var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n\t  var mapping = mapfn !== undefined;\n\t  var iteratorMethod = getIteratorMethod(O);\n\t  var index = 0;\n\t  var length, result, step, iterator, next, value;\n\t  if (mapping) mapfn = functionBindContext(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2); // if the target is not iterable or it's an array with the default iterator - use a simple case\n\n\t  if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n\t    iterator = iteratorMethod.call(O);\n\t    next = iterator.next;\n\t    result = new C();\n\n\t    for (; !(step = next.call(iterator)).done; index++) {\n\t      value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n\t      createProperty(result, index, value);\n\t    }\n\t  } else {\n\t    length = toLength(O.length);\n\t    result = new C(length);\n\n\t    for (; length > index; index++) {\n\t      value = mapping ? mapfn(O[index], index) : O[index];\n\t      createProperty(result, index, value);\n\t    }\n\t  }\n\n\t  result.length = index;\n\t  return result;\n\t};\n\n\tvar ITERATOR$2 = wellKnownSymbol('iterator');\n\tvar SAFE_CLOSING = false;\n\n\ttry {\n\t  var called = 0;\n\t  var iteratorWithReturn = {\n\t    next: function next() {\n\t      return {\n\t        done: !!called++\n\t      };\n\t    },\n\t    'return': function _return() {\n\t      SAFE_CLOSING = true;\n\t    }\n\t  };\n\n\t  iteratorWithReturn[ITERATOR$2] = function () {\n\t    return this;\n\t  }; // eslint-disable-next-line no-throw-literal\n\n\n\t  Array.from(iteratorWithReturn, function () {\n\t    throw 2;\n\t  });\n\t} catch (error) {\n\t  /* empty */\n\t}\n\n\tvar checkCorrectnessOfIteration = function checkCorrectnessOfIteration(exec, SKIP_CLOSING) {\n\t  if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n\t  var ITERATION_SUPPORT = false;\n\n\t  try {\n\t    var object = {};\n\n\t    object[ITERATOR$2] = function () {\n\t      return {\n\t        next: function next() {\n\t          return {\n\t            done: ITERATION_SUPPORT = true\n\t          };\n\t        }\n\t      };\n\t    };\n\n\t    exec(object);\n\t  } catch (error) {\n\t    /* empty */\n\t  }\n\n\t  return ITERATION_SUPPORT;\n\t};\n\n\tvar INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n\t  Array.from(iterable);\n\t}); // `Array.from` method\n\t// https://tc39.github.io/ecma262/#sec-array.from\n\n\t_export({\n\t  target: 'Array',\n\t  stat: true,\n\t  forced: INCORRECT_ITERATION\n\t}, {\n\t  from: arrayFrom\n\t});\n\tvar es_array_from = {};\n\n\t// https://tc39.github.io/ecma262/#sec-array.isarray\n\n\t_export({\n\t  target: 'Array',\n\t  stat: true\n\t}, {\n\t  isArray: isArray\n\t});\n\tvar es_array_isArray = {};\n\n\t'use strict';\n\n\tvar ISNT_GENERIC = fails(function () {\n\t  function F() {\n\t    /* empty */\n\t  }\n\n\t  return !(Array.of.call(F) instanceof F);\n\t}); // `Array.of` method\n\t// https://tc39.github.io/ecma262/#sec-array.of\n\t// WebKit Array.of isn't generic\n\n\t_export({\n\t  target: 'Array',\n\t  stat: true,\n\t  forced: ISNT_GENERIC\n\t}, {\n\t  of: function of()\n\t  /* ...args */\n\t  {\n\t    var index = 0;\n\t    var argumentsLength = arguments.length;\n\t    var result = new (typeof this == 'function' ? this : Array)(argumentsLength);\n\n\t    while (argumentsLength > index) {\n\t      createProperty(result, index, arguments[index++]);\n\t    }\n\n\t    result.length = argumentsLength;\n\t    return result;\n\t  }\n\t});\n\tvar es_array_of = {};\n\n\tvar engineUserAgent = getBuiltIn('navigator', 'userAgent') || '';\n\n\tvar process$1 = global_1.process;\n\tvar versions = process$1 && process$1.versions;\n\tvar v8 = versions && versions.v8;\n\tvar match, version;\n\n\tif (v8) {\n\t  match = v8.split('.');\n\t  version = match[0] + match[1];\n\t} else if (engineUserAgent) {\n\t  match = engineUserAgent.match(/Edge\\/(\\d+)/);\n\n\t  if (!match || match[1] >= 74) {\n\t    match = engineUserAgent.match(/Chrome\\/(\\d+)/);\n\t    if (match) version = match[1];\n\t  }\n\t}\n\n\tvar engineV8Version = version && +version;\n\n\tvar SPECIES$1 = wellKnownSymbol('species');\n\n\tvar arrayMethodHasSpeciesSupport = function arrayMethodHasSpeciesSupport(METHOD_NAME) {\n\t  // We can't use this feature detection in V8 since it causes\n\t  // deoptimization and serious performance degradation\n\t  // https://github.com/zloirock/core-js/issues/677\n\t  return engineV8Version >= 51 || !fails(function () {\n\t    var array = [];\n\t    var constructor = array.constructor = {};\n\n\t    constructor[SPECIES$1] = function () {\n\t      return {\n\t        foo: 1\n\t      };\n\t    };\n\n\t    return array[METHOD_NAME](Boolean).foo !== 1;\n\t  });\n\t};\n\n\t'use strict';\n\n\tvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\n\tvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\n\tvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded'; // We can't use this feature detection in V8 since it causes\n\t// deoptimization and serious performance degradation\n\t// https://github.com/zloirock/core-js/issues/679\n\n\tvar IS_CONCAT_SPREADABLE_SUPPORT = engineV8Version >= 51 || !fails(function () {\n\t  var array = [];\n\t  array[IS_CONCAT_SPREADABLE] = false;\n\t  return array.concat()[0] !== array;\n\t});\n\tvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\n\tvar isConcatSpreadable = function isConcatSpreadable(O) {\n\t  if (!isObject(O)) return false;\n\t  var spreadable = O[IS_CONCAT_SPREADABLE];\n\t  return spreadable !== undefined ? !!spreadable : isArray(O);\n\t};\n\n\tvar FORCED$1 = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT; // `Array.prototype.concat` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.concat\n\t// with adding support of @@isConcatSpreadable and @@species\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true,\n\t  forced: FORCED$1\n\t}, {\n\t  concat: function concat(arg) {\n\t    // eslint-disable-line no-unused-vars\n\t    var O = toObject(this);\n\t    var A = arraySpeciesCreate(O, 0);\n\t    var n = 0;\n\t    var i, k, length, len, E;\n\n\t    for (i = -1, length = arguments.length; i < length; i++) {\n\t      E = i === -1 ? O : arguments[i];\n\n\t      if (isConcatSpreadable(E)) {\n\t        len = toLength(E.length);\n\t        if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n\n\t        for (k = 0; k < len; k++, n++) {\n\t          if (k in E) createProperty(A, n, E[k]);\n\t        }\n\t      } else {\n\t        if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n\t        createProperty(A, n++, E);\n\t      }\n\t    }\n\n\t    A.length = n;\n\t    return A;\n\t  }\n\t});\n\tvar es_array_concat = {};\n\n\t'use strict';\n\n\tvar min$2 = Math.min; // `Array.prototype.copyWithin` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.copywithin\n\n\tvar arrayCopyWithin = [].copyWithin || function copyWithin(target\n\t/* = 0 */\n\t, start\n\t/* = 0, end = @length */\n\t) {\n\t  var O = toObject(this);\n\t  var len = toLength(O.length);\n\t  var to = toAbsoluteIndex(target, len);\n\t  var from = toAbsoluteIndex(start, len);\n\t  var end = arguments.length > 2 ? arguments[2] : undefined;\n\t  var count = min$2((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n\t  var inc = 1;\n\n\t  if (from < to && to < from + count) {\n\t    inc = -1;\n\t    from += count - 1;\n\t    to += count - 1;\n\t  }\n\n\t  while (count-- > 0) {\n\t    if (from in O) O[to] = O[from];else delete O[to];\n\t    to += inc;\n\t    from += inc;\n\t  }\n\n\t  return O;\n\t};\n\n\tvar UNSCOPABLES = wellKnownSymbol('unscopables');\n\tvar ArrayPrototype$1 = Array.prototype; // Array.prototype[@@unscopables]\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\n\tif (ArrayPrototype$1[UNSCOPABLES] == undefined) {\n\t  objectDefineProperty.f(ArrayPrototype$1, UNSCOPABLES, {\n\t    configurable: true,\n\t    value: objectCreate(null)\n\t  });\n\t} // add a key to Array.prototype[@@unscopables]\n\n\n\tvar addToUnscopables = function addToUnscopables(key) {\n\t  ArrayPrototype$1[UNSCOPABLES][key] = true;\n\t};\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.copywithin\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true\n\t}, {\n\t  copyWithin: arrayCopyWithin\n\t}); // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\n\taddToUnscopables('copyWithin');\n\tvar es_array_copyWithin = {};\n\n\t'use strict';\n\n\tvar arrayMethodIsStrict = function arrayMethodIsStrict(METHOD_NAME, argument) {\n\t  var method = [][METHOD_NAME];\n\t  return !!method && fails(function () {\n\t    // eslint-disable-next-line no-useless-call,no-throw-literal\n\t    method.call(null, argument || function () {\n\t      throw 1;\n\t    }, 1);\n\t  });\n\t};\n\n\tvar defineProperty$5 = Object.defineProperty;\n\tvar cache = {};\n\n\tvar thrower = function thrower(it) {\n\t  throw it;\n\t};\n\n\tvar arrayMethodUsesToLength = function arrayMethodUsesToLength(METHOD_NAME, options) {\n\t  if (has(cache, METHOD_NAME)) return cache[METHOD_NAME];\n\t  if (!options) options = {};\n\t  var method = [][METHOD_NAME];\n\t  var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false;\n\t  var argument0 = has(options, 0) ? options[0] : thrower;\n\t  var argument1 = has(options, 1) ? options[1] : undefined;\n\t  return cache[METHOD_NAME] = !!method && !fails(function () {\n\t    if (ACCESSORS && !descriptors) return true;\n\t    var O = {\n\t      length: -1\n\t    };\n\t    if (ACCESSORS) defineProperty$5(O, 1, {\n\t      enumerable: true,\n\t      get: thrower\n\t    });else O[1] = 1;\n\t    method.call(O, argument0, argument1);\n\t  });\n\t};\n\n\t'use strict';\n\n\tvar $every = arrayIteration.every;\n\tvar STRICT_METHOD = arrayMethodIsStrict('every');\n\tvar USES_TO_LENGTH = arrayMethodUsesToLength('every'); // `Array.prototype.every` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.every\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true,\n\t  forced: !STRICT_METHOD || !USES_TO_LENGTH\n\t}, {\n\t  every: function every(callbackfn\n\t  /* , thisArg */\n\t  ) {\n\t    return $every(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t  }\n\t});\n\tvar es_array_every = {};\n\n\t'use strict'; // `Array.prototype.fill` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.fill\n\n\n\tvar arrayFill = function fill(value\n\t/* , start = 0, end = @length */\n\t) {\n\t  var O = toObject(this);\n\t  var length = toLength(O.length);\n\t  var argumentsLength = arguments.length;\n\t  var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length);\n\t  var end = argumentsLength > 2 ? arguments[2] : undefined;\n\t  var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n\n\t  while (endPos > index) {\n\t    O[index++] = value;\n\t  }\n\n\t  return O;\n\t};\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.fill\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true\n\t}, {\n\t  fill: arrayFill\n\t}); // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\n\taddToUnscopables('fill');\n\tvar es_array_fill = {};\n\n\t'use strict';\n\n\tvar $filter = arrayIteration.filter;\n\tvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter'); // Edge 14- issue\n\n\tvar USES_TO_LENGTH$1 = arrayMethodUsesToLength('filter'); // `Array.prototype.filter` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n\t// with adding support of @@species\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true,\n\t  forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH$1\n\t}, {\n\t  filter: function filter(callbackfn\n\t  /* , thisArg */\n\t  ) {\n\t    return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t  }\n\t});\n\tvar es_array_filter = {};\n\n\t'use strict';\n\n\tvar $find = arrayIteration.find;\n\tvar FIND = 'find';\n\tvar SKIPS_HOLES = true;\n\tvar USES_TO_LENGTH$2 = arrayMethodUsesToLength(FIND); // Shouldn't skip holes\n\n\tif (FIND in []) Array(1)[FIND](function () {\n\t  SKIPS_HOLES = false;\n\t}); // `Array.prototype.find` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.find\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true,\n\t  forced: SKIPS_HOLES || !USES_TO_LENGTH$2\n\t}, {\n\t  find: function find(callbackfn\n\t  /* , that = undefined */\n\t  ) {\n\t    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t  }\n\t}); // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\n\taddToUnscopables(FIND);\n\tvar es_array_find = {};\n\n\t'use strict';\n\n\tvar $findIndex = arrayIteration.findIndex;\n\tvar FIND_INDEX = 'findIndex';\n\tvar SKIPS_HOLES$1 = true;\n\tvar USES_TO_LENGTH$3 = arrayMethodUsesToLength(FIND_INDEX); // Shouldn't skip holes\n\n\tif (FIND_INDEX in []) Array(1)[FIND_INDEX](function () {\n\t  SKIPS_HOLES$1 = false;\n\t}); // `Array.prototype.findIndex` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.findindex\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true,\n\t  forced: SKIPS_HOLES$1 || !USES_TO_LENGTH$3\n\t}, {\n\t  findIndex: function findIndex(callbackfn\n\t  /* , that = undefined */\n\t  ) {\n\t    return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t  }\n\t}); // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\n\taddToUnscopables(FIND_INDEX);\n\tvar es_array_findIndex = {};\n\n\t'use strict'; // `FlattenIntoArray` abstract operation\n\t// https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray\n\n\n\tvar flattenIntoArray = function flattenIntoArray(target, original, source, sourceLen, start, depth, mapper, thisArg) {\n\t  var targetIndex = start;\n\t  var sourceIndex = 0;\n\t  var mapFn = mapper ? functionBindContext(mapper, thisArg, 3) : false;\n\t  var element;\n\n\t  while (sourceIndex < sourceLen) {\n\t    if (sourceIndex in source) {\n\t      element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];\n\n\t      if (depth > 0 && isArray(element)) {\n\t        targetIndex = flattenIntoArray(target, original, element, toLength(element.length), targetIndex, depth - 1) - 1;\n\t      } else {\n\t        if (targetIndex >= 0x1FFFFFFFFFFFFF) throw TypeError('Exceed the acceptable array length');\n\t        target[targetIndex] = element;\n\t      }\n\n\t      targetIndex++;\n\t    }\n\n\t    sourceIndex++;\n\t  }\n\n\t  return targetIndex;\n\t};\n\n\tvar flattenIntoArray_1 = flattenIntoArray;\n\n\t'use strict'; // `Array.prototype.flat` method\n\t// https://github.com/tc39/proposal-flatMap\n\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true\n\t}, {\n\t  flat: function flat()\n\t  /* depthArg = 1 */\n\t  {\n\t    var depthArg = arguments.length ? arguments[0] : undefined;\n\t    var O = toObject(this);\n\t    var sourceLen = toLength(O.length);\n\t    var A = arraySpeciesCreate(O, 0);\n\t    A.length = flattenIntoArray_1(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toInteger(depthArg));\n\t    return A;\n\t  }\n\t});\n\tvar es_array_flat = {};\n\n\t'use strict'; // `Array.prototype.flatMap` method\n\t// https://github.com/tc39/proposal-flatMap\n\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true\n\t}, {\n\t  flatMap: function flatMap(callbackfn\n\t  /* , thisArg */\n\t  ) {\n\t    var O = toObject(this);\n\t    var sourceLen = toLength(O.length);\n\t    var A;\n\t    aFunction$1(callbackfn);\n\t    A = arraySpeciesCreate(O, 0);\n\t    A.length = flattenIntoArray_1(A, O, O, sourceLen, 0, 1, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t    return A;\n\t  }\n\t});\n\tvar es_array_flatMap = {};\n\n\t'use strict';\n\n\tvar $forEach$1 = arrayIteration.forEach;\n\tvar STRICT_METHOD$1 = arrayMethodIsStrict('forEach');\n\tvar USES_TO_LENGTH$4 = arrayMethodUsesToLength('forEach'); // `Array.prototype.forEach` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n\n\tvar arrayForEach = !STRICT_METHOD$1 || !USES_TO_LENGTH$4 ? function forEach(callbackfn\n\t/* , thisArg */\n\t) {\n\t  return $forEach$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t} : [].forEach;\n\n\t'use strict'; // `Array.prototype.forEach` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true,\n\t  forced: [].forEach != arrayForEach\n\t}, {\n\t  forEach: arrayForEach\n\t});\n\tvar es_array_forEach = {};\n\n\t'use strict';\n\n\tvar $includes = arrayIncludes.includes;\n\tvar USES_TO_LENGTH$5 = arrayMethodUsesToLength('indexOf', {\n\t  ACCESSORS: true,\n\t  1: 0\n\t}); // `Array.prototype.includes` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.includes\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true,\n\t  forced: !USES_TO_LENGTH$5\n\t}, {\n\t  includes: function includes(el\n\t  /* , fromIndex = 0 */\n\t  ) {\n\t    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n\t  }\n\t}); // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\n\taddToUnscopables('includes');\n\tvar es_array_includes = {};\n\n\t'use strict';\n\n\tvar $indexOf = arrayIncludes.indexOf;\n\tvar nativeIndexOf = [].indexOf;\n\tvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\n\tvar STRICT_METHOD$2 = arrayMethodIsStrict('indexOf');\n\tvar USES_TO_LENGTH$6 = arrayMethodUsesToLength('indexOf', {\n\t  ACCESSORS: true,\n\t  1: 0\n\t}); // `Array.prototype.indexOf` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true,\n\t  forced: NEGATIVE_ZERO || !STRICT_METHOD$2 || !USES_TO_LENGTH$6\n\t}, {\n\t  indexOf: function indexOf(searchElement\n\t  /* , fromIndex = 0 */\n\t  ) {\n\t    return NEGATIVE_ZERO // convert -0 to +0\n\t    ? nativeIndexOf.apply(this, arguments) || 0 : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n\t  }\n\t});\n\tvar es_array_indexOf = {};\n\n\t'use strict';\n\n\tvar nativeJoin = [].join;\n\tvar ES3_STRINGS = indexedObject != Object;\n\tvar STRICT_METHOD$3 = arrayMethodIsStrict('join', ','); // `Array.prototype.join` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.join\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true,\n\t  forced: ES3_STRINGS || !STRICT_METHOD$3\n\t}, {\n\t  join: function join(separator) {\n\t    return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\n\t  }\n\t});\n\tvar es_array_join = {};\n\n\t'use strict';\n\n\tvar min$3 = Math.min;\n\tvar nativeLastIndexOf = [].lastIndexOf;\n\tvar NEGATIVE_ZERO$1 = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\n\tvar STRICT_METHOD$4 = arrayMethodIsStrict('lastIndexOf'); // For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method\n\n\tvar USES_TO_LENGTH$7 = arrayMethodUsesToLength('indexOf', {\n\t  ACCESSORS: true,\n\t  1: 0\n\t});\n\tvar FORCED$2 = NEGATIVE_ZERO$1 || !STRICT_METHOD$4 || !USES_TO_LENGTH$7; // `Array.prototype.lastIndexOf` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n\n\tvar arrayLastIndexOf = FORCED$2 ? function lastIndexOf(searchElement\n\t/* , fromIndex = @[*-1] */\n\t) {\n\t  // convert -0 to +0\n\t  if (NEGATIVE_ZERO$1) return nativeLastIndexOf.apply(this, arguments) || 0;\n\t  var O = toIndexedObject(this);\n\t  var length = toLength(O.length);\n\t  var index = length - 1;\n\t  if (arguments.length > 1) index = min$3(index, toInteger(arguments[1]));\n\t  if (index < 0) index = length + index;\n\n\t  for (; index >= 0; index--) {\n\t    if (index in O && O[index] === searchElement) return index || 0;\n\t  }\n\n\t  return -1;\n\t} : nativeLastIndexOf;\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true,\n\t  forced: arrayLastIndexOf !== [].lastIndexOf\n\t}, {\n\t  lastIndexOf: arrayLastIndexOf\n\t});\n\tvar es_array_lastIndexOf = {};\n\n\t'use strict';\n\n\tvar $map = arrayIteration.map;\n\tvar HAS_SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport('map'); // FF49- issue\n\n\tvar USES_TO_LENGTH$8 = arrayMethodUsesToLength('map'); // `Array.prototype.map` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.map\n\t// with adding support of @@species\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true,\n\t  forced: !HAS_SPECIES_SUPPORT$1 || !USES_TO_LENGTH$8\n\t}, {\n\t  map: function map(callbackfn\n\t  /* , thisArg */\n\t  ) {\n\t    return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t  }\n\t});\n\tvar es_array_map = {};\n\n\tvar createMethod$3 = function createMethod(IS_RIGHT) {\n\t  return function (that, callbackfn, argumentsLength, memo) {\n\t    aFunction$1(callbackfn);\n\t    var O = toObject(that);\n\t    var self = indexedObject(O);\n\t    var length = toLength(O.length);\n\t    var index = IS_RIGHT ? length - 1 : 0;\n\t    var i = IS_RIGHT ? -1 : 1;\n\t    if (argumentsLength < 2) while (true) {\n\t      if (index in self) {\n\t        memo = self[index];\n\t        index += i;\n\t        break;\n\t      }\n\n\t      index += i;\n\n\t      if (IS_RIGHT ? index < 0 : length <= index) {\n\t        throw TypeError('Reduce of empty array with no initial value');\n\t      }\n\t    }\n\n\t    for (; IS_RIGHT ? index >= 0 : length > index; index += i) {\n\t      if (index in self) {\n\t        memo = callbackfn(memo, self[index], index, O);\n\t      }\n\t    }\n\n\t    return memo;\n\t  };\n\t};\n\n\tvar arrayReduce = {\n\t  // `Array.prototype.reduce` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n\t  left: createMethod$3(false),\n\t  // `Array.prototype.reduceRight` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\n\t  right: createMethod$3(true)\n\t};\n\tvar arrayReduce_1 = arrayReduce.left;\n\tvar arrayReduce_2 = arrayReduce.right;\n\n\t'use strict';\n\n\tvar $reduce = arrayReduce.left;\n\tvar STRICT_METHOD$5 = arrayMethodIsStrict('reduce');\n\tvar USES_TO_LENGTH$9 = arrayMethodUsesToLength('reduce', {\n\t  1: 0\n\t}); // `Array.prototype.reduce` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true,\n\t  forced: !STRICT_METHOD$5 || !USES_TO_LENGTH$9\n\t}, {\n\t  reduce: function reduce(callbackfn\n\t  /* , initialValue */\n\t  ) {\n\t    return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n\t  }\n\t});\n\tvar es_array_reduce = {};\n\n\t'use strict';\n\n\tvar $reduceRight = arrayReduce.right;\n\tvar STRICT_METHOD$6 = arrayMethodIsStrict('reduceRight'); // For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method\n\n\tvar USES_TO_LENGTH$a = arrayMethodUsesToLength('reduce', {\n\t  1: 0\n\t}); // `Array.prototype.reduceRight` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true,\n\t  forced: !STRICT_METHOD$6 || !USES_TO_LENGTH$a\n\t}, {\n\t  reduceRight: function reduceRight(callbackfn\n\t  /* , initialValue */\n\t  ) {\n\t    return $reduceRight(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n\t  }\n\t});\n\tvar es_array_reduceRight = {};\n\n\t'use strict';\n\n\tvar nativeReverse = [].reverse;\n\tvar test$1 = [1, 2]; // `Array.prototype.reverse` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.reverse\n\t// fix for Safari 12.0 bug\n\t// https://bugs.webkit.org/show_bug.cgi?id=188794\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true,\n\t  forced: String(test$1) === String(test$1.reverse())\n\t}, {\n\t  reverse: function reverse() {\n\t    // eslint-disable-next-line no-self-assign\n\t    if (isArray(this)) this.length = this.length;\n\t    return nativeReverse.call(this);\n\t  }\n\t});\n\tvar es_array_reverse = {};\n\n\t'use strict';\n\n\tvar HAS_SPECIES_SUPPORT$2 = arrayMethodHasSpeciesSupport('slice');\n\tvar USES_TO_LENGTH$b = arrayMethodUsesToLength('slice', {\n\t  ACCESSORS: true,\n\t  0: 0,\n\t  1: 2\n\t});\n\tvar SPECIES$2 = wellKnownSymbol('species');\n\tvar nativeSlice = [].slice;\n\tvar max$1 = Math.max; // `Array.prototype.slice` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.slice\n\t// fallback for not array-like ES3 strings and DOM objects\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true,\n\t  forced: !HAS_SPECIES_SUPPORT$2 || !USES_TO_LENGTH$b\n\t}, {\n\t  slice: function slice(start, end) {\n\t    var O = toIndexedObject(this);\n\t    var length = toLength(O.length);\n\t    var k = toAbsoluteIndex(start, length);\n\t    var fin = toAbsoluteIndex(end === undefined ? length : end, length); // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n\n\t    var Constructor, result, n;\n\n\t    if (isArray(O)) {\n\t      Constructor = O.constructor; // cross-realm fallback\n\n\t      if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n\t        Constructor = undefined;\n\t      } else if (isObject(Constructor)) {\n\t        Constructor = Constructor[SPECIES$2];\n\t        if (Constructor === null) Constructor = undefined;\n\t      }\n\n\t      if (Constructor === Array || Constructor === undefined) {\n\t        return nativeSlice.call(O, k, fin);\n\t      }\n\t    }\n\n\t    result = new (Constructor === undefined ? Array : Constructor)(max$1(fin - k, 0));\n\n\t    for (n = 0; k < fin; k++, n++) {\n\t      if (k in O) createProperty(result, n, O[k]);\n\t    }\n\n\t    result.length = n;\n\t    return result;\n\t  }\n\t});\n\tvar es_array_slice = {};\n\n\t'use strict';\n\n\tvar $some = arrayIteration.some;\n\tvar STRICT_METHOD$7 = arrayMethodIsStrict('some');\n\tvar USES_TO_LENGTH$c = arrayMethodUsesToLength('some'); // `Array.prototype.some` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.some\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true,\n\t  forced: !STRICT_METHOD$7 || !USES_TO_LENGTH$c\n\t}, {\n\t  some: function some(callbackfn\n\t  /* , thisArg */\n\t  ) {\n\t    return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t  }\n\t});\n\tvar es_array_some = {};\n\n\t'use strict';\n\n\tvar test$2 = [];\n\tvar nativeSort = test$2.sort; // IE8-\n\n\tvar FAILS_ON_UNDEFINED = fails(function () {\n\t  test$2.sort(undefined);\n\t}); // V8 bug\n\n\tvar FAILS_ON_NULL = fails(function () {\n\t  test$2.sort(null);\n\t}); // Old WebKit\n\n\tvar STRICT_METHOD$8 = arrayMethodIsStrict('sort');\n\tvar FORCED$3 = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD$8; // `Array.prototype.sort` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.sort\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true,\n\t  forced: FORCED$3\n\t}, {\n\t  sort: function sort(comparefn) {\n\t    return comparefn === undefined ? nativeSort.call(toObject(this)) : nativeSort.call(toObject(this), aFunction$1(comparefn));\n\t  }\n\t});\n\tvar es_array_sort = {};\n\n\t'use strict';\n\n\tvar HAS_SPECIES_SUPPORT$3 = arrayMethodHasSpeciesSupport('splice');\n\tvar USES_TO_LENGTH$d = arrayMethodUsesToLength('splice', {\n\t  ACCESSORS: true,\n\t  0: 0,\n\t  1: 2\n\t});\n\tvar max$2 = Math.max;\n\tvar min$4 = Math.min;\n\tvar MAX_SAFE_INTEGER$1 = 0x1FFFFFFFFFFFFF;\n\tvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded'; // `Array.prototype.splice` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.splice\n\t// with adding support of @@species\n\n\t_export({\n\t  target: 'Array',\n\t  proto: true,\n\t  forced: !HAS_SPECIES_SUPPORT$3 || !USES_TO_LENGTH$d\n\t}, {\n\t  splice: function splice(start, deleteCount\n\t  /* , ...items */\n\t  ) {\n\t    var O = toObject(this);\n\t    var len = toLength(O.length);\n\t    var actualStart = toAbsoluteIndex(start, len);\n\t    var argumentsLength = arguments.length;\n\t    var insertCount, actualDeleteCount, A, k, from, to;\n\n\t    if (argumentsLength === 0) {\n\t      insertCount = actualDeleteCount = 0;\n\t    } else if (argumentsLength === 1) {\n\t      insertCount = 0;\n\t      actualDeleteCount = len - actualStart;\n\t    } else {\n\t      insertCount = argumentsLength - 2;\n\t      actualDeleteCount = min$4(max$2(toInteger(deleteCount), 0), len - actualStart);\n\t    }\n\n\t    if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER$1) {\n\t      throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n\t    }\n\n\t    A = arraySpeciesCreate(O, actualDeleteCount);\n\n\t    for (k = 0; k < actualDeleteCount; k++) {\n\t      from = actualStart + k;\n\t      if (from in O) createProperty(A, k, O[from]);\n\t    }\n\n\t    A.length = actualDeleteCount;\n\n\t    if (insertCount < actualDeleteCount) {\n\t      for (k = actualStart; k < len - actualDeleteCount; k++) {\n\t        from = k + actualDeleteCount;\n\t        to = k + insertCount;\n\t        if (from in O) O[to] = O[from];else delete O[to];\n\t      }\n\n\t      for (k = len; k > len - actualDeleteCount + insertCount; k--) {\n\t        delete O[k - 1];\n\t      }\n\t    } else if (insertCount > actualDeleteCount) {\n\t      for (k = len - actualDeleteCount; k > actualStart; k--) {\n\t        from = k + actualDeleteCount - 1;\n\t        to = k + insertCount - 1;\n\t        if (from in O) O[to] = O[from];else delete O[to];\n\t      }\n\t    }\n\n\t    for (k = 0; k < insertCount; k++) {\n\t      O[k + actualStart] = arguments[k + 2];\n\t    }\n\n\t    O.length = len - actualDeleteCount + insertCount;\n\t    return A;\n\t  }\n\t});\n\tvar es_array_splice = {};\n\n\t'use strict';\n\n\tvar SPECIES$3 = wellKnownSymbol('species');\n\n\tvar setSpecies = function setSpecies(CONSTRUCTOR_NAME) {\n\t  var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n\t  var defineProperty = objectDefineProperty.f;\n\n\t  if (descriptors && Constructor && !Constructor[SPECIES$3]) {\n\t    defineProperty(Constructor, SPECIES$3, {\n\t      configurable: true,\n\t      get: function get() {\n\t        return this;\n\t      }\n\t    });\n\t  }\n\t};\n\n\t// https://tc39.github.io/ecma262/#sec-get-array-@@species\n\n\tsetSpecies('Array');\n\tvar es_array_species = {};\n\n\t// in popular engines, so it's moved to a separate module\n\n\taddToUnscopables('flat');\n\tvar es_array_unscopables_flat = {};\n\n\t// in popular engines, so it's moved to a separate module\n\n\taddToUnscopables('flatMap');\n\tvar es_array_unscopables_flatMap = {};\n\n\t'use strict';\n\n\tvar ITERATOR$3 = wellKnownSymbol('iterator');\n\tvar BUGGY_SAFARI_ITERATORS = false;\n\n\tvar returnThis = function returnThis() {\n\t  return this;\n\t}; // `%IteratorPrototype%` object\n\t// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\n\n\n\tvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n\tif ([].keys) {\n\t  arrayIterator = [].keys(); // Safari 8 has buggy iterators w/o `next`\n\n\t  if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;else {\n\t    PrototypeOfArrayIteratorPrototype = objectGetPrototypeOf(objectGetPrototypeOf(arrayIterator));\n\t    if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n\t  }\n\t}\n\n\tif (IteratorPrototype == undefined) IteratorPrototype = {}; // 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n\n\tif (!isPure && !has(IteratorPrototype, ITERATOR$3)) {\n\t  createNonEnumerableProperty(IteratorPrototype, ITERATOR$3, returnThis);\n\t}\n\n\tvar iteratorsCore = {\n\t  IteratorPrototype: IteratorPrototype,\n\t  BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n\t};\n\tvar iteratorsCore_1 = iteratorsCore.IteratorPrototype;\n\tvar iteratorsCore_2 = iteratorsCore.BUGGY_SAFARI_ITERATORS;\n\n\t'use strict';\n\n\tvar IteratorPrototype$1 = iteratorsCore.IteratorPrototype;\n\n\tvar returnThis$1 = function returnThis() {\n\t  return this;\n\t};\n\n\tvar createIteratorConstructor = function createIteratorConstructor(IteratorConstructor, NAME, next) {\n\t  var TO_STRING_TAG = NAME + ' Iterator';\n\t  IteratorConstructor.prototype = objectCreate(IteratorPrototype$1, {\n\t    next: createPropertyDescriptor(1, next)\n\t  });\n\t  setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n\t  iterators[TO_STRING_TAG] = returnThis$1;\n\t  return IteratorConstructor;\n\t};\n\n\t'use strict';\n\n\tvar IteratorPrototype$2 = iteratorsCore.IteratorPrototype;\n\tvar BUGGY_SAFARI_ITERATORS$1 = iteratorsCore.BUGGY_SAFARI_ITERATORS;\n\tvar ITERATOR$4 = wellKnownSymbol('iterator');\n\tvar KEYS = 'keys';\n\tvar VALUES = 'values';\n\tvar ENTRIES = 'entries';\n\n\tvar returnThis$2 = function returnThis() {\n\t  return this;\n\t};\n\n\tvar defineIterator = function defineIterator(Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n\t  createIteratorConstructor(IteratorConstructor, NAME, next);\n\n\t  var getIterationMethod = function getIterationMethod(KIND) {\n\t    if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n\t    if (!BUGGY_SAFARI_ITERATORS$1 && KIND in IterablePrototype) return IterablePrototype[KIND];\n\n\t    switch (KIND) {\n\t      case KEYS:\n\t        return function keys() {\n\t          return new IteratorConstructor(this, KIND);\n\t        };\n\n\t      case VALUES:\n\t        return function values() {\n\t          return new IteratorConstructor(this, KIND);\n\t        };\n\n\t      case ENTRIES:\n\t        return function entries() {\n\t          return new IteratorConstructor(this, KIND);\n\t        };\n\t    }\n\n\t    return function () {\n\t      return new IteratorConstructor(this);\n\t    };\n\t  };\n\n\t  var TO_STRING_TAG = NAME + ' Iterator';\n\t  var INCORRECT_VALUES_NAME = false;\n\t  var IterablePrototype = Iterable.prototype;\n\t  var nativeIterator = IterablePrototype[ITERATOR$4] || IterablePrototype['@@iterator'] || DEFAULT && IterablePrototype[DEFAULT];\n\t  var defaultIterator = !BUGGY_SAFARI_ITERATORS$1 && nativeIterator || getIterationMethod(DEFAULT);\n\t  var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n\t  var CurrentIteratorPrototype, methods, KEY; // fix native\n\n\t  if (anyNativeIterator) {\n\t    CurrentIteratorPrototype = objectGetPrototypeOf(anyNativeIterator.call(new Iterable()));\n\n\t    if (IteratorPrototype$2 !== Object.prototype && CurrentIteratorPrototype.next) {\n\t      if (!isPure && objectGetPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype$2) {\n\t        if (objectSetPrototypeOf) {\n\t          objectSetPrototypeOf(CurrentIteratorPrototype, IteratorPrototype$2);\n\t        } else if (typeof CurrentIteratorPrototype[ITERATOR$4] != 'function') {\n\t          createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR$4, returnThis$2);\n\t        }\n\t      } // Set @@toStringTag to native iterators\n\n\n\t      setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n\t      if (isPure) iterators[TO_STRING_TAG] = returnThis$2;\n\t    }\n\t  } // fix Array#{values, @@iterator}.name in V8 / FF\n\n\n\t  if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n\t    INCORRECT_VALUES_NAME = true;\n\n\t    defaultIterator = function values() {\n\t      return nativeIterator.call(this);\n\t    };\n\t  } // define iterator\n\n\n\t  if ((!isPure || FORCED) && IterablePrototype[ITERATOR$4] !== defaultIterator) {\n\t    createNonEnumerableProperty(IterablePrototype, ITERATOR$4, defaultIterator);\n\t  }\n\n\t  iterators[NAME] = defaultIterator; // export additional methods\n\n\t  if (DEFAULT) {\n\t    methods = {\n\t      values: getIterationMethod(VALUES),\n\t      keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n\t      entries: getIterationMethod(ENTRIES)\n\t    };\n\t    if (FORCED) for (KEY in methods) {\n\t      if (BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n\t        redefine(IterablePrototype, KEY, methods[KEY]);\n\t      }\n\t    } else _export({\n\t      target: NAME,\n\t      proto: true,\n\t      forced: BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME\n\t    }, methods);\n\t  }\n\n\t  return methods;\n\t};\n\n\t'use strict';\n\n\tvar ARRAY_ITERATOR = 'Array Iterator';\n\tvar setInternalState$1 = internalState.set;\n\tvar getInternalState$1 = internalState.getterFor(ARRAY_ITERATOR); // `Array.prototype.entries` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n\t// `Array.prototype.keys` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n\t// `Array.prototype.values` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.values\n\t// `Array.prototype[@@iterator]` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n\t// `CreateArrayIterator` internal method\n\t// https://tc39.github.io/ecma262/#sec-createarrayiterator\n\n\tvar es_array_iterator = defineIterator(Array, 'Array', function (iterated, kind) {\n\t  setInternalState$1(this, {\n\t    type: ARRAY_ITERATOR,\n\t    target: toIndexedObject(iterated),\n\t    // target\n\t    index: 0,\n\t    // next index\n\t    kind: kind // kind\n\n\t  }); // `%ArrayIteratorPrototype%.next` method\n\t  // https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n\t}, function () {\n\t  var state = getInternalState$1(this);\n\t  var target = state.target;\n\t  var kind = state.kind;\n\t  var index = state.index++;\n\n\t  if (!target || index >= target.length) {\n\t    state.target = undefined;\n\t    return {\n\t      value: undefined,\n\t      done: true\n\t    };\n\t  }\n\n\t  if (kind == 'keys') return {\n\t    value: index,\n\t    done: false\n\t  };\n\t  if (kind == 'values') return {\n\t    value: target[index],\n\t    done: false\n\t  };\n\t  return {\n\t    value: [index, target[index]],\n\t    done: false\n\t  };\n\t}, 'values'); // argumentsList[@@iterator] is %ArrayProto_values%\n\t// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n\t// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\n\n\titerators.Arguments = iterators.Array; // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\n\taddToUnscopables('keys');\n\taddToUnscopables('values');\n\taddToUnscopables('entries');\n\n\tvar fromCharCode = String.fromCharCode;\n\tvar nativeFromCodePoint = String.fromCodePoint; // length should be 1, old FF problem\n\n\tvar INCORRECT_LENGTH = !!nativeFromCodePoint && nativeFromCodePoint.length != 1; // `String.fromCodePoint` method\n\t// https://tc39.github.io/ecma262/#sec-string.fromcodepoint\n\n\t_export({\n\t  target: 'String',\n\t  stat: true,\n\t  forced: INCORRECT_LENGTH\n\t}, {\n\t  fromCodePoint: function fromCodePoint(x) {\n\t    // eslint-disable-line no-unused-vars\n\t    var elements = [];\n\t    var length = arguments.length;\n\t    var i = 0;\n\t    var code;\n\n\t    while (length > i) {\n\t      code = +arguments[i++];\n\t      if (toAbsoluteIndex(code, 0x10FFFF) !== code) throw RangeError(code + ' is not a valid code point');\n\t      elements.push(code < 0x10000 ? fromCharCode(code) : fromCharCode(((code -= 0x10000) >> 10) + 0xD800, code % 0x400 + 0xDC00));\n\t    }\n\n\t    return elements.join('');\n\t  }\n\t});\n\tvar es_string_fromCodePoint = {};\n\n\t// https://tc39.github.io/ecma262/#sec-string.raw\n\n\t_export({\n\t  target: 'String',\n\t  stat: true\n\t}, {\n\t  raw: function raw(template) {\n\t    var rawTemplate = toIndexedObject(template.raw);\n\t    var literalSegments = toLength(rawTemplate.length);\n\t    var argumentsLength = arguments.length;\n\t    var elements = [];\n\t    var i = 0;\n\n\t    while (literalSegments > i) {\n\t      elements.push(String(rawTemplate[i++]));\n\t      if (i < argumentsLength) elements.push(String(arguments[i]));\n\t    }\n\n\t    return elements.join('');\n\t  }\n\t});\n\tvar es_string_raw = {};\n\n\tvar createMethod$4 = function createMethod(CONVERT_TO_STRING) {\n\t  return function ($this, pos) {\n\t    var S = String(requireObjectCoercible($this));\n\t    var position = toInteger(pos);\n\t    var size = S.length;\n\t    var first, second;\n\t    if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n\t    first = S.charCodeAt(position);\n\t    return first < 0xD800 || first > 0xDBFF || position + 1 === size || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF ? CONVERT_TO_STRING ? S.charAt(position) : first : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n\t  };\n\t};\n\n\tvar stringMultibyte = {\n\t  // `String.prototype.codePointAt` method\n\t  // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n\t  codeAt: createMethod$4(false),\n\t  // `String.prototype.at` method\n\t  // https://github.com/mathiasbynens/String.prototype.at\n\t  charAt: createMethod$4(true)\n\t};\n\tvar stringMultibyte_1 = stringMultibyte.codeAt;\n\tvar stringMultibyte_2 = stringMultibyte.charAt;\n\n\t'use strict';\n\n\tvar codeAt = stringMultibyte.codeAt; // `String.prototype.codePointAt` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n\n\t_export({\n\t  target: 'String',\n\t  proto: true\n\t}, {\n\t  codePointAt: function codePointAt(pos) {\n\t    return codeAt(this, pos);\n\t  }\n\t});\n\tvar es_string_codePointAt = {};\n\n\tvar MATCH = wellKnownSymbol('match'); // `IsRegExp` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-isregexp\n\n\tvar isRegexp = function isRegexp(it) {\n\t  var isRegExp;\n\t  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classofRaw(it) == 'RegExp');\n\t};\n\n\tvar notARegexp = function notARegexp(it) {\n\t  if (isRegexp(it)) {\n\t    throw TypeError(\"The method doesn't accept regular expressions\");\n\t  }\n\n\t  return it;\n\t};\n\n\tvar MATCH$1 = wellKnownSymbol('match');\n\n\tvar correctIsRegexpLogic = function correctIsRegexpLogic(METHOD_NAME) {\n\t  var regexp = /./;\n\n\t  try {\n\t    '/./'[METHOD_NAME](regexp);\n\t  } catch (e) {\n\t    try {\n\t      regexp[MATCH$1] = false;\n\t      return '/./'[METHOD_NAME](regexp);\n\t    } catch (f) {\n\t      /* empty */\n\t    }\n\t  }\n\n\t  return false;\n\t};\n\n\t'use strict';\n\n\tvar getOwnPropertyDescriptor$4 = objectGetOwnPropertyDescriptor.f;\n\tvar nativeEndsWith = ''.endsWith;\n\tvar min$5 = Math.min;\n\tvar CORRECT_IS_REGEXP_LOGIC = correctIsRegexpLogic('endsWith'); // https://github.com/zloirock/core-js/pull/702\n\n\tvar MDN_POLYFILL_BUG = !isPure && !CORRECT_IS_REGEXP_LOGIC && !!function () {\n\t  var descriptor = getOwnPropertyDescriptor$4(String.prototype, 'endsWith');\n\t  return descriptor && !descriptor.writable;\n\t}(); // `String.prototype.endsWith` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.endswith\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC\n\t}, {\n\t  endsWith: function endsWith(searchString\n\t  /* , endPosition = @length */\n\t  ) {\n\t    var that = String(requireObjectCoercible(this));\n\t    notARegexp(searchString);\n\t    var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n\t    var len = toLength(that.length);\n\t    var end = endPosition === undefined ? len : min$5(toLength(endPosition), len);\n\t    var search = String(searchString);\n\t    return nativeEndsWith ? nativeEndsWith.call(that, search, end) : that.slice(end - search.length, end) === search;\n\t  }\n\t});\n\tvar es_string_endsWith = {};\n\n\t'use strict'; // `String.prototype.includes` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: !correctIsRegexpLogic('includes')\n\t}, {\n\t  includes: function includes(searchString\n\t  /* , position = 0 */\n\t  ) {\n\t    return !!~String(requireObjectCoercible(this)).indexOf(notARegexp(searchString), arguments.length > 1 ? arguments[1] : undefined);\n\t  }\n\t});\n\tvar es_string_includes = {};\n\n\t'use strict'; // `RegExp.prototype.flags` getter implementation\n\t// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\n\n\n\tvar regexpFlags = function regexpFlags() {\n\t  var that = anObject(this);\n\t  var result = '';\n\t  if (that.global) result += 'g';\n\t  if (that.ignoreCase) result += 'i';\n\t  if (that.multiline) result += 'm';\n\t  if (that.dotAll) result += 's';\n\t  if (that.unicode) result += 'u';\n\t  if (that.sticky) result += 'y';\n\t  return result;\n\t};\n\n\t'use strict'; // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n\t// so we use an intermediate function.\n\n\n\tfunction RE(s, f) {\n\t  return RegExp(s, f);\n\t}\n\n\tvar UNSUPPORTED_Y = fails(function () {\n\t  // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n\t  var re = RE('a', 'y');\n\t  re.lastIndex = 2;\n\t  return re.exec('abcd') != null;\n\t});\n\tvar BROKEN_CARET = fails(function () {\n\t  // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n\t  var re = RE('^r', 'gy');\n\t  re.lastIndex = 2;\n\t  return re.exec('str') != null;\n\t});\n\tvar regexpStickyHelpers = {\n\t  UNSUPPORTED_Y: UNSUPPORTED_Y,\n\t  BROKEN_CARET: BROKEN_CARET\n\t};\n\n\t'use strict';\n\n\tvar nativeExec = RegExp.prototype.exec; // This always refers to the native implementation, because the\n\t// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n\t// which loads this file before patching the method.\n\n\tvar nativeReplace = String.prototype.replace;\n\tvar patchedExec = nativeExec;\n\n\tvar UPDATES_LAST_INDEX_WRONG = function () {\n\t  var re1 = /a/;\n\t  var re2 = /b*/g;\n\t  nativeExec.call(re1, 'a');\n\t  nativeExec.call(re2, 'a');\n\t  return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n\t}();\n\n\tvar UNSUPPORTED_Y$1 = regexpStickyHelpers.UNSUPPORTED_Y || regexpStickyHelpers.BROKEN_CARET; // nonparticipating capturing group, copied from es5-shim's String#split patch.\n\n\tvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\tvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y$1;\n\n\tif (PATCH) {\n\t  patchedExec = function exec(str) {\n\t    var re = this;\n\t    var lastIndex, reCopy, match, i;\n\t    var sticky = UNSUPPORTED_Y$1 && re.sticky;\n\t    var flags = regexpFlags.call(re);\n\t    var source = re.source;\n\t    var charsAdded = 0;\n\t    var strCopy = str;\n\n\t    if (sticky) {\n\t      flags = flags.replace('y', '');\n\n\t      if (flags.indexOf('g') === -1) {\n\t        flags += 'g';\n\t      }\n\n\t      strCopy = String(str).slice(re.lastIndex); // Support anchored sticky behavior.\n\n\t      if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n\t        source = '(?: ' + source + ')';\n\t        strCopy = ' ' + strCopy;\n\t        charsAdded++;\n\t      } // ^(? + rx + ) is needed, in combination with some str slicing, to\n\t      // simulate the 'y' flag.\n\n\n\t      reCopy = new RegExp('^(?:' + source + ')', flags);\n\t    }\n\n\t    if (NPCG_INCLUDED) {\n\t      reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n\t    }\n\n\t    if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\t    match = nativeExec.call(sticky ? reCopy : re, strCopy);\n\n\t    if (sticky) {\n\t      if (match) {\n\t        match.input = match.input.slice(charsAdded);\n\t        match[0] = match[0].slice(charsAdded);\n\t        match.index = re.lastIndex;\n\t        re.lastIndex += match[0].length;\n\t      } else re.lastIndex = 0;\n\t    } else if (UPDATES_LAST_INDEX_WRONG && match) {\n\t      re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n\t    }\n\n\t    if (NPCG_INCLUDED && match && match.length > 1) {\n\t      // Fix browsers whose `exec` methods don't consistently return `undefined`\n\t      // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n\t      nativeReplace.call(match[0], reCopy, function () {\n\t        for (i = 1; i < arguments.length - 2; i++) {\n\t          if (arguments[i] === undefined) match[i] = undefined;\n\t        }\n\t      });\n\t    }\n\n\t    return match;\n\t  };\n\t}\n\n\tvar regexpExec = patchedExec;\n\n\t'use strict';\n\n\t_export({\n\t  target: 'RegExp',\n\t  proto: true,\n\t  forced: /./.exec !== regexpExec\n\t}, {\n\t  exec: regexpExec\n\t});\n\tvar es_regexp_exec = {};\n\n\t'use strict'; // TODO: Remove from `core-js@4` since it's moved to entry points\n\n\n\tvar SPECIES$4 = wellKnownSymbol('species');\n\tvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n\t  // #replace needs built-in support for named groups.\n\t  // #match works fine because it just return the exec results, even if it has\n\t  // a \"grops\" property.\n\t  var re = /./;\n\n\t  re.exec = function () {\n\t    var result = [];\n\t    result.groups = {\n\t      a: '7'\n\t    };\n\t    return result;\n\t  };\n\n\t  return ''.replace(re, '$<a>') !== '7';\n\t}); // IE <= 11 replaces $0 with the whole match, as if it was $&\n\t// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\n\n\tvar REPLACE_KEEPS_$0 = function () {\n\t  return 'a'.replace(/./, '$0') === '$0';\n\t}();\n\n\tvar REPLACE = wellKnownSymbol('replace'); // Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\n\n\tvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = function () {\n\t  if (/./[REPLACE]) {\n\t    return /./[REPLACE]('a', '$0') === '';\n\t  }\n\n\t  return false;\n\t}(); // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n\t// Weex JS has frozen built-in prototypes, so use try / catch wrapper\n\n\n\tvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n\t  var re = /(?:)/;\n\t  var originalExec = re.exec;\n\n\t  re.exec = function () {\n\t    return originalExec.apply(this, arguments);\n\t  };\n\n\t  var result = 'ab'.split(re);\n\t  return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n\t});\n\n\tvar fixRegexpWellKnownSymbolLogic = function fixRegexpWellKnownSymbolLogic(KEY, length, exec, sham) {\n\t  var SYMBOL = wellKnownSymbol(KEY);\n\t  var DELEGATES_TO_SYMBOL = !fails(function () {\n\t    // String methods call symbol-named RegEp methods\n\t    var O = {};\n\n\t    O[SYMBOL] = function () {\n\t      return 7;\n\t    };\n\n\t    return ''[KEY](O) != 7;\n\t  });\n\t  var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n\t    // Symbol-named RegExp methods call .exec\n\t    var execCalled = false;\n\t    var re = /a/;\n\n\t    if (KEY === 'split') {\n\t      // We can't use real regex here since it causes deoptimization\n\t      // and serious performance degradation in V8\n\t      // https://github.com/zloirock/core-js/issues/306\n\t      re = {}; // RegExp[@@split] doesn't call the regex's exec method, but first creates\n\t      // a new one. We need to return the patched regex when creating the new one.\n\n\t      re.constructor = {};\n\n\t      re.constructor[SPECIES$4] = function () {\n\t        return re;\n\t      };\n\n\t      re.flags = '';\n\t      re[SYMBOL] = /./[SYMBOL];\n\t    }\n\n\t    re.exec = function () {\n\t      execCalled = true;\n\t      return null;\n\t    };\n\n\t    re[SYMBOL]('');\n\t    return !execCalled;\n\t  });\n\n\t  if (!DELEGATES_TO_SYMBOL || !DELEGATES_TO_EXEC || KEY === 'replace' && !(REPLACE_SUPPORTS_NAMED_GROUPS && REPLACE_KEEPS_$0 && !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE) || KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC) {\n\t    var nativeRegExpMethod = /./[SYMBOL];\n\t    var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n\t      if (regexp.exec === regexpExec) {\n\t        if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n\t          // The native String method already delegates to @@method (this\n\t          // polyfilled function), leasing to infinite recursion.\n\t          // We avoid it by directly calling the native @@method method.\n\t          return {\n\t            done: true,\n\t            value: nativeRegExpMethod.call(regexp, str, arg2)\n\t          };\n\t        }\n\n\t        return {\n\t          done: true,\n\t          value: nativeMethod.call(str, regexp, arg2)\n\t        };\n\t      }\n\n\t      return {\n\t        done: false\n\t      };\n\t    }, {\n\t      REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,\n\t      REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n\t    });\n\t    var stringMethod = methods[0];\n\t    var regexMethod = methods[1];\n\t    redefine(String.prototype, KEY, stringMethod);\n\t    redefine(RegExp.prototype, SYMBOL, length == 2 // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n\t    // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n\t    ? function (string, arg) {\n\t      return regexMethod.call(string, this, arg);\n\t    } // 21.2.5.6 RegExp.prototype[@@match](string)\n\t    // 21.2.5.9 RegExp.prototype[@@search](string)\n\t    : function (string) {\n\t      return regexMethod.call(string, this);\n\t    });\n\t  }\n\n\t  if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);\n\t};\n\n\t'use strict';\n\n\tvar charAt = stringMultibyte.charAt; // `AdvanceStringIndex` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-advancestringindex\n\n\tvar advanceStringIndex = function advanceStringIndex(S, index, unicode) {\n\t  return index + (unicode ? charAt(S, index).length : 1);\n\t};\n\n\t// https://tc39.github.io/ecma262/#sec-regexpexec\n\n\tvar regexpExecAbstract = function regexpExecAbstract(R, S) {\n\t  var exec = R.exec;\n\n\t  if (typeof exec === 'function') {\n\t    var result = exec.call(R, S);\n\n\t    if (typeof result !== 'object') {\n\t      throw TypeError('RegExp exec method returned something other than an Object or null');\n\t    }\n\n\t    return result;\n\t  }\n\n\t  if (classofRaw(R) !== 'RegExp') {\n\t    throw TypeError('RegExp#exec called on incompatible receiver');\n\t  }\n\n\t  return regexpExec.call(R, S);\n\t};\n\n\t'use strict'; // @@match logic\n\n\n\tfixRegexpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n\t  return [// `String.prototype.match` method\n\t  // https://tc39.github.io/ecma262/#sec-string.prototype.match\n\t  function match(regexp) {\n\t    var O = requireObjectCoercible(this);\n\t    var matcher = regexp == undefined ? undefined : regexp[MATCH];\n\t    return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n\t  }, // `RegExp.prototype[@@match]` method\n\t  // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n\t  function (regexp) {\n\t    var res = maybeCallNative(nativeMatch, regexp, this);\n\t    if (res.done) return res.value;\n\t    var rx = anObject(regexp);\n\t    var S = String(this);\n\t    if (!rx.global) return regexpExecAbstract(rx, S);\n\t    var fullUnicode = rx.unicode;\n\t    rx.lastIndex = 0;\n\t    var A = [];\n\t    var n = 0;\n\t    var result;\n\n\t    while ((result = regexpExecAbstract(rx, S)) !== null) {\n\t      var matchStr = String(result[0]);\n\t      A[n] = matchStr;\n\t      if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n\t      n++;\n\t    }\n\n\t    return n === 0 ? null : A;\n\t  }];\n\t});\n\tvar es_string_match = {};\n\n\tvar SPECIES$5 = wellKnownSymbol('species'); // `SpeciesConstructor` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-speciesconstructor\n\n\tvar speciesConstructor = function speciesConstructor(O, defaultConstructor) {\n\t  var C = anObject(O).constructor;\n\t  var S;\n\t  return C === undefined || (S = anObject(C)[SPECIES$5]) == undefined ? defaultConstructor : aFunction$1(S);\n\t};\n\n\t'use strict';\n\n\tvar MATCH_ALL = wellKnownSymbol('matchAll');\n\tvar REGEXP_STRING = 'RegExp String';\n\tvar REGEXP_STRING_ITERATOR = REGEXP_STRING + ' Iterator';\n\tvar setInternalState$2 = internalState.set;\n\tvar getInternalState$2 = internalState.getterFor(REGEXP_STRING_ITERATOR);\n\tvar RegExpPrototype = RegExp.prototype;\n\tvar regExpBuiltinExec = RegExpPrototype.exec;\n\tvar nativeMatchAll = ''.matchAll;\n\tvar WORKS_WITH_NON_GLOBAL_REGEX = !!nativeMatchAll && !fails(function () {\n\t  'a'.matchAll(/./);\n\t});\n\n\tvar regExpExec = function regExpExec(R, S) {\n\t  var exec = R.exec;\n\t  var result;\n\n\t  if (typeof exec == 'function') {\n\t    result = exec.call(R, S);\n\t    if (typeof result != 'object') throw TypeError('Incorrect exec result');\n\t    return result;\n\t  }\n\n\t  return regExpBuiltinExec.call(R, S);\n\t}; // eslint-disable-next-line max-len\n\n\n\tvar $RegExpStringIterator = createIteratorConstructor(function RegExpStringIterator(regexp, string, global, fullUnicode) {\n\t  setInternalState$2(this, {\n\t    type: REGEXP_STRING_ITERATOR,\n\t    regexp: regexp,\n\t    string: string,\n\t    global: global,\n\t    unicode: fullUnicode,\n\t    done: false\n\t  });\n\t}, REGEXP_STRING, function next() {\n\t  var state = getInternalState$2(this);\n\t  if (state.done) return {\n\t    value: undefined,\n\t    done: true\n\t  };\n\t  var R = state.regexp;\n\t  var S = state.string;\n\t  var match = regExpExec(R, S);\n\t  if (match === null) return {\n\t    value: undefined,\n\t    done: state.done = true\n\t  };\n\n\t  if (state.global) {\n\t    if (String(match[0]) == '') R.lastIndex = advanceStringIndex(S, toLength(R.lastIndex), state.unicode);\n\t    return {\n\t      value: match,\n\t      done: false\n\t    };\n\t  }\n\n\t  state.done = true;\n\t  return {\n\t    value: match,\n\t    done: false\n\t  };\n\t});\n\n\tvar $matchAll = function $matchAll(string) {\n\t  var R = anObject(this);\n\t  var S = String(string);\n\t  var C, flagsValue, flags, matcher, global, fullUnicode;\n\t  C = speciesConstructor(R, RegExp);\n\t  flagsValue = R.flags;\n\n\t  if (flagsValue === undefined && R instanceof RegExp && !('flags' in RegExpPrototype)) {\n\t    flagsValue = regexpFlags.call(R);\n\t  }\n\n\t  flags = flagsValue === undefined ? '' : String(flagsValue);\n\t  matcher = new C(C === RegExp ? R.source : R, flags);\n\t  global = !!~flags.indexOf('g');\n\t  fullUnicode = !!~flags.indexOf('u');\n\t  matcher.lastIndex = toLength(R.lastIndex);\n\t  return new $RegExpStringIterator(matcher, S, global, fullUnicode);\n\t}; // `String.prototype.matchAll` method\n\t// https://github.com/tc39/proposal-string-matchall\n\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: WORKS_WITH_NON_GLOBAL_REGEX\n\t}, {\n\t  matchAll: function matchAll(regexp) {\n\t    var O = requireObjectCoercible(this);\n\t    var flags, S, matcher, rx;\n\n\t    if (regexp != null) {\n\t      if (isRegexp(regexp)) {\n\t        flags = String(requireObjectCoercible('flags' in RegExpPrototype ? regexp.flags : regexpFlags.call(regexp)));\n\t        if (!~flags.indexOf('g')) throw TypeError('`.matchAll` does not allow non-global regexes');\n\t      }\n\n\t      if (WORKS_WITH_NON_GLOBAL_REGEX) return nativeMatchAll.apply(O, arguments);\n\t      matcher = regexp[MATCH_ALL];\n\t      if (matcher === undefined && isPure && classofRaw(regexp) == 'RegExp') matcher = $matchAll;\n\t      if (matcher != null) return aFunction$1(matcher).call(regexp, O);\n\t    } else if (WORKS_WITH_NON_GLOBAL_REGEX) return nativeMatchAll.apply(O, arguments);\n\n\t    S = String(O);\n\t    rx = new RegExp(regexp, 'g');\n\t    return isPure ? $matchAll.call(rx, S) : rx[MATCH_ALL](S);\n\t  }\n\t});\n\tisPure || MATCH_ALL in RegExpPrototype || createNonEnumerableProperty(RegExpPrototype, MATCH_ALL, $matchAll);\n\tvar es_string_matchAll = {};\n\n\t'use strict'; // `String.prototype.repeat` method implementation\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\n\n\n\tvar stringRepeat = ''.repeat || function repeat(count) {\n\t  var str = String(requireObjectCoercible(this));\n\t  var result = '';\n\t  var n = toInteger(count);\n\t  if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');\n\n\t  for (; n > 0; (n >>>= 1) && (str += str)) {\n\t    if (n & 1) result += str;\n\t  }\n\n\t  return result;\n\t};\n\n\tvar ceil$1 = Math.ceil; // `String.prototype.{ padStart, padEnd }` methods implementation\n\n\tvar createMethod$5 = function createMethod(IS_END) {\n\t  return function ($this, maxLength, fillString) {\n\t    var S = String(requireObjectCoercible($this));\n\t    var stringLength = S.length;\n\t    var fillStr = fillString === undefined ? ' ' : String(fillString);\n\t    var intMaxLength = toLength(maxLength);\n\t    var fillLen, stringFiller;\n\t    if (intMaxLength <= stringLength || fillStr == '') return S;\n\t    fillLen = intMaxLength - stringLength;\n\t    stringFiller = stringRepeat.call(fillStr, ceil$1(fillLen / fillStr.length));\n\t    if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n\t    return IS_END ? S + stringFiller : stringFiller + S;\n\t  };\n\t};\n\n\tvar stringPad = {\n\t  // `String.prototype.padStart` method\n\t  // https://tc39.github.io/ecma262/#sec-string.prototype.padstart\n\t  start: createMethod$5(false),\n\t  // `String.prototype.padEnd` method\n\t  // https://tc39.github.io/ecma262/#sec-string.prototype.padend\n\t  end: createMethod$5(true)\n\t};\n\tvar stringPad_1 = stringPad.start;\n\tvar stringPad_2 = stringPad.end;\n\n\t// eslint-disable-next-line unicorn/no-unsafe-regex\n\n\tvar stringPadWebkitBug = /Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(engineUserAgent);\n\n\t'use strict';\n\n\tvar $padEnd = stringPad.end; // `String.prototype.padEnd` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.padend\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: stringPadWebkitBug\n\t}, {\n\t  padEnd: function padEnd(maxLength\n\t  /* , fillString = ' ' */\n\t  ) {\n\t    return $padEnd(this, maxLength, arguments.length > 1 ? arguments[1] : undefined);\n\t  }\n\t});\n\tvar es_string_padEnd = {};\n\n\t'use strict';\n\n\tvar $padStart = stringPad.start; // `String.prototype.padStart` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.padstart\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: stringPadWebkitBug\n\t}, {\n\t  padStart: function padStart(maxLength\n\t  /* , fillString = ' ' */\n\t  ) {\n\t    return $padStart(this, maxLength, arguments.length > 1 ? arguments[1] : undefined);\n\t  }\n\t});\n\tvar es_string_padStart = {};\n\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\n\n\t_export({\n\t  target: 'String',\n\t  proto: true\n\t}, {\n\t  repeat: stringRepeat\n\t});\n\tvar es_string_repeat = {};\n\n\t'use strict';\n\n\tvar max$3 = Math.max;\n\tvar min$6 = Math.min;\n\tvar floor$1 = Math.floor;\n\tvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\n\tvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\n\tvar maybeToString = function maybeToString(it) {\n\t  return it === undefined ? it : String(it);\n\t}; // @@replace logic\n\n\n\tfixRegexpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n\t  var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n\t  var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n\t  var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\t  return [// `String.prototype.replace` method\n\t  // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n\t  function replace(searchValue, replaceValue) {\n\t    var O = requireObjectCoercible(this);\n\t    var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n\t    return replacer !== undefined ? replacer.call(searchValue, O, replaceValue) : nativeReplace.call(String(O), searchValue, replaceValue);\n\t  }, // `RegExp.prototype[@@replace]` method\n\t  // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n\t  function (regexp, replaceValue) {\n\t    if (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0 || typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1) {\n\t      var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n\t      if (res.done) return res.value;\n\t    }\n\n\t    var rx = anObject(regexp);\n\t    var S = String(this);\n\t    var functionalReplace = typeof replaceValue === 'function';\n\t    if (!functionalReplace) replaceValue = String(replaceValue);\n\t    var global = rx.global;\n\n\t    if (global) {\n\t      var fullUnicode = rx.unicode;\n\t      rx.lastIndex = 0;\n\t    }\n\n\t    var results = [];\n\n\t    while (true) {\n\t      var result = regexpExecAbstract(rx, S);\n\t      if (result === null) break;\n\t      results.push(result);\n\t      if (!global) break;\n\t      var matchStr = String(result[0]);\n\t      if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n\t    }\n\n\t    var accumulatedResult = '';\n\t    var nextSourcePosition = 0;\n\n\t    for (var i = 0; i < results.length; i++) {\n\t      result = results[i];\n\t      var matched = String(result[0]);\n\t      var position = max$3(min$6(toInteger(result.index), S.length), 0);\n\t      var captures = []; // NOTE: This is equivalent to\n\t      //   captures = result.slice(1).map(maybeToString)\n\t      // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n\t      // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n\t      // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n\n\t      for (var j = 1; j < result.length; j++) {\n\t        captures.push(maybeToString(result[j]));\n\t      }\n\n\t      var namedCaptures = result.groups;\n\n\t      if (functionalReplace) {\n\t        var replacerArgs = [matched].concat(captures, position, S);\n\t        if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n\t        var replacement = String(replaceValue.apply(undefined, replacerArgs));\n\t      } else {\n\t        replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n\t      }\n\n\t      if (position >= nextSourcePosition) {\n\t        accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n\t        nextSourcePosition = position + matched.length;\n\t      }\n\t    }\n\n\t    return accumulatedResult + S.slice(nextSourcePosition);\n\t  }]; // https://tc39.github.io/ecma262/#sec-getsubstitution\n\n\t  function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n\t    var tailPos = position + matched.length;\n\t    var m = captures.length;\n\t    var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n\n\t    if (namedCaptures !== undefined) {\n\t      namedCaptures = toObject(namedCaptures);\n\t      symbols = SUBSTITUTION_SYMBOLS;\n\t    }\n\n\t    return nativeReplace.call(replacement, symbols, function (match, ch) {\n\t      var capture;\n\n\t      switch (ch.charAt(0)) {\n\t        case '$':\n\t          return '$';\n\n\t        case '&':\n\t          return matched;\n\n\t        case '`':\n\t          return str.slice(0, position);\n\n\t        case \"'\":\n\t          return str.slice(tailPos);\n\n\t        case '<':\n\t          capture = namedCaptures[ch.slice(1, -1)];\n\t          break;\n\n\t        default:\n\t          // \\d\\d?\n\t          var n = +ch;\n\t          if (n === 0) return match;\n\n\t          if (n > m) {\n\t            var f = floor$1(n / 10);\n\t            if (f === 0) return match;\n\t            if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n\t            return match;\n\t          }\n\n\t          capture = captures[n - 1];\n\t      }\n\n\t      return capture === undefined ? '' : capture;\n\t    });\n\t  }\n\t});\n\tvar es_string_replace = {};\n\n\t'use strict'; // @@search logic\n\n\n\tfixRegexpWellKnownSymbolLogic('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n\t  return [// `String.prototype.search` method\n\t  // https://tc39.github.io/ecma262/#sec-string.prototype.search\n\t  function search(regexp) {\n\t    var O = requireObjectCoercible(this);\n\t    var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n\t    return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n\t  }, // `RegExp.prototype[@@search]` method\n\t  // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n\t  function (regexp) {\n\t    var res = maybeCallNative(nativeSearch, regexp, this);\n\t    if (res.done) return res.value;\n\t    var rx = anObject(regexp);\n\t    var S = String(this);\n\t    var previousLastIndex = rx.lastIndex;\n\t    if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n\t    var result = regexpExecAbstract(rx, S);\n\t    if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n\t    return result === null ? -1 : result.index;\n\t  }];\n\t});\n\tvar es_string_search = {};\n\n\t'use strict';\n\n\tvar arrayPush = [].push;\n\tvar min$7 = Math.min;\n\tvar MAX_UINT32 = 0xFFFFFFFF; // babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\n\n\tvar SUPPORTS_Y = !fails(function () {\n\t  return !RegExp(MAX_UINT32, 'y');\n\t}); // @@split logic\n\n\tfixRegexpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n\t  var internalSplit;\n\n\t  if ('abbc'.split(/(b)*/)[1] == 'c' || 'test'.split(/(?:)/, -1).length != 4 || 'ab'.split(/(?:ab)*/).length != 2 || '.'.split(/(.?)(.?)/).length != 4 || '.'.split(/()()/).length > 1 || ''.split(/.?/).length) {\n\t    // based on es5-shim implementation, need to rework it\n\t    internalSplit = function internalSplit(separator, limit) {\n\t      var string = String(requireObjectCoercible(this));\n\t      var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n\t      if (lim === 0) return [];\n\t      if (separator === undefined) return [string]; // If `separator` is not a regex, use native split\n\n\t      if (!isRegexp(separator)) {\n\t        return nativeSplit.call(string, separator, lim);\n\t      }\n\n\t      var output = [];\n\t      var flags = (separator.ignoreCase ? 'i' : '') + (separator.multiline ? 'm' : '') + (separator.unicode ? 'u' : '') + (separator.sticky ? 'y' : '');\n\t      var lastLastIndex = 0; // Make `global` and avoid `lastIndex` issues by working with a copy\n\n\t      var separatorCopy = new RegExp(separator.source, flags + 'g');\n\t      var match, lastIndex, lastLength;\n\n\t      while (match = regexpExec.call(separatorCopy, string)) {\n\t        lastIndex = separatorCopy.lastIndex;\n\n\t        if (lastIndex > lastLastIndex) {\n\t          output.push(string.slice(lastLastIndex, match.index));\n\t          if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n\t          lastLength = match[0].length;\n\t          lastLastIndex = lastIndex;\n\t          if (output.length >= lim) break;\n\t        }\n\n\t        if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop\n\t      }\n\n\t      if (lastLastIndex === string.length) {\n\t        if (lastLength || !separatorCopy.test('')) output.push('');\n\t      } else output.push(string.slice(lastLastIndex));\n\n\t      return output.length > lim ? output.slice(0, lim) : output;\n\t    }; // Chakra, V8\n\n\t  } else if ('0'.split(undefined, 0).length) {\n\t    internalSplit = function internalSplit(separator, limit) {\n\t      return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n\t    };\n\t  } else internalSplit = nativeSplit;\n\n\t  return [// `String.prototype.split` method\n\t  // https://tc39.github.io/ecma262/#sec-string.prototype.split\n\t  function split(separator, limit) {\n\t    var O = requireObjectCoercible(this);\n\t    var splitter = separator == undefined ? undefined : separator[SPLIT];\n\t    return splitter !== undefined ? splitter.call(separator, O, limit) : internalSplit.call(String(O), separator, limit);\n\t  }, // `RegExp.prototype[@@split]` method\n\t  // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n\t  //\n\t  // NOTE: This cannot be properly polyfilled in engines that don't support\n\t  // the 'y' flag.\n\t  function (regexp, limit) {\n\t    var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n\t    if (res.done) return res.value;\n\t    var rx = anObject(regexp);\n\t    var S = String(this);\n\t    var C = speciesConstructor(rx, RegExp);\n\t    var unicodeMatching = rx.unicode;\n\t    var flags = (rx.ignoreCase ? 'i' : '') + (rx.multiline ? 'm' : '') + (rx.unicode ? 'u' : '') + (SUPPORTS_Y ? 'y' : 'g'); // ^(? + rx + ) is needed, in combination with some S slicing, to\n\t    // simulate the 'y' flag.\n\n\t    var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n\t    var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n\t    if (lim === 0) return [];\n\t    if (S.length === 0) return regexpExecAbstract(splitter, S) === null ? [S] : [];\n\t    var p = 0;\n\t    var q = 0;\n\t    var A = [];\n\n\t    while (q < S.length) {\n\t      splitter.lastIndex = SUPPORTS_Y ? q : 0;\n\t      var z = regexpExecAbstract(splitter, SUPPORTS_Y ? S : S.slice(q));\n\t      var e;\n\n\t      if (z === null || (e = min$7(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p) {\n\t        q = advanceStringIndex(S, q, unicodeMatching);\n\t      } else {\n\t        A.push(S.slice(p, q));\n\t        if (A.length === lim) return A;\n\n\t        for (var i = 1; i <= z.length - 1; i++) {\n\t          A.push(z[i]);\n\t          if (A.length === lim) return A;\n\t        }\n\n\t        q = p = e;\n\t      }\n\t    }\n\n\t    A.push(S.slice(p));\n\t    return A;\n\t  }];\n\t}, !SUPPORTS_Y);\n\tvar es_string_split = {};\n\n\t'use strict';\n\n\tvar getOwnPropertyDescriptor$5 = objectGetOwnPropertyDescriptor.f;\n\tvar nativeStartsWith = ''.startsWith;\n\tvar min$8 = Math.min;\n\tvar CORRECT_IS_REGEXP_LOGIC$1 = correctIsRegexpLogic('startsWith'); // https://github.com/zloirock/core-js/pull/702\n\n\tvar MDN_POLYFILL_BUG$1 = !isPure && !CORRECT_IS_REGEXP_LOGIC$1 && !!function () {\n\t  var descriptor = getOwnPropertyDescriptor$5(String.prototype, 'startsWith');\n\t  return descriptor && !descriptor.writable;\n\t}(); // `String.prototype.startsWith` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.startswith\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: !MDN_POLYFILL_BUG$1 && !CORRECT_IS_REGEXP_LOGIC$1\n\t}, {\n\t  startsWith: function startsWith(searchString\n\t  /* , position = 0 */\n\t  ) {\n\t    var that = String(requireObjectCoercible(this));\n\t    notARegexp(searchString);\n\t    var index = toLength(min$8(arguments.length > 1 ? arguments[1] : undefined, that.length));\n\t    var search = String(searchString);\n\t    return nativeStartsWith ? nativeStartsWith.call(that, search, index) : that.slice(index, index + search.length) === search;\n\t  }\n\t});\n\tvar es_string_startsWith = {};\n\n\t// a string of all valid unicode whitespaces\n\t// eslint-disable-next-line max-len\n\tvar whitespaces = \"\\t\\n\\x0B\\f\\r \\xA0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF\";\n\n\tvar whitespace = '[' + whitespaces + ']';\n\tvar ltrim = RegExp('^' + whitespace + whitespace + '*');\n\tvar rtrim = RegExp(whitespace + whitespace + '*$'); // `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\n\n\tvar createMethod$6 = function createMethod(TYPE) {\n\t  return function ($this) {\n\t    var string = String(requireObjectCoercible($this));\n\t    if (TYPE & 1) string = string.replace(ltrim, '');\n\t    if (TYPE & 2) string = string.replace(rtrim, '');\n\t    return string;\n\t  };\n\t};\n\n\tvar stringTrim = {\n\t  // `String.prototype.{ trimLeft, trimStart }` methods\n\t  // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart\n\t  start: createMethod$6(1),\n\t  // `String.prototype.{ trimRight, trimEnd }` methods\n\t  // https://tc39.github.io/ecma262/#sec-string.prototype.trimend\n\t  end: createMethod$6(2),\n\t  // `String.prototype.trim` method\n\t  // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n\t  trim: createMethod$6(3)\n\t};\n\tvar stringTrim_1 = stringTrim.start;\n\tvar stringTrim_2 = stringTrim.end;\n\tvar stringTrim_3 = stringTrim.trim;\n\n\tvar non = \"\\u200B\\x85\\u180E\"; // check that a method works with the correct list\n\t// of whitespaces and has a correct name\n\n\tvar stringTrimForced = function stringTrimForced(METHOD_NAME) {\n\t  return fails(function () {\n\t    return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n\t  });\n\t};\n\n\t'use strict';\n\n\tvar $trim = stringTrim.trim; // `String.prototype.trim` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.trim\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: stringTrimForced('trim')\n\t}, {\n\t  trim: function trim() {\n\t    return $trim(this);\n\t  }\n\t});\n\tvar es_string_trim = {};\n\n\t'use strict';\n\n\tvar $trimStart = stringTrim.start;\n\tvar FORCED$4 = stringTrimForced('trimStart');\n\tvar trimStart = FORCED$4 ? function trimStart() {\n\t  return $trimStart(this);\n\t} : ''.trimStart; // `String.prototype.{ trimStart, trimLeft }` methods\n\t// https://github.com/tc39/ecmascript-string-left-right-trim\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: FORCED$4\n\t}, {\n\t  trimStart: trimStart,\n\t  trimLeft: trimStart\n\t});\n\tvar es_string_trimStart = {};\n\n\t'use strict';\n\n\tvar $trimEnd = stringTrim.end;\n\tvar FORCED$5 = stringTrimForced('trimEnd');\n\tvar trimEnd = FORCED$5 ? function trimEnd() {\n\t  return $trimEnd(this);\n\t} : ''.trimEnd; // `String.prototype.{ trimEnd, trimRight }` methods\n\t// https://github.com/tc39/ecmascript-string-left-right-trim\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: FORCED$5\n\t}, {\n\t  trimEnd: trimEnd,\n\t  trimRight: trimEnd\n\t});\n\tvar es_string_trimEnd = {};\n\n\t'use strict';\n\n\tvar charAt$1 = stringMultibyte.charAt;\n\tvar STRING_ITERATOR = 'String Iterator';\n\tvar setInternalState$3 = internalState.set;\n\tvar getInternalState$3 = internalState.getterFor(STRING_ITERATOR); // `String.prototype[@@iterator]` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\n\n\tdefineIterator(String, 'String', function (iterated) {\n\t  setInternalState$3(this, {\n\t    type: STRING_ITERATOR,\n\t    string: String(iterated),\n\t    index: 0\n\t  }); // `%StringIteratorPrototype%.next` method\n\t  // https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n\t}, function next() {\n\t  var state = getInternalState$3(this);\n\t  var string = state.string;\n\t  var index = state.index;\n\t  var point;\n\t  if (index >= string.length) return {\n\t    value: undefined,\n\t    done: true\n\t  };\n\t  point = charAt$1(string, index);\n\t  state.index += point.length;\n\t  return {\n\t    value: point,\n\t    done: false\n\t  };\n\t});\n\tvar es_string_iterator = {};\n\n\tvar quot = /\"/g; // B.2.3.2.1 CreateHTML(string, tag, attribute, value)\n\t// https://tc39.github.io/ecma262/#sec-createhtml\n\n\tvar createHtml = function createHtml(string, tag, attribute, value) {\n\t  var S = String(requireObjectCoercible(string));\n\t  var p1 = '<' + tag;\n\t  if (attribute !== '') p1 += ' ' + attribute + '=\"' + String(value).replace(quot, '&quot;') + '\"';\n\t  return p1 + '>' + S + '</' + tag + '>';\n\t};\n\n\t// of a tag and escaping quotes in arguments\n\n\tvar stringHtmlForced = function stringHtmlForced(METHOD_NAME) {\n\t  return fails(function () {\n\t    var test = ''[METHOD_NAME]('\"');\n\t    return test !== test.toLowerCase() || test.split('\"').length > 3;\n\t  });\n\t};\n\n\t'use strict'; // `String.prototype.anchor` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.anchor\n\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: stringHtmlForced('anchor')\n\t}, {\n\t  anchor: function anchor(name) {\n\t    return createHtml(this, 'a', 'name', name);\n\t  }\n\t});\n\tvar es_string_anchor = {};\n\n\t'use strict'; // `String.prototype.big` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.big\n\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: stringHtmlForced('big')\n\t}, {\n\t  big: function big() {\n\t    return createHtml(this, 'big', '', '');\n\t  }\n\t});\n\tvar es_string_big = {};\n\n\t'use strict'; // `String.prototype.blink` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.blink\n\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: stringHtmlForced('blink')\n\t}, {\n\t  blink: function blink() {\n\t    return createHtml(this, 'blink', '', '');\n\t  }\n\t});\n\tvar es_string_blink = {};\n\n\t'use strict'; // `String.prototype.bold` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.bold\n\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: stringHtmlForced('bold')\n\t}, {\n\t  bold: function bold() {\n\t    return createHtml(this, 'b', '', '');\n\t  }\n\t});\n\tvar es_string_bold = {};\n\n\t'use strict'; // `String.prototype.fixed` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.fixed\n\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: stringHtmlForced('fixed')\n\t}, {\n\t  fixed: function fixed() {\n\t    return createHtml(this, 'tt', '', '');\n\t  }\n\t});\n\tvar es_string_fixed = {};\n\n\t'use strict'; // `String.prototype.fontcolor` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.fontcolor\n\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: stringHtmlForced('fontcolor')\n\t}, {\n\t  fontcolor: function fontcolor(color) {\n\t    return createHtml(this, 'font', 'color', color);\n\t  }\n\t});\n\tvar es_string_fontcolor = {};\n\n\t'use strict'; // `String.prototype.fontsize` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.fontsize\n\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: stringHtmlForced('fontsize')\n\t}, {\n\t  fontsize: function fontsize(size) {\n\t    return createHtml(this, 'font', 'size', size);\n\t  }\n\t});\n\tvar es_string_fontsize = {};\n\n\t'use strict'; // `String.prototype.italics` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.italics\n\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: stringHtmlForced('italics')\n\t}, {\n\t  italics: function italics() {\n\t    return createHtml(this, 'i', '', '');\n\t  }\n\t});\n\tvar es_string_italics = {};\n\n\t'use strict'; // `String.prototype.link` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.link\n\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: stringHtmlForced('link')\n\t}, {\n\t  link: function link(url) {\n\t    return createHtml(this, 'a', 'href', url);\n\t  }\n\t});\n\tvar es_string_link = {};\n\n\t'use strict'; // `String.prototype.small` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.small\n\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: stringHtmlForced('small')\n\t}, {\n\t  small: function small() {\n\t    return createHtml(this, 'small', '', '');\n\t  }\n\t});\n\tvar es_string_small = {};\n\n\t'use strict'; // `String.prototype.strike` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.strike\n\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: stringHtmlForced('strike')\n\t}, {\n\t  strike: function strike() {\n\t    return createHtml(this, 'strike', '', '');\n\t  }\n\t});\n\tvar es_string_strike = {};\n\n\t'use strict'; // `String.prototype.sub` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.sub\n\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: stringHtmlForced('sub')\n\t}, {\n\t  sub: function sub() {\n\t    return createHtml(this, 'sub', '', '');\n\t  }\n\t});\n\tvar es_string_sub = {};\n\n\t'use strict'; // `String.prototype.sup` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.sup\n\n\n\t_export({\n\t  target: 'String',\n\t  proto: true,\n\t  forced: stringHtmlForced('sup')\n\t}, {\n\t  sup: function sup() {\n\t    return createHtml(this, 'sup', '', '');\n\t  }\n\t});\n\tvar es_string_sup = {};\n\n\tvar inheritIfRequired = function inheritIfRequired($this, dummy, Wrapper) {\n\t  var NewTarget, NewTargetPrototype;\n\t  if ( // it can work only with native `setPrototypeOf`\n\t  objectSetPrototypeOf && // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n\t  typeof (NewTarget = dummy.constructor) == 'function' && NewTarget !== Wrapper && isObject(NewTargetPrototype = NewTarget.prototype) && NewTargetPrototype !== Wrapper.prototype) objectSetPrototypeOf($this, NewTargetPrototype);\n\t  return $this;\n\t};\n\n\tvar defineProperty$6 = objectDefineProperty.f;\n\tvar getOwnPropertyNames = objectGetOwnPropertyNames.f;\n\tvar setInternalState$4 = internalState.set;\n\tvar MATCH$2 = wellKnownSymbol('match');\n\tvar NativeRegExp = global_1.RegExp;\n\tvar RegExpPrototype$1 = NativeRegExp.prototype;\n\tvar re1 = /a/g;\n\tvar re2 = /a/g; // \"new\" should create a new object, old webkit bug\n\n\tvar CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\tvar UNSUPPORTED_Y$2 = regexpStickyHelpers.UNSUPPORTED_Y;\n\tvar FORCED$6 = descriptors && isForced_1('RegExp', !CORRECT_NEW || UNSUPPORTED_Y$2 || fails(function () {\n\t  re2[MATCH$2] = false; // RegExp constructor can alter flags and IsRegExp works correct with @@match\n\n\t  return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';\n\t})); // `RegExp` constructor\n\t// https://tc39.github.io/ecma262/#sec-regexp-constructor\n\n\tif (FORCED$6) {\n\t  var RegExpWrapper = function RegExp(pattern, flags) {\n\t    var thisIsRegExp = this instanceof RegExpWrapper;\n\t    var patternIsRegExp = isRegexp(pattern);\n\t    var flagsAreUndefined = flags === undefined;\n\t    var sticky;\n\n\t    if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) {\n\t      return pattern;\n\t    }\n\n\t    if (CORRECT_NEW) {\n\t      if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;\n\t    } else if (pattern instanceof RegExpWrapper) {\n\t      if (flagsAreUndefined) flags = regexpFlags.call(pattern);\n\t      pattern = pattern.source;\n\t    }\n\n\t    if (UNSUPPORTED_Y$2) {\n\t      sticky = !!flags && flags.indexOf('y') > -1;\n\t      if (sticky) flags = flags.replace(/y/g, '');\n\t    }\n\n\t    var result = inheritIfRequired(CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags), thisIsRegExp ? this : RegExpPrototype$1, RegExpWrapper);\n\t    if (UNSUPPORTED_Y$2 && sticky) setInternalState$4(result, {\n\t      sticky: sticky\n\t    });\n\t    return result;\n\t  };\n\n\t  var proxy = function proxy(key) {\n\t    key in RegExpWrapper || defineProperty$6(RegExpWrapper, key, {\n\t      configurable: true,\n\t      get: function get() {\n\t        return NativeRegExp[key];\n\t      },\n\t      set: function set(it) {\n\t        NativeRegExp[key] = it;\n\t      }\n\t    });\n\t  };\n\n\t  var keys$1 = getOwnPropertyNames(NativeRegExp);\n\t  var index = 0;\n\n\t  while (keys$1.length > index) {\n\t    proxy(keys$1[index++]);\n\t  }\n\n\t  RegExpPrototype$1.constructor = RegExpWrapper;\n\t  RegExpWrapper.prototype = RegExpPrototype$1;\n\t  redefine(global_1, 'RegExp', RegExpWrapper);\n\t} // https://tc39.github.io/ecma262/#sec-get-regexp-@@species\n\n\n\tsetSpecies('RegExp');\n\tvar es_regexp_constructor = {};\n\n\tvar UNSUPPORTED_Y$3 = regexpStickyHelpers.UNSUPPORTED_Y; // `RegExp.prototype.flags` getter\n\t// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\n\n\tif (descriptors && (/./g.flags != 'g' || UNSUPPORTED_Y$3)) {\n\t  objectDefineProperty.f(RegExp.prototype, 'flags', {\n\t    configurable: true,\n\t    get: regexpFlags\n\t  });\n\t}\n\n\tvar es_regexp_flags = {};\n\n\tvar UNSUPPORTED_Y$4 = regexpStickyHelpers.UNSUPPORTED_Y;\n\tvar defineProperty$7 = objectDefineProperty.f;\n\tvar getInternalState$4 = internalState.get;\n\tvar RegExpPrototype$2 = RegExp.prototype; // `RegExp.prototype.sticky` getter\n\n\tif (descriptors && UNSUPPORTED_Y$4) {\n\t  defineProperty$7(RegExp.prototype, 'sticky', {\n\t    configurable: true,\n\t    get: function get() {\n\t      if (this === RegExpPrototype$2) return undefined; // We can't use InternalStateModule.getterFor because\n\t      // we don't add metadata for regexps created by a literal.\n\n\t      if (this instanceof RegExp) {\n\t        return !!getInternalState$4(this).sticky;\n\t      }\n\n\t      throw TypeError('Incompatible receiver, RegExp required');\n\t    }\n\t  });\n\t}\n\n\tvar es_regexp_sticky = {};\n\n\t'use strict'; // TODO: Remove from `core-js@4` since it's moved to entry points\n\n\n\tvar DELEGATES_TO_EXEC = function () {\n\t  var execCalled = false;\n\t  var re = /[ac]/;\n\n\t  re.exec = function () {\n\t    execCalled = true;\n\t    return /./.exec.apply(this, arguments);\n\t  };\n\n\t  return re.test('abc') === true && execCalled;\n\t}();\n\n\tvar nativeTest = /./.test;\n\t_export({\n\t  target: 'RegExp',\n\t  proto: true,\n\t  forced: !DELEGATES_TO_EXEC\n\t}, {\n\t  test: function test(str) {\n\t    if (typeof this.exec !== 'function') {\n\t      return nativeTest.call(this, str);\n\t    }\n\n\t    var result = this.exec(str);\n\n\t    if (result !== null && !isObject(result)) {\n\t      throw new Error('RegExp exec method returned something other than an Object or null');\n\t    }\n\n\t    return !!result;\n\t  }\n\t});\n\tvar es_regexp_test = {};\n\n\t'use strict';\n\n\tvar TO_STRING = 'toString';\n\tvar RegExpPrototype$3 = RegExp.prototype;\n\tvar nativeToString = RegExpPrototype$3[TO_STRING];\n\tvar NOT_GENERIC = fails(function () {\n\t  return nativeToString.call({\n\t    source: 'a',\n\t    flags: 'b'\n\t  }) != '/a/b';\n\t}); // FF44- RegExp#toString has a wrong name\n\n\tvar INCORRECT_NAME = nativeToString.name != TO_STRING; // `RegExp.prototype.toString` method\n\t// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\n\n\tif (NOT_GENERIC || INCORRECT_NAME) {\n\t  redefine(RegExp.prototype, TO_STRING, function toString() {\n\t    var R = anObject(this);\n\t    var p = String(R.source);\n\t    var rf = R.flags;\n\t    var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype$3) ? regexpFlags.call(R) : rf);\n\t    return '/' + p + '/' + f;\n\t  }, {\n\t    unsafe: true\n\t  });\n\t}\n\n\tvar es_regexp_toString = {};\n\n\tvar trim = stringTrim.trim;\n\tvar $parseInt = global_1.parseInt;\n\tvar hex = /^[+-]?0[Xx]/;\n\tvar FORCED$7 = $parseInt(whitespaces + '08') !== 8 || $parseInt(whitespaces + '0x16') !== 22; // `parseInt` method\n\t// https://tc39.github.io/ecma262/#sec-parseint-string-radix\n\n\tvar numberParseInt = FORCED$7 ? function parseInt(string, radix) {\n\t  var S = trim(String(string));\n\t  return $parseInt(S, radix >>> 0 || (hex.test(S) ? 16 : 10));\n\t} : $parseInt;\n\n\t// https://tc39.github.io/ecma262/#sec-parseint-string-radix\n\n\t_export({\n\t  global: true,\n\t  forced: parseInt != numberParseInt\n\t}, {\n\t  parseInt: numberParseInt\n\t});\n\tvar es_parseInt = {};\n\n\tvar trim$1 = stringTrim.trim;\n\tvar $parseFloat = global_1.parseFloat;\n\tvar FORCED$8 = 1 / $parseFloat(whitespaces + '-0') !== -Infinity; // `parseFloat` method\n\t// https://tc39.github.io/ecma262/#sec-parsefloat-string\n\n\tvar numberParseFloat = FORCED$8 ? function parseFloat(string) {\n\t  var trimmedString = trim$1(String(string));\n\t  var result = $parseFloat(trimmedString);\n\t  return result === 0 && trimmedString.charAt(0) == '-' ? -0 : result;\n\t} : $parseFloat;\n\n\t// https://tc39.github.io/ecma262/#sec-parsefloat-string\n\n\t_export({\n\t  global: true,\n\t  forced: parseFloat != numberParseFloat\n\t}, {\n\t  parseFloat: numberParseFloat\n\t});\n\tvar es_parseFloat = {};\n\n\t'use strict';\n\n\tvar getOwnPropertyNames$1 = objectGetOwnPropertyNames.f;\n\tvar getOwnPropertyDescriptor$6 = objectGetOwnPropertyDescriptor.f;\n\tvar defineProperty$8 = objectDefineProperty.f;\n\tvar trim$2 = stringTrim.trim;\n\tvar NUMBER = 'Number';\n\tvar NativeNumber = global_1[NUMBER];\n\tvar NumberPrototype = NativeNumber.prototype; // Opera ~12 has broken Object#toString\n\n\tvar BROKEN_CLASSOF = classofRaw(objectCreate(NumberPrototype)) == NUMBER; // `ToNumber` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-tonumber\n\n\tvar toNumber = function toNumber(argument) {\n\t  var it = toPrimitive(argument, false);\n\t  var first, third, radix, maxCode, digits, length, index, code;\n\n\t  if (typeof it == 'string' && it.length > 2) {\n\t    it = trim$2(it);\n\t    first = it.charCodeAt(0);\n\n\t    if (first === 43 || first === 45) {\n\t      third = it.charCodeAt(2);\n\t      if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n\t    } else if (first === 48) {\n\t      switch (it.charCodeAt(1)) {\n\t        case 66:\n\t        case 98:\n\t          radix = 2;\n\t          maxCode = 49;\n\t          break;\n\t        // fast equal of /^0b[01]+$/i\n\n\t        case 79:\n\t        case 111:\n\t          radix = 8;\n\t          maxCode = 55;\n\t          break;\n\t        // fast equal of /^0o[0-7]+$/i\n\n\t        default:\n\t          return +it;\n\t      }\n\n\t      digits = it.slice(2);\n\t      length = digits.length;\n\n\t      for (index = 0; index < length; index++) {\n\t        code = digits.charCodeAt(index); // parseInt parses a string to a first unavailable symbol\n\t        // but ToNumber should return NaN if a string contains unavailable symbols\n\n\t        if (code < 48 || code > maxCode) return NaN;\n\t      }\n\n\t      return parseInt(digits, radix);\n\t    }\n\t  }\n\n\t  return +it;\n\t}; // `Number` constructor\n\t// https://tc39.github.io/ecma262/#sec-number-constructor\n\n\n\tif (isForced_1(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {\n\t  var NumberWrapper = function Number(value) {\n\t    var it = arguments.length < 1 ? 0 : value;\n\t    var dummy = this;\n\t    return dummy instanceof NumberWrapper // check on 1..constructor(foo) case\n\t    && (BROKEN_CLASSOF ? fails(function () {\n\t      NumberPrototype.valueOf.call(dummy);\n\t    }) : classofRaw(dummy) != NUMBER) ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);\n\t  };\n\n\t  for (var keys$2 = descriptors ? getOwnPropertyNames$1(NativeNumber) : ( // ES3:\n\t  'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' + // ES2015 (in case, if modules with ES2015 Number statics required before):\n\t  'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' + 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger').split(','), j = 0, key; keys$2.length > j; j++) {\n\t    if (has(NativeNumber, key = keys$2[j]) && !has(NumberWrapper, key)) {\n\t      defineProperty$8(NumberWrapper, key, getOwnPropertyDescriptor$6(NativeNumber, key));\n\t    }\n\t  }\n\n\t  NumberWrapper.prototype = NumberPrototype;\n\t  NumberPrototype.constructor = NumberWrapper;\n\t  redefine(global_1, NUMBER, NumberWrapper);\n\t}\n\n\tvar es_number_constructor = {};\n\n\t// https://tc39.github.io/ecma262/#sec-number.epsilon\n\n\t_export({\n\t  target: 'Number',\n\t  stat: true\n\t}, {\n\t  EPSILON: Math.pow(2, -52)\n\t});\n\tvar es_number_epsilon = {};\n\n\tvar globalIsFinite = global_1.isFinite; // `Number.isFinite` method\n\t// https://tc39.github.io/ecma262/#sec-number.isfinite\n\n\tvar numberIsFinite = Number.isFinite || function isFinite(it) {\n\t  return typeof it == 'number' && globalIsFinite(it);\n\t};\n\n\t// https://tc39.github.io/ecma262/#sec-number.isfinite\n\n\t_export({\n\t  target: 'Number',\n\t  stat: true\n\t}, {\n\t  isFinite: numberIsFinite\n\t});\n\tvar es_number_isFinite = {};\n\n\tvar floor$2 = Math.floor; // `Number.isInteger` method implementation\n\t// https://tc39.github.io/ecma262/#sec-number.isinteger\n\n\tvar isInteger = function isInteger(it) {\n\t  return !isObject(it) && isFinite(it) && floor$2(it) === it;\n\t};\n\n\t// https://tc39.github.io/ecma262/#sec-number.isinteger\n\n\t_export({\n\t  target: 'Number',\n\t  stat: true\n\t}, {\n\t  isInteger: isInteger\n\t});\n\tvar es_number_isInteger = {};\n\n\t// https://tc39.github.io/ecma262/#sec-number.isnan\n\n\t_export({\n\t  target: 'Number',\n\t  stat: true\n\t}, {\n\t  isNaN: function isNaN(number) {\n\t    // eslint-disable-next-line no-self-compare\n\t    return number != number;\n\t  }\n\t});\n\tvar es_number_isNan = {};\n\n\tvar abs = Math.abs; // `Number.isSafeInteger` method\n\t// https://tc39.github.io/ecma262/#sec-number.issafeinteger\n\n\t_export({\n\t  target: 'Number',\n\t  stat: true\n\t}, {\n\t  isSafeInteger: function isSafeInteger(number) {\n\t    return isInteger(number) && abs(number) <= 0x1FFFFFFFFFFFFF;\n\t  }\n\t});\n\tvar es_number_isSafeInteger = {};\n\n\t// https://tc39.github.io/ecma262/#sec-number.max_safe_integer\n\n\t_export({\n\t  target: 'Number',\n\t  stat: true\n\t}, {\n\t  MAX_SAFE_INTEGER: 0x1FFFFFFFFFFFFF\n\t});\n\tvar es_number_maxSafeInteger = {};\n\n\t// https://tc39.github.io/ecma262/#sec-number.min_safe_integer\n\n\t_export({\n\t  target: 'Number',\n\t  stat: true\n\t}, {\n\t  MIN_SAFE_INTEGER: -0x1FFFFFFFFFFFFF\n\t});\n\tvar es_number_minSafeInteger = {};\n\n\t// https://tc39.github.io/ecma262/#sec-number.parseFloat\n\n\t_export({\n\t  target: 'Number',\n\t  stat: true,\n\t  forced: Number.parseFloat != numberParseFloat\n\t}, {\n\t  parseFloat: numberParseFloat\n\t});\n\tvar es_number_parseFloat = {};\n\n\t// https://tc39.github.io/ecma262/#sec-number.parseint\n\n\t_export({\n\t  target: 'Number',\n\t  stat: true,\n\t  forced: Number.parseInt != numberParseInt\n\t}, {\n\t  parseInt: numberParseInt\n\t});\n\tvar es_number_parseInt = {};\n\n\t// https://tc39.github.io/ecma262/#sec-thisnumbervalue\n\n\tvar thisNumberValue = function thisNumberValue(value) {\n\t  if (typeof value != 'number' && classofRaw(value) != 'Number') {\n\t    throw TypeError('Incorrect invocation');\n\t  }\n\n\t  return +value;\n\t};\n\n\t'use strict';\n\n\tvar nativeToFixed = 1.0.toFixed;\n\tvar floor$3 = Math.floor;\n\n\tvar pow = function pow(x, n, acc) {\n\t  return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n\t};\n\n\tvar log = function log(x) {\n\t  var n = 0;\n\t  var x2 = x;\n\n\t  while (x2 >= 4096) {\n\t    n += 12;\n\t    x2 /= 4096;\n\t  }\n\n\t  while (x2 >= 2) {\n\t    n += 1;\n\t    x2 /= 2;\n\t  }\n\n\t  return n;\n\t};\n\n\tvar FORCED$9 = nativeToFixed && (0.00008.toFixed(3) !== '0.000' || 0.9.toFixed(0) !== '1' || 1.255.toFixed(2) !== '1.25' || 1000000000000000128.0.toFixed(0) !== '1000000000000000128') || !fails(function () {\n\t  // V8 ~ Android 4.3-\n\t  nativeToFixed.call({});\n\t}); // `Number.prototype.toFixed` method\n\t// https://tc39.github.io/ecma262/#sec-number.prototype.tofixed\n\n\t_export({\n\t  target: 'Number',\n\t  proto: true,\n\t  forced: FORCED$9\n\t}, {\n\t  // eslint-disable-next-line max-statements\n\t  toFixed: function toFixed(fractionDigits) {\n\t    var number = thisNumberValue(this);\n\t    var fractDigits = toInteger(fractionDigits);\n\t    var data = [0, 0, 0, 0, 0, 0];\n\t    var sign = '';\n\t    var result = '0';\n\t    var e, z, j, k;\n\n\t    var multiply = function multiply(n, c) {\n\t      var index = -1;\n\t      var c2 = c;\n\n\t      while (++index < 6) {\n\t        c2 += n * data[index];\n\t        data[index] = c2 % 1e7;\n\t        c2 = floor$3(c2 / 1e7);\n\t      }\n\t    };\n\n\t    var divide = function divide(n) {\n\t      var index = 6;\n\t      var c = 0;\n\n\t      while (--index >= 0) {\n\t        c += data[index];\n\t        data[index] = floor$3(c / n);\n\t        c = c % n * 1e7;\n\t      }\n\t    };\n\n\t    var dataToString = function dataToString() {\n\t      var index = 6;\n\t      var s = '';\n\n\t      while (--index >= 0) {\n\t        if (s !== '' || index === 0 || data[index] !== 0) {\n\t          var t = String(data[index]);\n\t          s = s === '' ? t : s + stringRepeat.call('0', 7 - t.length) + t;\n\t        }\n\t      }\n\n\t      return s;\n\t    };\n\n\t    if (fractDigits < 0 || fractDigits > 20) throw RangeError('Incorrect fraction digits'); // eslint-disable-next-line no-self-compare\n\n\t    if (number != number) return 'NaN';\n\t    if (number <= -1e21 || number >= 1e21) return String(number);\n\n\t    if (number < 0) {\n\t      sign = '-';\n\t      number = -number;\n\t    }\n\n\t    if (number > 1e-21) {\n\t      e = log(number * pow(2, 69, 1)) - 69;\n\t      z = e < 0 ? number * pow(2, -e, 1) : number / pow(2, e, 1);\n\t      z *= 0x10000000000000;\n\t      e = 52 - e;\n\n\t      if (e > 0) {\n\t        multiply(0, z);\n\t        j = fractDigits;\n\n\t        while (j >= 7) {\n\t          multiply(1e7, 0);\n\t          j -= 7;\n\t        }\n\n\t        multiply(pow(10, j, 1), 0);\n\t        j = e - 1;\n\n\t        while (j >= 23) {\n\t          divide(1 << 23);\n\t          j -= 23;\n\t        }\n\n\t        divide(1 << j);\n\t        multiply(1, 1);\n\t        divide(2);\n\t        result = dataToString();\n\t      } else {\n\t        multiply(0, z);\n\t        multiply(1 << -e, 0);\n\t        result = dataToString() + stringRepeat.call('0', fractDigits);\n\t      }\n\t    }\n\n\t    if (fractDigits > 0) {\n\t      k = result.length;\n\t      result = sign + (k <= fractDigits ? '0.' + stringRepeat.call('0', fractDigits - k) + result : result.slice(0, k - fractDigits) + '.' + result.slice(k - fractDigits));\n\t    } else {\n\t      result = sign + result;\n\t    }\n\n\t    return result;\n\t  }\n\t});\n\tvar es_number_toFixed = {};\n\n\t'use strict';\n\n\tvar nativeToPrecision = 1.0.toPrecision;\n\tvar FORCED$a = fails(function () {\n\t  // IE7-\n\t  return nativeToPrecision.call(1, undefined) !== '1';\n\t}) || !fails(function () {\n\t  // V8 ~ Android 4.3-\n\t  nativeToPrecision.call({});\n\t}); // `Number.prototype.toPrecision` method\n\t// https://tc39.github.io/ecma262/#sec-number.prototype.toprecision\n\n\t_export({\n\t  target: 'Number',\n\t  proto: true,\n\t  forced: FORCED$a\n\t}, {\n\t  toPrecision: function toPrecision(precision) {\n\t    return precision === undefined ? nativeToPrecision.call(thisNumberValue(this)) : nativeToPrecision.call(thisNumberValue(this), precision);\n\t  }\n\t});\n\tvar es_number_toPrecision = {};\n\n\tvar log$1 = Math.log; // `Math.log1p` method implementation\n\t// https://tc39.github.io/ecma262/#sec-math.log1p\n\n\tvar mathLog1p = Math.log1p || function log1p(x) {\n\t  return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : log$1(1 + x);\n\t};\n\n\tvar nativeAcosh = Math.acosh;\n\tvar log$2 = Math.log;\n\tvar sqrt = Math.sqrt;\n\tvar LN2 = Math.LN2;\n\tvar FORCED$b = !nativeAcosh // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n\t|| Math.floor(nativeAcosh(Number.MAX_VALUE)) != 710 // Tor Browser bug: Math.acosh(Infinity) -> NaN\n\t|| nativeAcosh(Infinity) != Infinity; // `Math.acosh` method\n\t// https://tc39.github.io/ecma262/#sec-math.acosh\n\n\t_export({\n\t  target: 'Math',\n\t  stat: true,\n\t  forced: FORCED$b\n\t}, {\n\t  acosh: function acosh(x) {\n\t    return (x = +x) < 1 ? NaN : x > 94906265.62425156 ? log$2(x) + LN2 : mathLog1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n\t  }\n\t});\n\tvar es_math_acosh = {};\n\n\tvar nativeAsinh = Math.asinh;\n\tvar log$3 = Math.log;\n\tvar sqrt$1 = Math.sqrt;\n\n\tfunction asinh(x) {\n\t  return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : log$3(x + sqrt$1(x * x + 1));\n\t} // `Math.asinh` method\n\t// https://tc39.github.io/ecma262/#sec-math.asinh\n\t// Tor Browser bug: Math.asinh(0) -> -0\n\n\n\t_export({\n\t  target: 'Math',\n\t  stat: true,\n\t  forced: !(nativeAsinh && 1 / nativeAsinh(0) > 0)\n\t}, {\n\t  asinh: asinh\n\t});\n\tvar es_math_asinh = {};\n\n\tvar nativeAtanh = Math.atanh;\n\tvar log$4 = Math.log; // `Math.atanh` method\n\t// https://tc39.github.io/ecma262/#sec-math.atanh\n\t// Tor Browser bug: Math.atanh(-0) -> 0\n\n\t_export({\n\t  target: 'Math',\n\t  stat: true,\n\t  forced: !(nativeAtanh && 1 / nativeAtanh(-0) < 0)\n\t}, {\n\t  atanh: function atanh(x) {\n\t    return (x = +x) == 0 ? x : log$4((1 + x) / (1 - x)) / 2;\n\t  }\n\t});\n\tvar es_math_atanh = {};\n\n\t// `Math.sign` method implementation\n\t// https://tc39.github.io/ecma262/#sec-math.sign\n\tvar mathSign = Math.sign || function sign(x) {\n\t  // eslint-disable-next-line no-self-compare\n\t  return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n\t};\n\n\tvar abs$1 = Math.abs;\n\tvar pow$1 = Math.pow; // `Math.cbrt` method\n\t// https://tc39.github.io/ecma262/#sec-math.cbrt\n\n\t_export({\n\t  target: 'Math',\n\t  stat: true\n\t}, {\n\t  cbrt: function cbrt(x) {\n\t    return mathSign(x = +x) * pow$1(abs$1(x), 1 / 3);\n\t  }\n\t});\n\tvar es_math_cbrt = {};\n\n\tvar floor$4 = Math.floor;\n\tvar log$5 = Math.log;\n\tvar LOG2E = Math.LOG2E; // `Math.clz32` method\n\t// https://tc39.github.io/ecma262/#sec-math.clz32\n\n\t_export({\n\t  target: 'Math',\n\t  stat: true\n\t}, {\n\t  clz32: function clz32(x) {\n\t    return (x >>>= 0) ? 31 - floor$4(log$5(x + 0.5) * LOG2E) : 32;\n\t  }\n\t});\n\tvar es_math_clz32 = {};\n\n\tvar nativeExpm1 = Math.expm1;\n\tvar exp = Math.exp; // `Math.expm1` method implementation\n\t// https://tc39.github.io/ecma262/#sec-math.expm1\n\n\tvar mathExpm1 = !nativeExpm1 // Old FF bug\n\t|| nativeExpm1(10) > 22025.465794806719 || nativeExpm1(10) < 22025.4657948067165168 // Tor Browser bug\n\t|| nativeExpm1(-2e-17) != -2e-17 ? function expm1(x) {\n\t  return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : exp(x) - 1;\n\t} : nativeExpm1;\n\n\tvar nativeCosh = Math.cosh;\n\tvar abs$2 = Math.abs;\n\tvar E = Math.E; // `Math.cosh` method\n\t// https://tc39.github.io/ecma262/#sec-math.cosh\n\n\t_export({\n\t  target: 'Math',\n\t  stat: true,\n\t  forced: !nativeCosh || nativeCosh(710) === Infinity\n\t}, {\n\t  cosh: function cosh(x) {\n\t    var t = mathExpm1(abs$2(x) - 1) + 1;\n\t    return (t + 1 / (t * E * E)) * (E / 2);\n\t  }\n\t});\n\tvar es_math_cosh = {};\n\n\t// https://tc39.github.io/ecma262/#sec-math.expm1\n\n\t_export({\n\t  target: 'Math',\n\t  stat: true,\n\t  forced: mathExpm1 != Math.expm1\n\t}, {\n\t  expm1: mathExpm1\n\t});\n\tvar es_math_expm1 = {};\n\n\tvar abs$3 = Math.abs;\n\tvar pow$2 = Math.pow;\n\tvar EPSILON = pow$2(2, -52);\n\tvar EPSILON32 = pow$2(2, -23);\n\tvar MAX32 = pow$2(2, 127) * (2 - EPSILON32);\n\tvar MIN32 = pow$2(2, -126);\n\n\tvar roundTiesToEven = function roundTiesToEven(n) {\n\t  return n + 1 / EPSILON - 1 / EPSILON;\n\t}; // `Math.fround` method implementation\n\t// https://tc39.github.io/ecma262/#sec-math.fround\n\n\n\tvar mathFround = Math.fround || function fround(x) {\n\t  var $abs = abs$3(x);\n\t  var $sign = mathSign(x);\n\t  var a, result;\n\t  if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n\t  a = (1 + EPSILON32 / EPSILON) * $abs;\n\t  result = a - (a - $abs); // eslint-disable-next-line no-self-compare\n\n\t  if (result > MAX32 || result != result) return $sign * Infinity;\n\t  return $sign * result;\n\t};\n\n\t// https://tc39.github.io/ecma262/#sec-math.fround\n\n\t_export({\n\t  target: 'Math',\n\t  stat: true\n\t}, {\n\t  fround: mathFround\n\t});\n\tvar es_math_fround = {};\n\n\tvar $hypot = Math.hypot;\n\tvar abs$4 = Math.abs;\n\tvar sqrt$2 = Math.sqrt; // Chrome 77 bug\n\t// https://bugs.chromium.org/p/v8/issues/detail?id=9546\n\n\tvar BUGGY = !!$hypot && $hypot(Infinity, NaN) !== Infinity; // `Math.hypot` method\n\t// https://tc39.github.io/ecma262/#sec-math.hypot\n\n\t_export({\n\t  target: 'Math',\n\t  stat: true,\n\t  forced: BUGGY\n\t}, {\n\t  hypot: function hypot(value1, value2) {\n\t    // eslint-disable-line no-unused-vars\n\t    var sum = 0;\n\t    var i = 0;\n\t    var aLen = arguments.length;\n\t    var larg = 0;\n\t    var arg, div;\n\n\t    while (i < aLen) {\n\t      arg = abs$4(arguments[i++]);\n\n\t      if (larg < arg) {\n\t        div = larg / arg;\n\t        sum = sum * div * div + 1;\n\t        larg = arg;\n\t      } else if (arg > 0) {\n\t        div = arg / larg;\n\t        sum += div * div;\n\t      } else sum += arg;\n\t    }\n\n\t    return larg === Infinity ? Infinity : larg * sqrt$2(sum);\n\t  }\n\t});\n\tvar es_math_hypot = {};\n\n\tvar nativeImul = Math.imul;\n\tvar FORCED$c = fails(function () {\n\t  return nativeImul(0xFFFFFFFF, 5) != -5 || nativeImul.length != 2;\n\t}); // `Math.imul` method\n\t// https://tc39.github.io/ecma262/#sec-math.imul\n\t// some WebKit versions fails with big numbers, some has wrong arity\n\n\t_export({\n\t  target: 'Math',\n\t  stat: true,\n\t  forced: FORCED$c\n\t}, {\n\t  imul: function imul(x, y) {\n\t    var UINT16 = 0xFFFF;\n\t    var xn = +x;\n\t    var yn = +y;\n\t    var xl = UINT16 & xn;\n\t    var yl = UINT16 & yn;\n\t    return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n\t  }\n\t});\n\tvar es_math_imul = {};\n\n\tvar log$6 = Math.log;\n\tvar LOG10E = Math.LOG10E; // `Math.log10` method\n\t// https://tc39.github.io/ecma262/#sec-math.log10\n\n\t_export({\n\t  target: 'Math',\n\t  stat: true\n\t}, {\n\t  log10: function log10(x) {\n\t    return log$6(x) * LOG10E;\n\t  }\n\t});\n\tvar es_math_log10 = {};\n\n\t// https://tc39.github.io/ecma262/#sec-math.log1p\n\n\t_export({\n\t  target: 'Math',\n\t  stat: true\n\t}, {\n\t  log1p: mathLog1p\n\t});\n\tvar es_math_log1p = {};\n\n\tvar log$7 = Math.log;\n\tvar LN2$1 = Math.LN2; // `Math.log2` method\n\t// https://tc39.github.io/ecma262/#sec-math.log2\n\n\t_export({\n\t  target: 'Math',\n\t  stat: true\n\t}, {\n\t  log2: function log2(x) {\n\t    return log$7(x) / LN2$1;\n\t  }\n\t});\n\tvar es_math_log2 = {};\n\n\t// https://tc39.github.io/ecma262/#sec-math.sign\n\n\t_export({\n\t  target: 'Math',\n\t  stat: true\n\t}, {\n\t  sign: mathSign\n\t});\n\tvar es_math_sign = {};\n\n\tvar abs$5 = Math.abs;\n\tvar exp$1 = Math.exp;\n\tvar E$1 = Math.E;\n\tvar FORCED$d = fails(function () {\n\t  return Math.sinh(-2e-17) != -2e-17;\n\t}); // `Math.sinh` method\n\t// https://tc39.github.io/ecma262/#sec-math.sinh\n\t// V8 near Chromium 38 has a problem with very small numbers\n\n\t_export({\n\t  target: 'Math',\n\t  stat: true,\n\t  forced: FORCED$d\n\t}, {\n\t  sinh: function sinh(x) {\n\t    return abs$5(x = +x) < 1 ? (mathExpm1(x) - mathExpm1(-x)) / 2 : (exp$1(x - 1) - exp$1(-x - 1)) * (E$1 / 2);\n\t  }\n\t});\n\tvar es_math_sinh = {};\n\n\tvar exp$2 = Math.exp; // `Math.tanh` method\n\t// https://tc39.github.io/ecma262/#sec-math.tanh\n\n\t_export({\n\t  target: 'Math',\n\t  stat: true\n\t}, {\n\t  tanh: function tanh(x) {\n\t    var a = mathExpm1(x = +x);\n\t    var b = mathExpm1(-x);\n\t    return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp$2(x) + exp$2(-x));\n\t  }\n\t});\n\tvar es_math_tanh = {};\n\n\t// https://tc39.github.io/ecma262/#sec-math-@@tostringtag\n\n\tsetToStringTag(Math, 'Math', true);\n\tvar es_math_toStringTag = {};\n\n\tvar ceil$2 = Math.ceil;\n\tvar floor$5 = Math.floor; // `Math.trunc` method\n\t// https://tc39.github.io/ecma262/#sec-math.trunc\n\n\t_export({\n\t  target: 'Math',\n\t  stat: true\n\t}, {\n\t  trunc: function trunc(it) {\n\t    return (it > 0 ? floor$5 : ceil$2)(it);\n\t  }\n\t});\n\tvar es_math_trunc = {};\n\n\t// https://tc39.github.io/ecma262/#sec-date.now\n\n\t_export({\n\t  target: 'Date',\n\t  stat: true\n\t}, {\n\t  now: function now() {\n\t    return new Date().getTime();\n\t  }\n\t});\n\tvar es_date_now = {};\n\n\t'use strict';\n\n\tvar FORCED$e = fails(function () {\n\t  return new Date(NaN).toJSON() !== null || Date.prototype.toJSON.call({\n\t    toISOString: function toISOString() {\n\t      return 1;\n\t    }\n\t  }) !== 1;\n\t}); // `Date.prototype.toJSON` method\n\t// https://tc39.github.io/ecma262/#sec-date.prototype.tojson\n\n\t_export({\n\t  target: 'Date',\n\t  proto: true,\n\t  forced: FORCED$e\n\t}, {\n\t  // eslint-disable-next-line no-unused-vars\n\t  toJSON: function toJSON(key) {\n\t    var O = toObject(this);\n\t    var pv = toPrimitive(O);\n\t    return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString();\n\t  }\n\t});\n\tvar es_date_toJson = {};\n\n\t'use strict';\n\n\tvar padStart = stringPad.start;\n\tvar abs$6 = Math.abs;\n\tvar DatePrototype = Date.prototype;\n\tvar getTime = DatePrototype.getTime;\n\tvar nativeDateToISOString = DatePrototype.toISOString; // `Date.prototype.toISOString` method implementation\n\t// https://tc39.github.io/ecma262/#sec-date.prototype.toisostring\n\t// PhantomJS / old WebKit fails here:\n\n\tvar dateToIsoString = fails(function () {\n\t  return nativeDateToISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z';\n\t}) || !fails(function () {\n\t  nativeDateToISOString.call(new Date(NaN));\n\t}) ? function toISOString() {\n\t  if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value');\n\t  var date = this;\n\t  var year = date.getUTCFullYear();\n\t  var milliseconds = date.getUTCMilliseconds();\n\t  var sign = year < 0 ? '-' : year > 9999 ? '+' : '';\n\t  return sign + padStart(abs$6(year), sign ? 6 : 4, 0) + '-' + padStart(date.getUTCMonth() + 1, 2, 0) + '-' + padStart(date.getUTCDate(), 2, 0) + 'T' + padStart(date.getUTCHours(), 2, 0) + ':' + padStart(date.getUTCMinutes(), 2, 0) + ':' + padStart(date.getUTCSeconds(), 2, 0) + '.' + padStart(milliseconds, 3, 0) + 'Z';\n\t} : nativeDateToISOString;\n\n\t// https://tc39.github.io/ecma262/#sec-date.prototype.toisostring\n\t// PhantomJS / old WebKit has a broken implementations\n\n\t_export({\n\t  target: 'Date',\n\t  proto: true,\n\t  forced: Date.prototype.toISOString !== dateToIsoString\n\t}, {\n\t  toISOString: dateToIsoString\n\t});\n\tvar es_date_toIsoString = {};\n\n\tvar DatePrototype$1 = Date.prototype;\n\tvar INVALID_DATE = 'Invalid Date';\n\tvar TO_STRING$1 = 'toString';\n\tvar nativeDateToString = DatePrototype$1[TO_STRING$1];\n\tvar getTime$1 = DatePrototype$1.getTime; // `Date.prototype.toString` method\n\t// https://tc39.github.io/ecma262/#sec-date.prototype.tostring\n\n\tif (new Date(NaN) + '' != INVALID_DATE) {\n\t  redefine(DatePrototype$1, TO_STRING$1, function toString() {\n\t    var value = getTime$1.call(this); // eslint-disable-next-line no-self-compare\n\n\t    return value === value ? nativeDateToString.call(this) : INVALID_DATE;\n\t  });\n\t}\n\n\tvar es_date_toString = {};\n\n\t'use strict';\n\n\tvar dateToPrimitive = function dateToPrimitive(hint) {\n\t  if (hint !== 'string' && hint !== 'number' && hint !== 'default') {\n\t    throw TypeError('Incorrect hint');\n\t  }\n\n\t  return toPrimitive(anObject(this), hint !== 'number');\n\t};\n\n\tvar TO_PRIMITIVE$1 = wellKnownSymbol('toPrimitive');\n\tvar DatePrototype$2 = Date.prototype; // `Date.prototype[@@toPrimitive]` method\n\t// https://tc39.github.io/ecma262/#sec-date.prototype-@@toprimitive\n\n\tif (!(TO_PRIMITIVE$1 in DatePrototype$2)) {\n\t  createNonEnumerableProperty(DatePrototype$2, TO_PRIMITIVE$1, dateToPrimitive);\n\t}\n\n\tvar es_date_toPrimitive = {};\n\n\tvar $stringify$1 = getBuiltIn('JSON', 'stringify');\n\tvar re = /[\\uD800-\\uDFFF]/g;\n\tvar low = /^[\\uD800-\\uDBFF]$/;\n\tvar hi = /^[\\uDC00-\\uDFFF]$/;\n\n\tvar fix = function fix(match, offset, string) {\n\t  var prev = string.charAt(offset - 1);\n\t  var next = string.charAt(offset + 1);\n\n\t  if (low.test(match) && !hi.test(next) || hi.test(match) && !low.test(prev)) {\n\t    return \"\\\\u\" + match.charCodeAt(0).toString(16);\n\t  }\n\n\t  return match;\n\t};\n\n\tvar FORCED$f = fails(function () {\n\t  return $stringify$1(\"\\uDF06\\uD834\") !== \"\\\"\\\\udf06\\\\ud834\\\"\" || $stringify$1(\"\\uDEAD\") !== \"\\\"\\\\udead\\\"\";\n\t});\n\n\tif ($stringify$1) {\n\t  // https://github.com/tc39/proposal-well-formed-stringify\n\t  _export({\n\t    target: 'JSON',\n\t    stat: true,\n\t    forced: FORCED$f\n\t  }, {\n\t    // eslint-disable-next-line no-unused-vars\n\t    stringify: function stringify(it, replacer, space) {\n\t      var result = $stringify$1.apply(null, arguments);\n\t      return typeof result == 'string' ? result.replace(re, fix) : result;\n\t    }\n\t  });\n\t}\n\n\tvar es_json_stringify = {};\n\n\t// https://tc39.github.io/ecma262/#sec-json-@@tostringtag\n\n\tsetToStringTag(global_1.JSON, 'JSON', true);\n\tvar es_json_toStringTag = {};\n\n\tvar nativePromiseConstructor = global_1.Promise;\n\n\tvar redefineAll = function redefineAll(target, src, options) {\n\t  for (var key in src) {\n\t    redefine(target, key, src[key], options);\n\t  }\n\n\t  return target;\n\t};\n\n\tvar anInstance = function anInstance(it, Constructor, name) {\n\t  if (!(it instanceof Constructor)) {\n\t    throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n\t  }\n\n\t  return it;\n\t};\n\n\tvar engineIsIos = /(iphone|ipod|ipad).*applewebkit/i.test(engineUserAgent);\n\n\tvar location = global_1.location;\n\tvar set$1 = global_1.setImmediate;\n\tvar clear = global_1.clearImmediate;\n\tvar process$2 = global_1.process;\n\tvar MessageChannel = global_1.MessageChannel;\n\tvar Dispatch = global_1.Dispatch;\n\tvar counter = 0;\n\tvar queue = {};\n\tvar ONREADYSTATECHANGE = 'onreadystatechange';\n\tvar defer, channel, port;\n\n\tvar run = function run(id) {\n\t  // eslint-disable-next-line no-prototype-builtins\n\t  if (queue.hasOwnProperty(id)) {\n\t    var fn = queue[id];\n\t    delete queue[id];\n\t    fn();\n\t  }\n\t};\n\n\tvar runner = function runner(id) {\n\t  return function () {\n\t    run(id);\n\t  };\n\t};\n\n\tvar listener = function listener(event) {\n\t  run(event.data);\n\t};\n\n\tvar post = function post(id) {\n\t  // old engines have not location.origin\n\t  global_1.postMessage(id + '', location.protocol + '//' + location.host);\n\t}; // Node.js 0.9+ & IE10+ has setImmediate, otherwise:\n\n\n\tif (!set$1 || !clear) {\n\t  set$1 = function setImmediate(fn) {\n\t    var args = [];\n\t    var i = 1;\n\n\t    while (arguments.length > i) {\n\t      args.push(arguments[i++]);\n\t    }\n\n\t    queue[++counter] = function () {\n\t      // eslint-disable-next-line no-new-func\n\t      (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n\t    };\n\n\t    defer(counter);\n\t    return counter;\n\t  };\n\n\t  clear = function clearImmediate(id) {\n\t    delete queue[id];\n\t  }; // Node.js 0.8-\n\n\n\t  if (classofRaw(process$2) == 'process') {\n\t    defer = function defer(id) {\n\t      process$2.nextTick(runner(id));\n\t    }; // Sphere (JS game engine) Dispatch API\n\n\t  } else if (Dispatch && Dispatch.now) {\n\t    defer = function defer(id) {\n\t      Dispatch.now(runner(id));\n\t    }; // Browsers with MessageChannel, includes WebWorkers\n\t    // except iOS - https://github.com/zloirock/core-js/issues/624\n\n\t  } else if (MessageChannel && !engineIsIos) {\n\t    channel = new MessageChannel();\n\t    port = channel.port2;\n\t    channel.port1.onmessage = listener;\n\t    defer = functionBindContext(port.postMessage, port, 1); // Browsers with postMessage, skip WebWorkers\n\t    // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n\t  } else if (global_1.addEventListener && typeof postMessage == 'function' && !global_1.importScripts && !fails(post) && location.protocol !== 'file:') {\n\t    defer = post;\n\t    global_1.addEventListener('message', listener, false); // IE8-\n\t  } else if (ONREADYSTATECHANGE in documentCreateElement('script')) {\n\t    defer = function defer(id) {\n\t      html.appendChild(documentCreateElement('script'))[ONREADYSTATECHANGE] = function () {\n\t        html.removeChild(this);\n\t        run(id);\n\t      };\n\t    }; // Rest old browsers\n\n\t  } else {\n\t    defer = function defer(id) {\n\t      setTimeout(runner(id), 0);\n\t    };\n\t  }\n\t}\n\n\tvar task = {\n\t  set: set$1,\n\t  clear: clear\n\t};\n\tvar task_1 = task.set;\n\tvar task_2 = task.clear;\n\n\tvar getOwnPropertyDescriptor$7 = objectGetOwnPropertyDescriptor.f;\n\tvar macrotask = task.set;\n\tvar MutationObserver = global_1.MutationObserver || global_1.WebKitMutationObserver;\n\tvar process$3 = global_1.process;\n\tvar Promise$1 = global_1.Promise;\n\tvar IS_NODE = classofRaw(process$3) == 'process'; // Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\n\n\tvar queueMicrotaskDescriptor = getOwnPropertyDescriptor$7(global_1, 'queueMicrotask');\n\tvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\tvar flush, head, last, notify, toggle, node, promise, then; // modern engines have queueMicrotask method\n\n\tif (!queueMicrotask) {\n\t  flush = function flush() {\n\t    var parent, fn;\n\t    if (IS_NODE && (parent = process$3.domain)) parent.exit();\n\n\t    while (head) {\n\t      fn = head.fn;\n\t      head = head.next;\n\n\t      try {\n\t        fn();\n\t      } catch (error) {\n\t        if (head) notify();else last = undefined;\n\t        throw error;\n\t      }\n\t    }\n\n\t    last = undefined;\n\t    if (parent) parent.enter();\n\t  }; // Node.js\n\n\n\t  if (IS_NODE) {\n\t    notify = function notify() {\n\t      process$3.nextTick(flush);\n\t    }; // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n\n\t  } else if (MutationObserver && !engineIsIos) {\n\t    toggle = true;\n\t    node = document.createTextNode('');\n\t    new MutationObserver(flush).observe(node, {\n\t      characterData: true\n\t    });\n\n\t    notify = function notify() {\n\t      node.data = toggle = !toggle;\n\t    }; // environments with maybe non-completely correct, but existent Promise\n\n\t  } else if (Promise$1 && Promise$1.resolve) {\n\t    // Promise.resolve without an argument throws an error in LG WebOS 2\n\t    promise = Promise$1.resolve(undefined);\n\t    then = promise.then;\n\n\t    notify = function notify() {\n\t      then.call(promise, flush);\n\t    }; // for other environments - macrotask based on:\n\t    // - setImmediate\n\t    // - MessageChannel\n\t    // - window.postMessag\n\t    // - onreadystatechange\n\t    // - setTimeout\n\n\t  } else {\n\t    notify = function notify() {\n\t      // strange IE + webpack dev server bug - use .call(global)\n\t      macrotask.call(global_1, flush);\n\t    };\n\t  }\n\t}\n\n\tvar microtask = queueMicrotask || function (fn) {\n\t  var task = {\n\t    fn: fn,\n\t    next: undefined\n\t  };\n\t  if (last) last.next = task;\n\n\t  if (!head) {\n\t    head = task;\n\t    notify();\n\t  }\n\n\t  last = task;\n\t};\n\n\t'use strict';\n\n\tvar PromiseCapability = function PromiseCapability(C) {\n\t  var resolve, reject;\n\t  this.promise = new C(function ($$resolve, $$reject) {\n\t    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n\t    resolve = $$resolve;\n\t    reject = $$reject;\n\t  });\n\t  this.resolve = aFunction$1(resolve);\n\t  this.reject = aFunction$1(reject);\n\t}; // 25.4.1.5 NewPromiseCapability(C)\n\n\n\tvar f$7 = function f(C) {\n\t  return new PromiseCapability(C);\n\t};\n\n\tvar newPromiseCapability = {\n\t  f: f$7\n\t};\n\n\tvar promiseResolve = function promiseResolve(C, x) {\n\t  anObject(C);\n\t  if (isObject(x) && x.constructor === C) return x;\n\t  var promiseCapability = newPromiseCapability.f(C);\n\t  var resolve = promiseCapability.resolve;\n\t  resolve(x);\n\t  return promiseCapability.promise;\n\t};\n\n\tvar hostReportErrors = function hostReportErrors(a, b) {\n\t  var console = global_1.console;\n\n\t  if (console && console.error) {\n\t    arguments.length === 1 ? console.error(a) : console.error(a, b);\n\t  }\n\t};\n\n\tvar perform = function perform(exec) {\n\t  try {\n\t    return {\n\t      error: false,\n\t      value: exec()\n\t    };\n\t  } catch (error) {\n\t    return {\n\t      error: true,\n\t      value: error\n\t    };\n\t  }\n\t};\n\n\t'use strict';\n\n\tvar task$1 = task.set;\n\tvar SPECIES$6 = wellKnownSymbol('species');\n\tvar PROMISE = 'Promise';\n\tvar getInternalState$5 = internalState.get;\n\tvar setInternalState$5 = internalState.set;\n\tvar getInternalPromiseState = internalState.getterFor(PROMISE);\n\tvar PromiseConstructor = nativePromiseConstructor;\n\tvar TypeError$1 = global_1.TypeError;\n\tvar document$2 = global_1.document;\n\tvar process$4 = global_1.process;\n\tvar $fetch = getBuiltIn('fetch');\n\tvar newPromiseCapability$1 = newPromiseCapability.f;\n\tvar newGenericPromiseCapability = newPromiseCapability$1;\n\tvar IS_NODE$1 = classofRaw(process$4) == 'process';\n\tvar DISPATCH_EVENT = !!(document$2 && document$2.createEvent && global_1.dispatchEvent);\n\tvar UNHANDLED_REJECTION = 'unhandledrejection';\n\tvar REJECTION_HANDLED = 'rejectionhandled';\n\tvar PENDING = 0;\n\tvar FULFILLED = 1;\n\tvar REJECTED = 2;\n\tvar HANDLED = 1;\n\tvar UNHANDLED = 2;\n\tvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\tvar FORCED$g = isForced_1(PROMISE, function () {\n\t  var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor);\n\n\t  if (!GLOBAL_CORE_JS_PROMISE) {\n\t    // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n\t    // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n\t    // We can't detect it synchronously, so just check versions\n\t    if (engineV8Version === 66) return true; // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n\n\t    if (!IS_NODE$1 && typeof PromiseRejectionEvent != 'function') return true;\n\t  } // We need Promise#finally in the pure version for preventing prototype pollution\n\n\n\t  if (isPure && !PromiseConstructor.prototype['finally']) return true; // We can't use @@species feature detection in V8 since it causes\n\t  // deoptimization and performance degradation\n\t  // https://github.com/zloirock/core-js/issues/679\n\n\t  if (engineV8Version >= 51 && /native code/.test(PromiseConstructor)) return false; // Detect correctness of subclassing with @@species support\n\n\t  var promise = PromiseConstructor.resolve(1);\n\n\t  var FakePromise = function FakePromise(exec) {\n\t    exec(function () {\n\t      /* empty */\n\t    }, function () {\n\t      /* empty */\n\t    });\n\t  };\n\n\t  var constructor = promise.constructor = {};\n\t  constructor[SPECIES$6] = FakePromise;\n\t  return !(promise.then(function () {\n\t    /* empty */\n\t  }) instanceof FakePromise);\n\t});\n\tvar INCORRECT_ITERATION$1 = FORCED$g || !checkCorrectnessOfIteration(function (iterable) {\n\t  PromiseConstructor.all(iterable)['catch'](function () {\n\t    /* empty */\n\t  });\n\t}); // helpers\n\n\tvar isThenable = function isThenable(it) {\n\t  var then;\n\t  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n\t};\n\n\tvar notify$1 = function notify(promise, state, isReject) {\n\t  if (state.notified) return;\n\t  state.notified = true;\n\t  var chain = state.reactions;\n\t  microtask(function () {\n\t    var value = state.value;\n\t    var ok = state.state == FULFILLED;\n\t    var index = 0; // variable length - can't use forEach\n\n\t    while (chain.length > index) {\n\t      var reaction = chain[index++];\n\t      var handler = ok ? reaction.ok : reaction.fail;\n\t      var resolve = reaction.resolve;\n\t      var reject = reaction.reject;\n\t      var domain = reaction.domain;\n\t      var result, then, exited;\n\n\t      try {\n\t        if (handler) {\n\t          if (!ok) {\n\t            if (state.rejection === UNHANDLED) onHandleUnhandled(promise, state);\n\t            state.rejection = HANDLED;\n\t          }\n\n\t          if (handler === true) result = value;else {\n\t            if (domain) domain.enter();\n\t            result = handler(value); // can throw\n\n\t            if (domain) {\n\t              domain.exit();\n\t              exited = true;\n\t            }\n\t          }\n\n\t          if (result === reaction.promise) {\n\t            reject(TypeError$1('Promise-chain cycle'));\n\t          } else if (then = isThenable(result)) {\n\t            then.call(result, resolve, reject);\n\t          } else resolve(result);\n\t        } else reject(value);\n\t      } catch (error) {\n\t        if (domain && !exited) domain.exit();\n\t        reject(error);\n\t      }\n\t    }\n\n\t    state.reactions = [];\n\t    state.notified = false;\n\t    if (isReject && !state.rejection) onUnhandled(promise, state);\n\t  });\n\t};\n\n\tvar dispatchEvent = function dispatchEvent(name, promise, reason) {\n\t  var event, handler;\n\n\t  if (DISPATCH_EVENT) {\n\t    event = document$2.createEvent('Event');\n\t    event.promise = promise;\n\t    event.reason = reason;\n\t    event.initEvent(name, false, true);\n\t    global_1.dispatchEvent(event);\n\t  } else event = {\n\t    promise: promise,\n\t    reason: reason\n\t  };\n\n\t  if (handler = global_1['on' + name]) handler(event);else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n\t};\n\n\tvar onUnhandled = function onUnhandled(promise, state) {\n\t  task$1.call(global_1, function () {\n\t    var value = state.value;\n\t    var IS_UNHANDLED = isUnhandled(state);\n\t    var result;\n\n\t    if (IS_UNHANDLED) {\n\t      result = perform(function () {\n\t        if (IS_NODE$1) {\n\t          process$4.emit('unhandledRejection', value, promise);\n\t        } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n\t      }); // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n\n\t      state.rejection = IS_NODE$1 || isUnhandled(state) ? UNHANDLED : HANDLED;\n\t      if (result.error) throw result.value;\n\t    }\n\t  });\n\t};\n\n\tvar isUnhandled = function isUnhandled(state) {\n\t  return state.rejection !== HANDLED && !state.parent;\n\t};\n\n\tvar onHandleUnhandled = function onHandleUnhandled(promise, state) {\n\t  task$1.call(global_1, function () {\n\t    if (IS_NODE$1) {\n\t      process$4.emit('rejectionHandled', promise);\n\t    } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n\t  });\n\t};\n\n\tvar bind = function bind(fn, promise, state, unwrap) {\n\t  return function (value) {\n\t    fn(promise, state, value, unwrap);\n\t  };\n\t};\n\n\tvar internalReject = function internalReject(promise, state, value, unwrap) {\n\t  if (state.done) return;\n\t  state.done = true;\n\t  if (unwrap) state = unwrap;\n\t  state.value = value;\n\t  state.state = REJECTED;\n\t  notify$1(promise, state, true);\n\t};\n\n\tvar internalResolve = function internalResolve(promise, state, value, unwrap) {\n\t  if (state.done) return;\n\t  state.done = true;\n\t  if (unwrap) state = unwrap;\n\n\t  try {\n\t    if (promise === value) throw TypeError$1(\"Promise can't be resolved itself\");\n\t    var then = isThenable(value);\n\n\t    if (then) {\n\t      microtask(function () {\n\t        var wrapper = {\n\t          done: false\n\t        };\n\n\t        try {\n\t          then.call(value, bind(internalResolve, promise, wrapper, state), bind(internalReject, promise, wrapper, state));\n\t        } catch (error) {\n\t          internalReject(promise, wrapper, error, state);\n\t        }\n\t      });\n\t    } else {\n\t      state.value = value;\n\t      state.state = FULFILLED;\n\t      notify$1(promise, state, false);\n\t    }\n\t  } catch (error) {\n\t    internalReject(promise, {\n\t      done: false\n\t    }, error, state);\n\t  }\n\t}; // constructor polyfill\n\n\n\tif (FORCED$g) {\n\t  // 25.4.3.1 Promise(executor)\n\t  PromiseConstructor = function Promise(executor) {\n\t    anInstance(this, PromiseConstructor, PROMISE);\n\t    aFunction$1(executor);\n\t    Internal.call(this);\n\t    var state = getInternalState$5(this);\n\n\t    try {\n\t      executor(bind(internalResolve, this, state), bind(internalReject, this, state));\n\t    } catch (error) {\n\t      internalReject(this, state, error);\n\t    }\n\t  }; // eslint-disable-next-line no-unused-vars\n\n\n\t  Internal = function Promise(executor) {\n\t    setInternalState$5(this, {\n\t      type: PROMISE,\n\t      done: false,\n\t      notified: false,\n\t      parent: false,\n\t      reactions: [],\n\t      rejection: false,\n\t      state: PENDING,\n\t      value: undefined\n\t    });\n\t  };\n\n\t  Internal.prototype = redefineAll(PromiseConstructor.prototype, {\n\t    // `Promise.prototype.then` method\n\t    // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n\t    then: function then(onFulfilled, onRejected) {\n\t      var state = getInternalPromiseState(this);\n\t      var reaction = newPromiseCapability$1(speciesConstructor(this, PromiseConstructor));\n\t      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n\t      reaction.fail = typeof onRejected == 'function' && onRejected;\n\t      reaction.domain = IS_NODE$1 ? process$4.domain : undefined;\n\t      state.parent = true;\n\t      state.reactions.push(reaction);\n\t      if (state.state != PENDING) notify$1(this, state, false);\n\t      return reaction.promise;\n\t    },\n\t    // `Promise.prototype.catch` method\n\t    // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n\t    'catch': function _catch(onRejected) {\n\t      return this.then(undefined, onRejected);\n\t    }\n\t  });\n\n\t  OwnPromiseCapability = function OwnPromiseCapability() {\n\t    var promise = new Internal();\n\t    var state = getInternalState$5(promise);\n\t    this.promise = promise;\n\t    this.resolve = bind(internalResolve, promise, state);\n\t    this.reject = bind(internalReject, promise, state);\n\t  };\n\n\t  newPromiseCapability.f = newPromiseCapability$1 = function newPromiseCapability(C) {\n\t    return C === PromiseConstructor || C === PromiseWrapper ? new OwnPromiseCapability(C) : newGenericPromiseCapability(C);\n\t  };\n\n\t  if (!isPure && typeof nativePromiseConstructor == 'function') {\n\t    nativeThen = nativePromiseConstructor.prototype.then; // wrap native Promise#then for native async functions\n\n\t    redefine(nativePromiseConstructor.prototype, 'then', function then(onFulfilled, onRejected) {\n\t      var that = this;\n\t      return new PromiseConstructor(function (resolve, reject) {\n\t        nativeThen.call(that, resolve, reject);\n\t      }).then(onFulfilled, onRejected); // https://github.com/zloirock/core-js/issues/640\n\t    }, {\n\t      unsafe: true\n\t    }); // wrap fetch result\n\n\t    if (typeof $fetch == 'function') _export({\n\t      global: true,\n\t      enumerable: true,\n\t      forced: true\n\t    }, {\n\t      // eslint-disable-next-line no-unused-vars\n\t      fetch: function fetch(input\n\t      /* , init */\n\t      ) {\n\t        return promiseResolve(PromiseConstructor, $fetch.apply(global_1, arguments));\n\t      }\n\t    });\n\t  }\n\t}\n\n\t_export({\n\t  global: true,\n\t  wrap: true,\n\t  forced: FORCED$g\n\t}, {\n\t  Promise: PromiseConstructor\n\t});\n\tsetToStringTag(PromiseConstructor, PROMISE, false, true);\n\tsetSpecies(PROMISE);\n\tPromiseWrapper = getBuiltIn(PROMISE); // statics\n\n\t_export({\n\t  target: PROMISE,\n\t  stat: true,\n\t  forced: FORCED$g\n\t}, {\n\t  // `Promise.reject` method\n\t  // https://tc39.github.io/ecma262/#sec-promise.reject\n\t  reject: function reject(r) {\n\t    var capability = newPromiseCapability$1(this);\n\t    capability.reject.call(undefined, r);\n\t    return capability.promise;\n\t  }\n\t});\n\t_export({\n\t  target: PROMISE,\n\t  stat: true,\n\t  forced: isPure || FORCED$g\n\t}, {\n\t  // `Promise.resolve` method\n\t  // https://tc39.github.io/ecma262/#sec-promise.resolve\n\t  resolve: function resolve(x) {\n\t    return promiseResolve(isPure && this === PromiseWrapper ? PromiseConstructor : this, x);\n\t  }\n\t});\n\t_export({\n\t  target: PROMISE,\n\t  stat: true,\n\t  forced: INCORRECT_ITERATION$1\n\t}, {\n\t  // `Promise.all` method\n\t  // https://tc39.github.io/ecma262/#sec-promise.all\n\t  all: function all(iterable) {\n\t    var C = this;\n\t    var capability = newPromiseCapability$1(C);\n\t    var resolve = capability.resolve;\n\t    var reject = capability.reject;\n\t    var result = perform(function () {\n\t      var $promiseResolve = aFunction$1(C.resolve);\n\t      var values = [];\n\t      var counter = 0;\n\t      var remaining = 1;\n\t      iterate_1(iterable, function (promise) {\n\t        var index = counter++;\n\t        var alreadyCalled = false;\n\t        values.push(undefined);\n\t        remaining++;\n\t        $promiseResolve.call(C, promise).then(function (value) {\n\t          if (alreadyCalled) return;\n\t          alreadyCalled = true;\n\t          values[index] = value;\n\t          --remaining || resolve(values);\n\t        }, reject);\n\t      });\n\t      --remaining || resolve(values);\n\t    });\n\t    if (result.error) reject(result.value);\n\t    return capability.promise;\n\t  },\n\t  // `Promise.race` method\n\t  // https://tc39.github.io/ecma262/#sec-promise.race\n\t  race: function race(iterable) {\n\t    var C = this;\n\t    var capability = newPromiseCapability$1(C);\n\t    var reject = capability.reject;\n\t    var result = perform(function () {\n\t      var $promiseResolve = aFunction$1(C.resolve);\n\t      iterate_1(iterable, function (promise) {\n\t        $promiseResolve.call(C, promise).then(capability.resolve, reject);\n\t      });\n\t    });\n\t    if (result.error) reject(result.value);\n\t    return capability.promise;\n\t  }\n\t});\n\tvar es_promise = {};\n\n\t'use strict'; // `Promise.allSettled` method\n\t// https://github.com/tc39/proposal-promise-allSettled\n\n\n\t_export({\n\t  target: 'Promise',\n\t  stat: true\n\t}, {\n\t  allSettled: function allSettled(iterable) {\n\t    var C = this;\n\t    var capability = newPromiseCapability.f(C);\n\t    var resolve = capability.resolve;\n\t    var reject = capability.reject;\n\t    var result = perform(function () {\n\t      var promiseResolve = aFunction$1(C.resolve);\n\t      var values = [];\n\t      var counter = 0;\n\t      var remaining = 1;\n\t      iterate_1(iterable, function (promise) {\n\t        var index = counter++;\n\t        var alreadyCalled = false;\n\t        values.push(undefined);\n\t        remaining++;\n\t        promiseResolve.call(C, promise).then(function (value) {\n\t          if (alreadyCalled) return;\n\t          alreadyCalled = true;\n\t          values[index] = {\n\t            status: 'fulfilled',\n\t            value: value\n\t          };\n\t          --remaining || resolve(values);\n\t        }, function (e) {\n\t          if (alreadyCalled) return;\n\t          alreadyCalled = true;\n\t          values[index] = {\n\t            status: 'rejected',\n\t            reason: e\n\t          };\n\t          --remaining || resolve(values);\n\t        });\n\t      });\n\t      --remaining || resolve(values);\n\t    });\n\t    if (result.error) reject(result.value);\n\t    return capability.promise;\n\t  }\n\t});\n\tvar es_promise_allSettled = {};\n\n\t'use strict'; // Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829\n\n\n\tvar NON_GENERIC = !!nativePromiseConstructor && fails(function () {\n\t  nativePromiseConstructor.prototype['finally'].call({\n\t    then: function then() {\n\t      /* empty */\n\t    }\n\t  }, function () {\n\t    /* empty */\n\t  });\n\t}); // `Promise.prototype.finally` method\n\t// https://tc39.github.io/ecma262/#sec-promise.prototype.finally\n\n\t_export({\n\t  target: 'Promise',\n\t  proto: true,\n\t  real: true,\n\t  forced: NON_GENERIC\n\t}, {\n\t  'finally': function _finally(onFinally) {\n\t    var C = speciesConstructor(this, getBuiltIn('Promise'));\n\t    var isFunction = typeof onFinally == 'function';\n\t    return this.then(isFunction ? function (x) {\n\t      return promiseResolve(C, onFinally()).then(function () {\n\t        return x;\n\t      });\n\t    } : onFinally, isFunction ? function (e) {\n\t      return promiseResolve(C, onFinally()).then(function () {\n\t        throw e;\n\t      });\n\t    } : onFinally);\n\t  }\n\t}); // patch native Promise.prototype for native async functions\n\n\tif (!isPure && typeof nativePromiseConstructor == 'function' && !nativePromiseConstructor.prototype['finally']) {\n\t  redefine(nativePromiseConstructor.prototype, 'finally', getBuiltIn('Promise').prototype['finally']);\n\t}\n\n\tvar es_promise_finally = {};\n\n\t'use strict';\n\n\tvar collection = function collection(CONSTRUCTOR_NAME, wrapper, common) {\n\t  var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n\t  var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n\t  var ADDER = IS_MAP ? 'set' : 'add';\n\t  var NativeConstructor = global_1[CONSTRUCTOR_NAME];\n\t  var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n\t  var Constructor = NativeConstructor;\n\t  var exported = {};\n\n\t  var fixMethod = function fixMethod(KEY) {\n\t    var nativeMethod = NativePrototype[KEY];\n\t    redefine(NativePrototype, KEY, KEY == 'add' ? function add(value) {\n\t      nativeMethod.call(this, value === 0 ? 0 : value);\n\t      return this;\n\t    } : KEY == 'delete' ? function (key) {\n\t      return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n\t    } : KEY == 'get' ? function get(key) {\n\t      return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);\n\t    } : KEY == 'has' ? function has(key) {\n\t      return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n\t    } : function set(key, value) {\n\t      nativeMethod.call(this, key === 0 ? 0 : key, value);\n\t      return this;\n\t    });\n\t  }; // eslint-disable-next-line max-len\n\n\n\t  if (isForced_1(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n\t    new NativeConstructor().entries().next();\n\t  })))) {\n\t    // create collection constructor\n\t    Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n\t    internalMetadata.REQUIRED = true;\n\t  } else if (isForced_1(CONSTRUCTOR_NAME, true)) {\n\t    var instance = new Constructor(); // early implementations not supports chaining\n\n\t    var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n\n\t    var THROWS_ON_PRIMITIVES = fails(function () {\n\t      instance.has(1);\n\t    }); // most early implementations doesn't supports iterables, most modern - not close it correctly\n\t    // eslint-disable-next-line no-new\n\n\t    var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) {\n\t      new NativeConstructor(iterable);\n\t    }); // for early implementations -0 and +0 not the same\n\n\t    var BUGGY_ZERO = !IS_WEAK && fails(function () {\n\t      // V8 ~ Chromium 42- fails only with 5+ elements\n\t      var $instance = new NativeConstructor();\n\t      var index = 5;\n\n\t      while (index--) {\n\t        $instance[ADDER](index, index);\n\t      }\n\n\t      return !$instance.has(-0);\n\t    });\n\n\t    if (!ACCEPT_ITERABLES) {\n\t      Constructor = wrapper(function (dummy, iterable) {\n\t        anInstance(dummy, Constructor, CONSTRUCTOR_NAME);\n\t        var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n\t        if (iterable != undefined) iterate_1(iterable, that[ADDER], that, IS_MAP);\n\t        return that;\n\t      });\n\t      Constructor.prototype = NativePrototype;\n\t      NativePrototype.constructor = Constructor;\n\t    }\n\n\t    if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n\t      fixMethod('delete');\n\t      fixMethod('has');\n\t      IS_MAP && fixMethod('get');\n\t    }\n\n\t    if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); // weak collections should not contains .clear method\n\n\t    if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n\t  }\n\n\t  exported[CONSTRUCTOR_NAME] = Constructor;\n\t  _export({\n\t    global: true,\n\t    forced: Constructor != NativeConstructor\n\t  }, exported);\n\t  setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\t  if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\t  return Constructor;\n\t};\n\n\t'use strict';\n\n\tvar defineProperty$9 = objectDefineProperty.f;\n\tvar fastKey = internalMetadata.fastKey;\n\tvar setInternalState$6 = internalState.set;\n\tvar internalStateGetterFor = internalState.getterFor;\n\tvar collectionStrong = {\n\t  getConstructor: function getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n\t    var C = wrapper(function (that, iterable) {\n\t      anInstance(that, C, CONSTRUCTOR_NAME);\n\t      setInternalState$6(that, {\n\t        type: CONSTRUCTOR_NAME,\n\t        index: objectCreate(null),\n\t        first: undefined,\n\t        last: undefined,\n\t        size: 0\n\t      });\n\t      if (!descriptors) that.size = 0;\n\t      if (iterable != undefined) iterate_1(iterable, that[ADDER], that, IS_MAP);\n\t    });\n\t    var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n\t    var define = function define(that, key, value) {\n\t      var state = getInternalState(that);\n\t      var entry = getEntry(that, key);\n\t      var previous, index; // change existing entry\n\n\t      if (entry) {\n\t        entry.value = value; // create new entry\n\t      } else {\n\t        state.last = entry = {\n\t          index: index = fastKey(key, true),\n\t          key: key,\n\t          value: value,\n\t          previous: previous = state.last,\n\t          next: undefined,\n\t          removed: false\n\t        };\n\t        if (!state.first) state.first = entry;\n\t        if (previous) previous.next = entry;\n\t        if (descriptors) state.size++;else that.size++; // add to index\n\n\t        if (index !== 'F') state.index[index] = entry;\n\t      }\n\n\t      return that;\n\t    };\n\n\t    var getEntry = function getEntry(that, key) {\n\t      var state = getInternalState(that); // fast case\n\n\t      var index = fastKey(key);\n\t      var entry;\n\t      if (index !== 'F') return state.index[index]; // frozen object case\n\n\t      for (entry = state.first; entry; entry = entry.next) {\n\t        if (entry.key == key) return entry;\n\t      }\n\t    };\n\n\t    redefineAll(C.prototype, {\n\t      // 23.1.3.1 Map.prototype.clear()\n\t      // 23.2.3.2 Set.prototype.clear()\n\t      clear: function clear() {\n\t        var that = this;\n\t        var state = getInternalState(that);\n\t        var data = state.index;\n\t        var entry = state.first;\n\n\t        while (entry) {\n\t          entry.removed = true;\n\t          if (entry.previous) entry.previous = entry.previous.next = undefined;\n\t          delete data[entry.index];\n\t          entry = entry.next;\n\t        }\n\n\t        state.first = state.last = undefined;\n\t        if (descriptors) state.size = 0;else that.size = 0;\n\t      },\n\t      // 23.1.3.3 Map.prototype.delete(key)\n\t      // 23.2.3.4 Set.prototype.delete(value)\n\t      'delete': function _delete(key) {\n\t        var that = this;\n\t        var state = getInternalState(that);\n\t        var entry = getEntry(that, key);\n\n\t        if (entry) {\n\t          var next = entry.next;\n\t          var prev = entry.previous;\n\t          delete state.index[entry.index];\n\t          entry.removed = true;\n\t          if (prev) prev.next = next;\n\t          if (next) next.previous = prev;\n\t          if (state.first == entry) state.first = next;\n\t          if (state.last == entry) state.last = prev;\n\t          if (descriptors) state.size--;else that.size--;\n\t        }\n\n\t        return !!entry;\n\t      },\n\t      // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n\t      // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n\t      forEach: function forEach(callbackfn\n\t      /* , that = undefined */\n\t      ) {\n\t        var state = getInternalState(this);\n\t        var boundFunction = functionBindContext(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n\t        var entry;\n\n\t        while (entry = entry ? entry.next : state.first) {\n\t          boundFunction(entry.value, entry.key, this); // revert to the last existing entry\n\n\t          while (entry && entry.removed) {\n\t            entry = entry.previous;\n\t          }\n\t        }\n\t      },\n\t      // 23.1.3.7 Map.prototype.has(key)\n\t      // 23.2.3.7 Set.prototype.has(value)\n\t      has: function has(key) {\n\t        return !!getEntry(this, key);\n\t      }\n\t    });\n\t    redefineAll(C.prototype, IS_MAP ? {\n\t      // 23.1.3.6 Map.prototype.get(key)\n\t      get: function get(key) {\n\t        var entry = getEntry(this, key);\n\t        return entry && entry.value;\n\t      },\n\t      // 23.1.3.9 Map.prototype.set(key, value)\n\t      set: function set(key, value) {\n\t        return define(this, key === 0 ? 0 : key, value);\n\t      }\n\t    } : {\n\t      // 23.2.3.1 Set.prototype.add(value)\n\t      add: function add(value) {\n\t        return define(this, value = value === 0 ? 0 : value, value);\n\t      }\n\t    });\n\t    if (descriptors) defineProperty$9(C.prototype, 'size', {\n\t      get: function get() {\n\t        return getInternalState(this).size;\n\t      }\n\t    });\n\t    return C;\n\t  },\n\t  setStrong: function setStrong(C, CONSTRUCTOR_NAME, IS_MAP) {\n\t    var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator';\n\t    var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\t    var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME); // add .keys, .values, .entries, [@@iterator]\n\t    // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n\n\t    defineIterator(C, CONSTRUCTOR_NAME, function (iterated, kind) {\n\t      setInternalState$6(this, {\n\t        type: ITERATOR_NAME,\n\t        target: iterated,\n\t        state: getInternalCollectionState(iterated),\n\t        kind: kind,\n\t        last: undefined\n\t      });\n\t    }, function () {\n\t      var state = getInternalIteratorState(this);\n\t      var kind = state.kind;\n\t      var entry = state.last; // revert to the last existing entry\n\n\t      while (entry && entry.removed) {\n\t        entry = entry.previous;\n\t      } // get next entry\n\n\n\t      if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) {\n\t        // or finish the iteration\n\t        state.target = undefined;\n\t        return {\n\t          value: undefined,\n\t          done: true\n\t        };\n\t      } // return step by kind\n\n\n\t      if (kind == 'keys') return {\n\t        value: entry.key,\n\t        done: false\n\t      };\n\t      if (kind == 'values') return {\n\t        value: entry.value,\n\t        done: false\n\t      };\n\t      return {\n\t        value: [entry.key, entry.value],\n\t        done: false\n\t      };\n\t    }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); // add [@@species], 23.1.2.2, 23.2.2.2\n\n\t    setSpecies(CONSTRUCTOR_NAME);\n\t  }\n\t};\n\tvar collectionStrong_1 = collectionStrong.getConstructor;\n\tvar collectionStrong_2 = collectionStrong.setStrong;\n\n\t'use strict'; // `Map` constructor\n\t// https://tc39.github.io/ecma262/#sec-map-objects\n\n\n\tvar es_map = collection('Map', function (init) {\n\t  return function Map() {\n\t    return init(this, arguments.length ? arguments[0] : undefined);\n\t  };\n\t}, collectionStrong);\n\n\t'use strict'; // `Set` constructor\n\t// https://tc39.github.io/ecma262/#sec-set-objects\n\n\n\tvar es_set = collection('Set', function (init) {\n\t  return function Set() {\n\t    return init(this, arguments.length ? arguments[0] : undefined);\n\t  };\n\t}, collectionStrong);\n\n\t'use strict';\n\n\tvar getWeakData = internalMetadata.getWeakData;\n\tvar setInternalState$7 = internalState.set;\n\tvar internalStateGetterFor$1 = internalState.getterFor;\n\tvar find = arrayIteration.find;\n\tvar findIndex = arrayIteration.findIndex;\n\tvar id$1 = 0; // fallback for uncaught frozen keys\n\n\tvar uncaughtFrozenStore = function uncaughtFrozenStore(store) {\n\t  return store.frozen || (store.frozen = new UncaughtFrozenStore());\n\t};\n\n\tvar UncaughtFrozenStore = function UncaughtFrozenStore() {\n\t  this.entries = [];\n\t};\n\n\tvar findUncaughtFrozen = function findUncaughtFrozen(store, key) {\n\t  return find(store.entries, function (it) {\n\t    return it[0] === key;\n\t  });\n\t};\n\n\tUncaughtFrozenStore.prototype = {\n\t  get: function get(key) {\n\t    var entry = findUncaughtFrozen(this, key);\n\t    if (entry) return entry[1];\n\t  },\n\t  has: function has(key) {\n\t    return !!findUncaughtFrozen(this, key);\n\t  },\n\t  set: function set(key, value) {\n\t    var entry = findUncaughtFrozen(this, key);\n\t    if (entry) entry[1] = value;else this.entries.push([key, value]);\n\t  },\n\t  'delete': function _delete(key) {\n\t    var index = findIndex(this.entries, function (it) {\n\t      return it[0] === key;\n\t    });\n\t    if (~index) this.entries.splice(index, 1);\n\t    return !!~index;\n\t  }\n\t};\n\tvar collectionWeak = {\n\t  getConstructor: function getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n\t    var C = wrapper(function (that, iterable) {\n\t      anInstance(that, C, CONSTRUCTOR_NAME);\n\t      setInternalState$7(that, {\n\t        type: CONSTRUCTOR_NAME,\n\t        id: id$1++,\n\t        frozen: undefined\n\t      });\n\t      if (iterable != undefined) iterate_1(iterable, that[ADDER], that, IS_MAP);\n\t    });\n\t    var getInternalState = internalStateGetterFor$1(CONSTRUCTOR_NAME);\n\n\t    var define = function define(that, key, value) {\n\t      var state = getInternalState(that);\n\t      var data = getWeakData(anObject(key), true);\n\t      if (data === true) uncaughtFrozenStore(state).set(key, value);else data[state.id] = value;\n\t      return that;\n\t    };\n\n\t    redefineAll(C.prototype, {\n\t      // 23.3.3.2 WeakMap.prototype.delete(key)\n\t      // 23.4.3.3 WeakSet.prototype.delete(value)\n\t      'delete': function _delete(key) {\n\t        var state = getInternalState(this);\n\t        if (!isObject(key)) return false;\n\t        var data = getWeakData(key);\n\t        if (data === true) return uncaughtFrozenStore(state)['delete'](key);\n\t        return data && has(data, state.id) && delete data[state.id];\n\t      },\n\t      // 23.3.3.4 WeakMap.prototype.has(key)\n\t      // 23.4.3.4 WeakSet.prototype.has(value)\n\t      has: function has$1(key) {\n\t        var state = getInternalState(this);\n\t        if (!isObject(key)) return false;\n\t        var data = getWeakData(key);\n\t        if (data === true) return uncaughtFrozenStore(state).has(key);\n\t        return data && has(data, state.id);\n\t      }\n\t    });\n\t    redefineAll(C.prototype, IS_MAP ? {\n\t      // 23.3.3.3 WeakMap.prototype.get(key)\n\t      get: function get(key) {\n\t        var state = getInternalState(this);\n\n\t        if (isObject(key)) {\n\t          var data = getWeakData(key);\n\t          if (data === true) return uncaughtFrozenStore(state).get(key);\n\t          return data ? data[state.id] : undefined;\n\t        }\n\t      },\n\t      // 23.3.3.5 WeakMap.prototype.set(key, value)\n\t      set: function set(key, value) {\n\t        return define(this, key, value);\n\t      }\n\t    } : {\n\t      // 23.4.3.1 WeakSet.prototype.add(value)\n\t      add: function add(value) {\n\t        return define(this, value, true);\n\t      }\n\t    });\n\t    return C;\n\t  }\n\t};\n\tvar collectionWeak_1 = collectionWeak.getConstructor;\n\n\tvar es_weakMap = createCommonjsModule(function (module) {\n\t  'use strict';\n\n\t  var enforceIternalState = internalState.enforce;\n\t  var IS_IE11 = !global_1.ActiveXObject && 'ActiveXObject' in global_1;\n\t  var isExtensible = Object.isExtensible;\n\t  var InternalWeakMap;\n\n\t  var wrapper = function wrapper(init) {\n\t    return function WeakMap() {\n\t      return init(this, arguments.length ? arguments[0] : undefined);\n\t    };\n\t  }; // `WeakMap` constructor\n\t  // https://tc39.github.io/ecma262/#sec-weakmap-constructor\n\n\n\t  var $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak); // IE11 WeakMap frozen keys fix\n\t  // We can't use feature detection because it crash some old IE builds\n\t  // https://github.com/zloirock/core-js/issues/485\n\n\t  if (nativeWeakMap && IS_IE11) {\n\t    InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);\n\t    internalMetadata.REQUIRED = true;\n\t    var WeakMapPrototype = $WeakMap.prototype;\n\t    var nativeDelete = WeakMapPrototype['delete'];\n\t    var nativeHas = WeakMapPrototype.has;\n\t    var nativeGet = WeakMapPrototype.get;\n\t    var nativeSet = WeakMapPrototype.set;\n\t    redefineAll(WeakMapPrototype, {\n\t      'delete': function _delete(key) {\n\t        if (isObject(key) && !isExtensible(key)) {\n\t          var state = enforceIternalState(this);\n\t          if (!state.frozen) state.frozen = new InternalWeakMap();\n\t          return nativeDelete.call(this, key) || state.frozen['delete'](key);\n\t        }\n\n\t        return nativeDelete.call(this, key);\n\t      },\n\t      has: function has(key) {\n\t        if (isObject(key) && !isExtensible(key)) {\n\t          var state = enforceIternalState(this);\n\t          if (!state.frozen) state.frozen = new InternalWeakMap();\n\t          return nativeHas.call(this, key) || state.frozen.has(key);\n\t        }\n\n\t        return nativeHas.call(this, key);\n\t      },\n\t      get: function get(key) {\n\t        if (isObject(key) && !isExtensible(key)) {\n\t          var state = enforceIternalState(this);\n\t          if (!state.frozen) state.frozen = new InternalWeakMap();\n\t          return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key);\n\t        }\n\n\t        return nativeGet.call(this, key);\n\t      },\n\t      set: function set(key, value) {\n\t        if (isObject(key) && !isExtensible(key)) {\n\t          var state = enforceIternalState(this);\n\t          if (!state.frozen) state.frozen = new InternalWeakMap();\n\t          nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value);\n\t        } else nativeSet.call(this, key, value);\n\n\t        return this;\n\t      }\n\t    });\n\t  }\n\t});\n\n\t'use strict'; // `WeakSet` constructor\n\t// https://tc39.github.io/ecma262/#sec-weakset-constructor\n\n\n\tcollection('WeakSet', function (init) {\n\t  return function WeakSet() {\n\t    return init(this, arguments.length ? arguments[0] : undefined);\n\t  };\n\t}, collectionWeak);\n\tvar es_weakSet = {};\n\n\tvar arrayBufferNative = typeof ArrayBuffer !== 'undefined' && typeof DataView !== 'undefined';\n\n\t// https://tc39.github.io/ecma262/#sec-toindex\n\n\tvar toIndex = function toIndex(it) {\n\t  if (it === undefined) return 0;\n\t  var number = toInteger(it);\n\t  var length = toLength(number);\n\t  if (number !== length) throw RangeError('Wrong length or index');\n\t  return length;\n\t};\n\n\t// IEEE754 conversions based on https://github.com/feross/ieee754\n\t// eslint-disable-next-line no-shadow-restricted-names\n\tvar Infinity$1 = 1 / 0;\n\tvar abs$7 = Math.abs;\n\tvar pow$3 = Math.pow;\n\tvar floor$6 = Math.floor;\n\tvar log$8 = Math.log;\n\tvar LN2$2 = Math.LN2;\n\n\tvar pack = function pack(number, mantissaLength, bytes) {\n\t  var buffer = new Array(bytes);\n\t  var exponentLength = bytes * 8 - mantissaLength - 1;\n\t  var eMax = (1 << exponentLength) - 1;\n\t  var eBias = eMax >> 1;\n\t  var rt = mantissaLength === 23 ? pow$3(2, -24) - pow$3(2, -77) : 0;\n\t  var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0;\n\t  var index = 0;\n\t  var exponent, mantissa, c;\n\t  number = abs$7(number); // eslint-disable-next-line no-self-compare\n\n\t  if (number != number || number === Infinity$1) {\n\t    // eslint-disable-next-line no-self-compare\n\t    mantissa = number != number ? 1 : 0;\n\t    exponent = eMax;\n\t  } else {\n\t    exponent = floor$6(log$8(number) / LN2$2);\n\n\t    if (number * (c = pow$3(2, -exponent)) < 1) {\n\t      exponent--;\n\t      c *= 2;\n\t    }\n\n\t    if (exponent + eBias >= 1) {\n\t      number += rt / c;\n\t    } else {\n\t      number += rt * pow$3(2, 1 - eBias);\n\t    }\n\n\t    if (number * c >= 2) {\n\t      exponent++;\n\t      c /= 2;\n\t    }\n\n\t    if (exponent + eBias >= eMax) {\n\t      mantissa = 0;\n\t      exponent = eMax;\n\t    } else if (exponent + eBias >= 1) {\n\t      mantissa = (number * c - 1) * pow$3(2, mantissaLength);\n\t      exponent = exponent + eBias;\n\t    } else {\n\t      mantissa = number * pow$3(2, eBias - 1) * pow$3(2, mantissaLength);\n\t      exponent = 0;\n\t    }\n\t  }\n\n\t  for (; mantissaLength >= 8; buffer[index++] = mantissa & 255, mantissa /= 256, mantissaLength -= 8) {\n\t    ;\n\t  }\n\n\t  exponent = exponent << mantissaLength | mantissa;\n\t  exponentLength += mantissaLength;\n\n\t  for (; exponentLength > 0; buffer[index++] = exponent & 255, exponent /= 256, exponentLength -= 8) {\n\t    ;\n\t  }\n\n\t  buffer[--index] |= sign * 128;\n\t  return buffer;\n\t};\n\n\tvar unpack = function unpack(buffer, mantissaLength) {\n\t  var bytes = buffer.length;\n\t  var exponentLength = bytes * 8 - mantissaLength - 1;\n\t  var eMax = (1 << exponentLength) - 1;\n\t  var eBias = eMax >> 1;\n\t  var nBits = exponentLength - 7;\n\t  var index = bytes - 1;\n\t  var sign = buffer[index--];\n\t  var exponent = sign & 127;\n\t  var mantissa;\n\t  sign >>= 7;\n\n\t  for (; nBits > 0; exponent = exponent * 256 + buffer[index], index--, nBits -= 8) {\n\t    ;\n\t  }\n\n\t  mantissa = exponent & (1 << -nBits) - 1;\n\t  exponent >>= -nBits;\n\t  nBits += mantissaLength;\n\n\t  for (; nBits > 0; mantissa = mantissa * 256 + buffer[index], index--, nBits -= 8) {\n\t    ;\n\t  }\n\n\t  if (exponent === 0) {\n\t    exponent = 1 - eBias;\n\t  } else if (exponent === eMax) {\n\t    return mantissa ? NaN : sign ? -Infinity$1 : Infinity$1;\n\t  } else {\n\t    mantissa = mantissa + pow$3(2, mantissaLength);\n\t    exponent = exponent - eBias;\n\t  }\n\n\t  return (sign ? -1 : 1) * mantissa * pow$3(2, exponent - mantissaLength);\n\t};\n\n\tvar ieee754 = {\n\t  pack: pack,\n\t  unpack: unpack\n\t};\n\tvar ieee754_1 = ieee754.pack;\n\tvar ieee754_2 = ieee754.unpack;\n\n\t'use strict';\n\n\tvar getOwnPropertyNames$2 = objectGetOwnPropertyNames.f;\n\tvar defineProperty$a = objectDefineProperty.f;\n\tvar getInternalState$6 = internalState.get;\n\tvar setInternalState$8 = internalState.set;\n\tvar ARRAY_BUFFER = 'ArrayBuffer';\n\tvar DATA_VIEW = 'DataView';\n\tvar PROTOTYPE$2 = 'prototype';\n\tvar WRONG_LENGTH = 'Wrong length';\n\tvar WRONG_INDEX = 'Wrong index';\n\tvar NativeArrayBuffer = global_1[ARRAY_BUFFER];\n\tvar $ArrayBuffer = NativeArrayBuffer;\n\tvar $DataView = global_1[DATA_VIEW];\n\tvar $DataViewPrototype = $DataView && $DataView[PROTOTYPE$2];\n\tvar ObjectPrototype$2 = Object.prototype;\n\tvar RangeError$1 = global_1.RangeError;\n\tvar packIEEE754 = ieee754.pack;\n\tvar unpackIEEE754 = ieee754.unpack;\n\n\tvar packInt8 = function packInt8(number) {\n\t  return [number & 0xFF];\n\t};\n\n\tvar packInt16 = function packInt16(number) {\n\t  return [number & 0xFF, number >> 8 & 0xFF];\n\t};\n\n\tvar packInt32 = function packInt32(number) {\n\t  return [number & 0xFF, number >> 8 & 0xFF, number >> 16 & 0xFF, number >> 24 & 0xFF];\n\t};\n\n\tvar unpackInt32 = function unpackInt32(buffer) {\n\t  return buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];\n\t};\n\n\tvar packFloat32 = function packFloat32(number) {\n\t  return packIEEE754(number, 23, 4);\n\t};\n\n\tvar packFloat64 = function packFloat64(number) {\n\t  return packIEEE754(number, 52, 8);\n\t};\n\n\tvar addGetter = function addGetter(Constructor, key) {\n\t  defineProperty$a(Constructor[PROTOTYPE$2], key, {\n\t    get: function get() {\n\t      return getInternalState$6(this)[key];\n\t    }\n\t  });\n\t};\n\n\tvar get$1 = function get(view, count, index, isLittleEndian) {\n\t  var intIndex = toIndex(index);\n\t  var store = getInternalState$6(view);\n\t  if (intIndex + count > store.byteLength) throw RangeError$1(WRONG_INDEX);\n\t  var bytes = getInternalState$6(store.buffer).bytes;\n\t  var start = intIndex + store.byteOffset;\n\t  var pack = bytes.slice(start, start + count);\n\t  return isLittleEndian ? pack : pack.reverse();\n\t};\n\n\tvar set$2 = function set(view, count, index, conversion, value, isLittleEndian) {\n\t  var intIndex = toIndex(index);\n\t  var store = getInternalState$6(view);\n\t  if (intIndex + count > store.byteLength) throw RangeError$1(WRONG_INDEX);\n\t  var bytes = getInternalState$6(store.buffer).bytes;\n\t  var start = intIndex + store.byteOffset;\n\t  var pack = conversion(+value);\n\n\t  for (var i = 0; i < count; i++) {\n\t    bytes[start + i] = pack[isLittleEndian ? i : count - i - 1];\n\t  }\n\t};\n\n\tif (!arrayBufferNative) {\n\t  $ArrayBuffer = function ArrayBuffer(length) {\n\t    anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n\t    var byteLength = toIndex(length);\n\t    setInternalState$8(this, {\n\t      bytes: arrayFill.call(new Array(byteLength), 0),\n\t      byteLength: byteLength\n\t    });\n\t    if (!descriptors) this.byteLength = byteLength;\n\t  };\n\n\t  $DataView = function DataView(buffer, byteOffset, byteLength) {\n\t    anInstance(this, $DataView, DATA_VIEW);\n\t    anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n\t    var bufferLength = getInternalState$6(buffer).byteLength;\n\t    var offset = toInteger(byteOffset);\n\t    if (offset < 0 || offset > bufferLength) throw RangeError$1('Wrong offset');\n\t    byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n\t    if (offset + byteLength > bufferLength) throw RangeError$1(WRONG_LENGTH);\n\t    setInternalState$8(this, {\n\t      buffer: buffer,\n\t      byteLength: byteLength,\n\t      byteOffset: offset\n\t    });\n\n\t    if (!descriptors) {\n\t      this.buffer = buffer;\n\t      this.byteLength = byteLength;\n\t      this.byteOffset = offset;\n\t    }\n\t  };\n\n\t  if (descriptors) {\n\t    addGetter($ArrayBuffer, 'byteLength');\n\t    addGetter($DataView, 'buffer');\n\t    addGetter($DataView, 'byteLength');\n\t    addGetter($DataView, 'byteOffset');\n\t  }\n\n\t  redefineAll($DataView[PROTOTYPE$2], {\n\t    getInt8: function getInt8(byteOffset) {\n\t      return get$1(this, 1, byteOffset)[0] << 24 >> 24;\n\t    },\n\t    getUint8: function getUint8(byteOffset) {\n\t      return get$1(this, 1, byteOffset)[0];\n\t    },\n\t    getInt16: function getInt16(byteOffset\n\t    /* , littleEndian */\n\t    ) {\n\t      var bytes = get$1(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);\n\t      return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n\t    },\n\t    getUint16: function getUint16(byteOffset\n\t    /* , littleEndian */\n\t    ) {\n\t      var bytes = get$1(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);\n\t      return bytes[1] << 8 | bytes[0];\n\t    },\n\t    getInt32: function getInt32(byteOffset\n\t    /* , littleEndian */\n\t    ) {\n\t      return unpackInt32(get$1(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined));\n\t    },\n\t    getUint32: function getUint32(byteOffset\n\t    /* , littleEndian */\n\t    ) {\n\t      return unpackInt32(get$1(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined)) >>> 0;\n\t    },\n\t    getFloat32: function getFloat32(byteOffset\n\t    /* , littleEndian */\n\t    ) {\n\t      return unpackIEEE754(get$1(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 23);\n\t    },\n\t    getFloat64: function getFloat64(byteOffset\n\t    /* , littleEndian */\n\t    ) {\n\t      return unpackIEEE754(get$1(this, 8, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 52);\n\t    },\n\t    setInt8: function setInt8(byteOffset, value) {\n\t      set$2(this, 1, byteOffset, packInt8, value);\n\t    },\n\t    setUint8: function setUint8(byteOffset, value) {\n\t      set$2(this, 1, byteOffset, packInt8, value);\n\t    },\n\t    setInt16: function setInt16(byteOffset, value\n\t    /* , littleEndian */\n\t    ) {\n\t      set$2(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);\n\t    },\n\t    setUint16: function setUint16(byteOffset, value\n\t    /* , littleEndian */\n\t    ) {\n\t      set$2(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);\n\t    },\n\t    setInt32: function setInt32(byteOffset, value\n\t    /* , littleEndian */\n\t    ) {\n\t      set$2(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);\n\t    },\n\t    setUint32: function setUint32(byteOffset, value\n\t    /* , littleEndian */\n\t    ) {\n\t      set$2(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);\n\t    },\n\t    setFloat32: function setFloat32(byteOffset, value\n\t    /* , littleEndian */\n\t    ) {\n\t      set$2(this, 4, byteOffset, packFloat32, value, arguments.length > 2 ? arguments[2] : undefined);\n\t    },\n\t    setFloat64: function setFloat64(byteOffset, value\n\t    /* , littleEndian */\n\t    ) {\n\t      set$2(this, 8, byteOffset, packFloat64, value, arguments.length > 2 ? arguments[2] : undefined);\n\t    }\n\t  });\n\t} else {\n\t  if (!fails(function () {\n\t    NativeArrayBuffer(1);\n\t  }) || !fails(function () {\n\t    new NativeArrayBuffer(-1); // eslint-disable-line no-new\n\t  }) || fails(function () {\n\t    new NativeArrayBuffer(); // eslint-disable-line no-new\n\n\t    new NativeArrayBuffer(1.5); // eslint-disable-line no-new\n\n\t    new NativeArrayBuffer(NaN); // eslint-disable-line no-new\n\n\t    return NativeArrayBuffer.name != ARRAY_BUFFER;\n\t  })) {\n\t    $ArrayBuffer = function ArrayBuffer(length) {\n\t      anInstance(this, $ArrayBuffer);\n\t      return new NativeArrayBuffer(toIndex(length));\n\t    };\n\n\t    var ArrayBufferPrototype = $ArrayBuffer[PROTOTYPE$2] = NativeArrayBuffer[PROTOTYPE$2];\n\n\t    for (var keys$3 = getOwnPropertyNames$2(NativeArrayBuffer), j$1 = 0, key$1; keys$3.length > j$1;) {\n\t      if (!((key$1 = keys$3[j$1++]) in $ArrayBuffer)) {\n\t        createNonEnumerableProperty($ArrayBuffer, key$1, NativeArrayBuffer[key$1]);\n\t      }\n\t    }\n\n\t    ArrayBufferPrototype.constructor = $ArrayBuffer;\n\t  } // WebKit bug - the same parent prototype for typed arrays and data view\n\n\n\t  if (objectSetPrototypeOf && objectGetPrototypeOf($DataViewPrototype) !== ObjectPrototype$2) {\n\t    objectSetPrototypeOf($DataViewPrototype, ObjectPrototype$2);\n\t  } // iOS Safari 7.x bug\n\n\n\t  var testView = new $DataView(new $ArrayBuffer(2));\n\t  var nativeSetInt8 = $DataViewPrototype.setInt8;\n\t  testView.setInt8(0, 2147483648);\n\t  testView.setInt8(1, 2147483649);\n\t  if (testView.getInt8(0) || !testView.getInt8(1)) redefineAll($DataViewPrototype, {\n\t    setInt8: function setInt8(byteOffset, value) {\n\t      nativeSetInt8.call(this, byteOffset, value << 24 >> 24);\n\t    },\n\t    setUint8: function setUint8(byteOffset, value) {\n\t      nativeSetInt8.call(this, byteOffset, value << 24 >> 24);\n\t    }\n\t  }, {\n\t    unsafe: true\n\t  });\n\t}\n\n\tsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\n\tsetToStringTag($DataView, DATA_VIEW);\n\tvar arrayBuffer = {\n\t  ArrayBuffer: $ArrayBuffer,\n\t  DataView: $DataView\n\t};\n\n\t'use strict';\n\n\tvar ARRAY_BUFFER$1 = 'ArrayBuffer';\n\tvar ArrayBuffer$1 = arrayBuffer[ARRAY_BUFFER$1];\n\tvar NativeArrayBuffer$1 = global_1[ARRAY_BUFFER$1]; // `ArrayBuffer` constructor\n\t// https://tc39.github.io/ecma262/#sec-arraybuffer-constructor\n\n\t_export({\n\t  global: true,\n\t  forced: NativeArrayBuffer$1 !== ArrayBuffer$1\n\t}, {\n\t  ArrayBuffer: ArrayBuffer$1\n\t});\n\tsetSpecies(ARRAY_BUFFER$1);\n\tvar es_arrayBuffer_constructor = {};\n\n\t'use strict';\n\n\tvar defineProperty$b = objectDefineProperty.f;\n\tvar Int8Array$1 = global_1.Int8Array;\n\tvar Int8ArrayPrototype = Int8Array$1 && Int8Array$1.prototype;\n\tvar Uint8ClampedArray$1 = global_1.Uint8ClampedArray;\n\tvar Uint8ClampedArrayPrototype = Uint8ClampedArray$1 && Uint8ClampedArray$1.prototype;\n\tvar TypedArray = Int8Array$1 && objectGetPrototypeOf(Int8Array$1);\n\tvar TypedArrayPrototype = Int8ArrayPrototype && objectGetPrototypeOf(Int8ArrayPrototype);\n\tvar ObjectPrototype$3 = Object.prototype;\n\tvar isPrototypeOf = ObjectPrototype$3.isPrototypeOf;\n\tvar TO_STRING_TAG$3 = wellKnownSymbol('toStringTag');\n\tvar TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG'); // Fixing native typed arrays in Opera Presto crashes the browser, see #595\n\n\tvar NATIVE_ARRAY_BUFFER_VIEWS = arrayBufferNative && !!objectSetPrototypeOf && classof(global_1.opera) !== 'Opera';\n\tvar TYPED_ARRAY_TAG_REQIRED = false;\n\tvar NAME$1;\n\tvar TypedArrayConstructorsList = {\n\t  Int8Array: 1,\n\t  Uint8Array: 1,\n\t  Uint8ClampedArray: 1,\n\t  Int16Array: 2,\n\t  Uint16Array: 2,\n\t  Int32Array: 4,\n\t  Uint32Array: 4,\n\t  Float32Array: 4,\n\t  Float64Array: 8\n\t};\n\n\tvar isView = function isView(it) {\n\t  var klass = classof(it);\n\t  return klass === 'DataView' || has(TypedArrayConstructorsList, klass);\n\t};\n\n\tvar isTypedArray = function isTypedArray(it) {\n\t  return isObject(it) && has(TypedArrayConstructorsList, classof(it));\n\t};\n\n\tvar aTypedArray = function aTypedArray(it) {\n\t  if (isTypedArray(it)) return it;\n\t  throw TypeError('Target is not a typed array');\n\t};\n\n\tvar aTypedArrayConstructor = function aTypedArrayConstructor(C) {\n\t  if (objectSetPrototypeOf) {\n\t    if (isPrototypeOf.call(TypedArray, C)) return C;\n\t  } else for (var ARRAY in TypedArrayConstructorsList) {\n\t    if (has(TypedArrayConstructorsList, NAME$1)) {\n\t      var TypedArrayConstructor = global_1[ARRAY];\n\n\t      if (TypedArrayConstructor && (C === TypedArrayConstructor || isPrototypeOf.call(TypedArrayConstructor, C))) {\n\t        return C;\n\t      }\n\t    }\n\t  }\n\n\t  throw TypeError('Target is not a typed array constructor');\n\t};\n\n\tvar exportTypedArrayMethod = function exportTypedArrayMethod(KEY, property, forced) {\n\t  if (!descriptors) return;\n\t  if (forced) for (var ARRAY in TypedArrayConstructorsList) {\n\t    var TypedArrayConstructor = global_1[ARRAY];\n\n\t    if (TypedArrayConstructor && has(TypedArrayConstructor.prototype, KEY)) {\n\t      delete TypedArrayConstructor.prototype[KEY];\n\t    }\n\t  }\n\n\t  if (!TypedArrayPrototype[KEY] || forced) {\n\t    redefine(TypedArrayPrototype, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property);\n\t  }\n\t};\n\n\tvar exportTypedArrayStaticMethod = function exportTypedArrayStaticMethod(KEY, property, forced) {\n\t  var ARRAY, TypedArrayConstructor;\n\t  if (!descriptors) return;\n\n\t  if (objectSetPrototypeOf) {\n\t    if (forced) for (ARRAY in TypedArrayConstructorsList) {\n\t      TypedArrayConstructor = global_1[ARRAY];\n\n\t      if (TypedArrayConstructor && has(TypedArrayConstructor, KEY)) {\n\t        delete TypedArrayConstructor[KEY];\n\t      }\n\t    }\n\n\t    if (!TypedArray[KEY] || forced) {\n\t      // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable\n\t      try {\n\t        return redefine(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && Int8Array$1[KEY] || property);\n\t      } catch (error) {\n\t        /* empty */\n\t      }\n\t    } else return;\n\t  }\n\n\t  for (ARRAY in TypedArrayConstructorsList) {\n\t    TypedArrayConstructor = global_1[ARRAY];\n\n\t    if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {\n\t      redefine(TypedArrayConstructor, KEY, property);\n\t    }\n\t  }\n\t};\n\n\tfor (NAME$1 in TypedArrayConstructorsList) {\n\t  if (!global_1[NAME$1]) NATIVE_ARRAY_BUFFER_VIEWS = false;\n\t} // WebKit bug - typed arrays constructors prototype is Object.prototype\n\n\n\tif (!NATIVE_ARRAY_BUFFER_VIEWS || typeof TypedArray != 'function' || TypedArray === Function.prototype) {\n\t  // eslint-disable-next-line no-shadow\n\t  TypedArray = function TypedArray() {\n\t    throw TypeError('Incorrect invocation');\n\t  };\n\n\t  if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME$1 in TypedArrayConstructorsList) {\n\t    if (global_1[NAME$1]) objectSetPrototypeOf(global_1[NAME$1], TypedArray);\n\t  }\n\t}\n\n\tif (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype$3) {\n\t  TypedArrayPrototype = TypedArray.prototype;\n\t  if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME$1 in TypedArrayConstructorsList) {\n\t    if (global_1[NAME$1]) objectSetPrototypeOf(global_1[NAME$1].prototype, TypedArrayPrototype);\n\t  }\n\t} // WebKit bug - one more object in Uint8ClampedArray prototype chain\n\n\n\tif (NATIVE_ARRAY_BUFFER_VIEWS && objectGetPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) {\n\t  objectSetPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype);\n\t}\n\n\tif (descriptors && !has(TypedArrayPrototype, TO_STRING_TAG$3)) {\n\t  TYPED_ARRAY_TAG_REQIRED = true;\n\t  defineProperty$b(TypedArrayPrototype, TO_STRING_TAG$3, {\n\t    get: function get() {\n\t      return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined;\n\t    }\n\t  });\n\n\t  for (NAME$1 in TypedArrayConstructorsList) {\n\t    if (global_1[NAME$1]) {\n\t      createNonEnumerableProperty(global_1[NAME$1], TYPED_ARRAY_TAG, NAME$1);\n\t    }\n\t  }\n\t}\n\n\tvar arrayBufferViewCore = {\n\t  NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS,\n\t  TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQIRED && TYPED_ARRAY_TAG,\n\t  aTypedArray: aTypedArray,\n\t  aTypedArrayConstructor: aTypedArrayConstructor,\n\t  exportTypedArrayMethod: exportTypedArrayMethod,\n\t  exportTypedArrayStaticMethod: exportTypedArrayStaticMethod,\n\t  isView: isView,\n\t  isTypedArray: isTypedArray,\n\t  TypedArray: TypedArray,\n\t  TypedArrayPrototype: TypedArrayPrototype\n\t};\n\tvar arrayBufferViewCore_1 = arrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;\n\tvar arrayBufferViewCore_2 = arrayBufferViewCore.TYPED_ARRAY_TAG;\n\tvar arrayBufferViewCore_3 = arrayBufferViewCore.aTypedArray;\n\tvar arrayBufferViewCore_4 = arrayBufferViewCore.aTypedArrayConstructor;\n\tvar arrayBufferViewCore_5 = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar arrayBufferViewCore_6 = arrayBufferViewCore.exportTypedArrayStaticMethod;\n\tvar arrayBufferViewCore_7 = arrayBufferViewCore.isView;\n\tvar arrayBufferViewCore_8 = arrayBufferViewCore.isTypedArray;\n\tvar arrayBufferViewCore_9 = arrayBufferViewCore.TypedArray;\n\tvar arrayBufferViewCore_10 = arrayBufferViewCore.TypedArrayPrototype;\n\n\tvar NATIVE_ARRAY_BUFFER_VIEWS$1 = arrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS; // `ArrayBuffer.isView` method\n\t// https://tc39.github.io/ecma262/#sec-arraybuffer.isview\n\n\t_export({\n\t  target: 'ArrayBuffer',\n\t  stat: true,\n\t  forced: !NATIVE_ARRAY_BUFFER_VIEWS$1\n\t}, {\n\t  isView: arrayBufferViewCore.isView\n\t});\n\tvar es_arrayBuffer_isView = {};\n\n\t'use strict';\n\n\tvar ArrayBuffer$2 = arrayBuffer.ArrayBuffer;\n\tvar DataView$1 = arrayBuffer.DataView;\n\tvar nativeArrayBufferSlice = ArrayBuffer$2.prototype.slice;\n\tvar INCORRECT_SLICE = fails(function () {\n\t  return !new ArrayBuffer$2(2).slice(1, undefined).byteLength;\n\t}); // `ArrayBuffer.prototype.slice` method\n\t// https://tc39.github.io/ecma262/#sec-arraybuffer.prototype.slice\n\n\t_export({\n\t  target: 'ArrayBuffer',\n\t  proto: true,\n\t  unsafe: true,\n\t  forced: INCORRECT_SLICE\n\t}, {\n\t  slice: function slice(start, end) {\n\t    if (nativeArrayBufferSlice !== undefined && end === undefined) {\n\t      return nativeArrayBufferSlice.call(anObject(this), start); // FF fix\n\t    }\n\n\t    var length = anObject(this).byteLength;\n\t    var first = toAbsoluteIndex(start, length);\n\t    var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n\t    var result = new (speciesConstructor(this, ArrayBuffer$2))(toLength(fin - first));\n\t    var viewSource = new DataView$1(this);\n\t    var viewTarget = new DataView$1(result);\n\t    var index = 0;\n\n\t    while (first < fin) {\n\t      viewTarget.setUint8(index++, viewSource.getUint8(first++));\n\t    }\n\n\t    return result;\n\t  }\n\t});\n\tvar es_arrayBuffer_slice = {};\n\n\t// https://tc39.github.io/ecma262/#sec-dataview-constructor\n\n\t_export({\n\t  global: true,\n\t  forced: !arrayBufferNative\n\t}, {\n\t  DataView: arrayBuffer.DataView\n\t});\n\tvar es_dataView = {};\n\n\t/* eslint-disable no-new */\n\n\tvar NATIVE_ARRAY_BUFFER_VIEWS$2 = arrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;\n\tvar ArrayBuffer$3 = global_1.ArrayBuffer;\n\tvar Int8Array$2 = global_1.Int8Array;\n\tvar typedArrayConstructorsRequireWrappers = !NATIVE_ARRAY_BUFFER_VIEWS$2 || !fails(function () {\n\t  Int8Array$2(1);\n\t}) || !fails(function () {\n\t  new Int8Array$2(-1);\n\t}) || !checkCorrectnessOfIteration(function (iterable) {\n\t  new Int8Array$2();\n\t  new Int8Array$2(null);\n\t  new Int8Array$2(1.5);\n\t  new Int8Array$2(iterable);\n\t}, true) || fails(function () {\n\t  // Safari (11+) bug - a reason why even Safari 13 should load a typed array polyfill\n\t  return new Int8Array$2(new ArrayBuffer$3(2), 1, undefined).length !== 1;\n\t});\n\n\tvar toPositiveInteger = function toPositiveInteger(it) {\n\t  var result = toInteger(it);\n\t  if (result < 0) throw RangeError(\"The argument can't be less than 0\");\n\t  return result;\n\t};\n\n\tvar toOffset = function toOffset(it, BYTES) {\n\t  var offset = toPositiveInteger(it);\n\t  if (offset % BYTES) throw RangeError('Wrong offset');\n\t  return offset;\n\t};\n\n\tvar aTypedArrayConstructor$1 = arrayBufferViewCore.aTypedArrayConstructor;\n\n\tvar typedArrayFrom = function from(source\n\t/* , mapfn, thisArg */\n\t) {\n\t  var O = toObject(source);\n\t  var argumentsLength = arguments.length;\n\t  var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n\t  var mapping = mapfn !== undefined;\n\t  var iteratorMethod = getIteratorMethod(O);\n\t  var i, length, result, step, iterator, next;\n\n\t  if (iteratorMethod != undefined && !isArrayIteratorMethod(iteratorMethod)) {\n\t    iterator = iteratorMethod.call(O);\n\t    next = iterator.next;\n\t    O = [];\n\n\t    while (!(step = next.call(iterator)).done) {\n\t      O.push(step.value);\n\t    }\n\t  }\n\n\t  if (mapping && argumentsLength > 2) {\n\t    mapfn = functionBindContext(mapfn, arguments[2], 2);\n\t  }\n\n\t  length = toLength(O.length);\n\t  result = new (aTypedArrayConstructor$1(this))(length);\n\n\t  for (i = 0; length > i; i++) {\n\t    result[i] = mapping ? mapfn(O[i], i) : O[i];\n\t  }\n\n\t  return result;\n\t};\n\n\tvar typedArrayConstructor = createCommonjsModule(function (module) {\n\t  'use strict';\n\n\t  var getOwnPropertyNames = objectGetOwnPropertyNames.f;\n\t  var forEach = arrayIteration.forEach;\n\t  var getInternalState = internalState.get;\n\t  var setInternalState = internalState.set;\n\t  var nativeDefineProperty = objectDefineProperty.f;\n\t  var nativeGetOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\n\t  var round = Math.round;\n\t  var RangeError = global_1.RangeError;\n\t  var ArrayBuffer = arrayBuffer.ArrayBuffer;\n\t  var DataView = arrayBuffer.DataView;\n\t  var NATIVE_ARRAY_BUFFER_VIEWS = arrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;\n\t  var TYPED_ARRAY_TAG = arrayBufferViewCore.TYPED_ARRAY_TAG;\n\t  var TypedArray = arrayBufferViewCore.TypedArray;\n\t  var TypedArrayPrototype = arrayBufferViewCore.TypedArrayPrototype;\n\t  var aTypedArrayConstructor = arrayBufferViewCore.aTypedArrayConstructor;\n\t  var isTypedArray = arrayBufferViewCore.isTypedArray;\n\t  var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n\t  var WRONG_LENGTH = 'Wrong length';\n\n\t  var fromList = function fromList(C, list) {\n\t    var index = 0;\n\t    var length = list.length;\n\t    var result = new (aTypedArrayConstructor(C))(length);\n\n\t    while (length > index) {\n\t      result[index] = list[index++];\n\t    }\n\n\t    return result;\n\t  };\n\n\t  var addGetter = function addGetter(it, key) {\n\t    nativeDefineProperty(it, key, {\n\t      get: function get() {\n\t        return getInternalState(this)[key];\n\t      }\n\t    });\n\t  };\n\n\t  var isArrayBuffer = function isArrayBuffer(it) {\n\t    var klass;\n\t    return it instanceof ArrayBuffer || (klass = classof(it)) == 'ArrayBuffer' || klass == 'SharedArrayBuffer';\n\t  };\n\n\t  var isTypedArrayIndex = function isTypedArrayIndex(target, key) {\n\t    return isTypedArray(target) && typeof key != 'symbol' && key in target && String(+key) == String(key);\n\t  };\n\n\t  var wrappedGetOwnPropertyDescriptor = function getOwnPropertyDescriptor(target, key) {\n\t    return isTypedArrayIndex(target, key = toPrimitive(key, true)) ? createPropertyDescriptor(2, target[key]) : nativeGetOwnPropertyDescriptor(target, key);\n\t  };\n\n\t  var wrappedDefineProperty = function defineProperty(target, key, descriptor) {\n\t    if (isTypedArrayIndex(target, key = toPrimitive(key, true)) && isObject(descriptor) && has(descriptor, 'value') && !has(descriptor, 'get') && !has(descriptor, 'set') // TODO: add validation descriptor w/o calling accessors\n\t    && !descriptor.configurable && (!has(descriptor, 'writable') || descriptor.writable) && (!has(descriptor, 'enumerable') || descriptor.enumerable)) {\n\t      target[key] = descriptor.value;\n\t      return target;\n\t    }\n\n\t    return nativeDefineProperty(target, key, descriptor);\n\t  };\n\n\t  if (descriptors) {\n\t    if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n\t      objectGetOwnPropertyDescriptor.f = wrappedGetOwnPropertyDescriptor;\n\t      objectDefineProperty.f = wrappedDefineProperty;\n\t      addGetter(TypedArrayPrototype, 'buffer');\n\t      addGetter(TypedArrayPrototype, 'byteOffset');\n\t      addGetter(TypedArrayPrototype, 'byteLength');\n\t      addGetter(TypedArrayPrototype, 'length');\n\t    }\n\n\t    _export({\n\t      target: 'Object',\n\t      stat: true,\n\t      forced: !NATIVE_ARRAY_BUFFER_VIEWS\n\t    }, {\n\t      getOwnPropertyDescriptor: wrappedGetOwnPropertyDescriptor,\n\t      defineProperty: wrappedDefineProperty\n\t    });\n\n\t    module.exports = function (TYPE, wrapper, CLAMPED) {\n\t      var BYTES = TYPE.match(/\\d+$/)[0] / 8;\n\t      var CONSTRUCTOR_NAME = TYPE + (CLAMPED ? 'Clamped' : '') + 'Array';\n\t      var GETTER = 'get' + TYPE;\n\t      var SETTER = 'set' + TYPE;\n\t      var NativeTypedArrayConstructor = global_1[CONSTRUCTOR_NAME];\n\t      var TypedArrayConstructor = NativeTypedArrayConstructor;\n\t      var TypedArrayConstructorPrototype = TypedArrayConstructor && TypedArrayConstructor.prototype;\n\t      var exported = {};\n\n\t      var getter = function getter(that, index) {\n\t        var data = getInternalState(that);\n\t        return data.view[GETTER](index * BYTES + data.byteOffset, true);\n\t      };\n\n\t      var setter = function setter(that, index, value) {\n\t        var data = getInternalState(that);\n\t        if (CLAMPED) value = (value = round(value)) < 0 ? 0 : value > 0xFF ? 0xFF : value & 0xFF;\n\t        data.view[SETTER](index * BYTES + data.byteOffset, value, true);\n\t      };\n\n\t      var addElement = function addElement(that, index) {\n\t        nativeDefineProperty(that, index, {\n\t          get: function get() {\n\t            return getter(this, index);\n\t          },\n\t          set: function set(value) {\n\t            return setter(this, index, value);\n\t          },\n\t          enumerable: true\n\t        });\n\t      };\n\n\t      if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n\t        TypedArrayConstructor = wrapper(function (that, data, offset, $length) {\n\t          anInstance(that, TypedArrayConstructor, CONSTRUCTOR_NAME);\n\t          var index = 0;\n\t          var byteOffset = 0;\n\t          var buffer, byteLength, length;\n\n\t          if (!isObject(data)) {\n\t            length = toIndex(data);\n\t            byteLength = length * BYTES;\n\t            buffer = new ArrayBuffer(byteLength);\n\t          } else if (isArrayBuffer(data)) {\n\t            buffer = data;\n\t            byteOffset = toOffset(offset, BYTES);\n\t            var $len = data.byteLength;\n\n\t            if ($length === undefined) {\n\t              if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n\t              byteLength = $len - byteOffset;\n\t              if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n\t            } else {\n\t              byteLength = toLength($length) * BYTES;\n\t              if (byteLength + byteOffset > $len) throw RangeError(WRONG_LENGTH);\n\t            }\n\n\t            length = byteLength / BYTES;\n\t          } else if (isTypedArray(data)) {\n\t            return fromList(TypedArrayConstructor, data);\n\t          } else {\n\t            return typedArrayFrom.call(TypedArrayConstructor, data);\n\t          }\n\n\t          setInternalState(that, {\n\t            buffer: buffer,\n\t            byteOffset: byteOffset,\n\t            byteLength: byteLength,\n\t            length: length,\n\t            view: new DataView(buffer)\n\t          });\n\n\t          while (index < length) {\n\t            addElement(that, index++);\n\t          }\n\t        });\n\t        if (objectSetPrototypeOf) objectSetPrototypeOf(TypedArrayConstructor, TypedArray);\n\t        TypedArrayConstructorPrototype = TypedArrayConstructor.prototype = objectCreate(TypedArrayPrototype);\n\t      } else if (typedArrayConstructorsRequireWrappers) {\n\t        TypedArrayConstructor = wrapper(function (dummy, data, typedArrayOffset, $length) {\n\t          anInstance(dummy, TypedArrayConstructor, CONSTRUCTOR_NAME);\n\t          return inheritIfRequired(function () {\n\t            if (!isObject(data)) return new NativeTypedArrayConstructor(toIndex(data));\n\t            if (isArrayBuffer(data)) return $length !== undefined ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES), $length) : typedArrayOffset !== undefined ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES)) : new NativeTypedArrayConstructor(data);\n\t            if (isTypedArray(data)) return fromList(TypedArrayConstructor, data);\n\t            return typedArrayFrom.call(TypedArrayConstructor, data);\n\t          }(), dummy, TypedArrayConstructor);\n\t        });\n\t        if (objectSetPrototypeOf) objectSetPrototypeOf(TypedArrayConstructor, TypedArray);\n\t        forEach(getOwnPropertyNames(NativeTypedArrayConstructor), function (key) {\n\t          if (!(key in TypedArrayConstructor)) {\n\t            createNonEnumerableProperty(TypedArrayConstructor, key, NativeTypedArrayConstructor[key]);\n\t          }\n\t        });\n\t        TypedArrayConstructor.prototype = TypedArrayConstructorPrototype;\n\t      }\n\n\t      if (TypedArrayConstructorPrototype.constructor !== TypedArrayConstructor) {\n\t        createNonEnumerableProperty(TypedArrayConstructorPrototype, 'constructor', TypedArrayConstructor);\n\t      }\n\n\t      if (TYPED_ARRAY_TAG) {\n\t        createNonEnumerableProperty(TypedArrayConstructorPrototype, TYPED_ARRAY_TAG, CONSTRUCTOR_NAME);\n\t      }\n\n\t      exported[CONSTRUCTOR_NAME] = TypedArrayConstructor;\n\t      _export({\n\t        global: true,\n\t        forced: TypedArrayConstructor != NativeTypedArrayConstructor,\n\t        sham: !NATIVE_ARRAY_BUFFER_VIEWS\n\t      }, exported);\n\n\t      if (!(BYTES_PER_ELEMENT in TypedArrayConstructor)) {\n\t        createNonEnumerableProperty(TypedArrayConstructor, BYTES_PER_ELEMENT, BYTES);\n\t      }\n\n\t      if (!(BYTES_PER_ELEMENT in TypedArrayConstructorPrototype)) {\n\t        createNonEnumerableProperty(TypedArrayConstructorPrototype, BYTES_PER_ELEMENT, BYTES);\n\t      }\n\n\t      setSpecies(CONSTRUCTOR_NAME);\n\t    };\n\t  } else module.exports = function () {\n\t    /* empty */\n\t  };\n\t});\n\n\t// https://tc39.github.io/ecma262/#sec-typedarray-objects\n\n\ttypedArrayConstructor('Int8', function (init) {\n\t  return function Int8Array(data, byteOffset, length) {\n\t    return init(this, data, byteOffset, length);\n\t  };\n\t});\n\tvar es_typedArray_int8Array = {};\n\n\t// https://tc39.github.io/ecma262/#sec-typedarray-objects\n\n\ttypedArrayConstructor('Uint8', function (init) {\n\t  return function Uint8Array(data, byteOffset, length) {\n\t    return init(this, data, byteOffset, length);\n\t  };\n\t});\n\tvar es_typedArray_uint8Array = {};\n\n\t// https://tc39.github.io/ecma262/#sec-typedarray-objects\n\n\ttypedArrayConstructor('Uint8', function (init) {\n\t  return function Uint8ClampedArray(data, byteOffset, length) {\n\t    return init(this, data, byteOffset, length);\n\t  };\n\t}, true);\n\tvar es_typedArray_uint8ClampedArray = {};\n\n\t// https://tc39.github.io/ecma262/#sec-typedarray-objects\n\n\ttypedArrayConstructor('Int16', function (init) {\n\t  return function Int16Array(data, byteOffset, length) {\n\t    return init(this, data, byteOffset, length);\n\t  };\n\t});\n\tvar es_typedArray_int16Array = {};\n\n\t// https://tc39.github.io/ecma262/#sec-typedarray-objects\n\n\ttypedArrayConstructor('Uint16', function (init) {\n\t  return function Uint16Array(data, byteOffset, length) {\n\t    return init(this, data, byteOffset, length);\n\t  };\n\t});\n\tvar es_typedArray_uint16Array = {};\n\n\t// https://tc39.github.io/ecma262/#sec-typedarray-objects\n\n\ttypedArrayConstructor('Int32', function (init) {\n\t  return function Int32Array(data, byteOffset, length) {\n\t    return init(this, data, byteOffset, length);\n\t  };\n\t});\n\tvar es_typedArray_int32Array = {};\n\n\t// https://tc39.github.io/ecma262/#sec-typedarray-objects\n\n\ttypedArrayConstructor('Uint32', function (init) {\n\t  return function Uint32Array(data, byteOffset, length) {\n\t    return init(this, data, byteOffset, length);\n\t  };\n\t});\n\tvar es_typedArray_uint32Array = {};\n\n\t// https://tc39.github.io/ecma262/#sec-typedarray-objects\n\n\ttypedArrayConstructor('Float32', function (init) {\n\t  return function Float32Array(data, byteOffset, length) {\n\t    return init(this, data, byteOffset, length);\n\t  };\n\t});\n\tvar es_typedArray_float32Array = {};\n\n\t// https://tc39.github.io/ecma262/#sec-typedarray-objects\n\n\ttypedArrayConstructor('Float64', function (init) {\n\t  return function Float64Array(data, byteOffset, length) {\n\t    return init(this, data, byteOffset, length);\n\t  };\n\t});\n\tvar es_typedArray_float64Array = {};\n\n\t'use strict';\n\n\tvar exportTypedArrayStaticMethod$1 = arrayBufferViewCore.exportTypedArrayStaticMethod; // `%TypedArray%.from` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.from\n\n\texportTypedArrayStaticMethod$1('from', typedArrayFrom, typedArrayConstructorsRequireWrappers);\n\tvar es_typedArray_from = {};\n\n\t'use strict';\n\n\tvar aTypedArrayConstructor$2 = arrayBufferViewCore.aTypedArrayConstructor;\n\tvar exportTypedArrayStaticMethod$2 = arrayBufferViewCore.exportTypedArrayStaticMethod; // `%TypedArray%.of` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.of\n\n\texportTypedArrayStaticMethod$2('of', function of()\n\t/* ...items */\n\t{\n\t  var index = 0;\n\t  var length = arguments.length;\n\t  var result = new (aTypedArrayConstructor$2(this))(length);\n\n\t  while (length > index) {\n\t    result[index] = arguments[index++];\n\t  }\n\n\t  return result;\n\t}, typedArrayConstructorsRequireWrappers);\n\tvar es_typedArray_of = {};\n\n\t'use strict';\n\n\tvar aTypedArray$1 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$1 = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.copyWithin` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.copywithin\n\n\texportTypedArrayMethod$1('copyWithin', function copyWithin(target, start\n\t/* , end */\n\t) {\n\t  return arrayCopyWithin.call(aTypedArray$1(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n\t});\n\tvar es_typedArray_copyWithin = {};\n\n\t'use strict';\n\n\tvar $every$1 = arrayIteration.every;\n\tvar aTypedArray$2 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$2 = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.every` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.every\n\n\texportTypedArrayMethod$2('every', function every(callbackfn\n\t/* , thisArg */\n\t) {\n\t  return $every$1(aTypedArray$2(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\tvar es_typedArray_every = {};\n\n\t'use strict';\n\n\tvar aTypedArray$3 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$3 = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.fill` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.fill\n\t// eslint-disable-next-line no-unused-vars\n\n\texportTypedArrayMethod$3('fill', function fill(value\n\t/* , start, end */\n\t) {\n\t  return arrayFill.apply(aTypedArray$3(this), arguments);\n\t});\n\tvar es_typedArray_fill = {};\n\n\t'use strict';\n\n\tvar $filter$1 = arrayIteration.filter;\n\tvar aTypedArray$4 = arrayBufferViewCore.aTypedArray;\n\tvar aTypedArrayConstructor$3 = arrayBufferViewCore.aTypedArrayConstructor;\n\tvar exportTypedArrayMethod$4 = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.filter` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.filter\n\n\texportTypedArrayMethod$4('filter', function filter(callbackfn\n\t/* , thisArg */\n\t) {\n\t  var list = $filter$1(aTypedArray$4(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t  var C = speciesConstructor(this, this.constructor);\n\t  var index = 0;\n\t  var length = list.length;\n\t  var result = new (aTypedArrayConstructor$3(C))(length);\n\n\t  while (length > index) {\n\t    result[index] = list[index++];\n\t  }\n\n\t  return result;\n\t});\n\tvar es_typedArray_filter = {};\n\n\t'use strict';\n\n\tvar $find$1 = arrayIteration.find;\n\tvar aTypedArray$5 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$5 = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.find` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.find\n\n\texportTypedArrayMethod$5('find', function find(predicate\n\t/* , thisArg */\n\t) {\n\t  return $find$1(aTypedArray$5(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\tvar es_typedArray_find = {};\n\n\t'use strict';\n\n\tvar $findIndex$1 = arrayIteration.findIndex;\n\tvar aTypedArray$6 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$6 = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.findIndex` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.findindex\n\n\texportTypedArrayMethod$6('findIndex', function findIndex(predicate\n\t/* , thisArg */\n\t) {\n\t  return $findIndex$1(aTypedArray$6(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\tvar es_typedArray_findIndex = {};\n\n\t'use strict';\n\n\tvar $forEach$2 = arrayIteration.forEach;\n\tvar aTypedArray$7 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$7 = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.forEach` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.foreach\n\n\texportTypedArrayMethod$7('forEach', function forEach(callbackfn\n\t/* , thisArg */\n\t) {\n\t  $forEach$2(aTypedArray$7(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\tvar es_typedArray_forEach = {};\n\n\t'use strict';\n\n\tvar $includes$1 = arrayIncludes.includes;\n\tvar aTypedArray$8 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$8 = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.includes` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.includes\n\n\texportTypedArrayMethod$8('includes', function includes(searchElement\n\t/* , fromIndex */\n\t) {\n\t  return $includes$1(aTypedArray$8(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\tvar es_typedArray_includes = {};\n\n\t'use strict';\n\n\tvar $indexOf$1 = arrayIncludes.indexOf;\n\tvar aTypedArray$9 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$9 = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.indexOf` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.indexof\n\n\texportTypedArrayMethod$9('indexOf', function indexOf(searchElement\n\t/* , fromIndex */\n\t) {\n\t  return $indexOf$1(aTypedArray$9(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\tvar es_typedArray_indexOf = {};\n\n\t'use strict';\n\n\tvar ITERATOR$5 = wellKnownSymbol('iterator');\n\tvar Uint8Array$1 = global_1.Uint8Array;\n\tvar arrayValues = es_array_iterator.values;\n\tvar arrayKeys = es_array_iterator.keys;\n\tvar arrayEntries = es_array_iterator.entries;\n\tvar aTypedArray$a = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$a = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar nativeTypedArrayIterator = Uint8Array$1 && Uint8Array$1.prototype[ITERATOR$5];\n\tvar CORRECT_ITER_NAME = !!nativeTypedArrayIterator && (nativeTypedArrayIterator.name == 'values' || nativeTypedArrayIterator.name == undefined);\n\n\tvar typedArrayValues = function values() {\n\t  return arrayValues.call(aTypedArray$a(this));\n\t}; // `%TypedArray%.prototype.entries` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.entries\n\n\n\texportTypedArrayMethod$a('entries', function entries() {\n\t  return arrayEntries.call(aTypedArray$a(this));\n\t}); // `%TypedArray%.prototype.keys` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.keys\n\n\texportTypedArrayMethod$a('keys', function keys() {\n\t  return arrayKeys.call(aTypedArray$a(this));\n\t}); // `%TypedArray%.prototype.values` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.values\n\n\texportTypedArrayMethod$a('values', typedArrayValues, !CORRECT_ITER_NAME); // `%TypedArray%.prototype[@@iterator]` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype-@@iterator\n\n\texportTypedArrayMethod$a(ITERATOR$5, typedArrayValues, !CORRECT_ITER_NAME);\n\tvar es_typedArray_iterator = {};\n\n\t'use strict';\n\n\tvar aTypedArray$b = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$b = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar $join = [].join; // `%TypedArray%.prototype.join` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.join\n\t// eslint-disable-next-line no-unused-vars\n\n\texportTypedArrayMethod$b('join', function join(separator) {\n\t  return $join.apply(aTypedArray$b(this), arguments);\n\t});\n\tvar es_typedArray_join = {};\n\n\t'use strict';\n\n\tvar aTypedArray$c = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$c = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.lastIndexOf` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.lastindexof\n\t// eslint-disable-next-line no-unused-vars\n\n\texportTypedArrayMethod$c('lastIndexOf', function lastIndexOf(searchElement\n\t/* , fromIndex */\n\t) {\n\t  return arrayLastIndexOf.apply(aTypedArray$c(this), arguments);\n\t});\n\tvar es_typedArray_lastIndexOf = {};\n\n\t'use strict';\n\n\tvar $map$1 = arrayIteration.map;\n\tvar aTypedArray$d = arrayBufferViewCore.aTypedArray;\n\tvar aTypedArrayConstructor$4 = arrayBufferViewCore.aTypedArrayConstructor;\n\tvar exportTypedArrayMethod$d = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.map` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.map\n\n\texportTypedArrayMethod$d('map', function map(mapfn\n\t/* , thisArg */\n\t) {\n\t  return $map$1(aTypedArray$d(this), mapfn, arguments.length > 1 ? arguments[1] : undefined, function (O, length) {\n\t    return new (aTypedArrayConstructor$4(speciesConstructor(O, O.constructor)))(length);\n\t  });\n\t});\n\tvar es_typedArray_map = {};\n\n\t'use strict';\n\n\tvar $reduce$1 = arrayReduce.left;\n\tvar aTypedArray$e = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$e = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.reduce` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reduce\n\n\texportTypedArrayMethod$e('reduce', function reduce(callbackfn\n\t/* , initialValue */\n\t) {\n\t  return $reduce$1(aTypedArray$e(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\tvar es_typedArray_reduce = {};\n\n\t'use strict';\n\n\tvar $reduceRight$1 = arrayReduce.right;\n\tvar aTypedArray$f = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$f = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.reduceRicht` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reduceright\n\n\texportTypedArrayMethod$f('reduceRight', function reduceRight(callbackfn\n\t/* , initialValue */\n\t) {\n\t  return $reduceRight$1(aTypedArray$f(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\tvar es_typedArray_reduceRight = {};\n\n\t'use strict';\n\n\tvar aTypedArray$g = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$g = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar floor$7 = Math.floor; // `%TypedArray%.prototype.reverse` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reverse\n\n\texportTypedArrayMethod$g('reverse', function reverse() {\n\t  var that = this;\n\t  var length = aTypedArray$g(that).length;\n\t  var middle = floor$7(length / 2);\n\t  var index = 0;\n\t  var value;\n\n\t  while (index < middle) {\n\t    value = that[index];\n\t    that[index++] = that[--length];\n\t    that[length] = value;\n\t  }\n\n\t  return that;\n\t});\n\tvar es_typedArray_reverse = {};\n\n\t'use strict';\n\n\tvar aTypedArray$h = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$h = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar FORCED$h = fails(function () {\n\t  // eslint-disable-next-line no-undef\n\t  new Int8Array(1).set({});\n\t}); // `%TypedArray%.prototype.set` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.set\n\n\texportTypedArrayMethod$h('set', function set(arrayLike\n\t/* , offset */\n\t) {\n\t  aTypedArray$h(this);\n\t  var offset = toOffset(arguments.length > 1 ? arguments[1] : undefined, 1);\n\t  var length = this.length;\n\t  var src = toObject(arrayLike);\n\t  var len = toLength(src.length);\n\t  var index = 0;\n\t  if (len + offset > length) throw RangeError('Wrong length');\n\n\t  while (index < len) {\n\t    this[offset + index] = src[index++];\n\t  }\n\t}, FORCED$h);\n\tvar es_typedArray_set = {};\n\n\t'use strict';\n\n\tvar aTypedArray$i = arrayBufferViewCore.aTypedArray;\n\tvar aTypedArrayConstructor$5 = arrayBufferViewCore.aTypedArrayConstructor;\n\tvar exportTypedArrayMethod$i = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar $slice = [].slice;\n\tvar FORCED$i = fails(function () {\n\t  // eslint-disable-next-line no-undef\n\t  new Int8Array(1).slice();\n\t}); // `%TypedArray%.prototype.slice` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.slice\n\n\texportTypedArrayMethod$i('slice', function slice(start, end) {\n\t  var list = $slice.call(aTypedArray$i(this), start, end);\n\t  var C = speciesConstructor(this, this.constructor);\n\t  var index = 0;\n\t  var length = list.length;\n\t  var result = new (aTypedArrayConstructor$5(C))(length);\n\n\t  while (length > index) {\n\t    result[index] = list[index++];\n\t  }\n\n\t  return result;\n\t}, FORCED$i);\n\tvar es_typedArray_slice = {};\n\n\t'use strict';\n\n\tvar $some$1 = arrayIteration.some;\n\tvar aTypedArray$j = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$j = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.some` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.some\n\n\texportTypedArrayMethod$j('some', function some(callbackfn\n\t/* , thisArg */\n\t) {\n\t  return $some$1(aTypedArray$j(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\tvar es_typedArray_some = {};\n\n\t'use strict';\n\n\tvar aTypedArray$k = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$k = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar $sort = [].sort; // `%TypedArray%.prototype.sort` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.sort\n\n\texportTypedArrayMethod$k('sort', function sort(comparefn) {\n\t  return $sort.call(aTypedArray$k(this), comparefn);\n\t});\n\tvar es_typedArray_sort = {};\n\n\t'use strict';\n\n\tvar aTypedArray$l = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$l = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.subarray` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.subarray\n\n\texportTypedArrayMethod$l('subarray', function subarray(begin, end) {\n\t  var O = aTypedArray$l(this);\n\t  var length = O.length;\n\t  var beginIndex = toAbsoluteIndex(begin, length);\n\t  return new (speciesConstructor(O, O.constructor))(O.buffer, O.byteOffset + beginIndex * O.BYTES_PER_ELEMENT, toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - beginIndex));\n\t});\n\tvar es_typedArray_subarray = {};\n\n\t'use strict';\n\n\tvar Int8Array$3 = global_1.Int8Array;\n\tvar aTypedArray$m = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$m = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar $toLocaleString = [].toLocaleString;\n\tvar $slice$1 = [].slice; // iOS Safari 6.x fails here\n\n\tvar TO_LOCALE_STRING_BUG = !!Int8Array$3 && fails(function () {\n\t  $toLocaleString.call(new Int8Array$3(1));\n\t});\n\tvar FORCED$j = fails(function () {\n\t  return [1, 2].toLocaleString() != new Int8Array$3([1, 2]).toLocaleString();\n\t}) || !fails(function () {\n\t  Int8Array$3.prototype.toLocaleString.call([1, 2]);\n\t}); // `%TypedArray%.prototype.toLocaleString` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.tolocalestring\n\n\texportTypedArrayMethod$m('toLocaleString', function toLocaleString() {\n\t  return $toLocaleString.apply(TO_LOCALE_STRING_BUG ? $slice$1.call(aTypedArray$m(this)) : aTypedArray$m(this), arguments);\n\t}, FORCED$j);\n\tvar es_typedArray_toLocaleString = {};\n\n\t'use strict';\n\n\tvar exportTypedArrayMethod$n = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar Uint8Array$2 = global_1.Uint8Array;\n\tvar Uint8ArrayPrototype = Uint8Array$2 && Uint8Array$2.prototype || {};\n\tvar arrayToString = [].toString;\n\tvar arrayJoin = [].join;\n\n\tif (fails(function () {\n\t  arrayToString.call({});\n\t})) {\n\t  arrayToString = function toString() {\n\t    return arrayJoin.call(this);\n\t  };\n\t}\n\n\tvar IS_NOT_ARRAY_METHOD = Uint8ArrayPrototype.toString != arrayToString; // `%TypedArray%.prototype.toString` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.tostring\n\n\texportTypedArrayMethod$n('toString', arrayToString, IS_NOT_ARRAY_METHOD);\n\tvar es_typedArray_toString = {};\n\n\tvar nativeApply = getBuiltIn('Reflect', 'apply');\n\tvar functionApply = Function.apply; // MS Edge argumentsList argument is optional\n\n\tvar OPTIONAL_ARGUMENTS_LIST = !fails(function () {\n\t  nativeApply(function () {\n\t    /* empty */\n\t  });\n\t}); // `Reflect.apply` method\n\t// https://tc39.github.io/ecma262/#sec-reflect.apply\n\n\t_export({\n\t  target: 'Reflect',\n\t  stat: true,\n\t  forced: OPTIONAL_ARGUMENTS_LIST\n\t}, {\n\t  apply: function apply(target, thisArgument, argumentsList) {\n\t    aFunction$1(target);\n\t    anObject(argumentsList);\n\t    return nativeApply ? nativeApply(target, thisArgument, argumentsList) : functionApply.call(target, thisArgument, argumentsList);\n\t  }\n\t});\n\tvar es_reflect_apply = {};\n\n\tvar nativeConstruct = getBuiltIn('Reflect', 'construct'); // `Reflect.construct` method\n\t// https://tc39.github.io/ecma262/#sec-reflect.construct\n\t// MS Edge supports only 2 arguments and argumentsList argument is optional\n\t// FF Nightly sets third argument as `new.target`, but does not create `this` from it\n\n\tvar NEW_TARGET_BUG = fails(function () {\n\t  function F() {\n\t    /* empty */\n\t  }\n\n\t  return !(nativeConstruct(function () {\n\t    /* empty */\n\t  }, [], F) instanceof F);\n\t});\n\tvar ARGS_BUG = !fails(function () {\n\t  nativeConstruct(function () {\n\t    /* empty */\n\t  });\n\t});\n\tvar FORCED$k = NEW_TARGET_BUG || ARGS_BUG;\n\t_export({\n\t  target: 'Reflect',\n\t  stat: true,\n\t  forced: FORCED$k,\n\t  sham: FORCED$k\n\t}, {\n\t  construct: function construct(Target, args\n\t  /* , newTarget */\n\t  ) {\n\t    aFunction$1(Target);\n\t    anObject(args);\n\t    var newTarget = arguments.length < 3 ? Target : aFunction$1(arguments[2]);\n\t    if (ARGS_BUG && !NEW_TARGET_BUG) return nativeConstruct(Target, args, newTarget);\n\n\t    if (Target == newTarget) {\n\t      // w/o altered newTarget, optimization for 0-4 arguments\n\t      switch (args.length) {\n\t        case 0:\n\t          return new Target();\n\n\t        case 1:\n\t          return new Target(args[0]);\n\n\t        case 2:\n\t          return new Target(args[0], args[1]);\n\n\t        case 3:\n\t          return new Target(args[0], args[1], args[2]);\n\n\t        case 4:\n\t          return new Target(args[0], args[1], args[2], args[3]);\n\t      } // w/o altered newTarget, lot of arguments case\n\n\n\t      var $args = [null];\n\t      $args.push.apply($args, args);\n\t      return new (functionBind.apply(Target, $args))();\n\t    } // with altered newTarget, not support built-in constructors\n\n\n\t    var proto = newTarget.prototype;\n\t    var instance = objectCreate(isObject(proto) ? proto : Object.prototype);\n\t    var result = Function.apply.call(Target, instance, args);\n\t    return isObject(result) ? result : instance;\n\t  }\n\t});\n\tvar es_reflect_construct = {};\n\n\tvar ERROR_INSTEAD_OF_FALSE = fails(function () {\n\t  // eslint-disable-next-line no-undef\n\t  Reflect.defineProperty(objectDefineProperty.f({}, 1, {\n\t    value: 1\n\t  }), 1, {\n\t    value: 2\n\t  });\n\t}); // `Reflect.defineProperty` method\n\t// https://tc39.github.io/ecma262/#sec-reflect.defineproperty\n\n\t_export({\n\t  target: 'Reflect',\n\t  stat: true,\n\t  forced: ERROR_INSTEAD_OF_FALSE,\n\t  sham: !descriptors\n\t}, {\n\t  defineProperty: function defineProperty(target, propertyKey, attributes) {\n\t    anObject(target);\n\t    var key = toPrimitive(propertyKey, true);\n\t    anObject(attributes);\n\n\t    try {\n\t      objectDefineProperty.f(target, key, attributes);\n\t      return true;\n\t    } catch (error) {\n\t      return false;\n\t    }\n\t  }\n\t});\n\tvar es_reflect_defineProperty = {};\n\n\tvar getOwnPropertyDescriptor$8 = objectGetOwnPropertyDescriptor.f; // `Reflect.deleteProperty` method\n\t// https://tc39.github.io/ecma262/#sec-reflect.deleteproperty\n\n\t_export({\n\t  target: 'Reflect',\n\t  stat: true\n\t}, {\n\t  deleteProperty: function deleteProperty(target, propertyKey) {\n\t    var descriptor = getOwnPropertyDescriptor$8(anObject(target), propertyKey);\n\t    return descriptor && !descriptor.configurable ? false : delete target[propertyKey];\n\t  }\n\t});\n\tvar es_reflect_deleteProperty = {};\n\n\t// https://tc39.github.io/ecma262/#sec-reflect.get\n\n\tfunction get$2(target, propertyKey\n\t/* , receiver */\n\t) {\n\t  var receiver = arguments.length < 3 ? target : arguments[2];\n\t  var descriptor, prototype;\n\t  if (anObject(target) === receiver) return target[propertyKey];\n\t  if (descriptor = objectGetOwnPropertyDescriptor.f(target, propertyKey)) return has(descriptor, 'value') ? descriptor.value : descriptor.get === undefined ? undefined : descriptor.get.call(receiver);\n\t  if (isObject(prototype = objectGetPrototypeOf(target))) return get$2(prototype, propertyKey, receiver);\n\t}\n\n\t_export({\n\t  target: 'Reflect',\n\t  stat: true\n\t}, {\n\t  get: get$2\n\t});\n\tvar es_reflect_get = {};\n\n\t// https://tc39.github.io/ecma262/#sec-reflect.getownpropertydescriptor\n\n\t_export({\n\t  target: 'Reflect',\n\t  stat: true,\n\t  sham: !descriptors\n\t}, {\n\t  getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n\t    return objectGetOwnPropertyDescriptor.f(anObject(target), propertyKey);\n\t  }\n\t});\n\tvar es_reflect_getOwnPropertyDescriptor = {};\n\n\t// https://tc39.github.io/ecma262/#sec-reflect.getprototypeof\n\n\t_export({\n\t  target: 'Reflect',\n\t  stat: true,\n\t  sham: !correctPrototypeGetter\n\t}, {\n\t  getPrototypeOf: function getPrototypeOf(target) {\n\t    return objectGetPrototypeOf(anObject(target));\n\t  }\n\t});\n\tvar es_reflect_getPrototypeOf = {};\n\n\t// https://tc39.github.io/ecma262/#sec-reflect.has\n\n\t_export({\n\t  target: 'Reflect',\n\t  stat: true\n\t}, {\n\t  has: function has(target, propertyKey) {\n\t    return propertyKey in target;\n\t  }\n\t});\n\tvar es_reflect_has = {};\n\n\tvar objectIsExtensible = Object.isExtensible; // `Reflect.isExtensible` method\n\t// https://tc39.github.io/ecma262/#sec-reflect.isextensible\n\n\t_export({\n\t  target: 'Reflect',\n\t  stat: true\n\t}, {\n\t  isExtensible: function isExtensible(target) {\n\t    anObject(target);\n\t    return objectIsExtensible ? objectIsExtensible(target) : true;\n\t  }\n\t});\n\tvar es_reflect_isExtensible = {};\n\n\t// https://tc39.github.io/ecma262/#sec-reflect.ownkeys\n\n\t_export({\n\t  target: 'Reflect',\n\t  stat: true\n\t}, {\n\t  ownKeys: ownKeys\n\t});\n\tvar es_reflect_ownKeys = {};\n\n\t// https://tc39.github.io/ecma262/#sec-reflect.preventextensions\n\n\t_export({\n\t  target: 'Reflect',\n\t  stat: true,\n\t  sham: !freezing\n\t}, {\n\t  preventExtensions: function preventExtensions(target) {\n\t    anObject(target);\n\n\t    try {\n\t      var objectPreventExtensions = getBuiltIn('Object', 'preventExtensions');\n\t      if (objectPreventExtensions) objectPreventExtensions(target);\n\t      return true;\n\t    } catch (error) {\n\t      return false;\n\t    }\n\t  }\n\t});\n\tvar es_reflect_preventExtensions = {};\n\n\t// https://tc39.github.io/ecma262/#sec-reflect.set\n\n\tfunction set$3(target, propertyKey, V\n\t/* , receiver */\n\t) {\n\t  var receiver = arguments.length < 4 ? target : arguments[3];\n\t  var ownDescriptor = objectGetOwnPropertyDescriptor.f(anObject(target), propertyKey);\n\t  var existingDescriptor, prototype;\n\n\t  if (!ownDescriptor) {\n\t    if (isObject(prototype = objectGetPrototypeOf(target))) {\n\t      return set$3(prototype, propertyKey, V, receiver);\n\t    }\n\n\t    ownDescriptor = createPropertyDescriptor(0);\n\t  }\n\n\t  if (has(ownDescriptor, 'value')) {\n\t    if (ownDescriptor.writable === false || !isObject(receiver)) return false;\n\n\t    if (existingDescriptor = objectGetOwnPropertyDescriptor.f(receiver, propertyKey)) {\n\t      if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false;\n\t      existingDescriptor.value = V;\n\t      objectDefineProperty.f(receiver, propertyKey, existingDescriptor);\n\t    } else objectDefineProperty.f(receiver, propertyKey, createPropertyDescriptor(0, V));\n\n\t    return true;\n\t  }\n\n\t  return ownDescriptor.set === undefined ? false : (ownDescriptor.set.call(receiver, V), true);\n\t} // MS Edge 17-18 Reflect.set allows setting the property to object\n\t// with non-writable property on the prototype\n\n\n\tvar MS_EDGE_BUG = fails(function () {\n\t  var object = objectDefineProperty.f({}, 'a', {\n\t    configurable: true\n\t  }); // eslint-disable-next-line no-undef\n\n\t  return Reflect.set(objectGetPrototypeOf(object), 'a', 1, object) !== false;\n\t});\n\t_export({\n\t  target: 'Reflect',\n\t  stat: true,\n\t  forced: MS_EDGE_BUG\n\t}, {\n\t  set: set$3\n\t});\n\tvar es_reflect_set = {};\n\n\t// https://tc39.github.io/ecma262/#sec-reflect.setprototypeof\n\n\tif (objectSetPrototypeOf) _export({\n\t  target: 'Reflect',\n\t  stat: true\n\t}, {\n\t  setPrototypeOf: function setPrototypeOf(target, proto) {\n\t    anObject(target);\n\t    aPossiblePrototype(proto);\n\n\t    try {\n\t      objectSetPrototypeOf(target, proto);\n\t      return true;\n\t    } catch (error) {\n\t      return false;\n\t    }\n\t  }\n\t});\n\tvar es_reflect_setPrototypeOf = {};\n\n\tvar es = path;\n\n\t// iterable DOM collections\n\t// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\n\tvar domIterables = {\n\t  CSSRuleList: 0,\n\t  CSSStyleDeclaration: 0,\n\t  CSSValueList: 0,\n\t  ClientRectList: 0,\n\t  DOMRectList: 0,\n\t  DOMStringList: 0,\n\t  DOMTokenList: 1,\n\t  DataTransferItemList: 0,\n\t  FileList: 0,\n\t  HTMLAllCollection: 0,\n\t  HTMLCollection: 0,\n\t  HTMLFormElement: 0,\n\t  HTMLSelectElement: 0,\n\t  MediaList: 0,\n\t  MimeTypeArray: 0,\n\t  NamedNodeMap: 0,\n\t  NodeList: 1,\n\t  PaintRequestList: 0,\n\t  Plugin: 0,\n\t  PluginArray: 0,\n\t  SVGLengthList: 0,\n\t  SVGNumberList: 0,\n\t  SVGPathSegList: 0,\n\t  SVGPointList: 0,\n\t  SVGStringList: 0,\n\t  SVGTransformList: 0,\n\t  SourceBufferList: 0,\n\t  StyleSheetList: 0,\n\t  TextTrackCueList: 0,\n\t  TextTrackList: 0,\n\t  TouchList: 0\n\t};\n\tvar domIterables_1 = domIterables.CSSRuleList;\n\tvar domIterables_2 = domIterables.CSSStyleDeclaration;\n\tvar domIterables_3 = domIterables.CSSValueList;\n\tvar domIterables_4 = domIterables.ClientRectList;\n\tvar domIterables_5 = domIterables.DOMRectList;\n\tvar domIterables_6 = domIterables.DOMStringList;\n\tvar domIterables_7 = domIterables.DOMTokenList;\n\tvar domIterables_8 = domIterables.DataTransferItemList;\n\tvar domIterables_9 = domIterables.FileList;\n\tvar domIterables_10 = domIterables.HTMLAllCollection;\n\tvar domIterables_11 = domIterables.HTMLCollection;\n\tvar domIterables_12 = domIterables.HTMLFormElement;\n\tvar domIterables_13 = domIterables.HTMLSelectElement;\n\tvar domIterables_14 = domIterables.MediaList;\n\tvar domIterables_15 = domIterables.MimeTypeArray;\n\tvar domIterables_16 = domIterables.NamedNodeMap;\n\tvar domIterables_17 = domIterables.NodeList;\n\tvar domIterables_18 = domIterables.PaintRequestList;\n\tvar domIterables_19 = domIterables.Plugin;\n\tvar domIterables_20 = domIterables.PluginArray;\n\tvar domIterables_21 = domIterables.SVGLengthList;\n\tvar domIterables_22 = domIterables.SVGNumberList;\n\tvar domIterables_23 = domIterables.SVGPathSegList;\n\tvar domIterables_24 = domIterables.SVGPointList;\n\tvar domIterables_25 = domIterables.SVGStringList;\n\tvar domIterables_26 = domIterables.SVGTransformList;\n\tvar domIterables_27 = domIterables.SourceBufferList;\n\tvar domIterables_28 = domIterables.StyleSheetList;\n\tvar domIterables_29 = domIterables.TextTrackCueList;\n\tvar domIterables_30 = domIterables.TextTrackList;\n\tvar domIterables_31 = domIterables.TouchList;\n\n\tfor (var COLLECTION_NAME in domIterables) {\n\t  var Collection = global_1[COLLECTION_NAME];\n\t  var CollectionPrototype = Collection && Collection.prototype; // some Chrome versions have non-configurable methods on DOMTokenList\n\n\t  if (CollectionPrototype && CollectionPrototype.forEach !== arrayForEach) try {\n\t    createNonEnumerableProperty(CollectionPrototype, 'forEach', arrayForEach);\n\t  } catch (error) {\n\t    CollectionPrototype.forEach = arrayForEach;\n\t  }\n\t}\n\n\tvar web_domCollections_forEach = {};\n\n\tvar ITERATOR$6 = wellKnownSymbol('iterator');\n\tvar TO_STRING_TAG$4 = wellKnownSymbol('toStringTag');\n\tvar ArrayValues = es_array_iterator.values;\n\n\tfor (var COLLECTION_NAME$1 in domIterables) {\n\t  var Collection$1 = global_1[COLLECTION_NAME$1];\n\t  var CollectionPrototype$1 = Collection$1 && Collection$1.prototype;\n\n\t  if (CollectionPrototype$1) {\n\t    // some Chrome versions have non-configurable methods on DOMTokenList\n\t    if (CollectionPrototype$1[ITERATOR$6] !== ArrayValues) try {\n\t      createNonEnumerableProperty(CollectionPrototype$1, ITERATOR$6, ArrayValues);\n\t    } catch (error) {\n\t      CollectionPrototype$1[ITERATOR$6] = ArrayValues;\n\t    }\n\n\t    if (!CollectionPrototype$1[TO_STRING_TAG$4]) {\n\t      createNonEnumerableProperty(CollectionPrototype$1, TO_STRING_TAG$4, COLLECTION_NAME$1);\n\t    }\n\n\t    if (domIterables[COLLECTION_NAME$1]) for (var METHOD_NAME in es_array_iterator) {\n\t      // some Chrome versions have non-configurable methods on DOMTokenList\n\t      if (CollectionPrototype$1[METHOD_NAME] !== es_array_iterator[METHOD_NAME]) try {\n\t        createNonEnumerableProperty(CollectionPrototype$1, METHOD_NAME, es_array_iterator[METHOD_NAME]);\n\t      } catch (error) {\n\t        CollectionPrototype$1[METHOD_NAME] = es_array_iterator[METHOD_NAME];\n\t      }\n\t    }\n\t  }\n\t}\n\n\tvar web_domCollections_iterator = {};\n\n\tvar FORCED$l = !global_1.setImmediate || !global_1.clearImmediate; // http://w3c.github.io/setImmediate/\n\n\t_export({\n\t  global: true,\n\t  bind: true,\n\t  enumerable: true,\n\t  forced: FORCED$l\n\t}, {\n\t  // `setImmediate` method\n\t  // http://w3c.github.io/setImmediate/#si-setImmediate\n\t  setImmediate: task.set,\n\t  // `clearImmediate` method\n\t  // http://w3c.github.io/setImmediate/#si-clearImmediate\n\t  clearImmediate: task.clear\n\t});\n\tvar web_immediate = {};\n\n\tvar process$5 = global_1.process;\n\tvar isNode = classofRaw(process$5) == 'process'; // `queueMicrotask` method\n\t// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-queuemicrotask\n\n\t_export({\n\t  global: true,\n\t  enumerable: true,\n\t  noTargetGet: true\n\t}, {\n\t  queueMicrotask: function queueMicrotask(fn) {\n\t    var domain = isNode && process$5.domain;\n\t    microtask(domain ? domain.bind(fn) : fn);\n\t  }\n\t});\n\tvar web_queueMicrotask = {};\n\n\tvar slice$1 = [].slice;\n\tvar MSIE = /MSIE .\\./.test(engineUserAgent); // <- dirty ie9- check\n\n\tvar wrap$1 = function wrap(scheduler) {\n\t  return function (handler, timeout\n\t  /* , ...arguments */\n\t  ) {\n\t    var boundArgs = arguments.length > 2;\n\t    var args = boundArgs ? slice$1.call(arguments, 2) : undefined;\n\t    return scheduler(boundArgs ? function () {\n\t      // eslint-disable-next-line no-new-func\n\t      (typeof handler == 'function' ? handler : Function(handler)).apply(this, args);\n\t    } : handler, timeout);\n\t  };\n\t}; // ie9- setTimeout & setInterval additional parameters fix\n\t// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers\n\n\n\t_export({\n\t  global: true,\n\t  bind: true,\n\t  forced: MSIE\n\t}, {\n\t  // `setTimeout` method\n\t  // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-settimeout\n\t  setTimeout: wrap$1(global_1.setTimeout),\n\t  // `setInterval` method\n\t  // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-setinterval\n\t  setInterval: wrap$1(global_1.setInterval)\n\t});\n\tvar web_timers = {};\n\n\tvar ITERATOR$7 = wellKnownSymbol('iterator');\n\tvar nativeUrl = !fails(function () {\n\t  var url = new URL('b?a=1&b=2&c=3', 'http://a');\n\t  var searchParams = url.searchParams;\n\t  var result = '';\n\t  url.pathname = 'c%20d';\n\t  searchParams.forEach(function (value, key) {\n\t    searchParams['delete']('b');\n\t    result += key + value;\n\t  });\n\t  return isPure && !url.toJSON || !searchParams.sort || url.href !== 'http://a/c%20d?a=1&c=3' || searchParams.get('c') !== '3' || String(new URLSearchParams('?a=1')) !== 'a=1' || !searchParams[ITERATOR$7] // throws in Edge\n\t  || new URL('https://a@b').username !== 'a' || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b' // not punycoded in Edge\n\t  || new URL('http://тест').host !== 'xn--e1aybc' // not escaped in Chrome 62-\n\t  || new URL('http://a#б').hash !== '#%D0%B1' // fails in Chrome 66-\n\t  || result !== 'a1c3' // throws in Safari\n\t  || new URL('http://x', undefined).host !== 'x';\n\t});\n\n\t'use strict'; // based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\n\n\tvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n\tvar base = 36;\n\tvar tMin = 1;\n\tvar tMax = 26;\n\tvar skew = 38;\n\tvar damp = 700;\n\tvar initialBias = 72;\n\tvar initialN = 128; // 0x80\n\n\tvar delimiter = '-'; // '\\x2D'\n\n\tvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\n\n\tvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n\tvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\n\tvar baseMinusTMin = base - tMin;\n\tvar floor$8 = Math.floor;\n\tvar stringFromCharCode = String.fromCharCode;\n\t/**\n\t * Creates an array containing the numeric code points of each Unicode\n\t * character in the string. While JavaScript uses UCS-2 internally,\n\t * this function will convert a pair of surrogate halves (each of which\n\t * UCS-2 exposes as separate characters) into a single code point,\n\t * matching UTF-16.\n\t */\n\n\tvar ucs2decode = function ucs2decode(string) {\n\t  var output = [];\n\t  var counter = 0;\n\t  var length = string.length;\n\n\t  while (counter < length) {\n\t    var value = string.charCodeAt(counter++);\n\n\t    if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t      // It's a high surrogate, and there is a next character.\n\t      var extra = string.charCodeAt(counter++);\n\n\t      if ((extra & 0xFC00) == 0xDC00) {\n\t        // Low surrogate.\n\t        output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t      } else {\n\t        // It's an unmatched surrogate; only append this code unit, in case the\n\t        // next code unit is the high surrogate of a surrogate pair.\n\t        output.push(value);\n\t        counter--;\n\t      }\n\t    } else {\n\t      output.push(value);\n\t    }\n\t  }\n\n\t  return output;\n\t};\n\t/**\n\t * Converts a digit/integer into a basic code point.\n\t */\n\n\n\tvar digitToBasic = function digitToBasic(digit) {\n\t  //  0..25 map to ASCII a..z or A..Z\n\t  // 26..35 map to ASCII 0..9\n\t  return digit + 22 + 75 * (digit < 26);\n\t};\n\t/**\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\n\t * https://tools.ietf.org/html/rfc3492#section-3.4\n\t */\n\n\n\tvar adapt = function adapt(delta, numPoints, firstTime) {\n\t  var k = 0;\n\t  delta = firstTime ? floor$8(delta / damp) : delta >> 1;\n\t  delta += floor$8(delta / numPoints);\n\n\t  for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t    delta = floor$8(delta / baseMinusTMin);\n\t  }\n\n\t  return floor$8(k + (baseMinusTMin + 1) * delta / (delta + skew));\n\t};\n\t/**\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\n\t * Punycode string of ASCII-only symbols.\n\t */\n\t// eslint-disable-next-line  max-statements\n\n\n\tvar encode = function encode(input) {\n\t  var output = []; // Convert the input in UCS-2 to an array of Unicode code points.\n\n\t  input = ucs2decode(input); // Cache the length.\n\n\t  var inputLength = input.length; // Initialize the state.\n\n\t  var n = initialN;\n\t  var delta = 0;\n\t  var bias = initialBias;\n\t  var i, currentValue; // Handle the basic code points.\n\n\t  for (i = 0; i < input.length; i++) {\n\t    currentValue = input[i];\n\n\t    if (currentValue < 0x80) {\n\t      output.push(stringFromCharCode(currentValue));\n\t    }\n\t  }\n\n\t  var basicLength = output.length; // number of basic code points.\n\n\t  var handledCPCount = basicLength; // number of code points that have been handled;\n\t  // Finish the basic string with a delimiter unless it's empty.\n\n\t  if (basicLength) {\n\t    output.push(delimiter);\n\t  } // Main encoding loop:\n\n\n\t  while (handledCPCount < inputLength) {\n\t    // All non-basic code points < n have been handled already. Find the next larger one:\n\t    var m = maxInt;\n\n\t    for (i = 0; i < input.length; i++) {\n\t      currentValue = input[i];\n\n\t      if (currentValue >= n && currentValue < m) {\n\t        m = currentValue;\n\t      }\n\t    } // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow.\n\n\n\t    var handledCPCountPlusOne = handledCPCount + 1;\n\n\t    if (m - n > floor$8((maxInt - delta) / handledCPCountPlusOne)) {\n\t      throw RangeError(OVERFLOW_ERROR);\n\t    }\n\n\t    delta += (m - n) * handledCPCountPlusOne;\n\t    n = m;\n\n\t    for (i = 0; i < input.length; i++) {\n\t      currentValue = input[i];\n\n\t      if (currentValue < n && ++delta > maxInt) {\n\t        throw RangeError(OVERFLOW_ERROR);\n\t      }\n\n\t      if (currentValue == n) {\n\t        // Represent delta as a generalized variable-length integer.\n\t        var q = delta;\n\n\t        for (var k = base;;\n\t        /* no condition */\n\t        k += base) {\n\t          var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n\t          if (q < t) break;\n\t          var qMinusT = q - t;\n\t          var baseMinusT = base - t;\n\t          output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n\t          q = floor$8(qMinusT / baseMinusT);\n\t        }\n\n\t        output.push(stringFromCharCode(digitToBasic(q)));\n\t        bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t        delta = 0;\n\t        ++handledCPCount;\n\t      }\n\t    }\n\n\t    ++delta;\n\t    ++n;\n\t  }\n\n\t  return output.join('');\n\t};\n\n\tvar stringPunycodeToAscii = function stringPunycodeToAscii(input) {\n\t  var encoded = [];\n\t  var labels = input.toLowerCase().replace(regexSeparators, \".\").split('.');\n\t  var i, label;\n\n\t  for (i = 0; i < labels.length; i++) {\n\t    label = labels[i];\n\t    encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n\t  }\n\n\t  return encoded.join('.');\n\t};\n\n\tvar getIterator = function getIterator(it) {\n\t  var iteratorMethod = getIteratorMethod(it);\n\n\t  if (typeof iteratorMethod != 'function') {\n\t    throw TypeError(String(it) + ' is not iterable');\n\t  }\n\n\t  return anObject(iteratorMethod.call(it));\n\t};\n\n\t'use strict'; // TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n\n\n\tvar $fetch$1 = getBuiltIn('fetch');\n\tvar Headers = getBuiltIn('Headers');\n\tvar ITERATOR$8 = wellKnownSymbol('iterator');\n\tvar URL_SEARCH_PARAMS = 'URLSearchParams';\n\tvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\n\tvar setInternalState$9 = internalState.set;\n\tvar getInternalParamsState = internalState.getterFor(URL_SEARCH_PARAMS);\n\tvar getInternalIteratorState = internalState.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\tvar plus = /\\+/g;\n\tvar sequences = Array(4);\n\n\tvar percentSequence = function percentSequence(bytes) {\n\t  return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n\t};\n\n\tvar percentDecode = function percentDecode(sequence) {\n\t  try {\n\t    return decodeURIComponent(sequence);\n\t  } catch (error) {\n\t    return sequence;\n\t  }\n\t};\n\n\tvar deserialize = function deserialize(it) {\n\t  var result = it.replace(plus, ' ');\n\t  var bytes = 4;\n\n\t  try {\n\t    return decodeURIComponent(result);\n\t  } catch (error) {\n\t    while (bytes) {\n\t      result = result.replace(percentSequence(bytes--), percentDecode);\n\t    }\n\n\t    return result;\n\t  }\n\t};\n\n\tvar find$1 = /[!'()~]|%20/g;\n\tvar replace = {\n\t  '!': '%21',\n\t  \"'\": '%27',\n\t  '(': '%28',\n\t  ')': '%29',\n\t  '~': '%7E',\n\t  '%20': '+'\n\t};\n\n\tvar replacer = function replacer(match) {\n\t  return replace[match];\n\t};\n\n\tvar serialize = function serialize(it) {\n\t  return encodeURIComponent(it).replace(find$1, replacer);\n\t};\n\n\tvar parseSearchParams = function parseSearchParams(result, query) {\n\t  if (query) {\n\t    var attributes = query.split('&');\n\t    var index = 0;\n\t    var attribute, entry;\n\n\t    while (index < attributes.length) {\n\t      attribute = attributes[index++];\n\n\t      if (attribute.length) {\n\t        entry = attribute.split('=');\n\t        result.push({\n\t          key: deserialize(entry.shift()),\n\t          value: deserialize(entry.join('='))\n\t        });\n\t      }\n\t    }\n\t  }\n\t};\n\n\tvar updateSearchParams = function updateSearchParams(query) {\n\t  this.entries.length = 0;\n\t  parseSearchParams(this.entries, query);\n\t};\n\n\tvar validateArgumentsLength = function validateArgumentsLength(passed, required) {\n\t  if (passed < required) throw TypeError('Not enough arguments');\n\t};\n\n\tvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n\t  setInternalState$9(this, {\n\t    type: URL_SEARCH_PARAMS_ITERATOR,\n\t    iterator: getIterator(getInternalParamsState(params).entries),\n\t    kind: kind\n\t  });\n\t}, 'Iterator', function next() {\n\t  var state = getInternalIteratorState(this);\n\t  var kind = state.kind;\n\t  var step = state.iterator.next();\n\t  var entry = step.value;\n\n\t  if (!step.done) {\n\t    step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n\t  }\n\n\t  return step;\n\t}); // `URLSearchParams` constructor\n\t// https://url.spec.whatwg.org/#interface-urlsearchparams\n\n\tvar URLSearchParamsConstructor = function URLSearchParams()\n\t/* init */\n\t{\n\t  anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\t  var init = arguments.length > 0 ? arguments[0] : undefined;\n\t  var that = this;\n\t  var entries = [];\n\t  var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\t  setInternalState$9(that, {\n\t    type: URL_SEARCH_PARAMS,\n\t    entries: entries,\n\t    updateURL: function updateURL() {\n\t      /* empty */\n\t    },\n\t    updateSearchParams: updateSearchParams\n\t  });\n\n\t  if (init !== undefined) {\n\t    if (isObject(init)) {\n\t      iteratorMethod = getIteratorMethod(init);\n\n\t      if (typeof iteratorMethod === 'function') {\n\t        iterator = iteratorMethod.call(init);\n\t        next = iterator.next;\n\n\t        while (!(step = next.call(iterator)).done) {\n\t          entryIterator = getIterator(anObject(step.value));\n\t          entryNext = entryIterator.next;\n\t          if ((first = entryNext.call(entryIterator)).done || (second = entryNext.call(entryIterator)).done || !entryNext.call(entryIterator).done) throw TypeError('Expected sequence with length 2');\n\t          entries.push({\n\t            key: first.value + '',\n\t            value: second.value + ''\n\t          });\n\t        }\n\t      } else for (key in init) {\n\t        if (has(init, key)) entries.push({\n\t          key: key,\n\t          value: init[key] + ''\n\t        });\n\t      }\n\t    } else {\n\t      parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n\t    }\n\t  }\n\t};\n\n\tvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\tredefineAll(URLSearchParamsPrototype, {\n\t  // `URLSearchParams.prototype.appent` method\n\t  // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n\t  append: function append(name, value) {\n\t    validateArgumentsLength(arguments.length, 2);\n\t    var state = getInternalParamsState(this);\n\t    state.entries.push({\n\t      key: name + '',\n\t      value: value + ''\n\t    });\n\t    state.updateURL();\n\t  },\n\t  // `URLSearchParams.prototype.delete` method\n\t  // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n\t  'delete': function _delete(name) {\n\t    validateArgumentsLength(arguments.length, 1);\n\t    var state = getInternalParamsState(this);\n\t    var entries = state.entries;\n\t    var key = name + '';\n\t    var index = 0;\n\n\t    while (index < entries.length) {\n\t      if (entries[index].key === key) entries.splice(index, 1);else index++;\n\t    }\n\n\t    state.updateURL();\n\t  },\n\t  // `URLSearchParams.prototype.get` method\n\t  // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n\t  get: function get(name) {\n\t    validateArgumentsLength(arguments.length, 1);\n\t    var entries = getInternalParamsState(this).entries;\n\t    var key = name + '';\n\t    var index = 0;\n\n\t    for (; index < entries.length; index++) {\n\t      if (entries[index].key === key) return entries[index].value;\n\t    }\n\n\t    return null;\n\t  },\n\t  // `URLSearchParams.prototype.getAll` method\n\t  // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n\t  getAll: function getAll(name) {\n\t    validateArgumentsLength(arguments.length, 1);\n\t    var entries = getInternalParamsState(this).entries;\n\t    var key = name + '';\n\t    var result = [];\n\t    var index = 0;\n\n\t    for (; index < entries.length; index++) {\n\t      if (entries[index].key === key) result.push(entries[index].value);\n\t    }\n\n\t    return result;\n\t  },\n\t  // `URLSearchParams.prototype.has` method\n\t  // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n\t  has: function has(name) {\n\t    validateArgumentsLength(arguments.length, 1);\n\t    var entries = getInternalParamsState(this).entries;\n\t    var key = name + '';\n\t    var index = 0;\n\n\t    while (index < entries.length) {\n\t      if (entries[index++].key === key) return true;\n\t    }\n\n\t    return false;\n\t  },\n\t  // `URLSearchParams.prototype.set` method\n\t  // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n\t  set: function set(name, value) {\n\t    validateArgumentsLength(arguments.length, 1);\n\t    var state = getInternalParamsState(this);\n\t    var entries = state.entries;\n\t    var found = false;\n\t    var key = name + '';\n\t    var val = value + '';\n\t    var index = 0;\n\t    var entry;\n\n\t    for (; index < entries.length; index++) {\n\t      entry = entries[index];\n\n\t      if (entry.key === key) {\n\t        if (found) entries.splice(index--, 1);else {\n\t          found = true;\n\t          entry.value = val;\n\t        }\n\t      }\n\t    }\n\n\t    if (!found) entries.push({\n\t      key: key,\n\t      value: val\n\t    });\n\t    state.updateURL();\n\t  },\n\t  // `URLSearchParams.prototype.sort` method\n\t  // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n\t  sort: function sort() {\n\t    var state = getInternalParamsState(this);\n\t    var entries = state.entries; // Array#sort is not stable in some engines\n\n\t    var slice = entries.slice();\n\t    var entry, entriesIndex, sliceIndex;\n\t    entries.length = 0;\n\n\t    for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n\t      entry = slice[sliceIndex];\n\n\t      for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n\t        if (entries[entriesIndex].key > entry.key) {\n\t          entries.splice(entriesIndex, 0, entry);\n\t          break;\n\t        }\n\t      }\n\n\t      if (entriesIndex === sliceIndex) entries.push(entry);\n\t    }\n\n\t    state.updateURL();\n\t  },\n\t  // `URLSearchParams.prototype.forEach` method\n\t  forEach: function forEach(callback\n\t  /* , thisArg */\n\t  ) {\n\t    var entries = getInternalParamsState(this).entries;\n\t    var boundFunction = functionBindContext(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n\t    var index = 0;\n\t    var entry;\n\n\t    while (index < entries.length) {\n\t      entry = entries[index++];\n\t      boundFunction(entry.value, entry.key, this);\n\t    }\n\t  },\n\t  // `URLSearchParams.prototype.keys` method\n\t  keys: function keys() {\n\t    return new URLSearchParamsIterator(this, 'keys');\n\t  },\n\t  // `URLSearchParams.prototype.values` method\n\t  values: function values() {\n\t    return new URLSearchParamsIterator(this, 'values');\n\t  },\n\t  // `URLSearchParams.prototype.entries` method\n\t  entries: function entries() {\n\t    return new URLSearchParamsIterator(this, 'entries');\n\t  }\n\t}, {\n\t  enumerable: true\n\t}); // `URLSearchParams.prototype[@@iterator]` method\n\n\tredefine(URLSearchParamsPrototype, ITERATOR$8, URLSearchParamsPrototype.entries); // `URLSearchParams.prototype.toString` method\n\t// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\n\n\tredefine(URLSearchParamsPrototype, 'toString', function toString() {\n\t  var entries = getInternalParamsState(this).entries;\n\t  var result = [];\n\t  var index = 0;\n\t  var entry;\n\n\t  while (index < entries.length) {\n\t    entry = entries[index++];\n\t    result.push(serialize(entry.key) + '=' + serialize(entry.value));\n\t  }\n\n\t  return result.join('&');\n\t}, {\n\t  enumerable: true\n\t});\n\tsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\t_export({\n\t  global: true,\n\t  forced: !nativeUrl\n\t}, {\n\t  URLSearchParams: URLSearchParamsConstructor\n\t}); // Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n\t// https://github.com/zloirock/core-js/issues/674\n\n\tif (!nativeUrl && typeof $fetch$1 == 'function' && typeof Headers == 'function') {\n\t  _export({\n\t    global: true,\n\t    enumerable: true,\n\t    forced: true\n\t  }, {\n\t    fetch: function fetch(input\n\t    /* , init */\n\t    ) {\n\t      var args = [input];\n\t      var init, body, headers;\n\n\t      if (arguments.length > 1) {\n\t        init = arguments[1];\n\n\t        if (isObject(init)) {\n\t          body = init.body;\n\n\t          if (classof(body) === URL_SEARCH_PARAMS) {\n\t            headers = init.headers ? new Headers(init.headers) : new Headers();\n\n\t            if (!headers.has('content-type')) {\n\t              headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n\t            }\n\n\t            init = objectCreate(init, {\n\t              body: createPropertyDescriptor(0, String(body)),\n\t              headers: createPropertyDescriptor(0, headers)\n\t            });\n\t          }\n\t        }\n\n\t        args.push(init);\n\t      }\n\n\t      return $fetch$1.apply(this, args);\n\t    }\n\t  });\n\t}\n\n\tvar web_urlSearchParams = {\n\t  URLSearchParams: URLSearchParamsConstructor,\n\t  getState: getInternalParamsState\n\t};\n\tvar web_urlSearchParams_1 = web_urlSearchParams.URLSearchParams;\n\tvar web_urlSearchParams_2 = web_urlSearchParams.getState;\n\n\t'use strict'; // TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n\n\n\tvar codeAt$1 = stringMultibyte.codeAt;\n\tvar NativeURL = global_1.URL;\n\tvar URLSearchParams$1 = web_urlSearchParams.URLSearchParams;\n\tvar getInternalSearchParamsState = web_urlSearchParams.getState;\n\tvar setInternalState$a = internalState.set;\n\tvar getInternalURLState = internalState.getterFor('URL');\n\tvar floor$9 = Math.floor;\n\tvar pow$4 = Math.pow;\n\tvar INVALID_AUTHORITY = 'Invalid authority';\n\tvar INVALID_SCHEME = 'Invalid scheme';\n\tvar INVALID_HOST = 'Invalid host';\n\tvar INVALID_PORT = 'Invalid port';\n\tvar ALPHA = /[A-Za-z]/;\n\tvar ALPHANUMERIC = /[\\d+-.A-Za-z]/;\n\tvar DIGIT = /\\d/;\n\tvar HEX_START = /^(0x|0X)/;\n\tvar OCT = /^[0-7]+$/;\n\tvar DEC = /^\\d+$/;\n\tvar HEX = /^[\\dA-Fa-f]+$/; // eslint-disable-next-line no-control-regex\n\n\tvar FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\u0009\\u000A\\u000D #%/:?@[\\\\]]/; // eslint-disable-next-line no-control-regex\n\n\tvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\u0009\\u000A\\u000D #/:?@[\\\\]]/; // eslint-disable-next-line no-control-regex\n\n\tvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g; // eslint-disable-next-line no-control-regex\n\n\tvar TAB_AND_NEW_LINE = /[\\u0009\\u000A\\u000D]/g;\n\tvar EOF;\n\n\tvar parseHost = function parseHost(url, input) {\n\t  var result, codePoints, index;\n\n\t  if (input.charAt(0) == '[') {\n\t    if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n\t    result = parseIPv6(input.slice(1, -1));\n\t    if (!result) return INVALID_HOST;\n\t    url.host = result; // opaque host\n\t  } else if (!isSpecial(url)) {\n\t    if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n\t    result = '';\n\t    codePoints = arrayFrom(input);\n\n\t    for (index = 0; index < codePoints.length; index++) {\n\t      result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n\t    }\n\n\t    url.host = result;\n\t  } else {\n\t    input = stringPunycodeToAscii(input);\n\t    if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n\t    result = parseIPv4(input);\n\t    if (result === null) return INVALID_HOST;\n\t    url.host = result;\n\t  }\n\t};\n\n\tvar parseIPv4 = function parseIPv4(input) {\n\t  var parts = input.split('.');\n\t  var partsLength, numbers, index, part, radix, number, ipv4;\n\n\t  if (parts.length && parts[parts.length - 1] == '') {\n\t    parts.pop();\n\t  }\n\n\t  partsLength = parts.length;\n\t  if (partsLength > 4) return input;\n\t  numbers = [];\n\n\t  for (index = 0; index < partsLength; index++) {\n\t    part = parts[index];\n\t    if (part == '') return input;\n\t    radix = 10;\n\n\t    if (part.length > 1 && part.charAt(0) == '0') {\n\t      radix = HEX_START.test(part) ? 16 : 8;\n\t      part = part.slice(radix == 8 ? 1 : 2);\n\t    }\n\n\t    if (part === '') {\n\t      number = 0;\n\t    } else {\n\t      if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n\t      number = parseInt(part, radix);\n\t    }\n\n\t    numbers.push(number);\n\t  }\n\n\t  for (index = 0; index < partsLength; index++) {\n\t    number = numbers[index];\n\n\t    if (index == partsLength - 1) {\n\t      if (number >= pow$4(256, 5 - partsLength)) return null;\n\t    } else if (number > 255) return null;\n\t  }\n\n\t  ipv4 = numbers.pop();\n\n\t  for (index = 0; index < numbers.length; index++) {\n\t    ipv4 += numbers[index] * pow$4(256, 3 - index);\n\t  }\n\n\t  return ipv4;\n\t}; // eslint-disable-next-line max-statements\n\n\n\tvar parseIPv6 = function parseIPv6(input) {\n\t  var address = [0, 0, 0, 0, 0, 0, 0, 0];\n\t  var pieceIndex = 0;\n\t  var compress = null;\n\t  var pointer = 0;\n\t  var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n\t  var char = function char() {\n\t    return input.charAt(pointer);\n\t  };\n\n\t  if (char() == ':') {\n\t    if (input.charAt(1) != ':') return;\n\t    pointer += 2;\n\t    pieceIndex++;\n\t    compress = pieceIndex;\n\t  }\n\n\t  while (char()) {\n\t    if (pieceIndex == 8) return;\n\n\t    if (char() == ':') {\n\t      if (compress !== null) return;\n\t      pointer++;\n\t      pieceIndex++;\n\t      compress = pieceIndex;\n\t      continue;\n\t    }\n\n\t    value = length = 0;\n\n\t    while (length < 4 && HEX.test(char())) {\n\t      value = value * 16 + parseInt(char(), 16);\n\t      pointer++;\n\t      length++;\n\t    }\n\n\t    if (char() == '.') {\n\t      if (length == 0) return;\n\t      pointer -= length;\n\t      if (pieceIndex > 6) return;\n\t      numbersSeen = 0;\n\n\t      while (char()) {\n\t        ipv4Piece = null;\n\n\t        if (numbersSeen > 0) {\n\t          if (char() == '.' && numbersSeen < 4) pointer++;else return;\n\t        }\n\n\t        if (!DIGIT.test(char())) return;\n\n\t        while (DIGIT.test(char())) {\n\t          number = parseInt(char(), 10);\n\t          if (ipv4Piece === null) ipv4Piece = number;else if (ipv4Piece == 0) return;else ipv4Piece = ipv4Piece * 10 + number;\n\t          if (ipv4Piece > 255) return;\n\t          pointer++;\n\t        }\n\n\t        address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n\t        numbersSeen++;\n\t        if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n\t      }\n\n\t      if (numbersSeen != 4) return;\n\t      break;\n\t    } else if (char() == ':') {\n\t      pointer++;\n\t      if (!char()) return;\n\t    } else if (char()) return;\n\n\t    address[pieceIndex++] = value;\n\t  }\n\n\t  if (compress !== null) {\n\t    swaps = pieceIndex - compress;\n\t    pieceIndex = 7;\n\n\t    while (pieceIndex != 0 && swaps > 0) {\n\t      swap = address[pieceIndex];\n\t      address[pieceIndex--] = address[compress + swaps - 1];\n\t      address[compress + --swaps] = swap;\n\t    }\n\t  } else if (pieceIndex != 8) return;\n\n\t  return address;\n\t};\n\n\tvar findLongestZeroSequence = function findLongestZeroSequence(ipv6) {\n\t  var maxIndex = null;\n\t  var maxLength = 1;\n\t  var currStart = null;\n\t  var currLength = 0;\n\t  var index = 0;\n\n\t  for (; index < 8; index++) {\n\t    if (ipv6[index] !== 0) {\n\t      if (currLength > maxLength) {\n\t        maxIndex = currStart;\n\t        maxLength = currLength;\n\t      }\n\n\t      currStart = null;\n\t      currLength = 0;\n\t    } else {\n\t      if (currStart === null) currStart = index;\n\t      ++currLength;\n\t    }\n\t  }\n\n\t  if (currLength > maxLength) {\n\t    maxIndex = currStart;\n\t    maxLength = currLength;\n\t  }\n\n\t  return maxIndex;\n\t};\n\n\tvar serializeHost = function serializeHost(host) {\n\t  var result, index, compress, ignore0; // ipv4\n\n\t  if (typeof host == 'number') {\n\t    result = [];\n\n\t    for (index = 0; index < 4; index++) {\n\t      result.unshift(host % 256);\n\t      host = floor$9(host / 256);\n\t    }\n\n\t    return result.join('.'); // ipv6\n\t  } else if (typeof host == 'object') {\n\t    result = '';\n\t    compress = findLongestZeroSequence(host);\n\n\t    for (index = 0; index < 8; index++) {\n\t      if (ignore0 && host[index] === 0) continue;\n\t      if (ignore0) ignore0 = false;\n\n\t      if (compress === index) {\n\t        result += index ? ':' : '::';\n\t        ignore0 = true;\n\t      } else {\n\t        result += host[index].toString(16);\n\t        if (index < 7) result += ':';\n\t      }\n\t    }\n\n\t    return '[' + result + ']';\n\t  }\n\n\t  return host;\n\t};\n\n\tvar C0ControlPercentEncodeSet = {};\n\tvar fragmentPercentEncodeSet = objectAssign({}, C0ControlPercentEncodeSet, {\n\t  ' ': 1,\n\t  '\"': 1,\n\t  '<': 1,\n\t  '>': 1,\n\t  '`': 1\n\t});\n\tvar pathPercentEncodeSet = objectAssign({}, fragmentPercentEncodeSet, {\n\t  '#': 1,\n\t  '?': 1,\n\t  '{': 1,\n\t  '}': 1\n\t});\n\tvar userinfoPercentEncodeSet = objectAssign({}, pathPercentEncodeSet, {\n\t  '/': 1,\n\t  ':': 1,\n\t  ';': 1,\n\t  '=': 1,\n\t  '@': 1,\n\t  '[': 1,\n\t  '\\\\': 1,\n\t  ']': 1,\n\t  '^': 1,\n\t  '|': 1\n\t});\n\n\tvar percentEncode = function percentEncode(char, set) {\n\t  var code = codeAt$1(char, 0);\n\t  return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n\t};\n\n\tvar specialSchemes = {\n\t  ftp: 21,\n\t  file: null,\n\t  http: 80,\n\t  https: 443,\n\t  ws: 80,\n\t  wss: 443\n\t};\n\n\tvar isSpecial = function isSpecial(url) {\n\t  return has(specialSchemes, url.scheme);\n\t};\n\n\tvar includesCredentials = function includesCredentials(url) {\n\t  return url.username != '' || url.password != '';\n\t};\n\n\tvar cannotHaveUsernamePasswordPort = function cannotHaveUsernamePasswordPort(url) {\n\t  return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n\t};\n\n\tvar isWindowsDriveLetter = function isWindowsDriveLetter(string, normalized) {\n\t  var second;\n\t  return string.length == 2 && ALPHA.test(string.charAt(0)) && ((second = string.charAt(1)) == ':' || !normalized && second == '|');\n\t};\n\n\tvar startsWithWindowsDriveLetter = function startsWithWindowsDriveLetter(string) {\n\t  var third;\n\t  return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (string.length == 2 || (third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#');\n\t};\n\n\tvar shortenURLsPath = function shortenURLsPath(url) {\n\t  var path = url.path;\n\t  var pathSize = path.length;\n\n\t  if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n\t    path.pop();\n\t  }\n\t};\n\n\tvar isSingleDot = function isSingleDot(segment) {\n\t  return segment === '.' || segment.toLowerCase() === '%2e';\n\t};\n\n\tvar isDoubleDot = function isDoubleDot(segment) {\n\t  segment = segment.toLowerCase();\n\t  return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n\t}; // States:\n\n\n\tvar SCHEME_START = {};\n\tvar SCHEME = {};\n\tvar NO_SCHEME = {};\n\tvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\n\tvar PATH_OR_AUTHORITY = {};\n\tvar RELATIVE = {};\n\tvar RELATIVE_SLASH = {};\n\tvar SPECIAL_AUTHORITY_SLASHES = {};\n\tvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\n\tvar AUTHORITY = {};\n\tvar HOST = {};\n\tvar HOSTNAME = {};\n\tvar PORT = {};\n\tvar FILE = {};\n\tvar FILE_SLASH = {};\n\tvar FILE_HOST = {};\n\tvar PATH_START = {};\n\tvar PATH = {};\n\tvar CANNOT_BE_A_BASE_URL_PATH = {};\n\tvar QUERY = {};\n\tvar FRAGMENT = {}; // eslint-disable-next-line max-statements\n\n\tvar parseURL = function parseURL(url, input, stateOverride, base) {\n\t  var state = stateOverride || SCHEME_START;\n\t  var pointer = 0;\n\t  var buffer = '';\n\t  var seenAt = false;\n\t  var seenBracket = false;\n\t  var seenPasswordToken = false;\n\t  var codePoints, char, bufferCodePoints, failure;\n\n\t  if (!stateOverride) {\n\t    url.scheme = '';\n\t    url.username = '';\n\t    url.password = '';\n\t    url.host = null;\n\t    url.port = null;\n\t    url.path = [];\n\t    url.query = null;\n\t    url.fragment = null;\n\t    url.cannotBeABaseURL = false;\n\t    input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n\t  }\n\n\t  input = input.replace(TAB_AND_NEW_LINE, '');\n\t  codePoints = arrayFrom(input);\n\n\t  while (pointer <= codePoints.length) {\n\t    char = codePoints[pointer];\n\n\t    switch (state) {\n\t      case SCHEME_START:\n\t        if (char && ALPHA.test(char)) {\n\t          buffer += char.toLowerCase();\n\t          state = SCHEME;\n\t        } else if (!stateOverride) {\n\t          state = NO_SCHEME;\n\t          continue;\n\t        } else return INVALID_SCHEME;\n\n\t        break;\n\n\t      case SCHEME:\n\t        if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n\t          buffer += char.toLowerCase();\n\t        } else if (char == ':') {\n\t          if (stateOverride && (isSpecial(url) != has(specialSchemes, buffer) || buffer == 'file' && (includesCredentials(url) || url.port !== null) || url.scheme == 'file' && !url.host)) return;\n\t          url.scheme = buffer;\n\n\t          if (stateOverride) {\n\t            if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n\t            return;\n\t          }\n\n\t          buffer = '';\n\n\t          if (url.scheme == 'file') {\n\t            state = FILE;\n\t          } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n\t            state = SPECIAL_RELATIVE_OR_AUTHORITY;\n\t          } else if (isSpecial(url)) {\n\t            state = SPECIAL_AUTHORITY_SLASHES;\n\t          } else if (codePoints[pointer + 1] == '/') {\n\t            state = PATH_OR_AUTHORITY;\n\t            pointer++;\n\t          } else {\n\t            url.cannotBeABaseURL = true;\n\t            url.path.push('');\n\t            state = CANNOT_BE_A_BASE_URL_PATH;\n\t          }\n\t        } else if (!stateOverride) {\n\t          buffer = '';\n\t          state = NO_SCHEME;\n\t          pointer = 0;\n\t          continue;\n\t        } else return INVALID_SCHEME;\n\n\t        break;\n\n\t      case NO_SCHEME:\n\t        if (!base || base.cannotBeABaseURL && char != '#') return INVALID_SCHEME;\n\n\t        if (base.cannotBeABaseURL && char == '#') {\n\t          url.scheme = base.scheme;\n\t          url.path = base.path.slice();\n\t          url.query = base.query;\n\t          url.fragment = '';\n\t          url.cannotBeABaseURL = true;\n\t          state = FRAGMENT;\n\t          break;\n\t        }\n\n\t        state = base.scheme == 'file' ? FILE : RELATIVE;\n\t        continue;\n\n\t      case SPECIAL_RELATIVE_OR_AUTHORITY:\n\t        if (char == '/' && codePoints[pointer + 1] == '/') {\n\t          state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n\t          pointer++;\n\t        } else {\n\t          state = RELATIVE;\n\t          continue;\n\t        }\n\n\t        break;\n\n\t      case PATH_OR_AUTHORITY:\n\t        if (char == '/') {\n\t          state = AUTHORITY;\n\t          break;\n\t        } else {\n\t          state = PATH;\n\t          continue;\n\t        }\n\n\t      case RELATIVE:\n\t        url.scheme = base.scheme;\n\n\t        if (char == EOF) {\n\t          url.username = base.username;\n\t          url.password = base.password;\n\t          url.host = base.host;\n\t          url.port = base.port;\n\t          url.path = base.path.slice();\n\t          url.query = base.query;\n\t        } else if (char == '/' || char == '\\\\' && isSpecial(url)) {\n\t          state = RELATIVE_SLASH;\n\t        } else if (char == '?') {\n\t          url.username = base.username;\n\t          url.password = base.password;\n\t          url.host = base.host;\n\t          url.port = base.port;\n\t          url.path = base.path.slice();\n\t          url.query = '';\n\t          state = QUERY;\n\t        } else if (char == '#') {\n\t          url.username = base.username;\n\t          url.password = base.password;\n\t          url.host = base.host;\n\t          url.port = base.port;\n\t          url.path = base.path.slice();\n\t          url.query = base.query;\n\t          url.fragment = '';\n\t          state = FRAGMENT;\n\t        } else {\n\t          url.username = base.username;\n\t          url.password = base.password;\n\t          url.host = base.host;\n\t          url.port = base.port;\n\t          url.path = base.path.slice();\n\t          url.path.pop();\n\t          state = PATH;\n\t          continue;\n\t        }\n\n\t        break;\n\n\t      case RELATIVE_SLASH:\n\t        if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n\t          state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n\t        } else if (char == '/') {\n\t          state = AUTHORITY;\n\t        } else {\n\t          url.username = base.username;\n\t          url.password = base.password;\n\t          url.host = base.host;\n\t          url.port = base.port;\n\t          state = PATH;\n\t          continue;\n\t        }\n\n\t        break;\n\n\t      case SPECIAL_AUTHORITY_SLASHES:\n\t        state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n\t        if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n\t        pointer++;\n\t        break;\n\n\t      case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n\t        if (char != '/' && char != '\\\\') {\n\t          state = AUTHORITY;\n\t          continue;\n\t        }\n\n\t        break;\n\n\t      case AUTHORITY:\n\t        if (char == '@') {\n\t          if (seenAt) buffer = '%40' + buffer;\n\t          seenAt = true;\n\t          bufferCodePoints = arrayFrom(buffer);\n\n\t          for (var i = 0; i < bufferCodePoints.length; i++) {\n\t            var codePoint = bufferCodePoints[i];\n\n\t            if (codePoint == ':' && !seenPasswordToken) {\n\t              seenPasswordToken = true;\n\t              continue;\n\t            }\n\n\t            var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n\t            if (seenPasswordToken) url.password += encodedCodePoints;else url.username += encodedCodePoints;\n\t          }\n\n\t          buffer = '';\n\t        } else if (char == EOF || char == '/' || char == '?' || char == '#' || char == '\\\\' && isSpecial(url)) {\n\t          if (seenAt && buffer == '') return INVALID_AUTHORITY;\n\t          pointer -= arrayFrom(buffer).length + 1;\n\t          buffer = '';\n\t          state = HOST;\n\t        } else buffer += char;\n\n\t        break;\n\n\t      case HOST:\n\t      case HOSTNAME:\n\t        if (stateOverride && url.scheme == 'file') {\n\t          state = FILE_HOST;\n\t          continue;\n\t        } else if (char == ':' && !seenBracket) {\n\t          if (buffer == '') return INVALID_HOST;\n\t          failure = parseHost(url, buffer);\n\t          if (failure) return failure;\n\t          buffer = '';\n\t          state = PORT;\n\t          if (stateOverride == HOSTNAME) return;\n\t        } else if (char == EOF || char == '/' || char == '?' || char == '#' || char == '\\\\' && isSpecial(url)) {\n\t          if (isSpecial(url) && buffer == '') return INVALID_HOST;\n\t          if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n\t          failure = parseHost(url, buffer);\n\t          if (failure) return failure;\n\t          buffer = '';\n\t          state = PATH_START;\n\t          if (stateOverride) return;\n\t          continue;\n\t        } else {\n\t          if (char == '[') seenBracket = true;else if (char == ']') seenBracket = false;\n\t          buffer += char;\n\t        }\n\n\t        break;\n\n\t      case PORT:\n\t        if (DIGIT.test(char)) {\n\t          buffer += char;\n\t        } else if (char == EOF || char == '/' || char == '?' || char == '#' || char == '\\\\' && isSpecial(url) || stateOverride) {\n\t          if (buffer != '') {\n\t            var port = parseInt(buffer, 10);\n\t            if (port > 0xFFFF) return INVALID_PORT;\n\t            url.port = isSpecial(url) && port === specialSchemes[url.scheme] ? null : port;\n\t            buffer = '';\n\t          }\n\n\t          if (stateOverride) return;\n\t          state = PATH_START;\n\t          continue;\n\t        } else return INVALID_PORT;\n\n\t        break;\n\n\t      case FILE:\n\t        url.scheme = 'file';\n\t        if (char == '/' || char == '\\\\') state = FILE_SLASH;else if (base && base.scheme == 'file') {\n\t          if (char == EOF) {\n\t            url.host = base.host;\n\t            url.path = base.path.slice();\n\t            url.query = base.query;\n\t          } else if (char == '?') {\n\t            url.host = base.host;\n\t            url.path = base.path.slice();\n\t            url.query = '';\n\t            state = QUERY;\n\t          } else if (char == '#') {\n\t            url.host = base.host;\n\t            url.path = base.path.slice();\n\t            url.query = base.query;\n\t            url.fragment = '';\n\t            state = FRAGMENT;\n\t          } else {\n\t            if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n\t              url.host = base.host;\n\t              url.path = base.path.slice();\n\t              shortenURLsPath(url);\n\t            }\n\n\t            state = PATH;\n\t            continue;\n\t          }\n\t        } else {\n\t          state = PATH;\n\t          continue;\n\t        }\n\t        break;\n\n\t      case FILE_SLASH:\n\t        if (char == '/' || char == '\\\\') {\n\t          state = FILE_HOST;\n\t          break;\n\t        }\n\n\t        if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n\t          if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);else url.host = base.host;\n\t        }\n\n\t        state = PATH;\n\t        continue;\n\n\t      case FILE_HOST:\n\t        if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n\t          if (!stateOverride && isWindowsDriveLetter(buffer)) {\n\t            state = PATH;\n\t          } else if (buffer == '') {\n\t            url.host = '';\n\t            if (stateOverride) return;\n\t            state = PATH_START;\n\t          } else {\n\t            failure = parseHost(url, buffer);\n\t            if (failure) return failure;\n\t            if (url.host == 'localhost') url.host = '';\n\t            if (stateOverride) return;\n\t            buffer = '';\n\t            state = PATH_START;\n\t          }\n\n\t          continue;\n\t        } else buffer += char;\n\n\t        break;\n\n\t      case PATH_START:\n\t        if (isSpecial(url)) {\n\t          state = PATH;\n\t          if (char != '/' && char != '\\\\') continue;\n\t        } else if (!stateOverride && char == '?') {\n\t          url.query = '';\n\t          state = QUERY;\n\t        } else if (!stateOverride && char == '#') {\n\t          url.fragment = '';\n\t          state = FRAGMENT;\n\t        } else if (char != EOF) {\n\t          state = PATH;\n\t          if (char != '/') continue;\n\t        }\n\n\t        break;\n\n\t      case PATH:\n\t        if (char == EOF || char == '/' || char == '\\\\' && isSpecial(url) || !stateOverride && (char == '?' || char == '#')) {\n\t          if (isDoubleDot(buffer)) {\n\t            shortenURLsPath(url);\n\n\t            if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n\t              url.path.push('');\n\t            }\n\t          } else if (isSingleDot(buffer)) {\n\t            if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n\t              url.path.push('');\n\t            }\n\t          } else {\n\t            if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n\t              if (url.host) url.host = '';\n\t              buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n\t            }\n\n\t            url.path.push(buffer);\n\t          }\n\n\t          buffer = '';\n\n\t          if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n\t            while (url.path.length > 1 && url.path[0] === '') {\n\t              url.path.shift();\n\t            }\n\t          }\n\n\t          if (char == '?') {\n\t            url.query = '';\n\t            state = QUERY;\n\t          } else if (char == '#') {\n\t            url.fragment = '';\n\t            state = FRAGMENT;\n\t          }\n\t        } else {\n\t          buffer += percentEncode(char, pathPercentEncodeSet);\n\t        }\n\n\t        break;\n\n\t      case CANNOT_BE_A_BASE_URL_PATH:\n\t        if (char == '?') {\n\t          url.query = '';\n\t          state = QUERY;\n\t        } else if (char == '#') {\n\t          url.fragment = '';\n\t          state = FRAGMENT;\n\t        } else if (char != EOF) {\n\t          url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n\t        }\n\n\t        break;\n\n\t      case QUERY:\n\t        if (!stateOverride && char == '#') {\n\t          url.fragment = '';\n\t          state = FRAGMENT;\n\t        } else if (char != EOF) {\n\t          if (char == \"'\" && isSpecial(url)) url.query += '%27';else if (char == '#') url.query += '%23';else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n\t        }\n\n\t        break;\n\n\t      case FRAGMENT:\n\t        if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n\t        break;\n\t    }\n\n\t    pointer++;\n\t  }\n\t}; // `URL` constructor\n\t// https://url.spec.whatwg.org/#url-class\n\n\n\tvar URLConstructor = function URL(url\n\t/* , base */\n\t) {\n\t  var that = anInstance(this, URLConstructor, 'URL');\n\t  var base = arguments.length > 1 ? arguments[1] : undefined;\n\t  var urlString = String(url);\n\t  var state = setInternalState$a(that, {\n\t    type: 'URL'\n\t  });\n\t  var baseState, failure;\n\n\t  if (base !== undefined) {\n\t    if (base instanceof URLConstructor) baseState = getInternalURLState(base);else {\n\t      failure = parseURL(baseState = {}, String(base));\n\t      if (failure) throw TypeError(failure);\n\t    }\n\t  }\n\n\t  failure = parseURL(state, urlString, null, baseState);\n\t  if (failure) throw TypeError(failure);\n\t  var searchParams = state.searchParams = new URLSearchParams$1();\n\t  var searchParamsState = getInternalSearchParamsState(searchParams);\n\t  searchParamsState.updateSearchParams(state.query);\n\n\t  searchParamsState.updateURL = function () {\n\t    state.query = String(searchParams) || null;\n\t  };\n\n\t  if (!descriptors) {\n\t    that.href = serializeURL.call(that);\n\t    that.origin = getOrigin.call(that);\n\t    that.protocol = getProtocol.call(that);\n\t    that.username = getUsername.call(that);\n\t    that.password = getPassword.call(that);\n\t    that.host = getHost.call(that);\n\t    that.hostname = getHostname.call(that);\n\t    that.port = getPort.call(that);\n\t    that.pathname = getPathname.call(that);\n\t    that.search = getSearch.call(that);\n\t    that.searchParams = getSearchParams.call(that);\n\t    that.hash = getHash.call(that);\n\t  }\n\t};\n\n\tvar URLPrototype = URLConstructor.prototype;\n\n\tvar serializeURL = function serializeURL() {\n\t  var url = getInternalURLState(this);\n\t  var scheme = url.scheme;\n\t  var username = url.username;\n\t  var password = url.password;\n\t  var host = url.host;\n\t  var port = url.port;\n\t  var path = url.path;\n\t  var query = url.query;\n\t  var fragment = url.fragment;\n\t  var output = scheme + ':';\n\n\t  if (host !== null) {\n\t    output += '//';\n\n\t    if (includesCredentials(url)) {\n\t      output += username + (password ? ':' + password : '') + '@';\n\t    }\n\n\t    output += serializeHost(host);\n\t    if (port !== null) output += ':' + port;\n\t  } else if (scheme == 'file') output += '//';\n\n\t  output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n\t  if (query !== null) output += '?' + query;\n\t  if (fragment !== null) output += '#' + fragment;\n\t  return output;\n\t};\n\n\tvar getOrigin = function getOrigin() {\n\t  var url = getInternalURLState(this);\n\t  var scheme = url.scheme;\n\t  var port = url.port;\n\t  if (scheme == 'blob') try {\n\t    return new URL(scheme.path[0]).origin;\n\t  } catch (error) {\n\t    return 'null';\n\t  }\n\t  if (scheme == 'file' || !isSpecial(url)) return 'null';\n\t  return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n\t};\n\n\tvar getProtocol = function getProtocol() {\n\t  return getInternalURLState(this).scheme + ':';\n\t};\n\n\tvar getUsername = function getUsername() {\n\t  return getInternalURLState(this).username;\n\t};\n\n\tvar getPassword = function getPassword() {\n\t  return getInternalURLState(this).password;\n\t};\n\n\tvar getHost = function getHost() {\n\t  var url = getInternalURLState(this);\n\t  var host = url.host;\n\t  var port = url.port;\n\t  return host === null ? '' : port === null ? serializeHost(host) : serializeHost(host) + ':' + port;\n\t};\n\n\tvar getHostname = function getHostname() {\n\t  var host = getInternalURLState(this).host;\n\t  return host === null ? '' : serializeHost(host);\n\t};\n\n\tvar getPort = function getPort() {\n\t  var port = getInternalURLState(this).port;\n\t  return port === null ? '' : String(port);\n\t};\n\n\tvar getPathname = function getPathname() {\n\t  var url = getInternalURLState(this);\n\t  var path = url.path;\n\t  return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n\t};\n\n\tvar getSearch = function getSearch() {\n\t  var query = getInternalURLState(this).query;\n\t  return query ? '?' + query : '';\n\t};\n\n\tvar getSearchParams = function getSearchParams() {\n\t  return getInternalURLState(this).searchParams;\n\t};\n\n\tvar getHash = function getHash() {\n\t  var fragment = getInternalURLState(this).fragment;\n\t  return fragment ? '#' + fragment : '';\n\t};\n\n\tvar accessorDescriptor = function accessorDescriptor(getter, setter) {\n\t  return {\n\t    get: getter,\n\t    set: setter,\n\t    configurable: true,\n\t    enumerable: true\n\t  };\n\t};\n\n\tif (descriptors) {\n\t  objectDefineProperties(URLPrototype, {\n\t    // `URL.prototype.href` accessors pair\n\t    // https://url.spec.whatwg.org/#dom-url-href\n\t    href: accessorDescriptor(serializeURL, function (href) {\n\t      var url = getInternalURLState(this);\n\t      var urlString = String(href);\n\t      var failure = parseURL(url, urlString);\n\t      if (failure) throw TypeError(failure);\n\t      getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n\t    }),\n\t    // `URL.prototype.origin` getter\n\t    // https://url.spec.whatwg.org/#dom-url-origin\n\t    origin: accessorDescriptor(getOrigin),\n\t    // `URL.prototype.protocol` accessors pair\n\t    // https://url.spec.whatwg.org/#dom-url-protocol\n\t    protocol: accessorDescriptor(getProtocol, function (protocol) {\n\t      var url = getInternalURLState(this);\n\t      parseURL(url, String(protocol) + ':', SCHEME_START);\n\t    }),\n\t    // `URL.prototype.username` accessors pair\n\t    // https://url.spec.whatwg.org/#dom-url-username\n\t    username: accessorDescriptor(getUsername, function (username) {\n\t      var url = getInternalURLState(this);\n\t      var codePoints = arrayFrom(String(username));\n\t      if (cannotHaveUsernamePasswordPort(url)) return;\n\t      url.username = '';\n\n\t      for (var i = 0; i < codePoints.length; i++) {\n\t        url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n\t      }\n\t    }),\n\t    // `URL.prototype.password` accessors pair\n\t    // https://url.spec.whatwg.org/#dom-url-password\n\t    password: accessorDescriptor(getPassword, function (password) {\n\t      var url = getInternalURLState(this);\n\t      var codePoints = arrayFrom(String(password));\n\t      if (cannotHaveUsernamePasswordPort(url)) return;\n\t      url.password = '';\n\n\t      for (var i = 0; i < codePoints.length; i++) {\n\t        url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n\t      }\n\t    }),\n\t    // `URL.prototype.host` accessors pair\n\t    // https://url.spec.whatwg.org/#dom-url-host\n\t    host: accessorDescriptor(getHost, function (host) {\n\t      var url = getInternalURLState(this);\n\t      if (url.cannotBeABaseURL) return;\n\t      parseURL(url, String(host), HOST);\n\t    }),\n\t    // `URL.prototype.hostname` accessors pair\n\t    // https://url.spec.whatwg.org/#dom-url-hostname\n\t    hostname: accessorDescriptor(getHostname, function (hostname) {\n\t      var url = getInternalURLState(this);\n\t      if (url.cannotBeABaseURL) return;\n\t      parseURL(url, String(hostname), HOSTNAME);\n\t    }),\n\t    // `URL.prototype.port` accessors pair\n\t    // https://url.spec.whatwg.org/#dom-url-port\n\t    port: accessorDescriptor(getPort, function (port) {\n\t      var url = getInternalURLState(this);\n\t      if (cannotHaveUsernamePasswordPort(url)) return;\n\t      port = String(port);\n\t      if (port == '') url.port = null;else parseURL(url, port, PORT);\n\t    }),\n\t    // `URL.prototype.pathname` accessors pair\n\t    // https://url.spec.whatwg.org/#dom-url-pathname\n\t    pathname: accessorDescriptor(getPathname, function (pathname) {\n\t      var url = getInternalURLState(this);\n\t      if (url.cannotBeABaseURL) return;\n\t      url.path = [];\n\t      parseURL(url, pathname + '', PATH_START);\n\t    }),\n\t    // `URL.prototype.search` accessors pair\n\t    // https://url.spec.whatwg.org/#dom-url-search\n\t    search: accessorDescriptor(getSearch, function (search) {\n\t      var url = getInternalURLState(this);\n\t      search = String(search);\n\n\t      if (search == '') {\n\t        url.query = null;\n\t      } else {\n\t        if ('?' == search.charAt(0)) search = search.slice(1);\n\t        url.query = '';\n\t        parseURL(url, search, QUERY);\n\t      }\n\n\t      getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n\t    }),\n\t    // `URL.prototype.searchParams` getter\n\t    // https://url.spec.whatwg.org/#dom-url-searchparams\n\t    searchParams: accessorDescriptor(getSearchParams),\n\t    // `URL.prototype.hash` accessors pair\n\t    // https://url.spec.whatwg.org/#dom-url-hash\n\t    hash: accessorDescriptor(getHash, function (hash) {\n\t      var url = getInternalURLState(this);\n\t      hash = String(hash);\n\n\t      if (hash == '') {\n\t        url.fragment = null;\n\t        return;\n\t      }\n\n\t      if ('#' == hash.charAt(0)) hash = hash.slice(1);\n\t      url.fragment = '';\n\t      parseURL(url, hash, FRAGMENT);\n\t    })\n\t  });\n\t} // `URL.prototype.toJSON` method\n\t// https://url.spec.whatwg.org/#dom-url-tojson\n\n\n\tredefine(URLPrototype, 'toJSON', function toJSON() {\n\t  return serializeURL.call(this);\n\t}, {\n\t  enumerable: true\n\t}); // `URL.prototype.toString` method\n\t// https://url.spec.whatwg.org/#URL-stringification-behavior\n\n\tredefine(URLPrototype, 'toString', function toString() {\n\t  return serializeURL.call(this);\n\t}, {\n\t  enumerable: true\n\t});\n\n\tif (NativeURL) {\n\t  var nativeCreateObjectURL = NativeURL.createObjectURL;\n\t  var nativeRevokeObjectURL = NativeURL.revokeObjectURL; // `URL.createObjectURL` method\n\t  // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n\t  // eslint-disable-next-line no-unused-vars\n\n\t  if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n\t    return nativeCreateObjectURL.apply(NativeURL, arguments);\n\t  }); // `URL.revokeObjectURL` method\n\t  // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n\t  // eslint-disable-next-line no-unused-vars\n\n\t  if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n\t    return nativeRevokeObjectURL.apply(NativeURL, arguments);\n\t  });\n\t}\n\n\tsetToStringTag(URLConstructor, 'URL');\n\t_export({\n\t  global: true,\n\t  forced: !nativeUrl,\n\t  sham: !descriptors\n\t}, {\n\t  URL: URLConstructor\n\t});\n\tvar web_url = {};\n\n\t'use strict'; // `URL.prototype.toJSON` method\n\t// https://url.spec.whatwg.org/#dom-url-tojson\n\n\n\t_export({\n\t  target: 'URL',\n\t  proto: true,\n\t  enumerable: true\n\t}, {\n\t  toJSON: function toJSON() {\n\t    return URL.prototype.toString.call(this);\n\t  }\n\t});\n\tvar web_url_toJson = {};\n\n\tvar web = path;\n\n\tvar stable = path;\n\n\tvar runtime_1 = createCommonjsModule(function (module) {\n\t  /**\n\t   * Copyright (c) 2014-present, Facebook, Inc.\n\t   *\n\t   * This source code is licensed under the MIT license found in the\n\t   * LICENSE file in the root directory of this source tree.\n\t   */\n\t  var runtime = function (exports) {\n\t    \"use strict\";\n\n\t    var Op = Object.prototype;\n\t    var hasOwn = Op.hasOwnProperty;\n\t    var undefined$1; // More compressible than void 0.\n\n\t    var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n\t    var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n\t    var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n\t    var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n\t    function wrap(innerFn, outerFn, self, tryLocsList) {\n\t      // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n\t      var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n\t      var generator = Object.create(protoGenerator.prototype);\n\t      var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next,\n\t      // .throw, and .return methods.\n\n\t      generator._invoke = makeInvokeMethod(innerFn, self, context);\n\t      return generator;\n\t    }\n\n\t    exports.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion\n\t    // record like context.tryEntries[i].completion. This interface could\n\t    // have been (and was previously) designed to take a closure to be\n\t    // invoked without arguments, but in all the cases we care about we\n\t    // already have an existing method we want to call, so there's no need\n\t    // to create a new function object. We can even get away with assuming\n\t    // the method takes exactly one argument, since that happens to be true\n\t    // in every case, so we don't have to touch the arguments object. The\n\t    // only additional allocation required is the completion record, which\n\t    // has a stable shape and so hopefully should be cheap to allocate.\n\n\t    function tryCatch(fn, obj, arg) {\n\t      try {\n\t        return {\n\t          type: \"normal\",\n\t          arg: fn.call(obj, arg)\n\t        };\n\t      } catch (err) {\n\t        return {\n\t          type: \"throw\",\n\t          arg: err\n\t        };\n\t      }\n\t    }\n\n\t    var GenStateSuspendedStart = \"suspendedStart\";\n\t    var GenStateSuspendedYield = \"suspendedYield\";\n\t    var GenStateExecuting = \"executing\";\n\t    var GenStateCompleted = \"completed\"; // Returning this object from the innerFn has the same effect as\n\t    // breaking out of the dispatch switch statement.\n\n\t    var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and\n\t    // .constructor.prototype properties for functions that return Generator\n\t    // objects. For full spec compliance, you may wish to configure your\n\t    // minifier not to mangle the names of these two functions.\n\n\t    function Generator() {}\n\n\t    function GeneratorFunction() {}\n\n\t    function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that\n\t    // don't natively support it.\n\n\n\t    var IteratorPrototype = {};\n\n\t    IteratorPrototype[iteratorSymbol] = function () {\n\t      return this;\n\t    };\n\n\t    var getProto = Object.getPrototypeOf;\n\t    var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n\n\t    if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n\t      // This environment has a native %IteratorPrototype%; use it instead\n\t      // of the polyfill.\n\t      IteratorPrototype = NativeIteratorPrototype;\n\t    }\n\n\t    var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);\n\t    GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n\t    GeneratorFunctionPrototype.constructor = GeneratorFunction;\n\t    GeneratorFunctionPrototype[toStringTagSymbol] = GeneratorFunction.displayName = \"GeneratorFunction\"; // Helper for defining the .next, .throw, and .return methods of the\n\t    // Iterator interface in terms of a single ._invoke method.\n\n\t    function defineIteratorMethods(prototype) {\n\t      [\"next\", \"throw\", \"return\"].forEach(function (method) {\n\t        prototype[method] = function (arg) {\n\t          return this._invoke(method, arg);\n\t        };\n\t      });\n\t    }\n\n\t    exports.isGeneratorFunction = function (genFun) {\n\t      var ctor = typeof genFun === \"function\" && genFun.constructor;\n\t      return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can\n\t      // do is to check its .name property.\n\t      (ctor.displayName || ctor.name) === \"GeneratorFunction\" : false;\n\t    };\n\n\t    exports.mark = function (genFun) {\n\t      if (Object.setPrototypeOf) {\n\t        Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n\t      } else {\n\t        genFun.__proto__ = GeneratorFunctionPrototype;\n\n\t        if (!(toStringTagSymbol in genFun)) {\n\t          genFun[toStringTagSymbol] = \"GeneratorFunction\";\n\t        }\n\t      }\n\n\t      genFun.prototype = Object.create(Gp);\n\t      return genFun;\n\t    }; // Within the body of any async function, `await x` is transformed to\n\t    // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n\t    // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n\t    // meant to be awaited.\n\n\n\t    exports.awrap = function (arg) {\n\t      return {\n\t        __await: arg\n\t      };\n\t    };\n\n\t    function AsyncIterator(generator, PromiseImpl) {\n\t      function invoke(method, arg, resolve, reject) {\n\t        var record = tryCatch(generator[method], generator, arg);\n\n\t        if (record.type === \"throw\") {\n\t          reject(record.arg);\n\t        } else {\n\t          var result = record.arg;\n\t          var value = result.value;\n\n\t          if (value && typeof value === \"object\" && hasOwn.call(value, \"__await\")) {\n\t            return PromiseImpl.resolve(value.__await).then(function (value) {\n\t              invoke(\"next\", value, resolve, reject);\n\t            }, function (err) {\n\t              invoke(\"throw\", err, resolve, reject);\n\t            });\n\t          }\n\n\t          return PromiseImpl.resolve(value).then(function (unwrapped) {\n\t            // When a yielded Promise is resolved, its final value becomes\n\t            // the .value of the Promise<{value,done}> result for the\n\t            // current iteration.\n\t            result.value = unwrapped;\n\t            resolve(result);\n\t          }, function (error) {\n\t            // If a rejected Promise was yielded, throw the rejection back\n\t            // into the async generator function so it can be handled there.\n\t            return invoke(\"throw\", error, resolve, reject);\n\t          });\n\t        }\n\t      }\n\n\t      var previousPromise;\n\n\t      function enqueue(method, arg) {\n\t        function callInvokeWithMethodAndArg() {\n\t          return new PromiseImpl(function (resolve, reject) {\n\t            invoke(method, arg, resolve, reject);\n\t          });\n\t        }\n\n\t        return previousPromise = // If enqueue has been called before, then we want to wait until\n\t        // all previous Promises have been resolved before calling invoke,\n\t        // so that results are always delivered in the correct order. If\n\t        // enqueue has not been called before, then it is important to\n\t        // call invoke immediately, without waiting on a callback to fire,\n\t        // so that the async generator function has the opportunity to do\n\t        // any necessary setup in a predictable way. This predictability\n\t        // is why the Promise constructor synchronously invokes its\n\t        // executor callback, and why async functions synchronously\n\t        // execute code before the first await. Since we implement simple\n\t        // async functions in terms of async generators, it is especially\n\t        // important to get this right, even though it requires care.\n\t        previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later\n\t        // invocations of the iterator.\n\t        callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n\t      } // Define the unified helper method that is used to implement .next,\n\t      // .throw, and .return (see defineIteratorMethods).\n\n\n\t      this._invoke = enqueue;\n\t    }\n\n\t    defineIteratorMethods(AsyncIterator.prototype);\n\n\t    AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n\t      return this;\n\t    };\n\n\t    exports.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of\n\t    // AsyncIterator objects; they just return a Promise for the value of\n\t    // the final result produced by the iterator.\n\n\t    exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n\t      if (PromiseImpl === void 0) PromiseImpl = Promise;\n\t      var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);\n\t      return exports.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator.\n\t      : iter.next().then(function (result) {\n\t        return result.done ? result.value : iter.next();\n\t      });\n\t    };\n\n\t    function makeInvokeMethod(innerFn, self, context) {\n\t      var state = GenStateSuspendedStart;\n\t      return function invoke(method, arg) {\n\t        if (state === GenStateExecuting) {\n\t          throw new Error(\"Generator is already running\");\n\t        }\n\n\t        if (state === GenStateCompleted) {\n\t          if (method === \"throw\") {\n\t            throw arg;\n\t          } // Be forgiving, per 25.3.3.3.3 of the spec:\n\t          // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n\n\n\t          return doneResult();\n\t        }\n\n\t        context.method = method;\n\t        context.arg = arg;\n\n\t        while (true) {\n\t          var delegate = context.delegate;\n\n\t          if (delegate) {\n\t            var delegateResult = maybeInvokeDelegate(delegate, context);\n\n\t            if (delegateResult) {\n\t              if (delegateResult === ContinueSentinel) continue;\n\t              return delegateResult;\n\t            }\n\t          }\n\n\t          if (context.method === \"next\") {\n\t            // Setting context._sent for legacy support of Babel's\n\t            // function.sent implementation.\n\t            context.sent = context._sent = context.arg;\n\t          } else if (context.method === \"throw\") {\n\t            if (state === GenStateSuspendedStart) {\n\t              state = GenStateCompleted;\n\t              throw context.arg;\n\t            }\n\n\t            context.dispatchException(context.arg);\n\t          } else if (context.method === \"return\") {\n\t            context.abrupt(\"return\", context.arg);\n\t          }\n\n\t          state = GenStateExecuting;\n\t          var record = tryCatch(innerFn, self, context);\n\n\t          if (record.type === \"normal\") {\n\t            // If an exception is thrown from innerFn, we leave state ===\n\t            // GenStateExecuting and loop back for another invocation.\n\t            state = context.done ? GenStateCompleted : GenStateSuspendedYield;\n\n\t            if (record.arg === ContinueSentinel) {\n\t              continue;\n\t            }\n\n\t            return {\n\t              value: record.arg,\n\t              done: context.done\n\t            };\n\t          } else if (record.type === \"throw\") {\n\t            state = GenStateCompleted; // Dispatch the exception by looping back around to the\n\t            // context.dispatchException(context.arg) call above.\n\n\t            context.method = \"throw\";\n\t            context.arg = record.arg;\n\t          }\n\t        }\n\t      };\n\t    } // Call delegate.iterator[context.method](context.arg) and handle the\n\t    // result, either by returning a { value, done } result from the\n\t    // delegate iterator, or by modifying context.method and context.arg,\n\t    // setting context.delegate to null, and returning the ContinueSentinel.\n\n\n\t    function maybeInvokeDelegate(delegate, context) {\n\t      var method = delegate.iterator[context.method];\n\n\t      if (method === undefined$1) {\n\t        // A .throw or .return when the delegate iterator has no .throw\n\t        // method always terminates the yield* loop.\n\t        context.delegate = null;\n\n\t        if (context.method === \"throw\") {\n\t          // Note: [\"return\"] must be used for ES3 parsing compatibility.\n\t          if (delegate.iterator[\"return\"]) {\n\t            // If the delegate iterator has a return method, give it a\n\t            // chance to clean up.\n\t            context.method = \"return\";\n\t            context.arg = undefined$1;\n\t            maybeInvokeDelegate(delegate, context);\n\n\t            if (context.method === \"throw\") {\n\t              // If maybeInvokeDelegate(context) changed context.method from\n\t              // \"return\" to \"throw\", let that override the TypeError below.\n\t              return ContinueSentinel;\n\t            }\n\t          }\n\n\t          context.method = \"throw\";\n\t          context.arg = new TypeError(\"The iterator does not provide a 'throw' method\");\n\t        }\n\n\t        return ContinueSentinel;\n\t      }\n\n\t      var record = tryCatch(method, delegate.iterator, context.arg);\n\n\t      if (record.type === \"throw\") {\n\t        context.method = \"throw\";\n\t        context.arg = record.arg;\n\t        context.delegate = null;\n\t        return ContinueSentinel;\n\t      }\n\n\t      var info = record.arg;\n\n\t      if (!info) {\n\t        context.method = \"throw\";\n\t        context.arg = new TypeError(\"iterator result is not an object\");\n\t        context.delegate = null;\n\t        return ContinueSentinel;\n\t      }\n\n\t      if (info.done) {\n\t        // Assign the result of the finished delegate to the temporary\n\t        // variable specified by delegate.resultName (see delegateYield).\n\t        context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield).\n\n\t        context.next = delegate.nextLoc; // If context.method was \"throw\" but the delegate handled the\n\t        // exception, let the outer generator proceed normally. If\n\t        // context.method was \"next\", forget context.arg since it has been\n\t        // \"consumed\" by the delegate iterator. If context.method was\n\t        // \"return\", allow the original .return call to continue in the\n\t        // outer generator.\n\n\t        if (context.method !== \"return\") {\n\t          context.method = \"next\";\n\t          context.arg = undefined$1;\n\t        }\n\t      } else {\n\t        // Re-yield the result returned by the delegate method.\n\t        return info;\n\t      } // The delegate iterator is finished, so forget it and continue with\n\t      // the outer generator.\n\n\n\t      context.delegate = null;\n\t      return ContinueSentinel;\n\t    } // Define Generator.prototype.{next,throw,return} in terms of the\n\t    // unified ._invoke helper method.\n\n\n\t    defineIteratorMethods(Gp);\n\t    Gp[toStringTagSymbol] = \"Generator\"; // A Generator should always return itself as the iterator object when the\n\t    // @@iterator function is called on it. Some browsers' implementations of the\n\t    // iterator prototype chain incorrectly implement this, causing the Generator\n\t    // object to not be returned from this call. This ensures that doesn't happen.\n\t    // See https://github.com/facebook/regenerator/issues/274 for more details.\n\n\t    Gp[iteratorSymbol] = function () {\n\t      return this;\n\t    };\n\n\t    Gp.toString = function () {\n\t      return \"[object Generator]\";\n\t    };\n\n\t    function pushTryEntry(locs) {\n\t      var entry = {\n\t        tryLoc: locs[0]\n\t      };\n\n\t      if (1 in locs) {\n\t        entry.catchLoc = locs[1];\n\t      }\n\n\t      if (2 in locs) {\n\t        entry.finallyLoc = locs[2];\n\t        entry.afterLoc = locs[3];\n\t      }\n\n\t      this.tryEntries.push(entry);\n\t    }\n\n\t    function resetTryEntry(entry) {\n\t      var record = entry.completion || {};\n\t      record.type = \"normal\";\n\t      delete record.arg;\n\t      entry.completion = record;\n\t    }\n\n\t    function Context(tryLocsList) {\n\t      // The root entry object (effectively a try statement without a catch\n\t      // or a finally block) gives us a place to store values thrown from\n\t      // locations where there is no enclosing try statement.\n\t      this.tryEntries = [{\n\t        tryLoc: \"root\"\n\t      }];\n\t      tryLocsList.forEach(pushTryEntry, this);\n\t      this.reset(true);\n\t    }\n\n\t    exports.keys = function (object) {\n\t      var keys = [];\n\n\t      for (var key in object) {\n\t        keys.push(key);\n\t      }\n\n\t      keys.reverse(); // Rather than returning an object with a next method, we keep\n\t      // things simple and return the next function itself.\n\n\t      return function next() {\n\t        while (keys.length) {\n\t          var key = keys.pop();\n\n\t          if (key in object) {\n\t            next.value = key;\n\t            next.done = false;\n\t            return next;\n\t          }\n\t        } // To avoid creating an additional object, we just hang the .value\n\t        // and .done properties off the next function object itself. This\n\t        // also ensures that the minifier will not anonymize the function.\n\n\n\t        next.done = true;\n\t        return next;\n\t      };\n\t    };\n\n\t    function values(iterable) {\n\t      if (iterable) {\n\t        var iteratorMethod = iterable[iteratorSymbol];\n\n\t        if (iteratorMethod) {\n\t          return iteratorMethod.call(iterable);\n\t        }\n\n\t        if (typeof iterable.next === \"function\") {\n\t          return iterable;\n\t        }\n\n\t        if (!isNaN(iterable.length)) {\n\t          var i = -1,\n\t              next = function next() {\n\t            while (++i < iterable.length) {\n\t              if (hasOwn.call(iterable, i)) {\n\t                next.value = iterable[i];\n\t                next.done = false;\n\t                return next;\n\t              }\n\t            }\n\n\t            next.value = undefined$1;\n\t            next.done = true;\n\t            return next;\n\t          };\n\n\t          return next.next = next;\n\t        }\n\t      } // Return an iterator with no values.\n\n\n\t      return {\n\t        next: doneResult\n\t      };\n\t    }\n\n\t    exports.values = values;\n\n\t    function doneResult() {\n\t      return {\n\t        value: undefined$1,\n\t        done: true\n\t      };\n\t    }\n\n\t    Context.prototype = {\n\t      constructor: Context,\n\t      reset: function reset(skipTempReset) {\n\t        this.prev = 0;\n\t        this.next = 0; // Resetting context._sent for legacy support of Babel's\n\t        // function.sent implementation.\n\n\t        this.sent = this._sent = undefined$1;\n\t        this.done = false;\n\t        this.delegate = null;\n\t        this.method = \"next\";\n\t        this.arg = undefined$1;\n\t        this.tryEntries.forEach(resetTryEntry);\n\n\t        if (!skipTempReset) {\n\t          for (var name in this) {\n\t            // Not sure about the optimal order of these conditions:\n\t            if (name.charAt(0) === \"t\" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {\n\t              this[name] = undefined$1;\n\t            }\n\t          }\n\t        }\n\t      },\n\t      stop: function stop() {\n\t        this.done = true;\n\t        var rootEntry = this.tryEntries[0];\n\t        var rootRecord = rootEntry.completion;\n\n\t        if (rootRecord.type === \"throw\") {\n\t          throw rootRecord.arg;\n\t        }\n\n\t        return this.rval;\n\t      },\n\t      dispatchException: function dispatchException(exception) {\n\t        if (this.done) {\n\t          throw exception;\n\t        }\n\n\t        var context = this;\n\n\t        function handle(loc, caught) {\n\t          record.type = \"throw\";\n\t          record.arg = exception;\n\t          context.next = loc;\n\n\t          if (caught) {\n\t            // If the dispatched exception was caught by a catch block,\n\t            // then let that catch block handle the exception normally.\n\t            context.method = \"next\";\n\t            context.arg = undefined$1;\n\t          }\n\n\t          return !!caught;\n\t        }\n\n\t        for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n\t          var entry = this.tryEntries[i];\n\t          var record = entry.completion;\n\n\t          if (entry.tryLoc === \"root\") {\n\t            // Exception thrown outside of any try block that could handle\n\t            // it, so set the completion value of the entire function to\n\t            // throw the exception.\n\t            return handle(\"end\");\n\t          }\n\n\t          if (entry.tryLoc <= this.prev) {\n\t            var hasCatch = hasOwn.call(entry, \"catchLoc\");\n\t            var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n\t            if (hasCatch && hasFinally) {\n\t              if (this.prev < entry.catchLoc) {\n\t                return handle(entry.catchLoc, true);\n\t              } else if (this.prev < entry.finallyLoc) {\n\t                return handle(entry.finallyLoc);\n\t              }\n\t            } else if (hasCatch) {\n\t              if (this.prev < entry.catchLoc) {\n\t                return handle(entry.catchLoc, true);\n\t              }\n\t            } else if (hasFinally) {\n\t              if (this.prev < entry.finallyLoc) {\n\t                return handle(entry.finallyLoc);\n\t              }\n\t            } else {\n\t              throw new Error(\"try statement without catch or finally\");\n\t            }\n\t          }\n\t        }\n\t      },\n\t      abrupt: function abrupt(type, arg) {\n\t        for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n\t          var entry = this.tryEntries[i];\n\n\t          if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) {\n\t            var finallyEntry = entry;\n\t            break;\n\t          }\n\t        }\n\n\t        if (finallyEntry && (type === \"break\" || type === \"continue\") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {\n\t          // Ignore the finally entry if control is not jumping to a\n\t          // location outside the try/catch block.\n\t          finallyEntry = null;\n\t        }\n\n\t        var record = finallyEntry ? finallyEntry.completion : {};\n\t        record.type = type;\n\t        record.arg = arg;\n\n\t        if (finallyEntry) {\n\t          this.method = \"next\";\n\t          this.next = finallyEntry.finallyLoc;\n\t          return ContinueSentinel;\n\t        }\n\n\t        return this.complete(record);\n\t      },\n\t      complete: function complete(record, afterLoc) {\n\t        if (record.type === \"throw\") {\n\t          throw record.arg;\n\t        }\n\n\t        if (record.type === \"break\" || record.type === \"continue\") {\n\t          this.next = record.arg;\n\t        } else if (record.type === \"return\") {\n\t          this.rval = this.arg = record.arg;\n\t          this.method = \"return\";\n\t          this.next = \"end\";\n\t        } else if (record.type === \"normal\" && afterLoc) {\n\t          this.next = afterLoc;\n\t        }\n\n\t        return ContinueSentinel;\n\t      },\n\t      finish: function finish(finallyLoc) {\n\t        for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n\t          var entry = this.tryEntries[i];\n\n\t          if (entry.finallyLoc === finallyLoc) {\n\t            this.complete(entry.completion, entry.afterLoc);\n\t            resetTryEntry(entry);\n\t            return ContinueSentinel;\n\t          }\n\t        }\n\t      },\n\t      \"catch\": function _catch(tryLoc) {\n\t        for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n\t          var entry = this.tryEntries[i];\n\n\t          if (entry.tryLoc === tryLoc) {\n\t            var record = entry.completion;\n\n\t            if (record.type === \"throw\") {\n\t              var thrown = record.arg;\n\t              resetTryEntry(entry);\n\t            }\n\n\t            return thrown;\n\t          }\n\t        } // The context.catch method must only be called with a location\n\t        // argument that corresponds to a known catch block.\n\n\n\t        throw new Error(\"illegal catch attempt\");\n\t      },\n\t      delegateYield: function delegateYield(iterable, resultName, nextLoc) {\n\t        this.delegate = {\n\t          iterator: values(iterable),\n\t          resultName: resultName,\n\t          nextLoc: nextLoc\n\t        };\n\n\t        if (this.method === \"next\") {\n\t          // Deliberately forget the last sent value so that we don't\n\t          // accidentally pass it on to the delegate.\n\t          this.arg = undefined$1;\n\t        }\n\n\t        return ContinueSentinel;\n\t      }\n\t    }; // Regardless of whether this script is executing as a CommonJS module\n\t    // or not, return the runtime object so that we can declare the variable\n\t    // regeneratorRuntime in the outer scope, which allows this module to be\n\t    // injected easily by `bin/regenerator --include-runtime script.js`.\n\n\t    return exports;\n\t  }( // If this script is executing as a CommonJS module, use module.exports\n\t  // as the regeneratorRuntime namespace. Otherwise create a new empty\n\t  // object. Either way, the resulting object will be used to initialize\n\t  // the regeneratorRuntime variable at the top of this file.\n\t  'object' === \"object\" ? module.exports : {});\n\n\t  try {\n\t    regeneratorRuntime = runtime;\n\t  } catch (accidentalStrictMode) {\n\t    // This module should not be running in strict mode, so the above\n\t    // assignment should always work unless something is misconfigured. Just\n\t    // in case runtime.js accidentally runs in strict mode, we can escape\n\t    // strict mode using a global Function call. This could conceivably fail\n\t    // if a Content Security Policy forbids using Function, but in that case\n\t    // the proper solution is to fix the accidental strict mode problem. If\n\t    // you've misconfigured your bundler to force strict mode and applied a\n\t    // CSP to forbid Function, and you're not willing to fix either of those\n\t    // problems, please detail your unique predicament in a GitHub issue.\n\t    Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n\t  }\n\t});\n\n\tfunction _typeof(obj) {\n\t  \"@babel/helpers - typeof\";\n\n\t  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n\t    _typeof = function (obj) {\n\t      return typeof obj;\n\t    };\n\t  } else {\n\t    _typeof = function (obj) {\n\t      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n\t    };\n\t  }\n\n\t  return _typeof(obj);\n\t}\n\n\tvar REACT_ELEMENT_TYPE;\n\n\tfunction _jsx(type, props, key, children) {\n\t  if (!REACT_ELEMENT_TYPE) {\n\t    REACT_ELEMENT_TYPE = typeof Symbol === \"function\" && Symbol[\"for\"] && Symbol[\"for\"](\"react.element\") || 0xeac7;\n\t  }\n\n\t  var defaultProps = type && type.defaultProps;\n\t  var childrenLength = arguments.length - 3;\n\n\t  if (!props && childrenLength !== 0) {\n\t    props = {\n\t      children: void 0\n\t    };\n\t  }\n\n\t  if (childrenLength === 1) {\n\t    props.children = children;\n\t  } else if (childrenLength > 1) {\n\t    var childArray = new Array(childrenLength);\n\n\t    for (var i = 0; i < childrenLength; i++) {\n\t      childArray[i] = arguments[i + 3];\n\t    }\n\n\t    props.children = childArray;\n\t  }\n\n\t  if (props && defaultProps) {\n\t    for (var propName in defaultProps) {\n\t      if (props[propName] === void 0) {\n\t        props[propName] = defaultProps[propName];\n\t      }\n\t    }\n\t  } else if (!props) {\n\t    props = defaultProps || {};\n\t  }\n\n\t  return {\n\t    $$typeof: REACT_ELEMENT_TYPE,\n\t    type: type,\n\t    key: key === undefined ? null : '' + key,\n\t    ref: null,\n\t    props: props,\n\t    _owner: null\n\t  };\n\t}\n\n\tfunction _asyncIterator(iterable) {\n\t  var method;\n\n\t  if (typeof Symbol !== \"undefined\") {\n\t    if (Symbol.asyncIterator) {\n\t      method = iterable[Symbol.asyncIterator];\n\t      if (method != null) return method.call(iterable);\n\t    }\n\n\t    if (Symbol.iterator) {\n\t      method = iterable[Symbol.iterator];\n\t      if (method != null) return method.call(iterable);\n\t    }\n\t  }\n\n\t  throw new TypeError(\"Object is not async iterable\");\n\t}\n\n\tfunction _AwaitValue(value) {\n\t  this.wrapped = value;\n\t}\n\n\tfunction _AsyncGenerator(gen) {\n\t  var front, back;\n\n\t  function send(key, arg) {\n\t    return new Promise(function (resolve, reject) {\n\t      var request = {\n\t        key: key,\n\t        arg: arg,\n\t        resolve: resolve,\n\t        reject: reject,\n\t        next: null\n\t      };\n\n\t      if (back) {\n\t        back = back.next = request;\n\t      } else {\n\t        front = back = request;\n\t        resume(key, arg);\n\t      }\n\t    });\n\t  }\n\n\t  function resume(key, arg) {\n\t    try {\n\t      var result = gen[key](arg);\n\t      var value = result.value;\n\t      var wrappedAwait = value instanceof _AwaitValue;\n\t      Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {\n\t        if (wrappedAwait) {\n\t          resume(key === \"return\" ? \"return\" : \"next\", arg);\n\t          return;\n\t        }\n\n\t        settle(result.done ? \"return\" : \"normal\", arg);\n\t      }, function (err) {\n\t        resume(\"throw\", err);\n\t      });\n\t    } catch (err) {\n\t      settle(\"throw\", err);\n\t    }\n\t  }\n\n\t  function settle(type, value) {\n\t    switch (type) {\n\t      case \"return\":\n\t        front.resolve({\n\t          value: value,\n\t          done: true\n\t        });\n\t        break;\n\n\t      case \"throw\":\n\t        front.reject(value);\n\t        break;\n\n\t      default:\n\t        front.resolve({\n\t          value: value,\n\t          done: false\n\t        });\n\t        break;\n\t    }\n\n\t    front = front.next;\n\n\t    if (front) {\n\t      resume(front.key, front.arg);\n\t    } else {\n\t      back = null;\n\t    }\n\t  }\n\n\t  this._invoke = send;\n\n\t  if (typeof gen.return !== \"function\") {\n\t    this.return = undefined;\n\t  }\n\t}\n\n\tif (typeof Symbol === \"function\" && Symbol.asyncIterator) {\n\t  _AsyncGenerator.prototype[Symbol.asyncIterator] = function () {\n\t    return this;\n\t  };\n\t}\n\n\t_AsyncGenerator.prototype.next = function (arg) {\n\t  return this._invoke(\"next\", arg);\n\t};\n\n\t_AsyncGenerator.prototype.throw = function (arg) {\n\t  return this._invoke(\"throw\", arg);\n\t};\n\n\t_AsyncGenerator.prototype.return = function (arg) {\n\t  return this._invoke(\"return\", arg);\n\t};\n\n\tfunction _wrapAsyncGenerator(fn) {\n\t  return function () {\n\t    return new _AsyncGenerator(fn.apply(this, arguments));\n\t  };\n\t}\n\n\tfunction _awaitAsyncGenerator(value) {\n\t  return new _AwaitValue(value);\n\t}\n\n\tfunction _asyncGeneratorDelegate(inner, awaitWrap) {\n\t  var iter = {},\n\t      waiting = false;\n\n\t  function pump(key, value) {\n\t    waiting = true;\n\t    value = new Promise(function (resolve) {\n\t      resolve(inner[key](value));\n\t    });\n\t    return {\n\t      done: false,\n\t      value: awaitWrap(value)\n\t    };\n\t  }\n\n\t  ;\n\n\t  if (typeof Symbol === \"function\" && Symbol.iterator) {\n\t    iter[Symbol.iterator] = function () {\n\t      return this;\n\t    };\n\t  }\n\n\t  iter.next = function (value) {\n\t    if (waiting) {\n\t      waiting = false;\n\t      return value;\n\t    }\n\n\t    return pump(\"next\", value);\n\t  };\n\n\t  if (typeof inner.throw === \"function\") {\n\t    iter.throw = function (value) {\n\t      if (waiting) {\n\t        waiting = false;\n\t        throw value;\n\t      }\n\n\t      return pump(\"throw\", value);\n\t    };\n\t  }\n\n\t  if (typeof inner.return === \"function\") {\n\t    iter.return = function (value) {\n\t      if (waiting) {\n\t        waiting = false;\n\t        return value;\n\t      }\n\n\t      return pump(\"return\", value);\n\t    };\n\t  }\n\n\t  return iter;\n\t}\n\n\tfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n\t  try {\n\t    var info = gen[key](arg);\n\t    var value = info.value;\n\t  } catch (error) {\n\t    reject(error);\n\t    return;\n\t  }\n\n\t  if (info.done) {\n\t    resolve(value);\n\t  } else {\n\t    Promise.resolve(value).then(_next, _throw);\n\t  }\n\t}\n\n\tfunction _asyncToGenerator(fn) {\n\t  return function () {\n\t    var self = this,\n\t        args = arguments;\n\t    return new Promise(function (resolve, reject) {\n\t      var gen = fn.apply(self, args);\n\n\t      function _next(value) {\n\t        asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n\t      }\n\n\t      function _throw(err) {\n\t        asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n\t      }\n\n\t      _next(undefined);\n\t    });\n\t  };\n\t}\n\n\tfunction _classCallCheck(instance, Constructor) {\n\t  if (!(instance instanceof Constructor)) {\n\t    throw new TypeError(\"Cannot call a class as a function\");\n\t  }\n\t}\n\n\tfunction _defineProperties(target, props) {\n\t  for (var i = 0; i < props.length; i++) {\n\t    var descriptor = props[i];\n\t    descriptor.enumerable = descriptor.enumerable || false;\n\t    descriptor.configurable = true;\n\t    if (\"value\" in descriptor) descriptor.writable = true;\n\t    Object.defineProperty(target, descriptor.key, descriptor);\n\t  }\n\t}\n\n\tfunction _createClass(Constructor, protoProps, staticProps) {\n\t  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n\t  if (staticProps) _defineProperties(Constructor, staticProps);\n\t  return Constructor;\n\t}\n\n\tfunction _defineEnumerableProperties(obj, descs) {\n\t  for (var key in descs) {\n\t    var desc = descs[key];\n\t    desc.configurable = desc.enumerable = true;\n\t    if (\"value\" in desc) desc.writable = true;\n\t    Object.defineProperty(obj, key, desc);\n\t  }\n\n\t  if (Object.getOwnPropertySymbols) {\n\t    var objectSymbols = Object.getOwnPropertySymbols(descs);\n\n\t    for (var i = 0; i < objectSymbols.length; i++) {\n\t      var sym = objectSymbols[i];\n\t      var desc = descs[sym];\n\t      desc.configurable = desc.enumerable = true;\n\t      if (\"value\" in desc) desc.writable = true;\n\t      Object.defineProperty(obj, sym, desc);\n\t    }\n\t  }\n\n\t  return obj;\n\t}\n\n\tfunction _defaults(obj, defaults) {\n\t  var keys = Object.getOwnPropertyNames(defaults);\n\n\t  for (var i = 0; i < keys.length; i++) {\n\t    var key = keys[i];\n\t    var value = Object.getOwnPropertyDescriptor(defaults, key);\n\n\t    if (value && value.configurable && obj[key] === undefined) {\n\t      Object.defineProperty(obj, key, value);\n\t    }\n\t  }\n\n\t  return obj;\n\t}\n\n\tfunction _defineProperty(obj, key, value) {\n\t  if (key in obj) {\n\t    Object.defineProperty(obj, key, {\n\t      value: value,\n\t      enumerable: true,\n\t      configurable: true,\n\t      writable: true\n\t    });\n\t  } else {\n\t    obj[key] = value;\n\t  }\n\n\t  return obj;\n\t}\n\n\tfunction _extends() {\n\t  _extends = Object.assign || function (target) {\n\t    for (var i = 1; i < arguments.length; i++) {\n\t      var source = arguments[i];\n\n\t      for (var key in source) {\n\t        if (Object.prototype.hasOwnProperty.call(source, key)) {\n\t          target[key] = source[key];\n\t        }\n\t      }\n\t    }\n\n\t    return target;\n\t  };\n\n\t  return _extends.apply(this, arguments);\n\t}\n\n\tfunction _objectSpread(target) {\n\t  for (var i = 1; i < arguments.length; i++) {\n\t    var source = arguments[i] != null ? Object(arguments[i]) : {};\n\t    var ownKeys = Object.keys(source);\n\n\t    if (typeof Object.getOwnPropertySymbols === 'function') {\n\t      ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n\t        return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n\t      }));\n\t    }\n\n\t    ownKeys.forEach(function (key) {\n\t      _defineProperty(target, key, source[key]);\n\t    });\n\t  }\n\n\t  return target;\n\t}\n\n\tfunction ownKeys$1(object, enumerableOnly) {\n\t  var keys = Object.keys(object);\n\n\t  if (Object.getOwnPropertySymbols) {\n\t    var symbols = Object.getOwnPropertySymbols(object);\n\t    if (enumerableOnly) symbols = symbols.filter(function (sym) {\n\t      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n\t    });\n\t    keys.push.apply(keys, symbols);\n\t  }\n\n\t  return keys;\n\t}\n\n\tfunction _objectSpread2(target) {\n\t  for (var i = 1; i < arguments.length; i++) {\n\t    var source = arguments[i] != null ? arguments[i] : {};\n\n\t    if (i % 2) {\n\t      ownKeys$1(Object(source), true).forEach(function (key) {\n\t        _defineProperty(target, key, source[key]);\n\t      });\n\t    } else if (Object.getOwnPropertyDescriptors) {\n\t      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n\t    } else {\n\t      ownKeys$1(Object(source)).forEach(function (key) {\n\t        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n\t      });\n\t    }\n\t  }\n\n\t  return target;\n\t}\n\n\tfunction _inherits(subClass, superClass) {\n\t  if (typeof superClass !== \"function\" && superClass !== null) {\n\t    throw new TypeError(\"Super expression must either be null or a function\");\n\t  }\n\n\t  subClass.prototype = Object.create(superClass && superClass.prototype, {\n\t    constructor: {\n\t      value: subClass,\n\t      writable: true,\n\t      configurable: true\n\t    }\n\t  });\n\t  if (superClass) _setPrototypeOf(subClass, superClass);\n\t}\n\n\tfunction _inheritsLoose(subClass, superClass) {\n\t  subClass.prototype = Object.create(superClass.prototype);\n\t  subClass.prototype.constructor = subClass;\n\t  subClass.__proto__ = superClass;\n\t}\n\n\tfunction _getPrototypeOf(o) {\n\t  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n\t    return o.__proto__ || Object.getPrototypeOf(o);\n\t  };\n\t  return _getPrototypeOf(o);\n\t}\n\n\tfunction _setPrototypeOf(o, p) {\n\t  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n\t    o.__proto__ = p;\n\t    return o;\n\t  };\n\n\t  return _setPrototypeOf(o, p);\n\t}\n\n\tfunction _isNativeReflectConstruct() {\n\t  if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n\t  if (Reflect.construct.sham) return false;\n\t  if (typeof Proxy === \"function\") return true;\n\n\t  try {\n\t    Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n\t    return true;\n\t  } catch (e) {\n\t    return false;\n\t  }\n\t}\n\n\tfunction _construct(Parent, args, Class) {\n\t  if (_isNativeReflectConstruct()) {\n\t    _construct = Reflect.construct;\n\t  } else {\n\t    _construct = function _construct(Parent, args, Class) {\n\t      var a = [null];\n\t      a.push.apply(a, args);\n\t      var Constructor = Function.bind.apply(Parent, a);\n\t      var instance = new Constructor();\n\t      if (Class) _setPrototypeOf(instance, Class.prototype);\n\t      return instance;\n\t    };\n\t  }\n\n\t  return _construct.apply(null, arguments);\n\t}\n\n\tfunction _isNativeFunction(fn) {\n\t  return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n\t}\n\n\tfunction _wrapNativeSuper(Class) {\n\t  var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n\t  _wrapNativeSuper = function _wrapNativeSuper(Class) {\n\t    if (Class === null || !_isNativeFunction(Class)) return Class;\n\n\t    if (typeof Class !== \"function\") {\n\t      throw new TypeError(\"Super expression must either be null or a function\");\n\t    }\n\n\t    if (typeof _cache !== \"undefined\") {\n\t      if (_cache.has(Class)) return _cache.get(Class);\n\n\t      _cache.set(Class, Wrapper);\n\t    }\n\n\t    function Wrapper() {\n\t      return _construct(Class, arguments, _getPrototypeOf(this).constructor);\n\t    }\n\n\t    Wrapper.prototype = Object.create(Class.prototype, {\n\t      constructor: {\n\t        value: Wrapper,\n\t        enumerable: false,\n\t        writable: true,\n\t        configurable: true\n\t      }\n\t    });\n\t    return _setPrototypeOf(Wrapper, Class);\n\t  };\n\n\t  return _wrapNativeSuper(Class);\n\t}\n\n\tfunction _instanceof(left, right) {\n\t  if (right != null && typeof Symbol !== \"undefined\" && right[Symbol.hasInstance]) {\n\t    return !!right[Symbol.hasInstance](left);\n\t  } else {\n\t    return left instanceof right;\n\t  }\n\t}\n\n\tfunction _interopRequireDefault(obj) {\n\t  return obj && obj.__esModule ? obj : {\n\t    default: obj\n\t  };\n\t}\n\n\tfunction _getRequireWildcardCache() {\n\t  if (typeof WeakMap !== \"function\") return null;\n\t  var cache = new WeakMap();\n\n\t  _getRequireWildcardCache = function () {\n\t    return cache;\n\t  };\n\n\t  return cache;\n\t}\n\n\tfunction _interopRequireWildcard(obj) {\n\t  if (obj && obj.__esModule) {\n\t    return obj;\n\t  }\n\n\t  if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") {\n\t    return {\n\t      default: obj\n\t    };\n\t  }\n\n\t  var cache = _getRequireWildcardCache();\n\n\t  if (cache && cache.has(obj)) {\n\t    return cache.get(obj);\n\t  }\n\n\t  var newObj = {};\n\t  var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n\t  for (var key in obj) {\n\t    if (Object.prototype.hasOwnProperty.call(obj, key)) {\n\t      var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;\n\n\t      if (desc && (desc.get || desc.set)) {\n\t        Object.defineProperty(newObj, key, desc);\n\t      } else {\n\t        newObj[key] = obj[key];\n\t      }\n\t    }\n\t  }\n\n\t  newObj.default = obj;\n\n\t  if (cache) {\n\t    cache.set(obj, newObj);\n\t  }\n\n\t  return newObj;\n\t}\n\n\tfunction _newArrowCheck(innerThis, boundThis) {\n\t  if (innerThis !== boundThis) {\n\t    throw new TypeError(\"Cannot instantiate an arrow function\");\n\t  }\n\t}\n\n\tfunction _objectDestructuringEmpty(obj) {\n\t  if (obj == null) throw new TypeError(\"Cannot destructure undefined\");\n\t}\n\n\tfunction _objectWithoutPropertiesLoose(source, excluded) {\n\t  if (source == null) return {};\n\t  var target = {};\n\t  var sourceKeys = Object.keys(source);\n\t  var key, i;\n\n\t  for (i = 0; i < sourceKeys.length; i++) {\n\t    key = sourceKeys[i];\n\t    if (excluded.indexOf(key) >= 0) continue;\n\t    target[key] = source[key];\n\t  }\n\n\t  return target;\n\t}\n\n\tfunction _objectWithoutProperties(source, excluded) {\n\t  if (source == null) return {};\n\n\t  var target = _objectWithoutPropertiesLoose(source, excluded);\n\n\t  var key, i;\n\n\t  if (Object.getOwnPropertySymbols) {\n\t    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n\t    for (i = 0; i < sourceSymbolKeys.length; i++) {\n\t      key = sourceSymbolKeys[i];\n\t      if (excluded.indexOf(key) >= 0) continue;\n\t      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n\t      target[key] = source[key];\n\t    }\n\t  }\n\n\t  return target;\n\t}\n\n\tfunction _assertThisInitialized(self) {\n\t  if (self === void 0) {\n\t    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n\t  }\n\n\t  return self;\n\t}\n\n\tfunction _possibleConstructorReturn(self, call) {\n\t  if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n\t    return call;\n\t  }\n\n\t  return _assertThisInitialized(self);\n\t}\n\n\tfunction _createSuper(Derived) {\n\t  return function () {\n\t    var Super = _getPrototypeOf(Derived),\n\t        result;\n\n\t    if (_isNativeReflectConstruct()) {\n\t      var NewTarget = _getPrototypeOf(this).constructor;\n\n\t      result = Reflect.construct(Super, arguments, NewTarget);\n\t    } else {\n\t      result = Super.apply(this, arguments);\n\t    }\n\n\t    return _possibleConstructorReturn(this, result);\n\t  };\n\t}\n\n\tfunction _superPropBase(object, property) {\n\t  while (!Object.prototype.hasOwnProperty.call(object, property)) {\n\t    object = _getPrototypeOf(object);\n\t    if (object === null) break;\n\t  }\n\n\t  return object;\n\t}\n\n\tfunction _get(target, property, receiver) {\n\t  if (typeof Reflect !== \"undefined\" && Reflect.get) {\n\t    _get = Reflect.get;\n\t  } else {\n\t    _get = function _get(target, property, receiver) {\n\t      var base = _superPropBase(target, property);\n\n\t      if (!base) return;\n\t      var desc = Object.getOwnPropertyDescriptor(base, property);\n\n\t      if (desc.get) {\n\t        return desc.get.call(receiver);\n\t      }\n\n\t      return desc.value;\n\t    };\n\t  }\n\n\t  return _get(target, property, receiver || target);\n\t}\n\n\tfunction set$4(target, property, value, receiver) {\n\t  if (typeof Reflect !== \"undefined\" && Reflect.set) {\n\t    set$4 = Reflect.set;\n\t  } else {\n\t    set$4 = function set(target, property, value, receiver) {\n\t      var base = _superPropBase(target, property);\n\n\t      var desc;\n\n\t      if (base) {\n\t        desc = Object.getOwnPropertyDescriptor(base, property);\n\n\t        if (desc.set) {\n\t          desc.set.call(receiver, value);\n\t          return true;\n\t        } else if (!desc.writable) {\n\t          return false;\n\t        }\n\t      }\n\n\t      desc = Object.getOwnPropertyDescriptor(receiver, property);\n\n\t      if (desc) {\n\t        if (!desc.writable) {\n\t          return false;\n\t        }\n\n\t        desc.value = value;\n\t        Object.defineProperty(receiver, property, desc);\n\t      } else {\n\t        _defineProperty(receiver, property, value);\n\t      }\n\n\t      return true;\n\t    };\n\t  }\n\n\t  return set$4(target, property, value, receiver);\n\t}\n\n\tfunction _set(target, property, value, receiver, isStrict) {\n\t  var s = set$4(target, property, value, receiver || target);\n\n\t  if (!s && isStrict) {\n\t    throw new Error('failed to set property');\n\t  }\n\n\t  return value;\n\t}\n\n\tfunction _taggedTemplateLiteral(strings, raw) {\n\t  if (!raw) {\n\t    raw = strings.slice(0);\n\t  }\n\n\t  return Object.freeze(Object.defineProperties(strings, {\n\t    raw: {\n\t      value: Object.freeze(raw)\n\t    }\n\t  }));\n\t}\n\n\tfunction _taggedTemplateLiteralLoose(strings, raw) {\n\t  if (!raw) {\n\t    raw = strings.slice(0);\n\t  }\n\n\t  strings.raw = raw;\n\t  return strings;\n\t}\n\n\tfunction _readOnlyError(name) {\n\t  throw new Error(\"\\\"\" + name + \"\\\" is read-only\");\n\t}\n\n\tfunction _classNameTDZError(name) {\n\t  throw new Error(\"Class \\\"\" + name + \"\\\" cannot be referenced in computed property keys.\");\n\t}\n\n\tfunction _temporalUndefined() {}\n\n\tfunction _tdz(name) {\n\t  throw new ReferenceError(name + \" is not defined - temporal dead zone\");\n\t}\n\n\tfunction _temporalRef(val, name) {\n\t  return val === _temporalUndefined ? _tdz(name) : val;\n\t}\n\n\tfunction _slicedToArray(arr, i) {\n\t  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n\t}\n\n\tfunction _slicedToArrayLoose(arr, i) {\n\t  return _arrayWithHoles(arr) || _iterableToArrayLimitLoose(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n\t}\n\n\tfunction _toArray(arr) {\n\t  return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest();\n\t}\n\n\tfunction _toConsumableArray(arr) {\n\t  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n\t}\n\n\tfunction _arrayWithoutHoles(arr) {\n\t  if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n\t}\n\n\tfunction _arrayWithHoles(arr) {\n\t  if (Array.isArray(arr)) return arr;\n\t}\n\n\tfunction _iterableToArray(iter) {\n\t  if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n\t}\n\n\tfunction _iterableToArrayLimit(arr, i) {\n\t  if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n\t  var _arr = [];\n\t  var _n = true;\n\t  var _d = false;\n\t  var _e = undefined;\n\n\t  try {\n\t    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n\t      _arr.push(_s.value);\n\n\t      if (i && _arr.length === i) break;\n\t    }\n\t  } catch (err) {\n\t    _d = true;\n\t    _e = err;\n\t  } finally {\n\t    try {\n\t      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n\t    } finally {\n\t      if (_d) throw _e;\n\t    }\n\t  }\n\n\t  return _arr;\n\t}\n\n\tfunction _iterableToArrayLimitLoose(arr, i) {\n\t  if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n\t  var _arr = [];\n\n\t  for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {\n\t    _arr.push(_step.value);\n\n\t    if (i && _arr.length === i) break;\n\t  }\n\n\t  return _arr;\n\t}\n\n\tfunction _unsupportedIterableToArray(o, minLen) {\n\t  if (!o) return;\n\t  if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n\t  var n = Object.prototype.toString.call(o).slice(8, -1);\n\t  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n\t  if (n === \"Map\" || n === \"Set\") return Array.from(n);\n\t  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n\t}\n\n\tfunction _arrayLikeToArray(arr, len) {\n\t  if (len == null || len > arr.length) len = arr.length;\n\n\t  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n\t  return arr2;\n\t}\n\n\tfunction _nonIterableSpread() {\n\t  throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n\t}\n\n\tfunction _nonIterableRest() {\n\t  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n\t}\n\n\tfunction _createForOfIteratorHelper(o) {\n\t  if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n\t    if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) {\n\t      var i = 0;\n\n\t      var F = function () {};\n\n\t      return {\n\t        s: F,\n\t        n: function () {\n\t          if (i >= o.length) return {\n\t            done: true\n\t          };\n\t          return {\n\t            done: false,\n\t            value: o[i++]\n\t          };\n\t        },\n\t        e: function (e) {\n\t          throw e;\n\t        },\n\t        f: F\n\t      };\n\t    }\n\n\t    throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n\t  }\n\n\t  var it,\n\t      normalCompletion = true,\n\t      didErr = false,\n\t      err;\n\t  return {\n\t    s: function () {\n\t      it = o[Symbol.iterator]();\n\t    },\n\t    n: function () {\n\t      var step = it.next();\n\t      normalCompletion = step.done;\n\t      return step;\n\t    },\n\t    e: function (e) {\n\t      didErr = true;\n\t      err = e;\n\t    },\n\t    f: function () {\n\t      try {\n\t        if (!normalCompletion && it.return != null) it.return();\n\t      } finally {\n\t        if (didErr) throw err;\n\t      }\n\t    }\n\t  };\n\t}\n\n\tfunction _createForOfIteratorHelperLoose(o) {\n\t  var i = 0;\n\n\t  if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n\t    if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () {\n\t      if (i >= o.length) return {\n\t        done: true\n\t      };\n\t      return {\n\t        done: false,\n\t        value: o[i++]\n\t      };\n\t    };\n\t    throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n\t  }\n\n\t  i = o[Symbol.iterator]();\n\t  return i.next.bind(i);\n\t}\n\n\tfunction _skipFirstGeneratorNext(fn) {\n\t  return function () {\n\t    var it = fn.apply(this, arguments);\n\t    it.next();\n\t    return it;\n\t  };\n\t}\n\n\tfunction _toPrimitive(input, hint) {\n\t  if (typeof input !== \"object\" || input === null) return input;\n\t  var prim = input[Symbol.toPrimitive];\n\n\t  if (prim !== undefined) {\n\t    var res = prim.call(input, hint || \"default\");\n\t    if (typeof res !== \"object\") return res;\n\t    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n\t  }\n\n\t  return (hint === \"string\" ? String : Number)(input);\n\t}\n\n\tfunction _toPropertyKey(arg) {\n\t  var key = _toPrimitive(arg, \"string\");\n\n\t  return typeof key === \"symbol\" ? key : String(key);\n\t}\n\n\tfunction _initializerWarningHelper(descriptor, context) {\n\t  throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n\t}\n\n\tfunction _initializerDefineProperty(target, property, descriptor, context) {\n\t  if (!descriptor) return;\n\t  Object.defineProperty(target, property, {\n\t    enumerable: descriptor.enumerable,\n\t    configurable: descriptor.configurable,\n\t    writable: descriptor.writable,\n\t    value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n\t  });\n\t}\n\n\tfunction _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n\t  var desc = {};\n\t  Object.keys(descriptor).forEach(function (key) {\n\t    desc[key] = descriptor[key];\n\t  });\n\t  desc.enumerable = !!desc.enumerable;\n\t  desc.configurable = !!desc.configurable;\n\n\t  if ('value' in desc || desc.initializer) {\n\t    desc.writable = true;\n\t  }\n\n\t  desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n\t    return decorator(target, property, desc) || desc;\n\t  }, desc);\n\n\t  if (context && desc.initializer !== void 0) {\n\t    desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n\t    desc.initializer = undefined;\n\t  }\n\n\t  if (desc.initializer === void 0) {\n\t    Object.defineProperty(target, property, desc);\n\t    desc = null;\n\t  }\n\n\t  return desc;\n\t}\n\n\tvar id$2 = 0;\n\n\tfunction _classPrivateFieldLooseKey(name) {\n\t  return \"__private_\" + id$2++ + \"_\" + name;\n\t}\n\n\tfunction _classPrivateFieldLooseBase(receiver, privateKey) {\n\t  if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {\n\t    throw new TypeError(\"attempted to use private field on non-instance\");\n\t  }\n\n\t  return receiver;\n\t}\n\n\tfunction _classPrivateFieldGet(receiver, privateMap) {\n\t  var descriptor = privateMap.get(receiver);\n\n\t  if (!descriptor) {\n\t    throw new TypeError(\"attempted to get private field on non-instance\");\n\t  }\n\n\t  if (descriptor.get) {\n\t    return descriptor.get.call(receiver);\n\t  }\n\n\t  return descriptor.value;\n\t}\n\n\tfunction _classPrivateFieldSet(receiver, privateMap, value) {\n\t  var descriptor = privateMap.get(receiver);\n\n\t  if (!descriptor) {\n\t    throw new TypeError(\"attempted to set private field on non-instance\");\n\t  }\n\n\t  if (descriptor.set) {\n\t    descriptor.set.call(receiver, value);\n\t  } else {\n\t    if (!descriptor.writable) {\n\t      throw new TypeError(\"attempted to set read only private field\");\n\t    }\n\n\t    descriptor.value = value;\n\t  }\n\n\t  return value;\n\t}\n\n\tfunction _classPrivateFieldDestructureSet(receiver, privateMap) {\n\t  if (!privateMap.has(receiver)) {\n\t    throw new TypeError(\"attempted to set private field on non-instance\");\n\t  }\n\n\t  var descriptor = privateMap.get(receiver);\n\n\t  if (descriptor.set) {\n\t    if (!(\"__destrObj\" in descriptor)) {\n\t      descriptor.__destrObj = {\n\t        set value(v) {\n\t          descriptor.set.call(receiver, v);\n\t        }\n\n\t      };\n\t    }\n\n\t    return descriptor.__destrObj;\n\t  } else {\n\t    if (!descriptor.writable) {\n\t      throw new TypeError(\"attempted to set read only private field\");\n\t    }\n\n\t    return descriptor;\n\t  }\n\t}\n\n\tfunction _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) {\n\t  if (receiver !== classConstructor) {\n\t    throw new TypeError(\"Private static access of wrong provenance\");\n\t  }\n\n\t  if (descriptor.get) {\n\t    return descriptor.get.call(receiver);\n\t  }\n\n\t  return descriptor.value;\n\t}\n\n\tfunction _classStaticPrivateFieldSpecSet(receiver, classConstructor, descriptor, value) {\n\t  if (receiver !== classConstructor) {\n\t    throw new TypeError(\"Private static access of wrong provenance\");\n\t  }\n\n\t  if (descriptor.set) {\n\t    descriptor.set.call(receiver, value);\n\t  } else {\n\t    if (!descriptor.writable) {\n\t      throw new TypeError(\"attempted to set read only private field\");\n\t    }\n\n\t    descriptor.value = value;\n\t  }\n\n\t  return value;\n\t}\n\n\tfunction _classStaticPrivateMethodGet(receiver, classConstructor, method) {\n\t  if (receiver !== classConstructor) {\n\t    throw new TypeError(\"Private static access of wrong provenance\");\n\t  }\n\n\t  return method;\n\t}\n\n\tfunction _classStaticPrivateMethodSet() {\n\t  throw new TypeError(\"attempted to set read only static private field\");\n\t}\n\n\tfunction _decorate(decorators, factory, superClass, mixins) {\n\t  var api = _getDecoratorsApi();\n\n\t  if (mixins) {\n\t    for (var i = 0; i < mixins.length; i++) {\n\t      api = mixins[i](api);\n\t    }\n\t  }\n\n\t  var r = factory(function initialize(O) {\n\t    api.initializeInstanceElements(O, decorated.elements);\n\t  }, superClass);\n\t  var decorated = api.decorateClass(_coalesceClassElements(r.d.map(_createElementDescriptor)), decorators);\n\t  api.initializeClassElements(r.F, decorated.elements);\n\t  return api.runClassFinishers(r.F, decorated.finishers);\n\t}\n\n\tfunction _getDecoratorsApi() {\n\t  _getDecoratorsApi = function () {\n\t    return api;\n\t  };\n\n\t  var api = {\n\t    elementsDefinitionOrder: [[\"method\"], [\"field\"]],\n\t    initializeInstanceElements: function (O, elements) {\n\t      [\"method\", \"field\"].forEach(function (kind) {\n\t        elements.forEach(function (element) {\n\t          if (element.kind === kind && element.placement === \"own\") {\n\t            this.defineClassElement(O, element);\n\t          }\n\t        }, this);\n\t      }, this);\n\t    },\n\t    initializeClassElements: function (F, elements) {\n\t      var proto = F.prototype;\n\t      [\"method\", \"field\"].forEach(function (kind) {\n\t        elements.forEach(function (element) {\n\t          var placement = element.placement;\n\n\t          if (element.kind === kind && (placement === \"static\" || placement === \"prototype\")) {\n\t            var receiver = placement === \"static\" ? F : proto;\n\t            this.defineClassElement(receiver, element);\n\t          }\n\t        }, this);\n\t      }, this);\n\t    },\n\t    defineClassElement: function (receiver, element) {\n\t      var descriptor = element.descriptor;\n\n\t      if (element.kind === \"field\") {\n\t        var initializer = element.initializer;\n\t        descriptor = {\n\t          enumerable: descriptor.enumerable,\n\t          writable: descriptor.writable,\n\t          configurable: descriptor.configurable,\n\t          value: initializer === void 0 ? void 0 : initializer.call(receiver)\n\t        };\n\t      }\n\n\t      Object.defineProperty(receiver, element.key, descriptor);\n\t    },\n\t    decorateClass: function (elements, decorators) {\n\t      var newElements = [];\n\t      var finishers = [];\n\t      var placements = {\n\t        static: [],\n\t        prototype: [],\n\t        own: []\n\t      };\n\t      elements.forEach(function (element) {\n\t        this.addElementPlacement(element, placements);\n\t      }, this);\n\t      elements.forEach(function (element) {\n\t        if (!_hasDecorators(element)) return newElements.push(element);\n\t        var elementFinishersExtras = this.decorateElement(element, placements);\n\t        newElements.push(elementFinishersExtras.element);\n\t        newElements.push.apply(newElements, elementFinishersExtras.extras);\n\t        finishers.push.apply(finishers, elementFinishersExtras.finishers);\n\t      }, this);\n\n\t      if (!decorators) {\n\t        return {\n\t          elements: newElements,\n\t          finishers: finishers\n\t        };\n\t      }\n\n\t      var result = this.decorateConstructor(newElements, decorators);\n\t      finishers.push.apply(finishers, result.finishers);\n\t      result.finishers = finishers;\n\t      return result;\n\t    },\n\t    addElementPlacement: function (element, placements, silent) {\n\t      var keys = placements[element.placement];\n\n\t      if (!silent && keys.indexOf(element.key) !== -1) {\n\t        throw new TypeError(\"Duplicated element (\" + element.key + \")\");\n\t      }\n\n\t      keys.push(element.key);\n\t    },\n\t    decorateElement: function (element, placements) {\n\t      var extras = [];\n\t      var finishers = [];\n\n\t      for (var decorators = element.decorators, i = decorators.length - 1; i >= 0; i--) {\n\t        var keys = placements[element.placement];\n\t        keys.splice(keys.indexOf(element.key), 1);\n\t        var elementObject = this.fromElementDescriptor(element);\n\t        var elementFinisherExtras = this.toElementFinisherExtras((0, decorators[i])(elementObject) || elementObject);\n\t        element = elementFinisherExtras.element;\n\t        this.addElementPlacement(element, placements);\n\n\t        if (elementFinisherExtras.finisher) {\n\t          finishers.push(elementFinisherExtras.finisher);\n\t        }\n\n\t        var newExtras = elementFinisherExtras.extras;\n\n\t        if (newExtras) {\n\t          for (var j = 0; j < newExtras.length; j++) {\n\t            this.addElementPlacement(newExtras[j], placements);\n\t          }\n\n\t          extras.push.apply(extras, newExtras);\n\t        }\n\t      }\n\n\t      return {\n\t        element: element,\n\t        finishers: finishers,\n\t        extras: extras\n\t      };\n\t    },\n\t    decorateConstructor: function (elements, decorators) {\n\t      var finishers = [];\n\n\t      for (var i = decorators.length - 1; i >= 0; i--) {\n\t        var obj = this.fromClassDescriptor(elements);\n\t        var elementsAndFinisher = this.toClassDescriptor((0, decorators[i])(obj) || obj);\n\n\t        if (elementsAndFinisher.finisher !== undefined) {\n\t          finishers.push(elementsAndFinisher.finisher);\n\t        }\n\n\t        if (elementsAndFinisher.elements !== undefined) {\n\t          elements = elementsAndFinisher.elements;\n\n\t          for (var j = 0; j < elements.length - 1; j++) {\n\t            for (var k = j + 1; k < elements.length; k++) {\n\t              if (elements[j].key === elements[k].key && elements[j].placement === elements[k].placement) {\n\t                throw new TypeError(\"Duplicated element (\" + elements[j].key + \")\");\n\t              }\n\t            }\n\t          }\n\t        }\n\t      }\n\n\t      return {\n\t        elements: elements,\n\t        finishers: finishers\n\t      };\n\t    },\n\t    fromElementDescriptor: function (element) {\n\t      var obj = {\n\t        kind: element.kind,\n\t        key: element.key,\n\t        placement: element.placement,\n\t        descriptor: element.descriptor\n\t      };\n\t      var desc = {\n\t        value: \"Descriptor\",\n\t        configurable: true\n\t      };\n\t      Object.defineProperty(obj, Symbol.toStringTag, desc);\n\t      if (element.kind === \"field\") obj.initializer = element.initializer;\n\t      return obj;\n\t    },\n\t    toElementDescriptors: function (elementObjects) {\n\t      if (elementObjects === undefined) return;\n\t      return _toArray(elementObjects).map(function (elementObject) {\n\t        var element = this.toElementDescriptor(elementObject);\n\t        this.disallowProperty(elementObject, \"finisher\", \"An element descriptor\");\n\t        this.disallowProperty(elementObject, \"extras\", \"An element descriptor\");\n\t        return element;\n\t      }, this);\n\t    },\n\t    toElementDescriptor: function (elementObject) {\n\t      var kind = String(elementObject.kind);\n\n\t      if (kind !== \"method\" && kind !== \"field\") {\n\t        throw new TypeError('An element descriptor\\'s .kind property must be either \"method\" or' + ' \"field\", but a decorator created an element descriptor with' + ' .kind \"' + kind + '\"');\n\t      }\n\n\t      var key = _toPropertyKey(elementObject.key);\n\n\t      var placement = String(elementObject.placement);\n\n\t      if (placement !== \"static\" && placement !== \"prototype\" && placement !== \"own\") {\n\t        throw new TypeError('An element descriptor\\'s .placement property must be one of \"static\",' + ' \"prototype\" or \"own\", but a decorator created an element descriptor' + ' with .placement \"' + placement + '\"');\n\t      }\n\n\t      var descriptor = elementObject.descriptor;\n\t      this.disallowProperty(elementObject, \"elements\", \"An element descriptor\");\n\t      var element = {\n\t        kind: kind,\n\t        key: key,\n\t        placement: placement,\n\t        descriptor: Object.assign({}, descriptor)\n\t      };\n\n\t      if (kind !== \"field\") {\n\t        this.disallowProperty(elementObject, \"initializer\", \"A method descriptor\");\n\t      } else {\n\t        this.disallowProperty(descriptor, \"get\", \"The property descriptor of a field descriptor\");\n\t        this.disallowProperty(descriptor, \"set\", \"The property descriptor of a field descriptor\");\n\t        this.disallowProperty(descriptor, \"value\", \"The property descriptor of a field descriptor\");\n\t        element.initializer = elementObject.initializer;\n\t      }\n\n\t      return element;\n\t    },\n\t    toElementFinisherExtras: function (elementObject) {\n\t      var element = this.toElementDescriptor(elementObject);\n\n\t      var finisher = _optionalCallableProperty(elementObject, \"finisher\");\n\n\t      var extras = this.toElementDescriptors(elementObject.extras);\n\t      return {\n\t        element: element,\n\t        finisher: finisher,\n\t        extras: extras\n\t      };\n\t    },\n\t    fromClassDescriptor: function (elements) {\n\t      var obj = {\n\t        kind: \"class\",\n\t        elements: elements.map(this.fromElementDescriptor, this)\n\t      };\n\t      var desc = {\n\t        value: \"Descriptor\",\n\t        configurable: true\n\t      };\n\t      Object.defineProperty(obj, Symbol.toStringTag, desc);\n\t      return obj;\n\t    },\n\t    toClassDescriptor: function (obj) {\n\t      var kind = String(obj.kind);\n\n\t      if (kind !== \"class\") {\n\t        throw new TypeError('A class descriptor\\'s .kind property must be \"class\", but a decorator' + ' created a class descriptor with .kind \"' + kind + '\"');\n\t      }\n\n\t      this.disallowProperty(obj, \"key\", \"A class descriptor\");\n\t      this.disallowProperty(obj, \"placement\", \"A class descriptor\");\n\t      this.disallowProperty(obj, \"descriptor\", \"A class descriptor\");\n\t      this.disallowProperty(obj, \"initializer\", \"A class descriptor\");\n\t      this.disallowProperty(obj, \"extras\", \"A class descriptor\");\n\n\t      var finisher = _optionalCallableProperty(obj, \"finisher\");\n\n\t      var elements = this.toElementDescriptors(obj.elements);\n\t      return {\n\t        elements: elements,\n\t        finisher: finisher\n\t      };\n\t    },\n\t    runClassFinishers: function (constructor, finishers) {\n\t      for (var i = 0; i < finishers.length; i++) {\n\t        var newConstructor = (0, finishers[i])(constructor);\n\n\t        if (newConstructor !== undefined) {\n\t          if (typeof newConstructor !== \"function\") {\n\t            throw new TypeError(\"Finishers must return a constructor.\");\n\t          }\n\n\t          constructor = newConstructor;\n\t        }\n\t      }\n\n\t      return constructor;\n\t    },\n\t    disallowProperty: function (obj, name, objectType) {\n\t      if (obj[name] !== undefined) {\n\t        throw new TypeError(objectType + \" can't have a .\" + name + \" property.\");\n\t      }\n\t    }\n\t  };\n\t  return api;\n\t}\n\n\tfunction _createElementDescriptor(def) {\n\t  var key = _toPropertyKey(def.key);\n\n\t  var descriptor;\n\n\t  if (def.kind === \"method\") {\n\t    descriptor = {\n\t      value: def.value,\n\t      writable: true,\n\t      configurable: true,\n\t      enumerable: false\n\t    };\n\t  } else if (def.kind === \"get\") {\n\t    descriptor = {\n\t      get: def.value,\n\t      configurable: true,\n\t      enumerable: false\n\t    };\n\t  } else if (def.kind === \"set\") {\n\t    descriptor = {\n\t      set: def.value,\n\t      configurable: true,\n\t      enumerable: false\n\t    };\n\t  } else if (def.kind === \"field\") {\n\t    descriptor = {\n\t      configurable: true,\n\t      writable: true,\n\t      enumerable: true\n\t    };\n\t  }\n\n\t  var element = {\n\t    kind: def.kind === \"field\" ? \"field\" : \"method\",\n\t    key: key,\n\t    placement: def.static ? \"static\" : def.kind === \"field\" ? \"own\" : \"prototype\",\n\t    descriptor: descriptor\n\t  };\n\t  if (def.decorators) element.decorators = def.decorators;\n\t  if (def.kind === \"field\") element.initializer = def.value;\n\t  return element;\n\t}\n\n\tfunction _coalesceGetterSetter(element, other) {\n\t  if (element.descriptor.get !== undefined) {\n\t    other.descriptor.get = element.descriptor.get;\n\t  } else {\n\t    other.descriptor.set = element.descriptor.set;\n\t  }\n\t}\n\n\tfunction _coalesceClassElements(elements) {\n\t  var newElements = [];\n\n\t  var isSameElement = function (other) {\n\t    return other.kind === \"method\" && other.key === element.key && other.placement === element.placement;\n\t  };\n\n\t  for (var i = 0; i < elements.length; i++) {\n\t    var element = elements[i];\n\t    var other;\n\n\t    if (element.kind === \"method\" && (other = newElements.find(isSameElement))) {\n\t      if (_isDataDescriptor(element.descriptor) || _isDataDescriptor(other.descriptor)) {\n\t        if (_hasDecorators(element) || _hasDecorators(other)) {\n\t          throw new ReferenceError(\"Duplicated methods (\" + element.key + \") can't be decorated.\");\n\t        }\n\n\t        other.descriptor = element.descriptor;\n\t      } else {\n\t        if (_hasDecorators(element)) {\n\t          if (_hasDecorators(other)) {\n\t            throw new ReferenceError(\"Decorators can't be placed on different accessors with for \" + \"the same property (\" + element.key + \").\");\n\t          }\n\n\t          other.decorators = element.decorators;\n\t        }\n\n\t        _coalesceGetterSetter(element, other);\n\t      }\n\t    } else {\n\t      newElements.push(element);\n\t    }\n\t  }\n\n\t  return newElements;\n\t}\n\n\tfunction _hasDecorators(element) {\n\t  return element.decorators && element.decorators.length;\n\t}\n\n\tfunction _isDataDescriptor(desc) {\n\t  return desc !== undefined && !(desc.value === undefined && desc.writable === undefined);\n\t}\n\n\tfunction _optionalCallableProperty(obj, name) {\n\t  var value = obj[name];\n\n\t  if (value !== undefined && typeof value !== \"function\") {\n\t    throw new TypeError(\"Expected '\" + name + \"' to be a function\");\n\t  }\n\n\t  return value;\n\t}\n\n\tfunction _classPrivateMethodGet(receiver, privateSet, fn) {\n\t  if (!privateSet.has(receiver)) {\n\t    throw new TypeError(\"attempted to get private field on non-instance\");\n\t  }\n\n\t  return fn;\n\t}\n\n\tfunction _classPrivateMethodSet() {\n\t  throw new TypeError(\"attempted to reassign private method\");\n\t}\n\n\tfunction _wrapRegExp(re, groups) {\n\t  _wrapRegExp = function (re, groups) {\n\t    return new BabelRegExp(re, undefined, groups);\n\t  };\n\n\t  var _RegExp = _wrapNativeSuper(RegExp);\n\n\t  var _super = RegExp.prototype;\n\n\t  var _groups = new WeakMap();\n\n\t  function BabelRegExp(re, flags, groups) {\n\t    var _this = _RegExp.call(this, re, flags);\n\n\t    _groups.set(_this, groups || _groups.get(re));\n\n\t    return _this;\n\t  }\n\n\t  _inherits(BabelRegExp, _RegExp);\n\n\t  BabelRegExp.prototype.exec = function (str) {\n\t    var result = _super.exec.call(this, str);\n\n\t    if (result) result.groups = buildGroups(result, this);\n\t    return result;\n\t  };\n\n\t  BabelRegExp.prototype[Symbol.replace] = function (str, substitution) {\n\t    if (typeof substitution === \"string\") {\n\t      var groups = _groups.get(this);\n\n\t      return _super[Symbol.replace].call(this, str, substitution.replace(/\\$<([^>]+)>/g, function (_, name) {\n\t        return \"$\" + groups[name];\n\t      }));\n\t    } else if (typeof substitution === \"function\") {\n\t      var _this = this;\n\n\t      return _super[Symbol.replace].call(this, str, function () {\n\t        var args = [];\n\t        args.push.apply(args, arguments);\n\n\t        if (typeof args[args.length - 1] !== \"object\") {\n\t          args.push(buildGroups(args, _this));\n\t        }\n\n\t        return substitution.apply(this, args);\n\t      });\n\t    } else {\n\t      return _super[Symbol.replace].call(this, str, substitution);\n\t    }\n\t  };\n\n\t  function buildGroups(result, re) {\n\t    var g = _groups.get(re);\n\n\t    return Object.keys(g).reduce(function (groups, name) {\n\t      groups[name] = result[g[name]];\n\t      return groups;\n\t    }, Object.create(null));\n\t  }\n\n\t  return _wrapRegExp.apply(this, arguments);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar EPSILON_FLOAT32 = 1e-7;\n\tvar EPSILON_FLOAT16 = 1e-4;\n\t/** Convenient class for storing tensor-related data. */\n\n\tvar DataStorage = /*#__PURE__*/function () {\n\t  function DataStorage(backend, dataMover) {\n\t    this.backend = backend;\n\t    this.dataMover = dataMover;\n\t    this.data = new WeakMap();\n\t    this.dataIdsCount = 0;\n\t  }\n\n\t  var _proto = DataStorage.prototype;\n\n\t  _proto.get = function get(dataId) {\n\t    if (!this.data.has(dataId)) {\n\t      this.dataMover.moveData(this.backend, dataId);\n\t    }\n\n\t    return this.data.get(dataId);\n\t  };\n\n\t  _proto.set = function set(dataId, value) {\n\t    this.dataIdsCount++;\n\t    this.data.set(dataId, value);\n\t  };\n\n\t  _proto.has = function has(dataId) {\n\t    return this.data.has(dataId);\n\t  };\n\n\t  _proto.delete = function _delete(dataId) {\n\t    this.dataIdsCount--;\n\t    return this.data.delete(dataId);\n\t  };\n\n\t  _proto.numDataIds = function numDataIds() {\n\t    return this.dataIdsCount;\n\t  };\n\n\t  return DataStorage;\n\t}();\n\t/**\n\t * The interface that defines the kernels that should be implemented when\n\t * adding a new backend. New backends don't need to implement every one of the\n\t * methods, this can be done gradually (throw an error for unimplemented\n\t * methods).\n\t */\n\n\tvar KernelBackend = /*#__PURE__*/function () {\n\t  function KernelBackend() {}\n\n\t  var _proto2 = KernelBackend.prototype;\n\n\t  _proto2.time = function time(f) {\n\t    return notYetImplemented('time');\n\t  };\n\n\t  _proto2.read = function read(dataId) {\n\t    return notYetImplemented('read');\n\t  };\n\n\t  _proto2.readSync = function readSync(dataId) {\n\t    return notYetImplemented('readSync');\n\t  };\n\n\t  _proto2.numDataIds = function numDataIds() {\n\t    return notYetImplemented('numDataIds');\n\t  };\n\n\t  _proto2.disposeData = function disposeData(dataId) {\n\t    return notYetImplemented('disposeData');\n\t  };\n\n\t  _proto2.write = function write(values, shape, dtype) {\n\t    return notYetImplemented('write');\n\t  };\n\n\t  _proto2.move = function move(dataId, values, shape, dtype) {\n\t    return notYetImplemented('move');\n\t  };\n\n\t  _proto2.memory = function memory() {\n\t    return notYetImplemented('memory');\n\t  }\n\t  /** Returns the highest precision for floats in bits (e.g. 16 or 32) */\n\t  ;\n\n\t  _proto2.floatPrecision = function floatPrecision() {\n\t    return notYetImplemented('floatPrecision');\n\t  }\n\t  /** Returns the smallest representable number.  */\n\t  ;\n\n\t  _proto2.epsilon = function epsilon() {\n\t    return this.floatPrecision() === 32 ? EPSILON_FLOAT32 : EPSILON_FLOAT16;\n\t  };\n\n\t  _proto2.batchMatMul = function batchMatMul(a, b, transposeA, transposeB) {\n\t    return notYetImplemented('batchMatMul');\n\t  };\n\n\t  _proto2.fusedBatchMatMul = function fusedBatchMatMul(_ref) {\n\t    var a = _ref.a,\n\t        b = _ref.b,\n\t        transposeA = _ref.transposeA,\n\t        transposeB = _ref.transposeB,\n\t        bias = _ref.bias,\n\t        activation = _ref.activation,\n\t        preluActivationWeights = _ref.preluActivationWeights;\n\t    return notYetImplemented('fusedBatchMatMul');\n\t  };\n\n\t  _proto2.slice = function slice(x, begin, size) {\n\t    return notYetImplemented('slice');\n\t  };\n\n\t  _proto2.stridedSlice = function stridedSlice(x, begin, end, strides) {\n\t    return notYetImplemented('stridedSlice');\n\t  };\n\n\t  _proto2.unstack = function unstack(x, axis) {\n\t    return notYetImplemented('unstack');\n\t  };\n\n\t  _proto2.reverse = function reverse(a, axis) {\n\t    return notYetImplemented('reverse');\n\t  };\n\n\t  _proto2.concat = function concat(tensors, axis) {\n\t    return notYetImplemented('concat');\n\t  };\n\n\t  _proto2.neg = function neg(a) {\n\t    return notYetImplemented('neg');\n\t  };\n\n\t  _proto2.add = function add(a, b) {\n\t    return notYetImplemented('add');\n\t  };\n\n\t  _proto2.addN = function addN(tensors) {\n\t    return notYetImplemented('addN');\n\t  };\n\n\t  _proto2.subtract = function subtract(a, b) {\n\t    return notYetImplemented('subtract');\n\t  };\n\n\t  _proto2.multiply = function multiply(a, b) {\n\t    return notYetImplemented('multiply');\n\t  };\n\n\t  _proto2.realDivide = function realDivide(a, b) {\n\t    return notYetImplemented('realDivide');\n\t  };\n\n\t  _proto2.floorDiv = function floorDiv(a, b) {\n\t    return notYetImplemented('floorDiv');\n\t  };\n\n\t  _proto2.sum = function sum(x, axes) {\n\t    return notYetImplemented('sum');\n\t  };\n\n\t  _proto2.prod = function prod(x, axes) {\n\t    return notYetImplemented('prod');\n\t  };\n\n\t  _proto2.unsortedSegmentSum = function unsortedSegmentSum(x, segmentIds, numSegments) {\n\t    return notYetImplemented('unsortedSegmentSum');\n\t  };\n\n\t  _proto2.argMin = function argMin(x, axis) {\n\t    return notYetImplemented('argMin');\n\t  };\n\n\t  _proto2.argMax = function argMax(x, axis) {\n\t    return notYetImplemented('argMax');\n\t  };\n\n\t  _proto2.equal = function equal(a, b) {\n\t    return notYetImplemented('equal');\n\t  };\n\n\t  _proto2.notEqual = function notEqual(a, b) {\n\t    return notYetImplemented('notEqual');\n\t  };\n\n\t  _proto2.less = function less(a, b) {\n\t    return notYetImplemented('less');\n\t  };\n\n\t  _proto2.lessEqual = function lessEqual(a, b) {\n\t    return notYetImplemented('lessEqual');\n\t  };\n\n\t  _proto2.greater = function greater(a, b) {\n\t    return notYetImplemented('greater');\n\t  };\n\n\t  _proto2.greaterEqual = function greaterEqual(a, b) {\n\t    return notYetImplemented('greaterEqual');\n\t  };\n\n\t  _proto2.logicalNot = function logicalNot(a) {\n\t    return notYetImplemented('logicalNot');\n\t  };\n\n\t  _proto2.logicalAnd = function logicalAnd(a, b) {\n\t    return notYetImplemented('logicalAnd');\n\t  };\n\n\t  _proto2.logicalOr = function logicalOr(a, b) {\n\t    return notYetImplemented('logicalOr');\n\t  };\n\n\t  _proto2.where = function where(condition) {\n\t    return notYetImplemented('where');\n\t  };\n\n\t  _proto2.select = function select(condition, a, b) {\n\t    return notYetImplemented('select');\n\t  };\n\n\t  _proto2.topk = function topk(x, k, sorted) {\n\t    return notYetImplemented('topk');\n\t  };\n\n\t  _proto2.min = function min(x, axes) {\n\t    return notYetImplemented('min');\n\t  };\n\n\t  _proto2.minimum = function minimum(a, b) {\n\t    return notYetImplemented('minimum');\n\t  };\n\n\t  _proto2.mod = function mod(a, b) {\n\t    return notYetImplemented('mod');\n\t  };\n\n\t  _proto2.max = function max(x, axes) {\n\t    return notYetImplemented('max');\n\t  };\n\n\t  _proto2.maximum = function maximum(a, b) {\n\t    return notYetImplemented('maximum');\n\t  };\n\n\t  _proto2.all = function all(x, axes) {\n\t    return notYetImplemented('all');\n\t  };\n\n\t  _proto2.any = function any(x, axes) {\n\t    return notYetImplemented('any');\n\t  };\n\n\t  _proto2.squaredDifference = function squaredDifference(a, b) {\n\t    return notYetImplemented('squaredDifference');\n\t  };\n\n\t  _proto2.ceil = function ceil(x) {\n\t    return notYetImplemented('ceil');\n\t  };\n\n\t  _proto2.floor = function floor(x) {\n\t    return notYetImplemented('floor');\n\t  };\n\n\t  _proto2.round = function round(x) {\n\t    return notYetImplemented('round');\n\t  };\n\n\t  _proto2.sign = function sign(x) {\n\t    return notYetImplemented('sign');\n\t  };\n\n\t  _proto2.isNaN = function isNaN(x) {\n\t    return notYetImplemented('isNaN');\n\t  };\n\n\t  _proto2.isInf = function isInf(x) {\n\t    return notYetImplemented('isInf');\n\t  };\n\n\t  _proto2.isFinite = function isFinite(x) {\n\t    return notYetImplemented('isFinite');\n\t  };\n\n\t  _proto2.pow = function pow(a, b) {\n\t    return notYetImplemented('pow');\n\t  };\n\n\t  _proto2.exp = function exp(x) {\n\t    return notYetImplemented('exp');\n\t  };\n\n\t  _proto2.expm1 = function expm1(x) {\n\t    return notYetImplemented('expm1');\n\t  };\n\n\t  _proto2.softmax = function softmax(x, dim) {\n\t    return notYetImplemented('softmax');\n\t  };\n\n\t  _proto2.log = function log(x) {\n\t    return notYetImplemented('log');\n\t  };\n\n\t  _proto2.log1p = function log1p(x) {\n\t    return notYetImplemented('log1p');\n\t  };\n\n\t  _proto2.sqrt = function sqrt(x) {\n\t    return notYetImplemented('sqrt');\n\t  };\n\n\t  _proto2.rsqrt = function rsqrt(x) {\n\t    return notYetImplemented('rsqrt');\n\t  };\n\n\t  _proto2.square = function square(x) {\n\t    return notYetImplemented('square');\n\t  };\n\n\t  _proto2.reciprocal = function reciprocal(x) {\n\t    return notYetImplemented('reciprocal');\n\t  };\n\n\t  _proto2.relu = function relu(x) {\n\t    return notYetImplemented('relu');\n\t  };\n\n\t  _proto2.relu6 = function relu6(x) {\n\t    return notYetImplemented('relu6');\n\t  };\n\n\t  _proto2.prelu = function prelu(x, a) {\n\t    return notYetImplemented('prelu');\n\t  };\n\n\t  _proto2.elu = function elu(x) {\n\t    return notYetImplemented('elu');\n\t  };\n\n\t  _proto2.eluDer = function eluDer(dy, y) {\n\t    return notYetImplemented('eluDer');\n\t  };\n\n\t  _proto2.selu = function selu(x) {\n\t    return notYetImplemented('selu');\n\t  };\n\n\t  _proto2.int = function int(x) {\n\t    return notYetImplemented('int');\n\t  };\n\n\t  _proto2.clip = function clip(x, min, max) {\n\t    return notYetImplemented('clip');\n\t  };\n\n\t  _proto2.abs = function abs(x) {\n\t    return notYetImplemented('abs');\n\t  };\n\n\t  _proto2.complexAbs = function complexAbs(x) {\n\t    return notYetImplemented('complexAbs');\n\t  };\n\n\t  _proto2.sigmoid = function sigmoid(x) {\n\t    return notYetImplemented('sigmoid');\n\t  };\n\n\t  _proto2.softplus = function softplus(x) {\n\t    return notYetImplemented('softplus');\n\t  };\n\n\t  _proto2.sin = function sin(x) {\n\t    return notYetImplemented('sin');\n\t  };\n\n\t  _proto2.cos = function cos(x) {\n\t    return notYetImplemented('cos');\n\t  };\n\n\t  _proto2.tan = function tan(x) {\n\t    return notYetImplemented('tan');\n\t  };\n\n\t  _proto2.asin = function asin(x) {\n\t    return notYetImplemented('asin');\n\t  };\n\n\t  _proto2.acos = function acos(x) {\n\t    return notYetImplemented('acos');\n\t  };\n\n\t  _proto2.atan = function atan(x) {\n\t    return notYetImplemented('atan');\n\t  };\n\n\t  _proto2.atan2 = function atan2(a, b) {\n\t    return notYetImplemented('atan2');\n\t  };\n\n\t  _proto2.sinh = function sinh(x) {\n\t    return notYetImplemented('sinh');\n\t  };\n\n\t  _proto2.cosh = function cosh(x) {\n\t    return notYetImplemented('cosh');\n\t  };\n\n\t  _proto2.tanh = function tanh(x) {\n\t    return notYetImplemented('tanh');\n\t  };\n\n\t  _proto2.asinh = function asinh(x) {\n\t    return notYetImplemented('asinh');\n\t  };\n\n\t  _proto2.acosh = function acosh(x) {\n\t    return notYetImplemented('acosh');\n\t  };\n\n\t  _proto2.atanh = function atanh(x) {\n\t    return notYetImplemented('atanh');\n\t  };\n\n\t  _proto2.erf = function erf(x) {\n\t    return notYetImplemented('erf');\n\t  };\n\n\t  _proto2.step = function step(x, alpha) {\n\t    return notYetImplemented('step');\n\t  };\n\n\t  _proto2.fusedConv2d = function fusedConv2d(_ref2) {\n\t    var input = _ref2.input,\n\t        filter = _ref2.filter,\n\t        convInfo = _ref2.convInfo,\n\t        bias = _ref2.bias,\n\t        activation = _ref2.activation,\n\t        preluActivationWeights = _ref2.preluActivationWeights;\n\t    return notYetImplemented('fusedConv2d');\n\t  };\n\n\t  _proto2.conv2d = function conv2d(x, filter, convInfo) {\n\t    return notYetImplemented('conv2d');\n\t  };\n\n\t  _proto2.conv2dDerInput = function conv2dDerInput(dy, filter, convInfo) {\n\t    return notYetImplemented('conv2dDerInput');\n\t  };\n\n\t  _proto2.conv2dDerFilter = function conv2dDerFilter(x, dY, convInfo) {\n\t    return notYetImplemented('conv2dDerFilter');\n\t  };\n\n\t  _proto2.fusedDepthwiseConv2D = function fusedDepthwiseConv2D(_ref3) {\n\t    var input = _ref3.input,\n\t        filter = _ref3.filter,\n\t        convInfo = _ref3.convInfo,\n\t        bias = _ref3.bias,\n\t        activation = _ref3.activation,\n\t        preluActivationWeights = _ref3.preluActivationWeights;\n\t    return notYetImplemented('fusedDepthwiseConv2D');\n\t  };\n\n\t  _proto2.depthwiseConv2D = function depthwiseConv2D(input, filter, convInfo) {\n\t    return notYetImplemented('depthwiseConv2D');\n\t  };\n\n\t  _proto2.depthwiseConv2DDerInput = function depthwiseConv2DDerInput(dy, filter, convInfo) {\n\t    return notYetImplemented('depthwiseConv2DDerInput');\n\t  };\n\n\t  _proto2.depthwiseConv2DDerFilter = function depthwiseConv2DDerFilter(x, dY, convInfo) {\n\t    return notYetImplemented('depthwiseConv2DDerFilter');\n\t  };\n\n\t  _proto2.conv3d = function conv3d(x, filter, convInfo) {\n\t    return notYetImplemented('conv3d');\n\t  };\n\n\t  _proto2.conv3dDerInput = function conv3dDerInput(dy, filter, convInfo) {\n\t    return notYetImplemented('conv3dDerInput');\n\t  };\n\n\t  _proto2.conv3dDerFilter = function conv3dDerFilter(x, dY, convInfo) {\n\t    return notYetImplemented('conv3dDerFilter');\n\t  };\n\n\t  _proto2.maxPool = function maxPool(x, convInfo) {\n\t    return notYetImplemented('maxPool');\n\t  };\n\n\t  _proto2.maxPoolBackprop = function maxPoolBackprop(dy, x, y, convInfo) {\n\t    return notYetImplemented('maxPoolBackprop');\n\t  };\n\n\t  _proto2.avgPool = function avgPool(x, convInfo) {\n\t    return notYetImplemented('avgPool');\n\t  };\n\n\t  _proto2.avgPoolBackprop = function avgPoolBackprop(dy, x, convInfo) {\n\t    return notYetImplemented('avgPoolBackprop');\n\t  };\n\n\t  _proto2.avgPool3d = function avgPool3d(x, convInfo) {\n\t    return notYetImplemented('avgPool3d');\n\t  };\n\n\t  _proto2.avgPool3dBackprop = function avgPool3dBackprop(dy, x, convInfo) {\n\t    return notYetImplemented('avgPool3dBackprop');\n\t  };\n\n\t  _proto2.maxPool3d = function maxPool3d(x, convInfo) {\n\t    return notYetImplemented('maxPool3d');\n\t  };\n\n\t  _proto2.maxPool3dBackprop = function maxPool3dBackprop(dy, x, y, convInfo) {\n\t    return notYetImplemented('maxPool3dBackprop');\n\t  };\n\n\t  _proto2.reshape = function reshape(x, shape) {\n\t    return notYetImplemented('reshape');\n\t  };\n\n\t  _proto2.cast = function cast(x, dtype) {\n\t    return notYetImplemented('cast');\n\t  };\n\n\t  _proto2.tile = function tile(x, reps) {\n\t    return notYetImplemented('tile');\n\t  };\n\n\t  _proto2.pad = function pad(x, paddings, constantValue) {\n\t    return notYetImplemented('pad');\n\t  };\n\n\t  _proto2.transpose = function transpose(x, perm) {\n\t    return notYetImplemented('transpose');\n\t  };\n\n\t  _proto2.gather = function gather(x, indices, axis, batchDims) {\n\t    if (batchDims === void 0) {\n\t      batchDims = 0;\n\t    }\n\n\t    return notYetImplemented('gather');\n\t  };\n\n\t  _proto2.gatherND = function gatherND(x, indices) {\n\t    return notYetImplemented('gatherND');\n\t  };\n\n\t  _proto2.scatterND = function scatterND(indices, updates, shape) {\n\t    return notYetImplemented('scatterND');\n\t  };\n\n\t  _proto2.batchToSpaceND = function batchToSpaceND(x, blockShape, crops) {\n\t    return notYetImplemented('batchToSpaceND');\n\t  };\n\n\t  _proto2.spaceToBatchND = function spaceToBatchND(x, blockShape, paddings) {\n\t    return notYetImplemented('spaceToBatchND');\n\t  };\n\n\t  _proto2.resizeBilinear = function resizeBilinear(x, newHeight, newWidth, alignCorners, halfPixelCenters) {\n\t    return notYetImplemented('resizeBilinear');\n\t  };\n\n\t  _proto2.resizeBilinearBackprop = function resizeBilinearBackprop(dy, x, alignCorners) {\n\t    return notYetImplemented('resizeBilinearBackprop');\n\t  };\n\n\t  _proto2.resizeNearestNeighbor = function resizeNearestNeighbor(x, newHEight, newWidth, alignCorners, halfPixelCenters) {\n\t    return notYetImplemented('resizeNearestNeighbor');\n\t  };\n\n\t  _proto2.resizeNearestNeighborBackprop = function resizeNearestNeighborBackprop(dy, x, alignCorners) {\n\t    return notYetImplemented('resizeNearestNeighborBackprop');\n\t  };\n\n\t  _proto2.batchNorm = function batchNorm(x, mean, variance, offset, scale, varianceEpsilon) {\n\t    return notYetImplemented('batchNorm');\n\t  };\n\n\t  _proto2.localResponseNormalization4D = function localResponseNormalization4D(x, radius, bias, alpha, beta) {\n\t    return notYetImplemented('localResponseNormalization4D');\n\t  };\n\n\t  _proto2.LRNGrad = function LRNGrad(dy, inputImage, outputImage, radius, bias, alpha, beta) {\n\t    return notYetImplemented('LRNGrad');\n\t  };\n\n\t  _proto2.multinomial = function multinomial(logits, normalized, numSamples, seed) {\n\t    return notYetImplemented('multinomial');\n\t  };\n\n\t  _proto2.oneHot = function oneHot(indices, depth, onValue, offValue) {\n\t    return notYetImplemented('oneHot');\n\t  };\n\n\t  _proto2.cumsum = function cumsum(x, axis, exclusive, reverse) {\n\t    return notYetImplemented('cumsum');\n\t  };\n\n\t  _proto2.nonMaxSuppression = function nonMaxSuppression(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold) {\n\t    return notYetImplemented('nonMaxSuppression');\n\t  };\n\n\t  _proto2.fft = function fft(x) {\n\t    return notYetImplemented('fft');\n\t  };\n\n\t  _proto2.ifft = function ifft(x) {\n\t    return notYetImplemented('ifft');\n\t  };\n\n\t  _proto2.complex = function complex(real, imag) {\n\t    return notYetImplemented('complex');\n\t  };\n\n\t  _proto2.real = function real(input) {\n\t    return notYetImplemented('real');\n\t  };\n\n\t  _proto2.imag = function imag(input) {\n\t    return notYetImplemented('imag');\n\t  };\n\n\t  _proto2.cropAndResize = function cropAndResize(image, boxes, boxIndex, cropSize, method, extrapolationValue) {\n\t    return notYetImplemented('cropAndResize');\n\t  };\n\n\t  _proto2.depthToSpace = function depthToSpace(x, blockSize, dataFormat) {\n\t    return notYetImplemented('depthToSpace');\n\t  } // Aligns with the \"SplitV\" kernel in TensorFlow.\n\t  ;\n\n\t  _proto2.split = function split(value, sizeSplits, axis) {\n\t    return notYetImplemented('split');\n\t  };\n\n\t  _proto2.sparseToDense = function sparseToDense(sparseIndices, sparseValues, outputShape, defaultValue) {\n\t    return notYetImplemented('sparseToDense');\n\t  };\n\n\t  _proto2.diag = function diag(x) {\n\t    return notYetImplemented('diag');\n\t  };\n\n\t  _proto2.fill = function fill(shape, value, dtype) {\n\t    return notYetImplemented('fill');\n\t  };\n\n\t  _proto2.onesLike = function onesLike(x) {\n\t    return notYetImplemented('onesLike');\n\t  };\n\n\t  _proto2.zerosLike = function zerosLike(x) {\n\t    return notYetImplemented('zerosLike');\n\t  };\n\n\t  _proto2.linspace = function linspace(start, stop, num) {\n\t    return notYetImplemented('linspace');\n\t  };\n\n\t  _proto2.dispose = function dispose() {\n\t    return notYetImplemented('dispose');\n\t  };\n\n\t  return KernelBackend;\n\t}();\n\n\tfunction notYetImplemented(kernelName) {\n\t  throw new Error(\"'\" + kernelName + \"' not yet implemented or not found in the registry. \" + \"This kernel may not be supported by the tfjs backend you have chosen\");\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\t/**\n\t * Shuffles the array in-place using Fisher-Yates algorithm.\n\t *\n\t * ```js\n\t * const a = [1, 2, 3, 4, 5];\n\t * tf.util.shuffle(a);\n\t * console.log(a);\n\t * ```\n\t *\n\t * @param array The array to shuffle in-place.\n\t *\n\t * @doc {heading: 'Util', namespace: 'util'}\n\t */\n\t// tslint:disable-next-line:no-any\n\tfunction shuffle(array) {\n\t  var counter = array.length;\n\t  var temp = 0;\n\t  var index = 0; // While there are elements in the array\n\n\t  while (counter > 0) {\n\t    // Pick a random index\n\t    index = Math.random() * counter | 0; // Decrease counter by 1\n\n\t    counter--; // And swap the last element with it\n\n\t    temp = array[counter];\n\t    array[counter] = array[index];\n\t    array[index] = temp;\n\t  }\n\t}\n\t/** Clamps a value to a specified range. */\n\n\tfunction clamp(min, x, max) {\n\t  return Math.max(min, Math.min(x, max));\n\t}\n\tfunction nearestLargerEven(val) {\n\t  return val % 2 === 0 ? val : val + 1;\n\t}\n\tfunction sum(arr) {\n\t  var sum = 0;\n\n\t  for (var i = 0; i < arr.length; i++) {\n\t    sum += arr[i];\n\t  }\n\n\t  return sum;\n\t}\n\t/**\n\t * Returns a sample from a uniform [a, b) distribution.\n\t *\n\t * @param a The minimum support (inclusive).\n\t * @param b The maximum support (exclusive).\n\t * @return A pseudorandom number on the half-open interval [a,b).\n\t */\n\n\tfunction randUniform(a, b) {\n\t  var r = Math.random();\n\t  return b * r + (1 - r) * a;\n\t}\n\t/** Returns the squared Euclidean distance between two vectors. */\n\n\tfunction distSquared(a, b) {\n\t  var result = 0;\n\n\t  for (var i = 0; i < a.length; i++) {\n\t    var diff = Number(a[i]) - Number(b[i]);\n\t    result += diff * diff;\n\t  }\n\n\t  return result;\n\t}\n\t/**\n\t * Asserts that the expression is true. Otherwise throws an error with the\n\t * provided message.\n\t *\n\t * ```js\n\t * const x = 2;\n\t * tf.util.assert(x === 2, 'x is not 2');\n\t * ```\n\t *\n\t * @param expr The expression to assert (as a boolean).\n\t * @param msg A function that returns the message to report when throwing an\n\t *     error. We use a function for performance reasons.\n\t *\n\t * @doc {heading: 'Util', namespace: 'util'}\n\t */\n\n\tfunction assert(expr, msg) {\n\t  if (!expr) {\n\t    throw new Error(typeof msg === 'string' ? msg : msg());\n\t  }\n\t}\n\tfunction assertShapesMatch(shapeA, shapeB, errorMessagePrefix) {\n\t  if (errorMessagePrefix === void 0) {\n\t    errorMessagePrefix = '';\n\t  }\n\n\t  assert(arraysEqual(shapeA, shapeB), function () {\n\t    return errorMessagePrefix + (\" Shapes \" + shapeA + \" and \" + shapeB + \" must match\");\n\t  });\n\t}\n\tfunction assertNonNull(a) {\n\t  assert(a != null, function () {\n\t    return \"The input to the tensor constructor must be a non-null value.\";\n\t  });\n\t} // NOTE: We explicitly type out what T extends instead of any so that\n\t// util.flatten on a nested array of number doesn't try to infer T as a\n\t// number[][], causing us to explicitly type util.flatten<number>().\n\n\t/**\n\t *  Flattens an arbitrarily nested array.\n\t *\n\t * ```js\n\t * const a = [[1, 2], [3, 4], [5, [6, [7]]]];\n\t * const flat = tf.util.flatten(a);\n\t * console.log(flat);\n\t * ```\n\t *\n\t *  @param arr The nested array to flatten.\n\t *  @param result The destination array which holds the elements.\n\t *  @param skipTypedArray If true, avoids flattening the typed arrays. Defaults\n\t *      to false.\n\t *\n\t * @doc {heading: 'Util', namespace: 'util'}\n\t */\n\n\tfunction flatten(arr, result, skipTypedArray) {\n\t  if (result === void 0) {\n\t    result = [];\n\t  }\n\n\t  if (skipTypedArray === void 0) {\n\t    skipTypedArray = false;\n\t  }\n\n\t  if (result == null) {\n\t    result = [];\n\t  }\n\n\t  if (Array.isArray(arr) || isTypedArray$1(arr) && !skipTypedArray) {\n\t    for (var i = 0; i < arr.length; ++i) {\n\t      flatten(arr[i], result, skipTypedArray);\n\t    }\n\t  } else {\n\t    result.push(arr);\n\t  }\n\n\t  return result;\n\t}\n\t/**\n\t * Returns the size (number of elements) of the tensor given its shape.\n\t *\n\t * ```js\n\t * const shape = [3, 4, 2];\n\t * const size = tf.util.sizeFromShape(shape);\n\t * console.log(size);\n\t * ```\n\t *\n\t * @doc {heading: 'Util', namespace: 'util'}\n\t */\n\n\tfunction sizeFromShape(shape) {\n\t  if (shape.length === 0) {\n\t    // Scalar.\n\t    return 1;\n\t  }\n\n\t  var size = shape[0];\n\n\t  for (var i = 1; i < shape.length; i++) {\n\t    size *= shape[i];\n\t  }\n\n\t  return size;\n\t}\n\tfunction isScalarShape(shape) {\n\t  return shape.length === 0;\n\t}\n\tfunction arraysEqual(n1, n2) {\n\t  if (n1 === n2) {\n\t    return true;\n\t  }\n\n\t  if (n1 == null || n2 == null) {\n\t    return false;\n\t  }\n\n\t  if (n1.length !== n2.length) {\n\t    return false;\n\t  }\n\n\t  for (var i = 0; i < n1.length; i++) {\n\t    if (n1[i] !== n2[i]) {\n\t      return false;\n\t    }\n\t  }\n\n\t  return true;\n\t}\n\tfunction isInt(a) {\n\t  return a % 1 === 0;\n\t}\n\tfunction tanh(x) {\n\t  // tslint:disable-next-line:no-any\n\t  if (Math.tanh != null) {\n\t    // tslint:disable-next-line:no-any\n\t    return Math.tanh(x);\n\t  }\n\n\t  if (x === Infinity) {\n\t    return 1;\n\t  } else if (x === -Infinity) {\n\t    return -1;\n\t  } else {\n\t    var e2x = Math.exp(2 * x);\n\t    return (e2x - 1) / (e2x + 1);\n\t  }\n\t}\n\tfunction sizeToSquarishShape(size) {\n\t  var width = Math.ceil(Math.sqrt(size));\n\t  return [width, Math.ceil(size / width)];\n\t}\n\t/**\n\t * Creates a new array with randomized indicies to a given quantity.\n\t *\n\t * ```js\n\t * const randomTen = tf.util.createShuffledIndices(10);\n\t * console.log(randomTen);\n\t * ```\n\t *\n\t * @param number Quantity of how many shuffled indicies to create.\n\t *\n\t * @doc {heading: 'Util', namespace: 'util'}\n\t */\n\n\tfunction createShuffledIndices(n) {\n\t  var shuffledIndices = new Uint32Array(n);\n\n\t  for (var i = 0; i < n; ++i) {\n\t    shuffledIndices[i] = i;\n\t  }\n\n\t  shuffle(shuffledIndices);\n\t  return shuffledIndices;\n\t}\n\tfunction rightPad(a, size) {\n\t  if (size <= a.length) {\n\t    return a;\n\t  }\n\n\t  return a + ' '.repeat(size - a.length);\n\t}\n\tfunction repeatedTry(checkFn, delayFn, maxCounter) {\n\t  if (delayFn === void 0) {\n\t    delayFn = function delayFn(counter) {\n\t      return 0;\n\t    };\n\t  }\n\n\t  return new Promise(function (resolve, reject) {\n\t    var tryCount = 0;\n\n\t    var tryFn = function tryFn() {\n\t      if (checkFn()) {\n\t        resolve();\n\t        return;\n\t      }\n\n\t      tryCount++;\n\t      var nextBackoff = delayFn(tryCount);\n\n\t      if (maxCounter != null && tryCount >= maxCounter) {\n\t        reject();\n\t        return;\n\t      }\n\n\t      setTimeout(tryFn, nextBackoff);\n\t    };\n\n\t    tryFn();\n\t  });\n\t}\n\t/**\n\t * Given the full size of the array and a shape that may contain -1 as the\n\t * implicit dimension, returns the inferred shape where -1 is replaced.\n\t * E.g. For shape=[2, -1, 3] and size=24, it will return [2, 4, 3].\n\t *\n\t * @param shape The shape, which may contain -1 in some dimension.\n\t * @param size The full size (number of elements) of the array.\n\t * @return The inferred shape where -1 is replaced with the inferred size.\n\t */\n\n\tfunction inferFromImplicitShape(shape, size) {\n\t  var shapeProd = 1;\n\t  var implicitIdx = -1;\n\n\t  for (var i = 0; i < shape.length; ++i) {\n\t    if (shape[i] >= 0) {\n\t      shapeProd *= shape[i];\n\t    } else if (shape[i] === -1) {\n\t      if (implicitIdx !== -1) {\n\t        throw Error(\"Shapes can only have 1 implicit size. \" + (\"Found -1 at dim \" + implicitIdx + \" and dim \" + i));\n\t      }\n\n\t      implicitIdx = i;\n\t    } else if (shape[i] < 0) {\n\t      throw Error(\"Shapes can not be < 0. Found \" + shape[i] + \" at dim \" + i);\n\t    }\n\t  }\n\n\t  if (implicitIdx === -1) {\n\t    if (size > 0 && size !== shapeProd) {\n\t      throw Error(\"Size(\" + size + \") must match the product of shape \" + shape);\n\t    }\n\n\t    return shape;\n\t  }\n\n\t  if (shapeProd === 0) {\n\t    throw Error(\"Cannot infer the missing size in [\" + shape + \"] when \" + \"there are 0 elements\");\n\t  }\n\n\t  if (size % shapeProd !== 0) {\n\t    throw Error(\"The implicit shape can't be a fractional number. \" + (\"Got \" + size + \" / \" + shapeProd));\n\t  }\n\n\t  var newShape = shape.slice();\n\t  newShape[implicitIdx] = size / shapeProd;\n\t  return newShape;\n\t}\n\tfunction parseAxisParam(axis, shape) {\n\t  var rank = shape.length; // Normalize input\n\n\t  axis = axis == null ? shape.map(function (s, i) {\n\t    return i;\n\t  }) : [].concat(axis); // Check for valid range\n\n\t  assert(axis.every(function (ax) {\n\t    return ax >= -rank && ax < rank;\n\t  }), function () {\n\t    return \"All values in axis param must be in range [-\" + rank + \", \" + rank + \") but \" + (\"got axis \" + axis);\n\t  }); // Check for only integers\n\n\t  assert(axis.every(function (ax) {\n\t    return isInt(ax);\n\t  }), function () {\n\t    return \"All values in axis param must be integers but \" + (\"got axis \" + axis);\n\t  }); // Handle negative axis.\n\n\t  return axis.map(function (a) {\n\t    return a < 0 ? rank + a : a;\n\t  });\n\t}\n\t/** Reduces the shape by removing all dimensions of shape 1. */\n\n\tfunction squeezeShape(shape, axis) {\n\t  var newShape = [];\n\t  var keptDims = [];\n\t  var isEmptyArray = axis != null && Array.isArray(axis) && axis.length === 0;\n\t  var axes = axis == null || isEmptyArray ? null : parseAxisParam(axis, shape).sort();\n\t  var j = 0;\n\n\t  for (var i = 0; i < shape.length; ++i) {\n\t    if (axes != null) {\n\t      if (axes[j] === i && shape[i] !== 1) {\n\t        throw new Error(\"Can't squeeze axis \" + i + \" since its dim '\" + shape[i] + \"' is not 1\");\n\t      }\n\n\t      if ((axes[j] == null || axes[j] > i) && shape[i] === 1) {\n\t        newShape.push(shape[i]);\n\t        keptDims.push(i);\n\t      }\n\n\t      if (axes[j] <= i) {\n\t        j++;\n\t      }\n\t    }\n\n\t    if (shape[i] !== 1) {\n\t      newShape.push(shape[i]);\n\t      keptDims.push(i);\n\t    }\n\t  }\n\n\t  return {\n\t    newShape: newShape,\n\t    keptDims: keptDims\n\t  };\n\t}\n\tfunction getTypedArrayFromDType(dtype, size) {\n\t  var values = null;\n\n\t  if (dtype == null || dtype === 'float32') {\n\t    values = new Float32Array(size);\n\t  } else if (dtype === 'int32') {\n\t    values = new Int32Array(size);\n\t  } else if (dtype === 'bool') {\n\t    values = new Uint8Array(size);\n\t  } else {\n\t    throw new Error(\"Unknown data type \" + dtype);\n\t  }\n\n\t  return values;\n\t}\n\tfunction getArrayFromDType(dtype, size) {\n\t  var values = null;\n\n\t  if (dtype == null || dtype === 'float32') {\n\t    values = new Float32Array(size);\n\t  } else if (dtype === 'int32') {\n\t    values = new Int32Array(size);\n\t  } else if (dtype === 'bool') {\n\t    values = new Uint8Array(size);\n\t  } else if (dtype === 'string') {\n\t    values = new Array(size);\n\t  } else {\n\t    throw new Error(\"Unknown data type \" + dtype);\n\t  }\n\n\t  return values;\n\t}\n\tfunction checkConversionForErrors(vals, dtype) {\n\t  for (var i = 0; i < vals.length; i++) {\n\t    var num = vals[i];\n\n\t    if (isNaN(num) || !isFinite(num)) {\n\t      throw Error(\"A tensor of type \" + dtype + \" being uploaded contains \" + num + \".\");\n\t    }\n\t  }\n\t}\n\t/** Returns true if the dtype is valid. */\n\n\tfunction isValidDtype(dtype) {\n\t  return dtype === 'bool' || dtype === 'complex64' || dtype === 'float32' || dtype === 'int32' || dtype === 'string';\n\t}\n\t/**\n\t * Returns true if the new type can't encode the old type without loss of\n\t * precision.\n\t */\n\n\tfunction hasEncodingLoss(oldType, newType) {\n\t  if (newType === 'complex64') {\n\t    return false;\n\t  }\n\n\t  if (newType === 'float32' && oldType !== 'complex64') {\n\t    return false;\n\t  }\n\n\t  if (newType === 'int32' && oldType !== 'float32' && oldType !== 'complex64') {\n\t    return false;\n\t  }\n\n\t  if (newType === 'bool' && oldType === 'bool') {\n\t    return false;\n\t  }\n\n\t  return true;\n\t}\n\tfunction isTypedArray$1(a) {\n\t  return a instanceof Float32Array || a instanceof Int32Array || a instanceof Uint8Array;\n\t}\n\tfunction bytesPerElement(dtype) {\n\t  if (dtype === 'float32' || dtype === 'int32') {\n\t    return 4;\n\t  } else if (dtype === 'complex64') {\n\t    return 8;\n\t  } else if (dtype === 'bool') {\n\t    return 1;\n\t  } else {\n\t    throw new Error(\"Unknown dtype \" + dtype);\n\t  }\n\t}\n\t/**\n\t * Returns the approximate number of bytes allocated in the string array - 2\n\t * bytes per character. Computing the exact bytes for a native string in JS is\n\t * not possible since it depends on the encoding of the html page that serves\n\t * the website.\n\t */\n\n\tfunction bytesFromStringArray(arr) {\n\t  if (arr == null) {\n\t    return 0;\n\t  }\n\n\t  var bytes = 0;\n\t  arr.forEach(function (x) {\n\t    return bytes += x.length;\n\t  });\n\t  return bytes;\n\t}\n\t/** Returns true if the value is a string. */\n\n\tfunction isString(value) {\n\t  return typeof value === 'string' || value instanceof String;\n\t}\n\tfunction isBoolean(value) {\n\t  return typeof value === 'boolean';\n\t}\n\tfunction isNumber(value) {\n\t  return typeof value === 'number';\n\t}\n\tfunction inferDtype(values) {\n\t  if (Array.isArray(values)) {\n\t    return inferDtype(values[0]);\n\t  }\n\n\t  if (values instanceof Float32Array) {\n\t    return 'float32';\n\t  } else if (values instanceof Int32Array || values instanceof Uint8Array) {\n\t    return 'int32';\n\t  } else if (isNumber(values)) {\n\t    return 'float32';\n\t  } else if (isString(values)) {\n\t    return 'string';\n\t  } else if (isBoolean(values)) {\n\t    return 'bool';\n\t  }\n\n\t  return 'float32';\n\t}\n\tfunction isFunction(f) {\n\t  return !!(f && f.constructor && f.call && f.apply);\n\t}\n\tfunction nearestDivisor(size, start) {\n\t  for (var i = start; i < size; ++i) {\n\t    if (size % i === 0) {\n\t      return i;\n\t    }\n\t  }\n\n\t  return size;\n\t}\n\tfunction computeStrides(shape) {\n\t  var rank = shape.length;\n\n\t  if (rank < 2) {\n\t    return [];\n\t  } // Last dimension has implicit stride of 1, thus having D-1 (instead of D)\n\t  // strides.\n\n\n\t  var strides = new Array(rank - 1);\n\t  strides[rank - 2] = shape[rank - 1];\n\n\t  for (var i = rank - 3; i >= 0; --i) {\n\t    strides[i] = strides[i + 1] * shape[i + 1];\n\t  }\n\n\t  return strides;\n\t}\n\n\tfunction createNestedArray(offset, shape, a) {\n\t  var ret = new Array();\n\n\t  if (shape.length === 1) {\n\t    var d = shape[0];\n\n\t    for (var i = 0; i < d; i++) {\n\t      ret[i] = a[offset + i];\n\t    }\n\t  } else {\n\t    var _d = shape[0];\n\t    var rest = shape.slice(1);\n\t    var len = rest.reduce(function (acc, c) {\n\t      return acc * c;\n\t    });\n\n\t    for (var _i = 0; _i < _d; _i++) {\n\t      ret[_i] = createNestedArray(offset + _i * len, rest, a);\n\t    }\n\t  }\n\n\t  return ret;\n\t} // Provide a nested array of TypedArray in given shape.\n\n\n\tfunction toNestedArray(shape, a) {\n\t  if (shape.length === 0) {\n\t    // Scalar type should return a single number.\n\t    return a[0];\n\t  }\n\n\t  var size = shape.reduce(function (acc, c) {\n\t    return acc * c;\n\t  });\n\n\t  if (size === 0) {\n\t    // A tensor with shape zero should be turned into empty list.\n\t    return [];\n\t  }\n\n\t  if (size !== a.length) {\n\t    throw new Error(\"[\" + shape + \"] does not match the input size \" + a.length + \".\");\n\t  }\n\n\t  return createNestedArray(0, shape, a);\n\t}\n\tfunction makeOnesTypedArray(size, dtype) {\n\t  var array = makeZerosTypedArray(size, dtype);\n\n\t  for (var i = 0; i < array.length; i++) {\n\t    array[i] = 1;\n\t  }\n\n\t  return array;\n\t}\n\tfunction makeZerosTypedArray(size, dtype) {\n\t  if (dtype == null || dtype === 'float32' || dtype === 'complex64') {\n\t    return new Float32Array(size);\n\t  } else if (dtype === 'int32') {\n\t    return new Int32Array(size);\n\t  } else if (dtype === 'bool') {\n\t    return new Uint8Array(size);\n\t  } else {\n\t    throw new Error(\"Unknown data type \" + dtype);\n\t  }\n\t}\n\t/**\n\t * Make nested `TypedArray` filled with zeros.\n\t * @param shape The shape information for the nested array.\n\t * @param dtype dtype of the array element.\n\t */\n\n\tfunction makeZerosNestedTypedArray(shape, dtype) {\n\t  var size = shape.reduce(function (prev, curr) {\n\t    return prev * curr;\n\t  }, 1);\n\n\t  if (dtype == null || dtype === 'float32') {\n\t    return toNestedArray(shape, new Float32Array(size));\n\t  } else if (dtype === 'int32') {\n\t    return toNestedArray(shape, new Int32Array(size));\n\t  } else if (dtype === 'bool') {\n\t    return toNestedArray(shape, new Uint8Array(size));\n\t  } else {\n\t    throw new Error(\"Unknown data type \" + dtype);\n\t  }\n\t}\n\tfunction assertNonNegativeIntegerDimensions(shape) {\n\t  shape.forEach(function (dimSize) {\n\t    assert(Number.isInteger(dimSize) && dimSize >= 0, function () {\n\t      return \"Tensor must have a shape comprised of positive integers but got \" + (\"shape [\" + shape + \"].\");\n\t    });\n\t  });\n\t}\n\t/**\n\t * Computes flat index for a given location (multidimentionsal index) in a\n\t * Tensor/multidimensional array.\n\t *\n\t * @param locs Location in the tensor.\n\t * @param rank Rank of the tensor.\n\t * @param strides Tensor strides.\n\t */\n\n\tfunction locToIndex(locs, rank, strides) {\n\t  if (rank === 0) {\n\t    return 0;\n\t  } else if (rank === 1) {\n\t    return locs[0];\n\t  }\n\n\t  var index = locs[locs.length - 1];\n\n\t  for (var i = 0; i < locs.length - 1; ++i) {\n\t    index += strides[i] * locs[i];\n\t  }\n\n\t  return index;\n\t}\n\t/**\n\t * Computes the location (multidimensional index) in a tensor/multidimentional\n\t * array for a given flat index.\n\t *\n\t * @param index Index in flat array.\n\t * @param rank Rank of tensor.\n\t * @param strides Strides of tensor.\n\t */\n\n\tfunction indexToLoc(index, rank, strides) {\n\t  if (rank === 0) {\n\t    return [];\n\t  } else if (rank === 1) {\n\t    return [index];\n\t  }\n\n\t  var locs = new Array(rank);\n\n\t  for (var i = 0; i < locs.length - 1; ++i) {\n\t    locs[i] = Math.floor(index / strides[i]);\n\t    index -= locs[i] * strides[i];\n\t  }\n\n\t  locs[locs.length - 1] = index;\n\t  return locs;\n\t}\n\t/**\n\t * This method asserts whether an object is a Promise instance.\n\t * @param object\n\t */\n\t// tslint:disable-next-line: no-any\n\n\tfunction isPromise(object) {\n\t  //  We chose to not use 'obj instanceOf Promise' for two reasons:\n\t  //  1. It only reliably works for es6 Promise, not other Promise\n\t  //  implementations.\n\t  //  2. It doesn't work with framework that uses zone.js. zone.js monkey patch\n\t  //  the async calls, so it is possible the obj (patched) is comparing to a\n\t  //  pre-patched Promise.\n\t  return object && object.then && typeof object.then === 'function';\n\t}\n\n\tvar TENSORFLOWJS_FLAGS_PREFIX = 'tfjsflags';\n\t/**\n\t * The environment contains evaluated flags as well as the registered platform.\n\t * This is always used as a global singleton and can be retrieved with\n\t * `tf.env()`.\n\t *\n\t * @doc {heading: 'Environment'}\n\t */\n\n\tvar Environment = /*#__PURE__*/function () {\n\t  // tslint:disable-next-line: no-any\n\t  function Environment(global) {\n\t    this.global = global;\n\t    this.flags = {};\n\t    this.flagRegistry = {};\n\t    this.urlFlags = {};\n\t    this.populateURLFlags();\n\t  }\n\n\t  var _proto = Environment.prototype;\n\n\t  _proto.setPlatform = function setPlatform(platformName, platform) {\n\t    if (this.platform != null) {\n\t      console.warn(\"Platform \" + this.platformName + \" has already been set. \" + (\"Overwriting the platform with \" + platform + \".\"));\n\t    }\n\n\t    this.platformName = platformName;\n\t    this.platform = platform;\n\t  };\n\n\t  _proto.registerFlag = function registerFlag(flagName, evaluationFn, setHook) {\n\t    this.flagRegistry[flagName] = {\n\t      evaluationFn: evaluationFn,\n\t      setHook: setHook\n\t    }; // Override the flag value from the URL. This has to happen here because the\n\t    // environment is initialized before flags get registered.\n\n\t    if (this.urlFlags[flagName] != null) {\n\t      var flagValue = this.urlFlags[flagName];\n\t      console.warn(\"Setting feature override from URL \" + flagName + \": \" + flagValue + \".\");\n\t      this.set(flagName, flagValue);\n\t    }\n\t  };\n\n\t  _proto.getAsync = /*#__PURE__*/function () {\n\t    var _getAsync = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(flagName) {\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              if (!(flagName in this.flags)) {\n\t                _context.next = 2;\n\t                break;\n\t              }\n\n\t              return _context.abrupt(\"return\", this.flags[flagName]);\n\n\t            case 2:\n\t              _context.next = 4;\n\t              return this.evaluateFlag(flagName);\n\n\t            case 4:\n\t              this.flags[flagName] = _context.sent;\n\t              return _context.abrupt(\"return\", this.flags[flagName]);\n\n\t            case 6:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function getAsync(_x) {\n\t      return _getAsync.apply(this, arguments);\n\t    }\n\n\t    return getAsync;\n\t  }();\n\n\t  _proto.get = function get(flagName) {\n\t    if (flagName in this.flags) {\n\t      return this.flags[flagName];\n\t    }\n\n\t    var flagValue = this.evaluateFlag(flagName);\n\n\t    if (isPromise(flagValue)) {\n\t      throw new Error(\"Flag \" + flagName + \" cannot be synchronously evaluated. \" + \"Please use getAsync() instead.\");\n\t    }\n\n\t    this.flags[flagName] = flagValue;\n\t    return this.flags[flagName];\n\t  };\n\n\t  _proto.getNumber = function getNumber(flagName) {\n\t    return this.get(flagName);\n\t  };\n\n\t  _proto.getBool = function getBool(flagName) {\n\t    return this.get(flagName);\n\t  };\n\n\t  _proto.getFlags = function getFlags() {\n\t    return this.flags;\n\t  } // For backwards compatibility.\n\t  ;\n\n\t  _proto.set = function set(flagName, value) {\n\t    if (this.flagRegistry[flagName] == null) {\n\t      throw new Error(\"Cannot set flag \" + flagName + \" as it has not been registered.\");\n\t    }\n\n\t    this.flags[flagName] = value;\n\n\t    if (this.flagRegistry[flagName].setHook != null) {\n\t      this.flagRegistry[flagName].setHook(value);\n\t    }\n\t  };\n\n\t  _proto.evaluateFlag = function evaluateFlag(flagName) {\n\t    if (this.flagRegistry[flagName] == null) {\n\t      throw new Error(\"Cannot evaluate flag '\" + flagName + \"': no evaluation function found.\");\n\t    }\n\n\t    return this.flagRegistry[flagName].evaluationFn();\n\t  };\n\n\t  _proto.setFlags = function setFlags(flags) {\n\t    this.flags = Object.assign({}, flags);\n\t  };\n\n\t  _proto.reset = function reset() {\n\t    this.flags = {};\n\t    this.urlFlags = {};\n\t    this.populateURLFlags();\n\t  };\n\n\t  _proto.populateURLFlags = function populateURLFlags() {\n\t    var _this = this;\n\n\t    if (typeof this.global === 'undefined' || typeof this.global.location === 'undefined' || typeof this.global.location.search === 'undefined') {\n\t      return;\n\t    }\n\n\t    var urlParams = getQueryParams(this.global.location.search);\n\n\t    if (TENSORFLOWJS_FLAGS_PREFIX in urlParams) {\n\t      var keyValues = urlParams[TENSORFLOWJS_FLAGS_PREFIX].split(',');\n\t      keyValues.forEach(function (keyValue) {\n\t        var _keyValue$split = keyValue.split(':'),\n\t            key = _keyValue$split[0],\n\t            value = _keyValue$split[1];\n\n\t        _this.urlFlags[key] = parseValue(key, value);\n\t      });\n\t    }\n\t  };\n\n\t  _createClass(Environment, [{\n\t    key: \"features\",\n\t    get: function get() {\n\t      return this.flags;\n\t    }\n\t  }]);\n\n\t  return Environment;\n\t}();\n\tfunction getQueryParams(queryString) {\n\t  var params = {};\n\t  queryString.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, function (s) {\n\t    for (var _len = arguments.length, t = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n\t      t[_key - 1] = arguments[_key];\n\t    }\n\n\t    decodeParam(params, t[0], t[1]);\n\t    return t.join('=');\n\t  });\n\t  return params;\n\t}\n\n\tfunction decodeParam(params, name, value) {\n\t  params[decodeURIComponent(name)] = decodeURIComponent(value || '');\n\t}\n\n\tfunction parseValue(flagName, value) {\n\t  value = value.toLowerCase();\n\n\t  if (value === 'true' || value === 'false') {\n\t    return value === 'true';\n\t  } else if (\"\" + +value === value) {\n\t    return +value;\n\t  }\n\n\t  throw new Error(\"Could not parse value flag value \" + value + \" for flag \" + flagName + \".\");\n\t}\n\t/**\n\t * Returns the current environment (a global singleton).\n\t *\n\t * The environment object contains the evaluated feature values as well as the\n\t * active platform.\n\t *\n\t * @doc {heading: 'Environment'}\n\t */\n\n\n\tfunction env() {\n\t  return exports.ENV;\n\t}\n\texports.ENV = null;\n\tfunction setEnvironmentGlobal(environment) {\n\t  exports.ENV = environment;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t// Note that the identifier globalNameSpace is scoped to this module, but will\n\t// always resolve to the same global object regardless of how the module is\n\t// resolved.\n\t// tslint:disable-next-line:no-any\n\tvar globalNameSpace; // tslint:disable-next-line:no-any\n\n\tfunction getGlobalNamespace() {\n\t  if (globalNameSpace == null) {\n\t    // tslint:disable-next-line:no-any\n\t    var ns;\n\n\t    if (typeof window !== 'undefined') {\n\t      ns = window;\n\t    } else if (typeof global !== 'undefined') {\n\t      ns = global;\n\t    } else if (typeof process !== 'undefined') {\n\t      ns = process;\n\t    } else if (typeof self !== 'undefined') {\n\t      ns = self;\n\t    } else {\n\t      throw new Error('Could not find a global object');\n\t    }\n\n\t    globalNameSpace = ns;\n\t  }\n\n\t  return globalNameSpace;\n\t} // tslint:disable-next-line:no-any\n\n\tfunction getGlobalMap() {\n\t  var ns = getGlobalNamespace();\n\n\t  if (ns._tfGlobals == null) {\n\t    ns._tfGlobals = new Map();\n\t  }\n\n\t  return ns._tfGlobals;\n\t}\n\t/**\n\t * Returns a globally accessible 'singleton' object.\n\t *\n\t * @param key the name of the object\n\t * @param init a function to initialize to initialize this object\n\t *             the first time it is fetched.\n\t */\n\n\n\tfunction getGlobal(key, init) {\n\t  var globalMap = getGlobalMap();\n\n\t  if (globalMap.has(key)) {\n\t    return globalMap.get(key);\n\t  } else {\n\t    var singleton = init();\n\t    globalMap.set(key, singleton);\n\t    return globalMap.get(key);\n\t  }\n\t}\n\n\tvar Abs = 'Abs';\n\tvar Acos = 'Acos';\n\tvar Acosh = 'Acosh';\n\tvar Add = 'Add';\n\tvar AddN = 'AddN';\n\tvar All = 'All';\n\tvar Any = 'Any';\n\tvar ArgMax = 'ArgMax';\n\tvar ArgMin = 'ArgMin';\n\tvar Asin = 'Asin';\n\tvar Asinh = 'Asinh';\n\tvar Atan = 'Atan';\n\tvar Atanh = 'Atanh';\n\tvar Atan2 = 'Atan2';\n\tvar AvgPool = 'AvgPool';\n\tvar AvgPoolGrad = 'AvgPoolGrad';\n\tvar AvgPool3D = 'AvgPool3D';\n\tvar AvgPool3DGrad = 'AvgPool3DGrad';\n\tvar BatchMatMul = 'BatchMatMul';\n\tvar BatchToSpaceND = 'BatchToSpaceND';\n\tvar Bincount = 'Bincount';\n\tvar BroadcastTo = 'BroadcastTo';\n\tvar Cast = 'Cast';\n\tvar Ceil = 'Ceil';\n\tvar ClipByValue = 'ClipByValue';\n\tvar Complex = 'Complex';\n\tvar ComplexAbs = 'ComplexAbs';\n\tvar Concat = 'Concat';\n\tvar Conv2D = 'Conv2D';\n\tvar Conv2DBackpropFilter = 'Conv2DBackpropFilter';\n\tvar Conv2DBackpropInput = 'Conv2DBackpropInput';\n\tvar Conv3D = 'Conv3D';\n\tvar Conv3DBackpropFilterV2 = 'Conv3DBackpropFilterV2';\n\tvar Conv3DBackpropInputV2 = 'Conv3DBackpropInputV2';\n\tvar Cos = 'Cos';\n\tvar Cosh = 'Cosh';\n\tvar Cumsum = 'Cumsum';\n\tvar CropAndResize = 'CropAndResize';\n\tvar DenseBincount = 'DenseBincount';\n\tvar DepthToSpace = 'DepthToSpace';\n\tvar DepthwiseConv2dNative = 'DepthwiseConv2dNative';\n\tvar DepthwiseConv2dNativeBackpropFilter = 'DepthwiseConv2dNativeBackpropFilter';\n\tvar DepthwiseConv2dNativeBackpropInput = 'DepthwiseConv2dNativeBackpropInput';\n\tvar Diag = 'Diag';\n\tvar Dilation2D = 'Dilation2D';\n\tvar Dilation2DBackpropInput = 'Dilation2DBackpropInput';\n\tvar Dilation2DBackpropFilter = 'Dilation2DBackpropFilter';\n\tvar RealDiv = 'RealDiv';\n\tvar Elu = 'Elu';\n\tvar EluGrad = 'EluGrad';\n\tvar Erf = 'Erf';\n\tvar Equal = 'Equal';\n\tvar Exp = 'Exp';\n\tvar ExpandDims = 'ExpandDims';\n\tvar Expm1 = 'Expm1';\n\tvar FFT = 'FFT';\n\tvar Fill = 'Fill';\n\tvar FlipLeftRight = 'FlipLeftRight';\n\tvar Floor = 'Floor';\n\tvar FloorDiv = 'FloorDiv';\n\tvar FusedBatchNorm = 'FusedBatchNorm';\n\tvar GatherV2 = 'GatherV2';\n\tvar GatherNd = 'GatherNd';\n\tvar Greater = 'Greater';\n\tvar GreaterEqual = 'GreaterEqual';\n\tvar Identity = 'Identity';\n\tvar IFFT = 'IFFT';\n\tvar Imag = 'Imag';\n\tvar IsFinite = 'IsFinite';\n\tvar IsInf = 'IsInf';\n\tvar IsNan = 'IsNan';\n\tvar LeakyRelu = 'LeakyRelu';\n\tvar Less = 'Less';\n\tvar LessEqual = 'LessEqual';\n\tvar LinSpace = 'LinSpace';\n\tvar Log = 'Log';\n\tvar Log1p = 'Log1p';\n\tvar LogicalAnd = 'LogicalAnd';\n\tvar LogicalNot = 'LogicalNot';\n\tvar LogicalOr = 'LogicalOr';\n\tvar LogSoftmax = 'LogSoftmax';\n\tvar LRN = 'LRN';\n\tvar LRNGrad = 'LRNGrad';\n\tvar Max = 'Max';\n\tvar Maximum = 'Maximum';\n\tvar MaxPool = 'MaxPool';\n\tvar MaxPoolGrad = 'MaxPoolGrad';\n\tvar MaxPool3D = 'MaxPool3D';\n\tvar MaxPool3DGrad = 'MaxPool3DGrad';\n\tvar MaxPoolWithArgmax = 'MaxPoolWithArgmax';\n\tvar Mean = 'Mean';\n\tvar Min = 'Min';\n\tvar Minimum = 'Minimum';\n\tvar MirrorPad = 'MirrorPad';\n\tvar Mod = 'Mod';\n\tvar Multinomial = 'Multinomial';\n\tvar Multiply = 'Multiply';\n\tvar Neg = 'Neg';\n\tvar NotEqual = 'NotEqual';\n\tvar NonMaxSuppressionV3 = 'NonMaxSuppressionV3';\n\tvar NonMaxSuppressionV4 = 'NonMaxSuppressionV4';\n\tvar NonMaxSuppressionV5 = 'NonMaxSuppressionV5';\n\tvar OnesLike = 'OnesLike';\n\tvar OneHot = 'OneHot';\n\tvar Pack = 'Pack';\n\tvar PadV2 = 'PadV2';\n\tvar Pool = 'Pool';\n\tvar Pow = 'Pow';\n\tvar Prelu = 'Prelu';\n\tvar Prod = 'Prod';\n\tvar Range = 'Range';\n\tvar Real = 'Real';\n\tvar Reciprocal = 'Reciprocal';\n\tvar Relu = 'Relu';\n\tvar Reshape = 'Reshape';\n\tvar ResizeNearestNeighbor = 'ResizeNearestNeighbor';\n\tvar ResizeNearestNeighborGrad = 'ResizeNearestNeighborGrad';\n\tvar ResizeBilinear = 'ResizeBilinear';\n\tvar ResizeBilinearGrad = 'ResizeBilinearGrad';\n\tvar Relu6 = 'Relu6';\n\tvar Reverse = 'Reverse';\n\tvar Round = 'Round';\n\tvar Rsqrt = 'Rsqrt';\n\tvar ScatterNd = 'ScatterNd';\n\tvar Select = 'Select';\n\tvar Selu = 'Selu';\n\tvar Slice = 'Slice';\n\tvar Sin = 'Sin';\n\tvar Sinh = 'Sinh';\n\tvar Sign = 'Sign';\n\tvar Sigmoid = 'Sigmoid';\n\tvar Softplus = 'Softplus';\n\tvar Sqrt = 'Sqrt';\n\tvar Sum = 'Sum';\n\tvar SpaceToBatchND = 'SpaceToBatchND';\n\tvar SplitV = 'SplitV';\n\tvar Softmax = 'Softmax';\n\tvar SquaredDifference = 'SquaredDifference';\n\tvar Square = 'Square';\n\tvar Sub = 'Sub';\n\tvar SparseToDense = 'SparseToDense';\n\tvar StridedSlice = 'StridedSlice';\n\tvar Tan = 'Tan';\n\tvar Tanh = 'Tanh';\n\tvar Tile = 'Tile';\n\tvar TopK = 'TopK';\n\tvar Transpose = 'Transpose';\n\tvar Unique = 'Unique';\n\tvar Unpack = 'Unpack';\n\tvar UnsortedSegmentSum = 'UnsortedSegmentSum';\n\tvar ZerosLike = 'ZerosLike';\n\t/**\n\t * TensorFlow.js-only kernels\n\t */\n\n\tvar Step = 'Step';\n\tvar FromPixels = 'FromPixels';\n\tvar RotateWithOffset = 'RotateWithOffset';\n\tvar _FusedMatMul = '_FusedMatMul';\n\tvar FusedConv2D = 'FusedConv2D';\n\tvar FusedDepthwiseConv2D = 'FusedDepthwiseConv2D';\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar kernelRegistry = getGlobal('kernelRegistry', function () {\n\t  return new Map();\n\t});\n\tvar gradRegistry = getGlobal('gradRegistry', function () {\n\t  return new Map();\n\t});\n\t/**\n\t * Returns the kernel function (code) associated with the provided names.\n\t *\n\t * @param kernelName The official name of the kernel.\n\t * @param backendName The official name of the backend.\n\t */\n\n\tfunction getKernel(kernelName, backendName) {\n\t  var key = makeKey(kernelName, backendName);\n\t  return kernelRegistry.get(key);\n\t}\n\t/**\n\t * Returns the registered gradient info associated with the provided kernel.\n\t * @param kernelName The official TF kernel name.\n\t */\n\n\tfunction getGradient(kernelName) {\n\t  return gradRegistry.get(kernelName);\n\t}\n\tfunction getKernelsForBackend(backendName) {\n\t  var it = kernelRegistry.entries();\n\t  var result = [];\n\n\t  while (true) {\n\t    var _it$next = it.next(),\n\t        done = _it$next.done,\n\t        value = _it$next.value;\n\n\t    if (done) {\n\t      break;\n\t    }\n\n\t    var key = value[0],\n\t        config = value[1];\n\n\t    var _key$split = key.split('_'),\n\t        backend = _key$split[0];\n\n\t    if (backend === backendName) {\n\t      result.push(config);\n\t    }\n\t  }\n\n\t  return result;\n\t}\n\t/**\n\t * Registers the function (forward pass) for the kernel in a global registry.\n\t *\n\t * @param config A config object with the following properties:\n\t * - `kernelName` The official name of the kernel.\n\t * - `backendName` The official name of the backend.\n\t * - `kernelFunc` The function to run during the forward pass of the kernel.\n\t * - `setupFunc` Optional. Gets called once, after the backend initializes.\n\t * - `disposeFunc` Optional. Gets called once, right before the backend is\n\t * disposed.\n\t */\n\n\tfunction registerKernel(config) {\n\t  var kernelName = config.kernelName,\n\t      backendName = config.backendName;\n\t  var key = makeKey(kernelName, backendName);\n\n\t  if (kernelRegistry.has(key)) {\n\t    console.warn(\"The kernel '\" + kernelName + \"' for backend \" + (\"'\" + backendName + \"' is already registered\"));\n\t  }\n\n\t  kernelRegistry.set(key, config);\n\t}\n\t/**\n\t * Registers a gradient function for a given kernel in the global registry,\n\t * to be used during the back-propagation of that kernel.\n\t *\n\t * @param config An object with the following properties:\n\t * - `kernelName` The name of the kernel that the gradient function is for.\n\t * - `gradFunc` The function to run during back-propagation.\n\t */\n\n\tfunction registerGradient(config) {\n\t  var kernelName = config.kernelName;\n\n\t  if (gradRegistry.has(kernelName)) {\n\t    // TODO (yassogba) after 3.0 assess whether we need to keep this gated\n\t    // to debug mode.\n\t    if (env().getBool('DEBUG')) {\n\t      console.warn(\"Overriding the gradient for '\" + kernelName + \"'\");\n\t    }\n\t  }\n\n\t  gradRegistry.set(kernelName, config);\n\t}\n\t/**\n\t * Removes the kernel function from the registry.\n\t *\n\t * @param kernelName The official name of the kernel.\n\t * @param backendName The official name of the backend.\n\t *\n\t */\n\n\tfunction unregisterKernel(kernelName, backendName) {\n\t  var key = makeKey(kernelName, backendName);\n\n\t  if (!kernelRegistry.has(key)) {\n\t    throw new Error(\"The kernel '\" + kernelName + \"' for backend \" + (\"'\" + backendName + \"' is not registered\"));\n\t  }\n\n\t  kernelRegistry.delete(key);\n\t}\n\t/** Removes the registered gradient from the global registry. */\n\n\tfunction unregisterGradient(kernelName) {\n\t  if (!gradRegistry.has(kernelName)) {\n\t    throw new Error(\"The gradient '\" + kernelName + \"' for backend is not registered\");\n\t  }\n\n\t  gradRegistry.delete(kernelName);\n\t}\n\t/**\n\t * Finds kernels that have already been registered to a backend and re-registers\n\t * them for a new backend. Useful for registering custom backends.\n\t * @param registeredBackendName Already registered backend.\n\t * @param newBackendName New backend.\n\t */\n\n\tfunction copyRegisteredKernels(registeredBackendName, newBackendName) {\n\t  var kernels = getKernelsForBackend(registeredBackendName);\n\t  kernels.forEach(function (kernelConfig) {\n\t    var newKernelConfig = Object.assign({}, kernelConfig, {\n\t      backendName: newBackendName\n\t    });\n\t    registerKernel(newKernelConfig);\n\t  });\n\t}\n\n\tfunction makeKey(kernelName, backendName) {\n\t  return backendName + \"_\" + kernelName;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Create typed array for scalar value. Used for storing in `DataStorage`.\n\t */\n\n\tfunction createScalarValue(value, dtype) {\n\t  if (dtype === 'string') {\n\t    return encodeString(value);\n\t  }\n\n\t  return toTypedArray([value], dtype);\n\t}\n\n\tfunction noConversionNeeded(a, dtype) {\n\t  return a instanceof Float32Array && dtype === 'float32' || a instanceof Int32Array && dtype === 'int32' || a instanceof Uint8Array && dtype === 'bool';\n\t}\n\n\tfunction toTypedArray(a, dtype) {\n\t  if (dtype === 'string') {\n\t    throw new Error('Cannot convert a string[] to a TypedArray');\n\t  }\n\n\t  if (Array.isArray(a)) {\n\t    a = flatten(a);\n\t  }\n\n\t  if (env().getBool('DEBUG')) {\n\t    checkConversionForErrors(a, dtype);\n\t  }\n\n\t  if (noConversionNeeded(a, dtype)) {\n\t    return a;\n\t  }\n\n\t  if (dtype == null || dtype === 'float32' || dtype === 'complex64') {\n\t    return new Float32Array(a);\n\t  } else if (dtype === 'int32') {\n\t    return new Int32Array(a);\n\t  } else if (dtype === 'bool') {\n\t    var bool = new Uint8Array(a.length);\n\n\t    for (var i = 0; i < bool.length; ++i) {\n\t      if (Math.round(a[i]) !== 0) {\n\t        bool[i] = 1;\n\t      }\n\t    }\n\n\t    return bool;\n\t  } else {\n\t    throw new Error(\"Unknown data type \" + dtype);\n\t  }\n\t}\n\t/**\n\t * Returns the current high-resolution time in milliseconds relative to an\n\t * arbitrary time in the past. It works across different platforms (node.js,\n\t * browsers).\n\t *\n\t * ```js\n\t * console.log(tf.util.now());\n\t * ```\n\t *\n\t * @doc {heading: 'Util', namespace: 'util'}\n\t */\n\n\tfunction now() {\n\t  return env().platform.now();\n\t}\n\t/**\n\t * Returns a platform-specific implementation of\n\t * [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API).\n\t *\n\t * If `fetch` is defined on the global object (`window`, `process`, etc.),\n\t * `tf.util.fetch` returns that function.\n\t *\n\t * If not, `tf.util.fetch` returns a platform-specific solution.\n\t *\n\t * ```js\n\t * const resource = await tf.util.fetch('https://unpkg.com/@tensorflow/tfjs');\n\t * // handle response\n\t * ```\n\t *\n\t * @doc {heading: 'Util'}\n\t */\n\n\tfunction fetch$1(path, requestInits) {\n\t  return env().platform.fetch(path, requestInits);\n\t}\n\t/**\n\t * Encodes the provided string into bytes using the provided encoding scheme.\n\t *\n\t * @param s The string to encode.\n\t * @param encoding The encoding scheme. Defaults to utf-8.\n\t *\n\t * @doc {heading: 'Util'}\n\t */\n\n\tfunction encodeString(s, encoding) {\n\t  if (encoding === void 0) {\n\t    encoding = 'utf-8';\n\t  }\n\n\t  encoding = encoding || 'utf-8';\n\t  return env().platform.encode(s, encoding);\n\t}\n\t/**\n\t * Decodes the provided bytes into a string using the provided encoding scheme.\n\t * @param bytes The bytes to decode.\n\t *\n\t * @param encoding The encoding scheme. Defaults to utf-8.\n\t *\n\t * @doc {heading: 'Util'}\n\t */\n\n\tfunction decodeString(bytes, encoding) {\n\t  if (encoding === void 0) {\n\t    encoding = 'utf-8';\n\t  }\n\n\t  encoding = encoding || 'utf-8';\n\t  return env().platform.decode(bytes, encoding);\n\t}\n\n\tvar util = {\n\t\t__proto__: null,\n\t\tcreateScalarValue: createScalarValue,\n\t\ttoTypedArray: toTypedArray,\n\t\tnow: now,\n\t\tfetch: fetch$1,\n\t\tencodeString: encodeString,\n\t\tdecodeString: decodeString,\n\t\tshuffle: shuffle,\n\t\tclamp: clamp,\n\t\tnearestLargerEven: nearestLargerEven,\n\t\tsum: sum,\n\t\trandUniform: randUniform,\n\t\tdistSquared: distSquared,\n\t\tassert: assert,\n\t\tassertShapesMatch: assertShapesMatch,\n\t\tassertNonNull: assertNonNull,\n\t\tflatten: flatten,\n\t\tsizeFromShape: sizeFromShape,\n\t\tisScalarShape: isScalarShape,\n\t\tarraysEqual: arraysEqual,\n\t\tisInt: isInt,\n\t\ttanh: tanh,\n\t\tsizeToSquarishShape: sizeToSquarishShape,\n\t\tcreateShuffledIndices: createShuffledIndices,\n\t\trightPad: rightPad,\n\t\trepeatedTry: repeatedTry,\n\t\tinferFromImplicitShape: inferFromImplicitShape,\n\t\tparseAxisParam: parseAxisParam,\n\t\tsqueezeShape: squeezeShape,\n\t\tgetTypedArrayFromDType: getTypedArrayFromDType,\n\t\tgetArrayFromDType: getArrayFromDType,\n\t\tcheckConversionForErrors: checkConversionForErrors,\n\t\tisValidDtype: isValidDtype,\n\t\thasEncodingLoss: hasEncodingLoss,\n\t\tisTypedArray: isTypedArray$1,\n\t\tbytesPerElement: bytesPerElement,\n\t\tbytesFromStringArray: bytesFromStringArray,\n\t\tisString: isString,\n\t\tisBoolean: isBoolean,\n\t\tisNumber: isNumber,\n\t\tinferDtype: inferDtype,\n\t\tisFunction: isFunction,\n\t\tnearestDivisor: nearestDivisor,\n\t\tcomputeStrides: computeStrides,\n\t\ttoNestedArray: toNestedArray,\n\t\tmakeOnesTypedArray: makeOnesTypedArray,\n\t\tmakeZerosTypedArray: makeZerosTypedArray,\n\t\tmakeZerosNestedTypedArray: makeZerosNestedTypedArray,\n\t\tassertNonNegativeIntegerDimensions: assertNonNegativeIntegerDimensions,\n\t\tlocToIndex: locToIndex,\n\t\tindexToLoc: indexToLoc,\n\t\tisPromise: isPromise\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar Profiler = /*#__PURE__*/function () {\n\t  function Profiler(backendTimer, logger) {\n\t    this.backendTimer = backendTimer;\n\t    this.logger = logger;\n\n\t    if (logger == null) {\n\t      this.logger = new Logger();\n\t    }\n\t  }\n\n\t  var _proto = Profiler.prototype;\n\n\t  _proto.profileKernel = function profileKernel(kernelName, inputs, f) {\n\t    var outputs;\n\n\t    var holdResultWrapperFn = function holdResultWrapperFn() {\n\t      outputs = f();\n\t    };\n\n\t    var timer = this.backendTimer.time(holdResultWrapperFn);\n\n\t    if (env().getBool('CHECK_COMPUTATION_FOR_ERRORS')) {\n\t      var _loop = function _loop(i) {\n\t        var output = outputs[i]; // Dangling promise here because we don't want to propagate up\n\t        // asynchronicity.\n\n\t        output.data().then(function (tensorVals) {\n\t          checkComputationForErrors(tensorVals, output.dtype, kernelName);\n\t        });\n\t      };\n\n\t      for (var i = 0; i < outputs.length; i++) {\n\t        _loop(i);\n\t      }\n\t    }\n\n\t    var kernelProfile = {\n\t      kernelName: kernelName,\n\t      outputs: outputs,\n\t      inputs: inputs,\n\t      timeMs: timer.then(function (timing) {\n\t        return timing.kernelMs;\n\t      }),\n\t      extraInfo: timer.then(function (timing) {\n\t        return timing.getExtraProfileInfo != null ? timing.getExtraProfileInfo() : '';\n\t      })\n\t    };\n\t    return kernelProfile;\n\t  };\n\n\t  _proto.logKernelProfile = function logKernelProfile(kernelProfile) {\n\t    var _this = this;\n\n\t    var kernelName = kernelProfile.kernelName,\n\t        outputs = kernelProfile.outputs,\n\t        timeMs = kernelProfile.timeMs,\n\t        inputs = kernelProfile.inputs,\n\t        extraInfo = kernelProfile.extraInfo;\n\t    outputs.forEach(function (result) {\n\t      Promise.all([result.data(), timeMs, extraInfo]).then(function (valueContainer) {\n\t        _this.logger.logKernelProfile(kernelName, result, valueContainer[0], valueContainer[1], inputs, valueContainer[2]);\n\t      });\n\t    });\n\t  };\n\n\t  return Profiler;\n\t}();\n\tfunction checkComputationForErrors(vals, dtype, kernelName) {\n\t  if (dtype !== 'float32') {\n\t    // Only floating point computations will generate NaN values\n\t    return false;\n\t  }\n\n\t  for (var i = 0; i < vals.length; i++) {\n\t    var num = vals[i];\n\n\t    if (isNaN(num) || !isFinite(num)) {\n\t      // Throwing custom exception so behavior is testable.\n\t      console.warn(\"Found \" + num + \" in the result of '\" + kernelName + \"'\");\n\t      return true;\n\t    }\n\t  }\n\n\t  return false;\n\t}\n\tvar Logger = /*#__PURE__*/function () {\n\t  function Logger() {}\n\n\t  var _proto2 = Logger.prototype;\n\n\t  _proto2.logKernelProfile = function logKernelProfile(name, result, vals, timeMs, inputs, extraInfo) {\n\t    var time = typeof timeMs === 'number' ? rightPad(timeMs + \"ms\", 9) : timeMs['error'];\n\t    var paddedName = rightPad(name, 25);\n\t    var rank = result.rank;\n\t    var size = result.size;\n\t    var shape = rightPad(result.shape.toString(), 14);\n\t    var inputShapesDescription = '';\n\n\t    for (var _name in inputs) {\n\t      var input = inputs[_name];\n\n\t      if (input != null) {\n\t        // The input might be a non-tensor (e.g HTMLImageElement), in which case\n\t        // we claim the output shape as input shape.\n\t        var inputShape = input.shape || result.shape;\n\t        var inputRank = inputShape.length;\n\t        inputShapesDescription += _name + \": \" + inputRank + \"D \" + (inputRank > 0 ? inputShape : '') + \" \";\n\t      }\n\t    }\n\n\t    console.log(\"%c\" + paddedName + \"\\t%c\" + time + \"\\t%c\" + rank + \"D \" + shape + \"\\t%c\" + size + \"\\t%c\" + inputShapesDescription + \"\\t%c\" + extraInfo, 'font-weight:bold', 'color:red', 'color:blue', 'color: orange', 'color: green', 'color: steelblue');\n\t  };\n\n\t  return Logger;\n\t}();\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes a list of TapeNodes that connect x to y, filtering everything else\n\t * out and preserving the order of the original tape elements.\n\t *\n\t * @param tape The tape elements to filter.\n\t * @param xs The input Tensors.\n\t * @param y The output Tensor.\n\t */\n\n\tfunction getFilteredNodesXToY(tape, xs, y) {\n\t  // Forward pass to compute all the nodes and Tensors that are transitively a\n\t  // function of x.\n\t  var tensorsFromX = {};\n\t  var nodesFromX = {};\n\n\t  for (var i = 0; i < xs.length; i++) {\n\t    tensorsFromX[xs[i].id] = true;\n\t  }\n\n\t  for (var _i = 0; _i < tape.length; _i++) {\n\t    var node = tape[_i];\n\t    var nodeInputs = node.inputs;\n\n\t    for (var inputName in nodeInputs) {\n\t      var input = nodeInputs[inputName];\n\t      var anyInputFromX = false;\n\n\t      for (var j = 0; j < xs.length; j++) {\n\t        if (tensorsFromX[input.id]) {\n\t          node.outputs.forEach(function (output) {\n\t            return tensorsFromX[output.id] = true;\n\t          });\n\t          anyInputFromX = true;\n\t          nodesFromX[node.id] = true;\n\t          break;\n\t        }\n\t      }\n\n\t      if (anyInputFromX) {\n\t        break;\n\t      }\n\t    }\n\t  } // Backward pass to find all of the nodes and Tensors that lead to y.\n\n\n\t  var tensorsLeadToY = {};\n\t  tensorsLeadToY[y.id] = true;\n\t  var nodesToY = {};\n\n\t  for (var _i2 = tape.length - 1; _i2 >= 0; _i2--) {\n\t    var _node = tape[_i2];\n\t    var _nodeInputs = _node.inputs; // If any of the outputs lead to y, mark all of the inputs as leading to y.\n\n\t    for (var _j = 0; _j < _node.outputs.length; _j++) {\n\t      if (tensorsLeadToY[_node.outputs[_j].id]) {\n\t        for (var _inputName in _nodeInputs) {\n\t          tensorsLeadToY[_nodeInputs[_inputName].id] = true;\n\t          nodesToY[_node.id] = true;\n\t        }\n\n\t        break;\n\t      }\n\t    }\n\t  } // Return the paths that come from x and lead to y.\n\n\n\t  var filteredTape = [];\n\n\t  for (var _i3 = 0; _i3 < tape.length; _i3++) {\n\t    var _node2 = tape[_i3];\n\n\t    if (nodesFromX[_node2.id] && nodesToY[_node2.id]) {\n\t      // Prune the inputs from the node that aren't a function of x.\n\t      var prunedInputs = {};\n\n\t      for (var _inputName2 in _node2.inputs) {\n\t        var nodeInput = _node2.inputs[_inputName2];\n\n\t        if (tensorsFromX[nodeInput.id]) {\n\t          prunedInputs[_inputName2] = nodeInput;\n\t        }\n\t      } // Copy the node and overwrite inputsAndArgs to the pruned version.\n\n\n\t      var prunedNode = Object.assign({}, _node2);\n\t      prunedNode.inputs = prunedInputs;\n\t      prunedNode.outputs = _node2.outputs;\n\t      filteredTape.push(prunedNode);\n\t    }\n\t  }\n\n\t  return filteredTape;\n\t}\n\t/**\n\t * Backpropagate gradients through the filtered TapeNodes.\n\t *\n\t * @param tensorAccumulatedGradientMap A map of Tensor to its gradient. This map\n\t * is mutated by this method.\n\t * @param filteredTape The filtered TapeNodes to backprop through.\n\t */\n\n\tfunction backpropagateGradients(tensorAccumulatedGradientMap, filteredTape, tidy, add) {\n\t  var _loop = function _loop(i) {\n\t    var node = filteredTape[i];\n\t    var dys = [];\n\t    node.outputs.forEach(function (o) {\n\t      var gradTensor = tensorAccumulatedGradientMap[o.id];\n\n\t      if (gradTensor != null) {\n\t        dys.push(gradTensor);\n\t      } else {\n\t        // This particular output is not in the back-propagation subgraph, so it\n\t        // does not affect the final output, thus we put null for its dy.\n\t        dys.push(null);\n\t      }\n\t    });\n\n\t    if (node.gradient == null) {\n\t      throw new Error(\"Cannot compute gradient: gradient function not found \" + (\"for \" + node.kernelName + \".\"));\n\t    } // Backprop dy through this node and accumulate gradients over the inputs.\n\n\n\t    var inputGradients = node.gradient(dys);\n\n\t    var _loop2 = function _loop2(inputName) {\n\t      if (!(inputName in inputGradients)) {\n\t        throw new Error(\"Cannot backprop through input \" + inputName + \". \" + (\"Available gradients found: \" + Object.keys(inputGradients) + \".\"));\n\t      } // Call the gradient function.\n\n\n\t      var dx = tidy(function () {\n\t        return inputGradients[inputName]();\n\t      });\n\n\t      if (dx.dtype !== 'float32') {\n\t        throw new Error(\"Error in gradient for op \" + node.kernelName + \". The gradient of input \" + (inputName + \" must have 'float32' dtype, but has '\" + dx.dtype + \"'\"));\n\t      }\n\n\t      var x = node.inputs[inputName];\n\n\t      if (!arraysEqual(dx.shape, x.shape)) {\n\t        throw new Error(\"Error in gradient for op \" + node.kernelName + \". The gradient of input \" + (\"'\" + inputName + \"' has shape '\" + dx.shape + \"', which does not match \") + (\"the shape of the input '\" + x.shape + \"'\"));\n\t      }\n\n\t      if (tensorAccumulatedGradientMap[x.id] == null) {\n\t        tensorAccumulatedGradientMap[x.id] = dx;\n\t      } else {\n\t        var curGradient = tensorAccumulatedGradientMap[x.id];\n\t        tensorAccumulatedGradientMap[x.id] = add(curGradient, dx);\n\t        curGradient.dispose();\n\t      }\n\t    };\n\n\t    for (var inputName in node.inputs) {\n\t      _loop2(inputName);\n\t    }\n\t  };\n\n\t  // Walk the tape backward and keep a map of Tensor to its gradient.\n\t  for (var i = filteredTape.length - 1; i >= 0; i--) {\n\t    _loop(i);\n\t  }\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tvar FORMAT_LIMIT_NUM_VALS = 20; // Number of first and last values to show when displaying a, b,...,y, z.\n\n\tvar FORMAT_NUM_FIRST_LAST_VALS = 3; // Number of significant digits to show.\n\n\tvar FORMAT_NUM_SIG_DIGITS = 7;\n\tfunction tensorToString(vals, shape, dtype, verbose) {\n\t  var strides = computeStrides(shape);\n\t  var padPerCol = computeMaxSizePerColumn(vals, shape, dtype, strides);\n\t  var rank = shape.length;\n\t  var valsLines = subTensorToString(vals, shape, dtype, strides, padPerCol);\n\t  var lines = ['Tensor'];\n\n\t  if (verbose) {\n\t    lines.push(\"  dtype: \" + dtype);\n\t    lines.push(\"  rank: \" + rank);\n\t    lines.push(\"  shape: [\" + shape + \"]\");\n\t    lines.push(\"  values:\");\n\t  }\n\n\t  lines.push(valsLines.map(function (l) {\n\t    return '    ' + l;\n\t  }).join('\\n'));\n\t  return lines.join('\\n');\n\t}\n\n\tfunction computeMaxSizePerColumn(vals, shape, dtype, strides) {\n\t  var n = sizeFromShape(shape);\n\t  var numCols = strides[strides.length - 1];\n\t  var padPerCol = new Array(numCols).fill(0);\n\t  var rank = shape.length;\n\t  var valuesOrTuples = dtype === 'complex64' ? createComplexTuples(vals) : vals;\n\n\t  if (rank > 1) {\n\t    for (var row = 0; row < n / numCols; row++) {\n\t      var offset = row * numCols;\n\n\t      for (var j = 0; j < numCols; j++) {\n\t        padPerCol[j] = Math.max(padPerCol[j], valToString(valuesOrTuples[offset + j], 0, dtype).length);\n\t      }\n\t    }\n\t  }\n\n\t  return padPerCol;\n\t}\n\n\tfunction valToString(val, pad, dtype) {\n\t  var valStr;\n\n\t  if (Array.isArray(val)) {\n\t    valStr = parseFloat(val[0].toFixed(FORMAT_NUM_SIG_DIGITS)) + \" + \" + (parseFloat(val[1].toFixed(FORMAT_NUM_SIG_DIGITS)) + \"j\");\n\t  } else if (isString(val)) {\n\t    valStr = \"'\" + val + \"'\";\n\t  } else if (dtype === 'bool') {\n\t    valStr = boolNumToString(val);\n\t  } else {\n\t    valStr = parseFloat(val.toFixed(FORMAT_NUM_SIG_DIGITS)).toString();\n\t  }\n\n\t  return rightPad(valStr, pad);\n\t}\n\n\tfunction boolNumToString(v) {\n\t  return v === 0 ? 'false' : 'true';\n\t}\n\n\tfunction subTensorToString(vals, shape, dtype, strides, padPerCol, isLast) {\n\t  if (isLast === void 0) {\n\t    isLast = true;\n\t  }\n\n\t  var storagePerElement = dtype === 'complex64' ? 2 : 1;\n\t  var size = shape[0];\n\t  var rank = shape.length;\n\n\t  if (rank === 0) {\n\t    if (dtype === 'complex64') {\n\t      var complexTuple = createComplexTuples(vals);\n\t      return [valToString(complexTuple[0], 0, dtype)];\n\t    }\n\n\t    if (dtype === 'bool') {\n\t      return [boolNumToString(vals[0])];\n\t    }\n\n\t    return [vals[0].toString()];\n\t  }\n\n\t  if (rank === 1) {\n\t    if (size > FORMAT_LIMIT_NUM_VALS) {\n\t      var firstValsSize = FORMAT_NUM_FIRST_LAST_VALS * storagePerElement;\n\t      var firstVals = Array.from(vals.slice(0, firstValsSize));\n\t      var lastVals = Array.from(vals.slice((size - FORMAT_NUM_FIRST_LAST_VALS) * storagePerElement, size * storagePerElement));\n\n\t      if (dtype === 'complex64') {\n\t        firstVals = createComplexTuples(firstVals);\n\t        lastVals = createComplexTuples(lastVals);\n\t      }\n\n\t      return ['[' + firstVals.map(function (x, i) {\n\t        return valToString(x, padPerCol[i], dtype);\n\t      }).join(', ') + ', ..., ' + lastVals.map(function (x, i) {\n\t        return valToString(x, padPerCol[size - FORMAT_NUM_FIRST_LAST_VALS + i], dtype);\n\t      }).join(', ') + ']'];\n\t    }\n\n\t    var displayVals = dtype === 'complex64' ? createComplexTuples(vals) : Array.from(vals);\n\t    return ['[' + displayVals.map(function (x, i) {\n\t      return valToString(x, padPerCol[i], dtype);\n\t    }).join(', ') + ']'];\n\t  } // The array is rank 2 or more.\n\n\n\t  var subshape = shape.slice(1);\n\t  var substrides = strides.slice(1);\n\t  var stride = strides[0] * storagePerElement;\n\t  var lines = [];\n\n\t  if (size > FORMAT_LIMIT_NUM_VALS) {\n\t    for (var i = 0; i < FORMAT_NUM_FIRST_LAST_VALS; i++) {\n\t      var start = i * stride;\n\t      var end = start + stride;\n\t      lines.push.apply(lines, subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, false\n\t      /* isLast */\n\t      ));\n\t    }\n\n\t    lines.push('...');\n\n\t    for (var _i = size - FORMAT_NUM_FIRST_LAST_VALS; _i < size; _i++) {\n\t      var _start = _i * stride;\n\n\t      var _end = _start + stride;\n\n\t      lines.push.apply(lines, subTensorToString(vals.slice(_start, _end), subshape, dtype, substrides, padPerCol, _i === size - 1\n\t      /* isLast */\n\t      ));\n\t    }\n\t  } else {\n\t    for (var _i2 = 0; _i2 < size; _i2++) {\n\t      var _start2 = _i2 * stride;\n\n\t      var _end2 = _start2 + stride;\n\n\t      lines.push.apply(lines, subTensorToString(vals.slice(_start2, _end2), subshape, dtype, substrides, padPerCol, _i2 === size - 1\n\t      /* isLast */\n\t      ));\n\t    }\n\t  }\n\n\t  var sep = rank === 2 ? ',' : '';\n\t  lines[0] = '[' + lines[0] + sep;\n\n\t  for (var _i3 = 1; _i3 < lines.length - 1; _i3++) {\n\t    lines[_i3] = ' ' + lines[_i3] + sep;\n\t  }\n\n\t  var newLineSep = ',\\n';\n\n\t  for (var _i4 = 2; _i4 < rank; _i4++) {\n\t    newLineSep += '\\n';\n\t  }\n\n\t  lines[lines.length - 1] = ' ' + lines[lines.length - 1] + ']' + (isLast ? '' : newLineSep);\n\t  return lines;\n\t}\n\n\tfunction createComplexTuples(vals) {\n\t  var complexTuples = [];\n\n\t  for (var i = 0; i < vals.length; i += 2) {\n\t    complexTuples.push([vals[i], vals[i + 1]]);\n\t  }\n\n\t  return complexTuples;\n\t}\n\n\t/**\n\t * A mutable object, similar to `tf.Tensor`, that allows users to set values\n\t * at locations before converting to an immutable `tf.Tensor`.\n\t *\n\t * See `tf.buffer` for creating a tensor buffer.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t */\n\n\tvar TensorBuffer = /*#__PURE__*/function () {\n\t  function TensorBuffer(shape, dtype, values) {\n\t    var _this = this;\n\n\t    this.dtype = dtype;\n\t    this.shape = shape.slice();\n\t    this.size = sizeFromShape(shape);\n\n\t    if (values != null) {\n\t      var n = values.length;\n\t      assert(n === this.size, function () {\n\t        return \"Length of values '\" + n + \"' does not match the size \" + (\"inferred by the shape '\" + _this.size + \"'.\");\n\t      });\n\t    }\n\n\t    if (dtype === 'complex64') {\n\t      throw new Error(\"complex64 dtype TensorBuffers are not supported. Please create \" + \"a TensorBuffer for the real and imaginary parts separately and \" + \"call tf.complex(real, imag).\");\n\t    }\n\n\t    this.values = values || getArrayFromDType(dtype, this.size);\n\t    this.strides = computeStrides(shape);\n\t  }\n\t  /**\n\t   * Sets a value in the buffer at a given location.\n\t   *\n\t   * @param value The value to set.\n\t   * @param locs  The location indices.\n\t   *\n\t   * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t   */\n\n\n\t  var _proto = TensorBuffer.prototype;\n\n\t  _proto.set = function set(value) {\n\t    var _this2 = this;\n\n\t    for (var _len = arguments.length, locs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n\t      locs[_key - 1] = arguments[_key];\n\t    }\n\n\t    if (locs.length === 0) {\n\t      locs = [0];\n\t    }\n\n\t    assert(locs.length === this.rank, function () {\n\t      return \"The number of provided coordinates (\" + locs.length + \") must \" + (\"match the rank (\" + _this2.rank + \")\");\n\t    });\n\t    var index = this.locToIndex(locs);\n\t    this.values[index] = value;\n\t  }\n\t  /**\n\t   * Returns the value in the buffer at the provided location.\n\t   *\n\t   * @param locs The location indices.\n\t   *\n\t   * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t   */\n\t  ;\n\n\t  _proto.get = function get() {\n\t    for (var _len2 = arguments.length, locs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n\t      locs[_key2] = arguments[_key2];\n\t    }\n\n\t    if (locs.length === 0) {\n\t      locs = [0];\n\t    }\n\n\t    var i = 0;\n\n\t    for (var _i = 0, _locs = locs; _i < _locs.length; _i++) {\n\t      var loc = _locs[_i];\n\n\t      if (loc < 0 || loc >= this.shape[i]) {\n\t        var msg = \"Requested out of range element at \" + locs + \". \" + (\"  Buffer shape=\" + this.shape);\n\t        throw new Error(msg);\n\t      }\n\n\t      i++;\n\t    }\n\n\t    var index = locs[locs.length - 1];\n\n\t    for (var _i2 = 0; _i2 < locs.length - 1; ++_i2) {\n\t      index += this.strides[_i2] * locs[_i2];\n\t    }\n\n\t    return this.values[index];\n\t  };\n\n\t  _proto.locToIndex = function locToIndex(locs) {\n\t    if (this.rank === 0) {\n\t      return 0;\n\t    } else if (this.rank === 1) {\n\t      return locs[0];\n\t    }\n\n\t    var index = locs[locs.length - 1];\n\n\t    for (var i = 0; i < locs.length - 1; ++i) {\n\t      index += this.strides[i] * locs[i];\n\t    }\n\n\t    return index;\n\t  };\n\n\t  _proto.indexToLoc = function indexToLoc(index) {\n\t    if (this.rank === 0) {\n\t      return [];\n\t    } else if (this.rank === 1) {\n\t      return [index];\n\t    }\n\n\t    var locs = new Array(this.shape.length);\n\n\t    for (var i = 0; i < locs.length - 1; ++i) {\n\t      locs[i] = Math.floor(index / this.strides[i]);\n\t      index -= locs[i] * this.strides[i];\n\t    }\n\n\t    locs[locs.length - 1] = index;\n\t    return locs;\n\t  };\n\n\t  /**\n\t   * Creates an immutable `tf.Tensor` object from the buffer.\n\t   *\n\t   * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t   */\n\t  _proto.toTensor = function toTensor() {\n\t    return trackerFn().makeTensor(this.values, this.shape, this.dtype);\n\t  };\n\n\t  _createClass(TensorBuffer, [{\n\t    key: \"rank\",\n\t    get: function get() {\n\t      return this.shape.length;\n\t    }\n\t  }]);\n\n\t  return TensorBuffer;\n\t}(); // For tracking tensor creation and disposal.\n\n\tvar trackerFn = null; // Used by chaining methods to call into ops.\n\n\tvar opHandler = null; // Used to warn about deprecated methods.\n\n\tvar deprecationWarningFn = null; // This here so that we can use this method on dev branches and keep the\n\t// functionality at master.\n\t// tslint:disable-next-line:no-unused-expression\n\n\t[deprecationWarningFn];\n\t/**\n\t * An external consumer can register itself as the tensor tracker. This way\n\t * the Tensor class can notify the tracker for every tensor created and\n\t * disposed.\n\t */\n\n\tfunction setTensorTracker(fn) {\n\t  trackerFn = fn;\n\t}\n\t/**\n\t * An external consumer can register itself as the op handler. This way the\n\t * Tensor class can have chaining methods that call into ops via the op\n\t * handler.\n\t */\n\n\tfunction setOpHandler(handler) {\n\t  opHandler = handler;\n\t}\n\t/**\n\t * Sets the deprecation warning function to be used by this file. This way the\n\t * Tensor class can be a leaf but still use the environment.\n\t */\n\n\tfunction setDeprecationWarningFn(fn) {\n\t  deprecationWarningFn = fn;\n\t}\n\t/**\n\t * A `tf.Tensor` object represents an immutable, multidimensional array of\n\t * numbers that has a shape and a data type.\n\t *\n\t * See `tf.tensor` for details on how to create a `tf.Tensor`.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t */\n\n\tvar Tensor = /*#__PURE__*/function () {\n\t  function Tensor(shape, dtype, dataId, id) {\n\t    /** Whether this tensor has been globally kept. */\n\t    this.kept = false;\n\t    this.isDisposedInternal = false;\n\t    this.shape = shape.slice();\n\t    this.dtype = dtype || 'float32';\n\t    this.size = sizeFromShape(shape);\n\t    this.strides = computeStrides(shape);\n\t    this.dataId = dataId;\n\t    this.id = id;\n\t    this.rankType = this.rank < 5 ? this.rank.toString() : 'higher';\n\t  }\n\n\t  var _proto2 = Tensor.prototype;\n\n\t  /**\n\t   * Returns a promise of `tf.TensorBuffer` that holds the underlying data.\n\t   *\n\t   * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t   */\n\t  _proto2.buffer =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _buffer = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      var vals;\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              _context.next = 2;\n\t              return this.data();\n\n\t            case 2:\n\t              vals = _context.sent;\n\t              return _context.abrupt(\"return\", opHandler.buffer(this.shape, this.dtype, vals));\n\n\t            case 4:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function buffer() {\n\t      return _buffer.apply(this, arguments);\n\t    }\n\n\t    return buffer;\n\t  }()\n\t  /**\n\t   * Returns a `tf.TensorBuffer` that holds the underlying data.\n\t   * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto2.bufferSync = function bufferSync() {\n\t    return opHandler.buffer(this.shape, this.dtype, this.dataSync());\n\t  }\n\t  /**\n\t   * Returns the tensor data as a nested array. The transfer of data is done\n\t   * asynchronously.\n\t   *\n\t   * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto2.array =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _array = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n\t      var vals;\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              _context2.next = 2;\n\t              return this.data();\n\n\t            case 2:\n\t              vals = _context2.sent;\n\t              return _context2.abrupt(\"return\", toNestedArray(this.shape, vals));\n\n\t            case 4:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function array() {\n\t      return _array.apply(this, arguments);\n\t    }\n\n\t    return array;\n\t  }()\n\t  /**\n\t   * Returns the tensor data as a nested array. The transfer of data is done\n\t   * synchronously.\n\t   *\n\t   * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto2.arraySync = function arraySync() {\n\t    return toNestedArray(this.shape, this.dataSync());\n\t  }\n\t  /**\n\t   * Asynchronously downloads the values from the `tf.Tensor`. Returns a\n\t   * promise of `TypedArray` that resolves when the computation has finished.\n\t   *\n\t   * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto2.data =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _data = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n\t      var data, bytes;\n\t      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t        while (1) {\n\t          switch (_context3.prev = _context3.next) {\n\t            case 0:\n\t              this.throwIfDisposed();\n\t              data = trackerFn().read(this.dataId);\n\n\t              if (!(this.dtype === 'string')) {\n\t                _context3.next = 13;\n\t                break;\n\t              }\n\n\t              _context3.next = 5;\n\t              return data;\n\n\t            case 5:\n\t              bytes = _context3.sent;\n\t              _context3.prev = 6;\n\t              return _context3.abrupt(\"return\", bytes.map(function (b) {\n\t                return decodeString(b);\n\t              }));\n\n\t            case 10:\n\t              _context3.prev = 10;\n\t              _context3.t0 = _context3[\"catch\"](6);\n\t              throw new Error('Failed to decode the string bytes into utf-8. ' + 'To get the original bytes, call tensor.bytes().');\n\n\t            case 13:\n\t              return _context3.abrupt(\"return\", data);\n\n\t            case 14:\n\t            case \"end\":\n\t              return _context3.stop();\n\t          }\n\t        }\n\t      }, _callee3, this, [[6, 10]]);\n\t    }));\n\n\t    function data() {\n\t      return _data.apply(this, arguments);\n\t    }\n\n\t    return data;\n\t  }()\n\t  /**\n\t   * Synchronously downloads the values from the `tf.Tensor`. This blocks the\n\t   * UI thread until the values are ready, which can cause performance issues.\n\t   *\n\t   * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto2.dataSync = function dataSync() {\n\t    this.throwIfDisposed();\n\t    var data = trackerFn().readSync(this.dataId);\n\n\t    if (this.dtype === 'string') {\n\t      try {\n\t        return data.map(function (b) {\n\t          return decodeString(b);\n\t        });\n\t      } catch (_a) {\n\t        throw new Error('Failed to decode the string bytes into utf-8. ' + 'To get the original bytes, call tensor.bytes().');\n\t      }\n\t    }\n\n\t    return data;\n\t  }\n\t  /** Returns the underlying bytes of the tensor's data. */\n\t  ;\n\n\t  _proto2.bytes =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _bytes = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {\n\t      var data;\n\t      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n\t        while (1) {\n\t          switch (_context4.prev = _context4.next) {\n\t            case 0:\n\t              this.throwIfDisposed();\n\t              _context4.next = 3;\n\t              return trackerFn().read(this.dataId);\n\n\t            case 3:\n\t              data = _context4.sent;\n\n\t              if (!(this.dtype === 'string')) {\n\t                _context4.next = 8;\n\t                break;\n\t              }\n\n\t              return _context4.abrupt(\"return\", data);\n\n\t            case 8:\n\t              return _context4.abrupt(\"return\", new Uint8Array(data.buffer));\n\n\t            case 9:\n\t            case \"end\":\n\t              return _context4.stop();\n\t          }\n\t        }\n\t      }, _callee4, this);\n\t    }));\n\n\t    function bytes() {\n\t      return _bytes.apply(this, arguments);\n\t    }\n\n\t    return bytes;\n\t  }()\n\t  /**\n\t   * Disposes `tf.Tensor` from memory.\n\t   *\n\t   * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto2.dispose = function dispose() {\n\t    if (this.isDisposed) {\n\t      return;\n\t    }\n\n\t    trackerFn().disposeTensor(this);\n\t    this.isDisposedInternal = true;\n\t  };\n\n\t  _proto2.throwIfDisposed = function throwIfDisposed() {\n\t    if (this.isDisposed) {\n\t      throw new Error(\"Tensor is disposed.\");\n\t    }\n\t  }\n\t  /**\n\t   * Prints the `tf.Tensor`. See `tf.print` for details.\n\t   *\n\t   * @param verbose Whether to print verbose information about the tensor,\n\t   *    including dtype and size.\n\t   *\n\t   * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto2.print = function print(verbose) {\n\t    if (verbose === void 0) {\n\t      verbose = false;\n\t    }\n\n\t    return opHandler.print(this, verbose);\n\t  }\n\t  /**\n\t   * Returns a copy of the tensor. See `tf.clone` for details.\n\t   * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto2.clone = function clone() {\n\t    this.throwIfDisposed();\n\t    return opHandler.clone(this);\n\t  }\n\t  /**\n\t   * Returns a human-readable description of the tensor. Useful for logging.\n\t   *\n\t   * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto2.toString = function toString(verbose) {\n\t    if (verbose === void 0) {\n\t      verbose = false;\n\t    }\n\n\t    var vals = this.dataSync();\n\t    return tensorToString(vals, this.shape, this.dtype, verbose);\n\t  };\n\n\t  _proto2.cast = function cast(dtype) {\n\t    this.throwIfDisposed();\n\t    return opHandler.cast(this, dtype);\n\t  };\n\n\t  _proto2.variable = function variable(trainable, name, dtype) {\n\t    if (trainable === void 0) {\n\t      trainable = true;\n\t    }\n\n\t    this.throwIfDisposed();\n\t    return trackerFn().makeVariable(this, trainable, name, dtype);\n\t  };\n\n\t  _createClass(Tensor, [{\n\t    key: \"rank\",\n\t    get: function get() {\n\t      return this.shape.length;\n\t    }\n\t  }, {\n\t    key: \"isDisposed\",\n\t    get: function get() {\n\t      return this.isDisposedInternal;\n\t    }\n\t  }]);\n\n\t  return Tensor;\n\t}();\n\tObject.defineProperty(Tensor, Symbol.hasInstance, {\n\t  value: function value(instance) {\n\t    // Implementation note: we should use properties of the object that will be\n\t    // defined before the constructor body has finished executing (methods).\n\t    // This is because when this code is transpiled by babel, babel will call\n\t    // classCallCheck before the constructor body is run.\n\t    // See https://github.com/tensorflow/tfjs/issues/3384 for backstory.\n\t    return !!instance && instance.data != null && instance.dataSync != null && instance.throwIfDisposed != null;\n\t  }\n\t});\n\t/**\n\t * A mutable `tf.Tensor`, useful for persisting state, e.g. for training.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t */\n\n\tvar Variable = /*#__PURE__*/function (_Tensor) {\n\t  _inheritsLoose(Variable, _Tensor);\n\n\t  function Variable(initialValue, trainable, name, tensorId) {\n\t    var _this3;\n\n\t    _this3 = _Tensor.call(this, initialValue.shape, initialValue.dtype, initialValue.dataId, tensorId) || this;\n\t    _this3.trainable = trainable;\n\t    _this3.name = name;\n\t    return _this3;\n\t  }\n\t  /**\n\t   * Assign a new `tf.Tensor` to this variable. The new `tf.Tensor` must have\n\t   * the same shape and dtype as the old `tf.Tensor`.\n\t   *\n\t   * @param newValue New tensor to be assigned to this variable.\n\t   *\n\t   * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t   */\n\n\n\t  var _proto3 = Variable.prototype;\n\n\t  _proto3.assign = function assign(newValue) {\n\t    if (newValue.dtype !== this.dtype) {\n\t      throw new Error(\"dtype of the new value (\" + newValue.dtype + \") and \" + (\"previous value (\" + this.dtype + \") must match\"));\n\t    }\n\n\t    if (!arraysEqual(newValue.shape, this.shape)) {\n\t      throw new Error(\"shape of the new value (\" + newValue.shape + \") and \" + (\"previous value (\" + this.shape + \") must match\"));\n\t    }\n\n\t    trackerFn().disposeTensor(this);\n\t    this.dataId = newValue.dataId;\n\t    trackerFn().incRef(this, null\n\t    /* backend */\n\t    );\n\t  };\n\n\t  _proto3.dispose = function dispose() {\n\t    trackerFn().disposeVariable(this);\n\t    this.isDisposedInternal = true;\n\t  };\n\n\t  return Variable;\n\t}(Tensor);\n\tObject.defineProperty(Variable, Symbol.hasInstance, {\n\t  value: function value(instance) {\n\t    return instance instanceof Tensor && instance.assign != null && instance.assign instanceof Function;\n\t  }\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\t(function (Rank) {\n\t  Rank[\"R0\"] = \"R0\";\n\t  Rank[\"R1\"] = \"R1\";\n\t  Rank[\"R2\"] = \"R2\";\n\t  Rank[\"R3\"] = \"R3\";\n\t  Rank[\"R4\"] = \"R4\";\n\t  Rank[\"R5\"] = \"R5\";\n\t  Rank[\"R6\"] = \"R6\";\n\t})(exports.Rank || (exports.Rank = {})); // Looks for upcasting types. Used, for example, in operations with mixed dtype\n\t// inputs.\n\n\n\tvar UpcastInt32AndMap;\n\n\t(function (UpcastInt32AndMap) {\n\t  UpcastInt32AndMap[\"float32\"] = \"float32\";\n\t  UpcastInt32AndMap[\"int32\"] = \"int32\";\n\t  UpcastInt32AndMap[\"bool\"] = \"int32\";\n\t  UpcastInt32AndMap[\"complex64\"] = \"complex64\";\n\t})(UpcastInt32AndMap || (UpcastInt32AndMap = {}));\n\n\tvar UpcastBoolAndMap;\n\n\t(function (UpcastBoolAndMap) {\n\t  UpcastBoolAndMap[\"float32\"] = \"float32\";\n\t  UpcastBoolAndMap[\"int32\"] = \"int32\";\n\t  UpcastBoolAndMap[\"bool\"] = \"bool\";\n\t  UpcastBoolAndMap[\"complex64\"] = \"complex64\";\n\t})(UpcastBoolAndMap || (UpcastBoolAndMap = {}));\n\n\tvar UpcastFloat32AndMap;\n\n\t(function (UpcastFloat32AndMap) {\n\t  UpcastFloat32AndMap[\"float32\"] = \"float32\";\n\t  UpcastFloat32AndMap[\"int32\"] = \"float32\";\n\t  UpcastFloat32AndMap[\"bool\"] = \"float32\";\n\t  UpcastFloat32AndMap[\"complex64\"] = \"complex64\";\n\t})(UpcastFloat32AndMap || (UpcastFloat32AndMap = {}));\n\n\tvar UpcastComplex64AndMap;\n\n\t(function (UpcastComplex64AndMap) {\n\t  UpcastComplex64AndMap[\"float32\"] = \"complex64\";\n\t  UpcastComplex64AndMap[\"int32\"] = \"complex64\";\n\t  UpcastComplex64AndMap[\"bool\"] = \"complex64\";\n\t  UpcastComplex64AndMap[\"complex64\"] = \"complex64\";\n\t})(UpcastComplex64AndMap || (UpcastComplex64AndMap = {}));\n\n\tvar upcastTypeMap = {\n\t  'float32': UpcastFloat32AndMap,\n\t  'int32': UpcastInt32AndMap,\n\t  'bool': UpcastBoolAndMap,\n\t  'complex64': UpcastComplex64AndMap\n\t};\n\tfunction upcastType(typeA, typeB) {\n\t  if (typeA === 'string' || typeB === 'string') {\n\t    if (typeA === 'string' && typeB === 'string') {\n\t      return 'string';\n\t    }\n\n\t    throw new Error(\"Can not upcast \" + typeA + \" with \" + typeB);\n\t  }\n\n\t  return upcastTypeMap[typeA][typeB];\n\t}\n\t/** Returns the output type after summation. */\n\n\tfunction sumOutType(type) {\n\t  return upcastType(type, 'int32');\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction makeTypesMatch(a, b) {\n\t  if (a.dtype === b.dtype) {\n\t    return [a, b];\n\t  }\n\n\t  var dtype = upcastType(a.dtype, b.dtype);\n\t  return [a.cast(dtype), b.cast(dtype)];\n\t}\n\tfunction assertTypesMatch(a, b) {\n\t  assert(a.dtype === b.dtype, function () {\n\t    return \"The dtypes of the first(\" + a.dtype + \") and\" + (\" second(\" + b.dtype + \") input must match\");\n\t  });\n\t}\n\tfunction isTensorInList(tensor, tensorList) {\n\t  return tensorList.some(function (x) {\n\t    return x.id === tensor.id;\n\t  });\n\t}\n\t/**\n\t * Extracts any `Tensor`s found within the provided object.\n\t *\n\t * @param container an object that may be a `Tensor` or may directly contain\n\t *   `Tensor`s, such as a `Tensor[]` or `{key: Tensor, ...}`. In general it\n\t *   is safe to pass any object here, except that `Promise`s are not\n\t *   supported.\n\t * @returns An array of `Tensors` found within the passed object. If the\n\t *   argument is simply a `Tensor', a list containing that `Tensor` is\n\t *   returned. If the object is not a `Tensor` or does not\n\t *   contain `Tensors`, an empty list is returned.\n\t */\n\n\tfunction getTensorsInContainer(result) {\n\t  var list = [];\n\t  var seen = new Set();\n\t  walkTensorContainer(result, list, seen);\n\t  return list;\n\t}\n\n\tfunction walkTensorContainer(container, list, seen) {\n\t  if (container == null) {\n\t    return;\n\t  }\n\n\t  if (container instanceof Tensor) {\n\t    list.push(container);\n\t    return;\n\t  }\n\n\t  if (!isIterable(container)) {\n\t    return;\n\t  } // Iteration over keys works also for arrays.\n\n\n\t  var iterable = container;\n\n\t  for (var k in iterable) {\n\t    var val = iterable[k];\n\n\t    if (!seen.has(val)) {\n\t      seen.add(val);\n\t      walkTensorContainer(val, list, seen);\n\t    }\n\t  }\n\t} // tslint:disable-next-line:no-any\n\n\n\tfunction isIterable(obj) {\n\t  return Array.isArray(obj) || typeof obj === 'object';\n\t}\n\n\tvar tensor_util = {\n\t\t__proto__: null,\n\t\tmakeTypesMatch: makeTypesMatch,\n\t\tassertTypesMatch: assertTypesMatch,\n\t\tisTensorInList: isTensorInList,\n\t\tgetTensorsInContainer: getTensorsInContainer\n\t};\n\n\tvar EngineState = /*#__PURE__*/function () {\n\t  function EngineState() {\n\t    // Public since optimizers will use it.\n\t    this.registeredVariables = {};\n\t    this.nextTapeNodeId = 0;\n\t    this.numBytes = 0;\n\t    this.numTensors = 0;\n\t    this.numStringTensors = 0;\n\t    this.numDataBuffers = 0; // Number of nested tf.grad() statements when computing higher-order\n\t    // gradients. E.g. `1` for first-order gradients and `2` for second-order\n\t    // gradients. Used to track if the tape should be removed after a backprop.\n\n\t    this.gradientDepth = 0; // Number of nested kernel calls. When kernel depth is greater than 1, we turn\n\t    // off the tape.\n\n\t    this.kernelDepth = 0;\n\t    this.scopeStack = [];\n\t    /**\n\t     * Keeps track of the number of data moves during a kernel execution. We\n\t     * maintain a stack since kernels can call other kernels, recursively.\n\t     */\n\n\t    this.numDataMovesStack = [];\n\t    this.nextScopeId = 0;\n\t    this.tensorInfo = new WeakMap();\n\t    this.profiling = false;\n\t    this.activeProfile = {\n\t      newBytes: 0,\n\t      newTensors: 0,\n\t      peakBytes: 0,\n\t      kernels: [],\n\t      result: null,\n\n\t      get kernelNames() {\n\t        return Array.from(new Set(this.kernels.map(function (k) {\n\t          return k.name;\n\t        })));\n\t      }\n\n\t    };\n\t  }\n\n\t  var _proto = EngineState.prototype;\n\n\t  _proto.dispose = function dispose() {\n\t    for (var variableName in this.registeredVariables) {\n\t      this.registeredVariables[variableName].dispose();\n\t    }\n\t  };\n\n\t  return EngineState;\n\t}();\n\n\tvar Engine = /*#__PURE__*/function () {\n\t  function Engine(ENV) {\n\t    this.ENV = ENV;\n\t    this.registry = {};\n\t    this.registryFactory = {};\n\t    this.pendingBackendInitId = 0;\n\t    this.state = new EngineState();\n\t  }\n\n\t  var _proto2 = Engine.prototype;\n\n\t  _proto2.ready = /*#__PURE__*/function () {\n\t    var _ready = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      var sortedBackends, i, backendName, success;\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              if (!(this.pendingBackendInit != null)) {\n\t                _context.next = 2;\n\t                break;\n\t              }\n\n\t              return _context.abrupt(\"return\", this.pendingBackendInit.then(function () {}));\n\n\t            case 2:\n\t              if (!(this.backendInstance != null)) {\n\t                _context.next = 4;\n\t                break;\n\t              }\n\n\t              return _context.abrupt(\"return\");\n\n\t            case 4:\n\t              sortedBackends = this.getSortedBackends();\n\t              i = 0;\n\n\t            case 6:\n\t              if (!(i < sortedBackends.length)) {\n\t                _context.next = 18;\n\t                break;\n\t              }\n\n\t              backendName = sortedBackends[i];\n\t              _context.next = 10;\n\t              return this.initializeBackend(backendName).success;\n\n\t            case 10:\n\t              success = _context.sent;\n\n\t              if (!success) {\n\t                _context.next = 15;\n\t                break;\n\t              }\n\n\t              _context.next = 14;\n\t              return this.setBackend(backendName);\n\n\t            case 14:\n\t              return _context.abrupt(\"return\");\n\n\t            case 15:\n\t              i++;\n\t              _context.next = 6;\n\t              break;\n\n\t            case 18:\n\t              throw new Error(\"Could not initialize any backends, all backend initializations \" + \"failed.\");\n\n\t            case 19:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function ready() {\n\t      return _ready.apply(this, arguments);\n\t    }\n\n\t    return ready;\n\t  }();\n\n\t  _proto2.backendNames = function backendNames() {\n\t    return Object.keys(this.registryFactory);\n\t  };\n\n\t  _proto2.findBackend = function findBackend(backendName) {\n\t    if (!(backendName in this.registry)) {\n\t      // If the backend hasn't been initialized but we have a registry entry for\n\t      // it, initialize it and return it.\n\t      if (backendName in this.registryFactory) {\n\t        var _this$initializeBacke = this.initializeBackend(backendName),\n\t            asyncInit = _this$initializeBacke.asyncInit;\n\n\t        if (asyncInit) {\n\t          // Backend is not ready yet.\n\t          return null;\n\t        }\n\t      } else {\n\t        return null;\n\t      }\n\t    }\n\n\t    return this.registry[backendName];\n\t  };\n\n\t  _proto2.findBackendFactory = function findBackendFactory(backendName) {\n\t    if (!(backendName in this.registryFactory)) {\n\t      return null;\n\t    }\n\n\t    return this.registryFactory[backendName].factory;\n\t  };\n\n\t  _proto2.registerBackend = function registerBackend(backendName, factory, priority) {\n\t    if (priority === void 0) {\n\t      priority = 1;\n\t    }\n\n\t    if (backendName in this.registryFactory) {\n\t      console.warn(backendName + \" backend was already registered. \" + \"Reusing existing backend factory.\");\n\t      return false;\n\t    }\n\n\t    this.registryFactory[backendName] = {\n\t      factory: factory,\n\t      priority: priority\n\t    };\n\t    return true;\n\t  };\n\n\t  _proto2.setBackend = /*#__PURE__*/function () {\n\t    var _setBackend = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(backendName) {\n\t      var _this$initializeBacke2, success, asyncInit, result;\n\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              if (!(this.registryFactory[backendName] == null)) {\n\t                _context2.next = 2;\n\t                break;\n\t              }\n\n\t              throw new Error(\"Backend name '\" + backendName + \"' not found in registry\");\n\n\t            case 2:\n\t              this.backendName = backendName;\n\n\t              if (!(this.registry[backendName] == null)) {\n\t                _context2.next = 16;\n\t                break;\n\t              }\n\n\t              this.backendInstance = null;\n\t              _this$initializeBacke2 = this.initializeBackend(backendName), success = _this$initializeBacke2.success, asyncInit = _this$initializeBacke2.asyncInit;\n\n\t              if (!asyncInit) {\n\t                _context2.next = 12;\n\t                break;\n\t              }\n\n\t              _context2.next = 9;\n\t              return success;\n\n\t            case 9:\n\t              _context2.t0 = _context2.sent;\n\t              _context2.next = 13;\n\t              break;\n\n\t            case 12:\n\t              _context2.t0 = success;\n\n\t            case 13:\n\t              result = _context2.t0;\n\n\t              if (result) {\n\t                _context2.next = 16;\n\t                break;\n\t              }\n\n\t              return _context2.abrupt(\"return\", false);\n\n\t            case 16:\n\t              this.backendInstance = this.registry[backendName];\n\t              this.setupRegisteredKernels(); // Reset the profiler.\n\n\t              this.profiler = new Profiler(this.backendInstance);\n\t              return _context2.abrupt(\"return\", true);\n\n\t            case 20:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function setBackend(_x) {\n\t      return _setBackend.apply(this, arguments);\n\t    }\n\n\t    return setBackend;\n\t  }();\n\n\t  _proto2.setupRegisteredKernels = function setupRegisteredKernels() {\n\t    var _this = this;\n\n\t    var kernels = getKernelsForBackend(this.backendName);\n\t    kernels.forEach(function (kernel) {\n\t      if (kernel.setupFunc != null) {\n\t        kernel.setupFunc(_this.backendInstance);\n\t      }\n\t    });\n\t  };\n\n\t  _proto2.disposeRegisteredKernels = function disposeRegisteredKernels(backendName) {\n\t    var _this2 = this;\n\n\t    var kernels = getKernelsForBackend(backendName);\n\t    kernels.forEach(function (kernel) {\n\t      if (kernel.disposeFunc != null) {\n\t        kernel.disposeFunc(_this2.registry[backendName]);\n\t      }\n\t    });\n\t  }\n\t  /**\n\t   * Initializes a backend by looking up the backend name in the factory\n\t   * registry and calling the factory method. Returns a boolean representing\n\t   * whether the initialization of the backend suceeded. Throws an error if\n\t   * there is no backend in the factory registry.\n\t   */\n\t  ;\n\n\t  _proto2.initializeBackend = function initializeBackend(backendName) {\n\t    var _this3 = this;\n\n\t    var registryFactoryEntry = this.registryFactory[backendName];\n\n\t    if (registryFactoryEntry == null) {\n\t      throw new Error(\"Cannot initialize backend \" + backendName + \", no registration found.\");\n\t    }\n\n\t    try {\n\t      var backend = registryFactoryEntry.factory();\n\t      /* Test if the factory returns a promise.\n\t      Done in a more liberal way than\n\t      previous 'Promise.resolve(backend)===backend'\n\t      as we needed to account for custom Promise\n\t      implementations (e.g. Angular) */\n\n\t      if (backend && !(backend instanceof KernelBackend) && typeof backend.then === 'function') {\n\t        var promiseId = ++this.pendingBackendInitId;\n\t        var success = backend.then(function (backendInstance) {\n\t          // Outdated promise. Another backend was set in the meantime.\n\t          if (promiseId < _this3.pendingBackendInitId) {\n\t            return false;\n\t          }\n\n\t          _this3.registry[backendName] = backendInstance;\n\t          _this3.pendingBackendInit = null;\n\t          return true;\n\t        }).catch(function (err) {\n\t          // Outdated promise. Another backend was set in the meantime.\n\t          if (promiseId < _this3.pendingBackendInitId) {\n\t            return false;\n\t          }\n\n\t          _this3.pendingBackendInit = null;\n\t          console.warn(\"Initialization of backend \" + backendName + \" failed\");\n\t          console.warn(err.stack || err.message);\n\t          return false;\n\t        });\n\t        this.pendingBackendInit = success;\n\t        return {\n\t          success: success,\n\t          asyncInit: true\n\t        };\n\t      } else {\n\t        this.registry[backendName] = backend;\n\t        return {\n\t          success: true,\n\t          asyncInit: false\n\t        };\n\t      }\n\t    } catch (err) {\n\t      console.warn(\"Initialization of backend \" + backendName + \" failed\");\n\t      console.warn(err.stack || err.message);\n\t      return {\n\t        success: false,\n\t        asyncInit: false\n\t      };\n\t    }\n\t  };\n\n\t  _proto2.removeBackend = function removeBackend(backendName) {\n\t    if (!(backendName in this.registryFactory)) {\n\t      throw new Error(backendName + \" backend not found in registry\");\n\t    }\n\n\t    if (this.backendName === backendName && this.pendingBackendInit != null) {\n\t      // There is a pending promise of the backend we want to remove. Make it\n\t      // obsolete.\n\t      this.pendingBackendInitId++;\n\t    }\n\n\t    if (backendName in this.registry) {\n\t      this.disposeRegisteredKernels(backendName);\n\t      this.registry[backendName].dispose();\n\t      delete this.registry[backendName];\n\t    }\n\n\t    delete this.registryFactory[backendName]; // Unset the backend if it is active.\n\n\t    if (this.backendName === backendName) {\n\t      this.pendingBackendInit = null;\n\t      this.backendName = null;\n\t      this.backendInstance = null;\n\t    }\n\t  };\n\n\t  _proto2.getSortedBackends = function getSortedBackends() {\n\t    var _this4 = this;\n\n\t    if (Object.keys(this.registryFactory).length === 0) {\n\t      throw new Error('No backend found in registry.');\n\t    }\n\n\t    return Object.keys(this.registryFactory).sort(function (a, b) {\n\t      // Highest priority comes first.\n\t      return _this4.registryFactory[b].priority - _this4.registryFactory[a].priority;\n\t    });\n\t  };\n\n\t  _proto2.initializeBackendsAndReturnBest = function initializeBackendsAndReturnBest() {\n\t    var sortedBackends = this.getSortedBackends();\n\n\t    for (var i = 0; i < sortedBackends.length; i++) {\n\t      var backendName = sortedBackends[i];\n\n\t      var _this$initializeBacke3 = this.initializeBackend(backendName),\n\t          success = _this$initializeBacke3.success,\n\t          asyncInit = _this$initializeBacke3.asyncInit;\n\n\t      if (asyncInit || success) {\n\t        return {\n\t          name: backendName,\n\t          asyncInit: asyncInit\n\t        };\n\t      }\n\t    }\n\n\t    throw new Error(\"Could not initialize any backends, all backend initializations \" + \"failed.\");\n\t  };\n\n\t  _proto2.moveData = function moveData(backend, dataId) {\n\t    var info = this.state.tensorInfo.get(dataId);\n\t    var srcBackend = info.backend;\n\t    var values = this.readSync(dataId); // Delete the tensor from the old backend and move it to the new\n\t    // backend.\n\n\t    srcBackend.disposeData(dataId);\n\t    info.backend = backend;\n\t    backend.move(dataId, values, info.shape, info.dtype);\n\n\t    if (this.shouldCheckForMemLeaks()) {\n\t      // Track the number of moves during a kernel execution to correctly\n\t      // detect memory leaks.\n\t      this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]++;\n\t    }\n\t  };\n\n\t  _proto2.tidy = function tidy(nameOrFn, fn) {\n\t    var _this5 = this;\n\n\t    var name = null;\n\n\t    if (fn == null) {\n\t      // Called with only 1 argument.\n\t      if (typeof nameOrFn !== 'function') {\n\t        throw new Error('Please provide a function to tidy()');\n\t      }\n\n\t      fn = nameOrFn;\n\t    } else {\n\t      // Called with 2 arguments.\n\t      if (typeof nameOrFn !== 'string' && !(nameOrFn instanceof String)) {\n\t        throw new Error('When calling with two arguments, the first argument ' + 'to tidy() must be a string');\n\t      }\n\n\t      if (typeof fn !== 'function') {\n\t        throw new Error('When calling with two arguments, the 2nd argument ' + 'to tidy() must be a function');\n\t      }\n\n\t      name = nameOrFn; // TODO(nsthorat,smilkov): Do operation logging and performance\n\t      // profiling.\n\t    }\n\n\t    var result;\n\t    return this.scopedRun(function () {\n\t      return _this5.startScope(name);\n\t    }, function () {\n\t      return _this5.endScope(result);\n\t    }, function () {\n\t      result = fn();\n\n\t      if (result instanceof Promise) {\n\t        console.error('Cannot return a Promise inside of tidy.');\n\t      }\n\n\t      return result;\n\t    });\n\t  };\n\n\t  _proto2.scopedRun = function scopedRun(start, end, f) {\n\t    start();\n\n\t    try {\n\t      var res = f();\n\t      end();\n\t      return res;\n\t    } catch (ex) {\n\t      end();\n\t      throw ex;\n\t    }\n\t  };\n\n\t  _proto2.nextTensorId = function nextTensorId() {\n\t    return Engine.nextTensorId++;\n\t  };\n\n\t  _proto2.nextVariableId = function nextVariableId() {\n\t    return Engine.nextVariableId++;\n\t  }\n\t  /**\n\t   * This method is called instead of the public-facing tensor.clone() when\n\t   * saving a tensor for backwards pass. It makes sure to add the clone\n\t   * operation to the tape regardless of being called inside a kernel\n\t   * execution.\n\t   *\n\t   * This method will go away once all kernels are modularized since we won't\n\t   * need to turn off the tape inside runKernel().\n\t   */\n\t  ;\n\n\t  _proto2.clone = function clone(x) {\n\t    var y = this.makeTensorFromDataId(x.dataId, x.shape, x.dtype);\n\t    var inputs = {\n\t      x: x\n\t    };\n\n\t    var grad = function grad(dy) {\n\t      return {\n\t        x: function x() {\n\t          var dtype = 'float32';\n\t          var gradInputs = {\n\t            x: dy\n\t          };\n\t          var attrs = {\n\t            dtype: dtype\n\t          };\n\t          return ENGINE.runKernelFunc(function (backend) {\n\t            return backend.cast(dy, dtype);\n\t          }, gradInputs, null\n\t          /* grad */\n\t          , Cast, attrs);\n\t        }\n\t      };\n\t    };\n\n\t    var saved = [];\n\t    this.addTapeNode(this.state.activeScope.name, inputs, [y], grad, saved, {});\n\t    return y;\n\t  }\n\t  /**\n\t   * Execute a kernel with the given name and return the output tensor.\n\t   *\n\t   * @param kernelName The name of the kernel to execute.\n\t   * @param inputs A map of input names to tensors.\n\t   * @param attrs A map of attribute names to their values. An attribute is a\n\t   *     primitive (non-tensor) input to the kernel.\n\t   * @param inputsToSave A list of tensors, inputs to save for the backprop\n\t   *     computation.\n\t   * @param outputsToSave A list of booleans, specifying which output to save\n\t   *     for the backprop computation. These are booleans since the output\n\t   * tensors are not visible to the user.\n\t   */\n\t  ;\n\n\t  _proto2.runKernel = function runKernel(kernelName, inputs, attrs, inputsToSave, outputsToSave) {\n\t    var forwardFunc = null;\n\t    var backwardsFunc = null; // Call runKernel as a stop-gap until we modularize all kernels.\n\t    // Once we modularize all kernels, we will remove the existing\n\t    // `runKernelFunc`.\n\n\t    return this.runKernelFunc(forwardFunc, inputs, backwardsFunc, kernelName, attrs, inputsToSave, outputsToSave);\n\t  };\n\n\t  _proto2.shouldCheckForMemLeaks = function shouldCheckForMemLeaks() {\n\t    return this.ENV.getBool('IS_TEST');\n\t  };\n\n\t  _proto2.checkKernelForMemLeak = function checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos) {\n\t    var numDataIdsAfter = this.backend.numDataIds(); // Count the number of data ids associated with the result of the kernel.\n\n\t    var numOutputDataIds = 0;\n\t    outInfos.forEach(function (info) {\n\t      // Complex numbers allocate 3 data ids, one for 'real', one for\n\t      // 'imaginary', and one for the container that holds the former two.\n\t      numOutputDataIds += info.dtype === 'complex64' ? 3 : 1;\n\t    }); // Account for the number of moves during kernel execution. A \"data move\"\n\t    // can happen in the middle of a kernel execution, placing a new (key,value)\n\t    // pair in the data storage. Since data moves have net zero effect (we\n\t    // always remove the data from the old backend), we have to cancel them out\n\t    // when detecting memory leaks.\n\n\t    var numMoves = this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1];\n\t    var dataIdsLeaked = numDataIdsAfter - numDataIdsBefore - numOutputDataIds - numMoves;\n\n\t    if (dataIdsLeaked > 0) {\n\t      throw new Error(\"Backend '\" + this.backendName + \"' has an internal memory leak \" + (\"(\" + dataIdsLeaked + \" data ids) after running '\" + kernelName + \"'\"));\n\t    }\n\t  }\n\t  /**\n\t   * @deprecated Use `runKernel` for newly added kernels. Keep using this method\n\t   *     only for kernels that are not yet fully modularized.\n\t   */\n\t  ;\n\n\t  _proto2.runKernelFunc = function runKernelFunc(forwardFunc, inputs, backwardsFunc, kernelName, attrs, inputsToSave, outputsToSave) {\n\t    var _this6 = this;\n\n\t    var outputs;\n\t    var saved = [];\n\t    var isTapeOn = this.isTapeOn();\n\n\t    if (kernelName == null) {\n\t      kernelName = this.state.activeScope != null ? this.state.activeScope.name : '';\n\t    }\n\n\t    var startingBytecount = this.state.numBytes;\n\t    var startingNumTensors = this.state.numTensors;\n\n\t    if (this.shouldCheckForMemLeaks()) {\n\t      this.state.numDataMovesStack.push(0);\n\t    }\n\n\t    var kernelFunc;\n\n\t    if (this.backendName == null) {\n\t      // backend has not been initialized yet (backend initialization is lazy\n\t      // can be deferred until an op/ kernel is run).\n\t      // The below getter has side effects that will try to initialize the\n\t      // backend and set properties like this.backendName\n\t      // tslint:disable-next-line: no-unused-expression\n\t      this.backend;\n\t    }\n\n\t    var kernel = getKernel(kernelName, this.backendName);\n\t    var out;\n\n\t    if (kernel != null) {\n\t      kernelFunc = function kernelFunc() {\n\t        var numDataIdsBefore = _this6.backend.numDataIds();\n\n\t        out = kernel.kernelFunc({\n\t          inputs: inputs,\n\t          attrs: attrs,\n\t          backend: _this6.backend\n\t        });\n\t        var outInfos = Array.isArray(out) ? out : [out];\n\n\t        if (_this6.shouldCheckForMemLeaks()) {\n\t          _this6.checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos);\n\t        }\n\n\t        var outTensors = outInfos.map(function (outInfo) {\n\t          // todo (yassogba) remove this option (Tensor) when node backend\n\t          // methods have been modularized and they all return tensorInfo.\n\t          // TensorInfos do not have a rank attribute.\n\t          if (outInfo.rank != null) {\n\t            return outInfo;\n\t          }\n\n\t          var dataId = outInfo.dataId,\n\t              shape = outInfo.shape,\n\t              dtype = outInfo.dtype;\n\t          return _this6.makeTensorFromDataId(dataId, shape, dtype);\n\t        }); // Save the inputs and outputs.\n\t        // Do not save unless we are recording to the tape. Otherwise it would\n\t        // cause a mem leak since we would never run backprop, which disposes\n\t        // the kept tensors.\n\n\t        if (isTapeOn) {\n\t          var tensorsToSave = _this6.getTensorsForGradient(kernelName, inputs, outTensors);\n\n\t          if (tensorsToSave == null) {\n\t            // Fallback for ops that call runKernelFunc and pass in\n\t            // inputsToSave and outputsToSave. Currently this is the set of ops\n\t            // with kernel support in the WASM backend. Once those ops and\n\t            // respective gradients are modularised we can remove this path.\n\t            if (outputsToSave == null) {\n\t              outputsToSave = [];\n\t            }\n\n\t            var outsToSave = outTensors.filter(function (_, i) {\n\t              return outputsToSave[i];\n\t            });\n\t            tensorsToSave = (inputsToSave || []).slice().concat(outsToSave);\n\t          }\n\n\t          saved = _this6.saveTensorsForBackwardMode(tensorsToSave);\n\t        }\n\n\t        return outTensors;\n\t      };\n\t    } else {\n\t      if (forwardFunc == null) {\n\t        throw new Error(\"Error running \" + kernelName + \": Neither modular kernel nor forward func passed\");\n\t      }\n\n\t      var saveFunc = function saveFunc(tensors) {\n\t        // Do not save unless we are recording to the tape. Otherwise it would\n\t        // cause a mem leak since we would never run backprop, which disposes\n\t        // the kept tensors.\n\t        if (!isTapeOn) {\n\t          return;\n\t        }\n\n\t        saved = tensors.map(function (tensor) {\n\t          return _this6.keep(_this6.clone(tensor));\n\t        });\n\t      };\n\n\t      kernelFunc = function kernelFunc() {\n\t        var numDataIdsBefore = _this6.backend.numDataIds();\n\n\t        out = _this6.tidy(function () {\n\t          return forwardFunc(_this6.backend, saveFunc);\n\t        });\n\t        var outs = Array.isArray(out) ? out : [out];\n\n\t        if (_this6.shouldCheckForMemLeaks()) {\n\t          _this6.checkKernelForMemLeak(kernelName, numDataIdsBefore, outs);\n\t        }\n\n\t        return outs;\n\t      };\n\t    } // Stop recording to a tape when running a kernel.\n\n\n\t    var kernelProfile;\n\t    this.scopedRun(function () {\n\t      return _this6.state.kernelDepth++;\n\t    }, function () {\n\t      return _this6.state.kernelDepth--;\n\t    }, function () {\n\t      if (!_this6.ENV.getBool('DEBUG') && !_this6.state.profiling) {\n\t        outputs = kernelFunc();\n\t      } else {\n\t        kernelProfile = _this6.profiler.profileKernel(kernelName, inputs, function () {\n\t          return kernelFunc();\n\t        });\n\n\t        if (_this6.ENV.getBool('DEBUG')) {\n\t          _this6.profiler.logKernelProfile(kernelProfile);\n\t        }\n\n\t        outputs = kernelProfile.outputs;\n\t      }\n\t    });\n\n\t    if (isTapeOn) {\n\t      this.addTapeNode(kernelName, inputs, outputs, backwardsFunc, saved, attrs);\n\t    }\n\n\t    if (this.state.profiling) {\n\t      this.state.activeProfile.kernels.push({\n\t        name: kernelName,\n\t        bytesAdded: this.state.numBytes - startingBytecount,\n\t        totalBytesSnapshot: this.state.numBytes,\n\t        tensorsAdded: this.state.numTensors - startingNumTensors,\n\t        totalTensorsSnapshot: this.state.numTensors,\n\t        inputShapes: Object.keys(inputs).map(function (key) {\n\t          return inputs[key] != null ? inputs[key].shape : null;\n\t        }),\n\t        outputShapes: outputs.map(function (item) {\n\t          return item.shape;\n\t        }),\n\t        kernelTimeMs: kernelProfile.timeMs,\n\t        extraInfo: kernelProfile.extraInfo\n\t      });\n\t    }\n\n\t    return Array.isArray(out) ? outputs : outputs[0];\n\t  }\n\t  /**\n\t   * Saves tensors used in forward mode for use in backward mode.\n\t   *\n\t   * @param tensors the list of tensors to save.\n\t   */\n\t  ;\n\n\t  _proto2.saveTensorsForBackwardMode = function saveTensorsForBackwardMode(tensors) {\n\t    var _this7 = this;\n\n\t    var saved = tensors.map(function (tensor) {\n\t      return _this7.keep(_this7.clone(tensor));\n\t    });\n\t    return saved;\n\t  }\n\t  /**\n\t   * Returns a list of tensors to save for a given gradient calculation.\n\t   *\n\t   * Returns undefined if their is no registered gradient for this kernel in the\n\t   * gradient registry.\n\t   *\n\t   * @param kernelName name of kernel to look up gradient for.\n\t   * @param inputs a map of input tensors.\n\t   * @param outputs an array of output tensors from forward mode of kernel.\n\t   */\n\t  ;\n\n\t  _proto2.getTensorsForGradient = function getTensorsForGradient(kernelName, inputs, outputs) {\n\t    var gradConfig = getGradient(kernelName);\n\n\t    if (gradConfig != null) {\n\t      var inputsToSave = gradConfig.inputsToSave || [];\n\t      var outputsToSave = gradConfig.outputsToSave || []; // If saveAllInputs is true, all inputs will be saved. Otherwise, inputs\n\t      // specified in inputsToSave will be saved.\n\n\t      var inputTensorsToSave;\n\n\t      if (gradConfig.saveAllInputs) {\n\t        assert(Array.isArray(inputs), function () {\n\t          return 'saveAllInputs is true, expected inputs to be an array.';\n\t        });\n\t        inputTensorsToSave = Object.keys(inputs).map(function (key) {\n\t          return inputs[key];\n\t        });\n\t      } else {\n\t        inputTensorsToSave = inputsToSave.map(function (inputName) {\n\t          return inputs[inputName];\n\t        });\n\t      }\n\n\t      var outputTensorsToSave = outputs.filter(function (_, i) {\n\t        return outputsToSave[i];\n\t      });\n\t      return inputTensorsToSave.concat(outputTensorsToSave);\n\t    } // TODO(yassogba) throw exception here once all runkernelFunc calls with\n\t    // inputsToSave/outputsToSave are removed\n\n\n\t    return null;\n\t  }\n\t  /**\n\t   * Internal method used by public APIs for tensor creation. Makes a new\n\t   * tensor with the provided shape, dtype and values. It always\n\t   * creates a new data id and writes the values to the underlying backend.\n\t   */\n\t  ;\n\n\t  _proto2.makeTensor = function makeTensor(values, shape, dtype, backend) {\n\t    if (values == null) {\n\t      throw new Error('Values passed to engine.makeTensor() are null');\n\t    }\n\n\t    dtype = dtype || 'float32';\n\t    backend = backend || this.backend;\n\t    var backendVals = values;\n\n\t    if (dtype === 'string' && isString(values[0])) {\n\t      backendVals = values.map(function (d) {\n\t        return encodeString(d);\n\t      });\n\t    }\n\n\t    var dataId = backend.write(backendVals, shape, dtype);\n\t    var t = new Tensor(shape, dtype, dataId, this.nextTensorId());\n\t    this.incRef(t, backend); // Count bytes for string tensors.\n\n\t    if (dtype === 'string') {\n\t      var info = this.state.tensorInfo.get(dataId);\n\t      var newBytes = bytesFromStringArray(backendVals);\n\t      this.state.numBytes += newBytes - info.bytes;\n\t      info.bytes = newBytes;\n\t    }\n\n\t    return t;\n\t  }\n\t  /**\n\t   * Internal method used by backends. Makes a new tensor\n\t   * that is a wrapper around an existing data id. It doesn't create\n\t   * a new data id, only increments the ref count used in memory tracking.\n\t   */\n\t  ;\n\n\t  _proto2.makeTensorFromDataId = function makeTensorFromDataId(dataId, shape, dtype, backend) {\n\t    dtype = dtype || 'float32';\n\t    var t = new Tensor(shape, dtype, dataId, this.nextTensorId());\n\t    this.incRef(t, backend);\n\t    return t;\n\t  };\n\n\t  _proto2.makeVariable = function makeVariable(initialValue, trainable, name, dtype) {\n\t    if (trainable === void 0) {\n\t      trainable = true;\n\t    }\n\n\t    name = name || this.nextVariableId().toString();\n\n\t    if (dtype != null && dtype !== initialValue.dtype) {\n\t      initialValue = initialValue.cast(dtype);\n\t    }\n\n\t    var v = new Variable(initialValue, trainable, name, this.nextTensorId());\n\n\t    if (this.state.registeredVariables[v.name] != null) {\n\t      throw new Error(\"Variable with name \" + v.name + \" was already registered\");\n\t    }\n\n\t    this.state.registeredVariables[v.name] = v;\n\t    this.incRef(v, this.backend);\n\t    return v;\n\t  };\n\n\t  _proto2.incRef = function incRef(a, backend) {\n\t    var refCount = this.state.tensorInfo.has(a.dataId) ? this.state.tensorInfo.get(a.dataId).refCount : 0;\n\t    this.state.numTensors++;\n\n\t    if (a.dtype === 'string') {\n\t      this.state.numStringTensors++;\n\t    }\n\n\t    if (refCount === 0) {\n\t      this.state.numDataBuffers++; // Bytes for complex numbers are counted by their components. Bytes for\n\t      // string tensors are counted when writing values.\n\n\t      var bytes = 0;\n\n\t      if (a.dtype !== 'complex64' && a.dtype !== 'string') {\n\t        bytes = a.size * bytesPerElement(a.dtype);\n\t      }\n\n\t      this.state.tensorInfo.set(a.dataId, {\n\t        backend: backend || this.backend,\n\t        dtype: a.dtype,\n\t        shape: a.shape,\n\t        bytes: bytes,\n\t        refCount: 0\n\t      });\n\t      this.state.numBytes += bytes;\n\t    }\n\n\t    this.state.tensorInfo.get(a.dataId).refCount++;\n\n\t    if (!(a instanceof Variable)) {\n\t      this.track(a);\n\t    }\n\t  };\n\n\t  _proto2.disposeTensor = function disposeTensor(a) {\n\t    if (!this.state.tensorInfo.has(a.dataId)) {\n\t      return;\n\t    }\n\n\t    this.state.numTensors--;\n\n\t    if (a.dtype === 'string') {\n\t      this.state.numStringTensors--;\n\t    }\n\n\t    var info = this.state.tensorInfo.get(a.dataId);\n\t    var refCount = info.refCount;\n\n\t    if (refCount <= 1) {\n\t      // Don't count bytes for complex numbers as they are counted by their\n\t      // components.\n\t      if (a.dtype !== 'complex64') {\n\t        this.state.numBytes -= info.bytes;\n\t      }\n\n\t      this.state.numDataBuffers--;\n\t      info.backend.disposeData(a.dataId);\n\t      this.state.tensorInfo.delete(a.dataId);\n\t    } else {\n\t      this.state.tensorInfo.get(a.dataId).refCount--;\n\t    } // TODO(nsthorat): Construct an error and save the stack trace for\n\t    // debugging when in debug mode. Creating a stack trace is too expensive\n\t    // to do unconditionally.\n\n\t  };\n\n\t  _proto2.disposeVariables = function disposeVariables() {\n\t    for (var varName in this.state.registeredVariables) {\n\t      var v = this.state.registeredVariables[varName];\n\t      this.disposeVariable(v);\n\t    }\n\t  };\n\n\t  _proto2.disposeVariable = function disposeVariable(v) {\n\t    this.disposeTensor(v);\n\n\t    if (this.state.registeredVariables[v.name] != null) {\n\t      delete this.state.registeredVariables[v.name];\n\t    }\n\t  };\n\n\t  _proto2.memory = function memory() {\n\t    var info = this.backend.memory();\n\t    info.numTensors = this.state.numTensors;\n\t    info.numDataBuffers = this.state.numDataBuffers;\n\t    info.numBytes = this.state.numBytes;\n\n\t    if (this.state.numStringTensors > 0) {\n\t      info.unreliable = true;\n\n\t      if (info.reasons == null) {\n\t        info.reasons = [];\n\t      }\n\n\t      info.reasons.push('Memory usage by string tensors is approximate ' + '(2 bytes per character)');\n\t    }\n\n\t    return info;\n\t  };\n\n\t  _proto2.profile = /*#__PURE__*/function () {\n\t    var _profile = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(query) {\n\t      var startBytes, startNumTensors, _iterator, _step, kernel;\n\n\t      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t        while (1) {\n\t          switch (_context3.prev = _context3.next) {\n\t            case 0:\n\t              this.state.profiling = true;\n\t              startBytes = this.state.numBytes;\n\t              startNumTensors = this.state.numTensors;\n\t              this.state.activeProfile.kernels = [];\n\t              _context3.next = 6;\n\t              return query();\n\n\t            case 6:\n\t              this.state.activeProfile.result = _context3.sent;\n\t              this.state.profiling = false;\n\t              this.state.activeProfile.peakBytes = Math.max.apply(Math, this.state.activeProfile.kernels.map(function (d) {\n\t                return d.totalBytesSnapshot;\n\t              }));\n\t              this.state.activeProfile.newBytes = this.state.numBytes - startBytes;\n\t              this.state.activeProfile.newTensors = this.state.numTensors - startNumTensors;\n\t              _iterator = _createForOfIteratorHelperLoose(this.state.activeProfile.kernels);\n\n\t            case 12:\n\t              if ((_step = _iterator()).done) {\n\t                _context3.next = 22;\n\t                break;\n\t              }\n\n\t              kernel = _step.value;\n\t              _context3.next = 16;\n\t              return kernel.kernelTimeMs;\n\n\t            case 16:\n\t              kernel.kernelTimeMs = _context3.sent;\n\t              _context3.next = 19;\n\t              return kernel.extraInfo;\n\n\t            case 19:\n\t              kernel.extraInfo = _context3.sent;\n\n\t            case 20:\n\t              _context3.next = 12;\n\t              break;\n\n\t            case 22:\n\t              return _context3.abrupt(\"return\", this.state.activeProfile);\n\n\t            case 23:\n\t            case \"end\":\n\t              return _context3.stop();\n\t          }\n\t        }\n\t      }, _callee3, this);\n\t    }));\n\n\t    function profile(_x2) {\n\t      return _profile.apply(this, arguments);\n\t    }\n\n\t    return profile;\n\t  }();\n\n\t  _proto2.isTapeOn = function isTapeOn() {\n\t    return this.state.gradientDepth > 0 && this.state.kernelDepth === 0;\n\t  };\n\n\t  _proto2.addTapeNode = function addTapeNode(kernelName, inputs, outputs, gradientsFunc, saved, attrs) {\n\t    var _this8 = this;\n\n\t    var tapeNode = {\n\t      id: this.state.nextTapeNodeId++,\n\t      kernelName: kernelName,\n\t      inputs: inputs,\n\t      outputs: outputs,\n\t      saved: saved\n\t    };\n\t    var gradConfig = getGradient(kernelName);\n\n\t    if (gradConfig != null) {\n\t      gradientsFunc = gradConfig.gradFunc;\n\t    }\n\n\t    if (gradientsFunc != null) {\n\t      tapeNode.gradient = function (dys) {\n\t        // TODO(smilkov): To optimize back-prop, pass dys that are not used in\n\t        // the backprop graph to the user as null instead of zeros\n\t        dys = dys.map(function (dy, i) {\n\t          if (dy == null) {\n\t            var output = outputs[i];\n\t            var vals = makeZerosTypedArray(output.size, output.dtype);\n\t            return _this8.makeTensor(vals, output.shape, output.dtype);\n\t          }\n\n\t          return dy;\n\t        }); // Grad functions of ops with single outputs expect a dy, while ops\n\t        // with multiple outputs expect dys (array of dy).\n\n\t        return gradientsFunc(dys.length > 1 ? dys : dys[0], saved, attrs);\n\t      };\n\t    }\n\n\t    this.state.activeTape.push(tapeNode);\n\t  };\n\n\t  _proto2.keep = function keep(result) {\n\t    result.kept = true;\n\t    return result;\n\t  };\n\n\t  _proto2.startTape = function startTape() {\n\t    if (this.state.gradientDepth === 0) {\n\t      this.state.activeTape = [];\n\t    }\n\n\t    this.state.gradientDepth++;\n\t  };\n\n\t  _proto2.endTape = function endTape() {\n\t    this.state.gradientDepth--;\n\t  }\n\t  /**\n\t   * Start a scope. Use this with endScope() to achieve the same functionality\n\t   * as scope() without the need for a function closure.\n\t   */\n\t  ;\n\n\t  _proto2.startScope = function startScope(name) {\n\t    var scopeInfo = {\n\t      track: [],\n\t      name: 'unnamed scope',\n\t      id: this.state.nextScopeId++\n\t    };\n\n\t    if (name) {\n\t      scopeInfo.name = name;\n\t    }\n\n\t    this.state.scopeStack.push(scopeInfo);\n\t    this.state.activeScope = scopeInfo;\n\t  }\n\t  /**\n\t   * End a scope. Use this with startScope() to achieve the same functionality\n\t   * as scope() without the need for a function closure.\n\t   */\n\t  ;\n\n\t  _proto2.endScope = function endScope(result) {\n\t    var _this9 = this;\n\n\t    var tensorsToTrackInParent = getTensorsInContainer(result);\n\t    var tensorsToTrackInParentSet = new Set(tensorsToTrackInParent.map(function (t) {\n\t      return t.id;\n\t    })); // Dispose the arrays tracked in this scope.\n\n\t    for (var i = 0; i < this.state.activeScope.track.length; i++) {\n\t      var tensor = this.state.activeScope.track[i];\n\n\t      if (!tensor.kept && !tensorsToTrackInParentSet.has(tensor.id)) {\n\t        tensor.dispose();\n\t      }\n\t    }\n\n\t    var oldScope = this.state.scopeStack.pop();\n\t    this.state.activeScope = this.state.scopeStack.length === 0 ? null : this.state.scopeStack[this.state.scopeStack.length - 1]; // Track the current result in the parent scope.\n\n\t    tensorsToTrackInParent.forEach(function (tensor) {\n\t      // Only track the tensor if was allocated in the inner scope and is not\n\t      // globally kept.\n\t      if (!tensor.kept && tensor.scopeId === oldScope.id) {\n\t        _this9.track(tensor);\n\t      }\n\t    });\n\t  }\n\t  /**\n\t   * Returns gradients of `f` with respect to each of the `xs`. The gradients\n\t   * returned are of the same length as `xs`, but some might be null if `f`\n\t   * was not a function of that `x`. It also takes optional dy to multiply the\n\t   * gradient, which defaults to `1`.\n\t   */\n\t  ;\n\n\t  _proto2.gradients = function gradients(f, xs, dy, allowNoGradients) {\n\t    var _this10 = this;\n\n\t    if (allowNoGradients === void 0) {\n\t      allowNoGradients = false;\n\t    }\n\n\t    assert(xs.length > 0, function () {\n\t      return 'gradients() received an empty list of xs.';\n\t    });\n\n\t    if (dy != null && dy.dtype !== 'float32') {\n\t      throw new Error(\"dy must have 'float32' dtype, but has '\" + dy.dtype + \"'\");\n\t    }\n\n\t    var y = this.scopedRun(function () {\n\t      return _this10.startTape();\n\t    }, function () {\n\t      return _this10.endTape();\n\t    }, function () {\n\t      return _this10.tidy('forward', f);\n\t    });\n\t    assert(y instanceof Tensor, function () {\n\t      return 'The result y returned by f() must be a tensor.';\n\t    }); // Filter out the nodes that don't connect x => y.\n\n\t    var filteredTape = getFilteredNodesXToY(this.state.activeTape, xs, y);\n\n\t    if (!allowNoGradients && filteredTape.length === 0 && xs.length > 0) {\n\t      throw new Error('Cannot compute gradient of y=f(x) with respect to x. Make sure ' + 'that the f you passed encloses all operations that lead from x ' + 'to y.');\n\t    }\n\n\t    return this.tidy('backward', function () {\n\t      var accumulatedGradientMap = {};\n\t      accumulatedGradientMap[y.id] = dy == null ? ones(y.shape) : dy; // Backprop gradients through the filtered nodes.\n\n\t      backpropagateGradients(accumulatedGradientMap, filteredTape, // Pass the tidy function to avoid circular dep with `tape.ts`.\n\t      function (f) {\n\t        return _this10.tidy(f);\n\t      }, // Pass an add function to avoide a circular dep with `tape.ts`.\n\t      add);\n\t      var grads = xs.map(function (x) {\n\t        return accumulatedGradientMap[x.id];\n\t      });\n\n\t      if (_this10.state.gradientDepth === 0) {\n\t        // This means that we are not computing higher-order gradients\n\t        // and can clean up the tape.\n\t        _this10.state.activeTape.forEach(function (node) {\n\t          for (var _iterator2 = _createForOfIteratorHelperLoose(node.saved), _step2; !(_step2 = _iterator2()).done;) {\n\t            var tensor = _step2.value;\n\t            tensor.dispose();\n\t          }\n\t        });\n\n\t        _this10.state.activeTape = null;\n\t      }\n\n\t      return {\n\t        value: y,\n\t        grads: grads\n\t      };\n\t    });\n\t  };\n\n\t  _proto2.customGrad = function customGrad(f) {\n\t    var _this11 = this;\n\n\t    assert(isFunction(f), function () {\n\t      return 'The f passed in customGrad(f) must be a function.';\n\t    });\n\t    return function () {\n\t      for (var _len = arguments.length, inputs = new Array(_len), _key = 0; _key < _len; _key++) {\n\t        inputs[_key] = arguments[_key];\n\t      }\n\n\t      assert(inputs.every(function (t) {\n\t        return t instanceof Tensor;\n\t      }), function () {\n\t        return 'The args passed in customGrad(f)(x1, x2,...) must all be ' + 'tensors';\n\t      });\n\t      var res;\n\t      var inputMap = {};\n\t      inputs.forEach(function (input, i) {\n\t        inputMap[i] = input;\n\t      });\n\t      return _this11.runKernelFunc(function (_, save) {\n\t        res = f.apply(void 0, [].concat(inputs, [save]));\n\t        assert(res.value instanceof Tensor, function () {\n\t          return 'The function f passed in customGrad(f) must return an ' + 'object where `obj.value` is a tensor';\n\t        });\n\t        assert(isFunction(res.gradFunc), function () {\n\t          return 'The function f passed in customGrad(f) must return an ' + 'object where `obj.gradFunc` is a function.';\n\t        });\n\t        return res.value;\n\t      }, inputMap, function (dy, saved) {\n\t        var gradRes = res.gradFunc(dy, saved);\n\t        var grads = Array.isArray(gradRes) ? gradRes : [gradRes];\n\t        assert(grads.length === inputs.length, function () {\n\t          return 'The function f passed in customGrad(f) must return an ' + 'object where `obj.gradFunc` is a function that returns ' + 'the same number of tensors as inputs passed to f(...).';\n\t        });\n\t        assert(grads.every(function (t) {\n\t          return t instanceof Tensor;\n\t        }), function () {\n\t          return 'The function f passed in customGrad(f) must return an ' + 'object where `obj.gradFunc` is a function that returns ' + 'a list of only tensors.';\n\t        });\n\t        var gradMap = {};\n\t        grads.forEach(function (grad, i) {\n\t          gradMap[i] = function () {\n\t            return grad;\n\t          };\n\t        });\n\t        return gradMap;\n\t      });\n\t    };\n\t  };\n\n\t  _proto2.readSync = function readSync(dataId) {\n\t    // Route the read to the correct backend.\n\t    var info = this.state.tensorInfo.get(dataId);\n\t    return info.backend.readSync(dataId);\n\t  };\n\n\t  _proto2.read = function read(dataId) {\n\t    // Route the read to the correct backend.\n\t    var info = this.state.tensorInfo.get(dataId);\n\t    return info.backend.read(dataId);\n\t  };\n\n\t  _proto2.time = /*#__PURE__*/function () {\n\t    var _time = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(query) {\n\t      var start, timingInfo;\n\t      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n\t        while (1) {\n\t          switch (_context4.prev = _context4.next) {\n\t            case 0:\n\t              start = now();\n\t              _context4.next = 3;\n\t              return this.backend.time(query);\n\n\t            case 3:\n\t              timingInfo = _context4.sent;\n\t              timingInfo.wallMs = now() - start;\n\t              return _context4.abrupt(\"return\", timingInfo);\n\n\t            case 6:\n\t            case \"end\":\n\t              return _context4.stop();\n\t          }\n\t        }\n\t      }, _callee4, this);\n\t    }));\n\n\t    function time(_x3) {\n\t      return _time.apply(this, arguments);\n\t    }\n\n\t    return time;\n\t  }()\n\t  /**\n\t   * Tracks a Tensor in the current scope to be automatically cleaned up\n\t   * when the current scope ends, and returns the value.\n\t   *\n\t   * @param result The Tensor to track in the current scope.\n\t   */\n\t  ;\n\n\t  _proto2.track = function track(result) {\n\t    if (this.state.activeScope != null) {\n\t      result.scopeId = this.state.activeScope.id;\n\t      this.state.activeScope.track.push(result);\n\t    }\n\n\t    return result;\n\t  };\n\n\t  /**\n\t   * Resets the engine state. Removes all backends but does not remove\n\t   * registered backend factories.\n\t   */\n\t  _proto2.reset = function reset() {\n\t    // Make any pending promise obsolete.\n\t    this.pendingBackendInitId++;\n\t    this.state.dispose();\n\t    this.ENV.reset();\n\t    this.state = new EngineState();\n\n\t    for (var backendName in this.registry) {\n\t      this.disposeRegisteredKernels(backendName);\n\t      this.registry[backendName].dispose();\n\t      delete this.registry[backendName];\n\t    }\n\n\t    this.backendName = null;\n\t    this.backendInstance = null;\n\t    this.pendingBackendInit = null;\n\t  };\n\n\t  _createClass(Engine, [{\n\t    key: \"backend\",\n\t    get: function get() {\n\t      if (this.pendingBackendInit != null) {\n\t        throw new Error(\"Backend '\" + this.backendName + \"' has not yet been initialized. Make \" + \"sure to await tf.ready() or await tf.setBackend() before calling \" + \"other methods\");\n\t      }\n\n\t      if (this.backendInstance == null) {\n\t        var _this$initializeBacke4 = this.initializeBackendsAndReturnBest(),\n\t            name = _this$initializeBacke4.name,\n\t            asyncInit = _this$initializeBacke4.asyncInit;\n\n\t        if (asyncInit) {\n\t          throw new Error(\"The highest priority backend '\" + name + \"' has not yet been \" + \"initialized. Make sure to await tf.ready() or \" + \"await tf.setBackend() before calling other methods\");\n\t        }\n\n\t        this.setBackend(name);\n\t      }\n\n\t      return this.backendInstance;\n\t    }\n\t  }, {\n\t    key: \"registeredVariables\",\n\t    get: function get() {\n\t      return this.state.registeredVariables;\n\t    }\n\t  }]);\n\n\t  return Engine;\n\t}();\n\tEngine.nextTensorId = 0;\n\tEngine.nextVariableId = 0;\n\n\tfunction ones(shape) {\n\t  var values = makeOnesTypedArray(sizeFromShape(shape), 'float32');\n\t  return ENGINE.makeTensor(values, shape, 'float32');\n\t}\n\n\tfunction getOrMakeEngine() {\n\t  var ns = getGlobalNamespace();\n\n\t  if (ns._tfengine == null) {\n\t    var environment = new Environment(ns);\n\t    ns._tfengine = new Engine(environment);\n\t  }\n\n\t  setEnvironmentGlobal(ns._tfengine.ENV); // Tell the current tensor interface that the global engine is responsible\n\t  // for tracking.\n\n\t  setTensorTracker(function () {\n\t    return ns._tfengine;\n\t  });\n\t  return ns._tfengine;\n\t}\n\tvar ENGINE = getOrMakeEngine();\n\t/**\n\t * A implementation of the add op for use within engine and tape.\n\t *\n\t * This allows us to avoid a circular dependency between add.ts and engine.\n\t * It is exported to be available in tape tests.\n\t */\n\n\tfunction add(a, b) {\n\t  // We duplicate Add here to avoid a circular dependency with add.ts.\n\t  var inputs = {\n\t    a: a,\n\t    b: b\n\t  };\n\t  return ENGINE.runKernel(Add, inputs);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t// tslint:disable-next-line:no-any\n\tfunction _isNavigatorDefined() {\n\t  return typeof navigator !== 'undefined' && navigator != null;\n\t}\n\n\tfunction isMobile() {\n\t  if (_isNavigatorDefined()) {\n\t    // tslint:disable-next-line:no-any\n\t    var a = navigator.userAgent || navigator.vendor || window.opera; // tslint:disable-next-line:max-line-length\n\n\t    return /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || // tslint:disable-next-line:max-line-length\n\t    /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0, 4));\n\t  }\n\n\t  return false;\n\t}\n\tfunction isBrowser() {\n\t  return typeof window !== 'undefined' && window.document != null || //@ts-ignore\n\t  typeof WorkerGlobalScope !== 'undefined';\n\t}\n\n\tvar device_util = {\n\t\t__proto__: null,\n\t\tisMobile: isMobile,\n\t\tisBrowser: isBrowser\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ENV = env();\n\t/**\n\t * This file contains environment-related flag registrations.\n\t */\n\n\t/** Whether to enable debug mode. */\n\n\tENV.registerFlag('DEBUG', function () {\n\t  return false;\n\t}, function (debugValue) {\n\t  if (debugValue) {\n\t    console.warn('Debugging mode is ON. The output of every math call will ' + 'be downloaded to CPU and checked for NaNs. ' + 'This significantly impacts performance.');\n\t  }\n\t});\n\t/** Whether we are in a browser (as versus, say, node.js) environment. */\n\n\tENV.registerFlag('IS_BROWSER', function () {\n\t  return isBrowser();\n\t});\n\t/** Whether we are in a browser (as versus, say, node.js) environment. */\n\n\tENV.registerFlag('IS_NODE', function () {\n\t  return typeof process !== 'undefined' && typeof process.versions !== 'undefined' && typeof process.versions.node !== 'undefined';\n\t});\n\t/** Whether this browser is Chrome. */\n\n\tENV.registerFlag('IS_CHROME', function () {\n\t  return typeof navigator !== 'undefined' && navigator != null && navigator.userAgent != null && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\t});\n\t/**\n\t * True when the environment is \"production\" where we disable safety checks\n\t * to gain performance.\n\t */\n\n\tENV.registerFlag('PROD', function () {\n\t  return false;\n\t});\n\t/**\n\t * Whether to do sanity checks when inferring a shape from user-provided\n\t * values, used when creating a new tensor.\n\t */\n\n\tENV.registerFlag('TENSORLIKE_CHECK_SHAPE_CONSISTENCY', function () {\n\t  return ENV.getBool('DEBUG');\n\t});\n\t/** Whether deprecation warnings are enabled. */\n\n\tENV.registerFlag('DEPRECATION_WARNINGS_ENABLED', function () {\n\t  return true;\n\t});\n\t/** True if running unit tests. */\n\n\tENV.registerFlag('IS_TEST', function () {\n\t  return false;\n\t});\n\t/** Whether to check computation result for errors. */\n\n\tENV.registerFlag('CHECK_COMPUTATION_FOR_ERRORS', function () {\n\t  return true;\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction inferShape(val, dtype) {\n\t  var firstElem = val;\n\n\t  if (isTypedArray$1(val)) {\n\t    return dtype === 'string' ? [] : [val.length];\n\t  }\n\n\t  if (!Array.isArray(val)) {\n\t    return []; // Scalar.\n\t  }\n\n\t  var shape = [];\n\n\t  while (Array.isArray(firstElem) || isTypedArray$1(firstElem) && dtype !== 'string') {\n\t    shape.push(firstElem.length);\n\t    firstElem = firstElem[0];\n\t  }\n\n\t  if (Array.isArray(val) && env().getBool('TENSORLIKE_CHECK_SHAPE_CONSISTENCY')) {\n\t    deepAssertShapeConsistency(val, shape, []);\n\t  }\n\n\t  return shape;\n\t}\n\n\tfunction deepAssertShapeConsistency(val, shape, indices) {\n\t  indices = indices || [];\n\n\t  if (!Array.isArray(val) && !isTypedArray$1(val)) {\n\t    assert(shape.length === 0, function () {\n\t      return \"Element arr[\" + indices.join('][') + \"] is a primitive, \" + (\"but should be an array/TypedArray of \" + shape[0] + \" elements\");\n\t    });\n\t    return;\n\t  }\n\n\t  assert(shape.length > 0, function () {\n\t    return \"Element arr[\" + indices.join('][') + \"] should be a primitive, \" + (\"but is an array of \" + val.length + \" elements\");\n\t  });\n\t  assert(val.length === shape[0], function () {\n\t    return \"Element arr[\" + indices.join('][') + \"] should have \" + shape[0] + \" \" + (\"elements, but has \" + val.length + \" elements\");\n\t  });\n\t  var subShape = shape.slice(1);\n\n\t  for (var i = 0; i < val.length; ++i) {\n\t    deepAssertShapeConsistency(val[i], subShape, indices.concat(i));\n\t  }\n\t}\n\n\tfunction assertDtype(expectedDtype, actualDType, argName, functionName) {\n\t  if (expectedDtype === 'string_or_numeric') {\n\t    return;\n\t  }\n\n\t  if (expectedDtype == null) {\n\t    throw new Error(\"Expected dtype cannot be null.\");\n\t  }\n\n\t  if (expectedDtype !== 'numeric' && expectedDtype !== actualDType || expectedDtype === 'numeric' && actualDType === 'string') {\n\t    throw new Error(\"Argument '\" + argName + \"' passed to '\" + functionName + \"' must \" + (\"be \" + expectedDtype + \" tensor, but got \" + actualDType + \" tensor\"));\n\t  }\n\t}\n\n\tfunction convertToTensor(x, argName, functionName, parseAsDtype) {\n\t  if (parseAsDtype === void 0) {\n\t    parseAsDtype = 'numeric';\n\t  }\n\n\t  if (x instanceof Tensor) {\n\t    assertDtype(parseAsDtype, x.dtype, argName, functionName);\n\t    return x;\n\t  }\n\n\t  var inferredDtype = inferDtype(x); // If the user expects a bool/int/float, use that info to update the\n\t  // inferredDtype when it is not a string.\n\n\t  if (inferredDtype !== 'string' && ['bool', 'int32', 'float32'].indexOf(parseAsDtype) >= 0) {\n\t    inferredDtype = parseAsDtype;\n\t  }\n\n\t  assertDtype(parseAsDtype, inferredDtype, argName, functionName);\n\n\t  if (x == null || !isTypedArray$1(x) && !Array.isArray(x) && typeof x !== 'number' && typeof x !== 'boolean' && typeof x !== 'string') {\n\t    var type = x == null ? 'null' : x.constructor.name;\n\t    throw new Error(\"Argument '\" + argName + \"' passed to '\" + functionName + \"' must be a \" + (\"Tensor or TensorLike, but got '\" + type + \"'\"));\n\t  }\n\n\t  var inferredShape = inferShape(x, inferredDtype);\n\n\t  if (!isTypedArray$1(x) && !Array.isArray(x)) {\n\t    x = [x];\n\t  }\n\n\t  var skipTypedArray = true;\n\t  var values = inferredDtype !== 'string' ? toTypedArray(x, inferredDtype) : flatten(x, [], skipTypedArray);\n\t  return ENGINE.makeTensor(values, inferredShape, inferredDtype);\n\t}\n\tfunction convertToTensorArray(arg, argName, functionName, parseAsDtype) {\n\t  if (parseAsDtype === void 0) {\n\t    parseAsDtype = 'numeric';\n\t  }\n\n\t  if (!Array.isArray(arg)) {\n\t    throw new Error(\"Argument \" + argName + \" passed to \" + functionName + \" must be a \" + '`Tensor[]` or `TensorLike[]`');\n\t  }\n\n\t  var tensors = arg;\n\t  return tensors.map(function (t, i) {\n\t    return convertToTensor(t, argName + \"[\" + i + \"]\", functionName, parseAsDtype);\n\t  });\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar OP_SCOPE_SUFFIX = '__op';\n\t/**\n\t * Used for wrapping functions that perform math operations on\n\t * Tensors. The function will be wrapped in a named scope that cleans all\n\t * memory usage after the function is done.\n\t */\n\n\tfunction op(f) {\n\t  var keys = Object.keys(f);\n\n\t  if (keys.length !== 1) {\n\t    throw new Error(\"Please provide an object with a single key \" + \"(operation name) mapping to a function. Got an object with \" + (keys.length + \" keys.\"));\n\t  }\n\n\t  var opName = keys[0];\n\t  var fn = f[opName]; // Strip the underscore from the end of the function name.\n\n\t  if (opName.endsWith('_')) {\n\t    opName = opName.substring(0, opName.length - 1);\n\t  } // add an __op suffix to distinguish ops from kernels in tf.profile\n\n\n\t  opName = opName + OP_SCOPE_SUFFIX; // tslint:disable-next-line:no-any\n\n\t  var f2 = function f2() {\n\t    ENGINE.startScope(opName);\n\n\t    try {\n\t      var result = fn.apply(void 0, arguments);\n\n\t      if (isPromise(result)) {\n\t        console.error('Cannot return a Promise inside of tidy.');\n\t      }\n\n\t      ENGINE.endScope(result);\n\t      return result;\n\t    } catch (ex) {\n\t      ENGINE.endScope(null);\n\t      throw ex;\n\t    }\n\t  };\n\n\t  Object.defineProperty(f2, 'name', {\n\t    value: opName,\n\t    configurable: true\n\t  }); // tslint:disable-next-line:no-any\n\n\t  return f2;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Converts two real numbers to a complex number.\n\t *\n\t * Given a tensor `real` representing the real part of a complex number, and a\n\t * tensor `imag` representing the imaginary part of a complex number, this\n\t * operation returns complex numbers elementwise of the form [r0, i0, r1, i1],\n\t * where r represents the real part and i represents the imag part.\n\t *\n\t * The input tensors real and imag must have the same shape.\n\t *\n\t * ```js\n\t * const real = tf.tensor1d([2.25, 3.25]);\n\t * const imag = tf.tensor1d([4.75, 5.75]);\n\t * const complex = tf.complex(real, imag);\n\t *\n\t * complex.print();\n\t * ```\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction complex_(real, imag) {\n\t  var $real = convertToTensor(real, 'real', 'complex');\n\t  var $imag = convertToTensor(imag, 'imag', 'complex');\n\t  assertShapesMatch($real.shape, $imag.shape, \"real and imag shapes, \" + $real.shape + \" and \" + $imag.shape + \", \" + \"must match in call to tf.complex().\");\n\t  var inputs = {\n\t    real: $real,\n\t    imag: $imag\n\t  };\n\t  return ENGINE.runKernel(Complex, inputs);\n\t}\n\n\tvar complex = op({\n\t  complex_: complex_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/** This is shared code across all tensor creation methods. */\n\n\tfunction makeTensor(values, shape, inferredShape, dtype) {\n\t  if (dtype == null) {\n\t    dtype = inferDtype(values);\n\t  }\n\n\t  if (dtype === 'complex64') {\n\t    throw new Error(\"Cannot construct a complex64 tensor directly. \" + \"Please use tf.complex(real, imag).\");\n\t  }\n\n\t  if (!isTypedArray$1(values) && !Array.isArray(values) && typeof values !== 'number' && typeof values !== 'boolean' && typeof values !== 'string') {\n\t    throw new Error('values passed to tensor(values) must be a number/boolean/string or ' + 'an array of numbers/booleans/strings, or a TypedArray');\n\t  }\n\n\t  if (shape != null) {\n\t    assertNonNegativeIntegerDimensions(shape);\n\t    var providedSize = sizeFromShape(shape);\n\t    var inferredSize = sizeFromShape(inferredShape);\n\t    assert(providedSize === inferredSize, function () {\n\t      return \"Based on the provided shape, [\" + shape + \"], the tensor should have \" + (providedSize + \" values but has \" + inferredSize);\n\t    });\n\n\t    for (var i = 0; i < inferredShape.length; ++i) {\n\t      var inferred = inferredShape[i];\n\t      var flatDimsDontMatch = i === inferredShape.length - 1 ? inferred !== sizeFromShape(shape.slice(i)) : true;\n\t      assert(inferredShape[i] === shape[i] || !flatDimsDontMatch, function () {\n\t        return \"Error creating a new Tensor. Inferred shape \" + (\"(\" + inferredShape + \") does not match the provided \") + (\"shape (\" + shape + \"). \");\n\t      });\n\t    }\n\t  }\n\n\t  if (!isTypedArray$1(values) && !Array.isArray(values)) {\n\t    values = [values];\n\t  }\n\n\t  shape = shape || inferredShape;\n\t  values = dtype !== 'string' ? toTypedArray(values, dtype) : flatten(values, [], true);\n\t  return ENGINE.makeTensor(values, shape, dtype);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates a `tf.Tensor` with the provided values, shape and dtype.\n\t *\n\t * ```js\n\t * // Pass an array of values to create a vector.\n\t * tf.tensor([1, 2, 3, 4]).print();\n\t * ```\n\t *\n\t * ```js\n\t * // Pass a nested array of values to make a matrix or a higher\n\t * // dimensional tensor.\n\t * tf.tensor([[1, 2], [3, 4]]).print();\n\t * ```\n\t *\n\t * ```js\n\t * // Pass a flat array and specify a shape yourself.\n\t * tf.tensor([1, 2, 3, 4], [2, 2]).print();\n\t * ```\n\t *\n\t * @param values The values of the tensor. Can be nested array of numbers,\n\t *     or a flat array, or a `TypedArray`. If the values are strings,\n\t *     they will be encoded as utf-8 and kept as `Uint8Array[]`.\n\t * @param shape The shape of the tensor. Optional. If not provided,\n\t *   it is inferred from `values`.\n\t * @param dtype The data type.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction tensor(values, shape, dtype) {\n\t  var inferredShape = inferShape(values, dtype);\n\t  return makeTensor(values, shape, inferredShape, dtype);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\t/* Type definitions for exporting and importing of models. */\n\n\t/**\n\t * A map from Tensor dtype to number of bytes per element of the Tensor.\n\t */\n\tvar DTYPE_VALUE_SIZE_MAP = {\n\t  'float32': 4,\n\t  'float16': 2,\n\t  'int32': 4,\n\t  'uint16': 2,\n\t  'uint8': 1,\n\t  'bool': 1,\n\t  'complex64': 8\n\t};\n\n\t/** Number of bytes reserved for the length of the string. (32bit integer). */\n\n\tvar NUM_BYTES_STRING_LENGTH = 4;\n\t/**\n\t * Encode a map from names to weight values as an ArrayBuffer, along with an\n\t * `Array` of `WeightsManifestEntry` as specification of the encoded weights.\n\t *\n\t * This function does not perform sharding.\n\t *\n\t * This function is the reverse of `decodeWeights`.\n\t *\n\t * @param tensors A map (\"dict\") from names to tensors.\n\t * @param group Group to which the weights belong (optional).\n\t * @returns A `Promise` of\n\t *   - A flat `ArrayBuffer` with all the binary values of the `Tensor`s\n\t *     concatenated.\n\t *   - An `Array` of `WeightManifestEntry`s, carrying information including\n\t *     tensor names, `dtype`s and shapes.\n\t * @throws Error: on unsupported tensor `dtype`.\n\t */\n\n\tfunction encodeWeights(_x, _x2) {\n\t  return _encodeWeights.apply(this, arguments);\n\t}\n\t/**\n\t * Decode flat ArrayBuffer as weights.\n\t *\n\t * This function does not handle sharding.\n\t *\n\t * This function is the reverse of `encodeWeights`.\n\t *\n\t * @param buffer A flat ArrayBuffer carrying the binary values of the tensors\n\t *   concatenated in the order specified in `specs`.\n\t * @param specs Specifications of the names, dtypes and shapes of the tensors\n\t *   whose value are encoded by `buffer`.\n\t * @return A map from tensor name to tensor value, with the names corresponding\n\t *   to names in `specs`.\n\t * @throws Error, if any of the tensors has unsupported dtype.\n\t */\n\n\tfunction _encodeWeights() {\n\t  _encodeWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(tensors, group) {\n\t    var specs, dataPromises, names, _loop, i, tensorValues;\n\n\t    return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t      while (1) {\n\t        switch (_context2.prev = _context2.next) {\n\t          case 0:\n\t            // TODO(adarob, cais): Support quantization.\n\t            specs = [];\n\t            dataPromises = [];\n\t            names = Array.isArray(tensors) ? tensors.map(function (tensor) {\n\t              return tensor.name;\n\t            }) : Object.keys(tensors);\n\n\t            _loop = function _loop(i) {\n\t              var name = names[i];\n\t              var t = Array.isArray(tensors) ? tensors[i].tensor : tensors[name];\n\n\t              if (t.dtype !== 'float32' && t.dtype !== 'int32' && t.dtype !== 'bool' && t.dtype !== 'string' && t.dtype !== 'complex64') {\n\t                throw new Error(\"Unsupported dtype in weight '\" + name + \"': \" + t.dtype);\n\t              }\n\n\t              var spec = {\n\t                name: name,\n\t                shape: t.shape,\n\t                dtype: t.dtype\n\t              };\n\n\t              if (t.dtype === 'string') {\n\t                var utf8bytes = new Promise( /*#__PURE__*/function () {\n\t                  var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(resolve) {\n\t                    var vals, totalNumBytes, bytes, offset, _i6, val, bytesOfLength;\n\n\t                    return regeneratorRuntime.wrap(function _callee$(_context) {\n\t                      while (1) {\n\t                        switch (_context.prev = _context.next) {\n\t                          case 0:\n\t                            _context.next = 2;\n\t                            return t.bytes();\n\n\t                          case 2:\n\t                            vals = _context.sent;\n\t                            totalNumBytes = vals.reduce(function (p, c) {\n\t                              return p + c.length;\n\t                            }, 0) + NUM_BYTES_STRING_LENGTH * vals.length;\n\t                            bytes = new Uint8Array(totalNumBytes);\n\t                            offset = 0;\n\n\t                            for (_i6 = 0; _i6 < vals.length; _i6++) {\n\t                              val = vals[_i6];\n\t                              bytesOfLength = new Uint8Array(new Uint32Array([val.length]).buffer);\n\t                              bytes.set(bytesOfLength, offset);\n\t                              offset += NUM_BYTES_STRING_LENGTH;\n\t                              bytes.set(val, offset);\n\t                              offset += val.length;\n\t                            }\n\n\t                            resolve(bytes);\n\n\t                          case 8:\n\t                          case \"end\":\n\t                            return _context.stop();\n\t                        }\n\t                      }\n\t                    }, _callee);\n\t                  }));\n\n\t                  return function (_x3) {\n\t                    return _ref.apply(this, arguments);\n\t                  };\n\t                }());\n\t                dataPromises.push(utf8bytes);\n\t              } else {\n\t                dataPromises.push(t.data());\n\t              }\n\n\t              if (group != null) {\n\t                spec.group = group;\n\t              }\n\n\t              specs.push(spec);\n\t            };\n\n\t            for (i = 0; i < names.length; ++i) {\n\t              _loop(i);\n\t            }\n\n\t            _context2.next = 7;\n\t            return Promise.all(dataPromises);\n\n\t          case 7:\n\t            tensorValues = _context2.sent;\n\t            return _context2.abrupt(\"return\", {\n\t              data: concatenateTypedArrays(tensorValues),\n\t              specs: specs\n\t            });\n\n\t          case 9:\n\t          case \"end\":\n\t            return _context2.stop();\n\t        }\n\t      }\n\t    }, _callee2);\n\t  }));\n\t  return _encodeWeights.apply(this, arguments);\n\t}\n\n\tfunction decodeWeights(buffer, specs) {\n\t  // TODO(adarob, cais): Support quantization.\n\t  var out = {};\n\t  var float16Decode;\n\t  var offset = 0;\n\n\t  for (var _iterator = _createForOfIteratorHelperLoose(specs), _step; !(_step = _iterator()).done;) {\n\t    var spec = _step.value;\n\t    var name = spec.name;\n\t    var dtype = spec.dtype;\n\t    var shape = spec.shape;\n\t    var size = sizeFromShape(shape);\n\t    var values = void 0;\n\n\t    if ('quantization' in spec) {\n\t      var quantization = spec.quantization;\n\n\t      if (quantization.dtype === 'uint8' || quantization.dtype === 'uint16') {\n\t        if (!('min' in quantization && 'scale' in quantization)) {\n\t          throw new Error(\"Weight \" + spec.name + \" with quantization \" + quantization.dtype + \" \" + \"doesn't have corresponding metadata min and scale.\");\n\t        }\n\t      } else if (quantization.dtype === 'float16') {\n\t        if (dtype !== 'float32') {\n\t          throw new Error(\"Weight \" + spec.name + \" is quantized with \" + quantization.dtype + \" \" + (\"which only supports weights of type float32 not \" + dtype + \".\"));\n\t        }\n\t      } else {\n\t        throw new Error(\"Weight \" + spec.name + \" has unknown \" + (\"quantization dtype \" + quantization.dtype + \". \") + \"Supported quantization dtypes are: \" + \"'uint8', 'uint16', and 'float16'.\");\n\t      }\n\n\t      var quantizationSizeFactor = DTYPE_VALUE_SIZE_MAP[quantization.dtype];\n\t      var byteBuffer = buffer.slice(offset, offset + size * quantizationSizeFactor);\n\t      var quantizedArray = quantization.dtype === 'uint8' ? new Uint8Array(byteBuffer) : new Uint16Array(byteBuffer);\n\n\t      if (dtype === 'float32') {\n\t        if (quantization.dtype === 'uint8' || quantization.dtype === 'uint16') {\n\t          values = new Float32Array(quantizedArray.length);\n\n\t          for (var i = 0; i < quantizedArray.length; i++) {\n\t            var v = quantizedArray[i];\n\t            values[i] = v * quantization.scale + quantization.min;\n\t          }\n\t        } else if (quantization.dtype === 'float16') {\n\t          if (float16Decode === undefined) {\n\t            float16Decode = getFloat16Decoder();\n\t          }\n\n\t          values = float16Decode(quantizedArray);\n\t        } else {\n\t          throw new Error(\"Unsupported quantization type \" + quantization.dtype + \" \" + \"for weight type float32.\");\n\t        }\n\t      } else if (dtype === 'int32') {\n\t        if (quantization.dtype !== 'uint8' && quantization.dtype !== 'uint16') {\n\t          throw new Error(\"Unsupported quantization type \" + quantization.dtype + \" \" + \"for weight type int32.\");\n\t        }\n\n\t        values = new Int32Array(quantizedArray.length);\n\n\t        for (var _i = 0; _i < quantizedArray.length; _i++) {\n\t          var _v = quantizedArray[_i];\n\t          values[_i] = Math.round(_v * quantization.scale + quantization.min);\n\t        }\n\t      } else {\n\t        throw new Error(\"Unsupported dtype in weight '\" + name + \"': \" + dtype);\n\t      }\n\n\t      offset += size * quantizationSizeFactor;\n\t    } else if (dtype === 'string') {\n\t      var _size = sizeFromShape(spec.shape);\n\n\t      values = [];\n\n\t      for (var _i2 = 0; _i2 < _size; _i2++) {\n\t        var byteLength = new Uint32Array(buffer.slice(offset, offset + NUM_BYTES_STRING_LENGTH))[0];\n\t        offset += NUM_BYTES_STRING_LENGTH;\n\t        var bytes = new Uint8Array(buffer.slice(offset, offset + byteLength));\n\t        values.push(bytes);\n\t        offset += byteLength;\n\t      }\n\t    } else {\n\t      var dtypeFactor = DTYPE_VALUE_SIZE_MAP[dtype];\n\n\t      var _byteBuffer = buffer.slice(offset, offset + size * dtypeFactor);\n\n\t      if (dtype === 'float32') {\n\t        values = new Float32Array(_byteBuffer);\n\t      } else if (dtype === 'int32') {\n\t        values = new Int32Array(_byteBuffer);\n\t      } else if (dtype === 'bool') {\n\t        values = new Uint8Array(_byteBuffer);\n\t      } else if (dtype === 'complex64') {\n\t        values = new Float32Array(_byteBuffer);\n\t        var real = new Float32Array(values.length / 2);\n\t        var image = new Float32Array(values.length / 2);\n\n\t        for (var _i3 = 0; _i3 < real.length; _i3++) {\n\t          real[_i3] = values[_i3 * 2];\n\t          image[_i3] = values[_i3 * 2 + 1];\n\t        }\n\n\t        var realTensor = tensor(real, shape, 'float32');\n\t        var imageTensor = tensor(image, shape, 'float32');\n\t        out[name] = complex(realTensor, imageTensor);\n\t        realTensor.dispose();\n\t        imageTensor.dispose();\n\t      } else {\n\t        throw new Error(\"Unsupported dtype in weight '\" + name + \"': \" + dtype);\n\t      }\n\n\t      offset += size * dtypeFactor;\n\t    }\n\n\t    if (dtype !== 'complex64') {\n\t      out[name] = tensor(values, shape, dtype);\n\t    }\n\t  }\n\n\t  return out;\n\t}\n\t/**\n\t * Concatenate TypedArrays into an ArrayBuffer.\n\t */\n\n\tfunction concatenateTypedArrays(xs) {\n\t  // TODO(adarob, cais): Support quantization.\n\t  if (xs === null) {\n\t    throw new Error(\"Invalid input value: \" + JSON.stringify(xs));\n\t  }\n\n\t  var totalByteLength = 0; // `normalizedXs` is here for this reason: a `TypedArray`'s `buffer'\n\t  // can have a different byte length from that of the `TypedArray` itself,\n\t  // for example, when the `TypedArray` is created from an offset in an\n\t  // `ArrayBuffer`. `normliazedXs` holds `TypedArray`s whose `buffer`s match\n\t  // the `TypedArray` in byte length. If an element of `xs` does not show\n\t  // this property, a new `TypedArray` that satisfy this property will be\n\t  // constructed and pushed into `normalizedXs`.\n\n\t  var normalizedXs = [];\n\t  xs.forEach(function (x) {\n\t    totalByteLength += x.byteLength; // tslint:disable:no-any\n\n\t    normalizedXs.push(x.byteLength === x.buffer.byteLength ? x : new x.constructor(x));\n\n\t    if (!(x instanceof Float32Array || x instanceof Int32Array || x instanceof Uint8Array)) {\n\t      throw new Error(\"Unsupported TypedArray subtype: \" + x.constructor.name);\n\t    } // tslint:enable:no-any\n\n\t  });\n\t  var y = new Uint8Array(totalByteLength);\n\t  var offset = 0;\n\t  normalizedXs.forEach(function (x) {\n\t    y.set(new Uint8Array(x.buffer), offset);\n\t    offset += x.byteLength;\n\t  });\n\t  return y.buffer;\n\t} // Use Buffer on Node.js instead of Blob/atob/btoa\n\n\tvar useNodeBuffer = typeof Buffer !== 'undefined' && (typeof Blob === 'undefined' || typeof atob === 'undefined' || typeof btoa === 'undefined');\n\t/**\n\t * Calculate the byte length of a JavaScript string.\n\t *\n\t * Note that a JavaScript string can contain wide characters, therefore the\n\t * length of the string is not necessarily equal to the byte length.\n\t *\n\t * @param str Input string.\n\t * @returns Byte length.\n\t */\n\n\tfunction stringByteLength(str) {\n\t  if (useNodeBuffer) {\n\t    return Buffer.byteLength(str);\n\t  }\n\n\t  return new Blob([str]).size;\n\t}\n\t/**\n\t * Encode an ArrayBuffer as a base64 encoded string.\n\t *\n\t * @param buffer `ArrayBuffer` to be converted.\n\t * @returns A string that base64-encodes `buffer`.\n\t */\n\n\tfunction arrayBufferToBase64String(buffer) {\n\t  if (useNodeBuffer) {\n\t    return Buffer.from(buffer).toString('base64');\n\t  }\n\n\t  var buf = new Uint8Array(buffer);\n\t  var s = '';\n\n\t  for (var i = 0, l = buf.length; i < l; i++) {\n\t    s += String.fromCharCode(buf[i]);\n\t  }\n\n\t  return btoa(s);\n\t}\n\t/**\n\t * Decode a base64 string as an ArrayBuffer.\n\t *\n\t * @param str Base64 string.\n\t * @returns Decoded `ArrayBuffer`.\n\t */\n\n\tfunction base64StringToArrayBuffer(str) {\n\t  if (useNodeBuffer) {\n\t    var buf = Buffer.from(str, 'base64');\n\t    return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n\t  }\n\n\t  var s = atob(str);\n\t  var buffer = new Uint8Array(s.length);\n\n\t  for (var i = 0; i < s.length; ++i) {\n\t    buffer.set([s.charCodeAt(i)], i);\n\t  }\n\n\t  return buffer.buffer;\n\t}\n\t/**\n\t * Concatenate a number of ArrayBuffers into one.\n\t *\n\t * @param buffers A number of array buffers to concatenate.\n\t * @returns Result of concatenating `buffers` in order.\n\t */\n\n\tfunction concatenateArrayBuffers(buffers) {\n\t  if (buffers.length === 1) {\n\t    return buffers[0];\n\t  }\n\n\t  var totalByteLength = 0;\n\t  buffers.forEach(function (buffer) {\n\t    totalByteLength += buffer.byteLength;\n\t  });\n\t  var temp = new Uint8Array(totalByteLength);\n\t  var offset = 0;\n\t  buffers.forEach(function (buffer) {\n\t    temp.set(new Uint8Array(buffer), offset);\n\t    offset += buffer.byteLength;\n\t  });\n\t  return temp.buffer;\n\t}\n\t/**\n\t * Get the basename of a path.\n\t *\n\t * Behaves in a way analogous to Linux's basename command.\n\t *\n\t * @param path\n\t */\n\n\tfunction basename(path) {\n\t  var SEPARATOR = '/';\n\t  path = path.trim();\n\n\t  while (path.endsWith(SEPARATOR)) {\n\t    path = path.slice(0, path.length - 1);\n\t  }\n\n\t  var items = path.split(SEPARATOR);\n\t  return items[items.length - 1];\n\t}\n\t/**\n\t * Populate ModelArtifactsInfo fields for a model with JSON topology.\n\t * @param modelArtifacts\n\t * @returns A ModelArtifactsInfo object.\n\t */\n\n\tfunction getModelArtifactsInfoForJSON(modelArtifacts) {\n\t  if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n\t    throw new Error('Expected JSON model topology, received ArrayBuffer.');\n\t  }\n\n\t  return {\n\t    dateSaved: new Date(),\n\t    modelTopologyType: 'JSON',\n\t    modelTopologyBytes: modelArtifacts.modelTopology == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.modelTopology)),\n\t    weightSpecsBytes: modelArtifacts.weightSpecs == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.weightSpecs)),\n\t    weightDataBytes: modelArtifacts.weightData == null ? 0 : modelArtifacts.weightData.byteLength\n\t  };\n\t}\n\t/**\n\t * Computes mantisa table for casting Float16 to Float32\n\t * See http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\t *\n\t * @returns Uint32Array, 2048 mantissa lookup values.\n\t */\n\n\tfunction computeFloat16MantisaTable() {\n\t  var convertMantissa = function convertMantissa(i) {\n\t    var m = i << 13;\n\t    var e = 0;\n\n\t    while ((m & 0x00800000) === 0) {\n\t      e -= 0x00800000;\n\t      m <<= 1;\n\t    }\n\n\t    m &= ~0x00800000;\n\t    e += 0x38800000;\n\t    return m | e;\n\t  };\n\n\t  var mantisaTable = new Uint32Array(2048);\n\t  mantisaTable[0] = 0;\n\n\t  for (var i = 1; i < 1024; i++) {\n\t    mantisaTable[i] = convertMantissa(i);\n\t  }\n\n\t  for (var _i4 = 1024; _i4 < 2048; _i4++) {\n\t    mantisaTable[_i4] = 0x38000000 + (_i4 - 1024 << 13);\n\t  }\n\n\t  return mantisaTable;\n\t}\n\t/**\n\t * Computes exponent table for casting Float16 to Float32\n\t * See http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\t *\n\t * @returns Uint32Array, 64 exponent lookup values.\n\t */\n\n\n\tfunction computeFloat16ExponentTable() {\n\t  var exponentTable = new Uint32Array(64);\n\t  exponentTable[0] = 0;\n\t  exponentTable[31] = 0x47800000;\n\t  exponentTable[32] = 0x80000000;\n\t  exponentTable[63] = 0xc7800000;\n\n\t  for (var i = 1; i < 31; i++) {\n\t    exponentTable[i] = i << 23;\n\t  }\n\n\t  for (var _i5 = 33; _i5 < 63; _i5++) {\n\t    exponentTable[_i5] = 0x80000000 + (_i5 - 32 << 23);\n\t  }\n\n\t  return exponentTable;\n\t}\n\t/**\n\t * Computes offset table for casting Float16 to Float32\n\t * See http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\t *\n\t * @returns Uint32Array, 6d offset values.\n\t */\n\n\n\tfunction computeFloat16OffsetTable() {\n\t  var offsetTable = new Uint32Array(64);\n\n\t  for (var i = 0; i < 64; i++) {\n\t    offsetTable[i] = 1024;\n\t  }\n\n\t  offsetTable[0] = offsetTable[32] = 0;\n\t  return offsetTable;\n\t}\n\t/**\n\t * Retrieve a Float16 decoder which will decode a ByteArray of Float16 values\n\t * to a Float32Array.\n\t *\n\t * @returns Function (buffer: Uint16Array) => Float32Array which decodes\n\t *          the Uint16Array of Float16 bytes to a Float32Array.\n\t */\n\n\n\tfunction getFloat16Decoder() {\n\t  // Algorithm is based off of\n\t  // http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\t  // Cache lookup tables\n\t  var mantisaTable = computeFloat16MantisaTable();\n\t  var exponentTable = computeFloat16ExponentTable();\n\t  var offsetTable = computeFloat16OffsetTable();\n\t  return function (quantizedArray) {\n\t    var buffer = new ArrayBuffer(4 * quantizedArray.length);\n\t    var bufferUint32View = new Uint32Array(buffer);\n\n\t    for (var index = 0; index < quantizedArray.length; index++) {\n\t      var float16Bits = quantizedArray[index];\n\t      var float32Bits = mantisaTable[offsetTable[float16Bits >> 10] + (float16Bits & 0x3ff)] + exponentTable[float16Bits >> 10];\n\t      bufferUint32View[index] = float32Bits;\n\t    }\n\n\t    return new Float32Array(buffer);\n\t  };\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar IORouterRegistry = /*#__PURE__*/function () {\n\t  function IORouterRegistry() {\n\t    this.saveRouters = [];\n\t    this.loadRouters = [];\n\t  }\n\n\t  IORouterRegistry.getInstance = function getInstance() {\n\t    if (IORouterRegistry.instance == null) {\n\t      IORouterRegistry.instance = new IORouterRegistry();\n\t    }\n\n\t    return IORouterRegistry.instance;\n\t  }\n\t  /**\n\t   * Register a save-handler router.\n\t   *\n\t   * @param saveRouter A function that maps a URL-like string onto an instance\n\t   * of `IOHandler` with the `save` method defined or `null`.\n\t   */\n\t  ;\n\n\t  IORouterRegistry.registerSaveRouter = function registerSaveRouter(saveRouter) {\n\t    IORouterRegistry.getInstance().saveRouters.push(saveRouter);\n\t  }\n\t  /**\n\t   * Register a load-handler router.\n\t   *\n\t   * @param loadRouter A function that maps a URL-like string onto an instance\n\t   * of `IOHandler` with the `load` method defined or `null`.\n\t   */\n\t  ;\n\n\t  IORouterRegistry.registerLoadRouter = function registerLoadRouter(loadRouter) {\n\t    IORouterRegistry.getInstance().loadRouters.push(loadRouter);\n\t  }\n\t  /**\n\t   * Look up IOHandler for saving, given a URL-like string.\n\t   *\n\t   * @param url\n\t   * @returns If only one match is found, an instance of IOHandler with the\n\t   * `save` method defined. If no match is found, `null`.\n\t   * @throws Error, if more than one match is found.\n\t   */\n\t  ;\n\n\t  IORouterRegistry.getSaveHandlers = function getSaveHandlers(url) {\n\t    return IORouterRegistry.getHandlers(url, 'save');\n\t  }\n\t  /**\n\t   * Look up IOHandler for loading, given a URL-like string.\n\t   *\n\t   * @param url\n\t   * @param loadOptions Optional, custom load options.\n\t   * @returns All valid handlers for `url`, given the currently registered\n\t   *   handler routers.\n\t   */\n\t  ;\n\n\t  IORouterRegistry.getLoadHandlers = function getLoadHandlers(url, loadOptions) {\n\t    return IORouterRegistry.getHandlers(url, 'load', loadOptions);\n\t  };\n\n\t  IORouterRegistry.getHandlers = function getHandlers(url, handlerType, loadOptions) {\n\t    var validHandlers = [];\n\t    var routers = handlerType === 'load' ? IORouterRegistry.getInstance().loadRouters : IORouterRegistry.getInstance().saveRouters;\n\t    routers.forEach(function (router) {\n\t      var handler = router(url, loadOptions);\n\n\t      if (handler !== null) {\n\t        validHandlers.push(handler);\n\t      }\n\t    });\n\t    return validHandlers;\n\t  };\n\n\t  return IORouterRegistry;\n\t}();\n\tvar registerSaveRouter = function registerSaveRouter(loudRouter) {\n\t  return IORouterRegistry.registerSaveRouter(loudRouter);\n\t};\n\tvar registerLoadRouter = function registerLoadRouter(loudRouter) {\n\t  return IORouterRegistry.registerLoadRouter(loudRouter);\n\t};\n\tvar getSaveHandlers = function getSaveHandlers(url) {\n\t  return IORouterRegistry.getSaveHandlers(url);\n\t};\n\tvar getLoadHandlers = function getLoadHandlers(url, loadOptions) {\n\t  return IORouterRegistry.getLoadHandlers(url, loadOptions);\n\t};\n\n\tvar DATABASE_NAME = 'tensorflowjs';\n\tvar DATABASE_VERSION = 1; // Model data and ModelArtifactsInfo (metadata) are stored in two separate\n\t// stores for efficient access of the list of stored models and their metadata.\n\t// 1. The object store for model data: topology, weights and weight manifests.\n\n\tvar MODEL_STORE_NAME = 'models_store'; // 2. The object store for ModelArtifactsInfo, including meta-information such\n\t//    as the type of topology (JSON vs binary), byte size of the topology, byte\n\t//    size of the weights, etc.\n\n\tvar INFO_STORE_NAME = 'model_info_store';\n\t/**\n\t * Delete the entire database for tensorflow.js, including the models store.\n\t */\n\n\tfunction deleteDatabase() {\n\t  return _deleteDatabase.apply(this, arguments);\n\t}\n\n\tfunction _deleteDatabase() {\n\t  _deleteDatabase = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {\n\t    var idbFactory;\n\t    return regeneratorRuntime.wrap(function _callee5$(_context5) {\n\t      while (1) {\n\t        switch (_context5.prev = _context5.next) {\n\t          case 0:\n\t            idbFactory = getIndexedDBFactory();\n\t            return _context5.abrupt(\"return\", new Promise(function (resolve, reject) {\n\t              var deleteRequest = idbFactory.deleteDatabase(DATABASE_NAME);\n\n\t              deleteRequest.onsuccess = function () {\n\t                return resolve();\n\t              };\n\n\t              deleteRequest.onerror = function (error) {\n\t                return reject(error);\n\t              };\n\t            }));\n\n\t          case 2:\n\t          case \"end\":\n\t            return _context5.stop();\n\t        }\n\t      }\n\t    }, _callee5);\n\t  }));\n\t  return _deleteDatabase.apply(this, arguments);\n\t}\n\n\tfunction getIndexedDBFactory() {\n\t  if (!env().getBool('IS_BROWSER')) {\n\t    // TODO(cais): Add more info about what IOHandler subtypes are available.\n\t    //   Maybe point to a doc page on the web and/or automatically determine\n\t    //   the available IOHandlers and print them in the error message.\n\t    throw new Error('Failed to obtain IndexedDB factory because the current environment' + 'is not a web browser.');\n\t  } // tslint:disable-next-line:no-any\n\n\n\t  var theWindow = typeof window === 'undefined' ? self : window;\n\t  var factory = theWindow.indexedDB || theWindow.mozIndexedDB || theWindow.webkitIndexedDB || theWindow.msIndexedDB || theWindow.shimIndexedDB;\n\n\t  if (factory == null) {\n\t    throw new Error('The current browser does not appear to support IndexedDB.');\n\t  }\n\n\t  return factory;\n\t}\n\n\tfunction setUpDatabase(openRequest) {\n\t  var db = openRequest.result;\n\t  db.createObjectStore(MODEL_STORE_NAME, {\n\t    keyPath: 'modelPath'\n\t  });\n\t  db.createObjectStore(INFO_STORE_NAME, {\n\t    keyPath: 'modelPath'\n\t  });\n\t}\n\t/**\n\t * IOHandler subclass: Browser IndexedDB.\n\t *\n\t * See the doc string of `browserIndexedDB` for more details.\n\t */\n\n\n\tvar BrowserIndexedDB = /*#__PURE__*/function () {\n\t  function BrowserIndexedDB(modelPath) {\n\t    this.indexedDB = getIndexedDBFactory();\n\n\t    if (modelPath == null || !modelPath) {\n\t      throw new Error('For IndexedDB, modelPath must not be null, undefined or empty.');\n\t    }\n\n\t    this.modelPath = modelPath;\n\t  }\n\n\t  var _proto = BrowserIndexedDB.prototype;\n\n\t  _proto.save = /*#__PURE__*/function () {\n\t    var _save = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(modelArtifacts) {\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              if (!(modelArtifacts.modelTopology instanceof ArrayBuffer)) {\n\t                _context.next = 2;\n\t                break;\n\t              }\n\n\t              throw new Error('BrowserLocalStorage.save() does not support saving model topology ' + 'in binary formats yet.');\n\n\t            case 2:\n\t              return _context.abrupt(\"return\", this.databaseAction(this.modelPath, modelArtifacts));\n\n\t            case 3:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function save(_x) {\n\t      return _save.apply(this, arguments);\n\t    }\n\n\t    return save;\n\t  }();\n\n\t  _proto.load = /*#__PURE__*/function () {\n\t    var _load = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              return _context2.abrupt(\"return\", this.databaseAction(this.modelPath));\n\n\t            case 1:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function load() {\n\t      return _load.apply(this, arguments);\n\t    }\n\n\t    return load;\n\t  }()\n\t  /**\n\t   * Perform database action to put model artifacts into or read model artifacts\n\t   * from IndexedDB object store.\n\t   *\n\t   * Whether the action is put or get depends on whether `modelArtifacts` is\n\t   * specified. If it is specified, the action will be put; otherwise the action\n\t   * will be get.\n\t   *\n\t   * @param modelPath A unique string path for the model.\n\t   * @param modelArtifacts If specified, it will be the model artifacts to be\n\t   *   stored in IndexedDB.\n\t   * @returns A `Promise` of `SaveResult`, if the action is put, or a `Promise`\n\t   *   of `ModelArtifacts`, if the action is get.\n\t   */\n\t  ;\n\n\t  _proto.databaseAction = function databaseAction(modelPath, modelArtifacts) {\n\t    var _this = this;\n\n\t    return new Promise(function (resolve, reject) {\n\t      var openRequest = _this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION);\n\n\t      openRequest.onupgradeneeded = function () {\n\t        return setUpDatabase(openRequest);\n\t      };\n\n\t      openRequest.onsuccess = function () {\n\t        var db = openRequest.result;\n\n\t        if (modelArtifacts == null) {\n\t          // Read model out from object store.\n\t          var modelTx = db.transaction(MODEL_STORE_NAME, 'readonly');\n\t          var modelStore = modelTx.objectStore(MODEL_STORE_NAME);\n\t          var getRequest = modelStore.get(_this.modelPath);\n\n\t          getRequest.onsuccess = function () {\n\t            if (getRequest.result == null) {\n\t              db.close();\n\t              return reject(new Error(\"Cannot find model with path '\" + _this.modelPath + \"' \" + \"in IndexedDB.\"));\n\t            } else {\n\t              resolve(getRequest.result.modelArtifacts);\n\t            }\n\t          };\n\n\t          getRequest.onerror = function (error) {\n\t            db.close();\n\t            return reject(getRequest.error);\n\t          };\n\n\t          modelTx.oncomplete = function () {\n\t            return db.close();\n\t          };\n\t        } else {\n\t          // Put model into object store.\n\t          var modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); // First, put ModelArtifactsInfo into info store.\n\n\t          var infoTx = db.transaction(INFO_STORE_NAME, 'readwrite');\n\t          var infoStore = infoTx.objectStore(INFO_STORE_NAME);\n\t          var putInfoRequest = infoStore.put({\n\t            modelPath: _this.modelPath,\n\t            modelArtifactsInfo: modelArtifactsInfo\n\t          });\n\n\t          var _modelTx;\n\n\t          putInfoRequest.onsuccess = function () {\n\t            // Second, put model data into model store.\n\t            _modelTx = db.transaction(MODEL_STORE_NAME, 'readwrite');\n\n\t            var modelStore = _modelTx.objectStore(MODEL_STORE_NAME);\n\n\t            var putModelRequest = modelStore.put({\n\t              modelPath: _this.modelPath,\n\t              modelArtifacts: modelArtifacts,\n\t              modelArtifactsInfo: modelArtifactsInfo\n\t            });\n\n\t            putModelRequest.onsuccess = function () {\n\t              return resolve({\n\t                modelArtifactsInfo: modelArtifactsInfo\n\t              });\n\t            };\n\n\t            putModelRequest.onerror = function (error) {\n\t              // If the put-model request fails, roll back the info entry as\n\t              // well.\n\t              infoStore = infoTx.objectStore(INFO_STORE_NAME);\n\t              var deleteInfoRequest = infoStore.delete(_this.modelPath);\n\n\t              deleteInfoRequest.onsuccess = function () {\n\t                db.close();\n\t                return reject(putModelRequest.error);\n\t              };\n\n\t              deleteInfoRequest.onerror = function (error) {\n\t                db.close();\n\t                return reject(putModelRequest.error);\n\t              };\n\t            };\n\t          };\n\n\t          putInfoRequest.onerror = function (error) {\n\t            db.close();\n\t            return reject(putInfoRequest.error);\n\t          };\n\n\t          infoTx.oncomplete = function () {\n\t            if (_modelTx == null) {\n\t              db.close();\n\t            } else {\n\t              _modelTx.oncomplete = function () {\n\t                return db.close();\n\t              };\n\t            }\n\t          };\n\t        }\n\t      };\n\n\t      openRequest.onerror = function (error) {\n\t        return reject(openRequest.error);\n\t      };\n\t    });\n\t  };\n\n\t  return BrowserIndexedDB;\n\t}();\n\tBrowserIndexedDB.URL_SCHEME = 'indexeddb://';\n\tvar indexedDBRouter = function indexedDBRouter(url) {\n\t  if (!env().getBool('IS_BROWSER')) {\n\t    return null;\n\t  } else {\n\t    if (!Array.isArray(url) && url.startsWith(BrowserIndexedDB.URL_SCHEME)) {\n\t      return browserIndexedDB(url.slice(BrowserIndexedDB.URL_SCHEME.length));\n\t    } else {\n\t      return null;\n\t    }\n\t  }\n\t};\n\tIORouterRegistry.registerSaveRouter(indexedDBRouter);\n\tIORouterRegistry.registerLoadRouter(indexedDBRouter);\n\t/**\n\t * Creates a browser IndexedDB IOHandler for saving and loading models.\n\t *\n\t * ```js\n\t * const model = tf.sequential();\n\t * model.add(\n\t *     tf.layers.dense({units: 1, inputShape: [100], activation: 'sigmoid'}));\n\t *\n\t * const saveResult = await model.save('indexeddb://MyModel'));\n\t * console.log(saveResult);\n\t * ```\n\t *\n\t * @param modelPath A unique identifier for the model to be saved. Must be a\n\t *   non-empty string.\n\t * @returns An instance of `BrowserIndexedDB` (sublcass of `IOHandler`),\n\t *   which can be used with, e.g., `tf.Model.save`.\n\t */\n\n\tfunction browserIndexedDB(modelPath) {\n\t  return new BrowserIndexedDB(modelPath);\n\t}\n\n\tfunction maybeStripScheme(key) {\n\t  return key.startsWith(BrowserIndexedDB.URL_SCHEME) ? key.slice(BrowserIndexedDB.URL_SCHEME.length) : key;\n\t}\n\n\tvar BrowserIndexedDBManager = /*#__PURE__*/function () {\n\t  function BrowserIndexedDBManager() {\n\t    this.indexedDB = getIndexedDBFactory();\n\t  }\n\n\t  var _proto2 = BrowserIndexedDBManager.prototype;\n\n\t  _proto2.listModels = /*#__PURE__*/function () {\n\t    var _listModels = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n\t      var _this2 = this;\n\n\t      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t        while (1) {\n\t          switch (_context3.prev = _context3.next) {\n\t            case 0:\n\t              return _context3.abrupt(\"return\", new Promise(function (resolve, reject) {\n\t                var openRequest = _this2.indexedDB.open(DATABASE_NAME, DATABASE_VERSION);\n\n\t                openRequest.onupgradeneeded = function () {\n\t                  return setUpDatabase(openRequest);\n\t                };\n\n\t                openRequest.onsuccess = function () {\n\t                  var db = openRequest.result;\n\t                  var tx = db.transaction(INFO_STORE_NAME, 'readonly');\n\t                  var store = tx.objectStore(INFO_STORE_NAME); // tslint:disable:max-line-length\n\t                  // Need to cast `store` as `any` here because TypeScript's DOM\n\t                  // library does not have the `getAll()` method even though the\n\t                  // method is supported in the latest version of most mainstream\n\t                  // browsers:\n\t                  // https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/getAll\n\t                  // tslint:enable:max-line-length\n\t                  // tslint:disable-next-line:no-any\n\n\t                  var getAllInfoRequest = store.getAll();\n\n\t                  getAllInfoRequest.onsuccess = function () {\n\t                    var out = {};\n\n\t                    for (var _iterator = _createForOfIteratorHelperLoose(getAllInfoRequest.result), _step; !(_step = _iterator()).done;) {\n\t                      var item = _step.value;\n\t                      out[item.modelPath] = item.modelArtifactsInfo;\n\t                    }\n\n\t                    resolve(out);\n\t                  };\n\n\t                  getAllInfoRequest.onerror = function (error) {\n\t                    db.close();\n\t                    return reject(getAllInfoRequest.error);\n\t                  };\n\n\t                  tx.oncomplete = function () {\n\t                    return db.close();\n\t                  };\n\t                };\n\n\t                openRequest.onerror = function (error) {\n\t                  return reject(openRequest.error);\n\t                };\n\t              }));\n\n\t            case 1:\n\t            case \"end\":\n\t              return _context3.stop();\n\t          }\n\t        }\n\t      }, _callee3);\n\t    }));\n\n\t    function listModels() {\n\t      return _listModels.apply(this, arguments);\n\t    }\n\n\t    return listModels;\n\t  }();\n\n\t  _proto2.removeModel = /*#__PURE__*/function () {\n\t    var _removeModel = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(path) {\n\t      var _this3 = this;\n\n\t      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n\t        while (1) {\n\t          switch (_context4.prev = _context4.next) {\n\t            case 0:\n\t              path = maybeStripScheme(path);\n\t              return _context4.abrupt(\"return\", new Promise(function (resolve, reject) {\n\t                var openRequest = _this3.indexedDB.open(DATABASE_NAME, DATABASE_VERSION);\n\n\t                openRequest.onupgradeneeded = function () {\n\t                  return setUpDatabase(openRequest);\n\t                };\n\n\t                openRequest.onsuccess = function () {\n\t                  var db = openRequest.result;\n\t                  var infoTx = db.transaction(INFO_STORE_NAME, 'readwrite');\n\t                  var infoStore = infoTx.objectStore(INFO_STORE_NAME);\n\t                  var getInfoRequest = infoStore.get(path);\n\t                  var modelTx;\n\n\t                  getInfoRequest.onsuccess = function () {\n\t                    if (getInfoRequest.result == null) {\n\t                      db.close();\n\t                      return reject(new Error(\"Cannot find model with path '\" + path + \"' \" + \"in IndexedDB.\"));\n\t                    } else {\n\t                      // First, delete the entry in the info store.\n\t                      var deleteInfoRequest = infoStore.delete(path);\n\n\t                      var deleteModelData = function deleteModelData() {\n\t                        // Second, delete the entry in the model store.\n\t                        modelTx = db.transaction(MODEL_STORE_NAME, 'readwrite');\n\t                        var modelStore = modelTx.objectStore(MODEL_STORE_NAME);\n\t                        var deleteModelRequest = modelStore.delete(path);\n\n\t                        deleteModelRequest.onsuccess = function () {\n\t                          return resolve(getInfoRequest.result.modelArtifactsInfo);\n\t                        };\n\n\t                        deleteModelRequest.onerror = function (error) {\n\t                          return reject(getInfoRequest.error);\n\t                        };\n\t                      }; // Proceed with deleting model data regardless of whether deletion\n\t                      // of info data succeeds or not.\n\n\n\t                      deleteInfoRequest.onsuccess = deleteModelData;\n\n\t                      deleteInfoRequest.onerror = function (error) {\n\t                        deleteModelData();\n\t                        db.close();\n\t                        return reject(getInfoRequest.error);\n\t                      };\n\t                    }\n\t                  };\n\n\t                  getInfoRequest.onerror = function (error) {\n\t                    db.close();\n\t                    return reject(getInfoRequest.error);\n\t                  };\n\n\t                  infoTx.oncomplete = function () {\n\t                    if (modelTx == null) {\n\t                      db.close();\n\t                    } else {\n\t                      modelTx.oncomplete = function () {\n\t                        return db.close();\n\t                      };\n\t                    }\n\t                  };\n\t                };\n\n\t                openRequest.onerror = function (error) {\n\t                  return reject(openRequest.error);\n\t                };\n\t              }));\n\n\t            case 2:\n\t            case \"end\":\n\t              return _context4.stop();\n\t          }\n\t        }\n\t      }, _callee4);\n\t    }));\n\n\t    function removeModel(_x2) {\n\t      return _removeModel.apply(this, arguments);\n\t    }\n\n\t    return removeModel;\n\t  }();\n\n\t  return BrowserIndexedDBManager;\n\t}();\n\n\tvar PATH_SEPARATOR = '/';\n\tvar PATH_PREFIX = 'tensorflowjs_models';\n\tvar INFO_SUFFIX = 'info';\n\tvar MODEL_TOPOLOGY_SUFFIX = 'model_topology';\n\tvar WEIGHT_SPECS_SUFFIX = 'weight_specs';\n\tvar WEIGHT_DATA_SUFFIX = 'weight_data';\n\tvar MODEL_METADATA_SUFFIX = 'model_metadata';\n\t/**\n\t * Purge all tensorflow.js-saved model artifacts from local storage.\n\t *\n\t * @returns Paths of the models purged.\n\t */\n\n\tfunction purgeLocalStorageArtifacts() {\n\t  if (!env().getBool('IS_BROWSER') || typeof window === 'undefined' || typeof window.localStorage === 'undefined') {\n\t    throw new Error('purgeLocalStorageModels() cannot proceed because local storage is ' + 'unavailable in the current environment.');\n\t  }\n\n\t  var LS = window.localStorage;\n\t  var purgedModelPaths = [];\n\n\t  for (var i = 0; i < LS.length; ++i) {\n\t    var key = LS.key(i);\n\t    var prefix = PATH_PREFIX + PATH_SEPARATOR;\n\n\t    if (key.startsWith(prefix) && key.length > prefix.length) {\n\t      LS.removeItem(key);\n\t      var modelName = getModelPathFromKey(key);\n\n\t      if (purgedModelPaths.indexOf(modelName) === -1) {\n\t        purgedModelPaths.push(modelName);\n\t      }\n\t    }\n\t  }\n\n\t  return purgedModelPaths;\n\t}\n\n\tfunction getModelKeys(path) {\n\t  return {\n\t    info: [PATH_PREFIX, path, INFO_SUFFIX].join(PATH_SEPARATOR),\n\t    topology: [PATH_PREFIX, path, MODEL_TOPOLOGY_SUFFIX].join(PATH_SEPARATOR),\n\t    weightSpecs: [PATH_PREFIX, path, WEIGHT_SPECS_SUFFIX].join(PATH_SEPARATOR),\n\t    weightData: [PATH_PREFIX, path, WEIGHT_DATA_SUFFIX].join(PATH_SEPARATOR),\n\t    modelMetadata: [PATH_PREFIX, path, MODEL_METADATA_SUFFIX].join(PATH_SEPARATOR)\n\t  };\n\t}\n\t/**\n\t * Get model path from a local-storage key.\n\t *\n\t * E.g., 'tensorflowjs_models/my/model/1/info' --> 'my/model/1'\n\t *\n\t * @param key\n\t */\n\n\n\tfunction getModelPathFromKey(key) {\n\t  var items = key.split(PATH_SEPARATOR);\n\n\t  if (items.length < 3) {\n\t    throw new Error(\"Invalid key format: \" + key);\n\t  }\n\n\t  return items.slice(1, items.length - 1).join(PATH_SEPARATOR);\n\t}\n\n\tfunction maybeStripScheme$1(key) {\n\t  return key.startsWith(BrowserLocalStorage.URL_SCHEME) ? key.slice(BrowserLocalStorage.URL_SCHEME.length) : key;\n\t}\n\t/**\n\t * IOHandler subclass: Browser Local Storage.\n\t *\n\t * See the doc string to `browserLocalStorage` for more details.\n\t */\n\n\n\tvar BrowserLocalStorage = /*#__PURE__*/function () {\n\t  function BrowserLocalStorage(modelPath) {\n\t    if (!env().getBool('IS_BROWSER') || typeof window === 'undefined' || typeof window.localStorage === 'undefined') {\n\t      // TODO(cais): Add more info about what IOHandler subtypes are\n\t      // available.\n\t      //   Maybe point to a doc page on the web and/or automatically determine\n\t      //   the available IOHandlers and print them in the error message.\n\t      throw new Error('The current environment does not support local storage.');\n\t    }\n\n\t    this.LS = window.localStorage;\n\n\t    if (modelPath == null || !modelPath) {\n\t      throw new Error('For local storage, modelPath must not be null, undefined or empty.');\n\t    }\n\n\t    this.modelPath = modelPath;\n\t    this.keys = getModelKeys(this.modelPath);\n\t  }\n\t  /**\n\t   * Save model artifacts to browser local storage.\n\t   *\n\t   * See the documentation to `browserLocalStorage` for details on the saved\n\t   * artifacts.\n\t   *\n\t   * @param modelArtifacts The model artifacts to be stored.\n\t   * @returns An instance of SaveResult.\n\t   */\n\n\n\t  var _proto = BrowserLocalStorage.prototype;\n\n\t  _proto.save =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _save = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(modelArtifacts) {\n\t      var topology, weightSpecs, modelArtifactsInfo, result;\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              if (!(modelArtifacts.modelTopology instanceof ArrayBuffer)) {\n\t                _context.next = 4;\n\t                break;\n\t              }\n\n\t              throw new Error('BrowserLocalStorage.save() does not support saving model topology ' + 'in binary formats yet.');\n\n\t            case 4:\n\t              topology = JSON.stringify(modelArtifacts.modelTopology);\n\t              weightSpecs = JSON.stringify(modelArtifacts.weightSpecs);\n\t              modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts);\n\t              _context.prev = 7;\n\t              this.LS.setItem(this.keys.info, JSON.stringify(modelArtifactsInfo));\n\t              this.LS.setItem(this.keys.topology, topology);\n\t              this.LS.setItem(this.keys.weightSpecs, weightSpecs);\n\t              this.LS.setItem(this.keys.weightData, arrayBufferToBase64String(modelArtifacts.weightData));\n\t              result = {\n\t                format: modelArtifacts.format,\n\t                generatedBy: modelArtifacts.generatedBy,\n\t                convertedBy: modelArtifacts.convertedBy\n\t              };\n\n\t              if (modelArtifacts.signature != null) {\n\t                result.signature = modelArtifacts.signature;\n\t              }\n\n\t              if (modelArtifacts.userDefinedMetadata != null) {\n\t                result.userDefinedMetadata = modelArtifacts.userDefinedMetadata;\n\t              }\n\n\t              if (modelArtifacts.modelInitializer != null) {\n\t                result.modelInitializer = modelArtifacts.modelInitializer;\n\t              }\n\n\t              this.LS.setItem(this.keys.modelMetadata, JSON.stringify(result));\n\t              return _context.abrupt(\"return\", {\n\t                modelArtifactsInfo: modelArtifactsInfo\n\t              });\n\n\t            case 20:\n\t              _context.prev = 20;\n\t              _context.t0 = _context[\"catch\"](7);\n\t              // If saving failed, clean up all items saved so far.\n\t              this.LS.removeItem(this.keys.info);\n\t              this.LS.removeItem(this.keys.topology);\n\t              this.LS.removeItem(this.keys.weightSpecs);\n\t              this.LS.removeItem(this.keys.weightData);\n\t              this.LS.removeItem(this.keys.modelMetadata);\n\t              throw new Error(\"Failed to save model '\" + this.modelPath + \"' to local storage: \" + \"size quota being exceeded is a possible cause of this failure: \" + (\"modelTopologyBytes=\" + modelArtifactsInfo.modelTopologyBytes + \", \") + (\"weightSpecsBytes=\" + modelArtifactsInfo.weightSpecsBytes + \", \") + (\"weightDataBytes=\" + modelArtifactsInfo.weightDataBytes + \".\"));\n\n\t            case 28:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this, [[7, 20]]);\n\t    }));\n\n\t    function save(_x) {\n\t      return _save.apply(this, arguments);\n\t    }\n\n\t    return save;\n\t  }()\n\t  /**\n\t   * Load a model from local storage.\n\t   *\n\t   * See the documentation to `browserLocalStorage` for details on the saved\n\t   * artifacts.\n\t   *\n\t   * @returns The loaded model (if loading succeeds).\n\t   */\n\t  ;\n\n\t  _proto.load =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _load = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n\t      var info, out, topology, weightSpecs, metadataString, metadata, weightDataBase64;\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              info = JSON.parse(this.LS.getItem(this.keys.info));\n\n\t              if (!(info == null)) {\n\t                _context2.next = 3;\n\t                break;\n\t              }\n\n\t              throw new Error(\"In local storage, there is no model with name '\" + this.modelPath + \"'\");\n\n\t            case 3:\n\t              if (!(info.modelTopologyType !== 'JSON')) {\n\t                _context2.next = 5;\n\t                break;\n\t              }\n\n\t              throw new Error('BrowserLocalStorage does not support loading non-JSON model ' + 'topology yet.');\n\n\t            case 5:\n\t              out = {}; // Load topology.\n\n\t              topology = JSON.parse(this.LS.getItem(this.keys.topology));\n\n\t              if (!(topology == null)) {\n\t                _context2.next = 9;\n\t                break;\n\t              }\n\n\t              throw new Error(\"In local storage, the topology of model '\" + this.modelPath + \"' \" + \"is missing.\");\n\n\t            case 9:\n\t              out.modelTopology = topology; // Load weight specs.\n\n\t              weightSpecs = JSON.parse(this.LS.getItem(this.keys.weightSpecs));\n\n\t              if (!(weightSpecs == null)) {\n\t                _context2.next = 13;\n\t                break;\n\t              }\n\n\t              throw new Error(\"In local storage, the weight specs of model '\" + this.modelPath + \"' \" + \"are missing.\");\n\n\t            case 13:\n\t              out.weightSpecs = weightSpecs; // Load meta-data fields.\n\n\t              metadataString = this.LS.getItem(this.keys.modelMetadata);\n\n\t              if (metadataString != null) {\n\t                metadata = JSON.parse(metadataString);\n\t                out.format = metadata['format'];\n\t                out.generatedBy = metadata['generatedBy'];\n\t                out.convertedBy = metadata['convertedBy'];\n\n\t                if (metadata['signature'] != null) {\n\t                  out.signature = metadata['signature'];\n\t                }\n\n\t                if (metadata['userDefinedMetadata'] != null) {\n\t                  out.userDefinedMetadata = metadata['userDefinedMetadata'];\n\t                }\n\n\t                if (metadata['modelInitializer'] != null) {\n\t                  out.modelInitializer = metadata['modelInitializer'];\n\t                }\n\t              } // Load weight data.\n\n\n\t              weightDataBase64 = this.LS.getItem(this.keys.weightData);\n\n\t              if (!(weightDataBase64 == null)) {\n\t                _context2.next = 19;\n\t                break;\n\t              }\n\n\t              throw new Error(\"In local storage, the binary weight values of model \" + (\"'\" + this.modelPath + \"' are missing.\"));\n\n\t            case 19:\n\t              out.weightData = base64StringToArrayBuffer(weightDataBase64);\n\t              return _context2.abrupt(\"return\", out);\n\n\t            case 21:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function load() {\n\t      return _load.apply(this, arguments);\n\t    }\n\n\t    return load;\n\t  }();\n\n\t  return BrowserLocalStorage;\n\t}();\n\tBrowserLocalStorage.URL_SCHEME = 'localstorage://';\n\tvar localStorageRouter = function localStorageRouter(url) {\n\t  if (!env().getBool('IS_BROWSER')) {\n\t    return null;\n\t  } else {\n\t    if (!Array.isArray(url) && url.startsWith(BrowserLocalStorage.URL_SCHEME)) {\n\t      return browserLocalStorage(url.slice(BrowserLocalStorage.URL_SCHEME.length));\n\t    } else {\n\t      return null;\n\t    }\n\t  }\n\t};\n\tIORouterRegistry.registerSaveRouter(localStorageRouter);\n\tIORouterRegistry.registerLoadRouter(localStorageRouter);\n\t/**\n\t * Factory function for local storage IOHandler.\n\t *\n\t * This `IOHandler` supports both `save` and `load`.\n\t *\n\t * For each model's saved artifacts, four items are saved to local storage.\n\t *   - `${PATH_SEPARATOR}/${modelPath}/info`: Contains meta-info about the\n\t *     model, such as date saved, type of the topology, size in bytes, etc.\n\t *   - `${PATH_SEPARATOR}/${modelPath}/topology`: Model topology. For Keras-\n\t *     style models, this is a stringized JSON.\n\t *   - `${PATH_SEPARATOR}/${modelPath}/weight_specs`: Weight specs of the\n\t *     model, can be used to decode the saved binary weight values (see\n\t *     item below).\n\t *   - `${PATH_SEPARATOR}/${modelPath}/weight_data`: Concatenated binary\n\t *     weight values, stored as a base64-encoded string.\n\t *\n\t * Saving may throw an `Error` if the total size of the artifacts exceed the\n\t * browser-specific quota.\n\t *\n\t * @param modelPath A unique identifier for the model to be saved. Must be a\n\t *   non-empty string.\n\t * @returns An instance of `IOHandler`, which can be used with, e.g.,\n\t *   `tf.Model.save`.\n\t */\n\n\tfunction browserLocalStorage(modelPath) {\n\t  return new BrowserLocalStorage(modelPath);\n\t}\n\tvar BrowserLocalStorageManager = /*#__PURE__*/function () {\n\t  function BrowserLocalStorageManager() {\n\t    assert(env().getBool('IS_BROWSER'), function () {\n\t      return 'Current environment is not a web browser';\n\t    });\n\t    assert(typeof window === 'undefined' || typeof window.localStorage !== 'undefined', function () {\n\t      return 'Current browser does not appear to support localStorage';\n\t    });\n\t    this.LS = window.localStorage;\n\t  }\n\n\t  var _proto2 = BrowserLocalStorageManager.prototype;\n\n\t  _proto2.listModels = /*#__PURE__*/function () {\n\t    var _listModels = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n\t      var out, prefix, suffix, i, key, modelPath;\n\t      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t        while (1) {\n\t          switch (_context3.prev = _context3.next) {\n\t            case 0:\n\t              out = {};\n\t              prefix = PATH_PREFIX + PATH_SEPARATOR;\n\t              suffix = PATH_SEPARATOR + INFO_SUFFIX;\n\n\t              for (i = 0; i < this.LS.length; ++i) {\n\t                key = this.LS.key(i);\n\n\t                if (key.startsWith(prefix) && key.endsWith(suffix)) {\n\t                  modelPath = getModelPathFromKey(key);\n\t                  out[modelPath] = JSON.parse(this.LS.getItem(key));\n\t                }\n\t              }\n\n\t              return _context3.abrupt(\"return\", out);\n\n\t            case 5:\n\t            case \"end\":\n\t              return _context3.stop();\n\t          }\n\t        }\n\t      }, _callee3, this);\n\t    }));\n\n\t    function listModels() {\n\t      return _listModels.apply(this, arguments);\n\t    }\n\n\t    return listModels;\n\t  }();\n\n\t  _proto2.removeModel = /*#__PURE__*/function () {\n\t    var _removeModel = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(path) {\n\t      var keys, info;\n\t      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n\t        while (1) {\n\t          switch (_context4.prev = _context4.next) {\n\t            case 0:\n\t              path = maybeStripScheme$1(path);\n\t              keys = getModelKeys(path);\n\n\t              if (!(this.LS.getItem(keys.info) == null)) {\n\t                _context4.next = 4;\n\t                break;\n\t              }\n\n\t              throw new Error(\"Cannot find model at path '\" + path + \"'\");\n\n\t            case 4:\n\t              info = JSON.parse(this.LS.getItem(keys.info));\n\t              this.LS.removeItem(keys.info);\n\t              this.LS.removeItem(keys.topology);\n\t              this.LS.removeItem(keys.weightSpecs);\n\t              this.LS.removeItem(keys.weightData);\n\t              return _context4.abrupt(\"return\", info);\n\n\t            case 10:\n\t            case \"end\":\n\t              return _context4.stop();\n\t          }\n\t        }\n\t      }, _callee4, this);\n\t    }));\n\n\t    function removeModel(_x2) {\n\t      return _removeModel.apply(this, arguments);\n\t    }\n\n\t    return removeModel;\n\t  }();\n\n\t  return BrowserLocalStorageManager;\n\t}();\n\n\tvar URL_SCHEME_SUFFIX = '://';\n\tvar ModelStoreManagerRegistry = /*#__PURE__*/function () {\n\t  function ModelStoreManagerRegistry() {\n\t    this.managers = {};\n\t  }\n\n\t  ModelStoreManagerRegistry.getInstance = function getInstance() {\n\t    if (ModelStoreManagerRegistry.instance == null) {\n\t      ModelStoreManagerRegistry.instance = new ModelStoreManagerRegistry();\n\t    }\n\n\t    return ModelStoreManagerRegistry.instance;\n\t  }\n\t  /**\n\t   * Register a save-handler router.\n\t   *\n\t   * @param saveRouter A function that maps a URL-like string onto an instance\n\t   * of `IOHandler` with the `save` method defined or `null`.\n\t   */\n\t  ;\n\n\t  ModelStoreManagerRegistry.registerManager = function registerManager(scheme, manager) {\n\t    assert(scheme != null, function () {\n\t      return 'scheme must not be undefined or null.';\n\t    });\n\n\t    if (scheme.endsWith(URL_SCHEME_SUFFIX)) {\n\t      scheme = scheme.slice(0, scheme.indexOf(URL_SCHEME_SUFFIX));\n\t    }\n\n\t    assert(scheme.length > 0, function () {\n\t      return 'scheme must not be an empty string.';\n\t    });\n\t    var registry = ModelStoreManagerRegistry.getInstance();\n\t    assert(registry.managers[scheme] == null, function () {\n\t      return \"A model store manager is already registered for scheme '\" + scheme + \"'.\";\n\t    });\n\t    registry.managers[scheme] = manager;\n\t  };\n\n\t  ModelStoreManagerRegistry.getManager = function getManager(scheme) {\n\t    var manager = this.getInstance().managers[scheme];\n\n\t    if (manager == null) {\n\t      throw new Error(\"Cannot find model manager for scheme '\" + scheme + \"'\");\n\t    }\n\n\t    return manager;\n\t  };\n\n\t  ModelStoreManagerRegistry.getSchemes = function getSchemes() {\n\t    return Object.keys(this.getInstance().managers);\n\t  };\n\n\t  return ModelStoreManagerRegistry;\n\t}();\n\t/**\n\t * Helper method for parsing a URL string into a scheme and a path.\n\t *\n\t * @param url E.g., 'localstorage://my-model'\n\t * @returns A dictionary with two fields: scheme and path.\n\t *   Scheme: e.g., 'localstorage' in the example above.\n\t *   Path: e.g., 'my-model' in the example above.\n\t */\n\n\tfunction parseURL$1(url) {\n\t  if (url.indexOf(URL_SCHEME_SUFFIX) === -1) {\n\t    throw new Error(\"The url string provided does not contain a scheme. \" + \"Supported schemes are: \" + (\"\" + ModelStoreManagerRegistry.getSchemes().join(',')));\n\t  }\n\n\t  return {\n\t    scheme: url.split(URL_SCHEME_SUFFIX)[0],\n\t    path: url.split(URL_SCHEME_SUFFIX)[1]\n\t  };\n\t}\n\n\tfunction cloneModelInternal(_x, _x2, _x3) {\n\t  return _cloneModelInternal.apply(this, arguments);\n\t}\n\t/**\n\t * List all models stored in registered storage mediums.\n\t *\n\t * For a web browser environment, the registered mediums are Local Storage and\n\t * IndexedDB.\n\t *\n\t * ```js\n\t * // First create and save a model.\n\t * const model = tf.sequential();\n\t * model.add(tf.layers.dense(\n\t *     {units: 1, inputShape: [10], activation: 'sigmoid'}));\n\t * await model.save('localstorage://demo/management/model1');\n\t *\n\t * // Then list existing models.\n\t * console.log(JSON.stringify(await tf.io.listModels()));\n\t *\n\t * // Delete the model.\n\t * await tf.io.removeModel('localstorage://demo/management/model1');\n\t *\n\t * // List models again.\n\t * console.log(JSON.stringify(await tf.io.listModels()));\n\t * ```\n\t *\n\t * @returns A `Promise` of a dictionary mapping URLs of existing models to\n\t * their model artifacts info. URLs include medium-specific schemes, e.g.,\n\t *   'indexeddb://my/model/1'. Model artifacts info include type of the\n\t * model's topology, byte sizes of the topology, weights, etc.\n\t *\n\t * @doc {\n\t *   heading: 'Models',\n\t *   subheading: 'Management',\n\t *   namespace: 'io',\n\t *   ignoreCI: true\n\t * }\n\t */\n\n\n\tfunction _cloneModelInternal() {\n\t  _cloneModelInternal = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(sourceURL, destURL, deleteSource) {\n\t    var loadHandlers, loadHandler, saveHandlers, saveHandler, sourceScheme, sourcePath, sameMedium, modelArtifacts, saveResult;\n\t    return regeneratorRuntime.wrap(function _callee$(_context) {\n\t      while (1) {\n\t        switch (_context.prev = _context.next) {\n\t          case 0:\n\t            if (deleteSource === void 0) {\n\t              deleteSource = false;\n\t            }\n\n\t            assert(sourceURL !== destURL, function () {\n\t              return \"Old path and new path are the same: '\" + sourceURL + \"'\";\n\t            });\n\t            loadHandlers = IORouterRegistry.getLoadHandlers(sourceURL);\n\t            assert(loadHandlers.length > 0, function () {\n\t              return \"Copying failed because no load handler is found for source URL \" + sourceURL + \".\";\n\t            });\n\t            assert(loadHandlers.length < 2, function () {\n\t              return \"Copying failed because more than one (\" + loadHandlers.length + \") \" + (\"load handlers for source URL \" + sourceURL + \".\");\n\t            });\n\t            loadHandler = loadHandlers[0];\n\t            saveHandlers = IORouterRegistry.getSaveHandlers(destURL);\n\t            assert(saveHandlers.length > 0, function () {\n\t              return \"Copying failed because no save handler is found for destination \" + (\"URL \" + destURL + \".\");\n\t            });\n\t            assert(saveHandlers.length < 2, function () {\n\t              return \"Copying failed because more than one (\" + loadHandlers.length + \") \" + (\"save handlers for destination URL \" + destURL + \".\");\n\t            });\n\t            saveHandler = saveHandlers[0];\n\t            sourceScheme = parseURL$1(sourceURL).scheme;\n\t            sourcePath = parseURL$1(sourceURL).path;\n\t            sameMedium = sourceScheme === parseURL$1(sourceURL).scheme;\n\t            _context.next = 15;\n\t            return loadHandler.load();\n\n\t          case 15:\n\t            modelArtifacts = _context.sent;\n\n\t            if (!(deleteSource && sameMedium)) {\n\t              _context.next = 19;\n\t              break;\n\t            }\n\n\t            _context.next = 19;\n\t            return ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath);\n\n\t          case 19:\n\t            _context.next = 21;\n\t            return saveHandler.save(modelArtifacts);\n\n\t          case 21:\n\t            saveResult = _context.sent;\n\n\t            if (!(deleteSource && !sameMedium)) {\n\t              _context.next = 25;\n\t              break;\n\t            }\n\n\t            _context.next = 25;\n\t            return ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath);\n\n\t          case 25:\n\t            return _context.abrupt(\"return\", saveResult.modelArtifactsInfo);\n\n\t          case 26:\n\t          case \"end\":\n\t            return _context.stop();\n\t        }\n\t      }\n\t    }, _callee);\n\t  }));\n\t  return _cloneModelInternal.apply(this, arguments);\n\t}\n\n\tfunction listModels() {\n\t  return _listModels.apply(this, arguments);\n\t}\n\t/**\n\t * Remove a model specified by URL from a reigstered storage medium.\n\t *\n\t * ```js\n\t * // First create and save a model.\n\t * const model = tf.sequential();\n\t * model.add(tf.layers.dense(\n\t *     {units: 1, inputShape: [10], activation: 'sigmoid'}));\n\t * await model.save('localstorage://demo/management/model1');\n\t *\n\t * // Then list existing models.\n\t * console.log(JSON.stringify(await tf.io.listModels()));\n\t *\n\t * // Delete the model.\n\t * await tf.io.removeModel('localstorage://demo/management/model1');\n\t *\n\t * // List models again.\n\t * console.log(JSON.stringify(await tf.io.listModels()));\n\t * ```\n\t *\n\t * @param url A URL to a stored model, with a scheme prefix, e.g.,\n\t *   'localstorage://my-model-1', 'indexeddb://my/model/2'.\n\t * @returns ModelArtifactsInfo of the deleted model (if and only if deletion\n\t *   is successful).\n\t * @throws Error if deletion fails, e.g., if no model exists at `path`.\n\t *\n\t * @doc {\n\t *   heading: 'Models',\n\t *   subheading: 'Management',\n\t *   namespace: 'io',\n\t *   ignoreCI: true\n\t * }\n\t */\n\n\n\tfunction _listModels() {\n\t  _listModels = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n\t    var schemes, out, _iterator, _step, scheme, schemeOut, path, url;\n\n\t    return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t      while (1) {\n\t        switch (_context2.prev = _context2.next) {\n\t          case 0:\n\t            schemes = ModelStoreManagerRegistry.getSchemes();\n\t            out = {};\n\t            _iterator = _createForOfIteratorHelperLoose(schemes);\n\n\t          case 3:\n\t            if ((_step = _iterator()).done) {\n\t              _context2.next = 11;\n\t              break;\n\t            }\n\n\t            scheme = _step.value;\n\t            _context2.next = 7;\n\t            return ModelStoreManagerRegistry.getManager(scheme).listModels();\n\n\t          case 7:\n\t            schemeOut = _context2.sent;\n\n\t            for (path in schemeOut) {\n\t              url = scheme + URL_SCHEME_SUFFIX + path;\n\t              out[url] = schemeOut[path];\n\t            }\n\n\t          case 9:\n\t            _context2.next = 3;\n\t            break;\n\n\t          case 11:\n\t            return _context2.abrupt(\"return\", out);\n\n\t          case 12:\n\t          case \"end\":\n\t            return _context2.stop();\n\t        }\n\t      }\n\t    }, _callee2);\n\t  }));\n\t  return _listModels.apply(this, arguments);\n\t}\n\n\tfunction removeModel(_x4) {\n\t  return _removeModel.apply(this, arguments);\n\t}\n\t/**\n\t * Copy a model from one URL to another.\n\t *\n\t * This function supports:\n\t *\n\t * 1. Copying within a storage medium, e.g.,\n\t *    `tf.io.copyModel('localstorage://model-1', 'localstorage://model-2')`\n\t * 2. Copying between two storage mediums, e.g.,\n\t *    `tf.io.copyModel('localstorage://model-1', 'indexeddb://model-1')`\n\t *\n\t * ```js\n\t * // First create and save a model.\n\t * const model = tf.sequential();\n\t * model.add(tf.layers.dense(\n\t *     {units: 1, inputShape: [10], activation: 'sigmoid'}));\n\t * await model.save('localstorage://demo/management/model1');\n\t *\n\t * // Then list existing models.\n\t * console.log(JSON.stringify(await tf.io.listModels()));\n\t *\n\t * // Copy the model, from Local Storage to IndexedDB.\n\t * await tf.io.copyModel(\n\t *     'localstorage://demo/management/model1',\n\t *     'indexeddb://demo/management/model1');\n\t *\n\t * // List models again.\n\t * console.log(JSON.stringify(await tf.io.listModels()));\n\t *\n\t * // Remove both models.\n\t * await tf.io.removeModel('localstorage://demo/management/model1');\n\t * await tf.io.removeModel('indexeddb://demo/management/model1');\n\t * ```\n\t *\n\t * @param sourceURL Source URL of copying.\n\t * @param destURL Destination URL of copying.\n\t * @returns ModelArtifactsInfo of the copied model (if and only if copying\n\t *   is successful).\n\t * @throws Error if copying fails, e.g., if no model exists at `sourceURL`, or\n\t *   if `oldPath` and `newPath` are identical.\n\t *\n\t * @doc {\n\t *   heading: 'Models',\n\t *   subheading: 'Management',\n\t *   namespace: 'io',\n\t *   ignoreCI: true\n\t * }\n\t */\n\n\n\tfunction _removeModel() {\n\t  _removeModel = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(url) {\n\t    var schemeAndPath, manager;\n\t    return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t      while (1) {\n\t        switch (_context3.prev = _context3.next) {\n\t          case 0:\n\t            schemeAndPath = parseURL$1(url);\n\t            manager = ModelStoreManagerRegistry.getManager(schemeAndPath.scheme);\n\t            return _context3.abrupt(\"return\", manager.removeModel(schemeAndPath.path));\n\n\t          case 3:\n\t          case \"end\":\n\t            return _context3.stop();\n\t        }\n\t      }\n\t    }, _callee3);\n\t  }));\n\t  return _removeModel.apply(this, arguments);\n\t}\n\n\tfunction copyModel(_x5, _x6) {\n\t  return _copyModel.apply(this, arguments);\n\t}\n\t/**\n\t * Move a model from one URL to another.\n\t *\n\t * This function supports:\n\t *\n\t * 1. Moving within a storage medium, e.g.,\n\t *    `tf.io.moveModel('localstorage://model-1', 'localstorage://model-2')`\n\t * 2. Moving between two storage mediums, e.g.,\n\t *    `tf.io.moveModel('localstorage://model-1', 'indexeddb://model-1')`\n\t *\n\t * ```js\n\t * // First create and save a model.\n\t * const model = tf.sequential();\n\t * model.add(tf.layers.dense(\n\t *     {units: 1, inputShape: [10], activation: 'sigmoid'}));\n\t * await model.save('localstorage://demo/management/model1');\n\t *\n\t * // Then list existing models.\n\t * console.log(JSON.stringify(await tf.io.listModels()));\n\t *\n\t * // Move the model, from Local Storage to IndexedDB.\n\t * await tf.io.moveModel(\n\t *     'localstorage://demo/management/model1',\n\t *     'indexeddb://demo/management/model1');\n\t *\n\t * // List models again.\n\t * console.log(JSON.stringify(await tf.io.listModels()));\n\t *\n\t * // Remove the moved model.\n\t * await tf.io.removeModel('indexeddb://demo/management/model1');\n\t * ```\n\t *\n\t * @param sourceURL Source URL of moving.\n\t * @param destURL Destination URL of moving.\n\t * @returns ModelArtifactsInfo of the copied model (if and only if copying\n\t *   is successful).\n\t * @throws Error if moving fails, e.g., if no model exists at `sourceURL`, or\n\t *   if `oldPath` and `newPath` are identical.\n\t *\n\t * @doc {\n\t *   heading: 'Models',\n\t *   subheading: 'Management',\n\t *   namespace: 'io',\n\t *   ignoreCI: true\n\t * }\n\t */\n\n\n\tfunction _copyModel() {\n\t  _copyModel = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(sourceURL, destURL) {\n\t    var deleteSource;\n\t    return regeneratorRuntime.wrap(function _callee4$(_context4) {\n\t      while (1) {\n\t        switch (_context4.prev = _context4.next) {\n\t          case 0:\n\t            deleteSource = false;\n\t            return _context4.abrupt(\"return\", cloneModelInternal(sourceURL, destURL, deleteSource));\n\n\t          case 2:\n\t          case \"end\":\n\t            return _context4.stop();\n\t        }\n\t      }\n\t    }, _callee4);\n\t  }));\n\t  return _copyModel.apply(this, arguments);\n\t}\n\n\tfunction moveModel(_x7, _x8) {\n\t  return _moveModel.apply(this, arguments);\n\t}\n\n\tfunction _moveModel() {\n\t  _moveModel = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5(sourceURL, destURL) {\n\t    var deleteSource;\n\t    return regeneratorRuntime.wrap(function _callee5$(_context5) {\n\t      while (1) {\n\t        switch (_context5.prev = _context5.next) {\n\t          case 0:\n\t            deleteSource = true;\n\t            return _context5.abrupt(\"return\", cloneModelInternal(sourceURL, destURL, deleteSource));\n\n\t          case 2:\n\t          case \"end\":\n\t            return _context5.stop();\n\t        }\n\t      }\n\t    }, _callee5);\n\t  }));\n\t  return _moveModel.apply(this, arguments);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar PlatformBrowser = /*#__PURE__*/function () {\n\t  function PlatformBrowser() {}\n\n\t  var _proto = PlatformBrowser.prototype;\n\n\t  _proto.fetch = function (_fetch) {\n\t    function fetch(_x, _x2) {\n\t      return _fetch.apply(this, arguments);\n\t    }\n\n\t    fetch.toString = function () {\n\t      return _fetch.toString();\n\t    };\n\n\t    return fetch;\n\t  }(function (path, init) {\n\t    return fetch(path, init);\n\t  });\n\n\t  _proto.now = function now() {\n\t    return performance.now();\n\t  };\n\n\t  _proto.encode = function encode(text, encoding) {\n\t    if (encoding !== 'utf-8' && encoding !== 'utf8') {\n\t      throw new Error(\"Browser's encoder only supports utf-8, but got \" + encoding);\n\t    }\n\n\t    if (this.textEncoder == null) {\n\t      this.textEncoder = new TextEncoder();\n\t    }\n\n\t    return this.textEncoder.encode(text);\n\t  };\n\n\t  _proto.decode = function decode(bytes, encoding) {\n\t    return new TextDecoder(encoding).decode(bytes);\n\t  };\n\n\t  return PlatformBrowser;\n\t}();\n\n\tif (env().get('IS_BROWSER')) {\n\t  env().setPlatform('browser', new PlatformBrowser()); // Register LocalStorage IOHandler\n\n\t  try {\n\t    ModelStoreManagerRegistry.registerManager(BrowserLocalStorage.URL_SCHEME, new BrowserLocalStorageManager());\n\t  } catch (err) {} // Register IndexedDB IOHandler\n\n\n\t  try {\n\t    ModelStoreManagerRegistry.registerManager(BrowserIndexedDB.URL_SCHEME, new BrowserIndexedDBManager());\n\t  } catch (err) {}\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tvar getNodeFetch = {\n\t  // tslint:disable-next-line:no-require-imports\n\t  importFetch: function importFetch() {\n\t    return require('node-fetch');\n\t  }\n\t};\n\tvar systemFetch; // These getters and setters are for testing so we don't export a mutable\n\t// variable.\n\n\tfunction resetSystemFetch() {\n\t  systemFetch = null;\n\t}\n\tfunction setSystemFetch(fetchFn) {\n\t  systemFetch = fetchFn;\n\t}\n\tfunction getSystemFetch() {\n\t  return systemFetch;\n\t}\n\tvar PlatformNode = /*#__PURE__*/function () {\n\t  function PlatformNode() {\n\t    // tslint:disable-next-line:no-require-imports\n\t    this.util = require('util'); // According to the spec, the built-in encoder can do only UTF-8 encoding.\n\t    // https://developer.mozilla.org/en-US/docs/Web/API/TextEncoder/TextEncoder\n\n\t    this.textEncoder = new this.util.TextEncoder();\n\t  }\n\n\t  var _proto = PlatformNode.prototype;\n\n\t  _proto.fetch = function fetch(path, requestInits) {\n\t    if (env().global.fetch != null) {\n\t      return env().global.fetch(path, requestInits);\n\t    }\n\n\t    if (systemFetch == null) {\n\t      systemFetch = getNodeFetch.importFetch();\n\t    }\n\n\t    return systemFetch(path, requestInits);\n\t  };\n\n\t  _proto.now = function now() {\n\t    var time = process.hrtime();\n\t    return time[0] * 1000 + time[1] / 1000000;\n\t  };\n\n\t  _proto.encode = function encode(text, encoding) {\n\t    if (encoding !== 'utf-8' && encoding !== 'utf8') {\n\t      throw new Error(\"Node built-in encoder only supports utf-8, but got \" + encoding);\n\t    }\n\n\t    return this.textEncoder.encode(text);\n\t  };\n\n\t  _proto.decode = function decode(bytes, encoding) {\n\t    if (bytes.length === 0) {\n\t      return '';\n\t    }\n\n\t    return new this.util.TextDecoder(encoding).decode(bytes);\n\t  };\n\n\t  return PlatformNode;\n\t}();\n\n\tif (env().get('IS_NODE')) {\n\t  env().setPlatform('node', new PlatformNode());\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google Inc. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates an empty `tf.TensorBuffer` with the specified `shape` and `dtype`.\n\t *\n\t * The values are stored in CPU as `TypedArray`. Fill the buffer using\n\t * `buffer.set()`, or by modifying directly `buffer.values`.\n\t *\n\t * When done, call `buffer.toTensor()` to get an immutable `tf.Tensor` with\n\t * those values.\n\t *\n\t * ```js\n\t * // Create a buffer and set values at particular indices.\n\t * const buffer = tf.buffer([2, 2]);\n\t * buffer.set(3, 0, 0);\n\t * buffer.set(5, 1, 0);\n\t *\n\t * // Convert the buffer back to a tensor.\n\t * buffer.toTensor().print();\n\t * ```\n\t *\n\t * @param shape An array of integers defining the output tensor shape.\n\t * @param dtype The dtype of the buffer. Defaults to 'float32'.\n\t * @param values The values of the buffer as `TypedArray`. Defaults to\n\t * zeros.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction buffer(shape, dtype, values) {\n\t  if (dtype === void 0) {\n\t    dtype = 'float32';\n\t  }\n\n\t  dtype = dtype || 'float32';\n\t  assertNonNegativeIntegerDimensions(shape);\n\t  return new TensorBuffer(shape, dtype, values);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google Inc. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Casts a `tf.Tensor` to a new dtype.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1.5, 2.5, 3]);\n\t * tf.cast(x, 'int32').print();\n\t * ```\n\t * @param x The input tensor to be casted.\n\t * @param dtype The dtype to cast the input tensor to.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Transformations'}\n\t */\n\n\tfunction cast_(x, dtype) {\n\t  var $x = convertToTensor(x, 'x', 'cast'); // Sanity checks.\n\n\t  if (!isValidDtype(dtype)) {\n\t    throw new Error(\"Failed to cast to unknown dtype \" + dtype);\n\t  }\n\n\t  if (dtype === 'string' && $x.dtype !== 'string' || dtype !== 'string' && $x.dtype === 'string') {\n\t    throw new Error('Only strings can be casted to strings');\n\t  }\n\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    dtype: dtype\n\t  };\n\t  return ENGINE.runKernel(Cast, inputs, attrs);\n\t}\n\n\tvar cast = op({\n\t  cast_: cast_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates a new tensor with the same values and shape as the specified\n\t * tensor.\n\t *\n\t * ```js\n\t * const x = tf.tensor([1, 2]);\n\t *\n\t * x.clone().print();\n\t * ```\n\t *\n\t * @param x The tensor to clone.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction clone_(x) {\n\t  var $x = convertToTensor(x, 'x', 'clone', 'string_or_numeric');\n\t  var inputs = {\n\t    x: $x\n\t  }; // Note this op is called tf.identity in python. Hence the kernel name used\n\t  // here.\n\n\t  return ENGINE.runKernel(Identity, inputs);\n\t}\n\n\tvar clone = op({\n\t  clone_: clone_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google Inc. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\t/**\n\t * Prints information about the `tf.Tensor` including its data.\n\t *\n\t * ```js\n\t * const verbose = true;\n\t * tf.tensor2d([1, 2, 3, 4], [2, 2]).print(verbose);\n\t * ```\n\t * @param x The tensor to be printed.\n\t * @param verbose Whether to print verbose information about the ` Tensor`,\n\t * including dtype and size.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\tfunction print(x, verbose) {\n\t  if (verbose === void 0) {\n\t    verbose = false;\n\t  }\n\n\t  console.log(x.toString(verbose));\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google Inc. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tgetOrMakeEngine(); // Register backend-agnostic flags.\n\tvar opHandler$1 = {\n\t  buffer: buffer,\n\t  cast: cast,\n\t  clone: clone,\n\t  print: print\n\t};\n\tsetOpHandler(opHandler$1);\n\n\tvar DEFAULT_FILE_NAME_PREFIX = 'model';\n\tvar DEFAULT_JSON_EXTENSION_NAME = '.json';\n\tvar DEFAULT_WEIGHT_DATA_EXTENSION_NAME = '.weights.bin';\n\n\tfunction defer$1(f) {\n\t  return new Promise(function (resolve) {\n\t    return setTimeout(resolve);\n\t  }).then(f);\n\t}\n\n\tvar BrowserDownloads = /*#__PURE__*/function () {\n\t  function BrowserDownloads(fileNamePrefix) {\n\t    if (!env().getBool('IS_BROWSER')) {\n\t      // TODO(cais): Provide info on what IOHandlers are available under the\n\t      //   current environment.\n\t      throw new Error('browserDownloads() cannot proceed because the current environment ' + 'is not a browser.');\n\t    }\n\n\t    if (fileNamePrefix.startsWith(BrowserDownloads.URL_SCHEME)) {\n\t      fileNamePrefix = fileNamePrefix.slice(BrowserDownloads.URL_SCHEME.length);\n\t    }\n\n\t    if (fileNamePrefix == null || fileNamePrefix.length === 0) {\n\t      fileNamePrefix = DEFAULT_FILE_NAME_PREFIX;\n\t    }\n\n\t    this.modelTopologyFileName = fileNamePrefix + DEFAULT_JSON_EXTENSION_NAME;\n\t    this.weightDataFileName = fileNamePrefix + DEFAULT_WEIGHT_DATA_EXTENSION_NAME;\n\t  }\n\n\t  var _proto = BrowserDownloads.prototype;\n\n\t  _proto.save = /*#__PURE__*/function () {\n\t    var _save = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(modelArtifacts) {\n\t      var weightsURL, weightsManifest, modelTopologyAndWeightManifest, modelTopologyAndWeightManifestURL, jsonAnchor, weightDataAnchor;\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              if (!(typeof document === 'undefined')) {\n\t                _context.next = 2;\n\t                break;\n\t              }\n\n\t              throw new Error('Browser downloads are not supported in ' + 'this environment since `document` is not present');\n\n\t            case 2:\n\t              weightsURL = window.URL.createObjectURL(new Blob([modelArtifacts.weightData], {\n\t                type: 'application/octet-stream'\n\t              }));\n\n\t              if (!(modelArtifacts.modelTopology instanceof ArrayBuffer)) {\n\t                _context.next = 7;\n\t                break;\n\t              }\n\n\t              throw new Error('BrowserDownloads.save() does not support saving model topology ' + 'in binary formats yet.');\n\n\t            case 7:\n\t              weightsManifest = [{\n\t                paths: ['./' + this.weightDataFileName],\n\t                weights: modelArtifacts.weightSpecs\n\t              }];\n\t              modelTopologyAndWeightManifest = {\n\t                modelTopology: modelArtifacts.modelTopology,\n\t                format: modelArtifacts.format,\n\t                generatedBy: modelArtifacts.generatedBy,\n\t                convertedBy: modelArtifacts.convertedBy,\n\t                weightsManifest: weightsManifest\n\t              };\n\n\t              if (modelArtifacts.signature != null) {\n\t                modelTopologyAndWeightManifest.signature = modelArtifacts.signature;\n\t              }\n\n\t              if (modelArtifacts.userDefinedMetadata != null) {\n\t                modelTopologyAndWeightManifest.userDefinedMetadata = modelArtifacts.userDefinedMetadata;\n\t              }\n\n\t              if (modelArtifacts.modelInitializer != null) {\n\t                modelTopologyAndWeightManifest.modelInitializer = modelArtifacts.modelInitializer;\n\t              }\n\n\t              modelTopologyAndWeightManifestURL = window.URL.createObjectURL(new Blob([JSON.stringify(modelTopologyAndWeightManifest)], {\n\t                type: 'application/json'\n\t              })); // If anchor elements are not provided, create them without attaching them\n\t              // to parents, so that the downloaded file names can be controlled.\n\n\t              jsonAnchor = this.jsonAnchor == null ? document.createElement('a') : this.jsonAnchor;\n\t              jsonAnchor.download = this.modelTopologyFileName;\n\t              jsonAnchor.href = modelTopologyAndWeightManifestURL; // Trigger downloads by evoking a click event on the download anchors.\n\t              // When multiple downloads are started synchronously, Firefox will only\n\t              // save the last one.\n\n\t              _context.next = 18;\n\t              return defer$1(function () {\n\t                return jsonAnchor.dispatchEvent(new MouseEvent('click'));\n\t              });\n\n\t            case 18:\n\t              if (!(modelArtifacts.weightData != null)) {\n\t                _context.next = 24;\n\t                break;\n\t              }\n\n\t              weightDataAnchor = this.weightDataAnchor == null ? document.createElement('a') : this.weightDataAnchor;\n\t              weightDataAnchor.download = this.weightDataFileName;\n\t              weightDataAnchor.href = weightsURL;\n\t              _context.next = 24;\n\t              return defer$1(function () {\n\t                return weightDataAnchor.dispatchEvent(new MouseEvent('click'));\n\t              });\n\n\t            case 24:\n\t              return _context.abrupt(\"return\", {\n\t                modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts)\n\t              });\n\n\t            case 25:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function save(_x) {\n\t      return _save.apply(this, arguments);\n\t    }\n\n\t    return save;\n\t  }();\n\n\t  return BrowserDownloads;\n\t}();\n\tBrowserDownloads.URL_SCHEME = 'downloads://';\n\n\tvar BrowserFiles = /*#__PURE__*/function () {\n\t  function BrowserFiles(files) {\n\t    if (files == null || files.length < 1) {\n\t      throw new Error(\"When calling browserFiles, at least 1 file is required, \" + (\"but received \" + files));\n\t    }\n\n\t    this.files = files;\n\t  }\n\n\t  var _proto2 = BrowserFiles.prototype;\n\n\t  _proto2.load = /*#__PURE__*/function () {\n\t    var _load = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n\t      var _this = this;\n\n\t      var jsonFile, weightFiles;\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              jsonFile = this.files[0];\n\t              weightFiles = this.files.slice(1);\n\t              return _context2.abrupt(\"return\", new Promise(function (resolve, reject) {\n\t                var jsonReader = new FileReader();\n\n\t                jsonReader.onload = function (event) {\n\t                  // tslint:disable-next-line:no-any\n\t                  var modelJSON = JSON.parse(event.target.result);\n\t                  var modelTopology = modelJSON.modelTopology;\n\n\t                  if (modelTopology == null) {\n\t                    reject(new Error(\"modelTopology field is missing from file \" + jsonFile.name));\n\t                    return;\n\t                  }\n\n\t                  if (weightFiles.length === 0) {\n\t                    resolve({\n\t                      modelTopology: modelTopology\n\t                    });\n\t                  }\n\n\t                  var weightsManifest = modelJSON.weightsManifest;\n\n\t                  if (weightsManifest == null) {\n\t                    reject(new Error(\"weightManifest field is missing from file \" + jsonFile.name));\n\t                    return;\n\t                  }\n\n\t                  var pathToFile;\n\n\t                  try {\n\t                    pathToFile = _this.checkManifestAndWeightFiles(weightsManifest, weightFiles);\n\t                  } catch (err) {\n\t                    reject(err);\n\t                    return;\n\t                  }\n\n\t                  var weightSpecs = [];\n\t                  var paths = [];\n\t                  var perFileBuffers = [];\n\t                  weightsManifest.forEach(function (weightsGroup) {\n\t                    weightsGroup.paths.forEach(function (path) {\n\t                      paths.push(path);\n\t                      perFileBuffers.push(null);\n\t                    });\n\t                    weightSpecs.push.apply(weightSpecs, weightsGroup.weights);\n\t                  });\n\t                  weightsManifest.forEach(function (weightsGroup) {\n\t                    weightsGroup.paths.forEach(function (path) {\n\t                      var weightFileReader = new FileReader();\n\n\t                      weightFileReader.onload = function (event) {\n\t                        // tslint:disable-next-line:no-any\n\t                        var weightData = event.target.result;\n\t                        var index = paths.indexOf(path);\n\t                        perFileBuffers[index] = weightData;\n\n\t                        if (perFileBuffers.indexOf(null) === -1) {\n\t                          var result = {\n\t                            modelTopology: modelTopology,\n\t                            weightSpecs: weightSpecs,\n\t                            weightData: concatenateArrayBuffers(perFileBuffers),\n\t                            format: modelJSON.format,\n\t                            generatedBy: modelJSON.generatedBy,\n\t                            convertedBy: modelJSON.convertedBy\n\t                          };\n\n\t                          if (modelJSON.signature != null) {\n\t                            result.signature = modelJSON.signature;\n\t                          }\n\n\t                          if (modelJSON.userDefinedMetadata != null) {\n\t                            result.userDefinedMetadata = modelJSON.userDefinedMetadata;\n\t                          }\n\n\t                          if (modelJSON.modelInitializer != null) {\n\t                            result.modelInitializer = modelJSON.modelInitializer;\n\t                          }\n\n\t                          resolve(result);\n\t                        }\n\t                      };\n\n\t                      weightFileReader.onerror = function (error) {\n\t                        return reject(\"Failed to weights data from file of path '\" + path + \"'.\");\n\t                      };\n\n\t                      weightFileReader.readAsArrayBuffer(pathToFile[path]);\n\t                    });\n\t                  });\n\t                };\n\n\t                jsonReader.onerror = function (error) {\n\t                  return reject(\"Failed to read model topology and weights manifest JSON \" + (\"from file '\" + jsonFile.name + \"'. BrowserFiles supports loading \") + \"Keras-style tf.Model artifacts only.\");\n\t                };\n\n\t                jsonReader.readAsText(jsonFile);\n\t              }));\n\n\t            case 3:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function load() {\n\t      return _load.apply(this, arguments);\n\t    }\n\n\t    return load;\n\t  }()\n\t  /**\n\t   * Check the compatibility between weights manifest and weight files.\n\t   */\n\t  ;\n\n\t  _proto2.checkManifestAndWeightFiles = function checkManifestAndWeightFiles(manifest, files) {\n\t    var basenames = [];\n\t    var fileNames = files.map(function (file) {\n\t      return basename(file.name);\n\t    });\n\t    var pathToFile = {};\n\n\t    for (var _iterator = _createForOfIteratorHelperLoose(manifest), _step; !(_step = _iterator()).done;) {\n\t      var group = _step.value;\n\t      group.paths.forEach(function (path) {\n\t        var pathBasename = basename(path);\n\n\t        if (basenames.indexOf(pathBasename) !== -1) {\n\t          throw new Error(\"Duplicate file basename found in weights manifest: \" + (\"'\" + pathBasename + \"'\"));\n\t        }\n\n\t        basenames.push(pathBasename);\n\n\t        if (fileNames.indexOf(pathBasename) === -1) {\n\t          throw new Error(\"Weight file with basename '\" + pathBasename + \"' is not provided.\");\n\t        } else {\n\t          pathToFile[path] = files[fileNames.indexOf(pathBasename)];\n\t        }\n\t      });\n\t    }\n\n\t    if (basenames.length !== files.length) {\n\t      throw new Error(\"Mismatch in the number of files in weights manifest \" + (\"(\" + basenames.length + \") and the number of weight files provided \") + (\"(\" + files.length + \").\"));\n\t    }\n\n\t    return pathToFile;\n\t  };\n\n\t  return BrowserFiles;\n\t}();\n\n\tvar browserDownloadsRouter = function browserDownloadsRouter(url) {\n\t  if (!env().getBool('IS_BROWSER')) {\n\t    return null;\n\t  } else {\n\t    if (!Array.isArray(url) && url.startsWith(BrowserDownloads.URL_SCHEME)) {\n\t      return browserDownloads(url.slice(BrowserDownloads.URL_SCHEME.length));\n\t    } else {\n\t      return null;\n\t    }\n\t  }\n\t};\n\tIORouterRegistry.registerSaveRouter(browserDownloadsRouter);\n\t/**\n\t * Creates an IOHandler that triggers file downloads from the browser.\n\t *\n\t * The returned `IOHandler` instance can be used as model exporting methods such\n\t * as `tf.Model.save` and supports only saving.\n\t *\n\t * ```js\n\t * const model = tf.sequential();\n\t * model.add(tf.layers.dense(\n\t *     {units: 1, inputShape: [10], activation: 'sigmoid'}));\n\t * const saveResult = await model.save('downloads://mymodel');\n\t * // This will trigger downloading of two files:\n\t * //   'mymodel.json' and 'mymodel.weights.bin'.\n\t * console.log(saveResult);\n\t * ```\n\t *\n\t * @param fileNamePrefix Prefix name of the files to be downloaded. For use with\n\t *   `tf.Model`, `fileNamePrefix` should follow either of the following two\n\t *   formats:\n\t *   1. `null` or `undefined`, in which case the default file\n\t *      names will be used:\n\t *      - 'model.json' for the JSON file containing the model topology and\n\t *        weights manifest.\n\t *      - 'model.weights.bin' for the binary file containing the binary weight\n\t *        values.\n\t *   2. A single string or an Array of a single string, as the file name prefix.\n\t *      For example, if `'foo'` is provided, the downloaded JSON\n\t *      file and binary weights file will be named 'foo.json' and\n\t *      'foo.weights.bin', respectively.\n\t * @param config Additional configuration for triggering downloads.\n\t * @returns An instance of `BrowserDownloads` `IOHandler`.\n\t *\n\t * @doc {\n\t *   heading: 'Models',\n\t *   subheading: 'Loading',\n\t *   namespace: 'io',\n\t *   ignoreCI: true\n\t * }\n\t */\n\n\tfunction browserDownloads(fileNamePrefix) {\n\t  if (fileNamePrefix === void 0) {\n\t    fileNamePrefix = 'model';\n\t  }\n\n\t  return new BrowserDownloads(fileNamePrefix);\n\t}\n\t/**\n\t * Creates an IOHandler that loads model artifacts from user-selected files.\n\t *\n\t * This method can be used for loading from files such as user-selected files\n\t * in the browser.\n\t * When used in conjunction with `tf.loadLayersModel`, an instance of\n\t * `tf.LayersModel` (Keras-style) can be constructed from the loaded artifacts.\n\t *\n\t * ```js\n\t * // Note: This code snippet won't run properly without the actual file input\n\t * //   elements in the HTML DOM.\n\t *\n\t * // Suppose there are two HTML file input (`<input type=\"file\" ...>`)\n\t * // elements.\n\t * const uploadJSONInput = document.getElementById('upload-json');\n\t * const uploadWeightsInput = document.getElementById('upload-weights');\n\t * const model = await tf.loadLayersModel(tf.io.browserFiles(\n\t *     [uploadJSONInput.files[0], uploadWeightsInput.files[0]]));\n\t * ```\n\t *\n\t * @param files `File`s to load from. Currently, this function supports only\n\t *   loading from files that contain Keras-style models (i.e., `tf.Model`s), for\n\t *   which an `Array` of `File`s is expected (in that order):\n\t *   - A JSON file containing the model topology and weight manifest.\n\t *   - Optionally, One or more binary files containing the binary weights.\n\t *     These files must have names that match the paths in the `weightsManifest`\n\t *     contained by the aforementioned JSON file, or errors will be thrown\n\t *     during loading. These weights files have the same format as the ones\n\t *     generated by `tensorflowjs_converter` that comes with the `tensorflowjs`\n\t *     Python PIP package. If no weights files are provided, only the model\n\t *     topology will be loaded from the JSON file above.\n\t * @returns An instance of `Files` `IOHandler`.\n\t *\n\t * @doc {\n\t *   heading: 'Models',\n\t *   subheading: 'Loading',\n\t *   namespace: 'io',\n\t *   ignoreCI: true\n\t * }\n\t */\n\n\tfunction browserFiles(files) {\n\t  return new BrowserFiles(files);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Monitor Promise.all progress, fire onProgress callback function.\n\t *\n\t * @param promises Promise list going to be monitored\n\t * @param onProgress Callback function. Fired when a promise resolved.\n\t * @param startFraction Optional fraction start. Default to 0.\n\t * @param endFraction Optional fraction end. Default to 1.\n\t */\n\n\tfunction monitorPromisesProgress(promises, onProgress, startFraction, endFraction) {\n\t  checkPromises(promises);\n\t  startFraction = startFraction == null ? 0 : startFraction;\n\t  endFraction = endFraction == null ? 1 : endFraction;\n\t  checkFraction(startFraction, endFraction);\n\t  var resolvedPromise = 0;\n\n\t  var registerMonitor = function registerMonitor(promise) {\n\t    promise.then(function (value) {\n\t      var fraction = startFraction + ++resolvedPromise / promises.length * (endFraction - startFraction); // pass fraction as parameter to callback function.\n\n\t      onProgress(fraction);\n\t      return value;\n\t    });\n\t    return promise;\n\t  };\n\n\t  function checkPromises(promises) {\n\t    assert(promises != null && Array.isArray(promises) && promises.length > 0, function () {\n\t      return 'promises must be a none empty array';\n\t    });\n\t  }\n\n\t  function checkFraction(startFraction, endFraction) {\n\t    assert(startFraction >= 0 && startFraction <= 1, function () {\n\t      return \"Progress fraction must be in range [0, 1], but \" + (\"got startFraction \" + startFraction);\n\t    });\n\t    assert(endFraction >= 0 && endFraction <= 1, function () {\n\t      return \"Progress fraction must be in range [0, 1], but \" + (\"got endFraction \" + endFraction);\n\t    });\n\t    assert(endFraction >= startFraction, function () {\n\t      return \"startFraction must be no more than endFraction, but \" + (\"got startFraction \" + startFraction + \" and endFraction \") + (\"\" + endFraction);\n\t    });\n\t  }\n\n\t  return Promise.all(promises.map(registerMonitor));\n\t}\n\n\t/**\n\t * Reads binary weights data from a number of URLs.\n\t *\n\t * @param fetchURLs URLs to send the HTTP requests at, using `fetch` calls.\n\t * @param requestOptions RequestInit (options) for the HTTP requests.\n\t * @param fetchFunc Optional overriding value for the `window.fetch` function.\n\t * @param onProgress Optional, progress callback function, fired periodically\n\t *   before the load is completed.\n\t * @returns A `Promise` of an Array of `ArrayBuffer`. The Array has the same\n\t *   length as `fetchURLs`.\n\t */\n\n\tfunction loadWeightsAsArrayBuffer(_x, _x2) {\n\t  return _loadWeightsAsArrayBuffer.apply(this, arguments);\n\t}\n\t/**\n\t * Reads a weights manifest JSON configuration, fetches the weights and\n\t * returns them as `Tensor`s.\n\t *\n\t * @param manifest The weights manifest JSON.\n\t * @param filePathPrefix The path prefix for filenames given in the manifest.\n\t *     Defaults to the empty string.\n\t * @param weightNames The names of the weights to be fetched.\n\t */\n\n\tfunction _loadWeightsAsArrayBuffer() {\n\t  _loadWeightsAsArrayBuffer = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(fetchURLs, loadOptions) {\n\t    var fetchFunc, requests, fetchStartFraction, fetchEndFraction, responses, bufferPromises, bufferStartFraction, bufferEndFraction, buffers;\n\t    return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t      while (1) {\n\t        switch (_context2.prev = _context2.next) {\n\t          case 0:\n\t            if (loadOptions == null) {\n\t              loadOptions = {};\n\t            }\n\n\t            fetchFunc = loadOptions.fetchFunc == null ? env().platform.fetch : loadOptions.fetchFunc; // Create the requests for all of the weights in parallel.\n\n\t            requests = fetchURLs.map(function (fetchURL) {\n\t              return fetchFunc(fetchURL, loadOptions.requestInit, {\n\t                isBinary: true\n\t              });\n\t            });\n\t            fetchStartFraction = 0;\n\t            fetchEndFraction = 0.5;\n\n\t            if (!(loadOptions.onProgress == null)) {\n\t              _context2.next = 11;\n\t              break;\n\t            }\n\n\t            _context2.next = 8;\n\t            return Promise.all(requests);\n\n\t          case 8:\n\t            _context2.t0 = _context2.sent;\n\t            _context2.next = 14;\n\t            break;\n\n\t          case 11:\n\t            _context2.next = 13;\n\t            return monitorPromisesProgress(requests, loadOptions.onProgress, fetchStartFraction, fetchEndFraction);\n\n\t          case 13:\n\t            _context2.t0 = _context2.sent;\n\n\t          case 14:\n\t            responses = _context2.t0;\n\t            bufferPromises = responses.map(function (response) {\n\t              return response.arrayBuffer();\n\t            });\n\t            bufferStartFraction = 0.5;\n\t            bufferEndFraction = 1;\n\n\t            if (!(loadOptions.onProgress == null)) {\n\t              _context2.next = 24;\n\t              break;\n\t            }\n\n\t            _context2.next = 21;\n\t            return Promise.all(bufferPromises);\n\n\t          case 21:\n\t            _context2.t1 = _context2.sent;\n\t            _context2.next = 27;\n\t            break;\n\n\t          case 24:\n\t            _context2.next = 26;\n\t            return monitorPromisesProgress(bufferPromises, loadOptions.onProgress, bufferStartFraction, bufferEndFraction);\n\n\t          case 26:\n\t            _context2.t1 = _context2.sent;\n\n\t          case 27:\n\t            buffers = _context2.t1;\n\t            return _context2.abrupt(\"return\", buffers);\n\n\t          case 29:\n\t          case \"end\":\n\t            return _context2.stop();\n\t        }\n\t      }\n\t    }, _callee2);\n\t  }));\n\t  return _loadWeightsAsArrayBuffer.apply(this, arguments);\n\t}\n\n\tfunction loadWeights(_x3, _x4, _x5, _x6) {\n\t  return _loadWeights.apply(this, arguments);\n\t}\n\t/**\n\t * Creates a function, which reads a weights manifest JSON configuration,\n\t * fetches the weight files using the specified function and returns them as\n\t * `Tensor`s.\n\t *\n\t * ```js\n\t * // example for creating a nodejs weight loader, which reads the weight files\n\t * // from disk using fs.readFileSync\n\t *\n\t * import * as fs from 'fs'\n\t *\n\t * const fetchWeightsFromDisk = (filePaths: string[]) =>\n\t *   filePaths.map(filePath => fs.readFileSync(filePath).buffer)\n\t *\n\t * const loadWeights = tf.io.weightsLoaderFactory(fetchWeightsFromDisk)\n\t *\n\t * const manifest = JSON.parse(\n\t *   fs.readFileSync('./my_model-weights_manifest').toString()\n\t * )\n\t * const weightMap = await loadWeights(manifest, './')\n\t * ```\n\t * @param fetchWeightsFunction The function used for fetching the weight files.\n\t * @returns Weight loading function.\n\t */\n\n\tfunction _loadWeights() {\n\t  _loadWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(manifest, filePathPrefix, weightNames, requestInit) {\n\t    var fetchWeights, loadWeights;\n\t    return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t      while (1) {\n\t        switch (_context3.prev = _context3.next) {\n\t          case 0:\n\t            if (filePathPrefix === void 0) {\n\t              filePathPrefix = '';\n\t            }\n\n\t            // TODO(nsthorat): Groups are currently fetched atomically. If you need a\n\t            // single weight from a group, the whole group will be fetched. At a future\n\t            // date, we should support fetching only the individual shards within a\n\t            // group that are needed to reconstruct the requested weight.\n\t            // TODO(cais): Use `decodeWeights` for implementation.\n\t            fetchWeights = function fetchWeights(fetchUrls) {\n\t              return loadWeightsAsArrayBuffer(fetchUrls, {\n\t                requestInit: requestInit\n\t              });\n\t            };\n\n\t            loadWeights = weightsLoaderFactory(fetchWeights);\n\t            return _context3.abrupt(\"return\", loadWeights(manifest, filePathPrefix, weightNames));\n\n\t          case 4:\n\t          case \"end\":\n\t            return _context3.stop();\n\t        }\n\t      }\n\t    }, _callee3);\n\t  }));\n\t  return _loadWeights.apply(this, arguments);\n\t}\n\n\tfunction weightsLoaderFactory(fetchWeightsFunction) {\n\t  return /*#__PURE__*/function () {\n\t    var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(manifest, filePathPrefix, weightNames) {\n\t      var groupIndicesToFetchMap, groupWeightsToFetch, weightsFound, allManifestWeightNames, weightsNotFound, groupIndicesToFetch, fetchUrls, buffers, weightsTensorMap, bufferIndexOffset;\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              if (filePathPrefix === void 0) {\n\t                filePathPrefix = '';\n\t              }\n\n\t              // Collect all the groups, weights, and their relative offsets to be\n\t              // fetched.\n\t              groupIndicesToFetchMap = manifest.map(function () {\n\t                return false;\n\t              });\n\t              groupWeightsToFetch = {};\n\t              weightsFound = weightNames != null ? weightNames.map(function () {\n\t                return false;\n\t              }) : [];\n\t              allManifestWeightNames = [];\n\t              manifest.forEach(function (manifestGroupConfig, groupIndex) {\n\t                var groupOffset = 0;\n\t                manifestGroupConfig.weights.forEach(function (weightsEntry) {\n\t                  var rawDtype = 'quantization' in weightsEntry ? weightsEntry.quantization.dtype : weightsEntry.dtype;\n\t                  var weightsBytes = DTYPE_VALUE_SIZE_MAP[rawDtype] * sizeFromShape(weightsEntry.shape);\n\n\t                  var enqueueWeightsForFetchingFn = function enqueueWeightsForFetchingFn() {\n\t                    groupIndicesToFetchMap[groupIndex] = true;\n\n\t                    if (groupWeightsToFetch[groupIndex] == null) {\n\t                      groupWeightsToFetch[groupIndex] = [];\n\t                    }\n\n\t                    groupWeightsToFetch[groupIndex].push({\n\t                      manifestEntry: weightsEntry,\n\t                      groupOffset: groupOffset,\n\t                      sizeBytes: weightsBytes\n\t                    });\n\t                  };\n\n\t                  if (weightNames != null) {\n\t                    weightNames.forEach(function (weightName, weightIndex) {\n\t                      if (weightName === weightsEntry.name) {\n\t                        enqueueWeightsForFetchingFn();\n\t                        weightsFound[weightIndex] = true;\n\t                      }\n\t                    });\n\t                  } else {\n\t                    enqueueWeightsForFetchingFn();\n\t                  }\n\n\t                  allManifestWeightNames.push(weightsEntry.name);\n\t                  groupOffset += weightsBytes;\n\t                });\n\t              });\n\n\t              if (weightsFound.every(function (found) {\n\t                return found;\n\t              })) {\n\t                _context.next = 9;\n\t                break;\n\t              }\n\n\t              weightsNotFound = weightNames.filter(function (_, i) {\n\t                return !weightsFound[i];\n\t              });\n\t              throw new Error(\"Could not find weights in manifest with names: \" + (weightsNotFound.join(', ') + \". \\n\") + \"Manifest JSON has weights with names: \" + (allManifestWeightNames.join(', ') + \".\"));\n\n\t            case 9:\n\t              // Convert the one-hot boolean groupId => shouldFetch map to a list of group\n\t              // IDs.\n\t              groupIndicesToFetch = groupIndicesToFetchMap.reduce(function (accumulator, shouldFetch, i) {\n\t                if (shouldFetch) {\n\t                  accumulator.push(i);\n\t                }\n\n\t                return accumulator;\n\t              }, []);\n\t              fetchUrls = [];\n\t              groupIndicesToFetch.forEach(function (i) {\n\t                manifest[i].paths.forEach(function (filepath) {\n\t                  var fetchUrl = filePathPrefix + (!filePathPrefix.endsWith('/') ? '/' : '') + filepath;\n\t                  fetchUrls.push(fetchUrl);\n\t                });\n\t              });\n\t              _context.next = 14;\n\t              return fetchWeightsFunction(fetchUrls);\n\n\t            case 14:\n\t              buffers = _context.sent;\n\t              weightsTensorMap = {};\n\t              bufferIndexOffset = 0;\n\t              groupIndicesToFetch.forEach(function (i) {\n\t                var numBuffers = manifest[i].paths.length;\n\t                var groupBytes = 0;\n\n\t                for (var _i = 0; _i < numBuffers; _i++) {\n\t                  groupBytes += buffers[bufferIndexOffset + _i].byteLength;\n\t                } // Create a buffer for the whole group.\n\n\n\t                var groupBuffer = new ArrayBuffer(groupBytes);\n\t                var groupByteBuffer = new Uint8Array(groupBuffer);\n\t                var groupBufferOffset = 0;\n\n\t                for (var _i2 = 0; _i2 < numBuffers; _i2++) {\n\t                  var buffer = new Uint8Array(buffers[bufferIndexOffset + _i2]);\n\t                  groupByteBuffer.set(buffer, groupBufferOffset);\n\t                  groupBufferOffset += buffer.byteLength;\n\t                }\n\n\t                var weightsEntries = groupWeightsToFetch[i];\n\t                weightsEntries.forEach(function (weightsEntry) {\n\t                  var byteBuffer = groupBuffer.slice(weightsEntry.groupOffset, weightsEntry.groupOffset + weightsEntry.sizeBytes);\n\t                  var nameToTensorMap = decodeWeights(byteBuffer, [weightsEntry.manifestEntry]);\n\n\t                  for (var name in nameToTensorMap) {\n\t                    weightsTensorMap[name] = nameToTensorMap[name];\n\t                  }\n\t                });\n\t                bufferIndexOffset += numBuffers;\n\t              });\n\t              return _context.abrupt(\"return\", weightsTensorMap);\n\n\t            case 19:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee);\n\t    }));\n\n\t    return function (_x7, _x8, _x9) {\n\t      return _ref.apply(this, arguments);\n\t    };\n\t  }();\n\t}\n\n\tvar OCTET_STREAM_MIME_TYPE = 'application/octet-stream';\n\tvar JSON_TYPE = 'application/json';\n\tvar HTTPRequest = /*#__PURE__*/function () {\n\t  function HTTPRequest(path, loadOptions) {\n\t    this.DEFAULT_METHOD = 'POST';\n\n\t    if (loadOptions == null) {\n\t      loadOptions = {};\n\t    }\n\n\t    this.weightPathPrefix = loadOptions.weightPathPrefix;\n\t    this.onProgress = loadOptions.onProgress;\n\t    this.weightUrlConverter = loadOptions.weightUrlConverter;\n\n\t    if (loadOptions.fetchFunc != null) {\n\t      assert(typeof loadOptions.fetchFunc === 'function', function () {\n\t        return 'Must pass a function that matches the signature of ' + '`fetch` (see ' + 'https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)';\n\t      });\n\t      this.fetch = loadOptions.fetchFunc;\n\t    } else {\n\t      this.fetch = env().platform.fetch;\n\t    }\n\n\t    assert(path != null && path.length > 0, function () {\n\t      return 'URL path for http must not be null, undefined or ' + 'empty.';\n\t    });\n\n\t    if (Array.isArray(path)) {\n\t      assert(path.length === 2, function () {\n\t        return 'URL paths for http must have a length of 2, ' + (\"(actual length is \" + path.length + \").\");\n\t      });\n\t    }\n\n\t    this.path = path;\n\n\t    if (loadOptions.requestInit != null && loadOptions.requestInit.body != null) {\n\t      throw new Error('requestInit is expected to have no pre-existing body, but has one.');\n\t    }\n\n\t    this.requestInit = loadOptions.requestInit || {};\n\t  }\n\n\t  var _proto = HTTPRequest.prototype;\n\n\t  _proto.save = /*#__PURE__*/function () {\n\t    var _save = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(modelArtifacts) {\n\t      var init, weightsManifest, modelTopologyAndWeightManifest, response;\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              if (!(modelArtifacts.modelTopology instanceof ArrayBuffer)) {\n\t                _context.next = 2;\n\t                break;\n\t              }\n\n\t              throw new Error('BrowserHTTPRequest.save() does not support saving model topology ' + 'in binary formats yet.');\n\n\t            case 2:\n\t              init = Object.assign({\n\t                method: this.DEFAULT_METHOD\n\t              }, this.requestInit);\n\t              init.body = new FormData();\n\t              weightsManifest = [{\n\t                paths: ['./model.weights.bin'],\n\t                weights: modelArtifacts.weightSpecs\n\t              }];\n\t              modelTopologyAndWeightManifest = {\n\t                modelTopology: modelArtifacts.modelTopology,\n\t                format: modelArtifacts.format,\n\t                generatedBy: modelArtifacts.generatedBy,\n\t                convertedBy: modelArtifacts.convertedBy,\n\t                weightsManifest: weightsManifest\n\t              };\n\n\t              if (modelArtifacts.signature != null) {\n\t                modelTopologyAndWeightManifest.signature = modelArtifacts.signature;\n\t              }\n\n\t              if (modelArtifacts.userDefinedMetadata != null) {\n\t                modelTopologyAndWeightManifest.userDefinedMetadata = modelArtifacts.userDefinedMetadata;\n\t              }\n\n\t              if (modelArtifacts.modelInitializer != null) {\n\t                modelTopologyAndWeightManifest.modelInitializer = modelArtifacts.modelInitializer;\n\t              }\n\n\t              init.body.append('model.json', new Blob([JSON.stringify(modelTopologyAndWeightManifest)], {\n\t                type: JSON_TYPE\n\t              }), 'model.json');\n\n\t              if (modelArtifacts.weightData != null) {\n\t                init.body.append('model.weights.bin', new Blob([modelArtifacts.weightData], {\n\t                  type: OCTET_STREAM_MIME_TYPE\n\t                }), 'model.weights.bin');\n\t              }\n\n\t              _context.next = 13;\n\t              return this.fetch(this.path, init);\n\n\t            case 13:\n\t              response = _context.sent;\n\n\t              if (!response.ok) {\n\t                _context.next = 18;\n\t                break;\n\t              }\n\n\t              return _context.abrupt(\"return\", {\n\t                modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts),\n\t                responses: [response]\n\t              });\n\n\t            case 18:\n\t              throw new Error(\"BrowserHTTPRequest.save() failed due to HTTP response status \" + (response.status + \".\"));\n\n\t            case 19:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function save(_x) {\n\t      return _save.apply(this, arguments);\n\t    }\n\n\t    return save;\n\t  }()\n\t  /**\n\t   * Load model artifacts via HTTP request(s).\n\t   *\n\t   * See the documentation to `tf.io.http` for details on the saved\n\t   * artifacts.\n\t   *\n\t   * @returns The loaded model artifacts (if loading succeeds).\n\t   */\n\t  ;\n\n\t  _proto.load =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _load = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n\t      var modelConfigRequest, modelConfig, message, modelTopology, weightsManifest, generatedBy, convertedBy, format, signature, userDefinedMetadata, weightSpecs, weightData, results, artifacts, initializer;\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              _context2.next = 2;\n\t              return this.fetch(this.path, this.requestInit);\n\n\t            case 2:\n\t              modelConfigRequest = _context2.sent;\n\n\t              if (modelConfigRequest.ok) {\n\t                _context2.next = 5;\n\t                break;\n\t              }\n\n\t              throw new Error(\"Request to \" + this.path + \" failed with status code \" + (modelConfigRequest.status + \". Please verify this URL points to \") + \"the model JSON of the model to load.\");\n\n\t            case 5:\n\t              _context2.prev = 5;\n\t              _context2.next = 8;\n\t              return modelConfigRequest.json();\n\n\t            case 8:\n\t              modelConfig = _context2.sent;\n\t              _context2.next = 16;\n\t              break;\n\n\t            case 11:\n\t              _context2.prev = 11;\n\t              _context2.t0 = _context2[\"catch\"](5);\n\t              message = \"Failed to parse model JSON of response from \" + this.path + \".\"; // TODO(nsthorat): Remove this after some time when we're comfortable that\n\t              // .pb files are mostly gone.\n\n\t              if (this.path.endsWith('.pb')) {\n\t                message += ' Your path contains a .pb file extension. ' + 'Support for .pb models have been removed in TensorFlow.js 1.0 ' + 'in favor of .json models. You can re-convert your Python ' + 'TensorFlow model using the TensorFlow.js 1.0 conversion scripts ' + 'or you can convert your.pb models with the \\'pb2json\\'' + 'NPM script in the tensorflow/tfjs-converter repository.';\n\t              } else {\n\t                message += ' Please make sure the server is serving valid ' + 'JSON for this request.';\n\t              }\n\n\t              throw new Error(message);\n\n\t            case 16:\n\t              modelTopology = modelConfig.modelTopology;\n\t              weightsManifest = modelConfig.weightsManifest;\n\t              generatedBy = modelConfig.generatedBy;\n\t              convertedBy = modelConfig.convertedBy;\n\t              format = modelConfig.format;\n\t              signature = modelConfig.signature;\n\t              userDefinedMetadata = modelConfig.userDefinedMetadata; // We do not allow both modelTopology and weightsManifest to be missing.\n\n\t              if (!(modelTopology == null && weightsManifest == null)) {\n\t                _context2.next = 25;\n\t                break;\n\t              }\n\n\t              throw new Error(\"The JSON from HTTP path \" + this.path + \" contains neither model \" + \"topology or manifest for weights.\");\n\n\t            case 25:\n\t              if (!(weightsManifest != null)) {\n\t                _context2.next = 31;\n\t                break;\n\t              }\n\n\t              _context2.next = 28;\n\t              return this.loadWeights(weightsManifest);\n\n\t            case 28:\n\t              results = _context2.sent;\n\t              weightSpecs = results[0];\n\t              weightData = results[1];\n\n\t            case 31:\n\t              artifacts = {\n\t                modelTopology: modelTopology,\n\t                weightSpecs: weightSpecs,\n\t                weightData: weightData,\n\t                generatedBy: generatedBy,\n\t                convertedBy: convertedBy,\n\t                format: format\n\t              };\n\n\t              if (signature != null) {\n\t                artifacts.signature = signature;\n\t              }\n\n\t              if (userDefinedMetadata != null) {\n\t                artifacts.userDefinedMetadata = userDefinedMetadata;\n\t              }\n\n\t              initializer = modelConfig.modelInitializer;\n\n\t              if (initializer) {\n\t                artifacts.modelInitializer = initializer;\n\t              }\n\n\t              return _context2.abrupt(\"return\", artifacts);\n\n\t            case 37:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this, [[5, 11]]);\n\t    }));\n\n\t    function load() {\n\t      return _load.apply(this, arguments);\n\t    }\n\n\t    return load;\n\t  }();\n\n\t  _proto.loadWeights = /*#__PURE__*/function () {\n\t    var _loadWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(weightsManifest) {\n\t      var weightPath, _parseUrl, prefix, suffix, pathPrefix, weightSpecs, _iterator, _step, entry, fetchURLs, urlPromises, _iterator2, _step2, weightsGroup, _iterator3, _step3, path, buffers;\n\n\t      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t        while (1) {\n\t          switch (_context3.prev = _context3.next) {\n\t            case 0:\n\t              weightPath = Array.isArray(this.path) ? this.path[1] : this.path;\n\t              _parseUrl = parseUrl(weightPath), prefix = _parseUrl[0], suffix = _parseUrl[1];\n\t              pathPrefix = this.weightPathPrefix || prefix;\n\t              weightSpecs = [];\n\n\t              for (_iterator = _createForOfIteratorHelperLoose(weightsManifest); !(_step = _iterator()).done;) {\n\t                entry = _step.value;\n\t                weightSpecs.push.apply(weightSpecs, entry.weights);\n\t              }\n\n\t              fetchURLs = [];\n\t              urlPromises = [];\n\n\t              for (_iterator2 = _createForOfIteratorHelperLoose(weightsManifest); !(_step2 = _iterator2()).done;) {\n\t                weightsGroup = _step2.value;\n\n\t                for (_iterator3 = _createForOfIteratorHelperLoose(weightsGroup.paths); !(_step3 = _iterator3()).done;) {\n\t                  path = _step3.value;\n\n\t                  if (this.weightUrlConverter != null) {\n\t                    urlPromises.push(this.weightUrlConverter(path));\n\t                  } else {\n\t                    fetchURLs.push(pathPrefix + path + suffix);\n\t                  }\n\t                }\n\t              }\n\n\t              if (!this.weightUrlConverter) {\n\t                _context3.next = 15;\n\t                break;\n\t              }\n\n\t              _context3.t0 = fetchURLs.push;\n\t              _context3.t1 = fetchURLs;\n\t              _context3.next = 13;\n\t              return Promise.all(urlPromises);\n\n\t            case 13:\n\t              _context3.t2 = _context3.sent;\n\n\t              _context3.t0.apply.call(_context3.t0, _context3.t1, _context3.t2);\n\n\t            case 15:\n\t              _context3.next = 17;\n\t              return loadWeightsAsArrayBuffer(fetchURLs, {\n\t                requestInit: this.requestInit,\n\t                fetchFunc: this.fetch,\n\t                onProgress: this.onProgress\n\t              });\n\n\t            case 17:\n\t              buffers = _context3.sent;\n\t              return _context3.abrupt(\"return\", [weightSpecs, concatenateArrayBuffers(buffers)]);\n\n\t            case 19:\n\t            case \"end\":\n\t              return _context3.stop();\n\t          }\n\t        }\n\t      }, _callee3, this);\n\t    }));\n\n\t    function loadWeights(_x2) {\n\t      return _loadWeights.apply(this, arguments);\n\t    }\n\n\t    return loadWeights;\n\t  }();\n\n\t  return HTTPRequest;\n\t}();\n\tHTTPRequest.URL_SCHEME_REGEX = /^https?:\\/\\//;\n\t/**\n\t * Extract the prefix and suffix of the url, where the prefix is the path before\n\t * the last file, and suffix is the search params after the last file.\n\t * ```\n\t * const url = 'http://tfhub.dev/model/1/tensorflowjs_model.pb?tfjs-format=file'\n\t * [prefix, suffix] = parseUrl(url)\n\t * // prefix = 'http://tfhub.dev/model/1/'\n\t * // suffix = '?tfjs-format=file'\n\t * ```\n\t * @param url the model url to be parsed.\n\t */\n\n\tfunction parseUrl(url) {\n\t  var lastSlash = url.lastIndexOf('/');\n\t  var lastSearchParam = url.lastIndexOf('?');\n\t  var prefix = url.substring(0, lastSlash);\n\t  var suffix = lastSearchParam > lastSlash ? url.substring(lastSearchParam) : '';\n\t  return [prefix + '/', suffix];\n\t}\n\tfunction isHTTPScheme(url) {\n\t  return url.match(HTTPRequest.URL_SCHEME_REGEX) != null;\n\t}\n\tvar httpRouter = function httpRouter(url, loadOptions) {\n\t  if (typeof fetch === 'undefined' && (loadOptions == null || loadOptions.fetchFunc == null)) {\n\t    // `http` uses `fetch` or `node-fetch`, if one wants to use it in\n\t    // an environment that is not the browser or node they have to setup a\n\t    // global fetch polyfill.\n\t    return null;\n\t  } else {\n\t    var isHTTP = true;\n\n\t    if (Array.isArray(url)) {\n\t      isHTTP = url.every(function (urlItem) {\n\t        return isHTTPScheme(urlItem);\n\t      });\n\t    } else {\n\t      isHTTP = isHTTPScheme(url);\n\t    }\n\n\t    if (isHTTP) {\n\t      return http(url, loadOptions);\n\t    }\n\t  }\n\n\t  return null;\n\t};\n\tIORouterRegistry.registerSaveRouter(httpRouter);\n\tIORouterRegistry.registerLoadRouter(httpRouter);\n\t/**\n\t * Creates an IOHandler subtype that sends model artifacts to HTTP server.\n\t *\n\t * An HTTP request of the `multipart/form-data` mime type will be sent to the\n\t * `path` URL. The form data includes artifacts that represent the topology\n\t * and/or weights of the model. In the case of Keras-style `tf.Model`, two\n\t * blobs (files) exist in form-data:\n\t *   - A JSON file consisting of `modelTopology` and `weightsManifest`.\n\t *   - A binary weights file consisting of the concatenated weight values.\n\t * These files are in the same format as the one generated by\n\t * [tfjs_converter](https://js.tensorflow.org/tutorials/import-keras.html).\n\t *\n\t * The following code snippet exemplifies the client-side code that uses this\n\t * function:\n\t *\n\t * ```js\n\t * const model = tf.sequential();\n\t * model.add(\n\t *     tf.layers.dense({units: 1, inputShape: [100], activation: 'sigmoid'}));\n\t *\n\t * const saveResult = await model.save(tf.io.http(\n\t *     'http://model-server:5000/upload', {requestInit: {method: 'PUT'}}));\n\t * console.log(saveResult);\n\t * ```\n\t *\n\t * If the default `POST` method is to be used, without any custom parameters\n\t * such as headers, you can simply pass an HTTP or HTTPS URL to `model.save`:\n\t *\n\t * ```js\n\t * const saveResult = await model.save('http://model-server:5000/upload');\n\t * ```\n\t *\n\t * The following GitHub Gist\n\t * https://gist.github.com/dsmilkov/1b6046fd6132d7408d5257b0976f7864\n\t * implements a server based on [flask](https://github.com/pallets/flask) that\n\t * can receive the request. Upon receiving the model artifacts via the requst,\n\t * this particular server reconsistutes instances of [Keras\n\t * Models](https://keras.io/models/model/) in memory.\n\t *\n\t *\n\t * @param path A URL path to the model.\n\t *   Can be an absolute HTTP path (e.g.,\n\t *   'http://localhost:8000/model-upload)') or a relative path (e.g.,\n\t *   './model-upload').\n\t * @param requestInit Request configurations to be used when sending\n\t *    HTTP request to server using `fetch`. It can contain fields such as\n\t *    `method`, `credentials`, `headers`, `mode`, etc. See\n\t *    https://developer.mozilla.org/en-US/docs/Web/API/Request/Request\n\t *    for more information. `requestInit` must not have a body, because the\n\t * body will be set by TensorFlow.js. File blobs representing the model\n\t * topology (filename: 'model.json') and the weights of the model (filename:\n\t * 'model.weights.bin') will be appended to the body. If `requestInit` has a\n\t * `body`, an Error will be thrown.\n\t * @param loadOptions Optional configuration for the loading. It includes the\n\t *   following fields:\n\t *   - weightPathPrefix Optional, this specifies the path prefix for weight\n\t *     files, by default this is calculated from the path param.\n\t *   - fetchFunc Optional, custom `fetch` function. E.g., in Node.js,\n\t *     the `fetch` from node-fetch can be used here.\n\t *   - onProgress Optional, progress callback function, fired periodically\n\t *     before the load is completed.\n\t * @returns An instance of `IOHandler`.\n\t *\n\t * @doc {\n\t *   heading: 'Models',\n\t *   subheading: 'Loading',\n\t *   namespace: 'io',\n\t *   ignoreCI: true\n\t * }\n\t */\n\n\tfunction http(path, loadOptions) {\n\t  return new HTTPRequest(path, loadOptions);\n\t}\n\t/**\n\t * Deprecated. Use `tf.io.http`.\n\t * @param path\n\t * @param loadOptions\n\t */\n\n\tfunction browserHTTPRequest(path, loadOptions) {\n\t  return http(path, loadOptions);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar PassthroughLoader = /*#__PURE__*/function () {\n\t  function PassthroughLoader(modelArtifacts) {\n\t    this.modelArtifacts = modelArtifacts;\n\t  }\n\n\t  var _proto = PassthroughLoader.prototype;\n\n\t  _proto.load = /*#__PURE__*/function () {\n\t    var _load = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              return _context.abrupt(\"return\", this.modelArtifacts);\n\n\t            case 1:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function load() {\n\t      return _load.apply(this, arguments);\n\t    }\n\n\t    return load;\n\t  }();\n\n\t  return PassthroughLoader;\n\t}();\n\n\tvar PassthroughSaver = /*#__PURE__*/function () {\n\t  function PassthroughSaver(saveHandler) {\n\t    this.saveHandler = saveHandler;\n\t  }\n\n\t  var _proto2 = PassthroughSaver.prototype;\n\n\t  _proto2.save = /*#__PURE__*/function () {\n\t    var _save = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(modelArtifacts) {\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              return _context2.abrupt(\"return\", this.saveHandler(modelArtifacts));\n\n\t            case 1:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function save(_x) {\n\t      return _save.apply(this, arguments);\n\t    }\n\n\t    return save;\n\t  }();\n\n\t  return PassthroughSaver;\n\t}();\n\t/**\n\t * Creates an IOHandler that loads model artifacts from memory.\n\t *\n\t * When used in conjunction with `tf.loadLayersModel`, an instance of\n\t * `tf.LayersModel` (Keras-style) can be constructed from the loaded artifacts.\n\t *\n\t * ```js\n\t * const model = await tf.loadLayersModel(tf.io.fromMemory(\n\t *     modelTopology, weightSpecs, weightData));\n\t * ```\n\t *\n\t * @param modelArtifacts a object containing model topology (i.e., parsed from\n\t *   the JSON format).\n\t * @param weightSpecs An array of `WeightsManifestEntry` objects describing the\n\t *   names, shapes, types, and quantization of the weight data.\n\t * @param weightData A single `ArrayBuffer` containing the weight data,\n\t *   concatenated in the order described by the weightSpecs.\n\t * @param trainingConfig Model training configuration. Optional.\n\t *\n\t * @returns A passthrough `IOHandler` that simply loads the provided data.\n\t */\n\n\n\tfunction fromMemory(modelArtifacts, weightSpecs, weightData, trainingConfig) {\n\t  if (arguments.length === 1) {\n\t    var isModelArtifacts = modelArtifacts.modelTopology != null || modelArtifacts.weightSpecs != null;\n\n\t    if (isModelArtifacts) {\n\t      return new PassthroughLoader(modelArtifacts);\n\t    } else {\n\t      // Legacy support: with only modelTopology.\n\t      // TODO(cais): Remove this deprecated API.\n\t      console.warn('Please call tf.io.fromMemory() with only one argument. ' + 'The argument should be of type ModelArtifacts. ' + 'The multi-argument signature of tf.io.fromMemory() has been ' + 'deprecated and will be removed in a future release.');\n\t      return new PassthroughLoader({\n\t        modelTopology: modelArtifacts\n\t      });\n\t    }\n\t  } else {\n\t    // Legacy support.\n\t    // TODO(cais): Remove this deprecated API.\n\t    console.warn('Please call tf.io.fromMemory() with only one argument. ' + 'The argument should be of type ModelArtifacts. ' + 'The multi-argument signature of tf.io.fromMemory() has been ' + 'deprecated and will be removed in a future release.');\n\t    return new PassthroughLoader({\n\t      modelTopology: modelArtifacts,\n\t      weightSpecs: weightSpecs,\n\t      weightData: weightData,\n\t      trainingConfig: trainingConfig\n\t    });\n\t  }\n\t}\n\t/**\n\t * Creates an IOHandler that passes saved model artifacts to a callback.\n\t *\n\t * ```js\n\t * function handleSave(artifacts) {\n\t *   // ... do something with the artifacts ...\n\t *   return {modelArtifactsInfo: {...}, ...};\n\t * }\n\t *\n\t * const saveResult = model.save(tf.io.withSaveHandler(handleSave));\n\t * ```\n\t *\n\t * @param saveHandler A function that accepts a `ModelArtifacts` and returns a\n\t *     `SaveResult`.\n\t */\n\n\tfunction withSaveHandler(saveHandler) {\n\t  return new PassthroughSaver(saveHandler);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tvar io = {\n\t\t__proto__: null,\n\t\tbrowserFiles: browserFiles,\n\t\tbrowserHTTPRequest: browserHTTPRequest,\n\t\tconcatenateArrayBuffers: concatenateArrayBuffers,\n\t\tdecodeWeights: decodeWeights,\n\t\tencodeWeights: encodeWeights,\n\t\tfromMemory: fromMemory,\n\t\tgetLoadHandlers: getLoadHandlers,\n\t\tgetModelArtifactsInfoForJSON: getModelArtifactsInfoForJSON,\n\t\tgetSaveHandlers: getSaveHandlers,\n\t\thttp: http,\n\t\tisHTTPScheme: isHTTPScheme,\n\t\tloadWeights: loadWeights,\n\t\tregisterLoadRouter: registerLoadRouter,\n\t\tregisterSaveRouter: registerSaveRouter,\n\t\tweightsLoaderFactory: weightsLoaderFactory,\n\t\twithSaveHandler: withSaveHandler,\n\t\tcopyModel: copyModel,\n\t\tlistModels: listModels,\n\t\tmoveModel: moveModel,\n\t\tremoveModel: removeModel\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the dot product of two matrices, A * B. These must be matrices.\n\t *\n\t * ```js\n\t * const a = tf.tensor2d([1, 2], [1, 2]);\n\t * const b = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n\t *\n\t * a.matMul(b).print();  // or tf.matMul(a, b)\n\t * ```\n\t * @param a First matrix in dot product operation.\n\t * @param b Second matrix in dot product operation.\n\t * @param transposeA If true, `a` is transposed before multiplication.\n\t * @param transposeB If true, `b` is transposed before multiplication.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Matrices'}\n\t */\n\n\tfunction matMul_(a, b, transposeA, transposeB) {\n\t  if (transposeA === void 0) {\n\t    transposeA = false;\n\t  }\n\n\t  if (transposeB === void 0) {\n\t    transposeB = false;\n\t  }\n\n\t  var $a = convertToTensor(a, 'a', 'matMul');\n\t  var $b = convertToTensor(b, 'b', 'matMul');\n\n\t  var _makeTypesMatch = makeTypesMatch($a, $b);\n\n\t  $a = _makeTypesMatch[0];\n\t  $b = _makeTypesMatch[1];\n\t  var inputs = {\n\t    a: $a,\n\t    b: $b\n\t  };\n\t  var attrs = {\n\t    transposeA: transposeA,\n\t    transposeB: transposeB\n\t  };\n\t  return ENGINE.runKernel(BatchMatMul, inputs, attrs);\n\t}\n\n\tvar matMul = op({\n\t  matMul_: matMul_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates a one-hot `tf.Tensor`. The locations represented by `indices` take\n\t * value `onValue` (defaults to 1), while all other locations take value\n\t * `offValue` (defaults to 0). If `indices` is rank `R`, the output has rank\n\t * `R+1` with the last axis of size `depth`.\n\t *\n\t * ```js\n\t * tf.oneHot(tf.tensor1d([0, 1], 'int32'), 3).print();\n\t * ```\n\t *\n\t * @param indices `tf.Tensor` of indices with dtype `int32`.\n\t * @param depth The depth of the one hot dimension.\n\t * @param onValue A number used to fill in the output when the index matches\n\t * the location.\n\t * @param offValue A number used to fill in the output when the index does\n\t *     not match the location.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction oneHot_(indices, depth, onValue, offValue) {\n\t  if (onValue === void 0) {\n\t    onValue = 1;\n\t  }\n\n\t  if (offValue === void 0) {\n\t    offValue = 0;\n\t  }\n\n\t  if (depth < 2) {\n\t    throw new Error(\"Error in oneHot: depth must be >=2, but it is \" + depth);\n\t  }\n\n\t  var $indices = convertToTensor(indices, 'indices', 'oneHot', 'int32');\n\t  var inputs = {\n\t    indices: $indices\n\t  };\n\t  var attrs = {\n\t    depth: depth,\n\t    onValue: onValue,\n\t    offValue: offValue\n\t  };\n\t  return ENGINE.runKernel(OneHot, inputs, attrs);\n\t}\n\n\tvar oneHot = op({\n\t  oneHot_: oneHot_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Transposes the `tf.Tensor`. Permutes the dimensions according to `perm`.\n\t *\n\t * The returned `tf.Tensor`'s dimension `i` will correspond to the input\n\t * dimension `perm[i]`. If `perm` is not given, it is set to `[n-1...0]`,\n\t * where `n` is the rank of the input `tf.Tensor`. Hence by default, this\n\t * operation performs a regular matrix transpose on 2-D input `tf.Tensor`s.\n\t *\n\t * ```js\n\t * const a = tf.tensor2d([1, 2, 3, 4, 5, 6], [2, 3]);\n\t *\n\t * a.transpose().print();  // or tf.transpose(a)\n\t * ```\n\t *\n\t * @param x The tensor to transpose.\n\t * @param perm The permutation of the dimensions of a.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Matrices'}\n\t */\n\n\tfunction transpose_(x, perm) {\n\t  var $x = convertToTensor(x, 'x', 'transpose');\n\n\t  if (perm == null) {\n\t    perm = $x.shape.map(function (s, i) {\n\t      return i;\n\t    }).reverse();\n\t  }\n\n\t  assert($x.rank === perm.length, function () {\n\t    return \"Error in transpose: rank of input \" + $x.rank + \" \" + (\"must match length of perm \" + perm + \".\");\n\t  });\n\t  perm.forEach(function (axis) {\n\t    assert(axis >= 0 && axis < $x.rank, function () {\n\t      return \"All entries in 'perm' must be between 0 and \" + ($x.rank - 1) + (\" but got \" + perm);\n\t    });\n\t  });\n\n\t  if ($x.rank <= 1) {\n\t    return $x.clone();\n\t  }\n\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    perm: perm\n\t  };\n\t  return ENGINE.runKernel(Transpose, inputs, attrs);\n\t}\n\n\tvar transpose = op({\n\t  transpose_: transpose_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the confusion matrix from true labels and predicted labels.\n\t *\n\t * ```js\n\t * const labels = tf.tensor1d([0, 1, 2, 1, 0], 'int32');\n\t * const predictions = tf.tensor1d([0, 2, 2, 1, 0], 'int32');\n\t * const numClasses = 3;\n\t * const out = tf.math.confusionMatrix(labels, predictions, numClasses);\n\t * out.print();\n\t * // Expected output matrix:\n\t * // [[2, 0, 0],\n\t * //  [0, 1, 1],\n\t * //  [0, 0, 1]]\n\t * ```\n\t *\n\t * @param labels The target labels, assumed to be 0-based integers\n\t *   for the classes. The shape is `[numExamples]`, where\n\t *   `numExamples` is the number of examples included.\n\t * @param predictions The predicted classes, assumed to be\n\t *   0-based integers for the classes. Must have the same shape as `labels`.\n\t * @param numClasses Number of all classes, as an integer.\n\t *   Its value must be larger than the largest element in `labels` and\n\t *   `predictions`.\n\t * @returns The confusion matrix as a int32-type 2D tensor. The value at\n\t *   row `r` and column `c` is the number of times examples of actual class\n\t *   `r` were predicted as class `c`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Evaluation'}\n\t */\n\n\tfunction confusionMatrix_(labels, predictions, numClasses) {\n\t  var $labels = convertToTensor(labels, 'labels', 'confusionMatrix');\n\t  var $predictions = convertToTensor(predictions, 'predictions', 'confusionMatrix');\n\t  assert(numClasses == null || numClasses > 0 && Number.isInteger(numClasses), function () {\n\t    return \"If provided, numClasses must be a positive integer, \" + (\"but got \" + numClasses);\n\t  });\n\t  assert($labels.rank === 1, function () {\n\t    return \"Expected the rank of labels to be 1, but got \" + $labels.rank;\n\t  });\n\t  assert($predictions.rank === 1, function () {\n\t    return \"Expected the rank of predictions to be 1, \" + (\"but got \" + $predictions.rank);\n\t  });\n\t  assert($labels.shape[0] === $predictions.shape[0], function () {\n\t    return \"Mismatch in the number of examples: \" + ($labels.shape[0] + \" vs. \" + $predictions.shape[0] + \". \") + \"Labels and predictions should have the same number of elements.\";\n\t  });\n\t  assert(numClasses > 0 && Number.isInteger(numClasses), function () {\n\t    return \"numClasses is required to be a positive integer, but got \" + (\"\" + numClasses);\n\t  }); // TODO(cais): In the future, if oneHot supports tensors inputs for\n\t  //   `numClasses`, `confusionMatrix` can make `numClasses` optional.\n\n\t  var oneHotLabels = oneHot(cast($labels, 'int32'), numClasses);\n\t  var oneHotPredictions = oneHot(cast($predictions, 'int32'), numClasses);\n\t  var oneHotLabelsT = transpose(oneHotLabels);\n\t  var product = matMul(oneHotLabelsT, oneHotPredictions);\n\t  return cast(product, 'int32');\n\t}\n\tvar confusionMatrix = op({\n\t  confusionMatrix_: confusionMatrix_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tvar math = {\n\t\t__proto__: null,\n\t\tconfusionMatrix: confusionMatrix\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates rank-3 `tf.Tensor` with the provided values, shape and dtype.\n\t *\n\t * The same functionality can be achieved with `tf.tensor`, but in general\n\t * we recommend using `tf.tensor3d` as it makes the code more readable.\n\t *\n\t *  ```js\n\t * // Pass a nested array.\n\t * tf.tensor3d([[[1], [2]], [[3], [4]]]).print();\n\t * ```\n\t * ```js\n\t * // Pass a flat array and specify a shape.\n\t * tf.tensor3d([1, 2, 3, 4], [2, 2, 1]).print();\n\t * ```\n\t *\n\t * @param values The values of the tensor. Can be nested array of numbers,\n\t *     or a flat array, or a `TypedArray`.\n\t * @param shape The shape of the tensor. If not provided,  it is inferred from\n\t *     `values`.\n\t * @param dtype The data type.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction tensor3d(values, shape, dtype) {\n\t  assertNonNull(values);\n\n\t  if (shape != null && shape.length !== 3) {\n\t    throw new Error('tensor3d() requires shape to have three numbers');\n\t  }\n\n\t  var inferredShape = inferShape(values, dtype);\n\n\t  if (inferredShape.length !== 3 && inferredShape.length !== 1) {\n\t    throw new Error('tensor3d() requires values to be number[][][] or flat/TypedArray');\n\t  }\n\n\t  if (inferredShape.length === 1 && shape == null) {\n\t    throw new Error('tensor3d() requires shape to be provided when `values` ' + 'are a flat array');\n\t  }\n\n\t  return makeTensor(values, shape, inferredShape, dtype);\n\t}\n\n\tvar fromPixels2DContext;\n\t/**\n\t * Creates a `tf.Tensor` from an image.\n\t *\n\t * ```js\n\t * const image = new ImageData(1, 1);\n\t * image.data[0] = 100;\n\t * image.data[1] = 150;\n\t * image.data[2] = 200;\n\t * image.data[3] = 255;\n\t *\n\t * tf.browser.fromPixels(image).print();\n\t * ```\n\t *\n\t * @param pixels The input image to construct the tensor from. The\n\t * supported image types are all 4-channel. You can also pass in an image\n\t * object with following attributes:\n\t * `{data: Uint8Array; width: number; height: number}`\n\t * @param numChannels The number of channels of the output tensor. A\n\t * numChannels value less than 4 allows you to ignore channels. Defaults to\n\t * 3 (ignores alpha channel of input image).\n\t *\n\t * @doc {heading: 'Browser', namespace: 'browser', ignoreCI: true}\n\t */\n\n\tfunction fromPixels_(pixels, numChannels) {\n\t  if (numChannels === void 0) {\n\t    numChannels = 3;\n\t  }\n\n\t  // Sanity checks.\n\t  if (numChannels > 4) {\n\t    throw new Error('Cannot construct Tensor with more than 4 channels from pixels.');\n\t  }\n\n\t  if (pixels == null) {\n\t    throw new Error('pixels passed to tf.browser.fromPixels() can not be null');\n\t  }\n\n\t  var isPixelData = false;\n\t  var isImageData = false;\n\t  var isVideo = false;\n\t  var isImage = false;\n\t  var isCanvasLike = false;\n\t  var isImageBitmap = false;\n\n\t  if (pixels.data instanceof Uint8Array) {\n\t    isPixelData = true;\n\t  } else if (typeof ImageData !== 'undefined' && pixels instanceof ImageData) {\n\t    isImageData = true;\n\t  } else if (typeof HTMLVideoElement !== 'undefined' && pixels instanceof HTMLVideoElement) {\n\t    isVideo = true;\n\t  } else if (typeof HTMLImageElement !== 'undefined' && pixels instanceof HTMLImageElement) {\n\t    isImage = true; // tslint:disable-next-line: no-any\n\t  } else if (pixels.getContext != null) {\n\t    isCanvasLike = true;\n\t  } else if (typeof ImageBitmap !== 'undefined' && pixels instanceof ImageBitmap) {\n\t    isImageBitmap = true;\n\t  } else {\n\t    throw new Error('pixels passed to tf.browser.fromPixels() must be either an ' + \"HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData \" + \"in browser, or OffscreenCanvas, ImageData in webworker\" + \" or {data: Uint32Array, width: number, height: number}, \" + (\"but was \" + pixels.constructor.name));\n\t  }\n\n\t  if (isVideo) {\n\t    var HAVE_CURRENT_DATA_READY_STATE = 2;\n\n\t    if (isVideo && pixels.readyState < HAVE_CURRENT_DATA_READY_STATE) {\n\t      throw new Error('The video element has not loaded data yet. Please wait for ' + '`loadeddata` event on the <video> element.');\n\t    }\n\t  } // If the current backend has 'FromPixels' registered, it has a more\n\t  // efficient way of handling pixel uploads, so we call that.\n\n\n\t  var kernel = getKernel(FromPixels, ENGINE.backendName);\n\n\t  if (kernel != null) {\n\t    var inputs = {\n\t      pixels: pixels\n\t    };\n\t    var attrs = {\n\t      numChannels: numChannels\n\t    };\n\t    return ENGINE.runKernel(FromPixels, inputs, attrs);\n\t  }\n\n\t  var _ref = isVideo ? [pixels.videoWidth, pixels.videoHeight] : [pixels.width, pixels.height],\n\t      width = _ref[0],\n\t      height = _ref[1];\n\n\t  var vals;\n\n\t  if (isCanvasLike) {\n\t    vals = // tslint:disable-next-line:no-any\n\t    pixels.getContext('2d').getImageData(0, 0, width, height).data;\n\t  } else if (isImageData || isPixelData) {\n\t    vals = pixels.data;\n\t  } else if (isImage || isVideo || isImageBitmap) {\n\t    if (fromPixels2DContext == null) {\n\t      fromPixels2DContext = document.createElement('canvas').getContext('2d');\n\t    }\n\n\t    fromPixels2DContext.canvas.width = width;\n\t    fromPixels2DContext.canvas.height = height;\n\t    fromPixels2DContext.drawImage(pixels, 0, 0, width, height);\n\t    vals = fromPixels2DContext.getImageData(0, 0, width, height).data;\n\t  }\n\n\t  var values;\n\n\t  if (numChannels === 4) {\n\t    values = new Int32Array(vals);\n\t  } else {\n\t    var numPixels = width * height;\n\t    values = new Int32Array(numPixels * numChannels);\n\n\t    for (var i = 0; i < numPixels; i++) {\n\t      for (var channel = 0; channel < numChannels; ++channel) {\n\t        values[i * numChannels + channel] = vals[i * 4 + channel];\n\t      }\n\t    }\n\t  }\n\n\t  var outShape = [height, width, numChannels];\n\t  return tensor3d(values, outShape, 'int32');\n\t}\n\t/**\n\t * Draws a `tf.Tensor` of pixel values to a byte array or optionally a\n\t * canvas.\n\t *\n\t * When the dtype of the input is 'float32', we assume values in the range\n\t * [0-1]. Otherwise, when input is 'int32', we assume values in the range\n\t * [0-255].\n\t *\n\t * Returns a promise that resolves when the canvas has been drawn to.\n\t *\n\t * @param img A rank-2 or rank-3 tensor. If rank-2, draws grayscale. If\n\t *     rank-3, must have depth of 1, 3 or 4. When depth of 1, draws\n\t * grayscale. When depth of 3, we draw with the first three components of\n\t * the depth dimension corresponding to r, g, b and alpha = 1. When depth of\n\t * 4, all four components of the depth dimension correspond to r, g, b, a.\n\t * @param canvas The canvas to draw to.\n\t *\n\t * @doc {heading: 'Browser', namespace: 'browser'}\n\t */\n\n\n\tfunction toPixels(_x, _x2) {\n\t  return _toPixels.apply(this, arguments);\n\t}\n\n\tfunction _toPixels() {\n\t  _toPixels = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(img, canvas) {\n\t    var $img, originalImgTensor, _$img$shape$slice, height, width, depth, data, multiplier, bytes, i, rgba, d, value, j, ctx, imageData;\n\n\t    return regeneratorRuntime.wrap(function _callee$(_context) {\n\t      while (1) {\n\t        switch (_context.prev = _context.next) {\n\t          case 0:\n\t            $img = convertToTensor(img, 'img', 'toPixels');\n\n\t            if (!(img instanceof Tensor)) {\n\t              // Assume int32 if user passed a native array.\n\t              originalImgTensor = $img;\n\t              $img = cast(originalImgTensor, 'int32');\n\t              originalImgTensor.dispose();\n\t            }\n\n\t            if (!($img.rank !== 2 && $img.rank !== 3)) {\n\t              _context.next = 4;\n\t              break;\n\t            }\n\n\t            throw new Error(\"toPixels only supports rank 2 or 3 tensors, got rank \" + $img.rank + \".\");\n\n\t          case 4:\n\t            _$img$shape$slice = $img.shape.slice(0, 2), height = _$img$shape$slice[0], width = _$img$shape$slice[1];\n\t            depth = $img.rank === 2 ? 1 : $img.shape[2];\n\n\t            if (!(depth > 4 || depth === 2)) {\n\t              _context.next = 8;\n\t              break;\n\t            }\n\n\t            throw new Error(\"toPixels only supports depth of size \" + (\"1, 3 or 4 but got \" + depth));\n\n\t          case 8:\n\t            if (!($img.dtype !== 'float32' && $img.dtype !== 'int32')) {\n\t              _context.next = 10;\n\t              break;\n\t            }\n\n\t            throw new Error(\"Unsupported type for toPixels: \" + $img.dtype + \".\" + \" Please use float32 or int32 tensors.\");\n\n\t          case 10:\n\t            _context.next = 12;\n\t            return $img.data();\n\n\t          case 12:\n\t            data = _context.sent;\n\t            multiplier = $img.dtype === 'float32' ? 255 : 1;\n\t            bytes = new Uint8ClampedArray(width * height * 4);\n\t            i = 0;\n\n\t          case 16:\n\t            if (!(i < height * width)) {\n\t              _context.next = 41;\n\t              break;\n\t            }\n\n\t            rgba = [0, 0, 0, 255];\n\t            d = 0;\n\n\t          case 19:\n\t            if (!(d < depth)) {\n\t              _context.next = 33;\n\t              break;\n\t            }\n\n\t            value = data[i * depth + d];\n\n\t            if (!($img.dtype === 'float32')) {\n\t              _context.next = 26;\n\t              break;\n\t            }\n\n\t            if (!(value < 0 || value > 1)) {\n\t              _context.next = 24;\n\t              break;\n\t            }\n\n\t            throw new Error(\"Tensor values for a float32 Tensor must be in the \" + (\"range [0 - 1] but encountered \" + value + \".\"));\n\n\t          case 24:\n\t            _context.next = 29;\n\t            break;\n\n\t          case 26:\n\t            if (!($img.dtype === 'int32')) {\n\t              _context.next = 29;\n\t              break;\n\t            }\n\n\t            if (!(value < 0 || value > 255)) {\n\t              _context.next = 29;\n\t              break;\n\t            }\n\n\t            throw new Error(\"Tensor values for a int32 Tensor must be in the \" + (\"range [0 - 255] but encountered \" + value + \".\"));\n\n\t          case 29:\n\t            if (depth === 1) {\n\t              rgba[0] = value * multiplier;\n\t              rgba[1] = value * multiplier;\n\t              rgba[2] = value * multiplier;\n\t            } else {\n\t              rgba[d] = value * multiplier;\n\t            }\n\n\t          case 30:\n\t            d++;\n\t            _context.next = 19;\n\t            break;\n\n\t          case 33:\n\t            j = i * 4;\n\t            bytes[j + 0] = Math.round(rgba[0]);\n\t            bytes[j + 1] = Math.round(rgba[1]);\n\t            bytes[j + 2] = Math.round(rgba[2]);\n\t            bytes[j + 3] = Math.round(rgba[3]);\n\n\t          case 38:\n\t            ++i;\n\t            _context.next = 16;\n\t            break;\n\n\t          case 41:\n\t            if (canvas != null) {\n\t              canvas.width = width;\n\t              canvas.height = height;\n\t              ctx = canvas.getContext('2d');\n\t              imageData = new ImageData(bytes, width, height);\n\t              ctx.putImageData(imageData, 0, 0);\n\t            }\n\n\t            if ($img !== img) {\n\t              $img.dispose();\n\t            }\n\n\t            return _context.abrupt(\"return\", bytes);\n\n\t          case 44:\n\t          case \"end\":\n\t            return _context.stop();\n\t        }\n\t      }\n\t    }, _callee);\n\t  }));\n\t  return _toPixels.apply(this, arguments);\n\t}\n\n\tvar fromPixels = op({\n\t  fromPixels_: fromPixels_\n\t});\n\n\tvar browser = {\n\t\t__proto__: null,\n\t\ttoPixels: toPixels,\n\t\tfromPixels: fromPixels\n\t};\n\n\t/**\n\t * Validate gather nd inputs.\n\t *\n\t * @param tensor The tensor contains the source values.\n\t * @param indices The tensor contains the indices to slice the source.\n\t *\n\t * @returns [resultShape, numUpdates, sliceSize, strides]\n\t */\n\n\tfunction prepareAndValidate(tensor, indices) {\n\t  var tensorRank = tensor.shape.length;\n\t  var indicesRank = indices.shape.length;\n\n\t  if (tensorRank < 1) {\n\t    throw new Error('tf.gatherND() expects the input to be rank 1 or higher,' + (\" but the rank was \" + tensorRank + \".\"));\n\t  }\n\n\t  if (indicesRank < 1) {\n\t    throw new Error('tf.gatherND() expects the indices to be rank 1 or higher,' + (\" but the rank was \" + indicesRank + \".\"));\n\t  }\n\n\t  if (indices.dtype !== 'int32') {\n\t    throw new Error('tf.gatherND() expects the indices to be int32 type,' + (\" but the dtype was \" + indices.dtype + \".\"));\n\t  }\n\n\t  if (indices.shape[indicesRank - 1] > tensorRank) {\n\t    throw new Error('index innermost dimension length must be <= tensor rank; saw: ' + (indices.shape[indicesRank - 1] + \" vs. \" + tensorRank));\n\t  }\n\n\t  if (sizeFromShape(tensor.shape) === 0) {\n\t    throw new Error('Requested more than 0 entries, but input is empty.' + (\" Input shape: \" + tensor.shape + \".\"));\n\t  }\n\n\t  var indicesShape = indices.shape;\n\t  var sliceRank = indicesShape[indicesShape.length - 1]; // The result shape is\n\t  //   indices.shape[:-1] + params.shape[indices.shape[-1]:]\n\n\t  var nResult = 1;\n\n\t  for (var i = 0; i < indicesShape.length - 1; ++i) {\n\t    nResult *= indicesShape[i];\n\t  }\n\n\t  var inputShape = tensor.shape;\n\t  var resultShape = indicesShape.slice();\n\t  resultShape.pop();\n\t  var sliceSize = 1;\n\n\t  for (var _i = sliceRank; _i < tensorRank; ++_i) {\n\t    sliceSize *= inputShape[_i];\n\t    resultShape.push(inputShape[_i]);\n\t  }\n\n\t  var strides = [].concat(computeStrides(tensor.shape).map(function (stride) {\n\t    return stride / sliceSize;\n\t  }), [1]).slice(0, sliceRank);\n\t  return [resultShape, nResult, sliceSize, strides];\n\t}\n\n\tvar gather_nd_util = {\n\t\t__proto__: null,\n\t\tprepareAndValidate: prepareAndValidate\n\t};\n\n\t/**\n\t * Check whether updates.shape = indices.shape[:batchDim] +\n\t * shape[sliceDim:]\n\t *\n\t * @param x The input tensor.\n\t */\n\n\tfunction validateUpdateShape(shape, indices, updates) {\n\t  var sliceDim = indices.rank > 1 ? indices.shape[indices.rank - 1] : 1;\n\t  var batchDim = indices.rank > 1 ? indices.rank - 1 : 1;\n\t  var shapeError = 'Must have updates.shape = indices.shape[:batchDim] + ' + (\"shape[sliceDim:], got updates.shape: \" + updates.shape) + (\", indices.shape: \" + indices.shape + \", shape: \" + shape) + (\", sliceDim: \" + sliceDim + \", and batchDim: \" + batchDim + \".\");\n\n\t  if (updates.rank < batchDim) {\n\t    throw new Error(shapeError + (\" update.rank < \" + batchDim + \". \"));\n\t  }\n\n\t  if (shape.length < sliceDim + (updates.rank - batchDim)) {\n\t    throw new Error(shapeError + (\" Output shape length < \" + (sliceDim + (updates.rank - batchDim))));\n\t  }\n\n\t  if (updates.rank !== batchDim + shape.length - sliceDim) {\n\t    throw new Error(shapeError + (\" update.rank != \" + (batchDim + shape.length - sliceDim)));\n\t  }\n\n\t  for (var d = 0; d < batchDim; ++d) {\n\t    if (updates.shape[d] !== indices.shape[d]) {\n\t      throw new Error(shapeError + (\" updates.shape[\" + d + \"] (\" + updates.shape[d] + \") != indices.shape[\" + d + \"] (\" + indices.shape[d] + \").\"));\n\t    }\n\t  }\n\n\t  for (var _d = 0; _d < updates.rank - batchDim; ++_d) {\n\t    if (updates.shape[_d + batchDim] !== shape[_d + sliceDim]) {\n\t      throw new Error(shapeError + (\" updates.shape[\" + (_d + batchDim) + \"] (\" + updates.shape[_d + batchDim] + \") != shape[\" + (_d + batchDim) + \"] (\" + shape[_d + batchDim] + \")\"));\n\t    }\n\t  }\n\t}\n\t/**\n\t * Validate scatter nd inputs.\n\t *\n\t * @param update The tensor contains the update values.\n\t * @param indices The tensor contains the indices for the update values.\n\t * @param shape The shape of the output tensor.\n\t */\n\n\tfunction validateInput(updates, indices, shape) {\n\t  if (indices.rank < 1) {\n\t    throw new Error('tf.scatterND() expects the indices to be rank 1 or higher,' + (\" but the rank was \" + indices.rank + \".\"));\n\t  }\n\n\t  if (updates.rank < 1) {\n\t    throw new Error('tf.scatterND() expects the updates to be rank 1 or higher,' + (\" but the rank was \" + updates.rank + \".\"));\n\t  }\n\n\t  if (indices.dtype !== 'int32') {\n\t    throw new Error(\"The dtype of 'indices' should be int32, but got dtype: \" + indices.dtype);\n\t  }\n\n\t  if (shape.length < 1) {\n\t    throw new Error(\"Output rank must be greater or equal to 1, but got shape: \" + shape);\n\t  }\n\n\t  if (shape.length === 0) {\n\t    if (indices.size === 0) {\n\t      throw new Error(\"Indices specified for empty output. indices shape: \" + indices.shape);\n\t    }\n\n\t    if (updates.size === 0) {\n\t      throw new Error(\"Updates specified for empty output. updates shape: \" + updates.shape);\n\t    }\n\t  }\n\n\t  validateUpdateShape(shape, indices, updates);\n\t}\n\t/**\n\t * Calculate the shape information for the output.\n\t *\n\t * @param update The tensor contains the update values.\n\t * @param indices The tensor contains the indices for the update values.\n\t * @param shape The shape of the output tensor.\n\t *\n\t * @returns ScatterShapeInfo\n\t */\n\n\tfunction calculateShapes(updates, indices, shape) {\n\t  // Calculate the number of dimensions in indices\n\t  var indicesRank = indices.shape.length;\n\t  var sliceRank = indicesRank > 1 ? indices.shape[indicesRank - 1] : 1; // Calculate the number of elements that make up each slice of our updated\n\t  // tensor. This allows us to work with flattened tensors and copy over whole\n\t  // slices at a time.\n\n\t  var totalNd = shape.length;\n\t  var sliceSize = 1;\n\n\t  for (var i = sliceRank; i < totalNd; ++i) {\n\t    sliceSize *= shape[i];\n\t  }\n\n\t  var safeSliceDim = sliceRank < 1 ? 1 : sliceRank;\n\t  var numUpdates = sizeFromShape(indices.shape) / safeSliceDim;\n\t  var strides = [].concat(computeStrides(shape.slice(0, sliceRank)), [1]);\n\t  var outputSize = sizeFromShape(shape);\n\t  return {\n\t    sliceRank: sliceRank,\n\t    numUpdates: numUpdates,\n\t    sliceSize: sliceSize,\n\t    strides: strides,\n\t    outputSize: outputSize\n\t  };\n\t}\n\n\tvar scatter_nd_util = {\n\t\t__proto__: null,\n\t\tvalidateUpdateShape: validateUpdateShape,\n\t\tvalidateInput: validateInput,\n\t\tcalculateShapes: calculateShapes\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction assertParamsValid(input, begin, size) {\n\t  var inputRank = input.shape.length;\n\t  assert(inputRank === begin.length, function () {\n\t    return \"Error in slice\" + inputRank + \"D: Length of begin \" + begin + \" must \" + (\"match the rank of the array (\" + inputRank + \").\");\n\t  });\n\t  assert(inputRank === size.length, function () {\n\t    return \"Error in slice\" + inputRank + \"D: Length of size \" + size + \" must \" + (\"match the rank of the array (\" + inputRank + \").\");\n\t  });\n\n\t  var _loop = function _loop(i) {\n\t    assert(begin[i] + size[i] <= input.shape[i], function () {\n\t      return \"Error in slice\" + inputRank + \"D: begin[\" + i + \"] + size[\" + i + \"] \" + (\"(\" + (begin[i] + size[i]) + \") would overflow input.shape[\" + i + \"] (\" + input.shape[i] + \")\");\n\t    });\n\t  };\n\n\t  for (var i = 0; i < inputRank; ++i) {\n\t    _loop(i);\n\t  }\n\t}\n\t/** Converts a binary mask to an array of axes. Used in stridedSlice(). */\n\n\tfunction maskToAxes(mask) {\n\t  var axes = [];\n\t  var axis = 0;\n\n\t  while (mask > 0) {\n\t    if (mask & 1) {\n\t      axes.push(axis);\n\t    }\n\n\t    mask /= 2;\n\t    axis++;\n\t  }\n\n\t  return axes;\n\t}\n\t/** Computes the output shape given the strided slice params. */\n\n\tfunction computeOutShape(begin, end, strides) {\n\t  var size = [];\n\n\t  for (var axis = 0; axis < begin.length; axis++) {\n\t    size[axis] = Math.ceil((end[axis] - begin[axis]) / strides[axis]);\n\t  }\n\n\t  return size;\n\t} // Creates full selection at the elided dimensions. If the dimension matches\n\t// the ellipsis mask, override the current stride value. Otherwise, insert.\n\n\tfunction stridesWithElidedDims(strides, ellipsisInsertionIndex, numElidedAxes, inputShape) {\n\t  var newStrides = [].concat(strides);\n\n\t  for (var i = newStrides.length; i < inputShape.length; i++) {\n\t    newStrides.push(1);\n\t  }\n\n\t  for (var _i = 0; _i < numElidedAxes; _i++) {\n\t    if (_i === 0) {\n\t      newStrides[ellipsisInsertionIndex] = 1;\n\t    } else {\n\t      newStrides.splice(ellipsisInsertionIndex, 0\n\t      /* num elements to delete */\n\t      , 1\n\t      /* element to add */\n\t      );\n\t      newStrides.pop();\n\t    }\n\t  }\n\n\t  return newStrides;\n\t}\n\n\tfunction unnormalizeAxis(ellipsisInsertionIndex, numElidedAxes, normalizedAxis) {\n\t  if (normalizedAxis <= ellipsisInsertionIndex) {\n\t    return normalizedAxis;\n\t  }\n\n\t  return normalizedAxis - (numElidedAxes - 1);\n\t}\n\n\tfunction getElidedAxes(numElidedAxes, ellipsisInsertionIndex) {\n\t  var elidedAxes = [];\n\n\t  for (var i = 0; i < numElidedAxes; i++) {\n\t    elidedAxes.push(ellipsisInsertionIndex + i);\n\t  }\n\n\t  return elidedAxes;\n\t} // Normalize the start, end and strides.\n\n\n\tfunction getNormalizedAxes(inputShape, ellipsisAxes, numInterpolatedAxes, begin, end, strides, beginMask, endMask, ellipsisMask) {\n\t  var inputRank = inputShape.length;\n\t  var normalizedBegin = new Array(inputRank),\n\t      normalizedEnd = new Array(inputRank),\n\t      normalizedStrides = new Array(inputRank);\n\n\t  if (ellipsisAxes.length && numInterpolatedAxes > 0) {\n\t    var fullIndex = ellipsisAxes[0]; // The ellipsis applies to the masked index as well as any dimensions\n\t    // that are interpolated.\n\n\t    var numElidedAxes = numInterpolatedAxes + 1;\n\t    normalizedBegin = startIndicesWithElidedDims(beginMask, fullIndex, numElidedAxes, begin, inputShape);\n\t    normalizedEnd = stopIndicesWithElidedDims(endMask, fullIndex, numElidedAxes, end, inputShape);\n\t    normalizedStrides = stridesWithElidedDims(strides, fullIndex, numElidedAxes, inputShape);\n\t  } else {\n\t    for (var axis = 0; axis < inputRank; axis++) {\n\t      normalizedBegin[axis] = startForAxis(beginMask, begin, strides, inputShape, axis, ellipsisMask);\n\t      normalizedEnd[axis] = stopForAxis(endMask, end, strides, inputShape, axis, ellipsisMask);\n\t      normalizedStrides[axis] = stridesForAxis(strides, axis, ellipsisMask);\n\t    }\n\t  }\n\n\t  return {\n\t    begin: normalizedBegin,\n\t    end: normalizedEnd,\n\t    strides: normalizedStrides\n\t  };\n\t} // Creates full selection at the elided dimensions. If the dimension matches\n\t// the ellipsis mask, override the current start value. Otherwise, insert.\n\n\tfunction startIndicesWithElidedDims(beginMask, ellipsisInsertionIndex, numElidedAxes, originalBegin, inputShape) {\n\t  var newIndices = [].concat(inputShape);\n\t  var elidedAxes = getElidedAxes(numElidedAxes, ellipsisInsertionIndex);\n\n\t  for (var axis = 0; axis < newIndices.length; axis++) {\n\t    if (elidedAxes.indexOf(axis) > -1) {\n\t      newIndices[axis] = 0;\n\t    } else {\n\t      var originalAxis = unnormalizeAxis(ellipsisInsertionIndex, numElidedAxes, axis);\n\t      var originalValue = originalBegin[originalAxis];\n\n\t      if (beginMask & 1 << originalAxis) {\n\t        originalValue = 0;\n\t      }\n\n\t      newIndices[axis] = originalValue;\n\t    }\n\t  }\n\n\t  return newIndices;\n\t} // Creates full selection at the elided dimensions. If the dimension matches\n\t// the ellipsis mask, override the current stop value. Otherwise, insert.\n\n\tfunction stopIndicesWithElidedDims(endMask, ellipsisInsertionIndex, numElidedAxes, originalEnd, inputShape) {\n\t  var newIndices = [].concat(inputShape);\n\t  var elidedAxes = getElidedAxes(numElidedAxes, ellipsisInsertionIndex);\n\n\t  for (var axis = 0; axis < newIndices.length; axis++) {\n\t    if (elidedAxes.indexOf(axis) > -1) {\n\t      newIndices[axis] = Number.MAX_SAFE_INTEGER;\n\t    } else {\n\t      var originalAxis = unnormalizeAxis(ellipsisInsertionIndex, numElidedAxes, axis);\n\t      var originalValue = originalEnd[originalAxis];\n\n\t      if (endMask & 1 << originalAxis) {\n\t        originalValue = Number.MAX_SAFE_INTEGER;\n\t      }\n\n\t      newIndices[axis] = originalValue;\n\t    }\n\t  }\n\n\t  for (var i = 0; i < newIndices.length; i++) {\n\t    // Handle negative indices\n\t    var axisSize = inputShape[i];\n\n\t    if (newIndices[i] < 0) {\n\t      newIndices[i] += axisSize;\n\t    }\n\n\t    newIndices[i] = clamp(0, newIndices[i], inputShape[i]);\n\t  }\n\n\t  return newIndices;\n\t}\n\tfunction stridesForAxis(strides, axis, ellipsisMask) {\n\t  var stride = strides[axis];\n\n\t  if (ellipsisMask & 1 << axis || stride == null) {\n\t    stride = 1;\n\t  }\n\n\t  return stride;\n\t}\n\tfunction startForAxis(beginMask, startIndices, strides, inputShape, axis, ellipsisMask) {\n\t  // Begin with the specified index\n\t  var start = startIndices[axis];\n\t  var stride = strides[axis] || 1; // Check the axis bit from right of masked axes, or the begin index is not set\n\t  // for the axis.\n\n\t  if (beginMask & 1 << axis || ellipsisMask & 1 << axis || start == null) {\n\t    if (stride > 0) {\n\t      // Forward iteration - use the first element. These values will get\n\t      // clamped below (Note: We could have set them to 0 and axis_size-1, but\n\t      // use lowest() and max() to maintain symmetry with StopForAxis())\n\t      start = Number.MIN_SAFE_INTEGER;\n\t    } else {\n\t      // Backward iteration - use the last element.\n\t      start = Number.MAX_SAFE_INTEGER;\n\t    }\n\t  } // Handle negative indices\n\n\n\t  var axisSize = inputShape[axis];\n\n\t  if (start < 0) {\n\t    start += axisSize;\n\t  } // Clamping\n\n\n\t  start = clamp(0, start, axisSize - 1);\n\t  return start;\n\t}\n\tfunction stopForAxis(endMask, stopIndices, strides, inputShape, axis, ellipsisMask) {\n\t  // Begin with the specified index\n\t  var stop = stopIndices[axis];\n\t  var stride = strides[axis] || 1; // Check the axis bit from right of masked axes, or if the stop index is not\n\t  // set for this axis.\n\n\t  if (endMask & 1 << axis || ellipsisMask & 1 << axis || stop == null) {\n\t    if (stride > 0) {\n\t      // Forward iteration - use the last element. These values will get\n\t      // clamped below\n\t      stop = Number.MAX_SAFE_INTEGER;\n\t    } else {\n\t      // Backward iteration - use the first element.\n\t      stop = Number.MIN_SAFE_INTEGER;\n\t    }\n\t  } // Handle negative indices\n\n\n\t  var axisSize = inputShape[axis];\n\n\t  if (stop < 0) {\n\t    stop += axisSize;\n\t  } // Clamping\n\t  // Because the end index points one past the last element, we need slightly\n\t  // different clamping ranges depending on the direction.\n\n\n\t  if (stride > 0) {\n\t    // Forward iteration\n\t    stop = clamp(0, stop, axisSize);\n\t  } else {\n\t    // Backward iteration\n\t    stop = clamp(-1, stop, axisSize - 1);\n\t  }\n\n\t  return stop;\n\t}\n\t/**\n\t * Returns true if the slice occupies a continous set of elements in the\n\t * 'flat' space.\n\t */\n\n\tfunction isSliceContinous(shape, begin, size) {\n\t  // Index of the first axis that has size > 1.\n\t  var firstNonOneAxis = size.length;\n\n\t  for (var i = 0; i < size.length; i++) {\n\t    if (size[i] > 1) {\n\t      firstNonOneAxis = i;\n\t      break;\n\t    }\n\t  }\n\n\t  for (var _i2 = firstNonOneAxis + 1; _i2 < size.length; _i2++) {\n\t    if (begin[_i2] > 0 || size[_i2] !== shape[_i2]) {\n\t      return false;\n\t    }\n\t  }\n\n\t  return true;\n\t}\n\tfunction computeFlatOffset(begin, strides) {\n\t  var flatOffset = begin.length > 0 ? begin[begin.length - 1] : 1;\n\n\t  for (var i = 0; i < begin.length - 1; i++) {\n\t    flatOffset += begin[i] * strides[i];\n\t  }\n\n\t  return flatOffset;\n\t}\n\tfunction parseSliceParams(x, begin, size) {\n\t  // The following logic allows for more ergonomic calls.\n\t  var begin_;\n\t  var xRank = x.shape.length;\n\n\t  if (typeof begin === 'number') {\n\t    begin_ = [begin].concat(new Array(xRank - 1).fill(0));\n\t  } else if (begin.length < xRank) {\n\t    begin_ = begin.concat(new Array(xRank - begin.length).fill(0));\n\t  } else {\n\t    begin_ = begin.slice();\n\t  }\n\n\t  begin_.forEach(function (d) {\n\t    assert(d !== -1, function () {\n\t      return 'slice() does not support negative begin indexing.';\n\t    });\n\t  });\n\t  var size_;\n\n\t  if (size == null) {\n\t    size_ = new Array(xRank).fill(-1);\n\t  } else if (typeof size === 'number') {\n\t    size_ = [size].concat(new Array(xRank - 1).fill(-1));\n\t  } else if (size.length < xRank) {\n\t    size_ = size.concat(new Array(xRank - size.length).fill(-1));\n\t  } else {\n\t    size_ = size;\n\t  }\n\n\t  size_ = size_.map(function (d, i) {\n\t    if (d >= 0) {\n\t      return d;\n\t    } else {\n\t      assert(d === -1, function () {\n\t        return \"Negative size values should be exactly -1 but got \" + (d + \" for the slice() size at index \" + i + \".\");\n\t      });\n\t      return x.shape[i] - begin_[i];\n\t    }\n\t  });\n\t  return [begin_, size_];\n\t}\n\tfunction sliceInfo(xShape, begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask) {\n\t  // make a copy because it may be modified further down.\n\t  var $begin = begin.slice();\n\t  var $end = end.slice();\n\t  var $strides = strides;\n\n\t  if (strides == null) {\n\t    $strides = new Array($begin.length);\n\t  }\n\n\t  var ellipsisAxes = maskToAxes(ellipsisMask);\n\n\t  if (ellipsisAxes.length > 1) {\n\t    throw new Error('Multiple ellipses in slice is not allowed.');\n\t  }\n\n\t  if (ellipsisMask !== 0 && newAxisMask !== 0) {\n\t    throw new Error('Using both ellipsisMask and newAxisMask is not yet supported.');\n\t  }\n\n\t  if (ellipsisMask !== 0 && shrinkAxisMask !== 0) {\n\t    throw new Error('Using both ellipsisMask and shrinkAxisMask is not yet supported.');\n\t  }\n\n\t  var numInterpolatedAxes = xShape.length - $begin.length; // Expand the dims of x based on the newAxisMask.\n\n\t  var expandAxes = maskToAxes(newAxisMask);\n\t  var newShape = xShape.slice();\n\t  expandAxes.forEach(function (axis) {\n\t    $begin[axis] = 0;\n\t    $end[axis] = 1;\n\t    newShape.splice(axis, 0, 1);\n\t  });\n\n\t  var _getNormalizedAxes = getNormalizedAxes(newShape, ellipsisAxes, numInterpolatedAxes, $begin, $end, $strides, beginMask, endMask, ellipsisMask),\n\t      normalizedBegin = _getNormalizedAxes.begin,\n\t      normalizedEnd = _getNormalizedAxes.end,\n\t      normalizedStrides = _getNormalizedAxes.strides;\n\n\t  $begin = normalizedBegin;\n\t  $end = normalizedEnd;\n\t  $strides = normalizedStrides;\n\t  var shrinkAxes = maskToAxes(shrinkAxisMask); // Adjust the ends based on the shrink mask.\n\n\t  shrinkAxes.forEach(function (axis) {\n\t    $end[axis] = $begin[axis] + 1;\n\t    $strides[axis] = 1;\n\t  }); // Figure out the output shape.\n\n\t  var size = computeOutShape($begin, $end, $strides); // Remove the axes based on shrinkMask.\n\n\t  var outShape = size.filter(function (_, axis) {\n\t    return shrinkAxes.indexOf(axis) === -1;\n\t  });\n\t  var nonStrided = $strides.every(function (v) {\n\t    return v === 1;\n\t  });\n\t  return {\n\t    nonStrided: nonStrided,\n\t    $begin: $begin,\n\t    $end: $end,\n\t    $strides: $strides,\n\t    size: size,\n\t    newShape: newShape,\n\t    outShape: outShape\n\t  };\n\t}\n\n\tvar slice_util = {\n\t\t__proto__: null,\n\t\tassertParamsValid: assertParamsValid,\n\t\tmaskToAxes: maskToAxes,\n\t\tcomputeOutShape: computeOutShape,\n\t\tstridesWithElidedDims: stridesWithElidedDims,\n\t\tgetNormalizedAxes: getNormalizedAxes,\n\t\tstartIndicesWithElidedDims: startIndicesWithElidedDims,\n\t\tstopIndicesWithElidedDims: stopIndicesWithElidedDims,\n\t\tstridesForAxis: stridesForAxis,\n\t\tstartForAxis: startForAxis,\n\t\tstopForAxis: stopForAxis,\n\t\tisSliceContinous: isSliceContinous,\n\t\tcomputeFlatOffset: computeFlatOffset,\n\t\tparseSliceParams: parseSliceParams,\n\t\tsliceInfo: sliceInfo\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Serializable defines the serialization contract.\n\t *\n\t * TFJS requires serializable classes to return their className when asked\n\t * to avoid issues with minification.\n\t */\n\n\tvar Serializable = /*#__PURE__*/function () {\n\t  function Serializable() {}\n\n\t  var _proto = Serializable.prototype;\n\n\t  /**\n\t   * Return the class name for this class to use in serialization contexts.\n\t   *\n\t   * Generally speaking this will be the same thing that constructor.name\n\t   * would have returned.  However, the class name needs to be robust\n\t   * against minification for serialization/deserialization to work properly.\n\t   *\n\t   * There's also places such as initializers.VarianceScaling, where\n\t   * implementation details between different languages led to different\n\t   * class hierarchies and a non-leaf node is used for serialization purposes.\n\t   */\n\t  _proto.getClassName = function getClassName() {\n\t    return this.constructor.className;\n\t  }\n\t  /**\n\t   * Creates an instance of T from a ConfigDict.\n\t   *\n\t   * This works for most descendants of serializable.  A few need to\n\t   * provide special handling.\n\t   * @param cls A Constructor for the class to instantiate.\n\t   * @param config The Configuration for the object.\n\t   */\n\n\t  /** @nocollapse */\n\t  ;\n\n\t  Serializable.fromConfig = function fromConfig(cls, config) {\n\t    return new cls(config);\n\t  };\n\n\t  return Serializable;\n\t}();\n\t/**\n\t * Maps string keys to class constructors.\n\t *\n\t * Used during (de)serialization from the cross-language JSON format, which\n\t * requires the class name in the serialization format matches the class\n\t * names as used in Python, should it exist.\n\t */\n\n\tvar SerializationMap = /*#__PURE__*/function () {\n\t  function SerializationMap() {\n\t    this.classNameMap = {};\n\t  }\n\t  /**\n\t   * Returns the singleton instance of the map.\n\t   */\n\n\n\t  SerializationMap.getMap = function getMap() {\n\t    if (SerializationMap.instance == null) {\n\t      SerializationMap.instance = new SerializationMap();\n\t    }\n\n\t    return SerializationMap.instance;\n\t  }\n\t  /**\n\t   * Registers the class as serializable.\n\t   */\n\t  ;\n\n\t  SerializationMap.register = function register(cls) {\n\t    SerializationMap.getMap().classNameMap[cls.className] = [cls, cls.fromConfig];\n\t  };\n\n\t  return SerializationMap;\n\t}();\n\t/**\n\t * Register a class with the serialization map of TensorFlow.js.\n\t *\n\t * This is often used for registering custom Layers, so they can be\n\t * serialized and deserialized.\n\t *\n\t * Example:\n\t *\n\t * ```js\n\t * class MyCustomLayer extends tf.layers.Layer {\n\t *   static className = 'MyCustomLayer';\n\t *\n\t *   constructor(config) {\n\t *     super(config);\n\t *   }\n\t * }\n\t * tf.serialization.registerClass(MyCustomLayer);\n\t * ```\n\t *\n\t * @param cls The class to be registered. It must have a public static member\n\t *   called `className` defined and the value must be a non-empty string.\n\t *\n\t * @doc {heading: 'Models', subheading: 'Serialization', ignoreCI: true}\n\t */\n\n\tfunction registerClass(cls) {\n\t  assert(cls.className != null, function () {\n\t    return \"Class being registered does not have the static className \" + \"property defined.\";\n\t  });\n\t  assert(typeof cls.className === 'string', function () {\n\t    return \"className is required to be a string, but got type \" + typeof cls.className;\n\t  });\n\t  assert(cls.className.length > 0, function () {\n\t    return \"Class being registered has an empty-string as its className, \" + \"which is disallowed.\";\n\t  });\n\t  SerializationMap.register(cls);\n\t}\n\n\tvar serialization = {\n\t\t__proto__: null,\n\t\tSerializable: Serializable,\n\t\tSerializationMap: SerializationMap,\n\t\tregisterClass: registerClass\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar TEST_EPSILON_FLOAT32 = 1e-3;\n\tvar TEST_EPSILON_FLOAT16 = 1e-1;\n\tfunction expectArraysClose(actual, expected, epsilon) {\n\t  if (epsilon == null) {\n\t    epsilon = testEpsilon();\n\t  }\n\n\t  return expectArraysPredicate(actual, expected, function (a, b) {\n\t    return areClose(a, b, epsilon);\n\t  });\n\t}\n\tfunction testEpsilon() {\n\t  return ENGINE.backend.floatPrecision() === 32 ? TEST_EPSILON_FLOAT32 : TEST_EPSILON_FLOAT16;\n\t}\n\n\tfunction expectArraysPredicate(actual, expected, predicate) {\n\t  var checkClassType = true;\n\n\t  if (isTypedArray$1(actual) || isTypedArray$1(expected)) {\n\t    checkClassType = false;\n\t  }\n\n\t  if (isTypedArray$1(actual) && isTypedArray$1(expected)) {\n\t    checkClassType = true;\n\t  }\n\n\t  if (checkClassType) {\n\t    var aType = actual.constructor.name;\n\t    var bType = expected.constructor.name;\n\n\t    if (aType !== bType) {\n\t      throw new Error(\"Arrays are of different type. Actual: \" + aType + \". \" + (\"Expected: \" + bType));\n\t    }\n\t  }\n\n\t  if (Array.isArray(actual) && Array.isArray(expected)) {\n\t    var actualShape = inferShape(actual);\n\t    var expectedShape = inferShape(expected);\n\n\t    if (!arraysEqual(actualShape, expectedShape)) {\n\t      throw new Error(\"Arrays have different shapes. \" + (\"Actual: [\" + actualShape + \"]. Expected: [\" + expectedShape + \"]\"));\n\t    }\n\t  }\n\n\t  var actualFlat = isTypedArray$1(actual) ? actual : flatten(actual);\n\t  var expectedFlat = isTypedArray$1(expected) ? expected : flatten(expected);\n\n\t  if (actualFlat.length !== expectedFlat.length) {\n\t    throw new Error(\"Arrays have different lengths actual: \" + actualFlat.length + \" vs \" + (\"expected: \" + expectedFlat.length + \".\\n\") + (\"Actual:   \" + actualFlat + \".\\n\") + (\"Expected: \" + expectedFlat + \".\"));\n\t  }\n\n\t  for (var i = 0; i < expectedFlat.length; ++i) {\n\t    var a = actualFlat[i];\n\t    var e = expectedFlat[i];\n\n\t    if (!predicate(a, e)) {\n\t      throw new Error(\"Arrays differ: actual[\" + i + \"] = \" + a + \", expected[\" + i + \"] = \" + e + \".\\n\" + (\"Actual:   \" + actualFlat + \".\\n\") + (\"Expected: \" + expectedFlat + \".\"));\n\t    }\n\t  }\n\t}\n\n\tfunction expectPromiseToFail(fn, done) {\n\t  fn().then(function () {\n\t    return done.fail();\n\t  }, function () {\n\t    return done();\n\t  });\n\t}\n\tfunction expectArraysEqual(actual, expected) {\n\t  var exp = typeof expected === 'string' || typeof expected === 'number' || typeof expected === 'boolean' ? [expected] : expected;\n\n\t  if (isString(actual) || isString(actual[0]) || isString(expected) || isString(expected[0])) {\n\t    // tslint:disable-next-line: triple-equals\n\t    return expectArraysPredicate(actual, exp, function (a, b) {\n\t      return a == b;\n\t    });\n\t  }\n\n\t  return expectArraysPredicate(actual, expected, function (a, b) {\n\t    return areClose(a, b, 0);\n\t  });\n\t}\n\tfunction expectNumbersClose(a, e, epsilon) {\n\t  if (epsilon == null) {\n\t    epsilon = testEpsilon();\n\t  }\n\n\t  if (!areClose(a, e, epsilon)) {\n\t    throw new Error(\"Numbers differ: actual === \" + a + \", expected === \" + e);\n\t  }\n\t}\n\n\tfunction areClose(a, e, epsilon) {\n\t  if (!isFinite(a) && !isFinite(e)) {\n\t    return true;\n\t  }\n\n\t  if (isNaN(a) || isNaN(e) || Math.abs(a - e) > epsilon) {\n\t    return false;\n\t  }\n\n\t  return true;\n\t}\n\n\tfunction expectValuesInRange(actual, low, high) {\n\t  for (var i = 0; i < actual.length; i++) {\n\t    if (actual[i] < low || actual[i] > high) {\n\t      throw new Error(\"Value out of range:\" + actual[i] + \" low: \" + low + \", high: \" + high);\n\t    }\n\t  }\n\t}\n\tfunction expectArrayBuffersEqual(actual, expected) {\n\t  // Safari & Jasmine don't like comparing ArrayBuffers directly. Wrapping in\n\t  // a Float32Array solves this issue.\n\t  expect(new Float32Array(actual)).toEqual(new Float32Array(expected));\n\t}\n\t/** Encodes strings into utf-8 bytes. */\n\n\tfunction encodeStrings(a) {\n\t  for (var i = 0; i < a.length; i++) {\n\t    var val = a[i];\n\n\t    if (Array.isArray(val)) {\n\t      encodeStrings(val);\n\t    } else {\n\t      a[i] = encodeString(val);\n\t    }\n\t  }\n\n\t  return a;\n\t}\n\n\tvar test_util = {\n\t\t__proto__: null,\n\t\tTEST_EPSILON_FLOAT16: TEST_EPSILON_FLOAT16,\n\t\texpectArraysClose: expectArraysClose,\n\t\ttestEpsilon: testEpsilon,\n\t\texpectPromiseToFail: expectPromiseToFail,\n\t\texpectArraysEqual: expectArraysEqual,\n\t\texpectNumbersClose: expectNumbersClose,\n\t\texpectValuesInRange: expectValuesInRange,\n\t\texpectArrayBuffersEqual: expectArrayBuffersEqual,\n\t\tencodeStrings: encodeStrings\n\t};\n\n\t/** @license See the LICENSE file. */\n\t// This code is auto-generated, do not modify this file!\n\tvar version$1 = '2.8.3';\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Enables production mode which disables correctness checks in favor of\n\t * performance.\n\t *\n\t * @doc {heading: 'Environment'}\n\t */\n\n\tfunction enableProdMode() {\n\t  env().set('PROD', true);\n\t}\n\t/**\n\t * Enables debug mode which will log information about all executed kernels:\n\t * the elapsed time of the kernel execution, as well as the rank, shape, and\n\t * size of the output tensor.\n\t *\n\t * Debug mode will significantly slow down your application as it will\n\t * download the result of every operation to the CPU. This should not be used in\n\t * production. Debug mode does not affect the timing information of the kernel\n\t * execution as we do not measure download time in the kernel execution time.\n\t *\n\t * See also: `tf.profile`, `tf.memory`.\n\t *\n\t * @doc {heading: 'Environment'}\n\t */\n\n\tfunction enableDebugMode() {\n\t  env().set('DEBUG', true);\n\t}\n\t/** Globally disables deprecation warnings */\n\n\tfunction disableDeprecationWarnings() {\n\t  env().set('DEPRECATION_WARNINGS_ENABLED', false);\n\t  console.warn(\"TensorFlow.js deprecation warnings have been disabled.\");\n\t}\n\t/** Warn users about deprecated functionality. */\n\n\tfunction deprecationWarn(msg) {\n\t  if (env().getBool('DEPRECATION_WARNINGS_ENABLED')) {\n\t    console.warn(msg + ' You can disable deprecation warnings with ' + 'tf.disableDeprecationWarnings().');\n\t  }\n\t}\n\tsetDeprecationWarningFn(deprecationWarn);\n\t/**\n\t * Dispose all variables kept in backend engine.\n\t *\n\t * @doc {heading: 'Environment'}\n\t */\n\n\tfunction disposeVariables() {\n\t  ENGINE.disposeVariables();\n\t}\n\t/**\n\t * It returns the global engine that keeps track of all tensors and backends.\n\t *\n\t * @doc {heading: 'Environment'}\n\t */\n\n\tfunction engine() {\n\t  return ENGINE;\n\t}\n\t/**\n\t * Returns memory info at the current time in the program. The result is an\n\t * object with the following properties:\n\t *\n\t * - `numBytes`: Number of bytes allocated (undisposed) at this time.\n\t * - `numTensors`: Number of unique tensors allocated.\n\t * - `numDataBuffers`: Number of unique data buffers allocated\n\t *   (undisposed) at this time, which is ≤ the number of tensors\n\t *   (e.g. `a.reshape(newShape)` makes a new Tensor that shares the same\n\t *   data buffer with `a`).\n\t * - `unreliable`: True if the memory usage is unreliable. See `reasons` when\n\t *    `unreliable` is true.\n\t * - `reasons`: `string[]`, reasons why the memory is unreliable, present if\n\t *    `unreliable` is true.\n\t *\n\t * WebGL Properties:\n\t * - `numBytesInGPU`: Number of bytes allocated (undisposed) in the GPU only at\n\t *     this time.\n\t *\n\t * @doc {heading: 'Performance', subheading: 'Memory'}\n\t */\n\n\tfunction memory() {\n\t  return ENGINE.memory();\n\t}\n\t/**\n\t * Executes the provided function `f()` and returns a promise that resolves\n\t * with information about the function's memory use:\n\t * - `newBytes`: the number of new bytes allocated\n\t * - `newTensors`: the number of new tensors created\n\t * - `peakBytes`: the peak number of bytes allocated\n\t * - `kernels`: an array of objects for each kernel involved that reports\n\t * their input and output shapes, number of bytes used, and number of new\n\t * tensors created.\n\t * - `kernelNames`: an array of unique strings with just the names of the\n\t * kernels in the `kernels` array.\n\t *\n\t * ```js\n\t * const profile = await tf.profile(() => {\n\t *   const x = tf.tensor1d([1, 2, 3]);\n\t *   let x2 = x.square();\n\t *   x2.dispose();\n\t *   x2 = x.square();\n\t *   x2.dispose();\n\t *   return x;\n\t * });\n\t *\n\t * console.log(`newBytes: ${profile.newBytes}`);\n\t * console.log(`newTensors: ${profile.newTensors}`);\n\t * console.log(`byte usage over all kernels: ${profile.kernels.map(k =>\n\t * k.totalBytesSnapshot)}`);\n\t * ```\n\t *\n\t *\n\t * @doc {heading: 'Performance', subheading: 'Profile'}\n\t */\n\n\tfunction profile(f) {\n\t  return ENGINE.profile(f);\n\t}\n\t/**\n\t * Executes the provided function `fn` and after it is executed, cleans up all\n\t * intermediate tensors allocated by `fn` except those returned by `fn`.\n\t * `fn` must not return a Promise (async functions not allowed). The returned\n\t * result can be a complex object.\n\t *\n\t * Using this method helps avoid memory leaks. In general, wrap calls to\n\t * operations in `tf.tidy` for automatic memory cleanup.\n\t *\n\t * NOTE: Variables do *not* get cleaned up when inside a tidy(). If you want to\n\t * dispose variables, please use `tf.disposeVariables` or call dispose()\n\t * directly on variables.\n\t *\n\t * ```js\n\t * // y = 2 ^ 2 + 1\n\t * const y = tf.tidy(() => {\n\t *   // a, b, and one will be cleaned up when the tidy ends.\n\t *   const one = tf.scalar(1);\n\t *   const a = tf.scalar(2);\n\t *   const b = a.square();\n\t *\n\t *   console.log('numTensors (in tidy): ' + tf.memory().numTensors);\n\t *\n\t *   // The value returned inside the tidy function will return\n\t *   // through the tidy, in this case to the variable y.\n\t *   return b.add(one);\n\t * });\n\t *\n\t * console.log('numTensors (outside tidy): ' + tf.memory().numTensors);\n\t * y.print();\n\t * ```\n\t *\n\t * @param nameOrFn The name of the closure, or the function to execute.\n\t *     If a name is provided, the 2nd argument should be the function.\n\t *     If debug mode is on, the timing and the memory usage of the function\n\t *     will be tracked and displayed on the console using the provided name.\n\t * @param fn The function to execute.\n\t *\n\t * @doc {heading: 'Performance', subheading: 'Memory'}\n\t */\n\n\tfunction tidy(nameOrFn, fn) {\n\t  return ENGINE.tidy(nameOrFn, fn);\n\t}\n\t/**\n\t * Disposes any `tf.Tensor`s found within the provided object.\n\t *\n\t * @param container an object that may be a `tf.Tensor` or may directly\n\t *     contain `tf.Tensor`s, such as a `Tensor[]` or `{key: Tensor, ...}`. If\n\t *     the object is not a `tf.Tensor` or does not contain `Tensors`, nothing\n\t *     happens. In general it is safe to pass any object here, except that\n\t *     `Promise`s are not supported.\n\t *\n\t * @doc {heading: 'Performance', subheading: 'Memory'}\n\t */\n\n\tfunction dispose(container) {\n\t  var tensors = getTensorsInContainer(container);\n\t  tensors.forEach(function (tensor) {\n\t    return tensor.dispose();\n\t  });\n\t}\n\t/**\n\t * Keeps a `tf.Tensor` generated inside a `tf.tidy` from being disposed\n\t * automatically.\n\t *\n\t * ```js\n\t * let b;\n\t * const y = tf.tidy(() => {\n\t *   const one = tf.scalar(1);\n\t *   const a = tf.scalar(2);\n\t *\n\t *   // b will not be cleaned up by the tidy. a and one will be cleaned up\n\t *   // when the tidy ends.\n\t *   b = tf.keep(a.square());\n\t *\n\t *   console.log('numTensors (in tidy): ' + tf.memory().numTensors);\n\t *\n\t *   // The value returned inside the tidy function will return\n\t *   // through the tidy, in this case to the variable y.\n\t *   return b.add(one);\n\t * });\n\t *\n\t * console.log('numTensors (outside tidy): ' + tf.memory().numTensors);\n\t * console.log('y:');\n\t * y.print();\n\t * console.log('b:');\n\t * b.print();\n\t * ```\n\t *\n\t * @param result The tensor to keep from being disposed.\n\t *\n\t * @doc {heading: 'Performance', subheading: 'Memory'}\n\t */\n\n\tfunction keep(result) {\n\t  return ENGINE.keep(result);\n\t}\n\t/**\n\t * Executes `f()` and returns a promise that resolves with timing\n\t * information.\n\t *\n\t * The result is an object with the following properties:\n\t *\n\t * - `wallMs`: Wall execution time.\n\t * - `kernelMs`: Kernel execution time, ignoring data transfer. If using the\n\t * WebGL backend and the query timer extension is not available, this will\n\t * return an error object.\n\t * - On `WebGL` The following additional properties exist:\n\t *   - `uploadWaitMs`: CPU blocking time on texture uploads.\n\t *   - `downloadWaitMs`: CPU blocking time on texture downloads (readPixels).\n\t *\n\t * ```js\n\t * const x = tf.randomNormal([20, 20]);\n\t * const time = await tf.time(() => x.matMul(x));\n\t *\n\t * console.log(`kernelMs: ${time.kernelMs}, wallTimeMs: ${time.wallMs}`);\n\t * ```\n\t *\n\t * @param f The function to execute and time.\n\t *\n\t * @doc {heading: 'Performance', subheading: 'Timing'}\n\t */\n\n\tfunction time(f) {\n\t  return ENGINE.time(f);\n\t}\n\t/**\n\t * Sets the backend (cpu, webgl, wasm, etc) responsible for creating tensors and\n\t * executing operations on those tensors. Returns a promise that resolves\n\t * to a boolean if the backend initialization was successful.\n\t *\n\t * Note this disposes the current backend, if any, as well as any tensors\n\t * associated with it. A new backend is initialized, even if it is of the\n\t * same type as the previous one.\n\t *\n\t * @param backendName The name of the backend. Currently supports\n\t *     `'webgl'|'cpu'` in the browser, `'tensorflow'` under node.js\n\t *     (requires tfjs-node), and `'wasm'` (requires tfjs-backend-wasm).\n\t *\n\t * @doc {heading: 'Backends'}\n\t */\n\n\tfunction setBackend(backendName) {\n\t  return ENGINE.setBackend(backendName);\n\t}\n\t/**\n\t * Returns a promise that resolves when the currently selected backend (or the\n\t * highest priority one) has initialized. Await this promise when you are using\n\t * a backend that has async initialization.\n\t *\n\t * @doc {heading: 'Backends'}\n\t */\n\n\tfunction ready() {\n\t  return ENGINE.ready();\n\t}\n\t/**\n\t * Returns the current backend name (cpu, webgl, etc). The backend is\n\t * responsible for creating tensors and executing operations on those tensors.\n\t *\n\t * @doc {heading: 'Backends'}\n\t */\n\n\tfunction getBackend() {\n\t  return ENGINE.backendName;\n\t}\n\t/**\n\t * Removes a backend and the registered factory.\n\t *\n\t * @doc {heading: 'Backends'}\n\t */\n\n\tfunction removeBackend(name) {\n\t  ENGINE.removeBackend(name);\n\t}\n\t/**\n\t * Finds the backend registered under the provided name. Returns null if the\n\t * name is not in the registry, or the registration hasn't finished yet.\n\t */\n\n\tfunction findBackend(name) {\n\t  return ENGINE.findBackend(name);\n\t}\n\t/**\n\t * Finds the backend factory registered under the provided name. Returns a\n\t * function that produces a new backend when called. Returns null if the name\n\t * is not in the registry.\n\t */\n\n\tfunction findBackendFactory(name) {\n\t  return ENGINE.findBackendFactory(name);\n\t}\n\t/**\n\t * Registers a global backend. The registration should happen when importing\n\t * a module file (e.g. when importing `backend_webgl.ts`), and is used for\n\t * modular builds (e.g. custom tfjs bundle with only webgl support).\n\t *\n\t * @param factory The backend factory function. When called, it should\n\t * return a backend instance, or a promise of an instance.\n\t * @param priority The priority of the backend (higher = more important).\n\t *     In case multiple backends are registered, the priority is used to find\n\t *     the best backend. Defaults to 1.\n\t * @return False if there is already a registered backend under this name, true\n\t *     if not.\n\t *\n\t * @doc {heading: 'Backends'}\n\t */\n\n\tfunction registerBackend(name, factory, priority) {\n\t  if (priority === void 0) {\n\t    priority = 1;\n\t  }\n\n\t  return ENGINE.registerBackend(name, factory, priority);\n\t}\n\t/**\n\t * Gets the current backend. If no backends have been initialized, this will\n\t * attempt to initialize the best backend. Will throw an error if the highest\n\t * priority backend has async initialization, in which case, you should call\n\t * 'await tf.ready()' before running other code.\n\t *\n\t * @doc {heading: 'Backends'}\n\t */\n\n\tfunction backend() {\n\t  return ENGINE.backend;\n\t}\n\t/**\n\t * Sets the global platform.\n\t *\n\t * @param platformName The name of this platform.\n\t * @param platform A platform implementation.\n\t */\n\n\tfunction setPlatform(platformName, platform) {\n\t  env().setPlatform(platformName, platform);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Adds two `tf.Tensor`s element-wise, A + B. Supports broadcasting.\n\t *\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 2, 3, 4]);\n\t * const b = tf.tensor1d([10, 20, 30, 40]);\n\t *\n\t * a.add(b).print();  // or tf.add(a, b)\n\t * ```\n\t *\n\t * ```js\n\t * // Broadcast add a with b.\n\t * const a = tf.scalar(5);\n\t * const b = tf.tensor1d([10, 20, 30, 40]);\n\t *\n\t * a.add(b).print();  // or tf.add(a, b)\n\t * ```\n\t * @param a The first `tf.Tensor` to add.\n\t * @param b The second `tf.Tensor` to add. Must have the same type as `a`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n\t */\n\n\tfunction add_(a, b) {\n\t  var $a = convertToTensor(a, 'a', 'add');\n\t  var $b = convertToTensor(b, 'b', 'add');\n\n\t  var _makeTypesMatch = makeTypesMatch($a, $b);\n\n\t  $a = _makeTypesMatch[0];\n\t  $b = _makeTypesMatch[1];\n\t  var inputs = {\n\t    a: $a,\n\t    b: $b\n\t  };\n\t  return ENGINE.runKernel(Add, inputs);\n\t}\n\n\tvar add$1 = op({\n\t  add_: add_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Divides two `tf.Tensor`s element-wise, A / B. Supports broadcasting.\n\t * The result is rounded with floor function.\n\t *\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 4, 9, 16]);\n\t * const b = tf.tensor1d([1, 2, 3, 4]);\n\t *\n\t * a.floorDiv(b).print();  // or tf.div(a, b)\n\t * ```\n\t *\n\t * ```js\n\t * // Broadcast div a with b.\n\t * const a = tf.tensor1d([2, 4, 6, 8]);\n\t * const b = tf.scalar(2);\n\t *\n\t * a.floorDiv(b).print();  // or tf.floorDiv(a, b)\n\t * ```\n\t *\n\t * @param a The first tensor as the numerator.\n\t * @param b The second tensor as the denominator. Must have the same dtype as\n\t * `a`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n\t */\n\n\tfunction floorDiv_(a, b) {\n\t  var $a = convertToTensor(a, 'a', 'floorDiv');\n\t  var $b = convertToTensor(b, 'b', 'floorDiv');\n\n\t  var _makeTypesMatch = makeTypesMatch($a, $b);\n\n\t  $a = _makeTypesMatch[0];\n\t  $b = _makeTypesMatch[1];\n\t  var inputs = {\n\t    a: $a,\n\t    b: $b\n\t  };\n\t  return ENGINE.runKernel(FloorDiv, inputs);\n\t}\n\n\tvar floorDiv = op({\n\t  floorDiv_: floorDiv_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Divides two `tf.Tensor`s element-wise, A / B. Supports broadcasting.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 4, 9, 16]);\n\t * const b = tf.tensor1d([1, 2, 3, 4]);\n\t *\n\t * a.div(b).print();  // or tf.div(a, b)\n\t * ```\n\t *\n\t * ```js\n\t * // Broadcast div a with b.\n\t * const a = tf.tensor1d([2, 4, 6, 8]);\n\t * const b = tf.scalar(2);\n\t *\n\t * a.div(b).print();  // or tf.div(a, b)\n\t * ```\n\t *\n\t * @param a The first tensor as the numerator.\n\t * @param b The second tensor as the denominator. Must have the same dtype as\n\t * `a`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n\t */\n\n\tfunction div_(a, b) {\n\t  var $a = convertToTensor(a, 'a', 'div');\n\t  var $b = convertToTensor(b, 'b', 'div');\n\n\t  var _makeTypesMatch = makeTypesMatch($a, $b);\n\n\t  $a = _makeTypesMatch[0];\n\t  $b = _makeTypesMatch[1];\n\n\t  if ($a.dtype === 'int32' && $b.dtype === 'int32') {\n\t    return floorDiv($a, $b);\n\t  }\n\n\t  var inputs = {\n\t    a: $a,\n\t    b: $b\n\t  };\n\t  var attrs = {}; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  return ENGINE.runKernel(RealDiv, inputs, attrs);\n\t}\n\n\tvar div = op({\n\t  div_: div_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Multiplies two `tf.Tensor`s element-wise, A * B. Supports broadcasting.\n\t *\n\t * We also expose `tf.mulStrict` which has the same signature as this op and\n\t * asserts that `a` and `b` are the same shape (does not broadcast).\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 2, 3, 4]);\n\t * const b = tf.tensor1d([2, 3, 4, 5]);\n\t *\n\t * a.mul(b).print();  // or tf.mul(a, b)\n\t * ```\n\t *\n\t * ```js\n\t * // Broadcast mul a with b.\n\t * const a = tf.tensor1d([1, 2, 3, 4]);\n\t * const b = tf.scalar(5);\n\t *\n\t * a.mul(b).print();  // or tf.mul(a, b)\n\t * ```\n\t * @param a The first tensor to multiply.\n\t * @param b The second tensor to multiply. Must have the same dtype as `a`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n\t */\n\n\tfunction mul_(a, b) {\n\t  var $a = convertToTensor(a, 'a', 'mul');\n\t  var $b = convertToTensor(b, 'b', 'mul');\n\n\t  var _makeTypesMatch = makeTypesMatch($a, $b);\n\n\t  $a = _makeTypesMatch[0];\n\t  $b = _makeTypesMatch[1];\n\t  var inputs = {\n\t    a: $a,\n\t    b: $b\n\t  };\n\t  return ENGINE.runKernel(Multiply, inputs);\n\t}\n\n\tvar mul = op({\n\t  mul_: mul_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes absolute value element-wise: `abs(x)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([-1, 2, -3, 4]);\n\t *\n\t * x.abs().print();  // or tf.abs(x)\n\t * ```\n\t * @param x The input `tf.Tensor`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction abs_(x) {\n\t  var $x = convertToTensor(x, 'x', 'abs');\n\n\t  if ($x.dtype === 'complex64') {\n\t    var inputs = {\n\t      x: $x\n\t    };\n\t    return ENGINE.runKernel(ComplexAbs, inputs);\n\t  } else {\n\t    var _inputs = {\n\t      x: $x\n\t    };\n\t    return ENGINE.runKernel(Abs, _inputs);\n\t  }\n\t}\n\n\tvar abs$8 = op({\n\t  abs_: abs_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes acos of the input `tf.Tensor` element-wise: `acos(x)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([0, 1, -1, .7]);\n\t *\n\t * x.acos().print();  // or tf.acos(x)\n\t * ```\n\t * @param x The input tensor.\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction acos_(x) {\n\t  var $x = convertToTensor(x, 'x', 'acos');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Acos, inputs);\n\t}\n\n\tvar acos = op({\n\t  acos_: acos_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the inverse hyperbolic cos of the input `tf.Tensor` element-wise:\n\t * `acosh(x)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([10, 1, 3, 5.7]);\n\t *\n\t * x.acosh().print();  // or tf.acosh(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction acosh_(x) {\n\t  var $x = convertToTensor(x, 'x', 'acosh');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Acosh, inputs);\n\t}\n\n\tvar acosh = op({\n\t  acosh_: acosh_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Adds a list of `tf.Tensor`s element-wise, each with the same shape and dtype.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 2]);\n\t * const b = tf.tensor1d([3, 4]);\n\t * const c = tf.tensor1d([5, 6]);\n\t *\n\t * tf.addN([a, b, c]).print();\n\t * ```\n\t * @param tensors A list of tensors with the same shape and dtype.\n\t * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n\t */\n\n\tfunction addN_(tensors) {\n\t  assert(Array.isArray(tensors), function () {\n\t    return 'The argument passed to tf.addN() must be a list of tensors';\n\t  });\n\t  assert(tensors.length >= 1, function () {\n\t    return \"Must pass at least one tensor to tf.addN(), but got \" + (\"\" + tensors.length);\n\t  });\n\t  var $tensors = tensors.map(function (t, i) {\n\t    return convertToTensor(t, \"tensors\" + i, 'addN');\n\t  });\n\t  var firstTensor = $tensors[0];\n\t  $tensors.forEach(function (t) {\n\t    if (t.dtype !== firstTensor.dtype) {\n\t      throw new Error('All tensors passed to tf.addN() must have the same dtype');\n\t    }\n\t  });\n\t  $tensors.forEach(function (t) {\n\t    if (!arraysEqual(t.shape, firstTensor.shape)) {\n\t      throw new Error('All tensors passed to tf.addN() must have the same shape');\n\t    }\n\t  });\n\t  var inputs = $tensors;\n\t  return ENGINE.runKernel(AddN, inputs);\n\t}\n\n\tvar addN = op({\n\t  addN_: addN_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the logical and of elements across dimensions of a `tf.Tensor`.\n\t *\n\t * Reduces the input along the dimensions given in `axes`. Unless `keepDims`\n\t * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in\n\t * `axes`. If `keepDims` is true, the reduced dimensions are retained with\n\t * length 1. If `axes` has no entries, all dimensions are reduced, and an\n\t * `tf.Tensor` with a single element is returned.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 1, 1], 'bool');\n\t *\n\t * x.all().print();  // or tf.all(x)\n\t * ```\n\t *\n\t * ```js\n\t * const x = tf.tensor2d([1, 1, 0, 0], [2, 2], 'bool');\n\t *\n\t * const axis = 1;\n\t * x.all(axis).print();  // or tf.all(x, axis)\n\t * ```\n\t *\n\t * @param x The input tensor. Must be of dtype bool.\n\t * @param axis The dimension(s) to reduce. By default it reduces\n\t *     all dimensions.\n\t * @param keepDims If true, retains reduced dimensions with size 1.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Reduction'}\n\t */\n\n\tfunction all_(x, axis, keepDims) {\n\t  if (axis === void 0) {\n\t    axis = null;\n\t  }\n\n\t  if (keepDims === void 0) {\n\t    keepDims = false;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'all', 'bool');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    axis: axis,\n\t    keepDims: keepDims\n\t  };\n\t  return ENGINE.runKernel(All, inputs, attrs);\n\t}\n\n\tvar all = op({\n\t  all_: all_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the logical or of elements across dimensions of a `tf.Tensor`.\n\t *\n\t * Reduces the input along the dimensions given in `axes`. Unless `keepDims`\n\t * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in\n\t * `axes`. If `keepDims` is true, the reduced dimensions are retained with\n\t * length 1. If `axes` has no entries, all dimensions are reduced, and an\n\t * `tf.Tensor` with a single element is returned.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 1, 1], 'bool');\n\t *\n\t * x.any().print();  // or tf.any(x)\n\t * ```\n\t *\n\t * ```js\n\t * const x = tf.tensor2d([1, 1, 0, 0], [2, 2], 'bool');\n\t *\n\t * const axis = 1;\n\t * x.any(axis).print();  // or tf.any(x, axis)\n\t * ```\n\t *\n\t * @param x The input tensor. Must be of dtype bool.\n\t * @param axis The dimension(s) to reduce. By default it reduces\n\t *     all dimensions.\n\t * @param keepDims If true, retains reduced dimensions with size 1.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Reduction'}\n\t */\n\n\tfunction any_(x, axis, keepDims) {\n\t  if (axis === void 0) {\n\t    axis = null;\n\t  }\n\n\t  if (keepDims === void 0) {\n\t    keepDims = false;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'any', 'bool');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    axis: axis,\n\t    keepDims: keepDims\n\t  };\n\t  return ENGINE.runKernel(Any, inputs, attrs);\n\t} // tslint:disable-next-line:variable-name\n\n\n\tvar any = op({\n\t  any_: any_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google Inc. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns the indices of the maximum values along an `axis`.\n\t *\n\t * The result has the same shape as `input` with the dimension along `axis`\n\t * removed.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 3]);\n\t *\n\t * x.argMax().print();  // or tf.argMax(x)\n\t * ```\n\t *\n\t * ```js\n\t * const x = tf.tensor2d([1, 2, 4, 3], [2, 2]);\n\t *\n\t * const axis = 1;\n\t * x.argMax(axis).print();  // or tf.argMax(x, axis)\n\t * ```\n\t *\n\t * @param x The input tensor.\n\t * @param axis The dimension to reduce. Defaults to 0 (outer-most dimension).\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Reduction'}\n\t */\n\n\tfunction argMax_(x, axis) {\n\t  if (axis === void 0) {\n\t    axis = 0;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'argMax');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    axis: axis\n\t  };\n\t  return ENGINE.runKernel(ArgMax, inputs, attrs);\n\t}\n\n\tvar argMax = op({\n\t  argMax_: argMax_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google Inc. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns the indices of the minimum values along an `axis`.\n\t *\n\t * The result has the same shape as `input` with the dimension along `axis`\n\t * removed.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 3]);\n\t *\n\t * x.argMin().print();  // or tf.argMin(x)\n\t * ```\n\t *\n\t * ```js\n\t * const x = tf.tensor2d([1, 2, 4, 3], [2, 2]);\n\t *\n\t * const axis = 1;\n\t * x.argMin(axis).print();  // or tf.argMin(x, axis)\n\t * ```\n\t *\n\t * @param x The input tensor.\n\t * @param axis The dimension to reduce. Defaults to 0 (outer-most dimension).\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Reduction'}\n\t */\n\n\tfunction argMin_(x, axis) {\n\t  if (axis === void 0) {\n\t    axis = 0;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'argMin');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    axis: axis\n\t  };\n\t  return ENGINE.runKernel(ArgMin, inputs, attrs);\n\t}\n\n\tvar argMin = op({\n\t  argMin_: argMin_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes asin of the input `tf.Tensor` element-wise: `asin(x)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([0, 1, -1, .7]);\n\t *\n\t * x.asin().print();  // or tf.asin(x)\n\t * ```\n\t * @param x The input tensor.\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction asin_(x) {\n\t  var $x = convertToTensor(x, 'x', 'asin');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Asin, inputs);\n\t}\n\n\tvar asin = op({\n\t  asin_: asin_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes inverse hyperbolic sin of the input `tf.Tensor` element-wise:\n\t * `asinh(x)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([0, 1, -1, .7]);\n\t *\n\t * x.asinh().print();  // or tf.asinh(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction asinh_(x) {\n\t  var $x = convertToTensor(x, 'x', 'asinh');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Asinh, inputs);\n\t}\n\n\tvar asinh$1 = op({\n\t  asinh_: asinh_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes atan of the input `tf.Tensor` element-wise: `atan(x)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([0, 1, -1, .7]);\n\t *\n\t * x.atan().print();  // or tf.atan(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction atan_(x) {\n\t  var $x = convertToTensor(x, 'x', 'atan');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Atan, inputs);\n\t}\n\n\tvar atan = op({\n\t  atan_: atan_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes arctangent of `tf.Tensor`s a / b element-wise: `atan2(a, b)`.\n\t * Supports broadcasting.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1.0, 1.0, -1.0, .7]);\n\t * const b = tf.tensor1d([2.0, 13.0, 3.5, .21]);\n\t *\n\t * tf.atan2(a, b).print()\n\t * ```\n\t *\n\t * @param a The first tensor.\n\t * @param b The second tensor. Must have the same dtype as `a`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction atan2_(a, b) {\n\t  var $a = convertToTensor(a, 'a', 'atan2');\n\t  var $b = convertToTensor(b, 'b', 'atan2');\n\n\t  var _makeTypesMatch = makeTypesMatch($a, $b);\n\n\t  $a = _makeTypesMatch[0];\n\t  $b = _makeTypesMatch[1];\n\t  var inputs = {\n\t    a: $a,\n\t    b: $b\n\t  };\n\t  return ENGINE.runKernel(Atan2, inputs);\n\t}\n\n\tvar atan2 = op({\n\t  atan2_: atan2_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes inverse hyperbolic tan of the input `tf.Tensor` element-wise:\n\t * `atanh(x)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([0, .1, -.1, .7]);\n\t *\n\t * x.atanh().print();  // or tf.atanh(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction atanh_(x) {\n\t  var $x = convertToTensor(x, 'x', 'atanh');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Atanh, inputs);\n\t}\n\n\tvar atanh = op({\n\t  atanh_: atanh_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\t/**\n\t *\n\t * @param inputShape Input tensor shape is of the following dimensions:\n\t *     `[batch, height, width, inChannels]`.\n\t * @param filterShape The filter shape is of the following dimensions:\n\t *     `[filterHeight, filterWidth, depth]`.\n\t * @param strides The strides of the sliding window for each dimension of the\n\t *     input tensor: `[strideHeight, strideWidth]`.\n\t *     If `strides` is a single number,\n\t *     then `strideHeight == strideWidth`.\n\t * @param pad The type of padding algorithm.\n\t *    - `same` and stride 1: output will be of same size as input,\n\t *       regardless of filter size.\n\t *    - `valid`: output will be smaller than input if filter is larger\n\t *       than 1*1x1.\n\t *    - For more info, see this guide:\n\t *     [https://www.tensorflow.org/api_guides/python/nn#Convolution](\n\t *          https://www.tensorflow.org/api_guides/python/nn#Convolution)\n\t * @param dataFormat The data format of the input and output data.\n\t *     Defaults to 'NHWC'.\n\t * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`.\n\t *     Defaults to `[1, 1]`. If `dilations` is a single number, then\n\t *     `dilationHeight == dilationWidth`.\n\t */\n\tfunction computeDilation2DInfo(inputShape, filterShape, strides, pad, dataFormat, dilations) {\n\t  if (dataFormat === void 0) {\n\t    dataFormat = 'NHWC';\n\t  }\n\n\t  // `computerConv2DInfo` require filterShape to be in the dimension of:\n\t  // `[filterHeight, filterWidth, depth, outDepth]`, dilation2d doesn't have\n\t  // outDepth, it should have the same depth as the input.\n\t  // Input shape: [batch, height, width, inChannels]\n\t  var inputChannels = inputShape[3];\n\t  var $filterShape = [].concat(filterShape, [inputChannels]);\n\t  var $dataFormat = convertConv2DDataFormat(dataFormat);\n\t  return computeConv2DInfo(inputShape, $filterShape, strides, dilations, pad, null\n\t  /* roundingMode */\n\t  , null\n\t  /* depthWise */\n\t  , $dataFormat);\n\t}\n\tfunction computePool2DInfo(inShape, filterSize, strides, dilations, pad, roundingMode, dataFormat) {\n\t  if (dataFormat === void 0) {\n\t    dataFormat = 'channelsLast';\n\t  }\n\n\t  var _parseTupleParam = parseTupleParam(filterSize),\n\t      filterHeight = _parseTupleParam[0],\n\t      filterWidth = _parseTupleParam[1];\n\n\t  var filterShape;\n\n\t  if (dataFormat === 'channelsLast') {\n\t    filterShape = [filterHeight, filterWidth, inShape[3], inShape[3]];\n\t  } else if (dataFormat === 'channelsFirst') {\n\t    filterShape = [filterHeight, filterWidth, inShape[1], inShape[1]];\n\t  } else {\n\t    throw new Error(\"Unknown dataFormat \" + dataFormat);\n\t  }\n\n\t  return computeConv2DInfo(inShape, filterShape, strides, dilations, pad, roundingMode, false, dataFormat);\n\t}\n\t/**\n\t * Computes the information for a forward pass of a pooling3D operation.\n\t */\n\n\tfunction computePool3DInfo(inShape, filterSize, strides, dilations, pad, roundingMode, dataFormat) {\n\t  if (dataFormat === void 0) {\n\t    dataFormat = 'NDHWC';\n\t  }\n\n\t  var _parse3TupleParam = parse3TupleParam(filterSize),\n\t      filterDepth = _parse3TupleParam[0],\n\t      filterHeight = _parse3TupleParam[1],\n\t      filterWidth = _parse3TupleParam[2];\n\n\t  var filterShape;\n\t  var $dataFormat;\n\n\t  if (dataFormat === 'NDHWC') {\n\t    $dataFormat = 'channelsLast';\n\t    filterShape = [filterDepth, filterHeight, filterWidth, inShape[4], inShape[4]];\n\t  } else if (dataFormat === 'NCDHW') {\n\t    $dataFormat = 'channelsFirst';\n\t    filterShape = [filterDepth, filterHeight, filterWidth, inShape[1], inShape[1]];\n\t  } else {\n\t    throw new Error(\"Unknown dataFormat \" + dataFormat);\n\t  }\n\n\t  return computeConv3DInfo(inShape, filterShape, strides, dilations, pad, false, $dataFormat, roundingMode);\n\t}\n\t/**\n\t * Computes the information for a forward pass of a convolution/pooling\n\t * operation.\n\t */\n\n\tfunction computeConv2DInfo(inShape, filterShape, strides, dilations, pad, roundingMode, depthwise, dataFormat) {\n\t  if (depthwise === void 0) {\n\t    depthwise = false;\n\t  }\n\n\t  if (dataFormat === void 0) {\n\t    dataFormat = 'channelsLast';\n\t  }\n\n\t  var batchSize = -1,\n\t      inHeight = -1,\n\t      inWidth = -1,\n\t      inChannels = -1;\n\n\t  if (dataFormat === 'channelsLast') {\n\t    batchSize = inShape[0];\n\t    inHeight = inShape[1];\n\t    inWidth = inShape[2];\n\t    inChannels = inShape[3];\n\t  } else if (dataFormat === 'channelsFirst') {\n\t    batchSize = inShape[0];\n\t    inChannels = inShape[1];\n\t    inHeight = inShape[2];\n\t    inWidth = inShape[3];\n\t  } else {\n\t    throw new Error(\"Unknown dataFormat \" + dataFormat);\n\t  }\n\n\t  var filterHeight = filterShape[0],\n\t      filterWidth = filterShape[1],\n\t      filterChannels = filterShape[3];\n\n\t  var _parseTupleParam2 = parseTupleParam(strides),\n\t      strideHeight = _parseTupleParam2[0],\n\t      strideWidth = _parseTupleParam2[1];\n\n\t  var _parseTupleParam3 = parseTupleParam(dilations),\n\t      dilationHeight = _parseTupleParam3[0],\n\t      dilationWidth = _parseTupleParam3[1];\n\n\t  var effectiveFilterHeight = getEffectiveFilterSize(filterHeight, dilationHeight);\n\t  var effectiveFilterWidth = getEffectiveFilterSize(filterWidth, dilationWidth);\n\n\t  var _getPadAndOutInfo = getPadAndOutInfo(pad, inHeight, inWidth, strideHeight, strideWidth, effectiveFilterHeight, effectiveFilterWidth, roundingMode, dataFormat),\n\t      padInfo = _getPadAndOutInfo.padInfo,\n\t      outHeight = _getPadAndOutInfo.outHeight,\n\t      outWidth = _getPadAndOutInfo.outWidth;\n\n\t  var outChannels = depthwise ? filterChannels * inChannels : filterChannels;\n\t  var outShape;\n\n\t  if (dataFormat === 'channelsFirst') {\n\t    outShape = [batchSize, outChannels, outHeight, outWidth];\n\t  } else if (dataFormat === 'channelsLast') {\n\t    outShape = [batchSize, outHeight, outWidth, outChannels];\n\t  }\n\n\t  return {\n\t    batchSize: batchSize,\n\t    dataFormat: dataFormat,\n\t    inHeight: inHeight,\n\t    inWidth: inWidth,\n\t    inChannels: inChannels,\n\t    outHeight: outHeight,\n\t    outWidth: outWidth,\n\t    outChannels: outChannels,\n\t    padInfo: padInfo,\n\t    strideHeight: strideHeight,\n\t    strideWidth: strideWidth,\n\t    filterHeight: filterHeight,\n\t    filterWidth: filterWidth,\n\t    effectiveFilterHeight: effectiveFilterHeight,\n\t    effectiveFilterWidth: effectiveFilterWidth,\n\t    dilationHeight: dilationHeight,\n\t    dilationWidth: dilationWidth,\n\t    inShape: inShape,\n\t    outShape: outShape,\n\t    filterShape: filterShape\n\t  };\n\t}\n\t/**\n\t * Computes the information for a forward pass of a 3D convolution/pooling\n\t * operation.\n\t */\n\n\tfunction computeConv3DInfo(inShape, filterShape, strides, dilations, pad, depthwise, dataFormat, roundingMode) {\n\t  if (depthwise === void 0) {\n\t    depthwise = false;\n\t  }\n\n\t  if (dataFormat === void 0) {\n\t    dataFormat = 'channelsLast';\n\t  }\n\n\t  var batchSize = -1,\n\t      inDepth = -1,\n\t      inHeight = -1,\n\t      inWidth = -1,\n\t      inChannels = -1;\n\n\t  if (dataFormat === 'channelsLast') {\n\t    batchSize = inShape[0];\n\t    inDepth = inShape[1];\n\t    inHeight = inShape[2];\n\t    inWidth = inShape[3];\n\t    inChannels = inShape[4];\n\t  } else if (dataFormat === 'channelsFirst') {\n\t    batchSize = inShape[0];\n\t    inChannels = inShape[1];\n\t    inDepth = inShape[2];\n\t    inHeight = inShape[3];\n\t    inWidth = inShape[4];\n\t  } else {\n\t    throw new Error(\"Unknown dataFormat \" + dataFormat);\n\t  }\n\n\t  var filterDepth = filterShape[0],\n\t      filterHeight = filterShape[1],\n\t      filterWidth = filterShape[2],\n\t      filterChannels = filterShape[4];\n\n\t  var _parse3TupleParam2 = parse3TupleParam(strides),\n\t      strideDepth = _parse3TupleParam2[0],\n\t      strideHeight = _parse3TupleParam2[1],\n\t      strideWidth = _parse3TupleParam2[2];\n\n\t  var _parse3TupleParam3 = parse3TupleParam(dilations),\n\t      dilationDepth = _parse3TupleParam3[0],\n\t      dilationHeight = _parse3TupleParam3[1],\n\t      dilationWidth = _parse3TupleParam3[2];\n\n\t  var effectiveFilterDepth = getEffectiveFilterSize(filterDepth, dilationDepth);\n\t  var effectiveFilterHeight = getEffectiveFilterSize(filterHeight, dilationHeight);\n\t  var effectiveFilterWidth = getEffectiveFilterSize(filterWidth, dilationWidth);\n\n\t  var _get3DPadAndOutInfo = get3DPadAndOutInfo(pad, inDepth, inHeight, inWidth, strideDepth, strideHeight, strideWidth, effectiveFilterDepth, effectiveFilterHeight, effectiveFilterWidth, roundingMode),\n\t      padInfo = _get3DPadAndOutInfo.padInfo,\n\t      outDepth = _get3DPadAndOutInfo.outDepth,\n\t      outHeight = _get3DPadAndOutInfo.outHeight,\n\t      outWidth = _get3DPadAndOutInfo.outWidth;\n\n\t  var outChannels = depthwise ? filterChannels * inChannels : filterChannels;\n\t  var outShape;\n\n\t  if (dataFormat === 'channelsFirst') {\n\t    outShape = [batchSize, outChannels, outDepth, outHeight, outWidth];\n\t  } else if (dataFormat === 'channelsLast') {\n\t    outShape = [batchSize, outDepth, outHeight, outWidth, outChannels];\n\t  }\n\n\t  return {\n\t    batchSize: batchSize,\n\t    dataFormat: dataFormat,\n\t    inDepth: inDepth,\n\t    inHeight: inHeight,\n\t    inWidth: inWidth,\n\t    inChannels: inChannels,\n\t    outDepth: outDepth,\n\t    outHeight: outHeight,\n\t    outWidth: outWidth,\n\t    outChannels: outChannels,\n\t    padInfo: padInfo,\n\t    strideDepth: strideDepth,\n\t    strideHeight: strideHeight,\n\t    strideWidth: strideWidth,\n\t    filterDepth: filterDepth,\n\t    filterHeight: filterHeight,\n\t    filterWidth: filterWidth,\n\t    effectiveFilterDepth: effectiveFilterDepth,\n\t    effectiveFilterHeight: effectiveFilterHeight,\n\t    effectiveFilterWidth: effectiveFilterWidth,\n\t    dilationDepth: dilationDepth,\n\t    dilationHeight: dilationHeight,\n\t    dilationWidth: dilationWidth,\n\t    inShape: inShape,\n\t    outShape: outShape,\n\t    filterShape: filterShape\n\t  };\n\t}\n\n\tfunction computeOutputShape2D(inShape, fieldSize, stride, zeroPad, roundingMode) {\n\t  if (zeroPad == null) {\n\t    zeroPad = computeDefaultPad(inShape, fieldSize, stride);\n\t  }\n\n\t  var inputRows = inShape[0];\n\t  var inputCols = inShape[1];\n\t  var outputRows = round((inputRows - fieldSize + 2 * zeroPad) / stride + 1, roundingMode);\n\t  var outputCols = round((inputCols - fieldSize + 2 * zeroPad) / stride + 1, roundingMode);\n\t  return [outputRows, outputCols];\n\t}\n\n\tfunction computeOutputShape4D(inShape, fieldSize, outChannels, stride, zeroPad, roundingMode) {\n\t  if (zeroPad == null) {\n\t    zeroPad = computeDefaultPad(inShape, fieldSize, stride);\n\t  }\n\n\t  var inputDepth = inShape[0];\n\t  var inputRows = inShape[1];\n\t  var inputCols = inShape[2];\n\t  var outputDepths = round((inputDepth - fieldSize + 2 * zeroPad) / stride + 1, roundingMode);\n\t  var outputRows = round((inputRows - fieldSize + 2 * zeroPad) / stride + 1, roundingMode);\n\t  var outputCols = round((inputCols - fieldSize + 2 * zeroPad) / stride + 1, roundingMode);\n\t  return [outputDepths, outputRows, outputCols, outChannels];\n\t}\n\n\tfunction computeDefaultPad(inputShape, fieldSize, stride, dilation) {\n\t  if (dilation === void 0) {\n\t    dilation = 1;\n\t  }\n\n\t  var effectiveFieldSize = getEffectiveFilterSize(fieldSize, dilation);\n\t  return Math.floor((inputShape[0] * (stride - 1) - stride + effectiveFieldSize) / 2);\n\t}\n\n\tfunction parseTupleParam(param) {\n\t  if (typeof param === 'number') {\n\t    return [param, param, param];\n\t  }\n\n\t  if (param.length === 2) {\n\t    return [param[0], param[1], 1];\n\t  }\n\n\t  return param;\n\t}\n\n\tfunction parse3TupleParam(param) {\n\t  return typeof param === 'number' ? [param, param, param] : param;\n\t}\n\t/* See https://www.tensorflow.org/api_docs/python/tf/nn/atrous_conv2d\n\t * Atrous convolution is equivalent to standard convolution with upsampled\n\t * filters with effective_filter_height =\n\t * filter_height + (filter_height - 1) * (dilation - 1)\n\t * and effective_filter_width =\n\t * filter_width + (filter_width - 1) * (dilation - 1),\n\t * produced by inserting dilation - 1 zeros along consecutive elements across\n\t * the filters' spatial dimensions.\n\t * When there is a dilation, this converts a filter dimension to the\n\t * effective filter dimension, so it can be used in a standard convolution.\n\t */\n\n\n\tfunction getEffectiveFilterSize(filterSize, dilation) {\n\t  if (dilation <= 1) {\n\t    return filterSize;\n\t  }\n\n\t  return filterSize + (filterSize - 1) * (dilation - 1);\n\t}\n\n\tfunction getPadAndOutInfo(pad, inHeight, inWidth, strideHeight, strideWidth, filterHeight, filterWidth, roundingMode, dataFormat) {\n\t  var padInfo;\n\t  var outHeight;\n\t  var outWidth;\n\n\t  if (typeof pad === 'number') {\n\t    var padType = pad === 0 ? 'VALID' : 'NUMBER';\n\t    padInfo = {\n\t      top: pad,\n\t      bottom: pad,\n\t      left: pad,\n\t      right: pad,\n\t      type: padType\n\t    };\n\t    var outShape = computeOutputShape2D([inHeight, inWidth], filterHeight, strideHeight, pad, roundingMode);\n\t    outHeight = outShape[0];\n\t    outWidth = outShape[1];\n\t  } else if (pad === 'same') {\n\t    outHeight = Math.ceil(inHeight / strideHeight);\n\t    outWidth = Math.ceil(inWidth / strideWidth);\n\t    var padAlongHeight = Math.max(0, (outHeight - 1) * strideHeight + filterHeight - inHeight);\n\t    var padAlongWidth = Math.max(0, (outWidth - 1) * strideWidth + filterWidth - inWidth);\n\t    var top = Math.floor(padAlongHeight / 2);\n\t    var bottom = padAlongHeight - top;\n\t    var left = Math.floor(padAlongWidth / 2);\n\t    var right = padAlongWidth - left;\n\t    padInfo = {\n\t      top: top,\n\t      bottom: bottom,\n\t      left: left,\n\t      right: right,\n\t      type: 'SAME'\n\t    };\n\t  } else if (pad === 'valid') {\n\t    padInfo = {\n\t      top: 0,\n\t      bottom: 0,\n\t      left: 0,\n\t      right: 0,\n\t      type: 'VALID'\n\t    };\n\t    outHeight = Math.ceil((inHeight - filterHeight + 1) / strideHeight);\n\t    outWidth = Math.ceil((inWidth - filterWidth + 1) / strideWidth);\n\t  } else if (typeof pad === 'object') {\n\t    var _top = dataFormat === 'channelsLast' ? pad[1][0] : pad[2][0];\n\n\t    var _bottom = dataFormat === 'channelsLast' ? pad[1][1] : pad[2][1];\n\n\t    var _left = dataFormat === 'channelsLast' ? pad[2][0] : pad[3][0];\n\n\t    var _right = dataFormat === 'channelsLast' ? pad[2][1] : pad[3][1];\n\n\t    var _padType = _top === 0 && _bottom === 0 && _left === 0 && _right === 0 ? 'VALID' : 'EXPLICIT';\n\n\t    padInfo = {\n\t      top: _top,\n\t      bottom: _bottom,\n\t      left: _left,\n\t      right: _right,\n\t      type: _padType\n\t    };\n\t    outHeight = round((inHeight - filterHeight + _top + _bottom) / strideHeight + 1, roundingMode);\n\t    outWidth = round((inWidth - filterWidth + _left + _right) / strideWidth + 1, roundingMode);\n\t  } else {\n\t    throw Error(\"Unknown padding parameter: \" + pad);\n\t  }\n\n\t  return {\n\t    padInfo: padInfo,\n\t    outHeight: outHeight,\n\t    outWidth: outWidth\n\t  };\n\t}\n\n\tfunction get3DPadAndOutInfo(pad, inDepth, inHeight, inWidth, strideDepth, strideHeight, strideWidth, filterDepth, filterHeight, filterWidth, roundingMode) {\n\t  var padInfo;\n\t  var outDepth;\n\t  var outHeight;\n\t  var outWidth;\n\n\t  if (typeof pad === 'number') {\n\t    var padType = pad === 0 ? 'VALID' : 'NUMBER';\n\t    padInfo = {\n\t      top: pad,\n\t      bottom: pad,\n\t      left: pad,\n\t      right: pad,\n\t      front: pad,\n\t      back: pad,\n\t      type: padType\n\t    };\n\t    var outShape = computeOutputShape4D([inDepth, inHeight, inWidth, 1], filterDepth, 1, strideDepth, pad, roundingMode);\n\t    outDepth = outShape[0];\n\t    outHeight = outShape[1];\n\t    outWidth = outShape[2];\n\t  } else if (pad === 'same') {\n\t    outDepth = Math.ceil(inDepth / strideDepth);\n\t    outHeight = Math.ceil(inHeight / strideHeight);\n\t    outWidth = Math.ceil(inWidth / strideWidth);\n\t    var padAlongDepth = (outDepth - 1) * strideDepth + filterDepth - inDepth;\n\t    var padAlongHeight = (outHeight - 1) * strideHeight + filterHeight - inHeight;\n\t    var padAlongWidth = (outWidth - 1) * strideWidth + filterWidth - inWidth;\n\t    var front = Math.floor(padAlongDepth / 2);\n\t    var back = padAlongDepth - front;\n\t    var top = Math.floor(padAlongHeight / 2);\n\t    var bottom = padAlongHeight - top;\n\t    var left = Math.floor(padAlongWidth / 2);\n\t    var right = padAlongWidth - left;\n\t    padInfo = {\n\t      top: top,\n\t      bottom: bottom,\n\t      left: left,\n\t      right: right,\n\t      front: front,\n\t      back: back,\n\t      type: 'SAME'\n\t    };\n\t  } else if (pad === 'valid') {\n\t    padInfo = {\n\t      top: 0,\n\t      bottom: 0,\n\t      left: 0,\n\t      right: 0,\n\t      front: 0,\n\t      back: 0,\n\t      type: 'VALID'\n\t    };\n\t    outDepth = Math.ceil((inDepth - filterDepth + 1) / strideDepth);\n\t    outHeight = Math.ceil((inHeight - filterHeight + 1) / strideHeight);\n\t    outWidth = Math.ceil((inWidth - filterWidth + 1) / strideWidth);\n\t  } else {\n\t    throw Error(\"Unknown padding parameter: \" + pad);\n\t  }\n\n\t  return {\n\t    padInfo: padInfo,\n\t    outDepth: outDepth,\n\t    outHeight: outHeight,\n\t    outWidth: outWidth\n\t  };\n\t}\n\t/**\n\t * Rounds a value depending on the rounding mode\n\t * @param value\n\t * @param roundingMode A string from: 'ceil', 'round', 'floor'. If none is\n\t *     provided, it will default to truncate.\n\t */\n\n\n\tfunction round(value, roundingMode) {\n\t  if (!roundingMode) {\n\t    return Math.trunc(value);\n\t  }\n\n\t  switch (roundingMode) {\n\t    case 'round':\n\t      // used for Caffe Conv\n\t      return Math.round(value);\n\n\t    case 'ceil':\n\t      // used for Caffe Pool\n\t      return Math.ceil(value);\n\n\t    case 'floor':\n\t      return Math.floor(value);\n\n\t    default:\n\t      throw new Error(\"Unknown roundingMode \" + roundingMode);\n\t  }\n\t}\n\n\tfunction tupleValuesAreOne(param) {\n\t  var _parseTupleParam4 = parseTupleParam(param),\n\t      dimA = _parseTupleParam4[0],\n\t      dimB = _parseTupleParam4[1],\n\t      dimC = _parseTupleParam4[2];\n\n\t  return dimA === 1 && dimB === 1 && dimC === 1;\n\t}\n\tfunction eitherStridesOrDilationsAreOne(strides, dilations) {\n\t  return tupleValuesAreOne(strides) || tupleValuesAreOne(dilations);\n\t}\n\t/**\n\t * Convert Conv2D dataFormat from 'NHWC'|'NCHW' to\n\t *    'channelsLast'|'channelsFirst'\n\t * @param dataFormat in 'NHWC'|'NCHW' mode\n\t * @return dataFormat in 'channelsLast'|'channelsFirst' mode\n\t * @throws unknown dataFormat\n\t */\n\n\tfunction convertConv2DDataFormat(dataFormat) {\n\t  if (dataFormat === 'NHWC') {\n\t    return 'channelsLast';\n\t  } else if (dataFormat === 'NCHW') {\n\t    return 'channelsFirst';\n\t  } else {\n\t    throw new Error(\"Unknown dataFormat \" + dataFormat);\n\t  }\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Reshapes a `tf.Tensor` to a given shape.\n\t *\n\t * Given an input tensor, returns a new tensor with the same values as the\n\t * input tensor with shape `shape`.\n\t *\n\t * If one component of shape is the special value -1, the size of that\n\t * dimension is computed so that the total size remains constant. In\n\t * particular, a shape of [-1] flattens into 1-D. At most one component of\n\t * shape can be -1.\n\t *\n\t * If shape is 1-D or higher, then the operation returns a tensor with shape\n\t * shape filled with the values of tensor. In this case, the number of\n\t * elements implied by shape must be the same as the number of elements in\n\t * tensor.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 3, 4]);\n\t * x.reshape([2, 2]).print();\n\t * ```\n\t *\n\t * @param x The input tensor to be reshaped.\n\t * @param shape An array of integers defining the output tensor shape.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Transformations'}\n\t */\n\n\tfunction reshape_(x, shape) {\n\t  var $x = convertToTensor(x, 'x', 'reshape', 'string_or_numeric');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    shape: shape\n\t  };\n\t  return ENGINE.runKernel(Reshape, inputs, attrs);\n\t}\n\n\tvar reshape = op({\n\t  reshape_: reshape_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the 2D average pooling of an image.\n\t *\n\t * @param x The input tensor, of rank 4 or rank 3 of shape\n\t *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n\t * @param filterSize The filter size: `[filterHeight, filterWidth]`. If\n\t *     `filterSize` is a single number, then `filterHeight == filterWidth`.\n\t * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If\n\t *     `strides` is a single number, then `strideHeight == strideWidth`.\n\t * @param pad The type of padding algorithm:\n\t *    - `same` and stride 1: output will be of same size as input,\n\t *       regardless of filter size.\n\t *    - `valid`: output will be smaller than input if filter is larger\n\t *       than 1x1.\n\t *    - For more info, see this guide:\n\t *     [https://www.tensorflow.org/api_guides/python/nn#Convolution](\n\t *         https://www.tensorflow.org/api_guides/python/nn#Convolution)\n\t * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n\t *     provided, it will default to truncate.\n\t */\n\n\tfunction avgPool_(x, filterSize, strides, pad, dimRoundingMode) {\n\t  var $x = convertToTensor(x, 'x', 'avgPool', 'float32');\n\t  var dilations = 1;\n\t  assert(eitherStridesOrDilationsAreOne(strides, dilations), function () {\n\t    return 'Error in avgPool: Either strides or dilations must be 1. ' + (\"Got strides \" + strides + \" and dilations '\" + dilations + \"'\");\n\t  });\n\t  var x4D = $x;\n\t  var reshapedTo4D = false;\n\n\t  if ($x.rank === 3) {\n\t    reshapedTo4D = true;\n\t    x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n\t  }\n\n\t  assert(x4D.rank === 4, function () {\n\t    return \"Error in avgPool: x must be rank 4 but got rank \" + x4D.rank + \".\";\n\t  });\n\n\t  if (dimRoundingMode != null) {\n\t    assert(isInt(pad), function () {\n\t      return \"Error in avgPool: pad must be an integer when using, \" + (\"dimRoundingMode \" + dimRoundingMode + \" but got pad \" + pad + \".\");\n\t    });\n\t  }\n\n\t  var inputs = {\n\t    x: x4D\n\t  };\n\t  var attrs = {\n\t    filterSize: filterSize,\n\t    strides: strides,\n\t    pad: pad,\n\t    dimRoundingMode: dimRoundingMode\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var res = ENGINE.runKernel(AvgPool, inputs, attrs);\n\t  res = cast(res, $x.dtype);\n\n\t  if (reshapedTo4D) {\n\t    return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n\t  }\n\n\t  return res;\n\t}\n\n\tvar avgPool = op({\n\t  avgPool_: avgPool_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the 3D average pooling.\n\t *\n\t * ```js\n\t * const x = tf.tensor5d([1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 2, 2, 1]);\n\t * const result = tf.avgPool3d(x, 2, 1, 'valid');\n\t * result.print();\n\t * ```\n\t *\n\t * @param x The input tensor, of rank 5 or rank 4 of shape\n\t *     `[batch, depth, height, width, inChannels]`.\n\t * @param filterSize The filter size:\n\t *     `[filterDepth, filterHeight, filterWidth]`.\n\t *     If `filterSize` is a single number,\n\t *     then `filterDepth == filterHeight == filterWidth`.\n\t * @param strides The strides of the pooling:\n\t *     `[strideDepth, strideHeight, strideWidth]`.\n\t *     If `strides` is a single number,\n\t *     then `strideDepth == strideHeight == strideWidth`.\n\t * @param pad The type of padding algorithm.\n\t *    - `same` and stride 1: output will be of same size as input,\n\t *       regardless of filter size.\n\t *    - `valid`: output will be smaller than input if filter is larger\n\t *       than 1*1x1.\n\t *    - For more info, see this guide:\n\t *     [https://www.tensorflow.org/api_guides/python/nn#Convolution](\n\t *          https://www.tensorflow.org/api_guides/python/nn#Convolution)\n\t * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n\t *     provided, it will default to truncate.\n\t * @param dataFormat An optional string from: \"NDHWC\", \"NCDHW\". Defaults to\n\t *     \"NDHWC\". Specify the data format of the input and output data. With the\n\t *     default format \"NDHWC\", the data is stored in the order of: [batch,\n\t *     depth, height, width, channels]. Only \"NDHWC\" is currently supported.\n\t * @param dilations Deprecated, this field will be gone in v3.0.0.\n\t *     The dilation rates:\n\t *     `[dilationDepth, dilationHeight, dilationWidth]`\n\t *     in which we sample input values across the depth, height and width\n\t *     dimensions in dilated pooling.\n\t *     Defaults to `[1, 1, 1]`. If `dilations` is a single number,\n\t *     then `dilationDepth == dilationHeight == dilationWidth`.\n\t *     If it is greater than 1, then all values of `strides` must be 1.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Convolution'}\n\t */\n\n\tfunction avgPool3d_(x, filterSize, strides, pad, dimRoundingMode, dataFormat, dilations) {\n\t  if (dataFormat === void 0) {\n\t    dataFormat = 'NDHWC';\n\t  }\n\n\t  if (dilations == null) {\n\t    dilations = [1, 1, 1];\n\t  } else {\n\t    deprecationWarn('dilations is deprecated, this field will be gone in ' + 'v3.0.0.');\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'avgPool3d', 'float32');\n\t  var x5D = $x;\n\t  var reshapedTo5D = false;\n\n\t  if ($x.rank === 4) {\n\t    reshapedTo5D = true;\n\t    x5D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2], $x.shape[3]]);\n\t  }\n\n\t  assert(x5D.rank === 5, function () {\n\t    return \"Error in avgPool3d: x must be rank 5 but got rank \" + x5D.rank + \".\";\n\t  });\n\t  assert(dataFormat === 'NDHWC', function () {\n\t    return \"Error in avgPool3d: Only NDHWC is currently supported, \" + (\"but got dataFormat of \" + dataFormat);\n\t  });\n\t  assert(eitherStridesOrDilationsAreOne(strides, dilations), function () {\n\t    return 'Error in avgPool3d: Either strides or dilations must be 1. ' + (\"Got strides \" + strides + \" and dilations '\" + dilations + \"'\");\n\t  });\n\n\t  if (dimRoundingMode != null) {\n\t    assert(isInt(pad), function () {\n\t      return \"Error in avgPool3d: pad must be an integer when using, \" + (\"dimRoundingMode \" + dimRoundingMode + \" but got pad \" + pad + \".\");\n\t    });\n\t  }\n\n\t  var inputs = {\n\t    x: x5D\n\t  };\n\t  var attrs = {\n\t    filterSize: filterSize,\n\t    strides: strides,\n\t    pad: pad,\n\t    dimRoundingMode: dimRoundingMode,\n\t    dataFormat: dataFormat,\n\t    dilations: dilations\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var res = ENGINE.runKernel(AvgPool3D, inputs, attrs);\n\t  res = cast(res, x5D.dtype);\n\n\t  if (reshapedTo5D) {\n\t    return reshape(res, [res.shape[1], res.shape[2], res.shape[3], res.shape[4]]);\n\t  }\n\n\t  return res;\n\t}\n\n\tvar avgPool3d = op({\n\t  avgPool3d_: avgPool3d_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Concatenates a list of `tf.Tensor`s along a given axis.\n\t *\n\t * The tensors ranks and types must match, and their sizes must match in all\n\t * dimensions except `axis`.\n\t *\n\t * Also available are stricter rank-specific methods that assert that\n\t * `tensors` are of the given rank:\n\t *   - `tf.concat1d`\n\t *   - `tf.concat2d`\n\t *   - `tf.concat3d`\n\t *   - `tf.concat4d`\n\t *\n\t * Except `tf.concat1d` (which does not have axis param), all methods have\n\t * same signature as this method.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 2]);\n\t * const b = tf.tensor1d([3, 4]);\n\t * a.concat(b).print();  // or a.concat(b)\n\t * ```\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 2]);\n\t * const b = tf.tensor1d([3, 4]);\n\t * const c = tf.tensor1d([5, 6]);\n\t * tf.concat([a, b, c]).print();\n\t * ```\n\t *\n\t * ```js\n\t * const a = tf.tensor2d([[1, 2], [10, 20]]);\n\t * const b = tf.tensor2d([[3, 4], [30, 40]]);\n\t * const axis = 1;\n\t * tf.concat([a, b], axis).print();\n\t * ```\n\t * @param tensors A list of tensors to concatenate.\n\t * @param axis The axis to concate along. Defaults to 0 (the first dim).\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n\t */\n\n\tfunction concat_(tensors, axis) {\n\t  if (axis === void 0) {\n\t    axis = 0;\n\t  }\n\n\t  assert(tensors.length >= 1, function () {\n\t    return 'Pass at least one tensor to concat';\n\t  });\n\t  var $tensors = convertToTensorArray(tensors, 'tensors', 'concat', 'string_or_numeric');\n\n\t  if ($tensors[0].dtype === 'complex64') {\n\t    $tensors.forEach(function (tensor) {\n\t      if (tensor.dtype !== 'complex64') {\n\t        throw new Error(\"Cannot concatenate complex64 tensors with a tensor\\n          with dtype \" + tensor.dtype + \". \");\n\t      }\n\t    });\n\t  }\n\n\t  if ($tensors.length === 1) {\n\t    return clone($tensors[0]);\n\t  }\n\n\t  var inputs = $tensors;\n\t  var attr = {\n\t    axis: axis\n\t  };\n\t  return ENGINE.runKernel(Concat, inputs, attr);\n\t}\n\n\tvar concat = op({\n\t  concat_: concat_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes sigmoid element-wise, `1 / (1 + exp(-x))`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([0, -1, 2, -3]);\n\t *\n\t * x.sigmoid().print();  // or tf.sigmoid(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction sigmoid_(x) {\n\t  var $x = convertToTensor(x, 'x', 'sigmoid');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Sigmoid, inputs);\n\t}\n\n\tvar sigmoid = op({\n\t  sigmoid_: sigmoid_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Extracts a slice from a `tf.Tensor` starting at coordinates `begin`\n\t * and is of size `size`.\n\t *\n\t * Also available are stricter rank-specific methods with the same signature\n\t * as this method that assert that `x` is of the given rank:\n\t *   - `tf.slice1d`\n\t *   - `tf.slice2d`\n\t *   - `tf.slice3d`\n\t *   - `tf.slice4d`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 3, 4]);\n\t *\n\t * x.slice([1], [2]).print();\n\t * ```\n\t *\n\t * ```js\n\t * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n\t *\n\t * x.slice([1, 0], [1, 2]).print();\n\t * ```\n\t * @param x The input `tf.Tensor` to slice from.\n\t * @param begin The coordinates to start the slice from. The length can be\n\t *     less than the rank of x - the rest of the axes will have implicit 0 as\n\t *     start. Can also be a single number, in which case it specifies the\n\t *     first axis.\n\t * @param size The size of the slice. The length can be less than the rank of\n\t *     x - the rest of the axes will have implicit -1. A value of -1 requests\n\t *     the rest of the dimensions in the axis. Can also be a single number,\n\t *     in which case it specifies the size of the first axis.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n\t */\n\n\tfunction slice_(x, begin, size) {\n\t  var $x = convertToTensor(x, 'x', 'slice', 'string_or_numeric');\n\n\t  if ($x.rank === 0) {\n\t    throw new Error('Slicing scalar is not possible');\n\t  }\n\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    begin: begin,\n\t    size: size\n\t  };\n\t  return ENGINE.runKernel(Slice, inputs, attrs);\n\t}\n\n\tvar slice$2 = op({\n\t  slice_: slice_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes hyperbolic tangent of the input `tf.Tensor` element-wise: `tanh(x)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([0, 1, -1, 70]);\n\t *\n\t * x.tanh().print();  // or tf.tanh(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction tanh_(x) {\n\t  var $x = convertToTensor(x, 'x', 'tanh');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Tanh, inputs);\n\t}\n\n\tvar tanh$1 = op({\n\t  tanh_: tanh_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the next state and output of a BasicLSTMCell.\n\t *\n\t * Returns `[newC, newH]`.\n\t *\n\t * Derived from tf.contrib.rnn.BasicLSTMCell.\n\t *\n\t * @param forgetBias Forget bias for the cell.\n\t * @param lstmKernel The weights for the cell.\n\t * @param lstmBias The bias for the cell.\n\t * @param data The input to the cell.\n\t * @param c Previous cell state.\n\t * @param h Previous cell output.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'RNN'}\n\t */\n\n\tfunction basicLSTMCell_(forgetBias, lstmKernel, lstmBias, data, c, h) {\n\t  var $forgetBias = convertToTensor(forgetBias, 'forgetBias', 'basicLSTMCell');\n\t  var $lstmKernel = convertToTensor(lstmKernel, 'lstmKernel', 'basicLSTMCell');\n\t  var $lstmBias = convertToTensor(lstmBias, 'lstmBias', 'basicLSTMCell');\n\t  var $data = convertToTensor(data, 'data', 'basicLSTMCell');\n\t  var $c = convertToTensor(c, 'c', 'basicLSTMCell');\n\t  var $h = convertToTensor(h, 'h', 'basicLSTMCell');\n\t  var combined = concat([$data, $h], 1);\n\t  var weighted = matMul(combined, $lstmKernel);\n\t  var res = add$1(weighted, $lstmBias); // i = input_gate, j = new_input, f = forget_gate, o = output_gate\n\n\t  var batchSize = res.shape[0];\n\t  var sliceCols = res.shape[1] / 4;\n\t  var sliceSize = [batchSize, sliceCols];\n\t  var i = slice$2(res, [0, 0], sliceSize);\n\t  var j = slice$2(res, [0, sliceCols], sliceSize);\n\t  var f = slice$2(res, [0, sliceCols * 2], sliceSize);\n\t  var o = slice$2(res, [0, sliceCols * 3], sliceSize);\n\t  var newC = add$1(mul(sigmoid(i), tanh$1(j)), mul($c, sigmoid(add$1($forgetBias, f))));\n\t  var newH = mul(tanh$1(newC), sigmoid(o));\n\t  return [newC, newH];\n\t}\n\n\tvar basicLSTMCell = op({\n\t  basicLSTMCell_: basicLSTMCell_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * This operation reshapes the \"batch\" dimension 0 into `M + 1` dimensions of\n\t * shape `blockShape + [batch]`, interleaves these blocks back into the grid\n\t * defined by the spatial dimensions `[1, ..., M]`, to obtain a result with\n\t * the same rank as the input. The spatial dimensions of this intermediate\n\t * result are then optionally cropped according to `crops` to produce the\n\t * output. This is the reverse of `tf.spaceToBatchND`. See below for a precise\n\t * description.\n\t *\n\t * ```js\n\t * const x = tf.tensor4d([1, 2, 3, 4], [4, 1, 1, 1]);\n\t * const blockShape = [2, 2];\n\t * const crops = [[0, 0], [0, 0]];\n\t *\n\t * x.batchToSpaceND(blockShape, crops).print();\n\t * ```\n\t *\n\t * @param x A `tf.Tensor`. N-D with `x.shape` = `[batch] + spatialShape +\n\t * remainingShape`, where spatialShape has `M` dimensions.\n\t * @param blockShape A 1-D array. Must have shape `[M]`, all values must\n\t * be >= 1.\n\t * @param crops A 2-D array.  Must have shape `[M, 2]`, all values must be >= 0.\n\t * `crops[i] = [cropStart, cropEnd]` specifies the amount to crop from input\n\t * dimension `i + 1`, which corresponds to spatial dimension `i`. It is required\n\t * that `cropStart[i] + cropEnd[i] <= blockShape[i] * inputShape[i + 1]`\n\t *\n\t * This operation is equivalent to the following steps:\n\t *\n\t * 1. Reshape `x` to `reshaped` of shape: `[blockShape[0], ...,\n\t * blockShape[M-1], batch / prod(blockShape), x.shape[1], ...,\n\t * x.shape[N-1]]`\n\t *\n\t * 2. Permute dimensions of `reshaped`to produce `permuted` of shape `[batch /\n\t * prod(blockShape),x.shape[1], blockShape[0], ..., x.shape[M],\n\t * blockShape[M-1],x.shape[M+1], ..., x.shape[N-1]]`\n\t *\n\t * 3. Reshape `permuted` to produce `reshapedPermuted` of shape `[batch /\n\t * prod(blockShape),x.shape[1] * blockShape[0], ..., x.shape[M] *\n\t * blockShape[M-1],x.shape[M+1], ..., x.shape[N-1]]`\n\t *\n\t * 4. Crop the start and end of dimensions `[1, ..., M]` of `reshapedPermuted`\n\t * according to `crops` to produce the output of shape: `[batch /\n\t * prod(blockShape),x.shape[1] * blockShape[0] - crops[0,0] - crops[0,1],\n\t * ..., x.shape[M] * blockShape[M-1] - crops[M-1,0] -\n\t * crops[M-1,1],x.shape[M+1], ..., x.shape[N-1]]`\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Transformations'}\n\t */\n\n\tfunction batchToSpaceND_(x, blockShape, crops) {\n\t  var $x = convertToTensor(x, 'x', 'batchToSpaceND');\n\t  var prod = blockShape.reduce(function (a, b) {\n\t    return a * b;\n\t  });\n\t  assert($x.rank >= 1 + blockShape.length, function () {\n\t    return \"input rank is \" + $x.rank + \" but should be > than blockShape.length \" + blockShape.length;\n\t  });\n\t  assert(crops.length === blockShape.length, function () {\n\t    return \"crops.length is \" + crops.length + \" but should be equal to blockShape.length  \" + blockShape.length;\n\t  });\n\t  assert($x.shape[0] % prod === 0, function () {\n\t    return \"input tensor batch is \" + $x.shape[0] + \" but is not divisible by the product of \" + (\"the elements of blockShape \" + blockShape.join(' * ') + \" === \" + prod);\n\t  });\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    blockShape: blockShape,\n\t    crops: crops\n\t  };\n\t  return ENGINE.runKernel(BatchToSpaceND, inputs, attrs);\n\t}\n\n\tvar batchToSpaceND = op({\n\t  batchToSpaceND_: batchToSpaceND_\n\t});\n\n\tfunction xAs4D(x) {\n\t  var x4D;\n\n\t  if (x.rank === 0 || x.rank === 1) {\n\t    x4D = reshape(x, [1, 1, 1, x.size]);\n\t  } else if (x.rank === 2) {\n\t    x4D = reshape(x, [1, 1, x.shape[0], x.shape[1]]);\n\t  } else if (x.rank === 3) {\n\t    x4D = reshape(x, [1, x.shape[0], x.shape[1], x.shape[2]]);\n\t  } else {\n\t    x4D = x;\n\t  }\n\n\t  return x4D;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Batch normalization.\n\t *\n\t * As described in\n\t * [http://arxiv.org/abs/1502.03167](http://arxiv.org/abs/1502.03167).\n\t *\n\t * Mean, variance, scale, and offset can be of two shapes:\n\t *   - The same shape as the input.\n\t *   - In the common case, the depth dimension is the last dimension of x, so\n\t *     the values would be an `tf.Tensor1D` of shape [depth].\n\t *\n\t * Also available are stricter rank-specific methods with the same signature\n\t * as this method that assert that parameters passed are of given rank\n\t *   - `tf.batchNorm2d`\n\t *   - `tf.batchNorm3d`\n\t *   - `tf.batchNorm4d`\n\t *\n\t * @param x The input Tensor.\n\t * @param mean A mean Tensor.\n\t * @param variance A variance Tensor.\n\t * @param offset An offset Tensor.\n\t * @param scale A scale Tensor.\n\t * @param varianceEpsilon A small float number to avoid dividing by 0.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Normalization'}\n\t */\n\n\tfunction batchNorm_(x, mean, variance, offset, scale, varianceEpsilon) {\n\t  if (varianceEpsilon == null) {\n\t    varianceEpsilon = 0.001;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'batchNorm');\n\t  var $mean = convertToTensor(mean, 'mean', 'batchNorm');\n\t  var $variance = convertToTensor(variance, 'variance', 'batchNorm');\n\t  var $scale;\n\n\t  if (scale != null) {\n\t    $scale = convertToTensor(scale, 'scale', 'batchNorm');\n\t  }\n\n\t  var $offset;\n\n\t  if (offset != null) {\n\t    $offset = convertToTensor(offset, 'offset', 'batchNorm');\n\t  }\n\n\t  assert($mean.rank === $variance.rank, function () {\n\t    return 'Batch normalization gradient requires mean and variance to have ' + 'equal ranks.';\n\t  });\n\t  assert($offset == null || $mean.rank === $offset.rank, function () {\n\t    return 'Batch normalization gradient requires mean and offset to have ' + 'equal ranks.';\n\t  });\n\t  assert($scale == null || $mean.rank === $scale.rank, function () {\n\t    return 'Batch normalization gradient requires mean and scale to have ' + 'equal ranks.';\n\t  });\n\t  var x4D = xAs4D($x);\n\t  var inputs = {\n\t    x: x4D,\n\t    scale: $scale,\n\t    offset: $offset,\n\t    mean: $mean,\n\t    variance: $variance\n\t  };\n\t  var attrs = {\n\t    varianceEpsilon: varianceEpsilon\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var res = ENGINE.runKernel(FusedBatchNorm, inputs, attrs);\n\t  return reshape(res, $x.shape);\n\t}\n\n\tvar batchNorm = op({\n\t  batchNorm_: batchNorm_\n\t});\n\n\t/**\n\t * Batch normalization, strictly for 2D. For the more relaxed version, see\n\t * `tf.batchNorm`.\n\t *\n\t * @param x The input Tensor.\n\t * @param mean A mean Tensor.\n\t * @param variance A variance Tensor.\n\t * @param offset An offset Tensor.\n\t * @param scale A scale Tensor.\n\t * @param varianceEpsilon A small float number to avoid dividing by 0.\n\t */\n\n\tfunction batchNorm2d_(x, mean, variance, offset, scale, varianceEpsilon) {\n\t  var $x = convertToTensor(x, 'x', 'batchNorm');\n\t  var $mean = convertToTensor(mean, 'mean', 'batchNorm');\n\t  var $variance = convertToTensor(variance, 'variance', 'batchNorm');\n\t  var $scale;\n\n\t  if (scale != null) {\n\t    $scale = convertToTensor(scale, 'scale', 'batchNorm');\n\t  }\n\n\t  var $offset;\n\n\t  if (offset != null) {\n\t    $offset = convertToTensor(offset, 'offset', 'batchNorm');\n\t  }\n\n\t  assert($x.rank === 2, function () {\n\t    return \"Error in batchNorm2D: x must be rank 2 but got rank \" + ($x.rank + \".\");\n\t  });\n\t  assert($mean.rank === 2 || $mean.rank === 1, function () {\n\t    return \"Error in batchNorm2D: mean must be rank 2 or rank 1 but \" + (\"got rank \" + $mean.rank + \".\");\n\t  });\n\t  assert($variance.rank === 2 || $variance.rank === 1, function () {\n\t    return \"Error in batchNorm2D: variance must be rank 2 or rank 1 \" + (\"but got rank \" + $variance.rank + \".\");\n\t  });\n\n\t  if ($scale != null) {\n\t    assert($scale.rank === 2 || $scale.rank === 1, function () {\n\t      return \"Error in batchNorm2D: scale must be rank 2 or rank 1 \" + (\"but got rank \" + $scale.rank + \".\");\n\t    });\n\t  }\n\n\t  if ($offset != null) {\n\t    assert($offset.rank === 2 || $offset.rank === 1, function () {\n\t      return \"Error in batchNorm2D: offset must be rank 2 or rank 1 \" + (\"but got rank \" + $offset.rank + \".\");\n\t    });\n\t  }\n\n\t  return batchNorm($x, $mean, $variance, $offset, $scale, varianceEpsilon);\n\t}\n\n\tvar batchNorm2d = op({\n\t  batchNorm2d_: batchNorm2d_\n\t});\n\n\t/**\n\t * Batch normalization, strictly for 3D. For the more relaxed version, see\n\t * `tf.batchNorm`.\n\t *\n\t * @param x The input Tensor.\n\t * @param mean A mean Tensor.\n\t * @param variance A variance Tensor.\n\t * @param offset An offset Tensor.\n\t * @param scale A scale Tensor.\n\t * @param varianceEpsilon A small float number to avoid dividing by 0.\n\t */\n\n\tfunction batchNorm3d_(x, mean, variance, offset, scale, varianceEpsilon) {\n\t  var $x = convertToTensor(x, 'x', 'batchNorm');\n\t  var $mean = convertToTensor(mean, 'mean', 'batchNorm');\n\t  var $variance = convertToTensor(variance, 'variance', 'batchNorm');\n\t  var $scale;\n\n\t  if (scale != null) {\n\t    $scale = convertToTensor(scale, 'scale', 'batchNorm');\n\t  }\n\n\t  var $offset;\n\n\t  if (offset != null) {\n\t    $offset = convertToTensor(offset, 'offset', 'batchNorm');\n\t  }\n\n\t  assert($x.rank === 3, function () {\n\t    return \"Error in batchNorm3D: x must be rank 3 but got rank \" + ($x.rank + \".\");\n\t  });\n\t  assert($mean.rank === 3 || $mean.rank === 1, function () {\n\t    return \"Error in batchNorm3D: mean must be rank 3 or rank 1 but \" + (\"got rank \" + $mean.rank + \".\");\n\t  });\n\t  assert($variance.rank === 3 || $variance.rank === 1, function () {\n\t    return \"Error in batchNorm3D: variance must be rank 3 or rank 1 \" + (\"but got rank \" + $variance.rank + \".\");\n\t  });\n\n\t  if ($scale != null) {\n\t    assert($scale.rank === 3 || $scale.rank === 1, function () {\n\t      return \"Error in batchNorm3D: scale must be rank 3 or rank 1 \" + (\"but got rank \" + $scale.rank + \".\");\n\t    });\n\t  }\n\n\t  if ($offset != null) {\n\t    assert($offset.rank === 3 || $offset.rank === 1, function () {\n\t      return \"Error in batchNorm3D: offset must be rank 3 or rank 1 \" + (\"but got rank \" + $offset.rank + \".\");\n\t    });\n\t  }\n\n\t  return batchNorm($x, $mean, $variance, $offset, $scale, varianceEpsilon);\n\t}\n\n\tvar batchNorm3d = op({\n\t  batchNorm3d_: batchNorm3d_\n\t});\n\n\t/**\n\t * Batch normalization, strictly for 4D. For the more relaxed version, see\n\t * `tf.batchNorm`.\n\t *\n\t * @param x The input Tensor.\n\t * @param mean A mean Tensor.\n\t * @param variance A variance Tensor.\n\t * @param offset An offset Tensor.\n\t * @param scale A scale Tensor.\n\t * @param varianceEpsilon A small float number to avoid dividing by 0.\n\t */\n\n\tfunction batchNorm4d_(x, mean, variance, offset, scale, varianceEpsilon) {\n\t  var $x = convertToTensor(x, 'x', 'batchNorm');\n\t  var $mean = convertToTensor(mean, 'mean', 'batchNorm');\n\t  var $variance = convertToTensor(variance, 'variance', 'batchNorm');\n\t  var $scale;\n\n\t  if (scale != null) {\n\t    $scale = convertToTensor(scale, 'scale', 'batchNorm');\n\t  }\n\n\t  var $offset;\n\n\t  if (offset != null) {\n\t    $offset = convertToTensor(offset, 'offset', 'batchNorm');\n\t  }\n\n\t  assert($x.rank === 4, function () {\n\t    return \"Error in batchNorm4D: x must be rank 4 but got rank \" + ($x.rank + \".\");\n\t  });\n\t  assert($mean.rank === 4 || $mean.rank === 1, function () {\n\t    return \"Error in batchNorm4D: mean must be rank 4 or rank 1 but \" + (\"got rank \" + $mean.rank + \".\");\n\t  });\n\t  assert($variance.rank === 4 || $variance.rank === 1, function () {\n\t    return \"Error in batchNorm4D: variance must be rank 4 or rank 1 \" + (\"but got rank \" + $variance.rank + \".\");\n\t  });\n\n\t  if ($scale != null) {\n\t    assert($scale.rank === 4 || $scale.rank === 1, function () {\n\t      return \"Error in batchNorm4D: scale must be rank 4 or rank 1 \" + (\"but got rank \" + $scale.rank + \".\");\n\t    });\n\t  }\n\n\t  if ($offset != null) {\n\t    assert($offset.rank === 4 || $offset.rank === 1, function () {\n\t      return \"Error in batchNorm4D: offset must be rank 4 or rank 1 \" + (\"but got rank \" + $offset.rank + \".\");\n\t    });\n\t  }\n\n\t  return batchNorm($x, $mean, $variance, $offset, $scale, varianceEpsilon);\n\t}\n\n\tvar batchNorm4d = op({\n\t  batchNorm4d_: batchNorm4d_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Outputs a vector with length `size` and the same dtype as `weights`.\n\t *\n\t * If `weights` are empty, then index `i` stores the number of times the value\n\t * `i` is counted in `x`. If `weights` are non-empty, then index `i` stores the\n\t * sum of the value in `weights` at each index where the corresponding value in\n\t * `x` is `i`.\n\t *\n\t * Values in `x` outside of the range [0, size) are ignored.\n\t *\n\t * @param x The input int tensor, rank 1.\n\t * @param weights The weights tensor, must have the same shape as x, or a\n\t *     length-0 Tensor, in which case it acts as all weights equal to 1.\n\t * @param size Non-negative integer.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Reduction'}\n\t */\n\n\tfunction bincount_(x, weights, size) {\n\t  var $x = convertToTensor(x, 'x', 'bincount');\n\t  var $weights = convertToTensor(weights, 'weights', 'bincount');\n\t  assert($x.dtype === 'int32', function () {\n\t    return \"Error in bincount: input \" + (\"dtype must be int32, but got \" + $x.dtype);\n\t  });\n\t  assert(size >= 0, function () {\n\t    return \"size must be non-negative, but got \" + size + \".\";\n\t  });\n\t  assert($weights.size === $x.size || $weights.size === 0, function () {\n\t    return \"Error in bincount: weights must have the same size as input or\" + (\"0-length, but got input shape: \" + $x.shape + \", weights shape: \") + ($weights.shape + \".\");\n\t  });\n\t  var inputs = {\n\t    x: $x,\n\t    weights: $weights\n\t  };\n\t  var attrs = {\n\t    size: size\n\t  };\n\t  return ENGINE.runKernel(Bincount, inputs, attrs);\n\t}\n\n\tvar bincount = op({\n\t  bincount_: bincount_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Broadcast an array to a compatible shape NumPy-style.\n\t *\n\t * The tensor's shape is compared to the broadcast shape from end to beginning.\n\t * Ones are prepended to the tensor's shape until is has the same length as\n\t * the broadcast shape. If input.shape[i]==shape[i], the (i+1)-th axis is\n\t * already broadcast-compatible. If input.shape[i]==1 and shape[i]==N, then\n\t * the input tensor is tiled N times along that axis (using tf.tile).\n\t *\n\t * @param input The tensor that is to be broadcasted.\n\t * @param shape The input is to be broadcast to this shape.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Transformations'}\n\t */\n\n\tfunction broadcastTo_(x, shape) {\n\t  var input = convertToTensor(x, 'broadcastTo', 'x');\n\t  var xShape = input.shape;\n\n\t  if (shape.some(function (d) {\n\t    return !(d > 0) || d % 1 !== 0;\n\t  })) {\n\t    throw new Error(\"broadcastTo(): Invalid broadcast shape [\" + shape + \"].\");\n\t  }\n\n\t  if (shape.length < input.rank) {\n\t    throw new Error(\"broadcastTo(): shape.length=\" + shape.length + \" < input.rank=\" + input.rank + \".\");\n\t  }\n\n\t  if (shape.length > input.rank) {\n\t    var newShape = input.shape.slice();\n\n\t    while (newShape.length < shape.length) {\n\t      newShape.unshift(1);\n\t    }\n\n\t    input = reshape(input, newShape);\n\t  }\n\n\t  var inputShape = input.shape;\n\t  var reps = Array.from(shape);\n\n\t  for (var i = shape.length - 1; i >= 0; i--) {\n\t    if (inputShape[i] === shape[i]) {\n\t      reps[i] = 1;\n\t    } else if (input.shape[i] !== 1) {\n\t      throw new Error(\"broadcastTo(): [\" + xShape + \"] cannot be broadcast to [\" + shape + \"].\");\n\t    }\n\t  }\n\n\t  var axes = reps.map(function (n, i) {\n\t    return n > 1 ? i : -1;\n\t  }).filter(function (i) {\n\t    return i >= 0;\n\t  });\n\n\t  if (axes.length === 0) {\n\t    return clone(input);\n\t  } // TODO call broadcastTo kernel directly once backends implement broadcstTo\n\n\n\t  var inputs = {\n\t    x: input\n\t  };\n\t  var attrs = {\n\t    reps: reps\n\t  };\n\t  return ENGINE.runKernel(Tile, inputs, attrs);\n\t}\n\n\tvar broadcastTo = op({\n\t  broadcastTo_: broadcastTo_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes ceiling of input `tf.Tensor` element-wise: `ceil(x)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([.6, 1.1, -3.3]);\n\t *\n\t * x.ceil().print();  // or tf.ceil(x)\n\t * ```\n\t * @param x The input Tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction ceil_(x) {\n\t  var $x = convertToTensor(x, 'x', 'ceil');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Ceil, inputs);\n\t}\n\n\tvar ceil$3 = op({\n\t  ceil_: ceil_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Clips values element-wise. `max(min(x, clipValueMax), clipValueMin)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([-1, 2, -3, 4]);\n\t *\n\t * x.clipByValue(-2, 3).print();  // or tf.clipByValue(x, -2, 3)\n\t * ```\n\t * @param x The input tensor.\n\t * @param clipValueMin Lower-bound of range to be clipped to.\n\t * @param clipValueMax Upper-bound of range to be clipped to.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction clipByValue_(x, clipValueMin, clipValueMax) {\n\t  var $x = convertToTensor(x, 'x', 'clipByValue');\n\t  assert(clipValueMin <= clipValueMax, function () {\n\t    return \"Error in clip: min (\" + clipValueMin + \") must be \" + (\"less than or equal to max (\" + clipValueMax + \").\");\n\t  });\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    clipValueMin: clipValueMin,\n\t    clipValueMax: clipValueMax\n\t  };\n\t  return ENGINE.runKernel(ClipByValue, inputs, attrs);\n\t}\n\n\tvar clipByValue = op({\n\t  clipByValue_: clipByValue_\n\t});\n\n\t/**\n\t * Concatenates a list of`tf.Tensor1D`s along an axis. See `concat` for details.\n\t *\n\t * For example, if:\n\t * A: shape(3) = |r1, g1, b1|\n\t * B: shape(2) = |r2, g2|\n\t * C = tf.concat1d([A, B]) == |r1, g1, b1, r2, g2|\n\t *\n\t * @param tensors A list of`tf.Tensor`s to concatenate.\n\t * @return The concatenated array.\n\t */\n\n\tfunction concat1d_(tensors) {\n\t  return concat(tensors, 0\n\t  /* axis */\n\t  );\n\t}\n\n\tvar concat1d = op({\n\t  concat1d_: concat1d_\n\t});\n\n\t/**\n\t * Concatenates a list of`tf.Tensor2D`s along an axis. See `concat` for details.\n\t *\n\t * For example, if:\n\t * A: shape(2, 3) = | r1, g1, b1 |\n\t *                  | r2, g2, b2 |\n\t *\n\t * B: shape(2, 3) = | r3, g3, b3 |\n\t *                  | r4, g4, b4 |\n\t *\n\t * C = tf.concat2d([A, B], axis)\n\t *\n\t * if axis = 0:\n\t * C: shape(4, 3) = | r1, g1, b1 |\n\t *                  | r2, g2, b2 |\n\t *                  | r3, g3, b3 |\n\t *                  | r4, g4, b4 |\n\t *\n\t * if axis = 1:\n\t * C = shape(2, 6) = | r1, g1, b1, r3, g3, b3 |\n\t *                   | r2, g2, b2, r4, g4, b4 |\n\t *\n\t *\n\t * @param tensors A list of `tf.Tensor`s to concatenate.\n\t * @param axis The axis to concatenate along.\n\t * @return The concatenated array.\n\t */\n\n\tfunction concat2d_(tensors, axis) {\n\t  return concat(tensors, axis);\n\t}\n\n\tvar concat2d = op({\n\t  concat2d_: concat2d_\n\t});\n\n\t/**\n\t * Concatenates a list of `tf.Tensor3D`s along an axis.\n\t * See `concat` for details.\n\t *\n\t * For example, if:\n\t * A: shape(2, 1, 3) = | r1, g1, b1 |\n\t *                     | r2, g2, b2 |\n\t *\n\t * B: shape(2, 1, 3) = | r3, g3, b3 |\n\t *                     | r4, g4, b4 |\n\t *\n\t * C = tf.concat3d([A, B], axis)\n\t *\n\t * if axis = 0:\n\t * C: shape(4, 1, 3) = | r1, g1, b1 |\n\t *                     | r2, g2, b2 |\n\t *                     | r3, g3, b3 |\n\t *                     | r4, g4, b4 |\n\t *\n\t * if axis = 1:\n\t * C: shape(2, 2, 3) = | r1, g1, b1, r3, g3, b3 |\n\t *                     | r2, g2, b2, r4, g4, b4 |\n\t *\n\t * if axis = 2:\n\t * C = shape(2, 1, 6) = | r1, g1, b1, r3, g3, b3 |\n\t *                      | r2, g2, b2, r4, g4, b4 |\n\t *\n\t * @param tensors A list of`tf.Tensor`s to concatenate.\n\t * @param axis The axis to concate along.\n\t * @return The concatenated array.\n\t */\n\n\tfunction concat3d_(tensors, axis) {\n\t  return concat(tensors, axis);\n\t}\n\n\tvar concat3d = op({\n\t  concat3d_: concat3d_\n\t});\n\n\t/**\n\t * Concatenates a list of `tf.Tensor4D`s along an axis.\n\t * See `concat` for details.\n\t *\n\t * @param tensors A list of `tf.Tensor`s to concatenate.\n\t * @param axis The axis to concate along.\n\t * @return The concatenated array.\n\t */\n\n\tfunction concat4d_(tensors, axis) {\n\t  return concat(tensors, axis);\n\t}\n\n\tvar concat4d = op({\n\t  concat4d_: concat4d_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes a 2D convolution over the input x.\n\t *\n\t * @param x The input tensor, of rank 4 or rank 3, of shape\n\t *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is\n\t * assumed.\n\t * @param filter The filter, rank 4, of shape\n\t *     `[filterHeight, filterWidth, inDepth, outDepth]`.\n\t * @param strides The strides of the convolution: `[strideHeight,\n\t * strideWidth]`.\n\t * @param pad The type of padding algorithm.\n\t *    - `same` and stride 1: output will be of same size as input,\n\t *       regardless of filter size.\n\t *    - `valid`: output will be smaller than input if filter is larger\n\t *       than 1x1.\n\t *   - For more info, see this guide:\n\t *     [https://www.tensorflow.org/api_guides/python/nn#Convolution](\n\t *          https://www.tensorflow.org/api_guides/python/nn#Convolution)\n\t * @param dataFormat: An optional string from: \"NHWC\", \"NCHW\". Defaults to\n\t *     \"NHWC\". Specify the data format of the input and output data. With the\n\t *     default format \"NHWC\", the data is stored in the order of: [batch,\n\t *     height, width, channels].\n\t * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n\t *     in which we sample input values across the height and width dimensions\n\t *     in atrous convolution. Defaults to `[1, 1]`. If `dilations` is a single\n\t *     number, then `dilationHeight == dilationWidth`. If it is greater than\n\t *     1, then all values of `strides` must be 1.\n\t * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n\t *     provided, it will default to truncate.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Convolution'}\n\t */\n\n\tfunction conv2d_(x, filter, strides, pad, dataFormat, dilations, dimRoundingMode) {\n\t  if (dataFormat === void 0) {\n\t    dataFormat = 'NHWC';\n\t  }\n\n\t  if (dilations === void 0) {\n\t    dilations = [1, 1];\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'conv2d');\n\t  var $filter = convertToTensor(filter, 'filter', 'conv2d');\n\t  var x4D = $x;\n\t  var reshapedTo4D = false;\n\n\t  if ($x.rank === 3) {\n\t    reshapedTo4D = true;\n\t    x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n\t  }\n\n\t  assert(x4D.rank === 4, function () {\n\t    return \"Error in conv2d: input must be rank 4, but got rank \" + x4D.rank + \".\";\n\t  });\n\t  assert($filter.rank === 4, function () {\n\t    return \"Error in conv2d: filter must be rank 4, but got rank \" + ($filter.rank + \".\");\n\t  });\n\n\t  if (dimRoundingMode != null) {\n\t    assert(isInt(pad), function () {\n\t      return \"Error in conv2d: pad must be an integer when using, \" + (\"dimRoundingMode \" + dimRoundingMode + \" but got pad \" + pad + \".\");\n\t    });\n\t  }\n\n\t  var inDepth = dataFormat === 'NHWC' ? x4D.shape[3] : x4D.shape[1];\n\t  assert(inDepth === $filter.shape[2], function () {\n\t    return \"Error in conv2d: depth of input (\" + inDepth + \") must match \" + (\"input depth for filter \" + $filter.shape[2] + \".\");\n\t  });\n\t  assert(eitherStridesOrDilationsAreOne(strides, dilations), function () {\n\t    return 'Error in conv2D: Either strides or dilations must be 1. ' + (\"Got strides \" + strides + \" and dilations '\" + dilations + \"'\");\n\t  });\n\t  var inputs = {\n\t    x: x4D,\n\t    filter: $filter\n\t  };\n\t  var attrs = {\n\t    strides: strides,\n\t    pad: pad,\n\t    dataFormat: dataFormat,\n\t    dilations: dilations,\n\t    dimRoundingMode: dimRoundingMode\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var res = ENGINE.runKernel(Conv2D, inputs, attrs);\n\n\t  if (reshapedTo4D) {\n\t    return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n\t  }\n\n\t  return res;\n\t}\n\n\tvar conv2d = op({\n\t  conv2d_: conv2d_\n\t});\n\n\t/**\n\t * Computes a 1D convolution over the input x.\n\t *\n\t * @param x The input tensor, of rank 3 or rank 2, of shape\n\t *     `[batch, width, inChannels]`. If rank 2, batch of 1 is assumed.\n\t * @param filter The filter, rank 3, of shape\n\t *     `[filterWidth, inDepth, outDepth]`.\n\t * @param stride The number of entries by which the filter is moved right at\n\t *     each step.\n\t * @param pad The type of padding algorithm.\n\t *    - `same` and stride 1: output will be of same size as input,\n\t *       regardless of filter size.\n\t *    - `valid`: output will be smaller than input if filter is larger\n\t *       than 1x1.\n\t *   - For more info, see this guide:\n\t *     [https://www.tensorflow.org/api_guides/python/nn#Convolution](\n\t *          https://www.tensorflow.org/api_guides/python/nn#Convolution)\n\t * @param dataFormat An optional string from \"NWC\", \"NCW\". Defaults to \"NWC\",\n\t *     the data is stored in the order of [batch, in_width, in_channels]. Only\n\t *     \"NWC\" is currently supported.\n\t * @param dilation The dilation rate in which we sample input values in\n\t *     atrous convolution. Defaults to `1`. If it is greater than 1, then\n\t *     stride must be `1`.\n\t * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n\t *     provided, it will default to truncate.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Convolution'}\n\t */\n\n\tfunction conv1d_(x, filter, stride, pad, dataFormat, dilation, dimRoundingMode) {\n\t  if (dataFormat === void 0) {\n\t    dataFormat = 'NWC';\n\t  }\n\n\t  if (dilation === void 0) {\n\t    dilation = 1;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'conv1d');\n\t  var $filter = convertToTensor(filter, 'filter', 'conv1d');\n\t  var x3D = $x;\n\t  var reshapedTo3D = false;\n\n\t  if ($x.rank === 2) {\n\t    reshapedTo3D = true;\n\t    x3D = reshape($x, [1, $x.shape[0], $x.shape[1]]);\n\t  }\n\n\t  assert(x3D.rank === 3, function () {\n\t    return \"Error in conv1d: input must be rank 3, but got rank \" + x3D.rank + \".\";\n\t  });\n\t  assert($filter.rank === 3, function () {\n\t    return \"Error in conv1d: filter must be rank 3, but got rank \" + ($filter.rank + \".\");\n\t  });\n\n\t  if (dimRoundingMode != null) {\n\t    assert(isInt(pad), function () {\n\t      return \"Error in conv1d: pad must be an integer when using, \" + (\"dimRoundingMode \" + dimRoundingMode + \" but got pad \" + pad + \".\");\n\t    });\n\t  }\n\n\t  assert(x3D.shape[2] === $filter.shape[1], function () {\n\t    return \"Error in conv1d: depth of input (\" + x3D.shape[2] + \") must match \" + (\"input depth for filter \" + $filter.shape[1] + \".\");\n\t  });\n\t  assert(eitherStridesOrDilationsAreOne(stride, dilation), function () {\n\t    return 'Error in conv1D: Either stride or dilation must be 1. ' + (\"Got stride \" + stride + \" and dilation '\" + dilation + \"'\");\n\t  });\n\t  assert(dataFormat === 'NWC', function () {\n\t    return \"Error in conv1d: got dataFormat of \" + dataFormat + \" but only NWC is currently supported.\";\n\t  });\n\t  var filter4D = reshape($filter, [1, $filter.shape[0], $filter.shape[1], $filter.shape[2]]);\n\t  var input4D = reshape(x3D, [x3D.shape[0], 1, x3D.shape[1], x3D.shape[2]]);\n\t  var strides = [1, stride];\n\t  var dilations = [1, dilation];\n\t  var conv2dDataFormat = 'NHWC';\n\t  var res = conv2d(input4D, filter4D, strides, pad, conv2dDataFormat, dilations, dimRoundingMode);\n\n\t  if (reshapedTo3D) {\n\t    return reshape(res, [res.shape[2], res.shape[3]]);\n\t  }\n\n\t  return reshape(res, [res.shape[0], res.shape[2], res.shape[3]]);\n\t}\n\n\tvar conv1d = op({\n\t  conv1d_: conv1d_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the derivative of the input of a 2D convolution.\n\t *\n\t * @param xShape The shape of the input: [batch, height, width, inDepth].\n\t * If length of 3, batch of 1 is assumed.\n\t * @param dy The derivative of the output, of rank 4 or rank 3 of shape\n\t *   `[batch, outHeight, outWidth, outDepth]`. If rank 3, batch of 1 is\n\t * assumed.\n\t * @param filter The filter, rank 4, of shape\n\t *     `[filterHeight, filterWidth, inDepth, outDepth]`.\n\t * @param strides The strides of the convolution: `[strideHeight,\n\t * strideWidth]`.\n\t * @param pad The type of padding algorithm used:\n\t *    - `same` and stride 1: output will be of same size as input,\n\t *       regardless of filter size.\n\t *    - `valid`: output will be smaller than input if filter is larger\n\t *       than 1x1.\n\t * @param dataFormat: An optional string from: \"NHWC\", \"NCHW\". Defaults to\n\t *     \"NHWC\". Specify the data format of the input and output data. With the\n\t *     default format \"NHWC\", the data is stored in the order of: [batch,\n\t *     height, width, channels].\n\t * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n\t *     provided, it will default to truncate.\n\t */\n\n\tfunction conv2DBackpropInput_(xShape, dy, filter, strides, pad, dataFormat, dimRoundingMode) {\n\t  if (dataFormat === void 0) {\n\t    dataFormat = 'NHWC';\n\t  }\n\n\t  assert(xShape.length === dy.rank, function () {\n\t    return \"Length of inShape \" + (\"(\" + xShape.length + \") and rank of dy (\" + dy.rank + \") must match\");\n\t  });\n\t  var xShape4D = xShape;\n\t  var dy4D = dy;\n\t  var reshapedTo4D = false;\n\n\t  if (dy.rank === 3) {\n\t    reshapedTo4D = true;\n\t    dy4D = reshape(dy, [1, dy.shape[0], dy.shape[1], dy.shape[2]]);\n\t    xShape4D = [1, xShape[0], xShape[1], xShape[2]];\n\t  }\n\n\t  assert(xShape4D.length === 4, function () {\n\t    return \"Error in conv2dDerInput: inShape must be length 4, but got length \" + (xShape4D.length + \".\");\n\t  });\n\t  assert(dy4D.rank === 4, function () {\n\t    return \"Error in conv2dDerInput: dy must be rank 4, but got \" + (\"rank \" + dy4D.rank);\n\t  });\n\t  assert(filter.rank === 4, function () {\n\t    return \"Error in conv2dDerInput: filter must be rank 4, but got \" + (\"rank \" + filter.rank);\n\t  });\n\t  var inDepth = dataFormat === 'NHWC' ? xShape4D[3] : xShape4D[1];\n\t  var outDepth = dataFormat === 'NHWC' ? dy4D.shape[3] : dy4D.shape[1];\n\t  assert(inDepth === filter.shape[2], function () {\n\t    return \"Error in conv2dDerInput: depth of input (\" + inDepth + \") must \" + (\"match input depth for filter \" + filter.shape[2] + \".\");\n\t  });\n\t  assert(outDepth === filter.shape[3], function () {\n\t    return \"Error in conv2dDerInput: depth of output (\" + outDepth + \") must \" + (\"match output depth for filter \" + filter.shape[3] + \".\");\n\t  });\n\n\t  if (dimRoundingMode != null) {\n\t    assert(isInt(pad), function () {\n\t      return \"Error in conv2dDerInput: pad must be an integer when using, \" + (\"dimRoundingMode \" + dimRoundingMode + \" but got pad \" + pad + \".\");\n\t    });\n\t  }\n\n\t  var inputs = {\n\t    dy: dy4D,\n\t    filter: filter\n\t  };\n\t  var attrs = {\n\t    strides: strides,\n\t    pad: pad,\n\t    dataFormat: dataFormat,\n\t    dimRoundingMode: dimRoundingMode,\n\t    inputShape: xShape4D\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var res = ENGINE.runKernel(Conv2DBackpropInput, inputs, attrs);\n\n\t  if (reshapedTo4D) {\n\t    return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n\t  }\n\n\t  return res;\n\t}\n\n\tvar conv2DBackpropInput = op({\n\t  conv2DBackpropInput_: conv2DBackpropInput_\n\t});\n\n\t/**\n\t * Computes the transposed 2D convolution of an image, also known as a\n\t * deconvolution.\n\t *\n\t * @param x The input image, of rank 4 or rank 3, of shape\n\t *   `[batch, height, width, inDepth]`. If rank 3, batch of 1 is assumed.\n\t * @param filter The filter, rank 4, of shape\n\t *     `[filterHeight, filterWidth, outDepth, inDepth]`.\n\t *     `inDepth` must match `inDepth` in `x`.\n\t * @param outputShape Output shape, of rank 4 or rank 3:\n\t *     `[batch, height, width, outDepth]`. If rank 3, batch of 1 is assumed.\n\t * @param strides The strides of the original convolution:\n\t *     `[strideHeight, strideWidth]`.\n\t * @param pad  The type of padding algorithm used in the non-transpose version\n\t *    of the op.\n\t * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n\t *     provided, it will default to truncate.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Convolution'}\n\t */\n\n\tfunction conv2dTranspose_(x, filter, outputShape, strides, pad, dimRoundingMode) {\n\t  var $x = convertToTensor(x, 'x', 'conv2dTranspose');\n\t  var $filter = convertToTensor(filter, 'filter', 'conv2dTranspose');\n\t  return conv2DBackpropInput(outputShape, $x, $filter, strides, pad, 'NHWC', dimRoundingMode);\n\t}\n\n\tvar conv2dTranspose = op({\n\t  conv2dTranspose_: conv2dTranspose_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes a 3D convolution over the input x.\n\t *\n\t * @param x The input tensor, of rank 5 or rank 4, of shape\n\t *     `[batch, depth, height, width, channels]`. If rank 4,\n\t * batch of 1 is assumed.\n\t * @param filter The filter, rank 5, of shape\n\t *     `[filterDepth, filterHeight, filterWidth, inChannels, outChannels]`.\n\t *      inChannels must match between input and filter.\n\t * @param strides The strides of the convolution: `[strideDepth, strideHeight,\n\t * strideWidth]`.\n\t * @param pad The type of padding algorithm.\n\t *    - `same` and stride 1: output will be of same size as input,\n\t *       regardless of filter size.\n\t *    - `valid`: output will be smaller than input if filter is larger\n\t *       than 1x1.\n\t *   - For more info, see this guide:\n\t *     [https://www.tensorflow.org/api_guides/python/nn#Convolution](\n\t *          https://www.tensorflow.org/api_guides/python/nn#Convolution)\n\t * @param dataFormat: An optional string from: \"NDHWC\", \"NCDHW\". Defaults to\n\t *     \"NDHWC\". Specify the data format of the input and output data. With the\n\t *     default format \"NDHWC\", the data is stored in the order of: [batch,\n\t *     depth, height, width, channels]. Only \"NDHWC\" is currently supported.\n\t * @param dilations The dilation rates: `[dilationDepth, dilationHeight,\n\t *     dilationWidth]` in which we sample input values across the height\n\t *     and width dimensions in atrous convolution. Defaults to `[1, 1, 1]`.\n\t *     If `dilations` is a single number, then\n\t *     `dilationDepth == dilationHeight == dilationWidth`. If it is greater\n\t *     than 1, then all values of `strides` must be 1.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Convolution'}\n\t */\n\n\tfunction conv3d_(x, filter, strides, pad, dataFormat, dilations) {\n\t  if (dataFormat === void 0) {\n\t    dataFormat = 'NDHWC';\n\t  }\n\n\t  if (dilations === void 0) {\n\t    dilations = [1, 1, 1];\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'conv3d');\n\t  var $filter = convertToTensor(filter, 'filter', 'conv3d');\n\t  var x5D = $x;\n\t  var reshapedTo5D = false;\n\n\t  if ($x.rank === 4) {\n\t    reshapedTo5D = true;\n\t    x5D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2], $x.shape[3]]);\n\t  }\n\n\t  assert(x5D.rank === 5, function () {\n\t    return \"Error in conv3d: input must be rank 5, but got rank \" + x5D.rank + \".\";\n\t  });\n\t  assert($filter.rank === 5, function () {\n\t    return \"Error in conv3d: filter must be rank 5, but got rank \" + ($filter.rank + \".\");\n\t  });\n\t  assert(x5D.shape[4] === $filter.shape[3], function () {\n\t    return \"Error in conv3d: depth of input (\" + x5D.shape[4] + \") must match \" + (\"input depth for filter \" + $filter.shape[3] + \".\");\n\t  });\n\t  assert(eitherStridesOrDilationsAreOne(strides, dilations), function () {\n\t    return 'Error in conv3D: Either strides or dilations must be 1. ' + (\"Got strides \" + strides + \" and dilations '\" + dilations + \"'\");\n\t  });\n\t  assert(dataFormat === 'NDHWC', function () {\n\t    return \"Error in conv3d: got dataFormat of \" + dataFormat + \" but only NDHWC is currently supported.\";\n\t  });\n\t  var inputs = {\n\t    x: x5D,\n\t    filter: $filter\n\t  };\n\t  var attrs = {\n\t    strides: strides,\n\t    pad: pad,\n\t    dataFormat: dataFormat,\n\t    dilations: dilations\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var res = ENGINE.runKernel(Conv3D, inputs, attrs);\n\n\t  if (reshapedTo5D) {\n\t    return reshape(res, [res.shape[1], res.shape[2], res.shape[3], res.shape[4]]);\n\t  }\n\n\t  return res;\n\t}\n\n\tvar conv3d = op({\n\t  conv3d_: conv3d_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the derivative of the input of a 3D convolution.\n\t *\n\t * @param xShape The shape of the input: [batch, depth, height, width,\n\t * in_channels]. If length of 4, batch of 1 is assumed.\n\t * @param dy The derivative of the output, of rank 5 or rank 4 of shape\n\t *   `[batch, outDepth, outHeight, outWidth, in_channels]`.\n\t * If rank 4, batch of 1 is assumed.\n\t * @param filter The filter, rank 5, of shape\n\t *     `[filterDepth, filterHeight, filterWidth, inDepth, outDepth]`.\n\t * @param strides The strides of the convolution: `[strideDepth, strideHeight,\n\t * strideWidth]`.\n\t * @param pad The type of padding algorithm used:\n\t *    - `same` and stride 1: output will be of same size as input,\n\t *       regardless of filter size.\n\t *    - `valid`: output will be smaller than input if filter is larger\n\t *       than 1x1.\n\t */\n\n\tfunction conv3DBackpropInput_(xShape, dy, filter, strides, pad) {\n\t  assert(xShape.length === dy.rank, function () {\n\t    return \"Length of inShape \" + (\"(\" + xShape.length + \") and rank of dy (\" + dy.rank + \") must match\");\n\t  });\n\t  var xShape5D = xShape;\n\t  var dy5D = dy;\n\t  var reshapedTo5D = false;\n\n\t  if (dy.rank === 4) {\n\t    reshapedTo5D = true;\n\t    dy5D = reshape(dy, [1, dy.shape[0], dy.shape[1], dy.shape[2], dy.shape[3]]);\n\t    xShape5D = [1, xShape[0], xShape[1], xShape[2], xShape[3]];\n\t  }\n\n\t  var inDepth = xShape5D[4];\n\t  var outDepth = dy5D.shape[4];\n\t  assert(xShape5D.length === 5, function () {\n\t    return \"Error in conv3dDerInput: inShape must be length 5, but got length \" + (xShape5D.length + \".\");\n\t  });\n\t  assert(dy5D.rank === 5, function () {\n\t    return \"Error in conv3dDerInput: dy must be rank 5, but got \" + (\"rank \" + dy5D.rank);\n\t  });\n\t  assert(filter.rank === 5, function () {\n\t    return \"Error in conv3dDerInput: filter must be rank 5, but got \" + (\"rank \" + filter.rank);\n\t  });\n\t  assert(inDepth === filter.shape[3], function () {\n\t    return \"Error in conv3dDerInput: depth of input (\" + inDepth + \") must \" + (\"match input depth for filter \" + filter.shape[3] + \".\");\n\t  });\n\t  assert(outDepth === filter.shape[4], function () {\n\t    return \"Error in conv3dDerInput: depth of output (\" + outDepth + \") must \" + (\"match output depth for filter \" + filter.shape[4] + \".\");\n\t  });\n\t  var inputs = {\n\t    dy: dy5D,\n\t    filter: filter\n\t  };\n\t  var attrs = {\n\t    pad: pad,\n\t    strides: strides,\n\t    inputShape: xShape5D\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var res = ENGINE.runKernel(Conv3DBackpropInputV2, inputs, attrs);\n\n\t  if (reshapedTo5D) {\n\t    return reshape(res, [res.shape[1], res.shape[2], res.shape[3], res.shape[4]]);\n\t  }\n\n\t  return res;\n\t}\n\n\tvar conv3DBackpropInput = op({\n\t  conv3DBackpropInput_: conv3DBackpropInput_\n\t});\n\n\t/**\n\t * Computes the transposed 3D convolution of a volume, also known as a\n\t * deconvolution.\n\t *\n\t * @param x The input image, of rank 5 or rank 4, of shape\n\t *   `[batch, depth, height, width, inDepth]`. If rank 4, batch of 1 is assumed.\n\t * @param filter The filter, rank 4, of shape\n\t *     `[depth, filterHeight, filterWidth, outDepth, inDepth]`.\n\t *     `inDepth` must match `inDepth` in `x`.\n\t * @param outputShape Output shape, of rank 5 or rank 4:\n\t *     `[batch, depth, height, width, outDepth]`. If rank 3, batch of 1 is\n\t *    assumed.\n\t * @param strides The strides of the original convolution:\n\t *     `[strideDepth, strideHeight, strideWidth]`.\n\t * @param pad  The type of padding algorithm used in the non-transpose version\n\t *    of the op.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Convolution'}\n\t */\n\n\tfunction conv3dTranspose_(x, filter, outputShape, strides, pad) {\n\t  var $x = convertToTensor(x, 'x', 'conv3dTranspose');\n\t  var $filter = convertToTensor(filter, 'filter', 'conv3dTranspose');\n\t  return conv3DBackpropInput(outputShape, $x, $filter, strides, pad);\n\t}\n\n\tvar conv3dTranspose = op({\n\t  conv3dTranspose_: conv3dTranspose_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes cos of the input `tf.Tensor` element-wise: `cos(x)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([0, Math.PI / 2, Math.PI * 3 / 4]);\n\t *\n\t * x.cos().print();  // or tf.cos(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction cos_(x) {\n\t  var $x = convertToTensor(x, 'x', 'cos');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Cos, inputs);\n\t}\n\n\tvar cos = op({\n\t  cos_: cos_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes hyperbolic cos of the input `tf.Tensor` element-wise: `cosh(x)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([0, 1, -1, .7]);\n\t *\n\t * x.cosh().print();  // or tf.cosh(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction cosh_(x) {\n\t  var $x = convertToTensor(x, 'x', 'cosh');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Cosh, inputs);\n\t}\n\n\tvar cosh = op({\n\t  cosh_: cosh_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the cumulative sum of a `tf.Tensor` along `axis`.\n\t *\n\t * ```js\n\t * const x = tf.tensor([1, 2, 3, 4]);\n\t * x.cumsum().print();\n\t * ```\n\t * ```js\n\t * const x = tf.tensor([[1, 2], [3, 4]]);\n\t * x.cumsum().print();\n\t * ```\n\t *\n\t * @param x The input tensor to be summed.\n\t * @param axis The axis along which to sum. Optional. Defaults to 0.\n\t * @param exclusive Whether to perform exclusive cumulative sum. Optional.\n\t *     Defaults to false. If set to true then the sum of each tensor entry\n\t *     does not include its own value, but only the values previous to it\n\t *     along the specified axis.\n\t * @param reverse Whether to sum in the opposite direction. Optional.\n\t *     Defaults to false.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Scan'}\n\t */\n\n\tfunction cumsum_(x, axis, exclusive, reverse) {\n\t  if (axis === void 0) {\n\t    axis = 0;\n\t  }\n\n\t  if (exclusive === void 0) {\n\t    exclusive = false;\n\t  }\n\n\t  if (reverse === void 0) {\n\t    reverse = false;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'cumsum');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    axis: axis,\n\t    exclusive: exclusive,\n\t    reverse: reverse\n\t  };\n\t  return ENGINE.runKernel(Cumsum, inputs, attrs);\n\t}\n\n\tvar cumsum = op({\n\t  cumsum_: cumsum_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Outputs a vector with length `size` and the same dtype as `weights`.\n\t *\n\t * If `weights` are empty, then index `i` stores the number of times the value\n\t * `i` is counted in `x`. If `weights` are non-empty, then index `i` stores the\n\t * sum of the value in `weights` at each index where the corresponding value in\n\t * `x` is `i`.\n\t *\n\t * Values in `x` outside of the range [0, size) are ignored.\n\t *\n\t * @param x The input int tensor, rank 1 or rank 2.\n\t * @param weights The weights tensor, must have the same shape as x, or a\n\t *     length-0 Tensor, in which case it acts as all weights equal to 1.\n\t * @param size Non-negative integer.\n\t * @param binaryOutput Optional. Whether the kernel should count the appearance\n\t *     or number of occurrences. Defaults to False.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Reduction'}\n\t */\n\n\tfunction denseBincount_(x, weights, size, binaryOutput) {\n\t  if (binaryOutput === void 0) {\n\t    binaryOutput = false;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'denseBincount');\n\t  var $weights = convertToTensor(weights, 'weights', 'denseBincount');\n\t  assert($x.dtype === 'int32', function () {\n\t    return \"Error in denseBincount: input \" + (\"dtype must be int32, but got \" + $x.dtype);\n\t  });\n\t  assert($x.rank <= 2, function () {\n\t    return \"Error in denseBincount: input must be at most rank 2, but got \" + (\"rank \" + $x.rank + \".\");\n\t  });\n\t  assert(size >= 0, function () {\n\t    return \"size must be non-negative, but got \" + size + \".\";\n\t  });\n\t  assert($weights.size === $x.size || $weights.size === 0, function () {\n\t    return \"Error in denseBincount: weights must have the same shape as x or \" + (\"0-length, but got x shape: \" + $x.shape + \", weights shape: \") + ($weights.shape + \".\");\n\t  });\n\t  var inputs = {\n\t    x: $x,\n\t    weights: $weights\n\t  };\n\t  var attrs = {\n\t    size: size,\n\t    binaryOutput: binaryOutput\n\t  };\n\t  return ENGINE.runKernel(DenseBincount, inputs, attrs);\n\t}\n\n\tvar denseBincount = op({\n\t  denseBincount_: denseBincount_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Rearranges data from depth into blocks of spatial data. More specifically,\n\t * this op outputs a copy of the input tensor where values from the `depth`\n\t * dimension are moved in spatial blocks to the `height` and `width` dimensions.\n\t * The attr `blockSize` indicates the input block size and how the data is\n\t * moved.\n\t *\n\t *  - Chunks of data of size `blockSize * blockSize` from depth are rearranged\n\t * into non-overlapping blocks of size `blockSize x blockSize`\n\t *\n\t *  - The width the output tensor is `inputWidth * blockSize`, whereas the\n\t * height is `inputHeight * blockSize`\n\t *\n\t *  - The Y, X coordinates within each block of the output image are determined\n\t * by the high order component of the input channel index\n\t *\n\t *  - The depth of the input tensor must be divisible by `blockSize *\n\t * blockSize`\n\t *\n\t * The `dataFormat` attr specifies the layout of the input and output tensors\n\t * with the following options: \"NHWC\": [ `batch, height, width, channels` ]\n\t * \"NCHW\": [ `batch, channels, height, width` ]\n\t *\n\t * ```js\n\t * const x = tf.tensor4d([1, 2, 3, 4], [1, 1, 1, 4]);\n\t * const blockSize = 2;\n\t * const dataFormat = \"NHWC\";\n\t *\n\t * tf.depthToSpace(x, blockSize, dataFormat).print();\n\t * ```\n\t *\n\t * @param x The input tensor of rank 4\n\t * @param blockSIze  An `int` that is `>= 2`. The size of the spatial block\n\t * @param dataFormat An optional string from: \"NHWC\", \"NCHW\". Defaults to \"NHWC\"\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Transformations'}\n\t */\n\n\tfunction depthToSpace_(x, blockSize, dataFormat) {\n\t  if (dataFormat === void 0) {\n\t    dataFormat = 'NHWC';\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'depthToSpace');\n\t  var inputHeight = dataFormat === 'NHWC' ? $x.shape[1] : $x.shape[2];\n\t  var inputWidth = dataFormat === 'NHWC' ? $x.shape[2] : $x.shape[3];\n\t  var inputDepth = dataFormat === 'NHWC' ? $x.shape[3] : $x.shape[1];\n\t  assert(inputHeight * blockSize >= 0, function () {\n\t    return \"Negative dimension size caused by overflow when multiplying\\n    \" + inputHeight + \" and \" + blockSize + \"  for depthToSpace with input shape\\n    \" + $x.shape;\n\t  });\n\t  assert(inputWidth * blockSize >= 0, function () {\n\t    return \"Negative dimension size caused by overflow when multiplying\\n    \" + inputWidth + \" and \" + blockSize + \" for depthToSpace with input shape\\n        \" + $x.shape;\n\t  });\n\t  assert(inputDepth % (blockSize * blockSize) === 0, function () {\n\t    return \"Dimension size must be evenly divisible by \" + blockSize * blockSize + \" but is \" + inputDepth + \" for depthToSpace with input shape \" + $x.shape;\n\t  });\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    blockSize: blockSize,\n\t    dataFormat: dataFormat\n\t  };\n\t  return ENGINE.runKernel(DepthToSpace, inputs, attrs);\n\t}\n\n\tvar depthToSpace = op({\n\t  depthToSpace_: depthToSpace_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Depthwise 2D convolution.\n\t *\n\t * Given a 4D `input` array and a `filter` array of shape\n\t * `[filterHeight, filterWidth, inChannels, channelMultiplier]` containing\n\t * `inChannels` convolutional filters of depth 1, this op applies a\n\t * different filter to each input channel (expanding from 1 channel to\n\t * `channelMultiplier` channels for each), then concatenates the results\n\t * together. The output has `inChannels * channelMultiplier` channels.\n\t *\n\t * See\n\t * [https://www.tensorflow.org/api_docs/python/tf/nn/depthwise_conv2d](\n\t *     https://www.tensorflow.org/api_docs/python/tf/nn/depthwise_conv2d)\n\t * for more details.\n\t *\n\t * @param x The input tensor, of rank 4 or rank 3, of shape\n\t *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is\n\t * assumed.\n\t * @param filter The filter tensor, rank 4, of shape\n\t *     `[filterHeight, filterWidth, inChannels, channelMultiplier]`.\n\t * @param strides The strides of the convolution: `[strideHeight,\n\t * strideWidth]`. If strides is a single number, then `strideHeight ==\n\t * strideWidth`.\n\t * @param pad The type of padding algorithm.\n\t *   - `same` and stride 1: output will be of same size as input,\n\t *       regardless of filter size.\n\t *   - `valid`: output will be smaller than input if filter is larger\n\t *       than 1x1.\n\t *   - For more info, see this guide:\n\t *     [https://www.tensorflow.org/api_guides/python/nn#Convolution](\n\t *          https://www.tensorflow.org/api_guides/python/nn#Convolution)\n\t * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n\t *     in which we sample input values across the height and width dimensions\n\t *     in atrous convolution. Defaults to `[1, 1]`. If `rate` is a single\n\t *     number, then `dilationHeight == dilationWidth`. If it is greater than\n\t *     1, then all values of `strides` must be 1.\n\t * @param dataFormat: An optional string from: \"NHWC\", \"NCHW\". Defaults to\n\t *     \"NHWC\". Specify the data format of the input and output data. With the\n\t *     default format \"NHWC\", the data is stored in the order of: [batch,\n\t *     height, width, channels]. Only \"NHWC\" is currently supported.\n\t * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n\t *     provided, it will default to truncate.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Convolution'}\n\t */\n\n\tfunction depthwiseConv2d_(x, filter, strides, pad, dataFormat, dilations, dimRoundingMode) {\n\t  if (dataFormat === void 0) {\n\t    dataFormat = 'NHWC';\n\t  }\n\n\t  if (dilations === void 0) {\n\t    dilations = [1, 1];\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'depthwiseConv2d');\n\t  var $filter = convertToTensor(filter, 'filter', 'depthwiseConv2d');\n\t  var x4D = $x;\n\t  var reshapedTo4D = false;\n\n\t  if ($x.rank === 3) {\n\t    reshapedTo4D = true;\n\t    x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n\t  }\n\n\t  assert(x4D.rank === 4, function () {\n\t    return \"Error in depthwiseConv2d: input must be rank 4, but got \" + (\"rank \" + x4D.rank + \".\");\n\t  });\n\t  assert($filter.rank === 4, function () {\n\t    return \"Error in depthwiseConv2d: filter must be rank 4, but got rank \" + ($filter.rank + \".\");\n\t  });\n\t  assert(x4D.shape[3] === $filter.shape[2], function () {\n\t    return \"Error in depthwiseConv2d: number of input channels \" + (\"(\" + x4D.shape[3] + \") must match the inChannels dimension in \") + (\"filter \" + $filter.shape[2] + \".\");\n\t  });\n\n\t  if (dimRoundingMode != null) {\n\t    assert(isInt(pad), function () {\n\t      return \"Error in depthwiseConv2d: pad must be an integer when using, \" + (\"dimRoundingMode \" + dimRoundingMode + \" but got pad \" + pad + \".\");\n\t    });\n\t  }\n\n\t  var inputs = {\n\t    x: x4D,\n\t    filter: $filter\n\t  };\n\t  var attrs = {\n\t    strides: strides,\n\t    pad: pad,\n\t    dataFormat: dataFormat,\n\t    dilations: dilations,\n\t    dimRoundingMode: dimRoundingMode\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var res = ENGINE.runKernel(DepthwiseConv2dNative, inputs, attrs);\n\n\t  if (reshapedTo4D) {\n\t    return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n\t  }\n\n\t  return res;\n\t}\n\n\tvar depthwiseConv2d = op({\n\t  depthwiseConv2d_: depthwiseConv2d_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns a diagonal tensor with a given diagonal values.\n\t *\n\t * Given a diagonal, this operation returns a tensor with the diagonal and\n\t * everything else padded with zeros.\n\t *\n\t * Assume the input has dimensions `[D1,..., Dk]`, then the output is a tensor\n\t * of rank 2k with dimensions `[D1,..., Dk, D1,..., Dk]`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 3, 4]);\n\t *\n\t * tf.diag(x).print()\n\t * ```\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 3, 4, 5, 6, 6, 8], [4, 2])\n\t *\n\t * tf.diag(x).print()\n\t * ```\n\t * @param x The input tensor.\n\t */\n\n\tfunction diag_(x) {\n\t  var $x = convertToTensor(x, 'x', 'diag');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Diag, inputs);\n\t}\n\n\tvar diag = op({\n\t  diag_: diag_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the grayscale dilation over the input `x`.\n\t *\n\t * @param x The input tensor, rank 3 or rank 4 of shape\n\t *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n\t * @param filter The filter tensor, rank 3, of shape\n\t *     `[filterHeight, filterWidth, depth]`.\n\t * @param strides The strides of the sliding window for each dimension of the\n\t *     input tensor: `[strideHeight, strideWidth]`.\n\t *     If `strides` is a single number,\n\t *     then `strideHeight == strideWidth`.\n\t * @param pad The type of padding algorithm.\n\t *    - `same` and stride 1: output will be of same size as input,\n\t *       regardless of filter size.\n\t *    - `valid`: output will be smaller than input if filter is larger\n\t *       than 1*1x1.\n\t *    - For more info, see this guide:\n\t *     [https://www.tensorflow.org/api_guides/python/nn#Convolution](\n\t *          https://www.tensorflow.org/api_guides/python/nn#Convolution)\n\t * @param dataFormat Specify the data format of the input and output data.\n\t *      Defaults to 'NHWC'. Only 'NHWC' is currently supported. With the\n\t *      default format \"NHWC\", the data is stored in the order of: [batch,\n\t *      height, width, channels].\n\t * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n\t *     in which we sample input values across the height and width dimensions\n\t *     for atrous morphological dilation. Defaults to `[1, 1]`. If `dilations`\n\t *     is a single number, then `dilationHeight == dilationWidth`. If it is\n\t *     greater than 1, then all values of `strides` must be 1.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Convolution'}\n\t */\n\n\tfunction dilation2d_(x, filter, strides, pad, dilations, dataFormat) {\n\t  if (dilations === void 0) {\n\t    dilations = [1, 1];\n\t  }\n\n\t  if (dataFormat === void 0) {\n\t    dataFormat = 'NHWC';\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'dilation2d');\n\t  var $filter = convertToTensor(filter, 'filter', 'dilation2d');\n\t  assert($x.rank === 3 || $x.rank === 4, function () {\n\t    return \"Error in dilation2d: input must be rank 3 or 4, but got rank \" + ($x.rank + \".\");\n\t  });\n\t  assert($filter.rank === 3, function () {\n\t    return \"Error in dilation2d: filter must be rank 3, but got rank \" + ($filter.rank + \".\");\n\t  });\n\t  assert(dataFormat === 'NHWC', function () {\n\t    return \"Error in dilation2d: Only NHWC is currently supported, \" + (\"but got dataFormat of \" + dataFormat);\n\t  });\n\t  var x4D = $x;\n\t  var reshapedTo4D = false;\n\n\t  if ($x.rank === 3) {\n\t    x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n\t    reshapedTo4D = true;\n\t  }\n\n\t  var inputs = {\n\t    x: x4D,\n\t    filter: $filter\n\t  };\n\t  var attrs = {\n\t    strides: strides,\n\t    pad: pad,\n\t    dilations: dilations\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var res = ENGINE.runKernel(Dilation2D, inputs, attrs);\n\n\t  if (reshapedTo4D) {\n\t    return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n\t  }\n\n\t  return res;\n\t}\n\n\tvar dilation2d = op({\n\t  dilation2d_: dilation2d_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\t/**\n\t * Returns the dimensions in the input shape that are broadcasted to\n\t * produce the provided output shape.\n\t *\n\t * The returned dimensions are 0-indexed and sorted. An example:\n\t * inShape = [4, 1, 3]\n\t * outShape = [5, 4, 3, 3]\n\t * result = [1]. Dimension 1 (2nd dimension of input) gets broadcasted 1 => 3.\n\t */\n\tfunction getBroadcastDims(inShape, outShape) {\n\t  var inRank = inShape.length;\n\t  var dims = [];\n\n\t  for (var i = 0; i < inRank; i++) {\n\t    var dim = inRank - 1 - i;\n\t    var a = inShape[dim] || 1;\n\t    var b = outShape[outShape.length - 1 - i] || 1;\n\n\t    if (b > 1 && a === 1) {\n\t      dims.unshift(dim);\n\t    }\n\t  }\n\n\t  return dims;\n\t}\n\t/**\n\t * Returns the axes in the output space that should be reduced to produce\n\t * the input space.\n\t */\n\n\tfunction getReductionAxes(inShape, outShape) {\n\t  var result = [];\n\n\t  for (var i = 0; i < outShape.length; i++) {\n\t    var inDim = inShape[inShape.length - i - 1];\n\t    var outAxis = outShape.length - i - 1;\n\t    var outDim = outShape[outAxis];\n\n\t    if (inDim == null || inDim === 1 && outDim > 1) {\n\t      result.unshift(outAxis);\n\t    }\n\t  }\n\n\t  return result;\n\t}\n\tfunction assertAndGetBroadcastShape(shapeA, shapeB) {\n\t  var result = [];\n\t  var l = Math.max(shapeA.length, shapeB.length);\n\n\t  for (var i = 0; i < l; i++) {\n\t    var a = shapeA[shapeA.length - i - 1];\n\n\t    if (a == null) {\n\t      a = 1;\n\t    }\n\n\t    var b = shapeB[shapeB.length - i - 1];\n\n\t    if (b == null) {\n\t      b = 1;\n\t    }\n\n\t    if (a === 1) {\n\t      result.unshift(b);\n\t    } else if (b === 1) {\n\t      result.unshift(a);\n\t    } else if (a !== b) {\n\t      var errMsg = \"Operands could not be broadcast together with shapes \" + (shapeA + \" and \" + shapeB + \".\");\n\t      throw Error(errMsg);\n\t    } else {\n\t      result.unshift(a);\n\t    }\n\t  }\n\n\t  return result;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns the truth value of (a == b) element-wise. Supports broadcasting.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 2, 3]);\n\t * const b = tf.tensor1d([2, 2, 2]);\n\t *\n\t * a.equal(b).print();\n\t * ```\n\t *\n\t * @param a The first input tensor.\n\t * @param b The second input tensor. Must have the same dtype as `a`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Logical'}\n\t */\n\n\tfunction equal_(a, b) {\n\t  var $a = convertToTensor(a, 'a', 'equal');\n\t  var $b = convertToTensor(b, 'b', 'equal');\n\n\t  var _makeTypesMatch = makeTypesMatch($a, $b);\n\n\t  $a = _makeTypesMatch[0];\n\t  $b = _makeTypesMatch[1];\n\t  assertAndGetBroadcastShape($a.shape, $b.shape);\n\t  var inputs = {\n\t    a: $a,\n\t    b: $b\n\t  };\n\t  return ENGINE.runKernel(Equal, inputs);\n\t}\n\n\tvar equal = op({\n\t  equal_: equal_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns the elements, either `a` or `b` depending on the `condition`.\n\t *\n\t * If the condition is true, select from `a`, otherwise select from `b`.\n\t *\n\t * ```js\n\t * const cond = tf.tensor1d([false, false, true], 'bool');\n\t * const a = tf.tensor1d([1 , 2, 3]);\n\t * const b = tf.tensor1d([-1, -2, -3]);\n\t *\n\t * a.where(cond, b).print();\n\t * ```\n\t *\n\t * @param condition The input condition. Must be of dtype bool.\n\t * @param a If `condition` is rank 1, `a` may have a higher rank but\n\t *     its first dimension must match the size of `condition`.\n\t * @param b A tensor with the same dtype as `a` and with shape that is\n\t *     compatible with `a`.\n\t * @return A tensor with same dtype as `a` and `b`, and shape that is\n\t *     broadcastable from `a` and `b`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Logical'}\n\t */\n\n\tfunction where_(condition, a, b) {\n\t  var $a = convertToTensor(a, 'a', 'where');\n\t  var $b = convertToTensor(b, 'b', 'where');\n\t  var $condition = convertToTensor(condition, 'condition', 'where', 'bool'); // TODO: move this logic to forward function when the broadcastTo op is\n\t  // implemented in WASM.\n\t  // Find the broadcastable shape for $a and $b.\n\n\t  var broadcastShape = assertAndGetBroadcastShape($a.shape, $b.shape);\n\t  var $broadcastedA = broadcastTo($a, broadcastShape);\n\t  var $broadcastedB = broadcastTo($b, broadcastShape);\n\n\t  if ($condition.rank === 1) {\n\t    // If condition rank is 1, then the first dimension must match the size of\n\t    // condition.\n\t    assert($condition.shape[0] === $a.shape[0], function () {\n\t      return 'The first dimension of `a` must match the size of `condition`.';\n\t    });\n\t  }\n\n\t  if ($condition.rank !== 1) {\n\t    // A must have the same shape as condition.\n\t    assertShapesMatch($condition.shape, $broadcastedB.shape, 'Error in where: ');\n\t  }\n\n\t  var inputs = {\n\t    condition: $condition,\n\t    t: $broadcastedA,\n\t    e: $broadcastedB\n\t  };\n\t  return ENGINE.runKernel(Select, inputs);\n\t}\n\n\tvar where = op({\n\t  where_: where_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates a `tf.Tensor` with all elements set to 0 with the same shape as the\n\t * given tensor.\n\t *\n\t * ```js\n\t * const x = tf.tensor([1, 2]);\n\t * tf.zerosLike(x).print();\n\t * ```\n\t *\n\t * @param x The tensor of required shape.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction zerosLike_(x) {\n\t  var $x = convertToTensor(x, 'x', 'zerosLike');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(ZerosLike, inputs);\n\t}\n\n\tvar zerosLike = op({\n\t  zerosLike_: zerosLike_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Divides two `tf.Tensor`s element-wise, A / B. Supports broadcasting. Return 0\n\t * if denominator is 0.\n\t *\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 4, 9, 16]);\n\t * const b = tf.tensor1d([1, 2, 3, 4]);\n\t * const c = tf.tensor1d([0, 0, 0, 0]);\n\t *\n\t * a.divNoNan(b).print();  // or tf.divNoNan(a, b)\n\t * a.divNoNan(c).print();  // or tf.divNoNan(a, c)\n\t * ```\n\t *\n\t * ```js\n\t * // Broadcast div a with b.\n\t * const a = tf.tensor1d([2, 4, 6, 8]);\n\t * const b = tf.scalar(2);\n\t * const c = tf.scalar(0);\n\t *\n\t * a.divNoNan(b).print();  // or tf.divNoNan(a, b)\n\t * a.divNoNan(c).print();  // or tf.divNoNan(a, c)\n\t * ```\n\t *\n\t * @param a The first tensor as the numerator.\n\t * @param b The second tensor as the denominator. Must have the same dtype as\n\t * `a`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n\t */\n\n\tfunction divNoNan_(a, b) {\n\t  // TODO: Make this into its own kernel.\n\t  var $a = convertToTensor(a, 'a', 'div');\n\t  var $b = convertToTensor(b, 'b', 'div');\n\n\t  var _makeTypesMatch = makeTypesMatch($a, $b);\n\n\t  $a = _makeTypesMatch[0];\n\t  $b = _makeTypesMatch[1];\n\t  var divResult = div($a, $b);\n\t  var zeros = zerosLike(divResult);\n\t  var bEqualsZero = equal($b, zeros);\n\t  return where(bEqualsZero, zeros, divResult);\n\t}\n\n\tvar divNoNan = op({\n\t  divNoNan_: divNoNan_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the dot product of two matrices and/or vectors, `t1` and `t2`.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 2]);\n\t * const b = tf.tensor2d([[1, 2], [3, 4]]);\n\t * const c = tf.tensor2d([[1, 2, 3], [4, 5, 6]]);\n\t *\n\t * a.dot(b).print();  // or tf.dot(a, b)\n\t * b.dot(a).print();\n\t * b.dot(c).print();\n\t * ```\n\t * @param t1 The first tensor in the dot operation.\n\t * @param t2 The second tensor in the dot operation.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Matrices'}\n\t */\n\n\tfunction dot_(t1, t2) {\n\t  var $t1 = convertToTensor(t1, 't1', 'dot');\n\t  var $t2 = convertToTensor(t2, 't2', 'dot');\n\t  assert(($t1.rank === 1 || $t1.rank === 2) && ($t2.rank === 1 || $t2.rank === 2), function () {\n\t    return \"Error in dot: inputs must all be rank 1 or 2, but got ranks \" + ($t1.rank + \" and \" + $t2.rank + \".\");\n\t  });\n\t  var t1Inner = $t1.rank === 1 ? $t1.size : $t1.shape[1];\n\t  var t2Inner = $t2.rank === 1 ? $t2.size : $t2.shape[0];\n\t  assert(t1Inner === t2Inner, function () {\n\t    return \"Error in dot: inner dimensions of inputs must match, but got \" + (t1Inner + \" and \" + t2Inner + \".\");\n\t  });\n\n\t  if ($t1.rank === 1 && $t2.rank === 1) {\n\t    var t12D = reshape($t1, [1, -1]);\n\t    var t22D = reshape($t2, [-1, 1]);\n\t    var t1t2 = matMul(t12D, t22D);\n\t    return reshape(t1t2, []);\n\t  } else if ($t1.rank === 1 && $t2.rank === 2) {\n\t    var _t12D = reshape($t1, [1, -1]);\n\n\t    var _t22D = reshape($t2, [$t2.shape[0], $t2.shape[1]]);\n\n\t    var _t1t = matMul(_t12D, _t22D);\n\n\t    return reshape(_t1t, [_t1t.size]);\n\t  } else if ($t1.rank === 2 && $t2.rank === 1) {\n\t    var _t22D2 = reshape($t2, [-1, 1]);\n\n\t    var _t1t2 = matMul($t1, _t22D2);\n\n\t    return reshape(_t1t2, [_t1t2.size]);\n\t  } else {\n\t    var _t22D3 = reshape($t2, [$t2.shape[0], $t2.shape[1]]);\n\n\t    var _t1t3 = matMul($t1, _t22D3);\n\n\t    return _t1t3;\n\t  }\n\t}\n\n\tvar dot = op({\n\t  dot_: dot_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes exponential linear element-wise: `x > 0 ? e ^ x - 1 : 0`.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([-1, 1, -3, 2]);\n\t *\n\t * x.elu().print();  // or tf.elu(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction elu_(x) {\n\t  var $x = convertToTensor(x, 'x', 'elu');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Elu, inputs);\n\t}\n\n\tvar elu = op({\n\t  elu_: elu_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes gause error function of the input `tf.Tensor` element-wise:\n\t * `erf(x)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([0, .1, -.1, .7]);\n\t *\n\t * x.erf().print(); // or tf.erf(x);\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction erf_(x) {\n\t  var $x = convertToTensor(x, 'x', 'erf');\n\t  assert($x.dtype === 'int32' || $x.dtype === 'float32', function () {\n\t    return 'Input dtype must be `int32` or `float32`.';\n\t  });\n\n\t  if ($x.dtype === 'int32') {\n\t    $x = cast($x, 'float32');\n\t  }\n\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Erf, inputs);\n\t}\n\n\tvar erf = op({\n\t  erf_: erf_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes exponential of the input `tf.Tensor` element-wise. `e ^ x`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, -3]);\n\t *\n\t * x.exp().print();  // or tf.exp(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction exp_(x) {\n\t  var $x = convertToTensor(x, 'x', 'exp');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Exp, inputs);\n\t}\n\n\tvar exp$3 = op({\n\t  exp_: exp_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns a `tf.Tensor` that has expanded rank, by inserting a dimension\n\t * into the tensor's shape.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 3, 4]);\n\t * const axis = 1;\n\t * x.expandDims(axis).print();\n\t * ```\n\t *\n\t * @param x The input tensor whose dimensions to be expanded.\n\t * @param axis The dimension index at which to insert shape of `1`. Defaults\n\t *     to 0 (the first dimension).\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Transformations'}\n\t */\n\n\tfunction expandDims_(x, axis) {\n\t  if (axis === void 0) {\n\t    axis = 0;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'expandDims', 'string_or_numeric');\n\t  assert(axis <= $x.rank, function () {\n\t    return 'Axis must be <= rank of the tensor';\n\t  });\n\t  var inputs = {\n\t    input: $x\n\t  };\n\t  var attrs = {\n\t    dim: axis\n\t  };\n\t  return ENGINE.runKernel(ExpandDims, inputs, attrs);\n\t}\n\n\tvar expandDims = op({\n\t  expandDims_: expandDims_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes exponential of the input `tf.Tensor` minus one element-wise.\n\t * `e ^ x - 1`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, -3]);\n\t *\n\t * x.expm1().print();  // or tf.expm1(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction expm1_(x) {\n\t  var $x = convertToTensor(x, 'x', 'expm1');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Expm1, inputs);\n\t}\n\n\tvar expm1 = op({\n\t  expm1_: expm1_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Construct a tensor by repeating it the number of times given by reps.\n\t *\n\t * This operation creates a new tensor by replicating `input` `reps`\n\t * times. The output tensor's i'th dimension has `input.shape[i] *\n\t * reps[i]` elements, and the values of `input` are replicated\n\t * `reps[i]` times along the i'th dimension. For example, tiling\n\t * `[a, b, c, d]` by `[2]` produces `[a, b, c, d, a, b, c, d]`.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 2]);\n\t *\n\t * a.tile([2]).print();    // or a.tile([2])\n\t * ```\n\t *\n\t * ```js\n\t * const a = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n\t *\n\t * a.tile([1, 2]).print();  // or a.tile([1, 2])\n\t * ```\n\t * @param x The tensor to tile.\n\t * @param reps Determines the number of replications per dimension.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n\t */\n\n\tfunction tile_(x, reps) {\n\t  var $x = convertToTensor(x, 'x', 'tile', 'string_or_numeric');\n\t  assert($x.rank === reps.length, function () {\n\t    return \"Error in transpose: rank of input \" + $x.rank + \" \" + (\"must match length of reps \" + reps + \".\");\n\t  });\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    reps: reps\n\t  };\n\t  return ENGINE.runKernel(Tile, inputs, attrs);\n\t}\n\n\tvar tile = op({\n\t  tile_: tile_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Create an identity matrix.\n\t *\n\t * @param numRows Number of rows.\n\t * @param numColumns Number of columns. Defaults to `numRows`.\n\t * @param batchShape If provided, will add the batch shape to the beginning\n\t *   of the shape of the returned `tf.Tensor` by repeating the identity\n\t *   matrix.\n\t * @param dtype Data type.\n\t * @returns Identity matrix of the specified size and data type, possibly\n\t *   with batch repetition if `batchShape` is specified.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction eye_(numRows, numColumns, batchShape, dtype) {\n\t  if (dtype === void 0) {\n\t    dtype = 'float32';\n\t  }\n\n\t  if (numColumns == null) {\n\t    numColumns = numRows;\n\t  }\n\n\t  var buff = buffer([numRows, numColumns], dtype);\n\t  var n = numRows <= numColumns ? numRows : numColumns;\n\n\t  for (var i = 0; i < n; ++i) {\n\t    buff.set(1, i, i);\n\t  }\n\n\t  var out = reshape(buff.toTensor(), [numRows, numColumns]);\n\n\t  if (batchShape == null) {\n\t    return out;\n\t  } else {\n\t    if (batchShape.length === 1) {\n\t      return tile(expandDims(out, 0), [batchShape[0], 1, 1]);\n\t    } else if (batchShape.length === 2) {\n\t      // tslint:disable-next-line:no-unnecessary-type-assertion\n\t      return tile(expandDims(expandDims(out, 0), 0), [batchShape[0], batchShape[1], 1, 1]);\n\t    } else if (batchShape.length === 3) {\n\t      // tslint:disable-next-line:no-unnecessary-type-assertion\n\t      return tile(expandDims(expandDims(expandDims(out, 0), 0), 0), [batchShape[0], batchShape[1], batchShape[2], 1, 1]);\n\t    } else {\n\t      throw new Error(\"eye() currently supports only 1D and 2D \" + ( // tslint:disable-next-line:no-any\n\t      \"batchShapes, but received \" + batchShape.length + \"D.\"));\n\t    }\n\t  }\n\t}\n\n\tvar eye = op({\n\t  eye_: eye_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates a `tf.Tensor` filled with a scalar value.\n\t *\n\t * ```js\n\t * tf.fill([2, 2], 4).print();\n\t * ```\n\t *\n\t * @param shape An array of integers defining the output tensor shape.\n\t * @param value The scalar value to fill the tensor with.\n\t * @param dtype The type of an element in the resulting tensor. Defaults to\n\t * 'float'.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction fill(shape, value, dtype) {\n\t  var attrs = {\n\t    shape: shape,\n\t    value: value,\n\t    dtype: dtype\n\t  };\n\t  return ENGINE.runKernel(Fill, {}, attrs);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes floor of input `tf.Tensor` element-wise: `floor(x)`.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([.6, 1.1, -3.3]);\n\t *\n\t * x.floor().print();  // or tf.floor(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction floor_(x) {\n\t  var $x = convertToTensor(x, 'x', 'floor');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Floor, inputs);\n\t}\n\n\tvar floor$a = op({\n\t  floor_: floor_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Gather slices from tensor `x`'s axis `axis` according to `indices`.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 3, 4]);\n\t * const indices = tf.tensor1d([1, 3, 3], 'int32');\n\t *\n\t * x.gather(indices).print();\n\t * ```\n\t *\n\t * ```js\n\t * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n\t * const indices = tf.tensor1d([1, 1, 0], 'int32');\n\t *\n\t * x.gather(indices).print();\n\t * ```\n\t * @param x The input tensor whose slices to be gathered.\n\t * @param indices The indices of the values to extract.\n\t * @param axis The axis over which to select values. Defaults to 0.\n\t * @param batchDims Optional. The number of batch dimensions. It must be less\n\t *     than or equal to rank(indices). Defaults to 0.\n\t *     The output tensor will have shape of\n\t *     `x.shape[:axis] + indices.shape[batchDims:] + x.shape[axis + 1:]`\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n\t */\n\n\tfunction gather_(x, indices, axis, batchDims) {\n\t  if (axis === void 0) {\n\t    axis = 0;\n\t  }\n\n\t  if (batchDims === void 0) {\n\t    batchDims = 0;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'gather');\n\t  var $indices = convertToTensor(indices, 'indices', 'gather', 'int32');\n\t  var inputs = {\n\t    x: $x,\n\t    indices: $indices\n\t  };\n\t  var attrs = {\n\t    axis: axis,\n\t    batchDims: batchDims\n\t  };\n\t  return ENGINE.runKernel(GatherV2, inputs, attrs);\n\t}\n\n\tvar gather = op({\n\t  gather_: gather_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns the truth value of (a > b) element-wise. Supports broadcasting.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 2, 3]);\n\t * const b = tf.tensor1d([2, 2, 2]);\n\t *\n\t * a.greater(b).print();\n\t * ```\n\t *\n\t * @param a The first input tensor.\n\t * @param b The second input tensor. Must have the same dtype as `a`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Logical'}\n\t */\n\n\tfunction greater_(a, b) {\n\t  var $a = convertToTensor(a, 'a', 'greater');\n\t  var $b = convertToTensor(b, 'b', 'greater');\n\n\t  var _makeTypesMatch = makeTypesMatch($a, $b);\n\n\t  $a = _makeTypesMatch[0];\n\t  $b = _makeTypesMatch[1];\n\t  assertAndGetBroadcastShape($a.shape, $b.shape);\n\t  var inputs = {\n\t    a: $a,\n\t    b: $b\n\t  };\n\t  return ENGINE.runKernel(Greater, inputs);\n\t}\n\n\tvar greater = op({\n\t  greater_: greater_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns the truth value of (a >= b) element-wise. Supports broadcasting.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 2, 3]);\n\t * const b = tf.tensor1d([2, 2, 2]);\n\t *\n\t * a.greaterEqual(b).print();\n\t * ```\n\t *\n\t * @param a The first input tensor.\n\t * @param b The second input tensor. Must have the same dtype as `a`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Logical'}\n\t */\n\n\tfunction greaterEqual_(a, b) {\n\t  var $a = convertToTensor(a, 'a', 'greaterEqual');\n\t  var $b = convertToTensor(b, 'b', 'greaterEqual');\n\n\t  var _makeTypesMatch = makeTypesMatch($a, $b);\n\n\t  $a = _makeTypesMatch[0];\n\t  $b = _makeTypesMatch[1];\n\t  assertAndGetBroadcastShape($a.shape, $b.shape);\n\t  var inputs = {\n\t    a: $a,\n\t    b: $b\n\t  };\n\t  return ENGINE.runKernel(GreaterEqual, inputs);\n\t}\n\n\tvar greaterEqual = op({\n\t  greaterEqual_: greaterEqual_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns the imaginary part of a complex (or real) tensor.\n\t *\n\t * Given a tensor input, this operation returns a tensor of type float that is\n\t * the imaginary part of each element in input considered as a complex number.\n\t * If input is real, a tensor of all zeros is returned.\n\t *\n\t * ```js\n\t * const x = tf.complex([-2.25, 3.25], [4.75, 5.75]);\n\t * tf.imag(x).print();\n\t * ```\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction imag_(input) {\n\t  var $input = convertToTensor(input, 'input', 'imag');\n\t  var inputs = {\n\t    input: $input\n\t  };\n\t  return ENGINE.runKernel(Imag, inputs);\n\t}\n\n\tvar imag = op({\n\t  imag_: imag_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns which elements of x are finite.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([NaN, Infinity, -Infinity, 0, 1]);\n\t *\n\t * x.isFinite().print();  // or tf.isNaN(x)\n\t * ```\n\t * @param x The input Tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction isFinite_(x) {\n\t  var $x = convertToTensor(x, 'x', 'isFinite');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(IsFinite, inputs);\n\t}\n\n\tvar isFinite$1 = op({\n\t  isFinite_: isFinite_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns which elements of x are Infinity or -Infinity.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([NaN, Infinity, -Infinity, 0, 1]);\n\t *\n\t * x.isInf().print();  // or tf.isNaN(x)\n\t * ```\n\t * @param x The input Tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction isInf_(x) {\n\t  var $x = convertToTensor(x, 'x', 'isInf');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(IsInf, inputs);\n\t}\n\n\tvar isInf = op({\n\t  isInf_: isInf_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * RReturns which elements of x are NaN.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([NaN, Infinity, -Infinity, 0, 1]);\n\t *\n\t * x.isNaN().print();  // or tf.isNaN(x)\n\t * ```\n\t * @param x The input Tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction isNaN_(x) {\n\t  var $x = convertToTensor(x, 'x', 'isNaN');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(IsNan, inputs);\n\t}\n\n\tvar isNaN$1 = op({\n\t  isNaN_: isNaN_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes leaky rectified linear element-wise.\n\t *\n\t * See\n\t * [http://web.stanford.edu/~awni/papers/relu_hybrid_icml2013_final.pdf](\n\t *     http://web.stanford.edu/~awni/papers/relu_hybrid_icml2013_final.pdf)\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([-1, 2, -3, 4]);\n\t *\n\t * x.leakyRelu(0.1).print();  // or tf.leakyRelu(x, 0.1)\n\t * ```\n\t * @param x The input tensor.\n\t * @param alpha The scaling factor for negative values, defaults to 0.2.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction leakyRelu_(x, alpha) {\n\t  if (alpha === void 0) {\n\t    alpha = 0.2;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'leakyRelu');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    alpha: alpha\n\t  };\n\t  return ENGINE.runKernel(LeakyRelu, inputs, attrs);\n\t}\n\n\tvar leakyRelu = op({\n\t  leakyRelu_: leakyRelu_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns the truth value of (a < b) element-wise. Supports broadcasting.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 2, 3]);\n\t * const b = tf.tensor1d([2, 2, 2]);\n\t *\n\t * a.less(b).print();\n\t * ```\n\t * @param a The first input tensor.\n\t * @param b The second input tensor. Must have the same dtype as `a`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Logical'}\n\t */\n\n\tfunction less_(a, b) {\n\t  var $a = convertToTensor(a, 'a', 'less');\n\t  var $b = convertToTensor(b, 'b', 'less');\n\n\t  var _makeTypesMatch = makeTypesMatch($a, $b);\n\n\t  $a = _makeTypesMatch[0];\n\t  $b = _makeTypesMatch[1];\n\t  assertAndGetBroadcastShape($a.shape, $b.shape);\n\t  var inputs = {\n\t    a: $a,\n\t    b: $b\n\t  };\n\t  return ENGINE.runKernel(Less, inputs);\n\t}\n\n\tvar less = op({\n\t  less_: less_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns the truth value of (a <= b) element-wise. Supports broadcasting.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 2, 3]);\n\t * const b = tf.tensor1d([2, 2, 2]);\n\t *\n\t * a.lessEqual(b).print();\n\t * ```\n\t *\n\t * @param a The first input tensor.\n\t * @param b The second input tensor. Must have the same dtype as `a`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Logical'}\n\t */\n\n\tfunction lessEqual_(a, b) {\n\t  var $a = convertToTensor(a, 'a', 'lessEqual');\n\t  var $b = convertToTensor(b, 'b', 'lessEqual');\n\n\t  var _makeTypesMatch = makeTypesMatch($a, $b);\n\n\t  $a = _makeTypesMatch[0];\n\t  $b = _makeTypesMatch[1];\n\t  assertAndGetBroadcastShape($a.shape, $b.shape);\n\t  var inputs = {\n\t    a: $a,\n\t    b: $b\n\t  };\n\t  return ENGINE.runKernel(LessEqual, inputs);\n\t}\n\n\tvar lessEqual = op({\n\t  lessEqual_: lessEqual_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Return an evenly spaced sequence of numbers over the given interval.\n\t *\n\t * ```js\n\t * tf.linspace(0, 9, 10).print();\n\t * ```\n\t * @param start The start value of the sequence.\n\t * @param stop The end value of the sequence.\n\t * @param num The number of values to generate.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction linspace(start, stop, num) {\n\t  if (num <= 0) {\n\t    throw new Error('The number of values should be positive.');\n\t  }\n\n\t  var attrs = {\n\t    start: start,\n\t    stop: stop,\n\t    num: num\n\t  };\n\t  return ENGINE.runKernel(LinSpace, {}, attrs);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Normalizes the activation of a local neighborhood across or within\n\t * channels.\n\t *\n\t * @param x The input tensor. The 4-D input tensor is treated as a 3-D array\n\t *     of 1D vectors (along the last dimension), and each vector is\n\t *     normalized independently.\n\t * @param depthRadius The number of adjacent channels in the 1D normalization\n\t *     window.\n\t * @param bias A constant bias term for the basis.\n\t * @param alpha A scale factor, usually positive.\n\t * @param beta An exponent.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Normalization'}\n\t */\n\n\tfunction localResponseNormalization_(x, depthRadius, bias, alpha, beta) {\n\t  if (depthRadius === void 0) {\n\t    depthRadius = 5;\n\t  }\n\n\t  if (bias === void 0) {\n\t    bias = 1;\n\t  }\n\n\t  if (alpha === void 0) {\n\t    alpha = 1;\n\t  }\n\n\t  if (beta === void 0) {\n\t    beta = 0.5;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'localResponseNormalization');\n\t  assert($x.rank === 4 || $x.rank === 3, function () {\n\t    return \"Error in localResponseNormalization: x must be rank 3 or 4 but got\\n               rank \" + $x.rank + \".\";\n\t  });\n\t  assert(isInt(depthRadius), function () {\n\t    return \"Error in localResponseNormalization: depthRadius must be an \" + (\"integer but got depthRadius \" + depthRadius + \".\");\n\t  });\n\t  var x4D = $x;\n\t  var reshapedTo4D = false;\n\n\t  if ($x.rank === 3) {\n\t    reshapedTo4D = true;\n\t    x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n\t  }\n\n\t  var inputs = {\n\t    x: x4D\n\t  };\n\t  var attrs = {\n\t    depthRadius: depthRadius,\n\t    bias: bias,\n\t    alpha: alpha,\n\t    beta: beta\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var res = ENGINE.runKernel(LRN, inputs, attrs);\n\n\t  if (reshapedTo4D) {\n\t    return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n\t  } else {\n\t    return res;\n\t  }\n\t}\n\n\tvar localResponseNormalization = op({\n\t  localResponseNormalization_: localResponseNormalization_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes natural logarithm of the input `tf.Tensor` element-wise: `ln(x)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, Math.E]);\n\t *\n\t * x.log().print();  // or tf.log(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction log_(x) {\n\t  var $x = convertToTensor(x, 'x', 'log');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Log, inputs);\n\t}\n\n\tvar log$9 = op({\n\t  log_: log_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes natural logarithm of the input `tf.Tensor` plus one\n\t * element-wise: `ln(1 + x)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, Math.E - 1]);\n\t *\n\t * x.log1p().print();  // or tf.log1p(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction log1p_(x) {\n\t  var $x = convertToTensor(x, 'x', 'log1p');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Log1p, inputs);\n\t}\n\n\tvar log1p = op({\n\t  log1p_: log1p_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Provided `f(x)`, returns another function `g(x, dy?)`, which gives the\n\t * gradient of `f(x)` with respect to `x`.\n\t *\n\t * If `dy` is provided, the gradient of `f(x).mul(dy).sum()` with respect to\n\t * `x` is computed instead. `f(x)` must take a single tensor `x` and return a\n\t * single tensor `y`. If `f()` takes multiple inputs, use `tf.grads` instead.\n\t *\n\t * ```js\n\t * // f(x) = x ^ 2\n\t * const f = x => x.square();\n\t * // f'(x) = 2x\n\t * const g = tf.grad(f);\n\t *\n\t * const x = tf.tensor1d([2, 3]);\n\t * g(x).print();\n\t * ```\n\t *\n\t * ```js\n\t * // f(x) = x ^ 3\n\t * const f = x => x.pow(tf.scalar(3, 'int32'));\n\t * // f'(x) = 3x ^ 2\n\t * const g = tf.grad(f);\n\t * // f''(x) = 6x\n\t * const gg = tf.grad(g);\n\t *\n\t * const x = tf.tensor1d([2, 3]);\n\t * gg(x).print();\n\t * ```\n\t *\n\t * @param f The function f(x), to compute gradient for.\n\t *\n\t * @doc {heading: 'Training', subheading: 'Gradients'}\n\t */\n\n\tfunction grad(f) {\n\t  assert(isFunction(f), function () {\n\t    return 'The f passed in grad(f) must be a function';\n\t  });\n\t  return function (x, dy) {\n\t    // x can be of any dtype, thus null as the last argument.\n\t    var $x = convertToTensor(x, 'x', 'tf.grad', 'string_or_numeric');\n\t    var $dy = dy != null ? convertToTensor(dy, 'dy', 'tf.grad') : null;\n\t    return ENGINE.tidy(function () {\n\t      var _ENGINE$gradients = ENGINE.gradients(function () {\n\t        return f($x);\n\t      }, [$x], $dy),\n\t          value = _ENGINE$gradients.value,\n\t          grads = _ENGINE$gradients.grads;\n\n\t      if ($dy != null) {\n\t        assertShapesMatch(value.shape, $dy.shape, 'The shape of dy passed in grad(f)(x, dy) must match the shape ' + 'returned by f(x)');\n\t      }\n\n\t      checkGrads(grads);\n\t      return grads[0];\n\t    });\n\t  };\n\t}\n\t/**\n\t * Provided `f(x1, x2,...)`, returns another function `g([x1, x2,...], dy?)`,\n\t * which gives an array of gradients of `f()` with respect to each input\n\t * [`x1`,`x2`,...].\n\t *\n\t * If `dy` is passed when calling `g()`, the gradient of\n\t * `f(x1,...).mul(dy).sum()` with respect to each input is computed instead.\n\t * The provided `f` must take one or more tensors and return a single tensor\n\t * `y`. If `f()` takes a single input, we recommend using `tf.grad` instead.\n\t *\n\t * ```js\n\t * // f(a, b) = a * b\n\t * const f = (a, b) => a.mul(b);\n\t * // df / da = b, df / db = a\n\t * const g = tf.grads(f);\n\t *\n\t * const a = tf.tensor1d([2, 3]);\n\t * const b = tf.tensor1d([-2, -3]);\n\t * const [da, db] = g([a, b]);\n\t * console.log('da');\n\t * da.print();\n\t * console.log('db');\n\t * db.print();\n\t * ```\n\t *\n\t * @param f The function `f(x1, x2,...)` to compute gradients for.\n\t *\n\t * @doc {heading: 'Training', subheading: 'Gradients'}\n\t */\n\n\n\tfunction grads(f) {\n\t  assert(isFunction(f), function () {\n\t    return 'The f passed in grads(f) must be a function';\n\t  });\n\t  return function (args, dy) {\n\t    assert(Array.isArray(args), function () {\n\t      return 'The args passed in grads(f)(args) must be an array ' + 'of `Tensor`s or `TensorLike`s';\n\t    }); // args can be of any dtype, thus null as the last argument.\n\n\t    var $args = convertToTensorArray(args, 'args', 'tf.grads', 'string_or_numeric');\n\t    var $dy = dy != null ? convertToTensor(dy, 'dy', 'tf.grads') : null;\n\t    return ENGINE.tidy(function () {\n\t      var _ENGINE$gradients2 = ENGINE.gradients(function () {\n\t        return f.apply(void 0, $args);\n\t      }, $args, $dy),\n\t          value = _ENGINE$gradients2.value,\n\t          grads = _ENGINE$gradients2.grads;\n\n\t      if ($dy != null) {\n\t        assertShapesMatch(value.shape, $dy.shape, 'The shape of dy passed in grads(f)([x1,...], dy) must ' + 'match the shape returned by f([x1,...])');\n\t      }\n\n\t      checkGrads(grads);\n\t      return grads;\n\t    });\n\t  };\n\t}\n\t/**\n\t * Like `tf.grad`, but also returns the value of `f()`. Useful when `f()`\n\t * returns a metric you want to show.\n\t *\n\t * The result is a rich object with the following properties:\n\t * - grad: The gradient of `f(x)` w.r.t `x` (result of `tf.grad`).\n\t * - value: The value returned by `f(x)`.\n\t *\n\t * ```js\n\t * // f(x) = x ^ 2\n\t * const f = x => x.square();\n\t * // f'(x) = 2x\n\t * const g = tf.valueAndGrad(f);\n\t *\n\t * const x = tf.tensor1d([2, 3]);\n\t * const {value, grad} = g(x);\n\t *\n\t * console.log('value');\n\t * value.print();\n\t * console.log('grad');\n\t * grad.print();\n\t * ```\n\t *\n\t * @doc {heading: 'Training', subheading: 'Gradients'}\n\t */\n\n\n\tfunction valueAndGrad(f) {\n\t  assert(isFunction(f), function () {\n\t    return 'The f passed in valueAndGrad(f) must be a function';\n\t  });\n\t  return function (x, dy) {\n\t    assert(x instanceof Tensor, function () {\n\t      return 'The x passed in valueAndGrad(f)(x) must be a tensor';\n\t    });\n\t    assert(dy == null || dy instanceof Tensor, function () {\n\t      return 'The dy passed in valueAndGrad(f)(x, dy) must be a tensor';\n\t    });\n\n\t    var _ENGINE$gradients3 = ENGINE.gradients(function () {\n\t      return f(x);\n\t    }, [x], dy),\n\t        grads = _ENGINE$gradients3.grads,\n\t        value = _ENGINE$gradients3.value;\n\n\t    checkGrads(grads);\n\t    return {\n\t      grad: grads[0],\n\t      value: value\n\t    };\n\t  };\n\t}\n\t/**\n\t * Like `tf.grads`, but returns also the value of `f()`. Useful when `f()`\n\t * returns a metric you want to show.\n\t *\n\t * The result is a rich object with the following properties:\n\t * - grads: The gradients of `f()` w.r.t each input (result of `tf.grads`).\n\t * - value: The value returned by `f(x)`.\n\t *\n\t * ```js\n\t * // f(a, b) = a * b\n\t * const f = (a, b) => a.mul(b);\n\t * // df/da = b, df/db = a\n\t * const g = tf.valueAndGrads(f);\n\t *\n\t * const a = tf.tensor1d([2, 3]);\n\t * const b = tf.tensor1d([-2, -3]);\n\t * const {value, grads} = g([a, b]);\n\t *\n\t * const [da, db] = grads;\n\t *\n\t * console.log('value');\n\t * value.print();\n\t *\n\t * console.log('da');\n\t * da.print();\n\t * console.log('db');\n\t * db.print();\n\t * ```\n\t *\n\t * @doc {heading: 'Training', subheading: 'Gradients'}\n\t */\n\n\n\tfunction valueAndGrads(f) {\n\t  assert(isFunction(f), function () {\n\t    return 'The f passed in valueAndGrads(f) must be a function';\n\t  });\n\t  return function (args, dy) {\n\t    assert(Array.isArray(args) && args.every(function (arg) {\n\t      return arg instanceof Tensor;\n\t    }), function () {\n\t      return 'The args passed in valueAndGrads(f)(args) must be array of ' + 'tensors';\n\t    });\n\t    assert(dy == null || dy instanceof Tensor, function () {\n\t      return 'The dy passed in valueAndGrads(f)(args, dy) must be a tensor';\n\t    });\n\t    var res = ENGINE.gradients(function () {\n\t      return f.apply(void 0, args);\n\t    }, args, dy);\n\n\t    if (dy != null) {\n\t      assertShapesMatch(res.value.shape, dy.shape, 'The shape of dy passed in valueAndGrads(f)([x1,...], dy) must ' + 'match the shape returned by f([x1,...])');\n\t    }\n\n\t    checkGrads(res.grads);\n\t    return res;\n\t  };\n\t}\n\t/**\n\t * Computes and returns the gradient of f(x) with respect to the list of\n\t * trainable variables provided by `varList`. If no list is provided, it\n\t * defaults to all trainable variables.\n\t *\n\t * ```js\n\t * const a = tf.variable(tf.tensor1d([3, 4]));\n\t * const b = tf.variable(tf.tensor1d([5, 6]));\n\t * const x = tf.tensor1d([1, 2]);\n\t *\n\t * // f(a, b) = a * x ^ 2 + b * x\n\t * const f = () => a.mul(x.square()).add(b.mul(x)).sum();\n\t * // df/da = x ^ 2, df/db = x\n\t * const {value, grads} = tf.variableGrads(f);\n\t *\n\t * Object.keys(grads).forEach(varName => grads[varName].print());\n\t * ```\n\t *\n\t * @param f The function to execute. f() should return a scalar.\n\t * @param varList The list of variables to compute the gradients with respect\n\t *     to. Defaults to all trainable variables.\n\t * @returns An object with the following keys and values:\n\t *   - `value`: The value of the function `f`.\n\t *   - `grads`: A map from the names of the variables to the gradients.\n\t *     If the `varList` argument is provided explicitly and contains a subset of\n\t *     non-trainable variables, this map in the return value will contain keys\n\t *     that map the names of the non-trainable variables to `null`.\n\t *\n\t * @doc {heading: 'Training', subheading: 'Gradients'}\n\t */\n\n\n\tfunction variableGrads(f, varList) {\n\t  assert(isFunction(f), function () {\n\t    return 'The f passed in variableGrads(f) must be a function';\n\t  });\n\t  assert(varList == null || Array.isArray(varList) && varList.every(function (v) {\n\t    return v instanceof Variable;\n\t  }), function () {\n\t    return 'The varList passed in variableGrads(f, varList) must be an array ' + 'of variables';\n\t  });\n\t  var specifiedVarList = varList != null;\n\n\t  if (!specifiedVarList) {\n\t    // Get all of the trainable variables.\n\t    varList = [];\n\n\t    for (var varName in ENGINE.registeredVariables) {\n\t      varList.push(ENGINE.registeredVariables[varName]);\n\t    }\n\t  }\n\n\t  var specifiedNonTrainable = specifiedVarList ? varList.filter(function (variable) {\n\t    return !variable.trainable;\n\t  }) : null; // Prune non-trainable variables.\n\n\t  var originalVarCount = varList.length;\n\t  varList = varList.filter(function (variable) {\n\t    return variable.trainable;\n\t  });\n\t  assert(varList.length > 0, function () {\n\t    return \"variableGrads() expects at least one of the input variables to \" + (\"be trainable, but none of the \" + originalVarCount + \" variables is \") + \"trainable.\";\n\t  });\n\t  var allowNoGradients = true;\n\n\t  var _ENGINE$gradients4 = ENGINE.gradients(f, varList, null, allowNoGradients),\n\t      value = _ENGINE$gradients4.value,\n\t      grads = _ENGINE$gradients4.grads;\n\n\t  assert(grads.some(function (g) {\n\t    return g != null;\n\t  }), function () {\n\t    return 'Cannot find a connection between any variable and the result of ' + 'the loss function y=f(x). Please make sure the operations that ' + 'use variables are inside the function f passed to minimize().';\n\t  });\n\t  assert(value.rank === 0, function () {\n\t    return \"The f passed in variableGrads(f) must return a scalar, but it \" + (\"returned a rank-\" + value.rank + \" tensor\");\n\t  });\n\t  var namedGrads = {};\n\t  varList.forEach(function (v, i) {\n\t    if (grads[i] != null) {\n\t      namedGrads[v.name] = grads[i];\n\t    }\n\t  });\n\n\t  if (specifiedNonTrainable != null) {\n\t    // If varList is explicitly provided and contains non-trainable values,\n\t    // add them to the returned gradients with `null` values.\n\t    specifiedNonTrainable.forEach(function (v) {\n\t      return namedGrads[v.name] = null;\n\t    });\n\t  }\n\n\t  return {\n\t    value: value,\n\t    grads: namedGrads\n\t  };\n\t}\n\t/**\n\t * Overrides the gradient computation of a function `f`.\n\t *\n\t * Takes a function\n\t * `f(...inputs, save) => {value: Tensor, gradFunc: (dy, saved) => Tensor[]}`\n\t * and returns another function `g(...inputs)` which takes the same inputs as\n\t * `f`. When called, `g` returns `f().value`. In backward mode, custom gradients\n\t * with respect to each input of `f` are computed using `f().gradFunc`.\n\t *\n\t * The `save` function passsed to `f` should be used for saving tensors needed\n\t * in the gradient. And the `saved` passed to the `gradFunc` is a\n\t * `NamedTensorMap`, which contains those saved tensor.\n\t *\n\t * ```js\n\t * const customOp = tf.customGrad((x, save) => {\n\t *   // Save x to make sure it's available later for the gradient.\n\t *   save([x]);\n\t *   // Override gradient of our custom x ^ 2 op to be dy * abs(x);\n\t *   return {\n\t *     value: x.square(),\n\t *     // Note `saved.x` which points to the `x` we saved earlier.\n\t *     gradFunc: (dy, saved) => [dy.mul(saved[0].abs())]\n\t *   };\n\t * });\n\t *\n\t * const x = tf.tensor1d([-1, -2, 3]);\n\t * const dx = tf.grad(x => customOp(x));\n\t *\n\t * console.log(`f(x):`);\n\t * customOp(x).print();\n\t * console.log(`f'(x):`);\n\t * dx(x).print();\n\t * ```\n\t *\n\t * @param f The function to evaluate in forward mode, which should return\n\t *     `{value: Tensor, gradFunc: (dy, saved) => Tensor[]}`, where `gradFunc`\n\t *     returns the custom gradients of `f` with respect to its inputs.\n\t *\n\t * @doc {heading: 'Training', subheading: 'Gradients'}\n\t */\n\n\n\tfunction customGrad(f) {\n\t  return ENGINE.customGrad(f);\n\t}\n\n\tfunction checkGrads(grads) {\n\t  var numNullGradients = grads.filter(function (g) {\n\t    return g == null;\n\t  }).length;\n\n\t  if (numNullGradients > 0) {\n\t    throw new Error(\"Cannot compute gradient of y=f(x) with respect to x. Make sure that\\n    the f you passed encloses all operations that lead from x to y.\");\n\t  }\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes `-1 * x` element-wise.\n\t *\n\t * ```js\n\t * const x = tf.tensor2d([1, 2, -2, 0], [2, 2]);\n\t *\n\t * x.neg().print();  // or tf.neg(x)\n\t * ```\n\t *\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction neg_(x) {\n\t  var $x = convertToTensor(x, 'x', 'neg');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Neg, inputs);\n\t}\n\n\tvar neg = op({\n\t  neg_: neg_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes softplus of the input `tf.Tensor` element-wise: `log(exp(x) + 1)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([0, 1, -1, .7]);\n\t *\n\t * x.softplus().print();  // or tf.softplus(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction softplus_(x) {\n\t  var $x = convertToTensor(x, 'x', 'softplus');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Softplus, inputs);\n\t}\n\n\tvar softplus = op({\n\t  softplus_: softplus_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes log sigmoid of the input `tf.Tensor` element-wise:\n\t * `logSigmoid(x)`. For numerical stability, we use `-tf.softplus(-x)`.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([0, 1, -1, .7]);\n\t *\n\t * x.logSigmoid().print();  // or tf.logSigmoid(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction logSigmoid_(x) {\n\t  var $x = convertToTensor(x, 'x', 'logSigmoid'); // Use a custom gradient to maintain previous implementation.\n\t  // There is no LogSigmoid kernel in TF so we can't use engine.runKernel\n\t  // directly\n\n\t  var customOp = customGrad(function (x) {\n\t    // TODO(yassogba) we can remove the chained softplus call here only\n\t    // after backends have modualrized softplus at which point we can call\n\t    // engine runKernel(..., Sotfplus, ...) directly.\n\t    var value = neg(softplus(neg(x)));\n\n\t    var gradFunc = function gradFunc(dy) {\n\t      var derX = mul(dy, sigmoid(neg(x)));\n\t      return derX;\n\t    };\n\n\t    return {\n\t      value: value,\n\t      gradFunc: gradFunc\n\t    };\n\t  });\n\t  return customOp($x);\n\t}\n\n\tvar logSigmoid = op({\n\t  logSigmoid_: logSigmoid_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the maximum of elements across dimensions of a `tf.Tensor`.\n\t *\n\t * Reduces the input along the dimensions given in `axes`. Unless `keepDims`\n\t * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in\n\t * `axes`. If `keepDims` is true, the reduced dimensions are retained with\n\t * length 1. If `axes` has no entries, all dimensions are reduced, and an\n\t * `tf.Tensor` with a single element is returned.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 3]);\n\t *\n\t * x.max().print();  // or tf.max(x)\n\t * ```\n\t *\n\t * ```js\n\t * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n\t *\n\t * const axis = 1;\n\t * x.max(axis).print();  // or tf.max(x, axis)\n\t * ```\n\t *\n\t * @param x The input tensor.\n\t * @param axis The dimension(s) to reduce. By default it reduces\n\t *     all dimensions.\n\t * @param keepDims If true, retains reduced dimensions with size 1.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Reduction'}\n\t */\n\n\tfunction max_(x, axis, keepDims) {\n\t  if (axis === void 0) {\n\t    axis = null;\n\t  }\n\n\t  if (keepDims === void 0) {\n\t    keepDims = false;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'max');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    reductionIndices: axis,\n\t    keepDims: keepDims\n\t  };\n\t  return ENGINE.runKernel(Max, inputs, attrs);\n\t}\n\n\tvar max$4 = op({\n\t  max_: max_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Subtracts two `tf.Tensor`s element-wise, A - B. Supports broadcasting.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([10, 20, 30, 40]);\n\t * const b = tf.tensor1d([1, 2, 3, 4]);\n\t *\n\t * a.sub(b).print();  // or tf.sub(a, b)\n\t * ```\n\t *\n\t * ```js\n\t * // Broadcast subtract a with b.\n\t * const a = tf.tensor1d([10, 20, 30, 40]);\n\t * const b = tf.scalar(5);\n\t *\n\t * a.sub(b).print();  // or tf.sub(a, b)\n\t * ```\n\t * @param a The first `tf.Tensor` to subtract from.\n\t * @param b The second `tf.Tensor` to be subtracted. Must have the same dtype as\n\t * `a`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n\t */\n\n\tfunction sub_(a, b) {\n\t  var $a = convertToTensor(a, 'a', 'sub');\n\t  var $b = convertToTensor(b, 'b', 'sub');\n\n\t  var _makeTypesMatch = makeTypesMatch($a, $b);\n\n\t  $a = _makeTypesMatch[0];\n\t  $b = _makeTypesMatch[1];\n\t  var inputs = {\n\t    a: $a,\n\t    b: $b\n\t  };\n\t  return ENGINE.runKernel(Sub, inputs);\n\t}\n\n\tvar sub = op({\n\t  sub_: sub_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the sum of elements across dimensions of a `tf.Tensor`.\n\t *\n\t * Reduces the input along the dimensions given in `axes`. Unless `keepDims`\n\t * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in\n\t * `axes`. If `keepDims` is true, the reduced dimensions are retained with\n\t * length 1. If axes has no entries, all dimensions are reduced, and a\n\t * `tf.Tensor` with a single element is returned.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 3]);\n\t *\n\t * x.sum().print();  // or tf.sum(x)\n\t * ```\n\t *\n\t * ```js\n\t * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n\t *\n\t * const axis = 1;\n\t * x.sum(axis).print();  // or tf.sum(x, axis)\n\t * ```\n\t *\n\t * @param x The input tensor to compute the sum over. If the dtype is `bool`\n\t *   it will be converted to `int32` and the output dtype will be `int32`.\n\t * @param axis The dimension(s) to reduce. By default it reduces\n\t *     all dimensions.\n\t * @param keepDims If true, retains reduced dimensions with size 1.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Reduction'}\n\t */\n\n\tfunction sum_(x, axis, keepDims) {\n\t  if (axis === void 0) {\n\t    axis = null;\n\t  }\n\n\t  if (keepDims === void 0) {\n\t    keepDims = false;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'sum');\n\n\t  if ($x.dtype === 'bool') {\n\t    $x = cast($x, 'int32');\n\t  }\n\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    axis: axis,\n\t    keepDims: keepDims\n\t  };\n\t  return ENGINE.runKernel(Sum, inputs, attrs);\n\t}\n\n\tvar sum$1 = op({\n\t  sum_: sum_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google Inc. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the log softmax.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 2, 3]);\n\t *\n\t * a.logSoftmax().print();  // or tf.logSoftmax(a)\n\t * ```\n\t *\n\t * ```js\n\t * const a = tf.tensor2d([2, 4, 6, 1, 2, 3], [2, 3]);\n\t *\n\t * a.logSoftmax().print();  // or tf.logSoftmax(a)\n\t * ```\n\t *\n\t * @param logits The logits array.\n\t * @param axis The dimension softmax would be performed on. Defaults to `-1`\n\t *     which indicates the last dimension.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Normalization'}\n\t */\n\n\tfunction logSoftmax_(logits, axis) {\n\t  if (axis === void 0) {\n\t    axis = -1;\n\t  }\n\n\t  var $logits = convertToTensor(logits, 'logits', 'logSoftmax');\n\n\t  if (axis === -1) {\n\t    axis = $logits.rank - 1;\n\t  }\n\n\t  if (axis !== $logits.rank - 1) {\n\t    throw Error('Log Softmax along a non-last dimension is not yet supported. ' + (\"Logits was rank \" + $logits.rank + \" and axis was \" + axis));\n\t  } // const forward: ForwardFunc<Tensor> = (backend, save) => {\n\t  //   const keepDims = true;\n\t  //   const xMax = max(logits, axis, true);\n\t  //   const shifted = sub(logits, xMax);\n\t  //   const value =\n\t  //       sub(cast(shifted, 'float32'), log(sum(exp(shifted), axis,\n\t  //       keepDims)));\n\t  //   save([value]);\n\t  //   return value;\n\t  // };\n\t  // Use a custom gradient for numerical stability.\n\n\n\t  var customOp = customGrad(function (logits, save) {\n\t    var keepDims = true;\n\t    var xMax = max$4(logits, axis, true);\n\t    var shifted = sub(logits, xMax);\n\t    var value = sub(cast(shifted, 'float32'), log$9(sum$1(exp$3(shifted), axis, keepDims)));\n\t    save([value]);\n\n\t    var gradFunc = function gradFunc(dy, saved) {\n\t      var value = saved[0];\n\t      var keepDims = true;\n\t      var softmax = exp$3(value);\n\t      return sub(dy, mul(sum$1(dy, axis, keepDims), softmax));\n\t    };\n\n\t    return {\n\t      value: value,\n\t      gradFunc: gradFunc\n\t    };\n\t  });\n\t  return customOp($logits); // TODO Use Engine.runKernel when CPU/WebGL/WASM backends implement this.\n\t  // const inputs: LogSoftmaxInputs = {logits: $logits};\n\t  // const attrs: LogSoftmaxAttrs = {axis};\n\t  // return ENGINE.runKernel(\n\t  //            LogSoftmax, inputs as {} as NamedTensorMap,\n\t  //            attrs as {} as NamedAttrMap);\n\t}\n\n\tvar logSoftmax = op({\n\t  logSoftmax_: logSoftmax_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns true if the axis specifies the inner most dimensions of the\n\t * array.\n\t */\n\n\tfunction axesAreInnerMostDims(axes, rank) {\n\t  for (var i = 0; i < axes.length; ++i) {\n\t    if (axes[axes.length - i - 1] !== rank - 1 - i) {\n\t      return false;\n\t    }\n\t  }\n\n\t  return true;\n\t}\n\tfunction combineLocations(outputLoc, reduceLoc, axes) {\n\t  var rank = outputLoc.length + reduceLoc.length;\n\t  var loc = [];\n\t  var outIdx = 0;\n\t  var reduceIdx = 0;\n\n\t  for (var dim = 0; dim < rank; dim++) {\n\t    if (axes.indexOf(dim) === -1) {\n\t      loc.push(outputLoc[outIdx++]);\n\t    } else {\n\t      loc.push(reduceLoc[reduceIdx++]);\n\t    }\n\t  }\n\n\t  return loc;\n\t}\n\tfunction computeOutAndReduceShapes(aShape, axes) {\n\t  var outShape = [];\n\t  var rank = aShape.length;\n\n\t  for (var dim = 0; dim < rank; dim++) {\n\t    if (axes.indexOf(dim) === -1) {\n\t      outShape.push(aShape[dim]);\n\t    }\n\t  }\n\n\t  var reduceShape = axes.map(function (dim) {\n\t    return aShape[dim];\n\t  });\n\t  return [outShape, reduceShape];\n\t}\n\tfunction expandShapeToKeepDim(shape, axes) {\n\t  var reduceSubShape = axes.map(function (x) {\n\t    return 1;\n\t  });\n\t  return combineLocations(shape, reduceSubShape, axes);\n\t}\n\tfunction assertAxesAreInnerMostDims(msg, axes, rank) {\n\t  assert(axesAreInnerMostDims(axes, rank), function () {\n\t    return msg + \" supports only inner-most axes for now. \" + (\"Got axes \" + axes + \" and rank-\" + rank + \" input.\");\n\t  });\n\t}\n\t/**\n\t * Returns the axes permutation to be used with `tf.transpose`, if such\n\t * permutation is necessary. Otherwise it returns null. This method is used by\n\t * operations that operate only on inner-most axes.\n\t */\n\n\tfunction getAxesPermutation(axes, rank) {\n\t  if (axesAreInnerMostDims(axes, rank)) {\n\t    return null;\n\t  }\n\n\t  var result = [];\n\n\t  for (var i = 0; i < rank; ++i) {\n\t    if (axes.indexOf(i) === -1) {\n\t      result.push(i);\n\t    }\n\t  }\n\n\t  axes.forEach(function (axis) {\n\t    return result.push(axis);\n\t  });\n\t  return result;\n\t}\n\t/** Returns the axes permutation that undoes the original permutation. */\n\n\tfunction getUndoAxesPermutation(axes) {\n\t  return axes.map(function (axis, i) {\n\t    return [i, axis];\n\t  }).sort(function (a, b) {\n\t    return a[1] - b[1];\n\t  }).map(function (x) {\n\t    return x[0];\n\t  });\n\t}\n\tfunction getInnerMostAxes(numAxes, rank) {\n\t  var res = [];\n\n\t  for (var i = rank - numAxes; i < rank; ++i) {\n\t    res.push(i);\n\t  }\n\n\t  return res;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the log(sum(exp(elements across the reduction dimensions)).\n\t *\n\t * Reduces the input along the dimensions given in `axis`. Unless `keepDims`\n\t * is true, the rank of the array is reduced by 1 for each entry in `axis`.\n\t * If `keepDims` is true, the reduced dimensions are retained with length 1.\n\t * If `axis` has no entries, all dimensions are reduced, and an array with a\n\t * single element is returned.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 3]);\n\t *\n\t * x.logSumExp().print();  // or tf.logSumExp(x)\n\t * ```\n\t *\n\t * ```js\n\t * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n\t *\n\t * const axis = 1;\n\t * x.logSumExp(axis).print();  // or tf.logSumExp(a, axis)\n\t * ```\n\t * @param x The input tensor.\n\t * @param axis The dimension(s) to reduce. If null (the default),\n\t *     reduces all dimensions.\n\t * @param keepDims If true, retains reduced dimensions with length\n\t *     of 1. Defaults to false.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Reduction'}\n\t */\n\n\tfunction logSumExp_(x, axis, keepDims) {\n\t  if (axis === void 0) {\n\t    axis = null;\n\t  }\n\n\t  if (keepDims === void 0) {\n\t    keepDims = false;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'logSumExp');\n\t  var axes = parseAxisParam(axis, $x.shape);\n\t  var xMax = max$4($x, axes, true\n\t  /* keepDims */\n\t  );\n\t  var a = sub($x, xMax);\n\t  var b = exp$3(a);\n\t  var c = sum$1(b, axes);\n\t  var d = log$9(c);\n\t  var res = add$1(reshape(xMax, d.shape), d);\n\n\t  if (keepDims) {\n\t    var newShape = expandShapeToKeepDim(res.shape, axes);\n\t    return reshape(res, newShape);\n\t  }\n\n\t  return res;\n\t}\n\n\tvar logSumExp = op({\n\t  logSumExp_: logSumExp_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns the truth value of `a AND b` element-wise. Supports broadcasting.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([false, false, true, true], 'bool');\n\t * const b = tf.tensor1d([false, true, false, true], 'bool');\n\t *\n\t * a.logicalAnd(b).print();\n\t * ```\n\t *\n\t * @param a The first input tensor. Must be of dtype bool.\n\t * @param b The second input tensor. Must be of dtype bool.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Logical'}\n\t */\n\n\tfunction logicalAnd_(a, b) {\n\t  var $a = convertToTensor(a, 'a', 'logicalAnd', 'bool');\n\t  var $b = convertToTensor(b, 'b', 'logicalAnd', 'bool');\n\t  assertAndGetBroadcastShape($a.shape, $b.shape);\n\t  var inputs = {\n\t    a: $a,\n\t    b: $b\n\t  };\n\t  return ENGINE.runKernel(LogicalAnd, inputs);\n\t}\n\n\tvar logicalAnd = op({\n\t  logicalAnd_: logicalAnd_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns the truth value of `NOT x` element-wise.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([false, true], 'bool');\n\t *\n\t * a.logicalNot().print();\n\t * ```\n\t *\n\t * @param x The input tensor. Must be of dtype 'bool'.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Logical'}\n\t */\n\n\tfunction logicalNot_(x) {\n\t  var $x = convertToTensor(x, 'x', 'logicalNot', 'bool');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(LogicalNot, inputs);\n\t}\n\n\tvar logicalNot = op({\n\t  logicalNot_: logicalNot_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns the truth value of `a OR b` element-wise. Supports broadcasting.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([false, false, true, true], 'bool');\n\t * const b = tf.tensor1d([false, true, false, true], 'bool');\n\t *\n\t * a.logicalOr(b).print();\n\t * ```\n\t * @param a The first input tensor. Must be of dtype bool.\n\t * @param b The second input tensor. Must be of dtype bool.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Logical'}\n\t */\n\n\tfunction logicalOr_(a, b) {\n\t  var $a = convertToTensor(a, 'a', 'logicalOr', 'bool');\n\t  var $b = convertToTensor(b, 'b', 'logicalOr', 'bool');\n\t  assertAndGetBroadcastShape($a.shape, $b.shape);\n\t  var inputs = {\n\t    a: $a,\n\t    b: $b\n\t  };\n\t  return ENGINE.runKernel(LogicalOr, inputs);\n\t}\n\n\tvar logicalOr = op({\n\t  logicalOr_: logicalOr_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns the truth value of `a XOR b` element-wise. Supports broadcasting.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([false, false, true, true], 'bool');\n\t * const b = tf.tensor1d([false, true, false, true], 'bool');\n\t *\n\t * a.logicalXor(b).print();\n\t * ```\n\t *\n\t * @param a The first input tensor. Must be of dtype bool.\n\t * @param b The second input tensor. Must be of dtype bool.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Logical'}\n\t */\n\n\tfunction logicalXor_(a, b) {\n\t  var $a = convertToTensor(a, 'a', 'logicalXor', 'bool');\n\t  var $b = convertToTensor(b, 'b', 'logicalXor', 'bool');\n\t  assertAndGetBroadcastShape($a.shape, $b.shape); // x ^ y = (x | y) & ~(x & y)\n\n\t  return logicalAnd(logicalOr(a, b), logicalNot(logicalAnd(a, b)));\n\t}\n\n\tvar logicalXor = op({\n\t  logicalXor_: logicalXor_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the 2D max pooling of an image.\n\t *\n\t * @param x The input tensor, of rank 4 or rank 3 of shape\n\t *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n\t * @param filterSize The filter size: `[filterHeight, filterWidth]`. If\n\t *     `filterSize` is a single number, then `filterHeight == filterWidth`.\n\t * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If\n\t *     `strides` is a single number, then `strideHeight == strideWidth`.\n\t * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n\t *     in which we sample input values across the height and width dimensions\n\t *     in dilated pooling. Defaults to `[1, 1]`. If `dilations` is a single\n\t *     number, then `dilationHeight == dilationWidth`. If it is greater than\n\t *     1, then all values of `strides` must be 1.\n\t * @param pad The type of padding algorithm.\n\t *    - `same` and stride 1: output will be of same size as input,\n\t *       regardless of filter size.\n\t *    - `valid`: output will be smaller than input if filter is larger\n\t *       than 1x1.\n\t *    - For more info, see this guide:\n\t *     [https://www.tensorflow.org/api_guides/python/nn#Convolution](\n\t *          https://www.tensorflow.org/api_guides/python/nn#Convolution)\n\t * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n\t *     provided, it will default to truncate.\n\t */\n\n\tfunction maxPool_(x, filterSize, strides, pad, dimRoundingMode) {\n\t  var $x = convertToTensor(x, 'x', 'maxPool');\n\t  var dilations = 1;\n\t  var x4D = $x;\n\t  var reshapedTo4D = false;\n\n\t  if ($x.rank === 3) {\n\t    reshapedTo4D = true;\n\t    x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n\t  }\n\n\t  assert(x4D.rank === 4, function () {\n\t    return \"Error in maxPool: input must be rank 4 but got rank \" + x4D.rank + \".\";\n\t  });\n\t  assert(eitherStridesOrDilationsAreOne(strides, dilations), function () {\n\t    return 'Error in maxPool: Either strides or dilations must be 1. ' + (\"Got strides \" + strides + \" and dilations '\" + dilations + \"'\");\n\t  });\n\n\t  if (dimRoundingMode != null) {\n\t    assert(isInt(pad), function () {\n\t      return \"Error in maxPool: pad must be an integer when using, \" + (\"dimRoundingMode \" + dimRoundingMode + \" but got pad \" + pad + \".\");\n\t    });\n\t  }\n\n\t  var inputs = {\n\t    x: x4D\n\t  };\n\t  var attrs = {\n\t    filterSize: filterSize,\n\t    strides: strides,\n\t    pad: pad,\n\t    dimRoundingMode: dimRoundingMode\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var res = ENGINE.runKernel(MaxPool, inputs, attrs);\n\n\t  if (reshapedTo4D) {\n\t    return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n\t  }\n\n\t  return res;\n\t}\n\n\tvar maxPool = op({\n\t  maxPool_: maxPool_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the 3D max pooling.\n\t *\n\t * ```js\n\t * const x = tf.tensor5d([1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 2, 2, 1]);\n\t * const result = tf.maxPool3d(x, 2, 1, 'valid');\n\t * result.print();\n\t * ```\n\t *\n\t * @param x The input tensor, of rank 5 or rank 4 of shape\n\t *     `[batch, depth, height, width, inChannels]`.\n\t * @param filterSize The filter size:\n\t *     `[filterDepth, filterHeight, filterWidth]`.\n\t *     If `filterSize` is a single number,\n\t *     then `filterDepth == filterHeight == filterWidth`.\n\t * @param strides The strides of the pooling:\n\t *     `[strideDepth, strideHeight, strideWidth]`.\n\t *     If `strides` is a single number,\n\t *     then `strideDepth == strideHeight == strideWidth`.\n\t * @param pad The type of padding algorithm.\n\t *    - `same` and stride 1: output will be of same size as input,\n\t *       regardless of filter size.\n\t *    - `valid`: output will be smaller than input if filter is larger\n\t *       than 1*1x1.\n\t *    - For more info, see this guide:\n\t *     [https://www.tensorflow.org/api_guides/python/nn#Convolution](\n\t *          https://www.tensorflow.org/api_guides/python/nn#Convolution)\n\t * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n\t *     provided, it will default to truncate.\n\t * @param dataFormat An optional string from: \"NDHWC\", \"NCDHW\". Defaults to\n\t *     \"NDHWC\". Specify the data format of the input and output data. With the\n\t *     default format \"NDHWC\", the data is stored in the order of: [batch,\n\t *     depth, height, width, channels]. Only \"NDHWC\" is currently supported.\n\t * @param dilations Deprecated, this field will be gone in v3.0.0.\n\t *     The dilation rates: `[dilationDepth, dilationHeight, dilationWidth]`\n\t *     in which we sample input values across the depth, height and width\n\t *     dimensions in dilated pooling.\n\t *     Defaults to `[1, 1, 1]`. If `dilations` is a single number,\n\t *     then `dilationDepth == dilationHeight == dilationWidth`.\n\t *     If it is greater than 1, then all values of `strides` must be 1.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Convolution'}\n\t */\n\n\tfunction maxPool3d_(x, filterSize, strides, pad, dimRoundingMode, dataFormat, dilations) {\n\t  if (filterSize === void 0) {\n\t    filterSize = [1, 1, 1];\n\t  }\n\n\t  if (dataFormat === void 0) {\n\t    dataFormat = 'NDHWC';\n\t  }\n\n\t  if (dilations == null) {\n\t    dilations = [1, 1, 1];\n\t  } else {\n\t    deprecationWarn('dilations is deprecated, this field will be gone in ' + 'v3.0.0.');\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'maxPool3d');\n\t  var x5D = $x;\n\t  var reshapedTo5D = false;\n\n\t  if ($x.rank === 4) {\n\t    reshapedTo5D = true;\n\t    x5D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2], $x.shape[3]]);\n\t  }\n\n\t  assert(x5D.rank === 5, function () {\n\t    return \"Error in maxPool3d: x must be rank 5 but got rank \" + x5D.rank + \".\";\n\t  });\n\t  assert(dataFormat === 'NDHWC', function () {\n\t    return \"Error in maxPool3d: Only NDHWC is currently supported, \" + (\"but got dataFormat of \" + dataFormat);\n\t  });\n\t  assert(eitherStridesOrDilationsAreOne(strides, dilations), function () {\n\t    return 'Error in maxPool3d: Either strides or dilations must be 1. ' + (\"Got strides \" + strides + \" and dilations '\" + dilations + \"'\");\n\t  });\n\n\t  if (dimRoundingMode != null) {\n\t    assert(isInt(pad), function () {\n\t      return \"Error in maxPool3d: pad must be an integer when using, \" + (\"dimRoundingMode \" + dimRoundingMode + \" but got pad \" + pad + \".\");\n\t    });\n\t  }\n\n\t  var inputs = {\n\t    x: x5D\n\t  };\n\t  var attrs = {\n\t    filterSize: filterSize,\n\t    strides: strides,\n\t    pad: pad,\n\t    dimRoundingMode: dimRoundingMode,\n\t    dataFormat: dataFormat,\n\t    dilations: dilations\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var res = ENGINE.runKernel(MaxPool3D, inputs, attrs);\n\n\t  if (reshapedTo5D) {\n\t    return reshape(res, [res.shape[1], res.shape[2], res.shape[3], res.shape[4]]);\n\t  }\n\n\t  return res;\n\t}\n\n\tvar maxPool3d = op({\n\t  maxPool3d_: maxPool3d_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the 2D max pooling of an image with Argmax index.\n\t * The indices in argmax are flattened, so that a maximum value at position `[b,\n\t * y, x, c]` becomes flattened index: `(y * width + x) * channels + c` if\n\t * include_batch_in_index is False; `((b * height + y) * width + x) * channels\n\t * +c` if include_batch_in_index is True.\n\t *\n\t * The indices returned are always in `[0, height) x [0, width)` before\n\t * flattening.\n\t *\n\t * @param x The input tensor, of rank 4 or rank 3 of shape\n\t *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n\t * @param filterSize The filter size: `[filterHeight, filterWidth]`. If\n\t *     `filterSize` is a single number, then `filterHeight == filterWidth`.\n\t * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If\n\t *     `strides` is a single number, then `strideHeight == strideWidth`.\n\t * @param dataFormat An optional string from: \"NDHWC\", \"NCDHW\". Defaults to\n\t *     \"NDHWC\". Specify the data format of the input and output data. With the\n\t *     default format \"NDHWC\", the data is stored in the order of: [batch,\n\t *     depth, height, width, channels]. Only \"NDHWC\" is currently supported.\n\t * @param pad The type of padding algorithm.\n\t *    - `same` and stride 1: output will be of same size as input,\n\t *       regardless of filter size.\n\t *    - `valid`: output will be smaller than input if filter is larger\n\t *       than 1x1.\n\t *    - For more info, see this guide:\n\t *     [https://www.tensorflow.org/api_guides/python/nn#Convolution](\n\t *          https://www.tensorflow.org/api_guides/python/nn#Convolution)\n\t * @param includeBatchIndex Defaults to False. Whether to include batch\n\t *    dimension in flattened index of argmax.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Convolution'}\n\t */\n\n\tfunction maxPoolWithArgmax_(x, filterSize, strides, pad, includeBatchInIndex) {\n\t  if (includeBatchInIndex === void 0) {\n\t    includeBatchInIndex = false;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'maxPoolWithArgmax');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    filterSize: filterSize,\n\t    strides: strides,\n\t    pad: pad,\n\t    includeBatchInIndex: includeBatchInIndex\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var result = ENGINE.runKernel(MaxPoolWithArgmax, inputs, attrs);\n\t  return {\n\t    result: result[0],\n\t    indexes: result[1]\n\t  };\n\t}\n\n\tvar maxPoolWithArgmax = op({\n\t  maxPoolWithArgmax_: maxPoolWithArgmax_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns the max of a and b (`a > b ? a : b`) element-wise.\n\t * Supports broadcasting.\n\t *\n\t * We also expose `tf.maximumStrict` which has the same signature as this op and\n\t * asserts that `a` and `b` are the same shape (does not broadcast).\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 4, 3, 16]);\n\t * const b = tf.tensor1d([1, 2, 9, 4]);\n\t *\n\t * a.maximum(b).print();  // or tf.maximum(a, b)\n\t * ```\n\t *\n\t * ```js\n\t * // Broadcast maximum a with b.\n\t * const a = tf.tensor1d([2, 4, 6, 8]);\n\t * const b = tf.scalar(5);\n\t *\n\t * a.maximum(b).print();  // or tf.maximum(a, b)\n\t * ```\n\t *\n\t * @param a The first tensor.\n\t * @param b The second tensor. Must have the same type as `a`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n\t */\n\n\tfunction maximum_(a, b) {\n\t  var $a = convertToTensor(a, 'a', 'maximum');\n\t  var $b = convertToTensor(b, 'b', 'maximum');\n\n\t  var _makeTypesMatch = makeTypesMatch($a, $b);\n\n\t  $a = _makeTypesMatch[0];\n\t  $b = _makeTypesMatch[1];\n\n\t  if ($a.dtype === 'bool') {\n\t    $a = cast($a, 'int32');\n\t    $b = cast($b, 'int32');\n\t  }\n\n\t  assertAndGetBroadcastShape($a.shape, $b.shape);\n\t  var inputs = {\n\t    a: $a,\n\t    b: $b\n\t  };\n\t  return ENGINE.runKernel(Maximum, inputs);\n\t}\n\n\tvar maximum = op({\n\t  maximum_: maximum_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google Inc. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the mean of elements across dimensions of a `tf.Tensor`.\n\t *\n\t * Reduces `x` along the dimensions given in `axis`. Unless `keepDims` is\n\t * true, the rank of the `tf.Tensor` is reduced by 1 for each entry in `axis`.\n\t * If `keepDims` is true, the reduced dimensions are retained with length 1.\n\t * If `axis` has no entries, all dimensions are reduced, and a `tf.Tensor` with\n\t * a single element is returned.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 3]);\n\t *\n\t * x.mean().print();  // or tf.mean(a)\n\t * ```\n\t *\n\t * ```js\n\t * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n\t *\n\t * const axis = 1;\n\t * x.mean(axis).print();  // or tf.mean(x, axis)\n\t * ```\n\t *\n\t * @param x The input tensor.\n\t * @param axis The dimension(s) to reduce. By default it reduces\n\t *     all dimensions.\n\t * @param keepDims If true, retains reduced dimensions with size 1.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Reduction'}\n\t */\n\n\tfunction mean_(x, axis, keepDims) {\n\t  if (axis === void 0) {\n\t    axis = null;\n\t  }\n\n\t  if (keepDims === void 0) {\n\t    keepDims = false;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'mean');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    axis: axis,\n\t    keepDims: keepDims\n\t  };\n\t  return ENGINE.runKernel(Mean, inputs, attrs);\n\t}\n\n\tvar mean = op({\n\t  mean_: mean_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google Inc. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the minimum value from the input.\n\t *\n\t * Reduces the input along the dimensions given in `axes`. Unless `keepDims`\n\t * is true, the rank of the array is reduced by 1 for each entry in `axes`.\n\t * If `keepDims` is true, the reduced dimensions are retained with length 1.\n\t * If `axes` has no entries, all dimensions are reduced, and an array with a\n\t * single element is returned.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 3]);\n\t *\n\t * x.min().print();  // or tf.min(x)\n\t * ```\n\t *\n\t * ```js\n\t * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n\t *\n\t * const axis = 1;\n\t * x.min(axis).print();  // or tf.min(x, axis)\n\t * ```\n\t *\n\t * @param x The input Tensor.\n\t * @param axis The dimension(s) to reduce. By default it reduces\n\t *     all dimensions.\n\t * @param keepDims If true, retains reduced dimensions with size 1.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Reduction'}\n\t */\n\n\tfunction min_(x, axis, keepDims) {\n\t  if (axis === void 0) {\n\t    axis = null;\n\t  }\n\n\t  if (keepDims === void 0) {\n\t    keepDims = false;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'min');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    axis: axis,\n\t    keepDims: keepDims\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  return ENGINE.runKernel(Min, inputs, attrs);\n\t}\n\n\tvar min$9 = op({\n\t  min_: min_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns the min of a and b (`a < b ? a : b`) element-wise.\n\t * Supports broadcasting.\n\t *\n\t * We also expose `minimumStrict` which has the same signature as this op and\n\t * asserts that `a` and `b` are the same shape (does not broadcast).\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 4, 3, 16]);\n\t * const b = tf.tensor1d([1, 2, 9, 4]);\n\t *\n\t * a.minimum(b).print();  // or tf.minimum(a, b)\n\t * ```\n\t *\n\t * ```js\n\t * // Broadcast minimum a with b.\n\t * const a = tf.tensor1d([2, 4, 6, 8]);\n\t * const b = tf.scalar(5);\n\t *\n\t * a.minimum(b).print();  // or tf.minimum(a, b)\n\t * ```\n\t *\n\t * @param a The first tensor.\n\t * @param b The second tensor. Must have the same type as `a`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n\t */\n\n\tfunction minimum_(a, b) {\n\t  var $a = convertToTensor(a, 'a', 'minimum');\n\t  var $b = convertToTensor(b, 'b', 'minimum');\n\n\t  var _makeTypesMatch = makeTypesMatch($a, $b);\n\n\t  $a = _makeTypesMatch[0];\n\t  $b = _makeTypesMatch[1];\n\n\t  if ($a.dtype === 'bool') {\n\t    $a = cast($a, 'int32');\n\t    $b = cast($b, 'int32');\n\t  }\n\n\t  assertAndGetBroadcastShape($a.shape, $b.shape);\n\t  var inputs = {\n\t    a: $a,\n\t    b: $b\n\t  };\n\t  return ENGINE.runKernel(Minimum, inputs);\n\t}\n\n\tvar minimum = op({\n\t  minimum_: minimum_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Pads a `tf.Tensor` using mirror padding.\n\t *\n\t * This operation implements the `REFLECT` and `SYMMETRIC` modes of pad.\n\t *\n\t * ```js\n\t * const x = tf.range(0, 9).reshape([1, 1, 3, 3]);\n\t * x.mirrorPad([[0, 0], [0, 0], [2, 2], [2, 2]], 'reflect').print();\n\t * ```\n\t * @param x The tensor to pad.\n\t * @param paddings An array of length `R` (the rank of the tensor), where\n\t * each element is a length-2 tuple of ints `[padBefore, padAfter]`,\n\t * specifying how much to pad along each dimension of the tensor.\n\t * In \"reflect\" mode, the padded regions do not include the borders,\n\t * while in \"symmetric\" mode the padded regions do include the borders.\n\t * For example, if the input is `[1, 2, 3]` and paddings is `[0, 2]`,\n\t * then the output is `[1, 2, 3, 2, 1]` in \"reflect\" mode, and\n\t * `[1, 2, 3, 3, 2]` in \"symmetric\" mode.\n\t * If `mode` is \"reflect\" then both `paddings[D, 0]` and `paddings[D, 1]`\n\t * must be no greater than `x.shape[D] - 1`. If mode is \"symmetric\"\n\t * then both `paddings[D, 0]` and `paddings[D, 1]` must be no greater than\n\t * `x.shape[D]`\n\t * @param mode String to specify padding mode. Can be `'reflect' | 'symmetric'`\n\t */\n\n\t/** @doc {heading: 'Tensors', subheading: 'Transformations'} */\n\n\tfunction mirrorPad_(x, paddings, mode) {\n\t  assert(mode === 'reflect' || mode === 'symmetric', function () {\n\t    return \"Invalid mode. Mode must be either reflect or symmetric. \" + (\"Got \" + mode + \".\");\n\t  });\n\t  var $x = convertToTensor(x, 'x', 'mirrorPad');\n\n\t  if ($x.rank === 0) {\n\t    throw new Error('mirrorPad(scalar) is not defined. ' + 'Pass non-scalar to mirrorPad');\n\t  }\n\n\t  assert(paddings.length === $x.rank, function () {\n\t    return \"Padding doesn't match input. Must be \" + $x.rank + \". \" + (\"Got \" + paddings.length + \".\");\n\t  });\n\t  var shapeOffset = mode === 'reflect' ? 1 : 0;\n\n\t  var _loop = function _loop(i) {\n\t    assert(paddings[i].length === 2, function () {\n\t      return \"Invalid number of paddings. Must be length of 2 each.\";\n\t    });\n\t    assert(paddings[i][0] >= 0 && paddings[i][0] <= $x.shape[i] - shapeOffset && paddings[i][1] >= 0 && paddings[i][1] <= $x.shape[i] - shapeOffset, function () {\n\t      return \"Padding in dimension \" + i + \" cannot be greater than or equal \" + (\"to \" + ($x.shape[i] - shapeOffset) + \" or less than 0 for input of \") + (\"shape \" + $x.shape);\n\t    });\n\t  };\n\n\t  for (var i = 0; i < $x.rank; i++) {\n\t    _loop(i);\n\t  }\n\n\t  var attrs = {\n\t    paddings: paddings,\n\t    mode: mode\n\t  };\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(MirrorPad, inputs, attrs);\n\t}\n\n\tvar mirrorPad = op({\n\t  mirrorPad_: mirrorPad_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns the mod of a and b element-wise.\n\t * `floor(x / y) * y + mod(x, y) = x`\n\t * Supports broadcasting.\n\t *\n\t * We also expose `tf.modStrict` which has the same signature as this op and\n\t * asserts that `a` and `b` are the same shape (does not broadcast).\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 4, 3, 16]);\n\t * const b = tf.tensor1d([1, 2, 9, 4]);\n\t *\n\t * a.mod(b).print();  // or tf.mod(a, b)\n\t * ```\n\t *\n\t * ```js\n\t * // Broadcast a mod b.\n\t * const a = tf.tensor1d([2, 4, 6, 8]);\n\t * const b = tf.scalar(5);\n\t *\n\t * a.mod(b).print();  // or tf.mod(a, b)\n\t * ```\n\t *\n\t * @param a The first tensor.\n\t * @param b The second tensor. Must have the same type as `a`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n\t */\n\n\tfunction mod_(a, b) {\n\t  var $a = convertToTensor(a, 'a', 'mod');\n\t  var $b = convertToTensor(b, 'b', 'mod');\n\n\t  var _makeTypesMatch = makeTypesMatch($a, $b);\n\n\t  $a = _makeTypesMatch[0];\n\t  $b = _makeTypesMatch[1];\n\t  var inputs = {\n\t    a: $a,\n\t    b: $b\n\t  };\n\t  return ENGINE.runKernel(Mod, inputs);\n\t}\n\n\tvar mod = op({\n\t  mod_: mod_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes square of `x` element-wise: `x ^ 2`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, Math.sqrt(2), -1]);\n\t *\n\t * x.square().print();  // or tf.square(x)\n\t * ```\n\t * @param x The input Tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction square_(x) {\n\t  var $x = convertToTensor(x, 'x', 'square');\n\t  var attrs = {};\n\t  return ENGINE.runKernel('Square', {\n\t    x: $x\n\t  }, attrs);\n\t}\n\n\tvar square = op({\n\t  square_: square_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Calculates the mean and variance of `x`. The mean and variance are\n\t * calculated by aggregating the contents of `x` across `axes`. If `x` is\n\t * 1-D and `axes = [0]` this is just the mean and variance of a vector.\n\t *\n\t * @param x The input tensor.\n\t * @param axis The dimension(s) along with to compute mean and\n\t *     variance. By default it reduces all dimensions.\n\t * @param keepDims If true, the moments have the same dimensionality as the\n\t *     input.\n\t * @return An object with two keys: `mean` and `variance`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Normalization'}\n\t */\n\n\tfunction moments_(x, axis, keepDims) {\n\t  if (axis === void 0) {\n\t    axis = null;\n\t  }\n\n\t  if (keepDims === void 0) {\n\t    keepDims = false;\n\t  }\n\n\t  x = convertToTensor(x, 'x', 'moments');\n\t  var axes = parseAxisParam(axis, x.shape);\n\t  var xMean = mean(x, axes, keepDims);\n\t  var keepDimsShape = xMean.shape;\n\n\t  if (!keepDims) {\n\t    keepDimsShape = expandShapeToKeepDim(xMean.shape, axes);\n\t  }\n\n\t  var devSquared = square(sub(cast(x, 'float32'), reshape(xMean, keepDimsShape)));\n\t  var variance = mean(devSquared, axes, keepDims);\n\t  return {\n\t    mean: xMean,\n\t    variance: variance\n\t  };\n\t}\n\n\tvar moments = op({\n\t  moments_: moments_\n\t});\n\n\t/**\n\t * Computes the next states and outputs of a stack of LSTMCells.\n\t *\n\t * Each cell output is used as input to the next cell.\n\t *\n\t * Returns `[cellState, cellOutput]`.\n\t *\n\t * Derived from tf.contrib.rn.MultiRNNCell.\n\t *\n\t * @param lstmCells Array of LSTMCell functions.\n\t * @param data The input to the cell.\n\t * @param c Array of previous cell states.\n\t * @param h Array of previous cell outputs.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'RNN'}\n\t */\n\n\tfunction multiRNNCell_(lstmCells, data, c, h) {\n\t  var $data = convertToTensor(data, 'data', 'multiRNNCell');\n\t  var $c = convertToTensorArray(c, 'c', 'multiRNNCell');\n\t  var $h = convertToTensorArray(h, 'h', 'multiRNNCell');\n\t  var input = $data;\n\t  var newStates = [];\n\n\t  for (var i = 0; i < lstmCells.length; i++) {\n\t    var output = lstmCells[i](input, $c[i], $h[i]);\n\t    newStates.push(output[0]);\n\t    newStates.push(output[1]);\n\t    input = output[1];\n\t  }\n\n\t  var newC = [];\n\t  var newH = [];\n\n\t  for (var _i = 0; _i < newStates.length; _i += 2) {\n\t    newC.push(newStates[_i]);\n\t    newH.push(newStates[_i + 1]);\n\t  }\n\n\t  return [newC, newH];\n\t}\n\n\tvar multiRNNCell = op({\n\t  multiRNNCell_: multiRNNCell_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates a `tf.Tensor` with values drawn from a multinomial distribution.\n\t *\n\t * ```js\n\t * const probs = tf.tensor([.75, .25]);\n\t * tf.multinomial(probs, 3).print();\n\t * ```\n\t *\n\t * @param logits 1D array with unnormalized log-probabilities, or\n\t *     2D array of shape `[batchSize, numOutcomes]`. See the `normalized`\n\t *     parameter.\n\t * @param numSamples Number of samples to draw for each row slice.\n\t * @param seed The seed number.\n\t * @param normalized Whether the provided `logits` are normalized true\n\t *     probabilities (sum to 1). Defaults to false.\n\t * @return 1D array of shape `[numSamples]`, or 2D array of shape\n\t *     `[batchSize, numSamples]`, depending on the rank of the input.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Random'}\n\t */\n\n\tfunction multinomial_(logits, numSamples, seed, normalized) {\n\t  if (normalized === void 0) {\n\t    normalized = false;\n\t  }\n\n\t  var $logits = convertToTensor(logits, 'logits', 'multinomial');\n\t  var numOutcomes = $logits.size;\n\t  var origRank = $logits.rank;\n\n\t  if (numOutcomes < 2) {\n\t    throw new Error(\"Error in multinomial: you need at least 2 outcomes, but got \" + (numOutcomes + \".\"));\n\t  }\n\n\t  if (origRank > 2) {\n\t    throw new Error(\"Rank of probabilities must be 1 or 2, but is \" + origRank);\n\t  } // TODO(lina128): Investigate correct seed behavior. The code seems not allow\n\t  // setting see to 0.\n\n\n\t  seed = seed || Math.random(); // The kernel only accepts (and returns) rank 2 tensors.\n\n\t  var logits2D = origRank === 1 ? reshape($logits, [1, -1]) : $logits;\n\t  var inputs = {\n\t    logits: logits2D\n\t  };\n\t  var attrs = {\n\t    numSamples: numSamples,\n\t    seed: seed,\n\t    normalized: normalized\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var res = ENGINE.runKernel(Multinomial, inputs, attrs); // tslint:disable-next-line:no-unnecessary-type-assertion\n\n\t  return origRank === 1 ? reshape(res, [res.size]) : res;\n\t}\n\n\tvar multinomial = op({\n\t  multinomial_: multinomial_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns the truth value of (a != b) element-wise. Supports broadcasting.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 2, 3]);\n\t * const b = tf.tensor1d([0, 2, 3]);\n\t *\n\t * a.notEqual(b).print();\n\t * ```\n\t * @param a The first input tensor.\n\t * @param b The second input tensor. Must have the same dtype as `a`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Logical'}\n\t */\n\n\tfunction notEqual_(a, b) {\n\t  var $a = convertToTensor(a, 'a', 'notEqual');\n\t  var $b = convertToTensor(b, 'b', 'notEqual');\n\n\t  var _makeTypesMatch = makeTypesMatch($a, $b);\n\n\t  $a = _makeTypesMatch[0];\n\t  $b = _makeTypesMatch[1];\n\t  assertAndGetBroadcastShape($a.shape, $b.shape);\n\t  var inputs = {\n\t    a: $a,\n\t    b: $b\n\t  };\n\t  return ENGINE.runKernel(NotEqual, inputs);\n\t}\n\n\tvar notEqual = op({\n\t  notEqual_: notEqual_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates a `tf.Tensor` with all elements set to 0.\n\t *\n\t * ```js\n\t * tf.zeros([2, 2]).print();\n\t * ```\n\t *\n\t * @param shape An array of integers defining the output tensor shape.\n\t * @param dtype The type of an element in the resulting tensor. Can\n\t *     be 'float32', 'int32' or 'bool'. Defaults to 'float'.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction zeros(shape, dtype) {\n\t  if (dtype === void 0) {\n\t    dtype = 'float32';\n\t  }\n\n\t  if (dtype === 'complex64') {\n\t    var real = zeros(shape, 'float32');\n\t    var imag = zeros(shape, 'float32');\n\t    return complex(real, imag);\n\t  }\n\n\t  var values = makeZerosTypedArray(sizeFromShape(shape), dtype);\n\t  return ENGINE.makeTensor(values, shape, dtype);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates a `tf.Tensor` with all elements set to 1.\n\t *\n\t * ```js\n\t * tf.ones([2, 2]).print();\n\t * ```\n\t *\n\t * @param shape An array of integers defining the output tensor shape.\n\t * @param dtype The type of an element in the resulting tensor. Defaults to\n\t *     'float'.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction ones$1(shape, dtype) {\n\t  if (dtype === void 0) {\n\t    dtype = 'float32';\n\t  }\n\n\t  if (dtype === 'complex64') {\n\t    var real = ones$1(shape, 'float32');\n\t    var imag = zeros(shape, 'float32');\n\t    return complex(real, imag);\n\t  }\n\n\t  var values = makeOnesTypedArray(sizeFromShape(shape), dtype);\n\t  return ENGINE.makeTensor(values, shape, dtype);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates a `tf.Tensor` with all elements set to 1 with the same shape as the\n\t * given tensor.\n\t *\n\t * ```js\n\t * const x = tf.tensor([1, 2]);\n\t * tf.onesLike(x).print();\n\t * ```\n\t * @param x A tensor.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction onesLike_(x) {\n\t  var $x = convertToTensor(x, 'x', 'onesLike');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(OnesLike, inputs);\n\t}\n\n\tvar onesLike = op({\n\t  onesLike_: onesLike_\n\t});\n\n\t/**\n\t * Computes the outer product of two vectors, `v1` and `v2`.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 2, 3]);\n\t * const b = tf.tensor1d([3, 4, 5]);\n\t *\n\t * tf.outerProduct(a, b).print();\n\t * ```\n\t * @param v1 The first vector in the outer product operation.\n\t * @param v2 The second vector in the outer product operation.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Matrices'}\n\t */\n\n\tfunction outerProduct_(v1, v2) {\n\t  var $v1 = convertToTensor(v1, 'v1', 'outerProduct');\n\t  var $v2 = convertToTensor(v2, 'v2', 'outerProduct');\n\t  assert($v1.rank === 1 && $v2.rank === 1, function () {\n\t    return \"Error in outerProduct: inputs must be rank 1, but got ranks \" + ($v1.rank + \" and \" + $v2.rank + \".\");\n\t  });\n\t  var v12D = reshape($v1, [-1, 1]);\n\t  var v22D = reshape($v2, [1, -1]);\n\t  return matMul(v12D, v22D);\n\t}\n\n\tvar outerProduct = op({\n\t  outerProduct_: outerProduct_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Pads a `tf.Tensor` with a given value and paddings.\n\t *\n\t * This operation implements `CONSTANT` mode. For `REFLECT` and `SYMMETRIC`,\n\t * refer to `tf.mirrorPad`\n\t *\n\t * Also available are stricter rank-specific methods with the same signature\n\t * as this method that assert that `paddings` is of given length.\n\t *   - `tf.pad1d`\n\t *   - `tf.pad2d`\n\t *   - `tf.pad3d`\n\t *   - `tf.pad4d`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 3, 4]);\n\t * x.pad([[1, 2]]).print();\n\t * ```\n\t * @param x The tensor to pad.\n\t * @param paddings An array of length `R` (the rank of the tensor), where\n\t * each element is a length-2 tuple of ints `[padBefore, padAfter]`,\n\t * specifying how much to pad along each dimension of the tensor.\n\t * @param constantValue The pad value to use. Defaults to 0.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Transformations'}\n\t */\n\n\tfunction pad_(x, paddings, constantValue) {\n\t  if (constantValue === void 0) {\n\t    constantValue = 0;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'pad');\n\n\t  if ($x.rank === 0) {\n\t    throw new Error('pad(scalar) is not defined. Pass non-scalar to pad');\n\t  }\n\n\t  var attrs = {\n\t    paddings: paddings,\n\t    constantValue: constantValue\n\t  };\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(PadV2, inputs, attrs);\n\t}\n\n\tvar pad = op({\n\t  pad_: pad_\n\t});\n\n\t/**\n\t * Pads a `tf.Tensor1D` with a given value and paddings. See `pad` for details.\n\t */\n\n\tfunction pad1d_(x, paddings, constantValue) {\n\t  if (constantValue === void 0) {\n\t    constantValue = 0;\n\t  }\n\n\t  assert(paddings.length === 2, function () {\n\t    return 'Invalid number of paddings. Must be length of 2.';\n\t  });\n\t  return pad(x, [paddings], constantValue);\n\t}\n\n\tvar pad1d = op({\n\t  pad1d_: pad1d_\n\t});\n\n\t/**\n\t * Pads a `tf.Tensor2D` with a given value and paddings. See `pad` for details.\n\t */\n\n\tfunction pad2d_(x, paddings, constantValue) {\n\t  if (constantValue === void 0) {\n\t    constantValue = 0;\n\t  }\n\n\t  assert(paddings.length === 2 && paddings[0].length === 2 && paddings[1].length === 2, function () {\n\t    return 'Invalid number of paddings. Must be length of 2 each.';\n\t  });\n\t  return pad(x, paddings, constantValue);\n\t}\n\n\tvar pad2d = op({\n\t  pad2d_: pad2d_\n\t});\n\n\t/**\n\t * Pads a `tf.Tensor3D` with a given value and paddings. See `pad` for details.\n\t */\n\n\tfunction pad3d_(x, paddings, constantValue) {\n\t  if (constantValue === void 0) {\n\t    constantValue = 0;\n\t  }\n\n\t  assert(paddings.length === 3 && paddings[0].length === 2 && paddings[1].length === 2 && paddings[2].length === 2, function () {\n\t    return 'Invalid number of paddings. Must be length of 2 each.';\n\t  });\n\t  return pad(x, paddings, constantValue);\n\t}\n\n\tvar pad3d = op({\n\t  pad3d_: pad3d_\n\t});\n\n\t/**\n\t * Pads a `tf.Tensor4D` with a given value and paddings. See `pad` for details.\n\t */\n\n\tfunction pad4d_(x, paddings, constantValue) {\n\t  if (constantValue === void 0) {\n\t    constantValue = 0;\n\t  }\n\n\t  assert(paddings.length === 4 && paddings[0].length === 2 && paddings[1].length === 2 && paddings[2].length === 2 && paddings[3].length === 2, function () {\n\t    return 'Invalid number of paddings. Must be length of 2 each.';\n\t  });\n\t  return pad(x, paddings, constantValue);\n\t}\n\n\tvar pad4d = op({\n\t  pad4d_: pad4d_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * This operation divides \"spatial\" dimensions `[1, ..., M]` of the input into\n\t * a grid of blocks of shape `blockShape`, and interleaves these blocks with\n\t * the \"batch\" dimension (0) such that in the output, the spatial\n\t * dimensions `[1, ..., M]` correspond to the position within the grid,\n\t * and the batch dimension combines both the position within a spatial block\n\t * and the original batch position. Prior to division into blocks,\n\t * the spatial dimensions of the input are optionally zero padded\n\t * according to `paddings`. See below for a precise description.\n\t *\n\t * ```js\n\t * const x = tf.tensor4d([1, 2, 3, 4], [1, 2, 2, 1]);\n\t * const blockShape = [2, 2];\n\t * const paddings = [[0, 0], [0, 0]];\n\t *\n\t * x.spaceToBatchND(blockShape, paddings).print();\n\t * ```\n\t *\n\t * @param x A `tf.Tensor`. N-D with `x.shape` = `[batch] + spatialShape +\n\t * remainingShape`, where spatialShape has `M` dimensions.\n\t * @param blockShape A 1-D array. Must have shape `[M]`, all values must\n\t * be >= 1.\n\t * @param paddings A 2-D array. Must have shape `[M, 2]`, all values must be >=\n\t *     0. `paddings[i] = [padStart, padEnd]` specifies the amount to zero-pad\n\t * from input dimension `i + 1`, which corresponds to spatial dimension `i`. It\n\t * is required that\n\t * `(inputShape[i + 1] + padStart + padEnd) % blockShape[i] === 0`\n\t *\n\t * This operation is equivalent to the following steps:\n\t *\n\t * 1. Zero-pad the start and end of dimensions `[1, ..., M]` of the input\n\t * according to `paddings` to produce `padded` of shape paddedShape.\n\t *\n\t * 2. Reshape `padded` to `reshapedPadded` of shape:\n\t * `[batch] + [paddedShape[1] / blockShape[0], blockShape[0], ...,\n\t * paddedShape[M] / blockShape[M-1], blockShape[M-1]] + remainingShape`\n\t *\n\t * 3. Permute dimensions of `reshapedPadded` to produce `permutedReshapedPadded`\n\t * of shape: `blockShape + [batch] + [paddedShape[1] / blockShape[0], ...,\n\t * paddedShape[M] / blockShape[M-1]] + remainingShape`\n\t *\n\t * 4. Reshape `permutedReshapedPadded` to flatten `blockShape` into the\n\t * batch dimension, producing an output tensor of shape:\n\t * `[batch * prod(blockShape)] + [paddedShape[1] / blockShape[0], ...,\n\t * paddedShape[M] / blockShape[M-1]] + remainingShape`\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Transformations'}\n\t */\n\n\tfunction spaceToBatchND_(x, blockShape, paddings) {\n\t  var $x = convertToTensor(x, 'x', 'spaceToBatchND');\n\t  assert($x.rank >= 1 + blockShape.length, function () {\n\t    return \"input rank \" + $x.rank + \" should be > than [blockShape] \" + blockShape.length;\n\t  });\n\t  assert(paddings.length === blockShape.length, function () {\n\t    return \"paddings.shape[0] \" + paddings.length + \" must be equal to [blockShape] \" + blockShape.length;\n\t  });\n\t  assert($x.shape.reduce(function (a, b, i) {\n\t    if (i > 0 && i <= blockShape.length) {\n\t      return a && (b + paddings[i - 1][0] + paddings[i - 1][1]) % blockShape[i - 1] === 0;\n\t    }\n\n\t    return a;\n\t  }, true), function () {\n\t    return \"input spatial dimensions \" + $x.shape.slice(1) + \" with paddings \" + paddings.toString() + \" must be divisible by blockShapes \" + blockShape.toString();\n\t  });\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    blockShape: blockShape,\n\t    paddings: paddings\n\t  };\n\t  return ENGINE.runKernel(SpaceToBatchND, inputs, attrs);\n\t}\n\n\tvar spaceToBatchND = op({\n\t  spaceToBatchND_: spaceToBatchND_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Performs an N-D pooling operation\n\t *\n\t * @param input The input tensor, of rank 4 or rank 3 of shape\n\t *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n\t * @param windowShape The filter size: `[filterHeight, filterWidth]`. If\n\t *     `filterSize` is a single number, then `filterHeight == filterWidth`.\n\t * @param poolingType The type of pooling, either 'max' or 'avg'.\n\t * @param pad The type of padding algorithm:\n\t *    - `same` and stride 1: output will be of same size as input,\n\t *       regardless of filter size.\n\t *    - `valid`: output will be smaller than input if filter is larger\n\t *       than 1x1.\n\t *    - For more info, see this guide:\n\t *     [https://www.tensorflow.org/api_guides/python/nn#Convolution](\n\t *         https://www.tensorflow.org/api_guides/python/nn#Convolution)\n\t * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n\t *     in which we sample input values across the height and width dimensions\n\t *     in dilated pooling. Defaults to `[1, 1]`. If `dilationRate` is a single\n\t *     number, then `dilationHeight == dilationWidth`. If it is greater than\n\t *     1, then all values of `strides` must be 1.\n\t * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If\n\t *     `strides` is a single number, then `strideHeight == strideWidth`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Convolution'}\n\t */\n\n\tfunction pool_(input, windowShape, poolingType, pad, dilations, strides) {\n\t  if (dilations == null) {\n\t    dilations = [1, 1];\n\t  }\n\n\t  if (strides == null) {\n\t    strides = 1;\n\t  }\n\n\t  if (pad === 0) {\n\t    pad = 'valid';\n\t  }\n\n\t  var $x = convertToTensor(input, 'x', 'maxPool');\n\t  var x4D = $x;\n\t  var reshapedTo4D = false;\n\n\t  if ($x.rank === 3) {\n\t    reshapedTo4D = true;\n\t    x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n\t  }\n\n\t  assert(eitherStridesOrDilationsAreOne(strides, dilations), function () {\n\t    return 'Error in pool: Either strides or dilations must be 1. ' + (\"Got strides \" + strides + \" and dilations '\" + dilations + \"'\");\n\t  });\n\t  var convInfo = computePool2DInfo(x4D.shape, windowShape, strides, dilations, pad);\n\t  var dilation = [convInfo.dilationHeight, convInfo.dilationWidth]; // The following implementation does batchToSpace(pool(spaceToBatch(x)))\n\t  // whenever dilation > 1 since the TF kernels do not support dilation > 1.\n\t  // tslint:disable-next-line:max-line-length\n\t  // https://github.com/tensorflow/tensorflow/blob/50f6bb67dc98c9b74630b6047aae7a4f8a40fd02/tensorflow/python/ops/nn_ops.py#L1037\n\n\t  var basePadding;\n\n\t  if (pad === 'same') {\n\t    basePadding = withSpaceToBatchBasePaddings([convInfo.filterHeight, convInfo.filterWidth], dilation);\n\t  } else {\n\t    basePadding = [[0, 0], [0, 0]];\n\t  }\n\n\t  var isDilationOne = dilation[0] === 1 && dilation[1] === 1;\n\n\t  var _requiredSpaceToBatch = requiredSpaceToBatchPaddings([convInfo.inHeight, convInfo.inWidth], dilation, basePadding),\n\t      adjustedPadding = _requiredSpaceToBatch[0],\n\t      adjustedCrops = _requiredSpaceToBatch[1];\n\n\t  var convertedPad = isDilationOne ? pad : 'valid';\n\t  var convertedX = isDilationOne ? x4D : spaceToBatchND(x4D, dilation, adjustedPadding);\n\t  var forwardOp = poolingType === 'avg' ? function () {\n\t    return avgPool(convertedX, windowShape, strides, convertedPad);\n\t  } : function () {\n\t    return maxPool(convertedX, windowShape, strides, convertedPad);\n\t  };\n\t  var y = forwardOp();\n\t  var res = isDilationOne ? y : batchToSpaceND(y, dilation, adjustedCrops);\n\n\t  if (reshapedTo4D) {\n\t    return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n\t  }\n\n\t  return res;\n\t} // Helper function to compute crops and paddings for pool with dilation > 1.\n\t// tslint:disable-next-line:max-line-length\n\t// https://github.com/tensorflow/tensorflow/blob/50f6bb67dc98c9b74630b6047aae7a4f8a40fd02/tensorflow/python/ops/array_ops.py#L2184\n\n\n\tfunction requiredSpaceToBatchPaddings(inputShape, blockShape, basePadding) {\n\t  var padStart = basePadding.map(function (b) {\n\t    return b[0];\n\t  });\n\t  var origPadEnd = basePadding.map(function (b) {\n\t    return b[1];\n\t  });\n\t  var fullInputShape = inputShape.concat(padStart, origPadEnd);\n\t  var padEndExtra = blockShape.map(function (b, i) {\n\t    return (b - fullInputShape[i] % b) % b;\n\t  });\n\t  var padEnd = origPadEnd.map(function (s, i) {\n\t    return s + padEndExtra[i];\n\t  });\n\t  var paddings = blockShape.map(function (_, i) {\n\t    return [padStart[i], padEnd[i]];\n\t  });\n\t  var crops = blockShape.map(function (_, i) {\n\t    return [0, padEndExtra[i]];\n\t  });\n\t  return [paddings, crops];\n\t} // Helper function to compute base paddings for pool with dilation > 1.\n\t// tslint:disable-next-line:max-line-length\n\t// https://github.com/tensorflow/tensorflow/blob/50f6bb67dc98c9b74630b6047aae7a4f8a40fd02/tensorflow/python/ops/nn_ops.py#L524\n\n\n\tfunction withSpaceToBatchBasePaddings(filterShape, dilation) {\n\t  // Spatial dimensions of the filters and the upsampled filters in which we\n\t  // introduce (rate - 1) zeros between consecutive filter values.\n\t  var dilatedFilterShape = filterShape.map(function (s, i) {\n\t    return s + (s - 1) * (dilation[i] - 1);\n\t  });\n\t  var padExtraShape = dilatedFilterShape.map(function (s) {\n\t    return s - 1;\n\t  }); // When padding is odd, we pad more at end, following the same\n\t  // convention as conv2d.\n\n\t  var padExtraStart = padExtraShape.map(function (s) {\n\t    return Math.floor(s / 2);\n\t  });\n\t  var padExtraEnd = padExtraShape.map(function (s, i) {\n\t    return s - padExtraStart[i];\n\t  });\n\t  return padExtraShape.map(function (_, i) {\n\t    return [padExtraStart[i], padExtraEnd[i]];\n\t  });\n\t}\n\n\tvar pool = op({\n\t  pool_: pool_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the power of one `tf.Tensor` to another. Supports broadcasting.\n\t *\n\t * Given a `tf.Tensor` x and a `tf.Tensor` y, this operation computes x^y for\n\t * corresponding elements in x and y. The result's dtype will be the upcasted\n\t * type of the `base` and `exp` dtypes.\n\t *\n\t * ```js\n\t * const a = tf.tensor([[2, 3], [4, 5]])\n\t * const b = tf.tensor([[1, 2], [3, 0]]).toInt();\n\t *\n\t * a.pow(b).print();  // or tf.pow(a, b)\n\t * ```\n\t *\n\t * ```js\n\t * const a = tf.tensor([[1, 2], [3, 4]])\n\t * const b = tf.tensor(2).toInt();\n\t *\n\t * a.pow(b).print();  // or tf.pow(a, b)\n\t * ```\n\t * We also expose `powStrict` which has the same signature as this op and\n\t * asserts that `base` and `exp` are the same shape (does not broadcast).\n\t *\n\t * @param base The base `tf.Tensor` to pow element-wise.\n\t * @param exp The exponent `tf.Tensor` to pow element-wise.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n\t */\n\n\tfunction pow_(base, exp) {\n\t  var $base = convertToTensor(base, 'base', 'pow');\n\t  var $exp = convertToTensor(exp, 'exp', 'pow');\n\n\t  var _makeTypesMatch = makeTypesMatch($base, $exp);\n\n\t  $base = _makeTypesMatch[0];\n\t  $exp = _makeTypesMatch[1];\n\t  var inputs = {\n\t    a: $base,\n\t    b: $exp\n\t  };\n\t  return ENGINE.runKernel(Pow, inputs);\n\t}\n\n\tvar pow$5 = op({\n\t  pow_: pow_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes leaky rectified linear element-wise with parametric alphas.\n\t *\n\t * `x < 0 ? alpha * x : f(x) = x`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([-1, 2, -3, 4]);\n\t * const alpha = tf.scalar(0.1);\n\t *\n\t * x.prelu(alpha).print();  // or tf.prelu(x, alpha)\n\t * ```\n\t * @param x The input tensor.\n\t * @param alpha Scaling factor for negative values.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction prelu_(x, alpha) {\n\t  var $x = convertToTensor(x, 'x', 'prelu');\n\t  var $alpha = convertToTensor(alpha, 'alpha', 'prelu');\n\t  var inputs = {\n\t    x: $x,\n\t    alpha: $alpha\n\t  };\n\t  return ENGINE.runKernel(Prelu, inputs);\n\t}\n\n\tvar prelu = op({\n\t  prelu_: prelu_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the product of elements across dimensions of a `tf.Tensor`.\n\t *\n\t * Reduces the input along the dimensions given in `axes`. Unless `keepDims`\n\t * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in\n\t * `axes`. If `keepDims` is true, the reduced dimensions are retained with\n\t * length 1. If `axes` has no entries, all dimensions are reduced, and a\n\t * `tf.Tensor` with a single element is returned.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 3]);\n\t *\n\t * x.prod().print();  // or tf.prod(x)\n\t * ```\n\t *\n\t * ```js\n\t * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n\t *\n\t * const axis = 1;\n\t * x.prod(axis).print();  // or tf.prod(x, axis)\n\t * ```\n\t *\n\t * @param x The input tensor to compute the product over. If the dtype is `bool`\n\t *   it will be converted to `int32` and the output dtype will be `int32`.\n\t * @param axis The dimension(s) to reduce. By default it reduces\n\t *     all dimensions.\n\t * @param keepDims If true, retains reduced dimensions with size 1.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Reduction'}\n\t */\n\n\tfunction prod_(x, axis, keepDims) {\n\t  if (axis === void 0) {\n\t    axis = null;\n\t  }\n\n\t  if (keepDims === void 0) {\n\t    keepDims = false;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'prod');\n\n\t  if ($x.dtype === 'bool') {\n\t    // bool is not an allowed type for the underlying kernel.\n\t    $x = cast($x, 'int32');\n\t  }\n\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    axis: axis,\n\t    keepDims: keepDims\n\t  };\n\t  return ENGINE.runKernel(Prod, inputs, attrs);\n\t}\n\n\tvar prod = op({\n\t  prod_: prod_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates a `tf.Tensor` with values sampled from a random number generator\n\t * function defined by the user.\n\t *\n\t * @param shape An array of integers defining the output tensor shape.\n\t * @param randFunction A random number generator function which is called\n\t * for each element in the output tensor.\n\t * @param dtype The data type of the output tensor. Defaults to 'float32'.\n\t */\n\n\tfunction rand_(shape, randFunction, dtype) {\n\t  var size = sizeFromShape(shape);\n\t  var values = null;\n\n\t  if (dtype == null || dtype === 'float32') {\n\t    values = new Float32Array(size);\n\t  } else if (dtype === 'int32') {\n\t    values = new Int32Array(size);\n\t  } else if (dtype === 'bool') {\n\t    values = new Uint8Array(size);\n\t  } else {\n\t    throw new Error(\"Unknown data type \" + dtype);\n\t  }\n\n\t  for (var i = 0; i < size; i++) {\n\t    values[i] = randFunction();\n\t  }\n\n\t  return ENGINE.makeTensor(values, shape, dtype);\n\t}\n\n\tvar rand = op({\n\t  rand_: rand_\n\t});\n\n\tvar alea = createCommonjsModule(function (module) {\n\t  // A port of an algorithm by Johannes Baagøe <baagoe@baagoe.com>, 2010\n\t  // http://baagoe.com/en/RandomMusings/javascript/\n\t  // https://github.com/nquinlan/better-random-numbers-for-javascript-mirror\n\t  // Original work is under MIT license -\n\t  // Copyright (C) 2010 by Johannes Baagøe <baagoe@baagoe.org>\n\t  //\n\t  // Permission is hereby granted, free of charge, to any person obtaining a copy\n\t  // of this software and associated documentation files (the \"Software\"), to deal\n\t  // in the Software without restriction, including without limitation the rights\n\t  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\t  // copies of the Software, and to permit persons to whom the Software is\n\t  // furnished to do so, subject to the following conditions:\n\t  // \n\t  // The above copyright notice and this permission notice shall be included in\n\t  // all copies or substantial portions of the Software.\n\t  // \n\t  // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\t  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\t  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\t  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\t  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\t  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n\t  // THE SOFTWARE.\n\t  (function (global, module, define) {\n\t    function Alea(seed) {\n\t      var me = this,\n\t          mash = Mash();\n\n\t      me.next = function () {\n\t        var t = 2091639 * me.s0 + me.c * 2.3283064365386963e-10; // 2^-32\n\n\t        me.s0 = me.s1;\n\t        me.s1 = me.s2;\n\t        return me.s2 = t - (me.c = t | 0);\n\t      }; // Apply the seeding algorithm from Baagoe.\n\n\n\t      me.c = 1;\n\t      me.s0 = mash(' ');\n\t      me.s1 = mash(' ');\n\t      me.s2 = mash(' ');\n\t      me.s0 -= mash(seed);\n\n\t      if (me.s0 < 0) {\n\t        me.s0 += 1;\n\t      }\n\n\t      me.s1 -= mash(seed);\n\n\t      if (me.s1 < 0) {\n\t        me.s1 += 1;\n\t      }\n\n\t      me.s2 -= mash(seed);\n\n\t      if (me.s2 < 0) {\n\t        me.s2 += 1;\n\t      }\n\n\t      mash = null;\n\t    }\n\n\t    function copy(f, t) {\n\t      t.c = f.c;\n\t      t.s0 = f.s0;\n\t      t.s1 = f.s1;\n\t      t.s2 = f.s2;\n\t      return t;\n\t    }\n\n\t    function impl(seed, opts) {\n\t      var xg = new Alea(seed),\n\t          state = opts && opts.state,\n\t          prng = xg.next;\n\n\t      prng.int32 = function () {\n\t        return xg.next() * 0x100000000 | 0;\n\t      };\n\n\t      prng.double = function () {\n\t        return prng() + (prng() * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53\n\t      };\n\n\t      prng.quick = prng;\n\n\t      if (state) {\n\t        if (typeof state == 'object') copy(state, xg);\n\n\t        prng.state = function () {\n\t          return copy(xg, {});\n\t        };\n\t      }\n\n\t      return prng;\n\t    }\n\n\t    function Mash() {\n\t      var n = 0xefc8249d;\n\n\t      var mash = function mash(data) {\n\t        data = data.toString();\n\n\t        for (var i = 0; i < data.length; i++) {\n\t          n += data.charCodeAt(i);\n\t          var h = 0.02519603282416938 * n;\n\t          n = h >>> 0;\n\t          h -= n;\n\t          h *= n;\n\t          n = h >>> 0;\n\t          h -= n;\n\t          n += h * 0x100000000; // 2^32\n\t        }\n\n\t        return (n >>> 0) * 2.3283064365386963e-10; // 2^-32\n\t      };\n\n\t      return mash;\n\t    }\n\n\t    if (module && module.exports) {\n\t      module.exports = impl;\n\t    } else if (define && define.amd) {\n\t      define(function () {\n\t        return impl;\n\t      });\n\t    } else {\n\t      this.alea = impl;\n\t    }\n\t  })(commonjsGlobal, 'object' == 'object' && module, // present in node.js\n\t  typeof undefined == 'function' && undefined // present with an AMD loader\n\t  );\n\t});\n\n\tvar xor128 = createCommonjsModule(function (module) {\n\t  // A Javascript implementaion of the \"xor128\" prng algorithm by\n\t  // George Marsaglia.  See http://www.jstatsoft.org/v08/i14/paper\n\t  (function (global, module, define) {\n\t    function XorGen(seed) {\n\t      var me = this,\n\t          strseed = '';\n\t      me.x = 0;\n\t      me.y = 0;\n\t      me.z = 0;\n\t      me.w = 0; // Set up generator function.\n\n\t      me.next = function () {\n\t        var t = me.x ^ me.x << 11;\n\t        me.x = me.y;\n\t        me.y = me.z;\n\t        me.z = me.w;\n\t        return me.w ^= me.w >>> 19 ^ t ^ t >>> 8;\n\t      };\n\n\t      if (seed === (seed | 0)) {\n\t        // Integer seed.\n\t        me.x = seed;\n\t      } else {\n\t        // String seed.\n\t        strseed += seed;\n\t      } // Mix in string seed, then discard an initial batch of 64 values.\n\n\n\t      for (var k = 0; k < strseed.length + 64; k++) {\n\t        me.x ^= strseed.charCodeAt(k) | 0;\n\t        me.next();\n\t      }\n\t    }\n\n\t    function copy(f, t) {\n\t      t.x = f.x;\n\t      t.y = f.y;\n\t      t.z = f.z;\n\t      t.w = f.w;\n\t      return t;\n\t    }\n\n\t    function impl(seed, opts) {\n\t      var xg = new XorGen(seed),\n\t          state = opts && opts.state,\n\t          prng = function prng() {\n\t        return (xg.next() >>> 0) / 0x100000000;\n\t      };\n\n\t      prng.double = function () {\n\t        do {\n\t          var top = xg.next() >>> 11,\n\t              bot = (xg.next() >>> 0) / 0x100000000,\n\t              result = (top + bot) / (1 << 21);\n\t        } while (result === 0);\n\n\t        return result;\n\t      };\n\n\t      prng.int32 = xg.next;\n\t      prng.quick = prng;\n\n\t      if (state) {\n\t        if (typeof state == 'object') copy(state, xg);\n\n\t        prng.state = function () {\n\t          return copy(xg, {});\n\t        };\n\t      }\n\n\t      return prng;\n\t    }\n\n\t    if (module && module.exports) {\n\t      module.exports = impl;\n\t    } else if (define && define.amd) {\n\t      define(function () {\n\t        return impl;\n\t      });\n\t    } else {\n\t      this.xor128 = impl;\n\t    }\n\t  })(commonjsGlobal, 'object' == 'object' && module, // present in node.js\n\t  typeof undefined == 'function' && undefined // present with an AMD loader\n\t  );\n\t});\n\n\tvar xorwow = createCommonjsModule(function (module) {\n\t  // A Javascript implementaion of the \"xorwow\" prng algorithm by\n\t  // George Marsaglia.  See http://www.jstatsoft.org/v08/i14/paper\n\t  (function (global, module, define) {\n\t    function XorGen(seed) {\n\t      var me = this,\n\t          strseed = ''; // Set up generator function.\n\n\t      me.next = function () {\n\t        var t = me.x ^ me.x >>> 2;\n\t        me.x = me.y;\n\t        me.y = me.z;\n\t        me.z = me.w;\n\t        me.w = me.v;\n\t        return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0;\n\t      };\n\n\t      me.x = 0;\n\t      me.y = 0;\n\t      me.z = 0;\n\t      me.w = 0;\n\t      me.v = 0;\n\n\t      if (seed === (seed | 0)) {\n\t        // Integer seed.\n\t        me.x = seed;\n\t      } else {\n\t        // String seed.\n\t        strseed += seed;\n\t      } // Mix in string seed, then discard an initial batch of 64 values.\n\n\n\t      for (var k = 0; k < strseed.length + 64; k++) {\n\t        me.x ^= strseed.charCodeAt(k) | 0;\n\n\t        if (k == strseed.length) {\n\t          me.d = me.x << 10 ^ me.x >>> 4;\n\t        }\n\n\t        me.next();\n\t      }\n\t    }\n\n\t    function copy(f, t) {\n\t      t.x = f.x;\n\t      t.y = f.y;\n\t      t.z = f.z;\n\t      t.w = f.w;\n\t      t.v = f.v;\n\t      t.d = f.d;\n\t      return t;\n\t    }\n\n\t    function impl(seed, opts) {\n\t      var xg = new XorGen(seed),\n\t          state = opts && opts.state,\n\t          prng = function prng() {\n\t        return (xg.next() >>> 0) / 0x100000000;\n\t      };\n\n\t      prng.double = function () {\n\t        do {\n\t          var top = xg.next() >>> 11,\n\t              bot = (xg.next() >>> 0) / 0x100000000,\n\t              result = (top + bot) / (1 << 21);\n\t        } while (result === 0);\n\n\t        return result;\n\t      };\n\n\t      prng.int32 = xg.next;\n\t      prng.quick = prng;\n\n\t      if (state) {\n\t        if (typeof state == 'object') copy(state, xg);\n\n\t        prng.state = function () {\n\t          return copy(xg, {});\n\t        };\n\t      }\n\n\t      return prng;\n\t    }\n\n\t    if (module && module.exports) {\n\t      module.exports = impl;\n\t    } else if (define && define.amd) {\n\t      define(function () {\n\t        return impl;\n\t      });\n\t    } else {\n\t      this.xorwow = impl;\n\t    }\n\t  })(commonjsGlobal, 'object' == 'object' && module, // present in node.js\n\t  typeof undefined == 'function' && undefined // present with an AMD loader\n\t  );\n\t});\n\n\tvar xorshift7 = createCommonjsModule(function (module) {\n\t  // A Javascript implementaion of the \"xorshift7\" algorithm by\n\t  // François Panneton and Pierre L'ecuyer:\n\t  // \"On the Xorgshift Random Number Generators\"\n\t  // http://saluc.engr.uconn.edu/refs/crypto/rng/panneton05onthexorshift.pdf\n\t  (function (global, module, define) {\n\t    function XorGen(seed) {\n\t      var me = this; // Set up generator function.\n\n\t      me.next = function () {\n\t        // Update xor generator.\n\t        var X = me.x,\n\t            i = me.i,\n\t            t,\n\t            v,\n\t            w;\n\t        t = X[i];\n\t        t ^= t >>> 7;\n\t        v = t ^ t << 24;\n\t        t = X[i + 1 & 7];\n\t        v ^= t ^ t >>> 10;\n\t        t = X[i + 3 & 7];\n\t        v ^= t ^ t >>> 3;\n\t        t = X[i + 4 & 7];\n\t        v ^= t ^ t << 7;\n\t        t = X[i + 7 & 7];\n\t        t = t ^ t << 13;\n\t        v ^= t ^ t << 9;\n\t        X[i] = v;\n\t        me.i = i + 1 & 7;\n\t        return v;\n\t      };\n\n\t      function init(me, seed) {\n\t        var j,\n\t            w,\n\t            X = [];\n\n\t        if (seed === (seed | 0)) {\n\t          // Seed state array using a 32-bit integer.\n\t          w = X[0] = seed;\n\t        } else {\n\t          // Seed state using a string.\n\t          seed = '' + seed;\n\n\t          for (j = 0; j < seed.length; ++j) {\n\t            X[j & 7] = X[j & 7] << 15 ^ seed.charCodeAt(j) + X[j + 1 & 7] << 13;\n\t          }\n\t        } // Enforce an array length of 8, not all zeroes.\n\n\n\t        while (X.length < 8) {\n\t          X.push(0);\n\t        }\n\n\t        for (j = 0; j < 8 && X[j] === 0; ++j) {\n\t          ;\n\t        }\n\n\t        if (j == 8) w = X[7] = -1;else w = X[j];\n\t        me.x = X;\n\t        me.i = 0; // Discard an initial 256 values.\n\n\t        for (j = 256; j > 0; --j) {\n\t          me.next();\n\t        }\n\t      }\n\n\t      init(me, seed);\n\t    }\n\n\t    function copy(f, t) {\n\t      t.x = f.x.slice();\n\t      t.i = f.i;\n\t      return t;\n\t    }\n\n\t    function impl(seed, opts) {\n\t      if (seed == null) seed = +new Date();\n\n\t      var xg = new XorGen(seed),\n\t          state = opts && opts.state,\n\t          prng = function prng() {\n\t        return (xg.next() >>> 0) / 0x100000000;\n\t      };\n\n\t      prng.double = function () {\n\t        do {\n\t          var top = xg.next() >>> 11,\n\t              bot = (xg.next() >>> 0) / 0x100000000,\n\t              result = (top + bot) / (1 << 21);\n\t        } while (result === 0);\n\n\t        return result;\n\t      };\n\n\t      prng.int32 = xg.next;\n\t      prng.quick = prng;\n\n\t      if (state) {\n\t        if (state.x) copy(state, xg);\n\n\t        prng.state = function () {\n\t          return copy(xg, {});\n\t        };\n\t      }\n\n\t      return prng;\n\t    }\n\n\t    if (module && module.exports) {\n\t      module.exports = impl;\n\t    } else if (define && define.amd) {\n\t      define(function () {\n\t        return impl;\n\t      });\n\t    } else {\n\t      this.xorshift7 = impl;\n\t    }\n\t  })(commonjsGlobal, 'object' == 'object' && module, // present in node.js\n\t  typeof undefined == 'function' && undefined // present with an AMD loader\n\t  );\n\t});\n\n\tvar xor4096 = createCommonjsModule(function (module) {\n\t  // A Javascript implementaion of Richard Brent's Xorgens xor4096 algorithm.\n\t  //\n\t  // This fast non-cryptographic random number generator is designed for\n\t  // use in Monte-Carlo algorithms. It combines a long-period xorshift\n\t  // generator with a Weyl generator, and it passes all common batteries\n\t  // of stasticial tests for randomness while consuming only a few nanoseconds\n\t  // for each prng generated.  For background on the generator, see Brent's\n\t  // paper: \"Some long-period random number generators using shifts and xors.\"\n\t  // http://arxiv.org/pdf/1004.3115v1.pdf\n\t  //\n\t  // Usage:\n\t  //\n\t  // var xor4096 = require('xor4096');\n\t  // random = xor4096(1);                        // Seed with int32 or string.\n\t  // assert.equal(random(), 0.1520436450538547); // (0, 1) range, 53 bits.\n\t  // assert.equal(random.int32(), 1806534897);   // signed int32, 32 bits.\n\t  //\n\t  // For nonzero numeric keys, this impelementation provides a sequence\n\t  // identical to that by Brent's xorgens 3 implementaion in C.  This\n\t  // implementation also provides for initalizing the generator with\n\t  // string seeds, or for saving and restoring the state of the generator.\n\t  //\n\t  // On Chrome, this prng benchmarks about 2.1 times slower than\n\t  // Javascript's built-in Math.random().\n\t  (function (global, module, define) {\n\t    function XorGen(seed) {\n\t      var me = this; // Set up generator function.\n\n\t      me.next = function () {\n\t        var w = me.w,\n\t            X = me.X,\n\t            i = me.i,\n\t            t,\n\t            v; // Update Weyl generator.\n\n\t        me.w = w = w + 0x61c88647 | 0; // Update xor generator.\n\n\t        v = X[i + 34 & 127];\n\t        t = X[i = i + 1 & 127];\n\t        v ^= v << 13;\n\t        t ^= t << 17;\n\t        v ^= v >>> 15;\n\t        t ^= t >>> 12; // Update Xor generator array state.\n\n\t        v = X[i] = v ^ t;\n\t        me.i = i; // Result is the combination.\n\n\t        return v + (w ^ w >>> 16) | 0;\n\t      };\n\n\t      function init(me, seed) {\n\t        var t,\n\t            v,\n\t            i,\n\t            j,\n\t            w,\n\t            X = [],\n\t            limit = 128;\n\n\t        if (seed === (seed | 0)) {\n\t          // Numeric seeds initialize v, which is used to generates X.\n\t          v = seed;\n\t          seed = null;\n\t        } else {\n\t          // String seeds are mixed into v and X one character at a time.\n\t          seed = seed + '\\0';\n\t          v = 0;\n\t          limit = Math.max(limit, seed.length);\n\t        } // Initialize circular array and weyl value.\n\n\n\t        for (i = 0, j = -32; j < limit; ++j) {\n\t          // Put the unicode characters into the array, and shuffle them.\n\t          if (seed) v ^= seed.charCodeAt((j + 32) % seed.length); // After 32 shuffles, take v as the starting w value.\n\n\t          if (j === 0) w = v;\n\t          v ^= v << 10;\n\t          v ^= v >>> 15;\n\t          v ^= v << 4;\n\t          v ^= v >>> 13;\n\n\t          if (j >= 0) {\n\t            w = w + 0x61c88647 | 0; // Weyl.\n\n\t            t = X[j & 127] ^= v + w; // Combine xor and weyl to init array.\n\n\t            i = 0 == t ? i + 1 : 0; // Count zeroes.\n\t          }\n\t        } // We have detected all zeroes; make the key nonzero.\n\n\n\t        if (i >= 128) {\n\t          X[(seed && seed.length || 0) & 127] = -1;\n\t        } // Run the generator 512 times to further mix the state before using it.\n\t        // Factoring this as a function slows the main generator, so it is just\n\t        // unrolled here.  The weyl generator is not advanced while warming up.\n\n\n\t        i = 127;\n\n\t        for (j = 4 * 128; j > 0; --j) {\n\t          v = X[i + 34 & 127];\n\t          t = X[i = i + 1 & 127];\n\t          v ^= v << 13;\n\t          t ^= t << 17;\n\t          v ^= v >>> 15;\n\t          t ^= t >>> 12;\n\t          X[i] = v ^ t;\n\t        } // Storing state as object members is faster than using closure variables.\n\n\n\t        me.w = w;\n\t        me.X = X;\n\t        me.i = i;\n\t      }\n\n\t      init(me, seed);\n\t    }\n\n\t    function copy(f, t) {\n\t      t.i = f.i;\n\t      t.w = f.w;\n\t      t.X = f.X.slice();\n\t      return t;\n\t    }\n\n\t    ;\n\n\t    function impl(seed, opts) {\n\t      if (seed == null) seed = +new Date();\n\n\t      var xg = new XorGen(seed),\n\t          state = opts && opts.state,\n\t          prng = function prng() {\n\t        return (xg.next() >>> 0) / 0x100000000;\n\t      };\n\n\t      prng.double = function () {\n\t        do {\n\t          var top = xg.next() >>> 11,\n\t              bot = (xg.next() >>> 0) / 0x100000000,\n\t              result = (top + bot) / (1 << 21);\n\t        } while (result === 0);\n\n\t        return result;\n\t      };\n\n\t      prng.int32 = xg.next;\n\t      prng.quick = prng;\n\n\t      if (state) {\n\t        if (state.X) copy(state, xg);\n\n\t        prng.state = function () {\n\t          return copy(xg, {});\n\t        };\n\t      }\n\n\t      return prng;\n\t    }\n\n\t    if (module && module.exports) {\n\t      module.exports = impl;\n\t    } else if (define && define.amd) {\n\t      define(function () {\n\t        return impl;\n\t      });\n\t    } else {\n\t      this.xor4096 = impl;\n\t    }\n\t  })(commonjsGlobal, // window object or global\n\t  'object' == 'object' && module, // present in node.js\n\t  typeof undefined == 'function' && undefined // present with an AMD loader\n\t  );\n\t});\n\n\tvar tychei = createCommonjsModule(function (module) {\n\t  // A Javascript implementaion of the \"Tyche-i\" prng algorithm by\n\t  // Samuel Neves and Filipe Araujo.\n\t  // See https://eden.dei.uc.pt/~sneves/pubs/2011-snfa2.pdf\n\t  (function (global, module, define) {\n\t    function XorGen(seed) {\n\t      var me = this,\n\t          strseed = ''; // Set up generator function.\n\n\t      me.next = function () {\n\t        var b = me.b,\n\t            c = me.c,\n\t            d = me.d,\n\t            a = me.a;\n\t        b = b << 25 ^ b >>> 7 ^ c;\n\t        c = c - d | 0;\n\t        d = d << 24 ^ d >>> 8 ^ a;\n\t        a = a - b | 0;\n\t        me.b = b = b << 20 ^ b >>> 12 ^ c;\n\t        me.c = c = c - d | 0;\n\t        me.d = d << 16 ^ c >>> 16 ^ a;\n\t        return me.a = a - b | 0;\n\t      };\n\t      /* The following is non-inverted tyche, which has better internal\n\t       * bit diffusion, but which is about 25% slower than tyche-i in JS.\n\t      me.next = function() {\n\t        var a = me.a, b = me.b, c = me.c, d = me.d;\n\t        a = (me.a + me.b | 0) >>> 0;\n\t        d = me.d ^ a; d = d << 16 ^ d >>> 16;\n\t        c = me.c + d | 0;\n\t        b = me.b ^ c; b = b << 12 ^ d >>> 20;\n\t        me.a = a = a + b | 0;\n\t        d = d ^ a; me.d = d = d << 8 ^ d >>> 24;\n\t        me.c = c = c + d | 0;\n\t        b = b ^ c;\n\t        return me.b = (b << 7 ^ b >>> 25);\n\t      }\n\t      */\n\n\n\t      me.a = 0;\n\t      me.b = 0;\n\t      me.c = 2654435769 | 0;\n\t      me.d = 1367130551;\n\n\t      if (seed === Math.floor(seed)) {\n\t        // Integer seed.\n\t        me.a = seed / 0x100000000 | 0;\n\t        me.b = seed | 0;\n\t      } else {\n\t        // String seed.\n\t        strseed += seed;\n\t      } // Mix in string seed, then discard an initial batch of 64 values.\n\n\n\t      for (var k = 0; k < strseed.length + 20; k++) {\n\t        me.b ^= strseed.charCodeAt(k) | 0;\n\t        me.next();\n\t      }\n\t    }\n\n\t    function copy(f, t) {\n\t      t.a = f.a;\n\t      t.b = f.b;\n\t      t.c = f.c;\n\t      t.d = f.d;\n\t      return t;\n\t    }\n\n\t    ;\n\n\t    function impl(seed, opts) {\n\t      var xg = new XorGen(seed),\n\t          state = opts && opts.state,\n\t          prng = function prng() {\n\t        return (xg.next() >>> 0) / 0x100000000;\n\t      };\n\n\t      prng.double = function () {\n\t        do {\n\t          var top = xg.next() >>> 11,\n\t              bot = (xg.next() >>> 0) / 0x100000000,\n\t              result = (top + bot) / (1 << 21);\n\t        } while (result === 0);\n\n\t        return result;\n\t      };\n\n\t      prng.int32 = xg.next;\n\t      prng.quick = prng;\n\n\t      if (state) {\n\t        if (typeof state == 'object') copy(state, xg);\n\n\t        prng.state = function () {\n\t          return copy(xg, {});\n\t        };\n\t      }\n\n\t      return prng;\n\t    }\n\n\t    if (module && module.exports) {\n\t      module.exports = impl;\n\t    } else if (define && define.amd) {\n\t      define(function () {\n\t        return impl;\n\t      });\n\t    } else {\n\t      this.tychei = impl;\n\t    }\n\t  })(commonjsGlobal, 'object' == 'object' && module, // present in node.js\n\t  typeof undefined == 'function' && undefined // present with an AMD loader\n\t  );\n\t});\n\n\tvar seedrandom = createCommonjsModule(function (module) {\n\t  /*\n\t  Copyright 2014 David Bau.\n\t  \n\t  Permission is hereby granted, free of charge, to any person obtaining\n\t  a copy of this software and associated documentation files (the\n\t  \"Software\"), to deal in the Software without restriction, including\n\t  without limitation the rights to use, copy, modify, merge, publish,\n\t  distribute, sublicense, and/or sell copies of the Software, and to\n\t  permit persons to whom the Software is furnished to do so, subject to\n\t  the following conditions:\n\t  \n\t  The above copyright notice and this permission notice shall be\n\t  included in all copies or substantial portions of the Software.\n\t  \n\t  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n\t  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n\t  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n\t  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n\t  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n\t  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n\t  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\t  \n\t  */\n\t  (function (pool, math) {\n\t    //\n\t    // The following constants are related to IEEE 754 limits.\n\t    //\n\t    var global = this,\n\t        width = 256,\n\t        // each RC4 output is 0 <= x < 256\n\t    chunks = 6,\n\t        // at least six RC4 outputs for each double\n\t    digits = 52,\n\t        // there are 52 significant digits in a double\n\t    rngname = 'random',\n\t        // rngname: name for Math.random and Math.seedrandom\n\t    startdenom = math.pow(width, chunks),\n\t        significance = math.pow(2, digits),\n\t        overflow = significance * 2,\n\t        mask = width - 1,\n\t        nodecrypto; // node.js crypto module, initialized at the bottom.\n\t    //\n\t    // seedrandom()\n\t    // This is the seedrandom function described above.\n\t    //\n\n\t    function seedrandom(seed, options, callback) {\n\t      var key = [];\n\t      options = options == true ? {\n\t        entropy: true\n\t      } : options || {}; // Flatten the seed string or build one from local entropy if needed.\n\n\t      var shortseed = mixkey(flatten(options.entropy ? [seed, tostring(pool)] : seed == null ? autoseed() : seed, 3), key); // Use the seed to initialize an ARC4 generator.\n\n\t      var arc4 = new ARC4(key); // This function returns a random double in [0, 1) that contains\n\t      // randomness in every bit of the mantissa of the IEEE 754 value.\n\n\t      var prng = function prng() {\n\t        var n = arc4.g(chunks),\n\t            // Start with a numerator n < 2 ^ 48\n\t        d = startdenom,\n\t            //   and denominator d = 2 ^ 48.\n\t        x = 0; //   and no 'extra last byte'.\n\n\t        while (n < significance) {\n\t          // Fill up all significant digits by\n\t          n = (n + x) * width; //   shifting numerator and\n\n\t          d *= width; //   denominator and generating a\n\n\t          x = arc4.g(1); //   new least-significant-byte.\n\t        }\n\n\t        while (n >= overflow) {\n\t          // To avoid rounding up, before adding\n\t          n /= 2; //   last byte, shift everything\n\n\t          d /= 2; //   right using integer math until\n\n\t          x >>>= 1; //   we have exactly the desired bits.\n\t        }\n\n\t        return (n + x) / d; // Form the number within [0, 1).\n\t      };\n\n\t      prng.int32 = function () {\n\t        return arc4.g(4) | 0;\n\t      };\n\n\t      prng.quick = function () {\n\t        return arc4.g(4) / 0x100000000;\n\t      };\n\n\t      prng.double = prng; // Mix the randomness into accumulated entropy.\n\n\t      mixkey(tostring(arc4.S), pool); // Calling convention: what to return as a function of prng, seed, is_math.\n\n\t      return (options.pass || callback || function (prng, seed, is_math_call, state) {\n\t        if (state) {\n\t          // Load the arc4 state from the given state if it has an S array.\n\t          if (state.S) {\n\t            copy(state, arc4);\n\t          } // Only provide the .state method if requested via options.state.\n\n\n\t          prng.state = function () {\n\t            return copy(arc4, {});\n\t          };\n\t        } // If called as a method of Math (Math.seedrandom()), mutate\n\t        // Math.random because that is how seedrandom.js has worked since v1.0.\n\n\n\t        if (is_math_call) {\n\t          math[rngname] = prng;\n\t          return seed;\n\t        } // Otherwise, it is a newer calling convention, so return the\n\t        // prng directly.\n\t        else return prng;\n\t      })(prng, shortseed, 'global' in options ? options.global : this == math, options.state);\n\t    }\n\n\t    math['seed' + rngname] = seedrandom; //\n\t    // ARC4\n\t    //\n\t    // An ARC4 implementation.  The constructor takes a key in the form of\n\t    // an array of at most (width) integers that should be 0 <= x < (width).\n\t    //\n\t    // The g(count) method returns a pseudorandom integer that concatenates\n\t    // the next (count) outputs from ARC4.  Its return value is a number x\n\t    // that is in the range 0 <= x < (width ^ count).\n\t    //\n\n\t    function ARC4(key) {\n\t      var t,\n\t          keylen = key.length,\n\t          me = this,\n\t          i = 0,\n\t          j = me.i = me.j = 0,\n\t          s = me.S = []; // The empty key [] is treated as [0].\n\n\t      if (!keylen) {\n\t        key = [keylen++];\n\t      } // Set up S using the standard key scheduling algorithm.\n\n\n\t      while (i < width) {\n\t        s[i] = i++;\n\t      }\n\n\t      for (i = 0; i < width; i++) {\n\t        s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])];\n\t        s[j] = t;\n\t      } // The \"g\" method returns the next (count) outputs as one number.\n\n\n\t      (me.g = function (count) {\n\t        // Using instance members instead of closure state nearly doubles speed.\n\t        var t,\n\t            r = 0,\n\t            i = me.i,\n\t            j = me.j,\n\t            s = me.S;\n\n\t        while (count--) {\n\t          t = s[i = mask & i + 1];\n\t          r = r * width + s[mask & (s[i] = s[j = mask & j + t]) + (s[j] = t)];\n\t        }\n\n\t        me.i = i;\n\t        me.j = j;\n\t        return r; // For robust unpredictability, the function call below automatically\n\t        // discards an initial batch of values.  This is called RC4-drop[256].\n\t        // See http://google.com/search?q=rsa+fluhrer+response&btnI\n\t      })(width);\n\t    } //\n\t    // copy()\n\t    // Copies internal state of ARC4 to or from a plain object.\n\t    //\n\n\n\t    function copy(f, t) {\n\t      t.i = f.i;\n\t      t.j = f.j;\n\t      t.S = f.S.slice();\n\t      return t;\n\t    }\n\n\t    ; //\n\t    // flatten()\n\t    // Converts an object tree to nested arrays of strings.\n\t    //\n\n\t    function flatten(obj, depth) {\n\t      var result = [],\n\t          typ = typeof obj,\n\t          prop;\n\n\t      if (depth && typ == 'object') {\n\t        for (prop in obj) {\n\t          try {\n\t            result.push(flatten(obj[prop], depth - 1));\n\t          } catch (e) {}\n\t        }\n\t      }\n\n\t      return result.length ? result : typ == 'string' ? obj : obj + '\\0';\n\t    } //\n\t    // mixkey()\n\t    // Mixes a string seed into a key that is an array of integers, and\n\t    // returns a shortened string seed that is equivalent to the result key.\n\t    //\n\n\n\t    function mixkey(seed, key) {\n\t      var stringseed = seed + '',\n\t          smear,\n\t          j = 0;\n\n\t      while (j < stringseed.length) {\n\t        key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++);\n\t      }\n\n\t      return tostring(key);\n\t    } //\n\t    // autoseed()\n\t    // Returns an object for autoseeding, using window.crypto and Node crypto\n\t    // module if available.\n\t    //\n\n\n\t    function autoseed() {\n\t      try {\n\t        var out;\n\n\t        if (nodecrypto && (out = nodecrypto.randomBytes)) {\n\t          // The use of 'out' to remember randomBytes makes tight minified code.\n\t          out = out(width);\n\t        } else {\n\t          out = new Uint8Array(width);\n\t          (global.crypto || global.msCrypto).getRandomValues(out);\n\t        }\n\n\t        return tostring(out);\n\t      } catch (e) {\n\t        var browser = global.navigator,\n\t            plugins = browser && browser.plugins;\n\t        return [+new Date(), global, plugins, global.screen, tostring(pool)];\n\t      }\n\t    } //\n\t    // tostring()\n\t    // Converts an array of charcodes to a string\n\t    //\n\n\n\t    function tostring(a) {\n\t      return String.fromCharCode.apply(0, a);\n\t    } //\n\t    // When seedrandom.js is loaded, we immediately mix a few bits\n\t    // from the built-in RNG into the entropy pool.  Because we do\n\t    // not want to interfere with deterministic PRNG state later,\n\t    // seedrandom will not call math.random on its own again after\n\t    // initialization.\n\t    //\n\n\n\t    mixkey(math.random(), pool); //\n\t    // Nodejs and AMD support: export the implementation as a module using\n\t    // either convention.\n\t    //\n\n\t    if ('object' == 'object' && module.exports) {\n\t      module.exports = seedrandom; // When in node.js, try using crypto package for autoseeding.\n\n\t      try {\n\t        nodecrypto = require('crypto');\n\t      } catch (ex) {}\n\t    } else if (typeof undefined == 'function' && undefined.amd) {\n\t      undefined(function () {\n\t        return seedrandom;\n\t      });\n\t    } // End anonymous scope, and pass initial values.\n\n\t  })([], // pool: entropy pool starts empty\n\t  Math // math: package containing random, pow, and seedrandom\n\t  );\n\t});\n\n\t//\n\t// Usage:\n\t//\n\t// var seedrandom = require('seedrandom');\n\t// var random = seedrandom(1); // or any seed.\n\t// var x = random();       // 0 <= x < 1.  Every bit is random.\n\t// var x = random.quick(); // 0 <= x < 1.  32 bits of randomness.\n\t// alea, a 53-bit multiply-with-carry generator by Johannes Baagøe.\n\t// Period: ~2^116\n\t// Reported to pass all BigCrush tests.\n\t// xor128, a pure xor-shift generator by George Marsaglia.\n\t// Period: 2^128-1.\n\t// Reported to fail: MatrixRank and LinearComp.\n\t// xorwow, George Marsaglia's 160-bit xor-shift combined plus weyl.\n\t// Period: 2^192-2^32\n\t// Reported to fail: CollisionOver, SimpPoker, and LinearComp.\n\t// xorshift7, by François Panneton and Pierre L'ecuyer, takes\n\t// a different approach: it adds robustness by allowing more shifts\n\t// than Marsaglia's original three.  It is a 7-shift generator\n\t// with 256 bits, that passes BigCrush with no systmatic failures.\n\t// Period 2^256-1.\n\t// No systematic BigCrush failures reported.\n\t// xor4096, by Richard Brent, is a 4096-bit xor-shift with a\n\t// very long period that also adds a Weyl generator. It also passes\n\t// BigCrush with no systematic failures.  Its long period may\n\t// be useful if you have many generators and need to avoid\n\t// collisions.\n\t// Period: 2^4128-2^32.\n\t// No systematic BigCrush failures reported.\n\t// Tyche-i, by Samuel Neves and Filipe Araujo, is a bit-shifting random\n\t// number generator derived from ChaCha, a modern stream cipher.\n\t// https://eden.dei.uc.pt/~sneves/pubs/2011-snfa2.pdf\n\t// Period: ~2^127\n\t// No systematic BigCrush failures reported.\n\t// The original ARC4-based prng included in this library.\n\t// Period: ~2^1600\n\n\tseedrandom.alea = alea;\n\tseedrandom.xor128 = xor128;\n\tseedrandom.xorwow = xorwow;\n\tseedrandom.xorshift7 = xorshift7;\n\tseedrandom.xor4096 = xor4096;\n\tseedrandom.tychei = tychei;\n\tvar seedrandom$1 = seedrandom;\n\tvar seedrandom_1 = seedrandom$1.alea;\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tvar MPRandGauss = /*#__PURE__*/function () {\n\t  function MPRandGauss(mean, stdDeviation, dtype, truncated, seed) {\n\t    this.mean = mean;\n\t    this.stdDev = stdDeviation;\n\t    this.dtype = dtype;\n\t    this.nextVal = NaN;\n\t    this.truncated = truncated;\n\n\t    if (this.truncated) {\n\t      this.upper = this.mean + this.stdDev * 2;\n\t      this.lower = this.mean - this.stdDev * 2;\n\t    }\n\n\t    var seedValue = seed ? seed : Math.random();\n\t    this.random = seedrandom_1(seedValue.toString());\n\t  }\n\t  /** Returns next sample from a Gaussian distribution. */\n\n\n\t  var _proto = MPRandGauss.prototype;\n\n\t  _proto.nextValue = function nextValue() {\n\t    if (!isNaN(this.nextVal)) {\n\t      var value = this.nextVal;\n\t      this.nextVal = NaN;\n\t      return value;\n\t    }\n\n\t    var resultX, resultY;\n\t    var isValid = false;\n\n\t    while (!isValid) {\n\t      var v1 = void 0,\n\t          v2 = void 0,\n\t          s = void 0;\n\n\t      do {\n\t        v1 = 2 * this.random() - 1;\n\t        v2 = 2 * this.random() - 1;\n\t        s = v1 * v1 + v2 * v2;\n\t      } while (s >= 1 || s === 0);\n\n\t      var mul = Math.sqrt(-2.0 * Math.log(s) / s);\n\t      resultX = this.mean + this.stdDev * v1 * mul;\n\t      resultY = this.mean + this.stdDev * v2 * mul;\n\n\t      if (!this.truncated || this.isValidTruncated(resultX)) {\n\t        isValid = true;\n\t      }\n\t    }\n\n\t    if (!this.truncated || this.isValidTruncated(resultY)) {\n\t      this.nextVal = this.convertValue(resultY);\n\t    }\n\n\t    return this.convertValue(resultX);\n\t  }\n\t  /** Handles proper rounding for non-floating-point numbers. */\n\t  ;\n\n\t  _proto.convertValue = function convertValue(value) {\n\t    if (this.dtype == null || this.dtype === 'float32') {\n\t      return value;\n\t    }\n\n\t    return Math.round(value);\n\t  }\n\t  /** Returns true if less than 2-standard-deviations from the mean. */\n\t  ;\n\n\t  _proto.isValidTruncated = function isValidTruncated(value) {\n\t    return value <= this.upper && value >= this.lower;\n\t  };\n\n\t  return MPRandGauss;\n\t}(); // Marsaglia, George, and Wai Wan Tsang. 2000. \"A Simple Method for Generating\n\t// Gamma Variables.\"\n\n\tvar RandGamma = /*#__PURE__*/function () {\n\t  function RandGamma(alpha, beta, dtype, seed) {\n\t    this.alpha = alpha;\n\t    this.beta = 1 / beta; // convert rate to scale parameter\n\n\t    this.dtype = dtype;\n\t    var seedValue = seed ? seed : Math.random();\n\t    this.randu = seedrandom_1(seedValue.toString());\n\t    this.randn = new MPRandGauss(0, 1, dtype, false, this.randu());\n\n\t    if (alpha < 1) {\n\t      this.d = alpha + 2 / 3;\n\t    } else {\n\t      this.d = alpha - 1 / 3;\n\t    }\n\n\t    this.c = 1 / Math.sqrt(9 * this.d);\n\t  }\n\t  /** Returns next sample from a gamma distribution. */\n\n\n\t  var _proto2 = RandGamma.prototype;\n\n\t  _proto2.nextValue = function nextValue() {\n\t    var x2, v0, v1, x, u, v;\n\n\t    while (true) {\n\t      do {\n\t        x = this.randn.nextValue();\n\t        v = 1 + this.c * x;\n\t      } while (v <= 0);\n\n\t      v *= v * v;\n\t      x2 = x * x;\n\t      v0 = 1 - 0.331 * x2 * x2;\n\t      v1 = 0.5 * x2 + this.d * (1 - v + Math.log(v));\n\t      u = this.randu();\n\n\t      if (u < v0 || Math.log(u) < v1) {\n\t        break;\n\t      }\n\t    }\n\n\t    v = 1 / this.beta * this.d * v;\n\n\t    if (this.alpha < 1) {\n\t      v *= Math.pow(this.randu(), 1 / this.alpha);\n\t    }\n\n\t    return this.convertValue(v);\n\t  }\n\t  /** Handles proper rounding for non-floating-point numbers. */\n\t  ;\n\n\t  _proto2.convertValue = function convertValue(value) {\n\t    if (this.dtype === 'float32') {\n\t      return value;\n\t    }\n\n\t    return Math.round(value);\n\t  };\n\n\t  return RandGamma;\n\t}();\n\tvar UniformRandom = /*#__PURE__*/function () {\n\t  function UniformRandom(min, max, dtype, seed) {\n\t    var _this = this;\n\n\t    if (min === void 0) {\n\t      min = 0;\n\t    }\n\n\t    if (max === void 0) {\n\t      max = 1;\n\t    }\n\n\t    /** Handles proper rounding for non floating point numbers. */\n\t    this.canReturnFloat = function () {\n\t      return _this.dtype == null || _this.dtype === 'float32';\n\t    };\n\n\t    this.min = min;\n\t    this.range = max - min;\n\t    this.dtype = dtype;\n\n\t    if (seed == null) {\n\t      seed = Math.random();\n\t    }\n\n\t    if (typeof seed === 'number') {\n\t      seed = seed.toString();\n\t    }\n\n\t    if (!this.canReturnFloat() && this.range <= 1) {\n\t      throw new Error(\"The difference between \" + min + \" - \" + max + \" <= 1 and dtype is not float\");\n\t    }\n\n\t    this.random = seedrandom_1(seed);\n\t  }\n\n\t  var _proto3 = UniformRandom.prototype;\n\n\t  _proto3.convertValue = function convertValue(value) {\n\t    if (this.canReturnFloat()) {\n\t      return value;\n\t    }\n\n\t    return Math.round(value);\n\t  };\n\n\t  _proto3.nextValue = function nextValue() {\n\t    return this.convertValue(this.min + this.range * this.random());\n\t  };\n\n\t  return UniformRandom;\n\t}();\n\tfunction jarqueBeraNormalityTest(values) {\n\t  // https://en.wikipedia.org/wiki/Jarque%E2%80%93Bera_test\n\t  var n = values.length;\n\t  var s = skewness(values);\n\t  var k = kurtosis(values);\n\t  var jb = n / 6 * (Math.pow(s, 2) + 0.25 * Math.pow(k - 3, 2)); // JB test requires 2-degress of freedom from Chi-Square @ 0.95:\n\t  // http://www.itl.nist.gov/div898/handbook/eda/section3/eda3674.htm\n\n\t  var CHI_SQUARE_2DEG = 5.991;\n\n\t  if (jb > CHI_SQUARE_2DEG) {\n\t    throw new Error(\"Invalid p-value for JB: \" + jb);\n\t  }\n\t}\n\tfunction expectArrayInMeanStdRange(actual, expectedMean, expectedStdDev, epsilon) {\n\t  if (epsilon == null) {\n\t    epsilon = testEpsilon();\n\t  }\n\n\t  var actualMean = mean$1(actual);\n\t  expectNumbersClose(actualMean, expectedMean, epsilon);\n\t  expectNumbersClose(standardDeviation(actual, actualMean), expectedStdDev, epsilon);\n\t}\n\n\tfunction mean$1(values) {\n\t  var sum = 0;\n\n\t  for (var i = 0; i < values.length; i++) {\n\t    sum += values[i];\n\t  }\n\n\t  return sum / values.length;\n\t}\n\n\tfunction standardDeviation(values, mean) {\n\t  var squareDiffSum = 0;\n\n\t  for (var i = 0; i < values.length; i++) {\n\t    var diff = values[i] - mean;\n\t    squareDiffSum += diff * diff;\n\t  }\n\n\t  return Math.sqrt(squareDiffSum / values.length);\n\t}\n\n\tfunction kurtosis(values) {\n\t  // https://en.wikipedia.org/wiki/Kurtosis\n\t  var valuesMean = mean$1(values);\n\t  var n = values.length;\n\t  var sum2 = 0;\n\t  var sum4 = 0;\n\n\t  for (var i = 0; i < n; i++) {\n\t    var v = values[i] - valuesMean;\n\t    sum2 += Math.pow(v, 2);\n\t    sum4 += Math.pow(v, 4);\n\t  }\n\n\t  return 1 / n * sum4 / Math.pow(1 / n * sum2, 2);\n\t}\n\n\tfunction skewness(values) {\n\t  // https://en.wikipedia.org/wiki/Skewness\n\t  var valuesMean = mean$1(values);\n\t  var n = values.length;\n\t  var sum2 = 0;\n\t  var sum3 = 0;\n\n\t  for (var i = 0; i < n; i++) {\n\t    var v = values[i] - valuesMean;\n\t    sum2 += Math.pow(v, 2);\n\t    sum3 += Math.pow(v, 3);\n\t  }\n\n\t  return 1 / n * sum3 / Math.pow(1 / (n - 1) * sum2, 3 / 2);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates a `tf.Tensor` with values sampled from a gamma distribution.\n\t *\n\t * ```js\n\t * tf.randomGamma([2, 2], 1).print();\n\t * ```\n\t *\n\t * @param shape An array of integers defining the output tensor shape.\n\t * @param alpha The shape parameter of the gamma distribution.\n\t * @param beta The inverse scale parameter of the gamma distribution. Defaults\n\t *     to 1.\n\t * @param dtype The data type of the output. Defaults to float32.\n\t * @param seed The seed for the random number generator.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Random'}\n\t */\n\n\tfunction randomGamma_(shape, alpha, beta, dtype, seed) {\n\t  if (beta === void 0) {\n\t    beta = 1;\n\t  }\n\n\t  if (dtype === void 0) {\n\t    dtype = 'float32';\n\t  }\n\n\t  if (beta == null) {\n\t    beta = 1;\n\t  }\n\n\t  if (dtype == null) {\n\t    dtype = 'float32';\n\t  }\n\n\t  if (dtype !== 'float32' && dtype !== 'int32') {\n\t    throw new Error(\"Unsupported data type \" + dtype);\n\t  }\n\n\t  var rgamma = new RandGamma(alpha, beta, dtype, seed);\n\t  var res = buffer(shape, dtype);\n\n\t  for (var i = 0; i < res.values.length; i++) {\n\t    res.values[i] = rgamma.nextValue();\n\t  }\n\n\t  return res.toTensor();\n\t}\n\n\tvar randomGamma = op({\n\t  randomGamma_: randomGamma_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates a `tf.Tensor` with values sampled from a normal distribution.\n\t *\n\t * ```js\n\t * tf.randomNormal([2, 2]).print();\n\t * ```\n\t *\n\t * @param shape An array of integers defining the output tensor shape.\n\t * @param mean The mean of the normal distribution.\n\t * @param stdDev The standard deviation of the normal distribution.\n\t * @param dtype The data type of the output.\n\t * @param seed The seed for the random number generator.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Random'}\n\t */\n\n\tfunction randomNormal_(shape, mean, stdDev, dtype, seed) {\n\t  if (mean === void 0) {\n\t    mean = 0;\n\t  }\n\n\t  if (stdDev === void 0) {\n\t    stdDev = 1;\n\t  }\n\n\t  if (dtype != null && dtype === 'bool') {\n\t    throw new Error(\"Unsupported data type \" + dtype);\n\t  }\n\n\t  var randGauss = new MPRandGauss(mean, stdDev, dtype, false\n\t  /* truncated */\n\t  , seed);\n\t  var res = buffer(shape, dtype);\n\n\t  for (var i = 0; i < res.values.length; i++) {\n\t    res.values[i] = randGauss.nextValue();\n\t  }\n\n\t  return res.toTensor();\n\t}\n\n\tvar randomNormal = op({\n\t  randomNormal_: randomNormal_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates a `tf.Tensor` with values sampled from a uniform distribution.\n\t *\n\t * The generated values follow a uniform distribution in the range [minval,\n\t * maxval). The lower bound minval is included in the range, while the upper\n\t * bound maxval is excluded.\n\t *\n\t * ```js\n\t * tf.randomUniform([2, 2]).print();\n\t * ```\n\t *\n\t * @param shape An array of integers defining the output tensor shape.\n\t * @param minval The lower bound on the range of random values to generate.\n\t *   Defaults to 0.\n\t * @param maxval The upper bound on the range of random values to generate.\n\t *   Defaults to 1.\n\t * @param dtype The data type of the output tensor. Defaults to 'float32'.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Random'}\n\t */\n\n\tfunction randomUniform_(shape, minval, maxval, dtype, seed) {\n\t  if (minval === void 0) {\n\t    minval = 0;\n\t  }\n\n\t  if (maxval === void 0) {\n\t    maxval = 1;\n\t  }\n\n\t  if (dtype === void 0) {\n\t    dtype = 'float32';\n\t  }\n\n\t  var res = buffer(shape, dtype);\n\t  var random = new UniformRandom(minval, maxval, null, seed);\n\n\t  for (var i = 0; i < res.values.length; i++) {\n\t    res.values[i] = random.nextValue();\n\t  }\n\n\t  return res.toTensor();\n\t}\n\n\tvar randomUniform = op({\n\t  randomUniform_: randomUniform_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates a new `tf.Tensor1D` filled with the numbers in the range provided.\n\t *\n\t * The tensor is a is half-open interval meaning it includes start, but\n\t * excludes stop. Decrementing ranges and negative step values are also\n\t * supported.sv\n\t *\n\t *\n\t * ```js\n\t * tf.range(0, 9, 2).print();\n\t * ```\n\t *\n\t * @param start An integer start value\n\t * @param stop An integer stop value\n\t * @param step An integer increment (will default to 1 or -1)\n\t * @param dtype The data type of the output tensor. Defaults to 'float32'.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction range(start, stop, step, dtype) {\n\t  if (step === void 0) {\n\t    step = 1;\n\t  }\n\n\t  if (dtype === void 0) {\n\t    dtype = 'float32';\n\t  }\n\n\t  if (step === 0) {\n\t    throw new Error('Cannot have a step of zero');\n\t  }\n\n\t  var attrs = {\n\t    start: start,\n\t    stop: stop,\n\t    step: step,\n\t    dtype: dtype\n\t  };\n\t  return ENGINE.runKernel(Range, {}\n\t  /* inputs */\n\t  , attrs);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns the real part of a complex (or real) tensor.\n\t *\n\t * Given a tensor input, this operation returns a tensor of type float that is\n\t * the real part of each element in input considered as a complex number.\n\t *\n\t * If the input is real, it simply makes a clone.\n\t *\n\t * ```js\n\t * const x = tf.complex([-2.25, 3.25], [4.75, 5.75]);\n\t * tf.real(x).print();\n\t * ```\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction real_(input) {\n\t  var $input = convertToTensor(input, 'input', 'real');\n\t  var inputs = {\n\t    input: $input\n\t  };\n\t  return ENGINE.runKernel(Real, inputs);\n\t}\n\n\tvar real = op({\n\t  real_: real_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes reciprocal of x element-wise: `1 / x`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([0, 1, 2]);\n\t *\n\t * x.reciprocal().print();  // or tf.reciprocal(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction reciprocal_(x) {\n\t  var $x = convertToTensor(x, 'x', 'reciprocal');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Reciprocal, inputs);\n\t}\n\n\tvar reciprocal = op({\n\t  reciprocal_: reciprocal_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes rectified linear element-wise: `max(x, 0)`.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([-1, 2, -3, 4]);\n\t *\n\t * x.relu().print();  // or tf.relu(x)\n\t * ```\n\t * @param x The input tensor. If the dtype is `bool`, the output dtype will be\n\t *     `int32'.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction relu_(x) {\n\t  var $x = convertToTensor(x, 'x', 'relu');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Relu, inputs);\n\t}\n\n\tvar relu = op({\n\t  relu_: relu_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes rectified linear 6 element-wise: `min(max(x, 0), 6)`.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([-1, 2, -3, 8]);\n\t *\n\t * x.relu6().print();  // or tf.relu6(x)\n\t * ```\n\t * @param x The input tensor. If the dtype is `bool`, the output dtype will be\n\t *     `int32'.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction relu6_(x) {\n\t  var $x = convertToTensor(x, 'x', 'relu6');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Relu6, inputs);\n\t}\n\n\tvar relu6 = op({\n\t  relu6_: relu6_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Reverses a `tf.Tensor` along a specified axis.\n\t *\n\t * Also available are stricter rank-specific methods that assert that `x` is\n\t * of the given rank:\n\t *   - `tf.reverse1d`\n\t *   - `tf.reverse2d`\n\t *   - `tf.reverse3d`\n\t *   - `tf.reverse4d`\n\t *\n\t * Except `tf.reverse1d` (which does not have axis param), all methods have\n\t * same signature as this method.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 3, 4]);\n\t *\n\t * x.reverse().print();\n\t * ```\n\t *\n\t * ```js\n\t * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n\t *\n\t * const axis = 1;\n\t * x.reverse(axis).print();\n\t * ```\n\t * @param x The input tensor to be reversed.\n\t * @param axis The set of dimensions to reverse. Must be in the\n\t *     range [-rank(x), rank(x)). Defaults to all axes.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n\t */\n\n\tfunction reverse_(x, axis) {\n\t  var $x = convertToTensor(x, 'x', 'reverse');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    dims: axis\n\t  };\n\t  return ENGINE.runKernel(Reverse, inputs, attrs);\n\t}\n\n\tvar reverse = op({\n\t  reverse_: reverse_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Reverses a `tf.Tensor1D`.\n\t *\n\t * @param x The input tensor.\n\t */\n\n\tfunction reverse1d_(x) {\n\t  var $x = convertToTensor(x, 'x', 'reverse');\n\t  assert($x.rank === 1, function () {\n\t    return \"Error in reverse1D: x must be rank 1 but got rank \" + $x.rank + \".\";\n\t  });\n\t  return reverse($x, 0);\n\t}\n\n\tvar reverse1d = op({\n\t  reverse1d_: reverse1d_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Reverses a `tf.Tensor2D` along a specified axis.\n\t *\n\t * @param x The input tensor.\n\t * @param axis The set of dimensions to reverse. Must be in the\n\t *     range [-rank(x), rank(x)). Defaults to all axes.\n\t */\n\n\tfunction reverse2d_(x, axis) {\n\t  var $x = convertToTensor(x, 'x', 'reverse');\n\t  assert($x.rank === 2, function () {\n\t    return \"Error in reverse2D: x must be rank 2 but got rank \" + $x.rank + \".\";\n\t  });\n\t  return reverse($x, axis);\n\t}\n\n\tvar reverse2d = op({\n\t  reverse2d_: reverse2d_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Reverses a `tf.Tensor3D` along a specified axis.\n\t *\n\t * @param x The input tensor.\n\t * @param axis The set of dimensions to reverse. Must be in the\n\t *     range [-rank(x), rank(x)). Defaults to all axes.\n\t */\n\n\tfunction reverse3d_(x, axis) {\n\t  var $x = convertToTensor(x, 'x', 'reverse');\n\t  assert($x.rank === 3, function () {\n\t    return \"Error in reverse3D: x must be rank 3 but got rank \" + $x.rank + \".\";\n\t  });\n\t  return reverse($x, axis);\n\t}\n\n\tvar reverse3d = op({\n\t  reverse3d_: reverse3d_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Reverses a `tf.Tensor4D` along a specified axis.\n\t *\n\t * @param x The input tensor.\n\t * @param axis The set of dimensions to reverse. Must be in the\n\t *     range [-rank(x), rank(x)). Defaults to all axes.\n\t */\n\n\tfunction reverse4d_(x, axis) {\n\t  var $x = convertToTensor(x, 'x', 'reverse');\n\t  assert($x.rank === 4, function () {\n\t    return \"Error in reverse4D: x must be rank 4 but got rank \" + $x.rank + \".\";\n\t  });\n\t  return reverse($x, axis);\n\t}\n\n\tvar reverse4d = op({\n\t  reverse4d_: reverse4d_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes round of input `tf.Tensor` element-wise: `round(x)`.\n\t * It implements banker's rounding.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([.6, 1.1, -3.3]);\n\t *\n\t * x.round().print();  // or tf.round(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction round_(x) {\n\t  var $x = convertToTensor(x, 'x', 'round');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Round, inputs);\n\t}\n\n\tvar round$1 = op({\n\t  round_: round_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes reciprocal of square root of the input `tf.Tensor` element-wise:\n\t * `y = 1 / sqrt(x)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 4, -1]);\n\t *\n\t * x.rsqrt().print();  // or tf.rsqrt(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction rsqrt_(x) {\n\t  var $x = convertToTensor(x, 'x', 'rsqrt');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Rsqrt, inputs);\n\t}\n\n\tvar rsqrt = op({\n\t  rsqrt_: rsqrt_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates rank-0 `tf.Tensor` (scalar) with the provided value and dtype.\n\t *\n\t * The same functionality can be achieved with `tf.tensor`, but in general\n\t * we recommend using `tf.scalar` as it makes the code more readable.\n\t *\n\t * ```js\n\t * tf.scalar(3.14).print();\n\t * ```\n\t *\n\t * @param value The value of the scalar.\n\t * @param dtype The data type.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction scalar(value, dtype) {\n\t  if ((isTypedArray$1(value) && dtype !== 'string' || Array.isArray(value)) && dtype !== 'complex64') {\n\t    throw new Error('Error creating a new Scalar: value must be a primitive ' + '(number|boolean|string)');\n\t  }\n\n\t  if (dtype === 'string' && isTypedArray$1(value) && !(value instanceof Uint8Array)) {\n\t    throw new Error('When making a scalar from encoded string, ' + 'the value must be `Uint8Array`.');\n\t  }\n\n\t  var shape = [];\n\t  var inferredShape = [];\n\t  return makeTensor(value, shape, inferredShape, dtype);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes scaled exponential linear element-wise.\n\t *\n\t * `x < 0 ? scale * alpha * (exp(x) - 1) : x`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([-1, 2, -3, 4]);\n\t *\n\t * x.selu().print();  // or tf.selu(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction selu_(x) {\n\t  var $x = convertToTensor(x, 'x', 'selu');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Selu, inputs);\n\t}\n\n\tvar selu = op({\n\t  selu_: selu_\n\t});\n\n\t/**\n\t * 2-D convolution with separable filters.\n\t *\n\t * Performs a depthwise convolution that acts separately on channels followed\n\t * by a pointwise convolution that mixes channels. Note that this is\n\t * separability between dimensions [1, 2] and 3, not spatial separability\n\t * between dimensions 1 and 2.\n\t *\n\t * See\n\t * [https://www.tensorflow.org/api_docs/python/tf/nn/separable_conv2d](\n\t *     https://www.tensorflow.org/api_docs/python/tf/nn/separable_conv2d)\n\t * for more details.\n\t *\n\t * @param x The input tensor, of rank 4 or rank 3, of shape\n\t *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is\n\t * assumed.\n\t * @param depthwiseFilter The depthwise filter tensor, rank 4, of shape\n\t *     `[filterHeight, filterWidth, inChannels, channelMultiplier]`. This is\n\t *     the filter used in the first step.\n\t * @param pointwiseFilter The pointwise filter tensor, rank 4, of shape\n\t *     `[1, 1, inChannels * channelMultiplier, outChannels]`. This is\n\t *     the filter used in the second step.\n\t * @param strides The strides of the convolution: `[strideHeight,\n\t * strideWidth]`. If strides is a single number, then `strideHeight ==\n\t * strideWidth`.\n\t * @param pad The type of padding algorithm.\n\t *   - `same` and stride 1: output will be of same size as input,\n\t *       regardless of filter size.\n\t *   - `valid`: output will be smaller than input if filter is larger\n\t *       than 1x1.\n\t *   - For more info, see this guide:\n\t *     [https://www.tensorflow.org/api_guides/python/nn#Convolution](\n\t *          https://www.tensorflow.org/api_guides/python/nn#Convolution)\n\t * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n\t *     in which we sample input values across the height and width dimensions\n\t *     in atrous convolution. Defaults to `[1, 1]`. If `rate` is a single\n\t *     number, then `dilationHeight == dilationWidth`. If it is greater than\n\t *     1, then all values of `strides` must be 1.\n\t * @param dataFormat: An optional string from: \"NHWC\", \"NCHW\". Defaults to\n\t *     \"NHWC\". Specify the data format of the input and output data. With the\n\t *     default format \"NHWC\", the data is stored in the order of: [batch,\n\t *     height, width, channels]. Only \"NHWC\" is currently supported.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Convolution'}\n\t */\n\n\tfunction separableConv2d_(x, depthwiseFilter, pointwiseFilter, strides, pad, dilation, dataFormat) {\n\t  if (dilation === void 0) {\n\t    dilation = [1, 1];\n\t  }\n\n\t  if (dataFormat === void 0) {\n\t    dataFormat = 'NHWC';\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'separableConv2d');\n\t  var $depthwiseFilter = convertToTensor(depthwiseFilter, 'depthwiseFilter', 'separableConv2d');\n\t  var $pointwiseFilter = convertToTensor(pointwiseFilter, 'pointwiseFilter', 'separableConv2d');\n\t  var x4D = $x;\n\t  var reshapedTo4D = false;\n\n\t  if ($x.rank === 3) {\n\t    reshapedTo4D = true;\n\t    x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n\t  }\n\n\t  if (dataFormat === 'NCHW') {\n\t    throw new Error('separableConv2d currently does not support dataFormat NCHW; only ' + 'NHWC is supported');\n\t  }\n\n\t  assert(x4D.rank === 4, function () {\n\t    return \"Error in separableConv2d: input must be rank 4, but got \" + (\"rank \" + x4D.rank + \".\");\n\t  });\n\t  assert($depthwiseFilter.rank === 4, function () {\n\t    return \"Error in separableConv2d: depthwise filter must be rank 4, but \" + (\"got rank \" + $depthwiseFilter.rank + \".\");\n\t  });\n\t  assert($pointwiseFilter.rank === 4, function () {\n\t    return \"Error in separableConv2d: pointwise filter must be rank 4, but \" + (\"got rank \" + $depthwiseFilter.rank + \".\");\n\t  });\n\t  assert($pointwiseFilter.shape[0] === 1, function () {\n\t    return \"Error in separableConv2d: the first dimension of pointwise filter \" + (\" must be 1, but got \" + $pointwiseFilter.shape[0] + \".\");\n\t  });\n\t  assert($pointwiseFilter.shape[1] === 1, function () {\n\t    return \"Error in separableConv2d: the second dimension of pointwise \" + (\"filter must be 1, but got \" + $pointwiseFilter.shape[1] + \".\");\n\t  });\n\t  var inChannels = $depthwiseFilter.shape[2];\n\t  var channelMultiplier = $depthwiseFilter.shape[3];\n\t  assert($pointwiseFilter.shape[2] === inChannels * channelMultiplier, function () {\n\t    return \"Error in separableConv2d: the third dimension of pointwise filter \" + (\"must be \" + inChannels * channelMultiplier + \", \") + (\"but got \" + $pointwiseFilter.shape[2] + \".\");\n\t  });\n\t  var depthwise = depthwiseConv2d(x4D, $depthwiseFilter, strides, pad, dataFormat, dilation);\n\t  var pointwiseStride = 1;\n\t  var res = conv2d(depthwise, $pointwiseFilter, pointwiseStride, 'valid', dataFormat);\n\n\t  if (reshapedTo4D) {\n\t    return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n\t  }\n\n\t  return res;\n\t}\n\n\tvar separableConv2d = op({\n\t  separableConv2d_: separableConv2d_\n\t});\n\n\t/**\n\t * Computes the difference between two lists of numbers.\n\t *\n\t * Given a Tensor `x` and a Tensor `y`, this operation returns a Tensor `out`\n\t * that represents all values that are in `x` but not in `y`. The returned\n\t * Tensor `out` is sorted in the same order that the numbers appear in `x`\n\t * (duplicates are preserved). This operation also returns a Tensor indices that\n\t * represents the position of each out element in `x`. In other words:\n\t *\n\t * `out[i] = x[idx[i]] for i in [0, 1, ..., out.length - 1]`\n\t *\n\t * ```js\n\t * const x = [1, 2, 3, 4, 5, 6];\n\t * const y = [1, 3, 5];\n\t *\n\t * const [out, indices] = await tf.setdiff1dAsync(x, y);\n\t * out.print(); // [2, 4, 6]\n\t * indices.print(); // [1, 3, 5]\n\t * ```\n\t *\n\t * @param x 1-D Tensor. Values to keep.\n\t * @param y 1-D Tensor. Must have the same type as x. Values to exclude in the\n\t *     output.\n\t * @returns Promise of Tensor tuple [out, indices].\n\t *  out: Tensor with the same type as x.\n\t *  indices: A Tensor of type int32.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Transformations'}\n\t */\n\n\tfunction setdiff1dAsync_(_x, _x2) {\n\t  return _setdiff1dAsync_.apply(this, arguments);\n\t}\n\n\tfunction _setdiff1dAsync_() {\n\t  _setdiff1dAsync_ = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(x, y) {\n\t    var $x, $y, xVals, yVals, ySet, outputSize, i, buffer, indices, _i, p;\n\n\t    return regeneratorRuntime.wrap(function _callee$(_context) {\n\t      while (1) {\n\t        switch (_context.prev = _context.next) {\n\t          case 0:\n\t            $x = convertToTensor(x, 'x', 'setdiff1d');\n\t            $y = convertToTensor(y, 'y', 'setdiff1d');\n\t            assert($x.dtype === $y.dtype, function () {\n\t              return \"x and y should have the same dtype, but got x (\" + $x.dtype + \") and y (\" + $y.dtype + \").\";\n\t            });\n\t            assert($x.rank === 1, function () {\n\t              return \"x should be 1D tensor, but got x (\" + $x.shape + \").\";\n\t            });\n\t            assert($y.rank === 1, function () {\n\t              return \"y should be 1D tensor, but got y (\" + $y.shape + \").\";\n\t            });\n\t            _context.next = 7;\n\t            return $x.data();\n\n\t          case 7:\n\t            xVals = _context.sent;\n\t            _context.next = 10;\n\t            return $y.data();\n\n\t          case 10:\n\t            yVals = _context.sent;\n\t            ySet = new Set(yVals);\n\t            outputSize = 0;\n\n\t            for (i = 0; i < xVals.length; i++) {\n\t              if (!ySet.has(xVals[i])) {\n\t                outputSize++;\n\t              }\n\t            }\n\n\t            buffer = new TensorBuffer([outputSize], $x.dtype);\n\t            indices = new TensorBuffer([outputSize], 'int32');\n\n\t            for (_i = 0, p = 0; _i < xVals.length; _i++) {\n\t              if (!ySet.has(xVals[_i])) {\n\t                buffer.values[p] = xVals[_i];\n\t                indices.values[p] = _i;\n\t                p++;\n\t              }\n\t            }\n\n\t            return _context.abrupt(\"return\", [buffer.toTensor(), indices.toTensor()]);\n\n\t          case 18:\n\t          case \"end\":\n\t            return _context.stop();\n\t        }\n\t      }\n\t    }, _callee);\n\t  }));\n\t  return _setdiff1dAsync_.apply(this, arguments);\n\t}\n\n\tvar setdiff1dAsync = setdiff1dAsync_;\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns an element-wise indication of the sign of a number.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([.6, 1.1, -3.3, NaN, 0]);\n\t *\n\t * x.sign().print();  // or tf.sign(x)\n\t * ```\n\t * @param x The input Tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction sign_(x) {\n\t  var $x = convertToTensor(x, 'x', 'sign');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Sign, inputs);\n\t}\n\n\tvar sign = op({\n\t  sign_: sign_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes sin of the input Tensor element-wise: `sin(x)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([0, Math.PI / 2, Math.PI * 3 / 4]);\n\t *\n\t * x.sin().print();  // or tf.sin(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction sin_(x) {\n\t  var $x = convertToTensor(x, 'x', 'sin');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Sin, inputs);\n\t}\n\n\tvar sin = op({\n\t  sin_: sin_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes hyperbolic sin of the input `tf.Tensor` element-wise: `sinh(x)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([0, 1, -1, .7]);\n\t *\n\t * x.sinh().print();  // or tf.sinh(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction sinh_(x) {\n\t  var $x = convertToTensor(x, 'x', 'sinh');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Sinh, inputs);\n\t}\n\n\tvar sinh = op({\n\t  sinh_: sinh_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Extracts a 1D slice from 1D array starting at coordinates `begin` and is\n\t * of length `size`. See `slice` for details.\n\t */\n\n\tfunction slice1d_(x, begin, size) {\n\t  var $x = convertToTensor(x, 'x', 'slice1d');\n\t  assert($x.rank === 1, function () {\n\t    return \"slice1d expects a rank-1 tensor, but got a rank-\" + $x.rank + \" tensor\";\n\t  });\n\t  return slice$2($x, [begin], [size]);\n\t}\n\n\tvar slice1d = op({\n\t  slice1d_: slice1d_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Extracts a 2D slice from a 2D array starting at coordinates `begin` and\n\t * is of size `size`. See `slice` for details.\n\t */\n\n\tfunction slice2d_(x, begin, size) {\n\t  var $x = convertToTensor(x, 'x', 'slice2d');\n\t  assert($x.rank === 2, function () {\n\t    return \"slice2d expects a rank-2 tensor, but got a rank-\" + $x.rank + \" tensor\";\n\t  });\n\t  return slice$2($x, begin, size);\n\t}\n\n\tvar slice2d = op({\n\t  slice2d_: slice2d_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Extracts a 3D slice from a 3D array starting at coordinates `begin` and\n\t * is of size `size`. See `slice` for details.\n\t */\n\n\tfunction slice3d_(x, begin, size) {\n\t  var $x = convertToTensor(x, 'x', 'slice3d');\n\t  assert($x.rank === 3, function () {\n\t    return \"slice3d expects a rank-3 tensor, but got a rank-\" + $x.rank + \" tensor\";\n\t  });\n\t  return slice$2($x, begin, size);\n\t}\n\n\tvar slice3d = op({\n\t  slice3d_: slice3d_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Extracts a 4D slice from a 4D array starting at coordinates `begin` and\n\t * is of size `size`. See `slice` for details.\n\t */\n\n\tfunction slice4d_(x, begin, size) {\n\t  var $x = convertToTensor(x, 'x', 'slice4d');\n\t  assert($x.rank === 4, function () {\n\t    return \"slice4d expects a rank-4 tensor, but got a rank-\" + $x.rank + \" tensor\";\n\t  });\n\t  return slice$2($x, begin, size);\n\t}\n\n\tvar slice4d = op({\n\t  slice4d_: slice4d_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the softmax normalized vector given the logits.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 2, 3]);\n\t *\n\t * a.softmax().print();  // or tf.softmax(a)\n\t * ```\n\t *\n\t * ```js\n\t * const a = tf.tensor2d([2, 4, 6, 1, 2, 3], [2, 3]);\n\t *\n\t * a.softmax().print();  // or tf.softmax(a)\n\t * ```\n\t *\n\t * @param logits The logits array.\n\t * @param dim The dimension softmax would be performed on. Defaults to `-1`\n\t *     which indicates the last dimension.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Normalization'}\n\t */\n\n\tfunction softmax_(logits, dim) {\n\t  if (dim === void 0) {\n\t    dim = -1;\n\t  }\n\n\t  var $logits = convertToTensor(logits, 'logits', 'softmax', 'float32');\n\n\t  if (dim === -1) {\n\t    dim = $logits.rank - 1;\n\t  }\n\n\t  if (dim !== $logits.rank - 1) {\n\t    throw Error('Softmax along a non-last dimension is not yet supported. ' + (\"Logits was rank \" + $logits.rank + \" and dim was \" + dim));\n\t  }\n\n\t  var inputs = {\n\t    logits: $logits\n\t  };\n\t  var attrs = {\n\t    dim: dim\n\t  };\n\t  return ENGINE.runKernel(Softmax, inputs, attrs);\n\t}\n\n\tvar softmax = op({\n\t  softmax_: softmax_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Fast Fourier transform.\n\t *\n\t * Computes the 1-dimensional discrete Fourier transform over the inner-most\n\t * dimension of input.\n\t *\n\t * ```js\n\t * const real = tf.tensor1d([1, 2, 3]);\n\t * const imag = tf.tensor1d([1, 2, 3]);\n\t * const x = tf.complex(real, imag);\n\t *\n\t * x.fft().print();  // tf.spectral.fft(x).print();\n\t * ```\n\t * @param input The complex input to compute an fft over.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Spectral', namespace: 'spectral'}\n\t */\n\n\tfunction fft_(input) {\n\t  assert(input.dtype === 'complex64', function () {\n\t    return \"The dtype for tf.spectral.fft() must be complex64 \" + (\"but got \" + input.dtype + \".\");\n\t  });\n\t  var inputs = {\n\t    input: input\n\t  };\n\t  return ENGINE.runKernel(FFT, inputs);\n\t}\n\n\tvar fft = op({\n\t  fft_: fft_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Inverse fast Fourier transform.\n\t *\n\t * Computes the inverse 1-dimensional discrete Fourier transform over the\n\t * inner-most dimension of input.\n\t *\n\t * ```js\n\t * const real = tf.tensor1d([1, 2, 3]);\n\t * const imag = tf.tensor1d([1, 2, 3]);\n\t * const x = tf.complex(real, imag);\n\t *\n\t * x.ifft().print();  // tf.spectral.ifft(x).print();\n\t * ```\n\t * @param input The complex input to compute an ifft over.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Spectral', namespace: 'spectral'}\n\t */\n\n\tfunction ifft_(input) {\n\t  assert(input.dtype === 'complex64', function () {\n\t    return \"The dtype for tf.spectral.ifft() must be complex64 \" + (\"but got \" + input.dtype + \".\");\n\t  });\n\t  var inputs = {\n\t    input: input\n\t  };\n\t  return ENGINE.runKernel(IFFT, inputs);\n\t}\n\n\tvar ifft = op({\n\t  ifft_: ifft_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Inversed real value input fast Fourier transform.\n\t *\n\t * Computes the 1-dimensional inversed discrete Fourier transform over the\n\t * inner-most dimension of the real input.\n\t *\n\t * ```js\n\t * const real = tf.tensor1d([1, 2, 3]);\n\t * const imag = tf.tensor1d([0, 0, 0]);\n\t * const x = tf.complex(real, imag);\n\t *\n\t * x.irfft().print();\n\t * ```\n\t * @param input The real value input to compute an irfft over.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Spectral', namespace: 'spectral'}\n\t */\n\n\tfunction irfft_(input) {\n\t  var innerDimensionSize = input.shape[input.shape.length - 1];\n\t  var batch = input.size / innerDimensionSize;\n\t  var ret;\n\n\t  if (innerDimensionSize <= 2) {\n\t    var complexInput = reshape(input, [batch, innerDimensionSize]);\n\t    ret = ifft(complexInput);\n\t  } else {\n\t    // The length of unique components of the DFT of a real-valued signal\n\t    // is 2 * (input_len - 1)\n\t    var outputShape = [batch, 2 * (innerDimensionSize - 1)];\n\t    var realInput = reshape(real(input), [batch, innerDimensionSize]);\n\t    var imagInput = reshape(imag(input), [batch, innerDimensionSize]);\n\t    var realConjugate = reverse(slice$2(realInput, [0, 1], [batch, innerDimensionSize - 2]), 1);\n\t    var imagConjugate = mul(reverse(slice$2(imagInput, [0, 1], [batch, innerDimensionSize - 2]), 1), scalar(-1));\n\t    var r = concat([realInput, realConjugate], 1);\n\t    var i = concat([imagInput, imagConjugate], 1);\n\n\t    var _complexInput = reshape(complex(r, i), [outputShape[0], outputShape[1]]);\n\n\t    ret = ifft(_complexInput);\n\t  }\n\n\t  ret = real(ret); // reshape the result if the input is 3D tensor.\n\n\t  if (input.rank === 3 && input.shape[0] !== 0) {\n\t    var temp = ret;\n\t    var _batch = input.shape[0];\n\t    ret = reshape(ret, [_batch, ret.shape[0] / _batch, ret.shape[1]]);\n\t    temp.dispose();\n\t  }\n\n\t  return ret;\n\t}\n\n\tvar irfft = op({\n\t  irfft_: irfft_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Splits a `tf.Tensor` into sub tensors.\n\t *\n\t * If `numOrSizeSplits` is a number, splits `x` along dimension `axis`\n\t * into `numOrSizeSplits` smaller tensors.\n\t * Requires that `numOrSizeSplits` evenly divides `x.shape[axis]`.\n\t *\n\t * If `numOrSizeSplits` is a number array, splits `x` into\n\t * `numOrSizeSplits.length` pieces. The shape of the `i`-th piece has the\n\t * same size as `x` except along dimension `axis` where the size is\n\t * `numOrSizeSplits[i]`.\n\t *\n\t * ```js\n\t * const x = tf.tensor2d([1, 2, 3, 4, 5, 6, 7, 8], [2, 4]);\n\t * const [a, b] = tf.split(x, 2, 1);\n\t * a.print();\n\t * b.print();\n\t *\n\t * const [c, d, e] = tf.split(x, [1, 2, 1], 1);\n\t * c.print();\n\t * d.print();\n\t * e.print();\n\t * ```\n\t *\n\t * @param x The input tensor to split.\n\t * @param numOrSizeSplits Either an integer indicating the number of\n\t * splits along the axis or an array of integers containing the sizes of\n\t * each output tensor along the axis. If a number then it must evenly divide\n\t * `x.shape[axis]`; otherwise the sum of sizes must match `x.shape[axis]`.\n\t * Can contain one -1 indicating that dimension is to be inferred.\n\t * @param axis The dimension along which to split. Defaults to 0 (the first\n\t * dim).\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n\t */\n\n\tfunction split_(x, numOrSizeSplits, axis) {\n\t  if (axis === void 0) {\n\t    axis = 0;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'split');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attr = {\n\t    numOrSizeSplits: numOrSizeSplits,\n\t    axis: axis\n\t  };\n\t  return ENGINE.runKernel(SplitV, inputs, attr);\n\t}\n\n\tvar split$1 = op({\n\t  split_: split_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Real value input fast Fourier transform.\n\t *\n\t * Computes the 1-dimensional discrete Fourier transform over the\n\t * inner-most dimension of the real input.\n\t *\n\t * ```js\n\t * const real = tf.tensor1d([1, 2, 3]);\n\t *\n\t * real.rfft().print();\n\t * ```\n\t * @param input The real value input to compute an rfft over.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Spectral', namespace: 'spectral'}\n\t */\n\n\tfunction rfft_(input, fftLength) {\n\t  assert(input.dtype === 'float32', function () {\n\t    return \"The dtype for rfft() must be real value but got \" + input.dtype;\n\t  });\n\t  var innerDimensionSize = input.shape[input.shape.length - 1];\n\t  var batch = input.size / innerDimensionSize;\n\t  var adjustedInput;\n\n\t  if (fftLength != null && fftLength < innerDimensionSize) {\n\t    // Need to crop\n\t    var begin = input.shape.map(function (v) {\n\t      return 0;\n\t    });\n\t    var size = input.shape.map(function (v) {\n\t      return v;\n\t    });\n\t    size[input.shape.length - 1] = fftLength;\n\t    adjustedInput = slice$2(input, begin, size);\n\t    innerDimensionSize = fftLength;\n\t  } else if (fftLength != null && fftLength > innerDimensionSize) {\n\t    // Need to pad with zeros\n\t    var zerosShape = input.shape.map(function (v) {\n\t      return v;\n\t    });\n\t    zerosShape[input.shape.length - 1] = fftLength - innerDimensionSize;\n\t    adjustedInput = concat([input, zeros(zerosShape)], input.shape.length - 1);\n\t    innerDimensionSize = fftLength;\n\t  } else {\n\t    adjustedInput = input;\n\t  } // Complement the input with zero imaginary numbers.\n\n\n\t  var zerosInput = zerosLike(adjustedInput);\n\t  var complexInput = reshape(complex(adjustedInput, zerosInput), [batch, innerDimensionSize]);\n\t  var ret = fft(complexInput); // Exclude complex conjugations. These conjugations are put symmetrically.\n\n\t  var half = Math.floor(innerDimensionSize / 2) + 1;\n\t  var realValues = real(ret);\n\t  var imagValues = imag(ret);\n\t  var realComplexConjugate = split$1(realValues, [half, innerDimensionSize - half], realValues.shape.length - 1);\n\t  var imagComplexConjugate = split$1(imagValues, [half, innerDimensionSize - half], imagValues.shape.length - 1);\n\t  var outputShape = adjustedInput.shape.slice();\n\t  outputShape[adjustedInput.shape.length - 1] = half;\n\t  return reshape(complex(realComplexConjugate[0], imagComplexConjugate[0]), outputShape);\n\t}\n\n\tvar rfft = op({\n\t  rfft_: rfft_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes square root of the input `tf.Tensor` element-wise: `y = sqrt(x)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 4, -1]);\n\t *\n\t * x.sqrt().print();  // or tf.sqrt(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction sqrt_(x) {\n\t  var $x = convertToTensor(x, 'x', 'sqrt');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Sqrt, inputs);\n\t}\n\n\tvar sqrt$3 = op({\n\t  sqrt_: sqrt_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Returns (a - b) * (a - b) element-wise.\n\t * Supports broadcasting.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 4, 3, 16]);\n\t * const b = tf.tensor1d([1, 2, 9, 4]);\n\t *\n\t * a.squaredDifference(b).print();  // or tf.squaredDifference(a, b)\n\t * ```\n\t *\n\t * ```js\n\t * // Broadcast squared difference  a with b.\n\t * const a = tf.tensor1d([2, 4, 6, 8]);\n\t * const b = tf.scalar(5);\n\t *\n\t * a.squaredDifference(b).print();  // or tf.squaredDifference(a, b)\n\t * ```\n\t *\n\t * @param a The first tensor.\n\t * @param b The second tensor. Must have the same type as `a`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n\t */\n\n\tfunction squaredDifference_(a, b) {\n\t  var $a = convertToTensor(a, 'a', 'squaredDifference');\n\t  var $b = convertToTensor(b, 'b', 'squaredDifference');\n\n\t  var _makeTypesMatch = makeTypesMatch($a, $b);\n\n\t  $a = _makeTypesMatch[0];\n\t  $b = _makeTypesMatch[1];\n\t  assertAndGetBroadcastShape($a.shape, $b.shape);\n\t  var inputs = {\n\t    a: $a,\n\t    b: $b\n\t  };\n\t  var attrs = {};\n\t  return ENGINE.runKernel(SquaredDifference, inputs, attrs);\n\t}\n\n\tvar squaredDifference = op({\n\t  squaredDifference_: squaredDifference_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Removes dimensions of size 1 from the shape of a `tf.Tensor`.\n\t *\n\t * ```js\n\t * const x = tf.tensor([1, 2, 3, 4], [1, 1, 4]);\n\t * x.squeeze().print();\n\t * ```\n\t *\n\t * @param x The input tensor to be squeezed.\n\t * @param axis An optional list of numbers. If specified, only\n\t *     squeezes the dimensions listed. The dimension index starts at 0. It\n\t * is an error to squeeze a dimension that is not 1.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Transformations'}\n\t */\n\n\tfunction squeeze_(x, axis) {\n\t  var $x = convertToTensor(x, 'x', 'squeeze');\n\t  return reshape($x, squeezeShape($x.shape, axis).newShape);\n\t}\n\n\tvar squeeze = op({\n\t  squeeze_: squeeze_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Stacks a list of rank-`R` `tf.Tensor`s into one rank-`(R+1)` `tf.Tensor`.\n\t *\n\t * ```js\n\t * const a = tf.tensor1d([1, 2]);\n\t * const b = tf.tensor1d([3, 4]);\n\t * const c = tf.tensor1d([5, 6]);\n\t * tf.stack([a, b, c]).print();\n\t * ```\n\t *\n\t * @param tensors A list of tensor objects with the same shape and dtype.\n\t * @param axis The axis to stack along. Defaults to 0 (the first dim).\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n\t */\n\n\tfunction stack_(tensors, axis) {\n\t  if (axis === void 0) {\n\t    axis = 0;\n\t  }\n\n\t  var $tensors = convertToTensorArray(tensors, 'tensors', 'stack', 'string_or_numeric');\n\t  assert($tensors.length >= 1, function () {\n\t    return 'Pass at least one tensor to tf.stack';\n\t  });\n\n\t  if ($tensors.length > 0) {\n\t    assert(axis <= $tensors[0].rank, function () {\n\t      return 'Axis must be <= rank of the tensor';\n\t    });\n\t  }\n\n\t  var inputs = $tensors;\n\t  var attrs = {\n\t    axis: axis\n\t  };\n\t  return ENGINE.runKernel(Pack, inputs, attrs);\n\t}\n\n\tvar stack = op({\n\t  stack_: stack_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes step of the input `tf.Tensor` element-wise: `x > 0 ? 1 : alpha * x`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([0, 2, -1, -3]);\n\t *\n\t * x.step(.5).print();  // or tf.step(x, .5)\n\t * ```\n\t * @param x The input tensor.\n\t * @param alpha The gradient when input is negative.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction step_(x, alpha) {\n\t  if (alpha === void 0) {\n\t    alpha = 0.0;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'step');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    alpha: alpha\n\t  };\n\t  return ENGINE.runKernel(Step, inputs, attrs);\n\t}\n\n\tvar step = op({\n\t  step_: step_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Extracts a strided slice of a tensor.\n\t *\n\t * Roughly speaking, this op extracts a slice of size (end-begin)/stride from\n\t * the given input tensor (x). Starting at the location specified by begin the\n\t * slice continues by adding stride to the index until all dimensions are not\n\t * less than end. Note that a stride can be negative, which causes a reverse\n\t * slice.\n\t *\n\t * ```js\n\t * const t = tf.tensor3d([1, 1, 1 ,2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6],\n\t *    [3, 2, 3]);\n\t * t.stridedSlice([1, 0, 0], [2, 1, 3], [1, 1, 1]).print()  // [[[3, 3, 3]]]\n\t * t.stridedSlice([1, 0, 0], [2, 2, 3], [1, 1, 1]).print()  // [[[3, 3, 3],\n\t *                                                     // [4, 4, 4]]]\n\t * t.stridedSlice([1, -1, 0], [2, -3, 3], [1, -1, 1]).print() // [[[4, 4, 4],\n\t *                                                     // [3, 3, 3]]]\n\t * ```\n\t *\n\t * @param x The tensor to stride slice.\n\t * @param begin The coordinates to start the slice from.\n\t * @param end: The coordinates to end the slice at.\n\t * @param strides: The size of the slice.\n\t * @param beginMask: If the ith bit of beginMask is set, begin[i] is ignored\n\t *      and the fullest possible range in that dimension is used instead.\n\t * @param endMask: If the ith bit of endMask is set, end[i] is ignored\n\t *      and the fullest possible range in that dimension is used instead.\n\t * @param shrinkAxisMask: a bitmask where bit i implies that\n\t * the ith specification should shrink the dimensionality. begin and end must\n\t * imply a slice of size 1 in the dimension.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Slicing and Joining'}\n\t */\n\n\tfunction stridedSlice_(x, begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask) {\n\t  if (beginMask === void 0) {\n\t    beginMask = 0;\n\t  }\n\n\t  if (endMask === void 0) {\n\t    endMask = 0;\n\t  }\n\n\t  if (ellipsisMask === void 0) {\n\t    ellipsisMask = 0;\n\t  }\n\n\t  if (newAxisMask === void 0) {\n\t    newAxisMask = 0;\n\t  }\n\n\t  if (shrinkAxisMask === void 0) {\n\t    shrinkAxisMask = 0;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'stridedSlice');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    begin: begin,\n\t    end: end,\n\t    strides: strides,\n\t    beginMask: beginMask,\n\t    endMask: endMask,\n\t    ellipsisMask: ellipsisMask,\n\t    newAxisMask: newAxisMask,\n\t    shrinkAxisMask: shrinkAxisMask\n\t  };\n\t  return ENGINE.runKernel(StridedSlice, inputs, attrs);\n\t}\n\n\tvar stridedSlice = op({\n\t  stridedSlice_: stridedSlice_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes tan of the input `tf.Tensor` element-wise, `tan(x)`\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([0, Math.PI / 2, Math.PI * 3 / 4]);\n\t *\n\t * x.tan().print();  // or tf.tan(x)\n\t * ```\n\t * @param x The input tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Basic math'}\n\t */\n\n\tfunction tan_(x) {\n\t  var $x = convertToTensor(x, 'x', 'tan');\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  return ENGINE.runKernel(Tan, inputs);\n\t}\n\n\tvar tan = op({\n\t  tan_: tan_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates rank-1 `tf.Tensor` with the provided values, shape and dtype.\n\t *\n\t * The same functionality can be achieved with `tf.tensor`, but in general\n\t * we recommend using `tf.tensor1d` as it makes the code more readable.\n\t *\n\t * ```js\n\t * tf.tensor1d([1, 2, 3]).print();\n\t * ```\n\t *\n\t * @param values The values of the tensor. Can be array of numbers,\n\t *     or a `TypedArray`.\n\t * @param dtype The data type.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction tensor1d(values, dtype) {\n\t  assertNonNull(values);\n\t  var inferredShape = inferShape(values, dtype);\n\n\t  if (inferredShape.length !== 1) {\n\t    throw new Error('tensor1d() requires values to be a flat/TypedArray');\n\t  }\n\n\t  var shape = null;\n\t  return makeTensor(values, shape, inferredShape, dtype);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates rank-2 `tf.Tensor` with the provided values, shape and dtype.\n\t *\n\t * The same functionality can be achieved with `tf.tensor`, but in general\n\t * we recommend using `tf.tensor2d` as it makes the code more readable.\n\t *\n\t *  ```js\n\t * // Pass a nested array.\n\t * tf.tensor2d([[1, 2], [3, 4]]).print();\n\t * ```\n\t * ```js\n\t * // Pass a flat array and specify a shape.\n\t * tf.tensor2d([1, 2, 3, 4], [2, 2]).print();\n\t * ```\n\t *\n\t * @param values The values of the tensor. Can be nested array of numbers,\n\t *     or a flat array, or a `TypedArray`.\n\t * @param shape The shape of the tensor. If not provided, it is inferred from\n\t *     `values`.\n\t * @param dtype The data type.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction tensor2d(values, shape, dtype) {\n\t  assertNonNull(values);\n\n\t  if (shape != null && shape.length !== 2) {\n\t    throw new Error('tensor2d() requires shape to have two numbers');\n\t  }\n\n\t  var inferredShape = inferShape(values, dtype);\n\n\t  if (inferredShape.length !== 2 && inferredShape.length !== 1) {\n\t    throw new Error('tensor2d() requires values to be number[][] or flat/TypedArray');\n\t  }\n\n\t  if (inferredShape.length === 1 && shape == null) {\n\t    throw new Error('tensor2d() requires shape to be provided when `values` ' + 'are a flat/TypedArray');\n\t  }\n\n\t  return makeTensor(values, shape, inferredShape, dtype);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates rank-4 `tf.Tensor` with the provided values, shape and dtype.\n\t *\n\t * The same functionality can be achieved with `tf.tensor`, but in general\n\t * we recommend using `tf.tensor4d` as it makes the code more readable.\n\t *\n\t *  ```js\n\t * // Pass a nested array.\n\t * tf.tensor4d([[[[1], [2]], [[3], [4]]]]).print();\n\t * ```\n\t * ```js\n\t * // Pass a flat array and specify a shape.\n\t * tf.tensor4d([1, 2, 3, 4], [1, 2, 2, 1]).print();\n\t * ```\n\t *\n\t * @param values The values of the tensor. Can be nested array of numbers,\n\t *     or a flat array, or a `TypedArray`.\n\t * @param shape The shape of the tensor. Optional. If not provided,\n\t *   it is inferred from `values`.\n\t * @param dtype The data type.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction tensor4d(values, shape, dtype) {\n\t  assertNonNull(values);\n\n\t  if (shape != null && shape.length !== 4) {\n\t    throw new Error('tensor4d() requires shape to have four numbers');\n\t  }\n\n\t  var inferredShape = inferShape(values, dtype);\n\n\t  if (inferredShape.length !== 4 && inferredShape.length !== 1) {\n\t    throw new Error('tensor4d() requires values to be number[][][][] or flat/TypedArray');\n\t  }\n\n\t  if (inferredShape.length === 1 && shape == null) {\n\t    throw new Error('tensor4d() requires shape to be provided when `values` ' + 'are a flat array');\n\t  }\n\n\t  return makeTensor(values, shape, inferredShape, dtype);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates rank-5 `tf.Tensor` with the provided values, shape and dtype.\n\t *\n\t * The same functionality can be achieved with `tf.tensor`, but in general\n\t * we recommend using `tf.tensor5d` as it makes the code more readable.\n\t *\n\t *  ```js\n\t * // Pass a nested array.\n\t * tf.tensor5d([[[[[1],[2]],[[3],[4]]],[[[5],[6]],[[7],[8]]]]]).print();\n\t * ```\n\t * ```js\n\t * // Pass a flat array and specify a shape.\n\t * tf.tensor5d([1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 2, 2, 1]).print();\n\t * ```\n\t *\n\t * @param values The values of the tensor. Can be nested array of numbers,\n\t *     or a flat array, or a `TypedArray`.\n\t * @param shape The shape of the tensor. Optional. If not provided,\n\t *   it is inferred from `values`.\n\t * @param dtype The data type.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction tensor5d(values, shape, dtype) {\n\t  assertNonNull(values);\n\n\t  if (shape != null && shape.length !== 5) {\n\t    throw new Error('tensor5d() requires shape to have five numbers');\n\t  }\n\n\t  var inferredShape = inferShape(values, dtype);\n\n\t  if (inferredShape.length !== 5 && inferredShape.length !== 1) {\n\t    throw new Error('tensor5d() requires values to be ' + 'number[][][][][] or flat/TypedArray');\n\t  }\n\n\t  if (inferredShape.length === 1 && shape == null) {\n\t    throw new Error('tensor5d() requires shape to be provided when `values` ' + 'are a flat array');\n\t  }\n\n\t  return makeTensor(values, shape, inferredShape, dtype);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates rank-6 `tf.Tensor` with the provided values, shape and dtype.\n\t *\n\t * The same functionality can be achieved with `tf.tensor`, but in general\n\t * we recommend using `tf.tensor6d` as it makes the code more readable.\n\t *\n\t *  ```js\n\t * // Pass a nested array.\n\t * tf.tensor6d([[[[[[1],[2]],[[3],[4]]],[[[5],[6]],[[7],[8]]]]]]).print();\n\t * ```\n\t * ```js\n\t * // Pass a flat array and specify a shape.\n\t * tf.tensor6d([1, 2, 3, 4, 5, 6, 7, 8], [1, 1, 2, 2, 2, 1]).print();\n\t * ```\n\t *\n\t * @param values The values of the tensor. Can be nested array of numbers,\n\t *     or a flat array, or a `TypedArray`.\n\t * @param shape The shape of the tensor. Optional. If not provided,\n\t *   it is inferred from `values`.\n\t * @param dtype The data type.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction tensor6d(values, shape, dtype) {\n\t  assertNonNull(values);\n\n\t  if (shape != null && shape.length !== 6) {\n\t    throw new Error('tensor6d() requires shape to have six numbers');\n\t  }\n\n\t  var inferredShape = inferShape(values, dtype);\n\n\t  if (inferredShape.length !== 6 && inferredShape.length !== 1) {\n\t    throw new Error('tensor6d() requires values to be number[][][][][][] or ' + 'flat/TypedArray');\n\t  }\n\n\t  if (inferredShape.length === 1 && shape == null) {\n\t    throw new Error('tensor6d() requires shape to be provided when `values` ' + 'are a flat array');\n\t  }\n\n\t  shape = shape || inferredShape;\n\t  return makeTensor(values, shape, inferredShape, dtype);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Finds the values and indices of the `k` largest entries along the last\n\t * dimension.\n\t *\n\t * If the input is a vector (rank=1), finds the k largest entries in the vector\n\t * and outputs their values and indices as vectors. Thus values[j] is the j-th\n\t * largest entry in input, and its index is indices[j].\n\t * For higher rank inputs, computes the top k entries along the last dimension.\n\t *\n\t * If two elements are equal, the lower-index element appears first.\n\t *\n\t * ```js\n\t * const a = tf.tensor2d([[1, 5], [4, 3]]);\n\t * const {values, indices} = tf.topk(a);\n\t * values.print();\n\t * indices.print();\n\t * ```\n\t * @param x 1-D or higher `tf.Tensor` with last dimension being at least `k`.\n\t * @param k Number of top elements to look for along the last dimension.\n\t * @param sorted If true, the resulting `k` elements will be sorted by the\n\t *     values in descending order.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Evaluation'}\n\t */\n\n\tfunction topk_(x, k, sorted) {\n\t  if (k === void 0) {\n\t    k = 1;\n\t  }\n\n\t  if (sorted === void 0) {\n\t    sorted = true;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'topk');\n\n\t  if ($x.rank === 0) {\n\t    throw new Error('topk() expects the input to be of rank 1 or higher');\n\t  }\n\n\t  var lastDim = $x.shape[$x.shape.length - 1];\n\n\t  if (k > lastDim) {\n\t    throw new Error(\"'k' passed to topk() must be <= the last dimension (\" + lastDim + \") \" + (\"but got \" + k));\n\t  }\n\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    k: k,\n\t    sorted: sorted\n\t  };\n\n\t  var _ENGINE$runKernel = ENGINE.runKernel(TopK, inputs, attrs),\n\t      values = _ENGINE$runKernel[0],\n\t      indices = _ENGINE$runKernel[1];\n\n\t  return {\n\t    values: values,\n\t    indices: indices\n\t  };\n\t}\n\n\tvar topk = op({\n\t  topk_: topk_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates a `tf.Tensor` with values sampled from a truncated normal\n\t * distribution.\n\t *\n\t * ```js\n\t * tf.truncatedNormal([2, 2]).print();\n\t * ```\n\t *\n\t * The generated values follow a normal distribution with specified mean and\n\t * standard deviation, except that values whose magnitude is more than 2\n\t * standard deviations from the mean are dropped and re-picked.\n\t *\n\t * @param shape An array of integers defining the output tensor shape.\n\t * @param mean The mean of the normal distribution.\n\t * @param stdDev The standard deviation of the normal distribution.\n\t * @param dtype The data type of the output tensor.\n\t * @param seed The seed for the random number generator.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction truncatedNormal_(shape, mean, stdDev, dtype, seed) {\n\t  if (mean === void 0) {\n\t    mean = 0;\n\t  }\n\n\t  if (stdDev === void 0) {\n\t    stdDev = 1;\n\t  }\n\n\t  if (dtype != null && dtype === 'bool') {\n\t    throw new Error(\"Unsupported data type $ { dtype }\");\n\t  }\n\n\t  var randGauss = new MPRandGauss(mean, stdDev, dtype, true\n\t  /* truncated */\n\t  , seed);\n\t  var res = buffer(shape, dtype);\n\n\t  for (var i = 0; i < res.values.length; i++) {\n\t    res.values[i] = randGauss.nextValue();\n\t  }\n\n\t  return res.toTensor();\n\t}\n\n\tvar truncatedNormal = op({\n\t  truncatedNormal_: truncatedNormal_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Finds unique elements along an axis of a tensor.\n\t *\n\t * It returns a tensor `values` containing all of the unique elements along the\n\t * `axis` of the given tensor `x` in the same order that they occur along the\n\t * `axis` in `x`; `x` does not need to be sorted. It also returns a tensor\n\t * `indices` the same size as the number of the elements in `x` along the `axis`\n\t * dimension. It contains the index in the unique output `values`.\n\t *\n\t * ```js\n\t * // A 1-D tensor\n\t * const a = tf.tensor1d([1, 1, 2, 4, 4, 4, 7, 8, 8]);\n\t * const {values, indices} = tf.unique(a);\n\t * values.print();   // [1, 2, 4, 7, 8,]\n\t * indices.print();  // [0, 0, 1, 2, 2, 2, 3, 4, 4]\n\t * ```\n\t *\n\t * ```js\n\t * // A 2-D tensor with axis=0\n\t * //\n\t * // 'a' is: [[1, 0, 0],\n\t * //          [1, 0, 0],\n\t * //          [2, 0, 0]]\n\t * const a = tf.tensor2d([[1, 0, 0], [1, 0, 0], [2, 0, 0]]);\n\t * const {values, indices} = tf.unique(a, 0)\n\t * values.print();   // [[1, 0, 0],\n\t *                   //  [2, 0, 0]]\n\t * indices.print();  // [0, 0, 1]\n\t * ```\n\t *\n\t * ```js\n\t * // A 2-D tensor with axis=1\n\t * //\n\t * // 'a' is: [[1, 0, 0],\n\t * //          [1, 0, 0],\n\t * //          [2, 0, 0]]\n\t * const a = tf.tensor2d([[1, 0, 0], [1, 0, 0], [2, 0, 0]]);\n\t * const {values, indices} = tf.unique(a, 1)\n\t * values.print();   // [[1, 0],\n\t *                   //  [1, 0],\n\t *                   //  [2, 0]]\n\t * indices.print();  // [0, 1, 1]\n\t * ```\n\t * @param x A tensor (int32, string, bool).\n\t * @param axis The axis of the tensor to find the unique elements.\n\t * @returns [uniqueElements, indices] (see above for details)\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Evaluation'}\n\t */\n\n\tfunction unique_(x, axis) {\n\t  if (axis === void 0) {\n\t    axis = 0;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'unique', 'string_or_numeric');\n\t  assert($x.rank > 0, function () {\n\t    return 'The input tensor must be at least 1D';\n\t  });\n\t  var inputs = {\n\t    x: $x\n\t  };\n\t  var attrs = {\n\t    axis: axis\n\t  };\n\n\t  var _ENGINE$runKernel = ENGINE.runKernel(Unique, inputs, attrs),\n\t      values = _ENGINE$runKernel[0],\n\t      indices = _ENGINE$runKernel[1];\n\n\t  return {\n\t    values: values,\n\t    indices: indices\n\t  };\n\t}\n\n\tvar unique = op({\n\t  unique_: unique_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the sum along segments of a `tf.Tensor`.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 3, 4]);\n\t * const segmentIds = tf.tensor1d([1, 2, 0, 1], 'int32');\n\t * const numSegments = 3;\n\t *\n\t * x.unsortedSegmentSum(segmentIds, numSegments).print()\n\t * //or tf.unsortedSegmentSum(x, segmentIds, numSegments)\n\t * ```\n\t * @param x The `tf.Tensor` that will be summed along its segments.\n\t * @param segmentIds A `tf.Tensor1D` whose rank is equal to the rank of `x`'s\n\t * dimension along the `axis`.  Maps each element of `x` to a segment.\n\t * @param numSegments The number of distinct `segmentIds`.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Segment'}\n\t */\n\n\tfunction unsortedSegmentSum_(x, segmentIds, numSegments) {\n\t  var $x = convertToTensor(x, 'x', 'unsortedSegmentSum');\n\t  var $segmentIds = convertToTensor(segmentIds, 'segmentIds', 'unsortedSegmentSum', 'int32');\n\t  assert(isInt(numSegments), function () {\n\t    return 'numSegments must be of dtype int';\n\t  });\n\t  var inputs = {\n\t    x: $x,\n\t    segmentIds: $segmentIds\n\t  };\n\t  var attrs = {\n\t    numSegments: numSegments\n\t  };\n\t  return ENGINE.runKernel(UnsortedSegmentSum, inputs, attrs);\n\t}\n\n\tvar unsortedSegmentSum = op({\n\t  unsortedSegmentSum_: unsortedSegmentSum_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Unstacks a `tf.Tensor` of rank-`R` into a list of rank-`(R-1)` `tf.Tensor`s.\n\t *\n\t * ```js\n\t * const a = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n\t *\n\t * tf.unstack(a).forEach(tensor => tensor.print());\n\t * ```\n\t *\n\t * @param x A tensor object.\n\t * @param axis The axis to unstack along. Defaults to 0 (the first dim).\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n\t */\n\n\tfunction unstack_(x, axis) {\n\t  if (axis === void 0) {\n\t    axis = 0;\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'unstack', 'string_or_numeric');\n\t  assert(axis >= -$x.shape.length && axis < $x.shape.length, function () {\n\t    return \"Axis = \" + axis + \" is not in [-\" + $x.shape.length + \", \" + $x.shape.length + \")\";\n\t  });\n\t  var inputs = {\n\t    value: $x\n\t  };\n\t  var attrs = {\n\t    axis: axis\n\t  };\n\t  return ENGINE.runKernel(Unpack, inputs, attrs);\n\t}\n\n\tvar unstack = op({\n\t  unstack_: unstack_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates a new variable with the provided initial value.\n\t * ```js\n\t * const x = tf.variable(tf.tensor([1, 2, 3]));\n\t * x.assign(tf.tensor([4, 5, 6]));\n\t *\n\t * x.print();\n\t * ```\n\t *\n\t * @param initialValue Initial value for the tensor.\n\t * @param trainable If true, optimizers are allowed to update it.\n\t * @param name Name of the variable. Defaults to a unique id.\n\t * @param dtype If set, initialValue will be converted to the given type.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Creation'}\n\t */\n\n\tfunction variable(initialValue, trainable, name, dtype) {\n\t  if (trainable === void 0) {\n\t    trainable = true;\n\t  }\n\n\t  return ENGINE.makeVariable(initialValue, trainable, name, dtype);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction whereImpl(condShape, condVals) {\n\t  var indices = [];\n\n\t  for (var i = 0; i < condVals.length; i++) {\n\t    if (condVals[i]) {\n\t      indices.push(i);\n\t    }\n\t  }\n\n\t  var inBuffer = buffer(condShape, 'int32');\n\t  var out = buffer([indices.length, condShape.length], 'int32');\n\n\t  for (var _i = 0; _i < indices.length; _i++) {\n\t    var loc = inBuffer.indexToLoc(indices[_i]);\n\t    var offset = _i * condShape.length;\n\t    out.values.set(loc, offset);\n\t  }\n\n\t  return out.toTensor();\n\t}\n\n\t/**\n\t * Returns the coordinates of true elements of condition.\n\t *\n\t * The coordinates are returned in a 2-D tensor where the first dimension (rows)\n\t * represents the number of true elements, and the second dimension (columns)\n\t * represents the coordinates of the true elements. Keep in mind, the shape of\n\t * the output tensor can vary depending on how many true values there are in\n\t * input. Indices are output in row-major order. The resulting tensor has the\n\t * shape `[numTrueElems, condition.rank]`.\n\t *\n\t * This is analogous to calling the python `tf.where(cond)` without an x or y.\n\t *\n\t * ```js\n\t * const cond = tf.tensor1d([false, false, true], 'bool');\n\t * const result = await tf.whereAsync(cond);\n\t * result.print();\n\t * ```\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Logical'}\n\t */\n\n\tfunction whereAsync_(_x) {\n\t  return _whereAsync_.apply(this, arguments);\n\t}\n\n\tfunction _whereAsync_() {\n\t  _whereAsync_ = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(condition) {\n\t    var $condition, vals, res;\n\t    return regeneratorRuntime.wrap(function _callee$(_context) {\n\t      while (1) {\n\t        switch (_context.prev = _context.next) {\n\t          case 0:\n\t            $condition = convertToTensor(condition, 'condition', 'whereAsync', 'bool');\n\t            _context.next = 3;\n\t            return $condition.data();\n\n\t          case 3:\n\t            vals = _context.sent;\n\t            res = whereImpl($condition.shape, vals);\n\n\t            if (condition !== $condition) {\n\t              $condition.dispose();\n\t            }\n\n\t            return _context.abrupt(\"return\", res);\n\n\t          case 7:\n\t          case \"end\":\n\t            return _context.stop();\n\t        }\n\t      }\n\t    }, _callee);\n\t  }));\n\t  return _whereAsync_.apply(this, arguments);\n\t}\n\n\tvar whereAsync = whereAsync_;\n\n\t/**\n\t * Apply boolean mask to tensor.\n\t *\n\t * ```js\n\t * const tensor = tf.tensor2d([1, 2, 3, 4, 5, 6], [3, 2]);\n\t * const mask = tf.tensor1d([1, 0, 1], 'bool');\n\t * const result = await tf.booleanMaskAsync(tensor, mask);\n\t * result.print();\n\t * ```\n\t *\n\t * @param tensor N-D tensor.\n\t * @param mask K-D boolean tensor, K <= N and K must be known statically.\n\t * @param axis A 0-D int Tensor representing the axis in tensor to mask from.\n\t *     By default, axis is 0 which will mask from the first dimension.\n\t *     Otherwise K + axis <= N.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n\t */\n\n\tfunction booleanMaskAsync_(_x, _x2, _x3) {\n\t  return _booleanMaskAsync_.apply(this, arguments);\n\t}\n\n\tfunction _booleanMaskAsync_() {\n\t  _booleanMaskAsync_ = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(tensor, mask, axis) {\n\t    var $tensor, $mask, axisFrom, maskDim, tensorShape, leadingSize, i, targetTensorShape, reshapedTensor, reshapedMask, positivePositions, indices, res;\n\t    return regeneratorRuntime.wrap(function _callee$(_context) {\n\t      while (1) {\n\t        switch (_context.prev = _context.next) {\n\t          case 0:\n\t            $tensor = convertToTensor(tensor, 'tensor', 'boolMask');\n\t            $mask = convertToTensor(mask, 'mask', 'boolMask', 'bool');\n\t            axisFrom = axis == null ? 0 : axis;\n\t            maskDim = $mask.rank;\n\t            tensorShape = $tensor.shape;\n\t            assert(maskDim > 0, function () {\n\t              return 'mask cannot be scalar';\n\t            });\n\t            assertShapesMatch(tensorShape.slice(axisFrom, axisFrom + maskDim), $mask.shape, \"mask's shape must match the first K dimensions of tensor's shape,\");\n\t            leadingSize = 1;\n\n\t            for (i = axisFrom; i < axisFrom + maskDim; i++) {\n\t              leadingSize *= tensorShape[i];\n\t            }\n\n\t            targetTensorShape = tensorShape.slice(0, axisFrom).concat([leadingSize], tensorShape.slice(axisFrom + maskDim));\n\t            reshapedTensor = reshape($tensor, targetTensorShape);\n\t            reshapedMask = reshape($mask, [-1]);\n\t            _context.next = 14;\n\t            return whereAsync(reshapedMask);\n\n\t          case 14:\n\t            positivePositions = _context.sent;\n\t            indices = squeeze(positivePositions, [1]);\n\t            res = gather(reshapedTensor, indices, axisFrom); // Ensure no memory leak.\n\n\t            if (tensor !== $tensor) {\n\t              $tensor.dispose();\n\t            }\n\n\t            if (mask !== $mask) {\n\t              $mask.dispose();\n\t            }\n\n\t            indices.dispose();\n\t            reshapedTensor.dispose();\n\t            reshapedMask.dispose();\n\t            positivePositions.dispose();\n\t            return _context.abrupt(\"return\", res);\n\n\t          case 24:\n\t          case \"end\":\n\t            return _context.stop();\n\t        }\n\t      }\n\t    }, _callee);\n\t  }));\n\t  return _booleanMaskAsync_.apply(this, arguments);\n\t}\n\n\tvar booleanMaskAsync = booleanMaskAsync_;\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * @deprecated\n\t * Strict version of `tf.notEqual` that forces `a` and `b` to be of the same\n\t * shape.\n\t *\n\t * @param a The first input tensor.\n\t * @param b The second input tensor. Must have the same shape and dtype as\n\t *     `a`.\n\t */\n\n\tfunction notEqualStrict_(a, b) {\n\t  deprecationWarn('strict variants of ops have been deprecated ' + 'and will be removed in future');\n\t  var $a = convertToTensor(a, 'a', 'notEqualStrict');\n\t  var $b = convertToTensor(b, 'b', 'notEqualStrict');\n\t  assertShapesMatch($a.shape, $b.shape, 'Error in notEqualStrict: ');\n\t  return notEqual($a, $b);\n\t}\n\t/**\n\t * @deprecated\n\t * Strict version of `tf.less` that forces `a` and `b` to be of the same\n\t * shape.\n\t *\n\t * @param a The first input tensor.\n\t * @param b The second input tensor. Must have the same shape and dtype as\n\t *     `a`.\n\t */\n\n\n\tfunction lessStrict_(a, b) {\n\t  deprecationWarn('strict variants of ops have been deprecated ' + 'and will be removed in future');\n\t  var $a = convertToTensor(a, 'a', 'lessStrict');\n\t  var $b = convertToTensor(b, 'b', 'lessStrict');\n\t  assertShapesMatch($a.shape, $b.shape, 'Error in lessStrict: ');\n\t  return less($a, $b);\n\t}\n\n\tfunction equalStrict_(a, b) {\n\t  deprecationWarn('strict variants of ops have been deprecated ' + 'and will be removed in future');\n\t  var $a = convertToTensor(a, 'a', 'equalStrict');\n\t  var $b = convertToTensor(b, 'b', 'equalStrict');\n\t  assertShapesMatch($a.shape, $b.shape, 'Error in equalStrict: ');\n\t  return equal($a, $b);\n\t}\n\n\tfunction lessEqualStrict_(a, b) {\n\t  deprecationWarn('strict variants of ops have been deprecated ' + 'and will be removed in future');\n\t  var $a = convertToTensor(a, 'a', 'lessEqualStrict');\n\t  var $b = convertToTensor(b, 'b', 'lessEqualStrict');\n\t  assertShapesMatch($a.shape, $b.shape, 'Error in lessEqualStrict: ');\n\t  return lessEqual($a, $b);\n\t}\n\n\tfunction greaterStrict_(a, b) {\n\t  deprecationWarn('strict variants of ops have been deprecated ' + 'and will be removed in future');\n\t  var $a = convertToTensor(a, 'a', 'greaterStrict');\n\t  var $b = convertToTensor(b, 'b', 'greaterStrict');\n\t  assertShapesMatch($a.shape, $b.shape, 'Error in greaterStrict: ');\n\t  return greater($a, $b);\n\t}\n\n\tfunction greaterEqualStrict_(a, b) {\n\t  deprecationWarn('strict variants of ops have been deprecated ' + 'and will be removed in future');\n\t  var $a = convertToTensor(a, 'a', 'greaterEqualStrict');\n\t  var $b = convertToTensor(b, 'b', 'greaterEqualStrict');\n\t  assertShapesMatch($a.shape, $b.shape, 'Error in greaterEqualStrict: ');\n\t  return greaterEqual($a, $b);\n\t}\n\n\tvar equalStrict = op({\n\t  equalStrict_: equalStrict_\n\t});\n\tvar greaterEqualStrict = op({\n\t  greaterEqualStrict_: greaterEqualStrict_\n\t});\n\tvar greaterStrict = op({\n\t  greaterStrict_: greaterStrict_\n\t});\n\tvar lessEqualStrict = op({\n\t  lessEqualStrict_: lessEqualStrict_\n\t});\n\tvar lessStrict = op({\n\t  lessStrict_: lessStrict_\n\t});\n\tvar notEqualStrict = op({\n\t  notEqualStrict_: notEqualStrict_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * @deprecated\n\t * Adds two `tf.Tensor`s element-wise, A + B.\n\t *\n\t * Inputs must be the same shape. For broadcasting support, use add() instead.\n\t *\n\t * @param a The first Tensor to add element-wise.\n\t * @param b The second Tensor to add element-wise.\n\t */\n\n\tfunction addStrict_(a, b) {\n\t  deprecationWarn('strict variants of ops have been deprecated ' + 'and will be removed in future');\n\t  var $a = convertToTensor(a, 'a', 'addStrict');\n\t  var $b = convertToTensor(b, 'b', 'addStrict');\n\t  assertShapesMatch($a.shape, $b.shape, 'Error in addStrict: ');\n\t  return add$1($a, $b);\n\t}\n\t/**\n\t * @deprecated\n\t * Subtracts two `tf.Tensor`s element-wise, A - B. Inputs must\n\t * be the same shape.\n\t *\n\t * For broadcasting support, use `tf.sub` instead.\n\t *\n\t * @param a The first Tensor to subtract element-wise.\n\t * @param b The second Tensor to subtract element-wise.\n\t */\n\n\n\tfunction subStrict_(a, b) {\n\t  deprecationWarn('strict variants of ops have been deprecated ' + 'and will be removed in future');\n\t  var $a = convertToTensor(a, 'a', 'subStrict');\n\t  var $b = convertToTensor(b, 'b', 'subStrict');\n\t  assertShapesMatch($a.shape, $b.shape, 'Error in subStrict: ');\n\t  return sub($a, $b);\n\t}\n\t/**\n\t * @deprecated\n\t * Computes the power of one `tf.Tensor` to another. Inputs must\n\t * be the same shape.\n\t *\n\t * For broadcasting support, use `tf.pow` instead.\n\t *\n\t * @param base The base tensor to pow element-wise.\n\t * @param exp The exponent tensor to pow element-wise.\n\t */\n\n\n\tfunction powStrict_(base, exp) {\n\t  deprecationWarn('strict variants of ops have been deprecated ' + 'and will be removed in future');\n\t  assertShapesMatch(base.shape, exp.shape, 'Error in powStrict: ');\n\t  return pow$5(base, exp);\n\t}\n\t/**\n\t * @deprecated\n\t * Multiplies two `tf.Tensor`s element-wise, A * B.\n\t *\n\t * Inputs must be the same shape. For broadcasting support, use `tf.mul`.\n\t *\n\t * @param a The first tensor to multiply.\n\t * @param b The first tensor to multiply. Must have the same\n\t *    dtype as `a`.\n\t */\n\n\n\tfunction mulStrict_(a, b) {\n\t  deprecationWarn('strict variants of ops have been deprecated ' + 'and will be removed in future');\n\t  var $a = convertToTensor(a, 'a', 'mul');\n\t  var $b = convertToTensor(b, 'b', 'mul');\n\t  assertShapesMatch($a.shape, $b.shape, 'Error in multiplyStrict: ');\n\t  return mul($a, $b);\n\t}\n\t/**\n\t * @deprecated\n\t * Divides two `tf.Tensor`s element-wise, A / B. Inputs must\n\t * be the same shape.\n\t *\n\t * @param a The first tensor as the numerator for element-wise division.\n\t * @param b The second tensor as the denominator for element-wise division.\n\t */\n\n\n\tfunction divStrict_(a, b) {\n\t  deprecationWarn('strict variants of ops have been deprecated ' + 'and will be removed in future');\n\t  var $a = convertToTensor(a, 'a', 'div');\n\t  var $b = convertToTensor(b, 'b', 'div');\n\t  assertShapesMatch($a.shape, $b.shape, 'Error in divideStrict: ');\n\t  return div($a, $b);\n\t}\n\t/**\n\t * @deprecated\n\t * Returns the mod of a and b (`a < b ? a : b`) element-wise. Inputs must\n\t * be the same shape. For broadcasting support, use mod().\n\t *\n\t * @param a The first tensor.\n\t * @param b The second tensor. Must have the same dtype as `a`.\n\t */\n\n\n\tfunction modStrict_(a, b) {\n\t  deprecationWarn('strict variants of ops have been deprecated ' + 'and will be removed in future');\n\t  var $a = convertToTensor(a, 'a', 'modStrict');\n\t  var $b = convertToTensor(b, 'b', 'modStrict');\n\t  assertShapesMatch($a.shape, $b.shape, 'Error in modStrict: ');\n\t  return mod($a, $b);\n\t}\n\t/**\n\t * @deprecated\n\t * Returns the min of a and b (`a < b ? a : b`) element-wise. Inputs must\n\t * be the same shape. For broadcasting support, use minimum().\n\t *\n\t * @param a The first tensor.\n\t * @param b The second tensor. Must have the same dtype as `a`.\n\t */\n\n\n\tfunction minimumStrict_(a, b) {\n\t  deprecationWarn('strict variants of ops have been deprecated ' + 'and will be removed in future');\n\t  var $a = convertToTensor(a, 'a', 'minimumStrict');\n\t  var $b = convertToTensor(b, 'b', 'minimumStrict');\n\t  assertShapesMatch($a.shape, $b.shape, 'Error in minimumStrict: ');\n\t  return minimum($a, $b);\n\t}\n\t/**\n\t * @deprecated\n\t * Returns the max of a and b (`a > b ? a : b`) element-wise. Inputs must\n\t * be the same shape. For broadcasting support, use maximum().\n\t *\n\t * @param a The first tensor.\n\t * @param b The second tensor. Must have the same dtype as `a`.\n\t */\n\n\n\tfunction maximumStrict_(a, b) {\n\t  deprecationWarn('strict variants of ops have been deprecated ' + 'and will be removed in future');\n\t  var $a = convertToTensor(a, 'a', 'maximumStrict');\n\t  var $b = convertToTensor(b, 'b', 'maximumStrict');\n\t  assertShapesMatch($a.shape, $b.shape, 'Error in maximumStrict: ');\n\t  return maximum($a, $b);\n\t}\n\t/**\n\t * @deprecated\n\t * Returns (a - b) * (a - b) element-wise.\n\t *\n\t * Inputs must be the same shape. For broadcasting support, use\n\t * `tf.squaredDifference` instead.\n\t *\n\t * @param a The first tensor.\n\t * @param b The second tensor. Must have the same type as `a`.\n\t */\n\n\n\tfunction squaredDifferenceStrict_(a, b) {\n\t  deprecationWarn('strict variants of ops have been deprecated ' + 'and will be removed in future');\n\t  var $a = convertToTensor(a, 'a', 'squaredDifferenceStrict');\n\t  var $b = convertToTensor(b, 'b', 'squaredDifferenceStrict');\n\t  assertShapesMatch($a.shape, $b.shape, 'Error in squaredDifferenceStrict: ');\n\t  return squaredDifference($a, $b);\n\t}\n\n\tvar addStrict = op({\n\t  addStrict_: addStrict_\n\t});\n\tvar divStrict = op({\n\t  divStrict_: divStrict_\n\t});\n\tvar maximumStrict = op({\n\t  maximumStrict_: maximumStrict_\n\t});\n\tvar minimumStrict = op({\n\t  minimumStrict_: minimumStrict_\n\t});\n\tvar modStrict = op({\n\t  modStrict_: modStrict_\n\t});\n\tvar mulStrict = op({\n\t  mulStrict_: mulStrict_\n\t});\n\tvar powStrict = op({\n\t  powStrict_: powStrict_\n\t});\n\tvar squaredDifferenceStrict = op({\n\t  squaredDifferenceStrict_: squaredDifferenceStrict_\n\t});\n\tvar subStrict = op({\n\t  subStrict_: subStrict_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the norm of scalar, vectors, and matrices.\n\t * This function can compute several different vector norms (the 1-norm, the\n\t * Euclidean or 2-norm, the inf-norm, and in general the p-norm for p > 0)\n\t * and matrix norms (Frobenius, 1-norm, and inf-norm).\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 3, 4]);\n\t *\n\t * x.norm().print();  // or tf.norm(x)\n\t * ```\n\t *\n\t * @param x The input array.\n\t * @param ord Optional. Order of the norm. Supported norm types are\n\t * following:\n\t *\n\t *  | ord        | norm for matrices         | norm for vectors\n\t *  |------------|---------------------------|---------------------\n\t *  |'euclidean' |Frobenius norm             |2-norm\n\t *  |'fro'       |Frobenius norm\t           |\n\t *  |Infinity    |max(sum(abs(x), axis=1))   |max(abs(x))\n\t *  |-Infinity   |min(sum(abs(x), axis=1))   |min(abs(x))\n\t *  |1           |max(sum(abs(x), axis=0))   |sum(abs(x))\n\t *  |2           |                           |sum(abs(x)^2)^1/2*\n\t *\n\t * @param axis Optional. If axis is null (the default), the input is\n\t * considered a vector and a single vector norm is computed over the entire\n\t * set of values in the Tensor, i.e. norm(x, ord) is equivalent\n\t * to norm(x.reshape([-1]), ord). If axis is a integer, the input\n\t * is considered a batch of vectors, and axis determines the axis in x\n\t * over which to compute vector norms. If axis is a 2-tuple of integer it is\n\t * considered a batch of matrices and axis determines the axes in NDArray\n\t * over which to compute a matrix norm.\n\t * @param keepDims Optional. If true, the norm have the same dimensionality\n\t * as the input.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Matrices'}\n\t */\n\n\tfunction norm_(x, ord, axis, keepDims) {\n\t  if (ord === void 0) {\n\t    ord = 'euclidean';\n\t  }\n\n\t  if (axis === void 0) {\n\t    axis = null;\n\t  }\n\n\t  if (keepDims === void 0) {\n\t    keepDims = false;\n\t  }\n\n\t  x = convertToTensor(x, 'x', 'norm');\n\t  var norm = normImpl(x, ord, axis);\n\t  var keepDimsShape = norm.shape;\n\n\t  if (keepDims) {\n\t    var axes = parseAxisParam(axis, x.shape);\n\t    keepDimsShape = expandShapeToKeepDim(norm.shape, axes);\n\t  }\n\n\t  return reshape(norm, keepDimsShape);\n\t}\n\n\tfunction normImpl(x, p, axis) {\n\t  if (axis === void 0) {\n\t    axis = null;\n\t  }\n\n\t  if (x.rank === 0) {\n\t    return abs$8(x);\n\t  } // consider vector when no axis is specified\n\n\n\t  if (x.rank !== 1 && axis === null) {\n\t    return normImpl(reshape(x, [-1]), p, axis);\n\t  } // vector\n\n\n\t  if (x.rank === 1 || typeof axis === 'number' || Array.isArray(axis) && axis.length === 1) {\n\t    if (p === 1) {\n\t      return sum$1(abs$8(x), axis);\n\t    }\n\n\t    if (p === Infinity) {\n\t      return max$4(abs$8(x), axis);\n\t    }\n\n\t    if (p === -Infinity) {\n\t      return min$9(abs$8(x), axis);\n\t    }\n\n\t    if (p === 'euclidean' || p === 2) {\n\t      // norm(x, 2) = sum(abs(xi) ^ 2) ^ 1/2\n\t      return sqrt$3(sum$1(pow$5(abs$8(x), scalar(2, 'int32')), axis));\n\t    }\n\n\t    throw new Error(\"Error in norm: invalid ord value: \" + p);\n\t  } // matrix (assumption axis[0] < axis[1])\n\n\n\t  if (Array.isArray(axis) && axis.length === 2) {\n\t    if (p === 1) {\n\t      return max$4(sum$1(abs$8(x), axis[0]), axis[1] - 1);\n\t    }\n\n\t    if (p === Infinity) {\n\t      return max$4(sum$1(abs$8(x), axis[1]), axis[0]);\n\t    }\n\n\t    if (p === -Infinity) {\n\t      return min$9(sum$1(abs$8(x), axis[1]), axis[0]);\n\t    }\n\n\t    if (p === 'fro' || p === 'euclidean') {\n\t      // norm(x) = sqrt(sum(pow(x, 2)))\n\t      return sqrt$3(sum$1(square(x), axis));\n\t    }\n\n\t    throw new Error(\"Error in norm: invalid ord value: \" + p);\n\t  }\n\n\t  throw new Error(\"Error in norm: invalid axis: \" + axis);\n\t}\n\n\tvar norm = op({\n\t  norm_: norm_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Compute the moving average of a variable.\n\t *\n\t * Without zeroDebias, the moving average operation is defined by:\n\t *   `v += delta`\n\t * where\n\t *   `delta = (1 - decay) * (x - v)`\n\t *\n\t * With zeroDebias (default), the `delta` term is scaled to debias the\n\t * effect of the (assumed) zero-initialization of `v`.\n\t *   `delta /= (1 - decay ^ step)`\n\t *\n\t * For more details on the zero-debiasing algorithm, see:\n\t *   https://arxiv.org/abs/1412.6980\n\t *\n\t * Note that this function is completely stateless and does not keep track of\n\t * step count. The step count needs to be maintained by the caller and passed\n\t * in as `step`.\n\t *\n\t * @param v The current moving average value.\n\t * @param x New input value, must have the same shape and dtype as `v`.\n\t * @param decay The decay factor. Typical values are 0.95 and 0.99.\n\t * @param step Step count.\n\t * @param zeroDebias: Whether zeroDebias is to be performed (default: `true`).\n\t * @returns The new moving average value.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Moving Average'}\n\t */\n\n\tfunction movingAverage_(v, x, decay, step, zeroDebias) {\n\t  if (zeroDebias === void 0) {\n\t    zeroDebias = true;\n\t  }\n\n\t  var $v = convertToTensor(v, 'v', 'movingAverage');\n\t  var $x = convertToTensor(x, 'x', 'movingAverage');\n\t  var $decay = convertToTensor(decay, 'decay', 'movingAverage');\n\t  assertTypesMatch($v, $x);\n\t  assert(arraysEqual($v.shape, $x.shape), function () {\n\t    return 'Shape mismatch in v and x';\n\t  });\n\t  var one = scalar(1);\n\t  var oneMinusDecay = sub(one, $decay);\n\t  var update = mul(sub($x, $v), oneMinusDecay);\n\n\t  if (zeroDebias) {\n\t    assert(step != null, function () {\n\t      return 'When using zeroDebias: true, step is required.';\n\t    });\n\t    var $step = convertToTensor(step, 'step', 'movingAverage');\n\t    update = div(update, sub(one, pow$5($decay, $step)));\n\t  }\n\n\t  return add$1($v, update);\n\t}\n\n\tvar movingAverage = op({\n\t  movingAverage_: movingAverage_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Creates a new tensor by applying sparse updates to individual\n\t * values or slices within a zero tensor of the given shape tensor according to\n\t * indices. This operator is the inverse of the `tf.gatherND` operator which\n\t * extracts values or slices from a given tensor.\n\t *\n\t * ```js\n\t * const indices = tf.tensor2d([4, 3, 1, 7], [4, 1], 'int32');\n\t * const updates = tf.tensor1d([9, 10, 11, 12]);\n\t * const shape = [8];\n\t * tf.scatterND(indices, updates, shape).print() //[0, 11, 0, 10, 9, 0, 0, 12]\n\t * ```\n\t *\n\t * @param indices The tensor contains the indices into the output tensor.\n\t * @param updates The tensor contains the value for the indices.\n\t * @param shape: The shape of the output tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Slicing and Joining'}\n\t */\n\n\tfunction scatterND_(indices, updates, shape) {\n\t  var $indices = convertToTensor(indices, 'indices', 'scatterND', 'int32');\n\t  var $updates = convertToTensor(updates, 'updates', 'scatterND');\n\t  validateInput($updates, $indices, shape);\n\t  var inputs = {\n\t    indices: $indices,\n\t    updates: $updates\n\t  };\n\t  var attrs = {\n\t    shape: shape\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  return ENGINE.runKernel(ScatterNd, inputs, attrs);\n\t}\n\n\tvar scatterND = op({\n\t  scatterND_: scatterND_\n\t});\n\n\t/**\n\t * Validate sparseToDense inputs.\n\t *\n\t * @param sparseIndices A 0-D, 1-D, or 2-D Tensor of type int32.\n\t * sparseIndices[i] contains the complete index where sparseValues[i] will be\n\t * placed.\n\t * @param sparseValues A 0-D or 1-D Tensor. Values\n\t * corresponding to each row of sparseIndices, or a scalar value to be used for\n\t * all sparse indices.\n\t * @param outputShape number[]. Shape of the dense output tensor.\n\t * @param validateIndices boolean. indice validation is not supported, error\n\t * will be thrown if it is set.\n\t */\n\tfunction validateInput$1(sparseIndices, sparseValues, outputShape, defaultValues) {\n\t  if (sparseIndices.dtype !== 'int32') {\n\t    throw new Error('tf.sparseToDense() expects the indices to be int32 type,' + (\" but the dtype was \" + sparseIndices.dtype + \".\"));\n\t  }\n\n\t  if (sparseIndices.rank > 2) {\n\t    throw new Error('sparseIndices should be a scalar, vector, or matrix,' + (\" but got shape \" + sparseIndices.shape + \".\"));\n\t  }\n\n\t  var numElems = sparseIndices.rank > 0 ? sparseIndices.shape[0] : 1;\n\t  var numDims = sparseIndices.rank > 1 ? sparseIndices.shape[1] : 1;\n\n\t  if (outputShape.length !== numDims) {\n\t    throw new Error('outputShape has incorrect number of elements:,' + (\" \" + outputShape.length + \", should be: \" + numDims + \".\"));\n\t  }\n\n\t  var numValues = sparseValues.size;\n\n\t  if (!(sparseValues.rank === 0 || sparseValues.rank === 1 && numValues === numElems)) {\n\t    throw new Error('sparseValues has incorrect shape ' + (sparseValues.shape + \", should be [] or [\" + numElems + \"]\"));\n\t  }\n\n\t  if (sparseValues.dtype !== defaultValues.dtype) {\n\t    throw new Error('sparseValues.dtype must match defaultValues.dtype');\n\t  }\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Converts a sparse representation into a dense tensor.\n\t *\n\t * Builds an array dense with shape outputShape such that:\n\t *\n\t * // If sparseIndices is scalar\n\t * dense[i] = (i == sparseIndices ? sparseValues : defaultValue)\n\t *\n\t * // If sparseIndices is a vector, then for each i\n\t * dense[sparseIndices[i]] = sparseValues[i]\n\t *\n\t * // If sparseIndices is an n by d matrix, then for each i in [0, n)\n\t * dense[sparseIndices[i][0], ..., sparseIndices[i][d-1]] = sparseValues[i]\n\t * All other values in dense are set to defaultValue. If sparseValues is a\n\t * scalar, all sparse indices are set to this single value.\n\t *\n\t * If indices are repeated the final value is summed over all values for those\n\t * indices.\n\t *\n\t * ```js\n\t * const indices = tf.tensor1d([4, 5, 6, 1, 2, 3], 'int32');\n\t * const values = tf.tensor1d([10, 11, 12, 13, 14, 15], 'float32');\n\t * const shape = [8];\n\t * tf.sparseToDense(indices, values, shape).print();\n\t * ```\n\t *\n\t * @param sparseIndices A 0-D, 1-D, or 2-D Tensor of type int32.\n\t * sparseIndices[i] contains the complete index where sparseValues[i] will be\n\t * placed.\n\t * @param sparseValues A 0-D or 1-D Tensor. Values\n\t * corresponding to each row of sparseIndices, or a scalar value to be used for\n\t * all sparse indices.\n\t * @param outputShape Shape of the dense output tensor. the type is inferred.\n\t * @param defaultValue Scalar. Value to set for indices not specified in\n\t * sparseIndices. Defaults to zero.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Normalization'}\n\t */\n\n\tfunction sparseToDense_(sparseIndices, sparseValues, outputShape, defaultValue) {\n\t  if (defaultValue === void 0) {\n\t    defaultValue = 0;\n\t  }\n\n\t  var $sparseIndices = convertToTensor(sparseIndices, 'sparseIndices', 'sparseToDense', 'int32');\n\t  var $sparseValues = convertToTensor(sparseValues, 'sparseValues', 'sparseToDense');\n\t  var $defaultValue = convertToTensor(defaultValue, 'defaultValue', 'sparseToDense', $sparseValues.dtype);\n\t  validateInput$1($sparseIndices, $sparseValues, outputShape, $defaultValue);\n\t  var inputs = {\n\t    sparseIndices: $sparseIndices,\n\t    sparseValues: $sparseValues,\n\t    defaultValue: $defaultValue\n\t  };\n\t  var attrs = {\n\t    outputShape: outputShape\n\t  };\n\t  return ENGINE.runKernel(SparseToDense, inputs, attrs);\n\t}\n\n\tvar sparseToDense = op({\n\t  sparseToDense_: sparseToDense_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Gather slices from input tensor into a Tensor with shape specified by\n\t * `indices`.\n\t *\n\t * `indices` is an K-dimensional integer tensor, best thought of as a\n\t * (K-1)-dimensional tensor of indices into input, where each element defines a\n\t * slice of input:\n\t * output[\\\\(i_0, ..., i_{K-2}\\\\)] = input[indices[\\\\(i_0, ..., i_{K-2}\\\\)]]\n\t *\n\t * Whereas in `tf.gather`, `indices` defines slices into the first dimension of\n\t * input, in `tf.gatherND`, `indices` defines slices into the first N dimensions\n\t * of input, where N = indices.shape[-1].\n\t *\n\t * The last dimension of indices can be at most the rank of input:\n\t * indices.shape[-1] <= input.rank\n\t *\n\t * The last dimension of `indices` corresponds to elements\n\t * (if indices.shape[-1] == input.rank) or slices\n\t * (if indices.shape[-1] < input.rank) along dimension indices.shape[-1] of\n\t * input.\n\t * The output tensor has shape\n\t * indices.shape[:-1] + input.shape[indices.shape[-1]:]\n\t *\n\t * Note that on CPU, if an out of bound index is found, an error is returned. On\n\t * GPU, if an out of bound index is found, a 0 is stored in the corresponding\n\t * output value.\n\t *\n\t * ```js\n\t * const indices = tf.tensor2d([0, 1, 1, 0], [2,2], 'int32');\n\t * const input = tf.tensor2d([9, 10, 11, 12], [2, 2]);\n\t * tf.gatherND(input, indices).print() // [10, 11]\n\t * ```\n\t *\n\t * @param x The tensor from which to gather values.\n\t * @param indices Index tensor, must be of type int32.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Slicing and Joining'}\n\t */\n\n\tfunction gatherND_(x, indices) {\n\t  var $indices = convertToTensor(indices, 'indices', 'gatherND', 'int32');\n\t  var $x = convertToTensor(x, 'x', 'gatherND');\n\t  var inputs = {\n\t    params: $x,\n\t    indices: $indices\n\t  };\n\t  return ENGINE.runKernel(GatherNd, inputs);\n\t}\n\n\tvar gatherND = op({\n\t  gatherND_: gatherND_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Normalize noise shape based on provided tensor and noise shape.\n\t *\n\t * @param x Tensor.\n\t * @param noiseShape The shape for the randomly generated keep/drop flags, as\n\t *   an array of numbers. Optional.\n\t * @returns Normalized noise shape.\n\t */\n\n\tfunction getNoiseShape(x, noiseShape) {\n\t  if (noiseShape == null) {\n\t    return x.shape.slice();\n\t  }\n\n\t  if (arraysEqual(x.shape, noiseShape)) {\n\t    return noiseShape;\n\t  }\n\n\t  if (x.shape.length === noiseShape.length) {\n\t    var newDimension = [];\n\n\t    for (var i = 0; i < x.shape.length; i++) {\n\t      if (noiseShape[i] == null && x.shape[i] != null) {\n\t        newDimension.push(x.shape[i]);\n\t      } else {\n\t        newDimension.push(noiseShape[i]);\n\t      }\n\t    }\n\n\t    return newDimension;\n\t  }\n\n\t  return noiseShape;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes dropout.\n\t *\n\t * ```js\n\t * const x = tf.tensor1d([1, 2, 2, 1]);\n\t * const rate = 0.75;\n\t * const output = tf.dropout(x, rate);\n\t * output.print();\n\t * ```\n\t *\n\t * @param x A floating point Tensor or TensorLike.\n\t * @param rate A float in the range [0, 1). The probability that each element\n\t *   of x is discarded.\n\t * @param noiseShape An array of numbers of type int32, representing the\n\t * shape for randomly generated keep/drop flags. If the noiseShape has null\n\t * value, it will be automatically replaced with the x's relative dimension\n\t * size. Optional.\n\t * @param seed Used to create random seeds. Optional.\n\t * @returns A Tensor of the same shape of x.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Dropout'}\n\t */\n\n\tfunction dropout_(x, rate, noiseShape, seed) {\n\t  var $x = convertToTensor(x, 'x', 'dropout');\n\t  assert($x.dtype === 'float32', function () {\n\t    return \"x has to be a floating point tensor since it's going to be \" + (\"scaled, but got a \" + $x.dtype + \" tensor instead.\");\n\t  });\n\t  assert(rate >= 0 && rate < 1, function () {\n\t    return \"rate must be a float in the range [0, 1), but got \" + rate + \".\";\n\t  });\n\n\t  if (rate === 0) {\n\t    return x instanceof Tensor ? $x.clone() : $x;\n\t  }\n\n\t  var $noiseShape = getNoiseShape($x, noiseShape);\n\t  var keepProb = 1 - rate;\n\t  var multiplier = div(floor$a(add$1(randomUniform($noiseShape, 0, 1, 'float32', seed), keepProb)), keepProb);\n\t  return mul($x, multiplier);\n\t}\n\n\tvar dropout = op({\n\t  dropout_: dropout_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction enclosingPowerOfTwo(value) {\n\t  // Return 2**N for integer N such that 2**N >= value.\n\t  return Math.floor(Math.pow(2, Math.ceil(Math.log(value) / Math.log(2.0))));\n\t}\n\tfunction cosineWindow(windowLength, a, b) {\n\t  var even = 1 - windowLength % 2;\n\t  var newValues = new Float32Array(windowLength);\n\n\t  for (var i = 0; i < windowLength; ++i) {\n\t    var cosArg = 2.0 * Math.PI * i / (windowLength + even - 1);\n\t    newValues[i] = a - b * Math.cos(cosArg);\n\t  }\n\n\t  return tensor1d(newValues, 'float32');\n\t}\n\n\t/**\n\t * Returns whether the targets are in the top K predictions.\n\t *\n\t * ```js\n\t * const predictions = tf.tensor2d([[20, 10, 40, 30], [30, 50, -20, 10]]);\n\t * const targets = tf.tensor1d([2, 0]);\n\t * const precision = await tf.inTopKAsync(predictions, targets);\n\t * precision.print();\n\t * ```\n\t * @param predictions 2-D or higher `tf.Tensor` with last dimension being\n\t *     at least `k`.\n\t * @param targets 1-D or higher `tf.Tensor`.\n\t * @param k Optional Number of top elements to look at for computing precision,\n\t *     default to 1.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Evaluation'}\n\t */\n\n\tfunction inTopKAsync_(_x, _x2, _x3) {\n\t  return _inTopKAsync_.apply(this, arguments);\n\t}\n\n\tfunction _inTopKAsync_() {\n\t  _inTopKAsync_ = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(predictions, targets, k) {\n\t    var $predictions, $targets, lastDim, predictionsVals, targetsVals, batch, size, precision, b, offset, vals, valAndInd, i, _i;\n\n\t    return regeneratorRuntime.wrap(function _callee$(_context) {\n\t      while (1) {\n\t        switch (_context.prev = _context.next) {\n\t          case 0:\n\t            if (k === void 0) {\n\t              k = 1;\n\t            }\n\n\t            $predictions = convertToTensor(predictions, 'predictions', 'inTopK');\n\t            $targets = convertToTensor(targets, 'targets', 'inTopK');\n\t            assert($predictions.rank > 1, function () {\n\t              return 'inTopK() expects the predictions to be of rank 2 or higher, ' + (\"but got \" + $predictions.rank);\n\t            });\n\t            assert($predictions.rank - 1 === $targets.rank, function () {\n\t              return \"predictions rank should be 1 larger than \" + \"targets rank, but got predictions rank \" + ($predictions.rank + \" and targets rank \" + $targets.rank);\n\t            });\n\t            assertShapesMatch($predictions.shape.slice(0, $predictions.shape.length - 1), $targets.shape, \"predictions's shape should be align with the targets' shape, \" + 'except the last dimension.');\n\t            lastDim = $predictions.shape[$predictions.shape.length - 1];\n\t            assert(k > 0 && k <= lastDim, function () {\n\t              return \"'k' passed to inTopK() must be > 0 && <= the predictions last \" + (\"dimension (\" + lastDim + \"), but got \" + k);\n\t            });\n\t            _context.next = 10;\n\t            return $predictions.data();\n\n\t          case 10:\n\t            predictionsVals = _context.sent;\n\t            _context.next = 13;\n\t            return $targets.data();\n\n\t          case 13:\n\t            targetsVals = _context.sent;\n\t            // Reshape predictionsVals into a 2d tensor [batch, lastDim]\n\t            // and look up topK along lastDim.\n\t            batch = predictionsVals.length / lastDim, size = lastDim;\n\t            precision = getTypedArrayFromDType('bool', batch);\n\t            b = 0;\n\n\t          case 17:\n\t            if (!(b < batch)) {\n\t              _context.next = 35;\n\t              break;\n\t            }\n\n\t            offset = b * size;\n\t            vals = predictionsVals.subarray(offset, offset + size);\n\t            valAndInd = [];\n\n\t            for (i = 0; i < vals.length; i++) {\n\t              valAndInd.push({\n\t                value: vals[i],\n\t                index: i\n\t              });\n\t            }\n\n\t            valAndInd.sort(function (a, b) {\n\t              return b.value - a.value;\n\t            });\n\t            precision[b] = 0;\n\t            _i = 0;\n\n\t          case 25:\n\t            if (!(_i < k)) {\n\t              _context.next = 32;\n\t              break;\n\t            }\n\n\t            if (!(valAndInd[_i].index === targetsVals[b])) {\n\t              _context.next = 29;\n\t              break;\n\t            }\n\n\t            precision[b] = 1;\n\t            return _context.abrupt(\"break\", 32);\n\n\t          case 29:\n\t            _i++;\n\t            _context.next = 25;\n\t            break;\n\n\t          case 32:\n\t            b++;\n\t            _context.next = 17;\n\t            break;\n\n\t          case 35:\n\t            if (predictions !== $predictions) {\n\t              $predictions.dispose();\n\t            }\n\n\t            if (targets !== $targets) {\n\t              $targets.dispose();\n\t            } // Output precision has the same shape as targets.\n\n\n\t            return _context.abrupt(\"return\", tensor(precision, $targets.shape, 'bool'));\n\n\t          case 38:\n\t          case \"end\":\n\t            return _context.stop();\n\t        }\n\t      }\n\t    }, _callee);\n\t  }));\n\t  return _inTopKAsync_.apply(this, arguments);\n\t}\n\n\tvar inTopKAsync = inTopKAsync_;\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the derivative of the filter of a 2D convolution.\n\t *\n\t * @param x The input tensor, of rank 4 or rank 3 of shape\n\t *     [batch, height, width, inChannels]. If rank 3, batch of 1 is assumed.\n\t * @param dy The dy image, of rank 4 or rank 3, of shape\n\t *     [batch, height, width, outDepth]. If rank 3, batch of 1 is assumed.\n\t * @param filterShape The shape of the filter, length 4,\n\t *     [filterHeight, filterWidth, inDepth, outDepth].\n\t * @param strides The strides of the convolution: [strideHeight,\n\t * strideWidth].\n\t * @param pad A string from: 'same', 'valid'. The type of padding algorithm\n\t *     used in the forward prop of the op.\n\t * @param dataFormat: An optional string from: \"NHWC\", \"NCHW\". Defaults to\n\t *     \"NHWC\". Specify the data format of the input and output data. With the\n\t *     default format \"NHWC\", the data is stored in the order of: [batch,\n\t *     height, width, channels].\n\t * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n\t *     provided, it will default to truncate.\n\t */\n\n\tfunction conv2DBackpropFilter_(x, dy, filterShape, strides, pad, dataFormat, dimRoundingMode) {\n\t  if (dataFormat === void 0) {\n\t    dataFormat = 'NHWC';\n\t  }\n\n\t  var x4D = x;\n\n\t  if (x.rank === 3) {\n\t    x4D = reshape(x, [1, x.shape[0], x.shape[1], x.shape[2]]);\n\t  }\n\n\t  var dy4D = dy;\n\n\t  if (dy4D.rank === 3) {\n\t    dy4D = reshape(dy, [1, dy.shape[0], dy.shape[1], dy.shape[2]]);\n\t  }\n\n\t  assert(x4D.rank === 4, function () {\n\t    return \"Error in conv2dDerFilter: input must be rank 4, but got shape \" + (x4D.shape + \".\");\n\t  });\n\t  assert(dy4D.rank === 4, function () {\n\t    return \"Error in conv2dDerFilter: dy must be rank 4, but got shape \" + (dy4D.shape + \".\");\n\t  });\n\t  assert(filterShape.length === 4, function () {\n\t    return \"Error in conv2dDerFilter: filterShape must be length 4, but got \" + (filterShape + \".\");\n\t  });\n\t  var inDepth = dataFormat === 'NHWC' ? x4D.shape[3] : x4D.shape[1];\n\t  var outDepth = dataFormat === 'NHWC' ? dy4D.shape[3] : dy4D.shape[1];\n\t  assert(inDepth === filterShape[2], function () {\n\t    return \"Error in conv2dDerFilter: depth of input \" + inDepth + \") must \" + (\"match input depth in filter (\" + filterShape[2] + \".\");\n\t  });\n\t  assert(outDepth === filterShape[3], function () {\n\t    return \"Error in conv2dDerFilter: depth of dy (\" + outDepth + \") must \" + (\"match output depth for filter (\" + filterShape[3] + \").\");\n\t  });\n\n\t  if (dimRoundingMode != null) {\n\t    assert(isInt(pad), function () {\n\t      return \"Error in conv2dDerFilter: pad must be an integer when using, \" + (\"dimRoundingMode \" + dimRoundingMode + \" but got pad \" + pad + \".\");\n\t    });\n\t  }\n\n\t  var inputs = {\n\t    x: x4D,\n\t    dy: dy4D\n\t  };\n\t  var attrs = {\n\t    strides: strides,\n\t    pad: pad,\n\t    dataFormat: dataFormat,\n\t    dimRoundingMode: dimRoundingMode,\n\t    filterShape: filterShape\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  return ENGINE.runKernel(Conv2DBackpropFilter, inputs, attrs);\n\t}\n\n\tvar conv2DBackpropFilter = op({\n\t  conv2DBackpropFilter_: conv2DBackpropFilter_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tfunction getFusedDyActivation(dy, y, activation) {\n\t  if (activation == null || activation === 'linear') {\n\t    return dy;\n\t  }\n\n\t  if (activation === 'relu') {\n\t    return mul(dy, step(y));\n\t  }\n\n\t  throw new Error(\"Cannot compute gradient for fused activation \" + activation + \".\");\n\t} // Returns gradient for fused bias.\n\n\tfunction getFusedBiasGradient(bias, dyActivation) {\n\t  var res = dyActivation;\n\t  var reduceAxes = getReductionAxes(bias.shape, dyActivation.shape);\n\n\t  if (reduceAxes.length > 0) {\n\t    res = sum$1(res, reduceAxes);\n\t  }\n\n\t  return reshape(res, bias.shape);\n\t}\n\tfunction applyActivation(x, activation, preluActivationWeights, leakyreluAlpha) {\n\t  if (activation === 'linear') {\n\t    return x;\n\t  } else if (activation === 'relu') {\n\t    return relu(x);\n\t  } else if (activation === 'elu') {\n\t    return elu(x);\n\t  } else if (activation === 'relu6') {\n\t    return relu6(x);\n\t  } else if (activation === 'prelu') {\n\t    return prelu(x, preluActivationWeights);\n\t  } else if (activation === 'leakyrelu') {\n\t    return leakyRelu(x, leakyreluAlpha);\n\t  }\n\n\t  throw new Error(\"Unknown fused activation \" + activation + \".\");\n\t} // Whether we should call fused ops.\n\n\tvar shouldFuse = function shouldFuse(gradientDepth, activation) {\n\t  var gradientMode = gradientDepth > 0;\n\t  return !gradientMode || activation === 'linear';\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes a 2D convolution over the input x, optionally fused with adding a\n\t * bias and applying an activation.\n\t *\n\t * ```js\n\t * const inputDepth = 2;\n\t * const inShape = [2, 2, 2, inputDepth];\n\t * const outputDepth = 2;\n\t * const fSize = 1;\n\t * const pad = 0;\n\t * const strides = 1;\n\t *\n\t * const x = tf.tensor4d( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n\t * 16], inShape);\n\t * const w = tf.tensor4d([-1, 1, -2, 0.5], [fSize, fSize, inputDepth,\n\t * outputDepth]);\n\t *\n\t * tf.fused.conv2d({ x, filter: w, strides, pad, dataFormat: 'NHWC',\n\t * dilations: [1, 1], bias: tf.scalar(5), activation: 'relu' }).print();\n\t * ```\n\t *\n\t * @param obj An object with the following properties:\n\t * @param x The input tensor, of rank 4 or rank 3, of shape\n\t *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is\n\t * assumed.\n\t * @param filter The filter, rank 4, of shape\n\t *     `[filterHeight, filterWidth, inDepth, outDepth]`.\n\t * @param strides The strides of the convolution: `[strideHeight,\n\t * strideWidth]`.\n\t * @param pad The type of padding algorithm.\n\t *   - `same` and stride 1: output will be of same size as input,\n\t *       regardless of filter size.\n\t *   - `valid` output will be smaller than input if filter is larger\n\t *       than 1x1.\n\t *   - For more info, see this guide:\n\t *     [https://www.tensorflow.org/api_guides/python/nn#Convolution](\n\t *          https://www.tensorflow.org/api_guides/python/nn#Convolution)\n\t * @param dataFormat An optional string from: \"NHWC\", \"NCHW\". Defaults to\n\t *     \"NHWC\". Specify the data format of the input and output data. With the\n\t *     default format \"NHWC\", the data is stored in the order of: [batch,\n\t *     height, width, channels]. Only \"NHWC\" is currently supported.\n\t * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n\t *     in which we sample input values across the height and width dimensions\n\t *     in atrous convolution. Defaults to `[1, 1]`. If `dilations` is a single\n\t *     number, then `dilationHeight == dilationWidth`. If it is greater than\n\t *     1, then all values of `strides` must be 1.\n\t * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n\t *     provided, it will default to truncate.\n\t * @param bias Tensor to be added to the result.\n\t * @param activation Name of activation kernel (defaults to `linear`) to be\n\t *     applied\n\t *      after biasAdd.\n\t * @param preluActivationWeights Tensor of prelu weights to be applied as part\n\t *     of a `prelu` activation, typically the same shape as `x`.\n\t * @param leakyreluAlpha Optional. Alpha to be applied as part of a `leakyrelu`\n\t *     activation.\n\t */\n\n\tfunction fusedConv2d_(_ref) {\n\t  var x = _ref.x,\n\t      filter = _ref.filter,\n\t      strides = _ref.strides,\n\t      pad = _ref.pad,\n\t      _ref$dataFormat = _ref.dataFormat,\n\t      dataFormat = _ref$dataFormat === void 0 ? 'NHWC' : _ref$dataFormat,\n\t      _ref$dilations = _ref.dilations,\n\t      dilations = _ref$dilations === void 0 ? [1, 1] : _ref$dilations,\n\t      dimRoundingMode = _ref.dimRoundingMode,\n\t      bias = _ref.bias,\n\t      _ref$activation = _ref.activation,\n\t      activation = _ref$activation === void 0 ? 'linear' : _ref$activation,\n\t      preluActivationWeights = _ref.preluActivationWeights,\n\t      leakyreluAlpha = _ref.leakyreluAlpha;\n\t  activation = activation || 'linear';\n\n\t  if (shouldFuse(ENGINE.state.gradientDepth, activation) === false) {\n\t    var result = conv2d(x, filter, strides, pad, dataFormat, dilations, dimRoundingMode);\n\n\t    if (bias != null) {\n\t      result = add$1(result, bias);\n\t    }\n\n\t    return applyActivation(result, activation, preluActivationWeights, leakyreluAlpha);\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'conv2d');\n\t  var $filter = convertToTensor(filter, 'filter', 'conv2d');\n\t  var x4D = $x;\n\t  var reshapedTo4D = false;\n\n\t  if ($x.rank === 3) {\n\t    reshapedTo4D = true;\n\t    x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n\t  }\n\n\t  assert(x4D.rank === 4, function () {\n\t    return \"Error in fused conv2d: input must be rank 4, but got rank \" + (x4D.rank + \".\");\n\t  });\n\t  assert($filter.rank === 4, function () {\n\t    return \"Error in fused conv2d: filter must be rank 4, but got rank \" + ($filter.rank + \".\");\n\t  });\n\n\t  if (dimRoundingMode != null) {\n\t    assert(isInt(pad), function () {\n\t      return \"Error in fused conv2d: pad must be an integer when using, \" + (\"dimRoundingMode \" + dimRoundingMode + \" but got pad \" + pad + \".\");\n\t    });\n\t  }\n\n\t  assert(x4D.shape[3] === $filter.shape[2], function () {\n\t    return \"Error in conv2d: depth of input (\" + x4D.shape[3] + \") must match \" + (\"input depth for filter \" + $filter.shape[2] + \".\");\n\t  });\n\t  assert(eitherStridesOrDilationsAreOne(strides, dilations), function () {\n\t    return 'Error in conv2D: Either strides or dilations must be 1. ' + (\"Got strides \" + strides + \" and dilations '\" + dilations + \"'\");\n\t  });\n\t  assert(dataFormat === 'NHWC', function () {\n\t    return \"Error in conv2d: got dataFormat of \" + dataFormat + \" but only NHWC is currently supported.\";\n\t  });\n\t  var convInfo = computeConv2DInfo(x4D.shape, $filter.shape, strides, dilations, pad, dimRoundingMode);\n\t  var $bias;\n\n\t  if (bias != null) {\n\t    $bias = convertToTensor(bias, 'bias', 'fused conv2d');\n\n\t    var _makeTypesMatch = makeTypesMatch($bias, $x);\n\n\t    $bias = _makeTypesMatch[0];\n\t    assertAndGetBroadcastShape(convInfo.outShape, $bias.shape);\n\t  }\n\n\t  var $preluActivationWeights;\n\n\t  if (preluActivationWeights != null) {\n\t    $preluActivationWeights = convertToTensor(preluActivationWeights, 'prelu weights', 'fused conv2d');\n\t  }\n\n\t  var grad = function grad(dy, saved) {\n\t    var $filter = saved[0],\n\t        x4D = saved[1],\n\t        y = saved[2],\n\t        $bias = saved[3];\n\t    var dyActivation = getFusedDyActivation(dy, y, activation);\n\t    assert(tupleValuesAreOne(dilations), function () {\n\t      return 'Error in gradient of fused conv2D: ' + \"dilation rates greater than 1 \" + (\"are not yet supported in gradients. Got dilations '\" + dilations + \"'\");\n\t    });\n\t    var xDer = conv2DBackpropInput(x4D.shape, dyActivation, $filter, strides, pad);\n\t    var filterDer = conv2DBackpropFilter(x4D, dyActivation, $filter.shape, strides, pad);\n\t    var der = [xDer, filterDer];\n\n\t    if ($bias != null) {\n\t      var biasDer = getFusedBiasGradient($bias, dyActivation);\n\t      der.push(biasDer);\n\t    }\n\n\t    return der;\n\t  };\n\n\t  var inputs = {\n\t    x: x4D,\n\t    filter: $filter,\n\t    bias: $bias,\n\t    preluActivationWeights: $preluActivationWeights\n\t  };\n\t  var attrs = {\n\t    strides: strides,\n\t    pad: pad,\n\t    dataFormat: dataFormat,\n\t    dilations: dilations,\n\t    dimRoundingMode: dimRoundingMode,\n\t    activation: activation,\n\t    leakyreluAlpha: leakyreluAlpha\n\t  }; // Depending on the the params passed in we will have different number of\n\t  // inputs and thus a a different number of elements in the gradient.\n\n\t  if (bias == null) {\n\t    var customOp = customGrad(function (x4D, filter, save) {\n\t      var res = // tslint:disable-next-line: no-unnecessary-type-assertion\n\t      ENGINE.runKernel(FusedConv2D, inputs, attrs);\n\t      save([filter, x4D, res]);\n\n\t      if (reshapedTo4D) {\n\t        // tslint:disable-next-line: no-unnecessary-type-assertion\n\t        res = reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n\t      }\n\n\t      return {\n\t        value: res,\n\t        gradFunc: grad\n\t      };\n\t    });\n\t    return customOp(x4D, $filter);\n\t  } else {\n\t    var customOpWithBias = customGrad(function (x4D, filter, bias, save) {\n\t      var res = ENGINE.runKernel(FusedConv2D, inputs, attrs);\n\t      save([filter, x4D, res, bias]);\n\n\t      if (reshapedTo4D) {\n\t        // tslint:disable-next-line: no-unnecessary-type-assertion\n\t        res = reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n\t      }\n\n\t      return {\n\t        value: res,\n\t        gradFunc: grad\n\t      };\n\t    });\n\t    return customOpWithBias(x4D, $filter, $bias);\n\t  }\n\t}\n\n\tvar conv2d$1 = op({\n\t  fusedConv2d_: fusedConv2d_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tfunction depthwiseConv2dNativeBackpropFilter_(x, dy, filterShape, strides, pad, dilations, dimRoundingMode) {\n\t  if (dilations === void 0) {\n\t    dilations = [1, 1];\n\t  }\n\n\t  var x4D = x;\n\n\t  if (x.rank === 3) {\n\t    x4D = reshape(x, [1, x.shape[0], x.shape[1], x.shape[2]]);\n\t  }\n\n\t  var dy4D = dy;\n\n\t  if (dy4D.rank === 3) {\n\t    dy4D = reshape(dy, [1, dy.shape[0], dy.shape[1], dy.shape[2]]);\n\t  }\n\n\t  var inputs = {\n\t    x: x4D,\n\t    dy: dy4D\n\t  };\n\t  var attrs = {\n\t    strides: strides,\n\t    pad: pad,\n\t    dimRoundingMode: dimRoundingMode,\n\t    dilations: dilations,\n\t    filterShape: filterShape\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  return ENGINE.runKernel(DepthwiseConv2dNativeBackpropFilter, inputs, attrs);\n\t}\n\n\tvar depthwiseConv2dNativeBackpropFilter = op({\n\t  depthwiseConv2dNativeBackpropFilter_: depthwiseConv2dNativeBackpropFilter_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tfunction depthwiseConv2dNativeBackpropInput_(xShape, dy, filter, strides, pad, dilations, dimRoundingMode) {\n\t  if (dilations === void 0) {\n\t    dilations = [1, 1];\n\t  }\n\n\t  var dy4D = dy;\n\t  var reshapedTo4D = false;\n\n\t  if (dy.rank === 3) {\n\t    reshapedTo4D = true;\n\t    dy4D = reshape(dy, [1, dy.shape[0], dy.shape[1], dy.shape[2]]);\n\t  }\n\n\t  var inputs = {\n\t    dy: dy4D,\n\t    filter: filter\n\t  };\n\t  var attrs = {\n\t    strides: strides,\n\t    pad: pad,\n\t    dimRoundingMode: dimRoundingMode,\n\t    dilations: dilations,\n\t    inputShape: xShape\n\t  };\n\t  var res = // tslint:disable-next-line: no-unnecessary-type-assertion\n\t  ENGINE.runKernel(DepthwiseConv2dNativeBackpropInput, inputs, attrs);\n\n\t  if (reshapedTo4D) {\n\t    return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n\t  }\n\n\t  return res;\n\t}\n\n\tvar depthwiseConv2dNativeBackpropInput = op({\n\t  depthwiseConv2dNativeBackpropInput_: depthwiseConv2dNativeBackpropInput_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes depthwise 2D convolution, optionally fused with adding a\n\t * bias and applying an activation.\n\t *\n\t * Given a 4D `input` array and a `filter` array of shape\n\t * `[filterHeight, filterWidth, inChannels, channelMultiplier]` containing\n\t * `inChannels` convolutional filters of depth 1, this op applies a\n\t * different filter to each input channel (expanding from 1 channel to\n\t * `channelMultiplier` channels for each), then concatenates the results\n\t * together. The output has `inChannels * channelMultiplier` channels.\n\t *\n\t * See\n\t * [https://www.tensorflow.org/api_docs/python/tf/nn/depthwise_conv2d](\n\t *     https://www.tensorflow.org/api_docs/python/tf/nn/depthwise_conv2d)\n\t * for more details.\n\t *\n\t * @param obj An object with the following properties:\n\t * @param x The input tensor, of rank 4 or rank 3, of shape\n\t *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is\n\t * assumed.\n\t * @param filter The filter tensor, rank 4, of shape\n\t *     `[filterHeight, filterWidth, inChannels, channelMultiplier]`.\n\t * @param strides The strides of the convolution: `[strideHeight,\n\t * strideWidth]`. If strides is a single number, then `strideHeight ==\n\t * strideWidth`.\n\t * @param pad The type of padding algorithm.\n\t *   - `same` and stride 1: output will be of same size as input,\n\t *       regardless of filter size.\n\t *   - `valid`: output will be smaller than input if filter is larger\n\t *       than 1x1.\n\t *   - For more info, see this guide:\n\t *     [https://www.tensorflow.org/api_guides/python/nn#Convolution](\n\t *          https://www.tensorflow.org/api_guides/python/nn#Convolution)\n\t * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n\t *     in which we sample input values across the height and width dimensions\n\t *     in atrous convolution. Defaults to `[1, 1]`. If `rate` is a single\n\t *     number, then `dilationHeight == dilationWidth`. If it is greater than\n\t *     1, then all values of `strides` must be 1.\n\t * @param dataFormat: An optional string from: \"NHWC\", \"NCHW\". Defaults to\n\t *     \"NHWC\". Specify the data format of the input and output data. With the\n\t *     default format \"NHWC\", the data is stored in the order of: [batch,\n\t *     height, width, channels]. Only \"NHWC\" is currently supported.\n\t * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n\t *     provided, it will default to truncate.\n\t * @param bias Tensor to be added to the result.\n\t * @param activation Name of activation kernel (defaults to `linear`).\n\t * @param preluActivationWeights Tensor of prelu weights to be applied as part\n\t *     of a `prelu` activation, typically the same shape as `x`.\n\t * @param leakyreluAlpha Optional. Alpha to be applied as part of a `leakyrelu`\n\t *     activation.\n\t */\n\n\tfunction fusedDepthwiseConv2d_(_ref) {\n\t  var x = _ref.x,\n\t      filter = _ref.filter,\n\t      strides = _ref.strides,\n\t      pad = _ref.pad,\n\t      _ref$dataFormat = _ref.dataFormat,\n\t      dataFormat = _ref$dataFormat === void 0 ? 'NHWC' : _ref$dataFormat,\n\t      _ref$dilations = _ref.dilations,\n\t      dilations = _ref$dilations === void 0 ? [1, 1] : _ref$dilations,\n\t      dimRoundingMode = _ref.dimRoundingMode,\n\t      bias = _ref.bias,\n\t      _ref$activation = _ref.activation,\n\t      activation = _ref$activation === void 0 ? 'linear' : _ref$activation,\n\t      preluActivationWeights = _ref.preluActivationWeights,\n\t      leakyreluAlpha = _ref.leakyreluAlpha;\n\n\t  if (shouldFuse(ENGINE.state.gradientDepth, activation) === false) {\n\t    var result = depthwiseConv2d(x, filter, strides, pad, dataFormat, dilations, dimRoundingMode);\n\n\t    if (bias != null) {\n\t      result = add$1(result, bias);\n\t    }\n\n\t    return applyActivation(result, activation, preluActivationWeights, leakyreluAlpha);\n\t  }\n\n\t  var $x = convertToTensor(x, 'x', 'depthwiseConv2d');\n\t  var $filter = convertToTensor(filter, 'filter', 'depthwiseConv2d');\n\t  var x4D = $x;\n\t  var reshapedTo4D = false;\n\n\t  if ($x.rank === 3) {\n\t    reshapedTo4D = true;\n\t    x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n\t  }\n\n\t  assert(x4D.rank === 4, function () {\n\t    return \"Error in fused depthwiseConv2d: input must be rank 4, but got \" + (\"rank \" + x4D.rank + \".\");\n\t  });\n\t  assert($filter.rank === 4, function () {\n\t    return \"Error in fused depthwiseConv2d: filter must be rank 4, \" + (\"but got rank \" + $filter.rank + \".\");\n\t  });\n\t  assert(x4D.shape[3] === $filter.shape[2], function () {\n\t    return \"Error in fused depthwiseConv2d: number of input channels \" + (\"(\" + x4D.shape[3] + \") must match the inChannels dimension in \") + (\"filter \" + $filter.shape[2] + \".\");\n\t  });\n\n\t  if (dilations == null) {\n\t    dilations = [1, 1];\n\t  }\n\n\t  assert(eitherStridesOrDilationsAreOne(strides, dilations), function () {\n\t    return 'Error in fused depthwiseConv2d: Either strides or dilations must ' + (\"be 1. Got strides \" + strides + \" and dilations '\" + dilations + \"'\");\n\t  });\n\n\t  if (dimRoundingMode != null) {\n\t    assert(isInt(pad), function () {\n\t      return \"Error in fused depthwiseConv2d: pad must be an integer when \" + (\"using dimRoundingMode \" + dimRoundingMode + \" but got pad \" + pad + \".\");\n\t    });\n\t  }\n\n\t  var convInfo = computeConv2DInfo(x4D.shape, $filter.shape, strides, dilations, pad, dimRoundingMode, true\n\t  /* depthwise */\n\t  );\n\t  var $bias;\n\n\t  if (bias != null) {\n\t    $bias = convertToTensor(bias, 'bias', 'fused conv2d');\n\n\t    var _makeTypesMatch = makeTypesMatch($bias, $x);\n\n\t    $bias = _makeTypesMatch[0];\n\t    assertAndGetBroadcastShape(convInfo.outShape, $bias.shape);\n\t  }\n\n\t  var $preluActivationWeights;\n\n\t  if (preluActivationWeights != null) {\n\t    $preluActivationWeights = convertToTensor(preluActivationWeights, 'prelu weights', 'fused depthwiseConv2d');\n\t  }\n\n\t  var grad = function grad(dy, saved) {\n\t    assert(tupleValuesAreOne(dilations), function () {\n\t      return 'Error in gradient of fused depthwiseConv2d: dilation rates ' + \"greater than 1 are not yet supported. Got dilations \" + (\"'\" + dilations + \"'\");\n\t    });\n\t    var $filter = saved[0],\n\t        x4D = saved[1],\n\t        y = saved[2],\n\t        bias = saved[3];\n\t    var dyActivation = getFusedDyActivation(dy, y, activation);\n\t    var xDer = depthwiseConv2dNativeBackpropInput(x4D.shape, dyActivation, $filter, strides, pad, dilations, dimRoundingMode);\n\t    var filterDer = depthwiseConv2dNativeBackpropFilter(x4D, dyActivation, $filter.shape, strides, pad, dilations, dimRoundingMode);\n\n\t    if (bias != null) {\n\t      var biasDer = getFusedBiasGradient($bias, dyActivation);\n\t      return [xDer, filterDer, biasDer];\n\t    }\n\n\t    return [xDer, filterDer];\n\t  };\n\n\t  var inputs = {\n\t    x: x4D,\n\t    filter: $filter,\n\t    bias: $bias,\n\t    preluActivationWeights: $preluActivationWeights\n\t  };\n\t  var attrs = {\n\t    strides: strides,\n\t    pad: pad,\n\t    dataFormat: dataFormat,\n\t    dilations: dilations,\n\t    dimRoundingMode: dimRoundingMode,\n\t    activation: activation,\n\t    leakyreluAlpha: leakyreluAlpha\n\t  }; // Depending on the the params passed in we will have different number of\n\t  // inputs and thus a a different number of elements in the gradient.\n\n\t  if (bias == null) {\n\t    var customOp = customGrad(function (x4D, filter, save) {\n\t      // tslint:disable-next-line: no-unnecessary-type-assertion\n\t      var res = ENGINE.runKernel(FusedDepthwiseConv2D, inputs, attrs);\n\t      save([filter, x4D, res]);\n\n\t      if (reshapedTo4D) {\n\t        // tslint:disable-next-line: no-unnecessary-type-assertion\n\t        res = reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n\t      }\n\n\t      return {\n\t        value: res,\n\t        gradFunc: grad\n\t      };\n\t    });\n\t    return customOp(x4D, $filter);\n\t  } else {\n\t    var customOpWithBias = customGrad(function (x4D, filter, bias, save) {\n\t      // tslint:disable-next-line: no-unnecessary-type-assertion\n\t      var res = ENGINE.runKernel(FusedDepthwiseConv2D, inputs, attrs);\n\t      save([filter, x4D, res, bias]);\n\n\t      if (reshapedTo4D) {\n\t        // tslint:disable-next-line: no-unnecessary-type-assertion\n\t        res = reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n\t      }\n\n\t      return {\n\t        value: res,\n\t        gradFunc: grad\n\t      };\n\t    });\n\t    return customOpWithBias(x4D, $filter, $bias);\n\t  }\n\t}\n\n\tvar depthwiseConv2d$1 = op({\n\t  fusedDepthwiseConv2d_: fusedDepthwiseConv2d_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the dot product of two matrices with optional activation and bias.\n\t *\n\t * ```js\n\t * const a = tf.tensor2d([-1, -2], [1, 2]);\n\t * const b = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n\t * const bias = tf.tensor2d([1, 2], [1, 2]);\n\t *\n\t * tf.fused.matMul({a, b, bias, activation: 'relu'}).print();\n\t * ```\n\t *\n\t * @param obj An object with the following properties:\n\t * - `a` First matrix in dot product operation.\n\t * - `b` Second matrix in dot product operation.\n\t * - `transposeA` If true, `a` is transposed before multiplication.\n\t * - `transposeB` If true, `b` is transposed before multiplication.\n\t * - `bias` Matrix to be added to the result.\n\t * - `activation` Name of activation kernel (defaults to `linear`).\n\t * - `preluActivationWeights` Tensor of prelu weights.\n\t * - `leakyreluAlpha` Alpha of leakyrelu.\n\t */\n\n\tfunction fusedMatMul_(_ref) {\n\t  var a = _ref.a,\n\t      b = _ref.b,\n\t      _ref$transposeA = _ref.transposeA,\n\t      transposeA = _ref$transposeA === void 0 ? false : _ref$transposeA,\n\t      _ref$transposeB = _ref.transposeB,\n\t      transposeB = _ref$transposeB === void 0 ? false : _ref$transposeB,\n\t      bias = _ref.bias,\n\t      _ref$activation = _ref.activation,\n\t      activation = _ref$activation === void 0 ? 'linear' : _ref$activation,\n\t      preluActivationWeights = _ref.preluActivationWeights,\n\t      leakyreluAlpha = _ref.leakyreluAlpha;\n\n\t  if (shouldFuse(ENGINE.state.gradientDepth, activation) === false) {\n\t    var result = matMul(a, b, transposeA, transposeB);\n\n\t    if (bias != null) {\n\t      result = add$1(result, bias);\n\t    }\n\n\t    return applyActivation(result, activation, preluActivationWeights, leakyreluAlpha);\n\t  }\n\n\t  var $a = convertToTensor(a, 'a', 'fused matMul');\n\t  var $b = convertToTensor(b, 'b', 'fused matMul');\n\n\t  var _makeTypesMatch = makeTypesMatch($a, $b);\n\n\t  $a = _makeTypesMatch[0];\n\t  $b = _makeTypesMatch[1];\n\t  var innerShapeA = transposeA ? $a.shape[$a.rank - 2] : $a.shape[$a.rank - 1];\n\t  var innerShapeB = transposeB ? $b.shape[$b.rank - 1] : $b.shape[$b.rank - 2];\n\t  var outerShapeA = transposeA ? $a.shape[$a.rank - 1] : $a.shape[$a.rank - 2];\n\t  var outerShapeB = transposeB ? $b.shape[$b.rank - 2] : $b.shape[$b.rank - 1];\n\t  var outerDimsA = $a.shape.slice(0, -2);\n\t  var outerDimsB = $b.shape.slice(0, -2);\n\t  var batchDimA = sizeFromShape(outerDimsA);\n\t  var batchDimB = sizeFromShape(outerDimsB);\n\t  assert($a.rank >= 2 && $b.rank >= 2 && $a.rank === $b.rank, function () {\n\t    return \"Error in fused matMul: inputs must have the same rank of at \" + (\"least 2, got ranks \" + $a.rank + \" and \" + $b.rank + \".\");\n\t  });\n\t  assert(arraysEqual(outerDimsA, outerDimsB), function () {\n\t    return \"Error in fused matMul: outer dimensions (\" + outerDimsA + \") and (\" + (outerDimsB + \") of Tensors with shapes \" + $a.shape + \" and \") + ($b.shape + \" must match.\");\n\t  });\n\t  assert(innerShapeA === innerShapeB, function () {\n\t    return \"Error in fused matMul: inner shapes (\" + innerShapeA + \") and (\" + (innerShapeB + \") of Tensors with shapes \" + $a.shape + \" and \") + ($b.shape + \" and transposeA=\" + transposeA) + (\" and transposeB=\" + transposeB + \" must match.\");\n\t  });\n\t  var outShape = $a.shape.slice(0, -2).concat([outerShapeA, outerShapeB]);\n\t  var a3D = transposeA ? reshape($a, [batchDimA, innerShapeA, outerShapeA]) : reshape($a, [batchDimA, outerShapeA, innerShapeA]);\n\t  var b3D = transposeB ? reshape($b, [batchDimB, outerShapeB, innerShapeB]) : reshape($b, [batchDimB, innerShapeB, outerShapeB]);\n\t  var $bias;\n\n\t  if (bias != null) {\n\t    $bias = convertToTensor(bias, 'bias', 'fused matMul');\n\n\t    var _makeTypesMatch2 = makeTypesMatch($bias, $a);\n\n\t    $bias = _makeTypesMatch2[0];\n\t    assertAndGetBroadcastShape(outShape, $bias.shape);\n\t  }\n\n\t  var $preluActivationWeights;\n\n\t  if (preluActivationWeights != null) {\n\t    $preluActivationWeights = convertToTensor(preluActivationWeights, 'prelu weights', 'fused matMul');\n\t  }\n\n\t  var grad = function grad(dy, saved) {\n\t    var a3D = saved[0],\n\t        b3D = saved[1],\n\t        y = saved[2],\n\t        $bias = saved[3]; // we reshape dy because the result of the forward is not\n\t    // necessarily going to be a 3d tensor due to a reshape done at the end of\n\t    // the customOp.\n\n\t    var dyActivation = getFusedDyActivation(reshape(dy, y.shape), y, activation);\n\t    var aDer;\n\t    var bDer;\n\n\t    if (!transposeA && !transposeB) {\n\t      aDer = matMul(dyActivation, b3D, false, true);\n\t      bDer = matMul(a3D, dyActivation, true, false);\n\t    } else if (!transposeA && transposeB) {\n\t      aDer = matMul(dyActivation, b3D, false, false);\n\t      bDer = matMul(dyActivation, a3D, true, false);\n\t    } else if (transposeA && !transposeB) {\n\t      aDer = matMul(b3D, dyActivation, false, true);\n\t      bDer = matMul(a3D, dyActivation, false, false);\n\t    } else {\n\t      aDer = matMul(b3D, dyActivation, true, true);\n\t      bDer = matMul(dyActivation, a3D, true, true);\n\t    }\n\n\t    if (bias != null) {\n\t      var biasDer = getFusedBiasGradient($bias, dyActivation);\n\t      return [aDer, bDer, biasDer];\n\t    } else {\n\t      return [aDer, bDer];\n\t    }\n\t  };\n\n\t  var inputs = {\n\t    a: a3D,\n\t    b: b3D,\n\t    bias: $bias,\n\t    preluActivationWeights: $preluActivationWeights\n\t  };\n\t  var attrs = {\n\t    transposeA: transposeA,\n\t    transposeB: transposeB,\n\t    activation: activation,\n\t    leakyreluAlpha: leakyreluAlpha\n\t  }; // Depending on the the params passed in we will have different number of\n\t  // inputs and thus a a different number of elements in the gradient.\n\n\t  if (bias == null) {\n\t    var customOp = customGrad(function (a3D, b3D, save) {\n\t      var res = // tslint:disable-next-line: no-unnecessary-type-assertion\n\t      ENGINE.runKernel(_FusedMatMul, inputs, attrs);\n\t      save([a3D, b3D, res]);\n\t      return {\n\t        value: reshape(res, outShape),\n\t        gradFunc: grad\n\t      };\n\t    });\n\t    return customOp(a3D, b3D);\n\t  } else {\n\t    var customOpWithBias = customGrad(function (a3D, b3D, $bias, save) {\n\t      var res = // tslint:disable-next-line: no-unnecessary-type-assertion\n\t      ENGINE.runKernel(_FusedMatMul, inputs, attrs);\n\t      save([a3D, b3D, res, $bias]);\n\t      return {\n\t        value: reshape(res, outShape),\n\t        gradFunc: grad\n\t      };\n\t    });\n\t    return customOpWithBias(a3D, b3D, $bias);\n\t  }\n\t}\n\n\tvar matMul$1 = op({\n\t  fusedMatMul_: fusedMatMul_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tvar fused_ops = {\n\t\t__proto__: null,\n\t\tconv2d: conv2d$1,\n\t\tdepthwiseConv2d: depthwiseConv2d$1,\n\t\tmatMul: matMul$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Generate a hamming window.\n\t *\n\t * See: https://en.wikipedia.org/wiki/Window_function#Hann_and_Hamming_windows\n\t *\n\t * ```js\n\t * tf.signal.hammingWindow(10).print();\n\t * ```\n\t * @param The length of window\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Signal', namespace: 'signal'}\n\t */\n\n\tfunction hammingWindow_(windowLength) {\n\t  return cosineWindow(windowLength, 0.54, 0.46);\n\t}\n\n\tvar hammingWindow = op({\n\t  hammingWindow_: hammingWindow_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Generate a Hann window.\n\t *\n\t * See: https://en.wikipedia.org/wiki/Window_function#Hann_and_Hamming_windows\n\t *\n\t * ```js\n\t * tf.signal.hannWindow(10).print();\n\t * ```\n\t * @param The length of window\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Signal', namespace: 'signal'}\n\t */\n\n\tfunction hannWindow_(windowLength) {\n\t  return cosineWindow(windowLength, 0.5, 0.5);\n\t}\n\n\tvar hannWindow = op({\n\t  hannWindow_: hannWindow_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Expands input into frames of frameLength.\n\t * Slides a window size with frameStep.\n\t *\n\t * ```js\n\t * tf.signal.frame([1, 2, 3], 2, 1).print();\n\t * ```\n\t * @param signal The input tensor to be expanded\n\t * @param frameLength Length of each frame\n\t * @param frameStep The frame hop size in samples.\n\t * @param padEnd Whether to pad the end of signal with padValue.\n\t * @param padValue An number to use where the input signal does\n\t *     not exist when padEnd is True.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Signal', namespace: 'signal'}\n\t */\n\n\tfunction frame_(signal, frameLength, frameStep, padEnd, padValue) {\n\t  if (padEnd === void 0) {\n\t    padEnd = false;\n\t  }\n\n\t  if (padValue === void 0) {\n\t    padValue = 0;\n\t  }\n\n\t  var start = 0;\n\t  var output = [];\n\n\t  while (start + frameLength <= signal.size) {\n\t    output.push(slice$2(signal, start, frameLength));\n\t    start += frameStep;\n\t  }\n\n\t  if (padEnd) {\n\t    while (start < signal.size) {\n\t      var padLen = start + frameLength - signal.size;\n\t      var pad = concat([slice$2(signal, start, frameLength - padLen), fill([padLen], padValue)]);\n\t      output.push(pad);\n\t      start += frameStep;\n\t    }\n\t  }\n\n\t  if (output.length === 0) {\n\t    return tensor2d([], [0, frameLength]);\n\t  }\n\n\t  return reshape(concat(output), [output.length, frameLength]);\n\t}\n\n\tvar frame = op({\n\t  frame_: frame_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the Short-time Fourier Transform of signals\n\t * See: https://en.wikipedia.org/wiki/Short-time_Fourier_transform\n\t *\n\t * ```js\n\t * const input = tf.tensor1d([1, 1, 1, 1, 1])\n\t * tf.signal.stft(input, 3, 1).print();\n\t * ```\n\t * @param signal 1-dimensional real value tensor.\n\t * @param frameLength The window length of samples.\n\t * @param frameStep The number of samples to step.\n\t * @param fftLength The size of the FFT to apply.\n\t * @param windowFn A callable that takes a window length and returns 1-d tensor.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Signal', namespace: 'signal'}\n\t */\n\n\tfunction stft_(signal, frameLength, frameStep, fftLength, windowFn) {\n\t  if (windowFn === void 0) {\n\t    windowFn = hannWindow;\n\t  }\n\n\t  if (fftLength == null) {\n\t    fftLength = enclosingPowerOfTwo(frameLength);\n\t  }\n\n\t  var framedSignal = frame(signal, frameLength, frameStep);\n\t  var windowedSignal = mul(framedSignal, windowFn(frameLength));\n\t  var output = [];\n\n\t  for (var i = 0; i < framedSignal.shape[0]; i++) {\n\t    output.push(rfft(slice$2(windowedSignal, [i, 0], [1, frameLength]), fftLength));\n\t  }\n\n\t  return concat(output);\n\t}\n\n\tvar stft = op({\n\t  stft_: stft_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Extracts crops from the input image tensor and resizes them using bilinear\n\t * sampling or nearest neighbor sampling (possibly with aspect ratio change)\n\t * to a common output size specified by cropSize.\n\t *\n\t * @param image 4d tensor of shape `[batch,imageHeight,imageWidth, depth]`,\n\t *     where imageHeight and imageWidth must be positive, specifying the\n\t *     batch of images from which to take crops\n\t * @param boxes 2d float32 tensor of shape `[numBoxes, 4]`. Each entry is\n\t *     `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the normalized\n\t *     coordinates of the box in the boxInd[i]'th image in the batch\n\t * @param boxInd 1d int32 tensor of shape `[numBoxes]` with values in range\n\t *     `[0, batch)` that specifies the image that the `i`-th box refers to.\n\t * @param cropSize 1d int32 tensor of 2 elements `[cropHeigh, cropWidth]`\n\t *     specifying the size to which all crops are resized to.\n\t * @param method Optional string from `'bilinear' | 'nearest'`,\n\t *     defaults to bilinear, which specifies the sampling method for resizing\n\t * @param extrapolationValue A threshold for deciding when to remove boxes based\n\t *     on score. Defaults to 0.\n\t * @return A 4D tensor of the shape `[numBoxes,cropHeight,cropWidth,depth]`\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n\t */\n\n\tfunction cropAndResize_(image, boxes, boxInd, cropSize, method, extrapolationValue) {\n\t  if (method === void 0) {\n\t    method = 'bilinear';\n\t  }\n\n\t  if (extrapolationValue === void 0) {\n\t    extrapolationValue = 0;\n\t  }\n\n\t  var $image = convertToTensor(image, 'image', 'cropAndResize');\n\t  var $boxes = convertToTensor(boxes, 'boxes', 'cropAndResize', 'float32');\n\t  var $boxInd = convertToTensor(boxInd, 'boxInd', 'cropAndResize', 'int32');\n\t  var numBoxes = $boxes.shape[0];\n\t  assert($image.rank === 4, function () {\n\t    return 'Error in cropAndResize: image must be rank 4,' + (\"but got rank \" + $image.rank + \".\");\n\t  });\n\t  assert($boxes.rank === 2 && $boxes.shape[1] === 4, function () {\n\t    return \"Error in cropAndResize: boxes must be have size [\" + numBoxes + \",4] \" + (\"but had shape \" + $boxes.shape + \".\");\n\t  });\n\t  assert($boxInd.rank === 1 && $boxInd.shape[0] === numBoxes, function () {\n\t    return \"Error in cropAndResize: boxInd must be have size [\" + numBoxes + \"] \" + (\"but had shape \" + $boxes.shape + \".\");\n\t  });\n\t  assert(cropSize.length === 2, function () {\n\t    return \"Error in cropAndResize: cropSize must be of length 2, but got \" + (\"length \" + cropSize.length + \".\");\n\t  });\n\t  assert(cropSize[0] >= 1 && cropSize[1] >= 1, function () {\n\t    return \"cropSize must be atleast [1,1], but was \" + cropSize;\n\t  });\n\t  assert(method === 'bilinear' || method === 'nearest', function () {\n\t    return \"method must be bilinear or nearest, but was \" + method;\n\t  });\n\t  var inputs = {\n\t    image: $image,\n\t    boxes: $boxes,\n\t    boxInd: $boxInd\n\t  };\n\t  var attrs = {\n\t    method: method,\n\t    extrapolationValue: extrapolationValue,\n\t    cropSize: cropSize\n\t  };\n\t  var res = ENGINE.runKernel(CropAndResize, inputs, attrs);\n\t  return res;\n\t}\n\n\tvar cropAndResize = op({\n\t  cropAndResize_: cropAndResize_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Flips the image left to right. Currently available in the CPU, WebGL, and\n\t * WASM backends.\n\t *\n\t * @param image 4d tensor of shape `[batch, imageHeight, imageWidth, depth]`.\n\t */\n\n\t/** @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'} */\n\n\tfunction flipLeftRight_(image) {\n\t  var $image = convertToTensor(image, 'image', 'flipLeftRight', 'float32');\n\t  assert($image.rank === 4, function () {\n\t    return 'Error in flipLeftRight: image must be rank 4,' + (\"but got rank \" + $image.rank + \".\");\n\t  });\n\t  var inputs = {\n\t    image: $image\n\t  };\n\t  var res = ENGINE.runKernel(FlipLeftRight, inputs, {});\n\t  return res;\n\t}\n\n\tvar flipLeftRight = op({\n\t  flipLeftRight_: flipLeftRight_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Rotates the input image tensor counter-clockwise with an optional offset\n\t * center of rotation. Currently available in the CPU, WebGL, and WASM backends.\n\t *\n\t * @param image 4d tensor of shape `[batch, imageHeight, imageWidth, depth]`.\n\t * @param radians The amount of rotation.\n\t * @param fillValue The value to fill in the empty space leftover\n\t *     after rotation. Can be either a single grayscale value (0-255), or an\n\t *     array of three numbers `[red, green, blue]` specifying the red, green,\n\t *     and blue channels. Defaults to `0` (black).\n\t * @param center The center of rotation. Can be either a single value (0-1), or\n\t *     an array of two numbers `[centerX, centerY]`. Defaults to `0.5` (rotates\n\t *     the image around its center).\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n\t */\n\n\tfunction rotateWithOffset_(image, radians, fillValue, center) {\n\t  if (fillValue === void 0) {\n\t    fillValue = 0;\n\t  }\n\n\t  if (center === void 0) {\n\t    center = 0.5;\n\t  }\n\n\t  var $image = convertToTensor(image, 'image', 'rotateWithOffset', 'float32');\n\t  assert($image.rank === 4, function () {\n\t    return 'Error in rotateWithOffset: image must be rank 4,' + (\"but got rank \" + $image.rank + \".\");\n\t  });\n\t  var inputs = {\n\t    image: $image\n\t  };\n\t  var attrs = {\n\t    radians: radians,\n\t    fillValue: fillValue,\n\t    center: center\n\t  };\n\t  var res = ENGINE.runKernel(RotateWithOffset, inputs, attrs);\n\t  return res;\n\t}\n\n\tvar rotateWithOffset = op({\n\t  rotateWithOffset_: rotateWithOffset_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tfunction nonMaxSuppSanityCheck(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma) {\n\t  if (iouThreshold == null) {\n\t    iouThreshold = 0.5;\n\t  }\n\n\t  if (scoreThreshold == null) {\n\t    scoreThreshold = Number.NEGATIVE_INFINITY;\n\t  }\n\n\t  if (softNmsSigma == null) {\n\t    softNmsSigma = 0.0;\n\t  }\n\n\t  var numBoxes = boxes.shape[0];\n\t  maxOutputSize = Math.min(maxOutputSize, numBoxes);\n\t  assert(0 <= iouThreshold && iouThreshold <= 1, function () {\n\t    return \"iouThreshold must be in [0, 1], but was '\" + iouThreshold + \"'\";\n\t  });\n\t  assert(boxes.rank === 2, function () {\n\t    return \"boxes must be a 2D tensor, but was of rank '\" + boxes.rank + \"'\";\n\t  });\n\t  assert(boxes.shape[1] === 4, function () {\n\t    return \"boxes must have 4 columns, but 2nd dimension was \" + boxes.shape[1];\n\t  });\n\t  assert(scores.rank === 1, function () {\n\t    return 'scores must be a 1D tensor';\n\t  });\n\t  assert(scores.shape[0] === numBoxes, function () {\n\t    return \"scores has incompatible shape with boxes. Expected \" + numBoxes + \", \" + (\"but was \" + scores.shape[0]);\n\t  });\n\t  assert(0 <= softNmsSigma && softNmsSigma <= 1, function () {\n\t    return \"softNmsSigma must be in [0, 1], but was '\" + softNmsSigma + \"'\";\n\t  });\n\t  return {\n\t    maxOutputSize: maxOutputSize,\n\t    iouThreshold: iouThreshold,\n\t    scoreThreshold: scoreThreshold,\n\t    softNmsSigma: softNmsSigma\n\t  };\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Performs non maximum suppression of bounding boxes based on\n\t * iou (intersection over union).\n\t *\n\t * @param boxes a 2d tensor of shape `[numBoxes, 4]`. Each entry is\n\t *     `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the corners of\n\t *     the bounding box.\n\t * @param scores a 1d tensor providing the box scores of shape `[numBoxes]`.\n\t * @param maxOutputSize The maximum number of boxes to be selected.\n\t * @param iouThreshold A float representing the threshold for deciding whether\n\t *     boxes overlap too much with respect to IOU. Must be between [0, 1].\n\t *     Defaults to 0.5 (50% box overlap).\n\t * @param scoreThreshold A threshold for deciding when to remove boxes based\n\t *     on score. Defaults to -inf, which means any score is accepted.\n\t * @return A 1D tensor with the selected box indices.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n\t */\n\n\tfunction nonMaxSuppression_(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold) {\n\t  if (iouThreshold === void 0) {\n\t    iouThreshold = 0.5;\n\t  }\n\n\t  if (scoreThreshold === void 0) {\n\t    scoreThreshold = Number.NEGATIVE_INFINITY;\n\t  }\n\n\t  var $boxes = convertToTensor(boxes, 'boxes', 'nonMaxSuppression');\n\t  var $scores = convertToTensor(scores, 'scores', 'nonMaxSuppression');\n\t  var inputs = nonMaxSuppSanityCheck($boxes, $scores, maxOutputSize, iouThreshold, scoreThreshold);\n\t  maxOutputSize = inputs.maxOutputSize;\n\t  iouThreshold = inputs.iouThreshold;\n\t  scoreThreshold = inputs.scoreThreshold;\n\t  var attrs = {\n\t    maxOutputSize: maxOutputSize,\n\t    iouThreshold: iouThreshold,\n\t    scoreThreshold: scoreThreshold\n\t  };\n\t  return ENGINE.runKernel(NonMaxSuppressionV3, {\n\t    boxes: $boxes,\n\t    scores: $scores\n\t  }, attrs);\n\t}\n\n\tvar nonMaxSuppression = op({\n\t  nonMaxSuppression_: nonMaxSuppression_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\t/**\n\t * Inserts a value into a sorted array. This method allows duplicate, meaning it\n\t * allows inserting duplicate value, in which case, the element will be inserted\n\t * at the lowest index of the value.\n\t * @param arr The array to modify.\n\t * @param element The element to insert.\n\t * @param comparator Optional. If no comparator is specified, elements are\n\t * compared using array_util.defaultComparator, which is suitable for Strings\n\t * and Numbers in ascending arrays. If the array contains multiple instances of\n\t * the target value, the left-most instance will be returned. To provide a\n\t * comparator, it should take 2 arguments to compare and return a negative,\n\t * zero, or a positive number.\n\t */\n\tfunction binaryInsert(arr, element, comparator) {\n\t  var index = binarySearch(arr, element, comparator);\n\t  var insertionPoint = index < 0 ? -(index + 1) : index;\n\t  arr.splice(insertionPoint, 0, element);\n\t}\n\t/**\n\t * Searches the array for the target using binary search, returns the index\n\t * of the found element, or position to insert if element not found. If no\n\t * comparator is specified, elements are compared using array_\n\t * util.defaultComparator, which is suitable for Strings and Numbers in\n\t * ascending arrays. If the array contains multiple instances of the target\n\t * value, the left-most instance will be returned.\n\t * @param arr The array to be searched in.\n\t * @param target The target to be searched for.\n\t * @param comparator Should take 2 arguments to compare and return a negative,\n\t *    zero, or a positive number.\n\t * @return Lowest index of the target value if found, otherwise the insertion\n\t *    point where the target should be inserted, in the form of\n\t *    (-insertionPoint - 1).\n\t */\n\n\tfunction binarySearch(arr, target, comparator) {\n\t  return binarySearch_(arr, target, comparator || defaultComparator);\n\t}\n\t/**\n\t * Compares its two arguments for order.\n\t * @param a The first element to be compared.\n\t * @param b The second element to be compared.\n\t * @return A negative number, zero, or a positive number as the first\n\t *     argument is less than, equal to, or greater than the second.\n\t */\n\n\tfunction defaultComparator(a, b) {\n\t  return a > b ? 1 : a < b ? -1 : 0;\n\t}\n\n\tfunction binarySearch_(arr, target, comparator) {\n\t  var left = 0;\n\t  var right = arr.length;\n\t  var middle = 0;\n\t  var found = false;\n\n\t  while (left < right) {\n\t    middle = left + (right - left >>> 1);\n\t    var compareResult = comparator(target, arr[middle]);\n\n\t    if (compareResult > 0) {\n\t      left = middle + 1;\n\t    } else {\n\t      right = middle; // If compareResult is 0, the value is found. We record it is found,\n\t      // and then keep looking because there may be duplicate.\n\n\t      found = !compareResult;\n\t    }\n\t  }\n\n\t  return found ? left : -left - 1;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction nonMaxSuppressionV3Impl(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold) {\n\t  return nonMaxSuppressionImpl_(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, 0\n\t  /* softNmsSigma */\n\t  );\n\t}\n\tfunction nonMaxSuppressionV4Impl(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize) {\n\t  return nonMaxSuppressionImpl_(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, 0\n\t  /* softNmsSigma */\n\t  , false\n\t  /* returnScoresTensor */\n\t  , padToMaxOutputSize\n\t  /* padToMaxOutputSize */\n\t  , true\n\t  /* returnValidOutputs */\n\t  );\n\t}\n\tfunction nonMaxSuppressionV5Impl(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma) {\n\t  return nonMaxSuppressionImpl_(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma, true\n\t  /* returnScoresTensor */\n\t  );\n\t}\n\n\tfunction nonMaxSuppressionImpl_(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma, returnScoresTensor, padToMaxOutputSize, returnValidOutputs) {\n\t  if (returnScoresTensor === void 0) {\n\t    returnScoresTensor = false;\n\t  }\n\n\t  if (padToMaxOutputSize === void 0) {\n\t    padToMaxOutputSize = false;\n\t  }\n\n\t  if (returnValidOutputs === void 0) {\n\t    returnValidOutputs = false;\n\t  }\n\n\t  // The list is sorted in ascending order, so that we can always pop the\n\t  // candidate with the largest score in O(1) time.\n\t  var candidates = [];\n\n\t  for (var i = 0; i < scores.length; i++) {\n\t    if (scores[i] > scoreThreshold) {\n\t      candidates.push({\n\t        score: scores[i],\n\t        boxIndex: i,\n\t        suppressBeginIndex: 0\n\t      });\n\t    }\n\t  }\n\n\t  candidates.sort(ascendingComparator); // If softNmsSigma is 0, the outcome of this algorithm is exactly same as\n\t  // before.\n\n\t  var scale = softNmsSigma > 0 ? -0.5 / softNmsSigma : 0.0;\n\t  var selectedIndices = [];\n\t  var selectedScores = [];\n\n\t  while (selectedIndices.length < maxOutputSize && candidates.length > 0) {\n\t    var candidate = candidates.pop();\n\t    var originalScore = candidate.score,\n\t        boxIndex = candidate.boxIndex,\n\t        suppressBeginIndex = candidate.suppressBeginIndex;\n\n\t    if (originalScore < scoreThreshold) {\n\t      break;\n\t    } // Overlapping boxes are likely to have similar scores, therefore we\n\t    // iterate through the previously selected boxes backwards in order to\n\t    // see if candidate's score should be suppressed. We use\n\t    // suppressBeginIndex to track and ensure a candidate can be suppressed\n\t    // by a selected box no more than once. Also, if the overlap exceeds\n\t    // iouThreshold, we simply ignore the candidate.\n\n\n\t    var ignoreCandidate = false;\n\n\t    for (var j = selectedIndices.length - 1; j >= suppressBeginIndex; --j) {\n\t      var iou = intersectionOverUnion(boxes, boxIndex, selectedIndices[j]);\n\n\t      if (iou >= iouThreshold) {\n\t        ignoreCandidate = true;\n\t        break;\n\t      }\n\n\t      candidate.score = candidate.score * suppressWeight(iouThreshold, scale, iou);\n\n\t      if (candidate.score <= scoreThreshold) {\n\t        break;\n\t      }\n\t    } // At this point, if `candidate.score` has not dropped below\n\t    // `scoreThreshold`, then we know that we went through all of the\n\t    // previous selections and can safely update `suppressBeginIndex` to the\n\t    // end of the selected array. Then we can re-insert the candidate with\n\t    // the updated score and suppressBeginIndex back in the candidate list.\n\t    // If on the other hand, `candidate.score` has dropped below the score\n\t    // threshold, we will not add it back to the candidates list.\n\n\n\t    candidate.suppressBeginIndex = selectedIndices.length;\n\n\t    if (!ignoreCandidate) {\n\t      // Candidate has passed all the tests, and is not suppressed, so\n\t      // select the candidate.\n\t      if (candidate.score === originalScore) {\n\t        selectedIndices.push(boxIndex);\n\t        selectedScores.push(candidate.score);\n\t      } else if (candidate.score > scoreThreshold) {\n\t        // Candidate's score is suppressed but is still high enough to be\n\t        // considered, so add back to the candidates list.\n\t        binaryInsert(candidates, candidate, ascendingComparator);\n\t      }\n\t    }\n\t  } // NonMaxSuppressionV4 feature: padding output to maxOutputSize.\n\n\n\t  var validOutputs = selectedIndices.length;\n\t  var elemsToPad = maxOutputSize - validOutputs;\n\n\t  if (padToMaxOutputSize && elemsToPad > 0) {\n\t    selectedIndices.push.apply(selectedIndices, new Array(elemsToPad).fill(0));\n\t    selectedScores.push.apply(selectedScores, new Array(elemsToPad).fill(0.0));\n\t  }\n\n\t  var result = {\n\t    selectedIndices: selectedIndices\n\t  };\n\n\t  if (returnScoresTensor) {\n\t    result['selectedScores'] = selectedScores;\n\t  }\n\n\t  if (returnValidOutputs) {\n\t    result['validOutputs'] = validOutputs;\n\t  }\n\n\t  return result;\n\t}\n\n\tfunction intersectionOverUnion(boxes, i, j) {\n\t  var iCoord = boxes.subarray(i * 4, i * 4 + 4);\n\t  var jCoord = boxes.subarray(j * 4, j * 4 + 4);\n\t  var yminI = Math.min(iCoord[0], iCoord[2]);\n\t  var xminI = Math.min(iCoord[1], iCoord[3]);\n\t  var ymaxI = Math.max(iCoord[0], iCoord[2]);\n\t  var xmaxI = Math.max(iCoord[1], iCoord[3]);\n\t  var yminJ = Math.min(jCoord[0], jCoord[2]);\n\t  var xminJ = Math.min(jCoord[1], jCoord[3]);\n\t  var ymaxJ = Math.max(jCoord[0], jCoord[2]);\n\t  var xmaxJ = Math.max(jCoord[1], jCoord[3]);\n\t  var areaI = (ymaxI - yminI) * (xmaxI - xminI);\n\t  var areaJ = (ymaxJ - yminJ) * (xmaxJ - xminJ);\n\n\t  if (areaI <= 0 || areaJ <= 0) {\n\t    return 0.0;\n\t  }\n\n\t  var intersectionYmin = Math.max(yminI, yminJ);\n\t  var intersectionXmin = Math.max(xminI, xminJ);\n\t  var intersectionYmax = Math.min(ymaxI, ymaxJ);\n\t  var intersectionXmax = Math.min(xmaxI, xmaxJ);\n\t  var intersectionArea = Math.max(intersectionYmax - intersectionYmin, 0.0) * Math.max(intersectionXmax - intersectionXmin, 0.0);\n\t  return intersectionArea / (areaI + areaJ - intersectionArea);\n\t} // A Gaussian penalty function, this method always returns values in [0, 1].\n\t// The weight is a function of similarity, the more overlap two boxes are, the\n\t// smaller the weight is, meaning highly overlapping boxe will be significantly\n\t// penalized. On the other hand, a non-overlapping box will not be penalized.\n\n\n\tfunction suppressWeight(iouThreshold, scale, iou) {\n\t  var weight = Math.exp(scale * iou * iou);\n\t  return iou <= iouThreshold ? weight : 0.0;\n\t}\n\n\tfunction ascendingComparator(c1, c2) {\n\t  // For objects with same scores, we make the object with the larger index go\n\t  // first. In an array that pops from the end, this means that the object with\n\t  // the smaller index will be popped first. This ensures the same output as\n\t  // the TensorFlow python version.\n\t  return c1.score - c2.score || c1.score === c2.score && c2.boxIndex - c1.boxIndex;\n\t}\n\n\t/**\n\t * Performs non maximum suppression of bounding boxes based on\n\t * iou (intersection over union).\n\t *\n\t * This is the async version of `nonMaxSuppression`\n\t *\n\t * @param boxes a 2d tensor of shape `[numBoxes, 4]`. Each entry is\n\t *     `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the corners of\n\t *     the bounding box.\n\t * @param scores a 1d tensor providing the box scores of shape `[numBoxes]`.\n\t * @param maxOutputSize The maximum number of boxes to be selected.\n\t * @param iouThreshold A float representing the threshold for deciding whether\n\t *     boxes overlap too much with respect to IOU. Must be between [0, 1].\n\t *     Defaults to 0.5 (50% box overlap).\n\t * @param scoreThreshold A threshold for deciding when to remove boxes based\n\t *     on score. Defaults to -inf, which means any score is accepted.\n\t * @return A 1D tensor with the selected box indices.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n\t */\n\n\tfunction nonMaxSuppressionAsync_(_x, _x2, _x3, _x4, _x5) {\n\t  return _nonMaxSuppressionAsync_.apply(this, arguments);\n\t}\n\n\tfunction _nonMaxSuppressionAsync_() {\n\t  _nonMaxSuppressionAsync_ = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold) {\n\t    var $boxes, $scores, inputs, boxesAndScores, boxesVals, scoresVals, _nonMaxSuppressionV3I, selectedIndices;\n\n\t    return regeneratorRuntime.wrap(function _callee$(_context) {\n\t      while (1) {\n\t        switch (_context.prev = _context.next) {\n\t          case 0:\n\t            if (iouThreshold === void 0) {\n\t              iouThreshold = 0.5;\n\t            }\n\n\t            if (scoreThreshold === void 0) {\n\t              scoreThreshold = Number.NEGATIVE_INFINITY;\n\t            }\n\n\t            $boxes = convertToTensor(boxes, 'boxes', 'nonMaxSuppressionAsync');\n\t            $scores = convertToTensor(scores, 'scores', 'nonMaxSuppressionAsync');\n\t            inputs = nonMaxSuppSanityCheck($boxes, $scores, maxOutputSize, iouThreshold, scoreThreshold);\n\t            maxOutputSize = inputs.maxOutputSize;\n\t            iouThreshold = inputs.iouThreshold;\n\t            scoreThreshold = inputs.scoreThreshold;\n\t            _context.next = 10;\n\t            return Promise.all([$boxes.data(), $scores.data()]);\n\n\t          case 10:\n\t            boxesAndScores = _context.sent;\n\t            boxesVals = boxesAndScores[0];\n\t            scoresVals = boxesAndScores[1]; // We call a cpu based impl directly with the typedarray data  here rather\n\t            // than a kernel because all kernels are synchronous (and thus cannot await\n\t            // .data()).\n\n\t            _nonMaxSuppressionV3I = nonMaxSuppressionV3Impl(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold), selectedIndices = _nonMaxSuppressionV3I.selectedIndices;\n\n\t            if ($boxes !== boxes) {\n\t              $boxes.dispose();\n\t            }\n\n\t            if ($scores !== scores) {\n\t              $scores.dispose();\n\t            }\n\n\t            return _context.abrupt(\"return\", tensor1d(selectedIndices, 'int32'));\n\n\t          case 17:\n\t          case \"end\":\n\t            return _context.stop();\n\t        }\n\t      }\n\t    }, _callee);\n\t  }));\n\t  return _nonMaxSuppressionAsync_.apply(this, arguments);\n\t}\n\n\tvar nonMaxSuppressionAsync = nonMaxSuppressionAsync_;\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Performs non maximum suppression of bounding boxes based on\n\t * iou (intersection over union).\n\t *\n\t * This op also supports a Soft-NMS mode (c.f.\n\t * Bodla et al, https://arxiv.org/abs/1704.04503) where boxes reduce the score\n\t * of other overlapping boxes, therefore favoring different regions of the image\n\t * with high scores. To enable this Soft-NMS mode, set the `softNmsSigma`\n\t * parameter to be larger than 0.\n\t *\n\t * @param boxes a 2d tensor of shape `[numBoxes, 4]`. Each entry is\n\t *     `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the corners of\n\t *     the bounding box.\n\t * @param scores a 1d tensor providing the box scores of shape `[numBoxes]`.\n\t * @param maxOutputSize The maximum number of boxes to be selected.\n\t * @param iouThreshold A float representing the threshold for deciding whether\n\t *     boxes overlap too much with respect to IOU. Must be between [0, 1].\n\t *     Defaults to 0.5 (50% box overlap).\n\t * @param scoreThreshold A threshold for deciding when to remove boxes based\n\t *     on score. Defaults to -inf, which means any score is accepted.\n\t * @param softNmsSigma A float representing the sigma parameter for Soft NMS.\n\t *     When sigma is 0, it falls back to nonMaxSuppression.\n\t * @return A map with the following properties:\n\t *     - selectedIndices: A 1D tensor with the selected box indices.\n\t *     - selectedScores: A 1D tensor with the corresponding scores for each\n\t *       selected box.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n\t */\n\n\tfunction nonMaxSuppressionWithScore_(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma) {\n\t  if (iouThreshold === void 0) {\n\t    iouThreshold = 0.5;\n\t  }\n\n\t  if (scoreThreshold === void 0) {\n\t    scoreThreshold = Number.NEGATIVE_INFINITY;\n\t  }\n\n\t  if (softNmsSigma === void 0) {\n\t    softNmsSigma = 0.0;\n\t  }\n\n\t  var $boxes = convertToTensor(boxes, 'boxes', 'nonMaxSuppression');\n\t  var $scores = convertToTensor(scores, 'scores', 'nonMaxSuppression');\n\t  var params = nonMaxSuppSanityCheck($boxes, $scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma);\n\t  maxOutputSize = params.maxOutputSize;\n\t  iouThreshold = params.iouThreshold;\n\t  scoreThreshold = params.scoreThreshold;\n\t  softNmsSigma = params.softNmsSigma;\n\t  var inputs = {\n\t    boxes: $boxes,\n\t    scores: $scores\n\t  };\n\t  var attrs = {\n\t    maxOutputSize: maxOutputSize,\n\t    iouThreshold: iouThreshold,\n\t    scoreThreshold: scoreThreshold,\n\t    softNmsSigma: softNmsSigma\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var result = ENGINE.runKernel(NonMaxSuppressionV5, inputs, attrs);\n\t  return {\n\t    selectedIndices: result[0],\n\t    selectedScores: result[1]\n\t  };\n\t}\n\n\tvar nonMaxSuppressionWithScore = op({\n\t  nonMaxSuppressionWithScore_: nonMaxSuppressionWithScore_\n\t});\n\n\t/**\n\t * Asynchronously performs non maximum suppression of bounding boxes based on\n\t * iou (intersection over union).\n\t *\n\t * This op also supports a Soft-NMS mode (c.f.\n\t * Bodla et al, https://arxiv.org/abs/1704.04503) where boxes reduce the score\n\t * of other overlapping boxes, therefore favoring different regions of the image\n\t * with high scores. To enable this Soft-NMS mode, set the `softNmsSigma`\n\t * parameter to be larger than 0.\n\t *\n\t * @param boxes a 2d tensor of shape `[numBoxes, 4]`. Each entry is\n\t *     `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the corners of\n\t *     the bounding box.\n\t * @param scores a 1d tensor providing the box scores of shape `[numBoxes]`.\n\t * @param maxOutputSize The maximum number of boxes to be selected.\n\t * @param iouThreshold A float representing the threshold for deciding whether\n\t *     boxes overlap too much with respect to IOU. Must be between [0, 1].\n\t *     Defaults to 0.5 (50% box overlap).\n\t * @param scoreThreshold A threshold for deciding when to remove boxes based\n\t *     on score. Defaults to -inf, which means any score is accepted.\n\t * @param softNmsSigma A float representing the sigma parameter for Soft NMS.\n\t *     When sigma is 0, it falls back to nonMaxSuppression.\n\t * @return A map with the following properties:\n\t *     - selectedIndices: A 1D tensor with the selected box indices.\n\t *     - selectedScores: A 1D tensor with the corresponding scores for each\n\t *       selected box.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n\t */\n\n\tfunction nonMaxSuppressionWithScoreAsync_(_x, _x2, _x3, _x4, _x5, _x6) {\n\t  return _nonMaxSuppressionWithScoreAsync_.apply(this, arguments);\n\t}\n\n\tfunction _nonMaxSuppressionWithScoreAsync_() {\n\t  _nonMaxSuppressionWithScoreAsync_ = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma) {\n\t    var $boxes, $scores, params, boxesAndScores, boxesVals, scoresVals, _nonMaxSuppressionV5I, selectedIndices, selectedScores;\n\n\t    return regeneratorRuntime.wrap(function _callee$(_context) {\n\t      while (1) {\n\t        switch (_context.prev = _context.next) {\n\t          case 0:\n\t            if (iouThreshold === void 0) {\n\t              iouThreshold = 0.5;\n\t            }\n\n\t            if (scoreThreshold === void 0) {\n\t              scoreThreshold = Number.NEGATIVE_INFINITY;\n\t            }\n\n\t            if (softNmsSigma === void 0) {\n\t              softNmsSigma = 0.0;\n\t            }\n\n\t            $boxes = convertToTensor(boxes, 'boxes', 'nonMaxSuppressionAsync');\n\t            $scores = convertToTensor(scores, 'scores', 'nonMaxSuppressionAsync');\n\t            params = nonMaxSuppSanityCheck($boxes, $scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma);\n\t            maxOutputSize = params.maxOutputSize;\n\t            iouThreshold = params.iouThreshold;\n\t            scoreThreshold = params.scoreThreshold;\n\t            softNmsSigma = params.softNmsSigma;\n\t            _context.next = 12;\n\t            return Promise.all([$boxes.data(), $scores.data()]);\n\n\t          case 12:\n\t            boxesAndScores = _context.sent;\n\t            boxesVals = boxesAndScores[0];\n\t            scoresVals = boxesAndScores[1]; // We call a cpu based impl directly with the typedarray data  here rather\n\t            // than a kernel because all kernels are synchronous (and thus cannot await\n\t            // .data()).\n\n\t            _nonMaxSuppressionV5I = nonMaxSuppressionV5Impl(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma), selectedIndices = _nonMaxSuppressionV5I.selectedIndices, selectedScores = _nonMaxSuppressionV5I.selectedScores;\n\n\t            if ($boxes !== boxes) {\n\t              $boxes.dispose();\n\t            }\n\n\t            if ($scores !== scores) {\n\t              $scores.dispose();\n\t            }\n\n\t            return _context.abrupt(\"return\", {\n\t              selectedIndices: tensor1d(selectedIndices, 'int32'),\n\t              selectedScores: tensor1d(selectedScores)\n\t            });\n\n\t          case 19:\n\t          case \"end\":\n\t            return _context.stop();\n\t        }\n\t      }\n\t    }, _callee);\n\t  }));\n\t  return _nonMaxSuppressionWithScoreAsync_.apply(this, arguments);\n\t}\n\n\tvar nonMaxSuppressionWithScoreAsync = nonMaxSuppressionWithScoreAsync_;\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Asynchronously performs non maximum suppression of bounding boxes based on\n\t * iou (intersection over union), with an option to pad results.\n\t *\n\t * @param boxes a 2d tensor of shape `[numBoxes, 4]`. Each entry is\n\t *     `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the corners of\n\t *     the bounding box.\n\t * @param scores a 1d tensor providing the box scores of shape `[numBoxes]`.\n\t * @param maxOutputSize The maximum number of boxes to be selected.\n\t * @param iouThreshold A float representing the threshold for deciding whether\n\t *     boxes overlap too much with respect to IOU. Must be between [0, 1].\n\t *     Defaults to 0.5 (50% box overlap).\n\t * @param scoreThreshold A threshold for deciding when to remove boxes based\n\t *     on score. Defaults to -inf, which means any score is accepted.\n\t * @param padToMaxOutputSize Defalts to false. If true, size of output\n\t *     `selectedIndices` is padded to maxOutputSize.\n\t * @return A map with the following properties:\n\t *     - selectedIndices: A 1D tensor with the selected box indices.\n\t *     - validOutputs: A scalar denoting how many elements in `selectedIndices`\n\t *       are valid. Valid elements occur first, then padding.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n\t */\n\n\tfunction nonMaxSuppressionPadded_(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize) {\n\t  if (iouThreshold === void 0) {\n\t    iouThreshold = 0.5;\n\t  }\n\n\t  if (scoreThreshold === void 0) {\n\t    scoreThreshold = Number.NEGATIVE_INFINITY;\n\t  }\n\n\t  if (padToMaxOutputSize === void 0) {\n\t    padToMaxOutputSize = false;\n\t  }\n\n\t  var $boxes = convertToTensor(boxes, 'boxes', 'nonMaxSuppression');\n\t  var $scores = convertToTensor(scores, 'scores', 'nonMaxSuppression');\n\t  var params = nonMaxSuppSanityCheck($boxes, $scores, maxOutputSize, iouThreshold, scoreThreshold, null\n\t  /* softNmsSigma */\n\t  );\n\t  var $maxOutputSize = params.maxOutputSize;\n\t  var $iouThreshold = params.iouThreshold;\n\t  var $scoreThreshold = params.scoreThreshold;\n\t  var inputs = {\n\t    boxes: $boxes,\n\t    scores: $scores\n\t  };\n\t  var attrs = {\n\t    maxOutputSize: $maxOutputSize,\n\t    iouThreshold: $iouThreshold,\n\t    scoreThreshold: $scoreThreshold,\n\t    padToMaxOutputSize: padToMaxOutputSize\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var result = ENGINE.runKernel(NonMaxSuppressionV4, inputs, attrs);\n\t  return {\n\t    selectedIndices: result[0],\n\t    validOutputs: result[1]\n\t  };\n\t}\n\n\tvar nonMaxSuppressionPadded = op({\n\t  nonMaxSuppressionPadded_: nonMaxSuppressionPadded_\n\t});\n\n\t/**\n\t * Asynchronously performs non maximum suppression of bounding boxes based on\n\t * iou (intersection over union), with an option to pad results.\n\t *\n\t * @param boxes a 2d tensor of shape `[numBoxes, 4]`. Each entry is\n\t *     `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the corners of\n\t *     the bounding box.\n\t * @param scores a 1d tensor providing the box scores of shape `[numBoxes]`.\n\t * @param maxOutputSize The maximum number of boxes to be selected.\n\t * @param iouThreshold A float representing the threshold for deciding whether\n\t *     boxes overlap too much with respect to IOU. Must be between [0, 1].\n\t *     Defaults to 0.5 (50% box overlap).\n\t * @param scoreThreshold A threshold for deciding when to remove boxes based\n\t *     on score. Defaults to -inf, which means any score is accepted.\n\t * @param padToMaxOutputSize Defalts to false. If true, size of output\n\t *     `selectedIndices` is padded to maxOutputSize.\n\t * @return A map with the following properties:\n\t *     - selectedIndices: A 1D tensor with the selected box indices.\n\t *     - validOutputs: A scalar denoting how many elements in `selectedIndices`\n\t *       are valid. Valid elements occur first, then padding.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n\t */\n\n\tfunction nonMaxSuppressionPaddedAsync_(_x, _x2, _x3, _x4, _x5, _x6) {\n\t  return _nonMaxSuppressionPaddedAsync_.apply(this, arguments);\n\t}\n\n\tfunction _nonMaxSuppressionPaddedAsync_() {\n\t  _nonMaxSuppressionPaddedAsync_ = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize) {\n\t    var $boxes, $scores, params, $maxOutputSize, $iouThreshold, $scoreThreshold, _yield$Promise$all, boxesVals, scoresVals, _nonMaxSuppressionV4I, selectedIndices, validOutputs;\n\n\t    return regeneratorRuntime.wrap(function _callee$(_context) {\n\t      while (1) {\n\t        switch (_context.prev = _context.next) {\n\t          case 0:\n\t            if (iouThreshold === void 0) {\n\t              iouThreshold = 0.5;\n\t            }\n\n\t            if (scoreThreshold === void 0) {\n\t              scoreThreshold = Number.NEGATIVE_INFINITY;\n\t            }\n\n\t            if (padToMaxOutputSize === void 0) {\n\t              padToMaxOutputSize = false;\n\t            }\n\n\t            $boxes = convertToTensor(boxes, 'boxes', 'nonMaxSuppressionAsync');\n\t            $scores = convertToTensor(scores, 'scores', 'nonMaxSuppressionAsync');\n\t            params = nonMaxSuppSanityCheck($boxes, $scores, maxOutputSize, iouThreshold, scoreThreshold, null\n\t            /* softNmsSigma */\n\t            );\n\t            $maxOutputSize = params.maxOutputSize;\n\t            $iouThreshold = params.iouThreshold;\n\t            $scoreThreshold = params.scoreThreshold;\n\t            _context.next = 11;\n\t            return Promise.all([$boxes.data(), $scores.data()]);\n\n\t          case 11:\n\t            _yield$Promise$all = _context.sent;\n\t            boxesVals = _yield$Promise$all[0];\n\t            scoresVals = _yield$Promise$all[1];\n\t            // We call a cpu based impl directly with the typedarray data here rather\n\t            // than a kernel because all kernels are synchronous (and thus cannot await\n\t            // .data()).\n\t            _nonMaxSuppressionV4I = nonMaxSuppressionV4Impl(boxesVals, scoresVals, $maxOutputSize, $iouThreshold, $scoreThreshold, padToMaxOutputSize), selectedIndices = _nonMaxSuppressionV4I.selectedIndices, validOutputs = _nonMaxSuppressionV4I.validOutputs;\n\n\t            if ($boxes !== boxes) {\n\t              $boxes.dispose();\n\t            }\n\n\t            if ($scores !== scores) {\n\t              $scores.dispose();\n\t            }\n\n\t            return _context.abrupt(\"return\", {\n\t              selectedIndices: tensor1d(selectedIndices, 'int32'),\n\t              validOutputs: scalar(validOutputs, 'int32')\n\t            });\n\n\t          case 18:\n\t          case \"end\":\n\t            return _context.stop();\n\t        }\n\t      }\n\t    }, _callee);\n\t  }));\n\t  return _nonMaxSuppressionPaddedAsync_.apply(this, arguments);\n\t}\n\n\tvar nonMaxSuppressionPaddedAsync = nonMaxSuppressionPaddedAsync_;\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Bilinear resize a single 3D image or a batch of 3D images to a new shape.\n\t *\n\t * @param images The images, of rank 4 or rank 3, of shape\n\t *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n\t * @param size The new shape `[newHeight, newWidth]` to resize the\n\t *     images to. Each channel is resized individually.\n\t * @param alignCorners Defaults to `false`. If true, rescale\n\t *     input by `(new_height - 1) / (height - 1)`, which exactly aligns the 4\n\t *     corners of images and resized images. If false, rescale by\n\t *     `new_height / height`. Treat similarly the width dimension.\n\t * @param halfPixelCenters Defaults to `false`. Whether to assume pixel centers\n\t *     are at 0.5, which would make the floating point coordinates of the top\n\t *     left pixel 0.5, 0.5.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n\t */\n\n\tfunction resizeBilinear_(images, size, alignCorners, halfPixelCenters) {\n\t  if (alignCorners === void 0) {\n\t    alignCorners = false;\n\t  }\n\n\t  if (halfPixelCenters === void 0) {\n\t    halfPixelCenters = false;\n\t  }\n\n\t  var $images = convertToTensor(images, 'images', 'resizeBilinear');\n\t  assert($images.rank === 3 || $images.rank === 4, function () {\n\t    return \"Error in resizeBilinear: x must be rank 3 or 4, but got \" + (\"rank \" + $images.rank + \".\");\n\t  });\n\t  assert(size.length === 2, function () {\n\t    return \"Error in resizeBilinear: new shape must 2D, but got shape \" + (size + \".\");\n\t  });\n\t  assert(halfPixelCenters === false || alignCorners === false, function () {\n\t    return \"Error in resizeBilinear: If halfPixelCenters is true, \" + \"alignCorners must be false.\";\n\t  });\n\t  var batchImages = $images;\n\t  var reshapedTo4D = false;\n\n\t  if ($images.rank === 3) {\n\t    reshapedTo4D = true;\n\t    batchImages = reshape($images, [1, $images.shape[0], $images.shape[1], $images.shape[2]]);\n\t  }\n\n\t  var inputs = {\n\t    images: batchImages\n\t  };\n\t  var attrs = {\n\t    alignCorners: alignCorners,\n\t    halfPixelCenters: halfPixelCenters,\n\t    size: size\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var res = ENGINE.runKernel(ResizeBilinear, inputs, attrs);\n\n\t  if (reshapedTo4D) {\n\t    return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n\t  }\n\n\t  return res;\n\t}\n\n\tvar resizeBilinear = op({\n\t  resizeBilinear_: resizeBilinear_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * NearestNeighbor resize a batch of 3D images to a new shape.\n\t *\n\t * @param images The images, of rank 4 or rank 3, of shape\n\t *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n\t * @param size The new shape `[newHeight, newWidth]` to resize the\n\t *     images to. Each channel is resized individually.\n\t * @param alignCorners Defaults to False. If true, rescale\n\t *     input by `(new_height - 1) / (height - 1)`, which exactly aligns the 4\n\t *     corners of images and resized images. If false, rescale by\n\t *     `new_height / height`. Treat similarly the width dimension.\n\t * @param halfPixelCenters Defaults to `false`. Whether to assumes pixels are of\n\t *      half the actual dimensions, and yields more accurate resizes. This flag\n\t *      would also make the floating point coordinates of the top left pixel\n\t *      0.5, 0.5.\n\t *\n\t * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n\t */\n\n\tfunction resizeNearestNeighbor_(images, size, alignCorners, halfPixelCenters) {\n\t  if (alignCorners === void 0) {\n\t    alignCorners = false;\n\t  }\n\n\t  if (halfPixelCenters === void 0) {\n\t    halfPixelCenters = false;\n\t  }\n\n\t  var $images = convertToTensor(images, 'images', 'resizeNearestNeighbor');\n\t  assert($images.rank === 3 || $images.rank === 4, function () {\n\t    return \"Error in resizeNearestNeighbor: x must be rank 3 or 4, but got \" + (\"rank \" + $images.rank + \".\");\n\t  });\n\t  assert(size.length === 2, function () {\n\t    return \"Error in resizeNearestNeighbor: new shape must 2D, but got shape \" + (size + \".\");\n\t  });\n\t  assert($images.dtype === 'float32' || $images.dtype === 'int32', function () {\n\t    return '`images` must have `int32` or `float32` as dtype';\n\t  });\n\t  assert(halfPixelCenters === false || alignCorners === false, function () {\n\t    return \"Error in resizeNearestNeighbor: If halfPixelCenters is true, \" + \"alignCorners must be false.\";\n\t  });\n\t  var batchImages = $images;\n\t  var reshapedTo4D = false;\n\n\t  if ($images.rank === 3) {\n\t    reshapedTo4D = true;\n\t    batchImages = reshape($images, [1, $images.shape[0], $images.shape[1], $images.shape[2]]);\n\t  }\n\n\t  var inputs = {\n\t    images: batchImages\n\t  };\n\t  var attrs = {\n\t    alignCorners: alignCorners,\n\t    halfPixelCenters: halfPixelCenters,\n\t    size: size\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var res = ENGINE.runKernel(ResizeNearestNeighbor, inputs, attrs);\n\n\t  if (reshapedTo4D) {\n\t    return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n\t  }\n\n\t  return res;\n\t}\n\n\tvar resizeNearestNeighbor = op({\n\t  resizeNearestNeighbor_: resizeNearestNeighbor_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Copy a tensor setting everything outside a central band in each innermost\n\t * matrix to zero.\n\t *\n\t * The band part is computed as follows: Assume input has `k` dimensions\n\t * `[I, J, K, ..., M, N]`, then the output is a tensor with the same shape where\n\t * `band[i, j, k, ..., m, n] = in_band(m, n) * input[i, j, k, ..., m, n]`.\n\t * The indicator function\n\t * `in_band(m, n) = (num_lower < 0 || (m-n) <= num_lower))`\n\t * `&& (num_upper < 0 || (n-m) <= num_upper)`\n\t *\n\t * ```js\n\t * const x = tf.tensor2d([[ 0,  1,  2, 3],\n\t *                        [-1,  0,  1, 2],\n\t *                        [-2, -1,  0, 1],\n\t *                        [-3, -2, -1, 0]]);\n\t * let y = tf.linalg.bandPart(x, 1, -1);\n\t * y.print(); // [[ 0,  1,  2, 3],\n\t *            //  [-1,  0,  1, 2],\n\t *            //  [ 0, -1,  0, 1],\n\t *            //  [ 0, 0 , -1, 0]]\n\t * let z = tf.linalg.bandPart(x, 2, 1);\n\t * z.print(); // [[ 0,  1,  0, 0],\n\t *            //  [-1,  0,  1, 0],\n\t *            //  [-2, -1,  0, 1],\n\t *            //  [ 0, -2, -1, 0]]\n\t * ```\n\t *\n\t * @param x Rank `k` tensor\n\t * @param numLower Number of subdiagonals to keep.\n\t *   If negative, keep entire lower triangle.\n\t * @param numUpper Number of subdiagonals to keep.\n\t *   If negative, keep entire upper triangle.\n\t * @returns Rank `k` tensor of the same shape as input.\n\t *   The extracted banded tensor.\n\t *\n\t * @doc {heading:'Operations', subheading:'Linear Algebra', namespace:'linalg'}\n\t */\n\n\tfunction bandPart_(a, numLower, numUpper) {\n\t  assert(numLower % 1 === 0, function () {\n\t    return \"bandPart(): numLower must be an integer, got \" + numLower + \".\";\n\t  });\n\t  assert(numUpper % 1 === 0, function () {\n\t    return \"bandPart(): numUpper must be an integer, got \" + numUpper + \".\";\n\t  });\n\t  var $a = convertToTensor(a, 'a', 'bandPart');\n\t  assert($a.rank >= 2, function () {\n\t    return \"bandPart(): Rank must be at least 2, got \" + $a.rank + \".\";\n\t  });\n\t  var shape = $a.shape;\n\n\t  var _$a$shape$slice = $a.shape.slice(-2),\n\t      M = _$a$shape$slice[0],\n\t      N = _$a$shape$slice[1];\n\n\t  if (!(numLower <= M)) {\n\t    throw new Error(\"bandPart(): numLower (\" + numLower + \")\" + (\" must not be greater than the number of rows (\" + M + \").\"));\n\t  }\n\n\t  if (!(numUpper <= N)) {\n\t    throw new Error(\"bandPart(): numUpper (\" + numUpper + \")\" + (\" must not be greater than the number of columns (\" + N + \").\"));\n\t  }\n\n\t  if (numLower < 0) {\n\t    numLower = M;\n\t  }\n\n\t  if (numUpper < 0) {\n\t    numUpper = N;\n\t  }\n\n\t  var i = reshape(range(0, M, 1, 'int32'), [-1, 1]);\n\t  var j = range(0, N, 1, 'int32');\n\t  var ij = sub(i, j);\n\t  var inBand = logicalAnd(lessEqual(ij, scalar(+numLower, 'int32')), greaterEqual(ij, scalar(-numUpper, 'int32')));\n\t  var zero = zeros([M, N], $a.dtype);\n\t  return reshape(stack(unstack(reshape($a, [-1, M, N])).map(function (mat) {\n\t    return where(inBand, mat, zero);\n\t  })), shape);\n\t}\n\n\tvar bandPart = op({\n\t  bandPart_: bandPart_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Gram-Schmidt orthogonalization.\n\t *\n\t * ```js\n\t * const x = tf.tensor2d([[1, 2], [3, 4]]);\n\t * let y = tf.linalg.gramSchmidt(x);\n\t * y.print();\n\t * console.log('Othogonalized:');\n\t * y.dot(y.transpose()).print();  // should be nearly the identity matrix.\n\t * console.log('First row direction maintained:');\n\t * const data = await y.array();\n\t * console.log(data[0][1] / data[0][0]);  // should be nearly 2.\n\t * ```\n\t *\n\t * @param xs The vectors to be orthogonalized, in one of the two following\n\t *   formats:\n\t *   - An Array of `tf.Tensor1D`.\n\t *   - A `tf.Tensor2D`, i.e., a matrix, in which case the vectors are the rows\n\t *     of `xs`.\n\t *   In each case, all the vectors must have the same length and the length\n\t *   must be greater than or equal to the number of vectors.\n\t * @returns The orthogonalized and normalized vectors or matrix.\n\t *   Orthogonalization means that the vectors or the rows of the matrix\n\t *   are orthogonal (zero inner products). Normalization means that each\n\t *   vector or each row of the matrix has an L2 norm that equals `1`.\n\t *\n\t * @doc {heading:'Operations', subheading:'Linear Algebra', namespace:'linalg'}\n\t */\n\n\tfunction gramSchmidt_(xs) {\n\t  var inputIsTensor2D;\n\n\t  if (Array.isArray(xs)) {\n\t    (function () {\n\t      inputIsTensor2D = false;\n\t      assert(xs != null && xs.length > 0, function () {\n\t        return 'Gram-Schmidt process: input must not be null, undefined, or ' + 'empty';\n\t      });\n\t      var dim = xs[0].shape[0];\n\n\t      var _loop = function _loop(i) {\n\t        assert(xs[i].shape[0] === dim, function () {\n\t          return 'Gram-Schmidt: Non-unique lengths found in the input vectors: ' + (\"(\" + xs[i].shape[0] + \" vs. \" + dim + \")\");\n\t        });\n\t      };\n\n\t      for (var i = 1; i < xs.length; ++i) {\n\t        _loop(i);\n\t      }\n\t    })();\n\t  } else {\n\t    inputIsTensor2D = true;\n\t    xs = split$1(xs, xs.shape[0], 0).map(function (x) {\n\t      return squeeze(x, [0]);\n\t    });\n\t  }\n\n\t  assert(xs.length <= xs[0].shape[0], function () {\n\t    return \"Gram-Schmidt: Number of vectors (\" + xs.length + \") exceeds \" + (\"number of dimensions (\" + xs[0].shape[0] + \").\");\n\t  });\n\t  var ys = [];\n\t  var xs1d = xs;\n\n\t  var _loop2 = function _loop2(i) {\n\t    ys.push(ENGINE.tidy(function () {\n\t      var x = xs1d[i];\n\n\t      if (i > 0) {\n\t        for (var j = 0; j < i; ++j) {\n\t          var proj = mul(sum$1(mul(ys[j], x)), ys[j]);\n\t          x = sub(x, proj);\n\t        }\n\t      }\n\n\t      return div(x, norm(x, 'euclidean'));\n\t    }));\n\t  };\n\n\t  for (var i = 0; i < xs.length; ++i) {\n\t    _loop2(i);\n\t  }\n\n\t  if (inputIsTensor2D) {\n\t    return stack(ys, 0);\n\t  } else {\n\t    return ys;\n\t  }\n\t}\n\n\tvar gramSchmidt = op({\n\t  gramSchmidt_: gramSchmidt_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Compute QR decomposition of m-by-n matrix using Householder transformation.\n\t *\n\t * Implementation based on\n\t *   [http://www.cs.cornell.edu/~bindel/class/cs6210-f09/lec18.pdf]\n\t * (http://www.cs.cornell.edu/~bindel/class/cs6210-f09/lec18.pdf)\n\t *\n\t * ```js\n\t * const a = tf.tensor2d([[1, 2], [3, 4]]);\n\t * let [q, r] = tf.linalg.qr(a);\n\t * console.log('Q');\n\t * q.print();\n\t * console.log('R');\n\t * r.print();\n\t * console.log('Orthogonalized');\n\t * q.dot(q.transpose()).print()  // should be nearly the identity matrix.\n\t * console.log('Reconstructed');\n\t * q.dot(r).print(); // should be nearly [[1, 2], [3, 4]];\n\t * ```\n\t *\n\t * @param x The `tf.Tensor` to be QR-decomposed. Must have rank >= 2. Suppose\n\t *   it has the shape `[..., M, N]`.\n\t * @param fullMatrices An optional boolean parameter. Defaults to `false`.\n\t *   If `true`, compute full-sized `Q`. If `false` (the default),\n\t *   compute only the leading N columns of `Q` and `R`.\n\t * @returns An `Array` of two `tf.Tensor`s: `[Q, R]`. `Q` is a unitary matrix,\n\t *   i.e., its columns all have unit norm and are mutually orthogonal.\n\t *   If `M >= N`,\n\t *     If `fullMatrices` is `false` (default),\n\t *       - `Q` has a shape of `[..., M, N]`,\n\t *       - `R` has a shape of `[..., N, N]`.\n\t *     If `fullMatrices` is `true` (default),\n\t *       - `Q` has a shape of `[..., M, M]`,\n\t *       - `R` has a shape of `[..., M, N]`.\n\t *   If `M < N`,\n\t *     - `Q` has a shape of `[..., M, M]`,\n\t *     - `R` has a shape of `[..., M, N]`.\n\t * @throws If the rank of `x` is less than 2.\n\t *\n\t * @doc {heading:'Operations',\n\t *       subheading:'Linear Algebra',\n\t *       namespace:'linalg'}\n\t */\n\n\tfunction qr_(x, fullMatrices) {\n\t  if (fullMatrices === void 0) {\n\t    fullMatrices = false;\n\t  }\n\n\t  assert(x.rank >= 2, function () {\n\t    return \"qr() requires input tensor to have a rank >= 2, but got rank \" + x.rank;\n\t  });\n\n\t  if (x.rank === 2) {\n\t    return qr2d(x, fullMatrices);\n\t  } else {\n\t    // Rank > 2.\n\t    // TODO(cais): Below we split the input into individual 2D tensors,\n\t    //   perform QR decomposition on them and then stack the results back\n\t    //   together. We should explore whether this can be parallelized.\n\t    var outerDimsProd = x.shape.slice(0, x.shape.length - 2).reduce(function (value, prev) {\n\t      return value * prev;\n\t    });\n\t    var x2ds = unstack(reshape(x, [outerDimsProd, x.shape[x.shape.length - 2], x.shape[x.shape.length - 1]]), 0);\n\t    var q2ds = [];\n\t    var r2ds = [];\n\t    x2ds.forEach(function (x2d) {\n\t      var _qr2d = qr2d(x2d, fullMatrices),\n\t          q2d = _qr2d[0],\n\t          r2d = _qr2d[1];\n\n\t      q2ds.push(q2d);\n\t      r2ds.push(r2d);\n\t    });\n\t    var q = reshape(stack(q2ds, 0), x.shape);\n\t    var r = reshape(stack(r2ds, 0), x.shape);\n\t    return [q, r];\n\t  }\n\t}\n\n\tfunction qr2d(x, fullMatrices) {\n\t  if (fullMatrices === void 0) {\n\t    fullMatrices = false;\n\t  }\n\n\t  return ENGINE.tidy(function () {\n\t    assert(x.shape.length === 2, function () {\n\t      return \"qr2d() requires a 2D Tensor, but got a \" + x.shape.length + \"D Tensor.\";\n\t    });\n\t    var m = x.shape[0];\n\t    var n = x.shape[1];\n\t    var q = eye(m); // Orthogonal transform so far.\n\n\t    var r = clone(x); // Transformed matrix so far.\n\n\t    var one2D = tensor2d([[1]], [1, 1]);\n\t    var w = clone(one2D);\n\t    var iters = m >= n ? n : m;\n\n\t    var _loop = function _loop(j) {\n\t      // This tidy within the for-loop ensures we clean up temporary\n\t      // tensors as soon as they are no longer needed.\n\t      var rTemp = r;\n\t      var wTemp = w;\n\t      var qTemp = q;\n\n\t      var _ENGINE$tidy = ENGINE.tidy(function () {\n\t        // Find H = I - tau * w * w', to put zeros below R(j, j).\n\t        var rjEnd1 = slice$2(r, [j, j], [m - j, 1]);\n\t        var normX = norm(rjEnd1);\n\t        var rjj = slice$2(r, [j, j], [1, 1]); // The sign() function returns 0 on 0, which causes division by zero.\n\n\t        var s = where(greater(rjj, 0), tensor2d([[-1]]), tensor2d([[1]]));\n\t        var u1 = sub(rjj, mul(s, normX));\n\t        var wPre = div(rjEnd1, u1);\n\n\t        if (wPre.shape[0] === 1) {\n\t          w = clone(one2D);\n\t        } else {\n\t          w = concat([one2D, slice$2(wPre, [1, 0], [wPre.shape[0] - 1, wPre.shape[1]])], 0);\n\t        }\n\n\t        var tau = neg(div(matMul(s, u1), normX)); // -- R := HR, Q := QH.\n\n\t        var rjEndAll = slice$2(r, [j, 0], [m - j, n]);\n\t        var tauTimesW = mul(tau, w);\n\t        var wT = transpose(w);\n\n\t        if (j === 0) {\n\t          r = sub(rjEndAll, matMul(tauTimesW, matMul(wT, rjEndAll)));\n\t        } else {\n\t          var rTimesTau = sub(rjEndAll, matMul(tauTimesW, matMul(wT, rjEndAll)));\n\t          r = concat([slice$2(r, [0, 0], [j, n]), rTimesTau], 0);\n\t        }\n\n\t        var tawTimesWT = transpose(tauTimesW);\n\t        var qAllJEnd = slice$2(q, [0, j], [m, q.shape[1] - j]);\n\n\t        if (j === 0) {\n\t          q = sub(qAllJEnd, matMul(matMul(qAllJEnd, w), tawTimesWT));\n\t        } else {\n\t          var qTimesTau = sub(qAllJEnd, matMul(matMul(qAllJEnd, w), tawTimesWT));\n\t          q = concat([slice$2(q, [0, 0], [m, j]), qTimesTau], 1);\n\t        }\n\n\t        return [w, r, q];\n\t      });\n\n\t      w = _ENGINE$tidy[0];\n\t      r = _ENGINE$tidy[1];\n\t      q = _ENGINE$tidy[2];\n\t      dispose([rTemp, wTemp, qTemp]);\n\t    };\n\n\t    for (var j = 0; j < iters; ++j) {\n\t      _loop(j);\n\t    }\n\n\t    if (!fullMatrices && m > n) {\n\t      q = slice$2(q, [0, 0], [m, n]);\n\t      r = slice$2(r, [0, 0], [n, n]);\n\t    }\n\n\t    return [q, r];\n\t  });\n\t}\n\n\tvar qr = op({\n\t  qr_: qr_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\t(function (Reduction) {\n\t  Reduction[Reduction[\"NONE\"] = 0] = \"NONE\";\n\t  Reduction[Reduction[\"MEAN\"] = 1] = \"MEAN\";\n\t  Reduction[Reduction[\"SUM\"] = 2] = \"SUM\";\n\t  Reduction[Reduction[\"SUM_BY_NONZERO_WEIGHTS\"] = 3] = \"SUM_BY_NONZERO_WEIGHTS\";\n\t})(exports.Reduction || (exports.Reduction = {}));\n\n\t/**\n\t * Computes the weighted loss between two tensors.\n\t *\n\t * @param losses Tensor of shape `[batch_size, d1, ... dN]`.\n\t * @param weights Tensor whose rank is either 0, or the same rank as\n\t *    `losses`, and must be broadcastable to `losses` (i.e., all\n\t *    dimensions must be either `1`, or the same as the corresponding\n\t *    `losses` dimension).\n\t *\n\t * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n\t */\n\n\tfunction computeWeightedLoss_(losses, weights, reduction) {\n\t  if (reduction === void 0) {\n\t    reduction = exports.Reduction.SUM_BY_NONZERO_WEIGHTS;\n\t  }\n\n\t  var $losses = convertToTensor(losses, 'losses', 'computeWeightedLoss');\n\t  var $weights = null;\n\n\t  if (weights != null) {\n\t    $weights = convertToTensor(weights, 'weights', 'computeWeightedLoss');\n\t  }\n\n\t  var weightedLoss = $weights == null ? $losses : mul($losses, $weights);\n\n\t  if (reduction === exports.Reduction.NONE) {\n\t    return weightedLoss;\n\t  }\n\n\t  if (reduction === exports.Reduction.SUM) {\n\t    return sum$1(weightedLoss);\n\t  }\n\n\t  if (reduction === exports.Reduction.MEAN) {\n\t    if ($weights == null) {\n\t      return mean(weightedLoss);\n\t    } else {\n\t      var broadcastFactor = $losses.size / $weights.size;\n\t      var result = div(sum$1(weightedLoss), sum$1($weights));\n\t      return broadcastFactor > 1 ? div(result, scalar(broadcastFactor)) : result;\n\t    }\n\t  }\n\n\t  if (reduction === exports.Reduction.SUM_BY_NONZERO_WEIGHTS) {\n\t    if ($weights == null) {\n\t      return div(sum$1(weightedLoss), scalar($losses.size));\n\t    } else {\n\t      var broadcastedWeights = mul($weights, ones$1($losses.shape));\n\t      var numNonZeros = cast(sum$1(notEqual(broadcastedWeights, scalar(0))), 'float32');\n\t      return div(sum$1(weightedLoss), numNonZeros);\n\t    }\n\t  }\n\n\t  throw Error(\"Unknown reduction: \" + reduction);\n\t}\n\n\tvar computeWeightedLoss = op({\n\t  computeWeightedLoss_: computeWeightedLoss_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the absolute difference loss between two tensors.\n\t *\n\t * @param labels The ground truth output tensor, same dimensions as\n\t *    'predictions'.\n\t * @param predictions The predicted outputs.\n\t * @param weights Tensor whose rank is either 0, or the same rank as\n\t *    `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n\t *    must be either `1`, or the same as the corresponding `losses`\n\t *    dimension).\n\t * @param reduction Type of reduction to apply to loss. Should be of type\n\t *    `Reduction`\n\t *\n\t * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n\t */\n\n\tfunction absoluteDifference_(labels, predictions, weights, reduction) {\n\t  if (reduction === void 0) {\n\t    reduction = exports.Reduction.SUM_BY_NONZERO_WEIGHTS;\n\t  }\n\n\t  var $labels = convertToTensor(labels, 'labels', 'absoluteDifference');\n\t  var $predictions = convertToTensor(predictions, 'predictions', 'absoluteDifference');\n\t  var $weights = null;\n\n\t  if (weights != null) {\n\t    $weights = convertToTensor(weights, 'weights', 'absoluteDifference');\n\t  }\n\n\t  assertShapesMatch($labels.shape, $predictions.shape, 'Error in absoluteDifference: ');\n\t  var losses = abs$8(sub($labels, $predictions));\n\t  return computeWeightedLoss(losses, $weights, reduction);\n\t}\n\n\tvar absoluteDifference = op({\n\t  absoluteDifference_: absoluteDifference_\n\t});\n\n\t/**\n\t * Computes the cosine distance loss between two tensors.\n\t *\n\t * @param labels The ground truth output tensor, same dimensions as\n\t *    'predictions'.\n\t * @param predictions The predicted outputs.\n\t * @param axis The dimension along which the cosine distance is computed.\n\t * @param weights Tensor whose rank is either 0, or the same rank as\n\t *    `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n\t *    must be either `1`, or the same as the corresponding `losses`\n\t *    dimension).\n\t * @param reduction Type of reduction to apply to loss. Should be of type\n\t *    `Reduction`\n\t *\n\t * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n\t */\n\n\tfunction cosineDistance_(labels, predictions, axis, weights, reduction) {\n\t  if (reduction === void 0) {\n\t    reduction = exports.Reduction.SUM_BY_NONZERO_WEIGHTS;\n\t  }\n\n\t  var $labels = convertToTensor(labels, 'labels', 'cosineDistance');\n\t  var $predictions = convertToTensor(predictions, 'predictions', 'cosineDistance');\n\t  var $weights = null;\n\n\t  if (weights != null) {\n\t    $weights = convertToTensor(weights, 'weights', 'cosineDistance');\n\t  }\n\n\t  assertShapesMatch($labels.shape, $predictions.shape, 'Error in cosineDistance: ');\n\t  var one = scalar(1);\n\t  var losses = sub(one, sum$1(mul($labels, $predictions), axis, true));\n\t  return computeWeightedLoss(losses, $weights, reduction);\n\t}\n\n\tvar cosineDistance = op({\n\t  cosineDistance_: cosineDistance_\n\t});\n\n\t/**\n\t * Computes the Hinge loss between two tensors.\n\t *\n\t * @param labels The ground truth output tensor, same dimensions as\n\t *    'predictions'.\n\t * @param predictions The predicted outputs.\n\t * @param weights Tensor whose rank is either 0, or the same rank as\n\t *    `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n\t *    must be either `1`, or the same as the corresponding `losses`\n\t *    dimension).\n\t * @param reduction Type of reduction to apply to loss. Should be of type\n\t *    `Reduction`\n\t *\n\t * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n\t */\n\n\tfunction hingeLoss_(labels, predictions, weights, reduction) {\n\t  if (reduction === void 0) {\n\t    reduction = exports.Reduction.SUM_BY_NONZERO_WEIGHTS;\n\t  }\n\n\t  var $labels = convertToTensor(labels, 'labels', 'hingeLoss');\n\t  var $predictions = convertToTensor(predictions, 'predictions', 'hingeLoss');\n\t  var $weights = null;\n\n\t  if (weights != null) {\n\t    $weights = convertToTensor(weights, 'weights', 'hingeLoss');\n\t  }\n\n\t  assertShapesMatch($labels.shape, $predictions.shape, 'Error in hingeLoss: ');\n\t  var one = scalar(1); // Convert binary labels to (-1, 1)\n\n\t  $labels = sub(mul(scalar(2), $labels), one);\n\t  var losses = relu(sub(one, mul($labels, $predictions)));\n\t  return computeWeightedLoss(losses, $weights, reduction);\n\t}\n\n\tvar hingeLoss = op({\n\t  hingeLoss_: hingeLoss_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the huber loss between two tensors.\n\t *\n\t * @param labels The ground truth output tensor, same dimensions as\n\t *    'predictions'.\n\t * @param predictions The predicted outputs.\n\t * @param weights Tensor whose rank is either 0, or the same rank as\n\t *    `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n\t *    must be either `1`, or the same as the corresponding `losses`\n\t *    dimension).\n\t * @param delta Point where huber loss changes from quadratic to linear.\n\t * @param reduction Type of reduction to apply to loss. Should be of type\n\t *    `Reduction`.\n\t *\n\t * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n\t */\n\n\tfunction huberLoss_(labels, predictions, weights, delta, reduction) {\n\t  if (delta === void 0) {\n\t    delta = 1.0;\n\t  }\n\n\t  if (reduction === void 0) {\n\t    reduction = exports.Reduction.SUM_BY_NONZERO_WEIGHTS;\n\t  }\n\n\t  var $labels = convertToTensor(labels, 'labels', 'huberLoss');\n\t  var $predictions = convertToTensor(predictions, 'predictions', 'huberLoss');\n\t  var $weights = null;\n\n\t  if (weights != null) {\n\t    $weights = convertToTensor(weights, 'weights', 'huberLoss');\n\t  }\n\n\t  assertShapesMatch($labels.shape, $predictions.shape, 'Error in huberLoss: ');\n\t  var deltaScalar = scalar(delta);\n\t  var error = abs$8(sub($predictions, $labels));\n\t  var quadratic = minimum(error, deltaScalar);\n\t  var linear = sub(error, quadratic);\n\t  var losses = add$1(mul(scalar(0.5), square(quadratic)), mul(deltaScalar, linear));\n\t  return computeWeightedLoss(losses, $weights, reduction);\n\t}\n\n\tvar huberLoss = op({\n\t  huberLoss_: huberLoss_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the log loss between two tensors.\n\t *\n\t * @param labels The ground truth output tensor, same dimensions as\n\t *    'predictions'.\n\t * @param predictions The predicted outputs.\n\t * @param weights Tensor whose rank is either 0, or the same rank as\n\t *    `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n\t *    must be either `1`, or the same as the corresponding `losses`\n\t *    dimension).\n\t * @param epsilon A small increment to avoid taking log of zero\n\t * @param reduction Type of reduction to apply to loss. Should be of type\n\t *    `Reduction`\n\t *\n\t * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n\t */\n\n\tfunction logLoss_(labels, predictions, weights, epsilon, reduction) {\n\t  if (epsilon === void 0) {\n\t    epsilon = 1e-7;\n\t  }\n\n\t  if (reduction === void 0) {\n\t    reduction = exports.Reduction.SUM_BY_NONZERO_WEIGHTS;\n\t  }\n\n\t  var $labels = convertToTensor(labels, 'labels', 'logLoss');\n\t  var $predictions = convertToTensor(predictions, 'predictions', 'logLoss');\n\t  var $weights = null;\n\n\t  if (weights != null) {\n\t    $weights = convertToTensor(weights, 'weights', 'logLoss');\n\t  }\n\n\t  assertShapesMatch($labels.shape, $predictions.shape, 'Error in logLoss: ');\n\t  var one = scalar(1);\n\t  var epsilonScalar = scalar(epsilon);\n\t  var l1 = neg(mul($labels, log$9(add$1($predictions, epsilonScalar))));\n\t  var l2 = mul(sub(one, $labels), log$9(add$1(sub(one, $predictions), epsilonScalar)));\n\t  var losses = sub(l1, l2);\n\t  return computeWeightedLoss(losses, $weights, reduction);\n\t}\n\n\tvar logLoss = op({\n\t  logLoss_: logLoss_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the mean squared error between two tensors.\n\t *\n\t * @param labels The ground truth output tensor, same dimensions as\n\t *    'predictions'.\n\t * @param predictions The predicted outputs.\n\t * @param weights Tensor whose rank is either 0, or the same rank as\n\t *    `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n\t *    must be either `1`, or the same as the corresponding `losses`\n\t *    dimension).\n\t * @param reduction Type of reduction to apply to loss. Should be of type\n\t *    `Reduction`\n\t *\n\t * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n\t */\n\n\tfunction meanSquaredError_(labels, predictions, weights, reduction) {\n\t  if (reduction === void 0) {\n\t    reduction = exports.Reduction.SUM_BY_NONZERO_WEIGHTS;\n\t  }\n\n\t  var $labels = convertToTensor(labels, 'labels', 'meanSquaredError');\n\t  var $predictions = convertToTensor(predictions, 'predictions', 'meanSquaredError');\n\t  var $weights = null;\n\n\t  if (weights != null) {\n\t    $weights = convertToTensor(weights, 'weights', 'meanSquaredError');\n\t  }\n\n\t  assertShapesMatch($labels.shape, $predictions.shape, 'Error in meanSquaredError: ');\n\t  var losses = squaredDifference($labels, $predictions);\n\t  return computeWeightedLoss(losses, $weights, reduction);\n\t}\n\n\tvar meanSquaredError = op({\n\t  meanSquaredError_: meanSquaredError_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tfunction sigmoidCrossEntropyWithLogits_(labels, logits) {\n\t  var $labels = convertToTensor(labels, 'labels', 'sigmoidCrossEntropyWithLogits');\n\t  var $logits = convertToTensor(logits, 'logits', 'sigmoidCrossEntropyWithLogits');\n\t  assertShapesMatch($labels.shape, $logits.shape, 'Error in sigmoidCrossEntropyWithLogits: ');\n\t  /**\n\t   * Implementation Details:\n\t   *\n\t   * For brevity, let `x = logits`, `z = labels`.  The logistic loss is\n\t   *     z * -log(sigmoid(x)) + (1 - z) * -log(1 - sigmoid(x))\n\t   *   = z * -log(1 / (1 + exp(-x))) + (1 - z) * -log(exp(-x) / (1 + exp(-x)))\n\t   *   = z * log(1 + exp(-x)) + (1 - z) * (-log(exp(-x)) + log(1 + exp(-x)))\n\t   *   = z * log(1 + exp(-x)) + (1 - z) * (x + log(1 + exp(-x))\n\t   *   = (1 - z) * x + log(1 + exp(-x))\n\t   *   = x - x * z + log(1 + exp(-x))\n\t   *\n\t   *   For x < 0, to avoid overflow in exp(-x), we reformulate the above\n\t   *     x - x * z + log(1 + exp(-x))\n\t   *   = log(exp(x)) - x * z + log(1 + exp(-x))\n\t   *   = - x * z + log(1 + exp(x))\n\t   *\n\t   * Hence, to ensure stability and avoid overflow, the implementation uses\n\t   * this equivalent formulation:\n\t   *     max(x, 0) - x * z + log(1 + exp(-abs(x)))\n\t   */\n\n\t  var maxOutput = relu($logits);\n\t  var outputXTarget = mul($logits, $labels);\n\t  var sigmoidOutput = log1p(exp$3(neg(abs$8($logits))));\n\t  return add$1(sub(maxOutput, outputXTarget), sigmoidOutput);\n\t}\n\t/**\n\t * Computes the sigmoid cross entropy loss between two tensors.\n\t *\n\t * If labelSmoothing is nonzero, smooth the labels towards 1/2:\n\t *\n\t *   newMulticlassLabels = multiclassLabels * (1 - labelSmoothing)\n\t *                         + 0.5 * labelSmoothing\n\t *\n\t * @param multiClassLabels The ground truth output tensor of shape\n\t * [batch_size, num_classes], same dimensions as 'predictions'.\n\t * @param logits The predicted outputs.\n\t * @param weights Tensor whose rank is either 0, or the same rank as\n\t *    `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n\t *    must be either `1`, or the same as the corresponding `losses`\n\t *    dimension).\n\t * @param labelSmoothing If greater than 0, then smooth the labels.\n\t * @param reduction Type of reduction to apply to loss. Should be of type\n\t *    `Reduction`\n\t *\n\t * @doc { heading: 'Training', subheading: 'Losses', namespace: 'losses' }\n\t */\n\n\n\tfunction sigmoidCrossEntropy_(multiClassLabels, logits, weights, labelSmoothing, reduction) {\n\t  if (labelSmoothing === void 0) {\n\t    labelSmoothing = 0;\n\t  }\n\n\t  if (reduction === void 0) {\n\t    reduction = exports.Reduction.SUM_BY_NONZERO_WEIGHTS;\n\t  }\n\n\t  var $multiClassLabels = convertToTensor(multiClassLabels, 'multiClassLabels', 'sigmoidCrossEntropy');\n\t  var $logits = convertToTensor(logits, 'logits', 'sigmoidCrossEntropy');\n\t  var $weights = null;\n\n\t  if (weights != null) {\n\t    $weights = convertToTensor(weights, 'weights', 'sigmoidCrossEntropy');\n\t  }\n\n\t  assertShapesMatch($multiClassLabels.shape, $logits.shape, 'Error in sigmoidCrossEntropy: ');\n\n\t  if (labelSmoothing > 0) {\n\t    var labelSmoothingScalar = scalar(labelSmoothing);\n\t    var one = scalar(1);\n\t    var half = scalar(0.5);\n\t    $multiClassLabels = add$1(mul($multiClassLabels, sub(one, labelSmoothingScalar)), mul(half, labelSmoothingScalar));\n\t  }\n\n\t  var losses = sigmoidCrossEntropyWithLogits_($multiClassLabels, $logits);\n\t  return computeWeightedLoss(losses, $weights, reduction);\n\t}\n\n\tvar sigmoidCrossEntropy = op({\n\t  sigmoidCrossEntropy_: sigmoidCrossEntropy_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes softmax cross entropy between logits and labels.\n\t *\n\t * Measures the probability error in discrete classification tasks in which\n\t * the classes are mutually exclusive (each entry is in exactly one class).\n\t * For example, each CIFAR-10 image is labeled with one and only one label: an\n\t * image can be a dog or a truck, but not both.\n\t *\n\t * `NOTE`: While the classes are mutually exclusive, their probabilities need\n\t * not be. All that is required is that each row of labels is a valid\n\t * probability distribution. If they are not, the computation of the gradient\n\t * will be incorrect.\n\t *\n\t * `WARNING`: This op expects unscaled logits, since it performs a softmax on\n\t * logits internally for efficiency. Do not call this op with the output of\n\t * softmax, as it will produce incorrect results.\n\t *\n\t * logits and labels must have the same shape, e.g. [batch_size, num_classes]\n\t * and the same dtype.\n\t * @param labels The labels array.\n\t * @param logits The logits array.\n\t * @param dim The dimension softmax would be performed on. Defaults to `-1`\n\t *     which indicates the last dimension.\n\t */\n\n\tfunction softmaxCrossEntropyWithLogits_(labels, logits, dim) {\n\t  if (dim === void 0) {\n\t    dim = -1;\n\t  }\n\n\t  if (dim === -1) {\n\t    dim = logits.rank - 1;\n\t  }\n\n\t  if (dim !== logits.rank - 1) {\n\t    throw Error(\"Softmax cross entropy along a non-last dimension is not yet \" + (\"supported. Labels / logits was rank \" + logits.rank + \" \") + (\"and dim was \" + dim));\n\t  } // Use a custom gradient for numerical stability.\n\n\n\t  var customOp = customGrad(function (labels, logits, save) {\n\t    // Reference:\n\t    //   1. http://cs231n.github.io/linear-classify/#softmax\n\t    //   2. https://blog.feedly.com/tricks-of-the-trade-logsumexp/\n\t    var keepDims = true;\n\t    var lse = logSumExp(logits, [dim], keepDims);\n\t    var logResult = sub(cast(logits, 'float32'), lse);\n\t    save([labels, logResult]);\n\t    var costVector = neg(mul(logResult, labels));\n\t    var value = sum$1(costVector, [dim]);\n\n\t    var gradFunc = function gradFunc(dy, saved) {\n\t      var labels = saved[0],\n\t          logResult = saved[1];\n\t      var dyShape = expandShapeToKeepDim(dy.shape, [dim]);\n\t      return [mul(reshape(dy, dyShape), sub(cast(labels, 'float32'), exp$3(logResult))), mul(reshape(dy, dyShape), sub(exp$3(logResult), cast(labels, 'float32')))];\n\t    };\n\n\t    return {\n\t      value: value,\n\t      gradFunc: gradFunc\n\t    };\n\t  });\n\t  return customOp(labels, logits);\n\t}\n\t/**\n\t * Computes the softmax cross entropy loss between two tensors.\n\t *\n\t * If labelSmoothing is nonzero, smooth the labels towards 1/2:\n\t *\n\t *   newOnehotLabels = onehotLabels * (1 - labelSmoothing)\n\t *                         + labelSmoothing / numClasses\n\t *\n\t * @param onehotLabels One hot encoded labels\n\t *    [batch_size, num_classes], same dimensions as 'predictions'.\n\t * @param logits The predicted outputs.\n\t * @param weights Tensor whose rank is either 0, or 1, and must be\n\t *    broadcastable to `loss`  of shape [batch_size]\n\t * @param labelSmoothing If greater than 0, then smooth the labels.\n\t * @param reduction Type of reduction to apply to loss. Should be of type\n\t *    `Reduction`\n\t *\n\t * @doc { heading: 'Training', subheading: 'Losses', namespace: 'losses' }\n\t */\n\n\n\tfunction softmaxCrossEntropy_(onehotLabels, logits, weights, labelSmoothing, reduction) {\n\t  if (labelSmoothing === void 0) {\n\t    labelSmoothing = 0;\n\t  }\n\n\t  if (reduction === void 0) {\n\t    reduction = exports.Reduction.SUM_BY_NONZERO_WEIGHTS;\n\t  }\n\n\t  var $onehotLabels = convertToTensor(onehotLabels, 'onehotLabels', 'softmaxCrossEntropy');\n\t  var $logits = convertToTensor(logits, 'logits', 'softmaxCrossEntropy');\n\t  var $weights = null;\n\n\t  if (weights != null) {\n\t    $weights = convertToTensor(weights, 'weights', 'softmaxCrossEntropy');\n\t  }\n\n\t  assertShapesMatch($onehotLabels.shape, $logits.shape, 'Error in softmaxCrossEntropy: ');\n\n\t  if (labelSmoothing > 0) {\n\t    var labelSmoothingScalar = scalar(labelSmoothing);\n\t    var one = scalar(1);\n\t    var numClasses = scalar($onehotLabels.shape[1]);\n\t    $onehotLabels = add$1(mul($onehotLabels, sub(one, labelSmoothingScalar)), div(labelSmoothingScalar, numClasses));\n\t  }\n\n\t  var losses = softmaxCrossEntropyWithLogits_($onehotLabels, $logits);\n\t  return computeWeightedLoss(losses, $weights, reduction);\n\t}\n\n\tvar softmaxCrossEntropy = op({\n\t  softmaxCrossEntropy_: softmaxCrossEntropy_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar spectral = {\n\t  fft: fft,\n\t  ifft: ifft,\n\t  rfft: rfft,\n\t  irfft: irfft\n\t};\n\tvar signal = {\n\t  hammingWindow: hammingWindow,\n\t  hannWindow: hannWindow,\n\t  frame: frame,\n\t  stft: stft\n\t}; // Image Ops namespace\n\tvar image = {\n\t  flipLeftRight: flipLeftRight,\n\t  resizeNearestNeighbor: resizeNearestNeighbor,\n\t  resizeBilinear: resizeBilinear,\n\t  rotateWithOffset: rotateWithOffset,\n\t  cropAndResize: cropAndResize,\n\t  nonMaxSuppression: nonMaxSuppression,\n\t  nonMaxSuppressionAsync: nonMaxSuppressionAsync,\n\t  nonMaxSuppressionWithScore: nonMaxSuppressionWithScore,\n\t  nonMaxSuppressionWithScoreAsync: nonMaxSuppressionWithScoreAsync,\n\t  nonMaxSuppressionPadded: nonMaxSuppressionPadded,\n\t  nonMaxSuppressionPaddedAsync: nonMaxSuppressionPaddedAsync\n\t}; // linalg namespace\n\tvar linalg = {\n\t  bandPart: bandPart,\n\t  gramSchmidt: gramSchmidt,\n\t  qr: qr\n\t}; // losses namespace;\n\tvar losses = {\n\t  absoluteDifference: absoluteDifference,\n\t  computeWeightedLoss: computeWeightedLoss,\n\t  cosineDistance: cosineDistance,\n\t  hingeLoss: hingeLoss,\n\t  huberLoss: huberLoss,\n\t  logLoss: logLoss,\n\t  meanSquaredError: meanSquaredError,\n\t  sigmoidCrossEntropy: sigmoidCrossEntropy,\n\t  softmaxCrossEntropy: softmaxCrossEntropy\n\t}; // Second level exports.\n\n\t/** @doc {heading: 'Training', subheading: 'Classes', namespace: 'train'} */\n\n\tvar Optimizer = /*#__PURE__*/function (_Serializable) {\n\t  _inheritsLoose(Optimizer, _Serializable);\n\n\t  function Optimizer() {\n\t    return _Serializable.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto = Optimizer.prototype;\n\n\t  /**\n\t   * Executes `f()` and minimizes the scalar output of `f()` by computing\n\t   * gradients of y with respect to the list of trainable variables provided by\n\t   * `varList`. If no list is provided, it defaults to all trainable variables.\n\t   *\n\t   * @param f The function to execute and whose output to minimize.\n\t   * @param returnCost Whether to return the scalar cost value produced by\n\t   * executing `f()`.\n\t   * @param varList An optional list of variables to update. If specified, only\n\t   * the trainable variables in varList will be updated by minimize. Defaults to\n\t   * all trainable variables.\n\t   *\n\t   * @doc {heading: 'Training', subheading: 'Optimizers'}\n\t   */\n\t  _proto.minimize = function minimize(f, returnCost, varList) {\n\t    if (returnCost === void 0) {\n\t      returnCost = false;\n\t    }\n\n\t    var _this$computeGradient = this.computeGradients(f, varList),\n\t        value = _this$computeGradient.value,\n\t        grads = _this$computeGradient.grads;\n\n\t    if (varList != null) {\n\t      var gradArray = varList.map(function (v) {\n\t        return {\n\t          name: v.name,\n\t          tensor: grads[v.name]\n\t        };\n\t      });\n\t      this.applyGradients(gradArray);\n\t    } else {\n\t      this.applyGradients(grads);\n\t    } // Dispose gradients.\n\n\n\t    dispose(grads);\n\n\t    if (returnCost) {\n\t      return value;\n\t    } else {\n\t      value.dispose();\n\t      return null;\n\t    }\n\t  }\n\t  /**\n\t   * The number of iterations that this optimizer instance has been invoked for.\n\t   */\n\t  ;\n\n\t  _proto.incrementIterations = function incrementIterations() {\n\t    this.iterations_ = this.iterations + 1;\n\t  }\n\t  /**\n\t   * Executes f() and computes the gradient of the scalar output of f() with\n\t   * respect to the list of trainable variables provided by `varList`. If no\n\t   * list is provided, it defaults to all trainable variables.\n\t   *\n\t   * @param f The function to execute and whose output to use for computing\n\t   * gradients with respect to variables.\n\t   * @param varList An optional list of variables to compute gradients with\n\t   * respect to. If specified, only the trainable variables in varList will have\n\t   * gradients computed with respect to. Defaults to all trainable variables.\n\t   *\n\t   * @doc {heading: 'Training', subheading: 'Optimizers'}\n\t   */\n\t  ;\n\n\t  _proto.computeGradients = function computeGradients(f, varList) {\n\t    return variableGrads(f, varList);\n\t  }\n\t  /**\n\t   * Dispose the variables (if any) owned by this optimizer instance.\n\t   */\n\t  ;\n\n\t  _proto.dispose = function dispose$1() {\n\t    if (this.iterations_ != null) {\n\t      dispose(this.iterations_);\n\t    }\n\t  };\n\n\t  _proto.saveIterations = /*#__PURE__*/function () {\n\t    var _saveIterations = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              if (this.iterations_ == null) {\n\t                this.iterations_ = 0;\n\t              }\n\n\t              return _context.abrupt(\"return\", {\n\t                name: 'iter',\n\t                // TODO(cais): Use 'int64' type when available.\n\t                tensor: scalar(this.iterations_, 'int32')\n\t              });\n\n\t            case 2:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function saveIterations() {\n\t      return _saveIterations.apply(this, arguments);\n\t    }\n\n\t    return saveIterations;\n\t  }();\n\n\t  _proto.getWeights = /*#__PURE__*/function () {\n\t    var _getWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              throw new Error('getWeights() is not implemented for this optimizer yet.');\n\n\t            case 1:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2);\n\t    }));\n\n\t    function getWeights() {\n\t      return _getWeights.apply(this, arguments);\n\t    }\n\n\t    return getWeights;\n\t  }();\n\n\t  _proto.setWeights = /*#__PURE__*/function () {\n\t    var _setWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(weightValues) {\n\t      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t        while (1) {\n\t          switch (_context3.prev = _context3.next) {\n\t            case 0:\n\t              throw new Error(\"setWeights() is not implemented for this optimizer class \" + (\"\" + this.getClassName()));\n\n\t            case 1:\n\t            case \"end\":\n\t              return _context3.stop();\n\t          }\n\t        }\n\t      }, _callee3, this);\n\t    }));\n\n\t    function setWeights(_x) {\n\t      return _setWeights.apply(this, arguments);\n\t    }\n\n\t    return setWeights;\n\t  }()\n\t  /**\n\t   * Extract the first element of the weight values and set it\n\t   * as the iterations counter variable of this instance of optimizer.\n\t   *\n\t   * @param weightValues\n\t   * @returns Weight values with the first element consumed and excluded.\n\t   */\n\t  ;\n\n\t  _proto.extractIterations =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _extractIterations = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(weightValues) {\n\t      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n\t        while (1) {\n\t          switch (_context4.prev = _context4.next) {\n\t            case 0:\n\t              _context4.next = 2;\n\t              return weightValues[0].tensor.data();\n\n\t            case 2:\n\t              this.iterations_ = _context4.sent[0];\n\t              return _context4.abrupt(\"return\", weightValues.slice(1));\n\n\t            case 4:\n\t            case \"end\":\n\t              return _context4.stop();\n\t          }\n\t        }\n\t      }, _callee4, this);\n\t    }));\n\n\t    function extractIterations(_x2) {\n\t      return _extractIterations.apply(this, arguments);\n\t    }\n\n\t    return extractIterations;\n\t  }();\n\n\t  _createClass(Optimizer, [{\n\t    key: \"iterations\",\n\t    get: function get() {\n\t      if (this.iterations_ == null) {\n\t        this.iterations_ = 0;\n\t      }\n\n\t      return this.iterations_;\n\t    }\n\t  }]);\n\n\t  return Optimizer;\n\t}(Serializable);\n\tObject.defineProperty(Optimizer, Symbol.hasInstance, {\n\t  value: function value(instance) {\n\t    return instance.minimize != null && instance.computeGradients != null && instance.applyGradients != null;\n\t  }\n\t});\n\n\t/** @doclink Optimizer */\n\n\tvar AdadeltaOptimizer = /*#__PURE__*/function (_Optimizer) {\n\t  _inheritsLoose(AdadeltaOptimizer, _Optimizer);\n\n\t  function AdadeltaOptimizer(learningRate, rho, epsilon) {\n\t    var _this;\n\n\t    if (epsilon === void 0) {\n\t      epsilon = null;\n\t    }\n\n\t    _this = _Optimizer.call(this) || this;\n\t    _this.learningRate = learningRate;\n\t    _this.rho = rho;\n\t    _this.epsilon = epsilon;\n\t    _this.accumulatedGrads = [];\n\t    _this.accumulatedUpdates = [];\n\n\t    if (epsilon == null) {\n\t      _this.epsilon = ENGINE.backend.epsilon();\n\t    }\n\n\t    return _this;\n\t  }\n\n\t  var _proto = AdadeltaOptimizer.prototype;\n\n\t  _proto.applyGradients = function applyGradients(variableGradients) {\n\t    var _this2 = this;\n\n\t    var variableNames = Array.isArray(variableGradients) ? variableGradients.map(function (item) {\n\t      return item.name;\n\t    }) : Object.keys(variableGradients);\n\t    variableNames.forEach(function (name, i) {\n\t      var value = ENGINE.registeredVariables[name];\n\t      var trainable = false;\n\n\t      if (_this2.accumulatedGrads[i] == null) {\n\t        _this2.accumulatedGrads[i] = {\n\t          originalName: name + \"/accum_grad\",\n\t          variable: tidy(function () {\n\t            return zerosLike(value).variable(trainable);\n\t          })\n\t        };\n\t      }\n\n\t      if (_this2.accumulatedUpdates[i] == null) {\n\t        _this2.accumulatedUpdates[i] = {\n\t          originalName: name + \"/accum_var\",\n\t          variable: tidy(function () {\n\t            return zerosLike(value).variable(trainable);\n\t          })\n\t        };\n\t      }\n\n\t      var gradient = Array.isArray(variableGradients) ? variableGradients[i].tensor : variableGradients[name];\n\n\t      if (gradient == null) {\n\t        return;\n\t      }\n\n\t      var accumulatedGrad = _this2.accumulatedGrads[i].variable;\n\t      var accumulatedUpdate = _this2.accumulatedUpdates[i].variable;\n\t      tidy(function () {\n\t        var newAccumulatedGrad = add$1(mul(accumulatedGrad, _this2.rho), mul(square(gradient), 1 - _this2.rho));\n\t        var updates = mul(div(sqrt$3(add$1(accumulatedUpdate, _this2.epsilon)), sqrt$3(add$1(accumulatedGrad, _this2.epsilon))), gradient);\n\t        var newAccumulatedUpdate = add$1(mul(accumulatedUpdate, _this2.rho), mul(square(updates), 1 - _this2.rho));\n\t        accumulatedGrad.assign(newAccumulatedGrad);\n\t        accumulatedUpdate.assign(newAccumulatedUpdate);\n\t        var newValue = add$1(mul(updates, -_this2.learningRate), value);\n\t        value.assign(newValue);\n\t      });\n\t    });\n\t    this.incrementIterations();\n\t  };\n\n\t  _proto.dispose = function dispose$1() {\n\t    if (this.accumulatedUpdates != null) {\n\t      dispose(this.accumulatedGrads.map(function (v) {\n\t        return v.variable;\n\t      }));\n\n\t      dispose(this.accumulatedUpdates.map(function (v) {\n\t        return v.variable;\n\t      }));\n\t    }\n\t  };\n\n\t  _proto.getWeights = /*#__PURE__*/function () {\n\t    var _getWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      var variables;\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              // Order matters for Python compatibility.\n\t              variables = [].concat(this.accumulatedGrads, this.accumulatedUpdates);\n\t              _context.next = 3;\n\t              return this.saveIterations();\n\n\t            case 3:\n\t              _context.t0 = _context.sent;\n\t              return _context.abrupt(\"return\", [_context.t0].concat(variables.map(function (v) {\n\t                return {\n\t                  name: v.originalName,\n\t                  tensor: v.variable\n\t                };\n\t              })));\n\n\t            case 5:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function getWeights() {\n\t      return _getWeights.apply(this, arguments);\n\t    }\n\n\t    return getWeights;\n\t  }();\n\n\t  _proto.setWeights = /*#__PURE__*/function () {\n\t    var _setWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(weightValues) {\n\t      var variableCount, trainable;\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              _context2.next = 2;\n\t              return this.extractIterations(weightValues);\n\n\t            case 2:\n\t              weightValues = _context2.sent;\n\t              variableCount = weightValues.length / 2;\n\t              trainable = false;\n\t              this.accumulatedGrads = weightValues.slice(0, variableCount).map(function (v) {\n\t                return {\n\t                  originalName: v.name,\n\t                  variable: v.tensor.variable(trainable)\n\t                };\n\t              });\n\t              this.accumulatedUpdates = weightValues.slice(variableCount, variableCount * 2).map(function (v) {\n\t                return {\n\t                  originalName: v.name,\n\t                  variable: v.tensor.variable(trainable)\n\t                };\n\t              });\n\n\t            case 7:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function setWeights(_x) {\n\t      return _setWeights.apply(this, arguments);\n\t    }\n\n\t    return setWeights;\n\t  }();\n\n\t  _proto.getConfig = function getConfig() {\n\t    return {\n\t      'learningRate': this.learningRate,\n\t      'rho': this.rho,\n\t      'epsilon': this.epsilon\n\t    };\n\t  }\n\t  /** @nocollapse */\n\t  ;\n\n\t  AdadeltaOptimizer.fromConfig = function fromConfig(cls, config) {\n\t    return new cls(config['learningRate'], config['rho'], config['epsilon']);\n\t  };\n\n\t  return AdadeltaOptimizer;\n\t}(Optimizer);\n\t/** @nocollapse */\n\n\tAdadeltaOptimizer.className = 'Adadelta'; // Name matters for Python compatibility.\n\n\tregisterClass(AdadeltaOptimizer);\n\n\t/** @doclink Optimizer */\n\n\tvar AdagradOptimizer = /*#__PURE__*/function (_Optimizer) {\n\t  _inheritsLoose(AdagradOptimizer, _Optimizer);\n\n\t  function AdagradOptimizer(learningRate, initialAccumulatorValue) {\n\t    var _this;\n\n\t    if (initialAccumulatorValue === void 0) {\n\t      initialAccumulatorValue = 0.1;\n\t    }\n\n\t    _this = _Optimizer.call(this) || this;\n\t    _this.learningRate = learningRate;\n\t    _this.initialAccumulatorValue = initialAccumulatorValue;\n\t    _this.accumulatedGrads = [];\n\t    return _this;\n\t  }\n\n\t  var _proto = AdagradOptimizer.prototype;\n\n\t  _proto.applyGradients = function applyGradients(variableGradients) {\n\t    var _this2 = this;\n\n\t    var variableNames = Array.isArray(variableGradients) ? variableGradients.map(function (item) {\n\t      return item.name;\n\t    }) : Object.keys(variableGradients);\n\t    variableNames.forEach(function (name, i) {\n\t      var value = ENGINE.registeredVariables[name];\n\n\t      if (_this2.accumulatedGrads[i] == null) {\n\t        var trainable = false;\n\t        _this2.accumulatedGrads[i] = {\n\t          originalName: name + \"/accumulator\",\n\t          variable: tidy(function () {\n\t            return fill(value.shape, _this2.initialAccumulatorValue).variable(trainable);\n\t          })\n\t        };\n\t      }\n\n\t      var gradient = Array.isArray(variableGradients) ? variableGradients[i].tensor : variableGradients[name];\n\n\t      if (gradient == null) {\n\t        return;\n\t      }\n\n\t      var accumulatedGrad = _this2.accumulatedGrads[i].variable;\n\t      tidy(function () {\n\t        var newAccumulatedGrad = add$1(accumulatedGrad, square(gradient));\n\t        accumulatedGrad.assign(newAccumulatedGrad);\n\t        var newValue = add$1(mul(div(gradient, sqrt$3(add$1(newAccumulatedGrad, ENGINE.backend.epsilon()))), -_this2.learningRate), value);\n\t        value.assign(newValue);\n\t      });\n\t    });\n\t    this.incrementIterations();\n\t  };\n\n\t  _proto.dispose = function dispose$1() {\n\t    if (this.accumulatedGrads != null) {\n\t      dispose(this.accumulatedGrads.map(function (v) {\n\t        return v.variable;\n\t      }));\n\t    }\n\t  };\n\n\t  _proto.getWeights = /*#__PURE__*/function () {\n\t    var _getWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              _context.next = 2;\n\t              return this.saveIterations();\n\n\t            case 2:\n\t              _context.t0 = _context.sent;\n\t              return _context.abrupt(\"return\", [_context.t0].concat(this.accumulatedGrads.map(function (v) {\n\t                return {\n\t                  name: v.originalName,\n\t                  tensor: v.variable\n\t                };\n\t              })));\n\n\t            case 4:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function getWeights() {\n\t      return _getWeights.apply(this, arguments);\n\t    }\n\n\t    return getWeights;\n\t  }();\n\n\t  _proto.setWeights = /*#__PURE__*/function () {\n\t    var _setWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(weightValues) {\n\t      var trainable;\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              _context2.next = 2;\n\t              return this.extractIterations(weightValues);\n\n\t            case 2:\n\t              weightValues = _context2.sent;\n\t              trainable = false;\n\t              this.accumulatedGrads = weightValues.map(function (v) {\n\t                return {\n\t                  originalName: v.name,\n\t                  variable: v.tensor.variable(trainable)\n\t                };\n\t              });\n\n\t            case 5:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function setWeights(_x) {\n\t      return _setWeights.apply(this, arguments);\n\t    }\n\n\t    return setWeights;\n\t  }();\n\n\t  _proto.getConfig = function getConfig() {\n\t    return {\n\t      'learningRate': this.learningRate,\n\t      'initialAccumulatorValue': this.initialAccumulatorValue\n\t    };\n\t  }\n\t  /** @nocollapse */\n\t  ;\n\n\t  AdagradOptimizer.fromConfig = function fromConfig(cls, config) {\n\t    return new cls(config['learningRate'], config['initialAccumulatorValue']);\n\t  };\n\n\t  return AdagradOptimizer;\n\t}(Optimizer);\n\t/** @nocollapse */\n\n\tAdagradOptimizer.className = 'Adagrad'; // Note: Name matters for Python compatibility.\n\n\tregisterClass(AdagradOptimizer);\n\n\tvar AdamOptimizer = /*#__PURE__*/function (_Optimizer) {\n\t  _inheritsLoose(AdamOptimizer, _Optimizer);\n\n\t  function AdamOptimizer(learningRate, beta1, beta2, epsilon) {\n\t    var _this;\n\n\t    if (epsilon === void 0) {\n\t      epsilon = null;\n\t    }\n\n\t    _this = _Optimizer.call(this) || this;\n\t    _this.learningRate = learningRate;\n\t    _this.beta1 = beta1;\n\t    _this.beta2 = beta2;\n\t    _this.epsilon = epsilon;\n\t    _this.accumulatedFirstMoment = [];\n\t    _this.accumulatedSecondMoment = [];\n\t    tidy(function () {\n\t      // accB* will be updated by batch.\n\t      _this.accBeta1 = scalar(beta1).variable();\n\t      _this.accBeta2 = scalar(beta2).variable();\n\t    });\n\n\t    if (epsilon == null) {\n\t      _this.epsilon = ENGINE.backend.epsilon();\n\t    }\n\n\t    return _this;\n\t  }\n\n\t  var _proto = AdamOptimizer.prototype;\n\n\t  _proto.applyGradients = function applyGradients(variableGradients) {\n\t    var _this2 = this;\n\n\t    var varNames = Array.isArray(variableGradients) ? variableGradients.map(function (v) {\n\t      return v.name;\n\t    }) : Object.keys(variableGradients);\n\t    tidy(function () {\n\t      var oneMinusAccBeta1 = sub(1, _this2.accBeta1);\n\t      var oneMinusAccBeta2 = sub(1, _this2.accBeta2);\n\t      varNames.forEach(function (name, i) {\n\t        var value = ENGINE.registeredVariables[name];\n\t        var trainable = false;\n\n\t        if (_this2.accumulatedFirstMoment[i] == null) {\n\t          _this2.accumulatedFirstMoment[i] = {\n\t            originalName: name + \"/m\",\n\t            variable: tidy(function () {\n\t              return zerosLike(value).variable(trainable);\n\t            })\n\t          };\n\t        }\n\n\t        if (_this2.accumulatedSecondMoment[i] == null) {\n\t          _this2.accumulatedSecondMoment[i] = {\n\t            originalName: name + \"/v\",\n\t            variable: tidy(function () {\n\t              return zerosLike(value).variable(trainable);\n\t            })\n\t          };\n\t        }\n\n\t        var gradient = Array.isArray(variableGradients) ? variableGradients[i].tensor : variableGradients[name];\n\n\t        if (gradient == null) {\n\t          return;\n\t        }\n\n\t        var firstMoment = _this2.accumulatedFirstMoment[i].variable;\n\t        var secondMoment = _this2.accumulatedSecondMoment[i].variable;\n\t        var newFirstMoment = add$1(mul(firstMoment, _this2.beta1), mul(gradient, 1 - _this2.beta1));\n\t        var newSecondMoment = add$1(mul(secondMoment, _this2.beta2), mul(square(gradient), 1 - _this2.beta2));\n\t        var biasCorrectedFirstMoment = div(newFirstMoment, oneMinusAccBeta1);\n\t        var biasCorrectedSecondMoment = div(newSecondMoment, oneMinusAccBeta2);\n\t        firstMoment.assign(newFirstMoment);\n\t        secondMoment.assign(newSecondMoment);\n\t        var newValue = add$1(mul(div(biasCorrectedFirstMoment, add$1(sqrt$3(biasCorrectedSecondMoment), _this2.epsilon)), -_this2.learningRate), value);\n\t        value.assign(newValue);\n\t      });\n\n\t      _this2.accBeta1.assign(mul(_this2.accBeta1, _this2.beta1));\n\n\t      _this2.accBeta2.assign(mul(_this2.accBeta2, _this2.beta2));\n\t    });\n\t    this.incrementIterations();\n\t  };\n\n\t  _proto.dispose = function dispose$1() {\n\t    this.accBeta1.dispose();\n\t    this.accBeta2.dispose();\n\n\t    if (this.accumulatedFirstMoment != null) {\n\t      dispose(this.accumulatedFirstMoment.map(function (v) {\n\t        return v.variable;\n\t      }));\n\t    }\n\n\t    if (this.accumulatedSecondMoment != null) {\n\t      dispose(this.accumulatedSecondMoment.map(function (v) {\n\t        return v.variable;\n\t      }));\n\t    }\n\t  };\n\n\t  _proto.getWeights = /*#__PURE__*/function () {\n\t    var _getWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      var variables;\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              // Order matters for Python compatibility.\n\t              variables = [].concat(this.accumulatedFirstMoment, this.accumulatedSecondMoment);\n\t              _context.next = 3;\n\t              return this.saveIterations();\n\n\t            case 3:\n\t              _context.t0 = _context.sent;\n\t              return _context.abrupt(\"return\", [_context.t0].concat(variables.map(function (v) {\n\t                return {\n\t                  name: v.originalName,\n\t                  tensor: v.variable\n\t                };\n\t              })));\n\n\t            case 5:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function getWeights() {\n\t      return _getWeights.apply(this, arguments);\n\t    }\n\n\t    return getWeights;\n\t  }();\n\n\t  _proto.setWeights = /*#__PURE__*/function () {\n\t    var _setWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(weightValues) {\n\t      var _this3 = this;\n\n\t      var variableCount, trainable;\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              _context2.next = 2;\n\t              return this.extractIterations(weightValues);\n\n\t            case 2:\n\t              weightValues = _context2.sent;\n\t              tidy(function () {\n\t                _this3.accBeta1.assign(pow$5(_this3.beta1, _this3.iterations_ + 1));\n\n\t                _this3.accBeta2.assign(pow$5(_this3.beta2, _this3.iterations_ + 1));\n\t              });\n\t              variableCount = weightValues.length / 2;\n\t              trainable = false;\n\t              this.accumulatedFirstMoment = weightValues.slice(0, variableCount).map(function (v) {\n\t                return {\n\t                  originalName: v.name,\n\t                  variable: v.tensor.variable(trainable)\n\t                };\n\t              });\n\t              this.accumulatedSecondMoment = weightValues.slice(variableCount, variableCount * 2).map(function (v) {\n\t                return {\n\t                  originalName: v.name,\n\t                  variable: v.tensor.variable(trainable)\n\t                };\n\t              });\n\n\t            case 8:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function setWeights(_x) {\n\t      return _setWeights.apply(this, arguments);\n\t    }\n\n\t    return setWeights;\n\t  }();\n\n\t  _proto.getConfig = function getConfig() {\n\t    return {\n\t      'learningRate': this.learningRate,\n\t      'beta1': this.beta1,\n\t      'beta2': this.beta2,\n\t      'epsilon': this.epsilon\n\t    };\n\t  }\n\t  /** @nocollapse */\n\t  ;\n\n\t  AdamOptimizer.fromConfig = function fromConfig(cls, config) {\n\t    return new cls(config['learningRate'], config['beta1'], config['beta2'], config['epsilon']);\n\t  };\n\n\t  return AdamOptimizer;\n\t}(Optimizer);\n\t/** @nocollapse */\n\n\tAdamOptimizer.className = 'Adam'; // Note: Name matters for Python compatibility.\n\n\tregisterClass(AdamOptimizer);\n\n\tvar AdamaxOptimizer = /*#__PURE__*/function (_Optimizer) {\n\t  _inheritsLoose(AdamaxOptimizer, _Optimizer);\n\n\t  function AdamaxOptimizer(learningRate, beta1, beta2, epsilon, decay) {\n\t    var _this;\n\n\t    if (epsilon === void 0) {\n\t      epsilon = null;\n\t    }\n\n\t    if (decay === void 0) {\n\t      decay = 0.0;\n\t    }\n\n\t    _this = _Optimizer.call(this) || this;\n\t    _this.learningRate = learningRate;\n\t    _this.beta1 = beta1;\n\t    _this.beta2 = beta2;\n\t    _this.epsilon = epsilon;\n\t    _this.decay = decay;\n\t    _this.accumulatedFirstMoment = [];\n\t    _this.accumulatedWeightedInfNorm = [];\n\t    tidy(function () {\n\t      _this.iteration = scalar(0).variable();\n\t      _this.accBeta1 = scalar(beta1).variable();\n\t    });\n\n\t    if (epsilon == null) {\n\t      _this.epsilon = ENGINE.backend.epsilon();\n\t    }\n\n\t    return _this;\n\t  }\n\n\t  var _proto = AdamaxOptimizer.prototype;\n\n\t  _proto.applyGradients = function applyGradients(variableGradients) {\n\t    var _this2 = this;\n\n\t    var variableNames = Array.isArray(variableGradients) ? variableGradients.map(function (item) {\n\t      return item.name;\n\t    }) : Object.keys(variableGradients);\n\t    tidy(function () {\n\t      var oneMinusAccBeta1 = sub(1, _this2.accBeta1);\n\t      var lr = div(-_this2.learningRate, add$1(mul(_this2.iteration, _this2.decay), 1));\n\t      variableNames.forEach(function (name, i) {\n\t        var value = ENGINE.registeredVariables[name];\n\t        var trainable = false;\n\n\t        if (_this2.accumulatedFirstMoment[i] == null) {\n\t          _this2.accumulatedFirstMoment[i] = {\n\t            originalName: name + \"/m\",\n\t            variable: zerosLike(value).variable(trainable)\n\t          };\n\t        }\n\n\t        if (_this2.accumulatedWeightedInfNorm[i] == null) {\n\t          _this2.accumulatedWeightedInfNorm[i] = {\n\t            originalName: name + \"/v\",\n\t            variable: zerosLike(value).variable(trainable)\n\t          };\n\t        }\n\n\t        var gradient = Array.isArray(variableGradients) ? variableGradients[i].tensor : variableGradients[name];\n\n\t        if (gradient == null) {\n\t          return;\n\t        }\n\n\t        var firstMoment = _this2.accumulatedFirstMoment[i].variable;\n\t        var weightedInfNorm = _this2.accumulatedWeightedInfNorm[i].variable;\n\t        var newFirstMoment = add$1(mul(firstMoment, _this2.beta1), mul(gradient, 1 - _this2.beta1));\n\t        var ut0 = mul(weightedInfNorm, _this2.beta2);\n\t        var ut1 = abs$8(gradient);\n\t        var newWeightedInfNorm = maximum(ut0, ut1);\n\t        firstMoment.assign(newFirstMoment);\n\t        weightedInfNorm.assign(newWeightedInfNorm);\n\t        var newValue = add$1(mul(div(lr, oneMinusAccBeta1), div(newFirstMoment, add$1(newWeightedInfNorm, _this2.epsilon))), value);\n\t        value.assign(newValue);\n\t      });\n\n\t      _this2.iteration.assign(add$1(_this2.iteration, 1));\n\n\t      _this2.accBeta1.assign(mul(_this2.accBeta1, _this2.beta1));\n\t    });\n\t    this.incrementIterations();\n\t  };\n\n\t  _proto.dispose = function dispose$1() {\n\t    this.accBeta1.dispose();\n\t    this.iteration.dispose();\n\n\t    if (this.accumulatedFirstMoment != null) {\n\t      dispose(this.accumulatedFirstMoment.map(function (v) {\n\t        return v.variable;\n\t      }));\n\t    }\n\n\t    if (this.accumulatedWeightedInfNorm != null) {\n\t      dispose(this.accumulatedWeightedInfNorm.map(function (v) {\n\t        return v.variable;\n\t      }));\n\t    }\n\t  };\n\n\t  _proto.getWeights = /*#__PURE__*/function () {\n\t    var _getWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              throw new Error('getWeights() is not implemented for Adamax yet.');\n\n\t            case 1:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee);\n\t    }));\n\n\t    function getWeights() {\n\t      return _getWeights.apply(this, arguments);\n\t    }\n\n\t    return getWeights;\n\t  }();\n\n\t  _proto.setWeights = /*#__PURE__*/function () {\n\t    var _setWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(weightValues) {\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              throw new Error('setWeights() is not implemented for Adamax yet.');\n\n\t            case 1:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2);\n\t    }));\n\n\t    function setWeights(_x) {\n\t      return _setWeights.apply(this, arguments);\n\t    }\n\n\t    return setWeights;\n\t  }();\n\n\t  _proto.getConfig = function getConfig() {\n\t    return {\n\t      'learningRate': this.learningRate,\n\t      'beta1': this.beta1,\n\t      'beta2': this.beta2,\n\t      'epsilon': this.epsilon,\n\t      'decay': this.decay\n\t    };\n\t  }\n\t  /** @nocollapse */\n\t  ;\n\n\t  AdamaxOptimizer.fromConfig = function fromConfig(cls, config) {\n\t    return new cls(config['learningRate'], config['beta1'], config['beta2'], config['epsilon'], config['decay']);\n\t  };\n\n\t  return AdamaxOptimizer;\n\t}(Optimizer);\n\t/** @nocollapse */\n\n\tAdamaxOptimizer.className = 'Adamax'; // Note: Name matters for Python compatbility.\n\n\tregisterClass(AdamaxOptimizer);\n\n\t/** @doclink Optimizer */\n\n\tvar SGDOptimizer = /*#__PURE__*/function (_Optimizer) {\n\t  _inheritsLoose(SGDOptimizer, _Optimizer);\n\n\t  function SGDOptimizer(learningRate) {\n\t    var _this;\n\n\t    _this = _Optimizer.call(this) || this;\n\t    _this.learningRate = learningRate;\n\n\t    _this.setLearningRate(learningRate);\n\n\t    return _this;\n\t  }\n\n\t  var _proto = SGDOptimizer.prototype;\n\n\t  _proto.applyGradients = function applyGradients(variableGradients) {\n\t    var _this2 = this;\n\n\t    var varNames = Array.isArray(variableGradients) ? variableGradients.map(function (v) {\n\t      return v.name;\n\t    }) : Object.keys(variableGradients);\n\t    varNames.forEach(function (name, i) {\n\t      var gradient = Array.isArray(variableGradients) ? variableGradients[i].tensor : variableGradients[name];\n\n\t      if (gradient == null) {\n\t        return;\n\t      }\n\n\t      var value = ENGINE.registeredVariables[name];\n\t      tidy(function () {\n\t        var newValue = add$1(mul(_this2.c, gradient), value);\n\t        value.assign(newValue);\n\t      });\n\t    });\n\t    this.incrementIterations();\n\t  }\n\t  /**\n\t   * Sets the learning rate of the optimizer.\n\t   */\n\t  ;\n\n\t  _proto.setLearningRate = function setLearningRate(learningRate) {\n\t    this.learningRate = learningRate;\n\n\t    if (this.c != null) {\n\t      this.c.dispose();\n\t    }\n\n\t    this.c = keep(scalar(-learningRate));\n\t  };\n\n\t  _proto.dispose = function dispose() {\n\t    this.c.dispose();\n\t  };\n\n\t  _proto.getWeights = /*#__PURE__*/function () {\n\t    var _getWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              _context.next = 2;\n\t              return this.saveIterations();\n\n\t            case 2:\n\t              _context.t0 = _context.sent;\n\t              return _context.abrupt(\"return\", [_context.t0]);\n\n\t            case 4:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function getWeights() {\n\t      return _getWeights.apply(this, arguments);\n\t    }\n\n\t    return getWeights;\n\t  }();\n\n\t  _proto.setWeights = /*#__PURE__*/function () {\n\t    var _setWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(weightValues) {\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              _context2.next = 2;\n\t              return this.extractIterations(weightValues);\n\n\t            case 2:\n\t              weightValues = _context2.sent;\n\n\t              if (!(weightValues.length !== 0)) {\n\t                _context2.next = 5;\n\t                break;\n\t              }\n\n\t              throw new Error('SGD optimizer does not have settable weights.');\n\n\t            case 5:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function setWeights(_x) {\n\t      return _setWeights.apply(this, arguments);\n\t    }\n\n\t    return setWeights;\n\t  }();\n\n\t  _proto.getConfig = function getConfig() {\n\t    return {\n\t      'learningRate': this.learningRate\n\t    };\n\t  }\n\t  /** @nocollapse */\n\t  ;\n\n\t  SGDOptimizer.fromConfig = function fromConfig(cls, config) {\n\t    return new cls(config['learningRate']);\n\t  };\n\n\t  return SGDOptimizer;\n\t}(Optimizer);\n\t/** @nocollapse */\n\n\tSGDOptimizer.className = 'SGD'; // Note: Name matters for Python compatibility.\n\n\tregisterClass(SGDOptimizer);\n\n\t/** @doclink Optimizer */\n\n\tvar MomentumOptimizer = /*#__PURE__*/function (_SGDOptimizer) {\n\t  _inheritsLoose(MomentumOptimizer, _SGDOptimizer);\n\n\t  function MomentumOptimizer(learningRate, momentum, useNesterov) {\n\t    var _this;\n\n\t    if (useNesterov === void 0) {\n\t      useNesterov = false;\n\t    }\n\n\t    _this = _SGDOptimizer.call(this, learningRate) || this;\n\t    _this.learningRate = learningRate;\n\t    _this.momentum = momentum;\n\t    _this.useNesterov = useNesterov;\n\t    _this.accumulations = [];\n\t    _this.m = scalar(_this.momentum);\n\t    return _this;\n\t  }\n\n\t  var _proto = MomentumOptimizer.prototype;\n\n\t  _proto.applyGradients = function applyGradients(variableGradients) {\n\t    var _this2 = this;\n\n\t    var variableNames = Array.isArray(variableGradients) ? variableGradients.map(function (item) {\n\t      return item.name;\n\t    }) : Object.keys(variableGradients);\n\t    variableNames.forEach(function (name, i) {\n\t      var value = ENGINE.registeredVariables[name];\n\n\t      if (_this2.accumulations[i] == null) {\n\t        var trainable = false;\n\t        _this2.accumulations[i] = {\n\t          originalName: name + \"/momentum\",\n\t          variable: tidy(function () {\n\t            return zerosLike(value).variable(trainable);\n\t          })\n\t        };\n\t      }\n\n\t      var accumulation = _this2.accumulations[i].variable;\n\t      var gradient = Array.isArray(variableGradients) ? variableGradients[i].tensor : variableGradients[name];\n\n\t      if (gradient == null) {\n\t        return;\n\t      }\n\n\t      tidy(function () {\n\t        var newValue;\n\t        var newAccumulation = add$1(mul(_this2.m, accumulation), gradient);\n\n\t        if (_this2.useNesterov) {\n\t          newValue = add$1(mul(_this2.c, add$1(gradient, mul(newAccumulation, _this2.m))), value);\n\t        } else {\n\t          newValue = add$1(mul(_this2.c, newAccumulation), value);\n\t        }\n\n\t        accumulation.assign(newAccumulation);\n\t        value.assign(newValue);\n\t      });\n\t    });\n\t    this.incrementIterations();\n\t  };\n\n\t  _proto.dispose = function dispose$1() {\n\t    this.m.dispose();\n\n\t    if (this.accumulations != null) {\n\t      dispose(this.accumulations.map(function (v) {\n\t        return v.variable;\n\t      }));\n\t    }\n\t  }\n\t  /**\n\t   * Sets the momentum of the optimizer.\n\t   *\n\t   * @param momentum\n\t   */\n\t  ;\n\n\t  _proto.setMomentum = function setMomentum(momentum) {\n\t    this.momentum = momentum;\n\t  };\n\n\t  _proto.getWeights = /*#__PURE__*/function () {\n\t    var _getWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              _context.next = 2;\n\t              return this.saveIterations();\n\n\t            case 2:\n\t              _context.t0 = _context.sent;\n\t              return _context.abrupt(\"return\", [_context.t0].concat(this.accumulations.map(function (v) {\n\t                return {\n\t                  name: v.originalName,\n\t                  tensor: v.variable\n\t                };\n\t              })));\n\n\t            case 4:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function getWeights() {\n\t      return _getWeights.apply(this, arguments);\n\t    }\n\n\t    return getWeights;\n\t  }();\n\n\t  _proto.setWeights = /*#__PURE__*/function () {\n\t    var _setWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(weightValues) {\n\t      var trainable;\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              _context2.next = 2;\n\t              return this.extractIterations(weightValues);\n\n\t            case 2:\n\t              weightValues = _context2.sent;\n\t              trainable = false;\n\t              this.accumulations = weightValues.map(function (v) {\n\t                return {\n\t                  originalName: v.name,\n\t                  variable: v.tensor.variable(trainable)\n\t                };\n\t              });\n\n\t            case 5:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function setWeights(_x) {\n\t      return _setWeights.apply(this, arguments);\n\t    }\n\n\t    return setWeights;\n\t  }();\n\n\t  _proto.getConfig = function getConfig() {\n\t    return {\n\t      'learningRate': this.learningRate,\n\t      'momentum': this.momentum,\n\t      'useNesterov': this.useNesterov\n\t    };\n\t  }\n\t  /** @nocollapse */\n\t  ;\n\n\t  MomentumOptimizer.fromConfig = function fromConfig(cls, config) {\n\t    return new cls(config['learningRate'], config['momentum'], config['useNesterov']);\n\t  };\n\n\t  return MomentumOptimizer;\n\t}(SGDOptimizer);\n\t/** @nocollapse */\n\n\tMomentumOptimizer.className = 'Momentum'; // Name matters for Python compatibility.\n\n\tregisterClass(MomentumOptimizer);\n\n\t/** @doclink Optimizer */\n\n\tvar RMSPropOptimizer = /*#__PURE__*/function (_Optimizer) {\n\t  _inheritsLoose(RMSPropOptimizer, _Optimizer);\n\n\t  function RMSPropOptimizer(learningRate, decay, momentum, epsilon, centered) {\n\t    var _this;\n\n\t    if (decay === void 0) {\n\t      decay = 0.9;\n\t    }\n\n\t    if (momentum === void 0) {\n\t      momentum = 0.0;\n\t    }\n\n\t    if (epsilon === void 0) {\n\t      epsilon = null;\n\t    }\n\n\t    if (centered === void 0) {\n\t      centered = false;\n\t    }\n\n\t    _this = _Optimizer.call(this) || this;\n\t    _this.learningRate = learningRate;\n\t    _this.decay = decay;\n\t    _this.momentum = momentum;\n\t    _this.epsilon = epsilon;\n\t    _this.accumulatedMeanSquares = [];\n\t    _this.accumulatedMoments = [];\n\t    _this.accumulatedMeanGrads = [];\n\t    _this.centered = centered;\n\n\t    if (epsilon == null) {\n\t      _this.epsilon = ENGINE.backend.epsilon();\n\t    }\n\n\t    if (learningRate == null) {\n\t      throw new Error(\"learningRate for RMSPropOptimizer must be defined.\");\n\t    }\n\n\t    return _this;\n\t  }\n\n\t  var _proto = RMSPropOptimizer.prototype;\n\n\t  _proto.applyGradients = function applyGradients(variableGradients) {\n\t    var _this2 = this;\n\n\t    var variableNames = Array.isArray(variableGradients) ? variableGradients.map(function (item) {\n\t      return item.name;\n\t    }) : Object.keys(variableGradients);\n\t    variableNames.forEach(function (name, i) {\n\t      var value = ENGINE.registeredVariables[name];\n\t      var trainable = false;\n\n\t      if (_this2.accumulatedMeanSquares[i] == null) {\n\t        _this2.accumulatedMeanSquares[i] = {\n\t          originalName: name + \"/rms\",\n\t          variable: tidy(function () {\n\t            return zerosLike(value).variable(trainable);\n\t          })\n\t        };\n\t      }\n\n\t      if (_this2.accumulatedMoments[i] == null) {\n\t        _this2.accumulatedMoments[i] = {\n\t          originalName: name + \"/momentum\",\n\t          variable: tidy(function () {\n\t            return zerosLike(value).variable(trainable);\n\t          })\n\t        };\n\t      }\n\n\t      if (_this2.accumulatedMeanGrads[i] == null && _this2.centered) {\n\t        _this2.accumulatedMeanGrads[i] = {\n\t          originalName: name + \"/mg\",\n\t          variable: tidy(function () {\n\t            return zerosLike(value).variable(trainable);\n\t          })\n\t        };\n\t      }\n\n\t      var gradient = Array.isArray(variableGradients) ? variableGradients[i].tensor : variableGradients[name];\n\n\t      if (gradient == null) {\n\t        return;\n\t      }\n\n\t      var accumulatedMeanSquare = _this2.accumulatedMeanSquares[i].variable;\n\t      var accumulatedMoments = _this2.accumulatedMoments[i].variable;\n\t      tidy(function () {\n\t        var newAccumulatedMeanSquare = add$1(mul(accumulatedMeanSquare, _this2.decay), mul(square(gradient), 1 - _this2.decay));\n\n\t        if (_this2.centered) {\n\t          var accumulatedMeanGrad = _this2.accumulatedMeanGrads[i].variable; // Centered gradient\n\n\t          var newAccumulatedMeanGrad = add$1(mul(accumulatedMeanGrad, _this2.decay), mul(gradient, 1 - _this2.decay));\n\t          var gradContribution = div(mul(gradient, _this2.learningRate), sqrt$3(sub(newAccumulatedMeanSquare, add$1(square(newAccumulatedMeanGrad), _this2.epsilon))));\n\t          var newAccumulatedMoments = add$1(mul(accumulatedMoments, _this2.momentum), gradContribution);\n\t          accumulatedMeanSquare.assign(newAccumulatedMeanSquare);\n\t          accumulatedMeanGrad.assign(newAccumulatedMeanGrad);\n\t          accumulatedMoments.assign(newAccumulatedMoments);\n\t          var newValue = sub(value, newAccumulatedMoments);\n\t          value.assign(newValue);\n\t        } else {\n\t          // Plain gradient\n\t          var _newAccumulatedMeanSquare = add$1(mul(accumulatedMeanSquare, _this2.decay), mul(square(gradient), 1 - _this2.decay));\n\n\t          var _newAccumulatedMoments = add$1(mul(accumulatedMoments, _this2.momentum), div(mul(gradient, _this2.learningRate), sqrt$3(add$1(_newAccumulatedMeanSquare, _this2.epsilon))));\n\n\t          accumulatedMeanSquare.assign(_newAccumulatedMeanSquare);\n\t          accumulatedMoments.assign(_newAccumulatedMoments);\n\n\t          var _newValue = sub(value, _newAccumulatedMoments);\n\n\t          value.assign(_newValue);\n\t        }\n\t      });\n\t    });\n\t    this.incrementIterations();\n\t  };\n\n\t  _proto.dispose = function dispose$1() {\n\t    if (this.accumulatedMeanSquares != null) {\n\t      dispose(this.accumulatedMeanSquares.map(function (v) {\n\t        return v.variable;\n\t      }));\n\t    }\n\n\t    if (this.accumulatedMeanGrads != null && this.centered) {\n\t      dispose(this.accumulatedMeanGrads.map(function (v) {\n\t        return v.variable;\n\t      }));\n\t    }\n\n\t    if (this.accumulatedMoments != null) {\n\t      dispose(this.accumulatedMoments.map(function (v) {\n\t        return v.variable;\n\t      }));\n\t    }\n\t  };\n\n\t  _proto.getWeights = /*#__PURE__*/function () {\n\t    var _getWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      var variables;\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              // Order matters for Python compatibility.\n\t              variables = [].concat(this.accumulatedMeanSquares, this.accumulatedMoments);\n\n\t              if (this.centered) {\n\t                variables.push.apply(variables, this.accumulatedMeanGrads);\n\t              }\n\n\t              _context.next = 4;\n\t              return this.saveIterations();\n\n\t            case 4:\n\t              _context.t0 = _context.sent;\n\t              return _context.abrupt(\"return\", [_context.t0].concat(variables.map(function (v) {\n\t                return {\n\t                  name: v.originalName,\n\t                  tensor: v.variable\n\t                };\n\t              })));\n\n\t            case 6:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function getWeights() {\n\t      return _getWeights.apply(this, arguments);\n\t    }\n\n\t    return getWeights;\n\t  }();\n\n\t  _proto.setWeights = /*#__PURE__*/function () {\n\t    var _setWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(weightValues) {\n\t      var variableCount, trainable;\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              _context2.next = 2;\n\t              return this.extractIterations(weightValues);\n\n\t            case 2:\n\t              weightValues = _context2.sent;\n\t              variableCount = this.centered ? weightValues.length / 3 : weightValues.length / 2;\n\t              trainable = false;\n\t              this.accumulatedMeanSquares = weightValues.slice(0, variableCount).map(function (v) {\n\t                return {\n\t                  originalName: v.name,\n\t                  variable: v.tensor.variable(trainable)\n\t                };\n\t              });\n\t              this.accumulatedMoments = weightValues.slice(variableCount, variableCount * 2).map(function (v) {\n\t                return {\n\t                  originalName: v.name,\n\t                  variable: v.tensor.variable(trainable)\n\t                };\n\t              });\n\n\t              if (this.centered) {\n\t                this.accumulatedMeanGrads = weightValues.slice(variableCount * 2, variableCount * 3).map(function (v) {\n\t                  return {\n\t                    originalName: v.name,\n\t                    variable: v.tensor.variable(trainable)\n\t                  };\n\t                });\n\t              }\n\n\t            case 8:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function setWeights(_x) {\n\t      return _setWeights.apply(this, arguments);\n\t    }\n\n\t    return setWeights;\n\t  }();\n\n\t  _proto.getConfig = function getConfig() {\n\t    return {\n\t      'learningRate': this.learningRate,\n\t      'decay': this.decay,\n\t      'momentum': this.momentum,\n\t      'epsilon': this.epsilon,\n\t      'centered': this.centered\n\t    };\n\t  }\n\t  /** @nocollapse */\n\t  ;\n\n\t  RMSPropOptimizer.fromConfig = function fromConfig(cls, config) {\n\t    return new cls(config['learningRate'], config['decay'], config['momentum'], config['epsilon'], config['centered']);\n\t  };\n\n\t  return RMSPropOptimizer;\n\t}(Optimizer);\n\t/** @nocollapse */\n\n\tRMSPropOptimizer.className = 'RMSProp'; // Note: Name matters for Python compatibility.\n\n\tregisterClass(RMSPropOptimizer);\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar OptimizerConstructors = /*#__PURE__*/function () {\n\t  function OptimizerConstructors() {}\n\n\t  /**\n\t   * Constructs a `tf.SGDOptimizer` that uses stochastic gradient descent.\n\t   *\n\t   * ```js\n\t   * // Fit a quadratic function by learning the coefficients a, b, c.\n\t   * const xs = tf.tensor1d([0, 1, 2, 3]);\n\t   * const ys = tf.tensor1d([1.1, 5.9, 16.8, 33.9]);\n\t   *\n\t   * const a = tf.scalar(Math.random()).variable();\n\t   * const b = tf.scalar(Math.random()).variable();\n\t   * const c = tf.scalar(Math.random()).variable();\n\t   *\n\t   * // y = a * x^2 + b * x + c.\n\t   * const f = x => a.mul(x.square()).add(b.mul(x)).add(c);\n\t   * const loss = (pred, label) => pred.sub(label).square().mean();\n\t   *\n\t   * const learningRate = 0.01;\n\t   * const optimizer = tf.train.sgd(learningRate);\n\t   *\n\t   * // Train the model.\n\t   * for (let i = 0; i < 10; i++) {\n\t   *   optimizer.minimize(() => loss(f(xs), ys));\n\t   * }\n\t   *\n\t   * // Make predictions.\n\t   * console.log(\n\t   *     `a: ${a.dataSync()}, b: ${b.dataSync()}, c: ${c.dataSync()}`);\n\t   * const preds = f(xs).dataSync();\n\t   * preds.forEach((pred, i) => {\n\t   *   console.log(`x: ${i}, pred: ${pred}`);\n\t   * });\n\t   * ```\n\t   *\n\t   * @param learningRate The learning rate to use for the SGD algorithm.\n\t   *\n\t   * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n\t   */\n\t  OptimizerConstructors.sgd = function sgd(learningRate) {\n\t    return new SGDOptimizer(learningRate);\n\t  }\n\t  /**\n\t   * Constructs a `tf.MomentumOptimizer` that uses momentum gradient\n\t   * descent.\n\t   *\n\t   * See\n\t   * [http://proceedings.mlr.press/v28/sutskever13.pdf](\n\t   * http://proceedings.mlr.press/v28/sutskever13.pdf)\n\t   *\n\t   * @param learningRate The learning rate to use for the Momentum gradient\n\t   * descent algorithm.\n\t   * @param momentum The momentum to use for the momentum gradient descent\n\t   * algorithm.\n\t   *\n\t   * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n\t   */\n\t  ;\n\n\t  OptimizerConstructors.momentum = function momentum(learningRate, _momentum, useNesterov) {\n\t    if (useNesterov === void 0) {\n\t      useNesterov = false;\n\t    }\n\n\t    return new MomentumOptimizer(learningRate, _momentum, useNesterov);\n\t  }\n\t  /**\n\t   * Constructs a `tf.RMSPropOptimizer` that uses RMSProp gradient\n\t   * descent. This implementation uses plain momentum and is not centered\n\t   * version of RMSProp.\n\t   *\n\t   * See\n\t   * [http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf](\n\t   * http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf)\n\t   *\n\t   * @param learningRate The learning rate to use for the RMSProp gradient\n\t   * descent algorithm.\n\t   * @param decay The discounting factor for the history/coming gradient.\n\t   * @param momentum The momentum to use for the RMSProp gradient descent\n\t   * algorithm.\n\t   * @param epsilon Small value to avoid zero denominator.\n\t   * @param centered If true, gradients are normalized by the estimated\n\t   * variance of the gradient.\n\t   *\n\t   * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n\t   */\n\t  ;\n\n\t  OptimizerConstructors.rmsprop = function rmsprop(learningRate, decay, momentum, epsilon, centered) {\n\t    if (decay === void 0) {\n\t      decay = .9;\n\t    }\n\n\t    if (momentum === void 0) {\n\t      momentum = 0.0;\n\t    }\n\n\t    if (epsilon === void 0) {\n\t      epsilon = null;\n\t    }\n\n\t    if (centered === void 0) {\n\t      centered = false;\n\t    }\n\n\t    return new RMSPropOptimizer(learningRate, decay, momentum, epsilon, centered);\n\t  }\n\t  /**\n\t   * Constructs a `tf.AdamOptimizer` that uses the Adam algorithm.\n\t   * See [https://arxiv.org/abs/1412.6980](https://arxiv.org/abs/1412.6980)\n\t   *\n\t   * @param learningRate The learning rate to use for the Adam gradient\n\t   * descent algorithm.\n\t   * @param beta1 The exponential decay rate for the 1st moment estimates.\n\t   * @param beta2 The exponential decay rate for the 2nd moment estimates.\n\t   * @param epsilon A small constant for numerical stability.\n\t   *\n\t   * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n\t   */\n\t  ;\n\n\t  OptimizerConstructors.adam = function adam(learningRate, beta1, beta2, epsilon) {\n\t    if (learningRate === void 0) {\n\t      learningRate = 0.001;\n\t    }\n\n\t    if (beta1 === void 0) {\n\t      beta1 = 0.9;\n\t    }\n\n\t    if (beta2 === void 0) {\n\t      beta2 = 0.999;\n\t    }\n\n\t    if (epsilon === void 0) {\n\t      epsilon = null;\n\t    }\n\n\t    return new AdamOptimizer(learningRate, beta1, beta2, epsilon);\n\t  }\n\t  /**\n\t   * Constructs a `tf.AdadeltaOptimizer` that uses the Adadelta algorithm.\n\t   * See [https://arxiv.org/abs/1212.5701](https://arxiv.org/abs/1212.5701)\n\t   *\n\t   * @param learningRate The learning rate to use for the Adadelta gradient\n\t   * descent algorithm.\n\t   * @param rho The learning rate decay over each update.\n\t   * @param epsilon A constant epsilon used to better condition the grad\n\t   * update.\n\t   *\n\t   * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n\t   */\n\t  ;\n\n\t  OptimizerConstructors.adadelta = function adadelta(learningRate, rho, epsilon) {\n\t    if (learningRate === void 0) {\n\t      learningRate = .001;\n\t    }\n\n\t    if (rho === void 0) {\n\t      rho = .95;\n\t    }\n\n\t    if (epsilon === void 0) {\n\t      epsilon = null;\n\t    }\n\n\t    return new AdadeltaOptimizer(learningRate, rho, epsilon);\n\t  }\n\t  /**\n\t   * Constructs a `tf.AdamaxOptimizer` that uses the Adamax algorithm.\n\t   * See [https://arxiv.org/abs/1412.6980](https://arxiv.org/abs/1412.6980)\n\t   *\n\t   * @param learningRate The learning rate to use for the Adamax gradient\n\t   * descent algorithm.\n\t   * @param beta1 The exponential decay rate for the 1st moment estimates.\n\t   * @param beta2 The exponential decay rate for the 2nd moment estimates.\n\t   * @param epsilon A small constant for numerical stability.\n\t   * @param decay The learning rate decay over each update.\n\t   *\n\t   * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n\t   */\n\t  ;\n\n\t  OptimizerConstructors.adamax = function adamax(learningRate, beta1, beta2, epsilon, decay) {\n\t    if (learningRate === void 0) {\n\t      learningRate = 0.002;\n\t    }\n\n\t    if (beta1 === void 0) {\n\t      beta1 = 0.9;\n\t    }\n\n\t    if (beta2 === void 0) {\n\t      beta2 = 0.999;\n\t    }\n\n\t    if (epsilon === void 0) {\n\t      epsilon = null;\n\t    }\n\n\t    if (decay === void 0) {\n\t      decay = 0.0;\n\t    }\n\n\t    return new AdamaxOptimizer(learningRate, beta1, beta2, epsilon, decay);\n\t  }\n\t  /**\n\t   * Constructs a `tf.AdagradOptimizer` that uses the Adagrad algorithm.\n\t   * See\n\t   * [http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf](\n\t   * http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf)\n\t   * or\n\t   * [http://ruder.io/optimizing-gradient-descent/index.html#adagrad](\n\t   * http://ruder.io/optimizing-gradient-descent/index.html#adagrad)\n\t   *\n\t   * @param learningRate The learning rate to use for the Adagrad gradient\n\t   * descent algorithm.\n\t   * @param initialAccumulatorValue Starting value for the accumulators, must be\n\t   * positive.\n\t   *\n\t   * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n\t   */\n\t  ;\n\n\t  OptimizerConstructors.adagrad = function adagrad(learningRate, initialAccumulatorValue) {\n\t    if (initialAccumulatorValue === void 0) {\n\t      initialAccumulatorValue = 0.1;\n\t    }\n\n\t    return new AdagradOptimizer(learningRate, initialAccumulatorValue);\n\t  };\n\n\t  return OptimizerConstructors;\n\t}();\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\t[MomentumOptimizer, SGDOptimizer, AdadeltaOptimizer, AdagradOptimizer, RMSPropOptimizer, AdamaxOptimizer, AdamOptimizer];\n\tvar train = {\n\t  sgd: OptimizerConstructors.sgd,\n\t  momentum: OptimizerConstructors.momentum,\n\t  adadelta: OptimizerConstructors.adadelta,\n\t  adagrad: OptimizerConstructors.adagrad,\n\t  rmsprop: OptimizerConstructors.rmsprop,\n\t  adamax: OptimizerConstructors.adamax,\n\t  adam: OptimizerConstructors.adam\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar delayCallback = function () {\n\t  if (typeof requestAnimationFrame !== 'undefined') {\n\t    return requestAnimationFrame;\n\t  } else if (typeof setImmediate !== 'undefined') {\n\t    return setImmediate;\n\t  }\n\n\t  return function (f) {\n\t    return f();\n\t  }; // no delays\n\t}();\n\t/**\n\t * Returns a promise that resolve when a requestAnimationFrame has completed.\n\t *\n\t * On Node.js this uses setImmediate instead of requestAnimationFrame.\n\t *\n\t * This is simply a sugar method so that users can do the following:\n\t * `await tf.nextFrame();`\n\t *\n\t * @doc {heading: 'Performance', subheading: 'Timing'}\n\t */\n\n\n\tfunction nextFrame() {\n\t  return new Promise(function (resolve) {\n\t    return delayCallback(function () {\n\t      return resolve();\n\t    });\n\t  });\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction assertParamsConsistent(shapes, axis) {\n\t  var rank = shapes[0].length;\n\t  shapes.forEach(function (shape, i) {\n\t    assert(shape.length === rank, function () {\n\t      return \"Error in concat\" + rank + \"D: rank of tensors[\" + i + \"] must be the same \" + (\"as the rank of the rest (\" + rank + \")\");\n\t    });\n\t  });\n\t  assert(axis >= 0 && axis < rank, function () {\n\t    return \"Error in concat\" + rank + \"D: axis must be between 0 and \" + (rank - 1) + \".\";\n\t  });\n\t  var firstShape = shapes[0];\n\t  shapes.forEach(function (shape, i) {\n\t    for (var r = 0; r < rank; r++) {\n\t      assert(r === axis || shape[r] === firstShape[r], function () {\n\t        return \"Error in concat\" + rank + \"D: Shape of tensors[\" + i + \"] (\" + shape + \") \" + (\"does not match the shape of the rest (\" + firstShape + \") \") + (\"along the non-concatenated axis \" + i + \".\");\n\t      });\n\t    }\n\t  });\n\t}\n\tfunction computeOutShape$1(shapes, axis) {\n\t  var outputShape = shapes[0].slice();\n\n\t  for (var i = 1; i < shapes.length; i++) {\n\t    outputShape[axis] += shapes[i][axis];\n\t  }\n\n\t  return outputShape;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar PARALLELIZE_THRESHOLD = 30;\n\tfunction computeOptimalWindowSize(inSize) {\n\t  if (inSize <= PARALLELIZE_THRESHOLD) {\n\t    return inSize;\n\t  }\n\n\t  return nearestDivisor(inSize, Math.floor(Math.sqrt(inSize)));\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t// Returns the image center in pixels.\n\tfunction getImageCenter(center, imageHeight, imageWidth) {\n\t  var centerX = imageWidth * (typeof center === 'number' ? center : center[0]);\n\t  var centerY = imageHeight * (typeof center === 'number' ? center : center[1]);\n\t  return [centerX, centerY];\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\t/**\n\t * Gets the new shape of the input Tensor after it's been reshaped\n\t * to:\n\t * [blockShape[0], ..., blockShape[M-1], batch / prod(blockShape),\n\t * inputShape[1], ..., inputShape[N-1]]\n\t *\n\t * See step 1: https://www.tensorflow.org/api_docs/python/tf/batch_to_space_nd\n\t */\n\tfunction getReshaped(inputShape, blockShape, prod, batchToSpace) {\n\t  if (batchToSpace === void 0) {\n\t    batchToSpace = true;\n\t  }\n\n\t  var reshaped = [];\n\n\t  if (batchToSpace) {\n\t    reshaped = reshaped.concat(blockShape.slice(0));\n\t    reshaped.push(inputShape[0] / prod);\n\t    reshaped = reshaped.concat(inputShape.slice(1));\n\t  } else {\n\t    reshaped = reshaped.concat(inputShape[0]);\n\t    var spatialLength = blockShape.length;\n\n\t    for (var i = 0; i < spatialLength; ++i) {\n\t      reshaped = reshaped.concat([inputShape[i + 1] / blockShape[i], blockShape[i]]);\n\t    }\n\n\t    reshaped = reshaped.concat(inputShape.slice(spatialLength + 1));\n\t  }\n\n\t  return reshaped;\n\t}\n\t/**\n\t * Gets the permutation that will transpose the dimensions of the\n\t * reshaped tensor to shape:\n\t *\n\t * [batch / prod(block_shape),inputShape[1], blockShape[0], ...,\n\t * inputShape[M], blockShape[M-1],inputShape[M+1], ..., inputShape[N-1]]\n\t *\n\t * see step 2: https://www.tensorflow.org/api_docs/python/tf/batch_to_space_nd\n\t */\n\n\tfunction getPermuted(reshapedRank, blockShapeRank, batchToSpace) {\n\t  if (batchToSpace === void 0) {\n\t    batchToSpace = true;\n\t  }\n\n\t  var permuted = [];\n\n\t  if (batchToSpace) {\n\t    permuted.push(blockShapeRank);\n\n\t    for (var i = blockShapeRank + 1; i < reshapedRank; ++i) {\n\t      if (i <= 2 * blockShapeRank) {\n\t        permuted.push(i);\n\t        permuted.push(i - (blockShapeRank + 1));\n\t      } else {\n\t        permuted.push(i);\n\t      }\n\t    }\n\t  } else {\n\t    var permutedBeforeBatch = [];\n\t    var permutedAfterBatch = [];\n\n\t    for (var _i = 1; _i < reshapedRank; ++_i) {\n\t      if (_i >= blockShapeRank * 2 + 1 || _i % 2 === 1) {\n\t        permutedAfterBatch.push(_i);\n\t      } else {\n\t        permutedBeforeBatch.push(_i);\n\t      }\n\t    }\n\n\t    permuted.push.apply(permuted, permutedBeforeBatch);\n\t    permuted.push(0);\n\t    permuted.push.apply(permuted, permutedAfterBatch);\n\t  }\n\n\t  return permuted;\n\t}\n\t/**\n\t * Gets the shape of the reshaped and permuted input Tensor before any cropping\n\t * is applied.  The new shape will be:\n\t *\n\t * [batch / prod(blockShape),inputShape[1] * blockShape[0], ...,\n\t * inputShape[M] * blockShape[M-1],inputShape[M+1], ..., inputShape[N-1]]\n\t *\n\t * See step 3: https://www.tensorflow.org/api_docs/python/tf/batch_to_space_nd\n\t */\n\n\tfunction getReshapedPermuted(inputShape, blockShape, prod, batchToSpace) {\n\t  if (batchToSpace === void 0) {\n\t    batchToSpace = true;\n\t  }\n\n\t  var reshapedPermuted = [];\n\n\t  if (batchToSpace) {\n\t    reshapedPermuted.push(inputShape[0] / prod);\n\t  } else {\n\t    reshapedPermuted.push(inputShape[0] * prod);\n\t  }\n\n\t  for (var i = 1; i < inputShape.length; ++i) {\n\t    if (i <= blockShape.length) {\n\t      if (batchToSpace) {\n\t        reshapedPermuted.push(blockShape[i - 1] * inputShape[i]);\n\t      } else {\n\t        reshapedPermuted.push(inputShape[i] / blockShape[i - 1]);\n\t      }\n\t    } else {\n\t      reshapedPermuted.push(inputShape[i]);\n\t    }\n\t  }\n\n\t  return reshapedPermuted;\n\t}\n\t/**\n\t * Converts the crops argument into the beginning coordinates of a slice\n\t * operation.\n\t */\n\n\tfunction getSliceBeginCoords(crops, blockShape) {\n\t  var sliceBeginCoords = [0];\n\n\t  for (var i = 0; i < blockShape; ++i) {\n\t    sliceBeginCoords.push(crops[i][0]);\n\t  }\n\n\t  return sliceBeginCoords;\n\t}\n\t/**\n\t * Converts the crops argument into the size of a slice operation.  When\n\t * combined with getSliceBeginCoords this function allows the reshaped and\n\t * permuted Tensor to be cropped to its final output shape of:\n\t *\n\t * inputShape[1] * blockShape[0] - crops[0,0] - crops[0,1], ...,\n\t * inputShape[M] * blockShape[M-1] -crops[M-1,0] -\n\t * crops[M-1,1],inputShape[M+1], ..., inputShape[N-1]]\n\t *\n\t * See step 4: https://www.tensorflow.org/api_docs/python/tf/batch_to_space_nd\n\t */\n\n\tfunction getSliceSize(uncroppedShape, crops, blockShape) {\n\t  var sliceSize = uncroppedShape.slice(0, 1);\n\n\t  for (var i = 0; i < blockShape; ++i) {\n\t    sliceSize.push(uncroppedShape[i + 1] - crops[i][0] - crops[i][1]);\n\t  }\n\n\t  return sliceSize;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar SELU_SCALEALPHA = 1.7580993408473768599402175208123;\n\tvar SELU_SCALE = 1.0507009873554804934193349852946;\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ERF_P = 0.3275911;\n\tvar ERF_A1 = 0.254829592;\n\tvar ERF_A2 = -0.284496736;\n\tvar ERF_A3 = 1.421413741;\n\tvar ERF_A4 = -1.453152027;\n\tvar ERF_A5 = 1.061405429;\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction warn() {\n\t  if (!env().getBool('IS_TEST')) {\n\t    var _console;\n\n\t    (_console = console).warn.apply(_console, arguments);\n\t  }\n\t}\n\tfunction log$a() {\n\t  if (!env().getBool('IS_TEST')) {\n\t    var _console2;\n\n\t    (_console2 = console).log.apply(_console2, arguments);\n\t  }\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\t/**\n\t * Merges real and imaginary Float32Arrays into a single complex Float32Array.\n\t *\n\t * The memory layout is interleaved as follows:\n\t * real: [r0, r1, r2]\n\t * imag: [i0, i1, i2]\n\t * complex: [r0, i0, r1, i1, r2, i2]\n\t *\n\t * This is the inverse of splitRealAndImagArrays.\n\t *\n\t * @param real The real values of the complex tensor values.\n\t * @param imag The imag values of the complex tensor values.\n\t * @returns A complex tensor as a Float32Array with merged values.\n\t */\n\tfunction mergeRealAndImagArrays(real, imag) {\n\t  if (real.length !== imag.length) {\n\t    throw new Error(\"Cannot merge real and imag arrays of different lengths. real:\" + (real.length + \", imag: \" + imag.length + \".\"));\n\t  }\n\n\t  var result = new Float32Array(real.length * 2);\n\n\t  for (var i = 0; i < result.length; i += 2) {\n\t    result[i] = real[i / 2];\n\t    result[i + 1] = imag[i / 2];\n\t  }\n\n\t  return result;\n\t}\n\t/**\n\t * Splits a complex Float32Array into real and imag parts.\n\t *\n\t * The memory layout is interleaved as follows:\n\t * complex: [r0, i0, r1, i1, r2, i2]\n\t * real: [r0, r1, r2]\n\t * imag: [i0, i1, i2]\n\t *\n\t * This is the inverse of mergeRealAndImagArrays.\n\t *\n\t * @param complex The complex tensor values.\n\t * @returns An object with real and imag Float32Array components of the complex\n\t *     tensor.\n\t */\n\n\tfunction splitRealAndImagArrays(complex) {\n\t  var real = new Float32Array(complex.length / 2);\n\t  var imag = new Float32Array(complex.length / 2);\n\n\t  for (var i = 0; i < complex.length; i += 2) {\n\t    real[i / 2] = complex[i];\n\t    imag[i / 2] = complex[i + 1];\n\t  }\n\n\t  return {\n\t    real: real,\n\t    imag: imag\n\t  };\n\t}\n\t/**\n\t * Extracts even indexed complex values in the given array.\n\t * @param complex The complex tensor values\n\t */\n\n\tfunction complexWithEvenIndex(complex) {\n\t  var len = Math.ceil(complex.length / 4);\n\t  var real = new Float32Array(len);\n\t  var imag = new Float32Array(len);\n\n\t  for (var i = 0; i < complex.length; i += 4) {\n\t    real[Math.floor(i / 4)] = complex[i];\n\t    imag[Math.floor(i / 4)] = complex[i + 1];\n\t  }\n\n\t  return {\n\t    real: real,\n\t    imag: imag\n\t  };\n\t}\n\t/**\n\t * Extracts odd indexed comple values in the given array.\n\t * @param complex The complex tensor values\n\t */\n\n\tfunction complexWithOddIndex(complex) {\n\t  var len = Math.floor(complex.length / 4);\n\t  var real = new Float32Array(len);\n\t  var imag = new Float32Array(len);\n\n\t  for (var i = 2; i < complex.length; i += 4) {\n\t    real[Math.floor(i / 4)] = complex[i];\n\t    imag[Math.floor(i / 4)] = complex[i + 1];\n\t  }\n\n\t  return {\n\t    real: real,\n\t    imag: imag\n\t  };\n\t}\n\t/**\n\t * Get the map representing a complex value in the given array.\n\t * @param complex The complex tensor values.\n\t * @param index An index of the target complex value.\n\t */\n\n\tfunction getComplexWithIndex(complex, index) {\n\t  var real = complex[index * 2];\n\t  var imag = complex[index * 2 + 1];\n\t  return {\n\t    real: real,\n\t    imag: imag\n\t  };\n\t}\n\t/**\n\t * Insert a given complex value into the TypedArray.\n\t * @param data The array in which the complex value is inserted.\n\t * @param c The complex value to be inserted.\n\t * @param index An index of the target complex value.\n\t */\n\n\tfunction assignToTypedArray(data, real, imag, index) {\n\t  data[index * 2] = real;\n\t  data[index * 2 + 1] = imag;\n\t}\n\t/**\n\t * Make the list of exponent terms used by FFT.\n\t */\n\n\tfunction exponents(n, inverse) {\n\t  var real = new Float32Array(n / 2);\n\t  var imag = new Float32Array(n / 2);\n\n\t  for (var i = 0; i < Math.ceil(n / 2); i++) {\n\t    var x = (inverse ? 2 : -2) * Math.PI * (i / n);\n\t    real[i] = Math.cos(x);\n\t    imag[i] = Math.sin(x);\n\t  }\n\n\t  return {\n\t    real: real,\n\t    imag: imag\n\t  };\n\t}\n\t/**\n\t * Make the exponent term used by FFT.\n\t */\n\n\tfunction exponent(k, n, inverse) {\n\t  var x = (inverse ? 2 : -2) * Math.PI * (k / n);\n\t  var real = Math.cos(x);\n\t  var imag = Math.sin(x);\n\t  return {\n\t    real: real,\n\t    imag: imag\n\t  };\n\t}\n\n\t/**\n\t * Prepare the split size array. When the input is a number, the axis is evenly\n\t * divided among the split size. When the input contains the negative value, the\n\t * rest of the axis is allocated toward that.\n\t */\n\n\tfunction prepareSplitSize(x, numOrSizeSplits, axis) {\n\t  if (axis === void 0) {\n\t    axis = 0;\n\t  }\n\n\t  var splitSizes = [];\n\n\t  if (typeof numOrSizeSplits === 'number') {\n\t    assert(x.shape[axis] % numOrSizeSplits === 0, function () {\n\t      return 'Number of splits must evenly divide the axis.';\n\t    });\n\t    splitSizes = new Array(numOrSizeSplits).fill(x.shape[axis] / numOrSizeSplits);\n\t  } else {\n\t    var numOfNegs = numOrSizeSplits.reduce(function (count, value) {\n\t      if (value === -1) {\n\t        count += 1;\n\t      }\n\n\t      return count;\n\t    }, 0);\n\t    assert(numOfNegs <= 1, function () {\n\t      return 'There should be only one negative value in split array.';\n\t    });\n\t    var negIndex = numOrSizeSplits.indexOf(-1); // Allow the number of split array to be -1, which indicates the rest\n\t    // of dimension is allocated to that split.\n\n\t    if (negIndex !== -1) {\n\t      var total = numOrSizeSplits.reduce(function (a, b) {\n\t        return b > 0 ? a + b : a;\n\t      });\n\t      numOrSizeSplits[negIndex] = x.shape[axis] - total;\n\t    }\n\n\t    assert(x.shape[axis] === numOrSizeSplits.reduce(function (a, b) {\n\t      return a + b;\n\t    }), function () {\n\t      return 'The sum of sizes must match the size of the axis dimension.';\n\t    });\n\t    splitSizes = numOrSizeSplits;\n\t  }\n\n\t  return splitSizes;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction segOpComputeOptimalWindowSize(inSize, numSegments) {\n\t  var done = false;\n\t  var res;\n\n\t  if (inSize <= PARALLELIZE_THRESHOLD) {\n\t    res = inSize;\n\t    done = true;\n\t  } else {\n\t    res = nearestDivisor(inSize, Math.floor(Math.sqrt(inSize)));\n\t  }\n\n\t  while (!done) {\n\t    if (res > numSegments || res === inSize) {\n\t      done = true;\n\t    } else {\n\t      res = nearestDivisor(inSize, res + 1);\n\t    }\n\t  }\n\n\t  return res;\n\t}\n\tfunction computeOutShape$2(aShape, axis, numSegments) {\n\t  var outShape = [];\n\t  var rank = aShape.length;\n\n\t  for (var dim = 0; dim < rank; dim++) {\n\t    if (dim !== axis) {\n\t      outShape.push(aShape[dim]);\n\t    } else {\n\t      outShape.push(numSegments);\n\t    }\n\t  }\n\n\t  return outShape;\n\t}\n\tfunction collectGatherOpShapeInfo(x, indices, axis, batchDims) {\n\t  var indicesRank = indices.shape.length;\n\t  var xRank = x.shape.length;\n\n\t  if (batchDims !== 0) {\n\t    if (batchDims < -indicesRank || batchDims > indicesRank) {\n\t      throw new Error(\"Expect batchDims in the range of [-\" + indicesRank + \", \" + indicesRank + \"], but got \" + batchDims);\n\t    }\n\t  }\n\n\t  if (batchDims < 0) {\n\t    batchDims += indicesRank;\n\t  }\n\n\t  if (batchDims > xRank) {\n\t    throw new Error(\"batchDims (\" + batchDims + \") must be less than rank(x) (\\n    \" + xRank + \").\");\n\t  }\n\n\t  if (axis < batchDims) {\n\t    throw new Error(\"batchDims (\" + batchDims + \") must be less than or equal to axis (\" + axis + \").\");\n\t  }\n\n\t  for (var i = 0; i < batchDims; ++i) {\n\t    if (x.shape[i] !== indices.shape[i]) {\n\t      throw new Error(\"x.shape[\" + i + \"]: \" + x.shape[i] + \" should be equal to indices.shape[\" + i + \"]: \" + indices.shape[i] + \".\");\n\t    }\n\t  }\n\n\t  var dimSize = x.shape[axis];\n\t  var outputShape = [];\n\t  var batchSize = 1;\n\t  var outerSize = 1;\n\t  var sliceSize = 1;\n\n\t  for (var _i = 0; _i < batchDims; ++_i) {\n\t    outputShape.push(x.shape[_i]);\n\t    batchSize *= x.shape[_i];\n\t  }\n\n\t  for (var _i2 = batchDims; _i2 < axis; _i2++) {\n\t    outputShape.push(x.shape[_i2]);\n\t    outerSize *= x.shape[_i2];\n\t  }\n\n\t  for (var _i3 = batchDims; _i3 < indicesRank; _i3++) {\n\t    outputShape.push(indices.shape[_i3]);\n\t  }\n\n\t  for (var _i4 = axis + 1; _i4 < xRank; _i4++) {\n\t    outputShape.push(x.shape[_i4]);\n\t    sliceSize *= x.shape[_i4];\n\t  }\n\n\t  return {\n\t    batchSize: batchSize,\n\t    sliceSize: sliceSize,\n\t    outerSize: outerSize,\n\t    dimSize: dimSize,\n\t    outputShape: outputShape\n\t  };\n\t}\n\n\tvar segment_util = {\n\t\t__proto__: null,\n\t\tsegOpComputeOptimalWindowSize: segOpComputeOptimalWindowSize,\n\t\tcomputeOutShape: computeOutShape$2,\n\t\tcollectGatherOpShapeInfo: collectGatherOpShapeInfo\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction castTensor(x, dtype, backend) {\n\t  if (dtype === 'complex64') {\n\t    if (x.dtype === 'complex64') {\n\t      return x.clone();\n\t    }\n\n\t    var zerosTensor = zeros(x.shape);\n\t    var floatX = cast(x, 'float32');\n\t    var result = backend.complex(floatX, zerosTensor);\n\t    zerosTensor.dispose();\n\t    floatX.dispose();\n\t    return result;\n\t  }\n\n\t  if (!hasEncodingLoss(x.dtype, dtype)) {\n\t    // We don't change the underlying data, since we cast to higher\n\t    // precision.\n\t    return ENGINE.makeTensorFromDataId(x.dataId, x.shape, dtype);\n\t  }\n\n\t  if (x.dtype === 'complex64') {\n\t    var real = backend.real(x);\n\n\t    var _result = cast(real, dtype);\n\n\t    real.dispose();\n\t    return _result;\n\t  }\n\n\t  if (dtype === 'int32') {\n\t    return backend.int(x);\n\t  } else if (dtype === 'bool') {\n\t    var zero = scalar(0, x.dtype);\n\n\t    var _result2 = backend.notEqual(x, zero);\n\n\t    zero.dispose();\n\t    return _result2;\n\t  } else {\n\t    throw new Error(\"Error in Cast: failed to cast \" + x.dtype + \" to \" + dtype);\n\t  }\n\t}\n\tfunction reshapeTensor(x, shape) {\n\t  return ENGINE.makeTensorFromDataId(x.dataId, shape, x.dtype);\n\t}\n\tfunction fromUint8ToStringArray(vals) {\n\t  try {\n\t    // Decode the bytes into string.\n\t    return vals.map(function (val) {\n\t      return decodeString(val);\n\t    });\n\t  } catch (err) {\n\t    throw new Error(\"Failed to decode encoded string bytes into utf-8, error: \" + err);\n\t  }\n\t}\n\tfunction fromStringArrayToUint8(strings) {\n\t  return strings.map(function (s) {\n\t    return encodeString(s);\n\t  });\n\t}\n\n\tvar backend_util = {\n\t\t__proto__: null,\n\t\tslice_util: slice_util,\n\t\tsegment_util: segment_util,\n\t\tcastTensor: castTensor,\n\t\treshapeTensor: reshapeTensor,\n\t\tfromUint8ToStringArray: fromUint8ToStringArray,\n\t\tfromStringArrayToUint8: fromStringArrayToUint8,\n\t\tupcastType: upcastType,\n\t\taxesAreInnerMostDims: axesAreInnerMostDims,\n\t\tcombineLocations: combineLocations,\n\t\tcomputeOutAndReduceShapes: computeOutAndReduceShapes,\n\t\texpandShapeToKeepDim: expandShapeToKeepDim,\n\t\tassertAxesAreInnerMostDims: assertAxesAreInnerMostDims,\n\t\tgetAxesPermutation: getAxesPermutation,\n\t\tgetUndoAxesPermutation: getUndoAxesPermutation,\n\t\tgetInnerMostAxes: getInnerMostAxes,\n\t\tgetBroadcastDims: getBroadcastDims,\n\t\tgetReductionAxes: getReductionAxes,\n\t\tassertAndGetBroadcastShape: assertAndGetBroadcastShape,\n\t\tassertParamsConsistent: assertParamsConsistent,\n\t\tcomputeOutShape: computeOutShape$1,\n\t\tcomputeDilation2DInfo: computeDilation2DInfo,\n\t\tcomputePool2DInfo: computePool2DInfo,\n\t\tcomputePool3DInfo: computePool3DInfo,\n\t\tcomputeConv2DInfo: computeConv2DInfo,\n\t\tcomputeConv3DInfo: computeConv3DInfo,\n\t\tcomputeDefaultPad: computeDefaultPad,\n\t\ttupleValuesAreOne: tupleValuesAreOne,\n\t\teitherStridesOrDilationsAreOne: eitherStridesOrDilationsAreOne,\n\t\tconvertConv2DDataFormat: convertConv2DDataFormat,\n\t\tgetFusedDyActivation: getFusedDyActivation,\n\t\tgetFusedBiasGradient: getFusedBiasGradient,\n\t\tapplyActivation: applyActivation,\n\t\tshouldFuse: shouldFuse,\n\t\tPARALLELIZE_THRESHOLD: PARALLELIZE_THRESHOLD,\n\t\tcomputeOptimalWindowSize: computeOptimalWindowSize,\n\t\tgetImageCenter: getImageCenter,\n\t\tgetReshaped: getReshaped,\n\t\tgetPermuted: getPermuted,\n\t\tgetReshapedPermuted: getReshapedPermuted,\n\t\tgetSliceBeginCoords: getSliceBeginCoords,\n\t\tgetSliceSize: getSliceSize,\n\t\tprepareAndValidate: prepareAndValidate,\n\t\tvalidateUpdateShape: validateUpdateShape,\n\t\tvalidateInput: validateInput,\n\t\tcalculateShapes: calculateShapes,\n\t\tSELU_SCALEALPHA: SELU_SCALEALPHA,\n\t\tSELU_SCALE: SELU_SCALE,\n\t\tERF_P: ERF_P,\n\t\tERF_A1: ERF_A1,\n\t\tERF_A2: ERF_A2,\n\t\tERF_A3: ERF_A3,\n\t\tERF_A4: ERF_A4,\n\t\tERF_A5: ERF_A5,\n\t\twarn: warn,\n\t\tlog: log$a,\n\t\tmergeRealAndImagArrays: mergeRealAndImagArrays,\n\t\tsplitRealAndImagArrays: splitRealAndImagArrays,\n\t\tcomplexWithEvenIndex: complexWithEvenIndex,\n\t\tcomplexWithOddIndex: complexWithOddIndex,\n\t\tgetComplexWithIndex: getComplexWithIndex,\n\t\tassignToTypedArray: assignToTypedArray,\n\t\texponents: exponents,\n\t\texponent: exponent,\n\t\tprepareSplitSize: prepareSplitSize\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tvar kernel_impls = {\n\t\t__proto__: null,\n\t\tnonMaxSuppressionV3Impl: nonMaxSuppressionV3Impl,\n\t\tnonMaxSuppressionV4Impl: nonMaxSuppressionV4Impl,\n\t\tnonMaxSuppressionV5Impl: nonMaxSuppressionV5Impl,\n\t\twhereImpl: whereImpl\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google Inc. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar absGradConfig = {\n\t  kernelName: Abs,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return mul(dy, step(cast(_x, 'float32'), -1));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar acosGradConfig = {\n\t  kernelName: Acos,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        var a = square(cast(_x, 'float32'));\n\t        var b = sqrt$3(sub(scalar(1), a));\n\t        return neg(div(dy, b));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar acoshGradConfig = {\n\t  kernelName: Acosh,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        var a = sqrt$3(sub(square(cast(_x, 'float32')), 1));\n\t        return div(dy, a);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar addGradConfig = {\n\t  kernelName: Add,\n\t  inputsToSave: ['a', 'b'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var a = saved[0],\n\t        b = saved[1];\n\t    var outShape = assertAndGetBroadcastShape(a.shape, b.shape);\n\n\t    var derA = function derA() {\n\t      var res = dy;\n\t      var reduceAxes = getReductionAxes(a.shape, outShape);\n\n\t      if (reduceAxes.length > 0) {\n\t        res = sum$1(res, reduceAxes);\n\t      }\n\n\t      return reshape(res, a.shape);\n\t    };\n\n\t    var derB = function derB() {\n\t      var res = dy;\n\t      var reduceAxes = getReductionAxes(b.shape, outShape);\n\n\t      if (reduceAxes.length > 0) {\n\t        res = sum$1(res, reduceAxes);\n\t      }\n\n\t      return reshape(res, b.shape);\n\t    };\n\n\t    return {\n\t      a: derA,\n\t      b: derB\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar addNGradConfig = {\n\t  kernelName: AddN,\n\t  saveAllInputs: true,\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var ders = {};\n\t    saved.forEach(function (_, i) {\n\t      ders[i] = function () {\n\t        return dy.clone();\n\t      };\n\t    });\n\t    return ders;\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google Inc. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar argMaxGradConfig = {\n\t  kernelName: ArgMax,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return zerosLike(_x);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google Inc. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar argMinGradConfig = {\n\t  kernelName: ArgMin,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return zerosLike(_x);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar asinGradConfig = {\n\t  kernelName: Asin,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return div(dy, sqrt$3(sub(scalar(1), square(cast(_x, 'float32')))));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar asinhGradConfig = {\n\t  kernelName: Asinh,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        var a = sqrt$3(add$1(scalar(1), square(cast(_x, 'float32'))));\n\t        return div(dy, a);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar atan2GradConfig = {\n\t  kernelName: Atan2,\n\t  inputsToSave: ['a', 'b'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var a = saved[0],\n\t        b = saved[1];\n\t    var outShape = assertAndGetBroadcastShape(a.shape, b.shape);\n\n\t    var derA = function derA() {\n\t      var d = add$1(square(a), square(b));\n\t      var res = mul(dy, div(b, d));\n\t      var reduceAxes = getReductionAxes(a.shape, outShape);\n\n\t      if (reduceAxes.length > 0) {\n\t        res = sum$1(res, reduceAxes);\n\t      }\n\n\t      return reshape(res, a.shape);\n\t    };\n\n\t    var derB = function derB() {\n\t      var d = add$1(square(a), square(b));\n\t      var res = neg(mul(dy, div(a, d)));\n\t      var reduceAxes = getReductionAxes(b.shape, outShape);\n\n\t      if (reduceAxes.length > 0) {\n\t        res = sum$1(res, reduceAxes);\n\t      }\n\n\t      return reshape(res, b.shape);\n\t    };\n\n\t    return {\n\t      a: derA,\n\t      b: derB\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar atanGradConfig = {\n\t  kernelName: Atan,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return div(dy, add$1(square(cast(_x, 'float32')), 1));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar atanhGradConfig = {\n\t  kernelName: Atanh,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return div(dy, sub(scalar(1), square(cast(_x, 'float32'))));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the backprop of a 3d avg pool.\n\t *\n\t * @param dy The dy error, of rank 5 of shape\n\t *     [batchSize, depth, height, width, channels].\n\t * assumed.\n\t * @param input The original input image, of rank 5 or rank4 of shape\n\t *     [batchSize, depth, height, width, channels].\n\t * @param filterSize The filter size:\n\t *     `[filterDepth, filterHeight, filterWidth]`.\n\t *     `filterSize` is a single number,\n\t *     then `filterDepth == filterHeight == filterWidth`.\n\t * @param strides The strides of the pooling:\n\t *     `[strideDepth, strideHeight, strideWidth]`. If\n\t *     `strides` is a single number, then `strideHeight == strideWidth`.\n\t * @param dilations Deprecated, this field will be gone in v3.0.0. The dilation\n\t *     rates: `[dilationDepth, dilationHeight, dilationWidth]`\n\t *     in which we sample input values across the depth, height and width\n\t *     dimensions in dilated pooling.\n\t *     Defaults to `[1, 1, 1]`. If `dilations` is a single number,\n\t *     then `dilationDepth == dilationHeight == dilationWidth`.\n\t *     If it is greater than 1, then all values of `strides` must be 1.\n\t * @param pad A string from: 'same', 'valid'. The type of padding algorithm\n\t *     used in the forward prop of the op.\n\t * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n\t *     provided, it will default to truncate.\n\t */\n\n\tfunction avgPool3dGrad_(dy, input, filterSize, strides, dilations, pad, dimRoundingMode) {\n\t  if (dilations === void 0) {\n\t    dilations = [1, 1, 1];\n\t  }\n\n\t  var $dy = convertToTensor(dy, 'dy', 'avgPool3dGrad');\n\t  var $input = convertToTensor(input, 'input', 'avgPool3dGrad');\n\t  var dy5D = $dy;\n\t  var input5D = $input;\n\t  var reshapedTo5D = false;\n\n\t  if ($input.rank === 4) {\n\t    reshapedTo5D = true;\n\t    dy5D = reshape($dy, [1, $dy.shape[0], $dy.shape[1], $dy.shape[2], $dy.shape[3]]);\n\t    input5D = reshape($input, [1, $input.shape[0], $input.shape[1], $input.shape[2], $input.shape[3]]);\n\t  }\n\n\t  assert(dy5D.rank === 5, function () {\n\t    return \"Error in avgPool3dGrad: dy must be rank 5 but got rank \" + (dy5D.rank + \".\");\n\t  });\n\t  assert(input5D.rank === 5, function () {\n\t    return \"Error in avgPool3dGrad: input must be rank 5 but got rank \" + (input5D.rank + \".\");\n\t  });\n\t  assert(eitherStridesOrDilationsAreOne(strides, dilations), function () {\n\t    return 'Error in avgPool3dGrad: Either strides or dilations ' + (\"must be 1. Got strides \" + strides + \" and dilations '\" + dilations + \"'\");\n\t  });\n\n\t  if (dimRoundingMode != null) {\n\t    assert(isInt(pad), function () {\n\t      return \"Error in avgPool3dGrad: pad must be an integer when \" + (\"using, dimRoundingMode \" + dimRoundingMode + \" but got pad \" + pad + \".\");\n\t    });\n\t  }\n\n\t  var inputs = {\n\t    dy: dy5D,\n\t    input: input5D\n\t  };\n\t  var attrs = {\n\t    filterSize: filterSize,\n\t    strides: strides,\n\t    dilations: dilations,\n\t    pad: pad,\n\t    dimRoundingMode: dimRoundingMode\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var res = ENGINE.runKernel(AvgPool3DGrad, inputs, attrs);\n\n\t  if (reshapedTo5D) {\n\t    return reshape(res, [res.shape[1], res.shape[2], res.shape[3], res.shape[4]]);\n\t  }\n\n\t  return res;\n\t}\n\n\tvar avgPool3dGrad = op({\n\t  avgPool3dGrad_: avgPool3dGrad_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar avgPool3DGradConfig = {\n\t  kernelName: AvgPool3D,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var _x = saved[0];\n\t    var filterSize = attrs.filterSize,\n\t        strides = attrs.strides,\n\t        dilations = attrs.dilations,\n\t        pad = attrs.pad,\n\t        dimRoundingMode = attrs.dimRoundingMode;\n\t    var $dilations = dilations == null ? [1, 1, 1] : dilations;\n\t    return {\n\t      x: function x() {\n\t        return avgPool3dGrad(dy, _x, filterSize, strides, $dilations, pad, dimRoundingMode);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the backprop of an 2D avg pool.\n\t *\n\t * @param dy The dy error, of rank 4 or rank 3 of shape\n\t *     [batchSize, height, width, channels]. If rank 3, batch of 1 is\n\t * assumed.\n\t * @param input The input image, of rank 4 or rank 3 of shape\n\t *     [batchSize, height, width, channels]. If rank 3, batch of 1 is\n\t * assumed.\n\t * @param filterSize The filter size: `[filterHeight, filterWidth]`. If\n\t *     `filterSize` is a single number, then `filterHeight == filterWidth`.\n\t * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If\n\t *     `strides` is a single number, then `strideHeight == strideWidth`.\n\t * @param pad A string from: 'same', 'valid'. The type of padding algorithm\n\t *     used in the forward prop of the op.\n\t */\n\n\tfunction avgPoolGrad_(dy, input, filterSize, strides, pad) {\n\t  var $dy = convertToTensor(dy, 'dy', 'avgPoolGrad');\n\t  var $input = convertToTensor(input, 'input', 'avgPoolGrad');\n\t  assert($input.rank === $dy.rank, function () {\n\t    return \"Rank of input (\" + $input.rank + \") does not match rank of dy (\" + $dy.rank + \")\";\n\t  });\n\t  var input4D = $input;\n\t  var dy4D = $dy;\n\t  var reshapedTo4D = false;\n\n\t  if ($input.rank === 3) {\n\t    reshapedTo4D = true;\n\t    input4D = reshape($input, [1, $input.shape[0], $input.shape[1], $input.shape[2]]);\n\t    dy4D = reshape($dy, [1, $dy.shape[0], $dy.shape[1], $dy.shape[2]]);\n\t  }\n\n\t  assert(dy4D.rank === 4, function () {\n\t    return \"Error in avgPoolGrad: dy must be rank 4 but got rank \" + (dy4D.rank + \".\");\n\t  });\n\t  assert(input4D.rank === 4, function () {\n\t    return \"Error in avgPoolGrad: input must be rank 4 but got rank \" + (input4D.rank + \".\");\n\t  });\n\t  var inputs = {\n\t    dy: dy4D,\n\t    input: input4D\n\t  };\n\t  var attrs = {\n\t    filterSize: filterSize,\n\t    strides: strides,\n\t    pad: pad\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var res = ENGINE.runKernel(AvgPoolGrad, inputs, attrs);\n\n\t  if (reshapedTo4D) {\n\t    return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n\t  }\n\n\t  return res;\n\t}\n\n\tvar avgPoolGrad = op({\n\t  avgPoolGrad_: avgPoolGrad_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar avgPoolGradConfig = {\n\t  kernelName: AvgPool,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var _x = saved[0];\n\t    var filterSize = attrs.filterSize,\n\t        strides = attrs.strides,\n\t        pad = attrs.pad;\n\t    return {\n\t      x: function x() {\n\t        return avgPoolGrad(dy, _x, filterSize, strides, pad);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar batchMatMulGradConfig = {\n\t  kernelName: BatchMatMul,\n\t  inputsToSave: ['a', 'b'],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var a = saved[0],\n\t        b = saved[1];\n\t    var transposeA = attrs.transposeA,\n\t        transposeB = attrs.transposeB;\n\n\t    if (!transposeA && !transposeB) {\n\t      return {\n\t        a: function a() {\n\t          return matMul(dy, b, false, true);\n\t        },\n\t        b: function b() {\n\t          return matMul(a, dy, true, false);\n\t        }\n\t      };\n\t    } else if (!transposeA && transposeB) {\n\t      return {\n\t        a: function a() {\n\t          return matMul(dy, b, false, false);\n\t        },\n\t        b: function b() {\n\t          return matMul(dy, a, true, false);\n\t        }\n\t      };\n\t    } else if (transposeA && !transposeB) {\n\t      return {\n\t        a: function a() {\n\t          return matMul(b, dy, false, true);\n\t        },\n\t        b: function b() {\n\t          return matMul(a, dy, false, false);\n\t        }\n\t      };\n\t    } else {\n\t      return {\n\t        a: function a() {\n\t          return matMul(b, dy, true, true);\n\t        },\n\t        b: function b() {\n\t          return matMul(dy, a, true, true);\n\t        }\n\t      };\n\t    }\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar batchToSpaceNDGradConfig = {\n\t  kernelName: BatchToSpaceND,\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var blockShape = attrs.blockShape,\n\t        crops = attrs.crops;\n\t    return {\n\t      x: function x() {\n\t        return spaceToBatchND(dy, blockShape, crops);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar broadcastToGradConfig = {\n\t  kernelName: BroadcastTo,\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var broadCastToAttrs = attrs;\n\t    var inputShape = broadCastToAttrs.inputShape;\n\t    var outputShape = broadCastToAttrs.shape;\n\t    var reps = Array.from(outputShape);\n\n\t    for (var i = inputShape.length - 1; i >= 0; i--) {\n\t      if (inputShape[i] === outputShape[i]) {\n\t        reps[i] = 1;\n\t      } else if (inputShape[i] !== 1) {\n\t        throw new Error(\"broadcastTo(): [\" + inputShape + \"] cannot be broadcast to [\" + outputShape + \"].\");\n\t      }\n\t    }\n\n\t    var axes = [];\n\n\t    for (var _i = 0; _i < reps.length; _i++) {\n\t      if (reps[_i] > 1) {\n\t        axes.push(_i);\n\t      }\n\t    }\n\n\t    return {\n\t      x: function x() {\n\t        return sum$1(dy, axes, true\n\t        /* keepDims */\n\t        );\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar castGradConfig = {\n\t  kernelName: Cast,\n\t  gradFunc: function gradFunc(dy) {\n\t    return {\n\t      x: function x() {\n\t        return dy.clone();\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ceilGradConfig = {\n\t  kernelName: Ceil,\n\t  gradFunc: function gradFunc(dy) {\n\t    // TODO(manrajgrover): Return null for gradients when backprop supports it.\n\t    return {\n\t      x: function x() {\n\t        return zerosLike(dy);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar clipByValueGradConfig = {\n\t  kernelName: ClipByValue,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var _x = saved[0];\n\t    var clipValueMin = attrs.clipValueMin,\n\t        clipValueMax = attrs.clipValueMax;\n\t    return {\n\t      x: function x() {\n\t        return where(logicalAnd(greaterEqual(_x, clipValueMin), lessEqual(_x, clipValueMax)), dy, zerosLike(dy));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar complexAbsGradConfig = {\n\t  kernelName: ComplexAbs,\n\t  inputsToSave: ['x'],\n\t  gradFunc: absGradConfig.gradFunc\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar concatGradConfig = {\n\t  kernelName: Concat,\n\t  saveAllInputs: true,\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var shapes = saved.map(function (t) {\n\t      return t.shape;\n\t    });\n\t    var axis = attrs.axis;\n\t    var $axis = parseAxisParam(axis, saved[0].shape)[0];\n\t    var sizeSplits = shapes.map(function (s) {\n\t      return s[$axis];\n\t    });\n\t    var derTensors = split$1(dy, sizeSplits, $axis);\n\t    return derTensors.map(function (t) {\n\t      return function () {\n\t        return t;\n\t      };\n\t    });\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar conv2DGradConfig = {\n\t  kernelName: Conv2D,\n\t  inputsToSave: ['x', 'filter'],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var x4D = saved[0],\n\t        $filter = saved[1];\n\t    var dilations = attrs.dilations,\n\t        strides = attrs.strides,\n\t        pad = attrs.pad,\n\t        dataFormat = attrs.dataFormat;\n\t    assert(tupleValuesAreOne(dilations), function () {\n\t      return 'Error in gradient of conv2D: dilation rates greater than 1 ' + (\"are not yet supported in gradients. Got dilations '\" + dilations + \"'\");\n\t    });\n\t    return {\n\t      x: function x() {\n\t        return conv2DBackpropInput(x4D.shape, dy, $filter, strides, pad, dataFormat);\n\t      },\n\t      filter: function filter() {\n\t        return conv2DBackpropFilter(x4D, dy, $filter.shape, strides, pad, dataFormat);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar conv2DBackpropInputGradConfig = {\n\t  kernelName: Conv2DBackpropInput,\n\t  inputsToSave: ['dy', 'filter'],\n\t  gradFunc: function gradFunc(ddx, saved, attrs) {\n\t    var dy = saved[0],\n\t        _filter = saved[1];\n\t    var strides = attrs.strides,\n\t        pad = attrs.pad,\n\t        dataFormat = attrs.dataFormat,\n\t        dimRoundingMode = attrs.dimRoundingMode;\n\t    return {\n\t      dy: function dy() {\n\t        return conv2d(ddx, _filter, strides, pad, dataFormat, 1\n\t        /* dilations */\n\t        , dimRoundingMode);\n\t      },\n\t      filter: function filter() {\n\t        return conv2DBackpropFilter(ddx, dy, _filter.shape, strides, pad, dataFormat, dimRoundingMode);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the derivative of the filter of a 3D convolution.\n\t *\n\t * @param x The input tensor, of rank 5 or rank 4 of shape\n\t *     [batch, depth, height, width, inChannels]. If rank 4, batch of 1 is\n\t *     assumed.\n\t * @param dy The dy image, of rank 5 or rank 4, of shape\n\t *     [batch, depth, height, width, outDepth]. If rank 4, batch of 1 is\n\t *     assumed.\n\t * @param filterShape The shape of the filter, length 5,\n\t *     [filterDepth, filterHeight, filterWidth, inDepth, outDepth].\n\t * @param strides The strides of the convolution: [strideDepth, strideHeight,\n\t * strideWidth].\n\t * @param pad A string from: 'same', 'valid'. The type of padding algorithm\n\t *     used in the forward prop of the op.\n\t */\n\n\tfunction conv3DBackpropFilter_(x, dy, filterShape, strides, pad) {\n\t  var x5D = x;\n\n\t  if (x.rank === 4) {\n\t    x5D = reshape(x, [1, x.shape[0], x.shape[1], x.shape[2], x.shape[3]]);\n\t  }\n\n\t  var dy5D = dy;\n\n\t  if (dy5D.rank === 4) {\n\t    dy5D = reshape(dy, [1, dy.shape[0], dy.shape[1], dy.shape[2], dy.shape[3]]);\n\t  }\n\n\t  assert(x5D.rank === 5, function () {\n\t    return \"Error in conv3dDerFilter: input must be rank 5, but got shape \" + (x5D.shape + \".\");\n\t  });\n\t  assert(dy5D.rank === 5, function () {\n\t    return \"Error in conv3dDerFilter: dy must be rank 5, but got shape \" + (dy5D.shape + \".\");\n\t  });\n\t  assert(filterShape.length === 5, function () {\n\t    return \"Error in conv3dDerFilter: filterShape must be length 5, but got \" + (filterShape + \".\");\n\t  });\n\t  assert(x5D.shape[4] === filterShape[3], function () {\n\t    return \"Error in conv3dDerFilter: depth of input \" + x5D.shape[4] + \") must \" + (\"match input depth in filter (\" + filterShape[3] + \".\");\n\t  });\n\t  assert(dy5D.shape[4] === filterShape[4], function () {\n\t    return \"Error in conv3dDerFilter: depth of dy (\" + dy5D.shape[4] + \") must \" + (\"match output depth for filter (\" + filterShape[4] + \").\");\n\t  });\n\t  var inputs = {\n\t    x: x5D,\n\t    dy: dy5D\n\t  };\n\t  var attrs = {\n\t    strides: strides,\n\t    pad: pad,\n\t    filterShape: filterShape\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  return ENGINE.runKernel(Conv3DBackpropFilterV2, inputs, attrs);\n\t}\n\n\tvar conv3DBackpropFilter = op({\n\t  conv3DBackpropFilter_: conv3DBackpropFilter_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar conv3DGradConfig = {\n\t  kernelName: Conv3D,\n\t  inputsToSave: ['x', 'filter'],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var dilations = attrs.dilations,\n\t        strides = attrs.strides,\n\t        pad = attrs.pad;\n\t    assert(tupleValuesAreOne(dilations), function () {\n\t      return 'Error in gradient of conv3D: dilation rates greater than 1 are ' + (\"not yet supported in gradients. Got dilations '\" + dilations + \"'\");\n\t    });\n\t    var x5D = saved[0],\n\t        $filter = saved[1];\n\t    return {\n\t      x: function x() {\n\t        return conv3DBackpropInput(x5D.shape, dy, $filter, strides, pad);\n\t      },\n\t      filter: function filter() {\n\t        return conv3DBackpropFilter(x5D, dy, $filter.shape, strides, pad);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar cosGradConfig = {\n\t  kernelName: Cos,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return mul(neg(sin(cast(_x, 'float32'))), dy);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar coshGradConfig = {\n\t  kernelName: Cosh,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return mul(sinh(cast(_x, 'float32')), dy);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar cumsumGradConfig = {\n\t  kernelName: Cumsum,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var _x = saved[0];\n\t    var axis = attrs.axis,\n\t        exclusive = attrs.exclusive,\n\t        reverse = attrs.reverse;\n\t    return {\n\t      x: function x() {\n\t        var permutation = getAxesPermutation([axis], _x.rank);\n\t        var out = cumsum(dy, axis, exclusive, !reverse);\n\n\t        if (permutation != null) {\n\t          out = transpose(out, permutation);\n\t        }\n\n\t        return out;\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar depthwiseConv2dNativeGradConfig = {\n\t  kernelName: DepthwiseConv2dNative,\n\t  inputsToSave: ['x', 'filter'],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var dilations = attrs.dilations,\n\t        strides = attrs.strides,\n\t        pad = attrs.pad,\n\t        dimRoundingMode = attrs.dimRoundingMode;\n\t    var $dilations = dilations == null ? [1, 1] : dilations;\n\t    assert(tupleValuesAreOne($dilations), function () {\n\t      return 'Error in gradient of depthwiseConv2dNative: dilation rates ' + \"greater than 1 are not yet supported. Got dilations \" + (\"'\" + $dilations + \"'\");\n\t    });\n\t    var _x = saved[0],\n\t        _filter = saved[1];\n\t    assert(_x.rank === 4, function () {\n\t      return \"Error in gradient of depthwiseConv2dNative: input must be \" + (\"rank 4, but got rank \" + _x.rank + \".\");\n\t    });\n\t    assert(_filter.rank === 4, function () {\n\t      return \"Error in gradient of depthwiseConv2dNative: filter must be \" + (\"rank 4, but got rank \" + _filter.rank + \".\");\n\t    });\n\t    assert(_x.shape[3] === _filter.shape[2], function () {\n\t      return \"Error in gradient of depthwiseConv2d: number of input \" + (\"channels (\" + _x.shape[3] + \") must match the inChannels dimension \") + (\"in filter \" + _filter.shape[2] + \".\");\n\t    });\n\t    assert(eitherStridesOrDilationsAreOne(strides, $dilations), function () {\n\t      return 'Error in gradient of depthwiseConv2d: Either strides or ' + (\"dilations must be  1. Got strides \" + strides + \" and dilations \") + (\"'\" + $dilations + \"'.\");\n\t    });\n\n\t    if (dimRoundingMode != null) {\n\t      assert(isInt(pad), function () {\n\t        return \"Error in depthwiseConv2d: pad must be an integer when using, \" + (\"dimRoundingMode \" + dimRoundingMode + \" but got pad \" + pad + \".\");\n\t      });\n\t    }\n\n\t    return {\n\t      x: function x() {\n\t        return depthwiseConv2dNativeBackpropInput(_x.shape, dy, _filter, strides, pad, dilations, dimRoundingMode);\n\t      },\n\t      filter: function filter() {\n\t        return depthwiseConv2dNativeBackpropFilter(_x, dy, _filter.shape, strides, pad, dilations, dimRoundingMode);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar dilation2dGradConfig = {\n\t  kernelName: Dilation2D,\n\t  inputsToSave: ['x', 'filter'],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var x = saved[0],\n\t        filter = saved[1];\n\t    var inputInputs = {\n\t      x: x,\n\t      filter: filter,\n\t      dy: dy\n\t    };\n\t    var filterInputs = {\n\t      x: x,\n\t      filter: filter,\n\t      dy: dy\n\t    };\n\t    return {\n\t      x: function x() {\n\t        return ENGINE.runKernel(Dilation2DBackpropInput, inputInputs, attrs);\n\t      },\n\t      filter: function filter() {\n\t        return ENGINE.runKernel(Dilation2DBackpropFilter, filterInputs, attrs);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar eluGradConfig = {\n\t  kernelName: Elu,\n\t  outputsToSave: [true],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var y = saved[0];\n\t    var inputs = {\n\t      dy: dy,\n\t      y: y\n\t    };\n\t    return {\n\t      x: function x() {\n\t        return ENGINE.runKernel(EluGrad, inputs);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar erfGradConfig = {\n\t  kernelName: Erf,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var x = saved[0];\n\t    var a = mul(exp$3(neg(square(x))), 2 / Math.sqrt(Math.PI));\n\t    return {\n\t      x: function x() {\n\t        return mul(dy, a);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar expGradConfig = {\n\t  kernelName: Exp,\n\t  outputsToSave: [true],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var y = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return mul(dy, y);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar expandDimsGradConfig = {\n\t  kernelName: ExpandDims,\n\t  inputsToSave: ['input'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _input = saved[0];\n\t    return {\n\t      input: function input() {\n\t        return reshape(dy, _input.shape);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar expm1GradConfig = {\n\t  kernelName: Expm1,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return mul(dy, exp$3(_x));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar floorGradConfig = {\n\t  kernelName: Floor,\n\t  gradFunc: function gradFunc(dy) {\n\t    return {\n\t      x: function x() {\n\t        return zerosLike(dy);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar floorDivGradConfig = {\n\t  kernelName: FloorDiv,\n\t  inputsToSave: ['a', 'b'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var a = saved[0],\n\t        b = saved[1];\n\t    var outShape = assertAndGetBroadcastShape(a.shape, b.shape);\n\n\t    var derA = function derA() {\n\t      var res = div(dy, cast(b, 'float32'));\n\t      var reduceAxes = getReductionAxes(a.shape, outShape);\n\n\t      if (reduceAxes.length > 0) {\n\t        return reshape(sum$1(res, reduceAxes), a.shape);\n\t      }\n\n\t      return res;\n\t    };\n\n\t    var derB = function derB() {\n\t      var res = mul(dy, cast(a, 'float32'));\n\t      var reduceAxes = getReductionAxes(b.shape, outShape);\n\n\t      if (reduceAxes.length > 0) {\n\t        res = reshape(sum$1(res, reduceAxes), b.shape);\n\t      }\n\n\t      var tmp = square(b);\n\t      return neg(div(res, cast(tmp, 'float32')));\n\t    };\n\n\t    return {\n\t      a: derA,\n\t      b: derB\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar fusedBatchNormGradConfig = {\n\t  kernelName: FusedBatchNorm,\n\t  inputsToSave: ['x', 'mean', 'variance', 'scale'],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var varianceEpsilon = attrs.varianceEpsilon;\n\t    var x = saved[0],\n\t        mean = saved[1],\n\t        variance = saved[2],\n\t        scale = saved[3];\n\t    var scaleValue = scale == null ? scalar(1) : scale;\n\t    var reductionAxes = getReductionAxes(mean.shape, x.shape);\n\t    var tileShape = [];\n\n\t    if (mean.rank === 1) {\n\t      for (var i = 0; i < x.shape.length - 1; ++i) {\n\t        tileShape.push(x.shape[i]);\n\t      }\n\n\t      tileShape.push(1);\n\t    }\n\n\t    var xMinusMean = sub(x, mean);\n\t    var dyTimesScaleValue = mul(dy, scaleValue);\n\t    var oneOverSqrtVariance = rsqrt(add$1(variance, scalar(varianceEpsilon)));\n\t    var minusHalfRCube = mul(mul(mul(oneOverSqrtVariance, oneOverSqrtVariance), oneOverSqrtVariance), scalar(-0.5));\n\n\t    var derX = function derX() {\n\t      if (mean.rank === 1) {\n\t        return reshape(mul(mul(dy, tile(reshape(oneOverSqrtVariance, [1, 1, 1, mean.shape[0]]), tileShape)), scaleValue), x.shape);\n\t      } else {\n\t        return reshape(mul(mul(dy, oneOverSqrtVariance), scaleValue), x.shape);\n\t      }\n\t    };\n\n\t    var derMean = function derMean() {\n\t      var meanDer = mul(mul(oneOverSqrtVariance, scalar(-1)), dyTimesScaleValue);\n\n\t      if (mean.rank === 1) {\n\t        meanDer = sum$1(meanDer, reductionAxes);\n\t      }\n\n\t      return reshape(meanDer, mean.shape);\n\t    };\n\n\t    var derVariance = function derVariance() {\n\t      var varianceDer = mul(mul(minusHalfRCube, xMinusMean), dyTimesScaleValue);\n\n\t      if (mean.rank === 1) {\n\t        varianceDer = sum$1(varianceDer, reductionAxes);\n\t      }\n\n\t      return reshape(varianceDer, mean.shape);\n\t    };\n\n\t    var derScale = function derScale() {\n\t      var xMinusMean2TimesRsqrt = mul(xMinusMean, oneOverSqrtVariance);\n\t      var scaleDer = mul(dy, xMinusMean2TimesRsqrt);\n\n\t      if (mean.rank === 1) {\n\t        scaleDer = sum$1(scaleDer, reductionAxes);\n\t      }\n\n\t      return reshape(scaleDer, mean.shape);\n\t    };\n\n\t    var derOffset = function derOffset() {\n\t      var offsetDer = dy;\n\n\t      if (mean.rank === 1) {\n\t        offsetDer = sum$1(offsetDer, reductionAxes);\n\t      }\n\n\t      return reshape(offsetDer, mean.shape);\n\t    };\n\n\t    return {\n\t      x: derX,\n\t      mean: derMean,\n\t      variance: derVariance,\n\t      scale: derScale,\n\t      offset: derOffset\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar gatherGradConfig = {\n\t  kernelName: GatherV2,\n\t  inputsToSave: ['x', 'indices'],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var x = saved[0],\n\t        _indices = saved[1];\n\t    var axis = attrs.axis;\n\t    var parsedAxis = parseAxisParam(axis, x.shape)[0];\n\n\t    var derX = function derX() {\n\t      var paramsShape = x.shape;\n\t      var indicesSize = _indices.size;\n\t      var outerShape = paramsShape.slice(0, parsedAxis);\n\t      var outerDims = outerShape.length;\n\t      var innerShape = paramsShape.slice(axis, paramsShape.length).slice(1);\n\t      var innerDims = innerShape.length;\n\t      var outerAxesIndices = arrayRange(0, outerDims);\n\t      var innerAxesIndices = arrayRange(outerDims + 1, outerDims + 1 + innerDims);\n\t      var valuesShape = arrayConcat([outerShape, [indicesSize], innerShape]);\n\t      var values = reshape(dy, valuesShape);\n\t      var reshapedIndices = reshape(_indices, [indicesSize]);\n\t      var transposeDims = arrayConcat([[outerDims], outerAxesIndices, innerAxesIndices]);\n\t      var valuesTranspose = transpose(values, transposeDims);\n\t      var paramsGrad = unsortedSegmentSum(valuesTranspose, reshapedIndices, x.shape[parsedAxis]);\n\t      var invertTransposeDims = getUndoAxesPermutation(transposeDims);\n\t      paramsGrad = transpose(paramsGrad, invertTransposeDims);\n\t      return paramsGrad;\n\t    };\n\n\t    return {\n\t      x: derX,\n\t      indices: function indices() {\n\t        return _indices;\n\t      }\n\t    };\n\t  }\n\t};\n\n\tfunction arrayRange(start, stop) {\n\t  var result = [];\n\n\t  for (var i = start; i < stop; ++i) {\n\t    result.push(i);\n\t  }\n\n\t  return result;\n\t}\n\n\tfunction arrayConcat(arrays) {\n\t  var result = [];\n\n\t  for (var i = 0; i < arrays.length; ++i) {\n\t    for (var j = 0; j < arrays[i].length; ++j) {\n\t      result.push(arrays[i][j]);\n\t    }\n\t  }\n\n\t  return result;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar greaterEqualGradConfig = {\n\t  kernelName: GreaterEqual,\n\t  inputsToSave: ['a', 'b'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _a = saved[0],\n\t        _b = saved[1];\n\t    return {\n\t      a: function a() {\n\t        return zerosLike(_a);\n\t      },\n\t      b: function b() {\n\t        return zerosLike(_b);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar identityGradConfig = {\n\t  kernelName: Identity,\n\t  gradFunc: function gradFunc(dy) {\n\t    return {\n\t      x: function x() {\n\t        return cast(dy, 'float32');\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar isFiniteGradConfig = {\n\t  kernelName: IsFinite,\n\t  gradFunc: function gradFunc(dy) {\n\t    // TODO(nsthorat): Let gradients be null for cases where we want to stop\n\t    // backpropgation.\n\t    return {\n\t      x: function x() {\n\t        return zerosLike(dy);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar isInfGradConfig = {\n\t  kernelName: IsInf,\n\t  gradFunc: function gradFunc(dy) {\n\t    // TODO(nsthorat): Let gradients be null for cases where we want to stop\n\t    // backpropgation.\n\t    return {\n\t      x: function x() {\n\t        return zerosLike(dy);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar isNanGradConfig = {\n\t  kernelName: IsNan,\n\t  gradFunc: function gradFunc(dy) {\n\t    // TODO(nsthorat): Let gradients be null for cases where we want to stop\n\t    // backpropgation.\n\t    return {\n\t      x: function x() {\n\t        return zerosLike(dy);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar leakyReluGradConfig = {\n\t  kernelName: LeakyRelu,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var x = saved[0];\n\t    var alpha = attrs.alpha;\n\t    var mask = greater(x, 0); // Returns `gradients * (features > 0) + alpha * gradients * (features <=\n\t    // 0)`.\n\n\t    return {\n\t      x: function x() {\n\t        return where(mask, dy, mul(dy, alpha));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar log1pGradConfig = {\n\t  kernelName: Log1p,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return div(dy, add$1(_x, 1));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar logGradConfig = {\n\t  kernelName: Log,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return div(dy, cast(_x, 'float32'));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar logSoftmaxGradConfig = {\n\t  kernelName: LogSoftmax,\n\t  inputsToSave: [],\n\t  outputsToSave: [true],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var value = saved[0];\n\t    var axis = attrs.axis;\n\t    return {\n\t      logits: function logits() {\n\t        var keepDims = true;\n\t        var softmax = exp$3(value);\n\t        return sub(dy, mul(sum$1(dy, axis, keepDims), softmax));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tfunction localResponseNormalizationBackprop_(x, y, dy, depthRadius, bias, alpha, beta) {\n\t  if (depthRadius === void 0) {\n\t    depthRadius = 5;\n\t  }\n\n\t  if (bias === void 0) {\n\t    bias = 1;\n\t  }\n\n\t  if (alpha === void 0) {\n\t    alpha = 1;\n\t  }\n\n\t  if (beta === void 0) {\n\t    beta = 0.5;\n\t  }\n\n\t  var inputs = {\n\t    x: x,\n\t    y: y,\n\t    dy: dy\n\t  };\n\t  var attrs = {\n\t    depthRadius: depthRadius,\n\t    bias: bias,\n\t    alpha: alpha,\n\t    beta: beta\n\t  };\n\t  return ENGINE.runKernel(LRNGrad, inputs, attrs);\n\t}\n\n\tvar localResponseNormalizationBackprop = op({\n\t  localResponseNormalizationBackprop_: localResponseNormalizationBackprop_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar lrnGradConfig = {\n\t  kernelName: LRN,\n\t  inputsToSave: ['x'],\n\t  outputsToSave: [true],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var _x = saved[0],\n\t        y = saved[1];\n\t    var depthRadius = attrs.depthRadius,\n\t        bias = attrs.bias,\n\t        alpha = attrs.alpha,\n\t        beta = attrs.beta;\n\t    return {\n\t      x: function x() {\n\t        return localResponseNormalizationBackprop(_x, y, dy, depthRadius, bias, alpha, beta);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Gradient helper function for the min and max operations.\n\t */\n\n\tfunction gradForMinAndMax(dy, y, xOrig, origAxes) {\n\t  if (y.rank < xOrig.rank) {\n\t    y = reshape(y, expandShapeToKeepDim(y.shape, origAxes));\n\t  }\n\n\t  if (dy.rank < xOrig.rank) {\n\t    dy = reshape(dy, expandShapeToKeepDim(dy.shape, origAxes));\n\t  }\n\n\t  return {\n\t    x: function x() {\n\t      var dx = mul(dy, cast(equal(xOrig, y), dy.dtype));\n\t      return dx;\n\t    }\n\t  };\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar maxGradConfig = {\n\t  kernelName: Max,\n\t  inputsToSave: ['x'],\n\t  outputsToSave: [true],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var maxAttrs = attrs;\n\t    var reductionIndices = maxAttrs.reductionIndices;\n\t    var x = saved[0];\n\t    var y = saved[1];\n\t    var origAxes = parseAxisParam(reductionIndices, x.shape);\n\t    var maxGrad = gradForMinAndMax(dy, y, x, origAxes);\n\t    return {\n\t      x: function x() {\n\t        return maxGrad['x']();\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar maximumGradConfig = {\n\t  kernelName: Maximum,\n\t  inputsToSave: ['a', 'b'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var a = saved[0],\n\t        b = saved[1];\n\n\t    var derA = function derA() {\n\t      return mul(dy, cast(greaterEqual(a, b), 'float32'));\n\t    };\n\n\t    var derB = function derB() {\n\t      return mul(dy, cast(less(a, b), 'float32'));\n\t    };\n\n\t    return {\n\t      a: derA,\n\t      b: derB\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the backprop of a 3d max pool.\n\t *\n\t * @param dy The dy error, of rank 5 of shape\n\t *     [batchSize, depth, height, width, channels].\n\t * assumed.\n\t * @param input The original input image, of rank 5 or rank 4 of shape\n\t *     [batchSize, depth, height, width, channels].\n\t * @param output The original output image, of rank 5 of shape\n\t *     [batchSize, outDepth, outHeight, outWidth, channels].\n\t * @param filterSize The filter size:\n\t *     `[filterDepth, filterHeight, filterWidth]`.\n\t *     `filterSize` is a single number,\n\t *     then `filterDepth == filterHeight == filterWidth`.\n\t * @param strides The strides of the pooling:\n\t *     `[strideDepth, strideHeight, strideWidth]`. If\n\t *     `strides` is a single number, then `strideHeight == strideWidth`.\n\t * @param dilations Deprecated, this field will be gone in v3.0.0.\n\t *     The dilation rates: `[dilationDepth, dilationHeight, dilationWidth]`\n\t *     in which we sample input values across the depth, height and width\n\t *     dimensions in dilated pooling.\n\t *     Defaults to `[1, 1, 1]`. If `dilations` is a single number,\n\t *     then `dilationDepth == dilationHeight == dilationWidth`.\n\t *     If it is greater than 1, then all values of `strides` must be 1.\n\t * @param pad A string from: 'same', 'valid'. The type of padding algorithm\n\t *     used in the forward prop of the op.\n\t * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n\t *     provided, it will default to truncate.\n\t */\n\n\tfunction maxPool3dGrad_(dy, input, output, filterSize, strides, dilations, pad, dimRoundingMode) {\n\t  if (dilations === void 0) {\n\t    dilations = [1, 1, 1];\n\t  }\n\n\t  var $dy = convertToTensor(dy, 'dy', 'maxPool3dGrad');\n\t  var $input = convertToTensor(input, 'input', 'maxPool3dGrad');\n\t  var $output = convertToTensor(output, 'output', 'maxPool3dGrad');\n\t  var dy5D = $dy;\n\t  var input5D = $input;\n\t  var output5D = $output;\n\t  var reshapedTo5D = false;\n\n\t  if ($input.rank === 4) {\n\t    reshapedTo5D = true;\n\t    dy5D = reshape($dy, [1, $dy.shape[0], $dy.shape[1], $dy.shape[2], $dy.shape[3]]);\n\t    input5D = reshape($input, [1, $input.shape[0], $input.shape[1], $input.shape[2], $input.shape[3]]);\n\t    output5D = reshape($output, [1, $output.shape[0], $output.shape[1], $output.shape[2], $output.shape[3]]);\n\t  }\n\n\t  assert(dy5D.rank === 5, function () {\n\t    return \"Error in maxPool3dGrad: dy must be rank 5 but got rank \" + (dy5D.rank + \".\");\n\t  });\n\t  assert(input5D.rank === 5, function () {\n\t    return \"Error in maxPool3dGrad: input must be rank 5 but got rank \" + (input5D.rank + \".\");\n\t  });\n\t  assert(output5D.rank === 5, function () {\n\t    return \"Error in maxPool3dGrad: output must be rank 5 but got rank \" + (output5D.rank + \".\");\n\t  });\n\t  assert(eitherStridesOrDilationsAreOne(strides, dilations), function () {\n\t    return 'Error in maxPool3dGrad: Either strides or dilations ' + (\"must be 1. Got strides \" + strides + \" and dilations '\" + dilations + \"'\");\n\t  });\n\n\t  if (dimRoundingMode != null) {\n\t    assert(isInt(pad), function () {\n\t      return \"Error in maxPool3dGrad: pad must be an integer when \" + (\"using, dimRoundingMode \" + dimRoundingMode + \" but got pad \" + pad + \".\");\n\t    });\n\t  }\n\n\t  var inputs = {\n\t    dy: dy5D,\n\t    input: input5D,\n\t    output: output5D\n\t  };\n\t  var attrs = {\n\t    filterSize: filterSize,\n\t    strides: strides,\n\t    dilations: dilations,\n\t    pad: pad,\n\t    dimRoundingMode: dimRoundingMode\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  var res = ENGINE.runKernel(MaxPool3DGrad, inputs, attrs);\n\n\t  if (reshapedTo5D) {\n\t    return reshape(res, [res.shape[1], res.shape[2], res.shape[3], res.shape[4]]);\n\t  }\n\n\t  return res;\n\t}\n\n\tvar maxPool3dGrad = op({\n\t  maxPool3dGrad_: maxPool3dGrad_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar maxPool3DGradConfig = {\n\t  kernelName: MaxPool3D,\n\t  inputsToSave: ['x'],\n\t  outputsToSave: [true],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var _x = saved[0],\n\t        y = saved[1];\n\t    var filterSize = attrs.filterSize,\n\t        strides = attrs.strides,\n\t        dilations = attrs.dilations,\n\t        pad = attrs.pad,\n\t        dimRoundingMode = attrs.dimRoundingMode;\n\t    var $dilations = dilations == null ? [1, 1, 1] : dilations;\n\t    return {\n\t      x: function x() {\n\t        return maxPool3dGrad(dy, _x, y, filterSize, strides, $dilations, pad, dimRoundingMode);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Computes the backprop of a 2D max pool.\n\t *\n\t * @param dy The dy error, of rank 4 or rank 3 of shape\n\t *     [batchSize, height, width, channels]. If rank 3, batch of 1 is\n\t * assumed.\n\t * @param input The original input image, of rank 4, of shape\n\t *     [batchSize, height, width, channels].\n\t * @param output The original output image, of rank 4, of shape\n\t *     [batchSize, outHeight, outWidth, channels].\n\t * @param filterSize The filter size: `[filterHeight, filterWidth]`. If\n\t *     `filterSize` is a single number, then `filterHeight == filterWidth`.\n\t * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If\n\t *     `strides` is a single number, then `strideHeight == strideWidth`.\n\t * @param pad A string from: 'same', 'valid'. The type of padding algorithm\n\t *     used in the forward prop of the op.\n\t * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n\t *     provided, it will default to truncate.\n\t */\n\n\tfunction maxPoolGrad_(dy, input, output, filterSize, strides, pad, dimRoundingMode) {\n\t  var $dy = convertToTensor(dy, 'dy', 'maxPoolGrad');\n\t  var $input = convertToTensor(input, 'input', 'maxPoolGrad');\n\t  var $output = convertToTensor(output, 'output', 'maxPoolGrad');\n\t  assert($input.rank === $dy.rank, function () {\n\t    return \"Rank of input (\" + $input.rank + \") does not match rank of dy \" + (\"(\" + $dy.rank + \")\");\n\t  });\n\t  assert($dy.rank === 4, function () {\n\t    return \"Error in maxPoolGrad: dy must be rank 4 but got rank \" + ($dy.rank + \".\");\n\t  });\n\t  assert($input.rank === 4, function () {\n\t    return \"Error in maxPoolGrad: input must be rank 4 but got rank \" + ($input.rank + \".\");\n\t  });\n\n\t  if (dimRoundingMode != null) {\n\t    assert(isInt(pad), function () {\n\t      return \"Error in maxPoolGrad: pad must be an integer when using, \" + (\"dimRoundingMode \" + dimRoundingMode + \" but got pad \" + pad + \".\");\n\t    });\n\t  }\n\n\t  var inputs = {\n\t    dy: $dy,\n\t    input: $input,\n\t    output: $output\n\t  };\n\t  var attrs = {\n\t    filterSize: filterSize,\n\t    strides: strides,\n\t    pad: pad,\n\t    dimRoundingMode: dimRoundingMode\n\t  }; // tslint:disable-next-line: no-unnecessary-type-assertion\n\n\t  return ENGINE.runKernel(MaxPoolGrad, inputs, attrs);\n\t}\n\n\tvar maxPoolGrad = op({\n\t  maxPoolGrad_: maxPoolGrad_\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar maxPoolGradConfig = {\n\t  kernelName: MaxPool,\n\t  inputsToSave: ['x'],\n\t  outputsToSave: [true],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var _x = saved[0],\n\t        y = saved[1];\n\t    var filterSize = attrs.filterSize,\n\t        strides = attrs.strides,\n\t        pad = attrs.pad;\n\t    return {\n\t      x: function x() {\n\t        return maxPoolGrad(dy, _x, y, filterSize, strides, pad);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar meanGradConfig = {\n\t  kernelName: Mean,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var x = saved[0];\n\t    var axis = attrs.axis;\n\t    var axes = parseAxisParam(axis, x.shape);\n\t    var shapes = computeOutAndReduceShapes(x.shape, axes);\n\t    var reduceShape = shapes[1];\n\t    var reduceSize = sizeFromShape(reduceShape);\n\n\t    var derX = function derX() {\n\t      var expandedDyShape = x.shape.slice();\n\t      axes.forEach(function (axis) {\n\t        expandedDyShape[axis] = 1;\n\t      });\n\t      var expandedDy = reshape(dy, expandedDyShape);\n\t      var res = div(mul(expandedDy, ones$1(x.shape, 'float32')), reduceSize);\n\t      return res;\n\t    };\n\n\t    return {\n\t      x: derX\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar minGradConfig = {\n\t  kernelName: Min,\n\t  inputsToSave: ['x'],\n\t  outputsToSave: [true],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var minAttrs = attrs;\n\t    var axis = minAttrs.axis;\n\t    var x = saved[0],\n\t        y = saved[1];\n\t    var origAxes = parseAxisParam(axis, x.shape);\n\t    var minGrad = gradForMinAndMax(dy, y, x, origAxes);\n\t    return {\n\t      x: function x() {\n\t        return minGrad['x']();\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar minimumGradConfig = {\n\t  kernelName: Minimum,\n\t  inputsToSave: ['a', 'b'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var a = saved[0],\n\t        b = saved[1];\n\n\t    var derA = function derA() {\n\t      return mul(dy, cast(lessEqual(a, b), 'float32'));\n\t    };\n\n\t    var derB = function derB() {\n\t      return mul(dy, cast(greater(a, b), 'float32'));\n\t    };\n\n\t    return {\n\t      a: derA,\n\t      b: derB\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar mirrorPadGradConfig = {\n\t  kernelName: MirrorPad,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    // Pad introduces values around the original tensor, so the gradient\n\t    // slices the original shape out of the gradient.\n\t    var _x = saved[0];\n\t    var paddings = attrs.paddings;\n\t    var begin = paddings.map(function (p) {\n\t      return p[0];\n\t    });\n\t    return {\n\t      x: function x() {\n\t        return slice$2(dy, begin, _x.shape);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar modGradConfig = {\n\t  kernelName: Mod,\n\t  inputsToSave: ['a', 'b'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var a = saved[0],\n\t        b = saved[1];\n\t    var outShape = assertAndGetBroadcastShape(a.shape, b.shape);\n\n\t    var derA = function derA() {\n\t      var reduceAxes = getReductionAxes(a.shape, outShape);\n\n\t      if (reduceAxes.length > 0) {\n\t        return reshape(sum$1(dy, reduceAxes), a.shape);\n\t      }\n\n\t      return dy;\n\t    };\n\n\t    var derB = function derB() {\n\t      var res = mul(dy, neg(floor$a(div(a, b))));\n\t      var reduceAxes = getReductionAxes(b.shape, outShape);\n\n\t      if (reduceAxes.length > 0) {\n\t        return reshape(sum$1(res, reduceAxes), b.shape);\n\t      }\n\n\t      return res;\n\t    };\n\n\t    return {\n\t      a: derA,\n\t      b: derB\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar multiplyGradConfig = {\n\t  kernelName: Multiply,\n\t  inputsToSave: ['a', 'b'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var a = saved[0],\n\t        b = saved[1];\n\t    var outShape = assertAndGetBroadcastShape(a.shape, b.shape);\n\n\t    var derA = function derA() {\n\t      var res = mul(dy, cast(b, 'float32'));\n\t      var reduceAxes = getReductionAxes(a.shape, outShape);\n\n\t      if (reduceAxes.length > 0) {\n\t        return reshape(sum$1(res, reduceAxes), a.shape);\n\t      }\n\n\t      return res;\n\t    };\n\n\t    var derB = function derB() {\n\t      var res = mul(dy, cast(a, 'float32'));\n\t      var reduceAxes = getReductionAxes(b.shape, outShape);\n\n\t      if (reduceAxes.length > 0) {\n\t        return reshape(sum$1(res, reduceAxes), b.shape);\n\t      }\n\n\t      return res;\n\t    };\n\n\t    return {\n\t      a: derA,\n\t      b: derB\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar negGradConfig = {\n\t  kernelName: Neg,\n\t  gradFunc: function gradFunc(dy) {\n\t    return {\n\t      x: function x() {\n\t        return neg(dy);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar oneHotGradConfig = {\n\t  kernelName: OneHot,\n\t  inputsToSave: ['indices'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _indices = saved[0];\n\t    return {\n\t      indices: function indices() {\n\t        return zeros(_indices.shape, 'float32');\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar onesLikeGradConfig = {\n\t  kernelName: OnesLike,\n\t  gradFunc: function gradFunc(dy) {\n\t    return {\n\t      x: function x() {\n\t        return zerosLike(dy);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar packGradConfig = {\n\t  kernelName: Pack,\n\t  saveAllInputs: true,\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var axis = attrs.axis;\n\t    var derTensors = unstack(dy, axis);\n\t    return derTensors.map(function (t) {\n\t      return function () {\n\t        return t;\n\t      };\n\t    });\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar padV2GradConfig = {\n\t  kernelName: PadV2,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    // Pad introduces values around the original tensor, so the gradient\n\t    // slices the original shape out of the gradient.\n\t    var _x = saved[0];\n\t    var paddings = attrs.paddings;\n\t    var begin = paddings.map(function (p) {\n\t      return p[0];\n\t    });\n\t    return {\n\t      x: function x() {\n\t        return slice$2(dy, begin, _x.shape);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar powGradConfig = {\n\t  kernelName: Pow,\n\t  inputsToSave: ['a', 'b'],\n\t  outputsToSave: [true],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var a = saved[0],\n\t        b = saved[1],\n\t        y = saved[2];\n\t    var base = a;\n\t    var exp = b;\n\t    var outShape = assertAndGetBroadcastShape(base.shape, exp.shape);\n\n\t    var derBase = function derBase() {\n\t      var expFloat = cast(exp, 'float32');\n\t      var res = mul(dy, mul(expFloat, pow$5(base, sub(expFloat, scalar(1)))));\n\t      var reduceAxes = getReductionAxes(base.shape, outShape);\n\n\t      if (reduceAxes.length > 0) {\n\t        res = sum$1(res, reduceAxes);\n\t      }\n\n\t      return reshape(res, base.shape);\n\t    };\n\n\t    var derExp = function derExp() {\n\t      var condition = greater(base, 0);\n\t      var logBase = where(condition, log$9(base), zerosLike(base));\n\t      var res = mul(dy, mul(y, logBase));\n\t      var reduceAxes = getReductionAxes(exp.shape, outShape);\n\n\t      if (reduceAxes.length > 0) {\n\t        res = sum$1(res, reduceAxes);\n\t      }\n\n\t      return reshape(res, exp.shape);\n\t    };\n\n\t    return {\n\t      a: derBase,\n\t      b: derExp\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar preluGradConfig = {\n\t  kernelName: Prelu,\n\t  inputsToSave: ['x', 'alpha'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var x = saved[0],\n\t        _alpha = saved[1];\n\t    var mask = greater(x, 0);\n\t    return {\n\t      x: function x() {\n\t        return where(mask, dy, mul(dy, _alpha));\n\t      },\n\t      alpha: function alpha() {\n\t        var res = where(mask, zerosLike(dy), mul(dy, x));\n\t        var reduceAxes = getReductionAxes(_alpha.shape, dy.shape);\n\n\t        if (reduceAxes.length > 0) {\n\t          res = sum$1(res, reduceAxes);\n\t        }\n\n\t        return reshape(res, _alpha.shape);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar divGradConfig = {\n\t  kernelName: RealDiv,\n\t  inputsToSave: ['a', 'b'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var a = saved[0],\n\t        b = saved[1];\n\t    var outShape = assertAndGetBroadcastShape(a.shape, b.shape);\n\n\t    var derA = function derA() {\n\t      var res = div(dy, cast(b, 'float32'));\n\t      var reduceAxes = getReductionAxes(a.shape, outShape);\n\n\t      if (reduceAxes.length > 0) {\n\t        return reshape(sum$1(res, reduceAxes), a.shape);\n\t      }\n\n\t      return res;\n\t    };\n\n\t    var derB = function derB() {\n\t      var res = mul(dy, cast(a, 'float32'));\n\t      var reduceAxes = getReductionAxes(b.shape, outShape);\n\n\t      if (reduceAxes.length > 0) {\n\t        res = reshape(sum$1(res, reduceAxes), b.shape);\n\t      }\n\n\t      var tmp = square(b);\n\t      return neg(div(res, cast(tmp, 'float32')));\n\t    };\n\n\t    return {\n\t      a: derA,\n\t      b: derB\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar reciprocalGradConfig = {\n\t  kernelName: Reciprocal,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return div(dy, neg(square(_x)));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar relu6GradConfig = {\n\t  kernelName: Relu6,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var x = saved[0];\n\t    var mask = mul(lessEqual(x, 6), step(x));\n\t    return {\n\t      x: function x() {\n\t        return mul(dy, cast(mask, 'float32'));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar reluGradConfig = {\n\t  kernelName: Relu,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return mul(dy, cast(step(_x), 'float32'));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google Inc. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar reshapeGradConfig = {\n\t  kernelName: Reshape,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return reshape(dy, _x.shape);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar resizeBilinearGradConfig = {\n\t  kernelName: ResizeBilinear,\n\t  inputsToSave: ['images'],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var images = saved[0];\n\t    var inputs = {\n\t      dy: dy,\n\t      images: images\n\t    };\n\n\t    var imagesDer = function imagesDer() {\n\t      return (// tslint:disable-next-line: no-unnecessary-type-assertion\n\t        ENGINE.runKernel(ResizeBilinearGrad, inputs, attrs)\n\t      );\n\t    };\n\n\t    return {\n\t      images: imagesDer\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar resizeNearestNeighborGradConfig = {\n\t  kernelName: ResizeNearestNeighbor,\n\t  inputsToSave: ['images'],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var images = saved[0];\n\t    var inputs = {\n\t      dy: dy,\n\t      images: images\n\t    };\n\n\t    var imagesDer = function imagesDer() {\n\t      return (// tslint:disable-next-line: no-unnecessary-type-assertion\n\t        ENGINE.runKernel(ResizeNearestNeighborGrad, inputs, attrs)\n\t      );\n\t    };\n\n\t    return {\n\t      images: imagesDer\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar reverseGradConfig = {\n\t  kernelName: Reverse,\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var dims = attrs.dims;\n\t    var axes = parseAxisParam(dims, dy.shape);\n\t    return {\n\t      x: function x() {\n\t        return reverse(dy, axes);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar roundGradConfig = {\n\t  kernelName: Round,\n\t  gradFunc: function gradFunc(dy) {\n\t    // TODO(nsthorat): Let gradients be null for cases where we want to stop\n\t    // backpropgation.\n\t    return {\n\t      x: function x() {\n\t        return zerosLike(dy);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar rsqrtGradConfig = {\n\t  kernelName: Rsqrt,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return neg(div(dy, mul(pow$5(_x, 1.5), 2)));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar selectGradConfig = {\n\t  kernelName: Select,\n\t  inputsToSave: ['condition'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _condition = saved[0];\n\t    return {\n\t      // TODO(julianoks): Return null for condition gradient\n\t      // when backprop supports it.\n\t      condition: function condition() {\n\t        return cast(zerosLike(_condition), 'float32');\n\t      },\n\t      t: function t() {\n\t        return mul(dy, cast(_condition, dy.dtype));\n\t      },\n\t      e: function e() {\n\t        return mul(dy, cast(logicalNot(_condition), dy.dtype));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar seluGradConfig = {\n\t  kernelName: Selu,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        var mask = greater(_x, scalar(0));\n\t        var scaleAlpha = scalar(SELU_SCALEALPHA);\n\t        var scale = scalar(SELU_SCALE);\n\t        var greaterThanZeroDer = mul(dy, scale);\n\t        var lessEqualZeroDer = mul(mul(dy, scaleAlpha), exp$3(cast(_x, 'float32')));\n\t        return where(mask, greaterThanZeroDer, lessEqualZeroDer);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar sigmoidGradConfig = {\n\t  kernelName: Sigmoid,\n\t  outputsToSave: [true],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var y = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return mul(dy, mul(y, sub(scalar(1), y)));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar signGradConfig = {\n\t  kernelName: Sign,\n\t  gradFunc: function gradFunc(dy) {\n\t    return {\n\t      x: function x() {\n\t        return zerosLike(dy);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar sinGradConfig = {\n\t  kernelName: Sin,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return mul(cos(cast(_x, 'float32')), dy);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar sinhGradConfig = {\n\t  kernelName: Sinh,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return mul(cosh(cast(_x, 'float32')), dy);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar sliceGradConfig = {\n\t  kernelName: Slice,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var x = saved[0];\n\t    var begin = attrs.begin,\n\t        size = attrs.size;\n\t    var inputShape = x.shape;\n\n\t    var _parseSliceParams = parseSliceParams(x, begin, size),\n\t        begin_ = _parseSliceParams[0],\n\t        size_ = _parseSliceParams[1]; // Create an Nx2 padding where the first column represents how many\n\t    // zeros are prepended (at start) for each dimension, and the second\n\t    // column indicates how many zeros are appended (at end).\n\t    // The number of zeros to append is the shape of the input\n\t    // elementwise-subtracted by both the begin vector and sizes vector.\n\n\n\t    var paddings = [];\n\n\t    for (var i = 0; i < dy.rank; i++) {\n\t      paddings.push([begin_[i], inputShape[i] - begin_[i] - size_[i]]);\n\t    }\n\n\t    return {\n\t      x: function x() {\n\t        return pad(dy, paddings);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar softmaxGradConfig = {\n\t  kernelName: Softmax,\n\t  outputsToSave: [true],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var y = saved[0];\n\t    var dim = attrs.dim;\n\t    var keepDims = true;\n\t    var dyTimesY = mul(dy, y);\n\t    return {\n\t      logits: function logits() {\n\t        return sub(dyTimesY, mul(sum$1(dyTimesY, [dim], keepDims), y));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar softplusGradConfig = {\n\t  kernelName: Softplus,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return mul(dy, sigmoid(_x));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar spaceToBatchNDGradConfig = {\n\t  kernelName: SpaceToBatchND,\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var blockShape = attrs.blockShape,\n\t        paddings = attrs.paddings;\n\t    return {\n\t      x: function x() {\n\t        return batchToSpaceND(dy, blockShape, paddings);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar splitVGradConfig = {\n\t  kernelName: SplitV,\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var axis = attrs.axis;\n\t    return {\n\t      x: function x() {\n\t        return concat(dy, axis);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar sqrtGradConfig = {\n\t  kernelName: Sqrt,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return div(dy, mul(sqrt$3(cast(_x, 'float32')), 2));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar squareGradConfig = {\n\t  kernelName: Square,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return mul(dy, mul(cast(_x, 'float32'), 2));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar squaredDifferenceGradConfig = {\n\t  kernelName: SquaredDifference,\n\t  inputsToSave: ['a', 'b'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var a = saved[0],\n\t        b = saved[1];\n\t    var two = scalar(2);\n\n\t    var derA = function derA() {\n\t      return mul(dy, mul(two, sub(a, b)));\n\t    };\n\n\t    var derB = function derB() {\n\t      return mul(dy, mul(two, sub(b, a)));\n\t    };\n\n\t    return {\n\t      a: derA,\n\t      b: derB\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar stepGradConfig = {\n\t  kernelName: Step,\n\t  gradFunc: function gradFunc(dy) {\n\t    // TODO(manrajgrover): Return null for gradients when backprop supports\n\t    // it.\n\t    return {\n\t      x: function x() {\n\t        return zerosLike(dy);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar subGradConfig = {\n\t  kernelName: Sub,\n\t  inputsToSave: ['a', 'b'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var a = saved[0],\n\t        b = saved[1];\n\t    var outShape = assertAndGetBroadcastShape(a.shape, b.shape);\n\n\t    var derA = function derA() {\n\t      var res = dy;\n\t      var reduceAxes = getReductionAxes(a.shape, outShape);\n\n\t      if (reduceAxes.length > 0) {\n\t        res = sum$1(res, reduceAxes);\n\t      }\n\n\t      return reshape(res, a.shape);\n\t    };\n\n\t    var derB = function derB() {\n\t      var res = dy;\n\t      var reduceAxes = getReductionAxes(b.shape, outShape);\n\n\t      if (reduceAxes.length > 0) {\n\t        res = sum$1(res, reduceAxes);\n\t      }\n\n\t      return reshape(neg(res), b.shape);\n\t    };\n\n\t    return {\n\t      a: derA,\n\t      b: derB\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google Inc. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar sumGradConfig = {\n\t  kernelName: Sum,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var x = saved[0];\n\t    var expandedDyShape = x.shape.slice();\n\t    var axis = attrs.axis;\n\t    var axes = parseAxisParam(axis, x.shape);\n\t    axes.forEach(function (axis) {\n\t      expandedDyShape[axis] = 1;\n\t    });\n\t    var expandedDy = reshape(dy, expandedDyShape);\n\t    var derX = mul(expandedDy, ones$1(x.shape, 'float32'));\n\t    return {\n\t      x: function x() {\n\t        return derX;\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar tanGradConfig = {\n\t  kernelName: Tan,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var _x = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return div(dy, square(cos(_x)));\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar tanhGradConfig = {\n\t  kernelName: Tanh,\n\t  outputsToSave: [true],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var y = saved[0];\n\t    return {\n\t      x: function x() {\n\t        return mul(sub(scalar(1), square(y)), dy);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar tileGradConfig = {\n\t  kernelName: Tile,\n\t  inputsToSave: ['x'],\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var x = saved[0];\n\t    var reps = attrs.reps;\n\n\t    var derX = function derX() {\n\t      var xGrad = zerosLike(x); // TODO(cais): Maybe reduce memory footprint by avoiding repeated\n\t      // slicing.\n\n\t      if (x.rank === 1) {\n\t        for (var i = 0; i < reps[0]; ++i) {\n\t          xGrad = add$1(xGrad, slice$2(dy, [i * x.shape[0]], [x.shape[0]]));\n\t        }\n\t      } else if (x.rank === 2) {\n\t        for (var _i = 0; _i < reps[0]; ++_i) {\n\t          for (var j = 0; j < reps[1]; ++j) {\n\t            xGrad = add$1(xGrad, slice$2(dy, [_i * x.shape[0], j * x.shape[1]], [x.shape[0], x.shape[1]]));\n\t          }\n\t        }\n\t      } else if (x.rank === 3) {\n\t        for (var _i2 = 0; _i2 < reps[0]; ++_i2) {\n\t          for (var _j = 0; _j < reps[1]; ++_j) {\n\t            for (var k = 0; k < reps[2]; ++k) {\n\t              xGrad = add$1(xGrad, slice$2(dy, [_i2 * x.shape[0], _j * x.shape[1], k * x.shape[2]], [x.shape[0], x.shape[1], x.shape[2]]));\n\t            }\n\t          }\n\t        }\n\t      } else if (x.rank === 4) {\n\t        for (var _i3 = 0; _i3 < reps[0]; ++_i3) {\n\t          for (var _j2 = 0; _j2 < reps[1]; ++_j2) {\n\t            for (var _k = 0; _k < reps[2]; ++_k) {\n\t              for (var l = 0; l < reps[3]; ++l) {\n\t                xGrad = add$1(xGrad, slice$2(dy, [_i3 * x.shape[0], _j2 * x.shape[1], _k * x.shape[2], l * x.shape[3]], [x.shape[0], x.shape[1], x.shape[2], x.shape[3]]));\n\t              }\n\t            }\n\t          }\n\t        }\n\t      } else {\n\t        throw new Error(\"Gradient for tile operation is not implemented for rank-\" + (x.rank + \" tensors yet.\"));\n\t      }\n\n\t      return xGrad;\n\t    };\n\n\t    return {\n\t      x: derX\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar transposeGradConfig = {\n\t  kernelName: Transpose,\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var transposeAttrs = attrs;\n\t    var perm = transposeAttrs.perm;\n\t    var undoPerm = getUndoAxesPermutation(perm);\n\t    return {\n\t      x: function x() {\n\t        return transpose(dy, undoPerm);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google Inc. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar unpackGradConfig = {\n\t  kernelName: Unpack,\n\t  gradFunc: function gradFunc(dy, saved, attrs) {\n\t    var unpackAttrs = attrs;\n\t    var axis = unpackAttrs.axis;\n\t    return {\n\t      value: function value() {\n\t        return stack(dy, axis);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar unsortedSegmentSumGradConfig = {\n\t  kernelName: UnsortedSegmentSum,\n\t  inputsToSave: ['segmentIds'],\n\t  gradFunc: function gradFunc(dy, saved) {\n\t    var segmentIds = saved[0];\n\n\t    var derX = function derX() {\n\t      return gatherDropNegatives(dy, segmentIds);\n\t    };\n\n\t    return {\n\t      x: derX\n\t    };\n\t  }\n\t};\n\n\tfunction gatherDropNegatives(x, indices) {\n\t  // Helper function for unsorted segment ops. Gathers params for\n\t  // positive segment ids and gathers 0 for inputs with negative segment id.\n\t  // Mirrors _GatherDropNegatives from tensorflow/python/ops/math_grad.py\n\t  var zeroClippedIndices = maximum(indices, zerosLike(indices));\n\t  var gathered = gather(x, zeroClippedIndices);\n\t  var isPositive = greaterEqual(indices, scalar(0, 'int32'));\n\t  var numIters = gathered.rank - isPositive.rank;\n\n\t  for (var i = 0; i < numIters; ++i) {\n\t    isPositive = expandDims(isPositive, i + 1);\n\t  }\n\n\t  isPositive = logicalAnd(isPositive, ones$1(gathered.shape, 'bool'));\n\t  var zeroSlice = zerosLike(gathered);\n\t  return where(isPositive, gathered, zeroSlice);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar zerosLikeGradConfig = {\n\t  kernelName: ZerosLike,\n\t  gradFunc: function gradFunc(dy) {\n\t    return {\n\t      x: function x() {\n\t        return zerosLike(dy);\n\t      }\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tvar gradConfigs = [absGradConfig, acosGradConfig, acoshGradConfig, addGradConfig, addNGradConfig, argMaxGradConfig, argMinGradConfig, asinGradConfig, asinhGradConfig, atan2GradConfig, atanGradConfig, atanhGradConfig, avgPool3DGradConfig, avgPoolGradConfig, batchMatMulGradConfig, batchToSpaceNDGradConfig, broadcastToGradConfig, castGradConfig, ceilGradConfig, clipByValueGradConfig, complexAbsGradConfig, concatGradConfig, conv2DBackpropInputGradConfig, conv2DGradConfig, conv3DGradConfig, cosGradConfig, coshGradConfig, cumsumGradConfig, depthwiseConv2dNativeGradConfig, dilation2dGradConfig, divGradConfig, eluGradConfig, erfGradConfig, expGradConfig, expandDimsGradConfig, expm1GradConfig, floorDivGradConfig, floorGradConfig, fusedBatchNormGradConfig, gatherGradConfig, greaterEqualGradConfig, identityGradConfig, isFiniteGradConfig, isInfGradConfig, isNanGradConfig, leakyReluGradConfig, log1pGradConfig, logGradConfig, logSoftmaxGradConfig, lrnGradConfig, maxGradConfig, maxGradConfig, maximumGradConfig, maxPool3DGradConfig, maxPoolGradConfig, meanGradConfig, minGradConfig, minimumGradConfig, mirrorPadGradConfig, modGradConfig, multiplyGradConfig, negGradConfig, oneHotGradConfig, onesLikeGradConfig, packGradConfig, padV2GradConfig, padV2GradConfig, powGradConfig, preluGradConfig, reciprocalGradConfig, relu6GradConfig, reluGradConfig, reshapeGradConfig, resizeBilinearGradConfig, resizeNearestNeighborGradConfig, reverseGradConfig, roundGradConfig, rsqrtGradConfig, selectGradConfig, seluGradConfig, sigmoidGradConfig, signGradConfig, sinGradConfig, sinhGradConfig, sliceGradConfig, softmaxGradConfig, softplusGradConfig, spaceToBatchNDGradConfig, spaceToBatchNDGradConfig, splitVGradConfig, splitVGradConfig, sqrtGradConfig, squaredDifferenceGradConfig, squareGradConfig, stepGradConfig, subGradConfig, sumGradConfig, tanGradConfig, tanhGradConfig, tileGradConfig, transposeGradConfig, unpackGradConfig, unsortedSegmentSumGradConfig, zerosLikeGradConfig];\n\n\tfor (var _i = 0, _gradConfigs = gradConfigs; _i < _gradConfigs.length; _i++) {\n\t  var gradientConfig = _gradConfigs[_i];\n\t  registerGradient(gradientConfig);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.abs = function () {\n\t  this.throwIfDisposed();\n\t  return abs$8(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.acos = function () {\n\t  this.throwIfDisposed();\n\t  return acos(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.acosh = function () {\n\t  this.throwIfDisposed();\n\t  return acosh(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * @deprecated strict variants of ops have been deprecated\n\t */\n\n\tTensor.prototype.addStrict = function (x) {\n\t  this.throwIfDisposed();\n\t  return addStrict(this, x);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.add = function (b) {\n\t  this.throwIfDisposed();\n\t  return add$1(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.all = function (axis, keepDims) {\n\t  this.throwIfDisposed();\n\t  return all(this, axis, keepDims);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.any = function (axis, keepDims) {\n\t  this.throwIfDisposed();\n\t  return any(this, axis, keepDims);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.argMax = function (axis) {\n\t  this.throwIfDisposed();\n\t  return argMax(this, axis);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.argMin = function (axis) {\n\t  this.throwIfDisposed();\n\t  return argMin(this, axis);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/** Converts a size-1 `tf.Tensor` to a `tf.Scalar`.\n\t * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t */\n\n\tTensor.prototype.asScalar = function () {\n\t  this.throwIfDisposed();\n\t  assert(this.size === 1, function () {\n\t    return 'The array must have only 1 element.';\n\t  });\n\t  return reshape(this, []);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Casts a `tf.Tensor` to a specified dtype.\n\t *\n\t * @param dtype Data-type to cast the tensor to.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t */\n\n\tTensor.prototype.asType = function (dtype) {\n\t  this.throwIfDisposed();\n\t  return cast(this, dtype);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/** Converts a `tf.Tensor` to a `tf.Tensor1D`.\n\t * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t */\n\n\tTensor.prototype.as1D = function () {\n\t  this.throwIfDisposed();\n\t  return reshape(this, [this.size]);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Converts a `tf.Tensor` to a `tf.Tensor2D`.\n\t *\n\t * @param rows Number of rows in `tf.Tensor2D`.\n\t * @param columns Number of columns in `tf.Tensor2D`.\n\t * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t */\n\n\tTensor.prototype.as2D = function (rows, columns) {\n\t  this.throwIfDisposed();\n\t  return reshape(this, [rows, columns]);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Converts a `tf.Tensor` to a `tf.Tensor3D`.\n\t *\n\t * @param rows Number of rows in `tf.Tensor3D`.\n\t * @param columns Number of columns in `tf.Tensor3D`.\n\t * @param depth Depth of `tf.Tensor3D`.\n\t * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t */\n\n\tTensor.prototype.as3D = function (rows, columns, depth) {\n\t  this.throwIfDisposed();\n\t  return reshape(this, [rows, columns, depth]);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Converts a `tf.Tensor` to a `tf.Tensor4D`.\n\t *\n\t * @param rows Number of rows in `tf.Tensor4D`.\n\t * @param columns Number of columns in `tf.Tensor4D`.\n\t * @param depth Depth of `tf.Tensor4D`.\n\t * @param depth2 4th dimension of `tf.Tensor4D`.\n\t * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t */\n\n\tTensor.prototype.as4D = function (rows, columns, depth, depth2) {\n\t  this.throwIfDisposed();\n\t  return reshape(this, [rows, columns, depth, depth2]);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Converts a `tf.Tensor` to a `tf.Tensor5D`.\n\t *\n\t * @param rows Number of rows in `tf.Tensor5D`.\n\t * @param columns Number of columns in `tf.Tensor5D`.\n\t * @param depth Depth of `tf.Tensor5D`.\n\t * @param depth2 4th dimension of `tf.Tensor5D`.\n\t * @param depth3 5th dimension of 'tf.Tensor5D'\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t */\n\n\tTensor.prototype.as5D = function (rows, columns, depth, depth2, depth3) {\n\t  this.throwIfDisposed();\n\t  return reshape(this, [rows, columns, depth, depth2, depth3]);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.asin = function () {\n\t  this.throwIfDisposed();\n\t  return asin(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.asinh = function () {\n\t  this.throwIfDisposed();\n\t  return asinh$1(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.atan = function () {\n\t  this.throwIfDisposed();\n\t  return atan(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.atan2 = function (b) {\n\t  this.throwIfDisposed();\n\t  return atan2(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.atanh = function () {\n\t  this.throwIfDisposed();\n\t  return atanh(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.avgPool = function (filterSize, strides, pad, dimRoundingMode) {\n\t  this.throwIfDisposed();\n\t  return avgPool(this, filterSize, strides, pad, dimRoundingMode);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.batchToSpaceND = function (blockShape, crops) {\n\t  this.throwIfDisposed();\n\t  return batchToSpaceND(this, blockShape, crops);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.batchNorm = function (mean, variance, offset, scale, varianceEpsilon) {\n\t  this.throwIfDisposed();\n\t  return batchNorm(this, mean, variance, offset, scale, varianceEpsilon);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.broadcastTo = function (shape) {\n\t  this.throwIfDisposed();\n\t  return broadcastTo(this, shape);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.cast = function (dtype) {\n\t  this.throwIfDisposed();\n\t  return cast(this, dtype);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.ceil = function () {\n\t  this.throwIfDisposed();\n\t  return ceil$3(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.clipByValue = function (min, max) {\n\t  this.throwIfDisposed();\n\t  return clipByValue(this, min, max);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.concat = function (x, axis) {\n\t  this.throwIfDisposed();\n\n\t  if (x instanceof Tensor) {\n\t    x = [x];\n\t  }\n\n\t  return concat([this].concat(x), axis);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.conv1d = function (filter, stride, pad, dataFormat, dilation, dimRoundingMode) {\n\t  this.throwIfDisposed();\n\t  return conv1d(this, filter, stride, pad, dataFormat, dilation, dimRoundingMode);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.conv2dTranspose = function (filter, outputShape, strides, pad, dimRoundingMode) {\n\t  this.throwIfDisposed();\n\t  return conv2dTranspose(this, filter, outputShape, strides, pad, dimRoundingMode);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.conv2d = function (filter, strides, pad, dataFormat, dilations, dimRoundingMode) {\n\t  this.throwIfDisposed();\n\t  return conv2d(this, filter, strides, pad, dataFormat, dilations, dimRoundingMode);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.cos = function () {\n\t  this.throwIfDisposed();\n\t  return cos(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.cosh = function () {\n\t  this.throwIfDisposed();\n\t  return cosh(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.cumsum = function (axis, exclusive, reverse) {\n\t  this.throwIfDisposed();\n\t  return cumsum(this, axis, exclusive, reverse);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.depthToSpace = function (blockSize, dataFormat) {\n\t  this.throwIfDisposed();\n\t  return depthToSpace(this, blockSize, dataFormat);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * @deprecated Use `depthwiseConv2d` instead.\n\t */\n\n\tTensor.prototype.depthwiseConv2D = function (filter, strides, pad, dataFormat, dilations, dimRoundingMode) {\n\t  deprecationWarn('depthwiseConv2D is deprecated, use depthwiseConv2d instead');\n\t  this.throwIfDisposed();\n\t  return depthwiseConv2d(this, filter, strides, pad, dataFormat, dilations, dimRoundingMode);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.depthwiseConv2d = function (filter, strides, pad, dataFormat, dilations, dimRoundingMode) {\n\t  this.throwIfDisposed();\n\t  return depthwiseConv2d(this, filter, strides, pad, dataFormat, dilations, dimRoundingMode);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.dilation2d = function (filter, strides, pad, dilations, dataFormat) {\n\t  this.throwIfDisposed();\n\t  return dilation2d(this, filter, strides, pad, dilations, dataFormat);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.divNoNan = function (b) {\n\t  this.throwIfDisposed();\n\t  return divNoNan(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.divStrict = function (x) {\n\t  this.throwIfDisposed();\n\t  return divStrict(this, x);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.div = function (b) {\n\t  this.throwIfDisposed();\n\t  return div(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.dot = function (b) {\n\t  this.throwIfDisposed();\n\t  return dot(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.elu = function () {\n\t  this.throwIfDisposed();\n\t  return elu(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * @deprecated strict variants of ops have been deprecated\n\t */\n\n\tTensor.prototype.equalStrict = function (x) {\n\t  this.throwIfDisposed();\n\t  return equalStrict(this, x);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.equal = function (b) {\n\t  this.throwIfDisposed();\n\t  return equal(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.erf = function () {\n\t  this.throwIfDisposed();\n\t  return erf(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.exp = function () {\n\t  this.throwIfDisposed();\n\t  return exp$3(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.expandDims = function (axis) {\n\t  this.throwIfDisposed();\n\t  return expandDims(this, axis);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.expm1 = function () {\n\t  this.throwIfDisposed();\n\t  return expm1(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.fft = function () {\n\t  this.throwIfDisposed();\n\t  return fft(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/** Flatten a Tensor to a 1D array.\n\t * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t */\n\n\tTensor.prototype.flatten = function () {\n\t  this.throwIfDisposed();\n\t  return reshape(this, [this.size]);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.floor = function () {\n\t  this.throwIfDisposed();\n\t  return floor$a(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.floorDiv = function (b) {\n\t  this.throwIfDisposed();\n\t  return floorDiv(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.gather = function (indices, axis) {\n\t  this.throwIfDisposed();\n\t  return gather(this, indices, axis);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * @deprecated strict variants of ops have been deprecated\n\t */\n\n\tTensor.prototype.greaterEqualStrict = function (x) {\n\t  this.throwIfDisposed();\n\t  return greaterEqualStrict(this, x);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.greaterEqual = function (b) {\n\t  this.throwIfDisposed();\n\t  return greaterEqual(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * @deprecated strict variants of ops have been deprecated\n\t */\n\n\tTensor.prototype.greaterStrict = function (x) {\n\t  this.throwIfDisposed();\n\t  return greaterStrict(this, x);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.greater = function (b) {\n\t  this.throwIfDisposed();\n\t  return greater(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.ifft = function () {\n\t  this.throwIfDisposed();\n\t  return ifft(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.irfft = function () {\n\t  this.throwIfDisposed();\n\t  return irfft(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.isFinite = function () {\n\t  this.throwIfDisposed();\n\t  return isFinite$1(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.isInf = function () {\n\t  this.throwIfDisposed();\n\t  return isInf(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.isNaN = function () {\n\t  this.throwIfDisposed();\n\t  return isNaN$1(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.leakyRelu = function (alpha) {\n\t  this.throwIfDisposed();\n\t  return leakyRelu(this, alpha);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * @deprecated strict variants of ops have been deprecated\n\t */\n\n\tTensor.prototype.lessEqualStrict = function (x) {\n\t  this.throwIfDisposed();\n\t  return lessEqualStrict(this, x);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.lessEqual = function (b) {\n\t  this.throwIfDisposed();\n\t  return lessEqual(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.lessStrict = function (x) {\n\t  this.throwIfDisposed();\n\t  return lessStrict(this, x);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.less = function (b) {\n\t  this.throwIfDisposed();\n\t  return less(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.localResponseNormalization = function (depthRadius, bias, alpha, beta) {\n\t  this.throwIfDisposed();\n\t  return localResponseNormalization(this, depthRadius, bias, alpha, beta);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.logSigmoid = function () {\n\t  this.throwIfDisposed();\n\t  return logSigmoid(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.logSoftmax = function (axis) {\n\t  this.throwIfDisposed();\n\t  return logSoftmax(this, axis);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.logSumExp = function (axis, keepDims) {\n\t  this.throwIfDisposed();\n\t  return logSumExp(this, axis, keepDims);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.log = function () {\n\t  this.throwIfDisposed();\n\t  return log$9(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.log1p = function () {\n\t  this.throwIfDisposed();\n\t  return log1p(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.logicalAnd = function (b) {\n\t  this.throwIfDisposed();\n\t  return logicalAnd(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.logicalNot = function () {\n\t  this.throwIfDisposed();\n\t  return logicalNot(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.logicalOr = function (b) {\n\t  this.throwIfDisposed();\n\t  return logicalOr(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.logicalXor = function (b) {\n\t  this.throwIfDisposed();\n\t  return logicalXor(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.matMul = function (b, transposeA, transposeB) {\n\t  this.throwIfDisposed();\n\t  return matMul(this, b, transposeA, transposeB);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.maxPool = function (filterSize, strides, pad, dimRoundingMode) {\n\t  this.throwIfDisposed();\n\t  return maxPool(this, filterSize, strides, pad, dimRoundingMode);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.max = function (axis, keepDims) {\n\t  this.throwIfDisposed();\n\t  return max$4(this, axis, keepDims);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * @deprecated strict variants of ops have been deprecated\n\t */\n\n\tTensor.prototype.maximumStrict = function (x) {\n\t  this.throwIfDisposed();\n\t  return maximumStrict(this, x);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.maximum = function (b) {\n\t  this.throwIfDisposed();\n\t  return maximum(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.mean = function (axis, keepDims) {\n\t  this.throwIfDisposed();\n\t  return mean(this, axis, keepDims);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.min = function (axis, keepDims) {\n\t  this.throwIfDisposed();\n\t  return min$9(this, axis, keepDims);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * @deprecated strict variants of ops have been deprecated\n\t */\n\n\tTensor.prototype.minimumStrict = function (x) {\n\t  this.throwIfDisposed();\n\t  return minimumStrict(this, x);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.minimum = function (b) {\n\t  this.throwIfDisposed();\n\t  return minimum(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.mirrorPad = function (paddings, mode) {\n\t  this.throwIfDisposed();\n\t  return mirrorPad(this, paddings, mode);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * @deprecated strict variants of ops have been deprecated\n\t */\n\n\tTensor.prototype.modStrict = function (x) {\n\t  this.throwIfDisposed();\n\t  return modStrict(this, x);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.mod = function (b) {\n\t  this.throwIfDisposed();\n\t  return mod(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * @deprecated strict variants of ops have been deprecated\n\t */\n\n\tTensor.prototype.mulStrict = function (x) {\n\t  this.throwIfDisposed();\n\t  return mulStrict(this, x);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.mul = function (b) {\n\t  this.throwIfDisposed();\n\t  return mul(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.neg = function () {\n\t  this.throwIfDisposed();\n\t  return neg(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.norm = function (ord, axis, keepDims) {\n\t  this.throwIfDisposed();\n\t  return norm(this, ord, axis, keepDims);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * @deprecated strict variants of ops have been deprecated\n\t */\n\n\tTensor.prototype.notEqualStrict = function (x) {\n\t  this.throwIfDisposed();\n\t  return notEqualStrict(this, x);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.notEqual = function (b) {\n\t  this.throwIfDisposed();\n\t  return notEqual(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.oneHot = function (depth, onValue, offValue) {\n\t  if (onValue === void 0) {\n\t    onValue = 1;\n\t  }\n\n\t  if (offValue === void 0) {\n\t    offValue = 0;\n\t  }\n\n\t  this.throwIfDisposed();\n\t  return oneHot(this, depth, onValue, offValue);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.onesLike = function () {\n\t  this.throwIfDisposed();\n\t  return onesLike(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.pad = function (paddings, constantValue) {\n\t  this.throwIfDisposed();\n\t  return pad(this, paddings, constantValue);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.pool = function (windowShape, poolingType, padding, dilationRate, strides) {\n\t  this.throwIfDisposed();\n\t  return pool(this, windowShape, poolingType, padding, dilationRate, strides);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * @deprecated strict variants of ops have been deprecated\n\t */\n\n\tTensor.prototype.powStrict = function (exp) {\n\t  this.throwIfDisposed();\n\t  return powStrict(this, exp);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.pow = function (exp) {\n\t  this.throwIfDisposed();\n\t  return pow$5(this, exp);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.prelu = function (alpha) {\n\t  this.throwIfDisposed();\n\t  return prelu(this, alpha);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.prod = function (axis, keepDims) {\n\t  this.throwIfDisposed();\n\t  return prod(this, axis, keepDims);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.reciprocal = function () {\n\t  this.throwIfDisposed();\n\t  return reciprocal(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.relu = function () {\n\t  this.throwIfDisposed();\n\t  return relu(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.relu6 = function () {\n\t  this.throwIfDisposed();\n\t  return relu6(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Reshapes the tensor into the shape of the provided tensor.\n\t *\n\t * @param x The tensor of required shape.\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t */\n\n\tTensor.prototype.reshapeAs = function (x) {\n\t  this.throwIfDisposed();\n\t  return reshape(this, x.shape);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.reshape = function (shape) {\n\t  this.throwIfDisposed();\n\t  return reshape(this, shape);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.resizeBilinear = function (newShape2D, alignCorners, halfPixelCenters) {\n\t  this.throwIfDisposed();\n\t  return resizeBilinear(this, newShape2D, alignCorners, halfPixelCenters);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.resizeNearestNeighbor = function (newShape2D, alignCorners, halfFloatCenters) {\n\t  this.throwIfDisposed();\n\t  return resizeNearestNeighbor(this, newShape2D, alignCorners, halfFloatCenters);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.reverse = function (axis) {\n\t  this.throwIfDisposed();\n\t  return reverse(this, axis);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.rfft = function () {\n\t  this.throwIfDisposed();\n\t  return rfft(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.round = function () {\n\t  this.throwIfDisposed();\n\t  return round$1(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.rsqrt = function () {\n\t  this.throwIfDisposed();\n\t  return rsqrt(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.selu = function () {\n\t  this.throwIfDisposed();\n\t  return selu(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.separableConv2d = function (depthwiseFilter, pointwiseFilter, strides, pad, dilation, dataFormat) {\n\t  this.throwIfDisposed();\n\t  return separableConv2d(this, depthwiseFilter, pointwiseFilter, strides, pad, dilation, dataFormat);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.sigmoid = function () {\n\t  this.throwIfDisposed();\n\t  return sigmoid(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.sign = function () {\n\t  this.throwIfDisposed();\n\t  return sign(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.sin = function () {\n\t  this.throwIfDisposed();\n\t  return sin(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.sinh = function () {\n\t  this.throwIfDisposed();\n\t  return sinh(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.slice = function (begin, size) {\n\t  this.throwIfDisposed();\n\t  return slice$2(this, begin, size);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.softmax = function (dim) {\n\t  this.throwIfDisposed();\n\t  return softmax(this, dim);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.softplus = function () {\n\t  this.throwIfDisposed();\n\t  return softplus(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.spaceToBatchND = function (blockShape, paddings) {\n\t  this.throwIfDisposed();\n\t  return spaceToBatchND(this, blockShape, paddings);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.split = function (numOrSizeSplits, axis) {\n\t  this.throwIfDisposed();\n\t  return split$1(this, numOrSizeSplits, axis);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.sqrt = function () {\n\t  this.throwIfDisposed();\n\t  return sqrt$3(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.square = function () {\n\t  this.throwIfDisposed();\n\t  return square(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.squaredDifference = function (b) {\n\t  this.throwIfDisposed();\n\t  return squaredDifference(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * @deprecated strict variants of ops have been deprecated\n\t */\n\n\tTensor.prototype.squaredDifferenceStrict = function (x) {\n\t  this.throwIfDisposed();\n\t  return squaredDifferenceStrict(this, x);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.squeeze = function (axis) {\n\t  this.throwIfDisposed();\n\t  return squeeze(this, axis);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.stack = function (x, axis) {\n\t  this.throwIfDisposed();\n\t  var tensorsToBeStacked = x instanceof Tensor ? [this, x] : [this].concat(x);\n\t  return stack(tensorsToBeStacked, axis);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.step = function (alpha) {\n\t  this.throwIfDisposed();\n\t  return step(this, alpha);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.stridedSlice = function (begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask) {\n\t  this.throwIfDisposed();\n\t  return stridedSlice(this, begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * @deprecated strict variants of ops have been deprecated\n\t */\n\n\tTensor.prototype.subStrict = function (x) {\n\t  this.throwIfDisposed();\n\t  return subStrict(this, x);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.sub = function (b) {\n\t  this.throwIfDisposed();\n\t  return sub(this, b);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.sum = function (axis, keepDims) {\n\t  this.throwIfDisposed();\n\t  return sum$1(this, axis, keepDims);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.tan = function () {\n\t  this.throwIfDisposed();\n\t  return tan(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.tanh = function () {\n\t  this.throwIfDisposed();\n\t  return tanh$1(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.tile = function (reps) {\n\t  this.throwIfDisposed();\n\t  return tile(this, reps);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/** Casts the array to type `bool`\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t */\n\n\tTensor.prototype.toBool = function () {\n\t  this.throwIfDisposed();\n\t  return cast(this, 'bool');\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/** Casts the array to type `float32`\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t */\n\n\tTensor.prototype.toFloat = function () {\n\t  this.throwIfDisposed();\n\t  return cast(this, 'float32');\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/** Casts the array to type `int32`\n\t *\n\t * @doc {heading: 'Tensors', subheading: 'Classes'}\n\t */\n\n\tTensor.prototype.toInt = function () {\n\t  this.throwIfDisposed();\n\t  return cast(this, 'int32');\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.topk = function (k, sorted) {\n\t  this.throwIfDisposed();\n\t  return topk(this, k, sorted);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.transpose = function (perm) {\n\t  this.throwIfDisposed();\n\t  return transpose(this, perm);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.unique = function (axis) {\n\t  this.throwIfDisposed();\n\t  return unique(this, axis);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.unsortedSegmentSum = function (segmentIds, numSegments) {\n\t  this.throwIfDisposed();\n\t  return unsortedSegmentSum(this, segmentIds, numSegments);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.unstack = function (axis) {\n\t  this.throwIfDisposed();\n\t  return unstack(this, axis);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.where = function (condition, x) {\n\t  this.throwIfDisposed();\n\t  return where(condition, this, x);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tTensor.prototype.zerosLike = function () {\n\t  this.throwIfDisposed();\n\t  return zerosLike(this);\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\n\tvar _epsilon;\n\t/**\n\t * Returns the value of the fuzz factor used in numeric expressions.\n\t */\n\n\n\tfunction epsilon() {\n\t  if (_epsilon == null) {\n\t    _epsilon = backend().epsilon();\n\t  }\n\n\t  return _epsilon;\n\t}\n\t/**\n\t * Sets the value of the fuzz factor used in numeric expressions.\n\t * @param e New value of epsilon.\n\t */\n\n\tfunction setEpsilon(e) {\n\t  _epsilon = e;\n\t}\n\t/**\n\t * Returns the default image data format convention.\n\t */\n\n\tfunction imageDataFormat() {\n\t  return 'channelsLast';\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\n\t/**\n\t * Explicit error types.\n\t *\n\t * See the following link for more information about why the code includes\n\t * calls to setPrototypeOf:\n\t *\n\t * https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\n\t */\n\t// tslint:enable\n\n\t/**\n\t * Equivalent of Python's AttributeError.\n\t */\n\tvar AttributeError = /*#__PURE__*/function (_Error) {\n\t  _inheritsLoose(AttributeError, _Error);\n\n\t  function AttributeError(message) {\n\t    var _this;\n\n\t    _this = _Error.call(this, message) || this; // Set the prototype explicitly.\n\n\t    Object.setPrototypeOf(_assertThisInitialized(_this), AttributeError.prototype);\n\t    return _this;\n\t  }\n\n\t  return AttributeError;\n\t}( /*#__PURE__*/_wrapNativeSuper(Error));\n\t/**\n\t * Equivalent of Python's RuntimeError.\n\t */\n\n\tvar RuntimeError = /*#__PURE__*/function (_Error2) {\n\t  _inheritsLoose(RuntimeError, _Error2);\n\n\t  function RuntimeError(message) {\n\t    var _this2;\n\n\t    _this2 = _Error2.call(this, message) || this; // Set the prototype explicitly.\n\n\t    Object.setPrototypeOf(_assertThisInitialized(_this2), RuntimeError.prototype);\n\t    return _this2;\n\t  }\n\n\t  return RuntimeError;\n\t}( /*#__PURE__*/_wrapNativeSuper(Error));\n\t/**\n\t * Equivalent of Python's ValueError.\n\t */\n\n\tvar ValueError = /*#__PURE__*/function (_Error3) {\n\t  _inheritsLoose(ValueError, _Error3);\n\n\t  function ValueError(message) {\n\t    var _this3;\n\n\t    _this3 = _Error3.call(this, message) || this; // Set the prototype explicitly.\n\n\t    Object.setPrototypeOf(_assertThisInitialized(_this3), ValueError.prototype);\n\t    return _this3;\n\t  }\n\n\t  return ValueError;\n\t}( /*#__PURE__*/_wrapNativeSuper(Error));\n\t/**\n\t * Equivalent of Python's NotImplementedError.\n\t */\n\n\tvar NotImplementedError = /*#__PURE__*/function (_Error4) {\n\t  _inheritsLoose(NotImplementedError, _Error4);\n\n\t  function NotImplementedError(message) {\n\t    var _this4;\n\n\t    _this4 = _Error4.call(this, message) || this; // Set the prototype explicitly.\n\n\t    Object.setPrototypeOf(_assertThisInitialized(_this4), NotImplementedError.prototype);\n\t    return _this4;\n\t  }\n\n\t  return NotImplementedError;\n\t}( /*#__PURE__*/_wrapNativeSuper(Error));\n\t/**\n\t * Equivalent of Python's AssertionError.\n\t */\n\n\tvar AssertionError = /*#__PURE__*/function (_Error5) {\n\t  _inheritsLoose(AssertionError, _Error5);\n\n\t  function AssertionError(message) {\n\t    var _this5;\n\n\t    _this5 = _Error5.call(this, message) || this; // Set the prototype explicitly.\n\n\t    Object.setPrototypeOf(_assertThisInitialized(_this5), AssertionError.prototype);\n\t    return _this5;\n\t  }\n\n\t  return AssertionError;\n\t}( /*#__PURE__*/_wrapNativeSuper(Error));\n\t/**\n\t * Equivalent of Python's IndexError.\n\t */\n\n\tvar IndexError = /*#__PURE__*/function (_Error6) {\n\t  _inheritsLoose(IndexError, _Error6);\n\n\t  function IndexError(message) {\n\t    var _this6;\n\n\t    _this6 = _Error6.call(this, message) || this; // Set the prototype explicitly.\n\n\t    Object.setPrototypeOf(_assertThisInitialized(_this6), IndexError.prototype);\n\t    return _this6;\n\t  }\n\n\t  return IndexError;\n\t}( /*#__PURE__*/_wrapNativeSuper(Error));\n\n\t/**\n\t * If `value` is an Array, equivalent to Python's `value * numValues`.\n\t * If `value` is not an Array, equivalent to Python's `[value] * numValues`\n\t */\n\t// tslint:disable-next-line:no-any\n\n\tfunction pyListRepeat(value, numValues) {\n\t  if (Array.isArray(value)) {\n\t    // tslint:disable-next-line:no-any\n\t    var newArray = [];\n\n\t    for (var i = 0; i < numValues; i++) {\n\t      newArray = newArray.concat(value);\n\t    }\n\n\t    return newArray;\n\t  } else {\n\t    var _newArray = new Array(numValues);\n\n\t    _newArray.fill(value);\n\n\t    return _newArray;\n\t  }\n\t}\n\tfunction assert$1(val, message) {\n\t  if (!val) {\n\t    throw new AssertionError(message);\n\t  }\n\t}\n\t/**\n\t * Count the number of elements of the `array` that are equal to `reference`.\n\t */\n\n\tfunction count(array, refernce) {\n\t  var counter = 0;\n\n\t  for (var _iterator = _createForOfIteratorHelperLoose(array), _step; !(_step = _iterator()).done;) {\n\t    var item = _step.value;\n\n\t    if (item === refernce) {\n\t      counter++;\n\t    }\n\t  }\n\n\t  return counter;\n\t}\n\t/**\n\t * If an array is of length 1, just return the first element. Otherwise, return\n\t * the full array.\n\t * @param tensors\n\t */\n\n\tfunction singletonOrArray(xs) {\n\t  if (xs.length === 1) {\n\t    return xs[0];\n\t  }\n\n\t  return xs;\n\t}\n\t/**\n\t * Normalizes a list/tensor into a list.\n\t *\n\t * If a tensor is passed, we return\n\t * a list of size 1 containing the tensor.\n\t *\n\t * @param x target object to be normalized.\n\t */\n\t// tslint:disable-next-line:no-any\n\n\tfunction toList(x) {\n\t  if (Array.isArray(x)) {\n\t    return x;\n\t  }\n\n\t  return [x];\n\t}\n\t/**\n\t * Generate a UID for a list\n\t */\n\t// tslint:disable-next-line:no-any\n\n\tfunction objectListUid(objs) {\n\t  var objectList = toList(objs);\n\t  var retVal = '';\n\n\t  for (var _iterator2 = _createForOfIteratorHelperLoose(objectList), _step2; !(_step2 = _iterator2()).done;) {\n\t    var obj = _step2.value;\n\n\t    if (obj.id == null) {\n\t      throw new ValueError(\"Object \" + obj + \" passed to objectListUid without an id\");\n\t    }\n\n\t    if (retVal !== '') {\n\t      retVal = retVal + ', ';\n\t    }\n\n\t    retVal = \"\" + retVal + Math.abs(obj.id);\n\t  }\n\n\t  return retVal;\n\t}\n\t/**\n\t * Converts string to snake-case.\n\t * @param name\n\t */\n\n\tfunction toSnakeCase(name) {\n\t  var intermediate = name.replace(/(.)([A-Z][a-z0-9]+)/g, '$1_$2');\n\t  var insecure = intermediate.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();\n\t  /*\n\t   If the class is private the name starts with \"_\" which is not secure\n\t   for creating scopes. We prefix the name with \"private\" in this case.\n\t   */\n\n\t  if (insecure[0] !== '_') {\n\t    return insecure;\n\t  }\n\n\t  return 'private' + insecure;\n\t}\n\tfunction toCamelCase(identifier) {\n\t  // quick return for empty string or single character strings\n\t  if (identifier.length <= 1) {\n\t    return identifier;\n\t  } // Check for the underscore indicating snake_case\n\n\n\t  if (identifier.indexOf('_') === -1) {\n\t    return identifier;\n\t  }\n\n\t  return identifier.replace(/[_]+(\\w|$)/g, function (m, p1) {\n\t    return p1.toUpperCase();\n\t  });\n\t} // tslint:disable-next-line:no-any\n\n\tvar _GLOBAL_CUSTOM_OBJECTS = {};\n\tfunction serializeKerasObject(instance) {\n\t  if (instance === null || instance === undefined) {\n\t    return null;\n\t  }\n\n\t  var dict = {};\n\t  dict['className'] = instance.getClassName();\n\t  dict['config'] = instance.getConfig();\n\t  return dict;\n\t}\n\t/**\n\t * Replace ndarray-style scalar objects in serialization objects with numbers.\n\t *\n\t * Background: In some versions of tf.keras, certain scalar values in the HDF5\n\t * model save file can be serialized as: `{'type': 'ndarray', 'value': num}`,\n\t * where in `num` is a plain number. This method converts such serialization\n\t * to a `number`.\n\t *\n\t * @param config The keras-format serialization object to be processed\n\t *   (in place).\n\t */\n\n\tfunction convertNDArrayScalarsInConfig(config) {\n\t  if (config == null || typeof config !== 'object') {\n\t    return;\n\t  } else if (Array.isArray(config)) {\n\t    config.forEach(function (configItem) {\n\t      return convertNDArrayScalarsInConfig(configItem);\n\t    });\n\t  } else {\n\t    var fields = Object.keys(config);\n\n\t    for (var _i = 0, _fields = fields; _i < _fields.length; _i++) {\n\t      var field = _fields[_i];\n\t      var value = config[field];\n\n\t      if (value != null && typeof value === 'object') {\n\t        if (!Array.isArray(value) && value['type'] === 'ndarray' && typeof value['value'] === 'number') {\n\t          config[field] = value['value'];\n\t        } else {\n\t          convertNDArrayScalarsInConfig(value);\n\t        }\n\t      }\n\t    }\n\t  }\n\t}\n\t/**\n\t * Deserialize a saved Keras Object\n\t * @param identifier either a string ID or a saved Keras dictionary\n\t * @param moduleObjects a list of Python class names to object constructors\n\t * @param customObjects a list of Python class names to object constructors\n\t * @param printableModuleName debug text for the object being reconstituted\n\t * @param fastWeightInit Optional flag to use fast weight initialization\n\t *   during deserialization. This is applicable to cases in which\n\t *   the initialization will be immediately overwritten by loaded weight\n\t *   values. Default: `false`.\n\t * @returns a TensorFlow.js Layers object\n\t */\n\t// tslint:disable:no-any\n\n\n\tfunction deserializeKerasObject(identifier, moduleObjects, customObjects, printableModuleName, fastWeightInit) {\n\t  if (moduleObjects === void 0) {\n\t    moduleObjects = {};\n\t  }\n\n\t  if (customObjects === void 0) {\n\t    customObjects = {};\n\t  }\n\n\t  if (printableModuleName === void 0) {\n\t    printableModuleName = 'object';\n\t  }\n\n\t  if (fastWeightInit === void 0) {\n\t    fastWeightInit = false;\n\t  }\n\n\t  // tslint:enable\n\t  if (typeof identifier === 'string') {\n\t    var functionName = identifier;\n\t    var fn;\n\n\t    if (functionName in customObjects) {\n\t      fn = customObjects[functionName];\n\t    } else if (functionName in _GLOBAL_CUSTOM_OBJECTS) {\n\t      fn = _GLOBAL_CUSTOM_OBJECTS[functionName];\n\t    } else {\n\t      fn = moduleObjects[functionName];\n\n\t      if (fn == null) {\n\t        throw new ValueError(\"Unknown \" + printableModuleName + \": \" + identifier + \". \" + \"This may be due to one of the following reasons:\\n\" + (\"1. The \" + printableModuleName + \" is defined in Python, in which \") + \"case it needs to be ported to TensorFlow.js or your JavaScript \" + \"code.\\n\" + (\"2. The custom \" + printableModuleName + \" is defined in JavaScript, \") + \"but is not registered properly with \" + \"tf.serialization.registerClass().\"); // TODO(cais): Add link to tutorial page on custom layers.\n\t      }\n\t    }\n\n\t    return fn;\n\t  } else {\n\t    // In this case we are dealing with a Keras config dictionary.\n\t    var config = identifier;\n\n\t    if (config['className'] == null || config['config'] == null) {\n\t      throw new ValueError(printableModuleName + \": Improper config format: \" + (JSON.stringify(config) + \".\\n\") + \"'className' and 'config' must set.\");\n\t    }\n\n\t    var className = config['className'];\n\t    var cls, fromConfig;\n\n\t    if (className in customObjects) {\n\t      var _customObjects$classN = customObjects[className];\n\t      cls = _customObjects$classN[0];\n\t      fromConfig = _customObjects$classN[1];\n\t    } else if (className in _GLOBAL_CUSTOM_OBJECTS) {\n\t      var _GLOBAL_CUSTOM_OBJECT = _GLOBAL_CUSTOM_OBJECTS['className'];\n\t      cls = _GLOBAL_CUSTOM_OBJECT[0];\n\t      fromConfig = _GLOBAL_CUSTOM_OBJECT[1];\n\t    } else if (className in moduleObjects) {\n\t      var _moduleObjects$classN = moduleObjects[className];\n\t      cls = _moduleObjects$classN[0];\n\t      fromConfig = _moduleObjects$classN[1];\n\t    }\n\n\t    if (cls == null) {\n\t      throw new ValueError(\"Unknown \" + printableModuleName + \": \" + className + \". \" + \"This may be due to one of the following reasons:\\n\" + (\"1. The \" + printableModuleName + \" is defined in Python, in which \") + \"case it needs to be ported to TensorFlow.js or your JavaScript \" + \"code.\\n\" + (\"2. The custom \" + printableModuleName + \" is defined in JavaScript, \") + \"but is not registered properly with \" + \"tf.serialization.registerClass().\"); // TODO(cais): Add link to tutorial page on custom layers.\n\t    }\n\n\t    if (fromConfig != null) {\n\t      // Porting notes: Instead of checking to see whether fromConfig accepts\n\t      // customObjects, we create a customObjects dictionary and tack it on to\n\t      // config['config'] as config['config'].customObjects. Objects can use it,\n\t      // if they want.\n\t      // tslint:disable-next-line:no-any\n\t      var customObjectsCombined = {};\n\n\t      for (var _i2 = 0, _Object$keys = Object.keys(_GLOBAL_CUSTOM_OBJECTS); _i2 < _Object$keys.length; _i2++) {\n\t        var key = _Object$keys[_i2];\n\t        customObjectsCombined[key] = _GLOBAL_CUSTOM_OBJECTS[key];\n\t      }\n\n\t      for (var _i3 = 0, _Object$keys2 = Object.keys(customObjects); _i3 < _Object$keys2.length; _i3++) {\n\t        var _key = _Object$keys2[_i3];\n\t        customObjectsCombined[_key] = customObjects[_key];\n\t      } // Add the customObjects to config\n\n\n\t      var nestedConfig = config['config'];\n\t      nestedConfig['customObjects'] = customObjectsCombined;\n\t      var backupCustomObjects = Object.assign({}, _GLOBAL_CUSTOM_OBJECTS);\n\n\t      for (var _i4 = 0, _Object$keys3 = Object.keys(customObjects); _i4 < _Object$keys3.length; _i4++) {\n\t        var _key2 = _Object$keys3[_i4];\n\t        _GLOBAL_CUSTOM_OBJECTS[_key2] = customObjects[_key2];\n\t      }\n\n\t      convertNDArrayScalarsInConfig(config['config']);\n\t      var returnObj = fromConfig(cls, config['config'], customObjects, fastWeightInit);\n\t      _GLOBAL_CUSTOM_OBJECTS = Object.assign({}, backupCustomObjects);\n\t      return returnObj;\n\t    } else {\n\t      // Then `cls` may be a function returning a class.\n\t      // In this case by convention `config` holds\n\t      // the kwargs of the function.\n\t      var _backupCustomObjects = Object.assign({}, _GLOBAL_CUSTOM_OBJECTS);\n\n\t      for (var _i5 = 0, _Object$keys4 = Object.keys(customObjects); _i5 < _Object$keys4.length; _i5++) {\n\t        var _key3 = _Object$keys4[_i5];\n\t        _GLOBAL_CUSTOM_OBJECTS[_key3] = customObjects[_key3];\n\t      } // In python this is **config['config'], for tfjs-layers we require\n\t      // classes that use this fall-through construction method to take\n\t      // a config interface that mimics the expansion of named parameters.\n\n\n\t      var _returnObj = new cls(config['config']);\n\n\t      _GLOBAL_CUSTOM_OBJECTS = Object.assign({}, _backupCustomObjects);\n\t      return _returnObj;\n\t    }\n\t  }\n\t}\n\t/**\n\t * Compares two numbers for sorting.\n\t * @param a\n\t * @param b\n\t */\n\n\tfunction numberCompare(a, b) {\n\t  return a < b ? -1 : a > b ? 1 : 0;\n\t}\n\t/**\n\t * Comparison of two numbers for reverse sorting.\n\t * @param a\n\t * @param b\n\t */\n\n\tfunction reverseNumberCompare(a, b) {\n\t  return -1 * numberCompare(a, b);\n\t}\n\t/**\n\t * Convert a string into the corresponding DType.\n\t * @param dtype\n\t * @returns An instance of DType.\n\t */\n\n\tfunction stringToDType(dtype) {\n\t  switch (dtype) {\n\t    case 'float32':\n\t      return 'float32';\n\n\t    default:\n\t      throw new ValueError(\"Invalid dtype: \" + dtype);\n\t  }\n\t}\n\t/**\n\t * Test the element-by-element equality of two Arrays of strings.\n\t * @param xs First array of strings.\n\t * @param ys Second array of strings.\n\t * @returns Wether the two arrays are all equal, element by element.\n\t */\n\n\tfunction stringsEqual(xs, ys) {\n\t  if (xs == null || ys == null) {\n\t    return xs === ys;\n\t  }\n\n\t  if (xs.length !== ys.length) {\n\t    return false;\n\t  }\n\n\t  for (var i = 0; i < xs.length; ++i) {\n\t    if (xs[i] !== ys[i]) {\n\t      return false;\n\t    }\n\t  }\n\n\t  return true;\n\t}\n\t/**\n\t * Get the unique elements of an array.\n\t * @param xs Array.\n\t * @returns An Array consisting of the unique elements in `xs`.\n\t */\n\n\tfunction unique$1(xs) {\n\t  if (xs == null) {\n\t    return xs;\n\t  }\n\n\t  var out = []; // TODO(cais): Maybe improve performance by sorting.\n\n\t  for (var _iterator3 = _createForOfIteratorHelperLoose(xs), _step3; !(_step3 = _iterator3()).done;) {\n\t    var x = _step3.value;\n\n\t    if (out.indexOf(x) === -1) {\n\t      out.push(x);\n\t    }\n\t  }\n\n\t  return out;\n\t}\n\t/**\n\t * Determine if an Object is empty (i.e., does not have own properties).\n\t * @param obj Object\n\t * @returns Whether the Object is empty.\n\t * @throws ValueError: If object is `null` or `undefined`.\n\t */\n\n\tfunction isObjectEmpty(obj) {\n\t  if (obj == null) {\n\t    throw new ValueError(\"Invalid value in obj: \" + JSON.stringify(obj));\n\t  }\n\n\t  for (var key in obj) {\n\t    if (obj.hasOwnProperty(key)) {\n\t      return false;\n\t    }\n\t  }\n\n\t  return true;\n\t}\n\t/**\n\t * Helper function used to build type union/enum run-time checkers.\n\t * @param values The list of allowed values.\n\t * @param label A string name for the type\n\t * @param value The value to test.\n\t * @throws ValueError: If the value is not in values nor `undefined`/`null`.\n\t */\n\n\tfunction checkStringTypeUnionValue(values, label, value) {\n\t  if (value == null) {\n\t    return;\n\t  }\n\n\t  if (values.indexOf(value) < 0) {\n\t    throw new ValueError(value + \" is not a valid \" + label + \".  Valid values are \" + values + \" or null/undefined.\");\n\t  }\n\t}\n\t/**\n\t * Helper function for verifying the types of inputs.\n\t *\n\t * Ensures that the elements of `x` are all of type `expectedType`.\n\t * Also verifies that the length of `x` is within bounds.\n\t *\n\t * @param x Object to test.\n\t * @param expectedType The string expected type of all of the elements in the\n\t * Array.\n\t * @param minLength Return false if x.length is less than this.\n\t * @param maxLength Return false if x.length is greater than this.\n\t * @returns true if and only if `x` is an `Array<expectedType>` with\n\t * length >= `minLength` and <= `maxLength`.\n\t */\n\t// tslint:disable:no-any\n\n\tfunction checkArrayTypeAndLength(x, expectedType, minLength, maxLength) {\n\t  if (minLength === void 0) {\n\t    minLength = 0;\n\t  }\n\n\t  if (maxLength === void 0) {\n\t    maxLength = Infinity;\n\t  }\n\n\t  assert$1(minLength >= 0);\n\t  assert$1(maxLength >= minLength);\n\t  return Array.isArray(x) && x.length >= minLength && x.length <= maxLength && x.every(function (e) {\n\t    return typeof e === expectedType;\n\t  });\n\t} // tslint:enable:no-any\n\n\t/**\n\t * Assert that a value or an array of value are positive integer.\n\t *\n\t * @param value The value being asserted on. May be a single number or an array\n\t *   of numbers.\n\t * @param name Name of the value, used to make the error message.\n\t */\n\n\tfunction assertPositiveInteger(value, name) {\n\t  if (Array.isArray(value)) {\n\t    assert(value.length > 0, function () {\n\t      return name + \" is unexpectedly an empty array.\";\n\t    });\n\t    value.forEach(function (v, i) {\n\t      return assertPositiveInteger(v, \"element \" + (i + 1) + \" of \" + name);\n\t    });\n\t  } else {\n\t    assert(Number.isInteger(value) && value > 0, function () {\n\t      return \"Expected \" + name + \" to be a positive integer, but got \" + (formatAsFriendlyString(value) + \".\");\n\t    });\n\t  }\n\t}\n\t/**\n\t * Format a value into a display-friendly, human-readable fashion.\n\t *\n\t * - `null` is formatted as `'null'`\n\t * - Strings are formated with flanking pair of quotes.\n\t * - Arrays are formatted with flanking pair of square brackets.\n\t *\n\t * @param value The value to display.\n\t * @return Formatted string.\n\t */\n\t// tslint:disable-next-line:no-any\n\n\tfunction formatAsFriendlyString(value) {\n\t  if (value === null) {\n\t    return 'null';\n\t  } else if (Array.isArray(value)) {\n\t    return '[' + value.map(function (v) {\n\t      return formatAsFriendlyString(v);\n\t    }).join(',') + ']';\n\t  } else if (typeof value === 'string') {\n\t    return \"\\\"\" + value + \"\\\"\";\n\t  } else {\n\t    return \"\" + value;\n\t  }\n\t}\n\t/**\n\t * Returns a function `f2` (decorator) which wraps the original function\n\t * `f`. `f2` guarantees that `f` can be called at most once\n\t * every `waitMs` ms. If `f2` is called more often, it will return\n\t * the last returned result of `f`.\n\t *\n\t * @param f The original function `f` to wrap.\n\t * @param waitMs The time between two consecutive calls to `f` in ms.\n\t */\n\n\tfunction debounce(f, waitMs) {\n\t  var lastTime = now();\n\t  var lastResult;\n\n\t  var f2 = function f2() {\n\t    var now$1 = now();\n\n\t    if (now$1 - lastTime < waitMs) {\n\t      return lastResult;\n\t    }\n\n\t    lastTime = now$1;\n\t    lastResult = f.apply(void 0, arguments);\n\t    return lastResult;\n\t  };\n\n\t  return f2;\n\t}\n\t/**\n\t * Returns the fusable activation given a layers identifier.\n\t *\n\t * @param activationName The layers identifier string.\n\t * @return The name of the fusable activation.\n\t */\n\n\tfunction mapActivationToFusedKernel(activationName) {\n\t  if (activationName === 'relu') {\n\t    return 'relu';\n\t  }\n\n\t  if (activationName === 'linear') {\n\t    return 'linear';\n\t  }\n\n\t  if (activationName === 'elu') {\n\t    return 'elu';\n\t  }\n\n\t  return null;\n\t}\n\t/**\n\t * Returns the cartesian product of sets of values.\n\t * This works the same as itertools.product in Python.\n\t *\n\t * Example:\n\t *\n\t * filters = [128, 256, 512]\n\t * paddings = ['same', 'valid']\n\t *\n\t * product = [ [128, 'same'], [128, 'valid'], [256, 'same'], [256, 'valid'],\n\t * [512, 'same'], [512, 'valid']]\n\t *\n\t * @param arrayOfValues List/array of values.\n\t * @return The cartesian product.\n\t */\n\n\tfunction getCartesianProductOfValues() {\n\t  for (var _len = arguments.length, arrayOfValues = new Array(_len), _key4 = 0; _key4 < _len; _key4++) {\n\t    arrayOfValues[_key4] = arguments[_key4];\n\t  }\n\n\t  assert$1(arrayOfValues.length > 0, 'arrayOfValues is empty');\n\n\t  for (var _i6 = 0, _arrayOfValues = arrayOfValues; _i6 < _arrayOfValues.length; _i6++) {\n\t    var values = _arrayOfValues[_i6];\n\t    assert$1(Array.isArray(values), 'one of the values is not an array');\n\t    assert$1(values.length > 0, 'one of the values is empty');\n\t  }\n\n\t  return arrayOfValues.reduce(function (products, values) {\n\t    if (products.length === 0) {\n\t      return values.map(function (value) {\n\t        return [value];\n\t      });\n\t    }\n\n\t    return values.map(function (value) {\n\t      return products.map(function (prevValue) {\n\t        return [].concat(prevValue, [value]);\n\t      });\n\t    }).reduce(function (flattenedProduct, unflattenedProduct) {\n\t      return flattenedProduct.concat(unflattenedProduct);\n\t    }, []);\n\t  }, []);\n\t}\n\n\t/**\n\t * Helper function used by many of the Constraints to find the L2Norms.\n\t */\n\n\tfunction calcL2Norms(w, axis) {\n\t  return tidy(function () {\n\t    return sqrt$3(sum$1(mul(w, w), axis, true));\n\t  });\n\t}\n\t/**\n\t * Base class for functions that impose constraints on weight values\n\t *\n\t * @doc {\n\t *   heading: 'Constraints',\n\t *   subheading: 'Classes',\n\t *   namespace: 'constraints'\n\t * }\n\t */\n\n\n\tvar Constraint = /*#__PURE__*/function (_serialization$Serial) {\n\t  _inheritsLoose(Constraint, _serialization$Serial);\n\n\t  function Constraint() {\n\t    return _serialization$Serial.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto = Constraint.prototype;\n\n\t  _proto.getConfig = function getConfig() {\n\t    return {};\n\t  };\n\n\t  return Constraint;\n\t}(Serializable);\n\tvar MaxNorm = /*#__PURE__*/function (_Constraint) {\n\t  _inheritsLoose(MaxNorm, _Constraint);\n\n\t  function MaxNorm(args) {\n\t    var _this;\n\n\t    _this = _Constraint.call(this) || this;\n\t    _this.defaultMaxValue = 2;\n\t    _this.defaultAxis = 0;\n\t    _this.maxValue = args.maxValue != null ? args.maxValue : _this.defaultMaxValue;\n\t    _this.axis = args.axis != null ? args.axis : _this.defaultAxis;\n\t    return _this;\n\t  }\n\n\t  var _proto2 = MaxNorm.prototype;\n\n\t  _proto2.apply = function apply(w) {\n\t    var _this2 = this;\n\n\t    return tidy(function () {\n\t      var norms = calcL2Norms(w, _this2.axis);\n\t      var desired = clipByValue(norms, 0, _this2.maxValue);\n\t      return mul(w, div(desired, add$1(epsilon(), norms)));\n\t    });\n\t  };\n\n\t  _proto2.getConfig = function getConfig() {\n\t    return {\n\t      maxValue: this.maxValue,\n\t      axis: this.axis\n\t    };\n\t  };\n\n\t  return MaxNorm;\n\t}(Constraint);\n\t/** @nocollapse */\n\n\tMaxNorm.className = 'MaxNorm';\n\tregisterClass(MaxNorm);\n\tvar UnitNorm = /*#__PURE__*/function (_Constraint2) {\n\t  _inheritsLoose(UnitNorm, _Constraint2);\n\n\t  function UnitNorm(args) {\n\t    var _this3;\n\n\t    _this3 = _Constraint2.call(this) || this;\n\t    _this3.defaultAxis = 0;\n\t    _this3.axis = args.axis != null ? args.axis : _this3.defaultAxis;\n\t    return _this3;\n\t  }\n\n\t  var _proto3 = UnitNorm.prototype;\n\n\t  _proto3.apply = function apply(w) {\n\t    var _this4 = this;\n\n\t    return tidy(function () {\n\t      return div(w, add$1(epsilon(), calcL2Norms(w, _this4.axis)));\n\t    });\n\t  };\n\n\t  _proto3.getConfig = function getConfig() {\n\t    return {\n\t      axis: this.axis\n\t    };\n\t  };\n\n\t  return UnitNorm;\n\t}(Constraint);\n\t/** @nocollapse */\n\n\tUnitNorm.className = 'UnitNorm';\n\tregisterClass(UnitNorm);\n\tvar NonNeg = /*#__PURE__*/function (_Constraint3) {\n\t  _inheritsLoose(NonNeg, _Constraint3);\n\n\t  function NonNeg() {\n\t    return _Constraint3.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto4 = NonNeg.prototype;\n\n\t  _proto4.apply = function apply(w) {\n\t    return relu(w);\n\t  };\n\n\t  return NonNeg;\n\t}(Constraint);\n\t/** @nocollapse */\n\n\tNonNeg.className = 'NonNeg';\n\tregisterClass(NonNeg);\n\tvar MinMaxNorm = /*#__PURE__*/function (_Constraint4) {\n\t  _inheritsLoose(MinMaxNorm, _Constraint4);\n\n\t  function MinMaxNorm(args) {\n\t    var _this5;\n\n\t    _this5 = _Constraint4.call(this) || this;\n\t    _this5.defaultMinValue = 0.0;\n\t    _this5.defaultMaxValue = 1.0;\n\t    _this5.defaultRate = 1.0;\n\t    _this5.defaultAxis = 0;\n\t    _this5.minValue = args.minValue != null ? args.minValue : _this5.defaultMinValue;\n\t    _this5.maxValue = args.maxValue != null ? args.maxValue : _this5.defaultMaxValue;\n\t    _this5.rate = args.rate != null ? args.rate : _this5.defaultRate;\n\t    _this5.axis = args.axis != null ? args.axis : _this5.defaultAxis;\n\t    return _this5;\n\t  }\n\n\t  var _proto5 = MinMaxNorm.prototype;\n\n\t  _proto5.apply = function apply(w) {\n\t    var _this6 = this;\n\n\t    return tidy(function () {\n\t      var norms = calcL2Norms(w, _this6.axis);\n\t      var desired = add$1(mul(_this6.rate, clipByValue(norms, _this6.minValue, _this6.maxValue)), mul(1.0 - _this6.rate, norms));\n\t      return mul(w, div(desired, add$1(epsilon(), norms)));\n\t    });\n\t  };\n\n\t  _proto5.getConfig = function getConfig() {\n\t    return {\n\t      minValue: this.minValue,\n\t      maxValue: this.maxValue,\n\t      rate: this.rate,\n\t      axis: this.axis\n\t    };\n\t  };\n\n\t  return MinMaxNorm;\n\t}(Constraint);\n\t/** @nocollapse */\n\n\tMinMaxNorm.className = 'MinMaxNorm';\n\tregisterClass(MinMaxNorm); // Maps the JavaScript-like identifier keys to the corresponding registry\n\t// symbols.\n\n\tvar CONSTRAINT_IDENTIFIER_REGISTRY_SYMBOL_MAP = {\n\t  'maxNorm': 'MaxNorm',\n\t  'minMaxNorm': 'MinMaxNorm',\n\t  'nonNeg': 'NonNeg',\n\t  'unitNorm': 'UnitNorm'\n\t};\n\tfunction serializeConstraint(constraint) {\n\t  return serializeKerasObject(constraint);\n\t}\n\tfunction deserializeConstraint(config, customObjects) {\n\t  if (customObjects === void 0) {\n\t    customObjects = {};\n\t  }\n\n\t  return deserializeKerasObject(config, SerializationMap.getMap().classNameMap, customObjects, 'constraint');\n\t}\n\tfunction getConstraint(identifier) {\n\t  if (identifier == null) {\n\t    return null;\n\t  }\n\n\t  if (typeof identifier === 'string') {\n\t    var className = identifier in CONSTRAINT_IDENTIFIER_REGISTRY_SYMBOL_MAP ? CONSTRAINT_IDENTIFIER_REGISTRY_SYMBOL_MAP[identifier] : identifier;\n\t    var config = {\n\t      className: className,\n\t      config: {}\n\t    };\n\t    return deserializeConstraint(config);\n\t  } else if (identifier instanceof Constraint) {\n\t    return identifier;\n\t  } else {\n\t    return deserializeConstraint(identifier);\n\t  }\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\t/**\n\t * MaxNorm weight constraint.\n\t *\n\t * Constrains the weights incident to each hidden unit\n\t * to have a norm less than or equal to a desired value.\n\t *\n\t * References\n\t *       - [Dropout: A Simple Way to Prevent Neural Networks from Overfitting\n\t * Srivastava, Hinton, et al.\n\t * 2014](http://www.cs.toronto.edu/~rsalakhu/papers/srivastava14a.pdf)\n\t *\n\t * @doc {heading: 'Constraints',namespace: 'constraints'}\n\t */\n\n\tfunction maxNorm(args) {\n\t  return new MaxNorm(args);\n\t}\n\t/**\n\t * Constrains the weights incident to each hidden unit to have unit norm.\n\t *\n\t * @doc {heading: 'Constraints', namespace: 'constraints'}\n\t */\n\n\tfunction unitNorm(args) {\n\t  return new UnitNorm(args);\n\t}\n\t/**\n\t * Constains the weight to be non-negative.\n\t *\n\t * @doc {heading: 'Constraints', namespace: 'constraints'}\n\t */\n\n\tfunction nonNeg() {\n\t  return new NonNeg();\n\t}\n\t/** @doc {heading: 'Constraints', namespace: 'constraints'} */\n\n\tfunction minMaxNorm(config) {\n\t  return new MinMaxNorm(config);\n\t}\n\n\tvar exports_constraints = {\n\t\t__proto__: null,\n\t\tmaxNorm: maxNorm,\n\t\tunitNorm: unitNorm,\n\t\tnonNeg: nonNeg,\n\t\tminMaxNorm: minMaxNorm\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\tvar VALID_DATA_FORMAT_VALUES = ['channelsFirst', 'channelsLast'];\n\tvar VALID_INTERPOLATION_FORMAT_VALUES = ['nearest', 'bilinear'];\n\tvar VALID_PADDING_MODE_VALUES = ['valid', 'same', 'causal'];\n\tvar VALID_POOL_MODE_VALUES = ['max', 'avg'];\n\tvar VALID_BIDIRECTIONAL_MERGE_MODES = ['sum', 'mul', 'concat', 'ave'];\n\tvar VALID_SAMPLE_WEIGHT_MODES = ['temporal'];\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\t// wanting that name so far.  This allows enforcing name uniqueness by appending\n\t// an incrementing index, e.g. scope/name, scope/name_1, scope/name_2, etc.\n\n\tvar nameMap = new Map();\n\tfunction checkDataFormat(value) {\n\t  checkStringTypeUnionValue(VALID_DATA_FORMAT_VALUES, 'DataFormat', value);\n\t}\n\tfunction checkInterpolationFormat(value) {\n\t  checkStringTypeUnionValue(VALID_INTERPOLATION_FORMAT_VALUES, 'InterpolationFormat', value);\n\t}\n\tfunction checkPaddingMode(value) {\n\t  checkStringTypeUnionValue(VALID_PADDING_MODE_VALUES, 'PaddingMode', value);\n\t}\n\tfunction checkPoolMode(value) {\n\t  checkStringTypeUnionValue(VALID_POOL_MODE_VALUES, 'PoolMode', value);\n\t}\n\tvar _nameScopeStack = [];\n\tvar _nameScopeDivider = '/';\n\t/**\n\t * Enter namescope, which can be nested.\n\t */\n\n\tfunction nameScope(name, fn) {\n\t  _nameScopeStack.push(name);\n\n\t  try {\n\t    var val = fn();\n\n\t    _nameScopeStack.pop();\n\n\t    return val;\n\t  } catch (e) {\n\t    _nameScopeStack.pop();\n\n\t    throw e;\n\t  }\n\t}\n\t/**\n\t * Get the current namescope as a flat, concatenated string.\n\t */\n\n\tfunction currentNameScopePrefix() {\n\t  if (_nameScopeStack.length === 0) {\n\t    return '';\n\t  } else {\n\t    return _nameScopeStack.join(_nameScopeDivider) + _nameScopeDivider;\n\t  }\n\t}\n\t/**\n\t * Get the name a Tensor (or Variable) would have if not uniqueified.\n\t * @param tensorName\n\t * @return Scoped name string.\n\t */\n\n\n\tfunction getScopedTensorName(tensorName) {\n\t  if (!isValidTensorName(tensorName)) {\n\t    throw new Error('Not a valid tensor name: \\'' + tensorName + '\\'');\n\t  }\n\n\t  return currentNameScopePrefix() + tensorName;\n\t}\n\t/**\n\t * Get unique names for Tensors and Variables.\n\t * @param scopedName The fully-qualified name of the Tensor, i.e. as produced by\n\t *  `getScopedTensorName()`.\n\t * @return A unique version of the given fully scoped name.\n\t *   If this is the first time that the scoped name is seen in this session,\n\t *   then the given `scopedName` is returned unaltered.  If the same name is\n\t *   seen again (producing a collision), an incrementing suffix is added to the\n\t *   end of the name, so it takes the form 'scope/name_1', 'scope/name_2', etc.\n\t */\n\n\tfunction getUniqueTensorName(scopedName) {\n\t  if (!isValidTensorName(scopedName)) {\n\t    throw new Error('Not a valid tensor name: \\'' + scopedName + '\\'');\n\t  }\n\n\t  if (!nameMap.has(scopedName)) {\n\t    nameMap.set(scopedName, 0);\n\t  }\n\n\t  var index = nameMap.get(scopedName);\n\t  nameMap.set(scopedName, nameMap.get(scopedName) + 1);\n\n\t  if (index > 0) {\n\t    var result = scopedName + \"_\" + index; // Mark the composed name as used in case someone wants\n\t    // to call getUniqueTensorName(\"name_1\").\n\n\t    nameMap.set(result, 1);\n\t    return result;\n\t  } else {\n\t    return scopedName;\n\t  }\n\t}\n\tvar tensorNameRegex = new RegExp(/^[A-Za-z0-9][-A-Za-z0-9\\._\\/]*$/);\n\t/**\n\t * Determine whether a string is a valid tensor name.\n\t * @param name\n\t * @returns A Boolean indicating whether `name` is a valid tensor name.\n\t */\n\n\tfunction isValidTensorName(name) {\n\t  return !!name.match(tensorNameRegex);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\t/**\n\t * Determine if a number is an integer.\n\t */\n\n\tfunction isInteger$1(x) {\n\t  return x === parseInt(x.toString(), 10);\n\t}\n\t/**\n\t * Calculate the product of an array of numbers.\n\t * @param array The array to calculate the product over.\n\t * @param begin Beginning index, inclusive.\n\t * @param end Ending index, exclusive.\n\t * @return The product.\n\t */\n\n\tfunction arrayProd(array, begin, end) {\n\t  if (begin == null) {\n\t    begin = 0;\n\t  }\n\n\t  if (end == null) {\n\t    end = array.length;\n\t  }\n\n\t  var prod = 1;\n\n\t  for (var i = begin; i < end; ++i) {\n\t    prod *= array[i];\n\t  }\n\n\t  return prod;\n\t}\n\t/**\n\t * A helper function transforms the two input types to an instance of Tensor1D,\n\t * so the return value can be fed directly into various TF.js Core functions.\n\t * @param array\n\t */\n\n\tfunction toArray1D(array) {\n\t  array = Array.isArray(array) ? new Float32Array(array) : array;\n\t  return tensor1d(array);\n\t}\n\t/**\n\t * Compute minimum value.\n\t * @param array\n\t * @return minimum value.\n\t */\n\n\n\tfunction min$a(array) {\n\t  return min$9(toArray1D(array)).dataSync()[0];\n\t}\n\t/**\n\t * Compute maximum value.\n\t * @param array\n\t * @return maximum value\n\t */\n\n\tfunction max$5(array) {\n\t  return max$4(toArray1D(array)).dataSync()[0];\n\t}\n\t/**\n\t * Compute sum of array.\n\t * @param array\n\t * @return The sum.\n\t */\n\n\tfunction sum$2(array) {\n\t  return sum$1(toArray1D(array)).dataSync()[0];\n\t}\n\t/**\n\t * Compute mean of array.\n\t * @param array\n\t * @return The mean.\n\t */\n\n\tfunction mean$2(array) {\n\t  return sum$2(array) / array.length;\n\t}\n\t/**\n\t * Compute variance of array.\n\t * @param array\n\t * @return The variance.\n\t */\n\n\tfunction variance(array) {\n\t  var demeaned = sub(toArray1D(array), scalar(mean$2(array)));\n\t  var sumSquare = sum$1(mul(demeaned, demeaned)).dataSync()[0];\n\t  return sumSquare / array.length;\n\t}\n\t/**\n\t * Compute median of array.\n\t * @param array\n\t * @return The median value.\n\t */\n\n\tfunction median(array) {\n\t  var arraySorted = array.slice().sort(function (a, b) {\n\t    return a - b;\n\t  });\n\t  var lowIdx = Math.floor((arraySorted.length - 1) / 2);\n\t  var highIdx = Math.ceil((arraySorted.length - 1) / 2);\n\n\t  if (lowIdx === highIdx) {\n\t    return arraySorted[lowIdx];\n\t  }\n\n\t  return (arraySorted[lowIdx] + arraySorted[highIdx]) / 2;\n\t}\n\t/**\n\t * Generate an array of integers in [begin, end).\n\t * @param begin Beginning integer, inclusive.\n\t * @param end Ending integer, exclusive.\n\t * @returns Range array.\n\t * @throws ValueError, iff `end` < `begin`.\n\t */\n\n\tfunction range$1(begin, end) {\n\t  if (end < begin) {\n\t    throw new ValueError(\"end (\" + end + \") < begin (\" + begin + \") is forbidden.\");\n\t  }\n\n\t  var out = [];\n\n\t  for (var i = begin; i < end; ++i) {\n\t    out.push(i);\n\t  }\n\n\t  return out;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\n\t/* Setting and getting backend from deeplearn.js. */\n\t// Default deeplearn.js backend is WebGL (GPU).\n\n\tvar backend$1 = 'webgl';\n\tfunction setBackend$1(requestedBackend) {\n\t  setBackend(requestedBackend);\n\t  backend$1 = requestedBackend;\n\t}\n\tfunction getBackend$1() {\n\t  return backend$1;\n\t}\n\t/**\n\t * Indicates whether the backend is operating symbolically.\n\t *\n\t * This function will be used to determine how to interpret user code. If\n\t * it returns true, calls to the backend construct a symbolic graph; if\n\t * it returns false, calls to the backend execute immediately.\n\t */\n\n\tfunction isBackendSymbolic() {\n\t  return false;\n\t}\n\t/**\n\t * Get the number of elements in a Tensor.\n\t * @param x The Tensor.\n\t * @return Number of elements in `x`.\n\t */\n\n\tfunction countParams(x) {\n\t  var shape = x.shape;\n\n\t  if (shape.length > 0) {\n\t    return shape.reduce(function (a, b) {\n\t      return a * b;\n\t    });\n\t  } else {\n\t    // Scalar.\n\t    return 1;\n\t  }\n\t}\n\t/**\n\t * Casts a tensor to a different dtype and returns it.\n\t * @param x Input tensor.\n\t * @param dtype String: 'float32'|'int32'|'bool'.\n\t * @returns Tensor of the specified `dtype`.\n\t */\n\n\tfunction cast$1(x, dtype) {\n\t  return x.asType(dtype);\n\t}\n\t/**\n\t * Adds a 1-sized dimension at index \"axis\".\n\t * @param x Input tensor.\n\t * @param axis Position where to add the new axis.\n\t * @returns Result of the dimension expansion.\n\t */\n\n\tfunction expandDims$1(x, axis) {\n\t  if (axis === void 0) {\n\t    axis = -1;\n\t  }\n\n\t  var outShape = x.shape.slice();\n\n\t  if (axis < 0) {\n\t    axis = outShape.length + axis + 1;\n\t  }\n\n\t  outShape.splice(axis, 0, 1);\n\t  return x.reshape(outShape);\n\t}\n\t/**\n\t * Repeats a 2D tensor.\n\t *\n\t * If `x` has shape `[samples, dim]` and `n` is 2, for example, the output\n\t * will have shape `[samples, 2, dim]`.\n\t *\n\t * @param x Input tensor.\n\t * @param n Integer, number of times to repeat.\n\t * @returns The result of the repeat operation.\n\t * @throws ValueError: If input tensor is not 2D.\n\t */\n\n\tfunction repeat(x, n) {\n\t  return tidy(function () {\n\t    if (x.shape.length !== 2) {\n\t      throw new ValueError(\"repeat() expects a rank-2 tensor, but received a \" + (\"rank-\" + x.shape.length + \" tensor.\"));\n\t    }\n\n\t    var y = expandDims$1(x, 1);\n\t    return tile$1(y, [1, n, 1]);\n\t  });\n\t}\n\t/**\n\t * Flatten a Tensor into 1D.\n\t * @param x Input tensor.\n\t * @return The result of the flattening `x`.\n\t */\n\n\tfunction flatten$1(x) {\n\t  var newShape = [arrayProd(x.shape)];\n\t  return x.reshape(newShape);\n\t}\n\t/**\n\t * Turn a nD tensor into a 2D tensor with same 0th dimension.\n\t * In other words, it flattens each data samples of a batch.\n\t *\n\t * @param x The tensor to flatten. The rank of this tensor is required to be 2\n\t *   or higher.\n\t * @return The result of the flattening.\n\t */\n\n\tfunction batchFlatten(x) {\n\t  if (x.rank <= 1) {\n\t    throw new ValueError(\"batchFlatten requires a minimum rank of 2. Got rank: \" + x.rank + \".\");\n\t  }\n\n\t  var newShape = [x.shape[0], arrayProd(x.shape, 1)];\n\t  return x.reshape(newShape);\n\t}\n\t/**\n\t * Do slicing along the first axis.\n\t * @param array input `tf.Tensor`.\n\t * @param start starting index, inclusive.\n\t * @param size size of the slice along the first axis.\n\t * @returns result of the slicing.\n\t * @throws ValueError: If `array` is of an unsupported subtype of `tf.Tensor`.\n\t */\n\n\tfunction sliceAlongFirstAxis(array, start, size) {\n\t  return tidy(function () {\n\t    switch (array.rank) {\n\t      case 1:\n\t        return slice1d(array, start, size);\n\n\t      case 2:\n\t        return slice2d(array, [start, 0], [size, array.shape[1]]);\n\n\t      case 3:\n\t        return slice3d(array, [start, 0, 0], [size, array.shape[1], array.shape[2]]);\n\n\t      case 4:\n\t        return slice4d(array, [start, 0, 0, 0], [size, array.shape[1], array.shape[2], array.shape[3]]);\n\n\t      case 5:\n\t        return slice$2(array, [start, 0, 0, 0, 0], [size, array.shape[1], array.shape[2], array.shape[3], array.shape[4]]);\n\n\t      case 6:\n\t        return slice$2(array, [start, 0, 0, 0, 0, 0], [size, array.shape[1], array.shape[2], array.shape[3], array.shape[4], array.shape[5]]);\n\n\t      default:\n\t        throw new ValueError(\"sliceAlongFirstAxis() received an unsupported tensor rank: \" + (\"\" + array.rank));\n\t    }\n\t  });\n\t}\n\t/**\n\t * Do slicing along the last axis.\n\t * @param array input `tf.Tensor`.\n\t * @param start starting index, inclusive.\n\t * @param size size of the slice along the last axis.\n\t * @returns result of the slicing.\n\t * @throws ValueError: If `array` is of an unsupported subtype of `tf.Tensor`.\n\t */\n\n\tfunction sliceAlongLastAxis(array, start, size) {\n\t  return tidy(function () {\n\t    switch (array.rank) {\n\t      case 1:\n\t        return slice1d(array, start, size);\n\n\t      case 2:\n\t        return slice2d(array, [0, start], [array.shape[0], size]);\n\n\t      case 3:\n\t        return slice3d(array, [0, 0, start], [array.shape[0], array.shape[1], size]);\n\n\t      case 4:\n\t        return slice4d(array, [0, 0, 0, start], [array.shape[0], array.shape[1], array.shape[2], size]);\n\n\t      default:\n\t        throw new ValueError(\"sliceAlongLastAxis() received an unsupported tensor rank: \" + (\"\" + array.rank));\n\t    }\n\t  });\n\t}\n\t/**\n\t * Do slicing along the sepcified axis.\n\t * @param array input `tf.Tensor`.\n\t * @param start starting index, inclusive.\n\t * @param size of the slice along the chosen axis.\n\t * @param choose an axis.\n\t * @returns result of the slicing.\n\t * @throws ValueError: If `array` is of an unsupported subtype of `tf.Tensor`.\n\t */\n\n\tfunction sliceAlongAxis(array, start, size, axis) {\n\t  return tidy(function () {\n\t    switch (array.rank) {\n\t      case 1:\n\t        return slice1d(array, start, size);\n\n\t      case 2:\n\t        switch (axis) {\n\t          case 1:\n\t            return sliceAlongFirstAxis(array, start, size);\n\n\t          case 2:\n\t            return sliceAlongLastAxis(array, start, size);\n\n\t          default:\n\t            throw new ValueError(\"The axis is not within the rank of the tensor \" + (\"\" + axis));\n\t        }\n\n\t      case 3:\n\t        switch (axis) {\n\t          case 1:\n\t            return sliceAlongFirstAxis(array, start, size);\n\n\t          case 2:\n\t            return slice3d(array, [0, start, 0], [array.shape[0], size, array.shape[2]]);\n\n\t          case 3:\n\t            return sliceAlongLastAxis(array, start, size);\n\n\t          default:\n\t            throw new ValueError(\"The axis is not within the rank of the tensor \" + (\"\" + axis));\n\t        }\n\n\t      case 4:\n\t        switch (axis) {\n\t          case 1:\n\t            return sliceAlongFirstAxis(array, start, size);\n\n\t          case 2:\n\t            return slice4d(array, [0, start, 0, 0], [array.shape[0], size, array.shape[2], array.shape[3]]);\n\n\t          case 3:\n\t            return slice4d(array, [0, 0, start, 0], [array.shape[0], array.shape[1], size, array.shape[3]]);\n\n\t          case 4:\n\t            return sliceAlongLastAxis(array, start, size);\n\n\t          default:\n\t            throw new ValueError(\"The axis is not within the rank of the tensor \" + (\"\" + axis));\n\t        }\n\n\t      default:\n\t        throw new ValueError(\"sliceAlongLastAxis() received an unsupported tensor rank: \" + (\"\" + array.rank));\n\t    }\n\t  });\n\t}\n\t/**\n\t * Concatenates a list of tensors alongside the specified axis.\n\t * @param tensors `Array` of tensors to concatenate.\n\t * @param axis Concatenation axis.\n\t * @returns The result of the concatenation.\n\t */\n\n\tfunction concatenate(tensors, axis) {\n\t  if (axis === void 0) {\n\t    axis = -1;\n\t  }\n\n\t  var rank;\n\n\t  if (axis < 0) {\n\t    rank = tensors[0].rank;\n\n\t    if (rank !== 0) {\n\t      axis = rank;\n\t    } else {\n\t      axis = 0;\n\t    }\n\t  }\n\n\t  if (axis === tensors[0].rank) {\n\t    // Porting Note: This is necessary because tfc.concat() requires axis to be\n\t    //   in the interval [-rank, rank).\n\t    axis = -1;\n\t  } // Porting Note: Sparse concat is not supported yet.\n\n\n\t  return concat(tensors, axis);\n\t}\n\t/**\n\t * Concatenate two arrays along the first dimension.\n\t * @param a The 1st `tf.Tensor` to concatenate.\n\t * @param b The 2nd `tf.Tensor` to concatenate.\n\t * @returns Result of the concatenation.\n\t * @throws ValueError: If `a` is of an unsupported subtype of `tf.Tensor`.\n\t */\n\n\tfunction concatAlongFirstAxis(a, b) {\n\t  switch (a.rank) {\n\t    case 1:\n\t      return concat1d([a, b]);\n\n\t    case 2:\n\t      return concat2d([a, b], 0);\n\n\t    case 3:\n\t      return concat3d([a, b], 0);\n\n\t    case 4:\n\t      return concat4d([a, b], 0);\n\n\t    default:\n\t      throw new ValueError(\"concatAlongFirstAxis() received an unsupported \" + (\"tensor rank: \" + a.rank));\n\t  }\n\t}\n\t/**\n\t * Creates a tensor by tiling `x` by `n`.\n\t * @param x A tensor.\n\t * @param n An Array of integers or a single integer. If an Array, the length\n\t *   must be the same as the number of dimensions in `x`. If a single integer,\n\t *   it will be treated as an Array of length 1.\n\t */\n\n\tfunction tile$1(x, n) {\n\t  if (!Array.isArray(n)) {\n\t    n = [n];\n\t  }\n\n\t  if (x.rank !== n.length) {\n\t    throw new ValueError(\"The length of input n (\" + n.length + \") does not match \" + (\"the number of dimensions in input x (\" + x.rank + \")\"));\n\t  }\n\n\t  return tile(x, n);\n\t}\n\t/* Creation of random tensors. */\n\n\t/**\n\t * Get a tensor with normal distribution of values.\n\t *\n\t * @param shape Shape of the tensor.\n\t * @param mean mean value of the normal distribution.\n\t * @param stddev standard deviation of the normal distribution.\n\t * @param dtype\n\t * @param seed\n\t * @return The normal tensor.\n\t */\n\n\tfunction randomNormal$1(shape, mean, stddev, dtype, seed) {\n\t  if (mean === void 0) {\n\t    mean = 0.0;\n\t  }\n\n\t  if (stddev === void 0) {\n\t    stddev = 1.0;\n\t  }\n\n\t  return randomNormal(shape, mean, stddev, dtype, seed);\n\t}\n\t/* Linear Algebra */\n\n\t/**\n\t * Multiply two tensors and returns the result as a tensor.\n\t *\n\t * For 2D tensors, this is equivalent to matrix multiplication (matMul).\n\t * For tensors of higher ranks, it follows the Theano behavior,\n\t * (e.g. `(2, 3) * (4, 3, 5) -> (2, 4, 5)`).  From the Theano documentation:\n\t *\n\t * For N dimensions it is a sum product over the last axis of x and the\n\t * second-to-last of y:\n\t *\n\t * @param a A tensor of at least rank 2.\n\t * @param b A tensor of at least rank 2.\n\t * @param activation (optional) A string identifying the activation\n\t *   function.\n\t * @return Result of the dot operation.\n\t */\n\n\tfunction dot$1(a, b, activation, bias) {\n\t  if (a.rank < 2 || b.rank < 2) {\n\t    throw new NotImplementedError(\"dot requires both inputs to be rank >= 2\" + (\" but got x shape = \" + a.shape + \" and y shape = \" + b.shape));\n\t  }\n\n\t  if (b.rank >= 3) {\n\t    var xLastDim = a.shape.slice(-1)[0];\n\t    var ySecondLastDim = b.shape.slice(-2)[0];\n\n\t    if (xLastDim !== ySecondLastDim) {\n\t      throw new NotImplementedError(\"If rank y >= 3, then the second last dim\" + (\" of y must equal the last dim of x but got x shape = \" + a.shape + \" and \") + (\" y shape = \" + b.shape));\n\t    }\n\t  } // Handle basic 2D x 2D case.\n\n\n\t  if (a.rank === 2 && b.rank === 2) {\n\t    var transposeA = false;\n\t    var transposeB = false; // tfc.fused.matMul only fuses certain activation functions. Unsupported\n\t    // activation functions are treated as 'linear' activations, which is\n\t    // equivalent to a no-op.\n\n\t    return matMul$1({\n\t      a: a,\n\t      b: b,\n\t      transposeA: transposeA,\n\t      transposeB: transposeB,\n\t      bias: bias ? reshapeBias(a.rank, bias, imageDataFormat()) : null,\n\t      activation: activation\n\t    });\n\t  } else {\n\t    // Reshape x into the analogous 2D Tensor.\n\t    var aFirstDims = a.shape.slice(); // Holds all but the last dim of x.\n\n\t    var aLastDim = aFirstDims.pop();\n\t    a = a.reshape([-1, aLastDim]); // Reshape y into the analogous 2D Tensor, and keep track of the\n\t    // required dimensions to reproduce the output shape.\n\n\t    var bShape = b.shape.slice();\n\t    var bLastDim = bShape.pop();\n\n\t    var _ySecondLastDim = bShape.pop();\n\n\t    var yOtherDims = [].concat(bShape, [bLastDim]); // permutation should be like [r-2, 0, 1, 2, ... r-4, r-3, r-1]\n\t    // where r is the rank of y.\n\n\t    var perm = Array.from({\n\t      length: b.rank\n\t    }, function (_, i) {\n\t      if (i === 0) {\n\t        return b.rank - 2;\n\t      } else if (i <= b.rank - 2) {\n\t        return i - 1;\n\t      }\n\n\t      return i;\n\t    });\n\t    b = b.transpose(perm).reshape([_ySecondLastDim, -1]); // Multiply x and y as 2D Tensors, and then reshape back to original.\n\n\t    var outputShape = [].concat(aFirstDims, yOtherDims);\n\t    var _transposeA = false;\n\t    var _transposeB = false;\n\t    return matMul$1({\n\t      a: a,\n\t      b: b,\n\t      transposeA: _transposeA,\n\t      transposeB: _transposeB,\n\t      bias: bias ? reshapeBias(a.rank, bias, imageDataFormat()) : null,\n\t      activation: activation\n\t    }).reshape(outputShape);\n\t  }\n\t}\n\t/**\n\t * Compute the sign Tensor of an input Tensor.\n\t *\n\t * Elements of the input `tf.Tensor` that are === 0 are mapped to 0.\n\t * Elements of the input `tf.Tensor` that are > 0 are mapped to 1.\n\t * Elements of the input `tf.Tensor` that are < 0 are mapped to -1.\n\t *\n\t * @param x Input `tf.Tensor`.\n\t * @return The sign `tf.Tensor`.\n\t */\n\n\tfunction sign$1(x) {\n\t  // TODO(cais): Move to the core.\n\t  return tidy(function () {\n\t    var zerosLikeX = zerosLike(x);\n\t    var onesLikeX = onesLike(x);\n\t    return where(equal(x, zerosLikeX), zerosLikeX, where(greater(x, zerosLike(x)), onesLikeX, mul(-1, onesLikeX)));\n\t  });\n\t}\n\t/**\n\t * Computes the one-hot representation of an integer tensor.\n\t * @param indices nD integer tensor of shape\n\t *   `(batch_size, dim1, dim2, ... dim(n-1))`\n\t * @param numClasses Integer, number of classes to consider.\n\t * @returns (n + 1)D one hot representation of the input\n\t *   with shape `(batch_size, dim1, dim2, ... dim(n-1), num_classes)`\n\t */\n\n\tfunction oneHot$1(indices, numClasses) {\n\t  return tidy(function () {\n\t    if (indices.rank !== 1) {\n\t      throw new Error('Only 1D one-hot tensors are supported in the ' + 'deeplearn backend, at present.');\n\t    }\n\n\t    indices = indices.toInt();\n\t    return oneHot(indices, numClasses).toFloat();\n\t  });\n\t}\n\t/* Elementary math functions. */\n\n\t/**\n\t * Retrieves the elements of indices `indices` in the tensor `reference`.\n\t * @param reference A tensor.\n\t * @param indices An integer tensor of indices or an `Array` of integers.\n\t * @param axis Axis along which to perform the gather operation.\n\t * @returns The result of the gathering as a tensor.\n\t */\n\n\tfunction gather$1(reference, indices, axis) {\n\t  return tidy(function () {\n\t    if (Array.isArray(indices)) {\n\t      indices = tensor1d(indices, 'int32');\n\t    } else {\n\t      indices = indices.toInt();\n\t    }\n\n\t    return gather(reference, indices, axis);\n\t  });\n\t}\n\t/**\n\t * Element-wise square.\n\t * @param x Input tensor.\n\t * @return element-wise x^2\n\t */\n\n\tfunction square$1(x) {\n\t  return mul(x, x);\n\t}\n\t/**\n\t * Element-wise exponentiation.\n\t *\n\t * Porting Note: In PyKeras, `a` (the exponent) is a Python integer, which\n\t *   takes advatnage of the backend's (e.g., TensorFlow's) automatic\n\t * conversion to tensor. Here we allow `a` to be either a number or a tensor.\n\t *\n\t * @param x The base tensor.\n\t * @param a The exponent, tensor or number. If a number, it is rounded to the\n\t *   nearest integer and converted to a tensor.\n\t * @returns A tensor of the same shape as `x`.\n\t */\n\n\tfunction pow$6(x, a) {\n\t  return tidy(function () {\n\t    if (typeof a === 'number') {\n\t      a = scalar(Math.round(a), 'int32');\n\t    }\n\n\t    if (a.dtype !== 'int32') {\n\t      throw new NotImplementedError(\"Non-int32 dtype (\" + a.dtype + \") is not supported by pow() yet\");\n\t    }\n\n\t    return pow$5(x, a);\n\t  });\n\t}\n\t/**\n\t * Reshapes bias tensor according to rank of x.\n\t */\n\n\tfunction reshapeBias(xRank, bias, dataFormat) {\n\t  var biasShape = bias.shape;\n\n\t  if (bias.rank !== 1 && bias.rank !== xRank) {\n\t    throw new ValueError(\"Unexpected bias dimensions: \" + bias.rank + (\"; expected it to be 1 or \" + xRank));\n\t  }\n\n\t  if (xRank === 5) {\n\t    if (dataFormat === 'channelsFirst') {\n\t      if (biasShape.length === 1) {\n\t        return bias.reshape([1, biasShape[0], 1, 1, 1]);\n\t      } else {\n\t        return bias.reshape([1, biasShape[3], biasShape[0], biasShape[1], biasShape[2]]);\n\t      }\n\t    } else if (dataFormat === 'channelsLast') {\n\t      if (biasShape.length === 1) {\n\t        return bias.reshape([1, 1, 1, 1, biasShape[0]]);\n\t      } else {\n\t        return bias.reshape([1].concat(biasShape));\n\t      }\n\t    }\n\t  } else if (xRank === 4) {\n\t    if (dataFormat === 'channelsFirst') {\n\t      if (biasShape.length === 1) {\n\t        return bias.reshape([1, biasShape[0], 1, 1]);\n\t      } else {\n\t        return bias.reshape([1, biasShape[2], biasShape[0], biasShape[1]]);\n\t      }\n\t    } else if (dataFormat === 'channelsLast') {\n\t      if (biasShape.length === 1) {\n\t        return bias.reshape([1, 1, 1, biasShape[0]]);\n\t      } else {\n\t        return bias.reshape([1].concat(biasShape));\n\t      }\n\t    }\n\t  } else if (xRank === 3) {\n\t    if (dataFormat === 'channelsFirst') {\n\t      if (biasShape.length === 1) {\n\t        return bias.reshape([1, biasShape[0], 1]);\n\t      } else {\n\t        return bias.reshape([1, biasShape[1], biasShape[0]]);\n\t      }\n\t    } else if (dataFormat === 'channelsLast') {\n\t      if (biasShape.length === 1) {\n\t        return bias.reshape([1, 1, biasShape[0]]);\n\t      } else {\n\t        return bias.reshape([1].concat(biasShape));\n\t      }\n\t    }\n\t  } else if (xRank < 3) {\n\t    return bias;\n\t  }\n\n\t  throw new ValueError(\"Unsupported input rank by biasAdd: \" + bias.rank);\n\t}\n\t/* Neural-network operations. */\n\n\t/**\n\t * Add a bias to a tensor.\n\t *\n\t * @param x The tensor to add the bias to.\n\t * @param bias The bias to add to `x`. Must be 1D or the same rank as `x`.\n\t * @return Result of the bias adding.\n\t * @throws ValueError: If the rank of `bias` is incorrect.\n\t */\n\n\n\tfunction biasAdd(x, bias, dataFormat) {\n\t  return tidy(function () {\n\t    if (dataFormat == null) {\n\t      dataFormat = imageDataFormat();\n\t    }\n\n\t    checkDataFormat(dataFormat);\n\t    return x.add(reshapeBias(x.rank, bias, dataFormat));\n\t  });\n\t}\n\t/**\n\t * Exponential linear unit (ELU).\n\t * @param x A tensor or variable to compute the activation function for.\n\t * @param alpha: A scalar, a scaling factor for the negative section.\n\t * @return Output of the ELU operation.\n\t */\n\n\tfunction elu$1(x, alpha) {\n\t  if (alpha === void 0) {\n\t    alpha = 1;\n\t  }\n\n\t  // TODO(cais): Add support for alpha values other than 1.\n\t  if (alpha !== 1) {\n\t    throw new NotImplementedError(\"Support for alpha values other than 1 (\" + alpha + \") is not implemented \" + \"yet.\");\n\t  }\n\n\t  return elu(x);\n\t}\n\t/**\n\t * Softsign of a tensor.\n\t *\n\t * Defined as x / (abs(x) + 1), element-wise.\n\t *\n\t * @param x: Input.\n\t * @returns Output.\n\t */\n\n\tfunction softsign(x) {\n\t  return tidy(function () {\n\t    return div(x, abs$8(x).add(1));\n\t  });\n\t}\n\t/**\n\t * Sets entries in `x` to zero at random, while scaling the entire tensor.\n\t *\n\t * @param x input tensor.\n\t * @param level fraction of the entries in the tensor that will be set to 0.\n\t * @param noiseShape shape of randomly generated keep/drop flags, must be\n\t *   broadcastable to the shape of `x`. Optional.\n\t * @param seed random seed to ensure determinism. Optional.\n\t * @returns Result of the dropout operation.\n\t */\n\n\tfunction dropout$1(x, level, noiseShape, seed) {\n\t  return tidy(function () {\n\t    return dropout(x, level, noiseShape, seed);\n\t  });\n\t}\n\t/**\n\t * Element-wise, segment-wise linear approximation of sigmoid.\n\t *\n\t * Returns `0.` if `x < -2.5`, `1.` if `x > 2.5`.\n\t * In `-2.5 <= x <= 2.5`, returns `0.2 * x + 0.5`.\n\t *\n\t * @param x Input tensor.\n\t * @returns Output tensor.\n\t */\n\n\tfunction hardSigmoid(x) {\n\t  return tidy(function () {\n\t    var y = add$1(.5, mul(.2, x));\n\t    return clipByValue(y, 0, 1);\n\t  });\n\t}\n\t/**\n\t * Invoke `x` in the training phase, and `alt` otherwise.\n\t *\n\t * Porting Note: We do not create placeholder tensors for the `training`\n\t * boolean flag here, because there is no such thing in the TF.js imperative\n\t * backend.\n\t *\n\t * @param x The function to invoke iff `training` is `true`.\n\t * @param alt The function to invoke iff `training` is `false`.\n\t * @param training Boolean flag for whether training phase is active.\n\t * @returns The return value of `x()` if `training` is `true`, or the return\n\t *   value of `alt()` if `training` is `false`.\n\t */\n\n\tfunction inTrainPhase(x, alt, training) {\n\t  if (training === void 0) {\n\t    training = false;\n\t  }\n\n\t  return training ? x() : alt();\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\tvar VALID_FAN_MODE_VALUES = ['fanIn', 'fanOut', 'fanAvg'];\n\tvar VALID_DISTRIBUTION_VALUES = ['normal', 'uniform', 'truncatedNormal']; // We can't easily extract a string[] from the string union type, but we can\n\t// recapitulate the list, enforcing at compile time that the values are valid\n\t// and that we have the right number of them.\n\n\t/**\n\t * A string array of valid Initializer class names.\n\t *\n\t * This is guaranteed to match the `InitializerClassName` union type.\n\t */\n\n\tvar initializerClassNames = ['Zeros', 'Ones', 'Constant', 'RandomNormal', 'RandomUniform', 'TruncatedNormal', 'VarianceScaling', 'Orthogonal', 'Identity'];\n\n\tfunction checkFanMode(value) {\n\t  checkStringTypeUnionValue(VALID_FAN_MODE_VALUES, 'FanMode', value);\n\t}\n\tfunction checkDistribution(value) {\n\t  checkStringTypeUnionValue(VALID_DISTRIBUTION_VALUES, 'Distribution', value);\n\t}\n\t/**\n\t * Initializer base class.\n\t *\n\t * @doc {\n\t *   heading: 'Initializers', subheading: 'Classes', namespace: 'initializers'}\n\t */\n\n\tvar Initializer = /*#__PURE__*/function (_serialization$Serial) {\n\t  _inheritsLoose(Initializer, _serialization$Serial);\n\n\t  function Initializer() {\n\t    return _serialization$Serial.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto = Initializer.prototype;\n\n\t  _proto.fromConfigUsesCustomObjects = function fromConfigUsesCustomObjects() {\n\t    return false;\n\t  };\n\n\t  _proto.getConfig = function getConfig() {\n\t    return {};\n\t  };\n\n\t  return Initializer;\n\t}(Serializable);\n\tvar Zeros = /*#__PURE__*/function (_Initializer) {\n\t  _inheritsLoose(Zeros, _Initializer);\n\n\t  function Zeros() {\n\t    return _Initializer.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto2 = Zeros.prototype;\n\n\t  _proto2.apply = function apply(shape, dtype) {\n\t    return zeros(shape, dtype);\n\t  };\n\n\t  return Zeros;\n\t}(Initializer);\n\t/** @nocollapse */\n\n\tZeros.className = 'Zeros';\n\tregisterClass(Zeros);\n\tvar Ones = /*#__PURE__*/function (_Initializer2) {\n\t  _inheritsLoose(Ones, _Initializer2);\n\n\t  function Ones() {\n\t    return _Initializer2.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto3 = Ones.prototype;\n\n\t  _proto3.apply = function apply(shape, dtype) {\n\t    return ones$1(shape, dtype);\n\t  };\n\n\t  return Ones;\n\t}(Initializer);\n\t/** @nocollapse */\n\n\tOnes.className = 'Ones';\n\tregisterClass(Ones);\n\tvar Constant = /*#__PURE__*/function (_Initializer3) {\n\t  _inheritsLoose(Constant, _Initializer3);\n\n\t  function Constant(args) {\n\t    var _this;\n\n\t    _this = _Initializer3.call(this) || this;\n\n\t    if (typeof args !== 'object') {\n\t      throw new ValueError(\"Expected argument of type ConstantConfig but got \" + args);\n\t    }\n\n\t    if (args.value === undefined) {\n\t      throw new ValueError(\"config must have value set but got \" + args);\n\t    }\n\n\t    _this.value = args.value;\n\t    return _this;\n\t  }\n\n\t  var _proto4 = Constant.prototype;\n\n\t  _proto4.apply = function apply(shape, dtype) {\n\t    var _this2 = this;\n\n\t    return tidy(function () {\n\t      return mul(scalar(_this2.value), ones$1(shape, dtype));\n\t    });\n\t  };\n\n\t  _proto4.getConfig = function getConfig() {\n\t    return {\n\t      value: this.value\n\t    };\n\t  };\n\n\t  return Constant;\n\t}(Initializer);\n\t/** @nocollapse */\n\n\tConstant.className = 'Constant';\n\tregisterClass(Constant);\n\tvar RandomUniform = /*#__PURE__*/function (_Initializer4) {\n\t  _inheritsLoose(RandomUniform, _Initializer4);\n\n\t  function RandomUniform(args) {\n\t    var _this3;\n\n\t    _this3 = _Initializer4.call(this) || this;\n\t    _this3.DEFAULT_MINVAL = -0.05;\n\t    _this3.DEFAULT_MAXVAL = 0.05;\n\t    _this3.minval = args.minval || _this3.DEFAULT_MINVAL;\n\t    _this3.maxval = args.maxval || _this3.DEFAULT_MAXVAL;\n\t    _this3.seed = args.seed;\n\t    return _this3;\n\t  }\n\n\t  var _proto5 = RandomUniform.prototype;\n\n\t  _proto5.apply = function apply(shape, dtype) {\n\t    return randomUniform(shape, this.minval, this.maxval, dtype);\n\t  };\n\n\t  _proto5.getConfig = function getConfig() {\n\t    return {\n\t      minval: this.minval,\n\t      maxval: this.maxval,\n\t      seed: this.seed\n\t    };\n\t  };\n\n\t  return RandomUniform;\n\t}(Initializer);\n\t/** @nocollapse */\n\n\tRandomUniform.className = 'RandomUniform';\n\tregisterClass(RandomUniform);\n\tvar RandomNormal = /*#__PURE__*/function (_Initializer5) {\n\t  _inheritsLoose(RandomNormal, _Initializer5);\n\n\t  function RandomNormal(args) {\n\t    var _this4;\n\n\t    _this4 = _Initializer5.call(this) || this;\n\t    _this4.DEFAULT_MEAN = 0.;\n\t    _this4.DEFAULT_STDDEV = 0.05;\n\t    _this4.mean = args.mean || _this4.DEFAULT_MEAN;\n\t    _this4.stddev = args.stddev || _this4.DEFAULT_STDDEV;\n\t    _this4.seed = args.seed;\n\t    return _this4;\n\t  }\n\n\t  var _proto6 = RandomNormal.prototype;\n\n\t  _proto6.apply = function apply(shape, dtype) {\n\t    dtype = dtype || 'float32';\n\n\t    if (dtype !== 'float32' && dtype !== 'int32') {\n\t      throw new NotImplementedError(\"randomNormal does not support dType \" + dtype + \".\");\n\t    }\n\n\t    return randomNormal$1(shape, this.mean, this.stddev, dtype, this.seed);\n\t  };\n\n\t  _proto6.getConfig = function getConfig() {\n\t    return {\n\t      mean: this.mean,\n\t      stddev: this.stddev,\n\t      seed: this.seed\n\t    };\n\t  };\n\n\t  return RandomNormal;\n\t}(Initializer);\n\t/** @nocollapse */\n\n\tRandomNormal.className = 'RandomNormal';\n\tregisterClass(RandomNormal);\n\tvar TruncatedNormal = /*#__PURE__*/function (_Initializer6) {\n\t  _inheritsLoose(TruncatedNormal, _Initializer6);\n\n\t  function TruncatedNormal(args) {\n\t    var _this5;\n\n\t    _this5 = _Initializer6.call(this) || this;\n\t    _this5.DEFAULT_MEAN = 0.;\n\t    _this5.DEFAULT_STDDEV = 0.05;\n\t    _this5.mean = args.mean || _this5.DEFAULT_MEAN;\n\t    _this5.stddev = args.stddev || _this5.DEFAULT_STDDEV;\n\t    _this5.seed = args.seed;\n\t    return _this5;\n\t  }\n\n\t  var _proto7 = TruncatedNormal.prototype;\n\n\t  _proto7.apply = function apply(shape, dtype) {\n\t    dtype = dtype || 'float32';\n\n\t    if (dtype !== 'float32' && dtype !== 'int32') {\n\t      throw new NotImplementedError(\"truncatedNormal does not support dType \" + dtype + \".\");\n\t    }\n\n\t    return truncatedNormal(shape, this.mean, this.stddev, dtype, this.seed);\n\t  };\n\n\t  _proto7.getConfig = function getConfig() {\n\t    return {\n\t      mean: this.mean,\n\t      stddev: this.stddev,\n\t      seed: this.seed\n\t    };\n\t  };\n\n\t  return TruncatedNormal;\n\t}(Initializer);\n\t/** @nocollapse */\n\n\tTruncatedNormal.className = 'TruncatedNormal';\n\tregisterClass(TruncatedNormal);\n\tvar Identity$1 = /*#__PURE__*/function (_Initializer7) {\n\t  _inheritsLoose(Identity, _Initializer7);\n\n\t  function Identity(args) {\n\t    var _this6;\n\n\t    _this6 = _Initializer7.call(this) || this;\n\t    _this6.gain = args.gain != null ? args.gain : 1.0;\n\t    return _this6;\n\t  }\n\n\t  var _proto8 = Identity.prototype;\n\n\t  _proto8.apply = function apply(shape, dtype) {\n\t    var _this7 = this;\n\n\t    return tidy(function () {\n\t      if (shape.length !== 2 || shape[0] !== shape[1]) {\n\t        throw new ValueError('Identity matrix initializer can only be used for' + ' 2D square matrices.');\n\t      } else {\n\t        return mul(_this7.gain, eye(shape[0]));\n\t      }\n\t    });\n\t  };\n\n\t  _proto8.getConfig = function getConfig() {\n\t    return {\n\t      gain: this.gain\n\t    };\n\t  };\n\n\t  return Identity;\n\t}(Initializer);\n\t/** @nocollapse */\n\n\tIdentity$1.className = 'Identity';\n\tregisterClass(Identity$1);\n\t/**\n\t * Computes the number of input and output units for a weight shape.\n\t * @param shape Shape of weight.\n\t * @param dataFormat data format to use for convolution kernels.\n\t *   Note that all kernels in Keras are standardized on the\n\t *   CHANNEL_LAST ordering (even when inputs are set to CHANNEL_FIRST).\n\t * @return An length-2 array: fanIn, fanOut.\n\t */\n\n\tfunction computeFans(shape, dataFormat) {\n\t  if (dataFormat === void 0) {\n\t    dataFormat = 'channelsLast';\n\t  }\n\n\t  var fanIn;\n\t  var fanOut;\n\t  checkDataFormat(dataFormat);\n\n\t  if (shape.length === 2) {\n\t    fanIn = shape[0];\n\t    fanOut = shape[1];\n\t  } else if ([3, 4, 5].indexOf(shape.length) !== -1) {\n\t    if (dataFormat === 'channelsFirst') {\n\t      var receptiveFieldSize = arrayProd(shape, 2);\n\t      fanIn = shape[1] * receptiveFieldSize;\n\t      fanOut = shape[0] * receptiveFieldSize;\n\t    } else if (dataFormat === 'channelsLast') {\n\t      var _receptiveFieldSize = arrayProd(shape, 0, shape.length - 2);\n\n\t      fanIn = shape[shape.length - 2] * _receptiveFieldSize;\n\t      fanOut = shape[shape.length - 1] * _receptiveFieldSize;\n\t    }\n\t  } else {\n\t    var shapeProd = arrayProd(shape);\n\t    fanIn = Math.sqrt(shapeProd);\n\t    fanOut = Math.sqrt(shapeProd);\n\t  }\n\n\t  return [fanIn, fanOut];\n\t}\n\n\tvar VarianceScaling = /*#__PURE__*/function (_Initializer8) {\n\t  _inheritsLoose(VarianceScaling, _Initializer8);\n\n\t  /**\n\t   * Constructor of VarianceScaling.\n\t   * @throws ValueError for invalid value in scale.\n\t   */\n\t  function VarianceScaling(args) {\n\t    var _this8;\n\n\t    _this8 = _Initializer8.call(this) || this;\n\n\t    if (args.scale < 0.0) {\n\t      throw new ValueError(\"scale must be a positive float. Got: \" + args.scale);\n\t    }\n\n\t    _this8.scale = args.scale == null ? 1.0 : args.scale;\n\t    _this8.mode = args.mode == null ? 'fanIn' : args.mode;\n\t    checkFanMode(_this8.mode);\n\t    _this8.distribution = args.distribution == null ? 'normal' : args.distribution;\n\t    checkDistribution(_this8.distribution);\n\t    _this8.seed = args.seed;\n\t    return _this8;\n\t  }\n\n\t  var _proto9 = VarianceScaling.prototype;\n\n\t  _proto9.apply = function apply(shape, dtype) {\n\t    var fans = computeFans(shape);\n\t    var fanIn = fans[0];\n\t    var fanOut = fans[1];\n\t    var scale = this.scale;\n\n\t    if (this.mode === 'fanIn') {\n\t      scale /= Math.max(1, fanIn);\n\t    } else if (this.mode === 'fanOut') {\n\t      scale /= Math.max(1, fanOut);\n\t    } else {\n\t      scale /= Math.max(1, (fanIn + fanOut) / 2);\n\t    }\n\n\t    if (this.distribution === 'normal') {\n\t      var stddev = Math.sqrt(scale);\n\t      dtype = dtype || 'float32';\n\n\t      if (dtype !== 'float32' && dtype !== 'int32') {\n\t        throw new NotImplementedError(this.getClassName() + \" does not support dType \" + dtype + \".\");\n\t      }\n\n\t      return truncatedNormal(shape, 0, stddev, dtype, this.seed);\n\t    } else {\n\t      var limit = Math.sqrt(3 * scale);\n\t      return randomUniform(shape, -limit, limit, dtype);\n\t    }\n\t  };\n\n\t  _proto9.getConfig = function getConfig() {\n\t    return {\n\t      scale: this.scale,\n\t      mode: this.mode,\n\t      distribution: this.distribution,\n\t      seed: this.seed\n\t    };\n\t  };\n\n\t  return VarianceScaling;\n\t}(Initializer);\n\t/** @nocollapse */\n\n\tVarianceScaling.className = 'VarianceScaling';\n\tregisterClass(VarianceScaling);\n\tvar GlorotUniform = /*#__PURE__*/function (_VarianceScaling) {\n\t  _inheritsLoose(GlorotUniform, _VarianceScaling);\n\n\t  /**\n\t   * Constructor of GlorotUniform\n\t   * @param scale\n\t   * @param mode\n\t   * @param distribution\n\t   * @param seed\n\t   */\n\t  function GlorotUniform(args) {\n\t    return _VarianceScaling.call(this, {\n\t      scale: 1.0,\n\t      mode: 'fanAvg',\n\t      distribution: 'uniform',\n\t      seed: args == null ? null : args.seed\n\t    }) || this;\n\t  }\n\n\t  var _proto10 = GlorotUniform.prototype;\n\n\t  _proto10.getClassName = function getClassName() {\n\t    // In Python Keras, GlorotUniform is not a class, but a helper method\n\t    // that creates a VarianceScaling object. Use 'VarianceScaling' as\n\t    // class name to be compatible with that.\n\t    return VarianceScaling.className;\n\t  };\n\n\t  return GlorotUniform;\n\t}(VarianceScaling);\n\t/** @nocollapse */\n\n\tGlorotUniform.className = 'GlorotUniform';\n\tregisterClass(GlorotUniform);\n\tvar GlorotNormal = /*#__PURE__*/function (_VarianceScaling2) {\n\t  _inheritsLoose(GlorotNormal, _VarianceScaling2);\n\n\t  /**\n\t   * Constructor of GlorotNormal.\n\t   * @param scale\n\t   * @param mode\n\t   * @param distribution\n\t   * @param seed\n\t   */\n\t  function GlorotNormal(args) {\n\t    return _VarianceScaling2.call(this, {\n\t      scale: 1.0,\n\t      mode: 'fanAvg',\n\t      distribution: 'normal',\n\t      seed: args == null ? null : args.seed\n\t    }) || this;\n\t  }\n\n\t  var _proto11 = GlorotNormal.prototype;\n\n\t  _proto11.getClassName = function getClassName() {\n\t    // In Python Keras, GlorotNormal is not a class, but a helper method\n\t    // that creates a VarianceScaling object. Use 'VarianceScaling' as\n\t    // class name to be compatible with that.\n\t    return VarianceScaling.className;\n\t  };\n\n\t  return GlorotNormal;\n\t}(VarianceScaling);\n\t/** @nocollapse */\n\n\tGlorotNormal.className = 'GlorotNormal';\n\tregisterClass(GlorotNormal);\n\tvar HeNormal = /*#__PURE__*/function (_VarianceScaling3) {\n\t  _inheritsLoose(HeNormal, _VarianceScaling3);\n\n\t  function HeNormal(args) {\n\t    return _VarianceScaling3.call(this, {\n\t      scale: 2.0,\n\t      mode: 'fanIn',\n\t      distribution: 'normal',\n\t      seed: args == null ? null : args.seed\n\t    }) || this;\n\t  }\n\n\t  var _proto12 = HeNormal.prototype;\n\n\t  _proto12.getClassName = function getClassName() {\n\t    // In Python Keras, HeNormal is not a class, but a helper method\n\t    // that creates a VarianceScaling object. Use 'VarianceScaling' as\n\t    // class name to be compatible with that.\n\t    return VarianceScaling.className;\n\t  };\n\n\t  return HeNormal;\n\t}(VarianceScaling);\n\t/** @nocollapse */\n\n\tHeNormal.className = 'HeNormal';\n\tregisterClass(HeNormal);\n\tvar HeUniform = /*#__PURE__*/function (_VarianceScaling4) {\n\t  _inheritsLoose(HeUniform, _VarianceScaling4);\n\n\t  function HeUniform(args) {\n\t    return _VarianceScaling4.call(this, {\n\t      scale: 2.0,\n\t      mode: 'fanIn',\n\t      distribution: 'uniform',\n\t      seed: args == null ? null : args.seed\n\t    }) || this;\n\t  }\n\n\t  var _proto13 = HeUniform.prototype;\n\n\t  _proto13.getClassName = function getClassName() {\n\t    // In Python Keras, HeUniform is not a class, but a helper method\n\t    // that creates a VarianceScaling object. Use 'VarianceScaling' as\n\t    // class name to be compatible with that.\n\t    return VarianceScaling.className;\n\t  };\n\n\t  return HeUniform;\n\t}(VarianceScaling);\n\t/** @nocollapse */\n\n\tHeUniform.className = 'HeUniform';\n\tregisterClass(HeUniform);\n\tvar LeCunNormal = /*#__PURE__*/function (_VarianceScaling5) {\n\t  _inheritsLoose(LeCunNormal, _VarianceScaling5);\n\n\t  function LeCunNormal(args) {\n\t    return _VarianceScaling5.call(this, {\n\t      scale: 1.0,\n\t      mode: 'fanIn',\n\t      distribution: 'normal',\n\t      seed: args == null ? null : args.seed\n\t    }) || this;\n\t  }\n\n\t  var _proto14 = LeCunNormal.prototype;\n\n\t  _proto14.getClassName = function getClassName() {\n\t    // In Python Keras, LeCunNormal is not a class, but a helper method\n\t    // that creates a VarianceScaling object. Use 'VarianceScaling' as\n\t    // class name to be compatible with that.\n\t    return VarianceScaling.className;\n\t  };\n\n\t  return LeCunNormal;\n\t}(VarianceScaling);\n\t/** @nocollapse */\n\n\tLeCunNormal.className = 'LeCunNormal';\n\tregisterClass(LeCunNormal);\n\tvar LeCunUniform = /*#__PURE__*/function (_VarianceScaling6) {\n\t  _inheritsLoose(LeCunUniform, _VarianceScaling6);\n\n\t  function LeCunUniform(args) {\n\t    return _VarianceScaling6.call(this, {\n\t      scale: 1.0,\n\t      mode: 'fanIn',\n\t      distribution: 'uniform',\n\t      seed: args == null ? null : args.seed\n\t    }) || this;\n\t  }\n\n\t  var _proto15 = LeCunUniform.prototype;\n\n\t  _proto15.getClassName = function getClassName() {\n\t    // In Python Keras, LeCunUniform is not a class, but a helper method\n\t    // that creates a VarianceScaling object. Use 'VarianceScaling' as\n\t    // class name to be compatible with that.\n\t    return VarianceScaling.className;\n\t  };\n\n\t  return LeCunUniform;\n\t}(VarianceScaling);\n\t/** @nocollapse */\n\n\tLeCunUniform.className = 'LeCunNormal';\n\tregisterClass(LeCunUniform);\n\tvar Orthogonal = /*#__PURE__*/function (_Initializer9) {\n\t  _inheritsLoose(Orthogonal, _Initializer9);\n\n\t  function Orthogonal(args) {\n\t    var _this9;\n\n\t    _this9 = _Initializer9.call(this) || this;\n\t    _this9.DEFAULT_GAIN = 1;\n\t    _this9.gain = args.gain == null ? _this9.DEFAULT_GAIN : args.gain;\n\t    _this9.seed = args.seed;\n\n\t    if (_this9.seed != null) {\n\t      throw new NotImplementedError('Random seed is not implemented for Orthogonal Initializer yet.');\n\t    }\n\n\t    return _this9;\n\t  }\n\n\t  var _proto16 = Orthogonal.prototype;\n\n\t  _proto16.apply = function apply(shape, dtype) {\n\t    var _this10 = this;\n\n\t    return tidy(function () {\n\t      if (shape.length < 2) {\n\t        throw new NotImplementedError('Shape must be at least 2D.');\n\t      }\n\n\t      if (shape[0] * shape[1] > 2000) {\n\t        console.warn(\"Orthogonal initializer is being called on a matrix with more \" + (\"than 2000 (\" + shape[0] * shape[1] + \") elements: \") + \"Slowness may result.\");\n\t      } // TODO(cais): Add seed support.\n\n\n\t      var normalizedShape = shape[0] > shape[1] ? [shape[1], shape[0]] : shape;\n\t      var a = randomNormal$1(normalizedShape, 0, 1, 'float32');\n\t      var q = linalg.gramSchmidt(a);\n\n\t      if (shape[0] > shape[1]) {\n\t        q = q.transpose();\n\t      }\n\n\t      return mul(_this10.gain, q);\n\t    });\n\t  };\n\n\t  _proto16.getConfig = function getConfig() {\n\t    return {\n\t      gain: this.gain,\n\t      seed: this.seed\n\t    };\n\t  };\n\n\t  return Orthogonal;\n\t}(Initializer);\n\t/** @nocollapse */\n\n\tOrthogonal.className = 'Orthogonal';\n\tregisterClass(Orthogonal); // Maps the JavaScript-like identifier keys to the corresponding registry\n\t// symbols.\n\n\tvar INITIALIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP = {\n\t  'constant': 'Constant',\n\t  'glorotNormal': 'GlorotNormal',\n\t  'glorotUniform': 'GlorotUniform',\n\t  'heNormal': 'HeNormal',\n\t  'heUniform': 'HeUniform',\n\t  'identity': 'Identity',\n\t  'leCunNormal': 'LeCunNormal',\n\t  'leCunUniform': 'LeCunUniform',\n\t  'ones': 'Ones',\n\t  'orthogonal': 'Orthogonal',\n\t  'randomNormal': 'RandomNormal',\n\t  'randomUniform': 'RandomUniform',\n\t  'truncatedNormal': 'TruncatedNormal',\n\t  'varianceScaling': 'VarianceScaling',\n\t  'zeros': 'Zeros'\n\t};\n\n\tfunction deserializeInitializer(config, customObjects) {\n\t  if (customObjects === void 0) {\n\t    customObjects = {};\n\t  }\n\n\t  return deserializeKerasObject(config, SerializationMap.getMap().classNameMap, customObjects, 'initializer');\n\t}\n\n\tfunction serializeInitializer(initializer) {\n\t  return serializeKerasObject(initializer);\n\t}\n\tfunction getInitializer(identifier) {\n\t  if (typeof identifier === 'string') {\n\t    var className = identifier in INITIALIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP ? INITIALIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP[identifier] : identifier;\n\t    /* We have four 'helper' classes for common initializers that\n\t    all get serialized as 'VarianceScaling' and shouldn't go through\n\t    the deserializeInitializer pathway. */\n\n\t    if (className === 'GlorotNormal') {\n\t      return new GlorotNormal();\n\t    } else if (className === 'GlorotUniform') {\n\t      return new GlorotUniform();\n\t    } else if (className === 'HeNormal') {\n\t      return new HeNormal();\n\t    } else if (className === 'HeUniform') {\n\t      return new HeUniform();\n\t    } else if (className === 'LeCunNormal') {\n\t      return new LeCunNormal();\n\t    } else if (className === 'LeCunUniform') {\n\t      return new LeCunUniform();\n\t    } else {\n\t      var config = {};\n\t      config['className'] = className;\n\t      config['config'] = {};\n\t      return deserializeInitializer(config);\n\t    }\n\t  } else if (identifier instanceof Initializer) {\n\t    return identifier;\n\t  } else {\n\t    return deserializeInitializer(identifier);\n\t  }\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\t/**\n\t * Initializer that generates tensors initialized to 0.\n\t *\n\t * @doc {heading: 'Initializers', namespace: 'initializers'}\n\t */\n\n\tfunction zeros$1() {\n\t  return new Zeros();\n\t}\n\t/**\n\t * Initializer that generates tensors initialized to 1.\n\t *\n\t * @doc {heading: 'Initializers', namespace: 'initializers'}\n\t */\n\n\tfunction ones$2() {\n\t  return new Ones();\n\t}\n\t/**\n\t * Initializer that generates values initialized to some constant.\n\t *\n\t * @doc {heading: 'Initializers', namespace: 'initializers'}\n\t */\n\n\tfunction constant(args) {\n\t  return new Constant(args);\n\t}\n\t/**\n\t * Initializer that generates random values initialized to a uniform\n\t * distribution.\n\t *\n\t * Values will be distributed uniformly between the configured minval and\n\t * maxval.\n\t *\n\t * @doc {heading: 'Initializers', namespace: 'initializers'}\n\t */\n\n\tfunction randomUniform$1(args) {\n\t  return new RandomUniform(args);\n\t}\n\t/**\n\t * Initializer that generates random values initialized to a normal\n\t * distribution.\n\t *\n\t * @doc {heading: 'Initializers', namespace: 'initializers'}\n\t */\n\n\tfunction randomNormal$2(args) {\n\t  return new RandomNormal(args);\n\t}\n\t/**\n\t * Initializer that generates random values initialized to a truncated normal.\n\t * distribution.\n\t *\n\t * These values are similar to values from a `RandomNormal` except that values\n\t * more than two standard deviations from the mean are discarded and re-drawn.\n\t * This is the recommended initializer for neural network weights and filters.\n\t *\n\t * @doc {heading: 'Initializers', namespace: 'initializers'}\n\t */\n\n\tfunction truncatedNormal$1(args) {\n\t  return new TruncatedNormal(args);\n\t}\n\t/**\n\t * Initializer that generates the identity matrix.\n\t * Only use for square 2D matrices.\n\t *\n\t * @doc {heading: 'Initializers', namespace: 'initializers'}\n\t */\n\n\tfunction identity(args) {\n\t  return new Identity$1(args);\n\t}\n\t/**\n\t * Initializer capable of adapting its scale to the shape of weights.\n\t * With distribution=NORMAL, samples are drawn from a truncated normal\n\t * distribution centered on zero, with `stddev = sqrt(scale / n)` where n is:\n\t *   - number of input units in the weight tensor, if mode = FAN_IN.\n\t *   - number of output units, if mode = FAN_OUT.\n\t *   - average of the numbers of input and output units, if mode = FAN_AVG.\n\t * With distribution=UNIFORM,\n\t * samples are drawn from a uniform distribution\n\t * within [-limit, limit], with `limit = sqrt(3 * scale / n)`.\n\t *\n\t * @doc {heading: 'Initializers',namespace: 'initializers'}\n\t */\n\n\tfunction varianceScaling(config) {\n\t  return new VarianceScaling(config);\n\t}\n\t/**\n\t * Glorot uniform initializer, also called Xavier uniform initializer.\n\t * It draws samples from a uniform distribution within [-limit, limit]\n\t * where `limit` is `sqrt(6 / (fan_in + fan_out))`\n\t * where `fan_in` is the number of input units in the weight tensor\n\t * and `fan_out` is the number of output units in the weight tensor\n\t *\n\t * Reference:\n\t *   Glorot & Bengio, AISTATS 2010\n\t *       http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf.\n\t *\n\t * @doc {heading: 'Initializers', namespace: 'initializers'}\n\t */\n\n\tfunction glorotUniform(args) {\n\t  return new GlorotUniform(args);\n\t}\n\t/**\n\t * Glorot normal initializer, also called Xavier normal initializer.\n\t * It draws samples from a truncated normal distribution centered on 0\n\t * with `stddev = sqrt(2 / (fan_in + fan_out))`\n\t * where `fan_in` is the number of input units in the weight tensor\n\t * and `fan_out` is the number of output units in the weight tensor.\n\t *\n\t * Reference:\n\t *   Glorot & Bengio, AISTATS 2010\n\t *       http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf\n\t *\n\t * @doc {heading: 'Initializers', namespace: 'initializers'}\n\t */\n\n\tfunction glorotNormal(args) {\n\t  return new GlorotNormal(args);\n\t}\n\t/**\n\t * He normal initializer.\n\t *\n\t * It draws samples from a truncated normal distribution centered on 0\n\t * with `stddev = sqrt(2 / fanIn)`\n\t * where `fanIn` is the number of input units in the weight tensor.\n\t *\n\t * Reference:\n\t *     He et al., http://arxiv.org/abs/1502.01852\n\t *\n\t * @doc {heading: 'Initializers', namespace: 'initializers'}\n\t */\n\n\tfunction heNormal(args) {\n\t  return new HeNormal(args);\n\t}\n\t/**\n\t * He uniform initializer.\n\t *\n\t * It draws samples from a uniform distribution within [-limit, limit]\n\t * where `limit` is `sqrt(6 / fan_in)`\n\t * where `fanIn` is the number of input units in the weight tensor.\n\t *\n\t * Reference:\n\t *     He et al., http://arxiv.org/abs/1502.01852\n\t *\n\t * @doc {heading: 'Initializers',namespace: 'initializers'}\n\t */\n\n\tfunction heUniform(args) {\n\t  return new HeUniform(args);\n\t}\n\t/**\n\t * LeCun normal initializer.\n\t *\n\t * It draws samples from a truncated normal distribution centered on 0\n\t * with `stddev = sqrt(1 / fanIn)`\n\t * where `fanIn` is the number of input units in the weight tensor.\n\t *\n\t * References:\n\t *   [Self-Normalizing Neural Networks](https://arxiv.org/abs/1706.02515)\n\t *   [Efficient Backprop](http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf)\n\t *\n\t * @doc {heading: 'Initializers', namespace: 'initializers'}\n\t */\n\n\tfunction leCunNormal(args) {\n\t  return new LeCunNormal(args);\n\t}\n\t/**\n\t * LeCun uniform initializer.\n\t *\n\t * It draws samples from a uniform distribution in the interval\n\t * `[-limit, limit]` with `limit = sqrt(3 / fanIn)`,\n\t * where `fanIn` is the number of input units in the weight tensor.\n\t *\n\t * @doc {heading: 'Initializers', namespace: 'initializers'}\n\t */\n\n\tfunction leCunUniform(args) {\n\t  return new LeCunUniform(args);\n\t}\n\t/**\n\t * Initializer that generates a random orthogonal matrix.\n\t *\n\t * Reference:\n\t * [Saxe et al., http://arxiv.org/abs/1312.6120](http://arxiv.org/abs/1312.6120)\n\t *\n\t * @doc {heading: 'Initializers', namespace: 'initializers'}\n\t */\n\n\tfunction orthogonal(args) {\n\t  return new Orthogonal(args);\n\t}\n\n\tvar exports_initializers = {\n\t\t__proto__: null,\n\t\tzeros: zeros$1,\n\t\tones: ones$2,\n\t\tconstant: constant,\n\t\trandomUniform: randomUniform$1,\n\t\trandomNormal: randomNormal$2,\n\t\ttruncatedNormal: truncatedNormal$1,\n\t\tidentity: identity,\n\t\tvarianceScaling: varianceScaling,\n\t\tglorotUniform: glorotUniform,\n\t\tglorotNormal: glorotNormal,\n\t\theNormal: heNormal,\n\t\theUniform: heUniform,\n\t\tleCunNormal: leCunNormal,\n\t\tleCunUniform: leCunUniform,\n\t\torthogonal: orthogonal\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\n\t/**\n\t * Utilities related to persistent state in the backend.\n\t */\n\n\t/**\n\t * An ID to track `tf.SymbolicTensor`s and derived classes.\n\t * Required in different places in engine/topology.ts to identify unique\n\t * tensors.\n\t */\n\tvar _nextUniqueTensorId = 0;\n\tfunction getNextUniqueTensorId() {\n\t  return _nextUniqueTensorId++;\n\t}\n\tvar _uidPrefixes = {};\n\t/**\n\t * Provides a unique UID given a string prefix.\n\t *\n\t * @param prefix\n\t */\n\n\tfunction getUid(prefix) {\n\t  if (prefix === void 0) {\n\t    prefix = '';\n\t  }\n\n\t  if (!(prefix in _uidPrefixes)) {\n\t    _uidPrefixes[prefix] = 0;\n\t  }\n\n\t  _uidPrefixes[prefix] += 1;\n\t  return prefix + _uidPrefixes[prefix].toString();\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\n\t/**\n\t * Determine whether the input is an Array of Shapes.\n\t */\n\n\tfunction isArrayOfShapes(x) {\n\t  return Array.isArray(x) && Array.isArray(x[0]);\n\t}\n\t/**\n\t * Special case of normalizing shapes to lists.\n\t *\n\t * @param x A shape or list of shapes to normalize into a list of Shapes.\n\t * @return A list of Shapes.\n\t */\n\n\tfunction normalizeShapeList(x) {\n\t  if (x.length === 0) {\n\t    return [];\n\t  }\n\n\t  if (!Array.isArray(x[0])) {\n\t    return [x];\n\t  }\n\n\t  return x;\n\t}\n\t/**\n\t * Helper function to obtain exactly one Tensor.\n\t * @param xs: A single `tf.Tensor` or an `Array` of `tf.Tensor`s.\n\t * @return A single `tf.Tensor`. If `xs` is an `Array`, return the first one.\n\t * @throws ValueError: If `xs` is an `Array` and its length is not 1.\n\t */\n\n\tfunction getExactlyOneTensor(xs) {\n\t  var x;\n\n\t  if (Array.isArray(xs)) {\n\t    if (xs.length !== 1) {\n\t      throw new ValueError(\"Expected Tensor length to be 1; got \" + xs.length);\n\t    }\n\n\t    x = xs[0];\n\t  } else {\n\t    x = xs;\n\t  }\n\n\t  return x;\n\t}\n\t/**\n\t * Helper function to obtain exactly on instance of Shape.\n\t *\n\t * @param shapes Input single `Shape` or Array of `Shape`s.\n\t * @returns If input is a single `Shape`, return it unchanged. If the input is\n\t *   an `Array` containing exactly one instance of `Shape`, return the instance.\n\t *   Otherwise, throw a `ValueError`.\n\t * @throws ValueError: If input is an `Array` of `Shape`s, and its length is not\n\t *   1.\n\t */\n\n\tfunction getExactlyOneShape(shapes) {\n\t  if (Array.isArray(shapes) && Array.isArray(shapes[0])) {\n\t    if (shapes.length === 1) {\n\t      shapes = shapes;\n\t      return shapes[0];\n\t    } else {\n\t      throw new ValueError(\"Expected exactly 1 Shape; got \" + shapes.length);\n\t    }\n\t  } else {\n\t    return shapes;\n\t  }\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\n\t/**\n\t * Count the elements in an Array of LayerVariables.\n\t *\n\t * @param weights: The LayerVariables of which the constituent numbers are to\n\t *   be counted.\n\t * @returns A count of the elements in all the LayerVariables\n\t */\n\tfunction countParamsInWeights(weights) {\n\t  var count = 0;\n\n\t  for (var _iterator = _createForOfIteratorHelperLoose(weights), _step; !(_step = _iterator()).done;) {\n\t    var weight = _step.value;\n\n\t    if (weight.shape.length === 0) {\n\t      count += 1;\n\t    } else {\n\t      count += weight.shape.reduce(function (a, b) {\n\t        return a * b;\n\t      });\n\t    }\n\t  }\n\n\t  return count;\n\t}\n\n\tvar DEFAULT_VARIABLE_NAME_PREFIX = 'Variable';\n\t/**\n\t * A `tf.layers.LayerVariable` is similar to a `tf.Tensor` in that it has a\n\t * dtype and shape, but its value is mutable.  The value is itself represented\n\t * as a`tf.Tensor`, and can be read with the `read()` method and updated with\n\t * the `write()` method.\n\t */\n\n\tvar LayerVariable = /*#__PURE__*/function () {\n\t  /**\n\t   * Construct Variable from a `tf.Tensor`.\n\t   *\n\t   * If not explicitly named, the Variable will be given a name with the\n\t   * prefix 'Variable'. Variable names are unique. In the case of name\n\t   * collision, suffixies '_<num>' will be added to the name.\n\t   *\n\t   * @param val Initial value of the Variable.\n\t   * @param name Name of the variable. If `null` or `undefined` is provided, it\n\t   *   will default a name with the prefix 'Variable'.\n\t   * @param constraint Optional, projection function to be applied to the\n\t   * variable after optimize updates\n\t   * @throws ValueError if `name` is `null` or `undefined`.\n\t   */\n\t  function LayerVariable(val, dtype, name, trainable, constraint) {\n\t    if (dtype === void 0) {\n\t      dtype = 'float32';\n\t    }\n\n\t    if (name === void 0) {\n\t      name = DEFAULT_VARIABLE_NAME_PREFIX;\n\t    }\n\n\t    if (trainable === void 0) {\n\t      trainable = true;\n\t    }\n\n\t    if (constraint === void 0) {\n\t      constraint = null;\n\t    }\n\n\t    this.dtype = dtype == null ? 'float32' : dtype;\n\t    this.shape = val.shape;\n\t    this.id = getNextUniqueTensorId();\n\t    name = name == null ? DEFAULT_VARIABLE_NAME_PREFIX : name;\n\t    this.originalName = getScopedTensorName(name);\n\t    this.name = getUniqueTensorName(this.originalName);\n\t    this.trainable_ = trainable;\n\t    this.constraint = constraint;\n\t    this.val = variable(val, this.trainable_, this.name, this.dtype);\n\t  }\n\t  /**\n\t   * Get a snapshot of the Variable's value.\n\t   *\n\t   * The returned value is a snapshot of the Variable's value at the time of\n\t   * the invocation. Future mutations in the value of the tensor will only\n\t   * be reflected by future calls to this method.\n\t   */\n\n\n\t  var _proto = LayerVariable.prototype;\n\n\t  _proto.read = function read() {\n\t    this.assertNotDisposed();\n\t    return this.val;\n\t  }\n\t  /**\n\t   * Update the value of the Variable.\n\t   *\n\t   * @param newVal: The new value to update to. Must be consistent with the\n\t   *   dtype and shape of the Variable.\n\t   * @return This Variable.\n\t   */\n\t  ;\n\n\t  _proto.write = function write(newVal) {\n\t    // TODO(cais): Once  TF.js Core supports Tensor.dtype, check dtype match.\n\t    this.assertNotDisposed();\n\t    checkShapesMatch(this.val, newVal); // Skip updating if this is the exact same tensor.\n\n\t    if (this.val.id !== newVal.id) {\n\t      this.val.assign(newVal);\n\n\t      if (this.constraint != null) {\n\t        this.val.assign(this.constraint.apply(this.val));\n\t      }\n\t    }\n\n\t    return this;\n\t  }\n\t  /**\n\t   * Dispose this LayersVariable instance from memory.\n\t   */\n\t  ;\n\n\t  _proto.dispose = function dispose() {\n\t    this.assertNotDisposed();\n\t    this.val.dispose();\n\t  };\n\n\t  _proto.assertNotDisposed = function assertNotDisposed() {\n\t    if (this.val.isDisposed) {\n\t      throw new Error(\"LayersVariable \" + this.name + \" is already disposed.\");\n\t    }\n\t  };\n\n\t  _createClass(LayerVariable, [{\n\t    key: \"trainable\",\n\t    get: function get() {\n\t      return this.trainable_;\n\t    },\n\t    set: function set(trainable) {\n\t      this.trainable_ = trainable;\n\t      this.val.trainable = trainable;\n\t    }\n\t  }]);\n\n\t  return LayerVariable;\n\t}();\n\n\tfunction checkShapesMatch(x, y) {\n\t  if (x.shape.toString() !== y.shape.toString()) {\n\t    throw new Error('Shape mismatch: ' + JSON.stringify(x.shape) + ' vs. ' + JSON.stringify(y.shape));\n\t  }\n\t}\n\t/**\n\t * Create a Variable.\n\t * @param x The initial value of the `Variable`.\n\t * @param dtype optional, the type of the variable.\n\t * @param name optional, the name of the variable, default provided by\n\t * Variable.\n\t * @param constraint optional, a constraint to be applied after every update.\n\t * @return The newly instantiated `Variable`.\n\t */\n\n\n\tfunction variable$1(x, dtype, name, constraint) {\n\t  return new LayerVariable(x, dtype, name, true, constraint);\n\t}\n\t/**\n\t * Instantiates an all-zeros Variable and returns it.\n\t *\n\t * @param shape Shape of the tensor.\n\t * @param dtype DType of the tensor.\n\t * @param name Name of the tensor.\n\t * @return An all-zero Variable.\n\t */\n\n\tfunction zerosVariable(shape, dtype, name) {\n\t  // TODO(cais): Implement logic for dtype.\n\t  return new LayerVariable(zeros(shape), dtype, name);\n\t}\n\t/**\n\t * Instantiates an all-zeros tensor of the same shape as another tensor.\n\t *\n\t * @param x The other tensor.\n\t * @param dtype DType of the tensor.\n\t * @param name Name of the tensor.\n\t * @return A newly instantiated Variable.\n\t */\n\n\tfunction zerosLike$1(x, dtype, name) {\n\t  return new LayerVariable(zerosLike(x), dtype, name);\n\t}\n\t/**\n\t * Instantiates an all-ones tensor and returns it.\n\t *\n\t * @param shape Shape of the tensor.\n\t * @param dtype DType of the tensor.\n\t * @param name Name of the tensor.\n\t * @return An all-ones Variable.\n\t */\n\n\tfunction onesVariable(shape, dtype, name) {\n\t  // TODO(cais): Implement logic for dtype.\n\t  var allocated = ones$1(shape);\n\t  return new LayerVariable(allocated, dtype, name);\n\t}\n\t/**\n\t * Instantiates an all-ones tensor of the same shape as another tensor.\n\t *\n\t * @param x The other tensor.\n\t * @param dtype DType of the tensor.\n\t * @param name Name of the tensor.\n\t * @return A newly instantiated Variable.\n\t */\n\n\tfunction onesLike$1(x, dtype, name) {\n\t  var allocated = onesLike(x);\n\t  return new LayerVariable(allocated, dtype, name);\n\t}\n\t/**\n\t * Instantiate an identity matrix and returns it, as a Variable\n\t *\n\t * @param size Number of rows/columns.\n\t * @param dtype Data type of returned Variable.\n\t * @param name Name of returned Variable.\n\t * @return A Variable, an identity matrix.\n\t */\n\n\tfunction eyeVariable(size, dtype, name) {\n\t  return new LayerVariable(eye(size), dtype, name);\n\t}\n\t/**\n\t * Get a Variable with uniform distribution of values.\n\t * @param shape Shape of the tensor.\n\t * @param minval Lower bound of the uniform distribution.\n\t * @param maxval Upper bound of the uniform distribution.\n\t * @param dtype\n\t * @param seed\n\t * @param name Optional name.\n\t * @return The uniform-random Variable.\n\t */\n\n\tfunction randomUniformVariable(shape, minval, maxval, dtype, seed, name) {\n\t  if (name === void 0) {\n\t    name = 'randomUniform';\n\t  }\n\n\t  return new LayerVariable(randomUniform(shape, minval, maxval, dtype), dtype, name);\n\t}\n\t/**\n\t * Get a Variable with truncated-normal distribution of values.\n\t * @param shape Shape of the tensor.\n\t * @param mean mean value of the normal distribution.\n\t * @param stddev standard deviation of the normal distribution.\n\t * @param dtype\n\t * @param seed\n\t * @param name Optional name.\n\t * @return The truncated-normal-random Variable.\n\t */\n\n\tfunction truncatedNormalVariable(shape, mean, stddev, dtype, seed, name) {\n\t  if (mean === void 0) {\n\t    mean = 0.0;\n\t  }\n\n\t  if (stddev === void 0) {\n\t    stddev = 1.0;\n\t  }\n\n\t  if (name === void 0) {\n\t    name = 'truncatedNormal';\n\t  }\n\n\t  // TODO(cais): Implement logic for dtype and seed once they are supported\n\t  // by deeplearn.js.\n\t  dtype = dtype || 'float32';\n\n\t  if (dtype !== 'float32' && dtype !== 'int32') {\n\t    throw new NotImplementedError(\"randomNormal does not support dType \" + dtype + \".\");\n\t  }\n\n\t  return new LayerVariable(truncatedNormal(shape, mean, stddev, dtype, seed), dtype, name);\n\t}\n\t/**\n\t * Get a Variable with normal distribution of values.\n\t * @param shape Shape of the tensor.\n\t * @param mean mean value of the normal distribution.\n\t * @param stddev standard deviation of the normal distribution.\n\t * @param dtype\n\t * @param seed\n\t * @param name Optional name.\n\t * @return The truncated-normal-random Variable.\n\t */\n\n\tfunction randomNormalVariable(shape, mean, stddev, dtype, seed, name) {\n\t  if (mean === void 0) {\n\t    mean = 0.0;\n\t  }\n\n\t  if (stddev === void 0) {\n\t    stddev = 1.0;\n\t  }\n\n\t  if (name === void 0) {\n\t    name = 'randomNormal';\n\t  }\n\n\t  dtype = dtype || 'float32';\n\n\t  if (dtype !== 'float32' && dtype !== 'int32') {\n\t    throw new NotImplementedError(\"randomNormalVariable does not support dType \" + dtype + \".\");\n\t  }\n\n\t  return new LayerVariable(randomNormal(shape, mean, stddev, dtype, seed), dtype, name);\n\t}\n\t/**\n\t * Update the value of a Variable.\n\t * @param x The Variable to be updated.\n\t * @param xNew The new value to update to.\n\t * @return The Variable updated.\n\t */\n\n\tfunction update(x, xNew) {\n\t  return x.write(xNew);\n\t}\n\t/**\n\t * Update the value of a Variable by adding an increment.\n\t * @param x The Variable to be updated.\n\t * @param increment The incrment to add to `x`.\n\t * @return The Variable updated.\n\t */\n\n\tfunction updateAdd(x, increment) {\n\t  return x.write(add$1(x.read(), increment));\n\t}\n\t/**\n\t * Update the value of a Variable by subtracting a decrement.\n\t * @param x The Variable to be updated.\n\t * @param decrement The decrement to subtract from `x`.\n\t * @return The Variable updated.\n\t */\n\n\tfunction updateSub(x, decrement) {\n\t  return x.write(sub(x.read(), decrement));\n\t}\n\t/**\n\t * Get the values of an array of Variables.\n\t *\n\t * @param tensors An `Array` of `Variable`s to get the values of.\n\t * @return The values of the inputs, as an `Array` of`tf.Tensor`s.\n\t */\n\n\tfunction batchGetValue(xs) {\n\t  return xs.map(function (x) {\n\t    return x.read();\n\t  });\n\t}\n\t/**\n\t * Update the value of multiple Variables at once.\n\t *\n\t * @param variablesAndValues An `Array`, each element is of type\n\t *   [Variable, Tensor]. The first item is the\n\t *   `Variable` of which the value is to be updated. The second item\n\t *   carries the new value.\n\t */\n\n\tfunction batchSetValue(variablesAndValues) {\n\t  variablesAndValues.forEach(function (variableAndValue) {\n\t    var variable = variableAndValue[0];\n\t    variable.write(variableAndValue[1]);\n\t  });\n\t}\n\t/**\n\t * Returns the gradients of `variables` w.r.t. the return value of `lossFn`.\n\t * @param lossFn A function which returns a Scalar to be used as the function\n\t *   value (i.e., numerator) for differentiation.\n\t * @param variables List of variables to be used as the independent variables\n\t *   (i.e., denominator) for differentiation.\n\t * @returns An Array of gradients tensors.\n\t */\n\n\tfunction gradients(lossFn, variables) {\n\t  // TODO(cais): The return type signature can be simplified if deeplearn makes\n\t  //   the corresponding type public.\n\t  var variableList = variables.map(function (variable) {\n\t    return variable.read();\n\t  });\n\t  var valudAndGrads = variableGrads(lossFn, variableList);\n\t  return variables.map(function (variable) {\n\t    return valudAndGrads.grads[variable.name];\n\t  });\n\t}\n\n\t/**\n\t * Specifies the ndim, dtype and shape of every input to a layer.\n\t *\n\t * Every layer should expose (if appropriate) an `inputSpec` attribute:\n\t * a list of instances of InputSpec (one per input tensor).\n\t *\n\t * A null entry in a shape is compatible with any dimension,\n\t * a null shape is compatible with any shape.\n\t */\n\n\tvar InputSpec = function InputSpec(args) {\n\t  this.dtype = args.dtype;\n\t  this.shape = args.shape;\n\t  /*\n\t    TODO(michaelterry): Could throw error if ndim and shape are both defined\n\t      (then backport).\n\t  */\n\n\t  if (args.shape != null) {\n\t    this.ndim = args.shape.length;\n\t  } else {\n\t    this.ndim = args.ndim;\n\t  }\n\n\t  this.maxNDim = args.maxNDim;\n\t  this.minNDim = args.minNDim;\n\t  this.axes = args.axes || {};\n\t};\n\t/**\n\t * `tf.SymbolicTensor` is a placeholder for a Tensor without any concrete value.\n\t *\n\t * They are most often encountered when building a graph of `Layer`s for a\n\t * a `tf.LayersModel` and the input data's shape, but not values are known.\n\t *\n\t * @doc {heading: 'Models', 'subheading': 'Classes'}\n\t */\n\n\tvar SymbolicTensor =\n\t/**\n\t *\n\t * @param dtype\n\t * @param shape\n\t * @param sourceLayer The Layer that produced this symbolic tensor.\n\t * @param inputs The inputs passed to sourceLayer's __call__() method.\n\t * @param nodeIndex\n\t * @param tensorIndex\n\t * @param callArgs The keyword arguments passed to the __call__() method.\n\t * @param name\n\t * @param outputTensorIndex The index of this tensor in the list of outputs\n\t *   returned by apply().\n\t */\n\tfunction SymbolicTensor(dtype, shape, sourceLayer, inputs, callArgs, name, outputTensorIndex) {\n\t  this.dtype = dtype;\n\t  this.shape = shape;\n\t  this.sourceLayer = sourceLayer;\n\t  this.inputs = inputs;\n\t  this.callArgs = callArgs;\n\t  this.outputTensorIndex = outputTensorIndex;\n\t  this.id = getNextUniqueTensorId();\n\n\t  if (name != null) {\n\t    this.originalName = getScopedTensorName(name);\n\t    this.name = getUniqueTensorName(this.originalName);\n\t  }\n\n\t  this.rank = shape.length;\n\t};\n\tvar _nextNodeID = 0;\n\t/**\n\t * A `Node` describes the connectivity between two layers.\n\t *\n\t * Each time a layer is connected to some new input,\n\t * a node is added to `layer.inboundNodes`.\n\t *\n\t * Each time the output of a layer is used by another layer,\n\t * a node is added to `layer.outboundNodes`.\n\t *\n\t * `nodeIndices` and `tensorIndices` are basically fine-grained coordinates\n\t * describing the origin of the `inputTensors`, verifying the following:\n\t *\n\t * `inputTensors[i] ==\n\t * inboundLayers[i].inboundNodes[nodeIndices[i]].outputTensors[\n\t *   tensorIndices[i]]`\n\t *\n\t * A node from layer A to layer B is added to:\n\t *     A.outboundNodes\n\t *     B.inboundNodes\n\t */\n\n\tvar Node = /*#__PURE__*/function () {\n\t  function Node(args, // TODO(michaelterry): Define actual type for this.\n\t  callArgs) {\n\t    this.callArgs = callArgs;\n\t    this.id = _nextNodeID++;\n\t    /*\n\t      Layer instance (NOT a list).\n\t      this is the layer that takes a list of input tensors\n\t      and turns them into a list of output tensors.\n\t      the current node will be added to\n\t      the inboundNodes of outboundLayer.\n\t    */\n\n\t    this.outboundLayer = args.outboundLayer;\n\t    /*\n\t        The following 3 properties describe where\n\t        the input tensors come from: which layers,\n\t        and for each layer, which node and which\n\t        tensor output of each node.\n\t    */\n\t    // List of layer instances.\n\n\t    this.inboundLayers = args.inboundLayers; // List of integers, 1:1 mapping with inboundLayers.\n\n\t    this.nodeIndices = args.nodeIndices; // List of integers, 1:1 mapping with inboundLayers.\n\n\t    this.tensorIndices = args.tensorIndices;\n\t    /*\n\t        Following 2 properties:\n\t        tensor inputs and outputs of outboundLayer.\n\t    */\n\t    // List of tensors. 1:1 mapping with inboundLayers.\n\n\t    this.inputTensors = args.inputTensors; // List of tensors, created by outboundLayer.call().\n\n\t    this.outputTensors = args.outputTensors;\n\t    /*\n\t        Following 2 properties: input and output masks.\n\t        List of tensors, 1:1 mapping with inputTensor.\n\t    */\n\n\t    this.inputMasks = args.inputMasks; // List of tensors, created by outboundLayer.computeMask().\n\n\t    this.outputMasks = args.outputMasks; // Following 2 properties: input and output shapes.\n\t    // List of shape tuples, shapes of inputTensors.\n\n\t    this.inputShapes = args.inputShapes; // List of shape tuples, shapes of outputTensors.\n\n\t    this.outputShapes = args.outputShapes; // Add nodes to all layers involved.\n\n\t    for (var _iterator = _createForOfIteratorHelperLoose(args.inboundLayers), _step; !(_step = _iterator()).done;) {\n\t      var layer = _step.value;\n\n\t      if (layer != null) {\n\t        layer.outboundNodes.push(this);\n\t      }\n\t    }\n\n\t    args.outboundLayer.inboundNodes.push(this);\n\t  }\n\n\t  var _proto = Node.prototype;\n\n\t  _proto.getConfig = function getConfig() {\n\t    var inboundNames = [];\n\n\t    for (var _iterator2 = _createForOfIteratorHelperLoose(this.inboundLayers), _step2; !(_step2 = _iterator2()).done;) {\n\t      var layer = _step2.value;\n\n\t      if (layer != null) {\n\t        inboundNames.push(layer.name);\n\t      } else {\n\t        inboundNames.push(null);\n\t      }\n\t    }\n\n\t    return {\n\t      outboundLayer: this.outboundLayer ? this.outboundLayer.name : null,\n\t      inboundLayers: inboundNames,\n\t      nodeIndices: this.nodeIndices,\n\t      tensorIndices: this.tensorIndices\n\t    };\n\t  };\n\n\t  return Node;\n\t}();\n\tvar _nextLayerID = 0;\n\t/**\n\t * A layer is a grouping of operations and weights that can be composed to\n\t * create a `tf.LayersModel`.\n\t *\n\t * Layers are constructed by using the functions under the\n\t * [tf.layers](#Layers-Basic) namespace.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Classes', namespace: 'layers'}\n\t */\n\n\tvar Layer = /*#__PURE__*/function (_serialization$Serial) {\n\t  _inheritsLoose(Layer, _serialization$Serial);\n\n\t  function Layer(args) {\n\t    var _this;\n\n\t    if (args === void 0) {\n\t      args = {};\n\t    }\n\n\t    _this = _serialization$Serial.call(this) || this;\n\t    _this._callHook = null;\n\t    _this._addedWeightNames = []; // Porting Notes: PyKeras does not have this property in this base Layer\n\t    //   class. Instead lets Layer subclass set it dynamically and checks the\n\t    //   value with `hasattr`. In tfjs-layers, we let this be a member of this\n\t    //   base class.\n\n\t    _this._stateful = false;\n\t    _this.id = _nextLayerID++;\n\t    _this.activityRegularizer = null;\n\t    _this.inputSpec = null;\n\t    _this.supportsMasking = false; // These properties will be set upon call of this.build()\n\n\t    _this._trainableWeights = [];\n\t    _this._nonTrainableWeights = [];\n\t    _this._losses = [];\n\t    _this._updates = [];\n\t    _this._built = false;\n\t    /*\n\t      These lists will be filled via successive calls\n\t      to this.addInboundNode().\n\t     */\n\n\t    _this.inboundNodes = [];\n\t    _this.outboundNodes = [];\n\t    var name = args.name;\n\n\t    if (!name) {\n\t      var prefix = _this.getClassName();\n\n\t      name = toSnakeCase(prefix) + '_' + getUid(prefix);\n\t    }\n\n\t    _this.name = name;\n\t    _this.trainable_ = args.trainable == null ? true : args.trainable;\n\n\t    if (args.inputShape != null || args.batchInputShape != null) {\n\t      /*\n\t        In this case we will later create an input layer\n\t        to insert before the current layer\n\t       */\n\t      var batchInputShape;\n\n\t      if (args.batchInputShape != null) {\n\t        batchInputShape = args.batchInputShape;\n\t      } else if (args.inputShape != null) {\n\t        var batchSize = null;\n\n\t        if (args.batchSize != null) {\n\t          batchSize = args.batchSize;\n\t        }\n\n\t        batchInputShape = [batchSize].concat(args.inputShape);\n\t      }\n\n\t      _this.batchInputShape = batchInputShape; // Set dtype.\n\n\t      var dtype = args.dtype;\n\n\t      if (dtype == null) {\n\t        dtype = args.inputDType;\n\t      }\n\n\t      if (dtype == null) {\n\t        dtype = 'float32';\n\t      }\n\n\t      _this.dtype = dtype;\n\t    }\n\n\t    if (args.weights != null) {\n\t      _this.initialWeights = args.weights;\n\t    } else {\n\t      _this.initialWeights = null;\n\t    } // The value of `_refCount` is initialized to null. When the layer is used\n\t    // in a symbolic way for the first time, it will be set to 1.\n\n\n\t    _this._refCount = null;\n\t    _this.fastWeightInitDuringBuild = false;\n\t    return _this;\n\t  }\n\t  /**\n\t   * Converts a layer and its index to a unique (immutable type) name.\n\t   * This function is used internally with `this.containerNodes`.\n\t   * @param layer The layer.\n\t   * @param nodeIndex The layer's position (e.g. via enumerate) in a list of\n\t   *   nodes.\n\t   *\n\t   * @returns The unique name.\n\t   */\n\n\n\t  Layer.nodeKey = function nodeKey(layer, nodeIndex) {\n\t    return layer.name + '_ib-' + nodeIndex.toString();\n\t  }\n\t  /**\n\t   * Returns this.inboundNode at index nodeIndex.\n\t   *\n\t   * Porting note: This is a replacement for _get_node_attribute_at_index()\n\t   * @param nodeIndex\n\t   * @param attrName The name of the attribute related to request for this node.\n\t   */\n\t  ;\n\n\t  var _proto2 = Layer.prototype;\n\n\t  _proto2.getNodeAtIndex = function getNodeAtIndex(nodeIndex, attrName) {\n\t    if (this.inboundNodes.length === 0) {\n\t      throw new RuntimeError('The layer has never been called ' + (\"and thus has no defined \" + attrName + \".\"));\n\t    }\n\n\t    if (this.inboundNodes.length <= nodeIndex) {\n\t      throw new ValueError(\"Asked to get \" + attrName + \" at node \" + nodeIndex + \", \" + (\"but the layer has only \" + this.inboundNodes.length + \" inbound nodes.\"));\n\t    }\n\n\t    return this.inboundNodes[nodeIndex];\n\t  }\n\t  /**\n\t   * Retrieves the input tensor(s) of a layer at a given node.\n\t   *\n\t   * @param nodeIndex Integer, index of the node from which to retrieve the\n\t   *   attribute. E.g. `nodeIndex=0` will correspond to the first time the layer\n\t   *   was called.\n\t   *\n\t   * @return A tensor (or list of tensors if the layer has multiple inputs).\n\t   */\n\t  ;\n\n\t  _proto2.getInputAt = function getInputAt(nodeIndex) {\n\t    return singletonOrArray(this.getNodeAtIndex(nodeIndex, 'input').inputTensors);\n\t  }\n\t  /**\n\t   * Retrieves the output tensor(s) of a layer at a given node.\n\t   *\n\t   * @param nodeIndex Integer, index of the node from which to retrieve the\n\t   *   attribute. E.g. `nodeIndex=0` will correspond to the first time the layer\n\t   *   was called.\n\t   *\n\t   * @return A tensor (or list of tensors if the layer has multiple outputs).\n\t   */\n\t  ;\n\n\t  _proto2.getOutputAt = function getOutputAt(nodeIndex) {\n\t    return singletonOrArray(this.getNodeAtIndex(nodeIndex, 'output').outputTensors);\n\t  } // Properties\n\n\t  /**\n\t   * Retrieves the input tensor(s) of a layer.\n\t   *\n\t   * Only applicable if the layer has exactly one inbound node,\n\t   * i.e. if it is connected to one incoming layer.\n\t   *\n\t   * @return Input tensor or list of input tensors.\n\t   *\n\t   * @exception AttributeError if the layer is connected to more than one\n\t   *   incoming layers.\n\t   */\n\t  ;\n\n\t  /**\n\t   * Retrieves the Layer's current loss values.\n\t   *\n\t   * Used for regularizers during training.\n\t   */\n\t  _proto2.calculateLosses = function calculateLosses() {\n\t    // Porting Node: This is an augmentation to Layer.loss in PyKeras.\n\t    //   In PyKeras, Layer.loss returns symbolic tensors. Here a concrete\n\t    //   Tensor (specifically Scalar) values are returned. This is due to the\n\t    //   imperative backend.\n\t    return this.losses.map(function (lossFn) {\n\t      return lossFn();\n\t    });\n\t  };\n\n\t  /**\n\t   * Reset the states of the layer.\n\t   *\n\t   * This method of the base Layer class is essentially a no-op.\n\t   * Subclasses that are stateful (e.g., stateful RNNs) should override this\n\t   * method.\n\t   */\n\t  _proto2.resetStates = function resetStates() {\n\t    if (!this.stateful) {\n\t      throw new Error('Cannot call the resetStates() method of a non-stateful Layer ' + 'object.');\n\t    }\n\t  }\n\t  /**\n\t   * Checks compatibility between the layer and provided inputs.\n\t   *\n\t   * This checks that the tensor(s) `input`\n\t   * verify the input assumptions of the layer\n\t   * (if any). If not, exceptions are raised.\n\t   *\n\t   * @param inputs Input tensor or list of input tensors.\n\t   *\n\t   * @exception ValueError in case of mismatch between\n\t   *   the provided inputs and the expectations of the layer.\n\t   */\n\t  ;\n\n\t  _proto2.assertInputCompatibility = function assertInputCompatibility(inputs) {\n\t    inputs = toList(inputs);\n\n\t    if (this.inputSpec == null || this.inputSpec.length === 0) {\n\t      return;\n\t    }\n\n\t    var inputSpec = toList(this.inputSpec);\n\n\t    if (inputs.length !== inputSpec.length) {\n\t      throw new ValueError(\"Layer \" + this.name + \" expects \" + inputSpec.length + \" inputs, \" + (\"but it received \" + inputs.length + \" input tensors. \") + (\"Input received: \" + inputs));\n\t    }\n\n\t    for (var inputIndex = 0; inputIndex < inputs.length; inputIndex++) {\n\t      var x = inputs[inputIndex];\n\t      var spec = inputSpec[inputIndex];\n\n\t      if (spec == null) {\n\t        continue;\n\t      } // Check ndim.\n\n\n\t      var ndim = x.rank;\n\n\t      if (spec.ndim != null) {\n\t        if (ndim !== spec.ndim) {\n\t          throw new ValueError(\"Input \" + inputIndex + \" is incompatible with layer \" + this.name + \": \" + (\"expected ndim=\" + spec.ndim + \", found ndim=\" + ndim));\n\t        }\n\t      }\n\n\t      if (spec.maxNDim != null) {\n\t        if (ndim > spec.maxNDim) {\n\t          throw new ValueError(\"Input \" + inputIndex + \" is incompatible with layer \" + this.name + (\": expected max_ndim=\" + spec.maxNDim + \", found ndim=\" + ndim));\n\t        }\n\t      }\n\n\t      if (spec.minNDim != null) {\n\t        if (ndim < spec.minNDim) {\n\t          throw new ValueError(\"Input \" + inputIndex + \" is incompatible with layer \" + this.name + (\": expected min_ndim=\" + spec.minNDim + \", found ndim=\" + ndim + \".\"));\n\t        }\n\t      } // Check dtype.\n\n\n\t      if (spec.dtype != null) {\n\t        if (x.dtype !== spec.dtype) {\n\t          throw new ValueError(\"Input \" + inputIndex + \" is incompatible with layer \" + this.name + \" \" + (\": expected dtype=\" + spec.dtype + \", found dtype=\" + x.dtype + \".\"));\n\t        }\n\t      } // Check specific shape axes.\n\n\n\t      if (spec.axes) {\n\t        var xShape = x.shape;\n\n\t        for (var key in spec.axes) {\n\t          var axis = Number(key);\n\t          var value = spec.axes[key]; // Perform Python-style slicing in case axis < 0;\n\t          // TODO(cais): Use https://github.com/alvivi/typescript-underscore to\n\t          // ensure type safety through Underscore calls.\n\n\t          var xShapeAtAxis = axis >= 0 ? xShape[axis] : xShape[xShape.length + axis];\n\n\t          if (value != null && [value, null].indexOf(xShapeAtAxis) === -1) {\n\t            throw new ValueError(\"Input \" + inputIndex + \" is incompatible with layer \" + (this.name + \": expected axis \" + axis + \" of input shape to \") + (\"have value \" + value + \" but got shape \" + xShape + \".\"));\n\t          }\n\t        }\n\t      } // Check shape.\n\n\n\t      if (spec.shape != null) {\n\t        for (var i = 0; i < spec.shape.length; ++i) {\n\t          var specDim = spec.shape[i];\n\t          var dim = x.shape[i];\n\n\t          if (specDim != null && dim != null) {\n\t            if (specDim !== dim) {\n\t              throw new ValueError(\"Input \" + inputIndex + \" is incompatible with layer \" + (this.name + \": expected shape=\" + spec.shape + \", \") + (\"found shape=\" + x.shape + \".\"));\n\t            }\n\t          }\n\t        }\n\t      }\n\t    }\n\t  }\n\t  /**\n\t   * This is where the layer's logic lives.\n\t   *\n\t   * @param inputs Input tensor, or list/tuple of input tensors.\n\t   * @param kwargs Additional keyword arguments.\n\t   *\n\t   * @return A tensor or list/tuple of tensors.\n\t   */\n\t  ;\n\n\t  _proto2.call = function call(inputs, kwargs) {\n\t    return inputs;\n\t  };\n\n\t  _proto2.invokeCallHook = function invokeCallHook(inputs, kwargs) {\n\t    if (this._callHook != null) {\n\t      this._callHook(inputs, kwargs);\n\t    }\n\t  }\n\t  /**\n\t   * Set call hook.\n\t   * This is currently used for testing only.\n\t   * @param callHook\n\t   */\n\t  ;\n\n\t  _proto2.setCallHook = function setCallHook(callHook) {\n\t    this._callHook = callHook;\n\t  }\n\t  /**\n\t   * Clear call hook.\n\t   * This is currently used for testing only.\n\t   */\n\t  ;\n\n\t  _proto2.clearCallHook = function clearCallHook() {\n\t    this._callHook = null;\n\t  }\n\t  /**\n\t   * Builds or executes a `Layer's logic.\n\t   *\n\t   * When called with `tf.Tensor`(s), execute the `Layer`s computation and\n\t   * return Tensor(s). For example:\n\t   *\n\t   * ```js\n\t   * const denseLayer = tf.layers.dense({\n\t   *   units: 1,\n\t   *   kernelInitializer: 'zeros',\n\t   *   useBias: false\n\t   * });\n\t   *\n\t   * // Invoke the layer's apply() method with a `tf.Tensor` (with concrete\n\t   * // numeric values).\n\t   * const input = tf.ones([2, 2]);\n\t   * const output = denseLayer.apply(input);\n\t   *\n\t   * // The output's value is expected to be [[0], [0]], due to the fact that\n\t   * // the dense layer has a kernel initialized to all-zeros and does not have\n\t   * // a bias.\n\t   * output.print();\n\t   * ```\n\t   *\n\t   * When called with `tf.SymbolicTensor`(s), this will prepare the layer for\n\t   * future execution.  This entails internal book-keeping on shapes of\n\t   * expected Tensors, wiring layers together, and initializing weights.\n\t   *\n\t   * Calling `apply` with `tf.SymbolicTensor`s are typically used during the\n\t   * building of non-`tf.Sequential` models. For example:\n\t   *\n\t   * ```js\n\t   * const flattenLayer = tf.layers.flatten();\n\t   * const denseLayer = tf.layers.dense({units: 1});\n\t   *\n\t   * // Use tf.layers.input() to obtain a SymbolicTensor as input to apply().\n\t   * const input = tf.input({shape: [2, 2]});\n\t   * const output1 = flattenLayer.apply(input);\n\t   *\n\t   * // output1.shape is [null, 4]. The first dimension is the undetermined\n\t   * // batch size. The second dimension comes from flattening the [2, 2]\n\t   * // shape.\n\t   * console.log(JSON.stringify(output1.shape));\n\t   *\n\t   * // The output SymbolicTensor of the flatten layer can be used to call\n\t   * // the apply() of the dense layer:\n\t   * const output2 = denseLayer.apply(output1);\n\t   *\n\t   * // output2.shape is [null, 1]. The first dimension is the undetermined\n\t   * // batch size. The second dimension matches the number of units of the\n\t   * // dense layer.\n\t   * console.log(JSON.stringify(output2.shape));\n\t   *\n\t   * // The input and output and be used to construct a model that consists\n\t   * // of the flatten and dense layers.\n\t   * const model = tf.model({inputs: input, outputs: output2});\n\t   * ```\n\t   *\n\t   * @param inputs a `tf.Tensor` or `tf.SymbolicTensor` or an Array of them.\n\t   * @param kwargs Additional keyword arguments to be passed to `call()`.\n\t   *\n\t   * @return Output of the layer's `call` method.\n\t   *\n\t   * @exception ValueError error in case the layer is missing shape information\n\t   *   for its `build` call.\n\t   *\n\t   * @doc {heading: 'Models', 'subheading': 'Classes'}\n\t   */\n\t  // Porting Note: This is a replacement for __call__() in Python.\n\t  ;\n\n\t  _proto2.apply = function apply(inputs, kwargs) {\n\t    var _this2 = this;\n\n\t    kwargs = kwargs || {};\n\t    this.assertNotDisposed(); // Ensure inputs are all the same type.\n\n\t    var inputsList = toList(inputs);\n\t    var allAreSymbolic = true;\n\n\t    for (var _iterator3 = _createForOfIteratorHelperLoose(inputsList), _step3; !(_step3 = _iterator3()).done;) {\n\t      var input = _step3.value;\n\n\t      if (!(input instanceof SymbolicTensor)) {\n\t        allAreSymbolic = false;\n\t        break;\n\t      }\n\t    }\n\n\t    var noneAreSymbolic = true;\n\n\t    for (var _iterator4 = _createForOfIteratorHelperLoose(inputsList), _step4; !(_step4 = _iterator4()).done;) {\n\t      var _input = _step4.value;\n\n\t      if (_input instanceof SymbolicTensor) {\n\t        noneAreSymbolic = false;\n\t        break;\n\t      }\n\t    }\n\n\t    if (allAreSymbolic === noneAreSymbolic) {\n\t      throw new ValueError('Arguments to apply() must be all ' + 'SymbolicTensors or all Tensors');\n\t    } // TODO(michaelterry): nameScope() may not be necessary.\n\n\n\t    return nameScope(this.name, function () {\n\t      // Handle laying building (weight creating, input spec locking).\n\t      if (!_this2.built) {\n\t        /*\n\t          Throw exceptions in case the input is not compatible\n\t          with the inputSpec specified in the layer constructor.\n\t         */\n\t        _this2.assertInputCompatibility(inputs); // Collect input shapes to build layer.\n\n\n\t        var inputShapes = [];\n\n\t        for (var _iterator5 = _createForOfIteratorHelperLoose(toList(inputs)), _step5; !(_step5 = _iterator5()).done;) {\n\t          var xElem = _step5.value;\n\t          inputShapes.push(xElem.shape);\n\t        }\n\n\t        _this2.build(singletonOrArray(inputShapes));\n\n\t        _this2.built = true; // Load weights that were specified at layer instantiation.\n\n\t        if (_this2.initialWeights) {\n\t          _this2.setWeights(_this2.initialWeights);\n\t        }\n\n\t        if (_this2._refCount === null && noneAreSymbolic) {\n\t          // The first use of this layer is a non-symbolic call, set ref count\n\t          // to 1 so the Layer can be properly disposed if its dispose() method\n\t          // is called.\n\t          _this2._refCount = 1;\n\t        }\n\t      }\n\t      /*\n\t        Throw exceptions in case the input is not compatible\n\t        with the inputSpec set at build time.\n\t      */\n\n\n\t      _this2.assertInputCompatibility(inputs); // Handle mask propagation.\n\t      // TODO(michaelterry): Mask propagation not currently implemented.\n\t      // Actually call the layer, collecting output(s), mask(s), and shape(s).\n\n\n\t      if (noneAreSymbolic) {\n\t        var output = _this2.call(inputs, kwargs); // TODO(michaelterry): Compute the outputMask\n\t        // If the layer returns tensors from its inputs, unmodified,\n\t        // we copy them to avoid loss of tensor metadata.\n\n\n\t        var outputList = toList(output);\n\t        var outputListCopy = []; // TODO(michaelterry): This copying may not be necessary given our eager\n\t        // backend.\n\n\t        for (var _iterator6 = _createForOfIteratorHelperLoose(outputList), _step6; !(_step6 = _iterator6()).done;) {\n\t          var x = _step6.value;\n\n\t          if (inputsList.indexOf(x) !== -1) {\n\t            x = x.clone();\n\t          }\n\n\t          outputListCopy.push(x);\n\t        }\n\n\t        output = singletonOrArray(outputListCopy);\n\n\t        if (_this2.activityRegularizer != null) {\n\t          throw new NotImplementedError('Layer invocation in the presence of activity ' + 'regularizer(s) is not supported yet.');\n\t        } // TODO(michaelterry): Call addInboundNode()?\n\n\n\t        return output;\n\t      } else {\n\t        var inputShape = collectInputShape(inputs);\n\n\t        var outputShape = _this2.computeOutputShape(inputShape);\n\n\t        var _output;\n\n\t        var outputDType = guessOutputDType(inputs);\n\n\t        _this2.warnOnIncompatibleInputShape(Array.isArray(inputs) ? inputShape[0] : inputShape);\n\n\t        if (outputShape != null && outputShape.length > 0 && Array.isArray(outputShape[0])) {\n\t          // We have multiple output shapes. Create multiple output tensors.\n\t          _output = outputShape.map(function (shape, index) {\n\t            return new SymbolicTensor(outputDType, shape, _this2, toList(inputs), kwargs, _this2.name, index);\n\t          });\n\t        } else {\n\t          _output = new SymbolicTensor(outputDType, outputShape, _this2, toList(inputs), kwargs, _this2.name);\n\t        }\n\t        /*\n\t          Add an inbound node to the layer, so that it keeps track\n\t          of the call and of all new variables created during the call.\n\t          This also updates the layer history of the output tensor(s).\n\t          If the input tensor(s) had no previous history,\n\t          this does nothing.\n\t        */\n\n\n\t        _this2.addInboundNode(inputs, _output, null, null, inputShape, outputShape, kwargs);\n\n\t        _this2._refCount++;\n\n\t        if (_this2.activityRegularizer != null) {\n\t          throw new NotImplementedError('Layer invocation in the presence of activity ' + 'regularizer(s) is not supported yet.');\n\t        }\n\n\t        return _output;\n\t      }\n\t    });\n\t  }\n\t  /**\n\t   * Check compatibility between input shape and this layer's batchInputShape.\n\t   *\n\t   * Print warning if any incompatibility is found.\n\t   *\n\t   * @param inputShape Input shape to be checked.\n\t   */\n\t  ;\n\n\t  _proto2.warnOnIncompatibleInputShape = function warnOnIncompatibleInputShape(inputShape) {\n\t    if (this.batchInputShape == null) {\n\t      return;\n\t    } else if (inputShape.length !== this.batchInputShape.length) {\n\t      console.warn(\"The rank of the input tensor provided (shape: \" + (JSON.stringify(inputShape) + \") does not match that of the \") + (\"batchInputShape (\" + JSON.stringify(this.batchInputShape) + \") \") + (\"of the layer \" + this.name));\n\t    } else {\n\t      var dimMismatch = false;\n\t      this.batchInputShape.forEach(function (dimension, i) {\n\t        if (dimension != null && inputShape[i] != null && inputShape[i] !== dimension) {\n\t          dimMismatch = true;\n\t        }\n\t      });\n\n\t      if (dimMismatch) {\n\t        console.warn(\"The shape of the input tensor \" + (\"(\" + JSON.stringify(inputShape) + \") does not \") + (\"match the expectation of layer \" + this.name + \": \") + (\"\" + JSON.stringify(this.batchInputShape)));\n\t      }\n\t    }\n\t  }\n\t  /**\n\t   * Retrieves the output shape(s) of a layer.\n\t   *\n\t   * Only applicable if the layer has only one inbound node, or if all inbound\n\t   * nodes have the same output shape.\n\t   *\n\t   * @returns Output shape or shapes.\n\t   * @throws AttributeError: if the layer is connected to more than one incoming\n\t   *   nodes.\n\t   *\n\t   * @doc {heading: 'Models', 'subheading': 'Classes'}\n\t   */\n\t  ;\n\n\t  /**\n\t   * Counts the total number of numbers (e.g., float32, int32) in the\n\t   * weights.\n\t   *\n\t   * @returns An integer count.\n\t   * @throws RuntimeError: If the layer is not built yet (in which case its\n\t   *   weights are not defined yet.)\n\t   *\n\t   * @doc {heading: 'Models', 'subheading': 'Classes'}\n\t   */\n\t  _proto2.countParams = function countParams() {\n\t    if (!this.built) {\n\t      throw new RuntimeError(\"You tried to call countParams() on \" + this.name + \", \" + \"but the layer is not built yet. Build it first by calling \" + \"build(batchInputShape).\");\n\t    }\n\n\t    return countParamsInWeights(this.weights);\n\t  }\n\t  /**\n\t   * Creates the layer weights.\n\t   *\n\t   * Must be implemented on all layers that have weights.\n\t   *\n\t   * Called when apply() is called to construct the weights.\n\t   *\n\t   * @param inputShape A `Shape` or array of `Shape` (unused).\n\t   *\n\t   * @doc {heading: 'Models', 'subheading': 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto2.build = function build(inputShape) {\n\t    this.built = true;\n\t  }\n\t  /**\n\t   * Returns the current values of the weights of the layer.\n\t   *\n\t   * @param trainableOnly Whether to get the values of only trainable weights.\n\t   * @returns Weight values as an `Array` of `tf.Tensor`s.\n\t   *\n\t   * @doc {heading: 'Models', 'subheading': 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto2.getWeights = function getWeights(trainableOnly) {\n\t    if (trainableOnly === void 0) {\n\t      trainableOnly = false;\n\t    }\n\n\t    return batchGetValue(trainableOnly ? this.trainableWeights : this.weights);\n\t  }\n\t  /**\n\t   * Sets the weights of the layer, from Tensors.\n\t   *\n\t   * @param weights a list of Tensors. The number of arrays and their shape\n\t   *   must match number of the dimensions of the weights of the layer (i.e.\n\t   *   it should match the output of `getWeights`).\n\t   *\n\t   * @exception ValueError If the provided weights list does not match the\n\t   *   layer's specifications.\n\t   *\n\t   * @doc {heading: 'Models', 'subheading': 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto2.setWeights = function setWeights(weights) {\n\t    var _this3 = this;\n\n\t    tidy(function () {\n\t      var params = _this3.weights;\n\n\t      if (params.length !== weights.length) {\n\t        // TODO(cais): Restore the following and use `providedWeights`, instead\n\t        // of `weights` in the error message, once the deeplearn.js bug is\n\t        // fixed: https://github.com/PAIR-code/deeplearnjs/issues/498 const\n\t        // providedWeights = JSON.stringify(weights).substr(0, 50);\n\t        throw new ValueError(\"You called setWeights(weights) on layer \\\"\" + _this3.name + \"\\\" \" + (\"with a weight list of length \" + weights.length + \", \") + (\"but the layer was expecting \" + params.length + \" weights. \") + (\"Provided weights: \" + weights + \"...\"));\n\t      }\n\n\t      if (params.length === 0) {\n\t        return;\n\t      }\n\n\t      var weightValueTuples = [];\n\t      var paramValues = batchGetValue(params);\n\n\t      for (var i = 0; i < paramValues.length; ++i) {\n\t        var pv = paramValues[i];\n\t        var p = params[i];\n\t        var w = weights[i];\n\n\t        if (!arraysEqual(pv.shape, w.shape)) {\n\t          throw new ValueError(\"Layer weight shape \" + pv.shape + \" \" + (\"not compatible with provided weight shape \" + w.shape));\n\t        }\n\n\t        weightValueTuples.push([p, w]);\n\t      }\n\n\t      batchSetValue(weightValueTuples);\n\t    });\n\t  }\n\t  /**\n\t   * Adds a weight variable to the layer.\n\t   *\n\t   * @param name Name of the new weight variable.\n\t   * @param shape The shape of the weight.\n\t   * @param dtype The dtype of the weight.\n\t   * @param initializer An initializer instance.\n\t   * @param regularizer A regularizer instance.\n\t   * @param trainable Whether the weight should be trained via backprop or not\n\t   *   (assuming that the layer itself is also trainable).\n\t   * @param constraint An optional trainable.\n\t   * @return The created weight variable.\n\t   *\n\t   * @doc {heading: 'Models', 'subheading': 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto2.addWeight = function addWeight(name, shape, dtype, initializer, regularizer, trainable, constraint) {\n\t    // Reject duplicate weight names.\n\t    if (this._addedWeightNames.indexOf(name) !== -1) {\n\t      throw new ValueError(\"Duplicate weight name \" + name + \" for layer \" + this.name);\n\t    }\n\n\t    this._addedWeightNames.push(name);\n\n\t    if (dtype == null) {\n\t      dtype = 'float32';\n\t    }\n\n\t    if (this.fastWeightInitDuringBuild) {\n\t      initializer = getInitializer('zeros');\n\t    }\n\n\t    var initValue = initializer.apply(shape, dtype);\n\t    var weight = new LayerVariable(initValue, dtype, name, trainable, constraint);\n\t    initValue.dispose(); // Request backend not to dispose the weights of the model on scope() exit.\n\n\t    if (regularizer != null) {\n\t      this.addLoss(function () {\n\t        return regularizer.apply(weight.read());\n\t      });\n\t    }\n\n\t    if (trainable == null) {\n\t      trainable = true;\n\t    }\n\n\t    if (trainable) {\n\t      this._trainableWeights.push(weight);\n\t    } else {\n\t      this._nonTrainableWeights.push(weight);\n\t    }\n\n\t    return weight;\n\t  }\n\t  /**\n\t   * Set the fast-weight-initialization flag.\n\t   *\n\t   * In cases where the initialized weight values will be immediately\n\t   * overwritten by loaded weight values during model loading, setting\n\t   * the flag to `true` saves unnecessary calls to potentially expensive\n\t   * initializers and speeds up the loading process.\n\t   *\n\t   * @param value Target value of the flag.\n\t   */\n\t  ;\n\n\t  _proto2.setFastWeightInitDuringBuild = function setFastWeightInitDuringBuild(value) {\n\t    this.fastWeightInitDuringBuild = value;\n\t  }\n\t  /**\n\t   * Add losses to the layer.\n\t   *\n\t   * The loss may potentionally be conditional on some inputs tensors,\n\t   * for instance activity losses are conditional on the layer's inputs.\n\t   *\n\t   * @doc {heading: 'Models', 'subheading': 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto2.addLoss = function addLoss(losses) {\n\t    if (losses == null || Array.isArray(losses) && losses.length === 0) {\n\t      return;\n\t    } // Update this.losses\n\n\n\t    losses = toList(losses);\n\n\t    if (this._losses !== undefined && this._losses !== null) {\n\t      var _this$losses;\n\n\t      (_this$losses = this.losses).push.apply(_this$losses, losses);\n\t    }\n\t  }\n\t  /**\n\t   * Computes the output shape of the layer.\n\t   *\n\t   * Assumes that the layer will be built to match that input shape provided.\n\t   *\n\t   * @param inputShape A shape (tuple of integers) or a list of shape tuples\n\t   *   (one per output tensor of the layer). Shape tuples can include null for\n\t   *   free dimensions, instead of an integer.\n\t   *\n\t   * @doc {heading: 'Models', 'subheading': 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto2.computeOutputShape = function computeOutputShape(inputShape) {\n\t    return inputShape;\n\t  }\n\t  /**\n\t   * Computes an output mask tensor.\n\t   *\n\t   * @param inputs Tensor or list of tensors.\n\t   * @param mask Tensor or list of tensors.\n\t   *\n\t   * @return null or a tensor (or list of tensors, one per output tensor of the\n\t   * layer).\n\t   */\n\t  ;\n\n\t  _proto2.computeMask = function computeMask(inputs, mask) {\n\t    var _this4 = this;\n\n\t    if (!this.supportsMasking) {\n\t      if (mask != null) {\n\t        if (Array.isArray(mask)) {\n\t          mask.forEach(function (maskElement) {\n\t            if (maskElement != null) {\n\t              throw new TypeError(\"Layer \" + _this4.name + \" does not support masking, \" + 'but was passed an inputMask.');\n\t            }\n\t          });\n\t        } else {\n\t          throw new TypeError(\"Layer \" + this.name + \" does not support masking, \" + 'but was passed an inputMask.');\n\t        }\n\t      } // masking not explicitly supported: return null as mask\n\n\n\t      return null;\n\t    } // if masking is explictly supported, by default\n\t    // carry over the input mask\n\n\n\t    return mask;\n\t  }\n\t  /**\n\t   * Internal method to create an inbound node for the layer.\n\t   *\n\t   * @param inputTensors List of input tensors.\n\t   * @param outputTensors List of output tensors.\n\t   * @param inputMasks List of input masks (a mask can be a tensor, or null).\n\t   * @param outputMasks List of output masks (a mask can be a tensor, or null).\n\t   * @param inputShapes List of input shape tuples.\n\t   * @param outputShapes List of output shape tuples.\n\t   * @param kwargs Dictionary of keyword arguments that were passed to the\n\t   *   `call` method of the layer at the call that created the node.\n\t   */\n\t  ;\n\n\t  _proto2.addInboundNode = function addInboundNode(inputTensors, outputTensors, inputMasks, outputMasks, inputShapes, outputShapes, kwargs) {\n\t    if (kwargs === void 0) {\n\t      kwargs = null;\n\t    }\n\n\t    var inputTensorList = toList(inputTensors);\n\t    outputTensors = toList(outputTensors);\n\t    inputMasks = toList(inputMasks);\n\t    outputMasks = toList(outputMasks);\n\t    inputShapes = normalizeShapeList(inputShapes);\n\t    outputShapes = normalizeShapeList(outputShapes); // Collect input tensor(s) coordinates.\n\n\t    var inboundLayers = [];\n\t    var nodeIndices = [];\n\t    var tensorIndices = [];\n\n\t    for (var _iterator7 = _createForOfIteratorHelperLoose(inputTensorList), _step7; !(_step7 = _iterator7()).done;) {\n\t      var x = _step7.value;\n\n\t      /*\n\t       * TODO(michaelterry): Keras adds this value to tensors; it's not\n\t       * clear whether we'll use this or not.\n\t       */\n\t      inboundLayers.push(x.sourceLayer);\n\t      nodeIndices.push(x.nodeIndex);\n\t      tensorIndices.push(x.tensorIndex);\n\t    } // Create node, add it to inbound nodes.\n\t    // (This call has side effects.)\n\t    // tslint:disable-next-line:no-unused-expression\n\n\n\t    new Node({\n\t      outboundLayer: this,\n\t      inboundLayers: inboundLayers,\n\t      nodeIndices: nodeIndices,\n\t      tensorIndices: tensorIndices,\n\t      inputTensors: inputTensorList,\n\t      outputTensors: outputTensors,\n\t      inputMasks: inputMasks,\n\t      outputMasks: outputMasks,\n\t      inputShapes: inputShapes,\n\t      outputShapes: outputShapes\n\t    }, kwargs); // Update tensor history\n\n\t    for (var i = 0; i < outputTensors.length; i++) {\n\t      // TODO(michaelterry: _uses_learning_phase not tracked.\n\t      outputTensors[i].sourceLayer = this;\n\t      outputTensors[i].nodeIndex = this.inboundNodes.length - 1;\n\t      outputTensors[i].tensorIndex = i;\n\t    }\n\t  }\n\t  /**\n\t   * Returns the config of the layer.\n\t   *\n\t   * A layer config is a TS dictionary (serializable)\n\t   * containing the configuration of a layer.\n\t   * The same layer can be reinstantiated later\n\t   * (without its trained weights) from this configuration.\n\t   *\n\t   * The config of a layer does not include connectivity\n\t   * information, nor the layer class name.  These are handled\n\t   * by 'Container' (one layer of abstraction above).\n\t   *\n\t   * Porting Note: The TS dictionary follows TS naming standrds for\n\t   * keys, and uses tfjs-layers type-safe Enums.  Serialization methods\n\t   * should use a helper function to convert to the pythonic storage\n\t   * standard. (see serialization_utils.convertTsToPythonic)\n\t   *\n\t   * @returns TS dictionary of configuration.\n\t   *\n\t   * @doc {heading: 'Models', 'subheading': 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto2.getConfig = function getConfig() {\n\t    var config = {\n\t      name: this.name,\n\t      trainable: this.trainable\n\t    };\n\n\t    if (this.batchInputShape != null) {\n\t      config['batchInputShape'] = this.batchInputShape;\n\t    }\n\n\t    if (this.dtype != null) {\n\t      config['dtype'] = this.dtype;\n\t    }\n\n\t    return config;\n\t  }\n\t  /**\n\t   * Dispose the weight variables that this Layer instance holds.\n\t   *\n\t   * @returns {number} Number of disposed variables.\n\t   */\n\t  ;\n\n\t  _proto2.disposeWeights = function disposeWeights() {\n\t    this.weights.forEach(function (weight) {\n\t      return weight.dispose();\n\t    });\n\t    return this.weights.length;\n\t  };\n\n\t  _proto2.assertNotDisposed = function assertNotDisposed() {\n\t    if (this._refCount === 0) {\n\t      throw new Error(\"Layer '\" + this.name + \"' is already disposed.\");\n\t    }\n\t  }\n\t  /**\n\t   * Attempt to dispose layer's weights.\n\t   *\n\t   * This method decrease the reference count of the Layer object by 1.\n\t   *\n\t   * A Layer is reference-counted. Its reference count is incremented by 1\n\t   * the first item its `apply()` method is called and when it becomes a part\n\t   * of a new `Node` (through calling the `apply()`) method on a\n\t   * `tf.SymbolicTensor`).\n\t   *\n\t   * If the reference count of a Layer becomes 0, all the weights will be\n\t   * disposed and the underlying memory (e.g., the textures allocated in WebGL)\n\t   * will be freed.\n\t   *\n\t   * Note: If the reference count is greater than 0 after the decrement, the\n\t   * weights of the Layer will *not* be disposed.\n\t   *\n\t   * After a Layer is disposed, it cannot be used in calls such as `apply()`,\n\t   * `getWeights()` or `setWeights()` anymore.\n\t   *\n\t   * @returns A DisposeResult Object with the following fields:\n\t   *   - refCountAfterDispose: The reference count of the Container after this\n\t   *     `dispose()` call.\n\t   *   - numDisposedVariables: Number of `tf.Variable`s (i.e., weights) disposed\n\t   *     during this `dispose()` call.\n\t   * @throws {Error} If the layer is not built yet, or if the layer has already\n\t   *   been disposed.\n\t   *\n\t   * @doc {heading: 'Models', 'subheading': 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto2.dispose = function dispose() {\n\t    if (!this.built) {\n\t      throw new Error(\"Cannot dispose Layer \" + this.name + \" because it has not been \" + \"built yet.\");\n\t    }\n\n\t    if (this._refCount === null) {\n\t      throw new Error(\"Cannot dispose Layer \" + this.name + \" because it has not been used \" + \"yet.\");\n\t    }\n\n\t    this.assertNotDisposed();\n\t    var numDisposedVariables = 0;\n\n\t    if (--this._refCount === 0) {\n\t      numDisposedVariables = this.disposeWeights();\n\t    }\n\n\t    return {\n\t      refCountAfterDispose: this._refCount,\n\t      numDisposedVariables: numDisposedVariables\n\t    };\n\t  };\n\n\t  _createClass(Layer, [{\n\t    key: \"input\",\n\t    get: function get() {\n\t      if (this.inboundNodes.length > 1) {\n\t        throw new AttributeError(\"Layer \" + this.name + ' has multiple inbound nodes, ' + 'hence the notion of \"layer input\" ' + 'is ill-defined. ' + 'Use `getInputAt(nodeIndex)` instead.');\n\t      } else if (this.inboundNodes.length === 0) {\n\t        throw new AttributeError(\"Layer \" + this.name + ' is not connected, no input to return.');\n\t      }\n\n\t      return singletonOrArray(this.getNodeAtIndex(0, 'input').inputTensors);\n\t    }\n\t    /**\n\t     * Retrieves the output tensor(s) of a layer.\n\t     *\n\t     * Only applicable if the layer has exactly one inbound node,\n\t     * i.e. if it is connected to one incoming layer.\n\t     *\n\t     * @return Output tensor or list of output tensors.\n\t     *\n\t     * @exception AttributeError if the layer is connected to more than one\n\t     *   incoming layers.\n\t     */\n\n\t  }, {\n\t    key: \"output\",\n\t    get: function get() {\n\t      if (this.inboundNodes.length === 0) {\n\t        throw new AttributeError(\"Layer \" + this.name + ' has no inbound nodes.');\n\t      }\n\n\t      if (this.inboundNodes.length > 1) {\n\t        throw new AttributeError(\"Layer \" + this.name + ' has multiple inbound nodes, ' + 'hence the notion of \"layer output\" ' + 'is ill-defined. ' + 'Use `getOutputAt(nodeIndex)` instead.');\n\t      }\n\n\t      return singletonOrArray(this.getNodeAtIndex(0, 'output').outputTensors);\n\t    }\n\t  }, {\n\t    key: \"losses\",\n\t    get: function get() {\n\t      return this._losses;\n\t    }\n\t  }, {\n\t    key: \"updates\",\n\t    get: function get() {\n\t      return this._updates;\n\t    }\n\t  }, {\n\t    key: \"built\",\n\t    get: function get() {\n\t      return this._built;\n\t    },\n\t    set: function set(built) {\n\t      this._built = built;\n\t    }\n\t  }, {\n\t    key: \"trainable\",\n\t    get: function get() {\n\t      return this.trainable_;\n\t    },\n\t    set: function set(trainable) {\n\t      this._trainableWeights.forEach(function (w) {\n\t        return w.trainable = trainable;\n\t      });\n\n\t      this.trainable_ = trainable;\n\t    }\n\t  }, {\n\t    key: \"trainableWeights\",\n\t    get: function get() {\n\t      if (this.trainable_) {\n\t        return this._trainableWeights.filter(function (w) {\n\t          return w.trainable;\n\t        });\n\t      } else {\n\t        return [];\n\t      }\n\t    },\n\t    set: function set(weights) {\n\t      this._trainableWeights = weights;\n\t    }\n\t  }, {\n\t    key: \"nonTrainableWeights\",\n\t    get: function get() {\n\t      if (this.trainable) {\n\t        return this._trainableWeights.filter(function (w) {\n\t          return !w.trainable;\n\t        }).concat(this._nonTrainableWeights);\n\t      } else {\n\t        return this._trainableWeights.concat(this._nonTrainableWeights);\n\t      }\n\t    },\n\t    set: function set(weights) {\n\t      this._nonTrainableWeights = weights;\n\t    }\n\t    /**\n\t     * The concatenation of the lists trainableWeights and nonTrainableWeights\n\t     * (in this order).\n\t     */\n\n\t  }, {\n\t    key: \"weights\",\n\t    get: function get() {\n\t      return this.trainableWeights.concat(this.nonTrainableWeights);\n\t    }\n\t  }, {\n\t    key: \"stateful\",\n\t    get: function get() {\n\t      return this._stateful;\n\t    }\n\t  }, {\n\t    key: \"outputShape\",\n\t    get: function get() {\n\t      if (this.inboundNodes == null || this.inboundNodes.length === 0) {\n\t        throw new AttributeError(\"The layer \" + this.name + \" has never been called and thus has no \" + \"defined output shape.\");\n\t      }\n\n\t      var allOutputShapes = [];\n\n\t      for (var _iterator8 = _createForOfIteratorHelperLoose(this.inboundNodes), _step8; !(_step8 = _iterator8()).done;) {\n\t        var node = _step8.value;\n\t        var shapeString = JSON.stringify(node.outputShapes);\n\n\t        if (allOutputShapes.indexOf(shapeString) === -1) {\n\t          allOutputShapes.push(shapeString);\n\t        }\n\t      }\n\n\t      if (allOutputShapes.length === 1) {\n\t        var outputShapes = this.inboundNodes[0].outputShapes;\n\n\t        if (Array.isArray(outputShapes) && Array.isArray(outputShapes[0]) && outputShapes.length === 1) {\n\t          return outputShapes[0];\n\t        } else {\n\t          return outputShapes;\n\t        }\n\t      } else {\n\t        throw new AttributeError(\"The layer \" + this.name + \" has multiple inbound nodes with different \" + \"output shapes. Hence the notion of \\\"output shape\\\" is ill-defined \" + \"for the layer.\"); // TODO(cais): Implement getOutputShapeAt().\n\t      }\n\t    }\n\t  }]);\n\n\t  return Layer;\n\t}(Serializable);\n\t/**\n\t * Collects the input shape(s) of a list of `tf.Tensor`s or\n\t * `tf.SymbolicTensor`s.\n\t *\n\t * TODO(michaelterry): Update PyKeras docs (backport).\n\t *\n\t * @param inputTensors List of input tensors (or single input tensor).\n\t *\n\t * @return List of shape tuples (or single tuple), one tuple per input.\n\t */\n\n\tfunction collectInputShape(inputTensors) {\n\t  inputTensors = toList(inputTensors);\n\t  var shapes = [];\n\n\t  for (var _iterator9 = _createForOfIteratorHelperLoose(inputTensors), _step9; !(_step9 = _iterator9()).done;) {\n\t    var x = _step9.value;\n\t    shapes.push(x.shape);\n\t  }\n\n\t  return singletonOrArray(shapes);\n\t}\n\t/**\n\t * Guesses output dtype based on inputs.\n\t *\n\t * At present, just returns 'float32' for any input.\n\t *\n\t * @param inputTensors List of input tensors (or single input tensor).\n\t *\n\t * @return The guessed DType. At present, always returns 'float32'.\n\t */\n\n\n\tfunction guessOutputDType(inputTensors) {\n\t  return 'float32';\n\t}\n\t/**\n\t * Returns the list of input tensors necessary to compute `tensor`.\n\t *\n\t * Output will always be a list of tensors (potentially with 1 element).\n\t *\n\t * @param tensor The tensor to start from.\n\t * @param layer Origin layer of the tensor.\n\t * @param nodeIndex Origin node index of the tensor.\n\t *\n\t * @return Array of input tensors.\n\t */\n\n\n\tfunction getSourceInputs(tensor, layer, nodeIndex) {\n\t  if (layer == null || nodeIndex != null && nodeIndex > 0) {\n\t    layer = tensor.sourceLayer;\n\t    nodeIndex = tensor.nodeIndex;\n\t  }\n\n\t  if (layer.inboundNodes.length === 0) {\n\t    return [tensor];\n\t  } else {\n\t    var node = layer.inboundNodes[nodeIndex];\n\n\t    if (node.inboundLayers.length === 0) {\n\t      return node.inputTensors;\n\t    } else {\n\t      var sourceTensors = [];\n\n\t      for (var i = 0; i < node.inboundLayers.length; i++) {\n\t        var x = node.inputTensors[i];\n\t        var _layer = node.inboundLayers[i];\n\t        var _nodeIndex = node.nodeIndices[i];\n\t        var previousSources = getSourceInputs(x, _layer, _nodeIndex); // Avoid input redundancy.\n\n\t        for (var _iterator10 = _createForOfIteratorHelperLoose(previousSources), _step10; !(_step10 = _iterator10()).done;) {\n\t          var _x = _step10.value;\n\n\t          if (sourceTensors.indexOf(_x) === -1) {\n\t            sourceTensors.push(_x);\n\t          }\n\t        }\n\t      }\n\n\t      return sourceTensors;\n\t    }\n\t  }\n\t}\n\n\tvar InputLayer = /*#__PURE__*/function (_Layer) {\n\t  _inheritsLoose(InputLayer, _Layer);\n\n\t  function InputLayer(args) {\n\t    var _this;\n\n\t    _this = _Layer.call(this, {\n\t      dtype: args.dtype,\n\t      name: args.name != null ? args.name : getUid('input').toString()\n\t    }) || this; // Normalize config.batchSize and config.sparse\n\n\t    if (args.batchSize == null) {\n\t      args.batchSize = null;\n\t    }\n\n\t    if (args.sparse == null) {\n\t      args.sparse = false;\n\t    }\n\n\t    _this.trainable = false;\n\t    _this.built = true;\n\t    _this.sparse = args.sparse;\n\n\t    if (args.inputShape != null && args.batchInputShape != null) {\n\t      throw new ValueError('Only provide the inputShape OR ' + 'batchInputShape argument to inputLayer, not both at the same time.');\n\t    }\n\n\t    var batchInputShape = args.batchInputShape;\n\n\t    if (batchInputShape == null) {\n\t      if (args.inputShape == null) {\n\t        throw new ValueError('An InputLayer should be passed either a ' + '`batchInputShape` or an `inputShape`.');\n\t      } else {\n\t        batchInputShape = [args.batchSize].concat(args.inputShape);\n\t      }\n\t    } else {\n\t      // TODO(michaelterry): Backport to PyKeras\n\t      if (args.batchSize != null) {\n\t        throw new ValueError('Cannot specify batchSize if batchInputShape is ' + 'specified when creating an InputLayer.');\n\t      }\n\t    }\n\n\t    var dtype = args.dtype || 'float32';\n\t    _this.batchInputShape = batchInputShape;\n\t    _this.dtype = dtype; // TODO(michaelterry): Backport this to PyKeras?\n\n\t    _this.inputSpec = [{\n\t      shape: batchInputShape\n\t    }];\n\t    var inputTensor = new SymbolicTensor(_this.dtype, _this.batchInputShape, _assertThisInitialized(_this), [], {}, _this.name);\n\t    inputTensor.nodeIndex = 0;\n\t    inputTensor.tensorIndex = 0; // Create an input node to add to this.outboundNode.\n\t    // (This call has side effects.)\n\t    // tslint:disable-next-line:no-unused-expression\n\n\t    new Node({\n\t      outboundLayer: _assertThisInitialized(_this),\n\t      inboundLayers: [],\n\t      nodeIndices: [],\n\t      tensorIndices: [],\n\t      inputTensors: [inputTensor],\n\t      outputTensors: [inputTensor],\n\t      inputMasks: [null],\n\t      outputMasks: [null],\n\t      inputShapes: [batchInputShape],\n\t      outputShapes: [batchInputShape]\n\t    });\n\t    return _this;\n\t  }\n\n\t  var _proto = InputLayer.prototype;\n\n\t  _proto.apply = function apply(inputs, kwargs) {\n\t    throw new ValueError('Cannot pass any input to an ' + (\"InputLayer's apply() method. InputLayer name: \" + this.name));\n\t  };\n\n\t  _proto.dispose = function dispose() {\n\t    // dispose() for InputLayer is overridden as no-op.\n\t    return {\n\t      refCountAfterDispose: this._refCount,\n\t      numDisposedVariables: 0\n\t    };\n\t  };\n\n\t  _proto.getConfig = function getConfig() {\n\t    return {\n\t      batchInputShape: this.batchInputShape,\n\t      dtype: this.dtype,\n\t      sparse: this.sparse,\n\t      name: this.name\n\t    };\n\t  };\n\n\t  return InputLayer;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tInputLayer.className = 'InputLayer';\n\tregisterClass(InputLayer);\n\tfunction Input(config) {\n\t  if (config.batchShape == null && config.shape == null) {\n\t    throw new Error('Please provide to Input either a `shape`' + ' or a `batchShape` argument. Note that ' + '`shape` does not include the batch ' + 'dimension.');\n\t  }\n\n\t  if (config.batchShape != null && config.shape != null) {\n\t    // TODO(michaelterry): Backport to PyKeras.\n\t    throw new ValueError('Please provide either a `shape` or `batchShape` ' + 'argument to Input, but not both.');\n\t  }\n\n\t  var batchShape = config.batchShape;\n\n\t  if (config.shape != null && batchShape == null) {\n\t    batchShape = [null].concat(config.shape);\n\t  }\n\n\t  var dtype = config.dtype;\n\n\t  if (dtype == null) {\n\t    dtype = 'float32';\n\t  }\n\n\t  var inputLayer = new InputLayer({\n\t    batchInputShape: batchShape,\n\t    name: config.name,\n\t    dtype: dtype,\n\t    sparse: config.sparse\n\t  });\n\t  var outputs = inputLayer.inboundNodes[0].outputTensors;\n\t  return outputs[0];\n\t}\n\n\t/**\n\t * Turn any Scalar values in a Logs object into actual number values.\n\t *\n\t * @param logs The `Logs` object to be resolved in place.\n\t */\n\n\tfunction resolveScalarsInLogs(_x) {\n\t  return _resolveScalarsInLogs.apply(this, arguments);\n\t}\n\t/**\n\t * Dispose all Tensors in an UnresolvedLogs object.\n\t *\n\t * @param logs An `UnresolvedLogs` object potentially containing `tf.Tensor`s in\n\t *   places where the values can be `tf.Tensor` or `number`.\n\t */\n\n\tfunction _resolveScalarsInLogs() {\n\t  _resolveScalarsInLogs = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(logs) {\n\t    var promises, keys, scalarsToDispose, key, value, valueScalar, values, i;\n\t    return regeneratorRuntime.wrap(function _callee$(_context) {\n\t      while (1) {\n\t        switch (_context.prev = _context.next) {\n\t          case 0:\n\t            if (!(logs == null)) {\n\t              _context.next = 2;\n\t              break;\n\t            }\n\n\t            return _context.abrupt(\"return\");\n\n\t          case 2:\n\t            promises = [];\n\t            keys = [];\n\t            scalarsToDispose = [];\n\n\t            for (key in logs) {\n\t              value = logs[key];\n\n\t              if (typeof value !== 'number') {\n\t                valueScalar = value;\n\t                promises.push(valueScalar.data());\n\t                keys.push(key);\n\t                scalarsToDispose.push(valueScalar);\n\t              }\n\t            }\n\n\t            if (!(promises.length > 0)) {\n\t              _context.next = 12;\n\t              break;\n\t            }\n\n\t            _context.next = 9;\n\t            return Promise.all(promises);\n\n\t          case 9:\n\t            values = _context.sent;\n\n\t            for (i = 0; i < values.length; ++i) {\n\t              logs[keys[i]] = values[i][0];\n\t            } // Dispose the original scalar tensors.\n\n\n\t            dispose(scalarsToDispose);\n\n\t          case 12:\n\t          case \"end\":\n\t            return _context.stop();\n\t        }\n\t      }\n\t    }, _callee);\n\t  }));\n\t  return _resolveScalarsInLogs.apply(this, arguments);\n\t}\n\n\tfunction disposeTensorsInLogs(logs) {\n\t  if (logs == null) {\n\t    return;\n\t  }\n\n\t  for (var key in logs) {\n\t    var value = logs[key];\n\n\t    if (typeof value !== 'number') {\n\t      value.dispose();\n\t    }\n\t  }\n\t}\n\n\t/** Verbosity logging level when fitting a model. */\n\n\tvar ModelLoggingVerbosity;\n\n\t(function (ModelLoggingVerbosity) {\n\t  ModelLoggingVerbosity[ModelLoggingVerbosity[\"SILENT\"] = 0] = \"SILENT\";\n\t  ModelLoggingVerbosity[ModelLoggingVerbosity[\"VERBOSE\"] = 1] = \"VERBOSE\";\n\t})(ModelLoggingVerbosity || (ModelLoggingVerbosity = {}));\n\t/** How often to yield to the main thread when training (in ms). */\n\n\n\tvar DEFAULT_YIELD_EVERY_MS = 125;\n\t/**\n\t * Abstract base class used to build new callbacks.\n\t *\n\t * The `logs` dictionary that callback methods take as argument will contain\n\t * keys for quantities relevant to the current batch or epoch.\n\t *\n\t * Currently, the `.fit()` method of the `Sequential` model class\n\t * will include the following quantities in the `logs` that\n\t * it passes to its callbacks:\n\t *\n\t * onEpochEnd: Logs include `acc` and `loss`, and optionally include `valLoss`\n\t *   (if validation is enabled in `fit`), and `valAcc` (if validation and\n\t *   accuracy monitoring are enabled).\n\t * onBatchBegin: Logs include `size`, the number of samples in the current\n\t *   batch.\n\t * onBatchEnd: Logs include `loss`, and optionally `acc` (if accuracy monitoring\n\t *   is enabled).\n\t */\n\n\tvar BaseCallback = /*#__PURE__*/function () {\n\t  function BaseCallback() {\n\t    // TODO(michaelterry): This type is a best guess.\n\t    this.validationData = null;\n\t  }\n\n\t  var _proto = BaseCallback.prototype;\n\n\t  _proto.setParams = function setParams(params) {\n\t    this.params = params;\n\t  };\n\n\t  _proto.onEpochBegin = /*#__PURE__*/function () {\n\t    var _onEpochBegin = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(epoch, logs) {\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee);\n\t    }));\n\n\t    function onEpochBegin(_x, _x2) {\n\t      return _onEpochBegin.apply(this, arguments);\n\t    }\n\n\t    return onEpochBegin;\n\t  }();\n\n\t  _proto.onEpochEnd = /*#__PURE__*/function () {\n\t    var _onEpochEnd = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(epoch, logs) {\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2);\n\t    }));\n\n\t    function onEpochEnd(_x3, _x4) {\n\t      return _onEpochEnd.apply(this, arguments);\n\t    }\n\n\t    return onEpochEnd;\n\t  }();\n\n\t  _proto.onBatchBegin = /*#__PURE__*/function () {\n\t    var _onBatchBegin = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(batch, logs) {\n\t      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t        while (1) {\n\t          switch (_context3.prev = _context3.next) {\n\t            case 0:\n\t            case \"end\":\n\t              return _context3.stop();\n\t          }\n\t        }\n\t      }, _callee3);\n\t    }));\n\n\t    function onBatchBegin(_x5, _x6) {\n\t      return _onBatchBegin.apply(this, arguments);\n\t    }\n\n\t    return onBatchBegin;\n\t  }();\n\n\t  _proto.onBatchEnd = /*#__PURE__*/function () {\n\t    var _onBatchEnd = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(batch, logs) {\n\t      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n\t        while (1) {\n\t          switch (_context4.prev = _context4.next) {\n\t            case 0:\n\t            case \"end\":\n\t              return _context4.stop();\n\t          }\n\t        }\n\t      }, _callee4);\n\t    }));\n\n\t    function onBatchEnd(_x7, _x8) {\n\t      return _onBatchEnd.apply(this, arguments);\n\t    }\n\n\t    return onBatchEnd;\n\t  }();\n\n\t  _proto.onTrainBegin = /*#__PURE__*/function () {\n\t    var _onTrainBegin = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5(logs) {\n\t      return regeneratorRuntime.wrap(function _callee5$(_context5) {\n\t        while (1) {\n\t          switch (_context5.prev = _context5.next) {\n\t            case 0:\n\t            case \"end\":\n\t              return _context5.stop();\n\t          }\n\t        }\n\t      }, _callee5);\n\t    }));\n\n\t    function onTrainBegin(_x9) {\n\t      return _onTrainBegin.apply(this, arguments);\n\t    }\n\n\t    return onTrainBegin;\n\t  }();\n\n\t  _proto.onTrainEnd = /*#__PURE__*/function () {\n\t    var _onTrainEnd = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6(logs) {\n\t      return regeneratorRuntime.wrap(function _callee6$(_context6) {\n\t        while (1) {\n\t          switch (_context6.prev = _context6.next) {\n\t            case 0:\n\t            case \"end\":\n\t              return _context6.stop();\n\t          }\n\t        }\n\t      }, _callee6);\n\t    }));\n\n\t    function onTrainEnd(_x10) {\n\t      return _onTrainEnd.apply(this, arguments);\n\t    }\n\n\t    return onTrainEnd;\n\t  }() // LayersModel needs to call Callback.setModel(), but cannot actually depend\n\t  // on Callback because that creates a cyclic dependency.  Providing this no-op\n\t  // method on BaseCallback breaks the cycle: this way LayersModel can depend on\n\t  // BaseCallback but not on Callback.  The argument is typed as `Container`\n\t  // (the superclass of LayersModel) to avoid recapitulating the cycle. Callback\n\t  // overrides this method and enforces that the argument is really a\n\t  // LayersModel.\n\t  ;\n\n\t  _proto.setModel = function setModel(model) {// Do nothing. Use Callback instead of BaseCallback to track the model.\n\t  };\n\n\t  return BaseCallback;\n\t}();\n\t/**\n\t * Container abstracting a list of callbacks.\n\t */\n\n\tvar CallbackList = /*#__PURE__*/function () {\n\t  // TODO(cais): When the need arises, uncomment the following lines and\n\t  // implement the queue for time values.\n\t  // private deltaTBatch: number;\n\t  // private deltaTsBatchBegin: Array<number>;\n\t  // private deltaTsBatchEnd: Array<number>;\n\n\t  /**\n\t   * Constructor of CallbackList.\n\t   * @param callbacks Array of `Callback` instances.\n\t   * @param queueLength Queue length for keeping running statistics over\n\t   *   callback execution time.\n\t   */\n\t  function CallbackList(callbacks, queueLength) {\n\t    if (queueLength === void 0) {\n\t      queueLength = 10;\n\t    }\n\n\t    // TODO(cais): Make use of queueLength when implementing the queue for time\n\t    // values.\n\t    if (callbacks == null) {\n\t      callbacks = [];\n\t    }\n\n\t    this.callbacks = callbacks;\n\t    this.queueLength = queueLength;\n\t  }\n\n\t  var _proto2 = CallbackList.prototype;\n\n\t  _proto2.append = function append(callback) {\n\t    this.callbacks.push(callback);\n\t  };\n\n\t  _proto2.setParams = function setParams(params) {\n\t    for (var _iterator = _createForOfIteratorHelperLoose(this.callbacks), _step; !(_step = _iterator()).done;) {\n\t      var callback = _step.value;\n\t      callback.setParams(params);\n\t    }\n\t  };\n\n\t  _proto2.setModel = function setModel(model) {\n\t    for (var _iterator2 = _createForOfIteratorHelperLoose(this.callbacks), _step2; !(_step2 = _iterator2()).done;) {\n\t      var callback = _step2.value;\n\t      callback.setModel(model);\n\t    }\n\t  }\n\t  /**\n\t   * Called at the start of an epoch.\n\t   * @param epoch Index of epoch.\n\t   * @param logs Dictionary of logs.\n\t   */\n\t  ;\n\n\t  _proto2.onEpochBegin =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _onEpochBegin2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee7(epoch, logs) {\n\t      var _iterator3, _step3, callback;\n\n\t      return regeneratorRuntime.wrap(function _callee7$(_context7) {\n\t        while (1) {\n\t          switch (_context7.prev = _context7.next) {\n\t            case 0:\n\t              if (logs == null) {\n\t                logs = {};\n\t              }\n\n\t              _iterator3 = _createForOfIteratorHelperLoose(this.callbacks);\n\n\t            case 2:\n\t              if ((_step3 = _iterator3()).done) {\n\t                _context7.next = 8;\n\t                break;\n\t              }\n\n\t              callback = _step3.value;\n\t              _context7.next = 6;\n\t              return callback.onEpochBegin(epoch, logs);\n\n\t            case 6:\n\t              _context7.next = 2;\n\t              break;\n\n\t            case 8:\n\t            case \"end\":\n\t              return _context7.stop();\n\t          }\n\t        }\n\t      }, _callee7, this);\n\t    }));\n\n\t    function onEpochBegin(_x11, _x12) {\n\t      return _onEpochBegin2.apply(this, arguments);\n\t    }\n\n\t    return onEpochBegin;\n\t  }()\n\t  /**\n\t   * Called at the end of an epoch.\n\t   * @param epoch Index of epoch.\n\t   * @param logs Dictionary of logs.\n\t   */\n\t  ;\n\n\t  _proto2.onEpochEnd =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _onEpochEnd2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee8(epoch, logs) {\n\t      var _iterator4, _step4, callback;\n\n\t      return regeneratorRuntime.wrap(function _callee8$(_context8) {\n\t        while (1) {\n\t          switch (_context8.prev = _context8.next) {\n\t            case 0:\n\t              if (logs == null) {\n\t                logs = {};\n\t              }\n\n\t              _iterator4 = _createForOfIteratorHelperLoose(this.callbacks);\n\n\t            case 2:\n\t              if ((_step4 = _iterator4()).done) {\n\t                _context8.next = 8;\n\t                break;\n\t              }\n\n\t              callback = _step4.value;\n\t              _context8.next = 6;\n\t              return callback.onEpochEnd(epoch, logs);\n\n\t            case 6:\n\t              _context8.next = 2;\n\t              break;\n\n\t            case 8:\n\t            case \"end\":\n\t              return _context8.stop();\n\t          }\n\t        }\n\t      }, _callee8, this);\n\t    }));\n\n\t    function onEpochEnd(_x13, _x14) {\n\t      return _onEpochEnd2.apply(this, arguments);\n\t    }\n\n\t    return onEpochEnd;\n\t  }()\n\t  /**\n\t   * Called  right before processing a batch.\n\t   * @param batch Index of batch within the current epoch.\n\t   * @param logs Dictionary of logs.\n\t   */\n\t  ;\n\n\t  _proto2.onBatchBegin =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _onBatchBegin2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee9(batch, logs) {\n\t      var _iterator5, _step5, callback;\n\n\t      return regeneratorRuntime.wrap(function _callee9$(_context9) {\n\t        while (1) {\n\t          switch (_context9.prev = _context9.next) {\n\t            case 0:\n\t              if (logs == null) {\n\t                logs = {};\n\t              }\n\n\t              _iterator5 = _createForOfIteratorHelperLoose(this.callbacks);\n\n\t            case 2:\n\t              if ((_step5 = _iterator5()).done) {\n\t                _context9.next = 8;\n\t                break;\n\t              }\n\n\t              callback = _step5.value;\n\t              _context9.next = 6;\n\t              return callback.onBatchBegin(batch, logs);\n\n\t            case 6:\n\t              _context9.next = 2;\n\t              break;\n\n\t            case 8:\n\t            case \"end\":\n\t              return _context9.stop();\n\t          }\n\t        }\n\t      }, _callee9, this);\n\t    }));\n\n\t    function onBatchBegin(_x15, _x16) {\n\t      return _onBatchBegin2.apply(this, arguments);\n\t    }\n\n\t    return onBatchBegin;\n\t  }()\n\t  /**\n\t   * Called at the end of a batch.\n\t   * @param batch Index of batch within the current epoch.\n\t   * @param logs Dictionary of logs.\n\t   */\n\t  ;\n\n\t  _proto2.onBatchEnd =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _onBatchEnd2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee10(batch, logs) {\n\t      var _iterator6, _step6, callback;\n\n\t      return regeneratorRuntime.wrap(function _callee10$(_context10) {\n\t        while (1) {\n\t          switch (_context10.prev = _context10.next) {\n\t            case 0:\n\t              if (logs == null) {\n\t                logs = {};\n\t              }\n\n\t              _iterator6 = _createForOfIteratorHelperLoose(this.callbacks);\n\n\t            case 2:\n\t              if ((_step6 = _iterator6()).done) {\n\t                _context10.next = 8;\n\t                break;\n\t              }\n\n\t              callback = _step6.value;\n\t              _context10.next = 6;\n\t              return callback.onBatchEnd(batch, logs);\n\n\t            case 6:\n\t              _context10.next = 2;\n\t              break;\n\n\t            case 8:\n\t            case \"end\":\n\t              return _context10.stop();\n\t          }\n\t        }\n\t      }, _callee10, this);\n\t    }));\n\n\t    function onBatchEnd(_x17, _x18) {\n\t      return _onBatchEnd2.apply(this, arguments);\n\t    }\n\n\t    return onBatchEnd;\n\t  }()\n\t  /**\n\t   * Called at the beginning of training.\n\t   * @param logs Dictionary of logs.\n\t   */\n\t  ;\n\n\t  _proto2.onTrainBegin =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _onTrainBegin2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee11(logs) {\n\t      var _iterator7, _step7, callback;\n\n\t      return regeneratorRuntime.wrap(function _callee11$(_context11) {\n\t        while (1) {\n\t          switch (_context11.prev = _context11.next) {\n\t            case 0:\n\t              if (logs == null) {\n\t                logs = {};\n\t              }\n\n\t              _iterator7 = _createForOfIteratorHelperLoose(this.callbacks);\n\n\t            case 2:\n\t              if ((_step7 = _iterator7()).done) {\n\t                _context11.next = 8;\n\t                break;\n\t              }\n\n\t              callback = _step7.value;\n\t              _context11.next = 6;\n\t              return callback.onTrainBegin(logs);\n\n\t            case 6:\n\t              _context11.next = 2;\n\t              break;\n\n\t            case 8:\n\t            case \"end\":\n\t              return _context11.stop();\n\t          }\n\t        }\n\t      }, _callee11, this);\n\t    }));\n\n\t    function onTrainBegin(_x19) {\n\t      return _onTrainBegin2.apply(this, arguments);\n\t    }\n\n\t    return onTrainBegin;\n\t  }()\n\t  /**\n\t   * Called at the end of training.\n\t   * @param logs Dictionary of logs.\n\t   */\n\t  ;\n\n\t  _proto2.onTrainEnd =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _onTrainEnd2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee12(logs) {\n\t      var _iterator8, _step8, callback;\n\n\t      return regeneratorRuntime.wrap(function _callee12$(_context12) {\n\t        while (1) {\n\t          switch (_context12.prev = _context12.next) {\n\t            case 0:\n\t              if (logs == null) {\n\t                logs = {};\n\t              }\n\n\t              _iterator8 = _createForOfIteratorHelperLoose(this.callbacks);\n\n\t            case 2:\n\t              if ((_step8 = _iterator8()).done) {\n\t                _context12.next = 8;\n\t                break;\n\t              }\n\n\t              callback = _step8.value;\n\t              _context12.next = 6;\n\t              return callback.onTrainEnd(logs);\n\n\t            case 6:\n\t              _context12.next = 2;\n\t              break;\n\n\t            case 8:\n\t            case \"end\":\n\t              return _context12.stop();\n\t          }\n\t        }\n\t      }, _callee12, this);\n\t    }));\n\n\t    function onTrainEnd(_x20) {\n\t      return _onTrainEnd2.apply(this, arguments);\n\t    }\n\n\t    return onTrainEnd;\n\t  }();\n\n\t  return CallbackList;\n\t}();\n\t/**\n\t * Callback that accumulates epoch averages of metrics.\n\t *\n\t * This callback is automatically applied to every LayersModel.\n\t */\n\n\tvar BaseLogger = /*#__PURE__*/function (_BaseCallback) {\n\t  _inheritsLoose(BaseLogger, _BaseCallback);\n\n\t  function BaseLogger() {\n\t    return _BaseCallback.call(this) || this;\n\t  }\n\n\t  var _proto3 = BaseLogger.prototype;\n\n\t  _proto3.onEpochBegin = /*#__PURE__*/function () {\n\t    var _onEpochBegin3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee13(epoch) {\n\t      return regeneratorRuntime.wrap(function _callee13$(_context13) {\n\t        while (1) {\n\t          switch (_context13.prev = _context13.next) {\n\t            case 0:\n\t              this.seen = 0;\n\t              this.totals = {};\n\n\t            case 2:\n\t            case \"end\":\n\t              return _context13.stop();\n\t          }\n\t        }\n\t      }, _callee13, this);\n\t    }));\n\n\t    function onEpochBegin(_x21) {\n\t      return _onEpochBegin3.apply(this, arguments);\n\t    }\n\n\t    return onEpochBegin;\n\t  }();\n\n\t  _proto3.onBatchEnd = /*#__PURE__*/function () {\n\t    var _onBatchEnd3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee14(batch, logs) {\n\t      var _this = this;\n\n\t      var batchSize, _loop, key;\n\n\t      return regeneratorRuntime.wrap(function _callee14$(_context14) {\n\t        while (1) {\n\t          switch (_context14.prev = _context14.next) {\n\t            case 0:\n\t              if (logs == null) {\n\t                logs = {};\n\t              }\n\n\t              batchSize = logs['size'] == null ? 0 : logs['size'];\n\t              this.seen += batchSize;\n\n\t              _loop = function _loop(key) {\n\t                var value = logs[key];\n\n\t                if (typeof value === 'number') {\n\t                  if (!_this.totals.hasOwnProperty(key)) {\n\t                    _this.totals[key] = 0;\n\t                  }\n\n\t                  _this.totals[key] = _this.totals[key] + value * batchSize;\n\t                } else {\n\t                  var oldTotalsToDispose;\n\n\t                  if (key in _this.totals) {\n\t                    oldTotalsToDispose = _this.totals[key];\n\t                  } else {\n\t                    _this.totals[key] = 0;\n\t                  }\n\n\t                  var total = tidy(function () {\n\t                    return add$1(_this.totals[key], mul(value, batchSize));\n\t                  });\n\t                  _this.totals[key] = total;\n\n\t                  if (oldTotalsToDispose != null) {\n\t                    oldTotalsToDispose.dispose();\n\t                  }\n\t                }\n\t              };\n\n\t              for (key in logs) {\n\t                _loop(key);\n\t              }\n\n\t            case 5:\n\t            case \"end\":\n\t              return _context14.stop();\n\t          }\n\t        }\n\t      }, _callee14, this);\n\t    }));\n\n\t    function onBatchEnd(_x22, _x23) {\n\t      return _onBatchEnd3.apply(this, arguments);\n\t    }\n\n\t    return onBatchEnd;\n\t  }();\n\n\t  _proto3.onEpochEnd = /*#__PURE__*/function () {\n\t    var _onEpochEnd3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee15(epoch, logs) {\n\t      var _this2 = this;\n\n\t      var _loop2, _iterator9, _step9, _ret;\n\n\t      return regeneratorRuntime.wrap(function _callee15$(_context15) {\n\t        while (1) {\n\t          switch (_context15.prev = _context15.next) {\n\t            case 0:\n\t              if (!(logs != null)) {\n\t                _context15.next = 9;\n\t                break;\n\t              }\n\n\t              _loop2 = function _loop2() {\n\t                var key = _step9.value;\n\n\t                if (_this2.totals[key] == null) {\n\t                  return \"continue\";\n\t                }\n\n\t                if (typeof _this2.totals[key] === 'number') {\n\t                  logs[key] = _this2.totals[key] / _this2.seen;\n\t                } else {\n\t                  tidy(function () {\n\t                    var log = mul(div(1, _this2.seen), _this2.totals[key]);\n\t                    logs[key] = log;\n\n\t                    _this2.totals[key].dispose();\n\n\t                    keep(logs[key]);\n\t                  });\n\t                }\n\t              };\n\n\t              _iterator9 = _createForOfIteratorHelperLoose(this.params['metrics']);\n\n\t            case 3:\n\t              if ((_step9 = _iterator9()).done) {\n\t                _context15.next = 9;\n\t                break;\n\t              }\n\n\t              _ret = _loop2();\n\n\t              if (!(_ret === \"continue\")) {\n\t                _context15.next = 7;\n\t                break;\n\t              }\n\n\t              return _context15.abrupt(\"continue\", 7);\n\n\t            case 7:\n\t              _context15.next = 3;\n\t              break;\n\n\t            case 9:\n\t            case \"end\":\n\t              return _context15.stop();\n\t          }\n\t        }\n\t      }, _callee15, this);\n\t    }));\n\n\t    function onEpochEnd(_x24, _x25) {\n\t      return _onEpochEnd3.apply(this, arguments);\n\t    }\n\n\t    return onEpochEnd;\n\t  }();\n\n\t  return BaseLogger;\n\t}(BaseCallback);\n\t/**\n\t * Callback that records events into a `History` object. This callback is\n\t * automatically applied to every TF.js Layers model. The `History` object\n\t * gets returned by the `fit` method of models.\n\t */\n\n\tvar History = /*#__PURE__*/function (_BaseCallback2) {\n\t  _inheritsLoose(History, _BaseCallback2);\n\n\t  function History() {\n\t    return _BaseCallback2.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto4 = History.prototype;\n\n\t  _proto4.onTrainBegin = /*#__PURE__*/function () {\n\t    var _onTrainBegin3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee16(logs) {\n\t      return regeneratorRuntime.wrap(function _callee16$(_context16) {\n\t        while (1) {\n\t          switch (_context16.prev = _context16.next) {\n\t            case 0:\n\t              this.epoch = [];\n\t              this.history = {};\n\n\t            case 2:\n\t            case \"end\":\n\t              return _context16.stop();\n\t          }\n\t        }\n\t      }, _callee16, this);\n\t    }));\n\n\t    function onTrainBegin(_x26) {\n\t      return _onTrainBegin3.apply(this, arguments);\n\t    }\n\n\t    return onTrainBegin;\n\t  }();\n\n\t  _proto4.onEpochEnd = /*#__PURE__*/function () {\n\t    var _onEpochEnd4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee17(epoch, logs) {\n\t      var key;\n\t      return regeneratorRuntime.wrap(function _callee17$(_context17) {\n\t        while (1) {\n\t          switch (_context17.prev = _context17.next) {\n\t            case 0:\n\t              if (logs == null) {\n\t                logs = {};\n\t              }\n\n\t              this.epoch.push(epoch);\n\n\t              for (key in logs) {\n\t                if (this.history[key] == null) {\n\t                  this.history[key] = [];\n\t                }\n\n\t                this.history[key].push(logs[key]);\n\t              }\n\n\t            case 3:\n\t            case \"end\":\n\t              return _context17.stop();\n\t          }\n\t        }\n\t      }, _callee17, this);\n\t    }));\n\n\t    function onEpochEnd(_x27, _x28) {\n\t      return _onEpochEnd4.apply(this, arguments);\n\t    }\n\n\t    return onEpochEnd;\n\t  }()\n\t  /**\n\t   * Await the values of all losses and metrics.\n\t   */\n\t  ;\n\n\t  _proto4.syncData =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _syncData = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee18() {\n\t      var promises, keys, indices, key, valueArray, i, valueScalar, values, n, tensorToDispose;\n\t      return regeneratorRuntime.wrap(function _callee18$(_context18) {\n\t        while (1) {\n\t          switch (_context18.prev = _context18.next) {\n\t            case 0:\n\t              promises = [];\n\t              keys = [];\n\t              indices = [];\n\n\t              for (key in this.history) {\n\t                valueArray = this.history[key];\n\n\t                for (i = 0; i < valueArray.length; ++i) {\n\t                  if (typeof valueArray[i] !== 'number') {\n\t                    valueScalar = valueArray[i];\n\t                    promises.push(valueScalar.data());\n\t                    keys.push(key);\n\t                    indices.push(i);\n\t                  }\n\t                }\n\t              }\n\n\t              _context18.next = 6;\n\t              return Promise.all(promises);\n\n\t            case 6:\n\t              values = _context18.sent;\n\n\t              for (n = 0; n < values.length; ++n) {\n\t                tensorToDispose = this.history[keys[n]][indices[n]];\n\t                tensorToDispose.dispose();\n\t                this.history[keys[n]][indices[n]] = values[n][0];\n\t              }\n\n\t            case 8:\n\t            case \"end\":\n\t              return _context18.stop();\n\t          }\n\t        }\n\t      }, _callee18, this);\n\t    }));\n\n\t    function syncData() {\n\t      return _syncData.apply(this, arguments);\n\t    }\n\n\t    return syncData;\n\t  }();\n\n\t  return History;\n\t}(BaseCallback);\n\t/**\n\t * Custom callback for training.\n\t */\n\n\tvar CustomCallback = /*#__PURE__*/function (_BaseCallback3) {\n\t  _inheritsLoose(CustomCallback, _BaseCallback3);\n\n\t  function CustomCallback(args, yieldEvery) {\n\t    var _this3;\n\n\t    _this3 = _BaseCallback3.call(this) || this;\n\t    _this3.currentEpoch = 0;\n\t    _this3.yieldEvery = yieldEvery || 'auto';\n\n\t    if (_this3.yieldEvery === 'auto') {\n\t      _this3.yieldEvery = DEFAULT_YIELD_EVERY_MS;\n\t    }\n\n\t    if (_this3.yieldEvery === 'never' && args.onYield != null) {\n\t      throw new Error('yieldEvery is `never` but you provided an `onYield` callback. ' + 'Either change `yieldEvery` or remove the callback');\n\t    }\n\n\t    if (isNumber(_this3.yieldEvery)) {\n\t      // Decorate `maybeWait` so it will be called at most once every\n\t      // `yieldEvery` ms.\n\t      _this3.maybeWait = debounce(_this3.maybeWait.bind(_assertThisInitialized(_this3)), _this3.yieldEvery);\n\t    }\n\n\t    _this3.trainBegin = args.onTrainBegin;\n\t    _this3.trainEnd = args.onTrainEnd;\n\t    _this3.epochBegin = args.onEpochBegin;\n\t    _this3.epochEnd = args.onEpochEnd;\n\t    _this3.batchBegin = args.onBatchBegin;\n\t    _this3.batchEnd = args.onBatchEnd;\n\t    _this3.yield = args.onYield;\n\t    return _this3;\n\t  }\n\n\t  var _proto5 = CustomCallback.prototype;\n\n\t  _proto5.maybeWait = /*#__PURE__*/function () {\n\t    var _maybeWait = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee19(epoch, batch, logs) {\n\t      var ps;\n\t      return regeneratorRuntime.wrap(function _callee19$(_context19) {\n\t        while (1) {\n\t          switch (_context19.prev = _context19.next) {\n\t            case 0:\n\t              ps = [];\n\n\t              if (!(this.yield != null)) {\n\t                _context19.next = 5;\n\t                break;\n\t              }\n\n\t              _context19.next = 4;\n\t              return resolveScalarsInLogs(logs);\n\n\t            case 4:\n\t              ps.push(this.yield(epoch, batch, logs));\n\n\t            case 5:\n\t              ps.push(nextFrame());\n\t              _context19.next = 8;\n\t              return Promise.all(ps);\n\n\t            case 8:\n\t            case \"end\":\n\t              return _context19.stop();\n\t          }\n\t        }\n\t      }, _callee19, this);\n\t    }));\n\n\t    function maybeWait(_x29, _x30, _x31) {\n\t      return _maybeWait.apply(this, arguments);\n\t    }\n\n\t    return maybeWait;\n\t  }();\n\n\t  _proto5.onEpochBegin = /*#__PURE__*/function () {\n\t    var _onEpochBegin4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee20(epoch, logs) {\n\t      return regeneratorRuntime.wrap(function _callee20$(_context20) {\n\t        while (1) {\n\t          switch (_context20.prev = _context20.next) {\n\t            case 0:\n\t              this.currentEpoch = epoch;\n\n\t              if (!(this.epochBegin != null)) {\n\t                _context20.next = 6;\n\t                break;\n\t              }\n\n\t              _context20.next = 4;\n\t              return resolveScalarsInLogs(logs);\n\n\t            case 4:\n\t              _context20.next = 6;\n\t              return this.epochBegin(epoch, logs);\n\n\t            case 6:\n\t            case \"end\":\n\t              return _context20.stop();\n\t          }\n\t        }\n\t      }, _callee20, this);\n\t    }));\n\n\t    function onEpochBegin(_x32, _x33) {\n\t      return _onEpochBegin4.apply(this, arguments);\n\t    }\n\n\t    return onEpochBegin;\n\t  }();\n\n\t  _proto5.onEpochEnd = /*#__PURE__*/function () {\n\t    var _onEpochEnd5 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee21(epoch, logs) {\n\t      var ps;\n\t      return regeneratorRuntime.wrap(function _callee21$(_context21) {\n\t        while (1) {\n\t          switch (_context21.prev = _context21.next) {\n\t            case 0:\n\t              ps = [];\n\n\t              if (!(this.epochEnd != null)) {\n\t                _context21.next = 5;\n\t                break;\n\t              }\n\n\t              _context21.next = 4;\n\t              return resolveScalarsInLogs(logs);\n\n\t            case 4:\n\t              ps.push(this.epochEnd(epoch, logs));\n\n\t            case 5:\n\t              if (this.yieldEvery === 'epoch') {\n\t                ps.push(nextFrame());\n\t              }\n\n\t              _context21.next = 8;\n\t              return Promise.all(ps);\n\n\t            case 8:\n\t            case \"end\":\n\t              return _context21.stop();\n\t          }\n\t        }\n\t      }, _callee21, this);\n\t    }));\n\n\t    function onEpochEnd(_x34, _x35) {\n\t      return _onEpochEnd5.apply(this, arguments);\n\t    }\n\n\t    return onEpochEnd;\n\t  }();\n\n\t  _proto5.onBatchBegin = /*#__PURE__*/function () {\n\t    var _onBatchBegin3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee22(batch, logs) {\n\t      return regeneratorRuntime.wrap(function _callee22$(_context22) {\n\t        while (1) {\n\t          switch (_context22.prev = _context22.next) {\n\t            case 0:\n\t              if (!(this.batchBegin != null)) {\n\t                _context22.next = 5;\n\t                break;\n\t              }\n\n\t              _context22.next = 3;\n\t              return resolveScalarsInLogs(logs);\n\n\t            case 3:\n\t              _context22.next = 5;\n\t              return this.batchBegin(batch, logs);\n\n\t            case 5:\n\t            case \"end\":\n\t              return _context22.stop();\n\t          }\n\t        }\n\t      }, _callee22, this);\n\t    }));\n\n\t    function onBatchBegin(_x36, _x37) {\n\t      return _onBatchBegin3.apply(this, arguments);\n\t    }\n\n\t    return onBatchBegin;\n\t  }();\n\n\t  _proto5.onBatchEnd = /*#__PURE__*/function () {\n\t    var _onBatchEnd4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee23(batch, logs) {\n\t      var ps;\n\t      return regeneratorRuntime.wrap(function _callee23$(_context23) {\n\t        while (1) {\n\t          switch (_context23.prev = _context23.next) {\n\t            case 0:\n\t              ps = [];\n\n\t              if (!(this.batchEnd != null)) {\n\t                _context23.next = 5;\n\t                break;\n\t              }\n\n\t              _context23.next = 4;\n\t              return resolveScalarsInLogs(logs);\n\n\t            case 4:\n\t              ps.push(this.batchEnd(batch, logs));\n\n\t            case 5:\n\t              if (this.yieldEvery === 'batch') {\n\t                ps.push(nextFrame());\n\t              } else if (isNumber(this.yieldEvery)) {\n\t                ps.push(this.maybeWait(this.currentEpoch, batch, logs));\n\t              }\n\n\t              _context23.next = 8;\n\t              return Promise.all(ps);\n\n\t            case 8:\n\t            case \"end\":\n\t              return _context23.stop();\n\t          }\n\t        }\n\t      }, _callee23, this);\n\t    }));\n\n\t    function onBatchEnd(_x38, _x39) {\n\t      return _onBatchEnd4.apply(this, arguments);\n\t    }\n\n\t    return onBatchEnd;\n\t  }();\n\n\t  _proto5.onTrainBegin = /*#__PURE__*/function () {\n\t    var _onTrainBegin4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee24(logs) {\n\t      return regeneratorRuntime.wrap(function _callee24$(_context24) {\n\t        while (1) {\n\t          switch (_context24.prev = _context24.next) {\n\t            case 0:\n\t              if (!(this.trainBegin != null)) {\n\t                _context24.next = 5;\n\t                break;\n\t              }\n\n\t              _context24.next = 3;\n\t              return resolveScalarsInLogs(logs);\n\n\t            case 3:\n\t              _context24.next = 5;\n\t              return this.trainBegin(logs);\n\n\t            case 5:\n\t            case \"end\":\n\t              return _context24.stop();\n\t          }\n\t        }\n\t      }, _callee24, this);\n\t    }));\n\n\t    function onTrainBegin(_x40) {\n\t      return _onTrainBegin4.apply(this, arguments);\n\t    }\n\n\t    return onTrainBegin;\n\t  }();\n\n\t  _proto5.onTrainEnd = /*#__PURE__*/function () {\n\t    var _onTrainEnd3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee25(logs) {\n\t      return regeneratorRuntime.wrap(function _callee25$(_context25) {\n\t        while (1) {\n\t          switch (_context25.prev = _context25.next) {\n\t            case 0:\n\t              if (!(this.trainEnd != null)) {\n\t                _context25.next = 5;\n\t                break;\n\t              }\n\n\t              _context25.next = 3;\n\t              return resolveScalarsInLogs(logs);\n\n\t            case 3:\n\t              _context25.next = 5;\n\t              return this.trainEnd(logs);\n\n\t            case 5:\n\t            case \"end\":\n\t              return _context25.stop();\n\t          }\n\t        }\n\t      }, _callee25, this);\n\t    }));\n\n\t    function onTrainEnd(_x41) {\n\t      return _onTrainEnd3.apply(this, arguments);\n\t    }\n\n\t    return onTrainEnd;\n\t  }();\n\n\t  return CustomCallback;\n\t}(BaseCallback);\n\t/**\n\t * Standardize callbacks or configurations of them to an Array of callbacks.\n\t */\n\n\tfunction standardizeCallbacks(callbacks, yieldEvery) {\n\t  if (callbacks == null) {\n\t    callbacks = {};\n\t  }\n\n\t  if (callbacks instanceof BaseCallback) {\n\t    return [callbacks];\n\t  }\n\n\t  if (Array.isArray(callbacks) && callbacks[0] instanceof BaseCallback) {\n\t    return callbacks;\n\t  } // Convert custom callback configs to custom callback objects.\n\n\n\t  var callbackConfigs = toList(callbacks);\n\t  return callbackConfigs.map(function (callbackConfig) {\n\t    return new CustomCallback(callbackConfig, yieldEvery);\n\t  });\n\t}\n\t/**\n\t * A global registry for callback constructors to be used during\n\t * LayersModel.fit().\n\t */\n\n\tvar CallbackConstructorRegistry = /*#__PURE__*/function () {\n\t  /**\n\t   * Blocks public access to constructor.\n\t   */\n\t  function CallbackConstructorRegistry() {}\n\t  /**\n\t   * Register a tf.LayersModel.fit() callback constructor.\n\t   *\n\t   * The registered callback constructor will be used to instantiate\n\t   * callbacks for every tf.LayersModel.fit() call afterwards.\n\t   *\n\t   * @param verbosityLevel Level of verbosity at which the `callbackConstructor`\n\t   *   is to be reigstered.\n\t   * @param callbackConstructor A no-arg constructor for `tf.Callback`.\n\t   * @throws Error, if the same callbackConstructor has been registered before,\n\t   *   either at the same or a different `verbosityLevel`.\n\t   */\n\n\n\t  CallbackConstructorRegistry.registerCallbackConstructor = function registerCallbackConstructor(verbosityLevel, callbackConstructor) {\n\t    assert(verbosityLevel >= 0 && Number.isInteger(verbosityLevel), function () {\n\t      return \"Verbosity level is expected to be an integer >= 0, \" + (\"but got \" + verbosityLevel);\n\t    });\n\t    CallbackConstructorRegistry.checkForDuplicate(callbackConstructor);\n\n\t    if (CallbackConstructorRegistry.constructors[verbosityLevel] == null) {\n\t      CallbackConstructorRegistry.constructors[verbosityLevel] = [];\n\t    }\n\n\t    CallbackConstructorRegistry.constructors[verbosityLevel].push(callbackConstructor);\n\t  };\n\n\t  CallbackConstructorRegistry.checkForDuplicate = function checkForDuplicate(callbackConstructor) {\n\t    for (var levelName in CallbackConstructorRegistry.constructors) {\n\t      var constructors = CallbackConstructorRegistry.constructors[+levelName];\n\t      constructors.forEach(function (ctor) {\n\t        if (ctor === callbackConstructor) {\n\t          throw new ValueError('Duplicate callback constructor.');\n\t        }\n\t      });\n\t    }\n\t  }\n\t  /**\n\t   * Clear all registered callback constructors.\n\t   */\n\t  ;\n\n\t  CallbackConstructorRegistry.clear = function clear() {\n\t    CallbackConstructorRegistry.constructors = {};\n\t  }\n\t  /**\n\t   * Create callbacks using the registered callback constructors.\n\t   *\n\t   * Given `verbosityLevel`, all constructors registered at that level or above\n\t   * will be called and the instantiated callbacks will be used.\n\t   *\n\t   * @param verbosityLevel: Level of verbosity.\n\t   */\n\t  ;\n\n\t  CallbackConstructorRegistry.createCallbacks = function createCallbacks(verbosityLevel) {\n\t    var constructors = [];\n\n\t    for (var levelName in CallbackConstructorRegistry.constructors) {\n\t      var level = +levelName;\n\n\t      if (verbosityLevel >= level) {\n\t        constructors.push.apply(constructors, CallbackConstructorRegistry.constructors[level]);\n\t      }\n\t    }\n\n\t    return constructors.map(function (ctor) {\n\t      return new ctor();\n\t    });\n\t  };\n\n\t  return CallbackConstructorRegistry;\n\t}();\n\tCallbackConstructorRegistry.constructors = {};\n\tfunction configureCallbacks(callbacks, verbose, epochs, initialEpoch, numTrainSamples, stepsPerEpoch, batchSize, doValidation, callbackMetrics) {\n\t  var history = new History();\n\t  var actualCallbacks = [new BaseLogger()].concat(CallbackConstructorRegistry.createCallbacks(verbose));\n\n\t  if (callbacks != null) {\n\t    actualCallbacks.push.apply(actualCallbacks, callbacks);\n\t  }\n\n\t  actualCallbacks.push(history);\n\t  var callbackList = new CallbackList(actualCallbacks); // TODO(cais): Figure out when this LayersModel instance can have a\n\t  // dynamically\n\t  //   set property called 'callback_model' as in PyKeras.\n\n\t  callbackList.setParams({\n\t    epochs: epochs,\n\t    initialEpoch: initialEpoch,\n\t    samples: numTrainSamples,\n\t    steps: stepsPerEpoch,\n\t    batchSize: batchSize,\n\t    verbose: verbose,\n\t    doValidation: doValidation,\n\t    metrics: callbackMetrics\n\t  });\n\t  return {\n\t    callbackList: callbackList,\n\t    history: history\n\t  };\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\t/**\n\t * Instantiate a layer from a config dictionary.\n\t * @param config dict of the form {class_name: str, config: dict}\n\t * @param customObjects dict mapping class names (or function names)\n\t *   of custom (non-Keras) objects to class/functions\n\t * @param fastWeightInit Optional flag to use fast weight initialization\n\t *   during deserialization. This is applicable to cases in which\n\t *   the initialization will be immediately overwritten by loaded weight\n\t *   values. Default: `false`.\n\t * @returns Layer instance (may be LayersModel, Sequential, Layer...)\n\t */\n\n\tfunction deserialize$1(config, customObjects, fastWeightInit) {\n\t  if (customObjects === void 0) {\n\t    customObjects = {};\n\t  }\n\n\t  if (fastWeightInit === void 0) {\n\t    fastWeightInit = false;\n\t  }\n\n\t  return deserializeKerasObject(config, SerializationMap.getMap().classNameMap, customObjects, 'layer', fastWeightInit);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\t/**\n\t * Normalizes a tensor wrt the L2 norm alongside the specified axis.\n\t * @param x\n\t * @param axis Axis along which to perform normalization.\n\t */\n\n\tfunction l2Normalize(x, axis) {\n\t  return tidy(function () {\n\t    if (x.dtype !== 'float32') {\n\t      x = x.asType('float32');\n\t    }\n\n\t    var squareSum = sum$1(square$1(x), axis, true);\n\t    var epsilonTensor = fill(squareSum.shape, epsilon());\n\t    var norm = sqrt$3(maximum(squareSum, epsilonTensor));\n\t    return div(x, norm);\n\t  });\n\t}\n\tfunction meanSquaredError$1(yTrue, yPred) {\n\t  return tidy(function () {\n\t    return mean(square$1(sub(yPred, yTrue)), -1);\n\t  });\n\t}\n\tfunction meanAbsoluteError(yTrue, yPred) {\n\t  return tidy(function () {\n\t    return mean(abs$8(sub(yPred, yTrue)), -1);\n\t  });\n\t}\n\tfunction meanAbsolutePercentageError(yTrue, yPred) {\n\t  return tidy(function () {\n\t    var diff = sub(yTrue, yPred);\n\t    var clippedTrue = clipByValue(abs$8(yTrue), epsilon(), Number.MAX_VALUE);\n\t    var absResult = abs$8(div(diff, clippedTrue));\n\t    return mul(100, mean(absResult, -1));\n\t  });\n\t}\n\tfunction meanSquaredLogarithmicError(yTrue, yPred) {\n\t  return tidy(function () {\n\t    var clippedPred = clipByValue(yPred, epsilon(), Number.MAX_VALUE);\n\t    var firstLog = log$9(add$1(1, clippedPred));\n\t    var clippedTrue = clipByValue(yTrue, epsilon(), Number.MAX_VALUE);\n\t    var secondLog = log$9(add$1(1, clippedTrue));\n\t    return mean(square$1(sub(firstLog, secondLog)), -1);\n\t  });\n\t}\n\tfunction squaredHinge(yTrue, yPred) {\n\t  return tidy(function () {\n\t    var maxResult = maximum(0, sub(1, mul(yTrue, yPred)));\n\t    return mean(square$1(maxResult), -1);\n\t  });\n\t}\n\tfunction hinge(yTrue, yPred) {\n\t  return tidy(function () {\n\t    var maxResult = maximum(0, sub(1, mul(yTrue, yPred)));\n\t    return mean(maxResult, -1);\n\t  });\n\t}\n\tfunction categoricalHinge(yTrue, yPred) {\n\t  return tidy(function () {\n\t    var pos = sum$1(mul(yTrue, yPred), -1);\n\t    var neg = max$4(mul(sub(1, yTrue), yPred), -1);\n\t    return maximum(0, add$1(1, sub(neg, pos)));\n\t  });\n\t}\n\t/**\n\t * Logarithm of the hyperbolic cosine of the prediction error.\n\t *\n\t * `log(cosh(x))` is approximately equal to `(x ** 2) / 2` for small `x` and\n\t * to `abs(x) - log(2)` for large `x`. This means that 'logcosh' works mostly\n\t * like the mean squared error, but will not be so strongly affected by the\n\t * occasional wildly incorrect prediction.\n\t */\n\n\tfunction logcosh(yTrue, yPred) {\n\t  return tidy(function () {\n\t    var log2 = Math.log(2);\n\t    var predictionDiff = sub(yPred, yTrue);\n\t    var logcoshResult = sub(add$1(predictionDiff, softplus(mul(-2, predictionDiff))), log2);\n\t    return mean(logcoshResult, -1);\n\t  });\n\t}\n\tfunction categoricalCrossentropy(target, output, fromLogits) {\n\t  if (fromLogits === void 0) {\n\t    fromLogits = false;\n\t  }\n\n\t  return tidy(function () {\n\t    if (fromLogits) {\n\t      output = softmax(output);\n\t    } else {\n\t      // scale preds so that the class probabilities of each sample sum to 1.\n\t      var outputSum = sum$1(output, output.shape.length - 1, true);\n\t      output = div(output, outputSum);\n\t    }\n\n\t    output = clipByValue(output, epsilon(), 1 - epsilon());\n\t    return neg(sum$1(mul(target.toFloat(), log$9(output)), output.shape.length - 1));\n\t  });\n\t}\n\t/**\n\t * Categorical crossentropy with integer targets.\n\t *\n\t * @param target An integer tensor.\n\t * @param output A tensor resulting from a softmax (unless `fromLogits` is\n\t *  `true`, in which case `output` is expected to be the logits).\n\t * @param fromLogits Boolean, whether `output` is the result of a softmax, or is\n\t *   a tensor of logits.\n\t */\n\n\tfunction sparseCategoricalCrossentropy(target, output, fromLogits) {\n\t  if (fromLogits === void 0) {\n\t    fromLogits = false;\n\t  }\n\n\t  return tidy(function () {\n\t    var flatTarget = floor$a(flatten$1(target)).toInt();\n\t    output = clipByValue(output, epsilon(), 1 - epsilon());\n\t    var outputShape = output.shape;\n\t    var oneHotTarget = oneHot(flatTarget, outputShape[outputShape.length - 1]).reshape(outputShape);\n\t    return categoricalCrossentropy(oneHotTarget, output, fromLogits);\n\t  });\n\t}\n\t/**\n\t * From TensorFlow's implementation in nn_impl.py:\n\t *\n\t * For brevity, let `x = logits`, `z = labels`.  The logistic loss is\n\t *      z * -log(sigmoid(x)) + (1 - z) * -log(1 - sigmoid(x))\n\t *    = z * -log(1 / (1 + exp(-x))) + (1 - z) * -log(exp(-x) / (1 + exp(-x)))\n\t *    = z * log(1 + exp(-x)) + (1 - z) * (-log(exp(-x)) + log(1 + exp(-x)))\n\t *    = z * log(1 + exp(-x)) + (1 - z) * (x + log(1 + exp(-x))\n\t *    = (1 - z) * x + log(1 + exp(-x))\n\t *    = x - x * z + log(1 + exp(-x))\n\t * For x < 0, to avoid overflow in exp(-x), we reformulate the above\n\t *      x - x * z + log(1 + exp(-x))\n\t *    = log(exp(x)) - x * z + log(1 + exp(-x))\n\t *    = - x * z + log(1 + exp(x))\n\t * Hence, to ensure stability and avoid overflow, the implementation uses this\n\t * equivalent formulation\n\t *    max(x, 0) - x * z + log(1 + exp(-abs(x)))\n\t *\n\t * @param labels The labels.\n\t * @param logits The logits.\n\t */\n\n\tfunction sigmoidCrossEntropyWithLogits(labels, logits) {\n\t  if (!arraysEqual(labels.shape, logits.shape)) {\n\t    throw new ValueError(\"logits and labels must have the same shape, but got shapes \" + (JSON.stringify(labels.shape) + \" and \" + JSON.stringify(logits.shape)));\n\t  }\n\n\t  return tidy(function () {\n\t    // The logistic loss formula from above is\n\t    //   x - x * z + log(1 + exp(-x))\n\t    // For x < 0, a more numerically stable formula is\n\t    //   -x * z + log(1 + exp(x))\n\t    // Note that these two expressions can be combined into the following:\n\t    //   max(x, 0) - x * z + log(1 + exp(-abs(x)))\n\t    var reluLogits = logits.relu();\n\t    var negAbsLogits = logits.abs().neg();\n\t    return reluLogits.sub(logits.mul(labels)).add(negAbsLogits.exp().log1p());\n\t  });\n\t}\n\tfunction binaryCrossentropy(yTrue, yPred) {\n\t  return tidy(function () {\n\t    var y;\n\t    y = clipByValue(yPred, epsilon(), 1 - epsilon());\n\t    y = log$9(div(y, sub(1, y)));\n\t    return mean(sigmoidCrossEntropyWithLogits(yTrue, y), -1);\n\t  });\n\t}\n\tfunction kullbackLeiblerDivergence(yTrue, yPred) {\n\t  return tidy(function () {\n\t    var clippedTrue = clipByValue(yTrue, epsilon(), 1);\n\t    var clippedPred = clipByValue(yPred, epsilon(), 1);\n\t    return sum$1(mul(yTrue, log$9(div(clippedTrue, clippedPred))), -1);\n\t  });\n\t}\n\tfunction poisson(yTrue, yPred) {\n\t  return tidy(function () {\n\t    var logPred = log$9(add$1(epsilon(), yPred));\n\t    return mean(sub(yPred, mul(yTrue, logPred)), -1);\n\t  });\n\t}\n\tfunction cosineProximity(yTrue, yPred) {\n\t  return tidy(function () {\n\t    var trueNormalized = l2Normalize(yTrue, -1);\n\t    var predNormalized = l2Normalize(yPred, -1);\n\t    var trueXPred = mul(trueNormalized, predNormalized);\n\t    return neg(sum$1(trueXPred, -1));\n\t  });\n\t}\n\tvar mse = meanSquaredError$1;\n\tvar MSE = meanSquaredError$1;\n\tvar mae = meanAbsoluteError;\n\tvar MAE = meanAbsoluteError;\n\tvar mape = meanAbsolutePercentageError;\n\tvar MAPE = meanAbsolutePercentageError;\n\tvar msle = meanSquaredLogarithmicError;\n\tvar MSLE = meanSquaredLogarithmicError;\n\tvar kld = kullbackLeiblerDivergence;\n\tvar KLD = kullbackLeiblerDivergence;\n\tvar cosine = cosineProximity; // TODO(michaelterry): Add deserialize() function.\n\n\tvar lossesMap = {\n\t  meanSquaredError: meanSquaredError$1,\n\t  meanAbsoluteError: meanAbsoluteError,\n\t  meanAbsolutePercentageError: meanAbsolutePercentageError,\n\t  meanSquaredLogarithmicError: meanSquaredLogarithmicError,\n\t  squaredHinge: squaredHinge,\n\t  hinge: hinge,\n\t  categoricalHinge: categoricalHinge,\n\t  logcosh: logcosh,\n\t  categoricalCrossentropy: categoricalCrossentropy,\n\t  sparseCategoricalCrossentropy: sparseCategoricalCrossentropy,\n\t  binaryCrossentropy: binaryCrossentropy,\n\t  kullbackLeiblerDivergence: kullbackLeiblerDivergence,\n\t  poisson: poisson,\n\t  cosineProximity: cosineProximity\n\t}; // Porting note: This diverges from the PyKeras implementation and may need to\n\t// change based on (de)serialization requirements.\n\n\tfunction get$3(identifierOrFn) {\n\t  if (typeof identifierOrFn === 'string') {\n\t    if (identifierOrFn in lossesMap) {\n\t      return lossesMap[identifierOrFn];\n\t    }\n\n\t    var errMsg = \"Unknown loss \" + identifierOrFn;\n\n\t    if (identifierOrFn.toLowerCase().includes('softmaxcrossentropy')) {\n\t      errMsg = \"Unknown loss \" + identifierOrFn + \". \" + 'Use \"categoricalCrossentropy\" as the string name for ' + 'tf.losses.softmaxCrossEntropy';\n\t    }\n\n\t    throw new ValueError(errMsg);\n\t  } else {\n\t    return identifierOrFn;\n\t  }\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\tfunction binaryAccuracy(yTrue, yPred) {\n\t  return tidy(function () {\n\t    var threshold = mul(.5, onesLike(yPred));\n\t    var yPredThresholded = cast$1(greater(yPred, threshold), yTrue.dtype);\n\t    return mean(equal(yTrue, yPredThresholded), -1);\n\t  });\n\t}\n\tfunction categoricalAccuracy(yTrue, yPred) {\n\t  return tidy(function () {\n\t    return cast$1(equal(argMax(yTrue, -1), argMax(yPred, -1)), 'float32');\n\t  });\n\t}\n\n\tfunction truePositives(yTrue, yPred) {\n\t  return tidy(function () {\n\t    return logicalAnd(yTrue.equal(1), yPred.equal(1)).sum().cast('float32');\n\t  });\n\t}\n\n\tfunction falseNegatives(yTrue, yPred) {\n\t  return tidy(function () {\n\t    return logicalAnd(yTrue.equal(1), yPred.equal(0)).sum().cast('float32');\n\t  });\n\t}\n\n\tfunction falsePositives(yTrue, yPred) {\n\t  return tidy(function () {\n\t    return logicalAnd(yTrue.equal(0), yPred.equal(1)).sum().cast('float32');\n\t  });\n\t}\n\n\tfunction precision(yTrue, yPred) {\n\t  return tidy(function () {\n\t    var tp = truePositives(yTrue, yPred);\n\t    var fp = falsePositives(yTrue, yPred);\n\t    var denominator = tp.add(fp);\n\t    return where(greater(denominator, 0), tp.div(denominator), 0).cast('float32');\n\t  });\n\t}\n\tfunction recall(yTrue, yPred) {\n\t  return tidy(function () {\n\t    var tp = truePositives(yTrue, yPred);\n\t    var fn = falseNegatives(yTrue, yPred);\n\t    var denominator = tp.add(fn);\n\t    return where(greater(denominator, 0), tp.div(denominator), 0).cast('float32');\n\t  });\n\t}\n\tfunction binaryCrossentropy$1(yTrue, yPred) {\n\t  return binaryCrossentropy(yTrue, yPred);\n\t}\n\tfunction sparseCategoricalAccuracy(yTrue, yPred) {\n\t  if (yTrue.rank === yPred.rank) {\n\t    yTrue = yTrue.squeeze([yTrue.rank - 1]);\n\t  }\n\n\t  yPred = yPred.argMax(-1);\n\n\t  if (yPred.dtype !== yTrue.dtype) {\n\t    yPred = yPred.asType(yTrue.dtype);\n\t  }\n\n\t  return equal(yTrue, yPred).asType('float32');\n\t}\n\tfunction topKCategoricalAccuracy(yTrue, yPred) {\n\t  throw new NotImplementedError();\n\t}\n\tfunction sparseTopKCategoricalAccuracy(yTrue, yPred) {\n\t  throw new NotImplementedError();\n\t} // Aliases.\n\n\tvar mse$1 = meanSquaredError$1;\n\tvar MSE$1 = meanSquaredError$1;\n\tvar mae$1 = meanAbsoluteError;\n\tvar MAE$1 = meanAbsoluteError;\n\tvar mape$1 = meanAbsolutePercentageError;\n\tvar MAPE$1 = meanAbsolutePercentageError;\n\tvar categoricalCrossentropy$1 = categoricalCrossentropy;\n\tvar cosine$1 = cosineProximity;\n\tvar sparseCategoricalCrossentropy$1 = sparseCategoricalCrossentropy; // TODO(cais, nielsene): Add serialize().\n\n\tvar metricsMap = {\n\t  binaryAccuracy: binaryAccuracy,\n\t  categoricalAccuracy: categoricalAccuracy,\n\t  precision: precision,\n\t  categoricalCrossentropy: categoricalCrossentropy$1,\n\t  sparseCategoricalCrossentropy: sparseCategoricalCrossentropy$1,\n\t  mse: mse$1,\n\t  MSE: MSE$1,\n\t  mae: mae$1,\n\t  MAE: MAE$1,\n\t  mape: mape$1,\n\t  MAPE: MAPE$1,\n\t  cosine: cosine$1\n\t};\n\tfunction get$4(identifier) {\n\t  if (typeof identifier === 'string' && identifier in metricsMap) {\n\t    return metricsMap[identifier];\n\t  } else if (typeof identifier !== 'string' && identifier != null) {\n\t    return identifier;\n\t  } else {\n\t    throw new ValueError(\"Unknown metric \" + identifier);\n\t  }\n\t}\n\t/**\n\t * Get the shortcut function name.\n\t *\n\t * If the fn name is a string,\n\t *   directly return the string name.\n\t * If the function is included in metricsMap or lossesMap,\n\t *   return key of the map.\n\t *   - If the function relative to multiple keys,\n\t *     return the first found key as the function name.\n\t *   - If the function exists in both lossesMap and metricsMap,\n\t *     search lossesMap first.\n\t * If the function is not included in metricsMap or lossesMap,\n\t *   return the function name.\n\t *\n\t * @param fn loss function, metric function, or short cut name.\n\t * @returns Loss or Metric name in string.\n\t */\n\n\tfunction getLossOrMetricName(fn) {\n\t  assert$1(fn !== null, \"Unknown LossOrMetricFn \" + fn);\n\n\t  if (typeof fn === 'string') {\n\t    return fn;\n\t  } else {\n\t    var fnName;\n\n\t    for (var _i = 0, _Object$keys = Object.keys(lossesMap); _i < _Object$keys.length; _i++) {\n\t      var key = _Object$keys[_i];\n\n\t      if (lossesMap[key] === fn) {\n\t        fnName = key;\n\t        break;\n\t      }\n\t    }\n\n\t    if (fnName !== undefined) {\n\t      return fnName;\n\t    }\n\n\t    for (var _i2 = 0, _Object$keys2 = Object.keys(metricsMap); _i2 < _Object$keys2.length; _i2++) {\n\t      var _key = _Object$keys2[_i2];\n\n\t      if (metricsMap[_key] === fn) {\n\t        fnName = _key;\n\t        break;\n\t      }\n\t    }\n\n\t    if (fnName !== undefined) {\n\t      return fnName;\n\t    }\n\n\t    return fn.name;\n\t  }\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\t// Porting note: This diverges from the PyKeras implementation and may need to\n\t// change based on (de)serialization requirements.\n\n\tfunction getOptimizer(identifier) {\n\t  var optimizerMap = {\n\t    'Adagrad': function Adagrad() {\n\t      return train.adagrad(0.01);\n\t    },\n\t    'Adadelta': function Adadelta() {\n\t      return train.adadelta(1, 0.95, epsilon());\n\t    },\n\t    'Adam': function Adam() {\n\t      return train.adam(0.001, 0.9, 0.999, epsilon());\n\t    },\n\t    'Adamax': function Adamax() {\n\t      return train.adamax(0.002, 0.9, 0.999, epsilon(), 0);\n\t    },\n\t    'RMSProp': function RMSProp() {\n\t      return train.rmsprop(0.001, 0.9, 0, epsilon());\n\t    },\n\t    'SGD': function SGD() {\n\t      return train.sgd(0.01);\n\t    }\n\t  };\n\t  optimizerMap['adagrad'] = optimizerMap['Adagrad'];\n\t  optimizerMap['adadelta'] = optimizerMap['Adadelta'];\n\t  optimizerMap['adam'] = optimizerMap['Adam'];\n\t  optimizerMap['adamax'] = optimizerMap['Adamax'];\n\t  optimizerMap['rmsprop'] = optimizerMap['RMSProp'];\n\t  optimizerMap['sgd'] = optimizerMap['SGD'];\n\n\t  if (identifier in optimizerMap) {\n\t    return optimizerMap[identifier]();\n\t  }\n\n\t  throw new ValueError(\"Unknown Optimizer \" + identifier);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\n\t/** Utility functions related to user-defined metadata. */\n\t// Maximum recommended serialized size for user-defined metadata.\n\t// Beyond this limit, a warning message will be printed during model loading and\n\t// saving.\n\tvar MAX_USER_DEFINED_METADATA_SERIALIZED_LENGTH = 1 * 1024 * 1024;\n\t/**\n\t * Check validity of user-defined metadata.\n\t *\n\t * @param userDefinedMetadata\n\t * @param modelName Name of the model that the user-defined metadata belongs to.\n\t *   Used during construction of error messages.\n\t * @param checkSize Whether to check the size of the metadata is under\n\t *   recommended limit. Default: `false`. If `true`, will try stringify the\n\t *   JSON object and print a console warning if the serialzied size is above the\n\t *   limit.\n\t * @throws Error if `userDefinedMetadata` is not a plain JSON object.\n\t */\n\n\tfunction checkUserDefinedMetadata(userDefinedMetadata, modelName, checkSize) {\n\t  if (checkSize === void 0) {\n\t    checkSize = false;\n\t  }\n\n\t  if (userDefinedMetadata == null || typeof userDefinedMetadata !== 'object' || Object.getPrototypeOf(userDefinedMetadata) !== Object.prototype || !plainObjectCheck(userDefinedMetadata)) {\n\t    throw new Error('User-defined metadata is expected to be a JSON object, but is not.');\n\t  }\n\n\t  if (checkSize) {\n\t    var out = JSON.stringify(userDefinedMetadata);\n\n\t    if (out.length > MAX_USER_DEFINED_METADATA_SERIALIZED_LENGTH) {\n\t      console.warn(\"User-defined metadata of model \\\"\" + modelName + \"\\\" is too large in \" + (\"size (length=\" + out.length + \" when serialized). It is not \") + \"recommended to store such large objects in user-defined metadata. \" + \"Please make sure its serialized length is <= \" + (MAX_USER_DEFINED_METADATA_SERIALIZED_LENGTH + \".\"));\n\t    }\n\t  }\n\t}\n\t/**\n\t * Check if an input is plain JSON object or any valid subfield of it.\n\t *\n\t * @param x The input to be checked.\n\t * @param assertObject Whether to assert `x` is a JSON object, i.e., reject\n\t *   cases of arrays and primitives.\n\t * @return Returns `true` if and only if `x` is a plain JSON object,\n\t *   a JSON-valid primitive including string, number, boolean and null,\n\t *   or an array of the said types.\n\t */\n\t// tslint:disable-next-line:no-any\n\n\tfunction plainObjectCheck(x) {\n\t  if (x === null) {\n\t    // Note: typeof `null` is 'object', and `null` is valid in JSON.\n\t    return true;\n\t  } else if (typeof x === 'object') {\n\t    if (Object.getPrototypeOf(x) === Object.prototype) {\n\t      // `x` is a JavaScript object and its prototype is Object.\n\t      var keys = Object.keys(x);\n\n\t      for (var _i = 0, _keys = keys; _i < _keys.length; _i++) {\n\t        var key = _keys[_i];\n\n\t        if (typeof key !== 'string') {\n\t          // JSON keys must be strings.\n\t          return false;\n\t        }\n\n\t        if (!plainObjectCheck(x[key])) {\n\t          // Recursive call.\n\t          return false;\n\t        }\n\t      }\n\n\t      return true;\n\t    } else {\n\t      // `x` is a JavaScript object but its prototype is not Object.\n\t      if (Array.isArray(x)) {\n\t        // `x` is a JavaScript array.\n\t        for (var _iterator = _createForOfIteratorHelperLoose(x), _step; !(_step = _iterator()).done;) {\n\t          var item = _step.value;\n\n\t          if (!plainObjectCheck(item)) {\n\t            // Recursive call.\n\t            return false;\n\t          }\n\t        }\n\n\t        return true;\n\t      } else {\n\t        // `x` is a JavaScript object and its prototype is not Object,\n\t        // and it's not an Array. I.e., it's a complex object such as\n\t        // `Error` and `Date`.\n\t        return false;\n\t      }\n\t    }\n\t  } else {\n\t    // `x` is not a JavaScript object or `null`.\n\t    var xType = typeof x;\n\t    return xType === 'string' || xType === 'number' || xType === 'boolean';\n\t  }\n\t}\n\n\t/**\n\t * Print the summary of a LayersModel object.\n\t *\n\t * @param model tf.LayersModel instance.\n\t * @param lineLength Total length of printed lines. Set this to adapt to the\n\t *   display to different terminal or console sizes.\n\t * @param positions Relative or absolute positions of log elements in each\n\t *   line. Each number corresponds to right-most (i.e., ending) position of a\n\t *   column.\n\t *   If not provided, defaults to `[0.45, 0.85, 1]` for sequential-like\n\t *   models and `[0.33, 0.55, 0.67, 1]` for non-sequential like models.\n\t * @param printFn Print function to use.\n\t *   It will be called on each line of the summary. You can provide a custom\n\t *   function in order to capture the string summary. Defaults to `console.log`.\n\t */\n\n\tfunction printSummary(model, lineLength, positions, // tslint:disable-next-line:no-any\n\tprintFn) {\n\t  if (printFn === void 0) {\n\t    printFn = console.log;\n\t  }\n\n\t  var sequentialLike = isModelSequentialLike(model); // Header names for different log elements.\n\n\t  var toDisplay = ['Layer (type)', 'Output shape', 'Param #'];\n\n\t  if (sequentialLike) {\n\t    lineLength = lineLength || 65;\n\t    positions = positions || [0.45, 0.85, 1];\n\t  } else {\n\t    lineLength = lineLength || 98;\n\t    positions = positions || [0.33, 0.55, 0.67, 1]; // Header names for different log elements.\n\t  }\n\n\t  if (positions[positions.length - 1] <= 1) {\n\t    // `positions` is relative. Convert it to absolute positioning.\n\t    positions = positions.map(function (p) {\n\t      return Math.floor(lineLength * p);\n\t    });\n\t  }\n\n\t  var relevantNodes;\n\n\t  if (!sequentialLike) {\n\t    toDisplay.push('Receives inputs');\n\t    relevantNodes = [];\n\n\t    for (var depth in model.nodesByDepth) {\n\t      var _relevantNodes;\n\n\t      (_relevantNodes = relevantNodes).push.apply(_relevantNodes, model.nodesByDepth[depth]);\n\t    }\n\t  }\n\n\t  printFn('_'.repeat(lineLength));\n\t  printRow(toDisplay, positions, printFn);\n\t  printFn('='.repeat(lineLength));\n\t  var layers = model.layers;\n\n\t  for (var i = 0; i < layers.length; ++i) {\n\t    if (sequentialLike) {\n\t      printLayerSummary(layers[i], positions, printFn);\n\t    } else {\n\t      printLayerSummaryWithConnections(layers[i], positions, relevantNodes, printFn);\n\t    }\n\n\t    printFn((i === layers.length - 1 ? '=' : '_').repeat(lineLength));\n\t  } // tslint:disable-next-line:no-any\n\n\n\t  model.checkTrainableWeightsConsistency();\n\t  var trainableCount = countTrainableParams(model);\n\t  var nonTrainableCount = countParamsInWeights(model.nonTrainableWeights);\n\t  printFn(\"Total params: \" + (trainableCount + nonTrainableCount));\n\t  printFn(\"Trainable params: \" + trainableCount);\n\t  printFn(\"Non-trainable params: \" + nonTrainableCount);\n\t  printFn('_'.repeat(lineLength));\n\t}\n\n\tfunction countTrainableParams(model) {\n\t  var trainableCount; // tslint:disable:no-any\n\n\t  if (model.collectedTrainableWeights != null) {\n\t    trainableCount = countParamsInWeights(model.collectedTrainableWeights);\n\t  } else {\n\t    trainableCount = countParamsInWeights(model.trainableWeights);\n\t  } // tslint:enable:no-any\n\n\n\t  return trainableCount;\n\t}\n\n\tfunction isModelSequentialLike(model) {\n\t  var sequentialLike = true;\n\t  var nodesByDepth = [];\n\t  var nodes = [];\n\n\t  for (var depth in model.nodesByDepth) {\n\t    nodesByDepth.push(model.nodesByDepth[depth]);\n\t  }\n\n\t  for (var _i = 0, _nodesByDepth = nodesByDepth; _i < _nodesByDepth.length; _i++) {\n\t    var depthNodes = _nodesByDepth[_i];\n\n\t    if (depthNodes.length > 1 || depthNodes.length === 1 && depthNodes[0].inboundLayers.length > 1) {\n\t      sequentialLike = false;\n\t      break;\n\t    }\n\n\t    nodes.push.apply(nodes, depthNodes);\n\t  }\n\n\t  if (sequentialLike) {\n\t    // Search for shared layers.\n\t    for (var _iterator = _createForOfIteratorHelperLoose(model.layers), _step; !(_step = _iterator()).done;) {\n\t      var layer = _step.value;\n\t      var flag = false;\n\n\t      for (var _iterator2 = _createForOfIteratorHelperLoose(layer.inboundNodes), _step2; !(_step2 = _iterator2()).done;) {\n\t        var node = _step2.value;\n\n\t        if (nodes.indexOf(node) !== -1) {\n\t          if (flag) {\n\t            sequentialLike = false;\n\t            break;\n\t          } else {\n\t            flag = true;\n\t          }\n\t        }\n\t      }\n\n\t      if (!sequentialLike) {\n\t        break;\n\t      }\n\t    }\n\t  }\n\n\t  return sequentialLike;\n\t}\n\n\tfunction printRow(fields, positions, // tslint:disable-next-line:no-any\n\tprintFn) {\n\t  if (printFn === void 0) {\n\t    printFn = console.log;\n\t  }\n\n\t  var line = '';\n\n\t  for (var i = 0; i < fields.length; ++i) {\n\t    if (i > 0) {\n\t      line = line.slice(0, line.length - 1) + ' ';\n\t    }\n\n\t    line += fields[i];\n\t    line = line.slice(0, positions[i]);\n\t    line += ' '.repeat(positions[i] - line.length);\n\t  }\n\n\t  printFn(line);\n\t}\n\t/**\n\t * Prints a summary for a single Layer, without connectivity information.\n\t *\n\t * @param layer: Layer instance to print.\n\t */\n\n\n\tfunction printLayerSummary(layer, positions, // tslint:disable-next-line:no-any\n\tprintFn) {\n\t  var outputShape;\n\n\t  try {\n\t    outputShape = JSON.stringify(layer.outputShape);\n\t  } catch (err) {\n\t    outputShape = 'multiple';\n\t  }\n\n\t  var name = layer.name;\n\t  var className = layer.getClassName();\n\t  var fields = [name + \" (\" + className + \")\", outputShape, layer.countParams().toString()];\n\t  printRow(fields, positions, printFn);\n\t}\n\t/**\n\t * Prints a summary for a single Layer, with connectivity information.\n\t */\n\n\n\tfunction printLayerSummaryWithConnections(layer, positions, relevantNodes, // tslint:disable-next-line:no-any\n\tprintFn) {\n\t  var outputShape;\n\n\t  try {\n\t    outputShape = JSON.stringify(layer.outputShape);\n\t  } catch (err) {\n\t    outputShape = 'multiple';\n\t  }\n\n\t  var connections = [];\n\n\t  for (var _iterator3 = _createForOfIteratorHelperLoose(layer.inboundNodes), _step3; !(_step3 = _iterator3()).done;) {\n\t    var node = _step3.value;\n\n\t    if (relevantNodes != null && relevantNodes.length > 0 && relevantNodes.indexOf(node) === -1) {\n\t      continue;\n\t    }\n\n\t    for (var _i2 = 0; _i2 < node.inboundLayers.length; ++_i2) {\n\t      var inboundLayer = node.inboundLayers[_i2].name;\n\t      var inboundLayerIndex = node.nodeIndices[_i2];\n\t      var inboundTensorIndex = node.tensorIndices[_i2];\n\t      connections.push(inboundLayer + \"[\" + inboundLayerIndex + \"][\" + inboundTensorIndex + \"]\");\n\t    }\n\t  }\n\n\t  var name = layer.name;\n\t  var className = layer.getClassName();\n\t  var firstConnection = connections.length === 0 ? '' : connections[0];\n\t  var fields = [name + \" (\" + className + \")\", outputShape, layer.countParams().toString(), firstConnection];\n\t  printRow(fields, positions, printFn);\n\n\t  for (var i = 1; i < connections.length; ++i) {\n\t    printRow(['', '', '', connections[i]], positions, printFn);\n\t  }\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\n\t/**\n\t * Test whether a value in an array is the name of a LayersModel or Layer.\n\t * @param key The key name that the value is found under. Note that the key\n\t *   may not be at the level immediately above the value, if the value is in a\n\t *   nested array.\n\t * @param index Index of the value in the Array that it is found in.\n\t * @param value The value object.\n\t * @returns A boolean indicating whether value is a name.\n\t */\n\n\tfunction isArrayItemInputOrOutputName(key, index, value) {\n\t  return (key === 'inboundNodes' || key === 'outputLayers' || key === 'inputLayers') && index === 0 && typeof value === 'string';\n\t}\n\t/**\n\t * Convert a Pythonic config object to TypeScript config object.\n\t * @param pythonicConfig The config object to convert.\n\t * @param key Optional key name of the object being converted.\n\t * @returns Result of the conversion.\n\t */\n\n\n\tfunction convertPythonicToTs(pythonicConfig, key) {\n\t  if (pythonicConfig === null) {\n\t    return null;\n\t  } else if (typeof pythonicConfig === 'string') {\n\t    return toCamelCase(pythonicConfig);\n\t  } else if (typeof pythonicConfig === 'number' || typeof pythonicConfig === 'boolean') {\n\t    return pythonicConfig;\n\t  } else if (pythonicConfig instanceof Array) {\n\t    var tsArray = [];\n\t    var arrayLength = pythonicConfig.length;\n\n\t    for (var i = 0; i < arrayLength; ++i) {\n\t      var item = pythonicConfig[i];\n\n\t      if (isArrayItemInputOrOutputName(key, i, item)) {\n\t        tsArray.push(item);\n\t      } else {\n\t        tsArray.push(convertPythonicToTs(item, key));\n\t      }\n\t    }\n\n\t    return tsArray;\n\t  } else {\n\t    var tsDict = {};\n\n\t    for (var _i = 0, _Object$keys = Object.keys(pythonicConfig); _i < _Object$keys.length; _i++) {\n\t      var pythonicKey = _Object$keys[_i];\n\t      var pythonicValue = pythonicConfig[pythonicKey];\n\n\t      if (pythonicKey === 'name' && typeof pythonicValue === 'string') {\n\t        // Special case the 'name' key with a string value. Name values, such as\n\t        // the names of LayersModel and Layer instances, should not undergo the\n\t        // camel-case conversion.\n\t        tsDict[pythonicKey] = pythonicValue;\n\t      } else {\n\t        var tsKey = toCamelCase(pythonicKey);\n\t        tsDict[tsKey] = convertPythonicToTs(pythonicValue, tsKey);\n\t      }\n\t    }\n\n\t    return tsDict;\n\t  }\n\t}\n\t/**\n\t * Convert a TypeScript config object to Python config object.\n\t * @param tsConfig The config object to convert.\n\t * @param key Optional key name of the object being converted.\n\t * @returns Result of the conversion.\n\t */\n\n\tfunction convertTsToPythonic(tsConfig, key) {\n\t  if (tsConfig === null || tsConfig === undefined) {\n\t    return null;\n\t  } else if (typeof tsConfig === 'string') {\n\t    return toSnakeCase(tsConfig);\n\t  } else if (typeof tsConfig === 'number' || typeof tsConfig === 'boolean') {\n\t    return tsConfig;\n\t  } else if (tsConfig instanceof Array) {\n\t    var pyArray = [];\n\t    var arrayLength = tsConfig.length;\n\n\t    for (var i = 0; i < arrayLength; ++i) {\n\t      var item = tsConfig[i];\n\n\t      if (isArrayItemInputOrOutputName(key, i, item)) {\n\t        pyArray.push(item);\n\t      } else {\n\t        pyArray.push(convertTsToPythonic(item, key));\n\t      }\n\t    }\n\n\t    return pyArray;\n\t  } else {\n\t    var pyDict = {};\n\n\t    for (var _i2 = 0, _Object$keys2 = Object.keys(tsConfig); _i2 < _Object$keys2.length; _i2++) {\n\t      var tsKey = _Object$keys2[_i2];\n\t      var tsValue = tsConfig[tsKey];\n\t      var pyKey = toSnakeCase(tsKey);\n\n\t      if ((tsKey === 'name' || tsKey === 'className') && typeof tsValue === 'string') {\n\t        // Special case the 'name' key with a string value. Name values, such as\n\t        // the names of LayersModel and Layer instances, should not undergo the\n\t        // snake-case conversion.\n\t        pyDict[pyKey] = tsValue;\n\t      } else {\n\t        pyDict[pyKey] = convertTsToPythonic(tsValue, tsKey);\n\t      }\n\t    }\n\n\t    return pyDict;\n\t  }\n\t}\n\n\t/** @license See the LICENSE file. */\n\t// This code is auto-generated, do not modify this file!\n\tvar version$2 = '2.8.3';\n\n\t/**\n\t * Helper function to check the dtype and shape compatibility of a feed value.\n\t */\n\n\tfunction assertFeedCompatibility(key, val) {\n\t  // Check dtype compatibility.\n\t  if (key.dtype == null || key.dtype === val.dtype) {\n\t    //  a.  If types match, return val tensor as is.\n\t    return val;\n\t  }\n\n\t  try {\n\t    //  b. Attempt to convert to expected type.\n\t    return cast(val, key.dtype);\n\t  } catch (err) {\n\t    //  c. If conversion fails, return helpful error.\n\t    throw new ValueError(\"The dtype of the feed (\" + val.dtype + \") can not be cast to the dtype \" + (\"of the key '\" + key.name + \"' (\" + key.dtype + \").\"));\n\t  }\n\t}\n\t/**\n\t * FeedDict: A mapping from unique SymbolicTensors to feed values for them.\n\t * A feed value is a concrete value represented as an `Tensor`.\n\t */\n\n\n\tvar FeedDict = /*#__PURE__*/function () {\n\t  /**\n\t   * Constructor, optionally does copy-construction.\n\t   * @param feeds An Array of `Feed`s, or another `FeedDict`, in which case\n\t   *   copy-construction will be performed.\n\t   */\n\t  function FeedDict(feeds) {\n\t    this.id2Value = {};\n\t    this.id2Mask = {};\n\t    this.name2Id = {};\n\n\t    if (feeds instanceof FeedDict) {\n\t      for (var id in feeds.id2Value) {\n\t        this.id2Value[id] = feeds.id2Value[id];\n\n\t        if (id in feeds.id2Mask) {\n\t          this.id2Mask[id] = feeds.id2Mask[id];\n\t        }\n\t      }\n\t    } else {\n\t      if (feeds == null) {\n\t        return;\n\t      }\n\n\t      for (var _iterator = _createForOfIteratorHelperLoose(feeds), _step; !(_step = _iterator()).done;) {\n\t        var feed = _step.value;\n\t        this.add(feed.key, feed.value);\n\t      }\n\t    }\n\t  }\n\t  /**\n\t   * Add a key-value pair to the FeedDict.\n\t   *\n\t   * @param key The key of the feed.\n\t   * @param value The value of the tensor feed.\n\t   * @param mask The value of the mask feed (optional).\n\t   * @returns This `FeedDict`.\n\t   * @throws ValueError: If the key `SymbolicTensor` already exists in the\n\t   *   `FeedDict`.\n\t   */\n\n\n\t  var _proto = FeedDict.prototype;\n\n\t  _proto.add = function add(key, value, mask) {\n\t    if (this.id2Value[key.id] == null) {\n\t      this.id2Value[key.id] = assertFeedCompatibility(key, value);\n\t      this.name2Id[key.name] = key.id;\n\n\t      if (mask != null) {\n\t        this.id2Mask[key.id] = mask;\n\t      }\n\t    } else {\n\t      throw new ValueError(\"Duplicate key: name=\" + key.name + \", id=\" + key.id);\n\t    }\n\n\t    return this;\n\t  }\n\t  /**\n\t   * Add a Feed to the FeedDict.\n\t   * @param feed The new `Feed` to add.\n\t   * @returns This `FeedDict`.\n\t   */\n\t  ;\n\n\t  _proto.addFeed = function addFeed(feed) {\n\t    this.add(feed.key, feed.value);\n\t  }\n\t  /**\n\t   * Probe whether a key already exists in the FeedDict.\n\t   * @param key\n\t   */\n\t  ;\n\n\t  _proto.hasKey = function hasKey(key) {\n\t    return this.id2Value[key.id] != null;\n\t  }\n\t  /**\n\t   * Get all the SymbolicTensor available in this FeedDict.\n\t   */\n\t  ;\n\n\t  _proto.names = function names() {\n\t    return Object.keys(this.name2Id);\n\t  }\n\t  /**\n\t   * Get the feed value for given key.\n\t   * @param key The SymbolicTensor, or its name (as a string), of which the\n\t   *     value is sought.\n\t   * @returns If `key` exists, the corresponding feed value.\n\t   * @throws ValueError: If `key` does not exist in this `FeedDict`.\n\t   */\n\t  ;\n\n\t  _proto.getValue = function getValue(key) {\n\t    if (key instanceof SymbolicTensor) {\n\t      if (this.id2Value[key.id] == null) {\n\t        throw new ValueError(\"Nonexistent key: \" + key.name);\n\t      } else {\n\t        return this.id2Value[key.id];\n\t      }\n\t    } else {\n\t      var id = this.name2Id[key];\n\n\t      if (id == null) {\n\t        throw new ValueError(\"Feed dict has no SymbolicTensor name: \" + key);\n\t      }\n\n\t      return this.id2Value[id];\n\t    }\n\t  }\n\t  /**\n\t   * Get the feed mask for given key.\n\t   * @param key The SymbolicTensor, or its name (as a string), of which the\n\t   *     value is sought.\n\t   * @returns If `key` exists, the corresponding feed mask.\n\t   * @throws ValueError: If `key` does not exist in this `FeedDict`.\n\t   */\n\t  ;\n\n\t  _proto.getMask = function getMask(key) {\n\t    if (key instanceof SymbolicTensor) {\n\t      if (this.id2Value[key.id] == null) {\n\t        throw new ValueError(\"Nonexistent key: \" + key.name);\n\t      } else {\n\t        return this.id2Mask[key.id];\n\t      }\n\t    } else {\n\t      var id = this.name2Id[key];\n\n\t      if (id == null) {\n\t        throw new ValueError(\"Feed dict has no SymbolicTensor name: \" + key);\n\t      }\n\n\t      return this.id2Mask[id];\n\t    }\n\t  }\n\t  /** Dispose all mask Tensors held by this object. */\n\t  ;\n\n\t  _proto.disposeMasks = function disposeMasks() {\n\t    if (this.id2Mask != null) {\n\t      dispose(this.id2Mask);\n\t    }\n\t  };\n\n\t  return FeedDict;\n\t}(); // Cache for topologically sorted SymbolicTensors for given execution\n\t// targets (i.e., fetches).\n\n\tvar cachedSorted = {}; // Cache for recipient count maps for given execution targets (i.e., fetches).\n\n\tvar cachedRecipientCounts = {};\n\t/**\n\t * Execute a SymbolicTensor by using concrete feed values.\n\t *\n\t * A `SymbolicTensor` object is a node in a computation graph of TF.js\n\t * Layers. The object is backed by a source layer and input\n\t * `SymbolicTensor`s to the source layer. This method evaluates\n\t * the `call()` method of the source layer, using concrete values of the\n\t * inputs obtained from either\n\t * * `feedDict`, if the input key exists in `feedDict`, or else,\n\t * * a recursive call to `execute()` itself.\n\t *\n\t * @param x: The `SymbolicTensor` to execute.\n\t * @param feedDict: The feed values, as base condition of the recursion.\n\t *   execution.\n\t * @param kwargs: Optional keyword arguments.\n\t * @param probe: A probe object (of interface `ExecutionProbe`) used for\n\t *   testing memory footprint of `execute` calls.\n\t * @returns Result of the execution.\n\t * @throws ValueError: If any `SymbolicTensor`s from `InputLayer`s\n\t *   encountered during the execution lacks a feed value in `feedDict`.\n\t */\n\n\tfunction execute(fetches, feedDict, kwargs, probe) {\n\t  var training = kwargs == null ? false : kwargs['training'];\n\t  var arrayFetches = Array.isArray(fetches);\n\t  var fetchArray = arrayFetches ? fetches : [fetches];\n\t  var outputNames = fetchArray.map(function (t) {\n\t    return t.name;\n\t  });\n\t  var finalOutputs = [];\n\t  var feedNames = feedDict.names();\n\n\t  for (var _iterator2 = _createForOfIteratorHelperLoose(outputNames), _step2; !(_step2 = _iterator2()).done;) {\n\t    var outputName = _step2.value;\n\n\t    if (feedNames.indexOf(outputName) !== -1) {\n\t      finalOutputs.push(feedDict.getValue(outputName));\n\t    } else {\n\t      finalOutputs.push(null);\n\t    }\n\t  }\n\n\t  if (probe != null) {\n\t    // For optional probing of memory footprint during execution.\n\t    probe.maxNumTensors = -Infinity;\n\t    probe.minNumTensors = Infinity;\n\t  } // Check cache.\n\n\n\t  var fetchAndFeedKey = outputNames.join(',') + '|' + feedDict.names().join(',');\n\t  var sorted;\n\t  var recipientCounts;\n\n\t  if (cachedSorted[fetchAndFeedKey] == null) {\n\t    // Cache doesn't contain the desired combination of fetches. Compute\n\t    // topological sort for the combination for the first time.\n\t    var out = getTopologicalSortAndRecipientCounts(fetchArray, feedDict);\n\t    sorted = out.sorted;\n\t    recipientCounts = out.recipientCounts; // Store results in cache for future use.\n\n\t    cachedSorted[fetchAndFeedKey] = sorted;\n\t    cachedRecipientCounts[fetchAndFeedKey] = recipientCounts;\n\t  }\n\n\t  sorted = cachedSorted[fetchAndFeedKey];\n\t  recipientCounts = {};\n\n\t  if (!training) {\n\t    Object.assign(recipientCounts, cachedRecipientCounts[fetchAndFeedKey]);\n\t  }\n\n\t  var internalFeedDict = new FeedDict(feedDict); // Start iterative execution on the topologically-sorted SymbolicTensors.\n\n\t  for (var i = 0; i < sorted.length; ++i) {\n\t    if (probe != null) {\n\t      // For optional probing of memory usage during execution.\n\t      var numTensors = memory().numTensors;\n\n\t      if (numTensors > probe.maxNumTensors) {\n\t        probe.maxNumTensors = numTensors;\n\t      }\n\n\t      if (numTensors < probe.minNumTensors) {\n\t        probe.minNumTensors = numTensors;\n\t      }\n\t    }\n\n\t    var symbolic = sorted[i];\n\t    var srcLayer = symbolic.sourceLayer;\n\n\t    if (srcLayer instanceof InputLayer) {\n\t      continue;\n\t    }\n\n\t    var inputValues = [];\n\t    var inputMasks = [];\n\t    var tensorsToDispose = [];\n\t    var maskExists = false;\n\n\t    for (var _iterator3 = _createForOfIteratorHelperLoose(symbolic.inputs), _step3; !(_step3 = _iterator3()).done;) {\n\t      var input = _step3.value;\n\t      var value = internalFeedDict.getValue(input);\n\t      var mask = internalFeedDict.getMask(input);\n\t      inputValues.push(value);\n\t      inputMasks.push(mask);\n\n\t      if (mask != null) {\n\t        maskExists = true;\n\t      }\n\n\t      if (!training) {\n\t        recipientCounts[input.name]--;\n\n\t        if (recipientCounts[input.name] === 0 && !feedDict.hasKey(input) && outputNames.indexOf(input.name) === -1 && !value.isDisposed && input.sourceLayer.stateful !== true) {\n\t          tensorsToDispose.push(value);\n\t        }\n\t      }\n\t    }\n\n\t    if (maskExists) {\n\t      kwargs = kwargs || {};\n\t      kwargs['mask'] = inputMasks[0];\n\t    }\n\n\t    var outputTensors = toList(srcLayer.apply(inputValues, kwargs));\n\t    var outputMask = null;\n\n\t    if (srcLayer.supportsMasking) {\n\t      outputMask = srcLayer.computeMask(inputValues, inputMasks);\n\t    }\n\n\t    var layerOutputs = getNodeOutputs(symbolic);\n\t    var outputSymbolicTensors = Array.isArray(layerOutputs) ? layerOutputs : [layerOutputs];\n\n\t    for (var _i = 0; _i < outputSymbolicTensors.length; ++_i) {\n\t      if (!internalFeedDict.hasKey(outputSymbolicTensors[_i])) {\n\t        internalFeedDict.add(outputSymbolicTensors[_i], outputTensors[_i], Array.isArray(outputMask) ? outputMask[0] : outputMask);\n\t      }\n\n\t      var index = outputNames.indexOf(outputSymbolicTensors[_i].name);\n\n\t      if (index !== -1) {\n\t        finalOutputs[index] = outputTensors[_i];\n\t      }\n\t    }\n\n\t    if (!training) {\n\t      // Clean up Tensors that are no longer needed.\n\t      dispose(tensorsToDispose);\n\t    }\n\t  } // NOTE(cais): Unlike intermediate tensors, we don't discard mask\n\t  // tensors as we go, because these tensors are sometimes passed over a\n\t  // series of mutliple layers, i.e., not obeying the immediate input\n\t  // relations in the graph. If this becomes a memory-usage concern,\n\t  // we can improve this in the future.\n\n\n\t  internalFeedDict.disposeMasks();\n\t  return arrayFetches ? finalOutputs : finalOutputs[0];\n\t}\n\t/**\n\t * Sort the `SymbolicTensor`s topologically, for an array of fetches.\n\t *\n\t * This function calls getTopologicalSortAndRecipientCountsForOneFetch and\n\t * merges their results.\n\t *\n\t * @param fetch The array of fetches requested. Must be a non-empty array.\n\t * @param feedDict The dictionary of fed values.\n\t * @returns sorted: Topologically-sorted array of SymbolicTensors.\n\t *   recipientCounts: Recipient counts for all SymbolicTensors in `sorted`.\n\t */\n\n\tfunction getTopologicalSortAndRecipientCounts(fetches, feedDict) {\n\t  assert(fetches != null && fetches.length > 0, function () {\n\t    return \"Expected at least one fetch, got none\";\n\t  });\n\t  var finalSorted = [];\n\t  var finalRecipientMap = {};\n\n\t  if (fetches.length === 1) {\n\t    // Special-casing 1 fetch for efficiency.\n\t    var out = getTopologicalSortAndRecipientCountsForOneFetch(fetches[0], feedDict);\n\t    finalSorted = out.sorted;\n\t    finalRecipientMap = out.recipientMap;\n\t  } else {\n\t    var visited = new Set();\n\n\t    for (var _iterator4 = _createForOfIteratorHelperLoose(fetches), _step4; !(_step4 = _iterator4()).done;) {\n\t      var fetch = _step4.value;\n\n\t      var _getTopologicalSortAn = getTopologicalSortAndRecipientCountsForOneFetch(fetch, feedDict),\n\t          sorted = _getTopologicalSortAn.sorted,\n\t          recipientMap = _getTopologicalSortAn.recipientMap; // Merge sorted SymbolicTensor Arrays.\n\n\n\t      for (var _iterator5 = _createForOfIteratorHelperLoose(sorted), _step5; !(_step5 = _iterator5()).done;) {\n\t        var symbolicTensor = _step5.value;\n\n\t        if (!visited.has(symbolicTensor.name)) {\n\t          finalSorted.push(symbolicTensor);\n\t          visited.add(symbolicTensor.name);\n\t        }\n\t      } // Merge recipient maps.\n\n\n\t      var _loop = function _loop(name) {\n\t        if (finalRecipientMap[name] == null) {\n\t          finalRecipientMap[name] = new Set();\n\t        }\n\n\t        recipientMap[name].forEach(function (recipient) {\n\t          return finalRecipientMap[name].add(recipient);\n\t        });\n\t      };\n\n\t      for (var name in recipientMap) {\n\t        _loop(name);\n\t      }\n\t    }\n\t  }\n\n\t  return {\n\t    sorted: finalSorted,\n\t    recipientCounts: recipientMap2Counts(finalRecipientMap)\n\t  };\n\t}\n\n\tfunction recipientMap2Counts(recipientMap) {\n\t  var recipientCounts = {};\n\n\t  for (var name in recipientMap) {\n\t    recipientCounts[name] = recipientMap[name].size;\n\t  }\n\n\t  return recipientCounts;\n\t}\n\t/**\n\t * Sort the `SymbolicTensor`s topologically, for a single fetch.\n\t *\n\t * This helper function processes the upstream SymbolicTensors of a single\n\t * fetch.\n\t *\n\t * @param fetch The single fetch requested.\n\t * @param feedDict The dictionary of fed values.\n\t * @returns sorted: Topologically-sorted array of SymbolicTensors.\n\t *   recipientMap: Recipient names for all SymbolicTensors in `sorted`.\n\t */\n\n\n\tfunction getTopologicalSortAndRecipientCountsForOneFetch(fetch, feedDict) {\n\t  var visited = new Set();\n\t  var sorted = [];\n\t  var recipientMap = {}; // Put keys of the feedDict into visited first, so they don't have to be\n\t  // walked. This is needed in case where there are feeds for intermediate\n\t  // SymbolicTensors of the graph.\n\n\t  for (var _iterator6 = _createForOfIteratorHelperLoose(feedDict.names()), _step6; !(_step6 = _iterator6()).done;) {\n\t    var key = _step6.value;\n\t    visited.add(key);\n\t  }\n\n\t  var stack = [];\n\t  var marks = []; // Initial population of stack and marks.\n\n\t  stack.push(fetch);\n\n\t  while (stack.length > 0) {\n\t    var top = stack[stack.length - 1];\n\n\t    if (visited.has(top.name)) {\n\t      stack.pop();\n\t      continue;\n\t    }\n\n\t    var topIsMarked = marks[marks.length - 1] === stack.length - 1;\n\n\t    if (top.inputs.length === 0 || topIsMarked) {\n\t      // Input SymbolicTensor or all children have been visited.\n\t      stack.pop();\n\t      sorted.push(top);\n\t      visited.add(top.name);\n\n\t      if (topIsMarked) {\n\t        marks.pop();\n\t      }\n\t    } else {\n\t      // A non-input SymbolicTensor whose upstream SymbolicTensors haven't\n\t      // been visited yet. Push them onto the stack.\n\t      marks.push(stack.length - 1);\n\n\t      for (var _iterator7 = _createForOfIteratorHelperLoose(top.inputs), _step7; !(_step7 = _iterator7()).done;) {\n\t        var input = _step7.value;\n\n\t        // Increment the recipient count. Note that this needs to happen\n\t        // regardless of whether the SymbolicTensor has been visited before.\n\t        if (recipientMap[input.name] == null) {\n\t          recipientMap[input.name] = new Set();\n\t        }\n\n\t        recipientMap[input.name].add(top.name);\n\n\t        if (visited.has(input.name)) {\n\t          continue; // Avoid repeated visits to the same SymbolicTensor.\n\t        }\n\n\t        stack.push(input);\n\t      }\n\t    }\n\t  }\n\n\t  return {\n\t    sorted: sorted,\n\t    recipientMap: recipientMap\n\t  };\n\t}\n\t/**\n\t * Get the symbolic output tensors of the node to which a given fetch belongs.\n\t * @param fetch The fetched symbolic tensor.\n\t * @returns The Array of symbolic tensors output by the node to which `fetch`\n\t *   belongs.\n\t */\n\n\tfunction getNodeOutputs(fetch) {\n\t  var layerOutputs;\n\n\t  if (fetch.sourceLayer.inboundNodes.length === 1) {\n\t    layerOutputs = fetch.sourceLayer.output;\n\t  } else {\n\t    var nodeIndex = null;\n\n\t    for (var i = 0; i < fetch.sourceLayer.inboundNodes.length; ++i) {\n\t      for (var _iterator8 = _createForOfIteratorHelperLoose(fetch.sourceLayer.inboundNodes[i].outputTensors), _step8; !(_step8 = _iterator8()).done;) {\n\t        var outputTensor = _step8.value;\n\n\t        if (outputTensor.id === fetch.id) {\n\t          nodeIndex = i;\n\t          break;\n\t        }\n\t      }\n\t    }\n\n\t    layerOutputs = fetch.sourceLayer.getOutputAt(nodeIndex);\n\t  }\n\n\t  return layerOutputs;\n\t}\n\n\t/**\n\t * A Container is a directed acyclic graph of layers.\n\t *\n\t * It is the topological form of a \"model\". A LayersModel\n\t * is simply a Container with added training routines.\n\t *\n\t */\n\n\tvar Container = /*#__PURE__*/function (_Layer) {\n\t  _inheritsLoose(Container, _Layer);\n\n\t  function Container(args) {\n\t    var _this;\n\n\t    // No args passed to super's constructor.\n\t    _this = _Layer.call(this, {}) || this;\n\t    _this.containerNodes = new Set();\n\t    _this.name = args.name;\n\n\t    if (_this.name == null) {\n\t      var prefix = _this.getClassName().toLowerCase();\n\n\t      _this.name = getUid(prefix);\n\t    }\n\n\t    _this.supportsMasking = false;\n\t    _this.trainable_ = true; // TODO(michaelterry): Initialize perInputLosses/Updates here.\n\t    // Container-specific properties.\n\n\t    if (Array.isArray(args.inputs)) {\n\t      _this.inputs = args.inputs.slice();\n\t    } else {\n\t      _this.inputs = [args.inputs];\n\t    }\n\n\t    if (Array.isArray(args.outputs)) {\n\t      _this.outputs = args.outputs.slice();\n\t    } else {\n\t      _this.outputs = [args.outputs];\n\t    } // Check for redundancy in inputs.\n\n\n\t    if (unique$1(_this.inputs).length !== _this.inputs.length) {\n\t      throw new ValueError('The list of inputs passed to the model is ' + 'redundant. All inputs should only appear once. Found: ' + (\"\" + _this.inputs.map(function (x) {\n\t        return x.name;\n\t      })));\n\t    } // Check for redundancy in outputs.\n\n\n\t    if (unique$1(_this.outputs).length !== _this.outputs.length) {\n\t      console.warn('The list of outputs passed to the model is redundant. ' + 'All outputs should only appear once. Found: ' + (\"\" + _this.outputs.map(function (x) {\n\t        return x.name;\n\t      })));\n\t    }\n\t    /*\n\t      List of initial layers (1 to 1 mapping with this.inputs, hence the same\n\t      layer might appear twice)\n\t    */\n\n\n\t    _this.inputLayers = [];\n\t    _this.inputLayersNodeIndices = [];\n\t    _this.inputLayersTensorIndices = [];\n\t    /*\n\t      List of layers (1 to 1 mapping with this.outputs, hence the same layer\n\t      might appear twice)\n\t    */\n\n\t    _this.outputLayers = [];\n\t    _this.outputLayersNodeIndices = [];\n\t    _this.outputLayersTensorIndices = [];\n\t    /*\n\t      All layers in order of horizontal graph traversal. Entries are unique.\n\t      Includes input and output layers.\n\t    */\n\n\t    _this.layers = [];\n\t    /*\n\t      References to container layers that were constructed internally. We need\n\t      these to properly dispose of tensors from nested containers.\n\t    */\n\n\t    _this.internalContainerRefs = []; // TODO(michaelterry): Determine if caching still needed with eager\n\t    // backend.\n\n\t    /*\n\t      This is for performance optimization when calling the Container on new\n\t      inputs. Every time the Container is called on a set on input tensors,\n\t      we compute the output tensors, output masks and output shapes in one pass,\n\t      then cache them here. When one of these outputs is queried later,\n\t      we retrieve it from there instead of recomputing it.\n\t    */\n\t    // this.outputTensorCache = {};\n\t    // this.outputShapeCache = {};\n\t    // Build this.outputLayers:\n\n\t    for (var _iterator = _createForOfIteratorHelperLoose(_this.outputs), _step; !(_step = _iterator()).done;) {\n\t      var x = _step.value;\n\t      var _layer2 = x.sourceLayer;\n\t      var nodeIndex = x.nodeIndex;\n\t      var tensorIndex = x.tensorIndex;\n\n\t      _this.outputLayers.push(_layer2);\n\n\t      _this.outputLayersNodeIndices.push(nodeIndex);\n\n\t      _this.outputLayersTensorIndices.push(tensorIndex);\n\t    } // TODO(michaelterry): Add output mask cache code.\n\t    // Build this.inputLayers:\n\n\n\t    for (var _iterator2 = _createForOfIteratorHelperLoose(_this.inputs), _step2; !(_step2 = _iterator2()).done;) {\n\t      var _x = _step2.value;\n\t      var _layer3 = _x.sourceLayer;\n\t      var _nodeIndex2 = _x.nodeIndex;\n\t      var _tensorIndex2 = _x.tensorIndex;\n\t      /*\n\t        It's supposed to be an input layer, so only one node\n\t        and one tensor output.\n\t      */\n\n\t      assert$1(_nodeIndex2 === 0, 'input layer has >1 nodes');\n\t      assert$1(_tensorIndex2 === 0, 'input layer has >1 tensors');\n\n\t      _this.inputLayers.push(_layer3);\n\n\t      _this.inputLayersNodeIndices.push(_nodeIndex2);\n\n\t      _this.inputLayersTensorIndices.push(_tensorIndex2);\n\t    } // Build this.inputNames and this.outputNames.\n\n\n\t    _this.inputNames = [];\n\t    _this.outputNames = [];\n\t    _this.feedInputShapes = [];\n\t    _this.feedInputNames = [];\n\t    _this.feedOutputNames = [];\n\n\t    for (var i = 0; i < _this.inputLayers.length; i++) {\n\t      var layer = _this.inputLayers[i]; // Check that layer is an InputLayer.\n\n\t      if (!(layer instanceof InputLayer)) {\n\t        throw new TypeError('Input layers to a LayersModel must be InputLayer objects. ' + (\"Received inputs: \" + args.inputs + \". \") + (\"Input \" + i + \" (0-based) originates \") + (\"from layer type \" + layer.getClassName() + \".\"));\n\t      }\n\n\t      _this.inputNames.push(layer.name);\n\n\t      _this.feedInputShapes.push(layer.batchInputShape);\n\n\t      _this.feedInputNames.push(layer.name);\n\t    }\n\n\t    for (var _iterator3 = _createForOfIteratorHelperLoose(_this.outputLayers), _step3; !(_step3 = _iterator3()).done;) {\n\t      var _layer4 = _step3.value;\n\n\t      _this.outputNames.push(_layer4.name);\n\t    }\n\n\t    _this.internalInputShapes = _this.inputs.map(function (x) {\n\t      return x.shape;\n\t    });\n\t    _this.internalOutputShapes = _this.outputs.map(function (x) {\n\t      return x.shape;\n\t    });\n\t    /*\n\t      Container_nodes: set of nodes included in the graph (not all nodes\n\t      included in the layers are relevant to the current graph).\n\t    */\n\t    // ids of all nodes relevant to the Container:\n\n\t    var nodesDepths = {}; // To recover nodes from their ID.\n\n\t    var nodeIDToNode = {};\n\t    var layersDepths = {}; // To layers from their ID.\n\n\t    var layerIDToLayer = {};\n\t    var layerIndices = {};\n\t    var nodesInDecreasingDepth = [];\n\t    /**\n\t     * Builds a map of the graph of layers.\n\t     *\n\t     * This recursively updates the map `layerIndices`,\n\t     * the list `nodesInDecreasingDepth` and the set `containerNodes`.\n\t     *\n\t     * @param tensor Some tensor in a graph.\n\t     * @param finishedNodes Set of nodes whose subgraphs have been traversed\n\t     *         completely. Useful to prevent duplicated work.\n\t     * @param nodesInProgress Set of nodes that are currently active on the\n\t     *         recursion stack. Useful to detect cycles.\n\t     * @param layer Layer from which `tensor` comes from. If not provided,\n\t     *   will be obtained from tensor.sourceLayer.\n\t     * @param nodeIndex Node index from which `tensor` comes from.\n\t     * @param tensorIndex TensorIndex from which `tensor` comes from.\n\t     *\n\t     * @exception RuntimeError if a cycle is detected.\n\t     */\n\n\t    var buildMapOfGraph = function buildMapOfGraph(tensor, finishedNodes, nodesInProgress, layer, nodeIndex, tensorIndex) {\n\t      if (layer == null || nodeIndex == null || tensorIndex == null) {\n\t        layer = tensor.sourceLayer;\n\t        nodeIndex = tensor.nodeIndex;\n\t        tensorIndex = tensor.tensorIndex;\n\t      }\n\n\t      var node = layer.inboundNodes[nodeIndex]; // Prevent cycles.\n\n\t      if (nodesInProgress.indexOf(node) !== -1) {\n\t        throw new RuntimeError(\"The tensor \" + tensor.name + \" at layer \\\"\" + layer.name + \"\\\" \" + 'is part of a cycle.');\n\t      } // Don't repeat work for shared subgraphs\n\n\n\t      if (finishedNodes.indexOf(node) !== -1) {\n\t        return;\n\t      } // Update containerNodes.\n\n\n\t      _this.containerNodes.add(Container.nodeKey(layer, nodeIndex)); // Store the traversal order for layer sorting.\n\n\n\t      if (!(layer.id in layerIndices)) {\n\t        layerIndices[layer.id] = Object.keys(layerIndices).length;\n\t      }\n\n\t      if (nodesInProgress.indexOf(node) === -1) {\n\t        nodesInProgress.push(node);\n\t      } // Propagate to all previous tensors connected to this node.\n\n\n\t      var numInboundLayers = node.inboundLayers.length;\n\n\t      for (var _i = 0; _i < numInboundLayers; _i++) {\n\t        var x = node.inputTensors[_i];\n\t        var _layer = node.inboundLayers[_i];\n\t        var _nodeIndex = node.nodeIndices[_i];\n\t        var _tensorIndex = node.tensorIndices[_i];\n\t        buildMapOfGraph(x, finishedNodes, nodesInProgress, _layer, _nodeIndex, _tensorIndex);\n\t      }\n\n\t      finishedNodes.push(node);\n\n\t      while (nodesInProgress.indexOf(node) >= 0) {\n\t        nodesInProgress.splice(nodesInProgress.indexOf(node), 1);\n\t      }\n\n\t      nodesInDecreasingDepth.push(node);\n\t    };\n\n\t    var finishedNodes = [];\n\t    var nodesInProgress = [];\n\n\t    for (var _iterator4 = _createForOfIteratorHelperLoose(_this.outputs), _step4; !(_step4 = _iterator4()).done;) {\n\t      var _x2 = _step4.value;\n\t      buildMapOfGraph(_x2, finishedNodes, nodesInProgress);\n\t    }\n\n\t    var reversedNodesInDecreasingDepth = nodesInDecreasingDepth.slice().reverse();\n\n\t    for (var _iterator5 = _createForOfIteratorHelperLoose(reversedNodesInDecreasingDepth), _step5; !(_step5 = _iterator5()).done;) {\n\t      var node = _step5.value;\n\t      nodeIDToNode[node.id] = node; // If the depth is not set, the node has no outbound nodes (depth 0).\n\n\t      if (!(node.id in nodesDepths)) {\n\t        nodesDepths[node.id] = 0;\n\t      }\n\n\t      var _depth2 = nodesDepths[node.id]; // Update the depth of the corresponding layer\n\n\t      var previousDepth = layersDepths[node.outboundLayer.id] == null ? 0 : layersDepths[node.outboundLayer.id];\n\t      /*\n\t        If we've seen this layer before at a higher depth, we should use that\n\t        depth instead of the node depth.  This is necessary for shared layers\n\t        that have inputs at different depth levels in the graph.\n\t      */\n\n\t      _depth2 = Math.max(_depth2, previousDepth);\n\t      layersDepths[node.outboundLayer.id] = _depth2;\n\t      layerIDToLayer[node.outboundLayer.id] = node.outboundLayer;\n\t      nodesDepths[node.id] = _depth2; // Update the depth of inbound nodes.\n\n\t      for (var _i2 = 0; _i2 < node.inboundLayers.length; _i2++) {\n\t        var inboundLayer = node.inboundLayers[_i2];\n\t        var _nodeIndex3 = node.nodeIndices[_i2];\n\t        var inboundNode = inboundLayer.inboundNodes[_nodeIndex3];\n\n\t        var _previousDepth = nodesDepths[inboundNode.id] == null ? 0 : nodesDepths[inboundNode.id];\n\n\t        nodesDepths[inboundNode.id] = Math.max(_depth2 + 1, _previousDepth);\n\t        nodeIDToNode[inboundNode.id] = inboundNode;\n\t      }\n\t    } // Build a dict {depth: list of nodes with this depth}\n\n\n\t    var nodesByDepth = {};\n\n\t    for (var nodeID in nodesDepths) {\n\t      var depth = nodesDepths[nodeID];\n\n\t      if (!(depth in nodesByDepth)) {\n\t        nodesByDepth[depth] = [];\n\t      }\n\n\t      nodesByDepth[depth].push(nodeIDToNode[nodeID]);\n\t    } // Build a dict {depth: list of layers with this depth}\n\n\n\t    var layersByDepth = {};\n\n\t    for (var layerID in layersDepths) {\n\t      var _depth = layersDepths[layerID];\n\n\t      if (!(_depth in layersByDepth)) {\n\t        layersByDepth[_depth] = [];\n\t      }\n\n\t      layersByDepth[_depth].push(layerIDToLayer[layerID]);\n\t    } // Get sorted list of layer depths.\n\n\n\t    var depthKeys = Object.keys(layersByDepth).map(function (x) {\n\t      return parseInt(x, 10);\n\t    }).sort(reverseNumberCompare); // Set this.layers and this.layersByDepth.\n\n\t    _this.layers = [];\n\n\t    for (var _iterator6 = _createForOfIteratorHelperLoose(depthKeys), _step6; !(_step6 = _iterator6()).done;) {\n\t      var _depth3 = _step6.value;\n\t      var layersForDepth = layersByDepth[_depth3]; // Container.layers needs to have a deterministic order:\n\t      // here we order them by traversal order.\n\n\t      layersForDepth.sort(function (a, b) {\n\t        var aIndex = layerIndices[a.id];\n\t        var bIndex = layerIndices[b.id];\n\n\t        if (aIndex < bIndex) {\n\t          return -1;\n\t        }\n\n\t        if (aIndex > bIndex) {\n\t          return 1;\n\t        }\n\n\t        return 0;\n\t      });\n\n\t      for (var _iterator9 = _createForOfIteratorHelperLoose(layersForDepth), _step9; !(_step9 = _iterator9()).done;) {\n\t        var _layer5 = _step9.value;\n\n\t        if (_layer5 instanceof Container) {\n\t          _this.internalContainerRefs.push(_layer5);\n\t        }\n\n\t        _this.layers.push(_layer5);\n\t      }\n\t    }\n\n\t    _this.layersByDepth = layersByDepth; // Get sorted list of node depths;\n\n\t    depthKeys = Object.keys(nodesByDepth).map(function (x) {\n\t      return parseInt(x, 10);\n\t    }).sort(reverseNumberCompare); // Check that all tensors required are computable.\n\t    // computable_tensors: all tensors in the graph\n\t    // that can be computed from the inputs provided.\n\n\t    var computableTensors = _this.inputs.slice(); // To provide a better error msg.\n\n\n\t    var layersWithCompleteInput = [];\n\n\t    for (var _iterator7 = _createForOfIteratorHelperLoose(depthKeys), _step7; !(_step7 = _iterator7()).done;) {\n\t      var _depth4 = _step7.value;\n\n\t      for (var _iterator10 = _createForOfIteratorHelperLoose(nodesByDepth[_depth4]), _step10; !(_step10 = _iterator10()).done;) {\n\t        var _node = _step10.value;\n\t        var _layer6 = _node.outboundLayer;\n\n\t        if (_layer6 != null) {\n\t          for (var _iterator11 = _createForOfIteratorHelperLoose(_node.inputTensors), _step11; !(_step11 = _iterator11()).done;) {\n\t            var _x3 = _step11.value;\n\n\t            if (computableTensors.indexOf(_x3) === -1) {\n\t              throw new RuntimeError(\"Graph disconnected: cannot obtain value for tensor \" + _x3 + (\" at layer \\\"\" + _layer6.name + \"\\\". \") + 'The following previous layers were accessed without ' + (\"issue: \" + layersWithCompleteInput));\n\t            }\n\t          }\n\n\t          for (var _iterator12 = _createForOfIteratorHelperLoose(_node.outputTensors), _step12; !(_step12 = _iterator12()).done;) {\n\t            var _x4 = _step12.value;\n\t            computableTensors.push(_x4);\n\t          }\n\n\t          layersWithCompleteInput.push(_layer6.name);\n\t        }\n\t      }\n\t    } // Set this.containerNodes and this.nodesByDepth.\n\n\n\t    _this.nodesByDepth = nodesByDepth; // Ensure name unicity, which will be crucial for serialization\n\t    // (since serialized nodes refer to layers by their name).\n\n\t    var allNames = _this.layers.map(function (x) {\n\t      return x.name;\n\t    });\n\n\t    var _loop = function _loop() {\n\t      var name = _step8.value;\n\t      var numOccurrences = allNames.filter(function (x) {\n\t        return x === name;\n\t      }).length;\n\n\t      if (numOccurrences !== 1) {\n\t        throw new RuntimeError(\"The name \\\"\" + name + \"\\\" is used \" + numOccurrences + \" times \" + 'in the model. All layer names should be unique. Layer names: ' + JSON.stringify(allNames));\n\t      }\n\t    };\n\n\t    for (var _iterator8 = _createForOfIteratorHelperLoose(allNames), _step8; !(_step8 = _iterator8()).done;) {\n\t      _loop();\n\t    } // Layer parameters.\n\t    // The new container starts with a single inbound node\n\t    // for its inputs, and no outbound nodes.\n\t    // Will be appended to by future calls to apply().\n\n\n\t    _this.outboundNodes = []; // Will be appended to below, and by future calls to apply().\n\n\t    _this.inboundNodes = []; // Create the node linking internal inputs to internal outputs.\n\t    // (This call has side effects.)\n\t    // tslint:disable-next-line:no-unused-expression\n\n\t    new Node({\n\t      outboundLayer: _assertThisInitialized(_this),\n\t      inboundLayers: [],\n\t      nodeIndices: [],\n\t      tensorIndices: [],\n\t      inputTensors: _this.inputs,\n\t      outputTensors: _this.outputs,\n\t      inputMasks: _this.inputs.map(function (x) {\n\t        return null;\n\t      }),\n\t      outputMasks: _this.outputs.map(function (x) {\n\t        return null;\n\t      }),\n\t      inputShapes: _this.inputs.map(function (x) {\n\t        return x.shape;\n\t      }),\n\t      outputShapes: _this.outputs.map(function (x) {\n\t        return x.shape;\n\t      })\n\t    });\n\t    _this.built = true;\n\t    _this._refCount = 1; // The ref count of a container always start at 1.\n\n\t    return _this;\n\t  }\n\n\t  var _proto = Container.prototype;\n\n\t  _proto.assertNotDisposed = function assertNotDisposed() {\n\t    if (this._refCount === 0) {\n\t      throw new Error(\"Container '\" + this.name + \"' is already disposed.\");\n\t    }\n\t  }\n\t  /**\n\t   * Attempt to dispose a LayersModel's weights.\n\t   *\n\t   * This method decrease the reference count of the LayersModel object by 1.\n\t   *\n\t   * A LayersModel is reference-counted. Its reference count is incremented by 1\n\t   * when it is first constructed and when it is used as a Layer of another\n\t   * LayersModel.\n\t   *\n\t   * If the reference count of a LayersModel becomes 0, the `dispose` method of\n\t   * all its constituent `Layer`s will be called.\n\t   *\n\t   * Note: If the reference count is greater than 0 after the decrement, the\n\t   * `dispose` method of its constituent `Layer`s will *not* be called.\n\t   *\n\t   * After a LayersModel is disposed, it cannot be used in calls such as\n\t   * 'predict`, `evaluate` or `fit` anymore.\n\t   *\n\t   * @returns A DisposeResult Object with the following fields:\n\t   *   - refCountAfterDispose: The reference count of the LayersModel after this\n\t   *     `dispose()` call.\n\t   *   - numDisposedVariables: Number of `tf.Variable`s (i.e., weights) disposed\n\t   *     during this `dispose()` call.\n\t   * @throws {Error} If the layer is not built yet, or if the LayersModel has\n\t   *   already been disposed.\n\t   */\n\t  ;\n\n\t  _proto.dispose = function dispose() {\n\t    this.assertNotDisposed();\n\t    var result = {\n\t      refCountAfterDispose: null,\n\t      numDisposedVariables: 0\n\t    };\n\n\t    if (--this._refCount === 0) {\n\t      for (var _iterator13 = _createForOfIteratorHelperLoose(this.layers), _step13; !(_step13 = _iterator13()).done;) {\n\t        var layer = _step13.value;\n\t        result.numDisposedVariables += layer.dispose().numDisposedVariables;\n\t      } // Call dispose on each internally created container layer again to ensure\n\t      // their refCounts hit zero and their tensors are subsequently deleted.\n\n\n\t      for (var _iterator14 = _createForOfIteratorHelperLoose(this.internalContainerRefs), _step14; !(_step14 = _iterator14()).done;) {\n\t        var container = _step14.value;\n\t        result.numDisposedVariables += container.dispose().numDisposedVariables;\n\t      }\n\t    }\n\n\t    result.refCountAfterDispose = this._refCount;\n\t    return result;\n\t  };\n\n\t  /**\n\t   * Loads all layer weights from a JSON object.\n\t   *\n\t   * Porting Note: HDF5 weight files cannot be directly loaded in JavaScript /\n\t   *   TypeScript. The utility script at `scripts/pykeras.py` offers means\n\t   *   to convert them into JSON strings compatible with this method.\n\t   * Porting Note: TensorFlow.js Layers supports only loading by name currently.\n\t   *\n\t   * @param weights A JSON mapping weight names to weight values as nested\n\t   *   arrays of numbers, or a `NamedTensorMap`, i.e., a JSON mapping weight\n\t   *   names to `tf.Tensor` objects.\n\t   * @param strict Require that the provided weights exactly match those\n\t   *   required by the container.  Default: `true`.  Passing `false` means that\n\t   *   extra weights and missing weights will be silently ignored.\n\t   */\n\t  _proto.loadWeights = function loadWeights(weights, strict) {\n\t    if (strict === void 0) {\n\t      strict = true;\n\t    }\n\n\t    var nameToWeight = {};\n\t    var totalWeightsCount = 0;\n\n\t    for (var _iterator15 = _createForOfIteratorHelperLoose(this.layers), _step15; !(_step15 = _iterator15()).done;) {\n\t      var layer = _step15.value;\n\n\t      for (var _iterator16 = _createForOfIteratorHelperLoose(layer.weights), _step16; !(_step16 = _iterator16()).done;) {\n\t        var weight = _step16.value;\n\n\t        if (nameToWeight[weight.originalName] != null) {\n\t          throw new ValueError(\"Duplicate weight name: \" + weight.originalName);\n\t        }\n\n\t        nameToWeight[weight.originalName] = weight;\n\t        totalWeightsCount++;\n\t      }\n\t    }\n\n\t    var weightValueTuples = [];\n\n\t    for (var name in weights) {\n\t      // TF 2.2.0 added cell name to the weight name in the format of\n\t      // layer_name/cell_name/weight_name, we need to remove\n\t      // the inner cell name.\n\t      var validatedName = name;\n\n\t      if (nameToWeight[name] == null) {\n\t        var tokens = name.split('/');\n\t        var shortenNameArray = tokens.slice(0, -2).concat([tokens[tokens.length - 1]]);\n\t        validatedName = shortenNameArray.join('/');\n\t      }\n\n\t      if (nameToWeight[validatedName] != null) {\n\t        weightValueTuples.push([nameToWeight[validatedName], weights[name]]);\n\t      } else if (strict) {\n\t        throw new ValueError(\"Provided weight data has no target variable: \" + name);\n\t      }\n\n\t      delete nameToWeight[validatedName];\n\t    }\n\n\t    if (strict) {\n\t      // Check that all weights are set.\n\t      var unsetNames = [];\n\n\t      for (var _name in nameToWeight) {\n\t        unsetNames.push(_name);\n\t      }\n\n\t      if (unsetNames.length > 0) {\n\t        throw new ValueError(unsetNames.length + \" of \" + totalWeightsCount + \" weights are not set: \" + (\"\" + unsetNames));\n\t      }\n\t    }\n\n\t    batchSetValue(weightValueTuples);\n\t  }\n\t  /**\n\t   * Util shared between different serialization methods.\n\t   * @returns LayersModel config with Keras version information added.\n\t   */\n\t  ;\n\n\t  _proto.updatedConfig = function updatedConfig() {\n\t    var theConfig = this.getConfig();\n\t    var modelConfig = {};\n\t    modelConfig['className'] = this.getClassName();\n\t    modelConfig['config'] = theConfig;\n\t    modelConfig['kerasVersion'] = \"tfjs-layers \" + version$2; // TODO(nielsene): Replace something like K.backend() once\n\t    // possible.\n\n\t    modelConfig['backend'] = 'TensorFlow.js';\n\t    return modelConfig;\n\t  }\n\t  /**\n\t   * Returns a JSON string containing the network configuration.\n\t   *\n\t   * To load a network from a JSON save file, use\n\t   * models.modelFromJSON(jsonString);\n\t   * @param extraJsonArgs Unused in tfjs-layers, maintained for PyKeras\n\t   * @param returnString Whether the return value should be stringified\n\t   *    (default: `true`).\n\t   * @returns a JSON string if `returnString` (default), or a JSON object if\n\t   *   `!returnString`.\n\t   */\n\t  // tslint:disable-next-line:no-any\n\t  ;\n\n\t  _proto.toJSON = function toJSON(unused, returnString) {\n\t    if (returnString === void 0) {\n\t      returnString = true;\n\t    }\n\n\t    var modelConfig = convertTsToPythonic(this.updatedConfig());\n\t    return returnString ? JSON.stringify(modelConfig) : modelConfig;\n\t  }\n\t  /**\n\t   * Call the model on new inputs.\n\t   *\n\t   * In this case `call` just reapplies all ops in the graph to the new inputs\n\t   * (e.g. build a new computational graph from the provided inputs).\n\t   *\n\t   * @param inputs A tensor or list of tensors.\n\t   * @param mask A mask or list of masks. A mask can be either a tensor or null\n\t   *   (no mask).\n\t   *\n\t   * @return A tensor if there is a single output, or a list of tensors if there\n\t   *   are more than one outputs.\n\t   */\n\t  ;\n\n\t  _proto.call = function call(inputs, kwargs) {\n\t    var _this2 = this;\n\n\t    return tidy(function () {\n\t      inputs = toList(inputs);\n\t      var feedDict = new FeedDict();\n\n\t      for (var i = 0; i < _this2.inputs.length; ++i) {\n\t        feedDict.add(_this2.inputs[i], inputs[i]);\n\t      }\n\n\t      return execute(_this2.outputs, feedDict, kwargs);\n\t    });\n\t  }\n\t  /**\n\t   * Computes an output mask tensor.\n\t   *\n\t   * @param inputs Tensor or list of tensors.\n\t   * @param mask Tensor or list of tensors.\n\t   *\n\t   * @return null or a tensor (or list of tensors, one per output tensor of the\n\t   * layer).\n\t   */\n\t  ;\n\n\t  _proto.computeMask = function computeMask(inputs, mask) {\n\t    var _this3 = this;\n\n\t    return tidy(function () {\n\t      inputs = toList(inputs);\n\t      var masks;\n\n\t      if (mask == null) {\n\t        masks = pyListRepeat(null, inputs.length);\n\t      } else {\n\t        masks = toList(mask);\n\t      } // TODO(michaelterry): Add support for mask caching.\n\n\n\t      return _this3.runInternalGraph(inputs, masks)[1];\n\t    });\n\t  }\n\t  /**\n\t   * Computes the output shape of the layer.\n\t   *\n\t   * Assumes that the layer will be built to match that input shape provided.\n\t   *\n\t   * @param inputShape A shape (tuple of integers) or a list of shape tuples\n\t   *   (one per output tensor of the layer). Shape tuples can include null for\n\t   *   free dimensions, instead of an integer.\n\t   */\n\t  ;\n\n\t  _proto.computeOutputShape = function computeOutputShape(inputShape) {\n\t    var inputShapes = normalizeShapeList(inputShape);\n\n\t    if (inputShapes.length !== this.inputLayers.length) {\n\t      throw new ValueError(\"Invalid inputShape argument \" + inputShape + \": \" + (\"model has \" + this.inputLayers.length + \" tensor inputs.\"));\n\t    } // TODO(michaelterry): Add caching\n\n\n\t    var layersToOutputShapes = {};\n\n\t    for (var i = 0; i < inputShapes.length; i++) {\n\t      var layer = this.inputLayers[i];\n\t      var _inputShape = inputShapes[i]; // It's an input layer: computeOutputShape is identity,\n\t      // and there is only one node and one tensor output.\n\n\t      var shapeKey = layer.name + '_0_0';\n\t      layersToOutputShapes[shapeKey] = _inputShape;\n\t    }\n\n\t    var depthKeys = Object.keys(this.nodesByDepth).map(function (x) {\n\t      return parseInt(x, 10);\n\t    }).sort(reverseNumberCompare); // Iterate over nodes, by depth level.\n\n\t    if (depthKeys.length > 1) {\n\t      for (var _iterator17 = _createForOfIteratorHelperLoose(depthKeys), _step17; !(_step17 = _iterator17()).done;) {\n\t        var depth = _step17.value;\n\t        var nodes = this.nodesByDepth[depth];\n\n\t        for (var _iterator18 = _createForOfIteratorHelperLoose(nodes), _step18; !(_step18 = _iterator18()).done;) {\n\t          var node = _step18.value;\n\t          // This is always a single layer, never a list.\n\t          var _layer7 = node.outboundLayer;\n\n\t          if (this.inputLayers.map(function (x) {\n\t            return x.id;\n\t          }).indexOf(_layer7.id) !== -1) {\n\t            // We've already covered the input layers a few lines above.\n\t            continue;\n\t          } // Potentially redundant list, same size of node.inputTensors.\n\n\n\t          var _inputShapes = [];\n\n\t          for (var j = 0; j < node.inboundLayers.length; j++) {\n\t            var inboundLayer = node.inboundLayers[j];\n\t            var _nodeIndex4 = node.nodeIndices[j];\n\t            var tensorIndex = node.tensorIndices[j];\n\n\t            var _shapeKey = inboundLayer.name + \"_\" + _nodeIndex4 + \"_\" + tensorIndex;\n\n\t            var _inputShape2 = layersToOutputShapes[_shapeKey];\n\n\t            _inputShapes.push(_inputShape2);\n\t          }\n\n\t          var outputShape = _layer7.computeOutputShape(singletonOrArray(_inputShapes));\n\n\t          var _outputShapes = normalizeShapeList(outputShape);\n\n\t          var nodeIndex = _layer7.inboundNodes.indexOf(node);\n\n\t          for (var _j = 0; _j < _outputShapes.length; _j++) {\n\t            var _shapeKey2 = _layer7.name + \"_\" + nodeIndex + \"_\" + _j;\n\n\t            layersToOutputShapes[_shapeKey2] = _outputShapes[_j];\n\t          }\n\t        }\n\t      }\n\t    } // Read final output shapes from layersToOutputShapes.\n\n\n\t    var outputShapes = [];\n\t    var outputShapeKeys = [];\n\n\t    for (var _i3 = 0; _i3 < this.outputLayers.length; _i3++) {\n\t      var _layer8 = this.outputLayers[_i3];\n\t      var _nodeIndex5 = this.outputLayersNodeIndices[_i3];\n\t      var _tensorIndex3 = this.outputLayersTensorIndices[_i3];\n\n\t      var _shapeKey3 = _layer8.name + \"_\" + _nodeIndex5 + \"_\" + _tensorIndex3;\n\n\t      outputShapeKeys.push(_shapeKey3);\n\t    }\n\n\t    for (var _i4 = 0; _i4 < outputShapeKeys.length; _i4++) {\n\t      var key = outputShapeKeys[_i4];\n\t      assert$1(key in layersToOutputShapes);\n\t      outputShapes.push(layersToOutputShapes[key]);\n\t    } // TODO(michaelterry): Update cache\n\n\n\t    return singletonOrArray(outputShapes);\n\t  }\n\t  /**\n\t   * Computes output tensors for new inputs.\n\t   *\n\t   * Note:\n\t   *   - Expects `inputs` to be a list (potentially with 1 element).\n\t   *\n\t   * @param inputs List of tensors\n\t   * @param masks List of masks (tensors or null).\n\t   * @return Three lists: outputTensors, outputMasks, outputShapes\n\t   */\n\t  ;\n\n\t  _proto.runInternalGraph = function runInternalGraph(inputs, masks) {\n\t    if (masks == null) {\n\t      masks = pyListRepeat(null, inputs.length);\n\t    } // Dictionary mapping reference tensors to tuples\n\t    // (computed tensor, compute mask)\n\t    // we assume a 1:1 mapping from tensor to mask\n\t    // TODO: raise exception when a `.computeMask()` call\n\t    // does not return a list the same size as `call`\n\n\n\t    var tensorMap = {};\n\n\t    for (var i = 0; i < this.inputs.length; ++i) {\n\t      var x = this.inputs[i];\n\t      var y = inputs[i];\n\t      var mask = masks[i];\n\t      tensorMap[x.id] = [y, mask];\n\t    }\n\n\t    var depthKeys = Object.keys(this.nodesByDepth).map(function (x) {\n\t      return parseInt(x, 10);\n\t    }).sort(reverseNumberCompare);\n\n\t    for (var _iterator19 = _createForOfIteratorHelperLoose(depthKeys), _step19; !(_step19 = _iterator19()).done;) {\n\t      var depth = _step19.value;\n\t      var nodes = this.nodesByDepth[depth];\n\n\t      for (var _iterator21 = _createForOfIteratorHelperLoose(nodes), _step21; !(_step21 = _iterator21()).done;) {\n\t        var node = _step21.value;\n\t        // This is always a single layer, never a list.\n\t        var layer = node.outboundLayer;\n\t        var referenceInputTensors = node.inputTensors;\n\t        var referenceOutputTensors = node.outputTensors; // If all previous input tensors are available in tensorMap,\n\t        // then call node.inboundLayer on them.\n\t        // List of tuples [input, mask]:\n\n\t        var computedData = new Array();\n\n\t        for (var _iterator22 = _createForOfIteratorHelperLoose(referenceInputTensors), _step22; !(_step22 = _iterator22()).done;) {\n\t          var _x6 = _step22.value;\n\n\t          if (_x6.id in tensorMap) {\n\t            computedData.push(tensorMap[_x6.id]);\n\t          }\n\t        }\n\n\t        if (computedData.length === referenceInputTensors.length) {\n\t          // TODO(michaelterry): Add K.name_scope here, if we need it.\n\t          var kwargs = {};\n\t          var computedTensors = void 0;\n\t          var computedMasks = void 0;\n\n\t          var _outputTensors = void 0;\n\n\t          var _outputMasks = void 0; // call layer\n\n\n\t          if (node.callArgs != null) {\n\t            kwargs = node.callArgs;\n\t          }\n\n\t          if (computedData.length === 1) {\n\t            var _computedData$ = computedData[0],\n\t                computedTensor = _computedData$[0],\n\t                computedMask = _computedData$[1];\n\n\t            if (kwargs['mask'] == null) {\n\t              kwargs['mask'] = computedMask;\n\t            }\n\n\t            _outputTensors = toList(layer.call(computedTensor, kwargs));\n\t            _outputMasks = toList(layer.computeMask(computedTensor, computedMask));\n\t            computedTensors = [computedTensor];\n\t            computedMasks = [computedMask];\n\t          } else {\n\t            computedTensors = computedData.map(function (x) {\n\t              return x[0];\n\t            });\n\t            computedMasks = computedData.map(function (x) {\n\t              return x[1];\n\t            });\n\n\t            if (kwargs['mask'] == null) {\n\t              kwargs['mask'] = computedMasks;\n\t            }\n\n\t            _outputTensors = toList(layer.call(computedTensors, kwargs));\n\t            _outputMasks = toList(layer.computeMask(computedTensors, computedMasks));\n\t          }\n\n\t          if (layer.activityRegularizer) {\n\t            throw new NotImplementedError('LayersModel invocation with concrete Tensor value(s) in the ' + 'presence of activity regularizer(s) is not supported yet.');\n\t          } // TODO(michaelterry): Add model updates and losses\n\t          // Update tensor map.\n\n\n\t          for (var _i5 = 0; _i5 < referenceOutputTensors.length; ++_i5) {\n\t            var _x5 = referenceOutputTensors[_i5];\n\t            var _y = _outputTensors[_i5];\n\t            var _mask = _outputMasks[_i5];\n\t            tensorMap[_x5.id] = [_y, _mask];\n\t          }\n\t        }\n\t      }\n\t    }\n\n\t    var outputTensors = [];\n\t    var outputMasks = [];\n\t    var outputShapes = [];\n\n\t    for (var _iterator20 = _createForOfIteratorHelperLoose(this.outputs), _step20; !(_step20 = _iterator20()).done;) {\n\t      var _x7 = _step20.value;\n\t      assert$1(_x7.id in tensorMap, \"Could not compute output \" + _x7.name + \" : \" + _x7.id);\n\t      var _tensorMap$_x7$id = tensorMap[_x7.id],\n\t          tensor = _tensorMap$_x7$id[0],\n\t          _mask2 = _tensorMap$_x7$id[1];\n\t      outputShapes.push(tensor.shape);\n\t      outputTensors.push(tensor);\n\t      outputMasks.push(_mask2);\n\t    } // TODO(michaelterry): Add support for caches.\n\n\n\t    return [outputTensors, outputMasks, outputShapes];\n\t  }\n\t  /**\n\t   * Builds a map of internal node keys to node ordering.\n\t   * Used in serializaion a node orderings may change as unused nodes are\n\t   * dropped. Porting Note:  This helper method was pulled out of getConfig to\n\t   * improve readability.\n\t   * @param layers An array of Layers in the model.\n\t   * @returns Map of Node Keys to index order within the layer.\n\t   */\n\t  ;\n\n\t  _proto.buildNodeConversionMap = function buildNodeConversionMap(layers) {\n\t    var nodeConversionMap = {};\n\t    var keptNodes;\n\n\t    for (var _iterator23 = _createForOfIteratorHelperLoose(this.layers), _step23; !(_step23 = _iterator23()).done;) {\n\t      var layer = _step23.value;\n\t      keptNodes = layer instanceof Container ? 1 : 0;\n\n\t      for (var originalNodeIndex = 0; originalNodeIndex < layer.inboundNodes.length; originalNodeIndex++) {\n\t        var nodeKey = Container.nodeKey(layer, originalNodeIndex);\n\n\t        if (this.containerNodes.has(nodeKey)) {\n\t          // i.e. we mark it to be saved\n\t          nodeConversionMap[nodeKey] = keptNodes;\n\t          keptNodes += 1;\n\t        }\n\t      }\n\t    }\n\n\t    return nodeConversionMap;\n\t  }\n\t  /**\n\t   * Retrieves a layer based on either its name (unique) or index.\n\t   *\n\t   * Indices are based on order of horizontal graph traversal (bottom-up).\n\t   *\n\t   * If both `name` and `index` are specified, `index` takes precedence.\n\t   *\n\t   * @param name Name of layer.\n\t   * @param index Index of layer.\n\t   * @returns A Layer instance.\n\t   * @throws ValueError: In case of invalid layer name or index.\n\t   *\n\t   * @doc {\n\t   *    heading: 'Layers',\n\t   *    subheading: 'Classes',\n\t   *    namespace: 'layers',\n\t   *    subclasses: ['LayersModel']\n\t   * }\n\t   */\n\t  ;\n\n\t  _proto.getLayer = function getLayer(name, index) {\n\t    if (index != null) {\n\t      if (this.layers.length <= index) {\n\t        throw new ValueError(\"Was asked to retrieve layer at index \" + index + \", but model only \" + (\"has \" + this.layers.length + \" layer(s).\"));\n\t      } else {\n\t        return this.layers[index];\n\t      }\n\t    } else {\n\t      if (name == null) {\n\t        throw new ValueError('Provide either a layer name or layer index');\n\t      }\n\t    }\n\n\t    for (var _iterator24 = _createForOfIteratorHelperLoose(this.layers), _step24; !(_step24 = _iterator24()).done;) {\n\t      var layer = _step24.value;\n\n\t      if (layer.name === name) {\n\t        return layer;\n\t      }\n\t    }\n\n\t    throw new ValueError(\"No such layer: \" + name);\n\t  }\n\t  /**\n\t   * Retrieves the Container's current loss values.\n\t   *\n\t   * Used for regularizers during training.\n\t   */\n\t  ;\n\n\t  _proto.calculateLosses = function calculateLosses() {\n\t    var _this4 = this;\n\n\t    // Porting Node: This is an augmentation to Container.loss in PyKeras.\n\t    //   In PyKeras, Container.loss returns symbolic tensors. Here a concrete\n\t    //   Tensor (specifically Scalar) values are returned. This is due to the\n\t    //   imperative backend.\n\t    return tidy(function () {\n\t      var losses = [];\n\n\t      for (var _iterator25 = _createForOfIteratorHelperLoose(_this4.layers), _step25; !(_step25 = _iterator25()).done;) {\n\t        var layer = _step25.value;\n\n\t        for (var nodeIndex = 0; nodeIndex < layer.inboundNodes.length; ++nodeIndex) {\n\t          var nodeKey = Container.nodeKey(layer, nodeIndex);\n\n\t          if (_this4.containerNodes.has(nodeKey)) {\n\t            losses.push.apply(losses, layer.calculateLosses());\n\t          }\n\t        }\n\t      } // TODO(cais): Add any unconditional model-level losses?\n\n\n\t      return losses;\n\t    });\n\t  };\n\n\t  _proto.getConfig = function getConfig() {\n\t    var config = {\n\t      name: this.name\n\t    }; // Build a map from layer unique name (self._node_key)\n\t    // to the index of the nodes that are saved in the config.\n\t    // Only nodes in container_nodes are saved.\n\n\t    var nodeConversionMap = this.buildNodeConversionMap(this.layers); // Serialize and save the layers in layerConfigs\n\n\t    var layerConfigs = [];\n\n\t    for (var _iterator26 = _createForOfIteratorHelperLoose(this.layers), _step26; !(_step26 = _iterator26()).done;) {\n\t      var _layer10 = _step26.value;\n\n\t      var layerClassName = _layer10.getClassName();\n\n\t      var layerConfig = _layer10.getConfig();\n\n\t      var filteredInboundNodes = [];\n\n\t      for (var originalNodeIndex = 0; originalNodeIndex < _layer10.inboundNodes.length; originalNodeIndex++) {\n\t        var node = _layer10.inboundNodes[originalNodeIndex];\n\n\t        var _nodeKey2 = Container.nodeKey(_layer10, originalNodeIndex);\n\n\t        var kwargs = {};\n\n\t        if (this.containerNodes.has(_nodeKey2)) {\n\t          // The node is relevant to the model:\n\t          // add to filteredInboundNodes.\n\t          if (node.callArgs) {\n\t            try {\n\t              JSON.stringify(node.callArgs);\n\t              kwargs = node.callArgs;\n\t            } catch (err) {\n\t              console.warn(\"Layer \" + _layer10.name + \" was passed \" + \"non-serializable keyword arguments: \" + (node.callArgs + \". They will not be included \") + \"in the serialized model (and thus will be \" + \"missing at deserialization time).\");\n\t              kwargs = {};\n\t            }\n\t          }\n\n\t          if (node.inboundLayers.length > 0) {\n\t            var nodeData = [];\n\n\t            for (var _i7 = 0; _i7 < node.inboundLayers.length; _i7++) {\n\t              var inboundLayer = node.inboundLayers[_i7];\n\t              var _nodeIndex7 = node.nodeIndices[_i7];\n\t              var _tensorIndex5 = node.tensorIndices[_i7];\n\n\t              var _nodeKey3 = Container.nodeKey(inboundLayer, _nodeIndex7);\n\n\t              var _newNodeIndex2 = nodeConversionMap[_nodeKey3];\n\n\t              if (_newNodeIndex2 == null) {\n\t                _newNodeIndex2 = 0;\n\t              }\n\n\t              nodeData.push([inboundLayer.name, _newNodeIndex2, _tensorIndex5, kwargs]);\n\t            }\n\n\t            filteredInboundNodes.push(nodeData);\n\t          }\n\t        }\n\t      }\n\n\t      var dict = {};\n\t      dict['name'] = _layer10.name;\n\t      dict['className'] = layerClassName;\n\t      dict['config'] = layerConfig;\n\t      dict['inboundNodes'] = filteredInboundNodes;\n\t      layerConfigs.push(dict);\n\t    }\n\n\t    config['layers'] = layerConfigs; // Gather info about inputs and outputs\n\n\t    var modelInputs = [];\n\n\t    for (var i = 0; i < this.inputLayers.length; i++) {\n\t      var layer = this.inputLayers[i];\n\t      var nodeIndex = this.inputLayersNodeIndices[i];\n\t      var nodeKey = Container.nodeKey(layer, nodeIndex);\n\n\t      if (!this.containerNodes.has(nodeKey)) {\n\t        continue;\n\t      }\n\n\t      var newNodeIndex = nodeConversionMap[nodeKey];\n\n\t      if (newNodeIndex === null || newNodeIndex === undefined) {\n\t        newNodeIndex = 0;\n\t      }\n\n\t      var tensorIndex = this.inputLayersTensorIndices[i];\n\t      modelInputs.push([layer.name, newNodeIndex, tensorIndex]);\n\t    }\n\n\t    config['inputLayers'] = modelInputs;\n\t    var modelOutputs = [];\n\n\t    for (var _i6 = 0; _i6 < this.outputLayers.length; _i6++) {\n\t      var _layer9 = this.outputLayers[_i6];\n\t      var _nodeIndex6 = this.outputLayersNodeIndices[_i6];\n\n\t      var _nodeKey = Container.nodeKey(_layer9, _nodeIndex6);\n\n\t      if (!this.containerNodes.has(_nodeKey)) {\n\t        continue;\n\t      }\n\n\t      var _newNodeIndex = nodeConversionMap[_nodeKey];\n\n\t      if (_newNodeIndex === null || _newNodeIndex === undefined) {\n\t        _newNodeIndex = 0;\n\t      }\n\n\t      var _tensorIndex4 = this.outputLayersTensorIndices[_i6];\n\t      modelOutputs.push([_layer9.name, _newNodeIndex, _tensorIndex4]);\n\t    }\n\n\t    config['outputLayers'] = modelOutputs;\n\t    return config;\n\t  }\n\t  /**\n\t   * Instantiates a LayersModel from its config (output of `get_config()`).\n\t   * @param cls the class to create\n\t   * @param config LayersModel config dictionary.\n\t   * @param customObjects An optional dictionary of custom objects.\n\t   * @param fastWeightInit Optional flag to use fast weight initialization\n\t   *   during deserialization. This is applicable to cases in which\n\t   *   the initialization will be immediately overwritten by loaded weight\n\t   *   values. Default: `false`.\n\t   * @returns A LayersModel instance.\n\t   * @throws ValueError: In case of improperly formatted config dict.\n\t   */\n\n\t  /** @nocollapse */\n\t  ;\n\n\t  Container.fromConfig = function fromConfig(cls, config, customObjects, fastWeightInit) {\n\t    if (customObjects === void 0) {\n\t      customObjects = {};\n\t    }\n\n\t    if (fastWeightInit === void 0) {\n\t      fastWeightInit = false;\n\t    }\n\n\t    // Layer instances created during\n\t    // the graph reconstruction process\n\t    var createdLayers = {}; // Dictionary mapping layer instances to\n\t    // node data that specifies a layer call.\n\t    // It acts as a queue that maintains any unprocessed\n\t    // layer call until it becomes possible to process it\n\t    // (i.e. until the input tensors to the call all exist).\n\n\t    var unprocessedNodes = {};\n\n\t    function addUnprocessedNode(layer, nodeData) {\n\t      if (!(layer.name in unprocessedNodes)) {\n\t        unprocessedNodes[layer.name] = [nodeData];\n\t      } else {\n\t        unprocessedNodes[layer.name].push(nodeData);\n\t      }\n\t    }\n\n\t    function processNode(layer, nodeData) {\n\t      var inputTensors = [];\n\t      var kwargs;\n\n\t      for (var _iterator27 = _createForOfIteratorHelperLoose(nodeData), _step27; !(_step27 = _iterator27()).done;) {\n\t        var inputData = _step27.value;\n\t        var inboundLayerName = inputData[0];\n\t        var inboundNodeIndex = inputData[1];\n\t        var inboundTensorIndex = inputData[2];\n\t        kwargs = inputData[3] == null ? {} : inputData[3];\n\n\t        if (!(inboundLayerName in createdLayers)) {\n\t          addUnprocessedNode(layer, nodeData);\n\t          return;\n\t        }\n\n\t        var inboundLayer = createdLayers[inboundLayerName];\n\n\t        if (inboundLayer.inboundNodes.length <= inboundNodeIndex) {\n\t          addUnprocessedNode(layer, nodeData);\n\t          return;\n\t        }\n\n\t        var inboundNode = inboundLayer.inboundNodes[inboundNodeIndex];\n\t        inputTensors.push(inboundNode.outputTensors[inboundTensorIndex]);\n\t      } // Call layer on its inputs, thus creating the node\n\t      // and building the layer if needed.\n\t      // Note: This has Eager vs Graph Implications.\n\n\n\t      if (inputTensors.length > 0) {\n\t        layer.apply(singletonOrArray(inputTensors), kwargs); // was ** kwargs\n\t      }\n\t    }\n\t    /**\n\t     * Deserialize a layer, then call it on appropriate inputs.\n\t     * @param layerData: layer config dict.\n\t     * @throws ValueError: In case of improperly formatted `layer_data`\n\t     * dict.\n\t     */\n\n\n\t    function processLayer(layerData) {\n\t      var layerName = layerData['name']; // Instantiate layer.\n\n\t      var layer = deserialize$1(layerData, config['customObjects'] != null ? config['customObjects'] : {});\n\t      layer.setFastWeightInitDuringBuild(fastWeightInit);\n\t      createdLayers[layerName] = layer; // Gather layer inputs.\n\n\t      var inboundNodesData = layerData['inboundNodes'];\n\t      inboundNodesData.forEach(function (nodeData) {\n\t        if (!(nodeData instanceof Array)) {\n\t          throw new ValueError(\"Corrupted configuration, expected array for nodeData: \" + nodeData);\n\t        } // We don't process nodes (i.e. make layer calls)\n\t        // on the fly because the inbound node may not yet exist,\n\t        // in case of layer shared at different topological depths\n\t        // (e.g.a model such as A(B(A(B(x)))))\n\n\n\t        addUnprocessedNode(layer, nodeData);\n\t      });\n\t    } // First, we create all layers and enqueue nodes to be processed.\n\n\n\t    var name = config['name'];\n\t    var layersFromConfig = config['layers'];\n\n\t    for (var _iterator28 = _createForOfIteratorHelperLoose(layersFromConfig), _step28; !(_step28 = _iterator28()).done;) {\n\t      var _layerData = _step28.value;\n\t      processLayer(_layerData);\n\t    } // Then we process nodes in order of layer depth.\n\t    // Nodes that cannot yet be processed(if the inbound node\n\t    // does not yet exist) are re - enqueued, and the process\n\t    // is repeated until all nodes are processed.\n\n\n\t    while (!isObjectEmpty(unprocessedNodes)) {\n\t      for (var _iterator29 = _createForOfIteratorHelperLoose(layersFromConfig), _step29; !(_step29 = _iterator29()).done;) {\n\t        var layerData = _step29.value;\n\t        var layer = createdLayers[layerData['name']];\n\n\t        if (layer.name in unprocessedNodes) {\n\t          var currentUnprocessedNodesForLayer = unprocessedNodes[layer.name];\n\t          delete unprocessedNodes[layer.name];\n\n\t          for (var _iterator30 = _createForOfIteratorHelperLoose(currentUnprocessedNodesForLayer), _step30; !(_step30 = _iterator30()).done;) {\n\t            var nodeData = _step30.value;\n\t            processNode(layer, nodeData);\n\t          }\n\t        }\n\t      }\n\t    }\n\n\t    var inputTensors = [];\n\t    var outputTensors = [];\n\t    var inputLayersFromConfig = config['inputLayers'];\n\n\t    for (var _iterator31 = _createForOfIteratorHelperLoose(inputLayersFromConfig), _step31; !(_step31 = _iterator31()).done;) {\n\t      var _layerData2 = _step31.value;\n\t      var layerName = _layerData2[0];\n\t      var nodeIndex = _layerData2[1];\n\t      var tensorIndex = _layerData2[2];\n\t      assert$1(layerName in createdLayers);\n\t      var _layer11 = createdLayers[layerName];\n\t      var layerOutputTensors = _layer11.inboundNodes[nodeIndex].outputTensors;\n\t      inputTensors.push(layerOutputTensors[tensorIndex]);\n\t    }\n\n\t    var outputLayersFromConfig = config['outputLayers'];\n\n\t    for (var _iterator32 = _createForOfIteratorHelperLoose(outputLayersFromConfig), _step32; !(_step32 = _iterator32()).done;) {\n\t      var _layerData3 = _step32.value;\n\t      var _layerName = _layerData3[0];\n\t      var _nodeIndex8 = _layerData3[1];\n\t      var _tensorIndex6 = _layerData3[2];\n\t      assert$1(_layerName in createdLayers);\n\t      var _layer12 = createdLayers[_layerName];\n\t      var _layerOutputTensors = _layer12.inboundNodes[_nodeIndex8].outputTensors;\n\t      outputTensors.push(_layerOutputTensors[_tensorIndex6]);\n\t    }\n\n\t    return new cls({\n\t      inputs: inputTensors,\n\t      outputs: outputTensors,\n\t      name: name\n\t    });\n\t  }\n\t  /**\n\t   * Determine whether the container is stateful.\n\t   *\n\t   * Porting Note: this is the equivalent of the stateful @property of\n\t   *   the Container class in PyKeras.\n\t   */\n\t  ;\n\n\t  /**\n\t   * Reset the state of all stateful constituent layers (if any).\n\t   *\n\t   * Examples of stateful layers include RNN layers whose `stateful` property\n\t   * is set as `true`.\n\t   */\n\t  _proto.resetStates = function resetStates() {\n\t    var _this5 = this;\n\n\t    tidy(function () {\n\t      _this5.layers.forEach(function (layer) {\n\t        // tslint:disable:no-any\n\t        if (layer.stateful) {\n\t          layer.resetStates();\n\t        } // tslint:enable:no-any\n\n\t      });\n\t    });\n\t  };\n\n\t  _createClass(Container, [{\n\t    key: \"trainable\",\n\t    get: function get() {\n\t      return this.trainable_;\n\t    },\n\t    set: function set(trainable) {\n\t      this.layers.forEach(function (layer) {\n\t        // tslint:disable-next-line:no-any\n\t        layer._trainableWeights.forEach(function (w) {\n\t          return w.trainable = trainable;\n\t        });\n\t      });\n\t      this.trainable_ = trainable;\n\t    }\n\t  }, {\n\t    key: \"trainableWeights\",\n\t    get: function get() {\n\t      // Porting Note: This check below is to prevent errors where the\n\t      //   _trainableWeights inherited from the parent class (Layer) gets\n\t      //   inadvertently used.\n\t      if (this._trainableWeights.length > 0) {\n\t        throw new ValueError('Container instance unexpectedly contains _trainableWeights.' + 'The trainable weights of a Container are a union of the ' + 'trainable weights of its consituent Layers. Its own ' + '_trainableWeights must remain an empty Array.');\n\t      }\n\n\t      if (!this.trainable) {\n\t        return [];\n\t      }\n\n\t      var weights = [];\n\n\t      for (var _iterator33 = _createForOfIteratorHelperLoose(this.layers), _step33; !(_step33 = _iterator33()).done;) {\n\t        var layer = _step33.value;\n\t        weights = weights.concat(layer.trainableWeights);\n\t      }\n\n\t      return weights;\n\t    }\n\t  }, {\n\t    key: \"nonTrainableWeights\",\n\t    get: function get() {\n\t      var weights = [];\n\n\t      for (var _iterator34 = _createForOfIteratorHelperLoose(this.layers), _step34; !(_step34 = _iterator34()).done;) {\n\t        var _layer13 = _step34.value;\n\t        weights.push.apply(weights, _layer13.nonTrainableWeights);\n\t      }\n\n\t      if (!this.trainable) {\n\t        var trainableWeights = [];\n\n\t        for (var _iterator35 = _createForOfIteratorHelperLoose(this.layers), _step35; !(_step35 = _iterator35()).done;) {\n\t          var layer = _step35.value;\n\t          trainableWeights.push.apply(trainableWeights, layer.trainableWeights);\n\t        }\n\n\t        return trainableWeights.concat(weights);\n\t      }\n\n\t      return weights;\n\t    }\n\t  }, {\n\t    key: \"weights\",\n\t    get: function get() {\n\t      return this.trainableWeights.concat(this.nonTrainableWeights);\n\t    }\n\t  }, {\n\t    key: \"stateful\",\n\t    get: function get() {\n\t      // Porting Note: This check is to prevent inadvertent setting of the\n\t      //   _stateful property of the Container instance.\n\t      if (this._stateful) {\n\t        throw new ValueError('Container instance unexpectedly has _stateful = true. The ' + 'statefulness of a Container is determined by the Layers it ' + 'contains. Its _stateful property must remain the default false.');\n\t      }\n\n\t      for (var _iterator36 = _createForOfIteratorHelperLoose(this.layers), _step36; !(_step36 = _iterator36()).done;) {\n\t        var layer = _step36.value;\n\n\t        if (layer.stateful) {\n\t          return true;\n\t        }\n\t      }\n\n\t      return false;\n\t    }\n\t  }]);\n\n\t  return Container;\n\t}(Layer);\n\n\tfunction standardizeSampleOrClassWeights(xWeight, outputNames, weightType) {\n\t  var numOutputs = outputNames.length;\n\n\t  if (xWeight == null || Array.isArray(xWeight) && xWeight.length === 0) {\n\t    return outputNames.map(function (name) {\n\t      return null;\n\t    });\n\t  }\n\n\t  if (numOutputs === 1) {\n\t    if (Array.isArray(xWeight) && xWeight.length === 1) {\n\t      return xWeight;\n\t    } else if (typeof xWeight === 'object' && outputNames[0] in xWeight) {\n\t      return [xWeight[outputNames[0]]];\n\t    } else {\n\t      return [xWeight];\n\t    }\n\t  }\n\n\t  if (Array.isArray(xWeight)) {\n\t    if (xWeight.length !== numOutputs) {\n\t      throw new Error(\"Provided \" + weightType + \" is an array of \" + xWeight.length + \" \" + (\"element(s), but the model has \" + numOutputs + \" outputs. \") + \"Make sure a set of weights is provided for each model output.\");\n\t    }\n\n\t    return xWeight;\n\t  } else if (typeof xWeight === 'object' && Object.keys(xWeight).length > 0 && typeof xWeight[Object.keys(xWeight)[0]] === 'object') {\n\t    var output = [];\n\t    outputNames.forEach(function (outputName) {\n\t      if (outputName in xWeight) {\n\t        output.push(xWeight[outputName]);\n\t      } else {\n\t        output.push(null);\n\t      }\n\t    });\n\t    return output;\n\t  } else {\n\t    throw new Error(\"The model has multiple (\" + numOutputs + \") outputs, \" + (\"so \" + weightType + \" must be either an array with \") + (numOutputs + \" elements or an object with \" + outputNames + \" keys. \") + (\"Provided \" + weightType + \" not understood: \" + JSON.stringify(xWeight)));\n\t  }\n\t}\n\t/**\n\t * Standardize class weighting objects.\n\t *\n\t * This function takes a single class-weighting object, an array of them,\n\t * or a map from output name to class-weighting object. It compares it to the\n\t * output name(s) of the model, base on which it outputs an array of\n\t * class-weighting objects of which the length matches the number of outputs.\n\t *\n\t * @param classWeight Input class-weighting object(s).\n\t * @param outputNames All output name(s) of the model.\n\t * @return An array of class-weighting objects. The length of the array matches\n\t *   the model's number of outputs.\n\t */\n\n\n\tfunction standardizeClassWeights(classWeight, outputNames) {\n\t  return standardizeSampleOrClassWeights(classWeight, outputNames, 'classWeight');\n\t}\n\tfunction standardizeSampleWeights(classWeight, outputNames) {\n\t  return standardizeSampleOrClassWeights(classWeight, outputNames, 'sampleWeight');\n\t}\n\t/**\n\t * Standardize by-sample and/or by-class weights for training.\n\t *\n\t * Note that this function operates on one model output at a time. For a model\n\t * with multiple outputs, you must call this function multiple times.\n\t *\n\t * @param y The target tensor that the by-sample and/or by-class weight is for.\n\t *     The values of y are assumed to encode the classes, either directly\n\t *     as an integer index, or as one-hot encoding.\n\t * @param sampleWeight By-sample weights.\n\t * @param classWeight By-class weights: an object mapping class indices\n\t *     (integers) to a weight (float) to apply to the model's loss for the\n\t *     samples from this class during training. This can be useful to tell the\n\t *     model to \"pay more attention\" to samples from an under-represented class.\n\t * @param sampleWeightMode The mode for the sample weights.\n\t * @return A Promise of weight tensor, of which the size of the first dimension\n\t *     matches that of `y`.\n\t */\n\n\tfunction standardizeWeights(_x, _x2, _x3, _x4) {\n\t  return _standardizeWeights.apply(this, arguments);\n\t}\n\t/**\n\t * Apply per-sample weights on the loss values from a number of samples.\n\t *\n\t * @param losses Loss tensor of shape `[batchSize]`.\n\t * @param sampleWeights Per-sample weight tensor of shape `[batchSize]`.\n\t * @returns Tensor of the same shape as`losses`.\n\t */\n\n\tfunction _standardizeWeights() {\n\t  _standardizeWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(y, sampleWeight, classWeight, sampleWeightMode) {\n\t    var yClasses, yClassIndices, classSampleWeight;\n\t    return regeneratorRuntime.wrap(function _callee$(_context) {\n\t      while (1) {\n\t        switch (_context.prev = _context.next) {\n\t          case 0:\n\t            if (!(sampleWeight != null || sampleWeightMode != null)) {\n\t              _context.next = 2;\n\t              break;\n\t            }\n\n\t            throw new Error('Support sampleWeight is not implemented yet');\n\n\t          case 2:\n\t            if (!(classWeight != null)) {\n\t              _context.next = 15;\n\t              break;\n\t            }\n\n\t            // Apply class weights per sample.\n\t            yClasses = tidy(function () {\n\t              if (y.shape.length === 1) {\n\t                // Assume class indices.\n\t                return y.clone();\n\t              } else if (y.shape.length === 2) {\n\t                if (y.shape[1] > 1) {\n\t                  // Assume one-hot encoding of classes.\n\t                  var axis = 1;\n\t                  return y.argMax(axis);\n\t                } else if (y.shape[1] === 1) {\n\t                  // Class index.\n\t                  return y.reshape([y.shape[0]]);\n\t                } else {\n\t                  throw new Error(\"Encountered unexpected last-dimension size (\" + y.shape[1] + \") \" + \"during handling of class weights. The size is expected to be \" + \">= 1.\");\n\t                }\n\t              } else {\n\t                throw new Error(\"Unexpected rank of target (y) tensor (\" + y.rank + \") during \" + \"handling of class weights. The rank is expected to be 1 or 2.\");\n\t              }\n\t            });\n\t            _context.t0 = Array;\n\t            _context.next = 7;\n\t            return yClasses.data();\n\n\t          case 7:\n\t            _context.t1 = _context.sent;\n\t            yClassIndices = _context.t0.from.call(_context.t0, _context.t1);\n\t            dispose(yClasses);\n\t            classSampleWeight = [];\n\t            yClassIndices.forEach(function (classIndex) {\n\t              if (classWeight[classIndex] == null) {\n\t                throw new Error(\"classWeight must contain all classes in the training data. \" + (\"The class \" + classIndex + \" exists in the data but not in \") + \"classWeight\");\n\t              } else {\n\t                classSampleWeight.push(classWeight[classIndex]);\n\t              }\n\t            });\n\t            return _context.abrupt(\"return\", tensor1d(classSampleWeight, 'float32'));\n\n\t          case 15:\n\t            return _context.abrupt(\"return\", null);\n\n\t          case 16:\n\t          case \"end\":\n\t            return _context.stop();\n\t        }\n\t      }\n\t    }, _callee);\n\t  }));\n\t  return _standardizeWeights.apply(this, arguments);\n\t}\n\n\tfunction computeWeightedLoss$1(losses, sampleWeights) {\n\t  return mul(losses, sampleWeights);\n\t}\n\n\tvar DEFAULT_VALIDATION_BATCH_SIZE = 32;\n\t/**\n\t * Standardize the output of a dataset iterator for use by\n\t * LayersModel.fitDataset().\n\t *\n\t * @param model: A `tf.LayersModel` object.\n\t * @param iteratorOut The output of a dataset iterator. It is required to be\n\t *   an object of the form `{xs: TensorOrArrayOrMap, ys:\n\t * TensorOrArrayOrMap}`, where `TensorOrArrayOrMap` is a single `tf.Tensor`,\n\t * a `tf.Tensor[]`, or a flat map from string names to `tf.Tensor`s.\n\t * @returns A flat array of `tf.Tensor` objects: the input `tf.Tensor`s\n\t *   followed by the target `tf.Tensor`s.  When `tf.Tensor`s are provided\n\t *   as a map, the order in the resulting array is taken from the `inputNames`\n\t *   and `outputNames` of the model.\n\t */\n\n\tfunction standardizeDataIteratorOutput( // Type `model` as `any` here to avoid circular dependency w/\n\t// training.ts.\n\t// tslint:disable-next-line:no-any\n\tmodel, iteratorOut) {\n\t  var xs;\n\t  var ys;\n\t  var iteratorOutObj = iteratorOut;\n\t  xs = iteratorOutObj['xs'];\n\t  ys = iteratorOutObj['ys'];\n\t  assert(xs != null && ys != null, function () {\n\t    return 'A Dataset iterator for fitDataset() is expected to generate ' + 'objects of the form `{xs: xVal, ys: yVal}`, where the two ' + 'values may be `tf.Tensor`, an array of Tensors, or a map of ' + 'string to Tensor.  The provided Dataset instead generates ' + (\"\" + iteratorOut);\n\t  });\n\t  var flattenedXs = flattenTensorOrArrayOrMap('input', model.inputNames, xs);\n\t  var flattenedYs = flattenTensorOrArrayOrMap('output', model.outputNames, ys);\n\t  var batchSize = flattenedXs[0].shape[0];\n\t  assert(flattenedXs.length === model.inputs.length, function () {\n\t    return \"LayersModel has \" + model.inputs.length + \" inputs, but the dataset \" + (\"provides \" + flattenedXs.length + \" inputs.  (Expected input keys: \") + (JSON.stringify(model.inputNames) + \")\");\n\t  });\n\t  assert(flattenedYs.length === model.outputs.length, function () {\n\t    return \"LayersModel has \" + model.outputs.length + \" outputs, but the dataset \" + (\"provides \" + flattenedYs.length + \" outputs.  (Expected output keys: \") + (JSON.stringify(model.outputNames) + \")\");\n\t  });\n\n\t  var _loop = function _loop(xIndex) {\n\t    assert(flattenedXs[xIndex].shape[0] === batchSize, function () {\n\t      return \"Batch size mismatch: input \" + (model.inputNames[xIndex] + \" has \" + flattenedXs[xIndex].shape[0] + \"; \") + (\"expected  \" + batchSize + \" based on input \" + model.inputNames[0] + \".\");\n\t    });\n\t  };\n\n\t  for (var xIndex = 0; xIndex < flattenedXs.length; xIndex++) {\n\t    _loop(xIndex);\n\t  }\n\n\t  var _loop2 = function _loop2(yIndex) {\n\t    assert(flattenedYs[yIndex].shape[0] === batchSize, function () {\n\t      return \"Batch size mismatch: output \" + (model.outputNames[yIndex] + \" has \" + flattenedYs[yIndex].shape[0] + \"; \") + (\"expected  \" + batchSize + \" based on input \" + model.inputNames[0] + \".\");\n\t    });\n\t  };\n\n\t  for (var yIndex = 0; yIndex < flattenedYs.length; yIndex++) {\n\t    _loop2(yIndex);\n\t  }\n\n\t  return {\n\t    xs: flattenedXs,\n\t    ys: flattenedYs\n\t  };\n\t}\n\n\tfunction flattenTensorOrArrayOrMap(inputOrOutput, names, values) {\n\t  if (values instanceof Tensor) {\n\t    return [values];\n\t  } else if (Array.isArray(values)) {\n\t    assert(values.length === names.length, function () {\n\t      return \"Received an array of \" + values.length + \" Tensors, but expected \" + names.length + \" to match the \" + inputOrOutput + \" keys \" + names + \".\";\n\t    });\n\t    return values;\n\t  } else {\n\t    var result = []; // Check that all the required keys are available.\n\n\t    for (var _iterator = _createForOfIteratorHelperLoose(names), _step; !(_step = _iterator()).done;) {\n\t      var name = _step.value;\n\n\t      if (values[name] == null) {\n\t        throw new ValueError(\"The feature data generated by the dataset lacks the required \" + (inputOrOutput + \" key '\" + name + \"'.\"));\n\t      }\n\n\t      result.push(values[name]);\n\t    }\n\n\t    return result;\n\t  }\n\t}\n\n\tfunction standardizeTensorValidationData(data) {\n\t  if (data.length === 3) {\n\t    throw new NotImplementedError('Validation with sample weights is not implemented yet.');\n\t  }\n\n\t  return {\n\t    xs: data[0],\n\t    ys: data[1]\n\t  };\n\t}\n\n\tfunction fitDataset(_x, _x2, _x3) {\n\t  return _fitDataset.apply(this, arguments);\n\t}\n\t/** Helper function that determines number of steps (batches) per epoch. */\n\n\tfunction _fitDataset() {\n\t  _fitDataset = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee( // Type `model` as `any` here to avoid circular dependency w/\n\t  // training.ts.\n\t  // tslint:disable-next-line:no-any\n\t  model, dataset, args) {\n\t    var hasBatchesPerEpoch, doValidation, valXs, valYs, validationData, trainFunction, outLabels, callbackMetrics, callbacks, verbose, _configureCallbacks, callbackList, history, epoch, dataIterator, epochLogs, stepsDone, batchIndex, iteratorOut, _standardizeDataItera, xs, ys, batchLogs, sampleWeights, standardClassWeights, i, ins, outs, _i, label, out, valOuts, _i2;\n\n\t    return regeneratorRuntime.wrap(function _callee$(_context) {\n\t      while (1) {\n\t        switch (_context.prev = _context.next) {\n\t          case 0:\n\t            hasBatchesPerEpoch = args.batchesPerEpoch != null;\n\t            assert(model.optimizer != null, function () {\n\t              return 'You must compile a model before training/testing. Use ' + 'LayersModel.compile(modelCompileConfig).';\n\t            });\n\t            assert(args != null, function () {\n\t              return \"For fitDataset(), the 2nd argument (config) is required, \" + \"but it is not provided in this call.\";\n\t            });\n\t            assert(args.epochs != null && args.epochs > 0 && Number.isInteger(args.epochs), function () {\n\t              return \"For fitDataset(), config.epochs is expected to be a positive \" + (\"integer, but got \" + args.epochs);\n\t            });\n\t            assert(!hasBatchesPerEpoch || args.batchesPerEpoch > 0 && Number.isInteger(args.batchesPerEpoch), function () {\n\t              return \"For fitDataset(), config.batchesPerEpoch is expected to be a \" + (\"positive integer if specified, but got \" + args.batchesPerEpoch);\n\t            });\n\t            assert( // tslint:disable-next-line:no-any\n\t            args['validationSplit'] == null, function () {\n\t              return '`validationSplit` is not supported by `fitDataset()`. ' + 'Use validationData instead.';\n\t            });\n\n\t            if (!model.isTraining) {\n\t              _context.next = 8;\n\t              break;\n\t            }\n\n\t            throw new Error('Cannot start training because another fit() call is ongoing.');\n\n\t          case 8:\n\t            model.isTraining = true;\n\t            _context.prev = 9;\n\t            doValidation = args.validationData != null;\n\n\t            if (doValidation) {\n\t              if (isDatasetObject(args.validationData)) {\n\t                assert(args.validationBatches == null || args.validationBatches > 0 && Number.isInteger(args.validationBatches), function () {\n\t                  return \"For fitDataset() with dataset-based validation, \" + \"config.validationBatches is expected not to be provided, \" + \"or to be a positive integer, \" + (\"but got \" + args.validationBatches);\n\t                });\n\t              } else {\n\t                validationData = standardizeTensorValidationData(args.validationData);\n\t                valXs = validationData.xs;\n\t                valYs = validationData.ys;\n\t              }\n\t            }\n\n\t            trainFunction = model.makeTrainFunction();\n\t            outLabels = model.getDedupedMetricsNames();\n\n\t            if (doValidation) {\n\t              callbackMetrics = outLabels.slice().concat(outLabels.map(function (n) {\n\t                return 'val_' + n;\n\t              }));\n\t            } else {\n\t              callbackMetrics = outLabels.slice();\n\t            }\n\n\t            callbacks = standardizeCallbacks(args.callbacks, args.yieldEvery);\n\t            verbose = args.verbose == null ? 1 : args.verbose;\n\t            _configureCallbacks = configureCallbacks(callbacks, verbose, args.epochs, null, null, getStepsPerEpoch(dataset, args), null, // Batch size determined by the dataset itself.\n\t            doValidation, callbackMetrics), callbackList = _configureCallbacks.callbackList, history = _configureCallbacks.history;\n\t            callbackList.setModel(model);\n\t            model.history = history;\n\t            _context.next = 22;\n\t            return callbackList.onTrainBegin();\n\n\t          case 22:\n\t            model.stopTraining_ = false;\n\t            epoch = args.initialEpoch == null ? 0 : args.initialEpoch;\n\t            _context.next = 26;\n\t            return dataset.iterator();\n\n\t          case 26:\n\t            dataIterator = _context.sent;\n\n\t          case 27:\n\t            if (!(epoch < args.epochs)) {\n\t              _context.next = 98;\n\t              break;\n\t            }\n\n\t            epochLogs = {};\n\t            _context.next = 31;\n\t            return callbackList.onEpochBegin(epoch);\n\n\t          case 31:\n\t            stepsDone = 0;\n\t            batchIndex = 0;\n\n\t            if (hasBatchesPerEpoch) {\n\t              _context.next = 37;\n\t              break;\n\t            }\n\n\t            _context.next = 36;\n\t            return dataset.iterator();\n\n\t          case 36:\n\t            dataIterator = _context.sent;\n\n\t          case 37:\n\t            if (!(hasBatchesPerEpoch ? stepsDone < args.batchesPerEpoch : true)) {\n\t              _context.next = 91;\n\t              break;\n\t            }\n\n\t            _context.next = 40;\n\t            return dataIterator.next();\n\n\t          case 40:\n\t            iteratorOut = _context.sent;\n\n\t            if (!(hasBatchesPerEpoch && iteratorOut.done)) {\n\t              _context.next = 44;\n\t              break;\n\t            }\n\n\t            console.warn('You provided `batchesPerEpoch` as ' + (args.batchesPerEpoch + \", \") + 'but your dataset iterator ran out of data after ' + (stepsDone + \" batches; \") + 'interrupting training. Make sure that your ' + 'dataset can generate at least `batchesPerEpoch * epochs` ' + 'batches (in this case, ' + (args.batchesPerEpoch * args.epochs + \" batches). \") + 'You may need to use the repeat() function when building ' + 'your dataset.');\n\t            return _context.abrupt(\"break\", 91);\n\n\t          case 44:\n\t            if (!(iteratorOut.value != null)) {\n\t              _context.next = 73;\n\t              break;\n\t            }\n\n\t            _standardizeDataItera = standardizeDataIteratorOutput(model, iteratorOut.value), xs = _standardizeDataItera.xs, ys = _standardizeDataItera.ys;\n\t            batchLogs = {};\n\t            batchLogs['batch'] = batchIndex;\n\t            batchLogs['size'] = xs[0].shape[0];\n\t            _context.next = 51;\n\t            return callbackList.onBatchBegin(batchIndex, batchLogs);\n\n\t          case 51:\n\t            sampleWeights = [];\n\n\t            if (!(args.classWeight != null)) {\n\t              _context.next = 64;\n\t              break;\n\t            }\n\n\t            standardClassWeights = standardizeClassWeights(args.classWeight, model.outputNames);\n\t            i = 0;\n\n\t          case 55:\n\t            if (!(i < standardClassWeights.length)) {\n\t              _context.next = 64;\n\t              break;\n\t            }\n\n\t            _context.t0 = sampleWeights;\n\t            _context.next = 59;\n\t            return standardizeWeights(ys[i], null, standardClassWeights[i]);\n\n\t          case 59:\n\t            _context.t1 = _context.sent;\n\n\t            _context.t0.push.call(_context.t0, _context.t1);\n\n\t          case 61:\n\t            ++i;\n\t            _context.next = 55;\n\t            break;\n\n\t          case 64:\n\t            // Train on batch.\n\t            ins = xs.concat(ys).concat(sampleWeights);\n\t            outs = trainFunction(ins);\n\t            dispose(ins);\n\n\t            for (_i = 0; _i < outLabels.length; ++_i) {\n\t              label = outLabels[_i];\n\t              out = outs[_i];\n\t              batchLogs[label] = out;\n\t              keep(out);\n\t            }\n\n\t            _context.next = 70;\n\t            return callbackList.onBatchEnd(batchIndex, batchLogs);\n\n\t          case 70:\n\t            disposeTensorsInLogs(batchLogs);\n\t            batchIndex++;\n\t            stepsDone++;\n\n\t          case 73:\n\t            if (!(hasBatchesPerEpoch ? stepsDone >= args.batchesPerEpoch : iteratorOut.done)) {\n\t              _context.next = 87;\n\t              break;\n\t            }\n\n\t            if (!doValidation) {\n\t              _context.next = 86;\n\t              break;\n\t            }\n\n\t            valOuts = void 0;\n\n\t            if (!isDatasetObject(args.validationData)) {\n\t              _context.next = 84;\n\t              break;\n\t            }\n\n\t            _context.t2 = toList;\n\t            _context.next = 80;\n\t            return model.evaluateDataset(args.validationData, {\n\t              batches: args.validationBatches\n\t            });\n\n\t          case 80:\n\t            _context.t3 = _context.sent;\n\t            valOuts = (0, _context.t2)(_context.t3);\n\t            _context.next = 85;\n\t            break;\n\n\t          case 84:\n\t            valOuts = toList(model.evaluate(valXs, valYs, {\n\t              batchSize: args.validationBatchSize == null ? DEFAULT_VALIDATION_BATCH_SIZE : args.validationBatchSize,\n\t              verbose: 0\n\t            }));\n\n\t          case 85:\n\t            for (_i2 = 0; _i2 < model.metricsNames.length; ++_i2) {\n\t              epochLogs[\"val_\" + model.metricsNames[_i2]] = valOuts[_i2];\n\t            }\n\n\t          case 86:\n\t            return _context.abrupt(\"break\", 91);\n\n\t          case 87:\n\t            if (!model.stopTraining_) {\n\t              _context.next = 89;\n\t              break;\n\t            }\n\n\t            return _context.abrupt(\"break\", 91);\n\n\t          case 89:\n\t            _context.next = 37;\n\t            break;\n\n\t          case 91:\n\t            _context.next = 93;\n\t            return callbackList.onEpochEnd(epoch, epochLogs);\n\n\t          case 93:\n\t            epoch++;\n\n\t            if (!model.stopTraining_) {\n\t              _context.next = 96;\n\t              break;\n\t            }\n\n\t            return _context.abrupt(\"break\", 98);\n\n\t          case 96:\n\t            _context.next = 27;\n\t            break;\n\n\t          case 98:\n\t            _context.next = 100;\n\t            return callbackList.onTrainEnd();\n\n\t          case 100:\n\t            _context.next = 102;\n\t            return model.history.syncData();\n\n\t          case 102:\n\t            return _context.abrupt(\"return\", model.history);\n\n\t          case 103:\n\t            _context.prev = 103;\n\t            model.isTraining = false;\n\t            return _context.finish(103);\n\n\t          case 106:\n\t          case \"end\":\n\t            return _context.stop();\n\t        }\n\t      }\n\t    }, _callee, null, [[9,, 103, 106]]);\n\t  }));\n\t  return _fitDataset.apply(this, arguments);\n\t}\n\n\tfunction getStepsPerEpoch(dataset, args) {\n\t  // Attempt to determine # of batches in an epoch.\n\t  var stepsPerEpoch = null;\n\n\t  if (args.batchesPerEpoch != null) {\n\t    stepsPerEpoch = args.batchesPerEpoch;\n\t  } else if (Number.isFinite(dataset.size)) {\n\t    stepsPerEpoch = dataset.size;\n\t  }\n\n\t  return stepsPerEpoch;\n\t} // Check if provided object is a Dataset object by checking its .iterator\n\t// element.\n\n\n\tfunction isDatasetObject(dataset) {\n\t  return typeof dataset.iterator === 'function';\n\t} // Check if provided object is a LazyIterator object by checking it's .next\n\t// element.\n\n\n\tfunction isLazyIteratorObject(iterator) {\n\t  return typeof iterator.next === 'function';\n\t}\n\n\tfunction evaluateDataset(_x4, _x5, _x6) {\n\t  return _evaluateDataset.apply(this, arguments);\n\t}\n\n\tfunction _evaluateDataset() {\n\t  _evaluateDataset = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2( // Type `model` as `any` here to avoid circular dependency w/\n\t  // training.ts.\n\t  // tslint:disable-next-line:no-any\n\t  model, dataset, args) {\n\t    var hasBatches, f, outs, dataIterator, numExamples, batch, _loop3, _ret, i, oldScalar;\n\n\t    return regeneratorRuntime.wrap(function _callee2$(_context3) {\n\t      while (1) {\n\t        switch (_context3.prev = _context3.next) {\n\t          case 0:\n\t            args = args || {};\n\t            hasBatches = args.batches != null;\n\t            f = model.testFunction;\n\t            outs = [];\n\n\t            if (!(args.verbose > 0)) {\n\t              _context3.next = 6;\n\t              break;\n\t            }\n\n\t            throw new NotImplementedError('Verbose mode is not implemented yet.');\n\n\t          case 6:\n\t            assert(!hasBatches || args.batches > 0 && Number.isInteger(args.batches), function () {\n\t              return 'Test loop expects `batches` to be a positive integer, but ' + (\"received \" + JSON.stringify(args.batches));\n\t            });\n\n\t            if (!isLazyIteratorObject(dataset)) {\n\t              _context3.next = 11;\n\t              break;\n\t            }\n\n\t            _context3.t0 = dataset;\n\t            _context3.next = 14;\n\t            break;\n\n\t          case 11:\n\t            _context3.next = 13;\n\t            return dataset.iterator();\n\n\t          case 13:\n\t            _context3.t0 = _context3.sent;\n\n\t          case 14:\n\t            dataIterator = _context3.t0;\n\t            // Keeps track of number of examples used in this evaluation.\n\t            numExamples = 0;\n\t            batch = 0;\n\t            _loop3 = /*#__PURE__*/regeneratorRuntime.mark(function _loop3() {\n\t              var iteratorOut;\n\t              return regeneratorRuntime.wrap(function _loop3$(_context2) {\n\t                while (1) {\n\t                  switch (_context2.prev = _context2.next) {\n\t                    case 0:\n\t                      _context2.next = 2;\n\t                      return dataIterator.next();\n\n\t                    case 2:\n\t                      iteratorOut = _context2.sent;\n\t                      outs = tidy(function () {\n\t                        if (iteratorOut.value) {\n\t                          (function () {\n\t                            // TODO(cais): Once real dataset is available, use\n\t                            //   `map(x => standardizeDataIteratorOutput(model, x).map(f)`.\n\t                            var _standardizeDataItera2 = standardizeDataIteratorOutput(model, iteratorOut.value),\n\t                                xs = _standardizeDataItera2.xs,\n\t                                ys = _standardizeDataItera2.ys;\n\n\t                            var xsAndYs = xs.concat(ys);\n\t                            var batchOuts = tidy(function () {\n\t                              return f(xsAndYs);\n\t                            });\n\t                            dispose(xsAndYs);\n\n\t                            if (batch === 0) {\n\t                              for (var _i3 = 0; _i3 < batchOuts.length; ++_i3) {\n\t                                outs.push(scalar(0));\n\t                              }\n\t                            }\n\n\t                            var batchSize = xsAndYs[0].shape[0];\n\n\t                            var _loop4 = function _loop4(_i4) {\n\t                              var batchOut = batchOuts[_i4];\n\t                              var oldScalar = outs[_i4];\n\t                              outs[_i4] = tidy(function () {\n\t                                return add$1(outs[_i4], mul(batchSize, batchOut));\n\t                              });\n\n\t                              if (batch > 0) {\n\t                                dispose(oldScalar);\n\t                              }\n\t                            };\n\n\t                            for (var _i4 = 0; _i4 < batchOuts.length; ++_i4) {\n\t                              _loop4(_i4);\n\t                            }\n\n\t                            dispose(batchOuts);\n\t                            numExamples += batchSize;\n\t                            ++batch;\n\t                          })();\n\t                        }\n\n\t                        return outs;\n\t                      });\n\n\t                      if (!iteratorOut.done) {\n\t                        _context2.next = 7;\n\t                        break;\n\t                      }\n\n\t                      if (hasBatches) {\n\t                        console.warn('Your dataset iterator ran out of data during evaluateDataset(). ' + 'Interrupting evalution. Make sure that your ' + 'dataset can generate at least `batches` ' + (\"batches (in this case, \" + args.batches + \" batches). \") + 'You may need to use the repeat() function when building ' + 'your dataset.');\n\t                      }\n\n\t                      return _context2.abrupt(\"return\", \"break\");\n\n\t                    case 7:\n\t                    case \"end\":\n\t                      return _context2.stop();\n\t                  }\n\t                }\n\t              }, _loop3);\n\t            });\n\n\t          case 18:\n\t            if (!(hasBatches ? batch < args.batches : true)) {\n\t              _context3.next = 25;\n\t              break;\n\t            }\n\n\t            return _context3.delegateYield(_loop3(), \"t1\", 20);\n\n\t          case 20:\n\t            _ret = _context3.t1;\n\n\t            if (!(_ret === \"break\")) {\n\t              _context3.next = 23;\n\t              break;\n\t            }\n\n\t            return _context3.abrupt(\"break\", 25);\n\n\t          case 23:\n\t            _context3.next = 18;\n\t            break;\n\n\t          case 25:\n\t            for (i = 0; i < outs.length; ++i) {\n\t              oldScalar = outs[i];\n\t              outs[i] = div(outs[i], numExamples);\n\t              dispose(oldScalar);\n\t            }\n\n\t            return _context3.abrupt(\"return\", singletonOrArray(outs));\n\n\t          case 27:\n\t          case \"end\":\n\t            return _context3.stop();\n\t        }\n\t      }\n\t    }, _callee2);\n\t  }));\n\t  return _evaluateDataset.apply(this, arguments);\n\t}\n\n\tfunction checkBatchSize(batchSize) {\n\t  assert(batchSize > 0 && Number.isInteger(batchSize), function () {\n\t    return \"batchSize is required to be a positive integer, but got \" + batchSize;\n\t  });\n\t}\n\t/**\n\t * Slice a Tensor or an Array of Tensors, by start and stop indices.\n\t *\n\t * Porting Note: The `_slice_arrays` function in PyKeras is covered by this\n\t *   function and `sliceArraysByIndices()` together.\n\t *\n\t * @param arrays: the input.\n\t * @param start: the starting index (inclusive).\n\t * @param stop: the stopping index (exclusive).\n\t * @returns The result of the slicing. If `arrays` is an `Array` of\n\t *   `tf.Tensor`s, the slicing will be applied to all elements of the `Array`\n\t *   in the same way.\n\t */\n\n\tfunction sliceArrays(arrays, start, stop) {\n\t  if (arrays == null) {\n\t    return [null];\n\t  } else if (Array.isArray(arrays)) {\n\t    return arrays.map(function (array) {\n\t      return sliceAlongFirstAxis(array, start, stop - start);\n\t    });\n\t  } else {\n\t    // Tensor.\n\t    return sliceAlongFirstAxis(arrays, start, stop - start);\n\t  }\n\t}\n\t/**\n\t * Slice a Tensor or an Array of Tensors, by random-order indices.\n\t *\n\t * Porting Note: The `_slice_arrays` function in PyKeras is covered by this\n\t *   function and `sliceArrays()` together.\n\t *\n\t * @param arrays The input `tf.Tensor` or `Array` of `tf.Tensor`s to slice.\n\t *   If an `Array` of `tf.Tensor`s, all `tf.Tensor`s will be sliced in the\n\t *   same fashion.\n\t * @param indices The indices to use for slicing along the first (batch)\n\t *   dimension.\n\t * @returns Result(s) of the slicing.\n\t */\n\n\tfunction sliceArraysByIndices(arrays, indices) {\n\t  return tidy(function () {\n\t    if (arrays == null) {\n\t      return null;\n\t    } else if (Array.isArray(arrays)) {\n\t      return arrays.map(function (array) {\n\t        return sliceArraysByIndices(array, indices);\n\t      });\n\t    } else {\n\t      // TODO(cais): indices should be a pre-constructed Tensor1D to avoid\n\t      //   tensor1d() calls.\n\t      return gather$1(arrays, indices.dtype === 'int32' ? indices : indices.toInt());\n\t    }\n\t  });\n\t}\n\t/**\n\t * Returns a list of batch indices (tuples of indices).\n\t * @param size: Integer, total size of the data to slice into batches.\n\t * @param batchSize: Integer, batch size.\n\t * @returns An Array of [batchStart, batchEnd] tuples. batchStart is\n\t *   inclusive; batchEnd is exclusive. I.e., each batch consists of indices x\n\t *   that satisfy batchStart <= x < batchEnd.\n\t */\n\n\tfunction makeBatches(size, batchSize) {\n\t  var output = [];\n\t  var batchStart = 0;\n\t  var batchEnd = null;\n\n\t  while (batchStart < size) {\n\t    batchEnd = batchStart + batchSize;\n\n\t    if (batchEnd >= size) {\n\t      batchEnd = size;\n\t    }\n\n\t    output.push([batchStart, batchEnd]);\n\t    batchStart = batchEnd;\n\t  }\n\n\t  return output;\n\t}\n\t/**\n\t * Abstract fit function for `f(ins)`.\n\t * @param f A Function returning a list of tensors. For training, this\n\t *   function is expected to perform the updates to the variables.\n\t * @param ins List of tensors to be fed to `f`.\n\t * @param outLabels List of strings, display names of the outputs of `f`.\n\t * @param batchSize Integer batch size or `== null` if unknown. Default : 32.\n\t * @param epochs Number of times to iterate over the data. Default : 1.\n\t * @param verbose Verbosity mode: 0, 1, or 2. Default: 1.\n\t * @param callbacks List of callbacks to be called during training.\n\t * @param valF Function to call for validation.\n\t * @param valIns List of tensors to be fed to `valF`.\n\t * @param shuffle Whether to shuffle the data at the beginning of every\n\t * epoch. Default : true.\n\t * @param callbackMetrics List of strings, the display names of the metrics\n\t *   passed to the callbacks. They should be the concatenation of the\n\t *   display names of the outputs of `f` and the list of display names\n\t *   of the outputs of `valF`.\n\t * @param initialEpoch Epoch at which to start training (useful for\n\t *   resuming a previous training run). Default : 0.\n\t * @param stepsPerEpoch Total number of steps (batches on samples) before\n\t *   declaring one epoch finished and starting the next epoch. Ignored with\n\t *   the default value of `undefined` or `null`.\n\t * @param validationSteps Number of steps to run validation for (only if\n\t *   doing validation from data tensors). Not applicable for tfjs-layers.\n\t * @returns A `History` object.\n\t */\n\n\tfunction fitLoop(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8, _x9, _x10, _x11, _x12, _x13, _x14, _x15) {\n\t  return _fitLoop.apply(this, arguments);\n\t}\n\n\tfunction _fitLoop() {\n\t  _fitLoop = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2( // Type `model` as `any` here to avoid circular dependency w/ training.ts.\n\t  // tslint:disable-next-line:no-any\n\t  model, f, ins, outLabels, batchSize, epochs, verbose, callbacks, valF, valIns, shuffle$1, callbackMetrics, initialEpoch, stepsPerEpoch, validationSteps) {\n\t    var doValidation, numTrainSamples, indexArray, _configureCallbacks, callbackList, history, _loop, epoch, _ret;\n\n\t    return regeneratorRuntime.wrap(function _callee2$(_context4) {\n\t      while (1) {\n\t        switch (_context4.prev = _context4.next) {\n\t          case 0:\n\t            if (batchSize == null) {\n\t              batchSize = 32;\n\t            }\n\n\t            if (epochs == null) {\n\t              epochs = 1;\n\t            }\n\n\t            if (shuffle$1 == null) {\n\t              shuffle$1 = true;\n\t            }\n\n\t            if (initialEpoch == null) {\n\t              initialEpoch = 0;\n\t            } // TODO(cais): Change const to let below when implementing validation.\n\n\n\t            doValidation = false;\n\n\t            if (valF != null && valIns != null) {\n\t              doValidation = true; // TODO(cais): verbose message.\n\t            }\n\n\t            if (!(validationSteps != null)) {\n\t              _context4.next = 10;\n\t              break;\n\t            }\n\n\t            doValidation = true;\n\n\t            if (!(stepsPerEpoch == null)) {\n\t              _context4.next = 10;\n\t              break;\n\t            }\n\n\t            throw new ValueError('Can only use `validationSteps` when doing step-wise training, ' + 'i.e., `stepsPerEpoch` must be set.');\n\n\t          case 10:\n\t            numTrainSamples = model.checkNumSamples(ins, batchSize, stepsPerEpoch, 'steps_per_epoch');\n\n\t            if (numTrainSamples != null) {\n\t              indexArray = range$1(0, numTrainSamples);\n\t            }\n\n\t            if (verbose == null) {\n\t              verbose = 1;\n\t            }\n\n\t            _configureCallbacks = configureCallbacks(callbacks, verbose, epochs, initialEpoch, numTrainSamples, stepsPerEpoch, batchSize, doValidation, callbackMetrics), callbackList = _configureCallbacks.callbackList, history = _configureCallbacks.history;\n\t            callbackList.setModel(model);\n\t            model.history = history;\n\t            _context4.next = 18;\n\t            return callbackList.onTrainBegin();\n\n\t          case 18:\n\t            model.stopTraining_ = false; // TODO(cais): Take care of callbacks.validation_data as in PyKeras.\n\t            // TODO(cais): Pre-convert feeds for performance as in PyKeras.\n\n\t            _loop = /*#__PURE__*/regeneratorRuntime.mark(function _loop(epoch) {\n\t              var epochLogs;\n\t              return regeneratorRuntime.wrap(function _loop$(_context3) {\n\t                while (1) {\n\t                  switch (_context3.prev = _context3.next) {\n\t                    case 0:\n\t                      _context3.next = 2;\n\t                      return callbackList.onEpochBegin(epoch);\n\n\t                    case 2:\n\t                      epochLogs = {};\n\n\t                      if (!(stepsPerEpoch != null)) {\n\t                        _context3.next = 7;\n\t                        break;\n\t                      }\n\n\t                      throw new NotImplementedError('stepsPerEpoch mode is not implemented yet.');\n\n\t                    case 7:\n\t                      return _context3.delegateYield( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t                        var epochIndexArray1D, batches, _loop2, batchIndex, _ret2;\n\n\t                        return regeneratorRuntime.wrap(function _callee$(_context2) {\n\t                          while (1) {\n\t                            switch (_context2.prev = _context2.next) {\n\t                              case 0:\n\t                                if (!(shuffle$1 === 'batch')) {\n\t                                  _context2.next = 4;\n\t                                  break;\n\t                                }\n\n\t                                throw new NotImplementedError('batch shuffling is not implemneted yet');\n\n\t                              case 4:\n\t                                if (shuffle$1) {\n\t                                  shuffle(indexArray);\n\t                                }\n\n\t                              case 5:\n\t                                // Convert the potentially shuffled indices to Tensor1D, to avoid the\n\t                                // cost of repeated creation of Array1Ds later on.\n\t                                epochIndexArray1D = tensor1d(indexArray);\n\t                                batches = makeBatches(numTrainSamples, batchSize);\n\t                                _loop2 = /*#__PURE__*/regeneratorRuntime.mark(function _loop2(batchIndex) {\n\t                                  var batchLogs;\n\t                                  return regeneratorRuntime.wrap(function _loop2$(_context) {\n\t                                    while (1) {\n\t                                      switch (_context.prev = _context.next) {\n\t                                        case 0:\n\t                                          batchLogs = {};\n\t                                          _context.next = 3;\n\t                                          return callbackList.onBatchBegin(batchIndex, batchLogs);\n\n\t                                        case 3:\n\t                                          tidy(function () {\n\t                                            var batchStart = batches[batchIndex][0];\n\t                                            var batchEnd = batches[batchIndex][1];\n\t                                            var batchIds = sliceAlongFirstAxis(epochIndexArray1D, batchStart, batchEnd - batchStart);\n\t                                            batchLogs['batch'] = batchIndex;\n\t                                            batchLogs['size'] = batchEnd - batchStart; // TODO(cais): In ins, train flag can be a number, instead of an\n\t                                            //   Tensor? Do we need to handle this in tfjs-layers?\n\n\t                                            var insBatch = sliceArraysByIndices(ins, batchIds);\n\t                                            var outs = f(insBatch);\n\n\t                                            for (var i = 0; i < outLabels.length; ++i) {\n\t                                              var label = outLabels[i];\n\t                                              var out = outs[i];\n\t                                              batchLogs[label] = out;\n\t                                              keep(out); // TODO(cais): Use scope() to avoid ownership.\n\t                                            }\n\n\t                                            if (batchIndex === batches.length - 1) {\n\t                                              // Last batch.\n\t                                              if (doValidation) {\n\t                                                var valOuts = model.testLoop(valF, valIns, batchSize); // Porting Notes: In tfjs-layers, valOuts is always an Array.\n\n\t                                                for (var _i = 0; _i < outLabels.length; ++_i) {\n\t                                                  var _label = outLabels[_i];\n\t                                                  var _out = valOuts[_i];\n\t                                                  keep(_out); // TODO(cais): Use scope() to avoid ownership.\n\n\t                                                  epochLogs['val_' + _label] = _out;\n\t                                                }\n\t                                              }\n\t                                            }\n\t                                          });\n\t                                          _context.next = 6;\n\t                                          return callbackList.onBatchEnd(batchIndex, batchLogs);\n\n\t                                        case 6:\n\t                                          disposeTensorsInLogs(batchLogs);\n\n\t                                          if (!model.stopTraining_) {\n\t                                            _context.next = 9;\n\t                                            break;\n\t                                          }\n\n\t                                          return _context.abrupt(\"return\", \"break\");\n\n\t                                        case 9:\n\t                                        case \"end\":\n\t                                          return _context.stop();\n\t                                      }\n\t                                    }\n\t                                  }, _loop2);\n\t                                });\n\t                                batchIndex = 0;\n\n\t                              case 9:\n\t                                if (!(batchIndex < batches.length)) {\n\t                                  _context2.next = 17;\n\t                                  break;\n\t                                }\n\n\t                                return _context2.delegateYield(_loop2(batchIndex), \"t0\", 11);\n\n\t                              case 11:\n\t                                _ret2 = _context2.t0;\n\n\t                                if (!(_ret2 === \"break\")) {\n\t                                  _context2.next = 14;\n\t                                  break;\n\t                                }\n\n\t                                return _context2.abrupt(\"break\", 17);\n\n\t                              case 14:\n\t                                ++batchIndex;\n\t                                _context2.next = 9;\n\t                                break;\n\n\t                              case 17:\n\t                                epochIndexArray1D.dispose();\n\n\t                              case 18:\n\t                              case \"end\":\n\t                                return _context2.stop();\n\t                            }\n\t                          }\n\t                        }, _callee);\n\t                      })(), \"t0\", 8);\n\n\t                    case 8:\n\t                      _context3.next = 10;\n\t                      return callbackList.onEpochEnd(epoch, epochLogs);\n\n\t                    case 10:\n\t                      if (!model.stopTraining_) {\n\t                        _context3.next = 12;\n\t                        break;\n\t                      }\n\n\t                      return _context3.abrupt(\"return\", \"break\");\n\n\t                    case 12:\n\t                    case \"end\":\n\t                      return _context3.stop();\n\t                  }\n\t                }\n\t              }, _loop);\n\t            });\n\t            epoch = initialEpoch;\n\n\t          case 21:\n\t            if (!(epoch < epochs)) {\n\t              _context4.next = 29;\n\t              break;\n\t            }\n\n\t            return _context4.delegateYield(_loop(epoch), \"t0\", 23);\n\n\t          case 23:\n\t            _ret = _context4.t0;\n\n\t            if (!(_ret === \"break\")) {\n\t              _context4.next = 26;\n\t              break;\n\t            }\n\n\t            return _context4.abrupt(\"break\", 29);\n\n\t          case 26:\n\t            ++epoch;\n\t            _context4.next = 21;\n\t            break;\n\n\t          case 29:\n\t            _context4.next = 31;\n\t            return callbackList.onTrainEnd();\n\n\t          case 31:\n\t            _context4.next = 33;\n\t            return model.history.syncData();\n\n\t          case 33:\n\t            return _context4.abrupt(\"return\", model.history);\n\n\t          case 34:\n\t          case \"end\":\n\t            return _context4.stop();\n\t        }\n\t      }\n\t    }, _callee2);\n\t  }));\n\t  return _fitLoop.apply(this, arguments);\n\t}\n\n\tfunction fitTensors(_x16, _x17, _x18, _x19) {\n\t  return _fitTensors.apply(this, arguments);\n\t}\n\t/**\n\t * Ensure tensors all have a rank of at least 2.\n\t *\n\t * If a tensor has a rank of 1, it is dimension-expanded to rank 2.\n\t * If any tensor has a rank of 0 (i.e., is a scalar), an error will be thrown.\n\t */\n\n\tfunction _fitTensors() {\n\t  _fitTensors = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3( // Type `model` as `any` here to avoid circular dependency w/ training.ts.\n\t  // tslint:disable-next-line:no-any\n\t  model, x, y, args) {\n\t    var inputs, targets, inputValX, inputValY, valX, valY, sampleWeights, batchSize, checkBatchAxis, standardizedOuts, doValidation, valIns, _checkBatchAxis, valStandardized, splitAt, originalBatchSize, ins, trainFunction, outLabels, valFunction, callbackMetrics, callbacks, out;\n\n\t    return regeneratorRuntime.wrap(function _callee3$(_context5) {\n\t      while (1) {\n\t        switch (_context5.prev = _context5.next) {\n\t          case 0:\n\t            if (args === void 0) {\n\t              args = {};\n\t            }\n\n\t            if (!model.isTraining) {\n\t              _context5.next = 3;\n\t              break;\n\t            }\n\n\t            throw new Error('Cannot start training because another fit() call is ongoing.');\n\n\t          case 3:\n\t            model.isTraining = true;\n\t            _context5.prev = 4;\n\t            batchSize = args.batchSize == null ? 32 : args.batchSize;\n\t            checkBatchSize(batchSize); // Validate user data.\n\t            // TODO(cais): Support sampleWeight.\n\n\t            checkBatchAxis = false;\n\t            _context5.next = 10;\n\t            return model.standardizeUserData(x, y, args.sampleWeight, args.classWeight, checkBatchAxis, batchSize);\n\n\t          case 10:\n\t            standardizedOuts = _context5.sent;\n\t            inputs = standardizedOuts[0];\n\t            targets = standardizedOuts[1];\n\t            sampleWeights = standardizedOuts[2]; // Prepare validation data.\n\n\t            doValidation = false;\n\n\t            if (!(args.validationData != null && args.validationData.length > 0)) {\n\t              _context5.next = 36;\n\t              break;\n\t            }\n\n\t            doValidation = true;\n\n\t            if (!(args.validationData.length === 2)) {\n\t              _context5.next = 22;\n\t              break;\n\t            }\n\n\t            // config.validationData consists of valX and valY.\n\t            inputValX = args.validationData[0];\n\t            inputValY = args.validationData[1];\n\t            _context5.next = 27;\n\t            break;\n\n\t          case 22:\n\t            if (!(args.validationData.length === 3)) {\n\t              _context5.next = 26;\n\t              break;\n\t            }\n\n\t            throw new NotImplementedError('validationData including sample weights is not supported yet.');\n\n\t          case 26:\n\t            throw new ValueError(\"When passing validation data, it must contain 2 (valX, valY) \" + \"or 3 (valX, valY, valSampleWeight) items; \" + (args.validationData + \" is invalid.\"));\n\n\t          case 27:\n\t            _checkBatchAxis = true;\n\t            _context5.next = 30;\n\t            return model.standardizeUserData(inputValX, inputValY, null,\n\t            /** Unused sample weights. */\n\t            null,\n\t            /** Unused class weights. */\n\t            _checkBatchAxis, batchSize);\n\n\t          case 30:\n\t            valStandardized = _context5.sent;\n\t            valX = valStandardized[0];\n\t            valY = valStandardized[1];\n\t            valIns = valX.concat(valY); // TODO(cais): Add useLearningPhase data properly.\n\n\t            _context5.next = 37;\n\t            break;\n\n\t          case 36:\n\t            if (args.validationSplit != null && args.validationSplit > 0 && args.validationSplit < 1) {\n\t              doValidation = true; // Porting Note: In tfjs-layers, inputs[0] is always a Tensor.\n\n\t              splitAt = Math.floor(inputs[0].shape[0] * (1 - args.validationSplit));\n\t              originalBatchSize = inputs[0].shape[0];\n\t              valX = sliceArrays(inputs, splitAt, originalBatchSize);\n\t              inputs = sliceArrays(inputs, 0, splitAt);\n\t              valY = sliceArrays(targets, splitAt, originalBatchSize);\n\t              targets = sliceArrays(targets, 0, splitAt); // TODO(cais): Once sampleWeights becomes available, slice it to get\n\t              //   valSampleWeights.\n\n\t              valIns = valX.concat(valY); // TODO(cais): Add useLearningPhase data properly.\n\t            } else if (args.validationSteps != null) {\n\t              doValidation = true; // TODO(cais): Add useLearningPhase.\n\t            }\n\n\t          case 37:\n\t            ins = inputs.concat(targets).concat(sampleWeights);\n\t            model.checkTrainableWeightsConsistency(); // TODO(cais): Handle use_learning_phase and learning_phase?\n\t            // Porting Note: Here we see a key deviation of tfjs-layers from\n\t            // Keras.\n\t            //  Due to the imperative nature of tfjs-layers' backend (tfjs-core),\n\t            //  we do not construct symbolic computation graphs to embody the\n\t            //  training process. Instead, we define a function that performs the\n\t            //  training action. In PyKeras, the data (inputs and targets) are fed\n\t            //  through graph placeholders. In tfjs-layers, the data are fed as\n\t            //  function arguments. Since the function are defined below in the\n\t            //  scope, we don't have equivalents of PyKeras's\n\t            //  `_make_train_funciton`.\n\n\t            trainFunction = model.makeTrainFunction();\n\t            outLabels = model.getDedupedMetricsNames();\n\n\t            if (doValidation) {\n\t              model.makeTestFunction();\n\t              valFunction = model.testFunction;\n\t              callbackMetrics = outLabels.slice().concat(outLabels.map(function (n) {\n\t                return 'val_' + n;\n\t              }));\n\t            } else {\n\t              valFunction = null;\n\t              valIns = [];\n\t              callbackMetrics = outLabels.slice();\n\t            }\n\n\t            callbacks = standardizeCallbacks(args.callbacks, args.yieldEvery);\n\t            _context5.next = 45;\n\t            return fitLoop(model, trainFunction, ins, outLabels, batchSize, args.epochs, args.verbose, callbacks, valFunction, valIns, args.shuffle, callbackMetrics, args.initialEpoch, null, null);\n\n\t          case 45:\n\t            out = _context5.sent;\n\t            return _context5.abrupt(\"return\", out);\n\n\t          case 47:\n\t            _context5.prev = 47;\n\t            model.isTraining = false; // Memory clean up.\n\n\t            disposeNewTensors(inputs, x);\n\t            disposeNewTensors(targets, y);\n\t            disposeNewTensors(valX, inputValX);\n\t            disposeNewTensors(valY, inputValY);\n\n\t            if (sampleWeights != null) {\n\t              dispose(sampleWeights);\n\t            }\n\n\t            return _context5.finish(47);\n\n\t          case 55:\n\t          case \"end\":\n\t            return _context5.stop();\n\t        }\n\t      }\n\t    }, _callee3, null, [[4,, 47, 55]]);\n\t  }));\n\t  return _fitTensors.apply(this, arguments);\n\t}\n\n\tfunction ensureTensorsRank2OrHigher(tensors) {\n\t  var outs = [];\n\n\t  if (tensors instanceof Tensor) {\n\t    tensors = [tensors];\n\t  } // Make Tensors at least 2D.\n\n\n\t  for (var i = 0; i < tensors.length; ++i) {\n\t    var tensor = tensors[i];\n\n\t    if (tensor.rank === 1) {\n\t      outs.push(expandDims$1(tensor, 1));\n\t    } else if (tensor.rank === 0) {\n\t      throw new Error('Expected tensor to be at least 1D, but received a 0D tensor ' + '(scalar).');\n\t    } else {\n\t      outs.push(tensor);\n\t    }\n\t  }\n\n\t  return outs;\n\t}\n\t/**\n\t * Compare a set of tensors with a reference (old) set, discard the ones\n\t * in the new set that are not present in the reference set.\n\t *\n\t * This method is used for memory clenaup during calls such as\n\t * LayersModel.fit().\n\t *\n\t * @param tensors New set which may contain Tensors not present in\n\t *   `refTensors`.\n\t * @param refTensors Reference Tensor set.\n\t */\n\t// TODO(cais, kangyizhang): Deduplicate with tfjs-data.\n\n\tfunction disposeNewTensors(tensors, refTensors) {\n\t  if (tensors == null) {\n\t    return;\n\t  }\n\n\t  var oldTensorIds = [];\n\n\t  if (refTensors instanceof Tensor) {\n\t    oldTensorIds.push(refTensors.id);\n\t  } else if (Array.isArray(refTensors)) {\n\t    refTensors.forEach(function (t) {\n\t      return oldTensorIds.push(t.id);\n\t    });\n\t  } else if (refTensors != null) {\n\t    // `oldTensors` is a map from string name to Tensor.\n\t    for (var name in refTensors) {\n\t      var oldTensor = refTensors[name];\n\t      oldTensorIds.push(oldTensor.id);\n\t    }\n\t  }\n\n\t  var tensorsToDispose = [];\n\n\t  if (tensors instanceof Tensor) {\n\t    if (oldTensorIds.indexOf(tensors.id) === -1) {\n\t      tensorsToDispose.push(tensors);\n\t    }\n\t  } else if (Array.isArray(tensors)) {\n\t    tensors.forEach(function (t) {\n\t      if (oldTensorIds.indexOf(t.id) === -1) {\n\t        tensorsToDispose.push(t);\n\t      }\n\t    });\n\t  } else if (tensors != null) {\n\t    // `oldTensors` is a map from string name to Tensor.\n\t    for (var _name in tensors) {\n\t      var tensor = tensors[_name];\n\n\t      if (oldTensorIds.indexOf(tensor.id) === -1) {\n\t        tensorsToDispose.push(tensor);\n\t      }\n\t    }\n\t  }\n\n\t  tensorsToDispose.forEach(function (t) {\n\t    if (!t.isDisposed) {\n\t      t.dispose();\n\t    }\n\t  });\n\t}\n\n\t/**\n\t * Helper function for polymorphic input data: 1. singleton Tensor.\n\t */\n\n\tfunction isDataTensor(x) {\n\t  return x instanceof Tensor;\n\t}\n\t/**\n\t * Helper function for polymorphic input data: 2. Array of Tensor.\n\t */\n\n\tfunction isDataArray(x) {\n\t  return Array.isArray(x);\n\t}\n\t/**\n\t * Helper function for polymorphic input data: 3. \"dict\" of Tensor.\n\t */\n\n\tfunction isDataDict(x) {\n\t  return !isDataTensor(x) && !isDataArray(x);\n\t}\n\t/**\n\t * Normalizes inputs and targets provided by users.\n\t * @param data User-provided input data (polymorphic).\n\t * @param names An Array of expected Tensor names.\n\t * @param shapes Optional Array of expected Tensor shapes.\n\t * @param checkBatchAxis Whether to check that the batch axis of the arrays\n\t *   match  the expected value found in `shapes`.\n\t * @param exceptionPrefix String prefix used for exception formatting.\n\t * @returns List of standardized input Tensors (one Tensor per model input).\n\t * @throws ValueError: in case of improperly formatted user data.\n\t */\n\n\tfunction standardizeInputData(data, names, shapes, checkBatchAxis, exceptionPrefix) {\n\t  if (checkBatchAxis === void 0) {\n\t    checkBatchAxis = true;\n\t  }\n\n\t  if (exceptionPrefix === void 0) {\n\t    exceptionPrefix = '';\n\t  }\n\n\t  if (names == null || names.length === 0) {\n\t    // Check for the case where the model expected no data, but some data got\n\t    // sent.\n\t    if (data != null) {\n\t      var gotUnexpectedData = false;\n\n\t      if (isDataArray(data) && data.length > 0) {\n\t        gotUnexpectedData = true;\n\t      } else if (isDataDict(data)) {\n\t        for (var key in data) {\n\t          if (data.hasOwnProperty(key)) {\n\t            gotUnexpectedData = true;\n\t            break;\n\t          }\n\t        }\n\t      } else {\n\t        // `data` is a singleton Tensor in this case.\n\t        gotUnexpectedData = true;\n\t      }\n\n\t      if (gotUnexpectedData) {\n\t        throw new ValueError(\"Error when checking model \" + exceptionPrefix + \" expected no data, \" + (\"but got \" + data));\n\t      }\n\t    }\n\n\t    return [];\n\t  }\n\n\t  if (data == null) {\n\t    return names.map(function (name) {\n\t      return null;\n\t    });\n\t  }\n\n\t  var arrays;\n\n\t  if (isDataDict(data)) {\n\t    data = data;\n\t    arrays = [];\n\n\t    for (var _iterator = _createForOfIteratorHelperLoose(names), _step; !(_step = _iterator()).done;) {\n\t      var name = _step.value;\n\n\t      if (data[name] == null) {\n\t        throw new ValueError(\"No data provided for \\\"\" + name + \"\\\". Need data for each key in: \" + (\"\" + names));\n\t      }\n\n\t      arrays.push(data[name]);\n\t    }\n\t  } else if (isDataArray(data)) {\n\t    data = data;\n\n\t    if (data.length !== names.length) {\n\t      throw new ValueError(\"Error when checking model \" + exceptionPrefix + \": the Array of \" + \"Tensors that you are passing to your model is not the size the \" + (\"model expected. Expected to see \" + names.length + \" Tensor(s), but \") + (\"instead got the following list of Tensor(s): \" + data));\n\t    }\n\n\t    arrays = data;\n\t  } else {\n\t    data = data;\n\n\t    if (names.length > 1) {\n\t      throw new ValueError(\"The model \" + exceptionPrefix + \" expects \" + names.length + \" Tensor(s), \" + (\"but only received one Tensor. Found: Tensor with shape \" + data.shape));\n\t    }\n\n\t    arrays = [data];\n\t  }\n\n\t  arrays = ensureTensorsRank2OrHigher(arrays); // Check shape compatibility.\n\n\t  if (shapes != null) {\n\t    for (var i = 0; i < names.length; ++i) {\n\t      if (shapes[i] == null) {\n\t        continue;\n\t      }\n\n\t      var array = arrays[i];\n\n\t      if (array.shape.length !== shapes[i].length) {\n\t        throw new ValueError(\"Error when checking \" + exceptionPrefix + \": expected \" + names[i] + \" \" + (\"to have \" + shapes[i].length + \" dimension(s). but got array with \") + (\"shape \" + array.shape));\n\t      }\n\n\t      for (var j = 0; j < shapes[i].length; ++j) {\n\t        if (j === 0 && !checkBatchAxis) {\n\t          // Skip the first (batch) axis.\n\t          continue;\n\t        }\n\n\t        var dim = array.shape[j];\n\t        var refDim = shapes[i][j];\n\n\t        if (refDim != null && refDim >= 0 && dim !== refDim) {\n\t          throw new ValueError(\"Error when checking \" + exceptionPrefix + \": expected \" + names[i] + \" \" + (\"to have shape [\" + shapes[i] + \"], but got array with shape \") + (\"[\" + array.shape + \"].\"));\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return arrays;\n\t}\n\t/**\n\t * User input validation for Tensors.\n\t * @param inputs `Array` of `tf.Tensor`s for inputs.\n\t * @param targets `Array` of `tf.Tensor`s for targets.\n\t * @param weights Optional `Array` of `tf.Tensor`s for sample weights.\n\t * @throws ValueError: in case of incorrectly formatted data.\n\t */\n\n\tfunction checkArrayLengths(inputs, targets, weights) {\n\t  var setX = unique$1(inputs.map(function (input) {\n\t    return input.shape[0];\n\t  }));\n\t  setX.sort();\n\t  var setY = unique$1(targets.map(function (target) {\n\t    return target.shape[0];\n\t  }));\n\t  setY.sort(); // TODO(cais): Check `weights` as well.\n\n\t  if (setX.length > 1) {\n\t    throw new ValueError(\"All input Tensors (x) should have the same number of samples. \" + \"Got array shapes: \" + (\"\" + JSON.stringify(inputs.map(function (input) {\n\t      return input.shape;\n\t    }))));\n\t  }\n\n\t  if (setY.length > 1) {\n\t    throw new ValueError(\"All target Tensors (y) should have the same number of samples. \" + \"Got array shapes: \" + (\"\" + JSON.stringify(targets.map(function (target) {\n\t      return target.shape;\n\t    }))));\n\t  }\n\n\t  if (setX.length > 0 && setY.length > 0 && !arraysEqual(setX, setY)) {\n\t    throw new ValueError(\"Input Tensors should have the same number of samples as target \" + (\"Tensors. Found \" + setX[0] + \" input sample(s) and \" + setY[0] + \" target \") + \"sample(s).\");\n\t  }\n\t}\n\t/**\n\t * Validation on the compatibility of targes and loss functions.\n\t *\n\t * This helps prevent users from using loss functions incorrectly.\n\t *\n\t * @param targets `Array` of `tf.Tensor`s of targets.\n\t * @param lossFns `Array` of loss functions.\n\t * @param outputShapes `Array` of shapes of model outputs.\n\t */\n\n\tfunction checkLossAndTargetCompatibility(targets, lossFns, outputShapes) {\n\t  // TODO(cais): Dedicated test coverage?\n\t  var keyLosses = [meanSquaredError$1, binaryCrossentropy, categoricalCrossentropy];\n\n\t  for (var i = 0; i < targets.length; ++i) {\n\t    var y = targets[i];\n\t    var loss = lossFns[i];\n\t    var shape = outputShapes[i];\n\n\t    if (loss == null) {\n\t      continue;\n\t    }\n\n\t    if (loss === categoricalCrossentropy) {\n\t      if (y.shape[y.shape.length - 1] === 1) {\n\t        throw new ValueError(\"You are passing a target array of shape \" + y.shape + \" while using \" + \"a loss 'categorical_crossentropy'. 'categorical_crossentropy'\" + \"expects targets to be binary matrices (1s and 0s) of shape \" + \"[samples, classes].\"); // TODO(cais): Example code in error message.\n\t      }\n\t    }\n\n\t    if (keyLosses.indexOf(loss) !== -1) {\n\t      var slicedYShape = y.shape.slice(1);\n\t      var slicedShape = shape.slice(1);\n\n\t      for (var j = 0; j < slicedYShape.length; ++j) {\n\t        var targetDim = slicedYShape[j];\n\t        var outDim = slicedShape[j];\n\n\t        if (outDim != null && targetDim !== outDim) {\n\t          throw new ValueError(\"A target Tensor with shape \" + y.shape + \" was passed for an \" + (\"output of shape \" + shape + \", while using a loss function that \") + \"expects targets to have the same shape as the output.\");\n\t        }\n\t      }\n\t    }\n\t  }\n\t}\n\t/**\n\t * Check inputs provided by the user.\n\t *\n\t * Porting Note: This corresponds to _standardize_input_data() in Python\n\t *   Keras. Because of the strong typing in TF.js, we do not need to convert\n\t *   the data. Specifically:\n\t *   1) in PyKeras, `data` can be `DataFrame` instances from pandas, for\n\t *      example. We don't need to worry about that here because there is no\n\t *      widely popular javascript/typesdcript equivalent of pandas (so far).\n\t *      If one becomes available in the future, we can add support.\n\t *   2) in PyKeras, inputs can be Python dict. But here we are stipulating\n\t * that the data is either a single `tf.Tensor` or an Array of `tf.Tensor`s. We\n\t * may add support for `Object` data inputs in the future when the need\n\t * arises.\n\t *\n\t * Instead, we perform basic checks for number of parameters and shapes.\n\t *\n\t * @param data: The input data.\n\t * @param names: Name for the inputs, from the model.\n\t * @param shapes: Expected shapes for the input data, from the model.\n\t * @param checkBatchAxis: Whether the size along the batch axis (i.e., the\n\t *   first dimension) will be checked for matching.\n\t * @param exceptionPrefix: Execption prefix message, used in generating error\n\t *   messages.\n\t * @throws ValueError: on incorrect number of inputs or mismatches in shapes.\n\t */\n\n\n\tfunction checkInputData(data, names, shapes, checkBatchAxis, exceptionPrefix) {\n\t  if (checkBatchAxis === void 0) {\n\t    checkBatchAxis = true;\n\t  }\n\n\t  if (exceptionPrefix === void 0) {\n\t    exceptionPrefix = '';\n\t  }\n\n\t  var arrays;\n\n\t  if (Array.isArray(data)) {\n\t    if (data.length !== names.length) {\n\t      throw new ValueError(\"Error when checking model \" + exceptionPrefix + \": the Array of \" + \"Tensors that you are passing to your model is not the size the \" + (\"the model expected. Expected to see \" + names.length + \" Tensor(s),\") + (\" but instead got \" + data.length + \" Tensors(s).\"));\n\t    }\n\n\t    arrays = data;\n\t  } else {\n\t    if (names.length > 1) {\n\t      throw new ValueError(\"The model expects \" + names.length + \" \" + exceptionPrefix + \" Tensors, \" + \"but only received one Tensor. Found: array with shape \" + (JSON.stringify(data.shape) + \".\"));\n\t    }\n\n\t    arrays = [data];\n\t  }\n\n\t  if (shapes != null) {\n\t    for (var i = 0; i < names.length; ++i) {\n\t      if (shapes[i] == null) {\n\t        continue;\n\t      }\n\n\t      var array = arrays[i];\n\n\t      if (array.shape.length !== shapes[i].length) {\n\t        throw new ValueError(\"Error when checking \" + exceptionPrefix + \": expected \" + names[i] + \" \" + (\"to have \" + shapes[i].length + \" dimension(s), but got array with \") + (\"shape \" + JSON.stringify(array.shape)));\n\t      }\n\n\t      for (var j = 0; j < shapes[i].length; ++j) {\n\t        if (j === 0 && !checkBatchAxis) {\n\t          continue;\n\t        }\n\n\t        var dim = array.shape[j];\n\t        var refDim = shapes[i][j];\n\n\t        if (refDim != null) {\n\t          if (refDim !== dim) {\n\t            throw new ValueError(\"Error when checking \" + exceptionPrefix + \": expected \" + (names[i] + \" to have shape \" + JSON.stringify(shapes[i]) + \" but \") + (\"got array with shape \" + JSON.stringify(array.shape) + \".\"));\n\t          }\n\t        }\n\t      }\n\t    }\n\t  }\n\t}\n\t/**\n\t * Maps metric functions to model outputs.\n\t * @param metrics An shortcut strings name, metric function, `Array` or dict\n\t *   (`Object`) of metric functions.\n\t * @param outputNames An `Array` of the names of model outputs.\n\t * @returns An `Array` (one entry per model output) of `Array` of metric\n\t *   functions. For instance, if the model has 2 outputs, and for the first\n\t *   output we want to compute `binaryAccuracy` and `binaryCrossentropy`,\n\t *   and just `binaryAccuracy` for the second output, the `Array` would look\n\t *   like:\n\t *     `[[binaryAccuracy, binaryCrossentropy],  [binaryAccuracy]]`\n\t * @throws TypeError: incompatible metrics format.\n\t */\n\n\n\tfunction collectMetrics(metrics, outputNames) {\n\t  if (metrics == null || Array.isArray(metrics) && metrics.length === 0) {\n\t    return outputNames.map(function (name) {\n\t      return [];\n\t    });\n\t  }\n\n\t  var wrappedMetrics;\n\n\t  if (typeof metrics === 'string' || typeof metrics === 'function') {\n\t    wrappedMetrics = [metrics];\n\t  } else if (Array.isArray(metrics) || typeof metrics === 'object') {\n\t    wrappedMetrics = metrics;\n\t  } else {\n\t    throw new TypeError('Type of metrics argument not understood. Expected an string,' + (\"function, Array, or Object, found: \" + metrics));\n\t  }\n\n\t  if (Array.isArray(wrappedMetrics)) {\n\t    // We then apply all metrics to all outputs.\n\t    return outputNames.map(function (name) {\n\t      return wrappedMetrics;\n\t    });\n\t  } else {\n\t    // In this case, metrics is a dict.\n\t    var nestedMetrics = [];\n\n\t    for (var _iterator2 = _createForOfIteratorHelperLoose(outputNames), _step2; !(_step2 = _iterator2()).done;) {\n\t      var name = _step2.value;\n\t      var outputMetrics = wrappedMetrics.hasOwnProperty(name) ? wrappedMetrics[name] : [];\n\n\t      if (!Array.isArray(outputMetrics)) {\n\t        outputMetrics = [outputMetrics];\n\t      }\n\n\t      nestedMetrics.push(outputMetrics);\n\t    }\n\n\t    return nestedMetrics;\n\t  }\n\t}\n\tvar LAYERS_MODEL_FORMAT_NAME = 'layers-model';\n\t/**\n\t * A `tf.LayersModel` is a directed, acyclic graph of `tf.Layer`s plus methods\n\t * for training, evaluation, prediction and saving.\n\t *\n\t * `tf.LayersModel` is the basic unit of training, inference and evaluation in\n\t * TensorFlow.js. To create a `tf.LayersModel`, use `tf.LayersModel`.\n\t *\n\t * See also:\n\t *   `tf.Sequential`, `tf.loadLayersModel`.\n\t *\n\t * @doc {heading: 'Models', subheading: 'Classes'}\n\t */\n\n\tvar LayersModel = /*#__PURE__*/function (_Container) {\n\t  _inheritsLoose(LayersModel, _Container);\n\n\t  function LayersModel(args) {\n\t    var _this;\n\n\t    _this = _Container.call(this, args) || this;\n\t    _this.isTraining = false;\n\t    return _this;\n\t  }\n\t  /**\n\t   * Print a text summary of the model's layers.\n\t   *\n\t   * The summary includes\n\t   * - Name and type of all layers that comprise the model.\n\t   * - Output shape(s) of the layers\n\t   * - Number of weight parameters of each layer\n\t   * - If the model has non-sequential-like topology, the inputs each layer\n\t   *   receives\n\t   * - The total number of trainable and non-trainable parameters of the model.\n\t   *\n\t   * ```js\n\t   * const input1 = tf.input({shape: [10]});\n\t   * const input2 = tf.input({shape: [20]});\n\t   * const dense1 = tf.layers.dense({units: 4}).apply(input1);\n\t   * const dense2 = tf.layers.dense({units: 8}).apply(input2);\n\t   * const concat = tf.layers.concatenate().apply([dense1, dense2]);\n\t   * const output =\n\t   *     tf.layers.dense({units: 3, activation: 'softmax'}).apply(concat);\n\t   *\n\t   * const model = tf.model({inputs: [input1, input2], outputs: output});\n\t   * model.summary();\n\t   * ```\n\t   *\n\t   * @param lineLength Custom line length, in number of characters.\n\t   * @param positions Custom widths of each of the columns, as either\n\t   *   fractions of `lineLength` (e.g., `[0.5, 0.75, 1]`) or absolute number\n\t   *   of characters (e.g., `[30, 50, 65]`). Each number corresponds to\n\t   *   right-most (i.e., ending) position of a column.\n\t   * @param printFn Custom print function. Can be used to replace the default\n\t   *   `console.log`. For example, you can use `x => {}` to mute the printed\n\t   *   messages in the console.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes'}\n\t   */\n\n\n\t  var _proto = LayersModel.prototype;\n\n\t  _proto.summary = function summary(lineLength, positions, printFn) {\n\t    if (printFn === void 0) {\n\t      printFn = console.log;\n\t    }\n\n\t    if (!this.built) {\n\t      throw new ValueError(\"This model has never been called, thus its weights have not been \" + \"created yet. So no summary can be displayed. Build the model \" + \"first (e.g., by calling it on some test data).\");\n\t    }\n\n\t    printSummary(this, lineLength, positions, printFn);\n\t  }\n\t  /**\n\t   * Configures and prepares the model for training and evaluation.  Compiling\n\t   * outfits the model with an optimizer, loss, and/or metrics.  Calling `fit`\n\t   * or `evaluate` on an un-compiled model will throw an error.\n\t   *\n\t   * @param args a `ModelCompileArgs` specifying the loss, optimizer, and\n\t   * metrics to be used for fitting and evaluating this model.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.compile = function compile(args) {\n\t    var _this2 = this;\n\n\t    if (args.loss == null) {\n\t      args.loss = [];\n\t    }\n\n\t    this.loss = args.loss;\n\n\t    if (typeof args.optimizer === 'string') {\n\t      this.optimizer_ = getOptimizer(args.optimizer);\n\t      this.isOptimizerOwned = true;\n\t    } else {\n\t      if (!(args.optimizer instanceof Optimizer)) {\n\t        throw new ValueError(\"User-defined optimizer must be an instance of tf.Optimizer.\");\n\t      }\n\n\t      this.optimizer_ = args.optimizer;\n\t      this.isOptimizerOwned = false;\n\t    } // TODO(cais): Add lossWeights.\n\t    // TODO(cais): Add sampleWeightMode.\n\t    // Prepare loss functions.\n\n\n\t    var lossFunctions = [];\n\n\t    if (!Array.isArray(args.loss) && typeof args.loss !== 'string' && typeof args.loss !== 'function') {\n\t      args.loss = args.loss;\n\n\t      for (var name in args.loss) {\n\t        if (this.outputNames.indexOf(name) === -1) {\n\t          throw new ValueError(\"Unknown entry in loss dictionary: \\\"\" + name + \"\\\". \" + (\"Only expected the following keys: \" + this.outputNames));\n\t        }\n\t      }\n\n\t      for (var _iterator3 = _createForOfIteratorHelperLoose(this.outputNames), _step3; !(_step3 = _iterator3()).done;) {\n\t        var _name = _step3.value;\n\n\t        if (args.loss[_name] == null) {\n\t          console.warn(\"Output \\\"\" + _name + \"\\\" is missing from loss dictionary. We assume \" + \"this was done on purpose, and we will not be expecting data \" + (\"to be passed to \" + _name + \" during training\"));\n\t        }\n\n\t        lossFunctions.push(get$3(args.loss[_name]));\n\t      }\n\t    } else if (Array.isArray(args.loss)) {\n\t      if (args.loss.length !== this.outputs.length) {\n\t        throw new ValueError(\"When passing an Array as loss, it should have one entry per \" + (\"model output. The model has \" + this.outputs.length + \" output(s), \") + (\"but you passed loss=\" + args.loss + \".\"));\n\t      }\n\n\t      var theLosses = args.loss;\n\t      lossFunctions = theLosses.map(function (l) {\n\t        return get$3(l);\n\t      });\n\t    } else {\n\t      var lossFunction = get$3(args.loss);\n\t      this.outputs.forEach(function (_) {\n\t        lossFunctions.push(lossFunction);\n\t      });\n\t    }\n\n\t    this.lossFunctions = lossFunctions;\n\t    this.feedOutputNames = [];\n\t    this.feedOutputShapes = [];\n\t    this.feedLossFns = [];\n\n\t    for (var i = 0; i < this.outputs.length; ++i) {\n\t      // TODO(cais): Logic for skipping target(s).\n\t      var shape = this.internalOutputShapes[i];\n\t      var _name2 = this.outputNames[i];\n\t      this.feedOutputNames.push(_name2);\n\t      this.feedOutputShapes.push(shape);\n\t      this.feedLossFns.push(this.lossFunctions[i]);\n\t    } // TODO(cais): Add logic for output masks.\n\t    // TODO(cais): Add logic for sample weights.\n\n\n\t    var skipTargetIndices = []; // Prepare metrics.\n\n\t    this.metrics = args.metrics; // TODO(cais): Add weightedMetrics.\n\n\t    this.metricsNames = ['loss'];\n\t    this.metricsTensors = []; // Compute total loss.\n\t    // Porting Note: In PyKeras, metrics_tensors are symbolic tensor objects.\n\t    //   Here, metricsTensors are TypeScript functions. This difference is due\n\t    //   to the difference in symbolic/imperative property of the backends.\n\n\t    nameScope('loss', function () {\n\t      for (var _i = 0; _i < _this2.outputs.length; ++_i) {\n\t        if (skipTargetIndices.indexOf(_i) !== -1) {\n\t          continue;\n\t        } // TODO(cais): Add weightedLoss, sampleWeight and mask.\n\t        //   The following line should be weightedLoss\n\n\n\t        var weightedLoss = _this2.lossFunctions[_i];\n\n\t        if (_this2.outputs.length > 1) {\n\t          _this2.metricsTensors.push([weightedLoss, _i]);\n\n\t          _this2.metricsNames.push(_this2.outputNames[_i] + '_loss');\n\t        }\n\t      } // Porting Note: Due to the imperative nature of the backend, we calculate\n\t      //   the regularizer penalties in the totalLossFunction, instead of here.\n\n\t    });\n\t    var nestedMetrics = collectMetrics(args.metrics, this.outputNames); // TODO(cais): Add nestedWeightedMetrics.\n\n\t    /**\n\t     * Helper function used in loop below.\n\t     */\n\n\t    var appendMetric = function appendMetric(outputIndex, metricName, metricTensor) {\n\t      if (_this2.outputNames.length > 1) {\n\t        metricName = _this2.outputNames[outputIndex] + '_' + metricName;\n\t      }\n\n\t      _this2.metricsNames.push(metricName);\n\n\t      _this2.metricsTensors.push([metricTensor, outputIndex]);\n\t    };\n\n\t    nameScope('metric', function () {\n\t      var _loop = function _loop(_i2) {\n\t        if (skipTargetIndices.indexOf(_i2) !== -1) {\n\t          return \"continue\";\n\t        }\n\n\t        var outputMetrics = nestedMetrics[_i2]; // TODO(cais): Add weights and outputWeightedMetrics.\n\t        // TODO(cais): Add optional arg `weights` to the following function.\n\n\t        var handleMetrics = function handleMetrics(metrics) {\n\t          var metricNamePrefix = '';\n\t          var metricName;\n\t          var accFn;\n\t          var weightedMetricFn; //  TODO(cais): Use 'weights_' for weighted metrics.\n\n\t          for (var _iterator4 = _createForOfIteratorHelperLoose(metrics), _step4; !(_step4 = _iterator4()).done;) {\n\t            var metric = _step4.value;\n\n\t            if (typeof metric === 'string' && ['accuracy', 'acc', 'crossentropy', 'ce'].indexOf(metric) !== -1) {\n\t              var outputShape = _this2.internalOutputShapes[_i2];\n\n\t              if (outputShape[outputShape.length - 1] === 1 || _this2.lossFunctions[_i2] === binaryCrossentropy) {\n\t                // case: binary accuracy/crossentropy.\n\t                if (['accuracy', 'acc'].indexOf(metric) !== -1) {\n\t                  accFn = binaryAccuracy;\n\t                } else if (['crossentropy', 'ce'].indexOf(metric) !== -1) {\n\t                  accFn = binaryCrossentropy$1;\n\t                }\n\t              } else if (_this2.lossFunctions[_i2] === sparseCategoricalCrossentropy) {\n\t                // case: categorical accuracy / crossentropy with sparse\n\t                // targets.\n\t                if (['accuracy', 'acc'].indexOf(metric) !== -1) {\n\t                  accFn = sparseCategoricalAccuracy;\n\t                } else if (['crossentropy', 'ce'].indexOf(metric) !== -1) {\n\t                  accFn = sparseCategoricalCrossentropy$1;\n\t                }\n\t              } else {\n\t                // case: categorical accuracy / crossentropy.\n\t                if (['accuracy', 'acc'].indexOf(metric) !== -1) {\n\t                  accFn = categoricalAccuracy;\n\t                } else if (['crossentropy', 'ce'].indexOf(metric) !== -1) {\n\t                  accFn = categoricalCrossentropy$1;\n\t                }\n\t              }\n\n\t              var suffix = void 0;\n\n\t              if (['accuracy', 'acc'].indexOf(metric) !== -1) {\n\t                suffix = 'acc';\n\t              } else if (['crossentropy', 'ce'].indexOf(metric) !== -1) {\n\t                suffix = 'ce';\n\t              } // TODO(cais): Add weighting actually.\n\n\n\t              weightedMetricFn = accFn;\n\t              metricName = metricNamePrefix + suffix;\n\t            } else {\n\t              var metricFn = get$4(metric); // TODO(cais): Add weighting actually.\n\n\t              weightedMetricFn = metricFn;\n\t              metricName = metricNamePrefix + getLossOrMetricName(metric);\n\t            } // TODO(cais): Add weighting and masking to metricResult.\n\n\n\t            var metricResult = void 0;\n\t            nameScope(metricName, function () {\n\t              metricResult = weightedMetricFn;\n\t            });\n\t            appendMetric(_i2, metricName, metricResult);\n\t          }\n\t        };\n\n\t        handleMetrics(outputMetrics); // TODO(cais): Call handleMetrics with weights.\n\t      };\n\n\t      for (var _i2 = 0; _i2 < _this2.outputs.length; ++_i2) {\n\t        var _ret = _loop(_i2);\n\n\t        if (_ret === \"continue\") continue;\n\t      }\n\t    }); // Porting Notes: Given the imperative backend of tfjs-core,\n\t    //   there is no need for constructing the symbolic graph and placeholders.\n\n\t    this.collectedTrainableWeights = this.trainableWeights;\n\t  }\n\t  /**\n\t   * Check trainable weights count consistency.\n\t   *\n\t   * This will raise a warning if `this.trainableWeights` and\n\t   * `this.collectedTrainableWeights` are inconsistent (i.e., have different\n\t   * numbers of parameters).\n\t   * Inconsistency will typically arise when one modifies `model.trainable`\n\t   * without calling `model.compile()` again.\n\t   */\n\t  ;\n\n\t  _proto.checkTrainableWeightsConsistency = function checkTrainableWeightsConsistency() {\n\t    if (this.collectedTrainableWeights == null) {\n\t      return;\n\t    }\n\n\t    if (this.trainableWeights.length !== this.collectedTrainableWeights.length) {\n\t      console.warn('Discrepancy between trainableweights and collected trainable ' + 'weights. Did you set `model.trainable` without calling ' + '`model.compile()` afterwards?');\n\t    }\n\t  }\n\t  /**\n\t   * Returns the loss value & metrics values for the model in test mode.\n\t   *\n\t   * Loss and metrics are specified during `compile()`, which needs to happen\n\t   * before calls to `evaluate()`.\n\t   *\n\t   * Computation is done in batches.\n\t   *\n\t   * ```js\n\t   * const model = tf.sequential({\n\t   *   layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n\t   * });\n\t   * model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});\n\t   * const result = model.evaluate(\n\t   *     tf.ones([8, 10]), tf.ones([8, 1]), {batchSize: 4});\n\t   * result.print();\n\t   * ```\n\t   *\n\t   * @param x `tf.Tensor` of test data, or an `Array` of `tf.Tensor`s if the\n\t   * model has multiple inputs.\n\t   * @param y `tf.Tensor` of target data, or an `Array` of `tf.Tensor`s if the\n\t   * model has multiple outputs.\n\t   * @param args A `ModelEvaluateArgs`, containing optional fields.\n\t   *\n\t   * @return `Scalar` test loss (if the model has a single output and no\n\t   *   metrics) or `Array` of `Scalar`s (if the model has multiple outputs\n\t   *   and/or metrics). The attribute `model.metricsNames`\n\t   *   will give you the display labels for the scalar outputs.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.evaluate = function evaluate(x, y, args) {\n\t    if (args === void 0) {\n\t      args = {};\n\t    }\n\n\t    var batchSize = args.batchSize == null ? 32 : args.batchSize;\n\t    checkBatchSize(batchSize); // TODO(cais): Standardize `config.sampleWeights` as well.\n\t    // Validate user data.\n\n\t    var checkBatchAxis = true;\n\t    var standardizedOuts = this.standardizeUserDataXY(x, y, checkBatchAxis, batchSize);\n\n\t    try {\n\t      // TODO(cais): If uses `useLearningPhase`, set the corresponding element\n\t      // of the input to 0.\n\t      var ins = standardizedOuts[0].concat(standardizedOuts[1]);\n\t      this.makeTestFunction();\n\t      var f = this.testFunction;\n\t      var testOuts = this.testLoop(f, ins, batchSize, args.verbose, args.steps);\n\t      return singletonOrArray(testOuts);\n\t    } finally {\n\t      disposeNewTensors(standardizedOuts[0], x);\n\t      disposeNewTensors(standardizedOuts[1], y);\n\t    }\n\t  } // TODO(cais): Add code snippet below once real dataset objects are\n\t  //   available.\n\n\t  /**\n\t   * Evaluate model using a dataset object.\n\t   *\n\t   * Note: Unlike `evaluate()`, this method is asynchronous (`async`);\n\t   *\n\t   * @param dataset A dataset object. Its `iterator()` method is expected\n\t   *   to generate a dataset iterator object, the `next()` method of which\n\t   *   is expected to produce data batches for evaluation. The return value\n\t   *   of the `next()` call ought to contain a boolean `done` field and a\n\t   *   `value` field. The `value` field is expected to be an array of two\n\t   *   `tf.Tensor`s or an array of two nested `tf.Tensor` structures. The former\n\t   *   case is for models with exactly one input and one output (e.g..\n\t   *   a sequential model). The latter case is for models with multiple\n\t   *   inputs and/or multiple outputs. Of the two items in the array, the\n\t   *   first is the input feature(s) and the second is the output target(s).\n\t   * @param args A configuration object for the dataset-based evaluation.\n\t   * @returns Loss and metric values as an Array of `Scalar` objects.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.evaluateDataset =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _evaluateDataset2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(dataset, args) {\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              this.makeTestFunction();\n\t              return _context.abrupt(\"return\", evaluateDataset(this, dataset, args));\n\n\t            case 2:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function evaluateDataset$1(_x, _x2) {\n\t      return _evaluateDataset2.apply(this, arguments);\n\t    }\n\n\t    return evaluateDataset$1;\n\t  }()\n\t  /**\n\t   * Get number of samples provided for training, evaluation or prediction.\n\t   *\n\t   * @param ins Input `tf.Tensor`.\n\t   * @param batchSize Integer batch size, optional.\n\t   * @param steps Total number of steps (batches of samples) before\n\t   * declaring loop finished. Optional.\n\t   * @param stepsName The public API's parameter name for `steps`.\n\t   * @returns Number of samples provided.\n\t   */\n\t  ;\n\n\t  _proto.checkNumSamples = function checkNumSamples(ins, batchSize, steps, stepsName) {\n\t    if (stepsName === void 0) {\n\t      stepsName = 'steps';\n\t    }\n\n\t    var numSamples;\n\n\t    if (steps != null) {\n\t      numSamples = null;\n\n\t      if (batchSize != null) {\n\t        throw new ValueError(\"If \" + stepsName + \" is set, batchSize must be null or undefined.\" + (\"Got batchSize = \" + batchSize));\n\t      }\n\t    } else if (ins != null) {\n\t      if (Array.isArray(ins)) {\n\t        numSamples = ins[0].shape[0];\n\t      } else {\n\t        numSamples = ins.shape[0];\n\t      }\n\t    } else {\n\t      throw new ValueError(\"Either the input data should have a defined shape, or \" + (stepsName + \" shoud be specified.\"));\n\t    }\n\n\t    return numSamples;\n\t  }\n\t  /**\n\t   * Execute internal tensors of the model with input data feed.\n\t   * @param inputs Input data feed. Must match the inputs of the model.\n\t   * @param outputs Names of the output tensors to be fetched. Must match\n\t   *   names of the SymbolicTensors that belong to the graph.\n\t   * @returns Fetched values for `outputs`.\n\t   */\n\t  ;\n\n\t  _proto.execute = function execute$1(inputs, outputs) {\n\t    if (Array.isArray(outputs) && outputs.length === 0) {\n\t      throw new ValueError('`outputs` is an empty Array, which is not allowed.');\n\t    }\n\n\t    var outputsIsArray = Array.isArray(outputs);\n\t    var outputNames = outputsIsArray ? outputs : [outputs];\n\t    var outputSymbolicTensors = this.retrieveSymbolicTensors(outputNames); // Format the input into a FeedDict.\n\n\t    var feedDict = new FeedDict();\n\n\t    if (inputs instanceof Tensor) {\n\t      inputs = [inputs];\n\t    }\n\n\t    if (Array.isArray(inputs)) {\n\t      if (inputs.length !== this.inputs.length) {\n\t        throw new ValueError(\"The number of inputs provided (\" + inputs.length + \") \" + \"does not match the number of inputs of this model \" + (\"(\" + this.inputs.length + \").\"));\n\t      }\n\n\t      for (var i = 0; i < this.inputs.length; ++i) {\n\t        feedDict.add(this.inputs[i], inputs[i]);\n\t      }\n\t    } else {\n\t      for (var _iterator5 = _createForOfIteratorHelperLoose(this.inputs), _step5; !(_step5 = _iterator5()).done;) {\n\t        var input = _step5.value;\n\t        var tensorValue = inputs[input.name];\n\n\t        if (tensorValue == null) {\n\t          throw new ValueError(\"No value is provided for the model's input \" + input.name);\n\t        }\n\n\t        feedDict.add(input, tensorValue);\n\t      }\n\t    } // Run execution.\n\n\n\t    var executeOutputs = execute(outputSymbolicTensors, feedDict);\n\n\t    return outputsIsArray ? executeOutputs : executeOutputs[0];\n\t  }\n\t  /**\n\t   * Retrieve the model's internal symbolic tensors from symbolic-tensor names.\n\t   */\n\t  ;\n\n\t  _proto.retrieveSymbolicTensors = function retrieveSymbolicTensors(symbolicTensorNames) {\n\t    var outputSymbolicTensors = pyListRepeat(null, symbolicTensorNames.length);\n\t    var outputsRemaining = symbolicTensorNames.length;\n\n\t    for (var _iterator6 = _createForOfIteratorHelperLoose(this.layers), _step6; !(_step6 = _iterator6()).done;) {\n\t      var layer = _step6.value;\n\t      var layerOutputs = Array.isArray(layer.output) ? layer.output : [layer.output];\n\t      var layerOutputNames = layerOutputs.map(function (output) {\n\t        return output.name;\n\t      });\n\n\t      for (var i = 0; i < symbolicTensorNames.length; ++i) {\n\t        var index = layerOutputNames.indexOf(symbolicTensorNames[i]);\n\n\t        if (index !== -1) {\n\t          outputSymbolicTensors[i] = layerOutputs[index];\n\t          outputsRemaining--;\n\t        }\n\n\t        if (outputsRemaining === 0) {\n\t          break;\n\t        }\n\t      }\n\n\t      if (outputsRemaining === 0) {\n\t        break;\n\t      }\n\t    }\n\n\t    if (outputsRemaining > 0) {\n\t      var remainingNames = [];\n\t      outputSymbolicTensors.forEach(function (tensor, i) {\n\t        if (tensor == null) {\n\t          remainingNames.push(symbolicTensorNames[i]);\n\t        }\n\t      });\n\t      throw new ValueError(\"Cannot find SymbolicTensors for output name(s): \" + (\"\" + JSON.stringify(remainingNames)));\n\t    }\n\n\t    return outputSymbolicTensors;\n\t  }\n\t  /**\n\t   * Helper method to loop over some data in batches.\n\t   *\n\t   * Porting Note: Not using the functional approach in the Python equivalent\n\t   *   due to the imperative backend.\n\t   * Porting Note: Does not support step mode currently.\n\t   *\n\t   * @param ins: input data\n\t   * @param batchSize: integer batch size.\n\t   * @param verbose: verbosity model\n\t   * @returns: Predictions as `tf.Tensor` (if a single output) or an `Array` of\n\t   *   `tf.Tensor` (if multipe outputs).\n\t   */\n\t  ;\n\n\t  _proto.predictLoop = function predictLoop(ins, batchSize, verbose) {\n\t    var _this3 = this;\n\n\t    if (batchSize === void 0) {\n\t      batchSize = 32;\n\t    }\n\n\t    if (verbose === void 0) {\n\t      verbose = false;\n\t    }\n\n\t    return tidy(function () {\n\t      var numSamples = _this3.checkNumSamples(ins);\n\n\t      if (verbose) {\n\t        throw new NotImplementedError('Verbose predictLoop() is not implemented yet.');\n\t      } // Sample-based predictions.\n\t      // Porting Note: Tensor currently does not support sliced assignments as\n\t      //   in numpy, e.g., x[1:3] = y. Therefore we use concatenation while\n\t      //   iterating over the batches.\n\n\n\t      var batches = makeBatches(numSamples, batchSize);\n\n\t      var outsBatches = _this3.outputs.map(function (output) {\n\t        return [];\n\t      }); // TODO(cais): Can the scope() be pushed down inside the for loop?\n\n\n\t      var _loop2 = function _loop2(batchIndex) {\n\t        var batchOuts = tidy(function () {\n\t          var batchStart = batches[batchIndex][0];\n\t          var batchEnd = batches[batchIndex][1]; // TODO(cais): Take care of the case of the last element is a flag for\n\t          //   training/test.\n\n\t          var insBatch = sliceArrays(ins, batchStart, batchEnd); // Construct the feeds for execute();\n\n\t          var feeds = [];\n\n\t          if (Array.isArray(insBatch)) {\n\t            for (var i = 0; i < insBatch.length; ++i) {\n\t              feeds.push({\n\t                key: _this3.inputs[i],\n\t                value: insBatch[i]\n\t              });\n\t            }\n\t          } else {\n\t            feeds.push({\n\t              key: _this3.inputs[0],\n\t              value: insBatch\n\t            });\n\t          }\n\n\t          var feedDict = new FeedDict(feeds);\n\t          return execute(_this3.outputs, feedDict);\n\t        });\n\t        batchOuts.forEach(function (batchOut, i) {\n\t          return outsBatches[i].push(batchOut);\n\t        });\n\t      };\n\n\t      for (var batchIndex = 0; batchIndex < batches.length; ++batchIndex) {\n\t        _loop2(batchIndex);\n\t      }\n\n\t      return singletonOrArray(outsBatches.map(function (batches) {\n\t        return concat(batches, 0);\n\t      }));\n\t    });\n\t  }\n\t  /**\n\t   * Generates output predictions for the input samples.\n\t   *\n\t   * Computation is done in batches.\n\t   *\n\t   * Note: the \"step\" mode of predict() is currently not supported.\n\t   *   This is because the TensorFlow.js core backend is imperative only.\n\t   *\n\t   * ```js\n\t   * const model = tf.sequential({\n\t   *   layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n\t   * });\n\t   * model.predict(tf.ones([8, 10]), {batchSize: 4}).print();\n\t   * ```\n\t   *\n\t   * @param x The input data, as a Tensor, or an `Array` of `tf.Tensor`s if\n\t   *   the model has multiple inputs.\n\t   * @param args A `ModelPredictArgs` object containing optional fields.\n\t   *\n\t   * @return Prediction results as a `tf.Tensor`(s).\n\t   *\n\t   * @exception ValueError In case of mismatch between the provided input data\n\t   *   and the model's expectations, or in case a stateful model receives a\n\t   *   number of samples that is not a multiple of the batch size.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.predict = function predict(x, args) {\n\t    if (args === void 0) {\n\t      args = {};\n\t    }\n\n\t    var xsRank2OrHigher = ensureTensorsRank2OrHigher(x);\n\t    checkInputData(xsRank2OrHigher, this.inputNames, this.feedInputShapes, false);\n\n\t    try {\n\t      // TODO(cais): Take care of stateful models.\n\t      //   if (this.stateful) ...\n\t      // TODO(cais): Take care of the learning_phase boolean flag.\n\t      //   if (this.useLearningPhase) ...\n\t      var batchSize = args.batchSize == null ? 32 : args.batchSize;\n\t      checkBatchSize(batchSize);\n\t      return this.predictLoop(xsRank2OrHigher, batchSize);\n\t    } finally {\n\t      disposeNewTensors(xsRank2OrHigher, x);\n\t    }\n\t  }\n\t  /**\n\t   * Returns predictions for a single batch of samples.\n\t   *\n\t   * ```js\n\t   * const model = tf.sequential({\n\t   *   layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n\t   * });\n\t   * model.predictOnBatch(tf.ones([8, 10])).print();\n\t   * ```\n\t   * @param x: Input samples, as a Tensor (for models with exactly one\n\t   *   input) or an array of Tensors (for models with more than one input).\n\t   * @return Tensor(s) of predictions\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.predictOnBatch = function predictOnBatch(x) {\n\t    checkInputData(x, this.inputNames, this.feedInputShapes, true); // TODO(cais): Take care of the learning_phase boolean flag.\n\t    //   if (this.useLearningPhase) ...\n\n\t    var batchSize = (Array.isArray(x) ? x[0] : x).shape[0];\n\t    return this.predictLoop(x, batchSize);\n\t  };\n\n\t  _proto.standardizeUserDataXY = function standardizeUserDataXY(x, y, checkBatchAxis, batchSize) {\n\t    if (checkBatchAxis === void 0) {\n\t      checkBatchAxis = true;\n\t    }\n\n\t    // TODO(cais): Add sampleWeight, classWeight\n\t    if (this.optimizer_ == null) {\n\t      throw new RuntimeError('You must compile a model before training/testing. Use ' + 'LayersModel.compile(modelCompileArgs).');\n\t    }\n\n\t    var outputShapes = [];\n\n\t    for (var i = 0; i < this.feedOutputShapes.length; ++i) {\n\t      var outputShape = this.feedOutputShapes[i];\n\t      var lossFn = this.feedLossFns[i];\n\n\t      if (lossFn === sparseCategoricalCrossentropy) {\n\t        outputShapes.push(outputShape.slice(0, outputShape.length - 1).concat([1]));\n\t      } else {\n\t        // Porting Note: Because of strong typing `lossFn` must be a function.\n\t        outputShapes.push(outputShape);\n\t      }\n\t    }\n\n\t    x = standardizeInputData(x, this.feedInputNames, this.feedInputShapes, false, 'input');\n\t    y = standardizeInputData(y, this.feedOutputNames, outputShapes, false, 'target'); // TODO(cais): Standardize sampleWeights & classWeights.\n\n\t    checkArrayLengths(x, y, null); // TODO(cais): Check sampleWeights as well.\n\n\t    checkLossAndTargetCompatibility(y, this.feedLossFns, this.feedOutputShapes);\n\n\t    if (this.stateful && batchSize != null && batchSize > 0) {\n\t      if (x[0].shape[0] % batchSize !== 0) {\n\t        throw new ValueError(\"In a stateful network, you should only pass inputs with a \" + \"number of samples that is divisible by the batch size \" + (batchSize + \". Found: \" + x[0].shape[0] + \" sample(s).\"));\n\t      }\n\t    }\n\n\t    return [x, y];\n\t  };\n\n\t  _proto.standardizeUserData = /*#__PURE__*/function () {\n\t    var _standardizeUserData = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(x, y, sampleWeight, classWeight, checkBatchAxis, batchSize) {\n\t      var _this$standardizeUser, standardXs, standardYs, standardSampleWeights, classWeights, i;\n\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              if (checkBatchAxis === void 0) {\n\t                checkBatchAxis = true;\n\t              }\n\n\t              _this$standardizeUser = this.standardizeUserDataXY(x, y, checkBatchAxis, batchSize), standardXs = _this$standardizeUser[0], standardYs = _this$standardizeUser[1]; // TODO(cais): Handle sampleWeights.\n\n\t              if (!(sampleWeight != null)) {\n\t                _context2.next = 4;\n\t                break;\n\t              }\n\n\t              throw new Error('sample weight is not supported yet.');\n\n\t            case 4:\n\t              standardSampleWeights = null;\n\n\t              if (!(classWeight != null)) {\n\t                _context2.next = 18;\n\t                break;\n\t              }\n\n\t              classWeights = standardizeClassWeights(classWeight, this.outputNames);\n\t              standardSampleWeights = [];\n\t              i = 0;\n\n\t            case 9:\n\t              if (!(i < classWeights.length)) {\n\t                _context2.next = 18;\n\t                break;\n\t              }\n\n\t              _context2.t0 = standardSampleWeights;\n\t              _context2.next = 13;\n\t              return standardizeWeights(standardYs[i], null, classWeights[i]);\n\n\t            case 13:\n\t              _context2.t1 = _context2.sent;\n\n\t              _context2.t0.push.call(_context2.t0, _context2.t1);\n\n\t            case 15:\n\t              ++i;\n\t              _context2.next = 9;\n\t              break;\n\n\t            case 18:\n\t              return _context2.abrupt(\"return\", [standardXs, standardYs, standardSampleWeights]);\n\n\t            case 19:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function standardizeUserData(_x3, _x4, _x5, _x6, _x7, _x8) {\n\t      return _standardizeUserData.apply(this, arguments);\n\t    }\n\n\t    return standardizeUserData;\n\t  }()\n\t  /**\n\t   * Loop over some test data in batches.\n\t   * @param f A Function returning a list of tensors.\n\t   * @param ins Array of tensors to be fed to `f`.\n\t   * @param batchSize Integer batch size or `null` / `undefined`.\n\t   * @param verbose verbosity mode.\n\t   * @param steps Total number of steps (batches of samples) before\n\t   * declaring test finished. Ignored with the default value of `null` /\n\t   * `undefined`.\n\t   * @returns Array of Scalars.\n\t   */\n\t  ;\n\n\t  _proto.testLoop = function testLoop(f, ins, batchSize, verbose, steps) {\n\t    var _this4 = this;\n\n\t    if (verbose === void 0) {\n\t      verbose = 0;\n\t    }\n\n\t    return tidy(function () {\n\t      var numSamples = _this4.checkNumSamples(ins, batchSize, steps, 'steps');\n\n\t      var outs = [];\n\n\t      if (verbose > 0) {\n\t        throw new NotImplementedError('Verbose mode is not implemented yet.');\n\t      } // TODO(cais): Use `indicesForConversionToDense' to prevent slow down.\n\n\n\t      if (steps != null) {\n\t        throw new NotImplementedError('steps mode in testLoop() is not implemented yet');\n\t      } else {\n\t        var batches = makeBatches(numSamples, batchSize);\n\t        var indexArray = tensor1d(range$1(0, numSamples));\n\n\t        for (var batchIndex = 0; batchIndex < batches.length; ++batchIndex) {\n\t          var batchStart = batches[batchIndex][0];\n\t          var batchEnd = batches[batchIndex][1];\n\t          var batchIds = sliceAlongFirstAxis(indexArray, batchStart, batchEnd - batchStart); // TODO(cais): In ins, train flag can be a number, instead of an\n\t          //   Tensor? Do we need to handle this in tfjs-layers?\n\n\t          var insBatch = sliceArraysByIndices(ins, batchIds);\n\t          var batchOuts = f(insBatch);\n\n\t          if (batchIndex === 0) {\n\t            for (var i = 0; i < batchOuts.length; ++i) {\n\t              outs.push(scalar(0));\n\t            }\n\t          }\n\n\t          for (var _i3 = 0; _i3 < batchOuts.length; ++_i3) {\n\t            var batchOut = batchOuts[_i3];\n\t            outs[_i3] = add$1(outs[_i3], mul(batchEnd - batchStart, batchOut));\n\t          }\n\t        }\n\n\t        for (var _i4 = 0; _i4 < outs.length; ++_i4) {\n\t          outs[_i4] = div(outs[_i4], numSamples);\n\t        }\n\t      }\n\n\t      return outs;\n\t    });\n\t  };\n\n\t  _proto.getDedupedMetricsNames = function getDedupedMetricsNames() {\n\t    var outLabels = this.metricsNames; // Rename duplicated metrics names (can happen with an output layer\n\t    // shared among multiple dataflows).\n\n\t    var dedupedOutLabels = [];\n\n\t    for (var i = 0; i < outLabels.length; ++i) {\n\t      var label = outLabels[i];\n\t      var newLabel = label;\n\n\t      if (count(outLabels, label) > 1) {\n\t        var dupIndex = count(outLabels.slice(0, i), label);\n\t        newLabel += \"_\" + dupIndex;\n\t      }\n\n\t      dedupedOutLabels.push(newLabel);\n\t    }\n\n\t    return dedupedOutLabels;\n\t  }\n\t  /**\n\t   * Creates a function that performs the following actions:\n\t   *\n\t   * 1. computes the losses\n\t   * 2. sums them to get the total loss\n\t   * 3. call the optimizer computes the gradients of the LayersModel's\n\t   *    trainable weights w.r.t. the total loss and update the variables\n\t   * 4. calculates the metrics\n\t   * 5. returns the values of the losses and metrics.\n\t   */\n\t  ;\n\n\t  _proto.makeTrainFunction = function makeTrainFunction() {\n\t    var _this5 = this;\n\n\t    return function (data) {\n\t      var lossValues = [];\n\t      var inputs = data.slice(0, _this5.inputs.length);\n\t      var targets = data.slice(_this5.inputs.length, _this5.inputs.length + _this5.outputs.length);\n\t      var sampleWeights = data.slice(_this5.inputs.length + _this5.outputs.length, _this5.inputs.length + _this5.outputs.length * 2);\n\t      var metricsValues = []; // Create a function that computes the total loss based on the\n\t      // inputs. This function is used for obtaining gradients through\n\t      // backprop.\n\n\t      var totalLossFunction = function totalLossFunction() {\n\t        var feeds = [];\n\n\t        for (var i = 0; i < _this5.inputs.length; ++i) {\n\t          feeds.push({\n\t            key: _this5.inputs[i],\n\t            value: inputs[i]\n\t          });\n\t        }\n\n\t        var feedDict = new FeedDict(feeds);\n\n\t        var outputs = execute(_this5.outputs, feedDict, {\n\t          'training': true\n\t        }); // TODO(cais): Take care of the case of multiple outputs from a\n\t        //   single layer?\n\n\n\t        var totalLoss;\n\n\t        for (var _i5 = 0; _i5 < _this5.lossFunctions.length; ++_i5) {\n\t          var lossFunction = _this5.lossFunctions[_i5];\n\t          var loss = lossFunction(targets[_i5], outputs[_i5]);\n\n\t          if (sampleWeights[_i5] != null) {\n\t            loss = computeWeightedLoss$1(loss, sampleWeights[_i5]);\n\t          } // TODO(cais): push Scalar instead.\n\n\n\t          var meanLoss = mean(loss); // TODO(cais): Use a scope() instead, to avoid ownership.\n\n\t          lossValues.push(meanLoss);\n\n\t          if (_i5 === 0) {\n\t            totalLoss = loss;\n\t          } else {\n\t            totalLoss = add$1(totalLoss, loss);\n\t          }\n\t        } // Compute the metrics.\n\t        // TODO(cais): These should probably be calculated outside\n\t        //   totalLossFunction to benefit speed?\n\n\n\t        for (var _i6 = 0; _i6 < _this5.metricsTensors.length; ++_i6) {\n\t          var weightedMetric = void 0;\n\n\t          if (_this5.outputs.length > 1 && _i6 < _this5.outputs.length) {\n\t            weightedMetric = lossValues[_i6];\n\t          } else {\n\t            var metric = _this5.metricsTensors[_i6][0];\n\t            var outputIndex = _this5.metricsTensors[_i6][1];\n\t            weightedMetric = mean(metric(targets[outputIndex], outputs[outputIndex]));\n\t          }\n\n\t          keep(weightedMetric); // TODO(cais): Use a scope() instead, to avoid ownership.\n\n\t          metricsValues.push(weightedMetric);\n\t        }\n\n\t        totalLoss = mean(totalLoss); // Add regularizer penalties.\n\n\t        _this5.calculateLosses().forEach(function (regularizerLoss) {\n\t          totalLoss = add$1(totalLoss, regularizerLoss);\n\t        });\n\n\t        return totalLoss;\n\t      };\n\n\t      var variables = _this5.collectedTrainableWeights.map(function (param) {\n\t        return param.read();\n\t      });\n\n\t      var returnCost = true;\n\n\t      var totalLossValue = _this5.optimizer_.minimize(totalLossFunction, returnCost, variables);\n\n\t      return [totalLossValue].concat(metricsValues);\n\t    };\n\t  }\n\t  /**\n\t   * Create a function which, when invoked with an array of `tf.Tensor`s as a\n\t   * batch of inputs, returns the prespecified loss and metrics of the model\n\t   * under the batch of input data.\n\t   */\n\t  ;\n\n\t  _proto.makeTestFunction = function makeTestFunction() {\n\t    var _this6 = this;\n\n\t    this.testFunction = function (data) {\n\t      return tidy(function () {\n\t        var valOutputs = [];\n\t        var totalLoss;\n\t        var inputs = data.slice(0, _this6.inputs.length);\n\t        var targets = data.slice(_this6.inputs.length, _this6.inputs.length + _this6.outputs.length);\n\t        var feeds = [];\n\n\t        for (var i = 0; i < _this6.inputs.length; ++i) {\n\t          feeds.push({\n\t            key: _this6.inputs[i],\n\t            value: inputs[i]\n\t          });\n\t        }\n\n\t        var feedDict = new FeedDict(feeds);\n\n\t        var outputs = execute(_this6.outputs, feedDict); // Compute total loss.\n\n\n\t        for (var _i7 = 0; _i7 < _this6.lossFunctions.length; ++_i7) {\n\t          var lossFunction = _this6.lossFunctions[_i7]; // TODO(cais): Add sample weighting and replace the simple\n\t          // averaging.\n\n\t          var loss = mean(lossFunction(targets[_i7], outputs[_i7]));\n\n\t          if (_i7 === 0) {\n\t            totalLoss = loss;\n\t          } else {\n\t            totalLoss = add$1(totalLoss, loss);\n\t          }\n\n\t          valOutputs.push(totalLoss);\n\t        } // Compute the metrics.\n\n\n\t        for (var _i8 = 0; _i8 < _this6.metricsTensors.length; ++_i8) {\n\t          var metric = _this6.metricsTensors[_i8][0];\n\t          var outputIndex = _this6.metricsTensors[_i8][1]; // TODO(cais): Replace K.mean() with a proper weighting function.\n\n\t          var meanMetric = mean(metric(targets[outputIndex], outputs[outputIndex]));\n\t          valOutputs.push(meanMetric);\n\t        }\n\n\t        return valOutputs;\n\t      });\n\t    };\n\t  }\n\t  /**\n\t   * Trains the model for a fixed number of epochs (iterations on a\n\t   * dataset).\n\t   *\n\t   * ```js\n\t   * const model = tf.sequential({\n\t   *     layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n\t   * });\n\t   * model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});\n\t   * for (let i = 1; i < 5 ; ++i) {\n\t   *   const h = await model.fit(tf.ones([8, 10]), tf.ones([8, 1]), {\n\t   *       batchSize: 4,\n\t   *       epochs: 3\n\t   *   });\n\t   *   console.log(\"Loss after Epoch \" + i + \" : \" + h.history.loss[0]);\n\t   * }\n\t   * ```\n\t   *\n\t   * @param x `tf.Tensor` of training data, or an array of `tf.Tensor`s if the\n\t   * model has multiple inputs. If all inputs in the model are named, you\n\t   * can also pass a dictionary mapping input names to `tf.Tensor`s.\n\t   * @param y `tf.Tensor` of target (label) data, or an array of `tf.Tensor`s if\n\t   * the model has multiple outputs. If all outputs in the model are named,\n\t   * you can also pass a dictionary mapping output names to `tf.Tensor`s.\n\t   * @param args A `ModelFitArgs`, containing optional fields.\n\t   *\n\t   * @return A `History` instance. Its `history` attribute contains all\n\t   *   information collected during training.\n\t   *\n\t   * @exception ValueError In case of mismatch between the provided input\n\t   * data and what the model expects.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.fit =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _fit = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(x, y, args) {\n\t      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t        while (1) {\n\t          switch (_context3.prev = _context3.next) {\n\t            case 0:\n\t              if (args === void 0) {\n\t                args = {};\n\t              }\n\n\t              return _context3.abrupt(\"return\", fitTensors(this, x, y, args));\n\n\t            case 2:\n\t            case \"end\":\n\t              return _context3.stop();\n\t          }\n\t        }\n\t      }, _callee3, this);\n\t    }));\n\n\t    function fit(_x9, _x10, _x11) {\n\t      return _fit.apply(this, arguments);\n\t    }\n\n\t    return fit;\n\t  }() // TODO(cais): Add code snippet below when it's possible to instantiate\n\t  //   actual dataset objects.\n\n\t  /**\n\t   * Trains the model using a dataset object.\n\t   *\n\t   * @param dataset A dataset object. Its `iterator()` method is expected\n\t   *   to generate a dataset iterator object, the `next()` method of which\n\t   *   is expected to produce data batches for training. The return value\n\t   *   of the `next()` call ought to contain a boolean `done` field and a\n\t   *   `value` field. The `value` field is expected to be an array of two\n\t   *   `tf.Tensor`s or an array of two nested `tf.Tensor` structures. The former\n\t   *   case is for models with exactly one input and one output (e.g..\n\t   *   a sequential model). The latter case is for models with multiple\n\t   *   inputs and/or multiple outputs.\n\t   *   Of the two items in the array, the first is the input feature(s) and\n\t   *   the second is the output target(s).\n\t   * @param args A `ModelFitDatasetArgs`, containing optional fields.\n\t   *\n\t   * @return A `History` instance. Its `history` attribute contains all\n\t   *   information collected during training.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.fitDataset =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _fitDataset2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(dataset, args) {\n\t      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n\t        while (1) {\n\t          switch (_context4.prev = _context4.next) {\n\t            case 0:\n\t              return _context4.abrupt(\"return\", fitDataset(this, dataset, args));\n\n\t            case 1:\n\t            case \"end\":\n\t              return _context4.stop();\n\t          }\n\t        }\n\t      }, _callee4, this);\n\t    }));\n\n\t    function fitDataset$1(_x12, _x13) {\n\t      return _fitDataset2.apply(this, arguments);\n\t    }\n\n\t    return fitDataset$1;\n\t  }()\n\t  /**\n\t   * Runs a single gradient update on a single batch of data.\n\t   *\n\t   * This method differs from `fit()` and `fitDataset()` in the following\n\t   * regards:\n\t   *   - It operates on exactly one batch of data.\n\t   *   - It returns only the loss and matric values, instead of\n\t   *     returning the batch-by-batch loss and metric values.\n\t   *   - It doesn't support fine-grained options such as verbosity and\n\t   *     callbacks.\n\t   *\n\t   * @param x Input data. It could be one of the following:\n\t   *   - A `tf.Tensor`, or an Array of `tf.Tensor`s (in case the model has\n\t   *     multiple inputs).\n\t   *   - An Object mapping input names to corresponding `tf.Tensor` (if the\n\t   *     model has named inputs).\n\t   * @param y Target darta. It could be either a `tf.Tensor` a multiple\n\t   *   `tf.Tensor`s. It should be consistent with `x`.\n\t   * @returns Training loss or losses (in case the model has\n\t   *   multiple outputs), along with metrics (if any), as numbers.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.trainOnBatch =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _trainOnBatch = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5(x, y) {\n\t      var standardizeOut, inputs, targets, trainFunction, losses, lossValues, _iterator7, _step7, loss, v;\n\n\t      return regeneratorRuntime.wrap(function _callee5$(_context5) {\n\t        while (1) {\n\t          switch (_context5.prev = _context5.next) {\n\t            case 0:\n\t              _context5.next = 2;\n\t              return this.standardizeUserData(x, y);\n\n\t            case 2:\n\t              standardizeOut = _context5.sent;\n\t              inputs = standardizeOut[0];\n\t              targets = standardizeOut[1];\n\t              trainFunction = this.makeTrainFunction();\n\t              losses = trainFunction(inputs.concat(targets));\n\t              lossValues = [];\n\t              _iterator7 = _createForOfIteratorHelperLoose(losses);\n\n\t            case 9:\n\t              if ((_step7 = _iterator7()).done) {\n\t                _context5.next = 17;\n\t                break;\n\t              }\n\n\t              loss = _step7.value;\n\t              _context5.next = 13;\n\t              return loss.data();\n\n\t            case 13:\n\t              v = _context5.sent;\n\t              lossValues.push(v[0]);\n\n\t            case 15:\n\t              _context5.next = 9;\n\t              break;\n\n\t            case 17:\n\t              dispose(losses);\n\t              return _context5.abrupt(\"return\", singletonOrArray(lossValues));\n\n\t            case 19:\n\t            case \"end\":\n\t              return _context5.stop();\n\t          }\n\t        }\n\t      }, _callee5, this);\n\t    }));\n\n\t    function trainOnBatch(_x14, _x15) {\n\t      return _trainOnBatch.apply(this, arguments);\n\t    }\n\n\t    return trainOnBatch;\n\t  }()\n\t  /**\n\t   * Extract weight values of the model.\n\t   *\n\t   * @param config: An instance of `io.SaveConfig`, which specifies\n\t   * model-saving options such as whether only trainable weights are to be\n\t   * saved.\n\t   * @returns A `NamedTensorMap` mapping original weight names (i.e.,\n\t   *   non-uniqueified weight names) to their values.\n\t   */\n\t  ;\n\n\t  _proto.getNamedWeights = function getNamedWeights(config) {\n\t    var namedWeights = [];\n\t    var trainableOnly = config != null && config.trainableOnly;\n\t    var weights = trainableOnly ? this.trainableWeights : this.weights;\n\t    var weightValues = this.getWeights(trainableOnly);\n\n\t    for (var i = 0; i < weights.length; ++i) {\n\t      if (trainableOnly && !weights[i].trainable) {\n\t        // Optionally skip non-trainable weights.\n\t        continue;\n\t      }\n\n\t      namedWeights.push({\n\t        name: weights[i].originalName,\n\t        tensor: weightValues[i]\n\t      });\n\t    }\n\n\t    return namedWeights;\n\t  }\n\t  /**\n\t   * Setter used for force stopping of LayersModel.fit() (i.e., training).\n\t   *\n\t   * Example:\n\t   *\n\t   * ```js\n\t   * const input = tf.input({shape: [10]});\n\t   * const output = tf.layers.dense({units: 1}).apply(input);\n\t   * const model = tf.model({inputs: [input], outputs: [output]});\n\t   * model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});\n\t   * const xs = tf.ones([8, 10]);\n\t   * const ys = tf.zeros([8, 1]);\n\t   *\n\t   * const history = await model.fit(xs, ys, {\n\t   *   epochs: 10,\n\t   *   callbacks: {\n\t   *     onEpochEnd: async (epoch, logs) => {\n\t   *       if (epoch === 2) {\n\t   *         model.stopTraining = true;\n\t   *       }\n\t   *     }\n\t   *   }\n\t   * });\n\t   *\n\t   * // There should be only 3 values in the loss array, instead of 10\n\t   * values,\n\t   * // due to the stopping after 3 epochs.\n\t   * console.log(history.history.loss);\n\t   * ```\n\t   */\n\t  ;\n\n\t  _proto.dispose = function dispose() {\n\t    var result = _Container.prototype.dispose.call(this);\n\n\t    if (result.refCountAfterDispose === 0 && this.optimizer != null && this.isOptimizerOwned) {\n\t      var numTensorsBeforeOptmizerDisposal = memory().numTensors;\n\t      this.optimizer_.dispose();\n\t      result.numDisposedVariables += numTensorsBeforeOptmizerDisposal - memory().numTensors;\n\t    }\n\n\t    return result;\n\t  };\n\n\t  _proto.getLossIdentifiers = function getLossIdentifiers() {\n\t    var lossNames;\n\n\t    if (typeof this.loss === 'string') {\n\t      lossNames = toSnakeCase(this.loss);\n\t    } else if (Array.isArray(this.loss)) {\n\t      for (var _iterator8 = _createForOfIteratorHelperLoose(this.loss), _step8; !(_step8 = _iterator8()).done;) {\n\t        var loss = _step8.value;\n\n\t        if (typeof loss !== 'string') {\n\t          throw new Error('Serialization of non-string loss is not supported.');\n\t        }\n\t      }\n\n\t      lossNames = this.loss.map(function (name) {\n\t        return toSnakeCase(name);\n\t      });\n\t    } else {\n\t      var outputNames = Object.keys(this.loss);\n\t      lossNames = {};\n\t      var _losses = this.loss;\n\n\t      for (var _i9 = 0, _outputNames = outputNames; _i9 < _outputNames.length; _i9++) {\n\t        var outputName = _outputNames[_i9];\n\n\t        if (typeof _losses[outputName] === 'string') {\n\t          lossNames[outputName] = toSnakeCase(_losses[outputName]);\n\t        } else {\n\t          throw new Error('Serialization of non-string loss is not supported.');\n\t        }\n\t      }\n\t    }\n\n\t    return lossNames;\n\t  };\n\n\t  _proto.getMetricIdentifiers = function getMetricIdentifiers() {\n\t    if (typeof this.metrics === 'string' || typeof this.metrics === 'function') {\n\t      return [toSnakeCase(getLossOrMetricName(this.metrics))];\n\t    } else if (Array.isArray(this.metrics)) {\n\t      return this.metrics.map(function (metric) {\n\t        return toSnakeCase(getLossOrMetricName(metric));\n\t      });\n\t    } else {\n\t      var metricsIdentifiers = {};\n\n\t      for (var key in this.metrics) {\n\t        metricsIdentifiers[key] = toSnakeCase(getLossOrMetricName(this.metrics[key]));\n\t      }\n\n\t      return metricsIdentifiers;\n\t    }\n\t  };\n\n\t  _proto.getTrainingConfig = function getTrainingConfig() {\n\t    return {\n\t      loss: this.getLossIdentifiers(),\n\t      metrics: this.getMetricIdentifiers(),\n\t      optimizer_config: {\n\t        class_name: this.optimizer.getClassName(),\n\t        config: this.optimizer.getConfig()\n\t      }\n\t    }; // TODO(cais): Add weight_metrics when they are supported.\n\t    // TODO(cais): Add sample_weight_mode when it's supported.\n\t    // TODO(cais): Add loss_weights when it's supported.\n\t  };\n\n\t  _proto.loadTrainingConfig = function loadTrainingConfig(trainingConfig) {\n\t    if (trainingConfig.weighted_metrics != null) {\n\t      throw new Error('Loading weight_metrics is not supported yet.');\n\t    }\n\n\t    if (trainingConfig.loss_weights != null) {\n\t      throw new Error('Loading loss_weights is not supported yet.');\n\t    }\n\n\t    if (trainingConfig.sample_weight_mode != null) {\n\t      throw new Error('Loading sample_weight_mode is not supported yet.');\n\t    }\n\n\t    var tsConfig = convertPythonicToTs(trainingConfig.optimizer_config);\n\t    var optimizer = deserialize$1(tsConfig);\n\t    var loss;\n\n\t    if (typeof trainingConfig.loss === 'string') {\n\t      loss = toCamelCase(trainingConfig.loss);\n\t    } else if (Array.isArray(trainingConfig.loss)) {\n\t      loss = trainingConfig.loss.map(function (lossEntry) {\n\t        return toCamelCase(lossEntry);\n\t      });\n\t    } else if (trainingConfig.loss != null) {\n\t      loss = {};\n\n\t      for (var key in trainingConfig.loss) {\n\t        loss[key] = toCamelCase(trainingConfig.loss[key]);\n\t      }\n\t    }\n\n\t    var metrics;\n\n\t    if (Array.isArray(trainingConfig.metrics)) {\n\t      metrics = trainingConfig.metrics.map(function (metric) {\n\t        return toCamelCase(metric);\n\t      });\n\t    } else if (trainingConfig.metrics != null) {\n\t      metrics = {};\n\n\t      for (var _key in trainingConfig.metrics) {\n\t        metrics[_key] = toCamelCase(trainingConfig.metrics[_key]);\n\t      }\n\t    }\n\n\t    this.compile({\n\t      loss: loss,\n\t      metrics: metrics,\n\t      optimizer: optimizer\n\t    });\n\t  }\n\t  /**\n\t   * Save the configuration and/or weights of the LayersModel.\n\t   *\n\t   * An `IOHandler` is an object that has a `save` method of the proper\n\t   * signature defined. The `save` method manages the storing or\n\t   * transmission of serialized data (\"artifacts\") that represent the\n\t   * model's topology and weights onto or via a specific medium, such as\n\t   * file downloads, local storage, IndexedDB in the web browser and HTTP\n\t   * requests to a server. TensorFlow.js provides `IOHandler`\n\t   * implementations for a number of frequently used saving mediums, such as\n\t   * `tf.io.browserDownloads` and `tf.io.browserLocalStorage`. See `tf.io`\n\t   * for more details.\n\t   *\n\t   * This method also allows you to refer to certain types of `IOHandler`s\n\t   * as URL-like string shortcuts, such as 'localstorage://' and\n\t   * 'indexeddb://'.\n\t   *\n\t   * Example 1: Save `model`'s topology and weights to browser [local\n\t   * storage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage);\n\t   * then load it back.\n\t   *\n\t   * ```js\n\t   * const model = tf.sequential(\n\t   *     {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n\t   * console.log('Prediction from original model:');\n\t   * model.predict(tf.ones([1, 3])).print();\n\t   *\n\t   * const saveResults = await model.save('localstorage://my-model-1');\n\t   *\n\t   * const loadedModel = await tf.loadLayersModel('localstorage://my-model-1');\n\t   * console.log('Prediction from loaded model:');\n\t   * loadedModel.predict(tf.ones([1, 3])).print();\n\t   * ```\n\t   *\n\t   * Example 2. Saving `model`'s topology and weights to browser\n\t   * [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API);\n\t   * then load it back.\n\t   *\n\t   * ```js\n\t   * const model = tf.sequential(\n\t   *     {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n\t   * console.log('Prediction from original model:');\n\t   * model.predict(tf.ones([1, 3])).print();\n\t   *\n\t   * const saveResults = await model.save('indexeddb://my-model-1');\n\t   *\n\t   * const loadedModel = await tf.loadLayersModel('indexeddb://my-model-1');\n\t   * console.log('Prediction from loaded model:');\n\t   * loadedModel.predict(tf.ones([1, 3])).print();\n\t   * ```\n\t   *\n\t   * Example 3. Saving `model`'s topology and weights as two files\n\t   * (`my-model-1.json` and `my-model-1.weights.bin`) downloaded from\n\t   * browser.\n\t   *\n\t   * ```js\n\t   * const model = tf.sequential(\n\t   *     {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n\t   * const saveResults = await model.save('downloads://my-model-1');\n\t   * ```\n\t   *\n\t   * Example 4. Send  `model`'s topology and weights to an HTTP server.\n\t   * See the documentation of `tf.io.http` for more details\n\t   * including specifying request parameters and implementation of the\n\t   * server.\n\t   *\n\t   * ```js\n\t   * const model = tf.sequential(\n\t   *     {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n\t   * const saveResults = await model.save('http://my-server/model/upload');\n\t   * ```\n\t   *\n\t   * @param handlerOrURL An instance of `IOHandler` or a URL-like,\n\t   * scheme-based string shortcut for `IOHandler`.\n\t   * @param config Options for saving the model.\n\t   * @returns A `Promise` of `SaveResult`, which summarizes the result of\n\t   * the saving, such as byte sizes of the saved artifacts for the model's\n\t   *   topology and weight values.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes', ignoreCI: true}\n\t   */\n\t  ;\n\n\t  _proto.save =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _save = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6(handlerOrURL, config) {\n\t      var handlers, weightDataAndSpecs, returnString, unusedArg, modelConfig, modelArtifacts, includeOptimizer, _weightDataAndSpecs$s, weightType, _yield$io$encodeWeigh, optimizerWeightData, optimizerWeightSpecs, checkSize;\n\n\t      return regeneratorRuntime.wrap(function _callee6$(_context6) {\n\t        while (1) {\n\t          switch (_context6.prev = _context6.next) {\n\t            case 0:\n\t              if (!(typeof handlerOrURL === 'string')) {\n\t                _context6.next = 9;\n\t                break;\n\t              }\n\n\t              handlers = getSaveHandlers(handlerOrURL);\n\n\t              if (!(handlers.length === 0)) {\n\t                _context6.next = 6;\n\t                break;\n\t              }\n\n\t              throw new ValueError(\"Cannot find any save handlers for URL '\" + handlerOrURL + \"'\");\n\n\t            case 6:\n\t              if (!(handlers.length > 1)) {\n\t                _context6.next = 8;\n\t                break;\n\t              }\n\n\t              throw new ValueError(\"Found more than one (\" + handlers.length + \") save handlers for \" + (\"URL '\" + handlerOrURL + \"'\"));\n\n\t            case 8:\n\t              handlerOrURL = handlers[0];\n\n\t            case 9:\n\t              if (!(handlerOrURL.save == null)) {\n\t                _context6.next = 11;\n\t                break;\n\t              }\n\n\t              throw new ValueError('LayersModel.save() cannot proceed because the IOHandler ' + 'provided does not have the `save` attribute defined.');\n\n\t            case 11:\n\t              _context6.next = 13;\n\t              return encodeWeights(this.getNamedWeights(config));\n\n\t            case 13:\n\t              weightDataAndSpecs = _context6.sent;\n\t              returnString = false;\n\t              unusedArg = null;\n\t              modelConfig = this.toJSON(unusedArg, returnString);\n\t              modelArtifacts = {\n\t                modelTopology: modelConfig,\n\t                format: LAYERS_MODEL_FORMAT_NAME,\n\t                generatedBy: \"TensorFlow.js tfjs-layers v\" + version$2,\n\t                convertedBy: null\n\t              };\n\t              includeOptimizer = config == null ? false : config.includeOptimizer;\n\n\t              if (!(includeOptimizer && this.optimizer != null)) {\n\t                _context6.next = 34;\n\t                break;\n\t              }\n\n\t              modelArtifacts.trainingConfig = this.getTrainingConfig();\n\t              weightType = 'optimizer';\n\t              _context6.t0 = io;\n\t              _context6.next = 25;\n\t              return this.optimizer.getWeights();\n\n\t            case 25:\n\t              _context6.t1 = _context6.sent;\n\t              _context6.t2 = weightType;\n\t              _context6.next = 29;\n\t              return _context6.t0.encodeWeights.call(_context6.t0, _context6.t1, _context6.t2);\n\n\t            case 29:\n\t              _yield$io$encodeWeigh = _context6.sent;\n\t              optimizerWeightData = _yield$io$encodeWeigh.data;\n\t              optimizerWeightSpecs = _yield$io$encodeWeigh.specs;\n\n\t              (_weightDataAndSpecs$s = weightDataAndSpecs.specs).push.apply(_weightDataAndSpecs$s, optimizerWeightSpecs);\n\n\t              weightDataAndSpecs.data = concatenateArrayBuffers([weightDataAndSpecs.data, optimizerWeightData]);\n\n\t            case 34:\n\t              if (this.userDefinedMetadata != null) {\n\t                // Check serialized size of user-defined metadata.\n\t                checkSize = true;\n\t                checkUserDefinedMetadata(this.userDefinedMetadata, this.name, checkSize);\n\t                modelArtifacts.userDefinedMetadata = this.userDefinedMetadata;\n\t              }\n\n\t              modelArtifacts.weightData = weightDataAndSpecs.data;\n\t              modelArtifacts.weightSpecs = weightDataAndSpecs.specs;\n\t              return _context6.abrupt(\"return\", handlerOrURL.save(modelArtifacts));\n\n\t            case 38:\n\t            case \"end\":\n\t              return _context6.stop();\n\t          }\n\t        }\n\t      }, _callee6, this);\n\t    }));\n\n\t    function save(_x16, _x17) {\n\t      return _save.apply(this, arguments);\n\t    }\n\n\t    return save;\n\t  }()\n\t  /**\n\t   * Set user-defined metadata.\n\t   *\n\t   * The set metadata will be serialized together with the topology\n\t   * and weights of the model during `save()` calls.\n\t   *\n\t   * @param setUserDefinedMetadata\n\t   */\n\t  ;\n\n\t  _proto.setUserDefinedMetadata = function setUserDefinedMetadata(userDefinedMetadata) {\n\t    checkUserDefinedMetadata(userDefinedMetadata, this.name);\n\t    this.userDefinedMetadata = userDefinedMetadata;\n\t  }\n\t  /**\n\t   * Get user-defined metadata.\n\t   *\n\t   * The metadata is supplied via one of the two routes:\n\t   *   1. By calling `setUserDefinedMetadata()`.\n\t   *   2. Loaded during model loading (if the model is constructed\n\t   *      via `tf.loadLayersModel()`.)\n\t   *\n\t   * If no user-defined metadata is available from either of the\n\t   * two routes, this function will return `undefined`.\n\t   */\n\t  ;\n\n\t  _proto.getUserDefinedMetadata = function getUserDefinedMetadata() {\n\t    return this.userDefinedMetadata;\n\t  };\n\n\t  _createClass(LayersModel, [{\n\t    key: \"stopTraining\",\n\t    set: function set(stop) {\n\t      this.stopTraining_ = stop;\n\t    },\n\t    get: function get() {\n\t      return this.stopTraining_;\n\t    }\n\t  }, {\n\t    key: \"optimizer\",\n\t    get: function get() {\n\t      return this.optimizer_;\n\t    },\n\t    set: function set(optimizer) {\n\t      if (this.optimizer_ !== optimizer) {\n\t        this.optimizer_ = optimizer;\n\t        this.isOptimizerOwned = false;\n\t      }\n\t    }\n\t  }]);\n\n\t  return LayersModel;\n\t}(Container); // The class name is 'Model' rather than 'LayersModel' for backwards\n\t// compatibility since this class name shows up in the serialization format.\n\n\t/** @nocollapse */\n\n\tLayersModel.className = 'Model';\n\tregisterClass(LayersModel);\n\t/**\n\t * A `tf.Functional` is an alias to `tf.LayersModel`.\n\t *\n\t * See also:\n\t *   `tf.LayersModel`, `tf.Sequential`, `tf.loadLayersModel`.\n\t */\n\n\t/** @doc {heading: 'Models', subheading: 'Classes'} */\n\n\tvar Functional = /*#__PURE__*/function (_LayersModel) {\n\t  _inheritsLoose(Functional, _LayersModel);\n\n\t  function Functional() {\n\t    return _LayersModel.apply(this, arguments) || this;\n\t  }\n\n\t  return Functional;\n\t}(LayersModel);\n\tFunctional.className = 'Functional';\n\tregisterClass(Functional);\n\n\t/**\n\t * Parses a JSON model configuration file and returns a model instance.\n\t *\n\t * ```js\n\t * // This example shows how to serialize a model using `toJSON()` and\n\t * // deserialize it as another model using `tf.models.modelFromJSON()`.\n\t * // Note: this example serializes and deserializes only the topology\n\t * // of the model; the weights of the loaded model will be different\n\t * // from those of the the original model, due to random weight\n\t * // initialization.\n\t * // To load the topology and weights of a model, use `tf.loadLayersModel()`.\n\t * const model1 = tf.sequential();\n\t * model1.add(tf.layers.repeatVector({inputShape: [2], n: 4}));\n\t * // Serialize `model1` as a JSON object.\n\t * const model1JSON = model1.toJSON(null, false);\n\t * model1.summary();\n\t *\n\t * const model2 = await tf.models.modelFromJSON(model1JSON);\n\t * model2.summary();\n\t * ```\n\t *\n\t *  @param modelAndWeightsConfig JSON object or string encoding a model and\n\t *       weights configuration. It can also be only the topology JSON of the\n\t *       model, in which case the weights will not be loaded.\n\t *  @param custom_objects Optional dictionary mapping names\n\t *       (strings) to custom classes or functions to be\n\t *       considered during deserialization.\n\t * @returns A TensorFlow.js Layers `tf.LayersModel` instance (uncompiled).\n\t */\n\n\tfunction modelFromJSON(_x, _x2) {\n\t  return _modelFromJSON.apply(this, arguments);\n\t}\n\t/**\n\t * Load a model, including its topology and optionally weights.  See the\n\t * Tutorial named \"How to import a Keras Model\" for usage examples.\n\t *\n\t * Example 1: Save `model`'s topology and weights to browser [local\n\t * storage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage);\n\t * then load it back.\n\t *\n\t * ```js\n\t * const model = tf.sequential(\n\t *     {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n\t * console.log('Prediction from original model:');\n\t * model.predict(tf.ones([1, 3])).print();\n\t *\n\t * const saveResults = await model.save('localstorage://my-model-1');\n\t *\n\t * const loadedModel = await tf.loadLayersModel('localstorage://my-model-1');\n\t * console.log('Prediction from loaded model:');\n\t * loadedModel.predict(tf.ones([1, 3])).print();\n\t * ```\n\t *\n\t * Example 2. Saving `model`'s topology and weights to browser\n\t * [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API);\n\t * then load it back.\n\t *\n\t * ```js\n\t * const model = tf.sequential(\n\t *     {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n\t * console.log('Prediction from original model:');\n\t * model.predict(tf.ones([1, 3])).print();\n\t *\n\t * const saveResults = await model.save('indexeddb://my-model-1');\n\t *\n\t * const loadedModel = await tf.loadLayersModel('indexeddb://my-model-1');\n\t * console.log('Prediction from loaded model:');\n\t * loadedModel.predict(tf.ones([1, 3])).print();\n\t * ```\n\t *\n\t * Example 3. Load a model from user-selected files from HTML\n\t * [file input\n\t * elements](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file).\n\t *\n\t * ```js\n\t * // Note: this code snippet will not work without the HTML elements in the\n\t * //   page\n\t * const jsonUpload = document.getElementById('json-upload');\n\t * const weightsUpload = document.getElementById('weights-upload');\n\t *\n\t * const model = await tf.loadLayersModel(\n\t *     tf.io.browserFiles([jsonUpload.files[0], weightsUpload.files[0]]));\n\t * ```\n\t *\n\t * Example 4. Load a model from an HTTP server.\n\t *\n\t * ```js\n\t * const model = await\n\t *     tf.loadLayersModel('https://storage.googleapis.com/tfjs-models/tfjs/iris_v1/model.json');\n\t * model.summary();\n\t * ```\n\t *\n\t * @param pathOrIOHandler Can be either of the two formats\n\t *   1. A string path to the `ModelAndWeightsConfig` JSON describing\n\t *      the model in the canonical TensorFlow.js format. This path will be\n\t *      interpreted as a relative HTTP path, to which `fetch` will be used to\n\t *      request the model topology and weight manifest JSON.\n\t *      The content of the JSON file is assumed to be a JSON object with the\n\t *      following fields and values:\n\t *      - 'modelTopology': A JSON object that can be either of:\n\t *        1. a model architecture JSON consistent with the format of the return\n\t *            value of `keras.Model.to_json()`\n\t *        2. a full model JSON in the format of `keras.models.save_model()`.\n\t *      - 'weightsManifest': A TensorFlow.js weights manifest.\n\t *      See the Python converter function `save_model()` for more details.\n\t *      It is also assumed that model weights can be accessed from relative\n\t *      paths described by the `paths` fields in weights manifest.\n\t *   2. An `tf.io.IOHandler` object that loads model artifacts with its `load`\n\t *      method.\n\t * @param options Optional configuration arguments for the model loading,\n\t *   including:\n\t *   - `strict`: Require that the provided weights exactly match those required\n\t *     by the layers.  Default true.  Passing false means that both extra\n\t *     weights and missing weights will be silently ignored.\n\t *   - `onProgress`: A progress callback of the form:\n\t *     `(fraction: number) => void`. This callback can be used to monitor the\n\t *     model-loading process.\n\t * @returns A `Promise` of `tf.LayersModel`, with the topology and weights\n\t *     loaded.\n\t */\n\n\tfunction _modelFromJSON() {\n\t  _modelFromJSON = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5(modelAndWeightsConfig, customObjects) {\n\t    var modelTopology, tsConfig, model, weightValues, uniqueWeightValues, _iterator4, _step4, weight;\n\n\t    return regeneratorRuntime.wrap(function _callee5$(_context5) {\n\t      while (1) {\n\t        switch (_context5.prev = _context5.next) {\n\t          case 0:\n\t            if (!('modelTopology' in modelAndWeightsConfig)) {\n\t              modelAndWeightsConfig = {\n\t                modelTopology: modelAndWeightsConfig\n\t              };\n\t            }\n\n\t            modelAndWeightsConfig = modelAndWeightsConfig;\n\t            modelTopology = modelAndWeightsConfig.modelTopology;\n\n\t            if (modelTopology['model_config'] != null) {\n\t              // If the model-topology JSON contains a 'model_config' field, then it is\n\t              // a full model JSON (e.g., from `keras.Model.save()`), which contains\n\t              // not only the model's architecture in its 'model_config' field, but\n\t              // additional information such as the model's optimizer. We use only the\n\t              // 'model_config' field currently.\n\t              modelTopology = modelTopology['model_config'];\n\t            }\n\n\t            tsConfig = convertPythonicToTs(modelTopology);\n\t            model = deserialize$1(tsConfig, customObjects);\n\n\t            if (!(modelAndWeightsConfig.weightsManifest != null)) {\n\t              _context5.next = 14;\n\t              break;\n\t            }\n\n\t            _context5.next = 9;\n\t            return loadWeights(modelAndWeightsConfig.weightsManifest, modelAndWeightsConfig.pathPrefix, model.weights.map(function (weight) {\n\t              return weight.originalName;\n\t            }));\n\n\t          case 9:\n\t            weightValues = _context5.sent;\n\t            // Map the weights to the unique tensor names generated during model loading\n\t            uniqueWeightValues = {};\n\n\t            for (_iterator4 = _createForOfIteratorHelperLoose(model.weights); !(_step4 = _iterator4()).done;) {\n\t              weight = _step4.value;\n\t              uniqueWeightValues[weight.originalName] = weightValues[weight.originalName];\n\t            }\n\n\t            model.loadWeights(uniqueWeightValues); // Dispose temporary weight values.\n\n\t            dispose(weightValues);\n\n\t          case 14:\n\t            return _context5.abrupt(\"return\", model);\n\n\t          case 15:\n\t          case \"end\":\n\t            return _context5.stop();\n\t        }\n\t      }\n\t    }, _callee5);\n\t  }));\n\t  return _modelFromJSON.apply(this, arguments);\n\t}\n\n\tfunction loadLayersModelInternal(_x3, _x4) {\n\t  return _loadLayersModelInternal.apply(this, arguments);\n\t}\n\t/**\n\t * Load a model and optionally its weights, using an IOHandler object.\n\t *\n\t * @param handler The instance of `IOHandler` to be used during the model\n\t *   loading.\n\t * @param customObjects Any optional custom objects to be used during model\n\t *   loading.\n\t * @param strict Whether the weight loading will be done in strict mode.\n\t *   Default: `true`.\n\t */\n\n\tfunction _loadLayersModelInternal() {\n\t  _loadLayersModelInternal = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6(pathOrIOHandler, options) {\n\t    var handlers;\n\t    return regeneratorRuntime.wrap(function _callee6$(_context6) {\n\t      while (1) {\n\t        switch (_context6.prev = _context6.next) {\n\t          case 0:\n\t            if (options == null) {\n\t              options = {};\n\t            }\n\n\t            if (!(typeof pathOrIOHandler === 'string')) {\n\t              _context6.next = 10;\n\t              break;\n\t            }\n\n\t            handlers = getLoadHandlers(pathOrIOHandler, options);\n\n\t            if (!(handlers.length === 0)) {\n\t              _context6.next = 7;\n\t              break;\n\t            }\n\n\t            // For backward compatibility: if no load handler can be found,\n\t            // assume it is a relative http path.\n\t            // TODO(cais): Reformat the args into a single `LoadOptions` once the core\n\t            // is refactored.\n\t            handlers.push(browserHTTPRequest(pathOrIOHandler, options));\n\t            _context6.next = 9;\n\t            break;\n\n\t          case 7:\n\t            if (!(handlers.length > 1)) {\n\t              _context6.next = 9;\n\t              break;\n\t            }\n\n\t            throw new ValueError(\"Found more than one (\" + handlers.length + \") load handlers for \" + (\"URL '\" + pathOrIOHandler + \"'\"));\n\n\t          case 9:\n\t            pathOrIOHandler = handlers[0];\n\n\t          case 10:\n\t            return _context6.abrupt(\"return\", loadLayersModelFromIOHandler(pathOrIOHandler, undefined, options));\n\n\t          case 11:\n\t          case \"end\":\n\t            return _context6.stop();\n\t        }\n\t      }\n\t    }, _callee6);\n\t  }));\n\t  return _loadLayersModelInternal.apply(this, arguments);\n\t}\n\n\tfunction loadLayersModelFromIOHandler(_x5, _x6, _x7) {\n\t  return _loadLayersModelFromIOHandler.apply(this, arguments);\n\t}\n\n\tfunction _loadLayersModelFromIOHandler() {\n\t  _loadLayersModelFromIOHandler = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee7(handler, customObjects, options) {\n\t    var artifacts, modelTopology, strict, fastWeightInit, model, trainingConfig, _decodeModelAndOptimi, modelWeights, optimizerWeights;\n\n\t    return regeneratorRuntime.wrap(function _callee7$(_context7) {\n\t      while (1) {\n\t        switch (_context7.prev = _context7.next) {\n\t          case 0:\n\t            if (options == null) {\n\t              options = {};\n\t            }\n\n\t            if (!(handler.load == null)) {\n\t              _context7.next = 3;\n\t              break;\n\t            }\n\n\t            throw new ValueError('Cannot proceed with model loading because the IOHandler provided ' + 'does not have the `load` method implemented.');\n\n\t          case 3:\n\t            _context7.next = 5;\n\t            return handler.load();\n\n\t          case 5:\n\t            artifacts = _context7.sent;\n\t            modelTopology = artifacts.modelTopology;\n\n\t            if (modelTopology['model_config'] != null) {\n\t              modelTopology = modelTopology['model_config'];\n\t            }\n\n\t            strict = options.strict == null ? true : options.strict; // If weights are provided and the weight-loading mode is strict, use\n\t            // fast weight initialization. This skips costly initializers such as\n\t            // 'orthogonal' and saves unnecessary computation in cases where\n\t            // the initialized weight values will immediately be overwritten by\n\t            // loaded weight values.\n\n\t            fastWeightInit = artifacts.weightData != null && artifacts.weightSpecs != null && strict;\n\t            model = deserialize$1(convertPythonicToTs(modelTopology), customObjects, fastWeightInit);\n\t            trainingConfig = artifacts.trainingConfig;\n\n\t            if (trainingConfig != null) {\n\t              model.loadTrainingConfig(trainingConfig);\n\t            }\n\n\t            if (artifacts.userDefinedMetadata != null) {\n\t              model.setUserDefinedMetadata(artifacts.userDefinedMetadata);\n\t            } // If weightData is present, load the weights into the model.\n\n\n\t            if (!(artifacts.weightData != null)) {\n\t              _context7.next = 24;\n\t              break;\n\t            }\n\n\t            if (!(artifacts.weightSpecs == null)) {\n\t              _context7.next = 17;\n\t              break;\n\t            }\n\n\t            throw new ValueError('LayersModel artifacts contains weight data, but not weight specs. ' + 'Therefore loading of weights cannot proceed.');\n\n\t          case 17:\n\t            _decodeModelAndOptimi = decodeModelAndOptimizerWeights(artifacts.weightData, artifacts.weightSpecs), modelWeights = _decodeModelAndOptimi.modelWeights, optimizerWeights = _decodeModelAndOptimi.optimizerWeights;\n\t            model.loadWeights(modelWeights, strict);\n\n\t            if (!(model.optimizer != null && optimizerWeights.length > 0)) {\n\t              _context7.next = 22;\n\t              break;\n\t            }\n\n\t            _context7.next = 22;\n\t            return model.optimizer.setWeights(optimizerWeights);\n\n\t          case 22:\n\t            // Dispose temporary weight values.\n\t            dispose(modelWeights);\n\t            dispose(optimizerWeights.map(function (w) {\n\t              return w.tensor;\n\t            }));\n\n\t          case 24:\n\t            return _context7.abrupt(\"return\", model);\n\n\t          case 25:\n\t          case \"end\":\n\t            return _context7.stop();\n\t        }\n\t      }\n\t    }, _callee7);\n\t  }));\n\t  return _loadLayersModelFromIOHandler.apply(this, arguments);\n\t}\n\n\tfunction decodeModelAndOptimizerWeights(buffer, specs) {\n\t  var name2Tensor = decodeWeights(buffer, specs);\n\t  var modelWeights = {};\n\t  var optimizerWeights = [];\n\t  specs.forEach(function (spec) {\n\t    if (spec.group === 'optimizer') {\n\t      optimizerWeights.push({\n\t        name: spec.name,\n\t        tensor: name2Tensor[spec.name]\n\t      });\n\t    } else {\n\t      modelWeights[spec.name] = name2Tensor[spec.name];\n\t    }\n\t  });\n\t  return {\n\t    modelWeights: modelWeights,\n\t    optimizerWeights: optimizerWeights\n\t  };\n\t}\n\t/**\n\t * A model with a stack of layers, feeding linearly from one to the next.\n\t *\n\t * `tf.sequential` is a factory function that creates an instance of\n\t * `tf.Sequential`.\n\t *\n\t * ```js\n\t *  // Define a model for linear regression.\n\t *  const model = tf.sequential();\n\t *  model.add(tf.layers.dense({units: 1, inputShape: [1]}));\n\t *\n\t *  // Prepare the model for training: Specify the loss and the optimizer.\n\t *  model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});\n\t *\n\t *  // Generate some synthetic data for training.\n\t *  const xs = tf.tensor2d([1, 2, 3, 4], [4, 1]);\n\t *  const ys = tf.tensor2d([1, 3, 5, 7], [4, 1]);\n\t *\n\t *  // Train the model using the data then do inference on a data point the\n\t *  // model hasn't seen:\n\t *  await model.fit(xs, ys);\n\t *  model.predict(tf.tensor2d([5], [1, 1])).print();\n\t * ```\n\t *\n\t * @doc {heading: 'Models', subheading: 'Classes'}\n\t */\n\n\n\tvar Sequential = /*#__PURE__*/function (_LayersModel) {\n\t  _inheritsLoose(Sequential, _LayersModel);\n\n\t  function Sequential(args) {\n\t    var _this;\n\n\t    _this = _LayersModel.call(this, {\n\t      inputs: [],\n\t      outputs: []\n\t    }) || this;\n\t    args = args || {};\n\t    _this.trainable = true;\n\t    _this.built = false; // Set model name.\n\n\t    _this.name = args.name != null ? args.name : getUid('sequential_'); // Add to the model any layers passed to the constructor.\n\n\t    if (args.layers != null) {\n\t      for (var _iterator = _createForOfIteratorHelperLoose(args.layers), _step; !(_step = _iterator()).done;) {\n\t        var layer = _step.value;\n\n\t        _this.add(layer);\n\t      }\n\t    }\n\n\t    return _this;\n\t  } // Helper function to Sequential.add  Throws if the new output shape will be\n\t  // invalid.\n\n\n\t  var _proto = Sequential.prototype;\n\n\t  _proto.checkShape = function checkShape(layer) {\n\t    var shape = layer.inboundNodes[0].outputTensors[0].shape;\n\n\t    if (shape.some(function (x) {\n\t      return x < 0;\n\t    })) {\n\t      throw new ValueError('Negative dimension size caused by adding layer ' + (layer.name + \" with input shape [\") + (layer.inboundNodes[0].inputTensors[0].shape + \"]\"));\n\t    }\n\t  }\n\t  /**\n\t   * Adds a layer instance on top of the layer stack.\n\t   *\n\t   * ```js\n\t   *  const model = tf.sequential();\n\t   *  model.add(tf.layers.dense({units: 8, inputShape: [1]}));\n\t   *  model.add(tf.layers.dense({units: 4, activation: 'relu6'}));\n\t   *  model.add(tf.layers.dense({units: 1, activation: 'relu6'}));\n\t   *  // Note that the untrained model is random at this point.\n\t   *  model.predict(tf.randomNormal([10, 1])).print();\n\t   * ```\n\t   * @param layer Layer instance.\n\t   *\n\t   * @exception ValueError In case the `layer` argument does not know its\n\t   * input shape.\n\t   * @exception ValueError In case the `layer` argument has multiple output\n\t   *   tensors, or is already connected somewhere else (forbidden in\n\t   *   `Sequential` models).\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.add = function add(layer) {\n\t    var isLayerModelInstance = layer instanceof Sequential || layer instanceof LayersModel;\n\t    var modelLayer;\n\n\t    if (isLayerModelInstance) {\n\t      modelLayer = layer;\n\n\t      if (modelLayer.outputs.length !== 1) {\n\t        throw new ValueError('All layers in a Sequential model ' + 'should have a single output tensor. ' + 'For multi-output layers, ' + 'use the functional API.');\n\t      }\n\n\t      if (modelLayer.inputs.length !== 1) {\n\t        throw new ValueError('All layers in a Sequential model ' + 'should have a single input tensor. ' + 'For multi-input layers, ' + 'use the functional API.');\n\t      }\n\t    }\n\n\t    if (this.outputs.length === 0) {\n\t      // first layer in model: check that it is an input layer\n\t      if (layer.inboundNodes.length === 0) {\n\t        // create an input layer\n\t        if (layer.batchInputShape == null) {\n\t          throw new ValueError('The first layer in a Sequential model must ' + 'get an `inputShape` or `batchInputShape` argument.');\n\t        } // Instantiate the input layer.\n\n\n\t        var x = Input({\n\t          batchShape: layer.batchInputShape,\n\t          dtype: layer.dtype,\n\t          name: layer.name + '_input'\n\t        }); // This will build the current layer and create the node connecting\n\t        // the current layer to the input layer we just created.\n\n\t        layer.apply(x);\n\t      }\n\n\t      if (isLayerModelInstance) {\n\t        this.outputs = modelLayer.outputs;\n\t        this.inputs = modelLayer.inputs;\n\t      } else {\n\t        if (layer.inboundNodes.length !== 1) {\n\t          throw new ValueError('A layer added to a Sequential model must not already be ' + (\"connected somewhere else. LayersModel received layer \" + layer.name + \" \") + (\"which has \" + layer.inboundNodes.length + \" pre-existing inbound \") + 'connections.');\n\t        }\n\n\t        if (layer.inboundNodes[0].outputTensors.length !== 1) {\n\t          throw new ValueError('All layers in a Sequential model ' + 'should have a single output tensor. ' + 'For multi-output layers, ' + 'use the functional API.');\n\t        }\n\n\t        this.checkShape(layer);\n\t        this.outputs = [layer.inboundNodes[0].outputTensors[0]];\n\t        this.inputs = getSourceInputs(this.outputs[0]);\n\t      }\n\n\t      this.inboundNodes = []; // We create an input node, which we will keep updated\n\t      // as we add more layers.\n\t      // (This call has side effects.)\n\t      // tslint:disable-next-line:no-unused-expression\n\n\t      new Node({\n\t        outboundLayer: this,\n\t        inboundLayers: [],\n\t        nodeIndices: [],\n\t        tensorIndices: [],\n\t        inputTensors: this.inputs,\n\t        outputTensors: this.outputs,\n\t        // no model-level masking for now\n\t        inputMasks: pyListRepeat(null, this.inputs.length),\n\t        outputMasks: [null],\n\t        inputShapes: this.inputs.map(function (x) {\n\t          return x.shape;\n\t        }),\n\t        outputShapes: this.outputs[0].shape\n\t      });\n\t    } else {\n\t      var outputTensor = layer.apply(this.outputs[0]);\n\n\t      if (Array.isArray(outputTensor)) {\n\t        throw new TypeError('All layers in a Sequential model ' + 'should have a single output tensor. ' + 'For multi-output layers, ' + 'use the functional API.');\n\t      }\n\n\t      this.checkShape(layer);\n\t      this.outputs = [outputTensor]; // update self.inbound_nodes\n\n\t      this.inboundNodes[0].outputTensors = this.outputs;\n\t      this.inboundNodes[0].outputShapes = [this.outputs[0].shape];\n\t    }\n\n\t    this.layers.push(layer);\n\t    this.built = false;\n\t  }\n\t  /**\n\t   * Removes the last layer in the model.\n\t   *\n\t   * @exception TypeError if there are no layers in the model.\n\t   */\n\t  ;\n\n\t  _proto.pop = function pop() {\n\t    if (this.layers.length === 0) {\n\t      throw new TypeError('There are no layers in the model.');\n\t    }\n\n\t    this.layers.pop();\n\n\t    if (this.layers.length === 0) {\n\t      this.outputs = [];\n\t      this.inboundNodes = [];\n\t      this.outboundNodes = [];\n\t    } else {\n\t      var lastLayerIndex = this.layers.length - 1;\n\t      this.layers[lastLayerIndex].outboundNodes = [];\n\t      this.outputs = [this.layers[lastLayerIndex].output]; // update self.inbound_nodes\n\n\t      this.inboundNodes[0].outputTensors = this.outputs;\n\t      this.inboundNodes[0].outputShapes = [this.outputs[0].shape];\n\t    }\n\t  };\n\n\t  _proto.call = function call(inputs, kwargs) {\n\t    if (this.model == null) {\n\t      this.build();\n\t    }\n\n\t    return this.model.call(inputs, kwargs);\n\t  };\n\n\t  _proto.build = function build(inputShape) {\n\t    // Call `getExactlyOneShape` without using its return value,\n\t    // to verify that exactly one input shape is provided.\n\t    getExactlyOneShape(inputShape);\n\n\t    if (this.inputs.length === 0 || this.outputs.length === 0) {\n\t      throw new TypeError('Sequential model cannot be built: model is empty.' + ' Add some layers first.');\n\t    } // actually create the model\n\n\n\t    this.model = new LayersModel({\n\t      inputs: this.inputs,\n\t      outputs: this.outputs[0],\n\t      name: this.name + '_model'\n\t    });\n\t    this.model.trainable = this.trainable; // mirror model attributes\n\n\t    this.supportsMasking = this.model.supportsMasking; // TODO(michaelterry): Add caches\n\n\t    this.inputLayers = this.model.inputLayers;\n\t    this.inputLayersNodeIndices = this.model.inputLayersNodeIndices;\n\t    this.inputLayersTensorIndices = this.model.inputLayersTensorIndices;\n\t    this.outputLayers = this.model.outputLayers;\n\t    this.outputLayersNodeIndices = this.model.outputLayersNodeIndices;\n\t    this.outputLayersTensorIndices = this.model.outputLayersTensorIndices;\n\t    this.nodesByDepth = this.model.nodesByDepth;\n\t    this.containerNodes = this.model.containerNodes;\n\t    this.outputNames = this.model.outputNames;\n\t    this.inputNames = this.model.inputNames; // TODO(michaelterry): Add feedInputNames, feedInputs, if needed.\n\t    // TODO(michaelterry): Add callbackModel if needed.\n\n\t    this.built = true;\n\t  };\n\n\t  _proto.countParams = function countParams() {\n\t    if (!this.built) {\n\t      this.build();\n\t    }\n\n\t    return _LayersModel.prototype.countParams.call(this);\n\t  }\n\t  /**\n\t   * Print a text summary of the Sequential model's layers.\n\t   *\n\t   * The summary includes\n\t   * - Name and type of all layers that comprise the model.\n\t   * - Output shape(s) of the layers\n\t   * - Number of weight parameters of each layer\n\t   * - The total number of trainable and non-trainable parameters of the\n\t   * model.\n\t   *\n\t   * ```js\n\t   * const model = tf.sequential();\n\t   * model.add(\n\t   *     tf.layers.dense({units: 100, inputShape: [10], activation: 'relu'}));\n\t   * model.add(tf.layers.dense({units: 1, activation: 'sigmoid'}));\n\t   *\n\t   * model.summary();\n\t   * ```\n\t   *\n\t   * @param lineLength Custom line length, in number of characters.\n\t   * @param positions Custom widths of each of the columns, as either\n\t   *   fractions of `lineLength` (e.g., `[0.5, 0.75, 1]`) or absolute number\n\t   *   of characters (e.g., `[30, 50, 65]`). Each number corresponds to\n\t   *   right-most (i.e., ending) position of a column.\n\t   * @param printFn Custom print function. Can be used to replace the default\n\t   *   `console.log`. For example, you can use `x => {}` to mute the printed\n\t   *   messages in the console.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.summary = function summary(lineLength, positions, printFn) {\n\t    if (printFn === void 0) {\n\t      printFn = console.log;\n\t    }\n\n\t    if (!this.built) {\n\t      this.build();\n\t    }\n\n\t    _LayersModel.prototype.summary.call(this, lineLength, positions, printFn);\n\t  }\n\t  /**\n\t   * Sets the weights of the model.\n\t   *\n\t   * @param weights Should be a list of Tensors with shapes and types matching\n\t   *   the output of `model.getWeights()`.\n\t   */\n\t  ;\n\n\t  _proto.setWeights = function setWeights(weights) {\n\t    if (this.model == null) {\n\t      this.build();\n\t    }\n\n\t    this.model.setWeights(weights);\n\t  }\n\t  /**\n\t   * Returns the loss value & metrics values for the model in test mode.\n\t   *\n\t   * Loss and metrics are specified during `compile()`, which needs to happen\n\t   * before calls to `evaluate()`.\n\t   *\n\t   * Computation is done in batches.\n\t   *\n\t   * ```js\n\t   * const model = tf.sequential({\n\t   *   layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n\t   * });\n\t   * model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});\n\t   * const result = model.evaluate(tf.ones([8, 10]), tf.ones([8, 1]), {\n\t   *   batchSize: 4,\n\t   * });\n\t   * result.print();\n\t   * ```\n\t   *\n\t   * @param x `tf.Tensor` of test data, or an `Array` of `tf.Tensor`s if the\n\t   * model has multiple inputs.\n\t   * @param y `tf.Tensor` of target data, or an `Array` of `tf.Tensor`s if the\n\t   * model has multiple outputs.\n\t   * @param args A `ModelEvaluateConfig`, containing optional fields.\n\t   *\n\t   * @return `Scalar` test loss (if the model has a single output and no\n\t   *   metrics) or `Array` of `Scalar`s (if the model has multiple outputs\n\t   *   and/or metrics). The attribute `model.metricsNames`\n\t   *   will give you the display labels for the scalar outputs.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.evaluate = function evaluate(x, y, args) {\n\t    if (args === void 0) {\n\t      args = {};\n\t    }\n\n\t    if (!this.built) {\n\t      throw new RuntimeError('The model needs to be compiled before being used.');\n\t    }\n\n\t    return this.model.evaluate(x, y, args);\n\t  } // TODO(cais): Add code snippet below once real dataset objects are\n\t  //   available.\n\n\t  /**\n\t   * Evaluate model using a dataset object.\n\t   *\n\t   * Note: Unlike `evaluate()`, this method is asynchronous (`async`);\n\t   *\n\t   * @param dataset A dataset object. Its `iterator()` method is expected\n\t   *   to generate a dataset iterator object, the `next()` method of which\n\t   *   is expected to produce data batches for evaluation. The return value\n\t   *   of the `next()` call ought to contain a boolean `done` field and a\n\t   *   `value` field. The `value` field is expected to be an array of two\n\t   *   `tf.Tensor`s or an array of two nested `tf.Tensor` structures. The former\n\t   *   case is for models with exactly one input and one output (e.g..\n\t   *   a sequential model). The latter case is for models with multiple\n\t   *   inputs and/or multiple outputs. Of the two items in the array, the\n\t   *   first is the input feature(s) and the second is the output target(s).\n\t   * @param args A configuration object for the dataset-based evaluation.\n\t   * @returns Loss and metric values as an Array of `Scalar` objects.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.evaluateDataset =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _evaluateDataset = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(dataset, args) {\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              if (this.built) {\n\t                _context.next = 2;\n\t                break;\n\t              }\n\n\t              throw new RuntimeError('The model needs to be compiled before being used.');\n\n\t            case 2:\n\t              return _context.abrupt(\"return\", this.model.evaluateDataset(dataset, args));\n\n\t            case 3:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function evaluateDataset(_x8, _x9) {\n\t      return _evaluateDataset.apply(this, arguments);\n\t    }\n\n\t    return evaluateDataset;\n\t  }()\n\t  /**\n\t   * Generates output predictions for the input samples.\n\t   *\n\t   * Computation is done in batches.\n\t   *\n\t   * Note: the \"step\" mode of predict() is currently not supported.\n\t   *   This is because the TensorFow.js core backend is imperative only.\n\t   *\n\t   * ```js\n\t   * const model = tf.sequential({\n\t   *   layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n\t   * });\n\t   * model.predict(tf.ones([2, 10])).print();\n\t   * ```\n\t   *\n\t   * @param x The input data, as a Tensor, or an `Array` of `tf.Tensor`s if\n\t   *   the model has multiple inputs.\n\t   * @param conifg A `ModelPredictConfig` object containing optional fields.\n\t   *\n\t   * @return `tf.Tensor`(s) of predictions.\n\t   *\n\t   * @exception ValueError In case of mismatch between the provided input data\n\t   *   and the model's expectations, or in case a stateful model receives a\n\t   *   number of samples that is not a multiple of the batch size.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.predict = function predict(x, args) {\n\t    if (args === void 0) {\n\t      args = {};\n\t    }\n\n\t    if (this.model == null) {\n\t      this.build();\n\t    }\n\n\t    return this.model.predict(x, args);\n\t  }\n\t  /**\n\t   * Returns predictions for a single batch of samples.\n\t   *\n\t   * @param x: Input samples, as a Tensor, or list of Tensors (if the model\n\t   *   has multiple inputs).\n\t   * @return Tensor(s) of predictions\n\t   */\n\t  ;\n\n\t  _proto.predictOnBatch = function predictOnBatch(x) {\n\t    if (this.model == null) {\n\t      this.build();\n\t    }\n\n\t    return this.model.predictOnBatch(x);\n\t  }\n\t  /**\n\t   * See `LayersModel.compile`.\n\t   *\n\t   * @param args\n\t   */\n\t  ;\n\n\t  _proto.compile = function compile(args) {\n\t    this.build();\n\t    this.model.compile(args);\n\t    this.optimizer_ = this.model.optimizer; // tslint:disable-next-line:no-any\n\n\t    this.isOptimizerOwned = this.model.isOptimizerOwned;\n\t    this.loss = this.model.loss;\n\t    this.metrics = this.model.metrics; // TODO(cais): Add this.lossWeights, this.sampleWeightMode,\n\t    //   this.weightedMetrics, this.targets.\n\n\t    this.metricsTensors = this.model.metricsTensors;\n\t    this.metricsNames = this.model.metricsNames; // TODO(cais): Add sampleWeights.\n\t  };\n\n\t  /**\n\t   * Trains the model for a fixed number of epochs (iterations on a dataset).\n\t   *\n\t   * ```js\n\t   * const model = tf.sequential({\n\t   *   layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n\t   * });\n\t   * model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});\n\t   * const history = await model.fit(tf.ones([8, 10]), tf.ones([8, 1]), {\n\t   *   batchSize: 4,\n\t   *   epochs: 3\n\t   * });\n\t   * console.log(history.history.loss[0]);\n\t   * ```\n\t   *\n\t   * @param x `tf.Tensor` of training data, or an array of `tf.Tensor`s if the\n\t   * model has multiple inputs. If all inputs in the model are named, you can\n\t   * also pass a dictionary mapping input names to `tf.Tensor`s.\n\t   * @param y `tf.Tensor` of target (label) data, or an array of `tf.Tensor`s if\n\t   * the model has multiple outputs. If all outputs in the model are named, you\n\t   *  can also pass a dictionary mapping output names to `tf.Tensor`s.\n\t   * @param args  A `ModelFitConfig`, containing optional fields.\n\t   *\n\t   * @return A `History` instance. Its `history` attribute contains all\n\t   *   information collected during training.\n\t   *\n\t   * @exception ValueError In case of mismatch between the provided input data\n\t   *   and what the model expects.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes'}\n\t   */\n\t  _proto.fit =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _fit = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(x, y, args) {\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              if (args === void 0) {\n\t                args = {};\n\t              }\n\n\t              if (this.built) {\n\t                _context2.next = 3;\n\t                break;\n\t              }\n\n\t              throw new RuntimeError('The model needs to be compiled before ' + 'being used.');\n\n\t            case 3:\n\t              return _context2.abrupt(\"return\", this.model.fit(x, y, args));\n\n\t            case 4:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function fit(_x10, _x11, _x12) {\n\t      return _fit.apply(this, arguments);\n\t    }\n\n\t    return fit;\n\t  }()\n\t  /**\n\t   * Trains the model using a dataset object.\n\t   *\n\t   * ```js\n\t   * const xArray = [\n\t   *   [1, 1, 1, 1, 1, 1, 1, 1, 1],\n\t   *   [1, 1, 1, 1, 1, 1, 1, 1, 1],\n\t   *   [1, 1, 1, 1, 1, 1, 1, 1, 1],\n\t   *   [1, 1, 1, 1, 1, 1, 1, 1, 1],\n\t   * ];\n\t   * const yArray = [1, 1, 1, 1];\n\t   * // Create a dataset from the JavaScript array.\n\t   * const xDataset = tf.data.array(xArray);\n\t   * const yDataset = tf.data.array(yArray);\n\t   * // Zip combines the `x` and `y` Datasets into a single Dataset, the\n\t   * // iterator of which will return an object containing of two tensors,\n\t   * // corresponding to `x` and `y`.  The call to `batch(4)` will bundle\n\t   * // four such samples into a single object, with the same keys now pointing\n\t   * // to tensors that hold 4 examples, organized along the batch dimension.\n\t   * // The call to `shuffle(4)` causes each iteration through the dataset to\n\t   * // happen in a different order.  The size of the shuffle window is 4.\n\t   * const xyDataset = tf.data.zip({xs: xDataset, ys: yDataset})\n\t   *     .batch(4)\n\t   *     .shuffle(4);\n\t   * const model = tf.sequential({\n\t   *   layers: [tf.layers.dense({units: 1, inputShape: [9]})]\n\t   * });\n\t   * model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});\n\t   * const history = await model.fitDataset(xyDataset, {\n\t   *   epochs: 4,\n\t   *   callbacks: {onEpochEnd: (epoch, logs) => console.log(logs.loss)}\n\t   * });\n\t   * ```\n\t   *\n\t   * @param dataset A dataset object. Its `iterator()` method is expected to\n\t   *   generate a dataset iterator object, the `next()` method of which is\n\t   *   expected to produce data batches for evaluation. The return value of the\n\t   *   `next()` call ought to contain a boolean `done` field and a `value`\n\t   *   field.\n\t   *\n\t   *   The `value` field is expected to be an object of with fields\n\t   *   `xs` and `ys`, which point to the feature tensor and the target tensor,\n\t   *   respectively. This case is for models with exactly one input and one\n\t   *   output (e.g.. a sequential model). For example:\n\t   *   ```js\n\t   *   {value: {xs: xsTensor, ys: ysTensor}, done: false}\n\t   *   ```\n\t   *\n\t   *   If the model has multiple inputs, the `xs` field of `value` should\n\t   *   be an object mapping input names to their respective feature tensors.\n\t   *   For example:\n\t   *   ```js\n\t   *   {\n\t   *     value: {\n\t   *       xs: {\n\t   *         input_1: xsTensor1,\n\t   *         input_2: xsTensor2\n\t   *       },\n\t   *       ys: ysTensor\n\t   *     },\n\t   *     done: false\n\t   *   }\n\t   *   ```\n\t   *   If the model has multiple outputs, the `ys` field of `value` should\n\t   *   be an object mapping output names to their respective target tensors.\n\t   *   For example:\n\t   *   ```js\n\t   *   {\n\t   *     value: {\n\t   *       xs: xsTensor,\n\t   *       ys: {\n\t   *         output_1: ysTensor1,\n\t   *         output_2: ysTensor2\n\t   *       },\n\t   *     },\n\t   *     done: false\n\t   *   }\n\t   *   ```\n\t   * @param args A `ModelFitDatasetArgs`, containing optional fields.\n\t   *\n\t   * @return A `History` instance. Its `history` attribute contains all\n\t   *   information collected during training.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes', ignoreCI: true}\n\t   */\n\t  ;\n\n\t  _proto.fitDataset =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _fitDataset = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(dataset, args) {\n\t      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t        while (1) {\n\t          switch (_context3.prev = _context3.next) {\n\t            case 0:\n\t              if (this.built) {\n\t                _context3.next = 2;\n\t                break;\n\t              }\n\n\t              throw new RuntimeError('The model needs to be compiled before ' + 'being used.');\n\n\t            case 2:\n\t              return _context3.abrupt(\"return\", this.model.fitDataset(dataset, args));\n\n\t            case 3:\n\t            case \"end\":\n\t              return _context3.stop();\n\t          }\n\t        }\n\t      }, _callee3, this);\n\t    }));\n\n\t    function fitDataset(_x13, _x14) {\n\t      return _fitDataset.apply(this, arguments);\n\t    }\n\n\t    return fitDataset;\n\t  }()\n\t  /**\n\t   * Runs a single gradient update on a single batch of data.\n\t   *\n\t   * This method differs from `fit()` and `fitDataset()` in the following\n\t   * regards:\n\t   *   - It operates on exactly one batch of data.\n\t   *   - It returns only the loss and matric values, instead of\n\t   *     returning the batch-by-batch loss and metric values.\n\t   *   - It doesn't support fine-grained options such as verbosity and\n\t   *     callbacks.\n\t   *\n\t   * @param x Input data. It could be one of the following:\n\t   *   - A `tf.Tensor`, or an Array of `tf.Tensor`s (in case the model has\n\t   *     multiple inputs).\n\t   *   - An Object mapping input names to corresponding `tf.Tensor` (if the\n\t   *     model has named inputs).\n\t   * @param y Target darta. It could be either a `tf.Tensor` a multiple\n\t   *   `tf.Tensor`s. It should be consistent with `x`.\n\t   * @returns Training loss or losses (in case the model has\n\t   *   multiple outputs), along with metrics (if any), as numbers.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.trainOnBatch =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _trainOnBatch = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(x, y) {\n\t      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n\t        while (1) {\n\t          switch (_context4.prev = _context4.next) {\n\t            case 0:\n\t              return _context4.abrupt(\"return\", this.model.trainOnBatch(x, y));\n\n\t            case 1:\n\t            case \"end\":\n\t              return _context4.stop();\n\t          }\n\t        }\n\t      }, _callee4, this);\n\t    }));\n\n\t    function trainOnBatch(_x15, _x16) {\n\t      return _trainOnBatch.apply(this, arguments);\n\t    }\n\n\t    return trainOnBatch;\n\t  }()\n\t  /* See parent class for JsDoc */\n\n\t  /** @nocollapse */\n\t  ;\n\n\t  Sequential.fromConfig = function fromConfig(cls, config, customObjects, fastWeightInit) {\n\t    if (customObjects === void 0) {\n\t      customObjects = {};\n\t    }\n\n\t    if (fastWeightInit === void 0) {\n\t      fastWeightInit = false;\n\t    }\n\n\t    var configArray;\n\t    var extraModelConfig = {};\n\n\t    if (config instanceof Array) {\n\t      if (!(config[0].className != null) || config[0]['className'] === 'Merge') {\n\t        throw new ValueError('Legacy serialization format not supported yet.');\n\t      }\n\n\t      configArray = config;\n\t    } else {\n\t      assert(config['layers'] != null, function () {\n\t        return \"When the config data for a Sequential model is not an Array, \" + \"it must be an Object that contains the 'layers' field.\";\n\t      });\n\t      configArray = config['layers'];\n\t      delete config['layers'];\n\t      extraModelConfig = config;\n\t    }\n\n\t    var model = new cls(extraModelConfig);\n\n\t    if (!(model instanceof Sequential)) {\n\t      throw new NotImplementedError(\"Sequential.fromConfig called on non-Sequential input: \" + model);\n\t    }\n\n\t    for (var _iterator2 = _createForOfIteratorHelperLoose(configArray), _step2; !(_step2 = _iterator2()).done;) {\n\t      var conf = _step2.value;\n\t      var _customObjects = undefined;\n\t      var layer = deserialize$1(conf, _customObjects, fastWeightInit);\n\n\t      if (fastWeightInit) {\n\t        layer.setFastWeightInitDuringBuild(true);\n\t      }\n\n\t      model.add(layer);\n\t    }\n\n\t    return model;\n\t  }\n\t  /**\n\t   * Setter used for force stopping of LayersModel.fit() (i.e., training).\n\t   *\n\t   * Example:\n\t   *\n\t   * ```js\n\t   * const model = tf.sequential();\n\t   * model.add(tf.layers.dense({units: 1, inputShape: [10]}));\n\t   * model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});\n\t   * const xs = tf.ones([8, 10]);\n\t   * const ys = tf.zeros([8, 1]);\n\t   *\n\t   * const history = await model.fit(xs, ys, {\n\t   *   epochs: 10,\n\t   *   callbacks: {\n\t   *     onEpochEnd: async (epoch, logs) => {\n\t   *       if (epoch === 2) {\n\t   *         model.stopTraining = true;\n\t   *       }\n\t   *     }\n\t   *   }\n\t   * });\n\t   *\n\t   * // There should be only 3 values in the loss array, instead of 10 values,\n\t   * // due to the stopping after 3 epochs.\n\t   * console.log(history.history.loss);\n\t   * ```\n\t   */\n\t  ;\n\n\t  // TODO(cais): Override get trainableWeights() here\n\t  // tslint:disable-next-line:no-any\n\t  _proto.getConfig = function getConfig() {\n\t    // NOTE(cais): We override the return type of getConfig() to `any` here,\n\t    //   because the `Sequential` class is a special case among `Container`\n\t    //   subtypes in that its getConfig() method returns an Array (not a\n\t    //   dict).\n\t    var layers = [];\n\n\t    for (var _iterator3 = _createForOfIteratorHelperLoose(this.layers), _step3; !(_step3 = _iterator3()).done;) {\n\t      var layer = _step3.value;\n\t      var dict = {};\n\t      dict['className'] = layer.getClassName();\n\t      dict['config'] = layer.getConfig();\n\t      layers.push(dict);\n\t    }\n\n\t    return {\n\t      name: this.name,\n\t      layers: layers\n\t    };\n\t  };\n\n\t  _createClass(Sequential, [{\n\t    key: \"optimizer\",\n\t    get: function get() {\n\t      return this.model == null ? undefined : this.model.optimizer;\n\t    },\n\t    set: function set(optimizer) {\n\t      this.model.optimizer = optimizer;\n\t    }\n\t  }, {\n\t    key: \"stopTraining\",\n\t    set: function set(stop) {\n\t      // TODO(cais): When refactoring to remove the composition pattern happens,\n\t      // remove this method overriding.\n\t      if (this.model == null) {\n\t        throw new ValueError('Cannot set the stopTraining property of a sequential model before ' + 'it is compiled.');\n\t      }\n\n\t      this.model.stopTraining = stop;\n\t    },\n\t    get: function get() {\n\t      if (this.model == null) {\n\t        throw new ValueError('Cannot get the stopTraining property of a sequential model before ' + 'it is compiled.');\n\t      }\n\n\t      return this.model.stopTraining;\n\t    }\n\t  }]);\n\n\t  return Sequential;\n\t}(LayersModel);\n\t/** @nocollapse */\n\n\tSequential.className = 'Sequential';\n\tregisterClass(Sequential);\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\t//   class; include exectuable JavaScript code snippets where applicable\n\t//   (b/74074458).\n\t// LayersModel and related factory methods.\n\n\t/**\n\t * A model is a data structure that consists of `Layers` and defines inputs\n\t * and outputs.\n\t *\n\t * The key difference between `tf.model` and `tf.sequential` is that\n\t * `tf.model` is more generic, supporting an arbitrary graph (without\n\t * cycles) of layers. `tf.sequential` is less generic and supports only a linear\n\t * stack of layers.\n\t *\n\t * When creating a `tf.LayersModel`, specify its input(s) and output(s). Layers\n\t * are used to wire input(s) to output(s).\n\t *\n\t * For example, the following code snippet defines a model consisting of\n\t * two `dense` layers, with 10 and 4 units, respectively.\n\t *\n\t * ```js\n\t * // Define input, which has a size of 5 (not including batch dimension).\n\t * const input = tf.input({shape: [5]});\n\t *\n\t * // First dense layer uses relu activation.\n\t * const denseLayer1 = tf.layers.dense({units: 10, activation: 'relu'});\n\t * // Second dense layer uses softmax activation.\n\t * const denseLayer2 = tf.layers.dense({units: 4, activation: 'softmax'});\n\t *\n\t * // Obtain the output symbolic tensor by applying the layers on the input.\n\t * const output = denseLayer2.apply(denseLayer1.apply(input));\n\t *\n\t * // Create the model based on the inputs.\n\t * const model = tf.model({inputs: input, outputs: output});\n\t *\n\t * // The model can be used for training, evaluation and prediction.\n\t * // For example, the following line runs prediction with the model on\n\t * // some fake data.\n\t * model.predict(tf.ones([2, 5])).print();\n\t * ```\n\t * See also:\n\t *   `tf.sequential`, `tf.loadLayersModel`.\n\t *\n\t * @doc {heading: 'Models', subheading: 'Creation'}\n\t */\n\n\tfunction model(args) {\n\t  return new LayersModel(args);\n\t}\n\t/**\n\t * Creates a `tf.Sequential` model.  A sequential model is any model where the\n\t * outputs of one layer are the inputs to the next layer, i.e. the model\n\t * topology is a simple 'stack' of layers, with no branching or skipping.\n\t *\n\t * This means that the first layer passed to a `tf.Sequential` model should have\n\t * a defined input shape. What that means is that it should have received an\n\t * `inputShape` or `batchInputShape` argument, or for some type of layers\n\t * (recurrent, Dense...) an `inputDim` argument.\n\t *\n\t * The key difference between `tf.model` and `tf.sequential` is that\n\t * `tf.sequential` is less generic, supporting only a linear stack of layers.\n\t * `tf.model` is more generic and supports an arbitrary graph (without\n\t * cycles) of layers.\n\t *\n\t * Examples:\n\t *\n\t * ```js\n\t * const model = tf.sequential();\n\t *\n\t * // First layer must have an input shape defined.\n\t * model.add(tf.layers.dense({units: 32, inputShape: [50]}));\n\t * // Afterwards, TF.js does automatic shape inference.\n\t * model.add(tf.layers.dense({units: 4}));\n\t *\n\t * // Inspect the inferred shape of the model's output, which equals\n\t * // `[null, 4]`. The 1st dimension is the undetermined batch dimension; the\n\t * // 2nd is the output size of the model's last layer.\n\t * console.log(JSON.stringify(model.outputs[0].shape));\n\t * ```\n\t *\n\t * It is also possible to specify a batch size (with potentially undetermined\n\t * batch dimension, denoted by \"null\") for the first layer using the\n\t * `batchInputShape` key. The following example is equivalent to the above:\n\t *\n\t * ```js\n\t * const model = tf.sequential();\n\t *\n\t * // First layer must have a defined input shape\n\t * model.add(tf.layers.dense({units: 32, batchInputShape: [null, 50]}));\n\t * // Afterwards, TF.js does automatic shape inference.\n\t * model.add(tf.layers.dense({units: 4}));\n\t *\n\t * // Inspect the inferred shape of the model's output.\n\t * console.log(JSON.stringify(model.outputs[0].shape));\n\t * ```\n\t *\n\t * You can also use an `Array` of already-constructed `Layer`s to create\n\t * a `tf.Sequential` model:\n\t *\n\t * ```js\n\t * const model = tf.sequential({\n\t *   layers: [tf.layers.dense({units: 32, inputShape: [50]}),\n\t *            tf.layers.dense({units: 4})]\n\t * });\n\t * console.log(JSON.stringify(model.outputs[0].shape));\n\t * ```\n\t *\n\t * @doc {heading: 'Models', subheading: 'Creation'}\n\t */\n\n\tfunction sequential(config) {\n\t  return new Sequential(config);\n\t}\n\t/**\n\t * Load a model composed of Layer objects, including its topology and optionally\n\t * weights. See the Tutorial named \"How to import a Keras Model\" for usage\n\t * examples.\n\t *\n\t * This method is applicable to:\n\t *\n\t * 1. Models created with the `tf.layers.*`, `tf.sequential`, and\n\t * `tf.model` APIs of TensorFlow.js and later saved with the\n\t * `tf.LayersModel.save` method.\n\t * 2. Models converted from Keras or TensorFlow tf.keras using the\n\t * [tensorflowjs_converter](https://github.com/tensorflow/tfjs/tree/master/tfjs-converter).\n\t *\n\t * This mode is *not* applicable to TensorFlow `SavedModel`s or their converted\n\t * forms. For those models, use `tf.loadGraphModel`.\n\t *\n\t * Example 1. Load a model from an HTTP server.\n\t *\n\t * ```js\n\t * const model = await tf.loadLayersModel(\n\t *     'https://storage.googleapis.com/tfjs-models/tfjs/iris_v1/model.json');\n\t * model.summary();\n\t * ```\n\t *\n\t * Example 2: Save `model`'s topology and weights to browser [local\n\t * storage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage);\n\t * then load it back.\n\t *\n\t * ```js\n\t * const model = tf.sequential(\n\t *     {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n\t * console.log('Prediction from original model:');\n\t * model.predict(tf.ones([1, 3])).print();\n\t *\n\t * const saveResults = await model.save('localstorage://my-model-1');\n\t *\n\t * const loadedModel = await tf.loadLayersModel('localstorage://my-model-1');\n\t * console.log('Prediction from loaded model:');\n\t * loadedModel.predict(tf.ones([1, 3])).print();\n\t * ```\n\t *\n\t * Example 3. Saving `model`'s topology and weights to browser\n\t * [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API);\n\t * then load it back.\n\t *\n\t * ```js\n\t * const model = tf.sequential(\n\t *     {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n\t * console.log('Prediction from original model:');\n\t * model.predict(tf.ones([1, 3])).print();\n\t *\n\t * const saveResults = await model.save('indexeddb://my-model-1');\n\t *\n\t * const loadedModel = await tf.loadLayersModel('indexeddb://my-model-1');\n\t * console.log('Prediction from loaded model:');\n\t * loadedModel.predict(tf.ones([1, 3])).print();\n\t * ```\n\t *\n\t * Example 4. Load a model from user-selected files from HTML\n\t * [file input\n\t * elements](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file).\n\t *\n\t * ```js\n\t * // Note: this code snippet will not work without the HTML elements in the\n\t * //   page\n\t * const jsonUpload = document.getElementById('json-upload');\n\t * const weightsUpload = document.getElementById('weights-upload');\n\t *\n\t * const model = await tf.loadLayersModel(\n\t *     tf.io.browserFiles([jsonUpload.files[0], weightsUpload.files[0]]));\n\t * ```\n\t *\n\t * @param pathOrIOHandler Can be either of the two formats\n\t *   1. A string path to the `ModelAndWeightsConfig` JSON describing\n\t *      the model in the canonical TensorFlow.js format. For file://\n\t *      (tfjs-node-only), http:// and https:// schemas, the path can be\n\t *      either absolute or relative.\n\t *   2. An `tf.io.IOHandler` object that loads model artifacts with its `load`\n\t *      method.\n\t * @param options Optional configuration arguments for the model loading,\n\t *   including:\n\t *   - `strict`: Require that the provided weights exactly match those required\n\t *     by the layers.  Default true.  Passing false means that both extra\n\t *     weights and missing weights will be silently ignored.\n\t *   - `onProgress`: A function of the signature `(fraction: number) => void',\n\t *     that can be used as the progress callback for the model loading.\n\t * @returns A `Promise` of `tf.LayersModel`, with the topology and weights\n\t *     loaded.\n\t *\n\t * @doc {heading: 'Models', subheading: 'Loading'}\n\t */\n\n\tfunction loadLayersModel(pathOrIOHandler, options) {\n\t  if (options == null) {\n\t    options = {};\n\t  }\n\n\t  return loadLayersModelInternal(pathOrIOHandler, options);\n\t}\n\t/**\n\t * Used to instantiate an input to a model as a `tf.SymbolicTensor`.\n\t *\n\t * Users should call the `input` factory function for\n\t * consistency with other generator functions.\n\t *\n\t * Example:\n\t *\n\t * ```js\n\t * // Defines a simple logistic regression model with 32 dimensional input\n\t * // and 3 dimensional output.\n\t * const x = tf.input({shape: [32]});\n\t * const y = tf.layers.dense({units: 3, activation: 'softmax'}).apply(x);\n\t * const model = tf.model({inputs: x, outputs: y});\n\t * model.predict(tf.ones([2, 32])).print();\n\t * ```\n\t *\n\t * Note: `input` is only necessary when using `model`. When using\n\t * `sequential`, specify `inputShape` for the first layer or use `inputLayer`\n\t * as the first layer.\n\t *\n\t * @doc {heading: 'Models', subheading: 'Inputs'}\n\t */\n\n\tfunction input(config) {\n\t  return Input(config);\n\t}\n\tfunction registerCallbackConstructor(verbosityLevel, callbackConstructor) {\n\t  CallbackConstructorRegistry.registerCallbackConstructor(verbosityLevel, callbackConstructor);\n\t}\n\n\t/**\n\t * Base class for Activations.\n\t *\n\t * Special note: due to cross-language compatibility reasons, the\n\t * static readonly className field in this family of classes must be set to\n\t * the initialLowerCamelCase name of the activation.\n\t */\n\n\tvar Activation = /*#__PURE__*/function (_serialization$Serial) {\n\t  _inheritsLoose(Activation, _serialization$Serial);\n\n\t  function Activation() {\n\t    return _serialization$Serial.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto = Activation.prototype;\n\n\t  _proto.getConfig = function getConfig() {\n\t    return {};\n\t  };\n\n\t  return Activation;\n\t}(Serializable);\n\t/**\n\t * Exponential linear unit (ELU).\n\t * Reference: https://arxiv.org/abs/1511.07289\n\t */\n\n\tvar Elu$1 = /*#__PURE__*/function (_Activation) {\n\t  _inheritsLoose(Elu, _Activation);\n\n\t  function Elu() {\n\t    return _Activation.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto2 = Elu.prototype;\n\n\t  /**\n\t   * Calculate the activation function.\n\t   *\n\t   * @param x: Input.\n\t   * @param alpha: Scaling factor the negative section.\n\t   * @return Output of the ELU activation.\n\t   */\n\t  _proto2.apply = function apply(x, alpha) {\n\t    if (alpha === void 0) {\n\t      alpha = 1;\n\t    }\n\n\t    return elu$1(x, alpha);\n\t  };\n\n\t  return Elu;\n\t}(Activation);\n\t/** @nocollapse */\n\n\tElu$1.className = 'elu';\n\tregisterClass(Elu$1);\n\t/**\n\t * Scaled Exponential Linear Unit. (Klambauer et al., 2017).\n\t * Reference: Self-Normalizing Neural Networks, https://arxiv.org/abs/1706.02515\n\t * Notes:\n\t *   - To be used together with the initialization \"lecunNormal\".\n\t *   - To be used together with the dropout variant \"AlphaDropout\".\n\t */\n\n\tvar Selu$1 = /*#__PURE__*/function (_Activation2) {\n\t  _inheritsLoose(Selu, _Activation2);\n\n\t  function Selu() {\n\t    return _Activation2.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto3 = Selu.prototype;\n\n\t  _proto3.apply = function apply(x) {\n\t    return selu(x);\n\t  };\n\n\t  return Selu;\n\t}(Activation);\n\t/** @nocollapse */\n\n\tSelu$1.className = 'selu';\n\tregisterClass(Selu$1);\n\t/**\n\t *  Rectified linear unit\n\t */\n\n\tvar Relu$1 = /*#__PURE__*/function (_Activation3) {\n\t  _inheritsLoose(Relu, _Activation3);\n\n\t  function Relu() {\n\t    return _Activation3.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto4 = Relu.prototype;\n\n\t  _proto4.apply = function apply(x) {\n\t    return relu(x);\n\t  };\n\n\t  return Relu;\n\t}(Activation);\n\t/** @nocollapse */\n\n\tRelu$1.className = 'relu';\n\tregisterClass(Relu$1);\n\t/**\n\t * Rectified linear unit activation maxing out at 6.0.\n\t */\n\n\tvar Relu6$1 = /*#__PURE__*/function (_Activation4) {\n\t  _inheritsLoose(Relu6, _Activation4);\n\n\t  function Relu6() {\n\t    return _Activation4.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto5 = Relu6.prototype;\n\n\t  _proto5.apply = function apply(x) {\n\t    return tidy(function () {\n\t      return minimum(6.0, relu(x));\n\t    });\n\t  };\n\n\t  return Relu6;\n\t}(Activation);\n\t/** @nocollapse */\n\n\tRelu6$1.className = 'relu6';\n\tregisterClass(Relu6$1); //* Linear activation (no-op) */\n\n\tvar Linear = /*#__PURE__*/function (_Activation5) {\n\t  _inheritsLoose(Linear, _Activation5);\n\n\t  function Linear() {\n\t    return _Activation5.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto6 = Linear.prototype;\n\n\t  _proto6.apply = function apply(x) {\n\t    return x;\n\t  };\n\n\t  return Linear;\n\t}(Activation);\n\t/** @nocollapse */\n\n\tLinear.className = 'linear';\n\tregisterClass(Linear);\n\t/**\n\t * Sigmoid activation function.\n\t */\n\n\tvar Sigmoid$1 = /*#__PURE__*/function (_Activation6) {\n\t  _inheritsLoose(Sigmoid, _Activation6);\n\n\t  function Sigmoid() {\n\t    return _Activation6.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto7 = Sigmoid.prototype;\n\n\t  _proto7.apply = function apply(x) {\n\t    return sigmoid(x);\n\t  };\n\n\t  return Sigmoid;\n\t}(Activation);\n\t/** @nocollapse */\n\n\tSigmoid$1.className = 'sigmoid';\n\tregisterClass(Sigmoid$1);\n\t/**\n\t * Segment-wise linear approximation of sigmoid.\n\t */\n\n\tvar HardSigmoid = /*#__PURE__*/function (_Activation7) {\n\t  _inheritsLoose(HardSigmoid, _Activation7);\n\n\t  function HardSigmoid() {\n\t    return _Activation7.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto8 = HardSigmoid.prototype;\n\n\t  _proto8.apply = function apply(x) {\n\t    return hardSigmoid(x);\n\t  };\n\n\t  return HardSigmoid;\n\t}(Activation);\n\t/** @nocollapse */\n\n\tHardSigmoid.className = 'hardSigmoid';\n\tregisterClass(HardSigmoid);\n\t/**\n\t * Softplus activation function.\n\t */\n\n\tvar Softplus$1 = /*#__PURE__*/function (_Activation8) {\n\t  _inheritsLoose(Softplus, _Activation8);\n\n\t  function Softplus() {\n\t    return _Activation8.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto9 = Softplus.prototype;\n\n\t  _proto9.apply = function apply(x) {\n\t    return softplus(x);\n\t  };\n\n\t  return Softplus;\n\t}(Activation);\n\t/** @nocollapse */\n\n\tSoftplus$1.className = 'softplus';\n\tregisterClass(Softplus$1);\n\t/**\n\t * Softsign activation function.\n\t */\n\n\tvar Softsign = /*#__PURE__*/function (_Activation9) {\n\t  _inheritsLoose(Softsign, _Activation9);\n\n\t  function Softsign() {\n\t    return _Activation9.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto10 = Softsign.prototype;\n\n\t  _proto10.apply = function apply(x) {\n\t    return softsign(x);\n\t  };\n\n\t  return Softsign;\n\t}(Activation);\n\t/** @nocollapse */\n\n\tSoftsign.className = 'softsign';\n\tregisterClass(Softsign);\n\t/**\n\t * Hyperbolic tangent function.\n\t */\n\n\tvar Tanh$1 = /*#__PURE__*/function (_Activation10) {\n\t  _inheritsLoose(Tanh, _Activation10);\n\n\t  function Tanh() {\n\t    return _Activation10.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto11 = Tanh.prototype;\n\n\t  _proto11.apply = function apply(x) {\n\t    return tanh$1(x);\n\t  };\n\n\t  return Tanh;\n\t}(Activation);\n\t/** @nocollapse */\n\n\tTanh$1.className = 'tanh';\n\tregisterClass(Tanh$1);\n\t/**\n\t * Softmax activation function\n\t */\n\n\tvar Softmax$1 = /*#__PURE__*/function (_Activation11) {\n\t  _inheritsLoose(Softmax, _Activation11);\n\n\t  function Softmax() {\n\t    return _Activation11.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto12 = Softmax.prototype;\n\n\t  /**\n\t   * Calculate the activation function.\n\t   *\n\t   * @param x Tensor.\n\t   * @param axis Integer, axis along which the softmax normalization is applied.\n\t   * Invalid if < 2, as softmax across 1 (the batch dimension) is assumed to be\n\t   * an error.\n\t   *\n\t   * @returns a Tensor of the same shape as x\n\t   *\n\t   * @throws ValueError: In case `dim(x) < 2`.\n\t   */\n\t  _proto12.apply = function apply(x, axis) {\n\t    if (axis === void 0) {\n\t      axis = -1;\n\t    }\n\n\t    return softmax(x, axis);\n\t  };\n\n\t  return Softmax;\n\t}(Activation);\n\t/** @nocollapse */\n\n\tSoftmax$1.className = 'softmax';\n\tregisterClass(Softmax$1);\n\t/**\n\t * Log softmax activation function\n\t */\n\n\tvar LogSoftmax$1 = /*#__PURE__*/function (_Activation12) {\n\t  _inheritsLoose(LogSoftmax, _Activation12);\n\n\t  function LogSoftmax() {\n\t    return _Activation12.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto13 = LogSoftmax.prototype;\n\n\t  /**\n\t   * Calculate the activation function of log softmax:\n\t   * log( exp(x_i) / sum(exp(x)) )\n\t   *\n\t   * @param x Tensor.\n\t   * @param axis Integer, axis along which the softmax normalization is applied.\n\t   * Invalid if < 2, as softmax across 1 (the batch dimension) is assumed to be\n\t   * an error.\n\t   *\n\t   * @returns a Tensor of the same shape as x\n\t   *\n\t   * @throws ValueError: In case `dim(x) < 2`.\n\t   */\n\t  _proto13.apply = function apply(x, axis) {\n\t    if (axis === void 0) {\n\t      axis = -1;\n\t    }\n\n\t    return logSoftmax(x, axis);\n\t  };\n\n\t  return LogSoftmax;\n\t}(Activation);\n\t/** @nocollapse */\n\n\tLogSoftmax$1.className = 'logSoftmax';\n\tregisterClass(LogSoftmax$1);\n\t/**\n\t * Swish activation function\n\t */\n\n\tvar Swish = /*#__PURE__*/function (_Activation13) {\n\t  _inheritsLoose(Swish, _Activation13);\n\n\t  function Swish() {\n\t    return _Activation13.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto14 = Swish.prototype;\n\n\t  /**\n\t   * Calculate the activation function.\n\t   *\n\t   * @param x Tensor.\n\t   * @param alpha Scaling factor for the sigmoid function.\n\t   * @returns a Tensor of the same shape as x\n\t   */\n\t  _proto14.apply = function apply(x, alpha) {\n\t    if (alpha === void 0) {\n\t      alpha = 1;\n\t    }\n\n\t    return tidy(function () {\n\t      return sigmoid(x.mul(alpha)).mul(x);\n\t    });\n\t  };\n\n\t  return Swish;\n\t}(Activation);\n\t/** @nocollapse */\n\n\tSwish.className = 'swish';\n\tregisterClass(Swish);\n\tfunction serializeActivation(activation) {\n\t  return activation.getClassName();\n\t}\n\tfunction deserializeActivation(config, customObjects) {\n\t  if (customObjects === void 0) {\n\t    customObjects = {};\n\t  }\n\n\t  return deserializeKerasObject(config, SerializationMap.getMap().classNameMap, customObjects, 'activation');\n\t}\n\tfunction getActivation(identifier) {\n\t  if (identifier == null) {\n\t    var config = {};\n\t    config['className'] = 'linear';\n\t    config['config'] = {};\n\t    return deserializeActivation(config);\n\t  }\n\n\t  if (typeof identifier === 'string') {\n\t    var _config = {};\n\t    _config['className'] = identifier;\n\t    _config['config'] = {};\n\t    return deserializeActivation(_config);\n\t  } else if (identifier instanceof Activation) {\n\t    return identifier;\n\t  } else {\n\t    return deserializeActivation(identifier);\n\t  }\n\t}\n\n\tfunction assertObjectArgs(args) {\n\t  if (args != null && typeof args !== 'object') {\n\t    throw new Error(\"Argument to L1L2 regularizer's constructor is expected to be an \" + (\"object, but received: \" + args));\n\t  }\n\t}\n\t/**\n\t * Regularizer base class.\n\t */\n\n\n\tvar Regularizer = /*#__PURE__*/function (_serialization$Serial) {\n\t  _inheritsLoose(Regularizer, _serialization$Serial);\n\n\t  function Regularizer() {\n\t    return _serialization$Serial.apply(this, arguments) || this;\n\t  }\n\n\t  return Regularizer;\n\t}(Serializable);\n\tvar L1L2 = /*#__PURE__*/function (_Regularizer) {\n\t  _inheritsLoose(L1L2, _Regularizer);\n\n\t  function L1L2(args) {\n\t    var _this;\n\n\t    _this = _Regularizer.call(this) || this;\n\t    assertObjectArgs(args);\n\t    _this.l1 = args == null || args.l1 == null ? 0.01 : args.l1;\n\t    _this.l2 = args == null || args.l2 == null ? 0.01 : args.l2;\n\t    _this.hasL1 = _this.l1 !== 0;\n\t    _this.hasL2 = _this.l2 !== 0;\n\t    return _this;\n\t  }\n\t  /**\n\t   * Porting note: Renamed from __call__.\n\t   * @param x Variable of which to calculate the regularization score.\n\t   */\n\n\n\t  var _proto = L1L2.prototype;\n\n\t  _proto.apply = function apply(x) {\n\t    var _this2 = this;\n\n\t    return tidy(function () {\n\t      var regularization = zeros([1]);\n\n\t      if (_this2.hasL1) {\n\t        regularization = add$1(regularization, sum$1(mul(_this2.l1, abs$8(x))));\n\t      }\n\n\t      if (_this2.hasL2) {\n\t        regularization = add$1(regularization, sum$1(mul(_this2.l2, square$1(x))));\n\t      }\n\n\t      return regularization.asScalar();\n\t    });\n\t  };\n\n\t  _proto.getConfig = function getConfig() {\n\t    return {\n\t      'l1': this.l1,\n\t      'l2': this.l2\n\t    };\n\t  }\n\t  /** @nocollapse */\n\t  ;\n\n\t  L1L2.fromConfig = function fromConfig(cls, config) {\n\t    return new cls({\n\t      l1: config['l1'],\n\t      l2: config['l2']\n\t    });\n\t  };\n\n\t  return L1L2;\n\t}(Regularizer);\n\t/** @nocollapse */\n\n\tL1L2.className = 'L1L2';\n\tregisterClass(L1L2);\n\tfunction l1(args) {\n\t  assertObjectArgs(args);\n\t  return new L1L2({\n\t    l1: args != null ? args.l1 : null,\n\t    l2: 0\n\t  });\n\t}\n\tfunction l2(args) {\n\t  assertObjectArgs(args);\n\t  return new L1L2({\n\t    l2: args != null ? args.l2 : null,\n\t    l1: 0\n\t  });\n\t} // Maps the JavaScript-like identifier keys to the corresponding keras symbols.\n\n\tvar REGULARIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP = {\n\t  'l1l2': 'L1L2'\n\t};\n\tfunction serializeRegularizer(constraint) {\n\t  return serializeKerasObject(constraint);\n\t}\n\tfunction deserializeRegularizer(config, customObjects) {\n\t  if (customObjects === void 0) {\n\t    customObjects = {};\n\t  }\n\n\t  return deserializeKerasObject(config, SerializationMap.getMap().classNameMap, customObjects, 'regularizer');\n\t}\n\tfunction getRegularizer(identifier) {\n\t  if (identifier == null) {\n\t    return null;\n\t  }\n\n\t  if (typeof identifier === 'string') {\n\t    var className = identifier in REGULARIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP ? REGULARIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP[identifier] : identifier;\n\t    var config = {\n\t      className: className,\n\t      config: {}\n\t    };\n\t    return deserializeRegularizer(config);\n\t  } else if (identifier instanceof Regularizer) {\n\t    return identifier;\n\t  } else {\n\t    return deserializeRegularizer(identifier);\n\t  }\n\t}\n\n\tvar ReLU = /*#__PURE__*/function (_Layer) {\n\t  _inheritsLoose(ReLU, _Layer);\n\n\t  function ReLU(args) {\n\t    var _this;\n\n\t    _this = _Layer.call(this, args == null ? {} : args) || this;\n\t    _this.supportsMasking = true;\n\n\t    if (args != null) {\n\t      _this.maxValue = args.maxValue;\n\t    }\n\n\t    return _this;\n\t  }\n\n\t  var _proto = ReLU.prototype;\n\n\t  _proto.call = function call(inputs, kwargs) {\n\t    inputs = getExactlyOneTensor(inputs);\n\t    var output = relu(inputs);\n\n\t    if (this.maxValue != null) {\n\t      output = clipByValue(output, 0, this.maxValue);\n\t    }\n\n\t    return output;\n\t  };\n\n\t  _proto.computeOutputShape = function computeOutputShape(inputShape) {\n\t    return inputShape;\n\t  };\n\n\t  _proto.getConfig = function getConfig() {\n\t    var config = {\n\t      maxValue: this.maxValue\n\t    };\n\n\t    var baseConfig = _Layer.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return ReLU;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tReLU.className = 'ReLU';\n\tregisterClass(ReLU);\n\tvar LeakyReLU = /*#__PURE__*/function (_Layer2) {\n\t  _inheritsLoose(LeakyReLU, _Layer2);\n\n\t  function LeakyReLU(args) {\n\t    var _this2;\n\n\t    _this2 = _Layer2.call(this, args == null ? {} : args) || this;\n\t    _this2.DEFAULT_ALPHA = 0.3;\n\n\t    if (args == null) {\n\t      args = {};\n\t    }\n\n\t    _this2.alpha = args.alpha == null ? _this2.DEFAULT_ALPHA : args.alpha;\n\t    return _this2;\n\t  }\n\n\t  var _proto2 = LeakyReLU.prototype;\n\n\t  _proto2.call = function call(inputs, kwargs) {\n\t    var x = getExactlyOneTensor(inputs);\n\t    return leakyRelu(x, this.alpha);\n\t  };\n\n\t  _proto2.computeOutputShape = function computeOutputShape(inputShape) {\n\t    return inputShape;\n\t  };\n\n\t  _proto2.getConfig = function getConfig() {\n\t    var config = {\n\t      alpha: this.alpha\n\t    };\n\n\t    var baseConfig = _Layer2.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return LeakyReLU;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tLeakyReLU.className = 'LeakyReLU';\n\tregisterClass(LeakyReLU);\n\tvar PReLU = /*#__PURE__*/function (_Layer3) {\n\t  _inheritsLoose(PReLU, _Layer3);\n\n\t  function PReLU(args) {\n\t    var _this3;\n\n\t    _this3 = _Layer3.call(this, args == null ? {} : args) || this;\n\t    _this3.DEFAULT_ALPHA_INITIALIZER = 'zeros';\n\n\t    if (args == null) {\n\t      args = {};\n\t    }\n\n\t    _this3.supportsMasking = true;\n\t    _this3.alphaInitializer = getInitializer(args.alphaInitializer || _this3.DEFAULT_ALPHA_INITIALIZER);\n\t    _this3.alphaRegularizer = getRegularizer(args.alphaRegularizer);\n\t    _this3.alphaConstraint = getConstraint(args.alphaConstraint);\n\n\t    if (args.sharedAxes == null) {\n\t      _this3.sharedAxes = null;\n\t    } else if (Array.isArray(args.sharedAxes)) {\n\t      _this3.sharedAxes = args.sharedAxes;\n\t    } else if (typeof args.sharedAxes === 'number') {\n\t      _this3.sharedAxes = [args.sharedAxes];\n\t    } else {\n\t      throw new ValueError(\"Expected sharedAxes to be a number or an array of numbers, \" + (\"but got \" + args.sharedAxes));\n\t    }\n\n\t    return _this3;\n\t  }\n\n\t  var _proto3 = PReLU.prototype;\n\n\t  _proto3.build = function build(inputShape) {\n\t    inputShape = getExactlyOneShape(inputShape);\n\t    var paramShape = inputShape.slice(1);\n\n\t    if (this.sharedAxes != null) {\n\t      for (var _iterator = _createForOfIteratorHelperLoose(this.sharedAxes), _step; !(_step = _iterator()).done;) {\n\t        var i = _step.value;\n\t        paramShape[i - 1] = 1;\n\t      }\n\t    }\n\n\t    this.alpha = this.addWeight('alpha', paramShape, 'float32', this.alphaInitializer, this.alphaRegularizer, true, this.alphaConstraint); // Set input spec.\n\n\t    var axes = {};\n\n\t    if (this.sharedAxes != null) {\n\t      for (var _i = 1; _i < inputShape.length; ++_i) {\n\t        axes[_i] = inputShape[_i];\n\t      }\n\t    }\n\n\t    this.inputSpec = [new InputSpec({\n\t      ndim: inputShape.length,\n\t      axes: axes\n\t    })];\n\t    this.built = true;\n\t  };\n\n\t  _proto3.call = function call(inputs, kwargs) {\n\t    inputs = getExactlyOneTensor(inputs);\n\t    return prelu(inputs, this.alpha.read());\n\t  };\n\n\t  _proto3.getConfig = function getConfig() {\n\t    var config = {\n\t      alphaInitializer: serializeInitializer(this.alphaInitializer),\n\t      alphaRegularizer: serializeRegularizer(this.alphaRegularizer),\n\t      alphaConstraint: serializeConstraint(this.alphaConstraint),\n\t      sharedAxes: this.sharedAxes\n\t    };\n\n\t    var baseConfig = _Layer3.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return PReLU;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tPReLU.className = 'PReLU';\n\tregisterClass(PReLU);\n\tvar ELU = /*#__PURE__*/function (_Layer4) {\n\t  _inheritsLoose(ELU, _Layer4);\n\n\t  function ELU(args) {\n\t    var _this4;\n\n\t    _this4 = _Layer4.call(this, args == null ? {} : args) || this;\n\t    _this4.DEFAULT_ALPHA = 1.0;\n\n\t    if (args == null) {\n\t      args = {};\n\t    }\n\n\t    if (args.alpha != null && args.alpha !== _this4.DEFAULT_ALPHA) {\n\t      throw new NotImplementedError(\"Non-default alpha value (\" + args.alpha + \") is not supported by the \" + \"ELU layer yet.\");\n\t    }\n\n\t    _this4.alpha = args.alpha == null ? _this4.DEFAULT_ALPHA : args.alpha;\n\t    return _this4;\n\t  }\n\n\t  var _proto4 = ELU.prototype;\n\n\t  _proto4.call = function call(inputs, kwargs) {\n\t    var x = getExactlyOneTensor(inputs);\n\t    return elu(x);\n\t  };\n\n\t  _proto4.computeOutputShape = function computeOutputShape(inputShape) {\n\t    return inputShape;\n\t  };\n\n\t  _proto4.getConfig = function getConfig() {\n\t    var config = {\n\t      alpha: this.alpha\n\t    };\n\n\t    var baseConfig = _Layer4.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return ELU;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tELU.className = 'ELU';\n\tregisterClass(ELU);\n\tvar ThresholdedReLU = /*#__PURE__*/function (_Layer5) {\n\t  _inheritsLoose(ThresholdedReLU, _Layer5);\n\n\t  function ThresholdedReLU(args) {\n\t    var _this5;\n\n\t    _this5 = _Layer5.call(this, args == null ? {} : args) || this;\n\t    _this5.DEFAULT_THETA = 1.0;\n\n\t    if (args == null) {\n\t      args = {};\n\t    }\n\n\t    _this5.theta = args.theta == null ? _this5.DEFAULT_THETA : args.theta;\n\t    return _this5;\n\t  }\n\n\t  var _proto5 = ThresholdedReLU.prototype;\n\n\t  _proto5.call = function call(inputs, kwargs) {\n\t    var x = getExactlyOneTensor(inputs);\n\t    return x.mul(cast$1(x.greater(this.theta), 'float32'));\n\t  };\n\n\t  _proto5.computeOutputShape = function computeOutputShape(inputShape) {\n\t    return inputShape;\n\t  };\n\n\t  _proto5.getConfig = function getConfig() {\n\t    var config = {\n\t      theta: this.theta\n\t    };\n\n\t    var baseConfig = _Layer5.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return ThresholdedReLU;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tThresholdedReLU.className = 'ThresholdedReLU';\n\tregisterClass(ThresholdedReLU);\n\tvar Softmax$2 = /*#__PURE__*/function (_Layer6) {\n\t  _inheritsLoose(Softmax, _Layer6);\n\n\t  function Softmax(args) {\n\t    var _this6;\n\n\t    _this6 = _Layer6.call(this, args == null ? {} : args) || this;\n\t    _this6.DEFAULT_AXIS = 1.0;\n\n\t    if (args == null) {\n\t      args = {};\n\t    }\n\n\t    _this6.softmax = new Softmax$1().apply;\n\t    _this6.axis = args.axis == null ? _this6.DEFAULT_AXIS : args.axis;\n\t    return _this6;\n\t  }\n\n\t  var _proto6 = Softmax.prototype;\n\n\t  _proto6.call = function call(inputs, kwargs) {\n\t    var x = getExactlyOneTensor(inputs);\n\t    return this.softmax(x, this.axis);\n\t  };\n\n\t  _proto6.computeOutputShape = function computeOutputShape(inputShape) {\n\t    return inputShape;\n\t  };\n\n\t  _proto6.getConfig = function getConfig() {\n\t    var config = {\n\t      axis: this.axis\n\t    };\n\n\t    var baseConfig = _Layer6.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return Softmax;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tSoftmax$2.className = 'Softmax';\n\tregisterClass(Softmax$2);\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\t/**\n\t * Transforms a single number of array of numbers into an array of numbers.\n\t * @param value\n\t * @param n: The size of the tuple to be returned.\n\t * @param name: Name of the parameter, used for generating error messages.\n\t * @returns An array of numbers.\n\t */\n\n\tfunction normalizeArray(value, n, name) {\n\t  if (typeof value === 'number') {\n\t    return pyListRepeat(value, n);\n\t  } else {\n\t    if (value.length !== n) {\n\t      throw new ValueError(\"The \" + name + \" argument must be an integer or tuple of \" + n + \" integers.\" + (\" Received: \" + value.length + \" elements.\"));\n\t    }\n\n\t    for (var i = 0; i < n; ++i) {\n\t      var singleValue = value[i];\n\n\t      if (!isInteger$1(singleValue)) {\n\t        throw new ValueError(\"The \" + name + \" argument must be an integer or tuple of \" + n + (\" integers. Received: \" + JSON.stringify(value) + \" including a\") + (\" non-integer number \" + singleValue));\n\t      }\n\t    }\n\n\t    return value;\n\t  }\n\t}\n\t/**\n\t * Determines output length of a convolution given input length.\n\t * @param inputLength\n\t * @param filterSize\n\t * @param padding\n\t * @param stride\n\t * @param dilation: dilation rate.\n\t */\n\n\tfunction convOutputLength(inputLength, filterSize, padding, stride, dilation) {\n\t  if (dilation === void 0) {\n\t    dilation = 1;\n\t  }\n\n\t  if (inputLength == null) {\n\t    return inputLength;\n\t  }\n\n\t  var dilatedFilterSize = filterSize + (filterSize - 1) * (dilation - 1);\n\t  var outputLength;\n\n\t  if (padding === 'same') {\n\t    outputLength = inputLength;\n\t  } else {\n\t    // VALID\n\t    outputLength = inputLength - dilatedFilterSize + 1;\n\t  }\n\n\t  return Math.floor((outputLength + stride - 1) / stride);\n\t}\n\tfunction deconvLength(dimSize, strideSize, kernelSize, padding) {\n\t  if (dimSize == null) {\n\t    return null;\n\t  }\n\n\t  if (padding === 'valid') {\n\t    dimSize = dimSize * strideSize + max$5([kernelSize - strideSize, 0]);\n\t  } else if (padding === 'same') {\n\t    dimSize = dimSize * strideSize;\n\t  } else {\n\t    throw new ValueError(\"Unsupport padding mode: \" + padding + \".\");\n\t  }\n\n\t  return dimSize;\n\t}\n\n\t/**\n\t * Transpose and cast the input before the conv2d.\n\t * @param x Input image tensor.\n\t * @param dataFormat\n\t */\n\n\tfunction preprocessConv2DInput(x, dataFormat) {\n\t  // TODO(cais): Cast type to float32 if not.\n\t  return tidy(function () {\n\t    checkDataFormat(dataFormat);\n\n\t    if (dataFormat === 'channelsFirst') {\n\t      return transpose(x, [0, 2, 3, 1]); // NCHW -> NHWC.\n\t    } else {\n\t      return x;\n\t    }\n\t  });\n\t}\n\t/**\n\t * Transpose and cast the input before the conv3d.\n\t * @param x Input image tensor.\n\t * @param dataFormat\n\t */\n\n\tfunction preprocessConv3DInput(x, dataFormat) {\n\t  return tidy(function () {\n\t    checkDataFormat(dataFormat);\n\n\t    if (dataFormat === 'channelsFirst') {\n\t      return transpose(x, [0, 2, 3, 4, 1]); // NCDHW -> NDHWC.\n\t    } else {\n\t      return x;\n\t    }\n\t  });\n\t}\n\t/**\n\t * 1D-convolution with bias added.\n\t *\n\t * Porting Note: This function does not exist in the Python Keras backend.\n\t *   It is exactly the same as `conv2d`, except the added `bias`.\n\t *\n\t * @param x Input tensor, rank-3, of shape `[batchSize, width, inChannels]`.\n\t * @param kernel Kernel, rank-3, of shape `[filterWidth, inDepth, outDepth]`.\n\t * @param bias Bias, rank-3, of shape `[outDepth]`.\n\t * @param strides\n\t * @param padding Padding mode.\n\t * @param dataFormat Data format.\n\t * @param dilationRate\n\t * @returns The result of the 1D convolution.\n\t * @throws ValueError, if `x`, `kernel` or `bias` is not of the correct rank.\n\t */\n\n\tfunction conv1dWithBias(x, kernel, bias, strides, padding, dataFormat, dilationRate) {\n\t  if (strides === void 0) {\n\t    strides = 1;\n\t  }\n\n\t  if (padding === void 0) {\n\t    padding = 'valid';\n\t  }\n\n\t  if (dilationRate === void 0) {\n\t    dilationRate = 1;\n\t  }\n\n\t  return tidy(function () {\n\t    if (dataFormat == null) {\n\t      dataFormat = imageDataFormat();\n\t    }\n\n\t    checkDataFormat(dataFormat); // Check the ranks of x, kernel and bias.\n\n\t    if (x.shape.length !== 3) {\n\t      throw new ValueError(\"The input of a conv1dWithBias operation should be 3, but is \" + (x.shape.length + \" instead.\"));\n\t    }\n\n\t    if (kernel.shape.length !== 3) {\n\t      throw new ValueError(\"The kernel for a conv1dWithBias operation should be 3, but is \" + (kernel.shape.length + \" instead\"));\n\t    }\n\n\t    if (bias != null && bias.shape.length !== 1) {\n\t      throw new ValueError(\"The bias for a conv1dWithBias operation should be 1, but is \" + (kernel.shape.length + \" instead\"));\n\t    } // TODO(cais): Support CAUSAL padding mode.\n\n\n\t    if (dataFormat === 'channelsFirst') {\n\t      x = transpose(x, [0, 2, 1]); // NCW -> NWC.\n\t    }\n\n\t    if (padding === 'causal') {\n\t      throw new NotImplementedError('The support for CAUSAL padding mode in conv1dWithBias is not ' + 'implemented yet.');\n\t    }\n\n\t    var y = conv1d(x, kernel, strides, padding === 'same' ? 'same' : 'valid', 'NWC', dilationRate);\n\n\t    if (bias != null) {\n\t      y = biasAdd(y, bias);\n\t    }\n\n\t    return y;\n\t  });\n\t}\n\t/**\n\t * 1D-convolution.\n\t *\n\t * @param x Input tensor, rank-3, of shape `[batchSize, width, inChannels]`.\n\t * @param kernel Kernel, rank-3, of shape `[filterWidth, inDepth, outDepth]`.s\n\t * @param strides\n\t * @param padding Padding mode.\n\t * @param dataFormat Data format.\n\t * @param dilationRate\n\t * @returns The result of the 1D convolution.\n\t * @throws ValueError, if `x`, `kernel` or `bias` is not of the correct rank.\n\t */\n\n\tfunction conv1d$1(x, kernel, strides, padding, dataFormat, dilationRate) {\n\t  if (strides === void 0) {\n\t    strides = 1;\n\t  }\n\n\t  if (padding === void 0) {\n\t    padding = 'valid';\n\t  }\n\n\t  if (dilationRate === void 0) {\n\t    dilationRate = 1;\n\t  }\n\n\t  return tidy(function () {\n\t    checkDataFormat(dataFormat);\n\t    return conv1dWithBias(x, kernel, null, strides, padding, dataFormat, dilationRate);\n\t  });\n\t}\n\t/**\n\t * 2D Convolution\n\t * @param x\n\t * @param kernel kernel of the convolution.\n\t * @param strides strides array.\n\t * @param padding padding mode. Default to 'valid'.\n\t * @param dataFormat data format. Defaults to 'channelsLast'.\n\t * @param dilationRate dilation rate array.\n\t * @returns Result of the 2D pooling.\n\t */\n\n\tfunction conv2d$2(x, kernel, strides, padding, dataFormat, dilationRate) {\n\t  if (strides === void 0) {\n\t    strides = [1, 1];\n\t  }\n\n\t  if (padding === void 0) {\n\t    padding = 'valid';\n\t  }\n\n\t  return tidy(function () {\n\t    checkDataFormat(dataFormat);\n\t    return conv2dWithBiasActivation(x, kernel, null, strides, padding, dataFormat, dilationRate);\n\t  });\n\t}\n\t/**\n\t * 2D Convolution with an added bias and optional activation.\n\t * Note: This function does not exist in the Python Keras Backend. This function\n\t * is exactly the same as `conv2d`, except the added `bias`.\n\t */\n\n\tfunction conv2dWithBiasActivation(x, kernel, bias, strides, padding, dataFormat, dilationRate, activation) {\n\t  if (strides === void 0) {\n\t    strides = [1, 1];\n\t  }\n\n\t  if (padding === void 0) {\n\t    padding = 'valid';\n\t  }\n\n\t  if (activation === void 0) {\n\t    activation = null;\n\t  }\n\n\t  return tidy(function () {\n\t    if (dataFormat == null) {\n\t      dataFormat = imageDataFormat();\n\t    }\n\n\t    checkDataFormat(dataFormat);\n\n\t    if (x.rank !== 3 && x.rank !== 4) {\n\t      throw new ValueError(\"conv2dWithBiasActivation expects input to be of rank 3 or 4, \" + (\"but received \" + x.rank + \".\"));\n\t    }\n\n\t    if (kernel.rank !== 3 && kernel.rank !== 4) {\n\t      throw new ValueError(\"conv2dWithBiasActivation expects kernel to be of rank 3 or 4, \" + (\"but received \" + x.rank + \".\"));\n\t    }\n\n\t    var y = preprocessConv2DInput(x, dataFormat);\n\n\t    if (padding === 'causal') {\n\t      throw new NotImplementedError('The support for CAUSAL padding mode in conv1dWithBias is not ' + 'implemented yet.');\n\t    }\n\n\t    y = conv2d$1({\n\t      x: y,\n\t      filter: kernel,\n\t      strides: strides,\n\t      pad: padding === 'same' ? 'same' : 'valid',\n\t      dilations: dilationRate,\n\t      dataFormat: 'NHWC',\n\t      bias: bias,\n\t      activation: activation\n\t    });\n\n\t    if (dataFormat === 'channelsFirst') {\n\t      y = transpose(y, [0, 3, 1, 2]);\n\t    }\n\n\t    return y;\n\t  });\n\t}\n\t/**\n\t * 3D Convolution.\n\t * @param x\n\t * @param kernel kernel of the convolution.\n\t * @param strides strides array.\n\t * @param padding padding mode. Default to 'valid'.\n\t * @param dataFormat data format. Defaults to 'channelsLast'.\n\t * @param dilationRate dilation rate array.\n\t * @returns Result of the 3D convolution.\n\t */\n\n\tfunction conv3d$1(x, kernel, strides, padding, dataFormat, dilationRate) {\n\t  if (strides === void 0) {\n\t    strides = [1, 1, 1];\n\t  }\n\n\t  if (padding === void 0) {\n\t    padding = 'valid';\n\t  }\n\n\t  return tidy(function () {\n\t    checkDataFormat(dataFormat);\n\t    return conv3dWithBias(x, kernel, null, strides, padding, dataFormat, dilationRate);\n\t  });\n\t}\n\t/**\n\t * 3D Convolution with an added bias.\n\t * Note: This function does not exist in the Python Keras Backend. This function\n\t * is exactly the same as `conv3d`, except the added `bias`.\n\t */\n\n\tfunction conv3dWithBias(x, kernel, bias, strides, padding, dataFormat, dilationRate) {\n\t  if (strides === void 0) {\n\t    strides = [1, 1, 1];\n\t  }\n\n\t  if (padding === void 0) {\n\t    padding = 'valid';\n\t  }\n\n\t  return tidy(function () {\n\t    if (dataFormat == null) {\n\t      dataFormat = imageDataFormat();\n\t    }\n\n\t    checkDataFormat(dataFormat);\n\n\t    if (x.rank !== 4 && x.rank !== 5) {\n\t      throw new ValueError(\"conv3dWithBias expects input to be of rank 4 or 5, but received \" + (x.rank + \".\"));\n\t    }\n\n\t    if (kernel.rank !== 4 && kernel.rank !== 5) {\n\t      throw new ValueError(\"conv3dWithBias expects kernel to be of rank 4 or 5, but received \" + (x.rank + \".\"));\n\t    }\n\n\t    var y = preprocessConv3DInput(x, dataFormat);\n\n\t    if (padding === 'causal') {\n\t      throw new NotImplementedError('The support for CAUSAL padding mode in conv3dWithBias is not ' + 'implemented yet.');\n\t    }\n\n\t    y = conv3d(y, kernel, strides, padding === 'same' ? 'same' : 'valid', 'NDHWC', dilationRate);\n\n\t    if (bias != null) {\n\t      y = biasAdd(y, bias);\n\t    }\n\n\t    if (dataFormat === 'channelsFirst') {\n\t      y = transpose(y, [0, 4, 1, 2, 3]);\n\t    }\n\n\t    return y;\n\t  });\n\t}\n\t/**\n\t * Abstract convolution layer.\n\t */\n\n\tvar BaseConv = /*#__PURE__*/function (_Layer) {\n\t  _inheritsLoose(BaseConv, _Layer);\n\n\t  function BaseConv(rank, args) {\n\t    var _this;\n\n\t    _this = _Layer.call(this, args) || this;\n\t    _this.bias = null;\n\t    _this.DEFAULT_KERNEL_INITIALIZER = 'glorotNormal';\n\t    _this.DEFAULT_BIAS_INITIALIZER = 'zeros';\n\t    BaseConv.verifyArgs(args);\n\t    _this.rank = rank;\n\t    assertPositiveInteger(_this.rank, 'rank');\n\n\t    if (_this.rank !== 1 && _this.rank !== 2 && _this.rank !== 3) {\n\t      throw new NotImplementedError(\"Convolution layer for rank other than 1, 2, or 3 (\" + _this.rank + \") is \" + \"not implemented yet.\");\n\t    }\n\n\t    _this.kernelSize = normalizeArray(args.kernelSize, rank, 'kernelSize');\n\t    _this.strides = normalizeArray(args.strides == null ? 1 : args.strides, rank, 'strides');\n\t    _this.padding = args.padding == null ? 'valid' : args.padding;\n\t    checkPaddingMode(_this.padding);\n\t    _this.dataFormat = args.dataFormat == null ? 'channelsLast' : args.dataFormat;\n\t    checkDataFormat(_this.dataFormat);\n\t    _this.activation = getActivation(args.activation);\n\t    _this.useBias = args.useBias == null ? true : args.useBias;\n\t    _this.biasInitializer = getInitializer(args.biasInitializer || _this.DEFAULT_BIAS_INITIALIZER);\n\t    _this.biasConstraint = getConstraint(args.biasConstraint);\n\t    _this.biasRegularizer = getRegularizer(args.biasRegularizer);\n\t    _this.activityRegularizer = getRegularizer(args.activityRegularizer);\n\t    _this.dilationRate = normalizeArray(args.dilationRate == null ? 1 : args.dilationRate, rank, 'dilationRate');\n\n\t    if (_this.rank === 1 && Array.isArray(_this.dilationRate) && _this.dilationRate.length !== 1) {\n\t      throw new ValueError(\"dilationRate must be a number or an array of a single number \" + \"for 1D convolution, but received \" + (\"\" + JSON.stringify(_this.dilationRate)));\n\t    } else if (_this.rank === 2) {\n\t      if (typeof _this.dilationRate === 'number') {\n\t        _this.dilationRate = [_this.dilationRate, _this.dilationRate];\n\t      } else if (_this.dilationRate.length !== 2) {\n\t        throw new ValueError(\"dilationRate must be a number or array of two numbers for 2D \" + (\"convolution, but received \" + JSON.stringify(_this.dilationRate)));\n\t      }\n\t    } else if (_this.rank === 3) {\n\t      if (typeof _this.dilationRate === 'number') {\n\t        _this.dilationRate = [_this.dilationRate, _this.dilationRate, _this.dilationRate];\n\t      } else if (_this.dilationRate.length !== 3) {\n\t        throw new ValueError(\"dilationRate must be a number or array of three numbers for 3D \" + (\"convolution, but received \" + JSON.stringify(_this.dilationRate)));\n\t      }\n\t    }\n\n\t    return _this;\n\t  }\n\n\t  BaseConv.verifyArgs = function verifyArgs(args) {\n\t    // Check config.kernelSize type and shape.\n\t    assert$1('kernelSize' in args, \"required key 'kernelSize' not in config\");\n\n\t    if (typeof args.kernelSize !== 'number' && !checkArrayTypeAndLength(args.kernelSize, 'number', 1, 3)) {\n\t      throw new ValueError(\"BaseConv expects config.kernelSize to be number or number[] with \" + (\"length 1, 2, or 3, but received \" + JSON.stringify(args.kernelSize) + \".\"));\n\t    }\n\t  };\n\n\t  var _proto = BaseConv.prototype;\n\n\t  _proto.getConfig = function getConfig() {\n\t    var config = {\n\t      kernelSize: this.kernelSize,\n\t      strides: this.strides,\n\t      padding: this.padding,\n\t      dataFormat: this.dataFormat,\n\t      dilationRate: this.dilationRate,\n\t      activation: serializeActivation(this.activation),\n\t      useBias: this.useBias,\n\t      biasInitializer: serializeInitializer(this.biasInitializer),\n\t      biasRegularizer: serializeRegularizer(this.biasRegularizer),\n\t      activityRegularizer: serializeRegularizer(this.activityRegularizer),\n\t      biasConstraint: serializeConstraint(this.biasConstraint)\n\t    };\n\n\t    var baseConfig = _Layer.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return BaseConv;\n\t}(Layer);\n\t/**\n\t * Abstract nD convolution layer.  Ancestor of convolution layers which reduce\n\t * across channels, i.e., Conv1D and Conv2D, but not DepthwiseConv2D.\n\t */\n\n\tvar Conv = /*#__PURE__*/function (_BaseConv) {\n\t  _inheritsLoose(Conv, _BaseConv);\n\n\t  function Conv(rank, args) {\n\t    var _this2;\n\n\t    _this2 = _BaseConv.call(this, rank, args) || this;\n\t    _this2.kernel = null;\n\t    Conv.verifyArgs(args);\n\t    _this2.filters = args.filters;\n\t    assertPositiveInteger(_this2.filters, 'filters');\n\t    _this2.kernelInitializer = getInitializer(args.kernelInitializer || _this2.DEFAULT_KERNEL_INITIALIZER);\n\t    _this2.kernelConstraint = getConstraint(args.kernelConstraint);\n\t    _this2.kernelRegularizer = getRegularizer(args.kernelRegularizer);\n\t    return _this2;\n\t  }\n\n\t  var _proto2 = Conv.prototype;\n\n\t  _proto2.build = function build(inputShape) {\n\t    var _axes;\n\n\t    inputShape = getExactlyOneShape(inputShape);\n\t    var channelAxis = this.dataFormat === 'channelsFirst' ? 1 : inputShape.length - 1;\n\n\t    if (inputShape[channelAxis] == null) {\n\t      throw new ValueError(\"The channel dimension of the input should be defined. \" + (\"Found \" + inputShape[channelAxis]));\n\t    }\n\n\t    var inputDim = inputShape[channelAxis];\n\t    var kernelShape = this.kernelSize.concat([inputDim, this.filters]);\n\t    this.kernel = this.addWeight('kernel', kernelShape, null, this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n\n\t    if (this.useBias) {\n\t      this.bias = this.addWeight('bias', [this.filters], null, this.biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n\t    }\n\n\t    this.inputSpec = [{\n\t      ndim: this.rank + 2,\n\t      axes: (_axes = {}, _axes[channelAxis] = inputDim, _axes)\n\t    }];\n\t    this.built = true;\n\t  };\n\n\t  _proto2.call = function call(inputs, kwargs) {\n\t    var _this3 = this;\n\n\t    return tidy(function () {\n\t      inputs = getExactlyOneTensor(inputs);\n\t      var outputs;\n\t      var biasValue = _this3.bias == null ? null : _this3.bias.read();\n\t      var fusedActivationName = mapActivationToFusedKernel(_this3.activation.getClassName());\n\n\t      if (fusedActivationName != null && _this3.rank === 2) {\n\t        outputs = conv2dWithBiasActivation(inputs, _this3.kernel.read(), biasValue, _this3.strides, _this3.padding, _this3.dataFormat, _this3.dilationRate, fusedActivationName);\n\t      } else {\n\t        if (_this3.rank === 1) {\n\t          outputs = conv1dWithBias(inputs, _this3.kernel.read(), biasValue, _this3.strides[0], _this3.padding, _this3.dataFormat, _this3.dilationRate[0]);\n\t        } else if (_this3.rank === 2) {\n\t          // TODO(cais): Move up to constructor.\n\t          outputs = conv2dWithBiasActivation(inputs, _this3.kernel.read(), biasValue, _this3.strides, _this3.padding, _this3.dataFormat, _this3.dilationRate);\n\t        } else if (_this3.rank === 3) {\n\t          outputs = conv3dWithBias(inputs, _this3.kernel.read(), biasValue, _this3.strides, _this3.padding, _this3.dataFormat, _this3.dilationRate);\n\t        } else {\n\t          throw new NotImplementedError('convolutions greater than 3D are not implemented yet.');\n\t        }\n\n\t        if (_this3.activation != null) {\n\t          outputs = _this3.activation.apply(outputs);\n\t        }\n\t      }\n\n\t      return outputs;\n\t    });\n\t  };\n\n\t  _proto2.computeOutputShape = function computeOutputShape(inputShape) {\n\t    inputShape = getExactlyOneShape(inputShape);\n\t    var newSpace = [];\n\t    var space = this.dataFormat === 'channelsLast' ? inputShape.slice(1, inputShape.length - 1) : inputShape.slice(2);\n\n\t    for (var i = 0; i < space.length; ++i) {\n\t      var newDim = convOutputLength(space[i], this.kernelSize[i], this.padding, this.strides[i], typeof this.dilationRate === 'number' ? this.dilationRate : this.dilationRate[i]);\n\t      newSpace.push(newDim);\n\t    }\n\n\t    var outputShape = [inputShape[0]];\n\n\t    if (this.dataFormat === 'channelsLast') {\n\t      outputShape = outputShape.concat(newSpace);\n\t      outputShape.push(this.filters);\n\t    } else {\n\t      outputShape.push(this.filters);\n\t      outputShape = outputShape.concat(newSpace);\n\t    }\n\n\t    return outputShape;\n\t  };\n\n\t  _proto2.getConfig = function getConfig() {\n\t    var config = {\n\t      filters: this.filters,\n\t      kernelInitializer: serializeInitializer(this.kernelInitializer),\n\t      kernelRegularizer: serializeRegularizer(this.kernelRegularizer),\n\t      kernelConstraint: serializeConstraint(this.kernelConstraint)\n\t    };\n\n\t    var baseConfig = _BaseConv.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  Conv.verifyArgs = function verifyArgs(args) {\n\t    // Check config.filters type, shape, and value.\n\t    if (!('filters' in args) || typeof args.filters !== 'number' || args.filters < 1) {\n\t      throw new ValueError(\"Convolution layer expected config.filters to be a 'number' > 0 \" + (\"but got \" + JSON.stringify(args.filters)));\n\t    }\n\t  };\n\n\t  return Conv;\n\t}(BaseConv);\n\tvar Conv2D$1 = /*#__PURE__*/function (_Conv) {\n\t  _inheritsLoose(Conv2D, _Conv);\n\n\t  function Conv2D(args) {\n\t    var _this4;\n\n\t    _this4 = _Conv.call(this, 2, args) || this;\n\t    Conv2D.verifyArgs(args);\n\t    return _this4;\n\t  }\n\n\t  var _proto3 = Conv2D.prototype;\n\n\t  _proto3.getConfig = function getConfig() {\n\t    var config = _Conv.prototype.getConfig.call(this);\n\n\t    delete config['rank'];\n\t    return config;\n\t  };\n\n\t  Conv2D.verifyArgs = function verifyArgs(args) {\n\t    // config.kernelSize must be a number or array of numbers.\n\t    if (typeof args.kernelSize !== 'number' && !checkArrayTypeAndLength(args.kernelSize, 'number', 1, 2)) {\n\t      throw new ValueError(\"Conv2D expects config.kernelSize to be number or number[] with \" + (\"length 1 or 2, but received \" + JSON.stringify(args.kernelSize) + \".\"));\n\t    }\n\t  };\n\n\t  return Conv2D;\n\t}(Conv);\n\t/** @nocollapse */\n\n\tConv2D$1.className = 'Conv2D';\n\tregisterClass(Conv2D$1);\n\tvar Conv3D$1 = /*#__PURE__*/function (_Conv2) {\n\t  _inheritsLoose(Conv3D, _Conv2);\n\n\t  function Conv3D(args) {\n\t    var _this5;\n\n\t    _this5 = _Conv2.call(this, 3, args) || this;\n\t    Conv3D.verifyArgs(args);\n\t    return _this5;\n\t  }\n\n\t  var _proto4 = Conv3D.prototype;\n\n\t  _proto4.getConfig = function getConfig() {\n\t    var config = _Conv2.prototype.getConfig.call(this);\n\n\t    delete config['rank'];\n\t    return config;\n\t  };\n\n\t  Conv3D.verifyArgs = function verifyArgs(args) {\n\t    // config.kernelSize must be a number or array of numbers.\n\t    if (typeof args.kernelSize !== 'number') {\n\t      if (!(Array.isArray(args.kernelSize) && (args.kernelSize.length === 1 || args.kernelSize.length === 3))) {\n\t        throw new ValueError(\"Conv3D expects config.kernelSize to be number or\" + (\" [number, number, number], but received \" + JSON.stringify(args.kernelSize) + \".\"));\n\t      }\n\t    }\n\t  };\n\n\t  return Conv3D;\n\t}(Conv);\n\t/** @nocollapse */\n\n\tConv3D$1.className = 'Conv3D';\n\tregisterClass(Conv3D$1);\n\tvar Conv2DTranspose = /*#__PURE__*/function (_Conv2D) {\n\t  _inheritsLoose(Conv2DTranspose, _Conv2D);\n\n\t  function Conv2DTranspose(args) {\n\t    var _this6;\n\n\t    _this6 = _Conv2D.call(this, args) || this;\n\t    _this6.inputSpec = [new InputSpec({\n\t      ndim: 4\n\t    })];\n\n\t    if (_this6.padding !== 'same' && _this6.padding !== 'valid') {\n\t      throw new ValueError(\"Conv2DTranspose currently supports only padding modes 'same' \" + (\"and 'valid', but received padding mode \" + _this6.padding));\n\t    }\n\n\t    return _this6;\n\t  }\n\n\t  var _proto5 = Conv2DTranspose.prototype;\n\n\t  _proto5.build = function build(inputShape) {\n\t    var _axes2;\n\n\t    inputShape = getExactlyOneShape(inputShape);\n\n\t    if (inputShape.length !== 4) {\n\t      throw new ValueError('Input should have rank 4; Received input shape: ' + JSON.stringify(inputShape));\n\t    }\n\n\t    var channelAxis = this.dataFormat === 'channelsFirst' ? 1 : inputShape.length - 1;\n\n\t    if (inputShape[channelAxis] == null) {\n\t      throw new ValueError('The channel dimension of the inputs should be defined. ' + 'Found `None`.');\n\t    }\n\n\t    var inputDim = inputShape[channelAxis];\n\t    var kernelShape = this.kernelSize.concat([this.filters, inputDim]);\n\t    this.kernel = this.addWeight('kernel', kernelShape, 'float32', this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n\n\t    if (this.useBias) {\n\t      this.bias = this.addWeight('bias', [this.filters], 'float32', this.biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n\t    } // Set input spec.\n\n\n\t    this.inputSpec = [new InputSpec({\n\t      ndim: 4,\n\t      axes: (_axes2 = {}, _axes2[channelAxis] = inputDim, _axes2)\n\t    })];\n\t    this.built = true;\n\t  };\n\n\t  _proto5.call = function call(inputs, kwargs) {\n\t    var _this7 = this;\n\n\t    return tidy(function () {\n\t      var input = getExactlyOneTensor(inputs);\n\n\t      if (input.shape.length !== 4) {\n\t        throw new ValueError(\"Conv2DTranspose.call() expects input tensor to be rank-4, but \" + (\"received a tensor of rank-\" + input.shape.length));\n\t      }\n\n\t      var inputShape = input.shape;\n\t      var batchSize = inputShape[0];\n\t      var hAxis;\n\t      var wAxis;\n\n\t      if (_this7.dataFormat === 'channelsFirst') {\n\t        hAxis = 2;\n\t        wAxis = 3;\n\t      } else {\n\t        hAxis = 1;\n\t        wAxis = 2;\n\t      }\n\n\t      var height = inputShape[hAxis];\n\t      var width = inputShape[wAxis];\n\t      var kernelH = _this7.kernelSize[0];\n\t      var kernelW = _this7.kernelSize[1];\n\t      var strideH = _this7.strides[0];\n\t      var strideW = _this7.strides[1]; // Infer the dynamic output shape.\n\n\t      var outHeight = deconvLength(height, strideH, kernelH, _this7.padding);\n\t      var outWidth = deconvLength(width, strideW, kernelW, _this7.padding); // Porting Note: We don't branch based on `this.dataFormat` here,\n\t      // because\n\t      //   the tjfs-core function `conv2dTranspose` called below always\n\t      //   assumes channelsLast.\n\n\t      var outputShape = [batchSize, outHeight, outWidth, _this7.filters];\n\n\t      if (_this7.dataFormat !== 'channelsLast') {\n\t        input = transpose(input, [0, 2, 3, 1]);\n\t      }\n\n\t      var outputs = conv2dTranspose(input, _this7.kernel.read(), outputShape, _this7.strides, _this7.padding);\n\n\t      if (_this7.dataFormat !== 'channelsLast') {\n\t        outputs = transpose(outputs, [0, 3, 1, 2]);\n\t      }\n\n\t      if (_this7.bias != null) {\n\t        outputs = biasAdd(outputs, _this7.bias.read(), _this7.dataFormat);\n\t      }\n\n\t      if (_this7.activation != null) {\n\t        outputs = _this7.activation.apply(outputs);\n\t      }\n\n\t      return outputs;\n\t    });\n\t  };\n\n\t  _proto5.computeOutputShape = function computeOutputShape(inputShape) {\n\t    inputShape = getExactlyOneShape(inputShape);\n\t    var outputShape = inputShape.slice();\n\t    var channelAxis;\n\t    var heightAxis;\n\t    var widthAxis;\n\n\t    if (this.dataFormat === 'channelsFirst') {\n\t      channelAxis = 1;\n\t      heightAxis = 2;\n\t      widthAxis = 3;\n\t    } else {\n\t      channelAxis = 3;\n\t      heightAxis = 1;\n\t      widthAxis = 2;\n\t    }\n\n\t    var kernelH = this.kernelSize[0];\n\t    var kernelW = this.kernelSize[1];\n\t    var strideH = this.strides[0];\n\t    var strideW = this.strides[1];\n\t    outputShape[channelAxis] = this.filters;\n\t    outputShape[heightAxis] = deconvLength(outputShape[heightAxis], strideH, kernelH, this.padding);\n\t    outputShape[widthAxis] = deconvLength(outputShape[widthAxis], strideW, kernelW, this.padding);\n\t    return outputShape;\n\t  };\n\n\t  _proto5.getConfig = function getConfig() {\n\t    var config = _Conv2D.prototype.getConfig.call(this);\n\n\t    delete config['dilationRate'];\n\t    return config;\n\t  };\n\n\t  return Conv2DTranspose;\n\t}(Conv2D$1);\n\t/** @nocollapse */\n\n\tConv2DTranspose.className = 'Conv2DTranspose';\n\tregisterClass(Conv2DTranspose);\n\tvar SeparableConv = /*#__PURE__*/function (_Conv3) {\n\t  _inheritsLoose(SeparableConv, _Conv3);\n\n\t  function SeparableConv(rank, config) {\n\t    var _this8;\n\n\t    _this8 = _Conv3.call(this, rank, config) || this;\n\t    _this8.DEFAULT_DEPTHWISE_INITIALIZER = 'glorotUniform';\n\t    _this8.DEFAULT_POINTWISE_INITIALIZER = 'glorotUniform';\n\t    _this8.depthwiseKernel = null;\n\t    _this8.pointwiseKernel = null;\n\n\t    if (config.filters == null) {\n\t      throw new ValueError('The `filters` configuration field is required by SeparableConv, ' + 'but is unspecified.');\n\t    }\n\n\t    if (config.kernelInitializer != null || config.kernelRegularizer != null || config.kernelConstraint != null) {\n\t      throw new ValueError('Fields kernelInitializer, kernelRegularizer and kernelConstraint ' + 'are invalid for SeparableConv2D. Use depthwiseInitializer, ' + 'depthwiseRegularizer, depthwiseConstraint, pointwiseInitializer, ' + 'pointwiseRegularizer and pointwiseConstraint instead.');\n\t    }\n\n\t    if (config.padding != null && config.padding !== 'same' && config.padding !== 'valid') {\n\t      throw new ValueError(\"SeparableConv\" + _this8.rank + \"D supports only padding modes: \" + (\"'same' and 'valid', but received \" + JSON.stringify(config.padding)));\n\t    }\n\n\t    _this8.depthMultiplier = config.depthMultiplier == null ? 1 : config.depthMultiplier;\n\t    _this8.depthwiseInitializer = getInitializer(config.depthwiseInitializer || _this8.DEFAULT_DEPTHWISE_INITIALIZER);\n\t    _this8.depthwiseRegularizer = getRegularizer(config.depthwiseRegularizer);\n\t    _this8.depthwiseConstraint = getConstraint(config.depthwiseConstraint);\n\t    _this8.pointwiseInitializer = getInitializer(config.depthwiseInitializer || _this8.DEFAULT_POINTWISE_INITIALIZER);\n\t    _this8.pointwiseRegularizer = getRegularizer(config.pointwiseRegularizer);\n\t    _this8.pointwiseConstraint = getConstraint(config.pointwiseConstraint);\n\t    return _this8;\n\t  }\n\n\t  var _proto6 = SeparableConv.prototype;\n\n\t  _proto6.build = function build(inputShape) {\n\t    var _axes3;\n\n\t    inputShape = getExactlyOneShape(inputShape);\n\n\t    if (inputShape.length < this.rank + 2) {\n\t      throw new ValueError(\"Inputs to SeparableConv\" + this.rank + \"D should have rank \" + (this.rank + 2 + \", but received input shape: \") + (\"\" + JSON.stringify(inputShape)));\n\t    }\n\n\t    var channelAxis = this.dataFormat === 'channelsFirst' ? 1 : inputShape.length - 1;\n\n\t    if (inputShape[channelAxis] == null || inputShape[channelAxis] < 0) {\n\t      throw new ValueError(\"The channel dimension of the inputs should be defined, \" + (\"but found \" + JSON.stringify(inputShape[channelAxis])));\n\t    }\n\n\t    var inputDim = inputShape[channelAxis];\n\t    var depthwiseKernelShape = this.kernelSize.concat([inputDim, this.depthMultiplier]);\n\t    var pointwiseKernelShape = [];\n\n\t    for (var i = 0; i < this.rank; ++i) {\n\t      pointwiseKernelShape.push(1);\n\t    }\n\n\t    pointwiseKernelShape.push(inputDim * this.depthMultiplier, this.filters);\n\t    var trainable = true;\n\t    this.depthwiseKernel = this.addWeight('depthwise_kernel', depthwiseKernelShape, 'float32', this.depthwiseInitializer, this.depthwiseRegularizer, trainable, this.depthwiseConstraint);\n\t    this.pointwiseKernel = this.addWeight('pointwise_kernel', pointwiseKernelShape, 'float32', this.pointwiseInitializer, this.pointwiseRegularizer, trainable, this.pointwiseConstraint);\n\n\t    if (this.useBias) {\n\t      this.bias = this.addWeight('bias', [this.filters], 'float32', this.biasInitializer, this.biasRegularizer, trainable, this.biasConstraint);\n\t    } else {\n\t      this.bias = null;\n\t    }\n\n\t    this.inputSpec = [new InputSpec({\n\t      ndim: this.rank + 2,\n\t      axes: (_axes3 = {}, _axes3[channelAxis] = inputDim, _axes3)\n\t    })];\n\t    this.built = true;\n\t  };\n\n\t  _proto6.call = function call(inputs, kwargs) {\n\t    var _this9 = this;\n\n\t    return tidy(function () {\n\t      inputs = getExactlyOneTensor(inputs);\n\t      var output;\n\n\t      if (_this9.rank === 1) {\n\t        throw new NotImplementedError('1D separable convolution is not implemented yet.');\n\t      } else if (_this9.rank === 2) {\n\t        if (_this9.dataFormat === 'channelsFirst') {\n\t          inputs = transpose(inputs, [0, 2, 3, 1]); // NCHW -> NHWC.\n\t        }\n\n\t        output = separableConv2d(inputs, _this9.depthwiseKernel.read(), _this9.pointwiseKernel.read(), _this9.strides, _this9.padding, _this9.dilationRate, 'NHWC');\n\t      }\n\n\t      if (_this9.useBias) {\n\t        output = biasAdd(output, _this9.bias.read(), _this9.dataFormat);\n\t      }\n\n\t      if (_this9.activation != null) {\n\t        output = _this9.activation.apply(output);\n\t      }\n\n\t      if (_this9.dataFormat === 'channelsFirst') {\n\t        output = transpose(output, [0, 3, 1, 2]); // NHWC -> NCHW.\n\t      }\n\n\t      return output;\n\t    });\n\t  };\n\n\t  _proto6.getConfig = function getConfig() {\n\t    var config = _Conv3.prototype.getConfig.call(this);\n\n\t    delete config['rank'];\n\t    delete config['kernelInitializer'];\n\t    delete config['kernelRegularizer'];\n\t    delete config['kernelConstraint'];\n\t    config['depthwiseInitializer'] = serializeInitializer(this.depthwiseInitializer);\n\t    config['pointwiseInitializer'] = serializeInitializer(this.pointwiseInitializer);\n\t    config['depthwiseRegularizer'] = serializeRegularizer(this.depthwiseRegularizer);\n\t    config['pointwiseRegularizer'] = serializeRegularizer(this.pointwiseRegularizer);\n\t    config['depthwiseConstraint'] = serializeConstraint(this.depthwiseConstraint);\n\t    config['pointwiseConstraint'] = serializeConstraint(this.pointwiseConstraint);\n\t    return config;\n\t  };\n\n\t  return SeparableConv;\n\t}(Conv);\n\t/** @nocollapse */\n\n\tSeparableConv.className = 'SeparableConv';\n\tvar SeparableConv2D = /*#__PURE__*/function (_SeparableConv) {\n\t  _inheritsLoose(SeparableConv2D, _SeparableConv);\n\n\t  function SeparableConv2D(args) {\n\t    return _SeparableConv.call(this, 2, args) || this;\n\t  }\n\n\t  return SeparableConv2D;\n\t}(SeparableConv);\n\t/** @nocollapse */\n\n\tSeparableConv2D.className = 'SeparableConv2D';\n\tregisterClass(SeparableConv2D);\n\tvar Conv1D = /*#__PURE__*/function (_Conv4) {\n\t  _inheritsLoose(Conv1D, _Conv4);\n\n\t  function Conv1D(args) {\n\t    var _this10;\n\n\t    _this10 = _Conv4.call(this, 1, args) || this;\n\t    Conv1D.verifyArgs(args);\n\t    _this10.inputSpec = [{\n\t      ndim: 3\n\t    }];\n\t    return _this10;\n\t  }\n\n\t  var _proto7 = Conv1D.prototype;\n\n\t  _proto7.getConfig = function getConfig() {\n\t    var config = _Conv4.prototype.getConfig.call(this);\n\n\t    delete config['rank'];\n\t    delete config['dataFormat'];\n\t    return config;\n\t  };\n\n\t  Conv1D.verifyArgs = function verifyArgs(args) {\n\t    // config.kernelSize must be a number or array of numbers.\n\t    if (typeof args.kernelSize !== 'number' && !checkArrayTypeAndLength(args.kernelSize, 'number', 1, 1)) {\n\t      throw new ValueError(\"Conv1D expects config.kernelSize to be number or number[] with \" + (\"length 1, but received \" + JSON.stringify(args.kernelSize) + \".\"));\n\t    }\n\t  };\n\n\t  return Conv1D;\n\t}(Conv);\n\t/** @nocollapse */\n\n\tConv1D.className = 'Conv1D';\n\tregisterClass(Conv1D);\n\tvar Cropping2D = /*#__PURE__*/function (_Layer2) {\n\t  _inheritsLoose(Cropping2D, _Layer2);\n\n\t  function Cropping2D(args) {\n\t    var _this11;\n\n\t    _this11 = _Layer2.call(this, args) || this;\n\n\t    if (typeof args.cropping === 'number') {\n\t      _this11.cropping = [[args.cropping, args.cropping], [args.cropping, args.cropping]];\n\t    } else if (typeof args.cropping[0] === 'number') {\n\t      _this11.cropping = [[args.cropping[0], args.cropping[0]], [args.cropping[1], args.cropping[1]]];\n\t    } else {\n\t      _this11.cropping = args.cropping;\n\t    }\n\n\t    _this11.dataFormat = args.dataFormat === undefined ? 'channelsLast' : args.dataFormat;\n\t    _this11.inputSpec = [{\n\t      ndim: 4\n\t    }];\n\t    return _this11;\n\t  }\n\n\t  var _proto8 = Cropping2D.prototype;\n\n\t  _proto8.computeOutputShape = function computeOutputShape(inputShape) {\n\t    if (this.dataFormat === 'channelsFirst') {\n\t      return [inputShape[0], inputShape[1], inputShape[2] - this.cropping[0][0] - this.cropping[0][1], inputShape[3] - this.cropping[1][0] - this.cropping[1][1]];\n\t    } else {\n\t      return [inputShape[0], inputShape[1] - this.cropping[0][0] - this.cropping[0][1], inputShape[2] - this.cropping[1][0] - this.cropping[1][1], inputShape[3]];\n\t    }\n\t  };\n\n\t  _proto8.call = function call(inputs, kwargs) {\n\t    var _this12 = this;\n\n\t    return tidy(function () {\n\t      inputs = getExactlyOneTensor(inputs);\n\n\t      if (_this12.dataFormat === 'channelsLast') {\n\t        var hSliced = sliceAlongAxis(inputs, _this12.cropping[0][0], inputs.shape[1] - _this12.cropping[0][0] - _this12.cropping[0][1], 2);\n\t        return sliceAlongAxis(hSliced, _this12.cropping[1][0], inputs.shape[2] - _this12.cropping[1][1] - _this12.cropping[1][0], 3);\n\t      } else {\n\t        var _hSliced = sliceAlongAxis(inputs, _this12.cropping[0][0], inputs.shape[2] - _this12.cropping[0][0] - _this12.cropping[0][1], 3);\n\n\t        return sliceAlongAxis(_hSliced, _this12.cropping[1][0], inputs.shape[3] - _this12.cropping[1][1] - _this12.cropping[1][0], 4);\n\t      }\n\t    });\n\t  };\n\n\t  _proto8.getConfig = function getConfig() {\n\t    var config = {\n\t      cropping: this.cropping,\n\t      dataFormat: this.dataFormat\n\t    };\n\n\t    var baseConfig = _Layer2.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return Cropping2D;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tCropping2D.className = 'Cropping2D';\n\tregisterClass(Cropping2D);\n\tvar UpSampling2D = /*#__PURE__*/function (_Layer3) {\n\t  _inheritsLoose(UpSampling2D, _Layer3);\n\n\t  function UpSampling2D(args) {\n\t    var _this13;\n\n\t    _this13 = _Layer3.call(this, args) || this;\n\t    _this13.DEFAULT_SIZE = [2, 2];\n\t    _this13.inputSpec = [{\n\t      ndim: 4\n\t    }];\n\t    _this13.size = args.size == null ? _this13.DEFAULT_SIZE : args.size;\n\t    _this13.dataFormat = args.dataFormat == null ? 'channelsLast' : args.dataFormat;\n\t    checkDataFormat(_this13.dataFormat);\n\t    _this13.interpolation = args.interpolation == null ? 'nearest' : args.interpolation;\n\t    checkInterpolationFormat(_this13.interpolation);\n\t    return _this13;\n\t  }\n\n\t  var _proto9 = UpSampling2D.prototype;\n\n\t  _proto9.computeOutputShape = function computeOutputShape(inputShape) {\n\t    if (this.dataFormat === 'channelsFirst') {\n\t      var height = inputShape[2] == null ? null : this.size[0] * inputShape[2];\n\t      var width = inputShape[3] == null ? null : this.size[1] * inputShape[3];\n\t      return [inputShape[0], inputShape[1], height, width];\n\t    } else {\n\t      var _height = inputShape[1] == null ? null : this.size[0] * inputShape[1];\n\n\t      var _width = inputShape[2] == null ? null : this.size[1] * inputShape[2];\n\n\t      return [inputShape[0], _height, _width, inputShape[3]];\n\t    }\n\t  };\n\n\t  _proto9.call = function call(inputs, kwargs) {\n\t    var _this14 = this;\n\n\t    return tidy(function () {\n\t      var input = getExactlyOneTensor(inputs);\n\t      var inputShape = input.shape;\n\n\t      if (_this14.dataFormat === 'channelsFirst') {\n\t        input = transpose(input, [0, 2, 3, 1]);\n\t        var height = _this14.size[0] * inputShape[2];\n\t        var width = _this14.size[1] * inputShape[3];\n\t        var resized = _this14.interpolation === 'nearest' ? input.resizeNearestNeighbor([height, width]) : input.resizeBilinear([height, width]);\n\t        return transpose(resized, [0, 3, 1, 2]);\n\t      } else {\n\t        var _height2 = _this14.size[0] * inputShape[1];\n\n\t        var _width2 = _this14.size[1] * inputShape[2];\n\n\t        return _this14.interpolation === 'nearest' ? input.resizeNearestNeighbor([_height2, _width2]) : input.resizeBilinear([_height2, _width2]);\n\t      }\n\t    });\n\t  };\n\n\t  _proto9.getConfig = function getConfig() {\n\t    var config = {\n\t      size: this.size,\n\t      dataFormat: this.dataFormat\n\t    };\n\n\t    var baseConfig = _Layer3.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return UpSampling2D;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tUpSampling2D.className = 'UpSampling2D';\n\tregisterClass(UpSampling2D);\n\n\t/**\n\t * 2D convolution with separable filters.\n\t * @param x Input tensor.\n\t * @param depthwiseKernel Convolution kernel for depthwise convolution.\n\t * @param strides Strides (Array of two integers).\n\t * @param padding Padding model.\n\t * @param dataFormat Data format.\n\t * @param dilationRate Array of two integers, dilation rates for the separable\n\t *   convolution.\n\t * @returns Output tensor.\n\t * @throws ValueError If depthwiseKernel is not a 4D array.\n\t */\n\n\tfunction depthwiseConv2d$2(x, depthwiseKernel, strides, padding, dataFormat, dilationRate) {\n\t  if (strides === void 0) {\n\t    strides = [1, 1];\n\t  }\n\n\t  if (padding === void 0) {\n\t    padding = 'valid';\n\t  }\n\n\t  return tidy(function () {\n\t    if (dataFormat == null) {\n\t      dataFormat = imageDataFormat();\n\t    }\n\n\t    checkDataFormat(dataFormat);\n\t    var y = preprocessConv2DInput(x, dataFormat);\n\n\t    if (x.rank !== 4) {\n\t      throw new ValueError(\"Input for depthwiseConv2d is required to be 4-D, but is instead \" + (x.rank + \"-D\"));\n\t    }\n\n\t    if (depthwiseKernel.rank !== 4) {\n\t      throw new ValueError(\"depthwiseKernel is required to be 4-D, but is instead \" + (depthwiseKernel.rank + \"-D\"));\n\t    }\n\n\t    y = depthwiseConv2d(y, depthwiseKernel, strides, padding === 'same' ? 'same' : 'valid', 'NHWC', dilationRate);\n\n\t    if (dataFormat === 'channelsFirst') {\n\t      y = transpose(y, [0, 3, 1, 2]);\n\t    }\n\n\t    return y;\n\t  });\n\t}\n\tvar DepthwiseConv2D = /*#__PURE__*/function (_BaseConv) {\n\t  _inheritsLoose(DepthwiseConv2D, _BaseConv);\n\n\t  function DepthwiseConv2D(args) {\n\t    var _this;\n\n\t    _this = _BaseConv.call(this, 2, args) || this;\n\t    _this.depthwiseKernel = null;\n\t    _this.depthMultiplier = args.depthMultiplier == null ? 1 : args.depthMultiplier;\n\t    _this.depthwiseInitializer = getInitializer(args.depthwiseInitializer || _this.DEFAULT_KERNEL_INITIALIZER);\n\t    _this.depthwiseConstraint = getConstraint(args.depthwiseConstraint);\n\t    _this.depthwiseRegularizer = getRegularizer(args.depthwiseRegularizer);\n\t    return _this;\n\t  }\n\n\t  var _proto = DepthwiseConv2D.prototype;\n\n\t  _proto.build = function build(inputShape) {\n\t    inputShape = getExactlyOneShape(inputShape);\n\n\t    if (inputShape.length < 4) {\n\t      throw new ValueError(\"Inputs to DepthwiseConv2D should have rank 4. \" + (\"Received input shape: \" + JSON.stringify(inputShape) + \".\"));\n\t    }\n\n\t    var channelAxis = this.dataFormat === 'channelsFirst' ? 1 : 3;\n\n\t    if (inputShape[channelAxis] == null || inputShape[channelAxis] < 0) {\n\t      throw new ValueError('The channel dimension of the inputs to DepthwiseConv2D should ' + (\"be defined, but is not (\" + inputShape[channelAxis] + \").\"));\n\t    }\n\n\t    var inputDim = inputShape[channelAxis];\n\t    var depthwiseKernelShape = [this.kernelSize[0], this.kernelSize[1], inputDim, this.depthMultiplier];\n\t    this.depthwiseKernel = this.addWeight('depthwise_kernel', depthwiseKernelShape, null, this.depthwiseInitializer, this.depthwiseRegularizer, true, this.depthwiseConstraint);\n\n\t    if (this.useBias) {\n\t      this.bias = this.addWeight('bias', [inputDim * this.depthMultiplier], null, this.biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n\t    } else {\n\t      this.bias = null;\n\t    }\n\n\t    this.built = true;\n\t  };\n\n\t  _proto.call = function call(inputs, kwargs) {\n\t    var _this2 = this;\n\n\t    return tidy(function () {\n\t      inputs = getExactlyOneTensor(inputs);\n\t      var outputs = depthwiseConv2d$2(inputs, _this2.depthwiseKernel.read(), _this2.strides, _this2.padding, _this2.dataFormat, null); // TODO(cais): Add support for dilation.\n\n\t      if (_this2.useBias) {\n\t        outputs = biasAdd(outputs, _this2.bias.read(), _this2.dataFormat);\n\t      }\n\n\t      if (_this2.activation != null) {\n\t        outputs = _this2.activation.apply(outputs);\n\t      }\n\n\t      return outputs;\n\t    });\n\t  };\n\n\t  _proto.computeOutputShape = function computeOutputShape(inputShape) {\n\t    inputShape = getExactlyOneShape(inputShape);\n\t    var rows = this.dataFormat === 'channelsFirst' ? inputShape[2] : inputShape[1];\n\t    var cols = this.dataFormat === 'channelsFirst' ? inputShape[3] : inputShape[2];\n\t    var outFilters = this.dataFormat === 'channelsFirst' ? inputShape[1] * this.depthMultiplier : inputShape[3] * this.depthMultiplier;\n\t    var outRows = convOutputLength(rows, this.kernelSize[0], this.padding, this.strides[0]);\n\t    var outCols = convOutputLength(cols, this.kernelSize[1], this.padding, this.strides[1]);\n\n\t    if (this.dataFormat === 'channelsFirst') {\n\t      return [inputShape[0], outFilters, outRows, outCols];\n\t    } else {\n\t      // In this case, assume 'channelsLast'.\n\t      return [inputShape[0], outRows, outCols, outFilters];\n\t    }\n\t  };\n\n\t  _proto.getConfig = function getConfig() {\n\t    var config = _BaseConv.prototype.getConfig.call(this);\n\n\t    config['depthMultiplier'] = this.depthMultiplier;\n\t    config['depthwiseInitializer'] = serializeInitializer(this.depthwiseInitializer);\n\t    config['depthwiseRegularizer'] = serializeRegularizer(this.depthwiseRegularizer);\n\t    config['depthwiseConstraint'] = serializeConstraint(this.depthwiseRegularizer);\n\t    return config;\n\t  };\n\n\t  return DepthwiseConv2D;\n\t}(BaseConv);\n\t/** @nocollapse */\n\n\tDepthwiseConv2D.className = 'DepthwiseConv2D';\n\tregisterClass(DepthwiseConv2D);\n\n\t/**\n\t * Standardize `apply()` args to a single list of tensor inputs.\n\t *\n\t * When running a model loaded from file, the input tensors `initialState` and\n\t * `constants` are passed to `RNN.apply()` as part of `inputs` instead of the\n\t * dedicated kwargs fields. `inputs` consists of\n\t * `[inputs, initialState0, initialState1, ..., constant0, constant1]` in this\n\t * case.\n\t * This method makes sure that arguments are\n\t * separated and that `initialState` and `constants` are `Array`s of tensors\n\t * (or None).\n\t *\n\t * @param inputs Tensor or `Array` of  tensors.\n\t * @param initialState Tensor or `Array` of tensors or `null`/`undefined`.\n\t * @param constants Tensor or `Array` of tensors or `null`/`undefined`.\n\t * @returns An object consisting of\n\t *   inputs: A tensor.\n\t *   initialState: `Array` of tensors or `null`.\n\t *   constants: `Array` of tensors or `null`.\n\t * @throws ValueError, if `inputs` is an `Array` but either `initialState` or\n\t *   `constants` is provided.\n\t */\n\n\tfunction standardizeArgs(inputs, initialState, constants, numConstants) {\n\t  if (Array.isArray(inputs)) {\n\t    if (initialState != null || constants != null) {\n\t      throw new ValueError('When inputs is an array, neither initialState or constants ' + 'should be provided');\n\t    }\n\n\t    if (numConstants != null) {\n\t      constants = inputs.slice(inputs.length - numConstants, inputs.length);\n\t      inputs = inputs.slice(0, inputs.length - numConstants);\n\t    }\n\n\t    if (inputs.length > 1) {\n\t      initialState = inputs.slice(1, inputs.length);\n\t    }\n\n\t    inputs = inputs[0];\n\t  }\n\n\t  function toListOrNull(x) {\n\t    if (x == null || Array.isArray(x)) {\n\t      return x;\n\t    } else {\n\t      return [x];\n\t    }\n\t  }\n\n\t  initialState = toListOrNull(initialState);\n\t  constants = toListOrNull(constants);\n\t  return {\n\t    inputs: inputs,\n\t    initialState: initialState,\n\t    constants: constants\n\t  };\n\t}\n\t/**\n\t * Iterates over the time dimension of a tensor.\n\t *\n\t * @param stepFunction RNN step function.\n\t *   Parameters:\n\t *     inputs: tensor with shape `[samples, ...]` (no time dimension),\n\t *       representing input for the batch of samples at a certain time step.\n\t *     states: an Array of tensors.\n\t *   Returns:\n\t *     outputs: tensor with shape `[samples, outputDim]` (no time dimension).\n\t *     newStates: list of tensors, same length and shapes as `states`. The first\n\t *       state in the list must be the output tensor at the previous timestep.\n\t * @param inputs Tensor of temporal data of shape `[samples, time, ...]` (at\n\t *   least 3D).\n\t * @param initialStates Tensor with shape `[samples, outputDim]` (no time\n\t *   dimension), containing the initial values of the states used in the step\n\t *   function.\n\t * @param goBackwards If `true`, do the iteration over the time dimension in\n\t *   reverse order and return the reversed sequence.\n\t * @param mask Binary tensor with shape `[sample, time, 1]`, with a zero for\n\t *   every element that is masked.\n\t * @param constants An Array of constant values passed at each step.\n\t * @param unroll Whether to unroll the RNN or to use a symbolic loop. *Not*\n\t *   applicable to this imperative deeplearn.js backend. Its value is ignored.\n\t * @param needPerStepOutputs Whether the per-step outputs are to be\n\t *   concatenated into a single tensor and returned (as the second return\n\t *   value). Default: `false`. This arg is included so that the relatively\n\t *   expensive concatenation of the stepwise outputs can be omitted unless\n\t *   the stepwise outputs need to be kept (e.g., for an LSTM layer of which\n\t *   `returnSequence` is `true`.)\n\t * @returns An Array: `[lastOutput, outputs, newStates]`.\n\t *   lastOutput: the lastest output of the RNN, of shape `[samples, ...]`.\n\t *   outputs: tensor with shape `[samples, time, ...]` where each entry\n\t *     `output[s, t]` is the output of the step function at time `t` for sample\n\t *     `s`. This return value is provided if and only if the\n\t *     `needPerStepOutputs` is set as `true`. If it is set as `false`, this\n\t *     return value will be `undefined`.\n\t *   newStates: Array of tensors, latest states returned by the step function,\n\t *      of shape `(samples, ...)`.\n\t * @throws ValueError If input dimension is less than 3.\n\t *\n\t * TODO(nielsene): This needs to be tidy-ed.\n\t */\n\n\tfunction rnn(stepFunction, inputs, initialStates, goBackwards, mask, constants, unroll, needPerStepOutputs) {\n\t  if (goBackwards === void 0) {\n\t    goBackwards = false;\n\t  }\n\n\t  if (unroll === void 0) {\n\t    unroll = false;\n\t  }\n\n\t  if (needPerStepOutputs === void 0) {\n\t    needPerStepOutputs = false;\n\t  }\n\n\t  return tidy(function () {\n\t    var ndim = inputs.shape.length;\n\n\t    if (ndim < 3) {\n\t      throw new ValueError(\"Input should be at least 3D, but is \" + ndim + \"D.\");\n\t    } // Transpose to time-major, i.e., from [batch, time, ...] to [time, batch,\n\t    // ...].\n\n\n\t    var axes = [1, 0].concat(range$1(2, ndim));\n\t    inputs = transpose(inputs, axes);\n\n\t    if (constants != null) {\n\t      throw new NotImplementedError('The rnn() functoin of the deeplearn.js backend does not support ' + 'constants yet.');\n\t    } // Porting Note: the unroll option is ignored by the imperative backend.\n\n\n\t    if (unroll) {\n\t      console.warn('Backend rnn(): the unroll = true option is not applicable to the ' + 'imperative deeplearn.js backend.');\n\t    }\n\n\t    if (mask != null) {\n\t      mask = mask.asType('bool').asType('float32');\n\n\t      if (mask.rank === ndim - 1) {\n\t        mask = expandDims(mask, -1);\n\t      }\n\n\t      mask = transpose(mask, axes);\n\t    }\n\n\t    if (goBackwards) {\n\t      inputs = reverse(inputs, 0);\n\n\t      if (mask != null) {\n\t        mask = reverse(mask, 0);\n\t      }\n\t    } // Porting Note: PyKeras with TensorFlow backend uses a symbolic loop\n\t    //   (tf.while_loop). But for the imperative deeplearn.js backend, we just\n\t    //   use the usual TypeScript control flow to iterate over the time steps in\n\t    //   the inputs.\n\t    // Porting Note: PyKeras patches a \"_use_learning_phase\" attribute to\n\t    // outputs.\n\t    //   This is not idiomatic in TypeScript. The info regarding whether we are\n\t    //   in a learning (i.e., training) phase for RNN is passed in a different\n\t    //   way.\n\n\n\t    var perStepOutputs = [];\n\t    var lastOutput;\n\t    var states = initialStates;\n\t    var timeSteps = inputs.shape[0];\n\t    var perStepInputs = unstack(inputs);\n\t    var perStepMasks;\n\n\t    if (mask != null) {\n\t      perStepMasks = unstack(mask);\n\t    }\n\n\t    var _loop = function _loop(t) {\n\t      var currentInput = perStepInputs[t];\n\t      var stepOutputs = tidy(function () {\n\t        return stepFunction(currentInput, states);\n\t      });\n\n\t      if (mask == null) {\n\t        lastOutput = stepOutputs[0];\n\t        states = stepOutputs[1];\n\t      } else {\n\t        var maskedOutputs = tidy(function () {\n\t          var stepMask = perStepMasks[t];\n\t          var negStepMask = onesLike(stepMask).sub(stepMask); // TODO(cais): Would tfc.where() be better for performance?\n\n\t          var output = stepOutputs[0].mul(stepMask).add(states[0].mul(negStepMask));\n\t          var newStates = states.map(function (state, i) {\n\t            return stepOutputs[1][i].mul(stepMask).add(state.mul(negStepMask));\n\t          });\n\t          return {\n\t            output: output,\n\t            newStates: newStates\n\t          };\n\t        });\n\t        lastOutput = maskedOutputs.output;\n\t        states = maskedOutputs.newStates;\n\t      }\n\n\t      if (needPerStepOutputs) {\n\t        perStepOutputs.push(lastOutput);\n\t      }\n\t    };\n\n\t    for (var t = 0; t < timeSteps; ++t) {\n\t      _loop(t);\n\t    }\n\n\t    var outputs;\n\n\t    if (needPerStepOutputs) {\n\t      var axis = 1;\n\t      outputs = stack(perStepOutputs, axis);\n\t    }\n\n\t    return [lastOutput, outputs, states];\n\t  });\n\t}\n\tvar RNN = /*#__PURE__*/function (_Layer) {\n\t  _inheritsLoose(RNN, _Layer);\n\n\t  function RNN(args) {\n\t    var _this;\n\n\t    _this = _Layer.call(this, args) || this;\n\t    var cell;\n\n\t    if (args.cell == null) {\n\t      throw new ValueError('cell property is missing for the constructor of RNN.');\n\t    } else if (Array.isArray(args.cell)) {\n\t      cell = new StackedRNNCells({\n\t        cells: args.cell\n\t      });\n\t    } else {\n\t      cell = args.cell;\n\t    }\n\n\t    if (cell.stateSize == null) {\n\t      throw new ValueError('The RNN cell should have an attribute `stateSize` (tuple of ' + 'integers, one integer per RNN state).');\n\t    }\n\n\t    _this.cell = cell;\n\t    _this.returnSequences = args.returnSequences == null ? false : args.returnSequences;\n\t    _this.returnState = args.returnState == null ? false : args.returnState;\n\t    _this.goBackwards = args.goBackwards == null ? false : args.goBackwards;\n\t    _this._stateful = args.stateful == null ? false : args.stateful;\n\t    _this.unroll = args.unroll == null ? false : args.unroll;\n\t    _this.supportsMasking = true;\n\t    _this.inputSpec = [new InputSpec({\n\t      ndim: 3\n\t    })];\n\t    _this.stateSpec = null;\n\t    _this.states_ = null; // TODO(cais): Add constantsSpec and numConstants.\n\n\t    _this.numConstants = null; // TODO(cais): Look into the use of initial_state in the kwargs of the\n\t    //   constructor.\n\n\t    _this.keptStates = [];\n\t    return _this;\n\t  } // Porting Note: This is the equivalent of `RNN.states` property getter in\n\t  //   PyKeras.\n\n\n\t  var _proto = RNN.prototype;\n\n\t  _proto.getStates = function getStates() {\n\t    if (this.states_ == null) {\n\t      var numStates = Array.isArray(this.cell.stateSize) ? this.cell.stateSize.length : 1;\n\t      return range$1(0, numStates).map(function (x) {\n\t        return null;\n\t      });\n\t    } else {\n\t      return this.states_;\n\t    }\n\t  } // Porting Note: This is the equivalent of the `RNN.states` property setter in\n\t  //   PyKeras.\n\t  ;\n\n\t  _proto.setStates = function setStates(states) {\n\t    this.states_ = states;\n\t  };\n\n\t  _proto.computeOutputShape = function computeOutputShape(inputShape) {\n\t    if (isArrayOfShapes(inputShape)) {\n\t      inputShape = inputShape[0];\n\t    }\n\n\t    inputShape = inputShape; // TODO(cais): Remove the casting once stacked RNN cells become supported.\n\n\t    var stateSize = this.cell.stateSize;\n\n\t    if (!Array.isArray(stateSize)) {\n\t      stateSize = [stateSize];\n\t    }\n\n\t    var outputDim = stateSize[0];\n\t    var outputShape;\n\n\t    if (this.returnSequences) {\n\t      outputShape = [inputShape[0], inputShape[1], outputDim];\n\t    } else {\n\t      outputShape = [inputShape[0], outputDim];\n\t    }\n\n\t    if (this.returnState) {\n\t      var stateShape = [];\n\n\t      for (var _iterator = _createForOfIteratorHelperLoose(stateSize), _step; !(_step = _iterator()).done;) {\n\t        var dim = _step.value;\n\t        stateShape.push([inputShape[0], dim]);\n\t      }\n\n\t      return [outputShape].concat(stateShape);\n\t    } else {\n\t      return outputShape;\n\t    }\n\t  };\n\n\t  _proto.computeMask = function computeMask(inputs, mask) {\n\t    var _this2 = this;\n\n\t    return tidy(function () {\n\t      if (Array.isArray(mask)) {\n\t        mask = mask[0];\n\t      }\n\n\t      var outputMask = _this2.returnSequences ? mask : null;\n\n\t      if (_this2.returnState) {\n\t        var stateMask = _this2.states.map(function (s) {\n\t          return null;\n\t        });\n\n\t        return [outputMask].concat(stateMask);\n\t      } else {\n\t        return outputMask;\n\t      }\n\t    });\n\t  }\n\t  /**\n\t   * Get the current state tensors of the RNN.\n\t   *\n\t   * If the state hasn't been set, return an array of `null`s of the correct\n\t   * length.\n\t   */\n\t  ;\n\n\t  _proto.build = function build(inputShape) {\n\t    // Note inputShape will be an Array of Shapes of initial states and\n\t    // constants if these are passed in apply().\n\t    var constantShape = null;\n\n\t    if (this.numConstants != null) {\n\t      throw new NotImplementedError('Constants support is not implemented in RNN yet.');\n\t    }\n\n\t    if (isArrayOfShapes(inputShape)) {\n\t      inputShape = inputShape[0];\n\t    }\n\n\t    inputShape = inputShape;\n\t    var batchSize = this.stateful ? inputShape[0] : null;\n\t    var inputDim = inputShape.slice(2);\n\t    this.inputSpec[0] = new InputSpec({\n\t      shape: [batchSize, null].concat(inputDim)\n\t    }); // Allow cell (if RNNCell Layer) to build before we set or validate\n\t    // stateSpec.\n\n\t    var stepInputShape = [inputShape[0]].concat(inputShape.slice(2));\n\n\t    if (constantShape != null) {\n\t      throw new NotImplementedError('Constants support is not implemented in RNN yet.');\n\t    } else {\n\t      this.cell.build(stepInputShape);\n\t    } // Set or validate stateSpec.\n\n\n\t    var stateSize;\n\n\t    if (Array.isArray(this.cell.stateSize)) {\n\t      stateSize = this.cell.stateSize;\n\t    } else {\n\t      stateSize = [this.cell.stateSize];\n\t    }\n\n\t    if (this.stateSpec != null) {\n\t      if (!arraysEqual(this.stateSpec.map(function (spec) {\n\t        return spec.shape[spec.shape.length - 1];\n\t      }), stateSize)) {\n\t        throw new ValueError(\"An initialState was passed that is not compatible with \" + (\"cell.stateSize. Received stateSpec=\" + this.stateSpec + \"; \") + (\"However cell.stateSize is \" + this.cell.stateSize));\n\t      }\n\t    } else {\n\t      this.stateSpec = stateSize.map(function (dim) {\n\t        return new InputSpec({\n\t          shape: [null, dim]\n\t        });\n\t      });\n\t    }\n\n\t    if (this.stateful) {\n\t      this.resetStates();\n\t    }\n\t  }\n\t  /**\n\t   * Reset the state tensors of the RNN.\n\t   *\n\t   * If the `states` argument is `undefined` or `null`, will set the\n\t   * state tensor(s) of the RNN to all-zero tensors of the appropriate\n\t   * shape(s).\n\t   *\n\t   * If `states` is provided, will set the state tensors of the RNN to its\n\t   * value.\n\t   *\n\t   * @param states Optional externally-provided initial states.\n\t   * @param training Whether this call is done during training. For stateful\n\t   *   RNNs, this affects whether the old states are kept or discarded. In\n\t   *   particular, if `training` is `true`, the old states will be kept so\n\t   *   that subsequent backpropgataion through time (BPTT) may work properly.\n\t   *   Else, the old states will be discarded.\n\t   */\n\t  ;\n\n\t  _proto.resetStates = function resetStates(states, training) {\n\t    var _this3 = this;\n\n\t    if (training === void 0) {\n\t      training = false;\n\t    }\n\n\t    tidy(function () {\n\t      if (!_this3.stateful) {\n\t        throw new AttributeError('Cannot call resetStates() on an RNN Layer that is not stateful.');\n\t      }\n\n\t      var batchSize = _this3.inputSpec[0].shape[0];\n\n\t      if (batchSize == null) {\n\t        throw new ValueError('If an RNN is stateful, it needs to know its batch size. Specify ' + 'the batch size of your input tensors: \\n' + '- If using a Sequential model, specify the batch size by ' + 'passing a `batchInputShape` option to your first layer.\\n' + '- If using the functional API, specify the batch size by ' + 'passing a `batchShape` option to your Input layer.');\n\t      } // Initialize state if null.\n\n\n\t      if (_this3.states_ == null) {\n\t        if (Array.isArray(_this3.cell.stateSize)) {\n\t          _this3.states_ = _this3.cell.stateSize.map(function (dim) {\n\t            return zeros([batchSize, dim]);\n\t          });\n\t        } else {\n\t          _this3.states_ = [zeros([batchSize, _this3.cell.stateSize])];\n\t        }\n\t      } else if (states == null) {\n\t        // Dispose old state tensors.\n\t        dispose(_this3.states_); // For stateful RNNs, fully dispose kept old states.\n\n\t        if (_this3.keptStates != null) {\n\t          dispose(_this3.keptStates);\n\t          _this3.keptStates = [];\n\t        }\n\n\t        if (Array.isArray(_this3.cell.stateSize)) {\n\t          _this3.states_ = _this3.cell.stateSize.map(function (dim) {\n\t            return zeros([batchSize, dim]);\n\t          });\n\t        } else {\n\t          _this3.states_[0] = zeros([batchSize, _this3.cell.stateSize]);\n\t        }\n\t      } else {\n\t        if (!Array.isArray(states)) {\n\t          states = [states];\n\t        }\n\n\t        if (states.length !== _this3.states_.length) {\n\t          throw new ValueError(\"Layer \" + _this3.name + \" expects \" + _this3.states_.length + \" state(s), \" + (\"but it received \" + states.length + \" state value(s). Input \") + (\"received: \" + states));\n\t        }\n\n\t        if (training === true) {\n\t          // Store old state tensors for complete disposal later, i.e., during\n\t          // the next no-arg call to this method. We do not dispose the old\n\t          // states immediately because that BPTT (among other things) require\n\t          // them.\n\t          _this3.keptStates.push(_this3.states_.slice());\n\t        } else {\n\t          dispose(_this3.states_);\n\t        }\n\n\t        for (var index = 0; index < _this3.states_.length; ++index) {\n\t          var value = states[index];\n\t          var dim = Array.isArray(_this3.cell.stateSize) ? _this3.cell.stateSize[index] : _this3.cell.stateSize;\n\t          var expectedShape = [batchSize, dim];\n\n\t          if (!arraysEqual(value.shape, expectedShape)) {\n\t            throw new ValueError(\"State \" + index + \" is incompatible with layer \" + _this3.name + \": \" + (\"expected shape=\" + expectedShape + \", received shape=\" + value.shape));\n\t          }\n\n\t          _this3.states_[index] = value;\n\t        }\n\t      }\n\n\t      _this3.states_ = _this3.states_.map(function (state) {\n\t        return keep(state.clone());\n\t      });\n\t    });\n\t  };\n\n\t  _proto.apply = function apply(inputs, kwargs) {\n\t    // TODO(cais): Figure out whether initialState is in kwargs or inputs.\n\t    var initialState = kwargs == null ? null : kwargs['initialState'];\n\t    var constants = kwargs == null ? null : kwargs['constants'];\n\n\t    if (kwargs == null) {\n\t      kwargs = {};\n\t    }\n\n\t    var standardized = standardizeArgs(inputs, initialState, constants, this.numConstants);\n\t    inputs = standardized.inputs;\n\t    initialState = standardized.initialState;\n\t    constants = standardized.constants; // If any of `initial_state` or `constants` are specified and are\n\t    // `tf.SymbolicTensor`s, then add them to the inputs and temporarily modify\n\t    // the input_spec to include them.\n\n\t    var additionalInputs = [];\n\t    var additionalSpecs = [];\n\n\t    if (initialState != null) {\n\t      kwargs['initialState'] = initialState;\n\t      additionalInputs = additionalInputs.concat(initialState);\n\t      this.stateSpec = [];\n\n\t      for (var _iterator2 = _createForOfIteratorHelperLoose(initialState), _step2; !(_step2 = _iterator2()).done;) {\n\t        var state = _step2.value;\n\t        this.stateSpec.push(new InputSpec({\n\t          shape: state.shape\n\t        }));\n\t      } // TODO(cais): Use the following instead.\n\t      // this.stateSpec = initialState.map(state => new InputSpec({shape:\n\t      // state.shape}));\n\n\n\t      additionalSpecs = additionalSpecs.concat(this.stateSpec);\n\t    }\n\n\t    if (constants != null) {\n\t      kwargs['constants'] = constants;\n\t      additionalInputs = additionalInputs.concat(constants); // TODO(cais): Add this.constantsSpec.\n\n\t      this.numConstants = constants.length;\n\t    }\n\n\t    var isTensor = additionalInputs[0] instanceof SymbolicTensor;\n\n\t    if (isTensor) {\n\t      // Compute full input spec, including state and constants.\n\t      var fullInput = [inputs].concat(additionalInputs);\n\t      var fullInputSpec = this.inputSpec.concat(additionalSpecs); // Perform the call with temporarily replaced inputSpec.\n\n\t      var originalInputSpec = this.inputSpec;\n\t      this.inputSpec = fullInputSpec;\n\n\t      var output = _Layer.prototype.apply.call(this, fullInput, kwargs);\n\n\t      this.inputSpec = originalInputSpec;\n\t      return output;\n\t    } else {\n\t      return _Layer.prototype.apply.call(this, inputs, kwargs);\n\t    }\n\t  } // tslint:disable-next-line:no-any\n\t  ;\n\n\t  _proto.call = function call(inputs, kwargs) {\n\t    var _this4 = this;\n\n\t    // Input shape: `[samples, time (padded with zeros), input_dim]`.\n\t    // Note that the .build() method of subclasses **must** define\n\t    // this.inputSpec and this.stateSpec owith complete input shapes.\n\t    return tidy(function () {\n\t      var mask = kwargs == null ? null : kwargs['mask'];\n\t      var training = kwargs == null ? null : kwargs['training'];\n\t      var initialState = kwargs == null ? null : kwargs['initialState'];\n\t      inputs = getExactlyOneTensor(inputs);\n\n\t      if (initialState == null) {\n\t        if (_this4.stateful) {\n\t          initialState = _this4.states_;\n\t        } else {\n\t          initialState = _this4.getInitialState(inputs);\n\t        }\n\t      }\n\n\t      var numStates = Array.isArray(_this4.cell.stateSize) ? _this4.cell.stateSize.length : 1;\n\n\t      if (initialState.length !== numStates) {\n\t        throw new ValueError(\"RNN Layer has \" + numStates + \" state(s) but was passed \" + (initialState.length + \" initial state(s).\"));\n\t      }\n\n\t      if (_this4.unroll) {\n\t        console.warn('Ignoring unroll = true for RNN layer, due to imperative backend.');\n\t      }\n\n\t      var cellCallKwargs = {\n\t        training: training\n\t      }; // TODO(cais): Add support for constants.\n\n\t      var step = function step(inputs, states) {\n\t        // `inputs` and `states` are concatenated to form a single `Array` of\n\t        // `tf.Tensor`s as the input to `cell.call()`.\n\t        var outputs = _this4.cell.call([inputs].concat(states), cellCallKwargs); // Marshall the return value into output and new states.\n\n\n\t        return [outputs[0], outputs.slice(1)];\n\t      }; // TODO(cais): Add support for constants.\n\n\n\t      var rnnOutputs = rnn(step, inputs, initialState, _this4.goBackwards, mask, null, _this4.unroll, _this4.returnSequences);\n\t      var lastOutput = rnnOutputs[0];\n\t      var outputs = rnnOutputs[1];\n\t      var states = rnnOutputs[2];\n\n\t      if (_this4.stateful) {\n\t        _this4.resetStates(states, training);\n\t      }\n\n\t      var output = _this4.returnSequences ? outputs : lastOutput; // TODO(cais): Porperty set learning phase flag.\n\n\t      if (_this4.returnState) {\n\t        return [output].concat(states);\n\t      } else {\n\t        return output;\n\t      }\n\t    });\n\t  };\n\n\t  _proto.getInitialState = function getInitialState(inputs) {\n\t    var _this5 = this;\n\n\t    return tidy(function () {\n\t      // Build an all-zero tensor of shape [samples, outputDim].\n\t      // [Samples, timeSteps, inputDim].\n\t      var initialState = zeros(inputs.shape); // [Samples].\n\n\t      initialState = sum$1(initialState, [1, 2]);\n\t      initialState = expandDims$1(initialState); // [Samples, 1].\n\n\t      if (Array.isArray(_this5.cell.stateSize)) {\n\t        return _this5.cell.stateSize.map(function (dim) {\n\t          return dim > 1 ? tile$1(initialState, [1, dim]) : initialState;\n\t        });\n\t      } else {\n\t        return _this5.cell.stateSize > 1 ? [tile$1(initialState, [1, _this5.cell.stateSize])] : [initialState];\n\t      }\n\t    });\n\t  };\n\n\t  _proto.setFastWeightInitDuringBuild = function setFastWeightInitDuringBuild(value) {\n\t    _Layer.prototype.setFastWeightInitDuringBuild.call(this, value);\n\n\t    if (this.cell != null) {\n\t      this.cell.setFastWeightInitDuringBuild(value);\n\t    }\n\t  };\n\n\t  _proto.getConfig = function getConfig() {\n\t    var baseConfig = _Layer.prototype.getConfig.call(this);\n\n\t    var config = {\n\t      returnSequences: this.returnSequences,\n\t      returnState: this.returnState,\n\t      goBackwards: this.goBackwards,\n\t      stateful: this.stateful,\n\t      unroll: this.unroll\n\t    };\n\n\t    if (this.numConstants != null) {\n\t      config['numConstants'] = this.numConstants;\n\t    }\n\n\t    var cellConfig = this.cell.getConfig();\n\n\t    if (this.getClassName() === RNN.className) {\n\t      config['cell'] = {\n\t        'className': this.cell.getClassName(),\n\t        'config': cellConfig\n\t      };\n\t    } // this order is necessary, to prevent cell name from replacing layer name\n\n\n\t    return Object.assign({}, cellConfig, baseConfig, config);\n\t  }\n\t  /** @nocollapse */\n\t  ;\n\n\t  RNN.fromConfig = function fromConfig(cls, config, customObjects) {\n\t    if (customObjects === void 0) {\n\t      customObjects = {};\n\t    }\n\n\t    var cellConfig = config['cell'];\n\t    var cell = deserialize$1(cellConfig, customObjects);\n\t    return new cls(Object.assign(config, {\n\t      cell: cell\n\t    }));\n\t  };\n\n\t  _createClass(RNN, [{\n\t    key: \"states\",\n\t    get: function get() {\n\t      if (this.states_ == null) {\n\t        var numStates = Array.isArray(this.cell.stateSize) ? this.cell.stateSize.length : 1;\n\t        var output = [];\n\n\t        for (var i = 0; i < numStates; ++i) {\n\t          output.push(null);\n\t        }\n\n\t        return output;\n\t      } else {\n\t        return this.states_;\n\t      }\n\t    },\n\t    set: function set(s) {\n\t      this.states_ = s;\n\t    }\n\t  }, {\n\t    key: \"trainableWeights\",\n\t    get: function get() {\n\t      if (!this.trainable) {\n\t        return [];\n\t      } // Porting Note: In TypeScript, `this` is always an instance of `Layer`.\n\n\n\t      return this.cell.trainableWeights;\n\t    }\n\t  }, {\n\t    key: \"nonTrainableWeights\",\n\t    get: function get() {\n\t      // Porting Note: In TypeScript, `this` is always an instance of `Layer`.\n\t      if (!this.trainable) {\n\t        return this.cell.weights;\n\t      }\n\n\t      return this.cell.nonTrainableWeights;\n\t    }\n\t  }]);\n\n\t  return RNN;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tRNN.className = 'RNN';\n\tregisterClass(RNN); // Porting Note: This is a common parent class for RNN cells. There is no\n\t// equivalent of this in PyKeras. Having a common parent class forgoes the\n\t//  need for `has_attr(cell, ...)` checks or its TypeScript equivalent.\n\n\t/**\n\t * An RNNCell layer.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Classes'}\n\t */\n\n\tvar RNNCell = /*#__PURE__*/function (_Layer2) {\n\t  _inheritsLoose(RNNCell, _Layer2);\n\n\t  function RNNCell() {\n\t    return _Layer2.apply(this, arguments) || this;\n\t  }\n\n\t  return RNNCell;\n\t}(Layer);\n\tvar SimpleRNNCell = /*#__PURE__*/function (_RNNCell) {\n\t  _inheritsLoose(SimpleRNNCell, _RNNCell);\n\n\t  function SimpleRNNCell(args) {\n\t    var _this6;\n\n\t    _this6 = _RNNCell.call(this, args) || this;\n\t    _this6.DEFAULT_ACTIVATION = 'tanh';\n\t    _this6.DEFAULT_KERNEL_INITIALIZER = 'glorotNormal';\n\t    _this6.DEFAULT_RECURRENT_INITIALIZER = 'orthogonal';\n\t    _this6.DEFAULT_BIAS_INITIALIZER = 'zeros';\n\t    _this6.units = args.units;\n\t    assertPositiveInteger(_this6.units, \"units\");\n\t    _this6.activation = getActivation(args.activation == null ? _this6.DEFAULT_ACTIVATION : args.activation);\n\t    _this6.useBias = args.useBias == null ? true : args.useBias;\n\t    _this6.kernelInitializer = getInitializer(args.kernelInitializer || _this6.DEFAULT_KERNEL_INITIALIZER);\n\t    _this6.recurrentInitializer = getInitializer(args.recurrentInitializer || _this6.DEFAULT_RECURRENT_INITIALIZER);\n\t    _this6.biasInitializer = getInitializer(args.biasInitializer || _this6.DEFAULT_BIAS_INITIALIZER);\n\t    _this6.kernelRegularizer = getRegularizer(args.kernelRegularizer);\n\t    _this6.recurrentRegularizer = getRegularizer(args.recurrentRegularizer);\n\t    _this6.biasRegularizer = getRegularizer(args.biasRegularizer);\n\t    _this6.kernelConstraint = getConstraint(args.kernelConstraint);\n\t    _this6.recurrentConstraint = getConstraint(args.recurrentConstraint);\n\t    _this6.biasConstraint = getConstraint(args.biasConstraint);\n\t    _this6.dropout = min$a([1, max$5([0, args.dropout == null ? 0 : args.dropout])]);\n\t    _this6.recurrentDropout = min$a([1, max$5([0, args.recurrentDropout == null ? 0 : args.recurrentDropout])]);\n\t    _this6.stateSize = _this6.units;\n\t    _this6.dropoutMask = null;\n\t    _this6.recurrentDropoutMask = null;\n\t    return _this6;\n\t  }\n\n\t  var _proto2 = SimpleRNNCell.prototype;\n\n\t  _proto2.build = function build(inputShape) {\n\t    inputShape = getExactlyOneShape(inputShape); // TODO(cais): Use regularizer.\n\n\t    this.kernel = this.addWeight('kernel', [inputShape[inputShape.length - 1], this.units], null, this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n\t    this.recurrentKernel = this.addWeight('recurrent_kernel', [this.units, this.units], null, this.recurrentInitializer, this.recurrentRegularizer, true, this.recurrentConstraint);\n\n\t    if (this.useBias) {\n\t      this.bias = this.addWeight('bias', [this.units], null, this.biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n\t    } else {\n\t      this.bias = null;\n\t    }\n\n\t    this.built = true;\n\t  } // Porting Note: PyKeras' equivalent of this method takes two tensor inputs:\n\t  //   `inputs` and `states`. Here, the two tensors are combined into an\n\t  //   `Tensor[]` Array as the first input argument.\n\t  //   Similarly, PyKeras' equivalent of this method returns two values:\n\t  //    `output` and `[output]`. Here the two are combined into one length-2\n\t  //    `Tensor[]`, consisting of `output` repeated.\n\t  ;\n\n\t  _proto2.call = function call(inputs, kwargs) {\n\t    var _this7 = this;\n\n\t    return tidy(function () {\n\t      inputs = inputs;\n\n\t      if (inputs.length !== 2) {\n\t        throw new ValueError(\"SimpleRNNCell expects 2 input Tensors, got \" + inputs.length + \".\");\n\t      }\n\n\t      var prevOutput = inputs[1];\n\t      inputs = inputs[0];\n\t      var training = kwargs['training'] == null ? false : kwargs['training'];\n\n\t      if (0 < _this7.dropout && _this7.dropout < 1 && _this7.dropoutMask == null) {\n\t        _this7.dropoutMask = generateDropoutMask({\n\t          ones: function ones() {\n\t            return onesLike(inputs);\n\t          },\n\t          rate: _this7.dropout,\n\t          training: training\n\t        });\n\t      }\n\n\t      if (0 < _this7.recurrentDropout && _this7.recurrentDropout < 1 && _this7.recurrentDropoutMask == null) {\n\t        _this7.recurrentDropoutMask = generateDropoutMask({\n\t          ones: function ones() {\n\t            return onesLike(prevOutput);\n\t          },\n\t          rate: _this7.recurrentDropout,\n\t          training: training\n\t        });\n\t      }\n\n\t      var h;\n\t      var dpMask = _this7.dropoutMask;\n\t      var recDpMask = _this7.recurrentDropoutMask;\n\n\t      if (dpMask != null) {\n\t        h = dot$1(mul(inputs, dpMask), _this7.kernel.read());\n\t      } else {\n\t        h = dot$1(inputs, _this7.kernel.read());\n\t      }\n\n\t      if (_this7.bias != null) {\n\t        h = biasAdd(h, _this7.bias.read());\n\t      }\n\n\t      if (recDpMask != null) {\n\t        prevOutput = mul(prevOutput, recDpMask);\n\t      }\n\n\t      var output = add$1(h, dot$1(prevOutput, _this7.recurrentKernel.read()));\n\n\t      if (_this7.activation != null) {\n\t        output = _this7.activation.apply(output);\n\t      } // TODO(cais): Properly set learning phase on output tensor?\n\n\n\t      return [output, output];\n\t    });\n\t  };\n\n\t  _proto2.getConfig = function getConfig() {\n\t    var baseConfig = _RNNCell.prototype.getConfig.call(this);\n\n\t    var config = {\n\t      units: this.units,\n\t      activation: serializeActivation(this.activation),\n\t      useBias: this.useBias,\n\t      kernelInitializer: serializeInitializer(this.kernelInitializer),\n\t      recurrentInitializer: serializeInitializer(this.recurrentInitializer),\n\t      biasInitializer: serializeInitializer(this.biasInitializer),\n\t      kernelRegularizer: serializeRegularizer(this.kernelRegularizer),\n\t      recurrentRegularizer: serializeRegularizer(this.recurrentRegularizer),\n\t      biasRegularizer: serializeRegularizer(this.biasRegularizer),\n\t      activityRegularizer: serializeRegularizer(this.activityRegularizer),\n\t      kernelConstraint: serializeConstraint(this.kernelConstraint),\n\t      recurrentConstraint: serializeConstraint(this.recurrentConstraint),\n\t      biasConstraint: serializeConstraint(this.biasConstraint),\n\t      dropout: this.dropout,\n\t      recurrentDropout: this.recurrentDropout\n\t    };\n\t    return Object.assign({}, baseConfig, config);\n\t  };\n\n\t  return SimpleRNNCell;\n\t}(RNNCell);\n\t/** @nocollapse */\n\n\tSimpleRNNCell.className = 'SimpleRNNCell';\n\tregisterClass(SimpleRNNCell);\n\tvar SimpleRNN = /*#__PURE__*/function (_RNN) {\n\t  _inheritsLoose(SimpleRNN, _RNN);\n\n\t  function SimpleRNN(args) {\n\t    args.cell = new SimpleRNNCell(args);\n\t    return _RNN.call(this, args) || this; // TODO(cais): Add activityRegularizer.\n\t  }\n\n\t  var _proto3 = SimpleRNN.prototype;\n\n\t  _proto3.call = function call(inputs, kwargs) {\n\t    var _this8 = this;\n\n\t    return tidy(function () {\n\t      if (_this8.cell.dropoutMask != null) {\n\t        dispose(_this8.cell.dropoutMask);\n\t        _this8.cell.dropoutMask = null;\n\t      }\n\n\t      if (_this8.cell.recurrentDropoutMask != null) {\n\t        dispose(_this8.cell.recurrentDropoutMask);\n\t        _this8.cell.recurrentDropoutMask = null;\n\t      }\n\n\t      var mask = kwargs == null ? null : kwargs['mask'];\n\t      var training = kwargs == null ? null : kwargs['training'];\n\t      var initialState = kwargs == null ? null : kwargs['initialState'];\n\t      return _RNN.prototype.call.call(_this8, inputs, {\n\t        mask: mask,\n\t        training: training,\n\t        initialState: initialState\n\t      });\n\t    });\n\t  }\n\t  /** @nocollapse */\n\t  ;\n\n\t  SimpleRNN.fromConfig = function fromConfig(cls, config) {\n\t    return new cls(config);\n\t  };\n\n\t  return SimpleRNN;\n\t}(RNN);\n\t/** @nocollapse */\n\n\tSimpleRNN.className = 'SimpleRNN';\n\tregisterClass(SimpleRNN);\n\tvar GRUCell = /*#__PURE__*/function (_RNNCell2) {\n\t  _inheritsLoose(GRUCell, _RNNCell2);\n\n\t  function GRUCell(args) {\n\t    var _this9;\n\n\t    _this9 = _RNNCell2.call(this, args) || this;\n\t    _this9.DEFAULT_ACTIVATION = 'tanh';\n\t    _this9.DEFAULT_RECURRENT_ACTIVATION = 'hardSigmoid';\n\t    _this9.DEFAULT_KERNEL_INITIALIZER = 'glorotNormal';\n\t    _this9.DEFAULT_RECURRENT_INITIALIZER = 'orthogonal';\n\t    _this9.DEFAULT_BIAS_INITIALIZER = 'zeros';\n\n\t    if (args.resetAfter) {\n\t      throw new ValueError(\"GRUCell does not support reset_after parameter set to true.\");\n\t    }\n\n\t    _this9.units = args.units;\n\t    assertPositiveInteger(_this9.units, 'units');\n\t    _this9.activation = getActivation(args.activation === undefined ? _this9.DEFAULT_ACTIVATION : args.activation);\n\t    _this9.recurrentActivation = getActivation(args.recurrentActivation === undefined ? _this9.DEFAULT_RECURRENT_ACTIVATION : args.recurrentActivation);\n\t    _this9.useBias = args.useBias == null ? true : args.useBias;\n\t    _this9.kernelInitializer = getInitializer(args.kernelInitializer || _this9.DEFAULT_KERNEL_INITIALIZER);\n\t    _this9.recurrentInitializer = getInitializer(args.recurrentInitializer || _this9.DEFAULT_RECURRENT_INITIALIZER);\n\t    _this9.biasInitializer = getInitializer(args.biasInitializer || _this9.DEFAULT_BIAS_INITIALIZER);\n\t    _this9.kernelRegularizer = getRegularizer(args.kernelRegularizer);\n\t    _this9.recurrentRegularizer = getRegularizer(args.recurrentRegularizer);\n\t    _this9.biasRegularizer = getRegularizer(args.biasRegularizer);\n\t    _this9.kernelConstraint = getConstraint(args.kernelConstraint);\n\t    _this9.recurrentConstraint = getConstraint(args.recurrentConstraint);\n\t    _this9.biasConstraint = getConstraint(args.biasConstraint);\n\t    _this9.dropout = min$a([1, max$5([0, args.dropout == null ? 0 : args.dropout])]);\n\t    _this9.recurrentDropout = min$a([1, max$5([0, args.recurrentDropout == null ? 0 : args.recurrentDropout])]);\n\t    _this9.implementation = args.implementation;\n\t    _this9.stateSize = _this9.units;\n\t    _this9.dropoutMask = null;\n\t    _this9.recurrentDropoutMask = null;\n\t    return _this9;\n\t  }\n\n\t  var _proto4 = GRUCell.prototype;\n\n\t  _proto4.build = function build(inputShape) {\n\t    inputShape = getExactlyOneShape(inputShape);\n\t    var inputDim = inputShape[inputShape.length - 1];\n\t    this.kernel = this.addWeight('kernel', [inputDim, this.units * 3], null, this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n\t    this.recurrentKernel = this.addWeight('recurrent_kernel', [this.units, this.units * 3], null, this.recurrentInitializer, this.recurrentRegularizer, true, this.recurrentConstraint);\n\n\t    if (this.useBias) {\n\t      this.bias = this.addWeight('bias', [this.units * 3], null, this.biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n\t    } else {\n\t      this.bias = null;\n\t    } // Porting Notes: Unlike the PyKeras implementation, we perform slicing\n\t    //   of the weights and bias in the call() method, at execution time.\n\n\n\t    this.built = true;\n\t  };\n\n\t  _proto4.call = function call(inputs, kwargs) {\n\t    var _this10 = this;\n\n\t    return tidy(function () {\n\t      inputs = inputs;\n\n\t      if (inputs.length !== 2) {\n\t        throw new ValueError(\"GRUCell expects 2 input Tensors (inputs, h, c), got \" + (inputs.length + \".\"));\n\t      }\n\n\t      var training = kwargs['training'] == null ? false : kwargs['training'];\n\t      var hTMinus1 = inputs[1]; // Previous memory state.\n\n\t      inputs = inputs[0]; // Note: For superior performance, TensorFlow.js always uses\n\t      // implementation 2, regardless of the actual value of\n\t      // config.implementation.\n\n\t      if (0 < _this10.dropout && _this10.dropout < 1 && _this10.dropoutMask == null) {\n\t        _this10.dropoutMask = generateDropoutMask({\n\t          ones: function ones() {\n\t            return onesLike(inputs);\n\t          },\n\t          rate: _this10.dropout,\n\t          training: training,\n\t          count: 3\n\t        });\n\t      }\n\n\t      if (0 < _this10.recurrentDropout && _this10.recurrentDropout < 1 && _this10.recurrentDropoutMask == null) {\n\t        _this10.recurrentDropoutMask = generateDropoutMask({\n\t          ones: function ones() {\n\t            return onesLike(hTMinus1);\n\t          },\n\t          rate: _this10.recurrentDropout,\n\t          training: training,\n\t          count: 3\n\t        });\n\t      }\n\n\t      var dpMask = _this10.dropoutMask;\n\t      var recDpMask = _this10.recurrentDropoutMask;\n\t      var z;\n\t      var r;\n\t      var hh;\n\n\t      if (0 < _this10.dropout && _this10.dropout < 1) {\n\t        inputs = mul(inputs, dpMask[0]);\n\t      }\n\n\t      var matrixX = dot$1(inputs, _this10.kernel.read());\n\n\t      if (_this10.useBias) {\n\t        matrixX = biasAdd(matrixX, _this10.bias.read());\n\t      }\n\n\t      if (0 < _this10.recurrentDropout && _this10.recurrentDropout < 1) {\n\t        hTMinus1 = mul(hTMinus1, recDpMask[0]);\n\t      }\n\n\t      var recurrentKernelValue = _this10.recurrentKernel.read();\n\n\t      var _tfc$split = split$1(recurrentKernelValue, [2 * _this10.units, _this10.units], recurrentKernelValue.rank - 1),\n\t          rk1 = _tfc$split[0],\n\t          rk2 = _tfc$split[1];\n\n\t      var matrixInner = dot$1(hTMinus1, rk1);\n\n\t      var _tfc$split2 = split$1(matrixX, 3, matrixX.rank - 1),\n\t          xZ = _tfc$split2[0],\n\t          xR = _tfc$split2[1],\n\t          xH = _tfc$split2[2];\n\n\t      var _tfc$split3 = split$1(matrixInner, 2, matrixInner.rank - 1),\n\t          recurrentZ = _tfc$split3[0],\n\t          recurrentR = _tfc$split3[1];\n\n\t      z = _this10.recurrentActivation.apply(add$1(xZ, recurrentZ));\n\t      r = _this10.recurrentActivation.apply(add$1(xR, recurrentR));\n\t      var recurrentH = dot$1(mul(r, hTMinus1), rk2);\n\t      hh = _this10.activation.apply(add$1(xH, recurrentH));\n\t      var h = add$1(mul(z, hTMinus1), mul(add$1(1, neg(z)), hh)); // TODO(cais): Add use_learning_phase flag properly.\n\n\t      return [h, h];\n\t    });\n\t  };\n\n\t  _proto4.getConfig = function getConfig() {\n\t    var baseConfig = _RNNCell2.prototype.getConfig.call(this);\n\n\t    var config = {\n\t      units: this.units,\n\t      activation: serializeActivation(this.activation),\n\t      recurrentActivation: serializeActivation(this.recurrentActivation),\n\t      useBias: this.useBias,\n\t      kernelInitializer: serializeInitializer(this.kernelInitializer),\n\t      recurrentInitializer: serializeInitializer(this.recurrentInitializer),\n\t      biasInitializer: serializeInitializer(this.biasInitializer),\n\t      kernelRegularizer: serializeRegularizer(this.kernelRegularizer),\n\t      recurrentRegularizer: serializeRegularizer(this.recurrentRegularizer),\n\t      biasRegularizer: serializeRegularizer(this.biasRegularizer),\n\t      activityRegularizer: serializeRegularizer(this.activityRegularizer),\n\t      kernelConstraint: serializeConstraint(this.kernelConstraint),\n\t      recurrentConstraint: serializeConstraint(this.recurrentConstraint),\n\t      biasConstraint: serializeConstraint(this.biasConstraint),\n\t      dropout: this.dropout,\n\t      recurrentDropout: this.recurrentDropout,\n\t      implementation: this.implementation,\n\t      resetAfter: false\n\t    };\n\t    return Object.assign({}, baseConfig, config);\n\t  };\n\n\t  return GRUCell;\n\t}(RNNCell);\n\t/** @nocollapse */\n\n\tGRUCell.className = 'GRUCell';\n\tregisterClass(GRUCell);\n\tvar GRU = /*#__PURE__*/function (_RNN2) {\n\t  _inheritsLoose(GRU, _RNN2);\n\n\t  function GRU(args) {\n\t    if (args.implementation === 0) {\n\t      console.warn('`implementation=0` has been deprecated, and now defaults to ' + '`implementation=1`. Please update your layer call.');\n\t    }\n\n\t    args.cell = new GRUCell(args);\n\t    return _RNN2.call(this, args) || this; // TODO(cais): Add activityRegularizer.\n\t  }\n\n\t  var _proto5 = GRU.prototype;\n\n\t  _proto5.call = function call(inputs, kwargs) {\n\t    var _this11 = this;\n\n\t    return tidy(function () {\n\t      if (_this11.cell.dropoutMask != null) {\n\t        dispose(_this11.cell.dropoutMask);\n\t        _this11.cell.dropoutMask = null;\n\t      }\n\n\t      if (_this11.cell.recurrentDropoutMask != null) {\n\t        dispose(_this11.cell.recurrentDropoutMask);\n\t        _this11.cell.recurrentDropoutMask = null;\n\t      }\n\n\t      var mask = kwargs == null ? null : kwargs['mask'];\n\t      var training = kwargs == null ? null : kwargs['training'];\n\t      var initialState = kwargs == null ? null : kwargs['initialState'];\n\t      return _RNN2.prototype.call.call(_this11, inputs, {\n\t        mask: mask,\n\t        training: training,\n\t        initialState: initialState\n\t      });\n\t    });\n\t  }\n\t  /** @nocollapse */\n\t  ;\n\n\t  GRU.fromConfig = function fromConfig(cls, config) {\n\t    if (config['implmentation'] === 0) {\n\t      config['implementation'] = 1;\n\t    }\n\n\t    return new cls(config);\n\t  };\n\n\t  return GRU;\n\t}(RNN);\n\t/** @nocollapse */\n\n\tGRU.className = 'GRU';\n\tregisterClass(GRU);\n\tvar LSTMCell = /*#__PURE__*/function (_RNNCell3) {\n\t  _inheritsLoose(LSTMCell, _RNNCell3);\n\n\t  function LSTMCell(args) {\n\t    var _this12;\n\n\t    _this12 = _RNNCell3.call(this, args) || this;\n\t    _this12.DEFAULT_ACTIVATION = 'tanh';\n\t    _this12.DEFAULT_RECURRENT_ACTIVATION = 'hardSigmoid';\n\t    _this12.DEFAULT_KERNEL_INITIALIZER = 'glorotNormal';\n\t    _this12.DEFAULT_RECURRENT_INITIALIZER = 'orthogonal';\n\t    _this12.DEFAULT_BIAS_INITIALIZER = 'zeros';\n\t    _this12.units = args.units;\n\t    assertPositiveInteger(_this12.units, 'units');\n\t    _this12.activation = getActivation(args.activation === undefined ? _this12.DEFAULT_ACTIVATION : args.activation);\n\t    _this12.recurrentActivation = getActivation(args.recurrentActivation === undefined ? _this12.DEFAULT_RECURRENT_ACTIVATION : args.recurrentActivation);\n\t    _this12.useBias = args.useBias == null ? true : args.useBias;\n\t    _this12.kernelInitializer = getInitializer(args.kernelInitializer || _this12.DEFAULT_KERNEL_INITIALIZER);\n\t    _this12.recurrentInitializer = getInitializer(args.recurrentInitializer || _this12.DEFAULT_RECURRENT_INITIALIZER);\n\t    _this12.biasInitializer = getInitializer(args.biasInitializer || _this12.DEFAULT_BIAS_INITIALIZER);\n\t    _this12.unitForgetBias = args.unitForgetBias;\n\t    _this12.kernelRegularizer = getRegularizer(args.kernelRegularizer);\n\t    _this12.recurrentRegularizer = getRegularizer(args.recurrentRegularizer);\n\t    _this12.biasRegularizer = getRegularizer(args.biasRegularizer);\n\t    _this12.kernelConstraint = getConstraint(args.kernelConstraint);\n\t    _this12.recurrentConstraint = getConstraint(args.recurrentConstraint);\n\t    _this12.biasConstraint = getConstraint(args.biasConstraint);\n\t    _this12.dropout = min$a([1, max$5([0, args.dropout == null ? 0 : args.dropout])]);\n\t    _this12.recurrentDropout = min$a([1, max$5([0, args.recurrentDropout == null ? 0 : args.recurrentDropout])]);\n\t    _this12.implementation = args.implementation;\n\t    _this12.stateSize = [_this12.units, _this12.units];\n\t    _this12.dropoutMask = null;\n\t    _this12.recurrentDropoutMask = null;\n\t    return _this12;\n\t  }\n\n\t  var _proto6 = LSTMCell.prototype;\n\n\t  _proto6.build = function build(inputShape) {\n\t    var _a;\n\n\t    inputShape = getExactlyOneShape(inputShape);\n\t    var inputDim = inputShape[inputShape.length - 1];\n\t    this.kernel = this.addWeight('kernel', [inputDim, this.units * 4], null, this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n\t    this.recurrentKernel = this.addWeight('recurrent_kernel', [this.units, this.units * 4], null, this.recurrentInitializer, this.recurrentRegularizer, true, this.recurrentConstraint);\n\t    var biasInitializer;\n\n\t    if (this.useBias) {\n\t      if (this.unitForgetBias) {\n\t        var capturedBiasInit = this.biasInitializer;\n\t        var capturedUnits = this.units;\n\t        biasInitializer = new (_a = /*#__PURE__*/function (_Initializer) {\n\t          _inheritsLoose(CustomInit, _Initializer);\n\n\t          function CustomInit() {\n\t            return _Initializer.apply(this, arguments) || this;\n\t          }\n\n\t          var _proto7 = CustomInit.prototype;\n\n\t          _proto7.apply = function apply(shape, dtype) {\n\t            // TODO(cais): More informative variable names?\n\t            var bI = capturedBiasInit.apply([capturedUnits]);\n\t            var bF = new Ones().apply([capturedUnits]);\n\t            var bCAndH = capturedBiasInit.apply([capturedUnits * 2]);\n\t            return concatAlongFirstAxis(concatAlongFirstAxis(bI, bF), bCAndH);\n\t          };\n\n\t          return CustomInit;\n\t        }(Initializer),\n\t        /** @nocollapse */\n\t        _a.className = 'CustomInit', _a)();\n\t      } else {\n\t        biasInitializer = this.biasInitializer;\n\t      }\n\n\t      this.bias = this.addWeight('bias', [this.units * 4], null, biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n\t    } else {\n\t      this.bias = null;\n\t    } // Porting Notes: Unlike the PyKeras implementation, we perform slicing\n\t    //   of the weights and bias in the call() method, at execution time.\n\n\n\t    this.built = true;\n\t  };\n\n\t  _proto6.call = function call(inputs, kwargs) {\n\t    var _this13 = this;\n\n\t    return tidy(function () {\n\t      var training = kwargs['training'] == null ? false : kwargs['training'];\n\t      inputs = inputs;\n\n\t      if (inputs.length !== 3) {\n\t        throw new ValueError(\"LSTMCell expects 3 input Tensors (inputs, h, c), got \" + (inputs.length + \".\"));\n\t      }\n\n\t      var hTMinus1 = inputs[1]; // Previous memory state.\n\n\t      var cTMinus1 = inputs[2]; // Previous carry state.\n\n\t      inputs = inputs[0];\n\n\t      if (0 < _this13.dropout && _this13.dropout < 1 && _this13.dropoutMask == null) {\n\t        _this13.dropoutMask = generateDropoutMask({\n\t          ones: function ones() {\n\t            return onesLike(inputs);\n\t          },\n\t          rate: _this13.dropout,\n\t          training: training,\n\t          count: 4\n\t        });\n\t      }\n\n\t      if (0 < _this13.recurrentDropout && _this13.recurrentDropout < 1 && _this13.recurrentDropoutMask == null) {\n\t        _this13.recurrentDropoutMask = generateDropoutMask({\n\t          ones: function ones() {\n\t            return onesLike(hTMinus1);\n\t          },\n\t          rate: _this13.recurrentDropout,\n\t          training: training,\n\t          count: 4\n\t        });\n\t      }\n\n\t      var dpMask = _this13.dropoutMask;\n\t      var recDpMask = _this13.recurrentDropoutMask; // Note: For superior performance, TensorFlow.js always uses\n\t      // implementation 2 regardless of the actual value of\n\t      // config.implementation.\n\n\t      var i;\n\t      var f;\n\t      var c;\n\t      var o;\n\n\t      if (0 < _this13.dropout && _this13.dropout < 1) {\n\t        inputs = mul(inputs, dpMask[0]);\n\t      }\n\n\t      var z = dot$1(inputs, _this13.kernel.read());\n\n\t      if (0 < _this13.recurrentDropout && _this13.recurrentDropout < 1) {\n\t        hTMinus1 = mul(hTMinus1, recDpMask[0]);\n\t      }\n\n\t      z = add$1(z, dot$1(hTMinus1, _this13.recurrentKernel.read()));\n\n\t      if (_this13.useBias) {\n\t        z = biasAdd(z, _this13.bias.read());\n\t      }\n\n\t      var _tfc$split4 = split$1(z, 4, z.rank - 1),\n\t          z0 = _tfc$split4[0],\n\t          z1 = _tfc$split4[1],\n\t          z2 = _tfc$split4[2],\n\t          z3 = _tfc$split4[3];\n\n\t      i = _this13.recurrentActivation.apply(z0);\n\t      f = _this13.recurrentActivation.apply(z1);\n\t      c = add$1(mul(f, cTMinus1), mul(i, _this13.activation.apply(z2)));\n\t      o = _this13.recurrentActivation.apply(z3);\n\t      var h = mul(o, _this13.activation.apply(c)); // TODO(cais): Add use_learning_phase flag properly.\n\n\t      return [h, h, c];\n\t    });\n\t  };\n\n\t  _proto6.getConfig = function getConfig() {\n\t    var baseConfig = _RNNCell3.prototype.getConfig.call(this);\n\n\t    var config = {\n\t      units: this.units,\n\t      activation: serializeActivation(this.activation),\n\t      recurrentActivation: serializeActivation(this.recurrentActivation),\n\t      useBias: this.useBias,\n\t      kernelInitializer: serializeInitializer(this.kernelInitializer),\n\t      recurrentInitializer: serializeInitializer(this.recurrentInitializer),\n\t      biasInitializer: serializeInitializer(this.biasInitializer),\n\t      unitForgetBias: this.unitForgetBias,\n\t      kernelRegularizer: serializeRegularizer(this.kernelRegularizer),\n\t      recurrentRegularizer: serializeRegularizer(this.recurrentRegularizer),\n\t      biasRegularizer: serializeRegularizer(this.biasRegularizer),\n\t      activityRegularizer: serializeRegularizer(this.activityRegularizer),\n\t      kernelConstraint: serializeConstraint(this.kernelConstraint),\n\t      recurrentConstraint: serializeConstraint(this.recurrentConstraint),\n\t      biasConstraint: serializeConstraint(this.biasConstraint),\n\t      dropout: this.dropout,\n\t      recurrentDropout: this.recurrentDropout,\n\t      implementation: this.implementation\n\t    };\n\t    return Object.assign({}, baseConfig, config);\n\t  };\n\n\t  return LSTMCell;\n\t}(RNNCell);\n\t/** @nocollapse */\n\n\tLSTMCell.className = 'LSTMCell';\n\tregisterClass(LSTMCell);\n\tvar LSTM = /*#__PURE__*/function (_RNN3) {\n\t  _inheritsLoose(LSTM, _RNN3);\n\n\t  function LSTM(args) {\n\t    if (args.implementation === 0) {\n\t      console.warn('`implementation=0` has been deprecated, and now defaults to ' + '`implementation=1`. Please update your layer call.');\n\t    }\n\n\t    args.cell = new LSTMCell(args);\n\t    return _RNN3.call(this, args) || this; // TODO(cais): Add activityRegularizer.\n\t  }\n\n\t  var _proto8 = LSTM.prototype;\n\n\t  _proto8.call = function call(inputs, kwargs) {\n\t    var _this14 = this;\n\n\t    return tidy(function () {\n\t      if (_this14.cell.dropoutMask != null) {\n\t        dispose(_this14.cell.dropoutMask);\n\t        _this14.cell.dropoutMask = null;\n\t      }\n\n\t      if (_this14.cell.recurrentDropoutMask != null) {\n\t        dispose(_this14.cell.recurrentDropoutMask);\n\t        _this14.cell.recurrentDropoutMask = null;\n\t      }\n\n\t      var mask = kwargs == null ? null : kwargs['mask'];\n\t      var training = kwargs == null ? null : kwargs['training'];\n\t      var initialState = kwargs == null ? null : kwargs['initialState'];\n\t      return _RNN3.prototype.call.call(_this14, inputs, {\n\t        mask: mask,\n\t        training: training,\n\t        initialState: initialState\n\t      });\n\t    });\n\t  }\n\t  /** @nocollapse */\n\t  ;\n\n\t  LSTM.fromConfig = function fromConfig(cls, config) {\n\t    if (config['implmentation'] === 0) {\n\t      config['implementation'] = 1;\n\t    }\n\n\t    return new cls(config);\n\t  };\n\n\t  return LSTM;\n\t}(RNN);\n\t/** @nocollapse */\n\n\tLSTM.className = 'LSTM';\n\tregisterClass(LSTM);\n\tvar StackedRNNCells = /*#__PURE__*/function (_RNNCell4) {\n\t  _inheritsLoose(StackedRNNCells, _RNNCell4);\n\n\t  function StackedRNNCells(args) {\n\t    var _this15;\n\n\t    _this15 = _RNNCell4.call(this, args) || this;\n\t    _this15.cells = args.cells;\n\t    return _this15;\n\t  }\n\n\t  var _proto9 = StackedRNNCells.prototype;\n\n\t  _proto9.call = function call(inputs, kwargs) {\n\t    var _this16 = this;\n\n\t    return tidy(function () {\n\t      inputs = inputs;\n\t      var states = inputs.slice(1); // Recover per-cell states.\n\n\t      var nestedStates = [];\n\n\t      for (var _iterator3 = _createForOfIteratorHelperLoose(_this16.cells.slice().reverse()), _step3; !(_step3 = _iterator3()).done;) {\n\t        var _cell = _step3.value;\n\n\t        if (Array.isArray(_cell.stateSize)) {\n\t          nestedStates.push(states.splice(0, _cell.stateSize.length));\n\t        } else {\n\t          nestedStates.push(states.splice(0, 1));\n\t        }\n\t      }\n\n\t      nestedStates.reverse(); // Call the cells in order and store the returned states.\n\n\t      var newNestedStates = [];\n\t      var callInputs;\n\n\t      for (var i = 0; i < _this16.cells.length; ++i) {\n\t        var cell = _this16.cells[i];\n\t        states = nestedStates[i]; // TODO(cais): Take care of constants.\n\n\t        if (i === 0) {\n\t          callInputs = [inputs[0]].concat(states);\n\t        } else {\n\t          callInputs = [callInputs[0]].concat(states);\n\t        }\n\n\t        callInputs = cell.call(callInputs, kwargs);\n\t        newNestedStates.push(callInputs.slice(1));\n\t      } // Format the new states as a flat list in reverse cell order.\n\n\n\t      states = [];\n\n\t      for (var _iterator4 = _createForOfIteratorHelperLoose(newNestedStates.slice().reverse()), _step4; !(_step4 = _iterator4()).done;) {\n\t        var _states;\n\n\t        var cellStates = _step4.value;\n\n\t        (_states = states).push.apply(_states, cellStates);\n\t      }\n\n\t      return [callInputs[0]].concat(states);\n\t    });\n\t  };\n\n\t  _proto9.build = function build(inputShape) {\n\t    if (isArrayOfShapes(inputShape)) {\n\t      // TODO(cais): Take care of input constants.\n\t      // const constantShape = inputShape.slice(1);\n\t      inputShape = inputShape[0];\n\t    }\n\n\t    inputShape = inputShape;\n\t    var outputDim;\n\t    this.cells.forEach(function (cell, i) {\n\t      nameScope(\"RNNCell_\" + i, function () {\n\t        // TODO(cais): Take care of input constants.\n\t        cell.build(inputShape);\n\n\t        if (Array.isArray(cell.stateSize)) {\n\t          outputDim = cell.stateSize[0];\n\t        } else {\n\t          outputDim = cell.stateSize;\n\t        }\n\n\t        inputShape = [inputShape[0], outputDim];\n\t      });\n\t    });\n\t    this.built = true;\n\t  };\n\n\t  _proto9.getConfig = function getConfig() {\n\t    var baseConfig = _RNNCell4.prototype.getConfig.call(this);\n\n\t    var getCellConfig = function getCellConfig(cell) {\n\t      return {\n\t        'className': cell.getClassName(),\n\t        'config': cell.getConfig()\n\t      };\n\t    };\n\n\t    var cellConfigs = this.cells.map(getCellConfig);\n\t    var config = {\n\t      'cells': cellConfigs\n\t    };\n\t    return Object.assign({}, baseConfig, config);\n\t  }\n\t  /** @nocollapse */\n\t  ;\n\n\t  StackedRNNCells.fromConfig = function fromConfig(cls, config, customObjects) {\n\t    if (customObjects === void 0) {\n\t      customObjects = {};\n\t    }\n\n\t    var cells = [];\n\n\t    for (var _iterator5 = _createForOfIteratorHelperLoose(config['cells']), _step5; !(_step5 = _iterator5()).done;) {\n\t      var cellConfig = _step5.value;\n\t      cells.push(deserialize$1(cellConfig, customObjects));\n\t    }\n\n\t    return new cls({\n\t      cells: cells\n\t    });\n\t  };\n\n\t  /**\n\t   * Retrieve the weights of a the model.\n\t   *\n\t   * @returns A flat `Array` of `tf.Tensor`s.\n\t   */\n\t  _proto9.getWeights = function getWeights() {\n\t    var weights = [];\n\n\t    for (var _iterator6 = _createForOfIteratorHelperLoose(this.cells), _step6; !(_step6 = _iterator6()).done;) {\n\t      var cell = _step6.value;\n\t      weights.push.apply(weights, cell.weights);\n\t    }\n\n\t    return batchGetValue(weights);\n\t  }\n\t  /**\n\t   * Set the weights of the model.\n\t   *\n\t   * @param weights An `Array` of `tf.Tensor`s with shapes and types matching\n\t   *     the output of `getWeights()`.\n\t   */\n\t  ;\n\n\t  _proto9.setWeights = function setWeights(weights) {\n\t    var tuples = [];\n\n\t    for (var _iterator7 = _createForOfIteratorHelperLoose(this.cells), _step7; !(_step7 = _iterator7()).done;) {\n\t      var cell = _step7.value;\n\t      var numParams = cell.weights.length;\n\t      var inputWeights = weights.splice(numParams);\n\n\t      for (var i = 0; i < cell.weights.length; ++i) {\n\t        tuples.push([cell.weights[i], inputWeights[i]]);\n\t      }\n\t    }\n\n\t    batchSetValue(tuples);\n\t  };\n\n\t  _createClass(StackedRNNCells, [{\n\t    key: \"stateSize\",\n\t    get: function get() {\n\t      // States are a flat list in reverse order of the cell stack.\n\t      // This allows perserving the requirement `stack.statesize[0] ===\n\t      // outputDim`. E.g., states of a 2-layer LSTM would be `[h2, c2, h1, c1]`,\n\t      // assuming one LSTM has states `[h, c]`.\n\t      var stateSize = [];\n\n\t      for (var _iterator8 = _createForOfIteratorHelperLoose(this.cells.slice().reverse()), _step8; !(_step8 = _iterator8()).done;) {\n\t        var cell = _step8.value;\n\n\t        if (Array.isArray(cell.stateSize)) {\n\t          stateSize.push.apply(stateSize, cell.stateSize);\n\t        } else {\n\t          stateSize.push(cell.stateSize);\n\t        }\n\t      }\n\n\t      return stateSize;\n\t    }\n\t  }, {\n\t    key: \"trainableWeights\",\n\t    get: function get() {\n\t      if (!this.trainable) {\n\t        return [];\n\t      }\n\n\t      var weights = [];\n\n\t      for (var _iterator9 = _createForOfIteratorHelperLoose(this.cells), _step9; !(_step9 = _iterator9()).done;) {\n\t        var cell = _step9.value;\n\t        weights.push.apply(weights, cell.trainableWeights);\n\t      }\n\n\t      return weights;\n\t    }\n\t  }, {\n\t    key: \"nonTrainableWeights\",\n\t    get: function get() {\n\t      var weights = [];\n\n\t      for (var _iterator10 = _createForOfIteratorHelperLoose(this.cells), _step10; !(_step10 = _iterator10()).done;) {\n\t        var _cell2 = _step10.value;\n\t        weights.push.apply(weights, _cell2.nonTrainableWeights);\n\t      }\n\n\t      if (!this.trainable) {\n\t        var trainableWeights = [];\n\n\t        for (var _iterator11 = _createForOfIteratorHelperLoose(this.cells), _step11; !(_step11 = _iterator11()).done;) {\n\t          var cell = _step11.value;\n\t          trainableWeights.push.apply(trainableWeights, cell.trainableWeights);\n\t        }\n\n\t        return trainableWeights.concat(weights);\n\t      }\n\n\t      return weights;\n\t    }\n\t  }]);\n\n\t  return StackedRNNCells;\n\t}(RNNCell);\n\t/** @nocollapse */\n\n\tStackedRNNCells.className = 'StackedRNNCells';\n\tregisterClass(StackedRNNCells);\n\tfunction generateDropoutMask(args) {\n\t  var ones = args.ones,\n\t      rate = args.rate,\n\t      _args$training = args.training,\n\t      training = _args$training === void 0 ? false : _args$training,\n\t      _args$count = args.count,\n\t      count = _args$count === void 0 ? 1 : _args$count;\n\n\t  var droppedInputs = function droppedInputs() {\n\t    return dropout$1(ones(), rate);\n\t  };\n\n\t  var createMask = function createMask() {\n\t    return inTrainPhase(droppedInputs, ones, training);\n\t  }; // just in case count is provided with null or undefined\n\n\n\t  if (!count || count <= 1) {\n\t    return keep(createMask().clone());\n\t  }\n\n\t  var masks = Array(count).fill(undefined).map(createMask);\n\t  return masks.map(function (m) {\n\t    return keep(m.clone());\n\t  });\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\tvar __rest = undefined && undefined.__rest || function (s, e) {\n\t  var t = {};\n\n\t  for (var p in s) {\n\t    if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n\t  }\n\n\t  if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n\t    if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n\t  }\n\t  return t;\n\t};\n\n\tvar ConvRNN2DCell = /*#__PURE__*/function (_RNNCell) {\n\t  _inheritsLoose(ConvRNN2DCell, _RNNCell);\n\n\t  function ConvRNN2DCell() {\n\t    return _RNNCell.apply(this, arguments) || this;\n\t  }\n\n\t  return ConvRNN2DCell;\n\t}(RNNCell);\n\t/**\n\t * Base class for convolutional-recurrent layers.\n\t */\n\n\n\tvar ConvRNN2D = /*#__PURE__*/function (_RNN) {\n\t  _inheritsLoose(ConvRNN2D, _RNN);\n\n\t  function ConvRNN2D(args) {\n\t    var _this;\n\n\t    if (args.unroll) {\n\t      throw new NotImplementedError('Unrolling is not possible with convolutional RNNs.');\n\t    }\n\n\t    if (Array.isArray(args.cell)) {\n\t      throw new NotImplementedError('It is not possible at the moment to stack convolutional cells.');\n\t    }\n\n\t    _this = _RNN.call(this, args) || this;\n\t    _this.inputSpec = [new InputSpec({\n\t      ndim: 5\n\t    })];\n\t    return _this;\n\t  }\n\n\t  var _proto = ConvRNN2D.prototype;\n\n\t  _proto.call = function call(inputs, kwargs) {\n\t    var _this2 = this;\n\n\t    return tidy(function () {\n\t      if (_this2.cell.dropoutMask != null) {\n\t        dispose(_this2.cell.dropoutMask);\n\t        _this2.cell.dropoutMask = null;\n\t      }\n\n\t      if (_this2.cell.recurrentDropoutMask != null) {\n\t        dispose(_this2.cell.recurrentDropoutMask);\n\t        _this2.cell.recurrentDropoutMask = null;\n\t      }\n\n\t      if (kwargs && kwargs['constants']) {\n\t        throw new ValueError('ConvRNN2D cell does not support constants');\n\t      }\n\n\t      var mask = kwargs == null ? null : kwargs['mask'];\n\t      var training = kwargs == null ? null : kwargs['training'];\n\t      var initialState = kwargs == null ? null : kwargs['initialState'];\n\t      return _RNN.prototype.call.call(_this2, inputs, {\n\t        mask: mask,\n\t        training: training,\n\t        initialState: initialState\n\t      });\n\t    });\n\t  };\n\n\t  _proto.computeOutputShape = function computeOutputShape(inputShape) {\n\t    var outShape = this.computeSingleOutputShape(inputShape);\n\n\t    if (!this.returnSequences) {\n\t      outShape = [outShape[0]].concat(outShape.slice(2));\n\t    }\n\n\t    if (this.returnState) {\n\t      outShape = [outShape].concat(Array(2).fill([inputShape[0]].concat(outShape.slice(-3))));\n\t    }\n\n\t    return outShape;\n\t  };\n\n\t  _proto.getInitialState = function getInitialState(inputs) {\n\t    var _this3 = this;\n\n\t    return tidy(function () {\n\t      var stateSize = _this3.cell.stateSize;\n\t      var inputShape = inputs.shape;\n\n\t      var outputShape = _this3.computeSingleOutputShape(inputShape);\n\n\t      var stateShape = [outputShape[0]].concat(outputShape.slice(2));\n\t      var initialState = zeros(stateShape);\n\n\t      if (Array.isArray(stateSize)) {\n\t        return Array(stateSize.length).fill(initialState);\n\t      }\n\n\t      return [initialState];\n\t    });\n\t  };\n\n\t  _proto.resetStates = function resetStates(states, training) {\n\t    var _this4 = this;\n\n\t    if (training === void 0) {\n\t      training = false;\n\t    }\n\n\t    tidy(function () {\n\t      if (!_this4.stateful) {\n\t        throw new AttributeError('Cannot call resetStates() on an RNN Layer that is not stateful.');\n\t      }\n\n\t      var inputShape = _this4.inputSpec[0].shape;\n\n\t      var outputShape = _this4.computeSingleOutputShape(inputShape);\n\n\t      var stateShape = [outputShape[0]].concat(outputShape.slice(2));\n\t      var batchSize = inputShape[0];\n\n\t      if (batchSize == null) {\n\t        throw new ValueError('If an RNN is stateful, it needs to know its batch size. Specify ' + 'the batch size of your input tensors: \\n' + '- If using a Sequential model, specify the batch size by ' + 'passing a `batchInputShape` option to your first layer.\\n' + '- If using the functional API, specify the batch size by ' + 'passing a `batchShape` option to your Input layer.');\n\t      } // Initialize state if null.\n\n\n\t      if (_this4.getStates() == null) {\n\t        if (Array.isArray(_this4.cell.stateSize)) {\n\t          _this4.states_ = _this4.cell.stateSize.map(function () {\n\t            return zeros(stateShape);\n\t          });\n\t        } else {\n\t          _this4.states_ = [zeros(stateShape)];\n\t        }\n\t      } else if (states == null) {\n\t        // Dispose old state tensors.\n\t        dispose(_this4.states_); // For stateful RNNs, fully dispose kept old states.\n\n\t        if (_this4.keptStates != null) {\n\t          dispose(_this4.keptStates);\n\t          _this4.keptStates = [];\n\t        }\n\n\t        if (Array.isArray(_this4.cell.stateSize)) {\n\t          _this4.states_ = _this4.cell.stateSize.map(function () {\n\t            return zeros(stateShape);\n\t          });\n\t        } else {\n\t          _this4.states_[0] = zeros(stateShape);\n\t        }\n\t      } else {\n\t        if (!Array.isArray(states)) {\n\t          states = [states];\n\t        }\n\n\t        if (states.length !== _this4.states_.length) {\n\t          throw new ValueError(\"Layer \" + _this4.name + \" expects \" + _this4.states_.length + \" state(s), \" + (\"but it received \" + states.length + \" state value(s). Input \") + (\"received: \" + states));\n\t        }\n\n\t        if (training) {\n\t          // Store old state tensors for complete disposal later, i.e., during\n\t          // the next no-arg call to this method. We do not dispose the old\n\t          // states immediately because that BPTT (among other things) require\n\t          // them.\n\t          _this4.keptStates.push(_this4.states_.slice());\n\t        } else {\n\t          dispose(_this4.states_);\n\t        }\n\n\t        for (var index = 0; index < _this4.states_.length; ++index) {\n\t          var value = states[index];\n\t          var expectedShape = stateShape;\n\n\t          if (!arraysEqual(value.shape, expectedShape)) {\n\t            throw new ValueError(\"State \" + index + \" is incompatible with layer \" + _this4.name + \": \" + (\"expected shape=\" + expectedShape + \", received shape=\" + value.shape));\n\t          }\n\n\t          _this4.states_[index] = value;\n\t        }\n\t      }\n\n\t      _this4.states_ = _this4.states_.map(function (state) {\n\t        return keep(state.clone());\n\t      });\n\t    });\n\t  };\n\n\t  _proto.computeSingleOutputShape = function computeSingleOutputShape(inputShape) {\n\t    var _this$cell = this.cell,\n\t        dataFormat = _this$cell.dataFormat,\n\t        filters = _this$cell.filters,\n\t        kernelSize = _this$cell.kernelSize,\n\t        padding = _this$cell.padding,\n\t        strides = _this$cell.strides,\n\t        dilationRate = _this$cell.dilationRate;\n\t    var isChannelsFirst = dataFormat === 'channelsFirst';\n\t    var h = inputShape[isChannelsFirst ? 3 : 2];\n\t    var w = inputShape[isChannelsFirst ? 4 : 3];\n\t    var hOut = convOutputLength(h, kernelSize[0], padding, strides[0], dilationRate[0]);\n\t    var wOut = convOutputLength(w, kernelSize[1], padding, strides[1], dilationRate[1]);\n\t    var outShape = [].concat(inputShape.slice(0, 2), isChannelsFirst ? [filters, hOut, wOut] : [hOut, wOut, filters]);\n\t    return outShape;\n\t  };\n\n\t  return ConvRNN2D;\n\t}(RNN);\n\t/** @nocollapse */\n\n\n\tConvRNN2D.className = 'ConvRNN2D';\n\tvar ConvLSTM2DCell = /*#__PURE__*/function (_LSTMCell) {\n\t  _inheritsLoose(ConvLSTM2DCell, _LSTMCell);\n\n\t  function ConvLSTM2DCell(args) {\n\t    var _this5;\n\n\t    var filters = args.filters,\n\t        kernelSize = args.kernelSize,\n\t        strides = args.strides,\n\t        padding = args.padding,\n\t        dataFormat = args.dataFormat,\n\t        dilationRate = args.dilationRate;\n\t    _this5 = _LSTMCell.call(this, Object.assign({}, args, {\n\t      units: filters\n\t    })) || this;\n\t    _this5.filters = filters;\n\t    assertPositiveInteger(_this5.filters, 'filters');\n\t    _this5.kernelSize = normalizeArray(kernelSize, 2, 'kernelSize');\n\n\t    _this5.kernelSize.forEach(function (size) {\n\t      return assertPositiveInteger(size, 'kernelSize');\n\t    });\n\n\t    _this5.strides = normalizeArray(strides || 1, 2, 'strides');\n\n\t    _this5.strides.forEach(function (stride) {\n\t      return assertPositiveInteger(stride, 'strides');\n\t    });\n\n\t    _this5.padding = padding || 'valid';\n\t    checkPaddingMode(_this5.padding);\n\t    _this5.dataFormat = dataFormat || 'channelsLast';\n\t    checkDataFormat(_this5.dataFormat);\n\t    _this5.dilationRate = normalizeArray(dilationRate || 1, 2, 'dilationRate');\n\n\t    _this5.dilationRate.forEach(function (rate) {\n\t      return assertPositiveInteger(rate, 'dilationRate');\n\t    });\n\n\t    return _this5;\n\t  }\n\n\t  var _proto2 = ConvLSTM2DCell.prototype;\n\n\t  _proto2.build = function build(inputShape) {\n\t    var _a;\n\n\t    inputShape = getExactlyOneShape(inputShape);\n\t    var channelAxis = this.dataFormat === 'channelsFirst' ? 1 : inputShape.length - 1;\n\n\t    if (inputShape[channelAxis] == null) {\n\t      throw new ValueError(\"The channel dimension of the input should be defined. \" + (\"Found \" + inputShape[channelAxis]));\n\t    }\n\n\t    var inputDim = inputShape[channelAxis];\n\t    var numOfKernels = 4;\n\t    var kernelShape = this.kernelSize.concat([inputDim, this.filters * numOfKernels]);\n\t    this.kernel = this.addWeight('kernel', kernelShape, null, this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n\t    var recurrentKernelShape = this.kernelSize.concat([this.filters, this.filters * numOfKernels]);\n\t    this.recurrentKernel = this.addWeight('recurrent_kernel', recurrentKernelShape, null, this.recurrentInitializer, this.recurrentRegularizer, true, this.recurrentConstraint);\n\n\t    if (this.useBias) {\n\t      var biasInitializer;\n\n\t      if (this.unitForgetBias) {\n\t        var init = this.biasInitializer;\n\t        var filters = this.filters;\n\t        biasInitializer = new (_a = /*#__PURE__*/function (_Initializer) {\n\t          _inheritsLoose(CustomInit, _Initializer);\n\n\t          function CustomInit() {\n\t            return _Initializer.apply(this, arguments) || this;\n\t          }\n\n\t          var _proto3 = CustomInit.prototype;\n\n\t          _proto3.apply = function apply(shape, dtype) {\n\t            var biasI = init.apply([filters]);\n\t            var biasF = ones$1([filters]);\n\t            var biasCAndO = init.apply([filters * 2]);\n\t            return concatenate([biasI, biasF, biasCAndO]);\n\t          };\n\n\t          return CustomInit;\n\t        }(Initializer),\n\t        /** @nocollapse */\n\t        _a.className = 'CustomInit', _a)();\n\t      } else {\n\t        biasInitializer = this.biasInitializer;\n\t      }\n\n\t      this.bias = this.addWeight('bias', [this.filters * numOfKernels], null, biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n\t    }\n\n\t    this.built = true;\n\t  };\n\n\t  _proto2.call = function call(inputs, kwargs) {\n\t    var _this6 = this;\n\n\t    return tidy(function () {\n\t      if (inputs.length !== 3) {\n\t        throw new ValueError(\"ConvLSTM2DCell expects 3 input Tensors (inputs, h, c), got \" + (inputs.length + \".\"));\n\t      }\n\n\t      var training = kwargs['training'] || false;\n\t      var x = inputs[0]; // Current input\n\n\t      var hTMinus1 = inputs[1]; // Previous memory state.\n\n\t      var cTMinus1 = inputs[2]; // Previous carry state.\n\n\t      var numOfKernels = 4;\n\n\t      if (0 < _this6.dropout && _this6.dropout < 1 && _this6.dropoutMask == null) {\n\t        _this6.dropoutMask = generateDropoutMask({\n\t          ones: function ones() {\n\t            return onesLike(x);\n\t          },\n\t          rate: _this6.dropout,\n\t          training: training,\n\t          count: numOfKernels\n\t        });\n\t      }\n\n\t      var dropoutMask = _this6.dropoutMask;\n\n\t      var applyDropout = function applyDropout(x, mask, index) {\n\t        if (!mask || !mask[index]) {\n\t          return x;\n\t        }\n\n\t        return mul(mask[index], x);\n\t      };\n\n\t      var xI = applyDropout(x, dropoutMask, 0);\n\t      var xF = applyDropout(x, dropoutMask, 1);\n\t      var xC = applyDropout(x, dropoutMask, 2);\n\t      var xO = applyDropout(x, dropoutMask, 3);\n\n\t      if (0 < _this6.recurrentDropout && _this6.recurrentDropout < 1 && _this6.recurrentDropoutMask == null) {\n\t        _this6.recurrentDropoutMask = generateDropoutMask({\n\t          ones: function ones() {\n\t            return onesLike(hTMinus1);\n\t          },\n\t          rate: _this6.recurrentDropout,\n\t          training: training,\n\t          count: numOfKernels\n\t        });\n\t      }\n\n\t      var recDropoutMask = _this6.recurrentDropoutMask;\n\t      var hI = applyDropout(hTMinus1, recDropoutMask, 0);\n\t      var hF = applyDropout(hTMinus1, recDropoutMask, 1);\n\t      var hC = applyDropout(hTMinus1, recDropoutMask, 2);\n\t      var hO = applyDropout(hTMinus1, recDropoutMask, 3);\n\t      var kernelChannelAxis = 3;\n\n\t      var _tfc$split = split$1(_this6.kernel.read(), numOfKernels, kernelChannelAxis),\n\t          kernelI = _tfc$split[0],\n\t          kernelF = _tfc$split[1],\n\t          kernelC = _tfc$split[2],\n\t          kernelO = _tfc$split[3];\n\n\t      var _ref = _this6.useBias ? split$1(_this6.bias.read(), numOfKernels) : [null, null, null, null],\n\t          biasI = _ref[0],\n\t          biasF = _ref[1],\n\t          biasC = _ref[2],\n\t          biasO = _ref[3];\n\n\t      xI = _this6.inputConv(xI, kernelI, biasI, _this6.padding);\n\t      xF = _this6.inputConv(xF, kernelF, biasF, _this6.padding);\n\t      xC = _this6.inputConv(xC, kernelC, biasC, _this6.padding);\n\t      xO = _this6.inputConv(xO, kernelO, biasO, _this6.padding);\n\n\t      var _tfc$split2 = split$1(_this6.recurrentKernel.read(), numOfKernels, kernelChannelAxis),\n\t          recKernelI = _tfc$split2[0],\n\t          recKernelF = _tfc$split2[1],\n\t          recKernelC = _tfc$split2[2],\n\t          recKernelO = _tfc$split2[3];\n\n\t      hI = _this6.recurrentConv(hI, recKernelI);\n\t      hF = _this6.recurrentConv(hF, recKernelF);\n\t      hC = _this6.recurrentConv(hC, recKernelC);\n\t      hO = _this6.recurrentConv(hO, recKernelO);\n\n\t      var i = _this6.recurrentActivation.apply(add$1(xI, hI));\n\n\t      var f = _this6.recurrentActivation.apply(add$1(xF, hF));\n\n\t      var c = add$1(mul(f, cTMinus1), mul(i, _this6.activation.apply(add$1(xC, hC))));\n\t      var h = mul(_this6.recurrentActivation.apply(add$1(xO, hO)), _this6.activation.apply(c));\n\t      return [h, h, c];\n\t    });\n\t  };\n\n\t  _proto2.getConfig = function getConfig() {\n\t    var _a = _LSTMCell.prototype.getConfig.call(this),\n\t        _ = _a['units'],\n\t        baseConfig = __rest(_a, ['units']);\n\n\t    var config = {\n\t      filters: this.filters,\n\t      kernelSize: this.kernelSize,\n\t      padding: this.padding,\n\t      dataFormat: this.dataFormat,\n\t      dilationRate: this.dilationRate,\n\t      strides: this.strides\n\t    };\n\t    return Object.assign({}, baseConfig, config);\n\t  };\n\n\t  _proto2.inputConv = function inputConv(x, w, b, padding) {\n\t    var out = conv2d(x, w, this.strides, padding || 'valid', this.dataFormat === 'channelsFirst' ? 'NCHW' : 'NHWC', this.dilationRate);\n\n\t    if (b) {\n\t      return biasAdd(out, b, this.dataFormat);\n\t    }\n\n\t    return out;\n\t  };\n\n\t  _proto2.recurrentConv = function recurrentConv(x, w) {\n\t    var strides = 1;\n\t    return conv2d(x, w, strides, 'same', this.dataFormat === 'channelsFirst' ? 'NCHW' : 'NHWC');\n\t  };\n\n\t  return ConvLSTM2DCell;\n\t}(LSTMCell);\n\t/** @nocollapse */\n\n\tConvLSTM2DCell.className = 'ConvLSTM2DCell';\n\tregisterClass(ConvLSTM2DCell);\n\tvar ConvLSTM2D = /*#__PURE__*/function (_ConvRNN2D) {\n\t  _inheritsLoose(ConvLSTM2D, _ConvRNN2D);\n\n\t  function ConvLSTM2D(args) {\n\t    var cell = new ConvLSTM2DCell(args);\n\t    return _ConvRNN2D.call(this, Object.assign({}, args, {\n\t      cell: cell\n\t    })) || this;\n\t  }\n\t  /** @nocollapse */\n\n\n\t  ConvLSTM2D.fromConfig = function fromConfig(cls, config) {\n\t    return new cls(config);\n\t  };\n\n\t  return ConvLSTM2D;\n\t}(ConvRNN2D);\n\t/** @nocollapse */\n\n\tConvLSTM2D.className = 'ConvLSTM2D';\n\tregisterClass(ConvLSTM2D);\n\n\tvar Dropout = /*#__PURE__*/function (_Layer) {\n\t  _inheritsLoose(Dropout, _Layer);\n\n\t  function Dropout(args) {\n\t    var _this;\n\n\t    _this = _Layer.call(this, args) || this;\n\t    _this.rate = Math.max(Math.min(args.rate, 1), 0); // So that the scalar doesn't get tidied up between executions.\n\n\t    _this.noiseShape = args.noiseShape;\n\t    _this.seed = args.seed;\n\t    _this.supportsMasking = true;\n\t    return _this;\n\t  }\n\n\t  var _proto = Dropout.prototype;\n\n\t  _proto.getNoiseShape = function getNoiseShape(input) {\n\t    if (this.noiseShape == null) {\n\t      return this.noiseShape;\n\t    }\n\n\t    var inputShape = input.shape;\n\t    var noiseShape = [];\n\n\t    for (var i = 0; i < this.noiseShape.length; ++i) {\n\t      noiseShape.push(this.noiseShape[i] == null ? inputShape[i] : this.noiseShape[i]);\n\t    }\n\n\t    return noiseShape;\n\t  };\n\n\t  _proto.call = function call(inputs, kwargs) {\n\t    var _this2 = this;\n\n\t    return tidy(function () {\n\t      _this2.invokeCallHook(inputs, kwargs);\n\n\t      var input = getExactlyOneTensor(inputs);\n\n\t      if (0 < _this2.rate && _this2.rate < 1) {\n\t        var training = kwargs['training'] == null ? false : kwargs['training'];\n\n\t        var noiseShape = _this2.getNoiseShape(input);\n\n\t        var output = inTrainPhase(function () {\n\t          return dropout$1(input, _this2.rate, noiseShape, _this2.seed);\n\t        }, function () {\n\t          return input;\n\t        }, training);\n\t        return output;\n\t      }\n\n\t      return inputs;\n\t    });\n\t  };\n\n\t  _proto.getConfig = function getConfig() {\n\t    var config = {\n\t      rate: this.rate,\n\t      noiseShape: this.noiseShape,\n\t      seed: this.seed\n\t    };\n\n\t    var baseConfig = _Layer.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  _proto.dispose = function dispose() {\n\t    return _Layer.prototype.dispose.call(this);\n\t  };\n\n\t  return Dropout;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tDropout.className = 'Dropout';\n\tregisterClass(Dropout);\n\tvar SpatialDropout1D = /*#__PURE__*/function (_Dropout) {\n\t  _inheritsLoose(SpatialDropout1D, _Dropout);\n\n\t  function SpatialDropout1D(args) {\n\t    var _this3;\n\n\t    _this3 = _Dropout.call(this, args) || this;\n\t    _this3.inputSpec = [{\n\t      ndim: 3\n\t    }];\n\t    return _this3;\n\t  }\n\n\t  var _proto2 = SpatialDropout1D.prototype;\n\n\t  _proto2.getNoiseShape = function getNoiseShape(input) {\n\t    var inputShape = input.shape;\n\t    return [inputShape[0], 1, inputShape[2]];\n\t  };\n\n\t  return SpatialDropout1D;\n\t}(Dropout);\n\t/** @nocollapse */\n\n\tSpatialDropout1D.className = 'SpatialDropout1D';\n\tregisterClass(SpatialDropout1D);\n\tvar Dense = /*#__PURE__*/function (_Layer2) {\n\t  _inheritsLoose(Dense, _Layer2);\n\n\t  function Dense(args) {\n\t    var _this4;\n\n\t    _this4 = _Layer2.call(this, args) || this; // Default activation: Linear (none).\n\n\t    _this4.activation = null;\n\t    _this4.useBias = true;\n\t    _this4.kernel = null;\n\t    _this4.bias = null;\n\t    _this4.DEFAULT_KERNEL_INITIALIZER = 'glorotNormal';\n\t    _this4.DEFAULT_BIAS_INITIALIZER = 'zeros';\n\n\t    if (args.batchInputShape == null && args.inputShape == null && args.inputDim != null) {\n\t      // This logic is copied from Layer's constructor, since we can't\n\t      // do exactly what the Python constructor does for Dense().\n\t      var batchSize = null;\n\n\t      if (args.batchSize != null) {\n\t        batchSize = args.batchSize;\n\t      }\n\n\t      _this4.batchInputShape = [batchSize, args.inputDim];\n\t    }\n\n\t    _this4.units = args.units;\n\t    assertPositiveInteger(_this4.units, 'units');\n\t    _this4.activation = getActivation(args.activation);\n\n\t    if (args.useBias != null) {\n\t      _this4.useBias = args.useBias;\n\t    }\n\n\t    _this4.kernelInitializer = getInitializer(args.kernelInitializer || _this4.DEFAULT_KERNEL_INITIALIZER);\n\t    _this4.biasInitializer = getInitializer(args.biasInitializer || _this4.DEFAULT_BIAS_INITIALIZER);\n\t    _this4.kernelConstraint = getConstraint(args.kernelConstraint);\n\t    _this4.biasConstraint = getConstraint(args.biasConstraint);\n\t    _this4.kernelRegularizer = getRegularizer(args.kernelRegularizer);\n\t    _this4.biasRegularizer = getRegularizer(args.biasRegularizer);\n\t    _this4.activityRegularizer = getRegularizer(args.activityRegularizer);\n\t    _this4.supportsMasking = true;\n\t    _this4.inputSpec = [{\n\t      minNDim: 2\n\t    }];\n\t    return _this4;\n\t  }\n\n\t  var _proto3 = Dense.prototype;\n\n\t  _proto3.build = function build(inputShape) {\n\t    var _axes;\n\n\t    inputShape = getExactlyOneShape(inputShape);\n\t    var inputLastDim = inputShape[inputShape.length - 1];\n\n\t    if (this.kernel == null) {\n\t      this.kernel = this.addWeight('kernel', [inputLastDim, this.units], null, this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n\n\t      if (this.useBias) {\n\t        this.bias = this.addWeight('bias', [this.units], null, this.biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n\t      }\n\t    }\n\n\t    this.inputSpec = [{\n\t      minNDim: 2,\n\t      axes: (_axes = {}, _axes[-1] = inputLastDim, _axes)\n\t    }];\n\t    this.built = true;\n\t  };\n\n\t  _proto3.computeOutputShape = function computeOutputShape(inputShape) {\n\t    inputShape = getExactlyOneShape(inputShape);\n\t    var outputShape = inputShape.slice();\n\t    outputShape[outputShape.length - 1] = this.units;\n\t    return outputShape;\n\t  };\n\n\t  _proto3.call = function call(inputs, kwargs) {\n\t    var _this5 = this;\n\n\t    return tidy(function () {\n\t      _this5.invokeCallHook(inputs, kwargs); // Dense layer accepts only a single input.\n\n\n\t      var input = getExactlyOneTensor(inputs);\n\t      var fusedActivationName = mapActivationToFusedKernel(_this5.activation.getClassName());\n\t      var output;\n\n\t      if (fusedActivationName != null) {\n\t        output = dot$1(input, _this5.kernel.read(), fusedActivationName, _this5.bias ? _this5.bias.read() : null);\n\t      } else {\n\t        output = dot$1(input, _this5.kernel.read());\n\n\t        if (_this5.bias != null) {\n\t          output = biasAdd(output, _this5.bias.read());\n\t        }\n\n\t        if (_this5.activation != null) {\n\t          output = _this5.activation.apply(output);\n\t        }\n\t      }\n\n\t      return output;\n\t    });\n\t  };\n\n\t  _proto3.getConfig = function getConfig() {\n\t    var config = {\n\t      units: this.units,\n\t      activation: serializeActivation(this.activation),\n\t      useBias: this.useBias,\n\t      kernelInitializer: serializeInitializer(this.kernelInitializer),\n\t      biasInitializer: serializeInitializer(this.biasInitializer),\n\t      kernelRegularizer: serializeRegularizer(this.kernelRegularizer),\n\t      biasRegularizer: serializeRegularizer(this.biasRegularizer),\n\t      activityRegularizer: serializeRegularizer(this.activityRegularizer),\n\t      kernelConstraint: serializeConstraint(this.kernelConstraint),\n\t      biasConstraint: serializeConstraint(this.biasConstraint)\n\t    };\n\n\t    var baseConfig = _Layer2.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return Dense;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tDense.className = 'Dense';\n\tregisterClass(Dense);\n\tvar Flatten = /*#__PURE__*/function (_Layer3) {\n\t  _inheritsLoose(Flatten, _Layer3);\n\n\t  function Flatten(args) {\n\t    var _this6;\n\n\t    args = args || {};\n\t    _this6 = _Layer3.call(this, args) || this;\n\t    _this6.inputSpec = [{\n\t      minNDim: 3\n\t    }];\n\t    _this6.dataFormat = args.dataFormat;\n\t    return _this6;\n\t  }\n\n\t  var _proto4 = Flatten.prototype;\n\n\t  _proto4.computeOutputShape = function computeOutputShape(inputShape) {\n\t    inputShape = getExactlyOneShape(inputShape);\n\n\t    for (var _iterator = _createForOfIteratorHelperLoose(inputShape.slice(1)), _step; !(_step = _iterator()).done;) {\n\t      var dim = _step.value;\n\n\t      if (dim == null) {\n\t        throw new ValueError(\"The shape of the input to \\\"Flatten\\\" is not fully defined \" + (\"(got \" + inputShape.slice(1) + \"). Make sure to pass a complete \") + \"\\\"input_shape\\\" or \\\"batch_input_shape\\\" argument to the first \" + \"layer in your model.\");\n\t      }\n\t    }\n\n\t    return [inputShape[0], arrayProd(inputShape, 1)];\n\t  };\n\n\t  _proto4.call = function call(inputs, kwargs) {\n\t    var _this7 = this;\n\n\t    return tidy(function () {\n\t      _this7.invokeCallHook(inputs, kwargs);\n\n\t      var input = getExactlyOneTensor(inputs);\n\n\t      if (_this7.dataFormat === 'channelsFirst' && input.rank > 1) {\n\t        var permutation = [0];\n\n\t        for (var i = 2; i < input.rank; ++i) {\n\t          permutation.push(i);\n\t        }\n\n\t        permutation.push(1);\n\t        input = input.transpose(permutation);\n\t      }\n\n\t      return batchFlatten(input);\n\t    });\n\t  };\n\n\t  _proto4.getConfig = function getConfig() {\n\t    var config = {};\n\n\t    if (this.dataFormat != null) {\n\t      config['dataFormat'] = this.dataFormat;\n\t    }\n\n\t    var baseConfig = _Layer3.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return Flatten;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tFlatten.className = 'Flatten';\n\tregisterClass(Flatten);\n\tvar Activation$1 = /*#__PURE__*/function (_Layer4) {\n\t  _inheritsLoose(Activation, _Layer4);\n\n\t  function Activation(args) {\n\t    var _this8;\n\n\t    _this8 = _Layer4.call(this, args) || this;\n\t    _this8.supportsMasking = true;\n\t    _this8.activation = getActivation(args.activation);\n\t    return _this8;\n\t  }\n\n\t  var _proto5 = Activation.prototype;\n\n\t  _proto5.call = function call(inputs, kwargs) {\n\t    var _this9 = this;\n\n\t    return tidy(function () {\n\t      _this9.invokeCallHook(inputs, kwargs);\n\n\t      var input = getExactlyOneTensor(inputs);\n\t      return _this9.activation.apply(input);\n\t    });\n\t  };\n\n\t  _proto5.getConfig = function getConfig() {\n\t    var config = {\n\t      activation: serializeActivation(this.activation)\n\t    };\n\n\t    var baseConfig = _Layer4.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return Activation;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tActivation$1.className = 'Activation';\n\tregisterClass(Activation$1);\n\tvar RepeatVector = /*#__PURE__*/function (_Layer5) {\n\t  _inheritsLoose(RepeatVector, _Layer5);\n\n\t  function RepeatVector(args) {\n\t    var _this10;\n\n\t    _this10 = _Layer5.call(this, args) || this;\n\t    _this10.n = args.n;\n\t    _this10.inputSpec = [{\n\t      ndim: 2\n\t    }];\n\t    return _this10;\n\t  }\n\n\t  var _proto6 = RepeatVector.prototype;\n\n\t  _proto6.computeOutputShape = function computeOutputShape(inputShape) {\n\t    return [inputShape[0], this.n, inputShape[1]];\n\t  };\n\n\t  _proto6.call = function call(inputs, kwargs) {\n\t    var _this11 = this;\n\n\t    return tidy(function () {\n\t      inputs = getExactlyOneTensor(inputs);\n\t      return repeat(inputs, _this11.n);\n\t    });\n\t  };\n\n\t  _proto6.getConfig = function getConfig() {\n\t    var config = {\n\t      n: this.n\n\t    };\n\n\t    var baseConfig = _Layer5.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return RepeatVector;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tRepeatVector.className = 'RepeatVector';\n\tregisterClass(RepeatVector);\n\tvar Reshape$1 = /*#__PURE__*/function (_Layer6) {\n\t  _inheritsLoose(Reshape, _Layer6);\n\n\t  function Reshape(args) {\n\t    var _this12;\n\n\t    _this12 = _Layer6.call(this, args) || this;\n\t    _this12.targetShape = args.targetShape; // Make sure that all unknown dimensions are represented as `null`.\n\n\t    for (var i = 0; i < _this12.targetShape.length; ++i) {\n\t      if (_this12.isUnknown(_this12.targetShape[i])) {\n\t        _this12.targetShape[i] = null;\n\t      }\n\t    }\n\n\t    return _this12;\n\t  }\n\n\t  var _proto7 = Reshape.prototype;\n\n\t  _proto7.isUnknown = function isUnknown(dim) {\n\t    return dim < 0 || dim == null;\n\t  }\n\t  /**\n\t   * Finds and replaces a missing dimension in output shape.\n\t   *\n\t   * This is a near direct port of the internal Numpy function\n\t   * `_fix_unknown_dimension` in `numpy/core/src/multiarray/shape.c`.\n\t   *\n\t   * @param inputShape: Original shape of array begin reshape.\n\t   * @param outputShape: Target shape of the array, with at most a single\n\t   * `null` or negative number, which indicates an underdetermined dimension\n\t   * that should be derived from `inputShape` and the known dimensions of\n\t   *   `outputShape`.\n\t   * @returns: The output shape with `null` replaced with its computed value.\n\t   * @throws: ValueError: If `inputShape` and `outputShape` do not match.\n\t   */\n\t  ;\n\n\t  _proto7.fixUnknownDimension = function fixUnknownDimension(inputShape, outputShape) {\n\t    var errorMsg = 'Total size of new array must be unchanged.';\n\t    var finalShape = outputShape.slice();\n\t    var known = 1;\n\t    var unknown = null;\n\n\t    for (var i = 0; i < finalShape.length; ++i) {\n\t      var dim = finalShape[i];\n\n\t      if (this.isUnknown(dim)) {\n\t        if (unknown === null) {\n\t          unknown = i;\n\t        } else {\n\t          throw new ValueError('Can only specifiy one unknown dimension.');\n\t        }\n\t      } else {\n\t        known *= dim;\n\t      }\n\t    }\n\n\t    var originalSize = arrayProd(inputShape);\n\n\t    if (unknown !== null) {\n\t      if (known === 0 || originalSize % known !== 0) {\n\t        throw new ValueError(errorMsg);\n\t      }\n\n\t      finalShape[unknown] = originalSize / known;\n\t    } else if (originalSize !== known) {\n\t      throw new ValueError(errorMsg);\n\t    }\n\n\t    return finalShape;\n\t  };\n\n\t  _proto7.computeOutputShape = function computeOutputShape(inputShape) {\n\t    var anyUnknownDims = false;\n\n\t    for (var i = 0; i < inputShape.length; ++i) {\n\t      if (this.isUnknown(inputShape[i])) {\n\t        anyUnknownDims = true;\n\t        break;\n\t      }\n\t    }\n\n\t    if (anyUnknownDims) {\n\t      return inputShape.slice(0, 1).concat(this.targetShape);\n\t    } else {\n\t      return inputShape.slice(0, 1).concat(this.fixUnknownDimension(inputShape.slice(1), this.targetShape));\n\t    }\n\t  };\n\n\t  _proto7.call = function call(inputs, kwargs) {\n\t    var _this13 = this;\n\n\t    return tidy(function () {\n\t      _this13.invokeCallHook(inputs, kwargs);\n\n\t      var input = getExactlyOneTensor(inputs);\n\t      var inputShape = input.shape;\n\t      var outputShape = inputShape.slice(0, 1).concat(_this13.fixUnknownDimension(inputShape.slice(1), _this13.targetShape));\n\t      return input.reshape(outputShape);\n\t    });\n\t  };\n\n\t  _proto7.getConfig = function getConfig() {\n\t    var config = {\n\t      targetShape: this.targetShape\n\t    };\n\n\t    var baseConfig = _Layer6.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return Reshape;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tReshape$1.className = 'Reshape';\n\tregisterClass(Reshape$1);\n\tvar Permute = /*#__PURE__*/function (_Layer7) {\n\t  _inheritsLoose(Permute, _Layer7);\n\n\t  function Permute(args) {\n\t    var _this14;\n\n\t    _this14 = _Layer7.call(this, args) || this;\n\n\t    if (args.dims == null) {\n\t      throw new Error('Required configuration field `dims` is missing during Permute ' + 'constructor call.');\n\t    }\n\n\t    if (!Array.isArray(args.dims)) {\n\t      throw new Error('Permute constructor requires `dims` to be an Array, but received ' + (args.dims + \" instead.\"));\n\t    } // Check the validity of the permutation indices.\n\n\n\t    var expectedSortedIndices = range$1(1, args.dims.length + 1);\n\n\t    if (!arraysEqual(args.dims.slice().sort(), expectedSortedIndices)) {\n\t      throw new Error('Invalid permutation `dims`: ' + JSON.stringify(args.dims) + ' `dims` must contain consecutive integers starting from 1.');\n\t    }\n\n\t    _this14.dims = args.dims;\n\t    _this14.dimsIncludingBatch = [0].concat(_this14.dims);\n\t    _this14.inputSpec = [new InputSpec({\n\t      ndim: _this14.dims.length + 1\n\t    })];\n\t    return _this14;\n\t  }\n\n\t  var _proto8 = Permute.prototype;\n\n\t  _proto8.computeOutputShape = function computeOutputShape(inputShape) {\n\t    inputShape = getExactlyOneShape(inputShape);\n\t    var outputShape = inputShape.slice();\n\t    this.dims.forEach(function (dim, i) {\n\t      outputShape[i + 1] = inputShape[dim];\n\t    });\n\t    return outputShape;\n\t  };\n\n\t  _proto8.call = function call(inputs, kwargs) {\n\t    return transpose(getExactlyOneTensor(inputs), this.dimsIncludingBatch);\n\t  };\n\n\t  _proto8.getConfig = function getConfig() {\n\t    var config = {\n\t      dims: this.dims\n\t    };\n\n\t    var baseConfig = _Layer7.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return Permute;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tPermute.className = 'Permute';\n\tregisterClass(Permute);\n\tvar Masking = /*#__PURE__*/function (_Layer8) {\n\t  _inheritsLoose(Masking, _Layer8);\n\n\t  function Masking(args) {\n\t    var _this15;\n\n\t    _this15 = _Layer8.call(this, args == null ? {} : args) || this;\n\t    _this15.supportsMasking = true;\n\n\t    if (args != null) {\n\t      _this15.maskValue = args.maskValue == null ? 0 : args.maskValue;\n\t    } else {\n\t      _this15.maskValue = 0;\n\t    }\n\n\t    return _this15;\n\t  }\n\n\t  var _proto9 = Masking.prototype;\n\n\t  _proto9.computeOutputShape = function computeOutputShape(inputShape) {\n\t    return inputShape;\n\t  };\n\n\t  _proto9.getConfig = function getConfig() {\n\t    var baseConfig = _Layer8.prototype.getConfig.call(this);\n\n\t    var config = {\n\t      maskValue: this.maskValue\n\t    };\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  _proto9.computeMask = function computeMask(inputs, mask) {\n\t    var input = getExactlyOneTensor(inputs);\n\t    var axis = -1;\n\t    return any(notEqual(input, this.maskValue), axis);\n\t  };\n\n\t  _proto9.call = function call(inputs, kwargs) {\n\t    var _this16 = this;\n\n\t    return tidy(function () {\n\t      _this16.invokeCallHook(inputs, kwargs);\n\n\t      var input = getExactlyOneTensor(inputs);\n\t      var axis = -1;\n\t      var keepDims = true;\n\t      var booleanMask = any(notEqual(input, _this16.maskValue), axis, keepDims);\n\t      var output = input.mul(booleanMask.asType(input.dtype));\n\t      return output;\n\t    });\n\t  };\n\n\t  return Masking;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tMasking.className = 'Masking';\n\tregisterClass(Masking);\n\n\tvar Embedding = /*#__PURE__*/function (_Layer) {\n\t  _inheritsLoose(Embedding, _Layer);\n\n\t  function Embedding(args) {\n\t    var _this;\n\n\t    _this = _Layer.call(this, args) || this;\n\t    _this.embeddings = null;\n\t    _this.DEFAULT_EMBEDDINGS_INITIALIZER = 'randomUniform';\n\n\t    if (args.batchInputShape == null && args.inputShape == null) {\n\t      // Porting Note: This logic is copied from Layer's constructor, since we\n\t      // can't do exactly what the Python constructor does for Embedding().\n\t      // Specifically, the super constructor can not be called after the\n\t      // mutation of the `config` argument.\n\t      var batchSize = null;\n\n\t      if (args.batchSize != null) {\n\t        batchSize = args.batchSize;\n\t      }\n\n\t      if (args.inputLength == null) {\n\t        // Fix super-constructor to what it would have done if\n\t        // 'config.inputShape' were (None, )\n\t        _this.batchInputShape = [batchSize, null];\n\t      } else {\n\t        // Fix super-constructor to what it would have done if\n\t        // 'config.inputShape' were (config.inputLength, )\n\t        _this.batchInputShape = [batchSize].concat(toList(args.inputLength));\n\t      }\n\t    }\n\n\t    _this.inputDim = args.inputDim;\n\t    assertPositiveInteger(_this.inputDim, 'inputDim');\n\t    _this.outputDim = args.outputDim;\n\t    assertPositiveInteger(_this.outputDim, 'outputDim');\n\t    _this.embeddingsInitializer = getInitializer(args.embeddingsInitializer || _this.DEFAULT_EMBEDDINGS_INITIALIZER);\n\t    _this.embeddingsRegularizer = getRegularizer(args.embeddingsRegularizer);\n\t    _this.activityRegularizer = getRegularizer(args.activityRegularizer);\n\t    _this.embeddingsConstraint = getConstraint(args.embeddingsConstraint);\n\t    _this.maskZero = args.maskZero;\n\t    _this.supportsMasking = args.maskZero;\n\t    _this.inputLength = args.inputLength;\n\t    return _this;\n\t  }\n\n\t  var _proto = Embedding.prototype;\n\n\t  _proto.build = function build(inputShape) {\n\t    this.embeddings = this.addWeight('embeddings', [this.inputDim, this.outputDim], this.dtype, this.embeddingsInitializer, this.embeddingsRegularizer, true, this.embeddingsConstraint);\n\t    this.built = true;\n\t  } // Override warnOnIncompatibleInputShape because an embedding layer allows\n\t  // the input to have varying ranks.\n\t  ;\n\n\t  _proto.warnOnIncompatibleInputShape = function warnOnIncompatibleInputShape(inputShape) {};\n\n\t  _proto.computeMask = function computeMask(inputs, mask) {\n\t    var _this2 = this;\n\n\t    return tidy(function () {\n\t      if (!_this2.maskZero) {\n\t        return null;\n\t      } else {\n\t        inputs = getExactlyOneTensor(inputs);\n\t        return notEqual(inputs, zerosLike(inputs));\n\t      }\n\t    });\n\t  };\n\n\t  _proto.computeOutputShape = function computeOutputShape(inputShape) {\n\t    inputShape = getExactlyOneShape(inputShape);\n\n\t    if (this.inputLength == null) {\n\t      return [].concat(inputShape, [this.outputDim]);\n\t    } // inputLength can be an array if input is 3D or higher.\n\n\n\t    var inLens = toList(this.inputLength);\n\n\t    if (inLens.length !== inputShape.length - 1) {\n\t      throw new ValueError(\"\\\"inputLength\\\" is \" + this.inputLength + \", but received \" + (\"input shape has shape \" + inputShape));\n\t    } else {\n\t      var i = 0;\n\n\t      for (var k = 0; k < inLens.length; ++k) {\n\t        var s1 = inLens[k];\n\t        var s2 = inputShape[k + 1];\n\n\t        if (s1 != null && s2 != null && s1 !== s2) {\n\t          throw new ValueError(\"\\\"inputLength\\\" is \" + this.inputLength + \", but received \" + (\"input shape has shape \" + inputShape));\n\t        } else if (s1 == null) {\n\t          inLens[i] = s2;\n\t        }\n\n\t        i++;\n\t      }\n\t    }\n\n\t    return [inputShape[0]].concat(inLens, [this.outputDim]);\n\t  };\n\n\t  _proto.call = function call(inputs, kwargs) {\n\t    var _this3 = this;\n\n\t    return tidy(function () {\n\t      _this3.invokeCallHook(inputs, kwargs); // Embedding layer accepts only a single input.\n\n\n\t      var input = getExactlyOneTensor(inputs);\n\n\t      if (input.dtype !== 'int32') {\n\t        input = cast$1(input, 'int32');\n\t      }\n\n\t      var output = gather$1(_this3.embeddings.read(), input.as1D());\n\t      return output.reshape(getExactlyOneShape(_this3.computeOutputShape(input.shape)));\n\t    });\n\t  };\n\n\t  _proto.getConfig = function getConfig() {\n\t    var config = {\n\t      inputDim: this.inputDim,\n\t      outputDim: this.outputDim,\n\t      embeddingsInitializer: serializeInitializer(this.embeddingsInitializer),\n\t      embeddingsRegularizer: serializeRegularizer(this.embeddingsRegularizer),\n\t      activityRegularizer: serializeRegularizer(this.activityRegularizer),\n\t      embeddingsConstraint: serializeConstraint(this.embeddingsConstraint),\n\t      maskZero: this.maskZero,\n\t      inputLength: this.inputLength\n\t    };\n\n\t    var baseConfig = _Layer.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return Embedding;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tEmbedding.className = 'Embedding';\n\tregisterClass(Embedding);\n\n\t/**\n\t * Generic Merge layer for element-wise merge functions.\n\t *\n\t * Used to implement `Sum`, `Average`, `Concatenate`, etc.\n\t */\n\n\tvar Merge = /*#__PURE__*/function (_Layer) {\n\t  _inheritsLoose(Merge, _Layer);\n\n\t  function Merge(args) {\n\t    var _this;\n\n\t    _this = _Layer.call(this, args || {}) || this;\n\t    _this.supportsMasking = true;\n\t    return _this;\n\t  }\n\t  /**\n\t   * Logic for merging multiple tensors, to be overridden by subclasses.\n\t   * @param inputs\n\t   */\n\n\n\t  var _proto = Merge.prototype;\n\n\t  _proto.mergeFunction = function mergeFunction(inputs) {\n\t    throw new NotImplementedError();\n\t  }\n\t  /**\n\t   * Computes the shape of the result of an elementwise operation.\n\t   *\n\t   * @param shape1: Shape of the first tensor.\n\t   * @param shape2: Shape of the second tensor.\n\t   * @returns Expected output shape when an elementwise operation is carried\n\t   *   out on 2 tensors with shapes `shape1` and `shape2`.\n\t   * @throws ValueError: If `shape1` and `shape2` are not compatible for\n\t   *   element-wise operations.\n\t   */\n\t  ;\n\n\t  _proto.computeElementwiseOpOutputShape = function computeElementwiseOpOutputShape(shape1, shape2) {\n\t    if (shape1 == null || shape2 == null) {\n\t      return null;\n\t    } else if (shape1.length < shape2.length) {\n\t      return this.computeElementwiseOpOutputShape(shape2, shape1);\n\t    } else if (shape2.length === 0) {\n\t      return shape1;\n\t    }\n\n\t    var outputShape = shape1.slice(0, shape1.length - shape2.length);\n\n\t    for (var k = 0; k < shape2.length; ++k) {\n\t      var i = shape1[shape1.length - shape2.length + k];\n\t      var j = shape2[k];\n\n\t      if (i == null || j == null || i < 0 || j < 0) {\n\t        outputShape.push(null);\n\t      } else if (i === 1) {\n\t        outputShape.push(j);\n\t      } else if (j === 1) {\n\t        outputShape.push(i);\n\t      } else {\n\t        if (i !== j) {\n\t          throw new ValueError('Operands could not be broadcast together with shapes ' + JSON.stringify(shape1) + ' ' + JSON.stringify(shape2));\n\t        }\n\n\t        outputShape.push(i);\n\t      }\n\t    }\n\n\t    return outputShape;\n\t  };\n\n\t  _proto.build = function build(inputShape) {\n\t    // Used purely for shape validation.\n\t    if (Array.isArray(inputShape) && !Array.isArray(inputShape[0])) {\n\t      // Make sure that inputShape is an Array of shape.\n\t      inputShape = [getExactlyOneShape(inputShape)];\n\t    }\n\n\t    inputShape = inputShape;\n\n\t    if (inputShape.length < 2) {\n\t      throw new ValueError('A merge layer should be called on an Array of at least 2 inputs.' + (\" Got \" + inputShape.length + \" input(s).\"));\n\t    } // Make sure that there is at most one unique batch size among the input\n\t    // shapes.\n\n\n\t    var batchSizes = [];\n\n\t    for (var _iterator = _createForOfIteratorHelperLoose(inputShape), _step; !(_step = _iterator()).done;) {\n\t      var _shape = _step.value;\n\n\t      if (_shape != null && _shape[0] !== null) {\n\t        batchSizes.push(_shape[0]);\n\t      }\n\t    }\n\n\t    batchSizes = unique$1(batchSizes);\n\n\t    if (batchSizes.length > 1) {\n\t      throw new ValueError(\"Can not merge tensors with different batch sizes. \" + (\"Got tensors with shapes: \" + JSON.stringify(inputShape) + \".\"));\n\t    }\n\n\t    var outputShape = inputShape[0] == null ? null : inputShape[0].slice(1);\n\n\t    for (var i = 1; i < inputShape.length; ++i) {\n\t      var shape = inputShape[i] == null ? null : inputShape[i].slice(1);\n\t      outputShape = this.computeElementwiseOpOutputShape(outputShape, shape);\n\t    } // If the inputs have different ranks, we have to reshape them to make them\n\t    // broadcastable.\n\n\n\t    var allRanks = inputShape.map(function (shape) {\n\t      return shape.length;\n\t    });\n\n\t    if (inputShape.indexOf(null) === -1 && unique$1(allRanks).length === 1) {\n\t      this.reshapeRequired = false;\n\t    } else {\n\t      this.reshapeRequired = true;\n\t    }\n\t  };\n\n\t  _proto.call = function call(inputs, kwargs) {\n\t    var _this2 = this;\n\n\t    return tidy(function () {\n\t      inputs = inputs;\n\n\t      if (_this2.reshapeRequired) {\n\t        var reshapedInputs = [];\n\t        var inputDims = inputs.map(function (input) {\n\t          return input.rank;\n\t        });\n\n\t        if (inputDims.indexOf(null) === -1) {\n\t          // If ranks of all inputs are available, we simply expand each of them\n\t          // at axis=1 until all of them have the same rank.\n\t          var maxNDim = max$5(inputDims);\n\n\t          for (var _iterator2 = _createForOfIteratorHelperLoose(inputs), _step2; !(_step2 = _iterator2()).done;) {\n\t            var x = _step2.value;\n\t            var xNDim = x.rank;\n\n\t            for (var k = 0; k < maxNDim - xNDim; ++k) {\n\t              x = expandDims$1(x, 1);\n\t            }\n\n\t            reshapedInputs.push(x);\n\t          }\n\n\t          return _this2.mergeFunction(reshapedInputs);\n\t        } else {\n\t          // Transpose all inputs so that batch size is the last dimension.\n\t          // [batchSize, dim1, dim2, ...] -> [dim1, dim2, ..., batchSize]\n\t          var transposed = false;\n\n\t          for (var _iterator3 = _createForOfIteratorHelperLoose(inputs), _step3; !(_step3 = _iterator3()).done;) {\n\t            var _x = _step3.value;\n\t            var _xNDim = _x.rank;\n\n\t            if (_xNDim == null) {\n\t              var xShape = _x.shape;\n\t              var _batchSize = xShape[0];\n\n\t              var _newShape = xShape.slice(1).concat([_batchSize]);\n\n\t              var xTransposed = _x.reshape([_batchSize].concat(arrayProd(xShape.slice(1))));\n\n\t              xTransposed = transpose(xTransposed, [1, 0]);\n\t              xTransposed = xTransposed.reshape(_newShape);\n\t              reshapedInputs.push(xTransposed);\n\t              transposed = true;\n\t            } else if (_xNDim > 1) {\n\t              var _dims = range$1(1, _xNDim).concat([0]);\n\n\t              reshapedInputs.push(transpose(_x, _dims));\n\t              transposed = true;\n\t            } else {\n\t              // We don't transpose inputs if they are 1D vectors or scalars.\n\t              reshapedInputs.push(_x);\n\t            }\n\t          }\n\n\t          var y = _this2.mergeFunction(reshapedInputs);\n\n\t          var yNDim = y.rank;\n\n\t          if (transposed) {\n\t            // If inputs have been transposed, we have to transpose the output\n\t            // too.\n\t            if (yNDim == null) {\n\t              var yShape = y.shape;\n\t              var _yNDim = yShape.length;\n\t              var batchSize = yShape[_yNDim - 1];\n\t              var newShape = [batchSize].concat(yShape.slice(0, yShape.length - 1));\n\t              y = transpose(y.reshape([-1, batchSize]), [1, 0]).reshape(newShape);\n\t            } else if (yNDim > 1) {\n\t              var dims = [yNDim - 1].concat(range$1(0, yNDim - 1));\n\t              y = transpose(y, dims);\n\t            }\n\t          }\n\n\t          return y;\n\t        }\n\t      } else {\n\t        return _this2.mergeFunction(inputs);\n\t      }\n\t    });\n\t  };\n\n\t  _proto.computeOutputShape = function computeOutputShape(inputShape) {\n\t    inputShape = inputShape;\n\t    var outputShape;\n\n\t    if (inputShape[0] == null) {\n\t      outputShape = null;\n\t    } else {\n\t      outputShape = inputShape[0].slice(1);\n\t    }\n\n\t    for (var i = 1; i < inputShape.length; ++i) {\n\t      var shape = inputShape[i] == null ? null : inputShape[i].slice(1);\n\t      outputShape = this.computeElementwiseOpOutputShape(outputShape, shape);\n\t    }\n\n\t    var batchSizes = [];\n\n\t    for (var _iterator4 = _createForOfIteratorHelperLoose(inputShape), _step4; !(_step4 = _iterator4()).done;) {\n\t      var _shape2 = _step4.value;\n\n\t      if (_shape2 != null && _shape2[0] !== null) {\n\t        batchSizes.push(_shape2[0]);\n\t      }\n\t    }\n\n\t    batchSizes = unique$1(batchSizes);\n\n\t    if (batchSizes.length === 1) {\n\t      outputShape = batchSizes.concat(outputShape);\n\t    } else {\n\t      outputShape = [null].concat(outputShape);\n\t    }\n\n\t    return outputShape;\n\t  };\n\n\t  _proto.computeMask = function computeMask(inputs, mask) {\n\t    return tidy(function () {\n\t      if (mask == null) {\n\t        return null;\n\t      }\n\n\t      if (!Array.isArray(mask)) {\n\t        throw new ValueError('`mask` should be an Array');\n\t      }\n\n\t      if (!Array.isArray(inputs)) {\n\t        throw new ValueError('`inputs` should be an Array');\n\t      }\n\n\t      if (mask.length !== inputs.length) {\n\t        throw new ValueError(\"The Array 'inputs' and 'mask' are expected to have the same \" + \"length, but have different lengths \" + (\"(\" + inputs.length + \" vs \" + mask.length + \")\"));\n\t      }\n\n\t      if (mask.every(function (m) {\n\t        return m == null;\n\t      })) {\n\t        return null;\n\t      }\n\n\t      mask = mask.map(function (m) {\n\t        return m == null ? m : expandDims(m, 0);\n\t      });\n\t      var output = mask[0];\n\n\t      for (var i = 1; i < mask.length - 1; ++i) {\n\t        output = logicalAnd(output, mask[i]);\n\t      }\n\n\t      return output;\n\t    });\n\t  };\n\n\t  return Merge;\n\t}(Layer);\n\tvar Add$1 = /*#__PURE__*/function (_Merge) {\n\t  _inheritsLoose(Add, _Merge);\n\n\t  function Add(args) {\n\t    return _Merge.call(this, args) || this;\n\t  }\n\n\t  var _proto2 = Add.prototype;\n\n\t  _proto2.mergeFunction = function mergeFunction(inputs) {\n\t    return tidy(function () {\n\t      var output = inputs[0].clone();\n\n\t      for (var i = 1; i < inputs.length; ++i) {\n\t        output = add$1(output, inputs[i]);\n\t      }\n\n\t      return output;\n\t    });\n\t  };\n\n\t  return Add;\n\t}(Merge);\n\t/** @nocollapse */\n\n\tAdd$1.className = 'Add';\n\tregisterClass(Add$1);\n\t/**\n\t * Calculate the element-wise sum of inputs, which all have the same shape.\n\t *\n\t * This function can be invoked in three ways.\n\t *\n\t * 1. Construct an instance of `Add` layer, by using no input argument\n\t *    or a single configuration argument. The resultant `Add` layer can then\n\t *    be used on `tf.SymbolicTensor`s or `tf.Tensor`s. For example:\n\t *\n\t * ```js\n\t * const addLayer = tf.layers.add();\n\t *\n\t * // The layer can be applied to inputs.\n\t * const input1 = tf.input({shape: [2, 2]});\n\t * const input2 = tf.input({shape: [2, 2]});\n\t * const output = addLayer.apply([input1, input2]);\n\t * console.log(output.shape);\n\t * // You get [null, 2, 2], with the first dimension as the undetermined batch\n\t * // dimension.\n\t * ```\n\t *\n\t * 2. Invoke directly on an `Array` of `tf.SymbolicTensor`s. This constructs\n\t *    an `Layer` object internally and calls its `apply` method on the inputs,\n\t *    generating a new `tf.SymbolicTensor`. For example:\n\t *\n\t * ```js\n\t * const input1 = tf.input({shape: [2, 2]});\n\t * const input2 = tf.input({shape: [2, 2]});\n\t * const output = tf.layers.add([input1, input2]);\n\t * console.log(output.shape);\n\t * // You get [null, 2, 2], with the first dimension as the undetermined batch\n\t * // dimension.\n\t * ```\n\t *\n\t * 3. Invoke directly on `tf.Tensor`s, i.e., concrete values. This constructs\n\t *    an `Layer` object internally and calls its `apply` method on the inputs,\n\t *    generating a new `tf.Tensor` as the result of the computation. For\n\t * example:\n\t *\n\t * ```js\n\t * const input1 = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n\t * const input2 = tf.tensor2d([10, 20, 30, 40], [2, 2]);\n\t * tf.layers.add([input1, input2]).print();\n\t * // Gives [[11, 22], [33, 44]].\n\t *\n\t */\n\n\tfunction add$2(config) {\n\t  if (Array.isArray(config)) {\n\t    var layer = new Add$1({});\n\t    return layer.apply(config);\n\t  } else {\n\t    return new Add$1(config);\n\t  }\n\t}\n\tvar Multiply$1 = /*#__PURE__*/function (_Merge2) {\n\t  _inheritsLoose(Multiply, _Merge2);\n\n\t  function Multiply(args) {\n\t    return _Merge2.call(this, args) || this;\n\t  }\n\n\t  var _proto3 = Multiply.prototype;\n\n\t  _proto3.mergeFunction = function mergeFunction(inputs) {\n\t    return tidy(function () {\n\t      var output = inputs[0].clone();\n\n\t      for (var i = 1; i < inputs.length; ++i) {\n\t        output = mul(output, inputs[i]);\n\t      }\n\n\t      return output;\n\t    });\n\t  };\n\n\t  return Multiply;\n\t}(Merge);\n\t/** @nocollapse */\n\n\tMultiply$1.className = 'Multiply';\n\tregisterClass(Multiply$1);\n\t/**\n\t * Calculate the element-wise product of inputs, which all have the same shape.\n\t *\n\t * This function can be invoked in three ways.\n\t *\n\t * 1. Construct an instance of `Multiply` layer, by using no input argument\n\t *    or a single configuration argument. The resultant `Multiply` layer can\n\t *    then be used on `tf.SymbolicTensor`s or `tf.Tensor`s. For example:\n\t *\n\t * ```js\n\t * const multiplyLayer = tf.layers.multiply();\n\t *\n\t * // The layer can be applied to inputs.\n\t * const input1 = tf.input({shape: [2, 2]});\n\t * const input2 = tf.input({shape: [2, 2]});\n\t * const output = multiplyLayer.apply([input1, input2]);\n\t * console.log(output.shape);\n\t * // You get [null, 2, 2], with the first dimension as the undetermined batch\n\t * // dimension.\n\t * ```\n\t *\n\t * 2. Invoke directly on an `Array` of `tf.SymbolicTensor`s. This constructs\n\t *    an `Layer` object internally and calls its `apply` method on the inputs,\n\t *    generating a new `tf.SymbolicTensor`. For example:\n\t *\n\t * ```js\n\t * const input1 = tf.input({shape: [2, 2]});\n\t * const input2 = tf.input({shape: [2, 2]});\n\t * const output = tf.layers.multiply([input1, input2]);\n\t * console.log(output.shape);\n\t * // You get [null, 2, 2], with the first dimension as the undetermined batch\n\t * // dimension.\n\t * ```\n\t *\n\t * 3. Invoke directly on `tf.Tensor`s, i.e., concrete values. This constructs\n\t *    an `Layer` object internally and calls its `apply` method on the inputs,\n\t *    generating a new `tf.Tensor` as the result of the computation. For\n\t * example:\n\t *\n\t * ```js\n\t * const input1 = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n\t * const input2 = tf.tensor2d([10, 20, 30, 40], [2, 2]);\n\t * tf.layers.multiply([input1, input2]).print();\n\t * // Gives [[10, 40], [90, 160]].\n\t *\n\t */\n\n\tfunction multiply(config) {\n\t  if (Array.isArray(config)) {\n\t    var layer = new Multiply$1({});\n\t    return layer.apply(config);\n\t  } else {\n\t    return new Multiply$1(config);\n\t  }\n\t}\n\tvar Average = /*#__PURE__*/function (_Merge3) {\n\t  _inheritsLoose(Average, _Merge3);\n\n\t  function Average(args) {\n\t    return _Merge3.call(this, args) || this;\n\t  }\n\n\t  var _proto4 = Average.prototype;\n\n\t  _proto4.mergeFunction = function mergeFunction(inputs) {\n\t    return tidy(function () {\n\t      var output = inputs[0].clone();\n\n\t      for (var i = 1; i < inputs.length; ++i) {\n\t        output = add$1(output, inputs[i]);\n\t      }\n\n\t      return mul(1 / inputs.length, output);\n\t    });\n\t  };\n\n\t  return Average;\n\t}(Merge);\n\t/** @nocollapse */\n\n\tAverage.className = 'Average';\n\tregisterClass(Average);\n\t/**\n\t * Calculate the element-wise arithmetic mean of inputs, which all have the same\n\t * shape.\n\t *\n\t * This function can be invoked in three ways.\n\t *\n\t * 1. Construct an instance of `Average` layer, by using no input argument\n\t *    or a single configuration argument. The resultant `Average` layer can then\n\t *    be used on `tf.SymbolicTensor`s or `tf.Tensor`s. For example:\n\t *\n\t * ```js\n\t * const averageLayer = tf.layers.average();\n\t *\n\t * // The layer can be applied to inputs.\n\t * const input1 = tf.input({shape: [2, 2]});\n\t * const input2 = tf.input({shape: [2, 2]});\n\t * const output = averageLayer.apply([input1, input2]);\n\t * console.log(output.shape);\n\t * // You get [null, 2, 2], with the first dimension as the undetermined batch\n\t * // dimension.\n\t * ```\n\t *\n\t * 2. Invoke directly on an `Array` of `tf.SymbolicTensor`s. This constructs\n\t *    an `Layer` object internally and calls its `apply` method on the inputs,\n\t *    generating a new `tf.SymbolicTensor`. For example:\n\t *\n\t * ```js\n\t * const input1 = tf.input({shape: [2, 2]});\n\t * const input2 = tf.input({shape: [2, 2]});\n\t * const output = tf.layers.average([input1, input2]);\n\t * console.log(output.shape);\n\t * // You get [null, 2, 2], with the first dimension as the undetermined batch\n\t * // dimension.\n\t * ```\n\t *\n\t * 3. Invoke directly on `tf.Tensor`s, i.e., concrete values. This constructs\n\t *    an `Layer` object internally and calls its `apply` method on the inputs,\n\t *    generating a new `tf.Tensor` as the result of the computation. For\n\t * example:\n\t *\n\t * ```js\n\t * const input1 = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n\t * const input2 = tf.tensor2d([10, 20, 30, 40], [2, 2]);\n\t * tf.layers.average([input1, input2]).print();\n\t * // Gives [[5.5, 11], [16.5, 22]].\n\t *\n\t */\n\n\tfunction average(config) {\n\t  if (Array.isArray(config)) {\n\t    var layer = new Average({});\n\t    return layer.apply(config);\n\t  } else {\n\t    return new Average(config);\n\t  }\n\t}\n\tvar Maximum$1 = /*#__PURE__*/function (_Merge4) {\n\t  _inheritsLoose(Maximum, _Merge4);\n\n\t  function Maximum(args) {\n\t    return _Merge4.call(this, args) || this;\n\t  }\n\n\t  var _proto5 = Maximum.prototype;\n\n\t  _proto5.mergeFunction = function mergeFunction(inputs) {\n\t    return tidy(function () {\n\t      var output = inputs[0];\n\n\t      for (var i = 1; i < inputs.length; ++i) {\n\t        output = maximum(output, inputs[i]);\n\t      }\n\n\t      return output;\n\t    });\n\t  };\n\n\t  return Maximum;\n\t}(Merge);\n\t/** @nocollapse */\n\n\tMaximum$1.className = 'Maximum';\n\tregisterClass(Maximum$1);\n\t/**\n\t * Calculate the element-wise maximum of inputs, which all have the same shape.\n\t *\n\t * This function can be invoked in three ways.\n\t *\n\t * 1. Construct an instance of `Maximum` layer, by using no input argument\n\t *    or a single configuration argument. The resultant `Maximum` layer can then\n\t *    be used on `tf.SymbolicTensor`s or `tf.Tensor`s. For example:\n\t *\n\t * ```js\n\t * const maximumLayer = tf.layers.maximum();\n\t *\n\t * // The layer can be applied to inputs.\n\t * const input1 = tf.input({shape: [2, 2]});\n\t * const input2 = tf.input({shape: [2, 2]});\n\t * const output = maximumLayer.apply([input1, input2]);\n\t * console.log(output.shape);\n\t * // You get [null, 2, 2], with the first dimension as the undetermined batch\n\t * // dimension.\n\t * ```\n\t *\n\t * 2. Invoke directly on an `Array` of `tf.SymbolicTensor`s. This constructs\n\t *    an `Layer` object internally and calls its `apply` method on the inputs,\n\t *    generating a new `tf.SymbolicTensor`. For example:\n\t *\n\t * ```js\n\t * const input1 = tf.input({shape: [2, 2]});\n\t * const input2 = tf.input({shape: [2, 2]});\n\t * const output = tf.layers.maximum([input1, input2]);\n\t * console.log(output.shape);\n\t * // You get [null, 2, 2], with the first dimension as the undetermined batch\n\t * // dimension.\n\t * ```\n\t *\n\t * 3. Invoke directly on `tf.Tensor`s, i.e., concrete values. This constructs\n\t *    an `Layer` object internally and calls its `apply` method on the inputs,\n\t *    generating a new `tf.Tensor` as the result of the computation. For\n\t * example:\n\t *\n\t * ```js\n\t * const input1 = tf.tensor2d([1, 20, 3, 40], [2, 2]);\n\t * const input2 = tf.tensor2d([10, 2, 30, 4], [2, 2]);\n\t * tf.layers.maximum([input1, input2]).print();\n\t * // Gives [[10, 20], [30, 40]].\n\t *\n\t */\n\n\tfunction maximum$1(config) {\n\t  if (Array.isArray(config)) {\n\t    var layer = new Maximum$1({});\n\t    return layer.apply(config);\n\t  } else {\n\t    return new Maximum$1(config);\n\t  }\n\t}\n\tvar Minimum$1 = /*#__PURE__*/function (_Merge5) {\n\t  _inheritsLoose(Minimum, _Merge5);\n\n\t  function Minimum(args) {\n\t    return _Merge5.call(this, args) || this;\n\t  }\n\n\t  var _proto6 = Minimum.prototype;\n\n\t  _proto6.mergeFunction = function mergeFunction(inputs) {\n\t    return tidy(function () {\n\t      var output = inputs[0];\n\n\t      for (var i = 1; i < inputs.length; ++i) {\n\t        output = minimum(output, inputs[i]);\n\t      }\n\n\t      return output;\n\t    });\n\t  };\n\n\t  return Minimum;\n\t}(Merge);\n\t/** @nocollapse */\n\n\tMinimum$1.className = 'Minimum';\n\tregisterClass(Minimum$1);\n\t/**\n\t * Calculate the element-wise minimum of inputs, which all have the same shape.\n\t *\n\t * This function can be invoked in three ways.\n\t *\n\t * 1. Construct an instance of `Minimum` layer, by using no input argument\n\t *    or a single configuration argument. The resultant `Minimum` layer can then\n\t *    be used on `tf.SymbolicTensor`s or `tf.Tensor`s. For example:\n\t *\n\t * ```js\n\t * const minimumLayer = tf.layers.minimum();\n\t *\n\t * // The layer can be applied to inputs.\n\t * const input1 = tf.input({shape: [2, 2]});\n\t * const input2 = tf.input({shape: [2, 2]});\n\t * const output = minimumLayer.apply([input1, input2]);\n\t * console.log(output.shape);\n\t * // You get [null, 2, 2], with the first dimension as the undetermined batch\n\t * // dimension.\n\t * ```\n\t *\n\t * 2. Invoke directly on an `Array` of `tf.SymbolicTensor`s. This constructs\n\t *    an `Layer` object internally and calls its `apply` method on the inputs,\n\t *    generating a new `tf.SymbolicTensor`. For example:\n\t *\n\t * ```js\n\t * const input1 = tf.input({shape: [2, 2]});\n\t * const input2 = tf.input({shape: [2, 2]});\n\t * const output = tf.layers.minimum([input1, input2]);\n\t * console.log(output.shape);\n\t * // You get [null, 2, 2], with the first dimension as the undetermined batch\n\t * // dimension.\n\t * ```\n\t *\n\t * 3. Invoke directly on `tf.Tensor`s, i.e., concrete values. This constructs\n\t *    an `Layer` object internally and calls its `apply` method on the inputs,\n\t *    generating a new `tf.Tensor` as the result of the computation. For\n\t * example:\n\t *\n\t * ```js\n\t * const input1 = tf.tensor2d([1, 20, 3, 40], [2, 2]);\n\t * const input2 = tf.tensor2d([10, 2, 30, 4], [2, 2]);\n\t * tf.layers.minimum([input1, input2]).print();\n\t * // Gives [[1, 2], [3, 4]].\n\t *\n\t */\n\n\tfunction minimum$1(config) {\n\t  if (Array.isArray(config)) {\n\t    var layer = new Minimum$1({});\n\t    return layer.apply(config);\n\t  } else {\n\t    return new Minimum$1(config);\n\t  }\n\t}\n\tvar Concatenate = /*#__PURE__*/function (_Merge6) {\n\t  _inheritsLoose(Concatenate, _Merge6);\n\n\t  function Concatenate(args) {\n\t    var _this3;\n\n\t    _this3 = _Merge6.call(this, args) || this;\n\t    _this3.DEFAULT_AXIS = -1;\n\n\t    if (args == null) {\n\t      args = {};\n\t    }\n\n\t    _this3.axis = args.axis == null ? _this3.DEFAULT_AXIS : args.axis;\n\t    _this3.supportsMasking = true;\n\t    _this3.reshapeRequired = false;\n\t    return _this3;\n\t  }\n\n\t  var _proto7 = Concatenate.prototype;\n\n\t  _proto7.build = function build(inputShape) {\n\t    // Used purely for shape validation.]\n\t    if (!(Array.isArray(inputShape) && Array.isArray(inputShape[0])) || inputShape.length === 1) {\n\t      throw new ValueError('A `Concatenate` layer should be called on a list of at least 2 ' + 'inputs');\n\t    }\n\n\t    inputShape = inputShape;\n\t    var allNoneShape = true;\n\n\t    for (var _iterator5 = _createForOfIteratorHelperLoose(inputShape), _step5; !(_step5 = _iterator5()).done;) {\n\t      var _shape3 = _step5.value;\n\n\t      if (_shape3 != null) {\n\t        allNoneShape = false;\n\t        break;\n\t      }\n\t    }\n\n\t    if (allNoneShape) {\n\t      return;\n\t    }\n\n\t    var shapeSet = [];\n\n\t    for (var i = 0; i < inputShape.length; ++i) {\n\t      var shapeWithoutConcatAxis = inputShape[i].slice();\n\t      shapeWithoutConcatAxis.splice(this.axis, 1);\n\t      var exists = false;\n\n\t      for (var _iterator6 = _createForOfIteratorHelperLoose(shapeSet), _step6; !(_step6 = _iterator6()).done;) {\n\t        var shape = _step6.value;\n\n\t        if (arraysEqual(shape, shapeWithoutConcatAxis)) {\n\t          exists = true;\n\t          break;\n\t        }\n\t      }\n\n\t      if (!exists) {\n\t        shapeSet.push(shapeWithoutConcatAxis);\n\t      }\n\t    }\n\n\t    if (shapeSet.length > 1) {\n\t      throw new ValueError('A `Concatenate` layer requires inputs with matching shapes ' + 'except for the concat axis. Got input shapes: ' + JSON.stringify(inputShape));\n\t    }\n\t  };\n\n\t  _proto7.mergeFunction = function mergeFunction(inputs) {\n\t    var _this4 = this;\n\n\t    return tidy(function () {\n\t      return concatenate(inputs, _this4.axis);\n\t    });\n\t  };\n\n\t  _proto7.computeOutputShape = function computeOutputShape(inputShape) {\n\t    if (!(Array.isArray(inputShape) && Array.isArray(inputShape[0]))) {\n\t      throw new ValueError('A `Concatenate` layer should be called on a list of inputs.');\n\t    }\n\n\t    var inputShapes = inputShape;\n\t    var outputShape = inputShapes[0].slice();\n\t    var axis = this.axis < 0 ? outputShape.length + this.axis : this.axis; // Porting Note: the line above is because TypeScript doesn't support\n\t    //   negative indices.\n\n\t    for (var _iterator7 = _createForOfIteratorHelperLoose(inputShapes.slice(1)), _step7; !(_step7 = _iterator7()).done;) {\n\t      var shape = _step7.value;\n\n\t      if (outputShape[axis] == null || shape[axis] == null) {\n\t        outputShape[axis] = null;\n\t        break;\n\t      }\n\n\t      outputShape[axis] += shape[axis];\n\t    }\n\n\t    return outputShape;\n\t  };\n\n\t  _proto7.computeMask = function computeMask(inputs, mask) {\n\t    var _this5 = this;\n\n\t    if (mask == null) {\n\t      return null;\n\t    }\n\n\t    if (!Array.isArray(mask)) {\n\t      throw new ValueError('`mask` should be an array for Concatenate');\n\t    }\n\n\t    if (!Array.isArray(inputs)) {\n\t      throw new ValueError('`inputs` should be an array for Concatenate');\n\t    }\n\n\t    if (mask.length !== inputs.length) {\n\t      throw new ValueError(\"Mismatch in the length of mask (\" + mask.length + \") \" + (\"and the legnth of inputs (\" + inputs.length + \")\"));\n\t    }\n\n\t    return tidy(function () {\n\t      var allNullMasks = true;\n\t      mask.forEach(function (m) {\n\t        if (m != null) {\n\t          allNullMasks = false;\n\t          return;\n\t        }\n\t      });\n\n\t      if (allNullMasks) {\n\t        return null;\n\t      }\n\n\t      var outputMasks = [];\n\n\t      for (var i = 0; i < inputs.length; ++i) {\n\t        if (mask[i] == null) {\n\t          // Input is unmasked. Append all 1's to masks.\n\t          outputMasks.push(onesLike(inputs[i]).asType('bool'));\n\t        } else if (mask[i].rank < inputs[i].rank) {\n\t          // Mask is smaller than the input, expand it.\n\t          outputMasks.push(expandDims(mask[i], -1));\n\t        } else {\n\t          outputMasks.push(mask[i]);\n\t        }\n\t      }\n\n\t      var concatenatedMasks = concat(outputMasks, _this5.axis);\n\t      return all(concatenatedMasks, -1, false);\n\t    });\n\t  };\n\n\t  _proto7.getConfig = function getConfig() {\n\t    var config = {\n\t      'axis': this.axis\n\t    };\n\n\t    var baseConfig = _Merge6.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return Concatenate;\n\t}(Merge);\n\t/** @nocollapse */\n\n\tConcatenate.className = 'Concatenate';\n\tregisterClass(Concatenate);\n\t/**\n\t * Concatenate an `Array` of inputs.\n\t *\n\t * This function can be invoked in three ways.\n\t *\n\t * 1. Construct an instance of `Concatenate` layer, by using no input argument\n\t *    or a single configuration argument. The resultant `Concatenate` layer can\n\t *    then be used on `tf.SymbolicTensor`s or `tf.Tensor`s. For example:\n\t *\n\t * ```js\n\t * const concatLayer = tf.layers.concatenate();\n\t *\n\t * // The layer can be applied to inputs.\n\t * const input1 = tf.input({shape: [2, 3]});\n\t * const input2 = tf.input({shape: [2, 4]});\n\t * const output = concatLayer.apply([input1, input2]);\n\t * console.log(output.shape);\n\t * // You get [null, 2, 7], with the first dimension as the undetermined batch\n\t * // dimension and the last dimension as the result of concatenating the\n\t * // last dimensions of the two inputs.\n\t * ```\n\t *\n\t * 2. Invoke directly on an `Array` of `tf.SymbolicTensor`s. This constructs\n\t *    an `Layer` object internally and calls its `apply` method on the inputs,\n\t *    generating a new `tf.SymbolicTensor`. For example:\n\t *\n\t * ```js\n\t * const input1 = tf.input({shape: [2, 3]});\n\t * const input2 = tf.input({shape: [2, 4]});\n\t * const output = tf.layers.concatenate([input1, input2]);\n\t * console.log(output.shape);\n\t * // You get [null, 2, 2], with the first dimension as the undetermined batch\n\t * // dimension and the last dimension as the result of concatenating the\n\t * // last dimensions of the two inputs.\n\t * ```\n\t *\n\t * 3. Invoke directly on `tf.Tensor`s, i.e., concrete values. This constructs\n\t *    an `Layer` object internally and calls its `apply` method on the inputs,\n\t *    generating a new `tf.Tensor` as the result of the computation. For\n\t * example:\n\t *\n\t * ```js\n\t * const input1 = tf.tensor2d([[1, 2], [3, 4]], [2, 2]);\n\t * const input2 = tf.tensor2d([[10, 20], [30, 40]], [2, 2]);\n\t * tf.layers.concatenate([input1, input2]).print();\n\t * // Gives [[1, 2, 10, 20], [3, 4, 30, 40]].\n\t *\n\t */\n\n\tfunction concatenate$1(config) {\n\t  if (Array.isArray(config)) {\n\t    var layer = new Concatenate({});\n\t    return layer.apply(config);\n\t  } else {\n\t    return new Concatenate(config);\n\t  }\n\t}\n\t/**\n\t * Interpretable potentially negative axis index.\n\t *\n\t * For example, given axis = -1, and dim = 3, this function will return 2.\n\t *\n\t * @param axis The axis index, may be a positive, zero or negative integer.\n\t * @param dim Total number of dimensions, a positive integer.\n\t * @returns A non-negative axis index equivalent to the input `axis`.\n\t */\n\n\tfunction interpretAxis(axis, dim) {\n\t  while (axis < 0) {\n\t    axis += dim;\n\t  }\n\n\t  return axis;\n\t}\n\n\tfunction batchDot(x, y, axes) {\n\t  if (x.shape.length > 3 || y.shape.length > 3) {\n\t    throw new NotImplementedError('batchDot is not implemented for tensors of 4D or higher rank yet');\n\t  }\n\n\t  assert(x.shape.length >= 2, function () {\n\t    return \"batchDot requires the rank of x to be >= 2, \" + (\"but got \" + x.shape.length);\n\t  });\n\t  assert(x.shape.length >= 2, function () {\n\t    return \"batchDot requires the rank of y to be >= 2, \" + (\"but got \" + y.shape.length);\n\t  });\n\n\t  if (typeof axes === 'number') {\n\t    axes = [axes, axes];\n\t  }\n\n\t  if (x.dtype === 'complex64' || y.dtype === 'complex64') {\n\t    throw new NotImplementedError('batchDot is not implemented for complex64-type Tensors yet.');\n\t  }\n\n\t  var xNDim = x.shape.length;\n\t  var yNDim = y.shape.length;\n\n\t  if (axes == null) {\n\t    // Behave like batchMatmul by default.\n\t    axes = [xNDim - 1, yNDim - 2];\n\t  }\n\n\t  var axesArray = axes;\n\t  return tidy(function () {\n\t    var diff;\n\n\t    if (xNDim > yNDim) {\n\t      diff = xNDim - yNDim;\n\t      var diffShape = [];\n\n\t      for (var i = 0; i < diff; ++i) {\n\t        diffShape.push(1);\n\t      }\n\n\t      y = y.reshape(y.shape.concat(diffShape));\n\t    } else if (yNDim > xNDim) {\n\t      diff = yNDim - xNDim;\n\t      var _diffShape = [];\n\n\t      for (var _i = 0; _i < diff; ++_i) {\n\t        _diffShape.push(1);\n\t      }\n\n\t      x = x.reshape(x.shape.concat(_diffShape));\n\t    } else {\n\t      diff = 0;\n\t    }\n\n\t    var out;\n\n\t    if (x.shape.length === 2 && y.shape.length === 2) {\n\t      if (axesArray[0] === axesArray[1]) {\n\t        out = x.mul(y).sum(axesArray[0]);\n\t      } else {\n\t        out = x.transpose([1, 0]).mul(y).sum(axesArray[1]);\n\t      }\n\t    } else {\n\t      var adjX = axesArray[0] !== x.shape.length - 1;\n\t      var adjY = axesArray[1] === y.shape.length - 1;\n\t      out = x.matMul(y, adjX, adjY);\n\t    }\n\n\t    if (diff > 0) {\n\t      var idx;\n\n\t      if (xNDim > yNDim) {\n\t        idx = xNDim + yNDim - 3;\n\t      } else {\n\t        idx = xNDim - 1;\n\t      }\n\n\t      var squeezeAxes = [];\n\n\t      for (var _i2 = idx; _i2 < idx + diff; ++_i2) {\n\t        squeezeAxes.push(_i2);\n\t      }\n\n\t      out = out.squeeze(squeezeAxes);\n\t    }\n\n\t    if (out.shape.length === 1) {\n\t      out = out.expandDims(1);\n\t    }\n\n\t    return out;\n\t  });\n\t}\n\n\tvar Dot = /*#__PURE__*/function (_Merge7) {\n\t  _inheritsLoose(Dot, _Merge7);\n\n\t  function Dot(args) {\n\t    var _this6;\n\n\t    _this6 = _Merge7.call(this, args) || this;\n\t    _this6.axes = args.axes;\n\t    _this6.normalize = args.normalize == null ? false : args.normalize;\n\t    _this6.supportsMasking = true;\n\t    _this6.reshapeRequired = false;\n\t    return _this6;\n\t  }\n\n\t  var _proto8 = Dot.prototype;\n\n\t  _proto8.build = function build(inputShape) {\n\t    assert(Array.isArray(inputShape) && inputShape.length === 2 && Array.isArray(inputShape[0]) && Array.isArray(inputShape[1]), function () {\n\t      return 'A `Dot` layer should be called on a list of exactly 2 inputs.';\n\t    });\n\t    var shape1 = inputShape[0];\n\t    var shape2 = inputShape[1];\n\n\t    if (shape1.length > 3 || shape2.length > 3) {\n\t      throw new NotImplementedError('Dot layer does not support tensors of 4D or higher rank yet.');\n\t    }\n\n\t    var axes = this.interpretAxes(shape1, shape2);\n\n\t    if (shape1[axes[0]] !== shape2[axes[1]]) {\n\t      throw new ValueError(\"Dimension incompatibility: \" + (shape1[axes[0]] + \" !== \" + shape2[axes[1]]));\n\t    }\n\t  };\n\n\t  _proto8.mergeFunction = function mergeFunction(inputs) {\n\t    if (inputs.length !== 2) {\n\t      throw new ValueError('A `Dot` layer must be called on exactly 2 inputs, ' + (\"but received \" + inputs.length + \" input(s).\"));\n\t    }\n\n\t    var x1 = inputs[0];\n\t    var x2 = inputs[1];\n\t    var axes;\n\n\t    if (!Array.isArray(this.axes)) {\n\t      axes = [interpretAxis(this.axes, x1.shape.length), interpretAxis(this.axes, x2.shape.length)];\n\t    } else {\n\t      axes = this.axes.map(function (axis, i) {\n\t        return interpretAxis(axis, inputs[i].shape.length);\n\t      });\n\t    }\n\n\t    if (this.normalize) {\n\t      x1 = l2Normalize(x1, axes[0]);\n\t      x2 = l2Normalize(x2, axes[1]);\n\t    }\n\n\t    return batchDot(x1, x2, axes);\n\t  };\n\n\t  _proto8.interpretAxes = function interpretAxes(shape1, shape2) {\n\t    var axes;\n\n\t    if (!Array.isArray(this.axes)) {\n\t      // `this.axes` is a single integer.\n\t      axes = [interpretAxis(this.axes, shape1.length), interpretAxis(this.axes, shape2.length)];\n\t    } else {\n\t      // `this.axes` is an Array of integers.\n\t      axes = this.axes;\n\t    }\n\n\t    return axes;\n\t  };\n\n\t  _proto8.computeOutputShape = function computeOutputShape(inputShape) {\n\t    assert(Array.isArray(inputShape) && inputShape.length === 2 && Array.isArray(inputShape[0]) && Array.isArray(inputShape[1]), function () {\n\t      return 'A `Dot` layer should be called on a list of exactly 2 inputs.';\n\t    });\n\t    var shape1 = inputShape[0].slice();\n\t    var shape2 = inputShape[1].slice();\n\n\t    if (shape1.length > 3 || shape2.length > 3) {\n\t      throw new NotImplementedError('Dot layer does not support tensors of 4D or higher rank yet.');\n\t    }\n\n\t    var axes = this.interpretAxes(shape1, shape2);\n\t    shape1.splice(axes[0], 1);\n\t    shape2.splice(axes[1], 1);\n\t    shape2.splice(0, 1);\n\t    var outputShape = shape1.concat(shape2);\n\n\t    if (outputShape.length === 1) {\n\t      outputShape.push(1);\n\t    }\n\n\t    return outputShape;\n\t  };\n\n\t  _proto8.computeMask = function computeMask(inputs, mask) {\n\t    return null;\n\t  };\n\n\t  _proto8.getConfig = function getConfig() {\n\t    var config = {\n\t      'axes': this.axes,\n\t      'normalize': this.normalize\n\t    };\n\n\t    var baseConfig = _Merge7.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return Dot;\n\t}(Merge);\n\t/** @nocollapse */\n\n\tDot.className = 'Dot';\n\tregisterClass(Dot); // TODO(cais): Add functional interfaces for the merge layers.\n\n\tvar GaussianNoise = /*#__PURE__*/function (_Layer) {\n\t  _inheritsLoose(GaussianNoise, _Layer);\n\n\t  function GaussianNoise(args) {\n\t    var _this;\n\n\t    _this = _Layer.call(this, args) || this;\n\t    _this.supportsMasking = true;\n\t    _this.stddev = args.stddev;\n\t    return _this;\n\t  }\n\n\t  var _proto = GaussianNoise.prototype;\n\n\t  _proto.computeOutputShape = function computeOutputShape(inputShape) {\n\t    return inputShape;\n\t  };\n\n\t  _proto.getConfig = function getConfig() {\n\t    var baseConfig = _Layer.prototype.getConfig.call(this);\n\n\t    var config = {\n\t      stddev: this.stddev\n\t    };\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  _proto.call = function call(inputs, kwargs) {\n\t    var _this2 = this;\n\n\t    return tidy(function () {\n\t      _this2.invokeCallHook(inputs, kwargs);\n\n\t      var input = getExactlyOneTensor(inputs);\n\n\t      var noised = function noised() {\n\t        return randomNormal$1(input.shape, 0, _this2.stddev).add(input);\n\t      };\n\n\t      var output = inTrainPhase(noised, function () {\n\t        return input;\n\t      }, kwargs['training'] || false);\n\t      return output;\n\t    });\n\t  };\n\n\t  return GaussianNoise;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tGaussianNoise.className = 'GaussianNoise';\n\tregisterClass(GaussianNoise);\n\tvar GaussianDropout = /*#__PURE__*/function (_Layer2) {\n\t  _inheritsLoose(GaussianDropout, _Layer2);\n\n\t  function GaussianDropout(args) {\n\t    var _this3;\n\n\t    _this3 = _Layer2.call(this, args) || this;\n\t    _this3.supportsMasking = true;\n\t    _this3.rate = args.rate;\n\t    return _this3;\n\t  }\n\n\t  var _proto2 = GaussianDropout.prototype;\n\n\t  _proto2.computeOutputShape = function computeOutputShape(inputShape) {\n\t    return inputShape;\n\t  };\n\n\t  _proto2.getConfig = function getConfig() {\n\t    var baseConfig = _Layer2.prototype.getConfig.call(this);\n\n\t    var config = {\n\t      rate: this.rate\n\t    };\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  _proto2.call = function call(inputs, kwargs) {\n\t    var _this4 = this;\n\n\t    return tidy(function () {\n\t      _this4.invokeCallHook(inputs, kwargs);\n\n\t      var input = getExactlyOneTensor(inputs);\n\n\t      if (_this4.rate > 0 && _this4.rate < 1) {\n\t        var noised = function noised() {\n\t          var stddev = Math.sqrt(_this4.rate / (1 - _this4.rate));\n\t          return input.mul(randomNormal$1(input.shape, 1, stddev));\n\t        };\n\n\t        return inTrainPhase(noised, function () {\n\t          return input;\n\t        }, kwargs['training'] || false);\n\t      }\n\n\t      return input;\n\t    });\n\t  };\n\n\t  return GaussianDropout;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tGaussianDropout.className = 'GaussianDropout';\n\tregisterClass(GaussianDropout);\n\t/**\n\t * Applies Alpha Dropout to the input.\n\t *\n\t * As it is a regularization layer, it is only active at training time.\n\t *\n\t * Alpha Dropout is a `Dropout` that keeps mean and variance of inputs\n\t * to their original values, in order to ensure the self-normalizing property\n\t * even after this dropout.\n\t * Alpha Dropout fits well to Scaled Exponential Linear Units\n\t * by randomly setting activations to the negative saturation value.\n\t *\n\t * Arguments:\n\t *   - `rate`: float, drop probability (as with `Dropout`).\n\t *     The multiplicative noise will have\n\t *     standard deviation `sqrt(rate / (1 - rate))`.\n\t *   - `noise_shape`: A 1-D `Tensor` of type `int32`, representing the\n\t *     shape for randomly generated keep/drop flags.\n\t *\n\t * Input shape:\n\t *   Arbitrary. Use the keyword argument `inputShape`\n\t *   (tuple of integers, does not include the samples axis)\n\t *   when using this layer as the first layer in a model.\n\t *\n\t * Output shape:\n\t *   Same shape as input.\n\t *\n\t * References:\n\t *   - [Self-Normalizing Neural Networks](https://arxiv.org/abs/1706.02515)\n\t */\n\n\tvar AlphaDropout = /*#__PURE__*/function (_Layer3) {\n\t  _inheritsLoose(AlphaDropout, _Layer3);\n\n\t  function AlphaDropout(args) {\n\t    var _this5;\n\n\t    _this5 = _Layer3.call(this, args) || this;\n\t    _this5.supportsMasking = true;\n\t    _this5.rate = args.rate;\n\t    _this5.noiseShape = args.noiseShape;\n\t    return _this5;\n\t  }\n\n\t  var _proto3 = AlphaDropout.prototype;\n\n\t  _proto3._getNoiseShape = function _getNoiseShape(inputs) {\n\t    return this.noiseShape || getExactlyOneTensor(inputs).shape;\n\t  };\n\n\t  _proto3.computeOutputShape = function computeOutputShape(inputShape) {\n\t    return inputShape;\n\t  };\n\n\t  _proto3.getConfig = function getConfig() {\n\t    var baseConfig = _Layer3.prototype.getConfig.call(this);\n\n\t    var config = {\n\t      rate: this.rate\n\t    };\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  _proto3.call = function call(inputs, kwargs) {\n\t    var _this6 = this;\n\n\t    return tidy(function () {\n\t      if (_this6.rate < 1 && _this6.rate > 0) {\n\t        var noiseShape = _this6._getNoiseShape(inputs);\n\n\t        var droppedInputs = function droppedInputs() {\n\t          var input = getExactlyOneTensor(inputs);\n\t          var alpha = 1.6732632423543772848170429916717;\n\t          var scale = 1.0507009873554804934193349852946;\n\t          var alphaP = -alpha * scale;\n\t          var keptIdx = greaterEqual(randomUniform(noiseShape), _this6.rate);\n\t          keptIdx = cast$1(keptIdx, 'float32'); // get default dtype.\n\t          // Get affine transformation params.\n\n\t          var a = Math.pow((1 - _this6.rate) * (1 + _this6.rate * Math.pow(alphaP, 2)), -0.5);\n\t          var b = -a * alphaP * _this6.rate; // Apply mask.\n\n\t          var x = input.mul(keptIdx).add(keptIdx.add(-1).mul(alphaP));\n\t          return x.mul(a).add(b);\n\t        };\n\n\t        return inTrainPhase(droppedInputs, function () {\n\t          return getExactlyOneTensor(inputs);\n\t        }, kwargs['training'] || false);\n\t      }\n\n\t      return inputs;\n\t    });\n\t  };\n\n\t  return AlphaDropout;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tAlphaDropout.className = 'AlphaDropout';\n\tregisterClass(AlphaDropout);\n\n\t/**\n\t * Applies batch normalization on x given mean, var, beta and gamma.\n\t *\n\t * I.e. returns:\n\t *   `output = (x - mean) / (sqrt(var) + epsilon) * gamma + beta`\n\t *\n\t * @param x Input tensor.\n\t * @param mean Mean of batch.\n\t * @param variance Variance of batch.\n\t * @param beta Tensor with which to center the input.\n\t * @param gamma Tensor by which to scale the input.\n\t * @param epsilon Fuzz factor.\n\t * @returns The result of the batch normalization.\n\t */\n\n\tfunction batchNormalization(x, mean, variance, beta, gamma, epsilon) {\n\t  if (epsilon === void 0) {\n\t    epsilon = 1e-3;\n\t  }\n\n\t  var out;\n\n\t  if (x.rank === 2) {\n\t    out = batchNorm2d(x, mean, variance, beta, gamma, epsilon);\n\t  } else if (x.rank === 3) {\n\t    // TODO(cais): Check rank; give proper error message.\n\t    out = batchNorm3d(x, mean, variance, beta, gamma, epsilon);\n\t  } else if (x.rank === 4) {\n\t    out = batchNorm4d(x, mean, variance, beta, gamma, epsilon);\n\t  } else {\n\t    throw new NotImplementedError(\"batchNormalization is not implemented for array of rank \" + x.rank + \" \" + \"yet\");\n\t  }\n\n\t  return out;\n\t}\n\t/**\n\t * Non-broadcasting batch normalization for use in training (not inference).\n\t *\n\t * The input is normalized to zero mean and unit variance along the\n\t * `reductionAxes`, followed by scaling with `gamma` and shifted by `beta`.\n\t * The result of that is returned as the first element\n\t * of the returned `Array`. The other two elements are the mean and variance,\n\t * respectively.\n\t *\n\t * @param x Input tensor to be normalized.\n\t * @param gamma Tensor by which to scale the input.\n\t * @param beta Tensor by which to center the input.\n\t * @param reductionAxes Axes over which to normalize.\n\t * @param epsilon Fuzz factor.\n\t * @returns An `Array` of three `Tensors`:\n\t *   [normalized tensor, mean of input, variance of input].\n\t */\n\n\tfunction regularNormalizeBatchInTraining(x, gamma, beta, reductionAxes, epsilon) {\n\t  if (epsilon === void 0) {\n\t    epsilon = 1e-3;\n\t  }\n\n\t  return tidy(function () {\n\t    var meanAndVariance = moments(x, reductionAxes);\n\t    var mean = meanAndVariance.mean;\n\t    var variance = meanAndVariance.variance;\n\t    var normed = batchNormalization(x, mean, variance, beta, gamma, epsilon);\n\t    return [normed, mean, variance];\n\t  });\n\t}\n\t/**\n\t * Broadcasting batch normalization for use in training (not inference).\n\t *\n\t * The input is normalized to zero mean and unit variance along the\n\t * `reductionAxes`, followed by scaling with `gamma` and shifted by `beta`.\n\t * The result of that is returned as the first element\n\t * of the returned `Array`. The other two elements are the mean and variance,\n\t * respectively.\n\t *\n\t * @param x Input tensor to be normalized.\n\t * @param gamma Tensor by which to scale the input.\n\t * @param beta Tensor by which to center the input.\n\t * @param reductionAxes Axes over which to normalize.\n\t * @param epsilon Fuzz factor.\n\t * @returns An `Array` of three `Tensors`:\n\t *   [normalized tensor, mean of input, variance of input].\n\t */\n\n\n\tfunction broadcastNormalizeBatchInTraining(x, gamma, beta, reductionAxes, epsilon) {\n\t  if (epsilon === void 0) {\n\t    epsilon = 1e-3;\n\t  }\n\n\t  return tidy(function () {\n\t    var meanAndVariance = moments(x, reductionAxes);\n\t    var mean = meanAndVariance.mean;\n\t    var variance = meanAndVariance.variance;\n\t    var targetShape = [];\n\n\t    for (var _iterator = _createForOfIteratorHelperLoose(range$1(0, x.rank)), _step; !(_step = _iterator()).done;) {\n\t      var axis = _step.value;\n\n\t      if (reductionAxes.indexOf(axis) !== -1) {\n\t        targetShape.push(1);\n\t      } else {\n\t        targetShape.push(x.shape[axis]);\n\t      }\n\t    }\n\n\t    var broadcastMean = mean.reshape(targetShape);\n\t    var broadcastVariance = variance.reshape(targetShape);\n\t    var broadcastGamma = gamma == null ? null : gamma.reshape(targetShape);\n\t    var broadcastBeta = beta == null ? null : beta.reshape(targetShape);\n\t    var normed = batchNormalization(x, broadcastMean, broadcastVariance, broadcastBeta, broadcastGamma, epsilon);\n\t    return [normed, mean, variance];\n\t  });\n\t}\n\t/**\n\t * Batch normalization for use in training (not inference).\n\t *\n\t * @param x Input tensor to be normalized.\n\t * @param gamma Tensor by which to scale the input.\n\t * @param beta Tensor by which to center the input.\n\t * @param reductionAxes Axes over which to normalize.\n\t * @param epsilon Fuzz factor.\n\t * @returns An `Array` of three `Tensors`:\n\t *   [normalized tensor, mean of input, variance of input].\n\t */\n\n\n\tfunction normalizeBatchInTraining(x, gamma, beta, reductionAxes, epsilon) {\n\t  if (epsilon === void 0) {\n\t    epsilon = 1e-3;\n\t  }\n\n\t  if (arraysEqual(reductionAxes.slice().sort(), range$1(0, x.rank - 1))) {\n\t    return regularNormalizeBatchInTraining(x, gamma, beta, reductionAxes, epsilon);\n\t  } else {\n\t    return broadcastNormalizeBatchInTraining(x, gamma, beta, reductionAxes, epsilon);\n\t  }\n\t}\n\tvar BatchNormalization = /*#__PURE__*/function (_Layer) {\n\t  _inheritsLoose(BatchNormalization, _Layer);\n\n\t  function BatchNormalization(args) {\n\t    var _this;\n\n\t    if (args == null) {\n\t      args = {};\n\t    }\n\n\t    _this = _Layer.call(this, args) || this;\n\t    _this.supportsMasking = true;\n\t    _this.axis = args.axis == null ? -1 : args.axis;\n\t    _this.momentum = args.momentum == null ? 0.99 : args.momentum;\n\t    _this.epsilon = args.epsilon == null ? 1e-3 : args.epsilon;\n\t    _this.center = args.center == null ? true : args.center;\n\t    _this.scale = args.scale == null ? true : args.scale;\n\t    _this.betaInitializer = getInitializer(args.betaInitializer || 'zeros');\n\t    _this.gammaInitializer = getInitializer(args.gammaInitializer || 'ones');\n\t    _this.movingMeanInitializer = getInitializer(args.movingMeanInitializer || 'zeros');\n\t    _this.movingVarianceInitializer = getInitializer(args.movingVarianceInitializer || 'ones');\n\t    _this.betaConstraint = getConstraint(args.betaConstraint);\n\t    _this.gammaConstraint = getConstraint(args.gammaConstraint);\n\t    _this.betaRegularizer = getRegularizer(args.betaRegularizer);\n\t    _this.gammaRegularizer = getRegularizer(args.gammaRegularizer);\n\t    return _this;\n\t  }\n\n\t  var _proto = BatchNormalization.prototype;\n\n\t  _proto.build = function build(inputShape) {\n\t    var _axes;\n\n\t    inputShape = getExactlyOneShape(inputShape);\n\t    var axis = this.axis >= 0 ? this.axis : this.axis + inputShape.length;\n\t    var dim = inputShape[axis];\n\n\t    if (dim == null) {\n\t      throw new ValueError(\"Axis \" + axis + \" of input tensor should have a defined dimension but \" + \"the layer received an input with shape \" + (JSON.stringify(inputShape) + \".\"));\n\t    }\n\n\t    this.inputSpec = [new InputSpec({\n\t      ndim: inputShape.length,\n\t      axes: (_axes = {}, _axes[axis] = dim, _axes)\n\t    })];\n\t    var shape = [dim];\n\n\t    if (this.scale) {\n\t      this.gamma = this.addWeight('gamma', shape, null, this.gammaInitializer, this.gammaRegularizer, true, this.gammaConstraint);\n\t    }\n\n\t    if (this.center) {\n\t      this.beta = this.addWeight('beta', shape, null, this.betaInitializer, this.betaRegularizer, true, this.betaConstraint);\n\t    }\n\n\t    this.movingMean = this.addWeight('moving_mean', shape, null, this.movingMeanInitializer, null, false);\n\t    this.movingVariance = this.addWeight('moving_variance', shape, null, this.movingVarianceInitializer, null, false);\n\t    this.built = true;\n\t  };\n\n\t  _proto.call = function call(inputs, kwargs) {\n\t    var _this2 = this;\n\n\t    return tidy(function () {\n\t      var training = kwargs['training'] == null ? false : kwargs['training'];\n\t      var input = getExactlyOneTensor(inputs);\n\t      var inputShape = input.shape;\n\t      var ndim = inputShape.length;\n\t      var reductionAxes = range$1(0, ndim);\n\t      var axis = _this2.axis >= 0 ? _this2.axis : _this2.axis + ndim;\n\t      reductionAxes.splice(axis, 1);\n\t      var broadcastShape = pyListRepeat(1, ndim);\n\t      broadcastShape[axis] = inputShape[axis];\n\t      var sortedReductionAxes = reductionAxes.slice();\n\t      sortedReductionAxes.sort();\n\t      var needsBroadcasting = !arraysEqual(sortedReductionAxes, range$1(0, ndim).slice(0, ndim - 1));\n\n\t      var normalizeInference = function normalizeInference() {\n\t        if (needsBroadcasting) {\n\t          var broadcastMovingMean = _this2.movingMean.read().reshape(broadcastShape);\n\n\t          var broadcastMovingVariance = _this2.movingVariance.read().reshape(broadcastShape);\n\n\t          var broadcastBeta = _this2.center ? _this2.beta.read().reshape(broadcastShape) : null;\n\t          var broadcastGamma = _this2.scale ? _this2.gamma.read().reshape(broadcastShape) : null;\n\t          return batchNormalization(input, broadcastMovingMean, broadcastMovingVariance, broadcastBeta, broadcastGamma, _this2.epsilon);\n\t        } else {\n\t          return batchNormalization(input, _this2.movingMean.read(), _this2.movingVariance.read(), _this2.beta == null ? null : _this2.beta.read(), _this2.gamma == null ? null : _this2.gamma.read(), _this2.epsilon);\n\t        }\n\t      };\n\n\t      if (!training) {\n\t        return normalizeInference();\n\t      }\n\n\t      var _normalizeBatchInTrai = normalizeBatchInTraining(input, _this2.gamma.read(), _this2.beta.read(), reductionAxes, _this2.epsilon),\n\t          normedTraining = _normalizeBatchInTrai[0],\n\t          mean = _normalizeBatchInTrai[1],\n\t          variance = _normalizeBatchInTrai[2];\n\n\t      var doMovingAverage = function doMovingAverage(variable, value, momentum) {\n\t        tidy(function () {\n\t          var decay = 1 - momentum;\n\t          var origValue = variable.read();\n\t          var updateDelta = origValue.sub(value).mul(decay);\n\t          variable.write(origValue.sub(updateDelta));\n\t        });\n\t      }; // Perform updates to moving mean and moving variance for training.\n\t      // Porting Note: In PyKeras, these updates to `movingMean` and\n\t      //   `movingAverage` are done as a deferred Graph, added to the `Layer`'s\n\t      //   `update`s using the `add_update()` method. Here we do it imperatively\n\t      //   and encapsulate the updates in a function that is invoked\n\t      //   immediately.\n\n\n\t      var updateMovingMeanAndVariance = function updateMovingMeanAndVariance() {\n\t        doMovingAverage(_this2.movingMean, mean, _this2.momentum);\n\t        doMovingAverage(_this2.movingVariance, variance, _this2.momentum);\n\t      };\n\n\t      updateMovingMeanAndVariance();\n\t      return normedTraining;\n\t    });\n\t  };\n\n\t  _proto.getConfig = function getConfig() {\n\t    var config = {\n\t      axis: this.axis,\n\t      momentum: this.momentum,\n\t      epsilon: this.epsilon,\n\t      center: this.center,\n\t      scale: this.scale,\n\t      betaInitializer: serializeInitializer(this.betaInitializer),\n\t      gammaInitializer: serializeInitializer(this.gammaInitializer),\n\t      movingMeanInitializer: serializeInitializer(this.movingMeanInitializer),\n\t      movingVarianceInitializer: serializeInitializer(this.movingVarianceInitializer),\n\t      betaRegularizer: serializeRegularizer(this.betaRegularizer),\n\t      gammaRegularizer: serializeRegularizer(this.gammaRegularizer),\n\t      betaConstraint: serializeConstraint(this.betaConstraint),\n\t      gammaConstraint: serializeConstraint(this.gammaConstraint)\n\t    };\n\n\t    var baseConfig = _Layer.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return BatchNormalization;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tBatchNormalization.className = 'BatchNormalization';\n\tregisterClass(BatchNormalization);\n\tvar LayerNormalization = /*#__PURE__*/function (_Layer2) {\n\t  _inheritsLoose(LayerNormalization, _Layer2);\n\n\t  function LayerNormalization(args) {\n\t    var _this3;\n\n\t    if (args == null) {\n\t      args = {};\n\t    }\n\n\t    _this3 = _Layer2.call(this, args) || this;\n\t    _this3.axis = args.axis == null ? -1 : args.axis;\n\n\t    if (typeof _this3.axis === 'number') {\n\t      if (!Number.isInteger(_this3.axis)) {\n\t        throw new Error(\"Expected axis to be an integer, but received \" + _this3.axis);\n\t      }\n\t    } else if (Array.isArray(_this3.axis)) {\n\t      for (var _iterator2 = _createForOfIteratorHelperLoose(_this3.axis), _step2; !(_step2 = _iterator2()).done;) {\n\t        var axis = _step2.value;\n\n\t        if (!Number.isInteger(axis)) {\n\t          throw new Error(\"Expected axis to be an array of integers, \" + (\"but received \" + JSON.stringify(_this3.axis)));\n\t        }\n\t      }\n\t    } else {\n\t      throw new Error(\"Expected axis to be an integer or an array of integers, \" + (\"but received \" + JSON.stringify(_this3.axis)));\n\t    }\n\n\t    _this3.epsilon = args.epsilon == null ? 1e-3 : args.epsilon;\n\t    _this3.center = args.center == null ? true : args.center;\n\t    _this3.scale = args.scale == null ? true : args.scale;\n\t    _this3.betaInitializer = getInitializer(args.betaInitializer || 'zeros');\n\t    _this3.gammaInitializer = getInitializer(args.gammaInitializer || 'ones');\n\t    _this3.betaRegularizer = getRegularizer(args.betaRegularizer);\n\t    _this3.gammaRegularizer = getRegularizer(args.gammaRegularizer);\n\t    _this3.supportsMasking = true;\n\t    return _this3;\n\t  }\n\n\t  var _proto2 = LayerNormalization.prototype;\n\n\t  _proto2.build = function build(inputShape) {\n\t    inputShape = getExactlyOneShape(inputShape);\n\t    var nDims = inputShape.length; // Convert axis to array and resolve negatives.\n\n\t    if (typeof this.axis === 'number') {\n\t      this.axis = [this.axis];\n\t    }\n\n\t    for (var i = 0; i < this.axis.length; ++i) {\n\t      if (this.axis[i] < 0) {\n\t        this.axis[i] += nDims;\n\t      }\n\t    } // Further validate axes.\n\n\n\t    for (var _iterator3 = _createForOfIteratorHelperLoose(this.axis), _step3; !(_step3 = _iterator3()).done;) {\n\t      var axis = _step3.value;\n\n\t      if (axis < 0 || axis >= nDims) {\n\t        throw new Error(\"Invalid axis: \" + axis);\n\t      }\n\t    }\n\n\t    if (this.axis.length !== unique$1(this.axis).length) {\n\t      throw new Error(\"Found duplicate axes in: \" + this.axis);\n\t    }\n\n\t    var paramShape = this.axis.map(function (axis) {\n\t      return inputShape[axis];\n\t    });\n\t    var trainable = true;\n\n\t    if (this.scale) {\n\t      this.gamma = this.addWeight('gamma', paramShape, 'float32', this.gammaInitializer, this.gammaRegularizer, trainable);\n\t    } else {\n\t      this.gamma = null;\n\t    }\n\n\t    if (this.center) {\n\t      this.beta = this.addWeight('beta', paramShape, 'float32', this.betaInitializer, this.betaRegularizer, trainable);\n\t    } else {\n\t      this.beta = null;\n\t    }\n\n\t    this.built = true;\n\t  };\n\n\t  _proto2.call = function call(inputs, kwargs) {\n\t    var _this4 = this;\n\n\t    var input = getExactlyOneTensor(inputs);\n\t    var inputShape = input.shape;\n\t    var nDims = inputShape.length;\n\t    return tidy(function () {\n\t      var keepDims = true;\n\n\t      var _moments = moments(input, _this4.axis, keepDims),\n\t          mean = _moments.mean,\n\t          variance = _moments.variance;\n\n\t      var broadcastShape = pyListRepeat(1, nDims);\n\n\t      for (var _iterator4 = _createForOfIteratorHelperLoose(_this4.axis), _step4; !(_step4 = _iterator4()).done;) {\n\t        var dim = _step4.value;\n\t        broadcastShape[dim] = inputShape[dim];\n\t      }\n\n\t      var broadcast = function broadcast(v) {\n\t        if (v != null && v.shape.length !== nDims && _this4.axis !== [nDims - 1]) {\n\t          return v.reshape(broadcastShape);\n\t        } else {\n\t          return v;\n\t        }\n\t      };\n\n\t      var scale = broadcast(_this4.gamma.read());\n\t      var offset = broadcast(_this4.beta.read()); // TODO(https://github.com/tensorflow/tfjs/issues/2120): The tiling below\n\t      // is a workaround for the limitation of core's batchNormalization?d don't\n\t      // support broadcasting in their gradients. In addition, the tiling is\n\t      // necessary to ensure correctness on the browser CPU backend regardless\n\t      // of forward or backward computation. Remove this workaround once the\n\t      // limitation is addressed. See .\n\n\t      var momentsTiling = [];\n\t      var scaleOffsetTiling = [];\n\n\t      for (var i = 0; i < nDims; ++i) {\n\t        if (_this4.axis.indexOf(i) !== -1) {\n\t          momentsTiling.push(inputShape[i]);\n\t          scaleOffsetTiling.push(1);\n\t        } else {\n\t          momentsTiling.push(1);\n\t          scaleOffsetTiling.push(inputShape[i]);\n\t        }\n\t      }\n\n\t      mean = mean.tile(momentsTiling);\n\t      variance = variance.tile(momentsTiling);\n\t      scale = scale.tile(scaleOffsetTiling);\n\t      offset = offset.tile(scaleOffsetTiling);\n\t      return batchNormalization(input, mean, variance, offset, scale, _this4.epsilon);\n\t    });\n\t  };\n\n\t  _proto2.getConfig = function getConfig() {\n\t    var config = {\n\t      axis: this.axis,\n\t      epsilon: this.epsilon,\n\t      center: this.center,\n\t      scale: this.scale,\n\t      betaInitializer: serializeInitializer(this.betaInitializer),\n\t      gammaInitializer: serializeInitializer(this.gammaInitializer),\n\t      betaRegularizer: serializeRegularizer(this.betaRegularizer),\n\t      gammaRegularizer: serializeRegularizer(this.gammaRegularizer)\n\t    };\n\n\t    var baseConfig = _Layer2.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return LayerNormalization;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tLayerNormalization.className = 'LayerNormalization';\n\tregisterClass(LayerNormalization);\n\n\t/**\n\t * Pads the middle dimension of a 3D tensor.\n\t *\n\t * @param x Input `tf.Tensor` to be padded.\n\t * @param padding `Array` of 2 integers, how many zeros to add at the start and\n\t *   end of the middle dimension (i.e., dimension 1).\n\t * @return A padded 3D `tf.Tensor`.\n\t */\n\n\tfunction temporalPadding(x, padding) {\n\t  return tidy(function () {\n\t    if (x.rank !== 3) {\n\t      throw new ValueError(\"temporalPadding expects input tensor to be 3-D, but received a \" + (x.rank + \"-D tensor.\"));\n\t    }\n\n\t    if (padding == null) {\n\t      padding = [1, 1];\n\t    }\n\n\t    if (padding.length !== 2) {\n\t      throw new ValueError(\"temporalPadding expects input padding pattern to be a length-2 \" + (\"array, but received a length-\" + padding.length + \" array.\"));\n\t    }\n\n\t    var pattern = [[0, 0], padding, [0, 0]];\n\t    return pad(x, pattern);\n\t  });\n\t}\n\t/**\n\t * Pads the 2nd and 3rd dimensions of a 4D tensor.\n\t *\n\t * @param x Input `tf.Tensor` to be padded.\n\t * @param padding `Array` of two `Array`s, each of which is an `Array` of two\n\t *   integers. The amount of padding at the beginning and end of the 2nd and 3rd\n\t *   dimensions, respectively.\n\t * @param dataFormat 'channelsLast' (default) or 'channelsFirst'.\n\t * @return Padded 4D `tf.Tensor`.\n\t */\n\n\tfunction spatial2dPadding(x, padding, dataFormat) {\n\t  return tidy(function () {\n\t    if (x.rank !== 4) {\n\t      throw new ValueError(\"temporalPadding expects input tensor to be 4-D, but received a \" + (x.rank + \"-D tensor.\"));\n\t    }\n\n\t    if (padding == null) {\n\t      padding = [[1, 1], [1, 1]];\n\t    }\n\n\t    if (padding.length !== 2 || padding[0].length !== 2 || padding[1].length !== 2) {\n\t      throw new ValueError('spatial2dPadding expects `padding` to be an Array of two Arrays, ' + 'each of which is an Array of two integers.');\n\t    }\n\n\t    if (dataFormat == null) {\n\t      dataFormat = imageDataFormat();\n\t    }\n\n\t    if (dataFormat !== 'channelsLast' && dataFormat !== 'channelsFirst') {\n\t      throw new ValueError(\"Unknown data format: \" + dataFormat + \". \" + \"Supported data formats are 'channelsLast' and 'channelsFirst.\");\n\t    }\n\n\t    var pattern;\n\n\t    if (dataFormat === 'channelsFirst') {\n\t      pattern = [[0, 0], [0, 0], padding[0], padding[1]];\n\t    } else {\n\t      pattern = [[0, 0], padding[0], padding[1], [0, 0]];\n\t    }\n\n\t    return pad(x, pattern);\n\t  });\n\t}\n\tvar ZeroPadding2D = /*#__PURE__*/function (_Layer) {\n\t  _inheritsLoose(ZeroPadding2D, _Layer);\n\n\t  function ZeroPadding2D(args) {\n\t    var _this;\n\n\t    if (args == null) {\n\t      args = {};\n\t    }\n\n\t    _this = _Layer.call(this, args) || this;\n\t    _this.dataFormat = args.dataFormat == null ? imageDataFormat() : args.dataFormat; // TODO(cais): Maybe refactor the following logic surrounding `padding`\n\t    //   into a helper method.\n\n\t    if (args.padding == null) {\n\t      _this.padding = [[1, 1], [1, 1]];\n\t    } else if (typeof args.padding === 'number') {\n\t      _this.padding = [[args.padding, args.padding], [args.padding, args.padding]];\n\t    } else {\n\t      args.padding = args.padding;\n\n\t      if (args.padding.length !== 2) {\n\t        throw new ValueError(\"ZeroPadding2D expects padding to be a length-2 array, but \" + (\"received a length-\" + args.padding.length + \" array.\"));\n\t      }\n\n\t      var heightPadding;\n\t      var widthPadding;\n\n\t      if (typeof args.padding[0] === 'number') {\n\t        heightPadding = [args.padding[0], args.padding[0]];\n\t        widthPadding = [args.padding[1], args.padding[1]];\n\t      } else {\n\t        args.padding = args.padding;\n\n\t        if (args.padding[0].length !== 2) {\n\t          throw new ValueError(\"ZeroPadding2D expects height padding to be a length-2 array, \" + (\"but received a length-\" + args.padding[0].length + \" array.\"));\n\t        }\n\n\t        heightPadding = args.padding[0];\n\n\t        if (args.padding[1].length !== 2) {\n\t          throw new ValueError(\"ZeroPadding2D expects width padding to be a length-2 array, \" + (\"but received a length-\" + args.padding[1].length + \" array.\"));\n\t        }\n\n\t        widthPadding = args.padding[1];\n\t      }\n\n\t      _this.padding = [heightPadding, widthPadding];\n\t    }\n\n\t    _this.inputSpec = [new InputSpec({\n\t      ndim: 4\n\t    })];\n\t    return _this;\n\t  }\n\n\t  var _proto = ZeroPadding2D.prototype;\n\n\t  _proto.computeOutputShape = function computeOutputShape(inputShape) {\n\t    inputShape = getExactlyOneShape(inputShape);\n\t    var rows;\n\t    var cols;\n\n\t    if (this.dataFormat === 'channelsFirst') {\n\t      if (inputShape[2] != null && inputShape[2] >= 0) {\n\t        rows = inputShape[2] + this.padding[0][0] + this.padding[0][1];\n\t      } else {\n\t        rows = null;\n\t      }\n\n\t      if (inputShape[3] != null && inputShape[3] >= 0) {\n\t        cols = inputShape[3] + this.padding[1][0] + this.padding[1][1];\n\t      } else {\n\t        cols = null;\n\t      }\n\n\t      return [inputShape[0], inputShape[1], rows, cols];\n\t    } else {\n\t      if (inputShape[1] != null && inputShape[1] >= 0) {\n\t        rows = inputShape[1] + this.padding[0][0] + this.padding[0][1];\n\t      } else {\n\t        rows = null;\n\t      }\n\n\t      if (inputShape[2] != null && inputShape[2] >= 0) {\n\t        cols = inputShape[2] + this.padding[1][0] + this.padding[1][1];\n\t      } else {\n\t        cols = null;\n\t      }\n\n\t      return [inputShape[0], rows, cols, inputShape[3]];\n\t    }\n\t  };\n\n\t  _proto.call = function call(inputs, kwargs) {\n\t    var _this2 = this;\n\n\t    return tidy(function () {\n\t      return spatial2dPadding(getExactlyOneTensor(inputs), _this2.padding, _this2.dataFormat);\n\t    });\n\t  };\n\n\t  _proto.getConfig = function getConfig() {\n\t    var config = {\n\t      padding: this.padding,\n\t      dataFormat: this.dataFormat\n\t    };\n\n\t    var baseConfig = _Layer.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return ZeroPadding2D;\n\t}(Layer);\n\t/** @nocollapse */\n\n\tZeroPadding2D.className = 'ZeroPadding2D';\n\tregisterClass(ZeroPadding2D);\n\n\t/**\n\t * 2D pooling.\n\t * @param x\n\t * @param poolSize\n\t * @param stridesdes strides. Defaults to [1, 1].\n\t * @param padding padding. Defaults to 'valid'.\n\t * @param dataFormat data format. Defaults to 'channelsLast'.\n\t * @param poolMode Mode of pooling. Defaults to 'max'.\n\t * @returns Result of the 2D pooling.\n\t */\n\n\tfunction pool2d(x, poolSize, strides, padding, dataFormat, poolMode) {\n\t  return tidy(function () {\n\t    checkDataFormat(dataFormat);\n\t    checkPoolMode(poolMode);\n\t    checkPaddingMode(padding);\n\n\t    if (strides == null) {\n\t      strides = [1, 1];\n\t    }\n\n\t    if (padding == null) {\n\t      padding = 'valid';\n\t    }\n\n\t    if (dataFormat == null) {\n\t      dataFormat = imageDataFormat();\n\t    }\n\n\t    if (poolMode == null) {\n\t      poolMode = 'max';\n\t    } // TODO(cais): Remove the preprocessing step once deeplearn.js supports\n\t    // dataFormat as an input argument.\n\n\n\t    x = preprocessConv2DInput(x, dataFormat); // x is NHWC after preprocessing.\n\n\t    var y;\n\t    var paddingString = padding === 'same' ? 'same' : 'valid';\n\n\t    if (poolMode === 'max') {\n\t      // TODO(cais): Rank check?\n\t      y = maxPool(x, poolSize, strides, paddingString);\n\t    } else {\n\t      // 'avg'\n\t      // TODO(cais): Check the dtype and rank of x and give clear error message\n\t      //   if those are incorrect.\n\t      y = avgPool( // TODO(cais): Rank check?\n\t      x, poolSize, strides, paddingString);\n\t    }\n\n\t    if (dataFormat === 'channelsFirst') {\n\t      y = transpose(y, [0, 3, 1, 2]); // NHWC -> NCHW.\n\t    }\n\n\t    return y;\n\t  });\n\t}\n\t/**\n\t * 3D pooling.\n\t * @param x\n\t * @param poolSize. Default to [1, 1, 1].\n\t * @param strides strides. Defaults to [1, 1, 1].\n\t * @param padding padding. Defaults to 'valid'.\n\t * @param dataFormat data format. Defaults to 'channelsLast'.\n\t * @param poolMode Mode of pooling. Defaults to 'max'.\n\t * @returns Result of the 3D pooling.\n\t */\n\n\tfunction pool3d(x, poolSize, strides, padding, dataFormat, poolMode) {\n\t  return tidy(function () {\n\t    checkDataFormat(dataFormat);\n\t    checkPoolMode(poolMode);\n\t    checkPaddingMode(padding);\n\n\t    if (strides == null) {\n\t      strides = [1, 1, 1];\n\t    }\n\n\t    if (padding == null) {\n\t      padding = 'valid';\n\t    }\n\n\t    if (dataFormat == null) {\n\t      dataFormat = imageDataFormat();\n\t    }\n\n\t    if (poolMode == null) {\n\t      poolMode = 'max';\n\t    } // x is NDHWC after preprocessing.\n\n\n\t    x = preprocessConv3DInput(x, dataFormat);\n\t    var y;\n\t    var paddingString = padding === 'same' ? 'same' : 'valid';\n\n\t    if (poolMode === 'max') {\n\t      y = maxPool3d(x, poolSize, strides, paddingString);\n\t    } else {\n\t      // 'avg'\n\t      y = avgPool3d(x, poolSize, strides, paddingString);\n\t    }\n\n\t    if (dataFormat === 'channelsFirst') {\n\t      y = transpose(y, [0, 4, 1, 2, 3]); // NDHWC -> NCDHW.\n\t    }\n\n\t    return y;\n\t  });\n\t}\n\t/**\n\t * Abstract class for different pooling 1D layers.\n\t */\n\n\tvar Pooling1D = /*#__PURE__*/function (_Layer) {\n\t  _inheritsLoose(Pooling1D, _Layer);\n\n\t  /**\n\t   *\n\t   * @param args Parameters for the Pooling layer.\n\t   *\n\t   * config.poolSize defaults to 2.\n\t   */\n\t  function Pooling1D(args) {\n\t    var _this;\n\n\t    if (args.poolSize == null) {\n\t      args.poolSize = 2;\n\t    }\n\n\t    _this = _Layer.call(this, args) || this;\n\n\t    if (typeof args.poolSize === 'number') {\n\t      _this.poolSize = [args.poolSize];\n\t    } else if (Array.isArray(args.poolSize) && args.poolSize.length === 1 && typeof args.poolSize[0] === 'number') {\n\t      _this.poolSize = args.poolSize;\n\t    } else {\n\t      throw new ValueError(\"poolSize for 1D convolutional layer must be a number or an \" + \"Array of a single number, but received \" + (\"\" + JSON.stringify(args.poolSize)));\n\t    }\n\n\t    assertPositiveInteger(_this.poolSize, 'poolSize');\n\n\t    if (args.strides == null) {\n\t      _this.strides = _this.poolSize;\n\t    } else {\n\t      if (typeof args.strides === 'number') {\n\t        _this.strides = [args.strides];\n\t      } else if (Array.isArray(args.strides) && args.strides.length === 1 && typeof args.strides[0] === 'number') {\n\t        _this.strides = args.strides;\n\t      } else {\n\t        throw new ValueError(\"strides for 1D convolutional layer must be a number or an \" + \"Array of a single number, but received \" + (\"\" + JSON.stringify(args.strides)));\n\t      }\n\t    }\n\n\t    assertPositiveInteger(_this.strides, 'strides');\n\t    _this.padding = args.padding == null ? 'valid' : args.padding;\n\t    checkPaddingMode(_this.padding);\n\t    _this.inputSpec = [new InputSpec({\n\t      ndim: 3\n\t    })];\n\t    return _this;\n\t  }\n\n\t  var _proto = Pooling1D.prototype;\n\n\t  _proto.computeOutputShape = function computeOutputShape(inputShape) {\n\t    inputShape = getExactlyOneShape(inputShape);\n\t    var length = convOutputLength(inputShape[1], this.poolSize[0], this.padding, this.strides[0]);\n\t    return [inputShape[0], length, inputShape[2]];\n\t  };\n\n\t  _proto.call = function call(inputs, kwargs) {\n\t    var _this2 = this;\n\n\t    return tidy(function () {\n\t      _this2.invokeCallHook(inputs, kwargs); // Add dummy last dimension.\n\n\n\t      inputs = expandDims$1(getExactlyOneTensor(inputs), 2);\n\n\t      var output = _this2.poolingFunction(getExactlyOneTensor(inputs), [_this2.poolSize[0], 1], [_this2.strides[0], 1], _this2.padding, 'channelsLast'); // Remove dummy last dimension.\n\n\n\t      return squeeze(output, [2]);\n\t    });\n\t  };\n\n\t  _proto.getConfig = function getConfig() {\n\t    var config = {\n\t      poolSize: this.poolSize,\n\t      padding: this.padding,\n\t      strides: this.strides\n\t    };\n\n\t    var baseConfig = _Layer.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return Pooling1D;\n\t}(Layer);\n\tvar MaxPooling1D = /*#__PURE__*/function (_Pooling1D) {\n\t  _inheritsLoose(MaxPooling1D, _Pooling1D);\n\n\t  function MaxPooling1D(args) {\n\t    return _Pooling1D.call(this, args) || this;\n\t  }\n\n\t  var _proto2 = MaxPooling1D.prototype;\n\n\t  _proto2.poolingFunction = function poolingFunction(inputs, poolSize, strides, padding, dataFormat) {\n\t    checkDataFormat(dataFormat);\n\t    checkPaddingMode(padding);\n\t    return pool2d(inputs, poolSize, strides, padding, dataFormat, 'max');\n\t  };\n\n\t  return MaxPooling1D;\n\t}(Pooling1D);\n\t/** @nocollapse */\n\n\tMaxPooling1D.className = 'MaxPooling1D';\n\tregisterClass(MaxPooling1D);\n\tvar AveragePooling1D = /*#__PURE__*/function (_Pooling1D2) {\n\t  _inheritsLoose(AveragePooling1D, _Pooling1D2);\n\n\t  function AveragePooling1D(args) {\n\t    return _Pooling1D2.call(this, args) || this;\n\t  }\n\n\t  var _proto3 = AveragePooling1D.prototype;\n\n\t  _proto3.poolingFunction = function poolingFunction(inputs, poolSize, strides, padding, dataFormat) {\n\t    checkDataFormat(dataFormat);\n\t    checkPaddingMode(padding);\n\t    return pool2d(inputs, poolSize, strides, padding, dataFormat, 'avg');\n\t  };\n\n\t  return AveragePooling1D;\n\t}(Pooling1D);\n\t/** @nocollapse */\n\n\tAveragePooling1D.className = 'AveragePooling1D';\n\tregisterClass(AveragePooling1D);\n\t/**\n\t * Abstract class for different pooling 2D layers.\n\t */\n\n\tvar Pooling2D = /*#__PURE__*/function (_Layer2) {\n\t  _inheritsLoose(Pooling2D, _Layer2);\n\n\t  function Pooling2D(args) {\n\t    var _this3;\n\n\t    if (args.poolSize == null) {\n\t      args.poolSize = [2, 2];\n\t    }\n\n\t    _this3 = _Layer2.call(this, args) || this;\n\t    _this3.poolSize = Array.isArray(args.poolSize) ? args.poolSize : [args.poolSize, args.poolSize];\n\n\t    if (args.strides == null) {\n\t      _this3.strides = _this3.poolSize;\n\t    } else if (Array.isArray(args.strides)) {\n\t      if (args.strides.length !== 2) {\n\t        throw new ValueError(\"If the strides property of a 2D pooling layer is an Array, \" + \"it is expected to have a length of 2, but received length \" + (args.strides.length + \".\"));\n\t      }\n\n\t      _this3.strides = args.strides;\n\t    } else {\n\t      // `config.strides` is a number.\n\t      _this3.strides = [args.strides, args.strides];\n\t    }\n\n\t    assertPositiveInteger(_this3.poolSize, 'poolSize');\n\t    assertPositiveInteger(_this3.strides, 'strides');\n\t    _this3.padding = args.padding == null ? 'valid' : args.padding;\n\t    _this3.dataFormat = args.dataFormat == null ? 'channelsLast' : args.dataFormat;\n\t    checkDataFormat(_this3.dataFormat);\n\t    checkPaddingMode(_this3.padding);\n\t    _this3.inputSpec = [new InputSpec({\n\t      ndim: 4\n\t    })];\n\t    return _this3;\n\t  }\n\n\t  var _proto4 = Pooling2D.prototype;\n\n\t  _proto4.computeOutputShape = function computeOutputShape(inputShape) {\n\t    inputShape = getExactlyOneShape(inputShape);\n\t    var rows = this.dataFormat === 'channelsFirst' ? inputShape[2] : inputShape[1];\n\t    var cols = this.dataFormat === 'channelsFirst' ? inputShape[3] : inputShape[2];\n\t    rows = convOutputLength(rows, this.poolSize[0], this.padding, this.strides[0]);\n\t    cols = convOutputLength(cols, this.poolSize[1], this.padding, this.strides[1]);\n\n\t    if (this.dataFormat === 'channelsFirst') {\n\t      return [inputShape[0], inputShape[1], rows, cols];\n\t    } else {\n\t      return [inputShape[0], rows, cols, inputShape[3]];\n\t    }\n\t  };\n\n\t  _proto4.call = function call(inputs, kwargs) {\n\t    var _this4 = this;\n\n\t    return tidy(function () {\n\t      _this4.invokeCallHook(inputs, kwargs);\n\n\t      return _this4.poolingFunction(getExactlyOneTensor(inputs), _this4.poolSize, _this4.strides, _this4.padding, _this4.dataFormat);\n\t    });\n\t  };\n\n\t  _proto4.getConfig = function getConfig() {\n\t    var config = {\n\t      poolSize: this.poolSize,\n\t      padding: this.padding,\n\t      strides: this.strides,\n\t      dataFormat: this.dataFormat\n\t    };\n\n\t    var baseConfig = _Layer2.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return Pooling2D;\n\t}(Layer);\n\tvar MaxPooling2D = /*#__PURE__*/function (_Pooling2D) {\n\t  _inheritsLoose(MaxPooling2D, _Pooling2D);\n\n\t  function MaxPooling2D(args) {\n\t    return _Pooling2D.call(this, args) || this;\n\t  }\n\n\t  var _proto5 = MaxPooling2D.prototype;\n\n\t  _proto5.poolingFunction = function poolingFunction(inputs, poolSize, strides, padding, dataFormat) {\n\t    checkDataFormat(dataFormat);\n\t    checkPaddingMode(padding);\n\t    return pool2d(inputs, poolSize, strides, padding, dataFormat, 'max');\n\t  };\n\n\t  return MaxPooling2D;\n\t}(Pooling2D);\n\t/** @nocollapse */\n\n\tMaxPooling2D.className = 'MaxPooling2D';\n\tregisterClass(MaxPooling2D);\n\tvar AveragePooling2D = /*#__PURE__*/function (_Pooling2D2) {\n\t  _inheritsLoose(AveragePooling2D, _Pooling2D2);\n\n\t  function AveragePooling2D(args) {\n\t    return _Pooling2D2.call(this, args) || this;\n\t  }\n\n\t  var _proto6 = AveragePooling2D.prototype;\n\n\t  _proto6.poolingFunction = function poolingFunction(inputs, poolSize, strides, padding, dataFormat) {\n\t    checkDataFormat(dataFormat);\n\t    checkPaddingMode(padding);\n\t    return pool2d(inputs, poolSize, strides, padding, dataFormat, 'avg');\n\t  };\n\n\t  return AveragePooling2D;\n\t}(Pooling2D);\n\t/** @nocollapse */\n\n\tAveragePooling2D.className = 'AveragePooling2D';\n\tregisterClass(AveragePooling2D);\n\t/**\n\t * Abstract class for different pooling 3D layers.\n\t */\n\n\tvar Pooling3D = /*#__PURE__*/function (_Layer3) {\n\t  _inheritsLoose(Pooling3D, _Layer3);\n\n\t  function Pooling3D(args) {\n\t    var _this5;\n\n\t    if (args.poolSize == null) {\n\t      args.poolSize = [2, 2, 2];\n\t    }\n\n\t    _this5 = _Layer3.call(this, args) || this;\n\t    _this5.poolSize = Array.isArray(args.poolSize) ? args.poolSize : [args.poolSize, args.poolSize, args.poolSize];\n\n\t    if (args.strides == null) {\n\t      _this5.strides = _this5.poolSize;\n\t    } else if (Array.isArray(args.strides)) {\n\t      if (args.strides.length !== 3) {\n\t        throw new ValueError(\"If the strides property of a 3D pooling layer is an Array, \" + \"it is expected to have a length of 3, but received length \" + (args.strides.length + \".\"));\n\t      }\n\n\t      _this5.strides = args.strides;\n\t    } else {\n\t      // `config.strides` is a number.\n\t      _this5.strides = [args.strides, args.strides, args.strides];\n\t    }\n\n\t    assertPositiveInteger(_this5.poolSize, 'poolSize');\n\t    assertPositiveInteger(_this5.strides, 'strides');\n\t    _this5.padding = args.padding == null ? 'valid' : args.padding;\n\t    _this5.dataFormat = args.dataFormat == null ? 'channelsLast' : args.dataFormat;\n\t    checkDataFormat(_this5.dataFormat);\n\t    checkPaddingMode(_this5.padding);\n\t    _this5.inputSpec = [new InputSpec({\n\t      ndim: 5\n\t    })];\n\t    return _this5;\n\t  }\n\n\t  var _proto7 = Pooling3D.prototype;\n\n\t  _proto7.computeOutputShape = function computeOutputShape(inputShape) {\n\t    inputShape = getExactlyOneShape(inputShape);\n\t    var depths = this.dataFormat === 'channelsFirst' ? inputShape[2] : inputShape[1];\n\t    var rows = this.dataFormat === 'channelsFirst' ? inputShape[3] : inputShape[2];\n\t    var cols = this.dataFormat === 'channelsFirst' ? inputShape[4] : inputShape[3];\n\t    depths = convOutputLength(depths, this.poolSize[0], this.padding, this.strides[0]);\n\t    rows = convOutputLength(rows, this.poolSize[1], this.padding, this.strides[1]);\n\t    cols = convOutputLength(cols, this.poolSize[2], this.padding, this.strides[2]);\n\n\t    if (this.dataFormat === 'channelsFirst') {\n\t      return [inputShape[0], inputShape[1], depths, rows, cols];\n\t    } else {\n\t      return [inputShape[0], depths, rows, cols, inputShape[4]];\n\t    }\n\t  };\n\n\t  _proto7.call = function call(inputs, kwargs) {\n\t    var _this6 = this;\n\n\t    return tidy(function () {\n\t      _this6.invokeCallHook(inputs, kwargs);\n\n\t      return _this6.poolingFunction(getExactlyOneTensor(inputs), _this6.poolSize, _this6.strides, _this6.padding, _this6.dataFormat);\n\t    });\n\t  };\n\n\t  _proto7.getConfig = function getConfig() {\n\t    var config = {\n\t      poolSize: this.poolSize,\n\t      padding: this.padding,\n\t      strides: this.strides,\n\t      dataFormat: this.dataFormat\n\t    };\n\n\t    var baseConfig = _Layer3.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return Pooling3D;\n\t}(Layer);\n\tvar MaxPooling3D = /*#__PURE__*/function (_Pooling3D) {\n\t  _inheritsLoose(MaxPooling3D, _Pooling3D);\n\n\t  function MaxPooling3D(args) {\n\t    return _Pooling3D.call(this, args) || this;\n\t  }\n\n\t  var _proto8 = MaxPooling3D.prototype;\n\n\t  _proto8.poolingFunction = function poolingFunction(inputs, poolSize, strides, padding, dataFormat) {\n\t    checkDataFormat(dataFormat);\n\t    checkPaddingMode(padding);\n\t    return pool3d(inputs, poolSize, strides, padding, dataFormat, 'max');\n\t  };\n\n\t  return MaxPooling3D;\n\t}(Pooling3D);\n\t/** @nocollapse */\n\n\tMaxPooling3D.className = 'MaxPooling3D';\n\tregisterClass(MaxPooling3D);\n\tvar AveragePooling3D = /*#__PURE__*/function (_Pooling3D2) {\n\t  _inheritsLoose(AveragePooling3D, _Pooling3D2);\n\n\t  function AveragePooling3D(args) {\n\t    return _Pooling3D2.call(this, args) || this;\n\t  }\n\n\t  var _proto9 = AveragePooling3D.prototype;\n\n\t  _proto9.poolingFunction = function poolingFunction(inputs, poolSize, strides, padding, dataFormat) {\n\t    checkDataFormat(dataFormat);\n\t    checkPaddingMode(padding);\n\t    return pool3d(inputs, poolSize, strides, padding, dataFormat, 'avg');\n\t  };\n\n\t  return AveragePooling3D;\n\t}(Pooling3D);\n\t/** @nocollapse */\n\n\tAveragePooling3D.className = 'AveragePooling3D';\n\tregisterClass(AveragePooling3D);\n\t/**\n\t * Abstract class for different global pooling 1D layers.\n\t */\n\n\tvar GlobalPooling1D = /*#__PURE__*/function (_Layer4) {\n\t  _inheritsLoose(GlobalPooling1D, _Layer4);\n\n\t  function GlobalPooling1D(args) {\n\t    var _this7;\n\n\t    _this7 = _Layer4.call(this, args) || this;\n\t    _this7.inputSpec = [new InputSpec({\n\t      ndim: 3\n\t    })];\n\t    return _this7;\n\t  }\n\n\t  var _proto10 = GlobalPooling1D.prototype;\n\n\t  _proto10.computeOutputShape = function computeOutputShape(inputShape) {\n\t    return [inputShape[0], inputShape[2]];\n\t  };\n\n\t  _proto10.call = function call(inputs, kwargs) {\n\t    throw new NotImplementedError();\n\t  };\n\n\t  return GlobalPooling1D;\n\t}(Layer);\n\tvar GlobalAveragePooling1D = /*#__PURE__*/function (_GlobalPooling1D) {\n\t  _inheritsLoose(GlobalAveragePooling1D, _GlobalPooling1D);\n\n\t  function GlobalAveragePooling1D(args) {\n\t    return _GlobalPooling1D.call(this, args || {}) || this;\n\t  }\n\n\t  var _proto11 = GlobalAveragePooling1D.prototype;\n\n\t  _proto11.call = function call(inputs, kwargs) {\n\t    return tidy(function () {\n\t      var input = getExactlyOneTensor(inputs);\n\t      return mean(input, 1);\n\t    });\n\t  };\n\n\t  return GlobalAveragePooling1D;\n\t}(GlobalPooling1D);\n\t/** @nocollapse */\n\n\tGlobalAveragePooling1D.className = 'GlobalAveragePooling1D';\n\tregisterClass(GlobalAveragePooling1D);\n\tvar GlobalMaxPooling1D = /*#__PURE__*/function (_GlobalPooling1D2) {\n\t  _inheritsLoose(GlobalMaxPooling1D, _GlobalPooling1D2);\n\n\t  function GlobalMaxPooling1D(args) {\n\t    return _GlobalPooling1D2.call(this, args || {}) || this;\n\t  }\n\n\t  var _proto12 = GlobalMaxPooling1D.prototype;\n\n\t  _proto12.call = function call(inputs, kwargs) {\n\t    return tidy(function () {\n\t      var input = getExactlyOneTensor(inputs);\n\t      return max$4(input, 1);\n\t    });\n\t  };\n\n\t  return GlobalMaxPooling1D;\n\t}(GlobalPooling1D);\n\t/** @nocollapse */\n\n\tGlobalMaxPooling1D.className = 'GlobalMaxPooling1D';\n\tregisterClass(GlobalMaxPooling1D);\n\t/**\n\t * Abstract class for different global pooling 2D layers.\n\t */\n\n\tvar GlobalPooling2D = /*#__PURE__*/function (_Layer5) {\n\t  _inheritsLoose(GlobalPooling2D, _Layer5);\n\n\t  function GlobalPooling2D(args) {\n\t    var _this8;\n\n\t    _this8 = _Layer5.call(this, args) || this;\n\t    _this8.dataFormat = args.dataFormat == null ? 'channelsLast' : args.dataFormat;\n\t    checkDataFormat(_this8.dataFormat);\n\t    _this8.inputSpec = [new InputSpec({\n\t      ndim: 4\n\t    })];\n\t    return _this8;\n\t  }\n\n\t  var _proto13 = GlobalPooling2D.prototype;\n\n\t  _proto13.computeOutputShape = function computeOutputShape(inputShape) {\n\t    inputShape = inputShape;\n\n\t    if (this.dataFormat === 'channelsLast') {\n\t      return [inputShape[0], inputShape[3]];\n\t    } else {\n\t      return [inputShape[0], inputShape[1]];\n\t    }\n\t  };\n\n\t  _proto13.call = function call(inputs, kwargs) {\n\t    throw new NotImplementedError();\n\t  };\n\n\t  _proto13.getConfig = function getConfig() {\n\t    var config = {\n\t      dataFormat: this.dataFormat\n\t    };\n\n\t    var baseConfig = _Layer5.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  return GlobalPooling2D;\n\t}(Layer);\n\tvar GlobalAveragePooling2D = /*#__PURE__*/function (_GlobalPooling2D) {\n\t  _inheritsLoose(GlobalAveragePooling2D, _GlobalPooling2D);\n\n\t  function GlobalAveragePooling2D() {\n\t    return _GlobalPooling2D.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto14 = GlobalAveragePooling2D.prototype;\n\n\t  _proto14.call = function call(inputs, kwargs) {\n\t    var _this9 = this;\n\n\t    return tidy(function () {\n\t      var input = getExactlyOneTensor(inputs);\n\n\t      if (_this9.dataFormat === 'channelsLast') {\n\t        return mean(input, [1, 2]);\n\t      } else {\n\t        return mean(input, [2, 3]);\n\t      }\n\t    });\n\t  };\n\n\t  return GlobalAveragePooling2D;\n\t}(GlobalPooling2D);\n\t/** @nocollapse */\n\n\tGlobalAveragePooling2D.className = 'GlobalAveragePooling2D';\n\tregisterClass(GlobalAveragePooling2D);\n\tvar GlobalMaxPooling2D = /*#__PURE__*/function (_GlobalPooling2D2) {\n\t  _inheritsLoose(GlobalMaxPooling2D, _GlobalPooling2D2);\n\n\t  function GlobalMaxPooling2D() {\n\t    return _GlobalPooling2D2.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto15 = GlobalMaxPooling2D.prototype;\n\n\t  _proto15.call = function call(inputs, kwargs) {\n\t    var _this10 = this;\n\n\t    return tidy(function () {\n\t      var input = getExactlyOneTensor(inputs);\n\n\t      if (_this10.dataFormat === 'channelsLast') {\n\t        return max$4(input, [1, 2]);\n\t      } else {\n\t        return max$4(input, [2, 3]);\n\t      }\n\t    });\n\t  };\n\n\t  return GlobalMaxPooling2D;\n\t}(GlobalPooling2D);\n\t/** @nocollapse */\n\n\tGlobalMaxPooling2D.className = 'GlobalMaxPooling2D';\n\tregisterClass(GlobalMaxPooling2D);\n\n\t/**\n\t * Abstract wrapper base class.\n\t *\n\t * Wrappers take another layer and augment it in various ways.\n\t * Do not use this class as a layer, it is only an abstract base class.\n\t * Two usable wrappers are the `TimeDistributed` and `Bidirectional` wrappers.\n\t */\n\n\tvar Wrapper = /*#__PURE__*/function (_Layer) {\n\t  _inheritsLoose(Wrapper, _Layer);\n\n\t  function Wrapper(args) {\n\t    var _this;\n\n\t    // Porting Note: In PyKeras, `self.layer` is set prior to the calling\n\t    //   `super()`. But we can't do that here due to TypeScript's restriction.\n\t    //   See: https://github.com/Microsoft/TypeScript/issues/8277\n\t    //   As a result, we have to add checks in `get trainable()` and\n\t    //   `set trainable()` below in order to prevent using `this.layer` when\n\t    //   its value is `undefined`. The super constructor does use the getter\n\t    //   and the setter of `this.layer`.\n\t    _this = _Layer.call(this, args) || this;\n\t    _this.layer = args.layer;\n\t    return _this;\n\t  }\n\n\t  var _proto = Wrapper.prototype;\n\n\t  _proto.build = function build(inputShape) {\n\t    this.built = true;\n\t  } // TODO(cais): Implement activityRegularizer getter.\n\t  ;\n\n\t  // TODO(cais): Implement getLossesFor().\n\t  _proto.getWeights = function getWeights() {\n\t    return this.layer.getWeights();\n\t  };\n\n\t  _proto.setWeights = function setWeights(weights) {\n\t    this.layer.setWeights(weights);\n\t  };\n\n\t  _proto.getConfig = function getConfig() {\n\t    var config = {\n\t      'layer': {\n\t        'className': this.layer.getClassName(),\n\t        'config': this.layer.getConfig()\n\t      }\n\t    };\n\n\t    var baseConfig = _Layer.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  };\n\n\t  _proto.setFastWeightInitDuringBuild = function setFastWeightInitDuringBuild(value) {\n\t    _Layer.prototype.setFastWeightInitDuringBuild.call(this, value);\n\n\t    if (this.layer != null) {\n\t      this.layer.setFastWeightInitDuringBuild(value);\n\t    }\n\t  }\n\t  /** @nocollapse */\n\t  ;\n\n\t  Wrapper.fromConfig = function fromConfig(cls, config, customObjects) {\n\t    if (customObjects === void 0) {\n\t      customObjects = {};\n\t    }\n\n\t    var layerConfig = config['layer'];\n\t    var layer = deserialize$1(layerConfig, customObjects);\n\t    delete config['layer'];\n\t    var newConfig = {\n\t      layer: layer\n\t    };\n\t    Object.assign(newConfig, config);\n\t    return new cls(newConfig);\n\t  };\n\n\t  _createClass(Wrapper, [{\n\t    key: \"trainable\",\n\t    get: function get() {\n\t      // Porting Note: the check of `this.layer` here is necessary due to the\n\t      //   way the `constructor` of this class is written (see Porting Note\n\t      //   above).\n\t      if (this.layer != null) {\n\t        return this.layer.trainable;\n\t      } else {\n\t        return false;\n\t      }\n\t    },\n\t    set: function set(value) {\n\t      // Porting Note: the check of `this.layer` here is necessary due to the\n\t      //   way the `constructor` of this class is written (see Porting Note\n\t      //   above).\n\t      if (this.layer != null) {\n\t        this.layer.trainable = value;\n\t      }\n\t    }\n\t  }, {\n\t    key: \"trainableWeights\",\n\t    get: function get() {\n\t      return this.layer.trainableWeights;\n\t    } // TODO(cais): Implement setter for trainableWeights.\n\n\t  }, {\n\t    key: \"nonTrainableWeights\",\n\t    get: function get() {\n\t      return this.layer.nonTrainableWeights;\n\t    } // TODO(cais): Implement setter for nonTrainableWeights.\n\n\t  }, {\n\t    key: \"updates\",\n\t    get: function get() {\n\t      // tslint:disable-next-line:no-any\n\t      return this.layer._updates;\n\t    } // TODO(cais): Implement getUpdatesFor().\n\n\t  }, {\n\t    key: \"losses\",\n\t    get: function get() {\n\t      return this.layer.losses;\n\t    }\n\t  }]);\n\n\t  return Wrapper;\n\t}(Layer);\n\tvar TimeDistributed = /*#__PURE__*/function (_Wrapper) {\n\t  _inheritsLoose(TimeDistributed, _Wrapper);\n\n\t  function TimeDistributed(args) {\n\t    var _this2;\n\n\t    _this2 = _Wrapper.call(this, args) || this;\n\t    _this2.supportsMasking = true;\n\t    return _this2;\n\t  }\n\n\t  var _proto2 = TimeDistributed.prototype;\n\n\t  _proto2.build = function build(inputShape) {\n\t    inputShape = getExactlyOneShape(inputShape);\n\n\t    if (inputShape.length < 3) {\n\t      throw new ValueError(\"TimeDistributed layer expects an input shape >= 3D, but received \" + (\"input shape \" + JSON.stringify(inputShape)));\n\t    }\n\n\t    this.inputSpec = [{\n\t      shape: inputShape\n\t    }];\n\t    var childInputShape = [inputShape[0]].concat(inputShape.slice(2));\n\n\t    if (!this.layer.built) {\n\t      this.layer.build(childInputShape);\n\t      this.layer.built = true;\n\t    }\n\n\t    _Wrapper.prototype.build.call(this, inputShape);\n\t  };\n\n\t  _proto2.computeOutputShape = function computeOutputShape(inputShape) {\n\t    inputShape = getExactlyOneShape(inputShape);\n\t    var childInputShape = [inputShape[0]].concat(inputShape.slice(2));\n\t    var childOutputShape = this.layer.computeOutputShape(childInputShape);\n\t    var timesteps = inputShape[1];\n\t    return [childOutputShape[0], timesteps].concat(childOutputShape.slice(1));\n\t  };\n\n\t  _proto2.call = function call(inputs, kwargs) {\n\t    var _this3 = this;\n\n\t    return tidy(function () {\n\t      // TODO(cais): Add 'training' and 'useLearningPhase' to kwargs.\n\t      inputs = getExactlyOneTensor(inputs); // Porting Note: In tfjs-layers, `inputs` are always concrete tensor\n\t      // values. Hence the inputs can't have an undetermined first (batch)\n\t      // dimension, which is why we always use the K.rnn approach here.\n\n\t      var step = function step(inputs, states) {\n\t        // TODO(cais): Add useLearningPhase.\n\t        // NOTE(cais): `layer.call` may return a length-1 array of Tensor in\n\t        //   some cases (e.g., `layer` is a `Sequential` instance), which is\n\t        //   why `getExactlyOneTensor` is used below.\n\t        var output = getExactlyOneTensor(_this3.layer.call(inputs, kwargs));\n\t        return [output, []];\n\t      };\n\n\t      var rnnOutputs = rnn(step, inputs, [], false\n\t      /* goBackwards */\n\t      , null\n\t      /* mask */\n\t      , null\n\t      /* constants */\n\t      , false\n\t      /* unroll */\n\t      , true\n\t      /* needPerStepOutputs */\n\t      );\n\t      var y = rnnOutputs[1]; // TODO(cais): Add activity regularization.\n\t      // TODO(cais): Add useLearningPhase.\n\n\t      return y;\n\t    });\n\t  };\n\n\t  return TimeDistributed;\n\t}(Wrapper);\n\t/** @nocollapse */\n\n\tTimeDistributed.className = 'TimeDistributed';\n\tregisterClass(TimeDistributed);\n\tfunction checkBidirectionalMergeMode(value) {\n\t  checkStringTypeUnionValue(VALID_BIDIRECTIONAL_MERGE_MODES, 'BidirectionalMergeMode', value);\n\t}\n\tvar DEFAULT_BIDIRECTIONAL_MERGE_MODE = 'concat';\n\tvar Bidirectional = /*#__PURE__*/function (_Wrapper2) {\n\t  _inheritsLoose(Bidirectional, _Wrapper2);\n\n\t  function Bidirectional(args) {\n\t    var _this4;\n\n\t    _this4 = _Wrapper2.call(this, args) || this; // Note: When creating `this.forwardLayer`, the original Layer object\n\t    //   (`config.layer`) ought to be cloned. This is why we call\n\t    //   `getConfig()` followed by `deserialize()`. Without this cloning,\n\t    //   the layer names saved during serialization will incorrectly contain\n\t    //   the 'forward_' prefix. In Python Keras, this is done using\n\t    //   `copy.copy` (shallow copy), which does not have a simple equivalent\n\t    //   in JavaScript. JavaScript's `Object.assign()` does not copy\n\t    //   methods.\n\n\t    var layerConfig = args.layer.getConfig();\n\t    var forwDict = {};\n\t    forwDict['className'] = args.layer.getClassName();\n\t    forwDict['config'] = layerConfig;\n\t    _this4.forwardLayer = deserialize$1(forwDict);\n\t    layerConfig['goBackwards'] = layerConfig['goBackwards'] === true ? false : true;\n\t    var backDict = {};\n\t    backDict['className'] = args.layer.getClassName();\n\t    backDict['config'] = layerConfig;\n\t    _this4.backwardLayer = deserialize$1(backDict);\n\t    _this4.forwardLayer.name = 'forward_' + _this4.forwardLayer.name;\n\t    _this4.backwardLayer.name = 'backward_' + _this4.backwardLayer.name;\n\t    _this4.mergeMode = args.mergeMode === undefined ? DEFAULT_BIDIRECTIONAL_MERGE_MODE : args.mergeMode;\n\t    checkBidirectionalMergeMode(_this4.mergeMode);\n\n\t    if (args.weights) {\n\t      throw new NotImplementedError('weights support is not implemented for Bidirectional layer yet.');\n\t    }\n\n\t    _this4._stateful = args.layer.stateful;\n\t    _this4.returnSequences = args.layer.returnSequences;\n\t    _this4.returnState = args.layer.returnState;\n\t    _this4.supportsMasking = true;\n\t    _this4._trainable = true;\n\t    _this4.inputSpec = args.layer.inputSpec;\n\t    _this4.numConstants = null;\n\t    return _this4;\n\t  }\n\n\t  var _proto3 = Bidirectional.prototype;\n\n\t  _proto3.getWeights = function getWeights() {\n\t    return this.forwardLayer.getWeights().concat(this.backwardLayer.getWeights());\n\t  };\n\n\t  _proto3.setWeights = function setWeights(weights) {\n\t    var numWeights = weights.length;\n\t    var numeightsOver2 = Math.floor(numWeights / 2);\n\t    this.forwardLayer.setWeights(weights.slice(0, numeightsOver2));\n\t    this.backwardLayer.setWeights(weights.slice(numeightsOver2));\n\t  };\n\n\t  _proto3.computeOutputShape = function computeOutputShape(inputShape) {\n\t    var layerShapes = this.forwardLayer.computeOutputShape(inputShape);\n\n\t    if (!(Array.isArray(layerShapes) && Array.isArray(layerShapes[0]))) {\n\t      layerShapes = [layerShapes];\n\t    }\n\n\t    layerShapes = layerShapes;\n\t    var outputShape;\n\t    var outputShapes;\n\t    var stateShape;\n\n\t    if (this.returnState) {\n\t      stateShape = layerShapes.slice(1);\n\t      outputShape = layerShapes[0];\n\t    } else {\n\t      outputShape = layerShapes[0];\n\t    }\n\n\t    outputShape = outputShape;\n\n\t    if (this.mergeMode === 'concat') {\n\t      outputShape[outputShape.length - 1] *= 2;\n\t      outputShapes = [outputShape];\n\t    } else if (this.mergeMode == null) {\n\t      outputShapes = [outputShape, outputShape.slice()];\n\t    } else {\n\t      outputShapes = [outputShape];\n\t    }\n\n\t    if (this.returnState) {\n\t      if (this.mergeMode == null) {\n\t        return outputShapes.concat(stateShape).concat(stateShape.slice());\n\t      }\n\n\t      return [outputShape].concat(stateShape).concat(stateShape.slice());\n\t    }\n\n\t    return singletonOrArray(outputShapes);\n\t  };\n\n\t  _proto3.apply = function apply(inputs, kwargs) {\n\t    var initialState = kwargs == null ? null : kwargs['initialState'];\n\t    var constants = kwargs == null ? null : kwargs['constants'];\n\n\t    if (kwargs == null) {\n\t      kwargs = {};\n\t    }\n\n\t    var standardized = standardizeArgs(inputs, initialState, constants, this.numConstants);\n\t    inputs = standardized.inputs;\n\t    initialState = standardized.initialState;\n\t    constants = standardized.constants;\n\n\t    if (Array.isArray(inputs)) {\n\t      initialState = inputs.slice(1);\n\t      inputs = inputs[0];\n\t    }\n\n\t    if ((initialState == null || initialState.length === 0) && constants == null) {\n\t      return _Wrapper2.prototype.apply.call(this, inputs, kwargs);\n\t    }\n\n\t    var additionalInputs = [];\n\t    var additionalSpecs = [];\n\n\t    if (initialState != null) {\n\t      var numStates = initialState.length;\n\n\t      if (numStates % 2 > 0) {\n\t        throw new ValueError('When passing `initialState` to a Bidrectional RNN, ' + 'the state should be an Array containing the states of ' + 'the underlying RNNs.');\n\t      }\n\n\t      kwargs['initialState'] = initialState;\n\t      additionalInputs.push.apply(additionalInputs, initialState);\n\t      var stateSpecs = initialState.map(function (state) {\n\t        return new InputSpec({\n\t          shape: state.shape\n\t        });\n\t      });\n\t      this.forwardLayer.stateSpec = stateSpecs.slice(0, numStates / 2);\n\t      this.backwardLayer.stateSpec = stateSpecs.slice(numStates / 2);\n\t      additionalSpecs.push.apply(additionalSpecs, stateSpecs);\n\t    }\n\n\t    if (constants != null) {\n\t      throw new NotImplementedError('Support for constants in Bidirectional layers is not ' + 'implemented yet.');\n\t    }\n\n\t    var isSymbolicTensor = additionalInputs[0] instanceof SymbolicTensor;\n\n\t    for (var _i = 0, _additionalInputs = additionalInputs; _i < _additionalInputs.length; _i++) {\n\t      var tensor = _additionalInputs[_i];\n\n\t      if (tensor instanceof SymbolicTensor !== isSymbolicTensor) {\n\t        throw new ValueError('The initial state of a Bidirectional layer cannot be ' + 'specified as a mix of symbolic and non-symbolic tensors');\n\t      }\n\t    }\n\n\t    if (isSymbolicTensor) {\n\t      // Compute the full input and specs, including the states.\n\t      var fullInput = [inputs].concat(additionalInputs);\n\t      var fullInputSpec = this.inputSpec.concat(additionalSpecs); // Perform the call temporarily and replace inputSpec.\n\t      // Note: with initial states symbolic calls and non-symbolic calls to\n\t      // this method differ in how the initial states are passed. For\n\t      // symbolic calls, the initial states are passed in the first arg, as\n\t      // an Array of SymbolicTensors; for non-symbolic calls, they are\n\t      // passed in the second arg as a part of the kwargs. Hence the need to\n\t      // temporarily modify inputSpec here.\n\t      // TODO(cais): Make refactoring so that this hacky code below is no\n\t      // longer needed.\n\n\t      var originalInputSpec = this.inputSpec;\n\t      this.inputSpec = fullInputSpec;\n\n\t      var output = _Wrapper2.prototype.apply.call(this, fullInput, kwargs);\n\n\t      this.inputSpec = originalInputSpec;\n\t      return output;\n\t    } else {\n\t      return _Wrapper2.prototype.apply.call(this, inputs, kwargs);\n\t    }\n\t  };\n\n\t  _proto3.call = function call(inputs, kwargs) {\n\t    var _this5 = this;\n\n\t    return tidy(function () {\n\t      var initialState = kwargs['initialState'];\n\t      var y;\n\t      var yRev;\n\n\t      if (initialState == null) {\n\t        y = _this5.forwardLayer.call(inputs, kwargs);\n\t        yRev = _this5.backwardLayer.call(inputs, kwargs);\n\t      } else {\n\t        var forwardState = initialState.slice(0, initialState.length / 2);\n\t        var backwardState = initialState.slice(initialState.length / 2);\n\t        y = _this5.forwardLayer.call(inputs, Object.assign(kwargs, {\n\t          initialState: forwardState\n\t        }));\n\t        yRev = _this5.backwardLayer.call(inputs, Object.assign(kwargs, {\n\t          initialState: backwardState\n\t        }));\n\t      }\n\n\t      var states;\n\n\t      if (_this5.returnState) {\n\t        if (Array.isArray(y)) {\n\t          states = y.slice(1).concat(yRev.slice(1));\n\t        } else {}\n\n\t        y = y[0];\n\t        yRev = yRev[0];\n\t      }\n\n\t      if (_this5.returnSequences) {\n\t        yRev = reverse(yRev, 1);\n\t      }\n\n\t      var output;\n\n\t      if (_this5.mergeMode === 'concat') {\n\t        output = concatenate([y, yRev]);\n\t      } else if (_this5.mergeMode === 'sum') {\n\t        output = add$1(y, yRev);\n\t      } else if (_this5.mergeMode === 'ave') {\n\t        output = mul(.5, add$1(y, yRev));\n\t      } else if (_this5.mergeMode === 'mul') {\n\t        output = mul(y, yRev);\n\t      } else if (_this5.mergeMode == null) {\n\t        output = [y, yRev];\n\t      } // TODO(cais): Properly set learning phase.\n\n\n\t      if (_this5.returnState) {\n\t        if (_this5.mergeMode == null) {\n\t          return output.concat(states);\n\t        }\n\n\t        return [output].concat(states);\n\t      }\n\n\t      return output;\n\t    });\n\t  };\n\n\t  _proto3.resetStates = function resetStates(states) {\n\t    this.forwardLayer.resetStates();\n\t    this.backwardLayer.resetStates();\n\t  };\n\n\t  _proto3.build = function build(inputShape) {\n\t    var _this6 = this;\n\n\t    nameScope(this.forwardLayer.name, function () {\n\t      _this6.forwardLayer.build(inputShape);\n\t    });\n\t    nameScope(this.backwardLayer.name, function () {\n\t      _this6.backwardLayer.build(inputShape);\n\t    });\n\t    this.built = true;\n\t  };\n\n\t  _proto3.computeMask = function computeMask(inputs, mask) {\n\t    if (Array.isArray(mask)) {\n\t      mask = mask[0];\n\t    }\n\n\t    var outputMask;\n\n\t    if (this.returnSequences) {\n\t      if (this.mergeMode == null) {\n\t        outputMask = [mask, mask];\n\t      } else {\n\t        outputMask = mask;\n\t      }\n\t    } else {\n\t      if (this.mergeMode == null) {\n\t        outputMask = [null, null];\n\t      } else {\n\t        outputMask = null;\n\t      }\n\t    }\n\n\t    if (this.returnState) {\n\t      var states = this.forwardLayer.states;\n\t      var stateMask = states.map(function (state) {\n\t        return null;\n\t      });\n\n\t      if (Array.isArray(outputMask)) {\n\t        return outputMask.concat(stateMask).concat(stateMask);\n\t      } else {\n\t        return [outputMask].concat(stateMask).concat(stateMask);\n\t      }\n\t    } else {\n\t      return outputMask;\n\t    }\n\t  };\n\n\t  // TODO(cais): Implement constraints().\n\t  _proto3.setFastWeightInitDuringBuild = function setFastWeightInitDuringBuild(value) {\n\t    _Wrapper2.prototype.setFastWeightInitDuringBuild.call(this, value);\n\n\t    if (this.forwardLayer != null) {\n\t      this.forwardLayer.setFastWeightInitDuringBuild(value);\n\t    }\n\n\t    if (this.backwardLayer != null) {\n\t      this.backwardLayer.setFastWeightInitDuringBuild(value);\n\t    }\n\t  };\n\n\t  _proto3.getConfig = function getConfig() {\n\t    var config = {\n\t      'mergeMode': this.mergeMode\n\t    }; // TODO(cais): Add logic for `numConstants` once the property is added.\n\n\t    var baseConfig = _Wrapper2.prototype.getConfig.call(this);\n\n\t    Object.assign(config, baseConfig);\n\t    return config;\n\t  }\n\t  /** @nocollapse */\n\t  ;\n\n\t  Bidirectional.fromConfig = function fromConfig(cls, config) {\n\t    var rnnLayer = deserialize$1(config['layer']);\n\t    delete config['layer']; // TODO(cais): Add logic for `numConstants` once the property is added.\n\n\t    if (config['numConstants'] != null) {\n\t      throw new NotImplementedError(\"Deserialization of a Bidirectional layer with numConstants \" + \"present is not supported yet.\");\n\t    } // tslint:disable-next-line:no-any\n\n\n\t    var newConfig = config;\n\t    newConfig['layer'] = rnnLayer;\n\t    return new cls(newConfig);\n\t  };\n\n\t  _createClass(Bidirectional, [{\n\t    key: \"trainable\",\n\t    get: function get() {\n\t      return this._trainable;\n\t    },\n\t    set: function set(value) {\n\t      // Porting Note: the check of `this.layer` here is necessary due to the\n\t      //   way the `constructor` of this class is written (see Porting Note\n\t      //   above).\n\t      this._trainable = value;\n\n\t      if (this.forwardLayer != null) {\n\t        this.forwardLayer.trainable = value;\n\t      }\n\n\t      if (this.backwardLayer != null) {\n\t        this.backwardLayer.trainable = value;\n\t      }\n\t    }\n\t  }, {\n\t    key: \"trainableWeights\",\n\t    get: function get() {\n\t      return this.forwardLayer.trainableWeights.concat(this.backwardLayer.trainableWeights);\n\t    }\n\t  }, {\n\t    key: \"nonTrainableWeights\",\n\t    get: function get() {\n\t      return this.forwardLayer.nonTrainableWeights.concat(this.backwardLayer.nonTrainableWeights);\n\t    }\n\t  }]);\n\n\t  return Bidirectional;\n\t}(Wrapper);\n\t/** @nocollapse */\n\n\tBidirectional.className = 'Bidirectional';\n\tregisterClass(Bidirectional);\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\t//   class; include exectuable JavaScript code snippets where applicable\n\t//   (b/74074458).\n\t// Input Layer.\n\n\t/**\n\t * An input layer is an entry point into a `tf.LayersModel`.\n\t *\n\t * `InputLayer` is generated automatically for `tf.Sequential`` models by\n\t * specifying the `inputshape` or `batchInputShape` for the first layer.  It\n\t * should not be specified explicitly. However, it can be useful sometimes,\n\t * e.g., when constructing a sequential model from a subset of another\n\t * sequential model's layers. Like the code snippet below shows.\n\t *\n\t * ```js\n\t * // Define a model which simply adds two inputs.\n\t * const model1 = tf.sequential();\n\t * model1.add(tf.layers.dense({inputShape: [4], units: 3, activation: 'relu'}));\n\t * model1.add(tf.layers.dense({units: 1, activation: 'sigmoid'}));\n\t * model1.summary();\n\t * model1.predict(tf.zeros([1, 4])).print();\n\t *\n\t * // Construct another model, reusing the second layer of `model1` while\n\t * // not using the first layer of `model1`. Note that you cannot add the second\n\t * // layer of `model` directly as the first layer of the new sequential model,\n\t * // because doing so will lead to an error related to the fact that the layer\n\t * // is not an input layer. Instead, you need to create an `inputLayer` and add\n\t * // it to the new sequential model before adding the reused layer.\n\t * const model2 = tf.sequential();\n\t * // Use an inputShape that matches the input shape of `model1`'s second\n\t * // layer.\n\t * model2.add(tf.layers.inputLayer({inputShape: [3]}));\n\t * model2.add(model1.layers[1]);\n\t * model2.summary();\n\t * model2.predict(tf.zeros([1, 3])).print();\n\t * ```\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Inputs', namespace: 'layers'}\n\t */\n\n\tfunction inputLayer(args) {\n\t  return new InputLayer(args);\n\t} // Advanced Activation Layers.\n\n\t/**\n\t * Exponetial Linear Unit (ELU).\n\t *\n\t * It follows:\n\t * `f(x) =  alpha * (exp(x) - 1.) for x < 0`,\n\t * `f(x) = x for x >= 0`.\n\t *\n\t * Input shape:\n\t *   Arbitrary. Use the configuration `inputShape` when using this layer as the\n\t *   first layer in a model.\n\t *\n\t * Output shape:\n\t *   Same shape as the input.\n\t *\n\t * References:\n\t *   - [Fast and Accurate Deep Network Learning by Exponential Linear Units\n\t * (ELUs)](https://arxiv.org/abs/1511.07289v1)\n\t *\n\t * @doc {\n\t *   heading: 'Layers',\n\t *   subheading: 'Advanced Activation',\n\t *   namespace: 'layers'\n\t * }\n\t */\n\n\tfunction elu$2(args) {\n\t  return new ELU(args);\n\t}\n\t/**\n\t * Rectified Linear Unit activation function.\n\t *\n\t * Input shape:\n\t *   Arbitrary. Use the config field `inputShape` (Array of integers, does\n\t *   not include the sample axis) when using this layer as the first layer\n\t *   in a model.\n\t *\n\t * Output shape:\n\t *   Same shape as the input.\n\t *\n\t * @doc {\n\t *   heading: 'Layers',\n\t *   subheading: 'Advanced Activation',\n\t *   namespace: 'layers'\n\t * }\n\t */\n\n\tfunction reLU(args) {\n\t  return new ReLU(args);\n\t}\n\t/**\n\t * Leaky version of a rectified linear unit.\n\t *\n\t * It allows a small gradient when the unit is not active:\n\t * `f(x) = alpha * x for x < 0.`\n\t * `f(x) = x for x >= 0.`\n\t *\n\t * Input shape:\n\t *   Arbitrary. Use the configuration `inputShape` when using this layer as the\n\t *   first layer in a model.\n\t *\n\t * Output shape:\n\t *   Same shape as the input.\n\t *\n\t * @doc {\n\t *   heading: 'Layers',\n\t *   subheading: 'Advanced Activation',\n\t *   namespace: 'layers'\n\t * }\n\t */\n\n\tfunction leakyReLU(args) {\n\t  return new LeakyReLU(args);\n\t}\n\t/**\n\t * Parameterized version of a leaky rectified linear unit.\n\t *\n\t * It follows\n\t * `f(x) = alpha * x for x < 0.`\n\t * `f(x) = x for x >= 0.`\n\t * wherein `alpha` is a trainable weight.\n\t *\n\t * Input shape:\n\t *   Arbitrary. Use the configuration `inputShape` when using this layer as the\n\t *   first layer in a model.\n\t *\n\t * Output shape:\n\t *   Same shape as the input.\n\t *\n\t * @doc {\n\t *   heading: 'Layers',\n\t *   subheading: 'Advanced Activation',\n\t *   namespace: 'layers'\n\t * }\n\t */\n\n\tfunction prelu$1(args) {\n\t  return new PReLU(args);\n\t}\n\t/**\n\t * Softmax activation layer.\n\t *\n\t * Input shape:\n\t *   Arbitrary. Use the configuration `inputShape` when using this layer as the\n\t *   first layer in a model.\n\t *\n\t * Output shape:\n\t *   Same shape as the input.\n\t *\n\t * @doc {\n\t *   heading: 'Layers',\n\t *   subheading: 'Advanced Activation',\n\t *   namespace: 'layers'\n\t * }\n\t */\n\n\tfunction softmax$1(args) {\n\t  return new Softmax$2(args);\n\t}\n\t/**\n\t * Thresholded Rectified Linear Unit.\n\t *\n\t * It follows:\n\t * `f(x) = x for x > theta`,\n\t * `f(x) = 0 otherwise`.\n\t *\n\t * Input shape:\n\t *   Arbitrary. Use the configuration `inputShape` when using this layer as the\n\t *   first layer in a model.\n\t *\n\t * Output shape:\n\t *   Same shape as the input.\n\t *\n\t * References:\n\t *   - [Zero-Bias Autoencoders and the Benefits of Co-Adapting\n\t * Features](http://arxiv.org/abs/1402.3337)\n\t *\n\t * @doc {\n\t *   heading: 'Layers',\n\t *   subheading: 'Advanced Activation',\n\t *   namespace: 'layers'\n\t * }\n\t */\n\n\tfunction thresholdedReLU(args) {\n\t  return new ThresholdedReLU(args);\n\t} // Convolutional Layers.\n\n\t/**\n\t * 1D convolution layer (e.g., temporal convolution).\n\t *\n\t * This layer creates a convolution kernel that is convolved\n\t * with the layer input over a single spatial (or temporal) dimension\n\t * to produce a tensor of outputs.\n\t *\n\t * If `use_bias` is True, a bias vector is created and added to the outputs.\n\t *\n\t * If `activation` is not `null`, it is applied to the outputs as well.\n\t *\n\t * When using this layer as the first layer in a model, provide an\n\t * `inputShape` argument `Array` or `null`.\n\t *\n\t * For example, `inputShape` would be:\n\t * - `[10, 128]` for sequences of 10 vectors of 128-dimensional vectors\n\t * - `[null, 128]` for variable-length sequences of 128-dimensional vectors.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Convolutional',  namespace: 'layers'}\n\t */\n\n\tfunction conv1d$2(args) {\n\t  return new Conv1D(args);\n\t}\n\t/**\n\t * 2D convolution layer (e.g. spatial convolution over images).\n\t *\n\t * This layer creates a convolution kernel that is convolved\n\t * with the layer input to produce a tensor of outputs.\n\t *\n\t * If `useBias` is True, a bias vector is created and added to the outputs.\n\t *\n\t * If `activation` is not `null`, it is applied to the outputs as well.\n\t *\n\t * When using this layer as the first layer in a model,\n\t * provide the keyword argument `inputShape`\n\t * (Array of integers, does not include the sample axis),\n\t * e.g. `inputShape=[128, 128, 3]` for 128x128 RGB pictures\n\t * in `dataFormat='channelsLast'`.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'}\n\t */\n\n\tfunction conv2d$3(args) {\n\t  return new Conv2D$1(args);\n\t}\n\t/**\n\t * Transposed convolutional layer (sometimes called Deconvolution).\n\t *\n\t * The need for transposed convolutions generally arises\n\t * from the desire to use a transformation going in the opposite direction of\n\t * a normal convolution, i.e., from something that has the shape of the output\n\t * of some convolution to something that has the shape of its input while\n\t * maintaining a connectivity pattern that is compatible with said\n\t * convolution.\n\t *\n\t * When using this layer as the first layer in a model, provide the\n\t * configuration `inputShape` (`Array` of integers, does not include the\n\t * sample axis), e.g., `inputShape: [128, 128, 3]` for 128x128 RGB pictures in\n\t * `dataFormat: 'channelsLast'`.\n\t *\n\t * Input shape:\n\t *   4D tensor with shape:\n\t *   `[batch, channels, rows, cols]` if `dataFormat` is `'channelsFirst'`.\n\t *   or 4D tensor with shape\n\t *   `[batch, rows, cols, channels]` if `dataFormat` is `'channelsLast`.\n\t *\n\t * Output shape:\n\t *   4D tensor with shape:\n\t *   `[batch, filters, newRows, newCols]` if `dataFormat` is\n\t * `'channelsFirst'`. or 4D tensor with shape:\n\t *   `[batch, newRows, newCols, filters]` if `dataFormat` is `'channelsLast'`.\n\t *\n\t * References:\n\t *   - [A guide to convolution arithmetic for deep\n\t * learning](https://arxiv.org/abs/1603.07285v1)\n\t *   - [Deconvolutional\n\t * Networks](http://www.matthewzeiler.com/pubs/cvpr2010/cvpr2010.pdf)\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'}\n\t */\n\n\tfunction conv2dTranspose$1(args) {\n\t  return new Conv2DTranspose(args);\n\t}\n\t/**\n\t * 3D convolution layer (e.g. spatial convolution over volumes).\n\t *\n\t * This layer creates a convolution kernel that is convolved\n\t * with the layer input to produce a tensor of outputs.\n\t *\n\t * If `useBias` is True, a bias vector is created and added to the outputs.\n\t *\n\t * If `activation` is not `null`, it is applied to the outputs as well.\n\t *\n\t * When using this layer as the first layer in a model,\n\t * provide the keyword argument `inputShape`\n\t * (Array of integers, does not include the sample axis),\n\t * e.g. `inputShape=[128, 128, 128, 1]` for 128x128x128 grayscale volumes\n\t * in `dataFormat='channelsLast'`.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'}\n\t */\n\n\tfunction conv3d$2(args) {\n\t  return new Conv3D$1(args);\n\t}\n\t/**\n\t * Depthwise separable 2D convolution.\n\t *\n\t * Separable convolution consists of first performing\n\t * a depthwise spatial convolution\n\t * (which acts on each input channel separately)\n\t * followed by a pointwise convolution which mixes together the resulting\n\t * output channels. The `depthMultiplier` argument controls how many\n\t * output channels are generated per input channel in the depthwise step.\n\t *\n\t * Intuitively, separable convolutions can be understood as\n\t * a way to factorize a convolution kernel into two smaller kernels,\n\t * or as an extreme version of an Inception block.\n\t *\n\t * Input shape:\n\t *   4D tensor with shape:\n\t *     `[batch, channels, rows, cols]` if data_format='channelsFirst'\n\t *   or 4D tensor with shape:\n\t *     `[batch, rows, cols, channels]` if data_format='channelsLast'.\n\t *\n\t * Output shape:\n\t *   4D tensor with shape:\n\t *     `[batch, filters, newRows, newCols]` if data_format='channelsFirst'\n\t *   or 4D tensor with shape:\n\t *     `[batch, newRows, newCols, filters]` if data_format='channelsLast'.\n\t *     `rows` and `cols` values might have changed due to padding.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'}\n\t */\n\n\tfunction separableConv2d$1(args) {\n\t  return new SeparableConv2D(args);\n\t}\n\t/**\n\t * Cropping layer for 2D input (e.g., image).\n\t *\n\t * This layer can crop an input\n\t * at the top, bottom, left and right side of an image tensor.\n\t *\n\t * Input shape:\n\t *   4D tensor with shape:\n\t *   - If `dataFormat` is `\"channelsLast\"`:\n\t *     `[batch, rows, cols, channels]`\n\t *   - If `data_format` is `\"channels_first\"`:\n\t *     `[batch, channels, rows, cols]`.\n\t *\n\t * Output shape:\n\t *   4D with shape:\n\t *   - If `dataFormat` is `\"channelsLast\"`:\n\t *     `[batch, croppedRows, croppedCols, channels]`\n\t *    - If `dataFormat` is `\"channelsFirst\"`:\n\t *     `[batch, channels, croppedRows, croppedCols]`.\n\t *\n\t * Examples\n\t * ```js\n\t *\n\t * const model = tf.sequential();\n\t * model.add(tf.layers.cropping2D({cropping:[[2, 2], [2, 2]],\n\t *                                inputShape: [128, 128, 3]}));\n\t * //now output shape is [batch, 124, 124, 3]\n\t * ```\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'}\n\t */\n\n\tfunction cropping2D(args) {\n\t  return new Cropping2D(args);\n\t}\n\t/**\n\t * Upsampling layer for 2D inputs.\n\t *\n\t * Repeats the rows and columns of the data\n\t * by size[0] and size[1] respectively.\n\t *\n\t *\n\t * Input shape:\n\t *    4D tensor with shape:\n\t *     - If `dataFormat` is `\"channelsLast\"`:\n\t *         `[batch, rows, cols, channels]`\n\t *     - If `dataFormat` is `\"channelsFirst\"`:\n\t *        `[batch, channels, rows, cols]`\n\t *\n\t * Output shape:\n\t *     4D tensor with shape:\n\t *     - If `dataFormat` is `\"channelsLast\"`:\n\t *        `[batch, upsampledRows, upsampledCols, channels]`\n\t *     - If `dataFormat` is `\"channelsFirst\"`:\n\t *         `[batch, channels, upsampledRows, upsampledCols]`\n\t *\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'}\n\t */\n\n\tfunction upSampling2d(args) {\n\t  return new UpSampling2D(args);\n\t} // Convolutional(depthwise) Layers.\n\n\t/**\n\t * Depthwise separable 2D convolution.\n\t *\n\t * Depthwise Separable convolutions consists in performing just the first step\n\t * in a depthwise spatial convolution (which acts on each input channel\n\t * separately). The `depthMultplier` argument controls how many output channels\n\t * are generated per input channel in the depthwise step.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'}\n\t */\n\n\tfunction depthwiseConv2d$3(args) {\n\t  return new DepthwiseConv2D(args);\n\t} // Basic Layers.\n\n\t/**\n\t * Applies an activation function to an output.\n\t *\n\t * This layer applies element-wise activation function.  Other layers, notably\n\t * `dense` can also apply activation functions.  Use this isolated activation\n\t * function to extract the values before and after the\n\t * activation. For instance:\n\t *\n\t * ```js\n\t * const input = tf.input({shape: [5]});\n\t * const denseLayer = tf.layers.dense({units: 1});\n\t * const activationLayer = tf.layers.activation({activation: 'relu6'});\n\t *\n\t * // Obtain the output symbolic tensors by applying the layers in order.\n\t * const denseOutput = denseLayer.apply(input);\n\t * const activationOutput = activationLayer.apply(denseOutput);\n\t *\n\t * // Create the model based on the inputs.\n\t * const model = tf.model({\n\t *     inputs: input,\n\t *     outputs: [denseOutput, activationOutput]\n\t * });\n\t *\n\t * // Collect both outputs and print separately.\n\t * const [denseOut, activationOut] = model.predict(tf.randomNormal([6, 5]));\n\t * denseOut.print();\n\t * activationOut.print();\n\t * ```\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'}\n\t */\n\n\tfunction activation(args) {\n\t  return new Activation$1(args);\n\t}\n\t/**\n\t * Creates a dense (fully connected) layer.\n\t *\n\t * This layer implements the operation:\n\t *   `output = activation(dot(input, kernel) + bias)`\n\t *\n\t * `activation` is the element-wise activation function\n\t *   passed as the `activation` argument.\n\t *\n\t * `kernel` is a weights matrix created by the layer.\n\t *\n\t * `bias` is a bias vector created by the layer (only applicable if `useBias`\n\t * is `true`).\n\t *\n\t * **Input shape:**\n\t *\n\t *   nD `tf.Tensor` with shape: `(batchSize, ..., inputDim)`.\n\t *\n\t *   The most common situation would be\n\t *   a 2D input with shape `(batchSize, inputDim)`.\n\t *\n\t * **Output shape:**\n\t *\n\t *   nD tensor with shape: `(batchSize, ..., units)`.\n\t *\n\t *   For instance, for a 2D input with shape `(batchSize, inputDim)`,\n\t *   the output would have shape `(batchSize, units)`.\n\t *\n\t * Note: if the input to the layer has a rank greater than 2, then it is\n\t * flattened prior to the initial dot product with the kernel.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'}\n\t */\n\n\tfunction dense(args) {\n\t  return new Dense(args);\n\t}\n\t/**\n\t * Applies\n\t * [dropout](http://www.cs.toronto.edu/~rsalakhu/papers/srivastava14a.pdf) to\n\t * the input.\n\t *\n\t * Dropout consists in randomly setting a fraction `rate` of input units to 0 at\n\t * each update during training time, which helps prevent overfitting.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'}\n\t */\n\n\tfunction dropout$2(args) {\n\t  return new Dropout(args);\n\t}\n\t/**\n\t * Spatial 1D version of Dropout.\n\t *\n\t * This Layer type performs the same function as the Dropout layer, but it drops\n\t * entire 1D feature maps instead of individual elements. For example, if an\n\t * input example consists of 3 timesteps and the feature map for each timestep\n\t * has a size of 4, a `spatialDropout1d` layer may zero out the feature maps\n\t * of the 1st timesteps and 2nd timesteps completely while sparing all feature\n\t * elements of the 3rd timestep.\n\t *\n\t * If adjacent frames (timesteps) are strongly correlated (as is normally the\n\t * case in early convolution layers), regular dropout will not regularize the\n\t * activation and will otherwise just result in merely an effective learning\n\t * rate decrease. In this case, `spatialDropout1d` will help promote\n\t * independence among feature maps and should be used instead.\n\t *\n\t * **Arguments:**\n\t *   rate: A floating-point number >=0 and <=1. Fraction of the input elements\n\t *     to drop.\n\t *\n\t * **Input shape:**\n\t *   3D tensor with shape `(samples, timesteps, channels)`.\n\t *\n\t * **Output shape:**\n\t *   Same as the input shape.\n\t *\n\t * References:\n\t *   - [Efficient Object Localization Using Convolutional\n\t *      Networks](https://arxiv.org/abs/1411.4280)\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'}\n\t */\n\n\tfunction spatialDropout1d(args) {\n\t  return new SpatialDropout1D(args);\n\t}\n\t/**\n\t * Flattens the input. Does not affect the batch size.\n\t *\n\t * A `Flatten` layer flattens each batch in its inputs to 1D (making the output\n\t * 2D).\n\t *\n\t * For example:\n\t *\n\t * ```js\n\t * const input = tf.input({shape: [4, 3]});\n\t * const flattenLayer = tf.layers.flatten();\n\t * // Inspect the inferred output shape of the flatten layer, which\n\t * // equals `[null, 12]`. The 2nd dimension is 4 * 3, i.e., the result of the\n\t * // flattening. (The 1st dimension is the undermined batch size.)\n\t * console.log(JSON.stringify(flattenLayer.apply(input).shape));\n\t * ```\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'}\n\t */\n\n\tfunction flatten$2(args) {\n\t  return new Flatten(args);\n\t}\n\t/**\n\t * Repeats the input n times in a new dimension.\n\t *\n\t * ```js\n\t *  const model = tf.sequential();\n\t *  model.add(tf.layers.repeatVector({n: 4, inputShape: [2]}));\n\t *  const x = tf.tensor2d([[10, 20]]);\n\t *  // Use the model to do inference on a data point the model hasn't see\n\t *  model.predict(x).print();\n\t *  // output shape is now [batch, 2, 4]\n\t * ```\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'}\n\t */\n\n\tfunction repeatVector(args) {\n\t  return new RepeatVector(args);\n\t}\n\t/**\n\t * Reshapes an input to a certain shape.\n\t *\n\t * ```js\n\t * const input = tf.input({shape: [4, 3]});\n\t * const reshapeLayer = tf.layers.reshape({targetShape: [2, 6]});\n\t * // Inspect the inferred output shape of the Reshape layer, which\n\t * // equals `[null, 2, 6]`. (The 1st dimension is the undermined batch size.)\n\t * console.log(JSON.stringify(reshapeLayer.apply(input).shape));\n\t * ```\n\t *\n\t * Input shape:\n\t *   Arbitrary, although all dimensions in the input shape must be fixed.\n\t *   Use the configuration `inputShape` when using this layer as the\n\t *   first layer in a model.\n\t *\n\t *\n\t * Output shape:\n\t *   [batchSize, targetShape[0], targetShape[1], ...,\n\t *    targetShape[targetShape.length - 1]].\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'}\n\t */\n\n\tfunction reshape$1(args) {\n\t  return new Reshape$1(args);\n\t}\n\t/**\n\t * Permutes the dimensions of the input according to a given pattern.\n\t *\n\t * Useful for, e.g., connecting RNNs and convnets together.\n\t *\n\t * Example:\n\t *\n\t * ```js\n\t * const model = tf.sequential();\n\t * model.add(tf.layers.permute({\n\t *   dims: [2, 1],\n\t *   inputShape: [10, 64]\n\t * }));\n\t * console.log(model.outputShape);\n\t * // Now model's output shape is [null, 64, 10], where null is the\n\t * // unpermuted sample (batch) dimension.\n\t * ```\n\t *\n\t * Input shape:\n\t *   Arbitrary. Use the configuration field `inputShape` when using this\n\t *   layer as the first layer in a model.\n\t *\n\t * Output shape:\n\t *   Same rank as the input shape, but with the dimensions re-ordered (i.e.,\n\t *   permuted) according to the `dims` configuration of this layer.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'}\n\t */\n\n\tfunction permute(args) {\n\t  return new Permute(args);\n\t}\n\t/**\n\t * Maps positive integers (indices) into dense vectors of fixed size.\n\t * eg. [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]\n\t *\n\t * **Input shape:** 2D tensor with shape: `[batchSize, sequenceLength]`.\n\t *\n\t * **Output shape:** 3D tensor with shape: `[batchSize, sequenceLength,\n\t * outputDim]`.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'}\n\t */\n\n\tfunction embedding(args) {\n\t  return new Embedding(args);\n\t} // Merge Layers.\n\n\t/**\n\t * Layer that performs element-wise addition on an `Array` of inputs.\n\t *\n\t * It takes as input a list of tensors, all of the same shape, and returns a\n\t * single tensor (also of the same shape). The inputs are specified as an\n\t * `Array` when the `apply` method of the `Add` layer instance is called. For\n\t * example:\n\t *\n\t * ```js\n\t * const input1 = tf.input({shape: [2, 2]});\n\t * const input2 = tf.input({shape: [2, 2]});\n\t * const addLayer = tf.layers.add();\n\t * const sum = addLayer.apply([input1, input2]);\n\t * console.log(JSON.stringify(sum.shape));\n\t * // You get [null, 2, 2], with the first dimension as the undetermined batch\n\t * // dimension.\n\t * ```\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'}\n\t */\n\n\tfunction add$3(args) {\n\t  return new Add$1(args);\n\t}\n\t/**\n\t * Layer that performs element-wise averaging on an `Array` of inputs.\n\t *\n\t * It takes as input a list of tensors, all of the same shape, and returns a\n\t * single tensor (also of the same shape). For example:\n\t *\n\t * ```js\n\t * const input1 = tf.input({shape: [2, 2]});\n\t * const input2 = tf.input({shape: [2, 2]});\n\t * const averageLayer = tf.layers.average();\n\t * const average = averageLayer.apply([input1, input2]);\n\t * console.log(JSON.stringify(average.shape));\n\t * // You get [null, 2, 2], with the first dimension as the undetermined batch\n\t * // dimension.\n\t * ```\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'}\n\t */\n\n\tfunction average$1(args) {\n\t  return new Average(args);\n\t}\n\t/**\n\t * Layer that concatenates an `Array` of inputs.\n\t *\n\t * It takes a list of tensors, all of the same shape except for the\n\t * concatenation axis, and returns a single tensor, the concatenation\n\t * of all inputs. For example:\n\t *\n\t * ```js\n\t * const input1 = tf.input({shape: [2, 2]});\n\t * const input2 = tf.input({shape: [2, 3]});\n\t * const concatLayer = tf.layers.concatenate();\n\t * const output = concatLayer.apply([input1, input2]);\n\t * console.log(JSON.stringify(output.shape));\n\t * // You get [null, 2, 5], with the first dimension as the undetermined batch\n\t * // dimension. The last dimension (5) is the result of concatenating the\n\t * // last dimensions of the inputs (2 and 3).\n\t * ```\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'}\n\t */\n\n\tfunction concatenate$2(args) {\n\t  return new Concatenate(args);\n\t}\n\t/**\n\t * Layer that computes the element-wise maximum an `Array` of inputs.\n\t *\n\t * It takes as input a list of tensors, all of the same shape and returns a\n\t * single tensor (also of the same shape). For example:\n\t *\n\t * ```js\n\t * const input1 = tf.input({shape: [2, 2]});\n\t * const input2 = tf.input({shape: [2, 2]});\n\t * const maxLayer = tf.layers.maximum();\n\t * const max = maxLayer.apply([input1, input2]);\n\t * console.log(JSON.stringify(max.shape));\n\t * // You get [null, 2, 2], with the first dimension as the undetermined batch\n\t * // dimension.\n\t * ```\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'}\n\t */\n\n\tfunction maximum$2(args) {\n\t  return new Maximum$1(args);\n\t}\n\t/**\n\t * Layer that computes the element-wise minimum of an `Array` of inputs.\n\t *\n\t * It takes as input a list of tensors, all of the same shape and returns a\n\t * single tensor (also of the same shape). For example:\n\t *\n\t * ```js\n\t * const input1 = tf.input({shape: [2, 2]});\n\t * const input2 = tf.input({shape: [2, 2]});\n\t * const minLayer = tf.layers.minimum();\n\t * const min = minLayer.apply([input1, input2]);\n\t * console.log(JSON.stringify(min.shape));\n\t * // You get [null, 2, 2], with the first dimension as the undetermined batch\n\t * // dimension.\n\t * ```\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'}\n\t */\n\n\tfunction minimum$2(args) {\n\t  return new Minimum$1(args);\n\t}\n\t/**\n\t * Layer that multiplies (element-wise) an `Array` of inputs.\n\t *\n\t * It takes as input an Array of tensors, all of the same\n\t * shape, and returns a single tensor (also of the same shape).\n\t * For example:\n\t *\n\t * ```js\n\t * const input1 = tf.input({shape: [2, 2]});\n\t * const input2 = tf.input({shape: [2, 2]});\n\t * const input3 = tf.input({shape: [2, 2]});\n\t * const multiplyLayer = tf.layers.multiply();\n\t * const product = multiplyLayer.apply([input1, input2, input3]);\n\t * console.log(product.shape);\n\t * // You get [null, 2, 2], with the first dimension as the undetermined batch\n\t * // dimension.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'}\n\t */\n\n\tfunction multiply$1(args) {\n\t  return new Multiply$1(args);\n\t}\n\t/**\n\t * Layer that computes a dot product between samples in two tensors.\n\t *\n\t * E.g., if applied to a list of two tensors `a` and `b` both of shape\n\t * `[batchSize, n]`, the output will be a tensor of shape `[batchSize, 1]`,\n\t * where each entry at index `[i, 0]` will be the dot product between\n\t * `a[i, :]` and `b[i, :]`.\n\t *\n\t * Example:\n\t *\n\t * ```js\n\t * const dotLayer = tf.layers.dot({axes: -1});\n\t * const x1 = tf.tensor2d([[10, 20], [30, 40]]);\n\t * const x2 = tf.tensor2d([[-1, -2], [-3, -4]]);\n\t *\n\t * // Invoke the layer's apply() method in eager (imperative) mode.\n\t * const y = dotLayer.apply([x1, x2]);\n\t * y.print();\n\t * ```\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'}\n\t */\n\n\tfunction dot$2(args) {\n\t  return new Dot(args);\n\t} // Normalization Layers.\n\n\t/**\n\t * Batch normalization layer (Ioffe and Szegedy, 2014).\n\t *\n\t * Normalize the activations of the previous layer at each batch,\n\t * i.e. applies a transformation that maintains the mean activation\n\t * close to 0 and the activation standard deviation close to 1.\n\t *\n\t * Input shape:\n\t *   Arbitrary. Use the keyword argument `inputShape` (Array of integers, does\n\t *   not include the sample axis) when calling the constructor of this class,\n\t *   if this layer is used as a first layer in a model.\n\t *\n\t * Output shape:\n\t *   Same shape as input.\n\t *\n\t * References:\n\t *   - [Batch Normalization: Accelerating Deep Network Training by Reducing\n\t * Internal Covariate Shift](https://arxiv.org/abs/1502.03167)\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Normalization', namespace: 'layers'}\n\t */\n\n\tfunction batchNormalization$1(args) {\n\t  return new BatchNormalization(args);\n\t}\n\t/**\n\t * Layer-normalization layer (Ba et al., 2016).\n\t *\n\t * Normalizes the activations of the previous layer for each given example in a\n\t * batch independently, instead of across a batch like in `batchNormalization`.\n\t * In other words, this layer applies a transformation that maintanis the mean\n\t * activation within each example close to0 and activation variance close to 1.\n\t *\n\t * Input shape:\n\t *   Arbitrary. Use the argument `inputShape` when using this layer as the first\n\t *   layer in a model.\n\t *\n\t * Output shape:\n\t *   Same as input.\n\t *\n\t * References:\n\t *   - [Layer Normalization](https://arxiv.org/abs/1607.06450)\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Normalization', namespace: 'layers'}\n\t */\n\n\tfunction layerNormalization(args) {\n\t  return new LayerNormalization(args);\n\t} // Padding Layers.\n\n\t/**\n\t * Zero-padding layer for 2D input (e.g., image).\n\t *\n\t * This layer can add rows and columns of zeros\n\t * at the top, bottom, left and right side of an image tensor.\n\t *\n\t * Input shape:\n\t *   4D tensor with shape:\n\t *   - If `dataFormat` is `\"channelsLast\"`:\n\t *     `[batch, rows, cols, channels]`\n\t *   - If `data_format` is `\"channels_first\"`:\n\t *     `[batch, channels, rows, cols]`.\n\t *\n\t * Output shape:\n\t *   4D with shape:\n\t *   - If `dataFormat` is `\"channelsLast\"`:\n\t *     `[batch, paddedRows, paddedCols, channels]`\n\t *    - If `dataFormat` is `\"channelsFirst\"`:\n\t *     `[batch, channels, paddedRows, paddedCols]`.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Padding', namespace: 'layers'}\n\t */\n\n\tfunction zeroPadding2d(args) {\n\t  return new ZeroPadding2D(args);\n\t} // Pooling Layers.\n\n\t/**\n\t * Average pooling operation for spatial data.\n\t *\n\t * Input shape: `[batchSize, inLength, channels]`\n\t *\n\t * Output shape: `[batchSize, pooledLength, channels]`\n\t *\n\t * `tf.avgPool1d` is an alias.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'}\n\t */\n\n\tfunction averagePooling1d(args) {\n\t  return new AveragePooling1D(args);\n\t}\n\tfunction avgPool1d(args) {\n\t  return averagePooling1d(args);\n\t} // For backwards compatibility.\n\t// See https://github.com/tensorflow/tfjs/issues/152\n\n\tfunction avgPooling1d(args) {\n\t  return averagePooling1d(args);\n\t}\n\t/**\n\t * Average pooling operation for spatial data.\n\t *\n\t * Input shape:\n\t *  - If `dataFormat === CHANNEL_LAST`:\n\t *      4D tensor with shape:\n\t *      `[batchSize, rows, cols, channels]`\n\t *  - If `dataFormat === CHANNEL_FIRST`:\n\t *      4D tensor with shape:\n\t *      `[batchSize, channels, rows, cols]`\n\t *\n\t * Output shape\n\t *  - If `dataFormat === CHANNEL_LAST`:\n\t *      4D tensor with shape:\n\t *      `[batchSize, pooleRows, pooledCols, channels]`\n\t *  - If `dataFormat === CHANNEL_FIRST`:\n\t *      4D tensor with shape:\n\t *      `[batchSize, channels, pooleRows, pooledCols]`\n\t *\n\t * `tf.avgPool2d` is an alias.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'}\n\t */\n\n\tfunction averagePooling2d(args) {\n\t  return new AveragePooling2D(args);\n\t}\n\tfunction avgPool2d(args) {\n\t  return averagePooling2d(args);\n\t} // For backwards compatibility.\n\t// See https://github.com/tensorflow/tfjs/issues/152\n\n\tfunction avgPooling2d(args) {\n\t  return averagePooling2d(args);\n\t}\n\t/**\n\t * Average pooling operation for 3D data.\n\t *\n\t * Input shape\n\t *   - If `dataFormat === channelsLast`:\n\t *       5D tensor with shape:\n\t *       `[batchSize, depths, rows, cols, channels]`\n\t *   - If `dataFormat === channelsFirst`:\n\t *      4D tensor with shape:\n\t *       `[batchSize, channels, depths, rows, cols]`\n\t *\n\t * Output shape\n\t *   - If `dataFormat=channelsLast`:\n\t *       5D tensor with shape:\n\t *       `[batchSize, pooledDepths, pooledRows, pooledCols, channels]`\n\t *   - If `dataFormat=channelsFirst`:\n\t *       5D tensor with shape:\n\t *       `[batchSize, channels, pooledDepths, pooledRows, pooledCols]`\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'}\n\t */\n\n\tfunction averagePooling3d(args) {\n\t  return new AveragePooling3D(args);\n\t}\n\tfunction avgPool3d$1(args) {\n\t  return averagePooling3d(args);\n\t} // For backwards compatibility.\n\t// See https://github.com/tensorflow/tfjs/issues/152\n\n\tfunction avgPooling3d(args) {\n\t  return averagePooling3d(args);\n\t}\n\t/**\n\t * Global average pooling operation for temporal data.\n\t *\n\t * Input Shape: 3D tensor with shape: `[batchSize, steps, features]`.\n\t *\n\t * Output Shape:2D tensor with shape: `[batchSize, features]`.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'}\n\t */\n\n\tfunction globalAveragePooling1d(args) {\n\t  return new GlobalAveragePooling1D(args);\n\t}\n\t/**\n\t * Global average pooling operation for spatial data.\n\t *\n\t * Input shape:\n\t *   - If `dataFormat` is `CHANNEL_LAST`:\n\t *       4D tensor with shape: `[batchSize, rows, cols, channels]`.\n\t *   - If `dataFormat` is `CHANNEL_FIRST`:\n\t *       4D tensor with shape: `[batchSize, channels, rows, cols]`.\n\t *\n\t * Output shape:\n\t *   2D tensor with shape: `[batchSize, channels]`.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'}\n\t */\n\n\tfunction globalAveragePooling2d(args) {\n\t  return new GlobalAveragePooling2D(args);\n\t}\n\t/**\n\t * Global max pooling operation for temporal data.\n\t *\n\t * Input Shape: 3D tensor with shape: `[batchSize, steps, features]`.\n\t *\n\t * Output Shape:2D tensor with shape: `[batchSize, features]`.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'}\n\t */\n\n\tfunction globalMaxPooling1d(args) {\n\t  return new GlobalMaxPooling1D(args);\n\t}\n\t/**\n\t * Global max pooling operation for spatial data.\n\t *\n\t * Input shape:\n\t *   - If `dataFormat` is `CHANNEL_LAST`:\n\t *       4D tensor with shape: `[batchSize, rows, cols, channels]`.\n\t *   - If `dataFormat` is `CHANNEL_FIRST`:\n\t *       4D tensor with shape: `[batchSize, channels, rows, cols]`.\n\t *\n\t * Output shape:\n\t *   2D tensor with shape: `[batchSize, channels]`.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'}\n\t */\n\n\tfunction globalMaxPooling2d(args) {\n\t  return new GlobalMaxPooling2D(args);\n\t}\n\t/**\n\t * Max pooling operation for temporal data.\n\t *\n\t * Input shape:  `[batchSize, inLength, channels]`\n\t *\n\t * Output shape: `[batchSize, pooledLength, channels]`\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'}\n\t */\n\n\tfunction maxPooling1d(args) {\n\t  return new MaxPooling1D(args);\n\t}\n\t/**\n\t * Max pooling operation for spatial data.\n\t *\n\t * Input shape\n\t *   - If `dataFormat === CHANNEL_LAST`:\n\t *       4D tensor with shape:\n\t *       `[batchSize, rows, cols, channels]`\n\t *   - If `dataFormat === CHANNEL_FIRST`:\n\t *      4D tensor with shape:\n\t *       `[batchSize, channels, rows, cols]`\n\t *\n\t * Output shape\n\t *   - If `dataFormat=CHANNEL_LAST`:\n\t *       4D tensor with shape:\n\t *       `[batchSize, pooleRows, pooledCols, channels]`\n\t *   - If `dataFormat=CHANNEL_FIRST`:\n\t *       4D tensor with shape:\n\t *       `[batchSize, channels, pooleRows, pooledCols]`\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'}\n\t */\n\n\tfunction maxPooling2d(args) {\n\t  return new MaxPooling2D(args);\n\t}\n\t/**\n\t * Max pooling operation for 3D data.\n\t *\n\t * Input shape\n\t *   - If `dataFormat === channelsLast`:\n\t *       5D tensor with shape:\n\t *       `[batchSize, depths, rows, cols, channels]`\n\t *   - If `dataFormat === channelsFirst`:\n\t *      5D tensor with shape:\n\t *       `[batchSize, channels, depths, rows, cols]`\n\t *\n\t * Output shape\n\t *   - If `dataFormat=channelsLast`:\n\t *       5D tensor with shape:\n\t *       `[batchSize, pooledDepths, pooledRows, pooledCols, channels]`\n\t *   - If `dataFormat=channelsFirst`:\n\t *       5D tensor with shape:\n\t *       `[batchSize, channels, pooledDepths, pooledRows, pooledCols]`\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'}\n\t */\n\n\tfunction maxPooling3d(args) {\n\t  return new MaxPooling3D(args);\n\t} // Recurrent Layers.\n\n\t/**\n\t * Gated Recurrent Unit - Cho et al. 2014.\n\t *\n\t * This is an `RNN` layer consisting of one `GRUCell`. However, unlike\n\t * the underlying `GRUCell`, the `apply` method of `SimpleRNN` operates\n\t * on a sequence of inputs. The shape of the input (not including the first,\n\t * batch dimension) needs to be at least 2-D, with the first dimension being\n\t * time steps. For example:\n\t *\n\t * ```js\n\t * const rnn = tf.layers.gru({units: 8, returnSequences: true});\n\t *\n\t * // Create an input with 10 time steps.\n\t * const input = tf.input({shape: [10, 20]});\n\t * const output = rnn.apply(input);\n\t *\n\t * console.log(JSON.stringify(output.shape));\n\t * // [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the\n\t * // same as the sequence length of `input`, due to `returnSequences`: `true`;\n\t * // 3rd dimension is the `GRUCell`'s number of units.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'}\n\t */\n\n\tfunction gru(args) {\n\t  return new GRU(args);\n\t}\n\t/**\n\t * Cell class for `GRU`.\n\t *\n\t * `GRUCell` is distinct from the `RNN` subclass `GRU` in that its\n\t * `apply` method takes the input data of only a single time step and returns\n\t * the cell's output at the time step, while `GRU` takes the input data\n\t * over a number of time steps. For example:\n\t *\n\t * ```js\n\t * const cell = tf.layers.gruCell({units: 2});\n\t * const input = tf.input({shape: [10]});\n\t * const output = cell.apply(input);\n\t *\n\t * console.log(JSON.stringify(output.shape));\n\t * // [null, 10]: This is the cell's output at a single time step. The 1st\n\t * // dimension is the unknown batch size.\n\t * ```\n\t *\n\t * Instance(s) of `GRUCell` can be used to construct `RNN` layers. The\n\t * most typical use of this workflow is to combine a number of cells into a\n\t * stacked RNN cell (i.e., `StackedRNNCell` internally) and use it to create an\n\t * RNN. For example:\n\t *\n\t * ```js\n\t * const cells = [\n\t *   tf.layers.gruCell({units: 4}),\n\t *   tf.layers.gruCell({units: 8}),\n\t * ];\n\t * const rnn = tf.layers.rnn({cell: cells, returnSequences: true});\n\t *\n\t * // Create an input with 10 time steps and a length-20 vector at each step.\n\t * const input = tf.input({shape: [10, 20]});\n\t * const output = rnn.apply(input);\n\t *\n\t * console.log(JSON.stringify(output.shape));\n\t * // [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the\n\t * // same as the sequence length of `input`, due to `returnSequences`: `true`;\n\t * // 3rd dimension is the last `gruCell`'s number of units.\n\t * ```\n\t *\n\t * To create an `RNN` consisting of only *one* `GRUCell`, use the\n\t * `tf.layers.gru`.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'}\n\t */\n\n\tfunction gruCell(args) {\n\t  return new GRUCell(args);\n\t}\n\t/**\n\t * Long-Short Term Memory layer - Hochreiter 1997.\n\t *\n\t * This is an `RNN` layer consisting of one `LSTMCell`. However, unlike\n\t * the underlying `LSTMCell`, the `apply` method of `LSTM` operates\n\t * on a sequence of inputs. The shape of the input (not including the first,\n\t * batch dimension) needs to be at least 2-D, with the first dimension being\n\t * time steps. For example:\n\t *\n\t * ```js\n\t * const lstm = tf.layers.lstm({units: 8, returnSequences: true});\n\t *\n\t * // Create an input with 10 time steps.\n\t * const input = tf.input({shape: [10, 20]});\n\t * const output = lstm.apply(input);\n\t *\n\t * console.log(JSON.stringify(output.shape));\n\t * // [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the\n\t * // same as the sequence length of `input`, due to `returnSequences`: `true`;\n\t * // 3rd dimension is the `LSTMCell`'s number of units.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'}\n\t */\n\n\tfunction lstm(args) {\n\t  return new LSTM(args);\n\t}\n\t/**\n\t * Cell class for `LSTM`.\n\t *\n\t * `LSTMCell` is distinct from the `RNN` subclass `LSTM` in that its\n\t * `apply` method takes the input data of only a single time step and returns\n\t * the cell's output at the time step, while `LSTM` takes the input data\n\t * over a number of time steps. For example:\n\t *\n\t * ```js\n\t * const cell = tf.layers.lstmCell({units: 2});\n\t * const input = tf.input({shape: [10]});\n\t * const output = cell.apply(input);\n\t *\n\t * console.log(JSON.stringify(output.shape));\n\t * // [null, 10]: This is the cell's output at a single time step. The 1st\n\t * // dimension is the unknown batch size.\n\t * ```\n\t *\n\t * Instance(s) of `LSTMCell` can be used to construct `RNN` layers. The\n\t * most typical use of this workflow is to combine a number of cells into a\n\t * stacked RNN cell (i.e., `StackedRNNCell` internally) and use it to create an\n\t * RNN. For example:\n\t *\n\t * ```js\n\t * const cells = [\n\t *   tf.layers.lstmCell({units: 4}),\n\t *   tf.layers.lstmCell({units: 8}),\n\t * ];\n\t * const rnn = tf.layers.rnn({cell: cells, returnSequences: true});\n\t *\n\t * // Create an input with 10 time steps and a length-20 vector at each step.\n\t * const input = tf.input({shape: [10, 20]});\n\t * const output = rnn.apply(input);\n\t *\n\t * console.log(JSON.stringify(output.shape));\n\t * // [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the\n\t * // same as the sequence length of `input`, due to `returnSequences`: `true`;\n\t * // 3rd dimension is the last `lstmCell`'s number of units.\n\t * ```\n\t *\n\t * To create an `RNN` consisting of only *one* `LSTMCell`, use the\n\t * `tf.layers.lstm`.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'}\n\t */\n\n\tfunction lstmCell(args) {\n\t  return new LSTMCell(args);\n\t}\n\t/**\n\t * Fully-connected RNN where the output is to be fed back to input.\n\t *\n\t * This is an `RNN` layer consisting of one `SimpleRNNCell`. However, unlike\n\t * the underlying `SimpleRNNCell`, the `apply` method of `SimpleRNN` operates\n\t * on a sequence of inputs. The shape of the input (not including the first,\n\t * batch dimension) needs to be at least 2-D, with the first dimension being\n\t * time steps. For example:\n\t *\n\t * ```js\n\t * const rnn = tf.layers.simpleRNN({units: 8, returnSequences: true});\n\t *\n\t * // Create an input with 10 time steps.\n\t * const input = tf.input({shape: [10, 20]});\n\t * const output = rnn.apply(input);\n\t *\n\t * console.log(JSON.stringify(output.shape));\n\t * // [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the\n\t * // same as the sequence length of `input`, due to `returnSequences`: `true`;\n\t * // 3rd dimension is the `SimpleRNNCell`'s number of units.\n\t * ```\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'}\n\t */\n\n\tfunction simpleRNN(args) {\n\t  return new SimpleRNN(args);\n\t}\n\t/**\n\t * Cell class for `SimpleRNN`.\n\t *\n\t * `SimpleRNNCell` is distinct from the `RNN` subclass `SimpleRNN` in that its\n\t * `apply` method takes the input data of only a single time step and returns\n\t * the cell's output at the time step, while `SimpleRNN` takes the input data\n\t * over a number of time steps. For example:\n\t *\n\t * ```js\n\t * const cell = tf.layers.simpleRNNCell({units: 2});\n\t * const input = tf.input({shape: [10]});\n\t * const output = cell.apply(input);\n\t *\n\t * console.log(JSON.stringify(output.shape));\n\t * // [null, 10]: This is the cell's output at a single time step. The 1st\n\t * // dimension is the unknown batch size.\n\t * ```\n\t *\n\t * Instance(s) of `SimpleRNNCell` can be used to construct `RNN` layers. The\n\t * most typical use of this workflow is to combine a number of cells into a\n\t * stacked RNN cell (i.e., `StackedRNNCell` internally) and use it to create an\n\t * RNN. For example:\n\t *\n\t * ```js\n\t * const cells = [\n\t *   tf.layers.simpleRNNCell({units: 4}),\n\t *   tf.layers.simpleRNNCell({units: 8}),\n\t * ];\n\t * const rnn = tf.layers.rnn({cell: cells, returnSequences: true});\n\t *\n\t * // Create an input with 10 time steps and a length-20 vector at each step.\n\t * const input = tf.input({shape: [10, 20]});\n\t * const output = rnn.apply(input);\n\t *\n\t * console.log(JSON.stringify(output.shape));\n\t * // [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the\n\t * // same as the sequence length of `input`, due to `returnSequences`: `true`;\n\t * // 3rd dimension is the last `SimpleRNNCell`'s number of units.\n\t * ```\n\t *\n\t * To create an `RNN` consisting of only *one* `SimpleRNNCell`, use the\n\t * `tf.layers.simpleRNN`.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'}\n\t */\n\n\tfunction simpleRNNCell(args) {\n\t  return new SimpleRNNCell(args);\n\t}\n\t/**\n\t * Convolutional LSTM layer - Xingjian Shi 2015.\n\t *\n\t * This is an `ConvRNN2D` layer consisting of one `ConvLSTM2DCell`. However,\n\t * unlike the underlying `ConvLSTM2DCell`, the `apply` method of `ConvLSTM2D`\n\t * operates on a sequence of inputs. The shape of the input (not including the\n\t * first, batch dimension) needs to be 4-D, with the first dimension being time\n\t * steps. For example:\n\t *\n\t * ```js\n\t * const filters = 3;\n\t * const kernelSize = 3;\n\t *\n\t * const batchSize = 4;\n\t * const sequenceLength = 2;\n\t * const size = 5;\n\t * const channels = 3;\n\t *\n\t * const inputShape = [batchSize, sequenceLength, size, size, channels];\n\t * const input = tf.ones(inputShape);\n\t *\n\t * const layer = tf.layers.convLstm2d({filters, kernelSize});\n\t *\n\t * const output = layer.apply(input);\n\t * ```\n\t */\n\n\t/** @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'} */\n\n\tfunction convLstm2d(args) {\n\t  return new ConvLSTM2D(args);\n\t}\n\t/**\n\t * Cell class for `ConvLSTM2D`.\n\t *\n\t * `ConvLSTM2DCell` is distinct from the `ConvRNN2D` subclass `ConvLSTM2D` in\n\t * that its `call` method takes the input data of only a single time step and\n\t * returns the cell's output at the time step, while `ConvLSTM2D` takes the\n\t * input data over a number of time steps. For example:\n\t *\n\t * ```js\n\t * const filters = 3;\n\t * const kernelSize = 3;\n\t *\n\t * const sequenceLength = 1;\n\t * const size = 5;\n\t * const channels = 3;\n\t *\n\t * const inputShape = [sequenceLength, size, size, channels];\n\t * const input = tf.ones(inputShape);\n\t *\n\t * const cell = tf.layers.convLstm2dCell({filters, kernelSize});\n\t *\n\t * cell.build(input.shape);\n\t *\n\t * const outputSize = size - kernelSize + 1;\n\t * const outShape = [sequenceLength, outputSize, outputSize, filters];\n\t *\n\t * const initialH = tf.zeros(outShape);\n\t * const initialC = tf.zeros(outShape);\n\t *\n\t * const [o, h, c] = cell.call([input, initialH, initialC], {});\n\t * ```\n\t */\n\n\t/** @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'} */\n\n\tfunction convLstm2dCell(args) {\n\t  return new ConvLSTM2DCell(args);\n\t}\n\t/**\n\t * Base class for recurrent layers.\n\t *\n\t * Input shape:\n\t *   3D tensor with shape `[batchSize, timeSteps, inputDim]`.\n\t *\n\t * Output shape:\n\t *   - if `returnState`, an Array of tensors (i.e., `tf.Tensor`s). The first\n\t *     tensor is the output. The remaining tensors are the states at the\n\t *     last time step, each with shape `[batchSize, units]`.\n\t *   - if `returnSequences`, the output will have shape\n\t *     `[batchSize, timeSteps, units]`.\n\t *   - else, the output will have shape `[batchSize, units]`.\n\t *\n\t * Masking:\n\t *   This layer supports masking for input data with a variable number\n\t *   of timesteps. To introduce masks to your data,\n\t *   use an embedding layer with the `mask_zero` parameter\n\t *   set to `True`.\n\t *\n\t * Notes on using statefulness in RNNs:\n\t *   You can set RNN layers to be 'stateful', which means that the states\n\t *   computed for the samples in one batch will be reused as initial states\n\t *   for the samples in the next batch. This assumes a one-to-one mapping\n\t *   between samples in different successive batches.\n\t *\n\t *   To enable statefulness:\n\t *     - specify `stateful: true` in the layer constructor.\n\t *     - specify a fixed batch size for your model, by passing\n\t *       if sequential model:\n\t *         `batchInputShape=[...]` to the first layer in your model.\n\t *       else for functional model with 1 or more Input layers:\n\t *         `batchShape=[...]` to all the first layers in your model.\n\t *       This is the expected shape of your inputs *including the batch size*.\n\t *       It should be a tuple of integers, e.g. `(32, 10, 100)`.\n\t *     - specify `shuffle=False` when calling fit().\n\t *\n\t *   To reset the states of your model, call `.resetStates()` on either\n\t *   a specific layer, or on your entire model.\n\t *\n\t * Note on specifying the initial state of RNNs\n\t *   You can specify the initial state of RNN layers symbolically by\n\t *   calling them with the option `initialState`. The value of\n\t *   `initialState` should be a tensor or list of tensors representing\n\t *   the initial state of the RNN layer.\n\t *\n\t *   You can specify the initial state of RNN layers numerically by\n\t *   calling `resetStates` with the keyword argument `states`. The value of\n\t *   `states` should be a numpy array or list of numpy arrays representing\n\t *   the initial state of the RNN layer.\n\t *\n\t * Note on passing external constants to RNNs\n\t *   You can pass \"external\" constants to the cell using the `constants`\n\t *   keyword argument of `RNN.call` method. This requires that the `cell.call`\n\t *   method accepts the same keyword argument `constants`. Such constants\n\t *   can be used to conditon the cell transformation on additional static inputs\n\t *   (not changing over time), a.k.a an attention mechanism.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'}\n\t */\n\n\tfunction rnn$1(args) {\n\t  return new RNN(args);\n\t}\n\t/**\n\t * Wrapper allowing a stack of RNN cells to behave as a single cell.\n\t *\n\t * Used to implement efficient stacked RNNs.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'}\n\t */\n\n\tfunction stackedRNNCells(args) {\n\t  return new StackedRNNCells(args);\n\t} // Wrapper Layers.\n\n\t/** @doc {heading: 'Layers', subheading: 'Wrapper', namespace: 'layers'} */\n\n\tfunction bidirectional(args) {\n\t  return new Bidirectional(args);\n\t}\n\t/**\n\t * This wrapper applies a layer to every temporal slice of an input.\n\t *\n\t * The input should be at least 3D,  and the dimension of the index `1` will be\n\t * considered to be the temporal dimension.\n\t *\n\t * Consider a batch of 32 samples, where each sample is a sequence of 10 vectors\n\t * of 16 dimensions. The batch input shape of the layer is then `[32,  10,\n\t * 16]`, and the `inputShape`, not including the sample dimension, is\n\t * `[10, 16]`.\n\t *\n\t * You can then use `TimeDistributed` to apply a `Dense` layer to each of the 10\n\t * timesteps, independently:\n\t *\n\t * ```js\n\t * const model = tf.sequential();\n\t * model.add(tf.layers.timeDistributed({\n\t *   layer: tf.layers.dense({units: 8}),\n\t *   inputShape: [10, 16],\n\t * }));\n\t *\n\t * // Now model.outputShape = [null, 10, 8].\n\t * // The output will then have shape `[32, 10, 8]`.\n\t *\n\t * // In subsequent layers, there is no need for `inputShape`:\n\t * model.add(tf.layers.timeDistributed({layer: tf.layers.dense({units: 32})}));\n\t * console.log(JSON.stringify(model.outputs[0].shape));\n\t * // Now model.outputShape = [null, 10, 32].\n\t * ```\n\t *\n\t * The output will then have shape `[32, 10, 32]`.\n\t *\n\t * `TimeDistributed` can be used with arbitrary layers, not just `Dense`, for\n\t * instance a `Conv2D` layer.\n\t *\n\t * ```js\n\t * const model = tf.sequential();\n\t * model.add(tf.layers.timeDistributed({\n\t *   layer: tf.layers.conv2d({filters: 64, kernelSize: [3, 3]}),\n\t *   inputShape: [10, 299, 299, 3],\n\t * }));\n\t * console.log(JSON.stringify(model.outputs[0].shape));\n\t * ```\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Wrapper', namespace: 'layers'}\n\t */\n\n\tfunction timeDistributed(args) {\n\t  return new TimeDistributed(args);\n\t} // Aliases for pooling.\n\n\tvar globalMaxPool1d = globalMaxPooling1d;\n\tvar globalMaxPool2d = globalMaxPooling2d;\n\tvar maxPool1d = maxPooling1d;\n\tvar maxPool2d = maxPooling2d;\n\t/**\n\t * Apply additive zero-centered Gaussian noise.\n\t *\n\t * As it is a regularization layer, it is only active at training time.\n\t *\n\t * This is useful to mitigate overfitting\n\t * (you could see it as a form of random data augmentation).\n\t * Gaussian Noise (GS) is a natural choice as corruption process\n\t * for real valued inputs.\n\t *\n\t * # Arguments\n\t *     stddev: float, standard deviation of the noise distribution.\n\t *\n\t * # Input shape\n\t *         Arbitrary. Use the keyword argument `input_shape`\n\t *         (tuple of integers, does not include the samples axis)\n\t *         when using this layer as the first layer in a model.\n\t *\n\t * # Output shape\n\t *         Same shape as input.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Noise', namespace: 'layers'}\n\t */\n\n\tfunction gaussianNoise(args) {\n\t  return new GaussianNoise(args);\n\t}\n\t/**\n\t * Apply multiplicative 1-centered Gaussian noise.\n\t *\n\t * As it is a regularization layer, it is only active at training time.\n\t *\n\t * Arguments:\n\t *   - `rate`: float, drop probability (as with `Dropout`).\n\t *     The multiplicative noise will have\n\t *     standard deviation `sqrt(rate / (1 - rate))`.\n\t *\n\t * Input shape:\n\t *   Arbitrary. Use the keyword argument `inputShape`\n\t *   (tuple of integers, does not include the samples axis)\n\t *   when using this layer as the first layer in a model.\n\t *\n\t * Output shape:\n\t *   Same shape as input.\n\t *\n\t * References:\n\t *   - [Dropout: A Simple Way to Prevent Neural Networks from Overfitting](\n\t *      http://www.cs.toronto.edu/~rsalakhu/papers/srivastava14a.pdf)\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Noise', namespace: 'layers'}\n\t */\n\n\tfunction gaussianDropout(args) {\n\t  return new GaussianDropout(args);\n\t}\n\t/**\n\t * Applies Alpha Dropout to the input.\n\t *\n\t * As it is a regularization layer, it is only active at training time.\n\t *\n\t * Alpha Dropout is a `Dropout` that keeps mean and variance of inputs\n\t * to their original values, in order to ensure the self-normalizing property\n\t * even after this dropout.\n\t * Alpha Dropout fits well to Scaled Exponential Linear Units\n\t * by randomly setting activations to the negative saturation value.\n\t *\n\t * Arguments:\n\t *   - `rate`: float, drop probability (as with `Dropout`).\n\t *     The multiplicative noise will have\n\t *     standard deviation `sqrt(rate / (1 - rate))`.\n\t *   - `noise_shape`: A 1-D `Tensor` of type `int32`, representing the\n\t *     shape for randomly generated keep/drop flags.\n\t *\n\t * Input shape:\n\t *   Arbitrary. Use the keyword argument `inputShape`\n\t *   (tuple of integers, does not include the samples axis)\n\t *   when using this layer as the first layer in a model.\n\t *\n\t * Output shape:\n\t *   Same shape as input.\n\t *\n\t * References:\n\t *   - [Self-Normalizing Neural Networks](https://arxiv.org/abs/1706.02515)\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Noise', namespace: 'layers'}\n\t */\n\n\tfunction alphaDropout(args) {\n\t  return new AlphaDropout(args);\n\t}\n\t/**\n\t * Masks a sequence by using a mask value to skip timesteps.\n\t *\n\t * If all features for a given sample timestep are equal to `mask_value`,\n\t * then the sample timestep will be masked (skipped) in all downstream layers\n\t * (as long as they support masking).\n\t *\n\t * If any downstream layer does not support masking yet receives such\n\t * an input mask, an exception will be raised.\n\t *\n\t * Arguments:\n\t *   - `maskValue`: Either None or mask value to skip.\n\t *\n\t * Input shape:\n\t *   Arbitrary. Use the keyword argument `inputShape`\n\t *   (tuple of integers, does not include the samples axis)\n\t *   when using this layer as the first layer in a model.\n\t *\n\t * Output shape:\n\t *   Same shape as input.\n\t *\n\t * @doc {heading: 'Layers', subheading: 'Mask', namespace: 'layers'}\n\t */\n\n\tfunction masking(args) {\n\t  return new Masking(args);\n\t}\n\n\tvar exports_layers = {\n\t\t__proto__: null,\n\t\tinputLayer: inputLayer,\n\t\telu: elu$2,\n\t\treLU: reLU,\n\t\tleakyReLU: leakyReLU,\n\t\tprelu: prelu$1,\n\t\tsoftmax: softmax$1,\n\t\tthresholdedReLU: thresholdedReLU,\n\t\tconv1d: conv1d$2,\n\t\tconv2d: conv2d$3,\n\t\tconv2dTranspose: conv2dTranspose$1,\n\t\tconv3d: conv3d$2,\n\t\tseparableConv2d: separableConv2d$1,\n\t\tcropping2D: cropping2D,\n\t\tupSampling2d: upSampling2d,\n\t\tdepthwiseConv2d: depthwiseConv2d$3,\n\t\tactivation: activation,\n\t\tdense: dense,\n\t\tdropout: dropout$2,\n\t\tspatialDropout1d: spatialDropout1d,\n\t\tflatten: flatten$2,\n\t\trepeatVector: repeatVector,\n\t\treshape: reshape$1,\n\t\tpermute: permute,\n\t\tembedding: embedding,\n\t\tadd: add$3,\n\t\taverage: average$1,\n\t\tconcatenate: concatenate$2,\n\t\tmaximum: maximum$2,\n\t\tminimum: minimum$2,\n\t\tmultiply: multiply$1,\n\t\tdot: dot$2,\n\t\tbatchNormalization: batchNormalization$1,\n\t\tlayerNormalization: layerNormalization,\n\t\tzeroPadding2d: zeroPadding2d,\n\t\taveragePooling1d: averagePooling1d,\n\t\tavgPool1d: avgPool1d,\n\t\tavgPooling1d: avgPooling1d,\n\t\taveragePooling2d: averagePooling2d,\n\t\tavgPool2d: avgPool2d,\n\t\tavgPooling2d: avgPooling2d,\n\t\taveragePooling3d: averagePooling3d,\n\t\tavgPool3d: avgPool3d$1,\n\t\tavgPooling3d: avgPooling3d,\n\t\tglobalAveragePooling1d: globalAveragePooling1d,\n\t\tglobalAveragePooling2d: globalAveragePooling2d,\n\t\tglobalMaxPooling1d: globalMaxPooling1d,\n\t\tglobalMaxPooling2d: globalMaxPooling2d,\n\t\tmaxPooling1d: maxPooling1d,\n\t\tmaxPooling2d: maxPooling2d,\n\t\tmaxPooling3d: maxPooling3d,\n\t\tgru: gru,\n\t\tgruCell: gruCell,\n\t\tlstm: lstm,\n\t\tlstmCell: lstmCell,\n\t\tsimpleRNN: simpleRNN,\n\t\tsimpleRNNCell: simpleRNNCell,\n\t\tconvLstm2d: convLstm2d,\n\t\tconvLstm2dCell: convLstm2dCell,\n\t\trnn: rnn$1,\n\t\tstackedRNNCells: stackedRNNCells,\n\t\tbidirectional: bidirectional,\n\t\ttimeDistributed: timeDistributed,\n\t\tglobalMaxPool1d: globalMaxPool1d,\n\t\tglobalMaxPool2d: globalMaxPool2d,\n\t\tmaxPool1d: maxPool1d,\n\t\tmaxPool2d: maxPool2d,\n\t\tLayer: Layer,\n\t\tRNN: RNN,\n\t\tRNNCell: RNNCell,\n\t\tinput: input,\n\t\tgaussianNoise: gaussianNoise,\n\t\tgaussianDropout: gaussianDropout,\n\t\talphaDropout: alphaDropout,\n\t\tmasking: masking\n\t};\n\n\t/**\n\t * Binary accuracy metric function.\n\t *\n\t * `yTrue` and `yPred` can have 0-1 values. Example:\n\t * ```js\n\t * const x = tf.tensor2d([[1, 1, 1, 1], [0, 0, 0, 0]], [2, 4]);\n\t * const y = tf.tensor2d([[1, 0, 1, 0], [0, 0, 0, 1]], [2, 4]);\n\t * const accuracy = tf.metrics.binaryAccuracy(x, y);\n\t * accuracy.print();\n\t * ```\n\t *\n\t * `yTrue` and `yPred` can also have floating-number values between 0 and 1, in\n\t * which case the values will be thresholded at 0.5 to yield 0-1 values (i.e.,\n\t * a value >= 0.5 and <= 1.0 is interpreted as 1.\n\t * )\n\t * Example:\n\t * ```js\n\t * const x = tf.tensor1d([1, 1, 1, 1, 0, 0, 0, 0]);\n\t * const y = tf.tensor1d([0.2, 0.4, 0.6, 0.8, 0.2, 0.3, 0.4, 0.7]);\n\t * const accuracy = tf.metrics.binaryAccuracy(x, y);\n\t * accuracy.print();\n\t * ```\n\t *\n\t * @param yTrue Binary Tensor of truth.\n\t * @param yPred Binary Tensor of prediction.\n\t * @return Accuracy Tensor.\n\t *\n\t * @doc {heading: 'Metrics', namespace: 'metrics'}\n\t */\n\n\tfunction binaryAccuracy$1(yTrue, yPred) {\n\t  return binaryAccuracy(yTrue, yPred);\n\t}\n\t/**\n\t * Binary crossentropy metric function.\n\t *\n\t * Example:\n\t * ```js\n\t * const x = tf.tensor2d([[0], [1], [1], [1]]);\n\t * const y = tf.tensor2d([[0], [0], [0.5], [1]]);\n\t * const crossentropy = tf.metrics.binaryCrossentropy(x, y);\n\t * crossentropy.print();\n\t * ```\n\t *\n\t * @param yTrue Binary Tensor of truth.\n\t * @param yPred Binary Tensor of prediction, probabilities for the `1` case.\n\t * @return Accuracy Tensor.\n\t *\n\t * @doc {heading: 'Metrics', namespace: 'metrics'}\n\t */\n\n\tfunction binaryCrossentropy$2(yTrue, yPred) {\n\t  return binaryCrossentropy$1(yTrue, yPred);\n\t}\n\t/**\n\t * Sparse categorical accuracy metric function.\n\t *\n\t * Example:\n\t * ```js\n\t *\n\t * const yTrue = tf.tensor1d([1, 1, 2, 2, 0]);\n\t * const yPred = tf.tensor2d(\n\t *      [[0, 1, 0], [1, 0, 0], [0, 0.4, 0.6], [0, 0.6, 0.4], [0.7, 0.3, 0]]);\n\t * const crossentropy = tf.metrics.sparseCategoricalAccuracy(yTrue, yPred);\n\t * crossentropy.print();\n\t * ```\n\t *\n\t * @param yTrue True labels: indices.\n\t * @param yPred Predicted probabilities or logits.\n\t * @returns Accuracy tensor.\n\t *\n\t * @doc {heading: 'Metrics', namespace: 'metrics'}\n\t */\n\n\tfunction sparseCategoricalAccuracy$1(yTrue, yPred) {\n\t  return sparseCategoricalAccuracy(yTrue, yPred);\n\t}\n\t/**\n\t * Categorical accuracy metric function.\n\t *\n\t * Example:\n\t * ```js\n\t * const x = tf.tensor2d([[0, 0, 0, 1], [0, 0, 0, 1]]);\n\t * const y = tf.tensor2d([[0.1, 0.8, 0.05, 0.05], [0.1, 0.05, 0.05, 0.8]]);\n\t * const accuracy = tf.metrics.categoricalAccuracy(x, y);\n\t * accuracy.print();\n\t * ```\n\t *\n\t * @param yTrue Binary Tensor of truth: one-hot encoding of categories.\n\t * @param yPred Binary Tensor of prediction: probabilities or logits for the\n\t *   same categories as in `yTrue`.\n\t * @return Accuracy Tensor.\n\t *\n\t * @doc {heading: 'Metrics', namespace: 'metrics'}\n\t */\n\n\tfunction categoricalAccuracy$1(yTrue, yPred) {\n\t  return categoricalAccuracy(yTrue, yPred);\n\t}\n\t/**\n\t * Categorical crossentropy between an output tensor and a target tensor.\n\t *\n\t * @param target A tensor of the same shape as `output`.\n\t * @param output A tensor resulting from a softmax (unless `fromLogits` is\n\t *  `true`, in which case `output` is expected to be the logits).\n\t * @param fromLogits Boolean, whether `output` is the result of a softmax, or is\n\t *   a tensor of logits.\n\t *\n\t * @doc {heading: 'Metrics', namespace: 'metrics'}\n\t */\n\n\tfunction categoricalCrossentropy$2(yTrue, yPred) {\n\t  return categoricalCrossentropy$1(yTrue, yPred);\n\t}\n\t/**\n\t * Computes the precision of the predictions with respect to the labels.\n\t *\n\t * Example:\n\t * ```js\n\t * const x = tf.tensor2d(\n\t *    [\n\t *      [0, 0, 0, 1],\n\t *      [0, 1, 0, 0],\n\t *      [0, 0, 0, 1],\n\t *      [1, 0, 0, 0],\n\t *      [0, 0, 1, 0]\n\t *    ]\n\t * );\n\t *\n\t * const y = tf.tensor2d(\n\t *    [\n\t *      [0, 0, 1, 0],\n\t *      [0, 1, 0, 0],\n\t *      [0, 0, 0, 1],\n\t *      [0, 1, 0, 0],\n\t *      [0, 1, 0, 0]\n\t *    ]\n\t * );\n\t *\n\t * const precision = tf.metrics.precision(x, y);\n\t * precision.print();\n\t * ```\n\t *\n\t * @param yTrue The ground truth values. Expected to be contain only 0-1 values.\n\t * @param yPred The predicted values. Expected to be contain only 0-1 values.\n\t * @return Precision Tensor.\n\t *\n\t * @doc {heading: 'Metrics', namespace: 'metrics'}\n\t */\n\n\tfunction precision$1(yTrue, yPred) {\n\t  return precision(yTrue, yPred);\n\t}\n\t/**\n\t * Computes the recall of the predictions with respect to the labels.\n\t *\n\t * Example:\n\t * ```js\n\t * const x = tf.tensor2d(\n\t *    [\n\t *      [0, 0, 0, 1],\n\t *      [0, 1, 0, 0],\n\t *      [0, 0, 0, 1],\n\t *      [1, 0, 0, 0],\n\t *      [0, 0, 1, 0]\n\t *    ]\n\t * );\n\t *\n\t * const y = tf.tensor2d(\n\t *    [\n\t *      [0, 0, 1, 0],\n\t *      [0, 1, 0, 0],\n\t *      [0, 0, 0, 1],\n\t *      [0, 1, 0, 0],\n\t *      [0, 1, 0, 0]\n\t *    ]\n\t * );\n\t *\n\t * const recall = tf.metrics.recall(x, y);\n\t * recall.print();\n\t * ```\n\t *\n\t * @param yTrue The ground truth values. Expected to be contain only 0-1 values.\n\t * @param yPred The predicted values. Expected to be contain only 0-1 values.\n\t * @return Recall Tensor.\n\t *\n\t * @doc {heading: 'Metrics', namespace: 'metrics'}\n\t */\n\n\tfunction recall$1(yTrue, yPred) {\n\t  return recall(yTrue, yPred);\n\t}\n\t/**\n\t * Loss or metric function: Cosine proximity.\n\t *\n\t * Mathematically, cosine proximity is defined as:\n\t *   `-sum(l2Normalize(yTrue) * l2Normalize(yPred))`,\n\t * wherein `l2Normalize()` normalizes the L2 norm of the input to 1 and `*`\n\t * represents element-wise multiplication.\n\t *\n\t * ```js\n\t * const yTrue = tf.tensor2d([[1, 0], [1, 0]]);\n\t * const yPred = tf.tensor2d([[1 / Math.sqrt(2), 1 / Math.sqrt(2)], [0, 1]]);\n\t * const proximity = tf.metrics.cosineProximity(yTrue, yPred);\n\t * proximity.print();\n\t * ```\n\t *\n\t * @param yTrue Truth Tensor.\n\t * @param yPred Prediction Tensor.\n\t * @return Cosine proximity Tensor.\n\t *\n\t * @doc {heading: 'Metrics', namespace: 'metrics'}\n\t */\n\n\tfunction cosineProximity$1(yTrue, yPred) {\n\t  return cosineProximity(yTrue, yPred);\n\t}\n\t/**\n\t * Loss or metric function: Mean absolute error.\n\t *\n\t * Mathematically, mean absolute error is defined as:\n\t *   `mean(abs(yPred - yTrue))`,\n\t * wherein the `mean` is applied over feature dimensions.\n\t *\n\t * ```js\n\t * const yTrue = tf.tensor2d([[0, 1], [0, 0], [2, 3]]);\n\t * const yPred = tf.tensor2d([[0, 1], [0, 1], [-2, -3]]);\n\t * const mse = tf.metrics.meanAbsoluteError(yTrue, yPred);\n\t * mse.print();\n\t * ```\n\t *\n\t * @param yTrue Truth Tensor.\n\t * @param yPred Prediction Tensor.\n\t * @return Mean absolute error Tensor.\n\t *\n\t * @doc {heading: 'Metrics', namespace: 'metrics'}\n\t */\n\n\tfunction meanAbsoluteError$1(yTrue, yPred) {\n\t  return meanAbsoluteError(yTrue, yPred);\n\t}\n\t/**\n\t * Loss or metric function: Mean absolute percentage error.\n\t *\n\t * ```js\n\t * const yTrue = tf.tensor2d([[0, 1], [10, 20]]);\n\t * const yPred = tf.tensor2d([[0, 1], [11, 24]]);\n\t * const mse = tf.metrics.meanAbsolutePercentageError(yTrue, yPred);\n\t * mse.print();\n\t * ```\n\t *\n\t * Aliases: `tf.metrics.MAPE`, `tf.metrics.mape`.\n\t *\n\t * @param yTrue Truth Tensor.\n\t * @param yPred Prediction Tensor.\n\t * @return Mean absolute percentage error Tensor.\n\t *\n\t * @doc {heading: 'Metrics', namespace: 'metrics'}\n\t */\n\n\tfunction meanAbsolutePercentageError$1(yTrue, yPred) {\n\t  return meanAbsolutePercentageError(yTrue, yPred);\n\t}\n\tfunction MAPE$2(yTrue, yPred) {\n\t  return meanAbsolutePercentageError(yTrue, yPred);\n\t}\n\tfunction mape$2(yTrue, yPred) {\n\t  return meanAbsolutePercentageError(yTrue, yPred);\n\t}\n\t/**\n\t * Loss or metric function: Mean squared error.\n\t *\n\t * ```js\n\t * const yTrue = tf.tensor2d([[0, 1], [3, 4]]);\n\t * const yPred = tf.tensor2d([[0, 1], [-3, -4]]);\n\t * const mse = tf.metrics.meanSquaredError(yTrue, yPred);\n\t * mse.print();\n\t * ```\n\t *\n\t * Aliases: `tf.metrics.MSE`, `tf.metrics.mse`.\n\t *\n\t * @param yTrue Truth Tensor.\n\t * @param yPred Prediction Tensor.\n\t * @return Mean squared error Tensor.\n\t *\n\t * @doc {heading: 'Metrics', namespace: 'metrics'}\n\t */\n\n\tfunction meanSquaredError$2(yTrue, yPred) {\n\t  return meanSquaredError$1(yTrue, yPred);\n\t}\n\tfunction MSE$2(yTrue, yPred) {\n\t  return meanSquaredError$1(yTrue, yPred);\n\t}\n\tfunction mse$2(yTrue, yPred) {\n\t  return meanSquaredError$1(yTrue, yPred);\n\t}\n\n\tvar exports_metrics = {\n\t\t__proto__: null,\n\t\tbinaryAccuracy: binaryAccuracy$1,\n\t\tbinaryCrossentropy: binaryCrossentropy$2,\n\t\tsparseCategoricalAccuracy: sparseCategoricalAccuracy$1,\n\t\tcategoricalAccuracy: categoricalAccuracy$1,\n\t\tcategoricalCrossentropy: categoricalCrossentropy$2,\n\t\tprecision: precision$1,\n\t\trecall: recall$1,\n\t\tcosineProximity: cosineProximity$1,\n\t\tmeanAbsoluteError: meanAbsoluteError$1,\n\t\tmeanAbsolutePercentageError: meanAbsolutePercentageError$1,\n\t\tMAPE: MAPE$2,\n\t\tmape: mape$2,\n\t\tmeanSquaredError: meanSquaredError$2,\n\t\tMSE: MSE$2,\n\t\tmse: mse$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\n\tvar exports_models = {\n\t\t__proto__: null,\n\t\tmodelFromJSON: modelFromJSON\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\t/**\n\t * Regularizer for L1 and L2 regularization.\n\t *\n\t * Adds a term to the loss to penalize large weights:\n\t * loss += sum(l1 * abs(x)) + sum(l2 * x^2)\n\t *\n\t * @doc {heading: 'Regularizers', namespace: 'regularizers'}\n\t */\n\n\tfunction l1l2(config) {\n\t  return new L1L2(config);\n\t}\n\t/**\n\t * Regularizer for L1 regularization.\n\t *\n\t * Adds a term to the loss to penalize large weights:\n\t * loss += sum(l1 * abs(x))\n\t * @param args l1 config.\n\t *\n\t * @doc {heading: 'Regularizers', namespace: 'regularizers'}\n\t */\n\n\tfunction l1$1(config) {\n\t  return l1(config);\n\t}\n\t/**\n\t * Regularizer for L2 regularization.\n\t *\n\t * Adds a term to the loss to penalize large weights:\n\t * loss += sum(l2 * x^2)\n\t * @param args l2 config.\n\t *\n\t * @doc {heading: 'Regularizers', namespace: 'regularizers'}\n\t */\n\n\tfunction l2$1(config) {\n\t  return l2(config);\n\t}\n\n\tvar exports_regularizers = {\n\t\t__proto__: null,\n\t\tl1l2: l1l2,\n\t\tl1: l1$1,\n\t\tl2: l2$1\n\t};\n\n\tvar Callback = /*#__PURE__*/function (_BaseCallback) {\n\t  _inheritsLoose(Callback, _BaseCallback);\n\n\t  function Callback() {\n\t    var _this;\n\n\t    _this = _BaseCallback.apply(this, arguments) || this;\n\t    /** Instance of `keras.models.Model`. Reference of the model being trained. */\n\n\t    _this.model = null;\n\t    return _this;\n\t  }\n\n\t  var _proto = Callback.prototype;\n\n\t  _proto.setModel = function setModel(model) {\n\t    if (!(model instanceof LayersModel)) {\n\t      throw new Error('model must be a LayersModel, not some other Container');\n\t    }\n\n\t    this.model = model;\n\t  };\n\n\t  return Callback;\n\t}(BaseCallback);\n\n\tfunction less$1(currVal, prevVal) {\n\t  return currVal < prevVal;\n\t}\n\n\tfunction greater$1(currVal, prevVal) {\n\t  return currVal > prevVal;\n\t}\n\t/**\n\t * A Callback that stops training when a monitored quantity has stopped\n\t * improving.\n\t */\n\n\n\tvar EarlyStopping = /*#__PURE__*/function (_Callback) {\n\t  _inheritsLoose(EarlyStopping, _Callback);\n\n\t  function EarlyStopping(args) {\n\t    var _this2;\n\n\t    _this2 = _Callback.call(this) || this;\n\n\t    if (args == null) {\n\t      args = {};\n\t    }\n\n\t    if (args.restoreBestWeights) {\n\t      throw new NotImplementedError('restoreBestWeights = True is not implemented in EarlyStopping yet.');\n\t    }\n\n\t    _this2.monitor = args.monitor || 'val_loss';\n\t    _this2.minDelta = Math.abs(args.minDelta || 0);\n\t    _this2.patience = args.patience || 0;\n\t    _this2.verbose = args.verbose || 0;\n\t    _this2.mode = args.mode || 'auto';\n\t    _this2.baseline = args.baseline;\n\n\t    if (['auto', 'min', 'max'].indexOf(_this2.mode) === -1) {\n\t      console.warn(\"EarlyStopping mode '\" + _this2.mode + \"' is invalid. \" + \"Falling back to mode 'auto'.\");\n\t      _this2.mode = 'auto';\n\t    }\n\n\t    if (_this2.mode === 'min') {\n\t      _this2.monitorFunc = less$1;\n\t    } else if (_this2.mode === 'max') {\n\t      _this2.monitorFunc = greater$1;\n\t    } else {\n\t      // For mode === 'auto'.\n\t      if (_this2.monitor.indexOf('acc') !== -1) {\n\t        _this2.monitorFunc = greater$1;\n\t      } else {\n\t        _this2.monitorFunc = less$1;\n\t      }\n\t    }\n\n\t    if (_this2.monitorFunc === less$1) {\n\t      _this2.minDelta *= -1;\n\t    }\n\n\t    return _this2;\n\t  }\n\n\t  var _proto2 = EarlyStopping.prototype;\n\n\t  _proto2.onTrainBegin = /*#__PURE__*/function () {\n\t    var _onTrainBegin = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(logs) {\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              this.wait = 0;\n\t              this.stoppedEpoch = 0;\n\n\t              if (this.baseline != null) {\n\t                this.best = this.baseline;\n\t              } else {\n\t                this.best = this.monitorFunc === less$1 ? Infinity : -Infinity;\n\t              }\n\n\t            case 3:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function onTrainBegin(_x) {\n\t      return _onTrainBegin.apply(this, arguments);\n\t    }\n\n\t    return onTrainBegin;\n\t  }();\n\n\t  _proto2.onEpochEnd = /*#__PURE__*/function () {\n\t    var _onEpochEnd = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(epoch, logs) {\n\t      var current;\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              _context2.next = 2;\n\t              return resolveScalarsInLogs(logs);\n\n\t            case 2:\n\t              current = this.getMonitorValue(logs);\n\n\t              if (!(current == null)) {\n\t                _context2.next = 5;\n\t                break;\n\t              }\n\n\t              return _context2.abrupt(\"return\");\n\n\t            case 5:\n\t              if (this.monitorFunc(current - this.minDelta, this.best)) {\n\t                this.best = current;\n\t                this.wait = 0; // TODO(cais): Logic for restoreBestWeights.\n\t              } else {\n\t                this.wait++;\n\n\t                if (this.wait >= this.patience) {\n\t                  this.stoppedEpoch = epoch;\n\t                  this.model.stopTraining = true;\n\t                } // TODO(cais): Logic for restoreBestWeights.\n\n\t              }\n\n\t            case 6:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function onEpochEnd(_x2, _x3) {\n\t      return _onEpochEnd.apply(this, arguments);\n\t    }\n\n\t    return onEpochEnd;\n\t  }();\n\n\t  _proto2.onTrainEnd = /*#__PURE__*/function () {\n\t    var _onTrainEnd = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(logs) {\n\t      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t        while (1) {\n\t          switch (_context3.prev = _context3.next) {\n\t            case 0:\n\t              if (this.stoppedEpoch > 0 && this.verbose) {\n\t                console.log(\"Epoch \" + this.stoppedEpoch + \": early stopping.\");\n\t              }\n\n\t            case 1:\n\t            case \"end\":\n\t              return _context3.stop();\n\t          }\n\t        }\n\t      }, _callee3, this);\n\t    }));\n\n\t    function onTrainEnd(_x4) {\n\t      return _onTrainEnd.apply(this, arguments);\n\t    }\n\n\t    return onTrainEnd;\n\t  }();\n\n\t  _proto2.getMonitorValue = function getMonitorValue(logs) {\n\t    if (logs == null) {\n\t      logs = {};\n\t    }\n\n\t    var monitorValue = logs[this.monitor];\n\n\t    if (monitorValue == null) {\n\t      console.warn(\"Metric for EarlyStopping \" + this.monitor + \" is not available. \" + (\"Available metrics are: \" + Object.keys(logs)));\n\t    }\n\n\t    return monitorValue;\n\t  };\n\n\t  return EarlyStopping;\n\t}(Callback);\n\t/**\n\t * Factory function for a Callback that stops training when a monitored\n\t * quantity has stopped improving.\n\t *\n\t * Early stopping is a type of regularization, and protects model against\n\t * overfitting.\n\t *\n\t * The following example based on fake data illustrates how this callback\n\t * can be used during `tf.LayersModel.fit()`:\n\t *\n\t * ```js\n\t * const model = tf.sequential();\n\t * model.add(tf.layers.dense({\n\t *   units: 3,\n\t *   activation: 'softmax',\n\t *   kernelInitializer: 'ones',\n\t *   inputShape: [2]\n\t * }));\n\t * const xs = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n\t * const ys = tf.tensor2d([[1, 0, 0], [0, 1, 0]], [2, 3]);\n\t * const xsVal = tf.tensor2d([4, 3, 2, 1], [2, 2]);\n\t * const ysVal = tf.tensor2d([[0, 0, 1], [0, 1, 0]], [2, 3]);\n\t * model.compile(\n\t *     {loss: 'categoricalCrossentropy', optimizer: 'sgd', metrics: ['acc']});\n\t *\n\t * // Without the EarlyStopping callback, the val_acc value would be:\n\t * //   0.5, 0.5, 0.5, 0.5, ...\n\t * // With val_acc being monitored, training should stop after the 2nd epoch.\n\t * const history = await model.fit(xs, ys, {\n\t *   epochs: 10,\n\t *   validationData: [xsVal, ysVal],\n\t *   callbacks: tf.callbacks.earlyStopping({monitor: 'val_acc'})\n\t * });\n\t *\n\t * // Expect to see a length-2 array.\n\t * console.log(history.history.val_acc);\n\t * ```\n\t *\n\t * @doc {\n\t *   heading: 'Callbacks',\n\t *   namespace: 'callbacks'\n\t * }\n\t */\n\n\tfunction earlyStopping(args) {\n\t  return new EarlyStopping(args);\n\t}\n\tvar callbacks = {\n\t  earlyStopping: earlyStopping\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC\n\t *\n\t * Use of this source code is governed by an MIT-style\n\t * license that can be found in the LICENSE file or at\n\t * https://opensource.org/licenses/MIT.\n\t * =============================================================================\n\t */\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t *\n\t * =============================================================================\n\t */\n\n\t/** DataType enum. */\n\tvar DataType;\n\n\t(function (DataType) {\n\t  DataType[DataType[\"DT_INVALID\"] = 0] = \"DT_INVALID\";\n\t  DataType[DataType[\"DT_FLOAT\"] = 1] = \"DT_FLOAT\";\n\t  DataType[DataType[\"DT_DOUBLE\"] = 2] = \"DT_DOUBLE\";\n\t  DataType[DataType[\"DT_INT32\"] = 3] = \"DT_INT32\";\n\t  DataType[DataType[\"DT_UINT8\"] = 4] = \"DT_UINT8\";\n\t  DataType[DataType[\"DT_INT16\"] = 5] = \"DT_INT16\";\n\t  DataType[DataType[\"DT_INT8\"] = 6] = \"DT_INT8\";\n\t  DataType[DataType[\"DT_STRING\"] = 7] = \"DT_STRING\";\n\t  DataType[DataType[\"DT_COMPLEX64\"] = 8] = \"DT_COMPLEX64\";\n\t  DataType[DataType[\"DT_INT64\"] = 9] = \"DT_INT64\";\n\t  DataType[DataType[\"DT_BOOL\"] = 10] = \"DT_BOOL\";\n\t  DataType[DataType[\"DT_QINT8\"] = 11] = \"DT_QINT8\";\n\t  DataType[DataType[\"DT_QUINT8\"] = 12] = \"DT_QUINT8\";\n\t  DataType[DataType[\"DT_QINT32\"] = 13] = \"DT_QINT32\";\n\t  DataType[DataType[\"DT_BFLOAT16\"] = 14] = \"DT_BFLOAT16\";\n\t  DataType[DataType[\"DT_FLOAT_REF\"] = 101] = \"DT_FLOAT_REF\";\n\t  DataType[DataType[\"DT_DOUBLE_REF\"] = 102] = \"DT_DOUBLE_REF\";\n\t  DataType[DataType[\"DT_INT32_REF\"] = 103] = \"DT_INT32_REF\";\n\t  DataType[DataType[\"DT_UINT8_REF\"] = 104] = \"DT_UINT8_REF\";\n\t  DataType[DataType[\"DT_INT16_REF\"] = 105] = \"DT_INT16_REF\";\n\t  DataType[DataType[\"DT_INT8_REF\"] = 106] = \"DT_INT8_REF\";\n\t  DataType[DataType[\"DT_STRING_REF\"] = 107] = \"DT_STRING_REF\";\n\t  DataType[DataType[\"DT_COMPLEX64_REF\"] = 108] = \"DT_COMPLEX64_REF\";\n\t  DataType[DataType[\"DT_INT64_REF\"] = 109] = \"DT_INT64_REF\";\n\t  DataType[DataType[\"DT_BOOL_REF\"] = 110] = \"DT_BOOL_REF\";\n\t  DataType[DataType[\"DT_QINT8_REF\"] = 111] = \"DT_QINT8_REF\";\n\t  DataType[DataType[\"DT_QUINT8_REF\"] = 112] = \"DT_QUINT8_REF\";\n\t  DataType[DataType[\"DT_QINT32_REF\"] = 113] = \"DT_QINT32_REF\";\n\t  DataType[DataType[\"DT_BFLOAT16_REF\"] = 114] = \"DT_BFLOAT16_REF\";\n\t})(DataType || (DataType = {}));\n\n\tvar SaverDef;\n\n\t(function (SaverDef) {\n\t  /** CheckpointFormatVersion enum. */\n\t  var CheckpointFormatVersion;\n\n\t  (function (CheckpointFormatVersion) {\n\t    CheckpointFormatVersion[CheckpointFormatVersion[\"LEGACY\"] = 0] = \"LEGACY\";\n\t    CheckpointFormatVersion[CheckpointFormatVersion[\"V1\"] = 1] = \"V1\";\n\t    CheckpointFormatVersion[CheckpointFormatVersion[\"V2\"] = 2] = \"V2\";\n\t  })(CheckpointFormatVersion = SaverDef.CheckpointFormatVersion || (SaverDef.CheckpointFormatVersion = {}));\n\t})(SaverDef || (SaverDef = {}));\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar CUSTOM_OPS = {};\n\t/**\n\t * Register an Op for graph model executor. This allow you to register\n\t * TensorFlow custom op or override existing op.\n\t *\n\t * Here is an example of registering a new MatMul Op.\n\t * ```js\n\t * const customMatmul = (node) =>\n\t *    tf.matMul(\n\t *        node.inputs[0], node.inputs[1],\n\t *        node.attrs['transpose_a'], node.attrs['transpose_b']);\n\t *\n\t * tf.registerOp('MatMul', customMatmul);\n\t * ```\n\t * The inputs and attrs of the node object is based on the TensorFlow op\n\t * registry.\n\t *\n\t * @param name The Tensorflow Op name.\n\t * @param opFunc An op function which is called with the current graph node\n\t * during execution and needs to return a tensor or a list of tensors. The node\n\t * has the following attributes:\n\t *    - attr: A map from attribute name to its value\n\t *    - inputs: A list of input tensors\n\t *\n\t * @doc {heading: 'Models', subheading: 'Op Registry'}\n\t */\n\n\tfunction registerOp(name, opFunc) {\n\t  var opMapper = {\n\t    tfOpName: name,\n\t    category: 'custom',\n\t    inputs: [],\n\t    attrs: [],\n\t    customExecutor: opFunc\n\t  };\n\t  CUSTOM_OPS[name] = opMapper;\n\t}\n\t/**\n\t * Retrieve the OpMapper object for the registered op.\n\t *\n\t * @param name The Tensorflow Op name.\n\t *\n\t * @doc {heading: 'Models', subheading: 'Op Registry'}\n\t */\n\n\tfunction getRegisteredOp(name) {\n\t  return CUSTOM_OPS[name];\n\t}\n\t/**\n\t * Deregister the Op for graph model executor.\n\t *\n\t * @param name The Tensorflow Op name.\n\t *\n\t * @doc {heading: 'Models', subheading: 'Op Registry'}\n\t */\n\n\tfunction deregisterOp(name) {\n\t  delete CUSTOM_OPS[name];\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction getParamValue(paramName, node, tensorMap, context, resourceManager) {\n\t  var inputParam = node.inputParams[paramName];\n\n\t  if (inputParam && inputParam.inputIndexStart !== undefined) {\n\t    var start = inputParam.inputIndexStart;\n\t    var end = inputParam.inputIndexEnd === 0 ? undefined : inputParam.inputIndexEnd === undefined ? start + 1 : inputParam.inputIndexEnd;\n\n\t    if (inputParam.type === 'tensor') {\n\t      return getTensor(node.inputNames[inputParam.inputIndexStart], tensorMap, context, resourceManager);\n\t    }\n\n\t    if (inputParam.type === 'tensors') {\n\t      var inputs = node.inputNames.slice(start, end);\n\t      return inputs.map(function (name) {\n\t        return getTensor(name, tensorMap, context, resourceManager);\n\t      });\n\t    }\n\n\t    var tensor = getTensor(node.inputNames.slice(start)[0], tensorMap, context, resourceManager);\n\t    var data = tensor.dataSync();\n\t    return inputParam.type === 'number' ? data[0] : toNestedArray(tensor.shape, data);\n\t  }\n\n\t  var attrParam = node.attrParams[paramName];\n\t  return attrParam && attrParam.value;\n\t}\n\t/**\n\t * Retrieve the tensor from tensorsMap based on input name.\n\t * @param name Node input name\n\t * @param tensorsMap Tensors map keyed by the node\n\t * @param context contains tensors and information for running the current node.\n\t * @param resourceManager Optional. Contains global resources of the model.\n\t */\n\n\tfunction getTensor(name, tensorsMap, context, resourceManager) {\n\t  var _parseNodeName = parseNodeName(name),\n\t      nodeName = _parseNodeName[0],\n\t      index = _parseNodeName[1];\n\n\t  if (resourceManager != null) {\n\t    var tensor = resourceManager.getHashTableHandleByName(nodeName);\n\n\t    if (tensor != null) {\n\t      return tensor;\n\t    }\n\t  }\n\n\t  var contextId = context.currentContextIds.find(function (contextId) {\n\t    return !!tensorsMap[getNodeNameWithContextId(nodeName, contextId)];\n\t  });\n\t  return contextId !== undefined ? tensorsMap[getNodeNameWithContextId(nodeName, contextId)][index] : undefined;\n\t}\n\t/**\n\t * Retrieve the tensors based on input name for current context.\n\t * @param name Node input name\n\t * @param tensorsMap Tensors map keyed by the node\n\t */\n\n\tfunction getTensorsForCurrentContenxt(name, tensorsMap, context) {\n\t  return tensorsMap[getNodeNameWithContextId(name, context.currentContextId)];\n\t}\n\t/**\n\t * Returns the node name and index from the Node input name.\n\t * @param inputName The input name of the node, in format of\n\t * node_name:output_index, i.e. MatMul:0, if the output_index is not set, it is\n\t * default to 0.\n\t */\n\n\tfunction getNodeNameAndIndex(inputName, context) {\n\t  var _parseNodeName2 = parseNodeName(inputName),\n\t      nodeName = _parseNodeName2[0],\n\t      index = _parseNodeName2[1];\n\n\t  return [getNodeNameWithContextId(nodeName, context && context.currentContextId), index];\n\t}\n\n\tfunction getNodeNameWithContextId(name, contextId) {\n\t  return !!contextId ? name + \"-\" + contextId : name;\n\t}\n\n\tfunction parseNodeName(name) {\n\t  var parts = name.split(':');\n\n\t  if (parts.length === 1) {\n\t    return [name, 0];\n\t  }\n\n\t  var nodeName = parts[0];\n\t  return [nodeName, Number(parts[parts.length - 1])];\n\t}\n\tfunction split$2(arr, size) {\n\t  var res = [];\n\n\t  for (var i = 0; i < arr.length; i += size) {\n\t    res.push(arr.slice(i, i + size));\n\t  }\n\n\t  return res;\n\t}\n\tfunction getPadding(node, tensorMap, context) {\n\t  var pad = getParamValue('pad', node, tensorMap, context);\n\n\t  if (pad === 'explicit') {\n\t    // This is 1d array, we need to convert it to 2d array\n\t    pad = getParamValue('explicitPaddings', node, tensorMap, context);\n\t    var explicitPadding = [[0, 0], [0, 0], [0, 0], [0, 0]];\n\n\t    for (var i = 0; i < 4; i++) {\n\t      explicitPadding[i][0] = pad[i * 2];\n\t      explicitPadding[i][1] = pad[i * 2 + 1];\n\t    }\n\n\t    return explicitPadding;\n\t  }\n\n\t  return pad;\n\t}\n\t/**\n\t *  Reuse the tensor if it is marked as keep, otherwise clone the tensor to\n\t *  avoid disposal. This is important for TensorArray and TensorList ops, since\n\t *  internally they use a tensor as the id for TensorArray and TensorList, and\n\t * to simplify lookup, they also use Tensor.id as the key to the internal map.\n\t * These id tensors have been marked as kept in the backend, we need avoid clone\n\t * them in order to create new Tensor.id.\n\t * @param tensor\n\t */\n\n\tfunction cloneTensor(tensor) {\n\t  return tensor.kept ? tensor : clone(tensor);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar json = [{\n\t  'tfOpName': 'Add',\n\t  'category': 'arithmetic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'AddV2',\n\t  'category': 'arithmetic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'AddN',\n\t  'category': 'arithmetic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'end': 0,\n\t    'name': 'tensors',\n\t    'type': 'tensors'\n\t  }]\n\t}, {\n\t  'tfOpName': 'BiasAdd',\n\t  'category': 'arithmetic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'data_format',\n\t    'name': 'dataFormat',\n\t    'type': 'string',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Sub',\n\t  'category': 'arithmetic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'RealDiv',\n\t  'category': 'arithmetic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Div',\n\t  'category': 'arithmetic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'DivNoNan',\n\t  'category': 'arithmetic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'FloorDiv',\n\t  'category': 'arithmetic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Mul',\n\t  'category': 'arithmetic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Maximum',\n\t  'category': 'arithmetic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Minimum',\n\t  'category': 'arithmetic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Pow',\n\t  'category': 'arithmetic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'SquaredDifference',\n\t  'category': 'arithmetic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Mod',\n\t  'category': 'arithmetic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'FloorMod',\n\t  'category': 'arithmetic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}];\n\n\tvar arithmetic = {\n\t\t__proto__: null,\n\t\tjson: json\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar json$1 = [{\n\t  'tfOpName': 'Abs',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Acos',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Asin',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Atan',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Atan2',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'y',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Ceil',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'ClipByValue',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'clipValueMin',\n\t    'type': 'number'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'clipValueMax',\n\t    'type': 'number'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Complex',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'real',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'imag',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'ComplexAbs',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Cos',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Cosh',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Elu',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Exp',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Floor',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Log',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Imag',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'Tout',\n\t    'name': 'outputType',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Neg',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Real',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'Tout',\n\t    'name': 'outputType',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Prelu',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'alpha',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Relu',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Relu6',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Selu',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Sigmoid',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Sin',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Sinh',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Sqrt',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Rsqrt',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Square',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Tan',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Tanh',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Sign',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Round',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Expm1',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Log1p',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Reciprocal',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Softplus',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Asinh',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Acosh',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Atanh',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Erf',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Prod',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'axes',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'keep_dims',\n\t    'name': 'keepDims',\n\t    'type': 'bool',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'LeakyRelu',\n\t  'category': 'basic_math',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'alpha',\n\t    'name': 'alpha',\n\t    'type': 'number',\n\t    'defaultValue': 0.2\n\t  }, {\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}];\n\n\tvar basicMath = {\n\t\t__proto__: null,\n\t\tjson: json$1\n\t};\n\n\tvar json$2 = [{\n\t  'tfOpName': 'EmptyTensorList',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'elementShape',\n\t    'type': 'shape'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'maxNumElements',\n\t    'type': 'number'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'element_dtype',\n\t    'name': 'elementDType',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'LoopCond',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'pred',\n\t    'type': 'tensor'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Switch',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'data',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'pred',\n\t    'type': 'tensor'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Merge',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'end': 0,\n\t    'name': 'tensors',\n\t    'type': 'tensors'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Enter',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensor',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'frame_name',\n\t    'name': 'frameName',\n\t    'type': 'string'\n\t  }, {\n\t    'tfName': 'is_constant',\n\t    'name': 'isConstant',\n\t    'type': 'bool'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Exit',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensor',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'NextIteration',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensor',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorArrayV3',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'size',\n\t    'type': 'number'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'dtype',\n\t    'name': 'dtype',\n\t    'type': 'dtype'\n\t  }, {\n\t    'tfName': 'element_shape',\n\t    'name': 'elementShape',\n\t    'type': 'shape'\n\t  }, {\n\t    'tfName': 'dynamic_size',\n\t    'name': 'dynamicSize',\n\t    'type': 'bool'\n\t  }, {\n\t    'tfName': 'clear_after_read',\n\t    'name': 'clearAfterRead',\n\t    'type': 'bool'\n\t  }, {\n\t    'tfName': 'identical_element_shapes',\n\t    'name': 'identicalElementShapes',\n\t    'type': 'bool'\n\t  }, {\n\t    'tfName': 'tensor_array_name',\n\t    'name': 'name',\n\t    'type': 'string'\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorArrayWriteV3',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensorArrayId',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'index',\n\t    'type': 'number'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'tensor',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 3,\n\t    'name': 'flowIn',\n\t    'type': 'number'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorArrayReadV3',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensorArrayId',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'index',\n\t    'type': 'number'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'flowIn',\n\t    'type': 'number'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'dtype',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorArrayGatherV3',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensorArrayId',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'indices',\n\t    'type': 'number[]'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'flowIn',\n\t    'type': 'number'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'dtype',\n\t    'name': 'dtype',\n\t    'type': 'dtype'\n\t  }, {\n\t    'tfName': 'element_shape',\n\t    'name': 'elementShape',\n\t    'type': 'shape'\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorArrayScatterV3',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensorArrayId',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'indices',\n\t    'type': 'number[]'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'tensor',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 3,\n\t    'name': 'flowIn',\n\t    'type': 'number'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorArrayConcatV3',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensorArrayId',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'flowIn',\n\t    'type': 'number'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'dtype',\n\t    'name': 'dtype',\n\t    'type': 'dtype'\n\t  }, {\n\t    'tfName': 'element_shape_except0',\n\t    'name': 'elementShapeExcept0',\n\t    'type': 'shape',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorArraySplitV3',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensorArrayId',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'tensor',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'lengths',\n\t    'type': 'number[]'\n\t  }, {\n\t    'start': 3,\n\t    'name': 'flowIn',\n\t    'type': 'number'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorArraySizeV3',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensorArrayId',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'flowIn',\n\t    'type': 'number'\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorArrayCloseV3',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensorArrayId',\n\t    'type': 'tensor'\n\t  }]\n\t}, {\n\t  'tfOpName': 'StatelessIf',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'cond',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'end': 0,\n\t    'name': 'args',\n\t    'type': 'tensors'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'then_branch',\n\t    'name': 'thenBranch',\n\t    'type': 'func'\n\t  }, {\n\t    'tfName': 'else_branch',\n\t    'name': 'elseBranch',\n\t    'type': 'func'\n\t  }]\n\t}, {\n\t  'tfOpName': 'If',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'cond',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'end': 0,\n\t    'name': 'args',\n\t    'type': 'tensors'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'then_branch',\n\t    'name': 'thenBranch',\n\t    'type': 'func'\n\t  }, {\n\t    'tfName': 'else_branch',\n\t    'name': 'elseBranch',\n\t    'type': 'func'\n\t  }]\n\t}, {\n\t  'tfOpName': 'StatelessWhile',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'end': 0,\n\t    'name': 'args',\n\t    'type': 'tensors'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'cond',\n\t    'name': 'cond',\n\t    'type': 'func'\n\t  }, {\n\t    'tfName': 'body',\n\t    'name': 'body',\n\t    'type': 'func'\n\t  }]\n\t}, {\n\t  'tfOpName': 'While',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'end': 0,\n\t    'name': 'args',\n\t    'type': 'tensors'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'cond',\n\t    'name': 'cond',\n\t    'type': 'func'\n\t  }, {\n\t    'tfName': 'body',\n\t    'name': 'body',\n\t    'type': 'func'\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorListScatter',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensor',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'indices',\n\t    'type': 'number[]'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'elementShape',\n\t    'type': 'shape'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'element_dtype',\n\t    'name': 'elementDType',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorListScatterV2',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensor',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'indices',\n\t    'type': 'number[]'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'elementShape',\n\t    'type': 'shape'\n\t  }, {\n\t    'start': 3,\n\t    'name': 'numElements',\n\t    'type': 'number'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'element_dtype',\n\t    'name': 'elementDType',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorListGather',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensorListId',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'indices',\n\t    'type': 'number[]'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'elementShape',\n\t    'type': 'shape'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'element_dtype',\n\t    'name': 'elementDType',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorListGetItem',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensorListId',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'index',\n\t    'type': 'number'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'elementShape',\n\t    'type': 'shape'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'element_dtype',\n\t    'name': 'elementDType',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorListSetItem',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensorListId',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'index',\n\t    'type': 'number'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'tensor',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'element_dtype',\n\t    'name': 'elementDType',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorListReserve',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'elementShape',\n\t    'type': 'shape'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'numElements',\n\t    'type': 'number'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'element_dtype',\n\t    'name': 'elementDType',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorListFromTensor',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensor',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'elementShape',\n\t    'type': 'shape'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'element_dtype',\n\t    'name': 'elementDType',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorListStack',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensorListId',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'elementShape',\n\t    'type': 'shape'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'element_dtype',\n\t    'name': 'elementDType',\n\t    'type': 'dtype'\n\t  }, {\n\t    'tfName': 'num_elements',\n\t    'name': 'numElements',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorListSplit',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensor',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'elementShape',\n\t    'type': 'shape'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'lengths',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'element_dtype',\n\t    'name': 'elementDType',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorListConcat',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensorListId',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'element_shape',\n\t    'name': 'elementShape',\n\t    'type': 'shape'\n\t  }, {\n\t    'tfName': 'element_dtype',\n\t    'name': 'elementDType',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorListPopBack',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensorListId',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'elementShape',\n\t    'type': 'shape'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'element_dtype',\n\t    'name': 'elementDType',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'TensorListPushBack',\n\t  'category': 'control',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensorListId',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'tensor',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'element_dtype',\n\t    'name': 'elementDType',\n\t    'type': 'dtype'\n\t  }]\n\t}];\n\n\tvar control = {\n\t\t__proto__: null,\n\t\tjson: json$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar json$3 = [{\n\t  'tfOpName': 'AvgPool',\n\t  'category': 'convolution',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'strides',\n\t    'name': 'strides',\n\t    'type': 'number[]'\n\t  }, {\n\t    'tfName': 'padding',\n\t    'name': 'pad',\n\t    'type': 'string'\n\t  }, {\n\t    'tfName': 'data_format',\n\t    'name': 'dataFormat',\n\t    'type': 'string',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'ksize',\n\t    'name': 'kernelSize',\n\t    'type': 'number[]'\n\t  }, {\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'MaxPool',\n\t  'category': 'convolution',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'strides',\n\t    'name': 'strides',\n\t    'type': 'number[]'\n\t  }, {\n\t    'tfName': 'padding',\n\t    'name': 'pad',\n\t    'type': 'string'\n\t  }, {\n\t    'tfName': 'data_format',\n\t    'name': 'dataFormat',\n\t    'type': 'string',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'ksize',\n\t    'name': 'kernelSize',\n\t    'type': 'number[]'\n\t  }, {\n\t    'tfName': 'explicit_paddings',\n\t    'name': 'explicitPaddings',\n\t    'type': 'number[]',\n\t    'defaultValue': [],\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'MaxPoolWithArgmax',\n\t  'category': 'convolution',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'strides',\n\t    'name': 'strides',\n\t    'type': 'number[]'\n\t  }, {\n\t    'tfName': 'padding',\n\t    'name': 'pad',\n\t    'type': 'string'\n\t  }, {\n\t    'tfName': 'ksize',\n\t    'name': 'kernelSize',\n\t    'type': 'number[]'\n\t  }, {\n\t    'tfName': 'include_batch_in_index',\n\t    'name': 'includeBatchInIndex',\n\t    'type': 'bool'\n\t  }, {\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'AvgPool3D',\n\t  'category': 'convolution',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'strides',\n\t    'name': 'strides',\n\t    'type': 'number[]'\n\t  }, {\n\t    'tfName': 'padding',\n\t    'name': 'pad',\n\t    'type': 'string'\n\t  }, {\n\t    'tfName': 'data_format',\n\t    'name': 'dataFormat',\n\t    'type': 'string',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'ksize',\n\t    'name': 'kernelSize',\n\t    'type': 'number[]'\n\t  }, {\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'MaxPool3D',\n\t  'category': 'convolution',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'strides',\n\t    'name': 'strides',\n\t    'type': 'number[]'\n\t  }, {\n\t    'tfName': 'padding',\n\t    'name': 'pad',\n\t    'type': 'string'\n\t  }, {\n\t    'tfName': 'data_format',\n\t    'name': 'dataFormat',\n\t    'type': 'string',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'ksize',\n\t    'name': 'kernelSize',\n\t    'type': 'number[]'\n\t  }, {\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Conv1D',\n\t  'category': 'convolution',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'filter',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'stride',\n\t    'name': 'stride',\n\t    'type': 'number'\n\t  }, {\n\t    'tfName': 'padding',\n\t    'name': 'pad',\n\t    'type': 'string'\n\t  }, {\n\t    'tfName': 'data_format',\n\t    'name': 'dataFormat',\n\t    'type': 'string',\n\t    'defaultValue': 'NWC'\n\t  }, {\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'dilation',\n\t    'name': 'dilation',\n\t    'type': 'number',\n\t    'defaultValue': 1\n\t  }]\n\t}, {\n\t  'tfOpName': 'Conv2D',\n\t  'category': 'convolution',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'filter',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'strides',\n\t    'name': 'strides',\n\t    'type': 'number[]'\n\t  }, {\n\t    'tfName': 'padding',\n\t    'name': 'pad',\n\t    'type': 'string'\n\t  }, {\n\t    'tfName': 'useCudnnOnGpu',\n\t    'name': 'useCudnnOnGpu',\n\t    'type': 'bool'\n\t  }, {\n\t    'tfName': 'data_format',\n\t    'name': 'dataFormat',\n\t    'type': 'string',\n\t    'defaultValue': 'NHWC'\n\t  }, {\n\t    'tfName': 'explicit_paddings',\n\t    'name': 'explicitPaddings',\n\t    'type': 'number[]',\n\t    'defaultValue': []\n\t  }, {\n\t    'tfName': 'dilations',\n\t    'name': 'dilations',\n\t    'type': 'number[]'\n\t  }]\n\t}, {\n\t  'tfOpName': '_FusedConv2D',\n\t  'category': 'convolution',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'filter',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 2,\n\t    end: 0,\n\t    'name': 'args',\n\t    'type': 'tensors'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'num_args',\n\t    'name': 'numArgs',\n\t    'type': 'number'\n\t  }, {\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'strides',\n\t    'name': 'strides',\n\t    'type': 'number[]'\n\t  }, {\n\t    'tfName': 'padding',\n\t    'name': 'pad',\n\t    'type': 'string'\n\t  }, {\n\t    'tfName': 'explicit_paddings',\n\t    'name': 'explicitPaddings',\n\t    'type': 'number[]',\n\t    'defaultValue': []\n\t  }, {\n\t    'tfName': 'use_cudnn_on_gpu',\n\t    'name': 'useCudnnOnGpu',\n\t    'type': 'bool',\n\t    'defaultValue': true\n\t  }, {\n\t    'tfName': 'data_format',\n\t    'name': 'dataFormat',\n\t    'type': 'string',\n\t    'defaultValue': 'NHWC'\n\t  }, {\n\t    'tfName': 'dilations',\n\t    'name': 'dilations',\n\t    'type': 'number[]',\n\t    'defaultValue': [1, 1, 1, 1]\n\t  }, {\n\t    'tfName': 'fused_ops',\n\t    'name': 'fusedOps',\n\t    'type': 'string[]',\n\t    'defaultValue': []\n\t  }, {\n\t    'tfName': 'epsilon',\n\t    'name': 'epsilon',\n\t    'type': 'number',\n\t    'defaultValue': 0.0001\n\t  }, {\n\t    'tfName': 'leakyrelu_alpha',\n\t    'name': 'leakyreluAlpha',\n\t    'type': 'number'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Conv2DBackpropInput',\n\t  'category': 'convolution',\n\t  'inputs': [{\n\t    'start': 2,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'filter',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 0,\n\t    'name': 'outputShape',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'strides',\n\t    'name': 'strides',\n\t    'type': 'number[]'\n\t  }, {\n\t    'tfName': 'padding',\n\t    'name': 'pad',\n\t    'type': 'string'\n\t  }, {\n\t    'tfName': 'data_format',\n\t    'name': 'dataFormat',\n\t    'type': 'string',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'explicit_paddings',\n\t    'name': 'explicitPaddings',\n\t    'type': 'number[]',\n\t    'defaultValue': []\n\t  }, {\n\t    'tfName': 'dilations',\n\t    'name': 'dilations',\n\t    'type': 'number[]',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'DepthwiseConv2d',\n\t  'category': 'convolution',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'input',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'filter',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'strides',\n\t    'name': 'strides',\n\t    'type': 'number[]'\n\t  }, {\n\t    'tfName': 'padding',\n\t    'name': 'pad',\n\t    'type': 'string'\n\t  }, {\n\t    'tfName': 'data_format',\n\t    'name': 'dataFormat',\n\t    'type': 'string',\n\t    'defaultValue': 'NHWC'\n\t  }, {\n\t    'tfName': 'explicit_paddings',\n\t    'name': 'explicitPaddings',\n\t    'type': 'number[]',\n\t    'defaultValue': []\n\t  }, {\n\t    'tfName': 'dilations',\n\t    'name': 'dilations',\n\t    'type': 'number[]'\n\t  }]\n\t}, {\n\t  'tfOpName': 'DepthwiseConv2dNative',\n\t  'category': 'convolution',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'input',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'filter',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'strides',\n\t    'name': 'strides',\n\t    'type': 'number[]'\n\t  }, {\n\t    'tfName': 'padding',\n\t    'name': 'pad',\n\t    'type': 'string'\n\t  }, {\n\t    'tfName': 'data_format',\n\t    'name': 'dataFormat',\n\t    'type': 'string',\n\t    'defaultValue': 'NHWC'\n\t  }, {\n\t    'tfName': 'explicit_paddings',\n\t    'name': 'explicitPaddings',\n\t    'type': 'number[]',\n\t    'defaultValue': []\n\t  }, {\n\t    'tfName': 'dilations',\n\t    'name': 'dilations',\n\t    'type': 'number[]'\n\t  }]\n\t}, {\n\t  'tfOpName': 'FusedDepthwiseConv2dNative',\n\t  'category': 'convolution',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'filter',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 2,\n\t    end: 0,\n\t    'name': 'args',\n\t    'type': 'tensors'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'num_args',\n\t    'name': 'numArgs',\n\t    'type': 'number'\n\t  }, {\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'strides',\n\t    'name': 'strides',\n\t    'type': 'number[]'\n\t  }, {\n\t    'tfName': 'padding',\n\t    'name': 'pad',\n\t    'type': 'string'\n\t  }, {\n\t    'tfName': 'data_format',\n\t    'name': 'dataFormat',\n\t    'type': 'string',\n\t    'defaultValue': 'NHWC'\n\t  }, {\n\t    'tfName': 'dilations',\n\t    'name': 'dilations',\n\t    'type': 'number[]',\n\t    'defaultValue': [1, 1, 1, 1]\n\t  }, {\n\t    'tfName': 'fused_ops',\n\t    'name': 'fusedOps',\n\t    'type': 'string[]',\n\t    'defaultValue': []\n\t  }, {\n\t    'tfName': 'explicit_paddings',\n\t    'name': 'explicitPaddings',\n\t    'type': 'number[]',\n\t    'defaultValue': []\n\t  }]\n\t}, {\n\t  'tfOpName': 'Conv3D',\n\t  'category': 'convolution',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'filter',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'strides',\n\t    'name': 'strides',\n\t    'type': 'number[]'\n\t  }, {\n\t    'tfName': 'padding',\n\t    'name': 'pad',\n\t    'type': 'string'\n\t  }, {\n\t    'tfName': 'data_format',\n\t    'name': 'dataFormat',\n\t    'type': 'string',\n\t    'defaultValue': 'NHWC'\n\t  }, {\n\t    'tfName': 'dilations',\n\t    'name': 'dilations',\n\t    'type': 'number[]'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Dilation2D',\n\t  'category': 'convolution',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'filter',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'strides',\n\t    'name': 'strides',\n\t    'type': 'number[]'\n\t  }, {\n\t    'tfName': 'rates',\n\t    'name': 'dilations',\n\t    'type': 'number[]'\n\t  }, {\n\t    'tfName': 'padding',\n\t    'name': 'pad',\n\t    'type': 'string'\n\t  }]\n\t}];\n\n\tvar convolution = {\n\t\t__proto__: null,\n\t\tjson: json$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar json$4 = [{\n\t  'tfOpName': 'Fill',\n\t  'category': 'creation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'shape',\n\t    'type': 'number[]'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'value',\n\t    'type': 'number'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'LinSpace',\n\t  'category': 'creation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'start',\n\t    'type': 'number'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'stop',\n\t    'type': 'number'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'num',\n\t    'type': 'number'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'OneHot',\n\t  'category': 'creation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'indices',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'depth',\n\t    'type': 'number'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'onValue',\n\t    'type': 'number',\n\t    'defaultValue': 1\n\t  }, {\n\t    'start': 3,\n\t    'name': 'offValue',\n\t    'type': 'number',\n\t    'defaultValue': 0\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'axis',\n\t    'name': 'axis',\n\t    'type': 'number',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Ones',\n\t  'category': 'creation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'shape',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'OnesLike',\n\t  'category': 'creation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'dtype',\n\t    'name': 'dtype',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'RandomUniform',\n\t  'category': 'creation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'shape',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'minval',\n\t    'name': 'minval',\n\t    'type': 'number',\n\t    'defaultValue': 0\n\t  }, {\n\t    'tfName': 'maxval',\n\t    'name': 'maxval',\n\t    'type': 'number',\n\t    'defaultValue': 1\n\t  }, {\n\t    'tfName': 'dtype',\n\t    'name': 'dtype',\n\t    'type': 'dtype'\n\t  }, {\n\t    'tfName': 'seed',\n\t    'name': 'seed',\n\t    'type': 'number',\n\t    'defaultValue': 0\n\t  }, {\n\t    'tfName': 'seed2',\n\t    'name': 'seed2',\n\t    'type': 'number',\n\t    'defaultValue': 0,\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'T',\n\t    'name': 'T',\n\t    'type': 'number',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Range',\n\t  'category': 'creation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'start',\n\t    'type': 'number'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'stop',\n\t    'type': 'number'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'step',\n\t    'type': 'number',\n\t    'defaultValue': 0\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'Tidx',\n\t    'name': 'dtype',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'TruncatedNormal',\n\t  'category': 'creation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'shape',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'means',\n\t    'name': 'mean',\n\t    'type': 'number',\n\t    'defaultValue': 0.0\n\t  }, {\n\t    'tfName': 'stddev',\n\t    'name': 'stdDev',\n\t    'type': 'number',\n\t    'defaultValue': 1.0\n\t  }, {\n\t    'tfName': 'seed',\n\t    'name': 'seed',\n\t    'type': 'number'\n\t  }, {\n\t    'tfName': 'seed2',\n\t    'name': 'seed2',\n\t    'type': 'number',\n\t    'defaultValue': 0,\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'dtype',\n\t    'name': 'dtype',\n\t    'type': 'dtype'\n\t  }, {\n\t    'tfName': 'T',\n\t    'name': 'T',\n\t    'type': 'number',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Zeros',\n\t  'category': 'creation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'shape',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'ZerosLike',\n\t  'category': 'creation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Multinomial',\n\t  'category': 'creation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'logits',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'numSamples',\n\t    'type': 'number'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'seed',\n\t    'name': 'seed',\n\t    'type': 'number'\n\t  }, {\n\t    'tfName': 'seed2',\n\t    'name': 'seed2',\n\t    'type': 'number'\n\t  }, {\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype'\n\t  }, {\n\t    'tfName': 'output_dtype',\n\t    'name': 'output_dtype',\n\t    'type': 'dtype'\n\t  }]\n\t}];\n\n\tvar creation = {\n\t\t__proto__: null,\n\t\tjson: json$4\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar json$5 = [{\n\t  'tfOpName': 'NonMaxSuppressionV2',\n\t  'category': 'dynamic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'boxes',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'scores',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'maxOutputSize',\n\t    'type': 'number'\n\t  }, {\n\t    'start': 3,\n\t    'name': 'iouThreshold',\n\t    'type': 'number'\n\t  }]\n\t}, {\n\t  'tfOpName': 'NonMaxSuppressionV3',\n\t  'category': 'dynamic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'boxes',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'scores',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'maxOutputSize',\n\t    'type': 'number'\n\t  }, {\n\t    'start': 3,\n\t    'name': 'iouThreshold',\n\t    'type': 'number'\n\t  }, {\n\t    'start': 4,\n\t    'name': 'scoreThreshold',\n\t    'type': 'number'\n\t  }]\n\t}, {\n\t  'tfOpName': 'NonMaxSuppressionV4',\n\t  'category': 'dynamic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'boxes',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'scores',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'maxOutputSize',\n\t    'type': 'number'\n\t  }, {\n\t    'start': 3,\n\t    'name': 'iouThreshold',\n\t    'type': 'number'\n\t  }, {\n\t    'start': 4,\n\t    'name': 'scoreThreshold',\n\t    'type': 'number'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'T_threshold',\n\t    'name': 'threshold',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'pad_to_max_output_size',\n\t    'name': 'padToMaxOutputSize',\n\t    'type': 'bool'\n\t  }]\n\t}, {\n\t  'tfOpName': 'NonMaxSuppressionV5',\n\t  'category': 'dynamic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'boxes',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'scores',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'maxOutputSize',\n\t    'type': 'number'\n\t  }, {\n\t    'start': 3,\n\t    'name': 'iouThreshold',\n\t    'type': 'number'\n\t  }, {\n\t    'start': 4,\n\t    'name': 'scoreThreshold',\n\t    'type': 'number'\n\t  }, {\n\t    'start': 5,\n\t    'name': 'softNmsSigma',\n\t    'type': 'number'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Where',\n\t  'category': 'dynamic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'condition',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'ListDiff',\n\t  'category': 'dynamic',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'y',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}];\n\n\tvar dynamic = {\n\t\t__proto__: null,\n\t\tjson: json$5\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar json$6 = [{\n\t  'tfOpName': 'TopKV2',\n\t  'category': 'evaluation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'k',\n\t    'type': 'number'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'sorted',\n\t    'name': 'sorted',\n\t    'type': 'bool'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Unique',\n\t  'category': 'evaluation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }]\n\t}, {\n\t  'tfOpName': 'UniqueV2',\n\t  'category': 'evaluation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'axis',\n\t    'type': 'number'\n\t  }]\n\t}];\n\n\tvar evaluation = {\n\t\t__proto__: null,\n\t\tjson: json$6\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar json$7 = [{\n\t  'tfOpName': 'PlaceholderWithDefault',\n\t  'category': 'graph',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'default',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'shape',\n\t    'name': 'shape',\n\t    'type': 'shape'\n\t  }, {\n\t    'tfName': 'dtype',\n\t    'name': 'dtype',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Placeholder',\n\t  'category': 'graph',\n\t  'attrs': [{\n\t    'tfName': 'shape',\n\t    'name': 'shape',\n\t    'type': 'shape'\n\t  }, {\n\t    'tfName': 'dtype',\n\t    'name': 'dtype',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Const',\n\t  'category': 'graph'\n\t}, {\n\t  'tfOpName': 'Identity',\n\t  'category': 'graph',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }]\n\t}, {\n\t  'tfOpName': 'IdentityN',\n\t  'category': 'graph',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'end': 0,\n\t    'name': 'x',\n\t    'type': 'tensors'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Snapshot',\n\t  'category': 'graph',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Rank',\n\t  'category': 'graph',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Size',\n\t  'category': 'graph',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Shape',\n\t  'category': 'graph',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }]\n\t}, {\n\t  'tfOpName': 'ShapeN',\n\t  'category': 'graph',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'end': 0,\n\t    'name': 'x',\n\t    'type': 'tensors'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Print',\n\t  'category': 'graph',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'data',\n\t    'type': 'tensors'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'message',\n\t    'name': 'message',\n\t    'type': 'string'\n\t  }, {\n\t    'tfName': 'first_n',\n\t    'name': 'firstN',\n\t    'type': 'number',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'summarize',\n\t    'name': 'summarize',\n\t    'type': 'number',\n\t    'defaultValue': 3\n\t  }]\n\t}, {\n\t  'tfOpName': 'NoOp',\n\t  'category': 'graph',\n\t  'inputs': []\n\t}, {\n\t  'tfOpName': 'StopGradient',\n\t  'category': 'graph',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }]\n\t}, {\n\t  'tfOpName': 'FakeQuantWithMinMaxVars',\n\t  'category': 'graph',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'min',\n\t    'name': 'min',\n\t    'type': 'number'\n\t  }, {\n\t    'tfName': 'max',\n\t    'name': 'max',\n\t    'type': 'number'\n\t  }]\n\t}];\n\n\tvar graph = {\n\t\t__proto__: null,\n\t\tjson: json$7\n\t};\n\n\tvar json$8 = [{\n\t  'tfOpName': 'HashTable',\n\t  'category': 'hash_table',\n\t  'inputs': [],\n\t  'attrs': [{\n\t    'tfName': 'shared_name',\n\t    'name': 'sharedName',\n\t    'type': 'string'\n\t  }, {\n\t    'tfName': 'use_node_name_sharing',\n\t    'name': 'useNodeNameSharing',\n\t    'type': 'bool'\n\t  }, {\n\t    'tfName': 'key_dtype',\n\t    'name': 'keyDType',\n\t    'type': 'dtype'\n\t  }, {\n\t    'tfName': 'value_dtype',\n\t    'name': 'valueDType',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'HashTableV2',\n\t  'category': 'hash_table',\n\t  'inputs': [],\n\t  'attrs': [{\n\t    'tfName': 'shared_name',\n\t    'name': 'sharedName',\n\t    'type': 'string'\n\t  }, {\n\t    'tfName': 'use_node_name_sharing',\n\t    'name': 'useNodeNameSharing',\n\t    'type': 'bool'\n\t  }, {\n\t    'tfName': 'key_dtype',\n\t    'name': 'keyDType',\n\t    'type': 'dtype'\n\t  }, {\n\t    'tfName': 'value_dtype',\n\t    'name': 'valueDType',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'LookupTableImport',\n\t  'category': 'hash_table',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tableHandle',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'keys',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'values',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'Tin',\n\t    'name': 'tIn',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'Tout',\n\t    'name': 'tOut',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'LookupTableImportV2',\n\t  'category': 'hash_table',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tableHandle',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'keys',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'values',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'Tin',\n\t    'name': 'tIn',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'Tout',\n\t    'name': 'tOut',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'LookupTableFind',\n\t  'category': 'hash_table',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tableHandle',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'keys',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'defaultValue',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'Tin',\n\t    'name': 'tIn',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'Tout',\n\t    'name': 'tOut',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'LookupTableFindV2',\n\t  'category': 'hash_table',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tableHandle',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'keys',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'defaultValue',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'Tin',\n\t    'name': 'tIn',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'Tout',\n\t    'name': 'tOut',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}];\n\n\tvar hashTable = {\n\t\t__proto__: null,\n\t\tjson: json$8\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar json$9 = [{\n\t  'tfOpName': 'ResizeBilinear',\n\t  'category': 'image',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'images',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'size',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'align_corners',\n\t    'name': 'alignCorners',\n\t    'type': 'bool'\n\t  }, {\n\t    'tfName': 'half_pixel_centers',\n\t    'name': 'halfPixelCenters',\n\t    'type': 'bool'\n\t  }, {\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'ResizeNearestNeighbor',\n\t  'category': 'image',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'images',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'size',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'align_corners',\n\t    'name': 'alignCorners',\n\t    'type': 'bool'\n\t  }, {\n\t    'tfName': 'half_pixel_centers',\n\t    'name': 'halfPixelCenters',\n\t    'type': 'bool'\n\t  }, {\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'CropAndResize',\n\t  'category': 'image',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'image',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'boxes',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'boxInd',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 3,\n\t    'name': 'cropSize',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'method',\n\t    'name': 'method',\n\t    'type': 'string'\n\t  }, {\n\t    'tfName': 'extrapolation_value',\n\t    'name': 'extrapolationValue',\n\t    'type': 'number'\n\t  }]\n\t}];\n\n\tvar image$1 = {\n\t\t__proto__: null,\n\t\tjson: json$9\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar json$a = [{\n\t  'tfOpName': 'Equal',\n\t  'category': 'logical',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'NotEqual',\n\t  'category': 'logical',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Greater',\n\t  'category': 'logical',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'GreaterEqual',\n\t  'category': 'logical',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Less',\n\t  'category': 'logical',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'LessEqual',\n\t  'category': 'logical',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'LogicalAnd',\n\t  'category': 'logical',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'LogicalNot',\n\t  'category': 'logical',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'LogicalOr',\n\t  'category': 'logical',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Select',\n\t  'category': 'logical',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'condition',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'SelectV2',\n\t  'category': 'logical',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'condition',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}];\n\n\tvar logical = {\n\t\t__proto__: null,\n\t\tjson: json$a\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar json$b = [{\n\t  'tfOpName': '_FusedMatMul',\n\t  'category': 'matrices',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 2,\n\t    end: 0,\n\t    'name': 'args',\n\t    'type': 'tensors'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'num_args',\n\t    'name': 'numArgs',\n\t    'type': 'number'\n\t  }, {\n\t    'tfName': 'fused_ops',\n\t    'name': 'fusedOps',\n\t    'type': 'string[]',\n\t    'defaultValue': []\n\t  }, {\n\t    'tfName': 'epsilon',\n\t    'name': 'epsilon',\n\t    'type': 'number',\n\t    'defaultValue': 0.0001\n\t  }, {\n\t    'tfName': 'transpose_a',\n\t    'name': 'transposeA',\n\t    'type': 'bool',\n\t    'defaultValue': false\n\t  }, {\n\t    'tfName': 'transpose_b',\n\t    'name': 'transposeB',\n\t    'type': 'bool',\n\t    'defaultValue': false\n\t  }, {\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'MatMul',\n\t  'category': 'matrices',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'transpose_a',\n\t    'name': 'transposeA',\n\t    'type': 'bool',\n\t    'defaultValue': false\n\t  }, {\n\t    'tfName': 'transpose_b',\n\t    'name': 'transposeB',\n\t    'type': 'bool',\n\t    'defaultValue': false\n\t  }, {\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'BatchMatMul',\n\t  'category': 'matrices',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'adj_x',\n\t    'name': 'transposeA',\n\t    'type': 'bool',\n\t    'defaultValue': false\n\t  }, {\n\t    'tfName': 'adj_y',\n\t    'name': 'transposeB',\n\t    'type': 'bool',\n\t    'defaultValue': false\n\t  }, {\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'BatchMatMulV2',\n\t  'category': 'matrices',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'a',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'b',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'adj_x',\n\t    'name': 'transposeA',\n\t    'type': 'bool',\n\t    'defaultValue': false\n\t  }, {\n\t    'tfName': 'adj_y',\n\t    'name': 'transposeB',\n\t    'type': 'bool',\n\t    'defaultValue': false\n\t  }, {\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Transpose',\n\t  'category': 'matrices',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'perm',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'T',\n\t    'name': 'dtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }]\n\t}];\n\n\tvar matrices = {\n\t\t__proto__: null,\n\t\tjson: json$b\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar json$c = [{\n\t  'tfOpName': 'FusedBatchNorm',\n\t  'category': 'normalization',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'scale',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'offset',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 3,\n\t    'name': 'mean',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 4,\n\t    'name': 'variance',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'epsilon',\n\t    'name': 'epsilon',\n\t    'type': 'number',\n\t    'defaultValue': 0.001\n\t  }, {\n\t    'tfName': 'data_format',\n\t    'name': 'dataFormat',\n\t    'type': 'string',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'FusedBatchNormV2',\n\t  'category': 'normalization',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'scale',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'offset',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 3,\n\t    'name': 'mean',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 4,\n\t    'name': 'variance',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'epsilon',\n\t    'name': 'epsilon',\n\t    'type': 'number',\n\t    'defaultValue': 0.001\n\t  }, {\n\t    'tfName': 'data_format',\n\t    'name': 'dataFormat',\n\t    'type': 'string',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'FusedBatchNormV3',\n\t  'category': 'normalization',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'scale',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'offset',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 3,\n\t    'name': 'mean',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 4,\n\t    'name': 'variance',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'epsilon',\n\t    'name': 'epsilon',\n\t    'type': 'number',\n\t    'defaultValue': 0.001\n\t  }, {\n\t    'tfName': 'data_format',\n\t    'name': 'dataFormat',\n\t    'type': 'string',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'LRN',\n\t  'category': 'normalization',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'depth_radius',\n\t    'name': 'radius',\n\t    'type': 'number',\n\t    'defaultValue': 5\n\t  }, {\n\t    'tfName': 'bias',\n\t    'name': 'bias',\n\t    'type': 'number',\n\t    'defaultValue': 1.0\n\t  }, {\n\t    'tfName': 'alpha',\n\t    'name': 'alpha',\n\t    'type': 'number',\n\t    'defaultValue': 1.0\n\t  }, {\n\t    'tfName': 'beta',\n\t    'name': 'beta',\n\t    'type': 'number',\n\t    'defaultValue': 0.5\n\t  }]\n\t}, {\n\t  'tfOpName': 'Softmax',\n\t  'category': 'normalization',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }]\n\t}, {\n\t  'tfOpName': 'LogSoftmax',\n\t  'category': 'normalization',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }]\n\t}, {\n\t  'tfOpName': 'SparseToDense',\n\t  'category': 'normalization',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'sparseIndices',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'outputShape',\n\t    'type': 'number[]'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'sparseValues',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 3,\n\t    'name': 'defaultValue',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'validate_indices',\n\t    'name': 'validateIndices',\n\t    'type': 'bool',\n\t    'defaultValue': true,\n\t    'notSupported': true\n\t  }]\n\t}];\n\n\tvar normalization = {\n\t\t__proto__: null,\n\t\tjson: json$c\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar json$d = [{\n\t  'tfOpName': 'Bincount',\n\t  'category': 'reduction',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'size',\n\t    'type': 'number'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'weights',\n\t    'type': 'tensor'\n\t  }]\n\t}, {\n\t  'tfOpName': 'DenseBincount',\n\t  'category': 'reduction',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'size',\n\t    'type': 'number'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'weights',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'binary_output',\n\t    'name': 'binaryOutput',\n\t    'type': 'bool'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Max',\n\t  'category': 'reduction',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'axis',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'keep_dims',\n\t    'name': 'keepDims',\n\t    'type': 'bool'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Mean',\n\t  'category': 'reduction',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'axis',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'keep_dims',\n\t    'name': 'keepDims',\n\t    'type': 'bool'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Min',\n\t  'category': 'reduction',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'axis',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'keep_dims',\n\t    'name': 'keepDims',\n\t    'type': 'bool'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Sum',\n\t  'category': 'reduction',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'axis',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'keep_dims',\n\t    'name': 'keepDims',\n\t    'type': 'bool'\n\t  }]\n\t}, {\n\t  'tfOpName': 'All',\n\t  'category': 'reduction',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'axis',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'keep_dims',\n\t    'name': 'keepDims',\n\t    'type': 'bool'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Any',\n\t  'category': 'reduction',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'axis',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'keep_dims',\n\t    'name': 'keepDims',\n\t    'type': 'bool'\n\t  }]\n\t}, {\n\t  'tfOpName': 'ArgMax',\n\t  'category': 'reduction',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'axis',\n\t    'type': 'number'\n\t  }]\n\t}, {\n\t  'tfOpName': 'ArgMin',\n\t  'category': 'reduction',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'axis',\n\t    'type': 'number'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Prod',\n\t  'category': 'reduction',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'axis',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'keep_dims',\n\t    'name': 'keepDims',\n\t    'type': 'bool'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Cumsum',\n\t  'category': 'reduction',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'axis',\n\t    'type': 'number'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'exclusive',\n\t    'name': 'exclusive',\n\t    'type': 'bool'\n\t  }, {\n\t    'tfName': 'reverse',\n\t    'name': 'reverse',\n\t    'type': 'bool'\n\t  }]\n\t}];\n\n\tvar reduction = {\n\t\t__proto__: null,\n\t\tjson: json$d\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar json$e = [{\n\t  'tfOpName': 'ConcatV2',\n\t  'category': 'slice_join',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'end': -1,\n\t    'name': 'tensors',\n\t    'type': 'tensors'\n\t  }, {\n\t    'start': -1,\n\t    'name': 'axis',\n\t    'type': 'number'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'N',\n\t    'name': 'n',\n\t    'type': 'number',\n\t    'defaultValue': 2\n\t  }]\n\t}, {\n\t  'tfOpName': 'Concat',\n\t  'category': 'slice_join',\n\t  'inputs': [{\n\t    'start': 1,\n\t    'end': 0,\n\t    'name': 'tensors',\n\t    'type': 'tensors'\n\t  }, {\n\t    'start': 0,\n\t    'name': 'axis',\n\t    'type': 'number'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'N',\n\t    'name': 'n',\n\t    'type': 'number',\n\t    'defaultValue': 2\n\t  }]\n\t}, {\n\t  'tfOpName': 'GatherV2',\n\t  'category': 'slice_join',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'indices',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'axis',\n\t    'type': 'number',\n\t    'defaultValue': 0\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'batch_dims',\n\t    'name': 'batchDims',\n\t    'type': 'number',\n\t    'defaultValue': 0\n\t  }]\n\t}, {\n\t  'tfOpName': 'Gather',\n\t  'category': 'slice_join',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'indices',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'validate_indices',\n\t    'name': 'validateIndices',\n\t    'type': 'bool',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Reverse',\n\t  'category': 'slice_join',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'dims',\n\t    'type': 'bool[]'\n\t  }]\n\t}, {\n\t  'tfOpName': 'ReverseV2',\n\t  'category': 'slice_join',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'axis',\n\t    'type': 'number[]'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Slice',\n\t  'category': 'slice_join',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'begin',\n\t    'type': 'number[]'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'size',\n\t    'type': 'number[]'\n\t  }]\n\t}, {\n\t  'tfOpName': 'StridedSlice',\n\t  'category': 'slice_join',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'begin',\n\t    'type': 'number[]'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'end',\n\t    'type': 'number[]'\n\t  }, {\n\t    'start': 3,\n\t    'name': 'strides',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'begin_mask',\n\t    'name': 'beginMask',\n\t    'type': 'number',\n\t    'defaultValue': 0\n\t  }, {\n\t    'tfName': 'end_mask',\n\t    'name': 'endMask',\n\t    'type': 'number',\n\t    'defaultValue': 0\n\t  }, {\n\t    'tfName': 'new_axis_mask',\n\t    'name': 'newAxisMask',\n\t    'type': 'number',\n\t    'defaultValue': 0\n\t  }, {\n\t    'tfName': 'ellipsis_mask',\n\t    'name': 'ellipsisMask',\n\t    'type': 'number',\n\t    'defaultValue': 0\n\t  }, {\n\t    'tfName': 'shrink_axis_mask',\n\t    'name': 'shrinkAxisMask',\n\t    'type': 'number',\n\t    'defaultValue': 0\n\t  }]\n\t}, {\n\t  'tfOpName': 'Pack',\n\t  'category': 'slice_join',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'end': 0,\n\t    'name': 'tensors',\n\t    'type': 'tensors'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'axis',\n\t    'name': 'axis',\n\t    'type': 'number',\n\t    'defaultValue': 0\n\t  }]\n\t}, {\n\t  'tfOpName': 'Unpack',\n\t  'category': 'slice_join',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'tensor',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'axis',\n\t    'name': 'axis',\n\t    'type': 'number',\n\t    'defaultValue': 0\n\t  }, {\n\t    'tfName': 'num',\n\t    'name': 'num',\n\t    'type': 'number',\n\t    'defaultValue': 0,\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'Tile',\n\t  'category': 'slice_join',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'reps',\n\t    'type': 'number[]'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Split',\n\t  'category': 'slice_join',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'axis',\n\t    'type': 'number',\n\t    'defaultValue': 0\n\t  }, {\n\t    'start': 1,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'num_split',\n\t    'name': 'numOrSizeSplits',\n\t    'type': 'number',\n\t    'defaultValue': 1\n\t  }]\n\t}, {\n\t  'tfOpName': 'SplitV',\n\t  'category': 'slice_join',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'numOrSizeSplits',\n\t    'type': 'number[]'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'axis',\n\t    'type': 'number',\n\t    'defaultValue': 0\n\t  }]\n\t}, {\n\t  'tfOpName': 'ScatterNd',\n\t  'category': 'slice_join',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'indices',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'values',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'shape',\n\t    'type': 'number[]'\n\t  }]\n\t}, {\n\t  'tfOpName': 'GatherNd',\n\t  'category': 'slice_join',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'indices',\n\t    'type': 'tensor'\n\t  }]\n\t}, {\n\t  'tfOpName': 'SparseToDense',\n\t  'category': 'slice_join',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'sparseIndices',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'outputShape',\n\t    'type': 'number[]'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'sparseValues',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 3,\n\t    'name': 'defaultValue',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'validate_indices',\n\t    'name': 'validateIndices',\n\t    'type': 'bool',\n\t    'defaultValue': false,\n\t    'notSupported': true\n\t  }]\n\t}];\n\n\tvar sliceJoin = {\n\t\t__proto__: null,\n\t\tjson: json$e\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar json$f = [{\n\t  'tfOpName': 'FFT',\n\t  'category': 'spectral',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }]\n\t}, {\n\t  'tfOpName': 'IFFT',\n\t  'category': 'spectral',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }]\n\t}, {\n\t  'tfOpName': 'RFFT',\n\t  'category': 'spectral',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'fft_length',\n\t    'type': 'number',\n\t    'notSupported': true\n\t  }]\n\t}, {\n\t  'tfOpName': 'IRFFT',\n\t  'category': 'spectral',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'fft_length',\n\t    'type': 'number',\n\t    'notSupported': true\n\t  }]\n\t}];\n\n\tvar spectral$1 = {\n\t\t__proto__: null,\n\t\tjson: json$f\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar json$g = [{\n\t  'tfOpName': 'Cast',\n\t  'category': 'transformation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'SrcT',\n\t    'name': 'sdtype',\n\t    'type': 'dtype',\n\t    'notSupported': true\n\t  }, {\n\t    'tfName': 'DstT',\n\t    'name': 'dtype',\n\t    'type': 'dtype'\n\t  }]\n\t}, {\n\t  'tfOpName': 'ExpandDims',\n\t  'category': 'transformation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'axis',\n\t    'type': 'number'\n\t  }]\n\t}, {\n\t  'tfOpName': 'MirrorPad',\n\t  'category': 'transformation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'padding',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'mode',\n\t    'name': 'mode',\n\t    'type': 'string'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Pad',\n\t  'category': 'transformation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'padding',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'constant_value',\n\t    'name': 'constantValue',\n\t    'type': 'number',\n\t    'defaultValue': 0\n\t  }]\n\t}, {\n\t  'tfOpName': 'PadV2',\n\t  'category': 'transformation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'padding',\n\t    'type': 'number[]'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'constantValue',\n\t    'type': 'number',\n\t    'defaultValue': 0\n\t  }]\n\t}, {\n\t  'tfOpName': 'Reshape',\n\t  'category': 'transformation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'shape',\n\t    'type': 'number[]'\n\t  }]\n\t}, {\n\t  'tfOpName': 'Squeeze',\n\t  'category': 'transformation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'axis',\n\t    'tfDeprecatedName': 'squeeze_dims',\n\t    'name': 'axis',\n\t    'type': 'number[]'\n\t  }]\n\t}, {\n\t  'tfOpName': 'SpaceToBatchND',\n\t  'category': 'transformation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'blockShape',\n\t    'type': 'number[]'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'paddings',\n\t    'type': 'number[]'\n\t  }]\n\t}, {\n\t  'tfOpName': 'BatchToSpaceND',\n\t  'category': 'transformation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'blockShape',\n\t    'type': 'number[]'\n\t  }, {\n\t    'start': 2,\n\t    'name': 'crops',\n\t    'type': 'number[]'\n\t  }]\n\t}, {\n\t  'tfOpName': 'DepthToSpace',\n\t  'category': 'transformation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }],\n\t  'attrs': [{\n\t    'tfName': 'block_size',\n\t    'name': 'blockSize',\n\t    'type': 'number'\n\t  }, {\n\t    'tfName': 'data_format',\n\t    'name': 'dataFormat',\n\t    'type': 'string'\n\t  }]\n\t}, {\n\t  'tfOpName': 'BroadcastTo',\n\t  'category': 'transformation',\n\t  'inputs': [{\n\t    'start': 0,\n\t    'name': 'x',\n\t    'type': 'tensor'\n\t  }, {\n\t    'start': 1,\n\t    'name': 'shape',\n\t    'type': 'number[]'\n\t  }],\n\t  'attrs': []\n\t}];\n\n\tvar transformation = {\n\t\t__proto__: null,\n\t\tjson: json$g\n\t};\n\n\tvar OperationMapper = /*#__PURE__*/function () {\n\t  _createClass(OperationMapper, null, [{\n\t    key: \"Instance\",\n\t    // Singleton instance for the mapper\n\t    get: function get() {\n\t      return this._instance || (this._instance = new this());\n\t    } // Loads the op mapping from the JSON file.\n\n\t  }]);\n\n\t  function OperationMapper() {\n\t    var _ref;\n\n\t    var ops = [arithmetic, basicMath, control, convolution, creation, dynamic, evaluation, logical, image$1, graph, matrices, normalization, reduction, sliceJoin, spectral$1, transformation, hashTable];\n\n\t    var mappersJson = (_ref = []).concat.apply(_ref, ops.map(function (op) {\n\t      return op.json;\n\t    }));\n\n\t    this.opMappers = mappersJson.reduce(function (map, mapper) {\n\t      map[mapper.tfOpName] = mapper;\n\t      return map;\n\t    }, {});\n\t  } // Converts the model inference graph from Tensorflow GraphDef to local\n\t  // representation for TensorFlow.js API\n\n\n\t  var _proto = OperationMapper.prototype;\n\n\t  _proto.transformGraph = function transformGraph(graph, signature) {\n\t    var _this = this;\n\n\t    if (signature === void 0) {\n\t      signature = {};\n\t    }\n\n\t    var tfNodes = graph.node;\n\t    var placeholders = [];\n\t    var weights = [];\n\t    var initNodes = [];\n\t    var nodes = tfNodes.reduce(function (map, node) {\n\t      map[node.name] = _this.mapNode(node);\n\n\t      if (node.op.startsWith('Placeholder')) {\n\t        placeholders.push(map[node.name]);\n\t      } else if (node.op === 'Const') {\n\t        weights.push(map[node.name]);\n\t      } else if (node.input == null || node.input.length === 0) {\n\t        initNodes.push(map[node.name]);\n\t      }\n\n\t      return map;\n\t    }, {});\n\t    var inputs = [];\n\t    var outputs = [];\n\t    var inputNodeNameToKey = {};\n\t    var outputNodeNameToKey = {};\n\n\t    if (signature != null) {\n\t      inputNodeNameToKey = this.mapSignatureEntries(signature.inputs);\n\t      outputNodeNameToKey = this.mapSignatureEntries(signature.outputs);\n\t    }\n\n\t    var allNodes = Object.keys(nodes);\n\t    allNodes.forEach(function (key) {\n\t      var node = nodes[key];\n\t      node.inputNames.forEach(function (name) {\n\t        var _getNodeNameAndIndex = getNodeNameAndIndex(name),\n\t            nodeName = _getNodeNameAndIndex[0];\n\n\t        node.inputs.push(nodes[nodeName]);\n\t        nodes[nodeName].children.push(node);\n\t      });\n\t    }); // if signature has not outputs set, add any node that does not have\n\t    // outputs.\n\n\t    if (Object.keys(outputNodeNameToKey).length === 0) {\n\t      allNodes.forEach(function (key) {\n\t        var node = nodes[key];\n\n\t        if (node.children.length === 0) {\n\t          outputs.push(node);\n\t        }\n\t      });\n\t    } else {\n\t      Object.keys(outputNodeNameToKey).forEach(function (name) {\n\t        var _getNodeNameAndIndex2 = getNodeNameAndIndex(name),\n\t            nodeName = _getNodeNameAndIndex2[0];\n\n\t        var node = nodes[nodeName];\n\n\t        if (node != null) {\n\t          node.signatureKey = outputNodeNameToKey[name];\n\t          outputs.push(node);\n\t        }\n\t      });\n\t    }\n\n\t    if (Object.keys(inputNodeNameToKey).length > 0) {\n\t      Object.keys(inputNodeNameToKey).forEach(function (name) {\n\t        var _getNodeNameAndIndex3 = getNodeNameAndIndex(name),\n\t            nodeName = _getNodeNameAndIndex3[0];\n\n\t        var node = nodes[nodeName];\n\n\t        if (node) {\n\t          node.signatureKey = inputNodeNameToKey[name];\n\t          inputs.push(node);\n\t        }\n\t      });\n\t    } else {\n\t      inputs = placeholders;\n\t    }\n\n\t    var functions = {};\n\n\t    if (graph.library != null && graph.library.function != null) {\n\t      functions = graph.library.function.reduce(function (functions, func) {\n\t        functions[func.signature.name] = _this.mapFunction(func);\n\t        return functions;\n\t      }, {});\n\t    }\n\n\t    var result = {\n\t      nodes: nodes,\n\t      inputs: inputs,\n\t      outputs: outputs,\n\t      weights: weights,\n\t      placeholders: placeholders,\n\t      signature: signature,\n\t      functions: functions\n\t    };\n\n\t    if (initNodes.length > 0) {\n\t      result.initNodes = initNodes;\n\t    }\n\n\t    return result;\n\t  };\n\n\t  _proto.mapSignatureEntries = function mapSignatureEntries(entries) {\n\t    return Object.keys(entries || {}).reduce(function (prev, curr) {\n\t      prev[entries[curr].name] = curr;\n\t      return prev;\n\t    }, {});\n\t  };\n\n\t  _proto.mapNode = function mapNode(node) {\n\t    // Unsupported ops will cause an error at run-time (not parse time), since\n\t    // they may not be used by the actual execution subgraph.\n\t    var mapper = getRegisteredOp(node.op) || this.opMappers[node.op] || {};\n\n\t    if (node.attr == null) {\n\t      node.attr = {};\n\t    }\n\n\t    var newNode = {\n\t      name: node.name,\n\t      op: node.op,\n\t      category: mapper.category,\n\t      inputNames: (node.input || []).map(function (input) {\n\t        return input.startsWith('^') ? input.substr(1) : input;\n\t      }),\n\t      inputs: [],\n\t      children: [],\n\t      inputParams: {},\n\t      attrParams: {},\n\t      rawAttrs: node.attr\n\t    };\n\n\t    if (mapper.inputs != null) {\n\t      newNode.inputParams = mapper.inputs.reduce(function (map, param) {\n\t        map[param.name] = {\n\t          type: param.type,\n\t          inputIndexStart: param.start,\n\t          inputIndexEnd: param.end\n\t        };\n\t        return map;\n\t      }, {});\n\t    }\n\n\t    if (mapper.attrs != null) {\n\t      newNode.attrParams = mapper.attrs.reduce(function (map, param) {\n\t        var type = param.type;\n\t        var value = undefined;\n\n\t        switch (param.type) {\n\t          case 'string':\n\t            value = getStringParam(node.attr, param.tfName, param.defaultValue);\n\n\t            if (value === undefined && !!param.tfDeprecatedName) {\n\t              value = getStringParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n\t            }\n\n\t            break;\n\n\t          case 'string[]':\n\t            value = getStringArrayParam(node.attr, param.tfName, param.defaultValue);\n\n\t            if (value === undefined && !!param.tfDeprecatedName) {\n\t              value = getStringArrayParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n\t            }\n\n\t            break;\n\n\t          case 'number':\n\t            value = getNumberParam(node.attr, param.tfName, param.defaultValue || 0);\n\n\t            if (value === undefined && !!param.tfDeprecatedName) {\n\t              value = getNumberParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n\t            }\n\n\t            break;\n\n\t          case 'number[]':\n\t            value = getNumericArrayParam(node.attr, param.tfName, param.defaultValue);\n\n\t            if (value === undefined && !!param.tfDeprecatedName) {\n\t              value = getNumericArrayParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n\t            }\n\n\t            break;\n\n\t          case 'bool':\n\t            value = getBoolParam(node.attr, param.tfName, param.defaultValue);\n\n\t            if (value === undefined && !!param.tfDeprecatedName) {\n\t              value = getBoolParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n\t            }\n\n\t            break;\n\n\t          case 'bool[]':\n\t            value = getBoolArrayParam(node.attr, param.tfName, param.defaultValue);\n\n\t            if (value === undefined && !!param.tfDeprecatedName) {\n\t              value = getBoolArrayParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n\t            }\n\n\t            break;\n\n\t          case 'shape':\n\t            value = getTensorShapeParam(node.attr, param.tfName, param.defaultValue);\n\n\t            if (value === undefined && !!param.tfDeprecatedName) {\n\t              value = getTensorShapeParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n\t            }\n\n\t            break;\n\n\t          case 'shape[]':\n\t            value = getTensorShapeArrayParam(node.attr, param.tfName, param.defaultValue);\n\n\t            if (value === undefined && !!param.tfDeprecatedName) {\n\t              value = getTensorShapeArrayParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n\t            }\n\n\t            break;\n\n\t          case 'dtype':\n\t            value = getDtypeParam(node.attr, param.tfName, param.defaultValue);\n\n\t            if (value === undefined && !!param.tfDeprecatedName) {\n\t              value = getDtypeParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n\t            }\n\n\t            break;\n\n\t          case 'dtype[]':\n\t            value = getDtypeArrayParam(node.attr, param.tfName, param.defaultValue);\n\n\t            if (value === undefined && !!param.tfDeprecatedName) {\n\t              value = getDtypeArrayParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n\t            }\n\n\t            break;\n\n\t          case 'func':\n\t            value = getFuncParam(node.attr, param.tfName, param.defaultValue);\n\n\t            if (value === undefined && !!param.tfDeprecatedName) {\n\t              value = getFuncParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n\t            }\n\n\t            break;\n\n\t          case 'tensor':\n\t          case 'tensors':\n\t            break;\n\n\t          default:\n\t            throw new Error(\"Unsupported param type: \" + param.type + \" for op: \" + node.op);\n\t        }\n\n\t        map[param.name] = {\n\t          value: value,\n\t          type: type\n\t        };\n\t        return map;\n\t      }, {});\n\t    }\n\n\t    return newNode;\n\t  } // map the TFunctionDef to TFJS graph object\n\t  ;\n\n\t  _proto.mapFunction = function mapFunction(functionDef) {\n\t    var _this2 = this;\n\n\t    var tfNodes = functionDef.nodeDef;\n\t    var placeholders = [];\n\t    var weights = [];\n\t    var nodes = {};\n\n\t    if (tfNodes != null) {\n\t      nodes = tfNodes.reduce(function (map, node) {\n\t        map[node.name] = _this2.mapNode(node);\n\n\t        if (node.op === 'Const') {\n\t          weights.push(map[node.name]);\n\t        }\n\n\t        return map;\n\t      }, {});\n\t    }\n\n\t    var inputs = [];\n\t    var outputs = [];\n\t    functionDef.signature.inputArg.forEach(function (arg) {\n\t      var _getNodeNameAndIndex4 = getNodeNameAndIndex(arg.name),\n\t          nodeName = _getNodeNameAndIndex4[0];\n\n\t      var node = {\n\t        name: nodeName,\n\t        op: 'Placeholder',\n\t        inputs: [],\n\t        inputNames: [],\n\t        category: 'graph',\n\t        inputParams: {},\n\t        attrParams: {\n\t          dtype: {\n\t            value: parseDtypeParam(arg.type),\n\t            type: 'dtype'\n\t          }\n\t        },\n\t        children: []\n\t      };\n\t      node.signatureKey = arg.name;\n\t      inputs.push(node);\n\t      nodes[nodeName] = node;\n\t    });\n\t    var allNodes = Object.keys(nodes);\n\t    allNodes.forEach(function (key) {\n\t      var node = nodes[key];\n\t      node.inputNames.forEach(function (name) {\n\t        var _getNodeNameAndIndex5 = getNodeNameAndIndex(name),\n\t            nodeName = _getNodeNameAndIndex5[0];\n\n\t        node.inputs.push(nodes[nodeName]);\n\t        nodes[nodeName].children.push(node);\n\t      });\n\t    });\n\t    var returnNodeMap = functionDef.ret;\n\t    functionDef.signature.outputArg.forEach(function (output) {\n\t      var _getNodeNameAndIndex6 = getNodeNameAndIndex(returnNodeMap[output.name]),\n\t          nodeName = _getNodeNameAndIndex6[0],\n\t          index = _getNodeNameAndIndex6[1];\n\n\t      var node = nodes[nodeName];\n\n\t      if (node != null) {\n\t        node.defaultOutput = index;\n\t        outputs.push(node);\n\t      }\n\t    });\n\t    var signature = this.mapArgsToSignature(functionDef);\n\t    return {\n\t      nodes: nodes,\n\t      inputs: inputs,\n\t      outputs: outputs,\n\t      weights: weights,\n\t      placeholders: placeholders,\n\t      signature: signature\n\t    };\n\t  };\n\n\t  _proto.mapArgsToSignature = function mapArgsToSignature(functionDef) {\n\t    var _this3 = this;\n\n\t    return {\n\t      methodName: functionDef.signature.name,\n\t      inputs: functionDef.signature.inputArg.reduce(function (map, arg) {\n\t        map[arg.name] = _this3.mapArgToTensorInfo(arg);\n\t        return map;\n\t      }, {}),\n\t      outputs: functionDef.signature.outputArg.reduce(function (map, arg) {\n\t        map[arg.name] = _this3.mapArgToTensorInfo(arg, functionDef.ret);\n\t        return map;\n\t      }, {})\n\t    };\n\t  };\n\n\t  _proto.mapArgToTensorInfo = function mapArgToTensorInfo(arg, nameMap) {\n\t    var name = arg.name;\n\n\t    if (nameMap != null) {\n\t      name = nameMap[name];\n\t    }\n\n\t    return {\n\t      name: name,\n\t      dtype: arg.type\n\t    };\n\t  };\n\n\t  return OperationMapper;\n\t}();\n\tfunction decodeBase64(text) {\n\t  var global = env().global;\n\n\t  if (typeof global.atob !== 'undefined') {\n\t    return global.atob(text);\n\t  } else if (typeof Buffer !== 'undefined') {\n\t    return new Buffer(text, 'base64').toString();\n\t  } else {\n\t    throw new Error('Unable to decode base64 in this environment. ' + 'Missing built-in atob() or Buffer()');\n\t  }\n\t}\n\tfunction parseStringParam(s, keepCase) {\n\t  var value = Array.isArray(s) ? String.fromCharCode.apply(null, s) : decodeBase64(s);\n\t  return keepCase ? value : value.toLowerCase();\n\t}\n\tfunction getStringParam(attrs, name, def, keepCase) {\n\t  if (keepCase === void 0) {\n\t    keepCase = false;\n\t  }\n\n\t  var param = attrs[name];\n\n\t  if (param != null) {\n\t    return parseStringParam(param.s, keepCase);\n\t  }\n\n\t  return def;\n\t}\n\tfunction getBoolParam(attrs, name, def) {\n\t  var param = attrs[name];\n\t  return param ? param.b : def;\n\t}\n\tfunction getNumberParam(attrs, name, def) {\n\t  var param = attrs[name] || {};\n\t  var value = param['i'] != null ? param['i'] : param['f'] != null ? param['f'] : def;\n\t  return typeof value === 'number' ? value : parseInt(value, 10);\n\t}\n\tfunction parseDtypeParam(value) {\n\t  if (typeof value === 'string') {\n\t    // tslint:disable-next-line:no-any\n\t    value = DataType[value];\n\t  }\n\n\t  switch (value) {\n\t    case DataType.DT_FLOAT:\n\t      return 'float32';\n\n\t    case DataType.DT_INT32:\n\t    case DataType.DT_INT64:\n\t    case DataType.DT_INT8:\n\t    case DataType.DT_UINT8:\n\t      return 'int32';\n\n\t    case DataType.DT_BOOL:\n\t      return 'bool';\n\n\t    case DataType.DT_DOUBLE:\n\t      return 'float32';\n\n\t    case DataType.DT_STRING:\n\t      return 'string';\n\n\t    default:\n\t      // Unknown dtype error will happen at runtime (instead of parse time),\n\t      // since these nodes might not be used by the actual subgraph execution.\n\t      return null;\n\t  }\n\t}\n\tfunction getFuncParam(attrs, name, def) {\n\t  var param = attrs[name];\n\n\t  if (param && param.func) {\n\t    return param.func.name;\n\t  }\n\n\t  return def;\n\t}\n\tfunction getDtypeParam(attrs, name, def) {\n\t  var param = attrs[name];\n\n\t  if (param && param.type) {\n\t    return parseDtypeParam(param.type);\n\t  }\n\n\t  return def;\n\t}\n\tfunction getDtypeArrayParam(attrs, name, def) {\n\t  var param = attrs[name];\n\n\t  if (param && param.list && param.list.type) {\n\t    return param.list.type.map(function (v) {\n\t      return parseDtypeParam(v);\n\t    });\n\t  }\n\n\t  return def;\n\t}\n\tfunction parseTensorShapeParam(shape) {\n\t  if (shape.unknownRank) {\n\t    return undefined;\n\t  }\n\n\t  if (shape.dim != null) {\n\t    return shape.dim.map(function (dim) {\n\t      return typeof dim.size === 'number' ? dim.size : parseInt(dim.size, 10);\n\t    });\n\t  }\n\n\t  return [];\n\t}\n\tfunction getTensorShapeParam(attrs, name, def) {\n\t  var param = attrs[name];\n\n\t  if (param && param.shape) {\n\t    return parseTensorShapeParam(param.shape);\n\t  }\n\n\t  return def;\n\t}\n\tfunction getNumericArrayParam(attrs, name, def) {\n\t  var param = attrs[name];\n\n\t  if (param) {\n\t    return ((param.list.f && param.list.f.length ? param.list.f : param.list.i) || []).map(function (v) {\n\t      return typeof v === 'number' ? v : parseInt(v, 10);\n\t    });\n\t  }\n\n\t  return def;\n\t}\n\tfunction getStringArrayParam(attrs, name, def, keepCase) {\n\t  if (keepCase === void 0) {\n\t    keepCase = false;\n\t  }\n\n\t  var param = attrs[name];\n\n\t  if (param && param.list && param.list.s) {\n\t    return param.list.s.map(function (v) {\n\t      return parseStringParam(v, keepCase);\n\t    });\n\t  }\n\n\t  return def;\n\t}\n\tfunction getTensorShapeArrayParam(attrs, name, def) {\n\t  var param = attrs[name];\n\n\t  if (param && param.list && param.list.shape) {\n\t    return param.list.shape.map(function (v) {\n\t      return parseTensorShapeParam(v);\n\t    });\n\t  }\n\n\t  return def;\n\t}\n\tfunction getBoolArrayParam(attrs, name, def) {\n\t  var param = attrs[name];\n\n\t  if (param && param.list && param.list.b) {\n\t    return param.list.b;\n\t  }\n\n\t  return def;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Helper class for lookup inputs and params for nodes in the model graph.\n\t */\n\n\tvar NodeValueImpl = /*#__PURE__*/function () {\n\t  function NodeValueImpl(node, tensorMap, context) {\n\t    var _this = this;\n\n\t    this.node = node;\n\t    this.tensorMap = tensorMap;\n\t    this.context = context;\n\t    this.inputs = [];\n\t    this.attrs = {};\n\t    this.inputs = node.inputNames.map(function (name) {\n\t      return _this.getInput(name);\n\t    });\n\n\t    if (node.rawAttrs != null) {\n\t      this.attrs = Object.keys(node.rawAttrs).reduce(function (attrs, key) {\n\t        attrs[key] = _this.getAttr(key);\n\t        return attrs;\n\t      }, {});\n\t    }\n\t  }\n\t  /**\n\t   * Return the value of the attribute or input param.\n\t   * @param name String: name of attribute or input param.\n\t   */\n\n\n\t  var _proto = NodeValueImpl.prototype;\n\n\t  _proto.getInput = function getInput(name) {\n\t    return getTensor(name, this.tensorMap, this.context);\n\t  }\n\t  /**\n\t   * Return the value of the attribute or input param.\n\t   * @param name String: name of attribute or input param.\n\t   */\n\t  ;\n\n\t  _proto.getAttr = function getAttr(name, defaultValue) {\n\t    var value = this.node.rawAttrs[name];\n\n\t    if (value.tensor != null) {\n\t      return getTensor(name, this.tensorMap, this.context);\n\t    }\n\n\t    if (value.i != null || value.f != null) {\n\t      return getNumberParam(this.node.rawAttrs, name, defaultValue);\n\t    }\n\n\t    if (value.s != null) {\n\t      return getStringParam(this.node.rawAttrs, name, defaultValue);\n\t    }\n\n\t    if (value.b != null) {\n\t      return getBoolParam(this.node.rawAttrs, name, defaultValue);\n\t    }\n\n\t    if (value.shape != null) {\n\t      return getTensorShapeParam(this.node.rawAttrs, name, defaultValue);\n\t    }\n\n\t    if (value.type != null) {\n\t      return getDtypeParam(this.node.rawAttrs, name, defaultValue);\n\t    }\n\n\t    if (value.list != null) {\n\t      if (value.list.i != null || value.list.f != null) {\n\t        return getNumericArrayParam(this.node.rawAttrs, name, defaultValue);\n\t      }\n\n\t      if (value.list.s != null) {\n\t        return getStringArrayParam(this.node.rawAttrs, name, defaultValue);\n\t      }\n\n\t      if (value.list.shape != null) {\n\t        return getTensorShapeArrayParam(this.node.rawAttrs, name, defaultValue);\n\t      }\n\n\t      if (value.list.b != null) {\n\t        return getBoolArrayParam(this.node.rawAttrs, name, defaultValue);\n\t      }\n\n\t      if (value.list.type != null) {\n\t        return getDtypeArrayParam(this.node.rawAttrs, name, defaultValue);\n\t      }\n\t    }\n\n\t    return defaultValue;\n\t  };\n\n\t  return NodeValueImpl;\n\t}();\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar executeOp = function executeOp(node, tensorMap, context) {\n\t  switch (node.op) {\n\t    case 'BiasAdd':\n\t    case 'AddV2':\n\t    case 'Add':\n\t      {\n\t        return [add$1(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n\t      }\n\n\t    case 'AddN':\n\t      {\n\t        return [addN(getParamValue('tensors', node, tensorMap, context))];\n\t      }\n\n\t    case 'FloorMod':\n\t    case 'Mod':\n\t      return [mod(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n\n\t    case 'Mul':\n\t      return [mul(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n\n\t    case 'RealDiv':\n\t    case 'Div':\n\t      {\n\t        return [div(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n\t      }\n\n\t    case 'DivNoNan':\n\t      {\n\t        return [divNoNan(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n\t      }\n\n\t    case 'FloorDiv':\n\t      {\n\t        return [floorDiv(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n\t      }\n\n\t    case 'Sub':\n\t      {\n\t        return [sub(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n\t      }\n\n\t    case 'Minimum':\n\t      {\n\t        return [minimum(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n\t      }\n\n\t    case 'Maximum':\n\t      {\n\t        return [maximum(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n\t      }\n\n\t    case 'Pow':\n\t      {\n\t        return [pow$5(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n\t      }\n\n\t    case 'SquaredDifference':\n\t      {\n\t        return [squaredDifference(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n\t      }\n\n\t    default:\n\t      throw TypeError(\"Node type \" + node.op + \" is not implemented\");\n\t  }\n\t};\n\tvar CATEGORY = 'arithmetic';\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar executeOp$1 = function executeOp(node, tensorMap, context) {\n\t  switch (node.op) {\n\t    case 'Abs':\n\t    case 'ComplexAbs':\n\t      return [abs$8(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Acos':\n\t      return [acos(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Acosh':\n\t      return [acosh(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Asin':\n\t      return [asin(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Asinh':\n\t      return [asinh$1(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Atan':\n\t      return [atan(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Atan2':\n\t      return [atan2(getParamValue('x', node, tensorMap, context), getParamValue('y', node, tensorMap, context))];\n\n\t    case 'Atanh':\n\t      return [atanh(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Ceil':\n\t      return [ceil$3(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Complex':\n\t      return [complex(getParamValue('real', node, tensorMap, context), getParamValue('imag', node, tensorMap, context))];\n\n\t    case 'Cos':\n\t      return [cos(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Cosh':\n\t      return [cosh(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Elu':\n\t      return [elu(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Erf':\n\t      return [erf(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Exp':\n\t      return [exp$3(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Expm1':\n\t      {\n\t        return [expm1(getParamValue('x', node, tensorMap, context))];\n\t      }\n\n\t    case 'Floor':\n\t      return [floor$a(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Log':\n\t      return [log$9(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Log1p':\n\t      {\n\t        return [log1p(getParamValue('x', node, tensorMap, context))];\n\t      }\n\n\t    case 'Imag':\n\t      return [imag(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Neg':\n\t      return [neg(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Reciprocal':\n\t      {\n\t        return [reciprocal(getParamValue('x', node, tensorMap, context))];\n\t      }\n\n\t    case 'Real':\n\t      return [real(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Relu':\n\t      return [relu(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Round':\n\t      {\n\t        return [round$1(getParamValue('x', node, tensorMap, context))];\n\t      }\n\n\t    case 'Selu':\n\t      return [selu(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Sigmoid':\n\t      return [sigmoid(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Sin':\n\t      return [sin(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Sign':\n\t      {\n\t        return [sign(getParamValue('x', node, tensorMap, context))];\n\t      }\n\n\t    case 'Sinh':\n\t      {\n\t        return [sinh(getParamValue('x', node, tensorMap, context))];\n\t      }\n\n\t    case 'Softplus':\n\t      {\n\t        return [softplus(getParamValue('x', node, tensorMap, context))];\n\t      }\n\n\t    case 'Sqrt':\n\t      {\n\t        return [sqrt$3(getParamValue('x', node, tensorMap, context))];\n\t      }\n\n\t    case 'Square':\n\t      {\n\t        return [square(getParamValue('x', node, tensorMap, context))];\n\t      }\n\n\t    case 'Tanh':\n\t      {\n\t        return [tanh$1(getParamValue('x', node, tensorMap, context))];\n\t      }\n\n\t    case 'Tan':\n\t      return [tan(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'ClipByValue':\n\t      return [clipByValue(getParamValue('x', node, tensorMap, context), getParamValue('clipValueMin', node, tensorMap, context), getParamValue('clipValueMax', node, tensorMap, context))];\n\n\t    case 'Relu6':\n\t      return [relu6(getParamValue('x', node, tensorMap, context))];\n\n\t    case 'Rsqrt':\n\t      return [rsqrt(getTensor(node.inputNames[0], tensorMap, context))];\n\n\t    case 'Prod':\n\t      return [prod(getParamValue('x', node, tensorMap, context), getParamValue('axes', node, tensorMap, context))];\n\n\t    case 'LeakyRelu':\n\t      return [leakyRelu(getParamValue('x', node, tensorMap, context), getParamValue('alpha', node, tensorMap, context))];\n\n\t    case 'Prelu':\n\t      return [prelu(getParamValue('x', node, tensorMap, context), getParamValue('alpha', node, tensorMap, context))];\n\n\t    default:\n\t      throw TypeError(\"Node type \" + node.op + \" is not implemented\");\n\t  }\n\t};\n\tvar CATEGORY$1 = 'basic_math';\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction assertShapesMatchAllowUndefinedSize(shapeA, shapeB, errorMessagePrefix) {\n\t  if (errorMessagePrefix === void 0) {\n\t    errorMessagePrefix = '';\n\t  }\n\n\t  assert(shapesEqualAllowUndefinedSize(shapeA, shapeB), function () {\n\t    return errorMessagePrefix + (\" Shapes \" + shapeA + \" and \" + shapeB + \" must match\");\n\t  });\n\t}\n\tfunction shapesEqualAllowUndefinedSize(n1, n2) {\n\t  if (n1.length !== n2.length) {\n\t    return false;\n\t  }\n\n\t  for (var i = 0; i < n1.length; i++) {\n\t    if (n1[i] !== -1 && n2[i] !== -1 && n1[i] !== n2[i]) {\n\t      return false;\n\t    }\n\t  }\n\n\t  return true;\n\t}\n\n\t/**\n\t * The TensorArray object keeps an array of Tensors.  It\n\t * allows reading from the array and writing to the array.\n\t */\n\n\tvar TensorArray = /*#__PURE__*/function () {\n\t  function TensorArray(name, dtype, maxSize, elementShape, identicalElementShapes, dynamicSize, clearAfterRead) {\n\t    this.name = name;\n\t    this.dtype = dtype;\n\t    this.maxSize = maxSize;\n\t    this.elementShape = elementShape;\n\t    this.identicalElementShapes = identicalElementShapes;\n\t    this.dynamicSize = dynamicSize;\n\t    this.clearAfterRead = clearAfterRead;\n\t    this.tensors = [];\n\t    this.closed_ = false;\n\t    this.idTensor = scalar(0);\n\t    keep(this.idTensor);\n\t  }\n\n\t  var _proto = TensorArray.prototype;\n\n\t  /**\n\t   * Dispose the tensors and idTensor and mark the TensoryArray as closed.\n\t   */\n\t  _proto.clearAndClose = function clearAndClose(keepIds) {\n\t    this.tensors.forEach(function (tensor) {\n\t      if (keepIds == null || !keepIds.has(tensor.tensor.id)) {\n\t        tensor.tensor.dispose();\n\t      }\n\t    });\n\t    this.tensors = [];\n\t    this.closed_ = true;\n\t    this.idTensor.dispose();\n\t  };\n\n\t  _proto.size = function size() {\n\t    return this.tensors.length;\n\t  }\n\t  /**\n\t   * Read the value at location index in the TensorArray.\n\t   * @param index Number the index to read from.\n\t   */\n\t  ;\n\n\t  _proto.read = function read(index) {\n\t    if (this.closed_) {\n\t      throw new Error(\"TensorArray \" + this.name + \" has already been closed.\");\n\t    }\n\n\t    if (index < 0 || index >= this.size()) {\n\t      throw new Error(\"Tried to read from index \" + index + \", but array size is: \" + this.size());\n\t    }\n\n\t    var tensorWithState = this.tensors[index];\n\n\t    if (tensorWithState.cleared) {\n\t      throw new Error(\"TensorArray \" + this.name + \": Could not read index \" + index + \" twice because it was cleared after a previous read \" + \"(perhaps try setting clear_after_read = false?).\");\n\t    }\n\n\t    if (this.clearAfterRead) {\n\t      tensorWithState.cleared = true;\n\t    }\n\n\t    tensorWithState.read = true;\n\t    return tensorWithState.tensor;\n\t  }\n\t  /**\n\t   * Helper method to read multiple tensors from the specified indices.\n\t   */\n\t  ;\n\n\t  _proto.readMany = function readMany(indices) {\n\t    var _this = this;\n\n\t    return indices.map(function (index) {\n\t      return _this.read(index);\n\t    });\n\t  }\n\t  /**\n\t   * Write value into the index of the TensorArray.\n\t   * @param index number the index to write to.\n\t   * @param tensor\n\t   */\n\t  ;\n\n\t  _proto.write = function write(index, tensor) {\n\t    if (this.closed_) {\n\t      throw new Error(\"TensorArray \" + this.name + \" has already been closed.\");\n\t    }\n\n\t    if (index < 0 || !this.dynamicSize && index >= this.maxSize) {\n\t      throw new Error(\"Tried to write to index \" + index + \", but array is not resizeable and size is: \" + this.maxSize);\n\t    }\n\n\t    var t = this.tensors[index] || {};\n\n\t    if (tensor.dtype !== this.dtype) {\n\t      throw new Error(\"TensorArray \" + this.name + \": Could not write to TensorArray index \" + index + \",\\n          because the value dtype is \" + tensor.dtype + \", but TensorArray dtype is \" + this.dtype + \".\");\n\t    } // Set the shape for the first time write to unknow shape tensor array\n\n\n\t    if (this.size() === 0 && (this.elementShape == null || this.elementShape.length === 0)) {\n\t      this.elementShape = tensor.shape;\n\t    }\n\n\t    assertShapesMatchAllowUndefinedSize(this.elementShape, tensor.shape, \"TensorArray \" + this.name + \": Could not write to TensorArray index \" + index + \".\");\n\n\t    if (t.read) {\n\t      throw new Error(\"TensorArray \" + this.name + \": Could not write to TensorArray index \" + index + \", because it has already been read.\");\n\t    }\n\n\t    if (t.written) {\n\t      throw new Error(\"TensorArray \" + this.name + \": Could not write to TensorArray index \" + index + \", because it has already been written.\");\n\t    }\n\n\t    t.tensor = tensor;\n\t    keep(tensor);\n\t    t.written = true;\n\t    this.tensors[index] = t;\n\t  }\n\t  /**\n\t   * Helper method to write multiple tensors to the specified indices.\n\t   */\n\t  ;\n\n\t  _proto.writeMany = function writeMany(indices, tensors) {\n\t    var _this2 = this;\n\n\t    if (indices.length !== tensors.length) {\n\t      throw new Error(\"TensorArray \" + this.name + \": could not write multiple tensors,\" + (\"because the index size: \" + indices.length + \" is not the same as tensors size: \" + tensors.length + \".\"));\n\t    }\n\n\t    indices.forEach(function (i, index) {\n\t      return _this2.write(i, tensors[index]);\n\t    });\n\t  }\n\t  /**\n\t   * Return selected values in the TensorArray as a packed Tensor. All of\n\t   * selected values must have been written and their shapes must all match.\n\t   * @param [indices] number[] Optional. Taking values in [0, max_value). If the\n\t   *    TensorArray is not dynamic, max_value=size(). If not specified returns\n\t   *    all tensors in the original order.\n\t   * @param [dtype]\n\t   */\n\t  ;\n\n\t  _proto.gather = function gather(indices, dtype) {\n\t    if (!!dtype && dtype !== this.dtype) {\n\t      throw new Error(\"TensorArray dtype is \" + this.dtype + \" but gather requested dtype \" + dtype);\n\t    }\n\n\t    if (!indices) {\n\t      indices = [];\n\n\t      for (var i = 0; i < this.size(); i++) {\n\t        indices.push(i);\n\t      }\n\t    } else {\n\t      indices = indices.slice(0, this.size());\n\t    }\n\n\t    if (indices.length === 0) {\n\t      return tensor([], [0].concat(this.elementShape));\n\t    } // Read all the PersistentTensors into a vector to keep track of\n\t    // their memory.\n\n\n\t    var tensors = this.readMany(indices);\n\t    assertShapesMatchAllowUndefinedSize(this.elementShape, tensors[0].shape, 'TensorArray shape mismatch: ');\n\t    return stack(tensors, 0);\n\t  }\n\t  /**\n\t   * Return the values in the TensorArray as a concatenated Tensor.\n\t   */\n\t  ;\n\n\t  _proto.concat = function concat$1(dtype) {\n\t    if (!!dtype && dtype !== this.dtype) {\n\t      throw new Error(\"TensorArray dtype is \" + this.dtype + \" but concat requested dtype \" + dtype);\n\t    }\n\n\t    if (this.size() === 0) {\n\t      return tensor([], [0].concat(this.elementShape));\n\t    }\n\n\t    var indices = [];\n\n\t    for (var i = 0; i < this.size(); i++) {\n\t      indices.push(i);\n\t    } // Collect all the tensors from the tensors array.\n\n\n\t    var tensors = this.readMany(indices);\n\t    assertShapesMatchAllowUndefinedSize(this.elementShape, tensors[0].shape, \"TensorArray shape mismatch: tensor array shape (\" + this.elementShape + \") vs first tensor shape (\" + tensors[0].shape + \")\");\n\t    return concat(tensors, 0);\n\t  }\n\t  /**\n\t   * Scatter the values of a Tensor in specific indices of a TensorArray.\n\t   * @param indices nummber[] values in [0, max_value). If the\n\t   *    TensorArray is not dynamic, max_value=size().\n\t   * @param tensor Tensor input tensor.\n\t   */\n\t  ;\n\n\t  _proto.scatter = function scatter(indices, tensor) {\n\t    if (tensor.dtype !== this.dtype) {\n\t      throw new Error(\"TensorArray dtype is \" + this.dtype + \" but tensor has dtype \" + tensor.dtype);\n\t    }\n\n\t    if (indices.length !== tensor.shape[0]) {\n\t      throw new Error(\"Expected len(indices) == tensor.shape[0], but saw: \" + indices.length + \" vs. \" + tensor.shape[0]);\n\t    }\n\n\t    var maxIndex = Math.max.apply(Math, indices);\n\n\t    if (!this.dynamicSize && maxIndex >= this.maxSize) {\n\t      throw new Error(\"Max index must be < array size (\" + maxIndex + \"  vs. \" + this.maxSize + \")\");\n\t    }\n\n\t    this.writeMany(indices, unstack(tensor, 0));\n\t  }\n\t  /**\n\t   * Split the values of a Tensor into the TensorArray.\n\t   * @param length number[] with the lengths to use when splitting value along\n\t   *    its first dimension.\n\t   * @param tensor Tensor, the tensor to split.\n\t   */\n\t  ;\n\n\t  _proto.split = function split(length, tensor) {\n\t    var _this3 = this;\n\n\t    if (tensor.dtype !== this.dtype) {\n\t      throw new Error(\"TensorArray dtype is \" + this.dtype + \" but tensor has dtype \" + tensor.dtype);\n\t    }\n\n\t    var totalLength = 0;\n\t    var cumulativeLengths = length.map(function (len) {\n\t      totalLength += len;\n\t      return totalLength;\n\t    });\n\n\t    if (totalLength !== tensor.shape[0]) {\n\t      throw new Error(\"Expected sum of lengths to be equal to\\n          tensor.shape[0], but sum of lengths is\\n        \" + totalLength + \", and tensor's shape is: \" + tensor.shape);\n\t    }\n\n\t    if (!this.dynamicSize && length.length !== this.maxSize) {\n\t      throw new Error(\"TensorArray's size is not equal to the size of lengths (\" + this.maxSize + \" vs. \" + length.length + \"), \" + 'and the TensorArray is not marked as dynamically resizeable');\n\t    }\n\n\t    var elementPerRow = totalLength === 0 ? 0 : tensor.size / totalLength;\n\t    var tensors = [];\n\t    tidy(function () {\n\t      tensor = reshape(tensor, [1, totalLength, elementPerRow]);\n\n\t      for (var i = 0; i < length.length; ++i) {\n\t        var previousLength = i === 0 ? 0 : cumulativeLengths[i - 1];\n\t        var _indices = [0, previousLength, 0];\n\t        var sizes = [1, length[i], elementPerRow];\n\t        tensors[i] = reshape(slice$2(tensor, _indices, sizes), _this3.elementShape);\n\t      }\n\n\t      return tensors;\n\t    });\n\t    var indices = [];\n\n\t    for (var i = 0; i < length.length; i++) {\n\t      indices[i] = i;\n\t    }\n\n\t    this.writeMany(indices, tensors);\n\t  };\n\n\t  _createClass(TensorArray, [{\n\t    key: \"id\",\n\t    get: function get() {\n\t      return this.idTensor.id;\n\t    }\n\t  }, {\n\t    key: \"closed\",\n\t    get: function get() {\n\t      return this.closed_;\n\t    }\n\t  }]);\n\n\t  return TensorArray;\n\t}();\n\n\t/**\n\t * TensorList stores a container of `tf.Tensor` objects, which are accessible\n\t * via tensors field.\n\t *\n\t * In order to get a copy of the underlying list, use the copy method:\n\t * ```\n\t *    TensorList b = a.copy();\n\t *    b.tensors().pushBack(t);  // This does not modify a.tensors().\n\t * ```\n\t *\n\t * Note that this is not a deep copy: the memory locations of the underlying\n\t * tensors will still point to the same locations of the corresponding tensors\n\t * in the original.\n\t */\n\n\tvar TensorList = /*#__PURE__*/function () {\n\t  /**\n\t   *\n\t   * @param tensors list of tensors\n\t   * @param elementShape shape of each tensor\n\t   * @param elementDtype data type of each tensor\n\t   * @param maxNumElements The maximum allowed size of `tensors`. Defaults to -1\n\t   *   meaning that the size of `tensors` is unbounded.\n\t   */\n\t  function TensorList(tensors, elementShape, elementDtype, maxNumElements) {\n\t    if (maxNumElements === void 0) {\n\t      maxNumElements = -1;\n\t    }\n\n\t    this.tensors = tensors;\n\t    this.elementShape = elementShape;\n\t    this.elementDtype = elementDtype;\n\n\t    if (tensors != null) {\n\t      tensors.forEach(function (tensor) {\n\t        if (elementDtype !== tensor.dtype) {\n\t          throw new Error(\"Invalid data types; op elements \" + elementDtype + \", but list elements \" + tensor.dtype);\n\t        }\n\n\t        assertShapesMatchAllowUndefinedSize(elementShape, tensor.shape, 'TensorList shape mismatch: ');\n\t        keep(tensor);\n\t      });\n\t    }\n\n\t    this.idTensor = scalar(0);\n\t    this.maxNumElements = maxNumElements;\n\t    keep(this.idTensor);\n\t  }\n\n\t  var _proto = TensorList.prototype;\n\n\t  /**\n\t   * Get a new TensorList containing a copy of the underlying tensor container.\n\t   */\n\t  _proto.copy = function copy() {\n\t    return new TensorList([].concat(this.tensors), this.elementShape, this.elementDtype);\n\t  }\n\t  /**\n\t   * Dispose the tensors and idTensor and clear the tensor list.\n\t   */\n\t  ;\n\n\t  _proto.clearAndClose = function clearAndClose(keepIds) {\n\t    this.tensors.forEach(function (tensor) {\n\t      if (keepIds == null || !keepIds.has(tensor.id)) {\n\t        tensor.dispose();\n\t      }\n\t    });\n\t    this.tensors.length = 0;\n\t    this.idTensor.dispose();\n\t  }\n\t  /**\n\t   * The size of the tensors in the tensor list.\n\t   */\n\t  ;\n\n\t  _proto.size = function size() {\n\t    return this.tensors.length;\n\t  }\n\t  /**\n\t   * Return a tensor that stacks a list of rank-R tf.Tensors into one rank-(R+1)\n\t   * tf.Tensor.\n\t   * @param elementShape shape of each tensor\n\t   * @param elementDtype data type of each tensor\n\t   * @param numElements the number of elements to stack\n\t   */\n\t  ;\n\n\t  _proto.stack = function stack$1(elementShape, elementDtype, numElements) {\n\t    var _this = this;\n\n\t    if (numElements === void 0) {\n\t      numElements = -1;\n\t    }\n\n\t    if (elementDtype !== this.elementDtype) {\n\t      throw new Error(\"Invalid data types; op elements \" + elementDtype + \", but list elements \" + this.elementDtype);\n\t    }\n\n\t    if (numElements !== -1 && this.tensors.length !== numElements) {\n\t      throw new Error(\"Operation expected a list with \" + numElements + \" elements but got a list with \" + this.tensors.length + \" elements.\");\n\t    }\n\n\t    assertShapesMatchAllowUndefinedSize(elementShape, this.elementShape, 'TensorList shape mismatch: ');\n\t    return tidy(function () {\n\t      var reshapedTensors = _this.tensors.map(function (tensor) {\n\t        return reshape(tensor, elementShape);\n\t      });\n\n\t      return stack(reshapedTensors, 0);\n\t    });\n\t  }\n\t  /**\n\t   * Pop a tensor from the end of the list.\n\t   * @param elementShape shape of the tensor\n\t   * @param elementDtype data type of the tensor\n\t   */\n\t  ;\n\n\t  _proto.popBack = function popBack(elementShape, elementDtype) {\n\t    if (elementDtype !== this.elementDtype) {\n\t      throw new Error(\"Invalid data types; op elements \" + elementDtype + \", but list elements \" + this.elementDtype);\n\t    }\n\n\t    if (this.size() === 0) {\n\t      throw new Error('Trying to pop from an empty list.');\n\t    }\n\n\t    var tensor = this.tensors.pop();\n\t    assertShapesMatchAllowUndefinedSize(tensor.shape, elementShape, 'TensorList shape mismatch: ');\n\t    return reshape(tensor, elementShape);\n\t  }\n\t  /**\n\t   * Push a tensor to the end of the list.\n\t   * @param tensor Tensor to be pushed.\n\t   */\n\t  ;\n\n\t  _proto.pushBack = function pushBack(tensor) {\n\t    if (tensor.dtype !== this.elementDtype) {\n\t      throw new Error(\"Invalid data types; op elements \" + tensor.dtype + \", but list elements \" + this.elementDtype);\n\t    }\n\n\t    assertShapesMatchAllowUndefinedSize(tensor.shape, this.elementShape, 'TensorList shape mismatch: ');\n\n\t    if (this.maxNumElements === this.size()) {\n\t      throw new Error(\"Trying to push element into a full list.\");\n\t    }\n\n\t    keep(tensor);\n\t    this.tensors.push(tensor);\n\t  }\n\t  /**\n\t   * Update the size of the list.\n\t   * @param size the new size of the list.\n\t   */\n\t  ;\n\n\t  _proto.resize = function resize(size) {\n\t    if (size < 0) {\n\t      throw new Error(\"TensorListResize expects size to be non-negative. Got: \" + size);\n\t    }\n\n\t    if (this.maxNumElements !== -1 && size > this.maxNumElements) {\n\t      throw new Error(\"TensorListResize input size \" + size + \" is greater maxNumElement \" + this.maxNumElements + \".\");\n\t    }\n\n\t    this.tensors.length = size;\n\t  }\n\t  /**\n\t   * Retrieve the element at the provided index\n\t   * @param elementShape shape of the tensor\n\t   * @param elementDtype dtype of the tensor\n\t   * @param elementIndex index of the tensor\n\t   */\n\t  ;\n\n\t  _proto.getItem = function getItem(elementIndex, elementShape, elementDtype) {\n\t    if (elementDtype !== this.elementDtype) {\n\t      throw new Error(\"Invalid data types; op elements \" + elementDtype + \", but list elements \" + this.elementDtype);\n\t    }\n\n\t    if (elementIndex < 0 || elementIndex > this.tensors.length) {\n\t      throw new Error(\"Trying to access element \" + elementIndex + \" in a list with \" + this.tensors.length + \" elements.\");\n\t    }\n\n\t    if (this.tensors[elementIndex] == null) {\n\t      throw new Error(\"element at index \" + elementIndex + \" is null.\");\n\t    }\n\n\t    assertShapesMatchAllowUndefinedSize(this.tensors[elementIndex].shape, elementShape, 'TensorList shape mismatch: ');\n\t    return this.tensors[elementIndex];\n\t  }\n\t  /**\n\t   * Set the tensor at the index\n\t   * @param elementIndex index of the tensor\n\t   * @param tensor the tensor to be inserted into the list\n\t   */\n\t  ;\n\n\t  _proto.setItem = function setItem(elementIndex, tensor) {\n\t    if (tensor.dtype !== this.elementDtype) {\n\t      throw new Error(\"Invalid data types; op elements \" + tensor.dtype + \", but list elements \" + this.elementDtype);\n\t    }\n\n\t    if (elementIndex < 0 || this.maxNumElements !== -1 && elementIndex >= this.maxNumElements) {\n\t      throw new Error(\"Trying to set element \" + elementIndex + \" in a list with max \" + this.maxNumElements + \" elements.\");\n\t    }\n\n\t    assertShapesMatchAllowUndefinedSize(this.elementShape, tensor.shape, 'TensorList shape mismatch: ');\n\t    keep(tensor);\n\t    this.tensors[elementIndex] = tensor;\n\t  }\n\t  /**\n\t   * Return selected values in the TensorList as a stacked Tensor. All of\n\t   * selected values must have been written and their shapes must all match.\n\t   * @param indices indices of tensors to gather\n\t   * @param elementDtype output tensor dtype\n\t   * @param elementShape output tensor element shape\n\t   */\n\t  ;\n\n\t  _proto.gather = function gather(indices, elementDtype, elementShape) {\n\t    var _this2 = this;\n\n\t    if (elementDtype !== this.elementDtype) {\n\t      throw new Error(\"Invalid data types; op elements \" + elementDtype + \", but list elements \" + this.elementDtype);\n\t    }\n\n\t    assertShapesMatchAllowUndefinedSize(this.elementShape, elementShape, 'TensorList shape mismatch: '); // When indices is greater than the size of the list, indices beyond the\n\t    // size of the list are ignored.\n\n\t    indices = indices.slice(0, this.size());\n\n\t    if (indices.length === 0) {\n\t      return tensor([], [0].concat(this.elementShape));\n\t    }\n\n\t    return tidy(function () {\n\t      var tensors = indices.map(function (i) {\n\t        return reshape(_this2.tensors[i], elementShape);\n\t      });\n\t      return stack(tensors, 0);\n\t    });\n\t  }\n\t  /**\n\t   * Return the values in the TensorList as a concatenated Tensor.\n\t   * @param elementDtype output tensor dtype\n\t   * @param elementShape output tensor element shape\n\t   */\n\t  ;\n\n\t  _proto.concat = function concat$1(elementDtype, elementShape) {\n\t    var _this3 = this;\n\n\t    if (!!elementDtype && elementDtype !== this.elementDtype) {\n\t      throw new Error(\"TensorList dtype is \" + this.elementDtype + \" but concat requested dtype \" + elementDtype);\n\t    }\n\n\t    assertShapesMatchAllowUndefinedSize(this.elementShape, elementShape, 'TensorList shape mismatch: ');\n\n\t    if (this.size() === 0) {\n\t      return tensor([], [0].concat(this.elementShape));\n\t    }\n\n\t    return tidy(function () {\n\t      var tensors = _this3.tensors.map(function (t) {\n\t        return reshape(t, elementShape);\n\t      });\n\n\t      return concat(tensors, 0);\n\t    });\n\t  };\n\n\t  _createClass(TensorList, [{\n\t    key: \"id\",\n\t    get: function get() {\n\t      return this.idTensor.id;\n\t    }\n\t  }]);\n\n\t  return TensorList;\n\t}();\n\t/**\n\t * Creates a TensorList which, when stacked, has the value of tensor.\n\t * @param tensor from tensor\n\t * @param elementShape output tensor element shape\n\t */\n\n\tfunction fromTensor(tensor, elementShape, elementDtype) {\n\t  var dtype = tensor.dtype;\n\n\t  if (tensor.shape.length < 1) {\n\t    throw new Error(\"Tensor must be at least a vector, but saw shape: \" + tensor.shape);\n\t  }\n\n\t  if (tensor.dtype !== elementDtype) {\n\t    throw new Error(\"Invalid data types; op elements \" + tensor.dtype + \", but list elements \" + elementDtype);\n\t  }\n\n\t  var outputShape = tensor.shape.slice(1);\n\t  assertShapesMatchAllowUndefinedSize(outputShape, elementShape, 'TensorList shape mismatch: ');\n\t  var tensorList = unstack(tensor);\n\t  return new TensorList(tensorList, elementShape, dtype);\n\t}\n\t/**\n\t * Return a TensorList of the given size with empty elements.\n\t * @param elementShape the shape of the future elements of the list\n\t * @param elementDtype the desired type of elements in the list\n\t * @param numElements the number of elements to reserve\n\t */\n\n\tfunction reserve(elementShape, elementDtype, numElements) {\n\t  return new TensorList([], elementShape, elementDtype, numElements);\n\t}\n\t/**\n\t * Put tensors at specific indices of a stacked tensor into a TensorList.\n\t * @param indices list of indices on how to scatter the tensor.\n\t * @param tensor input tensor.\n\t * @param elementShape the shape of the future elements of the list\n\t * @param numElements the number of elements to scatter\n\t */\n\n\tfunction scatter(tensor, indices, elementShape, numElements) {\n\t  if (indices.length !== tensor.shape[0]) {\n\t    throw new Error(\"Expected len(indices) == tensor.shape[0], but saw: \" + indices.length + \" vs. \" + tensor.shape[0]);\n\t  }\n\n\t  var maxIndex = Math.max.apply(Math, indices);\n\n\t  if (numElements != null && numElements !== -1 && maxIndex >= numElements) {\n\t    throw new Error(\"Max index must be < array size (\" + maxIndex + \"  vs. \" + numElements + \")\");\n\t  }\n\n\t  var list = new TensorList([], elementShape, tensor.dtype, numElements);\n\t  var tensors = unstack(tensor, 0);\n\t  indices.forEach(function (value, index) {\n\t    list.setItem(value, tensors[index]);\n\t  });\n\t  return list;\n\t}\n\t/**\n\t * Split the values of a Tensor into a TensorList.\n\t * @param length the lengths to use when splitting value along\n\t *    its first dimension.\n\t * @param tensor the tensor to split.\n\t * @param elementShape the shape of the future elements of the list\n\t */\n\n\tfunction split$3(tensor, length, elementShape) {\n\t  var totalLength = 0;\n\t  var cumulativeLengths = length.map(function (len) {\n\t    totalLength += len;\n\t    return totalLength;\n\t  });\n\n\t  if (totalLength !== tensor.shape[0]) {\n\t    throw new Error(\"Expected sum of lengths to be equal to\\n          tensor.shape[0], but sum of lengths is\\n        \" + totalLength + \", and tensor's shape is: \" + tensor.shape);\n\t  }\n\n\t  var elementPerRow = totalLength === 0 ? 0 : tensor.size / totalLength;\n\t  var tensors = tidy(function () {\n\t    var tensors = [];\n\t    tensor = reshape(tensor, [1, totalLength, elementPerRow]);\n\n\t    for (var i = 0; i < length.length; ++i) {\n\t      var previousLength = i === 0 ? 0 : cumulativeLengths[i - 1];\n\t      var indices = [0, previousLength, 0];\n\t      var sizes = [1, length[i], elementPerRow];\n\t      tensors[i] = reshape(slice$2(tensor, indices, sizes), elementShape);\n\t    }\n\n\t    tensor.dispose();\n\t    return tensors;\n\t  });\n\t  var list = new TensorList([], elementShape, tensor.dtype, length.length);\n\n\t  for (var i = 0; i < tensors.length; i++) {\n\t    list.setItem(i, tensors[i]);\n\t  }\n\n\t  return list;\n\t}\n\n\tvar executeOp$2 = /*#__PURE__*/function () {\n\t  var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(node, tensorMap, context) {\n\t    var thenFunc, elseFunc, cond, args, condValue, _ret, pred, _pred, data, inputName, _data, frameId, _data2, _data3, _data4, size, dtype, elementShape, dynamicSize, clearAfterRead, identicalElementShapes, name, tensorArray, id, index, writeTensor, writeTensorArray, readId, readIndex, readTensorArray, gatherId, gatherIndices, gatherDtype, gatherTensorArray, scatterId, scatterIndices, scatterTensor, scatterTensorArray, concatId, concatTensorArray, concatDtype, splitId, splitTensor, lengths, splitTensorArray, sizeId, sizeTensorArray, closeId, closeTensorArray, idTensor, _index, _writeTensor, tensorList, _idTensor, _readIndex, _elementShape, elementDType, _tensorList, _scatterIndices, _scatterTensor, _elementShape2, numElements, _tensorList2, _elementShape3, elementDtype, numElementsParam, _numElements, _tensorList3, _gatherId, _gatherIndices, _elementShape4, _elementDtype, _tensorList4, _idTensor2, _elementShape5, _elementDtype2, _numElements2, _tensorList5, tensor, _elementShape6, _elementDtype3, _tensorList6, _concatId, _tensorList7, _concatDtype, _elementShape7, _idTensor3, _writeTensor2, _tensorList8, _idTensor4, _elementShape8, _elementDType, _tensorList9, _splitTensor, _elementShape9, _lengths, _tensorList10;\n\n\t    return regeneratorRuntime.wrap(function _callee2$(_context3) {\n\t      while (1) {\n\t        switch (_context3.prev = _context3.next) {\n\t          case 0:\n\t            _context3.t0 = node.op;\n\t            _context3.next = _context3.t0 === 'If' ? 3 : _context3.t0 === 'StatelessIf' ? 3 : _context3.t0 === 'While' ? 15 : _context3.t0 === 'StatelessWhile' ? 15 : _context3.t0 === 'LoopCond' ? 19 : _context3.t0 === 'Switch' ? 21 : _context3.t0 === 'Merge' ? 32 : _context3.t0 === 'Enter' ? 37 : _context3.t0 === 'Exit' ? 41 : _context3.t0 === 'NextIteration' ? 44 : _context3.t0 === 'TensorArrayV3' ? 47 : _context3.t0 === 'TensorArrayWriteV3' ? 57 : _context3.t0 === 'TensorArrayReadV3' ? 63 : _context3.t0 === 'TensorArrayGatherV3' ? 67 : _context3.t0 === 'TensorArrayScatterV3' ? 72 : _context3.t0 === 'TensorArrayConcatV3' ? 78 : _context3.t0 === 'TensorArraySplitV3' ? 82 : _context3.t0 === 'TensorArraySizeV3' ? 88 : _context3.t0 === 'TensorArrayCloseV3' ? 91 : _context3.t0 === 'TensorListSetItem' ? 95 : _context3.t0 === 'TensorListGetItem' ? 101 : _context3.t0 === 'TensorListScatterV2' ? 107 : _context3.t0 === 'TensorListScatter' ? 107 : _context3.t0 === 'TensorListReserve' ? 114 : _context3.t0 === 'EmptyTensorList' ? 114 : _context3.t0 === 'TensorListGather' ? 121 : _context3.t0 === 'TensorListStack' ? 127 : _context3.t0 === 'TensorListFromTensor' ? 133 : _context3.t0 === 'TensorListConcat' ? 139 : _context3.t0 === 'TensorListPushBack' ? 144 : _context3.t0 === 'TensorListPopBack' ? 149 : _context3.t0 === 'TensorListSplit' ? 154 : 160;\n\t            break;\n\n\t          case 3:\n\t            thenFunc = getParamValue('thenBranch', node, tensorMap, context);\n\t            elseFunc = getParamValue('elseBranch', node, tensorMap, context);\n\t            cond = getParamValue('cond', node, tensorMap, context);\n\t            args = getParamValue('args', node, tensorMap, context);\n\t            _context3.next = 9;\n\t            return cond.data();\n\n\t          case 9:\n\t            condValue = _context3.sent;\n\n\t            if (!condValue[0]) {\n\t              _context3.next = 14;\n\t              break;\n\t            }\n\n\t            return _context3.abrupt(\"return\", context.functionMap[thenFunc].executeFunctionAsync(args, context.tensorArrayMap, context.tensorListMap));\n\n\t          case 14:\n\t            return _context3.abrupt(\"return\", context.functionMap[elseFunc].executeFunctionAsync(args, context.tensorArrayMap, context.tensorListMap));\n\n\t          case 15:\n\t            return _context3.delegateYield( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t              var bodyFunc, condFunc, args, condResult, argIds, condValue, result, _loop;\n\n\t              return regeneratorRuntime.wrap(function _callee$(_context2) {\n\t                while (1) {\n\t                  switch (_context2.prev = _context2.next) {\n\t                    case 0:\n\t                      bodyFunc = getParamValue('body', node, tensorMap, context);\n\t                      condFunc = getParamValue('cond', node, tensorMap, context);\n\t                      args = getParamValue('args', node, tensorMap, context); // Calculate the condition of the loop\n\n\t                      _context2.next = 5;\n\t                      return context.functionMap[condFunc].executeFunctionAsync(args, context.tensorArrayMap, context.tensorListMap);\n\n\t                    case 5:\n\t                      condResult = _context2.sent;\n\t                      argIds = args.map(function (tensor) {\n\t                        return tensor.id;\n\t                      });\n\t                      _context2.next = 9;\n\t                      return condResult[0].data();\n\n\t                    case 9:\n\t                      condValue = _context2.sent;\n\t                      // Dispose the intermediate tensors for condition function\n\t                      condResult.forEach(function (tensor) {\n\t                        if (!tensor.kept && argIds.indexOf(tensor.id) === -1) {\n\t                          tensor.dispose();\n\t                        }\n\t                      });\n\t                      result = args;\n\t                      _loop = /*#__PURE__*/regeneratorRuntime.mark(function _loop() {\n\t                        var origResult, resultIds, condResult;\n\t                        return regeneratorRuntime.wrap(function _loop$(_context) {\n\t                          while (1) {\n\t                            switch (_context.prev = _context.next) {\n\t                              case 0:\n\t                                // Record the previous result for intermediate tensor tracking\n\t                                origResult = result; // Execution the body of the loop\n\n\t                                _context.next = 3;\n\t                                return context.functionMap[bodyFunc].executeFunctionAsync(result, context.tensorArrayMap, context.tensorListMap);\n\n\t                              case 3:\n\t                                result = _context.sent;\n\t                                resultIds = result.map(function (tensor) {\n\t                                  return tensor.id;\n\t                                }); // Dispose the intermediate tensor for body function that is not global\n\t                                // kept, not input/output of the body function\n\n\t                                origResult.forEach(function (tensor) {\n\t                                  if (!tensor.kept && argIds.indexOf(tensor.id) === -1 && resultIds.indexOf(tensor.id) === -1) {\n\t                                    tensor.dispose();\n\t                                  }\n\t                                }); // Recalcuate the condition of the loop using the latest results.\n\n\t                                _context.next = 8;\n\t                                return context.functionMap[condFunc].executeFunctionAsync(result, context.tensorArrayMap, context.tensorListMap);\n\n\t                              case 8:\n\t                                condResult = _context.sent;\n\t                                _context.next = 11;\n\t                                return condResult[0].data();\n\n\t                              case 11:\n\t                                condValue = _context.sent;\n\t                                // Dispose the intermediate tensors for condition function\n\t                                condResult.forEach(function (tensor) {\n\t                                  if (!tensor.kept && argIds.indexOf(tensor.id) === -1 && resultIds.indexOf(tensor.id) === -1) {\n\t                                    tensor.dispose();\n\t                                  }\n\t                                });\n\n\t                              case 13:\n\t                              case \"end\":\n\t                                return _context.stop();\n\t                            }\n\t                          }\n\t                        }, _loop);\n\t                      });\n\n\t                    case 13:\n\t                      if (!condValue[0]) {\n\t                        _context2.next = 17;\n\t                        break;\n\t                      }\n\n\t                      return _context2.delegateYield(_loop(), \"t0\", 15);\n\n\t                    case 15:\n\t                      _context2.next = 13;\n\t                      break;\n\n\t                    case 17:\n\t                      return _context2.abrupt(\"return\", {\n\t                        v: result\n\t                      });\n\n\t                    case 18:\n\t                    case \"end\":\n\t                      return _context2.stop();\n\t                  }\n\t                }\n\t              }, _callee);\n\t            })(), \"t1\", 16);\n\n\t          case 16:\n\t            _ret = _context3.t1;\n\n\t            if (!(typeof _ret === \"object\")) {\n\t              _context3.next = 19;\n\t              break;\n\t            }\n\n\t            return _context3.abrupt(\"return\", _ret.v);\n\n\t          case 19:\n\t            pred = getParamValue('pred', node, tensorMap, context);\n\t            return _context3.abrupt(\"return\", [cloneTensor(pred)]);\n\n\t          case 21:\n\t            _pred = getParamValue('pred', node, tensorMap, context);\n\t            data = getParamValue('data', node, tensorMap, context);\n\n\t            if (!data.kept) {\n\t              data = cloneTensor(data);\n\t            } // Outputs nodes :0 => false, :1 => true\n\n\n\t            _context3.next = 26;\n\t            return _pred.data();\n\n\t          case 26:\n\t            if (!_context3.sent[0]) {\n\t              _context3.next = 30;\n\t              break;\n\t            }\n\n\t            _context3.t2 = [undefined, data];\n\t            _context3.next = 31;\n\t            break;\n\n\t          case 30:\n\t            _context3.t2 = [data, undefined];\n\n\t          case 31:\n\t            return _context3.abrupt(\"return\", _context3.t2);\n\n\t          case 32:\n\t            inputName = node.inputNames.find(function (name) {\n\t              return getTensor(name, tensorMap, context) !== undefined;\n\t            });\n\n\t            if (!inputName) {\n\t              _context3.next = 36;\n\t              break;\n\t            }\n\n\t            _data = getTensor(inputName, tensorMap, context);\n\t            return _context3.abrupt(\"return\", [cloneTensor(_data)]);\n\n\t          case 36:\n\t            return _context3.abrupt(\"return\", undefined);\n\n\t          case 37:\n\t            frameId = getParamValue('frameName', node, tensorMap, context);\n\t            _data2 = getParamValue('tensor', node, tensorMap, context);\n\t            context.enterFrame(frameId);\n\t            return _context3.abrupt(\"return\", [cloneTensor(_data2)]);\n\n\t          case 41:\n\t            _data3 = getParamValue('tensor', node, tensorMap, context);\n\t            context.exitFrame();\n\t            return _context3.abrupt(\"return\", [cloneTensor(_data3)]);\n\n\t          case 44:\n\t            _data4 = getParamValue('tensor', node, tensorMap, context);\n\t            context.nextIteration();\n\t            return _context3.abrupt(\"return\", [cloneTensor(_data4)]);\n\n\t          case 47:\n\t            size = getParamValue('size', node, tensorMap, context);\n\t            dtype = getParamValue('dtype', node, tensorMap, context);\n\t            elementShape = getParamValue('elementShape', node, tensorMap, context);\n\t            dynamicSize = getParamValue('dynamicSize', node, tensorMap, context);\n\t            clearAfterRead = getParamValue('clearAfterRead', node, tensorMap, context);\n\t            identicalElementShapes = getParamValue('identicalElementShapes', node, tensorMap, context);\n\t            name = getParamValue('name', node, tensorMap, context);\n\t            tensorArray = new TensorArray(name, dtype, size, elementShape, identicalElementShapes, dynamicSize, clearAfterRead);\n\t            context.addTensorArray(tensorArray);\n\t            return _context3.abrupt(\"return\", [tensorArray.idTensor, scalar(1.0)]);\n\n\t          case 57:\n\t            id = getParamValue('tensorArrayId', node, tensorMap, context);\n\t            index = getParamValue('index', node, tensorMap, context);\n\t            writeTensor = getParamValue('tensor', node, tensorMap, context);\n\t            writeTensorArray = context.getTensorArray(id.id);\n\t            writeTensorArray.write(index, writeTensor);\n\t            return _context3.abrupt(\"return\", [writeTensorArray.idTensor]);\n\n\t          case 63:\n\t            readId = getParamValue('tensorArrayId', node, tensorMap, context);\n\t            readIndex = getParamValue('index', node, tensorMap, context);\n\t            readTensorArray = context.getTensorArray(readId.id);\n\t            return _context3.abrupt(\"return\", [readTensorArray.read(readIndex)]);\n\n\t          case 67:\n\t            gatherId = getParamValue('tensorArrayId', node, tensorMap, context);\n\t            gatherIndices = getParamValue('indices', node, tensorMap, context);\n\t            gatherDtype = getParamValue('dtype', node, tensorMap, context);\n\t            gatherTensorArray = context.getTensorArray(gatherId.id);\n\t            return _context3.abrupt(\"return\", [gatherTensorArray.gather(gatherIndices, gatherDtype)]);\n\n\t          case 72:\n\t            scatterId = getParamValue('tensorArrayId', node, tensorMap, context);\n\t            scatterIndices = getParamValue('indices', node, tensorMap, context);\n\t            scatterTensor = getParamValue('tensor', node, tensorMap, context);\n\t            scatterTensorArray = context.getTensorArray(scatterId.id);\n\t            scatterTensorArray.scatter(scatterIndices, scatterTensor);\n\t            return _context3.abrupt(\"return\", [scatterTensorArray.idTensor]);\n\n\t          case 78:\n\t            concatId = getParamValue('tensorArrayId', node, tensorMap, context);\n\t            concatTensorArray = context.getTensorArray(concatId.id);\n\t            concatDtype = getParamValue('dtype', node, tensorMap, context);\n\t            return _context3.abrupt(\"return\", [concatTensorArray.concat(concatDtype)]);\n\n\t          case 82:\n\t            splitId = getParamValue('tensorArrayId', node, tensorMap, context);\n\t            splitTensor = getParamValue('tensor', node, tensorMap, context);\n\t            lengths = getParamValue('lengths', node, tensorMap, context);\n\t            splitTensorArray = context.getTensorArray(splitId.id);\n\t            splitTensorArray.split(lengths, splitTensor);\n\t            return _context3.abrupt(\"return\", [splitTensorArray.idTensor]);\n\n\t          case 88:\n\t            sizeId = getParamValue('tensorArrayId', node, tensorMap, context);\n\t            sizeTensorArray = context.getTensorArray(sizeId.id);\n\t            return _context3.abrupt(\"return\", [scalar(sizeTensorArray.size(), 'int32')]);\n\n\t          case 91:\n\t            closeId = getParamValue('tensorArrayId', node, tensorMap, context);\n\t            closeTensorArray = context.getTensorArray(closeId.id);\n\t            closeTensorArray.clearAndClose();\n\t            return _context3.abrupt(\"return\", [closeTensorArray.idTensor]);\n\n\t          case 95:\n\t            idTensor = getParamValue('tensorListId', node, tensorMap, context);\n\t            _index = getParamValue('index', node, tensorMap, context);\n\t            _writeTensor = getParamValue('tensor', node, tensorMap, context);\n\t            tensorList = context.getTensorList(idTensor.id);\n\t            tensorList.setItem(_index, _writeTensor);\n\t            return _context3.abrupt(\"return\", [tensorList.idTensor]);\n\n\t          case 101:\n\t            _idTensor = getParamValue('tensorListId', node, tensorMap, context);\n\t            _readIndex = getParamValue('index', node, tensorMap, context);\n\t            _elementShape = getParamValue('elementShape', node, tensorMap, context);\n\t            elementDType = getParamValue('elementDType', node, tensorMap, context);\n\t            _tensorList = context.getTensorList(_idTensor.id);\n\t            return _context3.abrupt(\"return\", [_tensorList.getItem(_readIndex, _elementShape, elementDType)]);\n\n\t          case 107:\n\t            _scatterIndices = getParamValue('indices', node, tensorMap, context);\n\t            _scatterTensor = getParamValue('tensor', node, tensorMap, context);\n\t            _elementShape2 = getParamValue('elementShape', node, tensorMap, context);\n\t            numElements = getParamValue('numElements', node, tensorMap, context);\n\t            _tensorList2 = scatter(_scatterTensor, _scatterIndices, _elementShape2, numElements);\n\t            context.addTensorList(_tensorList2);\n\t            return _context3.abrupt(\"return\", [_tensorList2.idTensor]);\n\n\t          case 114:\n\t            _elementShape3 = getParamValue('elementShape', node, tensorMap, context);\n\t            elementDtype = getParamValue('elementDType', node, tensorMap, context);\n\n\t            if (node.op === 'TensorListReserve') {\n\t              numElementsParam = 'numElements';\n\t            } else {\n\t              numElementsParam = 'maxNumElements';\n\t            }\n\n\t            _numElements = getParamValue(numElementsParam, node, tensorMap, context);\n\t            _tensorList3 = reserve(_elementShape3, elementDtype, _numElements);\n\t            context.addTensorList(_tensorList3);\n\t            return _context3.abrupt(\"return\", [_tensorList3.idTensor]);\n\n\t          case 121:\n\t            _gatherId = getParamValue('tensorListId', node, tensorMap, context);\n\t            _gatherIndices = getParamValue('indices', node, tensorMap, context);\n\t            _elementShape4 = getParamValue('elementShape', node, tensorMap, context);\n\t            _elementDtype = getParamValue('elementDType', node, tensorMap, context);\n\t            _tensorList4 = context.getTensorList(_gatherId.id);\n\t            return _context3.abrupt(\"return\", [_tensorList4.gather(_gatherIndices, _elementDtype, _elementShape4)]);\n\n\t          case 127:\n\t            _idTensor2 = getParamValue('tensorListId', node, tensorMap, context);\n\t            _elementShape5 = getParamValue('elementShape', node, tensorMap, context);\n\t            _elementDtype2 = getParamValue('elementDType', node, tensorMap, context);\n\t            _numElements2 = getParamValue('numElements', node, tensorMap, context);\n\t            _tensorList5 = context.getTensorList(_idTensor2.id);\n\t            return _context3.abrupt(\"return\", [_tensorList5.stack(_elementShape5, _elementDtype2, _numElements2)]);\n\n\t          case 133:\n\t            tensor = getParamValue('tensor', node, tensorMap, context);\n\t            _elementShape6 = getParamValue('elementShape', node, tensorMap, context);\n\t            _elementDtype3 = getParamValue('elementDType', node, tensorMap, context);\n\t            _tensorList6 = fromTensor(tensor, _elementShape6, _elementDtype3);\n\t            context.addTensorList(_tensorList6);\n\t            return _context3.abrupt(\"return\", [_tensorList6.idTensor]);\n\n\t          case 139:\n\t            _concatId = getParamValue('tensorListId', node, tensorMap, context);\n\t            _tensorList7 = context.getTensorList(_concatId.id);\n\t            _concatDtype = getParamValue('dtype', node, tensorMap, context);\n\t            _elementShape7 = getParamValue('elementShape', node, tensorMap, context);\n\t            return _context3.abrupt(\"return\", [_tensorList7.concat(_concatDtype, _elementShape7)]);\n\n\t          case 144:\n\t            _idTensor3 = getParamValue('tensorListId', node, tensorMap, context);\n\t            _writeTensor2 = getParamValue('tensor', node, tensorMap, context);\n\t            _tensorList8 = context.getTensorList(_idTensor3.id);\n\n\t            _tensorList8.pushBack(_writeTensor2);\n\n\t            return _context3.abrupt(\"return\", [_tensorList8.idTensor]);\n\n\t          case 149:\n\t            _idTensor4 = getParamValue('tensorListId', node, tensorMap, context);\n\t            _elementShape8 = getParamValue('elementShape', node, tensorMap, context);\n\t            _elementDType = getParamValue('elementDType', node, tensorMap, context);\n\t            _tensorList9 = context.getTensorList(_idTensor4.id);\n\t            return _context3.abrupt(\"return\", [_tensorList9.popBack(_elementShape8, _elementDType)]);\n\n\t          case 154:\n\t            _splitTensor = getParamValue('tensor', node, tensorMap, context);\n\t            _elementShape9 = getParamValue('elementShape', node, tensorMap, context);\n\t            _lengths = getParamValue('lengths', node, tensorMap, context);\n\t            _tensorList10 = split$3(_splitTensor, _lengths, _elementShape9);\n\t            context.addTensorList(_tensorList10);\n\t            return _context3.abrupt(\"return\", [_tensorList10.idTensor]);\n\n\t          case 160:\n\t            throw TypeError(\"Node type \" + node.op + \" is not implemented\");\n\n\t          case 161:\n\t          case \"end\":\n\t            return _context3.stop();\n\t        }\n\t      }\n\t    }, _callee2);\n\t  }));\n\n\t  return function executeOp(_x, _x2, _x3) {\n\t    return _ref.apply(this, arguments);\n\t  };\n\t}();\n\tvar CATEGORY$2 = 'control';\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tfunction fusedConvAndDepthWiseParams(node, tensorMap, context) {\n\t  var _getParamValue = getParamValue('fusedOps', node, tensorMap, context),\n\t      extraOp = _getParamValue[0],\n\t      activationFunc = _getParamValue[1];\n\n\t  var isBiasAdd = extraOp === 'biasadd';\n\t  var isPrelu = activationFunc === 'prelu';\n\t  var isBatchNorm = extraOp === 'fusedbatchnorm';\n\t  var numArgs = getParamValue('numArgs', node, tensorMap, context);\n\n\t  if (isBiasAdd) {\n\t    if (isPrelu && numArgs !== 2) {\n\t      throw new Error('FusedConv2d and DepthwiseConv2d with BiasAdd and Prelu ' + 'must have two extra arguments: bias and alpha.');\n\t    }\n\n\t    if (!isPrelu && numArgs !== 1) {\n\t      throw new Error('FusedConv2d and DepthwiseConv2d with BiasAdd must have ' + 'one extra argument: bias.');\n\t    }\n\t  }\n\n\t  if (isBatchNorm) {\n\t    throw new Error('FusedConv2d and DepthwiseConv2d with FusedBatchNorm is not supported.');\n\t  }\n\n\t  var stride = getParamValue('strides', node, tensorMap, context);\n\t  var pad = getPadding(node, tensorMap, context);\n\t  var dataFormat = getParamValue('dataFormat', node, tensorMap, context).toUpperCase();\n\t  var dilations = getParamValue('dilations', node, tensorMap, context);\n\n\t  var _getParamValue2 = getParamValue('args', node, tensorMap, context),\n\t      biasArg = _getParamValue2[0],\n\t      preluArg = _getParamValue2[1];\n\n\t  var leakyreluAlpha = getParamValue('leakyreluAlpha', node, tensorMap, context);\n\t  return {\n\t    stride: stride,\n\t    pad: pad,\n\t    dataFormat: dataFormat,\n\t    dilations: dilations,\n\t    biasArg: biasArg,\n\t    preluArg: preluArg,\n\t    activationFunc: activationFunc,\n\t    leakyreluAlpha: leakyreluAlpha\n\t  };\n\t}\n\n\tvar executeOp$3 = function executeOp(node, tensorMap, context) {\n\t  switch (node.op) {\n\t    case 'Conv1D':\n\t      {\n\t        var stride = getParamValue('stride', node, tensorMap, context);\n\t        var pad = getParamValue('pad', node, tensorMap, context);\n\t        var dataFormat = getParamValue('dataFormat', node, tensorMap, context).toUpperCase();\n\t        var dilation = getParamValue('dilation', node, tensorMap, context);\n\t        return [conv1d(getParamValue('x', node, tensorMap, context), getParamValue('filter', node, tensorMap, context), stride, pad, dataFormat, dilation)];\n\t      }\n\n\t    case 'Conv2D':\n\t      {\n\t        var _stride = getParamValue('strides', node, tensorMap, context);\n\n\t        var _pad = getPadding(node, tensorMap, context);\n\n\t        var _dataFormat = getParamValue('dataFormat', node, tensorMap, context).toUpperCase();\n\n\t        var dilations = getParamValue('dilations', node, tensorMap, context);\n\t        return [conv2d(getParamValue('x', node, tensorMap, context), getParamValue('filter', node, tensorMap, context), [_stride[1], _stride[2]], _pad, _dataFormat, [dilations[1], dilations[2]])];\n\t      }\n\n\t    case '_FusedConv2D':\n\t      {\n\t        var _fusedConvAndDepthWis = fusedConvAndDepthWiseParams(node, tensorMap, context),\n\t            _stride2 = _fusedConvAndDepthWis.stride,\n\t            _pad2 = _fusedConvAndDepthWis.pad,\n\t            _dataFormat2 = _fusedConvAndDepthWis.dataFormat,\n\t            _dilations = _fusedConvAndDepthWis.dilations,\n\t            biasArg = _fusedConvAndDepthWis.biasArg,\n\t            preluArg = _fusedConvAndDepthWis.preluArg,\n\t            activationFunc = _fusedConvAndDepthWis.activationFunc,\n\t            leakyreluAlpha = _fusedConvAndDepthWis.leakyreluAlpha;\n\n\t        return [conv2d$1({\n\t          x: getParamValue('x', node, tensorMap, context),\n\t          filter: getParamValue('filter', node, tensorMap, context),\n\t          strides: [_stride2[1], _stride2[2]],\n\t          pad: _pad2,\n\t          dataFormat: _dataFormat2,\n\t          dilations: [_dilations[1], _dilations[2]],\n\t          bias: biasArg,\n\t          activation: activationFunc,\n\t          preluActivationWeights: preluArg,\n\t          leakyreluAlpha: leakyreluAlpha\n\t        })];\n\t      }\n\n\t    case 'FusedDepthwiseConv2dNative':\n\t      {\n\t        var _fusedConvAndDepthWis2 = fusedConvAndDepthWiseParams(node, tensorMap, context),\n\t            _stride3 = _fusedConvAndDepthWis2.stride,\n\t            _pad3 = _fusedConvAndDepthWis2.pad,\n\t            _dataFormat3 = _fusedConvAndDepthWis2.dataFormat,\n\t            _dilations2 = _fusedConvAndDepthWis2.dilations,\n\t            _biasArg = _fusedConvAndDepthWis2.biasArg,\n\t            _preluArg = _fusedConvAndDepthWis2.preluArg,\n\t            _activationFunc = _fusedConvAndDepthWis2.activationFunc,\n\t            _leakyreluAlpha = _fusedConvAndDepthWis2.leakyreluAlpha;\n\n\t        return [depthwiseConv2d$1({\n\t          x: getParamValue('x', node, tensorMap, context),\n\t          filter: getParamValue('filter', node, tensorMap, context),\n\t          strides: [_stride3[1], _stride3[2]],\n\t          pad: _pad3,\n\t          dataFormat: _dataFormat3,\n\t          dilations: [_dilations2[1], _dilations2[2]],\n\t          bias: _biasArg,\n\t          activation: _activationFunc,\n\t          preluActivationWeights: _preluArg,\n\t          leakyreluAlpha: _leakyreluAlpha\n\t        })];\n\t      }\n\n\t    case 'Conv2DBackpropInput':\n\t    case 'Conv2dTranspose':\n\t      {\n\t        var shape = getParamValue('outputShape', node, tensorMap, context);\n\n\t        var _stride4 = getParamValue('strides', node, tensorMap, context);\n\n\t        var _pad4 = getPadding(node, tensorMap, context);\n\n\t        return [conv2dTranspose(getParamValue('x', node, tensorMap, context), getParamValue('filter', node, tensorMap, context), shape, [_stride4[1], _stride4[2]], _pad4)];\n\t      }\n\n\t    case 'DepthwiseConv2dNative':\n\t    case 'DepthwiseConv2d':\n\t      {\n\t        var _stride5 = getParamValue('strides', node, tensorMap, context);\n\n\t        var _pad5 = getPadding(node, tensorMap, context);\n\n\t        var _dilations3 = getParamValue('dilations', node, tensorMap, context);\n\n\t        var _dataFormat4 = getParamValue('dataFormat', node, tensorMap, context).toUpperCase();\n\n\t        return [depthwiseConv2d(getParamValue('input', node, tensorMap, context), getParamValue('filter', node, tensorMap, context), [_stride5[1], _stride5[2]], _pad5, _dataFormat4, [_dilations3[1], _dilations3[2]])];\n\t      }\n\n\t    case 'Conv3D':\n\t      {\n\t        var _stride6 = getParamValue('strides', node, tensorMap, context);\n\n\t        var _pad6 = getParamValue('pad', node, tensorMap, context);\n\n\t        var _dataFormat5 = getParamValue('dataFormat', node, tensorMap, context).toUpperCase();\n\n\t        var _dilations4 = getParamValue('dilations', node, tensorMap, context);\n\n\t        return [conv3d(getParamValue('x', node, tensorMap, context), getParamValue('filter', node, tensorMap, context), [_stride6[1], _stride6[2], _stride6[3]], _pad6, _dataFormat5, [_dilations4[1], _dilations4[2], _dilations4[3]])];\n\t      }\n\n\t    case 'AvgPool':\n\t      {\n\t        var _stride7 = getParamValue('strides', node, tensorMap, context);\n\n\t        var _pad7 = getParamValue('pad', node, tensorMap, context);\n\n\t        var kernelSize = getParamValue('kernelSize', node, tensorMap, context);\n\t        return [avgPool(getParamValue('x', node, tensorMap, context), [kernelSize[1], kernelSize[2]], [_stride7[1], _stride7[2]], _pad7)];\n\t      }\n\n\t    case 'MaxPool':\n\t      {\n\t        var _stride8 = getParamValue('strides', node, tensorMap, context);\n\n\t        var _pad8 = getParamValue('pad', node, tensorMap, context);\n\n\t        var _kernelSize = getParamValue('kernelSize', node, tensorMap, context);\n\n\t        return [maxPool(getParamValue('x', node, tensorMap, context), [_kernelSize[1], _kernelSize[2]], [_stride8[1], _stride8[2]], _pad8)];\n\t      }\n\n\t    case 'MaxPoolWithArgmax':\n\t      {\n\t        var _stride9 = getParamValue('strides', node, tensorMap, context);\n\n\t        var _pad9 = getParamValue('pad', node, tensorMap, context);\n\n\t        var _kernelSize2 = getParamValue('kernelSize', node, tensorMap, context);\n\n\t        var includeBatchInIndex = getParamValue('includeBatchInIndex', node, tensorMap, context);\n\n\t        var _tfOps$maxPoolWithArg = maxPoolWithArgmax(getParamValue('x', node, tensorMap, context), [_kernelSize2[1], _kernelSize2[2]], [_stride9[1], _stride9[2]], _pad9, includeBatchInIndex),\n\t            result = _tfOps$maxPoolWithArg.result,\n\t            indexes = _tfOps$maxPoolWithArg.indexes;\n\n\t        return [result, indexes];\n\t      }\n\n\t    case 'AvgPool3D':\n\t      {\n\t        var _stride10 = getParamValue('strides', node, tensorMap, context);\n\n\t        var _pad10 = getParamValue('pad', node, tensorMap, context);\n\n\t        var _kernelSize3 = getParamValue('kernelSize', node, tensorMap, context);\n\n\t        return [avgPool3d(getParamValue('x', node, tensorMap, context), [_kernelSize3[1], _kernelSize3[2], _kernelSize3[3]], [_stride10[1], _stride10[2], _stride10[3]], _pad10)];\n\t      }\n\n\t    case 'MaxPool3D':\n\t      {\n\t        var _stride11 = getParamValue('strides', node, tensorMap, context);\n\n\t        var _pad11 = getParamValue('pad', node, tensorMap, context);\n\n\t        var _kernelSize4 = getParamValue('kernelSize', node, tensorMap, context);\n\n\t        return [maxPool3d(getParamValue('x', node, tensorMap, context), [_kernelSize4[1], _kernelSize4[2], _kernelSize4[3]], [_stride11[1], _stride11[2], _stride11[3]], _pad11)];\n\t      }\n\n\t    case 'Dilation2D':\n\t      {\n\t        var strides = getParamValue('strides', node, tensorMap, context);\n\n\t        var _pad12 = getParamValue('pad', node, tensorMap, context);\n\n\t        var _dilations5 = getParamValue('dilations', node, tensorMap, context); // strides: [1, stride_height, stride_width, 1].\n\n\n\t        var strideHeight = strides[1];\n\t        var strideWidth = strides[2]; // dilations: [1, dilation_height, dilation_width, 1].\n\n\t        var dilationHeight = _dilations5[1];\n\t        var dilationWidth = _dilations5[2];\n\t        return [dilation2d(getParamValue('x', node, tensorMap, context), getParamValue('filter', node, tensorMap, context), [strideHeight, strideWidth], _pad12, [dilationHeight, dilationWidth], 'NHWC'\n\t        /* dataFormat */\n\t        )];\n\t      }\n\n\t    default:\n\t      throw TypeError(\"Node type \" + node.op + \" is not implemented\");\n\t  }\n\t};\n\tvar CATEGORY$3 = 'convolution';\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar executeOp$4 = function executeOp(node, tensorMap, context) {\n\t  switch (node.op) {\n\t    case 'Fill':\n\t      {\n\t        var shape = getParamValue('shape', node, tensorMap, context);\n\t        var dtype = getParamValue('dtype', node, tensorMap, context);\n\t        var value = getParamValue('value', node, tensorMap, context);\n\t        return [fill(shape, value, dtype)];\n\t      }\n\n\t    case 'LinSpace':\n\t      {\n\t        var start = getParamValue('start', node, tensorMap, context);\n\t        var stop = getParamValue('stop', node, tensorMap, context);\n\t        var num = getParamValue('num', node, tensorMap, context);\n\t        return [linspace(start, stop, num)];\n\t      }\n\n\t    case 'Multinomial':\n\t      {\n\t        var logits = getParamValue('logits', node, tensorMap, context);\n\t        var numSamples = getParamValue('numSamples', node, tensorMap, context);\n\t        var seed = getParamValue('seed', node, tensorMap, context);\n\t        return [multinomial(logits, numSamples, seed)];\n\t      }\n\n\t    case 'OneHot':\n\t      {\n\t        var indices = getParamValue('indices', node, tensorMap, context);\n\t        var depth = getParamValue('depth', node, tensorMap, context);\n\t        var onValue = getParamValue('onValue', node, tensorMap, context);\n\t        var offValue = getParamValue('offValue', node, tensorMap, context);\n\t        return [oneHot(indices, depth, onValue, offValue)];\n\t      }\n\n\t    case 'Ones':\n\t      {\n\t        return [ones$1(getParamValue('shape', node, tensorMap, context), getParamValue('dtype', node, tensorMap, context))];\n\t      }\n\n\t    case 'OnesLike':\n\t      {\n\t        return [onesLike(getParamValue('x', node, tensorMap, context))];\n\t      }\n\n\t    case 'RandomUniform':\n\t      {\n\t        return [randomUniform( // tslint:disable-next-line:no-any\n\t        getParamValue('shape', node, tensorMap, context), getParamValue('minval', node, tensorMap, context), getParamValue('maxval', node, tensorMap, context), getParamValue('dtype', node, tensorMap, context))];\n\t      }\n\n\t    case 'Range':\n\t      {\n\t        var _start = getParamValue('start', node, tensorMap, context);\n\n\t        var _stop = getParamValue('stop', node, tensorMap, context);\n\n\t        var step = getParamValue('step', node, tensorMap, context);\n\t        return [range(_start, _stop, step, getParamValue('dtype', node, tensorMap, context))];\n\t      }\n\n\t    case 'TruncatedNormal':\n\t      {\n\t        var _shape = getParamValue('shape', node, tensorMap, context);\n\n\t        var mean = getParamValue('mean', node, tensorMap, context);\n\t        var stdDev = getParamValue('stdDev', node, tensorMap, context);\n\n\t        var _seed = getParamValue('seed', node, tensorMap, context);\n\n\t        return [truncatedNormal(_shape, mean, stdDev, getParamValue('dtype', node, tensorMap, context), _seed)];\n\t      }\n\n\t    case 'Zeros':\n\t      {\n\t        return [zeros(getParamValue('shape', node, tensorMap, context), getParamValue('dtype', node, tensorMap, context))];\n\t      }\n\n\t    case 'ZerosLike':\n\t      {\n\t        return [zerosLike(getParamValue('x', node, tensorMap, context))];\n\t      }\n\n\t    default:\n\t      throw TypeError(\"Node type \" + node.op + \" is not implemented\");\n\t  }\n\t};\n\tvar CATEGORY$4 = 'creation';\n\n\tfunction nmsParams(node, tensorMap, context) {\n\t  var boxes = getParamValue('boxes', node, tensorMap, context);\n\t  var scores = getParamValue('scores', node, tensorMap, context);\n\t  var maxOutputSize = getParamValue('maxOutputSize', node, tensorMap, context);\n\t  var iouThreshold = getParamValue('iouThreshold', node, tensorMap, context);\n\t  var scoreThreshold = getParamValue('scoreThreshold', node, tensorMap, context);\n\t  var softNmsSigma = getParamValue('softNmsSigma', node, tensorMap, context);\n\t  return {\n\t    boxes: boxes,\n\t    scores: scores,\n\t    maxOutputSize: maxOutputSize,\n\t    iouThreshold: iouThreshold,\n\t    scoreThreshold: scoreThreshold,\n\t    softNmsSigma: softNmsSigma\n\t  };\n\t}\n\n\tvar executeOp$5 = /*#__PURE__*/function () {\n\t  var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(node, tensorMap, context) {\n\t    var _nmsParams, boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma, result, _nmsParams2, _boxes, _scores, _maxOutputSize, _iouThreshold, _scoreThreshold, padToMaxOutputSize, _result, _nmsParams3, _boxes2, _scores2, _maxOutputSize2, _iouThreshold2, _scoreThreshold2, condition, _result2;\n\n\t    return regeneratorRuntime.wrap(function _callee$(_context) {\n\t      while (1) {\n\t        switch (_context.prev = _context.next) {\n\t          case 0:\n\t            _context.t0 = node.op;\n\t            _context.next = _context.t0 === 'NonMaxSuppressionV5' ? 3 : _context.t0 === 'NonMaxSuppressionV4' ? 8 : _context.t0 === 'NonMaxSuppressionV3' ? 14 : _context.t0 === 'NonMaxSuppressionV2' ? 14 : _context.t0 === 'Where' ? 19 : _context.t0 === 'ListDiff' ? 26 : 27;\n\t            break;\n\n\t          case 3:\n\t            _nmsParams = nmsParams(node, tensorMap, context), boxes = _nmsParams.boxes, scores = _nmsParams.scores, maxOutputSize = _nmsParams.maxOutputSize, iouThreshold = _nmsParams.iouThreshold, scoreThreshold = _nmsParams.scoreThreshold, softNmsSigma = _nmsParams.softNmsSigma;\n\t            _context.next = 6;\n\t            return image.nonMaxSuppressionWithScoreAsync(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma);\n\n\t          case 6:\n\t            result = _context.sent;\n\t            return _context.abrupt(\"return\", [result.selectedIndices, result.selectedScores]);\n\n\t          case 8:\n\t            _nmsParams2 = nmsParams(node, tensorMap, context), _boxes = _nmsParams2.boxes, _scores = _nmsParams2.scores, _maxOutputSize = _nmsParams2.maxOutputSize, _iouThreshold = _nmsParams2.iouThreshold, _scoreThreshold = _nmsParams2.scoreThreshold;\n\t            padToMaxOutputSize = getParamValue('padToMaxOutputSize', node, tensorMap, context);\n\t            _context.next = 12;\n\t            return image.nonMaxSuppressionPaddedAsync(_boxes, _scores, _maxOutputSize, _iouThreshold, _scoreThreshold, padToMaxOutputSize);\n\n\t          case 12:\n\t            _result = _context.sent;\n\t            return _context.abrupt(\"return\", [_result.selectedIndices, _result.validOutputs]);\n\n\t          case 14:\n\t            _nmsParams3 = nmsParams(node, tensorMap, context), _boxes2 = _nmsParams3.boxes, _scores2 = _nmsParams3.scores, _maxOutputSize2 = _nmsParams3.maxOutputSize, _iouThreshold2 = _nmsParams3.iouThreshold, _scoreThreshold2 = _nmsParams3.scoreThreshold;\n\t            _context.next = 17;\n\t            return image.nonMaxSuppressionAsync(_boxes2, _scores2, _maxOutputSize2, _iouThreshold2, _scoreThreshold2);\n\n\t          case 17:\n\t            _context.t1 = _context.sent;\n\t            return _context.abrupt(\"return\", [_context.t1]);\n\n\t          case 19:\n\t            condition = cast(getParamValue('condition', node, tensorMap, context), 'bool');\n\t            _context.next = 22;\n\t            return whereAsync(condition);\n\n\t          case 22:\n\t            _context.t2 = _context.sent;\n\t            _result2 = [_context.t2];\n\t            condition.dispose();\n\t            return _context.abrupt(\"return\", _result2);\n\n\t          case 26:\n\t            return _context.abrupt(\"return\", setdiff1dAsync(getParamValue('x', node, tensorMap, context), getParamValue('y', node, tensorMap, context)));\n\n\t          case 27:\n\t            throw TypeError(\"Node type \" + node.op + \" is not implemented\");\n\n\t          case 28:\n\t          case \"end\":\n\t            return _context.stop();\n\t        }\n\t      }\n\t    }, _callee);\n\t  }));\n\n\t  return function executeOp(_x, _x2, _x3) {\n\t    return _ref.apply(this, arguments);\n\t  };\n\t}();\n\tvar CATEGORY$5 = 'dynamic';\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar executeOp$6 = function executeOp(node, tensorMap, context) {\n\t  switch (node.op) {\n\t    case 'TopKV2':\n\t      {\n\t        var x = getParamValue('x', node, tensorMap, context);\n\t        var k = getParamValue('k', node, tensorMap, context);\n\t        var sorted = getParamValue('sorted', node, tensorMap, context);\n\t        var result = topk(x, k, sorted);\n\t        return [result.values, result.indices];\n\t      }\n\n\t    case 'Unique':\n\t      {\n\t        var _x = getParamValue('x', node, tensorMap, context);\n\n\t        var _result = unique(_x);\n\n\t        return [_result.values, _result.indices];\n\t      }\n\n\t    case 'UniqueV2':\n\t      {\n\t        var _x2 = getParamValue('x', node, tensorMap, context);\n\n\t        var axis = getParamValue('axis', node, tensorMap, context);\n\n\t        var _result2 = unique(_x2, axis);\n\n\t        return [_result2.values, _result2.indices];\n\t      }\n\n\t    default:\n\t      throw TypeError(\"Node type \" + node.op + \" is not implemented\");\n\t  }\n\t};\n\tvar CATEGORY$6 = 'evaluation';\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar executeOp$7 = function executeOp(node, tensorMap, context) {\n\t  switch (node.op) {\n\t    case 'Const':\n\t      {\n\t        return tensorMap[node.name];\n\t      }\n\n\t    case 'PlaceholderWithDefault':\n\t      var def = getParamValue('default', node, tensorMap, context);\n\t      return [getTensor(node.name, tensorMap, context) || def];\n\n\t    case 'Placeholder':\n\t      return [getTensor(node.name, tensorMap, context)];\n\n\t    case 'Identity':\n\t    case 'StopGradient':\n\t    case 'FakeQuantWithMinMaxVars':\n\t      {\n\t        // This op is currently ignored.\n\t        var _data = getParamValue('x', node, tensorMap, context);\n\n\t        return [cloneTensor(_data)];\n\t      }\n\n\t    case 'IdentityN':\n\t      return getParamValue('x', node, tensorMap, context).map(function (t) {\n\t        return cloneTensor(t);\n\t      });\n\n\t    case 'Snapshot':\n\t      var snapshot = getParamValue('x', node, tensorMap, context);\n\t      return [cloneTensor(snapshot)];\n\n\t    case 'Shape':\n\t      return [tensor1d(getParamValue('x', node, tensorMap, context).shape, 'int32')];\n\n\t    case 'ShapeN':\n\t      return getParamValue('x', node, tensorMap, context).map(function (t) {\n\t        return tensor1d(t.shape);\n\t      });\n\n\t    case 'Size':\n\t      return [scalar(getParamValue('x', node, tensorMap, context).size, 'int32')];\n\n\t    case 'Rank':\n\t      return [scalar(getParamValue('x', node, tensorMap, context).rank, 'int32')];\n\n\t    case 'NoOp':\n\t      return [scalar(1)];\n\n\t    case 'Print':\n\t      var input = getParamValue('x', node, tensorMap, context);\n\t      var data = getParamValue('data', node, tensorMap, context);\n\t      var message = getParamValue('message', node, tensorMap, context);\n\t      var summarize = getParamValue('summarize', node, tensorMap, context);\n\t      console.warn('The graph has a tf.print() operation,' + 'usually used for debugging, which slows down performance.');\n\t      console.log(message);\n\n\t      for (var i = 0; i < data.length; i++) {\n\t        console.log(Array.prototype.slice.call(data[i].dataSync()).slice(0, summarize));\n\t      }\n\n\t      return [input];\n\n\t    default:\n\t      throw TypeError(\"Node type \" + node.op + \" is not implemented\");\n\t  }\n\t};\n\tvar CATEGORY$7 = 'graph';\n\n\t/**\n\t * Hashtable contains a set of tensors, which can be accessed by key.\n\t */\n\n\tvar HashTable = /*#__PURE__*/function () {\n\t  /**\n\t   * Constructor of HashTable. Creates a hash table.\n\t   *\n\t   * @param keyDType `dtype` of the table keys.\n\t   * @param valueDType `dtype` of the table values.\n\t   */\n\t  function HashTable(keyDType, valueDType) {\n\t    this.keyDType = keyDType;\n\t    this.valueDType = valueDType;\n\t    this.handle = scalar(0); // tslint:disable-next-line: no-any\n\n\t    this.tensorMap = new Map();\n\t    keep(this.handle);\n\t  }\n\n\t  var _proto = HashTable.prototype;\n\n\t  /**\n\t   * Dispose the tensors and handle and clear the hashtable.\n\t   */\n\t  _proto.clearAndClose = function clearAndClose() {\n\t    this.tensorMap.forEach(function (value) {\n\t      return value.dispose();\n\t    });\n\t    this.tensorMap.clear();\n\t    this.handle.dispose();\n\t  }\n\t  /**\n\t   * The number of items in the hash table.\n\t   */\n\t  ;\n\n\t  _proto.size = function size() {\n\t    return this.tensorMap.size;\n\t  }\n\t  /**\n\t   * Replaces the contents of the table with the specified keys and values.\n\t   * @param keys Keys to store in the hashtable.\n\t   * @param values Values to store in the hashtable.\n\t   */\n\t  ;\n\n\t  _proto.import =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _import2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(keys, values) {\n\t      var _this = this;\n\n\t      var $keys;\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              this.checkKeyAndValueTensor(keys, values); // We only store the primitive values of the keys, this allows lookup\n\t              // to be O(1).\n\n\t              _context.next = 3;\n\t              return keys.data();\n\n\t            case 3:\n\t              $keys = _context.sent;\n\t              // Clear the hashTable before inserting new values.\n\t              this.tensorMap.forEach(function (value) {\n\t                return value.dispose();\n\t              });\n\t              this.tensorMap.clear();\n\t              return _context.abrupt(\"return\", tidy(function () {\n\t                var $values = unstack(values);\n\t                var keysLength = $keys.length;\n\t                var valuesLength = $values.length;\n\t                assert(keysLength === valuesLength, function () {\n\t                  return \"The number of elements doesn't match, keys has \" + (keysLength + \" elements, the values has \" + valuesLength + \" \") + \"elements.\";\n\t                });\n\n\t                for (var i = 0; i < keysLength; i++) {\n\t                  var key = $keys[i];\n\t                  var value = $values[i];\n\t                  keep(value);\n\n\t                  _this.tensorMap.set(key, value);\n\t                }\n\n\t                return _this.handle;\n\t              }));\n\n\t            case 7:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function _import(_x, _x2) {\n\t      return _import2.apply(this, arguments);\n\t    }\n\n\t    return _import;\n\t  }()\n\t  /**\n\t   * Looks up keys in a hash table, outputs the corresponding values.\n\t   *\n\t   * Performs batch lookups, for every element in the key tensor, `find`\n\t   * stacks the corresponding value into the return tensor.\n\t   *\n\t   * If an element is not present in the table, the given `defaultValue` is\n\t   * used.\n\t   *\n\t   * @param keys Keys to look up. Must have the same type as the keys of the\n\t   *     table.\n\t   * @param defaultValue The scalar `defaultValue` is the value output for keys\n\t   *     not present in the table. It must also be of the same type as the\n\t   *     table values.\n\t   */\n\t  ;\n\n\t  _proto.find =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _find = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(keys, defaultValue) {\n\t      var _this2 = this;\n\n\t      var $keys;\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              this.checkKeyAndValueTensor(keys, defaultValue);\n\t              _context2.next = 3;\n\t              return keys.data();\n\n\t            case 3:\n\t              $keys = _context2.sent;\n\t              return _context2.abrupt(\"return\", tidy(function () {\n\t                var result = [];\n\n\t                for (var i = 0; i < $keys.length; i++) {\n\t                  var key = $keys[i];\n\n\t                  var value = _this2.findWithDefault(key, defaultValue);\n\n\t                  result.push(value);\n\t                }\n\n\t                return stack(result);\n\t              }));\n\n\t            case 5:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function find(_x3, _x4) {\n\t      return _find.apply(this, arguments);\n\t    }\n\n\t    return find;\n\t  }() // tslint:disable-next-line: no-any\n\t  ;\n\n\t  _proto.findWithDefault = function findWithDefault(key, defaultValue) {\n\t    var result = this.tensorMap.get(key);\n\t    return result != null ? result : defaultValue;\n\t  };\n\n\t  _proto.checkKeyAndValueTensor = function checkKeyAndValueTensor(key, value) {\n\t    if (key.dtype !== this.keyDType) {\n\t      throw new Error(\"Expect key dtype \" + this.keyDType + \", but got \" + (\"\" + key.dtype));\n\t    }\n\n\t    if (value.dtype !== this.valueDType) {\n\t      throw new Error(\"Expect value dtype \" + this.valueDType + \", but got \" + (\"\" + value.dtype));\n\t    }\n\t  };\n\n\t  _createClass(HashTable, [{\n\t    key: \"id\",\n\t    get: function get() {\n\t      return this.handle.id;\n\t    }\n\t  }]);\n\n\t  return HashTable;\n\t}();\n\n\tvar executeOp$8 = /*#__PURE__*/function () {\n\t  var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(node, tensorMap, context, resourceManager) {\n\t    var keyDType, valueDType, hashTable, handle, keys, values, _hashTable, _handle, _keys, defaultValue, _hashTable2;\n\n\t    return regeneratorRuntime.wrap(function _callee$(_context) {\n\t      while (1) {\n\t        switch (_context.prev = _context.next) {\n\t          case 0:\n\t            _context.t0 = node.op;\n\t            _context.next = _context.t0 === 'HashTable' ? 3 : _context.t0 === 'HashTableV2' ? 3 : _context.t0 === 'LookupTableImport' ? 8 : _context.t0 === 'LookupTableImportV2' ? 8 : _context.t0 === 'LookupTableFind' ? 16 : _context.t0 === 'LookupTableFindV2' ? 16 : 24;\n\t            break;\n\n\t          case 3:\n\t            keyDType = getParamValue('keyDType', node, tensorMap, context);\n\t            valueDType = getParamValue('valueDType', node, tensorMap, context);\n\t            hashTable = new HashTable(keyDType, valueDType);\n\t            resourceManager.addHashTable(node.name, hashTable);\n\t            return _context.abrupt(\"return\", [hashTable.handle]);\n\n\t          case 8:\n\t            handle = getParamValue('tableHandle', node, tensorMap, context, resourceManager);\n\t            keys = getParamValue('keys', node, tensorMap, context);\n\t            values = getParamValue('values', node, tensorMap, context);\n\t            _hashTable = resourceManager.getHashTableById(handle.id);\n\t            _context.next = 14;\n\t            return _hashTable.import(keys, values);\n\n\t          case 14:\n\t            _context.t1 = _context.sent;\n\t            return _context.abrupt(\"return\", [_context.t1]);\n\n\t          case 16:\n\t            _handle = getParamValue('tableHandle', node, tensorMap, context, resourceManager);\n\t            _keys = getParamValue('keys', node, tensorMap, context);\n\t            defaultValue = getParamValue('defaultValue', node, tensorMap, context);\n\t            _hashTable2 = resourceManager.getHashTableById(_handle.id);\n\t            _context.next = 22;\n\t            return _hashTable2.find(_keys, defaultValue);\n\n\t          case 22:\n\t            _context.t2 = _context.sent;\n\t            return _context.abrupt(\"return\", [_context.t2]);\n\n\t          case 24:\n\t            throw TypeError(\"Node type \" + node.op + \" is not implemented\");\n\n\t          case 25:\n\t          case \"end\":\n\t            return _context.stop();\n\t        }\n\t      }\n\t    }, _callee);\n\t  }));\n\n\t  return function executeOp(_x, _x2, _x3, _x4) {\n\t    return _ref.apply(this, arguments);\n\t  };\n\t}();\n\tvar CATEGORY$8 = 'hash_table';\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar executeOp$9 = function executeOp(node, tensorMap, context) {\n\t  switch (node.op) {\n\t    case 'ResizeBilinear':\n\t      {\n\t        var images = getParamValue('images', node, tensorMap, context);\n\t        var size = getParamValue('size', node, tensorMap, context);\n\t        var alignCorners = getParamValue('alignCorners', node, tensorMap, context);\n\t        var halfPixelCenters = getParamValue('halfPixelCenters', node, tensorMap, context);\n\t        return [image.resizeBilinear(images, [size[0], size[1]], alignCorners, halfPixelCenters)];\n\t      }\n\n\t    case 'ResizeNearestNeighbor':\n\t      {\n\t        var _images = getParamValue('images', node, tensorMap, context);\n\n\t        var _size = getParamValue('size', node, tensorMap, context);\n\n\t        var _alignCorners = getParamValue('alignCorners', node, tensorMap, context);\n\n\t        var _halfPixelCenters = getParamValue('halfPixelCenters', node, tensorMap, context);\n\n\t        return [image.resizeNearestNeighbor(_images, [_size[0], _size[1]], _alignCorners, _halfPixelCenters)];\n\t      }\n\n\t    case 'CropAndResize':\n\t      {\n\t        var image$1 = getParamValue('image', node, tensorMap, context);\n\t        var boxes = getParamValue('boxes', node, tensorMap, context);\n\t        var boxInd = getParamValue('boxInd', node, tensorMap, context);\n\t        var cropSize = getParamValue('cropSize', node, tensorMap, context);\n\t        var method = getParamValue('method', node, tensorMap, context);\n\t        var extrapolationValue = getParamValue('extrapolationValue', node, tensorMap, context);\n\t        return [image.cropAndResize(image$1, boxes, boxInd, cropSize, method, extrapolationValue)];\n\t      }\n\n\t    default:\n\t      throw TypeError(\"Node type \" + node.op + \" is not implemented\");\n\t  }\n\t};\n\tvar CATEGORY$9 = 'image';\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar executeOp$a = function executeOp(node, tensorMap, context) {\n\t  switch (node.op) {\n\t    case 'Equal':\n\t      {\n\t        return [equal(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n\t      }\n\n\t    case 'NotEqual':\n\t      {\n\t        return [notEqual(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n\t      }\n\n\t    case 'Greater':\n\t      {\n\t        return [greater(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n\t      }\n\n\t    case 'GreaterEqual':\n\t      {\n\t        return [greaterEqual(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n\t      }\n\n\t    case 'Less':\n\t      {\n\t        return [less(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n\t      }\n\n\t    case 'LessEqual':\n\t      {\n\t        return [lessEqual(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n\t      }\n\n\t    case 'LogicalAnd':\n\t      {\n\t        return [logicalAnd(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n\t      }\n\n\t    case 'LogicalNot':\n\t      {\n\t        return [logicalNot(getParamValue('a', node, tensorMap, context))];\n\t      }\n\n\t    case 'LogicalOr':\n\t      {\n\t        return [logicalOr(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n\t      }\n\n\t    case 'Select':\n\t    case 'SelectV2':\n\t      {\n\t        return [where(getParamValue('condition', node, tensorMap, context), getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n\t      }\n\n\t    default:\n\t      throw TypeError(\"Node type \" + node.op + \" is not implemented\");\n\t  }\n\t};\n\tvar CATEGORY$a = 'logical';\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar executeOp$b = function executeOp(node, tensorMap, context) {\n\t  switch (node.op) {\n\t    case 'BatchMatMul':\n\t    case 'BatchMatMulV2':\n\t    case 'MatMul':\n\t      return [matMul(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context), getParamValue('transposeA', node, tensorMap, context), getParamValue('transposeB', node, tensorMap, context))];\n\n\t    case 'Transpose':\n\t      return [transpose(getParamValue('x', node, tensorMap, context), getParamValue('perm', node, tensorMap, context))];\n\n\t    case '_FusedMatMul':\n\t      var _getParamValue = getParamValue('fusedOps', node, tensorMap, context),\n\t          extraOp = _getParamValue[0],\n\t          activationFunc = _getParamValue[1];\n\n\t      var isBiasAdd = extraOp === 'biasadd';\n\t      var isPrelu = activationFunc === 'prelu';\n\t      var numArgs = getParamValue('numArgs', node, tensorMap, context);\n\t      var leakyreluAlpha = getParamValue('leakyreluAlpha', node, tensorMap, context);\n\n\t      if (isBiasAdd) {\n\t        if (isPrelu && numArgs !== 2) {\n\t          throw new Error('Fused MatMul with BiasAdd and Prelu must have two ' + 'extra arguments: bias and alpha.');\n\t        }\n\n\t        if (!isPrelu && numArgs !== 1) {\n\t          throw new Error('Fused MatMul with BiasAdd must have one extra argument: bias.');\n\t        }\n\t      }\n\n\t      var _getParamValue2 = getParamValue('args', node, tensorMap, context),\n\t          biasArg = _getParamValue2[0],\n\t          preluArg = _getParamValue2[1];\n\n\t      return [matMul$1({\n\t        a: getParamValue('a', node, tensorMap, context),\n\t        b: getParamValue('b', node, tensorMap, context),\n\t        transposeA: getParamValue('transposeA', node, tensorMap, context),\n\t        transposeB: getParamValue('transposeB', node, tensorMap, context),\n\t        bias: biasArg,\n\t        activation: activationFunc,\n\t        preluActivationWeights: preluArg,\n\t        leakyreluAlpha: leakyreluAlpha\n\t      })];\n\n\t    default:\n\t      throw TypeError(\"Node type \" + node.op + \" is not implemented\");\n\t  }\n\t};\n\tvar CATEGORY$b = 'matrices';\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar executeOp$c = function executeOp(node, tensorMap, context) {\n\t  switch (node.op) {\n\t    case 'FusedBatchNorm':\n\t    case 'FusedBatchNormV2':\n\t      {\n\t        return [batchNorm(getParamValue('x', node, tensorMap, context), getParamValue('mean', node, tensorMap, context), getParamValue('variance', node, tensorMap, context), getParamValue('offset', node, tensorMap, context), getParamValue('scale', node, tensorMap, context), getParamValue('epsilon', node, tensorMap, context))];\n\t      }\n\n\t    case 'FusedBatchNormV3':\n\t      {\n\t        return [batchNorm(getParamValue('x', node, tensorMap, context), getParamValue('mean', node, tensorMap, context), getParamValue('variance', node, tensorMap, context), getParamValue('offset', node, tensorMap, context), getParamValue('scale', node, tensorMap, context), getParamValue('epsilon', node, tensorMap, context))];\n\t      }\n\n\t    case 'LRN':\n\t      {\n\t        return [localResponseNormalization(getParamValue('x', node, tensorMap, context), getParamValue('radius', node, tensorMap, context), getParamValue('bias', node, tensorMap, context), getParamValue('alpha', node, tensorMap, context), getParamValue('beta', node, tensorMap, context))];\n\t      }\n\n\t    case 'Softmax':\n\t      {\n\t        return [softmax(getParamValue('x', node, tensorMap, context))];\n\t      }\n\n\t    case 'LogSoftmax':\n\t      {\n\t        return [logSoftmax(getParamValue('x', node, tensorMap, context))];\n\t      }\n\n\t    case 'SparseToDense':\n\t      {\n\t        return [sparseToDense(getParamValue('sparseIndices', node, tensorMap, context), getParamValue('outputShape', node, tensorMap, context), getParamValue('sparseValues', node, tensorMap, context), getParamValue('defaultValue', node, tensorMap, context))];\n\t      }\n\n\t    default:\n\t      throw TypeError(\"Node type \" + node.op + \" is not implemented\");\n\t  }\n\t};\n\tvar CATEGORY$c = 'normalization';\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar executeOp$d = function executeOp(node, tensorMap, context) {\n\t  switch (node.op) {\n\t    case 'Max':\n\t      {\n\t        var axis = getParamValue('axis', node, tensorMap, context);\n\t        var keepDims = getParamValue('keepDims', node, tensorMap, context);\n\t        return [max$4(getParamValue('x', node, tensorMap, context), axis, keepDims)];\n\t      }\n\n\t    case 'Mean':\n\t      {\n\t        var _axis = getParamValue('axis', node, tensorMap, context);\n\n\t        var _keepDims = getParamValue('keepDims', node, tensorMap, context);\n\n\t        return [mean(getParamValue('x', node, tensorMap, context), _axis, _keepDims)];\n\t      }\n\n\t    case 'Min':\n\t      {\n\t        var _axis2 = getParamValue('axis', node, tensorMap, context);\n\n\t        var _keepDims2 = getParamValue('keepDims', node, tensorMap, context);\n\n\t        return [min$9(getParamValue('x', node, tensorMap, context), _axis2, _keepDims2)];\n\t      }\n\n\t    case 'Sum':\n\t      {\n\t        var _axis3 = getParamValue('axis', node, tensorMap, context);\n\n\t        var _keepDims3 = getParamValue('keepDims', node, tensorMap, context);\n\n\t        return [sum$1(getParamValue('x', node, tensorMap, context), _axis3, _keepDims3)];\n\t      }\n\n\t    case 'All':\n\t      {\n\t        var _axis4 = getParamValue('axis', node, tensorMap, context);\n\n\t        var _keepDims4 = getParamValue('keepDims', node, tensorMap, context);\n\n\t        return [all(getParamValue('x', node, tensorMap, context), _axis4, _keepDims4)];\n\t      }\n\n\t    case 'Any':\n\t      {\n\t        var _axis5 = getParamValue('axis', node, tensorMap, context);\n\n\t        var _keepDims5 = getParamValue('keepDims', node, tensorMap, context);\n\n\t        return [any(getParamValue('x', node, tensorMap, context), _axis5, _keepDims5)];\n\t      }\n\n\t    case 'ArgMax':\n\t      {\n\t        var _axis6 = getParamValue('axis', node, tensorMap, context);\n\n\t        return [argMax(getParamValue('x', node, tensorMap, context), _axis6)];\n\t      }\n\n\t    case 'ArgMin':\n\t      {\n\t        var _axis7 = getParamValue('axis', node, tensorMap, context);\n\n\t        return [argMin(getParamValue('x', node, tensorMap, context), _axis7)];\n\t      }\n\n\t    case 'Prod':\n\t      {\n\t        var _axis8 = getParamValue('axis', node, tensorMap, context);\n\n\t        var _keepDims6 = getParamValue('keepDims', node, tensorMap, context);\n\n\t        return [prod(getParamValue('x', node, tensorMap, context), _axis8, _keepDims6)];\n\t      }\n\n\t    case 'Cumsum':\n\t      {\n\t        var _axis9 = getParamValue('axis', node, tensorMap, context);\n\n\t        var exclusive = getParamValue('exclusive', node, tensorMap, context);\n\t        var reverse = getParamValue('reverse', node, tensorMap, context);\n\t        return [cumsum(getParamValue('x', node, tensorMap, context), _axis9, exclusive, reverse)];\n\t      }\n\n\t    case 'Bincount':\n\t      var x = getParamValue('x', node, tensorMap, context);\n\t      var weights = getParamValue('weights', node, tensorMap, context);\n\t      var size = getParamValue('size', node, tensorMap, context);\n\t      return [bincount(x, weights, size)];\n\n\t    case 'DenseBincount':\n\t      {\n\t        var _x = getParamValue('x', node, tensorMap, context);\n\n\t        var _weights = getParamValue('weights', node, tensorMap, context);\n\n\t        var _size = getParamValue('size', node, tensorMap, context);\n\n\t        var binaryOutput = getParamValue('binaryOutput', node, tensorMap, context);\n\t        return [denseBincount(_x, _weights, _size, binaryOutput)];\n\t      }\n\n\t    default:\n\t      throw TypeError(\"Node type \" + node.op + \" is not implemented\");\n\t  }\n\t};\n\tvar CATEGORY$d = 'reduction';\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar executeOp$e = function executeOp(node, tensorMap, context) {\n\t  switch (node.op) {\n\t    case 'ConcatV2':\n\t    case 'Concat':\n\t      {\n\t        var n = getParamValue('n', node, tensorMap, context);\n\t        var axis = getParamValue('axis', node, tensorMap, context);\n\t        var inputs = getParamValue('tensors', node, tensorMap, context);\n\t        inputs = inputs.slice(0, n);\n\t        return [concat(inputs, axis)];\n\t      }\n\n\t    case 'Gather':\n\t      {\n\t        var input = getParamValue('x', node, tensorMap, context);\n\t        var indices = getParamValue('indices', node, tensorMap, context);\n\t        return [gather(input, cast(indices, 'int32'), 0)];\n\t      }\n\n\t    case 'GatherV2':\n\t      {\n\t        var _axis = getParamValue('axis', node, tensorMap, context);\n\n\t        var batchDims = getParamValue('batchDims', node, tensorMap, context);\n\n\t        var _input = getParamValue('x', node, tensorMap, context);\n\n\t        var _indices = getParamValue('indices', node, tensorMap, context);\n\n\t        return [gather(_input, cast(_indices, 'int32'), _axis, batchDims)];\n\t      }\n\n\t    case 'Reverse':\n\t      {\n\t        var dims = getParamValue('dims', node, tensorMap, context);\n\t        var _axis2 = [];\n\n\t        for (var i = 0; i < dims.length; i++) {\n\t          if (dims[i]) {\n\t            _axis2.push(i);\n\t          }\n\t        }\n\n\t        var _input2 = getParamValue('x', node, tensorMap, context);\n\n\t        return [reverse(_input2, _axis2)];\n\t      }\n\n\t    case 'ReverseV2':\n\t      {\n\t        var _axis3 = getParamValue('axis', node, tensorMap, context);\n\n\t        var _input3 = getParamValue('x', node, tensorMap, context);\n\n\t        return [reverse(_input3, _axis3)];\n\t      }\n\n\t    case 'Slice':\n\t      {\n\t        // tslint:disable-next-line:no-any\n\t        var begin = getParamValue('begin', node, tensorMap, context); // tslint:disable-next-line:no-any\n\n\t        var size = getParamValue('size', node, tensorMap, context);\n\t        return [slice$2(getParamValue('x', node, tensorMap, context), begin, size)];\n\t      }\n\n\t    case 'StridedSlice':\n\t      {\n\t        var _begin = getParamValue('begin', node, tensorMap, context);\n\n\t        var end = getParamValue('end', node, tensorMap, context);\n\t        var strides = getParamValue('strides', node, tensorMap, context);\n\t        var beginMask = getParamValue('beginMask', node, tensorMap, context);\n\t        var endMask = getParamValue('endMask', node, tensorMap, context);\n\t        var ellipsisMask = getParamValue('ellipsisMask', node, tensorMap, context);\n\t        var newAxisMask = getParamValue('newAxisMask', node, tensorMap, context);\n\t        var shrinkAxisMask = getParamValue('shrinkAxisMask', node, tensorMap, context);\n\t        var tensor = getParamValue('x', node, tensorMap, context);\n\t        return [stridedSlice(tensor, _begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask)];\n\t      }\n\n\t    case 'Pack':\n\t      {\n\t        return tidy(function () {\n\t          var axis = getParamValue('axis', node, tensorMap, context);\n\t          var tensors = getParamValue('tensors', node, tensorMap, context); // Reshape the tensors to the first tensor's shape if they don't\n\t          // match.\n\n\t          var shape = tensors[0].shape;\n\t          var squeezedShape = squeeze(tensors[0]).shape;\n\t          var mapped = tensors.map(function (tensor) {\n\t            var sameShape = arraysEqual(tensor.shape, shape);\n\n\t            if (!sameShape && !arraysEqual(squeeze(tensor).shape, squeezedShape)) {\n\t              throw new Error('the input tensors shape does not match');\n\t            }\n\n\t            return sameShape ? tensor : reshape(tensor, shape);\n\t          });\n\t          return [stack(mapped, axis)];\n\t        });\n\t      }\n\n\t    case 'Unpack':\n\t      {\n\t        var _axis4 = getParamValue('axis', node, tensorMap, context);\n\n\t        var _tensor = getParamValue('tensor', node, tensorMap, context);\n\n\t        return unstack(_tensor, _axis4);\n\t      }\n\n\t    case 'Tile':\n\t      {\n\t        var reps = getParamValue('reps', node, tensorMap, context);\n\t        return [tile(getParamValue('x', node, tensorMap, context), reps)];\n\t      }\n\n\t    case 'Split':\n\t    case 'SplitV':\n\t      {\n\t        var _axis5 = getParamValue('axis', node, tensorMap, context);\n\n\t        var numOrSizeSplits = getParamValue('numOrSizeSplits', node, tensorMap, context);\n\n\t        var _tensor2 = getParamValue('x', node, tensorMap, context);\n\n\t        return split$1(_tensor2, numOrSizeSplits, _axis5);\n\t      }\n\n\t    case 'ScatterNd':\n\t      {\n\t        var _indices2 = getParamValue('indices', node, tensorMap, context);\n\n\t        var values = getParamValue('values', node, tensorMap, context);\n\t        var shape = getParamValue('shape', node, tensorMap, context);\n\t        return [scatterND(_indices2, values, shape)];\n\t      }\n\n\t    case 'GatherNd':\n\t      {\n\t        var x = getParamValue('x', node, tensorMap, context);\n\n\t        var _indices3 = getParamValue('indices', node, tensorMap, context);\n\n\t        return [gatherND(x, _indices3)];\n\t      }\n\n\t    case 'SparseToDense':\n\t      {\n\t        var _indices4 = getParamValue('sparseIndices', node, tensorMap, context);\n\n\t        var _shape = getParamValue('outputShape', node, tensorMap, context);\n\n\t        var sparseValues = getParamValue('sparseValues', node, tensorMap, context);\n\t        var defaultValue = getParamValue('defaultValue', node, tensorMap, context);\n\t        return [sparseToDense(_indices4, sparseValues, _shape, sparseValues.dtype === defaultValue.dtype ? defaultValue : cast(defaultValue, sparseValues.dtype))];\n\t      }\n\n\t    default:\n\t      throw TypeError(\"Node type \" + node.op + \" is not implemented\");\n\t  }\n\t};\n\tvar CATEGORY$e = 'slice_join';\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar executeOp$f = function executeOp(node, tensorMap, context) {\n\t  switch (node.op) {\n\t    case 'FFT':\n\t      {\n\t        return [fft(getParamValue('x', node, tensorMap, context))];\n\t      }\n\n\t    case 'IFFT':\n\t      {\n\t        return [ifft(getParamValue('x', node, tensorMap, context))];\n\t      }\n\n\t    case 'RFFT':\n\t      {\n\t        return [rfft(getParamValue('x', node, tensorMap, context))];\n\t      }\n\n\t    case 'IRFFT':\n\t      {\n\t        return [irfft(getParamValue('x', node, tensorMap, context))];\n\t      }\n\n\t    default:\n\t      throw TypeError(\"Node type \" + node.op + \" is not implemented\");\n\t  }\n\t};\n\tvar CATEGORY$f = 'spectral';\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar executeOp$g = function executeOp(node, tensorMap, context) {\n\t  switch (node.op) {\n\t    case 'Cast':\n\t      {\n\t        return [cast(getParamValue('x', node, tensorMap, context), getParamValue('dtype', node, tensorMap, context))];\n\t      }\n\n\t    case 'ExpandDims':\n\t      {\n\t        var axis = getParamValue('axis', node, tensorMap, context);\n\t        return [expandDims(getParamValue('x', node, tensorMap, context), axis)];\n\t      }\n\n\t    case 'Squeeze':\n\t      {\n\t        var _axis = getParamValue('axis', node, tensorMap, context);\n\n\t        return [squeeze(getParamValue('x', node, tensorMap, context), _axis)];\n\t      }\n\n\t    case 'Reshape':\n\t      {\n\t        return [reshape(getParamValue('x', node, tensorMap, context), getParamValue('shape', node, tensorMap, context))];\n\t      }\n\n\t    case 'MirrorPad':\n\t      {\n\t        return [mirrorPad(getParamValue('x', node, tensorMap, context), getParamValue('padding', node, tensorMap, context), getParamValue('mode', node, tensorMap, context))];\n\t      }\n\n\t    case 'PadV2':\n\t    case 'Pad':\n\t      {\n\t        return [pad(getParamValue('x', node, tensorMap, context), getParamValue('padding', node, tensorMap, context), getParamValue('constantValue', node, tensorMap, context))];\n\t      }\n\n\t    case 'SpaceToBatchND':\n\t      {\n\t        var blockShape = getParamValue('blockShape', node, tensorMap, context);\n\t        var paddings = getParamValue('paddings', node, tensorMap, context);\n\t        return [spaceToBatchND(getParamValue('x', node, tensorMap, context), blockShape, paddings)];\n\t      }\n\n\t    case 'BatchToSpaceND':\n\t      {\n\t        var _blockShape = getParamValue('blockShape', node, tensorMap, context);\n\n\t        var crops = getParamValue('crops', node, tensorMap, context);\n\t        return [batchToSpaceND(getParamValue('x', node, tensorMap, context), _blockShape, crops)];\n\t      }\n\n\t    case 'DepthToSpace':\n\t      {\n\t        var blockSize = getParamValue('blockSize', node, tensorMap, context);\n\t        var dataFormat = getParamValue('dataFormat', node, tensorMap, context).toUpperCase();\n\t        return [depthToSpace(getParamValue('x', node, tensorMap, context), blockSize, dataFormat)];\n\t      }\n\n\t    case 'BroadcastTo':\n\t      {\n\t        return [broadcastTo(getParamValue('x', node, tensorMap, context), getParamValue('shape', node, tensorMap, context))];\n\t      }\n\n\t    default:\n\t      throw TypeError(\"Node type \" + node.op + \" is not implemented\");\n\t  }\n\t};\n\tvar CATEGORY$g = 'transformation';\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Executes the op defined by the node object.\n\t * @param node\n\t * @param tensorMap contains tensors for executed nodes and weights\n\t * @param context contains tensors and information for running the current node.\n\t * @param resourceManager Optional. Contains global resources of the model.\n\t */\n\n\tfunction executeOp$h(node, tensorMap, context, resourceManager) {\n\t  var value = function (node, tensorMap, context) {\n\t    switch (node.category) {\n\t      case 'arithmetic':\n\t        return tidy(function () {\n\t          return executeOp(node, tensorMap, context);\n\t        });\n\n\t      case 'basic_math':\n\t        return tidy(function () {\n\t          return executeOp$1(node, tensorMap, context);\n\t        });\n\n\t      case 'control':\n\t        return executeOp$2(node, tensorMap, context);\n\n\t      case 'convolution':\n\t        return tidy(function () {\n\t          return executeOp$3(node, tensorMap, context);\n\t        });\n\n\t      case 'creation':\n\t        return tidy(function () {\n\t          return executeOp$4(node, tensorMap, context);\n\t        });\n\n\t      case 'dynamic':\n\t        return executeOp$5(node, tensorMap, context);\n\n\t      case 'evaluation':\n\t        return tidy(function () {\n\t          return executeOp$6(node, tensorMap, context);\n\t        });\n\n\t      case 'image':\n\t        return tidy(function () {\n\t          return executeOp$9(node, tensorMap, context);\n\t        });\n\n\t      case 'graph':\n\t        return tidy(function () {\n\t          return executeOp$7(node, tensorMap, context);\n\t        });\n\n\t      case 'logical':\n\t        return tidy(function () {\n\t          return executeOp$a(node, tensorMap, context);\n\t        });\n\n\t      case 'matrices':\n\t        return tidy(function () {\n\t          return executeOp$b(node, tensorMap, context);\n\t        });\n\n\t      case 'normalization':\n\t        return tidy(function () {\n\t          return executeOp$c(node, tensorMap, context);\n\t        });\n\n\t      case 'reduction':\n\t        return tidy(function () {\n\t          return executeOp$d(node, tensorMap, context);\n\t        });\n\n\t      case 'slice_join':\n\t        return tidy(function () {\n\t          return executeOp$e(node, tensorMap, context);\n\t        });\n\n\t      case 'spectral':\n\t        return tidy(function () {\n\t          return executeOp$f(node, tensorMap, context);\n\t        });\n\n\t      case 'transformation':\n\t        return tidy(function () {\n\t          return executeOp$g(node, tensorMap, context);\n\t        });\n\n\t      case 'hash_table':\n\t        return executeOp$8(node, tensorMap, context, resourceManager);\n\n\t      case 'custom':\n\t        var opMapper = getRegisteredOp(node.op);\n\n\t        if (opMapper && opMapper.customExecutor) {\n\t          return opMapper.customExecutor(new NodeValueImpl(node, tensorMap, context));\n\t        } else {\n\t          throw TypeError(\"Custom op \" + node.op + \" is not registered.\");\n\t        }\n\n\t      default:\n\t        throw TypeError(\"Unknown op '\" + node.op + \"'. File an issue at \" + \"https://github.com/tensorflow/tfjs/issues so we can add it\" + \", or register a custom execution with tf.registerOp()\");\n\t    }\n\t  }(node, tensorMap, context);\n\n\t  if (isPromise(value)) {\n\t    return value.then(function (data) {\n\t      return [].concat(data);\n\t    });\n\t  }\n\n\t  return [].concat(value);\n\t}\n\n\t/**\n\t * ExecutionContext captures the runtime environment of the node. It keeps\n\t * track of the current frame and iteration for the control flow ops.\n\t *\n\t * For example, typical Dynamic RNN model may contain loops, for which\n\t * TensorFlow will generate graphs with Enter/Exit nodes to control the\n\t * current execution frame, and NextIteration Nodes for iteration id increment.\n\t * For model with branch logic, TensorFLow will generate Switch/Merge ops.\n\t */\n\tvar ExecutionContext = /*#__PURE__*/function () {\n\t  function ExecutionContext(weightMap, tensorArrayMap, tensorListMap, functionMap) {\n\t    if (weightMap === void 0) {\n\t      weightMap = {};\n\t    }\n\n\t    if (tensorArrayMap === void 0) {\n\t      tensorArrayMap = {};\n\t    }\n\n\t    if (tensorListMap === void 0) {\n\t      tensorListMap = {};\n\t    }\n\n\t    if (functionMap === void 0) {\n\t      functionMap = {};\n\t    }\n\n\t    this.weightMap = weightMap;\n\t    this.tensorArrayMap = tensorArrayMap;\n\t    this.tensorListMap = tensorListMap;\n\t    this.functionMap = functionMap;\n\t    this.rootContext = {\n\t      id: 0,\n\t      frameName: '',\n\t      iterationId: 0\n\t    };\n\t    this.contexts = [this.rootContext];\n\t    this.lastId = 0;\n\t    this.generateCurrentContextIds();\n\t  }\n\n\t  var _proto = ExecutionContext.prototype;\n\n\t  _proto.newFrame = function newFrame(id, frameName) {\n\t    return {\n\t      id: id,\n\t      frameName: frameName,\n\t      iterationId: 0\n\t    };\n\t  }\n\t  /**\n\t   * Set the current context\n\t   * @param contexts: ExecutionContextInfo[] the current path of execution\n\t   * frames\n\t   */\n\t  ;\n\n\t  _proto.generateCurrentContextIds = function generateCurrentContextIds() {\n\t    var names = [];\n\n\t    for (var i = 0; i < this.contexts.length - 1; i++) {\n\t      var contexts = this.contexts.slice(0, this.contexts.length - i);\n\t      names.push(this.contextIdforContexts(contexts));\n\t    }\n\n\t    names.push('');\n\t    this._currentContextIds = names;\n\t  };\n\n\t  _proto.contextIdforContexts = function contextIdforContexts(contexts) {\n\t    return contexts ? contexts.map(function (context) {\n\t      return context.id === 0 && context.iterationId === 0 ? '' : context.frameName + \"-\" + context.iterationId;\n\t    }).join('/') : '';\n\t  }\n\t  /**\n\t   * Enter a new frame, a new context is pushed on the current context list.\n\t   * @param frameId new frame id\n\t   */\n\t  ;\n\n\t  _proto.enterFrame = function enterFrame(frameId) {\n\t    if (this.contexts) {\n\t      this.lastId++;\n\t      this.contexts = this.contexts.slice();\n\t      this.contexts.push(this.newFrame(this.lastId, frameId));\n\n\t      this._currentContextIds.unshift(this.contextIdforContexts(this.contexts));\n\t    }\n\t  }\n\t  /**\n\t   * Exit the current frame, the last context is removed from the current\n\t   * context list.\n\t   */\n\t  ;\n\n\t  _proto.exitFrame = function exitFrame() {\n\t    if (this.contexts && this.contexts.length > 1) {\n\t      this.contexts = this.contexts.slice();\n\t      this.contexts.splice(-1);\n\t      this.currentContextIds.shift();\n\t    } else {\n\t      throw new Error('Cannot exit frame, the context is empty');\n\t    }\n\t  }\n\t  /**\n\t   * Enter the next iteration of a loop, the iteration id of last context is\n\t   * increased.\n\t   */\n\t  ;\n\n\t  _proto.nextIteration = function nextIteration() {\n\t    if (this.contexts && this.contexts.length > 0) {\n\t      this.contexts = this.contexts.slice();\n\t      this.lastId++;\n\t      var context = Object.assign({}, this.contexts[this.contexts.length - 1]);\n\t      context.iterationId += 1;\n\t      context.id = this.lastId;\n\t      this.contexts.splice(-1, 1, context);\n\n\t      this._currentContextIds.splice(0, 1, this.contextIdforContexts(this.contexts));\n\t    } else {\n\t      throw new Error('Cannot increase frame iteration, the context is empty');\n\t    }\n\t  };\n\n\t  _proto.getWeight = function getWeight(name) {\n\t    return this.weightMap[name];\n\t  };\n\n\t  _proto.addTensorArray = function addTensorArray(tensorArray) {\n\t    this.tensorArrayMap[tensorArray.id] = tensorArray;\n\t  };\n\n\t  _proto.getTensorArray = function getTensorArray(id) {\n\t    return this.tensorArrayMap[id];\n\t  };\n\n\t  _proto.addTensorList = function addTensorList(tensorList) {\n\t    this.tensorListMap[tensorList.id] = tensorList;\n\t  };\n\n\t  _proto.getTensorList = function getTensorList(id) {\n\t    return this.tensorListMap[id];\n\t  };\n\n\t  _proto.dispose = function dispose(keepIds) {\n\t    for (var key in this.tensorArrayMap) {\n\t      this.tensorArrayMap[key].clearAndClose(keepIds);\n\t    }\n\n\t    for (var _key in this.tensorListMap) {\n\t      this.tensorListMap[_key].clearAndClose(keepIds);\n\t    }\n\t  };\n\n\t  _createClass(ExecutionContext, [{\n\t    key: \"currentContext\",\n\t    set: function set(contexts) {\n\t      if (this.contexts !== contexts) {\n\t        this.contexts = contexts;\n\t        this.generateCurrentContextIds();\n\t      }\n\t    },\n\t    get: function get() {\n\t      return this.contexts;\n\t    }\n\t    /**\n\t     * Returns the current context in string format.\n\t     */\n\n\t  }, {\n\t    key: \"currentContextId\",\n\t    get: function get() {\n\t      return this._currentContextIds[0];\n\t    }\n\t    /**\n\t     * Returns the current context and all parent contexts in string format.\n\t     * This allow access to the nodes in the current and parent frames.\n\t     */\n\n\t  }, {\n\t    key: \"currentContextIds\",\n\t    get: function get() {\n\t      return this._currentContextIds;\n\t    }\n\t  }]);\n\n\t  return ExecutionContext;\n\t}();\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Given graph inputs and desired outputs, find the minimal set of nodes\n\t * to execute in order to compute the outputs. In addition return other useful\n\t * info such:\n\t * - Missing inputs needed to compute the output.\n\t * - Whether the subgraph contains dynamic ops (control flow, dynamic shape).\n\t * - Alternative inputs in order to avoid async (dynamic op) execution.\n\t */\n\n\tfunction getExecutionSubgraph(inputs, outputs, weightMap, initNodes) {\n\t  var usedNodes = new Set();\n\t  var missingInputs = [];\n\t  var dynamicNode = null;\n\t  var syncInputs = null; // Start with the outputs, going backwards and find all the nodes that are\n\t  // needed to compute those outputs.\n\n\t  var seen = new Set();\n\t  var inputNodeNames = Object.keys(inputs).map(function (name) {\n\t    return parseNodeName(name)[0];\n\t  });\n\t  var initNodeNames = [];\n\n\t  if (initNodes != null) {\n\t    initNodeNames = initNodes.map(function (node) {\n\t      return parseNodeName(node.name)[0];\n\t    });\n\t  }\n\n\t  var frontier = [].concat(outputs);\n\n\t  while (frontier.length > 0) {\n\t    var node = frontier.pop();\n\n\t    if (isControlFlow(node) || isDynamicShape(node) || isHashTable(node)) {\n\t      if (dynamicNode == null) {\n\t        dynamicNode = node;\n\t        syncInputs = dynamicNode.children.map(function (child) {\n\t          return child.name;\n\t        }).filter(function (name) {\n\t          return usedNodes.has(name);\n\t        });\n\t      }\n\t    }\n\n\t    usedNodes.add(node.name); // Weights are dead end since we already have their values.\n\n\t    if (weightMap[node.name] != null) {\n\t      continue;\n\t    } // This node is a dead end since it's one of the user-provided inputs.\n\n\n\t    if (inputNodeNames.indexOf(node.name) !== -1) {\n\t      continue;\n\t    } // This node is a dead end since it doesn't have any inputs.\n\n\n\t    if (initNodeNames.indexOf(node.name) !== -1) {\n\t      continue;\n\t    }\n\n\t    if (node.inputs.length === 0) {\n\t      missingInputs.push(node.name);\n\t      continue;\n\t    }\n\n\t    node.inputs.forEach(function (input) {\n\t      // Don't add to the frontier if it is already there.\n\t      if (seen.has(input.name)) {\n\t        return;\n\t      }\n\n\t      seen.add(input.name);\n\t      frontier.push(input);\n\t    });\n\t  }\n\n\t  return {\n\t    inputs: inputs,\n\t    outputs: outputs,\n\t    usedNodes: usedNodes,\n\t    missingInputs: missingInputs,\n\t    dynamicNode: dynamicNode,\n\t    syncInputs: syncInputs\n\t  };\n\t}\n\t/**\n\t * Given the execution info, return a list of nodes in topological order that\n\t * need to be executed to compute the output.\n\t */\n\n\tfunction getNodesInTopologicalOrder(graph, weightMap, executionInfo) {\n\t  var usedNodes = executionInfo.usedNodes,\n\t      inputs = executionInfo.inputs;\n\t  var frontier = [];\n\t  var inputNodes = Object.keys(inputs).map(function (name) {\n\t    return parseNodeName(name)[0];\n\t  }).map(function (name) {\n\t    return graph.nodes[name];\n\t  });\n\t  var initNodes = graph.initNodes;\n\t  inputNodes.forEach(function (input) {\n\t    if (usedNodes.has(input.name)) {\n\t      frontier.push(input);\n\t    }\n\t  });\n\t  graph.weights.forEach(function (weight) {\n\t    if (usedNodes.has(weight.name)) {\n\t      frontier.push(weight);\n\t    }\n\t  });\n\n\t  if (initNodes != null) {\n\t    initNodes.forEach(function (node) {\n\t      if (usedNodes.has(node.name)) {\n\t        frontier.push(node);\n\t      }\n\t    });\n\t  }\n\n\t  var seen = new Set();\n\t  var orderedNodes = [];\n\n\t  while (frontier.length > 0) {\n\t    var node = frontier.pop();\n\t    seen.add(node.name);\n\n\t    if (!weightMap[node.name]) {\n\t      orderedNodes.push(node);\n\t    }\n\n\t    node.children.forEach(function (child) {\n\t      if (!seen.has(child.name) && usedNodes.has(child.name) && child.inputs.every(function (input) {\n\t        return seen.has(input.name);\n\t      })) {\n\t        frontier.push(child);\n\t      }\n\t    });\n\t  }\n\n\t  return orderedNodes;\n\t}\n\tvar CONTROL_FLOW_OPS = ['Switch', 'Merge', 'Enter', 'Exit', 'NextIteration', 'StatelessIf', 'StatelessWhile', 'if', 'While'];\n\tvar DYNAMIC_SHAPE_OPS = ['NonMaxSuppressionV2', 'NonMaxSuppressionV3', 'NonMaxSuppressionV5', 'Where'];\n\tvar HASH_TABLE_OPS = ['HashTable', 'HashTableV2', 'LookupTableImport', 'LookupTableImportV2', 'LookupTableFind', 'LookupTableFindV2'];\n\tfunction isControlFlow(node) {\n\t  return CONTROL_FLOW_OPS.indexOf(node.op) >= 0;\n\t}\n\tfunction isDynamicShape(node) {\n\t  return DYNAMIC_SHAPE_OPS.indexOf(node.op) >= 0;\n\t}\n\tfunction isHashTable(node) {\n\t  return HASH_TABLE_OPS.indexOf(node.op) >= 0;\n\t}\n\n\tvar GraphExecutor = /*#__PURE__*/function () {\n\t  /**\n\t   *\n\t   * @param graph Graph the model or function graph to be executed.\n\t   * @param parent When building function exector you need to set the parent\n\t   * executor. Since the weights and function executor maps are set at parant\n\t   * level, that function executor can access the function maps and weight maps\n\t   * through the parent.\n\t   */\n\t  function GraphExecutor(graph, parent) {\n\t    var _this = this;\n\n\t    this.graph = graph;\n\t    this.parent = parent;\n\t    this.compiledMap = new Map();\n\t    this._weightMap = {};\n\t    this.SEPERATOR = ',';\n\t    this._functions = {};\n\t    this._functionExecutorMap = {};\n\t    this._outputs = graph.outputs;\n\t    this._inputs = graph.inputs;\n\t    this._initNodes = graph.initNodes;\n\t    this._signature = graph.signature;\n\t    this._functions = graph.functions; // create sub-graph executors\n\n\t    if (graph.functions != null) {\n\t      Object.keys(graph.functions).forEach(function (name) {\n\t        _this._functionExecutorMap[name] = new GraphExecutor(graph.functions[name], _this);\n\t      });\n\t    }\n\t  }\n\n\t  var _proto = GraphExecutor.prototype;\n\n\t  _proto.getCompilationKey = function getCompilationKey(inputs, outputs) {\n\t    var sortedInputs = inputs.map(function (node) {\n\t      return node.name;\n\t    }).sort();\n\t    var sortedOutputs = outputs.map(function (node) {\n\t      return node.name;\n\t    }).sort();\n\t    return sortedInputs.join(this.SEPERATOR) + '--' + sortedOutputs.join(this.SEPERATOR);\n\t  }\n\t  /**\n\t   * Compiles the inference graph and returns the minimal set of nodes that are\n\t   * required for execution, in the correct execution order.\n\t   */\n\t  ;\n\n\t  _proto.compile = function compile(inputs, outputs) {\n\t    var executionInfo = getExecutionSubgraph(inputs, outputs, this.weightMap, this._initNodes);\n\t    var missingInputs = executionInfo.missingInputs,\n\t        dynamicNode = executionInfo.dynamicNode,\n\t        syncInputs = executionInfo.syncInputs;\n\n\t    if (dynamicNode != null) {\n\t      throw new Error(\"This execution contains the node '\" + dynamicNode.name + \"', which has \" + (\"the dynamic op '\" + dynamicNode.op + \"'. Please use \") + \"model.executeAsync() instead. Alternatively, to avoid the \" + (\"dynamic ops, specify the inputs [\" + syncInputs + \"]\"));\n\t    }\n\n\t    if (missingInputs.length > 0) {\n\t      var outNames = outputs.map(function (n) {\n\t        return n.name;\n\t      });\n\t      var inNames = Object.keys(inputs);\n\t      throw new Error(\"Cannot compute the outputs [\" + outNames + \"] from the provided inputs \" + (\"[\" + inNames + \"]. Missing the following inputs: [\" + missingInputs + \"]\"));\n\t    }\n\n\t    return getNodesInTopologicalOrder(this.graph, this.weightMap, executionInfo);\n\t  }\n\t  /**\n\t   * Executes the inference for given input tensors.\n\t   * @param inputs Tensor map for the model inputs, keyed by the input node\n\t   * names.\n\t   * @param outputs Optional. output node name from the Tensorflow model, if\n\t   * no outputs are specified, the default outputs of the model would be used.\n\t   * You can inspect intermediate nodes of the model by adding them to the\n\t   * outputs array.\n\t   */\n\t  ;\n\n\t  _proto.execute = function execute(inputs, outputs) {\n\t    var _this2 = this;\n\n\t    inputs = this.mapInputs(inputs);\n\t    var names = Object.keys(inputs).sort();\n\t    this.checkInputs(inputs);\n\t    this.checkInputShapeAndType(inputs);\n\t    outputs = this.mapOutputs(outputs);\n\t    this.checkOutputs(outputs);\n\t    var inputNodes = names.map(function (name) {\n\t      return _this2.graph.nodes[parseNodeName(name)[0]];\n\t    });\n\t    var outputNodeNames = outputs.map(function (name) {\n\t      return parseNodeName(name)[0];\n\t    });\n\t    var outputNodes = outputNodeNames.map(function (name) {\n\t      return _this2.graph.nodes[name];\n\t    }); // If no outputs are specified, then use the default outputs of the model.\n\n\t    if (outputNodes.length === 0) {\n\t      outputNodes = this._outputs;\n\t    }\n\n\t    var compilationKey = this.getCompilationKey(inputNodes, outputNodes); // Do nothing if the compiled graph cache contains the input.\n\n\t    var orderedNodes = this.compiledMap.get(compilationKey);\n\n\t    if (orderedNodes == null) {\n\t      orderedNodes = this.compile(inputs, outputNodes);\n\t      this.compiledMap.set(compilationKey, orderedNodes);\n\t    }\n\n\t    var tensorArrayMap = {};\n\t    var tensorListMap = {};\n\t    return tidy(function () {\n\t      var context = new ExecutionContext(_this2.weightMap, tensorArrayMap, tensorListMap, _this2.functionExecutorMap);\n\t      var tensorsMap = Object.assign({}, _this2.weightMap);\n\t      Object.keys(inputs).forEach(function (name) {\n\t        var _parseNodeName = parseNodeName(name),\n\t            nodeName = _parseNodeName[0],\n\t            index = _parseNodeName[1];\n\n\t        var tensors = [];\n\t        tensors[index] = inputs[name];\n\t        tensorsMap[nodeName] = tensors;\n\t      });\n\n\t      var tensorsToKeep = _this2.getFrozenTensorIds(tensorsMap);\n\n\t      var intermediateTensorConsumerCount = {};\n\n\t      for (var i = 0; i < orderedNodes.length; i++) {\n\t        var node = orderedNodes[i];\n\n\t        if (!tensorsMap[node.name]) {\n\t          var tensors = executeOp$h(node, tensorsMap, context, _this2._resourceManager);\n\n\t          if (isPromise(tensors)) {\n\t            throw new Error(\"The execution of the op '\" + node.op + \"' returned a promise. \" + \"Please use model.executeAsync() instead.\");\n\t          }\n\n\t          tensorsMap[node.name] = tensors;\n\n\t          _this2.checkTensorForDisposal(node.name, node, tensorsMap, context, tensorsToKeep, outputNodeNames, intermediateTensorConsumerCount);\n\t        }\n\t      } // dispose the context for the root executor\n\n\n\t      if (_this2.parent == null) {\n\t        context.dispose(tensorsToKeep);\n\t      }\n\n\t      return outputs.map(function (name) {\n\t        return getTensor(name, tensorsMap, context);\n\t      });\n\t    });\n\t  };\n\n\t  _proto.getFrozenTensorIds = function getFrozenTensorIds(tensorMap) {\n\t    var ids = [].concat.apply([], Object.keys(tensorMap).map(function (key) {\n\t      return tensorMap[key];\n\t    }).map(function (tensors) {\n\t      return tensors.map(function (tensor) {\n\t        return tensor.id;\n\t      });\n\t    }));\n\t    return new Set(ids);\n\t  };\n\n\t  _proto.checkTensorForDisposal = function checkTensorForDisposal(nodeName, node, tensorMap, context, tensorsToKeep, outputNames, intermediateTensorConsumerCount) {\n\t    // Skip output nodes and any control flow nodes, since its dependency is\n\t    // tricky to track correctly.\n\t    if (node.category === 'control' || outputNames.indexOf(nodeName) !== -1) {\n\t      return;\n\t    }\n\n\t    tensorMap[nodeName].forEach(function (tensor) {\n\t      if (tensor != null) {\n\t        intermediateTensorConsumerCount[tensor.id] = (intermediateTensorConsumerCount[tensor.id] || 0) + node.children.length;\n\t      }\n\t    });\n\t    node.inputs.forEach(function (input) {\n\t      // Skip any control flow nodes, since its dependency is tricky to track\n\t      // correctly.\n\t      if (input.category !== 'control') {\n\t        var tensors = getTensorsForCurrentContenxt(input.name, tensorMap, context);\n\n\t        if (tensors != null) {\n\t          tensors.forEach(function (tensor) {\n\t            if (tensor && !tensorsToKeep.has(tensor.id)) {\n\t              var count = intermediateTensorConsumerCount[tensor.id];\n\n\t              if (count === 1) {\n\t                tensor.dispose();\n\t                delete intermediateTensorConsumerCount[tensor.id];\n\t              } else if (count != null) {\n\t                // only intermediate nodes has count set, inputs and weights are\n\t                // not.\n\t                intermediateTensorConsumerCount[tensor.id]--;\n\t              }\n\t            }\n\t          });\n\t        }\n\t      }\n\t    });\n\t  }\n\t  /**\n\t   * Executes the inference for given input tensors in Async fashion.\n\t   * @param inputs Tensor map for the model inputs, keyed by the input node\n\t   * names.\n\t   * @param outputs output node name from the Tensorflow model, if no outputs\n\t   * are specified, the default outputs of the model would be used. You can\n\t   * inspect intermediate nodes of the model by adding them to the outputs\n\t   * array.\n\t   */\n\t  ;\n\n\t  _proto.executeAsync =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _executeAsync2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(inputs, outputs) {\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              return _context.abrupt(\"return\", this._executeAsync(inputs, outputs));\n\n\t            case 1:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function executeAsync(_x, _x2) {\n\t      return _executeAsync2.apply(this, arguments);\n\t    }\n\n\t    return executeAsync;\n\t  }()\n\t  /**\n\t   * Executes the inference for given input tensors in Async fashion.\n\t   * @param inputs Tensor map for the model inputs, keyed by the input node\n\t   * names.\n\t   * @param outputs Optional. output node name from the Tensorflow model,\n\t   * if no outputs are specified, the default outputs of the model would be\n\t   * used. You can inspect intermediate nodes of the model by adding them to the\n\t   * outputs array.\n\t   * @param isFunctionExecution Optional. Flag for executing a function.\n\t   * @param tensorArrayMap Optional, global TensorArray map by id. Used for\n\t   * function execution.\n\t   * @param tensorArrayMap Optinal global TensorList map by id. Used for\n\t   * function execution.\n\t   */\n\t  ;\n\n\t  _proto._executeAsync =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _executeAsync3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(inputs, outputs, isFunctionExecution, tensorArrayMap, tensorListMap) {\n\t      var context, tensorMap, results, outputIds, inputIds, keepIds;\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              if (isFunctionExecution === void 0) {\n\t                isFunctionExecution = false;\n\t              }\n\n\t              if (tensorArrayMap === void 0) {\n\t                tensorArrayMap = {};\n\t              }\n\n\t              if (tensorListMap === void 0) {\n\t                tensorListMap = {};\n\t              }\n\n\t              if (!isFunctionExecution) {\n\t                inputs = this.mapInputs(inputs);\n\t                this.checkInputs(inputs);\n\t                this.checkInputShapeAndType(inputs);\n\t                outputs = this.mapOutputs(outputs);\n\t                this.checkOutputs(outputs);\n\t              }\n\n\t              context = new ExecutionContext(this.weightMap, tensorArrayMap, tensorListMap, this.functionExecutorMap); // Graph with control flow op requires runtime evaluation of the execution\n\t              // order, while without control flow the execution order is pre-determined\n\t              // in the compile method.\n\n\t              _context2.next = 7;\n\t              return this.executeWithControlFlow(inputs, context, outputs, isFunctionExecution);\n\n\t            case 7:\n\t              tensorMap = _context2.sent;\n\t              results = outputs.map(function (name) {\n\t                return getTensor(name, tensorMap, context);\n\t              }); // dispose all the intermediate tensors\n\n\t              outputIds = results.map(function (t) {\n\t                return t.id;\n\t              });\n\t              inputIds = Object.keys(inputs).map(function (name) {\n\t                return inputs[name].id;\n\t              });\n\t              keepIds = new Set([].concat(outputIds, inputIds, this.weightIds));\n\t              Object.keys(tensorMap).forEach(function (key) {\n\t                var tensorArray = tensorMap[key];\n\t                tensorArray.forEach(function (tensor) {\n\t                  if (tensor && !tensor.isDisposed && !keepIds.has(tensor.id)) {\n\t                    tensor.dispose();\n\t                  }\n\t                });\n\t              }); // dispose the context for the root executor\n\n\t              if (this.parent == null) {\n\t                context.dispose(keepIds);\n\t              }\n\n\t              return _context2.abrupt(\"return\", results);\n\n\t            case 15:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function _executeAsync(_x3, _x4, _x5, _x6, _x7) {\n\t      return _executeAsync3.apply(this, arguments);\n\t    }\n\n\t    return _executeAsync;\n\t  }();\n\n\t  _proto.executeFunctionAsync = /*#__PURE__*/function () {\n\t    var _executeFunctionAsync = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(inputs, tensorArrayMap, tensorListMap) {\n\t      var _this3 = this;\n\n\t      var mappedInputs;\n\t      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t        while (1) {\n\t          switch (_context3.prev = _context3.next) {\n\t            case 0:\n\t              mappedInputs = inputs.reduce(function (map, tensor, index) {\n\t                map[_this3.inputs[index].name] = tensor;\n\t                return map;\n\t              }, {});\n\t              return _context3.abrupt(\"return\", this._executeAsync(mappedInputs, this.outputNodes, true, tensorArrayMap, tensorListMap));\n\n\t            case 2:\n\t            case \"end\":\n\t              return _context3.stop();\n\t          }\n\t        }\n\t      }, _callee3, this);\n\t    }));\n\n\t    function executeFunctionAsync(_x8, _x9, _x10) {\n\t      return _executeFunctionAsync.apply(this, arguments);\n\t    }\n\n\t    return executeFunctionAsync;\n\t  }()\n\t  /**\n\t   * When there are control flow nodes in the graph, the graph execution use\n\t   * ExecutionContext to keep track of the frames and loop iterators.\n\t   * @param inputs placeholder tensors for the graph.\n\t   * @param context the execution context object for current execution.\n\t   * @param outputNames Optional. output node name from the Tensorflow model,\n\t   * if no outputs are specified, the default outputs of the model would be\n\t   * used. You can inspect intermediate nodes of the model by adding them to the\n\t   * outputs array.\n\t   * @param isFunctionExecution Flag for executing a function.\n\t   */\n\t  ;\n\n\t  _proto.executeWithControlFlow =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _executeWithControlFlow = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(inputs, context, outputNames, isFunctionExecution) {\n\t      var _this4 = this;\n\n\t      var names, inputNodes, outputNodeNames, outputNodes, _getExecutionSubgraph, usedNodes, missingInputs, dynamicNode, syncInputs, stack, tensorsMap, intermediateTensorConsumerCount, tensorsToKeep, added, promises, missingOutputs, alternativeMsg;\n\n\t      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n\t        while (1) {\n\t          switch (_context4.prev = _context4.next) {\n\t            case 0:\n\t              names = Object.keys(inputs);\n\t              inputNodes = names.map(function (name) {\n\t                return _this4.graph.nodes[parseNodeName(name)[0]];\n\t              });\n\t              outputNodeNames = outputNames.map(function (name) {\n\t                return parseNodeName(name)[0];\n\t              });\n\t              outputNodes = outputNodeNames.map(function (name) {\n\t                return _this4.graph.nodes[name];\n\t              }); // If no outputs are specified, then use the default outputs of the model.\n\n\t              if (outputNodes.length === 0) {\n\t                outputNodes = this._outputs;\n\t              }\n\n\t              _getExecutionSubgraph = getExecutionSubgraph(inputs, outputNodes, this.weightMap, this._initNodes), usedNodes = _getExecutionSubgraph.usedNodes, missingInputs = _getExecutionSubgraph.missingInputs, dynamicNode = _getExecutionSubgraph.dynamicNode, syncInputs = _getExecutionSubgraph.syncInputs; // First nodes to execute include inputNodes, weights, and initNodes.\n\n\t              stack = [].concat(inputNodes, this.graph.weights, this._initNodes || []).map(function (node) {\n\t                return {\n\t                  node: node,\n\t                  contexts: context.currentContext\n\t                };\n\t              });\n\t              tensorsMap = Object.assign({}, this.weightMap);\n\t              Object.keys(inputs).forEach(function (name) {\n\t                var _parseNodeName2 = parseNodeName(name),\n\t                    nodeName = _parseNodeName2[0],\n\t                    index = _parseNodeName2[1];\n\n\t                var tensors = [];\n\t                tensors[index] = inputs[name];\n\t                tensorsMap[nodeName] = tensors;\n\t              });\n\t              intermediateTensorConsumerCount = {};\n\t              tensorsToKeep = this.getFrozenTensorIds(tensorsMap);\n\t              added = {};\n\n\t            case 12:\n\t              if (!(stack.length > 0)) {\n\t                _context4.next = 18;\n\t                break;\n\t              }\n\n\t              promises = this.processStack(inputNodes, stack, context, tensorsMap, added, tensorsToKeep, outputNodeNames, intermediateTensorConsumerCount, usedNodes);\n\t              _context4.next = 16;\n\t              return Promise.all(promises);\n\n\t            case 16:\n\t              _context4.next = 12;\n\t              break;\n\n\t            case 18:\n\t              if (dynamicNode == null && !isFunctionExecution) {\n\t                console.warn(\"This model execution did not contain any nodes with control flow \" + \"or dynamic output shapes. You can use model.execute() instead.\");\n\t              }\n\n\t              missingOutputs = outputNodes.filter(function (node) {\n\t                return !isControlFlow(node) && !getTensor(node.name, tensorsMap, context);\n\t              }).map(function (node) {\n\t                return node.name;\n\t              });\n\n\t              if (!(missingOutputs.length > 0)) {\n\t                _context4.next = 24;\n\t                break;\n\t              }\n\n\t              alternativeMsg = '';\n\n\t              if (dynamicNode != null) {\n\t                alternativeMsg = \"Alternatively, to avoid the dynamic ops, use model.execute() \" + (\"and specify the inputs [\" + syncInputs + \"]\");\n\t              }\n\n\t              throw new Error(\"Cannot compute the outputs [\" + missingOutputs + \"] from the provided \" + (\"inputs [\" + names + \"]. Consider providing the following inputs: \") + (\"[\" + missingInputs + \"]. \" + alternativeMsg));\n\n\t            case 24:\n\t              return _context4.abrupt(\"return\", tensorsMap);\n\n\t            case 25:\n\t            case \"end\":\n\t              return _context4.stop();\n\t          }\n\t        }\n\t      }, _callee4, this);\n\t    }));\n\n\t    function executeWithControlFlow(_x11, _x12, _x13, _x14) {\n\t      return _executeWithControlFlow.apply(this, arguments);\n\t    }\n\n\t    return executeWithControlFlow;\n\t  }();\n\n\t  _proto.processStack = function processStack(inputNodes, stack, context, tensorMap, added, tensorsToKeep, outputNames, intermediateTensorConsumerCount, usedNodes) {\n\t    var _this5 = this;\n\n\t    var promises = [];\n\n\t    var _loop = function _loop() {\n\t      var item = stack.pop();\n\t      context.currentContext = item.contexts;\n\t      var nodeName = ''; // The tensor of the Enter op with isConstant set should be set\n\t      // in the parent scope, so it will be available as constant for the\n\t      // whole loop.\n\n\t      if (item.node.op === 'Enter' && getParamValue('isConstant', item.node, tensorMap, context)) {\n\t        var _getNodeNameAndIndex = getNodeNameAndIndex(item.node.name, context);\n\n\t        nodeName = _getNodeNameAndIndex[0];\n\t      } // only process nodes that are not in the tensorMap yet, this include\n\t      // inputNodes and internal initNodes.\n\n\n\t      if (tensorMap[item.node.name] == null) {\n\t        var tensors = executeOp$h(item.node, tensorMap, context, _this5._resourceManager);\n\n\t        if (!nodeName) {\n\t          var _getNodeNameAndIndex2 = getNodeNameAndIndex(item.node.name, context);\n\n\t          nodeName = _getNodeNameAndIndex2[0];\n\t        }\n\n\t        var currentContext = context.currentContext;\n\n\t        if (isPromise(tensors)) {\n\t          promises.push(tensors.then(function (t) {\n\t            tensorMap[nodeName] = t;\n\t            context.currentContext = currentContext;\n\n\t            _this5.checkTensorForDisposal(nodeName, item.node, tensorMap, context, tensorsToKeep, outputNames, intermediateTensorConsumerCount);\n\n\t            _this5.processChildNodes(item.node, stack, context, tensorMap, added, usedNodes);\n\n\t            return t;\n\t          }));\n\t        } else {\n\t          tensorMap[nodeName] = tensors;\n\n\t          _this5.checkTensorForDisposal(nodeName, item.node, tensorMap, context, tensorsToKeep, outputNames, intermediateTensorConsumerCount);\n\n\t          _this5.processChildNodes(item.node, stack, context, tensorMap, added, usedNodes);\n\t        }\n\t      } else {\n\t        _this5.processChildNodes(item.node, stack, context, tensorMap, added, usedNodes);\n\t      }\n\t    };\n\n\t    while (stack.length > 0) {\n\t      _loop();\n\t    }\n\n\t    return promises;\n\t  };\n\n\t  _proto.processChildNodes = function processChildNodes(node, stack, context, tensorMap, added, usedNodes) {\n\t    node.children.forEach(function (childNode) {\n\t      var _getNodeNameAndIndex3 = getNodeNameAndIndex(childNode.name, context),\n\t          nodeName = _getNodeNameAndIndex3[0];\n\n\t      if (added[nodeName] || !usedNodes.has(childNode.name)) {\n\t        return;\n\t      } // Merge op can be pushed if any of its inputs has value.\n\n\n\t      if (childNode.op === 'Merge') {\n\t        if (childNode.inputNames.some(function (name) {\n\t          return !!getTensor(name, tensorMap, context);\n\t        })) {\n\t          added[nodeName] = true;\n\t          stack.push({\n\t            contexts: context.currentContext,\n\t            node: childNode\n\t          });\n\t        }\n\t      } else // Otherwise all inputs must to have value.\n\t        if (childNode.inputNames.every(function (name) {\n\t          return !!getTensor(name, tensorMap, context);\n\t        })) {\n\t          added[nodeName] = true;\n\t          stack.push({\n\t            contexts: context.currentContext,\n\t            node: childNode\n\t          });\n\t        }\n\t    });\n\t  }\n\t  /**\n\t   * Releases the memory used by the weight tensors.\n\t   */\n\t  ;\n\n\t  _proto.dispose = function dispose() {\n\t    var _this6 = this;\n\n\t    Object.keys(this.weightMap).forEach(function (key) {\n\t      return _this6.weightMap[key].forEach(function (tensor) {\n\t        return tensor.dispose();\n\t      });\n\t    });\n\t  };\n\n\t  _proto.checkInputShapeAndType = function checkInputShapeAndType(inputs) {\n\t    var _this7 = this;\n\n\t    Object.keys(inputs).forEach(function (name) {\n\t      var input = inputs[name];\n\n\t      var _parseNodeName3 = parseNodeName(name),\n\t          nodeName = _parseNodeName3[0];\n\n\t      var node = _this7.graph.nodes[nodeName];\n\n\t      if (node.attrParams['shape'] && node.attrParams['shape'].value) {\n\t        var shape = node.attrParams['shape'].value;\n\t        var match = shape.length === input.shape.length && input.shape.every(function (dim, index) {\n\t          return shape[index] === -1 || shape[index] === dim;\n\t        });\n\t        assert(match, function () {\n\t          return \"The shape of dict['\" + node.name + \"'] provided in \" + (\"model.execute(dict) must be [\" + shape + \"], but was \") + (\"[\" + input.shape + \"]\");\n\t        });\n\t      }\n\n\t      if (node.attrParams['dtype'] && node.attrParams['dtype'].value) {\n\t        assert(input.dtype === node.attrParams['dtype'].value, function () {\n\t          return \"The dtype of dict['\" + node.name + \"'] provided in \" + \"model.execute(dict) must be \" + (node.attrParams['dtype'].value + \", but was \" + input.dtype);\n\t        });\n\t      }\n\t    });\n\t  };\n\n\t  _proto.mapInputs = function mapInputs(inputs) {\n\t    var result = {};\n\n\t    for (var inputName in inputs) {\n\t      if (this._signature != null && this._signature.inputs != null && this._signature.inputs[inputName] != null) {\n\t        var tensor = this._signature.inputs[inputName];\n\t        result[tensor.name] = inputs[inputName];\n\t      } else {\n\t        result[inputName] = inputs[inputName];\n\t      }\n\t    }\n\n\t    return result;\n\t  };\n\n\t  _proto.checkInputs = function checkInputs(inputs) {\n\t    var _this8 = this;\n\n\t    var notInGraph = Object.keys(inputs).filter(function (name) {\n\t      var _parseNodeName4 = parseNodeName(name),\n\t          nodeName = _parseNodeName4[0];\n\n\t      return _this8.graph.nodes[nodeName] == null;\n\t    });\n\n\t    if (notInGraph.length > 0) {\n\t      throw new Error(\"The dict provided in model.execute(dict) has \" + (\"keys: [\" + notInGraph + \"] that are not part of graph\"));\n\t    }\n\t  };\n\n\t  _proto.mapOutputs = function mapOutputs(outputs) {\n\t    var _this9 = this;\n\n\t    return outputs.map(function (name) {\n\t      if (_this9._signature != null && _this9._signature.outputs != null && _this9._signature.outputs[name] != null) {\n\t        var tensor = _this9._signature.outputs[name];\n\t        return tensor.name;\n\t      }\n\n\t      return name;\n\t    }, {});\n\t  };\n\n\t  _proto.checkOutputs = function checkOutputs(outputs) {\n\t    var _this10 = this;\n\n\t    outputs.forEach(function (name) {\n\t      var _parseNodeName5 = parseNodeName(name),\n\t          normalizedName = _parseNodeName5[0];\n\n\t      if (!_this10.graph.nodes[normalizedName]) {\n\t        throw new Error(\"The output '\" + name + \"' is not found in the graph\");\n\t      }\n\t    });\n\t  };\n\n\t  _createClass(GraphExecutor, [{\n\t    key: \"weightIds\",\n\t    get: function get() {\n\t      return this.parent ? this.parent.weightIds : this._weightIds;\n\t    }\n\t  }, {\n\t    key: \"functionExecutorMap\",\n\t    get: function get() {\n\t      return this.parent ? this.parent.functionExecutorMap : this._functionExecutorMap;\n\t    }\n\t  }, {\n\t    key: \"weightMap\",\n\t    get: function get() {\n\t      return this.parent ? this.parent.weightMap : this._weightMap;\n\t    },\n\t    set: function set(weightMap) {\n\t      var _ref;\n\n\t      var weightIds = Object.keys(weightMap).map(function (key) {\n\t        return weightMap[key].map(function (tensor) {\n\t          return tensor.id;\n\t        });\n\t      });\n\t      this._weightIds = (_ref = []).concat.apply(_ref, weightIds);\n\t      this._weightMap = weightMap;\n\t    }\n\t    /**\n\t     * Set `ResourceManager` shared by executors of a model.\n\t     * @param resourceManager: `ResourceManager` of the `GraphModel`.\n\t     */\n\n\t  }, {\n\t    key: \"resourceManager\",\n\t    set: function set(resourceManager) {\n\t      this._resourceManager = resourceManager;\n\t    }\n\t  }, {\n\t    key: \"inputs\",\n\t    get: function get() {\n\t      return this._inputs.map(function (node) {\n\t        return {\n\t          name: node.name,\n\t          shape: node.attrParams['shape'] ? node.attrParams['shape'].value : undefined,\n\t          dtype: node.attrParams['dtype'] ? node.attrParams['dtype'].value : undefined\n\t        };\n\t      });\n\t    }\n\t  }, {\n\t    key: \"outputs\",\n\t    get: function get() {\n\t      return this._outputs.map(function (node) {\n\t        return {\n\t          name: node.name,\n\t          shape: node.attrParams['shape'] ? node.attrParams['shape'].value : undefined,\n\t          dtype: node.attrParams['dtype'] ? node.attrParams['dtype'].value : undefined\n\t        };\n\t      });\n\t    }\n\t  }, {\n\t    key: \"inputNodes\",\n\t    get: function get() {\n\t      return this._inputs.map(function (node) {\n\t        return node.signatureKey || node.name;\n\t      });\n\t    }\n\t  }, {\n\t    key: \"outputNodes\",\n\t    get: function get() {\n\t      return this._outputs.map(function (node) {\n\t        var name = node.signatureKey || node.name;\n\t        return node.defaultOutput ? name + \":\" + node.defaultOutput : name;\n\t      });\n\t    }\n\t  }, {\n\t    key: \"functions\",\n\t    get: function get() {\n\t      var _this11 = this;\n\n\t      return Object.keys(this._functions).reduce(function (map, key) {\n\t        map[key] = _this11._functions[key].signature;\n\t        return map;\n\t      }, {});\n\t    }\n\t  }]);\n\n\t  return GraphExecutor;\n\t}();\n\n\t/**\n\t * Contains global resources of a model.\n\t */\n\tvar ResourceManager = /*#__PURE__*/function () {\n\t  function ResourceManager(hashTableNameToHandle, hashTableMap) {\n\t    if (hashTableNameToHandle === void 0) {\n\t      hashTableNameToHandle = {};\n\t    }\n\n\t    if (hashTableMap === void 0) {\n\t      hashTableMap = {};\n\t    }\n\n\t    this.hashTableNameToHandle = hashTableNameToHandle;\n\t    this.hashTableMap = hashTableMap;\n\t  }\n\t  /**\n\t   * Register a `HashTable` in the resource manager.\n\t   *\n\t   * The `HashTable` can be retrieved by `resourceManager.getHashTableById`,\n\t   * where id is the table handle tensor's id.\n\t   *\n\t   * @param name Op node name that creates the `HashTable`.\n\t   * @param hashTable The `HashTable` to be added to resource manager.\n\t   */\n\n\n\t  var _proto = ResourceManager.prototype;\n\n\t  _proto.addHashTable = function addHashTable(name, hashTable) {\n\t    this.hashTableNameToHandle[name] = hashTable.handle;\n\t    this.hashTableMap[hashTable.id] = hashTable;\n\t  }\n\t  /**\n\t   * Get the table handle by node name.\n\t   * @param name Op node name that creates the `HashTable`. This name is also\n\t   *     used in the inputs list of lookup and import `HashTable` ops.\n\t   */\n\t  ;\n\n\t  _proto.getHashTableHandleByName = function getHashTableHandleByName(name) {\n\t    return this.hashTableNameToHandle[name];\n\t  }\n\t  /**\n\t   * Get the actual `HashTable` by its handle tensor's id.\n\t   * @param id The id of the handle tensor.\n\t   */\n\t  ;\n\n\t  _proto.getHashTableById = function getHashTableById(id) {\n\t    return this.hashTableMap[id];\n\t  }\n\t  /**\n\t   * Dispose `ResourceManager`, including its hashTables and tensors in them.\n\t   */\n\t  ;\n\n\t  _proto.dispose = function dispose() {\n\t    for (var key in this.hashTableMap) {\n\t      this.hashTableMap[key].clearAndClose();\n\t      delete this.hashTableMap[key];\n\t    }\n\n\t    for (var name in this.hashTableNameToHandle) {\n\t      this.hashTableNameToHandle[name].dispose();\n\t      delete this.hashTableNameToHandle[name];\n\t    }\n\t  };\n\n\t  return ResourceManager;\n\t}();\n\n\tvar TFHUB_SEARCH_PARAM = '?tfjs-format=file';\n\tvar DEFAULT_MODEL_NAME = 'model.json';\n\t/**\n\t * A `tf.GraphModel` is a directed, acyclic graph built from a\n\t * SavedModel GraphDef and allows inference execution.\n\t *\n\t * A `tf.GraphModel` can only be created by loading from a model converted from\n\t * a [TensorFlow SavedModel](https://www.tensorflow.org/guide/saved_model) using\n\t * the command line converter tool and loaded via `tf.loadGraphModel`.\n\t *\n\t * @doc {heading: 'Models', subheading: 'Classes'}\n\t */\n\n\tvar GraphModel = /*#__PURE__*/function () {\n\t  /**\n\t   * @param modelUrl url for the model, or an `io.IOHandler`.\n\t   * @param weightManifestUrl url for the weight file generated by\n\t   * scripts/convert.py script.\n\t   * @param requestOption options for Request, which allows to send credentials\n\t   * and custom headers.\n\t   * @param onProgress Optional, progress callback function, fired periodically\n\t   * before the load is completed.\n\t   */\n\t  function GraphModel(modelUrl, loadOptions) {\n\t    if (loadOptions === void 0) {\n\t      loadOptions = {};\n\t    }\n\n\t    this.modelUrl = modelUrl;\n\t    this.loadOptions = loadOptions;\n\t    this.version = 'n/a';\n\n\t    if (loadOptions == null) {\n\t      this.loadOptions = {};\n\t    }\n\n\t    this.resourceManager = new ResourceManager();\n\t  } // Returns the version information for the tensorflow model GraphDef.\n\n\n\t  var _proto = GraphModel.prototype;\n\n\t  _proto.findIOHandler = function findIOHandler() {\n\t    var path = this.modelUrl;\n\n\t    if (path.load != null) {\n\t      // Path is an IO Handler.\n\t      this.handler = path;\n\t    } else if (this.loadOptions.requestInit != null) {\n\t      this.handler = browserHTTPRequest(path, this.loadOptions);\n\t    } else {\n\t      var handlers = getLoadHandlers(path, this.loadOptions);\n\n\t      if (handlers.length === 0) {\n\t        // For backward compatibility: if no load handler can be found,\n\t        // assume it is a relative http path.\n\t        handlers.push(browserHTTPRequest(path, this.loadOptions));\n\t      } else if (handlers.length > 1) {\n\t        throw new Error(\"Found more than one (\" + handlers.length + \") load handlers for \" + (\"URL '\" + [path] + \"'\"));\n\t      }\n\n\t      this.handler = handlers[0];\n\t    }\n\t  }\n\t  /**\n\t   * Loads the model and weight files, construct the in memory weight map and\n\t   * compile the inference graph.\n\t   */\n\t  ;\n\n\t  _proto.load =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _load = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      var artifacts;\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              this.findIOHandler();\n\n\t              if (!(this.handler.load == null)) {\n\t                _context.next = 3;\n\t                break;\n\t              }\n\n\t              throw new Error('Cannot proceed with model loading because the IOHandler provided ' + 'does not have the `load` method implemented.');\n\n\t            case 3:\n\t              _context.next = 5;\n\t              return this.handler.load();\n\n\t            case 5:\n\t              artifacts = _context.sent;\n\t              return _context.abrupt(\"return\", this.loadSync(artifacts));\n\n\t            case 7:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function load() {\n\t      return _load.apply(this, arguments);\n\t    }\n\n\t    return load;\n\t  }()\n\t  /**\n\t   * Synchronously construct the in memory weight map and\n\t   * compile the inference graph. Also initialize hashtable if any.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes', ignoreCI: true}\n\t   */\n\t  ;\n\n\t  _proto.loadSync = function loadSync(artifacts) {\n\t    this.artifacts = artifacts;\n\t    var graph = this.artifacts.modelTopology;\n\t    var signature;\n\n\t    if (this.artifacts.userDefinedMetadata != null && this.artifacts.userDefinedMetadata.signature != null) {\n\t      signature = // tslint:disable-next-line:no-any\n\t      this.artifacts.userDefinedMetadata.signature;\n\t    } else {\n\t      signature = this.artifacts.signature;\n\t    }\n\n\t    this.signature = signature;\n\t    this.version = graph.versions.producer + \".\" + graph.versions.minConsumer;\n\t    var weightMap = decodeWeights(this.artifacts.weightData, this.artifacts.weightSpecs);\n\t    this.executor = new GraphExecutor(OperationMapper.Instance.transformGraph(graph, this.signature));\n\t    this.executor.weightMap = this.convertTensorMapToTensorsMap(weightMap); // Attach a model-level resourceManager to each executor to share resources,\n\t    // such as `HashTable`.\n\n\t    this.executor.resourceManager = this.resourceManager;\n\n\t    if (artifacts.modelInitializer != null && artifacts.modelInitializer.node != null) {\n\t      var initializer = OperationMapper.Instance.transformGraph(artifacts.modelInitializer);\n\t      this.initializer = new GraphExecutor(initializer);\n\t      this.initializer.weightMap = this.executor.weightMap; // Attach a model-level resourceManager to the initializer, the\n\t      // hashTables created from when executing the initializer will be stored\n\t      // in the resourceManager.\n\n\t      this.initializer.resourceManager = this.resourceManager;\n\t      this.initializer.executeAsync({}, []);\n\t    }\n\n\t    return true;\n\t  }\n\t  /**\n\t   * Save the configuration and/or weights of the GraphModel.\n\t   *\n\t   * An `IOHandler` is an object that has a `save` method of the proper\n\t   * signature defined. The `save` method manages the storing or\n\t   * transmission of serialized data (\"artifacts\") that represent the\n\t   * model's topology and weights onto or via a specific medium, such as\n\t   * file downloads, local storage, IndexedDB in the web browser and HTTP\n\t   * requests to a server. TensorFlow.js provides `IOHandler`\n\t   * implementations for a number of frequently used saving mediums, such as\n\t   * `tf.io.browserDownloads` and `tf.io.browserLocalStorage`. See `tf.io`\n\t   * for more details.\n\t   *\n\t   * This method also allows you to refer to certain types of `IOHandler`s\n\t   * as URL-like string shortcuts, such as 'localstorage://' and\n\t   * 'indexeddb://'.\n\t   *\n\t   * Example 1: Save `model`'s topology and weights to browser [local\n\t   * storage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage);\n\t   * then load it back.\n\t   *\n\t   * ```js\n\t   * const modelUrl =\n\t   *    'https://storage.googleapis.com/tfjs-models/savedmodel/mobilenet_v2_1.0_224/model.json';\n\t   * const model = await tf.loadGraphModel(modelUrl);\n\t   * const zeros = tf.zeros([1, 224, 224, 3]);\n\t   * model.predict(zeros).print();\n\t   *\n\t   * const saveResults = await model.save('localstorage://my-model-1');\n\t   *\n\t   * const loadedModel = await tf.loadGraphModel('localstorage://my-model-1');\n\t   * console.log('Prediction from loaded model:');\n\t   * model.predict(zeros).print();\n\t   * ```\n\t   *\n\t   * @param handlerOrURL An instance of `IOHandler` or a URL-like,\n\t   * scheme-based string shortcut for `IOHandler`.\n\t   * @param config Options for saving the model.\n\t   * @returns A `Promise` of `SaveResult`, which summarizes the result of\n\t   * the saving, such as byte sizes of the saved artifacts for the model's\n\t   *   topology and weight values.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes', ignoreCI: true}\n\t   */\n\t  ;\n\n\t  _proto.save =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _save = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(handlerOrURL, config) {\n\t      var handlers;\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              if (!(typeof handlerOrURL === 'string')) {\n\t                _context2.next = 9;\n\t                break;\n\t              }\n\n\t              handlers = getSaveHandlers(handlerOrURL);\n\n\t              if (!(handlers.length === 0)) {\n\t                _context2.next = 6;\n\t                break;\n\t              }\n\n\t              throw new Error(\"Cannot find any save handlers for URL '\" + handlerOrURL + \"'\");\n\n\t            case 6:\n\t              if (!(handlers.length > 1)) {\n\t                _context2.next = 8;\n\t                break;\n\t              }\n\n\t              throw new Error(\"Found more than one (\" + handlers.length + \") save handlers for \" + (\"URL '\" + handlerOrURL + \"'\"));\n\n\t            case 8:\n\t              handlerOrURL = handlers[0];\n\n\t            case 9:\n\t              if (!(handlerOrURL.save == null)) {\n\t                _context2.next = 11;\n\t                break;\n\t              }\n\n\t              throw new Error('GraphModel.save() cannot proceed because the IOHandler ' + 'provided does not have the `save` attribute defined.');\n\n\t            case 11:\n\t              return _context2.abrupt(\"return\", handlerOrURL.save(this.artifacts));\n\n\t            case 12:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function save(_x, _x2) {\n\t      return _save.apply(this, arguments);\n\t    }\n\n\t    return save;\n\t  }()\n\t  /**\n\t   * Execute the inference for the input tensors.\n\t   *\n\t   * @param input The input tensors, when there is single input for the model,\n\t   * inputs param should be a `tf.Tensor`. For models with mutliple inputs,\n\t   * inputs params should be in either `tf.Tensor`[] if the input order is\n\t   * fixed, or otherwise NamedTensorMap format.\n\t   *\n\t   * For model with multiple inputs, we recommend you use NamedTensorMap as the\n\t   * input type, if you use `tf.Tensor`[], the order of the array needs to\n\t   * follow the\n\t   * order of inputNodes array. @see {@link GraphModel.inputNodes}\n\t   *\n\t   * You can also feed any intermediate nodes using the NamedTensorMap as the\n\t   * input type. For example, given the graph\n\t   *    InputNode => Intermediate => OutputNode,\n\t   * you can execute the subgraph Intermediate => OutputNode by calling\n\t   *    model.execute('IntermediateNode' : tf.tensor(...));\n\t   *\n\t   * This is useful for models that uses tf.dynamic_rnn, where the intermediate\n\t   * state needs to be fed manually.\n\t   *\n\t   * For batch inference execution, the tensors for each input need to be\n\t   * concatenated together. For example with mobilenet, the required input shape\n\t   * is [1, 244, 244, 3], which represents the [batch, height, width, channel].\n\t   * If we are provide a batched data of 100 images, the input tensor should be\n\t   * in the shape of [100, 244, 244, 3].\n\t   *\n\t   * @param config Prediction configuration for specifying the batch size and\n\t   * output node names. Currently the batch size option is ignored for graph\n\t   * model.\n\t   *\n\t   * @returns Inference result tensors. The output would be single `tf.Tensor`\n\t   * if model has single output node, otherwise Tensor[] or NamedTensorMap[]\n\t   * will be returned for model with multiple outputs.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.predict = function predict(inputs, config) {\n\t    return this.execute(inputs, this.outputNodes);\n\t  };\n\n\t  _proto.normalizeInputs = function normalizeInputs(inputs) {\n\t    if (!(inputs instanceof Tensor) && !Array.isArray(inputs)) {\n\t      // The input is already a NamedTensorMap.\n\t      return inputs;\n\t    }\n\n\t    inputs = Array.isArray(inputs) ? inputs : [inputs];\n\n\t    if (inputs.length !== this.inputNodes.length) {\n\t      throw new Error('Input tensor count mismatch,' + (\"the graph model has \" + this.inputNodes.length + \" placeholders, \") + (\"while there are \" + inputs.length + \" input tensors.\"));\n\t    }\n\n\t    return this.inputNodes.reduce(function (map, inputName, i) {\n\t      map[inputName] = inputs[i];\n\t      return map;\n\t    }, {});\n\t  };\n\n\t  _proto.normalizeOutputs = function normalizeOutputs(outputs) {\n\t    outputs = outputs || this.outputNodes;\n\t    return !Array.isArray(outputs) ? [outputs] : outputs;\n\t  }\n\t  /**\n\t   * Executes inference for the model for given input tensors.\n\t   * @param inputs tensor, tensor array or tensor map of the inputs for the\n\t   * model, keyed by the input node names.\n\t   * @param outputs output node name from the Tensorflow model, if no\n\t   * outputs are specified, the default outputs of the model would be used.\n\t   * You can inspect intermediate nodes of the model by adding them to the\n\t   * outputs array.\n\t   *\n\t   * @returns A single tensor if provided with a single output or no outputs\n\t   * are provided and there is only one default output, otherwise return a\n\t   * tensor array. The order of the tensor array is the same as the outputs\n\t   * if provided, otherwise the order of outputNodes attribute of the model.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.execute = function execute(inputs, outputs) {\n\t    inputs = this.normalizeInputs(inputs);\n\t    outputs = this.normalizeOutputs(outputs);\n\t    var result = this.executor.execute(inputs, outputs);\n\t    return result.length > 1 ? result : result[0];\n\t  }\n\t  /**\n\t   * Executes inference for the model for given input tensors in async\n\t   * fashion, use this method when your model contains control flow ops.\n\t   * @param inputs tensor, tensor array or tensor map of the inputs for the\n\t   * model, keyed by the input node names.\n\t   * @param outputs output node name from the Tensorflow model, if no outputs\n\t   * are specified, the default outputs of the model would be used. You can\n\t   * inspect intermediate nodes of the model by adding them to the outputs\n\t   * array.\n\t   *\n\t   * @returns A Promise of single tensor if provided with a single output or\n\t   * no outputs are provided and there is only one default output, otherwise\n\t   * return a tensor map.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.executeAsync =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _executeAsync = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(inputs, outputs) {\n\t      var result;\n\t      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t        while (1) {\n\t          switch (_context3.prev = _context3.next) {\n\t            case 0:\n\t              inputs = this.normalizeInputs(inputs);\n\t              outputs = this.normalizeOutputs(outputs);\n\t              _context3.next = 4;\n\t              return this.executor.executeAsync(inputs, outputs);\n\n\t            case 4:\n\t              result = _context3.sent;\n\t              return _context3.abrupt(\"return\", result.length > 1 ? result : result[0]);\n\n\t            case 6:\n\t            case \"end\":\n\t              return _context3.stop();\n\t          }\n\t        }\n\t      }, _callee3, this);\n\t    }));\n\n\t    function executeAsync(_x3, _x4) {\n\t      return _executeAsync.apply(this, arguments);\n\t    }\n\n\t    return executeAsync;\n\t  }();\n\n\t  _proto.convertTensorMapToTensorsMap = function convertTensorMapToTensorsMap(map) {\n\t    return Object.keys(map).reduce(function (newMap, key) {\n\t      newMap[key] = [map[key]];\n\t      return newMap;\n\t    }, {});\n\t  }\n\t  /**\n\t   * Releases the memory used by the weight tensors and resourceManager.\n\t   *\n\t   * @doc {heading: 'Models', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.dispose = function dispose() {\n\t    this.executor.dispose();\n\n\t    if (this.initializer) {\n\t      this.initializer.dispose();\n\t    }\n\n\t    this.resourceManager.dispose();\n\t  };\n\n\t  _createClass(GraphModel, [{\n\t    key: \"modelVersion\",\n\t    get: function get() {\n\t      return this.version;\n\t    }\n\t  }, {\n\t    key: \"inputNodes\",\n\t    get: function get() {\n\t      return this.executor.inputNodes;\n\t    }\n\t  }, {\n\t    key: \"outputNodes\",\n\t    get: function get() {\n\t      return this.executor.outputNodes;\n\t    }\n\t  }, {\n\t    key: \"inputs\",\n\t    get: function get() {\n\t      return this.executor.inputs;\n\t    }\n\t  }, {\n\t    key: \"outputs\",\n\t    get: function get() {\n\t      return this.executor.outputs;\n\t    }\n\t  }, {\n\t    key: \"weights\",\n\t    get: function get() {\n\t      return this.executor.weightMap;\n\t    }\n\t  }, {\n\t    key: \"metadata\",\n\t    get: function get() {\n\t      return this.artifacts.userDefinedMetadata;\n\t    }\n\t  }, {\n\t    key: \"modelSignature\",\n\t    get: function get() {\n\t      return this.signature;\n\t    }\n\t  }]);\n\n\t  return GraphModel;\n\t}();\n\t/**\n\t * Load a graph model given a URL to the model definition.\n\t *\n\t * Example of loading MobileNetV2 from a URL and making a prediction with a\n\t * zeros input:\n\t *\n\t * ```js\n\t * const modelUrl =\n\t *    'https://storage.googleapis.com/tfjs-models/savedmodel/mobilenet_v2_1.0_224/model.json';\n\t * const model = await tf.loadGraphModel(modelUrl);\n\t * const zeros = tf.zeros([1, 224, 224, 3]);\n\t * model.predict(zeros).print();\n\t * ```\n\t *\n\t * Example of loading MobileNetV2 from a TF Hub URL and making a prediction with\n\t * a zeros input:\n\t *\n\t * ```js\n\t * const modelUrl =\n\t *    'https://tfhub.dev/google/imagenet/mobilenet_v2_140_224/classification/2';\n\t * const model = await tf.loadGraphModel(modelUrl, {fromTFHub: true});\n\t * const zeros = tf.zeros([1, 224, 224, 3]);\n\t * model.predict(zeros).print();\n\t * ```\n\t * @param modelUrl The url or an `io.IOHandler` that loads the model.\n\t * @param options Options for the HTTP request, which allows to send credentials\n\t *    and custom headers.\n\t *\n\t * @doc {heading: 'Models', subheading: 'Loading'}\n\t */\n\n\tfunction loadGraphModel(_x5, _x6) {\n\t  return _loadGraphModel.apply(this, arguments);\n\t}\n\n\tfunction _loadGraphModel() {\n\t  _loadGraphModel = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(modelUrl, options) {\n\t    var model;\n\t    return regeneratorRuntime.wrap(function _callee4$(_context4) {\n\t      while (1) {\n\t        switch (_context4.prev = _context4.next) {\n\t          case 0:\n\t            if (options === void 0) {\n\t              options = {};\n\t            }\n\n\t            if (!(modelUrl == null)) {\n\t              _context4.next = 3;\n\t              break;\n\t            }\n\n\t            throw new Error('modelUrl in loadGraphModel() cannot be null. Please provide a url ' + 'or an IOHandler that loads the model');\n\n\t          case 3:\n\t            if (options == null) {\n\t              options = {};\n\t            }\n\n\t            if (options.fromTFHub) {\n\t              if (modelUrl.load == null) {\n\t                if (!modelUrl.endsWith('/')) {\n\t                  modelUrl = modelUrl + '/';\n\t                }\n\n\t                modelUrl = \"\" + modelUrl + DEFAULT_MODEL_NAME + TFHUB_SEARCH_PARAM;\n\t              }\n\t            }\n\n\t            model = new GraphModel(modelUrl, options);\n\t            _context4.next = 8;\n\t            return model.load();\n\n\t          case 8:\n\t            return _context4.abrupt(\"return\", model);\n\n\t          case 9:\n\t          case \"end\":\n\t            return _context4.stop();\n\t        }\n\t      }\n\t    }, _callee4);\n\t  }));\n\t  return _loadGraphModel.apply(this, arguments);\n\t}\n\n\t/** @license See the LICENSE file. */\n\t// This code is auto-generated, do not modify this file!\n\tvar version$3 = '2.8.3';\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\t/**\n\t * Apply a mapping function to a nested structure in a recursive manner.\n\t *\n\t * The result of the mapping is an object with the same nested structure (i.e.,\n\t * of arrays and dicts) as the input, except that some subtrees are replaced,\n\t * according to the results of the mapping function.\n\t *\n\t * Mappings are memoized.  Thus, if the nested structure contains the same\n\t * object in multiple positions, the output will contain the same mapped object\n\t * in those positions.  Cycles are not supported, however.\n\t *\n\t * @param input: The object to which to apply the mapping function.\n\t * @param mapFn: A function that expects a single node of the object tree, and\n\t *   returns a `DeepMapResult`.  The `DeepMapResult` either provides a\n\t *   replacement value for that node (i.e., replacing the subtree), or indicates\n\t *   that the node should be processed recursively.\n\t */\n\n\tfunction deepMap(input, mapFn) {\n\t  return deepMapInternal(input, mapFn);\n\t}\n\t/**\n\t * @param seen: A Map of known object mappings (i.e., memoized results of\n\t *   `mapFn()`)\n\t * @param containedIn: An set containing objects on the reference path currently\n\t *   being processed (used to detect cycles).\n\t */\n\n\tfunction deepMapInternal(input, mapFn, seen, containedIn) {\n\t  if (seen === void 0) {\n\t    seen = new Map();\n\t  }\n\n\t  if (containedIn === void 0) {\n\t    containedIn = new Set();\n\t  }\n\n\t  if (input == null) {\n\t    return null;\n\t  }\n\n\t  if (containedIn.has(input)) {\n\t    throw new Error('Circular references are not supported.');\n\t  }\n\n\t  if (seen.has(input)) {\n\t    return seen.get(input);\n\t  }\n\n\t  var result = mapFn(input);\n\n\t  if (result.recurse && result.value !== null) {\n\t    throw new Error('A deep map function may not return both a value and recurse=true.');\n\t  }\n\n\t  if (!result.recurse) {\n\t    seen.set(input, result.value);\n\t    return result.value;\n\t  } else if (isIterable$1(input)) {\n\t    // tslint:disable-next-line:no-any\n\t    var mappedIterable = Array.isArray(input) ? [] : {};\n\t    containedIn.add(input);\n\n\t    for (var k in input) {\n\t      var child = input[k];\n\t      var childResult = deepMapInternal(child, mapFn, seen, containedIn);\n\t      mappedIterable[k] = childResult;\n\t    }\n\n\t    containedIn.delete(input);\n\t    return mappedIterable;\n\t  } else {\n\t    throw new Error(\"Can't recurse into non-iterable type: \" + input);\n\t  }\n\t} // TODO(soergel, kangyizhang) Reconsider naming of deepZip() to avoid confusion\n\t// with zip()\n\n\t/**\n\t * Zip nested structures together in a recursive manner.\n\t *\n\t * This has the effect of transposing or pivoting data, e.g. converting it from\n\t * a row-major representation to a column-major representation.\n\t *\n\t * For example, `deepZip([{a: 1, b: 2}, {a: 3, b: 4}])` returns\n\t * `{a: [1, 3], b: [2, 4]}`.\n\t *\n\t * The inputs should all have the same nested structure (i.e., of arrays and\n\t * dicts).  The result is a single object with the same nested structure, where\n\t * the leaves are arrays collecting the values of the inputs at that location\n\t * (or, optionally, the result of a custom function applied to those arrays).\n\t *\n\t * @param inputs: An array of the objects to zip together.\n\t * @param zipFn: (optional) A function that expects an array of elements at a\n\t *   single node of the object tree, and returns a `DeepMapResult`.  The\n\t *   `DeepMapResult` either provides a result value for that node (i.e.,\n\t *   representing the subtree), or indicates that the node should be processed\n\t *   recursively.  The default zipFn recurses as far as possible and places\n\t *   arrays at the leaves.\n\t */\n\n\n\tfunction deepZip(inputs, zipFn) {\n\t  if (zipFn === void 0) {\n\t    zipFn = zipToList;\n\t  }\n\n\t  return deepZipInternal(inputs, zipFn);\n\t}\n\t/**\n\t * @param containedIn: An set containing objects on the reference path currently\n\t *   being processed (used to detect cycles).\n\t */\n\n\tfunction deepZipInternal(inputs, zipFn, containedIn) {\n\t  if (containedIn === void 0) {\n\t    containedIn = new Set();\n\t  }\n\n\t  // The recursion follows the structure of input 0; it's assumed that all the\n\t  // other inputs have the same structure.\n\t  var input = inputs[0];\n\n\t  if (containedIn.has(input)) {\n\t    throw new Error('Circular references are not supported.');\n\t  }\n\n\t  var result = zipFn(inputs);\n\n\t  if (result.recurse && result.value !== null) {\n\t    throw new Error('A deep zip function may not return both a value and recurse=true.');\n\t  }\n\n\t  if (!result.recurse) {\n\t    return result.value;\n\t  } else if (isIterable$1(input)) {\n\t    // tslint:disable-next-line:no-any\n\t    var mappedIterable = Array.isArray(input) ? [] : {};\n\t    containedIn.add(input);\n\n\t    var _loop = function _loop(k) {\n\t      var children = inputs.map(function (x) {\n\t        return x[k];\n\t      });\n\t      var childResult = deepZipInternal(children, zipFn, containedIn);\n\t      mappedIterable[k] = childResult;\n\t    };\n\n\t    for (var k in input) {\n\t      _loop(k);\n\t    }\n\n\t    containedIn.delete(input);\n\t    return mappedIterable;\n\t  } else {\n\t    throw new Error(\"Can't recurse into non-iterable type: \" + input);\n\t  }\n\t} // tslint:disable-next-line:no-any\n\n\n\tfunction zipToList(x) {\n\t  if (x === null) {\n\t    return null;\n\t  } // TODO(soergel): validate array type?\n\n\n\t  if (isIterable$1(x[0])) {\n\t    return {\n\t      value: null,\n\t      recurse: true\n\t    };\n\t  } else {\n\t    return {\n\t      value: x,\n\t      recurse: false\n\t    };\n\t  }\n\t}\n\t/**\n\t * Apply an async mapping function to a nested structure in a recursive manner.\n\t *\n\t * This first creates a nested structure of Promises, and then awaits all of\n\t * those, resulting in a single Promise for a resolved nested structure.\n\t *\n\t * The result of the mapping is an object with the same nested structure (i.e.,\n\t * of arrays and dicts) as the input, except that some subtrees are replaced,\n\t * according to the results of the mapping function.\n\t *\n\t * Mappings are memoized.  Thus, if the nested structure contains the same\n\t * object in multiple positions, the output will contain the same mapped object\n\t * in those positions.  Cycles are not supported, however.\n\t *\n\t * @param input: The object to which to apply the mapping function.\n\t * @param mapFn: A function that expects a single node of the object tree, and\n\t *   returns a `DeepMapAsyncResult`.  The `DeepMapAsyncResult` either provides\n\t *   a `Promise` for a replacement value for that node (i.e., replacing the\n\t *   subtree), or indicates that the node should be processed recursively.  Note\n\t *   that the decision whether or not to recurse must be made immediately; only\n\t *   the mapped value may be promised.\n\t */\n\n\tfunction deepMapAndAwaitAll(_x, _x2) {\n\t  return _deepMapAndAwaitAll.apply(this, arguments);\n\t}\n\t/**\n\t * Determine whether the argument is iterable.\n\t *\n\t * @returns true if the argument is an array or any non-Tensor object.\n\t */\n\t// tslint:disable-next-line:no-any\n\n\tfunction _deepMapAndAwaitAll() {\n\t  _deepMapAndAwaitAll = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(input, mapFn) {\n\t    var seen, _i, _Array$from, key, value, mappedValue, result;\n\n\t    return regeneratorRuntime.wrap(function _callee$(_context) {\n\t      while (1) {\n\t        switch (_context.prev = _context.next) {\n\t          case 0:\n\t            seen = new Map(); // First do a normal deepMap, collecting Promises in 'seen' as a side effect.\n\n\t            deepMapInternal(input, mapFn, seen); // Replace the Promises in 'seen' in place.\n\t            // Note TypeScript provides no async map iteration, and regular map iteration\n\t            // is broken too, so sadly we have to do Array.from() to make it work.\n\t            // (There's no advantage to Promise.all(), and that would be tricky anyway.)\n\n\t            _i = 0, _Array$from = Array.from(seen.keys());\n\n\t          case 3:\n\t            if (!(_i < _Array$from.length)) {\n\t              _context.next = 14;\n\t              break;\n\t            }\n\n\t            key = _Array$from[_i];\n\t            value = seen.get(key);\n\n\t            if (!isPromise(value)) {\n\t              _context.next = 11;\n\t              break;\n\t            }\n\n\t            _context.next = 9;\n\t            return value;\n\n\t          case 9:\n\t            mappedValue = _context.sent;\n\t            seen.set(key, mappedValue);\n\n\t          case 11:\n\t            _i++;\n\t            _context.next = 3;\n\t            break;\n\n\t          case 14:\n\t            // Normal deepMap again, this time filling in the resolved values.\n\t            // It's unfortunate that we have to do two passes.\n\t            // TODO(soergel): test performance and think harder about a fast solution.\n\t            result = deepMapInternal(input, mapFn, seen);\n\t            return _context.abrupt(\"return\", result);\n\n\t          case 16:\n\t          case \"end\":\n\t            return _context.stop();\n\t        }\n\t      }\n\t    }, _callee);\n\t  }));\n\t  return _deepMapAndAwaitAll.apply(this, arguments);\n\t}\n\n\tfunction isIterable$1(obj) {\n\t  return obj != null && !ArrayBuffer.isView(obj) && (Array.isArray(obj) || typeof obj === 'object' && !(obj instanceof Tensor));\n\t}\n\t/**\n\t * Determine whether the argument can be converted to Tensor.\n\t *\n\t * Tensors, primitives, arrays, and TypedArrays all qualify; anything else does\n\t * not.\n\t *\n\t * @returns true if the argument can be converted to Tensor.\n\t */\n\t// tslint:disable-next-line:no-any\n\n\tfunction canTensorify(obj) {\n\t  return obj == null || isPrimitive(obj) || Array.isArray(obj) || typeof obj === 'object' && obj instanceof Tensor || isTypedArray$1(obj);\n\t}\n\t/**\n\t * Returns true if the given `value` is a primitive type. Otherwise returns\n\t * false. This is equivalant to node util.isPrimitive\n\t */\n\n\tfunction isPrimitive(value) {\n\t  return value === null || typeof value !== 'object' && typeof value !== 'function';\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t *\n\t * =============================================================================\n\t */\n\tfunction deepClone(container) {\n\t  return deepMap(container, cloneIfTensor);\n\t} // tslint:disable-next-line: no-any\n\n\tfunction cloneIfTensor(item) {\n\t  if (item instanceof Tensor) {\n\t    return {\n\t      value: item.clone(),\n\t      recurse: false\n\t    };\n\t  } else if (isIterable$1(item)) {\n\t    return {\n\t      value: null,\n\t      recurse: true\n\t    };\n\t  } else {\n\t    return {\n\t      value: item,\n\t      recurse: false\n\t    };\n\t  }\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t *\n\t * =============================================================================\n\t */\n\n\t/**\n\t * A ring buffer, providing O(1) FIFO, LIFO, and related operations.\n\t */\n\tvar RingBuffer = /*#__PURE__*/function () {\n\t  /**\n\t   * Constructs a `RingBuffer`.\n\t   * @param capacity The number of items that the buffer can accomodate.\n\t   */\n\t  function RingBuffer(capacity) {\n\t    this.capacity = capacity; // Note we store the indices in the range 0 <= index < 2*capacity.\n\t    // This allows us to distinguish the full from the empty case.\n\t    // See https://www.snellman.net/blog/archive/2016-12-13-ring-buffers/\n\n\t    this.begin = 0; // inclusive\n\n\t    this.end = 0; // exclusive\n\n\t    if (capacity == null) {\n\t      throw new RangeError('Can\\'t create a ring buffer of unknown capacity.');\n\t    }\n\n\t    if (capacity < 1) {\n\t      throw new RangeError('Can\\'t create ring buffer of capacity < 1.');\n\t    }\n\n\t    this.data = new Array(capacity);\n\t    this.doubledCapacity = 2 * capacity;\n\t  }\n\t  /**\n\t   * Map any index into the range 0 <= index < 2*capacity.\n\t   */\n\n\n\t  var _proto = RingBuffer.prototype;\n\n\t  _proto.wrap = function wrap(index) {\n\t    // don't trust % on negative numbers\n\t    while (index < 0) {\n\t      index += this.doubledCapacity;\n\t    }\n\n\t    return index % this.doubledCapacity;\n\t  };\n\n\t  _proto.get = function get(index) {\n\t    if (index < 0) {\n\t      throw new RangeError('Can\\'t get item at a negative index.');\n\t    }\n\n\t    return this.data[index % this.capacity];\n\t  };\n\n\t  _proto.set = function set(index, value) {\n\t    if (index < 0) {\n\t      throw new RangeError('Can\\'t set item at a negative index.');\n\t    }\n\n\t    this.data[index % this.capacity] = value;\n\t  }\n\t  /**\n\t   * Returns the current number of items in the buffer.\n\t   */\n\t  ;\n\n\t  _proto.length = function length() {\n\t    var length = this.end - this.begin;\n\n\t    if (length < 0) {\n\t      length = this.doubledCapacity + length;\n\t    }\n\n\t    return length;\n\t  }\n\t  /**\n\t   * Reports whether the buffer is full.\n\t   * @returns true if the number of items in the buffer equals its capacity, and\n\t   *   false otherwise.\n\t   */\n\t  ;\n\n\t  _proto.isFull = function isFull() {\n\t    return this.length() === this.capacity;\n\t  }\n\t  /**\n\t   * Reports whether the buffer is empty.\n\t   * @returns true if the number of items in the buffer equals zero, and\n\t   *   false otherwise.\n\t   */\n\t  ;\n\n\t  _proto.isEmpty = function isEmpty() {\n\t    return this.length() === 0;\n\t  }\n\t  /**\n\t   * Adds an item to the end of the buffer.\n\t   */\n\t  ;\n\n\t  _proto.push = function push(value) {\n\t    if (this.isFull()) {\n\t      throw new RangeError('Ring buffer is full.');\n\t    }\n\n\t    this.set(this.end, value);\n\t    this.end = this.wrap(this.end + 1);\n\t  }\n\t  /**\n\t   * Adds many items to the end of the buffer, in order.\n\t   */\n\t  ;\n\n\t  _proto.pushAll = function pushAll(values) {\n\t    for (var _iterator = _createForOfIteratorHelperLoose(values), _step; !(_step = _iterator()).done;) {\n\t      var value = _step.value;\n\t      this.push(value);\n\t    }\n\t  }\n\t  /**\n\t   * Removes and returns the last item in the buffer.\n\t   */\n\t  ;\n\n\t  _proto.pop = function pop() {\n\t    if (this.isEmpty()) {\n\t      throw new RangeError('Ring buffer is empty.');\n\t    }\n\n\t    this.end = this.wrap(this.end - 1);\n\t    var result = this.get(this.end);\n\t    this.set(this.end, undefined);\n\t    return result;\n\t  }\n\t  /**\n\t   * Adds an item to the beginning of the buffer.\n\t   */\n\t  ;\n\n\t  _proto.unshift = function unshift(value) {\n\t    if (this.isFull()) {\n\t      throw new RangeError('Ring buffer is full.');\n\t    }\n\n\t    this.begin = this.wrap(this.begin - 1);\n\t    this.set(this.begin, value);\n\t  }\n\t  /**\n\t   * Removes and returns the first item in the buffer.\n\t   */\n\t  ;\n\n\t  _proto.shift = function shift() {\n\t    if (this.isEmpty()) {\n\t      throw new RangeError('Ring buffer is empty.');\n\t    }\n\n\t    var result = this.get(this.begin);\n\t    this.set(this.begin, undefined);\n\t    this.begin = this.wrap(this.begin + 1);\n\t    return result;\n\t  }\n\t  /**\n\t   * Removes and returns a specific item in the buffer, and moves the last item\n\t   * to the vacated slot.  This is useful for implementing a shuffling stream.\n\t   * Note that this operation necessarily scrambles the original order.\n\t   *\n\t   * @param relativeIndex: the index of the item to remove, relative to the\n\t   *   first item in the buffer (e.g., hiding the ring nature of the underlying\n\t   *   storage).\n\t   */\n\t  ;\n\n\t  _proto.shuffleExcise = function shuffleExcise(relativeIndex) {\n\t    if (this.isEmpty()) {\n\t      throw new RangeError('Ring buffer is empty.');\n\t    }\n\n\t    var index = this.wrap(this.begin + relativeIndex);\n\t    var result = this.get(index);\n\t    this.set(index, this.pop());\n\t    return result;\n\t  };\n\n\t  return RingBuffer;\n\t}();\n\n\tvar GrowingRingBuffer = /*#__PURE__*/function (_RingBuffer) {\n\t  _inheritsLoose(GrowingRingBuffer, _RingBuffer);\n\n\t  /**\n\t   * Constructs a `GrowingRingBuffer`.\n\t   */\n\t  function GrowingRingBuffer() {\n\t    return _RingBuffer.call(this, GrowingRingBuffer.INITIAL_CAPACITY) || this;\n\t  }\n\n\t  var _proto = GrowingRingBuffer.prototype;\n\n\t  _proto.isFull = function isFull() {\n\t    return false;\n\t  };\n\n\t  _proto.push = function push(value) {\n\t    if (_RingBuffer.prototype.isFull.call(this)) {\n\t      this.expand();\n\t    }\n\n\t    _RingBuffer.prototype.push.call(this, value);\n\t  };\n\n\t  _proto.unshift = function unshift(value) {\n\t    if (_RingBuffer.prototype.isFull.call(this)) {\n\t      this.expand();\n\t    }\n\n\t    _RingBuffer.prototype.unshift.call(this, value);\n\t  }\n\t  /**\n\t   * Doubles the capacity of the buffer.\n\t   */\n\t  ;\n\n\t  _proto.expand = function expand() {\n\t    var newCapacity = this.capacity * 2;\n\t    var newData = new Array(newCapacity);\n\t    var len = this.length(); // Rotate the buffer to start at index 0 again, since we can't just\n\t    // allocate more space at the end.\n\n\t    for (var i = 0; i < len; i++) {\n\t      newData[i] = this.get(this.wrap(this.begin + i));\n\t    }\n\n\t    this.data = newData;\n\t    this.capacity = newCapacity;\n\t    this.doubledCapacity = 2 * this.capacity;\n\t    this.begin = 0;\n\t    this.end = len;\n\t  };\n\n\t  return GrowingRingBuffer;\n\t}(RingBuffer);\n\tGrowingRingBuffer.INITIAL_CAPACITY = 32;\n\n\t// This lets us avoid using either third-party stream libraries or\n\t// recent TypeScript language support requiring polyfills.\n\n\t/**\n\t * Create a `LazyIterator` from an array of items.\n\t */\n\n\tfunction iteratorFromItems(items) {\n\t  return new ArrayIterator(items);\n\t}\n\t/**\n\t * Create a `LazyIterator` of incrementing integers.\n\t */\n\n\tfunction iteratorFromIncrementing(start) {\n\t  var i = start;\n\t  return iteratorFromFunction(function () {\n\t    return {\n\t      value: i++,\n\t      done: false\n\t    };\n\t  });\n\t}\n\t/**\n\t * Create a `LazyIterator` from a function.\n\t *\n\t * ```js\n\t * let i = -1;\n\t * const func = () =>\n\t *    ++i < 5 ? {value: i, done: false} : {value: null, done: true};\n\t * const iter = tf.data.iteratorFromFunction(func);\n\t * await iter.forEachAsync(e => console.log(e));\n\t * ```\n\t *\n\t * @param func A function that produces data on each call.\n\t */\n\n\tfunction iteratorFromFunction(func) {\n\t  return new FunctionCallIterator(func);\n\t}\n\t/**\n\t * Create a `LazyIterator` by concatenating underlying streams, which are\n\t * themselves provided as a stream.\n\t *\n\t * This can also be thought of as a \"stream flatten\" operation.\n\t *\n\t * @param baseIterators A stream of streams to be concatenated.\n\t * @param baseErrorHandler An optional function that can intercept `Error`s\n\t *   raised during a `next()` call on the base stream.  This function can decide\n\t *   whether the error should be propagated, whether the error should be\n\t *   ignored, or whether the base stream should be terminated.\n\t */\n\n\tfunction iteratorFromConcatenated(baseIterators, baseErrorHandler) {\n\t  return new ChainedIterator(baseIterators, baseErrorHandler);\n\t}\n\t/**\n\t * Create a `LazyIterator` by concatenating streams produced by calling a\n\t * stream-generating function a given number of times.\n\t *\n\t * Since a `LazyIterator` is read-once, it cannot be repeated, but this\n\t * function can be used to achieve a similar effect:\n\t *\n\t *   LazyIterator.ofConcatenatedFunction(() => new MyIterator(), 6);\n\t *\n\t * @param iteratorFunc: A function that produces a new stream on each call.\n\t * @param count: The number of times to call the function.\n\t * @param baseErrorHandler An optional function that can intercept `Error`s\n\t *   raised during a `next()` call on the base stream.  This function can decide\n\t *   whether the error should be propagated, whether the error should be\n\t *   ignored, or whether the base stream should be terminated.\n\t */\n\n\tfunction iteratorFromConcatenatedFunction(iteratorFunc, count, baseErrorHandler) {\n\t  return iteratorFromConcatenated(iteratorFromFunction(iteratorFunc).take(count), baseErrorHandler);\n\t}\n\t/**\n\t * Create a `LazyIterator` by zipping together an array, dict, or nested\n\t * structure of `LazyIterator`s (and perhaps additional constants).\n\t *\n\t * The underlying streams must provide elements in a consistent order such\n\t * that they correspond.\n\t *\n\t * Typically, the underlying streams should have the same number of\n\t * elements. If they do not, the behavior is determined by the\n\t * `mismatchMode` argument.\n\t *\n\t * The nested structure of the `iterators` argument determines the\n\t * structure of elements in the resulting iterator.\n\t *\n\t * @param iterators: An array or object containing LazyIterators at the\n\t * leaves.\n\t * @param mismatchMode: Determines what to do when one underlying iterator\n\t * is exhausted before the others.  `ZipMismatchMode.FAIL` (the default)\n\t * causes an error to be thrown in this case.  `ZipMismatchMode.SHORTEST`\n\t * causes the zipped iterator to terminate with the furst underlying\n\t * streams, so elements remaining on the longer streams are ignored.\n\t * `ZipMismatchMode.LONGEST` causes the zipped stream to continue, filling\n\t * in nulls for the exhausted streams, until all streams are exhausted.\n\t */\n\n\tfunction iteratorFromZipped(iterators, mismatchMode) {\n\t  if (mismatchMode === void 0) {\n\t    mismatchMode = ZipMismatchMode.FAIL;\n\t  }\n\n\t  return new ZipIterator(iterators, mismatchMode);\n\t}\n\t/**\n\t * An asynchronous iterator, providing lazy access to a potentially\n\t * unbounded stream of elements.\n\t *\n\t * Iterator can be obtained from a dataset:\n\t * `const iter = await dataset.iterator();`\n\t */\n\n\tvar LazyIterator = /*#__PURE__*/function () {\n\t  function LazyIterator() {}\n\n\t  var _proto = LazyIterator.prototype;\n\n\t  /**\n\t   * Collect all remaining elements of a bounded stream into an array.\n\t   * Obviously this will succeed only for small streams that fit in memory.\n\t   * Useful for testing.\n\t   *\n\t   * @returns A Promise for an array of stream elements, which will resolve\n\t   *   when the stream is exhausted.\n\t   */\n\t  _proto.toArray =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _toArray = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      var result, x;\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              result = [];\n\t              _context.next = 3;\n\t              return this.next();\n\n\t            case 3:\n\t              x = _context.sent;\n\n\t            case 4:\n\t              if (x.done) {\n\t                _context.next = 11;\n\t                break;\n\t              }\n\n\t              result.push(x.value);\n\t              _context.next = 8;\n\t              return this.next();\n\n\t            case 8:\n\t              x = _context.sent;\n\t              _context.next = 4;\n\t              break;\n\n\t            case 11:\n\t              return _context.abrupt(\"return\", result);\n\n\t            case 12:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function toArray() {\n\t      return _toArray.apply(this, arguments);\n\t    }\n\n\t    return toArray;\n\t  }()\n\t  /**\n\t   * Collect all elements of this dataset into an array with prefetching 100\n\t   * elements. This is useful for testing, because the prefetch changes the\n\t   * order in which the Promises are resolved along the processing pipeline.\n\t   * This may help expose bugs where results are dependent on the order of\n\t   * Promise resolution rather than on the logical order of the stream (i.e.,\n\t   * due to hidden mutable state).\n\t   *\n\t   * @returns A Promise for an array of stream elements, which will resolve\n\t   *   when the stream is exhausted.\n\t   */\n\t  ;\n\n\t  _proto.toArrayForTest =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _toArrayForTest = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n\t      var stream, result, x;\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              stream = this.prefetch(100);\n\t              result = [];\n\t              _context2.next = 4;\n\t              return stream.next();\n\n\t            case 4:\n\t              x = _context2.sent;\n\n\t            case 5:\n\t              if (x.done) {\n\t                _context2.next = 12;\n\t                break;\n\t              }\n\n\t              result.push(x.value);\n\t              _context2.next = 9;\n\t              return stream.next();\n\n\t            case 9:\n\t              x = _context2.sent;\n\t              _context2.next = 5;\n\t              break;\n\n\t            case 12:\n\t              return _context2.abrupt(\"return\", result);\n\n\t            case 13:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function toArrayForTest() {\n\t      return _toArrayForTest.apply(this, arguments);\n\t    }\n\n\t    return toArrayForTest;\n\t  }()\n\t  /**\n\t   * Draw items from the stream until it is exhausted.\n\t   *\n\t   * This can be useful when the stream has side effects but no output.  In\n\t   * that case, calling this function guarantees that the stream will be\n\t   * fully processed.\n\t   */\n\t  ;\n\n\t  _proto.resolveFully =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _resolveFully = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n\t      var x;\n\t      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t        while (1) {\n\t          switch (_context3.prev = _context3.next) {\n\t            case 0:\n\t              _context3.next = 2;\n\t              return this.next();\n\n\t            case 2:\n\t              x = _context3.sent;\n\n\t            case 3:\n\t              if (x.done) {\n\t                _context3.next = 9;\n\t                break;\n\t              }\n\n\t              _context3.next = 6;\n\t              return this.next();\n\n\t            case 6:\n\t              x = _context3.sent;\n\t              _context3.next = 3;\n\t              break;\n\n\t            case 9:\n\t            case \"end\":\n\t              return _context3.stop();\n\t          }\n\t        }\n\t      }, _callee3, this);\n\t    }));\n\n\t    function resolveFully() {\n\t      return _resolveFully.apply(this, arguments);\n\t    }\n\n\t    return resolveFully;\n\t  }()\n\t  /**\n\t   * Draw items from the stream until it is exhausted, or a predicate fails.\n\t   *\n\t   * This can be useful when the stream has side effects but no output.  In\n\t   * that case, calling this function guarantees that the stream will be\n\t   * fully processed.\n\t   */\n\t  ;\n\n\t  _proto.resolveWhile =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _resolveWhile = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(predicate) {\n\t      var x, shouldContinue;\n\t      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n\t        while (1) {\n\t          switch (_context4.prev = _context4.next) {\n\t            case 0:\n\t              _context4.next = 2;\n\t              return this.next();\n\n\t            case 2:\n\t              x = _context4.sent;\n\t              shouldContinue = predicate(x.value);\n\n\t            case 4:\n\t              if (!(!x.done && shouldContinue)) {\n\t                _context4.next = 11;\n\t                break;\n\t              }\n\n\t              _context4.next = 7;\n\t              return this.next();\n\n\t            case 7:\n\t              x = _context4.sent;\n\t              shouldContinue = predicate(x.value);\n\t              _context4.next = 4;\n\t              break;\n\n\t            case 11:\n\t            case \"end\":\n\t              return _context4.stop();\n\t          }\n\t        }\n\t      }, _callee4, this);\n\t    }));\n\n\t    function resolveWhile(_x) {\n\t      return _resolveWhile.apply(this, arguments);\n\t    }\n\n\t    return resolveWhile;\n\t  }()\n\t  /**\n\t   * Handles errors thrown on this stream using a provided handler function.\n\t   *\n\t   * @param handler A function that handles any `Error` thrown during a `next()`\n\t   *   call and returns true if the stream should continue (dropping the failed\n\t   *   call) or false if the stream should quietly terminate.  If the handler\n\t   *   itself throws (or rethrows) an `Error`, that will be propagated.\n\t   *\n\t   * @returns A `LazyIterator` of elements passed through from upstream,\n\t   *   possibly filtering or terminating on upstream `next()` calls that\n\t   *   throw an `Error`.\n\t   */\n\t  ;\n\n\t  _proto.handleErrors = function handleErrors(handler) {\n\t    return new ErrorHandlingLazyIterator(this, handler);\n\t  } // TODO(soergel): Implement reduce() etc.\n\n\t  /**\n\t   * Filters this stream according to `predicate`.\n\t   *\n\t   * @param predicate A function mapping a stream element to a boolean or a\n\t   * `Promise` for one.\n\t   *\n\t   * @returns A `LazyIterator` of elements for which the predicate was true.\n\t   */\n\t  ;\n\n\t  _proto.filter = function filter(predicate) {\n\t    return new FilterIterator(this, predicate);\n\t  }\n\t  /**\n\t   * Maps this stream through a 1-to-1 transform.\n\t   *\n\t   * @param transform A function mapping a stream element to a transformed\n\t   *   element.\n\t   *\n\t   * @returns A `LazyIterator` of transformed elements.\n\t   */\n\t  ;\n\n\t  _proto.map = function map(transform) {\n\t    return new MapIterator(this, transform);\n\t  }\n\t  /**\n\t   * Maps this stream through an async 1-to-1 transform.\n\t   *\n\t   * @param transform A function mapping a stream element to a `Promise` for a\n\t   *   transformed stream element.\n\t   *\n\t   * @returns A `LazyIterator` of transformed elements.\n\t   */\n\t  ;\n\n\t  _proto.mapAsync = function mapAsync(transform) {\n\t    return new AsyncMapIterator(this, transform);\n\t  }\n\t  /**\n\t   * Maps this stream through a 1-to-1 transform, forcing serial execution.\n\t   *\n\t   * @param transform A function mapping a stream element to a transformed\n\t   *   element.\n\t   *\n\t   * @returns A `LazyIterator` of transformed elements.\n\t   */\n\t  ;\n\n\t  _proto.serialMapAsync = function serialMapAsync(transform) {\n\t    return new AsyncMapIterator(this, transform).serial();\n\t  }\n\t  /**\n\t   * Maps this stream through a 1-to-many transform.\n\t   *\n\t   * @param transform A function mapping a stream element to an array of\n\t   *   transformed elements.\n\t   *\n\t   * @returns A `DataStream` of transformed elements.\n\t   */\n\t  ;\n\n\t  _proto.flatmap = function flatmap(transform) {\n\t    return new FlatmapIterator(this, transform);\n\t  }\n\t  /**\n\t   * Apply a function to every element of the stream.\n\t   *\n\t   * @param f A function to apply to each stream element.\n\t   */\n\t  ;\n\n\t  _proto.forEachAsync =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _forEachAsync = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5(f) {\n\t      return regeneratorRuntime.wrap(function _callee5$(_context5) {\n\t        while (1) {\n\t          switch (_context5.prev = _context5.next) {\n\t            case 0:\n\t              return _context5.abrupt(\"return\", this.map(f).resolveFully());\n\n\t            case 1:\n\t            case \"end\":\n\t              return _context5.stop();\n\t          }\n\t        }\n\t      }, _callee5, this);\n\t    }));\n\n\t    function forEachAsync(_x2) {\n\t      return _forEachAsync.apply(this, arguments);\n\t    }\n\n\t    return forEachAsync;\n\t  }()\n\t  /**\n\t   * Apply a function to every element of the stream, forcing serial execution.\n\t   *\n\t   * @param f A function to apply to each stream element.  Should return 'true'\n\t   *   to indicate that the stream should continue, or 'false' to cause it to\n\t   *   terminate.\n\t   */\n\t  ;\n\n\t  _proto.serialForEach =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _serialForEach = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6(f) {\n\t      return regeneratorRuntime.wrap(function _callee6$(_context6) {\n\t        while (1) {\n\t          switch (_context6.prev = _context6.next) {\n\t            case 0:\n\t              return _context6.abrupt(\"return\", this.serialMapAsync(f).resolveWhile(function (x) {\n\t                return x === true;\n\t              }));\n\n\t            case 1:\n\t            case \"end\":\n\t              return _context6.stop();\n\t          }\n\t        }\n\t      }, _callee6, this);\n\t    }));\n\n\t    function serialForEach(_x3) {\n\t      return _serialForEach.apply(this, arguments);\n\t    }\n\n\t    return serialForEach;\n\t  }()\n\t  /**\n\t   * Groups elements into batches, represented as arrays of elements.\n\t   *\n\t   * We can think of the elements of this iterator as 'rows' (even if they are\n\t   * nested structures).  By the same token, consecutive values for a given\n\t   * key within the elements form a 'column'.  This matches the usual sense of\n\t   * 'row' and 'column' when processing tabular data (e.g., parsing a CSV).\n\t   *\n\t   * Thus, \"Row-major\" means that the resulting batch is simply a collection of\n\t   * rows: `[row1, row2, row3, ...]`.  This is contrast to the column-major\n\t   * form, which is needed for vectorized computation.\n\t   *\n\t   * @param batchSize The number of elements desired per batch.\n\t   * @param smallLastBatch Whether to emit the final batch when it has fewer\n\t   *   than batchSize elements. Default true.\n\t   * @returns A `LazyIterator` of batches of elements, represented as arrays\n\t   *   of the original element type.\n\t   */\n\t  ;\n\n\t  _proto.rowMajorBatch = function rowMajorBatch(batchSize, smallLastBatch) {\n\t    if (smallLastBatch === void 0) {\n\t      smallLastBatch = true;\n\t    }\n\n\t    return new RowMajorBatchIterator(this, batchSize, smallLastBatch);\n\t  }\n\t  /**\n\t   * Groups elements into batches, represented in column-major form.\n\t   *\n\t   * We can think of the elements of this iterator as 'rows' (even if they are\n\t   * nested structures).  By the same token, consecutive values for a given\n\t   * key within the elements form a 'column'.  This matches the usual sense of\n\t   * 'row' and 'column' when processing tabular data (e.g., parsing a CSV).\n\t   *\n\t   * Thus, \"column-major\" means that the resulting batch is a (potentially\n\t   * nested) structure representing the columns.  Each column entry, then,\n\t   * contains a collection of the values found in that column for a range of\n\t   * input elements.  This representation allows for vectorized computation, in\n\t   * contrast to the row-major form.\n\t   *\n\t   * The inputs should all have the same nested structure (i.e., of arrays and\n\t   * dicts).  The result is a single object with the same nested structure,\n\t   * where the leaves are arrays collecting the values of the inputs at that\n\t   * location (or, optionally, the result of a custom function applied to those\n\t   * arrays).\n\t   *\n\t   * @param batchSize The number of elements desired per batch.\n\t   * @param smallLastBatch Whether to emit the final batch when it has fewer\n\t   *   than batchSize elements. Default true.\n\t   * @param zipFn: (optional) A function that expects an array of elements at a\n\t   *   single node of the object tree, and returns a `DeepMapResult`.  The\n\t   *   `DeepMapResult` either provides a result value for that node (i.e.,\n\t   *   representing the subtree), or indicates that the node should be processed\n\t   *   recursively.  The default zipFn recurses as far as possible and places\n\t   *   arrays at the leaves.\n\t   * @returns A `LazyIterator` of batches of elements, represented as an object\n\t   *   with collections at the leaves.\n\t   */\n\t  ;\n\n\t  _proto.columnMajorBatch = function columnMajorBatch(batchSize, smallLastBatch, // tslint:disable-next-line:no-any\n\t  zipFn) {\n\t    if (smallLastBatch === void 0) {\n\t      smallLastBatch = true;\n\t    }\n\n\t    if (zipFn === void 0) {\n\t      zipFn = zipToList;\n\t    }\n\n\t    // First collect the desired number of input elements as a row-major batch.\n\t    var rowBatches = this.rowMajorBatch(batchSize, smallLastBatch); // Now 'rotate' or 'pivot' the data, collecting all values from each column\n\t    // in the batch (i.e., for each key within the elements) into an array.\n\n\t    return rowBatches.map(function (x) {\n\t      return deepZip(x, zipFn);\n\t    });\n\t  }\n\t  /**\n\t   * Concatenate this `LazyIterator` with another.\n\t   *\n\t   * @param iterator A `LazyIterator` to be concatenated onto this one.\n\t   * @param baseErrorHandler An optional function that can intercept `Error`s\n\t   *   raised during a `next()` call on the base stream.  This function can\n\t   *   decide whether the error should be propagated, whether the error should\n\t   *   be ignored, or whether the base stream should be terminated.\n\t   * @returns A `LazyIterator`.\n\t   */\n\t  ;\n\n\t  _proto.concatenate = function concatenate(iterator, baseErrorHandler) {\n\t    return new ChainedIterator(iteratorFromItems([this, iterator]), baseErrorHandler);\n\t  }\n\t  /**\n\t   * Limits this stream to return at most `count` items.\n\t   *\n\t   * @param count The maximum number of items to provide from the stream. If\n\t   * a negative or undefined value is given, the entire stream is returned\n\t   *   unaltered.\n\t   */\n\t  ;\n\n\t  _proto.take = function take(count) {\n\t    if (count < 0 || count == null) {\n\t      return this;\n\t    }\n\n\t    return new TakeIterator(this, count);\n\t  }\n\t  /**\n\t   * Skips the first `count` items in this stream.\n\t   *\n\t   * @param count The number of items to skip.  If a negative or undefined\n\t   * value is given, the entire stream is returned unaltered.\n\t   */\n\t  ;\n\n\t  _proto.skip = function skip(count) {\n\t    if (count < 0 || count == null) {\n\t      return this;\n\t    }\n\n\t    return new SkipIterator(this, count);\n\t  }\n\t  /**\n\t   * Prefetch the first `bufferSize` items in this stream.\n\t   *\n\t   * Note this prefetches Promises, but makes no guarantees about when those\n\t   * Promises resolve.\n\t   *\n\t   * @param bufferSize: An integer specifying the number of elements to be\n\t   *   prefetched.\n\t   */\n\t  ;\n\n\t  _proto.prefetch = function prefetch(bufferSize) {\n\t    return new PrefetchIterator(this, bufferSize);\n\t  } // TODO(soergel): deep sharded shuffle, where supported\n\n\t  /**\n\t   * Randomly shuffles the elements of this stream.\n\t   *\n\t   * @param bufferSize: An integer specifying the number of elements from\n\t   * this stream from which the new stream will sample.\n\t   * @param seed: (Optional.) An integer specifying the random seed that\n\t   * will be used to create the distribution.\n\t   */\n\t  ;\n\n\t  _proto.shuffle = function shuffle(windowSize, seed) {\n\t    return new ShuffleIterator(this, windowSize, seed);\n\t  }\n\t  /**\n\t   * Force an iterator to execute serially: each next() call will await the\n\t   * prior one, so that they cannot execute concurrently.\n\t   */\n\t  ;\n\n\t  _proto.serial = function serial() {\n\t    return new SerialIterator(this);\n\t  };\n\n\t  return LazyIterator;\n\t}(); // ============================================================================\n\t// The following private classes serve to implement the chainable methods\n\t// on LazyIterator.  Unfortunately they can't be placed in separate files,\n\t// due to resulting trouble with circular imports.\n\t// ============================================================================\n\t// Iterators that just extend LazyIterator directly\n\t// ============================================================================\n\n\tvar ArrayIterator = /*#__PURE__*/function (_LazyIterator) {\n\t  _inheritsLoose(ArrayIterator, _LazyIterator);\n\n\t  function ArrayIterator(items) {\n\t    var _this;\n\n\t    _this = _LazyIterator.call(this) || this;\n\t    _this.items = items;\n\t    _this.trav = 0;\n\t    return _this;\n\t  }\n\n\t  var _proto2 = ArrayIterator.prototype;\n\n\t  _proto2.summary = function summary() {\n\t    return \"Array of \" + this.items.length + \" items\";\n\t  };\n\n\t  _proto2.next = /*#__PURE__*/function () {\n\t    var _next = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee7() {\n\t      var item;\n\t      return regeneratorRuntime.wrap(function _callee7$(_context7) {\n\t        while (1) {\n\t          switch (_context7.prev = _context7.next) {\n\t            case 0:\n\t              if (!(this.trav >= this.items.length)) {\n\t                _context7.next = 2;\n\t                break;\n\t              }\n\n\t              return _context7.abrupt(\"return\", {\n\t                value: null,\n\t                done: true\n\t              });\n\n\t            case 2:\n\t              item = this.items[this.trav];\n\t              this.trav++;\n\t              return _context7.abrupt(\"return\", {\n\t                value: deepClone(item),\n\t                done: false\n\t              });\n\n\t            case 5:\n\t            case \"end\":\n\t              return _context7.stop();\n\t          }\n\t        }\n\t      }, _callee7, this);\n\t    }));\n\n\t    function next() {\n\t      return _next.apply(this, arguments);\n\t    }\n\n\t    return next;\n\t  }();\n\n\t  return ArrayIterator;\n\t}(LazyIterator);\n\n\tvar FunctionCallIterator = /*#__PURE__*/function (_LazyIterator2) {\n\t  _inheritsLoose(FunctionCallIterator, _LazyIterator2);\n\n\t  function FunctionCallIterator(nextFn) {\n\t    var _this2;\n\n\t    _this2 = _LazyIterator2.call(this) || this;\n\t    _this2.nextFn = nextFn;\n\t    return _this2;\n\t  }\n\n\t  var _proto3 = FunctionCallIterator.prototype;\n\n\t  _proto3.summary = function summary() {\n\t    return \"Function call\";\n\t  };\n\n\t  _proto3.next = /*#__PURE__*/function () {\n\t    var _next2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee8() {\n\t      return regeneratorRuntime.wrap(function _callee8$(_context8) {\n\t        while (1) {\n\t          switch (_context8.prev = _context8.next) {\n\t            case 0:\n\t              _context8.prev = 0;\n\t              return _context8.abrupt(\"return\", this.nextFn());\n\n\t            case 4:\n\t              _context8.prev = 4;\n\t              _context8.t0 = _context8[\"catch\"](0);\n\t              // Modify the error message but leave the stack trace intact\n\t              _context8.t0.message = \"Error thrown while iterating through a dataset: \" + _context8.t0.message;\n\t              throw _context8.t0;\n\n\t            case 8:\n\t            case \"end\":\n\t              return _context8.stop();\n\t          }\n\t        }\n\t      }, _callee8, this, [[0, 4]]);\n\t    }));\n\n\t    function next() {\n\t      return _next2.apply(this, arguments);\n\t    }\n\n\t    return next;\n\t  }();\n\n\t  return FunctionCallIterator;\n\t}(LazyIterator);\n\n\tvar SerialIterator = /*#__PURE__*/function (_LazyIterator3) {\n\t  _inheritsLoose(SerialIterator, _LazyIterator3);\n\n\t  function SerialIterator(upstream) {\n\t    var _this3;\n\n\t    _this3 = _LazyIterator3.call(this) || this;\n\t    _this3.upstream = upstream;\n\t    _this3.lastRead = Promise.resolve({\n\t      value: null,\n\t      done: false\n\t    });\n\t    return _this3;\n\t  }\n\n\t  var _proto4 = SerialIterator.prototype;\n\n\t  _proto4.summary = function summary() {\n\t    return this.upstream.summary() + \" -> Serial\";\n\t  };\n\n\t  _proto4.next = /*#__PURE__*/function () {\n\t    var _next3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee9() {\n\t      var _this4 = this;\n\n\t      return regeneratorRuntime.wrap(function _callee9$(_context9) {\n\t        while (1) {\n\t          switch (_context9.prev = _context9.next) {\n\t            case 0:\n\t              // This sets this.lastRead to a new Promise right away, as opposed to\n\t              // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n\t              // would not work because this.nextRead would be updated only after the\n\t              // promise resolves.\n\t              this.lastRead = this.lastRead.then(function () {\n\t                return _this4.serialNext();\n\t              });\n\t              return _context9.abrupt(\"return\", this.lastRead);\n\n\t            case 2:\n\t            case \"end\":\n\t              return _context9.stop();\n\t          }\n\t        }\n\t      }, _callee9, this);\n\t    }));\n\n\t    function next() {\n\t      return _next3.apply(this, arguments);\n\t    }\n\n\t    return next;\n\t  }();\n\n\t  _proto4.serialNext = /*#__PURE__*/function () {\n\t    var _serialNext = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee10() {\n\t      return regeneratorRuntime.wrap(function _callee10$(_context10) {\n\t        while (1) {\n\t          switch (_context10.prev = _context10.next) {\n\t            case 0:\n\t              return _context10.abrupt(\"return\", this.upstream.next());\n\n\t            case 1:\n\t            case \"end\":\n\t              return _context10.stop();\n\t          }\n\t        }\n\t      }, _callee10, this);\n\t    }));\n\n\t    function serialNext() {\n\t      return _serialNext.apply(this, arguments);\n\t    }\n\n\t    return serialNext;\n\t  }();\n\n\t  return SerialIterator;\n\t}(LazyIterator);\n\n\tvar SkipIterator = /*#__PURE__*/function (_LazyIterator4) {\n\t  _inheritsLoose(SkipIterator, _LazyIterator4);\n\n\t  function SkipIterator(upstream, maxCount) {\n\t    var _this5;\n\n\t    _this5 = _LazyIterator4.call(this) || this;\n\t    _this5.upstream = upstream;\n\t    _this5.maxCount = maxCount; // Local state that should not be clobbered by out-of-order execution.\n\n\t    _this5.count = 0;\n\t    _this5.lastRead = Promise.resolve({\n\t      value: null,\n\t      done: false\n\t    });\n\t    return _this5;\n\t  }\n\n\t  var _proto5 = SkipIterator.prototype;\n\n\t  _proto5.summary = function summary() {\n\t    return this.upstream.summary() + \" -> Skip\";\n\t  };\n\n\t  _proto5.next = /*#__PURE__*/function () {\n\t    var _next4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee11() {\n\t      var _this6 = this;\n\n\t      return regeneratorRuntime.wrap(function _callee11$(_context11) {\n\t        while (1) {\n\t          switch (_context11.prev = _context11.next) {\n\t            case 0:\n\t              // This sets this.lastRead to a new Promise right away, as opposed to\n\t              // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n\t              // would not work because this.nextRead would be updated only after the\n\t              // promise resolves.\n\t              this.lastRead = this.lastRead.then(function () {\n\t                return _this6.serialNext();\n\t              });\n\t              return _context11.abrupt(\"return\", this.lastRead);\n\n\t            case 2:\n\t            case \"end\":\n\t              return _context11.stop();\n\t          }\n\t        }\n\t      }, _callee11, this);\n\t    }));\n\n\t    function next() {\n\t      return _next4.apply(this, arguments);\n\t    }\n\n\t    return next;\n\t  }();\n\n\t  _proto5.serialNext = /*#__PURE__*/function () {\n\t    var _serialNext2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee12() {\n\t      var skipped;\n\t      return regeneratorRuntime.wrap(function _callee12$(_context12) {\n\t        while (1) {\n\t          switch (_context12.prev = _context12.next) {\n\t            case 0:\n\t              if (!(this.count++ < this.maxCount)) {\n\t                _context12.next = 9;\n\t                break;\n\t              }\n\n\t              _context12.next = 3;\n\t              return this.upstream.next();\n\n\t            case 3:\n\t              skipped = _context12.sent;\n\n\t              if (!skipped.done) {\n\t                _context12.next = 6;\n\t                break;\n\t              }\n\n\t              return _context12.abrupt(\"return\", skipped);\n\n\t            case 6:\n\t              dispose(skipped.value);\n\t              _context12.next = 0;\n\t              break;\n\n\t            case 9:\n\t              return _context12.abrupt(\"return\", this.upstream.next());\n\n\t            case 10:\n\t            case \"end\":\n\t              return _context12.stop();\n\t          }\n\t        }\n\t      }, _callee12, this);\n\t    }));\n\n\t    function serialNext() {\n\t      return _serialNext2.apply(this, arguments);\n\t    }\n\n\t    return serialNext;\n\t  }();\n\n\t  return SkipIterator;\n\t}(LazyIterator);\n\n\tvar TakeIterator = /*#__PURE__*/function (_LazyIterator5) {\n\t  _inheritsLoose(TakeIterator, _LazyIterator5);\n\n\t  function TakeIterator(upstream, maxCount) {\n\t    var _this7;\n\n\t    _this7 = _LazyIterator5.call(this) || this;\n\t    _this7.upstream = upstream;\n\t    _this7.maxCount = maxCount;\n\t    _this7.count = 0;\n\t    return _this7;\n\t  }\n\n\t  var _proto6 = TakeIterator.prototype;\n\n\t  _proto6.summary = function summary() {\n\t    return this.upstream.summary() + \" -> Take\";\n\t  };\n\n\t  _proto6.next = /*#__PURE__*/function () {\n\t    var _next5 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee13() {\n\t      return regeneratorRuntime.wrap(function _callee13$(_context13) {\n\t        while (1) {\n\t          switch (_context13.prev = _context13.next) {\n\t            case 0:\n\t              if (!(this.count++ >= this.maxCount)) {\n\t                _context13.next = 2;\n\t                break;\n\t              }\n\n\t              return _context13.abrupt(\"return\", {\n\t                value: null,\n\t                done: true\n\t              });\n\n\t            case 2:\n\t              return _context13.abrupt(\"return\", this.upstream.next());\n\n\t            case 3:\n\t            case \"end\":\n\t              return _context13.stop();\n\t          }\n\t        }\n\t      }, _callee13, this);\n\t    }));\n\n\t    function next() {\n\t      return _next5.apply(this, arguments);\n\t    }\n\n\t    return next;\n\t  }();\n\n\t  return TakeIterator;\n\t}(LazyIterator); // Note this batch just groups items into row-wise element arrays.\n\t// Rotating these to a column-wise representation happens only at the dataset\n\t// level.\n\n\n\tvar RowMajorBatchIterator = /*#__PURE__*/function (_LazyIterator6) {\n\t  _inheritsLoose(RowMajorBatchIterator, _LazyIterator6);\n\n\t  function RowMajorBatchIterator(upstream, batchSize, enableSmallLastBatch) {\n\t    var _this8;\n\n\t    if (enableSmallLastBatch === void 0) {\n\t      enableSmallLastBatch = true;\n\t    }\n\n\t    _this8 = _LazyIterator6.call(this) || this;\n\t    _this8.upstream = upstream;\n\t    _this8.batchSize = batchSize;\n\t    _this8.enableSmallLastBatch = enableSmallLastBatch;\n\t    _this8.lastRead = Promise.resolve({\n\t      value: null,\n\t      done: false\n\t    });\n\t    return _this8;\n\t  }\n\n\t  var _proto7 = RowMajorBatchIterator.prototype;\n\n\t  _proto7.summary = function summary() {\n\t    return this.upstream.summary() + \" -> RowMajorBatch\";\n\t  };\n\n\t  _proto7.next = /*#__PURE__*/function () {\n\t    var _next6 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee14() {\n\t      var _this9 = this;\n\n\t      return regeneratorRuntime.wrap(function _callee14$(_context14) {\n\t        while (1) {\n\t          switch (_context14.prev = _context14.next) {\n\t            case 0:\n\t              // This sets this.lastRead to a new Promise right away, as opposed to\n\t              // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n\t              // would not work because this.nextRead would be updated only after the\n\t              // promise resolves.\n\t              this.lastRead = this.lastRead.then(function () {\n\t                return _this9.serialNext();\n\t              });\n\t              return _context14.abrupt(\"return\", this.lastRead);\n\n\t            case 2:\n\t            case \"end\":\n\t              return _context14.stop();\n\t          }\n\t        }\n\t      }, _callee14, this);\n\t    }));\n\n\t    function next() {\n\t      return _next6.apply(this, arguments);\n\t    }\n\n\t    return next;\n\t  }();\n\n\t  _proto7.serialNext = /*#__PURE__*/function () {\n\t    var _serialNext3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee15() {\n\t      var batch, item;\n\t      return regeneratorRuntime.wrap(function _callee15$(_context15) {\n\t        while (1) {\n\t          switch (_context15.prev = _context15.next) {\n\t            case 0:\n\t              batch = [];\n\n\t            case 1:\n\t              if (!(batch.length < this.batchSize)) {\n\t                _context15.next = 12;\n\t                break;\n\t              }\n\n\t              _context15.next = 4;\n\t              return this.upstream.next();\n\n\t            case 4:\n\t              item = _context15.sent;\n\n\t              if (!item.done) {\n\t                _context15.next = 9;\n\t                break;\n\t              }\n\n\t              if (!(this.enableSmallLastBatch && batch.length > 0)) {\n\t                _context15.next = 8;\n\t                break;\n\t              }\n\n\t              return _context15.abrupt(\"return\", {\n\t                value: batch,\n\t                done: false\n\t              });\n\n\t            case 8:\n\t              return _context15.abrupt(\"return\", {\n\t                value: null,\n\t                done: true\n\t              });\n\n\t            case 9:\n\t              batch.push(item.value);\n\t              _context15.next = 1;\n\t              break;\n\n\t            case 12:\n\t              return _context15.abrupt(\"return\", {\n\t                value: batch,\n\t                done: false\n\t              });\n\n\t            case 13:\n\t            case \"end\":\n\t              return _context15.stop();\n\t          }\n\t        }\n\t      }, _callee15, this);\n\t    }));\n\n\t    function serialNext() {\n\t      return _serialNext3.apply(this, arguments);\n\t    }\n\n\t    return serialNext;\n\t  }();\n\n\t  return RowMajorBatchIterator;\n\t}(LazyIterator);\n\n\tvar FilterIterator = /*#__PURE__*/function (_LazyIterator7) {\n\t  _inheritsLoose(FilterIterator, _LazyIterator7);\n\n\t  function FilterIterator(upstream, predicate) {\n\t    var _this10;\n\n\t    _this10 = _LazyIterator7.call(this) || this;\n\t    _this10.upstream = upstream;\n\t    _this10.predicate = predicate;\n\t    _this10.lastRead = Promise.resolve({\n\t      value: null,\n\t      done: false\n\t    });\n\t    return _this10;\n\t  }\n\n\t  var _proto8 = FilterIterator.prototype;\n\n\t  _proto8.summary = function summary() {\n\t    return this.upstream.summary() + \" -> Filter\";\n\t  };\n\n\t  _proto8.next = /*#__PURE__*/function () {\n\t    var _next7 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee16() {\n\t      var _this11 = this;\n\n\t      return regeneratorRuntime.wrap(function _callee16$(_context16) {\n\t        while (1) {\n\t          switch (_context16.prev = _context16.next) {\n\t            case 0:\n\t              // This sets this.lastRead to a new Promise right away, as opposed to\n\t              // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n\t              // would not work because this.nextRead would be updated only after the\n\t              // promise resolves.\n\t              this.lastRead = this.lastRead.then(function () {\n\t                return _this11.serialNext();\n\t              });\n\t              return _context16.abrupt(\"return\", this.lastRead);\n\n\t            case 2:\n\t            case \"end\":\n\t              return _context16.stop();\n\t          }\n\t        }\n\t      }, _callee16, this);\n\t    }));\n\n\t    function next() {\n\t      return _next7.apply(this, arguments);\n\t    }\n\n\t    return next;\n\t  }();\n\n\t  _proto8.serialNext = /*#__PURE__*/function () {\n\t    var _serialNext4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee17() {\n\t      var item;\n\t      return regeneratorRuntime.wrap(function _callee17$(_context17) {\n\t        while (1) {\n\t          switch (_context17.prev = _context17.next) {\n\t            case 0:\n\t              if (!true) {\n\t                _context17.next = 9;\n\t                break;\n\t              }\n\n\t              _context17.next = 3;\n\t              return this.upstream.next();\n\n\t            case 3:\n\t              item = _context17.sent;\n\n\t              if (!(item.done || this.predicate(item.value))) {\n\t                _context17.next = 6;\n\t                break;\n\t              }\n\n\t              return _context17.abrupt(\"return\", item);\n\n\t            case 6:\n\t              dispose(item.value);\n\t              _context17.next = 0;\n\t              break;\n\n\t            case 9:\n\t            case \"end\":\n\t              return _context17.stop();\n\t          }\n\t        }\n\t      }, _callee17, this);\n\t    }));\n\n\t    function serialNext() {\n\t      return _serialNext4.apply(this, arguments);\n\t    }\n\n\t    return serialNext;\n\t  }();\n\n\t  return FilterIterator;\n\t}(LazyIterator);\n\n\tvar MapIterator = /*#__PURE__*/function (_LazyIterator8) {\n\t  _inheritsLoose(MapIterator, _LazyIterator8);\n\n\t  function MapIterator(upstream, transform) {\n\t    var _this12;\n\n\t    _this12 = _LazyIterator8.call(this) || this;\n\t    _this12.upstream = upstream;\n\t    _this12.transform = transform;\n\t    return _this12;\n\t  }\n\n\t  var _proto9 = MapIterator.prototype;\n\n\t  _proto9.summary = function summary() {\n\t    return this.upstream.summary() + \" -> Map\";\n\t  };\n\n\t  _proto9.next = /*#__PURE__*/function () {\n\t    var _next8 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee18() {\n\t      var item, inputTensors, mapped, outputTensors, _iterator, _step, t;\n\n\t      return regeneratorRuntime.wrap(function _callee18$(_context18) {\n\t        while (1) {\n\t          switch (_context18.prev = _context18.next) {\n\t            case 0:\n\t              _context18.next = 2;\n\t              return this.upstream.next();\n\n\t            case 2:\n\t              item = _context18.sent;\n\n\t              if (!item.done) {\n\t                _context18.next = 5;\n\t                break;\n\t              }\n\n\t              return _context18.abrupt(\"return\", {\n\t                value: null,\n\t                done: true\n\t              });\n\n\t            case 5:\n\t              inputTensors = getTensorsInContainer(item.value); // Careful: the transform may mutate the item in place.\n\t              // That's why we have to remember the input Tensors above, and then\n\t              // below dispose only those that were not passed through to the output.\n\t              // Note too that the transform function is responsible for tidying\n\t              // any intermediate Tensors.  Here we are concerned only about the\n\t              // inputs.\n\n\t              mapped = this.transform(item.value);\n\t              outputTensors = getTensorsInContainer(mapped); // TODO(soergel) faster intersection\n\t              // TODO(soergel) move to tf.disposeExcept(in, out)?\n\n\t              for (_iterator = _createForOfIteratorHelperLoose(inputTensors); !(_step = _iterator()).done;) {\n\t                t = _step.value;\n\n\t                if (!isTensorInList(t, outputTensors)) {\n\t                  t.dispose();\n\t                }\n\t              }\n\n\t              return _context18.abrupt(\"return\", {\n\t                value: mapped,\n\t                done: false\n\t              });\n\n\t            case 10:\n\t            case \"end\":\n\t              return _context18.stop();\n\t          }\n\t        }\n\t      }, _callee18, this);\n\t    }));\n\n\t    function next() {\n\t      return _next8.apply(this, arguments);\n\t    }\n\n\t    return next;\n\t  }();\n\n\t  return MapIterator;\n\t}(LazyIterator);\n\n\tvar ErrorHandlingLazyIterator = /*#__PURE__*/function (_LazyIterator9) {\n\t  _inheritsLoose(ErrorHandlingLazyIterator, _LazyIterator9);\n\n\t  function ErrorHandlingLazyIterator(upstream, handler) {\n\t    var _this13;\n\n\t    _this13 = _LazyIterator9.call(this) || this;\n\t    _this13.upstream = upstream;\n\t    _this13.handler = handler;\n\t    _this13.count = 0;\n\t    _this13.lastRead = Promise.resolve({\n\t      value: null,\n\t      done: false\n\t    });\n\t    return _this13;\n\t  }\n\n\t  var _proto10 = ErrorHandlingLazyIterator.prototype;\n\n\t  _proto10.summary = function summary() {\n\t    return this.upstream.summary() + \" -> handleErrors\";\n\t  };\n\n\t  _proto10.next = /*#__PURE__*/function () {\n\t    var _next9 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee19() {\n\t      var _this14 = this;\n\n\t      return regeneratorRuntime.wrap(function _callee19$(_context19) {\n\t        while (1) {\n\t          switch (_context19.prev = _context19.next) {\n\t            case 0:\n\t              // This sets this.lastRead to a new Promise right away, as opposed to\n\t              // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n\t              // would not work because this.nextRead would be updated only after the\n\t              // promise resolves.\n\t              this.lastRead = this.lastRead.then(function () {\n\t                return _this14.serialNext();\n\t              });\n\t              return _context19.abrupt(\"return\", this.lastRead);\n\n\t            case 2:\n\t            case \"end\":\n\t              return _context19.stop();\n\t          }\n\t        }\n\t      }, _callee19, this);\n\t    }));\n\n\t    function next() {\n\t      return _next9.apply(this, arguments);\n\t    }\n\n\t    return next;\n\t  }();\n\n\t  _proto10.serialNext = /*#__PURE__*/function () {\n\t    var _serialNext5 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee20() {\n\t      return regeneratorRuntime.wrap(function _callee20$(_context20) {\n\t        while (1) {\n\t          switch (_context20.prev = _context20.next) {\n\t            case 0:\n\t              if (!true) {\n\t                _context20.next = 13;\n\t                break;\n\t              }\n\n\t              _context20.prev = 1;\n\t              _context20.next = 4;\n\t              return this.upstream.next();\n\n\t            case 4:\n\t              return _context20.abrupt(\"return\", _context20.sent);\n\n\t            case 7:\n\t              _context20.prev = 7;\n\t              _context20.t0 = _context20[\"catch\"](1);\n\n\t              if (this.handler(_context20.t0)) {\n\t                _context20.next = 11;\n\t                break;\n\t              }\n\n\t              return _context20.abrupt(\"return\", {\n\t                value: null,\n\t                done: true\n\t              });\n\n\t            case 11:\n\t              _context20.next = 0;\n\t              break;\n\n\t            case 13:\n\t            case \"end\":\n\t              return _context20.stop();\n\t          }\n\t        }\n\t      }, _callee20, this, [[1, 7]]);\n\t    }));\n\n\t    function serialNext() {\n\t      return _serialNext5.apply(this, arguments);\n\t    }\n\n\t    return serialNext;\n\t  }();\n\n\t  return ErrorHandlingLazyIterator;\n\t}(LazyIterator);\n\n\tvar AsyncMapIterator = /*#__PURE__*/function (_LazyIterator10) {\n\t  _inheritsLoose(AsyncMapIterator, _LazyIterator10);\n\n\t  function AsyncMapIterator(upstream, transform) {\n\t    var _this15;\n\n\t    _this15 = _LazyIterator10.call(this) || this;\n\t    _this15.upstream = upstream;\n\t    _this15.transform = transform;\n\t    return _this15;\n\t  }\n\n\t  var _proto11 = AsyncMapIterator.prototype;\n\n\t  _proto11.summary = function summary() {\n\t    return this.upstream.summary() + \" -> AsyncMap\";\n\t  };\n\n\t  _proto11.next = /*#__PURE__*/function () {\n\t    var _next10 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee21() {\n\t      var item, inputTensors, mapped, outputTensors, _iterator2, _step2, t;\n\n\t      return regeneratorRuntime.wrap(function _callee21$(_context21) {\n\t        while (1) {\n\t          switch (_context21.prev = _context21.next) {\n\t            case 0:\n\t              _context21.next = 2;\n\t              return this.upstream.next();\n\n\t            case 2:\n\t              item = _context21.sent;\n\n\t              if (!item.done) {\n\t                _context21.next = 5;\n\t                break;\n\t              }\n\n\t              return _context21.abrupt(\"return\", {\n\t                value: null,\n\t                done: true\n\t              });\n\n\t            case 5:\n\t              inputTensors = getTensorsInContainer(item.value); // Careful: the transform may mutate the item in place.\n\t              // That's why we have to remember the input Tensors above, and then\n\t              // below dispose only those that were not passed through to the output.\n\t              // Note too that the transform function is responsible for tidying\n\t              // any intermediate Tensors.  Here we are concerned only about the\n\t              // inputs.\n\n\t              _context21.next = 8;\n\t              return this.transform(item.value);\n\n\t            case 8:\n\t              mapped = _context21.sent;\n\t              outputTensors = getTensorsInContainer(mapped); // TODO(soergel) faster intersection\n\t              // TODO(soergel) move to tf.disposeExcept(in, out)?\n\n\t              for (_iterator2 = _createForOfIteratorHelperLoose(inputTensors); !(_step2 = _iterator2()).done;) {\n\t                t = _step2.value;\n\n\t                if (!isTensorInList(t, outputTensors)) {\n\t                  t.dispose();\n\t                }\n\t              }\n\n\t              return _context21.abrupt(\"return\", {\n\t                value: mapped,\n\t                done: false\n\t              });\n\n\t            case 12:\n\t            case \"end\":\n\t              return _context21.stop();\n\t          }\n\t        }\n\t      }, _callee21, this);\n\t    }));\n\n\t    function next() {\n\t      return _next10.apply(this, arguments);\n\t    }\n\n\t    return next;\n\t  }();\n\n\t  return AsyncMapIterator;\n\t}(LazyIterator); // Iterators that maintain a queue of pending items\n\t// ============================================================================\n\n\t/**\n\t * A base class for transforming streams that operate by maintaining an\n\t * output queue of elements that are ready to return via next().  This is\n\t * commonly required when the transformation is 1-to-many:  A call to next()\n\t * may trigger a call to the underlying stream, which will produce many\n\t * mapped elements of this stream-- of which we need to return only one, so\n\t * we have to queue the rest.\n\t */\n\n\n\tvar OneToManyIterator = /*#__PURE__*/function (_LazyIterator11) {\n\t  _inheritsLoose(OneToManyIterator, _LazyIterator11);\n\n\t  function OneToManyIterator() {\n\t    var _this16;\n\n\t    _this16 = _LazyIterator11.call(this) || this;\n\t    _this16.outputQueue = new GrowingRingBuffer();\n\t    _this16.lastRead = Promise.resolve({\n\t      value: null,\n\t      done: false\n\t    });\n\t    return _this16;\n\t  }\n\n\t  var _proto12 = OneToManyIterator.prototype;\n\n\t  _proto12.next = /*#__PURE__*/function () {\n\t    var _next11 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee22() {\n\t      var _this17 = this;\n\n\t      return regeneratorRuntime.wrap(function _callee22$(_context22) {\n\t        while (1) {\n\t          switch (_context22.prev = _context22.next) {\n\t            case 0:\n\t              // This sets this.lastRead to a new Promise right away, as opposed to\n\t              // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n\t              // would not work because this.nextRead would be updated only after the\n\t              // promise resolves.\n\t              this.lastRead = this.lastRead.then(function () {\n\t                return _this17.serialNext();\n\t              });\n\t              return _context22.abrupt(\"return\", this.lastRead);\n\n\t            case 2:\n\t            case \"end\":\n\t              return _context22.stop();\n\t          }\n\t        }\n\t      }, _callee22, this);\n\t    }));\n\n\t    function next() {\n\t      return _next11.apply(this, arguments);\n\t    }\n\n\t    return next;\n\t  }();\n\n\t  _proto12.serialNext = /*#__PURE__*/function () {\n\t    var _serialNext6 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee23() {\n\t      return regeneratorRuntime.wrap(function _callee23$(_context23) {\n\t        while (1) {\n\t          switch (_context23.prev = _context23.next) {\n\t            case 0:\n\t              if (!(this.outputQueue.length() === 0)) {\n\t                _context23.next = 7;\n\t                break;\n\t              }\n\n\t              _context23.next = 3;\n\t              return this.pump();\n\n\t            case 3:\n\t              if (_context23.sent) {\n\t                _context23.next = 5;\n\t                break;\n\t              }\n\n\t              return _context23.abrupt(\"return\", {\n\t                value: null,\n\t                done: true\n\t              });\n\n\t            case 5:\n\t              _context23.next = 0;\n\t              break;\n\n\t            case 7:\n\t              return _context23.abrupt(\"return\", {\n\t                value: this.outputQueue.shift(),\n\t                done: false\n\t              });\n\n\t            case 8:\n\t            case \"end\":\n\t              return _context23.stop();\n\t          }\n\t        }\n\t      }, _callee23, this);\n\t    }));\n\n\t    function serialNext() {\n\t      return _serialNext6.apply(this, arguments);\n\t    }\n\n\t    return serialNext;\n\t  }();\n\n\t  return OneToManyIterator;\n\t}(LazyIterator);\n\n\tvar FlatmapIterator = /*#__PURE__*/function (_OneToManyIterator) {\n\t  _inheritsLoose(FlatmapIterator, _OneToManyIterator);\n\n\t  function FlatmapIterator(upstream, transform) {\n\t    var _this18;\n\n\t    _this18 = _OneToManyIterator.call(this) || this;\n\t    _this18.upstream = upstream;\n\t    _this18.transform = transform;\n\t    return _this18;\n\t  }\n\n\t  var _proto13 = FlatmapIterator.prototype;\n\n\t  _proto13.summary = function summary() {\n\t    return this.upstream.summary() + \" -> Flatmap\";\n\t  };\n\n\t  _proto13.pump = /*#__PURE__*/function () {\n\t    var _pump = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee24() {\n\t      var item, inputTensors, mappedArray, outputTensors, _iterator3, _step3, t;\n\n\t      return regeneratorRuntime.wrap(function _callee24$(_context24) {\n\t        while (1) {\n\t          switch (_context24.prev = _context24.next) {\n\t            case 0:\n\t              _context24.next = 2;\n\t              return this.upstream.next();\n\n\t            case 2:\n\t              item = _context24.sent;\n\n\t              if (!item.done) {\n\t                _context24.next = 5;\n\t                break;\n\t              }\n\n\t              return _context24.abrupt(\"return\", false);\n\n\t            case 5:\n\t              inputTensors = getTensorsInContainer(item.value); // Careful: the transform may mutate the item in place.\n\t              // that's why we have to remember the input Tensors above, and then\n\t              // below dispose only those that were not passed through to the output.\n\t              // Note too that the transform function is responsible for tidying any\n\t              // intermediate Tensors.  Here we are concerned only about the inputs.\n\n\t              mappedArray = this.transform(item.value);\n\t              outputTensors = getTensorsInContainer(mappedArray);\n\t              this.outputQueue.pushAll(mappedArray); // TODO(soergel) faster intersection, and deduplicate outputTensors\n\t              // TODO(soergel) move to tf.disposeExcept(in, out)?\n\n\t              for (_iterator3 = _createForOfIteratorHelperLoose(inputTensors); !(_step3 = _iterator3()).done;) {\n\t                t = _step3.value;\n\n\t                if (!isTensorInList(t, outputTensors)) {\n\t                  t.dispose();\n\t                }\n\t              }\n\n\t              return _context24.abrupt(\"return\", true);\n\n\t            case 11:\n\t            case \"end\":\n\t              return _context24.stop();\n\t          }\n\t        }\n\t      }, _callee24, this);\n\t    }));\n\n\t    function pump() {\n\t      return _pump.apply(this, arguments);\n\t    }\n\n\t    return pump;\n\t  }();\n\n\t  return FlatmapIterator;\n\t}(OneToManyIterator);\n\t/**\n\t * Provides a `LazyIterator` that concatenates a stream of underlying\n\t * streams.\n\t *\n\t * Doing this in a concurrency-safe way requires some trickery.  In\n\t * particular, we want this stream to return the elements from the\n\t * underlying streams in the correct order according to when next() was\n\t * called, even if the resulting Promises resolve in a different order.\n\t */\n\n\n\tvar ChainedIterator = /*#__PURE__*/function (_LazyIterator12) {\n\t  _inheritsLoose(ChainedIterator, _LazyIterator12);\n\n\t  function ChainedIterator(iterators, baseErrorHandler) {\n\t    var _this19;\n\n\t    _this19 = _LazyIterator12.call(this) || this;\n\t    _this19.baseErrorHandler = baseErrorHandler; // Strict Promise execution order:\n\t    // a next() call may not even begin until the previous one completes.\n\n\t    _this19.lastRead = null; // Local state that should not be clobbered by out-of-order execution.\n\n\t    _this19.iterator = null;\n\t    _this19.moreIterators = iterators;\n\t    return _this19;\n\t  }\n\n\t  var _proto14 = ChainedIterator.prototype;\n\n\t  _proto14.summary = function summary() {\n\t    var upstreamSummaries = 'TODO: fill in upstream of chained summaries';\n\t    return upstreamSummaries + \" -> Chained\";\n\t  };\n\n\t  _proto14.next = /*#__PURE__*/function () {\n\t    var _next12 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee25() {\n\t      return regeneratorRuntime.wrap(function _callee25$(_context25) {\n\t        while (1) {\n\t          switch (_context25.prev = _context25.next) {\n\t            case 0:\n\t              this.lastRead = this.readFromChain(this.lastRead);\n\t              return _context25.abrupt(\"return\", this.lastRead);\n\n\t            case 2:\n\t            case \"end\":\n\t              return _context25.stop();\n\t          }\n\t        }\n\t      }, _callee25, this);\n\t    }));\n\n\t    function next() {\n\t      return _next12.apply(this, arguments);\n\t    }\n\n\t    return next;\n\t  }();\n\n\t  _proto14.readFromChain = /*#__PURE__*/function () {\n\t    var _readFromChain = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee26(lastRead) {\n\t      var iteratorResult, itemResult;\n\t      return regeneratorRuntime.wrap(function _callee26$(_context26) {\n\t        while (1) {\n\t          switch (_context26.prev = _context26.next) {\n\t            case 0:\n\t              _context26.next = 2;\n\t              return lastRead;\n\n\t            case 2:\n\t              if (!(this.iterator == null)) {\n\t                _context26.next = 10;\n\t                break;\n\t              }\n\n\t              _context26.next = 5;\n\t              return this.moreIterators.next();\n\n\t            case 5:\n\t              iteratorResult = _context26.sent;\n\n\t              if (!iteratorResult.done) {\n\t                _context26.next = 8;\n\t                break;\n\t              }\n\n\t              return _context26.abrupt(\"return\", {\n\t                value: null,\n\t                done: true\n\t              });\n\n\t            case 8:\n\t              this.iterator = iteratorResult.value;\n\n\t              if (this.baseErrorHandler != null) {\n\t                this.iterator = this.iterator.handleErrors(this.baseErrorHandler);\n\t              }\n\n\t            case 10:\n\t              _context26.next = 12;\n\t              return this.iterator.next();\n\n\t            case 12:\n\t              itemResult = _context26.sent;\n\n\t              if (!itemResult.done) {\n\t                _context26.next = 16;\n\t                break;\n\t              }\n\n\t              this.iterator = null;\n\t              return _context26.abrupt(\"return\", this.readFromChain(lastRead));\n\n\t            case 16:\n\t              return _context26.abrupt(\"return\", itemResult);\n\n\t            case 17:\n\t            case \"end\":\n\t              return _context26.stop();\n\t          }\n\t        }\n\t      }, _callee26, this);\n\t    }));\n\n\t    function readFromChain(_x4) {\n\t      return _readFromChain.apply(this, arguments);\n\t    }\n\n\t    return readFromChain;\n\t  }();\n\n\t  return ChainedIterator;\n\t}(LazyIterator);\n\tvar ZipMismatchMode;\n\n\t(function (ZipMismatchMode) {\n\t  ZipMismatchMode[ZipMismatchMode[\"FAIL\"] = 0] = \"FAIL\";\n\t  ZipMismatchMode[ZipMismatchMode[\"SHORTEST\"] = 1] = \"SHORTEST\";\n\t  ZipMismatchMode[ZipMismatchMode[\"LONGEST\"] = 2] = \"LONGEST\"; // use nulls for exhausted streams; use up the longest stream.\n\t})(ZipMismatchMode || (ZipMismatchMode = {}));\n\t/**\n\t * Provides a `LazyIterator` that zips together an array, dict, or nested\n\t * structure of `LazyIterator`s (and perhaps additional constants).\n\t *\n\t * The underlying streams must provide elements in a consistent order such\n\t * that they correspond.\n\t *\n\t * Typically, the underlying streams should have the same number of\n\t * elements. If they do not, the behavior is determined by the\n\t * `mismatchMode` argument.\n\t *\n\t * The nested structure of the `iterators` argument determines the\n\t * structure of elements in the resulting iterator.\n\t *\n\t * Doing this in a concurrency-safe way requires some trickery.  In\n\t * particular, we want this stream to return the elements from the\n\t * underlying streams in the correct order according to when next() was\n\t * called, even if the resulting Promises resolve in a different order.\n\t *\n\t * @param iterators: An array or object containing LazyIterators at the\n\t * leaves.\n\t * @param mismatchMode: Determines what to do when one underlying iterator\n\t * is exhausted before the others.  `ZipMismatchMode.FAIL` (the default)\n\t * causes an error to be thrown in this case.  `ZipMismatchMode.SHORTEST`\n\t * causes the zipped iterator to terminate with the furst underlying\n\t * streams, so elements remaining on the longer streams are ignored.\n\t * `ZipMismatchMode.LONGEST` causes the zipped stream to continue, filling\n\t * in nulls for the exhausted streams, until all streams are exhausted.\n\t */\n\n\n\tvar ZipIterator = /*#__PURE__*/function (_LazyIterator13) {\n\t  _inheritsLoose(ZipIterator, _LazyIterator13);\n\n\t  function ZipIterator(iterators, mismatchMode) {\n\t    var _this20;\n\n\t    if (mismatchMode === void 0) {\n\t      mismatchMode = ZipMismatchMode.FAIL;\n\t    }\n\n\t    _this20 = _LazyIterator13.call(this) || this;\n\t    _this20.iterators = iterators;\n\t    _this20.mismatchMode = mismatchMode;\n\t    _this20.count = 0;\n\t    _this20.currentPromise = null;\n\t    return _this20;\n\t  }\n\n\t  var _proto15 = ZipIterator.prototype;\n\n\t  _proto15.summary = function summary() {\n\t    var upstreamSummaries = 'TODO: fill in upstream of zip summaries';\n\t    return \"{\" + upstreamSummaries + \"} -> Zip\";\n\t  };\n\n\t  _proto15.nextState = /*#__PURE__*/function () {\n\t    var _nextState = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee27(afterState) {\n\t      var numIterators, iteratorsDone, getNext, mapped;\n\t      return regeneratorRuntime.wrap(function _callee27$(_context27) {\n\t        while (1) {\n\t          switch (_context27.prev = _context27.next) {\n\t            case 0:\n\t              getNext = function _getNext(container) {\n\t                if (container instanceof LazyIterator) {\n\t                  var result = container.next();\n\t                  return {\n\t                    value: result.then(function (x) {\n\t                      numIterators++;\n\n\t                      if (x.done) {\n\t                        iteratorsDone++;\n\t                      }\n\n\t                      return x.value;\n\t                    }),\n\t                    recurse: false\n\t                  };\n\t                } else {\n\t                  return {\n\t                    value: null,\n\t                    recurse: true\n\t                  };\n\t                }\n\t              };\n\n\t              _context27.next = 3;\n\t              return afterState;\n\n\t            case 3:\n\t              // Collect underlying iterator \"done\" signals as a side effect in\n\t              // getNext()\n\t              numIterators = 0;\n\t              iteratorsDone = 0;\n\t              _context27.next = 7;\n\t              return deepMapAndAwaitAll(this.iterators, getNext);\n\n\t            case 7:\n\t              mapped = _context27.sent;\n\n\t              if (!(numIterators === iteratorsDone)) {\n\t                _context27.next = 10;\n\t                break;\n\t              }\n\n\t              return _context27.abrupt(\"return\", {\n\t                value: null,\n\t                done: true\n\t              });\n\n\t            case 10:\n\t              if (!(iteratorsDone > 0)) {\n\t                _context27.next = 16;\n\t                break;\n\t              }\n\n\t              _context27.t0 = this.mismatchMode;\n\t              _context27.next = _context27.t0 === ZipMismatchMode.FAIL ? 14 : _context27.t0 === ZipMismatchMode.SHORTEST ? 15 : _context27.t0 === ZipMismatchMode.LONGEST ? 16 : 16;\n\t              break;\n\n\t            case 14:\n\t              throw new Error('Zipped streams should have the same length. ' + (\"Mismatched at element \" + this.count + \".\"));\n\n\t            case 15:\n\t              return _context27.abrupt(\"return\", {\n\t                value: null,\n\t                done: true\n\t              });\n\n\t            case 16:\n\t              this.count++;\n\t              return _context27.abrupt(\"return\", {\n\t                value: mapped,\n\t                done: false\n\t              });\n\n\t            case 18:\n\t            case \"end\":\n\t              return _context27.stop();\n\t          }\n\t        }\n\t      }, _callee27, this);\n\t    }));\n\n\t    function nextState(_x5) {\n\t      return _nextState.apply(this, arguments);\n\t    }\n\n\t    return nextState;\n\t  }();\n\n\t  _proto15.next = /*#__PURE__*/function () {\n\t    var _next13 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee28() {\n\t      return regeneratorRuntime.wrap(function _callee28$(_context28) {\n\t        while (1) {\n\t          switch (_context28.prev = _context28.next) {\n\t            case 0:\n\t              this.currentPromise = this.nextState(this.currentPromise);\n\t              return _context28.abrupt(\"return\", this.currentPromise);\n\n\t            case 2:\n\t            case \"end\":\n\t              return _context28.stop();\n\t          }\n\t        }\n\t      }, _callee28, this);\n\t    }));\n\n\t    function next() {\n\t      return _next13.apply(this, arguments);\n\t    }\n\n\t    return next;\n\t  }();\n\n\t  return ZipIterator;\n\t}(LazyIterator); // Iterators that maintain a ring buffer of pending promises\n\t// ============================================================================\n\n\t/**\n\t * A stream that prefetches a given number of items from an upstream source,\n\t * returning them in FIFO order.\n\t *\n\t * Note this prefetches Promises, but makes no guarantees about when those\n\t * Promises resolve.\n\t */\n\n\n\tvar PrefetchIterator = /*#__PURE__*/function (_LazyIterator14) {\n\t  _inheritsLoose(PrefetchIterator, _LazyIterator14);\n\n\t  function PrefetchIterator(upstream, bufferSize) {\n\t    var _this21;\n\n\t    _this21 = _LazyIterator14.call(this) || this;\n\t    _this21.upstream = upstream;\n\t    _this21.bufferSize = bufferSize;\n\t    _this21.buffer = new RingBuffer(bufferSize);\n\t    return _this21;\n\t  }\n\n\t  var _proto16 = PrefetchIterator.prototype;\n\n\t  _proto16.summary = function summary() {\n\t    return this.upstream.summary() + \" -> Prefetch\";\n\t  }\n\t  /**\n\t   * Refill the prefetch buffer.  Returns only after the buffer is full, or\n\t   * the upstream source is exhausted.\n\t   */\n\t  ;\n\n\t  _proto16.refill = function refill() {\n\t    while (!this.buffer.isFull()) {\n\t      var v = this.upstream.next();\n\t      this.buffer.push(v);\n\t    }\n\t  };\n\n\t  _proto16.next = function next() {\n\t    this.refill(); // This shift will never throw an error because the buffer is always\n\t    // full after a refill. If the stream is exhausted, the buffer will be\n\t    // full of Promises that will resolve to the end-of-stream signal.\n\n\t    return this.buffer.shift();\n\t  };\n\n\t  return PrefetchIterator;\n\t}(LazyIterator);\n\t/**\n\t * A stream that performs a sliding-window random shuffle on an upstream\n\t * source. This is like a `PrefetchIterator` except that the items are\n\t * returned in randomized order.  Mixing naturally improves as the buffer\n\t * size increases.\n\t */\n\n\tvar ShuffleIterator = /*#__PURE__*/function (_PrefetchIterator) {\n\t  _inheritsLoose(ShuffleIterator, _PrefetchIterator);\n\n\t  function ShuffleIterator(upstream, windowSize, seed) {\n\t    var _this22;\n\n\t    _this22 = _PrefetchIterator.call(this, upstream, windowSize) || this;\n\t    _this22.upstream = upstream;\n\t    _this22.windowSize = windowSize; // Local state that should not be clobbered by out-of-order execution.\n\n\t    _this22.upstreamExhausted = false;\n\t    _this22.random = seedrandom_1(seed || now().toString());\n\t    _this22.lastRead = Promise.resolve({\n\t      value: null,\n\t      done: false\n\t    });\n\t    return _this22;\n\t  }\n\n\t  var _proto17 = ShuffleIterator.prototype;\n\n\t  _proto17.next = /*#__PURE__*/function () {\n\t    var _next14 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee29() {\n\t      var _this23 = this;\n\n\t      return regeneratorRuntime.wrap(function _callee29$(_context29) {\n\t        while (1) {\n\t          switch (_context29.prev = _context29.next) {\n\t            case 0:\n\t              // This sets this.lastRead to a new Promise right away, as opposed to\n\t              // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n\t              // would not work because this.nextRead would be updated only after the\n\t              // promise resolves.\n\t              this.lastRead = this.lastRead.then(function () {\n\t                return _this23.serialNext();\n\t              });\n\t              return _context29.abrupt(\"return\", this.lastRead);\n\n\t            case 2:\n\t            case \"end\":\n\t              return _context29.stop();\n\t          }\n\t        }\n\t      }, _callee29, this);\n\t    }));\n\n\t    function next() {\n\t      return _next14.apply(this, arguments);\n\t    }\n\n\t    return next;\n\t  }();\n\n\t  _proto17.randomInt = function randomInt(max) {\n\t    return Math.floor(this.random() * max);\n\t  };\n\n\t  _proto17.chooseIndex = function chooseIndex() {\n\t    return this.randomInt(this.buffer.length());\n\t  };\n\n\t  _proto17.serialNext = /*#__PURE__*/function () {\n\t    var _serialNext7 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee30() {\n\t      var chosenIndex, result;\n\t      return regeneratorRuntime.wrap(function _callee30$(_context30) {\n\t        while (1) {\n\t          switch (_context30.prev = _context30.next) {\n\t            case 0:\n\t              // TODO(soergel): consider performance\n\t              if (!this.upstreamExhausted) {\n\t                this.refill();\n\t              }\n\n\t            case 1:\n\t              if (this.buffer.isEmpty()) {\n\t                _context30.next = 14;\n\t                break;\n\t              }\n\n\t              chosenIndex = this.chooseIndex();\n\t              _context30.next = 5;\n\t              return this.buffer.shuffleExcise(chosenIndex);\n\n\t            case 5:\n\t              result = _context30.sent;\n\n\t              if (!result.done) {\n\t                _context30.next = 10;\n\t                break;\n\t              }\n\n\t              this.upstreamExhausted = true;\n\t              _context30.next = 12;\n\t              break;\n\n\t            case 10:\n\t              this.refill();\n\t              return _context30.abrupt(\"return\", result);\n\n\t            case 12:\n\t              _context30.next = 1;\n\t              break;\n\n\t            case 14:\n\t              return _context30.abrupt(\"return\", {\n\t                value: null,\n\t                done: true\n\t              });\n\n\t            case 15:\n\t            case \"end\":\n\t              return _context30.stop();\n\t          }\n\t        }\n\t      }, _callee30, this);\n\t    }));\n\n\t    function serialNext() {\n\t      return _serialNext7.apply(this, arguments);\n\t    }\n\n\t    return serialNext;\n\t  }();\n\n\t  return ShuffleIterator;\n\t}(PrefetchIterator);\n\n\t/**\n\t * Represents a potentially large list of independent data elements (typically\n\t * 'samples' or 'examples').\n\t *\n\t * A 'data example' may be a primitive, an array, a map from string keys to\n\t * values, or any nested structure of these.\n\t *\n\t * A `Dataset` represents an ordered collection of elements, together with a\n\t * chain of transformations to be performed on those elements. Each\n\t * transformation is a method of `Dataset` that returns another `Dataset`, so\n\t * these may be chained, e.g.\n\t * `const processedDataset = rawDataset.filter(...).map(...).batch(...)`.\n\t *\n\t * Data loading and transformation is done in a lazy, streaming fashion.  The\n\t * dataset may be iterated over multiple times; each iteration starts the data\n\t * loading anew and recapitulates the transformations.\n\t *\n\t * A `Dataset` is typically processed as a stream of unbatched examples --i.e.,\n\t * its transformations are applied one example at a time. Batching produces a\n\t * new `Dataset` where each element is a batch. Batching should usually come\n\t * last in a pipeline, because data transformations are easier to express on a\n\t * per-example basis than on a per-batch basis.\n\t *\n\t * The following code examples are calling `await dataset.forEachAsync(...)` to\n\t * iterate once over the entire dataset in order to print out the data.\n\t *\n\t * @doc {heading: 'Data', subheading: 'Classes', namespace: 'data'}\n\t */\n\n\tvar Dataset = /*#__PURE__*/function () {\n\t  function Dataset() {\n\t    this.size = null;\n\t  } // TODO(soergel): Make Datasets report whether repeated iterator() calls\n\t  // produce the same result (e.g., reading from a file) or different results\n\t  // (e.g., from the webcam).  Currently we don't make this distinction but it\n\t  // could be important for the user to know.\n\t  // abstract isDeterministic(): boolean;\n\n\t  /**\n\t   * Groups elements into batches.\n\t   *\n\t   * It is assumed that each of the incoming dataset elements has the same\n\t   * structure-- i.e. the same set of keys at each location in an object\n\t   * hierarchy.  For each key, the resulting `Dataset` provides a batched\n\t   * element collecting all of the incoming values for that key.\n\t   *\n\t   *  * Incoming primitives are grouped into a 1-D Tensor.\n\t   *  * Incoming Tensors are grouped into a new Tensor where the 0'th axis is\n\t   *    the batch dimension.\n\t   *  * Incoming arrays are converted to Tensor and then batched.\n\t   *  * A nested array is interpreted as an n-D Tensor, so the batched result\n\t   *    has n+1 dimensions.\n\t   *  * An array that cannot be converted to Tensor produces an error.\n\t   *\n\t   * If an array should not be batched as a unit, it should first be converted\n\t   * to an object with integer keys.\n\t   *\n\t   * Here are a few examples:\n\t   *\n\t   * Batch a dataset of numbers:\n\t   * ```js\n\t   * const a = tf.data.array([1, 2, 3, 4, 5, 6, 7, 8]).batch(4);\n\t   * await a.forEachAsync(e => e.print());\n\t   * ```\n\t   *\n\t   * Batch a dataset of arrays:\n\t   * ```js\n\t   * const b = tf.data.array([[1], [2], [3], [4], [5], [6], [7], [8]]).batch(4);\n\t   * await b.forEachAsync(e => e.print());\n\t   * ```\n\t   *\n\t   * Batch a dataset of objects:\n\t   * ```js\n\t   * const c = tf.data.array([{a: 1, b: 11}, {a: 2, b: 12}, {a: 3, b: 13},\n\t   *   {a: 4, b: 14}, {a: 5, b: 15}, {a: 6, b: 16}, {a: 7, b: 17},\n\t   *   {a: 8, b: 18}]).batch(4);\n\t   * await c.forEachAsync(e => {\n\t   *   console.log('{');\n\t   *   for(var key in e) {\n\t   *     console.log(key+':');\n\t   *     e[key].print();\n\t   *   }\n\t   *   console.log('}');\n\t   * })\n\t   * ```\n\t   *\n\t   * @param batchSize The number of elements desired per batch.\n\t   * @param smallLastBatch Whether to emit the final batch when it has fewer\n\t   *   than batchSize elements. Default true.\n\t   * @returns A `Dataset`, from which a stream of batches can be obtained.\n\t   *\n\t   * @doc {heading: 'Data', subheading: 'Classes'}\n\t   */\n\n\n\t  var _proto = Dataset.prototype;\n\n\t  _proto.batch = function batch(batchSize, smallLastBatch) {\n\t    if (smallLastBatch === void 0) {\n\t      smallLastBatch = true;\n\t    }\n\n\t    var base = this;\n\t    assert(batchSize > 0, function () {\n\t      return \"batchSize needs to be positive, but it is\\n      \" + batchSize;\n\t    });\n\t    var size;\n\n\t    if (this.size === Infinity || this.size == null) {\n\t      // If the size of this dataset is infinity or null, the new size keeps the\n\t      // same.\n\t      size = this.size;\n\t    } else if (smallLastBatch) {\n\t      // If the size of this dataset is known and include small last batch, the\n\t      // new size is full batch count plus last batch.\n\t      size = Math.ceil(this.size / batchSize);\n\t    } else {\n\t      // If the size of this dataset is known and not include small last batch,\n\t      // the new size is full batch count.\n\t      size = Math.floor(this.size / batchSize);\n\t    }\n\n\t    return datasetFromIteratorFn( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              _context.next = 2;\n\t              return base.iterator();\n\n\t            case 2:\n\t              return _context.abrupt(\"return\", _context.sent.columnMajorBatch(batchSize, smallLastBatch, deepBatchConcat));\n\n\t            case 3:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee);\n\t    })), size);\n\t  }\n\t  /**\n\t   * Concatenates this `Dataset` with another.\n\t   *\n\t   * ```js\n\t   * const a = tf.data.array([1, 2, 3]);\n\t   * const b = tf.data.array([4, 5, 6]);\n\t   * const c = a.concatenate(b);\n\t   * await c.forEachAsync(e => console.log(e));\n\t   * ```\n\t   *\n\t   * @param dataset A `Dataset` to be concatenated onto this one.\n\t   * @returns A `Dataset`.\n\t   *\n\t   * @doc {heading: 'Data', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.concatenate = function concatenate(dataset) {\n\t    var base = this;\n\t    var size;\n\n\t    if (this.size === Infinity || dataset.size === Infinity) {\n\t      // If the size of any of these two dataset is infinity, new size is\n\t      // infinity.\n\t      size = Infinity;\n\t    } else if (this.size != null && dataset.size != null) {\n\t      // If the size of both datasets are known and not infinity, new size is\n\t      // sum the size of these two datasets.\n\t      size = this.size + dataset.size;\n\t    } else {\n\t      // If neither of these two datasets has infinite size and any of these two\n\t      // datasets' size is null, the new size is null.\n\t      size = null;\n\t    }\n\n\t    return datasetFromIteratorFn( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              _context2.next = 2;\n\t              return base.iterator();\n\n\t            case 2:\n\t              _context2.t0 = _context2.sent;\n\t              _context2.next = 5;\n\t              return dataset.iterator();\n\n\t            case 5:\n\t              _context2.t1 = _context2.sent;\n\t              return _context2.abrupt(\"return\", _context2.t0.concatenate.call(_context2.t0, _context2.t1));\n\n\t            case 7:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2);\n\t    })), size);\n\t  }\n\t  /**\n\t   * Filters this dataset according to `predicate`.\n\t   *\n\t   * ```js\n\t   * const a = tf.data.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])\n\t   *   .filter(x => x%2 === 0);\n\t   * await a.forEachAsync(e => console.log(e));\n\t   * ```\n\t   *\n\t   * @param predicate A function mapping a dataset element to a boolean or a\n\t   * `Promise` for one.\n\t   *\n\t   * @returns A `Dataset` of elements for which the predicate was true.\n\t   *\n\t   * @doc {heading: 'Data', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.filter = function filter(predicate) {\n\t    var base = this;\n\t    var size;\n\n\t    if (this.size === Infinity) {\n\t      // If the size of this dataset is infinity, new size is infinity\n\t      size = Infinity;\n\t    } else {\n\t      // If this dataset has limited elements, new size is null because it might\n\t      // exhausted randomly.\n\t      size = null;\n\t    }\n\n\t    return datasetFromIteratorFn( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n\t      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t        while (1) {\n\t          switch (_context3.prev = _context3.next) {\n\t            case 0:\n\t              _context3.next = 2;\n\t              return base.iterator();\n\n\t            case 2:\n\t              return _context3.abrupt(\"return\", _context3.sent.filter(function (x) {\n\t                return tidy(function () {\n\t                  return predicate(x);\n\t                });\n\t              }));\n\n\t            case 3:\n\t            case \"end\":\n\t              return _context3.stop();\n\t          }\n\t        }\n\t      }, _callee3);\n\t    })), size);\n\t  }\n\t  /**\n\t   * Apply a function to every element of the dataset.\n\t   *\n\t   * After the function is applied to a dataset element, any Tensors contained\n\t   * within that element are disposed.\n\t   *\n\t   * ```js\n\t   * const a = tf.data.array([1, 2, 3]);\n\t   * await a.forEachAsync(e => console.log(e));\n\t   * ```\n\t   *\n\t   * @param f A function to apply to each dataset element.\n\t   * @returns A `Promise` that resolves after all elements have been processed.\n\t   *\n\t   * @doc {heading: 'Data', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.forEachAsync =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _forEachAsync = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(f) {\n\t      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n\t        while (1) {\n\t          switch (_context4.prev = _context4.next) {\n\t            case 0:\n\t              _context4.next = 2;\n\t              return this.iterator();\n\n\t            case 2:\n\t              return _context4.abrupt(\"return\", _context4.sent.forEachAsync(f));\n\n\t            case 3:\n\t            case \"end\":\n\t              return _context4.stop();\n\t          }\n\t        }\n\t      }, _callee4, this);\n\t    }));\n\n\t    function forEachAsync(_x) {\n\t      return _forEachAsync.apply(this, arguments);\n\t    }\n\n\t    return forEachAsync;\n\t  }()\n\t  /**\n\t   * Maps this dataset through a 1-to-1 transform.\n\t   *\n\t   * ```js\n\t   * const a = tf.data.array([1, 2, 3]).map(x => x*x);\n\t   * await a.forEachAsync(e => console.log(e));\n\t   * ```\n\t   *\n\t   * @param transform A function mapping a dataset element to a transformed\n\t   *   dataset element.\n\t   *\n\t   * @returns A `Dataset` of transformed elements.\n\t   *\n\t   * @doc {heading: 'Data', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.map = function map(transform) {\n\t    var base = this;\n\t    return datasetFromIteratorFn( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {\n\t      return regeneratorRuntime.wrap(function _callee5$(_context5) {\n\t        while (1) {\n\t          switch (_context5.prev = _context5.next) {\n\t            case 0:\n\t              _context5.next = 2;\n\t              return base.iterator();\n\n\t            case 2:\n\t              return _context5.abrupt(\"return\", _context5.sent.map(function (x) {\n\t                return tidy(function () {\n\t                  return transform(x);\n\t                });\n\t              }));\n\n\t            case 3:\n\t            case \"end\":\n\t              return _context5.stop();\n\t          }\n\t        }\n\t      }, _callee5);\n\t    })), this.size);\n\t  }\n\t  /**\n\t   * Maps this dataset through an async 1-to-1 transform.\n\t   *\n\t   * ```js\n\t   * const a =\n\t   *  tf.data.array([1, 2, 3]).mapAsync(x => new Promise(function(resolve){\n\t   *    setTimeout(() => {\n\t   *      resolve(x * x);\n\t   *    }, Math.random()*1000 + 500);\n\t   *  }));\n\t   * console.log(await a.toArray());\n\t   * ```\n\t   *\n\t   * @param transform A function mapping a dataset element to a `Promise` for a\n\t   *   transformed dataset element.  This transform is responsible for disposing\n\t   *   any intermediate `Tensor`s, i.e. by wrapping its computation in\n\t   *   `tf.tidy()`; that cannot be automated here (as it is in the synchronous\n\t   *   `map()` case).\n\t   *\n\t   * @returns A `Dataset` of transformed elements.\n\t   *\n\t   * @doc {heading: 'Data', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.mapAsync = function mapAsync(transform) {\n\t    var base = this;\n\t    return datasetFromIteratorFn( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6() {\n\t      return regeneratorRuntime.wrap(function _callee6$(_context6) {\n\t        while (1) {\n\t          switch (_context6.prev = _context6.next) {\n\t            case 0:\n\t              _context6.next = 2;\n\t              return base.iterator();\n\n\t            case 2:\n\t              return _context6.abrupt(\"return\", _context6.sent.mapAsync(transform));\n\n\t            case 3:\n\t            case \"end\":\n\t              return _context6.stop();\n\t          }\n\t        }\n\t      }, _callee6);\n\t    })), this.size);\n\t  }\n\t  /**\n\t   *  Creates a `Dataset` that prefetches elements from this dataset.\n\t   *\n\t   * @param bufferSize: An integer specifying the number of elements to be\n\t   *   prefetched.\n\t   * @returns A `Dataset`.\n\t   *\n\t   * @doc {heading: 'Data', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.prefetch = function prefetch(bufferSize) {\n\t    if (bufferSize == null) {\n\t      throw new RangeError('`Dataset.prefetch()` requires bufferSize to be specified.');\n\t    }\n\n\t    var base = this;\n\t    return datasetFromIteratorFn( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee7() {\n\t      return regeneratorRuntime.wrap(function _callee7$(_context7) {\n\t        while (1) {\n\t          switch (_context7.prev = _context7.next) {\n\t            case 0:\n\t              _context7.next = 2;\n\t              return base.iterator();\n\n\t            case 2:\n\t              return _context7.abrupt(\"return\", _context7.sent.prefetch(bufferSize));\n\n\t            case 3:\n\t            case \"end\":\n\t              return _context7.stop();\n\t          }\n\t        }\n\t      }, _callee7);\n\t    })), this.size);\n\t  }\n\t  /**\n\t   * Repeats this dataset `count` times.\n\t   *\n\t   * NOTE: If this dataset is a function of global state (e.g. a random number\n\t   * generator), then different repetitions may produce different elements.\n\t   *\n\t   * ```js\n\t   * const a = tf.data.array([1, 2, 3]).repeat(3);\n\t   * await a.forEachAsync(e => console.log(e));\n\t   * ```\n\t   *\n\t   * @param count: (Optional) An integer, representing the number of times\n\t   *   the dataset should be repeated. The default behavior (if `count` is\n\t   *   `undefined` or negative) is for the dataset be repeated indefinitely.\n\t   * @returns A `Dataset`.\n\t   *\n\t   * @doc {heading: 'Data', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.repeat = function repeat(count) {\n\t    var base = this;\n\t    var size;\n\n\t    if (this.size != null && count > 0) {\n\t      // If this dataset has size and count is positive, new size is current\n\t      // size multiply count. This also covers the case that current size is\n\t      // infinity.\n\t      size = this.size * count;\n\t    } else if (count === 0) {\n\t      // If count is 0, new size is 0.\n\t      size = 0;\n\t    } else if (this.size != null && (count === undefined || count < 0)) {\n\t      // If this dataset has size and count is undefined or negative, the\n\t      // dataset will be repeated indefinitely and new size is infinity.\n\t      size = Infinity;\n\t    } else {\n\t      // If the size of this dataset is null, the new dataset's size is null.\n\t      size = null;\n\t    }\n\n\t    return datasetFromIteratorFn( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee9() {\n\t      var iteratorIterator;\n\t      return regeneratorRuntime.wrap(function _callee9$(_context9) {\n\t        while (1) {\n\t          switch (_context9.prev = _context9.next) {\n\t            case 0:\n\t              iteratorIterator = iteratorFromFunction( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee8() {\n\t                return regeneratorRuntime.wrap(function _callee8$(_context8) {\n\t                  while (1) {\n\t                    switch (_context8.prev = _context8.next) {\n\t                      case 0:\n\t                        _context8.next = 2;\n\t                        return base.iterator();\n\n\t                      case 2:\n\t                        _context8.t0 = _context8.sent;\n\t                        return _context8.abrupt(\"return\", {\n\t                          value: _context8.t0,\n\t                          done: false\n\t                        });\n\n\t                      case 4:\n\t                      case \"end\":\n\t                        return _context8.stop();\n\t                    }\n\t                  }\n\t                }, _callee8);\n\t              })));\n\t              return _context9.abrupt(\"return\", iteratorFromConcatenated(iteratorIterator.take(count)));\n\n\t            case 2:\n\t            case \"end\":\n\t              return _context9.stop();\n\t          }\n\t        }\n\t      }, _callee9);\n\t    })), size);\n\t  }\n\t  /**\n\t   * Creates a `Dataset` that skips `count` initial elements from this dataset.\n\t   *\n\t   * ```js\n\t   * const a = tf.data.array([1, 2, 3, 4, 5, 6]).skip(3);\n\t   * await a.forEachAsync(e => console.log(e));\n\t   * ```\n\t   *\n\t   * @param count: The number of elements of this dataset that should be skipped\n\t   *   to form the new dataset.  If `count` is greater than the size of this\n\t   *   dataset, the new dataset will contain no elements.  If `count`\n\t   *   is `undefined` or negative, skips the entire dataset.\n\t   *\n\t   * @returns A `Dataset`.\n\t   *\n\t   * @doc {heading: 'Data', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.skip = function skip(count) {\n\t    var base = this;\n\t    var size;\n\n\t    if (this.size != null && count >= 0 && this.size >= count) {\n\t      // If the size of this dataset is greater than count, the new dataset's\n\t      // size is current size minus skipped size.This also covers the case that\n\t      // current size is infinity.\n\t      size = this.size - count;\n\t    } else if (this.size != null && (this.size < count || count === undefined || count < 0)) {\n\t      // If the size of this dataset is smaller than count, or count is\n\t      // undefined or negative, skips the entire dataset and the new size is 0.\n\t      size = 0;\n\t    } else {\n\t      // If the size of this dataset is null, the new dataset's size is null.\n\t      size = null;\n\t    }\n\n\t    return datasetFromIteratorFn( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee10() {\n\t      return regeneratorRuntime.wrap(function _callee10$(_context10) {\n\t        while (1) {\n\t          switch (_context10.prev = _context10.next) {\n\t            case 0:\n\t              _context10.next = 2;\n\t              return base.iterator();\n\n\t            case 2:\n\t              return _context10.abrupt(\"return\", _context10.sent.skip(count));\n\n\t            case 3:\n\t            case \"end\":\n\t              return _context10.stop();\n\t          }\n\t        }\n\t      }, _callee10);\n\t    })), size);\n\t  }\n\t  /**\n\t   * Pseudorandomly shuffles the elements of this dataset. This is done in a\n\t   * streaming manner, by sampling from a given number of prefetched elements.\n\t   *\n\t   * ```js\n\t   * const a = tf.data.array([1, 2, 3, 4, 5, 6]).shuffle(3);\n\t   * await a.forEachAsync(e => console.log(e));\n\t   * ```\n\t   *\n\t   * @param bufferSize: An integer specifying the number of elements from this\n\t   *   dataset from which the new dataset will sample.\n\t   * @param seed: (Optional) An integer specifying the random seed that will\n\t   *   be used to create the distribution.\n\t   * @param reshuffleEachIteration: (Optional) A boolean, which if true\n\t   *   indicates that the dataset should be pseudorandomly reshuffled each time\n\t   *   it is iterated over. If false, elements will be returned in the same\n\t   *   shuffled order on each iteration. (Defaults to `true`.)\n\t   * @returns A `Dataset`.\n\t   *\n\t   * @doc {heading: 'Data', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.shuffle = function shuffle(bufferSize, seed, reshuffleEachIteration) {\n\t    if (reshuffleEachIteration === void 0) {\n\t      reshuffleEachIteration = true;\n\t    }\n\n\t    if (bufferSize == null || bufferSize < 0) {\n\t      if (this.size == null) {\n\t        throw new RangeError('`Dataset.shuffle()` requires bufferSize to be specified.');\n\t      } else {\n\t        throw new RangeError('`Dataset.shuffle()` requires bufferSize to be specified.  ' + 'If your data fits in main memory (for regular JS objects), ' + 'and/or GPU memory (for `tf.Tensor`s), consider setting ' + (\"bufferSize to the dataset size (\" + this.size + \" elements)\"));\n\t      }\n\t    }\n\n\t    var base = this;\n\t    var random = seedrandom_1(seed || now().toString());\n\t    return datasetFromIteratorFn( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee11() {\n\t      var seed2;\n\t      return regeneratorRuntime.wrap(function _callee11$(_context11) {\n\t        while (1) {\n\t          switch (_context11.prev = _context11.next) {\n\t            case 0:\n\t              seed2 = random.int32();\n\n\t              if (reshuffleEachIteration) {\n\t                seed2 += random.int32();\n\t              }\n\n\t              _context11.next = 4;\n\t              return base.iterator();\n\n\t            case 4:\n\t              return _context11.abrupt(\"return\", _context11.sent.shuffle(bufferSize, seed2.toString()));\n\n\t            case 5:\n\t            case \"end\":\n\t              return _context11.stop();\n\t          }\n\t        }\n\t      }, _callee11);\n\t    })), this.size);\n\t  }\n\t  /**\n\t   * Creates a `Dataset` with at most `count` initial elements from this\n\t   * dataset.\n\t   *\n\t   * ```js\n\t   * const a = tf.data.array([1, 2, 3, 4, 5, 6]).take(3);\n\t   * await a.forEachAsync(e => console.log(e));\n\t   * ```\n\t   *\n\t   * @param count: The number of elements of this dataset that should be taken\n\t   *   to form the new dataset.  If `count` is `undefined` or negative, or if\n\t   *   `count` is greater than the size of this dataset, the new dataset will\n\t   *   contain all elements of this dataset.\n\t   * @returns A `Dataset`.\n\t   *\n\t   * @doc {heading: 'Data', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.take = function take(count) {\n\t    var base = this;\n\t    var size;\n\n\t    if (this.size != null && this.size > count) {\n\t      // If the size of this dataset is greater than count, the new dataset's\n\t      // size is count.\n\t      size = count;\n\t    } else if (this.size != null && this.size <= count) {\n\t      // If the size of this dataset is equal or smaller than count, the new\n\t      // dataset's size is the size of this dataset.\n\t      size = this.size;\n\t    } else {\n\t      // If the size of this dataset is null, the new dataset's size is null.\n\t      size = null;\n\t    }\n\n\t    return datasetFromIteratorFn( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee12() {\n\t      return regeneratorRuntime.wrap(function _callee12$(_context12) {\n\t        while (1) {\n\t          switch (_context12.prev = _context12.next) {\n\t            case 0:\n\t              _context12.next = 2;\n\t              return base.iterator();\n\n\t            case 2:\n\t              return _context12.abrupt(\"return\", _context12.sent.take(count));\n\n\t            case 3:\n\t            case \"end\":\n\t              return _context12.stop();\n\t          }\n\t        }\n\t      }, _callee12);\n\t    })), size);\n\t  }\n\t  /**\n\t   * Collect all elements of this dataset into an array.\n\t   *\n\t   * Obviously this will succeed only for small datasets that fit in memory.\n\t   * Useful for testing and generally should be avoided if possible.\n\t   *\n\t   * ```js\n\t   * const a = tf.data.array([1, 2, 3, 4, 5, 6]);\n\t   * console.log(await a.toArray());\n\t   * ```\n\t   *\n\t   * @returns A Promise for an array of elements, which will resolve\n\t   *   when a new stream has been obtained and fully consumed.\n\t   *\n\t   * @doc {heading: 'Data', subheading: 'Classes'}\n\t   */\n\t  ;\n\n\t  _proto.toArray =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _toArray = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee13() {\n\t      return regeneratorRuntime.wrap(function _callee13$(_context13) {\n\t        while (1) {\n\t          switch (_context13.prev = _context13.next) {\n\t            case 0:\n\t              if (!(this.size === Infinity)) {\n\t                _context13.next = 2;\n\t                break;\n\t              }\n\n\t              throw new Error('Can not convert infinite data stream to array.');\n\n\t            case 2:\n\t              _context13.next = 4;\n\t              return this.iterator();\n\n\t            case 4:\n\t              return _context13.abrupt(\"return\", _context13.sent.toArray());\n\n\t            case 5:\n\t            case \"end\":\n\t              return _context13.stop();\n\t          }\n\t        }\n\t      }, _callee13, this);\n\t    }));\n\n\t    function toArray() {\n\t      return _toArray.apply(this, arguments);\n\t    }\n\n\t    return toArray;\n\t  }()\n\t  /**\n\t   * Collect all elements of this dataset into an array with prefetching 100\n\t   * elements. This is useful for testing, because the prefetch changes the\n\t   * order in which the Promises are resolved along the processing pipeline.\n\t   * This may help expose bugs where results are dependent on the order of\n\t   * Promise resolution rather than on the logical order of the stream (i.e.,\n\t   * due to hidden mutable state).\n\t   *\n\t   * @returns A Promise for an array of elements, which will resolve\n\t   *   when a new stream has been obtained and fully consumed.\n\t   */\n\t  ;\n\n\t  _proto.toArrayForTest =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _toArrayForTest = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee14() {\n\t      return regeneratorRuntime.wrap(function _callee14$(_context14) {\n\t        while (1) {\n\t          switch (_context14.prev = _context14.next) {\n\t            case 0:\n\t              if (!(this.size === Infinity)) {\n\t                _context14.next = 2;\n\t                break;\n\t              }\n\n\t              throw new Error('Can not convert infinite data stream to array.');\n\n\t            case 2:\n\t              _context14.next = 4;\n\t              return this.iterator();\n\n\t            case 4:\n\t              return _context14.abrupt(\"return\", _context14.sent.toArrayForTest());\n\n\t            case 5:\n\t            case \"end\":\n\t              return _context14.stop();\n\t          }\n\t        }\n\t      }, _callee14, this);\n\t    }));\n\n\t    function toArrayForTest() {\n\t      return _toArrayForTest.apply(this, arguments);\n\t    }\n\n\t    return toArrayForTest;\n\t  }();\n\n\t  return Dataset;\n\t}(); // TODO(soergel): deep sharded shuffle, where supported\n\n\tDataset.MAX_BUFFER_SIZE = 10000;\n\t/**\n\t * Create a `Dataset` defined by a provided iterator() function.\n\t *\n\t * ```js\n\t * let i = -1;\n\t * const func = () =>\n\t *    ++i < 5 ? {value: i, done: false} : {value: null, done: true};\n\t * const iter = tf.data.iteratorFromFunction(func);\n\t * const ds = tf.data.datasetFromIteratorFn(iter);\n\t * await ds.forEachAsync(e => console.log(e));\n\t * ```\n\t */\n\n\tfunction datasetFromIteratorFn(iteratorFn, size) {\n\t  if (size === void 0) {\n\t    size = null;\n\t  }\n\n\t  return new ( /*#__PURE__*/function (_Dataset) {\n\t    _inheritsLoose(_class, _Dataset);\n\n\t    function _class() {\n\t      var _this;\n\n\t      _this = _Dataset.apply(this, arguments) || this;\n\t      _this.size = size;\n\t      return _this;\n\t    }\n\t    /*\n\t     * Provide a new stream of elements.  Note this will also start new streams\n\t     * from any underlying `Dataset`s.\n\t     */\n\n\n\t    var _proto2 = _class.prototype;\n\n\t    _proto2.iterator =\n\t    /*#__PURE__*/\n\t    function () {\n\t      var _iterator = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee15() {\n\t        return regeneratorRuntime.wrap(function _callee15$(_context15) {\n\t          while (1) {\n\t            switch (_context15.prev = _context15.next) {\n\t              case 0:\n\t                return _context15.abrupt(\"return\", iteratorFn());\n\n\t              case 1:\n\t              case \"end\":\n\t                return _context15.stop();\n\t            }\n\t          }\n\t        }, _callee15);\n\t      }));\n\n\t      function iterator() {\n\t        return _iterator.apply(this, arguments);\n\t      }\n\n\t      return iterator;\n\t    }();\n\n\t    return _class;\n\t  }(Dataset))();\n\t}\n\t/**\n\t * Create a `Dataset` from an array of elements.\n\t *\n\t * Create a Dataset from an array of objects:\n\t * ```js\n\t * const a = tf.data.array([{'item': 1}, {'item': 2}, {'item': 3}]);\n\t * await a.forEachAsync(e => console.log(e));\n\t * ```\n\t *\n\t * Create a Dataset from an array of numbers:\n\t * ```js\n\t * const a = tf.data.array([4, 5, 6]);\n\t * await a.forEachAsync(e => console.log(e));\n\t * ```\n\t * @param items An array of elements that will be parsed as items in a dataset.\n\t *\n\t * @doc {heading: 'Data', subheading: 'Creation', namespace: 'data'}\n\t */\n\n\tfunction array(items) {\n\t  return datasetFromIteratorFn( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee16() {\n\t    return regeneratorRuntime.wrap(function _callee16$(_context16) {\n\t      while (1) {\n\t        switch (_context16.prev = _context16.next) {\n\t          case 0:\n\t            return _context16.abrupt(\"return\", iteratorFromItems(items));\n\n\t          case 1:\n\t          case \"end\":\n\t            return _context16.stop();\n\t        }\n\t      }\n\t    }, _callee16);\n\t  })), items.length);\n\t}\n\t/**\n\t * Create a `Dataset` by zipping together an array, dict, or nested\n\t * structure of `Dataset`s (and perhaps additional constants).\n\t * The underlying datasets must provide elements in a consistent order such that\n\t * they correspond.\n\t *\n\t * The number of elements in the resulting dataset is the same as the size of\n\t * the smallest dataset in datasets.\n\t *\n\t * The nested structure of the `datasets` argument determines the\n\t * structure of elements in the resulting iterator.\n\t *\n\t * Note this means that, given an array of two datasets that produce dict\n\t * elements, the result is a dataset that produces elements that are arrays\n\t * of two dicts:\n\t *\n\t * Zip an array of datasets:\n\t * ```js\n\t * console.log('Zip two datasets of objects:');\n\t * const ds1 = tf.data.array([{a: 1}, {a: 2}, {a: 3}]);\n\t * const ds2 = tf.data.array([{b: 4}, {b: 5}, {b: 6}]);\n\t * const ds3 = tf.data.zip([ds1, ds2]);\n\t * await ds3.forEachAsync(e => console.log(JSON.stringify(e)));\n\t *\n\t * // If the goal is to merge the dicts in order to produce elements like\n\t * // {a: ..., b: ...}, this requires a second step such as:\n\t * console.log('Merge the objects:');\n\t * const ds4 = ds3.map(x => {return {a: x[0].a, b: x[1].b}});\n\t * await ds4.forEachAsync(e => console.log(e));\n\t * ```\n\t *\n\t * Zip a dict of datasets:\n\t * ```js\n\t * const a = tf.data.array([{a: 1}, {a: 2}, {a: 3}]);\n\t * const b = tf.data.array([{b: 4}, {b: 5}, {b: 6}]);\n\t * const c = tf.data.zip({c: a, d: b});\n\t * await c.forEachAsync(e => console.log(JSON.stringify(e)));\n\t * ```\n\t *\n\t * @doc {heading: 'Data', subheading: 'Operations', namespace: 'data'}\n\t */\n\n\tfunction zip(datasets) {\n\t  // manually type-check the argument for JS users\n\t  if (!isIterable$1(datasets)) {\n\t    throw new Error('The argument to zip() must be an object or array.');\n\t  }\n\n\t  var size;\n\n\t  if (Array.isArray(datasets)) {\n\t    for (var i = 0; i < datasets.length; i++) {\n\t      size = size == null ? datasets[i].size : Math.min(size, datasets[i].size);\n\t    }\n\t  } else if (datasets instanceof Object) {\n\t    for (var ds in datasets) {\n\t      size = size == null ? datasets[ds].size : Math.min(size, datasets[ds].size);\n\t    }\n\t  }\n\n\t  return datasetFromIteratorFn( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee17() {\n\t    var streams;\n\t    return regeneratorRuntime.wrap(function _callee17$(_context17) {\n\t      while (1) {\n\t        switch (_context17.prev = _context17.next) {\n\t          case 0:\n\t            _context17.next = 2;\n\t            return deepMapAndAwaitAll(datasets, function (d) {\n\t              if (d instanceof Dataset) {\n\t                return {\n\t                  value: d.iterator(),\n\t                  recurse: false\n\t                };\n\t              } else if (isIterable$1(d)) {\n\t                return {\n\t                  value: null,\n\t                  recurse: true\n\t                };\n\t              } else {\n\t                throw new Error('Leaves of the structure passed to zip() must be Datasets, ' + 'not primitives.');\n\t              }\n\t            });\n\n\t          case 2:\n\t            streams = _context17.sent;\n\t            return _context17.abrupt(\"return\", iteratorFromZipped(streams, ZipMismatchMode.SHORTEST));\n\n\t          case 4:\n\t          case \"end\":\n\t            return _context17.stop();\n\t        }\n\t      }\n\t    }, _callee17);\n\t  })), size);\n\t}\n\t/**\n\t * A zip function for use with deepZip, passed via the columnMajorBatch call.\n\t *\n\t * Accepts an array of identically-structured nested elements and either batches\n\t * them (if they are primitives, numeric arrays, or Tensors) or requests\n\t * recursion (if not).\n\t */\n\t// tslint:disable-next-line:no-any\n\n\tfunction deepBatchConcat(rows) {\n\t  if (rows === null) {\n\t    return null;\n\t  } // use the first item to decide whether to recurse or batch here.\n\n\n\t  var exampleRow = rows[0];\n\n\t  if (canTensorify(exampleRow)) {\n\t    // rows is an array of primitives, Tensors, or arrays.  Batch them.\n\t    var value = batchConcat(rows);\n\t    return {\n\t      value: value,\n\t      recurse: false\n\t    };\n\t  } // the example row is an object, so recurse into it.\n\n\n\t  return {\n\t    value: null,\n\t    recurse: true\n\t  };\n\t}\n\t/**\n\t * Assembles a list of same-shaped numbers, number arrays, or Tensors\n\t * into a single new Tensor where axis 0 is the batch dimension.\n\t */\n\n\n\tfunction batchConcat(arrays) {\n\t  if (arrays.length === 0) {\n\t    // We can't return an empty Tensor because we don't know the element shape.\n\t    throw new Error('Can\\'t make a batch of zero elements.');\n\t  }\n\n\t  if (arrays[0] instanceof Tensor) {\n\t    // Input is an array of Tensors\n\t    return stack(arrays);\n\t  } else {\n\t    // Input is a possibly-nested array of numbers.\n\t    return tensor(arrays);\n\t  }\n\t}\n\n\t/**\n\t * Represents a potentially large collection of text lines.\n\t *\n\t * The results are not batched.\n\t */\n\n\tvar TextLineDataset = /*#__PURE__*/function (_Dataset) {\n\t  _inheritsLoose(TextLineDataset, _Dataset);\n\n\t  /**\n\t   * Create a `TextLineDataset`.\n\t   *\n\t   * @param input A `DataSource` providing a chunked, UTF8-encoded byte stream.\n\t   */\n\t  function TextLineDataset(input) {\n\t    var _this;\n\n\t    _this = _Dataset.call(this) || this;\n\t    _this.input = input;\n\t    return _this;\n\t  }\n\n\t  var _proto = TextLineDataset.prototype;\n\n\t  _proto.iterator = /*#__PURE__*/function () {\n\t    var _iterator = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      var inputIterator, utf8Iterator, lineIterator;\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              _context.next = 2;\n\t              return this.input.iterator();\n\n\t            case 2:\n\t              inputIterator = _context.sent;\n\t              utf8Iterator = inputIterator.decodeUTF8();\n\t              lineIterator = utf8Iterator.split('\\n').map(function (line) {\n\t                // Windows/DOS format text file has extra line breaker at the end of line.\n\t                if (line.endsWith('\\r')) {\n\t                  line = line.slice(0, -1);\n\t                }\n\n\t                return line;\n\t              });\n\t              return _context.abrupt(\"return\", lineIterator);\n\n\t            case 6:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function iterator() {\n\t      return _iterator.apply(this, arguments);\n\t    }\n\n\t    return iterator;\n\t  }();\n\n\t  return TextLineDataset;\n\t}(Dataset);\n\n\tvar CODE_QUOTE = '\"';\n\tvar STATE_OUT = Symbol('out');\n\tvar STATE_FIELD = Symbol('field');\n\tvar STATE_QUOTE = Symbol('quote');\n\tvar STATE_QUOTE_AFTER_QUOTE = Symbol('quoteafterquote');\n\tvar STATE_WITHIN_QUOTE_IN_QUOTE = Symbol('quoteinquote');\n\t/**\n\t * Represents a potentially large collection of delimited text records.\n\t *\n\t * The produced `TensorContainer`s each contain one key-value pair for\n\t * every column of the table.  When a field is empty in the incoming data, the\n\t * resulting value is `undefined`, or throw error if it is required.  Values\n\t * that can be parsed as numbers are emitted as type `number`, other values\n\t * are parsed as `string`.\n\t *\n\t * The results are not batched.\n\t *\n\t * @doc {heading: 'Data', subheading: 'Classes', namespace: 'data'}\n\t */\n\n\tvar CSVDataset = /*#__PURE__*/function (_Dataset) {\n\t  _inheritsLoose(CSVDataset, _Dataset);\n\n\t  /**\n\t   * Create a `CSVDataset`.\n\t   *\n\t   * @param input A `DataSource` providing a chunked, UTF8-encoded byte stream.\n\t   * @param csvConfig (Optional) A CSVConfig object that contains configurations\n\t   *     of reading and decoding from CSV file(s).\n\t   *\n\t   *     hasHeader: (Optional) A boolean value that indicates whether the first\n\t   *     row of provided CSV file is a header line with column names, and should\n\t   *     not be included in the data. Defaults to `true`.\n\t   *\n\t   *     columnNames: (Optional) A list of strings that corresponds to\n\t   *     the CSV column names, in order. If provided, it ignores the column\n\t   *     names inferred from the header row. If not provided, infers the column\n\t   *     names from the first row of the records. If hasHeader is false and\n\t   *     columnNames is not provided, this method throws an error.\n\t   *\n\t   *     columnConfigs: (Optional) A dictionary whose key is column names, value\n\t   *     is an object stating if this column is required, column's data type,\n\t   *     default value, and if this column is label. If provided, keys must\n\t   *     correspond to names provided in columnNames or inferred from the file\n\t   *     header lines. If isLabel is true any column, returns an array of two\n\t   *     items: the first item is a dict of features key/value pairs, the second\n\t   *     item is a dict of labels key/value pairs. If no feature is marked as\n\t   *     label, returns a dict of features only.\n\t   *\n\t   *     configuredColumnsOnly (Optional) If true, only columns provided in\n\t   *     columnConfigs will be parsed and provided during iteration.\n\t   *\n\t   *     delimiter (Optional) The string used to parse each line of the input\n\t   *     file. Defaults to `,`.\n\t   */\n\t  function CSVDataset(input, csvConfig) {\n\t    var _this;\n\n\t    _this = _Dataset.call(this) || this;\n\t    _this.input = input;\n\t    _this.hasHeader = true;\n\t    _this.fullColumnNames = null;\n\t    _this.columnNamesValidated = false;\n\t    _this.columnConfigs = null;\n\t    _this.configuredColumnsOnly = false;\n\t    _this.delimiter = ',';\n\t    _this.delimWhitespace = false;\n\t    _this.base = new TextLineDataset(input);\n\n\t    if (!csvConfig) {\n\t      csvConfig = {};\n\t    }\n\n\t    _this.hasHeader = csvConfig.hasHeader === false ? false : true;\n\t    _this.fullColumnNames = csvConfig.columnNames;\n\t    _this.columnConfigs = csvConfig.columnConfigs;\n\t    _this.configuredColumnsOnly = csvConfig.configuredColumnsOnly;\n\n\t    if (csvConfig.delimWhitespace) {\n\t      assert(csvConfig.delimiter == null, function () {\n\t        return 'Delimiter should not be provided when delimWhitespace is true.';\n\t      });\n\t      _this.delimWhitespace = true;\n\t      _this.delimiter = ' ';\n\t    } else {\n\t      _this.delimiter = csvConfig.delimiter ? csvConfig.delimiter : ',';\n\t    }\n\n\t    return _this;\n\t  }\n\t  /**\n\t   * Returns column names of the csv dataset. If `configuredColumnsOnly` is\n\t   * true, return column names in `columnConfigs`. If `configuredColumnsOnly` is\n\t   * false and `columnNames` is provided, `columnNames`. If\n\t   * `configuredColumnsOnly` is false and `columnNames` is not provided, return\n\t   * all column names parsed from the csv file. For example usage please go to\n\t   * `tf.data.csv`.\n\t   *\n\t   * @doc {heading: 'Data', subheading: 'Classes'}\n\t   */\n\n\n\t  var _proto = CSVDataset.prototype;\n\n\t  _proto.columnNames =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _columnNames = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              if (this.columnNamesValidated) {\n\t                _context.next = 3;\n\t                break;\n\t              }\n\n\t              _context.next = 3;\n\t              return this.setColumnNames();\n\n\t            case 3:\n\t              return _context.abrupt(\"return\", this.configuredColumnsOnly ? Object.keys(this.columnConfigs) : this.fullColumnNames);\n\n\t            case 4:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function columnNames() {\n\t      return _columnNames.apply(this, arguments);\n\t    }\n\n\t    return columnNames;\n\t  }()\n\t  /* 1) If `columnNames` is provided as string[], use this string[] as output\n\t   * keys in corresponding order. The length must match the number of inferred\n\t   * columns if `hasHeader` is true .\n\t   * 2) If `columnNames` is not provided, parse header line as `columnNames` if\n\t   * hasHeader is true. If `hasHeader` is false, throw an error.\n\t   * 3) If `columnConfigs` is provided, all the keys in `columnConfigs` must\n\t   * exist in parsed `columnNames`.\n\t   */\n\t  ;\n\n\t  _proto.setColumnNames =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _setColumnNames = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n\t      var _this2 = this;\n\n\t      var columnNamesFromFile, counts, duplicateNames, _i, _Object$keys, key, index;\n\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              _context2.next = 2;\n\t              return this.maybeReadHeaderLine();\n\n\t            case 2:\n\t              columnNamesFromFile = _context2.sent;\n\n\t              if (!(!this.fullColumnNames && !columnNamesFromFile)) {\n\t                _context2.next = 7;\n\t                break;\n\t              }\n\n\t              throw new Error('Column names must be provided if there is no header line.');\n\n\t            case 7:\n\t              if (this.fullColumnNames && columnNamesFromFile) {\n\t                // Check provided columnNames match header line.\n\t                assert(columnNamesFromFile.length === this.fullColumnNames.length, function () {\n\t                  return 'The length of provided columnNames (' + _this2.fullColumnNames.length.toString() + ') does not match the length of the header line read from ' + 'file (' + columnNamesFromFile.length.toString() + ').';\n\t                });\n\t              }\n\n\t            case 8:\n\t              if (!this.fullColumnNames) {\n\t                this.fullColumnNames = columnNamesFromFile;\n\t              } // Check if there are duplicate column names.\n\n\n\t              counts = this.fullColumnNames.reduce(function (countAcc, name) {\n\t                countAcc[name] = countAcc[name] + 1 || 1;\n\t                return countAcc;\n\t              }, {});\n\t              duplicateNames = Object.keys(counts).filter(function (name) {\n\t                return counts[name] > 1;\n\t              });\n\t              assert(duplicateNames.length === 0, function () {\n\t                return 'Duplicate column names found: ' + duplicateNames.toString();\n\t              }); // Check if keys in columnConfigs match columnNames.\n\n\t              if (!this.columnConfigs) {\n\t                _context2.next = 22;\n\t                break;\n\t              }\n\n\t              _i = 0, _Object$keys = Object.keys(this.columnConfigs);\n\n\t            case 14:\n\t              if (!(_i < _Object$keys.length)) {\n\t                _context2.next = 22;\n\t                break;\n\t              }\n\n\t              key = _Object$keys[_i];\n\t              index = this.fullColumnNames.indexOf(key);\n\n\t              if (!(index === -1)) {\n\t                _context2.next = 19;\n\t                break;\n\t              }\n\n\t              throw new Error('The key \"' + key + '\" provided in columnConfigs does not match any of the column ' + 'names (' + this.fullColumnNames.toString() + ').');\n\n\t            case 19:\n\t              _i++;\n\t              _context2.next = 14;\n\t              break;\n\n\t            case 22:\n\t              this.columnNamesValidated = true;\n\n\t            case 23:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function setColumnNames() {\n\t      return _setColumnNames.apply(this, arguments);\n\t    }\n\n\t    return setColumnNames;\n\t  }();\n\n\t  _proto.maybeReadHeaderLine = /*#__PURE__*/function () {\n\t    var _maybeReadHeaderLine = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n\t      var iter, firstElement, firstLine, headers;\n\t      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t        while (1) {\n\t          switch (_context3.prev = _context3.next) {\n\t            case 0:\n\t              if (!this.hasHeader) {\n\t                _context3.next = 14;\n\t                break;\n\t              }\n\n\t              _context3.next = 3;\n\t              return this.base.iterator();\n\n\t            case 3:\n\t              iter = _context3.sent;\n\t              _context3.next = 6;\n\t              return iter.next();\n\n\t            case 6:\n\t              firstElement = _context3.sent;\n\n\t              if (!firstElement.done) {\n\t                _context3.next = 9;\n\t                break;\n\t              }\n\n\t              throw new Error('No data was found for CSV parsing.');\n\n\t            case 9:\n\t              firstLine = firstElement.value;\n\t              headers = this.parseRow(firstLine, false);\n\t              return _context3.abrupt(\"return\", headers);\n\n\t            case 14:\n\t              return _context3.abrupt(\"return\", null);\n\n\t            case 15:\n\t            case \"end\":\n\t              return _context3.stop();\n\t          }\n\t        }\n\t      }, _callee3, this);\n\t    }));\n\n\t    function maybeReadHeaderLine() {\n\t      return _maybeReadHeaderLine.apply(this, arguments);\n\t    }\n\n\t    return maybeReadHeaderLine;\n\t  }();\n\n\t  _proto.iterator = /*#__PURE__*/function () {\n\t    var _iterator = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {\n\t      var _this3 = this;\n\n\t      var lines;\n\t      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n\t        while (1) {\n\t          switch (_context4.prev = _context4.next) {\n\t            case 0:\n\t              if (this.columnNamesValidated) {\n\t                _context4.next = 3;\n\t                break;\n\t              }\n\n\t              _context4.next = 3;\n\t              return this.setColumnNames();\n\n\t            case 3:\n\t              _context4.next = 5;\n\t              return this.base.iterator();\n\n\t            case 5:\n\t              lines = _context4.sent;\n\n\t              if (this.hasHeader) {\n\t                // We previously read the first line to get the columnNames.\n\t                // Now that we're providing data, skip it.\n\t                lines = lines.skip(1);\n\t              }\n\n\t              return _context4.abrupt(\"return\", lines.map(function (x) {\n\t                return _this3.makeDataElement(x);\n\t              }));\n\n\t            case 8:\n\t            case \"end\":\n\t              return _context4.stop();\n\t          }\n\t        }\n\t      }, _callee4, this);\n\t    }));\n\n\t    function iterator() {\n\t      return _iterator.apply(this, arguments);\n\t    }\n\n\t    return iterator;\n\t  }();\n\n\t  _proto.makeDataElement = function makeDataElement(line) {\n\t    var values = this.parseRow(line);\n\t    var features = {};\n\t    var labels = {};\n\n\t    for (var i = 0; i < this.fullColumnNames.length; i++) {\n\t      var key = this.fullColumnNames[i];\n\t      var config = this.columnConfigs ? this.columnConfigs[key] : null;\n\n\t      if (this.configuredColumnsOnly && !config) {\n\t        // This column is not selected.\n\t        continue;\n\t      } else {\n\t        var value = values[i];\n\t        var parsedValue = null;\n\n\t        if (value === '') {\n\t          // If default value is provided, use it. If default value is not\n\t          // provided, set as undefined.\n\t          if (config && config.default !== undefined) {\n\t            parsedValue = config.default;\n\t          } else if (config && (config.required || config.isLabel)) {\n\t            throw new Error(\"Required column \" + key + \" is empty in this line: \" + line);\n\t          } else {\n\t            parsedValue = undefined;\n\t          }\n\t        } else {\n\t          // A value is present, so parse it based on type\n\t          var valueAsNum = Number(value);\n\n\t          if (isNaN(valueAsNum)) {\n\t            // The value is a string and this column is declared as boolean\n\t            // in config, parse it as boolean.\n\t            if (config && config.dtype === 'bool') {\n\t              parsedValue = this.getBoolean(value);\n\t            } else {\n\t              // Set value as string\n\t              parsedValue = value;\n\t            }\n\t          } else if (!config || !config.dtype) {\n\t            // If this value is a number and no type config is provided, return\n\t            // it as number.\n\t            parsedValue = valueAsNum;\n\t          } else {\n\t            // If this value is a number and data type is provided, parse it\n\t            // according to provided data type.\n\t            switch (config.dtype) {\n\t              case 'float32':\n\t                parsedValue = valueAsNum;\n\t                break;\n\n\t              case 'int32':\n\t                parsedValue = Math.floor(valueAsNum);\n\t                break;\n\n\t              case 'bool':\n\t                parsedValue = this.getBoolean(value);\n\t                break;\n\n\t              default:\n\t                parsedValue = valueAsNum;\n\t            }\n\t          }\n\t        } // Check if this column is label.\n\n\n\t        config && config.isLabel ? labels[key] = parsedValue : features[key] = parsedValue;\n\t      }\n\t    } // If label exists, return an object of features and labels as {xs:features,\n\t    // ys:labels}, otherwise return features only.\n\n\n\t    if (Object.keys(labels).length === 0) {\n\t      return features;\n\t    } else {\n\t      return {\n\t        xs: features,\n\t        ys: labels\n\t      };\n\t    }\n\t  };\n\n\t  _proto.getBoolean = function getBoolean(value) {\n\t    if (value === '1' || value.toLowerCase() === 'true') {\n\t      return 1;\n\t    } else {\n\t      return 0;\n\t    }\n\t  } // adapted from https://beta.observablehq.com/@mbostock/streaming-csv\n\t  ;\n\n\t  _proto.parseRow = function parseRow(line, validateElementCount) {\n\t    if (validateElementCount === void 0) {\n\t      validateElementCount = true;\n\t    }\n\n\t    var result = [];\n\t    var readOffset = 0;\n\t    var readLength = line.length;\n\t    var currentState = STATE_OUT; // Goes through the line to parse quote.\n\n\t    for (var i = 0; i < readLength; i++) {\n\t      switch (currentState) {\n\t        // Before enter a new field\n\t        case STATE_OUT:\n\t          switch (line.charAt(i)) {\n\t            // Enter a quoted field\n\t            case CODE_QUOTE:\n\t              readOffset = i + 1;\n\t              currentState = STATE_QUOTE;\n\t              break;\n\t            // Read an empty field\n\n\t            case this.delimiter:\n\t              readOffset = i + 1; // If delimiter is white space and configured to collapse\n\t              // multiple white spaces, ignore this white space.\n\n\t              if (this.delimiter === ' ' && this.delimWhitespace) {\n\t                break;\n\t              }\n\n\t              result.push('');\n\t              currentState = STATE_OUT;\n\t              break;\n\t            // Enter an unquoted field\n\n\t            default:\n\t              currentState = STATE_FIELD;\n\t              readOffset = i;\n\t              break;\n\t          }\n\n\t          break;\n\t        // In an unquoted field\n\n\t        case STATE_FIELD:\n\t          switch (line.charAt(i)) {\n\t            // Exit an unquoted field, add it to result\n\t            case this.delimiter:\n\t              result.push(line.substring(readOffset, i));\n\t              currentState = STATE_OUT;\n\t              readOffset = i + 1;\n\t              break;\n\n\t            default:\n\t          }\n\n\t          break;\n\t        // In a quoted field\n\n\t        case STATE_QUOTE:\n\t          switch (line.charAt(i)) {\n\t            // Read a quote after a quote\n\t            case CODE_QUOTE:\n\t              currentState = STATE_QUOTE_AFTER_QUOTE;\n\t              break;\n\n\t            default:\n\t          }\n\n\t          break;\n\t        // This state means it's right after a second quote in a field\n\n\t        case STATE_QUOTE_AFTER_QUOTE:\n\t          switch (line.charAt(i)) {\n\t            // Finished a quoted field\n\t            case this.delimiter:\n\t              result.push(line.substring(readOffset, i - 1));\n\t              currentState = STATE_OUT;\n\t              readOffset = i + 1;\n\t              break;\n\t            // Finished a quoted part in a quoted field\n\n\t            case CODE_QUOTE:\n\t              currentState = STATE_QUOTE;\n\t              break;\n\t            // In a quoted part in a quoted field\n\n\t            default:\n\t              currentState = STATE_WITHIN_QUOTE_IN_QUOTE;\n\t              break;\n\t          }\n\n\t          break;\n\n\t        case STATE_WITHIN_QUOTE_IN_QUOTE:\n\t          switch (line.charAt(i)) {\n\t            // Exit a quoted part in a quoted field\n\t            case CODE_QUOTE:\n\t              currentState = STATE_QUOTE;\n\t              break;\n\n\t            default:\n\t          }\n\n\t          break;\n\n\t        default:\n\t      }\n\t    } // Adds last item based on if it is quoted.\n\n\n\t    if (currentState === STATE_QUOTE_AFTER_QUOTE) {\n\t      result.push(line.substring(readOffset, readLength - 1));\n\t    } else {\n\t      result.push(line.substring(readOffset));\n\t    } // Check if each row has the same number of elements as column names.\n\n\n\t    if (validateElementCount && result.length !== this.fullColumnNames.length) {\n\t      throw new Error(\"Invalid row in csv file. Should have \" + this.fullColumnNames.length + \" elements in a row, but got \" + result);\n\t    }\n\n\t    return result;\n\t  };\n\n\t  return CSVDataset;\n\t}(Dataset); // TODO(soergel): add more basic datasets for parity with tf.data\n\t// tf.data.FixedLengthRecordDataset()\n\t// tf.data.TFRecordDataset()\n\n\t/**\n\t * Provide a stream of tensors from microphone audio stream. The tensors are\n\t * representing audio data as frequency-domain spectrogram generated with\n\t * browser's native FFT. Tensors representing time-domain waveform is available\n\t * based on configuration. Only works in browser environment.\n\t */\n\n\tvar MicrophoneIterator = /*#__PURE__*/function (_LazyIterator) {\n\t  _inheritsLoose(MicrophoneIterator, _LazyIterator);\n\n\t  function MicrophoneIterator(microphoneConfig) {\n\t    var _this;\n\n\t    _this = _LazyIterator.call(this) || this;\n\t    _this.microphoneConfig = microphoneConfig;\n\t    _this.isClosed = false;\n\t    _this.fftSize = microphoneConfig.fftSize || 1024;\n\t    var fftSizeLog2 = Math.log2(_this.fftSize);\n\n\t    if (_this.fftSize < 0 || fftSizeLog2 < 4 || fftSizeLog2 > 14 || !Number.isInteger(fftSizeLog2)) {\n\t      throw new Error(\"Invalid fftSize: it must be a power of 2 between \" + (\"2 to 4 and 2 to 14, but got \" + _this.fftSize));\n\t    }\n\n\t    _this.numFrames = microphoneConfig.numFramesPerSpectrogram || 43;\n\t    _this.sampleRateHz = microphoneConfig.sampleRateHz;\n\t    _this.columnTruncateLength = microphoneConfig.columnTruncateLength || _this.fftSize;\n\t    _this.audioTrackConstraints = microphoneConfig.audioTrackConstraints;\n\t    _this.smoothingTimeConstant = microphoneConfig.smoothingTimeConstant || 0;\n\t    _this.includeSpectrogram = microphoneConfig.includeSpectrogram === false ? false : true;\n\t    _this.includeWaveform = microphoneConfig.includeWaveform === true ? true : false;\n\n\t    if (!_this.includeSpectrogram && !_this.includeWaveform) {\n\t      throw new Error('Both includeSpectrogram and includeWaveform are false. ' + 'At least one type of data should be returned.');\n\t    }\n\n\t    return _this;\n\t  }\n\n\t  var _proto = MicrophoneIterator.prototype;\n\n\t  _proto.summary = function summary() {\n\t    return \"microphone\";\n\t  } // Construct a MicrophoneIterator and start the audio stream.\n\t  ;\n\n\t  MicrophoneIterator.create =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _create = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(microphoneConfig) {\n\t      var microphoneIterator;\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              if (microphoneConfig === void 0) {\n\t                microphoneConfig = {};\n\t              }\n\n\t              if (!env().get('IS_NODE')) {\n\t                _context.next = 3;\n\t                break;\n\t              }\n\n\t              throw new Error('microphone API is only supported in browser environment.');\n\n\t            case 3:\n\t              microphoneIterator = new MicrophoneIterator(microphoneConfig); // Call async function start() to initialize the audio stream.\n\n\t              _context.next = 6;\n\t              return microphoneIterator.start();\n\n\t            case 6:\n\t              return _context.abrupt(\"return\", microphoneIterator);\n\n\t            case 7:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee);\n\t    }));\n\n\t    function create(_x) {\n\t      return _create.apply(this, arguments);\n\t    }\n\n\t    return create;\n\t  }() // Start the audio stream and FFT.\n\t  ;\n\n\t  _proto.start =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _start = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n\t      var ctxConstructor, streamSource;\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              _context2.prev = 0;\n\t              _context2.next = 3;\n\t              return navigator.mediaDevices.getUserMedia({\n\t                audio: this.audioTrackConstraints == null ? true : this.audioTrackConstraints,\n\t                video: false\n\t              });\n\n\t            case 3:\n\t              this.stream = _context2.sent;\n\t              _context2.next = 9;\n\t              break;\n\n\t            case 6:\n\t              _context2.prev = 6;\n\t              _context2.t0 = _context2[\"catch\"](0);\n\t              throw new Error(\"Error thrown while initializing video stream: \" + _context2.t0.message);\n\n\t            case 9:\n\t              if (this.stream) {\n\t                _context2.next = 11;\n\t                break;\n\t              }\n\n\t              throw new Error('Could not obtain audio from microphone.');\n\n\t            case 11:\n\t              ctxConstructor = // tslint:disable-next-line:no-any\n\t              window.AudioContext || window.webkitAudioContext;\n\t              this.audioContext = new ctxConstructor();\n\n\t              if (this.sampleRateHz) {\n\t                _context2.next = 17;\n\t                break;\n\t              }\n\n\t              // If sample rate is not provided, use the available sample rate on\n\t              // device.\n\t              this.sampleRateHz = this.audioContext.sampleRate;\n\t              _context2.next = 19;\n\t              break;\n\n\t            case 17:\n\t              if (!(this.audioContext.sampleRate !== this.sampleRateHz)) {\n\t                _context2.next = 19;\n\t                break;\n\t              }\n\n\t              throw new Error(\"Mismatch in sampling rate: \" + (\"Expected: \" + this.sampleRateHz + \"; \") + (\"Actual: \" + this.audioContext.sampleRate));\n\n\t            case 19:\n\t              streamSource = this.audioContext.createMediaStreamSource(this.stream);\n\t              this.analyser = this.audioContext.createAnalyser();\n\t              this.analyser.fftSize = this.fftSize * 2;\n\t              this.analyser.smoothingTimeConstant = this.smoothingTimeConstant;\n\t              streamSource.connect(this.analyser);\n\t              this.freqData = new Float32Array(this.fftSize);\n\t              this.timeData = new Float32Array(this.fftSize);\n\t              return _context2.abrupt(\"return\");\n\n\t            case 27:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this, [[0, 6]]);\n\t    }));\n\n\t    function start() {\n\t      return _start.apply(this, arguments);\n\t    }\n\n\t    return start;\n\t  }();\n\n\t  _proto.next = /*#__PURE__*/function () {\n\t    var _next = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n\t      var spectrogramTensor, waveformTensor, audioDataQueue, freqData, timeData;\n\t      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t        while (1) {\n\t          switch (_context3.prev = _context3.next) {\n\t            case 0:\n\t              if (!this.isClosed) {\n\t                _context3.next = 2;\n\t                break;\n\t              }\n\n\t              return _context3.abrupt(\"return\", {\n\t                value: null,\n\t                done: true\n\t              });\n\n\t            case 2:\n\t              _context3.next = 4;\n\t              return this.getAudioData();\n\n\t            case 4:\n\t              audioDataQueue = _context3.sent;\n\n\t              if (this.includeSpectrogram) {\n\t                freqData = this.flattenQueue(audioDataQueue.freqDataQueue);\n\t                spectrogramTensor = this.getTensorFromAudioDataArray(freqData, [this.numFrames, this.columnTruncateLength, 1]);\n\t              }\n\n\t              if (this.includeWaveform) {\n\t                timeData = this.flattenQueue(audioDataQueue.timeDataQueue);\n\t                waveformTensor = this.getTensorFromAudioDataArray(timeData, [this.numFrames * this.fftSize, 1]);\n\t              }\n\n\t              return _context3.abrupt(\"return\", {\n\t                value: {\n\t                  'spectrogram': spectrogramTensor,\n\t                  'waveform': waveformTensor\n\t                },\n\t                done: false\n\t              });\n\n\t            case 8:\n\t            case \"end\":\n\t              return _context3.stop();\n\t          }\n\t        }\n\t      }, _callee3, this);\n\t    }));\n\n\t    function next() {\n\t      return _next.apply(this, arguments);\n\t    }\n\n\t    return next;\n\t  }() // Capture one result from the audio stream, and extract the value from\n\t  // iterator.next() result.\n\t  ;\n\n\t  _proto.capture =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _capture = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {\n\t      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n\t        while (1) {\n\t          switch (_context4.prev = _context4.next) {\n\t            case 0:\n\t              _context4.next = 2;\n\t              return this.next();\n\n\t            case 2:\n\t              return _context4.abrupt(\"return\", _context4.sent.value);\n\n\t            case 3:\n\t            case \"end\":\n\t              return _context4.stop();\n\t          }\n\t        }\n\t      }, _callee4, this);\n\t    }));\n\n\t    function capture() {\n\t      return _capture.apply(this, arguments);\n\t    }\n\n\t    return capture;\n\t  }();\n\n\t  _proto.getAudioData = /*#__PURE__*/function () {\n\t    var _getAudioData = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {\n\t      var _this2 = this;\n\n\t      var freqDataQueue, timeDataQueue, currentFrames;\n\t      return regeneratorRuntime.wrap(function _callee5$(_context5) {\n\t        while (1) {\n\t          switch (_context5.prev = _context5.next) {\n\t            case 0:\n\t              freqDataQueue = [];\n\t              timeDataQueue = [];\n\t              currentFrames = 0;\n\t              return _context5.abrupt(\"return\", new Promise(function (resolve) {\n\t                var intervalID = setInterval(function () {\n\t                  if (_this2.includeSpectrogram) {\n\t                    _this2.analyser.getFloatFrequencyData(_this2.freqData); // If the audio stream is initializing, return empty queue.\n\n\n\t                    if (_this2.freqData[0] === -Infinity) {\n\t                      resolve({\n\t                        freqDataQueue: freqDataQueue,\n\t                        timeDataQueue: timeDataQueue\n\t                      });\n\t                    }\n\n\t                    freqDataQueue.push(_this2.freqData.slice(0, _this2.columnTruncateLength));\n\t                  }\n\n\t                  if (_this2.includeWaveform) {\n\t                    _this2.analyser.getFloatTimeDomainData(_this2.timeData);\n\n\t                    timeDataQueue.push(_this2.timeData.slice());\n\t                  } // Clean interval and return when all frames have been collected\n\n\n\t                  if (++currentFrames === _this2.numFrames) {\n\t                    clearInterval(intervalID);\n\t                    resolve({\n\t                      freqDataQueue: freqDataQueue,\n\t                      timeDataQueue: timeDataQueue\n\t                    });\n\t                  }\n\t                }, _this2.fftSize / _this2.sampleRateHz * 1e3);\n\t              }));\n\n\t            case 4:\n\t            case \"end\":\n\t              return _context5.stop();\n\t          }\n\t        }\n\t      }, _callee5);\n\t    }));\n\n\t    function getAudioData() {\n\t      return _getAudioData.apply(this, arguments);\n\t    }\n\n\t    return getAudioData;\n\t  }() // Stop the audio stream and pause the iterator.\n\t  ;\n\n\t  _proto.stop = function stop() {\n\t    if (!this.isClosed) {\n\t      this.isClosed = true;\n\t      this.analyser.disconnect();\n\t      this.audioContext.close();\n\n\t      if (this.stream != null && this.stream.getTracks().length > 0) {\n\t        this.stream.getTracks()[0].stop();\n\t      }\n\t    }\n\t  } // Override toArray() function to prevent collecting.\n\t  ;\n\n\t  _proto.toArray = function toArray() {\n\t    throw new Error('Can not convert infinite audio stream to array.');\n\t  } // Return audio sampling rate in Hz\n\t  ;\n\n\t  _proto.getSampleRate = function getSampleRate() {\n\t    return this.sampleRateHz;\n\t  };\n\n\t  _proto.flattenQueue = function flattenQueue(queue) {\n\t    var frameSize = queue[0].length;\n\t    var freqData = new Float32Array(queue.length * frameSize);\n\t    queue.forEach(function (data, i) {\n\t      return freqData.set(data, i * frameSize);\n\t    });\n\t    return freqData;\n\t  };\n\n\t  _proto.getTensorFromAudioDataArray = function getTensorFromAudioDataArray(freqData, shape) {\n\t    var vals = new Float32Array(sizeFromShape(shape)); // If the data is less than the output shape, the rest is padded with zeros.\n\n\t    vals.set(freqData, vals.length - freqData.length);\n\t    return tensor(vals, shape);\n\t  };\n\n\t  return MicrophoneIterator;\n\t}(LazyIterator);\n\n\t/**\n\t * Provide a stream of image tensors from webcam video stream. Only works in\n\t * browser environment.\n\t */\n\n\tvar WebcamIterator = /*#__PURE__*/function (_LazyIterator) {\n\t  _inheritsLoose(WebcamIterator, _LazyIterator);\n\n\t  function WebcamIterator(webcamVideoElement, webcamConfig) {\n\t    var _this;\n\n\t    _this = _LazyIterator.call(this) || this;\n\t    _this.webcamVideoElement = webcamVideoElement;\n\t    _this.webcamConfig = webcamConfig;\n\t    _this.isClosed = true;\n\t    _this.resize = false;\n\n\t    if (_this.needToResize()) {\n\t      _this.resize = true;\n\t      _this.cropSize = [_this.webcamConfig.resizeHeight, _this.webcamConfig.resizeWidth];\n\t      _this.cropBoxInd = tensor1d([0], 'int32');\n\n\t      if (_this.webcamConfig.centerCrop) {\n\t        // Calculate the box based on resizing shape.\n\t        var widthCroppingRatio = _this.webcamConfig.resizeWidth * 1.0 / _this.webcamVideoElement.width;\n\t        var heightCroppingRatio = _this.webcamConfig.resizeHeight * 1.0 / _this.webcamVideoElement.height;\n\t        var widthCropStart = (1 - widthCroppingRatio) / 2;\n\t        var heightCropStart = (1 - heightCroppingRatio) / 2;\n\t        var widthCropEnd = widthCropStart + widthCroppingRatio;\n\t        var heightCropEnd = heightCroppingRatio + heightCropStart;\n\t        _this.cropBox = tensor2d([heightCropStart, widthCropStart, heightCropEnd, widthCropEnd], [1, 4]);\n\t      } else {\n\t        _this.cropBox = tensor2d([0, 0, 1, 1], [1, 4]);\n\t      }\n\t    }\n\n\t    return _this;\n\t  }\n\n\t  var _proto = WebcamIterator.prototype;\n\n\t  _proto.summary = function summary() {\n\t    return \"webcam\";\n\t  } // Construct a WebcamIterator and start it's video stream.\n\t  ;\n\n\t  WebcamIterator.create =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _create = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(webcamVideoElement, webcamConfig) {\n\t      var webcamIterator;\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              if (webcamConfig === void 0) {\n\t                webcamConfig = {};\n\t              }\n\n\t              if (!env().get('IS_NODE')) {\n\t                _context.next = 3;\n\t                break;\n\t              }\n\n\t              throw new Error('tf.data.webcam is only supported in browser environment.');\n\n\t            case 3:\n\t              if (webcamVideoElement) {\n\t                _context.next = 9;\n\t                break;\n\t              }\n\n\t              // If webcam video element is not provided, create a hidden video element\n\t              // with provided width and height.\n\t              webcamVideoElement = document.createElement('video');\n\n\t              if (!(!webcamConfig.resizeWidth || !webcamConfig.resizeHeight)) {\n\t                _context.next = 7;\n\t                break;\n\t              }\n\n\t              throw new Error('Please provide webcam video element, or resizeWidth and ' + 'resizeHeight to create a hidden video element.');\n\n\t            case 7:\n\t              webcamVideoElement.width = webcamConfig.resizeWidth;\n\t              webcamVideoElement.height = webcamConfig.resizeHeight;\n\n\t            case 9:\n\t              webcamIterator = new WebcamIterator(webcamVideoElement, webcamConfig); // Call async function to initialize the video stream.\n\n\t              _context.next = 12;\n\t              return webcamIterator.start();\n\n\t            case 12:\n\t              return _context.abrupt(\"return\", webcamIterator);\n\n\t            case 13:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee);\n\t    }));\n\n\t    function create(_x, _x2) {\n\t      return _create.apply(this, arguments);\n\t    }\n\n\t    return create;\n\t  }() // Async function to start video stream.\n\t  ;\n\n\t  _proto.start =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _start = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n\t      var _this2 = this;\n\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              if (this.webcamConfig.facingMode) {\n\t                assert(this.webcamConfig.facingMode === 'user' || this.webcamConfig.facingMode === 'environment', function () {\n\t                  return \"Invalid webcam facing mode: \" + _this2.webcamConfig.facingMode + \". \" + \"Please provide 'user' or 'environment'\";\n\t                });\n\t              }\n\n\t              _context2.prev = 1;\n\t              _context2.next = 4;\n\t              return navigator.mediaDevices.getUserMedia({\n\t                video: {\n\t                  deviceId: this.webcamConfig.deviceId,\n\t                  facingMode: this.webcamConfig.facingMode ? this.webcamConfig.facingMode : 'user',\n\t                  width: this.webcamVideoElement.width,\n\t                  height: this.webcamVideoElement.height\n\t                }\n\t              });\n\n\t            case 4:\n\t              this.stream = _context2.sent;\n\t              _context2.next = 11;\n\t              break;\n\n\t            case 7:\n\t              _context2.prev = 7;\n\t              _context2.t0 = _context2[\"catch\"](1);\n\t              // Modify the error message but leave the stack trace intact\n\t              _context2.t0.message = \"Error thrown while initializing video stream: \" + _context2.t0.message;\n\t              throw _context2.t0;\n\n\t            case 11:\n\t              if (this.stream) {\n\t                _context2.next = 13;\n\t                break;\n\t              }\n\n\t              throw new Error('Could not obtain video from webcam.');\n\n\t            case 13:\n\t              // Older browsers may not have srcObject\n\t              try {\n\t                this.webcamVideoElement.srcObject = this.stream;\n\t              } catch (error) {\n\t                console.log(error);\n\t                this.webcamVideoElement.src = window.URL.createObjectURL(this.stream);\n\t              } // Start the webcam video stream\n\n\n\t              this.webcamVideoElement.play();\n\t              this.isClosed = false;\n\t              return _context2.abrupt(\"return\", new Promise(function (resolve) {\n\t                // Add event listener to make sure the webcam has been fully initialized.\n\t                _this2.webcamVideoElement.onloadedmetadata = function () {\n\t                  resolve();\n\t                };\n\t              }));\n\n\t            case 17:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this, [[1, 7]]);\n\t    }));\n\n\t    function start() {\n\t      return _start.apply(this, arguments);\n\t    }\n\n\t    return start;\n\t  }();\n\n\t  _proto.next = /*#__PURE__*/function () {\n\t    var _next = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n\t      var img;\n\t      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t        while (1) {\n\t          switch (_context3.prev = _context3.next) {\n\t            case 0:\n\t              if (!this.isClosed) {\n\t                _context3.next = 2;\n\t                break;\n\t              }\n\n\t              return _context3.abrupt(\"return\", {\n\t                value: null,\n\t                done: true\n\t              });\n\n\t            case 2:\n\t              _context3.prev = 2;\n\t              img = fromPixels(this.webcamVideoElement);\n\t              _context3.next = 9;\n\t              break;\n\n\t            case 6:\n\t              _context3.prev = 6;\n\t              _context3.t0 = _context3[\"catch\"](2);\n\t              throw new Error(\"Error thrown converting video to pixels: \" + JSON.stringify(_context3.t0));\n\n\t            case 9:\n\t              if (!this.resize) {\n\t                _context3.next = 22;\n\t                break;\n\t              }\n\n\t              _context3.prev = 10;\n\t              return _context3.abrupt(\"return\", {\n\t                value: this.cropAndResizeFrame(img),\n\t                done: false\n\t              });\n\n\t            case 14:\n\t              _context3.prev = 14;\n\t              _context3.t1 = _context3[\"catch\"](10);\n\t              throw new Error(\"Error thrown cropping the video: \" + _context3.t1.message);\n\n\t            case 17:\n\t              _context3.prev = 17;\n\t              img.dispose();\n\t              return _context3.finish(17);\n\n\t            case 20:\n\t              _context3.next = 23;\n\t              break;\n\n\t            case 22:\n\t              return _context3.abrupt(\"return\", {\n\t                value: img,\n\t                done: false\n\t              });\n\n\t            case 23:\n\t            case \"end\":\n\t              return _context3.stop();\n\t          }\n\t        }\n\t      }, _callee3, this, [[2, 6], [10, 14, 17, 20]]);\n\t    }));\n\n\t    function next() {\n\t      return _next.apply(this, arguments);\n\t    }\n\n\t    return next;\n\t  }();\n\n\t  _proto.needToResize = function needToResize() {\n\t    // If resizeWidth and resizeHeight are provided, and different from the\n\t    // width and height of original HTMLVideoElement, then resizing and cropping\n\t    // is required.\n\t    if (this.webcamConfig.resizeWidth && this.webcamConfig.resizeHeight && (this.webcamVideoElement.width !== this.webcamConfig.resizeWidth || this.webcamVideoElement.height !== this.webcamConfig.resizeHeight)) {\n\t      return true;\n\t    }\n\n\t    return false;\n\t  } // Cropping and resizing each frame based on config\n\t  ;\n\n\t  _proto.cropAndResizeFrame = function cropAndResizeFrame(img) {\n\t    var _this3 = this;\n\n\t    return tidy(function () {\n\t      var expandedImage = img.toFloat().expandDims(0);\n\t      var resizedImage;\n\t      resizedImage = image.cropAndResize(expandedImage, _this3.cropBox, _this3.cropBoxInd, _this3.cropSize, 'bilinear'); // Extract image from batch cropping.\n\n\t      var shape = resizedImage.shape;\n\t      return resizedImage.reshape(shape.slice(1));\n\t    });\n\t  } // Capture one frame from the video stream, and extract the value from\n\t  // iterator.next() result.\n\t  ;\n\n\t  _proto.capture =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _capture = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {\n\t      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n\t        while (1) {\n\t          switch (_context4.prev = _context4.next) {\n\t            case 0:\n\t              _context4.next = 2;\n\t              return this.next();\n\n\t            case 2:\n\t              return _context4.abrupt(\"return\", _context4.sent.value);\n\n\t            case 3:\n\t            case \"end\":\n\t              return _context4.stop();\n\t          }\n\t        }\n\t      }, _callee4, this);\n\t    }));\n\n\t    function capture() {\n\t      return _capture.apply(this, arguments);\n\t    }\n\n\t    return capture;\n\t  }() // Stop the video stream and pause webcam iterator.\n\t  ;\n\n\t  _proto.stop = function stop() {\n\t    var tracks = this.stream.getTracks();\n\t    tracks.forEach(function (track) {\n\t      return track.stop();\n\t    });\n\n\t    try {\n\t      this.webcamVideoElement.srcObject = null;\n\t    } catch (error) {\n\t      console.log(error);\n\t      this.webcamVideoElement.src = null;\n\t    }\n\n\t    this.isClosed = true;\n\t  } // Override toArray() function to prevent collecting.\n\t  ;\n\n\t  _proto.toArray = function toArray() {\n\t    throw new Error('Can not convert infinite video stream to array.');\n\t  };\n\n\t  return WebcamIterator;\n\t}(LazyIterator);\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t *\n\t * =============================================================================\n\t */\n\n\t/**\n\t * Represents a data source readable as a stream of binary data chunks.\n\t *\n\t * Because `Dataset`s can be read repeatedly (via `Dataset.iterator()`), this\n\t * provides a means to repeatedly create streams from the underlying data\n\t * sources.\n\t */\n\tvar DataSource = function DataSource() {}; // TODO(soergel): consider convenience factory functions here\n\t// in combination with chainable source->dataset above, e.g.:\n\t// tf.data.url(...).asCsvDataset().shuffle().batch()\n\n\tvar StringIterator = /*#__PURE__*/function (_LazyIterator) {\n\t  _inheritsLoose(StringIterator, _LazyIterator);\n\n\t  function StringIterator() {\n\t    return _LazyIterator.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto = StringIterator.prototype;\n\n\t  /**\n\t   * Splits a string stream on a given separator.\n\t   *\n\t   * It is assumed that the incoming chunk boundaries have no semantic meaning,\n\t   * so conceptually the incoming stream is treated simply as the concatenation\n\t   * of its elements.\n\t   *\n\t   * The outgoing stream provides chunks corresponding to the results of the\n\t   * standard string split() operation (even if such a chunk spanned incoming\n\t   * chunks).  The separators are not included.\n\t   *\n\t   * A typical usage is to split a text file (represented as a stream with\n\t   * arbitrary chunk boundaries) into lines.\n\t   *\n\t   * @param upstream A readable stream of strings that can be treated as\n\t   *   concatenated.\n\t   * @param separator A character to split on.\n\t   */\n\t  _proto.split = function split(separator) {\n\t    return new SplitIterator(this, separator);\n\t  };\n\n\t  return StringIterator;\n\t}(LazyIterator); // ============================================================================\n\t// The following private classes serve to implement the chainable methods\n\t// on StringIterator.  Unfortunately they can't be placed in separate files, due\n\t// to resulting trouble with circular imports.\n\t// ============================================================================\n\t// We wanted multiple inheritance, e.g.\n\t//   class SplitIterator extends QueueIterator<string>, StringIterator\n\t// but the TypeScript mixin approach is a bit hacky, so we take this adapter\n\t// approach instead.\n\n\tvar SplitIterator = /*#__PURE__*/function (_StringIterator) {\n\t  _inheritsLoose(SplitIterator, _StringIterator);\n\n\t  function SplitIterator(upstream, separator) {\n\t    var _this;\n\n\t    _this = _StringIterator.call(this) || this;\n\t    _this.upstream = upstream;\n\t    _this.impl = new SplitIteratorImpl(upstream, separator);\n\t    return _this;\n\t  }\n\n\t  var _proto2 = SplitIterator.prototype;\n\n\t  _proto2.summary = function summary() {\n\t    return this.impl.summary();\n\t  };\n\n\t  _proto2.next = /*#__PURE__*/function () {\n\t    var _next = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              return _context.abrupt(\"return\", this.impl.next());\n\n\t            case 1:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function next() {\n\t      return _next.apply(this, arguments);\n\t    }\n\n\t    return next;\n\t  }();\n\n\t  return SplitIterator;\n\t}(StringIterator);\n\n\tvar SplitIteratorImpl = /*#__PURE__*/function (_OneToManyIterator) {\n\t  _inheritsLoose(SplitIteratorImpl, _OneToManyIterator);\n\n\t  function SplitIteratorImpl(upstream, separator) {\n\t    var _this2;\n\n\t    _this2 = _OneToManyIterator.call(this) || this;\n\t    _this2.upstream = upstream;\n\t    _this2.separator = separator; // A partial string at the end of an upstream chunk\n\n\t    _this2.carryover = '';\n\t    return _this2;\n\t  }\n\n\t  var _proto3 = SplitIteratorImpl.prototype;\n\n\t  _proto3.summary = function summary() {\n\t    return this.upstream.summary() + \" -> Split('\" + this.separator + \"')\";\n\t  };\n\n\t  _proto3.pump = /*#__PURE__*/function () {\n\t    var _pump = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n\t      var chunkResult, lines, _iterator, _step, line;\n\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              _context2.next = 2;\n\t              return this.upstream.next();\n\n\t            case 2:\n\t              chunkResult = _context2.sent;\n\n\t              if (!chunkResult.done) {\n\t                _context2.next = 9;\n\t                break;\n\t              }\n\n\t              if (!(this.carryover === '')) {\n\t                _context2.next = 6;\n\t                break;\n\t              }\n\n\t              return _context2.abrupt(\"return\", false);\n\n\t            case 6:\n\t              // Pretend that the pump succeeded in order to emit the small last batch.\n\t              // The next pump() call will actually fail.\n\t              this.outputQueue.push(this.carryover);\n\t              this.carryover = '';\n\t              return _context2.abrupt(\"return\", true);\n\n\t            case 9:\n\t              lines = chunkResult.value.split(this.separator); // Note the behavior: \" ab \".split(' ') === ['', 'ab', '']\n\t              // Thus the carryover may be '' if the separator falls on a chunk\n\t              // boundary; this produces the correct result.\n\n\t              lines[0] = this.carryover + lines[0];\n\n\t              for (_iterator = _createForOfIteratorHelperLoose(lines.slice(0, -1)); !(_step = _iterator()).done;) {\n\t                line = _step.value;\n\t                this.outputQueue.push(line);\n\t              }\n\n\t              this.carryover = lines[lines.length - 1];\n\t              return _context2.abrupt(\"return\", true);\n\n\t            case 14:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function pump() {\n\t      return _pump.apply(this, arguments);\n\t    }\n\n\t    return pump;\n\t  }();\n\n\t  return SplitIteratorImpl;\n\t}(OneToManyIterator);\n\n\tvar ByteChunkIterator = /*#__PURE__*/function (_LazyIterator) {\n\t  _inheritsLoose(ByteChunkIterator, _LazyIterator);\n\n\t  function ByteChunkIterator() {\n\t    return _LazyIterator.apply(this, arguments) || this;\n\t  }\n\n\t  var _proto = ByteChunkIterator.prototype;\n\n\t  /**\n\t   * Decode a stream of UTF8-encoded byte arrays to a stream of strings.\n\t   *\n\t   * The byte arrays producetd from the ByteChunkIterator on which this is\n\t   * called will be interpreted as concatenated.  No assumptions are made about\n\t   * the boundaries of the incoming chunks, so a multi-byte UTF8 encoding of a\n\t   * character may span the boundary between chunks.  This naturally happens,\n\t   * for instance, when reading fixed-size byte arrays from a file.\n\t   */\n\t  _proto.decodeUTF8 = function decodeUTF8() {\n\t    return new Utf8Iterator(this);\n\t  };\n\n\t  return ByteChunkIterator;\n\t}(LazyIterator); // ============================================================================\n\t// The following private classes serve to implement the chainable methods\n\t// on ByteChunkIterator.  Unfortunately they can't be placed in separate files,\n\t// due to resulting trouble with circular imports.\n\t// ============================================================================\n\t// We wanted multiple inheritance, e.g.\n\t//   class Utf8Iterator extends QueueIterator<string>, StringIterator\n\t// but the TypeScript mixin approach is a bit hacky, so we take this adapter\n\t// approach instead.\n\n\tvar Utf8Iterator = /*#__PURE__*/function (_StringIterator) {\n\t  _inheritsLoose(Utf8Iterator, _StringIterator);\n\n\t  function Utf8Iterator(upstream) {\n\t    var _this;\n\n\t    _this = _StringIterator.call(this) || this;\n\t    _this.upstream = upstream;\n\t    _this.impl = new Utf8IteratorImpl(upstream);\n\t    return _this;\n\t  }\n\n\t  var _proto2 = Utf8Iterator.prototype;\n\n\t  _proto2.summary = function summary() {\n\t    return this.impl.summary();\n\t  };\n\n\t  _proto2.next = /*#__PURE__*/function () {\n\t    var _next = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              return _context.abrupt(\"return\", this.impl.next());\n\n\t            case 1:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function next() {\n\t      return _next.apply(this, arguments);\n\t    }\n\n\t    return next;\n\t  }();\n\n\t  return Utf8Iterator;\n\t}(StringIterator);\n\t/**\n\t * Decode a stream of UTF8-encoded byte arrays to a stream of strings.\n\t *\n\t * This is tricky because the incoming byte array boundaries may disrupt a\n\t * multi-byte UTF8 character. Thus any incomplete character data at the end of\n\t * a chunk must be carried over and prepended to the next chunk before\n\t * decoding. Luckily with native decoder, TextDecoder in browser and\n\t * string_decoder in node, byte array boundaries are handled automatically.\n\t *\n\t * In the context of an input pipeline for machine learning, UTF8 decoding is\n\t * needed to parse text files containing training examples or prediction\n\t * requests (e.g., formatted as CSV or JSON). We cannot use the built-in\n\t * decoding provided by FileReader.readAsText() because here we are in a\n\t * streaming context, which FileReader does not support.\n\t *\n\t * @param upstream A `LazyIterator` of `Uint8Arrays` containing UTF8-encoded\n\t *   text, which should be interpreted as concatenated.  No assumptions are\n\t *   made about the boundaries of the incoming chunks, so a multi-byte UTF8\n\t *   encoding of a character may span the boundary between chunks.  This\n\t *   naturally happens, for instance, when reading fixed-size byte arrays from a\n\t *   file.\n\t */\n\n\n\tvar Utf8IteratorImpl = /*#__PURE__*/function (_OneToManyIterator) {\n\t  _inheritsLoose(Utf8IteratorImpl, _OneToManyIterator);\n\n\t  function Utf8IteratorImpl(upstream) {\n\t    var _this2;\n\n\t    _this2 = _OneToManyIterator.call(this) || this;\n\t    _this2.upstream = upstream;\n\n\t    if (env().get('IS_BROWSER')) {\n\t      _this2.decoder = new TextDecoder('utf-8');\n\t    } else {\n\t      // tslint:disable-next-line:no-require-imports\n\t      var _require = require('string_decoder'),\n\t          StringDecoder = _require.StringDecoder;\n\n\t      _this2.decoder = new StringDecoder('utf8');\n\t    }\n\n\t    return _this2;\n\t  }\n\n\t  var _proto3 = Utf8IteratorImpl.prototype;\n\n\t  _proto3.summary = function summary() {\n\t    return this.upstream.summary() + \" -> Utf8\";\n\t  };\n\n\t  _proto3.pump = /*#__PURE__*/function () {\n\t    var _pump = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n\t      var chunkResult, chunk, text;\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              _context2.next = 2;\n\t              return this.upstream.next();\n\n\t            case 2:\n\t              chunkResult = _context2.sent;\n\n\t              if (!chunkResult.done) {\n\t                _context2.next = 7;\n\t                break;\n\t              }\n\n\t              return _context2.abrupt(\"return\", false);\n\n\t            case 7:\n\t              chunk = chunkResult.value;\n\n\t            case 8:\n\t              if (env().get('IS_BROWSER')) {\n\t                text = this.decoder.decode(chunk, {\n\t                  stream: true\n\t                });\n\t              } else {\n\t                text = this.decoder.write(Buffer.from(chunk.buffer));\n\t              }\n\n\t              this.outputQueue.push(text);\n\t              return _context2.abrupt(\"return\", true);\n\n\t            case 11:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function pump() {\n\t      return _pump.apply(this, arguments);\n\t    }\n\n\t    return pump;\n\t  }();\n\n\t  return Utf8IteratorImpl;\n\t}(OneToManyIterator);\n\n\t/**\n\t * Provide a stream of chunks from a File, Blob, or Uint8Array.\n\t * @param file The source File, Blob or Uint8Array.\n\t * @param options Optional settings controlling file reading.\n\t * @returns a lazy Iterator of Uint8Arrays containing sequential chunks of the\n\t *   input File, Blob or Uint8Array.\n\t */\n\n\tvar FileChunkIterator = /*#__PURE__*/function (_ByteChunkIterator) {\n\t  _inheritsLoose(FileChunkIterator, _ByteChunkIterator);\n\n\t  function FileChunkIterator(file, options) {\n\t    var _this;\n\n\t    if (options === void 0) {\n\t      options = {};\n\t    }\n\n\t    _this = _ByteChunkIterator.call(this) || this;\n\t    _this.file = file;\n\t    _this.options = options;\n\t    assert(file instanceof Uint8Array || (env().get('IS_BROWSER') ? file instanceof File || file instanceof Blob : false), function () {\n\t      return 'FileChunkIterator only supports File, Blob and Uint8Array ' + 'right now.';\n\t    });\n\t    _this.offset = options.offset || 0; // default 1MB chunk has tolerable perf on large files\n\n\t    _this.chunkSize = options.chunkSize || 1024 * 1024;\n\t    return _this;\n\t  }\n\n\t  var _proto = FileChunkIterator.prototype;\n\n\t  _proto.summary = function summary() {\n\t    return \"FileChunks \" + this.file;\n\t  };\n\n\t  _proto.next = /*#__PURE__*/function () {\n\t    var _next = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      var _this2 = this;\n\n\t      var chunk;\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              if (!(this.offset >= (this.file instanceof Uint8Array ? this.file.byteLength : this.file.size))) {\n\t                _context.next = 2;\n\t                break;\n\t              }\n\n\t              return _context.abrupt(\"return\", {\n\t                value: null,\n\t                done: true\n\t              });\n\n\t            case 2:\n\t              chunk = new Promise(function (resolve, reject) {\n\t                var end = _this2.offset + _this2.chunkSize;\n\n\t                if (_this2.file instanceof Uint8Array) {\n\t                  // Note if end > this.uint8Array.byteLength, we just get a small last\n\t                  // chunk.\n\t                  resolve(new Uint8Array(_this2.file.slice(_this2.offset, end)));\n\t                } else {\n\t                  // This branch assumes that this.file type is File or Blob, which\n\t                  // means it is in the browser environment.\n\t                  // TODO(soergel): is this a performance issue?\n\t                  var fileReader = new FileReader();\n\n\t                  fileReader.onload = function (event) {\n\t                    var data = fileReader.result; // Not sure we can trust the return type of\n\t                    // FileReader.readAsArrayBuffer See e.g.\n\t                    // https://github.com/node-file-api/FileReader/issues/2\n\n\t                    if (data instanceof ArrayBuffer) {\n\t                      data = new Uint8Array(data);\n\t                    }\n\n\t                    if (!(data instanceof Uint8Array)) {\n\t                      return reject(new TypeError('FileReader returned unknown type.'));\n\t                    }\n\n\t                    resolve(data);\n\t                  };\n\n\t                  fileReader.onabort = function (event) {\n\t                    return reject(new Error('Aborted'));\n\t                  };\n\n\t                  fileReader.onerror = function (event) {\n\t                    return reject(new Error(event.type));\n\t                  }; // TODO(soergel): better handle onabort, onerror\n\t                  // Note if end > this.file.size, we just get a small last chunk.\n\n\n\t                  var slice = _this2.file.slice(_this2.offset, end); // We can't use readAsText here (even if we know the file is text)\n\t                  // because the slice boundary may fall within a multi-byte character.\n\n\n\t                  fileReader.readAsArrayBuffer(slice);\n\t                }\n\n\t                _this2.offset = end;\n\t              });\n\t              _context.next = 5;\n\t              return chunk;\n\n\t            case 5:\n\t              _context.t0 = _context.sent;\n\t              return _context.abrupt(\"return\", {\n\t                value: _context.t0,\n\t                done: false\n\t              });\n\n\t            case 7:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function next() {\n\t      return _next.apply(this, arguments);\n\t    }\n\n\t    return next;\n\t  }();\n\n\t  return FileChunkIterator;\n\t}(ByteChunkIterator);\n\n\t/**\n\t * Provide a stream of chunks from a URL.\n\t *\n\t * Note this class first downloads the entire file into memory before providing\n\t * the first element from the stream.  This is because the Fetch API does not\n\t * yet reliably provide a reader stream for the response body.\n\t */\n\n\tfunction urlChunkIterator(_x, _x2) {\n\t  return _urlChunkIterator.apply(this, arguments);\n\t} // Generate RequestInit from Request to match tf.util.fetch signature.\n\n\tfunction _urlChunkIterator() {\n\t  _urlChunkIterator = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(url, options) {\n\t    var urlString, requestInit, response, uint8Array;\n\t    return regeneratorRuntime.wrap(function _callee$(_context) {\n\t      while (1) {\n\t        switch (_context.prev = _context.next) {\n\t          case 0:\n\t            if (options === void 0) {\n\t              options = {};\n\t            }\n\n\t            if (typeof url === 'string') {\n\t              urlString = url;\n\t            } else {\n\t              urlString = url.url;\n\t              requestInit = getRequestInitFromRequest(url);\n\t            }\n\n\t            _context.next = 4;\n\t            return fetch$1(urlString, requestInit);\n\n\t          case 4:\n\t            response = _context.sent;\n\n\t            if (!response.ok) {\n\t              _context.next = 14;\n\t              break;\n\t            }\n\n\t            _context.t0 = Uint8Array;\n\t            _context.next = 9;\n\t            return response.arrayBuffer();\n\n\t          case 9:\n\t            _context.t1 = _context.sent;\n\t            uint8Array = new _context.t0(_context.t1);\n\t            return _context.abrupt(\"return\", new FileChunkIterator(uint8Array, options));\n\n\t          case 14:\n\t            throw new Error(response.statusText);\n\n\t          case 15:\n\t          case \"end\":\n\t            return _context.stop();\n\t        }\n\t      }\n\t    }, _callee);\n\t  }));\n\t  return _urlChunkIterator.apply(this, arguments);\n\t}\n\n\tvar getRequestInitFromRequest = function getRequestInitFromRequest(request) {\n\t  var init = {\n\t    method: request.method,\n\t    headers: request.headers,\n\t    body: request.body,\n\t    mode: request.mode,\n\t    credentials: request.credentials,\n\t    cache: request.cache,\n\t    redirect: request.redirect,\n\t    referrer: request.referrer,\n\t    integrity: request.integrity\n\t  };\n\t  return init;\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t *\n\t * =============================================================================\n\t */\n\t// Skip tslint any type check cause this method is aiming to check type of\n\t// input.\n\t// tslint:disable-next-line:no-any\n\tfunction isLocalPath(source) {\n\t  return typeof source === 'string' && source.substr(0, 7) === 'file://';\n\t}\n\n\t/**\n\t * Represents a file, blob, or Uint8Array readable as a stream of binary data\n\t * chunks.\n\t */\n\n\tvar FileDataSource = /*#__PURE__*/function (_DataSource) {\n\t  _inheritsLoose(FileDataSource, _DataSource);\n\n\t  /**\n\t   * Create a `FileDataSource`.\n\t   *\n\t   * @param input Local file path, or `File`/`Blob`/`Uint8Array` object to\n\t   *     read. Local file only works in node environment.\n\t   * @param options Options passed to the underlying `FileChunkIterator`s,\n\t   *   such as {chunksize: 1024}.\n\t   */\n\t  function FileDataSource(input, options) {\n\t    var _this;\n\n\t    if (options === void 0) {\n\t      options = {};\n\t    }\n\n\t    _this = _DataSource.call(this) || this;\n\t    _this.input = input;\n\t    _this.options = options;\n\t    return _this;\n\t  }\n\n\t  var _proto = FileDataSource.prototype;\n\n\t  _proto.iterator = /*#__PURE__*/function () {\n\t    var _iterator = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      var fs;\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              if (isLocalPath(this.input) && env().get('IS_NODE')) {\n\t                // tslint:disable-next-line:no-require-imports\n\t                fs = require('fs');\n\t                this.input = fs.readFileSync(this.input.substr(7));\n\t              } // TODO(kangyizhang): Add LocalFileChunkIterator to split local streaming\n\t              // with file in browser.\n\n\n\t              return _context.abrupt(\"return\", new FileChunkIterator(this.input, this.options));\n\n\t            case 2:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function iterator() {\n\t      return _iterator.apply(this, arguments);\n\t    }\n\n\t    return iterator;\n\t  }();\n\n\t  return FileDataSource;\n\t}(DataSource);\n\n\t/*\n\t * Represents a URL readable as a stream of binary data chunks.\n\t */\n\n\tvar URLDataSource = /*#__PURE__*/function (_DataSource) {\n\t  _inheritsLoose(URLDataSource, _DataSource);\n\n\t  /**\n\t   * Create a `URLDataSource`.\n\t   *\n\t   * @param url A source URL string, or a `Request` object.\n\t   * @param options Options passed to the underlying `FileChunkIterator`s,\n\t   *   such as {chunksize: 1024}.\n\t   */\n\t  function URLDataSource(url, fileOptions) {\n\t    var _this;\n\n\t    if (fileOptions === void 0) {\n\t      fileOptions = {};\n\t    }\n\n\t    _this = _DataSource.call(this) || this;\n\t    _this.url = url;\n\t    _this.fileOptions = fileOptions;\n\t    return _this;\n\t  } // TODO(soergel): provide appropriate caching options.  Currently this\n\t  // will download the URL anew for each call to iterator().  Since we have\n\t  // to treat the downloaded file as a blob/buffer anyway, we may as well retain\n\t  // it-- but that raises GC issues.  Also we may want a persistent disk cache.\n\n\n\t  var _proto = URLDataSource.prototype;\n\n\t  _proto.iterator =\n\t  /*#__PURE__*/\n\t  function () {\n\t    var _iterator = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              if (!isLocalPath(this.url)) {\n\t                _context.next = 4;\n\t                break;\n\t              }\n\n\t              return _context.abrupt(\"return\", new FileDataSource(this.url, this.fileOptions).iterator());\n\n\t            case 4:\n\t              return _context.abrupt(\"return\", urlChunkIterator(this.url, this.fileOptions));\n\n\t            case 5:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function iterator() {\n\t      return _iterator.apply(this, arguments);\n\t    }\n\n\t    return iterator;\n\t  }();\n\n\t  return URLDataSource;\n\t}(DataSource);\n\n\t/**\n\t * Create a `CSVDataset` by reading and decoding CSV file(s) from provided URL\n\t * or local path if it's in Node environment.\n\t *\n\t * Note: If isLabel in columnConfigs is `true` for at least one column, the\n\t * element in returned `CSVDataset` will be an object of\n\t * `{xs:features, ys:labels}`: xs is a dict of features key/value pairs, ys\n\t * is a dict of labels key/value pairs. If no column is marked as label,\n\t * returns a dict of features only.\n\t *\n\t * ```js\n\t * const csvUrl =\n\t * 'https://storage.googleapis.com/tfjs-examples/multivariate-linear-regression/data/boston-housing-train.csv';\n\t *\n\t * async function run() {\n\t *   // We want to predict the column \"medv\", which represents a median value of\n\t *   // a home (in $1000s), so we mark it as a label.\n\t *   const csvDataset = tf.data.csv(\n\t *     csvUrl, {\n\t *       columnConfigs: {\n\t *         medv: {\n\t *           isLabel: true\n\t *         }\n\t *       }\n\t *     });\n\t *\n\t *   // Number of features is the number of column names minus one for the label\n\t *   // column.\n\t *   const numOfFeatures = (await csvDataset.columnNames()).length - 1;\n\t *\n\t *   // Prepare the Dataset for training.\n\t *   const flattenedDataset =\n\t *     csvDataset\n\t *     .map(({xs, ys}) =>\n\t *       {\n\t *         // Convert xs(features) and ys(labels) from object form (keyed by\n\t *         // column name) to array form.\n\t *         return {xs:Object.values(xs), ys:Object.values(ys)};\n\t *       })\n\t *     .batch(10);\n\t *\n\t *   // Define the model.\n\t *   const model = tf.sequential();\n\t *   model.add(tf.layers.dense({\n\t *     inputShape: [numOfFeatures],\n\t *     units: 1\n\t *   }));\n\t *   model.compile({\n\t *     optimizer: tf.train.sgd(0.000001),\n\t *     loss: 'meanSquaredError'\n\t *   });\n\t *\n\t *   // Fit the model using the prepared Dataset\n\t *   return model.fitDataset(flattenedDataset, {\n\t *     epochs: 10,\n\t *     callbacks: {\n\t *       onEpochEnd: async (epoch, logs) => {\n\t *         console.log(epoch + ':' + logs.loss);\n\t *       }\n\t *     }\n\t *   });\n\t * }\n\t *\n\t * await run();\n\t * ```\n\t *\n\t * @param source URL or local path to get CSV file. If it's a local path, it\n\t * must have prefix `file://` and it only works in node environment.\n\t * @param csvConfig (Optional) A CSVConfig object that contains configurations\n\t *     of reading and decoding from CSV file(s).\n\t *\n\t * @doc {\n\t *   heading: 'Data',\n\t *   subheading: 'Creation',\n\t *   namespace: 'data',\n\t *   configParamIndices: [1]\n\t *  }\n\t */\n\n\tfunction csv(source, csvConfig) {\n\t  if (csvConfig === void 0) {\n\t    csvConfig = {};\n\t  }\n\n\t  return new CSVDataset(new URLDataSource(source), csvConfig);\n\t}\n\t/**\n\t * Create a `Dataset` that produces each element by calling a provided function.\n\t *\n\t * Note that repeated iterations over this `Dataset` may produce different\n\t * results, because the function will be called anew for each element of each\n\t * iteration.\n\t *\n\t * Also, beware that the sequence of calls to this function may be out of order\n\t * in time with respect to the logical order of the Dataset. This is due to the\n\t * asynchronous lazy nature of stream processing, and depends on downstream\n\t * transformations (e.g. .shuffle()). If the provided function is pure, this is\n\t * no problem, but if it is a closure over a mutable state (e.g., a traversal\n\t * pointer), then the order of the produced elements may be scrambled.\n\t *\n\t * ```js\n\t * let i = -1;\n\t * const func = () =>\n\t *    ++i < 5 ? {value: i, done: false} : {value: null, done: true};\n\t * const ds = tf.data.func(func);\n\t * await ds.forEachAsync(e => console.log(e));\n\t * ```\n\t *\n\t * @param f A function that produces one data element on each call.\n\t */\n\n\tfunction func(f) {\n\t  var iter = iteratorFromFunction(f);\n\t  return datasetFromIteratorFn( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n\t    return regeneratorRuntime.wrap(function _callee$(_context) {\n\t      while (1) {\n\t        switch (_context.prev = _context.next) {\n\t          case 0:\n\t            return _context.abrupt(\"return\", iter);\n\n\t          case 1:\n\t          case \"end\":\n\t            return _context.stop();\n\t        }\n\t      }\n\t    }, _callee);\n\t  })));\n\t}\n\t/**\n\t * Create a `Dataset` that produces each element from provided JavaScript\n\t * generator, which is a function*\n\t * (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators#Generator_functions),\n\t * or a function that returns an\n\t * iterator\n\t * (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators#Generator_functions).\n\t *\n\t * The returned iterator should have `.next()` function that returns element in\n\t * format of `{value: TensorContainer, done:boolean}`.\n\t *\n\t * Example of creating a dataset from an iterator factory:\n\t * ```js\n\t * function makeIterator() {\n\t *   const numElements = 10;\n\t *   let index = 0;\n\t *\n\t *   const iterator = {\n\t *     next: () => {\n\t *       let result;\n\t *       if (index < numElements) {\n\t *         result = {value: index, done: false};\n\t *         index++;\n\t *         return result;\n\t *       }\n\t *       return {value: index, done: true};\n\t *     }\n\t *   };\n\t *   return iterator;\n\t * }\n\t * const ds = tf.data.generator(makeIterator);\n\t * await ds.forEachAsync(e => console.log(e));\n\t * ```\n\t *\n\t * Example of creating a dataset from a generator:\n\t * ```js\n\t * function* dataGenerator() {\n\t *   const numElements = 10;\n\t *   let index = 0;\n\t *   while (index < numElements) {\n\t *     const x = index;\n\t *     index++;\n\t *     yield x;\n\t *   }\n\t * }\n\t *\n\t * const ds = tf.data.generator(dataGenerator);\n\t * await ds.forEachAsync(e => console.log(e));\n\t * ```\n\t *\n\t * @param generator A Javascript generator function that returns a JavaScript\n\t *     iterator.\n\t *\n\t * @doc {\n\t *   heading: 'Data',\n\t *   subheading: 'Creation',\n\t *   namespace: 'data',\n\t *   configParamIndices: [1]\n\t *  }\n\t */\n\n\tfunction generator(generator) {\n\t  return datasetFromIteratorFn( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n\t    var gen;\n\t    return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t      while (1) {\n\t        switch (_context2.prev = _context2.next) {\n\t          case 0:\n\t            _context2.next = 2;\n\t            return generator();\n\n\t          case 2:\n\t            gen = _context2.sent;\n\t            return _context2.abrupt(\"return\", iteratorFromFunction(function () {\n\t              return gen.next();\n\t            }));\n\n\t          case 4:\n\t          case \"end\":\n\t            return _context2.stop();\n\t        }\n\t      }\n\t    }, _callee2);\n\t  })));\n\t}\n\t/**\n\t * Create an iterator that generate `Tensor`s from webcam video stream. This API\n\t * only works in Browser environment when the device has webcam.\n\t *\n\t * Note: this code snippet only works when the device has a webcam. It will\n\t * request permission to open the webcam when running.\n\t * ```js\n\t * const videoElement = document.createElement('video');\n\t * videoElement.width = 100;\n\t * videoElement.height = 100;\n\t * const cam = await tf.data.webcam(videoElement);\n\t * const img = await cam.capture();\n\t * img.print();\n\t * cam.stop();\n\t * ```\n\t *\n\t * @param webcamVideoElement A `HTMLVideoElement` used to play video from\n\t *     webcam. If this element is not provided, a hidden `HTMLVideoElement` will\n\t *     be created. In that case, `resizeWidth` and `resizeHeight` must be\n\t *     provided to set the generated tensor shape.\n\t * @param webcamConfig A `WebcamConfig` object that contains configurations of\n\t *     reading and manipulating data from webcam video stream.\n\t *\n\t * @doc {\n\t *   heading: 'Data',\n\t *   subheading: 'Creation',\n\t *   namespace: 'data',\n\t *   ignoreCI: true\n\t *  }\n\t */\n\n\tfunction webcam(_x, _x2) {\n\t  return _webcam.apply(this, arguments);\n\t}\n\t/**\n\t * Create an iterator that generate frequency-domain spectrogram `Tensor`s from\n\t * microphone audio stream with browser's native FFT. This API only works in\n\t * browser environment when the device has microphone.\n\t *\n\t * Note: this code snippet only works when the device has a microphone. It will\n\t * request permission to open the microphone when running.\n\t * ```js\n\t * const mic = await tf.data.microphone({\n\t *   fftSize: 1024,\n\t *   columnTruncateLength: 232,\n\t *   numFramesPerSpectrogram: 43,\n\t *   sampleRateHz:44100,\n\t *   includeSpectrogram: true,\n\t *   includeWaveform: true\n\t * });\n\t * const audioData = await mic.capture();\n\t * const spectrogramTensor = audioData.spectrogram;\n\t * spectrogramTensor.print();\n\t * const waveformTensor = audioData.waveform;\n\t * waveformTensor.print();\n\t * mic.stop();\n\t * ```\n\t *\n\t * @param microphoneConfig A `MicrophoneConfig` object that contains\n\t *     configurations of reading audio data from microphone.\n\t *\n\t * @doc {\n\t *   heading: 'Data',\n\t *   subheading: 'Creation',\n\t *   namespace: 'data',\n\t *   ignoreCI: true\n\t *  }\n\t */\n\n\tfunction _webcam() {\n\t  _webcam = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(webcamVideoElement, webcamConfig) {\n\t    return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t      while (1) {\n\t        switch (_context3.prev = _context3.next) {\n\t          case 0:\n\t            return _context3.abrupt(\"return\", WebcamIterator.create(webcamVideoElement, webcamConfig));\n\n\t          case 1:\n\t          case \"end\":\n\t            return _context3.stop();\n\t        }\n\t      }\n\t    }, _callee3);\n\t  }));\n\t  return _webcam.apply(this, arguments);\n\t}\n\n\tfunction microphone(_x3) {\n\t  return _microphone.apply(this, arguments);\n\t}\n\n\tfunction _microphone() {\n\t  _microphone = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(microphoneConfig) {\n\t    return regeneratorRuntime.wrap(function _callee4$(_context4) {\n\t      while (1) {\n\t        switch (_context4.prev = _context4.next) {\n\t          case 0:\n\t            return _context4.abrupt(\"return\", MicrophoneIterator.create(microphoneConfig));\n\n\t          case 1:\n\t          case \"end\":\n\t            return _context4.stop();\n\t        }\n\t      }\n\t    }, _callee4);\n\t  }));\n\t  return _microphone.apply(this, arguments);\n\t}\n\n\t/** @license See the LICENSE file. */\n\t// This code is auto-generated, do not modify this file!\n\tvar version$4 = '2.8.3';\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tvar index$1 = {\n\t\t__proto__: null,\n\t\tarray: array,\n\t\tDataset: Dataset,\n\t\tzip: zip,\n\t\tCSVDataset: CSVDataset,\n\t\tTextLineDataset: TextLineDataset,\n\t\tcsv: csv,\n\t\tfunc: func,\n\t\tgenerator: generator,\n\t\tmicrophone: microphone,\n\t\twebcam: webcam,\n\t\tFileDataSource: FileDataSource,\n\t\tURLDataSource: URLDataSource,\n\t\tversion_data: version$4\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction assertNotComplex(tensor, opName) {\n\t  if (!Array.isArray(tensor)) {\n\t    tensor = [tensor];\n\t  }\n\n\t  tensor.forEach(function (t) {\n\t    if (t != null) {\n\t      assert(t.dtype !== 'complex64', function () {\n\t        return opName + \" does not support complex64 tensors in the CPU backend.\";\n\t      });\n\t    }\n\t  });\n\t}\n\n\tvar whereImpl$1 = whereImpl;\n\tvar MathBackendCPU = /*#__PURE__*/function (_KernelBackend) {\n\t  _inheritsLoose(MathBackendCPU, _KernelBackend);\n\n\t  function MathBackendCPU() {\n\t    var _this;\n\n\t    _this = _KernelBackend.call(this) || this;\n\t    _this.blockSize = 48;\n\t    _this.firstUse = true;\n\t    _this.data = new DataStorage(_assertThisInitialized(_this), engine());\n\t    return _this;\n\t  }\n\n\t  var _proto = MathBackendCPU.prototype;\n\n\t  _proto.write = function write(values, shape, dtype) {\n\t    if (this.firstUse) {\n\t      this.firstUse = false;\n\n\t      if (env().get('IS_NODE')) {\n\t        warn('\\n============================\\n' + 'Hi there 👋. Looks like you are running TensorFlow.js in ' + 'Node.js. To speed things up dramatically, install our node ' + 'backend, which binds to TensorFlow C++, by running ' + 'npm i @tensorflow/tfjs-node, ' + 'or npm i @tensorflow/tfjs-node-gpu if you have CUDA. ' + 'Then call require(\\'@tensorflow/tfjs-node\\'); (-gpu ' + 'suffix for CUDA) at the start of your program. ' + 'Visit https://github.com/tensorflow/tfjs-node for more details.' + '\\n============================');\n\t      }\n\t    }\n\n\t    var dataId = {};\n\t    this.data.set(dataId, {\n\t      values: values,\n\t      dtype: dtype,\n\t      refCount: 1\n\t    });\n\t    return dataId;\n\t  }\n\t  /**\n\t   * Create a data bucket in cpu backend.\n\t   * @param shape Shape of the `TensorInfo`.\n\t   * @param dtype DType of the `TensorInfo`.\n\t   * @param values The value of the `TensorInfo` stored as a flattened array.\n\t   */\n\t  ;\n\n\t  _proto.makeTensorInfo = function makeTensorInfo(shape, dtype, values) {\n\t    var outId;\n\n\t    if (dtype === 'string' && values != null && values.length > 0 && isString(values[0])) {\n\t      var encodedValues = values.map(function (d) {\n\t        return encodeString(d);\n\t      });\n\t      outId = this.write(encodedValues, shape, dtype);\n\t    } else {\n\t      outId = this.write(values, shape, dtype);\n\t    }\n\n\t    return {\n\t      dataId: outId,\n\t      shape: shape,\n\t      dtype: dtype\n\t    };\n\t  }\n\t  /** Increase refCount of a `TensorData`. */\n\t  ;\n\n\t  _proto.incRef = function incRef(dataId) {\n\t    var tensorData = this.data.get(dataId);\n\t    tensorData.refCount++;\n\t  }\n\t  /** Decrease refCount of a `TensorData`. */\n\t  ;\n\n\t  _proto.decRef = function decRef(dataId) {\n\t    if (this.data.has(dataId)) {\n\t      var tensorData = this.data.get(dataId);\n\t      tensorData.refCount--;\n\t    }\n\t  };\n\n\t  _proto.move = function move(dataId, values, shape, dtype) {\n\t    this.data.set(dataId, {\n\t      values: values,\n\t      dtype: dtype,\n\t      refCount: 1\n\t    });\n\t  };\n\n\t  _proto.numDataIds = function numDataIds() {\n\t    return this.data.numDataIds();\n\t  };\n\n\t  _proto.read = /*#__PURE__*/function () {\n\t    var _read = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(dataId) {\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              return _context.abrupt(\"return\", this.readSync(dataId));\n\n\t            case 1:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function read(_x) {\n\t      return _read.apply(this, arguments);\n\t    }\n\n\t    return read;\n\t  }();\n\n\t  _proto.readSync = function readSync(dataId) {\n\t    var _this$data$get = this.data.get(dataId),\n\t        dtype = _this$data$get.dtype,\n\t        complexTensorInfos = _this$data$get.complexTensorInfos;\n\n\t    if (dtype === 'complex64') {\n\t      var realValues = this.readSync(complexTensorInfos.real.dataId);\n\t      var imagValues = this.readSync(complexTensorInfos.imag.dataId);\n\t      return mergeRealAndImagArrays(realValues, imagValues);\n\t    }\n\n\t    return this.data.get(dataId).values;\n\t  };\n\n\t  _proto.bufferSync = function bufferSync(t) {\n\t    var data = this.readSync(t.dataId);\n\t    var decodedData = data;\n\n\t    if (t.dtype === 'string') {\n\t      try {\n\t        // Decode the bytes into string.\n\t        decodedData = data.map(function (d) {\n\t          return decodeString(d);\n\t        });\n\t      } catch (_a) {\n\t        throw new Error('Failed to decode encoded string bytes into utf-8');\n\t      }\n\t    }\n\n\t    return buffer(t.shape, t.dtype, decodedData);\n\t  };\n\n\t  _proto.makeOutput = function makeOutput(values, shape, dtype) {\n\t    var dataId = this.write(values, shape, dtype);\n\t    return engine().makeTensorFromDataId(dataId, shape, dtype, this);\n\t  };\n\n\t  _proto.disposeData = function disposeData(dataId) {\n\t    if (this.data.has(dataId)) {\n\t      var _this$data$get2 = this.data.get(dataId),\n\t          complexTensorInfos = _this$data$get2.complexTensorInfos;\n\n\t      if (complexTensorInfos != null) {\n\t        this.disposeData(complexTensorInfos.real.dataId);\n\t        this.disposeData(complexTensorInfos.imag.dataId);\n\t      }\n\n\t      this.data.delete(dataId);\n\t    }\n\t  };\n\n\t  _proto.disposeIntermediateTensorInfo = function disposeIntermediateTensorInfo(tensorInfo) {\n\t    var dataId = tensorInfo.dataId;\n\n\t    if (this.data.has(dataId)) {\n\t      var tensorData = this.data.get(dataId);\n\t      tensorData.refCount--;\n\n\t      if (tensorData.refCount < 1) {\n\t        this.disposeData(dataId);\n\t      }\n\t    }\n\t  };\n\n\t  _proto.time = /*#__PURE__*/function () {\n\t    var _time = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(f) {\n\t      var start, kernelMs;\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              start = now();\n\t              f();\n\t              kernelMs = now() - start;\n\t              return _context2.abrupt(\"return\", {\n\t                kernelMs: kernelMs\n\t              });\n\n\t            case 4:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2);\n\t    }));\n\n\t    function time(_x2) {\n\t      return _time.apply(this, arguments);\n\t    }\n\n\t    return time;\n\t  }();\n\n\t  _proto.memory = function memory() {\n\t    return {\n\t      // Unreliable due to automatic gc. The numbers above are cumulative.\n\t      unreliable: true,\n\t      reasons: ['The reported memory is an upper bound. Due to automatic garbage ' + 'collection, the true allocated memory may be less.']\n\t    };\n\t  };\n\n\t  _proto.where = function where(condition) {\n\t    assertNotComplex([condition], 'where');\n\t    var condVals = this.readSync(condition.dataId);\n\t    return whereImpl$1(condition.shape, condVals);\n\t  };\n\n\t  _proto.dispose = function dispose() {};\n\n\t  _proto.floatPrecision = function floatPrecision() {\n\t    return 32;\n\t  }\n\t  /** Returns the smallest representable number.  */\n\t  ;\n\n\t  _proto.epsilon = function epsilon() {\n\t    return _KernelBackend.prototype.epsilon.call(this);\n\t  };\n\n\t  return MathBackendCPU;\n\t}(KernelBackend);\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction simpleAbsImpl(vals) {\n\t  var resultValues = new Float32Array(vals.length);\n\n\t  for (var i = 0; i < vals.length; ++i) {\n\t    resultValues[i] = Math.abs(vals[i]);\n\t  }\n\n\t  return resultValues;\n\t}\n\tvar abs$9 = function abs(args) {\n\t  var x = args.inputs.x;\n\t  var cpuBackend = args.backend;\n\t  assertNotComplex(x, 'abs');\n\t  var resultValues = new Float32Array(sizeFromShape(x.shape));\n\t  var values = cpuBackend.data.get(x.dataId).values;\n\t  resultValues = simpleAbsImpl(values);\n\t  return cpuBackend.makeOutput(resultValues, x.shape, 'float32');\n\t};\n\tvar absConfig = {\n\t  kernelName: Abs,\n\t  backendName: 'cpu',\n\t  kernelFunc: abs$9\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Template that creates implementation for binary ops. Supports broadcast.\n\t */\n\n\tfunction createSimpleBinaryKernelImpl(op) {\n\t  return function (aShape, bShape, aVals, bVals, dtype) {\n\t    var newShape = assertAndGetBroadcastShape(aShape, bShape);\n\t    var resultRank = newShape.length;\n\t    var resultStrides = computeStrides(newShape);\n\t    var resultSize = sizeFromShape(newShape);\n\t    var result = getTypedArrayFromDType(dtype, resultSize);\n\t    var aRank = aShape.length;\n\t    var bRank = bShape.length;\n\t    var aStrides = computeStrides(aShape);\n\t    var bStrides = computeStrides(bShape);\n\t    var aBroadcastDims = getBroadcastDims(aShape, newShape);\n\t    var bBroadcastDims = getBroadcastDims(bShape, newShape);\n\n\t    if (aBroadcastDims.length + bBroadcastDims.length === 0) {\n\t      for (var i = 0; i < result.length; ++i) {\n\t        result[i] = op(aVals[i % aVals.length], bVals[i % bVals.length]);\n\t      }\n\t    } else {\n\t      var _loop = function _loop(_i) {\n\t        var loc = indexToLoc(_i, resultRank, resultStrides);\n\t        var aLoc = loc.slice(-aRank);\n\t        aBroadcastDims.forEach(function (d) {\n\t          return aLoc[d] = 0;\n\t        });\n\t        var aIndex = locToIndex(aLoc, aRank, aStrides);\n\t        var bLoc = loc.slice(-bRank);\n\t        bBroadcastDims.forEach(function (d) {\n\t          return bLoc[d] = 0;\n\t        });\n\t        var bIndex = locToIndex(bLoc, bRank, bStrides);\n\t        result[_i] = op(aVals[aIndex], bVals[bIndex]);\n\t      };\n\n\t      for (var _i = 0; _i < result.length; ++_i) {\n\t        _loop(_i);\n\t      }\n\t    }\n\n\t    return [result, newShape];\n\t  };\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction complex$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var real = inputs.real,\n\t      imag = inputs.imag;\n\t  var realVals = backend.data.get(real.dataId).values;\n\t  var imagVals = backend.data.get(imag.dataId).values;\n\t  var complexInfo = backend.makeTensorInfo(real.shape, 'complex64');\n\t  var complex = backend.data.get(complexInfo.dataId); // The complex tensor owns the underlying real and imag tensorInfos, only the\n\t  // complex tensor tracks refCount, when complexData is disposed the\n\t  // underlying tensorData will be disposed.\n\n\t  complex.complexTensorInfos = {\n\t    real: backend.makeTensorInfo(real.shape, 'float32', realVals),\n\t    imag: backend.makeTensorInfo(imag.shape, 'float32', imagVals)\n\t  };\n\t  return complexInfo;\n\t}\n\tvar complexConfig = {\n\t  kernelName: Complex,\n\t  backendName: 'cpu',\n\t  kernelFunc: complex$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Generates a tensorInfo with all zeros value.\n\t * @param backend cpu backend.\n\t * @param shape Shape for the zeros tensor.\n\t * @param dtype Optional. If set, the result has this dtype.\n\t */\n\n\tfunction zeros$2(backend, shape, dtype) {\n\t  if (dtype === void 0) {\n\t    dtype = 'float32';\n\t  }\n\n\t  if (dtype === 'complex64') {\n\t    var real = zeros$2(backend, shape, 'float32');\n\t    var imag = zeros$2(backend, shape, 'float32');\n\t    return complex$1({\n\t      inputs: {\n\t        real: real,\n\t        imag: imag\n\t      },\n\t      backend: backend\n\t    });\n\t  }\n\n\t  var values = makeZerosTypedArray(sizeFromShape(shape), dtype);\n\t  return backend.makeTensorInfo(shape, dtype, values);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction identity$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var x = inputs.x;\n\t  backend.incRef(x.dataId);\n\t  return {\n\t    dataId: x.dataId,\n\t    shape: x.shape,\n\t    dtype: x.dtype\n\t  };\n\t}\n\tvar identityConfig = {\n\t  kernelName: Identity,\n\t  backendName: 'cpu',\n\t  kernelFunc: identity$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction real$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var input = inputs.input;\n\t  var real = backend.data.get(input.dataId).complexTensorInfos.real;\n\t  var realVal = backend.data.get(real.dataId).values; // When complex tensor is disposed, its underlying parts will be disposed too.\n\t  // Make new tensor out of the real value of the complex. This makes sure the\n\t  // value is still accessible even if complex tensor is disposed.\n\n\t  return backend.makeTensorInfo(real.shape, real.dtype, realVal);\n\t}\n\tvar realConfig = {\n\t  kernelName: Real,\n\t  backendName: 'cpu',\n\t  kernelFunc: real$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction cast$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var dtype = attrs.dtype; // Casting to complex64.\n\n\t  if (dtype === 'complex64') {\n\t    if (x.dtype === 'complex64') {\n\t      return identity$1({\n\t        inputs: {\n\t          x: x\n\t        },\n\t        backend: backend\n\t      });\n\t    }\n\n\t    var zerosTensorInfo = zeros$2(backend, x.shape, x.dtype);\n\t    var floatX = cast$2({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        dtype: 'float32'\n\t      }\n\t    });\n\t    var result = complex$1({\n\t      inputs: {\n\t        real: floatX,\n\t        imag: zerosTensorInfo\n\t      },\n\t      backend: backend\n\t    });\n\t    backend.disposeIntermediateTensorInfo(zerosTensorInfo);\n\t    backend.disposeIntermediateTensorInfo(floatX);\n\t    return result;\n\t  } // Casting from complex64\n\n\n\t  if (x.dtype === 'complex64') {\n\t    var realPart = real$1({\n\t      inputs: {\n\t        input: x\n\t      },\n\t      backend: backend\n\t    });\n\n\t    var _result = cast$2({\n\t      inputs: {\n\t        x: realPart\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        dtype: dtype\n\t      }\n\t    });\n\n\t    backend.disposeIntermediateTensorInfo(realPart);\n\t    return _result;\n\t  }\n\n\t  if (!hasEncodingLoss(x.dtype, dtype)) {\n\t    // We don't change the underlying data, since we cast to higher\n\t    // precision.\n\t    var _result2 = identity$1({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend\n\t    });\n\n\t    return {\n\t      dataId: _result2.dataId,\n\t      shape: _result2.shape,\n\t      dtype: dtype\n\t    };\n\t  }\n\n\t  if (dtype === 'int32') {\n\t    var values = backend.data.get(x.dataId).values;\n\t    var resultValues = Int32Array.from(values);\n\t    return backend.makeTensorInfo(x.shape, 'int32', resultValues);\n\t  }\n\n\t  if (dtype === 'bool') {\n\t    // This is essentially the result of notEqual(x, 0). We avoid using\n\t    // kernel notEqual to avoid circular dependency, i.e. binary_utils ->\n\t    // cast -> notEqual -> binary_utils.\n\t    var xVals = backend.data.get(x.dataId).values;\n\t    var zero = toTypedArray([0], x.dtype);\n\n\t    var _createSimpleBinaryKe = createSimpleBinaryKernelImpl(function (a, b) {\n\t      return a !== b ? 1 : 0;\n\t    })(x.shape, [], xVals, zero, 'bool'),\n\t        resultData = _createSimpleBinaryKe[0],\n\t        resultShape = _createSimpleBinaryKe[1];\n\n\t    return backend.makeTensorInfo(resultShape, 'bool', resultData);\n\t  }\n\n\t  throw new Error(\"Error in Cast: failed to cast \" + x.dtype + \" to \" + dtype);\n\t}\n\tvar castConfig = {\n\t  kernelName: Cast,\n\t  backendName: 'cpu',\n\t  kernelFunc: cast$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Template that creates a `KernelFunc` for binary ops.\n\t * @param name Kernel name.\n\t * @param binaryKernelImpl A `SimpleBinaryKernelImpl` for the kernel.\n\t * @param binaryKernelComplexImpl Optional. If exists, represents a\n\t *     `ComplexBinaryKernelImpl` for the kernel, will be used when input dtype\n\t *     is `complex64`.\n\t * @param dtype Optional. If set, the result has this dtype. Otherwise, the\n\t *     result has the same dtype as the first input. This is mainly used in\n\t *     comparison kernels, such as Equal, Less, Greater, etc.\n\t */\n\n\tfunction binaryKernelFunc(name, simpleImpl, complexImpl, dtype) {\n\t  if (complexImpl == null) {\n\t    return function (_ref) {\n\t      var inputs = _ref.inputs,\n\t          backend = _ref.backend;\n\t      var a = inputs.a,\n\t          b = inputs.b;\n\t      var cpuBackend = backend;\n\t      assertNotComplex([a, b], name);\n\t      var aVals = cpuBackend.data.get(a.dataId).values;\n\t      var bVals = cpuBackend.data.get(b.dataId).values;\n\t      var $dtype = dtype || a.dtype;\n\n\t      var _simpleImpl = simpleImpl(a.shape, b.shape, aVals, bVals, $dtype),\n\t          resultData = _simpleImpl[0],\n\t          resultShape = _simpleImpl[1];\n\n\t      return cpuBackend.makeTensorInfo(resultShape, $dtype, resultData);\n\t    };\n\t  }\n\n\t  return function (_ref2) {\n\t    var inputs = _ref2.inputs,\n\t        backend = _ref2.backend;\n\t    var a = inputs.a,\n\t        b = inputs.b;\n\t    var cpuBackend = backend;\n\n\t    if (a.dtype === 'complex64' || b.dtype === 'complex64') {\n\t      var $aComplex = cast$2({\n\t        inputs: {\n\t          x: a\n\t        },\n\t        backend: cpuBackend,\n\t        attrs: {\n\t          dtype: 'complex64'\n\t        }\n\t      });\n\t      var $aComplexVals = cpuBackend.data.get($aComplex.dataId);\n\t      var aReal = $aComplexVals.complexTensorInfos.real;\n\t      var aImag = $aComplexVals.complexTensorInfos.imag;\n\t      var aRealVals = cpuBackend.data.get(aReal.dataId).values;\n\t      var aImagVals = cpuBackend.data.get(aImag.dataId).values;\n\t      var $bComplex = cast$2({\n\t        inputs: {\n\t          x: b\n\t        },\n\t        backend: cpuBackend,\n\t        attrs: {\n\t          dtype: 'complex64'\n\t        }\n\t      });\n\t      var $bComplexVals = cpuBackend.data.get($bComplex.dataId);\n\t      var bReal = $bComplexVals.complexTensorInfos.real;\n\t      var bImag = $bComplexVals.complexTensorInfos.imag;\n\t      var bRealVals = cpuBackend.data.get(bReal.dataId).values;\n\t      var bImagVals = cpuBackend.data.get(bImag.dataId).values;\n\n\t      var _complexImpl = complexImpl(a.shape, b.shape, aRealVals, aImagVals, bRealVals, bImagVals),\n\t          resultRealData = _complexImpl[0],\n\t          resultImagData = _complexImpl[1],\n\t          resultShape = _complexImpl[2];\n\n\t      var resultReal = cpuBackend.makeTensorInfo(resultShape, 'float32', resultRealData);\n\t      var resultImag = cpuBackend.makeTensorInfo(resultShape, 'float32', resultImagData);\n\t      var result = complex$1({\n\t        inputs: {\n\t          real: resultReal,\n\t          imag: resultImag\n\t        },\n\t        backend: cpuBackend\n\t      });\n\t      cpuBackend.disposeIntermediateTensorInfo($aComplex);\n\t      cpuBackend.disposeIntermediateTensorInfo($bComplex);\n\t      cpuBackend.disposeIntermediateTensorInfo(resultReal);\n\t      cpuBackend.disposeIntermediateTensorInfo(resultImag);\n\t      return result;\n\t    } else {\n\t      var aVals = cpuBackend.data.get(a.dataId).values;\n\t      var bVals = cpuBackend.data.get(b.dataId).values;\n\t      var $dtype = dtype || a.dtype;\n\n\t      var _simpleImpl2 = simpleImpl(a.shape, b.shape, aVals, bVals, $dtype),\n\t          resultData = _simpleImpl2[0],\n\t          _resultShape = _simpleImpl2[1];\n\n\t      return cpuBackend.makeTensorInfo(_resultShape, $dtype, resultData);\n\t    }\n\t  };\n\t}\n\t/**\n\t * Template that creates the complex type implementation for binary ops.\n\t * Supports broadcast.\n\t */\n\n\tfunction createComplexBinaryKernelImpl(op) {\n\t  return function (aShape, bShape, aRealVals, aImagVals, bRealVals, bImagVals) {\n\t    var resultShape = assertAndGetBroadcastShape(aShape, bShape);\n\t    var resultSize = sizeFromShape(resultShape);\n\t    var resultRank = resultShape.length;\n\t    var resultStrides = computeStrides(resultShape);\n\t    var resultRealVals = getTypedArrayFromDType('float32', resultSize);\n\t    var resultImagVals = getTypedArrayFromDType('float32', resultSize);\n\t    var aBroadcastDims = getBroadcastDims(aShape, resultShape);\n\t    var bBroadcastDims = getBroadcastDims(bShape, resultShape);\n\t    var aVals = mergeRealAndImagArrays(aRealVals, aImagVals);\n\t    var bVals = mergeRealAndImagArrays(bRealVals, bImagVals);\n\t    var aRank = aShape.length;\n\t    var aStrides = computeStrides(aShape);\n\t    var bRank = bShape.length;\n\t    var bStrides = computeStrides(bShape);\n\n\t    if (aBroadcastDims.length + bBroadcastDims.length === 0) {\n\t      for (var i = 0; i < resultRealVals.length; i++) {\n\t        var aIdx = i % aVals.length;\n\t        var bIdx = i % bVals.length;\n\t        var result = op(aVals[aIdx * 2], aVals[aIdx * 2 + 1], bVals[bIdx * 2], bVals[bIdx * 2 + 1]);\n\t        resultRealVals[i] = result.real;\n\t        resultImagVals[i] = result.imag;\n\t      }\n\t    } else {\n\t      var _loop = function _loop(_i) {\n\t        var loc = indexToLoc(_i, resultRank, resultStrides);\n\t        var aLoc = loc.slice(-aRank);\n\t        aBroadcastDims.forEach(function (d) {\n\t          return aLoc[d] = 0;\n\t        });\n\t        var aIndex = locToIndex(aLoc, aRank, aStrides);\n\t        var bLoc = loc.slice(-bRank);\n\t        bBroadcastDims.forEach(function (d) {\n\t          return bLoc[d] = 0;\n\t        });\n\t        var bIndex = locToIndex(bLoc, bRank, bStrides);\n\t        var opResult = op(aVals[aIndex * 2], aVals[aIndex * 2 + 1], bVals[bIndex * 2], bVals[bIndex * 2 + 1]);\n\t        resultRealVals[_i] = opResult.real;\n\t        resultImagVals[_i] = opResult.imag;\n\t      };\n\n\t      for (var _i = 0; _i < resultRealVals.length; _i++) {\n\t        _loop(_i);\n\t      }\n\t    }\n\n\t    return [resultRealVals, resultImagVals, resultShape];\n\t  };\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar addImpl = createSimpleBinaryKernelImpl(function (a, b) {\n\t  return a + b;\n\t});\n\tvar addComplexImpl = createComplexBinaryKernelImpl(function (aReal, aImag, bReal, bImag) {\n\t  return {\n\t    real: aReal + bReal,\n\t    imag: aImag + bImag\n\t  };\n\t});\n\tvar add$4 = binaryKernelFunc(Add, addImpl, addComplexImpl);\n\tvar addConfig = {\n\t  kernelName: Add,\n\t  backendName: 'cpu',\n\t  kernelFunc: add$4\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction bincountImpl(xVals, weightsVals, weightsDtype, weightsShape, size) {\n\t  var weightsSize = sizeFromShape(weightsShape);\n\t  var outVals = makeZerosTypedArray(size, weightsDtype);\n\n\t  for (var i = 0; i < xVals.length; i++) {\n\t    var value = xVals[i];\n\n\t    if (value < 0) {\n\t      throw new Error('Input x must be non-negative!');\n\t    }\n\n\t    if (value >= size) {\n\t      continue;\n\t    }\n\n\t    if (weightsSize > 0) {\n\t      outVals[value] += weightsVals[i];\n\t    } else {\n\t      outVals[value] += 1;\n\t    }\n\t  }\n\n\t  return outVals;\n\t}\n\tfunction bincountReduceImpl(xBuf, weightsBuf, size, binaryOutput) {\n\t  if (binaryOutput === void 0) {\n\t    binaryOutput = false;\n\t  }\n\n\t  var numRows = xBuf.shape[0];\n\t  var numCols = xBuf.shape[1];\n\t  var outBuf = buffer([numRows, size], weightsBuf.dtype);\n\n\t  for (var i = 0; i < numRows; i++) {\n\t    for (var j = 0; j < numCols; j++) {\n\t      var value = xBuf.get(i, j);\n\n\t      if (value < 0) {\n\t        throw new Error('Input x must be non-negative!');\n\t      }\n\n\t      if (value >= size) {\n\t        continue;\n\t      }\n\n\t      if (binaryOutput) {\n\t        outBuf.set(1, i, value);\n\t      } else {\n\t        if (weightsBuf.size > 0) {\n\t          outBuf.set(outBuf.get(i, value) + weightsBuf.get(i, j), i, value);\n\t        } else {\n\t          outBuf.set(outBuf.get(i, value) + 1, i, value);\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return outBuf;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Template that creates implementation for unary op.\n\t */\n\n\tfunction createSimpleUnaryImpl(op) {\n\t  return function (values, dtype, attrs) {\n\t    var newValues = getTypedArrayFromDType(dtype, values.length);\n\n\t    for (var i = 0; i < values.length; ++i) {\n\t      newValues[i] = op(values[i], attrs);\n\t    }\n\n\t    return newValues;\n\t  };\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Template that creates a `KernelFunc` for unary ops.\n\t * @param name Kernel name.\n\t * @param op A `SimpleUnaryOperation` for the kernel.\n\t * @param dtype Optional. If set, the result has this dtype. Otherwise, the\n\t *     result has the same dtype as the input. This is mainly used in certain\n\t *     kernels that return bool type, such as isFinite, isInf, etc.\n\t */\n\n\tfunction unaryKernelFunc(name, op, dtype) {\n\t  return function (_ref) {\n\t    var inputs = _ref.inputs,\n\t        attrs = _ref.attrs,\n\t        backend = _ref.backend;\n\t    var x = inputs.x;\n\t    assertNotComplex(x, name);\n\n\t    if (x.dtype === 'string' || dtype === 'string') {\n\t      throw new Error('unaryKernelFunc does not support string input/output');\n\t    }\n\n\t    var cpuBackend = backend;\n\t    var values = cpuBackend.data.get(x.dataId).values;\n\t    var xSize = sizeFromShape(x.shape);\n\t    var $dtype = dtype || x.dtype;\n\t    var newValues = getArrayFromDType($dtype, xSize);\n\n\t    for (var i = 0; i < xSize; ++i) {\n\t      newValues[i] = op(values[i], attrs);\n\t    }\n\n\t    return cpuBackend.makeTensorInfo(x.shape, $dtype, newValues);\n\t  };\n\t}\n\t/**\n\t * Template that creates a `KernelFunc` for unary ops from the given\n\t * `SimpleUnaryImpl`..\n\t * @param name Kernel name.\n\t * @param unaryImpl A `SimpleUnaryImpl` that implements the op.\n\t * @param dtype Optional. If set, the result has this dtype. Otherwise, the\n\t *     result has the same dtype as the input. This is mainly used in certain\n\t *     kernels that return bool type, such as isFinite, isInf, etc.\n\t */\n\n\tfunction unaryKernelFuncFromImpl(name, unaryImpl, dtype) {\n\t  return function (_ref2) {\n\t    var inputs = _ref2.inputs,\n\t        attrs = _ref2.attrs,\n\t        backend = _ref2.backend;\n\t    var x = inputs.x;\n\t    assertNotComplex(x, name);\n\n\t    if (x.dtype === 'string' || dtype === 'string') {\n\t      throw new Error('unaryKernelFunc does not support string input/output');\n\t    }\n\n\t    var cpuBackend = backend;\n\t    var values = cpuBackend.data.get(x.dataId).values;\n\t    var $dtype = dtype || x.dtype;\n\t    var newValues = unaryImpl(values, $dtype, attrs);\n\t    return cpuBackend.makeTensorInfo(x.shape, $dtype, newValues);\n\t  };\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ceilImpl = createSimpleUnaryImpl(function (xi) {\n\t  return Math.ceil(xi);\n\t});\n\tvar ceil$4 = unaryKernelFuncFromImpl(Ceil, ceilImpl);\n\tvar ceilConfig = {\n\t  kernelName: Ceil,\n\t  backendName: 'cpu',\n\t  kernelFunc: ceil$4\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction concatImpl(inputs, outShape, dtype, simplyConcat) {\n\t  var outVals = getArrayFromDType(dtype, sizeFromShape(outShape));\n\n\t  if (simplyConcat && dtype !== 'string') {\n\t    // Use built-in TypedArray.set() method for speed.\n\t    var offset = 0;\n\t    inputs.forEach(function (input) {\n\t      var size = sizeFromShape(input.shape);\n\t      outVals.set(input.vals, offset);\n\t      offset += size;\n\t    });\n\t  } else {\n\t    var colOffset = 0;\n\t    inputs.forEach(function (input) {\n\t      var decodedData = dtype === 'string' ? fromUint8ToStringArray(input.vals) : input.vals;\n\t      var tIdx = 0;\n\n\t      for (var row = 0; row < input.shape[0]; ++row) {\n\t        var resIdx = row * outShape[1] + colOffset;\n\n\t        for (var col = 0; col < input.shape[1]; ++col) {\n\t          outVals[resIdx + col] = decodedData[tIdx++];\n\t        }\n\t      }\n\n\t      colOffset += input.shape[1];\n\t    });\n\t  }\n\n\t  return outVals;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar expImpl = createSimpleUnaryImpl(function (xi) {\n\t  return Math.exp(xi);\n\t});\n\tvar exp$4 = unaryKernelFuncFromImpl(Exp, expImpl);\n\tvar expConfig = {\n\t  kernelName: Exp,\n\t  backendName: 'cpu',\n\t  kernelFunc: exp$4\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar expm1Impl = createSimpleUnaryImpl(function (xi) {\n\t  return Math.expm1(xi);\n\t});\n\tvar expm1$1 = unaryKernelFuncFromImpl(Expm1, expm1Impl);\n\tvar expm1Config = {\n\t  kernelName: Expm1,\n\t  backendName: 'cpu',\n\t  kernelFunc: expm1$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar floorImpl = createSimpleUnaryImpl(function (xi) {\n\t  return Math.floor(xi);\n\t});\n\tvar floor$b = unaryKernelFuncFromImpl(Floor, floorImpl);\n\tvar floorConfig = {\n\t  kernelName: Floor,\n\t  backendName: 'cpu',\n\t  kernelFunc: floor$b\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction gatherV2Impl(xBuf, indicesBuf, flattenOutputShape) {\n\t  var outBuf = buffer(flattenOutputShape, xBuf.dtype);\n\n\t  for (var i = 0; i < outBuf.size; ++i) {\n\t    var newLoc = outBuf.indexToLoc(i);\n\t    var originalLoc = newLoc.slice();\n\t    var batchIdx = originalLoc[0];\n\t    var indicesIdx = originalLoc[2];\n\t    var indicesIndex = indicesBuf.locToIndex([batchIdx, indicesIdx]);\n\t    originalLoc[2] = indicesBuf.values[indicesIndex];\n\t    var originalIndex = xBuf.locToIndex(originalLoc);\n\t    outBuf.values[i] = xBuf.values[originalIndex];\n\t  }\n\n\t  return outBuf;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar greaterImpl = createSimpleBinaryKernelImpl(function (a, b) {\n\t  return a > b ? 1 : 0;\n\t});\n\tvar greater$2 = binaryKernelFunc(Greater, greaterImpl, null\n\t/* complexImpl */\n\t, 'bool');\n\tvar greaterConfig = {\n\t  kernelName: Greater,\n\t  backendName: 'cpu',\n\t  kernelFunc: greater$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar lessImpl = createSimpleBinaryKernelImpl(function (a, b) {\n\t  return a < b ? 1 : 0;\n\t});\n\tvar less$2 = binaryKernelFunc(Less, lessImpl, null\n\t/* complexImpl */\n\t, 'bool');\n\tvar lessConfig = {\n\t  kernelName: Less,\n\t  backendName: 'cpu',\n\t  kernelFunc: less$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction linSpaceImpl(start, stop, num) {\n\t  var step = (stop - start) / (num - 1);\n\t  var values = makeZerosTypedArray(num, 'float32');\n\t  values[0] = start;\n\n\t  for (var i = 1; i < values.length; i++) {\n\t    values[i] = values[i - 1] + step;\n\t  }\n\n\t  return values;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar logImpl = createSimpleUnaryImpl(function (xi) {\n\t  return Math.log(xi);\n\t});\n\tvar log$b = unaryKernelFuncFromImpl(Log, logImpl);\n\tvar logConfig = {\n\t  kernelName: Log,\n\t  backendName: 'cpu',\n\t  kernelFunc: log$b\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction maxImpl(aVals, reduceSize, outShape, dtype) {\n\t  var vals = getTypedArrayFromDType(dtype, sizeFromShape(outShape));\n\n\t  for (var i = 0; i < vals.length; ++i) {\n\t    var offset = i * reduceSize;\n\t    var max = aVals[offset];\n\n\t    for (var j = 0; j < reduceSize; ++j) {\n\t      var value = aVals[offset + j];\n\n\t      if (value > max) {\n\t        max = value;\n\t      }\n\t    }\n\n\t    vals[i] = max;\n\t  }\n\n\t  return vals;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar maximumImpl = createSimpleBinaryKernelImpl(function (aValue, bValue) {\n\t  return Math.max(aValue, bValue);\n\t});\n\tvar maximum$3 = binaryKernelFunc(Maximum, maximumImpl);\n\tvar maximumConfig = {\n\t  kernelName: Maximum,\n\t  backendName: 'cpu',\n\t  kernelFunc: maximum$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar minimumImpl = createSimpleBinaryKernelImpl(function (aValue, bValue) {\n\t  return Math.min(aValue, bValue);\n\t});\n\tvar minimum$3 = binaryKernelFunc(Minimum, minimumImpl);\n\tvar minimumConfig = {\n\t  kernelName: Minimum,\n\t  backendName: 'cpu',\n\t  kernelFunc: minimum$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar multiplyImpl = createSimpleBinaryKernelImpl(function (aValue, bValue) {\n\t  return aValue * bValue;\n\t});\n\tvar multiplyComplexImpl = createComplexBinaryKernelImpl(function (aReal, aImag, bReal, bImag) {\n\t  return {\n\t    real: aReal * bReal - aImag * bImag,\n\t    imag: aReal * bImag + aImag * bReal\n\t  };\n\t});\n\tvar multiply$2 = binaryKernelFunc(Multiply, multiplyImpl, multiplyComplexImpl);\n\tvar multiplyConfig = {\n\t  kernelName: Multiply,\n\t  backendName: 'cpu',\n\t  kernelFunc: multiply$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction negImpl(xVals, xShape, xDtype) {\n\t  var minusOne = createScalarValue(-1, xDtype);\n\t  return multiplyImpl([], xShape, minusOne, xVals, xDtype);\n\t}\n\tfunction neg$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var x = inputs.x;\n\t  assertNotComplex(x, 'neg');\n\t  var xVals = backend.data.get(x.dataId).values;\n\n\t  var _negImpl = negImpl(xVals, x.shape, x.dtype),\n\t      res = _negImpl[0],\n\t      newShape = _negImpl[1];\n\n\t  return backend.makeTensorInfo(newShape, x.dtype, res);\n\t}\n\tvar negConfig = {\n\t  kernelName: Neg,\n\t  backendName: 'cpu',\n\t  kernelFunc: neg$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar notEqualImpl = createSimpleBinaryKernelImpl(function (a, b) {\n\t  return a !== b ? 1 : 0;\n\t});\n\tvar notEqual$1 = binaryKernelFunc(NotEqual, notEqualImpl, null\n\t/* complexOp */\n\t, 'bool');\n\tvar notEqualConfig = {\n\t  kernelName: NotEqual,\n\t  backendName: 'cpu',\n\t  kernelFunc: notEqual$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction transposeImpl(xVals, xShape, dtype, perm, newShape) {\n\t  var xRank = xShape.length;\n\t  var xSize = sizeFromShape(xShape);\n\t  var xStrides = computeStrides(xShape);\n\t  var newStrides = computeStrides(newShape);\n\t  var result = getTypedArrayFromDType(dtype, sizeFromShape(newShape));\n\n\t  for (var i = 0; i < xSize; ++i) {\n\t    var loc = indexToLoc(i, xRank, xStrides); // Permute location.\n\n\t    var newLoc = new Array(loc.length);\n\n\t    for (var _i = 0; _i < newLoc.length; _i++) {\n\t      newLoc[_i] = loc[perm[_i]];\n\t    }\n\n\t    var newIndex = locToIndex(newLoc, xRank, newStrides);\n\t    result[newIndex] = xVals[i];\n\t  }\n\n\t  return result;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction transpose$1(args) {\n\t  var inputs = args.inputs,\n\t      attrs = args.attrs,\n\t      backend = args.backend;\n\t  var x = inputs.x;\n\t  var perm = attrs.perm;\n\t  assertNotComplex(x, 'transpose');\n\t  var xRank = x.shape.length;\n\t  var newShape = new Array(xRank);\n\n\t  for (var i = 0; i < newShape.length; i++) {\n\t    newShape[i] = x.shape[perm[i]];\n\t  }\n\n\t  var values = backend.data.get(x.dataId).values;\n\t  var result = transposeImpl(values, x.shape, x.dtype, perm, newShape);\n\t  var dataId = backend.write(result, newShape, x.dtype);\n\t  return {\n\t    dataId: dataId,\n\t    shape: newShape,\n\t    dtype: x.dtype\n\t  };\n\t}\n\tvar transposeConfig = {\n\t  kernelName: Transpose,\n\t  backendName: 'cpu',\n\t  kernelFunc: transpose$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction prodImpl(xShape, xDtype, xVals, reductionAxes) {\n\t  var _backend_util$compute = computeOutAndReduceShapes(xShape, reductionAxes),\n\t      outShape = _backend_util$compute[0],\n\t      reduceShape = _backend_util$compute[1];\n\n\t  var outDtype = upcastType(xDtype, 'int32');\n\t  var outVals = makeZerosTypedArray(sizeFromShape(outShape), outDtype);\n\t  var reduceSize = sizeFromShape(reduceShape);\n\n\t  for (var i = 0; i < outVals.length; ++i) {\n\t    var offset = i * reduceSize;\n\t    var _prod = 1;\n\n\t    for (var j = 0; j < reduceSize; ++j) {\n\t      _prod *= xVals[offset + j];\n\t    }\n\n\t    outVals[i] = _prod;\n\t  }\n\n\t  return {\n\t    outVals: outVals,\n\t    outShape: outShape,\n\t    outDtype: outDtype\n\t  };\n\t}\n\tfunction prod$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var axis = attrs.axis,\n\t      keepDims = attrs.keepDims;\n\t  assertNotComplex(x, 'prod');\n\t  var xRank = x.shape.length;\n\t  var axes = parseAxisParam(axis, x.shape);\n\t  var permutation = getAxesPermutation(axes, xRank);\n\t  var reductionAxes = axes;\n\t  var permutedX = x;\n\t  var intermediateTensorInfos = [];\n\n\t  if (permutation != null) {\n\t    permutedX = transpose$1({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        perm: permutation\n\t      }\n\t    });\n\t    intermediateTensorInfos.push(permutedX);\n\t    reductionAxes = getInnerMostAxes(reductionAxes.length, xRank);\n\t  }\n\n\t  var xVals = backend.data.get(permutedX.dataId).values;\n\n\t  var _prodImpl = prodImpl(permutedX.shape, permutedX.dtype, xVals, reductionAxes),\n\t      outVals = _prodImpl.outVals,\n\t      outShape = _prodImpl.outShape,\n\t      outDtype = _prodImpl.outDtype;\n\n\t  var resultShape = outShape;\n\n\t  if (keepDims) {\n\t    resultShape = expandShapeToKeepDim(outShape, axes);\n\t  }\n\n\t  intermediateTensorInfos.forEach(function (t) {\n\t    return backend.disposeIntermediateTensorInfo(t);\n\t  });\n\t  return backend.makeTensorInfo(resultShape, outDtype, outVals);\n\t}\n\tvar prodConfig = {\n\t  kernelName: Prod,\n\t  backendName: 'cpu',\n\t  kernelFunc: prod$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction rangeImpl(start, stop, step, dtype) {\n\t  var sameStartStop = start === stop;\n\t  var increasingRangeNegativeStep = start < stop && step < 0;\n\t  var decreasingRangePositiveStep = stop < start && step > 1;\n\n\t  if (sameStartStop || increasingRangeNegativeStep || decreasingRangePositiveStep) {\n\t    return makeZerosTypedArray(0, dtype);\n\t  }\n\n\t  var numElements = Math.abs(Math.ceil((stop - start) / step));\n\t  var values = makeZerosTypedArray(numElements, dtype);\n\n\t  if (stop < start && step === 1) {\n\t    // Auto adjust the step's sign if it hasn't been set\n\t    // (or was set to 1)\n\t    step = -1;\n\t  }\n\n\t  values[0] = start;\n\n\t  for (var i = 1; i < values.length; i++) {\n\t    values[i] = values[i - 1] + step;\n\t  }\n\n\t  return values;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar rsqrtImpl = createSimpleUnaryImpl(function (xi) {\n\t  return 1 / Math.sqrt(xi);\n\t});\n\tvar rsqrt$1 = unaryKernelFuncFromImpl(Rsqrt, rsqrtImpl);\n\tvar rsqrtConfig = {\n\t  kernelName: Rsqrt,\n\t  backendName: 'cpu',\n\t  kernelFunc: rsqrt$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction sliceImpl(vals, begin, size, shape, dtype) {\n\t  var isContinous = isSliceContinous(shape, begin, size);\n\t  var length = sizeFromShape(size);\n\t  var xStrides = computeStrides(shape);\n\n\t  if (isContinous) {\n\t    var flatOffset = computeFlatOffset(begin, xStrides);\n\n\t    if (dtype === 'string') {\n\t      return vals.slice(flatOffset, flatOffset + length);\n\t    }\n\n\t    return vals.subarray(flatOffset, flatOffset + length);\n\t  }\n\n\t  var decodedData = dtype === 'string' ? fromUint8ToStringArray(vals) : vals;\n\t  var inBuf = buffer(shape, dtype, decodedData);\n\t  var outBuf = buffer(size, dtype);\n\n\t  for (var i = 0; i < outBuf.size; ++i) {\n\t    var outLoc = outBuf.indexToLoc(i);\n\t    var inLoc = outLoc.map(function (idx, j) {\n\t      return idx + begin[j];\n\t    });\n\t    outBuf.set.apply(outBuf, [inBuf.get.apply(inBuf, inLoc)].concat(outLoc));\n\t  }\n\n\t  if (dtype === 'string') {\n\t    return fromStringArrayToUint8(outBuf.values);\n\t  }\n\n\t  return outBuf.values;\n\t}\n\tfunction slice$3(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var begin = attrs.begin,\n\t      size = attrs.size;\n\t  assertNotComplex(x, 'slice');\n\n\t  var _slice_util$parseSlic = parseSliceParams(x, begin, size),\n\t      $begin = _slice_util$parseSlic[0],\n\t      $size = _slice_util$parseSlic[1];\n\n\t  assertParamsValid(x, $begin, $size);\n\t  var vals = backend.data.get(x.dataId).values;\n\t  var outVals = sliceImpl(vals, $begin, $size, x.shape, x.dtype);\n\t  return backend.makeTensorInfo($size, x.dtype, outVals);\n\t}\n\tvar sliceConfig = {\n\t  kernelName: Slice,\n\t  backendName: 'cpu',\n\t  kernelFunc: slice$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar squaredDifferenceImpl = createSimpleBinaryKernelImpl(function (a, b) {\n\t  var diff = a - b;\n\t  return diff * diff;\n\t});\n\tvar squaredDifference$1 = binaryKernelFunc(SquaredDifference, squaredDifferenceImpl);\n\tvar squaredDifferenceConfig = {\n\t  kernelName: SquaredDifference,\n\t  backendName: 'cpu',\n\t  kernelFunc: squaredDifference$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction stridedSliceImpl(outShape, xBuf, strides, begin) {\n\t  var outBuf = buffer(outShape, xBuf.dtype);\n\n\t  for (var i = 0; i < outBuf.size; i++) {\n\t    var loc = outBuf.indexToLoc(i);\n\t    var newLoc = new Array(loc.length);\n\n\t    for (var j = 0; j < newLoc.length; j++) {\n\t      newLoc[j] = loc[j] * strides[j] + begin[j];\n\t    }\n\n\t    outBuf.set.apply(outBuf, [xBuf.get.apply(xBuf, newLoc)].concat(loc));\n\t  }\n\n\t  return outBuf;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar subImpl = createSimpleBinaryKernelImpl(function (aValue, bValue) {\n\t  return aValue - bValue;\n\t});\n\tvar subComplexImpl = createComplexBinaryKernelImpl(function (aReal, aImag, bReal, bImag) {\n\t  return {\n\t    real: aReal - bReal,\n\t    imag: aImag - bImag\n\t  };\n\t});\n\tvar sub$1 = binaryKernelFunc(Sub, subImpl, subComplexImpl);\n\tvar subConfig = {\n\t  kernelName: Sub,\n\t  backendName: 'cpu',\n\t  kernelFunc: sub$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * An implementation of the tile kernel shared between webgl and cpu for string\n\t * tensors only.\n\t */\n\n\tfunction tileImpl(xBuf, reps) {\n\t  var newShape = new Array(xBuf.rank);\n\n\t  for (var i = 0; i < newShape.length; i++) {\n\t    newShape[i] = xBuf.shape[i] * reps[i];\n\t  }\n\n\t  var result = buffer(newShape, xBuf.dtype);\n\n\t  for (var _i = 0; _i < result.values.length; ++_i) {\n\t    var newLoc = result.indexToLoc(_i);\n\t    var originalLoc = new Array(xBuf.rank);\n\n\t    for (var j = 0; j < originalLoc.length; j++) {\n\t      originalLoc[j] = newLoc[j] % xBuf.shape[j];\n\t    }\n\n\t    var originalIndex = xBuf.locToIndex(originalLoc);\n\t    result.values[_i] = xBuf.values[originalIndex];\n\t  }\n\n\t  return result;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction topKImpl(x, xShape, xDtype, k, sorted) {\n\t  // Reshape into a 2d tensor [batch, lastDim] and compute topk along lastDim.\n\t  var lastDim = xShape[xShape.length - 1];\n\t  var batch = x.length / lastDim,\n\t      size = lastDim;\n\t  var allTopKVals = getTypedArrayFromDType(xDtype, batch * k);\n\t  var allTopKIndices = getTypedArrayFromDType('int32', batch * k);\n\n\t  for (var b = 0; b < batch; b++) {\n\t    var offset = b * size;\n\t    var vals = x.subarray(offset, offset + size);\n\t    var valAndInd = [];\n\n\t    for (var i = 0; i < vals.length; i++) {\n\t      valAndInd.push({\n\t        value: vals[i],\n\t        index: i\n\t      });\n\t    }\n\n\t    valAndInd.sort(function (a, b) {\n\t      return b.value - a.value;\n\t    });\n\t    var outOffset = b * k;\n\t    var topKVals = allTopKVals.subarray(outOffset, outOffset + k);\n\t    var topKIndices = allTopKIndices.subarray(outOffset, outOffset + k);\n\n\t    for (var _i = 0; _i < k; _i++) {\n\t      topKVals[_i] = valAndInd[_i].value;\n\t      topKIndices[_i] = valAndInd[_i].index;\n\t    }\n\t  } // Reshape back to the original input shape, except that the last\n\t  // dimension is k.\n\n\n\t  var outputShape = xShape.slice();\n\t  outputShape[outputShape.length - 1] = k;\n\t  return [buffer(outputShape, xDtype, allTopKVals), buffer(outputShape, 'int32', allTopKIndices)];\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction uniqueImpl(values, axis, shape, dtype) {\n\t  // Normalize and validate axis.\n\t  var $axis = parseAxisParam(axis, shape)[0]; // Calculate the new shape that is suitable for extracting data along the\n\t  // given axis.\n\t  //\n\t  // The rank is 3.\n\t  // The size of the 1st dimension is the size of all the axes < the given axis.\n\t  // The size of the 2nd dimension is the same as the size of the given axis.\n\t  // The size of the 3rd dimension is the size of all the axes > the given axis.\n\t  //\n\t  // For example, for a 4D tensor with shape=[2, 3, 5, 4] and axis=2, the\n\t  // newShape would be: [2*3, 5, 4].\n\t  //\n\t  // Note that this is not the final output shape. This will be the shape for an\n\t  // intermediate TensorBuffer (see inputBuffer below) to allow us to extract\n\t  // values along the given axis. To demonstrate how it works, consider the\n\t  // following example:\n\t  //\n\t  // Input: a 3D tensor, with shape [1, 2, 3]\n\t  // [\n\t  //   [\n\t  //      [1,2,3],\n\t  //      [4,5,6]\n\t  //   ]\n\t  // ]\n\t  // Axis: 2 (the last axis).\n\t  // Along axis 2, we expect to extract 3 tensors: [1,4], [2,5], [3,6].\n\t  //\n\t  // For this example, newShape would be: [2, 3, 1], where 2 is calculated from\n\t  // 1*2. The re-shaped data would look like:\n\t  //\n\t  // [\n\t  //   [\n\t  //     [1], [2], [3]\n\t  //   ],\n\t  //   [\n\t  //     [4], [5], [6]\n\t  //   ]\n\t  // ]\n\t  //\n\t  // Then, we can construct a 3-level nested loop by the following dimension\n\t  // order to extract the values along the axis (dimension1):\n\t  // i: dimension1       // 0,1,2 (newShape[1])\n\t  //   m: dimension0     // 0,1   (newShape[0])\n\t  //     n: dimension2   // 0     (newShape[2])\n\t  //\n\t  //                       m, i, n\n\t  //                      ---------\n\t  // Iteration 0: data at [0, 0, 0] => \"1\"\n\t  // Iteration 1: data at [1, 0, 0] => \"4\"\n\t  // We got [1,4].\n\t  // Iteration 2: data at [0, 1, 0] => \"2\"\n\t  // Iteration 3: data at [1, 1, 0] => \"5\"\n\t  // We got [2,5].\n\t  // Iteration 4: data at [0, 2, 0] => \"3\"\n\t  // Iteration 5: data at [1, 2, 0] => \"6\"\n\t  // We got [3,6].\n\n\t  var newShape = [1, shape[0], 1];\n\n\t  for (var i = 0; i < $axis; i++) {\n\t    newShape[0] *= shape[i];\n\t  }\n\n\t  newShape[1] = shape[$axis];\n\n\t  for (var _i = $axis + 1; _i < shape.length; _i++) {\n\t    newShape[2] *= shape[_i];\n\t  } // A map from unique elements (their string representations) to their values\n\t  // in \"indices\" (below).\n\n\n\t  var uniqueElements = {}; // The indices of each unique element in the original tensor along the given\n\t  // axis. It is 1D and has the same size as the given axis.\n\n\t  var indices = new Int32Array(shape[$axis]); // Create a buffer so we can easily extract value at a given location.\n\n\t  var inputBuffer = new TensorBuffer(newShape, dtype, values); // The indices along the given axis that have unique elements. This is a\n\t  // de-duped version of \"indices\" above.\n\n\t  var uniqueIndices = [];\n\t  var is1DTensor = newShape[0] === 1 && newShape[2] === 1;\n\n\t  for (var _i2 = 0; _i2 < shape[$axis]; _i2++) {\n\t    // Extract values along the axis.\n\t    var element = void 0;\n\n\t    if (is1DTensor) {\n\t      // Fast path for 1D tensor input.\n\t      element = values[_i2].toString();\n\t    } else {\n\t      var axisValues = [];\n\n\t      for (var m = 0; m < newShape[0]; m++) {\n\t        for (var n = 0; n < newShape[2]; n++) {\n\t          axisValues.push(inputBuffer.get(m, _i2, n));\n\t        }\n\t      }\n\n\t      element = axisValues.join(',');\n\t    } // Dedup and update various indices.\n\n\n\t    if (uniqueElements[element] !== undefined) {\n\t      indices[_i2] = uniqueElements[element];\n\t    } else {\n\t      var uniqueIndex = Object.keys(uniqueElements).length;\n\t      uniqueElements[element] = uniqueIndex;\n\t      indices[_i2] = uniqueIndex;\n\t      uniqueIndices.push(_i2);\n\t    }\n\t  } // Now we know where each of the unique elements are located along the axis\n\t  // (uniqueIndices). Extract them from input buffer and store them in the\n\t  // output buffer.\n\n\n\t  var outputTmpShape = newShape.slice();\n\t  outputTmpShape[1] = Object.keys(uniqueElements).length;\n\t  var outputBuffer = new TensorBuffer(outputTmpShape, dtype);\n\t  uniqueIndices.forEach(function (uniqueElementIndex, i) {\n\t    for (var _m = 0; _m < newShape[0]; _m++) {\n\t      for (var _n = 0; _n < newShape[2]; _n++) {\n\t        outputBuffer.set(inputBuffer.get(_m, uniqueElementIndex, _n), _m, i, _n);\n\t      }\n\t    }\n\t  }); // The output shape can be calculated from the input shape with the size of\n\t  // the given axis replaced by the number of unique elements along that axis.\n\n\t  var outputShape = shape.slice();\n\t  outputShape[$axis] = outputTmpShape[1];\n\t  return {\n\t    outputValues: outputBuffer.values,\n\t    outputShape: outputShape,\n\t    indices: indices\n\t  };\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\t/** @license See the LICENSE file. */\n\t// This code is auto-generated, do not modify this file!\n\tvar version$5 = '2.8.3';\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tregisterBackend('cpu', function () {\n\t  return new MathBackendCPU();\n\t}, 1\n\t/* priority */\n\t);\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar elu$3 = unaryKernelFunc(Elu, function (xi) {\n\t  return xi >= 0 ? xi : Math.exp(xi) - 1;\n\t});\n\tvar eluConfig = {\n\t  kernelName: Elu,\n\t  backendName: 'cpu',\n\t  kernelFunc: elu$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction leakyRelu$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var alpha = attrs.alpha;\n\t  assertNotComplex([x], 'leakyRelu');\n\t  var xSize = sizeFromShape(x.shape);\n\t  var xVals = backend.data.get(x.dataId).values;\n\t  var outVals = getTypedArrayFromDType('float32', xSize);\n\n\t  for (var i = 0; i < xVals.length; i++) {\n\t    outVals[i] = xVals[i] < 0 ? alpha * xVals[i] : xVals[i];\n\t  }\n\n\t  return backend.makeTensorInfo(x.shape, 'float32', outVals);\n\t}\n\tvar leakyReluConfig = {\n\t  kernelName: LeakyRelu,\n\t  backendName: 'cpu',\n\t  kernelFunc: leakyRelu$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar preluImpl = createSimpleBinaryKernelImpl(function (xValue, aValue) {\n\t  return xValue < 0 ? aValue * xValue : xValue;\n\t});\n\tfunction prelu$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var x = inputs.x,\n\t      alpha = inputs.alpha;\n\t  assertNotComplex([x, alpha], 'prelu');\n\t  var aVals = backend.data.get(x.dataId).values;\n\t  var bVals = backend.data.get(alpha.dataId).values;\n\n\t  var _preluImpl = preluImpl(x.shape, alpha.shape, aVals, bVals, x.dtype),\n\t      resultData = _preluImpl[0],\n\t      resultShape = _preluImpl[1];\n\n\t  return backend.makeTensorInfo(resultShape, x.dtype, resultData);\n\t}\n\tvar preluConfig = {\n\t  kernelName: Prelu,\n\t  backendName: 'cpu',\n\t  kernelFunc: prelu$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar relu$1 = unaryKernelFunc(Relu, function (xi) {\n\t  return Math.max(0, xi);\n\t});\n\tvar reluConfig = {\n\t  kernelName: Relu,\n\t  backendName: 'cpu',\n\t  kernelFunc: relu$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar relu6$1 = unaryKernelFunc(Relu6, function (xi) {\n\t  return Math.min(Math.max(0, xi), 6);\n\t});\n\tvar relu6Config = {\n\t  kernelName: Relu6,\n\t  backendName: 'cpu',\n\t  kernelFunc: relu6$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction applyActivation$1(backend, x, activation, preluActivationWeights, leakyreluAlpha) {\n\t  if (activation === 'linear') {\n\t    return identity$1({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend\n\t    });\n\t  } else if (activation === 'relu') {\n\t    return relu$1({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend\n\t    });\n\t  } else if (activation === 'elu') {\n\t    return elu$3({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend\n\t    });\n\t  } else if (activation === 'relu6') {\n\t    return relu6$1({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend\n\t    });\n\t  } else if (activation === 'prelu') {\n\t    return prelu$2({\n\t      inputs: {\n\t        x: x,\n\t        alpha: preluActivationWeights\n\t      },\n\t      backend: backend\n\t    });\n\t  } else if (activation === 'leakyrelu') {\n\t    return leakyRelu$1({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        alpha: leakyreluAlpha\n\t      }\n\t    });\n\t  }\n\n\t  throw new Error(\"Activation \" + activation + \" has not been implemented for the CPU backend.\");\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction reshape$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var shape = attrs.shape;\n\t  var xSize = sizeFromShape(x.shape);\n\t  var $shape = inferFromImplicitShape(shape, xSize);\n\t  var $xSize = sizeFromShape($shape);\n\t  assert(xSize === $xSize, function () {\n\t    return \"The new shape (\" + $shape + \") has \" + $xSize + \" elements and the old \" + (\"shape (\" + x.shape + \") has \" + xSize + \" elements. The new shape and old \") + \"shape must have the same number of elements.\";\n\t  });\n\t  backend.incRef(x.dataId);\n\t  var xData = backend.data.get(x.dataId);\n\n\t  if (xData.complexTensorInfos != null) {\n\t    var real = xData.complexTensorInfos.real;\n\t    var imag = xData.complexTensorInfos.imag;\n\t    real.shape = $shape;\n\t    imag.shape = $shape;\n\t  }\n\n\t  return {\n\t    dataId: x.dataId,\n\t    shape: $shape,\n\t    dtype: x.dtype\n\t  };\n\t}\n\tvar reshapeConfig = {\n\t  kernelName: Reshape,\n\t  backendName: 'cpu',\n\t  kernelFunc: reshape$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction batchMatMul(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var a = inputs.a,\n\t      b = inputs.b;\n\t  var transposeA = attrs.transposeA,\n\t      transposeB = attrs.transposeB;\n\t  assertNotComplex([a, b], 'matMul');\n\t  var aRank = a.shape.length;\n\t  var bRank = b.shape.length;\n\t  var innerShapeA = transposeA ? a.shape[aRank - 2] : a.shape[aRank - 1];\n\t  var innerShapeB = transposeB ? b.shape[bRank - 1] : b.shape[bRank - 2];\n\t  var outerShapeA = transposeA ? a.shape[aRank - 1] : a.shape[aRank - 2];\n\t  var outerShapeB = transposeB ? b.shape[bRank - 2] : b.shape[bRank - 1];\n\t  var outerDimsA = a.shape.slice(0, -2);\n\t  var outerDimsB = b.shape.slice(0, -2);\n\t  var batchDimA = sizeFromShape(outerDimsA);\n\t  var batchDimB = sizeFromShape(outerDimsB);\n\t  var batchDimsCompatible = batchDimA === batchDimB || batchDimA === 1 || batchDimB === 1;\n\t  assert(aRank >= 2 && bRank >= 2 && batchDimsCompatible, function () {\n\t    return \"Error in matMul: the input batch dimensions must either be the \" + \"same or at least one input batch dimension must be 1. Got input \" + (\"batch dimensions of (\" + outerDimsA + \") and (\" + outerDimsB + \").\");\n\t  });\n\t  var outShapeOuterDims = batchDimA > batchDimB ? a.shape.slice(0, -2) : b.shape.slice(0, -2);\n\t  var outShape = outShapeOuterDims.concat([outerShapeA, outerShapeB]);\n\t  assert(innerShapeA === innerShapeB, function () {\n\t    return \"Error in matMul: inner shapes (\" + innerShapeA + \") and (\" + (innerShapeB + \") of Tensors with shapes \" + a.shape + \" and \") + (b.shape + \" and transposeA=\" + transposeA) + (\" and transposeB=\" + transposeB + \" must match.\");\n\t  });\n\t  var a3dShape = transposeA ? [batchDimA, innerShapeA, outerShapeA] : [batchDimA, outerShapeA, innerShapeA];\n\t  var b3dShape = transposeB ? [batchDimB, outerShapeB, innerShapeB] : [batchDimB, innerShapeB, outerShapeB]; // The rest of the implementation is designed to operate on rank-3 tensors\n\n\t  var a3d = reshape$2({\n\t    inputs: {\n\t      x: a\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: a3dShape\n\t    }\n\t  });\n\t  var b3d = reshape$2({\n\t    inputs: {\n\t      x: b\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: b3dShape\n\t    }\n\t  });\n\t  var sharedDim = transposeA ? a3d.shape[1] : a3d.shape[2];\n\t  var leftDim = transposeA ? a3d.shape[2] : a3d.shape[1];\n\t  var rightDim = transposeB ? b3d.shape[1] : b3d.shape[2];\n\t  var batchDim = Math.max(batchDimA, batchDimB);\n\t  var a3dValues = backend.data.get(a3d.dataId).values;\n\t  var b3dValues = backend.data.get(b3d.dataId).values;\n\t  var a3dStrides = computeStrides(a3d.shape);\n\t  var b3dStrides = computeStrides(b3d.shape);\n\n\t  var _ref = transposeA ? [a3dStrides[0], 1, a3dStrides[1]] : [a3dStrides[0], a3dStrides[1], 1],\n\t      aBatch = _ref[0],\n\t      aOuterStep = _ref[1],\n\t      aInnerStep = _ref[2];\n\n\t  var _ref2 = transposeB ? [1, b3dStrides[1], b3dStrides[0]] : [b3dStrides[1], 1, b3dStrides[0]],\n\t      bInnerStep = _ref2[0],\n\t      bOuterStep = _ref2[1],\n\t      bBatch = _ref2[2];\n\n\t  var size = leftDim * rightDim;\n\t  var result = buffer([batchDim, leftDim, rightDim], a3d.dtype);\n\t  var resVals = result.values;\n\t  var blockSize = backend.blockSize;\n\n\t  for (var bi = 0; bi < batchDim; bi++) {\n\t    for (var i0 = 0; i0 < leftDim; i0 += blockSize) {\n\t      for (var j0 = 0; j0 < rightDim; j0 += blockSize) {\n\t        for (var k0 = 0; k0 < sharedDim; k0 += blockSize) {\n\t          // for when blockSize doesn't evenly divide the input\n\t          var iBlock = Math.min(i0 + blockSize, leftDim);\n\t          var jBlock = Math.min(j0 + blockSize, rightDim);\n\t          var kBlock = Math.min(k0 + blockSize, sharedDim);\n\n\t          for (var i = i0; i < iBlock; i++) {\n\t            for (var j = j0; j < jBlock; j++) {\n\t              var sum = 0.0;\n\n\t              for (var k = k0; k < kBlock; k++) {\n\t                var batchOffsetA = Math.min(bi, batchDimA - 1) * aBatch;\n\t                var batchOffsetB = Math.min(bi, batchDimB - 1) * bBatch;\n\t                var aVal = a3dValues[batchOffsetA + i * aOuterStep + k * aInnerStep];\n\t                var bVal = b3dValues[k * bInnerStep + j * bOuterStep + batchOffsetB];\n\t                sum += aVal * bVal;\n\t              }\n\n\t              resVals[bi * size + (i * rightDim + j)] += sum;\n\t            }\n\t          }\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  backend.disposeIntermediateTensorInfo(a3d);\n\t  backend.disposeIntermediateTensorInfo(b3d); // set correct shape on output.\n\n\t  return backend.makeTensorInfo(outShape, result.dtype, result.values);\n\t}\n\tvar batchMatMulConfig = {\n\t  kernelName: BatchMatMul,\n\t  backendName: 'cpu',\n\t  kernelFunc: batchMatMul\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction _fusedMatMul(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var a = inputs.a,\n\t      b = inputs.b,\n\t      bias = inputs.bias,\n\t      preluActivationWeights = inputs.preluActivationWeights;\n\t  var transposeA = attrs.transposeA,\n\t      transposeB = attrs.transposeB,\n\t      activation = attrs.activation,\n\t      leakyreluAlpha = attrs.leakyreluAlpha;\n\t  var current;\n\t  var addRes;\n\t  var activationRes;\n\t  var intermediates = [];\n\t  var matMulRes = batchMatMul({\n\t    inputs: {\n\t      a: a,\n\t      b: b\n\t    },\n\t    attrs: {\n\t      transposeA: transposeA,\n\t      transposeB: transposeB\n\t    },\n\t    backend: backend\n\t  });\n\t  current = matMulRes;\n\n\t  if (bias) {\n\t    addRes = add$4({\n\t      inputs: {\n\t        a: current,\n\t        b: bias\n\t      },\n\t      backend: backend\n\t    });\n\t    intermediates.push(current);\n\t    current = addRes;\n\t  }\n\n\t  if (activation) {\n\t    activationRes = applyActivation$1(backend, current, activation, preluActivationWeights, leakyreluAlpha);\n\t    intermediates.push(current);\n\t    current = activationRes;\n\t  }\n\n\t  for (var _i = 0, _intermediates = intermediates; _i < _intermediates.length; _i++) {\n\t    var i = _intermediates[_i];\n\t    backend.disposeIntermediateTensorInfo(i);\n\t  }\n\n\t  return current;\n\t}\n\tvar _fusedMatMulConfig = {\n\t  kernelName: _FusedMatMul,\n\t  backendName: 'cpu',\n\t  kernelFunc: _fusedMatMul\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar acos$1 = unaryKernelFunc(Acos, function (xi) {\n\t  return Math.acos(xi);\n\t});\n\tvar acosConfig = {\n\t  kernelName: Acos,\n\t  backendName: 'cpu',\n\t  kernelFunc: acos$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar acosh$1 = unaryKernelFunc(Acosh, function (xi) {\n\t  return Math.acosh(xi);\n\t});\n\tvar acoshConfig = {\n\t  kernelName: Acosh,\n\t  backendName: 'cpu',\n\t  kernelFunc: acosh$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction addN$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var tensors = inputs;\n\t  assertNotComplex(inputs, 'addN');\n\t  var vals = tensors.map(function (t) {\n\t    return backend.data.get(t.dataId).values;\n\t  });\n\t  var outBuf = buffer(tensors[0].shape, tensors[0].dtype);\n\t  var outVals = outBuf.values;\n\n\t  for (var i = 0; i < tensors.length; i++) {\n\t    var currVals = vals[i];\n\n\t    for (var j = 0; j < outVals.length; j++) {\n\t      outVals[j] += currVals[j];\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(outBuf.shape, outBuf.dtype, outBuf.values);\n\t}\n\tvar addNConfig = {\n\t  kernelName: AddN,\n\t  backendName: 'cpu',\n\t  kernelFunc: addN$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction all$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var axis = attrs.axis,\n\t      keepDims = attrs.keepDims;\n\t  assertNotComplex(x, 'all');\n\t  var origAxes = parseAxisParam(axis, x.shape);\n\t  var axes = origAxes;\n\t  var permutedAxes = getAxesPermutation(axes, x.shape.length);\n\t  var $x = x;\n\n\t  if (permutedAxes != null) {\n\t    $x = transpose$1({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        perm: permutedAxes\n\t      }\n\t    });\n\t    axes = getInnerMostAxes(axes.length, x.shape.length);\n\t  }\n\n\t  assertAxesAreInnerMostDims('all', axes, $x.shape.length);\n\n\t  var _backend_util$compute = computeOutAndReduceShapes($x.shape, axes),\n\t      outShape = _backend_util$compute[0],\n\t      reduceShape = _backend_util$compute[1];\n\n\t  var reduceSize = sizeFromShape(reduceShape);\n\t  var vals = makeZerosTypedArray(sizeFromShape(outShape), $x.dtype);\n\t  var aVals = backend.data.get($x.dataId).values;\n\n\t  for (var i = 0; i < vals.length; ++i) {\n\t    var offset = i * reduceSize;\n\t    var _all = aVals[offset];\n\n\t    for (var j = 0; j < reduceSize; ++j) {\n\t      var value = aVals[offset + j];\n\t      _all = _all && value;\n\t    }\n\n\t    vals[i] = _all;\n\t  }\n\n\t  if (permutedAxes != null) {\n\t    backend.disposeIntermediateTensorInfo($x);\n\t  }\n\n\t  var result = backend.makeTensorInfo(outShape, $x.dtype, vals);\n\n\t  if (keepDims) {\n\t    var expandedShape = expandShapeToKeepDim(outShape, origAxes);\n\t    var reshapedResult = reshape$2({\n\t      inputs: {\n\t        x: result\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: expandedShape\n\t      }\n\t    });\n\t    backend.disposeIntermediateTensorInfo(result);\n\t    return reshapedResult;\n\t  }\n\n\t  return result;\n\t}\n\tvar allConfig = {\n\t  kernelName: All,\n\t  backendName: 'cpu',\n\t  kernelFunc: all$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction any$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var axis = attrs.axis,\n\t      keepDims = attrs.keepDims;\n\t  assertNotComplex(x, 'any');\n\t  var origAxes = parseAxisParam(axis, x.shape);\n\t  var axes = origAxes;\n\t  var permutedAxes = getAxesPermutation(axes, x.shape.length);\n\t  var $x = x;\n\n\t  if (permutedAxes != null) {\n\t    $x = transpose$1({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        perm: permutedAxes\n\t      }\n\t    });\n\t    axes = getInnerMostAxes(axes.length, x.shape.length);\n\t  }\n\n\t  assertAxesAreInnerMostDims('any', axes, $x.shape.length);\n\n\t  var _backend_util$compute = computeOutAndReduceShapes($x.shape, axes),\n\t      outShape = _backend_util$compute[0],\n\t      reduceShape = _backend_util$compute[1];\n\n\t  var reduceSize = sizeFromShape(reduceShape);\n\t  var vals = makeZerosTypedArray(sizeFromShape(outShape), $x.dtype);\n\t  var aVals = backend.data.get($x.dataId).values;\n\n\t  for (var i = 0; i < vals.length; ++i) {\n\t    var offset = i * reduceSize;\n\t    var anyVal = aVals[offset];\n\n\t    for (var j = 0; j < reduceSize; ++j) {\n\t      var value = aVals[offset + j];\n\t      anyVal = anyVal || value;\n\t    }\n\n\t    vals[i] = anyVal;\n\t  }\n\n\t  if (permutedAxes != null) {\n\t    backend.disposeIntermediateTensorInfo($x);\n\t  }\n\n\t  var result = backend.makeTensorInfo(outShape, $x.dtype, vals);\n\n\t  if (keepDims) {\n\t    var expandedShape = expandShapeToKeepDim(outShape, origAxes);\n\t    var reshapedResult = reshape$2({\n\t      inputs: {\n\t        x: result\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: expandedShape\n\t      }\n\t    });\n\t    backend.disposeIntermediateTensorInfo(result);\n\t    return reshapedResult;\n\t  }\n\n\t  return result;\n\t}\n\tvar anyConfig = {\n\t  kernelName: Any,\n\t  backendName: 'cpu',\n\t  kernelFunc: any$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction argMax$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var axis = attrs.axis;\n\t  assertNotComplex(x, 'argMax');\n\t  var axes = parseAxisParam(axis, x.shape);\n\t  var permutedAxes = getAxesPermutation(axes, x.shape.length);\n\t  var $x = x;\n\t  var intermediateTensorInfos = [];\n\n\t  if (permutedAxes != null) {\n\t    $x = transpose$1({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        perm: permutedAxes\n\t      }\n\t    });\n\t    intermediateTensorInfos.push($x);\n\t    axes = getInnerMostAxes(axes.length, $x.shape.length);\n\t  }\n\n\t  axes = [axes[0]];\n\t  assertAxesAreInnerMostDims('argMax', axes, $x.shape.length);\n\n\t  var _backend_util$compute = computeOutAndReduceShapes($x.shape, axes),\n\t      outShape = _backend_util$compute[0],\n\t      reduceShape = _backend_util$compute[1];\n\n\t  var outSize = sizeFromShape(outShape);\n\t  var vals = makeZerosTypedArray(outSize, 'int32');\n\t  var reduceSize = sizeFromShape(reduceShape);\n\t  var aVals = backend.data.get($x.dataId).values;\n\n\t  for (var i = 0; i < vals.length; ++i) {\n\t    var offset = i * reduceSize;\n\t    var max = aVals[offset];\n\t    var maxIndex = 0;\n\n\t    for (var j = 0; j < reduceSize; ++j) {\n\t      var value = aVals[offset + j];\n\n\t      if (value > max) {\n\t        max = value;\n\t        maxIndex = j;\n\t      }\n\t    }\n\n\t    vals[i] = maxIndex;\n\t  }\n\n\t  intermediateTensorInfos.forEach(function (t) {\n\t    return backend.disposeIntermediateTensorInfo(t);\n\t  });\n\t  return backend.makeTensorInfo(outShape, 'int32', vals);\n\t}\n\tvar argMaxConfig = {\n\t  kernelName: ArgMax,\n\t  backendName: 'cpu',\n\t  kernelFunc: argMax$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction argMin$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var axis = attrs.axis;\n\t  assertNotComplex(x, 'argMin');\n\t  var axes = parseAxisParam(axis, x.shape);\n\t  var permutedAxes = getAxesPermutation(axes, x.shape.length);\n\t  var $x = x;\n\t  var intermediateTensorInfos = [];\n\n\t  if (permutedAxes != null) {\n\t    $x = transpose$1({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        perm: permutedAxes\n\t      }\n\t    });\n\t    intermediateTensorInfos.push($x);\n\t    axes = getInnerMostAxes(axes.length, $x.shape.length);\n\t  }\n\n\t  axes = [axes[0]];\n\t  assertAxesAreInnerMostDims('argMin', axes, $x.shape.length);\n\n\t  var _backend_util$compute = computeOutAndReduceShapes($x.shape, axes),\n\t      outShape = _backend_util$compute[0],\n\t      reduceShape = _backend_util$compute[1];\n\n\t  var outSize = sizeFromShape(outShape);\n\t  var vals = makeZerosTypedArray(outSize, 'int32');\n\t  var reduceSize = sizeFromShape(reduceShape);\n\t  var aVals = backend.data.get($x.dataId).values;\n\n\t  for (var i = 0; i < vals.length; ++i) {\n\t    var offset = i * reduceSize;\n\t    var min = aVals[offset];\n\t    var minIndex = 0;\n\n\t    for (var j = 0; j < reduceSize; ++j) {\n\t      var value = aVals[offset + j];\n\n\t      if (value < min) {\n\t        min = value;\n\t        minIndex = j;\n\t      }\n\t    }\n\n\t    vals[i] = minIndex;\n\t  }\n\n\t  intermediateTensorInfos.forEach(function (t) {\n\t    return backend.disposeIntermediateTensorInfo(t);\n\t  });\n\t  return backend.makeTensorInfo(outShape, 'int32', vals);\n\t}\n\tvar argMinConfig = {\n\t  kernelName: ArgMin,\n\t  backendName: 'cpu',\n\t  kernelFunc: argMin$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar asin$1 = unaryKernelFunc(Asin, function (xi) {\n\t  return Math.asin(xi);\n\t});\n\tvar asinConfig = {\n\t  kernelName: Asin,\n\t  backendName: 'cpu',\n\t  kernelFunc: asin$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar asinh$2 = unaryKernelFunc(Asinh, function (xi) {\n\t  return Math.asinh(xi);\n\t});\n\tvar asinhConfig = {\n\t  kernelName: Asinh,\n\t  backendName: 'cpu',\n\t  kernelFunc: asinh$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar atan$1 = unaryKernelFunc(Atan, function (xi) {\n\t  return Math.atan(xi);\n\t});\n\tvar atanConfig = {\n\t  kernelName: Atan,\n\t  backendName: 'cpu',\n\t  kernelFunc: atan$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar atan2Impl = createSimpleBinaryKernelImpl(function (aValue, bValue) {\n\t  return Math.atan2(aValue, bValue);\n\t});\n\tvar atan2$1 = binaryKernelFunc(Atan2, atan2Impl);\n\tvar atan2Config = {\n\t  kernelName: Atan2,\n\t  backendName: 'cpu',\n\t  kernelFunc: atan2$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar atanh$1 = unaryKernelFunc(Atanh, function (xi) {\n\t  return Math.atanh(xi);\n\t});\n\tvar atanhConfig = {\n\t  kernelName: Atanh,\n\t  backendName: 'cpu',\n\t  kernelFunc: atanh$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction pool$1(xValues, xShape, dtype, strides, convInfo, poolType) {\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var dilationHeight = convInfo.dilationHeight;\n\t  var dilationWidth = convInfo.dilationWidth;\n\t  var effectiveFilterHeight = convInfo.effectiveFilterHeight;\n\t  var effectiveFilterWidth = convInfo.effectiveFilterWidth;\n\t  var padTop = convInfo.padInfo.top;\n\t  var padLeft = convInfo.padInfo.left;\n\t  var initialValue = poolType === 'max' ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY;\n\t  var output = buffer(convInfo.outShape, dtype);\n\t  var outputVals = output.values;\n\t  var outputBatchStrides = convInfo.outShape[1] * convInfo.outShape[2] * convInfo.outShape[3];\n\t  var outputRowStrides = convInfo.outShape[2] * convInfo.outShape[3];\n\t  var outputColStrides = convInfo.outShape[3];\n\n\t  for (var b = 0; b < convInfo.batchSize; ++b) {\n\t    var outputBatchOffset = b * outputBatchStrides;\n\t    var inputBatchOffset = b * strides[0];\n\n\t    for (var d = 0; d < convInfo.inChannels; ++d) {\n\t      for (var yR = 0; yR < convInfo.outHeight; ++yR) {\n\t        var xRCorner = yR * strideHeight - padTop;\n\t        var xRMin = Math.max(0, xRCorner);\n\t        var xRMax = Math.min(convInfo.inHeight, effectiveFilterHeight + xRCorner);\n\t        var outputRowOffset = outputBatchOffset + yR * outputRowStrides;\n\n\t        for (var yC = 0; yC < convInfo.outWidth; ++yC) {\n\t          var xCCorner = yC * strideWidth - padLeft;\n\t          var xCMin = Math.max(0, xCCorner);\n\t          var xCMax = Math.min(convInfo.inWidth, effectiveFilterWidth + xCCorner);\n\t          var minMaxValue = initialValue;\n\t          var avgValue = 0;\n\t          var count = 0;\n\n\t          for (var xR = xRMin; xR < xRMax; xR += dilationHeight) {\n\t            var xROffset = inputBatchOffset + xR * strides[1];\n\n\t            for (var xC = xCMin; xC < xCMax; xC += dilationWidth) {\n\t              var xCOffset = xROffset + xC * strides[2];\n\t              var pixel = xValues[xCOffset + d];\n\n\t              if (poolType === 'max' && pixel > minMaxValue) {\n\t                minMaxValue = pixel;\n\t              } else if (poolType === 'avg') {\n\t                avgValue += pixel;\n\t                count++;\n\t              }\n\t            }\n\n\t            if (isNaN(minMaxValue)) {\n\t              break;\n\t            }\n\t          }\n\n\t          var outputOffset = outputRowOffset + yC * outputColStrides + d;\n\t          outputVals[outputOffset] = poolType === 'avg' ? avgValue / count : minMaxValue;\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return output;\n\t}\n\tfunction maxPoolPositions(xValues, xShape, dtype, convInfo, flattenPositions, includeBatchInIndex) {\n\t  if (flattenPositions === void 0) {\n\t    flattenPositions = false;\n\t  }\n\n\t  if (includeBatchInIndex === void 0) {\n\t    includeBatchInIndex = false;\n\t  }\n\n\t  var maxPositions = buffer(convInfo.outShape, 'int32');\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var dilationHeight = convInfo.dilationHeight;\n\t  var dilationWidth = convInfo.dilationWidth;\n\t  var effectiveFilterHeight = convInfo.effectiveFilterHeight;\n\t  var effectiveFilterWidth = convInfo.effectiveFilterWidth;\n\t  var padTop = convInfo.padInfo.top;\n\t  var padLeft = convInfo.padInfo.left;\n\t  var xBuf = buffer(xShape, dtype, xValues);\n\n\t  for (var b = 0; b < convInfo.batchSize; ++b) {\n\t    for (var d = 0; d < convInfo.inChannels; ++d) {\n\t      for (var yR = 0; yR < convInfo.outHeight; ++yR) {\n\t        var xRCorner = yR * strideHeight - padTop;\n\t        var xRMin = xRCorner;\n\n\t        while (xRMin < 0) {\n\t          xRMin += dilationHeight;\n\t        } // const xRMin = Math.max(0, xRCorner);\n\n\n\t        var xRMax = Math.min(convInfo.inHeight, effectiveFilterHeight + xRCorner);\n\n\t        for (var yC = 0; yC < convInfo.outWidth; ++yC) {\n\t          var xCCorner = yC * strideWidth - padLeft;\n\t          var xCMin = xCCorner;\n\n\t          while (xCMin < 0) {\n\t            xCMin += dilationWidth;\n\t          }\n\n\t          var xCMax = Math.min(convInfo.inWidth, effectiveFilterWidth + xCCorner);\n\t          var maxValue = Number.NEGATIVE_INFINITY;\n\t          var maxPosition = -1;\n\n\t          for (var xR = xRMin; xR < xRMax; xR += dilationHeight) {\n\t            var wR = xR - xRCorner;\n\n\t            for (var xC = xCMin; xC < xCMax; xC += dilationWidth) {\n\t              var wC = xC - xCCorner;\n\t              var pixel = xBuf.get(b, xR, xC, d);\n\n\t              if (pixel > maxValue) {\n\t                maxValue = pixel;\n\n\t                if (flattenPositions) {\n\t                  maxPosition = includeBatchInIndex ? ((b * convInfo.inHeight + xR) * convInfo.inWidth + xC) * convInfo.inChannels + d : (xR * convInfo.inWidth + xC) * convInfo.inChannels + d;\n\t                } else {\n\t                  maxPosition = wR * effectiveFilterWidth + wC;\n\t                }\n\t              }\n\t            }\n\t          }\n\n\t          maxPositions.set(maxPosition, b, yR, yC, d);\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return maxPositions;\n\t}\n\tfunction pool3d$1(xValues, xShape, dtype, strides, convInfo, poolType) {\n\t  var strideDepth = convInfo.strideDepth;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var dilationDepth = convInfo.dilationDepth;\n\t  var dilationHeight = convInfo.dilationHeight;\n\t  var dilationWidth = convInfo.dilationWidth;\n\t  var effectiveFilterDepth = convInfo.effectiveFilterDepth;\n\t  var effectiveFilterHeight = convInfo.effectiveFilterHeight;\n\t  var effectiveFilterWidth = convInfo.effectiveFilterWidth;\n\t  var padFront = convInfo.padInfo.front;\n\t  var padTop = convInfo.padInfo.top;\n\t  var padLeft = convInfo.padInfo.left;\n\t  var initialValue = poolType === 'max' ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY;\n\t  var output = buffer(convInfo.outShape, dtype);\n\t  var outputVals = output.values;\n\t  var outputBatchStrides = convInfo.outShape[1] * convInfo.outShape[2] * convInfo.outShape[3] * convInfo.outShape[4];\n\t  var outputDepthStrides = convInfo.outShape[2] * convInfo.outShape[3] * convInfo.outShape[4];\n\t  var outputRowStrides = convInfo.outShape[3] * convInfo.outShape[4];\n\t  var outputColStrides = convInfo.outShape[4];\n\n\t  for (var batch = 0; batch < convInfo.batchSize; ++batch) {\n\t    var outputBatchOffset = batch * outputBatchStrides;\n\t    var inputBatchOffset = batch * strides[0];\n\n\t    for (var channel = 0; channel < convInfo.inChannels; ++channel) {\n\t      for (var yDepth = 0; yDepth < convInfo.outDepth; ++yDepth) {\n\t        var xDepthCorner = yDepth * strideDepth - padFront;\n\t        var xDepthMin = xDepthCorner;\n\n\t        while (xDepthMin < 0) {\n\t          xDepthMin += dilationDepth;\n\t        }\n\n\t        var xDepthMax = Math.min(convInfo.inDepth, effectiveFilterDepth + xDepthCorner);\n\t        var outputDepthOffset = outputBatchOffset + yDepth * outputDepthStrides;\n\n\t        for (var yRow = 0; yRow < convInfo.outHeight; ++yRow) {\n\t          var xRowCorner = yRow * strideHeight - padTop;\n\t          var xRowMin = xRowCorner;\n\n\t          while (xRowMin < 0) {\n\t            xRowMin += dilationHeight;\n\t          }\n\n\t          var xRowMax = Math.min(convInfo.inHeight, effectiveFilterHeight + xRowCorner);\n\t          var outputRowOffset = outputDepthOffset + yRow * outputRowStrides;\n\n\t          for (var yCol = 0; yCol < convInfo.outWidth; ++yCol) {\n\t            var xColCorner = yCol * strideWidth - padLeft;\n\t            var xColMin = xColCorner;\n\n\t            while (xColMin < 0) {\n\t              xColMin += dilationWidth;\n\t            }\n\n\t            var xColMax = Math.min(convInfo.inWidth, effectiveFilterWidth + xColCorner); // Shader code begins\n\n\t            var outputColOffset = outputRowOffset + yCol * outputColStrides;\n\t            var minMaxValue = initialValue;\n\t            var avgValue = 0;\n\t            var count = 0;\n\n\t            for (var xDepth = xDepthMin; xDepth < xDepthMax; xDepth += dilationDepth) {\n\t              var xDepthOffset = inputBatchOffset + xDepth * strides[1];\n\n\t              for (var xRow = xRowMin; xRow < xRowMax; xRow += dilationHeight) {\n\t                var xRowOffset = xDepthOffset + xRow * strides[2];\n\n\t                for (var xCol = xColMin; xCol < xColMax; xCol += dilationWidth) {\n\t                  var xColOffset = xRowOffset + xCol * strides[3];\n\t                  var pixel = xValues[xColOffset + channel];\n\n\t                  if (poolType === 'max' && pixel > minMaxValue) {\n\t                    minMaxValue = pixel;\n\t                  } else if (poolType === 'avg') {\n\t                    avgValue += pixel;\n\t                    count++;\n\t                  }\n\n\t                  if (isNaN(minMaxValue)) {\n\t                    break;\n\t                  }\n\t                }\n\n\t                if (isNaN(minMaxValue)) {\n\t                  break;\n\t                }\n\t              }\n\n\t              if (isNaN(minMaxValue)) {\n\t                break;\n\t              }\n\t            }\n\n\t            var outputOffset = outputColOffset + channel;\n\t            outputVals[outputOffset] = poolType === 'avg' ? avgValue / count : minMaxValue;\n\t          }\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return output;\n\t}\n\tfunction maxPool3dPositions(xBuf, convInfo) {\n\t  var maxPositions = buffer(convInfo.outShape, 'int32');\n\t  var strideDepth = convInfo.strideDepth;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var dilationDepth = convInfo.dilationDepth;\n\t  var dilationHeight = convInfo.dilationHeight;\n\t  var dilationWidth = convInfo.dilationWidth;\n\t  var effectiveFilterDepth = convInfo.effectiveFilterDepth;\n\t  var effectiveFilterHeight = convInfo.effectiveFilterHeight;\n\t  var effectiveFilterWidth = convInfo.effectiveFilterWidth;\n\t  var padFront = convInfo.padInfo.front;\n\t  var padTop = convInfo.padInfo.top;\n\t  var padLeft = convInfo.padInfo.left;\n\n\t  for (var batch = 0; batch < convInfo.batchSize; ++batch) {\n\t    for (var channel = 0; channel < convInfo.inChannels; ++channel) {\n\t      for (var yDepth = 0; yDepth < convInfo.outDepth; ++yDepth) {\n\t        var xDepthCorner = yDepth * strideDepth - padFront;\n\t        var xDepthMin = xDepthCorner;\n\n\t        while (xDepthMin < 0) {\n\t          xDepthMin += dilationDepth;\n\t        }\n\n\t        var xDepthMax = Math.min(convInfo.inDepth, effectiveFilterDepth + xDepthCorner);\n\n\t        for (var yRow = 0; yRow < convInfo.outHeight; ++yRow) {\n\t          var xRowCorner = yRow * strideHeight - padTop;\n\t          var xRowMin = xRowCorner;\n\n\t          while (xRowMin < 0) {\n\t            xRowMin += dilationHeight;\n\t          }\n\n\t          var xRowMax = Math.min(convInfo.inHeight, effectiveFilterHeight + xRowCorner);\n\n\t          for (var yCol = 0; yCol < convInfo.outWidth; ++yCol) {\n\t            var xColCorner = yCol * strideWidth - padLeft;\n\t            var xColMin = xColCorner;\n\n\t            while (xColMin < 0) {\n\t              xColMin += dilationWidth;\n\t            }\n\n\t            var xColMax = Math.min(convInfo.inWidth, effectiveFilterWidth + xColCorner); // Shader code begins\n\n\t            var maxValue = Number.NEGATIVE_INFINITY;\n\t            var maxPosition = -1;\n\n\t            for (var xDepth = xDepthMin; xDepth < xDepthMax; xDepth += dilationDepth) {\n\t              var wDepth = xDepth - xDepthCorner;\n\n\t              for (var xRow = xRowMin; xRow < xRowMax; xRow += dilationHeight) {\n\t                var wRow = xRow - xRowCorner;\n\n\t                for (var xCol = xColMin; xCol < xColMax; xCol += dilationWidth) {\n\t                  var wCol = xCol - xColCorner;\n\t                  var pixel = xBuf.get(batch, xDepth, xRow, xCol, channel);\n\n\t                  if (pixel >= maxValue) {\n\t                    maxValue = pixel;\n\t                    maxPosition = wDepth * effectiveFilterHeight * effectiveFilterWidth + wRow * effectiveFilterHeight + wCol;\n\t                  }\n\t                }\n\t              }\n\t            }\n\n\t            maxPositions.set(maxPosition, batch, yDepth, yRow, yCol, channel);\n\t          }\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return maxPositions;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction avgPool$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  assertNotComplex(x, 'avgPool');\n\t  var filterSize = attrs.filterSize,\n\t      strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dimRoundingMode = attrs.dimRoundingMode;\n\t  var dilations = 1;\n\t  assert(eitherStridesOrDilationsAreOne(strides, dilations), function () {\n\t    return 'Error in avgPool: Either strides or dilations must be 1. ' + (\"Got strides \" + strides + \" and dilations '\" + dilations + \"'\");\n\t  });\n\t  var convInfo = computePool2DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode);\n\t  var res;\n\n\t  if (convInfo.filterWidth === 1 && convInfo.filterHeight === 1 && arraysEqual(convInfo.inShape, convInfo.outShape)) {\n\t    res = identity$1({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend\n\t    });\n\t  } else {\n\t    var xValues = backend.data.get(x.dataId).values;\n\n\t    var _strides = computeStrides(x.shape);\n\n\t    var buffer = pool$1(xValues, x.shape, x.dtype, _strides, convInfo, 'avg');\n\t    res = backend.makeTensorInfo(convInfo.outShape, x.dtype, buffer.values);\n\t  }\n\n\t  return res;\n\t}\n\tvar avgPoolConfig = {\n\t  kernelName: AvgPool,\n\t  backendName: 'cpu',\n\t  kernelFunc: avgPool$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction avgPool3D(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var filterSize = attrs.filterSize,\n\t      strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dimRoundingMode = attrs.dimRoundingMode,\n\t      dataFormat = attrs.dataFormat,\n\t      dilations = attrs.dilations;\n\t  assertNotComplex(x, 'avgPool3d');\n\t  var $dilations = dilations;\n\n\t  if ($dilations == null) {\n\t    $dilations = [1, 1, 1];\n\t  }\n\n\t  var convInfo = computePool3DInfo(x.shape, filterSize, strides, $dilations, pad, dimRoundingMode, dataFormat);\n\t  var xValues = backend.data.get(x.dataId).values;\n\t  var outBuf = pool3d$1(xValues, x.shape, x.dtype, computeStrides(x.shape), convInfo, 'avg');\n\t  return backend.makeTensorInfo(outBuf.shape, 'float32', outBuf.values);\n\t}\n\tvar avgPool3DConfig = {\n\t  kernelName: AvgPool3D,\n\t  backendName: 'cpu',\n\t  kernelFunc: avgPool3D\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction avgPool3DGrad(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var dy = inputs.dy,\n\t      input = inputs.input;\n\t  var filterSize = attrs.filterSize,\n\t      strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dilations = attrs.dilations,\n\t      dimRoundingMode = attrs.dimRoundingMode;\n\t  assertNotComplex([dy, input], 'avgPool3DGrad');\n\t  var convInfo = computePool3DInfo(input.shape, filterSize, strides, dilations, pad, dimRoundingMode);\n\t  var strideDepth = convInfo.strideDepth;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var filterDepth = convInfo.filterDepth;\n\t  var filterHeight = convInfo.filterHeight;\n\t  var filterWidth = convInfo.filterWidth;\n\t  var dilationDepth = convInfo.dilationDepth;\n\t  var dilationHeight = convInfo.dilationHeight;\n\t  var dilationWidth = convInfo.dilationWidth;\n\t  var effectiveFilterDepth = convInfo.effectiveFilterDepth;\n\t  var effectiveFilterHeight = convInfo.effectiveFilterHeight;\n\t  var effectiveFilterWidth = convInfo.effectiveFilterWidth;\n\t  var padFront = effectiveFilterDepth - 1 - convInfo.padInfo.front;\n\t  var padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n\t  var padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n\t  var dx = buffer(input.shape, 'float32');\n\t  var avgMultiplier = 1 / (filterDepth * filterHeight * filterWidth);\n\t  var dyBuf = backend.bufferSync(dy);\n\n\t  for (var batch = 0; batch < convInfo.batchSize; ++batch) {\n\t    for (var channel = 0; channel < convInfo.inChannels; ++channel) {\n\t      for (var dxDepth = 0; dxDepth < convInfo.inDepth; ++dxDepth) {\n\t        for (var dxRow = 0; dxRow < convInfo.inHeight; ++dxRow) {\n\t          for (var dxCol = 0; dxCol < convInfo.inWidth; ++dxCol) {\n\t            // Shader code begins.\n\t            var dyDepthCorner = dxDepth - padFront;\n\t            var dyRowCorner = dxRow - padTop;\n\t            var dyColCorner = dxCol - padLeft;\n\t            var dotProd = 0;\n\n\t            for (var wDepth = 0; wDepth < effectiveFilterDepth; wDepth += dilationDepth) {\n\t              var dyDepth = (dyDepthCorner + wDepth) / strideDepth;\n\n\t              if (dyDepth < 0 || dyDepth >= convInfo.outDepth || Math.floor(dyDepth) !== dyDepth) {\n\t                continue;\n\t              }\n\n\t              for (var wRow = 0; wRow < effectiveFilterHeight; wRow += dilationHeight) {\n\t                var dyRow = (dyRowCorner + wRow) / strideHeight;\n\n\t                if (dyRow < 0 || dyRow >= convInfo.outHeight || Math.floor(dyRow) !== dyRow) {\n\t                  continue;\n\t                }\n\n\t                for (var wCol = 0; wCol < effectiveFilterWidth; wCol += dilationWidth) {\n\t                  var dyCol = (dyColCorner + wCol) / strideWidth;\n\n\t                  if (dyCol < 0 || dyCol >= convInfo.outWidth || Math.floor(dyCol) !== dyCol) {\n\t                    continue;\n\t                  }\n\n\t                  var pixel = dyBuf.get(batch, dyDepth, dyRow, dyCol, channel);\n\t                  dotProd += pixel;\n\t                }\n\t              }\n\t            }\n\n\t            dx.set(dotProd * avgMultiplier, batch, dxDepth, dxRow, dxCol, channel);\n\t          }\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n\t}\n\tvar avgPool3DGradConfig$1 = {\n\t  kernelName: AvgPool3DGrad,\n\t  backendName: 'cpu',\n\t  kernelFunc: avgPool3DGrad\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction avgPoolGrad$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var dy = inputs.dy,\n\t      input = inputs.input;\n\t  var x = input;\n\t  assertNotComplex([dy, input], 'avgPoolGrad');\n\t  var filterSize = attrs.filterSize,\n\t      strides = attrs.strides,\n\t      pad = attrs.pad;\n\t  var convInfo = computePool2DInfo(x.shape, filterSize, strides, 1\n\t  /* dilations */\n\t  , pad);\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var filterHeight = convInfo.filterHeight;\n\t  var filterWidth = convInfo.filterWidth;\n\t  var dilationHeight = convInfo.dilationHeight;\n\t  var dilationWidth = convInfo.dilationWidth;\n\t  var effectiveFilterHeight = convInfo.effectiveFilterHeight;\n\t  var effectiveFilterWidth = convInfo.effectiveFilterWidth;\n\t  var padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n\t  var padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n\t  var dx = buffer(x.shape, 'float32');\n\t  var avgMultiplier = 1 / (filterHeight * filterWidth);\n\t  var dyData = backend.data.get(dy.dataId).values;\n\t  var dyBuf = buffer(dy.shape, 'float32', dyData);\n\n\t  for (var b = 0; b < convInfo.batchSize; ++b) {\n\t    for (var d = 0; d < convInfo.inChannels; ++d) {\n\t      for (var dxR = 0; dxR < convInfo.inHeight; ++dxR) {\n\t        for (var dxC = 0; dxC < convInfo.inWidth; ++dxC) {\n\t          // Shader code begins.\n\t          var dyRCorner = dxR - padTop;\n\t          var dyCCorner = dxC - padLeft;\n\t          var dotProd = 0;\n\n\t          for (var wR = 0; wR < effectiveFilterHeight; wR += dilationHeight) {\n\t            var dyR = (dyRCorner + wR) / strideHeight;\n\n\t            if (dyR < 0 || dyR >= convInfo.outHeight || Math.floor(dyR) !== dyR) {\n\t              continue;\n\t            }\n\n\t            for (var wC = 0; wC < effectiveFilterWidth; wC += dilationWidth) {\n\t              var dyC = (dyCCorner + wC) / strideWidth;\n\n\t              if (dyC < 0 || dyC >= convInfo.outWidth || Math.floor(dyC) !== dyC) {\n\t                continue;\n\t              }\n\n\t              var pixel = dyBuf.get(b, dyR, dyC, d);\n\t              dotProd += pixel;\n\t            }\n\t          }\n\n\t          dx.set(dotProd * avgMultiplier, b, dxR, dxC, d);\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n\t}\n\tvar avgPoolGradConfig$1 = {\n\t  kernelName: AvgPoolGrad,\n\t  backendName: 'cpu',\n\t  kernelFunc: avgPoolGrad$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction batchNorm$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      scale = inputs.scale,\n\t      offset = inputs.offset,\n\t      mean = inputs.mean,\n\t      variance = inputs.variance;\n\t  assert(mean.shape.length === variance.shape.length, function () {\n\t    return 'Batch normalization gradient requires mean and variance to have ' + 'equal ranks.';\n\t  });\n\t  assert(offset == null || mean.shape.length === offset.shape.length, function () {\n\t    return 'Batch normalization gradient requires mean and offset to have ' + 'equal ranks.';\n\t  });\n\t  assert(scale == null || mean.shape.length === scale.shape.length, function () {\n\t    return 'Batch normalization gradient requires mean and scale to have ' + 'equal ranks.';\n\t  });\n\t  assertNotComplex([x, mean, variance, scale, offset], 'batchNorm');\n\t  var varianceEpsilon = attrs.varianceEpsilon;\n\n\t  if (varianceEpsilon == null) {\n\t    varianceEpsilon = 0.001;\n\t  }\n\n\t  var xVals = backend.data.get(x.dataId).values;\n\t  var mVals = backend.data.get(mean.dataId).values;\n\t  var varVals = backend.data.get(variance.dataId).values;\n\t  var sVals = scale ? backend.data.get(scale.dataId).values : new Float32Array([1]);\n\t  var offVals = offset ? backend.data.get(offset.dataId).values : new Float32Array([0]);\n\t  var outVals = new Float32Array(xVals.length);\n\t  var offValsLength = offVals.length;\n\t  var sValsLength = sVals.length;\n\t  var varValsLength = varVals.length;\n\t  var mValsLength = mVals.length;\n\t  var offi = 0;\n\t  var mi = 0;\n\t  var si = 0;\n\t  var vi = 0;\n\n\t  for (var i = 0; i < xVals.length; ++i) {\n\t    outVals[i] = offVals[offi++] + (xVals[i] - mVals[mi++]) * sVals[si++] / Math.sqrt(varVals[vi++] + varianceEpsilon);\n\n\t    if (offi >= offValsLength) {\n\t      offi = 0;\n\t    }\n\n\t    if (mi >= mValsLength) {\n\t      mi = 0;\n\t    }\n\n\t    if (si >= sValsLength) {\n\t      si = 0;\n\t    }\n\n\t    if (vi >= varValsLength) {\n\t      vi = 0;\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(x.shape, x.dtype, outVals);\n\t}\n\tvar batchNormConfig = {\n\t  kernelName: FusedBatchNorm,\n\t  backendName: 'cpu',\n\t  kernelFunc: batchNorm$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction batchToSpaceND$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var blockShape = attrs.blockShape,\n\t      crops = attrs.crops;\n\t  assertNotComplex([x], 'batchToSpaceND');\n\t  var prod = blockShape.reduce(function (a, b) {\n\t    return a * b;\n\t  });\n\t  var reshaped = getReshaped(x.shape, blockShape, prod);\n\t  var permuted = getPermuted(reshaped.length, blockShape.length);\n\t  var reshapedPermuted = getReshapedPermuted(x.shape, blockShape, prod);\n\t  var sliceBeginCoords = getSliceBeginCoords(crops, blockShape.length);\n\t  var sliceSize = getSliceSize(reshapedPermuted, crops, blockShape.length);\n\t  var xReshaped = reshape$2({\n\t    inputs: {\n\t      x: x\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: reshaped\n\t    }\n\t  });\n\t  var xTransposed = transpose$1({\n\t    inputs: {\n\t      x: xReshaped\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      perm: permuted\n\t    }\n\t  });\n\t  var xTransposedReshaped = reshape$2({\n\t    inputs: {\n\t      x: xTransposed\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: reshapedPermuted\n\t    }\n\t  });\n\t  var result = slice$3({\n\t    inputs: {\n\t      x: xTransposedReshaped\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      begin: sliceBeginCoords,\n\t      size: sliceSize\n\t    }\n\t  });\n\t  backend.disposeIntermediateTensorInfo(xReshaped);\n\t  backend.disposeIntermediateTensorInfo(xTransposed);\n\t  backend.disposeIntermediateTensorInfo(xTransposedReshaped);\n\t  return result;\n\t}\n\tvar batchToSpaceNDConfig = {\n\t  kernelName: BatchToSpaceND,\n\t  backendName: 'cpu',\n\t  kernelFunc: batchToSpaceND$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction bincount$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      weights = inputs.weights;\n\t  var size = attrs.size;\n\t  var xVals = backend.data.get(x.dataId).values;\n\t  var weightsVals = backend.data.get(weights.dataId).values;\n\t  var outVals = bincountImpl(xVals, weightsVals, weights.dtype, weights.shape, size);\n\t  return backend.makeTensorInfo([size], weights.dtype, outVals);\n\t}\n\tvar bincountConfig = {\n\t  kernelName: Bincount,\n\t  backendName: 'cpu',\n\t  kernelFunc: bincount$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar clip = unaryKernelFunc(ClipByValue, function (xi, attrs) {\n\t  var clipAttrs = attrs;\n\n\t  if (xi > clipAttrs.clipValueMax) {\n\t    return clipAttrs.clipValueMax;\n\t  }\n\n\t  return xi < clipAttrs.clipValueMin ? clipAttrs.clipValueMin : xi;\n\t});\n\tvar clipConfig = {\n\t  kernelName: ClipByValue,\n\t  backendName: 'cpu',\n\t  kernelFunc: clip\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar complexAbs = function complexAbs(args) {\n\t  var x = args.inputs.x;\n\t  var cpuBackend = args.backend;\n\t  var resultValues = new Float32Array(sizeFromShape(x.shape));\n\t  var complexVals = cpuBackend.data.get(x.dataId);\n\t  var real = complexVals.complexTensorInfos.real;\n\t  var imag = complexVals.complexTensorInfos.imag;\n\t  var realVals = cpuBackend.data.get(real.dataId).values;\n\t  var imagVals = cpuBackend.data.get(imag.dataId).values;\n\n\t  for (var i = 0; i < realVals.length; i++) {\n\t    var _real = realVals[i];\n\t    var _imag = imagVals[i];\n\t    resultValues[i] = Math.hypot(_real, _imag);\n\t  }\n\n\t  return cpuBackend.makeOutput(resultValues, x.shape, 'float32');\n\t};\n\tvar complexAbsConfig = {\n\t  kernelName: ComplexAbs,\n\t  backendName: 'cpu',\n\t  kernelFunc: complexAbs\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction imag$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var input = inputs.input;\n\t  var imag = backend.data.get(input.dataId).complexTensorInfos.imag;\n\t  var imagVal = backend.data.get(imag.dataId).values; // When complex tensor is disposed, its underlying parts will be disposed too.\n\t  // Make new tensor out of the imag value of the complex. This makes sure the\n\t  // value is still accessible even if complex tensor is disposed.\n\n\t  return backend.makeTensorInfo(imag.shape, imag.dtype, imagVal);\n\t}\n\tvar imagConfig = {\n\t  kernelName: Imag,\n\t  backendName: 'cpu',\n\t  kernelFunc: imag$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction concat$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var axis = attrs.axis;\n\t  var $axis = parseAxisParam(axis, inputs[0].shape)[0];\n\t  var outShape = computeOutShape$1(inputs.map(function (t) {\n\t    return t.shape;\n\t  }), $axis);\n\n\t  if (sizeFromShape(outShape) === 0) {\n\t    return backend.makeTensorInfo(outShape, inputs[0].dtype, []);\n\t  } // Keep only non-empty tensors (ignore tensors with 0 in their shape).\n\n\n\t  var $inputs = inputs.filter(function (t) {\n\t    return sizeFromShape(t.shape) > 0;\n\t  });\n\n\t  if ($inputs.length === 1) {\n\t    return identity$1({\n\t      inputs: {\n\t        x: $inputs[0]\n\t      },\n\t      backend: backend\n\t    });\n\t  }\n\n\t  var shapes = $inputs.map(function (t) {\n\t    return t.shape;\n\t  });\n\t  assertParamsConsistent(shapes, $axis);\n\n\t  if ($inputs[0].dtype === 'complex64') {\n\t    var reals = $inputs.map(function (t) {\n\t      return real$1({\n\t        inputs: {\n\t          input: t\n\t        },\n\t        backend: backend\n\t      });\n\t    });\n\t    var imags = $inputs.map(function (t) {\n\t      return imag$1({\n\t        inputs: {\n\t          input: t\n\t        },\n\t        backend: backend\n\t      });\n\t    });\n\t    var realConcated = concat$1({\n\t      inputs: reals,\n\t      backend: backend,\n\t      attrs: {\n\t        axis: $axis\n\t      }\n\t    });\n\t    var imagConcated = concat$1({\n\t      inputs: imags,\n\t      backend: backend,\n\t      attrs: {\n\t        axis: $axis\n\t      }\n\t    });\n\t    var result = complex$1({\n\t      inputs: {\n\t        real: realConcated,\n\t        imag: imagConcated\n\t      },\n\t      backend: backend\n\t    });\n\t    reals.forEach(function (r) {\n\t      return backend.disposeIntermediateTensorInfo(r);\n\t    });\n\t    imags.forEach(function (i) {\n\t      return backend.disposeIntermediateTensorInfo(i);\n\t    });\n\t    backend.disposeIntermediateTensorInfo(realConcated);\n\t    backend.disposeIntermediateTensorInfo(imagConcated);\n\t    return result;\n\t  } // Any concat of n-dimensional tensors across any axis can be reduced to\n\t  // a concatenation of two-dimensional tensors across the axis 1 by first\n\t  // partitioning the axes of the original tensors into those less than the\n\t  // axis to be concatenated and the rest. Then reshape the tensors\n\t  // into a two-dimensional tensor by collapsing these two sets of axes and\n\t  // concatenate the resulting matrices across the axis 1, finally reshaping\n\t  // the result to have the proper shape.\n\n\n\t  var inputs2D = $inputs.map(function (t) {\n\t    var innerSize = sizeFromShape(t.shape.slice($axis));\n\t    var shape = [-1, innerSize];\n\t    return reshape$2({\n\t      inputs: {\n\t        x: t\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: shape\n\t      }\n\t    });\n\t  });\n\t  var inputsValShapes = inputs2D.map(function (t) {\n\t    return {\n\t      vals: backend.data.get(t.dataId).values,\n\t      shape: t.shape\n\t    };\n\t  }); // Concats 2d tensors along axis=1.\n\n\t  outShape = computeOutShape$1(inputs2D.map(function (t) {\n\t    return t.shape;\n\t  }), 1\n\t  /* axis */\n\t  );\n\t  var simplyConcat = inputs2D[0].shape[0] === 1;\n\t  var outVals = concatImpl(inputsValShapes, outShape, inputs[0].dtype, simplyConcat);\n\t  var finalOutShape = computeOutShape$1($inputs.map(function (t) {\n\t    return t.shape;\n\t  }), $axis);\n\t  var outInfo = backend.makeTensorInfo(finalOutShape, inputs[0].dtype, outVals);\n\t  inputs2D.forEach(function (t) {\n\t    return backend.disposeIntermediateTensorInfo(t);\n\t  });\n\t  return outInfo;\n\t}\n\tvar concatConfig = {\n\t  kernelName: Concat,\n\t  backendName: 'cpu',\n\t  kernelFunc: concat$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction conv2D(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      filter = inputs.filter;\n\t  var strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dataFormat = attrs.dataFormat,\n\t      dilations = attrs.dilations,\n\t      dimRoundingMode = attrs.dimRoundingMode;\n\t  assertNotComplex([x, filter], 'conv2d');\n\t  var $dataFormat = convertConv2DDataFormat(dataFormat);\n\t  var convInfo = computeConv2DInfo(x.shape, filter.shape, strides, dilations, pad, dimRoundingMode, false\n\t  /* depthwise */\n\t  , $dataFormat);\n\t  var filterHeight = convInfo.filterHeight;\n\t  var filterWidth = convInfo.filterWidth;\n\t  var dilationHeight = convInfo.dilationHeight;\n\t  var dilationWidth = convInfo.dilationWidth;\n\t  var padLeft = convInfo.padInfo.left;\n\t  var padTop = convInfo.padInfo.top;\n\t  var isChannelsLast = convInfo.dataFormat === 'channelsLast';\n\t  var y = new TensorBuffer(convInfo.outShape, x.dtype);\n\t  var xStrides = computeStrides(x.shape);\n\t  var filterStrides = computeStrides(filter.shape);\n\t  var xBatchStride = xStrides[0];\n\t  var xRowStride = isChannelsLast ? xStrides[1] : xStrides[2];\n\t  var xColStride = isChannelsLast ? xStrides[2] : 1;\n\t  var xChannelStride = isChannelsLast ? 1 : xStrides[1];\n\t  var yBatchStride = y.strides[0];\n\t  var yRowStride = isChannelsLast ? y.strides[1] : y.strides[2];\n\t  var yColStride = isChannelsLast ? y.strides[2] : 1;\n\t  var yChannelStride = isChannelsLast ? 1 : y.strides[1];\n\t  var xVals = backend.data.get(x.dataId).values;\n\t  var wVals = backend.data.get(filter.dataId).values;\n\t  var yVals = y.values;\n\n\t  for (var b = 0; b < convInfo.batchSize; ++b) {\n\t    var xOffset1 = b * xBatchStride;\n\t    var yOffset1 = b * yBatchStride;\n\n\t    for (var yR = 0; yR < convInfo.outHeight; ++yR) {\n\t      var yOffset2 = yOffset1 + yR * yRowStride;\n\t      var xRCorner = yR * convInfo.strideHeight - padTop;\n\n\t      for (var wR = 0; wR < filterHeight; ++wR) {\n\t        var xR = xRCorner + wR * dilationHeight;\n\n\t        if (xR < 0 || xR >= convInfo.inHeight) {\n\t          continue;\n\t        }\n\n\t        var wOffset1 = wR * filterStrides[0];\n\t        var xOffset2 = xOffset1 + xR * xRowStride;\n\n\t        for (var yC = 0; yC < convInfo.outWidth; ++yC) {\n\t          var yOffset3 = yOffset2 + yC * yColStride;\n\t          var xCCorner = yC * convInfo.strideWidth - padLeft;\n\n\t          for (var wC = 0; wC < filterWidth; ++wC) {\n\t            var xC = xCCorner + wC * dilationWidth;\n\n\t            if (xC < 0 || xC >= convInfo.inWidth) {\n\t              continue;\n\t            }\n\n\t            var wOffset2 = wOffset1 + wC * filterStrides[1];\n\t            var xOffset3 = xOffset2 + xC * xColStride;\n\t            var wOffset3 = wOffset2;\n\n\t            for (var d1 = 0; d1 < convInfo.inChannels; ++d1) {\n\t              var xVal = xVals[xOffset3 + d1 * xChannelStride];\n\n\t              for (var d2 = 0; d2 < convInfo.outChannels; ++d2) {\n\t                yVals[yOffset3 + d2 * yChannelStride] += xVal * wVals[wOffset3 + d2];\n\t              }\n\n\t              wOffset3 += convInfo.outChannels;\n\t            }\n\t          }\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(y.shape, y.dtype, yVals);\n\t}\n\tvar conv2DConfig = {\n\t  kernelName: Conv2D,\n\t  backendName: 'cpu',\n\t  kernelFunc: conv2D\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction conv2DBackpropFilter$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      dy = inputs.dy;\n\t  var strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dataFormat = attrs.dataFormat,\n\t      dimRoundingMode = attrs.dimRoundingMode,\n\t      filterShape = attrs.filterShape;\n\t  assertNotComplex([x, dy], 'conv2dBackpropFilter');\n\t  var $dataFormat = convertConv2DDataFormat(dataFormat);\n\t  var convInfo = computeConv2DInfo(x.shape, filterShape, strides, 1\n\t  /* dilations */\n\t  , pad, dimRoundingMode, false\n\t  /* depthwise */\n\t  , $dataFormat);\n\t  var strideHeight = convInfo.strideHeight,\n\t      strideWidth = convInfo.strideWidth,\n\t      filterHeight = convInfo.filterHeight,\n\t      filterWidth = convInfo.filterWidth;\n\t  var isChannelsLast = convInfo.dataFormat === 'channelsLast';\n\t  var dW = new TensorBuffer(convInfo.filterShape, 'float32');\n\t  var leftPad = convInfo.padInfo.left;\n\t  var topPad = convInfo.padInfo.top;\n\t  var xVals = backend.data.get(x.dataId).values;\n\t  var dyVals = backend.data.get(dy.dataId).values;\n\t  var xBuf = new TensorBuffer(x.shape, x.dtype, xVals);\n\t  var dyBuf = new TensorBuffer(dy.shape, dy.dtype, dyVals);\n\n\t  for (var wR = 0; wR < filterHeight; ++wR) {\n\t    var yRMin = Math.max(0, Math.ceil((topPad - wR) / strideHeight));\n\t    var yRMax = Math.min(convInfo.outHeight, (convInfo.inHeight + topPad - wR) / strideHeight);\n\n\t    for (var wC = 0; wC < filterWidth; ++wC) {\n\t      var yCMin = Math.max(0, Math.ceil((leftPad - wC) / strideWidth));\n\t      var yCMax = Math.min(convInfo.outWidth, (convInfo.inWidth + leftPad - wC) / strideWidth);\n\n\t      for (var d1 = 0; d1 < convInfo.inChannels; ++d1) {\n\t        for (var d2 = 0; d2 < convInfo.outChannels; ++d2) {\n\t          var dotProd = 0;\n\n\t          for (var b = 0; b < convInfo.batchSize; ++b) {\n\t            for (var yR = yRMin; yR < yRMax; ++yR) {\n\t              var xR = wR + yR * strideHeight - topPad;\n\n\t              for (var yC = yCMin; yC < yCMax; ++yC) {\n\t                var xC = wC + yC * strideWidth - leftPad;\n\n\t                if (isChannelsLast) {\n\t                  dotProd += xBuf.get(b, xR, xC, d1) * dyBuf.get(b, yR, yC, d2);\n\t                } else {\n\t                  dotProd += xBuf.get(b, d1, xR, xC) * dyBuf.get(b, d2, yR, yC);\n\t                }\n\t              }\n\t            }\n\t          }\n\n\t          dW.set(dotProd, wR, wC, d1, d2);\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(dW.shape, dW.dtype, dW.values);\n\t}\n\tvar conv2DBackpropFilterConfig = {\n\t  kernelName: Conv2DBackpropFilter,\n\t  backendName: 'cpu',\n\t  kernelFunc: conv2DBackpropFilter$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction conv2DBackpropInput$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var dy = inputs.dy,\n\t      filter = inputs.filter;\n\t  var inputShape = attrs.inputShape,\n\t      strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dataFormat = attrs.dataFormat,\n\t      dimRoundingMode = attrs.dimRoundingMode;\n\t  assertNotComplex([dy, filter], 'conv2dBackpropInput');\n\t  var filterStrides = computeStrides(filter.shape);\n\t  var dyStrides = computeStrides(dy.shape);\n\t  var $dataFormat = convertConv2DDataFormat(dataFormat);\n\t  var convInfo = computeConv2DInfo(inputShape, filter.shape, strides, 1\n\t  /* dilations */\n\t  , pad, dimRoundingMode, false, $dataFormat);\n\t  var dx = new TensorBuffer(convInfo.inShape, 'float32');\n\t  var dxValues = dx.values;\n\t  var dyValues = backend.data.get(dy.dataId).values;\n\t  var fltValues = backend.data.get(filter.dataId).values;\n\t  var fltS0 = filterStrides[0],\n\t      fltS1 = filterStrides[1],\n\t      fltS2 = filterStrides[2];\n\t  var batchSize = convInfo.batchSize,\n\t      filterHeight = convInfo.filterHeight,\n\t      filterWidth = convInfo.filterWidth,\n\t      inChannels = convInfo.inChannels,\n\t      inHeight = convInfo.inHeight,\n\t      inWidth = convInfo.inWidth,\n\t      outChannels = convInfo.outChannels,\n\t      outHeight = convInfo.outHeight,\n\t      outWidth = convInfo.outWidth,\n\t      strideHeight = convInfo.strideHeight,\n\t      strideWidth = convInfo.strideWidth;\n\t  $dataFormat = convInfo.dataFormat;\n\t  var topPad = filterHeight - 1 - convInfo.padInfo.top;\n\t  var leftPad = filterWidth - 1 - convInfo.padInfo.left;\n\t  var isChannelsLast = $dataFormat === 'channelsLast';\n\t  var xBatchStride = dx.strides[0];\n\t  var xRowStride = isChannelsLast ? dx.strides[1] : dx.strides[2];\n\t  var xColStride = isChannelsLast ? dx.strides[2] : 1;\n\t  var xChannelStride = isChannelsLast ? 1 : dx.strides[1];\n\t  var yBatchStride = dyStrides[0];\n\t  var yRowStride = isChannelsLast ? dyStrides[1] : dyStrides[2];\n\t  var yColStride = isChannelsLast ? dyStrides[2] : 1;\n\t  var yChannelStride = isChannelsLast ? 1 : dyStrides[1];\n\n\t  for (var b = 0; b < batchSize; ++b) {\n\t    for (var d1 = 0; d1 < inChannels; ++d1) {\n\t      for (var xR = 0; xR < inHeight; ++xR) {\n\t        var xRCorner = xR - topPad;\n\t        var xRMin = Math.max(0, Math.ceil(xRCorner / strideHeight));\n\t        var yRMax = Math.min(outHeight, (filterHeight + xRCorner) / strideHeight);\n\n\t        for (var xC = 0; xC < inWidth; ++xC) {\n\t          var xCCorner = xC - leftPad;\n\t          var xCMin = Math.max(0, Math.ceil(xCCorner / strideWidth));\n\t          var yCMax = Math.min(outWidth, (filterWidth + xCCorner) / strideWidth);\n\t          var dotProd = 0;\n\n\t          for (var yR = xRMin; yR < yRMax; ++yR) {\n\t            var wR = yR * strideHeight - xRCorner;\n\n\t            for (var yC = xCMin; yC < yCMax; ++yC) {\n\t              var wC = yC * strideWidth - xCCorner;\n\t              var dyOffset = yBatchStride * b + yRowStride * yR + yColStride * yC;\n\t              var fltOffset = fltS0 * (filterHeight - 1 - wR) + fltS1 * (filterWidth - 1 - wC) + fltS2 * d1;\n\n\t              for (var d2 = 0; d2 < outChannels; ++d2) {\n\t                var pixel = dyValues[dyOffset + yChannelStride * d2];\n\t                var weight = fltValues[fltOffset + d2];\n\t                dotProd += pixel * weight;\n\t              }\n\t            }\n\t          }\n\n\t          var dxOffset = xBatchStride * b + xRowStride * xR + xColStride * xC + xChannelStride * d1;\n\t          dxValues[dxOffset] = dotProd;\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n\t}\n\tvar conv2DBackpropInputConfig = {\n\t  kernelName: Conv2DBackpropInput,\n\t  backendName: 'cpu',\n\t  kernelFunc: conv2DBackpropInput$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction conv3D(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      filter = inputs.filter;\n\t  var strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dilations = attrs.dilations;\n\t  assertNotComplex([x, filter], 'conv3d');\n\t  var convInfo = computeConv3DInfo(x.shape, filter.shape, strides, dilations, pad);\n\t  var filterDepth = convInfo.filterDepth,\n\t      filterHeight = convInfo.filterHeight,\n\t      filterWidth = convInfo.filterWidth,\n\t      dilationDepth = convInfo.dilationDepth,\n\t      dilationHeight = convInfo.dilationHeight,\n\t      dilationWidth = convInfo.dilationWidth,\n\t      padInfo = convInfo.padInfo;\n\t  var padFront = padInfo.front;\n\t  var padLeft = padInfo.left;\n\t  var padTop = padInfo.top;\n\t  var y = new TensorBuffer(convInfo.outShape, x.dtype);\n\t  var xVals = backend.data.get(x.dataId).values;\n\t  var wVals = backend.data.get(filter.dataId).values;\n\t  var yVals = y.values;\n\t  var xStrides = computeStrides(x.shape);\n\t  var filterStrides = computeStrides(filter.shape);\n\n\t  for (var b = 0; b < convInfo.batchSize; ++b) {\n\t    var xOffset1 = b * xStrides[0];\n\t    var yOffset1 = b * y.strides[0];\n\n\t    for (var yF = 0; yF < convInfo.outDepth; ++yF) {\n\t      var yOffset2 = yOffset1 + yF * y.strides[1];\n\t      var xFCorner = yF * convInfo.strideDepth - padFront;\n\n\t      for (var wF = 0; wF < filterDepth; ++wF) {\n\t        var xF = xFCorner + wF * dilationDepth;\n\n\t        if (xF < 0 || xF >= convInfo.inDepth) {\n\t          continue;\n\t        }\n\n\t        var wOffset1 = wF * filterStrides[0];\n\t        var xOffset2 = xOffset1 + xF * xStrides[1];\n\n\t        for (var yR = 0; yR < convInfo.outHeight; ++yR) {\n\t          var yOffset3 = yOffset2 + yR * y.strides[2];\n\t          var xRCorner = yR * convInfo.strideHeight - padTop;\n\n\t          for (var wR = 0; wR < filterHeight; ++wR) {\n\t            var xR = xRCorner + wR * dilationHeight;\n\n\t            if (xR < 0 || xR >= convInfo.inHeight) {\n\t              continue;\n\t            }\n\n\t            var wOffset2 = wOffset1 + wR * filterStrides[1];\n\t            var xOffset3 = xOffset2 + xR * xStrides[2];\n\n\t            for (var yC = 0; yC < convInfo.outWidth; ++yC) {\n\t              var yOffset4 = yOffset3 + yC * convInfo.outChannels;\n\t              var xCCorner = yC * convInfo.strideWidth - padLeft;\n\n\t              for (var wC = 0; wC < filterWidth; ++wC) {\n\t                var xC = xCCorner + wC * dilationWidth;\n\n\t                if (xC < 0 || xC >= convInfo.inWidth) {\n\t                  continue;\n\t                }\n\n\t                var wOffset3 = wOffset2 + wC * filterStrides[2];\n\t                var xOffset4 = xOffset3 + xC * convInfo.inChannels;\n\t                var wOffset4 = wOffset3;\n\n\t                for (var d1 = 0; d1 < convInfo.inChannels; ++d1) {\n\t                  var xVal = xVals[xOffset4 + d1];\n\n\t                  for (var d2 = 0; d2 < convInfo.outChannels; ++d2) {\n\t                    yVals[yOffset4 + d2] += xVal * wVals[wOffset4 + d2];\n\t                  }\n\n\t                  wOffset4 += convInfo.outChannels;\n\t                }\n\t              }\n\t            }\n\t          }\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(y.shape, y.dtype, y.values);\n\t}\n\tvar conv3DConfig = {\n\t  kernelName: Conv3D,\n\t  backendName: 'cpu',\n\t  kernelFunc: conv3D\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction conv3DBackpropFilterV2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      dy = inputs.dy;\n\t  var strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      filterShape = attrs.filterShape;\n\t  assertNotComplex([x, dy], 'conv3dBackpropFilterV2');\n\t  var xStrides = computeStrides(x.shape);\n\t  var dyStrides = computeStrides(dy.shape);\n\t  var convInfo = computeConv3DInfo(x.shape, filterShape, strides, 1\n\t  /* dilations */\n\t  , pad);\n\t  var strideDepth = convInfo.strideDepth;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var filterDepth = convInfo.filterDepth;\n\t  var filterHeight = convInfo.filterHeight;\n\t  var filterWidth = convInfo.filterWidth;\n\t  var dw = new TensorBuffer(convInfo.filterShape, 'float32');\n\t  var dwValues = dw.values;\n\t  var _dw$strides = dw.strides,\n\t      dwS0 = _dw$strides[0],\n\t      dwS1 = _dw$strides[1],\n\t      dwS2 = _dw$strides[2],\n\t      dwS3 = _dw$strides[3];\n\t  var dyValues = backend.data.get(dy.dataId).values;\n\t  var dyS0 = dyStrides[0],\n\t      dyS1 = dyStrides[1],\n\t      dyS2 = dyStrides[2],\n\t      dyS3 = dyStrides[3];\n\t  var xValues = backend.data.get(x.dataId).values;\n\t  var xS0 = xStrides[0],\n\t      xS1 = xStrides[1],\n\t      xS2 = xStrides[2],\n\t      xS3 = xStrides[3];\n\t  var frontPad = convInfo.padInfo.front;\n\t  var leftPad = convInfo.padInfo.left;\n\t  var topPad = convInfo.padInfo.top;\n\n\t  for (var wF = 0; wF < filterDepth; ++wF) {\n\t    var yFMin = Math.max(0, Math.ceil((frontPad - wF) / strideDepth));\n\t    var yFMax = Math.min(convInfo.outDepth, (convInfo.inDepth + frontPad - wF) / strideDepth);\n\t    var wOffset1 = wF * dwS0;\n\n\t    for (var wR = 0; wR < filterHeight; ++wR) {\n\t      var yRMin = Math.max(0, Math.ceil((topPad - wR) / strideHeight));\n\t      var yRMax = Math.min(convInfo.outHeight, (convInfo.inHeight + topPad - wR) / strideHeight);\n\t      var wOffset2 = wR * dwS1 + wOffset1;\n\n\t      for (var wC = 0; wC < filterWidth; ++wC) {\n\t        var yCMin = Math.max(0, Math.ceil((leftPad - wC) / strideWidth));\n\t        var yCMax = Math.min(convInfo.outWidth, (convInfo.inWidth + leftPad - wC) / strideWidth);\n\t        var wOffset3 = wC * dwS2 + wOffset2;\n\n\t        for (var d1 = 0; d1 < convInfo.inChannels; ++d1) {\n\t          var wOffset4 = d1 * dwS3 + wOffset3;\n\n\t          for (var d2 = 0; d2 < convInfo.outChannels; ++d2) {\n\t            var dotProd = 0;\n\n\t            for (var b = 0; b < convInfo.batchSize; ++b) {\n\t              var xOffset1 = b * xS0;\n\t              var yOffset1 = b * dyS0;\n\n\t              for (var yF = yFMin; yF < yFMax; ++yF) {\n\t                var xF = wF + yF * strideDepth - frontPad;\n\t                var xOffset2 = xF * xS1 + xOffset1;\n\t                var yOffset2 = yF * dyS1 + yOffset1;\n\n\t                for (var yR = yRMin; yR < yRMax; ++yR) {\n\t                  var xR = wR + yR * strideHeight - topPad;\n\t                  var xOffset3 = xR * xS2 + xOffset2;\n\t                  var yOffset3 = yR * dyS2 + yOffset2;\n\n\t                  for (var yC = yCMin; yC < yCMax; ++yC) {\n\t                    var xC = wC + yC * strideWidth - leftPad;\n\t                    var xOffset4 = xC * xS3 + xOffset3;\n\t                    var yOffset4 = yC * dyS3 + yOffset3;\n\t                    dotProd += xValues[xOffset4 + d1] * dyValues[yOffset4 + d2];\n\t                  }\n\t                }\n\t              }\n\t            }\n\n\t            dwValues[wOffset4 + d2] = dotProd;\n\t          }\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(dw.shape, dw.dtype, dw.values);\n\t}\n\tvar conv3DBackpropFilterV2Config = {\n\t  kernelName: Conv3DBackpropFilterV2,\n\t  backendName: 'cpu',\n\t  kernelFunc: conv3DBackpropFilterV2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction conv3DBackpropInputV2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var dy = inputs.dy,\n\t      filter = inputs.filter;\n\t  var pad = attrs.pad,\n\t      strides = attrs.strides,\n\t      inputShape = attrs.inputShape;\n\t  assertNotComplex([dy], 'conv3dBackpropInputV2');\n\t  var dyStrides = computeStrides(dy.shape);\n\t  var filterStrides = computeStrides(filter.shape);\n\t  var convInfo = computeConv3DInfo(inputShape, filter.shape, strides, 1\n\t  /* dilations */\n\t  , pad);\n\t  var dx = new TensorBuffer(convInfo.inShape, 'float32');\n\t  var dxValues = dx.values;\n\t  var _dx$strides = dx.strides,\n\t      dxS0 = _dx$strides[0],\n\t      dxS1 = _dx$strides[1],\n\t      dxS2 = _dx$strides[2],\n\t      dxS3 = _dx$strides[3];\n\t  var dyValues = backend.data.get(dy.dataId).values;\n\t  var dyS0 = dyStrides[0],\n\t      dyS1 = dyStrides[1],\n\t      dyS2 = dyStrides[2],\n\t      dyS3 = dyStrides[3];\n\t  var fltValues = backend.data.get(filter.dataId).values;\n\t  var fltS0 = filterStrides[0],\n\t      fltS1 = filterStrides[1],\n\t      fltS2 = filterStrides[2],\n\t      fltS3 = filterStrides[3];\n\t  var batchSize = convInfo.batchSize,\n\t      filterDepth = convInfo.filterDepth,\n\t      filterHeight = convInfo.filterHeight,\n\t      filterWidth = convInfo.filterWidth,\n\t      inChannels = convInfo.inChannels,\n\t      inDepth = convInfo.inDepth,\n\t      inHeight = convInfo.inHeight,\n\t      inWidth = convInfo.inWidth,\n\t      outChannels = convInfo.outChannels,\n\t      outDepth = convInfo.outDepth,\n\t      outHeight = convInfo.outHeight,\n\t      outWidth = convInfo.outWidth,\n\t      strideDepth = convInfo.strideDepth,\n\t      strideHeight = convInfo.strideHeight,\n\t      strideWidth = convInfo.strideWidth;\n\t  var frontPad = filterDepth - 1 - convInfo.padInfo.front;\n\t  var topPad = filterHeight - 1 - convInfo.padInfo.top;\n\t  var leftPad = filterWidth - 1 - convInfo.padInfo.left;\n\n\t  for (var b = 0; b < batchSize; ++b) {\n\t    for (var d1 = 0; d1 < inChannels; ++d1) {\n\t      // Frames of depth\n\t      for (var xF = 0; xF < inDepth; ++xF) {\n\t        var xFCorner = xF - frontPad;\n\t        var xFMin = Math.max(0, Math.ceil(xFCorner / strideDepth));\n\t        var yFMax = Math.min(outDepth, (filterDepth + xFCorner) / strideDepth); // Rows as per standard 2d matrix notation\n\n\t        for (var xR = 0; xR < inHeight; ++xR) {\n\t          var xRCorner = xR - topPad;\n\t          var xRMin = Math.max(0, Math.ceil(xRCorner / strideHeight));\n\t          var yRMax = Math.min(outHeight, (filterHeight + xRCorner) / strideHeight); // Columns as per standard 2d matrix notation\n\n\t          for (var xC = 0; xC < inWidth; ++xC) {\n\t            var xCCorner = xC - leftPad;\n\t            var xCMin = Math.max(0, Math.ceil(xCCorner / strideWidth));\n\t            var yCMax = Math.min(outWidth, (filterWidth + xCCorner) / strideWidth);\n\t            var dotProd = 0;\n\n\t            for (var yF = xFMin; yF < yFMax; ++yF) {\n\t              var wF = yF * strideDepth - xFCorner;\n\n\t              for (var yR = xRMin; yR < yRMax; ++yR) {\n\t                var wR = yR * strideHeight - xRCorner;\n\n\t                for (var yC = xCMin; yC < yCMax; ++yC) {\n\t                  var wC = yC * strideWidth - xCCorner;\n\t                  var dyOffset = dyS0 * b + dyS1 * yF + dyS2 * yR + dyS3 * yC;\n\t                  var fltOffset = fltS0 * (filterDepth - 1 - wF) + fltS1 * (filterHeight - 1 - wR) + fltS2 * (filterWidth - 1 - wC) + fltS3 * d1;\n\n\t                  for (var d2 = 0; d2 < outChannels; ++d2) {\n\t                    var pixel = dyValues[dyOffset + d2];\n\t                    var weight = fltValues[fltOffset + d2];\n\t                    dotProd += pixel * weight;\n\t                  }\n\t                }\n\t              }\n\t            }\n\n\t            dxValues[dxS0 * b + dxS1 * xF + dxS2 * xR + dxS3 * xC + d1] = dotProd;\n\t          }\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n\t}\n\tvar conv3DBackpropInputV2Config = {\n\t  kernelName: Conv3DBackpropInputV2,\n\t  backendName: 'cpu',\n\t  kernelFunc: conv3DBackpropInputV2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar cos$1 = unaryKernelFunc(Cos, function (xi) {\n\t  return Math.cos(xi);\n\t});\n\tvar cosConfig = {\n\t  kernelName: Cos,\n\t  backendName: 'cpu',\n\t  kernelFunc: cos$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar cosh$1 = unaryKernelFunc(Cosh, function (xi) {\n\t  return Math.cosh(xi);\n\t});\n\tvar coshConfig = {\n\t  kernelName: Cosh,\n\t  backendName: 'cpu',\n\t  kernelFunc: cosh$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction cropAndResize$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var image = inputs.image,\n\t      boxes = inputs.boxes,\n\t      boxInd = inputs.boxInd;\n\t  var cropSize = attrs.cropSize,\n\t      method = attrs.method,\n\t      extrapolationValue = attrs.extrapolationValue;\n\t  var _image$shape = image.shape,\n\t      batch = _image$shape[0],\n\t      imageHeight = _image$shape[1],\n\t      imageWidth = _image$shape[2],\n\t      numChannels = _image$shape[3];\n\t  var numBoxes = boxes.shape[0];\n\t  var cropHeight = cropSize[0],\n\t      cropWidth = cropSize[1];\n\t  var output = buffer([numBoxes, cropHeight, cropWidth, numChannels], 'float32');\n\t  var boxVals = backend.data.get(boxes.dataId).values;\n\t  var boxIndVals = backend.data.get(boxInd.dataId).values;\n\t  var imageVals = backend.data.get(image.dataId).values;\n\t  var inStride = computeStrides(image.shape); // to calculate flat indexes into image\n\n\t  var outStride = computeStrides(output.shape); // to calculate flat indexes into output\n\t  // Reference implementation\n\t  // tslint:disable-next-line:max-line-length\n\t  // https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/crop_and_resize_op.cc\n\n\t  for (var b = 0; b < numBoxes; b++) {\n\t    var startInd = b * 4;\n\t    var y1 = boxVals[startInd];\n\t    var x1 = boxVals[startInd + 1];\n\t    var y2 = boxVals[startInd + 2];\n\t    var x2 = boxVals[startInd + 3];\n\t    var bInd = boxIndVals[b];\n\n\t    if (bInd >= batch) {\n\t      continue;\n\t    }\n\n\t    var heightScale = cropHeight > 1 ? (y2 - y1) * (imageHeight - 1) / (cropHeight - 1) : 0;\n\t    var widthScale = cropWidth > 1 ? (x2 - x1) * (imageWidth - 1) / (cropWidth - 1) : 0;\n\n\t    for (var y = 0; y < cropHeight; y++) {\n\t      var yInd = cropHeight > 1 ? y1 * (imageHeight - 1) + y * heightScale : 0.5 * (y1 + y2) * (imageHeight - 1);\n\n\t      if (yInd < 0 || yInd > imageHeight - 1) {\n\t        for (var x = 0; x < cropWidth; x++) {\n\t          for (var c = 0; c < numChannels; c++) {\n\t            var ind = c + x * outStride[2] + y * outStride[1] + b * outStride[0];\n\t            output.values[ind] = extrapolationValue;\n\t          }\n\t        }\n\n\t        continue;\n\t      }\n\n\t      if (method === 'bilinear') {\n\t        var topInd = Math.floor(yInd);\n\t        var bottomInd = Math.ceil(yInd);\n\t        var yLerp = yInd - topInd;\n\n\t        for (var _x = 0; _x < cropWidth; _x++) {\n\t          var xInd = cropWidth > 1 ? x1 * (imageWidth - 1) + _x * widthScale : 0.5 * (x1 + x2) * (imageWidth - 1);\n\n\t          if (xInd < 0 || xInd > imageWidth - 1) {\n\t            for (var _c = 0; _c < numChannels; _c++) {\n\t              var _ind = _c + _x * outStride[2] + y * outStride[1] + b * outStride[0];\n\n\t              output.values[_ind] = extrapolationValue;\n\t            }\n\n\t            continue;\n\t          }\n\n\t          var leftInd = Math.floor(xInd);\n\t          var rightInd = Math.ceil(xInd);\n\t          var xLerp = xInd - leftInd;\n\n\t          for (var _c2 = 0; _c2 < numChannels; _c2++) {\n\t            var _ind2 = _c2 + leftInd * inStride[2] + topInd * inStride[1] + bInd * inStride[0];\n\n\t            var topLeft = imageVals[_ind2];\n\t            _ind2 = _c2 + rightInd * inStride[2] + topInd * inStride[1] + bInd * inStride[0];\n\t            var topRight = imageVals[_ind2];\n\t            _ind2 = _c2 + leftInd * inStride[2] + bottomInd * inStride[1] + bInd * inStride[0];\n\t            var bottomLeft = imageVals[_ind2];\n\t            _ind2 = _c2 + rightInd * inStride[2] + bottomInd * inStride[1] + bInd * inStride[0];\n\t            var bottomRight = imageVals[_ind2];\n\t            var top = topLeft + (topRight - topLeft) * xLerp;\n\t            var bottom = bottomLeft + (bottomRight - bottomLeft) * xLerp;\n\t            _ind2 = _c2 + _x * outStride[2] + y * outStride[1] + b * outStride[0];\n\t            output.values[_ind2] = top + (bottom - top) * yLerp;\n\t          }\n\t        }\n\t      } else {\n\t        // method == \"nearest\"\n\t        for (var _x2 = 0; _x2 < cropWidth; ++_x2) {\n\t          var _xInd = cropWidth > 1 ? x1 * (imageWidth - 1) + _x2 * widthScale : 0.5 * (x1 + x2) * (imageWidth - 1);\n\n\t          if (_xInd < 0 || _xInd > imageWidth - 1) {\n\t            for (var _c3 = 0; _c3 < numChannels; _c3++) {\n\t              var _ind3 = _c3 + _x2 * outStride[2] + y * outStride[1] + b * outStride[0];\n\n\t              output.values[_ind3] = extrapolationValue;\n\t            }\n\n\t            continue;\n\t          }\n\n\t          var closestX = Math.round(_xInd);\n\t          var closestY = Math.round(yInd);\n\n\t          for (var _c4 = 0; _c4 < numChannels; _c4++) {\n\t            var inInd = _c4 + closestX * inStride[2] + closestY * inStride[1] + bInd * inStride[0];\n\t            var outInd = _c4 + _x2 * outStride[2] + y * outStride[1] + b * outStride[0];\n\t            output.values[outInd] = imageVals[inInd];\n\t          }\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(output.shape, output.dtype, output.values);\n\t}\n\tvar cropAndResizeConfig = {\n\t  kernelName: CropAndResize,\n\t  backendName: 'cpu',\n\t  kernelFunc: cropAndResize$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction cumsum$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var axis = attrs.axis,\n\t      exclusive = attrs.exclusive,\n\t      reverse = attrs.reverse;\n\t  assertNotComplex(x, 'cumsum');\n\t  var permutation = getAxesPermutation([axis], x.shape.length);\n\t  var $x = x;\n\n\t  if (permutation != null) {\n\t    $x = transpose$1({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        perm: permutation\n\t      }\n\t    });\n\t  }\n\n\t  var permutedAxis = getInnerMostAxes(1, x.shape.length)[0];\n\n\t  if (permutedAxis !== $x.shape.length - 1) {\n\t    throw new Error(\"backend.cumsum in CPU expects an inner-most \" + (\"axis=\" + ($x.shape.length - 1) + \" but got axis=\" + permutedAxis));\n\t  }\n\n\t  var resultDtype = upcastType($x.dtype, 'int32');\n\t  var vals = makeZerosTypedArray(sizeFromShape($x.shape), resultDtype);\n\t  var aVals = backend.data.get($x.dataId).values;\n\t  var finalDim = $x.shape[$x.shape.length - 1];\n\t  var indexAdjuster = reverse ? function (i, j) {\n\t    return i + finalDim - j - 1;\n\t  } : function (i, j) {\n\t    return i + j;\n\t  };\n\n\t  for (var i = 0; i < aVals.length; i += finalDim) {\n\t    for (var j = 0; j < finalDim; j++) {\n\t      var idx = indexAdjuster(i, j);\n\n\t      if (j === 0) {\n\t        vals[idx] = exclusive ? 0 : aVals[idx];\n\t      } else {\n\t        var prevIdx = indexAdjuster(i, j - 1);\n\t        vals[idx] = exclusive ? aVals[prevIdx] + vals[prevIdx] : aVals[idx] + vals[prevIdx];\n\t      }\n\t    }\n\t  }\n\n\t  var result = backend.makeTensorInfo($x.shape, resultDtype, vals);\n\n\t  if (permutation != null) {\n\t    var reversePermutation = getUndoAxesPermutation(permutation);\n\t    var reverseTransposedResult = transpose$1({\n\t      inputs: {\n\t        x: result\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        perm: reversePermutation\n\t      }\n\t    });\n\t    backend.disposeIntermediateTensorInfo(result);\n\t    backend.disposeIntermediateTensorInfo($x);\n\t    return reverseTransposedResult;\n\t  }\n\n\t  return result;\n\t}\n\tvar cumsumConfig = {\n\t  kernelName: Cumsum,\n\t  backendName: 'cpu',\n\t  kernelFunc: cumsum$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction denseBincount$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      weights = inputs.weights;\n\t  var size = attrs.size,\n\t      binaryOutput = attrs.binaryOutput;\n\n\t  if (x.shape.length === 1) {\n\t    var xVals = backend.data.get(x.dataId).values;\n\t    var weightsVals = backend.data.get(weights.dataId).values;\n\t    var outVals = bincountImpl(xVals, weightsVals, weights.dtype, weights.shape, size);\n\t    return backend.makeTensorInfo([size], weights.dtype, outVals);\n\t  } else if (x.shape.length === 2) {\n\t    var xBuf = backend.bufferSync(x);\n\t    var weightsBuf = backend.bufferSync(weights);\n\t    var outBuf = bincountReduceImpl(xBuf, weightsBuf, size, binaryOutput);\n\t    return backend.makeTensorInfo(outBuf.shape, weights.dtype, outBuf.values);\n\t  }\n\n\t  throw new Error(\"Error in denseBincount: input must be at most rank 2, but got rank\" + (x.shape.length + \".\"));\n\t}\n\tvar denseBincountConfig = {\n\t  kernelName: DenseBincount,\n\t  backendName: 'cpu',\n\t  kernelFunc: denseBincount$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction depthToSpace$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var blockSize = attrs.blockSize,\n\t      dataFormat = attrs.dataFormat;\n\t  assert(dataFormat === 'NHWC', function () {\n\t    return \"Only NHWC dataFormat supported on CPU for depthToSpace. Got \" + dataFormat;\n\t  });\n\t  assert(blockSize > 1, function () {\n\t    return \"blockSize should be > 1 for depthToSpace, but was: \" + blockSize;\n\t  });\n\t  var batchSize = x.shape[0];\n\t  var inputHeight = x.shape[1];\n\t  var inputWidth = x.shape[2];\n\t  var inputDepth = x.shape[3];\n\t  var outputHeight = inputHeight * blockSize;\n\t  var outputWidth = inputWidth * blockSize;\n\t  var outputDepth = inputDepth / (blockSize * blockSize);\n\t  var xValues = backend.data.get(x.dataId).values;\n\t  var result = new Float32Array(batchSize * outputHeight * outputWidth * outputDepth);\n\t  var outputIdx = 0;\n\n\t  for (var b = 0; b < batchSize; ++b) {\n\t    for (var h = 0; h < outputHeight; ++h) {\n\t      var inH = Math.floor(h / blockSize);\n\t      var offsetH = h % blockSize;\n\n\t      for (var w = 0; w < outputWidth; ++w) {\n\t        var inW = Math.floor(w / blockSize);\n\t        var offsetW = w % blockSize;\n\t        var offsetD = (offsetH * blockSize + offsetW) * outputDepth;\n\n\t        for (var d = 0; d < outputDepth; ++d) {\n\t          var inD = d + offsetD;\n\t          var inputIdx = inD + inputDepth * (inW + inputWidth * (inH + inputHeight * b));\n\t          result[outputIdx++] = xValues[inputIdx];\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo([batchSize, outputHeight, outputWidth, outputDepth], x.dtype, result);\n\t}\n\tvar depthToSpaceConfig = {\n\t  kernelName: DepthToSpace,\n\t  backendName: 'cpu',\n\t  kernelFunc: depthToSpace$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction depthwiseConv2dNative(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      filter = inputs.filter;\n\t  var strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dilations = attrs.dilations,\n\t      dimRoundingMode = attrs.dimRoundingMode;\n\t  assertNotComplex([x, filter], 'depthwiseConv2DNative');\n\t  var xStrides = computeStrides(x.shape);\n\t  var filterStrides = computeStrides(filter.shape);\n\t  var $dilations = dilations;\n\n\t  if ($dilations == null) {\n\t    $dilations = [1, 1];\n\t  }\n\n\t  assert(eitherStridesOrDilationsAreOne(strides, $dilations), function () {\n\t    return 'Error in depthwiseConv2d: Either strides or dilations must be ' + (\"1. Got strides \" + strides + \" and dilations '\" + $dilations + \"'\");\n\t  });\n\t  var convInfo = computeConv2DInfo(x.shape, filter.shape, strides, $dilations, pad, dimRoundingMode, true\n\t  /* depthwise */\n\t  );\n\t  var filterHeight = convInfo.filterHeight,\n\t      filterWidth = convInfo.filterWidth,\n\t      dilationHeight = convInfo.dilationHeight,\n\t      dilationWidth = convInfo.dilationWidth,\n\t      padInfo = convInfo.padInfo;\n\t  var padLeft = padInfo.left;\n\t  var padTop = padInfo.top;\n\t  var chMul = convInfo.outChannels / convInfo.inChannels;\n\t  var y = new TensorBuffer(convInfo.outShape, x.dtype);\n\t  var xVals = backend.data.get(x.dataId).values;\n\t  var wVals = backend.data.get(filter.dataId).values;\n\t  var yVals = y.values;\n\n\t  for (var b = 0; b < convInfo.batchSize; ++b) {\n\t    var xOffset1 = b * xStrides[0];\n\t    var yOffset1 = b * y.strides[0];\n\n\t    for (var yR = 0; yR < convInfo.outHeight; ++yR) {\n\t      var yOffset2 = yOffset1 + yR * y.strides[1];\n\t      var xRCorner = yR * convInfo.strideHeight - padLeft;\n\n\t      for (var wR = 0; wR < filterHeight; ++wR) {\n\t        var xR = xRCorner + wR * dilationHeight;\n\n\t        if (xR < 0 || xR >= convInfo.inHeight) {\n\t          continue;\n\t        }\n\n\t        var wOffset1 = wR * filterStrides[0];\n\t        var xOffset2 = xOffset1 + xR * xStrides[1];\n\n\t        for (var yC = 0; yC < convInfo.outWidth; ++yC) {\n\t          var yOffset3 = yOffset2 + yC * y.strides[2];\n\t          var xCCorner = yC * convInfo.strideWidth - padTop;\n\n\t          for (var wC = 0; wC < filterWidth; ++wC) {\n\t            var xC = xCCorner + wC * dilationWidth;\n\n\t            if (xC < 0 || xC >= convInfo.inWidth) {\n\t              continue;\n\t            }\n\n\t            var wOffset2 = wOffset1 + wC * filterStrides[1];\n\t            var xOffset3 = xOffset2 + xC * convInfo.inChannels;\n\t            var yOffset4 = yOffset3;\n\t            var wOffset3 = wOffset2;\n\n\t            for (var d1 = 0; d1 < convInfo.inChannels; ++d1) {\n\t              var xVal = xVals[xOffset3 + d1];\n\n\t              for (var q = 0; q < chMul; ++q) {\n\t                yVals[yOffset4 + q] += xVal * wVals[wOffset3 + q];\n\t              }\n\n\t              yOffset4 += chMul;\n\t              wOffset3 += chMul;\n\t            }\n\t          }\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(y.shape, y.dtype, y.values);\n\t}\n\tvar depthwiseConv2dNativeConfig = {\n\t  kernelName: DepthwiseConv2dNative,\n\t  backendName: 'cpu',\n\t  kernelFunc: depthwiseConv2dNative\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction depthwiseConv2dNativeBackpropFilter$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      dy = inputs.dy;\n\t  var strides = attrs.strides,\n\t      dilations = attrs.dilations,\n\t      pad = attrs.pad,\n\t      dimRoundingMode = attrs.dimRoundingMode,\n\t      filterShape = attrs.filterShape;\n\t  assertNotComplex([x, dy], 'depthwiseConv2dNativeBackpropFilter');\n\t  var convInfo = computeConv2DInfo(x.shape, filterShape, strides, dilations, pad, dimRoundingMode, true\n\t  /* depthwise */\n\t  );\n\t  var strideHeight = convInfo.strideHeight,\n\t      strideWidth = convInfo.strideWidth,\n\t      filterHeight = convInfo.filterHeight,\n\t      filterWidth = convInfo.filterWidth;\n\t  var dW = new TensorBuffer(convInfo.filterShape, 'float32');\n\t  var leftPad = convInfo.padInfo.left;\n\t  var topPad = convInfo.padInfo.top;\n\t  var chMul = convInfo.outChannels / convInfo.inChannels;\n\t  var xVals = backend.data.get(x.dataId).values;\n\t  var xBuf = new TensorBuffer(x.shape, x.dtype, xVals);\n\t  var dyVals = backend.data.get(dy.dataId).values;\n\t  var dyBuf = new TensorBuffer(dy.shape, dy.dtype, dyVals);\n\n\t  for (var wR = 0; wR < filterHeight; ++wR) {\n\t    var yRMin = Math.max(0, Math.ceil((topPad - wR) / strideHeight));\n\t    var yRMax = Math.min(convInfo.outHeight, (convInfo.inHeight + topPad - wR) / strideHeight);\n\n\t    for (var wC = 0; wC < filterWidth; ++wC) {\n\t      var yCMin = Math.max(0, Math.ceil((leftPad - wC) / strideWidth));\n\t      var yCMax = Math.min(convInfo.outWidth, (convInfo.inWidth + leftPad - wC) / strideWidth);\n\n\t      for (var d2 = 0; d2 < convInfo.outChannels; ++d2) {\n\t        var d1 = Math.trunc(d2 / chMul);\n\t        var dm = d2 % chMul;\n\t        var dotProd = 0;\n\n\t        for (var b = 0; b < convInfo.batchSize; ++b) {\n\t          for (var yR = yRMin; yR < yRMax; ++yR) {\n\t            var xR = wR + yR * strideHeight - topPad;\n\n\t            for (var yC = yCMin; yC < yCMax; ++yC) {\n\t              var xC = wC + yC * strideWidth - leftPad;\n\t              dotProd += xBuf.get(b, xR, xC, d1) * dyBuf.get(b, yR, yC, d2);\n\t            }\n\t          }\n\t        }\n\n\t        dW.set(dotProd, wR, wC, d1, dm);\n\t      }\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(dW.shape, dW.dtype, dW.values);\n\t}\n\tvar depthwiseConv2dNativeBackpropFilterConfig = {\n\t  kernelName: DepthwiseConv2dNativeBackpropFilter,\n\t  backendName: 'cpu',\n\t  kernelFunc: depthwiseConv2dNativeBackpropFilter$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction depthwiseConv2dNativeBackpropInput$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var dy = inputs.dy,\n\t      filter = inputs.filter;\n\t  var strides = attrs.strides,\n\t      dilations = attrs.dilations,\n\t      pad = attrs.pad,\n\t      dimRoundingMode = attrs.dimRoundingMode,\n\t      inputShape = attrs.inputShape;\n\t  assertNotComplex([dy, filter], 'depthwiseConv2DNativeBackpropInput');\n\t  var dyStrides = computeStrides(dy.shape);\n\t  var filterStrides = computeStrides(filter.shape);\n\t  var convInfo = computeConv2DInfo(inputShape, filter.shape, strides, dilations, pad, dimRoundingMode, true\n\t  /* depthwise */\n\t  );\n\t  var dx = new TensorBuffer(convInfo.inShape, 'float32');\n\t  var dxValues = dx.values;\n\t  var _dx$strides = dx.strides,\n\t      dxS0 = _dx$strides[0],\n\t      dxS1 = _dx$strides[1],\n\t      dxS2 = _dx$strides[2];\n\t  var dyValues = backend.data.get(dy.dataId).values;\n\t  var dyS0 = dyStrides[0],\n\t      dyS1 = dyStrides[1],\n\t      dyS2 = dyStrides[2];\n\t  var fltValues = backend.data.get(filter.dataId).values;\n\t  var fltS0 = filterStrides[0],\n\t      fltS1 = filterStrides[1],\n\t      fltS2 = filterStrides[2];\n\t  var batchSize = convInfo.batchSize,\n\t      filterHeight = convInfo.filterHeight,\n\t      filterWidth = convInfo.filterWidth,\n\t      inChannels = convInfo.inChannels,\n\t      inHeight = convInfo.inHeight,\n\t      inWidth = convInfo.inWidth,\n\t      outChannels = convInfo.outChannels,\n\t      outHeight = convInfo.outHeight,\n\t      outWidth = convInfo.outWidth,\n\t      strideHeight = convInfo.strideHeight,\n\t      strideWidth = convInfo.strideWidth;\n\t  var topPad = filterHeight - 1 - convInfo.padInfo.top;\n\t  var leftPad = filterWidth - 1 - convInfo.padInfo.left;\n\t  var chMul = outChannels / inChannels;\n\n\t  for (var b = 0; b < batchSize; ++b) {\n\t    for (var d1 = 0; d1 < inChannels; ++d1) {\n\t      for (var xR = 0; xR < inHeight; ++xR) {\n\t        var xRCorner = xR - topPad;\n\t        var xRMin = Math.max(0, Math.ceil(xRCorner / strideHeight));\n\t        var yRMax = Math.min(outHeight, (filterHeight + xRCorner) / strideHeight);\n\n\t        for (var xC = 0; xC < inWidth; ++xC) {\n\t          var xCCorner = xC - leftPad;\n\t          var xCMin = Math.max(0, Math.ceil(xCCorner / strideWidth));\n\t          var yCMax = Math.min(outWidth, (filterWidth + xCCorner) / strideWidth);\n\t          var dotProd = 0;\n\n\t          for (var yR = xRMin; yR < yRMax; ++yR) {\n\t            var wR = yR * strideHeight - xRCorner;\n\n\t            for (var yC = xCMin; yC < yCMax; ++yC) {\n\t              var wC = yC * strideWidth - xCCorner;\n\t              var dyOffset = dyS0 * b + dyS1 * yR + dyS2 * yC;\n\t              var fltOffset = fltS0 * (filterHeight - 1 - wR) + fltS1 * (filterWidth - 1 - wC) + fltS2 * d1;\n\n\t              for (var dm = 0; dm < chMul; ++dm) {\n\t                var d2 = d1 * chMul + dm;\n\t                var pixel = dyValues[dyOffset + d2];\n\t                var weight = fltValues[fltOffset + dm];\n\t                dotProd += pixel * weight;\n\t              }\n\t            }\n\t          }\n\n\t          dxValues[dxS0 * b + dxS1 * xR + dxS2 * xC + d1] = dotProd;\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n\t}\n\tvar depthwiseConv2dNativeBackpropInputConfig = {\n\t  kernelName: DepthwiseConv2dNativeBackpropInput,\n\t  backendName: 'cpu',\n\t  kernelFunc: depthwiseConv2dNativeBackpropInput$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction diag$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var x = inputs.x;\n\t  var xSize = sizeFromShape(x.shape);\n\t  var xVals = backend.data.get(x.dataId).values;\n\t  var outBuf = buffer([xSize, xSize], x.dtype);\n\t  var vals = outBuf.values;\n\n\t  for (var i = 0; i < xVals.length; i++) {\n\t    vals[i * xSize + i] = xVals[i];\n\t  }\n\n\t  var outShape = [].concat(x.shape, x.shape);\n\t  return backend.makeTensorInfo(outShape, outBuf.dtype, outBuf.values);\n\t}\n\tvar diagConfig = {\n\t  kernelName: Diag,\n\t  backendName: 'cpu',\n\t  kernelFunc: diag$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar dilation2dConfig = {\n\t  kernelName: Dilation2D,\n\t  backendName: 'cpu',\n\t  kernelFunc: function kernelFunc(_ref) {\n\t    var inputs = _ref.inputs,\n\t        backend = _ref.backend,\n\t        attrs = _ref.attrs;\n\t    var x = inputs.x,\n\t        filter = inputs.filter;\n\t    var strides = attrs.strides,\n\t        pad = attrs.pad,\n\t        dilations = attrs.dilations;\n\t    var cpuBackend = backend;\n\t    var xVals = cpuBackend.data.get(x.dataId).values;\n\t    var xRank = x.shape.length;\n\t    var filterVals = cpuBackend.data.get(filter.dataId).values;\n\t    var filterRank = filter.shape.length;\n\n\t    var _backend_util$compute = computeDilation2DInfo(x.shape, filter.shape, strides, pad, 'NHWC'\n\t    /* dataFormat */\n\t    , dilations),\n\t        batchSize = _backend_util$compute.batchSize,\n\t        inHeight = _backend_util$compute.inHeight,\n\t        inWidth = _backend_util$compute.inWidth,\n\t        inChannels = _backend_util$compute.inChannels,\n\t        outHeight = _backend_util$compute.outHeight,\n\t        outWidth = _backend_util$compute.outWidth,\n\t        padInfo = _backend_util$compute.padInfo,\n\t        strideHeight = _backend_util$compute.strideHeight,\n\t        strideWidth = _backend_util$compute.strideWidth,\n\t        filterHeight = _backend_util$compute.filterHeight,\n\t        filterWidth = _backend_util$compute.filterWidth,\n\t        dilationHeight = _backend_util$compute.dilationHeight,\n\t        dilationWidth = _backend_util$compute.dilationWidth,\n\t        outShape = _backend_util$compute.outShape;\n\n\t    var outSize = sizeFromShape(outShape);\n\t    var outRank = outShape.length;\n\t    var outputVals = getArrayFromDType(x.dtype, outSize); // Upsampling the input by fill in `dilation size - 1` values between each\n\t    // input value.\n\t    // This implementation follows the TF c++ implementation:\n\t    // https://github.com/tensorflow/tensorflow/blob/d9a3a849edc198e90172bc58eb293de457f9d986/tensorflow/core/kernels/dilation_ops.cc\n\n\t    for (var b = 0; b < batchSize; ++b) {\n\t      for (var hOut = 0; hOut < outHeight; ++hOut) {\n\t        var hBeg = hOut * strideHeight - padInfo.top;\n\n\t        for (var wOut = 0; wOut < outWidth; ++wOut) {\n\t          var wBeg = wOut * strideWidth - padInfo.left;\n\n\t          for (var d = 0; d < inChannels; ++d) {\n\t            var curVal = Number.MIN_SAFE_INTEGER;\n\n\t            for (var h = 0; h < filterHeight; ++h) {\n\t              var hIn = hBeg + h * dilationHeight;\n\n\t              if (hIn >= 0 && hIn < inHeight) {\n\t                for (var w = 0; w < filterWidth; ++w) {\n\t                  var wIn = wBeg + w * dilationWidth;\n\n\t                  if (wIn >= 0 && wIn < inWidth) {\n\t                    var xIndex = locToIndex([b, hIn, wIn, d], xRank, computeStrides(x.shape));\n\t                    var filterIndex = locToIndex([h, w, d], filterRank, computeStrides(filter.shape));\n\t                    var val = xVals[xIndex] + filterVals[filterIndex];\n\n\t                    if (val > curVal) {\n\t                      curVal = val;\n\t                    }\n\t                  }\n\t                }\n\t              }\n\t            }\n\n\t            var outputIndex = locToIndex([b, hOut, wOut, d], outRank, computeStrides(outShape));\n\t            outputVals[outputIndex] = curVal;\n\t          }\n\t        }\n\t      }\n\t    }\n\n\t    var dataId = cpuBackend.write(toTypedArray(outputVals, x.dtype), outShape, x.dtype);\n\t    return {\n\t      dataId: dataId,\n\t      shape: outShape,\n\t      dtype: x.dtype\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar dilation2dBackpropFilterConfig = {\n\t  kernelName: Dilation2DBackpropFilter,\n\t  backendName: 'cpu',\n\t  kernelFunc: function kernelFunc(_ref) {\n\t    var inputs = _ref.inputs,\n\t        backend = _ref.backend,\n\t        attrs = _ref.attrs;\n\t    var x = inputs.x,\n\t        filter = inputs.filter,\n\t        dy = inputs.dy;\n\t    var strides = attrs.strides,\n\t        pad = attrs.pad,\n\t        dilations = attrs.dilations;\n\t    var cpuBackend = backend;\n\t    var $x = toNestedArray(x.shape, cpuBackend.data.get(x.dataId).values);\n\t    var $filter = toNestedArray(filter.shape, cpuBackend.data.get(filter.dataId).values);\n\n\t    var _backend_util$compute = computeDilation2DInfo(x.shape, filter.shape, strides, pad, 'NHWC'\n\t    /* dataFormat */\n\t    , dilations),\n\t        batchSize = _backend_util$compute.batchSize,\n\t        inHeight = _backend_util$compute.inHeight,\n\t        inWidth = _backend_util$compute.inWidth,\n\t        inChannels = _backend_util$compute.inChannels,\n\t        outHeight = _backend_util$compute.outHeight,\n\t        outWidth = _backend_util$compute.outWidth,\n\t        padInfo = _backend_util$compute.padInfo,\n\t        strideHeight = _backend_util$compute.strideHeight,\n\t        strideWidth = _backend_util$compute.strideWidth,\n\t        filterHeight = _backend_util$compute.filterHeight,\n\t        filterWidth = _backend_util$compute.filterWidth,\n\t        dilationHeight = _backend_util$compute.dilationHeight,\n\t        dilationWidth = _backend_util$compute.dilationWidth,\n\t        outShape = _backend_util$compute.outShape;\n\n\t    assert(dy.rank === outShape.length, function () {\n\t      return \"Error in \" + Dilation2DBackpropFilter + \", dy \" + (\"must have the same rank as output \" + outShape.length + \", but got \") + (\"\" + dy.rank);\n\t    });\n\t    var $dy = toNestedArray(outShape, cpuBackend.data.get(dy.dataId).values); // The computed filter gradients has the same dimensions as the filter:\n\t    // [filterHeight, filterWidth, depth]\n\n\t    var gradients = makeZerosNestedTypedArray(filter.shape, filter.dtype); // In the case of multiple argmax branches, we only back-propagate along the\n\t    // last branch, i.e., the one with largest value of `h * filter_cols + w`,\n\t    // similarly to the max-pooling backward routines.\n\t    // This implementation follows the TF c++ implementation:\n\t    // https://github.com/tensorflow/tensorflow/blob/d9a3a849edc198e90172bc58eb293de457f9d986/tensorflow/core/kernels/dilation_ops.cc\n\n\t    for (var b = 0; b < batchSize; ++b) {\n\t      for (var hOut = 0; hOut < outHeight; ++hOut) {\n\t        var hBeg = hOut * strideHeight - padInfo.top;\n\n\t        for (var wOut = 0; wOut < outWidth; ++wOut) {\n\t          var wBeg = wOut * strideWidth - padInfo.left;\n\n\t          for (var d = 0; d < inChannels; ++d) {\n\t            var curVal = Number.MIN_SAFE_INTEGER;\n\t            var hMax = 0;\n\t            var wMax = 0;\n\n\t            for (var h = 0; h < filterHeight; ++h) {\n\t              var hIn = hBeg + h * dilationHeight;\n\n\t              if (hIn >= 0 && hIn < inHeight) {\n\t                for (var w = 0; w < filterWidth; ++w) {\n\t                  var wIn = wBeg + w * dilationWidth;\n\n\t                  if (wIn >= 0 && wIn < inWidth) {\n\t                    var val = $x[b][hIn][wIn][d] + $filter[h][w][d];\n\n\t                    if (val > curVal) {\n\t                      curVal = val;\n\t                      hMax = h;\n\t                      wMax = w;\n\t                    }\n\t                  }\n\t                }\n\t              }\n\t            }\n\n\t            gradients[hMax][wMax][d] += $dy[b][hOut][wOut][d];\n\t          }\n\t        }\n\t      }\n\t    }\n\n\t    var dataId = cpuBackend.write(toTypedArray(gradients, x.dtype), filter.shape, filter.dtype);\n\t    return {\n\t      dataId: dataId,\n\t      shape: filter.shape,\n\t      dtype: filter.dtype\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar dilation2dBackpropInputConfig = {\n\t  kernelName: Dilation2DBackpropInput,\n\t  backendName: 'cpu',\n\t  kernelFunc: function kernelFunc(_ref) {\n\t    var inputs = _ref.inputs,\n\t        backend = _ref.backend,\n\t        attrs = _ref.attrs;\n\t    var x = inputs.x,\n\t        filter = inputs.filter,\n\t        dy = inputs.dy;\n\t    var strides = attrs.strides,\n\t        pad = attrs.pad,\n\t        dilations = attrs.dilations;\n\t    var cpuBackend = backend;\n\t    var $x = toNestedArray(x.shape, cpuBackend.data.get(x.dataId).values);\n\t    var $filter = toNestedArray(filter.shape, cpuBackend.data.get(filter.dataId).values);\n\n\t    var _backend_util$compute = computeDilation2DInfo(x.shape, filter.shape, strides, pad, 'NHWC'\n\t    /* dataFormat */\n\t    , dilations),\n\t        batchSize = _backend_util$compute.batchSize,\n\t        inHeight = _backend_util$compute.inHeight,\n\t        inWidth = _backend_util$compute.inWidth,\n\t        inChannels = _backend_util$compute.inChannels,\n\t        outHeight = _backend_util$compute.outHeight,\n\t        outWidth = _backend_util$compute.outWidth,\n\t        padInfo = _backend_util$compute.padInfo,\n\t        strideHeight = _backend_util$compute.strideHeight,\n\t        strideWidth = _backend_util$compute.strideWidth,\n\t        filterHeight = _backend_util$compute.filterHeight,\n\t        filterWidth = _backend_util$compute.filterWidth,\n\t        dilationHeight = _backend_util$compute.dilationHeight,\n\t        dilationWidth = _backend_util$compute.dilationWidth,\n\t        outShape = _backend_util$compute.outShape;\n\n\t    assert(dy.rank === outShape.length, function () {\n\t      return \"Error in \" + Dilation2DBackpropInput + \", dy \" + (\"must have the same rank as output \" + outShape.length + \", but got \") + (\"\" + dy.rank);\n\t    });\n\t    var $dy = toNestedArray(outShape, cpuBackend.data.get(dy.dataId).values); // The computed gradients has the same dimensions as the input:\n\t    // [batch, inputHeight, inputCols, inChannel]\n\n\t    var gradients = makeZerosNestedTypedArray(x.shape, x.dtype); // In the case of multiple argmax branches, we only back-propagate along the\n\t    // last branch, i.e., the one with largest value of `h * filter_cols + w`,\n\t    // similarly to the max-pooling backward routines.\n\t    // This implementation follows the TF c++ implementation:\n\t    // https://github.com/tensorflow/tensorflow/blob/d9a3a849edc198e90172bc58eb293de457f9d986/tensorflow/core/kernels/dilation_ops.cc\n\n\t    for (var b = 0; b < batchSize; ++b) {\n\t      for (var hOut = 0; hOut < outHeight; ++hOut) {\n\t        var hBeg = hOut * strideHeight - padInfo.top;\n\n\t        for (var wOut = 0; wOut < outWidth; ++wOut) {\n\t          var wBeg = wOut * strideWidth - padInfo.left;\n\n\t          for (var d = 0; d < inChannels; ++d) {\n\t            var curVal = Number.MIN_SAFE_INTEGER;\n\t            var hInMax = hBeg < 0 ? 0 : hBeg;\n\t            var wInMax = wBeg < 0 ? 0 : wBeg;\n\n\t            for (var h = 0; h < filterHeight; ++h) {\n\t              var hIn = hBeg + h * dilationHeight;\n\n\t              if (hIn >= 0 && hIn < inHeight) {\n\t                for (var w = 0; w < filterWidth; ++w) {\n\t                  var wIn = wBeg + w * dilationWidth;\n\n\t                  if (wIn >= 0 && wIn < inWidth) {\n\t                    var val = $x[b][hIn][wIn][d] + $filter[h][w][d];\n\n\t                    if (val > curVal) {\n\t                      curVal = val;\n\t                      hInMax = hIn;\n\t                      wInMax = wIn;\n\t                    }\n\t                  }\n\t                }\n\t              }\n\t            }\n\n\t            gradients[b][hInMax][wInMax][d] += $dy[b][hOut][wOut][d];\n\t          }\n\t        }\n\t      }\n\t    }\n\n\t    var dataId = cpuBackend.write(toTypedArray(gradients, x.dtype), x.shape, x.dtype);\n\t    return {\n\t      dataId: dataId,\n\t      shape: x.shape,\n\t      dtype: x.dtype\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction eluGrad(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var dy = inputs.dy,\n\t      y = inputs.y;\n\t  assertNotComplex([dy, y], 'eluGrad');\n\t  var resultValues = new Float32Array(sizeFromShape(y.shape));\n\t  var values = backend.data.get(y.dataId).values;\n\t  var dyValues = backend.data.get(dy.dataId).values;\n\n\t  for (var i = 0; i < values.length; ++i) {\n\t    var v = values[i];\n\n\t    if (v >= 1) {\n\t      resultValues[i] = dyValues[i];\n\t    } else {\n\t      resultValues[i] = dyValues[i] * (v + 1);\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(y.shape, 'float32', resultValues);\n\t}\n\tvar eluGradConfig$1 = {\n\t  kernelName: EluGrad,\n\t  backendName: 'cpu',\n\t  kernelFunc: eluGrad\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar equalImpl = createSimpleBinaryKernelImpl(function (a, b) {\n\t  return a === b ? 1 : 0;\n\t});\n\tvar equal$1 = binaryKernelFunc(Equal, equalImpl, null\n\t/* complexImpl */\n\t, 'bool');\n\tvar equalConfig = {\n\t  kernelName: Equal,\n\t  backendName: 'cpu',\n\t  kernelFunc: equal$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar p = ERF_P;\n\tvar a1 = ERF_A1;\n\tvar a2 = ERF_A2;\n\tvar a3 = ERF_A3;\n\tvar a4 = ERF_A4;\n\tvar a5 = ERF_A5;\n\tvar erf$1 = unaryKernelFunc(Erf, function (xi) {\n\t  var sign = Math.sign(xi);\n\t  var v = Math.abs(xi);\n\t  var t = 1.0 / (1.0 + p * v);\n\t  return sign * (1.0 - ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t * Math.exp(-v * v));\n\t});\n\tvar erfConfig = {\n\t  kernelName: Erf,\n\t  backendName: 'cpu',\n\t  kernelFunc: erf$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction expandDims$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var input = inputs.input;\n\t  var dim = attrs.dim;\n\t  var inputRank = input.shape.length;\n\t  var newShape = input.shape.slice();\n\t  var $dim = dim;\n\n\t  if (dim < 0) {\n\t    // Negative value is counted from the tail of rank.\n\t    assert(-(inputRank + 1) <= dim, function () {\n\t      return \"Axis must be in the interval [\" + -(inputRank + 1) + \", \" + inputRank + \"]\";\n\t    });\n\t    $dim = inputRank + dim + 1;\n\t  }\n\n\t  newShape.splice($dim, 0, 1);\n\t  return reshape$2({\n\t    inputs: {\n\t      x: input\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: newShape\n\t    }\n\t  });\n\t}\n\tvar expandDimsConfig = {\n\t  kernelName: ExpandDims,\n\t  backendName: 'cpu',\n\t  kernelFunc: expandDims$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar realDivImpl = createSimpleBinaryKernelImpl(function (a, b) {\n\t  return a / b;\n\t});\n\tvar div$1 = binaryKernelFunc(RealDiv, realDivImpl);\n\tvar realDivConfig = {\n\t  kernelName: RealDiv,\n\t  backendName: 'cpu',\n\t  kernelFunc: div$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Calculate FFT of inner most elements of batch tensor.\n\t */\n\n\tfunction fftBatch(input, inverse, cpuBackend) {\n\t  var inputShape = input.shape;\n\t  var batch = inputShape[0];\n\t  var innerDim = inputShape[1];\n\t  var inputVals = cpuBackend.data.get(input.dataId);\n\t  var real2D = inputVals.complexTensorInfos.real;\n\t  var imag2D = inputVals.complexTensorInfos.imag; // Collects real and imaginary values separately.\n\n\t  var resultShape = [batch, innerDim];\n\t  var resultSize = sizeFromShape(resultShape);\n\t  var resultReal = getTypedArrayFromDType('float32', resultSize);\n\t  var resultImag = getTypedArrayFromDType('float32', resultSize);\n\n\t  for (var b = 0; b < batch; b++) {\n\t    // TODO: Support slice ops for complex type.\n\t    var r = slice$3({\n\t      inputs: {\n\t        x: real2D\n\t      },\n\t      backend: cpuBackend,\n\t      attrs: {\n\t        begin: [b, 0],\n\t        size: [1, innerDim]\n\t      }\n\t    });\n\t    var i = slice$3({\n\t      inputs: {\n\t        x: imag2D\n\t      },\n\t      backend: cpuBackend,\n\t      attrs: {\n\t        begin: [b, 0],\n\t        size: [1, innerDim]\n\t      }\n\t    });\n\n\t    var _input = complex$1({\n\t      inputs: {\n\t        real: r,\n\t        imag: i\n\t      },\n\t      backend: cpuBackend\n\t    }); // Run FFT by batch element.\n\n\n\t    var _fftImpl = fftImpl(_input, inverse, cpuBackend),\n\t        _real = _fftImpl.real,\n\t        _imag = _fftImpl.imag;\n\n\t    var res = mergeRealAndImagArrays(_real, _imag);\n\n\t    for (var d = 0; d < innerDim; d++) {\n\t      var c = getComplexWithIndex(res, d);\n\t      resultReal[b * innerDim + d] = c.real;\n\t      resultImag[b * innerDim + d] = c.imag;\n\t    }\n\n\t    cpuBackend.disposeIntermediateTensorInfo(r);\n\t    cpuBackend.disposeIntermediateTensorInfo(i);\n\t    cpuBackend.disposeIntermediateTensorInfo(_input);\n\t  }\n\n\t  var $realInfo = cpuBackend.makeTensorInfo(resultShape, 'float32', resultReal);\n\t  var $imagInfo = cpuBackend.makeTensorInfo(resultShape, 'float32', resultImag);\n\t  var result = complex$1({\n\t    inputs: {\n\t      real: $realInfo,\n\t      imag: $imagInfo\n\t    },\n\t    backend: cpuBackend\n\t  });\n\t  cpuBackend.disposeIntermediateTensorInfo($realInfo);\n\t  cpuBackend.disposeIntermediateTensorInfo($imagInfo);\n\t  return result;\n\t}\n\tfunction fftImpl(input, inverse, cpuBackend) {\n\t  var inputSize = sizeFromShape(input.shape);\n\t  var inputVals = cpuBackend.data.get(input.dataId);\n\t  var realVals = cpuBackend.data.get(inputVals.complexTensorInfos.real.dataId).values;\n\t  var imagVals = cpuBackend.data.get(inputVals.complexTensorInfos.imag.dataId).values;\n\n\t  if (isExponentOf2(inputSize)) {\n\t    var result = fftRadix2(realVals, imagVals, inputSize, inverse, cpuBackend);\n\t    var resultShape = [input.shape[0], input.shape[1]];\n\n\t    if (inverse) {\n\t      var realInfo = cpuBackend.makeTensorInfo(resultShape, 'float32', result.real);\n\t      var imagInfo = cpuBackend.makeTensorInfo(resultShape, 'float32', result.imag);\n\t      var sizeInfo = cpuBackend.makeTensorInfo([], 'float32', createScalarValue(inputSize, 'float32'));\n\t      var sizeInfoCopy = identity$1({\n\t        inputs: {\n\t          x: sizeInfo\n\t        },\n\t        backend: cpuBackend\n\t      });\n\t      var divRealInfo = realDivConfig.kernelFunc({\n\t        inputs: {\n\t          a: realInfo,\n\t          b: sizeInfo\n\t        },\n\t        backend: cpuBackend\n\t      });\n\t      var divImagInfo = realDivConfig.kernelFunc({\n\t        inputs: {\n\t          a: imagInfo,\n\t          b: sizeInfoCopy\n\t        },\n\t        backend: cpuBackend\n\t      });\n\t      var divRealVals = cpuBackend.data.get(divRealInfo.dataId).values;\n\t      var divImagVals = cpuBackend.data.get(divImagInfo.dataId).values;\n\t      cpuBackend.disposeIntermediateTensorInfo(realInfo);\n\t      cpuBackend.disposeIntermediateTensorInfo(imagInfo);\n\t      cpuBackend.disposeIntermediateTensorInfo(sizeInfo);\n\t      cpuBackend.disposeIntermediateTensorInfo(sizeInfoCopy);\n\t      cpuBackend.disposeIntermediateTensorInfo(divRealInfo);\n\t      cpuBackend.disposeIntermediateTensorInfo(divImagInfo);\n\t      return {\n\t        real: divRealVals,\n\t        imag: divImagVals\n\t      };\n\t    }\n\n\t    return result;\n\t  } else {\n\t    var data = mergeRealAndImagArrays(realVals, imagVals);\n\t    var rawOutput = fourierTransformByMatmul(data, inputSize, inverse);\n\t    return splitRealAndImagArrays(rawOutput);\n\t  }\n\t}\n\n\tfunction isExponentOf2(size) {\n\t  return (size & size - 1) === 0;\n\t} // FFT using Cooley-Tukey algorithm on radix 2 dimensional input.\n\n\n\tfunction fftRadix2(realVals, imagVals, size, inverse, cpuBackend) {\n\t  if (size === 1) {\n\t    return {\n\t      real: realVals,\n\t      imag: imagVals\n\t    };\n\t  }\n\n\t  var data = mergeRealAndImagArrays(realVals, imagVals);\n\t  var half = size / 2;\n\t  var evenComplex = complexWithEvenIndex(data);\n\t  var evenRealVals = evenComplex.real;\n\t  var evenImagVals = evenComplex.imag;\n\t  var evenShape = [evenRealVals.length];\n\t  var evenRealInfo = cpuBackend.makeTensorInfo(evenShape, 'float32', evenRealVals);\n\t  var evenImagInfo = cpuBackend.makeTensorInfo(evenShape, 'float32', evenImagVals);\n\t  var evenTensorInfo = complex$1({\n\t    inputs: {\n\t      real: evenRealInfo,\n\t      imag: evenImagInfo\n\t    },\n\t    backend: cpuBackend\n\t  });\n\t  var oddComplex = complexWithOddIndex(data);\n\t  var oddRealVals = oddComplex.real;\n\t  var oddImagVals = oddComplex.imag;\n\t  var oddShape = [oddRealVals.length];\n\t  var oddRealInfo = cpuBackend.makeTensorInfo(oddShape, 'float32', oddRealVals);\n\t  var oddImagInfo = cpuBackend.makeTensorInfo(oddShape, 'float32', oddImagVals);\n\t  var oddTensorInfo = complex$1({\n\t    inputs: {\n\t      real: oddRealInfo,\n\t      imag: oddImagInfo\n\t    },\n\t    backend: cpuBackend\n\t  }); // Recursive call for half part of original input.\n\n\t  var $evenComplex = fftRadix2(evenRealVals, evenImagVals, half, inverse, cpuBackend);\n\t  var $evenRealVals = $evenComplex.real;\n\t  var $evenImagVals = $evenComplex.imag;\n\t  var $evenShape = [$evenRealVals.length];\n\t  var $evenRealInfo = cpuBackend.makeTensorInfo($evenShape, 'float32', $evenRealVals);\n\t  var $evenImagInfo = cpuBackend.makeTensorInfo($evenShape, 'float32', $evenImagVals);\n\t  var $evenTensorInfo = complex$1({\n\t    inputs: {\n\t      real: $evenRealInfo,\n\t      imag: $evenImagInfo\n\t    },\n\t    backend: cpuBackend\n\t  });\n\t  var $oddComplex = fftRadix2(oddRealVals, oddImagVals, half, inverse, cpuBackend);\n\t  var $oddRealVals = $oddComplex.real;\n\t  var $oddImagVals = $oddComplex.imag;\n\t  var $oddShape = [$oddRealVals.length];\n\t  var $oddRealInfo = cpuBackend.makeTensorInfo($oddShape, 'float32', $oddRealVals);\n\t  var $oddImagInfo = cpuBackend.makeTensorInfo($oddShape, 'float32', $oddImagVals);\n\t  var $oddTensorInfo = complex$1({\n\t    inputs: {\n\t      real: $oddRealInfo,\n\t      imag: $oddImagInfo\n\t    },\n\t    backend: cpuBackend\n\t  });\n\t  var e = exponents(size, inverse);\n\t  var eShape = [e.real.length];\n\t  var eRealInfo = cpuBackend.makeTensorInfo(eShape, 'float32', e.real);\n\t  var eImagInfo = cpuBackend.makeTensorInfo(eShape, 'float32', e.imag);\n\t  var complexInfo = complex$1({\n\t    inputs: {\n\t      real: eRealInfo,\n\t      imag: eImagInfo\n\t    },\n\t    backend: cpuBackend\n\t  });\n\t  var exponentInfo = multiply$2({\n\t    inputs: {\n\t      a: complexInfo,\n\t      b: $oddTensorInfo\n\t    },\n\t    backend: cpuBackend\n\t  });\n\t  var addPart = add$4({\n\t    inputs: {\n\t      a: $evenTensorInfo,\n\t      b: exponentInfo\n\t    },\n\t    backend: cpuBackend\n\t  });\n\t  var subPart = sub$1({\n\t    inputs: {\n\t      a: $evenTensorInfo,\n\t      b: exponentInfo\n\t    },\n\t    backend: cpuBackend\n\t  });\n\t  var addPartReal = real$1({\n\t    inputs: {\n\t      input: addPart\n\t    },\n\t    backend: cpuBackend\n\t  });\n\t  var subPartReal = real$1({\n\t    inputs: {\n\t      input: subPart\n\t    },\n\t    backend: cpuBackend\n\t  });\n\t  var addPartImag = imag$1({\n\t    inputs: {\n\t      input: addPart\n\t    },\n\t    backend: cpuBackend\n\t  });\n\t  var subPartImag = imag$1({\n\t    inputs: {\n\t      input: subPart\n\t    },\n\t    backend: cpuBackend\n\t  });\n\t  var $real = concat$1({\n\t    inputs: [addPartReal, subPartReal],\n\t    backend: cpuBackend,\n\t    attrs: {\n\t      axis: 0\n\t    }\n\t  });\n\t  var $imag = concat$1({\n\t    inputs: [addPartImag, subPartImag],\n\t    backend: cpuBackend,\n\t    attrs: {\n\t      axis: 0\n\t    }\n\t  });\n\t  var $realVals = cpuBackend.data.get($real.dataId).values;\n\t  var $imagVals = cpuBackend.data.get($imag.dataId).values;\n\t  cpuBackend.disposeIntermediateTensorInfo(evenRealInfo);\n\t  cpuBackend.disposeIntermediateTensorInfo(evenImagInfo);\n\t  cpuBackend.disposeIntermediateTensorInfo(evenTensorInfo);\n\t  cpuBackend.disposeIntermediateTensorInfo(oddRealInfo);\n\t  cpuBackend.disposeIntermediateTensorInfo(oddImagInfo);\n\t  cpuBackend.disposeIntermediateTensorInfo(oddTensorInfo);\n\t  cpuBackend.disposeIntermediateTensorInfo($evenRealInfo);\n\t  cpuBackend.disposeIntermediateTensorInfo($evenImagInfo);\n\t  cpuBackend.disposeIntermediateTensorInfo($evenTensorInfo);\n\t  cpuBackend.disposeIntermediateTensorInfo($oddRealInfo);\n\t  cpuBackend.disposeIntermediateTensorInfo($oddImagInfo);\n\t  cpuBackend.disposeIntermediateTensorInfo($oddTensorInfo);\n\t  cpuBackend.disposeIntermediateTensorInfo(eRealInfo);\n\t  cpuBackend.disposeIntermediateTensorInfo(eImagInfo);\n\t  cpuBackend.disposeIntermediateTensorInfo(complexInfo);\n\t  cpuBackend.disposeIntermediateTensorInfo(exponentInfo);\n\t  cpuBackend.disposeIntermediateTensorInfo(addPart);\n\t  cpuBackend.disposeIntermediateTensorInfo(subPart);\n\t  cpuBackend.disposeIntermediateTensorInfo(addPartReal);\n\t  cpuBackend.disposeIntermediateTensorInfo(addPartImag);\n\t  cpuBackend.disposeIntermediateTensorInfo(subPartReal);\n\t  cpuBackend.disposeIntermediateTensorInfo(subPartImag);\n\t  cpuBackend.disposeIntermediateTensorInfo($real);\n\t  cpuBackend.disposeIntermediateTensorInfo($imag);\n\t  return {\n\t    real: $realVals,\n\t    imag: $imagVals\n\t  };\n\t} // Calculate fourier transform by multplying sinusoid matrix.\n\n\n\tfunction fourierTransformByMatmul(data, size, inverse) {\n\t  var ret = new Float32Array(size * 2); // TODO: Use matmul instead once it supports complex64 type.\n\n\t  for (var r = 0; r < size; r++) {\n\t    var _real2 = 0.0;\n\t    var _imag2 = 0.0;\n\n\t    for (var c = 0; c < size; c++) {\n\t      var e = exponent(r * c, size, inverse);\n\t      var term = getComplexWithIndex(data, c);\n\t      _real2 += term.real * e.real - term.imag * e.imag;\n\t      _imag2 += term.real * e.imag + term.imag * e.real;\n\t    }\n\n\t    if (inverse) {\n\t      _real2 /= size;\n\t      _imag2 /= size;\n\t    }\n\n\t    assignToTypedArray(ret, _real2, _imag2, r);\n\t  }\n\n\t  return ret;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction fft$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var input = inputs.input;\n\t  var inputSize = sizeFromShape(input.shape); // Collapse all outer dimensions to a single batch dimension.\n\n\t  var innerDimensionSize = input.shape[input.shape.length - 1];\n\t  var batch = inputSize / innerDimensionSize;\n\t  var input2D = reshape$2({\n\t    inputs: {\n\t      x: input\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: [batch, innerDimensionSize]\n\t    }\n\t  });\n\t  var result = fftBatch(input2D, false, backend);\n\t  var resultReshaped = reshape$2({\n\t    inputs: {\n\t      x: result\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: input.shape\n\t    }\n\t  });\n\t  backend.disposeIntermediateTensorInfo(input2D);\n\t  backend.disposeIntermediateTensorInfo(result);\n\t  return resultReshaped;\n\t}\n\tvar fftConfig = {\n\t  kernelName: FFT,\n\t  backendName: 'cpu',\n\t  kernelFunc: fft$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction fill$1(args) {\n\t  var backend = args.backend,\n\t      attrs = args.attrs;\n\t  var shape = attrs.shape,\n\t      value = attrs.value,\n\t      dtype = attrs.dtype;\n\t  var $dtype = dtype || inferDtype(value);\n\t  var values = getArrayFromDType($dtype, sizeFromShape(shape));\n\t  fillValues(values, value, $dtype);\n\t  return backend.makeTensorInfo(shape, $dtype, values);\n\t}\n\tvar fillConfig = {\n\t  kernelName: Fill,\n\t  backendName: 'cpu',\n\t  kernelFunc: fill$1\n\t};\n\n\tfunction fillValues(values, value, dtype) {\n\t  if (dtype === 'string') {\n\t    values.fill(value);\n\t  } else {\n\t    values.fill(value);\n\t  }\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar flipLeftRightConfig = {\n\t  kernelName: FlipLeftRight,\n\t  backendName: 'cpu',\n\t  kernelFunc: function kernelFunc(_ref) {\n\t    var inputs = _ref.inputs,\n\t        attrs = _ref.attrs,\n\t        backend = _ref.backend;\n\t    var image = inputs.image;\n\t    var cpuBackend = backend;\n\t    var output = getTypedArrayFromDType(image.dtype, sizeFromShape(image.shape));\n\t    var _image$shape = image.shape,\n\t        batch = _image$shape[0],\n\t        imageHeight = _image$shape[1],\n\t        imageWidth = _image$shape[2],\n\t        numChannels = _image$shape[3];\n\t    var imageVals = cpuBackend.data.get(image.dataId).values;\n\n\t    for (var batchIdx = 0; batchIdx < batch; batchIdx++) {\n\t      var batchOffset = batchIdx * imageWidth * imageHeight * numChannels;\n\n\t      for (var row = 0; row < imageHeight; row++) {\n\t        var rowOffset = row * (imageWidth * numChannels);\n\n\t        for (var col = 0; col < imageWidth; col++) {\n\t          var colOffset = col * numChannels;\n\n\t          for (var channel = 0; channel < numChannels; channel++) {\n\t            var coords = [batch, row, col, channel];\n\t            var x = coords[2];\n\t            var coordX = Math.round(imageWidth - x);\n\t            var outIdx = batchOffset + rowOffset + colOffset + channel;\n\t            var outputValue = imageVals[outIdx]; // If the coordinate position falls within the image boundaries...\n\n\t            if (coordX >= 0 && coordX < imageWidth) {\n\t              // set the output to the image value at the coordinate position.\n\t              var rotatedColOffset = coordX * numChannels;\n\t              var imageIdx = batchOffset + rowOffset + rotatedColOffset + channel;\n\t              outputValue = imageVals[imageIdx];\n\t            }\n\n\t            output[outIdx] = outputValue;\n\t          }\n\t        }\n\t      }\n\t    }\n\n\t    var dataId = cpuBackend.write(output, image.shape, image.dtype);\n\t    return {\n\t      dataId: dataId,\n\t      shape: image.shape,\n\t      dtype: image.dtype\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar floorDivImpl = createSimpleBinaryKernelImpl(function (a, b) {\n\t  return Math.floor(a / b);\n\t});\n\tvar floorDiv$1 = binaryKernelFunc(FloorDiv, floorDivImpl, null\n\t/* complexImpl */\n\t, 'int32');\n\tvar floorDivConfig = {\n\t  kernelName: FloorDiv,\n\t  backendName: 'cpu',\n\t  kernelFunc: floorDiv$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction fusedConv2D(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      filter = inputs.filter,\n\t      bias = inputs.bias,\n\t      preluActivationWeights = inputs.preluActivationWeights;\n\t  var strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dataFormat = attrs.dataFormat,\n\t      dilations = attrs.dilations,\n\t      dimRoundingMode = attrs.dimRoundingMode,\n\t      activation = attrs.activation,\n\t      leakyreluAlpha = attrs.leakyreluAlpha;\n\t  var result = conv2D({\n\t    inputs: {\n\t      x: x,\n\t      filter: filter\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      strides: strides,\n\t      pad: pad,\n\t      dataFormat: dataFormat,\n\t      dilations: dilations,\n\t      dimRoundingMode: dimRoundingMode\n\t    }\n\t  });\n\n\t  if (bias) {\n\t    var resultOld = result;\n\t    result = add$4({\n\t      inputs: {\n\t        a: result,\n\t        b: bias\n\t      },\n\t      backend: backend\n\t    });\n\t    backend.disposeIntermediateTensorInfo(resultOld);\n\t  }\n\n\t  if (activation) {\n\t    var _resultOld = result;\n\t    result = applyActivation$1(backend, result, activation, preluActivationWeights, leakyreluAlpha);\n\t    backend.disposeIntermediateTensorInfo(_resultOld);\n\t  }\n\n\t  return result;\n\t}\n\tvar fusedConv2DConfig = {\n\t  kernelName: FusedConv2D,\n\t  backendName: 'cpu',\n\t  kernelFunc: fusedConv2D\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction fusedDepthwiseConv2D(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      filter = inputs.filter,\n\t      bias = inputs.bias,\n\t      preluActivationWeights = inputs.preluActivationWeights;\n\t  var strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dataFormat = attrs.dataFormat,\n\t      dilations = attrs.dilations,\n\t      dimRoundingMode = attrs.dimRoundingMode,\n\t      activation = attrs.activation,\n\t      leakyreluAlpha = attrs.leakyreluAlpha;\n\t  var result = depthwiseConv2dNative({\n\t    inputs: {\n\t      x: x,\n\t      filter: filter\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      strides: strides,\n\t      pad: pad,\n\t      dataFormat: dataFormat,\n\t      dilations: dilations,\n\t      dimRoundingMode: dimRoundingMode\n\t    }\n\t  });\n\n\t  if (bias) {\n\t    var oldResult = result;\n\t    result = add$4({\n\t      inputs: {\n\t        a: result,\n\t        b: bias\n\t      },\n\t      backend: backend\n\t    });\n\t    backend.disposeIntermediateTensorInfo(oldResult);\n\t  }\n\n\t  if (activation) {\n\t    var _oldResult = result;\n\t    result = applyActivation$1(backend, result, activation, preluActivationWeights, leakyreluAlpha);\n\t    backend.disposeIntermediateTensorInfo(_oldResult);\n\t  }\n\n\t  return result;\n\t}\n\tvar fusedDepthwiseConv2DConfig = {\n\t  kernelName: FusedDepthwiseConv2D,\n\t  backendName: 'cpu',\n\t  kernelFunc: fusedDepthwiseConv2D\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction gatherNd(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var params = inputs.params,\n\t      indices = inputs.indices;\n\t  var paramsSize = sizeFromShape(params.shape);\n\t  var indicesShape = indices.shape;\n\t  var sliceRank = indicesShape[indicesShape.length - 1];\n\n\t  var _backend_util$prepare = prepareAndValidate(params, indices),\n\t      resultShape = _backend_util$prepare[0],\n\t      numSlices = _backend_util$prepare[1],\n\t      sliceSize = _backend_util$prepare[2],\n\t      strides = _backend_util$prepare[3];\n\n\t  if (numSlices === 0) {\n\t    return backend.makeTensorInfo(resultShape, params.dtype, []);\n\t  }\n\n\t  var outBuf = buffer([numSlices, sliceSize], params.dtype);\n\t  var indicesData = backend.data.get(indices.dataId).values;\n\t  var paramsData = backend.data.get(params.dataId).values;\n\n\t  for (var i = 0; i < numSlices; i++) {\n\t    var index = [];\n\t    var flattenIndex = 0;\n\n\t    for (var j = 0; j < sliceRank; j++) {\n\t      var dim = indicesData[i * sliceRank + j];\n\t      flattenIndex += dim * strides[j];\n\t      index.push(dim);\n\t    }\n\n\t    if (flattenIndex < 0 || flattenIndex >= paramsSize / sliceSize) {\n\t      throw new Error(\"Invalid indices: \" + index + \" does not index into \" + params.shape);\n\t    }\n\n\t    for (var k = 0; k < sliceSize; k++) {\n\t      outBuf.values[i * sliceSize + k] = paramsData[flattenIndex * sliceSize + k];\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(resultShape, outBuf.dtype, outBuf.values);\n\t}\n\tvar gatherNdConfig = {\n\t  kernelName: GatherNd,\n\t  backendName: 'cpu',\n\t  kernelFunc: gatherNd\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction gatherV2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      indices = inputs.indices;\n\t  var axis = attrs.axis,\n\t      batchDims = attrs.batchDims;\n\t  assertNotComplex([x, indices], 'gatherV2');\n\t  var $batchDims = batchDims;\n\n\t  if (batchDims == null) {\n\t    $batchDims = 0;\n\t  }\n\n\t  var indicesSize = sizeFromShape(indices.shape);\n\t  var parsedAxis = parseAxisParam(axis, x.shape)[0];\n\t  var shapeInfo = collectGatherOpShapeInfo(x, indices, parsedAxis, $batchDims);\n\t  var flattenX = reshape$2({\n\t    inputs: {\n\t      x: x\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: [shapeInfo.batchSize, shapeInfo.outerSize, shapeInfo.dimSize, shapeInfo.sliceSize]\n\t    }\n\t  });\n\t  var flattenIndex = reshape$2({\n\t    inputs: {\n\t      x: indices\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: [shapeInfo.batchSize, indicesSize / shapeInfo.batchSize]\n\t    }\n\t  });\n\t  var flattenOutputShape = [shapeInfo.batchSize, shapeInfo.outerSize, indicesSize / shapeInfo.batchSize, shapeInfo.sliceSize];\n\t  var indicesBuf = backend.bufferSync(flattenIndex);\n\t  var xBuf = backend.bufferSync(flattenX);\n\t  var outBuf = gatherV2Impl(xBuf, indicesBuf, flattenOutputShape);\n\t  backend.disposeIntermediateTensorInfo(flattenX);\n\t  backend.disposeIntermediateTensorInfo(flattenIndex);\n\t  return backend.makeTensorInfo(shapeInfo.outputShape, outBuf.dtype, outBuf.values);\n\t}\n\tvar gatherV2Config = {\n\t  kernelName: GatherV2,\n\t  backendName: 'cpu',\n\t  kernelFunc: gatherV2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar greaterEqualImpl = createSimpleBinaryKernelImpl(function (a, b) {\n\t  return a >= b ? 1 : 0;\n\t});\n\tvar greaterEqual$1 = binaryKernelFunc(GreaterEqual, greaterEqualImpl, null\n\t/* complexImpl */\n\t, 'bool');\n\tvar greaterEqualConfig = {\n\t  kernelName: GreaterEqual,\n\t  backendName: 'cpu',\n\t  kernelFunc: greaterEqual$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction ifft$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var input = inputs.input;\n\t  var inputSize = sizeFromShape(input.shape); // Collapse all outer dimensions to a single batch dimension.\n\n\t  var innerDimensionSize = input.shape[input.shape.length - 1];\n\t  var batch = inputSize / innerDimensionSize;\n\t  var input2D = reshape$2({\n\t    inputs: {\n\t      x: input\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: [batch, innerDimensionSize]\n\t    }\n\t  });\n\t  var result = fftBatch(input2D, true, backend);\n\t  var resultReshaped = reshape$2({\n\t    inputs: {\n\t      x: result\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: input.shape\n\t    }\n\t  });\n\t  backend.disposeIntermediateTensorInfo(input2D);\n\t  backend.disposeIntermediateTensorInfo(result);\n\t  return resultReshaped;\n\t}\n\tvar ifftConfig = {\n\t  kernelName: IFFT,\n\t  backendName: 'cpu',\n\t  kernelFunc: ifft$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar isFinite$2 = unaryKernelFunc(IsFinite, function (xi) {\n\t  return Number.isFinite(xi) ? 1 : 0;\n\t}, 'bool');\n\tvar isFiniteConfig = {\n\t  kernelName: IsFinite,\n\t  backendName: 'cpu',\n\t  kernelFunc: isFinite$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar isInf$1 = unaryKernelFunc(IsInf, function (xi) {\n\t  return Math.abs(xi) === Infinity ? 1 : 0;\n\t}, 'bool');\n\tvar isInfConfig = {\n\t  kernelName: IsInf,\n\t  backendName: 'cpu',\n\t  kernelFunc: isInf$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar isNaN$2 = unaryKernelFunc(IsNan, function (xi) {\n\t  return Number.isNaN(xi) ? 1 : 0;\n\t}, 'bool');\n\tvar isNaNConfig = {\n\t  kernelName: IsNan,\n\t  backendName: 'cpu',\n\t  kernelFunc: isNaN$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar lessEqualImpl = createSimpleBinaryKernelImpl(function (a, b) {\n\t  return a <= b ? 1 : 0;\n\t});\n\tvar lessEqual$1 = binaryKernelFunc(LessEqual, lessEqualImpl, null\n\t/* complexImpl */\n\t, 'bool');\n\tvar lessEqualConfig = {\n\t  kernelName: LessEqual,\n\t  backendName: 'cpu',\n\t  kernelFunc: lessEqual$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction linSpace(args) {\n\t  var backend = args.backend,\n\t      attrs = args.attrs;\n\t  var start = attrs.start,\n\t      stop = attrs.stop,\n\t      num = attrs.num;\n\t  var outVals = linSpaceImpl(start, stop, num);\n\t  return backend.makeTensorInfo([outVals.length], 'float32', outVals);\n\t}\n\tvar linSpaceConfig = {\n\t  kernelName: LinSpace,\n\t  backendName: 'cpu',\n\t  kernelFunc: linSpace\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar log1p$1 = unaryKernelFunc(Log1p, function (xi) {\n\t  return Math.log1p(xi);\n\t});\n\tvar log1pConfig = {\n\t  kernelName: Log1p,\n\t  backendName: 'cpu',\n\t  kernelFunc: log1p$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar logicalAndImpl = createSimpleBinaryKernelImpl(function (a, b) {\n\t  return a && b;\n\t});\n\tvar logicalAnd$1 = binaryKernelFunc(LogicalAnd, logicalAndImpl, null\n\t/* complexImpl */\n\t, 'bool');\n\tvar logicalAndConfig = {\n\t  kernelName: LogicalAnd,\n\t  backendName: 'cpu',\n\t  kernelFunc: logicalAnd$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar logicalNot$1 = unaryKernelFunc(LogicalNot, function (xi) {\n\t  return xi ? 0 : 1;\n\t}, 'bool');\n\tvar logicalNotConfig = {\n\t  kernelName: LogicalNot,\n\t  backendName: 'cpu',\n\t  kernelFunc: logicalNot$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar logicalOrImpl = createSimpleBinaryKernelImpl(function (a, b) {\n\t  return a || b;\n\t});\n\tvar logicalOr$1 = binaryKernelFunc(LogicalOr, logicalOrImpl, null\n\t/* complexImpl */\n\t, 'bool');\n\tvar logicalOrConfig = {\n\t  kernelName: LogicalOr,\n\t  backendName: 'cpu',\n\t  kernelFunc: logicalOr$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction lRN(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var depthRadius = attrs.depthRadius,\n\t      bias = attrs.bias,\n\t      alpha = attrs.alpha,\n\t      beta = attrs.beta;\n\t  assertNotComplex(x, 'LRN');\n\t  var channels = x.shape[3];\n\t  var maxD = channels - 1;\n\t  var xValues = backend.data.get(x.dataId).values;\n\t  var size = sizeFromShape(x.shape);\n\t  var result = new Float32Array(size);\n\n\t  function sumAcrossChannels(offset) {\n\t    var currentChannel = offset % channels;\n\t    var beginSumOffset = offset - currentChannel + Math.max(0, currentChannel - depthRadius);\n\t    var endSumOffset = offset - currentChannel + Math.min(currentChannel + depthRadius, maxD);\n\t    var sum = 0.0;\n\n\t    for (; beginSumOffset <= endSumOffset; beginSumOffset++) {\n\t      var z = xValues[beginSumOffset];\n\t      sum += z * z;\n\t    }\n\n\t    return sum;\n\t  }\n\n\t  for (var offset = 0; offset < size; offset++) {\n\t    var sum = sumAcrossChannels(offset);\n\t    var val = xValues[offset] * Math.pow(bias + alpha * sum, -beta);\n\t    result[offset] = val;\n\t  }\n\n\t  return backend.makeTensorInfo(x.shape, x.dtype, result);\n\t}\n\tvar lRNConfig = {\n\t  kernelName: LRN,\n\t  backendName: 'cpu',\n\t  kernelFunc: lRN\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction lRNGrad(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      y = inputs.y,\n\t      dy = inputs.dy;\n\t  var depthRadius = attrs.depthRadius,\n\t      bias = attrs.bias,\n\t      alpha = attrs.alpha,\n\t      beta = attrs.beta;\n\t  assertNotComplex(dy, 'LRNGrad');\n\t  var dySize = sizeFromShape(dy.shape);\n\t  var channels = dy.shape[3];\n\t  var dyValues = backend.data.get(dy.dataId).values;\n\t  var xValues = backend.data.get(x.dataId).values;\n\t  var yValues = backend.data.get(y.dataId).values;\n\t  var result = new Float32Array(dySize);\n\t  var size = dySize;\n\n\t  for (var offset = 0; offset < size; offset++) {\n\t    var currentChannel = offset % channels;\n\t    var depthBegin = offset - currentChannel + Math.max(0, currentChannel - depthRadius);\n\t    var depthEnd = offset - currentChannel + Math.min(channels, currentChannel + depthRadius + 1);\n\t    var norm = 0;\n\n\t    for (var k = depthBegin; k < depthEnd; k++) {\n\t      norm += Math.pow(xValues[k], 2);\n\t    }\n\n\t    norm = alpha * norm + bias;\n\n\t    for (var _k = depthBegin; _k < depthEnd; _k++) {\n\t      var dyi = -2 * alpha * beta * xValues[_k] * yValues[offset] / norm;\n\n\t      if (offset === _k) {\n\t        dyi += Math.pow(norm, -beta);\n\t      }\n\n\t      dyi *= dyValues[offset];\n\t      result[_k] += dyi;\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(dy.shape, x.dtype, result);\n\t}\n\tvar lRNGradConfig = {\n\t  kernelName: LRNGrad,\n\t  backendName: 'cpu',\n\t  kernelFunc: lRNGrad\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction max$6(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var reductionIndices = attrs.reductionIndices,\n\t      keepDims = attrs.keepDims;\n\t  var cpuBackend = backend;\n\t  var xShape = x.shape;\n\t  var xRank = xShape.length;\n\t  var origAxes = parseAxisParam(reductionIndices, xShape);\n\t  var axes = origAxes;\n\t  var permutedAxes = getAxesPermutation(axes, xRank);\n\t  var xVals = cpuBackend.data.get(x.dataId).values;\n\n\t  if (permutedAxes != null) {\n\t    var newShape = new Array(xRank);\n\n\t    for (var i = 0; i < newShape.length; i++) {\n\t      newShape[i] = xShape[permutedAxes[i]];\n\t    }\n\n\t    xVals = transposeImpl(xVals, xShape, x.dtype, permutedAxes, newShape);\n\t    axes = getInnerMostAxes(axes.length, xRank);\n\t    xShape = newShape;\n\t  }\n\n\t  assertNotComplex(x, 'max');\n\t  assertAxesAreInnerMostDims('max', axes, xRank);\n\n\t  var _backend_util$compute = computeOutAndReduceShapes(xShape, axes),\n\t      maxOutShape = _backend_util$compute[0],\n\t      reduceShape = _backend_util$compute[1];\n\n\t  var reduceSize = sizeFromShape(reduceShape);\n\t  var result = maxImpl(xVals, reduceSize, maxOutShape, x.dtype);\n\t  var dataId = cpuBackend.write(result, maxOutShape, x.dtype);\n\t  var outShape = maxOutShape;\n\n\t  if (keepDims) {\n\t    // reshape\n\t    var _newShape = expandShapeToKeepDim(maxOutShape, origAxes);\n\n\t    outShape = _newShape;\n\t  }\n\n\t  return {\n\t    dataId: dataId,\n\t    shape: outShape,\n\t    dtype: x.dtype\n\t  };\n\t}\n\tvar maxConfig = {\n\t  kernelName: Max,\n\t  backendName: 'cpu',\n\t  kernelFunc: max$6\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction maxPool$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  assertNotComplex(x, 'maxPool');\n\t  var filterSize = attrs.filterSize,\n\t      strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dimRoundingMode = attrs.dimRoundingMode;\n\t  var dilations = 1;\n\t  assert(eitherStridesOrDilationsAreOne(strides, dilations), function () {\n\t    return 'Error in maxPool: Either strides or dilations must be 1. ' + (\"Got strides \" + strides + \" and dilations '\" + dilations + \"'\");\n\t  });\n\t  var convInfo = computePool2DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode);\n\t  var res;\n\n\t  if (convInfo.filterWidth === 1 && convInfo.filterHeight === 1 && arraysEqual(convInfo.inShape, convInfo.outShape)) {\n\t    res = identity$1({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend\n\t    });\n\t  } else {\n\t    var xValues = backend.data.get(x.dataId).values;\n\n\t    var _strides = computeStrides(x.shape);\n\n\t    var buffer = pool$1(xValues, x.shape, x.dtype, _strides, convInfo, 'max');\n\t    res = backend.makeTensorInfo(convInfo.outShape, x.dtype, buffer.values);\n\t  }\n\n\t  return res;\n\t}\n\tvar maxPoolConfig = {\n\t  kernelName: MaxPool,\n\t  backendName: 'cpu',\n\t  kernelFunc: maxPool$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction maxPool3D(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var filterSize = attrs.filterSize,\n\t      strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dimRoundingMode = attrs.dimRoundingMode,\n\t      dataFormat = attrs.dataFormat,\n\t      dilations = attrs.dilations;\n\t  assertNotComplex(x, 'maxPool3d');\n\t  var $dilations = dilations;\n\n\t  if ($dilations == null) {\n\t    $dilations = [1, 1, 1];\n\t  }\n\n\t  var convInfo = computePool3DInfo(x.shape, filterSize, strides, $dilations, pad, dimRoundingMode, dataFormat);\n\t  var xValues = backend.data.get(x.dataId).values;\n\t  var outBuf = pool3d$1(xValues, x.shape, x.dtype, computeStrides(x.shape), convInfo, 'max');\n\t  return backend.makeTensorInfo(outBuf.shape, 'float32', outBuf.values);\n\t}\n\tvar maxPool3DConfig = {\n\t  kernelName: MaxPool3D,\n\t  backendName: 'cpu',\n\t  kernelFunc: maxPool3D\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction maxPool3DGrad(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var dy = inputs.dy,\n\t      input = inputs.input;\n\t  var filterSize = attrs.filterSize,\n\t      strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dilations = attrs.dilations,\n\t      dimRoundingMode = attrs.dimRoundingMode;\n\t  assertNotComplex([dy, input], 'maxPool3DGrad');\n\t  var convInfo = computePool3DInfo(input.shape, filterSize, strides, dilations, pad, dimRoundingMode);\n\t  var inputBuf = backend.bufferSync(input);\n\t  var maxPosBuf = maxPool3dPositions(inputBuf, convInfo);\n\t  var strideDepth = convInfo.strideDepth;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var dilationDepth = convInfo.dilationDepth;\n\t  var dilationHeight = convInfo.dilationHeight;\n\t  var dilationWidth = convInfo.dilationWidth;\n\t  var effectiveFilterDepth = convInfo.effectiveFilterDepth;\n\t  var effectiveFilterHeight = convInfo.effectiveFilterHeight;\n\t  var effectiveFilterWidth = convInfo.effectiveFilterWidth;\n\t  var padFront = effectiveFilterDepth - 1 - convInfo.padInfo.front;\n\t  var padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n\t  var padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n\t  var dx = buffer(input.shape, 'float32');\n\t  var dyBuf = backend.bufferSync(dy);\n\n\t  for (var batch = 0; batch < convInfo.batchSize; ++batch) {\n\t    for (var channel = 0; channel < convInfo.inChannels; ++channel) {\n\t      for (var dxDepth = 0; dxDepth < convInfo.inDepth; ++dxDepth) {\n\t        for (var dxRow = 0; dxRow < convInfo.inHeight; ++dxRow) {\n\t          for (var dxCol = 0; dxCol < convInfo.inWidth; ++dxCol) {\n\t            // Shader code begins\n\t            var dyDepthCorner = dxDepth - padFront;\n\t            var dyRowCorner = dxRow - padTop;\n\t            var dyColCorner = dxCol - padLeft;\n\t            var dotProd = 0;\n\n\t            for (var wDepth = 0; wDepth < effectiveFilterDepth; wDepth += dilationDepth) {\n\t              var dyDepth = (dyDepthCorner + wDepth) / strideDepth;\n\n\t              if (dyDepth < 0 || dyDepth >= convInfo.outDepth || Math.floor(dyDepth) !== dyDepth) {\n\t                continue;\n\t              }\n\n\t              for (var wRow = 0; wRow < effectiveFilterHeight; wRow += dilationHeight) {\n\t                var dyRow = (dyRowCorner + wRow) / strideHeight;\n\n\t                if (dyRow < 0 || dyRow >= convInfo.outHeight || Math.floor(dyRow) !== dyRow) {\n\t                  continue;\n\t                }\n\n\t                for (var wCol = 0; wCol < effectiveFilterWidth; wCol += dilationWidth) {\n\t                  var dyCol = (dyColCorner + wCol) / strideWidth;\n\n\t                  if (dyCol < 0 || dyCol >= convInfo.outWidth || Math.floor(dyCol) !== dyCol) {\n\t                    continue;\n\t                  }\n\n\t                  var maxPos = effectiveFilterDepth * effectiveFilterHeight * effectiveFilterWidth - 1 - maxPosBuf.get(batch, dyDepth, dyRow, dyCol, channel);\n\t                  var curPos = wDepth * effectiveFilterHeight * effectiveFilterWidth + wRow * effectiveFilterWidth + wCol;\n\t                  var mask = maxPos === curPos ? 1 : 0;\n\n\t                  if (mask === 0) {\n\t                    continue;\n\t                  }\n\n\t                  var pixel = dyBuf.get(batch, dyDepth, dyRow, dyCol, channel);\n\t                  dotProd += pixel * mask;\n\t                }\n\t              }\n\t            }\n\n\t            dx.set(dotProd, batch, dxDepth, dxRow, dxCol, channel);\n\t          }\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n\t}\n\tvar maxPool3DGradConfig$1 = {\n\t  kernelName: MaxPool3DGrad,\n\t  backendName: 'cpu',\n\t  kernelFunc: maxPool3DGrad\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction maxPoolGrad$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var dy = inputs.dy,\n\t      input = inputs.input,\n\t      output = inputs.output;\n\t  var x = input;\n\t  assertNotComplex([input, output], 'maxPoolGrad');\n\t  var filterSize = attrs.filterSize,\n\t      strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dimRoundingMode = attrs.dimRoundingMode;\n\t  var convInfo = computePool2DInfo(x.shape, filterSize, strides, 1\n\t  /* dilations */\n\t  , pad, dimRoundingMode);\n\t  var xValues = backend.data.get(x.dataId).values;\n\t  var maxPosBuf = buffer(convInfo.outShape, x.dtype, maxPoolPositions(xValues, x.shape, x.dtype, convInfo).values);\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var dilationHeight = convInfo.dilationHeight;\n\t  var dilationWidth = convInfo.dilationWidth;\n\t  var effectiveFilterHeight = convInfo.effectiveFilterHeight;\n\t  var effectiveFilterWidth = convInfo.effectiveFilterWidth;\n\t  var padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n\t  var padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n\t  var dx = buffer(x.shape, 'float32');\n\t  var dyData = backend.data.get(dy.dataId).values;\n\t  var dyBuf = buffer(dy.shape, 'float32', dyData);\n\n\t  for (var b = 0; b < convInfo.batchSize; ++b) {\n\t    for (var d = 0; d < convInfo.inChannels; ++d) {\n\t      for (var dxR = 0; dxR < convInfo.inHeight; ++dxR) {\n\t        for (var dxC = 0; dxC < convInfo.inWidth; ++dxC) {\n\t          // Shader code begins.\n\t          var dyRCorner = dxR - padTop;\n\t          var dyCCorner = dxC - padLeft;\n\t          var dotProd = 0;\n\n\t          for (var wR = 0; wR < effectiveFilterHeight; wR += dilationHeight) {\n\t            var dyR = (dyRCorner + wR) / strideHeight;\n\n\t            if (dyR < 0 || dyR >= convInfo.outHeight || Math.floor(dyR) !== dyR) {\n\t              continue;\n\t            }\n\n\t            for (var wC = 0; wC < effectiveFilterWidth; wC += dilationWidth) {\n\t              var dyC = (dyCCorner + wC) / strideWidth;\n\n\t              if (dyC < 0 || dyC >= convInfo.outWidth || Math.floor(dyC) !== dyC) {\n\t                continue;\n\t              }\n\n\t              var maxPos = effectiveFilterHeight * effectiveFilterWidth - 1 - maxPosBuf.get(b, dyR, dyC, d);\n\t              var curPos = wR * effectiveFilterWidth + wC;\n\t              var mask = maxPos === curPos ? 1 : 0;\n\n\t              if (mask === 0) {\n\t                continue;\n\t              }\n\n\t              var pixel = dyBuf.get(b, dyR, dyC, d);\n\t              dotProd += pixel * mask;\n\t            }\n\t          }\n\n\t          dx.set(dotProd, b, dxR, dxC, d);\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n\t}\n\tvar maxPoolGradConfig$1 = {\n\t  kernelName: MaxPoolGrad,\n\t  backendName: 'cpu',\n\t  kernelFunc: maxPoolGrad$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction maxPoolWithArgmaxImpl(xValues, xShape, dtype, includeBatchInIndex, convInfo) {\n\t  var strides = computeStrides(xShape);\n\t  var maxPools = pool$1(xValues, xShape, dtype, strides, convInfo, 'max');\n\t  var maxPositions = maxPoolPositions(xValues, xShape, dtype, convInfo, true, includeBatchInIndex);\n\t  return [maxPools.values, maxPositions.values];\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar maxPoolWithArgmaxConfig = {\n\t  kernelName: MaxPoolWithArgmax,\n\t  backendName: 'cpu',\n\t  kernelFunc: function kernelFunc(_ref) {\n\t    var inputs = _ref.inputs,\n\t        attrs = _ref.attrs,\n\t        backend = _ref.backend;\n\t    var x = inputs.x;\n\t    var filterSize = attrs.filterSize,\n\t        strides = attrs.strides,\n\t        pad = attrs.pad,\n\t        includeBatchInIndex = attrs.includeBatchInIndex;\n\t    var cpuBackend = backend;\n\t    assertNotComplex(x, 'MaxPoolWithArgmax');\n\t    var values = cpuBackend.data.get(x.dataId).values;\n\t    var convInfo = computePool2DInfo(x.shape, filterSize, strides, [1, 1], pad);\n\n\t    var _maxPoolWithArgmaxImp = maxPoolWithArgmaxImpl(values, x.shape, x.dtype, includeBatchInIndex, convInfo),\n\t        pooled = _maxPoolWithArgmaxImp[0],\n\t        indexes = _maxPoolWithArgmaxImp[1];\n\n\t    var pooledDataId = cpuBackend.write(pooled, convInfo.outShape, x.dtype);\n\t    var indexesDataId = cpuBackend.write(indexes, convInfo.outShape, x.dtype);\n\t    return [{\n\t      dataId: pooledDataId,\n\t      shape: convInfo.outShape,\n\t      dtype: x.dtype\n\t    }, {\n\t      dataId: indexesDataId,\n\t      shape: convInfo.outShape,\n\t      dtype: 'int32'\n\t    }];\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction sum$3(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var axis = attrs.axis,\n\t      keepDims = attrs.keepDims;\n\t  assertNotComplex(x, 'sum');\n\t  var $x;\n\n\t  if (x.dtype === 'bool') {\n\t    $x = cast$2({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        dtype: 'int32'\n\t      }\n\t    });\n\t  } else {\n\t    $x = identity$1({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend\n\t    });\n\t  }\n\n\t  var xRank = $x.shape.length;\n\t  var axes = parseAxisParam(axis, $x.shape);\n\t  var permutation = getAxesPermutation(axes, xRank);\n\t  var reductionAxes = axes;\n\t  var permutedX = $x;\n\n\t  if (permutation != null) {\n\t    permutedX = transpose$1({\n\t      inputs: {\n\t        x: $x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        perm: permutation\n\t      }\n\t    });\n\t    reductionAxes = getInnerMostAxes(reductionAxes.length, xRank);\n\t  }\n\n\t  assertAxesAreInnerMostDims('sum', reductionAxes, permutedX.shape.length);\n\n\t  var _backend_util$compute = computeOutAndReduceShapes(permutedX.shape, reductionAxes),\n\t      outShape = _backend_util$compute[0],\n\t      reduceShape = _backend_util$compute[1];\n\n\t  var resultDtype = upcastType(permutedX.dtype, 'int32');\n\t  var result = zeros$2(backend, outShape, resultDtype);\n\t  var reduceSize = sizeFromShape(reduceShape);\n\t  var vals = backend.data.get(result.dataId).values;\n\t  var aVals = backend.data.get(permutedX.dataId).values;\n\n\t  for (var i = 0; i < vals.length; ++i) {\n\t    var offset = i * reduceSize;\n\t    var _sum = 0;\n\n\t    for (var j = 0; j < reduceSize; ++j) {\n\t      _sum += aVals[offset + j];\n\t    }\n\n\t    vals[i] = _sum;\n\t  }\n\n\t  if (keepDims) {\n\t    var newShape = expandShapeToKeepDim(result.shape, axes);\n\t    var oldResult = result;\n\t    result = reshape$2({\n\t      inputs: {\n\t        x: result\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: newShape\n\t      }\n\t    });\n\t    backend.disposeIntermediateTensorInfo(oldResult);\n\t  }\n\n\t  backend.disposeIntermediateTensorInfo($x);\n\n\t  if (permutation != null) {\n\t    backend.disposeIntermediateTensorInfo(permutedX);\n\t  }\n\n\t  return result;\n\t}\n\tvar sumConfig = {\n\t  kernelName: Sum,\n\t  backendName: 'cpu',\n\t  kernelFunc: sum$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction mean$3(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var axis = attrs.axis,\n\t      keepDims = attrs.keepDims;\n\t  var axes = parseAxisParam(axis, x.shape);\n\t  var shapes = computeOutAndReduceShapes(x.shape, axes);\n\t  var reduceShape = shapes[1];\n\t  var reduceSize = sizeFromShape(reduceShape);\n\t  var toDispose = [];\n\t  var reduceSizeScalar = backend.makeTensorInfo([], 'float32', new Float32Array([reduceSize]));\n\t  toDispose.push(reduceSizeScalar);\n\t  var $x = cast$2({\n\t    inputs: {\n\t      x: x\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      dtype: 'float32'\n\t    }\n\t  });\n\t  toDispose.push($x);\n\t  var res = div$1({\n\t    inputs: {\n\t      a: $x,\n\t      b: reduceSizeScalar\n\t    },\n\t    backend: backend\n\t  });\n\t  toDispose.push(res);\n\t  var result = sum$3({\n\t    inputs: {\n\t      x: res\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      axis: axis,\n\t      keepDims: keepDims\n\t    }\n\t  });\n\t  toDispose.forEach(function (t) {\n\t    return backend.disposeIntermediateTensorInfo(t);\n\t  });\n\t  return result;\n\t}\n\tvar meanConfig = {\n\t  kernelName: Mean,\n\t  backendName: 'cpu',\n\t  kernelFunc: mean$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction min$b(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var axis = attrs.axis,\n\t      keepDims = attrs.keepDims;\n\t  assertNotComplex(x, 'min');\n\t  var origAxes = parseAxisParam(axis, x.shape);\n\t  var axes = origAxes;\n\t  var permutedAxes = getAxesPermutation(axes, x.shape.length);\n\t  var $x = x;\n\n\t  if (permutedAxes != null) {\n\t    $x = transpose$1({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        perm: permutedAxes\n\t      }\n\t    });\n\t    axes = getInnerMostAxes(axes.length, x.shape.length);\n\t  }\n\n\t  assertAxesAreInnerMostDims('min', axes, $x.shape.length);\n\n\t  var _backend_util$compute = computeOutAndReduceShapes($x.shape, axes),\n\t      outShape = _backend_util$compute[0],\n\t      reduceShape = _backend_util$compute[1];\n\n\t  var reduceSize = sizeFromShape(reduceShape);\n\t  var vals = makeZerosTypedArray(sizeFromShape(outShape), $x.dtype);\n\t  var aVals = backend.data.get($x.dataId).values;\n\n\t  for (var i = 0; i < vals.length; ++i) {\n\t    var offset = i * reduceSize;\n\t    var _min = aVals[offset];\n\n\t    for (var j = 0; j < reduceSize; ++j) {\n\t      var value = aVals[offset + j];\n\n\t      if (value < _min) {\n\t        _min = value;\n\t      }\n\t    }\n\n\t    vals[i] = _min;\n\t  }\n\n\t  if (permutedAxes != null) {\n\t    backend.disposeIntermediateTensorInfo($x);\n\t  }\n\n\t  var result = backend.makeTensorInfo(outShape, $x.dtype, vals);\n\n\t  if (keepDims) {\n\t    var expandedShape = expandShapeToKeepDim(outShape, origAxes);\n\t    var reshapedResult = reshape$2({\n\t      inputs: {\n\t        x: result\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: expandedShape\n\t      }\n\t    });\n\t    backend.disposeIntermediateTensorInfo(result);\n\t    return reshapedResult;\n\t  }\n\n\t  return result;\n\t}\n\tvar minConfig = {\n\t  kernelName: Min,\n\t  backendName: 'cpu',\n\t  kernelFunc: min$b\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction mirrorPad$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var paddings = attrs.paddings,\n\t      mode = attrs.mode;\n\t  assertNotComplex(x, 'mirrorPad');\n\t  var outShape = paddings.map(function (p, i) {\n\t    return p[0]\n\t    /* beforePad */\n\t    + x.shape[i] + p[1];\n\t  }\n\t  /* afterPad */\n\t  );\n\t  var start = paddings.map(function (p) {\n\t    return p[0];\n\t  });\n\t  var end = paddings.map(function (p, i) {\n\t    return p[0] + x.shape[i];\n\t  });\n\t  var offset = mode === 'reflect' ? 0 : 1;\n\t  var xVals = backend.data.get(x.dataId).values;\n\t  var xRank = x.shape.length;\n\t  var xStrides = computeStrides(x.shape);\n\t  var resultSize = sizeFromShape(outShape);\n\t  var resultRank = outShape.length;\n\t  var resultStrides = computeStrides(outShape);\n\t  var resVals = getTypedArrayFromDType(x.dtype, resultSize);\n\n\t  for (var i = 0; i < resultSize; i++) {\n\t    var coords = indexToLoc(i, resultRank, resultStrides);\n\n\t    for (var _i = 0; _i < resultRank; _i++) {\n\t      if (coords[_i] < start[_i]) {\n\t        coords[_i] = start[_i] * 2 - coords[_i] - offset;\n\t      } else if (coords[_i] >= end[_i]) {\n\t        coords[_i] = (end[_i] - 1) * 2 - coords[_i] + offset;\n\t      }\n\t    }\n\n\t    coords = coords.map(function (c, i) {\n\t      return c - start[i];\n\t    });\n\t    var inIndex = locToIndex(coords, xRank, xStrides);\n\t    resVals[i] = xVals[inIndex];\n\t  }\n\n\t  var outId = backend.write(resVals, outShape, x.dtype);\n\t  return {\n\t    dataId: outId,\n\t    shape: outShape,\n\t    dtype: x.dtype\n\t  };\n\t}\n\tvar mirrorPadConfig = {\n\t  kernelName: MirrorPad,\n\t  backendName: 'cpu',\n\t  kernelFunc: mirrorPad$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar modImpl = createSimpleBinaryKernelImpl(function (aValue, bValue) {\n\t  var rem = aValue % bValue;\n\n\t  if (aValue < 0 && bValue < 0 || aValue >= 0 && bValue >= 0) {\n\t    return rem;\n\t  } else {\n\t    return (rem + bValue) % bValue;\n\t  }\n\t});\n\tvar mod$1 = binaryKernelFunc(Mod, modImpl);\n\tvar modConfig = {\n\t  kernelName: Mod,\n\t  backendName: 'cpu',\n\t  kernelFunc: mod$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction softmax$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var logits = inputs.logits;\n\t  var dim = attrs.dim;\n\t  var logitsRank = logits.shape.length;\n\t  var $dim = dim;\n\n\t  if ($dim === -1) {\n\t    $dim = logitsRank - 1;\n\t  }\n\n\t  if ($dim !== logitsRank - 1) {\n\t    throw Error('Softmax along a non-last dimension is not yet supported. ' + (\"Logits was rank \" + logitsRank + \" and dim was \" + $dim));\n\t  }\n\n\t  var axes = parseAxisParam([$dim], logits.shape);\n\t  var maxLogit = max$6({\n\t    inputs: {\n\t      x: logits\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      reductionIndices: axes,\n\t      keepDims: false\n\t    }\n\t  });\n\t  var expandedShape = expandShapeToKeepDim(maxLogit.shape, axes);\n\t  var maxLogitReshaped = reshape$2({\n\t    inputs: {\n\t      x: maxLogit\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: expandedShape\n\t    }\n\t  });\n\t  var a = sub$1({\n\t    inputs: {\n\t      a: logits,\n\t      b: maxLogitReshaped\n\t    },\n\t    backend: backend\n\t  });\n\t  var b = exp$4({\n\t    inputs: {\n\t      x: a\n\t    },\n\t    backend: backend\n\t  });\n\t  var sumExp = sum$3({\n\t    inputs: {\n\t      x: b\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      axis: axes,\n\t      keepDims: false\n\t    }\n\t  });\n\t  var sumReshaped = reshape$2({\n\t    inputs: {\n\t      x: sumExp\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: expandedShape\n\t    }\n\t  });\n\t  var result = div$1({\n\t    inputs: {\n\t      a: b,\n\t      b: sumReshaped\n\t    },\n\t    backend: backend\n\t  });\n\t  backend.disposeIntermediateTensorInfo(maxLogit);\n\t  backend.disposeIntermediateTensorInfo(maxLogitReshaped);\n\t  backend.disposeIntermediateTensorInfo(a);\n\t  backend.disposeIntermediateTensorInfo(b);\n\t  backend.disposeIntermediateTensorInfo(sumExp);\n\t  backend.disposeIntermediateTensorInfo(sumReshaped);\n\t  return result;\n\t}\n\tvar softmaxConfig = {\n\t  kernelName: Softmax,\n\t  backendName: 'cpu',\n\t  kernelFunc: softmax$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction multinomial$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var logits = inputs.logits;\n\t  var numSamples = attrs.numSamples,\n\t      seed = attrs.seed,\n\t      normalized = attrs.normalized;\n\t  assertNotComplex(logits, 'multinomial');\n\t  var probabilities = normalized ? logits : softmax$2({\n\t    inputs: {\n\t      logits: logits\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      dim: -1\n\t    }\n\t  });\n\t  var batchSize = probabilities.shape[0];\n\t  var numEvents = probabilities.shape[1];\n\t  var probVals = backend.data.get(probabilities.dataId).values;\n\t  var resShape = [batchSize, numSamples];\n\t  var resVals = makeZerosTypedArray(sizeFromShape(resShape), 'int32');\n\n\t  for (var b = 0; b < batchSize; ++b) {\n\t    var offset = b * numEvents; // The cdf won't include the last event. It will be implicit if no other\n\t    // event happened.\n\n\t    var cdf = new Float32Array(numEvents - 1);\n\t    cdf[0] = probVals[offset];\n\n\t    for (var event = 1; event < cdf.length; ++event) {\n\t      cdf[event] = cdf[event - 1] + probVals[offset + event];\n\t    }\n\n\t    var random = seedrandom_1(seed.toString());\n\t    var outOffset = b * numSamples;\n\n\t    for (var sampleId = 0; sampleId < numSamples; ++sampleId) {\n\t      var r = random(); // Assume last event happened by default.\n\n\t      resVals[outOffset + sampleId] = cdf.length;\n\n\t      for (var _event = 0; _event < cdf.length; _event++) {\n\t        if (r < cdf[_event]) {\n\t          resVals[outOffset + sampleId] = _event;\n\t          break;\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  if (!normalized) {\n\t    backend.disposeIntermediateTensorInfo(probabilities);\n\t  }\n\n\t  return backend.makeTensorInfo(resShape, 'int32', resVals);\n\t}\n\tvar multinomialConfig = {\n\t  kernelName: Multinomial,\n\t  backendName: 'cpu',\n\t  kernelFunc: multinomial$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar nonMaxSuppressionV3Impl$1 = nonMaxSuppressionV3Impl;\n\tfunction nonMaxSuppressionV3(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var boxes = inputs.boxes,\n\t      scores = inputs.scores;\n\t  var maxOutputSize = attrs.maxOutputSize,\n\t      iouThreshold = attrs.iouThreshold,\n\t      scoreThreshold = attrs.scoreThreshold;\n\t  assertNotComplex(boxes, 'NonMaxSuppression');\n\t  var boxesVals = backend.data.get(boxes.dataId).values;\n\t  var scoresVals = backend.data.get(scores.dataId).values;\n\n\t  var _nonMaxSuppressionV3I = nonMaxSuppressionV3Impl$1(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold),\n\t      selectedIndices = _nonMaxSuppressionV3I.selectedIndices;\n\n\t  return backend.makeTensorInfo([selectedIndices.length], 'int32', new Int32Array(selectedIndices));\n\t}\n\tvar nonMaxSuppressionV3Config = {\n\t  kernelName: NonMaxSuppressionV3,\n\t  backendName: 'cpu',\n\t  kernelFunc: nonMaxSuppressionV3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar nonMaxSuppressionV4Impl$1 = nonMaxSuppressionV4Impl;\n\tfunction nonMaxSuppressionV4(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var boxes = inputs.boxes,\n\t      scores = inputs.scores;\n\t  var maxOutputSize = attrs.maxOutputSize,\n\t      iouThreshold = attrs.iouThreshold,\n\t      scoreThreshold = attrs.scoreThreshold,\n\t      padToMaxOutputSize = attrs.padToMaxOutputSize;\n\t  assertNotComplex(boxes, 'NonMaxSuppressionPadded');\n\t  var boxesVals = backend.data.get(boxes.dataId).values;\n\t  var scoresVals = backend.data.get(scores.dataId).values;\n\n\t  var _nonMaxSuppressionV4I = nonMaxSuppressionV4Impl$1(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize),\n\t      selectedIndices = _nonMaxSuppressionV4I.selectedIndices,\n\t      validOutputs = _nonMaxSuppressionV4I.validOutputs;\n\n\t  return [backend.makeTensorInfo([selectedIndices.length], 'int32', new Int32Array(selectedIndices)), backend.makeTensorInfo([], 'int32', new Int32Array([validOutputs]))];\n\t}\n\tvar nonMaxSuppressionV4Config = {\n\t  kernelName: NonMaxSuppressionV4,\n\t  backendName: 'cpu',\n\t  kernelFunc: nonMaxSuppressionV4\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar nonMaxSuppressionV5Impl$1 = nonMaxSuppressionV5Impl;\n\tfunction nonMaxSuppressionV5(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var boxes = inputs.boxes,\n\t      scores = inputs.scores;\n\t  var maxOutputSize = attrs.maxOutputSize,\n\t      iouThreshold = attrs.iouThreshold,\n\t      scoreThreshold = attrs.scoreThreshold,\n\t      softNmsSigma = attrs.softNmsSigma;\n\t  assertNotComplex(boxes, 'NonMaxSuppressionWithScore');\n\t  var boxesVals = backend.data.get(boxes.dataId).values;\n\t  var scoresVals = backend.data.get(scores.dataId).values;\n\t  var maxOutputSizeVal = maxOutputSize;\n\t  var iouThresholdVal = iouThreshold;\n\t  var scoreThresholdVal = scoreThreshold;\n\t  var softNmsSigmaVal = softNmsSigma;\n\n\t  var _nonMaxSuppressionV5I = nonMaxSuppressionV5Impl$1(boxesVals, scoresVals, maxOutputSizeVal, iouThresholdVal, scoreThresholdVal, softNmsSigmaVal),\n\t      selectedIndices = _nonMaxSuppressionV5I.selectedIndices,\n\t      selectedScores = _nonMaxSuppressionV5I.selectedScores;\n\n\t  return [backend.makeTensorInfo([selectedIndices.length], 'int32', new Int32Array(selectedIndices)), backend.makeTensorInfo([selectedScores.length], 'float32', new Float32Array(selectedScores))];\n\t}\n\tvar nonMaxSuppressionV5Config = {\n\t  kernelName: NonMaxSuppressionV5,\n\t  backendName: 'cpu',\n\t  kernelFunc: nonMaxSuppressionV5\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction oneHot$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var indices = inputs.indices;\n\t  var depth = attrs.depth,\n\t      onValue = attrs.onValue,\n\t      offValue = attrs.offValue;\n\t  assertNotComplex(indices, 'oneHot');\n\t  var indicesSize = sizeFromShape(indices.shape);\n\t  var res = new Float32Array(indicesSize * depth);\n\t  res.fill(offValue);\n\t  var indicesVal = backend.data.get(indices.dataId).values;\n\n\t  for (var event = 0; event < indicesSize; ++event) {\n\t    if (indicesVal[event] >= 0 && indicesVal[event] < depth) {\n\t      res[event * depth + indicesVal[event]] = onValue;\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo([].concat(indices.shape, [depth]), 'int32', res);\n\t}\n\tvar oneHotConfig = {\n\t  kernelName: OneHot,\n\t  backendName: 'cpu',\n\t  kernelFunc: oneHot$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction zerosLike$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var x = inputs.x;\n\n\t  if (x.dtype === 'string') {\n\t    throw new Error('zerosLike is not supported for string tensors');\n\t  } else if (x.dtype === 'complex64') {\n\t    var realPart = real$1({\n\t      inputs: {\n\t        input: x\n\t      },\n\t      backend: backend\n\t    });\n\t    var r = zerosLike$2({\n\t      inputs: {\n\t        x: realPart\n\t      },\n\t      backend: backend\n\t    });\n\t    var imagPart = imag$1({\n\t      inputs: {\n\t        input: x\n\t      },\n\t      backend: backend\n\t    });\n\t    var i = zerosLike$2({\n\t      inputs: {\n\t        x: imagPart\n\t      },\n\t      backend: backend\n\t    });\n\t    var result = complex$1({\n\t      inputs: {\n\t        real: r,\n\t        imag: i\n\t      },\n\t      backend: backend\n\t    });\n\t    backend.disposeIntermediateTensorInfo(realPart);\n\t    backend.disposeIntermediateTensorInfo(r);\n\t    backend.disposeIntermediateTensorInfo(imagPart);\n\t    backend.disposeIntermediateTensorInfo(i);\n\t    return result;\n\t  } else {\n\t    return fill$1({\n\t      backend: backend,\n\t      attrs: {\n\t        shape: x.shape,\n\t        value: 0,\n\t        dtype: x.dtype\n\t      }\n\t    });\n\t  }\n\t}\n\tvar zerosLikeConfig = {\n\t  kernelName: ZerosLike,\n\t  backendName: 'cpu',\n\t  kernelFunc: zerosLike$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction onesLike$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var x = inputs.x;\n\n\t  if (x.dtype === 'string') {\n\t    throw new Error('onesLike is not supported for string tensors');\n\t  } else if (x.dtype === 'complex64') {\n\t    var realPart = real$1({\n\t      inputs: {\n\t        input: x\n\t      },\n\t      backend: backend\n\t    });\n\t    var r = onesLike$2({\n\t      inputs: {\n\t        x: realPart\n\t      },\n\t      backend: backend\n\t    });\n\t    var imagPart = imag$1({\n\t      inputs: {\n\t        input: x\n\t      },\n\t      backend: backend\n\t    });\n\t    var i = zerosLike$2({\n\t      inputs: {\n\t        x: imagPart\n\t      },\n\t      backend: backend\n\t    });\n\t    var result = complex$1({\n\t      inputs: {\n\t        real: r,\n\t        imag: i\n\t      },\n\t      backend: backend\n\t    });\n\t    backend.disposeIntermediateTensorInfo(realPart);\n\t    backend.disposeIntermediateTensorInfo(r);\n\t    backend.disposeIntermediateTensorInfo(imagPart);\n\t    backend.disposeIntermediateTensorInfo(i);\n\t    return result;\n\t  } else {\n\t    return fill$1({\n\t      backend: backend,\n\t      attrs: {\n\t        shape: x.shape,\n\t        value: 1,\n\t        dtype: x.dtype\n\t      }\n\t    });\n\t  }\n\t}\n\tvar onesLikeConfig = {\n\t  kernelName: OnesLike,\n\t  backendName: 'cpu',\n\t  kernelFunc: onesLike$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction pack$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var axis = attrs.axis;\n\n\t  if (inputs.length === 1) {\n\t    return expandDims$2({\n\t      inputs: {\n\t        input: inputs[0]\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        dim: axis\n\t      }\n\t    });\n\t  }\n\n\t  var shape = inputs[0].shape;\n\t  var dtype = inputs[0].dtype;\n\t  inputs.forEach(function (t) {\n\t    assertShapesMatch(shape, t.shape, 'All tensors passed to stack must have matching shapes');\n\t    assert(dtype === t.dtype, function () {\n\t      return 'All tensors passed to stack must have matching dtypes';\n\t    });\n\t  });\n\t  var intermediateTensorInfos = [];\n\t  var expandedTensors = inputs.map(function (t) {\n\t    var expandedT = expandDims$2({\n\t      inputs: {\n\t        input: t\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        dim: axis\n\t      }\n\t    });\n\t    intermediateTensorInfos.push(expandedT);\n\t    return expandedT;\n\t  });\n\t  var result = concat$1({\n\t    inputs: expandedTensors,\n\t    backend: backend,\n\t    attrs: {\n\t      axis: axis\n\t    }\n\t  });\n\t  intermediateTensorInfos.forEach(function (t) {\n\t    return backend.disposeIntermediateTensorInfo(t);\n\t  });\n\t  return result;\n\t}\n\tvar packConfig = {\n\t  kernelName: Pack,\n\t  backendName: 'cpu',\n\t  kernelFunc: pack$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction padV2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var paddings = attrs.paddings,\n\t      constantValue = attrs.constantValue;\n\t  assertNotComplex(x, 'pad');\n\t  var outShape = paddings.map(function (p, i) {\n\t    return p[0]\n\t    /* beforePad */\n\t    + x.shape[i] + p[1];\n\t  }\n\t  /* afterPad */\n\t  );\n\t  var start = paddings.map(function (p) {\n\t    return p[0];\n\t  });\n\t  var xVals = backend.data.get(x.dataId).values;\n\t  var xSize = sizeFromShape(x.shape);\n\t  var xRank = x.shape.length;\n\t  var xStrides = computeStrides(x.shape);\n\t  var resultSize = sizeFromShape(outShape);\n\t  var resultRank = outShape.length;\n\t  var resultStrides = computeStrides(outShape);\n\t  var resVals = getTypedArrayFromDType(x.dtype, resultSize);\n\n\t  if (constantValue !== 0) {\n\t    resVals.fill(constantValue);\n\t  }\n\n\t  for (var i = 0; i < xSize; i++) {\n\t    var coords = indexToLoc(i, xRank, xStrides);\n\t    var outCoords = coords.map(function (c, i) {\n\t      return c + start[i];\n\t    });\n\t    var outIndex = locToIndex(outCoords, resultRank, resultStrides);\n\t    resVals[outIndex] = xVals[i];\n\t  }\n\n\t  var outId = backend.write(resVals, outShape, x.dtype);\n\t  return {\n\t    dataId: outId,\n\t    shape: outShape,\n\t    dtype: x.dtype\n\t  };\n\t}\n\tvar padV2Config = {\n\t  kernelName: PadV2,\n\t  backendName: 'cpu',\n\t  kernelFunc: padV2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar powImpl = createSimpleBinaryKernelImpl(function (a, b) {\n\t  return Math.pow(a, b);\n\t});\n\tvar pow$7 = binaryKernelFunc(Pow, powImpl);\n\tvar powConfig = {\n\t  kernelName: Pow,\n\t  backendName: 'cpu',\n\t  kernelFunc: pow$7\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction range$2(args) {\n\t  var backend = args.backend,\n\t      attrs = args.attrs;\n\t  var start = attrs.start,\n\t      stop = attrs.stop,\n\t      dtype = attrs.dtype,\n\t      step = attrs.step;\n\t  var values = rangeImpl(start, stop, step, dtype);\n\t  return backend.makeTensorInfo([values.length], dtype, values);\n\t}\n\tvar rangeConfig = {\n\t  kernelName: Range,\n\t  backendName: 'cpu',\n\t  kernelFunc: range$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar reciprocal$1 = unaryKernelFunc(Reciprocal, function (xi) {\n\t  return 1 / xi;\n\t});\n\tvar reciprocalConfig = {\n\t  kernelName: Reciprocal,\n\t  backendName: 'cpu',\n\t  kernelFunc: reciprocal$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction resizeBilinear$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var images = inputs.images;\n\t  var alignCorners = attrs.alignCorners,\n\t      halfPixelCenters = attrs.halfPixelCenters,\n\t      size = attrs.size;\n\t  assertNotComplex(images, 'resizeBilinear');\n\t  var imagesStrides = computeStrides(images.shape);\n\t  var newHeight = size[0],\n\t      newWidth = size[1];\n\t  var _images$shape = images.shape,\n\t      batch = _images$shape[0],\n\t      oldHeight = _images$shape[1],\n\t      oldWidth = _images$shape[2],\n\t      numChannels = _images$shape[3];\n\t  var xValues = backend.data.get(images.dataId).values;\n\t  var result = new Float32Array(sizeFromShape([batch, newHeight, newWidth, numChannels]));\n\t  var effectiveInputSize = [alignCorners && newHeight > 1 ? oldHeight - 1 : oldHeight, alignCorners && newWidth > 1 ? oldWidth - 1 : oldWidth];\n\t  var effectiveOutputSize = [alignCorners && newHeight > 1 ? newHeight - 1 : newHeight, alignCorners && newWidth > 1 ? newWidth - 1 : newWidth];\n\t  var outputIdx = 0;\n\t  var effectiveRowSizeRatio = effectiveInputSize[0] / effectiveOutputSize[0];\n\t  var effectiveColSizeRatio = effectiveInputSize[1] / effectiveOutputSize[1];\n\n\t  for (var b = 0; b < batch; b++) {\n\t    for (var r = 0; r < newHeight; r++) {\n\t      var sourceFracRow = void 0;\n\n\t      if (halfPixelCenters) {\n\t        sourceFracRow = effectiveRowSizeRatio * (r + 0.5) - 0.5;\n\t      } else {\n\t        sourceFracRow = effectiveRowSizeRatio * r;\n\t      }\n\n\t      var sourceRowFloor = Math.max(0, Math.floor(sourceFracRow));\n\t      var rowFrac = sourceFracRow - sourceRowFloor;\n\t      var sourceRowCeil = Math.min(oldHeight - 1, Math.ceil(sourceFracRow));\n\t      var topRowOffset = b * imagesStrides[0] + sourceRowFloor * imagesStrides[1];\n\t      var botRowOffset = b * imagesStrides[0] + sourceRowCeil * imagesStrides[1];\n\n\t      for (var c = 0; c < newWidth; c++) {\n\t        var sourceFracCol = void 0;\n\n\t        if (halfPixelCenters) {\n\t          sourceFracCol = effectiveColSizeRatio * (c + 0.5) - 0.5;\n\t        } else {\n\t          sourceFracCol = effectiveColSizeRatio * c;\n\t        }\n\n\t        var sourceColFloor = Math.max(0, Math.floor(sourceFracCol));\n\t        var colFrac = sourceFracCol - sourceColFloor;\n\t        var sourceColCeil = Math.min(oldWidth - 1, Math.ceil(sourceFracCol));\n\t        var topLeftOffest = topRowOffset + sourceColFloor * imagesStrides[2];\n\t        var botLeftOffset = botRowOffset + sourceColFloor * imagesStrides[2];\n\t        var topRightOffset = topRowOffset + sourceColCeil * imagesStrides[2];\n\t        var botRightOffest = botRowOffset + sourceColCeil * imagesStrides[2];\n\n\t        for (var d = 0; d < numChannels; d++) {\n\t          // Begin shader.\n\t          // Compute the fractional index of the source.\n\t          var topLeft = xValues[topLeftOffest + d];\n\t          var bottomLeft = xValues[botLeftOffset + d];\n\t          var topRight = xValues[topRightOffset + d];\n\t          var bottomRight = xValues[botRightOffest + d];\n\t          var top = topLeft + (topRight - topLeft) * colFrac;\n\t          var bottom = bottomLeft + (bottomRight - bottomLeft) * colFrac;\n\t          var newValue = top + (bottom - top) * rowFrac;\n\t          result[outputIdx++] = newValue;\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo([batch, newHeight, newWidth, numChannels], 'float32', result);\n\t}\n\tvar resizeBilinearConfig = {\n\t  kernelName: ResizeBilinear,\n\t  backendName: 'cpu',\n\t  kernelFunc: resizeBilinear$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction resizeBilinearGrad(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var images = inputs.images,\n\t      dy = inputs.dy;\n\t  var alignCorners = attrs.alignCorners;\n\t  assertNotComplex([dy, images], 'resizeBilinearGrad');\n\t  var imagesStrides = computeStrides(images.shape);\n\t  var _images$shape = images.shape,\n\t      batch = _images$shape[0],\n\t      xHeight = _images$shape[1],\n\t      xWidth = _images$shape[2],\n\t      depth = _images$shape[3];\n\t  var _dy$shape = dy.shape,\n\t      yHeight = _dy$shape[1],\n\t      yWidth = _dy$shape[2];\n\t  var output = new Float32Array(batch * xHeight * xWidth * depth); // In the backwards pass, we want to find the pixels that were generated\n\t  // for each pixel in the input image the forward pass and add the\n\t  // corresponding coefficient from dy to the gradient (with some\n\t  // interpolation).\n\n\t  var effectiveXSize = [alignCorners && yHeight > 1 ? xHeight - 1 : xHeight, alignCorners && yWidth > 1 ? xWidth - 1 : xWidth];\n\t  var effectiveYSize = [alignCorners && yHeight > 1 ? yHeight - 1 : yHeight, alignCorners && yWidth > 1 ? yWidth - 1 : yWidth];\n\t  var heightScale = effectiveXSize[0] / effectiveYSize[0];\n\t  var widthScale = effectiveXSize[1] / effectiveYSize[1]; // Reference implementation\n\t  // tslint:disable-next-line:max-line-length\n\t  // https://github.com/tensorflow/tensorflow/blob/3039375c86a5bbc9610c7725dcaa95d635f87ba2/tensorflow/core/kernels/resize_bilinear_op.cc#L275\n\n\t  var dyValues = backend.data.get(dy.dataId).values;\n\t  var offset = 0;\n\n\t  for (var b = 0; b < batch; b++) {\n\t    var bOffset = b * imagesStrides[0];\n\n\t    for (var r = 0; r < yHeight; r++) {\n\t      var dxR = r * heightScale;\n\t      var topDxRIndex = Math.floor(dxR);\n\t      var bottomDxRIndex = Math.min(Math.ceil(dxR), xHeight - 1);\n\t      var topDxROffset = bOffset + topDxRIndex * imagesStrides[1];\n\t      var bottomDxROffset = bOffset + bottomDxRIndex * imagesStrides[1];\n\t      var dxRLerp = dxR - topDxRIndex;\n\t      var inverseDxRLerp = 1.0 - dxRLerp;\n\n\t      for (var c = 0; c < yWidth; c++) {\n\t        var dxC = c * widthScale;\n\t        var leftDxCIndex = Math.floor(dxC);\n\t        var rightDxCIndex = Math.min(Math.ceil(dxC), xWidth - 1);\n\t        var dxCLerp = dxC - leftDxCIndex;\n\t        var inverseDxCLerp = 1.0 - dxCLerp;\n\t        var topLeftRCOffset = topDxROffset + leftDxCIndex * imagesStrides[2];\n\t        var topRightRCOffset = topDxROffset + rightDxCIndex * imagesStrides[2];\n\t        var bottomLeftRCOffset = bottomDxROffset + leftDxCIndex * imagesStrides[2];\n\t        var bottomRightRCOffset = bottomDxROffset + rightDxCIndex * imagesStrides[2];\n\t        var inverseDxRLerpTimesInverseDxCLerp = inverseDxRLerp * inverseDxCLerp;\n\t        var inverseDxRLerpTimesDxCLerp = inverseDxRLerp * dxCLerp;\n\t        var dxRLerpTimesInverseDxCLerp = dxRLerp * inverseDxCLerp;\n\t        var dxRLerpTimesDxCLerp = dxRLerp * dxCLerp;\n\n\t        for (var d = 0; d < depth; d++) {\n\t          var dyVal = dyValues[offset++];\n\t          output[topLeftRCOffset + d] += dyVal * inverseDxRLerpTimesInverseDxCLerp;\n\t          output[topRightRCOffset + d] += dyVal * inverseDxRLerpTimesDxCLerp;\n\t          output[bottomLeftRCOffset + d] += dyVal * dxRLerpTimesInverseDxCLerp;\n\t          output[bottomRightRCOffset + d] += dyVal * dxRLerpTimesDxCLerp;\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo([batch, xWidth, xHeight, depth], 'float32', output);\n\t}\n\tvar resizeBilinearGradConfig$1 = {\n\t  kernelName: ResizeBilinearGrad,\n\t  backendName: 'cpu',\n\t  kernelFunc: resizeBilinearGrad\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction resizeNearestNeighbor$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var images = inputs.images;\n\t  var alignCorners = attrs.alignCorners,\n\t      halfPixelCenters = attrs.halfPixelCenters,\n\t      size = attrs.size;\n\t  assertNotComplex(images, 'resizeNearestNeighbor');\n\t  var imagesStrides = computeStrides(images.shape);\n\t  var newHeight = size[0],\n\t      newWidth = size[1];\n\t  var _images$shape = images.shape,\n\t      batch = _images$shape[0],\n\t      oldHeight = _images$shape[1],\n\t      oldWidth = _images$shape[2],\n\t      numChannels = _images$shape[3];\n\t  var xValues = backend.data.get(images.dataId).values;\n\t  var output = new Float32Array(batch * newHeight * newWidth * numChannels);\n\t  var effectiveInputSize = [alignCorners && newHeight > 1 ? oldHeight - 1 : oldHeight, alignCorners && newWidth > 1 ? oldWidth - 1 : oldWidth];\n\t  var effectiveOutputSize = [alignCorners && newHeight > 1 ? newHeight - 1 : newHeight, alignCorners && newWidth > 1 ? newWidth - 1 : newWidth];\n\t  var effectiveRowSizeRatio = effectiveInputSize[0] / effectiveOutputSize[0];\n\t  var effectiveColSizeRatio = effectiveInputSize[1] / effectiveOutputSize[1];\n\t  var outputOffset = 0;\n\n\t  for (var b = 0; b < batch; b++) {\n\t    var batchOffset = b * imagesStrides[0];\n\n\t    for (var r = 0; r < newHeight; r++) {\n\t      var sourceFracRow = halfPixelCenters ? effectiveRowSizeRatio * (r + 0.5) : effectiveRowSizeRatio * r;\n\t      var sourceNearestRow = Math.min(oldHeight - 1, alignCorners ? Math.round(sourceFracRow) : Math.floor(sourceFracRow));\n\n\t      if (halfPixelCenters) {\n\t        sourceNearestRow = Math.max(0, sourceNearestRow);\n\t      }\n\n\t      var rowOffset = batchOffset + sourceNearestRow * imagesStrides[1];\n\n\t      for (var c = 0; c < newWidth; c++) {\n\t        var sourceFracCol = halfPixelCenters ? effectiveColSizeRatio * (c + 0.5) : effectiveColSizeRatio * c;\n\t        var sourceNearestCol = Math.min(oldWidth - 1, alignCorners ? Math.round(sourceFracCol) : Math.floor(sourceFracCol));\n\n\t        if (halfPixelCenters) {\n\t          sourceNearestCol = Math.max(0, sourceNearestCol);\n\t        }\n\n\t        var colOffset = rowOffset + sourceNearestCol * imagesStrides[2];\n\n\t        for (var d = 0; d < numChannels; d++) {\n\t          // Begin shader.\n\t          // Compute the fractional index of the source.\n\t          var newVal = xValues[colOffset + d];\n\t          output[outputOffset++] = newVal;\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo([batch, newHeight, newWidth, numChannels], images.dtype, output);\n\t}\n\tvar resizeNearestNeighborConfig = {\n\t  kernelName: ResizeNearestNeighbor,\n\t  backendName: 'cpu',\n\t  kernelFunc: resizeNearestNeighbor$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction resizeNearestNeighborGrad(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var images = inputs.images,\n\t      dy = inputs.dy;\n\t  var alignCorners = attrs.alignCorners;\n\t  assertNotComplex([dy, images], 'resizeNearestNeighborGrad');\n\t  var imagesStrides = computeStrides(images.shape);\n\t  var dyStrides = computeStrides(dy.shape);\n\t  var _images$shape = images.shape,\n\t      batch = _images$shape[0],\n\t      xHeight = _images$shape[1],\n\t      xWidth = _images$shape[2],\n\t      depth = _images$shape[3];\n\t  var _dy$shape = dy.shape,\n\t      yHeight = _dy$shape[1],\n\t      yWidth = _dy$shape[2];\n\t  var output = new Float32Array(batch * xHeight * xWidth * depth);\n\t  var dyValues = backend.data.get(dy.dataId).values; // In the backwards pass, we want to find the pixels that were generated\n\t  // for each pixel in the input image the forward pass\n\n\t  var effectiveXSize = [alignCorners && yHeight > 1 ? xHeight - 1 : xHeight, alignCorners && yWidth > 1 ? xWidth - 1 : xWidth];\n\t  var effectiveYSize = [alignCorners && yHeight > 1 ? yHeight - 1 : yHeight, alignCorners && yWidth > 1 ? yWidth - 1 : yWidth];\n\t  var heightScale = effectiveXSize[0] / effectiveYSize[0];\n\t  var widthScale = effectiveXSize[1] / effectiveYSize[1];\n\t  var invHeightScale = 1 / heightScale;\n\t  var invWidthScale = 1 / widthScale; // This defines the size of the window of values around a particular\n\t  // index in dy that we want to search for contributions to dx.\n\n\t  var winHeight = Math.ceil(invHeightScale) * 2 + 2;\n\t  var winWidth = Math.ceil(invWidthScale) * 2 + 2; // Loop over the output space.\n\n\t  for (var b = 0; b < batch; b++) {\n\t    var batchOffset = b * imagesStrides[0];\n\n\t    for (var r = 0; r < xHeight; r++) {\n\t      var rowOffset = batchOffset + r * imagesStrides[1]; // Compute bounds for where in dy we will look\n\n\t      var startRLerp = Math.floor(r * invHeightScale);\n\t      var startDyR = Math.floor(startRLerp - winHeight / 2);\n\n\t      for (var c = 0; c < xWidth; c++) {\n\t        var colOffset = rowOffset + c * imagesStrides[2]; // Compute bounds for where in dy we will look\n\n\t        var startCLerp = Math.floor(c * invWidthScale);\n\t        var startDyC = Math.floor(startCLerp - winWidth / 2);\n\n\t        for (var d = 0; d < depth; d++) {\n\t          var accum = 0; // loop over dy\n\n\t          for (var dyRIndex = 0; dyRIndex < winHeight; dyRIndex++) {\n\t            var dyR = dyRIndex + startDyR; // Guard against the window exceeding the bounds of dy\n\n\t            if (dyR < 0 || dyR >= yHeight) {\n\t              continue;\n\t            }\n\n\t            var dyROffset = batchOffset + dyR * dyStrides[1];\n\t            var sourceFracRow = dyR * heightScale;\n\t            var sourceNearestRow = Math.min(xHeight - 1, alignCorners ? Math.round(sourceFracRow) : Math.floor(sourceFracRow));\n\n\t            if (r !== sourceNearestRow) {\n\t              continue;\n\t            }\n\n\t            for (var dyCIndex = 0; dyCIndex < winWidth; dyCIndex++) {\n\t              var dyC = dyCIndex + startDyC; // Guard against the window exceeding the bounds of dy\n\n\t              if (dyC < 0 || dyC >= yWidth) {\n\t                continue;\n\t              }\n\n\t              var dyCOffset = dyROffset + dyC * dyStrides[2];\n\t              var sourceFracCol = dyC * widthScale;\n\t              var sourceNearestCol = Math.min(xWidth - 1, alignCorners ? Math.round(sourceFracCol) : Math.floor(sourceFracCol));\n\n\t              if (c === sourceNearestCol) {\n\t                accum += dyValues[dyCOffset + d];\n\t              }\n\t            }\n\t          }\n\n\t          output[colOffset + d] = accum;\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(images.shape, images.dtype, output);\n\t}\n\tvar resizeNearestNeighborGradConfig$1 = {\n\t  kernelName: ResizeNearestNeighborGrad,\n\t  backendName: 'cpu',\n\t  kernelFunc: resizeNearestNeighborGrad\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction reverse$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var dims = attrs.dims;\n\t  assertNotComplex(x, 'reverse');\n\t  var xRank = x.shape.length;\n\t  var $dims = parseAxisParam(dims, x.shape);\n\n\t  if (xRank === 0) {\n\t    return identity$1({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend\n\t    });\n\t  }\n\n\t  var outBuf = new TensorBuffer(x.shape, x.dtype);\n\t  var xBuf = backend.bufferSync(x);\n\n\t  var _loop = function _loop(i) {\n\t    var outLoc = outBuf.indexToLoc(i);\n\t    var inLoc = outLoc.slice();\n\t    $dims.forEach(function (d) {\n\t      return inLoc[d] = x.shape[d] - 1 - inLoc[d];\n\t    });\n\t    outBuf.set.apply(outBuf, [xBuf.get.apply(xBuf, inLoc)].concat(outLoc));\n\t  };\n\n\t  for (var i = 0; i < outBuf.size; i++) {\n\t    _loop(i);\n\t  }\n\n\t  return backend.makeTensorInfo(outBuf.shape, outBuf.dtype, outBuf.values);\n\t}\n\tvar reverseConfig = {\n\t  kernelName: Reverse,\n\t  backendName: 'cpu',\n\t  kernelFunc: reverse$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar rotateWithOffsetConfig = {\n\t  kernelName: RotateWithOffset,\n\t  backendName: 'cpu',\n\t  kernelFunc: function kernelFunc(_ref) {\n\t    var inputs = _ref.inputs,\n\t        attrs = _ref.attrs,\n\t        backend = _ref.backend;\n\t    var image = inputs.image;\n\t    var radians = attrs.radians,\n\t        fillValue = attrs.fillValue,\n\t        center = attrs.center;\n\t    var cpuBackend = backend;\n\t    var output = getTypedArrayFromDType(image.dtype, sizeFromShape(image.shape));\n\t    var _image$shape = image.shape,\n\t        batch = _image$shape[0],\n\t        imageHeight = _image$shape[1],\n\t        imageWidth = _image$shape[2],\n\t        numChannels = _image$shape[3];\n\n\t    var _backend_util$getImag = getImageCenter(center, imageHeight, imageWidth),\n\t        centerX = _backend_util$getImag[0],\n\t        centerY = _backend_util$getImag[1];\n\n\t    var fullOpacityValue = 255;\n\t    var sinFactor = Math.sin(radians);\n\t    var cosFactor = Math.cos(radians);\n\t    var imageVals = cpuBackend.data.get(image.dataId).values;\n\n\t    for (var batchIdx = 0; batchIdx < batch; batchIdx++) {\n\t      var batchOffset = batchIdx * imageWidth * imageHeight * numChannels;\n\n\t      for (var row = 0; row < imageHeight; row++) {\n\t        var rowOffset = row * (imageWidth * numChannels);\n\n\t        for (var col = 0; col < imageWidth; col++) {\n\t          var colOffset = col * numChannels;\n\n\t          for (var channel = 0; channel < numChannels; channel++) {\n\t            var coords = [batch, row, col, channel];\n\t            var x = coords[2];\n\t            var y = coords[1]; // coordX/coordY are the result of rotating and translating x/y.\n\n\t            var coordX = (x - centerX) * cosFactor - (y - centerY) * sinFactor;\n\t            var coordY = (x - centerX) * sinFactor + (y - centerY) * cosFactor;\n\t            coordX = Math.round(coordX + centerX);\n\t            coordY = Math.round(coordY + centerY);\n\t            var outputValue = fillValue;\n\n\t            if (typeof fillValue !== 'number') {\n\t              if (channel === 3) {\n\t                outputValue = fullOpacityValue;\n\t              } else {\n\t                outputValue = fillValue[channel];\n\t              }\n\t            } // If the coordinate position falls within the image boundaries...\n\n\n\t            if (coordX >= 0 && coordX < imageWidth && coordY >= 0 && coordY < imageHeight) {\n\t              // set the output to the image value at the coordinate position.\n\t              var rotatedRowOffset = coordY * (imageWidth * numChannels);\n\t              var rotatedColOffset = coordX * numChannels;\n\t              var imageIdx = batchOffset + rotatedRowOffset + rotatedColOffset + channel;\n\t              outputValue = imageVals[imageIdx];\n\t            }\n\n\t            var outIdx = batchOffset + rowOffset + colOffset + channel;\n\t            output[outIdx] = outputValue;\n\t          }\n\t        }\n\t      }\n\t    }\n\n\t    var dataId = cpuBackend.write(output, image.shape, image.dtype);\n\t    return {\n\t      dataId: dataId,\n\t      shape: image.shape,\n\t      dtype: image.dtype\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar round$2 = unaryKernelFunc(Round, function (xi) {\n\t  // The algorithm is based on banker's rounding.\n\t  var base = Math.floor(xi);\n\n\t  if (xi - base < 0.5) {\n\t    return Math.floor(xi);\n\t  } else if (xi - base > 0.5) {\n\t    return Math.ceil(xi);\n\t  } else {\n\t    if (base % 2.0 === 0.0) {\n\t      return base;\n\t    } else {\n\t      return base + 1.0;\n\t    }\n\t  }\n\t});\n\tvar roundConfig = {\n\t  kernelName: Round,\n\t  backendName: 'cpu',\n\t  kernelFunc: round$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction scatterImpl(indices, updates, shape, outputSize, sliceSize, numUpdates, sliceRank, strides, defaultValue, sumDupeIndices) {\n\t  var flattenShape = [outputSize / sliceSize, sliceSize];\n\t  var indicesData = indices.values;\n\t  var updatesData = updates.values;\n\n\t  if (outputSize === 0) {\n\t    return buffer(shape, updates.dtype);\n\t  }\n\n\t  var outBuf = buffer(flattenShape, updates.dtype);\n\t  outBuf.values.fill(defaultValue);\n\n\t  for (var i = 0; i < numUpdates; i++) {\n\t    var index = [];\n\t    var flattenIndex = 0;\n\n\t    for (var j = 0; j < sliceRank; j++) {\n\t      var dim = indicesData[i * sliceRank + j];\n\t      index.push(dim);\n\t      flattenIndex += dim * strides[j];\n\t    }\n\n\t    if (flattenIndex < 0 || flattenIndex >= outputSize / sliceSize) {\n\t      throw new Error(\"Invalid indices: \" + index + \" does not index into \" + shape);\n\t    }\n\n\t    for (var k = 0; k < sliceSize; k++) {\n\t      if (sumDupeIndices) {\n\t        outBuf.values[flattenIndex * sliceSize + k] += updatesData[i * sliceSize + k];\n\t      } else {\n\t        outBuf.values[flattenIndex * sliceSize + k] = updates.rank === 0 ? updatesData[0] : updatesData[i * sliceSize + k];\n\t      }\n\t    }\n\t  }\n\n\t  return outBuf;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction scatterNd(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var indices = inputs.indices,\n\t      updates = inputs.updates;\n\t  var shape = attrs.shape;\n\n\t  var _backend_util$calcula = calculateShapes(updates, indices, shape),\n\t      sliceRank = _backend_util$calcula.sliceRank,\n\t      numUpdates = _backend_util$calcula.numUpdates,\n\t      sliceSize = _backend_util$calcula.sliceSize,\n\t      strides = _backend_util$calcula.strides,\n\t      outputSize = _backend_util$calcula.outputSize;\n\n\t  var sumDupeIndices = true;\n\t  var indicesBuf = backend.bufferSync(indices);\n\t  var updatesBuf = backend.bufferSync(updates);\n\t  var outBuf = scatterImpl(indicesBuf, updatesBuf, shape, outputSize, sliceSize, numUpdates, sliceRank, strides, 0\n\t  /* defaultValue */\n\t  , sumDupeIndices);\n\t  return backend.makeTensorInfo(shape, outBuf.dtype, outBuf.values);\n\t}\n\tvar scatterNdConfig = {\n\t  kernelName: ScatterNd,\n\t  backendName: 'cpu',\n\t  kernelFunc: scatterNd\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction select(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var condition = inputs.condition,\n\t      t = inputs.t,\n\t      e = inputs.e;\n\t  assertNotComplex([condition, t, e], 'select');\n\t  var conditionRank = condition.shape.length;\n\t  var values = backend.data.get(condition.dataId).values;\n\t  var tValues = backend.data.get(t.dataId).values;\n\t  var eValues = backend.data.get(e.dataId).values;\n\t  var resultDtype = upcastType(t.dtype, e.dtype);\n\t  var newValues = makeZerosTypedArray(sizeFromShape(t.shape), resultDtype);\n\t  var index = 0;\n\t  var offset = conditionRank === 0 || conditionRank > 1 || t.shape.length === 1 ? 1 : sizeFromShape(t.shape.slice(1));\n\n\t  for (var i = 0; i < values.length; i++) {\n\t    for (var j = 0; j < offset; j++) {\n\t      if (values[i] === 1) {\n\t        newValues[index++] = tValues[i];\n\t      } else {\n\t        newValues[index++] = eValues[i];\n\t      }\n\t    }\n\t  }\n\n\t  return backend.makeTensorInfo(t.shape, resultDtype, newValues);\n\t}\n\tvar selectConfig = {\n\t  kernelName: Select,\n\t  backendName: 'cpu',\n\t  kernelFunc: select\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar scaleAlpha = SELU_SCALEALPHA;\n\tvar scale = SELU_SCALE;\n\tvar selu$1 = unaryKernelFunc(Selu, function (xi) {\n\t  if (xi >= 0) {\n\t    return scale * xi;\n\t  } else {\n\t    return scaleAlpha * (Math.exp(xi) - 1);\n\t  }\n\t});\n\tvar seluConfig = {\n\t  kernelName: Selu,\n\t  backendName: 'cpu',\n\t  kernelFunc: selu$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar sigmoid$1 = unaryKernelFunc(Sigmoid, function (xi) {\n\t  return 1 / (1 + Math.exp(-xi));\n\t});\n\tvar sigmoidConfig = {\n\t  kernelName: Sigmoid,\n\t  backendName: 'cpu',\n\t  kernelFunc: sigmoid$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar sign$2 = unaryKernelFunc(Sign, function (xi) {\n\t  if (xi < 0) {\n\t    return -1;\n\t  } else if (xi > 0) {\n\t    return 1;\n\t  } else {\n\t    return 0;\n\t  }\n\t});\n\tvar signConfig = {\n\t  kernelName: Sign,\n\t  backendName: 'cpu',\n\t  kernelFunc: sign$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar sin$1 = unaryKernelFunc(Sin, function (xi) {\n\t  return Math.sin(xi);\n\t});\n\tvar sinConfig = {\n\t  kernelName: Sin,\n\t  backendName: 'cpu',\n\t  kernelFunc: sin$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar sinh$1 = unaryKernelFunc(Sinh, function (xi) {\n\t  return Math.sinh(xi);\n\t});\n\tvar sinhConfig = {\n\t  kernelName: Sinh,\n\t  backendName: 'cpu',\n\t  kernelFunc: sinh$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t// epsilon is the difference between 1.0 and the next representable float.\n\t// For a single precision 32 bit float this should be 2^-23, see:\n\t// https://math.byu.edu/~schow/work/IEEEFloatingPoint.htm\n\n\tvar epsilon$1 = 1.1920928955078125e-7;\n\tvar threshold = Math.log(epsilon$1) + 2.0;\n\tvar softplus$1 = unaryKernelFunc(Softplus, function (xi) {\n\t  // Value above which exp(x) may overflow, but softplus(x) == x\n\t  // is within machine epsilon.\n\t  var tooLarge = xi > -threshold; // Value below which exp(x) may underflow, but softplus(x) == exp(x)\n\t  // is within machine epsilon.\n\n\t  var tooSmall = xi < threshold;\n\t  var expX = Math.exp(xi);\n\t  var result;\n\n\t  if (tooSmall) {\n\t    result = expX;\n\t  } else if (tooLarge) {\n\t    result = xi;\n\t  } else {\n\t    result = Math.log(1.0 + expX);\n\t  }\n\n\t  return result;\n\t});\n\tvar softplusConfig = {\n\t  kernelName: Softplus,\n\t  backendName: 'cpu',\n\t  kernelFunc: softplus$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction spaceToBatchND$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var blockShape = attrs.blockShape,\n\t      paddings = attrs.paddings;\n\t  assertNotComplex([x], 'spaceToBatchND');\n\t  var prod = sizeFromShape(blockShape);\n\t  var completePaddings = [[0, 0]];\n\t  completePaddings.push.apply(completePaddings, paddings);\n\n\t  for (var i = 1 + blockShape.length; i < x.shape.length; ++i) {\n\t    completePaddings.push([0, 0]);\n\t  }\n\n\t  var paddedX = padV2Config.kernelFunc({\n\t    inputs: {\n\t      x: x\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      paddings: completePaddings,\n\t      constantValue: 0\n\t    }\n\t  });\n\t  var reshapedPaddedShape = getReshaped(paddedX.shape, blockShape, prod, false);\n\t  var permutedReshapedPaddedPermutation = getPermuted(reshapedPaddedShape.length, blockShape.length, false);\n\t  var flattenShape = getReshapedPermuted(paddedX.shape, blockShape, prod, false);\n\t  var reshapeInputs = {\n\t    x: paddedX\n\t  };\n\t  var reshapeAttrs = {\n\t    shape: reshapedPaddedShape\n\t  };\n\t  var paddedXReshaped = reshape$2({\n\t    inputs: reshapeInputs,\n\t    backend: backend,\n\t    attrs: reshapeAttrs\n\t  });\n\t  var transposeInputs = {\n\t    x: paddedXReshaped\n\t  };\n\t  var transposeAttrs = {\n\t    perm: permutedReshapedPaddedPermutation\n\t  };\n\t  var paddedXT = transpose$1({\n\t    inputs: transposeInputs,\n\t    backend: backend,\n\t    attrs: transposeAttrs\n\t  });\n\t  var resultReshapeInputs = {\n\t    x: paddedXT\n\t  };\n\t  var resultReshapeAttrs = {\n\t    shape: flattenShape\n\t  };\n\t  var result = reshape$2({\n\t    inputs: resultReshapeInputs,\n\t    backend: backend,\n\t    attrs: resultReshapeAttrs\n\t  });\n\t  backend.disposeIntermediateTensorInfo(paddedX);\n\t  backend.disposeIntermediateTensorInfo(paddedXReshaped);\n\t  backend.disposeIntermediateTensorInfo(paddedXT);\n\t  return result;\n\t}\n\tvar spaceToBatchNDConfig = {\n\t  kernelName: SpaceToBatchND,\n\t  backendName: 'cpu',\n\t  kernelFunc: spaceToBatchND$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction sparseToDense$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var sparseIndices = inputs.sparseIndices,\n\t      sparseValues = inputs.sparseValues,\n\t      defaultValue = inputs.defaultValue;\n\t  var outputShape = attrs.outputShape;\n\n\t  var _backend_util$calcula = calculateShapes(sparseValues, sparseIndices, outputShape),\n\t      sliceRank = _backend_util$calcula.sliceRank,\n\t      numUpdates = _backend_util$calcula.numUpdates,\n\t      sliceSize = _backend_util$calcula.sliceSize,\n\t      strides = _backend_util$calcula.strides,\n\t      outputSize = _backend_util$calcula.outputSize;\n\n\t  var sumDupeIndices = false;\n\t  var indicesBuf = backend.bufferSync(sparseIndices);\n\t  var updatesBuf = backend.bufferSync(sparseValues);\n\t  var $defaultValue = backend.data.get(defaultValue.dataId).values[0];\n\t  var outBuf = scatterImpl(indicesBuf, updatesBuf, outputShape, outputSize, sliceSize, numUpdates, sliceRank, strides, $defaultValue, sumDupeIndices);\n\t  return backend.makeTensorInfo(outputShape, outBuf.dtype, outBuf.values);\n\t}\n\tvar sparseToDenseConfig = {\n\t  kernelName: SparseToDense,\n\t  backendName: 'cpu',\n\t  kernelFunc: sparseToDense$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction splitV(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var numOrSizeSplits = attrs.numOrSizeSplits,\n\t      axis = attrs.axis;\n\t  var $axis = parseAxisParam(axis, x.shape)[0];\n\t  var splitSizes = prepareSplitSize(x, numOrSizeSplits, $axis);\n\t  var begin = new Array(x.shape.length).fill(0);\n\t  var size = x.shape.slice();\n\t  return splitSizes.map(function (s) {\n\t    var sliceSize = [].concat(size);\n\t    sliceSize[$axis] = s;\n\t    var sliceT = slice$3({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        begin: begin,\n\t        size: sliceSize\n\t      }\n\t    });\n\t    begin[$axis] += s;\n\t    return sliceT;\n\t  });\n\t}\n\tvar splitVConfig = {\n\t  kernelName: SplitV,\n\t  backendName: 'cpu',\n\t  kernelFunc: splitV\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar sqrt$4 = unaryKernelFunc(Sqrt, function (xi) {\n\t  return Math.sqrt(xi);\n\t});\n\tvar sqrtConfig = {\n\t  kernelName: Sqrt,\n\t  backendName: 'cpu',\n\t  kernelFunc: sqrt$4\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar squareConfig = {\n\t  kernelName: Square,\n\t  backendName: 'cpu',\n\t  kernelFunc: function kernelFunc(_ref) {\n\t    var inputs = _ref.inputs,\n\t        backend = _ref.backend;\n\t    var x = inputs.x;\n\t    var cpuBackend = backend;\n\t    assertNotComplex(x, 'square');\n\t    var values = cpuBackend.data.get(x.dataId).values;\n\t    var newValues = new Float32Array(values.length);\n\n\t    for (var i = 0; i < values.length; ++i) {\n\t      var value = values[i];\n\t      newValues[i] = value * value;\n\t    }\n\n\t    var dataId = cpuBackend.write(newValues, x.shape, x.dtype);\n\t    return {\n\t      dataId: dataId,\n\t      shape: x.shape,\n\t      dtype: x.dtype\n\t    };\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar step$1 = unaryKernelFunc(Step, function (xi, attrs) {\n\t  var stepAttrs = attrs;\n\n\t  if (isNaN(xi)) {\n\t    return NaN;\n\t  } else {\n\t    return xi > 0 ? 1 : stepAttrs.alpha;\n\t  }\n\t});\n\tvar stepConfig = {\n\t  kernelName: Step,\n\t  backendName: 'cpu',\n\t  kernelFunc: step$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction stridedSlice$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var begin = attrs.begin,\n\t      end = attrs.end,\n\t      strides = attrs.strides,\n\t      beginMask = attrs.beginMask,\n\t      endMask = attrs.endMask,\n\t      ellipsisMask = attrs.ellipsisMask,\n\t      newAxisMask = attrs.newAxisMask,\n\t      shrinkAxisMask = attrs.shrinkAxisMask;\n\t  assertNotComplex(x, 'stridedSlice');\n\n\t  var _slice_util$sliceInfo = sliceInfo(x.shape, begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask),\n\t      nonStrided = _slice_util$sliceInfo.nonStrided,\n\t      $begin = _slice_util$sliceInfo.$begin,\n\t      $strides = _slice_util$sliceInfo.$strides,\n\t      size = _slice_util$sliceInfo.size,\n\t      newShape = _slice_util$sliceInfo.newShape,\n\t      outShape = _slice_util$sliceInfo.outShape;\n\n\t  var $x = reshape$2({\n\t    inputs: {\n\t      x: x\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: newShape\n\t    }\n\t  });\n\t  var result;\n\n\t  if (nonStrided) {\n\t    var sliced = slice$3({\n\t      inputs: {\n\t        x: $x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        begin: $begin,\n\t        size: size\n\t      }\n\t    });\n\t    result = reshape$2({\n\t      inputs: {\n\t        x: sliced\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: outShape\n\t      }\n\t    });\n\t    backend.disposeIntermediateTensorInfo(sliced);\n\t  } else if (outShape.some(function (axis) {\n\t    return axis === 0;\n\t  })) {\n\t    result = backend.makeTensorInfo(outShape, x.dtype, []);\n\t  } else {\n\t    var xBuf = backend.bufferSync($x);\n\t    var outBuf = stridedSliceImpl(outShape, xBuf, $strides, $begin);\n\t    result = backend.makeTensorInfo(outBuf.shape, outBuf.dtype, outBuf.values);\n\t  }\n\n\t  var resultReshaped = reshape$2({\n\t    inputs: {\n\t      x: result\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: outShape\n\t    }\n\t  });\n\t  backend.disposeIntermediateTensorInfo($x);\n\t  backend.disposeIntermediateTensorInfo(result);\n\t  return resultReshaped;\n\t}\n\tvar stridedSliceConfig = {\n\t  kernelName: StridedSlice,\n\t  backendName: 'cpu',\n\t  kernelFunc: stridedSlice$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar tan$1 = unaryKernelFunc(Tan, function (xi) {\n\t  return Math.tan(xi);\n\t});\n\tvar tanConfig = {\n\t  kernelName: Tan,\n\t  backendName: 'cpu',\n\t  kernelFunc: tan$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar tanh$2 = unaryKernelFunc(Tanh, function (xi) {\n\t  return Math.tanh(xi);\n\t});\n\tvar tanhConfig = {\n\t  kernelName: Tanh,\n\t  backendName: 'cpu',\n\t  kernelFunc: tanh$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction tile$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var reps = attrs.reps;\n\t  assertNotComplex(x, 'tile');\n\t  var outBuf = tileImpl(backend.bufferSync(x), reps);\n\t  return backend.makeTensorInfo(outBuf.shape, outBuf.dtype, outBuf.values);\n\t}\n\tvar tileConfig = {\n\t  kernelName: Tile,\n\t  backendName: 'cpu',\n\t  kernelFunc: tile$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction topK(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var k = attrs.k,\n\t      sorted = attrs.sorted;\n\t  assertNotComplex(x, 'topk');\n\t  var xVals = backend.data.get(x.dataId).values;\n\n\t  var _topKImpl = topKImpl(xVals, x.shape, x.dtype, k, sorted),\n\t      allTopKVals = _topKImpl[0],\n\t      allTopKIndices = _topKImpl[1];\n\n\t  return [backend.makeTensorInfo(allTopKVals.shape, allTopKVals.dtype, allTopKVals.values), backend.makeTensorInfo(allTopKIndices.shape, allTopKIndices.dtype, allTopKIndices.values)];\n\t}\n\tvar topKConfig = {\n\t  kernelName: TopK,\n\t  backendName: 'cpu',\n\t  kernelFunc: topK\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction unique$2(args) {\n\t  var inputs = args.inputs,\n\t      attrs = args.attrs,\n\t      backend = args.backend;\n\t  var axis = attrs.axis;\n\t  var x = inputs.x;\n\t  assertNotComplex(x, 'unique');\n\t  var values = backend.data.get(x.dataId).values;\n\n\t  var _uniqueImpl = uniqueImpl(values, axis, x.shape, x.dtype),\n\t      outputValues = _uniqueImpl.outputValues,\n\t      outputShape = _uniqueImpl.outputShape,\n\t      indices = _uniqueImpl.indices;\n\n\t  return [backend.makeTensorInfo(outputShape, x.dtype, outputValues), backend.makeTensorInfo([indices.length], 'int32', indices)];\n\t}\n\tvar uniqueConfig = {\n\t  kernelName: Unique,\n\t  backendName: 'cpu',\n\t  kernelFunc: unique$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction unpack$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var value = inputs.value;\n\t  var axis = attrs.axis;\n\n\t  if (axis < 0) {\n\t    axis += value.shape.length;\n\t  }\n\n\t  var valueRank = value.shape.length;\n\t  var num = value.shape[axis];\n\t  var outShape = new Array(valueRank - 1);\n\t  var outIndex = 0;\n\n\t  for (var i = 0; i < valueRank; i++) {\n\t    if (i !== axis) {\n\t      outShape[outIndex++] = value.shape[i];\n\t    }\n\t  }\n\n\t  var begin = new Array(valueRank).fill(0);\n\t  var size = value.shape.slice();\n\t  size[axis] = 1;\n\t  var res = new Array(num);\n\n\t  for (var _i = 0; _i < res.length; _i++) {\n\t    begin[axis] = _i;\n\t    var tempRes = slice$3({\n\t      inputs: {\n\t        x: value\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        begin: begin,\n\t        size: size\n\t      }\n\t    });\n\t    res[_i] = reshape$2({\n\t      inputs: {\n\t        x: tempRes\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: outShape\n\t      }\n\t    });\n\t    backend.disposeIntermediateTensorInfo(tempRes);\n\t  }\n\n\t  return res;\n\t}\n\tvar unpackConfig = {\n\t  kernelName: Unpack,\n\t  backendName: 'cpu',\n\t  kernelFunc: unpack$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction unsortedSegmentSum$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      segmentIds = inputs.segmentIds;\n\t  var numSegments = attrs.numSegments;\n\t  assertNotComplex(x, 'unsortedSegmentSum');\n\t  var xRank = x.shape.length;\n\t  var segmentIdsRank = segmentIds.shape.length;\n\t  var res = [];\n\t  var intermediates = []; // Reshape the segment id's so that they can be broadcast with\n\t  // x. The new shape should be [segmentIds.shape, 1, ..., 1]\n\n\t  var numIters = xRank - segmentIdsRank;\n\t  var $segmentIds = segmentIds;\n\n\t  for (var i = 0; i < numIters; ++i) {\n\t    var expanded = expandDims$2({\n\t      inputs: {\n\t        input: $segmentIds\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        dim: i + 1\n\t      }\n\t    });\n\t    $segmentIds = expanded;\n\t    intermediates.push(expanded);\n\t  }\n\n\t  for (var _i = 0; _i < numSegments; ++_i) {\n\t    var scalarValue = createScalarValue(_i, 'int32');\n\t    var segmentId = backend.makeTensorInfo([], 'int32', scalarValue);\n\t    var mask = equal$1({\n\t      inputs: {\n\t        a: segmentId,\n\t        b: $segmentIds\n\t      },\n\t      backend: backend\n\t    });\n\t    var maskCasted = cast$2({\n\t      inputs: {\n\t        x: mask\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        dtype: 'float32'\n\t      }\n\t    });\n\t    var mul = multiply$2({\n\t      inputs: {\n\t        a: maskCasted,\n\t        b: x\n\t      },\n\t      backend: backend\n\t    });\n\t    var sumTensorInfo = sum$3({\n\t      inputs: {\n\t        x: mul\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        axis: 0,\n\t        keepDims: false\n\t      }\n\t    });\n\t    res.push(sumTensorInfo);\n\t    intermediates.push(segmentId);\n\t    intermediates.push(mask);\n\t    intermediates.push(maskCasted);\n\t    intermediates.push(mul);\n\t    intermediates.push(sumTensorInfo);\n\t  }\n\n\t  var result = pack$1({\n\t    inputs: res,\n\t    backend: backend,\n\t    attrs: {\n\t      axis: 0\n\t    }\n\t  });\n\t  intermediates.forEach(function (t) {\n\t    return backend.disposeIntermediateTensorInfo(t);\n\t  });\n\t  return result;\n\t}\n\tvar unsortedSegmentSumConfig = {\n\t  kernelName: UnsortedSegmentSum,\n\t  backendName: 'cpu',\n\t  kernelFunc: unsortedSegmentSum$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tvar kernelConfigs = [_fusedMatMulConfig, absConfig, acosConfig, acoshConfig, addConfig, addNConfig, allConfig, anyConfig, argMaxConfig, argMinConfig, asinConfig, asinhConfig, atanConfig, atan2Config, atanhConfig, avgPoolConfig, avgPool3DConfig, avgPool3DGradConfig$1, avgPoolGradConfig$1, batchMatMulConfig, batchNormConfig, batchToSpaceNDConfig, bincountConfig, castConfig, ceilConfig, clipConfig, complexConfig, complexAbsConfig, concatConfig, conv2DBackpropFilterConfig, conv2DBackpropInputConfig, conv2DConfig, conv3DBackpropFilterV2Config, conv3DBackpropInputV2Config, conv3DConfig, cosConfig, coshConfig, cropAndResizeConfig, cumsumConfig, denseBincountConfig, depthToSpaceConfig, depthwiseConv2dNativeConfig, depthwiseConv2dNativeBackpropFilterConfig, depthwiseConv2dNativeBackpropInputConfig, diagConfig, dilation2dConfig, dilation2dBackpropInputConfig, dilation2dBackpropFilterConfig, realDivConfig, eluConfig, eluGradConfig$1, equalConfig, erfConfig, expConfig, expandDimsConfig, expm1Config, fftConfig, fillConfig, flipLeftRightConfig, floorConfig, floorDivConfig, fusedConv2DConfig, fusedDepthwiseConv2DConfig, gatherNdConfig, gatherV2Config, greaterConfig, greaterEqualConfig, identityConfig, ifftConfig, imagConfig, isFiniteConfig, isInfConfig, isNaNConfig, leakyReluConfig, lessConfig, lessEqualConfig, linSpaceConfig, logConfig, log1pConfig, logicalAndConfig, logicalNotConfig, logicalOrConfig, lRNConfig, lRNGradConfig, maximumConfig, maxPoolConfig, maxPool3DConfig, maxPool3DGradConfig$1, maxPoolGradConfig$1, maxPoolWithArgmaxConfig, maxConfig, meanConfig, minConfig, minimumConfig, mirrorPadConfig, modConfig, multinomialConfig, multiplyConfig, negConfig, nonMaxSuppressionV3Config, nonMaxSuppressionV4Config, nonMaxSuppressionV5Config, notEqualConfig, oneHotConfig, onesLikeConfig, packConfig, padV2Config, powConfig, preluConfig, prodConfig, rangeConfig, realConfig, reciprocalConfig, reluConfig, relu6Config, reshapeConfig, resizeBilinearConfig, resizeBilinearGradConfig$1, resizeNearestNeighborConfig, resizeNearestNeighborGradConfig$1, reverseConfig, rotateWithOffsetConfig, roundConfig, rsqrtConfig, scatterNdConfig, selectConfig, seluConfig, sigmoidConfig, signConfig, sinConfig, sinhConfig, sliceConfig, softmaxConfig, softplusConfig, spaceToBatchNDConfig, sparseToDenseConfig, splitVConfig, sqrtConfig, squareConfig, squaredDifferenceConfig, stepConfig, stridedSliceConfig, subConfig, sumConfig, tanConfig, tanhConfig, tileConfig, topKConfig, transposeConfig, uniqueConfig, unpackConfig, unsortedSegmentSumConfig, zerosLikeConfig];\n\n\tfor (var _i$1 = 0, _kernelConfigs = kernelConfigs; _i$1 < _kernelConfigs.length; _i$1++) {\n\t  var kernelConfig = _kernelConfigs[_i$1];\n\t  registerKernel(kernelConfig);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar contexts = {};\n\tvar WEBGL_ATTRIBUTES = {\n\t  alpha: false,\n\t  antialias: false,\n\t  premultipliedAlpha: false,\n\t  preserveDrawingBuffer: false,\n\t  depth: false,\n\t  stencil: false,\n\t  failIfMajorPerformanceCaveat: true\n\t};\n\tfunction clearWebGLContext(webGLVersion) {\n\t  delete contexts[webGLVersion];\n\t}\n\tfunction setWebGLContext(webGLVersion, gl) {\n\t  contexts[webGLVersion] = gl;\n\t}\n\tfunction getWebGLContext(webGLVersion) {\n\t  if (!(webGLVersion in contexts)) {\n\t    var newCtx = getWebGLRenderingContext(webGLVersion);\n\n\t    if (newCtx !== null) {\n\t      contexts[webGLVersion] = newCtx;\n\t    } else {\n\t      console.log('Could not get context for WebGL version', webGLVersion);\n\t      return null;\n\t    }\n\t  }\n\n\t  var gl = contexts[webGLVersion];\n\n\t  if (gl.isContextLost()) {\n\t    delete contexts[webGLVersion];\n\t    return getWebGLContext(webGLVersion);\n\t  }\n\n\t  gl.disable(gl.DEPTH_TEST);\n\t  gl.disable(gl.STENCIL_TEST);\n\t  gl.disable(gl.BLEND);\n\t  gl.disable(gl.DITHER);\n\t  gl.disable(gl.POLYGON_OFFSET_FILL);\n\t  gl.disable(gl.SAMPLE_COVERAGE);\n\t  gl.enable(gl.SCISSOR_TEST);\n\t  gl.enable(gl.CULL_FACE);\n\t  gl.cullFace(gl.BACK);\n\t  return contexts[webGLVersion];\n\t}\n\n\tfunction createCanvas(webGLVersion) {\n\t  if (typeof OffscreenCanvas !== 'undefined' && webGLVersion === 2) {\n\t    return new OffscreenCanvas(300, 150);\n\t  } else if (typeof document !== 'undefined') {\n\t    return document.createElement('canvas');\n\t  } else {\n\t    throw new Error('Cannot create a canvas in this context');\n\t  }\n\t}\n\n\tfunction getWebGLRenderingContext(webGLVersion) {\n\t  if (webGLVersion !== 1 && webGLVersion !== 2) {\n\t    throw new Error('Cannot get WebGL rendering context, WebGL is disabled.');\n\t  }\n\n\t  var canvas = createCanvas(webGLVersion);\n\t  canvas.addEventListener('webglcontextlost', function (ev) {\n\t    ev.preventDefault();\n\t    delete contexts[webGLVersion];\n\t  }, false);\n\n\t  if (webGLVersion === 1) {\n\t    return canvas.getContext('webgl', WEBGL_ATTRIBUTES) || canvas.getContext('experimental-webgl', WEBGL_ATTRIBUTES);\n\t  }\n\n\t  return canvas.getContext('webgl2', WEBGL_ATTRIBUTES);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar PackingScheme;\n\n\t(function (PackingScheme) {\n\t  /**\n\t   * All values in a single texel are densely packed without any constraints.\n\t   *\n\t   * This is how the shader encodes a tensor with shape = [2, 3, 4]\n\t   * (indices are [batch, row, col]).\n\t   *\n\t   * 000|001   010|011   020|021\n\t   * -------   -------   -------\n\t   * 002|003   012|013   022|023\n\t   *\n\t   * 100|101   110|111   120|121\n\t   * -------   -------   -------\n\t   * 102|103   112|113   122|123\n\t   *\n\t   */\n\t  PackingScheme[PackingScheme[\"DENSE\"] = 0] = \"DENSE\";\n\t  /**\n\t   * Single texels contain only values from the same batch, and from adjacent\n\t   * rows and columns.\n\t   *\n\t   * This is how the shader encodes a tensor with shape = [2, 3, 5]\n\t   * (indices are [batch, row, col]).\n\t   *\n\t   * 000|001   002|003   004|xxx   020|021   022|023   024|xxx\n\t   * -------   -------   -------   -------   -------   -------\n\t   * 010|011   012|013   014|xxx   xxx|xxx   xxx|xxx   xxx|xxx\n\t   *\n\t   * 100|101   102|103   104|xxx   120|121   122|123   124|xxx\n\t   * -------   -------   -------   -------   -------   -------\n\t   * 110|111   112|113   114|xxx   xxx|xxx   xxx|xxx   xxx|xxx\n\t   *\n\t   */\n\n\t  PackingScheme[PackingScheme[\"SHARED_BATCH\"] = 1] = \"SHARED_BATCH\";\n\t})(PackingScheme || (PackingScheme = {}));\n\n\tvar TextureUsage;\n\n\t(function (TextureUsage) {\n\t  TextureUsage[TextureUsage[\"RENDER\"] = 0] = \"RENDER\";\n\t  TextureUsage[TextureUsage[\"UPLOAD\"] = 1] = \"UPLOAD\";\n\t  TextureUsage[TextureUsage[\"PIXELS\"] = 2] = \"PIXELS\";\n\t  TextureUsage[TextureUsage[\"DOWNLOAD\"] = 3] = \"DOWNLOAD\";\n\t})(TextureUsage || (TextureUsage = {}));\n\n\tvar PhysicalTextureType;\n\n\t(function (PhysicalTextureType) {\n\t  PhysicalTextureType[PhysicalTextureType[\"UNPACKED_FLOAT16\"] = 0] = \"UNPACKED_FLOAT16\";\n\t  PhysicalTextureType[PhysicalTextureType[\"UNPACKED_FLOAT32\"] = 1] = \"UNPACKED_FLOAT32\";\n\t  PhysicalTextureType[PhysicalTextureType[\"PACKED_4X1_UNSIGNED_BYTE\"] = 2] = \"PACKED_4X1_UNSIGNED_BYTE\";\n\t  PhysicalTextureType[PhysicalTextureType[\"PACKED_2X2_FLOAT32\"] = 3] = \"PACKED_2X2_FLOAT32\";\n\t  PhysicalTextureType[PhysicalTextureType[\"PACKED_2X2_FLOAT16\"] = 4] = \"PACKED_2X2_FLOAT16\";\n\t})(PhysicalTextureType || (PhysicalTextureType = {}));\n\n\tfunction getUnpackedMatrixTextureShapeWidthHeight(rows, columns) {\n\t  return [columns, rows];\n\t}\n\tfunction getUnpackedArraySizeFromMatrixSize(matrixSize, channelsPerTexture) {\n\t  return matrixSize * channelsPerTexture;\n\t}\n\tfunction getColorMatrixTextureShapeWidthHeight(rows, columns) {\n\t  return [columns * 4, rows];\n\t}\n\t/**\n\t * Get shape for densely packed RGBA texture.\n\t */\n\n\tfunction getDenseTexShape(shape) {\n\t  var size = sizeFromShape(shape);\n\t  var texelsNeeded = Math.ceil(size / 4);\n\t  return sizeToSquarishShape(texelsNeeded);\n\t}\n\tfunction getMatrixSizeFromUnpackedArraySize(unpackedSize, channelsPerTexture) {\n\t  if (unpackedSize % channelsPerTexture !== 0) {\n\t    throw new Error(\"unpackedSize (\" + unpackedSize + \") must be a multiple of \" + (\"\" + channelsPerTexture));\n\t  }\n\n\t  return unpackedSize / channelsPerTexture;\n\t}\n\tfunction decodeMatrixFromUnpackedColorRGBAArray(unpackedArray, matrix, channels) {\n\t  var requiredSize = unpackedArray.length * channels / 4;\n\n\t  if (matrix.length < requiredSize) {\n\t    throw new Error(\"matrix length (\" + matrix.length + \") must be >= \" + requiredSize);\n\t  }\n\n\t  var dst = 0;\n\n\t  for (var src = 0; src < unpackedArray.length; src += 4) {\n\t    for (var c = 0; c < channels; c++) {\n\t      matrix[dst++] = unpackedArray[src + c];\n\t    }\n\t  }\n\t}\n\tfunction getPackedMatrixTextureShapeWidthHeight(rows, columns) {\n\t  return [Math.max(1, Math.ceil(columns / 2)), Math.max(1, Math.ceil(rows / 2))];\n\t}\n\tfunction getPackedRGBAArraySizeFromMatrixShape(rows, columns) {\n\t  var _getPackedMatrixTextu = getPackedMatrixTextureShapeWidthHeight(rows, columns),\n\t      w = _getPackedMatrixTextu[0],\n\t      h = _getPackedMatrixTextu[1];\n\n\t  return w * h * 4;\n\t}\n\tfunction getTextureConfig( // tslint:disable-next-line:no-any\n\tgl, textureHalfFloatExtension) {\n\t  // tslint:disable-next-line:no-any\n\t  var glany = gl;\n\t  var internalFormatFloat;\n\t  var internalFormatHalfFloat;\n\t  var internalFormatPackedHalfFloat;\n\t  var internalFormatPackedFloat;\n\t  var textureFormatFloat;\n\t  var downloadTextureFormat;\n\t  var downloadUnpackNumChannels;\n\t  var defaultNumChannels;\n\t  var textureTypeHalfFloat;\n\t  var textureTypeFloat;\n\n\t  if (env().getNumber('WEBGL_VERSION') === 2) {\n\t    internalFormatFloat = glany.R32F;\n\t    internalFormatHalfFloat = glany.R16F;\n\t    internalFormatPackedHalfFloat = glany.RGBA16F;\n\t    internalFormatPackedFloat = glany.RGBA32F;\n\t    textureFormatFloat = glany.RED;\n\t    downloadUnpackNumChannels = 4;\n\t    defaultNumChannels = 1;\n\t    textureTypeHalfFloat = glany.HALF_FLOAT;\n\t    textureTypeFloat = glany.FLOAT;\n\t  } else {\n\t    internalFormatFloat = gl.RGBA;\n\t    internalFormatHalfFloat = gl.RGBA;\n\t    internalFormatPackedHalfFloat = gl.RGBA;\n\t    internalFormatPackedFloat = glany.RGBA;\n\t    textureFormatFloat = gl.RGBA;\n\t    downloadUnpackNumChannels = 4;\n\t    defaultNumChannels = 4;\n\t    textureTypeHalfFloat = textureHalfFloatExtension != null ? textureHalfFloatExtension.HALF_FLOAT_OES : null;\n\t    textureTypeFloat = gl.FLOAT;\n\t  }\n\n\t  downloadTextureFormat = gl.RGBA;\n\t  return {\n\t    internalFormatFloat: internalFormatFloat,\n\t    internalFormatHalfFloat: internalFormatHalfFloat,\n\t    internalFormatPackedHalfFloat: internalFormatPackedHalfFloat,\n\t    internalFormatPackedFloat: internalFormatPackedFloat,\n\t    textureFormatFloat: textureFormatFloat,\n\t    downloadTextureFormat: downloadTextureFormat,\n\t    downloadUnpackNumChannels: downloadUnpackNumChannels,\n\t    defaultNumChannels: defaultNumChannels,\n\t    textureTypeHalfFloat: textureTypeHalfFloat,\n\t    textureTypeFloat: textureTypeFloat\n\t  };\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction callAndCheck(gl, func) {\n\t  var returnValue = func();\n\n\t  if (env().getBool('DEBUG')) {\n\t    checkWebGLError(gl);\n\t  }\n\n\t  return returnValue;\n\t}\n\n\tfunction checkWebGLError(gl) {\n\t  var error = gl.getError();\n\n\t  if (error !== gl.NO_ERROR) {\n\t    throw new Error('WebGL Error: ' + getWebGLErrorMessage(gl, error));\n\t  }\n\t} // https://en.wikipedia.org/wiki/Half-precision_floating-point_format\n\n\n\tvar MIN_FLOAT16 = 5.96e-8;\n\tvar MAX_FLOAT16 = 65504;\n\tfunction canBeRepresented(num) {\n\t  if (env().getBool('WEBGL_RENDER_FLOAT32_ENABLED') || num === 0 || MIN_FLOAT16 < Math.abs(num) && Math.abs(num) < MAX_FLOAT16) {\n\t    return true;\n\t  }\n\n\t  return false;\n\t}\n\tfunction getWebGLErrorMessage(gl, status) {\n\t  switch (status) {\n\t    case gl.NO_ERROR:\n\t      return 'NO_ERROR';\n\n\t    case gl.INVALID_ENUM:\n\t      return 'INVALID_ENUM';\n\n\t    case gl.INVALID_VALUE:\n\t      return 'INVALID_VALUE';\n\n\t    case gl.INVALID_OPERATION:\n\t      return 'INVALID_OPERATION';\n\n\t    case gl.INVALID_FRAMEBUFFER_OPERATION:\n\t      return 'INVALID_FRAMEBUFFER_OPERATION';\n\n\t    case gl.OUT_OF_MEMORY:\n\t      return 'OUT_OF_MEMORY';\n\n\t    case gl.CONTEXT_LOST_WEBGL:\n\t      return 'CONTEXT_LOST_WEBGL';\n\n\t    default:\n\t      return \"Unknown error code \" + status;\n\t  }\n\t}\n\tfunction getExtensionOrThrow(gl, extensionName) {\n\t  return throwIfNull(gl, function () {\n\t    return gl.getExtension(extensionName);\n\t  }, 'Extension \"' + extensionName + '\" not supported on this browser.');\n\t}\n\tfunction createVertexShader(gl, vertexShaderSource) {\n\t  var vertexShader = throwIfNull(gl, function () {\n\t    return gl.createShader(gl.VERTEX_SHADER);\n\t  }, 'Unable to create vertex WebGLShader.');\n\t  callAndCheck(gl, function () {\n\t    return gl.shaderSource(vertexShader, vertexShaderSource);\n\t  });\n\t  callAndCheck(gl, function () {\n\t    return gl.compileShader(vertexShader);\n\t  });\n\n\t  if (gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS) === false) {\n\t    console.log(gl.getShaderInfoLog(vertexShader));\n\t    throw new Error('Failed to compile vertex shader.');\n\t  }\n\n\t  return vertexShader;\n\t}\n\tfunction createFragmentShader(gl, fragmentShaderSource) {\n\t  var fragmentShader = throwIfNull(gl, function () {\n\t    return gl.createShader(gl.FRAGMENT_SHADER);\n\t  }, 'Unable to create fragment WebGLShader.');\n\t  callAndCheck(gl, function () {\n\t    return gl.shaderSource(fragmentShader, fragmentShaderSource);\n\t  });\n\t  callAndCheck(gl, function () {\n\t    return gl.compileShader(fragmentShader);\n\t  });\n\n\t  if (gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS) === false) {\n\t    logShaderSourceAndInfoLog(fragmentShaderSource, gl.getShaderInfoLog(fragmentShader));\n\t    throw new Error('Failed to compile fragment shader.');\n\t  }\n\n\t  return fragmentShader;\n\t}\n\tvar lineNumberRegex = /ERROR: [0-9]+:([0-9]+):/g;\n\n\tfunction logShaderSourceAndInfoLog(shaderSource, shaderInfoLog) {\n\t  var lineNumberRegexResult = lineNumberRegex.exec(shaderInfoLog);\n\n\t  if (lineNumberRegexResult == null) {\n\t    console.log(\"Couldn't parse line number in error: \" + shaderInfoLog);\n\t    console.log(shaderSource);\n\t    return;\n\t  }\n\n\t  var lineNumber = +lineNumberRegexResult[1];\n\t  var shaderLines = shaderSource.split('\\n');\n\t  var pad = shaderLines.length.toString().length + 2;\n\t  var linesWithLineNumbers = shaderLines.map(function (line, lineNumber) {\n\t    return rightPad((lineNumber + 1).toString(), pad) + line;\n\t  });\n\t  var maxLineLength = 0;\n\n\t  for (var i = 0; i < linesWithLineNumbers.length; i++) {\n\t    maxLineLength = Math.max(linesWithLineNumbers[i].length, maxLineLength);\n\t  }\n\n\t  var beforeErrorLines = linesWithLineNumbers.slice(0, lineNumber - 1);\n\t  var errorLine = linesWithLineNumbers.slice(lineNumber - 1, lineNumber);\n\t  var afterErrorLines = linesWithLineNumbers.slice(lineNumber);\n\t  console.log(beforeErrorLines.join('\\n'));\n\t  console.log(shaderInfoLog.split('\\n')[0]);\n\t  console.log(\"%c \" + rightPad(errorLine[0], maxLineLength), 'border:1px solid red; background-color:#e3d2d2; color:#a61717');\n\t  console.log(afterErrorLines.join('\\n'));\n\t}\n\n\tfunction createProgram(gl) {\n\t  return throwIfNull(gl, function () {\n\t    return gl.createProgram();\n\t  }, 'Unable to create WebGLProgram.');\n\t}\n\tfunction linkProgram(gl, program) {\n\t  callAndCheck(gl, function () {\n\t    return gl.linkProgram(program);\n\t  });\n\n\t  if (gl.getProgramParameter(program, gl.LINK_STATUS) === false) {\n\t    console.log(gl.getProgramInfoLog(program));\n\t    throw new Error('Failed to link vertex and fragment shaders.');\n\t  }\n\t}\n\tfunction validateProgram(gl, program) {\n\t  callAndCheck(gl, function () {\n\t    return gl.validateProgram(program);\n\t  });\n\n\t  if (gl.getProgramParameter(program, gl.VALIDATE_STATUS) === false) {\n\t    console.log(gl.getProgramInfoLog(program));\n\t    throw new Error('Shader program validation failed.');\n\t  }\n\t}\n\tfunction createStaticVertexBuffer(gl, data) {\n\t  var buffer = throwIfNull(gl, function () {\n\t    return gl.createBuffer();\n\t  }, 'Unable to create WebGLBuffer');\n\t  callAndCheck(gl, function () {\n\t    return gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\t  });\n\t  callAndCheck(gl, function () {\n\t    return gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);\n\t  });\n\t  return buffer;\n\t}\n\tfunction createStaticIndexBuffer(gl, data) {\n\t  var buffer = throwIfNull(gl, function () {\n\t    return gl.createBuffer();\n\t  }, 'Unable to create WebGLBuffer');\n\t  callAndCheck(gl, function () {\n\t    return gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffer);\n\t  });\n\t  callAndCheck(gl, function () {\n\t    return gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, data, gl.STATIC_DRAW);\n\t  });\n\t  return buffer;\n\t}\n\tfunction getNumChannels() {\n\t  if (env().getNumber('WEBGL_VERSION') === 2) {\n\t    return 1;\n\t  }\n\n\t  return 4;\n\t}\n\tfunction createTexture(gl) {\n\t  return throwIfNull(gl, function () {\n\t    return gl.createTexture();\n\t  }, 'Unable to create WebGLTexture.');\n\t}\n\tfunction validateTextureSize(width, height) {\n\t  var maxTextureSize = env().getNumber('WEBGL_MAX_TEXTURE_SIZE');\n\n\t  if (width <= 0 || height <= 0) {\n\t    var requested = \"[\" + width + \"x\" + height + \"]\";\n\t    throw new Error('Requested texture size ' + requested + ' is invalid.');\n\t  }\n\n\t  if (width > maxTextureSize || height > maxTextureSize) {\n\t    var _requested = \"[\" + width + \"x\" + height + \"]\";\n\n\t    var max = \"[\" + maxTextureSize + \"x\" + maxTextureSize + \"]\";\n\t    throw new Error('Requested texture size ' + _requested + ' greater than WebGL maximum on this browser / GPU ' + max + '.');\n\t  }\n\t}\n\tfunction createFramebuffer(gl) {\n\t  return throwIfNull(gl, function () {\n\t    return gl.createFramebuffer();\n\t  }, 'Unable to create WebGLFramebuffer.');\n\t}\n\tfunction bindVertexBufferToProgramAttribute(gl, program, attribute, buffer, arrayEntriesPerItem, itemStrideInBytes, itemOffsetInBytes) {\n\t  var loc = gl.getAttribLocation(program, attribute);\n\n\t  if (loc === -1) {\n\t    // The GPU compiler decided to strip out this attribute because it's unused,\n\t    // thus no need to bind.\n\t    return false;\n\t  }\n\n\t  callAndCheck(gl, function () {\n\t    return gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\t  });\n\t  callAndCheck(gl, function () {\n\t    return gl.vertexAttribPointer(loc, arrayEntriesPerItem, gl.FLOAT, false, itemStrideInBytes, itemOffsetInBytes);\n\t  });\n\t  callAndCheck(gl, function () {\n\t    return gl.enableVertexAttribArray(loc);\n\t  });\n\t  return true;\n\t}\n\tfunction bindTextureUnit(gl, texture, textureUnit) {\n\t  validateTextureUnit(gl, textureUnit);\n\t  callAndCheck(gl, function () {\n\t    return gl.activeTexture(gl.TEXTURE0 + textureUnit);\n\t  });\n\t  callAndCheck(gl, function () {\n\t    return gl.bindTexture(gl.TEXTURE_2D, texture);\n\t  });\n\t}\n\tfunction unbindTextureUnit(gl, textureUnit) {\n\t  validateTextureUnit(gl, textureUnit);\n\t  callAndCheck(gl, function () {\n\t    return gl.activeTexture(gl.TEXTURE0 + textureUnit);\n\t  });\n\t  callAndCheck(gl, function () {\n\t    return gl.bindTexture(gl.TEXTURE_2D, null);\n\t  });\n\t}\n\tfunction getProgramUniformLocationOrThrow(gl, program, uniformName) {\n\t  return throwIfNull(gl, function () {\n\t    return gl.getUniformLocation(program, uniformName);\n\t  }, 'uniform \"' + uniformName + '\" not present in program.');\n\t}\n\tfunction getProgramUniformLocation(gl, program, uniformName) {\n\t  return gl.getUniformLocation(program, uniformName);\n\t}\n\tfunction bindTextureToProgramUniformSampler(gl, texture, uniformSamplerLocation, textureUnit) {\n\t  callAndCheck(gl, function () {\n\t    return bindTextureUnit(gl, texture, textureUnit);\n\t  });\n\t  callAndCheck(gl, function () {\n\t    return gl.uniform1i(uniformSamplerLocation, textureUnit);\n\t  });\n\t}\n\tfunction bindCanvasToFramebuffer(gl) {\n\t  callAndCheck(gl, function () {\n\t    return gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t  });\n\t  callAndCheck(gl, function () {\n\t    return gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n\t  });\n\t  callAndCheck(gl, function () {\n\t    return gl.scissor(0, 0, gl.canvas.width, gl.canvas.height);\n\t  });\n\t}\n\tfunction bindColorTextureToFramebuffer(gl, texture, framebuffer) {\n\t  callAndCheck(gl, function () {\n\t    return gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n\t  });\n\t  callAndCheck(gl, function () {\n\t    return gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n\t  });\n\t}\n\tfunction unbindColorTextureFromFramebuffer(gl, framebuffer) {\n\t  callAndCheck(gl, function () {\n\t    return gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n\t  });\n\t  callAndCheck(gl, function () {\n\t    return gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0);\n\t  });\n\t}\n\tfunction validateFramebuffer(gl) {\n\t  var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n\n\t  if (status !== gl.FRAMEBUFFER_COMPLETE) {\n\t    throw new Error('Error binding framebuffer: ' + getFramebufferErrorMessage(gl, status));\n\t  }\n\t}\n\tfunction getFramebufferErrorMessage(gl, status) {\n\t  switch (status) {\n\t    case gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:\n\t      return 'FRAMEBUFFER_INCOMPLETE_ATTACHMENT';\n\n\t    case gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:\n\t      return 'FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT';\n\n\t    case gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:\n\t      return 'FRAMEBUFFER_INCOMPLETE_DIMENSIONS';\n\n\t    case gl.FRAMEBUFFER_UNSUPPORTED:\n\t      return 'FRAMEBUFFER_UNSUPPORTED';\n\n\t    default:\n\t      return \"unknown error \" + status;\n\t  }\n\t}\n\n\tfunction throwIfNull(gl, returnTOrNull, failureMessage) {\n\t  var tOrNull = callAndCheck(gl, function () {\n\t    return returnTOrNull();\n\t  });\n\n\t  if (tOrNull == null) {\n\t    throw new Error(failureMessage);\n\t  }\n\n\t  return tOrNull;\n\t}\n\n\tfunction validateTextureUnit(gl, textureUnit) {\n\t  var maxTextureUnit = gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1;\n\t  var glTextureUnit = textureUnit + gl.TEXTURE0;\n\n\t  if (glTextureUnit < gl.TEXTURE0 || glTextureUnit > maxTextureUnit) {\n\t    var textureUnitRange = \"[gl.TEXTURE0, gl.TEXTURE\" + maxTextureUnit + \"]\";\n\t    throw new Error(\"textureUnit must be in \" + textureUnitRange + \".\");\n\t  }\n\t}\n\n\tfunction getBatchDim(shape, dimsToSkip) {\n\t  if (dimsToSkip === void 0) {\n\t    dimsToSkip = 2;\n\t  }\n\n\t  return sizeFromShape(shape.slice(0, shape.length - dimsToSkip));\n\t}\n\tfunction getRowsCols(shape) {\n\t  if (shape.length === 0) {\n\t    throw Error('Cannot get rows and columns of an empty shape array.');\n\t  }\n\n\t  return [shape.length > 1 ? shape[shape.length - 2] : 1, shape[shape.length - 1]];\n\t}\n\tfunction getShapeAs3D(shape) {\n\t  var shapeAs3D = [1, 1, 1];\n\t  var isScalar = shape.length === 0 || shape.length === 1 && shape[0] === 1;\n\n\t  if (!isScalar) {\n\t    shapeAs3D = [getBatchDim(shape)].concat(getRowsCols(shape));\n\t  }\n\n\t  return shapeAs3D;\n\t}\n\tfunction getTextureShapeFromLogicalShape(logShape, isPacked) {\n\t  if (isPacked === void 0) {\n\t    isPacked = false;\n\t  }\n\n\t  var maxTexSize = env().getNumber('WEBGL_MAX_TEXTURE_SIZE');\n\n\t  if (isPacked) {\n\t    maxTexSize = maxTexSize * 2; // This logic ensures we accurately count the number of packed texels needed\n\t    // to accommodate the tensor. We can only pack values in the same texel if\n\t    // they are from adjacent pairs of rows/cols within the same batch. So if a\n\t    // tensor has 3 rows, we pretend it has 4 rows in order to account for the\n\t    // fact that the texels containing the third row are half empty.\n\n\t    logShape = logShape.map(function (d, i) {\n\t      return i >= logShape.length - 2 ? nearestLargerEven(logShape[i]) : logShape[i];\n\t    }); // Packed texture height is at least 2 (the channel height of a single\n\t    // texel).\n\n\t    if (logShape.length === 1) {\n\t      logShape = [2, logShape[0]];\n\t    }\n\t  } // If logical shape is 2, we don't squeeze, since we want to match physical.\n\n\n\t  if (logShape.length !== 2) {\n\t    var squeezeResult = squeezeShape(logShape);\n\t    logShape = squeezeResult.newShape;\n\t  }\n\n\t  var size = sizeFromShape(logShape);\n\n\t  if (logShape.length <= 1 && size <= maxTexSize) {\n\t    return [1, size];\n\t  } else if (logShape.length === 2 && logShape[0] <= maxTexSize && logShape[1] <= maxTexSize) {\n\t    return logShape;\n\t  } else if (logShape.length === 3 && logShape[0] * logShape[1] <= maxTexSize && logShape[2] <= maxTexSize) {\n\t    return [logShape[0] * logShape[1], logShape[2]];\n\t  } else if (logShape.length === 3 && logShape[0] <= maxTexSize && logShape[1] * logShape[2] <= maxTexSize) {\n\t    return [logShape[0], logShape[1] * logShape[2]];\n\t  } else if (logShape.length === 4 && logShape[0] * logShape[1] * logShape[2] <= maxTexSize && logShape[3] <= maxTexSize) {\n\t    return [logShape[0] * logShape[1] * logShape[2], logShape[3]];\n\t  } else if (logShape.length === 4 && logShape[0] <= maxTexSize && logShape[1] * logShape[2] * logShape[3] <= maxTexSize) {\n\t    return [logShape[0], logShape[1] * logShape[2] * logShape[3]];\n\t  } else {\n\t    if (isPacked) {\n\t      // For packed textures size equals the number of channels required to\n\t      // accommodate the texture data. However in order to squarify such that\n\t      // inner dimensions stay even, we rewrite size to equal the number of\n\t      // texels. Then in the return statement we rehydrate the squarified\n\t      // dimensions to channel units.\n\t      var batchDim = getBatchDim(logShape);\n\t      var rows = 2,\n\t          cols = 2;\n\n\t      if (logShape.length) {\n\t        var _getRowsCols = getRowsCols(logShape);\n\n\t        rows = _getRowsCols[0];\n\t        cols = _getRowsCols[1];\n\t      }\n\n\t      size = batchDim * (rows / 2) * (cols / 2);\n\t      return sizeToSquarishShape(size).map(function (d) {\n\t        return d * 2;\n\t      });\n\t    }\n\n\t    return sizeToSquarishShape(size);\n\t  }\n\t}\n\n\tfunction isEven(n) {\n\t  return n % 2 === 0;\n\t}\n\t/**\n\t * This determines whether reshaping a packed texture requires rearranging\n\t * the data within the texture, assuming 2x2 packing.\n\t */\n\n\n\tfunction isReshapeFree(shape1, shape2) {\n\t  shape1 = shape1.slice(-2);\n\t  shape2 = shape2.slice(-2);\n\n\t  if (arraysEqual(shape1, shape2)) {\n\t    return true;\n\t  }\n\n\t  if (!shape1.length || !shape2.length) {\n\t    // One of the shapes is a scalar.\n\t    return true;\n\t  }\n\n\t  if (shape1[0] === 0 || shape1[1] === 0 || shape2[0] === 0 || shape2[1] === 0) {\n\t    return true;\n\t  }\n\n\t  if (shape1.length !== shape2.length) {\n\t    // One of the shapes is a vector.\n\t    var shape1Cols = shape1.slice(-1)[0];\n\t    var shape2Cols = shape2.slice(-1)[0];\n\n\t    if (shape1Cols === shape2Cols) {\n\t      return true;\n\t    }\n\n\t    if (isEven(shape1Cols) && isEven(shape2Cols) && (shape1[0] === 1 || shape2[0] === 1)) {\n\t      return true;\n\t    }\n\t  }\n\n\t  return shape1[1] === shape2[1] && isEven(shape1[0]) && isEven(shape2[0]);\n\t} // We cache webgl params because the environment gets reset between\n\t// unit tests and we don't want to constantly query the WebGLContext for\n\t// MAX_TEXTURE_SIZE.\n\n\tvar MAX_TEXTURE_SIZE;\n\tvar MAX_TEXTURES_IN_SHADER;\n\tfunction getWebGLMaxTextureSize(webGLVersion) {\n\t  if (MAX_TEXTURE_SIZE == null) {\n\t    var gl = getWebGLContext(webGLVersion);\n\t    MAX_TEXTURE_SIZE = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n\t  }\n\n\t  return MAX_TEXTURE_SIZE;\n\t}\n\tfunction resetMaxTextureSize() {\n\t  MAX_TEXTURE_SIZE = null;\n\t}\n\tfunction resetMaxTexturesInShader() {\n\t  MAX_TEXTURES_IN_SHADER = null;\n\t}\n\tfunction getMaxTexturesInShader(webGLVersion) {\n\t  if (MAX_TEXTURES_IN_SHADER == null) {\n\t    var gl = getWebGLContext(webGLVersion);\n\t    MAX_TEXTURES_IN_SHADER = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n\t  } // We cap at 16 to avoid spurious runtime \"memory exhausted\" error.\n\n\n\t  return Math.min(16, MAX_TEXTURES_IN_SHADER);\n\t}\n\tfunction getWebGLDisjointQueryTimerVersion(webGLVersion) {\n\t  if (webGLVersion === 0) {\n\t    return 0;\n\t  }\n\n\t  var queryTimerVersion;\n\t  var gl = getWebGLContext(webGLVersion);\n\n\t  if (hasExtension(gl, 'EXT_disjoint_timer_query_webgl2') && webGLVersion === 2) {\n\t    queryTimerVersion = 2;\n\t  } else if (hasExtension(gl, 'EXT_disjoint_timer_query')) {\n\t    queryTimerVersion = 1;\n\t  } else {\n\t    queryTimerVersion = 0;\n\t  }\n\n\t  return queryTimerVersion;\n\t}\n\tfunction hasExtension(gl, extensionName) {\n\t  var ext = gl.getExtension(extensionName);\n\t  return ext != null;\n\t}\n\tfunction isWebGLVersionEnabled(webGLVersion) {\n\t  try {\n\t    var gl = getWebGLContext(webGLVersion);\n\n\t    if (gl != null) {\n\t      return true;\n\t    }\n\t  } catch (e) {\n\t    console.log('Error when getting WebGL context: ', e);\n\t    return false;\n\t  }\n\n\t  return false;\n\t}\n\tfunction isCapableOfRenderingToFloatTexture(webGLVersion) {\n\t  if (webGLVersion === 0) {\n\t    return false;\n\t  }\n\n\t  var gl = getWebGLContext(webGLVersion);\n\n\t  if (webGLVersion === 1) {\n\t    if (!hasExtension(gl, 'OES_texture_float')) {\n\t      return false;\n\t    }\n\t  } else {\n\t    if (!hasExtension(gl, 'EXT_color_buffer_float')) {\n\t      return false;\n\t    }\n\t  }\n\n\t  var isFrameBufferComplete = createFloatTextureAndBindToFramebuffer(gl);\n\t  return isFrameBufferComplete;\n\t}\n\t/**\n\t * Check if we can download values from a float/half-float texture.\n\t *\n\t * Note that for performance reasons we use binding a texture to a framebuffer\n\t * as a proxy for ability to download float values later using readPixels. The\n\t * texture params of this texture will not match those in readPixels exactly\n\t * but if we are unable to bind some kind of float texture to the frameBuffer\n\t * then we definitely will not be able to read float values from it.\n\t */\n\n\tfunction isDownloadFloatTextureEnabled(webGLVersion) {\n\t  if (webGLVersion === 0) {\n\t    return false;\n\t  }\n\n\t  var gl = getWebGLContext(webGLVersion);\n\n\t  if (webGLVersion === 1) {\n\t    if (!hasExtension(gl, 'OES_texture_float')) {\n\t      return false;\n\t    }\n\n\t    if (!hasExtension(gl, 'WEBGL_color_buffer_float')) {\n\t      return false;\n\t    }\n\t  } else {\n\t    if (hasExtension(gl, 'EXT_color_buffer_float')) {\n\t      return createFloatTextureAndBindToFramebuffer(gl);\n\t    }\n\n\t    var COLOR_BUFFER_HALF_FLOAT = 'EXT_color_buffer_half_float';\n\n\t    if (hasExtension(gl, COLOR_BUFFER_HALF_FLOAT)) {\n\t      var textureHalfFloatExtension = gl.getExtension(COLOR_BUFFER_HALF_FLOAT);\n\t      return createHalfFloatTextureAndBindToFramebuffer(gl, textureHalfFloatExtension);\n\t    }\n\n\t    return false;\n\t  }\n\n\t  var isFrameBufferComplete = createFloatTextureAndBindToFramebuffer(gl);\n\t  return isFrameBufferComplete;\n\t}\n\n\tfunction createFloatTextureAndBindToFramebuffer(gl) {\n\t  var texConfig = getTextureConfig(gl);\n\t  var texture = gl.createTexture();\n\t  gl.bindTexture(gl.TEXTURE_2D, texture);\n\t  var width = 1;\n\t  var height = 1;\n\t  gl.texImage2D(gl.TEXTURE_2D, 0, texConfig.internalFormatFloat, width, height, 0, texConfig.textureFormatFloat, texConfig.textureTypeFloat, null);\n\t  var frameBuffer = gl.createFramebuffer();\n\t  gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);\n\t  gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n\t  var isFrameBufferComplete = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;\n\t  gl.bindTexture(gl.TEXTURE_2D, null);\n\t  gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t  gl.deleteTexture(texture);\n\t  gl.deleteFramebuffer(frameBuffer);\n\t  return isFrameBufferComplete;\n\t}\n\n\tfunction createHalfFloatTextureAndBindToFramebuffer( // tslint:disable-next-line:no-any\n\tgl, textureHalfFloatExtension) {\n\t  var texConfig = getTextureConfig(gl, textureHalfFloatExtension);\n\t  var texture = gl.createTexture();\n\t  gl.bindTexture(gl.TEXTURE_2D, texture);\n\t  var width = 1;\n\t  var height = 1;\n\t  gl.texImage2D(gl.TEXTURE_2D, 0, texConfig.internalFormatHalfFloat, width, height, 0, texConfig.textureFormatFloat, texConfig.textureTypeHalfFloat, null);\n\t  var frameBuffer = gl.createFramebuffer();\n\t  gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);\n\t  gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n\t  var isFrameBufferComplete = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;\n\t  gl.bindTexture(gl.TEXTURE_2D, null);\n\t  gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t  gl.deleteTexture(texture);\n\t  gl.deleteFramebuffer(frameBuffer);\n\t  return isFrameBufferComplete;\n\t}\n\n\tfunction isWebGLFenceEnabled(webGLVersion) {\n\t  if (webGLVersion !== 2) {\n\t    return false;\n\t  }\n\n\t  var gl = getWebGLContext(webGLVersion); // tslint:disable-next-line:no-any\n\n\t  var isEnabled = gl.fenceSync != null;\n\t  return isEnabled;\n\t}\n\tfunction assertNotComplex$1(tensor, opName) {\n\t  if (!Array.isArray(tensor)) {\n\t    tensor = [tensor];\n\t  }\n\n\t  tensor.forEach(function (t) {\n\t    if (t != null) {\n\t      assert(t.dtype !== 'complex64', function () {\n\t        return opName + \" does not support complex64 tensors \" + 'in the WebGL backend.';\n\t      });\n\t    }\n\t  });\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ENV$1 = env();\n\t/**\n\t * This file contains WebGL-specific flag registrations.\n\t */\n\n\t/**\n\t * True if WebGL is supported.\n\t */\n\n\tENV$1.registerFlag('HAS_WEBGL', function () {\n\t  return ENV$1.getNumber('WEBGL_VERSION') > 0;\n\t});\n\t/** 0: No WebGL, 1: WebGL 1.0, 2: WebGL 2.0. */\n\n\tENV$1.registerFlag('WEBGL_VERSION', function () {\n\t  if (isWebGLVersionEnabled(2)) {\n\t    return 2;\n\t  } else if (isWebGLVersionEnabled(1)) {\n\t    return 1;\n\t  }\n\n\t  return 0;\n\t});\n\t/** Whether to check for numerical representation problems. */\n\n\tENV$1.registerFlag('WEBGL_CHECK_NUMERICAL_PROBLEMS', function () {\n\t  return false;\n\t});\n\tENV$1.registerFlag('WEBGL_BUFFER_SUPPORTED', function () {\n\t  return ENV$1.get('WEBGL_VERSION') === 2;\n\t});\n\t/** Whether the WebGL backend will sometimes forward ops to the CPU. */\n\n\tENV$1.registerFlag('WEBGL_CPU_FORWARD', function () {\n\t  return true;\n\t});\n\t/** Whether the WebGL backend will always use f16 textures for rendering. */\n\n\tENV$1.registerFlag('WEBGL_FORCE_F16_TEXTURES', function () {\n\t  return false;\n\t});\n\t/** Whether to turn all packing related flags on. */\n\n\tENV$1.registerFlag('WEBGL_PACK', function () {\n\t  return ENV$1.getBool('HAS_WEBGL');\n\t});\n\t/** Whether we will pack the batchnormalization op. */\n\n\tENV$1.registerFlag('WEBGL_PACK_NORMALIZATION', function () {\n\t  return ENV$1.getBool('WEBGL_PACK');\n\t});\n\t/** Whether we will pack the clip op. */\n\n\tENV$1.registerFlag('WEBGL_PACK_CLIP', function () {\n\t  return ENV$1.getBool('WEBGL_PACK');\n\t});\n\t/** Whether we will pack the depthwise conv op. */\n\t// TODO: https://github.com/tensorflow/tfjs/issues/1679\n\n\tENV$1.registerFlag('WEBGL_PACK_DEPTHWISECONV', function () {\n\t  return false;\n\t});\n\t/** Whether we will pack binary ops. */\n\n\tENV$1.registerFlag('WEBGL_PACK_BINARY_OPERATIONS', function () {\n\t  return ENV$1.getBool('WEBGL_PACK');\n\t});\n\t/** Whether we will pack unary ops. */\n\n\tENV$1.registerFlag('WEBGL_PACK_UNARY_OPERATIONS', function () {\n\t  return ENV$1.getBool('WEBGL_PACK');\n\t});\n\t/** Whether we will pack array ops. */\n\n\tENV$1.registerFlag('WEBGL_PACK_ARRAY_OPERATIONS', function () {\n\t  return ENV$1.getBool('WEBGL_PACK');\n\t});\n\t/** Whether we will pack image ops. */\n\n\tENV$1.registerFlag('WEBGL_PACK_IMAGE_OPERATIONS', function () {\n\t  return ENV$1.getBool('WEBGL_PACK');\n\t});\n\t/** Whether we will pack reduce ops. */\n\n\tENV$1.registerFlag('WEBGL_PACK_REDUCE', function () {\n\t  return ENV$1.getBool('WEBGL_PACK');\n\t});\n\t/** Whether packed WebGL kernels lazily unpack their outputs. */\n\n\tENV$1.registerFlag('WEBGL_LAZILY_UNPACK', function () {\n\t  return ENV$1.getBool('WEBGL_PACK');\n\t});\n\t/** Whether we will use the im2col algorithm to speed up convolutions. */\n\n\tENV$1.registerFlag('WEBGL_CONV_IM2COL', function () {\n\t  return ENV$1.getBool('WEBGL_PACK');\n\t});\n\t/** The maximum texture dimension. */\n\n\tENV$1.registerFlag('WEBGL_MAX_TEXTURE_SIZE', function () {\n\t  return getWebGLMaxTextureSize(ENV$1.getNumber('WEBGL_VERSION'));\n\t});\n\t/** The maximum texture dimension. */\n\n\tENV$1.registerFlag('WEBGL_MAX_TEXTURES_IN_SHADER', function () {\n\t  return getMaxTexturesInShader(ENV$1.getNumber('WEBGL_VERSION'));\n\t});\n\t/**\n\t * The disjoint_query_timer extension version.\n\t * 0: disabled, 1: EXT_disjoint_timer_query, 2:\n\t * EXT_disjoint_timer_query_webgl2.\n\t * In Firefox with WebGL 2.0,\n\t * EXT_disjoint_timer_query_webgl2 is not available, so we must use the\n\t * WebGL 1.0 extension.\n\t */\n\n\tENV$1.registerFlag('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION', function () {\n\t  var webGLVersion = ENV$1.getNumber('WEBGL_VERSION');\n\n\t  if (webGLVersion === 0) {\n\t    return 0;\n\t  }\n\n\t  return getWebGLDisjointQueryTimerVersion(webGLVersion);\n\t});\n\t/**\n\t * Whether the timer object from the disjoint_query_timer extension gives\n\t * timing information that is reliable.\n\t */\n\n\tENV$1.registerFlag('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE', function () {\n\t  return ENV$1.getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') > 0 && !isMobile();\n\t});\n\t/**\n\t * Whether the device is physically capable of rendering to float32 textures.\n\t */\n\n\tENV$1.registerFlag('WEBGL_RENDER_FLOAT32_CAPABLE', function () {\n\t  return isCapableOfRenderingToFloatTexture(ENV$1.getNumber('WEBGL_VERSION'));\n\t});\n\t/**\n\t * Whether rendering to float32 textures is enabled. If disabled, renders to\n\t * float16 textures.\n\t */\n\n\tENV$1.registerFlag('WEBGL_RENDER_FLOAT32_ENABLED', function () {\n\t  return ENV$1.getBool('WEBGL_FORCE_F16_TEXTURES') ? false : ENV$1.getBool('WEBGL_RENDER_FLOAT32_CAPABLE');\n\t});\n\t/**\n\t * Whether downloading float textures is enabled (16 or 32 bit). If disabled,\n\t * uses IEEE 754 encoding of the float32 values to 4 uint8 when downloading.\n\t */\n\n\tENV$1.registerFlag('WEBGL_DOWNLOAD_FLOAT_ENABLED', function () {\n\t  return isDownloadFloatTextureEnabled(ENV$1.getNumber('WEBGL_VERSION'));\n\t});\n\t/** Whether the fence API is available. */\n\n\tENV$1.registerFlag('WEBGL_FENCE_API_ENABLED', function () {\n\t  return isWebGLFenceEnabled(ENV$1.getNumber('WEBGL_VERSION'));\n\t});\n\t/**\n\t * Tensors with size <= than this will be uploaded as uniforms, not textures.\n\t */\n\n\tENV$1.registerFlag('WEBGL_SIZE_UPLOAD_UNIFORM', function () {\n\t  // Use uniform uploads only when 32bit floats are supported. In\n\t  // 16bit\n\t  // environments there are problems with comparing a 16bit texture value\n\t  // with a 32bit uniform value.\n\t  var useUniforms = ENV$1.getBool('WEBGL_RENDER_FLOAT32_ENABLED');\n\t  return useUniforms ? 4 : 0;\n\t});\n\t/**\n\t * If the total number of bytes allocated on the GPU is greater than this\n\t * number, we will aggressively delete textures upon disposal with\n\t * gl.deleteMatrixTexture, rather than making them available for reuse.\n\t *\n\t * Default value -1 indicates that we will never aggressively delete textures.\n\t */\n\n\tENV$1.registerFlag('WEBGL_DELETE_TEXTURE_THRESHOLD', function () {\n\t  return -1;\n\t}, function (threshold) {\n\t  if (threshold < 0 && threshold !== -1) {\n\t    throw new Error(\"WEBGL_DELETE_TEXTURE_THRESHOLD must be -1 (indicating never \" + (\"delete) or at least 0, but got \" + threshold + \".\"));\n\t  }\n\t});\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction getGlslDifferences() {\n\t  var version;\n\t  var attribute;\n\t  var varyingVs;\n\t  var varyingFs;\n\t  var texture2D;\n\t  var output;\n\t  var defineOutput;\n\t  var defineSpecialNaN;\n\t  var defineSpecialInf;\n\t  var defineRound;\n\n\t  if (env().getNumber('WEBGL_VERSION') === 2) {\n\t    version = '#version 300 es';\n\t    attribute = 'in';\n\t    varyingVs = 'out';\n\t    varyingFs = 'in';\n\t    texture2D = 'texture';\n\t    output = 'outputColor';\n\t    defineOutput = 'out vec4 outputColor;'; // Use custom isnan definition to work across differences between\n\t    // implementations on various platforms. While this should happen in ANGLE\n\t    // we still see differences between android and windows (on chrome) when\n\t    // using isnan directly.\n\n\t    defineSpecialNaN = \"\\n      bool isnan_custom(float val) {\\n        return (val > 0.0 || val < 0.0) ? false : val != 0.0;\\n      }\\n\\n      bvec4 isnan_custom(vec4 val) {\\n        return bvec4(isnan_custom(val.x),\\n          isnan_custom(val.y), isnan_custom(val.z), isnan_custom(val.w));\\n      }\\n\\n      #define isnan(value) isnan_custom(value)\\n    \"; // In webgl 2 we do not need to specify a custom isinf so there is no\n\t    // need for a special INFINITY constant.\n\n\t    defineSpecialInf = \"\";\n\t    defineRound = \"\\n      #define round(value) newRound(value)\\n      int newRound(float value) {\\n        return int(floor(value + 0.5));\\n      }\\n\\n      ivec4 newRound(vec4 value) {\\n        return ivec4(floor(value + vec4(0.5)));\\n      }\\n    \";\n\t  } else {\n\t    version = '';\n\t    attribute = 'attribute';\n\t    varyingVs = 'varying';\n\t    varyingFs = 'varying';\n\t    texture2D = 'texture2D';\n\t    output = 'gl_FragColor';\n\t    defineOutput = ''; // WebGL1 has no built in isnan so we define one here.\n\n\t    defineSpecialNaN = \"\\n      #define isnan(value) isnan_custom(value)\\n      bool isnan_custom(float val) {\\n        return (val > 0. || val < 1. || val == 0.) ? false : true;\\n      }\\n      bvec4 isnan_custom(vec4 val) {\\n        return bvec4(isnan(val.x), isnan(val.y), isnan(val.z), isnan(val.w));\\n      }\\n    \";\n\t    defineSpecialInf = \"\\n      uniform float INFINITY;\\n\\n      bool isinf(float val) {\\n        return abs(val) == INFINITY;\\n      }\\n      bvec4 isinf(vec4 val) {\\n        return equal(abs(val), vec4(INFINITY));\\n      }\\n    \";\n\t    defineRound = \"\\n      int round(float value) {\\n        return int(floor(value + 0.5));\\n      }\\n\\n      ivec4 round(vec4 value) {\\n        return ivec4(floor(value + vec4(0.5)));\\n      }\\n    \";\n\t  }\n\n\t  return {\n\t    version: version,\n\t    attribute: attribute,\n\t    varyingVs: varyingVs,\n\t    varyingFs: varyingFs,\n\t    texture2D: texture2D,\n\t    output: output,\n\t    defineOutput: defineOutput,\n\t    defineSpecialNaN: defineSpecialNaN,\n\t    defineSpecialInf: defineSpecialInf,\n\t    defineRound: defineRound\n\t  };\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Produces GLSL code that derives logical coordinates from a flat\n\t * index. The code performs integer division with each stride and decrements\n\t * the index until the index equals the final dimension coordinate.\n\t */\n\n\tfunction getLogicalCoordinatesFromFlatIndex(coords, shape, index) {\n\t  if (index === void 0) {\n\t    index = 'index';\n\t  }\n\n\t  var strides = computeStrides(shape);\n\t  return strides.map(function (stride, i) {\n\t    var line1 = \"int \" + coords[i] + \" = \" + index + \" / \" + stride;\n\t    var line2 = i === strides.length - 1 ? \"int \" + coords[i + 1] + \" = \" + index + \" - \" + coords[i] + \" * \" + stride : \"index -= \" + coords[i] + \" * \" + stride;\n\t    return line1 + \"; \" + line2 + \";\";\n\t  }).join('');\n\t}\n\n\tfunction buildVec(x) {\n\t  if (x.length === 1) {\n\t    return \"\" + x[0];\n\t  }\n\n\t  return \"vec\" + x.length + \"(\" + x.join(',') + \")\";\n\t}\n\t/**\n\t * Produces GLSL code that computes the dot product of the input x and y\n\t * vectors. Handles splitting inputs into increments of vec4s when necessary.\n\t */\n\n\n\tfunction dotify(x, y) {\n\t  if (x.length !== y.length) {\n\t    throw new Error(\"Vectors to be dotted must be of the same length -\" + (\"got \" + x.length + \" and \" + y.length));\n\t  }\n\n\t  var slices = [];\n\t  var nearestVec4 = Math.floor(x.length / 4);\n\t  var nearestVec4Remainder = x.length % 4;\n\n\t  for (var i = 0; i < nearestVec4; i++) {\n\t    var xSlice = x.slice(i * 4, i * 4 + 4);\n\t    var ySlice = y.slice(i * 4, i * 4 + 4);\n\t    slices.push(buildVec(xSlice) + \", \" + buildVec(ySlice));\n\t  }\n\n\t  if (nearestVec4Remainder !== 0) {\n\t    var _xSlice = x.slice(nearestVec4 * 4);\n\n\t    var _ySlice = y.slice(nearestVec4 * 4);\n\n\t    if (_xSlice.length === 1) {\n\t      _xSlice = _xSlice.map(function (d) {\n\t        return \"float(\" + d + \")\";\n\t      });\n\t      _ySlice = _ySlice.map(function (d) {\n\t        return \"float(\" + d + \")\";\n\t      });\n\t    }\n\n\t    slices.push(buildVec(_xSlice) + \", \" + buildVec(_ySlice));\n\t  }\n\n\t  return slices.map(function (d, i) {\n\t    return \"dot(\" + d + \")\";\n\t  }).join('+');\n\t}\n\t/**\n\t * Produces GLSL that computes the flat index from 3D coordinates.\n\t */\n\n\tfunction getFlatIndexFrom3D(shape) {\n\t  var strides = computeStrides(shape).map(function (d) {\n\t    return d.toString();\n\t  });\n\t  return \"\\n  int getFlatIndex(ivec3 coords) {\\n    return coords.x * \" + strides[0] + \" + coords.y * \" + strides[1] + \" + coords.z;\\n  }\\n\";\n\t}\n\tvar ENCODE_FLOAT_SNIPPET = \"\\n  const float FLOAT_MAX = 1.70141184e38;\\n  const float FLOAT_MIN = 1.17549435e-38;\\n\\n  lowp vec4 encode_float(highp float v) {\\n    if (isnan(v)) {\\n      return vec4(255, 255, 255, 255);\\n    }\\n\\n    highp float av = abs(v);\\n\\n    if(av < FLOAT_MIN) {\\n      return vec4(0.0, 0.0, 0.0, 0.0);\\n    } else if(v > FLOAT_MAX) {\\n      return vec4(0.0, 0.0, 128.0, 127.0) / 255.0;\\n    } else if(v < -FLOAT_MAX) {\\n      return vec4(0.0, 0.0,  128.0, 255.0) / 255.0;\\n    }\\n\\n    highp vec4 c = vec4(0,0,0,0);\\n\\n    highp float e = floor(log2(av));\\n    highp float m = exp2(fract(log2(av))) - 1.0;\\n\\n    c[2] = floor(128.0 * m);\\n    m -= c[2] / 128.0;\\n    c[1] = floor(32768.0 * m);\\n    m -= c[1] / 32768.0;\\n    c[0] = floor(8388608.0 * m);\\n\\n    highp float ebias = e + 127.0;\\n    c[3] = floor(ebias / 2.0);\\n    ebias -= c[3] * 2.0;\\n    c[2] += floor(ebias) * 128.0;\\n\\n    c[3] += 128.0 * step(0.0, -v);\\n\\n    return c / 255.0;\\n  }\\n\";\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar DecodeMatrixProgram = function DecodeMatrixProgram(outputShape) {\n\t  this.variableNames = ['A'];\n\t  this.packedInputs = false;\n\t  this.packedOutput = true;\n\t  this.outPackingScheme = PackingScheme.DENSE;\n\t  var texShape = getDenseTexShape(outputShape);\n\t  var glsl = getGlslDifferences();\n\t  this.outputShape = outputShape;\n\t  this.userCode = \"\\n      ivec3 outCoordsFromFlatIndex(int index) {\\n        \" + getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd'], outputShape) + \"\\n        return ivec3(r, c, d);\\n      }\\n\\n      void main() {\\n        ivec2 resTexRC = ivec2(resultUV.yx *\\n          vec2(\" + texShape[0] + \", \" + texShape[1] + \"));\\n        int index = 4 * (resTexRC.x * \" + texShape[1] + \" + resTexRC.y);\\n\\n        vec4 result = vec4(0.);\\n\\n        for (int i=0; i<4; i++) {\\n          int flatIndex = index + i;\\n          ivec3 rc = outCoordsFromFlatIndex(flatIndex);\\n          result[i] = getA(rc.x, rc.y, rc.z);\\n        }\\n\\n        \" + glsl.output + \" = result;\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar DecodeMatrixPackedProgram = function DecodeMatrixPackedProgram(outputShape) {\n\t  this.variableNames = ['A'];\n\t  this.packedInputs = true;\n\t  this.packedOutput = true;\n\t  this.outPackingScheme = PackingScheme.DENSE;\n\t  var texShape = getDenseTexShape(outputShape);\n\t  var glsl = getGlslDifferences();\n\t  this.outputShape = outputShape;\n\t  this.userCode = \"\\n      ivec3 outCoordsFromFlatIndex(int index) {\\n        \" + getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd'], outputShape) + \"\\n        return ivec3(r, c, d);\\n      }\\n\\n      void main() {\\n        ivec2 resTexRC = ivec2(resultUV.yx *\\n          vec2(\" + texShape[0] + \", \" + texShape[1] + \"));\\n        int index = 4 * (resTexRC.x * \" + texShape[1] + \" + resTexRC.y);\\n\\n        vec4 result = vec4(0.);\\n\\n        for (int i=0; i<4; i++) {\\n          int flatIndex = index + i;\\n          ivec3 rc = outCoordsFromFlatIndex(flatIndex);\\n          result[i] = getChannel(getA(rc.x, rc.y, rc.z), vec2(rc.y, rc.z));\\n        }\\n\\n        \" + glsl.output + \" = result;\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar EncodeFloatProgram = function EncodeFloatProgram(outputShape) {\n\t  this.variableNames = ['A'];\n\t  this.outTexUsage = TextureUsage.DOWNLOAD;\n\t  var glsl = getGlslDifferences();\n\t  this.outputShape = outputShape;\n\t  this.userCode = \"\\n      \" + ENCODE_FLOAT_SNIPPET + \"\\n\\n      void main() {\\n        float x = getAAtOutCoords();\\n        \" + glsl.output + \" = encode_float(x);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar EncodeFloatPackedProgram = function EncodeFloatPackedProgram(outputShape) {\n\t  this.variableNames = ['A'];\n\t  this.packedInputs = true;\n\t  this.packedOutput = false;\n\t  this.outTexUsage = TextureUsage.DOWNLOAD;\n\t  var glsl = getGlslDifferences();\n\t  this.outputShape = outputShape;\n\t  this.userCode = \"\\n      \" + ENCODE_FLOAT_SNIPPET + \"\\n\\n      void main() {\\n        ivec3 coords = getOutputCoords();\\n        float x = getChannel(getAAtOutCoords(), vec2(coords.y, coords.z));\\n        \" + glsl.output + \" = encode_float(x);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar EncodeMatrixProgram = function EncodeMatrixProgram(outputShape, texShape, inputIsUnsignedByte) {\n\t  if (inputIsUnsignedByte === void 0) {\n\t    inputIsUnsignedByte = false;\n\t  }\n\n\t  this.variableNames = ['A'];\n\t  var glsl = getGlslDifferences();\n\t  var height = texShape[0],\n\t      width = texShape[1];\n\t  this.outputShape = outputShape;\n\t  var output = \"result\";\n\n\t  if (inputIsUnsignedByte) {\n\t    output = \"floor(result * 255. + 0.5)\";\n\t  }\n\n\t  this.userCode = \"\\n      \" + getFlatIndexFrom3D(outputShape) + \"\\n\\n      void main() {\\n        ivec3 coords = getOutputCoords();\\n\\n        int flatIndex = getFlatIndex(coords);\\n        int offset = imod(flatIndex, 4);\\n\\n        flatIndex = idiv(flatIndex, 4, 1.);\\n\\n        int r = flatIndex / \" + width + \";\\n        int c = imod(flatIndex, \" + width + \");\\n        vec2 uv = (vec2(c, r) + halfCR) / vec2(\" + width + \".0, \" + height + \".0);\\n        vec4 values = \" + glsl.texture2D + \"(A, uv);\\n\\n        float result;\\n\\n        if(offset == 0) {\\n          result = values[0];\\n        } else if(offset == 1) {\\n          result = values[1];\\n        } else if(offset == 2) {\\n          result = values[2];\\n        } else {\\n          result = values[3];\\n        }\\n\\n        \" + glsl.output + \" = vec4(\" + output + \", 0., 0., 0.);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/*\n\tThis is how the shader encodes a tensor with shape = [2, 3, 5]\n\t(indices are [batch, row, col]).\n\n\t000|001   002|003   004|xxx   020|021   022|023   024|xxx\n\t-------   -------   -------   -------   -------   -------\n\t010|011   012|013   014|xxx   xxx|xxx   xxx|xxx   xxx|xxx\n\n\t100|101   102|103   104|xxx   120|121   122|123   124|xxx\n\t-------   -------   -------   -------   -------   -------\n\t110|111   112|113   114|xxx   xxx|xxx   xxx|xxx   xxx|xxx\n\n\tSingle texels contain only values from the same batch, and from adjacent rows\n\tand columns.\n\t */\n\n\tvar EncodeMatrixPackedProgram = function EncodeMatrixPackedProgram(outputShape, texShape, inputIsUnsignedByte) {\n\t  if (inputIsUnsignedByte === void 0) {\n\t    inputIsUnsignedByte = false;\n\t  }\n\n\t  this.variableNames = ['A'];\n\t  this.packedInputs = false;\n\t  this.packedOutput = true;\n\t  var glsl = getGlslDifferences();\n\t  var height = texShape[0],\n\t      width = texShape[1];\n\t  this.outputShape = outputShape;\n\t  var mainLoop = '';\n\t  var output = 'result';\n\n\t  if (inputIsUnsignedByte) {\n\t    output = 'floor(result * 255. + 0.5)';\n\t  }\n\n\t  for (var row = 0; row <= 1; row++) {\n\t    for (var col = 0; col <= 1; col++) {\n\t      var channel = row * 2 + col;\n\t      mainLoop += \"\\n          localCoords = coords;\\n          if(localCoords[2] + \" + col + \" < \" + outputShape[2] + \") {\\n            localCoords[2] += \" + col + \";\\n            if(localCoords[1] + \" + row + \" < \" + outputShape[1] + \") {\\n              localCoords[1] += \" + row + \";\\n\\n              flatIndex = getFlatIndex(localCoords);\\n              offset = imod(flatIndex, 4);\\n\\n              flatIndex = idiv(flatIndex, 4, 1.);\\n\\n              r = flatIndex / \" + width + \";\\n              c = imod(flatIndex, \" + width + \");\\n              uv = (vec2(c, r) + halfCR) / vec2(\" + width + \".0, \" + height + \".0);\\n              values = \" + glsl.texture2D + \"(A, uv);\\n\\n              if(offset == 0) {\\n                result[\" + channel + \"] = values[0];\\n              } else if(offset == 1) {\\n                result[\" + channel + \"] = values[1];\\n              } else if(offset == 2) {\\n                result[\" + channel + \"] = values[2];\\n              } else {\\n                result[\" + channel + \"] = values[3];\\n              }\\n            }\\n          }\\n        \";\n\t    }\n\t  }\n\n\t  this.userCode = \"\\n      \" + getFlatIndexFrom3D(outputShape) + \"\\n\\n      void main() {\\n        ivec3 coords = getOutputCoords();\\n\\n        vec4 result = vec4(0.);\\n        int flatIndex, r, c, offset;\\n        ivec3 localCoords;\\n        vec2 uv;\\n        vec4 values;\\n\\n        \" + mainLoop + \"\\n\\n        \" + glsl.output + \" = \" + output + \";\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction createVertexShader$1(gl) {\n\t  var glsl = getGlslDifferences();\n\t  var vertexShaderSource = glsl.version + \"\\n    precision highp float;\\n    \" + glsl.attribute + \" vec3 clipSpacePos;\\n    \" + glsl.attribute + \" vec2 uv;\\n    \" + glsl.varyingVs + \" vec2 resultUV;\\n\\n    void main() {\\n      gl_Position = vec4(clipSpacePos, 1);\\n      resultUV = uv;\\n    }\";\n\t  return createVertexShader(gl, vertexShaderSource);\n\t}\n\tfunction createVertexBuffer(gl) {\n\t  // [x y z u v] * [upper-left, lower-left, upper-right, lower-right]\n\t  var vertexArray = new Float32Array([-1, 1, 0, 0, 1, -1, -1, 0, 0, 0, 1, 1, 0, 1, 1, 1, -1, 0, 1, 0]);\n\t  return createStaticVertexBuffer(gl, vertexArray);\n\t}\n\tfunction createIndexBuffer(gl) {\n\t  // OpenGL (and WebGL) have \"CCW == front\" winding\n\t  var triangleVertexIndices = new Uint16Array([0, 1, 2, 2, 1, 3]);\n\t  return createStaticIndexBuffer(gl, triangleVertexIndices);\n\t}\n\n\tfunction createAndConfigureTexture(gl, width, height, internalFormat, textureFormat, textureType) {\n\t  validateTextureSize(width, height);\n\t  var texture = createTexture(gl);\n\t  var tex2d = gl.TEXTURE_2D;\n\t  callAndCheck(gl, function () {\n\t    return gl.bindTexture(tex2d, texture);\n\t  });\n\t  callAndCheck(gl, function () {\n\t    return gl.texParameteri(tex2d, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t  });\n\t  callAndCheck(gl, function () {\n\t    return gl.texParameteri(tex2d, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\t  });\n\t  callAndCheck(gl, function () {\n\t    return gl.texParameteri(tex2d, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n\t  });\n\t  callAndCheck(gl, function () {\n\t    return gl.texParameteri(tex2d, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\t  });\n\t  callAndCheck(gl, function () {\n\t    return gl.texImage2D(tex2d, 0, internalFormat, width, height, 0, textureFormat, textureType, null);\n\t  });\n\t  callAndCheck(gl, function () {\n\t    return gl.bindTexture(gl.TEXTURE_2D, null);\n\t  });\n\t  return texture;\n\t}\n\n\tfunction getInternalFormatForFloat32MatrixTexture(textureConfig) {\n\t  return textureConfig.internalFormatFloat;\n\t}\n\tfunction createFloat32MatrixTexture(gl, rows, columns, textureConfig) {\n\t  var _tex_util$getUnpacked = getUnpackedMatrixTextureShapeWidthHeight(rows, columns),\n\t      width = _tex_util$getUnpacked[0],\n\t      height = _tex_util$getUnpacked[1];\n\n\t  return createAndConfigureTexture(gl, width, height, getInternalFormatForFloat32MatrixTexture(textureConfig), textureConfig.textureFormatFloat, gl.FLOAT);\n\t}\n\tfunction getInternalFormatForFloat16MatrixTexture(textureConfig) {\n\t  return textureConfig.internalFormatHalfFloat;\n\t}\n\tfunction createFloat16MatrixTexture(gl, rows, columns, textureConfig) {\n\t  var _tex_util$getUnpacked2 = getUnpackedMatrixTextureShapeWidthHeight(rows, columns),\n\t      width = _tex_util$getUnpacked2[0],\n\t      height = _tex_util$getUnpacked2[1];\n\n\t  return createAndConfigureTexture(gl, width, height, getInternalFormatForFloat16MatrixTexture(textureConfig), textureConfig.textureFormatFloat, textureConfig.textureTypeHalfFloat);\n\t}\n\tfunction getInternalFormatForUnsignedBytesMatrixTexture(textureConfig) {\n\t  return textureConfig.downloadTextureFormat;\n\t}\n\tfunction createUnsignedBytesMatrixTexture(gl, rows, columns, textureConfig) {\n\t  var _tex_util$getUnpacked3 = getUnpackedMatrixTextureShapeWidthHeight(rows, columns),\n\t      width = _tex_util$getUnpacked3[0],\n\t      height = _tex_util$getUnpacked3[1];\n\n\t  return createAndConfigureTexture(gl, width, height, getInternalFormatForUnsignedBytesMatrixTexture(textureConfig), gl.RGBA, gl.UNSIGNED_BYTE);\n\t}\n\tfunction getInternalFormatForPackedMatrixTexture(textureConfig) {\n\t  return textureConfig.internalFormatPackedFloat;\n\t}\n\tfunction createPackedMatrixTexture(gl, rows, columns, textureConfig) {\n\t  var _tex_util$getPackedMa = getPackedMatrixTextureShapeWidthHeight(rows, columns),\n\t      width = _tex_util$getPackedMa[0],\n\t      height = _tex_util$getPackedMa[1];\n\n\t  return createAndConfigureTexture(gl, width, height, getInternalFormatForPackedMatrixTexture(textureConfig), gl.RGBA, gl.FLOAT);\n\t}\n\tfunction getInternalFormatForFloat16PackedMatrixTexture(textureConfig) {\n\t  return textureConfig.internalFormatPackedHalfFloat;\n\t}\n\tfunction createFloat16PackedMatrixTexture(gl, rows, columns, textureConfig) {\n\t  var _tex_util$getPackedMa2 = getPackedMatrixTextureShapeWidthHeight(rows, columns),\n\t      width = _tex_util$getPackedMa2[0],\n\t      height = _tex_util$getPackedMa2[1];\n\n\t  return createAndConfigureTexture(gl, width, height, getInternalFormatForFloat16PackedMatrixTexture(textureConfig), gl.RGBA, textureConfig.textureTypeHalfFloat);\n\t}\n\tfunction bindVertexProgramAttributeStreams(gl, program, vertexBuffer) {\n\t  var posOffset = 0; // x is the first buffer element\n\n\t  var uvOffset = 3 * 4; // uv comes after [x y z]\n\n\t  var stride = 3 * 4 + 2 * 4; // xyz + uv, each entry is 4-byte float.\n\n\t  callAndCheck(gl, function () {\n\t    return gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);\n\t  });\n\t  var success = bindVertexBufferToProgramAttribute(gl, program, 'clipSpacePos', vertexBuffer, 3, stride, posOffset);\n\t  return success && bindVertexBufferToProgramAttribute(gl, program, 'uv', vertexBuffer, 2, stride, uvOffset);\n\t}\n\tfunction uploadDenseMatrixToTexture(gl, texture, width, height, data, textureConfig) {\n\t  callAndCheck(gl, function () {\n\t    return gl.bindTexture(gl.TEXTURE_2D, texture);\n\t  });\n\t  var dataForUpload, texelDataType, internalFormat;\n\n\t  if (data instanceof Uint8Array) {\n\t    dataForUpload = new Uint8Array(width * height * 4);\n\t    texelDataType = gl.UNSIGNED_BYTE;\n\t    internalFormat = gl.RGBA;\n\t  } else {\n\t    dataForUpload = new Float32Array(width * height * 4);\n\t    texelDataType = gl.FLOAT;\n\t    internalFormat = textureConfig.internalFormatPackedFloat;\n\t  }\n\n\t  dataForUpload.set(data);\n\t  callAndCheck(gl, function () {\n\t    return gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, width, height, 0, gl.RGBA, texelDataType, dataForUpload);\n\t  });\n\t  callAndCheck(gl, function () {\n\t    return gl.bindTexture(gl.TEXTURE_2D, null);\n\t  });\n\t}\n\tfunction uploadPixelDataToTexture(gl, texture, pixels) {\n\t  callAndCheck(gl, function () {\n\t    return gl.bindTexture(gl.TEXTURE_2D, texture);\n\t  });\n\n\t  if (pixels.data instanceof Uint8Array) {\n\t    callAndCheck(gl, function () {\n\t      return gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, pixels.width, pixels.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, pixels.data);\n\t    });\n\t  } else {\n\t    callAndCheck(gl, function () {\n\t      return gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, pixels);\n\t    });\n\t  }\n\n\t  callAndCheck(gl, function () {\n\t    return gl.bindTexture(gl.TEXTURE_2D, null);\n\t  });\n\t}\n\tfunction createBufferFromOutputTexture(gl2, rows, columns, textureConfig) {\n\t  // Create and bind the buffer.\n\t  var buffer = gl2.createBuffer();\n\t  callAndCheck(gl2, function () {\n\t    return gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, buffer);\n\t  }); // Initialize the buffer to the size of the texture in bytes.\n\n\t  var bytesPerFloat = 4;\n\t  var valuesPerTexel = 4;\n\t  var bufferSizeBytes = bytesPerFloat * valuesPerTexel * rows * columns;\n\t  callAndCheck(gl2, function () {\n\t    return gl2.bufferData(gl2.PIXEL_PACK_BUFFER, bufferSizeBytes, gl2.STREAM_READ);\n\t  }); // Enqueue a command on the GPU command queue to copy of texture into the\n\t  // buffer.\n\n\t  callAndCheck(gl2, function () {\n\t    return gl2.readPixels(0, 0, columns, rows, gl2.RGBA, gl2.FLOAT, 0);\n\t  });\n\t  callAndCheck(gl2, function () {\n\t    return gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, null);\n\t  });\n\t  return buffer;\n\t}\n\tfunction downloadFloat32MatrixFromBuffer(gl, buffer, size) {\n\t  var gl2 = gl;\n\t  var downloadTarget = new Float32Array(size);\n\t  gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, buffer);\n\t  gl2.getBufferSubData(gl2.PIXEL_PACK_BUFFER, 0, downloadTarget);\n\t  gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, null);\n\t  return downloadTarget;\n\t}\n\tfunction downloadByteEncodedFloatMatrixFromOutputTexture(gl, rows, columns, textureConfig) {\n\t  var _tex_util$getUnpacked4 = getUnpackedMatrixTextureShapeWidthHeight(rows, columns),\n\t      w = _tex_util$getUnpacked4[0],\n\t      h = _tex_util$getUnpacked4[1];\n\n\t  var numChannels = 4;\n\t  var downloadTarget = new Uint8Array(getUnpackedArraySizeFromMatrixSize(rows * columns, numChannels));\n\t  callAndCheck(gl, function () {\n\t    return gl.readPixels(0, 0, w, h, textureConfig.downloadTextureFormat, gl.UNSIGNED_BYTE, downloadTarget);\n\t  }); // By wrapping the buffer in a Float32Array, we use native browser IEEE 754\n\t  // decoding of the 4 bytes that back each 32 bit float.\n\n\t  return new Float32Array(downloadTarget.buffer);\n\t}\n\tfunction downloadPackedMatrixFromBuffer(gl, buffer, batch, rows, cols, physicalRows, physicalCols, textureConfig) {\n\t  var gl2 = gl;\n\t  var downloadTarget = new Float32Array(getPackedRGBAArraySizeFromMatrixShape(physicalRows, physicalCols));\n\t  gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, buffer);\n\t  gl2.getBufferSubData(gl2.PIXEL_PACK_BUFFER, 0, downloadTarget);\n\t  gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, null);\n\t  return downloadTarget;\n\t}\n\tfunction downloadMatrixFromPackedOutputTexture(gl, physicalRows, physicalCols) {\n\t  var packedRGBA = new Float32Array(physicalRows * physicalCols * 4);\n\t  callAndCheck(gl, function () {\n\t    return gl.readPixels(0, 0, physicalCols, physicalRows, gl.RGBA, gl.FLOAT, packedRGBA);\n\t  });\n\t  return packedRGBA;\n\t}\n\n\tvar GPGPUContext = /*#__PURE__*/function () {\n\t  function GPGPUContext(gl) {\n\t    this.outputTexture = null;\n\t    this.program = null;\n\t    this.disposed = false;\n\t    this.vertexAttrsAreBound = false;\n\t    this.itemsToPoll = [];\n\t    var glVersion = env().getNumber('WEBGL_VERSION');\n\n\t    if (gl != null) {\n\t      this.gl = gl;\n\t      setWebGLContext(glVersion, gl);\n\t    } else {\n\t      this.gl = getWebGLContext(glVersion);\n\t    } // WebGL 2.0 enables texture floats without an extension.\n\n\n\t    var COLOR_BUFFER_FLOAT = 'WEBGL_color_buffer_float';\n\t    var COLOR_BUFFER_HALF_FLOAT = 'EXT_color_buffer_half_float';\n\n\t    if (env().getNumber('WEBGL_VERSION') === 1) {\n\t      var TEXTURE_FLOAT = 'OES_texture_float';\n\t      var TEXTURE_HALF_FLOAT = 'OES_texture_half_float';\n\t      this.textureFloatExtension = getExtensionOrThrow(this.gl, TEXTURE_FLOAT);\n\n\t      if (hasExtension(this.gl, TEXTURE_HALF_FLOAT)) {\n\t        this.textureHalfFloatExtension = getExtensionOrThrow(this.gl, TEXTURE_HALF_FLOAT);\n\t      } else if (env().get('WEBGL_FORCE_F16_TEXTURES')) {\n\t        throw new Error('GL context does not support half float textures, yet the ' + 'environment flag WEBGL_FORCE_F16_TEXTURES is set to true.');\n\t      }\n\n\t      this.colorBufferFloatExtension = this.gl.getExtension(COLOR_BUFFER_FLOAT);\n\n\t      if (hasExtension(this.gl, COLOR_BUFFER_HALF_FLOAT)) {\n\t        this.colorBufferHalfFloatExtension = getExtensionOrThrow(this.gl, COLOR_BUFFER_HALF_FLOAT);\n\t      } else if (env().get('WEBGL_FORCE_F16_TEXTURES')) {\n\t        throw new Error('GL context does not support color renderable half floats, yet ' + 'the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.');\n\t      }\n\t    } else {\n\t      COLOR_BUFFER_FLOAT = 'EXT_color_buffer_float';\n\n\t      if (hasExtension(this.gl, COLOR_BUFFER_FLOAT)) {\n\t        this.colorBufferFloatExtension = this.gl.getExtension(COLOR_BUFFER_FLOAT);\n\t      } else if (hasExtension(this.gl, COLOR_BUFFER_HALF_FLOAT)) {\n\t        this.colorBufferHalfFloatExtension = this.gl.getExtension(COLOR_BUFFER_HALF_FLOAT);\n\t      } else {\n\t        throw new Error('GL context does not support color renderable floats');\n\t      }\n\t    }\n\n\t    this.vertexBuffer = createVertexBuffer(this.gl);\n\t    this.indexBuffer = createIndexBuffer(this.gl);\n\t    this.framebuffer = createFramebuffer(this.gl);\n\t    this.textureConfig = getTextureConfig(this.gl, this.textureHalfFloatExtension);\n\t  }\n\n\t  var _proto = GPGPUContext.prototype;\n\n\t  _proto.dispose = function dispose() {\n\t    var _this = this;\n\n\t    if (this.disposed) {\n\t      return;\n\t    }\n\n\t    if (this.program != null) {\n\t      console.warn('Disposing a GPGPUContext that still has a bound WebGLProgram.' + ' This is probably a resource leak, delete the program with ' + 'GPGPUContext.deleteProgram before disposing.');\n\t    }\n\n\t    if (this.outputTexture != null) {\n\t      console.warn('Disposing a GPGPUContext that still has a bound output matrix ' + 'texture.  This is probably a resource leak, delete the output ' + 'matrix texture with GPGPUContext.deleteMatrixTexture before ' + 'disposing.');\n\t    }\n\n\t    var gl = this.gl;\n\t    callAndCheck(gl, function () {\n\t      return gl.finish();\n\t    });\n\t    callAndCheck(gl, function () {\n\t      return gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t    });\n\t    callAndCheck(gl, function () {\n\t      return gl.deleteFramebuffer(_this.framebuffer);\n\t    });\n\t    callAndCheck(gl, function () {\n\t      return gl.bindBuffer(gl.ARRAY_BUFFER, null);\n\t    });\n\t    callAndCheck(gl, function () {\n\t      return gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);\n\t    });\n\t    callAndCheck(gl, function () {\n\t      return gl.deleteBuffer(_this.indexBuffer);\n\t    });\n\t    this.disposed = true;\n\t  };\n\n\t  _proto.createFloat32MatrixTexture = function createFloat32MatrixTexture$1(rows, columns) {\n\t    this.throwIfDisposed();\n\t    return createFloat32MatrixTexture(this.gl, rows, columns, this.textureConfig);\n\t  };\n\n\t  _proto.createFloat16MatrixTexture = function createFloat16MatrixTexture$1(rows, columns) {\n\t    this.throwIfDisposed();\n\t    return createFloat16MatrixTexture(this.gl, rows, columns, this.textureConfig);\n\t  };\n\n\t  _proto.createUnsignedBytesMatrixTexture = function createUnsignedBytesMatrixTexture$1(rows, columns) {\n\t    this.throwIfDisposed();\n\t    return createUnsignedBytesMatrixTexture(this.gl, rows, columns, this.textureConfig);\n\t  };\n\n\t  _proto.uploadPixelDataToTexture = function uploadPixelDataToTexture$1(texture, pixels) {\n\t    this.throwIfDisposed();\n\t    uploadPixelDataToTexture(this.gl, texture, pixels);\n\t  };\n\n\t  _proto.uploadDenseMatrixToTexture = function uploadDenseMatrixToTexture$1(texture, width, height, data) {\n\t    this.throwIfDisposed();\n\t    uploadDenseMatrixToTexture(this.gl, texture, width, height, data, this.textureConfig);\n\t  };\n\n\t  _proto.createFloat16PackedMatrixTexture = function createFloat16PackedMatrixTexture$1(rows, columns) {\n\t    this.throwIfDisposed();\n\t    return createFloat16PackedMatrixTexture(this.gl, rows, columns, this.textureConfig);\n\t  };\n\n\t  _proto.createPackedMatrixTexture = function createPackedMatrixTexture$1(rows, columns) {\n\t    this.throwIfDisposed();\n\t    return createPackedMatrixTexture(this.gl, rows, columns, this.textureConfig);\n\t  };\n\n\t  _proto.deleteMatrixTexture = function deleteMatrixTexture(texture) {\n\t    var _this2 = this;\n\n\t    this.throwIfDisposed();\n\n\t    if (this.outputTexture === texture) {\n\t      unbindColorTextureFromFramebuffer(this.gl, this.framebuffer);\n\t      this.outputTexture = null;\n\t    }\n\n\t    callAndCheck(this.gl, function () {\n\t      return _this2.gl.deleteTexture(texture);\n\t    });\n\t  };\n\n\t  _proto.downloadByteEncodedFloatMatrixFromOutputTexture = function downloadByteEncodedFloatMatrixFromOutputTexture$1(texture, rows, columns) {\n\t    var _this3 = this;\n\n\t    return this.downloadMatrixDriver(texture, function () {\n\t      return downloadByteEncodedFloatMatrixFromOutputTexture(_this3.gl, rows, columns, _this3.textureConfig);\n\t    });\n\t  };\n\n\t  _proto.downloadPackedMatrixFromBuffer = function downloadPackedMatrixFromBuffer$1(buffer, batch, rows, columns, physicalRows, physicalCols) {\n\t    return downloadPackedMatrixFromBuffer(this.gl, buffer, batch, rows, columns, physicalRows, physicalCols, this.textureConfig);\n\t  };\n\n\t  _proto.downloadFloat32MatrixFromBuffer = function downloadFloat32MatrixFromBuffer$1(buffer, size) {\n\t    return downloadFloat32MatrixFromBuffer(this.gl, buffer, size);\n\t  };\n\n\t  _proto.createBufferFromTexture = function createBufferFromTexture(texture, rows, columns) {\n\t    this.bindTextureToFrameBuffer(texture);\n\t    var result = createBufferFromOutputTexture(this.gl, rows, columns, this.textureConfig);\n\t    this.unbindTextureToFrameBuffer();\n\t    return result;\n\t  };\n\n\t  _proto.createAndWaitForFence = function createAndWaitForFence() {\n\t    var fenceContext = this.createFence(this.gl);\n\t    return this.pollFence(fenceContext);\n\t  };\n\n\t  _proto.createFence = function createFence(gl) {\n\t    var _this4 = this;\n\n\t    var query;\n\t    var isFencePassed;\n\n\t    if (env().getBool('WEBGL_FENCE_API_ENABLED')) {\n\t      var gl2 = gl;\n\t      var sync = gl2.fenceSync(gl2.SYNC_GPU_COMMANDS_COMPLETE, 0);\n\t      gl.flush();\n\n\t      isFencePassed = function isFencePassed() {\n\t        var status = gl2.clientWaitSync(sync, 0, 0);\n\t        return status === gl2.ALREADY_SIGNALED || status === gl2.CONDITION_SATISFIED;\n\t      };\n\n\t      query = sync;\n\t    } else if (env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') > 0) {\n\t      query = this.beginQuery();\n\t      this.endQuery();\n\n\t      isFencePassed = function isFencePassed() {\n\t        return _this4.isQueryAvailable(query, env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION'));\n\t      };\n\t    } else {\n\t      // If we have no way to fence, return true immediately. This will fire in\n\t      // WebGL 1.0 when there is no disjoint query timer. In this case, because\n\t      // the fence passes immediately, we'll immediately ask for a download of\n\t      // the texture, which will cause the UI thread to hang.\n\t      isFencePassed = function isFencePassed() {\n\t        return true;\n\t      };\n\t    }\n\n\t    return {\n\t      query: query,\n\t      isFencePassed: isFencePassed\n\t    };\n\t  };\n\n\t  _proto.downloadMatrixFromPackedTexture = function downloadMatrixFromPackedTexture(texture, physicalRows, physicalCols) {\n\t    var _this5 = this;\n\n\t    return this.downloadMatrixDriver(texture, function () {\n\t      return downloadMatrixFromPackedOutputTexture(_this5.gl, physicalRows, physicalCols);\n\t    });\n\t  };\n\n\t  _proto.createProgram = function createProgram$1(fragmentShaderSource) {\n\t    this.throwIfDisposed();\n\t    var gl = this.gl;\n\t    var fragmentShader = createFragmentShader(gl, fragmentShaderSource);\n\t    var vertexShader = createVertexShader$1(gl);\n\t    var program = createProgram(gl);\n\t    callAndCheck(gl, function () {\n\t      return gl.attachShader(program, vertexShader);\n\t    });\n\t    callAndCheck(gl, function () {\n\t      return gl.attachShader(program, fragmentShader);\n\t    });\n\t    linkProgram(gl, program);\n\n\t    if (this.debug) {\n\t      validateProgram(gl, program);\n\t    }\n\n\t    if (!this.vertexAttrsAreBound) {\n\t      this.setProgram(program);\n\t      this.vertexAttrsAreBound = bindVertexProgramAttributeStreams(gl, this.program, this.vertexBuffer);\n\t    }\n\n\t    return program;\n\t  };\n\n\t  _proto.deleteProgram = function deleteProgram(program) {\n\t    var _this6 = this;\n\n\t    this.throwIfDisposed();\n\n\t    if (program === this.program) {\n\t      this.program = null;\n\t    }\n\n\t    if (program != null) {\n\t      callAndCheck(this.gl, function () {\n\t        return _this6.gl.deleteProgram(program);\n\t      });\n\t    }\n\t  };\n\n\t  _proto.setProgram = function setProgram(program) {\n\t    var _this7 = this;\n\n\t    this.throwIfDisposed();\n\t    this.program = program;\n\n\t    if (this.program != null && this.debug) {\n\t      validateProgram(this.gl, this.program);\n\t    }\n\n\t    callAndCheck(this.gl, function () {\n\t      return _this7.gl.useProgram(program);\n\t    });\n\t  };\n\n\t  _proto.getUniformLocation = function getUniformLocation(program, uniformName, shouldThrow) {\n\t    if (shouldThrow === void 0) {\n\t      shouldThrow = true;\n\t    }\n\n\t    this.throwIfDisposed();\n\n\t    if (shouldThrow) {\n\t      return getProgramUniformLocationOrThrow(this.gl, program, uniformName);\n\t    } else {\n\t      return getProgramUniformLocation(this.gl, program, uniformName);\n\t    }\n\t  };\n\n\t  _proto.getAttributeLocation = function getAttributeLocation(program, attribute) {\n\t    var _this8 = this;\n\n\t    this.throwIfDisposed();\n\t    return callAndCheck(this.gl, function () {\n\t      return _this8.gl.getAttribLocation(program, attribute);\n\t    });\n\t  };\n\n\t  _proto.getUniformLocationNoThrow = function getUniformLocationNoThrow(program, uniformName) {\n\t    this.throwIfDisposed();\n\t    return this.gl.getUniformLocation(program, uniformName);\n\t  };\n\n\t  _proto.setInputMatrixTexture = function setInputMatrixTexture(inputMatrixTexture, uniformLocation, textureUnit) {\n\t    this.throwIfDisposed();\n\t    this.throwIfNoProgram();\n\t    bindTextureToProgramUniformSampler(this.gl, inputMatrixTexture, uniformLocation, textureUnit);\n\t  };\n\n\t  _proto.setOutputMatrixTexture = function setOutputMatrixTexture(outputMatrixTexture, rows, columns) {\n\t    this.setOutputMatrixTextureDriver(outputMatrixTexture, columns, rows);\n\t  };\n\n\t  _proto.setOutputPackedMatrixTexture = function setOutputPackedMatrixTexture(outputPackedMatrixTexture, rows, columns) {\n\t    this.throwIfDisposed();\n\n\t    var _tex_util$getPackedMa = getPackedMatrixTextureShapeWidthHeight(rows, columns),\n\t        width = _tex_util$getPackedMa[0],\n\t        height = _tex_util$getPackedMa[1];\n\n\t    this.setOutputMatrixTextureDriver(outputPackedMatrixTexture, width, height);\n\t  };\n\n\t  _proto.setOutputMatrixWriteRegion = function setOutputMatrixWriteRegion(startRow, numRows, startColumn, numColumns) {\n\t    this.setOutputMatrixWriteRegionDriver(startColumn, startRow, numColumns, numRows);\n\t  };\n\n\t  _proto.setOutputPackedMatrixWriteRegion = function setOutputPackedMatrixWriteRegion(startRow, numRows, startColumn, numColumns) {\n\t    throw new Error('setOutputPackedMatrixWriteRegion not implemented.');\n\t  };\n\n\t  _proto.debugValidate = function debugValidate() {\n\t    if (this.program != null) {\n\t      validateProgram(this.gl, this.program);\n\t    }\n\n\t    validateFramebuffer(this.gl);\n\t  };\n\n\t  _proto.executeProgram = function executeProgram() {\n\t    this.throwIfDisposed();\n\t    this.throwIfNoProgram();\n\t    var gl = this.gl;\n\n\t    if (this.debug) {\n\t      this.debugValidate();\n\t    }\n\n\t    callAndCheck(gl, function () {\n\t      return gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);\n\t    });\n\t  };\n\n\t  _proto.blockUntilAllProgramsCompleted = function blockUntilAllProgramsCompleted() {\n\t    var _this9 = this;\n\n\t    this.throwIfDisposed();\n\t    callAndCheck(this.gl, function () {\n\t      return _this9.gl.finish();\n\t    });\n\t  };\n\n\t  _proto.getQueryTimerExtension = function getQueryTimerExtension() {\n\t    if (this.disjointQueryTimerExtension == null) {\n\t      this.disjointQueryTimerExtension = getExtensionOrThrow(this.gl, env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') === 2 ? 'EXT_disjoint_timer_query_webgl2' : 'EXT_disjoint_timer_query');\n\t    }\n\n\t    return this.disjointQueryTimerExtension;\n\t  };\n\n\t  _proto.getQueryTimerExtensionWebGL2 = function getQueryTimerExtensionWebGL2() {\n\t    return this.getQueryTimerExtension();\n\t  };\n\n\t  _proto.getQueryTimerExtensionWebGL1 = function getQueryTimerExtensionWebGL1() {\n\t    return this.getQueryTimerExtension();\n\t  };\n\n\t  _proto.beginQuery = function beginQuery() {\n\t    if (env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') === 2) {\n\t      var gl2 = this.gl;\n\n\t      var _ext = this.getQueryTimerExtensionWebGL2();\n\n\t      var _query = gl2.createQuery();\n\n\t      gl2.beginQuery(_ext.TIME_ELAPSED_EXT, _query);\n\t      return _query;\n\t    }\n\n\t    var ext = this.getQueryTimerExtensionWebGL1();\n\t    var query = ext.createQueryEXT();\n\t    ext.beginQueryEXT(ext.TIME_ELAPSED_EXT, query);\n\t    return query;\n\t  };\n\n\t  _proto.endQuery = function endQuery() {\n\t    if (env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') === 2) {\n\t      var gl2 = this.gl;\n\n\t      var _ext2 = this.getQueryTimerExtensionWebGL2();\n\n\t      gl2.endQuery(_ext2.TIME_ELAPSED_EXT);\n\t      return;\n\t    }\n\n\t    var ext = this.getQueryTimerExtensionWebGL1();\n\t    ext.endQueryEXT(ext.TIME_ELAPSED_EXT);\n\t  };\n\n\t  _proto.waitForQueryAndGetTime = /*#__PURE__*/function () {\n\t    var _waitForQueryAndGetTime = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(query) {\n\t      var _this10 = this;\n\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              _context.next = 2;\n\t              return repeatedTry(function () {\n\t                return _this10.disposed || // while testing contexts are created / disposed\n\t                // in rapid succession, so without this check we\n\t                // may poll for the query timer indefinitely\n\t                _this10.isQueryAvailable(query, env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION'));\n\t              });\n\n\t            case 2:\n\t              return _context.abrupt(\"return\", this.getQueryTime(query, env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION')));\n\n\t            case 3:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function waitForQueryAndGetTime(_x) {\n\t      return _waitForQueryAndGetTime.apply(this, arguments);\n\t    }\n\n\t    return waitForQueryAndGetTime;\n\t  }();\n\n\t  _proto.getQueryTime = function getQueryTime(query, queryTimerVersion) {\n\t    if (queryTimerVersion === 0) {\n\t      return null;\n\t    }\n\n\t    if (queryTimerVersion === 2) {\n\t      var gl2 = this.gl;\n\t      var timeElapsedNanos = gl2.getQueryParameter(query, gl2.QUERY_RESULT); // Return milliseconds.\n\n\t      return timeElapsedNanos / 1000000;\n\t    } else {\n\t      var ext = this.getQueryTimerExtensionWebGL1();\n\n\t      var _timeElapsedNanos = ext.getQueryObjectEXT(query, ext.QUERY_RESULT_EXT); // Return milliseconds.\n\n\n\t      return _timeElapsedNanos / 1000000;\n\t    }\n\t  };\n\n\t  _proto.isQueryAvailable = function isQueryAvailable(query, queryTimerVersion) {\n\t    if (queryTimerVersion === 0) {\n\t      return true;\n\t    }\n\n\t    if (queryTimerVersion === 2) {\n\t      var gl2 = this.gl;\n\t      var ext = this.getQueryTimerExtensionWebGL2();\n\t      var available = gl2.getQueryParameter(query, gl2.QUERY_RESULT_AVAILABLE);\n\n\t      if (this.disjoint == null) {\n\t        this.disjoint = this.gl.getParameter(ext.GPU_DISJOINT_EXT);\n\t      }\n\n\t      return available && !this.disjoint;\n\t    } else {\n\t      var _ext3 = this.getQueryTimerExtensionWebGL1();\n\n\t      var _available = _ext3.getQueryObjectEXT(query, _ext3.QUERY_RESULT_AVAILABLE_EXT);\n\n\t      if (this.disjoint == null) {\n\t        this.disjoint = this.gl.getParameter(_ext3.GPU_DISJOINT_EXT);\n\t      }\n\n\t      return _available && !this.disjoint;\n\t    }\n\t  };\n\n\t  _proto.pollFence = function pollFence(fenceContext) {\n\t    var _this11 = this;\n\n\t    return new Promise(function (resolve) {\n\t      _this11.addItemToPoll(function () {\n\t        return fenceContext.isFencePassed();\n\t      }, function () {\n\t        return resolve();\n\t      });\n\t    });\n\t  };\n\n\t  _proto.pollItems = function pollItems() {\n\t    // Find the last query that has finished.\n\t    var index = linearSearchLastTrue(this.itemsToPoll.map(function (x) {\n\t      return x.isDoneFn;\n\t    }));\n\n\t    for (var i = 0; i <= index; ++i) {\n\t      var resolveFn = this.itemsToPoll[i].resolveFn;\n\t      resolveFn();\n\t    }\n\n\t    this.itemsToPoll = this.itemsToPoll.slice(index + 1);\n\t  };\n\n\t  _proto.addItemToPoll = function addItemToPoll(isDoneFn, resolveFn) {\n\t    var _this12 = this;\n\n\t    this.itemsToPoll.push({\n\t      isDoneFn: isDoneFn,\n\t      resolveFn: resolveFn\n\t    });\n\n\t    if (this.itemsToPoll.length > 1) {\n\t      // We already have a running loop that polls.\n\t      return;\n\t    } // Start a new loop that polls.\n\n\n\t    repeatedTry(function () {\n\t      _this12.pollItems(); // End the loop if no more items to poll.\n\n\n\t      return _this12.itemsToPoll.length === 0;\n\t    });\n\t  };\n\n\t  _proto.bindTextureToFrameBuffer = function bindTextureToFrameBuffer(texture) {\n\t    this.throwIfDisposed();\n\t    bindColorTextureToFramebuffer(this.gl, texture, this.framebuffer);\n\n\t    if (this.debug) {\n\t      validateFramebuffer(this.gl);\n\t    }\n\t  };\n\n\t  _proto.unbindTextureToFrameBuffer = function unbindTextureToFrameBuffer() {\n\t    if (this.outputTexture != null) {\n\t      bindColorTextureToFramebuffer(this.gl, this.outputTexture, this.framebuffer);\n\n\t      if (this.debug) {\n\t        validateFramebuffer(this.gl);\n\t      }\n\t    } else {\n\t      unbindColorTextureFromFramebuffer(this.gl, this.framebuffer);\n\t    }\n\t  };\n\n\t  _proto.downloadMatrixDriver = function downloadMatrixDriver(texture, downloadAndDecode) {\n\t    this.bindTextureToFrameBuffer(texture);\n\t    var result = downloadAndDecode();\n\t    this.unbindTextureToFrameBuffer();\n\t    return result;\n\t  };\n\n\t  _proto.setOutputMatrixTextureDriver = function setOutputMatrixTextureDriver(outputMatrixTextureMaybePacked, width, height) {\n\t    this.throwIfDisposed();\n\t    var gl = this.gl;\n\t    bindColorTextureToFramebuffer(gl, outputMatrixTextureMaybePacked, this.framebuffer);\n\n\t    if (this.debug) {\n\t      validateFramebuffer(gl);\n\t    }\n\n\t    this.outputTexture = outputMatrixTextureMaybePacked;\n\t    callAndCheck(gl, function () {\n\t      return gl.viewport(0, 0, width, height);\n\t    });\n\t    callAndCheck(gl, function () {\n\t      return gl.scissor(0, 0, width, height);\n\t    });\n\t  };\n\n\t  _proto.setOutputMatrixWriteRegionDriver = function setOutputMatrixWriteRegionDriver(x, y, width, height) {\n\t    var _this13 = this;\n\n\t    this.throwIfDisposed();\n\t    callAndCheck(this.gl, function () {\n\t      return _this13.gl.scissor(x, y, width, height);\n\t    });\n\t  };\n\n\t  _proto.throwIfDisposed = function throwIfDisposed() {\n\t    if (this.disposed) {\n\t      throw new Error('Attempted to use disposed GPGPUContext.');\n\t    }\n\t  };\n\n\t  _proto.throwIfNoProgram = function throwIfNoProgram() {\n\t    if (this.program == null) {\n\t      throw new Error('No GPU program is currently set.');\n\t    }\n\t  };\n\n\t  _createClass(GPGPUContext, [{\n\t    key: \"debug\",\n\t    get: function get() {\n\t      return env().getBool('DEBUG');\n\t    }\n\t  }]);\n\n\t  return GPGPUContext;\n\t}();\n\t/**\n\t * Finds the index of the last true element using linear search.\n\t * Note: We can't do binary search because Chrome expects us to explicitly\n\t * test all fences before download:\n\t * https://github.com/tensorflow/tfjs/issues/1145\n\t */\n\n\tfunction linearSearchLastTrue(arr) {\n\t  var i = 0;\n\n\t  for (; i < arr.length; ++i) {\n\t    var isDone = arr[i]();\n\n\t    if (!isDone) {\n\t      break;\n\t    }\n\t  }\n\n\t  return i - 1;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar getBroadcastDims$1 = getBroadcastDims;\n\tfunction makeShader(inputsInfo, outputShape, userCode, usesPackedTextures) {\n\t  var prefixSnippets = [];\n\t  inputsInfo.forEach(function (x) {\n\t    var size = sizeFromShape(x.shapeInfo.logicalShape); // Snippet when we decided to upload the values as uniform.\n\n\t    if (x.shapeInfo.isUniform) {\n\t      prefixSnippets.push(\"uniform float \" + x.name + (size > 1 ? \"[\" + size + \"]\" : '') + \";\");\n\t    } else {\n\t      prefixSnippets.push(\"uniform sampler2D \" + x.name + \";\");\n\t      prefixSnippets.push(\"uniform int offset\" + x.name + \";\");\n\t    }\n\t  });\n\t  var inputPrefixSnippet = prefixSnippets.join('\\n');\n\t  var inputSamplingSnippet = inputsInfo.map(function (x) {\n\t    return getInputSamplingSnippet(x, outputShape, usesPackedTextures);\n\t  }).join('\\n');\n\t  var outTexShape = outputShape.texShape;\n\t  var glsl = getGlslDifferences();\n\t  var floatTextureSampleSnippet = getFloatTextureSampleSnippet(glsl);\n\t  var outputSamplingSnippet;\n\t  var floatTextureSetOutputSnippet;\n\t  var shaderPrefix = getShaderPrefix(glsl);\n\n\t  if (outputShape.isPacked) {\n\t    outputSamplingSnippet = getPackedOutputSamplingSnippet(outputShape.logicalShape, outTexShape);\n\t    floatTextureSetOutputSnippet = getFloatTextureSetRGBASnippet(glsl);\n\t  } else {\n\t    outputSamplingSnippet = getOutputSamplingSnippet(outputShape.logicalShape, outTexShape);\n\t    floatTextureSetOutputSnippet = getFloatTextureSetRSnippet(glsl);\n\t  }\n\n\t  if (usesPackedTextures) {\n\t    shaderPrefix += SHADER_PACKED_PREFIX;\n\t  }\n\n\t  var source = [shaderPrefix, floatTextureSampleSnippet, floatTextureSetOutputSnippet, inputPrefixSnippet, outputSamplingSnippet, inputSamplingSnippet, userCode].join('\\n');\n\t  return source;\n\t}\n\n\tfunction getSamplerFromInInfo(inInfo) {\n\t  var shape = inInfo.shapeInfo.logicalShape;\n\n\t  switch (shape.length) {\n\t    case 0:\n\t      return getSamplerScalar(inInfo);\n\n\t    case 1:\n\t      return getSampler1D(inInfo);\n\n\t    case 2:\n\t      return getSampler2D(inInfo);\n\n\t    case 3:\n\t      return getSampler3D(inInfo);\n\n\t    case 4:\n\t      return getSampler4D(inInfo);\n\n\t    case 5:\n\t      return getSampler5D(inInfo);\n\n\t    case 6:\n\t      return getSampler6D(inInfo);\n\n\t    default:\n\t      throw new Error(shape.length + \"-D input sampling\" + \" is not yet supported\");\n\t  }\n\t}\n\n\tfunction getPackedSamplerFromInInfo(inInfo) {\n\t  var shape = inInfo.shapeInfo.logicalShape;\n\n\t  switch (shape.length) {\n\t    case 0:\n\t      return getPackedSamplerScalar(inInfo);\n\n\t    case 1:\n\t      return getPackedSampler1D(inInfo);\n\n\t    case 2:\n\t      return getPackedSampler2D(inInfo);\n\n\t    case 3:\n\t      return getPackedSampler3D(inInfo);\n\n\t    default:\n\t      return getPackedSamplerND(inInfo);\n\t  }\n\t}\n\n\tfunction getInputSamplingSnippet(inInfo, outShapeInfo, usesPackedTextures) {\n\t  if (usesPackedTextures === void 0) {\n\t    usesPackedTextures = false;\n\t  }\n\n\t  var res = '';\n\n\t  if (usesPackedTextures) {\n\t    res += getPackedSamplerFromInInfo(inInfo);\n\t  } else {\n\t    res += getSamplerFromInInfo(inInfo);\n\t  }\n\n\t  var inShape = inInfo.shapeInfo.logicalShape;\n\t  var outShape = outShapeInfo.logicalShape;\n\n\t  if (inShape.length <= outShape.length) {\n\t    if (usesPackedTextures) {\n\t      res += getPackedSamplerAtOutputCoords(inInfo, outShapeInfo);\n\t    } else {\n\t      res += getSamplerAtOutputCoords(inInfo, outShapeInfo);\n\t    }\n\t  }\n\n\t  return res;\n\t}\n\n\tfunction getPackedOutputSamplingSnippet(outShape, outTexShape) {\n\t  switch (outShape.length) {\n\t    case 0:\n\t      return getOutputScalarCoords();\n\n\t    case 1:\n\t      return getOutputPacked1DCoords(outShape, outTexShape);\n\n\t    case 2:\n\t      return getOutputPacked2DCoords(outShape, outTexShape);\n\n\t    case 3:\n\t      return getOutputPacked3DCoords(outShape, outTexShape);\n\n\t    default:\n\t      return getOutputPackedNDCoords(outShape, outTexShape);\n\t  }\n\t}\n\n\tfunction getOutputSamplingSnippet(outShape, outTexShape) {\n\t  switch (outShape.length) {\n\t    case 0:\n\t      return getOutputScalarCoords();\n\n\t    case 1:\n\t      return getOutput1DCoords(outShape, outTexShape);\n\n\t    case 2:\n\t      return getOutput2DCoords(outShape, outTexShape);\n\n\t    case 3:\n\t      return getOutput3DCoords(outShape, outTexShape);\n\n\t    case 4:\n\t      return getOutput4DCoords(outShape, outTexShape);\n\n\t    case 5:\n\t      return getOutput5DCoords(outShape, outTexShape);\n\n\t    case 6:\n\t      return getOutput6DCoords(outShape, outTexShape);\n\n\t    default:\n\t      throw new Error(outShape.length + \"-D output sampling is not yet supported\");\n\t  }\n\t}\n\n\tfunction getFloatTextureSampleSnippet(glsl) {\n\t  return \"\\n    float sampleTexture(sampler2D textureSampler, vec2 uv) {\\n      return \" + glsl.texture2D + \"(textureSampler, uv).r;\\n    }\\n  \";\n\t}\n\n\tfunction getFloatTextureSetRSnippet(glsl) {\n\t  return \"\\n    void setOutput(float val) {\\n      \" + glsl.output + \" = vec4(val, 0, 0, 0);\\n    }\\n  \";\n\t}\n\n\tfunction getFloatTextureSetRGBASnippet(glsl) {\n\t  return \"\\n    void setOutput(vec4 val) {\\n      \" + glsl.output + \" = val;\\n    }\\n  \";\n\t}\n\n\tfunction getShaderPrefix(glsl) {\n\t  var SHADER_PREFIX = glsl.version + \"\\n    precision highp float;\\n    precision highp int;\\n    precision highp sampler2D;\\n    \" + glsl.varyingFs + \" vec2 resultUV;\\n    \" + glsl.defineOutput + \"\\n    const vec2 halfCR = vec2(0.5, 0.5);\\n\\n    struct ivec5\\n    {\\n      int x;\\n      int y;\\n      int z;\\n      int w;\\n      int u;\\n    };\\n\\n    struct ivec6\\n    {\\n      int x;\\n      int y;\\n      int z;\\n      int w;\\n      int u;\\n      int v;\\n    };\\n\\n    uniform float NAN;\\n    \" + glsl.defineSpecialNaN + \"\\n    \" + glsl.defineSpecialInf + \"\\n    \" + glsl.defineRound + \"\\n\\n    int imod(int x, int y) {\\n      return x - y * (x / y);\\n    }\\n\\n    int idiv(int a, int b, float sign) {\\n      int res = a / b;\\n      int mod = imod(a, b);\\n      if (sign < 0. && mod != 0) {\\n        res -= 1;\\n      }\\n      return res;\\n    }\\n\\n    //Based on the work of Dave Hoskins\\n    //https://www.shadertoy.com/view/4djSRW\\n    #define HASHSCALE1 443.8975\\n    float random(float seed){\\n      vec2 p = resultUV * seed;\\n      vec3 p3  = fract(vec3(p.xyx) * HASHSCALE1);\\n      p3 += dot(p3, p3.yzx + 19.19);\\n      return fract((p3.x + p3.y) * p3.z);\\n    }\\n\\n    \" + SAMPLE_1D_SNIPPET + \"\\n    \" + SAMPLE_2D_SNIPPET + \"\\n    \" + SAMPLE_3D_SNIPPET + \"\\n  \";\n\t  return SHADER_PREFIX;\n\t}\n\n\tvar SAMPLE_1D_SNIPPET = \"\\nvec2 uvFromFlat(int texNumR, int texNumC, int index) {\\n  int texR = index / texNumC;\\n  int texC = index - texR * texNumC;\\n  return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\\n}\\nvec2 packedUVfrom1D(int texNumR, int texNumC, int index) {\\n  int texelIndex = index / 2;\\n  int texR = texelIndex / texNumC;\\n  int texC = texelIndex - texR * texNumC;\\n  return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\\n}\\n\";\n\tvar SAMPLE_2D_SNIPPET = \"\\nvec2 packedUVfrom2D(int texelsInLogicalRow, int texNumR,\\n  int texNumC, int row, int col) {\\n  int texelIndex = (row / 2) * texelsInLogicalRow + (col / 2);\\n  int texR = texelIndex / texNumC;\\n  int texC = texelIndex - texR * texNumC;\\n  return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\\n}\\n\";\n\tvar SAMPLE_3D_SNIPPET = \"\\nvec2 packedUVfrom3D(int texNumR, int texNumC,\\n    int texelsInBatch, int texelsInLogicalRow, int b,\\n    int row, int col) {\\n  int index = b * texelsInBatch + (row / 2) * texelsInLogicalRow + (col / 2);\\n  int texR = index / texNumC;\\n  int texC = index - texR * texNumC;\\n  return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\\n}\\n\";\n\tvar SHADER_PACKED_PREFIX = \"\\n  float getChannel(vec4 frag, vec2 innerDims) {\\n    vec2 modCoord = mod(innerDims, 2.);\\n    return modCoord.x == 0. ?\\n      (modCoord.y == 0. ? frag.r : frag.g) :\\n      (modCoord.y == 0. ? frag.b : frag.a);\\n  }\\n  float getChannel(vec4 frag, int dim) {\\n    float modCoord = mod(float(dim), 2.);\\n    return modCoord == 0. ? frag.r : frag.g;\\n  }\\n\";\n\n\tfunction getOutputScalarCoords() {\n\t  return \"\\n    int getOutputCoords() {\\n      return 0;\\n    }\\n  \";\n\t}\n\n\tfunction getOutputPacked1DCoords(shape, texShape) {\n\t  var packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n\n\t  if (packedTexShape[0] === 1) {\n\t    return \"\\n      int getOutputCoords() {\\n        return 2 * int(resultUV.x * \" + packedTexShape[1] + \".0);\\n      }\\n    \";\n\t  }\n\n\t  if (packedTexShape[1] === 1) {\n\t    return \"\\n      int getOutputCoords() {\\n        return 2 * int(resultUV.y * \" + packedTexShape[0] + \".0);\\n      }\\n    \";\n\t  }\n\n\t  return \"\\n    int getOutputCoords() {\\n      ivec2 resTexRC = ivec2(resultUV.yx *\\n                             vec2(\" + packedTexShape[0] + \", \" + packedTexShape[1] + \"));\\n      return 2 * (resTexRC.x * \" + packedTexShape[1] + \" + resTexRC.y);\\n    }\\n  \";\n\t}\n\n\tfunction getOutput1DCoords(shape, texShape) {\n\t  if (texShape[0] === 1) {\n\t    return \"\\n      int getOutputCoords() {\\n        return int(resultUV.x * \" + texShape[1] + \".0);\\n      }\\n    \";\n\t  }\n\n\t  if (texShape[1] === 1) {\n\t    return \"\\n      int getOutputCoords() {\\n        return int(resultUV.y * \" + texShape[0] + \".0);\\n      }\\n    \";\n\t  }\n\n\t  return \"\\n    int getOutputCoords() {\\n      ivec2 resTexRC = ivec2(resultUV.yx *\\n                             vec2(\" + texShape[0] + \", \" + texShape[1] + \"));\\n      return resTexRC.x * \" + texShape[1] + \" + resTexRC.y;\\n    }\\n  \";\n\t}\n\n\tfunction getOutputPacked3DCoords(shape, texShape) {\n\t  var packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n\t  var texelsInLogicalRow = Math.ceil(shape[2] / 2);\n\t  var texelsInBatch = texelsInLogicalRow * Math.ceil(shape[1] / 2);\n\t  return \"\\n    ivec3 getOutputCoords() {\\n      ivec2 resTexRC = ivec2(resultUV.yx *\\n                             vec2(\" + packedTexShape[0] + \", \" + packedTexShape[1] + \"));\\n      int index = resTexRC.x * \" + packedTexShape[1] + \" + resTexRC.y;\\n\\n      int b = index / \" + texelsInBatch + \";\\n      index -= b * \" + texelsInBatch + \";\\n\\n      int r = 2 * (index / \" + texelsInLogicalRow + \");\\n      int c = imod(index, \" + texelsInLogicalRow + \") * 2;\\n\\n      return ivec3(b, r, c);\\n    }\\n  \";\n\t}\n\n\tfunction getOutput3DCoords(shape, texShape) {\n\t  var coordsFromIndexSnippet = getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd'], shape);\n\t  return \"\\n    ivec3 getOutputCoords() {\\n      ivec2 resTexRC = ivec2(resultUV.yx *\\n                             vec2(\" + texShape[0] + \", \" + texShape[1] + \"));\\n      int index = resTexRC.x * \" + texShape[1] + \" + resTexRC.y;\\n      \" + coordsFromIndexSnippet + \"\\n      return ivec3(r, c, d);\\n    }\\n  \";\n\t}\n\n\tfunction getOutputPackedNDCoords(shape, texShape) {\n\t  var packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n\t  var texelsInLogicalRow = Math.ceil(shape[shape.length - 1] / 2);\n\t  var texelsInBatch = texelsInLogicalRow * Math.ceil(shape[shape.length - 2] / 2);\n\t  var texelsInBatchN = texelsInBatch;\n\t  var batches = \"\";\n\t  var coords = 'b, r, c';\n\n\t  for (var b = 2; b < shape.length - 1; b++) {\n\t    texelsInBatchN *= shape[shape.length - b - 1];\n\t    batches = \"\\n      int b\" + b + \" = index / \" + texelsInBatchN + \";\\n      index -= b\" + b + \" * \" + texelsInBatchN + \";\\n    \" + batches;\n\t    coords = \"b\" + b + \", \" + coords;\n\t  }\n\n\t  return \"\\n    ivec\" + shape.length + \" getOutputCoords() {\\n      ivec2 resTexRC = ivec2(resultUV.yx *\\n                             vec2(\" + packedTexShape[0] + \", \" + packedTexShape[1] + \"));\\n      int index = resTexRC.x * \" + packedTexShape[1] + \" + resTexRC.y;\\n\\n      \" + batches + \"\\n\\n      int b = index / \" + texelsInBatch + \";\\n      index -= b * \" + texelsInBatch + \";\\n\\n      int r = 2 * (index / \" + texelsInLogicalRow + \");\\n      int c = imod(index, \" + texelsInLogicalRow + \") * 2;\\n\\n      return ivec\" + shape.length + \"(\" + coords + \");\\n    }\\n  \";\n\t}\n\n\tfunction getOutput4DCoords(shape, texShape) {\n\t  var coordsFromIndexSnippet = getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd', 'd2'], shape);\n\t  return \"\\n    ivec4 getOutputCoords() {\\n      ivec2 resTexRC = ivec2(resultUV.yx *\\n        vec2(\" + texShape[0] + \", \" + texShape[1] + \"));\\n      int index = resTexRC.x * \" + texShape[1] + \" + resTexRC.y;\\n      \" + coordsFromIndexSnippet + \"\\n      return ivec4(r, c, d, d2);\\n    }\\n  \";\n\t}\n\n\tfunction getOutput5DCoords(shape, texShape) {\n\t  var coordsFromIndexSnippet = getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd', 'd2', 'd3'], shape);\n\t  return \"\\n    ivec5 getOutputCoords() {\\n      ivec2 resTexRC = ivec2(resultUV.yx * vec2(\" + texShape[0] + \",\\n                             \" + texShape[1] + \"));\\n\\n      int index = resTexRC.x * \" + texShape[1] + \" + resTexRC.y;\\n\\n      \" + coordsFromIndexSnippet + \"\\n\\n      ivec5 outShape = ivec5(r, c, d, d2, d3);\\n      return outShape;\\n    }\\n  \";\n\t}\n\n\tfunction getOutput6DCoords(shape, texShape) {\n\t  var coordsFromIndexSnippet = getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd', 'd2', 'd3', 'd4'], shape);\n\t  return \"\\n    ivec6 getOutputCoords() {\\n      ivec2 resTexRC = ivec2(resultUV.yx *\\n        vec2(\" + texShape[0] + \", \" + texShape[1] + \"));\\n      int index = resTexRC.x * \" + texShape[1] + \" + resTexRC.y;\\n\\n      \" + coordsFromIndexSnippet + \"\\n\\n      ivec6 result = ivec6(r, c, d, d2, d3, d4);\\n      return result;\\n    }\\n  \";\n\t}\n\n\tfunction getOutputPacked2DCoords(shape, texShape) {\n\t  var packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n\n\t  if (arraysEqual(shape, texShape)) {\n\t    return \"\\n      ivec2 getOutputCoords() {\\n        return 2 * ivec2(resultUV.yx * vec2(\" + packedTexShape[0] + \", \" + packedTexShape[1] + \"));\\n      }\\n    \";\n\t  } // texels needed to accommodate a logical row\n\n\n\t  var texelsInLogicalRow = Math.ceil(shape[1] / 2);\n\t  /**\n\t   * getOutputCoords\n\t   *\n\t   * resTexRC: The rows and columns of the texels. If you move over one\n\t   * texel to the right in the packed texture, you are moving over one column\n\t   * (not two).\n\t   *\n\t   * index: The texel index\n\t   */\n\n\t  return \"\\n    ivec2 getOutputCoords() {\\n      ivec2 resTexRC = ivec2(resultUV.yx *\\n                             vec2(\" + packedTexShape[0] + \", \" + packedTexShape[1] + \"));\\n\\n      int index = resTexRC.x * \" + packedTexShape[1] + \" + resTexRC.y;\\n      int r = 2 * (index / \" + texelsInLogicalRow + \");\\n      int c = imod(index, \" + texelsInLogicalRow + \") * 2;\\n\\n      return ivec2(r, c);\\n    }\\n  \";\n\t}\n\n\tfunction getOutput2DCoords(shape, texShape) {\n\t  if (arraysEqual(shape, texShape)) {\n\t    return \"\\n      ivec2 getOutputCoords() {\\n        return ivec2(resultUV.yx * vec2(\" + texShape[0] + \", \" + texShape[1] + \"));\\n      }\\n    \";\n\t  }\n\n\t  if (shape[1] === 1) {\n\t    return \"\\n      ivec2 getOutputCoords() {\\n        ivec2 resTexRC = ivec2(resultUV.yx *\\n                               vec2(\" + texShape[0] + \", \" + texShape[1] + \"));\\n        int index = resTexRC.x * \" + texShape[1] + \" + resTexRC.y;\\n        return ivec2(index, 0);\\n      }\\n    \";\n\t  }\n\n\t  if (shape[0] === 1) {\n\t    return \"\\n      ivec2 getOutputCoords() {\\n        ivec2 resTexRC = ivec2(resultUV.yx *\\n                               vec2(\" + texShape[0] + \", \" + texShape[1] + \"));\\n        int index = resTexRC.x * \" + texShape[1] + \" + resTexRC.y;\\n        return ivec2(0, index);\\n      }\\n    \";\n\t  }\n\n\t  return \"\\n    ivec2 getOutputCoords() {\\n      ivec2 resTexRC = ivec2(resultUV.yx *\\n                             vec2(\" + texShape[0] + \", \" + texShape[1] + \"));\\n      int index = resTexRC.x * \" + texShape[1] + \" + resTexRC.y;\\n      int r = index / \" + shape[1] + \";\\n      int c = index - r * \" + shape[1] + \";\\n      return ivec2(r, c);\\n    }\\n  \";\n\t}\n\n\tfunction getFlatOffsetUniformName(texName) {\n\t  return \"offset\" + texName;\n\t}\n\n\tfunction getPackedSamplerScalar(inputInfo) {\n\t  var texName = inputInfo.name;\n\t  var funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n\t  var glsl = getGlslDifferences();\n\t  return \"\\n    vec4 \" + funcName + \"() {\\n      return \" + glsl.texture2D + \"(\" + texName + \", halfCR);\\n    }\\n  \";\n\t}\n\n\tfunction getSamplerScalar(inputInfo) {\n\t  var texName = inputInfo.name;\n\t  var funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n\n\t  if (inputInfo.shapeInfo.isUniform) {\n\t    return \"float \" + funcName + \"() {return \" + texName + \";}\";\n\t  }\n\n\t  var _inputInfo$shapeInfo$ = inputInfo.shapeInfo.texShape,\n\t      texNumR = _inputInfo$shapeInfo$[0],\n\t      texNumC = _inputInfo$shapeInfo$[1];\n\n\t  if (texNumR === 1 && texNumC === 1) {\n\t    return \"\\n      float \" + funcName + \"() {\\n        return sampleTexture(\" + texName + \", halfCR);\\n      }\\n    \";\n\t  }\n\n\t  var _inputInfo$shapeInfo$2 = inputInfo.shapeInfo.texShape,\n\t      tNumR = _inputInfo$shapeInfo$2[0],\n\t      tNumC = _inputInfo$shapeInfo$2[1];\n\t  var offset = getFlatOffsetUniformName(texName);\n\t  return \"\\n    float \" + funcName + \"() {\\n      vec2 uv = uvFromFlat(\" + tNumR + \", \" + tNumC + \", \" + offset + \");\\n      return sampleTexture(\" + texName + \", uv);\\n    }\\n  \";\n\t}\n\n\tfunction getPackedSampler1D(inputInfo) {\n\t  var texName = inputInfo.name;\n\t  var funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n\t  var texShape = inputInfo.shapeInfo.texShape;\n\t  var packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n\t  var glsl = getGlslDifferences();\n\t  return \"\\n    vec4 \" + funcName + \"(int index) {\\n      vec2 uv = packedUVfrom1D(\\n        \" + packedTexShape[0] + \", \" + packedTexShape[1] + \", index);\\n      return \" + glsl.texture2D + \"(\" + texName + \", uv);\\n    }\\n  \";\n\t}\n\n\tfunction getSampler1D(inputInfo) {\n\t  var texName = inputInfo.name;\n\t  var funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n\n\t  if (inputInfo.shapeInfo.isUniform) {\n\t    // Uniform arrays will be less than 65505 (no risk of float16 overflow).\n\t    return \"\\n      float \" + funcName + \"(int index) {\\n        \" + getUniformSampler(inputInfo) + \"\\n      }\\n    \";\n\t  }\n\n\t  var texShape = inputInfo.shapeInfo.texShape;\n\t  var tNumR = texShape[0];\n\t  var tNumC = texShape[1];\n\n\t  if (tNumC === 1 && tNumR === 1) {\n\t    return \"\\n      float \" + funcName + \"(int index) {\\n        return sampleTexture(\" + texName + \", halfCR);\\n      }\\n    \";\n\t  }\n\n\t  var offset = getFlatOffsetUniformName(texName);\n\n\t  if (tNumC === 1) {\n\t    return \"\\n      float \" + funcName + \"(int index) {\\n        vec2 uv = vec2(0.5, (float(index + \" + offset + \") + 0.5) / \" + tNumR + \".0);\\n        return sampleTexture(\" + texName + \", uv);\\n      }\\n    \";\n\t  }\n\n\t  if (tNumR === 1) {\n\t    return \"\\n      float \" + funcName + \"(int index) {\\n        vec2 uv = vec2((float(index + \" + offset + \") + 0.5) / \" + tNumC + \".0, 0.5);\\n        return sampleTexture(\" + texName + \", uv);\\n      }\\n    \";\n\t  }\n\n\t  return \"\\n    float \" + funcName + \"(int index) {\\n      vec2 uv = uvFromFlat(\" + tNumR + \", \" + tNumC + \", index + \" + offset + \");\\n      return sampleTexture(\" + texName + \", uv);\\n    }\\n  \";\n\t}\n\n\tfunction getPackedSampler2D(inputInfo) {\n\t  var shape = inputInfo.shapeInfo.logicalShape;\n\t  var texName = inputInfo.name;\n\t  var funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n\t  var texShape = inputInfo.shapeInfo.texShape;\n\t  var texNumR = texShape[0];\n\t  var texNumC = texShape[1];\n\t  var glsl = getGlslDifferences();\n\n\t  if (texShape != null && arraysEqual(shape, texShape)) {\n\t    return \"\\n      vec4 \" + funcName + \"(int row, int col) {\\n        vec2 uv = (vec2(col, row) + halfCR) / vec2(\" + texNumC + \".0, \" + texNumR + \".0);\\n\\n        return \" + glsl.texture2D + \"(\" + texName + \", uv);\\n      }\\n    \";\n\t  }\n\n\t  var packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n\t  var valuesPerRow = Math.ceil(shape[1] / 2);\n\t  return \"\\n    vec4 \" + funcName + \"(int row, int col) {\\n      vec2 uv = packedUVfrom2D(\" + valuesPerRow + \", \" + packedTexShape[0] + \", \" + packedTexShape[1] + \", row, col);\\n      return \" + glsl.texture2D + \"(\" + texName + \", uv);\\n    }\\n  \";\n\t}\n\n\tfunction getSampler2D(inputInfo) {\n\t  var shape = inputInfo.shapeInfo.logicalShape;\n\t  var texName = inputInfo.name;\n\t  var funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n\t  var texShape = inputInfo.shapeInfo.texShape;\n\n\t  if (texShape != null && arraysEqual(shape, texShape)) {\n\t    var _texNumR = texShape[0];\n\t    var _texNumC = texShape[1];\n\t    return \"\\n    float \" + funcName + \"(int row, int col) {\\n      vec2 uv = (vec2(col, row) + halfCR) / vec2(\" + _texNumC + \".0, \" + _texNumR + \".0);\\n      return sampleTexture(\" + texName + \", uv);\\n    }\\n  \";\n\t  }\n\n\t  var _util$squeezeShape = squeezeShape(shape),\n\t      newShape = _util$squeezeShape.newShape,\n\t      keptDims = _util$squeezeShape.keptDims;\n\n\t  var squeezedShape = newShape;\n\n\t  if (squeezedShape.length < shape.length) {\n\t    var newInputInfo = squeezeInputInfo(inputInfo, squeezedShape);\n\t    var params = ['row', 'col'];\n\t    return \"\\n      \" + getSamplerFromInInfo(newInputInfo) + \"\\n      float \" + funcName + \"(int row, int col) {\\n        return \" + funcName + \"(\" + getSqueezedParams(params, keptDims) + \");\\n      }\\n    \";\n\t  }\n\n\t  if (inputInfo.shapeInfo.isUniform) {\n\t    // Uniform arrays will be less than 65505 (no risk of float16 overflow).\n\t    return \"\\n      float \" + funcName + \"(int row, int col) {\\n        int index = round(dot(vec2(row, col), vec2(\" + shape[1] + \", 1)));\\n        \" + getUniformSampler(inputInfo) + \"\\n      }\\n    \";\n\t  }\n\n\t  var texNumR = texShape[0];\n\t  var texNumC = texShape[1];\n\t  var offset = getFlatOffsetUniformName(texName);\n\n\t  if (texNumC === 1) {\n\t    // index is used directly as physical (no risk of float16 overflow).\n\t    return \"\\n    float \" + funcName + \"(int row, int col) {\\n      float index = dot(vec3(row, col, \" + offset + \"), vec3(\" + shape[1] + \", 1, 1));\\n      vec2 uv = vec2(0.5, (index + 0.5) / \" + texNumR + \".0);\\n      return sampleTexture(\" + texName + \", uv);\\n    }\\n  \";\n\t  }\n\n\t  if (texNumR === 1) {\n\t    // index is used directly as physical (no risk of float16 overflow).\n\t    return \"\\n    float \" + funcName + \"(int row, int col) {\\n      float index = dot(vec3(row, col, \" + offset + \"), vec3(\" + shape[1] + \", 1, 1));\\n      vec2 uv = vec2((index + 0.5) / \" + texNumC + \".0, 0.5);\\n      return sampleTexture(\" + texName + \", uv);\\n    }\\n  \";\n\t  }\n\n\t  return \"\\n  float \" + funcName + \"(int row, int col) {\\n    // Explicitly use integer operations as dot() only works on floats.\\n    int index = row * \" + shape[1] + \" + col + \" + offset + \";\\n    vec2 uv = uvFromFlat(\" + texNumR + \", \" + texNumC + \", index);\\n    return sampleTexture(\" + texName + \", uv);\\n  }\\n\";\n\t}\n\n\tfunction getPackedSampler3D(inputInfo) {\n\t  var shape = inputInfo.shapeInfo.logicalShape;\n\t  var texName = inputInfo.name;\n\t  var funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n\t  var texShape = inputInfo.shapeInfo.texShape;\n\t  var packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n\n\t  if (shape[0] === 1) {\n\t    var squeezedShape = shape.slice(1);\n\t    var keptDims = [1, 2];\n\t    var newInputInfo = squeezeInputInfo(inputInfo, squeezedShape);\n\t    var params = ['b', 'row', 'col'];\n\t    return \"\\n        \" + getPackedSamplerFromInInfo(newInputInfo) + \"\\n        vec4 \" + funcName + \"(int b, int row, int col) {\\n          return \" + funcName + \"(\" + getSqueezedParams(params, keptDims) + \");\\n        }\\n      \";\n\t  }\n\n\t  var texNumR = packedTexShape[0];\n\t  var texNumC = packedTexShape[1];\n\t  var valuesPerRow = Math.ceil(shape[2] / 2);\n\t  var texelsInBatch = valuesPerRow * Math.ceil(shape[1] / 2);\n\t  var glsl = getGlslDifferences();\n\t  return \"\\n    vec4 \" + funcName + \"(int b, int row, int col) {\\n      vec2 uv = packedUVfrom3D(\\n        \" + texNumR + \", \" + texNumC + \", \" + texelsInBatch + \", \" + valuesPerRow + \", b, row, col);\\n      return \" + glsl.texture2D + \"(\" + texName + \", uv);\\n    }\\n  \";\n\t}\n\n\tfunction getSampler3D(inputInfo) {\n\t  var shape = inputInfo.shapeInfo.logicalShape;\n\t  var texName = inputInfo.name;\n\t  var funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n\t  var stride0 = shape[1] * shape[2];\n\t  var stride1 = shape[2];\n\n\t  var _util$squeezeShape2 = squeezeShape(shape),\n\t      newShape = _util$squeezeShape2.newShape,\n\t      keptDims = _util$squeezeShape2.keptDims;\n\n\t  var squeezedShape = newShape;\n\n\t  if (squeezedShape.length < shape.length) {\n\t    var newInputInfo = squeezeInputInfo(inputInfo, squeezedShape);\n\t    var params = ['row', 'col', 'depth'];\n\t    return \"\\n        \" + getSamplerFromInInfo(newInputInfo) + \"\\n        float \" + funcName + \"(int row, int col, int depth) {\\n          return \" + funcName + \"(\" + getSqueezedParams(params, keptDims) + \");\\n        }\\n      \";\n\t  }\n\n\t  if (inputInfo.shapeInfo.isUniform) {\n\t    // Uniform arrays will be less than 65505 (no risk of float16 overflow).\n\t    return \"\\n      float \" + funcName + \"(int row, int col, int depth) {\\n        int index = round(dot(vec3(row, col, depth),\\n                          vec3(\" + stride0 + \", \" + stride1 + \", 1)));\\n        \" + getUniformSampler(inputInfo) + \"\\n      }\\n    \";\n\t  }\n\n\t  var texShape = inputInfo.shapeInfo.texShape;\n\t  var texNumR = texShape[0];\n\t  var texNumC = texShape[1];\n\t  var flatOffset = inputInfo.shapeInfo.flatOffset;\n\n\t  if (texNumC === stride0 && flatOffset == null) {\n\t    // texC is used directly as physical (no risk of float16 overflow).\n\t    return \"\\n        float \" + funcName + \"(int row, int col, int depth) {\\n          float texR = float(row);\\n          float texC = dot(vec2(col, depth), vec2(\" + stride1 + \", 1));\\n          vec2 uv = (vec2(texC, texR) + halfCR) /\\n                     vec2(\" + texNumC + \".0, \" + texNumR + \".0);\\n          return sampleTexture(\" + texName + \", uv);\\n        }\\n      \";\n\t  }\n\n\t  if (texNumC === stride1 && flatOffset == null) {\n\t    // texR is used directly as physical (no risk of float16 overflow).\n\t    return \"\\n    float \" + funcName + \"(int row, int col, int depth) {\\n      float texR = dot(vec2(row, col), vec2(\" + shape[1] + \", 1));\\n      float texC = float(depth);\\n      vec2 uv = (vec2(texC, texR) + halfCR) / vec2(\" + texNumC + \".0, \" + texNumR + \".0);\\n      return sampleTexture(\" + texName + \", uv);\\n    }\\n  \";\n\t  }\n\n\t  var offset = getFlatOffsetUniformName(texName);\n\t  return \"\\n      float \" + funcName + \"(int row, int col, int depth) {\\n        // Explicitly use integer operations as dot() only works on floats.\\n        int index = row * \" + stride0 + \" + col * \" + stride1 + \" + depth + \" + offset + \";\\n        vec2 uv = uvFromFlat(\" + texNumR + \", \" + texNumC + \", index);\\n        return sampleTexture(\" + texName + \", uv);\\n      }\\n  \";\n\t}\n\n\tfunction getPackedSamplerND(inputInfo) {\n\t  var shape = inputInfo.shapeInfo.logicalShape;\n\t  var rank = shape.length;\n\t  var texName = inputInfo.name;\n\t  var funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n\t  var texShape = inputInfo.shapeInfo.texShape;\n\t  var packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n\t  var texNumR = packedTexShape[0];\n\t  var texNumC = packedTexShape[1];\n\t  var valuesPerRow = Math.ceil(shape[rank - 1] / 2);\n\t  var texelsInBatch = valuesPerRow * Math.ceil(shape[rank - 2] / 2);\n\t  var params = \"int b, int row, int col\";\n\t  var index = \"b * \" + texelsInBatch + \" + (row / 2) * \" + valuesPerRow + \" + (col / 2)\";\n\n\t  for (var b = 2; b < rank - 1; b++) {\n\t    params = \"int b\" + b + \", \" + params;\n\t    texelsInBatch *= shape[rank - b - 1];\n\t    index = \"b\" + b + \" * \" + texelsInBatch + \" + \" + index;\n\t  }\n\n\t  var glsl = getGlslDifferences();\n\t  return \"\\n    vec4 \" + funcName + \"(\" + params + \") {\\n      int index = \" + index + \";\\n      int texR = index / \" + texNumC + \";\\n      int texC = index - texR * \" + texNumC + \";\\n      vec2 uv = (vec2(texC, texR) + halfCR) / vec2(\" + texNumC + \", \" + texNumR + \");\\n      return \" + glsl.texture2D + \"(\" + texName + \", uv);\\n    }\\n  \";\n\t}\n\n\tfunction getSampler4D(inputInfo) {\n\t  var shape = inputInfo.shapeInfo.logicalShape;\n\t  var texName = inputInfo.name;\n\t  var funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n\t  var stride2 = shape[3];\n\t  var stride1 = shape[2] * stride2;\n\t  var stride0 = shape[1] * stride1;\n\n\t  var _util$squeezeShape3 = squeezeShape(shape),\n\t      newShape = _util$squeezeShape3.newShape,\n\t      keptDims = _util$squeezeShape3.keptDims;\n\n\t  if (newShape.length < shape.length) {\n\t    var newInputInfo = squeezeInputInfo(inputInfo, newShape);\n\t    var params = ['row', 'col', 'depth', 'depth2'];\n\t    return \"\\n      \" + getSamplerFromInInfo(newInputInfo) + \"\\n      float \" + funcName + \"(int row, int col, int depth, int depth2) {\\n        return \" + funcName + \"(\" + getSqueezedParams(params, keptDims) + \");\\n      }\\n    \";\n\t  }\n\n\t  if (inputInfo.shapeInfo.isUniform) {\n\t    // Uniform arrays will be less than 65505 (no risk of float16 overflow).\n\t    return \"\\n      float \" + funcName + \"(int row, int col, int depth, int depth2) {\\n        int index = round(dot(vec4(row, col, depth, depth2),\\n                          vec4(\" + stride0 + \", \" + stride1 + \", \" + stride2 + \", 1)));\\n        \" + getUniformSampler(inputInfo) + \"\\n      }\\n    \";\n\t  }\n\n\t  var flatOffset = inputInfo.shapeInfo.flatOffset;\n\t  var texShape = inputInfo.shapeInfo.texShape;\n\t  var texNumR = texShape[0];\n\t  var texNumC = texShape[1];\n\n\t  if (texNumC === stride0 && flatOffset == null) {\n\t    // texC is used directly as physical (no risk of float16 overflow).\n\t    return \"\\n      float \" + funcName + \"(int row, int col, int depth, int depth2) {\\n        float texR = float(row);\\n        float texC =\\n            dot(vec3(col, depth, depth2),\\n                vec3(\" + stride1 + \", \" + stride2 + \", 1));\\n        vec2 uv = (vec2(texC, texR) + halfCR) /\\n                   vec2(\" + texNumC + \".0, \" + texNumR + \".0);\\n        return sampleTexture(\" + texName + \", uv);\\n      }\\n    \";\n\t  }\n\n\t  if (texNumC === stride2 && flatOffset == null) {\n\t    // texR is used directly as physical (no risk of float16 overflow).\n\t    return \"\\n      float \" + funcName + \"(int row, int col, int depth, int depth2) {\\n        float texR = dot(vec3(row, col, depth),\\n                         vec3(\" + shape[1] * shape[2] + \", \" + shape[2] + \", 1));\\n        float texC = float(depth2);\\n        vec2 uv = (vec2(texC, texR) + halfCR) /\\n                  vec2(\" + texNumC + \".0, \" + texNumR + \".0);\\n        return sampleTexture(\" + texName + \", uv);\\n      }\\n    \";\n\t  }\n\n\t  var offset = getFlatOffsetUniformName(texName);\n\t  return \"\\n    float \" + funcName + \"(int row, int col, int depth, int depth2) {\\n      // Explicitly use integer operations as dot() only works on floats.\\n      int index = row * \" + stride0 + \" + col * \" + stride1 + \" +\\n          depth * \" + stride2 + \" + depth2;\\n      vec2 uv = uvFromFlat(\" + texNumR + \", \" + texNumC + \", index + \" + offset + \");\\n      return sampleTexture(\" + texName + \", uv);\\n    }\\n  \";\n\t}\n\n\tfunction getSampler5D(inputInfo) {\n\t  var shape = inputInfo.shapeInfo.logicalShape;\n\t  var texName = inputInfo.name;\n\t  var funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n\t  var stride3 = shape[4];\n\t  var stride2 = shape[3] * stride3;\n\t  var stride1 = shape[2] * stride2;\n\t  var stride0 = shape[1] * stride1;\n\n\t  var _util$squeezeShape4 = squeezeShape(shape),\n\t      newShape = _util$squeezeShape4.newShape,\n\t      keptDims = _util$squeezeShape4.keptDims;\n\n\t  if (newShape.length < shape.length) {\n\t    var newInputInfo = squeezeInputInfo(inputInfo, newShape);\n\t    var params = ['row', 'col', 'depth', 'depth2', 'depth3'];\n\t    return \"\\n      \" + getSamplerFromInInfo(newInputInfo) + \"\\n      float \" + funcName + \"(int row, int col, int depth, int depth2, int depth3) {\\n        return \" + funcName + \"(\" + getSqueezedParams(params, keptDims) + \");\\n      }\\n    \";\n\t  }\n\n\t  if (inputInfo.shapeInfo.isUniform) {\n\t    // Uniform arrays will be less than 65505 (no risk of float16 overflow).\n\t    return \"\\n      float \" + funcName + \"(int row, int col, int depth, int depth2, int depth3) {\\n        float index = dot(\\n          vec4(row, col, depth, depth2),\\n          vec4(\" + stride0 + \", \" + stride1 + \", \" + stride2 + \", \" + stride3 + \")) +\\n          depth3;\\n        \" + getUniformSampler(inputInfo) + \"\\n      }\\n    \";\n\t  }\n\n\t  var flatOffset = inputInfo.shapeInfo.flatOffset;\n\t  var texShape = inputInfo.shapeInfo.texShape;\n\t  var texNumR = texShape[0];\n\t  var texNumC = texShape[1];\n\n\t  if (texNumC === stride0 && flatOffset == null) {\n\t    // texC is used directly as physical (no risk of float16 overflow).\n\t    return \"\\n      float \" + funcName + \"(int row, int col, int depth, int depth2, int depth3) {\\n        int texR = row;\\n        float texC = dot(vec4(col, depth, depth2, depth3),\\n                         vec4(\" + stride1 + \", \" + stride2 + \", \" + stride3 + \", 1));\\n        vec2 uv = (vec2(texC, texR) + halfCR) /\\n                   vec2(\" + texNumC + \".0, \" + texNumR + \".0);\\n        return sampleTexture(\" + texName + \", uv);\\n      }\\n    \";\n\t  }\n\n\t  if (texNumC === stride3 && flatOffset == null) {\n\t    // texR is used directly as physical (no risk of float16 overflow).\n\t    return \"\\n      float \" + funcName + \"(int row, int col, int depth, int depth2, int depth3) {\\n        float texR = dot(\\n          vec4(row, col, depth, depth2),\\n          vec4(\" + shape[1] * shape[2] * shape[3] + \",\\n               \" + shape[2] * shape[3] + \", \" + shape[3] + \", 1));\\n        int texC = depth3;\\n        vec2 uv = (vec2(texC, texR) + halfCR) /\\n                  vec2(\" + texNumC + \".0, \" + texNumR + \".0);\\n        return sampleTexture(\" + texName + \", uv);\\n      }\\n    \";\n\t  }\n\n\t  var offset = getFlatOffsetUniformName(texName);\n\t  return \"\\n    float \" + funcName + \"(int row, int col, int depth, int depth2, int depth3) {\\n      // Explicitly use integer operations as dot() only works on floats.\\n      int index = row * \" + stride0 + \" + col * \" + stride1 + \" + depth * \" + stride2 + \" +\\n          depth2 * \" + stride3 + \" + depth3 + \" + offset + \";\\n      vec2 uv = uvFromFlat(\" + texNumR + \", \" + texNumC + \", index);\\n      return sampleTexture(\" + texName + \", uv);\\n    }\\n  \";\n\t}\n\n\tfunction getSampler6D(inputInfo) {\n\t  var shape = inputInfo.shapeInfo.logicalShape;\n\t  var texName = inputInfo.name;\n\t  var funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n\n\t  var _util$squeezeShape5 = squeezeShape(shape),\n\t      newShape = _util$squeezeShape5.newShape,\n\t      keptDims = _util$squeezeShape5.keptDims;\n\n\t  if (newShape.length < shape.length) {\n\t    var newInputInfo = squeezeInputInfo(inputInfo, newShape);\n\t    var params = ['row', 'col', 'depth', 'depth2', 'depth3', 'depth4'];\n\t    return \"\\n      \" + getSamplerFromInInfo(newInputInfo) + \"\\n      float \" + funcName + \"(int row, int col, int depth,\\n                    int depth2, int depth3, int depth4) {\\n        return \" + funcName + \"(\" + getSqueezedParams(params, keptDims) + \");\\n      }\\n    \";\n\t  }\n\n\t  var stride4 = shape[5];\n\t  var stride3 = shape[4] * stride4;\n\t  var stride2 = shape[3] * stride3;\n\t  var stride1 = shape[2] * stride2;\n\t  var stride0 = shape[1] * stride1;\n\n\t  if (inputInfo.shapeInfo.isUniform) {\n\t    // Uniform arrays will be less than 65505 (no risk of float16 overflow).\n\t    return \"\\n      float \" + funcName + \"(int row, int col, int depth,\\n                  int depth2, int depth3, int depth4) {\\n        int index = round(dot(\\n          vec4(row, col, depth, depth2),\\n          vec4(\" + stride0 + \", \" + stride1 + \", \" + stride2 + \", \" + stride3 + \")) +\\n          dot(\\n            vec2(depth3, depth4),\\n            vec2(\" + stride4 + \", 1)));\\n        \" + getUniformSampler(inputInfo) + \"\\n      }\\n    \";\n\t  }\n\n\t  var flatOffset = inputInfo.shapeInfo.flatOffset;\n\t  var texShape = inputInfo.shapeInfo.texShape;\n\t  var texNumR = texShape[0];\n\t  var texNumC = texShape[1];\n\n\t  if (texNumC === stride0 && flatOffset == null) {\n\t    // texC is used directly as physical (no risk of float16 overflow).\n\t    return \"\\n      float \" + funcName + \"(int row, int col, int depth,\\n                    int depth2, int depth3, int depth4) {\\n        int texR = row;\\n        float texC = dot(vec4(col, depth, depth2, depth3),\\n          vec4(\" + stride1 + \", \" + stride2 + \", \" + stride3 + \", \" + stride4 + \")) +\\n               float(depth4);\\n        vec2 uv = (vec2(texC, texR) + halfCR) /\\n                   vec2(\" + texNumC + \".0, \" + texNumR + \".0);\\n        return sampleTexture(\" + texName + \", uv);\\n      }\\n    \";\n\t  }\n\n\t  if (texNumC === stride4 && flatOffset == null) {\n\t    // texR is used directly as physical (no risk of float16 overflow).\n\t    return \"\\n      float \" + funcName + \"(int row, int col, int depth,\\n                    int depth2, int depth3, int depth4) {\\n        float texR = dot(vec4(row, col, depth, depth2),\\n          vec4(\" + shape[1] * shape[2] * shape[3] * shape[4] + \",\\n               \" + shape[2] * shape[3] * shape[4] + \",\\n               \" + shape[3] * shape[4] + \",\\n               \" + shape[4] + \")) + float(depth3);\\n        int texC = depth4;\\n        vec2 uv = (vec2(texC, texR) + halfCR) /\\n                  vec2(\" + texNumC + \".0, \" + texNumR + \".0);\\n        return sampleTexture(\" + texName + \", uv);\\n      }\\n    \";\n\t  }\n\n\t  var offset = getFlatOffsetUniformName(texName);\n\t  return \"\\n    float \" + funcName + \"(int row, int col, int depth,\\n                  int depth2, int depth3, int depth4) {\\n      // Explicitly use integer operations as dot() only works on floats.\\n      int index = row * \" + stride0 + \" + col * \" + stride1 + \" + depth * \" + stride2 + \" +\\n          depth2 * \" + stride3 + \" + depth3 * \" + stride4 + \" + depth4 + \" + offset + \";\\n      vec2 uv = uvFromFlat(\" + texNumR + \", \" + texNumC + \", index);\\n      return sampleTexture(\" + texName + \", uv);\\n    }\\n  \";\n\t}\n\n\tfunction getUniformSampler(inputInfo) {\n\t  var texName = inputInfo.name;\n\t  var inSize = sizeFromShape(inputInfo.shapeInfo.logicalShape);\n\n\t  if (inSize < 2) {\n\t    return \"return \" + texName + \";\";\n\t  }\n\n\t  return \"\\n    for (int i = 0; i < \" + inSize + \"; i++) {\\n      if (i == index) {\\n        return \" + texName + \"[i];\\n      }\\n    }\\n  \";\n\t}\n\n\tfunction getPackedSamplerAtOutputCoords(inputInfo, outShapeInfo) {\n\t  var texName = inputInfo.name;\n\t  var texFuncSnippet = texName.charAt(0).toUpperCase() + texName.slice(1);\n\t  var funcName = 'get' + texFuncSnippet + 'AtOutCoords';\n\t  var inRank = inputInfo.shapeInfo.logicalShape.length;\n\t  var outRank = outShapeInfo.logicalShape.length;\n\t  var broadcastDims = getBroadcastDims$1(inputInfo.shapeInfo.logicalShape, outShapeInfo.logicalShape);\n\t  var type = getCoordsDataType(outRank);\n\t  var rankDiff = outRank - inRank;\n\t  var coordsSnippet;\n\t  var fields = ['x', 'y', 'z', 'w', 'u', 'v'];\n\n\t  if (inRank === 0) {\n\t    coordsSnippet = '';\n\t  } else if (outRank < 2 && broadcastDims.length >= 1) {\n\t    coordsSnippet = 'coords = 0;';\n\t  } else {\n\t    coordsSnippet = broadcastDims.map(function (d) {\n\t      return \"coords.\" + fields[d + rankDiff] + \" = 0;\";\n\t    }).join('\\n');\n\t  }\n\n\t  var unpackedCoordsSnippet = '';\n\n\t  if (outRank < 2 && inRank > 0) {\n\t    unpackedCoordsSnippet = 'coords';\n\t  } else {\n\t    unpackedCoordsSnippet = inputInfo.shapeInfo.logicalShape.map(function (s, i) {\n\t      return \"coords.\" + fields[i + rankDiff];\n\t    }).join(', ');\n\t  }\n\n\t  var output = \"return outputValue;\";\n\t  var inSize = sizeFromShape(inputInfo.shapeInfo.logicalShape);\n\t  var isInputScalar = inSize === 1;\n\t  var outSize = sizeFromShape(outShapeInfo.logicalShape);\n\t  var isOutputScalar = outSize === 1;\n\n\t  if (inRank === 1 && !isInputScalar && !isOutputScalar) {\n\t    output = \"\\n      return vec4(outputValue.xy, outputValue.xy);\\n    \";\n\t  } else if (isInputScalar && !isOutputScalar) {\n\t    if (outRank === 1) {\n\t      output = \"\\n        return vec4(outputValue.x, outputValue.x, 0., 0.);\\n      \";\n\t    } else {\n\t      output = \"\\n        return vec4(outputValue.x);\\n      \";\n\t    }\n\t  } else if (broadcastDims.length) {\n\t    var rows = inRank - 2;\n\t    var cols = inRank - 1;\n\n\t    if (broadcastDims.indexOf(rows) > -1 && broadcastDims.indexOf(cols) > -1) {\n\t      output = \"return vec4(outputValue.x);\";\n\t    } else if (broadcastDims.indexOf(rows) > -1) {\n\t      output = \"return vec4(outputValue.x, outputValue.y, \" + \"outputValue.x, outputValue.y);\";\n\t    } else if (broadcastDims.indexOf(cols) > -1) {\n\t      output = \"return vec4(outputValue.xx, outputValue.zz);\";\n\t    }\n\t  }\n\n\t  return \"\\n    vec4 \" + funcName + \"() {\\n      \" + type + \" coords = getOutputCoords();\\n      \" + coordsSnippet + \"\\n      vec4 outputValue = get\" + texFuncSnippet + \"(\" + unpackedCoordsSnippet + \");\\n      \" + output + \"\\n    }\\n  \";\n\t}\n\n\tfunction getSamplerAtOutputCoords(inputInfo, outShapeInfo) {\n\t  var texName = inputInfo.name;\n\t  var texFuncSnippet = texName.charAt(0).toUpperCase() + texName.slice(1);\n\t  var funcName = 'get' + texFuncSnippet + 'AtOutCoords';\n\t  var outTexShape = outShapeInfo.texShape;\n\t  var inTexShape = inputInfo.shapeInfo.texShape;\n\t  var inRank = inputInfo.shapeInfo.logicalShape.length;\n\t  var outRank = outShapeInfo.logicalShape.length;\n\n\t  if (!inputInfo.shapeInfo.isUniform && inRank === outRank && inputInfo.shapeInfo.flatOffset == null && arraysEqual(inTexShape, outTexShape)) {\n\t    return \"\\n      float \" + funcName + \"() {\\n        return sampleTexture(\" + texName + \", resultUV);\\n      }\\n    \";\n\t  }\n\n\t  var type = getCoordsDataType(outRank);\n\t  var broadcastDims = getBroadcastDims$1(inputInfo.shapeInfo.logicalShape, outShapeInfo.logicalShape);\n\t  var rankDiff = outRank - inRank;\n\t  var coordsSnippet;\n\t  var fields = ['x', 'y', 'z', 'w', 'u', 'v'];\n\n\t  if (inRank === 0) {\n\t    coordsSnippet = '';\n\t  } else if (outRank < 2 && broadcastDims.length >= 1) {\n\t    coordsSnippet = 'coords = 0;';\n\t  } else {\n\t    coordsSnippet = broadcastDims.map(function (d) {\n\t      return \"coords.\" + fields[d + rankDiff] + \" = 0;\";\n\t    }).join('\\n');\n\t  }\n\n\t  var unpackedCoordsSnippet = '';\n\n\t  if (outRank < 2 && inRank > 0) {\n\t    unpackedCoordsSnippet = 'coords';\n\t  } else {\n\t    unpackedCoordsSnippet = inputInfo.shapeInfo.logicalShape.map(function (s, i) {\n\t      return \"coords.\" + fields[i + rankDiff];\n\t    }).join(', ');\n\t  }\n\n\t  return \"\\n    float \" + funcName + \"() {\\n      \" + type + \" coords = getOutputCoords();\\n      \" + coordsSnippet + \"\\n      return get\" + texFuncSnippet + \"(\" + unpackedCoordsSnippet + \");\\n    }\\n  \";\n\t}\n\n\tfunction getCoordsDataType(rank) {\n\t  if (rank <= 1) {\n\t    return 'int';\n\t  } else if (rank === 2) {\n\t    return 'ivec2';\n\t  } else if (rank === 3) {\n\t    return 'ivec3';\n\t  } else if (rank === 4) {\n\t    return 'ivec4';\n\t  } else if (rank === 5) {\n\t    return 'ivec5';\n\t  } else if (rank === 6) {\n\t    return 'ivec6';\n\t  } else {\n\t    throw Error(\"GPU for rank \" + rank + \" is not yet supported\");\n\t  }\n\t}\n\t/** Returns a new input info (a copy) that has a squeezed logical shape. */\n\n\tfunction squeezeInputInfo(inInfo, squeezedShape) {\n\t  // Deep copy.\n\t  var newInputInfo = JSON.parse(JSON.stringify(inInfo));\n\t  newInputInfo.shapeInfo.logicalShape = squeezedShape;\n\t  return newInputInfo;\n\t}\n\n\tfunction getSqueezedParams(params, keptDims) {\n\t  return keptDims.map(function (d) {\n\t    return params[d];\n\t  }).join(', ');\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction compileProgram(gpgpu, program, inputs, output) {\n\t  var userCode = program.userCode;\n\t  var inputInfos = inputs.map(function (input, i) {\n\t    var shapeInfo = {\n\t      logicalShape: input.shape,\n\t      texShape: input.isUniform ? null : input.texData.texShape,\n\t      isUniform: input.isUniform,\n\t      isPacked: input.isUniform ? false : input.texData.isPacked,\n\t      flatOffset: null\n\t    };\n\n\t    if (input.texData != null && input.texData.slice != null && input.texData.slice.flatOffset > 0) {\n\t      shapeInfo.flatOffset = input.texData.slice.flatOffset;\n\t    }\n\n\t    return {\n\t      name: program.variableNames[i],\n\t      shapeInfo: shapeInfo\n\t    };\n\t  });\n\t  var inShapeInfos = inputInfos.map(function (x) {\n\t    return x.shapeInfo;\n\t  });\n\t  var outShapeInfo = {\n\t    logicalShape: output.shape,\n\t    texShape: output.texData.texShape,\n\t    isUniform: false,\n\t    isPacked: output.texData.isPacked,\n\t    flatOffset: null\n\t  };\n\t  var source = makeShader(inputInfos, outShapeInfo, userCode, program.packedInputs);\n\t  var webGLProgram = gpgpu.createProgram(source); // Add special uniforms (NAN, INFINITY)\n\n\t  var infLoc = null;\n\t  var nanLoc = gpgpu.getUniformLocation(webGLProgram, 'NAN', false);\n\n\t  if (env().getNumber('WEBGL_VERSION') === 1) {\n\t    infLoc = gpgpu.getUniformLocation(webGLProgram, 'INFINITY', false);\n\t  } // Add user-defined uniforms\n\n\n\t  var uniformLocations = {};\n\n\t  for (var i = 0; i < program.variableNames.length; i++) {\n\t    var varName = program.variableNames[i];\n\t    var shouldThrow = false;\n\t    uniformLocations[varName] = gpgpu.getUniformLocation(webGLProgram, varName, shouldThrow);\n\t    uniformLocations[\"offset\" + varName] = gpgpu.getUniformLocation(webGLProgram, \"offset\" + varName, shouldThrow);\n\t  }\n\n\t  return {\n\t    program: program,\n\t    source: source,\n\t    webGLProgram: webGLProgram,\n\t    uniformLocations: uniformLocations,\n\t    inShapeInfos: inShapeInfos,\n\t    outShapeInfo: outShapeInfo,\n\t    infLoc: infLoc,\n\t    nanLoc: nanLoc\n\t  };\n\t}\n\n\tfunction validateBinaryAndProgram(shapeInfos, inputs) {\n\t  if (shapeInfos.length !== inputs.length) {\n\t    throw Error(\"Binary was compiled with \" + shapeInfos.length + \" inputs, but \" + (\"was executed with \" + inputs.length + \" inputs\"));\n\t  }\n\n\t  shapeInfos.forEach(function (s, i) {\n\t    var shapeA = s.logicalShape;\n\t    var input = inputs[i];\n\t    var shapeB = input.shape;\n\n\t    if (!arraysEqual(shapeA, shapeB)) {\n\t      throw Error(\"Binary was compiled with different shapes than \" + (\"the current args. Shapes \" + shapeA + \" and \" + shapeB + \" must match\"));\n\t    } // The input is uploaded as uniform.\n\n\n\t    if (s.isUniform && input.isUniform) {\n\t      return;\n\t    }\n\n\t    var texShapeA = s.texShape;\n\t    var texShapeB = input.isUniform ? null : input.texData.texShape;\n\n\t    if (!arraysEqual(texShapeA, texShapeB)) {\n\t      throw Error(\"Binary was compiled with different texture shapes than the\" + (\" current args. Shape \" + texShapeA + \" and \" + texShapeB + \" must match\"));\n\t    }\n\t  });\n\t}\n\n\tfunction runProgram(gpgpu, binary, inputs, output, customSetup) {\n\t  validateBinaryAndProgram(binary.inShapeInfos, inputs);\n\t  validateBinaryAndProgram([binary.outShapeInfo], [output]);\n\t  var outTex = output.texData.texture;\n\t  var outTexShape = output.texData.texShape;\n\n\t  if (output.texData.isPacked) {\n\t    gpgpu.setOutputPackedMatrixTexture(outTex, outTexShape[0], outTexShape[1]);\n\t  } else {\n\t    gpgpu.setOutputMatrixTexture(outTex, outTexShape[0], outTexShape[1]);\n\t  }\n\n\t  gpgpu.setProgram(binary.webGLProgram); // Set special uniforms (NAN, INFINITY)\n\n\t  if (env().getNumber('WEBGL_VERSION') === 1) {\n\t    if (binary.infLoc !== null) {\n\t      gpgpu.gl.uniform1f(binary.infLoc, Infinity);\n\t    }\n\t  }\n\n\t  if (binary.nanLoc !== null) {\n\t    gpgpu.gl.uniform1f(binary.nanLoc, NaN);\n\t  } // Set user-defined inputs\n\n\n\t  inputs.forEach(function (input, i) {\n\t    var varName = binary.program.variableNames[i];\n\t    var varLoc = binary.uniformLocations[varName];\n\t    var varOffsetLoc = binary.uniformLocations[\"offset\" + varName];\n\n\t    if (varLoc == null) {\n\t      // The compiler inferred that this variable is not used in this shader.\n\t      return;\n\t    }\n\n\t    if (input.isUniform) {\n\t      // Upload the values of the tensor as uniform.\n\t      if (sizeFromShape(input.shape) < 2) {\n\t        gpgpu.gl.uniform1f(varLoc, input.uniformValues[0]);\n\t      } else {\n\t        var vals = input.uniformValues;\n\n\t        if (!(vals instanceof Float32Array)) {\n\t          vals = new Float32Array(vals);\n\t        }\n\n\t        gpgpu.gl.uniform1fv(varLoc, vals);\n\t      }\n\n\t      return;\n\t    } // If the input was sliced, upload the flat offset index.\n\n\n\t    if (input.texData.slice != null && varOffsetLoc != null) {\n\t      gpgpu.gl.uniform1i(varOffsetLoc, input.texData.slice.flatOffset);\n\t    }\n\n\t    gpgpu.setInputMatrixTexture(input.texData.texture, varLoc, i);\n\t  });\n\n\t  if (customSetup != null) {\n\t    customSetup(gpgpu, binary.webGLProgram);\n\t  }\n\n\t  gpgpu.executeProgram();\n\t}\n\tfunction makeShaderKey(program, inputs, output) {\n\t  var keyInputs = '';\n\t  inputs.concat(output).forEach(function (x) {\n\t    var hasOffset = x.texData != null && x.texData.slice != null && x.texData.slice.flatOffset > 0;\n\t    var texShape = x.isUniform ? 'uniform' : x.texData.texShape;\n\t    keyInputs += x.shape + \"_\" + texShape + \"_\" + hasOffset;\n\t  });\n\t  var keyUserCode = program.userCode;\n\t  var key = program.constructor.name; // Fast string concat. See https://jsperf.com/string-concatenation/14.\n\n\t  key += '_' + keyInputs + '_' + keyUserCode;\n\t  return key;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar addImplCPU = addImpl,\n\t    bincountImplCPU = bincountImpl,\n\t    bincountReduceImplCPU = bincountReduceImpl,\n\t    ceilImplCPU = ceilImpl,\n\t    concatImplCPU = concatImpl,\n\t    expImplCPU = expImpl,\n\t    expm1ImplCPU = expm1Impl,\n\t    floorImplCPU = floorImpl,\n\t    gatherV2ImplCPU = gatherV2Impl,\n\t    greaterImplCPU = greaterImpl,\n\t    lessImplCPU = lessImpl,\n\t    linSpaceImplCPU = linSpaceImpl,\n\t    logImplCPU = logImpl,\n\t    maxImplCPU = maxImpl,\n\t    maximumImplCPU = maximumImpl,\n\t    minimumImplCPU = minimumImpl,\n\t    multiplyImplCPU = multiplyImpl,\n\t    negImplCPU = negImpl,\n\t    prodImplCPU = prodImpl,\n\t    rangeImplCPU = rangeImpl,\n\t    rsqrtImplCPU = rsqrtImpl,\n\t    simpleAbsImplCPU = simpleAbsImpl,\n\t    sliceImplCPU = sliceImpl,\n\t    stridedSliceImplCPU = stridedSliceImpl,\n\t    subImplCPU = subImpl,\n\t    tileImplCPU = tileImpl,\n\t    topKImplCPU = topKImpl,\n\t    transposeImplCPU = transposeImpl,\n\t    uniqueImplCPU = uniqueImpl;\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction getVecChannels(name, rank) {\n\t  return ['x', 'y', 'z', 'w', 'u', 'v'].slice(0, rank).map(function (d) {\n\t    return name + \".\" + d;\n\t  });\n\t}\n\tfunction getChannels(name, rank) {\n\t  if (rank === 1) {\n\t    return [name];\n\t  }\n\n\t  return getVecChannels(name, rank);\n\t}\n\tfunction getSourceCoords(rank, dims) {\n\t  if (rank === 1) {\n\t    return 'rc';\n\t  }\n\n\t  var coords = '';\n\n\t  for (var i = 0; i < rank; i++) {\n\t    coords += dims[i];\n\n\t    if (i < rank - 1) {\n\t      coords += ',';\n\t    }\n\t  }\n\n\t  return coords;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar PackProgram = function PackProgram(outputShape) {\n\t  this.variableNames = ['A'];\n\t  this.packedInputs = false;\n\t  this.packedOutput = true; // Only input / output 3D tensors.\n\n\t  this.outputShape = outputShape;\n\t  var rank = outputShape.length;\n\n\t  if (rank === 0) {\n\t    this.userCode = \"\\n        void main() {\\n          setOutput(vec4(getA(), 0., 0., 0.));\\n        }\\n      \";\n\t  } else {\n\t    var channels = getChannels('rc', rank);\n\t    var dtype = getCoordsDataType(rank);\n\t    var outOfBoundsCondition = getOutOfBoundsCondition(rank, outputShape, channels);\n\t    var setup = getSetup(rank, outputShape[outputShape.length - 1], outputShape[outputShape.length - 2], channels);\n\t    var output = getOutput(outputShape, channels);\n\t    this.userCode = \"\\n        void main() {\\n          \" + dtype + \" rc = getOutputCoords();\\n\\n          if(\" + outOfBoundsCondition + \") {\\n            setOutput(vec4(0));\\n          } else {\\n            \" + setup + \"\\n\\n            setOutput(vec4(\" + output + \"));\\n          }\\n        }\\n      \";\n\t  }\n\t};\n\n\tfunction getSourceCoordsArr(rank, dims) {\n\t  var coords = [];\n\n\t  for (var row = 0; row <= 1; row++) {\n\t    for (var col = 0; col <= 1; col++) {\n\t      var coord = (row === 0 ? 'r' : 'rp1') + \", \" + (col === 0 ? 'c' : 'cp1');\n\n\t      for (var d = 2; d < rank; d++) {\n\t        coord = dims[dims.length - 1 - d] + \",\" + coord;\n\t      }\n\n\t      coords.push(coord);\n\t    }\n\t  }\n\n\t  return coords;\n\t}\n\n\tfunction getOutOfBoundsCondition(rank, shape, dims) {\n\t  if (rank === 1) {\n\t    return \"rc > \" + shape[0];\n\t  }\n\n\t  var cond = '';\n\n\t  for (var i = rank - 2; i < rank; i++) {\n\t    cond += dims[i] + \" >= \" + shape[i];\n\n\t    if (i < rank - 1) {\n\t      cond += '||';\n\t    }\n\t  }\n\n\t  return cond;\n\t}\n\n\tfunction getSetup(rank, cols, rows, dims) {\n\t  if (rank === 1) {\n\t    return '';\n\t  }\n\n\t  var innerDims = dims.slice(-2);\n\t  return \"\\n    int r = \" + innerDims[0] + \";\\n    int c = \" + innerDims[1] + \";\\n    int rp1 = r + 1;\\n    int cp1 = c + 1;\\n\\n    bool cEdge = cp1 >= \" + cols + \";\\n    bool rEdge = rp1 >= \" + rows + \";\\n  \";\n\t}\n\n\tfunction getOutput(shape, dims) {\n\t  var rank = shape.length;\n\t  var sourceCoords = getSourceCoordsArr(rank, dims);\n\n\t  if (rank === 1) {\n\t    return \"getA(rc),\\n            rc + 1 >= \" + shape[0] + \" ? 0. : getA(rc + 1),\\n            0, 0\";\n\t  }\n\n\t  return \"getA(\" + sourceCoords[0] + \"),\\n          cEdge ? 0. : getA(\" + sourceCoords[1] + \"),\\n          rEdge ? 0. : getA(\" + sourceCoords[2] + \"),\\n          rEdge || cEdge ? 0. : getA(\" + sourceCoords[3] + \")\";\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ReshapePackedProgram = function ReshapePackedProgram(outputShape, inputShape) {\n\t  this.variableNames = ['A'];\n\t  this.packedInputs = true;\n\t  this.packedOutput = true;\n\t  this.outputShape = outputShape;\n\t  var mainLoop = \"\";\n\n\t  for (var i = 0; i < 4; i++) {\n\t    var thisRC = \"thisRC = rc;\";\n\n\t    if (i % 2 === 1) {\n\t      thisRC += \"thisRC.z += 1;\";\n\t    }\n\n\t    if (i > 1) {\n\t      thisRC += \"thisRC.y += 1;\";\n\t    }\n\n\t    mainLoop += \"\\n        \" + thisRC + \"\\n        \" + (i > 0 ? \"if(thisRC.y < rows && thisRC.z < cols){\" : '') + \"\\n          int flatIndex = getFlatIndex(thisRC);\\n\\n          ivec3 inputRC = inputCoordsFromReshapedOutCoords(flatIndex);\\n          vec2 inputRCInnerDims = vec2(float(inputRC.y),float(inputRC.z));\\n\\n          result[\" + i + \"] =\\n            getChannel(getA(inputRC.x, inputRC.y, inputRC.z), inputRCInnerDims);\\n        \" + (i > 0 ? '}' : '') + \"\\n      \";\n\t  }\n\n\t  this.userCode = \"\\n      \" + getReshapedInputCoords(inputShape) + \"\\n      \" + getFlatIndexFrom3D(outputShape) + \"\\n\\n      void main() {\\n        ivec3 rc = getOutputCoords();\\n\\n        vec4 result = vec4(0.);\\n\\n        ivec3 thisRC;\\n        int rows = \" + outputShape[1] + \";\\n        int cols = \" + outputShape[2] + \";\\n\\n        \" + mainLoop + \"\\n\\n        setOutput(result);\\n      }\\n    \";\n\t};\n\n\tfunction getReshapedInputCoords(shape) {\n\t  var coordsFromIndexSnippet = getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd'], shape);\n\t  return \"\\n    ivec3 inputCoordsFromReshapedOutCoords(int index) {\\n      \" + coordsFromIndexSnippet + \"\\n      return ivec3(r, c, d);\\n    }\\n  \";\n\t}\n\n\tvar TextureManager = /*#__PURE__*/function () {\n\t  function TextureManager(gpgpu) {\n\t    this.gpgpu = gpgpu;\n\t    this.numUsedTextures = 0;\n\t    this.numFreeTextures = 0;\n\t    this._numBytesAllocated = 0;\n\t    this._numBytesFree = 0; // How many bytes that have been allocated\n\t    // are available for reuse.\n\n\t    this.freeTextures = {};\n\t    this.logEnabled = false;\n\t    this.usedTextures = {};\n\t  }\n\n\t  var _proto = TextureManager.prototype;\n\n\t  _proto.acquireTexture = function acquireTexture(shapeRC, usage, isPacked) {\n\t    var physicalTexType = getPhysicalFromLogicalTextureType(usage, isPacked);\n\t    var shapeKey = getKeyFromTextureShape(shapeRC, physicalTexType, isPacked);\n\n\t    if (!(shapeKey in this.freeTextures)) {\n\t      this.freeTextures[shapeKey] = [];\n\t    }\n\n\t    if (!(shapeKey in this.usedTextures)) {\n\t      this.usedTextures[shapeKey] = [];\n\t    }\n\n\t    var texBytes = computeBytes(shapeRC, physicalTexType, this.gpgpu.gl, this.gpgpu.textureConfig, isPacked);\n\n\t    if (this.freeTextures[shapeKey].length > 0) {\n\t      this.numFreeTextures--;\n\t      this.numUsedTextures++;\n\t      this._numBytesFree -= texBytes;\n\t      this.log();\n\n\t      var _newTexture = this.freeTextures[shapeKey].shift();\n\n\t      this.usedTextures[shapeKey].push(_newTexture);\n\t      return _newTexture;\n\t    }\n\n\t    var newTexture;\n\n\t    if (physicalTexType === PhysicalTextureType.PACKED_2X2_FLOAT32) {\n\t      newTexture = this.gpgpu.createPackedMatrixTexture(shapeRC[0], shapeRC[1]);\n\t    } else if (physicalTexType === PhysicalTextureType.PACKED_2X2_FLOAT16) {\n\t      newTexture = this.gpgpu.createFloat16PackedMatrixTexture(shapeRC[0], shapeRC[1]);\n\t    } else if (physicalTexType === PhysicalTextureType.UNPACKED_FLOAT32) {\n\t      newTexture = this.gpgpu.createFloat32MatrixTexture(shapeRC[0], shapeRC[1]);\n\t    } else if (physicalTexType === PhysicalTextureType.UNPACKED_FLOAT16) {\n\t      newTexture = this.gpgpu.createFloat16MatrixTexture(shapeRC[0], shapeRC[1]);\n\t    } else if (physicalTexType === PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE) {\n\t      newTexture = this.gpgpu.createUnsignedBytesMatrixTexture(shapeRC[0], shapeRC[1]);\n\t    }\n\n\t    this.usedTextures[shapeKey].push(newTexture);\n\t    this.numUsedTextures++;\n\t    this._numBytesAllocated += texBytes;\n\t    this.log();\n\t    return newTexture;\n\t  };\n\n\t  _proto.releaseTexture = function releaseTexture(texture, shape, logicalTexType, isPacked) {\n\t    if (this.freeTextures == null) {\n\t      // Already disposed.\n\t      return;\n\t    }\n\n\t    var physicalTexType = getPhysicalFromLogicalTextureType(logicalTexType, isPacked);\n\t    var shapeKey = getKeyFromTextureShape(shape, physicalTexType, isPacked);\n\n\t    if (!(shapeKey in this.freeTextures)) {\n\t      this.freeTextures[shapeKey] = [];\n\t    }\n\n\t    var texBytes = computeBytes(shape, physicalTexType, this.gpgpu.gl, this.gpgpu.textureConfig, isPacked);\n\t    var deleteTexThreshold = env().get('WEBGL_DELETE_TEXTURE_THRESHOLD');\n\n\t    if (deleteTexThreshold !== -1 && this._numBytesAllocated > deleteTexThreshold) {\n\t      this.gpgpu.deleteMatrixTexture(texture);\n\t      this._numBytesAllocated -= texBytes;\n\t    } else {\n\t      this.freeTextures[shapeKey].push(texture);\n\t      this.numFreeTextures++;\n\t      this._numBytesFree += texBytes;\n\t    }\n\n\t    this.numUsedTextures--;\n\t    var texList = this.usedTextures[shapeKey];\n\t    var texIndex = texList.indexOf(texture);\n\n\t    if (texIndex < 0) {\n\t      throw new Error('Cannot release a texture that was never provided by this ' + 'texture manager');\n\t    }\n\n\t    texList.splice(texIndex, 1);\n\t    this.log();\n\t  };\n\n\t  _proto.log = function log() {\n\t    if (!this.logEnabled) {\n\t      return;\n\t    }\n\n\t    var total = this.numFreeTextures + this.numUsedTextures;\n\t    console.log('Free/Used', this.numFreeTextures + \" / \" + this.numUsedTextures, \"(\" + total + \")\");\n\t    var freeRatio = this._numBytesFree / this._numBytesAllocated;\n\t    console.log(\"Bytes allocated: \" + this._numBytesAllocated);\n\t    console.log(\"Bytes unused: \" + this._numBytesFree + \" (\" + Math.round(100 * freeRatio) + \"%)\");\n\t  };\n\n\t  _proto.getNumUsedTextures = function getNumUsedTextures() {\n\t    return this.numUsedTextures;\n\t  };\n\n\t  _proto.getNumFreeTextures = function getNumFreeTextures() {\n\t    return this.numFreeTextures;\n\t  };\n\n\t  _proto.dispose = function dispose() {\n\t    var _this = this;\n\n\t    if (this.freeTextures == null) {\n\t      // Already disposed.\n\t      return;\n\t    }\n\n\t    for (var texShape in this.freeTextures) {\n\t      this.freeTextures[texShape].forEach(function (tex) {\n\t        _this.gpgpu.deleteMatrixTexture(tex);\n\t      });\n\t    }\n\n\t    for (var _texShape in this.usedTextures) {\n\t      this.usedTextures[_texShape].forEach(function (tex) {\n\t        _this.gpgpu.deleteMatrixTexture(tex);\n\t      });\n\t    }\n\n\t    this.freeTextures = null;\n\t    this.usedTextures = null;\n\t    this.numUsedTextures = 0;\n\t    this.numFreeTextures = 0;\n\t    this._numBytesAllocated = 0;\n\t    this._numBytesFree = 0;\n\t  };\n\n\t  _createClass(TextureManager, [{\n\t    key: \"numBytesAllocated\",\n\t    get: function get() {\n\t      return this._numBytesAllocated;\n\t    }\n\t  }, {\n\t    key: \"numBytesFree\",\n\t    get: function get() {\n\t      return this._numBytesFree;\n\t    }\n\t  }]);\n\n\t  return TextureManager;\n\t}();\n\n\tfunction numBytesForInternalFormat(gl, internalFormat) {\n\t  // tslint:disable-next-line:no-any\n\t  var glany = gl;\n\n\t  if (internalFormat === glany.R32F) {\n\t    return 4;\n\t  } else if (internalFormat === glany.R16F) {\n\t    return 2;\n\t  } else if (internalFormat === glany.RGBA32F) {\n\t    return 16;\n\t  } else if (internalFormat === gl.RGBA) {\n\t    return 16;\n\t  } else if (internalFormat === glany.RGBA16F) {\n\t    return 8;\n\t  }\n\n\t  throw new Error(\"Unknown internal format \" + internalFormat);\n\t}\n\n\tfunction computeBytes(shape, physicalTexType, gl, textureConfig, isPacked) {\n\t  // It is not possible to infer packed status from the texture type because\n\t  // depending on the textureConfig, different  texture types may resolve to the\n\t  // same internal format (e.g. in WebGL1, the internal format for\n\t  // UNPACKED_FLOAT16 textures is gl.RGBA). Therefore we pass in `isPacked`\n\t  // explicitly.\n\t  var internalFormat = internalFormatForPhysicalTexType(physicalTexType, textureConfig);\n\t  var numElements;\n\n\t  if (isPacked) {\n\t    var _getPackedMatrixTextu = getPackedMatrixTextureShapeWidthHeight(shape[0], shape[1]),\n\t        packedWidth = _getPackedMatrixTextu[0],\n\t        packedHeight = _getPackedMatrixTextu[1];\n\n\t    numElements = packedWidth * packedHeight;\n\t  } else {\n\t    var _getUnpackedMatrixTex = getUnpackedMatrixTextureShapeWidthHeight(shape[0], shape[1]),\n\t        width = _getUnpackedMatrixTex[0],\n\t        height = _getUnpackedMatrixTex[1];\n\n\t    numElements = width * height;\n\t  }\n\n\t  var bytesPerElement = numBytesForInternalFormat(gl, internalFormat);\n\t  return numElements * bytesPerElement;\n\t}\n\n\tfunction internalFormatForPhysicalTexType(physicalTexType, textureConfig) {\n\t  switch (physicalTexType) {\n\t    case PhysicalTextureType.PACKED_2X2_FLOAT32:\n\t      return getInternalFormatForPackedMatrixTexture(textureConfig);\n\n\t    case PhysicalTextureType.PACKED_2X2_FLOAT16:\n\t      return getInternalFormatForFloat16PackedMatrixTexture(textureConfig);\n\n\t    case PhysicalTextureType.UNPACKED_FLOAT32:\n\t      return getInternalFormatForFloat32MatrixTexture(textureConfig);\n\n\t    case PhysicalTextureType.UNPACKED_FLOAT16:\n\t      return getInternalFormatForFloat16MatrixTexture(textureConfig);\n\n\t    case PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE:\n\t      return getInternalFormatForUnsignedBytesMatrixTexture(textureConfig);\n\n\t    default:\n\t      throw new Error(\"Unknown physical texture type \" + physicalTexType);\n\t  }\n\t}\n\n\tfunction getPhysicalTextureForRendering(isPacked) {\n\t  if (env().getBool('WEBGL_RENDER_FLOAT32_ENABLED')) {\n\t    if (isPacked) {\n\t      return PhysicalTextureType.PACKED_2X2_FLOAT32;\n\t    }\n\n\t    return PhysicalTextureType.UNPACKED_FLOAT32;\n\t  }\n\n\t  if (isPacked) {\n\t    return PhysicalTextureType.PACKED_2X2_FLOAT16;\n\t  }\n\n\t  return PhysicalTextureType.UNPACKED_FLOAT16;\n\t}\n\n\tfunction getPhysicalFromLogicalTextureType(logicalTexType, isPacked) {\n\t  if (logicalTexType === TextureUsage.UPLOAD) {\n\t    return PhysicalTextureType.PACKED_2X2_FLOAT32;\n\t  } else if (logicalTexType === TextureUsage.RENDER || logicalTexType == null) {\n\t    return getPhysicalTextureForRendering(isPacked);\n\t  } else if (logicalTexType === TextureUsage.DOWNLOAD || logicalTexType === TextureUsage.PIXELS) {\n\t    return PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE;\n\t  }\n\n\t  throw new Error(\"Unknown logical texture type \" + logicalTexType);\n\t}\n\n\tfunction getKeyFromTextureShape(shapeRowsCol, physicalTexType, isPacked) {\n\t  return shapeRowsCol[0] + \"_\" + shapeRowsCol[1] + \"_\" + physicalTexType + \"_\" + isPacked;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar UnaryOpProgram = function UnaryOpProgram(aShape, opSnippet) {\n\t  this.variableNames = ['A'];\n\t  this.outputShape = aShape;\n\t  this.userCode = \"\\n      float unaryOperation(float x) {\\n        \" + opSnippet + \"\\n      }\\n\\n      void main() {\\n        float x = getAAtOutCoords();\\n        float y = unaryOperation(x);\\n\\n        setOutput(y);\\n      }\\n    \";\n\t};\n\tvar CHECK_NAN_SNIPPET = \"if (isnan(x)) return x;\";\n\tvar LINEAR = \"return x;\";\n\tvar ABS = \"return abs(x);\";\n\tfunction STEP(alpha) {\n\t  if (alpha === void 0) {\n\t    alpha = 0.0;\n\t  }\n\n\t  return CHECK_NAN_SNIPPET + (\"\\n    return x > 0.0 ? 1.0 : float(\" + alpha + \");\\n  \");\n\t}\n\tvar ELU$1 = \"return (x >= 0.0) ? x : (exp(x) - 1.0);\";\n\tvar RELU = CHECK_NAN_SNIPPET + \"\\n  return (x < 0.0) ? 0.0 : x;\\n\";\n\tvar RELU6 = CHECK_NAN_SNIPPET + \"\\n  return (x < 0.0) ? 0.0 : min(6.0, x);\\n\";\n\tvar CLONE = 'return x;';\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar LINEAR$1 = \"return x;\";\n\tvar ELU$2 = \"\\n  vec4 result;\\n\\n  result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\\n  result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\\n  result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\\n  result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\\n\\n  return result;\\n\";\n\tvar RELU$1 = \"\\n  vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\\n  bvec4 isNaN = isnan(x);\\n\\n  result.r = isNaN.r ? x.r : result.r;\\n  result.g = isNaN.g ? x.g : result.g;\\n  result.b = isNaN.b ? x.b : result.b;\\n  result.a = isNaN.a ? x.a : result.a;\\n\\n  return result;\\n\";\n\tvar RELU6$1 = \"\\n  vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\\n  bvec4 isNaN = isnan(x);\\n\\n  result.r = isNaN.r ? x.r : result.r;\\n  result.g = isNaN.g ? x.g : result.g;\\n  result.b = isNaN.b ? x.b : result.b;\\n  result.a = isNaN.a ? x.a : result.a;\\n\\n  return result;\\n\";\n\tvar UnaryOpPackedProgram = function UnaryOpPackedProgram(aShape, opSnippet) {\n\t  this.variableNames = ['A'];\n\t  this.packedInputs = true;\n\t  this.packedOutput = true;\n\t  this.outputShape = aShape;\n\t  this.userCode = \"\\n      vec4 unaryOperation(vec4 x) {\\n        \" + opSnippet + \"\\n      }\\n\\n      void main() {\\n        vec4 x = getAAtOutCoords();\\n        vec4 y = unaryOperation(x);\\n\\n        setOutput(y);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar UnpackProgram = function UnpackProgram(outputShape) {\n\t  this.variableNames = ['A'];\n\t  this.packedInputs = true;\n\t  this.packedOutput = false;\n\t  this.outputShape = outputShape;\n\t  var rank = outputShape.length;\n\t  var channels = getChannels('rc', rank);\n\t  var dtype = getCoordsDataType(rank);\n\t  var sourceCoords = getSourceCoords(rank, channels);\n\t  var innerDims = channels.slice(-2);\n\t  var coords = rank <= 1 ? 'rc' : \"vec2(\" + innerDims.join(',') + \")\";\n\t  this.userCode = \"\\n      void main() {\\n        \" + dtype + \" rc = getOutputCoords();\\n        vec4 packedInput = getA(\" + sourceCoords + \");\\n\\n        setOutput(getChannel(packedInput, \" + coords + \"));\\n      }\\n    \";\n\t};\n\n\tvar whereImpl$2 = whereImpl;\n\tvar EPSILON_FLOAT32$1 = 1e-7;\n\tvar EPSILON_FLOAT16$1 = 1e-4;\n\tvar binaryCaches = {};\n\tfunction getBinaryCache(webGLVersion) {\n\t  if (webGLVersion in binaryCaches) {\n\t    return binaryCaches[webGLVersion];\n\t  }\n\n\t  binaryCaches[webGLVersion] = {};\n\t  return binaryCaches[webGLVersion];\n\t} // Empirically determined constant used to determine size threshold for handing\n\t// off execution to the CPU.\n\n\tvar CPU_HANDOFF_SIZE_THRESHOLD = 128; // Empirically determined constant used to decide the number of MB on GPU\n\t// before we warn about high memory use. The MB are this constant * screen area\n\t// * dpi / 1024 / 1024.\n\n\tvar BEFORE_PAGING_CONSTANT = 600;\n\n\tfunction numMBBeforeWarning() {\n\t  if (env().global.screen == null) {\n\t    return 1024; // 1 GB.\n\t  }\n\n\t  return env().global.screen.height * env().global.screen.width * window.devicePixelRatio * BEFORE_PAGING_CONSTANT / 1024 / 1024;\n\t}\n\n\tvar MathBackendWebGL = /*#__PURE__*/function (_KernelBackend) {\n\t  _inheritsLoose(MathBackendWebGL, _KernelBackend);\n\n\t  function MathBackendWebGL(gpgpu) {\n\t    var _this;\n\n\t    _this = _KernelBackend.call(this) || this; // Maps data ids that have a pending read operation, to list of subscribers.\n\n\t    _this.pendingRead = new WeakMap(); // List of data ids that are scheduled for disposal, but are waiting on a\n\t    // pending read operation.\n\n\t    _this.pendingDisposal = new WeakSet(); // Used to count the number of 'shallow' sliced tensors that point to the\n\t    // same data id.\n\n\t    _this.dataRefCount = new WeakMap();\n\t    _this.numBytesInGPU = 0; // Accumulated time spent (including blocking) in uploading data to webgl.\n\n\t    _this.uploadWaitMs = 0; // Accumulated time spent (including blocking in downloading data from webgl.\n\n\t    _this.downloadWaitMs = 0;\n\t    _this.warnedAboutMemory = false;\n\t    _this.warnedAboutCPUBackend = false;\n\t    _this.pendingDeletes = 0;\n\t    _this.disposed = false;\n\n\t    if (!env().getBool('HAS_WEBGL')) {\n\t      throw new Error('WebGL is not supported on this device');\n\t    }\n\n\t    if (gpgpu == null) {\n\t      var gl = getWebGLContext(env().getNumber('WEBGL_VERSION'));\n\t      _this.binaryCache = getBinaryCache(env().getNumber('WEBGL_VERSION'));\n\t      _this.gpgpu = new GPGPUContext(gl);\n\t      _this.canvas = gl.canvas;\n\t      _this.gpgpuCreatedLocally = true;\n\t    } else {\n\t      _this.gpgpu = gpgpu;\n\t      _this.binaryCache = {};\n\t      _this.gpgpuCreatedLocally = false;\n\t      _this.canvas = gpgpu.gl.canvas;\n\t    }\n\n\t    _this.textureManager = new TextureManager(_this.gpgpu);\n\t    _this.numMBBeforeWarning = numMBBeforeWarning();\n\t    _this.texData = new DataStorage(_assertThisInitialized(_this), engine());\n\t    return _this;\n\t  }\n\n\t  var _proto = MathBackendWebGL.prototype;\n\n\t  _proto.numDataIds = function numDataIds() {\n\t    return this.texData.numDataIds() + (this.cpuBackend ? this.cpuBackend.numDataIds() : 0) - this.pendingDeletes;\n\t  };\n\n\t  _proto.write = function write(values, shape, dtype) {\n\t    if (env().getBool('WEBGL_CHECK_NUMERICAL_PROBLEMS') || env().getBool('DEBUG')) {\n\t      this.checkNumericalProblems(values);\n\t    }\n\n\t    if (dtype === 'complex64' && values != null) {\n\t      throw new Error(\"Cannot write to a complex64 dtype. \" + \"Please use tf.complex(real, imag).\");\n\t    }\n\n\t    var dataId = {};\n\t    this.texData.set(dataId, {\n\t      shape: shape,\n\t      dtype: dtype,\n\t      values: values,\n\t      usage: TextureUsage.UPLOAD,\n\t      refCount: 1,\n\t      complexParentRefCount: 0\n\t    });\n\t    return dataId;\n\t  }\n\t  /** Increase refCount of a `TextureData`. */\n\t  ;\n\n\t  _proto.incRef = function incRef(dataId) {\n\t    var texData = this.texData.get(dataId);\n\t    texData.refCount++;\n\t  }\n\t  /** Decrease refCount of a `TextureData`. */\n\t  ;\n\n\t  _proto.decRef = function decRef(dataId) {\n\t    if (this.texData.has(dataId)) {\n\t      var texData = this.texData.get(dataId);\n\t      texData.refCount--;\n\t    }\n\t  };\n\n\t  _proto.move = function move(dataId, values, shape, dtype) {\n\t    if (env().getBool('DEBUG')) {\n\t      this.checkNumericalProblems(values);\n\t    }\n\n\t    if (dtype === 'complex64') {\n\t      throw new Error(\"Cannot write to a complex64 dtype. \" + \"Please use tf.complex(real, imag).\");\n\t    }\n\n\t    this.texData.set(dataId, {\n\t      shape: shape,\n\t      dtype: dtype,\n\t      values: values,\n\t      usage: TextureUsage.UPLOAD,\n\t      refCount: 1,\n\t      complexParentRefCount: 0\n\t    });\n\t  };\n\n\t  _proto.disposeIntermediateTensorInfo = function disposeIntermediateTensorInfo(tensorInfo) {\n\t    var dataId = tensorInfo.dataId;\n\n\t    if (this.texData.has(dataId)) {\n\t      var textureData = this.texData.get(dataId);\n\t      textureData.refCount--;\n\n\t      if (textureData.refCount < 1) {\n\t        this.disposeData(dataId);\n\t      }\n\t    }\n\t  };\n\n\t  _proto.readSync = function readSync(dataId) {\n\t    var texData = this.texData.get(dataId);\n\t    var values = texData.values,\n\t        dtype = texData.dtype,\n\t        complexTensorInfos = texData.complexTensorInfos,\n\t        slice = texData.slice,\n\t        shape = texData.shape,\n\t        isPacked = texData.isPacked; // The presence of `slice` indicates this tensor is a shallow slice of a\n\t    // different tensor, and is using that original tensor's texture. Run\n\t    // `clone` in order to copy that texture and read from it.\n\n\t    if (slice != null) {\n\t      var program;\n\n\t      if (isPacked) {\n\t        program = new UnaryOpPackedProgram(shape, CLONE);\n\t      } else {\n\t        program = new UnaryOpProgram(shape, CLONE);\n\t      }\n\n\t      var res = this.runWebGLProgram(program, [{\n\t        dataId: dataId,\n\t        shape: shape,\n\t        dtype: dtype\n\t      }], dtype);\n\t      var data = this.readSync(res.dataId);\n\t      this.disposeIntermediateTensorInfo(res);\n\t      return data;\n\t    }\n\n\t    if (values != null) {\n\t      return this.convertAndCacheOnCPU(dataId);\n\t    }\n\n\t    if (dtype === 'string') {\n\t      return values;\n\t    }\n\n\t    var shouldTimeProgram = this.activeTimers != null;\n\t    var start;\n\n\t    if (shouldTimeProgram) {\n\t      start = now();\n\t    }\n\n\t    var result;\n\n\t    if (dtype === 'complex64') {\n\t      var realValues = this.readSync(complexTensorInfos.real.dataId);\n\t      var imagValues = this.readSync(complexTensorInfos.imag.dataId);\n\t      result = mergeRealAndImagArrays(realValues, imagValues);\n\t    } else {\n\t      result = this.getValuesFromTexture(dataId);\n\t    }\n\n\t    if (shouldTimeProgram) {\n\t      this.downloadWaitMs += now() - start;\n\t    }\n\n\t    return this.convertAndCacheOnCPU(dataId, result);\n\t  };\n\n\t  _proto.read = /*#__PURE__*/function () {\n\t    var _read = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(dataId) {\n\t      var _subscribers, texData, values, shape, slice, dtype, complexTensorInfos, isPacked, program, res, data, buffer, tmpDownloadTarget, _this$gpgpu, tmpData, vals, ps, realValues, imagValues, size, dTypeVals, subscribers;\n\n\t      return regeneratorRuntime.wrap(function _callee$(_context) {\n\t        while (1) {\n\t          switch (_context.prev = _context.next) {\n\t            case 0:\n\t              if (!this.pendingRead.has(dataId)) {\n\t                _context.next = 3;\n\t                break;\n\t              }\n\n\t              _subscribers = this.pendingRead.get(dataId);\n\t              return _context.abrupt(\"return\", new Promise(function (resolve) {\n\t                return _subscribers.push(resolve);\n\t              }));\n\n\t            case 3:\n\t              texData = this.texData.get(dataId);\n\t              values = texData.values, shape = texData.shape, slice = texData.slice, dtype = texData.dtype, complexTensorInfos = texData.complexTensorInfos, isPacked = texData.isPacked; // The presence of `slice` indicates this tensor is a shallow slice of a\n\t              // different tensor, and is using that original tensor's texture. Run\n\t              // `clone` in order to copy that texture and read from it.\n\n\t              if (!(slice != null)) {\n\t                _context.next = 11;\n\t                break;\n\t              }\n\n\t              if (isPacked) {\n\t                program = new UnaryOpPackedProgram(shape, CLONE);\n\t              } else {\n\t                program = new UnaryOpProgram(shape, CLONE);\n\t              }\n\n\t              res = this.runWebGLProgram(program, [{\n\t                dataId: dataId,\n\t                shape: shape,\n\t                dtype: dtype\n\t              }], dtype);\n\t              data = this.read(res.dataId);\n\t              this.disposeIntermediateTensorInfo(res);\n\t              return _context.abrupt(\"return\", data);\n\n\t            case 11:\n\t              if (!(values != null)) {\n\t                _context.next = 13;\n\t                break;\n\t              }\n\n\t              return _context.abrupt(\"return\", this.convertAndCacheOnCPU(dataId));\n\n\t            case 13:\n\t              if (!(!env().getBool('WEBGL_DOWNLOAD_FLOAT_ENABLED') && env().getNumber('WEBGL_VERSION') === 2)) {\n\t                _context.next = 15;\n\t                break;\n\t              }\n\n\t              throw new Error(\"tensor.data() with WEBGL_DOWNLOAD_FLOAT_ENABLED=false and \" + \"WEBGL_VERSION=2 not yet supported.\");\n\n\t            case 15:\n\t              buffer = null;\n\n\t              if (dtype !== 'complex64' && env().get('WEBGL_BUFFER_SUPPORTED')) {\n\t                // Possibly copy the texture into a buffer before inserting a fence.\n\t                tmpDownloadTarget = this.decode(dataId);\n\t                tmpData = this.texData.get(tmpDownloadTarget.dataId);\n\t                buffer = (_this$gpgpu = this.gpgpu).createBufferFromTexture.apply(_this$gpgpu, [tmpData.texture].concat(getDenseTexShape(shape)));\n\t              }\n\n\t              this.pendingRead.set(dataId, []);\n\n\t              if (!(dtype !== 'complex64')) {\n\t                _context.next = 21;\n\t                break;\n\t              }\n\n\t              _context.next = 21;\n\t              return this.gpgpu.createAndWaitForFence();\n\n\t            case 21:\n\t              if (!(dtype === 'complex64')) {\n\t                _context.next = 30;\n\t                break;\n\t              }\n\n\t              _context.next = 24;\n\t              return Promise.all([this.read(complexTensorInfos.real.dataId), this.read(complexTensorInfos.imag.dataId)]);\n\n\t            case 24:\n\t              ps = _context.sent;\n\t              realValues = ps[0];\n\t              imagValues = ps[1];\n\t              vals = mergeRealAndImagArrays(realValues, imagValues);\n\t              _context.next = 31;\n\t              break;\n\n\t            case 30:\n\t              if (buffer == null) {\n\t                vals = this.getValuesFromTexture(dataId);\n\t              } else {\n\t                size = sizeFromShape(shape);\n\t                vals = this.gpgpu.downloadFloat32MatrixFromBuffer(buffer, size);\n\t              }\n\n\t            case 31:\n\t              if (tmpDownloadTarget != null) {\n\t                this.disposeIntermediateTensorInfo(tmpDownloadTarget);\n\t              }\n\n\t              dTypeVals = this.convertAndCacheOnCPU(dataId, vals);\n\t              subscribers = this.pendingRead.get(dataId);\n\t              this.pendingRead.delete(dataId); // Notify all pending reads.\n\n\t              subscribers.forEach(function (resolve) {\n\t                return resolve(dTypeVals);\n\t              });\n\n\t              if (this.pendingDisposal.has(dataId)) {\n\t                this.pendingDisposal.delete(dataId);\n\t                this.disposeData(dataId);\n\t                this.pendingDeletes--;\n\t              }\n\n\t              return _context.abrupt(\"return\", dTypeVals);\n\n\t            case 38:\n\t            case \"end\":\n\t              return _context.stop();\n\t          }\n\t        }\n\t      }, _callee, this);\n\t    }));\n\n\t    function read(_x) {\n\t      return _read.apply(this, arguments);\n\t    }\n\n\t    return read;\n\t  }();\n\n\t  _proto.bufferSync = function bufferSync(t) {\n\t    var data = this.readSync(t.dataId);\n\t    var decodedData = data;\n\n\t    if (t.dtype === 'string') {\n\t      try {\n\t        // Decode the bytes into string.\n\t        decodedData = data.map(function (d) {\n\t          return decodeString(d);\n\t        });\n\t      } catch (_a) {\n\t        throw new Error('Failed to decode encoded string bytes into utf-8');\n\t      }\n\t    }\n\n\t    return buffer(t.shape, t.dtype, decodedData);\n\t  };\n\n\t  _proto.checkNumericalProblems = function checkNumericalProblems(values) {\n\t    if (values == null) {\n\t      return;\n\t    }\n\n\t    for (var i = 0; i < values.length; i++) {\n\t      var num = values[i];\n\n\t      if (!canBeRepresented(num)) {\n\t        if (env().getBool('WEBGL_RENDER_FLOAT32_CAPABLE')) {\n\t          throw Error(\"The value \" + num + \" cannot be represented with your \" + \"current settings. Consider enabling float32 rendering: \" + \"'tf.env().set('WEBGL_RENDER_FLOAT32_ENABLED', true);'\");\n\t        }\n\n\t        throw Error(\"The value \" + num + \" cannot be represented on this device.\");\n\t      }\n\t    }\n\t  };\n\n\t  _proto.getValuesFromTexture = function getValuesFromTexture(dataId) {\n\t    var _this$texData$get = this.texData.get(dataId),\n\t        shape = _this$texData$get.shape,\n\t        dtype = _this$texData$get.dtype,\n\t        isPacked = _this$texData$get.isPacked;\n\n\t    var size = sizeFromShape(shape);\n\n\t    if (env().getBool('WEBGL_DOWNLOAD_FLOAT_ENABLED')) {\n\t      var _this$gpgpu2;\n\n\t      var tmpTarget = this.decode(dataId);\n\n\t      var _tmpData = this.texData.get(tmpTarget.dataId);\n\n\t      var _vals = (_this$gpgpu2 = this.gpgpu).downloadMatrixFromPackedTexture.apply(_this$gpgpu2, [_tmpData.texture].concat(getDenseTexShape(shape))).subarray(0, size);\n\n\t      this.disposeIntermediateTensorInfo(tmpTarget);\n\t      return _vals;\n\t    }\n\n\t    var shouldUsePackedProgram = env().getBool('WEBGL_PACK') && isPacked === true;\n\t    var outputShape = shouldUsePackedProgram ? getShapeAs3D(shape) : shape;\n\t    var program = shouldUsePackedProgram ? new EncodeFloatPackedProgram(outputShape) : new EncodeFloatProgram(outputShape);\n\t    var output = this.runWebGLProgram(program, [{\n\t      shape: outputShape,\n\t      dtype: dtype,\n\t      dataId: dataId\n\t    }], 'float32');\n\t    var tmpData = this.texData.get(output.dataId);\n\t    var vals = this.gpgpu.downloadByteEncodedFloatMatrixFromOutputTexture(tmpData.texture, tmpData.texShape[0], tmpData.texShape[1]).subarray(0, size);\n\t    this.disposeIntermediateTensorInfo(output);\n\t    return vals;\n\t  };\n\n\t  _proto.time = /*#__PURE__*/function () {\n\t    var _time = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(f) {\n\t      var oldActiveTimers, newActiveTimers, outerMostTime, flattenedActiveTimerQueries, flattenedActiveTimerNames, res, kernelMs;\n\t      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n\t        while (1) {\n\t          switch (_context2.prev = _context2.next) {\n\t            case 0:\n\t              oldActiveTimers = this.activeTimers;\n\t              newActiveTimers = [];\n\t              outerMostTime = false;\n\n\t              if (this.programTimersStack == null) {\n\t                this.programTimersStack = newActiveTimers;\n\t                outerMostTime = true;\n\t              } else {\n\t                this.activeTimers.push(newActiveTimers);\n\t              }\n\n\t              this.activeTimers = newActiveTimers;\n\t              f(); // needing to split these up because util.flatten only accepts certain types\n\n\t              flattenedActiveTimerQueries = flatten(this.activeTimers.map(function (d) {\n\t                return d.query;\n\t              })).filter(function (d) {\n\t                return d != null;\n\t              });\n\t              flattenedActiveTimerNames = flatten(this.activeTimers.map(function (d) {\n\t                return d.name;\n\t              })).filter(function (d) {\n\t                return d != null;\n\t              });\n\t              this.activeTimers = oldActiveTimers;\n\n\t              if (outerMostTime) {\n\t                this.programTimersStack = null;\n\t              }\n\n\t              res = {\n\t                uploadWaitMs: this.uploadWaitMs,\n\t                downloadWaitMs: this.downloadWaitMs,\n\t                kernelMs: null,\n\t                wallMs: null // will be filled by the engine\n\n\t              };\n\n\t              if (!(env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE') > 0)) {\n\t                _context2.next = 19;\n\t                break;\n\t              }\n\n\t              _context2.next = 14;\n\t              return Promise.all(flattenedActiveTimerQueries);\n\n\t            case 14:\n\t              kernelMs = _context2.sent;\n\t              res['kernelMs'] = sum(kernelMs);\n\n\t              res['getExtraProfileInfo'] = function () {\n\t                return kernelMs.map(function (d, i) {\n\t                  return {\n\t                    name: flattenedActiveTimerNames[i],\n\t                    ms: d\n\t                  };\n\t                }).map(function (d) {\n\t                  return d.name + \": \" + d.ms;\n\t                }).join(', ');\n\t              };\n\n\t              _context2.next = 20;\n\t              break;\n\n\t            case 19:\n\t              res['kernelMs'] = {\n\t                error: 'WebGL query timers are not supported in this environment.'\n\t              };\n\n\t            case 20:\n\t              this.uploadWaitMs = 0;\n\t              this.downloadWaitMs = 0;\n\t              return _context2.abrupt(\"return\", res);\n\n\t            case 23:\n\t            case \"end\":\n\t              return _context2.stop();\n\t          }\n\t        }\n\t      }, _callee2, this);\n\t    }));\n\n\t    function time(_x2) {\n\t      return _time.apply(this, arguments);\n\t    }\n\n\t    return time;\n\t  }();\n\n\t  _proto.memory = function memory() {\n\t    return {\n\t      unreliable: false,\n\t      numBytesInGPU: this.numBytesInGPU,\n\t      numBytesInGPUAllocated: this.textureManager.numBytesAllocated,\n\t      numBytesInGPUFree: this.textureManager.numBytesFree\n\t    };\n\t  };\n\n\t  _proto.startTimer = function startTimer() {\n\t    if (env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE') > 0) {\n\t      return this.gpgpu.beginQuery();\n\t    }\n\n\t    return {\n\t      startMs: now(),\n\t      endMs: null\n\t    };\n\t  };\n\n\t  _proto.endTimer = function endTimer(query) {\n\t    if (env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE') > 0) {\n\t      this.gpgpu.endQuery();\n\t      return query;\n\t    }\n\n\t    query.endMs = now();\n\t    return query;\n\t  };\n\n\t  _proto.getQueryTime = /*#__PURE__*/function () {\n\t    var _getQueryTime = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(query) {\n\t      var timerQuery;\n\t      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n\t        while (1) {\n\t          switch (_context3.prev = _context3.next) {\n\t            case 0:\n\t              if (!(env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE') > 0)) {\n\t                _context3.next = 2;\n\t                break;\n\t              }\n\n\t              return _context3.abrupt(\"return\", this.gpgpu.waitForQueryAndGetTime(query));\n\n\t            case 2:\n\t              timerQuery = query;\n\t              return _context3.abrupt(\"return\", timerQuery.endMs - timerQuery.startMs);\n\n\t            case 4:\n\t            case \"end\":\n\t              return _context3.stop();\n\t          }\n\t        }\n\t      }, _callee3, this);\n\t    }));\n\n\t    function getQueryTime(_x3) {\n\t      return _getQueryTime.apply(this, arguments);\n\t    }\n\n\t    return getQueryTime;\n\t  }();\n\n\t  _proto.disposeData = function disposeData(dataId) {\n\t    if (this.pendingDisposal.has(dataId)) {\n\t      return;\n\t    }\n\n\t    if (this.pendingRead.has(dataId)) {\n\t      this.pendingDisposal.add(dataId);\n\t      this.pendingDeletes++;\n\t      return;\n\t    } // No-op if already disposed.\n\n\n\t    if (!this.texData.has(dataId)) {\n\t      return;\n\t    } // Trying to dispose a textureData that has a 'kept' refCount, e.g. trying\n\t    // to dispose a tensor whose data bucket is shared with a complex tensor. In\n\t    // this case we are removing a reference to the textureData, but we\n\t    // shouldn't actually dispose the texture.\n\n\n\t    if (this.texData.get(dataId).complexParentRefCount > 0) {\n\t      this.texData.get(dataId).refCount--;\n\t      return;\n\t    }\n\n\t    this.releaseGPUData(dataId);\n\n\t    var _this$texData$get2 = this.texData.get(dataId),\n\t        complexTensorInfos = _this$texData$get2.complexTensorInfos;\n\n\t    if (complexTensorInfos != null) {\n\t      this.texData.get(complexTensorInfos.real.dataId).complexParentRefCount--;\n\t      this.disposeIntermediateTensorInfo(complexTensorInfos.real);\n\t      this.texData.get(complexTensorInfos.imag.dataId).complexParentRefCount--;\n\t      this.disposeIntermediateTensorInfo(complexTensorInfos.imag);\n\t    }\n\n\t    this.texData.delete(dataId);\n\t  };\n\n\t  _proto.releaseGPUData = function releaseGPUData(dataId) {\n\t    var _this$texData$get3 = this.texData.get(dataId),\n\t        texture = _this$texData$get3.texture,\n\t        dtype = _this$texData$get3.dtype,\n\t        texShape = _this$texData$get3.texShape,\n\t        usage = _this$texData$get3.usage,\n\t        isPacked = _this$texData$get3.isPacked,\n\t        slice = _this$texData$get3.slice;\n\n\t    var key = slice && slice.origDataId || dataId;\n\t    var refCount = this.dataRefCount.get(key);\n\n\t    if (refCount > 1) {\n\t      this.dataRefCount.set(key, refCount - 1);\n\t    } else {\n\t      this.dataRefCount.delete(key);\n\n\t      if (texture != null) {\n\t        this.numBytesInGPU -= this.computeBytes(texShape, dtype);\n\t        this.textureManager.releaseTexture(texture, texShape, usage, isPacked);\n\t      }\n\t    }\n\n\t    var texData = this.texData.get(dataId);\n\t    texData.texture = null;\n\t    texData.texShape = null;\n\t    texData.isPacked = false;\n\t    texData.slice = null;\n\t  };\n\n\t  _proto.getTexture = function getTexture(dataId) {\n\t    this.uploadToGPU(dataId);\n\t    return this.texData.get(dataId).texture;\n\t  }\n\t  /**\n\t   * Returns internal information for the specific data bucket. Used in unit\n\t   * tests.\n\t   */\n\t  ;\n\n\t  _proto.getDataInfo = function getDataInfo(dataId) {\n\t    return this.texData.get(dataId);\n\t  };\n\n\t  _proto.getCPUBackend = function getCPUBackend() {\n\t    if (!env().getBool('WEBGL_CPU_FORWARD')) {\n\t      return null;\n\t    }\n\n\t    if (this.cpuBackend == null) {\n\t      this.cpuBackend = engine().findBackend('cpu');\n\t    }\n\n\t    return this.cpuBackend;\n\t  }\n\t  /*\n\t  Tests whether all the inputs to an op are small and on the CPU. This heuristic\n\t  determines when it would be faster to execute a kernel on the CPU. WebGL\n\t  kernels opt into running this check and forwarding when appropriate.\n\t  TODO(https://github.com/tensorflow/tfjs/issues/872): Develop a more\n\t  sustainable strategy for optimizing backend execution of ops.\n\t   */\n\t  ;\n\n\t  _proto.shouldExecuteOnCPU = function shouldExecuteOnCPU(inputs, sizeThreshold) {\n\t    var _this2 = this;\n\n\t    if (sizeThreshold === void 0) {\n\t      sizeThreshold = CPU_HANDOFF_SIZE_THRESHOLD;\n\t    }\n\n\t    var cpuBackend = this.getCPUBackend();\n\n\t    if (!env().getBool('IS_TEST') && !this.warnedAboutCPUBackend && cpuBackend == null) {\n\t      console.warn('Your application contains ops that are small enough to be ' + 'executed on the CPU backend, however the CPU backend cannot ' + 'be found. Consider importing the CPU backend ' + '(@tensorflow/tfjs-backend-cpu) for better performance.');\n\t      this.warnedAboutCPUBackend = true;\n\t    }\n\n\t    return cpuBackend != null && inputs.every(function (input) {\n\t      return _this2.texData.get(input.dataId).texture == null && sizeFromShape(input.shape) < sizeThreshold;\n\t    });\n\t  };\n\n\t  _proto.getGPGPUContext = function getGPGPUContext() {\n\t    return this.gpgpu;\n\t  };\n\n\t  _proto.where = function where(condition) {\n\t    warn('tf.where() in webgl locks the UI thread. ' + 'Call tf.whereAsync() instead');\n\t    var condVals = condition.dataSync();\n\t    return whereImpl$2(condition.shape, condVals);\n\t  };\n\n\t  _proto.packedUnaryOp = function packedUnaryOp(x, op, dtype) {\n\t    var program = new UnaryOpPackedProgram(x.shape, op);\n\t    return this.compileAndRun(program, [x], dtype);\n\t  } // TODO(msoulanille) remove this once the backend has been modularized\n\t  // a copy is needed here to break a circular dependency.\n\t  // Also remove the op from unary_op.\n\t  ;\n\n\t  _proto.abs = function abs(x) {\n\t    // TODO: handle cases when x is complex.\n\t    if (this.shouldExecuteOnCPU([x]) && x.dtype !== 'complex64') {\n\t      var outValues = simpleAbsImplCPU(this.texData.get(x.dataId).values);\n\t      return this.makeOutput(x.shape, x.dtype, outValues);\n\t    }\n\n\t    if (env().getBool('WEBGL_PACK_UNARY_OPERATIONS')) {\n\t      return this.packedUnaryOp(x, ABS, x.dtype);\n\t    }\n\n\t    var program = new UnaryOpProgram(x.shape, ABS);\n\t    return this.compileAndRun(program, [x]);\n\t  };\n\n\t  _proto.makeTensorInfo = function makeTensorInfo(shape, dtype, values) {\n\t    var dataId;\n\n\t    if (dtype === 'string' && values != null && values.length > 0 && isString(values[0])) {\n\t      var encodedValues = values.map(function (d) {\n\t        return encodeString(d);\n\t      });\n\t      dataId = this.write(encodedValues, shape, dtype);\n\t    } else {\n\t      dataId = this.write(values, shape, dtype);\n\t    }\n\n\t    this.texData.get(dataId).usage = null;\n\t    return {\n\t      dataId: dataId,\n\t      shape: shape,\n\t      dtype: dtype\n\t    };\n\t  };\n\n\t  _proto.makeOutput = function makeOutput(shape, dtype, values) {\n\t    var _this$makeTensorInfo = this.makeTensorInfo(shape, dtype, values),\n\t        dataId = _this$makeTensorInfo.dataId;\n\n\t    return engine().makeTensorFromDataId(dataId, shape, dtype, this);\n\t  };\n\n\t  _proto.unpackTensor = function unpackTensor(input) {\n\t    var program = new UnpackProgram(input.shape);\n\t    return this.runWebGLProgram(program, [input], input.dtype);\n\t  };\n\n\t  _proto.packTensor = function packTensor(input) {\n\t    var program = new PackProgram(input.shape);\n\t    var preventEagerUnpackingOutput = true;\n\t    return this.runWebGLProgram(program, [input], input.dtype, null\n\t    /* customSetup */\n\t    , preventEagerUnpackingOutput);\n\t  };\n\n\t  _proto.packedReshape = function packedReshape(input, afterShape) {\n\t    var input3DShape = [getBatchDim(input.shape)].concat(getRowsCols(input.shape));\n\t    var input3D = {\n\t      dtype: input.dtype,\n\t      shape: input3DShape,\n\t      dataId: input.dataId\n\t    };\n\t    var afterShapeAs3D = [getBatchDim(afterShape)].concat(getRowsCols(afterShape));\n\t    var program = new ReshapePackedProgram(afterShapeAs3D, input3DShape);\n\t    var preventEagerUnpackingOfOutput = true;\n\t    var output = this.runWebGLProgram(program, [input3D], input.dtype, null\n\t    /* customSetup */\n\t    , preventEagerUnpackingOfOutput);\n\t    return {\n\t      dataId: output.dataId,\n\t      shape: afterShape,\n\t      dtype: output.dtype\n\t    };\n\t  };\n\n\t  _proto.decode = function decode(dataId) {\n\t    var texData = this.texData.get(dataId);\n\t    var isPacked = texData.isPacked,\n\t        shape = texData.shape,\n\t        dtype = texData.dtype;\n\t    var shapeAs3D = getShapeAs3D(shape);\n\t    var program;\n\n\t    if (isPacked) {\n\t      program = new DecodeMatrixPackedProgram(shapeAs3D);\n\t    } else {\n\t      program = new DecodeMatrixProgram(shapeAs3D);\n\t    }\n\n\t    var preventEagerUnpackingOfOutput = true;\n\t    var out = this.runWebGLProgram(program, [{\n\t      shape: shapeAs3D,\n\t      dtype: dtype,\n\t      dataId: dataId\n\t    }], dtype, null\n\t    /* customSetup */\n\t    , preventEagerUnpackingOfOutput);\n\t    return {\n\t      dtype: dtype,\n\t      shape: shape,\n\t      dataId: out.dataId\n\t    };\n\t  };\n\n\t  _proto.runWebGLProgram = function runWebGLProgram(program, inputs, outputDtype, customSetup, preventEagerUnpackingOfOutput) {\n\t    var _this3 = this;\n\n\t    if (preventEagerUnpackingOfOutput === void 0) {\n\t      preventEagerUnpackingOfOutput = false;\n\t    }\n\n\t    var output = this.makeTensorInfo(program.outputShape, outputDtype);\n\t    var outData = this.texData.get(output.dataId);\n\n\t    if (program.packedOutput) {\n\t      outData.isPacked = true;\n\t    }\n\n\t    if (program.outPackingScheme === PackingScheme.DENSE) {\n\t      var texelShape = getDenseTexShape(program.outputShape); // For a densely packed output, we explicitly set texShape\n\t      // so it doesn't get assigned later according to our typical packing\n\t      // scheme wherein a single texel can only contain values from adjacent\n\t      // rows/cols.\n\n\t      outData.texShape = texelShape.map(function (d) {\n\t        return d * 2;\n\t      });\n\t    }\n\n\t    if (program.outTexUsage != null) {\n\t      outData.usage = program.outTexUsage;\n\t    }\n\n\t    if (sizeFromShape(output.shape) === 0) {\n\t      // Short-circuit the computation since the result is empty (has 0 in its\n\t      // shape).\n\t      outData.values = getTypedArrayFromDType(output.dtype, 0);\n\t      return output;\n\t    }\n\n\t    var dataToDispose = [];\n\t    var inputsData = inputs.map(function (input) {\n\t      if (input.dtype === 'complex64') {\n\t        throw new Error(\"GPGPUProgram does not support complex64 input. For complex64 \" + \"dtypes, please separate the program into real and imaginary \" + \"parts.\");\n\t      }\n\n\t      var texData = _this3.texData.get(input.dataId);\n\n\t      if (texData.texture == null) {\n\t        if (!program.packedInputs && sizeFromShape(input.shape) <= env().getNumber('WEBGL_SIZE_UPLOAD_UNIFORM')) {\n\t          // Upload small tensors that live on the CPU as uniforms, not as\n\t          // textures. Do this only when the environment supports 32bit floats\n\t          // due to problems when comparing 16bit floats with 32bit floats.\n\t          // TODO(https://github.com/tensorflow/tfjs/issues/821): Make it\n\t          // possible for packed shaders to sample from uniforms.\n\t          return {\n\t            shape: input.shape,\n\t            texData: null,\n\t            isUniform: true,\n\t            uniformValues: texData.values\n\t          };\n\t        } // This ensures that if a packed program's inputs have not yet been\n\t        // uploaded to the GPU, they get uploaded as packed right off the bat.\n\n\n\t        if (program.packedInputs) {\n\t          texData.isPacked = true;\n\t          texData.shape = input.shape;\n\t        }\n\t      } else if (!!texData.isPacked !== !!program.packedInputs) {\n\t        input = texData.isPacked ? _this3.unpackTensor(input) : _this3.packTensor(input);\n\t        dataToDispose.push(input);\n\t        texData = _this3.texData.get(input.dataId);\n\t      } else if (texData.isPacked && !isReshapeFree(texData.shape, input.shape)) {\n\t        // This is a special case where a texture exists for a tensor\n\t        // but the shapes are incompatible (due to packing constraints) because\n\t        // the tensor did not have a chance to go through the packed reshape\n\t        // shader. This only happens when we reshape the *same* tensor to form\n\t        // *distinct* inputs to an op, e.g. dotting a vector with itself. This\n\t        // case will disappear once packed uploading is the default.\n\t        var savedInput = input;\n\t        var targetShape = input.shape;\n\t        input.shape = texData.shape;\n\t        input = _this3.packedReshape(input, targetShape);\n\t        dataToDispose.push(input);\n\t        texData = _this3.texData.get(input.dataId);\n\t        savedInput.shape = targetShape;\n\t      }\n\n\t      _this3.uploadToGPU(input.dataId);\n\n\t      return {\n\t        shape: input.shape,\n\t        texData: texData,\n\t        isUniform: false\n\t      };\n\t    });\n\t    this.uploadToGPU(output.dataId);\n\t    var outputData = {\n\t      shape: output.shape,\n\t      texData: outData,\n\t      isUniform: false\n\t    };\n\t    var key = makeShaderKey(program, inputsData, outputData);\n\t    var binary = this.getAndSaveBinary(key, function () {\n\t      return compileProgram(_this3.gpgpu, program, inputsData, outputData);\n\t    });\n\t    var shouldTimeProgram = this.activeTimers != null;\n\t    var query;\n\n\t    if (shouldTimeProgram) {\n\t      query = this.startTimer();\n\t    }\n\n\t    runProgram(this.gpgpu, binary, inputsData, outputData, customSetup);\n\t    dataToDispose.forEach(function (info) {\n\t      return _this3.disposeIntermediateTensorInfo(info);\n\t    });\n\n\t    if (shouldTimeProgram) {\n\t      query = this.endTimer(query);\n\t      this.activeTimers.push({\n\t        name: program.constructor.name,\n\t        query: this.getQueryTime(query)\n\t      });\n\t    }\n\n\t    if (!env().getBool('WEBGL_LAZILY_UNPACK') && outData.isPacked && preventEagerUnpackingOfOutput === false) {\n\t      var unpacked = this.unpackTensor(output);\n\t      this.disposeIntermediateTensorInfo(output);\n\t      return unpacked;\n\t    }\n\n\t    return output;\n\t  };\n\n\t  _proto.compileAndRun = function compileAndRun(program, inputs, outputDtype, customSetup, preventEagerUnpackingOfOutput) {\n\t    if (preventEagerUnpackingOfOutput === void 0) {\n\t      preventEagerUnpackingOfOutput = false;\n\t    }\n\n\t    outputDtype = outputDtype || inputs[0].dtype;\n\t    var outInfo = this.runWebGLProgram(program, inputs, outputDtype, customSetup, preventEagerUnpackingOfOutput);\n\t    return engine().makeTensorFromDataId(outInfo.dataId, outInfo.shape, outInfo.dtype);\n\t  };\n\n\t  _proto.getAndSaveBinary = function getAndSaveBinary(key, getBinary) {\n\t    if (!(key in this.binaryCache)) {\n\t      this.binaryCache[key] = getBinary();\n\t    }\n\n\t    return this.binaryCache[key];\n\t  };\n\n\t  _proto.getTextureManager = function getTextureManager() {\n\t    return this.textureManager;\n\t  };\n\n\t  _proto.dispose = function dispose() {\n\t    var _this4 = this;\n\n\t    if (this.disposed) {\n\t      return;\n\t    } // Avoid disposing the compiled webgl programs during unit testing because\n\t    // it slows down test execution.\n\n\n\t    if (!env().getBool('IS_TEST')) {\n\t      var allKeys = Object.keys(this.binaryCache);\n\t      allKeys.forEach(function (key) {\n\t        _this4.gpgpu.deleteProgram(_this4.binaryCache[key].webGLProgram);\n\n\t        delete _this4.binaryCache[key];\n\t      });\n\t    }\n\n\t    this.textureManager.dispose();\n\n\t    if (this.canvas != null && typeof HTMLCanvasElement !== 'undefined' && this.canvas instanceof HTMLCanvasElement) {\n\t      this.canvas.remove();\n\t    } else {\n\t      this.canvas = null;\n\t    }\n\n\t    if (this.gpgpuCreatedLocally) {\n\t      this.gpgpu.program = null;\n\t      this.gpgpu.dispose();\n\t    }\n\n\t    this.disposed = true;\n\t  };\n\n\t  _proto.floatPrecision = function floatPrecision() {\n\t    var _this5 = this;\n\n\t    if (this.floatPrecisionValue == null) {\n\t      this.floatPrecisionValue = tidy(function () {\n\t        if (!env().get('WEBGL_RENDER_FLOAT32_ENABLED')) {\n\t          // Momentarily switching DEBUG flag to false so we don't throw an\n\t          // error trying to upload a small value.\n\t          var debugFlag = env().getBool('DEBUG');\n\t          env().set('DEBUG', false);\n\n\t          var underflowCheckValue = _this5.abs(scalar(1e-8)).dataSync()[0];\n\n\t          env().set('DEBUG', debugFlag);\n\n\t          if (underflowCheckValue > 0) {\n\t            return 32;\n\t          }\n\t        }\n\n\t        return 16;\n\t      });\n\t    }\n\n\t    return this.floatPrecisionValue;\n\t  }\n\t  /** Returns the smallest representable number.  */\n\t  ;\n\n\t  _proto.epsilon = function epsilon() {\n\t    return this.floatPrecision() === 32 ? EPSILON_FLOAT32$1 : EPSILON_FLOAT16$1;\n\t  };\n\n\t  _proto.uploadToGPU = function uploadToGPU(dataId) {\n\t    var texData = this.texData.get(dataId);\n\t    var shape = texData.shape,\n\t        dtype = texData.dtype,\n\t        values = texData.values,\n\t        texture = texData.texture,\n\t        usage = texData.usage,\n\t        isPacked = texData.isPacked;\n\n\t    if (texture != null) {\n\t      // Array is already on GPU. No-op.\n\t      return;\n\t    }\n\n\t    var shouldTimeProgram = this.activeTimers != null;\n\t    var start;\n\n\t    if (shouldTimeProgram) {\n\t      start = now();\n\t    }\n\n\t    var texShape = texData.texShape;\n\n\t    if (texShape == null) {\n\t      texShape = getTextureShapeFromLogicalShape(shape, isPacked);\n\t      texData.texShape = texShape;\n\t    }\n\n\t    if (values != null) {\n\t      var shapeAs3D = getShapeAs3D(shape);\n\t      var program;\n\t      var width = texShape[1],\n\t          height = texShape[0];\n\t      var isByteArray = values instanceof Uint8Array;\n\n\t      if (isPacked) {\n\t        var _tex_util$getPackedMa = getPackedMatrixTextureShapeWidthHeight(texShape[0], texShape[1]);\n\n\t        width = _tex_util$getPackedMa[0];\n\t        height = _tex_util$getPackedMa[1];\n\t        program = new EncodeMatrixPackedProgram(shapeAs3D, [height, width], isByteArray);\n\t      } else {\n\t        program = new EncodeMatrixProgram(shapeAs3D, [height, width], isByteArray);\n\t      }\n\n\t      var tempDenseInputHandle = this.makeTensorInfo([height, width], dtype);\n\n\t      if (isByteArray) {\n\t        this.texData.get(tempDenseInputHandle.dataId).usage = TextureUsage.PIXELS;\n\t      } else {\n\t        this.texData.get(tempDenseInputHandle.dataId).usage = TextureUsage.UPLOAD;\n\t      }\n\n\t      this.gpgpu.uploadDenseMatrixToTexture(this.getTexture(tempDenseInputHandle.dataId), width, height, values); // We want the output to remain packed regardless of the value of\n\t      // WEBGL_PACK.\n\n\t      var preventEagerUnpacking = true;\n\t      var encodedOutputTarget = this.runWebGLProgram(program, [tempDenseInputHandle], dtype, null, preventEagerUnpacking); // Have the original texture assume the identity of the encoded output.\n\n\t      var outputTexData = this.texData.get(encodedOutputTarget.dataId);\n\t      texData.texture = outputTexData.texture;\n\t      texData.texShape = outputTexData.texShape;\n\t      texData.isPacked = outputTexData.isPacked;\n\t      texData.usage = outputTexData.usage;\n\t      this.disposeIntermediateTensorInfo(tempDenseInputHandle);\n\t      this.texData.delete(encodedOutputTarget.dataId); // Once uploaded, don't store the values on cpu.\n\n\t      texData.values = null;\n\n\t      if (shouldTimeProgram) {\n\t        this.uploadWaitMs += now() - start;\n\t      }\n\t    } else {\n\t      var newTexture = this.acquireTexture(texShape, usage, dtype, isPacked);\n\t      texData.texture = newTexture;\n\t    }\n\t  };\n\n\t  _proto.convertAndCacheOnCPU = function convertAndCacheOnCPU(dataId, float32Values) {\n\t    var texData = this.texData.get(dataId);\n\t    var dtype = texData.dtype;\n\t    this.releaseGPUData(dataId);\n\n\t    if (float32Values != null) {\n\t      texData.values = float32ToTypedArray(float32Values, dtype);\n\t    }\n\n\t    return texData.values;\n\t  };\n\n\t  _proto.acquireTexture = function acquireTexture(texShape, texType, dtype, isPacked) {\n\t    this.numBytesInGPU += this.computeBytes(texShape, dtype);\n\n\t    if (!this.warnedAboutMemory && this.numBytesInGPU > this.numMBBeforeWarning * 1024 * 1024) {\n\t      var mb = (this.numBytesInGPU / 1024 / 1024).toFixed(2);\n\t      this.warnedAboutMemory = true;\n\t      console.warn(\"High memory usage in GPU: \" + mb + \" MB, \" + \"most likely due to a memory leak\");\n\t    }\n\n\t    return this.textureManager.acquireTexture(texShape, texType, isPacked);\n\t  };\n\n\t  _proto.computeBytes = function computeBytes(shape, dtype) {\n\t    return shape[0] * shape[1] * bytesPerElement(dtype);\n\t  };\n\n\t  return MathBackendWebGL;\n\t}(KernelBackend);\n\n\tfunction float32ToTypedArray(a, dtype) {\n\t  if (dtype === 'float32' || dtype === 'complex64') {\n\t    return a;\n\t  } else if (dtype === 'int32' || dtype === 'bool') {\n\t    var result = dtype === 'int32' ? new Int32Array(a.length) : new Uint8Array(a.length);\n\n\t    for (var i = 0; i < result.length; ++i) {\n\t      result[i] = Math.round(a[i]);\n\t    }\n\n\t    return result;\n\t  } else {\n\t    throw new Error(\"Unknown dtype \" + dtype);\n\t  }\n\t}\n\n\t/** @license See the LICENSE file. */\n\t// This code is auto-generated, do not modify this file!\n\tvar version$6 = '2.8.3';\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Enforce use of half precision textures if available on the platform.\n\t *\n\t * @doc {heading: 'Environment', namespace: 'webgl'}\n\t */\n\n\tfunction forceHalfFloat() {\n\t  env().set('WEBGL_FORCE_F16_TEXTURES', true);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google Inc. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tif (isBrowser()) {\n\t  registerBackend('webgl', function () {\n\t    return new MathBackendWebGL();\n\t  }, 2\n\t  /* priority */\n\t  );\n\t} // Export webgl utilities\n\tvar webgl = {\n\t  forceHalfFloat: forceHalfFloat\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar CHECK_NAN_SNIPPET$1 = \"\\n  if (isnan(a)) return a;\\n  if (isnan(b)) return b;\\n\";\n\tvar SQUARED_DIFFERENCE = 'return (a - b) * (a - b);';\n\tvar BinaryOpProgram = function BinaryOpProgram(op, aShape, bShape) {\n\t  this.variableNames = ['A', 'B'];\n\t  this.outputShape = assertAndGetBroadcastShape(aShape, bShape);\n\t  this.userCode = \"\\n      float binaryOperation(float a, float b) {\\n        \" + op + \"\\n      }\\n\\n      void main() {\\n        float a = getAAtOutCoords();\\n        float b = getBAtOutCoords();\\n        setOutput(binaryOperation(a, b));\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar CHECK_NAN_SNIPPET$2 = \"\\n  result.r = isNaN.r > 0. ? NAN : result.r;\\n  result.g = isNaN.g > 0. ? NAN : result.g;\\n  result.b = isNaN.b > 0. ? NAN : result.b;\\n  result.a = isNaN.a > 0. ? NAN : result.a;\\n\";\n\tvar ELU_DER = \"\\n  vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.)));\\n  return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0))));\\n\";\n\tvar NOT_EQUAL = \"\\n  return vec4(notEqual(a, b));\\n\";\n\tvar BinaryOpPackedProgram = function BinaryOpPackedProgram(op, aShape, bShape, checkOutOfBounds) {\n\t  if (checkOutOfBounds === void 0) {\n\t    checkOutOfBounds = false;\n\t  }\n\n\t  this.variableNames = ['A', 'B'];\n\t  this.supportsBroadcasting = true;\n\t  this.packedInputs = true;\n\t  this.packedOutput = true;\n\t  this.outputShape = assertAndGetBroadcastShape(aShape, bShape);\n\t  var rank = this.outputShape.length;\n\t  var checkOutOfBoundsString = '';\n\n\t  if (checkOutOfBounds) {\n\t    if (rank === 0 || sizeFromShape(this.outputShape) === 1) {\n\t      checkOutOfBoundsString = \"\\n          result.y = 0.;\\n          result.z = 0.;\\n          result.w = 0.;\\n        \";\n\t    } else {\n\t      var dtype = getCoordsDataType(rank);\n\t      checkOutOfBoundsString = \"\\n          \" + dtype + \" coords = getOutputCoords();\\n        \";\n\n\t      if (rank === 1) {\n\t        checkOutOfBoundsString += \"\\n            result.y = (coords + 1) >= \" + this.outputShape[0] + \" ? 0. : result.y;\\n            result.z = 0.;\\n            result.w = 0.;\\n          \";\n\t      } else {\n\t        var channels = getChannels('coords', rank);\n\t        checkOutOfBoundsString += \"\\n            bool nextRowOutOfBounds =\\n              (\" + channels[rank - 2] + \" + 1) >= \" + this.outputShape[rank - 2] + \";\\n            bool nextColOutOfBounds =\\n              (\" + channels[rank - 1] + \" + 1) >= \" + this.outputShape[rank - 1] + \";\\n            result.y = nextColOutOfBounds ? 0. : result.y;\\n            result.z = nextRowOutOfBounds ? 0. : result.z;\\n            result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\\n          \";\n\t      }\n\t    }\n\t  }\n\n\t  this.userCode = \"\\n      vec4 binaryOperation(vec4 a, vec4 b) {\\n        \" + op + \"\\n      }\\n\\n      void main() {\\n        vec4 a = getAAtOutCoords();\\n        vec4 b = getBAtOutCoords();\\n\\n        vec4 result = binaryOperation(a, b);\\n        \" + checkOutOfBoundsString + \"\\n\\n        setOutput(result);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction identity$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var x = inputs.x;\n\t  backend.incRef(x.dataId);\n\t  return {\n\t    dataId: x.dataId,\n\t    shape: x.shape,\n\t    dtype: x.dtype\n\t  };\n\t}\n\tvar identityConfig$1 = {\n\t  kernelName: Identity,\n\t  backendName: 'webgl',\n\t  kernelFunc: identity$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * In WebGL data is stored in GPU textures which can't be efficiently copied, so\n\t * complex tensors share data with their real and imaginary components. Complex\n\t * tensors increment the `complexParentRefCount` properties of the underlying\n\t * data buckets to prevent them from being disposed, as the engine's disposal\n\t * logic does not account for data sharing by complex tensors.\n\t *\n\t * When a complex tensor is disposed, it will explicitly decrease the\n\t * `complexParentRefCount` properties of its underlying components.\n\t */\n\n\tfunction complex$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var real = inputs.real,\n\t      imag = inputs.imag;\n\t  var complexInfo = backend.makeTensorInfo(real.shape, 'complex64');\n\t  var complex = backend.texData.get(complexInfo.dataId);\n\t  var realTensorInfo = identity$2({\n\t    inputs: {\n\t      x: real\n\t    },\n\t    backend: backend\n\t  });\n\t  var realData = backend.texData.get(realTensorInfo.dataId);\n\t  realData.complexParentRefCount++;\n\t  var imagTensorInfo = identity$2({\n\t    inputs: {\n\t      x: imag\n\t    },\n\t    backend: backend\n\t  });\n\t  var imagData = backend.texData.get(imagTensorInfo.dataId);\n\t  imagData.complexParentRefCount++;\n\t  complex.complexTensorInfos = {\n\t    real: realTensorInfo,\n\t    imag: imagTensorInfo\n\t  };\n\t  return complexInfo;\n\t}\n\tvar complexConfig$1 = {\n\t  kernelName: Complex,\n\t  backendName: 'webgl',\n\t  kernelFunc: complex$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar LEAKYRELU = \"return (a < 0.) ? b * a : a;\";\n\tvar LEAKYRELU_PACKED = \"\\n  vec4 aLessThanZero = vec4(lessThan(a, vec4(0.)));\\n  return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\\n\";\n\tfunction leakyRelu$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var alpha = attrs.alpha;\n\t  var $alpha = backend.makeTensorInfo([], 'float32', createScalarValue(alpha, 'float32'));\n\t  var program = env().getBool('WEBGL_PACK_BINARY_OPERATIONS') ? new BinaryOpPackedProgram(LEAKYRELU_PACKED, x.shape, $alpha.shape) : new BinaryOpProgram(LEAKYRELU, x.shape, $alpha.shape);\n\t  var result = backend.runWebGLProgram(program, [x, $alpha], x.dtype);\n\t  backend.disposeIntermediateTensorInfo($alpha);\n\t  return result;\n\t}\n\tvar leakyReluConfig$1 = {\n\t  kernelName: LeakyRelu,\n\t  backendName: 'webgl',\n\t  kernelFunc: leakyRelu$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar PRELU = \"return (a < 0.) ? b * a : a;\";\n\tvar PRELU_PACKED = \"\\n  vec4 aLessThanZero = vec4(lessThan(a, vec4(0.)));\\n  return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\\n\";\n\tfunction prelu$3(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var x = inputs.x,\n\t      alpha = inputs.alpha;\n\t  var program = env().getBool('WEBGL_PACK_BINARY_OPERATIONS') ? new BinaryOpPackedProgram(PRELU_PACKED, x.shape, alpha.shape) : new BinaryOpProgram(PRELU, x.shape, alpha.shape);\n\t  return backend.runWebGLProgram(program, [x, alpha], x.dtype);\n\t}\n\tvar preluConfig$1 = {\n\t  kernelName: Prelu,\n\t  backendName: 'webgl',\n\t  kernelFunc: prelu$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar CHECK_NAN_SNIPPET_UNARY = \"if (isnan(x)) return x;\";\n\tvar CHECK_NAN_SNIPPET_BINARY = \"\\n  if (isnan(a)) return a;\\n  if (isnan(b)) return b;\\n\";\n\tvar CHECK_NAN_SNIPPET_BINARY_PACKED = \"\\n  result.r = isNaN.r > 0. ? NAN : result.r;\\n  result.g = isNaN.g > 0. ? NAN : result.g;\\n  result.b = isNaN.b > 0. ? NAN : result.b;\\n  result.a = isNaN.a > 0. ? NAN : result.a;\\n\";\n\t/**\n\t * Template that creates a `KernelFunc` for unary ops.\n\t * @param opSnippet Op snippet to create `UnaryOpProgram`.\n\t * @param packedOpSnippet Op snippet to create `UnaryOpPackedProgram`.\n\t * @param dtype Optional. If set, the result has this dtype. Otherwise, the\n\t *     result has the same dtype as the first input. This is mainly used in\n\t *     comparison kernels, such as Equal, Less, Greater, etc.\n\t */\n\n\tfunction unaryKernelFunc$1(_ref) {\n\t  var opSnippet = _ref.opSnippet,\n\t      packedOpSnippet = _ref.packedOpSnippet,\n\t      cpuKernelImpl = _ref.cpuKernelImpl,\n\t      dtype = _ref.dtype;\n\t  return function (_ref2) {\n\t    var inputs = _ref2.inputs,\n\t        backend = _ref2.backend;\n\t    var x = inputs.x;\n\t    var webglBackend = backend;\n\t    var $dtype = dtype || x.dtype;\n\n\t    if (webglBackend.shouldExecuteOnCPU([x]) && cpuKernelImpl != null) {\n\t      var xData = webglBackend.texData.get(x.dataId);\n\t      var outValues = cpuKernelImpl(xData.values, $dtype);\n\t      return webglBackend.makeTensorInfo(x.shape, $dtype, outValues);\n\t    }\n\n\t    var shouldUsePackedProgram = env().getBool('WEBGL_PACK_UNARY_OPERATIONS') && packedOpSnippet != null;\n\t    var program;\n\n\t    if (shouldUsePackedProgram) {\n\t      program = new UnaryOpPackedProgram(x.shape, packedOpSnippet);\n\t    } else {\n\t      program = new UnaryOpProgram(x.shape, opSnippet);\n\t    }\n\n\t    return webglBackend.runWebGLProgram(program, [x], $dtype);\n\t  };\n\t}\n\t/**\n\t * Template that creates a `KernelFunc` for binary ops.\n\t * @param opSnippet Op snippet to create `BinaryOpProgram`.\n\t * @param packedOpSnippet Op snippet to create `BinaryOpPackedProgram`.\n\t * @param checkOutOfBoundsForPackedProgram Whether to set checkOutOfBounds=true\n\t *     when creating BinaryOpPackedProgram.\n\t * @param dtype Optional. If set, the result has this dtype. Otherwise, the\n\t *     result has the same dtype as the first input. This is mainly used in\n\t *     comparison kernels, such as Equal, Less, Greater, etc.\n\t */\n\n\tfunction binaryKernelFunc$1(_ref3) {\n\t  var opSnippet = _ref3.opSnippet,\n\t      packedOpSnippet = _ref3.packedOpSnippet,\n\t      _ref3$checkOutOfBound = _ref3.checkOutOfBounds,\n\t      checkOutOfBounds = _ref3$checkOutOfBound === void 0 ? false : _ref3$checkOutOfBound,\n\t      _ref3$supportsComplex = _ref3.supportsComplex,\n\t      supportsComplex = _ref3$supportsComplex === void 0 ? false : _ref3$supportsComplex,\n\t      cpuKernelImpl = _ref3.cpuKernelImpl,\n\t      dtype = _ref3.dtype;\n\t  return function (_ref4) {\n\t    var inputs = _ref4.inputs,\n\t        backend = _ref4.backend;\n\t    var a = inputs.a,\n\t        b = inputs.b;\n\t    var webglBackend = backend;\n\n\t    if (supportsComplex && a.dtype === 'complex64') {\n\t      var aData = webglBackend.texData.get(a.dataId);\n\t      var bData = webglBackend.texData.get(b.dataId);\n\n\t      var _map = [[aData.complexTensorInfos.real, bData.complexTensorInfos.real], [aData.complexTensorInfos.imag, bData.complexTensorInfos.imag]].map(function (complexParts) {\n\t        var aPart = complexParts[0],\n\t            bPart = complexParts[1];\n\t        var aHandle = {\n\t          dataId: aPart.dataId,\n\t          dtype: aPart.dtype,\n\t          shape: a.shape\n\t        };\n\t        var bHandle = {\n\t          dataId: bPart.dataId,\n\t          dtype: bPart.dtype,\n\t          shape: b.shape\n\t        };\n\t        var program = new BinaryOpProgram(opSnippet, a.shape, b.shape);\n\t        return webglBackend.runWebGLProgram(program, [aHandle, bHandle], upcastType(aPart.dtype, bPart.dtype));\n\t      }),\n\t          real = _map[0],\n\t          imag = _map[1];\n\n\t      var complexOutput = complex$2({\n\t        inputs: {\n\t          real: real,\n\t          imag: imag\n\t        },\n\t        backend: webglBackend\n\t      });\n\t      webglBackend.disposeIntermediateTensorInfo(real);\n\t      webglBackend.disposeIntermediateTensorInfo(imag); // TODO(annxingyuan): Implement CPU forwarding for complex inputs.\n\n\t      return complexOutput;\n\t    }\n\n\t    var $dtype = dtype || upcastType(a.dtype, b.dtype);\n\n\t    if (webglBackend.shouldExecuteOnCPU([a, b]) && cpuKernelImpl != null) {\n\t      var _aData = webglBackend.texData.get(a.dataId);\n\n\t      var _bData = webglBackend.texData.get(b.dataId);\n\n\t      var _cpuKernelImpl = cpuKernelImpl(a.shape, b.shape, _aData.values, _bData.values, $dtype),\n\t          outValues = _cpuKernelImpl[0],\n\t          outShape = _cpuKernelImpl[1];\n\n\t      var out = webglBackend.makeTensorInfo(outShape, $dtype);\n\t      var outData = webglBackend.texData.get(out.dataId);\n\t      outData.values = outValues;\n\t      return out;\n\t    }\n\n\t    var shouldUsePackedProgram = env().getBool('WEBGL_PACK_BINARY_OPERATIONS') && packedOpSnippet != null;\n\t    var program;\n\n\t    if (shouldUsePackedProgram) {\n\t      program = new BinaryOpPackedProgram(packedOpSnippet, a.shape, b.shape, checkOutOfBounds);\n\t    } else {\n\t      program = new BinaryOpProgram(opSnippet, a.shape, b.shape);\n\t    }\n\n\t    return webglBackend.runWebGLProgram(program, [a, b], $dtype);\n\t  };\n\t}\n\tfunction mapActivationToShaderProgram(activation, packed) {\n\t  if (packed === void 0) {\n\t    packed = false;\n\t  }\n\n\t  if (activation === 'linear') {\n\t    if (packed) {\n\t      return LINEAR$1;\n\t    }\n\n\t    return LINEAR;\n\t  } else if (activation === 'relu') {\n\t    if (packed) {\n\t      return RELU$1;\n\t    }\n\n\t    return RELU;\n\t  } else if (activation === 'elu') {\n\t    if (packed) {\n\t      return ELU$2;\n\t    }\n\n\t    return ELU$1;\n\t  } else if (activation === 'relu6') {\n\t    if (packed) {\n\t      return RELU6$1;\n\t    }\n\n\t    return RELU6;\n\t  } else if (activation === 'prelu') {\n\t    if (packed) {\n\t      return PRELU_PACKED;\n\t    }\n\n\t    return PRELU;\n\t  } else if (activation === 'leakyrelu') {\n\t    if (packed) {\n\t      return LEAKYRELU_PACKED;\n\t    }\n\n\t    return LEAKYRELU;\n\t  }\n\n\t  throw new Error(\"Activation \" + activation + \" has not been implemented for the WebGL backend.\");\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar MatMulPackedProgram = function MatMulPackedProgram(aShape, bShape, outputShape, transposeA, transposeB, addBias, activation, hasPreluActivation, hasLeakyreluActivation) {\n\t  if (transposeA === void 0) {\n\t    transposeA = false;\n\t  }\n\n\t  if (transposeB === void 0) {\n\t    transposeB = false;\n\t  }\n\n\t  if (addBias === void 0) {\n\t    addBias = false;\n\t  }\n\n\t  if (activation === void 0) {\n\t    activation = null;\n\t  }\n\n\t  if (hasPreluActivation === void 0) {\n\t    hasPreluActivation = false;\n\t  }\n\n\t  if (hasLeakyreluActivation === void 0) {\n\t    hasLeakyreluActivation = false;\n\t  }\n\n\t  this.variableNames = ['matrixA', 'matrixB'];\n\t  this.packedInputs = true;\n\t  this.packedOutput = true;\n\t  this.outputShape = outputShape;\n\t  var sharedDim = transposeA ? aShape[1] : aShape[2];\n\t  var sharedDimensionPacked = Math.ceil(sharedDim / 2);\n\t  var aSample = transposeA ? 'i * 2, rc.y' : 'rc.y, i * 2';\n\t  var bSample = transposeB ? 'rc.z, i * 2' : 'i * 2, rc.z';\n\t  var aSwizzle = transposeA ? ['a.xxyy', 'a.zzww'] : ['a.xxzz', 'a.yyww'];\n\t  var bSwizzle = transposeB ? ['b.xzxz', 'b.ywyw'] : ['b.xyxy', 'b.zwzw'];\n\t  var activationSnippet = '',\n\t      applyActivationSnippet = '';\n\n\t  if (activation) {\n\t    if (hasPreluActivation) {\n\t      activationSnippet = \"vec4 activation(vec4 a) {\\n          vec4 b = getPreluActivationWeightsAtOutCoords();\\n          \" + activation + \"\\n        }\";\n\t    } else if (hasLeakyreluActivation) {\n\t      activationSnippet = \"vec4 activation(vec4 a) {\\n          vec4 b = getLeakyreluAlphaAtOutCoords();\\n          \" + activation + \"\\n        }\";\n\t    } else {\n\t      activationSnippet = \"vec4 activation(vec4 x) {\\n          \" + activation + \"\\n        }\";\n\t    }\n\n\t    applyActivationSnippet = \"result = activation(result);\";\n\t  }\n\n\t  var addBiasSnippet = addBias ? 'result += getBiasAtOutCoords();' : '';\n\n\t  if (addBias) {\n\t    this.variableNames.push('bias');\n\t  }\n\n\t  if (hasPreluActivation) {\n\t    this.variableNames.push('preluActivationWeights');\n\t  }\n\n\t  if (hasLeakyreluActivation) {\n\t    this.variableNames.push('leakyreluAlpha');\n\t  }\n\n\t  var batchASnippet = 'rc.x';\n\t  var batchBSnippet = 'rc.x';\n\n\t  if (aShape[0] < bShape[0]) {\n\t    batchASnippet = \"int(min(float(rc.x), \" + (aShape[0] - 1) + \".))\";\n\t  } else if (bShape[0] < aShape[0]) {\n\t    batchBSnippet = \"int(min(float(rc.x), \" + (bShape[0] - 1) + \".))\";\n\t  }\n\n\t  this.userCode = \"\\n      \" + activationSnippet + \"\\n\\n      const float sharedDimension = \" + sharedDimensionPacked + \".0;\\n\\n      vec4 dot2x2ARowBCol(ivec3 rc) {\\n        vec4 result = vec4(0);\\n        for (int i = 0; i < \" + sharedDimensionPacked + \"; i++) {\\n          int batchA = \" + batchASnippet + \";\\n          int batchB = \" + batchBSnippet + \";\\n          vec4 a = getMatrixA(batchA, \" + aSample + \");\\n          vec4 b = getMatrixB(batchB, \" + bSample + \");\\n\\n          // These swizzled products need to be separately added.\\n          // See: https://github.com/tensorflow/tfjs/issues/1735\\n          result += (\" + aSwizzle[0] + \" * \" + bSwizzle[0] + \");\\n          result += (\" + aSwizzle[1] + \" * \" + bSwizzle[1] + \");\\n        }\\n        return result;\\n      }\\n\\n      void main() {\\n        ivec3 rc = getOutputCoords();\\n        vec4 result = dot2x2ARowBCol(rc);\\n\\n        \" + addBiasSnippet + \"\\n\\n        \" + applyActivationSnippet + \"\\n\\n        setOutput(result);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t// ArBr + ArBi + AiBr + AiBi = ArBr - AB + ArBi + AiBr\n\t// Yr = ArBr - AB\n\t// Yi = ArBi + AiBr\n\n\tvar COMPLEX_MULTIPLY = {\n\t  REAL: 'return areal * breal - aimag * bimag;',\n\t  IMAG: 'return areal * bimag + aimag * breal;'\n\t};\n\tvar BinaryOpComplexProgram = function BinaryOpComplexProgram(op, aShape, bShape) {\n\t  this.variableNames = ['AReal', 'AImag', 'BReal', 'BImag'];\n\t  this.outputShape = assertAndGetBroadcastShape(aShape, bShape);\n\t  this.userCode = \"\\n      float binaryOpComplex(\\n          float areal, float aimag, float breal, float bimag) {\\n        \" + op + \"\\n      }\\n\\n      void main() {\\n        float areal = getARealAtOutCoords();\\n        float aimag = getAImagAtOutCoords();\\n        float breal = getBRealAtOutCoords();\\n        float bimag = getBImagAtOutCoords();\\n        setOutput(binaryOpComplex(areal, aimag, breal, bimag));\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar MUL = 'return a * b;';\n\tfunction multiply$3(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var a = inputs.a,\n\t      b = inputs.b;\n\t  var dtype = upcastType(a.dtype, b.dtype);\n\n\t  if (a.dtype === 'complex64') {\n\t    var aData = backend.texData.get(a.dataId);\n\t    var bData = backend.texData.get(b.dataId);\n\t    var realProgram = new BinaryOpComplexProgram(COMPLEX_MULTIPLY.REAL, a.shape, b.shape);\n\t    var imagProgram = new BinaryOpComplexProgram(COMPLEX_MULTIPLY.IMAG, a.shape, b.shape);\n\t    var _inputs = [{\n\t      dataId: aData.complexTensorInfos.real.dataId,\n\t      dtype: aData.complexTensorInfos.real.dtype,\n\t      shape: a.shape\n\t    }, {\n\t      dataId: aData.complexTensorInfos.imag.dataId,\n\t      dtype: aData.complexTensorInfos.imag.dtype,\n\t      shape: a.shape\n\t    }, {\n\t      dataId: bData.complexTensorInfos.real.dataId,\n\t      dtype: bData.complexTensorInfos.real.dtype,\n\t      shape: b.shape\n\t    }, {\n\t      dataId: bData.complexTensorInfos.imag.dataId,\n\t      dtype: bData.complexTensorInfos.imag.dtype,\n\t      shape: b.shape\n\t    }];\n\t    var realPart = backend.runWebGLProgram(realProgram, _inputs, 'float32');\n\t    var imagPart = backend.runWebGLProgram(imagProgram, _inputs, 'float32');\n\t    var complexOutput = complex$2({\n\t      inputs: {\n\t        real: realPart,\n\t        imag: imagPart\n\t      },\n\t      backend: backend\n\t    });\n\t    backend.disposeIntermediateTensorInfo(realPart);\n\t    backend.disposeIntermediateTensorInfo(imagPart); // TODO(annxingyuan): CPU forwarding for complex inputs.\n\n\t    return complexOutput;\n\t  }\n\n\t  if (backend.shouldExecuteOnCPU([a, b])) {\n\t    var _aData = backend.texData.get(a.dataId);\n\n\t    var _bData = backend.texData.get(b.dataId);\n\n\t    var _cpuMultiply = multiplyImplCPU(a.shape, b.shape, _aData.values, _bData.values, dtype),\n\t        outValues = _cpuMultiply[0],\n\t        outShape = _cpuMultiply[1];\n\n\t    var out = backend.makeTensorInfo(outShape, dtype);\n\t    var outData = backend.texData.get(out.dataId);\n\t    outData.values = outValues;\n\t    return out;\n\t  }\n\n\t  var program;\n\n\t  if (env().getBool('WEBGL_PACK_BINARY_OPERATIONS')) {\n\t    program = new BinaryOpPackedProgram(MUL, a.shape, b.shape);\n\t  } else {\n\t    program = new BinaryOpProgram(MUL, a.shape, b.shape);\n\t  }\n\n\t  return backend.runWebGLProgram(program, [a, b], dtype);\n\t}\n\tvar multiplyConfig$1 = {\n\t  kernelName: Multiply,\n\t  backendName: 'webgl',\n\t  kernelFunc: multiply$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction packedReshape(input, afterShape, backend) {\n\t  var input3DShape = [getBatchDim(input.shape)].concat(getRowsCols(input.shape));\n\t  var input3D = {\n\t    dtype: input.dtype,\n\t    shape: input3DShape,\n\t    dataId: input.dataId\n\t  };\n\t  var afterShapeAs3D = [getBatchDim(afterShape)].concat(getRowsCols(afterShape));\n\t  var program = new ReshapePackedProgram(afterShapeAs3D, input3DShape);\n\t  var preventEagerUnpackingOfOutput = true;\n\t  var output = backend.runWebGLProgram(program, [input3D], input.dtype, null\n\t  /* customSetup */\n\t  , preventEagerUnpackingOfOutput);\n\t  return {\n\t    dataId: output.dataId,\n\t    shape: afterShape,\n\t    dtype: output.dtype\n\t  };\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction reshape$3(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var shape = attrs.shape;\n\t  var webglBackend = backend;\n\t  var xSize = sizeFromShape(x.shape);\n\t  var $shape = inferFromImplicitShape(shape, xSize);\n\t  var $xSize = sizeFromShape($shape);\n\t  assert(xSize === $xSize, function () {\n\t    return \"The new shape (\" + $shape + \") has \" + $xSize + \" elements and the old \" + (\"shape (\" + x.shape + \") has \" + xSize + \" elements. The new shape and old \") + \"shape must have the same number of elements.\";\n\t  });\n\t  var xTexData = webglBackend.texData.get(x.dataId);\n\n\t  if (xTexData.isPacked && !isReshapeFree(x.shape, $shape) && !(xTexData.texture !== null && isReshapeFree(xTexData.shape, $shape))) {\n\t    return packedReshape(x, $shape, webglBackend);\n\t  }\n\n\t  webglBackend.incRef(x.dataId);\n\t  return {\n\t    dataId: x.dataId,\n\t    shape: $shape,\n\t    dtype: x.dtype\n\t  };\n\t}\n\tvar reshapeConfig$1 = {\n\t  kernelName: Reshape,\n\t  backendName: 'webgl',\n\t  kernelFunc: reshape$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar MeanProgram = function MeanProgram(reduceInfo, divisor) {\n\t  this.variableNames = ['x'];\n\t  var windowSize = reduceInfo.windowSize,\n\t      batchSize = reduceInfo.batchSize,\n\t      inSize = reduceInfo.inSize,\n\t      outSize = reduceInfo.outSize;\n\t  this.outputShape = [batchSize, outSize];\n\t  var windowSizeNearestVec4 = Math.floor(windowSize / 4) * 4;\n\t  var windowSizeVec4Remainder = windowSize % 4;\n\t  var updateSnippet = \"sumValue += dot(values, ones);\";\n\n\t  if (divisor != null) {\n\t    var denominator = 1 / divisor;\n\t    updateSnippet = \"sumValue += dot(values * \" + (isInt(denominator) ? denominator.toPrecision(2) : denominator) + \", ones);\";\n\t  }\n\n\t  var checkOutOfBounds = '';\n\n\t  if (inSize % windowSize > 0) {\n\t    checkOutOfBounds = \"\\n        if (inIdx < 0 || inIdx >= \" + inSize + \") {\\n          return 0.0;\\n        }\\n      \";\n\t  }\n\n\t  this.userCode = \"\\n      const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\\n\\n      float getValue(int batch, int inIdx) {\\n        \" + checkOutOfBounds + \"\\n        return getX(batch, inIdx);\\n      }\\n\\n      void main() {\\n        ivec2 coords = getOutputCoords();\\n        int batch = coords[0];\\n        int outIdx = coords[1];\\n        int inOffset = outIdx * \" + windowSize + \";\\n\\n        float sumValue = 0.0;\\n\\n        for (int i = 0; i < \" + windowSizeNearestVec4 + \"; i += 4) {\\n          int inIdx = inOffset + i;\\n          vec4 values = vec4(\\n            getValue(batch, inIdx),\\n            getValue(batch, inIdx + 1),\\n            getValue(batch, inIdx + 2),\\n            getValue(batch, inIdx + 3)\\n          );\\n\\n          \" + updateSnippet + \"\\n        }\\n\\n        int inIdx = inOffset + \" + windowSizeNearestVec4 + \";\\n        if (\" + (windowSizeVec4Remainder === 1) + \") {\\n          vec4 values = vec4(getValue(batch, inIdx), 0.0, 0.0, 0.0);\\n\\n          \" + updateSnippet + \"\\n        } else if (\" + (windowSizeVec4Remainder === 2) + \") {\\n          vec4 values = vec4(\\n            getValue(batch, inIdx),\\n            getValue(batch, inIdx + 1), 0.0, 0.0);\\n\\n          \" + updateSnippet + \"\\n        } else if (\" + (windowSizeVec4Remainder === 3) + \") {\\n          vec4 values = vec4(\\n            getValue(batch, inIdx),\\n            getValue(batch, inIdx + 1),\\n            getValue(batch, inIdx + 2), 0.0);\\n\\n          \" + updateSnippet + \"\\n        }\\n        setOutput(sumValue);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ReduceProgram = function ReduceProgram(reduceInfo, reduceType) {\n\t  this.variableNames = ['x'];\n\t  var windowSize = reduceInfo.windowSize,\n\t      batchSize = reduceInfo.batchSize,\n\t      inSize = reduceInfo.inSize,\n\t      outSize = reduceInfo.outSize;\n\t  this.outputShape = [batchSize, outSize];\n\t  var initializationValue = '0.0';\n\t  var compareOp = \"\";\n\n\t  if (reduceType === 'prod') {\n\t    initializationValue = '1.0';\n\t  } else if (reduceType === 'min') {\n\t    // WebGL on Firefox Linux can't compile 1/0 so we do 1/eps.\n\t    initializationValue = '1.0 / 1e-20';\n\t    compareOp = \"min\";\n\t  } else if (reduceType === 'max') {\n\t    // WebGL on Firefox Linux can't compile 1/0 so we do 1/eps.\n\t    initializationValue = '-1.0 / 1e-20';\n\t    compareOp = \"max\";\n\t  }\n\n\t  var returnValue = reduceType + \"(\" + reduceType + \"(\" + reduceType + \"(\" + 'minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])';\n\n\t  if (reduceType === 'sum') {\n\t    returnValue = \"sumValue\";\n\t  } else if (reduceType === 'prod') {\n\t    returnValue = \"prodValue\";\n\t  } else if (reduceType === 'all') {\n\t    returnValue = \"allValue\";\n\t  } else if (reduceType === 'any') {\n\t    returnValue = \"anyValue\";\n\t  }\n\n\t  var windowSizeNearestVec4 = Math.floor(windowSize / 4) * 4;\n\t  var windowSizeVec4Remainder = windowSize % 4;\n\t  var updateSnippet = \"\\n      if (\" + (reduceType === 'sum') + \") {\\n        sumValue += dot(values, ones);\\n      } else if (\" + (reduceType === 'prod') + \") {\\n        vec2 tmp = vec2(values[0], values[1]) * vec2(values[2], values[3]);\\n        prodValue *= tmp[0] * tmp[1];\\n      } else {\\n        minMaxValue = \" + compareOp + \"(values, minMaxValue);\\n      }\\n    \";\n\t  var vecType = \"vec4\";\n\n\t  if (reduceType === 'all') {\n\t    initializationValue = '1.0';\n\t    updateSnippet = \"\\n        bool reducedAllValue = all(values);\\n        float floatedReducedAllValue = float(reducedAllValue);\\n        allValue = float(allValue >= 1.0 && floatedReducedAllValue >= 1.0);\\n      \";\n\t    vecType = \"bvec4\";\n\t  } else if (reduceType === 'any') {\n\t    initializationValue = '0.0';\n\t    updateSnippet = \"\\n        bool reducedAnyValue = any(values);\\n        float floatedReducedAnyValue = float(reducedAnyValue);\\n        anyValue = float(anyValue >= 1.0 || floatedReducedAnyValue >= 1.0);\\n      \";\n\t    vecType = \"bvec4\";\n\t  }\n\n\t  var checkOutOfBounds = '';\n\n\t  if (inSize % windowSize > 0) {\n\t    checkOutOfBounds = \"\\n        if (inIdx < 0 || inIdx >= \" + inSize + \") {\\n          return initializationValue;\\n        }\\n      \";\n\t  }\n\n\t  this.userCode = \"\\n      const float initializationValue = \" + initializationValue + \";\\n      const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\\n\\n      float getValue(int batch, int inIdx) {\\n        \" + checkOutOfBounds + \"\\n        return getX(batch, inIdx);\\n      }\\n\\n      void main() {\\n        ivec2 coords = getOutputCoords();\\n        int batch = coords[0];\\n        int outIdx = coords[1];\\n        int inOffset = outIdx * \" + windowSize + \";\\n\\n        vec4 minMaxValue = vec4(\" + initializationValue + \");\\n        float prodValue = 1.0;\\n        float sumValue = 0.0;\\n        float allValue = 1.0;\\n        float anyValue = 0.0;\\n\\n        for (int i = 0; i < \" + windowSizeNearestVec4 + \"; i += 4) {\\n          int inIdx = inOffset + i;\\n          \" + vecType + \" values = \" + vecType + \"(\\n            getValue(batch, inIdx),\\n            getValue(batch, inIdx + 1),\\n            getValue(batch, inIdx + 2),\\n            getValue(batch, inIdx + 3)\\n          );\\n\\n          \" + updateSnippet + \"\\n        }\\n\\n        int inIdx = inOffset + \" + windowSizeNearestVec4 + \";\\n        if (\" + (windowSizeVec4Remainder === 1) + \") {\\n          \" + vecType + \" values = \" + vecType + \"(\\n            getValue(batch, inIdx),\\n            initializationValue,\\n            initializationValue,\\n            initializationValue\\n          );\\n\\n          \" + updateSnippet + \"\\n        } else if (\" + (windowSizeVec4Remainder === 2) + \") {\\n          \" + vecType + \" values = \" + vecType + \"(\\n            getValue(batch, inIdx),\\n            getValue(batch, inIdx + 1),\\n            initializationValue,\\n            initializationValue\\n          );\\n\\n          \" + updateSnippet + \"\\n        } else if (\" + (windowSizeVec4Remainder === 3) + \") {\\n          \" + vecType + \" values = \" + vecType + \"(\\n            getValue(batch, inIdx),\\n            getValue(batch, inIdx + 1),\\n            getValue(batch, inIdx + 2),\\n            initializationValue\\n          );\\n\\n          \" + updateSnippet + \"\\n        }\\n        setOutput(\" + returnValue + \");\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t// reduction.\n\n\tfunction getReductionStages(inShape) {\n\t  var stages = [];\n\n\t  while (stages.length === 0 || stages[stages.length - 1].outSize !== 1) {\n\t    var outSize = stages.length ? stages[stages.length - 1].outSize : inShape[1];\n\t    var windowSize = computeOptimalWindowSize(outSize);\n\t    stages.push({\n\t      inSize: outSize,\n\t      windowSize: windowSize,\n\t      outSize: Math.ceil(outSize / windowSize)\n\t    });\n\t  }\n\n\t  return stages;\n\t}\n\n\tfunction reduce(x, dtype, reductionType, backend) {\n\t  var reductionStages = getReductionStages(x.shape);\n\t  var result = x;\n\n\t  for (var i = 0; i < reductionStages.length; i++) {\n\t    var _reductionStages$i = reductionStages[i],\n\t        inSize = _reductionStages$i.inSize,\n\t        windowSize = _reductionStages$i.windowSize,\n\t        outSize = _reductionStages$i.outSize;\n\t    var program = void 0;\n\t    var previousResult = void 0;\n\n\t    if (reductionType === 'mean') {\n\t      program = i === 0 ? new MeanProgram({\n\t        windowSize: windowSize,\n\t        inSize: inSize,\n\t        batchSize: x.shape[0],\n\t        outSize: outSize\n\t      }, inSize) : new MeanProgram({\n\t        windowSize: windowSize,\n\t        inSize: inSize,\n\t        batchSize: x.shape[0],\n\t        outSize: outSize\n\t      });\n\t    } else {\n\t      program = new ReduceProgram({\n\t        windowSize: windowSize,\n\t        inSize: inSize,\n\t        batchSize: x.shape[0],\n\t        outSize: outSize\n\t      }, reductionType);\n\t    }\n\n\t    previousResult = result;\n\t    result = backend.runWebGLProgram(program, [result], dtype);\n\n\t    if (previousResult.dataId !== x.dataId) {\n\t      backend.disposeIntermediateTensorInfo(previousResult);\n\t    }\n\t  }\n\n\t  return result;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar TransposeProgram = function TransposeProgram(aShape, newDim) {\n\t  this.variableNames = ['A'];\n\t  var outputShape = new Array(aShape.length);\n\n\t  for (var i = 0; i < outputShape.length; i++) {\n\t    outputShape[i] = aShape[newDim[i]];\n\t  }\n\n\t  this.outputShape = outputShape;\n\t  this.rank = outputShape.length;\n\t  var dtype = getCoordsDataType(this.rank);\n\t  var switched = getSwitchedCoords(newDim);\n\t  this.userCode = \"\\n    void main() {\\n      \" + dtype + \" resRC = getOutputCoords();\\n      setOutput(getA(\" + switched + \"));\\n    }\\n    \";\n\t};\n\n\tfunction getSwitchedCoords(newDim) {\n\t  var rank = newDim.length;\n\n\t  if (rank > 6) {\n\t    throw Error(\"Transpose for rank \" + rank + \" is not yet supported\");\n\t  }\n\n\t  var originalOrder = ['resRC.x', 'resRC.y', 'resRC.z', 'resRC.w', 'resRC.u', 'resRC.v'];\n\t  var switchedCoords = new Array(rank);\n\n\t  for (var i = 0; i < newDim.length; i++) {\n\t    switchedCoords[newDim[i]] = originalOrder[i];\n\t  }\n\n\t  return switchedCoords.join();\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar TransposePackedProgram = function TransposePackedProgram(aShape, newDim) {\n\t  this.variableNames = ['A'];\n\t  this.packedInputs = true;\n\t  this.packedOutput = true;\n\t  var outputShape = new Array(aShape.length);\n\n\t  for (var i = 0; i < outputShape.length; i++) {\n\t    outputShape[i] = aShape[newDim[i]];\n\t  }\n\n\t  this.outputShape = outputShape;\n\t  this.rank = outputShape.length;\n\n\t  if (this.rank > 6) {\n\t    throw Error(\"Packed transpose for rank \" + this.rank + \" is not yet supported.\");\n\t  }\n\n\t  var dtype = getCoordsDataType(this.rank);\n\t  var outputOrder = getVecChannels('rc', this.rank);\n\t  var switchedOrder = new Array(this.rank);\n\n\t  for (var _i = 0; _i < newDim.length; _i++) {\n\t    switchedOrder[newDim[_i]] = outputOrder[_i];\n\t  }\n\n\t  var innerDims = \"vec2(\" + switchedOrder.slice(-2).join() + \")\";\n\t  var nextColumn = \"++\" + outputOrder[this.rank - 1] + \" < \" + outputShape[this.rank - 1];\n\t  var getc = \"getChannel(getA(\" + switchedOrder.join() + \"), \" + innerDims + \")\";\n\t  this.userCode = \"\\n    void main() {\\n      \" + dtype + \" rc = getOutputCoords();\\n      vec4 result = vec4(0.);\\n      result[0] = \" + getc + \";\\n      if(\" + nextColumn + \") {\\n        result[1] = \" + getc + \";\\n      }\\n      --\" + outputOrder[this.rank - 1] + \";\\n      if(++\" + outputOrder[this.rank - 2] + \" < \" + outputShape[this.rank - 2] + \") {\\n        result[2] = \" + getc + \";\\n        if(\" + nextColumn + \") {\\n          result[3] = \" + getc + \";\\n        }\\n      }\\n      setOutput(result);\\n    }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction transposeImpl$1(x, perm, backend) {\n\t  var program = env().getBool('WEBGL_PACK_ARRAY_OPERATIONS') ? new TransposePackedProgram(x.shape, perm) : new TransposeProgram(x.shape, perm);\n\t  return backend.runWebGLProgram(program, [x], x.dtype);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction sumImpl(x, axis, keepDims, backend) {\n\t  var reductionIndices = axis;\n\t  var xRank = x.shape.length;\n\t  var origAxes = parseAxisParam(reductionIndices, x.shape);\n\t  var axes = origAxes;\n\t  var permutedAxes = getAxesPermutation(axes, xRank);\n\t  var sumInputIsTransposed = permutedAxes != null;\n\t  var sumInput = x;\n\n\t  if (sumInputIsTransposed) {\n\t    sumInput = transposeImpl$1(x, permutedAxes, backend);\n\t    axes = getInnerMostAxes(axes.length, xRank);\n\t  }\n\n\t  assertAxesAreInnerMostDims('sum', axes, xRank);\n\n\t  var _backend_util$compute = computeOutAndReduceShapes(sumInput.shape, axes),\n\t      sumOutShape = _backend_util$compute[0],\n\t      reduceShape = _backend_util$compute[1];\n\n\t  var outShape = sumOutShape;\n\n\t  if (keepDims) {\n\t    // rather than reshape at the end, set the target shape here.\n\t    outShape = expandShapeToKeepDim(sumOutShape, origAxes);\n\t  }\n\n\t  var inSize = sizeFromShape(reduceShape);\n\t  var xSize = sizeFromShape(x.shape);\n\t  var batchSize = xSize / inSize;\n\t  var reshapedInput = reshape$3({\n\t    inputs: {\n\t      x: sumInput\n\t    },\n\t    attrs: {\n\t      shape: [batchSize, inSize]\n\t    },\n\t    backend: backend\n\t  });\n\t  var outType = sumOutType(x.dtype);\n\t  var reduced = reduce(reshapedInput, outType, 'sum', backend);\n\t  var out = reshape$3({\n\t    inputs: {\n\t      x: reduced\n\t    },\n\t    attrs: {\n\t      shape: outShape\n\t    },\n\t    backend: backend\n\t  });\n\t  backend.disposeIntermediateTensorInfo(reshapedInput);\n\t  backend.disposeIntermediateTensorInfo(reduced);\n\n\t  if (sumInputIsTransposed) {\n\t    backend.disposeIntermediateTensorInfo(sumInput);\n\t  }\n\n\t  return out;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction sum$4(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var axis = attrs.axis,\n\t      keepDims = attrs.keepDims;\n\t  return sumImpl(x, axis, keepDims, backend);\n\t}\n\tvar sumConfig$1 = {\n\t  kernelName: Sum,\n\t  backendName: 'webgl',\n\t  kernelFunc: sum$4\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction transpose$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var perm = attrs.perm;\n\t  var webglBackend = backend;\n\t  var xRank = x.shape.length;\n\t  var newShape = new Array(xRank);\n\n\t  for (var i = 0; i < newShape.length; i++) {\n\t    newShape[i] = x.shape[perm[i]];\n\t  }\n\n\t  var out;\n\n\t  if (webglBackend.shouldExecuteOnCPU([x])) {\n\t    var xTexData = webglBackend.texData.get(x.dataId);\n\t    var values = xTexData.values;\n\t    var outValues = transposeImplCPU(values, x.shape, x.dtype, perm, newShape);\n\t    out = webglBackend.makeTensorInfo(newShape, x.dtype);\n\t    var outData = webglBackend.texData.get(out.dataId);\n\t    outData.values = outValues;\n\t  } else {\n\t    out = transposeImpl$1(x, perm, webglBackend);\n\t  }\n\n\t  return out;\n\t}\n\tvar transposeConfig$1 = {\n\t  kernelName: Transpose,\n\t  backendName: 'webgl',\n\t  kernelFunc: transpose$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t// to a.mul(b).sum() in order to take advantage of GPU parallelism. See\n\t// https://github.com/tensorflow/tfjs-core/pull/1379 for benchmarks.\n\n\tvar MATMUL_SHARED_DIM_THRESHOLD = 1000;\n\tfunction batchMatMulImpl(_ref) {\n\t  var a = _ref.a,\n\t      b = _ref.b,\n\t      transposeA = _ref.transposeA,\n\t      transposeB = _ref.transposeB,\n\t      backend = _ref.backend,\n\t      _ref$bias = _ref.bias,\n\t      bias = _ref$bias === void 0 ? null : _ref$bias,\n\t      _ref$preluActivationW = _ref.preluActivationWeights,\n\t      preluActivationWeights = _ref$preluActivationW === void 0 ? null : _ref$preluActivationW,\n\t      _ref$leakyreluAlpha = _ref.leakyreluAlpha,\n\t      leakyreluAlpha = _ref$leakyreluAlpha === void 0 ? 0 : _ref$leakyreluAlpha,\n\t      _ref$activation = _ref.activation,\n\t      activation = _ref$activation === void 0 ? null : _ref$activation;\n\t  var aRank = a.shape.length;\n\t  var bRank = b.shape.length;\n\t  var innerShapeA = transposeA ? a.shape[aRank - 2] : a.shape[aRank - 1];\n\t  var innerShapeB = transposeB ? b.shape[bRank - 1] : b.shape[bRank - 2];\n\t  var outerShapeA = transposeA ? a.shape[aRank - 1] : a.shape[aRank - 2];\n\t  var outerShapeB = transposeB ? b.shape[bRank - 2] : b.shape[bRank - 1];\n\t  var outerDimsA = a.shape.slice(0, -2);\n\t  var outerDimsB = b.shape.slice(0, -2);\n\t  var batchDimA = sizeFromShape(outerDimsA);\n\t  var batchDimB = sizeFromShape(outerDimsB);\n\t  var batchDimsCompatible = batchDimA === batchDimB || batchDimA === 1 || batchDimB === 1;\n\t  assert(aRank >= 2 && bRank >= 2 && batchDimsCompatible, function () {\n\t    return \"Error in matMul: the input batch dimensions must either be the \" + \"same or at least one input batch dimension must be 1. Got input \" + (\"batch dimensions of (\" + outerDimsA + \") and (\" + outerDimsB + \").\");\n\t  });\n\t  var outShapeOuterDims = batchDimA > batchDimB ? a.shape.slice(0, -2) : b.shape.slice(0, -2);\n\t  var outShape = outShapeOuterDims.concat([outerShapeA, outerShapeB]);\n\t  assert(innerShapeA === innerShapeB, function () {\n\t    return \"Error in matMul: inner shapes (\" + innerShapeA + \") and (\" + (innerShapeB + \") of Tensors with shapes \" + a.shape + \" and \") + (b.shape + \" and transposeA=\" + transposeA) + (\" and transposeB=\" + transposeB + \" must match.\");\n\t  });\n\t  var a3dShape = transposeA ? [batchDimA, innerShapeA, outerShapeA] : [batchDimA, outerShapeA, innerShapeA];\n\t  var b3dShape = transposeB ? [batchDimB, outerShapeB, innerShapeB] : [batchDimB, innerShapeB, outerShapeB]; // The rest of the implementation is designed to operate on rank-3 tensors\n\n\t  var a3d = reshape$3({\n\t    inputs: {\n\t      x: a\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: a3dShape\n\t    }\n\t  });\n\t  var b3d = reshape$3({\n\t    inputs: {\n\t      x: b\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: b3dShape\n\t    }\n\t  });\n\t  var intermediates = [a3d, b3d];\n\t  var batchDim = Math.max(batchDimA, batchDimB);\n\t  var sharedDim = transposeA ? a3d.shape[1] : a3d.shape[2];\n\t  var hasBias = bias != null;\n\t  var hasPreluActivationWeights = preluActivationWeights != null;\n\t  var hasLeakyreluAlpha = activation === 'leakyrelu';\n\t  var fusedActivation = activation != null ? mapActivationToShaderProgram(activation, true) : null;\n\t  var containsFusedOps = hasBias || hasPreluActivationWeights || hasLeakyreluAlpha || fusedActivation != null;\n\t  var out; // Since the matrices are vectors, it is faster to call mul().sum()\n\t  // because sum() is O(sqrt(N)) due to divide-and-conquer.\n\n\t  if ((outerShapeA === 1 || outerShapeB === 1) && sharedDim > MATMUL_SHARED_DIM_THRESHOLD && containsFusedOps === false) {\n\t    var aVec = a3d;\n\t    var bVec = b3d;\n\n\t    if (transposeA) {\n\t      aVec = transpose$2({\n\t        inputs: {\n\t          x: a3d\n\t        },\n\t        backend: backend,\n\t        attrs: {\n\t          perm: [0, 2, 1]\n\t        }\n\t      });\n\t      intermediates.push(aVec);\n\t    }\n\n\t    if (transposeB) {\n\t      bVec = transpose$2({\n\t        inputs: {\n\t          x: b3d\n\t        },\n\t        backend: backend,\n\t        attrs: {\n\t          perm: [0, 2, 1]\n\t        }\n\t      });\n\t      intermediates.push(bVec);\n\t    }\n\n\t    var shouldReshapeA = outerShapeB !== 1;\n\t    var shouldReshapeB = outerShapeB === 1;\n\t    var aVec3d = aVec;\n\n\t    if (shouldReshapeA) {\n\t      aVec3d = reshape$3({\n\t        inputs: {\n\t          x: aVec\n\t        },\n\t        backend: backend,\n\t        attrs: {\n\t          shape: [batchDim, sharedDim, 1]\n\t        }\n\t      });\n\t      intermediates.push(aVec3d);\n\t    }\n\n\t    var axis = outerShapeB === 1 ? 2 : 1;\n\t    var bVec3d = bVec;\n\n\t    if (shouldReshapeB) {\n\t      bVec3d = reshape$3({\n\t        inputs: {\n\t          x: bVec\n\t        },\n\t        backend: backend,\n\t        attrs: {\n\t          shape: [batchDim, 1, sharedDim]\n\t        }\n\t      });\n\t      intermediates.push(bVec3d);\n\t    }\n\n\t    var product = multiply$3({\n\t      inputs: {\n\t        a: aVec3d,\n\t        b: bVec3d\n\t      },\n\t      backend: backend\n\t    });\n\t    out = sum$4({\n\t      inputs: {\n\t        x: product\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        axis: axis,\n\t        keepDims: true\n\t      }\n\t    });\n\t    intermediates.push(product);\n\t  } else {\n\t    var dtype = upcastType(a.dtype, b.dtype);\n\t    var program = new MatMulPackedProgram(a3dShape, b3dShape, [batchDim, outerShapeA, outerShapeB], transposeA, transposeB, hasBias, fusedActivation, hasPreluActivationWeights, hasLeakyreluAlpha);\n\t    var inputs = [a3d, b3d];\n\n\t    if (bias != null) {\n\t      inputs.push(bias);\n\t    }\n\n\t    if (hasPreluActivationWeights) {\n\t      inputs.push(preluActivationWeights);\n\t    }\n\n\t    if (hasLeakyreluAlpha) {\n\t      var $leakyreluAlpha = backend.makeTensorInfo([], 'float32', createScalarValue(leakyreluAlpha, 'float32'));\n\t      inputs.push($leakyreluAlpha);\n\t      intermediates.push($leakyreluAlpha);\n\t    }\n\n\t    out = backend.runWebGLProgram(program, inputs, dtype);\n\t  }\n\n\t  var outReshaped = reshape$3({\n\t    inputs: {\n\t      x: out\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: outShape\n\t    }\n\t  });\n\t  intermediates.push(out);\n\n\t  for (var _i = 0, _intermediates = intermediates; _i < _intermediates.length; _i++) {\n\t    var i = _intermediates[_i];\n\t    backend.disposeIntermediateTensorInfo(i);\n\t  }\n\n\t  return outReshaped;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction _fusedMatMul$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var a = inputs.a,\n\t      b = inputs.b,\n\t      bias = inputs.bias,\n\t      preluActivationWeights = inputs.preluActivationWeights;\n\t  var transposeA = attrs.transposeA,\n\t      transposeB = attrs.transposeB,\n\t      activation = attrs.activation,\n\t      leakyreluAlpha = attrs.leakyreluAlpha;\n\t  return batchMatMulImpl({\n\t    a: a,\n\t    b: b,\n\t    transposeA: transposeA,\n\t    transposeB: transposeB,\n\t    backend: backend,\n\t    bias: bias,\n\t    preluActivationWeights: preluActivationWeights,\n\t    leakyreluAlpha: leakyreluAlpha,\n\t    activation: activation\n\t  });\n\t}\n\tvar _fusedMatMulConfig$1 = {\n\t  kernelName: _FusedMatMul,\n\t  backendName: 'webgl',\n\t  kernelFunc: _fusedMatMul$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ABS$1 = \"return abs(x);\";\n\tfunction abs$a(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var x = inputs.x; // TODO: handle cases when x is complex. Once the cpu implementation\n\t  // can handle complex values, refactor to use unaryKernelFunc.\n\n\t  if (backend.shouldExecuteOnCPU([x]) && x.dtype !== 'complex64') {\n\t    var xData = backend.texData.get(x.dataId);\n\t    var outValues = simpleAbsImplCPU(xData.values);\n\t    return backend.makeTensorInfo(x.shape, x.dtype, outValues);\n\t  }\n\n\t  var program;\n\n\t  if (env().getBool('WEBGL_PACK_UNARY_OPERATIONS')) {\n\t    program = new UnaryOpPackedProgram(x.shape, ABS$1);\n\t  } else {\n\t    program = new UnaryOpProgram(x.shape, ABS$1);\n\t  }\n\n\t  return backend.runWebGLProgram(program, [x], x.dtype);\n\t}\n\tvar absConfig$1 = {\n\t  kernelName: Abs,\n\t  backendName: 'webgl',\n\t  kernelFunc: abs$a\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ACOS = CHECK_NAN_SNIPPET + \"\\n  if (abs(x) > 1.) {\\n    return NAN;\\n  }\\n  return acos(x);\\n\";\n\tvar acos$2 = unaryKernelFunc$1({\n\t  opSnippet: ACOS\n\t});\n\tvar acosConfig$1 = {\n\t  kernelName: Acos,\n\t  backendName: 'webgl',\n\t  kernelFunc: acos$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ACOSH = CHECK_NAN_SNIPPET + \"\\n  if (x < 1.0) return NAN;\\nreturn log(x + sqrt(x * x - 1.0));\";\n\tvar acosh$2 = unaryKernelFunc$1({\n\t  opSnippet: ACOSH\n\t});\n\tvar acoshConfig$1 = {\n\t  kernelName: Acosh,\n\t  backendName: 'webgl',\n\t  kernelFunc: acosh$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ADD = 'return a + b;';\n\tvar addKernelFunc = binaryKernelFunc$1({\n\t  opSnippet: ADD,\n\t  packedOpSnippet: ADD,\n\t  supportsComplex: true,\n\t  cpuKernelImpl: addImplCPU\n\t});\n\tvar addConfig$1 = {\n\t  kernelName: Add,\n\t  backendName: 'webgl',\n\t  kernelFunc: addKernelFunc\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar AddNProgram = function AddNProgram(outputShape, shapes) {\n\t  this.outputShape = [];\n\t  this.outputShape = outputShape;\n\t  this.variableNames = shapes.map(function (_, i) {\n\t    return \"T\" + i;\n\t  });\n\t  var snippets = []; // Get target elements from every input tensor.\n\n\t  this.variableNames.forEach(function (variable) {\n\t    snippets.push(\"float v\" + variable + \" = get\" + variable + \"AtOutCoords();\");\n\t  }); // Calculate the sum of all elements.\n\n\t  var operation = this.variableNames.map(function (variable) {\n\t    return \"v\" + variable;\n\t  }).join(' + ');\n\t  this.userCode = \"\\n      void main() {\\n        \" + snippets.join('\\n        ') + \"\\n\\n        float result = \" + operation + \";\\n        setOutput(result);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar AddNPackedProgram = function AddNPackedProgram(outputShape, shapes) {\n\t  this.outputShape = [];\n\t  this.packedInputs = true;\n\t  this.packedOutput = true;\n\t  this.outputShape = outputShape;\n\t  this.variableNames = shapes.map(function (_, i) {\n\t    return \"T\" + i;\n\t  });\n\t  var snippets = []; // Get target elements from every input tensor.\n\n\t  this.variableNames.forEach(function (variable) {\n\t    snippets.push(\"vec4 v\" + variable + \" = get\" + variable + \"AtOutCoords();\");\n\t  }); // Calculate the sum of all elements.\n\n\t  var operation = this.variableNames.map(function (variable) {\n\t    return \"v\" + variable;\n\t  }).join(' + ');\n\t  this.userCode = \"\\n      void main() {\\n        \" + snippets.join('\\n        ') + \"\\n\\n        vec4 result = \" + operation + \";\\n        setOutput(result);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction addN$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var tensors = inputs;\n\n\t  if (tensors.length === 1) {\n\t    return identity$2({\n\t      inputs: {\n\t        x: tensors[0]\n\t      },\n\t      backend: backend\n\t    });\n\t  } // Limit the number of uploaded textures for optimization.\n\n\n\t  if (tensors.length > env().get('WEBGL_MAX_TEXTURES_IN_SHADER')) {\n\t    var midIndex = Math.floor(tensors.length / 2);\n\t    var leftSide = addN$2({\n\t      inputs: tensors.slice(0, midIndex),\n\t      backend: backend\n\t    });\n\t    var rightSide = addN$2({\n\t      inputs: tensors.slice(midIndex),\n\t      backend: backend\n\t    });\n\t    return addN$2({\n\t      inputs: [leftSide, rightSide],\n\t      backend: backend\n\t    });\n\t  }\n\n\t  var dtype = tensors.map(function (t) {\n\t    return t.dtype;\n\t  }).reduce(function (d1, d2) {\n\t    return upcastType(d1, d2);\n\t  });\n\t  var shapes = tensors.map(function (t) {\n\t    return t.shape;\n\t  }); // We can make sure shapes are identical in op level.\n\n\t  var usePackedOp = env().getBool('WEBGL_PACK');\n\t  var program = usePackedOp ? new AddNPackedProgram(tensors[0].shape, shapes) : new AddNProgram(tensors[0].shape, shapes);\n\t  return backend.runWebGLProgram(program, tensors, dtype);\n\t}\n\tvar addNConfig$1 = {\n\t  kernelName: AddN,\n\t  backendName: 'webgl',\n\t  kernelFunc: addN$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction all$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var axis = attrs.axis,\n\t      keepDims = attrs.keepDims;\n\t  var xRank = x.shape.length;\n\t  var origAxes = parseAxisParam(axis, x.shape);\n\t  var axes = origAxes;\n\t  var permutedAxes = getAxesPermutation(axes, xRank);\n\t  var permutedX = x;\n\n\t  if (permutedAxes != null) {\n\t    permutedX = transpose$2({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        perm: permutedAxes\n\t      }\n\t    });\n\t    axes = getInnerMostAxes(axes.length, xRank);\n\t  }\n\n\t  assertAxesAreInnerMostDims('all', axes, xRank);\n\n\t  var _backend_util$compute = computeOutAndReduceShapes(permutedX.shape, axes),\n\t      outShape = _backend_util$compute[0],\n\t      reduceShape = _backend_util$compute[1];\n\n\t  var inSize = sizeFromShape(reduceShape);\n\t  var a2D = reshape$3({\n\t    inputs: {\n\t      x: permutedX\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: [-1, inSize]\n\t    }\n\t  });\n\t  var reduced = reduce(a2D, a2D.dtype, 'all', backend);\n\t  var res;\n\n\t  if (keepDims) {\n\t    var newShape = expandShapeToKeepDim(outShape, origAxes);\n\t    res = reshape$3({\n\t      inputs: {\n\t        x: reduced\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: newShape\n\t      }\n\t    });\n\t  } else {\n\t    res = reshape$3({\n\t      inputs: {\n\t        x: reduced\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: outShape\n\t      }\n\t    });\n\t  }\n\n\t  backend.disposeIntermediateTensorInfo(a2D);\n\t  backend.disposeIntermediateTensorInfo(reduced);\n\n\t  if (permutedAxes != null) {\n\t    backend.disposeIntermediateTensorInfo(permutedX);\n\t  }\n\n\t  return res;\n\t}\n\tvar allConfig$1 = {\n\t  kernelName: All,\n\t  backendName: 'webgl',\n\t  kernelFunc: all$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction any$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var axis = attrs.axis,\n\t      keepDims = attrs.keepDims;\n\t  var xRank = x.shape.length;\n\t  var origAxes = parseAxisParam(axis, x.shape);\n\t  var axes = origAxes;\n\t  var permutedAxes = getAxesPermutation(axes, xRank);\n\t  var permutedX = x;\n\n\t  if (permutedAxes != null) {\n\t    permutedX = transpose$2({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        perm: permutedAxes\n\t      }\n\t    });\n\t    axes = getInnerMostAxes(axes.length, xRank);\n\t  }\n\n\t  assertAxesAreInnerMostDims('any', axes, xRank);\n\n\t  var _backend_util$compute = computeOutAndReduceShapes(permutedX.shape, axes),\n\t      outShape = _backend_util$compute[0],\n\t      reduceShape = _backend_util$compute[1];\n\n\t  var inSize = sizeFromShape(reduceShape);\n\t  var a2D = reshape$3({\n\t    inputs: {\n\t      x: permutedX\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: [-1, inSize]\n\t    }\n\t  });\n\t  var reduced = reduce(a2D, a2D.dtype, 'any', backend);\n\t  var res;\n\n\t  if (keepDims) {\n\t    var newShape = expandShapeToKeepDim(outShape, origAxes);\n\t    res = reshape$3({\n\t      inputs: {\n\t        x: reduced\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: newShape\n\t      }\n\t    });\n\t  } else {\n\t    res = reshape$3({\n\t      inputs: {\n\t        x: reduced\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: outShape\n\t      }\n\t    });\n\t  }\n\n\t  backend.disposeIntermediateTensorInfo(a2D);\n\t  backend.disposeIntermediateTensorInfo(reduced);\n\n\t  if (permutedAxes != null) {\n\t    backend.disposeIntermediateTensorInfo(permutedX);\n\t  }\n\n\t  return res;\n\t}\n\tvar anyConfig$1 = {\n\t  kernelName: Any,\n\t  backendName: 'webgl',\n\t  kernelFunc: any$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ArgMinMaxProgram = function ArgMinMaxProgram(reduceInfo, op, firstPass) {\n\t  this.variableNames = ['A'];\n\t  var windowSize = reduceInfo.windowSize,\n\t      batchSize = reduceInfo.batchSize,\n\t      outSize = reduceInfo.outSize;\n\n\t  if (!firstPass) {\n\t    this.variableNames.push('bestIndicesA');\n\t  }\n\n\t  this.outputShape = [batchSize, outSize];\n\t  var compOp = op === 'max' ? '>' : '<';\n\t  var indexSnippet = firstPass ? 'inOffset + i;' : 'round(getBestIndicesA(batch, inOffset + i));';\n\t  this.userCode = \"\\n      void main() {\\n        ivec2 coords = getOutputCoords();\\n        int batch = coords[0];\\n        int outIdx = coords[1];\\n        int inOffset = outIdx * \" + windowSize + \";\\n\\n        int bestIndex = inOffset;\\n        float bestValue = getA(batch, bestIndex);\\n\\n        for (int i = 0; i < \" + windowSize + \"; i++) {\\n          int inIdx = \" + indexSnippet + \";\\n          float candidate = getA(batch, inIdx);\\n          if (candidate \" + compOp + \" bestValue) {\\n            bestValue = candidate;\\n            bestIndex = inIdx;\\n          }\\n        }\\n        setOutput(float(bestIndex));\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ArgMinMaxPackedProgram = function ArgMinMaxPackedProgram(shape, windowSize, op, firstPass) {\n\t  this.variableNames = ['A'];\n\t  this.packedInputs = true;\n\t  this.packedOutput = true;\n\t  assert(shape.length > 2, function () {\n\t    return \"Packed arg\" + (op.charAt(0).toUpperCase() + op.slice(1)) + \" supports only inputs with rank above 2.\";\n\t  });\n\t  var inSize = shape[shape.length - 1];\n\t  var outSize = Math.ceil(inSize / windowSize);\n\t  this.outputShape = shape.slice(0, -1);\n\n\t  if (outSize > 1) {\n\t    this.outputShape.push(outSize);\n\t  }\n\n\t  if (!firstPass) {\n\t    this.variableNames.push('bestIndicesA');\n\t  }\n\n\t  var outShape = this.outputShape;\n\t  var rank = outShape.length;\n\t  var dtype = getCoordsDataType(rank);\n\t  var coords = getChannels('coords', rank);\n\t  var sourceLocSetup;\n\t  var sourceRank;\n\n\t  if (outSize === 1) {\n\t    sourceRank = rank + 1;\n\t    var sourceLocDType = getCoordsDataType(sourceRank);\n\t    sourceLocSetup = \"\\n        \" + sourceLocDType + \" sourceLocR = \" + sourceLocDType + \"(\" + coords.join() + \", 0);\\n        ++\" + coords[rank - 1] + \";\\n        \" + sourceLocDType + \" sourceLocG = \" + sourceLocDType + \"(\" + coords.join() + \", 0);\\n        ++\" + coords[rank - 2] + \";\\n        \" + sourceLocDType + \" sourceLocA = \" + sourceLocDType + \"(\" + coords.join() + \", 0);\\n        --\" + coords[rank - 1] + \";\\n        \" + sourceLocDType + \" sourceLocB = \" + sourceLocDType + \"(\" + coords.join() + \", 0);\\n        --\" + coords[rank - 2] + \";\";\n\t  } else {\n\t    sourceRank = rank;\n\t    sourceLocSetup = \"\\n        \" + dtype + \" sourceLocR = coords;\\n        ++\" + coords[rank - 1] + \";\\n        \" + dtype + \" sourceLocG = coords;\\n        ++\" + coords[rank - 2] + \";\\n        \" + dtype + \" sourceLocA = coords;\\n        --\" + coords[rank - 1] + \";\\n        \" + dtype + \" sourceLocB = coords;\\n        --\" + coords[rank - 2] + \";\";\n\t  }\n\n\t  var channels = ['x', 'y', 'z', 'w', 'u', 'v'].slice(0, sourceRank);\n\t  var inChannel = '.' + channels[sourceRank - 1]; // e.g. \".b\" for rank 3.\n\n\t  var intChannels = channels.map(function (x) {\n\t    return 'int ' + x;\n\t  });\n\t  var srcRCoords = getChannels('sourceLocR', sourceRank - 1).concat('inIdx.r');\n\t  var srcGCoords = getChannels('sourceLocG', sourceRank - 1).concat('inIdx.g');\n\t  var srcBCoords = getChannels('sourceLocB', sourceRank - 1).concat('inIdx.b');\n\t  var srcACoords = getChannels('sourceLocA', sourceRank - 1).concat('inIdx.a');\n\t  var compOp = op === 'max' ? 'greaterThan' : 'lessThan';\n\t  var fetchCandidateIdx = firstPass ? '' : \"\\n          inIdx = round(vec4(getBestIndicesAChannel(\" + srcRCoords.join() + \"),\\n                             getBestIndicesAChannel(\" + srcGCoords.join() + \"),\\n                             getBestIndicesAChannel(\" + srcBCoords.join() + \"),\\n                             getBestIndicesAChannel(\" + srcACoords.join() + \")));\";\n\t  var fetchValue = \"vec4(\\n            getAChannel(\" + srcRCoords.join() + \"),\\n            hasNextCol ? getAChannel(\" + srcGCoords.join() + \") : 0.,\\n            hasNextRow ? getAChannel(\" + srcBCoords.join() + \") : 0.,\\n            hasNextRow && hasNextCol ? getAChannel(\" + srcACoords.join() + \") : 0.)\";\n\t  var getBestIndicesAChannelSnippet = firstPass ? '' : \"\\n      float getBestIndicesAChannel(\" + intChannels.join() + \") {\\n        return getChannel(getBestIndicesA(\" + channels.join() + \"),\\n                                          vec2(\" + channels.slice(-2).join() + \"));\\n      }\";\n\t  this.userCode = \"\\n      float getAChannel(\" + intChannels.join() + \") {\\n        return getChannel(getA(\" + channels.join() + \"),\\n                               vec2(\" + channels.slice(-2).join() + \"));\\n      }\\n      \" + getBestIndicesAChannelSnippet + \"\\n      void main() {\\n        \" + dtype + \" coords = getOutputCoords();\\n        bool hasNextCol = \" + coords[rank - 1] + \" < \" + (outShape[rank - 1] - 1) + \";\\n        bool hasNextRow = \" + coords[rank - 2] + \" < \" + (outShape[rank - 2] - 1) + \";\\n        \" + sourceLocSetup + \"\\n        ivec4 srcIdx = ivec4(sourceLocR\" + inChannel + \", sourceLocG\" + inChannel + \",\\n          sourceLocB\" + inChannel + \", sourceLocA\" + inChannel + \") * \" + windowSize + \";\\n        ivec4 inIdx = srcIdx;\\n        vec4 bestIndex = vec4(inIdx);\\n        vec4 bestValue = \" + fetchValue + \";\\n\\n        for (int i = 0; i < \" + windowSize + \"; i++) {\\n          inIdx = srcIdx;\\n          \" + fetchCandidateIdx + \"\\n          vec4 candidate = \" + fetchValue + \";\\n          bvec4 nan = isnan(candidate);\\n          bvec4 replace = bvec4(\\n            vec4(\" + compOp + \"(candidate, bestValue)) * (vec4(1.0) - vec4(nan)));\\n\\n          bestValue = vec4(replace.x  ? candidate.x : bestValue.x,\\n                           replace.y  ? candidate.y : bestValue.y,\\n                           replace.z  ? candidate.z : bestValue.z,\\n                           replace.w  ? candidate.w : bestValue.w);\\n          bestIndex = mix(bestIndex, vec4(inIdx), vec4(replace));\\n          srcIdx++;\\n        }\\n        setOutput(bestIndex);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tfunction argReduce(backend, x, reduceType, bestIndicesA) {\n\t  if (bestIndicesA === void 0) {\n\t    bestIndicesA = null;\n\t  }\n\n\t  var batchSize = x.shape[0];\n\t  var inSize = x.shape[1];\n\n\t  if (bestIndicesA != null) {\n\t    batchSize = bestIndicesA.shape[0];\n\t    inSize = bestIndicesA.shape[1];\n\t  }\n\n\t  var windowSize = computeOptimalWindowSize(inSize);\n\t  var reduceInfo = {\n\t    windowSize: windowSize,\n\t    inSize: inSize,\n\t    batchSize: batchSize,\n\t    outSize: Math.ceil(inSize / windowSize)\n\t  };\n\t  var program = new ArgMinMaxProgram(reduceInfo, reduceType, bestIndicesA == null);\n\t  var inputs = [x];\n\n\t  if (bestIndicesA != null) {\n\t    inputs.push(bestIndicesA);\n\t  }\n\n\t  var output = backend.runWebGLProgram(program, inputs, 'int32'); // No need to run another GPGPU program.\n\n\t  if (output.shape[1] === 1) {\n\t    return output;\n\t  }\n\n\t  var result = argReduce(backend, x, reduceType, output);\n\t  backend.disposeIntermediateTensorInfo(output);\n\t  return result;\n\t}\n\n\tfunction argReducePacked(backend, x, reduceType, bestIndicesA) {\n\t  if (bestIndicesA === void 0) {\n\t    bestIndicesA = null;\n\t  }\n\n\t  var inShape = bestIndicesA != null ? bestIndicesA.shape : x.shape;\n\t  var inSize = inShape[inShape.length - 1];\n\t  var windowSize = computeOptimalWindowSize(inSize);\n\t  var program = new ArgMinMaxPackedProgram(inShape, windowSize, reduceType, bestIndicesA == null);\n\t  var inputs = bestIndicesA == null ? [x] : [x, bestIndicesA];\n\t  var output = backend.runWebGLProgram(program, inputs, 'int32');\n\n\t  if (output.shape.length === x.shape.length) {\n\t    var result = argReducePacked(backend, x, reduceType, output);\n\t    backend.disposeIntermediateTensorInfo(output);\n\t    return result;\n\t  }\n\n\t  return output;\n\t}\n\n\tfunction argMinMaxReduce(backend, x, axis, reduceType) {\n\t  var axes = [axis];\n\t  assertAxesAreInnerMostDims('arg' + reduceType.charAt(0).toUpperCase() + reduceType.slice(1), axes, x.shape.length);\n\n\t  if (!env().getBool('WEBGL_PACK_REDUCE') || x.shape.length <= 2) {\n\t    var intermediateTensorInfos = [];\n\n\t    var _backend_util$compute = computeOutAndReduceShapes(x.shape, axes),\n\t        outShape = _backend_util$compute[0],\n\t        reduceShape = _backend_util$compute[1];\n\n\t    var inSize = sizeFromShape(reduceShape);\n\t    var a2D = reshape$3({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: [-1, inSize]\n\t      }\n\t    });\n\t    intermediateTensorInfos.push(a2D);\n\t    var reduced = argReduce(backend, a2D, reduceType);\n\t    intermediateTensorInfos.push(reduced);\n\t    var reshaped = reshape$3({\n\t      inputs: {\n\t        x: reduced\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: outShape\n\t      }\n\t    });\n\t    intermediateTensorInfos.forEach(function (t) {\n\t      return backend.disposeIntermediateTensorInfo(t);\n\t    });\n\t    return reshaped;\n\t  }\n\n\t  return argReducePacked(backend, x, reduceType);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction argMax$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var axis = attrs.axis;\n\t  var axes = parseAxisParam(axis, x.shape);\n\t  var permutedAxes = getAxesPermutation(axes, x.shape.length);\n\t  var $x = x;\n\t  var intermediateTensorInfos = [];\n\n\t  if (permutedAxes != null) {\n\t    $x = transpose$2({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        perm: permutedAxes\n\t      }\n\t    });\n\t    intermediateTensorInfos.push($x);\n\t    axes = getInnerMostAxes(axes.length, $x.shape.length);\n\t  }\n\n\t  assertAxesAreInnerMostDims('argMax', [axes[0]], $x.shape.length);\n\t  var out = argMinMaxReduce(backend, $x, axes[0], 'max');\n\t  intermediateTensorInfos.forEach(function (t) {\n\t    return backend.disposeIntermediateTensorInfo(t);\n\t  });\n\t  return out;\n\t}\n\tvar argMaxConfig$1 = {\n\t  kernelName: ArgMax,\n\t  backendName: 'webgl',\n\t  kernelFunc: argMax$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction argMin$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var axis = attrs.axis;\n\t  var axes = parseAxisParam(axis, x.shape);\n\t  var permutedAxes = getAxesPermutation(axes, x.shape.length);\n\t  var $x = x;\n\t  var intermediateTensorInfos = [];\n\n\t  if (permutedAxes != null) {\n\t    $x = transpose$2({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        perm: permutedAxes\n\t      }\n\t    });\n\t    intermediateTensorInfos.push($x);\n\t    axes = getInnerMostAxes(axes.length, $x.shape.length);\n\t  }\n\n\t  assertAxesAreInnerMostDims('argMin', [axes[0]], $x.shape.length);\n\t  var out = argMinMaxReduce(backend, $x, axes[0], 'min');\n\t  intermediateTensorInfos.forEach(function (t) {\n\t    return backend.disposeIntermediateTensorInfo(t);\n\t  });\n\t  return out;\n\t}\n\tvar argMinConfig$1 = {\n\t  kernelName: ArgMin,\n\t  backendName: 'webgl',\n\t  kernelFunc: argMin$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ASIN = CHECK_NAN_SNIPPET + \"\\n  if (abs(x) > 1.) {\\n    return NAN;\\n  }\\n  return asin(x);\\n\";\n\tvar asin$2 = unaryKernelFunc$1({\n\t  opSnippet: ASIN\n\t});\n\tvar asinConfig$1 = {\n\t  kernelName: Asin,\n\t  backendName: 'webgl',\n\t  kernelFunc: asin$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ASINH = CHECK_NAN_SNIPPET + \"return log(x + sqrt(x * x + 1.0));\";\n\tvar asinh$3 = unaryKernelFunc$1({\n\t  opSnippet: ASINH\n\t});\n\tvar asinhConfig$1 = {\n\t  kernelName: Asinh,\n\t  backendName: 'webgl',\n\t  kernelFunc: asinh$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ATAN = CHECK_NAN_SNIPPET + \"\\n  return atan(x);\\n\";\n\tvar atan$2 = unaryKernelFunc$1({\n\t  opSnippet: ATAN\n\t});\n\tvar atanConfig$1 = {\n\t  kernelName: Atan,\n\t  backendName: 'webgl',\n\t  kernelFunc: atan$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ATAN2 = CHECK_NAN_SNIPPET_BINARY + \"\\n  return atan(a, b);\\n\";\n\tvar ATAN2_PACKED = \"\\n  vec4 result = atan(a, b);\\n  vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0));\\n  \" + CHECK_NAN_SNIPPET_BINARY_PACKED + \"\\n  return result;\\n\";\n\tvar atan2$2 = binaryKernelFunc$1({\n\t  opSnippet: ATAN2,\n\t  packedOpSnippet: ATAN2_PACKED\n\t});\n\tvar atan2Config$1 = {\n\t  kernelName: Atan2,\n\t  backendName: 'webgl',\n\t  kernelFunc: atan2$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ATANH = CHECK_NAN_SNIPPET + \"\\n  if ((x < -1.0) || (x > 1.0)) return NAN;\\nreturn (log(1.0 + x) - log(1.0 - x)) / 2.0;\";\n\tvar atanh$2 = unaryKernelFunc$1({\n\t  opSnippet: ATANH\n\t});\n\tvar atanhConfig$1 = {\n\t  kernelName: Atanh,\n\t  backendName: 'webgl',\n\t  kernelFunc: atanh$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar Pool2DProgram = function Pool2DProgram(convInfo, poolType, computePositions, flattenPositions, includeBatchInIndex) {\n\t  if (flattenPositions === void 0) {\n\t    flattenPositions = false;\n\t  }\n\n\t  if (includeBatchInIndex === void 0) {\n\t    includeBatchInIndex = false;\n\t  }\n\n\t  this.variableNames = ['x'];\n\n\t  if (poolType === 'avg' && computePositions) {\n\t    throw new Error('Cannot compute positions for average pool.');\n\t  }\n\n\t  var filterWidth = convInfo.filterWidth;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var dilationHeight = convInfo.dilationHeight;\n\t  var dilationWidth = convInfo.dilationWidth;\n\t  var effectiveFilterHeight = convInfo.effectiveFilterHeight;\n\t  var effectiveFilterWidth = convInfo.effectiveFilterWidth;\n\t  var padTop = convInfo.padInfo.top;\n\t  var padLeft = convInfo.padInfo.left;\n\t  this.outputShape = convInfo.outShape;\n\t  var isAvgPool = poolType === 'avg';\n\t  var batchFlattenPositionStr = \"((batch  * \" + convInfo.inHeight + \" + xR) * \" + convInfo.inWidth + \" + xC) * \" + convInfo.inChannels + \" + d\";\n\t  var flattenPositionStr = \"(xR * \" + convInfo.inWidth + \" + xC) * \" + convInfo.inChannels + \" + d\";\n\t  var initializationValue = '0.0';\n\n\t  if (!isAvgPool) {\n\t    // WebGL on Firefox Linux can't compile 1/0 so we do 1/eps.\n\t    initializationValue = '-1.0 / 1e-20';\n\t  }\n\n\t  if (computePositions) {\n\t    var _compareOp = '>=';\n\t    this.userCode = \"\\n        const ivec2 strides = ivec2(\" + strideHeight + \", \" + strideWidth + \");\\n        const ivec2 pads = ivec2(\" + padTop + \", \" + padLeft + \");\\n\\n        void main() {\\n          ivec4 coords = getOutputCoords();\\n          int batch = coords[0];\\n          int d = coords[3];\\n\\n          ivec2 xRCCorner = coords.yz * strides - pads;\\n          int xRCorner = xRCCorner.x;\\n          int xCCorner = xRCCorner.y;\\n\\n          // max/min x(?, ?, d) to get y(yR, yC, d).\\n          // ? = to be determined\\n          float minMaxValue = 0.0;\\n          float minMaxValueFound = 0.0;\\n          int minMaxPosition = 0;\\n          float avgValue = 0.0;\\n\\n          for (int wR = 0; wR < \" + effectiveFilterHeight + \";\\n              wR += \" + dilationHeight + \") {\\n            int xR = xRCorner + wR;\\n\\n            if (xR < 0 || xR >= \" + convInfo.inHeight + \") {\\n              continue;\\n            }\\n\\n            for (int wC = 0; wC < \" + effectiveFilterWidth + \";\\n                wC += \" + dilationWidth + \") {\\n              int xC = xCCorner + wC;\\n\\n              if (xC < 0 || xC >= \" + convInfo.inWidth + \") {\\n                continue;\\n              }\\n\\n              float value = getX(batch, xR, xC, d);\\n\\n              // If a min / max value has already been found, use it. If not,\\n              // use the current value.\\n              float currMinMaxValue = mix(\\n                  value, minMaxValue, minMaxValueFound);\\n              if (value \" + _compareOp + \" currMinMaxValue) {\\n                minMaxValue = value;\\n                minMaxValueFound = 1.0;\\n                minMaxPosition = \" + (flattenPositions ? includeBatchInIndex ? batchFlattenPositionStr : flattenPositionStr : \"wR * \" + effectiveFilterWidth + \" + wC\") + \";\\n              }\\n            }\\n          }\\n          setOutput(float(minMaxPosition));\\n        }\\n      \";\n\t    return;\n\t  }\n\n\t  var compareOp = 'max';\n\t  var returnValue = poolType + \"(\" + poolType + \"(\" + poolType + \"(\" + 'minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])';\n\n\t  if (poolType === 'avg') {\n\t    returnValue = \"avgValue / count\";\n\t  }\n\n\t  var filterWidthNearestVec4 = Math.floor(filterWidth / 4) * 4;\n\t  var filterWidthVec4Remainder = filterWidth % 4;\n\t  var updateSnippet = \"\\n      if (\" + isAvgPool + \") {\\n        avgValue += dot(values, ones);\\n      } else {\\n        minMaxValue = \" + compareOp + \"(values, minMaxValue);\\n      }\\n    \";\n\t  this.userCode = \"\\n      const ivec2 strides = ivec2(\" + strideHeight + \", \" + strideWidth + \");\\n      const ivec2 pads = ivec2(\" + padTop + \", \" + padLeft + \");\\n      const float initializationValue = \" + initializationValue + \";\\n      const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\\n\\n      float count = 0.0;\\n\\n      float getValue(int batch, int xR, int xC, int d) {\\n        if (xC < 0 || xC >= \" + convInfo.inWidth + \") {\\n          return initializationValue;\\n        }\\n        count += 1.0;\\n        return getX(batch, xR, xC, d);\\n      }\\n\\n      void main() {\\n        ivec4 coords = getOutputCoords();\\n        int batch = coords[0];\\n        int d = coords[3];\\n\\n        ivec2 xRCCorner = coords.yz * strides - pads;\\n        int xRCorner = xRCCorner.x;\\n        int xCCorner = xRCCorner.y;\\n\\n        // max/min x(?, ?, d) to get y(yR, yC, d).\\n        // ? = to be determined\\n        vec4 minMaxValue = vec4(\" + initializationValue + \");\\n        float avgValue = 0.0;\\n        count = 0.0;\\n\\n        for (int wR = 0; wR < \" + effectiveFilterHeight + \";\\n            wR += \" + dilationHeight + \") {\\n          int xR = xRCorner + wR;\\n\\n          if (xR < 0 || xR >= \" + convInfo.inHeight + \") {\\n            continue;\\n          }\\n\\n          for (int wC = 0; wC < \" + filterWidthNearestVec4 + \"; wC += 4) {\\n            int xC = xCCorner + wC * \" + dilationWidth + \";\\n\\n            vec4 values = vec4(\\n              getValue(batch, xR, xC, d),\\n              getValue(batch, xR, xC + \" + dilationWidth + \", d),\\n              getValue(batch, xR, xC + 2 * \" + dilationWidth + \", d),\\n              getValue(batch, xR, xC + 3 * \" + dilationWidth + \", d)\\n            );\\n\\n            \" + updateSnippet + \"\\n          }\\n\\n          int xC = xCCorner + \" + filterWidthNearestVec4 + \";\\n          if (\" + (filterWidthVec4Remainder === 1) + \") {\\n            vec4 values = vec4(\\n              getValue(batch, xR, xC, d),\\n              initializationValue,\\n              initializationValue,\\n              initializationValue\\n            );\\n\\n            \" + updateSnippet + \"\\n          } else if (\" + (filterWidthVec4Remainder === 2) + \") {\\n            vec4 values = vec4(\\n              getValue(batch, xR, xC, d),\\n              getValue(batch, xR, xC + \" + dilationWidth + \", d),\\n              initializationValue,\\n              initializationValue\\n            );\\n\\n            \" + updateSnippet + \"\\n          } else if (\" + (filterWidthVec4Remainder === 3) + \") {\\n            vec4 values = vec4(\\n              getValue(batch, xR, xC, d),\\n              getValue(batch, xR, xC + \" + dilationWidth + \", d),\\n              getValue(batch, xR, xC + 2 * \" + dilationWidth + \", d),\\n              initializationValue\\n            );\\n\\n            \" + updateSnippet + \"\\n          }\\n        }\\n        setOutput(\" + returnValue + \");\\n      }\\n    \";\n\t};\n\tvar Pool3DProgram = function Pool3DProgram(convInfo, poolType, computePositions, flattenPositions, includeBatchInIndex) {\n\t  if (flattenPositions === void 0) {\n\t    flattenPositions = false;\n\t  }\n\n\t  if (includeBatchInIndex === void 0) {\n\t    includeBatchInIndex = false;\n\t  }\n\n\t  this.variableNames = ['x'];\n\n\t  if (poolType === 'avg' && computePositions) {\n\t    throw new Error('Cannot compute positions for average pool.');\n\t  }\n\n\t  var filterWidth = convInfo.filterWidth;\n\t  var strideDepth = convInfo.strideDepth;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var dilationDepth = convInfo.dilationDepth;\n\t  var dilationHeight = convInfo.dilationHeight;\n\t  var dilationWidth = convInfo.dilationWidth;\n\t  var effectiveFilterDepth = convInfo.effectiveFilterDepth;\n\t  var effectiveFilterHeight = convInfo.effectiveFilterHeight;\n\t  var effectiveFilterWidth = convInfo.effectiveFilterWidth;\n\t  var padFront = convInfo.padInfo.front;\n\t  var padTop = convInfo.padInfo.top;\n\t  var padLeft = convInfo.padInfo.left;\n\t  this.outputShape = convInfo.outShape;\n\t  var isAvgPool = poolType === 'avg';\n\t  var initializationValue = '0.0';\n\n\t  if (!isAvgPool) {\n\t    // WebGL on Firefox Linux can't compile 1/0 so we do 1/eps.\n\t    initializationValue = '-1.0 / 1e-20';\n\t  }\n\n\t  if (computePositions) {\n\t    var _compareOp2 = '>=';\n\t    this.userCode = \"\\n        const ivec3 strides =\\n            ivec3(\" + strideDepth + \", \" + strideHeight + \", \" + strideWidth + \");\\n        const ivec3 pads = ivec3(\" + padFront + \", \" + padTop + \", \" + padLeft + \");\\n\\n        void main() {\\n          ivec5 coords = getOutputCoords();\\n          int batch = coords.x;\\n          int ch = coords.u;\\n\\n          ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\\n          int xDCorner = xCorner.x;\\n          int xRCorner = xCorner.y;\\n          int xCCorner = xCorner.z;\\n\\n          // max/min x(?, ?, ?, ch) to get y(yD, yR, yC, ch).\\n          // ? = to be determined\\n          float minMaxValue = 0.0;\\n          float minMaxValueFound = 0.0;\\n          int minMaxPosition = 0;\\n\\n          for (int wD = 0; wD < \" + effectiveFilterDepth + \";\\n              wD += \" + dilationDepth + \") {\\n            int xD = xDCorner + wD;\\n\\n            if (xD < 0 || xD >= \" + convInfo.inDepth + \") {\\n              continue;\\n            }\\n\\n            for (int wR = 0; wR < \" + effectiveFilterHeight + \";\\n                wR += \" + dilationHeight + \") {\\n              int xR = xRCorner + wR;\\n\\n              if (xR < 0 || xR >= \" + convInfo.inHeight + \") {\\n                continue;\\n              }\\n\\n              for (int wC = 0; wC < \" + effectiveFilterWidth + \";\\n                  wC += \" + dilationWidth + \") {\\n                int xC = xCCorner + wC;\\n\\n                if (xC < 0 || xC >= \" + convInfo.inWidth + \") {\\n                  continue;\\n                }\\n\\n                float value = getX(batch, xD, xR, xC, ch);\\n\\n                // If a min / max value has already been found, use it. If not,\\n                // use the current value.\\n                float currMinMaxValue = mix(\\n                    value, minMaxValue, minMaxValueFound);\\n                if (value \" + _compareOp2 + \" currMinMaxValue) {\\n                  minMaxValue = value;\\n                  minMaxValueFound = 1.0;\\n                  minMaxPosition = \" + (flattenPositions ? includeBatchInIndex ? \"(((batch * \" + convInfo.inDepth + \" + xD) * \" + convInfo.inHeight + \" + xR) * \" + convInfo.inWidth + \" + xC) * \" + convInfo.inChannels + \" + ch\" : \"((xD * \" + convInfo.inHeight + \" + xR) * \" + convInfo.inWidth + \" + xC) * \" + convInfo.inChannels + \" + ch\" : \"wD * \" + effectiveFilterHeight + \" * \" + effectiveFilterWidth + \" +\\n                      wR * \" + effectiveFilterWidth + \" + wC\") + \";\\n                }\\n              }\\n            }\\n          }\\n          setOutput(float(minMaxPosition));\\n        }\\n      \";\n\t    return;\n\t  }\n\n\t  var compareOp = 'max';\n\t  var returnValue = poolType + \"(\" + poolType + \"(\" + poolType + \"(\" + 'minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])';\n\n\t  if (poolType === 'avg') {\n\t    returnValue = \"avgValue / count\";\n\t  }\n\n\t  var filterWidthNearestVec4 = Math.floor(filterWidth / 4) * 4;\n\t  var filterWidthVec4Remainder = filterWidth % 4;\n\t  var updateSnippet = \"\\n      if (\" + isAvgPool + \") {\\n        avgValue += dot(values, ones);\\n      } else {\\n        minMaxValue = \" + compareOp + \"(values, minMaxValue);\\n      }\\n    \";\n\t  this.userCode = \"\\n      const ivec3 strides =\\n        ivec3(\" + strideDepth + \", \" + strideHeight + \", \" + strideWidth + \");\\n      const ivec3 pads = ivec3(\" + padFront + \", \" + padTop + \", \" + padLeft + \");\\n      const float initializationValue = \" + initializationValue + \";\\n      const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\\n\\n      float count = 0.0;\\n\\n      float getValue(int batch, int xD, int xR, int xC, int ch) {\\n        if (xC < 0 || xC >= \" + convInfo.inWidth + \") {\\n          return initializationValue;\\n        }\\n        count += 1.0;\\n        return getX(batch, xD, xR, xC, ch);\\n      }\\n\\n      void main() {\\n        ivec5 coords = getOutputCoords();\\n        int batch = coords.x;\\n        int ch = coords.u;\\n\\n        ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\\n        int xDCorner = xCorner.x;\\n        int xRCorner = xCorner.y;\\n        int xCCorner = xCorner.z;\\n\\n        // max/min x(?, ?, ?, d) to get y(yD, yR, yC, ch).\\n        // ? = to be determined\\n        vec4 minMaxValue = vec4(\" + initializationValue + \");\\n        float avgValue = 0.0;\\n        count = 0.0;\\n\\n        for (int wD = 0; wD < \" + effectiveFilterDepth + \";\\n            wD += \" + dilationDepth + \") {\\n          int xD = xDCorner + wD;\\n\\n          if (xD < 0 || xD >= \" + convInfo.inDepth + \") {\\n            continue;\\n          }\\n\\n          for (int wR = 0; wR < \" + effectiveFilterHeight + \";\\n            wR += \" + dilationHeight + \") {\\n            int xR = xRCorner + wR;\\n\\n            if (xR < 0 || xR >= \" + convInfo.inHeight + \") {\\n              continue;\\n            }\\n\\n            for (int wC = 0; wC < \" + filterWidthNearestVec4 + \"; wC += 4) {\\n              int xC = xCCorner + wC * \" + dilationWidth + \";\\n\\n              vec4 values = vec4(\\n                getValue(batch, xD, xR, xC, ch),\\n                getValue(batch, xD, xR, xC + \" + dilationWidth + \", ch),\\n                getValue(batch, xD, xR, xC + 2 * \" + dilationWidth + \", ch),\\n                getValue(batch, xD, xR, xC + 3 * \" + dilationWidth + \", ch)\\n              );\\n\\n              \" + updateSnippet + \"\\n            }\\n\\n            int xC = xCCorner + \" + filterWidthNearestVec4 + \";\\n            if (\" + (filterWidthVec4Remainder === 1) + \") {\\n              vec4 values = vec4(\\n                getValue(batch, xD, xR, xC, ch),\\n                initializationValue,\\n                initializationValue,\\n                initializationValue\\n              );\\n\\n              \" + updateSnippet + \"\\n            } else if (\" + (filterWidthVec4Remainder === 2) + \") {\\n              vec4 values = vec4(\\n                getValue(batch, xD, xR, xC, ch),\\n                getValue(batch, xD, xR, xC + \" + dilationWidth + \", ch),\\n                initializationValue,\\n                initializationValue\\n              );\\n\\n              \" + updateSnippet + \"\\n            } else if (\" + (filterWidthVec4Remainder === 3) + \") {\\n              vec4 values = vec4(\\n                getValue(batch, xD, xR, xC, ch),\\n                getValue(batch, xD, xR, xC + \" + dilationWidth + \", ch),\\n                getValue(batch, xD, xR, xC + 2 * \" + dilationWidth + \", ch),\\n                initializationValue\\n              );\\n\\n              \" + updateSnippet + \"\\n            }\\n          }\\n          setOutput(\" + returnValue + \");\\n        }\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction avgPool$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  assertNotComplex$1(x, 'avgPool');\n\t  var filterSize = attrs.filterSize,\n\t      strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dimRoundingMode = attrs.dimRoundingMode;\n\t  var dilations = 1;\n\t  assert(eitherStridesOrDilationsAreOne(strides, dilations), function () {\n\t    return 'Error in avgPool: Either strides or dilations must be 1. ' + (\"Got strides \" + strides + \" and dilations '\" + dilations + \"'\");\n\t  });\n\t  var convInfo = computePool2DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode);\n\n\t  if (convInfo.filterWidth === 1 && convInfo.filterHeight === 1 && arraysEqual(convInfo.inShape, convInfo.outShape)) {\n\t    return identity$2({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend\n\t    });\n\t  }\n\n\t  var avgPoolProgram = new Pool2DProgram(convInfo, 'avg', false);\n\t  return backend.runWebGLProgram(avgPoolProgram, [x], 'float32');\n\t}\n\tvar avgPoolConfig$1 = {\n\t  kernelName: AvgPool,\n\t  backendName: 'webgl',\n\t  kernelFunc: avgPool$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction avgPool3D$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var filterSize = attrs.filterSize,\n\t      strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dimRoundingMode = attrs.dimRoundingMode,\n\t      dataFormat = attrs.dataFormat;\n\t  var dilations = [1, 1, 1];\n\t  var convInfo = computePool3DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode, dataFormat);\n\t  var avgPoolProgram = new Pool3DProgram(convInfo, 'avg', false);\n\t  return backend.runWebGLProgram(avgPoolProgram, [x], 'float32');\n\t}\n\tvar avgPool3DConfig$1 = {\n\t  kernelName: AvgPool3D,\n\t  backendName: 'webgl',\n\t  kernelFunc: avgPool3D$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar AvgPool2DBackpropProgram = function AvgPool2DBackpropProgram(convInfo) {\n\t  this.variableNames = ['dy'];\n\t  this.outputShape = convInfo.inShape;\n\t  var filterHeight = convInfo.filterHeight;\n\t  var filterWidth = convInfo.filterWidth;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var dilationHeight = convInfo.dilationHeight;\n\t  var dilationWidth = convInfo.dilationWidth;\n\t  var effectiveFilterHeight = convInfo.effectiveFilterHeight;\n\t  var effectiveFilterWidth = convInfo.effectiveFilterWidth;\n\t  var padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n\t  var padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n\t  var avgMultiplier = 1 / (filterHeight * filterWidth);\n\t  this.userCode = \"\\n      const ivec2 pads = ivec2(\" + padTop + \", \" + padLeft + \");\\n      const float avgMultiplier = float(\" + avgMultiplier + \");\\n\\n      void main() {\\n        ivec4 coords = getOutputCoords();\\n        int b = coords[0];\\n        int d = coords[3];\\n\\n        ivec2 dyRCCorner = coords.yz - pads;\\n        int dyRCorner = dyRCCorner.x;\\n        int dyCCorner = dyRCCorner.y;\\n\\n        // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\\n        // ? = to be determined. : = across all values in that axis.\\n        float dotProd = 0.0;\\n        for (int wR = 0; wR < \" + effectiveFilterHeight + \";\\n            wR += \" + dilationHeight + \") {\\n          float dyR = float(dyRCorner + wR) / \" + strideHeight + \".0;\\n\\n          if (dyR < 0.0 || dyR >= \" + convInfo.outHeight + \".0 || fract(dyR) > 0.0) {\\n            continue;\\n          }\\n          int idyR = int(dyR);\\n\\n          for (int wC = 0; wC < \" + effectiveFilterWidth + \";\\n            wC+= \" + dilationWidth + \") {\\n            float dyC = float(dyCCorner + wC) / \" + strideWidth + \".0;\\n\\n            if (dyC < 0.0 || dyC >= \" + convInfo.outWidth + \".0 ||\\n                fract(dyC) > 0.0) {\\n              continue;\\n            }\\n            int idyC = int(dyC);\\n\\n            float dyValue = getDy(b, idyR, idyC, d);\\n\\n            dotProd += dyValue * avgMultiplier;\\n          }\\n        }\\n        setOutput(dotProd);\\n      }\\n    \";\n\t};\n\tvar AvgPool3DBackpropProgram = function AvgPool3DBackpropProgram(convInfo) {\n\t  this.variableNames = ['dy'];\n\t  this.outputShape = convInfo.inShape;\n\t  var filterDepth = convInfo.filterDepth;\n\t  var filterHeight = convInfo.filterHeight;\n\t  var filterWidth = convInfo.filterWidth;\n\t  var strideDepth = convInfo.strideDepth;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var dilationDepth = convInfo.dilationDepth;\n\t  var dilationHeight = convInfo.dilationHeight;\n\t  var dilationWidth = convInfo.dilationWidth;\n\t  var effectiveFilterDepth = convInfo.effectiveFilterDepth;\n\t  var effectiveFilterHeight = convInfo.effectiveFilterHeight;\n\t  var effectiveFilterWidth = convInfo.effectiveFilterWidth;\n\t  var padFront = effectiveFilterDepth - 1 - convInfo.padInfo.front;\n\t  var padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n\t  var padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n\t  var avgMultiplier = 1 / (filterDepth * filterHeight * filterWidth);\n\t  this.userCode = \"\\n      const ivec3 pads = ivec3(\" + padFront + \", \" + padTop + \", \" + padLeft + \");\\n      const float avgMultiplier = float(\" + avgMultiplier + \");\\n\\n      void main() {\\n        ivec5 coords = getOutputCoords();\\n        int batch = coords.x;\\n        int ch = coords.u;\\n\\n        ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\\n        int dyDCorner = dyCorner.x;\\n        int dyRCorner = dyCorner.y;\\n        int dyCCorner = dyCorner.z;\\n\\n        // Convolve dy(?, ?, ?, d) with pos mask(:, :, :, ch) to get\\n        // dx(xD, xR, xC, ch).\\n        // ? = to be determined. : = across all values in that axis.\\n        float dotProd = 0.0;\\n\\n        for (int wD = 0; wD < \" + effectiveFilterDepth + \";\\n            wD += \" + dilationDepth + \") {\\n          float dyD = float(dyDCorner + wD) / \" + strideDepth + \".0;\\n\\n          if (dyD < 0.0 || dyD >= \" + convInfo.outDepth + \".0 || fract(dyD) > 0.0) {\\n            continue;\\n          }\\n          int idyD = int(dyD);\\n\\n          for (int wR = 0; wR < \" + effectiveFilterHeight + \";\\n              wR += \" + dilationHeight + \") {\\n            float dyR = float(dyRCorner + wR) / \" + strideHeight + \".0;\\n\\n            if (dyR < 0.0 || dyR >= \" + convInfo.outHeight + \".0 ||\\n                fract(dyR) > 0.0) {\\n              continue;\\n            }\\n            int idyR = int(dyR);\\n\\n            for (int wC = 0; wC < \" + effectiveFilterWidth + \";\\n                wC += \" + dilationWidth + \") {\\n              float dyC = float(dyCCorner + wC) / \" + strideWidth + \".0;\\n\\n              if (dyC < 0.0 || dyC >= \" + convInfo.outWidth + \".0 ||\\n                  fract(dyC) > 0.0) {\\n                continue;\\n              }\\n              int idyC = int(dyC);\\n\\n              float dyValue = getDy(batch, idyD, idyR, idyC, ch);\\n\\n              dotProd += dyValue * avgMultiplier;\\n            }\\n          }\\n        }\\n        setOutput(dotProd);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction avgPool3DGrad$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var dy = inputs.dy,\n\t      input = inputs.input;\n\t  var x = input;\n\t  var filterSize = attrs.filterSize,\n\t      strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dimRoundingMode = attrs.dimRoundingMode;\n\t  var dilations = [1, 1, 1];\n\t  var convInfo = computePool3DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode);\n\t  var avgPoolBackpropProgram = new AvgPool3DBackpropProgram(convInfo);\n\t  return backend.runWebGLProgram(avgPoolBackpropProgram, [dy], x.dtype);\n\t}\n\tvar avgPoolGrad3DConfig = {\n\t  kernelName: AvgPool3DGrad,\n\t  backendName: 'webgl',\n\t  kernelFunc: avgPool3DGrad$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction avgPoolGrad$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var dy = inputs.dy,\n\t      input = inputs.input;\n\t  var x = input;\n\t  assertNotComplex$1([dy, input], 'avgPoolGrad');\n\t  var filterSize = attrs.filterSize,\n\t      strides = attrs.strides,\n\t      pad = attrs.pad;\n\t  var convInfo = computePool2DInfo(x.shape, filterSize, strides, 1\n\t  /* dilations */\n\t  , pad);\n\t  var avgPoolBackpropProgram = new AvgPool2DBackpropProgram(convInfo);\n\t  return backend.runWebGLProgram(avgPoolBackpropProgram, [dy], x.dtype);\n\t}\n\tvar avgPoolGradConfig$2 = {\n\t  kernelName: AvgPoolGrad,\n\t  backendName: 'webgl',\n\t  kernelFunc: avgPoolGrad$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction batchMatMul$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var a = inputs.a,\n\t      b = inputs.b;\n\t  var transposeA = attrs.transposeA,\n\t      transposeB = attrs.transposeB;\n\t  return batchMatMulImpl({\n\t    a: a,\n\t    b: b,\n\t    transposeA: transposeA,\n\t    transposeB: transposeB,\n\t    backend: backend\n\t  });\n\t}\n\tvar batchMatMulConfig$1 = {\n\t  kernelName: BatchMatMul,\n\t  backendName: 'webgl',\n\t  kernelFunc: batchMatMul$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar BatchNormProgram = function BatchNormProgram(xShape, meanShape, varianceShape, offsetShape, scaleShape, varianceEpsilon) {\n\t  this.outputShape = [];\n\t  this.variableNames = ['x', 'mean', 'variance'];\n\t  assertAndGetBroadcastShape(xShape, meanShape);\n\t  assertAndGetBroadcastShape(xShape, varianceShape);\n\t  var offsetSnippet = '0.0';\n\n\t  if (offsetShape != null) {\n\t    assertAndGetBroadcastShape(xShape, offsetShape);\n\t    this.variableNames.push('offset');\n\t    offsetSnippet = 'getOffsetAtOutCoords()';\n\t  }\n\n\t  var scaleSnippet = '1.0';\n\n\t  if (scaleShape != null) {\n\t    assertAndGetBroadcastShape(xShape, scaleShape);\n\t    this.variableNames.push('scale');\n\t    scaleSnippet = 'getScaleAtOutCoords()';\n\t  }\n\n\t  this.outputShape = xShape;\n\t  this.userCode = \"\\n      void main() {\\n        float x = getXAtOutCoords();\\n        float mean = getMeanAtOutCoords();\\n        float variance = getVarianceAtOutCoords();\\n        float offset = \" + offsetSnippet + \";\\n        float scale = \" + scaleSnippet + \";\\n        float inv = scale * inversesqrt(variance + float(\" + varianceEpsilon + \"));\\n        setOutput(dot(vec3(x, -mean, offset), vec3(inv, inv, 1)));\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar BatchNormPackedProgram = function BatchNormPackedProgram(xShape, meanShape, varianceShape, offsetShape, scaleShape, varianceEpsilon) {\n\t  this.packedInputs = true;\n\t  this.packedOutput = true;\n\t  this.variableNames = ['x', 'mean', 'variance'];\n\t  assertAndGetBroadcastShape(xShape, meanShape);\n\t  assertAndGetBroadcastShape(xShape, varianceShape);\n\t  var offsetSnippet = 'vec4(0.0)';\n\n\t  if (offsetShape != null) {\n\t    assertAndGetBroadcastShape(xShape, offsetShape);\n\t    this.variableNames.push('offset');\n\t    offsetSnippet = 'getOffsetAtOutCoords()';\n\t  }\n\n\t  var scaleSnippet = 'vec4(1.0)';\n\n\t  if (scaleShape != null) {\n\t    assertAndGetBroadcastShape(xShape, scaleShape);\n\t    this.variableNames.push('scale');\n\t    scaleSnippet = 'getScaleAtOutCoords()';\n\t  }\n\n\t  this.outputShape = xShape;\n\t  this.userCode = \"\\n      void main() {\\n        vec4 offset = \" + offsetSnippet + \";\\n        vec4 scale = \" + scaleSnippet + \";\\n\\n        vec4 x = getXAtOutCoords();\\n        vec4 mean = getMeanAtOutCoords();\\n        vec4 variance = getVarianceAtOutCoords();\\n\\n        vec4 inv = scale * inversesqrt(variance + vec4(\" + varianceEpsilon + \"));\\n\\n        setOutput((x - mean) * inv + offset);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar batchNorm$2 = function batchNorm(_ref) {\n\t  var inputs = _ref.inputs,\n\t      backend = _ref.backend,\n\t      attrs = _ref.attrs;\n\t  var x = inputs.x,\n\t      mean = inputs.mean,\n\t      variance = inputs.variance,\n\t      offset = inputs.offset,\n\t      scale = inputs.scale;\n\t  assert(mean.shape.length === variance.shape.length, function () {\n\t    return 'Batch normalization gradient requires mean and variance to have ' + 'equal ranks.';\n\t  });\n\t  assert(offset == null || mean.shape.length === offset.shape.length, function () {\n\t    return 'Batch normalization gradient requires mean and offset to have ' + 'equal ranks.';\n\t  });\n\t  assert(scale == null || mean.shape.length === scale.shape.length, function () {\n\t    return 'Batch normalization gradient requires mean and scale to have ' + 'equal ranks.';\n\t  });\n\t  var varianceEpsilon = attrs.varianceEpsilon;\n\n\t  if (varianceEpsilon == null) {\n\t    varianceEpsilon = 0.001;\n\t  }\n\n\t  var finalInputs = [x, mean, variance];\n\t  var offsetShape = null;\n\n\t  if (offset != null) {\n\t    offsetShape = offset.shape;\n\t    finalInputs.push(offset);\n\t  }\n\n\t  var scaleShape = null;\n\n\t  if (scale != null) {\n\t    scaleShape = scale.shape;\n\t    finalInputs.push(scale);\n\t  }\n\n\t  var program = env().getBool('WEBGL_PACK_NORMALIZATION') ? new BatchNormPackedProgram(x.shape, mean.shape, variance.shape, offsetShape, scaleShape, varianceEpsilon) : new BatchNormProgram(x.shape, mean.shape, variance.shape, offsetShape, scaleShape, varianceEpsilon);\n\t  var output = backend.runWebGLProgram(program, finalInputs, finalInputs[0].dtype);\n\t  return output;\n\t};\n\tvar batchNormConfig$1 = {\n\t  kernelName: FusedBatchNorm,\n\t  backendName: 'webgl',\n\t  kernelFunc: batchNorm$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar SliceProgram = /*#__PURE__*/function () {\n\t  function SliceProgram(destSize) {\n\t    this.variableNames = ['source'];\n\t    this.outputShape = destSize;\n\t    this.rank = destSize.length;\n\t    var dtype = getCoordsDataType(this.rank);\n\t    var uniformPart = \"uniform int start[\" + this.rank + \"];\";\n\t    var sourceCoords = getCoords(this.rank);\n\t    var body;\n\t    var coordSum = destSize.map(function (_, i) {\n\t      return \"sourceLoc.\" + coords[i] + \" = start[\" + i + \"] + coords.\" + coords[i] + \";\";\n\t    });\n\t    body = \"\\n        \" + dtype + \" sourceLoc;\\n        \" + dtype + \" coords = getOutputCoords();\\n        \" + coordSum.join('\\n') + \"\\n      \";\n\t    this.userCode = \"\\n      \" + uniformPart + \"\\n      void main() {\\n        \" + body + \"\\n        setOutput(getSource(\" + sourceCoords + \"));\\n      }\\n    \";\n\t  }\n\n\t  var _proto = SliceProgram.prototype;\n\n\t  _proto.getCustomSetupFunc = function getCustomSetupFunc(start) {\n\t    var _this = this;\n\n\t    if (start.length !== this.rank) {\n\t      throw Error(\"The rank (\" + this.rank + \") of the program must match the \" + (\"length of start (\" + start.length + \")\"));\n\t    }\n\n\t    return function (gpgpu, webGLProgram) {\n\t      if (_this.startLoc == null) {\n\t        _this.startLoc = gpgpu.getUniformLocationNoThrow(webGLProgram, 'start');\n\n\t        if (_this.startLoc == null) {\n\t          // This means the compiler has optimized and realized it doesn't need\n\t          // the uniform.\n\t          return;\n\t        }\n\t      }\n\n\t      gpgpu.gl.uniform1iv(_this.startLoc, start);\n\t    };\n\t  };\n\n\t  return SliceProgram;\n\t}();\n\tvar coords = ['x', 'y', 'z', 'w', 'u', 'v'];\n\n\tfunction getCoords(rank) {\n\t  if (rank === 1) {\n\t    return 'sourceLoc';\n\t  } else if (rank <= 6) {\n\t    return coords.slice(0, rank).map(function (x) {\n\t      return 'sourceLoc.' + x;\n\t    }).join(',');\n\t  } else {\n\t    throw Error(\"Slicing for rank \" + rank + \" is not yet supported\");\n\t  }\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar SlicePackedProgram = /*#__PURE__*/function () {\n\t  function SlicePackedProgram(destSize) {\n\t    this.variableNames = ['source'];\n\t    this.packedInputs = true;\n\t    this.packedOutput = true;\n\t    this.outputShape = destSize;\n\t    this.rank = destSize.length;\n\t    var dtype = getCoordsDataType(this.rank);\n\t    var coords = getChannels('coords', this.rank);\n\t    var sourceLoc = getChannels('sourceLoc', this.rank);\n\t    var innerDims = this.rank === 1 ? 'sourceLoc' : \"vec2(\" + sourceLoc.slice(-2).join() + \")\";\n\t    var getChannel = \"getChannel(getSource(\" + sourceLoc.join() + \"), \" + innerDims + \")\";\n\t    var upperRow = \"\\n      result.x = \" + getChannel + \";\\n      if (++\" + coords[this.rank - 1] + \" < \" + destSize[this.rank - 1] + \") {\\n        ++\" + sourceLoc[this.rank - 1] + \";\\n        result.y = \" + getChannel + \";\\n        --\" + sourceLoc[this.rank - 1] + \";\\n      }\\n    \";\n\t    var lowerRow = this.rank === 1 ? '' : \"\\n      --\" + coords[this.rank - 1] + \";\\n      if (++\" + coords[this.rank - 2] + \" < \" + destSize[this.rank - 2] + \") {\\n        ++\" + sourceLoc[this.rank - 2] + \";\\n        result.z = \" + getChannel + \";\\n        if (++\" + coords[this.rank - 1] + \" < \" + destSize[this.rank - 1] + \") {\\n          ++\" + sourceLoc[this.rank - 1] + \";\\n          result.w = \" + getChannel + \";\\n        }\\n      }\\n    \";\n\t    var sourceLocSetup = this.rank <= 4 ? \"sourceLoc = coords +\\n            \" + dtype + \"(\" + destSize.map(function (_, i) {\n\t      return \"start[\" + i + \"]\";\n\t    }).join() + \");\" : destSize.map(function (_, i) {\n\t      return sourceLoc[i] + \" = \" + coords[i] + \" + start[\" + i + \"];\";\n\t    }).join('\\n');\n\t    this.userCode = \"\\n      uniform int start[\" + this.rank + \"];\\n      void main() {\\n        \" + dtype + \" coords = getOutputCoords();\\n        \" + dtype + \" sourceLoc;\\n        \" + sourceLocSetup + \"\\n        vec4 result = vec4(0.);\\n        \" + upperRow + \"\\n        \" + lowerRow + \"\\n        setOutput(result);\\n      }\\n    \";\n\t  }\n\n\t  var _proto = SlicePackedProgram.prototype;\n\n\t  _proto.getCustomSetupFunc = function getCustomSetupFunc(start) {\n\t    var _this = this;\n\n\t    if (start.length !== this.rank) {\n\t      throw Error(\"The rank (\" + this.rank + \") of the program must match the \" + (\"length of start (\" + start.length + \")\"));\n\t    }\n\n\t    return function (gpgpu, webGLProgram) {\n\t      if (_this.startLoc == null) {\n\t        _this.startLoc = gpgpu.getUniformLocationNoThrow(webGLProgram, 'start');\n\n\t        if (_this.startLoc == null) {\n\t          // This means the compiler has optimized and realized it doesn't need\n\t          // the uniform.\n\t          return;\n\t        }\n\t      }\n\n\t      gpgpu.gl.uniform1iv(_this.startLoc, start);\n\t    };\n\t  };\n\n\t  return SlicePackedProgram;\n\t}();\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tfunction shallowSlice(x, begin, size, backend) {\n\t  var xTexData = backend.texData.get(x.dataId);\n\t  var t = backend.makeTensorInfo(size, x.dtype);\n\t  var newTexData = backend.texData.get(t.dataId); // Copy texture data from the original tensor.\n\n\t  Object.assign(newTexData, xTexData);\n\t  newTexData.shape = size;\n\t  newTexData.dtype = x.dtype;\n\t  var flatOffset = computeFlatOffset(begin, computeStrides(x.shape));\n\n\t  if (xTexData.slice) {\n\t    // We are slicing an already sliced tensor, so we have to accumulate\n\t    // the offset.\n\t    flatOffset += xTexData.slice.flatOffset;\n\t  }\n\n\t  newTexData.slice = {\n\t    flatOffset: flatOffset,\n\t    // Point to the original dataId, which is used to do ref counting.\n\t    origDataId: xTexData.slice && xTexData.slice.origDataId || x.dataId\n\t  }; // Increase the ref count for that data bucket.\n\n\t  var refCount = backend.dataRefCount.get(newTexData.slice.origDataId) || 1;\n\t  backend.dataRefCount.set(newTexData.slice.origDataId, refCount + 1);\n\t  return t;\n\t}\n\n\tfunction slice$4(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var begin = attrs.begin,\n\t      size = attrs.size;\n\n\t  var _slice_util$parseSlic = parseSliceParams(x, begin, size),\n\t      $begin = _slice_util$parseSlic[0],\n\t      $size = _slice_util$parseSlic[1];\n\n\t  assertParamsValid(x, $begin, $size);\n\n\t  if (sizeFromShape($size) === 0) {\n\t    return backend.makeTensorInfo($size, x.dtype, []);\n\t  } // Run on cpu if dtype is string. For string, the backend represents it\n\t  // as Uint8Array[], where each Uint8Array is a character. Given that the\n\t  // computation is only on the outer array, uploading the whole data onto\n\t  // gpu is wasteful. Also, currently webgl doesn't have a design to\n\t  // upload and retrieve Uint8Array[] between cpu and gpu. Therefore, we\n\t  // just run the kernel on cpu if dtype is string.\n\n\n\t  if (backend.shouldExecuteOnCPU([x]) || x.dtype === 'string') {\n\t    var xTexData = backend.texData.get(x.dataId);\n\t    var outValues = sliceImplCPU(xTexData.values, $begin, $size, x.shape, x.dtype);\n\t    return backend.makeTensorInfo($size, x.dtype, outValues);\n\t  }\n\n\t  var _backend$texData$get = backend.texData.get(x.dataId),\n\t      isPacked = _backend$texData$get.isPacked;\n\n\t  var isContinous = isSliceContinous(x.shape, $begin, $size);\n\n\t  if (isPacked || !isContinous) {\n\t    var program = env().getBool('WEBGL_PACK_ARRAY_OPERATIONS') ? new SlicePackedProgram($size) : new SliceProgram($size);\n\t    var customSetup = program.getCustomSetupFunc($begin);\n\t    return backend.runWebGLProgram(program, [x], x.dtype, customSetup);\n\t  }\n\n\t  backend.uploadToGPU(x.dataId);\n\t  return shallowSlice(x, $begin, $size, backend);\n\t}\n\tvar sliceConfig$1 = {\n\t  kernelName: Slice,\n\t  backendName: 'webgl',\n\t  kernelFunc: slice$4\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar batchToSpaceND$2 = function batchToSpaceND(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var blockShape = attrs.blockShape,\n\t      crops = attrs.crops;\n\t  assert(x.shape.length <= 4, function () {\n\t    return 'batchToSpaceND for rank > 4 with a WebGL backend not ' + 'implemented yet';\n\t  });\n\t  var prod = blockShape.reduce(function (a, b) {\n\t    return a * b;\n\t  });\n\t  var reshaped = getReshaped(x.shape, blockShape, prod);\n\t  var permuted = getPermuted(reshaped.length, blockShape.length);\n\t  var reshapedPermuted = getReshapedPermuted(x.shape, blockShape, prod);\n\t  var sliceBeginCoords = getSliceBeginCoords(crops, blockShape.length);\n\t  var sliceSize = getSliceSize(reshapedPermuted, crops, blockShape.length);\n\t  var toDispose = [];\n\t  var reshapedIntermediate = reshape$3({\n\t    inputs: {\n\t      x: x\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: reshaped\n\t    }\n\t  });\n\t  var transposedIntermediate = transpose$2({\n\t    inputs: {\n\t      x: reshapedIntermediate\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      perm: permuted\n\t    }\n\t  });\n\t  var reshapedIntermediate2 = reshape$3({\n\t    inputs: {\n\t      x: transposedIntermediate\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: reshapedPermuted\n\t    }\n\t  });\n\t  var sliced = slice$4({\n\t    inputs: {\n\t      x: reshapedIntermediate2\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      begin: sliceBeginCoords,\n\t      size: sliceSize\n\t    }\n\t  });\n\t  toDispose.push(reshapedIntermediate);\n\t  toDispose.push(transposedIntermediate);\n\t  toDispose.push(reshapedIntermediate2);\n\t  toDispose.forEach(function (t) {\n\t    return backend.disposeIntermediateTensorInfo(t);\n\t  });\n\t  return sliced;\n\t};\n\tvar batchToSpaceNDConfig$1 = {\n\t  kernelName: BatchToSpaceND,\n\t  backendName: 'webgl',\n\t  kernelFunc: batchToSpaceND$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction bincount$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      weights = inputs.weights;\n\t  var size = attrs.size;\n\t  var xVals = backend.readSync(x.dataId);\n\t  var weightsVals = backend.readSync(weights.dataId);\n\t  var outVals = bincountImplCPU(xVals, weightsVals, weights.dtype, weights.shape, size);\n\t  return backend.makeTensorInfo([size], weights.dtype, outVals);\n\t}\n\tvar bincountConfig$1 = {\n\t  kernelName: Bincount,\n\t  backendName: 'webgl',\n\t  kernelFunc: bincount$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar NOT_EQUAL$1 = \"return float(a != b);\";\n\tvar notEqual$2 = binaryKernelFunc$1({\n\t  opSnippet: NOT_EQUAL$1,\n\t  dtype: 'bool'\n\t});\n\tvar notEqualConfig$1 = {\n\t  kernelName: NotEqual,\n\t  backendName: 'webgl',\n\t  kernelFunc: notEqual$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction real$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var input = inputs.input;\n\t  var inputData = backend.texData.get(input.dataId);\n\t  return identity$2({\n\t    inputs: {\n\t      x: inputData.complexTensorInfos.real\n\t    },\n\t    backend: backend\n\t  });\n\t}\n\tvar realConfig$1 = {\n\t  kernelName: Real,\n\t  backendName: 'webgl',\n\t  kernelFunc: real$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar TO_INT = \"return float(int(x));\";\n\tfunction int(input, backend) {\n\t  var program = new UnaryOpProgram(input.shape, TO_INT);\n\t  var output = backend.runWebGLProgram(program, [input], 'int32');\n\t  return {\n\t    dataId: output.dataId,\n\t    shape: output.shape,\n\t    dtype: output.dtype\n\t  };\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction cast$3(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var dtype = attrs.dtype; // Casting to complex64.\n\n\t  if (dtype === 'complex64') {\n\t    if (x.dtype === 'complex64') {\n\t      return identity$2({\n\t        inputs: {\n\t          x: x\n\t        },\n\t        backend: backend\n\t      });\n\t    } // TODO(annxingyuan): Import kernel function once zeros is modularized.\n\n\n\t    var zerosTensor = zeros(x.shape);\n\t    var floatX = cast$3({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        dtype: 'float32'\n\t      }\n\t    });\n\t    var result = complex$2({\n\t      inputs: {\n\t        real: floatX,\n\t        imag: zerosTensor\n\t      },\n\t      backend: backend\n\t    });\n\t    zerosTensor.dispose();\n\t    backend.disposeIntermediateTensorInfo(floatX);\n\t    return result;\n\t  } // Casting from complex64\n\n\n\t  if (x.dtype === 'complex64') {\n\t    var realPart = real$2({\n\t      inputs: {\n\t        input: x\n\t      },\n\t      backend: backend\n\t    });\n\n\t    var _result = cast$3({\n\t      inputs: {\n\t        x: realPart\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        dtype: dtype\n\t      }\n\t    });\n\n\t    backend.disposeIntermediateTensorInfo(realPart);\n\t    return _result;\n\t  }\n\n\t  if (!hasEncodingLoss(x.dtype, dtype)) {\n\t    // We don't change the underlying data, since we cast to higher\n\t    // precision.\n\t    var _result2 = identity$2({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend\n\t    });\n\n\t    return {\n\t      dataId: _result2.dataId,\n\t      shape: _result2.shape,\n\t      dtype: dtype\n\t    };\n\t  }\n\n\t  if (dtype === 'int32') {\n\t    return int(x, backend);\n\t  }\n\n\t  if (dtype === 'bool') {\n\t    var zerosTensorInfo = backend.makeTensorInfo([], 'bool', getTypedArrayFromDType('bool', 1));\n\t    var binaryInputs = {\n\t      a: x,\n\t      b: zerosTensorInfo\n\t    };\n\n\t    var _result3 = notEqual$2({\n\t      inputs: binaryInputs,\n\t      backend: backend\n\t    });\n\n\t    backend.disposeIntermediateTensorInfo(zerosTensorInfo);\n\t    return _result3;\n\t  }\n\n\t  throw new Error(\"Error in Cast: failed to cast \" + x.dtype + \" to \" + dtype);\n\t}\n\tvar castConfig$1 = {\n\t  kernelName: Cast,\n\t  backendName: 'webgl',\n\t  kernelFunc: cast$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar CEIL = \"return ceil(x);\";\n\tvar ceil$5 = unaryKernelFunc$1({\n\t  opSnippet: CEIL,\n\t  packedOpSnippet: CEIL,\n\t  cpuKernelImpl: ceilImplCPU\n\t});\n\tvar ceilConfig$1 = {\n\t  kernelName: Ceil,\n\t  backendName: 'webgl',\n\t  kernelFunc: ceil$5\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ClipProgram = /*#__PURE__*/function () {\n\t  function ClipProgram(aShape) {\n\t    this.variableNames = ['A'];\n\t    this.outputShape = aShape;\n\t    this.userCode = \"\\n      uniform float minVal;\\n      uniform float maxVal;\\n\\n      void main() {\\n        float value = getAAtOutCoords();\\n        if (isnan(value)) {\\n          setOutput(value);\\n          return;\\n        }\\n\\n        setOutput(clamp(value, minVal, maxVal));\\n      }\\n    \";\n\t  }\n\n\t  var _proto = ClipProgram.prototype;\n\n\t  _proto.getCustomSetupFunc = function getCustomSetupFunc(min, max) {\n\t    var _this = this;\n\n\t    return function (gpgpu, webGLProgram) {\n\t      if (_this.minLoc == null) {\n\t        _this.minLoc = gpgpu.getUniformLocationNoThrow(webGLProgram, 'minVal');\n\t        _this.maxLoc = gpgpu.getUniformLocationNoThrow(webGLProgram, 'maxVal');\n\t      }\n\n\t      gpgpu.gl.uniform1f(_this.minLoc, min);\n\t      gpgpu.gl.uniform1f(_this.maxLoc, max);\n\t    };\n\t  };\n\n\t  return ClipProgram;\n\t}();\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ClipPackedProgram = /*#__PURE__*/function () {\n\t  function ClipPackedProgram(aShape) {\n\t    this.variableNames = ['A'];\n\t    this.packedInputs = true;\n\t    this.packedOutput = true;\n\t    this.outputShape = aShape;\n\t    this.userCode = \"\\n      uniform float minVal;\\n      uniform float maxVal;\\n\\n      void main() {\\n        vec4 value = getAAtOutCoords();\\n\\n        if (any(isnan(value))) {\\n          setOutput(value);\\n          return;\\n        }\\n\\n        setOutput(clamp(value, vec4(minVal), vec4(maxVal)));\\n      }\\n    \";\n\t  }\n\n\t  var _proto = ClipPackedProgram.prototype;\n\n\t  _proto.getCustomSetupFunc = function getCustomSetupFunc(min, max) {\n\t    var _this = this;\n\n\t    return function (gpgpu, webGLProgram) {\n\t      if (_this.minLoc == null) {\n\t        _this.minLoc = gpgpu.getUniformLocationNoThrow(webGLProgram, 'minVal');\n\t        _this.maxLoc = gpgpu.getUniformLocationNoThrow(webGLProgram, 'maxVal');\n\t      }\n\n\t      gpgpu.gl.uniform1f(_this.minLoc, min);\n\t      gpgpu.gl.uniform1f(_this.maxLoc, max);\n\t    };\n\t  };\n\n\t  return ClipPackedProgram;\n\t}();\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction clipByValue$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var clipValueMin = attrs.clipValueMin,\n\t      clipValueMax = attrs.clipValueMax;\n\t  var program;\n\n\t  if (env().getBool('WEBGL_PACK_CLIP')) {\n\t    program = new ClipPackedProgram(x.shape);\n\t  } else {\n\t    program = new ClipProgram(x.shape);\n\t  }\n\n\t  var customSetup = program.getCustomSetupFunc(clipValueMin, clipValueMax);\n\t  return backend.runWebGLProgram(program, [x], x.dtype, customSetup);\n\t}\n\tvar clipByValueConfig = {\n\t  kernelName: ClipByValue,\n\t  backendName: 'webgl',\n\t  kernelFunc: clipByValue$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ComplexAbsProgram = function ComplexAbsProgram(shape) {\n\t  this.variableNames = ['real', 'imag'];\n\t  this.outputShape = shape;\n\t  this.userCode = \"\\n      void main() {\\n        float re = abs(getRealAtOutCoords());\\n        float im = abs(getImagAtOutCoords());\\n        float mx = max(re, im);\\n\\n        // sadly the length function in glsl is not underflow-safe\\n        // (at least not on Intel GPUs). So the safe solution is\\n        // to ensure underflow-safety in all cases.\\n        setOutput(\\n          mx == 0.0 ? 0.0 : mx * length(vec2(1, min(re, im)/mx))\\n        );\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t// underlying part. We need to do this because a reshaped complex tensor is\n\t// not reflected in its parts.\n\n\tfunction makeComplexComponentTensorInfo(complexTensor, complexPart) {\n\t  return {\n\t    dataId: complexPart.dataId,\n\t    dtype: complexPart.dtype,\n\t    shape: complexTensor.shape\n\t  };\n\t}\n\n\tfunction complexAbs$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var x = inputs.x;\n\t  var xData = backend.texData.get(x.dataId);\n\t  var program = new ComplexAbsProgram(x.shape);\n\t  var programInputs = [makeComplexComponentTensorInfo(x, xData.complexTensorInfos.real), makeComplexComponentTensorInfo(x, xData.complexTensorInfos.imag)];\n\t  return backend.runWebGLProgram(program, programInputs, programInputs[0].dtype);\n\t}\n\tvar complexAbsConfig$1 = {\n\t  kernelName: ComplexAbs,\n\t  backendName: 'webgl',\n\t  kernelFunc: complexAbs$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ConcatProgram = // Concats 2d tensors along axis=1. See comments in MathBackendWebGL.concat().\n\tfunction ConcatProgram(shapes) {\n\t  this.outputShape = [];\n\t  this.outputShape = computeOutShape$1(shapes, 1\n\t  /* axis */\n\t  );\n\t  this.variableNames = shapes.map(function (_, i) {\n\t    return \"T\" + i;\n\t  });\n\t  var offsets = new Array(shapes.length - 1);\n\t  offsets[0] = shapes[0][1];\n\n\t  for (var i = 1; i < offsets.length; i++) {\n\t    offsets[i] = offsets[i - 1] + shapes[i][1];\n\t  }\n\n\t  var snippets = [\"if (yC < \" + offsets[0] + \") setOutput(getT0(yR, yC));\"];\n\n\t  for (var _i = 1; _i < offsets.length; _i++) {\n\t    var shift = offsets[_i - 1];\n\t    snippets.push(\"else if (yC < \" + offsets[_i] + \") \" + (\"setOutput(getT\" + _i + \"(yR, yC-\" + shift + \"));\"));\n\t  }\n\n\t  var lastIndex = offsets.length;\n\t  var lastShift = offsets[offsets.length - 1];\n\t  snippets.push(\"else setOutput(getT\" + lastIndex + \"(yR, yC-\" + lastShift + \"));\");\n\t  this.userCode = \"\\n      void main() {\\n        ivec2 coords = getOutputCoords();\\n        int yR = coords.x;\\n        int yC = coords.y;\\n\\n        \" + snippets.join('\\n        ') + \"\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ConcatPackedProgram = function ConcatPackedProgram(shapes, axis) {\n\t  this.packedInputs = true;\n\t  this.packedOutput = true;\n\t  this.outputShape = [];\n\t  this.outputShape = computeOutShape$1(shapes, axis);\n\t  var shape = this.outputShape;\n\t  var rank = shape.length;\n\t  var dtype = getCoordsDataType(rank);\n\t  var coords = getChannels('coords', rank);\n\t  var channels = ['x', 'y', 'z', 'w', 'u', 'v'].slice(0, rank);\n\t  this.variableNames = shapes.map(function (_, i) {\n\t    return \"T\" + i;\n\t  });\n\t  var offsets = new Array(shapes.length - 1);\n\t  offsets[0] = shapes[0][axis];\n\n\t  for (var i = 1; i < offsets.length; i++) {\n\t    offsets[i] = offsets[i - 1] + shapes[i][axis];\n\t  }\n\n\t  var channel = channels[axis];\n\t  var lastChannels = channels.slice(-2);\n\t  var allChannels = channels.join();\n\t  var getValueSnippet = \"if (\" + channel + \" < \" + offsets[0] + \") {\\n        return getChannel(\\n            getT0(\" + allChannels + \"), vec2(\" + lastChannels.join() + \"));\\n        }\";\n\n\t  for (var _i = 1; _i < offsets.length; _i++) {\n\t    var _shift = offsets[_i - 1]; // Note: the >= comparison below may seem unnecessary given the check\n\t    // above but is needed to workaround branch execution issues on some\n\t    // devices. It makes all the conditions exclusive without relying on\n\t    // execution order.\n\n\t    getValueSnippet += \"\\n        if (\" + channel + \" < \" + offsets[_i] + \"  && \" + channel + \" >= \" + offsets[_i - 1] + \") {\\n          return getChannel(\\n            getT\" + _i + \"(\" + shiftedChannels(channels, channel, _shift) + \"),\\n            vec2(\" + shiftedChannels(lastChannels, channel, _shift) + \"));\\n        }\";\n\t  }\n\n\t  var lastIndex = offsets.length;\n\t  var shift = offsets[offsets.length - 1];\n\t  getValueSnippet += \"\\n        return getChannel(\\n          getT\" + lastIndex + \"(\" + shiftedChannels(channels, channel, shift) + \"),\\n          vec2(\" + shiftedChannels(lastChannels, channel, shift) + \"));\";\n\t  this.userCode = \"\\n      float getValue(\" + channels.map(function (x) {\n\t    return 'int ' + x;\n\t  }) + \") {\\n        \" + getValueSnippet + \"\\n      }\\n\\n      void main() {\\n        \" + dtype + \" coords = getOutputCoords();\\n        vec4 result = vec4(getValue(\" + coords + \"), 0., 0., 0.);\\n\\n        \" + coords[rank - 1] + \" = \" + coords[rank - 1] + \" + 1;\\n        if (\" + coords[rank - 1] + \" < \" + shape[rank - 1] + \") {\\n          result.g = getValue(\" + coords + \");\\n        }\\n\\n        \" + coords[rank - 2] + \" = \" + coords[rank - 2] + \" + 1;\\n        if (\" + coords[rank - 2] + \" < \" + shape[rank - 2] + \") {\\n          result.a = getValue(\" + coords + \");\\n        }\\n\\n        \" + coords[rank - 1] + \" = \" + coords[rank - 1] + \" - 1;\\n        if (\" + coords[rank - 2] + \" < \" + shape[rank - 2] + \" &&\\n            \" + coords[rank - 1] + \" < \" + shape[rank - 1] + \") {\\n          result.b = getValue(\" + coords + \");\\n        }\\n        setOutput(result);\\n      }\\n    \";\n\t};\n\t/**\n\t * Return an expression for coordinates into a vector where a given channel\n\t * will be offset by [shift].\n\t *\n\t * @param channels the channels to consider\n\t * @param channel the channel we want shifted\n\t * @param shift  the amount to subtract from the channel.\n\t *\n\t * @returns a string of the form 'x, y-[shift], z' where any one channel can\n\t * have the shift applied.\n\t */\n\n\tfunction shiftedChannels(channels, channel, shift) {\n\t  var channelIdx = channels.indexOf(channel);\n\t  var res = channels.map(function (c, idx) {\n\t    if (idx === channelIdx) {\n\t      return c + \" - \" + shift;\n\t    } else {\n\t      return c;\n\t    }\n\t  });\n\t  return res.join();\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction imag$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var input = inputs.input;\n\t  var inputData = backend.texData.get(input.dataId);\n\t  return identity$2({\n\t    inputs: {\n\t      x: inputData.complexTensorInfos.imag\n\t    },\n\t    backend: backend\n\t  });\n\t}\n\tvar imagConfig$1 = {\n\t  kernelName: Imag,\n\t  backendName: 'webgl',\n\t  kernelFunc: imag$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction concatImpl$1(inputs, axis, backend) {\n\t  var dtype = inputs[0].dtype;\n\n\t  if (dtype === 'complex64') {\n\t    var reals = inputs.map(function (t) {\n\t      return real$2({\n\t        inputs: {\n\t          input: t\n\t        },\n\t        backend: backend\n\t      });\n\t    });\n\t    var imags = inputs.map(function (t) {\n\t      return imag$2({\n\t        inputs: {\n\t          input: t\n\t        },\n\t        backend: backend\n\t      });\n\t    });\n\t    var realConcated = concatImpl$1(reals, axis, backend);\n\t    var imagConcated = concatImpl$1(imags, axis, backend);\n\n\t    var _result = complex$2({\n\t      inputs: {\n\t        real: realConcated,\n\t        imag: imagConcated\n\t      },\n\t      backend: backend\n\t    });\n\n\t    reals.forEach(function (r) {\n\t      return backend.disposeIntermediateTensorInfo(r);\n\t    });\n\t    imags.forEach(function (i) {\n\t      return backend.disposeIntermediateTensorInfo(i);\n\t    });\n\t    backend.disposeIntermediateTensorInfo(realConcated);\n\t    backend.disposeIntermediateTensorInfo(imagConcated);\n\t    return _result;\n\t  } // Run on cpu if dtype is string. For string, the backend represents it\n\t  // as Uint8Array[], where each Uint8Array is a character. Given that the\n\t  // computation is only on the outer array, uploading the whole data onto\n\t  // gpu is wasteful. Also, currently webgl doesn't have a design to\n\t  // upload and retrieve Uint8Array[] between cpu and gpu. Therefore, we\n\t  // just run the kernel on cpu if dtype is string.\n\n\n\t  if (dtype === 'string') {\n\t    var _computeTensors2D = computeTensors2D(inputs, axis, backend),\n\t        _tensors2D = _computeTensors2D.tensors2D,\n\t        _outShape = _computeTensors2D.outShape;\n\n\t    var inputsValShapes = _tensors2D.map(function (t) {\n\t      return {\n\t        vals: backend.readSync(t.dataId),\n\t        shape: t.shape\n\t      };\n\t    });\n\n\t    var simplyConcat = _tensors2D[0].shape[0] === 1;\n\t    var outVals = concatImplCPU(inputsValShapes, _outShape, dtype, simplyConcat);\n\t    var finalOutShape = computeOutShape$1(inputs.map(function (t) {\n\t      return t.shape;\n\t    }), axis);\n\t    var outInfo = backend.makeTensorInfo(finalOutShape, dtype, outVals);\n\n\t    _tensors2D.forEach(function (t) {\n\t      return backend.disposeIntermediateTensorInfo(t);\n\t    });\n\n\t    return outInfo;\n\t  }\n\n\t  if (inputs.length > env().getNumber('WEBGL_MAX_TEXTURES_IN_SHADER')) {\n\t    var midIndex = Math.floor(inputs.length / 2);\n\t    var leftSide = concatImpl$1(inputs.slice(0, midIndex), axis, backend);\n\t    var rightSide = concatImpl$1(inputs.slice(midIndex), axis, backend);\n\n\t    var _result2 = concatImpl$1([leftSide, rightSide], axis, backend);\n\n\t    backend.disposeIntermediateTensorInfo(leftSide);\n\t    backend.disposeIntermediateTensorInfo(rightSide);\n\t    return _result2;\n\t  }\n\n\t  if (env().getBool('WEBGL_PACK_ARRAY_OPERATIONS') && inputs[0].shape.length > 1) {\n\t    var _program = new ConcatPackedProgram(inputs.map(function (t) {\n\t      return t.shape;\n\t    }), axis);\n\n\t    return backend.runWebGLProgram(_program, inputs, dtype);\n\t  }\n\n\t  var _computeTensors2D2 = computeTensors2D(inputs, axis, backend),\n\t      tensors2D = _computeTensors2D2.tensors2D,\n\t      outShape = _computeTensors2D2.outShape;\n\n\t  var program = new ConcatProgram(tensors2D.map(function (t) {\n\t    return t.shape;\n\t  }));\n\t  var result = backend.runWebGLProgram(program, tensors2D, dtype);\n\t  tensors2D.forEach(function (r) {\n\t    return backend.disposeIntermediateTensorInfo(r);\n\t  });\n\t  var reshapedResult = reshape$3({\n\t    inputs: {\n\t      x: result\n\t    },\n\t    attrs: {\n\t      shape: outShape\n\t    },\n\t    backend: backend\n\t  });\n\t  backend.disposeIntermediateTensorInfo(result);\n\t  return reshapedResult;\n\t}\n\n\tfunction computeTensors2D(inputs, axis, backend) {\n\t  // Any concat of n-dimensional tensors across any axis can be reduced to\n\t  // a concatenation of two-dimensional tensors across the axis 1 by first\n\t  // partitioning the axes of the original tensors into those less than the\n\t  // axis to be concatenated and the rest. Then reshape the tensors\n\t  // into a two-dimensional tensor by collapsing these two sets of axes and\n\t  // concatenate the resulting matrices across the axis 1, finally reshaping\n\t  // the result to have the proper shape.\n\t  var outShape = computeOutShape$1(inputs.map(function (t) {\n\t    return t.shape;\n\t  }), axis);\n\t  var tensors2D = inputs.map(function (x) {\n\t    return reshape$3({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      attrs: {\n\t        shape: [-1, sizeFromShape(x.shape.slice(axis))]\n\t      },\n\t      backend: backend\n\t    });\n\t  });\n\t  return {\n\t    tensors2D: tensors2D,\n\t    outShape: outShape\n\t  };\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction concat$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var axis = attrs.axis;\n\t  var $axis = parseAxisParam(axis, inputs[0].shape)[0];\n\t  var outShape = computeOutShape$1(inputs.map(function (t) {\n\t    return t.shape;\n\t  }), $axis);\n\n\t  if (sizeFromShape(outShape) === 0) {\n\t    return backend.makeTensorInfo(outShape, inputs[0].dtype, []);\n\t  } // Keep only non-empty tensors (ignore tensors with 0 in their shape).\n\n\n\t  var $inputs = inputs.filter(function (t) {\n\t    return sizeFromShape(t.shape) > 0;\n\t  });\n\n\t  if ($inputs.length === 1) {\n\t    return identity$2({\n\t      inputs: {\n\t        x: $inputs[0]\n\t      },\n\t      backend: backend\n\t    });\n\t  }\n\n\t  var shapes = $inputs.map(function (t) {\n\t    return t.shape;\n\t  });\n\t  assertParamsConsistent(shapes, $axis);\n\t  return concatImpl$1($inputs, $axis, backend);\n\t}\n\tvar concatConfig$1 = {\n\t  kernelName: Concat,\n\t  backendName: 'webgl',\n\t  kernelFunc: concat$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar Conv2DProgram = function Conv2DProgram(convInfo, addBias, activation, hasPreluActivationWeights, hasLeakyreluAlpha) {\n\t  if (addBias === void 0) {\n\t    addBias = false;\n\t  }\n\n\t  if (activation === void 0) {\n\t    activation = null;\n\t  }\n\n\t  if (hasPreluActivationWeights === void 0) {\n\t    hasPreluActivationWeights = false;\n\t  }\n\n\t  if (hasLeakyreluAlpha === void 0) {\n\t    hasLeakyreluAlpha = false;\n\t  }\n\n\t  this.variableNames = ['x', 'W'];\n\t  this.outputShape = convInfo.outShape;\n\t  var padTop = convInfo.padInfo.top;\n\t  var padLeft = convInfo.padInfo.left;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var dilationHeight = convInfo.dilationHeight;\n\t  var dilationWidth = convInfo.dilationWidth;\n\t  var filterHeight = convInfo.filterHeight;\n\t  var filterWidth = convInfo.filterWidth;\n\t  var inputDepthNearestVec4 = Math.floor(convInfo.inChannels / 4) * 4;\n\t  var inputDepthVec4Remainder = convInfo.inChannels % 4;\n\t  var isChannelsLast = convInfo.dataFormat === 'channelsLast';\n\t  var rowDim = isChannelsLast ? 1 : 2;\n\t  var colDim = isChannelsLast ? 2 : 3;\n\t  var channelDim = isChannelsLast ? 3 : 1;\n\t  var activationSnippet = '',\n\t      applyActivationSnippet = '';\n\n\t  if (activation) {\n\t    if (hasPreluActivationWeights) {\n\t      activationSnippet = \"float activation(float a) {\\n          float b = getPreluActivationWeightsAtOutCoords();\\n          \" + activation + \"\\n        }\";\n\t    } else if (hasLeakyreluAlpha) {\n\t      activationSnippet = \"float activation(float a) {\\n          float b = getLeakyreluAlphaAtOutCoords();\\n          \" + activation + \"\\n        }\";\n\t    } else {\n\t      activationSnippet = \"\\n          float activation(float x) {\\n            \" + activation + \"\\n          }\\n        \";\n\t    }\n\n\t    applyActivationSnippet = \"result = activation(result);\";\n\t  }\n\n\t  var addBiasSnippet = addBias ? 'result += getBiasAtOutCoords();' : '';\n\n\t  if (addBias) {\n\t    this.variableNames.push('bias');\n\t  }\n\n\t  if (hasPreluActivationWeights) {\n\t    this.variableNames.push('preluActivationWeights');\n\t  }\n\n\t  if (hasLeakyreluAlpha) {\n\t    this.variableNames.push('leakyreluAlpha');\n\t  }\n\n\t  this.userCode = \"\\n      \" + activationSnippet + \"\\n\\n      const ivec2 strides = ivec2(\" + strideHeight + \", \" + strideWidth + \");\\n      const ivec2 pads = ivec2(\" + padTop + \", \" + padLeft + \");\\n\\n      void main() {\\n        ivec4 coords = getOutputCoords();\\n        int batch = coords[0];\\n        int d2 = coords[\" + channelDim + \"];\\n\\n        ivec2 xRCCorner =\\n            ivec2(coords[\" + rowDim + \"], coords[\" + colDim + \"]) * strides - pads;\\n        int xRCorner = xRCCorner.x;\\n        int xCCorner = xRCCorner.y;\\n\\n        // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2).\\n        // ? = to be determined. : = across all values in that axis.\\n        float dotProd = 0.0;\\n        for (int wR = 0; wR < \" + filterHeight + \"; wR++) {\\n          int xR = xRCorner + wR * \" + dilationHeight + \";\\n\\n          if (xR < 0 || xR >= \" + convInfo.inHeight + \") {\\n            continue;\\n          }\\n\\n          for (int wC = 0; wC < \" + filterWidth + \"; wC++) {\\n            int xC = xCCorner + wC * \" + dilationWidth + \";\\n\\n            if (xC < 0 || xC >= \" + convInfo.inWidth + \") {\\n              continue;\\n            }\\n\\n            for (int d1 = 0; d1 < \" + inputDepthNearestVec4 + \"; d1 += 4) {\\n              vec4 wValues = vec4(\\n                getW(wR, wC, d1, d2),\\n                getW(wR, wC, d1 + 1, d2),\\n                getW(wR, wC, d1 + 2, d2),\\n                getW(wR, wC, d1 + 3, d2)\\n              );\\n\\n              if (\" + isChannelsLast + \") {\\n                vec4 xValues = vec4(\\n                  getX(batch, xR, xC, d1),\\n                  getX(batch, xR, xC, d1 + 1),\\n                  getX(batch, xR, xC, d1 + 2),\\n                  getX(batch, xR, xC, d1 + 3)\\n                );\\n                dotProd += dot(xValues, wValues);\\n              } else {\\n                vec4 xValues = vec4(\\n                  getX(batch, d1, xR, xC),\\n                  getX(batch, d1 + 1, xR, xC),\\n                  getX(batch, d1 + 2, xR, xC),\\n                  getX(batch, d1 + 3, xR, xC)\\n                );\\n                dotProd += dot(xValues, wValues);\\n              }\\n            }\\n\\n            if (\" + (inputDepthVec4Remainder === 1) + \") {\\n\\n              if (\" + isChannelsLast + \") {\\n                dotProd +=\\n                    getX(batch, xR, xC, \" + inputDepthNearestVec4 + \") *\\n                    getW(wR, wC, \" + inputDepthNearestVec4 + \", d2);\\n              } else {\\n                dotProd +=\\n                    getX(batch, \" + inputDepthNearestVec4 + \", xR, xC) *\\n                    getW(wR, wC, \" + inputDepthNearestVec4 + \", d2);\\n              }\\n\\n            } else if (\" + (inputDepthVec4Remainder === 2) + \") {\\n              vec2 wValues = vec2(\\n                getW(wR, wC, \" + inputDepthNearestVec4 + \", d2),\\n                getW(wR, wC, \" + inputDepthNearestVec4 + \" + 1, d2)\\n              );\\n\\n              if (\" + isChannelsLast + \") {\\n                vec2 xValues = vec2(\\n                  getX(batch, xR, xC, \" + inputDepthNearestVec4 + \"),\\n                  getX(batch, xR, xC, \" + inputDepthNearestVec4 + \" + 1)\\n                );\\n                dotProd += dot(xValues, wValues);\\n              } else {\\n                vec2 xValues = vec2(\\n                  getX(batch, \" + inputDepthNearestVec4 + \", xR, xC),\\n                  getX(batch, \" + inputDepthNearestVec4 + \" + 1, xR, xC)\\n                );\\n                dotProd += dot(xValues, wValues);\\n              }\\n\\n            } else if (\" + (inputDepthVec4Remainder === 3) + \") {\\n              vec3 wValues = vec3(\\n                getW(wR, wC, \" + inputDepthNearestVec4 + \", d2),\\n                getW(wR, wC, \" + inputDepthNearestVec4 + \" + 1, d2),\\n                getW(wR, wC, \" + inputDepthNearestVec4 + \" + 2, d2)\\n              );\\n\\n              if (\" + isChannelsLast + \") {\\n                vec3 xValues = vec3(\\n                  getX(batch, xR, xC, \" + inputDepthNearestVec4 + \"),\\n                  getX(batch, xR, xC, \" + inputDepthNearestVec4 + \" + 1),\\n                  getX(batch, xR, xC, \" + inputDepthNearestVec4 + \" + 2)\\n                );\\n                dotProd += dot(xValues, wValues);\\n              } else {\\n                vec3 xValues = vec3(\\n                  getX(batch, \" + inputDepthNearestVec4 + \", xR, xC),\\n                  getX(batch, \" + inputDepthNearestVec4 + \" + 1, xR, xC),\\n                  getX(batch, \" + inputDepthNearestVec4 + \" + 2, xR, xC)\\n                );\\n                dotProd += dot(xValues, wValues);\\n              }\\n\\n            }\\n          }\\n        }\\n\\n        float result = dotProd;\\n        \" + addBiasSnippet + \"\\n        \" + applyActivationSnippet + \"\\n        setOutput(result);\\n      }\\n    \";\n\t};\n\tvar Conv3DProgram = function Conv3DProgram(convInfo) {\n\t  this.variableNames = ['x', 'W'];\n\t  this.outputShape = convInfo.outShape;\n\t  var padFront = convInfo.padInfo.front;\n\t  var padTop = convInfo.padInfo.top;\n\t  var padLeft = convInfo.padInfo.left;\n\t  var strideDepth = convInfo.strideDepth;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var dilationDepth = convInfo.dilationDepth;\n\t  var dilationHeight = convInfo.dilationHeight;\n\t  var dilationWidth = convInfo.dilationWidth;\n\t  var filterDepth = convInfo.filterDepth;\n\t  var filterHeight = convInfo.filterHeight;\n\t  var filterWidth = convInfo.filterWidth;\n\t  var inputDepthNearestVec4 = Math.floor(convInfo.inChannels / 4) * 4;\n\t  var inputDepthVec4Remainder = convInfo.inChannels % 4;\n\t  this.userCode = \"\\n      const ivec3 strides = ivec3(\" + strideDepth + \", \" + strideHeight + \", \" + strideWidth + \");\\n      const ivec3 pads = ivec3(\" + padFront + \", \" + padTop + \", \" + padLeft + \");\\n\\n      void main() {\\n        ivec5 coords = getOutputCoords();\\n        int batch = coords.x;\\n        int d2 = coords.u;\\n\\n        ivec3 xFRCCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\\n        int xFCorner = xFRCCorner.x;\\n        int xRCorner = xFRCCorner.y;\\n        int xCCorner = xFRCCorner.z;\\n\\n        // Convolve x(?, ?, ?, d1) with w(:, :, :, d1, d2) to get\\n        // y(yF, yR, yC, d2). ? = to be determined. : = across all\\n        // values in that axis.\\n        float dotProd = 0.0;\\n        for (int wF = 0; wF < \" + filterDepth + \"; wF++) {\\n          int xF = xFCorner + wF * \" + dilationDepth + \";\\n\\n          if (xF < 0 || xF >= \" + convInfo.inDepth + \") {\\n            continue;\\n          }\\n\\n          for (int wR = 0; wR < \" + filterHeight + \"; wR++) {\\n            int xR = xRCorner + wR * \" + dilationHeight + \";\\n\\n            if (xR < 0 || xR >= \" + convInfo.inHeight + \") {\\n              continue;\\n            }\\n\\n            for (int wC = 0; wC < \" + filterWidth + \"; wC++) {\\n              int xC = xCCorner + wC * \" + dilationWidth + \";\\n\\n              if (xC < 0 || xC >= \" + convInfo.inWidth + \") {\\n                continue;\\n              }\\n\\n              for (int d1 = 0; d1 < \" + inputDepthNearestVec4 + \"; d1 += 4) {\\n                vec4 xValues = vec4(\\n                  getX(batch, xF, xR, xC, d1),\\n                  getX(batch, xF, xR, xC, d1 + 1),\\n                  getX(batch, xF, xR, xC, d1 + 2),\\n                  getX(batch, xF, xR, xC, d1 + 3)\\n                );\\n                vec4 wValues = vec4(\\n                  getW(wF, wR, wC, d1, d2),\\n                  getW(wF, wR, wC, d1 + 1, d2),\\n                  getW(wF, wR, wC, d1 + 2, d2),\\n                  getW(wF, wR, wC, d1 + 3, d2)\\n                );\\n\\n                dotProd += dot(xValues, wValues);\\n              }\\n\\n              if (\" + (inputDepthVec4Remainder === 1) + \") {\\n                dotProd +=\\n                  getX(batch, xF, xR, xC, \" + inputDepthNearestVec4 + \") *\\n                  getW(wF, wR, wC, \" + inputDepthNearestVec4 + \", d2);\\n              } else if (\" + (inputDepthVec4Remainder === 2) + \") {\\n                vec2 xValues = vec2(\\n                  getX(batch, xF, xR, xC, \" + inputDepthNearestVec4 + \"),\\n                  getX(batch, xF, xR, xC, \" + inputDepthNearestVec4 + \" + 1)\\n                );\\n                vec2 wValues = vec2(\\n                  getW(wF, wR, wC, \" + inputDepthNearestVec4 + \", d2),\\n                  getW(wF, wR, wC, \" + inputDepthNearestVec4 + \" + 1, d2)\\n                );\\n                dotProd += dot(xValues, wValues);\\n              } else if (\" + (inputDepthVec4Remainder === 3) + \") {\\n                vec3 xValues = vec3(\\n                  getX(batch, xF, xR, xC, \" + inputDepthNearestVec4 + \"),\\n                  getX(batch, xF, xR, xC, \" + inputDepthNearestVec4 + \" + 1),\\n                  getX(batch, xF, xR, xC, \" + inputDepthNearestVec4 + \" + 2)\\n                );\\n                vec3 wValues = vec3(\\n                  getW(wF, wR, wC, \" + inputDepthNearestVec4 + \", d2),\\n                  getW(wF, wR, wC, \" + inputDepthNearestVec4 + \" + 1, d2),\\n                  getW(wF, wR, wC, \" + inputDepthNearestVec4 + \" + 2, d2)\\n                );\\n                dotProd += dot(xValues, wValues);\\n              }\\n            }\\n          }\\n        }\\n        setOutput(dotProd);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar Im2ColPackedProgram = function Im2ColPackedProgram(outputShape, inputShape, convInfo) {\n\t  this.variableNames = ['A'];\n\t  this.packedInputs = true;\n\t  this.packedOutput = true;\n\t  this.outputShape = outputShape;\n\t  var filterWidth = convInfo.filterWidth,\n\t      inChannels = convInfo.inChannels,\n\t      strideWidth = convInfo.strideWidth,\n\t      strideHeight = convInfo.strideHeight,\n\t      padInfo = convInfo.padInfo,\n\t      outWidth = convInfo.outWidth,\n\t      dilationWidth = convInfo.dilationWidth,\n\t      dilationHeight = convInfo.dilationHeight,\n\t      dataFormat = convInfo.dataFormat;\n\t  var left = padInfo.left,\n\t      top = padInfo.top;\n\t  var itemsPerBlockRow = inChannels * filterWidth;\n\t  var glsl = getGlslDifferences();\n\t  var isChannelsLast = dataFormat === 'channelsLast';\n\t  var rowDim = isChannelsLast ? 0 : 1;\n\t  var colDim = isChannelsLast ? 1 : 2;\n\t  var unrolled = \"\";\n\n\t  for (var row = 0; row <= 1; row++) {\n\t    for (var col = 0; col <= 1; col++) {\n\t      unrolled += \"\\n          blockIndex = rc.y + \" + col + \";\\n          pos = rc.x + \" + row + \";\\n\\n          if(blockIndex < \" + outputShape[1] + \" && pos < \" + outputShape[0] + \") {\\n            offsetY = int(blockIndex / (\" + outWidth + \")) * \" + strideHeight + \" - \" + top + \";\\n            d0 = offsetY + \" + dilationHeight + \" * (pos / \" + itemsPerBlockRow + \");\\n\\n            if(d0 < \" + inputShape[rowDim] + \" && d0 >= 0) {\\n\\n              offsetX = int(mod(float(blockIndex), \" + outWidth + \".) * \" + strideWidth + \". - \" + left + \".);\\n              d1 = offsetX + \" + dilationWidth + \" * (int(mod(float(pos), \" + itemsPerBlockRow + \".) / \" + inChannels + \".));\\n\\n              if(d1 < \" + inputShape[colDim] + \" && d1 >= 0) {\\n\\n                ch = int(mod(float(pos), \" + inChannels + \".));\\n\\n                if (\" + isChannelsLast + \") {\\n                  innerDims = vec2(d1, ch);\\n                  result[\" + (row * 2 + col) + \"] = getChannel(\\n                    getA(d0, int(innerDims.x),\\n                    int(innerDims.y)), innerDims);\\n                } else {\\n                  innerDims = vec2(d0, d1);\\n                  result[\" + (row * 2 + col) + \"] = getChannel(\\n                    getA(ch, int(innerDims.x),\\n                    int(innerDims.y)), innerDims);\\n                }\\n              }\\n            }\\n          }\\n        \";\n\t    }\n\t  }\n\n\t  this.userCode = \"\\n      void main() {\\n        ivec2 rc = getOutputCoords();\\n\\n        vec4 result = vec4(0);\\n\\n        int blockIndex, pos, offsetY, d0, offsetX, d1, ch;\\n        vec2 innerDims;\\n\\n        \" + unrolled + \"\\n\\n        \" + glsl.output + \" = result;\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t// can be expressed as matrix multiplication (without need for memory\n\t// remapping).\n\n\tfunction conv2dByMatMul(_ref) {\n\t  var x = _ref.x,\n\t      filter = _ref.filter,\n\t      convInfo = _ref.convInfo,\n\t      backend = _ref.backend,\n\t      _ref$bias = _ref.bias,\n\t      bias = _ref$bias === void 0 ? null : _ref$bias,\n\t      _ref$preluActivationW = _ref.preluActivationWeights,\n\t      preluActivationWeights = _ref$preluActivationW === void 0 ? null : _ref$preluActivationW,\n\t      _ref$leakyreluAlpha = _ref.leakyreluAlpha,\n\t      leakyreluAlpha = _ref$leakyreluAlpha === void 0 ? 0 : _ref$leakyreluAlpha,\n\t      _ref$activation = _ref.activation,\n\t      activation = _ref$activation === void 0 ? null : _ref$activation;\n\t  // Reshapes conv2D input to 2D tensors, uses matMul and then reshape the\n\t  // result from 2D to 4D.\n\t  var xShape = x.shape;\n\t  var xTexData = backend.texData.get(x.dataId);\n\t  var sharedMatMulDim = convInfo.inChannels;\n\t  var outerShapeX = xShape[0] * xShape[1] * xShape[2];\n\t  var outerShapeFilter = convInfo.outChannels;\n\t  var isChannelsLast = convInfo.dataFormat === 'channelsLast';\n\t  var transposeA = false;\n\t  var transposeB = false;\n\t  var out;\n\t  var intermediates = []; // TODO: Once reduction ops are packed, batchMatMul will always be packed\n\t  // and we can remove this condition.\n\n\t  var batchMatMulWillBeUnpacked = (outerShapeX === 1 || outerShapeFilter === 1) && sharedMatMulDim > MATMUL_SHARED_DIM_THRESHOLD;\n\t  var reshapeWillBeExpensive = xShape[2] % 2 !== 0 && !!xTexData.isPacked;\n\n\t  if (batchMatMulWillBeUnpacked || !env().getBool('WEBGL_LAZILY_UNPACK') || !env().getBool('WEBGL_PACK_BINARY_OPERATIONS') || !reshapeWillBeExpensive) {\n\t    var targetShape = isChannelsLast ? xShape[0] * xShape[1] * xShape[2] : xShape[0] * xShape[2] * xShape[3];\n\t    var xReshaped = reshape$3({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: [1, targetShape, convInfo.inChannels]\n\t      }\n\t    });\n\t    var filterReshaped = reshape$3({\n\t      inputs: {\n\t        x: filter\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: [1, convInfo.inChannels, convInfo.outChannels]\n\t      }\n\t    });\n\t    var result = batchMatMulImpl({\n\t      a: xReshaped,\n\t      b: filterReshaped,\n\t      transposeA: transposeA,\n\t      transposeB: transposeB,\n\t      backend: backend,\n\t      bias: bias,\n\t      activation: activation,\n\t      preluActivationWeights: preluActivationWeights,\n\t      leakyreluAlpha: leakyreluAlpha\n\t    });\n\t    out = reshape$3({\n\t      inputs: {\n\t        x: result\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: convInfo.outShape\n\t      }\n\t    });\n\t    intermediates.push(xReshaped);\n\t    intermediates.push(filterReshaped);\n\t    intermediates.push(result);\n\t  } else {\n\t    // Following optimization is specific to packed |x| with odd row count\n\t    // (For example, in channelLast mode, 'row count' refers to x.shape[2]):\n\t    // we avoid expensive packed 2x2 reshape by padding row count to next,\n\t    // even number. When x.shape[2] is odd, the result of packed batchMatMul is\n\t    // the same (has the same texture layout and and values in the texture) as\n\t    // it is for even x.shape[2] + 1. We make the odd-rows tensor to look like\n\t    // even-rows tensor before the operation and, after the batchMatMul,\n\t    // fix the even-rows result to have odd number of rows.\n\t    var _targetShape = isChannelsLast ? xShape[0] * xShape[1] * (xShape[2] + 1) : xShape[0] * xShape[2] * (xShape[3] + 1);\n\n\t    var _xReshaped = {\n\t      dataId: x.dataId,\n\t      shape: [1, _targetShape, convInfo.inChannels],\n\t      dtype: x.dtype\n\t    }; // xTexData.shape gets referenced from GPGPUBinary.inShapeInfos.\n\t    // Decrementing row count, after batchMatMul->...->compileProgram leads to\n\t    // invalid row count within the reference in GPGPUBinary.inShapeInfos.\n\t    // Alternative fix would be to provide a copy to GPGPUBinary.inShapeInfos\n\t    // in compileProgram method, but that would affect compilation of all\n\t    // programs - instead, provide a copy here, with even row count, before\n\t    // calling batchMatMul->...->compileProgram and after that, the original\n\t    // xTexData.shape is restored.\n\n\t    var originalXTexDataShape = xTexData.shape;\n\t    xTexData.shape = xTexData.shape.slice();\n\t    xTexData.shape[xTexData.shape.length - 2]++;\n\t    assert(isReshapeFree(xTexData.shape, _xReshaped.shape), function () {\n\t      return \"packed reshape \" + xTexData.shape + \" to \" + _xReshaped.shape + \" isn't free\";\n\t    });\n\n\t    var _filterReshaped = reshape$3({\n\t      inputs: {\n\t        x: filter\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: [1, convInfo.inChannels, convInfo.outChannels]\n\t      }\n\t    });\n\n\t    intermediates.push(_filterReshaped);\n\t    var pointwiseConv = batchMatMulImpl({\n\t      a: _xReshaped,\n\t      b: _filterReshaped,\n\t      backend: backend,\n\t      transposeA: transposeA,\n\t      transposeB: transposeB,\n\t      bias: bias,\n\t      activation: activation,\n\t      preluActivationWeights: preluActivationWeights,\n\t      leakyreluAlpha: leakyreluAlpha\n\t    });\n\t    var pointwiseConvTexData = backend.texData.get(pointwiseConv.dataId);\n\t    assert(pointwiseConvTexData.isPacked, function () {\n\t      return 'batchMatMul result is expected to be packed';\n\t    }); // Restore the input shape to original.\n\n\t    xTexData.shape = originalXTexDataShape; // Set the output shape - there is no need for expensive reshape as data\n\t    // layout is already correct.\n\n\t    pointwiseConvTexData.shape = convInfo.outShape;\n\t    out = identity$2({\n\t      inputs: {\n\t        x: pointwiseConv\n\t      },\n\t      backend: backend\n\t    });\n\t    out.shape = convInfo.outShape;\n\t    intermediates.push(pointwiseConv);\n\t  }\n\n\t  for (var _i = 0, _intermediates = intermediates; _i < _intermediates.length; _i++) {\n\t    var i = _intermediates[_i];\n\t    backend.disposeIntermediateTensorInfo(i);\n\t  }\n\n\t  return out;\n\t} // Implements the im2row algorithm as outlined in \"High Performance\n\t// Convolutional Neural Networks for Document Processing\" (Suvisoft, 2006)\n\n\tfunction conv2dWithIm2Row(_ref2) {\n\t  var x = _ref2.x,\n\t      filter = _ref2.filter,\n\t      convInfo = _ref2.convInfo,\n\t      backend = _ref2.backend,\n\t      _ref2$bias = _ref2.bias,\n\t      bias = _ref2$bias === void 0 ? null : _ref2$bias,\n\t      _ref2$preluActivation = _ref2.preluActivationWeights,\n\t      preluActivationWeights = _ref2$preluActivation === void 0 ? null : _ref2$preluActivation,\n\t      _ref2$leakyreluAlpha = _ref2.leakyreluAlpha,\n\t      leakyreluAlpha = _ref2$leakyreluAlpha === void 0 ? 0 : _ref2$leakyreluAlpha,\n\t      _ref2$activation = _ref2.activation,\n\t      activation = _ref2$activation === void 0 ? null : _ref2$activation;\n\t  // Rearranges conv2d input so each block to be convolved over forms the\n\t  // column of a new matrix with shape [filterWidth * filterHeight *\n\t  // inChannels, outHeight * outWidth]. The filter is also rearranged so each\n\t  // output channel forms a row of a new matrix with shape [outChannels,\n\t  // filterWidth * filterHeight * inChannels]. The convolution is then\n\t  // computed by multiplying these matrices and reshaping the result.\n\t  var filterWidth = convInfo.filterWidth,\n\t      filterHeight = convInfo.filterHeight,\n\t      inChannels = convInfo.inChannels,\n\t      outWidth = convInfo.outWidth,\n\t      outHeight = convInfo.outHeight,\n\t      dataFormat = convInfo.dataFormat;\n\t  var isChannelsLast = dataFormat === 'channelsLast';\n\t  var sharedDim = filterWidth * filterHeight * inChannels;\n\t  var numCols = outHeight * outWidth;\n\t  var x2ColShape = [sharedDim, numCols];\n\t  var transposeA = true;\n\t  var transposeB = false;\n\t  var intermediates = [];\n\t  var xSqueezed = reshape$3({\n\t    inputs: {\n\t      x: x\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: x.shape.slice(1)\n\t    }\n\t  });\n\t  var w2Row = reshape$3({\n\t    inputs: {\n\t      x: filter\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: [1, sharedDim, sizeFromShape(filter.shape) / sharedDim]\n\t    }\n\t  });\n\t  intermediates.push(xSqueezed);\n\t  intermediates.push(w2Row);\n\t  var im2ColProgram = new Im2ColPackedProgram(x2ColShape, xSqueezed.shape, convInfo);\n\t  var im2Col = backend.runWebGLProgram(im2ColProgram, [xSqueezed], 'float32');\n\t  var im2ColReshaped = reshape$3({\n\t    inputs: {\n\t      x: im2Col\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: [1, x2ColShape[0], x2ColShape[1]]\n\t    }\n\t  });\n\t  intermediates.push(im2Col);\n\t  intermediates.push(im2ColReshaped);\n\t  var hasBias = bias != null;\n\t  var hasPreluActivationWeights = preluActivationWeights != null;\n\t  var hasLeakyreluAlpha = activation === 'leakyrelu';\n\t  var fusedActivation = activation ? mapActivationToShaderProgram(activation, true) : null;\n\t  var matmulProgram = new MatMulPackedProgram(im2ColReshaped.shape, w2Row.shape, [1, numCols, convInfo.outChannels], transposeA, transposeB, hasBias, fusedActivation, hasPreluActivationWeights, hasLeakyreluAlpha);\n\t  var inputs = [im2ColReshaped, w2Row];\n\n\t  if (bias) {\n\t    inputs.push(bias);\n\t  }\n\n\t  if (hasPreluActivationWeights) {\n\t    inputs.push(preluActivationWeights);\n\t  }\n\n\t  if (hasLeakyreluAlpha) {\n\t    var $leakyreluAlpha = backend.makeTensorInfo([], 'float32', createScalarValue(leakyreluAlpha, 'float32'));\n\t    inputs.push($leakyreluAlpha);\n\t    intermediates.push($leakyreluAlpha);\n\t  }\n\n\t  var product = backend.runWebGLProgram(matmulProgram, inputs, 'float32');\n\t  var outShape = isChannelsLast ? [1, outHeight, outWidth, convInfo.outChannels] : [1, convInfo.outChannels, outHeight, outWidth];\n\t  var out = reshape$3({\n\t    inputs: {\n\t      x: product\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: outShape\n\t    }\n\t  });\n\t  intermediates.push(product);\n\n\t  for (var _i2 = 0, _intermediates2 = intermediates; _i2 < _intermediates2.length; _i2++) {\n\t    var i = _intermediates2[_i2];\n\t    backend.disposeIntermediateTensorInfo(i);\n\t  }\n\n\t  return out;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction conv2d$4(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      filter = inputs.filter;\n\t  var strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dataFormat = attrs.dataFormat,\n\t      dilations = attrs.dilations,\n\t      dimRoundingMode = attrs.dimRoundingMode;\n\t  var $dataFormat = convertConv2DDataFormat(dataFormat);\n\t  var convInfo = computeConv2DInfo(x.shape, filter.shape, strides, dilations, pad, dimRoundingMode, false\n\t  /* depthwise */\n\t  , $dataFormat);\n\t  var out;\n\n\t  if (convInfo.filterHeight === 1 && convInfo.filterWidth === 1 && convInfo.dilationHeight === 1 && convInfo.dilationWidth === 1 && convInfo.strideHeight === 1 && convInfo.strideWidth === 1 && (convInfo.padInfo.type === 'SAME' || convInfo.padInfo.type === 'VALID')) {\n\t    out = conv2dByMatMul({\n\t      x: x,\n\t      filter: filter,\n\t      convInfo: convInfo,\n\t      backend: backend\n\t    });\n\t  } else if (env().getBool('WEBGL_CONV_IM2COL') && x.shape[0] === 1) {\n\t    out = conv2dWithIm2Row({\n\t      x: x,\n\t      filter: filter,\n\t      convInfo: convInfo,\n\t      backend: backend\n\t    });\n\t  } else {\n\t    var program = new Conv2DProgram(convInfo);\n\t    out = backend.runWebGLProgram(program, [x, filter], 'float32');\n\t  }\n\n\t  var outReshaped = reshape$3({\n\t    inputs: {\n\t      x: out\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: convInfo.outShape\n\t    }\n\t  });\n\t  backend.disposeIntermediateTensorInfo(out);\n\t  return outReshaped;\n\t}\n\tvar conv2DConfig$1 = {\n\t  kernelName: Conv2D,\n\t  backendName: 'webgl',\n\t  kernelFunc: conv2d$4\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar Conv2DDerFilterProgram = function Conv2DDerFilterProgram(convInfo) {\n\t  this.variableNames = ['x', 'dy'];\n\t  this.outputShape = convInfo.filterShape;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var padTop = convInfo.padInfo.top;\n\t  var padLeft = convInfo.padInfo.left;\n\t  var isChannelsLast = convInfo.dataFormat === 'channelsLast';\n\t  this.userCode = \"\\n      void main() {\\n        ivec4 coords = getOutputCoords();\\n        int wR = coords.x;\\n        int wC = coords.y;\\n        int d1 = coords.z;\\n        int d2 = coords.w;\\n\\n        // Convolve x(?, ?, d1) with dy(:, :, d2) to get dw(wR, wC, d1, d2).\\n        // ? = to be determined. : = across all values in that axis.\\n        float dotProd = 0.0;\\n\\n        for (int b = 0; b < \" + convInfo.batchSize + \"; b++) {\\n          for (int yR = 0; yR < \" + convInfo.outHeight + \"; yR++) {\\n            int xR = wR + yR * \" + strideHeight + \" - \" + padTop + \";\\n\\n            if (xR < 0 || xR >= \" + convInfo.inHeight + \") {\\n              continue;\\n            }\\n\\n            for (int yC = 0; yC < \" + convInfo.outWidth + \"; yC++) {\\n              int xC = wC + yC * \" + strideWidth + \" - \" + padLeft + \";\\n\\n              if (xC < 0 || xC >= \" + convInfo.inWidth + \") {\\n                continue;\\n              }\\n\\n              if (\" + isChannelsLast + \") {\\n                float dyValue = getDy(b, yR, yC, d2);\\n                float xValue = getX(b, xR, xC, d1);\\n                dotProd += (xValue * dyValue);\\n              } else {\\n                float dyValue = getDy(b, d2, yR, yC);\\n                float xValue = getX(b, d1, xR, xC);\\n                dotProd += (xValue * dyValue);\\n              }\\n\\n            }\\n          }\\n        }\\n        setOutput(dotProd);\\n      }\\n    \";\n\t};\n\tvar Conv2DDerInputProgram = function Conv2DDerInputProgram(convInfo) {\n\t  this.variableNames = ['dy', 'W'];\n\t  this.outputShape = convInfo.inShape;\n\t  var filterHeight = convInfo.filterHeight;\n\t  var filterWidth = convInfo.filterWidth;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var isChannelsLast = convInfo.dataFormat === 'channelsLast';\n\t  var padTop = filterHeight - 1 - convInfo.padInfo.top;\n\t  var padLeft = filterWidth - 1 - convInfo.padInfo.left;\n\t  var rowDim = isChannelsLast ? 1 : 2;\n\t  var colDim = isChannelsLast ? 2 : 3;\n\t  var channelDim = isChannelsLast ? 3 : 1;\n\t  this.userCode = \"\\n      const ivec2 pads = ivec2(\" + padTop + \", \" + padLeft + \");\\n\\n      void main() {\\n        ivec4 coords = getOutputCoords();\\n        int batch = coords[0];\\n        int d1 = coords[\" + channelDim + \"];\\n\\n        ivec2 dyCorner = ivec2(coords[\" + rowDim + \"], coords[\" + colDim + \"]) - pads;\\n        int dyRCorner = dyCorner.x;\\n        int dyCCorner = dyCorner.y;\\n\\n        // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\\n        // ? = to be determined. : = across all values in that axis.\\n        float dotProd = 0.0;\\n        for (int wR = 0; wR < \" + filterHeight + \"; wR++) {\\n          float dyR = float(dyRCorner + wR) / \" + strideHeight + \".0;\\n\\n          if (dyR < 0.0 || dyR >= \" + convInfo.outHeight + \".0 || fract(dyR) > 0.0) {\\n            continue;\\n          }\\n          int idyR = int(dyR);\\n\\n          int wRPerm = \" + filterHeight + \" - 1 - wR;\\n\\n          for (int wC = 0; wC < \" + filterWidth + \"; wC++) {\\n            float dyC = float(dyCCorner + wC) / \" + strideWidth + \".0;\\n\\n            if (dyC < 0.0 || dyC >= \" + convInfo.outWidth + \".0 ||\\n                fract(dyC) > 0.0) {\\n              continue;\\n            }\\n            int idyC = int(dyC);\\n\\n            int wCPerm = \" + filterWidth + \" - 1 - wC;\\n\\n            for (int d2 = 0; d2 < \" + convInfo.outChannels + \"; d2++) {\\n\\n              if (\" + isChannelsLast + \") {\\n                float xValue = getDy(batch, idyR, idyC, d2);\\n                float wValue = getW(wRPerm, wCPerm, d1, d2);\\n                dotProd += xValue * wValue;\\n              } else {\\n                float xValue = getDy(batch, d2, idyR, idyC);\\n                float wValue = getW(wRPerm, wCPerm, d1, d2);\\n                dotProd += xValue * wValue;\\n              }\\n\\n            }\\n          }\\n        }\\n        setOutput(dotProd);\\n      }\\n    \";\n\t};\n\tvar Conv3DDerFilterProgram = function Conv3DDerFilterProgram(convInfo) {\n\t  this.variableNames = ['x', 'dy'];\n\t  this.outputShape = convInfo.filterShape;\n\t  var strideDepth = convInfo.strideDepth;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var padFront = convInfo.padInfo.front;\n\t  var padTop = convInfo.padInfo.top;\n\t  var padLeft = convInfo.padInfo.left;\n\t  this.userCode = \"\\n      void main() {\\n        ivec5 coords = getOutputCoords();\\n        int wF = coords.x;\\n        int wR = coords.y;\\n        int wC = coords.z;\\n        int d1 = coords.w;\\n        int d2 = coords.u;\\n\\n        float dotProd = 0.0;\\n\\n        for (int b = 0; b < \" + convInfo.batchSize + \"; b++) {\\n          for (int yF = 0; yF < \" + convInfo.outDepth + \"; yF++) {\\n            int xF = wF + yF * \" + strideDepth + \" - \" + padFront + \";\\n\\n            if (xF < 0 || xF >= \" + convInfo.inDepth + \") {\\n              continue;\\n            }\\n\\n            for (int yR = 0; yR < \" + convInfo.outHeight + \"; yR++) {\\n              int xR = wR + yR * \" + strideHeight + \" - \" + padTop + \";\\n\\n              if (xR < 0 || xR >= \" + convInfo.inHeight + \") {\\n                continue;\\n              }\\n\\n              for (int yC = 0; yC < \" + convInfo.outWidth + \"; yC++) {\\n                int xC = wC + yC * \" + strideWidth + \" - \" + padLeft + \";\\n\\n                if (xC < 0 || xC >= \" + convInfo.inWidth + \") {\\n                  continue;\\n                }\\n\\n                float dyValue = getDy(b, yF, yR, yC, d2);\\n                float xValue = getX(b, xF, xR, xC, d1);\\n                dotProd += (xValue * dyValue);\\n              }\\n            }\\n          }\\n        }\\n        setOutput(dotProd);\\n      }\\n    \";\n\t};\n\tvar Conv3DDerInputProgram = function Conv3DDerInputProgram(convInfo) {\n\t  this.variableNames = ['dy', 'W'];\n\t  this.outputShape = convInfo.inShape;\n\t  var filterDepth = convInfo.filterDepth;\n\t  var filterHeight = convInfo.filterHeight;\n\t  var filterWidth = convInfo.filterWidth;\n\t  var strideDepth = convInfo.strideDepth;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var padFront = filterDepth - 1 - convInfo.padInfo.front;\n\t  var padTop = filterHeight - 1 - convInfo.padInfo.top;\n\t  var padLeft = filterWidth - 1 - convInfo.padInfo.left;\n\t  this.userCode = \"\\n      const ivec3 pads = ivec3(\" + padFront + \", \" + padTop + \", \" + padLeft + \");\\n\\n      void main() {\\n        ivec5 coords = getOutputCoords();\\n        int batch = coords.x;\\n        int d1 = coords.u;\\n\\n\\n        ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\\n        int dyFCorner = dyCorner.x;\\n        int dyRCorner = dyCorner.y;\\n        int dyCCorner = dyCorner.z;\\n\\n        float dotProd = 0.0;\\n        for (int wF = 0; wF < \" + filterDepth + \"; wF++) {\\n          float dyF = float(dyFCorner + wF) / \" + strideDepth + \".0;\\n\\n          if (dyF < 0.0 || dyF >= \" + convInfo.outDepth + \".0 || fract(dyF) > 0.0) {\\n            continue;\\n          }\\n          int idyF = int(dyF);\\n\\n          int wFPerm = \" + filterDepth + \" - 1 - wF;\\n\\n          for (int wR = 0; wR < \" + filterHeight + \"; wR++) {\\n            float dyR = float(dyRCorner + wR) / \" + strideHeight + \".0;\\n\\n            if (dyR < 0.0 || dyR >= \" + convInfo.outHeight + \".0 ||\\n              fract(dyR) > 0.0) {\\n              continue;\\n            }\\n            int idyR = int(dyR);\\n\\n            int wRPerm = \" + filterHeight + \" - 1 - wR;\\n\\n            for (int wC = 0; wC < \" + filterWidth + \"; wC++) {\\n              float dyC = float(dyCCorner + wC) / \" + strideWidth + \".0;\\n\\n              if (dyC < 0.0 || dyC >= \" + convInfo.outWidth + \".0 ||\\n                  fract(dyC) > 0.0) {\\n                continue;\\n              }\\n              int idyC = int(dyC);\\n\\n              int wCPerm = \" + filterWidth + \" - 1 - wC;\\n\\n              for (int d2 = 0; d2 < \" + convInfo.outChannels + \"; d2++) {\\n                float xValue = getDy(batch, idyF, idyR, idyC, d2);\\n                float wValue = getW(wFPerm, wRPerm, wCPerm, d1, d2);\\n                dotProd += xValue * wValue;\\n              }\\n            }\\n          }\\n        }\\n        setOutput(dotProd);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction conv2DBackpropFilter$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      dy = inputs.dy;\n\t  var strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dataFormat = attrs.dataFormat,\n\t      dimRoundingMode = attrs.dimRoundingMode,\n\t      filterShape = attrs.filterShape;\n\t  var $dataFormat = convertConv2DDataFormat(dataFormat);\n\t  var convInfo = computeConv2DInfo(x.shape, filterShape, strides, 1\n\t  /* dilations */\n\t  , pad, dimRoundingMode, false\n\t  /* depthwise */\n\t  , $dataFormat);\n\t  var program = new Conv2DDerFilterProgram(convInfo);\n\t  return backend.runWebGLProgram(program, [x, dy], 'float32');\n\t}\n\tvar conv2DBackpropFilterConfig$1 = {\n\t  kernelName: Conv2DBackpropFilter,\n\t  backendName: 'webgl',\n\t  kernelFunc: conv2DBackpropFilter$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction conv2DBackpropInput$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var dy = inputs.dy,\n\t      filter = inputs.filter;\n\t  var inputShape = attrs.inputShape,\n\t      strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dataFormat = attrs.dataFormat,\n\t      dimRoundingMode = attrs.dimRoundingMode;\n\t  var $dataFormat = convertConv2DDataFormat(dataFormat);\n\t  var convInfo = computeConv2DInfo(inputShape, filter.shape, strides, 1\n\t  /* dilations */\n\t  , pad, dimRoundingMode, false, $dataFormat);\n\t  var program = new Conv2DDerInputProgram(convInfo);\n\t  return backend.runWebGLProgram(program, [dy, filter], 'float32');\n\t}\n\tvar conv2DBackpropInputConfig$1 = {\n\t  kernelName: Conv2DBackpropInput,\n\t  backendName: 'webgl',\n\t  kernelFunc: conv2DBackpropInput$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction conv3D$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      filter = inputs.filter;\n\t  var strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dilations = attrs.dilations;\n\t  var convInfo = computeConv3DInfo(x.shape, filter.shape, strides, dilations, pad);\n\t  var program = new Conv3DProgram(convInfo);\n\t  return backend.runWebGLProgram(program, [x, filter], 'float32');\n\t}\n\tvar conv3DConfig$1 = {\n\t  kernelName: Conv3D,\n\t  backendName: 'webgl',\n\t  kernelFunc: conv3D$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction conv3DBackpropFilterV2$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      dy = inputs.dy;\n\t  var strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      filterShape = attrs.filterShape;\n\t  var convInfo = computeConv3DInfo(x.shape, filterShape, strides, 1\n\t  /* dilations */\n\t  , pad);\n\t  var program = new Conv3DDerFilterProgram(convInfo);\n\t  return backend.runWebGLProgram(program, [x, dy], 'float32');\n\t}\n\tvar conv3DBackpropFilterV2Config$1 = {\n\t  kernelName: Conv3DBackpropFilterV2,\n\t  backendName: 'webgl',\n\t  kernelFunc: conv3DBackpropFilterV2$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction conv3DBackpropInput$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var dy = inputs.dy,\n\t      filter = inputs.filter;\n\t  var pad = attrs.pad,\n\t      strides = attrs.strides,\n\t      inputShape = attrs.inputShape;\n\t  var convInfo = computeConv3DInfo(inputShape, filter.shape, strides, 1\n\t  /* dilations */\n\t  , pad);\n\t  var program = new Conv3DDerInputProgram(convInfo);\n\t  return backend.runWebGLProgram(program, [dy, filter], 'float32');\n\t}\n\tvar conv3DBackpropInputConfig = {\n\t  kernelName: Conv3DBackpropInputV2,\n\t  backendName: 'webgl',\n\t  kernelFunc: conv3DBackpropInput$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar COS = CHECK_NAN_SNIPPET_UNARY + \"\\n  return cos(x);\\n\";\n\tvar cos$2 = unaryKernelFunc$1({\n\t  opSnippet: COS\n\t});\n\tvar cosConfig$1 = {\n\t  kernelName: Cos,\n\t  backendName: 'webgl',\n\t  kernelFunc: cos$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar COSH = \"\\n  float e2x = exp(-x);\\n  return (e2x + 1.0 / e2x) / 2.0;\\n\";\n\tvar cosh$2 = unaryKernelFunc$1({\n\t  opSnippet: COSH\n\t});\n\tvar coshConfig$1 = {\n\t  kernelName: Cosh,\n\t  backendName: 'webgl',\n\t  kernelFunc: cosh$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar CropAndResizeProgram = function CropAndResizeProgram(imageShape, boxShape, cropSize, method, extrapolationValue) {\n\t  this.variableNames = ['Image', 'Boxes', 'BoxInd'];\n\t  this.outputShape = [];\n\t  var batch = imageShape[0],\n\t      imageHeight = imageShape[1],\n\t      imageWidth = imageShape[2],\n\t      depth = imageShape[3];\n\t  var numBoxes = boxShape[0];\n\t  var cropHeight = cropSize[0],\n\t      cropWidth = cropSize[1];\n\t  this.outputShape = [numBoxes, cropHeight, cropWidth, depth];\n\t  var methodId = method === 'bilinear' ? 1 : 0;\n\t  var inputHeightFloat = imageHeight - 1 + \".0\",\n\t      inputWidthFloat = imageWidth - 1 + \".0\";\n\n\t  var _ref = cropHeight > 1 ? [\"\" + (imageHeight - 1) / (cropHeight - 1), '(y2-y1) * height_ratio', \"y1*\" + inputHeightFloat + \" + float(y)*(height_scale)\"] : ['0.0', '0.0', \"0.5 * (y1+y2) * \" + inputHeightFloat],\n\t      heightRatio = _ref[0],\n\t      heightScale = _ref[1],\n\t      inY = _ref[2];\n\n\t  var _ref2 = cropWidth > 1 ? [\"\" + (imageWidth - 1) / (cropWidth - 1), '(x2-x1) * width_ratio', \"x1*\" + inputWidthFloat + \" + float(x)*(width_scale)\"] : ['0.0', '0.0', \"0.5 * (x1+x2) * \" + inputWidthFloat],\n\t      widthRatio = _ref2[0],\n\t      widthScale = _ref2[1],\n\t      inX = _ref2[2]; // Reference implementation\n\t  // tslint:disable-next-line:max-line-length\n\t  // https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/crop_and_resize_op_gpu.cu.cc\n\n\n\t  this.userCode = \"\\n      const float height_ratio = float(\" + heightRatio + \");\\n      const float width_ratio = float(\" + widthRatio + \");\\n      void main() {\\n        ivec4 coords = getOutputCoords();\\n        int b = coords[0];\\n        int y = coords[1];\\n        int x = coords[2];\\n        int d = coords[3];\\n\\n        // get box vals\\n        float y1 = getBoxes(b,0);\\n        float x1 = getBoxes(b,1);\\n        float y2 = getBoxes(b,2);\\n        float x2 = getBoxes(b,3);\\n\\n        // get image in batch index\\n        int bInd = round(getBoxInd(b));\\n        if(bInd < 0 || bInd >= \" + batch + \") {\\n          return;\\n        }\\n\\n        float height_scale = \" + heightScale + \";\\n        float width_scale = \" + widthScale + \";\\n\\n        float in_y = \" + inY + \";\\n        if( in_y < 0.0 || in_y > \" + inputHeightFloat + \" ) {\\n          setOutput(float(\" + extrapolationValue + \"));\\n          return;\\n        }\\n        float in_x = \" + inX + \";\\n        if( in_x < 0.0 || in_x > \" + inputWidthFloat + \" ) {\\n          setOutput(float(\" + extrapolationValue + \"));\\n          return;\\n        }\\n\\n        vec2 sourceFracIndexCR = vec2(in_x,in_y);\\n        if(\" + methodId + \" == 1) {\\n          // Compute the four integer indices.\\n          ivec2 sourceFloorCR = ivec2(sourceFracIndexCR);\\n          ivec2 sourceCeilCR = ivec2(ceil(sourceFracIndexCR));\\n\\n          float topLeft = getImage(b, sourceFloorCR.y, sourceFloorCR.x, d);\\n          float bottomLeft = getImage(b, sourceCeilCR.y, sourceFloorCR.x, d);\\n          float topRight = getImage(b, sourceFloorCR.y, sourceCeilCR.x, d);\\n          float bottomRight = getImage(b, sourceCeilCR.y, sourceCeilCR.x, d);\\n\\n          vec2 fracCR = sourceFracIndexCR - vec2(sourceFloorCR);\\n\\n          float top = topLeft + (topRight - topLeft) * fracCR.x;\\n          float bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x;\\n          float newValue = top + (bottom - top) * fracCR.y;\\n          setOutput(newValue);\\n        } else {\\n          // Compute the coordinators of nearest neighbor point.\\n          ivec2 sourceNearestCR = ivec2(floor(\\n            sourceFracIndexCR + vec2(0.5,0.5)));\\n          float newValue = getImage(b, sourceNearestCR.y, sourceNearestCR.x, d);\\n          setOutput(newValue);\\n        }\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar cropAndResize$2 = function cropAndResize(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var image = inputs.image,\n\t      boxes = inputs.boxes,\n\t      boxInd = inputs.boxInd;\n\t  var cropSize = attrs.cropSize,\n\t      method = attrs.method,\n\t      extrapolationValue = attrs.extrapolationValue;\n\t  var program = new CropAndResizeProgram(image.shape, boxes.shape, cropSize, method, extrapolationValue);\n\t  return backend.runWebGLProgram(program, [image, boxes, boxInd], 'float32');\n\t};\n\tvar cropAndResizeConfig$1 = {\n\t  kernelName: CropAndResize,\n\t  backendName: 'webgl',\n\t  kernelFunc: cropAndResize$2\n\t};\n\n\tvar CumSumProgram = /*#__PURE__*/function () {\n\t  function CumSumProgram(shape, exclusive, reverse) {\n\t    this.variableNames = ['x'];\n\t    this.outputShape = shape;\n\t    var rank = shape.length;\n\t    var val = exclusive ? '0.0' : \"getX(\" + getCoords$1(rank, 'coords') + \")\";\n\t    var length = shape[shape.length - 1];\n\t    var condition = '';\n\t    var idxString = ''; // When exclusive is set, the cumsum op becomes roll op that copies the\n\t    // value from the previous index based on the direction specified by the\n\t    // reverse flag.\n\n\t    if (exclusive) {\n\t      condition = reverse ? \"end != \" + (length - 1) : 'end != 0';\n\t      idxString = reverse ? 'end + 1' : 'end - 1';\n\t    } else {\n\t      condition = reverse ? \"end + pow2 < \" + length : 'end >= pow2';\n\t      idxString = reverse ? 'end + pow2' : 'end - pow2';\n\t    }\n\n\t    this.userCode = \"\\n      uniform float index;\\n      void main() {\\n        \" + getCoordsDataType(rank) + \" coords = getOutputCoords();\\n        int end = \" + getFinalCoord(rank, 'coords') + \";\\n        float val = \" + val + \";\\n        int pow2 = int(pow(2.0, index));\\n        if (\" + condition + \") {\\n          int idx = \" + idxString + \";\\n          \" + getFinalCoord(rank, 'coords') + \" = idx;\\n          val += getX(\" + getCoords$1(rank, 'coords') + \");\\n        }\\n        setOutput(val);\\n      }\\n    \";\n\t  }\n\n\t  var _proto = CumSumProgram.prototype;\n\n\t  _proto.getCustomSetupFunc = function getCustomSetupFunc(index) {\n\t    var _this = this;\n\n\t    return function (gpgpu, webGLProgram) {\n\t      if (_this.index == null) {\n\t        _this.index = gpgpu.getUniformLocation(webGLProgram, 'index');\n\t      }\n\n\t      gpgpu.gl.uniform1f(_this.index, index);\n\t    };\n\t  };\n\n\t  return CumSumProgram;\n\t}();\n\n\tfunction getCoords$1(rank, name) {\n\t  if (rank === 1) {\n\t    return \"\" + name;\n\t  } else if (rank === 2) {\n\t    return name + \".x, \" + name + \".y\";\n\t  } else if (rank === 3) {\n\t    return name + \".x, \" + name + \".y, \" + name + \".z\";\n\t  } else if (rank === 4) {\n\t    return name + \".x, \" + name + \".y, \" + name + \".z, \" + name + \".w\";\n\t  } else {\n\t    throw Error(\"Cumulative sum for rank \" + rank + \" is not yet supported\");\n\t  }\n\t}\n\n\tfunction getFinalCoord(rank, name) {\n\t  if (rank === 1) {\n\t    return \"\" + name;\n\t  } else if (rank === 2) {\n\t    return name + \".y\";\n\t  } else if (rank === 3) {\n\t    return name + \".z\";\n\t  } else if (rank === 4) {\n\t    return name + \".w\";\n\t  } else {\n\t    throw Error(\"Cumulative sum for rank \" + rank + \" is not yet supported\");\n\t  }\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction cumsum$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var axis = attrs.axis,\n\t      exclusive = attrs.exclusive,\n\t      reverse = attrs.reverse;\n\t  var xRank = x.shape.length;\n\t  var permutation = getAxesPermutation([axis], xRank);\n\t  var permutedX = x;\n\n\t  if (permutation != null) {\n\t    permutedX = transpose$2({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        perm: permutation\n\t      }\n\t    });\n\t  }\n\n\t  var permutedAxis = getInnerMostAxes(1, xRank)[0];\n\n\t  if (permutedAxis !== xRank - 1) {\n\t    throw new Error(\"WebGL cumsum shader expects an inner-most axis=\" + (x.shape.length - 1) + \" \" + (\"but got axis=\" + axis));\n\t  }\n\n\t  var size = x.shape[permutedAxis];\n\t  var result = identity$2({\n\t    inputs: {\n\t      x: permutedX\n\t    },\n\t    backend: backend\n\t  }); // Use cumsum parallel algorithm, ref:\n\t  // https://developer.nvidia.com/gpugems/gpugems3/part-vi-gpu-computing/chapter-39-parallel-prefix-sum-scan-cuda\n\n\t  for (var i = 0; i <= Math.ceil(Math.log2(size)) - 1; i++) {\n\t    var program = new CumSumProgram(permutedX.shape, false, reverse);\n\t    var customSetup = program.getCustomSetupFunc(i);\n\t    var prevResult = result;\n\t    result = backend.runWebGLProgram(program, [result], result.dtype, customSetup);\n\t    backend.disposeIntermediateTensorInfo(prevResult);\n\t  } // For exclusive cumsum, shift the end result in the direction of sum\n\t  // and add 0 to the front index.\n\n\n\t  if (exclusive) {\n\t    var _program = new CumSumProgram(permutedX.shape, exclusive, reverse);\n\n\t    var _prevResult = result;\n\t    result = backend.runWebGLProgram(_program, [result], result.dtype);\n\t    backend.disposeIntermediateTensorInfo(_prevResult);\n\t  }\n\n\t  if (permutation != null) {\n\t    var reversePermutation = getUndoAxesPermutation(permutation);\n\t    var reverseTransposedResult = transpose$2({\n\t      inputs: {\n\t        x: result\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        perm: reversePermutation\n\t      }\n\t    });\n\t    backend.disposeIntermediateTensorInfo(result);\n\t    backend.disposeIntermediateTensorInfo(permutedX);\n\t    return reverseTransposedResult;\n\t  }\n\n\t  return result;\n\t}\n\tvar cumsumConfig$1 = {\n\t  kernelName: Cumsum,\n\t  backendName: 'webgl',\n\t  kernelFunc: cumsum$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction denseBincount$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      weights = inputs.weights;\n\t  var size = attrs.size,\n\t      binaryOutput = attrs.binaryOutput;\n\n\t  if (x.shape.length === 1) {\n\t    var xVals = backend.readSync(x.dataId);\n\t    var weightsVals = backend.readSync(weights.dataId);\n\t    var outVals = bincountImplCPU(xVals, weightsVals, weights.dtype, weights.shape, size);\n\t    return backend.makeTensorInfo([size], weights.dtype, outVals);\n\t  } else if (x.shape.length === 2) {\n\t    var xBuf = backend.bufferSync(x);\n\t    var weightsBuf = backend.bufferSync(weights);\n\t    var outBuf = bincountReduceImplCPU(xBuf, weightsBuf, size, binaryOutput);\n\t    return backend.makeTensorInfo(outBuf.shape, weights.dtype, outBuf.values);\n\t  }\n\n\t  throw new Error(\"Error in denseBincount: input must be at most rank 2, but got rank\" + (x.shape.length + \".\"));\n\t}\n\tvar denseBincountConfig$1 = {\n\t  kernelName: DenseBincount,\n\t  backendName: 'webgl',\n\t  kernelFunc: denseBincount$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar DepthToSpaceProgram = /*#__PURE__*/function () {\n\t  function DepthToSpaceProgram(outputShape, blockSize, dataFormat) {\n\t    this.variableNames = ['x'];\n\t    this.outputShape = [];\n\t    this.outputShape = outputShape;\n\t    this.blockSize = blockSize;\n\t    this.dataFormat = dataFormat;\n\t    this.userCode = \"\\n    void main() {\\n      ivec4 coords = getOutputCoords();\\n      int b = coords[0];\\n      int h = \" + this.getHeightCoordString() + \";\\n      int w = \" + this.getWidthCoordString() + \";\\n      int d = \" + this.getDepthCoordString() + \";\\n\\n      int in_h = h / \" + blockSize + \";\\n      int offset_h = imod(h, \" + blockSize + \");\\n      int in_w = w / \" + blockSize + \";\\n      int offset_w = imod(w, \" + blockSize + \");\\n      int offset_d = (offset_h * \" + blockSize + \" + offset_w) *\\n        \" + this.getOutputDepthSize() + \";\\n      int in_d = d + offset_d;\\n\\n      float result = \" + this.getInputSamplingString() + \";\\n      setOutput(result);\\n    }\\n  \";\n\t  }\n\n\t  var _proto = DepthToSpaceProgram.prototype;\n\n\t  _proto.getHeightCoordString = function getHeightCoordString() {\n\t    if (this.dataFormat === 'NHWC') {\n\t      return \"coords[1]\";\n\t    } else {\n\t      return \"coords[2]\";\n\t    }\n\t  };\n\n\t  _proto.getWidthCoordString = function getWidthCoordString() {\n\t    if (this.dataFormat === 'NHWC') {\n\t      return \"coords[2]\";\n\t    } else {\n\t      return \"coords[3]\";\n\t    }\n\t  };\n\n\t  _proto.getDepthCoordString = function getDepthCoordString() {\n\t    if (this.dataFormat === 'NHWC') {\n\t      return \"coords[3]\";\n\t    } else {\n\t      return \"coords[1]\";\n\t    }\n\t  };\n\n\t  _proto.getOutputDepthSize = function getOutputDepthSize() {\n\t    if (this.dataFormat === 'NHWC') {\n\t      return this.outputShape[3];\n\t    } else {\n\t      return this.outputShape[1];\n\t    }\n\t  };\n\n\t  _proto.getInputSamplingString = function getInputSamplingString() {\n\t    if (this.dataFormat === 'NHWC') {\n\t      return \"getX(b, in_h, in_w, in_d)\";\n\t    } else {\n\t      return \"getX(b, in_d, in_h, in_w)\";\n\t    }\n\t  };\n\n\t  return DepthToSpaceProgram;\n\t}();\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction depthToSpace$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var blockSize = attrs.blockSize,\n\t      dataFormat = attrs.dataFormat;\n\t  assert(blockSize > 1, function () {\n\t    return \"blockSize should be > 1 for depthToSpace, but was: \" + blockSize;\n\t  });\n\t  var batchSize = x.shape[0];\n\t  var inputHeight = dataFormat === 'NHWC' ? x.shape[1] : x.shape[2];\n\t  var inputWidth = dataFormat === 'NHWC' ? x.shape[2] : x.shape[3];\n\t  var inputDepth = dataFormat === 'NHWC' ? x.shape[3] : x.shape[1];\n\t  var outputHeight = inputHeight * blockSize;\n\t  var outputWidth = inputWidth * blockSize;\n\t  var outputDepth = inputDepth / (blockSize * blockSize);\n\t  var outputShape = dataFormat === 'NHWC' ? [batchSize, outputHeight, outputWidth, outputDepth] : [batchSize, outputDepth, outputHeight, outputWidth];\n\t  var program = new DepthToSpaceProgram(outputShape, blockSize, dataFormat);\n\t  return backend.runWebGLProgram(program, [x], x.dtype);\n\t}\n\tvar depthToSpaceConfig$1 = {\n\t  kernelName: DepthToSpace,\n\t  backendName: 'webgl',\n\t  kernelFunc: depthToSpace$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar DepthwiseConv2DProgram = function DepthwiseConv2DProgram(convInfo, addBias, activation, hasPreluActivation, hasLeakyReluAlpha) {\n\t  if (addBias === void 0) {\n\t    addBias = false;\n\t  }\n\n\t  if (activation === void 0) {\n\t    activation = null;\n\t  }\n\n\t  if (hasPreluActivation === void 0) {\n\t    hasPreluActivation = false;\n\t  }\n\n\t  if (hasLeakyReluAlpha === void 0) {\n\t    hasLeakyReluAlpha = false;\n\t  }\n\n\t  this.variableNames = ['x', 'W'];\n\t  this.outputShape = convInfo.outShape;\n\t  var xNumRows = convInfo.inHeight;\n\t  var xNumCols = convInfo.inWidth;\n\t  var padTop = convInfo.padInfo.top;\n\t  var padLeft = convInfo.padInfo.left;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var dilationHeight = convInfo.dilationHeight;\n\t  var dilationWidth = convInfo.dilationWidth;\n\t  var filterHeight = convInfo.filterHeight;\n\t  var filterWidth = convInfo.filterWidth;\n\t  var channelMul = convInfo.outChannels / convInfo.inChannels;\n\t  var activationSnippet = '',\n\t      applyActivationSnippet = '';\n\n\t  if (activation) {\n\t    if (hasPreluActivation) {\n\t      activationSnippet = \"float activation(float a) {\\n          float b = getPreluActivationWeightsAtOutCoords();\\n          \" + activation + \"\\n        }\";\n\t    } else if (hasLeakyReluAlpha) {\n\t      activationSnippet = \"float activation(float a) {\\n          float b = getLeakyreluAlphaAtOutCoords();\\n          \" + activation + \"\\n        }\";\n\t    } else {\n\t      activationSnippet = \"\\n          float activation(float x) {\\n            \" + activation + \"\\n          }\\n        \";\n\t    }\n\n\t    applyActivationSnippet = \"result = activation(result);\";\n\t  }\n\n\t  var addBiasSnippet = addBias ? 'result += getBiasAtOutCoords();' : '';\n\n\t  if (addBias) {\n\t    this.variableNames.push('bias');\n\t  }\n\n\t  if (hasPreluActivation) {\n\t    this.variableNames.push('preluActivationWeights');\n\t  }\n\n\t  if (hasLeakyReluAlpha) {\n\t    this.variableNames.push('leakyreluAlpha');\n\t  }\n\n\t  this.userCode = \"\\n      \" + activationSnippet + \"\\n\\n      const ivec2 strides = ivec2(\" + strideHeight + \", \" + strideWidth + \");\\n      const ivec2 pads = ivec2(\" + padTop + \", \" + padLeft + \");\\n\\n      void main() {\\n        ivec4 coords = getOutputCoords();\\n        int batch = coords.x;\\n        ivec2 xRCCorner = coords.yz * strides - pads;\\n        int d2 = coords.w;\\n        int d1 = d2 / \" + channelMul + \";\\n        int q = d2 - d1 * \" + channelMul + \";\\n\\n        int xRCorner = xRCCorner.x;\\n        int xCCorner = xRCCorner.y;\\n\\n        // Convolve x(?, ?, d1) with w(:, :, d1, q) to get y(yR, yC, d2).\\n        // ? = to be determined. : = across all values in that axis.\\n        float dotProd = 0.0;\\n        // TO DO(dsmilkov): Flatten the two for loops and vec4 the operations.\\n        for (int wR = 0; wR < \" + filterHeight + \"; wR++) {\\n          int xR = xRCorner + wR * \" + dilationHeight + \";\\n\\n          if (xR < 0 || xR >= \" + xNumRows + \") {\\n            continue;\\n          }\\n\\n          for (int wC = 0; wC < \" + filterWidth + \"; wC++) {\\n            int xC = xCCorner + wC * \" + dilationWidth + \";\\n\\n            if (xC < 0 || xC >= \" + xNumCols + \") {\\n              continue;\\n            }\\n\\n            float xVal = getX(batch, xR, xC, d1);\\n            float wVal = getW(wR, wC, d1, q);\\n            dotProd += xVal * wVal;\\n          }\\n        }\\n\\n        float result = dotProd;\\n        \" + addBiasSnippet + \"\\n        \" + applyActivationSnippet + \"\\n        setOutput(result);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar DepthwiseConvPacked2DProgram = function DepthwiseConvPacked2DProgram(convInfo, addBias, activation, hasPreluActivation, hasLeakyReluAlpha) {\n\t  if (addBias === void 0) {\n\t    addBias = false;\n\t  }\n\n\t  if (activation === void 0) {\n\t    activation = null;\n\t  }\n\n\t  if (hasPreluActivation === void 0) {\n\t    hasPreluActivation = false;\n\t  }\n\n\t  if (hasLeakyReluAlpha === void 0) {\n\t    hasLeakyReluAlpha = false;\n\t  }\n\n\t  this.variableNames = ['x', 'W'];\n\t  this.packedInputs = true;\n\t  this.packedOutput = true;\n\t  this.outputShape = convInfo.outShape;\n\t  var xNumRows = convInfo.inHeight;\n\t  var xNumCols = convInfo.inWidth;\n\t  var padTop = convInfo.padInfo.top;\n\t  var padLeft = convInfo.padInfo.left;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var dilationHeight = convInfo.dilationHeight;\n\t  var dilationWidth = convInfo.dilationWidth;\n\t  var filterHeight = convInfo.filterHeight;\n\t  var filterWidth = convInfo.filterWidth;\n\t  var texelsAcross = filterWidth;\n\t  var mainLoop = \"int xR; int xC; int xCOffset;\";\n\n\t  for (var r = 0; r < filterHeight; r++) {\n\t    for (var c = 0; c < filterWidth; c++) {\n\t      mainLoop += \"\\n          vec4 xTexelR\" + r + \"C\" + c * 2 + \" = vec4(0.);\\n          vec4 wR\" + r + \"C\" + c + \" = vec4(0.);\\n          vec4 xR\" + r + \"C\" + c + \" = vec4(0.);\";\n\t    }\n\t  }\n\t  /**\n\t   * This vectorized implementation works by gathering the values needed for\n\t   * each output channel's dot product into vec4's and then multiplying them\n\t   * all together (this happens in the final double for-loop below). Most of\n\t   * the main loop consists of constructing these vec4's with the minimum\n\t   * number of texture2D calls, which means making use of all four returned\n\t   * values from a texture2D call at once.\n\t   */\n\n\n\t  for (var _r = 0; _r < filterHeight; _r++) {\n\t    for (var texelC = 0; texelC < texelsAcross; texelC++) {\n\t      var _c = texelC * 2;\n\n\t      mainLoop += \"\\n          xR = xRCorner + \" + _r * dilationHeight + \";\\n          xC = xCCorner + \" + _c * dilationWidth + \";\\n        \";\n\n\t      if (strideWidth === 1) {\n\t        if (_c < filterWidth) {\n\t          // If padding is odd, the outer texels have to be composed.\n\t          if (padLeft % 2 === 1) {\n\t            // TODO: Ensure vec4 previous does not result in redundant sample,\n\t            // and avoid setting xTexelRC's that exceed the boundary in the\n\t            // first place rather than resetting them to vec4(0)).\n\t            // To compute xCOffset:\n\t            // - If padding is odd, we must add 1 to ensure we ask for an\n\t            // even-numbered row.\n\t            // - We subtract 2 to access the previous texel.\n\t            mainLoop += \"\\n                xCOffset = xC + 1;\\n                if(xR >= 0 && xR < \" + xNumRows + \" && xCOffset >= 0 && xCOffset < \" + xNumCols + \") {\\n                  xTexelR\" + _r + \"C\" + _c + \" = getX(batch, xR, xCOffset, d1);\\n\\n                  // Need to manually clear unused channels in case\\n                  // we're reading from recycled texture.\\n                  if(xCOffset + 1 >= \" + xNumCols + \") {\\n                    xTexelR\" + _r + \"C\" + _c + \".zw = vec2(0.);\\n                  }\\n                } else {\\n                  xTexelR\" + _r + \"C\" + _c + \" = vec4(0.);\\n                }\\n\\n                xCOffset = xC + 1 - 2;\\n                if(xR >= 0 && xR < \" + xNumRows + \" && xCOffset >= 0 && xCOffset < \" + xNumCols + \") {\\n                  vec4 previous = getX(batch, xR, xCOffset, d1);\\n\\n                  // Need to manually clear unused channels in case\\n                  // we're reading from recycled texture.\\n                  if(xCOffset + 1 >= \" + xNumCols + \") {\\n                    previous.zw = vec2(0.);\\n                  }\\n\\n                  xR\" + _r + \"C\" + _c + \" = vec4(previous.zw, xTexelR\" + _r + \"C\" + _c + \".xy);\\n                } else {\\n                  xR\" + _r + \"C\" + _c + \" = vec4(0, 0, xTexelR\" + _r + \"C\" + _c + \".xy);\\n                }\\n              \";\n\t          } else {\n\t            // Padding is even, so xRC corresponds to a single texel.\n\t            mainLoop += \"\\n                if(xR >= 0 && xR < \" + xNumRows + \" && xC >= 0 && xC < \" + xNumCols + \") {\\n                  xTexelR\" + _r + \"C\" + _c + \" = getX(batch, xR, xC, d1);\\n                } else {\\n                  xTexelR\" + _r + \"C\" + _c + \" = vec4(0.);\\n                }\\n\\n                xR\" + _r + \"C\" + _c + \" = xTexelR\" + _r + \"C\" + _c + \";\\n              \";\n\t          }\n\n\t          if (_c + 1 < filterWidth) {\n\t            // If dilation is even, the second entry should match the first\n\t            // (either both are composed or both are single samples). But if\n\t            // dilation is odd, then the second entry should be the opposite\n\t            // of the first (if the first is composed, the second is a single\n\t            // sample, and vice versa.)\n\t            var nextTexelOffset = padLeft % 2 === 0 ? nearestLargerEven(dilationWidth) : dilationWidth;\n\n\t            if (dilationWidth % 2 === 0 && padLeft % 2 === 1 || dilationWidth % 2 !== 0 && padLeft % 2 !== 1) {\n\t              mainLoop += \"\\n                  xCOffset = xC + \" + padLeft % 2 + \" + \" + nextTexelOffset + \";\\n\\n                  if(xR >= 0 && xR < \" + xNumRows + \" &&\\n                    xCOffset >= 0 && xCOffset < \" + xNumCols + \") {\\n                    xTexelR\" + _r + \"C\" + (_c + 2) + \" = getX(batch, xR, xCOffset, d1);\\n                  }\\n                \"; // If dilation > 1 then the xRC's will not be able to share any\n\t              // values, so each xRC will require two unique calls to getX.\n\n\t              if (dilationWidth > 1) {\n\t                mainLoop += \"\\n                    xCOffset -= 2;\\n                    if(xR >= 0 && xR < \" + xNumRows + \" &&\\n                      xCOffset >= 0 && xCOffset < \" + xNumCols + \") {\\n                      xTexelR\" + _r + \"C\" + _c + \" = getX(batch, xR, xCOffset, d1);\\n                    } else {\\n                      xTexelR\" + _r + \"C\" + _c + \" = vec4(0.);\\n                    }\\n                  \";\n\t              }\n\n\t              mainLoop += \"\\n                  xR\" + _r + \"C\" + (_c + 1) + \" = vec4(\\n                    xTexelR\" + _r + \"C\" + _c + \".zw, xTexelR\" + _r + \"C\" + (_c + 2) + \".xy);\\n                \";\n\t            } else {\n\t              mainLoop += \"\\n                  xCOffset = xC + \" + nextTexelOffset + \";\\n\\n                  if(xR >= 0 && xR < \" + xNumRows + \" &&\\n                    xCOffset >= 0 && xCOffset < \" + xNumCols + \") {\\n                    xTexelR\" + _r + \"C\" + (_c + 2) + \" = getX(batch, xR, xCOffset, d1);\\n                  }\\n\\n                  xR\" + _r + \"C\" + (_c + 1) + \" = xTexelR\" + _r + \"C\" + (_c + 2) + \";\\n                \";\n\t            }\n\t          }\n\t        }\n\t      } else {\n\t        // stride > 1\n\t        if (_c < filterWidth) {\n\t          mainLoop += \"\\n              if(xR >= 0 && xR < \" + xNumRows + \") {\\n            \"; // Depending on whether padLeft is even or odd, we want either the\n\t          // xy or zw channels from X texels for xR${r}C${c}. If padLeft is\n\t          // even, xR${r}C${c + 1} is simply the zw channels of texels we've\n\t          // already sampled. But if padLeft is odd, xR${r}C{$c + 1}.zw will\n\t          // need to come from the xy channels of a new texel, hence the `vec4\n\t          // final` initialized below.\n\n\t          if (padLeft % 2 === 1) {\n\t            mainLoop += \"\\n                xCOffset = xC + 1 - \" + strideWidth + \";\\n                if(xCOffset >= 0 && xCOffset < \" + xNumCols + \") {\\n                  xTexelR\" + _r + \"C\" + _c + \" = getX(batch, xR, xCOffset, d1);\\n                } else {\\n                  xTexelR\" + _r + \"C\" + _c + \" = vec4(0.);\\n                }\\n\\n                if(xC + 1 >= 0 && xC + 1 < \" + xNumCols + \") {\\n                  xTexelR\" + _r + \"C\" + (_c + 2) + \" = getX(batch, xR, xC + 1, d1);\\n                } else {\\n                  xTexelR\" + _r + \"C\" + (_c + 2) + \" = vec4(0.);\\n                }\\n\\n                xR\" + _r + \"C\" + _c + \" = vec4(\\n                  xTexelR\" + _r + \"C\" + _c + \".zw, xTexelR\" + _r + \"C\" + (_c + 2) + \".zw);\\n              \";\n\n\t            if (_c + 1 < filterWidth) {\n\t              mainLoop += \"\\n                  vec4 final = vec4(0.);\\n                  xCOffset = xC + 1 + \" + strideWidth + \";\\n                  if(xCOffset >= 0 && xCOffset < \" + xNumCols + \") {\\n                    final = getX(batch, xR, xCOffset, d1);\\n                  }\\n                  xR\" + _r + \"C\" + (_c + 1) + \" = vec4(xTexelR\" + _r + \"C\" + (_c + 2) + \".xy, final.xy);\\n                \";\n\t            }\n\t          } else {\n\t            mainLoop += \"\\n                if(xC >= 0 && xC < \" + xNumCols + \") {\\n                  xTexelR\" + _r + \"C\" + _c + \" = getX(batch, xR, xC, d1);\\n                } else {\\n                  xTexelR\" + _r + \"C\" + _c + \" = vec4(0.);\\n                }\\n\\n                xCOffset = xC + \" + strideWidth + \";\\n                if(xCOffset >= 0 && xCOffset < \" + xNumCols + \") {\\n                  xTexelR\" + _r + \"C\" + (_c + 2) + \" = getX(batch, xR, xCOffset, d1);\\n                } else {\\n                  xTexelR\" + _r + \"C\" + (_c + 2) + \" = vec4(0.);\\n                }\\n\\n                xR\" + _r + \"C\" + _c + \" = vec4(\\n                  xTexelR\" + _r + \"C\" + _c + \".xy, xTexelR\" + _r + \"C\" + (_c + 2) + \".xy);\\n              \";\n\n\t            if (_c + 1 < filterWidth) {\n\t              mainLoop += \"\\n                  xR\" + _r + \"C\" + (_c + 1) + \" = vec4(\\n                    xTexelR\" + _r + \"C\" + _c + \".zw, xTexelR\" + _r + \"C\" + (_c + 2) + \".zw);\\n                \";\n\t            }\n\t          }\n\n\t          mainLoop += \"}\";\n\t        }\n\t      }\n\n\t      if (_c < filterWidth) {\n\t        mainLoop += \"\\n            vec4 wTexelR\" + _r + \"C\" + _c + \" = getW(\" + _r + \", \" + _c + \", d1, q);\\n            wR\" + _r + \"C\" + _c + \" = vec4(wTexelR\" + _r + \"C\" + _c + \".xz, wTexelR\" + _r + \"C\" + _c + \".xz);\\n          \";\n\n\t        if (_c + 1 < filterWidth) {\n\t          mainLoop += \"\\n              vec4 wTexelR\" + _r + \"C\" + (_c + 1) + \" = getW(\" + _r + \", \" + (_c + 1) + \", d1, q);\\n              wR\" + _r + \"C\" + (_c + 1) + \" =\\n                vec4(wTexelR\" + _r + \"C\" + (_c + 1) + \".xz, wTexelR\" + _r + \"C\" + (_c + 1) + \".xz);\";\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  for (var _r2 = 0; _r2 < filterHeight; _r2++) {\n\t    for (var _c2 = 0; _c2 < filterWidth; _c2++) {\n\t      mainLoop += \"dotProd += xR\" + _r2 + \"C\" + _c2 + \" * wR\" + _r2 + \"C\" + _c2 + \";\";\n\t    }\n\t  }\n\n\t  var activationSnippet = '',\n\t      applyActivationSnippet = '';\n\n\t  if (activation) {\n\t    if (hasPreluActivation) {\n\t      activationSnippet = \"vec4 activation(vec4 a) {\\n          vec4 b = getPreluActivationWeightsAtOutCoords();\\n          \" + activation + \"\\n        }\";\n\t    } else if (hasLeakyReluAlpha) {\n\t      activationSnippet = \"vec4 activation(vec4 a) {\\n          vec4 b = getLeakyreluAlphaAtOutCoords();\\n          \" + activation + \"\\n        }\";\n\t    } else {\n\t      activationSnippet = \"vec4 activation(vec4 x) {\\n          \" + activation + \"\\n        }\";\n\t    }\n\n\t    applyActivationSnippet = \"result = activation(result);\";\n\t  }\n\n\t  var addBiasSnippet = addBias ? 'result += getBiasAtOutCoords();' : '';\n\n\t  if (addBias) {\n\t    this.variableNames.push('bias');\n\t  }\n\n\t  if (hasPreluActivation) {\n\t    this.variableNames.push('preluActivationWeights');\n\t  }\n\n\t  if (hasLeakyReluAlpha) {\n\t    this.variableNames.push('leakyreluAlpha');\n\t  }\n\n\t  this.userCode = \"\\n      \" + activationSnippet + \"\\n\\n      const ivec2 strides = ivec2(\" + strideHeight + \", \" + strideWidth + \");\\n      const ivec2 pads = ivec2(\" + padTop + \", \" + padLeft + \");\\n\\n      void main() {\\n\\n        ivec4 coords = getOutputCoords();\\n        int batch = coords.x;\\n        ivec2 xRCCorner = coords.yz * strides - pads;\\n        int d2 = coords.w;\\n        int d1 = d2;\\n        int q = 0;\\n        int xRCorner = xRCCorner.x;\\n        int xCCorner = xRCCorner.y;\\n\\n        vec4 dotProd = vec4(0.);\\n\\n        \" + mainLoop + \"\\n\\n        vec4 result = dotProd;\\n        \" + addBiasSnippet + \"\\n        \" + applyActivationSnippet + \"\\n        setOutput(result);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction depthwiseConv2dNative$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      filter = inputs.filter;\n\t  var strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dilations = attrs.dilations,\n\t      dimRoundingMode = attrs.dimRoundingMode;\n\t  var $dilations = dilations;\n\n\t  if ($dilations == null) {\n\t    $dilations = [1, 1];\n\t  }\n\n\t  assert(eitherStridesOrDilationsAreOne(strides, $dilations), function () {\n\t    return 'Error in depthwiseConv2d: Either strides or dilations must be ' + (\"1. Got strides \" + strides + \" and dilations '\" + $dilations + \"'\");\n\t  });\n\t  var convInfo = computeConv2DInfo(x.shape, filter.shape, strides, $dilations, pad, dimRoundingMode, true\n\t  /* depthwise */\n\t  );\n\t  var program;\n\n\t  if (env().getBool('WEBGL_PACK_DEPTHWISECONV') && convInfo.strideWidth <= 2 && convInfo.outChannels / convInfo.inChannels === 1) {\n\t    program = new DepthwiseConvPacked2DProgram(convInfo);\n\t  } else {\n\t    program = new DepthwiseConv2DProgram(convInfo);\n\t  }\n\n\t  return backend.runWebGLProgram(program, [x, filter], 'float32');\n\t}\n\tvar depthwiseConv2dNativeConfig$1 = {\n\t  kernelName: DepthwiseConv2dNative,\n\t  backendName: 'webgl',\n\t  kernelFunc: depthwiseConv2dNative$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar DepthwiseConv2DDerFilterProgram = function DepthwiseConv2DDerFilterProgram(convInfo) {\n\t  this.variableNames = ['x', 'dy'];\n\t  this.outputShape = convInfo.filterShape;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var padTop = convInfo.padInfo.top;\n\t  var padLeft = convInfo.padInfo.left;\n\t  var channelMul = convInfo.outChannels / convInfo.inChannels;\n\t  this.userCode = \"\\n      void main() {\\n        ivec4 coords = getOutputCoords();\\n        int wR = coords.x;\\n        int wC = coords.y;\\n        int d1 = coords.z;\\n        int dm = coords.w;\\n        int d2 = d1 * \" + channelMul + \" + dm;\\n\\n        float dotProd = 0.0;\\n\\n        // TO DO: Vec4 over the batch size\\n        for (int b = 0; b < \" + convInfo.batchSize + \"; b++) {\\n          for (int yR = 0; yR < \" + convInfo.outHeight + \"; yR++) {\\n            int xR = wR + yR * \" + strideHeight + \" - \" + padTop + \";\\n\\n            if (xR < 0 || xR >= \" + convInfo.inHeight + \") {\\n              continue;\\n            }\\n\\n            for (int yC = 0; yC < \" + convInfo.outWidth + \"; yC++) {\\n              int xC = wC + yC * \" + strideWidth + \" - \" + padLeft + \";\\n\\n              if (xC < 0 || xC >= \" + convInfo.inWidth + \") {\\n                continue;\\n              }\\n\\n              float dyValue = getDy(b, yR, yC, d2);\\n              float xValue = getX(b, xR, xC, d1);\\n              dotProd += (xValue * dyValue);\\n            }\\n          }\\n        }\\n        setOutput(dotProd);\\n      }\\n    \";\n\t};\n\tvar DepthwiseConv2DDerInputProgram = function DepthwiseConv2DDerInputProgram(convInfo) {\n\t  this.variableNames = ['dy', 'W'];\n\t  this.outputShape = convInfo.inShape;\n\t  var filterHeight = convInfo.filterHeight;\n\t  var filterWidth = convInfo.filterWidth;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var padTop = filterHeight - 1 - convInfo.padInfo.top;\n\t  var padLeft = filterWidth - 1 - convInfo.padInfo.left;\n\t  var channelMul = convInfo.outChannels / convInfo.inChannels;\n\t  this.userCode = \"\\n      const ivec2 pads = ivec2(\" + padTop + \", \" + padLeft + \");\\n\\n      void main() {\\n        ivec4 coords = getOutputCoords();\\n        int batch = coords[0];\\n        int d1 = coords[3];\\n        ivec2 dyCorner = coords.yz - pads;\\n        int dyRCorner = dyCorner.x;\\n        int dyCCorner = dyCorner.y;\\n\\n        float dotProd = 0.0;\\n\\n        for (int wR = 0; wR < \" + filterHeight + \"; wR++) {\\n          float dyR = float(dyRCorner + wR) / \" + strideHeight + \".0;\\n\\n          if (dyR < 0.0 || dyR >= \" + convInfo.outHeight + \".0 || fract(dyR) > 0.0) {\\n            continue;\\n          }\\n          int idyR = int(dyR);\\n\\n          int wRPerm = \" + filterHeight + \" - 1 - wR;\\n\\n          for (int wC = 0; wC < \" + filterWidth + \"; wC++) {\\n            float dyC = float(dyCCorner + wC) / \" + strideWidth + \".0;\\n\\n            if (dyC < 0.0 || dyC >= \" + convInfo.outWidth + \".0 ||\\n                fract(dyC) > 0.0) {\\n              continue;\\n            }\\n            int idyC = int(dyC);\\n\\n            int wCPerm = \" + filterWidth + \" - 1 - wC;\\n\\n            // TO DO: Vec4 over the channelMul\\n            for (int dm = 0; dm < \" + channelMul + \"; dm++) {\\n              int d2 = d1 * \" + channelMul + \" + dm;\\n              float xValue = getDy(batch, idyR, idyC, d2);\\n              float wValue = getW(wRPerm, wCPerm, d1, dm);\\n              dotProd += xValue * wValue;\\n            }\\n          }\\n        }\\n        setOutput(dotProd);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction depthwiseConv2dNativeBackpropFilter$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      dy = inputs.dy;\n\t  var strides = attrs.strides,\n\t      dilations = attrs.dilations,\n\t      pad = attrs.pad,\n\t      dimRoundingMode = attrs.dimRoundingMode,\n\t      filterShape = attrs.filterShape;\n\t  var convInfo = computeConv2DInfo(x.shape, filterShape, strides, dilations, pad, dimRoundingMode, true\n\t  /* depthwise */\n\t  );\n\t  var program = new DepthwiseConv2DDerFilterProgram(convInfo);\n\t  return backend.runWebGLProgram(program, [x, dy], 'float32');\n\t}\n\tvar depthwiseConv2dNativeBackpropFilterConfig$1 = {\n\t  kernelName: DepthwiseConv2dNativeBackpropFilter,\n\t  backendName: 'webgl',\n\t  kernelFunc: depthwiseConv2dNativeBackpropFilter$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction depthwiseConv2dNativeBackpropInput$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var dy = inputs.dy,\n\t      filter = inputs.filter;\n\t  var strides = attrs.strides,\n\t      dilations = attrs.dilations,\n\t      pad = attrs.pad,\n\t      dimRoundingMode = attrs.dimRoundingMode,\n\t      inputShape = attrs.inputShape;\n\t  var convInfo = computeConv2DInfo(inputShape, filter.shape, strides, dilations, pad, dimRoundingMode, true\n\t  /* depthwise */\n\t  );\n\t  var program = new DepthwiseConv2DDerInputProgram(convInfo);\n\t  return backend.runWebGLProgram(program, [dy, filter], 'float32');\n\t}\n\tvar depthwiseConv2dNativeBackpropInputConfig$1 = {\n\t  kernelName: DepthwiseConv2dNativeBackpropInput,\n\t  backendName: 'webgl',\n\t  kernelFunc: depthwiseConv2dNativeBackpropInput$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar DiagProgram = function DiagProgram(size) {\n\t  this.variableNames = ['X'];\n\t  this.outputShape = [size, size];\n\t  this.userCode = \"\\n      void main() {\\n          ivec2 coords = getOutputCoords();\\n          float val = coords[0] == coords[1] ? getX(coords[0]) : 0.0;\\n          setOutput(val);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction diag$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var x = inputs.x;\n\t  var outShape = [].concat(x.shape, x.shape);\n\t  var xSize = sizeFromShape(x.shape);\n\t  var flat = reshape$3({\n\t    inputs: {\n\t      x: x\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: [xSize]\n\t    }\n\t  });\n\t  var program = new DiagProgram(xSize);\n\t  var res = backend.runWebGLProgram(program, [flat], flat.dtype);\n\t  var out = reshape$3({\n\t    inputs: {\n\t      x: res\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: outShape\n\t    }\n\t  });\n\t  backend.disposeIntermediateTensorInfo(flat);\n\t  backend.disposeIntermediateTensorInfo(res);\n\t  return out;\n\t}\n\tvar diagConfig$1 = {\n\t  kernelName: Diag,\n\t  backendName: 'webgl',\n\t  kernelFunc: diag$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar Dilation2DProgram = function Dilation2DProgram(convInfo) {\n\t  this.variableNames = ['x', 'W'];\n\t  this.outputShape = convInfo.outShape;\n\t  var inHeight = convInfo.inHeight,\n\t      inWidth = convInfo.inWidth,\n\t      padInfo = convInfo.padInfo,\n\t      strideHeight = convInfo.strideHeight,\n\t      strideWidth = convInfo.strideWidth,\n\t      filterHeight = convInfo.filterHeight,\n\t      filterWidth = convInfo.filterWidth,\n\t      dilationHeight = convInfo.dilationHeight,\n\t      dilationWidth = convInfo.dilationWidth;\n\t  var padTop = padInfo.top,\n\t      padLeft = padInfo.left;\n\t  this.userCode = \"\\n      const ivec2 strides = ivec2(\" + strideHeight + \", \" + strideWidth + \");\\n      const ivec2 pads = ivec2(\" + padTop + \", \" + padLeft + \");\\n      const float neg_infinity = -3.4e38;\\n\\n      void main() {\\n        ivec4 coords = getOutputCoords();\\n        int batch = coords.x;\\n        int d1 = coords.w;\\n        ivec2 outTopLeftCorner =\\n            coords.yz * strides - pads;\\n        int hBeg = outTopLeftCorner.x;\\n        int wBeg = outTopLeftCorner.y;\\n\\n        float curVal = neg_infinity;\\n        for (int h = 0; h < \" + filterHeight + \"; h++) {\\n          int hIn = hBeg + h * \" + dilationHeight + \";\\n\\n          if (hIn >= 0 && hIn < \" + inHeight + \") {\\n            for (int w = 0; w < \" + filterWidth + \"; w++) {\\n              int wIn = wBeg + w * \" + dilationWidth + \";\\n\\n              if (wIn >= 0 && wIn < \" + inWidth + \") {\\n                float xVal = getX(batch, hIn, wIn, d1);\\n                float wVal = getW(h, w, d1);\\n\\n                float val = xVal + wVal;\\n                if (val > curVal) {\\n                  curVal = val;\\n                }\\n              }\\n            }\\n          }\\n        }\\n\\n        float result = curVal;\\n        setOutput(result);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction dilation2D(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      filter = inputs.filter;\n\t  var strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dilations = attrs.dilations;\n\t  var convInfo = computeDilation2DInfo(x.shape, filter.shape, strides, pad, 'NHWC'\n\t  /* dataFormat */\n\t  , dilations);\n\t  var out;\n\t  var program = new Dilation2DProgram(convInfo);\n\t  out = backend.runWebGLProgram(program, [x, filter], 'float32');\n\t  var outReshaped = reshape$3({\n\t    inputs: {\n\t      x: out\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: convInfo.outShape\n\t    }\n\t  });\n\t  backend.disposeIntermediateTensorInfo(out);\n\t  return outReshaped;\n\t}\n\tvar dilation2DConfig = {\n\t  kernelName: Dilation2D,\n\t  backendName: 'webgl',\n\t  kernelFunc: dilation2D\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ELU$3 = \"return (x >= 0.0) ? x : (exp(x) - 1.0);\";\n\tvar ELU_PACKED = \"\\n  vec4 result;\\n\\n  result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\\n  result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\\n  result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\\n  result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\\n\\n  return result;\\n\";\n\tvar elu$4 = unaryKernelFunc$1({\n\t  opSnippet: ELU$3,\n\t  packedOpSnippet: ELU_PACKED\n\t});\n\tvar eluConfig$1 = {\n\t  kernelName: Elu,\n\t  backendName: 'webgl',\n\t  kernelFunc: elu$4\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ELU_DER$1 = \"return (b >= 1.0) ? a : a * (b + 1.0);\";\n\tvar ELU_DER_PACKED = \"\\n  vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.)));\\n  return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0))));\\n\";\n\tvar eluGrad$1 = function eluGrad(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var dy = inputs.dy,\n\t      y = inputs.y;\n\t  var program = env().getBool('WEBGL_PACK_BINARY_OPERATIONS') ? new BinaryOpPackedProgram(ELU_DER_PACKED, dy.shape, y.shape) : new BinaryOpProgram(ELU_DER$1, dy.shape, y.shape);\n\t  return backend.runWebGLProgram(program, [dy, y], dy.dtype);\n\t};\n\tvar eluGradConfig$2 = {\n\t  kernelName: EluGrad,\n\t  backendName: 'webgl',\n\t  kernelFunc: eluGrad$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar PACKED_EQUAL = \"\\n  return vec4(equal(a, b));\\n\";\n\tvar EQUAL = \"return float(a == b);\";\n\tvar equal$2 = binaryKernelFunc$1({\n\t  opSnippet: EQUAL,\n\t  packedOpSnippet: PACKED_EQUAL,\n\t  dtype: 'bool'\n\t});\n\tvar equalConfig$1 = {\n\t  kernelName: Equal,\n\t  backendName: 'webgl',\n\t  kernelFunc: equal$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ERF = \"\\n  // Error function is calculated approximately with elementary function.\\n  // See \\\"Handbook of Mathematical Functions with Formulas,\\n  // Graphs, and Mathematical Tables\\\", Abramowitz and Stegun.\\n  float p = \" + ERF_P + \";\\n  float a1 = \" + ERF_A1 + \";\\n  float a2 = \" + ERF_A2 + \";\\n  float a3 = \" + ERF_A3 + \";\\n  float a4 = \" + ERF_A4 + \";\\n  float a5 = \" + ERF_A5 + \";\\n\\n  float sign = sign(x);\\n  x = abs(x);\\n  float t = 1.0 / (1.0 + p * x);\\n  return sign * (1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x));\\n\";\n\tvar erf$2 = unaryKernelFunc$1({\n\t  opSnippet: ERF\n\t});\n\tvar erfConfig$1 = {\n\t  kernelName: Erf,\n\t  backendName: 'webgl',\n\t  kernelFunc: erf$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar EXP = \"return exp(x);\";\n\tvar exp$5 = unaryKernelFunc$1({\n\t  opSnippet: EXP,\n\t  packedOpSnippet: EXP,\n\t  cpuKernelImpl: expImplCPU\n\t});\n\tvar expConfig$1 = {\n\t  kernelName: Exp,\n\t  backendName: 'webgl',\n\t  kernelFunc: exp$5\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction expandDims$3(args) {\n\t  var inputs = args.inputs,\n\t      attrs = args.attrs,\n\t      backend = args.backend;\n\t  var dim = attrs.dim;\n\t  var input = inputs.input;\n\t  var inputRank = input.shape.length;\n\t  var newShape = input.shape.slice();\n\t  var $dim = dim;\n\n\t  if (dim < 0) {\n\t    // Negative value is counted from the tail of rank.\n\t    assert(-(inputRank + 1) <= dim, function () {\n\t      return \"Axis must be in the interval [\" + -(inputRank + 1) + \", \" + inputRank + \"]\";\n\t    });\n\t    $dim = inputRank + dim + 1;\n\t  }\n\n\t  newShape.splice($dim, 0, 1);\n\t  return reshape$3({\n\t    inputs: {\n\t      x: input\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: newShape\n\t    }\n\t  });\n\t}\n\tvar expandDimsConfig$1 = {\n\t  kernelName: ExpandDims,\n\t  backendName: 'webgl',\n\t  kernelFunc: expandDims$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar EXPM1 = \"return exp(x) - 1.0;\";\n\tvar expm1$2 = unaryKernelFunc$1({\n\t  opSnippet: EXPM1,\n\t  packedOpSnippet: EXPM1,\n\t  cpuKernelImpl: expm1ImplCPU\n\t});\n\tvar expm1Config$1 = {\n\t  kernelName: Expm1,\n\t  backendName: 'webgl',\n\t  kernelFunc: expm1$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar FFTProgram = function FFTProgram(component, inputShape, inverse) {\n\t  this.variableNames = ['real', 'imag'];\n\t  var innerDim = inputShape[1];\n\t  this.outputShape = inputShape;\n\t  var exponentMultiplierSnippet = inverse ? \"2.0 * \" + Math.PI : \"-2.0 * \" + Math.PI;\n\t  var resultDenominator = inverse ? innerDim + \".0\" : '1.0';\n\t  var opString;\n\n\t  if (component === 'real') {\n\t    opString = 'return real * expR - imag * expI;';\n\t  } else if (component === 'imag') {\n\t    opString = 'return real * expI + imag * expR;';\n\t  } else {\n\t    throw new Error(\"FFT component must be either \\\"real\\\" or \\\"imag\\\", got \" + component + \".\");\n\t  }\n\n\t  this.userCode = \"\\n      const float exponentMultiplier = \" + exponentMultiplierSnippet + \";\\n\\n      float unaryOpComplex(float real, float expR, float imag, float expI) {\\n        \" + opString + \"\\n      }\\n\\n      float mulMatDFT(int batch, int index) {\\n        float indexRatio = float(index) / float(\" + innerDim + \");\\n        float exponentMultiplierTimesIndexRatio =\\n            exponentMultiplier * indexRatio;\\n\\n        float result = 0.0;\\n\\n        for (int i = 0; i < \" + innerDim + \"; i++) {\\n          // x = (-2|2 * PI / N) * index * i;\\n          float x = exponentMultiplierTimesIndexRatio * float(i);\\n          float expR = cos(x);\\n          float expI = sin(x);\\n          float real = getReal(batch, i);\\n          float imag = getImag(batch, i);\\n\\n          result +=\\n              unaryOpComplex(real, expR, imag, expI) / \" + resultDenominator + \";\\n        }\\n\\n        return result;\\n      }\\n\\n      void main() {\\n        ivec2 coords = getOutputCoords();\\n        setOutput(mulMatDFT(coords[0], coords[1]));\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction fftImpl$1(x, inverse, backend) {\n\t  var xData = backend.texData.get(x.dataId);\n\t  var inputSize = sizeFromShape(x.shape); // Collapse all outer dimensions to a single batch dimension.\n\n\t  var innerDimensionSize = x.shape[x.shape.length - 1];\n\t  var batch = inputSize / innerDimensionSize;\n\t  var input2D = reshape$3({\n\t    inputs: {\n\t      x: x\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: [batch, innerDimensionSize]\n\t    }\n\t  });\n\t  var xShape = input2D.shape;\n\t  var realProgram = new FFTProgram('real', xShape, inverse);\n\t  var imagProgram = new FFTProgram('imag', xShape, inverse);\n\t  var inputs = [{\n\t    dataId: xData.complexTensorInfos.real.dataId,\n\t    dtype: xData.complexTensorInfos.real.dtype,\n\t    shape: xShape\n\t  }, {\n\t    dataId: xData.complexTensorInfos.imag.dataId,\n\t    dtype: xData.complexTensorInfos.imag.dtype,\n\t    shape: xShape\n\t  }];\n\t  var realPart = backend.runWebGLProgram(realProgram, inputs, 'float32');\n\t  var imagPart = backend.runWebGLProgram(imagProgram, inputs, 'float32');\n\t  var complexOutput = complex$2({\n\t    inputs: {\n\t      real: realPart,\n\t      imag: imagPart\n\t    },\n\t    backend: backend\n\t  });\n\t  backend.disposeIntermediateTensorInfo(realPart);\n\t  backend.disposeIntermediateTensorInfo(imagPart);\n\t  var complexOutputReshaped = reshape$3({\n\t    inputs: {\n\t      x: complexOutput\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: x.shape\n\t    }\n\t  });\n\t  backend.disposeIntermediateTensorInfo(complexOutputReshaped);\n\t  return complexOutputReshaped;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction fft$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var input = inputs.input;\n\t  return fftImpl$1(input, false\n\t  /* inverse */\n\t  , backend);\n\t}\n\tvar fftConfig$1 = {\n\t  kernelName: FFT,\n\t  backendName: 'webgl',\n\t  kernelFunc: fft$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar FillProgram = /*#__PURE__*/function () {\n\t  function FillProgram(shape, value) {\n\t    this.outputShape = [];\n\t    this.variableNames = ['x'];\n\t    this.outputShape = shape;\n\t    this.userCode = \"\\n      uniform float value;\\n      void main() {\\n        // Input can be obtained from uniform value.\\n        setOutput(value);\\n      }\\n    \";\n\t  }\n\n\t  var _proto = FillProgram.prototype;\n\n\t  _proto.getCustomSetupFunc = function getCustomSetupFunc(value) {\n\t    var _this = this;\n\n\t    return function (gpgpu, webGLProgram) {\n\t      if (_this.valueLoc == null) {\n\t        _this.valueLoc = gpgpu.getUniformLocationNoThrow(webGLProgram, 'value');\n\t      }\n\n\t      gpgpu.gl.uniform1f(_this.valueLoc, value);\n\t    };\n\t  };\n\n\t  return FillProgram;\n\t}();\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction fill$2(args) {\n\t  var backend = args.backend,\n\t      attrs = args.attrs;\n\t  var shape = attrs.shape,\n\t      value = attrs.value;\n\t  var dtype = attrs.dtype;\n\t  dtype = dtype || inferDtype(value);\n\n\t  if (dtype === 'string') {\n\t    // String type should be handled in CPU memory.\n\t    var values = getArrayFromDType(dtype, sizeFromShape(shape));\n\t    values.fill(value);\n\t    return backend.makeTensorInfo(shape, dtype, values);\n\t  } else {\n\t    var program = new FillProgram(shape, value);\n\t    var customSetup = program.getCustomSetupFunc(value);\n\t    return backend.runWebGLProgram(program, [], dtype, customSetup);\n\t  }\n\t}\n\tvar fillConfig$1 = {\n\t  kernelName: Fill,\n\t  backendName: 'webgl',\n\t  kernelFunc: fill$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar FlipLeftRightProgram = function FlipLeftRightProgram(imageShape) {\n\t  this.variableNames = ['Image'];\n\t  this.outputShape = [];\n\t  var imageWidth = imageShape[2];\n\t  this.outputShape = imageShape;\n\t  this.userCode = \"\\n        void main() {\\n          ivec4 coords = getOutputCoords();\\n          int x = coords[2];\\n\\n          int coordX = \" + imageWidth + \" - x;\\n          float outputValue;\\n          if(coordX >= 0 && coordX < \" + imageWidth + \") {\\n            outputValue = getImage(coords[0], coords[1], coordX, coords[3]);\\n          } else {\\n            outputValue = getImage(coords[0], coords[1], coords[2], coords[3]);\\n          }\\n          setOutput(outputValue);\\n        }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar flipLeftRightConfig$1 = {\n\t  kernelName: FlipLeftRight,\n\t  backendName: 'webgl',\n\t  kernelFunc: function kernelFunc(_ref) {\n\t    var inputs = _ref.inputs,\n\t        backend = _ref.backend;\n\t    var image = inputs.image;\n\t    var webglBackend = backend;\n\t    var program = new FlipLeftRightProgram(image.shape);\n\t    var output = webglBackend.runWebGLProgram(program, [image], image.dtype);\n\t    return output;\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar FLOOR = \"return floor(x);\";\n\tvar floor$c = unaryKernelFunc$1({\n\t  opSnippet: FLOOR,\n\t  packedOpSnippet: FLOOR,\n\t  cpuKernelImpl: floorImplCPU\n\t});\n\tvar floorConfig$1 = {\n\t  kernelName: Floor,\n\t  backendName: 'webgl',\n\t  kernelFunc: floor$c\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t// we implement floor division and glsl implements truncated division, we\n\t// correct for this by subtracting 1 from result when the result is negative and\n\t// there is a remainder.\n\n\tvar INT_DIV = \"\\n  float s = sign(a) * sign(b);\\n  int ia = round(a);\\n  int ib = round(b);\\n  if (ib != 0) {\\n    // Windows (D3D) wants guaranteed non-zero int division at compile-time.\\n    return float(idiv(ia, ib, s));\\n  } else {\\n    return NAN;\\n  }\\n\";\n\tvar INT_DIV_PACKED = \"\\n  ivec4 ia = round(a);\\n  ivec4 ib = round(b);\\n  bvec4 cond = notEqual(ib, ivec4(0));\\n  ivec4 result = ivec4(0);\\n  vec4 s = sign(a) * sign(b);\\n\\n  // Windows (D3D) wants guaranteed non-zero int division at compile-time.\\n  if (cond[0]) {\\n    result[0] = idiv(ia[0], ib[0], s[0]);\\n  }\\n  if (cond[1]) {\\n    result[1] = idiv(ia[1], ib[1], s[1]);\\n  }\\n  if (cond[2]) {\\n    result[2] = idiv(ia[2], ib[2], s[2]);\\n  }\\n  if (cond[3]) {\\n    result[3] = idiv(ia[3], ib[3], s[3]);\\n  }\\n  return vec4(result);\\n\";\n\tvar floorDiv$2 = binaryKernelFunc$1({\n\t  opSnippet: INT_DIV,\n\t  packedOpSnippet: INT_DIV_PACKED,\n\t  dtype: 'int32'\n\t});\n\tvar floorDivConfig$1 = {\n\t  kernelName: FloorDiv,\n\t  backendName: 'webgl',\n\t  kernelFunc: floorDiv$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar FromPixelsProgram = function FromPixelsProgram(outputShape) {\n\t  this.variableNames = ['A'];\n\t  var glsl = getGlslDifferences();\n\t  var height = outputShape[0],\n\t      width = outputShape[1];\n\t  this.outputShape = outputShape;\n\t  this.userCode = \"\\n      void main() {\\n        ivec3 coords = getOutputCoords();\\n        int texR = coords[0];\\n        int texC = coords[1];\\n        int depth = coords[2];\\n        vec2 uv = (vec2(texC, texR) + halfCR) / vec2(\" + width + \".0, \" + height + \".0);\\n\\n        vec4 values = \" + glsl.texture2D + \"(A, uv);\\n        float value;\\n        if (depth == 0) {\\n          value = values.r;\\n        } else if (depth == 1) {\\n          value = values.g;\\n        } else if (depth == 2) {\\n          value = values.b;\\n        } else if (depth == 3) {\\n          value = values.a;\\n        }\\n\\n        setOutput(floor(value * 255.0 + 0.5));\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar FromPixelsPackedProgram = function FromPixelsPackedProgram(outputShape) {\n\t  this.variableNames = ['A'];\n\t  this.packedInputs = false;\n\t  this.packedOutput = true;\n\t  var glsl = getGlslDifferences();\n\t  var height = outputShape[0],\n\t      width = outputShape[1];\n\t  this.outputShape = outputShape;\n\t  this.userCode = \"\\n      void main() {\\n        ivec3 coords = getOutputCoords();\\n        int texR = coords[0];\\n        int texC = coords[1];\\n        int depth = coords[2];\\n\\n        vec4 result = vec4(0.);\\n\\n        for(int row=0; row<=1; row++) {\\n          for(int col=0; col<=1; col++) {\\n            texC = coords[1] + row;\\n            depth = coords[2] + col;\\n\\n            vec2 uv = (vec2(texC, texR) + halfCR) /\\n                       vec2(\" + width + \".0, \" + height + \".0);\\n            vec4 values = \" + glsl.texture2D + \"(A, uv);\\n            float value;\\n            if (depth == 0) {\\n              value = values.r;\\n            } else if (depth == 1) {\\n              value = values.g;\\n            } else if (depth == 2) {\\n              value = values.b;\\n            } else if (depth == 3) {\\n              value = values.a;\\n            }\\n\\n            result[row * 2 + col] = floor(value * 255.0 + 0.5);\\n          }\\n        }\\n\\n        \" + glsl.output + \" = result;\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar fromPixelsConfig = {\n\t  kernelName: FromPixels,\n\t  backendName: 'webgl',\n\t  kernelFunc: fromPixels$1\n\t};\n\tvar fromPixels2DContext$1;\n\n\tfunction fromPixels$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var pixels = inputs.pixels;\n\t  var numChannels = attrs.numChannels;\n\t  var isVideo = typeof HTMLVideoElement !== 'undefined' && pixels instanceof HTMLVideoElement;\n\t  var isImage = typeof HTMLImageElement !== 'undefined' && pixels instanceof HTMLImageElement;\n\t  var isImageBitmap = typeof ImageBitmap !== 'undefined' && pixels instanceof ImageBitmap;\n\n\t  var _ref = isVideo ? [pixels.videoWidth, pixels.videoHeight] : [pixels.width, pixels.height],\n\t      width = _ref[0],\n\t      height = _ref[1];\n\n\t  var texShape = [height, width];\n\t  var outShape = [height, width, numChannels];\n\n\t  if (isImage || isVideo || isImageBitmap) {\n\t    if (fromPixels2DContext$1 == null) {\n\t      fromPixels2DContext$1 = document.createElement('canvas').getContext('2d');\n\t    }\n\n\t    fromPixels2DContext$1.canvas.width = width;\n\t    fromPixels2DContext$1.canvas.height = height;\n\t    fromPixels2DContext$1.drawImage(pixels, 0, 0, width, height);\n\t    pixels = fromPixels2DContext$1.canvas;\n\t  }\n\n\t  var tempPixelHandle = backend.makeTensorInfo(texShape, 'int32'); // This is a byte texture with pixels.\n\n\t  backend.texData.get(tempPixelHandle.dataId).usage = TextureUsage.PIXELS;\n\t  backend.gpgpu.uploadPixelDataToTexture(backend.getTexture(tempPixelHandle.dataId), pixels);\n\t  var program = env().getBool('WEBGL_PACK') ? new FromPixelsPackedProgram(outShape) : new FromPixelsProgram(outShape);\n\t  var res = backend.runWebGLProgram(program, [tempPixelHandle], 'int32');\n\t  backend.disposeData(tempPixelHandle.dataId);\n\t  return res;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction fusedConv2d(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      filter = inputs.filter,\n\t      bias = inputs.bias,\n\t      preluActivationWeights = inputs.preluActivationWeights;\n\t  var strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dataFormat = attrs.dataFormat,\n\t      dilations = attrs.dilations,\n\t      dimRoundingMode = attrs.dimRoundingMode,\n\t      activation = attrs.activation,\n\t      leakyreluAlpha = attrs.leakyreluAlpha;\n\t  var $dataFormat = convertConv2DDataFormat(dataFormat);\n\t  var convInfo = computeConv2DInfo(x.shape, filter.shape, strides, dilations, pad, dimRoundingMode, false\n\t  /* depthwise */\n\t  , $dataFormat);\n\t  var out;\n\t  var intermediates = [];\n\n\t  if (convInfo.filterHeight === 1 && convInfo.filterWidth === 1 && convInfo.dilationHeight === 1 && convInfo.dilationWidth === 1 && convInfo.strideHeight === 1 && convInfo.strideWidth === 1 && (convInfo.padInfo.type === 'SAME' || convInfo.padInfo.type === 'VALID')) {\n\t    out = conv2dByMatMul({\n\t      x: x,\n\t      filter: filter,\n\t      convInfo: convInfo,\n\t      backend: backend,\n\t      bias: bias,\n\t      activation: activation,\n\t      preluActivationWeights: preluActivationWeights,\n\t      leakyreluAlpha: leakyreluAlpha\n\t    });\n\t  } else if (env().getBool('WEBGL_CONV_IM2COL') && x.shape[0] === 1) {\n\t    out = conv2dWithIm2Row({\n\t      x: x,\n\t      filter: filter,\n\t      convInfo: convInfo,\n\t      backend: backend,\n\t      bias: bias,\n\t      activation: activation,\n\t      preluActivationWeights: preluActivationWeights,\n\t      leakyreluAlpha: leakyreluAlpha\n\t    });\n\t  } else {\n\t    var hasBias = bias != null;\n\t    var hasPreluActivationWeights = preluActivationWeights != null;\n\t    var hasLeakyreluAlpha = activation === 'leakyrelu';\n\t    var fusedActivation = activation ? mapActivationToShaderProgram(activation, false) : null;\n\t    var program = new Conv2DProgram(convInfo, hasBias, fusedActivation, hasPreluActivationWeights, hasLeakyreluAlpha);\n\t    var _inputs = [x, filter];\n\n\t    if (bias) {\n\t      _inputs.push(bias);\n\t    }\n\n\t    if (preluActivationWeights) {\n\t      _inputs.push(preluActivationWeights);\n\t    }\n\n\t    if (hasLeakyreluAlpha) {\n\t      var $leakyreluAlpha = backend.makeTensorInfo([], 'float32', createScalarValue(leakyreluAlpha, 'float32'));\n\n\t      _inputs.push($leakyreluAlpha);\n\n\t      intermediates.push($leakyreluAlpha);\n\t    }\n\n\t    out = backend.runWebGLProgram(program, _inputs, 'float32');\n\t  }\n\n\t  var outReshaped = reshape$3({\n\t    inputs: {\n\t      x: out\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: convInfo.outShape\n\t    }\n\t  });\n\t  intermediates.push(out);\n\t  intermediates.forEach(function (t) {\n\t    return backend.disposeIntermediateTensorInfo(t);\n\t  });\n\t  return outReshaped;\n\t}\n\tvar fusedConv2DConfig$1 = {\n\t  kernelName: FusedConv2D,\n\t  backendName: 'webgl',\n\t  kernelFunc: fusedConv2d\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction fusedDepthwiseConv2D$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      filter = inputs.filter,\n\t      bias = inputs.bias,\n\t      preluActivationWeights = inputs.preluActivationWeights;\n\t  var strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dilations = attrs.dilations,\n\t      dimRoundingMode = attrs.dimRoundingMode,\n\t      activation = attrs.activation,\n\t      leakyreluAlpha = attrs.leakyreluAlpha;\n\t  var intermediates = [];\n\t  var $dilations = dilations;\n\n\t  if ($dilations == null) {\n\t    $dilations = [1, 1];\n\t  }\n\n\t  assert(eitherStridesOrDilationsAreOne(strides, $dilations), function () {\n\t    return 'Error in depthwiseConv2d: Either strides or dilations must be ' + (\"1. Got strides \" + strides + \" and dilations '\" + $dilations + \"'\");\n\t  });\n\t  var convInfo = computeConv2DInfo(x.shape, filter.shape, strides, $dilations, pad, dimRoundingMode, true\n\t  /* depthwise */\n\t  );\n\t  var shouldPackDepthwiseConv = env().getBool('WEBGL_PACK_DEPTHWISECONV') && convInfo.strideWidth <= 2 && convInfo.outChannels / convInfo.inChannels === 1;\n\t  var fusedActivation = activation ? mapActivationToShaderProgram(activation, shouldPackDepthwiseConv) : null;\n\t  var programInputs = [x, filter];\n\t  var hasBias = bias != null;\n\t  var hasPreluActivationWeights = preluActivationWeights != null;\n\t  var hasLeakyreluAlpha = activation === 'leakyrelu';\n\n\t  if (hasBias) {\n\t    programInputs.push(bias);\n\t  }\n\n\t  if (hasPreluActivationWeights) {\n\t    programInputs.push(preluActivationWeights);\n\t  }\n\n\t  if (hasLeakyreluAlpha) {\n\t    var $leakyreluAlpha = backend.makeTensorInfo([], 'float32', createScalarValue(leakyreluAlpha, 'float32'));\n\t    programInputs.push($leakyreluAlpha);\n\t    intermediates.push($leakyreluAlpha);\n\t  }\n\n\t  var program;\n\n\t  if (shouldPackDepthwiseConv) {\n\t    program = new DepthwiseConvPacked2DProgram(convInfo, hasBias, fusedActivation, hasPreluActivationWeights, hasLeakyreluAlpha);\n\t  } else {\n\t    program = new DepthwiseConv2DProgram(convInfo, hasBias, fusedActivation, hasPreluActivationWeights, hasLeakyreluAlpha);\n\t  }\n\n\t  var result = backend.runWebGLProgram(program, programInputs, 'float32');\n\t  intermediates.forEach(function (t) {\n\t    return backend.disposeIntermediateTensorInfo(t);\n\t  });\n\t  return result;\n\t}\n\tvar fusedDepthwiseConv2DConfig$1 = {\n\t  kernelName: FusedDepthwiseConv2D,\n\t  backendName: 'webgl',\n\t  kernelFunc: fusedDepthwiseConv2D$1\n\t};\n\n\tvar GatherNDProgram = function GatherNDProgram(sliceDim, strides, shape) {\n\t  this.sliceDim = sliceDim;\n\t  this.strides = strides;\n\t  this.variableNames = ['x', 'indices'];\n\t  this.outputShape = shape;\n\t  var stridesType = getCoordsDataType(strides.length);\n\t  var dtype = getCoordsDataType(shape.length);\n\t  var strideString = this.sliceDim > 1 ? 'strides[j]' : 'strides';\n\t  this.userCode = \"\\n        \" + stridesType + \" strides = \" + stridesType + \"(\" + this.strides + \");\\n         void main() {\\n          \" + dtype + \" coords = getOutputCoords();\\n          int flattenIndex = 0;\\n          for (int j = 0; j < \" + this.sliceDim + \"; j++) {\\n            int index = round(getIndices(coords[0], j));\\n            flattenIndex += index * \" + strideString + \";\\n          }\\n          setOutput(getX(flattenIndex, coords[1]));\\n        }\\n      \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction gatherNd$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var params = inputs.params,\n\t      indices = inputs.indices;\n\t  var indicesShape = indices.shape;\n\t  var sliceRank = indicesShape[indicesShape.length - 1];\n\n\t  var _backend_util$prepare = prepareAndValidate(params, indices),\n\t      resultShape = _backend_util$prepare[0],\n\t      numSlices = _backend_util$prepare[1],\n\t      sliceSize = _backend_util$prepare[2],\n\t      strides = _backend_util$prepare[3];\n\n\t  var flattenIndices = reshape$3({\n\t    inputs: {\n\t      x: indices\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: [numSlices, sliceRank]\n\t    }\n\t  });\n\t  var flattenX = reshape$3({\n\t    inputs: {\n\t      x: params\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: [sizeFromShape(params.shape) / sliceSize, sliceSize]\n\t    }\n\t  });\n\t  var program = new GatherNDProgram(sliceRank, strides, [numSlices, sliceSize]);\n\t  var res = backend.runWebGLProgram(program, [flattenX, flattenIndices], flattenX.dtype);\n\t  var reshaped = reshape$3({\n\t    inputs: {\n\t      x: res\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: resultShape\n\t    }\n\t  });\n\t  backend.disposeIntermediateTensorInfo(flattenIndices);\n\t  backend.disposeIntermediateTensorInfo(flattenX);\n\t  backend.disposeIntermediateTensorInfo(res);\n\t  return reshaped;\n\t}\n\tvar gatherNdConfig$1 = {\n\t  kernelName: GatherNd,\n\t  backendName: 'webgl',\n\t  kernelFunc: gatherNd$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar GatherProgram = function GatherProgram(aShape, outputShape) {\n\t  this.variableNames = ['A', 'indices'];\n\t  this.outputShape = outputShape;\n\t  this.rank = outputShape.length;\n\t  var dtype = getCoordsDataType(this.rank);\n\t  var sourceCoords = getSourceCoords$1(aShape, 2);\n\t  this.userCode = \"\\n      void main() {\\n        \" + dtype + \" resRC = getOutputCoords();\\n        setOutput(getA(\" + sourceCoords + \"));\\n      }\\n    \";\n\t}; // The input and output are always flattened into rank 4 tensors.\n\n\tfunction getSourceCoords$1(aShape, axis) {\n\t  var currentCoords = ['resRC.x', 'resRC.y', 'resRC.z', 'resRC.w'];\n\t  var sourceCoords = [];\n\n\t  for (var i = 0; i < aShape.length; i++) {\n\t    if (i === 2) {\n\t      sourceCoords.push('int(getIndices(resRC.x, resRC.z))');\n\t    } else {\n\t      sourceCoords.push(\"\" + currentCoords[i]);\n\t    }\n\t  }\n\n\t  return sourceCoords.join();\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction gatherV2$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      indices = inputs.indices;\n\t  var axis = attrs.axis,\n\t      batchDims = attrs.batchDims;\n\t  var parsedAxis = parseAxisParam(axis, x.shape)[0];\n\t  var shapeInfo = collectGatherOpShapeInfo(x, indices, parsedAxis, batchDims);\n\t  var indicesSize = sizeFromShape(indices.shape);\n\t  var toDispose = [];\n\t  var flattenX = reshape$3({\n\t    inputs: {\n\t      x: x\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: [shapeInfo.batchSize, shapeInfo.outerSize, shapeInfo.dimSize, shapeInfo.sliceSize]\n\t    }\n\t  });\n\t  var flattenIndex = reshape$3({\n\t    inputs: {\n\t      x: indices\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: [shapeInfo.batchSize, indicesSize / shapeInfo.batchSize]\n\t    }\n\t  });\n\t  toDispose.push(flattenX);\n\t  toDispose.push(flattenIndex);\n\t  var flattenOutputShape = [shapeInfo.batchSize, shapeInfo.outerSize, indicesSize / shapeInfo.batchSize, shapeInfo.sliceSize];\n\n\t  if (backend.shouldExecuteOnCPU([x, indices]) || x.dtype === 'string') {\n\t    var indicesBuf = backend.bufferSync(flattenIndex);\n\t    var xBuf = backend.bufferSync(flattenX);\n\t    var outBuf = gatherV2ImplCPU(xBuf, indicesBuf, flattenOutputShape);\n\t    toDispose.forEach(function (t) {\n\t      return backend.disposeIntermediateTensorInfo(t);\n\t    });\n\t    return backend.makeTensorInfo(shapeInfo.outputShape, outBuf.dtype, outBuf.values);\n\t  }\n\n\t  var program = new GatherProgram(flattenX.shape, flattenOutputShape);\n\t  var res = backend.runWebGLProgram(program, [flattenX, flattenIndex], flattenX.dtype);\n\t  toDispose.push(res);\n\t  var reshaped = reshape$3({\n\t    inputs: {\n\t      x: res\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: shapeInfo.outputShape\n\t    }\n\t  });\n\t  toDispose.forEach(function (t) {\n\t    return backend.disposeIntermediateTensorInfo(t);\n\t  });\n\t  return reshaped;\n\t}\n\tvar gatherV2Config$1 = {\n\t  kernelName: GatherV2,\n\t  backendName: 'webgl',\n\t  kernelFunc: gatherV2$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar GREATER = \"return float(a > b);\";\n\tvar GREATER_PACKED = \"\\n  return vec4(greaterThan(a, b));\\n\";\n\tvar greater$3 = binaryKernelFunc$1({\n\t  opSnippet: GREATER,\n\t  packedOpSnippet: GREATER_PACKED,\n\t  cpuKernelImpl: greaterImplCPU,\n\t  dtype: 'bool'\n\t});\n\tvar greaterConfig$1 = {\n\t  kernelName: Greater,\n\t  backendName: 'webgl',\n\t  kernelFunc: greater$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar GREATER_EQUAL = \"return float(a >= b);\";\n\tvar GREATER_EQUAL_PACKED = \"\\n  return vec4(greaterThanEqual(a, b));\\n\";\n\tvar greaterEqual$2 = binaryKernelFunc$1({\n\t  opSnippet: GREATER_EQUAL,\n\t  packedOpSnippet: GREATER_EQUAL_PACKED,\n\t  dtype: 'bool'\n\t});\n\tvar greaterEqualConfig$1 = {\n\t  kernelName: GreaterEqual,\n\t  backendName: 'webgl',\n\t  kernelFunc: greaterEqual$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction ifft$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var input = inputs.input;\n\t  return fftImpl$1(input, true\n\t  /* inverse */\n\t  , backend);\n\t}\n\tvar ifftConfig$1 = {\n\t  kernelName: IFFT,\n\t  backendName: 'webgl',\n\t  kernelFunc: ifft$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar IS_FINITE = \"return float(!isnan(x) && !isinf(x));\";\n\tvar isFinite$3 = unaryKernelFunc$1({\n\t  opSnippet: IS_FINITE,\n\t  dtype: 'bool'\n\t});\n\tvar isFiniteConfig$1 = {\n\t  kernelName: IsFinite,\n\t  backendName: 'webgl',\n\t  kernelFunc: isFinite$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar IS_INF = \"return float(isinf(x));\";\n\tvar isInf$2 = unaryKernelFunc$1({\n\t  opSnippet: IS_INF,\n\t  dtype: 'bool'\n\t});\n\tvar isInfConfig$1 = {\n\t  kernelName: IsInf,\n\t  backendName: 'webgl',\n\t  kernelFunc: isInf$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar IS_NAN = \"return float(isnan(x));\";\n\tvar isNaN$3 = unaryKernelFunc$1({\n\t  opSnippet: IS_NAN,\n\t  dtype: 'bool'\n\t});\n\tvar isNaNConfig$1 = {\n\t  kernelName: IsNan,\n\t  backendName: 'webgl',\n\t  kernelFunc: isNaN$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar LESS = \"return float(a < b);\";\n\tvar LESS_PACKED = \"\\n  return vec4(lessThan(a, b));\\n\";\n\tvar less$3 = binaryKernelFunc$1({\n\t  opSnippet: LESS,\n\t  packedOpSnippet: LESS_PACKED,\n\t  cpuKernelImpl: lessImplCPU,\n\t  dtype: 'bool'\n\t});\n\tvar lessConfig$1 = {\n\t  kernelName: Less,\n\t  backendName: 'webgl',\n\t  kernelFunc: less$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar LESS_EQUAL = \"return float(a <= b);\";\n\tvar LESS_EQUAL_PACKED = \"\\n  return vec4(lessThanEqual(a, b));\\n\";\n\tvar lessEqual$2 = binaryKernelFunc$1({\n\t  opSnippet: LESS_EQUAL,\n\t  packedOpSnippet: LESS_EQUAL_PACKED,\n\t  dtype: 'bool'\n\t});\n\tvar lessEqualConfig$1 = {\n\t  kernelName: LessEqual,\n\t  backendName: 'webgl',\n\t  kernelFunc: lessEqual$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction linSpace$1(args) {\n\t  var backend = args.backend,\n\t      attrs = args.attrs;\n\t  var start = attrs.start,\n\t      stop = attrs.stop,\n\t      num = attrs.num; // TODO: Use CPU implementation due to the precision problem in Safari.\n\n\t  var outVals = linSpaceImplCPU(start, stop, num);\n\t  return backend.makeTensorInfo([outVals.length], 'float32', outVals);\n\t}\n\tvar linSpaceConfig$1 = {\n\t  kernelName: LinSpace,\n\t  backendName: 'webgl',\n\t  kernelFunc: linSpace$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar LOG = \"if (x < 0.0) return NAN;\\n  return log(x);\";\n\tvar LOG_PACKED = \"\\n  vec4 result = log(x);\\n  vec4 isNaN = vec4(lessThan(x, vec4(0.0)));\\n  result.r = isNaN.r == 1.0 ? NAN : result.r;\\n  result.g = isNaN.g == 1.0 ? NAN : result.g;\\n  result.b = isNaN.b == 1.0 ? NAN : result.b;\\n  result.a = isNaN.a == 1.0 ? NAN : result.a;\\n\\n  return result;\\n\";\n\tvar log$c = unaryKernelFunc$1({\n\t  opSnippet: LOG,\n\t  packedOpSnippet: LOG_PACKED,\n\t  cpuKernelImpl: logImplCPU\n\t});\n\tvar logConfig$1 = {\n\t  kernelName: Log,\n\t  backendName: 'webgl',\n\t  kernelFunc: log$c\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar LOG1P = \"return log(1.0 + x);\";\n\tvar log1p$2 = unaryKernelFunc$1({\n\t  opSnippet: LOG1P\n\t});\n\tvar log1pConfig$1 = {\n\t  kernelName: Log1p,\n\t  backendName: 'webgl',\n\t  kernelFunc: log1p$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar LOGICAL_AND = \"return float(a >= 1.0 && b >= 1.0);\";\n\tvar LOGICAL_AND_PACKED = \"\\n  return vec4(\\n    vec4(greaterThanEqual(a, vec4(1.0))) *\\n    vec4(greaterThanEqual(b, vec4(1.0))));\\n\";\n\tvar logicalAnd$2 = binaryKernelFunc$1({\n\t  opSnippet: LOGICAL_AND,\n\t  packedOpSnippet: LOGICAL_AND_PACKED,\n\t  dtype: 'bool'\n\t});\n\tvar logicalAndConfig$1 = {\n\t  kernelName: LogicalAnd,\n\t  backendName: 'webgl',\n\t  kernelFunc: logicalAnd$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar LOGICAL_NOT = \"return float(!(x >= 1.0));\";\n\tvar logicalNot$2 = unaryKernelFunc$1({\n\t  opSnippet: LOGICAL_NOT\n\t});\n\tvar logicalNotConfig$1 = {\n\t  kernelName: LogicalNot,\n\t  backendName: 'webgl',\n\t  kernelFunc: logicalNot$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar LOGICAL_OR = \"return float(a >= 1.0 || b >= 1.0);\";\n\tvar LOGICAL_OR_PACKED = \"\\n  return min(\\n    vec4(greaterThanEqual(a, vec4(1.0))) +\\n    vec4(greaterThanEqual(b, vec4(1.0))),\\n    vec4(1.0));\\n\";\n\tvar logicalOr$2 = binaryKernelFunc$1({\n\t  opSnippet: LOGICAL_OR,\n\t  packedOpSnippet: LOGICAL_OR_PACKED,\n\t  dtype: 'bool'\n\t});\n\tvar logicalOrConfig$1 = {\n\t  kernelName: LogicalOr,\n\t  backendName: 'webgl',\n\t  kernelFunc: logicalOr$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar LRNProgram = function LRNProgram(xShape, radius, bias, alpha, beta) {\n\t  this.variableNames = ['x'];\n\t  this.outputShape = [];\n\t  var rad = radius;\n\t  var maxD = xShape[3] - 1;\n\t  this.outputShape = xShape; // optimize pow(bias + alpha * sum, -beta)\n\t  // src: https://github.com/tensorflow/tensorflow/..\n\t  // blob/26033a1644a9c4a5fbe3170ab2e864b6a4ccd4ca/..\n\t  // tensorflow/core/kernels/mkl_lrn_op.cc#L320\n\n\t  var powOperator;\n\t  var basis = \"float(\" + bias + \") + float(\" + alpha + \") * sum\";\n\n\t  if (beta === 0.5) {\n\t    powOperator = \"inversesqrt(\" + basis + \")\";\n\t  } else if (beta === 1.0) {\n\t    powOperator = \"1.0/(\" + basis + \")\";\n\t  } else {\n\t    powOperator = \"exp(log(\" + basis + \") * float(-\" + beta + \"));\";\n\t  }\n\n\t  this.userCode = \"\\n      void main() {\\n        ivec4 coords = getOutputCoords();\\n        int b = coords[0];\\n        int r = coords[1];\\n        int c = coords[2];\\n        int d = coords[3];\\n        float x = getX(b, r, c, d);\\n        float sum = 0.0;\\n        for (int j = -\" + rad + \"; j <= \" + rad + \"; j++) {\\n          int idx = d + j;\\n          if (idx >= 0 && idx <=  \" + maxD + \") {\\n            float z = getX(b, r, c, idx);\\n            sum += z * z;\\n          }\\n        }\\n        float val = x * \" + powOperator + \";\\n        setOutput(val);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar LRNPackedProgram = function LRNPackedProgram(xShape, radius, bias, alpha, beta) {\n\t  this.variableNames = ['x'];\n\t  this.outputShape = [];\n\t  this.packedInputs = true;\n\t  this.packedOutput = true;\n\t  var rad = radius;\n\t  var maxD = xShape[3] - 1;\n\t  this.outputShape = xShape; // optimize pow(bias + alpha * sum, -beta)\n\t  // src: https://github.com/tensorflow/tensorflow/..\n\t  // blob/26033a1644a9c4a5fbe3170ab2e864b6a4ccd4ca/..\n\t  // tensorflow/core/kernels/mkl_lrn_op.cc#L320\n\n\t  var powOperator;\n\t  var basis = \"float(\" + bias + \") + float(\" + alpha + \") * sum\";\n\n\t  if (beta === 0.5) {\n\t    powOperator = \"inversesqrt(\" + basis + \")\";\n\t  } else if (beta === 1.0) {\n\t    powOperator = \"1.0/(\" + basis + \")\";\n\t  } else {\n\t    powOperator = \"exp(log(\" + basis + \") * float(-\" + beta + \"));\";\n\t  }\n\n\t  this.userCode = \"\\n      void main() {\\n        ivec4 coords = getOutputCoords();\\n        int b = coords.x;\\n        int r = coords.y;\\n        int c = coords.z;\\n        int d = coords.w;\\n\\n        bool hasNextCol = d < \" + this.outputShape[3] + \";\\n        bool hasNextRow = c < \" + this.outputShape[2] + \";\\n\\n        vec4 sum = vec4(0.);\\n        vec4 xFragAtOutputCoords = getX(b, r, c, d);\\n\\n        vec4 xAtOutputCoords = vec4(\\n          getChannel(xFragAtOutputCoords, vec2(c, d)),\\n          hasNextCol ?\\n            getChannel(xFragAtOutputCoords, vec2(c, d + 1)) : 0.0,\\n          hasNextRow ?\\n            getChannel(xFragAtOutputCoords , vec2(c + 1, d)) : 0.0,\\n          (hasNextRow && hasNextCol) ?\\n            getChannel(xFragAtOutputCoords, vec2(c + 1, d + 1)) : 0.0\\n        );\\n\\n        int firstChannel = d - \" + rad + \";\\n        vec2 cache = vec2(0.);\\n        if(firstChannel >= 0){\\n          vec4 firstChannelFrag = getX(b, r, c, firstChannel);\\n          cache.x = getChannel(firstChannelFrag, vec2(c, firstChannel));\\n            if(hasNextRow){\\n              cache.y = getChannel(firstChannelFrag, vec2(c + 1, firstChannel));\\n            }\\n        }\\n\\n        ivec2 depth = ivec2(d, d + 1);\\n        for (int j = - \" + rad + \"; j <= \" + rad + \"; j++) {\\n          ivec2 idx = depth + j;\\n          bvec2 aboveLowerBound = greaterThanEqual(idx, ivec2(0));\\n          bvec2 belowUpperBound = lessThanEqual(idx, ivec2(\" + maxD + \"));\\n\\n          bool depthInRange = aboveLowerBound.x && belowUpperBound.x;\\n          bool depthPlusOneInRange = aboveLowerBound.y && belowUpperBound.y;\\n\\n          if(depthInRange || depthPlusOneInRange){\\n            vec4 z = vec4(0.);\\n            vec4 xFragAtCurrentDepth;\\n            z.xz = cache.xy;\\n            if(depthPlusOneInRange && hasNextCol){\\n              xFragAtCurrentDepth = idx.y != d ?\\n                getX(b, r, c, idx.y) : xFragAtOutputCoords;\\n              z.y = getChannel(xFragAtCurrentDepth, vec2(c, idx.y));\\n              if(hasNextRow){\\n                z.w = getChannel(xFragAtCurrentDepth, vec2(c + 1, idx.y));\\n              }\\n            }\\n            cache.xy = z.yw;\\n            sum += z * z;\\n          }\\n        }\\n        vec4 result = xAtOutputCoords * \" + powOperator + \";\\n        setOutput(result);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar lrn = function lrn(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var depthRadius = attrs.depthRadius,\n\t      bias = attrs.bias,\n\t      alpha = attrs.alpha,\n\t      beta = attrs.beta;\n\t  var program = env().getBool('WEBGL_PACK_NORMALIZATION') ? new LRNPackedProgram(x.shape, depthRadius, bias, alpha, beta) : new LRNProgram(x.shape, depthRadius, bias, alpha, beta);\n\t  return backend.runWebGLProgram(program, [x], x.dtype);\n\t}; // tslint:disable-next-line: variable-name\n\n\tvar LRNConfig = {\n\t  kernelName: LRN,\n\t  backendName: 'webgl',\n\t  kernelFunc: lrn\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar LRNGradProgram = function LRNGradProgram(inputShape, depthRadius, bias, alpha, beta) {\n\t  this.variableNames = ['inputImage', 'outputImage', 'dy'];\n\t  this.outputShape = [];\n\t  this.outputShape = inputShape;\n\t  this.depth = inputShape[3];\n\t  this.depthRadius = depthRadius;\n\t  this.bias = bias;\n\t  this.alpha = alpha;\n\t  this.beta = beta;\n\t  this.userCode = \"\\n      void main() {\\n        ivec4 coords = getOutputCoords();\\n        int b = coords[0];\\n        int r = coords[1];\\n        int c = coords[2];\\n\\n        float result = 0.0;\\n        for (int d = 0; d < \" + this.depth + \"; ++d) {\\n          int depthBegin = int(max(0.0, float(d - \" + depthRadius + \")));\\n          int depthEnd = int(min(float(\" + this.depth + \"),\\n              float(d + \" + depthRadius + \" + 1)));\\n\\n          const int MIN_DEPTH_BEGIN = 0;\\n          const int MAX_DEPTH_END = \" + this.depth + \";\\n\\n          float norm = 0.0;\\n          for (int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k) {\\n            if (k < depthBegin){\\n              continue;\\n            }\\n            else if (k >= depthBegin && k < depthEnd) {\\n              norm += getInputImage(b, r, c, k) * getInputImage(b, r, c, k);\\n            }\\n            else {\\n              break;\\n            }\\n          }\\n\\n          norm = float(\" + alpha + \") * norm + float(\" + bias + \");\\n\\n          for(int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k){\\n            if (k < depthBegin){\\n              continue;\\n            }\\n            else if (k >= depthBegin && k < depthEnd){\\n              float dyi = -2.0 * float(\" + alpha + \")\\n                * float(\" + beta + \")\\n                * getInputImage(b ,r ,c, k) * getOutputImage(b, r, c, d)\\n                / norm;\\n              if (k == d) {\\n                dyi += pow(norm, -1.0 * \" + beta + \");\\n              }\\n              if (k == coords[3]) {\\n                dyi *= getDy(b, r, c, d);\\n                result += dyi;\\n              }\\n            }\\n            else {\\n              break;\\n            }\\n          }\\n      }\\n      setOutput(result);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar lrnGrad = function lrnGrad(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      y = inputs.y,\n\t      dy = inputs.dy;\n\t  var depthRadius = attrs.depthRadius,\n\t      bias = attrs.bias,\n\t      alpha = attrs.alpha,\n\t      beta = attrs.beta;\n\t  var program = new LRNGradProgram(x.shape, depthRadius, bias, alpha, beta);\n\t  return backend.runWebGLProgram(program, [x, y, dy], x.dtype);\n\t}; // tslint:disable-next-line: variable-name\n\n\tvar LRNGradConfig = {\n\t  kernelName: LRNGrad,\n\t  backendName: 'webgl',\n\t  kernelFunc: lrnGrad\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction maxImpl$1(x, reduceShape, outShape, backend) {\n\t  var inSize = sizeFromShape(reduceShape);\n\t  var xSize = sizeFromShape(x.shape);\n\t  var batchSize = xSize / inSize;\n\t  var reshapedInput = reshape$3({\n\t    inputs: {\n\t      x: x\n\t    },\n\t    attrs: {\n\t      shape: [batchSize, inSize]\n\t    },\n\t    backend: backend\n\t  });\n\t  var reduced = reduce(reshapedInput, x.dtype, 'max', backend);\n\t  var reshapedOutput = reshape$3({\n\t    inputs: {\n\t      x: reduced\n\t    },\n\t    attrs: {\n\t      shape: outShape\n\t    },\n\t    backend: backend\n\t  });\n\t  backend.disposeIntermediateTensorInfo(reshapedInput);\n\t  backend.disposeIntermediateTensorInfo(reduced);\n\t  return reshapedOutput;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction max$7(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var reductionIndices = attrs.reductionIndices,\n\t      keepDims = attrs.keepDims;\n\t  var xRank = x.shape.length;\n\t  var origAxes = parseAxisParam(reductionIndices, x.shape);\n\t  var axes = origAxes;\n\t  var permutedAxes = getAxesPermutation(axes, xRank);\n\t  var maxInputIsTransposed = permutedAxes != null;\n\t  var shouldExecuteOnCPU = backend.shouldExecuteOnCPU([x]);\n\t  var maxInput = x;\n\n\t  if (maxInputIsTransposed) {\n\t    if (shouldExecuteOnCPU) {\n\t      var xTexData = backend.texData.get(maxInput.dataId);\n\t      var values = xTexData.values;\n\t      var newShape = new Array(xRank);\n\n\t      for (var i = 0; i < newShape.length; i++) {\n\t        newShape[i] = x.shape[permutedAxes[i]];\n\t      }\n\n\t      var maxInputValues = transposeImplCPU(values, x.shape, x.dtype, permutedAxes, newShape);\n\t      maxInput = backend.makeTensorInfo(newShape, x.dtype);\n\t      var maxInputData = backend.texData.get(maxInput.dataId);\n\t      maxInputData.values = maxInputValues;\n\t    } else {\n\t      maxInput = transposeImpl$1(x, permutedAxes, backend);\n\t    }\n\n\t    axes = getInnerMostAxes(axes.length, xRank);\n\t  }\n\n\t  assertAxesAreInnerMostDims('max', axes, xRank);\n\n\t  var _backend_util$compute = computeOutAndReduceShapes(maxInput.shape, axes),\n\t      maxOutShape = _backend_util$compute[0],\n\t      reduceShape = _backend_util$compute[1];\n\n\t  var outShape = maxOutShape;\n\n\t  if (keepDims) {\n\t    // rather than reshape at the end, set the target shape here.\n\t    outShape = expandShapeToKeepDim(maxOutShape, origAxes);\n\t  }\n\n\t  var out;\n\n\t  if (shouldExecuteOnCPU) {\n\t    var _xTexData = backend.texData.get(maxInput.dataId);\n\n\t    var _values = _xTexData.values;\n\t    var outValues = maxImplCPU(_values, sizeFromShape(reduceShape), outShape, x.dtype);\n\t    out = backend.makeTensorInfo(outShape, x.dtype);\n\t    var outData = backend.texData.get(out.dataId);\n\t    outData.values = outValues;\n\t  } else {\n\t    out = maxImpl$1(maxInput, reduceShape, outShape, backend);\n\t  }\n\n\t  if (maxInputIsTransposed) {\n\t    backend.disposeIntermediateTensorInfo(maxInput);\n\t  }\n\n\t  return out;\n\t}\n\tvar maxConfig$1 = {\n\t  kernelName: Max,\n\t  backendName: 'webgl',\n\t  kernelFunc: max$7\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar MAXIMUM = CHECK_NAN_SNIPPET$1 + \"\\n  return max(a, b);\\n\";\n\tvar MAXIMUM_PACKED = \"\\n  vec4 result = vec4(max(a, b));\\n  vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0));\\n  \" + CHECK_NAN_SNIPPET$2 + \"\\n  return result;\\n\";\n\tvar maximum$4 = binaryKernelFunc$1({\n\t  opSnippet: MAXIMUM,\n\t  packedOpSnippet: MAXIMUM_PACKED,\n\t  cpuKernelImpl: maximumImplCPU\n\t});\n\tvar maximumConfig$1 = {\n\t  kernelName: Maximum,\n\t  backendName: 'webgl',\n\t  kernelFunc: maximum$4\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction maxPool$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  assertNotComplex$1(x, 'maxPool');\n\t  var filterSize = attrs.filterSize,\n\t      strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dimRoundingMode = attrs.dimRoundingMode;\n\t  var dilations = 1;\n\t  assert(eitherStridesOrDilationsAreOne(strides, dilations), function () {\n\t    return 'Error in maxPool: Either strides or dilations must be 1. ' + (\"Got strides \" + strides + \" and dilations '\" + dilations + \"'\");\n\t  });\n\t  var convInfo = computePool2DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode);\n\n\t  if (convInfo.filterWidth === 1 && convInfo.filterHeight === 1 && arraysEqual(convInfo.inShape, convInfo.outShape)) {\n\t    return identity$2({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend\n\t    });\n\t  }\n\n\t  var maxPoolProgram = new Pool2DProgram(convInfo, 'max', false);\n\t  return backend.runWebGLProgram(maxPoolProgram, [x], x.dtype);\n\t}\n\tvar maxPoolConfig$1 = {\n\t  kernelName: MaxPool,\n\t  backendName: 'webgl',\n\t  kernelFunc: maxPool$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction maxPool3d$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var filterSize = attrs.filterSize,\n\t      strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dataFormat = attrs.dataFormat,\n\t      dimRoundingMode = attrs.dimRoundingMode;\n\t  var dilations = [1, 1, 1];\n\t  var convInfo = computePool3DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode, dataFormat);\n\t  var maxPoolProgram = new Pool3DProgram(convInfo, 'max', false);\n\t  return backend.runWebGLProgram(maxPoolProgram, [x], x.dtype);\n\t}\n\tvar maxPool3DConfig$1 = {\n\t  kernelName: MaxPool3D,\n\t  backendName: 'webgl',\n\t  kernelFunc: maxPool3d$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar MaxPool2DBackpropProgram = function MaxPool2DBackpropProgram(convInfo) {\n\t  this.variableNames = ['dy', 'maxPos'];\n\t  this.outputShape = convInfo.inShape;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var dilationHeight = convInfo.dilationHeight;\n\t  var effectiveFilterHeight = convInfo.effectiveFilterHeight;\n\t  var effectiveFilterWidth = convInfo.effectiveFilterWidth;\n\t  var padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n\t  var padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n\t  var lastIndex = effectiveFilterHeight * effectiveFilterWidth - 1;\n\t  this.userCode = \"\\n      const ivec2 pads = ivec2(\" + padTop + \", \" + padLeft + \");\\n\\n      void main() {\\n        ivec4 coords = getOutputCoords();\\n        int b = coords[0];\\n        int d = coords[3];\\n\\n        ivec2 dyRCCorner = coords.yz - pads;\\n        int dyRCorner = dyRCCorner.x;\\n        int dyCCorner = dyRCCorner.y;\\n\\n        // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\\n        // ? = to be determined. : = across all values in that axis.\\n        float dotProd = 0.0;\\n        for (int wR = 0; wR < \" + effectiveFilterHeight + \";\\n          wR += \" + dilationHeight + \") {\\n          float dyR = float(dyRCorner + wR) / \" + strideHeight + \".0;\\n\\n          if (dyR < 0.0 || dyR >= \" + convInfo.outHeight + \".0 || fract(dyR) > 0.0) {\\n            continue;\\n          }\\n          int idyR = int(dyR);\\n\\n          for (int wC = 0; wC < \" + effectiveFilterWidth + \"; wC++) {\\n            float dyC = float(dyCCorner + wC) / \" + strideWidth + \".0;\\n\\n            if (dyC < 0.0 || dyC >= \" + convInfo.outWidth + \".0 ||\\n                fract(dyC) > 0.0) {\\n              continue;\\n            }\\n            int idyC = int(dyC);\\n\\n            float dyValue = getDy(b, idyR, idyC, d);\\n            int maxPosValue = \" + lastIndex + \" - int(getMaxPos(b, idyR, idyC, d));\\n\\n            // Get the current value, check it against the value from the\\n            // position matrix.\\n            int curPosValue = wR * \" + effectiveFilterWidth + \" + wC;\\n            float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\\n\\n            dotProd += dyValue * mask;\\n          }\\n        }\\n        setOutput(dotProd);\\n      }\\n    \";\n\t};\n\tvar MaxPool3DBackpropProgram = function MaxPool3DBackpropProgram(convInfo) {\n\t  this.variableNames = ['dy', 'maxPos'];\n\t  this.outputShape = convInfo.inShape;\n\t  var strideDepth = convInfo.strideDepth;\n\t  var strideHeight = convInfo.strideHeight;\n\t  var strideWidth = convInfo.strideWidth;\n\t  var dilationDepth = convInfo.dilationDepth;\n\t  var dilationHeight = convInfo.dilationHeight;\n\t  var dilationWidth = convInfo.dilationWidth;\n\t  var effectiveFilterDepth = convInfo.effectiveFilterDepth;\n\t  var effectiveFilterHeight = convInfo.effectiveFilterHeight;\n\t  var effectiveFilterWidth = convInfo.effectiveFilterWidth;\n\t  var padFront = effectiveFilterDepth - 1 - convInfo.padInfo.front;\n\t  var padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n\t  var padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n\t  var lastIndex = effectiveFilterDepth * effectiveFilterHeight * effectiveFilterWidth - 1;\n\t  this.userCode = \"\\n      const ivec3 pads = ivec3(\" + padFront + \", \" + padTop + \", \" + padLeft + \");\\n\\n      void main() {\\n        ivec5 coords = getOutputCoords();\\n        int batch = coords.x;\\n        int ch = coords.u;\\n\\n        ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\\n        int dyDCorner = dyCorner.x;\\n        int dyRCorner = dyCorner.y;\\n        int dyCCorner = dyCorner.z;\\n\\n        // Convolve dy(?, ?, ?, ch) with pos mask(:, :, :, d) to get\\n        // dx(xD, xR, xC, ch).\\n        // ? = to be determined. : = across all values in that axis.\\n        float dotProd = 0.0;\\n\\n        for (int wD = 0; wD < \" + effectiveFilterDepth + \";\\n           wD += \" + dilationDepth + \") {\\n          float dyD = float(dyDCorner + wD) / \" + strideDepth + \".0;\\n\\n          if (dyD < 0.0 || dyD >= \" + convInfo.outDepth + \".0 || fract(dyD) > 0.0) {\\n            continue;\\n          }\\n          int idyD = int(dyD);\\n\\n          for (int wR = 0; wR < \" + effectiveFilterHeight + \";\\n              wR += \" + dilationHeight + \") {\\n            float dyR = float(dyRCorner + wR) / \" + strideHeight + \".0;\\n\\n            if (dyR < 0.0 || dyR >= \" + convInfo.outHeight + \".0 ||\\n                fract(dyR) > 0.0) {\\n              continue;\\n            }\\n            int idyR = int(dyR);\\n\\n            for (int wC = 0; wC < \" + effectiveFilterWidth + \";\\n                wC += \" + dilationWidth + \") {\\n              float dyC = float(dyCCorner + wC) / \" + strideWidth + \".0;\\n\\n              if (dyC < 0.0 || dyC >= \" + convInfo.outWidth + \".0 ||\\n                  fract(dyC) > 0.0) {\\n                continue;\\n              }\\n              int idyC = int(dyC);\\n\\n              float dyValue = getDy(batch, idyD, idyR, idyC, ch);\\n              int maxPosValue = \" + lastIndex + \" -\\n                  int(getMaxPos(batch, idyD, idyR, idyC, ch));\\n\\n              // Get the current value, check it against the value from the\\n              // position matrix.\\n              int curPosValue =\\n                  wD * \" + effectiveFilterHeight + \" * \" + effectiveFilterWidth + \" +\\n                  wR * \" + effectiveFilterWidth + \" + wC;\\n              float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\\n\\n              dotProd += dyValue * mask;\\n            }\\n          }\\n        }\\n        setOutput(dotProd);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction maxPool3DGrad$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var dy = inputs.dy,\n\t      input = inputs.input;\n\t  var x = input;\n\t  var filterSize = attrs.filterSize,\n\t      strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dimRoundingMode = attrs.dimRoundingMode;\n\t  var dilations = [1, 1, 1];\n\t  var convInfo = computePool3DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode);\n\t  var maxPool3dPositionsProgram = new Pool3DProgram(convInfo, 'max', true\n\t  /* get positions */\n\t  );\n\t  var maxPool3dPositions = backend.runWebGLProgram(maxPool3dPositionsProgram, [x], x.dtype);\n\t  var maxPoolBackpropProgram = new MaxPool3DBackpropProgram(convInfo);\n\t  var result = backend.runWebGLProgram(maxPoolBackpropProgram, [dy, maxPool3dPositions], x.dtype);\n\t  backend.disposeIntermediateTensorInfo(maxPool3dPositions);\n\t  return result;\n\t}\n\tvar maxPoolGrad3DConfig = {\n\t  kernelName: MaxPool3DGrad,\n\t  backendName: 'webgl',\n\t  kernelFunc: maxPool3DGrad$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction maxPoolGrad$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var dy = inputs.dy,\n\t      input = inputs.input,\n\t      output = inputs.output;\n\t  var x = input;\n\t  assertNotComplex$1([input, output], 'maxPoolGrad');\n\t  var filterSize = attrs.filterSize,\n\t      strides = attrs.strides,\n\t      pad = attrs.pad,\n\t      dimRoundingMode = attrs.dimRoundingMode;\n\t  var convInfo = computePool2DInfo(x.shape, filterSize, strides, 1\n\t  /* dilations */\n\t  , pad, dimRoundingMode);\n\t  var getPositions = true;\n\t  var maxPoolPositionsProgram = new Pool2DProgram(convInfo, 'max', getPositions);\n\t  var maxPoolPositions = backend.runWebGLProgram(maxPoolPositionsProgram, [x], x.dtype);\n\t  var maxPoolBackPropProgram = new MaxPool2DBackpropProgram(convInfo);\n\t  var result = backend.runWebGLProgram(maxPoolBackPropProgram, [dy, maxPoolPositions], x.dtype);\n\t  backend.disposeIntermediateTensorInfo(maxPoolPositions);\n\t  return result;\n\t}\n\tvar maxPoolGradConfig$2 = {\n\t  kernelName: MaxPoolGrad,\n\t  backendName: 'webgl',\n\t  kernelFunc: maxPoolGrad$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction maxPoolWithArgmaxImpl$1(x, includeBatchInIndex, convInfo, backend) {\n\t  var program = new Pool2DProgram(convInfo, 'max', false);\n\t  var poolOutput = backend.runWebGLProgram(program, [x], 'float32');\n\t  program = new Pool2DProgram(convInfo, 'max', true, true, includeBatchInIndex);\n\t  var indexOutput = backend.runWebGLProgram(program, [x], 'float32');\n\t  return [poolOutput, indexOutput];\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar maxPoolWithArgmaxConfig$1 = {\n\t  kernelName: MaxPoolWithArgmax,\n\t  backendName: 'webgl',\n\t  kernelFunc: function kernelFunc(_ref) {\n\t    var inputs = _ref.inputs,\n\t        attrs = _ref.attrs,\n\t        backend = _ref.backend;\n\t    var x = inputs.x;\n\t    var filterSize = attrs.filterSize,\n\t        strides = attrs.strides,\n\t        pad = attrs.pad,\n\t        includeBatchInIndex = attrs.includeBatchInIndex;\n\t    var webglBackend = backend;\n\t    assert(x.shape.length === 4, function () {\n\t      return \"Error in maxPool: input must be rank 4 but got rank \" + x.shape.length + \".\";\n\t    });\n\t    var dilations = [1, 1];\n\t    assert(eitherStridesOrDilationsAreOne(strides, dilations), function () {\n\t      return 'Error in maxPool: Either strides or dilations must be 1. ' + (\"Got strides \" + strides + \" and dilations '\" + dilations + \"'\");\n\t    });\n\t    var convInfo = computePool2DInfo(x.shape, filterSize, strides, dilations, pad);\n\n\t    var _maxPoolWithArgmaxImp = maxPoolWithArgmaxImpl$1(x, includeBatchInIndex, convInfo, webglBackend),\n\t        result = _maxPoolWithArgmaxImp[0],\n\t        indexes = _maxPoolWithArgmaxImp[1];\n\n\t    return [result, indexes];\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction meanImpl(x, reduceShape, outShape, backend) {\n\t  var inSize = sizeFromShape(reduceShape);\n\t  var xSize = sizeFromShape(x.shape);\n\t  var batchSize = xSize / inSize;\n\t  var reshapedInput = reshape$3({\n\t    inputs: {\n\t      x: x\n\t    },\n\t    attrs: {\n\t      shape: [batchSize, inSize]\n\t    },\n\t    backend: backend\n\t  });\n\t  var reduced = reduce(reshapedInput, 'float32', 'mean', backend);\n\t  var reshapedOutput = reshape$3({\n\t    inputs: {\n\t      x: reduced\n\t    },\n\t    attrs: {\n\t      shape: outShape\n\t    },\n\t    backend: backend\n\t  });\n\t  backend.disposeIntermediateTensorInfo(reshapedInput);\n\t  backend.disposeIntermediateTensorInfo(reduced);\n\t  return reshapedOutput;\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar meanConfig$1 = {\n\t  kernelName: Mean,\n\t  backendName: 'webgl',\n\t  kernelFunc: function kernelFunc(_ref) {\n\t    var inputs = _ref.inputs,\n\t        attrs = _ref.attrs,\n\t        backend = _ref.backend;\n\t    var x = inputs.x;\n\t    var keepDims = attrs.keepDims,\n\t        axis = attrs.axis;\n\t    var webglBackend = backend;\n\t    var xRank = x.shape.length;\n\t    var origAxes = parseAxisParam(axis, x.shape);\n\t    var axes = origAxes;\n\t    var permutedAxes = getAxesPermutation(axes, xRank);\n\t    var meanInputIsTransposed = permutedAxes != null;\n\t    var shouldExecuteOnCPU = webglBackend.shouldExecuteOnCPU([x]);\n\t    var intermediates = [];\n\t    var meanInput = x;\n\n\t    if (meanInputIsTransposed) {\n\t      if (shouldExecuteOnCPU) {\n\t        var xTexData = webglBackend.texData.get(meanInput.dataId);\n\t        var values = xTexData.values;\n\t        var newShape = new Array(xRank);\n\n\t        for (var i = 0; i < newShape.length; i++) {\n\t          newShape[i] = x.shape[permutedAxes[i]];\n\t        }\n\n\t        var meanInputValues = transposeImplCPU(values, x.shape, x.dtype, permutedAxes, newShape);\n\t        meanInput = webglBackend.makeTensorInfo(newShape, x.dtype);\n\t        var meanInputData = webglBackend.texData.get(meanInput.dataId);\n\t        meanInputData.values = meanInputValues;\n\t      } else {\n\t        meanInput = transposeImpl$1(x, permutedAxes, webglBackend);\n\t      }\n\n\t      intermediates.push(meanInput);\n\t      axes = getInnerMostAxes(axes.length, xRank);\n\t    }\n\n\t    assertAxesAreInnerMostDims('sum', axes, xRank);\n\n\t    var _backend_util$compute = computeOutAndReduceShapes(meanInput.shape, axes),\n\t        meanOutShape = _backend_util$compute[0],\n\t        reduceShape = _backend_util$compute[1];\n\n\t    var outShape = meanOutShape;\n\n\t    if (keepDims) {\n\t      // rather than reshape at the end, set the target shape here.\n\t      outShape = expandShapeToKeepDim(meanOutShape, origAxes);\n\t    }\n\n\t    var out = meanImpl(meanInput, reduceShape, outShape, webglBackend);\n\n\t    for (var _i = 0, _intermediates = intermediates; _i < _intermediates.length; _i++) {\n\t      var _i2 = _intermediates[_i];\n\t      webglBackend.disposeIntermediateTensorInfo(_i2);\n\t    }\n\n\t    return out;\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction min$c(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var axis = attrs.axis,\n\t      keepDims = attrs.keepDims;\n\t  var xRank = x.shape.length;\n\t  var origAxes = parseAxisParam(axis, x.shape);\n\t  var axes = origAxes;\n\t  var permutedAxes = getAxesPermutation(axes, xRank);\n\t  var permutedX = x;\n\n\t  if (permutedAxes != null) {\n\t    permutedX = transpose$2({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        perm: permutedAxes\n\t      }\n\t    });\n\t    axes = getInnerMostAxes(axes.length, x.shape.length);\n\t  }\n\n\t  assertAxesAreInnerMostDims('min', axes, xRank);\n\n\t  var _backend_util$compute = computeOutAndReduceShapes(permutedX.shape, axes),\n\t      outShape = _backend_util$compute[0],\n\t      reduceShape = _backend_util$compute[1];\n\n\t  var inSize = sizeFromShape(reduceShape);\n\t  var a2D = reshape$3({\n\t    inputs: {\n\t      x: permutedX\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: [-1, inSize]\n\t    }\n\t  });\n\t  var reduced = reduce(a2D, a2D.dtype, 'min', backend);\n\t  var res;\n\n\t  if (keepDims) {\n\t    var newShape = expandShapeToKeepDim(outShape, origAxes);\n\t    res = reshape$3({\n\t      inputs: {\n\t        x: reduced\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: newShape\n\t      }\n\t    });\n\t  } else {\n\t    res = reshape$3({\n\t      inputs: {\n\t        x: reduced\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: outShape\n\t      }\n\t    });\n\t  }\n\n\t  backend.disposeIntermediateTensorInfo(a2D);\n\t  backend.disposeIntermediateTensorInfo(reduced);\n\n\t  if (permutedAxes != null) {\n\t    backend.disposeIntermediateTensorInfo(permutedX);\n\t  }\n\n\t  return res;\n\t}\n\tvar minConfig$1 = {\n\t  kernelName: Min,\n\t  backendName: 'webgl',\n\t  kernelFunc: min$c\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar MINIMUM = CHECK_NAN_SNIPPET$1 + \"\\n  return min(a, b);\\n\";\n\tvar MINIMUM_PACKED = \"\\n  vec4 result = vec4(min(a, b));\\n  vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0));\\n  \" + CHECK_NAN_SNIPPET$2 + \"\\n  return result;\\n\";\n\tvar minimum$4 = binaryKernelFunc$1({\n\t  opSnippet: MINIMUM,\n\t  packedOpSnippet: MINIMUM_PACKED,\n\t  cpuKernelImpl: minimumImplCPU\n\t});\n\tvar minimumConfig$1 = {\n\t  kernelName: Minimum,\n\t  backendName: 'webgl',\n\t  kernelFunc: minimum$4\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar MirrorPadProgram = function MirrorPadProgram(xShape, paddings, mode) {\n\t  this.variableNames = ['x'];\n\t  this.outputShape = paddings.map(function (p, i) {\n\t    return p[0]\n\t    /* beforePad */\n\t    + xShape[i] + p[1];\n\t  }\n\t  /* afterPad */\n\t  );\n\t  var rank = xShape.length;\n\t  var dtype = getCoordsDataType(rank);\n\t  var start = paddings.map(function (p) {\n\t    return p[0];\n\t  }).join(',');\n\t  var end = paddings.map(function (p, i) {\n\t    return p[0] + xShape[i];\n\t  }).join(',');\n\t  var unpackedCoords = ['coords[0]', 'coords[1]', 'coords[2]', 'coords[3]'].slice(0, rank);\n\t  var offset = mode === 'reflect' ? 0 : 1;\n\n\t  if (rank === 1) {\n\t    this.userCode = \"\\n        int start = \" + start + \";\\n        int end = \" + end + \";\\n\\n        void main() {\\n          int outC = getOutputCoords();\\n          if (outC < start) {\\n            outC = start * 2 - outC - \" + offset + \";\\n          } else if(outC >= end) {\\n            outC = (end - 1) * 2 - outC + \" + offset + \";\\n          }\\n          setOutput(getX(outC - start));\\n        }\\n      \";\n\t    return;\n\t  }\n\n\t  this.userCode = \"\\n      \" + dtype + \" start = \" + dtype + \"(\" + start + \");\\n      \" + dtype + \" end = \" + dtype + \"(\" + end + \");\\n\\n      void main() {\\n        \" + dtype + \" outC = getOutputCoords();\\n        for (int i = 0; i < \" + rank + \"; i++) {\\n          if (outC[i] < start[i]) {\\n            outC[i] = start[i] * 2 - outC[i] - \" + offset + \";\\n          } else if(outC[i] >= end[i]) {\\n            outC[i] = (end[i] - 1) * 2 - outC[i] + \" + offset + \";\\n          }\\n        }\\n        \" + dtype + \" coords = outC - start;\\n        setOutput(getX(\" + unpackedCoords + \"));\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t/**\n\t * Example shader code for\n\t * `mirrorPad(tf.tensor1d([1, 2, 3], 'int32'), [[2, 2]], 'reflect')`\n\t * ```\n\t *    const int start = int(2);\n\t *    const int end = int(5);\n\t *\n\t *    void main() {\n\t *       int outputLoc = getOutputCoords();\n\t *       vec4 result = vec4(0.);\n\t *\n\t *       int rc = outputLoc;\n\t *\n\t *       int source = rc;\n\t *       if (source < start) {\n\t *         source = start * 2 - source - 0;\n\t *       } else if (source >= end) {\n\t *         source = (end - 1) * 2 - source + 0;\n\t *       }\n\t *       source -= start;\n\t *\n\t *       result[0] = getChannel(getX(source), source);\n\t *       rc += 1;\n\t *       if(rc < 6) {\n\t *          int source = rc;\n\t *          if (source < start) {\n\t *            source = start * 2 - source - 0;\n\t *          } else if (source >= end) {\n\t *            source = (end - 1) * 2 - source + 0;\n\t *          }\n\t *          source -= start;\n\t *\n\t *         result[1] = getChannel(getX(source), source);\n\t *       }\n\t *\n\t *       setOutput(result);\n\t *     }\n\t * ```\n\t */\n\n\tvar MirrorPadPackedProgram = function MirrorPadPackedProgram(xShape, paddings, mode) {\n\t  this.variableNames = ['x'];\n\t  this.packedInputs = true;\n\t  this.packedOutput = true;\n\t  this.outputShape = paddings.map(function (p, i) {\n\t    return p[0]\n\t    /* beforePad */\n\t    + xShape[i] + p[1];\n\t  }\n\t  /* afterPad */\n\t  );\n\t  var rank = xShape.length;\n\t  var dtype = getCoordsDataType(rank);\n\t  var start = paddings.map(function (p) {\n\t    return p[0];\n\t  }).join(',');\n\t  var end = paddings.map(function (p, i) {\n\t    return p[0] + xShape[i];\n\t  }).join(',');\n\t  var coords = getChannels('rc', rank);\n\t  var source = getChannels('source', rank);\n\t  var cLimit = coords[rank - 1] + \" < \" + this.outputShape[rank - 1];\n\t  var innerDims = rank === 1 ? 'source' : \"vec2(\" + source.slice(-2).join() + \")\";\n\t  var offset = mode === 'reflect' ? 0 : 1;\n\t  var mainLoop = '';\n\n\t  if (rank === 1) {\n\t    var padSetup = \"\\n        \" + dtype + \" source = rc;\\n        if (source < start) {\\n          source = start * 2 - source - \" + offset + \";\\n        } else if (source >= end) {\\n          source = (end - 1) * 2 - source + \" + offset + \";\\n        }\\n        source -= start;\\n      \";\n\t    mainLoop = \"\\n        \" + dtype + \" rc = outputLoc;\\n        \" + padSetup + \"\\n        result[0] = getChannel(getX(\" + source.join() + \"), \" + innerDims + \");\\n        \" + coords[rank - 1] + \" += 1;\\n        if(\" + cLimit + \") {\\n          \" + padSetup + \"\\n          result[1] = getChannel(getX(\" + source.join() + \"), \" + innerDims + \");\\n        }\\n      \";\n\t  } else {\n\t    var _padSetup = \"\\n        \" + dtype + \" source = rc;\\n        \" + dtype + \" lt = \" + dtype + \"(lessThan(source, start));\\n        \" + dtype + \" gte = \" + dtype + \"(greaterThanEqual(source, end));\\n        \" + dtype + \" orig = 1 - (lt + gte);\\n        source = orig * source +\\n                lt * (start * 2 - source - \" + offset + \") +\\n                gte * ((end - 1) * 2 - source + \" + offset + \");\\n        source -= start;\\n      \";\n\n\t    mainLoop = \"\\n        \" + dtype + \" rc = outputLoc;\\n        \" + _padSetup + \"\\n        result[0] = getChannel(getX(\" + source.join() + \"), \" + innerDims + \");\\n        \" + coords[rank - 1] + \" += 1;\\n        if(\" + cLimit + \") {\\n          \" + _padSetup + \"\\n          result[1] = getChannel(getX(\" + source.join() + \"), \" + innerDims + \");\\n        }\\n        rc = outputLoc;\\n        \" + coords[rank - 2] + \" += 1;\\n        if(\" + coords[rank - 2] + \" < \" + this.outputShape[rank - 2] + \") {\\n          \" + _padSetup + \"\\n          result[2] = getChannel(getX(\" + source.join() + \"), \" + innerDims + \");\\n          \" + coords[rank - 1] + \" += 1;\\n          if(\" + cLimit + \") {\\n            \" + _padSetup + \"\\n            result[3] = getChannel(getX(\" + source.join() + \"), \" + innerDims + \");\\n          }\\n        }\\n      \";\n\t  }\n\n\t  this.userCode = \"\\n      const \" + dtype + \" start = \" + dtype + \"(\" + start + \");\\n      const \" + dtype + \" end = \" + dtype + \"(\" + end + \");\\n\\n      void main() {\\n        \" + dtype + \" outputLoc = getOutputCoords();\\n        vec4 result = vec4(0.);\\n        \" + mainLoop + \"\\n        setOutput(result);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar mirrorPadKernelFunc = function mirrorPadKernelFunc(_ref) {\n\t  var inputs = _ref.inputs,\n\t      backend = _ref.backend,\n\t      attrs = _ref.attrs;\n\t  var x = inputs.x;\n\t  var paddings = attrs.paddings,\n\t      mode = attrs.mode;\n\t  var program = env().getBool('WEBGL_PACK_ARRAY_OPERATIONS') ? new MirrorPadPackedProgram(x.shape, paddings, mode) : new MirrorPadProgram(x.shape, paddings, mode);\n\t  var output = backend.runWebGLProgram(program, [x], x.dtype);\n\t  return output;\n\t};\n\tvar mirrorPadConfig$1 = {\n\t  kernelName: MirrorPad,\n\t  backendName: 'webgl',\n\t  kernelFunc: mirrorPadKernelFunc\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar MOD = \"if (b == 0.0) return NAN;\\n  return mod(a, b);\";\n\tvar MOD_PACKED = \"\\n  vec4 result = mod(a, b);\\n  vec4 isNaN = vec4(equal(b, vec4(0.0)));\\n  \" + CHECK_NAN_SNIPPET$2 + \"\\n  return result;\\n\";\n\tvar mod$2 = binaryKernelFunc$1({\n\t  opSnippet: MOD,\n\t  packedOpSnippet: MOD_PACKED\n\t});\n\tvar modConfig$1 = {\n\t  kernelName: Mod,\n\t  backendName: 'webgl',\n\t  kernelFunc: mod$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar MultinomialProgram = /*#__PURE__*/function () {\n\t  function MultinomialProgram(batchSize, numOutcomes, numSamples) {\n\t    this.variableNames = ['probs'];\n\t    this.outputShape = [batchSize, numSamples];\n\t    this.userCode = \"\\n      uniform float seed;\\n\\n      void main() {\\n        ivec2 coords = getOutputCoords();\\n        int batch = coords[0];\\n\\n        float r = random(seed);\\n        float cdf = 0.0;\\n\\n        for (int i = 0; i < \" + (numOutcomes - 1) + \"; i++) {\\n          cdf += getProbs(batch, i);\\n\\n          if (r < cdf) {\\n            setOutput(float(i));\\n            return;\\n          }\\n        }\\n\\n        // If no other event happened, last event happened.\\n        setOutput(float(\" + (numOutcomes - 1) + \"));\\n      }\\n    \";\n\t  }\n\n\t  var _proto = MultinomialProgram.prototype;\n\n\t  _proto.getCustomSetupFunc = function getCustomSetupFunc(seed) {\n\t    var _this = this;\n\n\t    return function (gpgpu, webGLProgram) {\n\t      if (_this.seedLoc == null) {\n\t        _this.seedLoc = gpgpu.getUniformLocation(webGLProgram, 'seed');\n\t      }\n\n\t      gpgpu.gl.uniform1f(_this.seedLoc, seed);\n\t    };\n\t  };\n\n\t  return MultinomialProgram;\n\t}();\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\t// floored can cause errors.\n\n\tvar DIV = \"\\nif (a == b) {\\n  return 1.0;\\n};\\nreturn a / b;\"; // We do the same as in ./binaryop_gpu, with vec4 and ivec4.\n\t// On Linux, the vectorized implementation produces NaNs when a and b are 0.\n\n\tvar DIV_PACKED = \"\\n  // vec4 one = vec4(equal(a, b));\\n  // return one + (vec4(1.0) - one) * a / b;\\n  vec4 result = a / b;\\n  if(a.x == b.x) {\\n    result.x = 1.;\\n  }\\n  if(a.y == b.y) {\\n    result.y = 1.;\\n  }\\n  if(a.z == b.z) {\\n    result.z = 1.;\\n  }\\n  if(a.w == b.w) {\\n    result.w = 1.;\\n  }\\n\\n  return result;\\n\";\n\tvar realDiv = binaryKernelFunc$1({\n\t  opSnippet: DIV,\n\t  packedOpSnippet: DIV_PACKED,\n\t  checkOutOfBounds: true\n\t});\n\tvar realDivConfig$1 = {\n\t  kernelName: RealDiv,\n\t  backendName: 'webgl',\n\t  kernelFunc: realDiv\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar SUB = 'return a - b;';\n\tvar sub$2 = binaryKernelFunc$1({\n\t  opSnippet: SUB,\n\t  packedOpSnippet: SUB,\n\t  supportsComplex: true,\n\t  cpuKernelImpl: subImplCPU\n\t});\n\tvar subConfig$1 = {\n\t  kernelName: Sub,\n\t  backendName: 'webgl',\n\t  kernelFunc: sub$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction softmax$3(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var logits = inputs.logits;\n\t  var dim = attrs.dim;\n\t  var axes = parseAxisParam([dim], logits.shape);\n\t  var maxLogit = max$7({\n\t    inputs: {\n\t      x: logits\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      reductionIndices: axes,\n\t      keepDims: false\n\t    }\n\t  });\n\t  var expandedShape = expandShapeToKeepDim(maxLogit.shape, axes);\n\t  var maxLogitsReshaped = reshape$3({\n\t    inputs: {\n\t      x: maxLogit\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: expandedShape\n\t    }\n\t  });\n\t  var a = sub$2({\n\t    inputs: {\n\t      a: logits,\n\t      b: maxLogitsReshaped\n\t    },\n\t    backend: backend\n\t  });\n\t  var b = exp$5({\n\t    inputs: {\n\t      x: a\n\t    },\n\t    backend: backend\n\t  });\n\t  var sumExp = sum$4({\n\t    inputs: {\n\t      x: b\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      axis: axes,\n\t      keepDims: false\n\t    }\n\t  });\n\t  var sumExpReshaped = reshape$3({\n\t    inputs: {\n\t      x: sumExp\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: expandedShape\n\t    }\n\t  });\n\t  var res = realDiv({\n\t    inputs: {\n\t      a: b,\n\t      b: sumExpReshaped\n\t    },\n\t    backend: backend\n\t  });\n\t  backend.disposeIntermediateTensorInfo(maxLogit);\n\t  backend.disposeIntermediateTensorInfo(maxLogitsReshaped);\n\t  backend.disposeIntermediateTensorInfo(a);\n\t  backend.disposeIntermediateTensorInfo(b);\n\t  backend.disposeIntermediateTensorInfo(sumExp);\n\t  backend.disposeIntermediateTensorInfo(sumExpReshaped);\n\t  return res;\n\t}\n\tvar softmaxConfig$1 = {\n\t  kernelName: Softmax,\n\t  backendName: 'webgl',\n\t  kernelFunc: softmax$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction multinomial$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var logits = inputs.logits;\n\t  var numSamples = attrs.numSamples,\n\t      seed = attrs.seed,\n\t      normalized = attrs.normalized;\n\t  var probs = normalized ? logits : softmax$3({\n\t    inputs: {\n\t      logits: logits\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      dim: logits.shape.length - 1\n\t    }\n\t  });\n\t  var batchSize = probs.shape[0];\n\t  var numOutcomes = probs.shape[1];\n\t  var program = new MultinomialProgram(batchSize, numOutcomes, numSamples);\n\t  var customSetup = program.getCustomSetupFunc(seed);\n\t  var res = backend.runWebGLProgram(program, [probs], 'int32', customSetup);\n\n\t  if (!normalized) {\n\t    backend.disposeIntermediateTensorInfo(probs);\n\t  }\n\n\t  return res;\n\t}\n\tvar multinomialConfig$1 = {\n\t  kernelName: Multinomial,\n\t  backendName: 'webgl',\n\t  kernelFunc: multinomial$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar NEG = \"return -x;\"; // This doesn't use unaryKernelFunc because negImplCPU is not of type\n\t// SimpleUnaryKernelImplCPU.\n\n\tfunction neg$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var x = inputs.x;\n\n\t  if (backend.shouldExecuteOnCPU([x])) {\n\t    var xData = backend.texData.get(x.dataId);\n\n\t    var _negImplCPU = negImplCPU(xData.values, x.shape, x.dtype),\n\t        outValues = _negImplCPU[0],\n\t        newShape = _negImplCPU[1];\n\n\t    return backend.makeTensorInfo(newShape, x.dtype, outValues);\n\t  }\n\n\t  var program;\n\n\t  if (env().getBool('WEBGL_PACK_UNARY_OPERATIONS')) {\n\t    program = new UnaryOpPackedProgram(x.shape, NEG);\n\t  } else {\n\t    program = new UnaryOpProgram(x.shape, NEG);\n\t  }\n\n\t  return backend.runWebGLProgram(program, [x], x.dtype);\n\t}\n\tvar negConfig$1 = {\n\t  kernelName: Neg,\n\t  backendName: 'webgl',\n\t  kernelFunc: neg$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar nonMaxSuppressionV3Impl$2 = nonMaxSuppressionV3Impl;\n\tfunction nonMaxSuppressionV3$1(args) {\n\t  warn('tf.nonMaxSuppression() in webgl locks the UI thread. ' + 'Call tf.nonMaxSuppressionAsync() instead');\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var boxes = inputs.boxes,\n\t      scores = inputs.scores;\n\t  var maxOutputSize = attrs.maxOutputSize,\n\t      iouThreshold = attrs.iouThreshold,\n\t      scoreThreshold = attrs.scoreThreshold;\n\t  var boxesVals = backend.readSync(boxes.dataId);\n\t  var scoresVals = backend.readSync(scores.dataId);\n\n\t  var _nonMaxSuppressionV3I = nonMaxSuppressionV3Impl$2(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold),\n\t      selectedIndices = _nonMaxSuppressionV3I.selectedIndices;\n\n\t  return backend.makeTensorInfo([selectedIndices.length], 'int32', new Int32Array(selectedIndices));\n\t}\n\tvar nonMaxSuppressionV3Config$1 = {\n\t  kernelName: NonMaxSuppressionV3,\n\t  backendName: 'webgl',\n\t  kernelFunc: nonMaxSuppressionV3$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar nonMaxSuppressionV4Impl$2 = nonMaxSuppressionV4Impl;\n\tfunction nonMaxSuppressionV4$1(args) {\n\t  warn('tf.nonMaxSuppression() in webgl locks the UI thread. ' + 'Call tf.nonMaxSuppressionAsync() instead');\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var boxes = inputs.boxes,\n\t      scores = inputs.scores;\n\t  var maxOutputSize = attrs.maxOutputSize,\n\t      iouThreshold = attrs.iouThreshold,\n\t      scoreThreshold = attrs.scoreThreshold,\n\t      padToMaxOutputSize = attrs.padToMaxOutputSize;\n\t  var boxesVals = backend.readSync(boxes.dataId);\n\t  var scoresVals = backend.readSync(scores.dataId);\n\n\t  var _nonMaxSuppressionV4I = nonMaxSuppressionV4Impl$2(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize),\n\t      selectedIndices = _nonMaxSuppressionV4I.selectedIndices,\n\t      validOutputs = _nonMaxSuppressionV4I.validOutputs;\n\n\t  return [backend.makeTensorInfo([selectedIndices.length], 'int32', new Int32Array(selectedIndices)), backend.makeTensorInfo([], 'int32', new Int32Array([validOutputs]))];\n\t}\n\tvar nonMaxSuppressionV4Config$1 = {\n\t  kernelName: NonMaxSuppressionV4,\n\t  backendName: 'webgl',\n\t  kernelFunc: nonMaxSuppressionV4$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar nonMaxSuppressionV5Impl$2 = nonMaxSuppressionV5Impl;\n\tfunction nonMaxSuppressionV5$1(args) {\n\t  warn('tf.nonMaxSuppression() in webgl locks the UI thread. ' + 'Call tf.nonMaxSuppressionAsync() instead');\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var boxes = inputs.boxes,\n\t      scores = inputs.scores;\n\t  var maxOutputSize = attrs.maxOutputSize,\n\t      iouThreshold = attrs.iouThreshold,\n\t      scoreThreshold = attrs.scoreThreshold,\n\t      softNmsSigma = attrs.softNmsSigma;\n\t  var boxesVals = backend.readSync(boxes.dataId);\n\t  var scoresVals = backend.readSync(scores.dataId);\n\t  var maxOutputSizeVal = maxOutputSize;\n\t  var iouThresholdVal = iouThreshold;\n\t  var scoreThresholdVal = scoreThreshold;\n\t  var softNmsSigmaVal = softNmsSigma;\n\n\t  var _nonMaxSuppressionV5I = nonMaxSuppressionV5Impl$2(boxesVals, scoresVals, maxOutputSizeVal, iouThresholdVal, scoreThresholdVal, softNmsSigmaVal),\n\t      selectedIndices = _nonMaxSuppressionV5I.selectedIndices,\n\t      selectedScores = _nonMaxSuppressionV5I.selectedScores;\n\n\t  return [backend.makeTensorInfo([selectedIndices.length], 'int32', new Int32Array(selectedIndices)), backend.makeTensorInfo([selectedScores.length], 'float32', new Float32Array(selectedScores))];\n\t}\n\tvar nonMaxSuppressionV5Config$1 = {\n\t  kernelName: NonMaxSuppressionV5,\n\t  backendName: 'webgl',\n\t  kernelFunc: nonMaxSuppressionV5$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar OneHotProgram = function OneHotProgram(numIndices, depth, onValue, offValue) {\n\t  this.variableNames = ['indices'];\n\t  this.outputShape = [numIndices, depth];\n\t  this.userCode = \"\\n      void main() {\\n        ivec2 coords = getOutputCoords();\\n        int index = round(getIndices(coords.x));\\n        setOutput(mix(float(\" + offValue + \"), float(\" + onValue + \"),\\n                      float(index == coords.y)));\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar oneHot$3 = function oneHot(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var indices = inputs.indices;\n\t  var depth = attrs.depth,\n\t      onValue = attrs.onValue,\n\t      offValue = attrs.offValue;\n\t  var indicesSize = sizeFromShape(indices.shape);\n\t  var program = new OneHotProgram(indicesSize, depth, onValue, offValue);\n\t  var reshaped = reshape$3({\n\t    inputs: {\n\t      x: indices\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: [indicesSize]\n\t    }\n\t  });\n\t  var result = backend.runWebGLProgram(program, [reshaped], indices.dtype);\n\t  backend.disposeIntermediateTensorInfo(reshaped);\n\t  var outShape = [].concat(indices.shape, [depth]);\n\t  var out = reshape$3({\n\t    inputs: {\n\t      x: result\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: outShape\n\t    }\n\t  });\n\t  backend.disposeIntermediateTensorInfo(result);\n\t  return out;\n\t};\n\tvar oneHotConfig$1 = {\n\t  kernelName: OneHot,\n\t  backendName: 'webgl',\n\t  kernelFunc: oneHot$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction zerosLike$3(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var x = inputs.x;\n\n\t  if (x.dtype === 'complex64') {\n\t    var realPart = real$2({\n\t      inputs: {\n\t        input: x\n\t      },\n\t      backend: backend\n\t    });\n\t    var r = zerosLike$3({\n\t      inputs: {\n\t        x: realPart\n\t      },\n\t      backend: backend\n\t    });\n\t    var imagPart = imag$2({\n\t      inputs: {\n\t        input: x\n\t      },\n\t      backend: backend\n\t    });\n\t    var i = zerosLike$3({\n\t      inputs: {\n\t        x: imagPart\n\t      },\n\t      backend: backend\n\t    });\n\t    var result = complex$2({\n\t      inputs: {\n\t        real: r,\n\t        imag: i\n\t      },\n\t      backend: backend\n\t    });\n\t    backend.disposeIntermediateTensorInfo(realPart);\n\t    backend.disposeIntermediateTensorInfo(r);\n\t    backend.disposeIntermediateTensorInfo(imagPart);\n\t    backend.disposeIntermediateTensorInfo(i);\n\t    return result;\n\t  } else {\n\t    return fill$2({\n\t      attrs: {\n\t        shape: x.shape,\n\t        dtype: x.dtype,\n\t        value: x.dtype === 'string' ? '' : 0\n\t      },\n\t      backend: backend\n\t    });\n\t  }\n\t}\n\tvar zerosLikeConfig$1 = {\n\t  kernelName: ZerosLike,\n\t  backendName: 'webgl',\n\t  kernelFunc: zerosLike$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction onesLike$3(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var x = inputs.x;\n\n\t  if (x.dtype === 'string') {\n\t    throw new Error('onesLike is not supported under string dtype');\n\t  } else if (x.dtype === 'complex64') {\n\t    var realPart = real$2({\n\t      inputs: {\n\t        input: x\n\t      },\n\t      backend: backend\n\t    });\n\t    var r = onesLike$3({\n\t      inputs: {\n\t        x: realPart\n\t      },\n\t      backend: backend\n\t    });\n\t    var imagPart = imag$2({\n\t      inputs: {\n\t        input: x\n\t      },\n\t      backend: backend\n\t    });\n\t    var i = zerosLike$3({\n\t      inputs: {\n\t        x: imagPart\n\t      },\n\t      backend: backend\n\t    });\n\t    var result = complex$2({\n\t      inputs: {\n\t        real: r,\n\t        imag: i\n\t      },\n\t      backend: backend\n\t    });\n\t    backend.disposeIntermediateTensorInfo(realPart);\n\t    backend.disposeIntermediateTensorInfo(r);\n\t    backend.disposeIntermediateTensorInfo(imagPart);\n\t    backend.disposeIntermediateTensorInfo(i);\n\t    return result;\n\t  } else {\n\t    // TODO(cais, smilkov): Add WebGL shader for onesLike:\n\t    //   https://github.com/tensorflow/tfjs/issues/1293\n\t    return fill$2({\n\t      attrs: {\n\t        shape: x.shape,\n\t        dtype: x.dtype,\n\t        value: 1\n\t      },\n\t      backend: backend\n\t    });\n\t  }\n\t}\n\tvar onesLikeConfig$1 = {\n\t  kernelName: OnesLike,\n\t  backendName: 'webgl',\n\t  kernelFunc: onesLike$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction pack$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var axis = attrs.axis;\n\n\t  if (inputs.length === 1) {\n\t    return expandDims$3({\n\t      inputs: {\n\t        input: inputs[0]\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        dim: axis\n\t      }\n\t    });\n\t  }\n\n\t  var shape = inputs[0].shape;\n\t  var dtype = inputs[0].dtype;\n\t  inputs.forEach(function (t) {\n\t    assertShapesMatch(shape, t.shape, 'All tensors passed to stack must have matching shapes');\n\t    assert(dtype === t.dtype, function () {\n\t      return 'All tensors passed to stack must have matching dtypes';\n\t    });\n\t  });\n\t  var intermediateTensorInfos = [];\n\t  var expandedTensors = inputs.map(function (t) {\n\t    var expandedT = expandDims$3({\n\t      inputs: {\n\t        input: t\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        dim: axis\n\t      }\n\t    });\n\t    intermediateTensorInfos.push(expandedT);\n\t    return expandedT;\n\t  });\n\t  var result = concat$2({\n\t    inputs: expandedTensors,\n\t    backend: backend,\n\t    attrs: {\n\t      axis: axis\n\t    }\n\t  });\n\t  intermediateTensorInfos.forEach(function (t) {\n\t    return backend.disposeIntermediateTensorInfo(t);\n\t  });\n\t  return result;\n\t}\n\tvar packConfig$1 = {\n\t  kernelName: Pack,\n\t  backendName: 'webgl',\n\t  kernelFunc: pack$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar PadProgram = function PadProgram(xShape, paddings, constantValue) {\n\t  this.variableNames = ['x'];\n\t  this.outputShape = paddings.map(function (p, i) {\n\t    return p[0]\n\t    /* beforePad */\n\t    + xShape[i] + p[1];\n\t  }\n\t  /* afterPad */\n\t  );\n\t  var rank = xShape.length;\n\t  var type = getCoordsDataType(rank);\n\t  var start = paddings.map(function (p) {\n\t    return p[0];\n\t  }).join(',');\n\t  var end = paddings.map(function (p, i) {\n\t    return p[0] + xShape[i];\n\t  }).join(',');\n\t  var unpackedCoords = ['coords[0]', 'coords[1]', 'coords[2]', 'coords[3]'].slice(0, rank);\n\n\t  if (rank === 1) {\n\t    this.userCode = \"\\n        int start = \" + start + \";\\n        int end = \" + end + \";\\n\\n        void main() {\\n          int outC = getOutputCoords();\\n          if (outC < start || outC >= end) {\\n            setOutput(float(\" + constantValue + \"));\\n          } else {\\n            setOutput(getX(outC - start));\\n          }\\n        }\\n      \";\n\t    return;\n\t  }\n\n\t  this.userCode = \"\\n      \" + type + \" start = \" + type + \"(\" + start + \");\\n      \" + type + \" end = \" + type + \"(\" + end + \");\\n\\n      void main() {\\n        \" + type + \" outC = getOutputCoords();\\n        if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) {\\n          setOutput(float(\" + constantValue + \"));\\n        } else {\\n          \" + type + \" coords = outC - start;\\n          setOutput(getX(\" + unpackedCoords + \"));\\n        }\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar PadPackedProgram = function PadPackedProgram(xShape, paddings, constantValue) {\n\t  this.variableNames = ['x'];\n\t  this.packedInputs = true;\n\t  this.packedOutput = true;\n\t  this.outputShape = paddings.map(function (p, i) {\n\t    return p[0]\n\t    /* beforePad */\n\t    + xShape[i] + p[1];\n\t  }\n\t  /* afterPad */\n\t  );\n\t  var rank = xShape.length;\n\t  var dtype = getCoordsDataType(rank);\n\t  var start = paddings.map(function (p) {\n\t    return p[0];\n\t  }).join(',');\n\t  var end = paddings.map(function (p, i) {\n\t    return p[0] + xShape[i];\n\t  }).join(',');\n\t  var coords = getChannels('rc', rank);\n\t  var source = getChannels('source', rank);\n\t  var cLimit = coords[rank - 1] + \" < \" + this.outputShape[rank - 1];\n\t  var innerDims = rank === 1 ? 'source' : \"vec2(\" + source.slice(-2).join() + \")\";\n\t  var componentSetup = [dtype + \" rc = outputLoc;\", coords[rank - 1] + \" += 1;\\n       if(\" + cLimit + \") {\\n      \", rank === 1 ? '' : \"}\\n       rc = outputLoc;\\n       \" + coords[rank - 2] + \" += 1;\\n       if(\" + coords[rank - 2] + \" < \" + this.outputShape[rank - 2] + \") {\", rank === 1 ? '' : \"  \" + coords[rank - 1] + \" += 1;\\n         if(\" + cLimit + \") {\"];\n\t  var paddingArea = rank === 1 ? 'rc < start || rc >= end' : 'any(lessThan(rc, start)) || any(greaterThanEqual(rc, end))';\n\t  var mainLoop = '';\n\n\t  for (var i = 0, j = rank === 1 ? 2 : 4; i < j; i++) {\n\t    mainLoop += \"\\n        \" + componentSetup[i] + \"\\n        if (\" + paddingArea + \") {\\n          result[\" + i + \"] = float(\" + constantValue + \");\\n        } else {\\n          \" + dtype + \" source = rc - start;\\n          result[\" + i + \"] = getChannel(getX(\" + source.join() + \"), \" + innerDims + \");\\n        }\\n      \";\n\t  }\n\n\t  mainLoop += rank === 1 ? \"} \" : \"}}\";\n\t  this.userCode = \"\\n      const \" + dtype + \" start = \" + dtype + \"(\" + start + \");\\n      const \" + dtype + \" end = \" + dtype + \"(\" + end + \");\\n\\n      void main() {\\n        \" + dtype + \" outputLoc = getOutputCoords();\\n        vec4 result = vec4(0.);\\n        \" + mainLoop + \"\\n        setOutput(result);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar padV2$1 = function padV2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var paddings = attrs.paddings,\n\t      constantValue = attrs.constantValue;\n\t  var program = env().getBool('WEBGL_PACK_ARRAY_OPERATIONS') ? new PadPackedProgram(x.shape, paddings, constantValue) : new PadProgram(x.shape, paddings, constantValue);\n\t  return backend.runWebGLProgram(program, [x], x.dtype);\n\t};\n\tvar padV2Config$1 = {\n\t  kernelName: PadV2,\n\t  backendName: 'webgl',\n\t  kernelFunc: padV2$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar POW = \"\\n  if(a < 0.0 && floor(b) < b){\\n    return NAN;\\n  }\\n  if (b == 0.0) {\\n    return 1.0;\\n  }\\n  return (round(mod(b, 2.0)) != 1) ?\\n      pow(abs(a), b) : sign(a) * pow(abs(a), b);\\n\";\n\tvar POW_PACKED = \"\\n  // isModRound1 has 1 for components with round(mod(b, 2.0)) == 1, 0 otherwise.\\n  vec4 isModRound1 = vec4(equal(round(mod(b, 2.0)), ivec4(1)));\\n  vec4 multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1);\\n  vec4 result = multiplier * pow(abs(a), b);\\n\\n  // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS\\n  bvec4 isExpZero = equal(b, vec4(0.0));\\n  result.r = isExpZero.r ? 1.0 : result.r;\\n  result.g = isExpZero.g ? 1.0 : result.g;\\n  result.b = isExpZero.b ? 1.0 : result.b;\\n  result.a = isExpZero.a ? 1.0 : result.a;\\n\\n  vec4 isNaN = vec4(lessThan(a, vec4(0.0))) * vec4(lessThan(floor(b), b));\\n  \" + CHECK_NAN_SNIPPET$2 + \"\\n  return result;\\n\";\n\tvar pow$8 = binaryKernelFunc$1({\n\t  opSnippet: POW,\n\t  packedOpSnippet: POW_PACKED\n\t});\n\tvar powConfig$1 = {\n\t  kernelName: Pow,\n\t  backendName: 'webgl',\n\t  kernelFunc: pow$8\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction prod$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var axis = attrs.axis,\n\t      keepDims = attrs.keepDims;\n\t  var xRank = x.shape.length;\n\t  var toDispose = [];\n\t  var origAxes = parseAxisParam(axis, x.shape);\n\t  var axes = origAxes;\n\t  var permutedAxes = getAxesPermutation(axes, xRank);\n\t  var permutedX = x;\n\n\t  if (permutedAxes != null) {\n\t    permutedX = transpose$2({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        perm: permutedAxes\n\t      }\n\t    });\n\t    axes = getInnerMostAxes(axes.length, xRank);\n\t    toDispose.push(permutedX);\n\t  }\n\n\t  assertAxesAreInnerMostDims('prod', axes, xRank);\n\t  var res;\n\n\t  if (backend.shouldExecuteOnCPU([permutedX])) {\n\t    var xVals = backend.texData.get(permutedX.dataId).values;\n\n\t    var _prodImplCPU = prodImplCPU(permutedX.shape, permutedX.dtype, xVals, axes),\n\t        outVals = _prodImplCPU.outVals,\n\t        outShape = _prodImplCPU.outShape,\n\t        outDtype = _prodImplCPU.outDtype;\n\n\t    res = backend.makeTensorInfo(outShape, outDtype, outVals);\n\t  } else {\n\t    var _backend_util$compute = computeOutAndReduceShapes(permutedX.shape, axes),\n\t        _outShape = _backend_util$compute[0],\n\t        reduceShape = _backend_util$compute[1];\n\n\t    var inSize = sizeFromShape(reduceShape);\n\t    var a2D = reshape$3({\n\t      inputs: {\n\t        x: permutedX\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: [-1, inSize]\n\t      }\n\t    });\n\t    var outputDType = sumOutType(x.dtype);\n\t    var reduced = reduce(a2D, outputDType, 'prod', backend);\n\t    res = reshape$3({\n\t      inputs: {\n\t        x: reduced\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: _outShape\n\t      }\n\t    });\n\t    toDispose.push(a2D);\n\t    toDispose.push(reduced);\n\t  }\n\n\t  if (keepDims) {\n\t    toDispose.push(res);\n\t    var newShape = expandShapeToKeepDim(res.shape, origAxes);\n\t    res = reshape$3({\n\t      inputs: {\n\t        x: res\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: newShape\n\t      }\n\t    });\n\t  }\n\n\t  toDispose.forEach(function (t) {\n\t    return backend.disposeIntermediateTensorInfo(t);\n\t  });\n\t  return res;\n\t}\n\tvar prodConfig$1 = {\n\t  kernelName: Prod,\n\t  backendName: 'webgl',\n\t  kernelFunc: prod$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar range$3 = function range(args) {\n\t  var backend = args.backend,\n\t      attrs = args.attrs;\n\t  var start = attrs.start,\n\t      stop = attrs.stop,\n\t      step = attrs.step,\n\t      dtype = attrs.dtype;\n\t  var values = rangeImplCPU(start, stop, step, dtype);\n\t  return backend.makeTensorInfo([values.length], dtype, values);\n\t};\n\tvar rangeConfig$1 = {\n\t  kernelName: Range,\n\t  backendName: 'webgl',\n\t  kernelFunc: range$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar RECIPROCAL = \"return 1.0 / x;\";\n\tvar reciprocal$2 = unaryKernelFunc$1({\n\t  opSnippet: RECIPROCAL\n\t});\n\tvar reciprocalConfig$1 = {\n\t  kernelName: Reciprocal,\n\t  backendName: 'webgl',\n\t  kernelFunc: reciprocal$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar RELU$2 = CHECK_NAN_SNIPPET + \"\\n  return (x < 0.0) ? 0.0 : x;\\n\";\n\tvar RELU_PACKED = \"\\n  vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\\n  bvec4 isNaN = isnan(x);\\n\\n  result.r = isNaN.r ? x.r : result.r;\\n  result.g = isNaN.g ? x.g : result.g;\\n  result.b = isNaN.b ? x.b : result.b;\\n  result.a = isNaN.a ? x.a : result.a;\\n\\n  return result;\\n\";\n\tvar relu$2 = unaryKernelFunc$1({\n\t  opSnippet: RELU$2,\n\t  packedOpSnippet: RELU_PACKED\n\t});\n\tvar reluConfig$1 = {\n\t  kernelName: Relu,\n\t  backendName: 'webgl',\n\t  kernelFunc: relu$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar RELU6$2 = CHECK_NAN_SNIPPET + \"\\n  return (x < 0.0) ? 0.0 : min(6.0, x);\\n\";\n\tvar RELU6_PACKED = \"\\n  vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\\n  bvec4 isNaN = isnan(x);\\n\\n  result.r = isNaN.r ? x.r : result.r;\\n  result.g = isNaN.g ? x.g : result.g;\\n  result.b = isNaN.b ? x.b : result.b;\\n  result.a = isNaN.a ? x.a : result.a;\\n\\n  return result;\\n\";\n\tvar relu6$2 = unaryKernelFunc$1({\n\t  opSnippet: RELU6$2,\n\t  packedOpSnippet: RELU6_PACKED\n\t});\n\tvar relu6Config$1 = {\n\t  kernelName: Relu6,\n\t  backendName: 'webgl',\n\t  kernelFunc: relu6$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ResizeBilinearProgram = function ResizeBilinearProgram(inputShape, newHeight, newWidth, alignCorners, halfPixelCenters) {\n\t  this.variableNames = ['A'];\n\t  this.outputShape = [];\n\t  var batch = inputShape[0],\n\t      oldHeight = inputShape[1],\n\t      oldWidth = inputShape[2],\n\t      depth = inputShape[3];\n\t  this.outputShape = [batch, newHeight, newWidth, depth];\n\t  var effectiveInSize = [alignCorners && newHeight > 1 ? oldHeight - 1 : oldHeight, alignCorners && newWidth > 1 ? oldWidth - 1 : oldWidth];\n\t  var effectiveOutSize = [alignCorners && newHeight > 1 ? newHeight - 1 : newHeight, alignCorners && newWidth > 1 ? newWidth - 1 : newWidth];\n\t  var sourceFracIndexRC;\n\n\t  if (halfPixelCenters) {\n\t    sourceFracIndexRC = \"(vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC\" + \" - vec2(0.5)\";\n\t  } else {\n\t    sourceFracIndexRC = \"vec2(yRC) * effectiveInputOverOutputRatioRC\";\n\t  }\n\n\t  this.userCode = \"\\n      const vec2 effectiveInputOverOutputRatioRC = vec2(\\n          \" + effectiveInSize[0] / effectiveOutSize[0] + \",\\n          \" + effectiveInSize[1] / effectiveOutSize[1] + \");\\n      const vec2 inputShapeRC = vec2(\" + oldHeight + \".0, \" + oldWidth + \".0);\\n\\n      void main() {\\n        ivec4 coords = getOutputCoords();\\n        int b = coords[0];\\n        int d = coords[3];\\n        ivec2 yRC = coords.yz;\\n\\n        // Fractional source index.\\n        vec2 sourceFracIndexRC = \" + sourceFracIndexRC + \";\\n\\n        // Compute the four integer indices.\\n        ivec2 sourceFloorRC = ivec2(max(sourceFracIndexRC, vec2(0.0)));\\n        ivec2 sourceCeilRC = ivec2(\\n          min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\\n\\n        float topLeft = getA(b, sourceFloorRC.x, sourceFloorRC.y, d);\\n        float bottomLeft = getA(b, sourceCeilRC.x, sourceFloorRC.y, d);\\n        float topRight = getA(b, sourceFloorRC.x, sourceCeilRC.y, d);\\n        float bottomRight = getA(b, sourceCeilRC.x, sourceCeilRC.y, d);\\n\\n        vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC);\\n\\n        float top = topLeft + (topRight - topLeft) * fracRC.y;\\n        float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y;\\n        float newValue = top + (bottom - top) * fracRC.x;\\n\\n        setOutput(newValue);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ResizeBilinearPackedProgram = function ResizeBilinearPackedProgram(inputShape, newHeight, newWidth, alignCorners, halfPixelCenters) {\n\t  this.variableNames = ['A'];\n\t  this.packedInputs = true;\n\t  this.packedOutput = true;\n\t  this.outputShape = [];\n\t  var batch = inputShape[0],\n\t      oldHeight = inputShape[1],\n\t      oldWidth = inputShape[2],\n\t      depth = inputShape[3];\n\t  this.outputShape = [batch, newHeight, newWidth, depth];\n\t  var effectiveInSize = [alignCorners && newHeight > 1 ? oldHeight - 1 : oldHeight, alignCorners && newWidth > 1 ? oldWidth - 1 : oldWidth];\n\t  var effectiveOutSize = [alignCorners && newHeight > 1 ? newHeight - 1 : newHeight, alignCorners && newWidth > 1 ? newWidth - 1 : newWidth];\n\t  var sourceFracIndexRC;\n\n\t  if (halfPixelCenters) {\n\t    sourceFracIndexRC = \"(vec3(yRC) + vec3(0.5)) * \" + \"effectiveInputOverOutputRatioRC - vec3(0.5)\";\n\t  } else {\n\t    sourceFracIndexRC = \"vec3(yRC) * effectiveInputOverOutputRatioRC\";\n\t  }\n\n\t  this.userCode = \"\\n      const vec3 effectiveInputOverOutputRatioRC = vec3(\\n          \" + effectiveInSize[0] / effectiveOutSize[0] + \",\\n          \" + effectiveInSize[1] / effectiveOutSize[1] + \",\\n          \" + effectiveInSize[1] / effectiveOutSize[1] + \");\\n      const vec3 inputShapeRC = vec3(\" + oldHeight + \".0, \" + oldWidth + \".0,\\n                                     \" + oldWidth + \".0);\\n\\n      float getAValue(int b, int r, int c, int d) {\\n        return getChannel(getA(b, r, c, d), vec2(c, d));\\n      }\\n\\n      void main() {\\n        ivec4 coords = getOutputCoords();\\n        int b = coords[0];\\n        int d = coords[3];\\n        // Calculate values for next column in yRC.z.\\n        ivec3 yRC = coords.yzz + ivec3(0, 0, 1);\\n\\n        // Fractional source index.\\n        vec3 sourceFracIndexRC = \" + sourceFracIndexRC + \";\\n\\n        // Compute the four integer indices.\\n        ivec3 sourceFloorRC = ivec3(max(sourceFracIndexRC, vec3(0.0)));\\n        ivec3 sourceCeilRC = ivec3(\\n          min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\\n\\n        // Should we calculate next column and row elements in 2x2 packed cell.\\n        bool hasNextCol = d < \" + (depth - 1) + \";\\n        bool hasNextRow = coords.z < \" + (newWidth - 1) + \";\\n\\n        // In parallel, construct four corners for all four components in\\n        // packed 2x2 cell.\\n        vec4 topLeft = vec4(\\n          getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d),\\n          hasNextCol ? getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d + 1)\\n                     : 0.0,\\n          hasNextRow ? getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d)\\n                     : 0.0,\\n          (hasNextRow && hasNextCol) ?\\n            getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d + 1) : 0.0);\\n\\n        vec4 bottomLeft = vec4(\\n          getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d),\\n          hasNextCol ? getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d + 1)\\n                     : 0.0,\\n          hasNextRow ? getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d)\\n                     : 0.0,\\n          (hasNextRow && hasNextCol) ?\\n            getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d + 1) : 0.0);\\n\\n        vec4 topRight = vec4(\\n          getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d),\\n          hasNextCol ? getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d + 1)\\n                     : 0.0,\\n          hasNextRow ? getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d)\\n                     : 0.0,\\n          (hasNextRow && hasNextCol) ?\\n            getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d + 1) : 0.0);\\n\\n        vec4 bottomRight = vec4(\\n          getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d),\\n          hasNextCol ? getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d + 1)\\n                     : 0.0,\\n          hasNextRow ? getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d)\\n                     : 0.0,\\n          (hasNextRow && hasNextCol) ?\\n            getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d + 1) : 0.0);\\n\\n        vec3 fracRC = sourceFracIndexRC - vec3(sourceFloorRC);\\n\\n        vec4 top = mix(topLeft, topRight, fracRC.yyzz);\\n        vec4 bottom = mix(bottomLeft, bottomRight, fracRC.yyzz);\\n        vec4 newValue = mix(top, bottom, fracRC.x);\\n\\n        setOutput(newValue);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction resizeBilinear$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var images = inputs.images;\n\t  var alignCorners = attrs.alignCorners,\n\t      halfPixelCenters = attrs.halfPixelCenters,\n\t      size = attrs.size;\n\t  var newHeight = size[0],\n\t      newWidth = size[1];\n\t  var program = env().getBool('WEBGL_PACK_IMAGE_OPERATIONS') ? new ResizeBilinearPackedProgram(images.shape, newHeight, newWidth, alignCorners, halfPixelCenters) : new ResizeBilinearProgram(images.shape, newHeight, newWidth, alignCorners, halfPixelCenters);\n\t  return backend.runWebGLProgram(program, [images], 'float32');\n\t}\n\tvar resizeBilinearConfig$1 = {\n\t  kernelName: ResizeBilinear,\n\t  backendName: 'webgl',\n\t  kernelFunc: resizeBilinear$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ResizeBilinearBackpropProgram = function ResizeBilinearBackpropProgram(dyShape, inputShape, alignCorners) {\n\t  this.variableNames = ['dy'];\n\t  this.outputShape = [];\n\t  this.outputShape = inputShape;\n\t  var xHeight = inputShape[1],\n\t      xWidth = inputShape[2];\n\t  var yHeight = dyShape[1],\n\t      yWidth = dyShape[2]; // In the backwards pass, we want to find the pixels that were generated for\n\t  // each pixel in the input image the forward pass and add the corresponding\n\t  // coefficient from dy to the gradient (with some interpolation).\n\n\t  var effectiveXSize = [alignCorners && yHeight > 1 ? xHeight - 1 : xHeight, alignCorners && yWidth > 1 ? xWidth - 1 : xWidth];\n\t  var effectiveYSize = [alignCorners && yHeight > 1 ? yHeight - 1 : yHeight, alignCorners && yWidth > 1 ? yWidth - 1 : yWidth];\n\t  var heightScale = effectiveXSize[0] / effectiveYSize[0];\n\t  var widthScale = effectiveXSize[1] / effectiveYSize[1];\n\t  var invHeightScale = 1 / heightScale;\n\t  var invWidthScale = 1 / widthScale; // This defines the size of the window of values around a particular\n\t  // index in dy that we want to search for contributions to dx.\n\n\t  var winHeight = Math.ceil(invHeightScale) * 2 + 2;\n\t  var winWidth = Math.ceil(invWidthScale) * 2 + 2;\n\t  this.userCode = \"\\n      void main() {\\n        ivec4 coords = getOutputCoords();\\n        int b = coords[0];\\n        int d = coords[3];\\n        int r = coords[1];\\n        int c = coords[2];\\n\\n        float accumulator = 0.0;\\n\\n        const float heightScale = float(\" + heightScale + \");\\n        const float widthScale = float(\" + widthScale + \");\\n\\n        const float invHeightScale = float(\" + invHeightScale + \");\\n        const float invWidthScale = float(\" + invWidthScale + \");\\n\\n        const int winHeight = int(\" + winHeight + \");\\n        const int winWidth = int(\" + winWidth + \");\\n\\n        // Compute bounds for where in dy we will look\\n        float startRLerp = floor(float(r) * invHeightScale);\\n        int startDyR = int(startRLerp - float(winHeight / 2));\\n\\n        float startCLerp = floor(float(c) * invWidthScale);\\n        int startDyC = int(startCLerp - float(winWidth / 2));\\n\\n        // Loop over dy\\n        for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\\n          int dyR = dyROffset + startDyR;\\n\\n          // Guard against the window exceeding the bounds of dy\\n          if (dyR < 0 || dyR >= \" + yHeight + \") {\\n            continue;\\n          }\\n\\n          for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\\n            int dyC = dyCOffset + startDyC;\\n\\n            // Guard against the window exceeding the bounds of dy\\n            if (dyC < 0 || dyC >= \" + yWidth + \") {\\n              continue;\\n            }\\n\\n            float dxR = float(dyR) * heightScale;\\n            int topDxRIndex = int(floor(dxR));\\n            int bottomDxRIndex = int(min(ceil(dxR), \" + (xHeight - 1) + \".0));\\n            float dxRLerp = dxR - float(topDxRIndex);\\n            float inverseDxRLerp = 1.0 - dxRLerp;\\n\\n            float dxC = float(dyC) * widthScale;\\n            int leftDxCIndex = int(floor(dxC));\\n            int rightDxCIndex = int(min(ceil(dxC), \" + (xWidth - 1) + \".0));\\n            float dxCLerp = dxC - float(leftDxCIndex);\\n            float inverseDxCLerp = 1.0 - dxCLerp;\\n\\n            if (r == topDxRIndex && c == leftDxCIndex) {\\n              // topLeft\\n              accumulator +=\\n                getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp;\\n            }\\n\\n            if (r == topDxRIndex && c == rightDxCIndex) {\\n              // topRight\\n              accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp;\\n            }\\n\\n            if (r == bottomDxRIndex && c == leftDxCIndex) {\\n              // bottomLeft\\n              accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp;\\n            }\\n\\n            if (r == bottomDxRIndex && c == rightDxCIndex) {\\n              // bottomRight\\n              accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp;\\n            }\\n          }\\n        }\\n        // End loop over dy\\n\\n        setOutput(accumulator);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction resizeBilinearGrad$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var images = inputs.images,\n\t      dy = inputs.dy;\n\t  var alignCorners = attrs.alignCorners;\n\t  var program = new ResizeBilinearBackpropProgram(dy.shape, images.shape, alignCorners);\n\t  return backend.runWebGLProgram(program, [dy], dy.dtype);\n\t}\n\tvar resizeBilinearGradConfig$2 = {\n\t  kernelName: ResizeBilinearGrad,\n\t  backendName: 'webgl',\n\t  kernelFunc: resizeBilinearGrad$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ResizeNearestNeighborProgram = function ResizeNearestNeighborProgram(inputShape, newHeight, newWidth, alignCorners, halfPixelCenters) {\n\t  this.variableNames = ['A'];\n\t  this.outputShape = [];\n\t  var batch = inputShape[0],\n\t      oldHeight = inputShape[1],\n\t      oldWidth = inputShape[2],\n\t      depth = inputShape[3];\n\t  this.outputShape = [batch, newHeight, newWidth, depth];\n\t  var effectiveInSize = [alignCorners && newHeight > 1 ? oldHeight - 1 : oldHeight, alignCorners && newWidth > 1 ? oldWidth - 1 : oldWidth];\n\t  var effectiveOutSize = [alignCorners && newHeight > 1 ? newHeight - 1 : newHeight, alignCorners && newWidth > 1 ? newWidth - 1 : newWidth]; // When align corners is false, we rounds the value with floor.\n\n\t  var roundBase = alignCorners ? '0.5' : '0.0';\n\t  var sourceFracIndexRC;\n\n\t  if (halfPixelCenters) {\n\t    sourceFracIndexRC = \"max((vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC\" + \", vec2(0.0))\";\n\t  } else {\n\t    sourceFracIndexRC = \"vec2(yRC) * effectiveInputOverOutputRatioRC\";\n\t  }\n\n\t  this.userCode = \"\\n      const vec2 effectiveInputOverOutputRatioRC = vec2(\\n          \" + effectiveInSize[0] / effectiveOutSize[0] + \",\\n          \" + effectiveInSize[1] / effectiveOutSize[1] + \");\\n      const vec2 inputShapeRC = vec2(\" + oldHeight + \".0, \" + oldWidth + \".0);\\n\\n      void main() {\\n        ivec4 coords = getOutputCoords();\\n        int b = coords[0];\\n        int d = coords[3];\\n        ivec2 yRC = coords.yz;\\n\\n        // Fractional source index.\\n        vec2 sourceFracIndexRC = \" + sourceFracIndexRC + \";\\n\\n        // Compute the coordinators of nearest neighbor point.\\n        ivec2 sourceNearestRC = ivec2(\\n          min(inputShapeRC - 1.0, floor(sourceFracIndexRC + \" + roundBase + \")));\\n        float newValue = getA(b, sourceNearestRC.x, sourceNearestRC.y, d);\\n\\n        setOutput(newValue);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction resizeNearestNeighbor$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var images = inputs.images;\n\t  var alignCorners = attrs.alignCorners,\n\t      halfPixelCenters = attrs.halfPixelCenters,\n\t      size = attrs.size;\n\t  var newHeight = size[0],\n\t      newWidth = size[1];\n\t  var program = new ResizeNearestNeighborProgram(images.shape, newHeight, newWidth, alignCorners, halfPixelCenters);\n\t  return backend.runWebGLProgram(program, [images], images.dtype);\n\t}\n\tvar resizeNearestNeighborConfig$1 = {\n\t  kernelName: ResizeNearestNeighbor,\n\t  backendName: 'webgl',\n\t  kernelFunc: resizeNearestNeighbor$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ResizeNearestNeigborBackpropProgram = function ResizeNearestNeigborBackpropProgram(dyShape, inputShape, alignCorners) {\n\t  this.variableNames = ['dy'];\n\t  this.outputShape = [];\n\t  this.outputShape = inputShape;\n\t  var xHeight = inputShape[1],\n\t      xWidth = inputShape[2];\n\t  var yHeight = dyShape[1],\n\t      yWidth = dyShape[2]; // In the backwards pass, we want to find the pixels that were generated for\n\t  // each pixel in the input image the forward pass and add the corresponding\n\t  // coefficient from dy to the gradient (with some interpolation).\n\n\t  var effectiveXSize = [alignCorners && yHeight > 1 ? xHeight - 1 : xHeight, alignCorners && yWidth > 1 ? xWidth - 1 : xWidth];\n\t  var effectiveYSize = [alignCorners && yHeight > 1 ? yHeight - 1 : yHeight, alignCorners && yWidth > 1 ? yWidth - 1 : yWidth];\n\t  var heightScale = effectiveXSize[0] / effectiveYSize[0];\n\t  var widthScale = effectiveXSize[1] / effectiveYSize[1];\n\t  var invHeightScale = 1 / heightScale;\n\t  var invWidthScale = 1 / widthScale; // This defines the size of the window of values around a particular\n\t  // index in dy that we want to search for contributions to dx.\n\n\t  var winHeight = Math.ceil(invHeightScale) * 2 + 2;\n\t  var winWidth = Math.ceil(invWidthScale) * 2 + 2;\n\t  this.userCode = \"\\n      void main() {\\n        ivec4 coords = getOutputCoords();\\n        int b = coords[0];\\n        int d = coords[3];\\n        int r = coords[1];\\n        int c = coords[2];\\n\\n        float accumulator = 0.0;\\n\\n        const float heightScale = float(\" + heightScale + \");\\n        const float widthScale = float(\" + widthScale + \");\\n\\n        const float invHeightScale = float(\" + invHeightScale + \");\\n        const float invWidthScale = float(\" + invWidthScale + \");\\n\\n        const int winHeight = int(\" + winHeight + \");\\n        const int winWidth = int(\" + winWidth + \");\\n\\n        // Compute bounds for where in dy we will look\\n        float startRLerp = floor(float(r) * invHeightScale);\\n        int startDyR = int(floor(startRLerp - float(winHeight / 2)));\\n\\n        float startCLerp = floor(float(c) * invWidthScale);\\n        int startDyC = int(floor(startCLerp - float(winWidth / 2)));\\n\\n        // Loop over dy\\n        for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\\n          int dyR = dyROffset + startDyR;\\n\\n          // Guard against the window exceeding the bounds of dy\\n          if (dyR < 0 || dyR >= \" + yHeight + \") {\\n            continue;\\n          }\\n\\n          for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\\n            int dyC = dyCOffset + startDyC;\\n\\n            // Guard against the window exceeding the bounds of dy\\n            if (dyC < 0 || dyC >= \" + yWidth + \") {\\n              continue;\\n            }\\n\\n            float sourceFracRow =\\n              float(\" + effectiveXSize[0] + \") *\\n                (float(dyR) / float(\" + effectiveYSize[0] + \"));\\n\\n            float sourceFracCol =\\n                float(\" + effectiveXSize[1] + \") *\\n                  (float(dyC) / float(\" + effectiveYSize[1] + \"));\\n\\n            int sourceNearestRow = int(min(\\n                float(int(\" + xHeight + \") - 1),\\n                \" + alignCorners + \" ? float(round(sourceFracRow)) :\\n                                  float(floor(sourceFracRow))));\\n\\n            int sourceNearestCol = int(min(\\n                float(int(\" + xWidth + \") - 1),\\n                \" + alignCorners + \" ? float(round(sourceFracCol)) :\\n                                  float(floor(sourceFracCol))));\\n\\n            if (r == sourceNearestRow && c == sourceNearestCol) {\\n              accumulator += getDy(b, dyR, dyC, d);\\n            }\\n          }\\n        }\\n        // End loop over dy\\n\\n        setOutput(accumulator);\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction resizeNearestNeighborGrad$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var images = inputs.images,\n\t      dy = inputs.dy;\n\t  var alignCorners = attrs.alignCorners;\n\t  var program = new ResizeNearestNeigborBackpropProgram(dy.shape, images.shape, alignCorners);\n\t  return backend.runWebGLProgram(program, [dy], dy.dtype);\n\t}\n\tvar resizeNearestNeighborGradConfig$2 = {\n\t  kernelName: ResizeNearestNeighborGrad,\n\t  backendName: 'webgl',\n\t  kernelFunc: resizeNearestNeighborGrad$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ReverseProgram = function ReverseProgram(xShape, axis) {\n\t  this.variableNames = ['x'];\n\t  var rank = xShape.length;\n\n\t  if (rank > 4) {\n\t    throw new Error(\"WebGL backend: Reverse of rank-\" + rank + \" tensor is not yet supported\");\n\t  }\n\n\t  this.outputShape = xShape;\n\n\t  if (rank === 1) {\n\t    this.userCode = \"\\n        void main() {\\n          int coord = getOutputCoords();\\n          setOutput(getX(\" + xShape[0] + \" - coord - 1));\\n        }\\n      \";\n\t    return;\n\t  }\n\n\t  var getInCoord = function getInCoord(i) {\n\t    if (axis.indexOf(i) !== -1 && xShape[i] !== 1) {\n\t      return xShape[i] + \" - coords[\" + i + \"] - 1\";\n\t    }\n\n\t    return \"coords[\" + i + \"]\";\n\t  };\n\n\t  var inCoords = xShape.map(function (_, i) {\n\t    return getInCoord(i);\n\t  }).join(',');\n\t  var type = getCoordsDataType(rank);\n\t  this.userCode = \"\\n      void main() {\\n        \" + type + \" coords = getOutputCoords();\\n        setOutput(getX(\" + inCoords + \"));\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ReversePackedProgram = function ReversePackedProgram(xShape, axis) {\n\t  this.variableNames = ['x'];\n\t  this.packedInputs = true;\n\t  this.packedOutput = true;\n\t  var rank = xShape.length;\n\n\t  if (rank > 4) {\n\t    throw new Error(\"WebGL backend: Reverse of rank-\" + rank + \" tensor is not yet supported\");\n\t  }\n\n\t  this.outputShape = xShape;\n\t  var channels = getChannels('rc', rank);\n\t  var nextColumn = channels[rank - 1] + \" + 1 < \" + this.outputShape[rank - 1];\n\t  var nextRow = channels[rank - 2] + \" + 1 < \" + this.outputShape[rank - 2];\n\t  var type = getCoordsDataType(rank);\n\n\t  if (rank === 1) {\n\t    this.userCode = \"\\n        void main(){\\n          int rc = getOutputCoords();\\n          vec4 result = vec4(0.);\\n          result.r = getChannel(getX(\" + xShape[0] + \" - rc - 1),\\n            \" + xShape[0] + \" - rc - 1);\\n          if(\" + nextColumn + \"){\\n              result.g = getChannel(getX(\" + xShape[0] + \" - (rc  + 1) - 1),\\n                \" + xShape[0] + \" - (rc  + 1) - 1);\\n          }\\n          setOutput(result);\\n        }\\n      \";\n\t  } else {\n\t    this.userCode = \"\\n        void main() {\\n          \" + type + \" rc = getOutputCoords();\\n          vec4 result = vec4(0.);\\n          result.r = \" + getR(channels.slice()) + \";\\n          if(\" + nextColumn + \"){\\n            result.g = \" + getG(channels.slice()) + \";\\n          }\\n          if(\" + nextRow + \") {\\n            result.b = \" + getB(channels.slice()) + \";\\n            if(\" + nextColumn + \") {\\n              result.a = \" + getA(channels.slice()) + \";\\n            }\\n          }\\n          setOutput(result);\\n        }\\n    \";\n\t  }\n\n\t  function getR(channels) {\n\t    return getChannel(channels);\n\t  }\n\n\t  function getG(channels) {\n\t    channels[rank - 1] = '(' + channels[rank - 1] + \" + 1)\";\n\t    return getChannel(channels);\n\t  }\n\n\t  function getB(channels) {\n\t    channels[rank - 2] = '(' + channels[rank - 2] + \" + 1)\";\n\t    return getChannel(channels);\n\t  }\n\n\t  function getA(channels) {\n\t    channels[rank - 1] = '(' + channels[rank - 1] + \" + 1)\";\n\t    channels[rank - 2] = '(' + channels[rank - 2] + \" + 1)\";\n\t    return getChannel(channels);\n\t  }\n\n\t  function getChannel(channels) {\n\t    var inCoordsArray = xShape.map(function (_, i) {\n\t      return getInCoord(i, channels);\n\t    });\n\t    var inCoords = inCoordsArray.join(',');\n\t    var innerDims = inCoordsArray.slice(-2).join(',');\n\t    return \"getChannel(getX(\" + inCoords + \"), vec2(\" + innerDims + \"))\";\n\t  }\n\n\t  function getInCoord(i, channels1) {\n\t    if (axis.indexOf(i) !== -1 && xShape[i] !== 1) {\n\t      return xShape[i] + \" - \" + channels1[i] + \" - 1\";\n\t    } else {\n\t      return \"\" + channels1[i];\n\t    }\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction reverse$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var dims = attrs.dims;\n\t  var xRank = x.shape.length;\n\t  var $dims = parseAxisParam(dims, x.shape);\n\n\t  if (xRank === 0) {\n\t    return identity$2({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend\n\t    });\n\t  }\n\n\t  var program = env().getBool('WEBGL_PACK_ARRAY_OPERATIONS') ? new ReversePackedProgram(x.shape, $dims) : new ReverseProgram(x.shape, $dims);\n\t  return backend.runWebGLProgram(program, [x], x.dtype);\n\t}\n\tvar reverseConfig$1 = {\n\t  kernelName: Reverse,\n\t  backendName: 'webgl',\n\t  kernelFunc: reverse$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar RotateProgram = function RotateProgram(imageShape, radians, fillValue, center) {\n\t  this.variableNames = ['Image'];\n\t  this.outputShape = [];\n\t  var imageHeight = imageShape[1];\n\t  var imageWidth = imageShape[2];\n\t  var sinFactor = Math.sin(radians).toFixed(3);\n\t  var cosFactor = Math.cos(radians).toFixed(3);\n\t  this.outputShape = imageShape;\n\n\t  var _backend_util$getImag = getImageCenter(center, imageHeight, imageWidth),\n\t      centerX = _backend_util$getImag[0],\n\t      centerY = _backend_util$getImag[1];\n\n\t  var centerXString = centerX.toFixed(3);\n\t  var centerYString = centerY.toFixed(3);\n\t  var fillSnippet = '';\n\n\t  if (typeof fillValue === 'number') {\n\t    fillSnippet = \"float outputValue = \" + fillValue.toFixed(2) + \";\";\n\t  } else {\n\t    fillSnippet = \"\\n        vec3 fill = vec3(\" + fillValue.join(',') + \");\\n        float outputValue = fill[coords[3]];\";\n\t  }\n\n\t  this.userCode = \"\\n        void main() {\\n          ivec4 coords = getOutputCoords();\\n          int x = coords[2];\\n          int y = coords[1];\\n          float coordXFloat = (float(x) - \" + centerXString + \") * \" + cosFactor + \" - (float(y) - \" + centerYString + \") * \" + sinFactor + \";\\n          float coordYFloat = (float(x) - \" + centerXString + \") * \" + sinFactor + \" + (float(y) - \" + centerYString + \") * \" + cosFactor + \";\\n          int coordX = int(round(coordXFloat + \" + centerXString + \"));\\n          int coordY = int(round(coordYFloat + \" + centerYString + \"));\\n          \" + fillSnippet + \"\\n          if(coordX >= 0 && coordX < \" + imageWidth + \" && coordY >= 0 && coordY < \" + imageHeight + \") {\\n            outputValue = getImage(coords[0], coordY, coordX, coords[3]);\\n          }\\n          setOutput(outputValue);\\n        }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar rotateWithOffsetConfig$1 = {\n\t  kernelName: RotateWithOffset,\n\t  backendName: 'webgl',\n\t  kernelFunc: function kernelFunc(_ref) {\n\t    var inputs = _ref.inputs,\n\t        attrs = _ref.attrs,\n\t        backend = _ref.backend;\n\t    var image = inputs.image;\n\t    var radians = attrs.radians,\n\t        fillValue = attrs.fillValue,\n\t        center = attrs.center;\n\t    var webglBackend = backend;\n\t    var program = new RotateProgram(image.shape, radians, fillValue, center);\n\t    var output = webglBackend.runWebGLProgram(program, [image], image.dtype);\n\t    return output;\n\t  }\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ROUND = \"\\n  // OpenGL ES does not support round function.\\n  // The algorithm is based on banker's rounding.\\n  float base = floor(x);\\n  if ((x - base) < 0.5) {\\n    return floor(x);\\n  } else if ((x - base) > 0.5) {\\n    return ceil(x);\\n  } else {\\n    if (mod(base, 2.0) == 0.0) {\\n      return base;\\n    } else {\\n      return base + 1.0;\\n    }\\n  }\\n\";\n\tvar round$3 = unaryKernelFunc$1({\n\t  opSnippet: ROUND\n\t});\n\tvar roundConfig$1 = {\n\t  kernelName: Round,\n\t  backendName: 'webgl',\n\t  kernelFunc: round$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar RSQRT = \"return inversesqrt(x);\";\n\tvar rsqrt$2 = unaryKernelFunc$1({\n\t  opSnippet: RSQRT,\n\t  cpuKernelImpl: rsqrtImplCPU\n\t});\n\tvar rsqrtConfig$1 = {\n\t  kernelName: Rsqrt,\n\t  backendName: 'webgl',\n\t  kernelFunc: rsqrt$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar ScatterProgram = function ScatterProgram(updateSize, sliceDim, indicesRank, updatesRank, strides, shape, summingDupeIndex) {\n\t  if (summingDupeIndex === void 0) {\n\t    summingDupeIndex = true;\n\t  }\n\n\t  this.variableNames = ['updates', 'indices', 'defaultValue'];\n\t  this.outputShape = shape;\n\t  var stridesType = getCoordsDataType(strides.length);\n\t  var dtype = getCoordsDataType(shape.length);\n\t  var indicesString = '';\n\n\t  if (indicesRank === 1) {\n\t    indicesString = 'i';\n\t  } else if (indicesRank === 2) {\n\t    indicesString = 'i, j';\n\t  }\n\n\t  var indicesSnippet = \"getIndices(\" + indicesString + \")\";\n\t  var updatesString = '';\n\n\t  if (updatesRank === 1) {\n\t    updatesString = 'i';\n\t  } else if (updatesRank === 2) {\n\t    updatesString = 'i, coords[1]';\n\t  }\n\n\t  var updatesSnippet = \"getUpdates(\" + updatesString + \")\";\n\t  var strideString = sliceDim > 1 ? 'strides[j]' : 'strides';\n\t  this.userCode = \"\\n        \" + stridesType + \" strides = \" + stridesType + \"(\" + strides + \");\\n\\n        void main() {\\n          \" + dtype + \" coords = getOutputCoords();\\n          float sum = 0.0;\\n          bool found = false;\\n          for (int i = 0; i < \" + updateSize + \"; i++) {\\n            int flattenedIndex = 0;\\n            for (int j = 0; j < \" + sliceDim + \"; j++) {\\n              int index = round(\" + indicesSnippet + \");\\n              flattenedIndex += index * \" + strideString + \";\\n            }\\n            if (flattenedIndex == coords[0]) {\\n              sum += \" + updatesSnippet + \";\\n              found = true;\\n            }\\n          }\\n          setOutput(mix(getDefaultValue(), sum, float(found)));\\n        }\\n      \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction scatterNd$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var indices = inputs.indices,\n\t      updates = inputs.updates;\n\t  var shape = attrs.shape;\n\n\t  var _backend_util$calcula = calculateShapes(updates, indices, shape),\n\t      sliceRank = _backend_util$calcula.sliceRank,\n\t      numUpdates = _backend_util$calcula.numUpdates,\n\t      sliceSize = _backend_util$calcula.sliceSize,\n\t      strides = _backend_util$calcula.strides,\n\t      outputSize = _backend_util$calcula.outputSize;\n\n\t  var flattenShape = [outputSize / sliceSize, sliceSize];\n\n\t  if (outputSize === 0) {\n\t    return backend.makeTensorInfo(shape, indices.dtype);\n\t  }\n\n\t  var flattenIndices = reshape$3({\n\t    inputs: {\n\t      x: indices\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: [numUpdates, sliceRank]\n\t    }\n\t  });\n\t  var flattenX = reshape$3({\n\t    inputs: {\n\t      x: updates\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: [numUpdates, sliceSize]\n\t    }\n\t  });\n\t  var defaultValue = backend.makeTensorInfo([], 'float32', new Float32Array([0])); // scalar(0)\n\n\t  var program = new ScatterProgram(numUpdates, sliceRank, flattenIndices.shape.length, flattenX.shape.length, strides, flattenShape);\n\t  var res = backend.runWebGLProgram(program, [flattenX, flattenIndices, defaultValue], flattenX.dtype);\n\t  var reshaped = reshape$3({\n\t    inputs: {\n\t      x: res\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: shape\n\t    }\n\t  });\n\t  backend.disposeIntermediateTensorInfo(flattenIndices);\n\t  backend.disposeIntermediateTensorInfo(flattenX);\n\t  backend.disposeIntermediateTensorInfo(res);\n\t  backend.disposeIntermediateTensorInfo(defaultValue);\n\t  return reshaped;\n\t}\n\tvar scatterNdConfig$1 = {\n\t  kernelName: ScatterNd,\n\t  backendName: 'webgl',\n\t  kernelFunc: scatterNd$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar SelectProgram = function SelectProgram(cRank, shape, rank) {\n\t  this.variableNames = ['c', 'a', 'b'];\n\t  this.outputShape = shape;\n\t  var cCoords;\n\t  var abCoords;\n\n\t  if (rank > 4) {\n\t    throw Error(\"Where for rank \" + rank + \" is not yet supported\");\n\t  }\n\n\t  if (rank === 1) {\n\t    abCoords = \"resRC\";\n\t    cCoords = \"resRC\";\n\t  } else {\n\t    var currentCoords = ['resRC.x', 'resRC.y', 'resRC.z', 'resRC.w'];\n\t    var cCoordVars = [];\n\t    var abCoordVars = [];\n\n\t    for (var i = 0; i < shape.length; i++) {\n\t      abCoordVars.push(\"\" + currentCoords[i]);\n\n\t      if (i < cRank) {\n\t        cCoordVars.push(\"\" + currentCoords[i]);\n\t      }\n\t    }\n\n\t    cCoords = cCoordVars.join();\n\t    abCoords = abCoordVars.join();\n\t  }\n\n\t  var dtype = getCoordsDataType(rank);\n\t  this.userCode = \"\\n      void main() {\\n        \" + dtype + \" resRC = getOutputCoords();\\n        float cVal = getC(\" + cCoords + \");\\n        if (cVal >= 1.0) {\\n          setOutput(getA(\" + abCoords + \"));\\n        } else {\\n          setOutput(getB(\" + abCoords + \"));\\n        }\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction select$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend;\n\t  var condition = inputs.condition,\n\t      t = inputs.t,\n\t      e = inputs.e;\n\t  var program = new SelectProgram(condition.shape.length, t.shape, t.shape.length);\n\t  return backend.runWebGLProgram(program, [condition, t, e], upcastType(t.dtype, e.dtype));\n\t}\n\tvar selectConfig$1 = {\n\t  kernelName: Select,\n\t  backendName: 'webgl',\n\t  kernelFunc: select$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar SELU = \"\\n  // Stable and Attracting Fixed Point (0, 1) for Normalized Weights.\\n  // see: https://arxiv.org/abs/1706.02515\\n  float scaleAlpha = \" + SELU_SCALEALPHA + \";\\n  float scale = \" + SELU_SCALE + \";\\n  return (x >= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0);\\n\";\n\tvar selu$2 = unaryKernelFunc$1({\n\t  opSnippet: SELU\n\t});\n\tvar seluConfig$1 = {\n\t  kernelName: Selu,\n\t  backendName: 'webgl',\n\t  kernelFunc: selu$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar SIGMOID = \"return 1.0 / (1.0 + exp(-1.0 * x));\";\n\tvar sigmoid$2 = unaryKernelFunc$1({\n\t  opSnippet: SIGMOID\n\t});\n\tvar sigmoidConfig$1 = {\n\t  kernelName: Sigmoid,\n\t  backendName: 'webgl',\n\t  kernelFunc: sigmoid$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tvar SIGN = \"\\n  if (isnan(x)) { return 0.0; }\\n  return sign(x);\\n\";\n\tvar sign$3 = unaryKernelFunc$1({\n\t  opSnippet: SIGN\n\t});\n\tvar signConfig$1 = {\n\t  kernelName: Sign,\n\t  backendName: 'webgl',\n\t  kernelFunc: sign$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar SIN = CHECK_NAN_SNIPPET_UNARY + \"\\n  return sin(x);\\n\";\n\tvar sin$2 = unaryKernelFunc$1({\n\t  opSnippet: SIN\n\t});\n\tvar sinConfig$1 = {\n\t  kernelName: Sin,\n\t  backendName: 'webgl',\n\t  kernelFunc: sin$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar SINH = \"\\n  float e2x = exp(x);\\n  return (e2x - 1.0 / e2x) / 2.0;\\n\";\n\tvar sinh$2 = unaryKernelFunc$1({\n\t  opSnippet: SINH\n\t});\n\tvar sinhConfig$1 = {\n\t  kernelName: Sinh,\n\t  backendName: 'webgl',\n\t  kernelFunc: sinh$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar SOFTPLUS = \"\\n  float epsilon = 1.1920928955078125e-7;\\n  float threshold = log(epsilon) + 2.0;\\n\\n  bool too_large = x > -threshold;\\n  bool too_small = x < threshold;\\n\\n  float result;\\n  float exp_x = exp(x);\\n\\n  if (too_large){\\n    result = x;\\n  }\\n  else if (too_small){\\n    result = exp_x;\\n  }\\n  else{\\n    result = log(exp_x + 1.0);\\n  }\\n  return result;\\n\";\n\tvar softplus$2 = unaryKernelFunc$1({\n\t  opSnippet: SOFTPLUS\n\t});\n\tvar softplusConfig$1 = {\n\t  kernelName: Softplus,\n\t  backendName: 'webgl',\n\t  kernelFunc: softplus$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar spaceToBatchND$2 = function spaceToBatchND(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var blockShape = attrs.blockShape,\n\t      paddings = attrs.paddings;\n\t  assert(x.shape.length <= 4, function () {\n\t    return 'spaceToBatchND for rank > 4 with a WebGL backend not ' + 'implemented yet';\n\t  });\n\t  var prod = blockShape.reduce(function (a, b) {\n\t    return a * b;\n\t  });\n\t  var completePaddings = [[0, 0]];\n\t  completePaddings.push.apply(completePaddings, paddings);\n\n\t  for (var i = 1 + blockShape.length; i < x.shape.length; ++i) {\n\t    completePaddings.push([0, 0]);\n\t  }\n\n\t  var toDispose = [];\n\t  var paddedX = padV2$1({\n\t    inputs: {\n\t      x: x\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      paddings: completePaddings,\n\t      constantValue: 0\n\t    }\n\t  });\n\t  var reshapedPaddedShape = getReshaped(paddedX.shape, blockShape, prod, false);\n\t  var permutedReshapedPaddedPermutation = getPermuted(reshapedPaddedShape.length, blockShape.length, false);\n\t  var flattenShape = getReshapedPermuted(paddedX.shape, blockShape, prod, false);\n\t  var reshapedPaddedX = reshape$3({\n\t    inputs: {\n\t      x: paddedX\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: reshapedPaddedShape\n\t    }\n\t  });\n\t  var paddedXT = transpose$2({\n\t    inputs: {\n\t      x: reshapedPaddedX\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      perm: permutedReshapedPaddedPermutation\n\t    }\n\t  });\n\t  var result = reshape$3({\n\t    inputs: {\n\t      x: paddedXT\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: flattenShape\n\t    }\n\t  });\n\t  toDispose.push(paddedX);\n\t  toDispose.push(reshapedPaddedX);\n\t  toDispose.push(paddedXT);\n\t  toDispose.forEach(function (t) {\n\t    return backend.disposeIntermediateTensorInfo(t);\n\t  });\n\t  return result;\n\t};\n\tvar spaceToBatchNDConfig$1 = {\n\t  kernelName: SpaceToBatchND,\n\t  backendName: 'webgl',\n\t  kernelFunc: spaceToBatchND$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction sparseToDense$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var sparseIndices = inputs.sparseIndices,\n\t      sparseValues = inputs.sparseValues,\n\t      defaultValue = inputs.defaultValue;\n\t  var outputShape = attrs.outputShape;\n\n\t  var _backend_util$calcula = calculateShapes(sparseValues, sparseIndices, outputShape),\n\t      sliceRank = _backend_util$calcula.sliceRank,\n\t      numUpdates = _backend_util$calcula.numUpdates,\n\t      strides = _backend_util$calcula.strides,\n\t      outputSize = _backend_util$calcula.outputSize;\n\n\t  var sumDupeIndices = false;\n\t  var program = new ScatterProgram(numUpdates, sliceRank, sparseIndices.shape.length, sparseValues.shape.length, strides, [outputSize, 1], sumDupeIndices);\n\t  var res = backend.runWebGLProgram(program, [sparseValues, sparseIndices, defaultValue], sparseValues.dtype);\n\t  var reshaped = reshape$3({\n\t    inputs: {\n\t      x: res\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: outputShape\n\t    }\n\t  });\n\t  backend.disposeIntermediateTensorInfo(res);\n\t  return reshaped;\n\t}\n\tvar sparseToDenseConfig$1 = {\n\t  kernelName: SparseToDense,\n\t  backendName: 'webgl',\n\t  kernelFunc: sparseToDense$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction splitV$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var numOrSizeSplits = attrs.numOrSizeSplits,\n\t      axis = attrs.axis;\n\t  var $axis = parseAxisParam(axis, x.shape)[0];\n\t  var splitSizes = prepareSplitSize(x, numOrSizeSplits, $axis);\n\t  var xRank = x.shape.length;\n\t  var begin = new Array(xRank).fill(0);\n\t  var size = x.shape.slice();\n\t  return splitSizes.map(function (s) {\n\t    var sliceSize = [].concat(size);\n\t    sliceSize[$axis] = s;\n\t    var sliceT = slice$4({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        begin: begin,\n\t        size: sliceSize\n\t      }\n\t    });\n\t    begin[$axis] += s;\n\t    return sliceT;\n\t  });\n\t}\n\tvar splitVConfig$1 = {\n\t  kernelName: SplitV,\n\t  backendName: 'webgl',\n\t  kernelFunc: splitV$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar SQRT = \"return sqrt(x);\";\n\tvar sqrt$5 = unaryKernelFunc$1({\n\t  opSnippet: SQRT\n\t});\n\tvar sqrtConfig$1 = {\n\t  kernelName: Sqrt,\n\t  backendName: 'webgl',\n\t  kernelFunc: sqrt$5\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2019 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar SQUARE = \"return x * x;\";\n\tvar square$2 = unaryKernelFunc$1({\n\t  opSnippet: SQUARE\n\t});\n\tvar squareConfig$1 = {\n\t  kernelName: Square,\n\t  backendName: 'webgl',\n\t  kernelFunc: square$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar SQUARED_DIFFERENCE$1 = 'return (a - b) * (a - b);';\n\tvar squaredDifference$2 = binaryKernelFunc$1({\n\t  opSnippet: SQUARED_DIFFERENCE$1,\n\t  packedOpSnippet: SQUARED_DIFFERENCE$1\n\t});\n\tvar squaredDifferenceConfig$1 = {\n\t  kernelName: SquaredDifference,\n\t  backendName: 'webgl',\n\t  kernelFunc: squaredDifference$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction step$2(_ref) {\n\t  var inputs = _ref.inputs,\n\t      attrs = _ref.attrs,\n\t      backend = _ref.backend;\n\t  var x = inputs.x;\n\t  var opSnippet = CHECK_NAN_SNIPPET + (\"\\n    return x > 0.0 ? 1.0 : float(\" + attrs.alpha + \");\\n  \");\n\t  var program = new UnaryOpProgram(x.shape, opSnippet);\n\t  return backend.runWebGLProgram(program, [x], x.dtype);\n\t}\n\tvar stepConfig$1 = {\n\t  kernelName: Step,\n\t  backendName: 'webgl',\n\t  kernelFunc: step$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar StridedSliceProgram = function StridedSliceProgram(begin, strides, size) {\n\t  this.variableNames = ['x'];\n\t  this.outputShape = size;\n\t  var rank = size.length;\n\t  var inputDtype = getCoordsDataType(size.length);\n\t  var dtype = getCoordsDataType(size.length);\n\t  var newCoords = '';\n\n\t  if (rank === 1) {\n\t    newCoords = 'coords * strides + begin';\n\t  } else {\n\t    var outputAxis = 0;\n\t    newCoords = size.map(function (_, i) {\n\t      outputAxis++;\n\t      return size.length === 1 ? \"coords * strides[\" + i + \"] + begin[\" + i + \"]\" : \"coords[\" + (outputAxis - 1) + \"] * strides[\" + i + \"] + begin[\" + i + \"]\";\n\t    }).join(',');\n\t  }\n\n\t  this.userCode = \"\\n      \" + inputDtype + \" begin = \" + inputDtype + \"(\" + begin + \");\\n      \" + inputDtype + \" strides = \" + inputDtype + \"(\" + strides + \");\\n\\n      void main() {\\n        \" + dtype + \" coords = getOutputCoords();\\n        setOutput(getX(\" + newCoords + \"));\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction stridedSlice$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var begin = attrs.begin,\n\t      end = attrs.end,\n\t      strides = attrs.strides,\n\t      beginMask = attrs.beginMask,\n\t      endMask = attrs.endMask,\n\t      ellipsisMask = attrs.ellipsisMask,\n\t      newAxisMask = attrs.newAxisMask,\n\t      shrinkAxisMask = attrs.shrinkAxisMask;\n\n\t  var _slice_util$sliceInfo = sliceInfo(x.shape, begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask),\n\t      nonStrided = _slice_util$sliceInfo.nonStrided,\n\t      $begin = _slice_util$sliceInfo.$begin,\n\t      $strides = _slice_util$sliceInfo.$strides,\n\t      size = _slice_util$sliceInfo.size,\n\t      newShape = _slice_util$sliceInfo.newShape,\n\t      outShape = _slice_util$sliceInfo.outShape;\n\n\t  var $x = reshape$3({\n\t    inputs: {\n\t      x: x\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: newShape\n\t    }\n\t  });\n\t  var result;\n\n\t  if (nonStrided) {\n\t    var sliced = slice$4({\n\t      inputs: {\n\t        x: $x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        begin: $begin,\n\t        size: size\n\t      }\n\t    });\n\t    result = reshape$3({\n\t      inputs: {\n\t        x: sliced\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: outShape\n\t      }\n\t    });\n\t    backend.disposeIntermediateTensorInfo(sliced);\n\t  } else if (outShape.some(function (axis) {\n\t    return axis === 0;\n\t  })) {\n\t    result = backend.makeTensorInfo(outShape, x.dtype, []);\n\t  } else {\n\t    var shouldExecuteOnCPU = backend.shouldExecuteOnCPU([$x]);\n\n\t    if (shouldExecuteOnCPU) {\n\t      var xTexData = backend.texData.get($x.dataId);\n\t      var values = xTexData.values;\n\t      var xBuf = buffer($x.shape, $x.dtype, values);\n\t      var resultValues = stridedSliceImplCPU(outShape, xBuf, $strides, $begin);\n\t      result = backend.makeTensorInfo(outShape, $x.dtype, resultValues.values);\n\t    } else {\n\t      var program = new StridedSliceProgram($begin, $strides, outShape);\n\t      result = backend.runWebGLProgram(program, [$x], $x.dtype);\n\t    }\n\t  }\n\n\t  var resultReshaped = reshape$3({\n\t    inputs: {\n\t      x: result\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: outShape\n\t    }\n\t  });\n\t  backend.disposeIntermediateTensorInfo($x);\n\t  backend.disposeIntermediateTensorInfo(result);\n\t  return resultReshaped;\n\t}\n\tvar stridedSliceConfig$1 = {\n\t  kernelName: StridedSlice,\n\t  backendName: 'webgl',\n\t  kernelFunc: stridedSlice$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar TAN = \"return tan(x);\";\n\tvar tan$2 = unaryKernelFunc$1({\n\t  opSnippet: TAN\n\t});\n\tvar tanConfig$1 = {\n\t  kernelName: Tan,\n\t  backendName: 'webgl',\n\t  kernelFunc: tan$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar TANH = \"\\n  float e2x = exp(-2.0 * abs(x));\\n  return sign(x) * (1.0 - e2x) / (1.0 + e2x);\\n\";\n\tvar tanh$3 = unaryKernelFunc$1({\n\t  opSnippet: TANH\n\t});\n\tvar tanhConfig$1 = {\n\t  kernelName: Tanh,\n\t  backendName: 'webgl',\n\t  kernelFunc: tanh$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2017 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar TileProgram = function TileProgram(aShape, reps) {\n\t  this.variableNames = ['A'];\n\t  var outputShape = new Array(aShape.length);\n\n\t  for (var i = 0; i < outputShape.length; i++) {\n\t    outputShape[i] = aShape[i] * reps[i];\n\t  }\n\n\t  this.outputShape = outputShape;\n\t  this.rank = outputShape.length;\n\t  var dtype = getCoordsDataType(this.rank);\n\t  var sourceCoords = getSourceCoords$2(aShape);\n\t  this.userCode = \"\\n      void main() {\\n        \" + dtype + \" resRC = getOutputCoords();\\n        setOutput(getA(\" + sourceCoords + \"));\\n      }\\n    \";\n\t};\n\n\tfunction getSourceCoords$2(aShape) {\n\t  var rank = aShape.length;\n\n\t  if (rank > 5) {\n\t    throw Error(\"Tile for rank \" + rank + \" is not yet supported\");\n\t  }\n\n\t  if (rank === 1) {\n\t    return \"imod(resRC, \" + aShape[0] + \")\";\n\t  }\n\n\t  var currentCoords = ['resRC.x', 'resRC.y', 'resRC.z', 'resRC.w', 'resRC.u'];\n\t  var sourceCoords = [];\n\n\t  for (var i = 0; i < aShape.length; i++) {\n\t    sourceCoords.push(\"imod(\" + currentCoords[i] + \", \" + aShape[i] + \")\");\n\t  }\n\n\t  return sourceCoords.join();\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction tile$3(params) {\n\t  var inputs = params.inputs,\n\t      backend = params.backend,\n\t      attrs = params.attrs;\n\t  var x = inputs.x;\n\t  var reps = attrs.reps;\n\n\t  if (x.dtype === 'string') {\n\t    // Even thought string tensor is always on CPU, just to be consistent on how\n\t    // to access tensor data.\n\t    var data = backend.readSync(x.dataId);\n\t    var decodedData = data.map(function (d) {\n\t      return decodeString(d);\n\t    });\n\t    var buf = buffer(x.shape, x.dtype, decodedData);\n\t    var outBuf = tileImplCPU(buf, reps);\n\t    return backend.makeTensorInfo(outBuf.shape, outBuf.dtype, outBuf.values);\n\t  }\n\n\t  var program = new TileProgram(x.shape, reps);\n\t  var output = backend.runWebGLProgram(program, [x], x.dtype);\n\t  return output;\n\t}\n\tvar tileConfig$1 = {\n\t  kernelName: Tile,\n\t  backendName: 'webgl',\n\t  kernelFunc: tile$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction topK$1(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x;\n\t  var k = attrs.k,\n\t      sorted = attrs.sorted;\n\t  var xVals = backend.readSync(x.dataId);\n\n\t  var _topKImplCPU = topKImplCPU(xVals, x.shape, x.dtype, k, sorted),\n\t      allTopKVals = _topKImplCPU[0],\n\t      allTopKIndices = _topKImplCPU[1];\n\n\t  return [backend.makeTensorInfo(allTopKVals.shape, allTopKVals.dtype, allTopKVals.values), backend.makeTensorInfo(allTopKIndices.shape, allTopKIndices.dtype, allTopKIndices.values)];\n\t}\n\tvar topKConfig$1 = {\n\t  kernelName: TopK,\n\t  backendName: 'webgl',\n\t  kernelFunc: topK$1\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the License);\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an AS IS BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction unique$3(args) {\n\t  var inputs = args.inputs,\n\t      attrs = args.attrs,\n\t      backend = args.backend;\n\t  var axis = attrs.axis;\n\t  var x = inputs.x;\n\t  assertNotComplex$1(x, 'unique'); // For now, always forward calculation to the CPU backend.\n\n\t  console.warn('WARNING: ', 'UI might be locked temporarily as data is being downloaded');\n\t  var values = backend.readSync(x.dataId);\n\n\t  var _uniqueImplCPU = uniqueImplCPU(values, axis, x.shape, x.dtype),\n\t      outputValues = _uniqueImplCPU.outputValues,\n\t      outputShape = _uniqueImplCPU.outputShape,\n\t      indices = _uniqueImplCPU.indices;\n\n\t  return [backend.makeTensorInfo(outputShape, x.dtype, outputValues), backend.makeTensorInfo([indices.length], 'int32', indices)];\n\t}\n\tvar uniqueConfig$1 = {\n\t  kernelName: Unique,\n\t  backendName: 'webgl',\n\t  kernelFunc: unique$3\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction unpack$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var value = inputs.value;\n\t  var axis = attrs.axis;\n\n\t  if (axis < 0) {\n\t    axis += value.shape.length;\n\t  }\n\n\t  var x = value;\n\t  var xRank = x.shape.length;\n\t  var num = value.shape[axis];\n\t  var outShape = new Array(xRank - 1);\n\t  var outIndex = 0;\n\n\t  for (var i = 0; i < xRank; i++) {\n\t    if (i !== axis) {\n\t      outShape[outIndex++] = x.shape[i];\n\t    }\n\t  }\n\n\t  var toDispose = [];\n\t  var begin = new Array(xRank).fill(0);\n\t  var size = x.shape.slice();\n\t  size[axis] = 1;\n\t  var res = new Array(num);\n\n\t  for (var _i = 0; _i < res.length; _i++) {\n\t    begin[axis] = _i;\n\t    var sliced = slice$4({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        begin: begin,\n\t        size: size\n\t      }\n\t    });\n\t    var reshaped = reshape$3({\n\t      inputs: {\n\t        x: sliced\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        shape: outShape\n\t      }\n\t    });\n\t    res[_i] = reshaped;\n\t    toDispose.push(sliced);\n\t  }\n\n\t  toDispose.forEach(function (t) {\n\t    return backend.disposeIntermediateTensorInfo(t);\n\t  });\n\t  return res;\n\t}\n\tvar unpackConfig$1 = {\n\t  kernelName: Unpack,\n\t  backendName: 'webgl',\n\t  kernelFunc: unpack$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar SegmentOpProgram = function SegmentOpProgram(segOpInfo, segOpType) {\n\t  this.variableNames = ['x', 'segmentIds'];\n\t  var windowSize = segOpInfo.windowSize;\n\t  var batchSize = segOpInfo.batchSize;\n\t  var inSize = segOpInfo.inSize;\n\t  var numSegments = segOpInfo.numSegments;\n\t  var outSize = numSegments * Math.ceil(inSize / windowSize);\n\t  this.outputShape = [batchSize, outSize];\n\t  var initializationValue = '0.0';\n\t  var returnValue = \"sumValue\";\n\t  var windowSizeNearestVec4 = Math.floor(windowSize / 4) * 4;\n\t  var windowSizeVec4Remainder = windowSize % 4;\n\t  var updateSnippet = \"\\n        sumValue += dot(values, segFilter);\\n    \";\n\t  var checkValueOutOfBounds = '';\n\n\t  if (inSize % windowSize > 0) {\n\t    checkValueOutOfBounds = \"\\n        if (inIdx < 0 || inIdx >= \" + inSize + \") {\\n          return initializationValue;\\n        }\\n      \";\n\t  }\n\n\t  var checkSegmentIdOutOfBounds = '';\n\n\t  if (inSize % windowSize > 0) {\n\t    checkSegmentIdOutOfBounds = \"\\n        if (inIdx < 0 || inIdx >= \" + inSize + \") {\\n          return -1.0;\\n        }\\n      \";\n\t  }\n\n\t  this.userCode = \"\\n      const float initializationValue = \" + initializationValue + \";\\n\\n      float getValue(int batch, int inIdx) {\\n        \" + checkValueOutOfBounds + \"\\n        return getX(batch, inIdx);\\n      }\\n\\n      float getSegmentIdAtIndex(int inIdx) {\\n        \" + checkSegmentIdOutOfBounds + \"\\n        return getSegmentIds(inIdx);\\n      }\\n\\n      void main() {\\n        ivec2 coords = getOutputCoords();\\n        int batch = coords[0];\\n        int outIdx = coords[1];\\n        int inOffset = int(floor(float(outIdx) / float(\\n          \" + numSegments + \")) * float(\" + windowSize + \"));\\n        int currentSeg = int(mod(float(outIdx), float(\" + numSegments + \")));\\n\\n        float sumValue = 0.0;\\n\\n        for (int i = 0; i < \" + windowSizeNearestVec4 + \"; i += 4) {\\n          int inIdx = inOffset + i;\\n          vec4 values = vec4(\\n            getValue(batch, inIdx),\\n            getValue(batch, inIdx + 1),\\n            getValue(batch, inIdx + 2),\\n            getValue(batch, inIdx + 3)\\n          );\\n\\n          vec4 segFilter = vec4(\\n            int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\\n            int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\\n            int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\\n            int(getSegmentIdAtIndex(inIdx + 3)) == currentSeg ? 1 : 0\\n          );\\n\\n          \" + updateSnippet + \"\\n        }\\n\\n        int inIdx = inOffset + \" + windowSizeNearestVec4 + \";\\n        if (\" + (windowSizeVec4Remainder === 1) + \") {\\n          vec4 values = vec4(\\n            getValue(batch, inIdx),\\n            initializationValue,\\n            initializationValue,\\n            initializationValue\\n          );\\n\\n          int inIdxSeg = int(getSegmentIdAtIndex(inIdx));\\n\\n          vec4 segFilter = vec4(\\n            int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\\n            0,\\n            0,\\n            0\\n          );\\n\\n          \" + updateSnippet + \"\\n        } else if (\" + (windowSizeVec4Remainder === 2) + \") {\\n          vec4 values = vec4(\\n            getValue(batch, inIdx),\\n            getValue(batch, inIdx + 1),\\n            initializationValue,\\n            initializationValue\\n          );\\n\\n          vec4 segFilter = vec4(\\n            int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\\n            int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\\n              0,\\n              0\\n          );\\n\\n          \" + updateSnippet + \"\\n        } else if (\" + (windowSizeVec4Remainder === 3) + \") {\\n          vec4 values = vec4(\\n            getValue(batch, inIdx),\\n            getValue(batch, inIdx + 1),\\n            getValue(batch, inIdx + 2),\\n            initializationValue\\n          );\\n\\n          vec4 segFilter = vec4(\\n            int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\\n            int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\\n            int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\\n            0\\n          );\\n\\n          \" + updateSnippet + \"\\n        }\\n        setOutput(\" + returnValue + \");\\n      }\\n    \";\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tfunction unsortedSegmentSum$2(args) {\n\t  var inputs = args.inputs,\n\t      backend = args.backend,\n\t      attrs = args.attrs;\n\t  var x = inputs.x,\n\t      segmentIds = inputs.segmentIds;\n\t  var numSegments = attrs.numSegments;\n\t  var xRank = x.shape.length;\n\t  var toDispose = [];\n\t  var axis = 0;\n\t  var permutation = getAxesPermutation([axis], xRank);\n\t  var permutedX = x;\n\n\t  if (permutation != null) {\n\t    permutedX = transpose$2({\n\t      inputs: {\n\t        x: x\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        perm: permutation\n\t      }\n\t    });\n\t    toDispose.push(permutedX);\n\t    axis = getInnerMostAxes(1, xRank)[0];\n\t  }\n\n\t  var outShape = computeOutShape$2(permutedX.shape, axis, numSegments);\n\t  var inSize = sizeFromShape([permutedX.shape[axis]]);\n\t  var a2D = reshape$3({\n\t    inputs: {\n\t      x: permutedX\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: [-1, inSize]\n\t    }\n\t  });\n\t  toDispose.push(a2D);\n\t  var outputDType = sumOutType(x.dtype);\n\n\t  var segOpCompute = function segOpCompute(x, segOpType, segmentIds, dtype, numSegments) {\n\t    var batchSize = x.shape[0];\n\t    var inSize = x.shape[1];\n\t    var windowSize = segOpComputeOptimalWindowSize(inSize, numSegments);\n\t    var segOpInfo = {\n\t      windowSize: windowSize,\n\t      inSize: inSize,\n\t      batchSize: batchSize,\n\t      numSegments: numSegments\n\t    };\n\t    var program = new SegmentOpProgram(segOpInfo, segOpType);\n\t    var output = backend.compileAndRun(program, [x, segmentIds], dtype);\n\t    toDispose.push(output); // No need to run another GPGPU program.\n\n\t    if (output.shape[1] === numSegments) {\n\t      return output;\n\t    }\n\n\t    var rangeInfo = range$3({\n\t      backend: backend,\n\t      attrs: {\n\t        start: 0,\n\t        stop: numSegments,\n\t        step: 1,\n\t        dtype: 'float32'\n\t      }\n\t    });\n\t    var tileInfo = tile$3({\n\t      inputs: {\n\t        x: rangeInfo\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        reps: [inSize / windowSize]\n\t      }\n\t    });\n\t    toDispose.push(rangeInfo);\n\t    toDispose.push(tileInfo);\n\t    var result = segOpCompute(output, segOpType, tileInfo, dtype, numSegments);\n\t    return result;\n\t  };\n\n\t  var segOpResult = segOpCompute(a2D, 'unsortedSegmentSum', segmentIds, outputDType, numSegments);\n\t  var reshaped = reshape$3({\n\t    inputs: {\n\t      x: segOpResult\n\t    },\n\t    backend: backend,\n\t    attrs: {\n\t      shape: outShape\n\t    }\n\t  });\n\t  var result = reshaped;\n\n\t  if (permutation != null) {\n\t    toDispose.push(reshaped);\n\t    var perm = getUndoAxesPermutation(permutation);\n\t    result = transpose$2({\n\t      inputs: {\n\t        x: result\n\t      },\n\t      backend: backend,\n\t      attrs: {\n\t        perm: perm\n\t      }\n\t    });\n\t  }\n\n\t  toDispose.forEach(function (t) {\n\t    return backend.disposeIntermediateTensorInfo(t);\n\t  });\n\t  return result;\n\t}\n\tvar unsortedSegmentSumConfig$1 = {\n\t  kernelName: UnsortedSegmentSum,\n\t  backendName: 'webgl',\n\t  kernelFunc: unsortedSegmentSum$2\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\tvar kernelConfigs$1 = [LRNConfig, LRNGradConfig, _fusedMatMulConfig$1, absConfig$1, acosConfig$1, acoshConfig$1, addConfig$1, addNConfig$1, allConfig$1, anyConfig$1, argMaxConfig$1, argMinConfig$1, asinConfig$1, asinhConfig$1, atan2Config$1, atanConfig$1, atanhConfig$1, avgPool3DConfig$1, avgPoolConfig$1, avgPoolGrad3DConfig, avgPoolGradConfig$2, batchMatMulConfig$1, batchNormConfig$1, batchToSpaceNDConfig$1, bincountConfig$1, castConfig$1, ceilConfig$1, clipByValueConfig, complexAbsConfig$1, complexConfig$1, concatConfig$1, conv2DBackpropFilterConfig$1, conv2DBackpropInputConfig$1, conv2DConfig$1, conv3DBackpropFilterV2Config$1, conv3DBackpropInputConfig, conv3DConfig$1, cosConfig$1, coshConfig$1, cropAndResizeConfig$1, cumsumConfig$1, denseBincountConfig$1, depthToSpaceConfig$1, depthwiseConv2dNativeBackpropFilterConfig$1, depthwiseConv2dNativeBackpropInputConfig$1, depthwiseConv2dNativeConfig$1, diagConfig$1, dilation2DConfig, eluConfig$1, eluGradConfig$2, equalConfig$1, erfConfig$1, expConfig$1, expandDimsConfig$1, expm1Config$1, fftConfig$1, fillConfig$1, flipLeftRightConfig$1, floorConfig$1, floorDivConfig$1, fromPixelsConfig, fusedConv2DConfig$1, fusedDepthwiseConv2DConfig$1, gatherNdConfig$1, gatherV2Config$1, greaterConfig$1, greaterEqualConfig$1, identityConfig$1, ifftConfig$1, imagConfig$1, isFiniteConfig$1, isInfConfig$1, isNaNConfig$1, leakyReluConfig$1, lessConfig$1, lessEqualConfig$1, linSpaceConfig$1, log1pConfig$1, logConfig$1, logicalAndConfig$1, logicalNotConfig$1, logicalOrConfig$1, maxConfig$1, maxPool3DConfig$1, maxPoolConfig$1, maxPoolGrad3DConfig, maxPoolGradConfig$2, maxPoolWithArgmaxConfig$1, maximumConfig$1, meanConfig$1, minConfig$1, minimumConfig$1, mirrorPadConfig$1, modConfig$1, multinomialConfig$1, multiplyConfig$1, negConfig$1, nonMaxSuppressionV3Config$1, nonMaxSuppressionV4Config$1, nonMaxSuppressionV5Config$1, notEqualConfig$1, oneHotConfig$1, onesLikeConfig$1, packConfig$1, padV2Config$1, powConfig$1, preluConfig$1, prodConfig$1, rangeConfig$1, realConfig$1, realDivConfig$1, reciprocalConfig$1, relu6Config$1, reluConfig$1, reshapeConfig$1, resizeBilinearConfig$1, resizeBilinearGradConfig$2, resizeNearestNeighborConfig$1, resizeNearestNeighborGradConfig$2, reverseConfig$1, rotateWithOffsetConfig$1, roundConfig$1, rsqrtConfig$1, scatterNdConfig$1, selectConfig$1, seluConfig$1, sigmoidConfig$1, signConfig$1, sinConfig$1, sinhConfig$1, sliceConfig$1, softmaxConfig$1, softplusConfig$1, spaceToBatchNDConfig$1, sparseToDenseConfig$1, splitVConfig$1, sqrtConfig$1, squareConfig$1, squaredDifferenceConfig$1, stepConfig$1, stridedSliceConfig$1, subConfig$1, sumConfig$1, tanConfig$1, tanhConfig$1, tileConfig$1, topKConfig$1, transposeConfig$1, uniqueConfig$1, unpackConfig$1, unsortedSegmentSumConfig$1, zerosLikeConfig$1];\n\n\tfor (var _i$2 = 0, _kernelConfigs$1 = kernelConfigs$1; _i$2 < _kernelConfigs$1.length; _i$2++) {\n\t  var kernelConfig$1 = _kernelConfigs$1[_i$2];\n\t  registerKernel(kernelConfig$1);\n\t}\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\t/** @license See the LICENSE file. */\n\t// This code is auto-generated, do not modify this file!\n\tvar version$7 = '2.8.3';\n\n\t/**\n\t * @license\n\t * Copyright 2018 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\tvar version$8 = {\n\t    'tfjs-core': version$1,\n\t    'tfjs-backend-cpu': version$5,\n\t    'tfjs-backend-webgl': version$6,\n\t    'tfjs-data': version$4,\n\t    'tfjs-layers': version$2,\n\t    'tfjs-converter': version$3,\n\t    'tfjs': version$7\n\t};\n\n\t/**\n\t * @license\n\t * Copyright 2020 Google LLC. All Rights Reserved.\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * =============================================================================\n\t */\n\n\texports.Abs = Abs;\n\texports.Acos = Acos;\n\texports.Acosh = Acosh;\n\texports.AdadeltaOptimizer = AdadeltaOptimizer;\n\texports.AdagradOptimizer = AdagradOptimizer;\n\texports.AdamOptimizer = AdamOptimizer;\n\texports.AdamaxOptimizer = AdamaxOptimizer;\n\texports.Add = Add;\n\texports.AddN = AddN;\n\texports.All = All;\n\texports.Any = Any;\n\texports.ArgMax = ArgMax;\n\texports.ArgMin = ArgMin;\n\texports.Asin = Asin;\n\texports.Asinh = Asinh;\n\texports.Atan = Atan;\n\texports.Atan2 = Atan2;\n\texports.Atanh = Atanh;\n\texports.AvgPool = AvgPool;\n\texports.AvgPool3D = AvgPool3D;\n\texports.AvgPool3DGrad = AvgPool3DGrad;\n\texports.AvgPoolGrad = AvgPoolGrad;\n\texports.BatchMatMul = BatchMatMul;\n\texports.BatchToSpaceND = BatchToSpaceND;\n\texports.Bincount = Bincount;\n\texports.BroadcastTo = BroadcastTo;\n\texports.Callback = Callback;\n\texports.CallbackList = CallbackList;\n\texports.Cast = Cast;\n\texports.Ceil = Ceil;\n\texports.ClipByValue = ClipByValue;\n\texports.Complex = Complex;\n\texports.ComplexAbs = ComplexAbs;\n\texports.Concat = Concat;\n\texports.Conv2D = Conv2D;\n\texports.Conv2DBackpropFilter = Conv2DBackpropFilter;\n\texports.Conv2DBackpropInput = Conv2DBackpropInput;\n\texports.Conv3D = Conv3D;\n\texports.Conv3DBackpropFilterV2 = Conv3DBackpropFilterV2;\n\texports.Conv3DBackpropInputV2 = Conv3DBackpropInputV2;\n\texports.Cos = Cos;\n\texports.Cosh = Cosh;\n\texports.CropAndResize = CropAndResize;\n\texports.Cumsum = Cumsum;\n\texports.CustomCallback = CustomCallback;\n\texports.DataStorage = DataStorage;\n\texports.DenseBincount = DenseBincount;\n\texports.DepthToSpace = DepthToSpace;\n\texports.DepthwiseConv2dNative = DepthwiseConv2dNative;\n\texports.DepthwiseConv2dNativeBackpropFilter = DepthwiseConv2dNativeBackpropFilter;\n\texports.DepthwiseConv2dNativeBackpropInput = DepthwiseConv2dNativeBackpropInput;\n\texports.Diag = Diag;\n\texports.Dilation2D = Dilation2D;\n\texports.Dilation2DBackpropFilter = Dilation2DBackpropFilter;\n\texports.Dilation2DBackpropInput = Dilation2DBackpropInput;\n\texports.EarlyStopping = EarlyStopping;\n\texports.Elu = Elu;\n\texports.EluGrad = EluGrad;\n\texports.Environment = Environment;\n\texports.Equal = Equal;\n\texports.Erf = Erf;\n\texports.Exp = Exp;\n\texports.ExpandDims = ExpandDims;\n\texports.Expm1 = Expm1;\n\texports.FFT = FFT;\n\texports.Fill = Fill;\n\texports.FlipLeftRight = FlipLeftRight;\n\texports.Floor = Floor;\n\texports.FloorDiv = FloorDiv;\n\texports.FromPixels = FromPixels;\n\texports.FusedBatchNorm = FusedBatchNorm;\n\texports.FusedConv2D = FusedConv2D;\n\texports.FusedDepthwiseConv2D = FusedDepthwiseConv2D;\n\texports.GatherNd = GatherNd;\n\texports.GatherV2 = GatherV2;\n\texports.GraphModel = GraphModel;\n\texports.Greater = Greater;\n\texports.GreaterEqual = GreaterEqual;\n\texports.History = History;\n\texports.IFFT = IFFT;\n\texports.Identity = Identity;\n\texports.Imag = Imag;\n\texports.InputSpec = InputSpec;\n\texports.IsFinite = IsFinite;\n\texports.IsInf = IsInf;\n\texports.IsNan = IsNan;\n\texports.KernelBackend = KernelBackend;\n\texports.LRN = LRN;\n\texports.LRNGrad = LRNGrad;\n\texports.LayerVariable = LayerVariable;\n\texports.LayersModel = LayersModel;\n\texports.LeakyRelu = LeakyRelu;\n\texports.Less = Less;\n\texports.LessEqual = LessEqual;\n\texports.LinSpace = LinSpace;\n\texports.Log = Log;\n\texports.Log1p = Log1p;\n\texports.LogSoftmax = LogSoftmax;\n\texports.LogicalAnd = LogicalAnd;\n\texports.LogicalNot = LogicalNot;\n\texports.LogicalOr = LogicalOr;\n\texports.Max = Max;\n\texports.MaxPool = MaxPool;\n\texports.MaxPool3D = MaxPool3D;\n\texports.MaxPool3DGrad = MaxPool3DGrad;\n\texports.MaxPoolGrad = MaxPoolGrad;\n\texports.MaxPoolWithArgmax = MaxPoolWithArgmax;\n\texports.Maximum = Maximum;\n\texports.Mean = Mean;\n\texports.Min = Min;\n\texports.Minimum = Minimum;\n\texports.MirrorPad = MirrorPad;\n\texports.Mod = Mod;\n\texports.MomentumOptimizer = MomentumOptimizer;\n\texports.Multinomial = Multinomial;\n\texports.Multiply = Multiply;\n\texports.Neg = Neg;\n\texports.NonMaxSuppressionV3 = NonMaxSuppressionV3;\n\texports.NonMaxSuppressionV4 = NonMaxSuppressionV4;\n\texports.NonMaxSuppressionV5 = NonMaxSuppressionV5;\n\texports.NotEqual = NotEqual;\n\texports.OP_SCOPE_SUFFIX = OP_SCOPE_SUFFIX;\n\texports.OneHot = OneHot;\n\texports.OnesLike = OnesLike;\n\texports.Optimizer = Optimizer;\n\texports.Pack = Pack;\n\texports.PadV2 = PadV2;\n\texports.Pool = Pool;\n\texports.Pow = Pow;\n\texports.Prelu = Prelu;\n\texports.Prod = Prod;\n\texports.RMSPropOptimizer = RMSPropOptimizer;\n\texports.RNN = RNN;\n\texports.Range = Range;\n\texports.Real = Real;\n\texports.RealDiv = RealDiv;\n\texports.Reciprocal = Reciprocal;\n\texports.Relu = Relu;\n\texports.Relu6 = Relu6;\n\texports.Reshape = Reshape;\n\texports.ResizeBilinear = ResizeBilinear;\n\texports.ResizeBilinearGrad = ResizeBilinearGrad;\n\texports.ResizeNearestNeighbor = ResizeNearestNeighbor;\n\texports.ResizeNearestNeighborGrad = ResizeNearestNeighborGrad;\n\texports.Reverse = Reverse;\n\texports.RotateWithOffset = RotateWithOffset;\n\texports.Round = Round;\n\texports.Rsqrt = Rsqrt;\n\texports.SGDOptimizer = SGDOptimizer;\n\texports.ScatterNd = ScatterNd;\n\texports.Select = Select;\n\texports.Selu = Selu;\n\texports.Sequential = Sequential;\n\texports.Sigmoid = Sigmoid;\n\texports.Sign = Sign;\n\texports.Sin = Sin;\n\texports.Sinh = Sinh;\n\texports.Slice = Slice;\n\texports.Softmax = Softmax;\n\texports.Softplus = Softplus;\n\texports.SpaceToBatchND = SpaceToBatchND;\n\texports.SparseToDense = SparseToDense;\n\texports.SplitV = SplitV;\n\texports.Sqrt = Sqrt;\n\texports.Square = Square;\n\texports.SquaredDifference = SquaredDifference;\n\texports.Step = Step;\n\texports.StridedSlice = StridedSlice;\n\texports.Sub = Sub;\n\texports.Sum = Sum;\n\texports.SymbolicTensor = SymbolicTensor;\n\texports.Tan = Tan;\n\texports.Tanh = Tanh;\n\texports.Tensor = Tensor;\n\texports.TensorBuffer = TensorBuffer;\n\texports.Tile = Tile;\n\texports.TopK = TopK;\n\texports.Transpose = Transpose;\n\texports.Unique = Unique;\n\texports.Unpack = Unpack;\n\texports.UnsortedSegmentSum = UnsortedSegmentSum;\n\texports.Variable = Variable;\n\texports.ZerosLike = ZerosLike;\n\texports._FusedMatMul = _FusedMatMul;\n\texports.abs = abs$8;\n\texports.acos = acos;\n\texports.acosh = acosh;\n\texports.add = add$1;\n\texports.addN = addN;\n\texports.addStrict = addStrict;\n\texports.all = all;\n\texports.any = any;\n\texports.argMax = argMax;\n\texports.argMin = argMin;\n\texports.asin = asin;\n\texports.asinh = asinh$1;\n\texports.atan = atan;\n\texports.atan2 = atan2;\n\texports.atanh = atanh;\n\texports.avgPool = avgPool;\n\texports.avgPool3d = avgPool3d;\n\texports.backend = backend;\n\texports.backend_util = backend_util;\n\texports.basicLSTMCell = basicLSTMCell;\n\texports.batchNorm = batchNorm;\n\texports.batchNorm2d = batchNorm2d;\n\texports.batchNorm3d = batchNorm3d;\n\texports.batchNorm4d = batchNorm4d;\n\texports.batchToSpaceND = batchToSpaceND;\n\texports.bincount = bincount;\n\texports.booleanMaskAsync = booleanMaskAsync;\n\texports.broadcastTo = broadcastTo;\n\texports.browser = browser;\n\texports.buffer = buffer;\n\texports.callbacks = callbacks;\n\texports.cast = cast;\n\texports.ceil = ceil$3;\n\texports.clipByValue = clipByValue;\n\texports.clone = clone;\n\texports.complex = complex;\n\texports.concat = concat;\n\texports.concat1d = concat1d;\n\texports.concat2d = concat2d;\n\texports.concat3d = concat3d;\n\texports.concat4d = concat4d;\n\texports.constraints = exports_constraints;\n\texports.conv1d = conv1d;\n\texports.conv2d = conv2d;\n\texports.conv2dTranspose = conv2dTranspose;\n\texports.conv3d = conv3d;\n\texports.conv3dTranspose = conv3dTranspose;\n\texports.copyRegisteredKernels = copyRegisteredKernels;\n\texports.cos = cos;\n\texports.cosh = cosh;\n\texports.cosineWindow = cosineWindow;\n\texports.cumsum = cumsum;\n\texports.customGrad = customGrad;\n\texports.data = index$1;\n\texports.denseBincount = denseBincount;\n\texports.deprecationWarn = deprecationWarn;\n\texports.depthToSpace = depthToSpace;\n\texports.depthwiseConv2d = depthwiseConv2d;\n\texports.deregisterOp = deregisterOp;\n\texports.device_util = device_util;\n\texports.diag = diag;\n\texports.dilation2d = dilation2d;\n\texports.disableDeprecationWarnings = disableDeprecationWarnings;\n\texports.dispose = dispose;\n\texports.disposeVariables = disposeVariables;\n\texports.div = div;\n\texports.divNoNan = divNoNan;\n\texports.divStrict = divStrict;\n\texports.dot = dot;\n\texports.dropout = dropout;\n\texports.elu = elu;\n\texports.enableDebugMode = enableDebugMode;\n\texports.enableProdMode = enableProdMode;\n\texports.enclosingPowerOfTwo = enclosingPowerOfTwo;\n\texports.engine = engine;\n\texports.env = env;\n\texports.equal = equal;\n\texports.equalStrict = equalStrict;\n\texports.erf = erf;\n\texports.exp = exp$3;\n\texports.expandDims = expandDims;\n\texports.expm1 = expm1;\n\texports.eye = eye;\n\texports.fft = fft;\n\texports.fill = fill;\n\texports.findBackend = findBackend;\n\texports.findBackendFactory = findBackendFactory;\n\texports.floor = floor$a;\n\texports.floorDiv = floorDiv;\n\texports.fused = fused_ops;\n\texports.gather = gather;\n\texports.gatherND = gatherND;\n\texports.gather_util = gather_nd_util;\n\texports.getBackend = getBackend;\n\texports.getGradient = getGradient;\n\texports.getKernel = getKernel;\n\texports.getKernelsForBackend = getKernelsForBackend;\n\texports.grad = grad;\n\texports.grads = grads;\n\texports.greater = greater;\n\texports.greaterEqual = greaterEqual;\n\texports.greaterEqualStrict = greaterEqualStrict;\n\texports.greaterStrict = greaterStrict;\n\texports.ifft = ifft;\n\texports.imag = imag;\n\texports.image = image;\n\texports.inTopKAsync = inTopKAsync;\n\texports.initializers = exports_initializers;\n\texports.input = input;\n\texports.io = io;\n\texports.irfft = irfft;\n\texports.isFinite = isFinite$1;\n\texports.isInf = isInf;\n\texports.isNaN = isNaN$1;\n\texports.keep = keep;\n\texports.kernel_impls = kernel_impls;\n\texports.layers = exports_layers;\n\texports.leakyRelu = leakyRelu;\n\texports.less = less;\n\texports.lessEqual = lessEqual;\n\texports.lessEqualStrict = lessEqualStrict;\n\texports.lessStrict = lessStrict;\n\texports.linalg = linalg;\n\texports.linspace = linspace;\n\texports.loadGraphModel = loadGraphModel;\n\texports.loadLayersModel = loadLayersModel;\n\texports.localResponseNormalization = localResponseNormalization;\n\texports.log = log$9;\n\texports.log1p = log1p;\n\texports.logSigmoid = logSigmoid;\n\texports.logSoftmax = logSoftmax;\n\texports.logSumExp = logSumExp;\n\texports.logicalAnd = logicalAnd;\n\texports.logicalNot = logicalNot;\n\texports.logicalOr = logicalOr;\n\texports.logicalXor = logicalXor;\n\texports.losses = losses;\n\texports.matMul = matMul;\n\texports.math = math;\n\texports.max = max$4;\n\texports.maxPool = maxPool;\n\texports.maxPool3d = maxPool3d;\n\texports.maxPoolWithArgmax = maxPoolWithArgmax;\n\texports.maximum = maximum;\n\texports.maximumStrict = maximumStrict;\n\texports.mean = mean;\n\texports.memory = memory;\n\texports.metrics = exports_metrics;\n\texports.min = min$9;\n\texports.minimum = minimum;\n\texports.minimumStrict = minimumStrict;\n\texports.mirrorPad = mirrorPad;\n\texports.mod = mod;\n\texports.modStrict = modStrict;\n\texports.model = model;\n\texports.models = exports_models;\n\texports.moments = moments;\n\texports.movingAverage = movingAverage;\n\texports.mul = mul;\n\texports.mulStrict = mulStrict;\n\texports.multiRNNCell = multiRNNCell;\n\texports.multinomial = multinomial;\n\texports.neg = neg;\n\texports.nextFrame = nextFrame;\n\texports.norm = norm;\n\texports.notEqual = notEqual;\n\texports.notEqualStrict = notEqualStrict;\n\texports.oneHot = oneHot;\n\texports.ones = ones$1;\n\texports.onesLike = onesLike;\n\texports.op = op;\n\texports.outerProduct = outerProduct;\n\texports.pad = pad;\n\texports.pad1d = pad1d;\n\texports.pad2d = pad2d;\n\texports.pad3d = pad3d;\n\texports.pad4d = pad4d;\n\texports.pool = pool;\n\texports.pow = pow$5;\n\texports.powStrict = powStrict;\n\texports.prelu = prelu;\n\texports.print = print;\n\texports.prod = prod;\n\texports.profile = profile;\n\texports.rand = rand;\n\texports.randomGamma = randomGamma;\n\texports.randomNormal = randomNormal;\n\texports.randomUniform = randomUniform;\n\texports.range = range;\n\texports.ready = ready;\n\texports.real = real;\n\texports.reciprocal = reciprocal;\n\texports.registerBackend = registerBackend;\n\texports.registerCallbackConstructor = registerCallbackConstructor;\n\texports.registerGradient = registerGradient;\n\texports.registerKernel = registerKernel;\n\texports.registerOp = registerOp;\n\texports.regularizers = exports_regularizers;\n\texports.relu = relu;\n\texports.relu6 = relu6;\n\texports.removeBackend = removeBackend;\n\texports.reshape = reshape;\n\texports.reverse = reverse;\n\texports.reverse1d = reverse1d;\n\texports.reverse2d = reverse2d;\n\texports.reverse3d = reverse3d;\n\texports.reverse4d = reverse4d;\n\texports.rfft = rfft;\n\texports.round = round$1;\n\texports.rsqrt = rsqrt;\n\texports.scalar = scalar;\n\texports.scatterND = scatterND;\n\texports.scatter_util = scatter_nd_util;\n\texports.selu = selu;\n\texports.separableConv2d = separableConv2d;\n\texports.sequential = sequential;\n\texports.serialization = serialization;\n\texports.setBackend = setBackend;\n\texports.setPlatform = setPlatform;\n\texports.setdiff1dAsync = setdiff1dAsync;\n\texports.sigmoid = sigmoid;\n\texports.sign = sign;\n\texports.signal = signal;\n\texports.sin = sin;\n\texports.sinh = sinh;\n\texports.slice = slice$2;\n\texports.slice1d = slice1d;\n\texports.slice2d = slice2d;\n\texports.slice3d = slice3d;\n\texports.slice4d = slice4d;\n\texports.slice_util = slice_util;\n\texports.softmax = softmax;\n\texports.softplus = softplus;\n\texports.spaceToBatchND = spaceToBatchND;\n\texports.sparseToDense = sparseToDense;\n\texports.spectral = spectral;\n\texports.split = split$1;\n\texports.sqrt = sqrt$3;\n\texports.square = square;\n\texports.squaredDifference = squaredDifference;\n\texports.squaredDifferenceStrict = squaredDifferenceStrict;\n\texports.squeeze = squeeze;\n\texports.stack = stack;\n\texports.step = step;\n\texports.stridedSlice = stridedSlice;\n\texports.sub = sub;\n\texports.subStrict = subStrict;\n\texports.sum = sum$1;\n\texports.sumOutType = sumOutType;\n\texports.tan = tan;\n\texports.tanh = tanh$1;\n\texports.tensor = tensor;\n\texports.tensor1d = tensor1d;\n\texports.tensor2d = tensor2d;\n\texports.tensor3d = tensor3d;\n\texports.tensor4d = tensor4d;\n\texports.tensor5d = tensor5d;\n\texports.tensor6d = tensor6d;\n\texports.tensor_util = tensor_util;\n\texports.test_util = test_util;\n\texports.tidy = tidy;\n\texports.tile = tile;\n\texports.time = time;\n\texports.topk = topk;\n\texports.train = train;\n\texports.transpose = transpose;\n\texports.truncatedNormal = truncatedNormal;\n\texports.unique = unique;\n\texports.unregisterGradient = unregisterGradient;\n\texports.unregisterKernel = unregisterKernel;\n\texports.unsortedSegmentSum = unsortedSegmentSum;\n\texports.unstack = unstack;\n\texports.upcastType = upcastType;\n\texports.util = util;\n\texports.valueAndGrad = valueAndGrad;\n\texports.valueAndGrads = valueAndGrads;\n\texports.variable = variable;\n\texports.variableGrads = variableGrads;\n\texports.version = version$8;\n\texports.version_converter = version$3;\n\texports.version_core = version$1;\n\texports.version_layers = version$2;\n\texports.where = where;\n\texports.whereAsync = whereAsync;\n\texports.zeros = zeros;\n\texports.zerosLike = zerosLike;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=tf.js.map\n"
  },
  {
    "path": "lib/tracky-mouse/core/package.json",
    "content": "{\n  \"name\": \"tracky-mouse\",\n  \"version\": \"1.2.0\",\n  \"description\": \"Add facial mouse accessibility to JavaScript applications\",\n  \"license\": \"MIT\",\n  \"author\": {\n    \"name\": \"Isaiah Odhner\",\n    \"email\": \"isaiahodhner@gmail.com\",\n    \"url\": \"https://isaiahodhner.io\"\n  },\n  \"keywords\": [\n    \"camera-mouse\",\n    \"mouse\",\n    \"camera\",\n    \"webcam\",\n    \"head-tracker\",\n    \"head-tracking\",\n    \"face-tracker\",\n    \"face-tracking\",\n    \"headmouse\",\n    \"facial-mouse\",\n    \"facemesh\",\n    \"eye-tracker\",\n    \"eye-tracking\",\n    \"eye-gaze\",\n    \"accessibility\",\n    \"cursor\",\n    \"pointer\",\n    \"pointing\",\n    \"input-method\",\n    \"hands-free\",\n    \"handsfree\",\n    \"desktop-automation\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/1j01/tracky-mouse.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/1j01/tracky-mouse/issues\"\n  },\n  \"homepage\": \"https://trackymouse.js.org/\",\n  \"main\": \"tracky-mouse.js\",\n  \"browser\": \"tracky-mouse.js\",\n  \"files\": [\n    \"tracky-mouse.js\",\n    \"tracky-mouse.css\",\n    \"facemesh.worker.js\",\n    \"lib/\"\n  ]\n}\n"
  },
  {
    "path": "lib/tracky-mouse/core/tracky-mouse.css",
    "content": ".tracky-mouse-pointer {\n\tz-index: 900000;\n\tpointer-events: none;\n\tborder-radius: 50%;\n\tbackground-color: red;\n\twidth: 20px;\n\theight: 20px;\n\tposition: fixed;\n\ttransform: translate(-50%, -50%);\n}\n\n.tracky-mouse-dwell-indicator {\n\tposition: fixed;\n\tpointer-events: none;\n\tz-index: 1000000;\n}\n\n.tracky-mouse-dwell-indicator::after {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\tbackground: red;\n\tleft: 2px;\n\ttop: 2px;\n\tright: 2px;\n\tbottom: 2px;\n}\n\n.tracky-mouse-dwell-indicator:not(.tracky-mouse-for-release) {\n\tbackground: yellow;\n}\n\n.tracky-mouse-dwell-indicator.tracky-mouse-for-release {\n\tbackground: white;\n}\n\n.tracky-mouse-dwell-indicator:not(.tracky-mouse-for-release),\n.tracky-mouse-dwell-indicator:not(.tracky-mouse-for-release)::after {\n\tborder-radius: 50%;\n}\n\n.tracky-mouse-dwell-indicator.tracky-mouse-for-release,\n.tracky-mouse-dwell-indicator.tracky-mouse-for-release::after {\n\tclip-path: polygon(30% 0%, 70% 0%, 100% 30%, 100% 70%, 70% 100%, 30% 100%, 0% 70%, 0% 30%);\n}\n\n.tracky-mouse-hover-halo {\n\tpointer-events: none;\n\tz-index: 1000000;\n\tbox-shadow: 0 0 10px yellow, 0 0 3px yellow;\n}\n\n.tracky-mouse-ui {\n\tdisplay: flex;\n\tflex-direction: column;\n\tbackground-color: rgb(223, 204, 255);\n\tcolor: black;\n\tpadding: 10px;\n\tborder-radius: 5px;\n\t--max-ui-width: 600px;\n\tmax-width: var(--max-ui-width);\n\tbox-sizing: border-box;\n\tfont-size: 15px;\n\tfont-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n\taccent-color: rgb(191, 36, 234);\n}\n\n.tracky-mouse-canvas {\n\tmax-width: 100%;\n\tobject-fit: scale-down;\n\tbackground-color: rgba(15, 0, 20, 0.5);\n}\n\n.tracky-mouse-start-stop-button {\n\tbackground-color: rgb(191, 36, 234);\n\tcolor: white;\n\tfont-size: 20px;\n\tborder-radius: 5px;\n\tpadding: 5px;\n\tmargin: 5px;\n\twidth: 120px;\n\tcursor: pointer;\n}\n\n.tracky-mouse-start-stop-button::after {\n\tcontent: \"(\" attr(aria-keyshortcuts) \")\";\n\topacity: 0.6;\n\tmargin-left: 0.5em;\n}\n\n.tracky-mouse-ui .tracky-mouse-control-row:not([hidden]) {\n\tdisplay: flex;\n}\n\n.tracky-mouse-ui .tracky-mouse-control-row label {\n\t/* Avoid accidental clicks on controls by their labels, when otherwise 100% width. */\n\t/* This may not be needed in the current layout. */\n\twidth: fit-content;\n}\n\n.tracky-mouse-ui .tracky-mouse-label-text {\n\tdisplay: inline-block;\n\tmin-width: 150px;\n}\n\n.tracky-mouse-ui .tracky-mouse-labeled-slider {\n\tdisplay: inline-flex;\n\tposition: relative;\n\tmargin-bottom: 20px;\n\tflex: 1;\n\tmax-width: 400px;\n}\n\n.tracky-mouse-ui .tracky-mouse-labeled-slider input {\n\tflex: 1;\n}\n\n.tracky-mouse-ui .tracky-mouse-labeled-slider .tracky-mouse-min-label,\n.tracky-mouse-ui .tracky-mouse-labeled-slider .tracky-mouse-max-label {\n\topacity: 0.8;\n\tposition: absolute;\n\tbottom: -10px;\n\tpointer-events: none;\n}\n\n.tracky-mouse-ui .tracky-mouse-labeled-slider .tracky-mouse-min-label {\n\tleft: 0;\n}\n\n.tracky-mouse-ui .tracky-mouse-labeled-slider .tracky-mouse-max-label {\n\tright: 0;\n}\n\n.tracky-mouse-canvas-container-container {\n\tflex: 1;\n\tflex-basis: 0;\n\tmin-width: 0;\n\t/* I might be able to simplify this or let it have an intrinsic height\n\tbased on the width, for the web demo, by leaving min-height unset (auto),\n\tand only setting it\tto 0 for the desktop app.\n\tWell, really the difference is whether the height of the .tracky-mouse-ui\n\tis fixed or not, not whether it's a web demo or desktop app.\n\tSo I might differentiate based on a .constrained-height class or something,\n\tif not detect it automatically. */\n\tmin-height: var(--tracky-mouse-camera-view-min-height, 300px);\n}\n\n.tracky-mouse-canvas-container {\n\tposition: relative;\n\t/* Note: aspect-ratio is set from JS, which determines the width implicitly. */\n\tmax-height: 100%;\n\tmargin: auto;\n}\n\n.tracky-mouse-canvas-overlay {\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\twidth: 100%;\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.tracky-mouse-use-camera-button {\n\tfont-size: min(2em, 8vw);\n\tcolor: white;\n\tbackground-color: rgb(220, 20, 60);\n\tborder: 0;\n\tborder-radius: 5px;\n\tpadding: 10px;\n\tcursor: pointer;\n}\n\n.tracky-mouse-use-camera-button:hover {\n\tbackground-color: rgb(230, 20, 62);\n}\n\n.tracky-mouse-error-message {\n\tfont-size: min(1.5em, 6vw);\n\ttext-align: center;\n\tcolor: white;\n\tpadding: 5px;\n}\n\n/* Screen overlay in electron app */\n\n#tracky-mouse-screen-overlay-message {\n\tcolor: yellow;\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\ttext-align: center;\n\tpadding: 0 5px;\n\twhite-space: nowrap;\n\t--overlay-background-color: rgba(0, 0, 0, 0.3);\n\t--height: 25px;\n\theight: var(--height);\n\tline-height: var(--height);\n\tbackground-color: var(--overlay-background-color);\n\ttext-shadow: 0 0 8px rgba(3, 2, 2, 0.5);\n\tfont-size: calc(var(--height) * 0.8);\n\tfont-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n}\n\n/* triangles */\n#tracky-mouse-screen-overlay-message::before,\n#tracky-mouse-screen-overlay-message::after {\n\tcontent: \"\";\n\tposition: absolute;\n\tbottom: 0;\n\twidth: 0px;\n\theight: 0px;\n\tborder-style: solid;\n}\n\n#tracky-mouse-screen-overlay-message::before {\n\tborder-width: 0 0 var(--height) var(--height);\n\tborder-color: transparent transparent var(--overlay-background-color) transparent;\n\tleft: calc(var(--height) * -1);\n}\n\n#tracky-mouse-screen-overlay-message::after {\n\tborder-width: var(--height) 0 0 var(--height);\n\tborder-color: transparent transparent transparent var(--overlay-background-color);\n\tright: calc(var(--height) * -1);\n}\n\n@keyframes tracky-mouse-screen-overlay-message-fade-out {\n\t0% {\n\t\topacity: 1;\n\t}\n\n\t100% {\n\t\topacity: 0;\n\t}\n}\n\n.tracky-mouse-absolute-center {\n\tposition: absolute;\n\tleft: 50%;\n\ttop: 50%;\n\ttransform: translate(-50%, -50%);\n}\n\n/* prefer manual takeback indicator, rather than showing both at once */\nbody.tracky-mouse-manual-takeback .tracky-mouse-head-not-found-indicator,\nbody:not(.tracky-mouse-head-not-found) .tracky-mouse-head-not-found-indicator {\n\tdisplay: none;\n}\n\nbody:not(.tracky-mouse-manual-takeback) .tracky-mouse-manual-takeback-indicator {\n\tdisplay: none;\n}\n\n.tracky-mouse-manual-takeback .tracky-mouse-no-takeback-indicator {\n\tdisplay: none;\n}\n\n.tracky-mouse-screen-overlay-status-indicator img {\n\tfilter: drop-shadow(0 0 4px #000) drop-shadow(2px 2px 2px #000);\n\topacity: 0.5;\n}\n\n.tracky-mouse-ui a:link,\n.tracky-mouse-ui a:visited {\n\tcolor: rgb(135 0 191);\n}"
  },
  {
    "path": "lib/tracky-mouse/core/tracky-mouse.js",
    "content": "/* global jsfeat, Stats, clm */\nconst TrackyMouse = {\n\tdependenciesRoot: \"./tracky-mouse\",\n};\n\nTrackyMouse.loadDependencies = function ({ statsJs = false } = {}) {\n\tTrackyMouse.dependenciesRoot = TrackyMouse.dependenciesRoot.replace(/\\/+$/, \"\");\n\tconst loadScript = src => {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\t// This wouldn't wait for them to load\n\t\t\t// for (const script of document.scripts) {\n\t\t\t// \tif (script.src.includes(src)) {\n\t\t\t// \t\tresolve();\n\t\t\t// \t\treturn;\n\t\t\t// \t}\n\t\t\t// }\n\t\t\tconst script = document.createElement('script');\n\t\t\tscript.type = 'text/javascript';\n\t\t\tscript.onload = resolve;\n\t\t\tscript.onerror = reject;\n\t\t\tscript.src = src;\n\t\t\tdocument.head.append(script);\n\t\t});\n\t};\n\tconst scriptFiles = [\n\t\t`${TrackyMouse.dependenciesRoot}/lib/no-eval.js`, // generated with eval-is-evil.html, this instruments clmtrackr.js so I don't need unsafe-eval in the CSP\n\t\t`${TrackyMouse.dependenciesRoot}/lib/clmtrackr.js`,\n\t];\n\tif (statsJs) {\n\t\tscriptFiles.push(`${TrackyMouse.dependenciesRoot}/lib/stats.js`);\n\t}\n\t// TODO: figure out how to preload worker-context dependencies that use `importScripts`.\n\t// `<link rel=\"preload\">` can be injected at runtime,\n\t// which wouldn't make sense for the main thread's dependencies, since we're injecting all the scripts at once anyway,\n\t// but it could make sense for the worker's dependencies, since the worker is loaded lazily.\n\t// However... with `<link rel=\"preload\" as=\"script\">`, it seems to load things twice, making performance worse!\n\t// It seems like the worker isn't using the same cache as the main thread. I'm not sure.\n\t// Maybe this will be easier if I use module versions of the libraries, with `<link rel=\"modulepreload\">`?\n\t// Maybe it would use a shared cache in that case? That's a big if, though.\n\t// `${TrackyMouse.dependenciesRoot}/lib/tf.js`\n\t// `${TrackyMouse.dependenciesRoot}/lib/facemesh/facemesh.js`\n\treturn Promise.all(scriptFiles.map(loadScript));\n};\n\nconst is_selector_valid = ((dummy_element) =>\n\t(selector) => {\n\t\ttry { dummy_element.querySelector(selector); } catch { return false; }\n\t\treturn true;\n\t})(document.createDocumentFragment());\n\n\nconst dwell_clickers = [];\n\nconst init_dwell_clicking = (config) => {\n\t/*\n\t\tArguments:\n\t\t- `config.targets` (required): a CSS selector for the elements to click. Anything else will be ignored.\n\t\t- `config.shouldDrag(el)` (optional): a function that returns true if the element should be dragged rather than simply clicked.\n\t\t- `config.noCenter(el)` (optional): a function that returns true if the element should be clicked anywhere on the element, rather than always at the center.\n\t\t- `config.retarget` (optional): an array of `{ from, to, withinMargin }` objects, which define rules for dynamically changing what is hovered/clicked when the mouse is over a different element.\n\t\t\t- `from` (required): the element to retarget from. Can be a CSS selector, an element, or a function taking the element under the mouse and returning whether it should be retargeted.\n\t\t\t- `to` (required): the element to retarget to. Can be a CSS selector for an element which is an ancestor or descendant of the `from` element, or an element, or a function taking the element under the mouse and returning an element to retarget to, or null to ignore the element.\n\t\t\t- `withinMargin` (optional): a number of pixels within which to consider the mouse over the `to` element. Default to infinity.\n\t\t- `config.isEquivalentTarget(el1, el2)` (optional): a function that returns true if two elements should be considered part of the same control, i.e. if clicking either should do the same thing. Elements that are equal are always considered equivalent even if you return false. This option is used for preventing the system from detecting occluding elements as separate controls, and rejecting the click. (When an occlusion is detected, it flashes a red box.)\n\t\t- `config.dwellClickEvenIfPaused(el)` (optional): a function that returns true if the element should be clicked even while dwell clicking is otherwise paused. Use this for a dwell clicking toggle button, so it's possible to resume dwell clicking. With dwell clicking it's important to let users take a break, since otherwise you have to constantly move the cursor in order to not click on things!\n\t\t- `config.click({x, y, target})` (required): a function to trigger a click on the given target element.\n\t\t- `config.beforeDispatch()` (optional): a function to call before a pointer event is dispatched. For detecting un-trusted user gestures, outside of an event handler.\n\t\t- `config.afterDispatch()` (optional): a function to call after a pointer event is dispatched. For detecting un-trusted user gestures, outside of an event handler.\n\t*/\n\tif (typeof config !== \"object\") {\n\t\tthrow new Error(\"configuration object required for initDwellClicking\");\n\t}\n\tif (config.targets === undefined) {\n\t\tthrow new Error(\"config.targets is required (must be a CSS selector)\");\n\t}\n\tif (typeof config.targets !== \"string\") {\n\t\tthrow new Error(\"config.targets must be a string (a CSS selector)\");\n\t}\n\tif (!is_selector_valid(config.targets)) {\n\t\tthrow new Error(\"config.targets is not a valid CSS selector\");\n\t}\n\tif (config.click === undefined) {\n\t\tthrow new Error(\"config.click is required\");\n\t}\n\tif (typeof config.click !== \"function\") {\n\t\tthrow new Error(\"config.click must be a function\");\n\t}\n\tif (config.shouldDrag !== undefined && typeof config.shouldDrag !== \"function\") {\n\t\tthrow new Error(\"config.shouldDrag must be a function\");\n\t}\n\tif (config.noCenter !== undefined && typeof config.noCenter !== \"function\") {\n\t\tthrow new Error(\"config.noCenter must be a function\");\n\t}\n\tif (config.isEquivalentTarget !== undefined && typeof config.isEquivalentTarget !== \"function\") {\n\t\tthrow new Error(\"config.isEquivalentTarget must be a function\");\n\t}\n\tif (config.dwellClickEvenIfPaused !== undefined && typeof config.dwellClickEvenIfPaused !== \"function\") {\n\t\tthrow new Error(\"config.dwellClickEvenIfPaused must be a function\");\n\t}\n\tif (config.beforeDispatch !== undefined && typeof config.beforeDispatch !== \"function\") {\n\t\tthrow new Error(\"config.beforeDispatch must be a function\");\n\t}\n\tif (config.afterDispatch !== undefined && typeof config.afterDispatch !== \"function\") {\n\t\tthrow new Error(\"config.afterDispatch must be a function\");\n\t}\n\tif (config.beforePointerDownDispatch !== undefined && typeof config.beforePointerDownDispatch !== \"function\") {\n\t\tthrow new Error(\"config.beforePointerDownDispatch must be a function\");\n\t}\n\tif (config.isHeld !== undefined && typeof config.isHeld !== \"function\") {\n\t\tthrow new Error(\"config.isHeld must be a function\");\n\t}\n\tif (config.retarget !== undefined) {\n\t\tif (!Array.isArray(config.retarget)) {\n\t\t\tthrow new Error(\"config.retarget must be an array of objects\");\n\t\t}\n\t\tfor (let i = 0; i < config.retarget.length; i++) {\n\t\t\tconst rule = config.retarget[i];\n\t\t\tif (typeof rule !== \"object\") {\n\t\t\t\tthrow new Error(\"config.retarget must be an array of objects\");\n\t\t\t}\n\t\t\tif (rule.from === undefined) {\n\t\t\t\tthrow new Error(`config.retarget[${i}].from is required`);\n\t\t\t}\n\t\t\tif (rule.to === undefined) {\n\t\t\t\tthrow new Error(`config.retarget[${i}].to is required (although can be null to ignore the element)`);\n\t\t\t}\n\t\t\tif (rule.withinMargin !== undefined && typeof rule.withinMargin !== \"number\") {\n\t\t\t\tthrow new Error(`config.retarget[${i}].withinMargin must be a number`);\n\t\t\t}\n\t\t\tif (typeof rule.from !== \"string\" && typeof rule.from !== \"function\" && !(rule.from instanceof Element)) {\n\t\t\t\tthrow new Error(`config.retarget[${i}].from must be a CSS selector string, an Element, or a function`);\n\t\t\t}\n\t\t\tif (typeof rule.to !== \"string\" && typeof rule.to !== \"function\" && !(rule.to instanceof Element) && rule.to !== null) {\n\t\t\t\tthrow new Error(`config.retarget[${i}].to must be a CSS selector string, an Element, a function, or null`);\n\t\t\t}\n\t\t\tif (typeof rule.from === \"string\" && !is_selector_valid(rule.from)) {\n\t\t\t\tthrow new Error(`config.retarget[${i}].from is not a valid CSS selector`);\n\t\t\t}\n\t\t\tif (typeof rule.to === \"string\" && !is_selector_valid(rule.to)) {\n\t\t\t\tthrow new Error(`config.retarget[${i}].to is not a valid CSS selector`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// tracky_mouse_container.querySelector(\".tracky-mouse-canvas\").classList.add(\"inset-deep\");\n\n\tconst circle_radius_max = 50; // dwell indicator size in pixels\n\tconst hover_timespan = 500; // how long between the dwell indicator appearing and triggering a click\n\tconst averaging_window_timespan = 500;\n\tconst inactive_at_startup_timespan = 1500; // (should be at least averaging_window_timespan, but more importantly enough to make it not awkward when enabling dwell clicking)\n\tconst inactive_after_release_timespan = 1000; // after click or drag release (from dwell or otherwise)\n\tconst inactive_after_hovered_timespan = 1000; // after dwell click indicator appears; does not control the time to finish that dwell click, only to click on something else after this is canceled (but it doesn't control that directly)\n\tconst inactive_after_invalid_timespan = 1000; // after a dwell click is canceled due to an element popping up in front, or existing in front at the center of the other element\n\tconst inactive_after_focused_timespan = 1000; // after page becomes focused after being unfocused\n\tlet recent_points = [];\n\tlet inactive_until_time = performance.now();\n\tlet paused = false;\n\tlet hover_candidate;\n\tlet dwell_dragging = null;\n\n\tconst deactivate_for_at_least = (timespan) => {\n\t\tinactive_until_time = Math.max(inactive_until_time, performance.now() + timespan);\n\t};\n\tdeactivate_for_at_least(inactive_at_startup_timespan);\n\n\tconst halo = document.createElement(\"div\");\n\thalo.className = \"tracky-mouse-hover-halo\";\n\thalo.style.display = \"none\";\n\tdocument.body.appendChild(halo);\n\tconst dwell_indicator = document.createElement(\"div\");\n\tdwell_indicator.className = \"tracky-mouse-dwell-indicator\";\n\tdwell_indicator.style.width = `${circle_radius_max}px`;\n\tdwell_indicator.style.height = `${circle_radius_max}px`;\n\tdwell_indicator.style.display = \"none\";\n\tdocument.body.appendChild(dwell_indicator);\n\n\tconst on_pointer_move = (e) => {\n\t\trecent_points.push({ x: e.clientX, y: e.clientY, time: performance.now() });\n\t};\n\tconst on_pointer_up_or_cancel = (_e) => {\n\t\tdeactivate_for_at_least(inactive_after_release_timespan);\n\t\tdwell_dragging = null;\n\t};\n\n\tlet page_focused = document.visibilityState === \"visible\"; // guess/assumption\n\tlet mouse_inside_page = true; // assumption\n\tconst on_focus = () => {\n\t\tpage_focused = true;\n\t\tdeactivate_for_at_least(inactive_after_focused_timespan);\n\t};\n\tconst on_blur = () => {\n\t\tpage_focused = false;\n\t};\n\tconst on_mouse_leave_page = () => {\n\t\tmouse_inside_page = false;\n\t};\n\tconst on_mouse_enter_page = () => {\n\t\tmouse_inside_page = true;\n\t};\n\n\twindow.addEventListener(\"pointermove\", on_pointer_move);\n\twindow.addEventListener(\"pointerup\", on_pointer_up_or_cancel);\n\twindow.addEventListener(\"pointercancel\", on_pointer_up_or_cancel);\n\twindow.addEventListener(\"focus\", on_focus);\n\twindow.addEventListener(\"blur\", on_blur);\n\tdocument.addEventListener(\"mouseleave\", on_mouse_leave_page);\n\tdocument.addEventListener(\"mouseenter\", on_mouse_enter_page);\n\n\tconst get_hover_candidate = (clientX, clientY) => {\n\n\t\tif (!page_focused || !mouse_inside_page) return null;\n\n\t\tlet target = document.elementFromPoint(clientX, clientY);\n\t\tif (!target) {\n\t\t\treturn null;\n\t\t}\n\n\t\tlet hover_candidate = {\n\t\t\tx: clientX,\n\t\t\ty: clientY,\n\t\t\ttime: performance.now(),\n\t\t};\n\n\t\tlet retargeted = false;\n\t\tfor (const { from, to, withinMargin = Infinity } of (config.retarget ?? [])) {\n\t\t\tif (\n\t\t\t\tfrom instanceof Element ? from === target :\n\t\t\t\t\ttypeof from === \"function\" ? from(target) :\n\t\t\t\t\t\ttarget.matches(from)\n\t\t\t) {\n\t\t\t\tconst to_element =\n\t\t\t\t\t(to instanceof Element || to === null) ? to :\n\t\t\t\t\t\ttypeof to === \"function\" ? to(target) :\n\t\t\t\t\t\t\t(target.closest(to) || target.querySelector(to));\n\t\t\t\tif (to_element === null) {\n\t\t\t\t\treturn null;\n\t\t\t\t} else if (to_element) {\n\t\t\t\t\tconst to_rect = to_element.getBoundingClientRect();\n\t\t\t\t\tif (\n\t\t\t\t\t\thover_candidate.x > to_rect.left - withinMargin &&\n\t\t\t\t\t\thover_candidate.y > to_rect.top - withinMargin &&\n\t\t\t\t\t\thover_candidate.x < to_rect.right + withinMargin &&\n\t\t\t\t\t\thover_candidate.y < to_rect.bottom + withinMargin\n\t\t\t\t\t) {\n\t\t\t\t\t\ttarget = to_element;\n\t\t\t\t\t\thover_candidate.x = Math.min(\n\t\t\t\t\t\t\tto_rect.right - 1,\n\t\t\t\t\t\t\tMath.max(\n\t\t\t\t\t\t\t\tto_rect.left,\n\t\t\t\t\t\t\t\thover_candidate.x,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\thover_candidate.y = Math.min(\n\t\t\t\t\t\t\tto_rect.bottom - 1,\n\t\t\t\t\t\t\tMath.max(\n\t\t\t\t\t\t\t\tto_rect.top,\n\t\t\t\t\t\t\t\thover_candidate.y,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tretargeted = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!retargeted) {\n\t\t\ttarget = target.closest(config.targets);\n\n\t\t\tif (!target) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tif (!config.noCenter?.(target)) {\n\t\t\t// Nudge hover previews to the center of buttons and things\n\t\t\tconst rect = target.getBoundingClientRect();\n\t\t\thover_candidate.x = rect.left + rect.width / 2;\n\t\t\thover_candidate.y = rect.top + rect.height / 2;\n\t\t}\n\t\thover_candidate.target = target;\n\t\treturn hover_candidate;\n\t};\n\n\tconst get_event_options = ({ x, y }) => {\n\t\treturn {\n\t\t\tview: window, // needed for offsetX/Y calculation\n\t\t\tclientX: x,\n\t\t\tclientY: y,\n\t\t\tpointerId: 1234567890,\n\t\t\tpointerType: \"mouse\",\n\t\t\tisPrimary: true,\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t};\n\t};\n\n\tconst average_points = (points) => {\n\t\tconst average = { x: 0, y: 0 };\n\t\tfor (const pointer of points) {\n\t\t\taverage.x += pointer.x;\n\t\t\taverage.y += pointer.y;\n\t\t}\n\t\taverage.x /= points.length;\n\t\taverage.y /= points.length;\n\t\treturn average;\n\t};\n\n\tconst update = () => {\n\t\tconst time = performance.now();\n\t\trecent_points = recent_points.filter((point_record) => time < point_record.time + averaging_window_timespan);\n\t\tif (recent_points.length) {\n\t\t\tconst latest_point = recent_points[recent_points.length - 1];\n\t\t\trecent_points.push({ x: latest_point.x, y: latest_point.y, time });\n\t\t\tconst average_point = average_points(recent_points);\n\t\t\t// debug\n\t\t\t// const canvas_point = to_canvas_coords({clientX: average_point.x, clientY: average_point.y});\n\t\t\t// ctx.fillStyle = \"red\";\n\t\t\t// ctx.fillRect(canvas_point.x, canvas_point.y, 10, 10);\n\t\t\tconst recent_movement_amount = Math.hypot(latest_point.x - average_point.x, latest_point.y - average_point.y);\n\n\t\t\t// Invalidate in case an element pops up in front of the element you're hovering over, e.g. a submenu\n\t\t\t// (that use case doesn't actually work in jspaint because the menu pops up before the hover_candidate exists)\n\t\t\t// (TODO: disable hovering to open submenus in facial mouse mode in jspaint)\n\t\t\t// or an element occludes the center of an element you're hovering over, in which case it\n\t\t\t// could be confusing if it showed a dwell click indicator over a different element than it would click\n\t\t\t// (but TODO: just move the indicator off center in that case)\n\t\t\tif (hover_candidate && !dwell_dragging) {\n\t\t\t\tconst apparent_hover_candidate = get_hover_candidate(hover_candidate.x, hover_candidate.y);\n\t\t\t\tconst show_occluder_indicator = (occluder) => {\n\t\t\t\t\tconst occluder_indicator = document.createElement(\"div\");\n\t\t\t\t\tconst occluder_rect = occluder.getBoundingClientRect();\n\t\t\t\t\tconst outline_width = 4;\n\t\t\t\t\toccluder_indicator.style.pointerEvents = \"none\";\n\t\t\t\t\toccluder_indicator.style.zIndex = 1000001;\n\t\t\t\t\toccluder_indicator.style.display = \"block\";\n\t\t\t\t\toccluder_indicator.style.position = \"fixed\";\n\t\t\t\t\toccluder_indicator.style.left = `${occluder_rect.left + outline_width}px`;\n\t\t\t\t\toccluder_indicator.style.top = `${occluder_rect.top + outline_width}px`;\n\t\t\t\t\toccluder_indicator.style.width = `${occluder_rect.width - outline_width * 2}px`;\n\t\t\t\t\toccluder_indicator.style.height = `${occluder_rect.height - outline_width * 2}px`;\n\t\t\t\t\toccluder_indicator.style.outline = `${outline_width}px dashed red`;\n\t\t\t\t\toccluder_indicator.style.boxShadow = `0 0 ${outline_width}px ${outline_width}px maroon`;\n\t\t\t\t\tdocument.body.appendChild(occluder_indicator);\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\toccluder_indicator.remove();\n\t\t\t\t\t}, inactive_after_invalid_timespan * 0.5);\n\t\t\t\t};\n\t\t\t\tif (apparent_hover_candidate) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tapparent_hover_candidate.target !== hover_candidate.target &&\n\t\t\t\t\t\t// !retargeted &&\n\t\t\t\t\t\t!config.isEquivalentTarget?.(\n\t\t\t\t\t\t\tapparent_hover_candidate.target, hover_candidate.target\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\thover_candidate = null;\n\t\t\t\t\t\tdeactivate_for_at_least(inactive_after_invalid_timespan);\n\t\t\t\t\t\tshow_occluder_indicator(apparent_hover_candidate.target);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tlet occluder = document.elementFromPoint(hover_candidate.x, hover_candidate.y);\n\t\t\t\t\thover_candidate = null;\n\t\t\t\t\tdeactivate_for_at_least(inactive_after_invalid_timespan);\n\t\t\t\t\tshow_occluder_indicator(occluder || document.body);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet circle_position = latest_point;\n\t\t\tlet circle_opacity = 0;\n\t\t\tlet circle_radius = 0;\n\t\t\tif (hover_candidate) {\n\t\t\t\tcircle_position = hover_candidate;\n\t\t\t\tcircle_opacity = 0.4;\n\t\t\t\tcircle_radius =\n\t\t\t\t\t(hover_candidate.time - time + hover_timespan) / hover_timespan\n\t\t\t\t\t* circle_radius_max;\n\t\t\t\tif (time > hover_candidate.time + hover_timespan) {\n\t\t\t\t\tif (config.isHeld?.() || dwell_dragging) {\n\t\t\t\t\t\tconfig.beforeDispatch?.();\n\t\t\t\t\t\thover_candidate.target.dispatchEvent(new PointerEvent(\"pointerup\",\n\t\t\t\t\t\t\tObject.assign(get_event_options(hover_candidate), {\n\t\t\t\t\t\t\t\tbutton: 0,\n\t\t\t\t\t\t\t\tbuttons: 0,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t));\n\t\t\t\t\t\tconfig.afterDispatch?.();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconfig.beforePointerDownDispatch?.();\n\t\t\t\t\t\tconfig.beforeDispatch?.();\n\t\t\t\t\t\thover_candidate.target.dispatchEvent(new PointerEvent(\"pointerdown\",\n\t\t\t\t\t\t\tObject.assign(get_event_options(hover_candidate), {\n\t\t\t\t\t\t\t\tbutton: 0,\n\t\t\t\t\t\t\t\tbuttons: 1,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t));\n\t\t\t\t\t\tconfig.afterDispatch?.();\n\t\t\t\t\t\tif (config.shouldDrag?.(hover_candidate.target)) {\n\t\t\t\t\t\t\tdwell_dragging = hover_candidate.target;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconfig.beforeDispatch?.();\n\t\t\t\t\t\t\thover_candidate.target.dispatchEvent(new PointerEvent(\"pointerup\",\n\t\t\t\t\t\t\t\tObject.assign(get_event_options(hover_candidate), {\n\t\t\t\t\t\t\t\t\tbutton: 0,\n\t\t\t\t\t\t\t\t\tbuttons: 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\tconfig.click(hover_candidate);\n\t\t\t\t\t\t\tconfig.afterDispatch?.();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\thover_candidate = null;\n\t\t\t\t\tdeactivate_for_at_least(inactive_after_hovered_timespan);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (dwell_dragging) {\n\t\t\t\tdwell_indicator.classList.add(\"tracky-mouse-for-release\");\n\t\t\t} else {\n\t\t\t\tdwell_indicator.classList.remove(\"tracky-mouse-for-release\");\n\t\t\t}\n\t\t\tdwell_indicator.style.display = \"\";\n\t\t\tdwell_indicator.style.opacity = circle_opacity;\n\t\t\tdwell_indicator.style.transform = `scale(${circle_radius / circle_radius_max})`;\n\t\t\tdwell_indicator.style.left = `${circle_position.x - circle_radius_max / 2}px`;\n\t\t\tdwell_indicator.style.top = `${circle_position.y - circle_radius_max / 2}px`;\n\n\t\t\tlet halo_target =\n\t\t\t\tdwell_dragging ||\n\t\t\t\t(hover_candidate || get_hover_candidate(latest_point.x, latest_point.y) || {}).target;\n\n\t\t\tif (halo_target && (!paused || config.dwellClickEvenIfPaused?.(halo_target))) {\n\t\t\t\tlet rect = halo_target.getBoundingClientRect();\n\t\t\t\tconst computed_style = getComputedStyle(halo_target);\n\t\t\t\tlet ancestor = halo_target;\n\t\t\t\tlet border_radius_scale = 1; // for border radius mimicry, given parents with transform: scale()\n\t\t\t\twhile (ancestor instanceof HTMLElement) {\n\t\t\t\t\tconst ancestor_computed_style = getComputedStyle(ancestor);\n\t\t\t\t\tif (ancestor_computed_style.transform) {\n\t\t\t\t\t\t// Collect scale transforms\n\t\t\t\t\t\tconst match = ancestor_computed_style.transform.match(/(?:scale|matrix)\\((\\d+(?:\\.\\d+)?)/);\n\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\tborder_radius_scale *= Number(match[1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (ancestor_computed_style.overflow !== \"visible\") {\n\t\t\t\t\t\t// Clamp to visible region if in scrollable area\n\t\t\t\t\t\t// This lets you see the hover halo when scrolled to the middle of a large canvas\n\t\t\t\t\t\tconst scroll_area_rect = ancestor.getBoundingClientRect();\n\t\t\t\t\t\trect = {\n\t\t\t\t\t\t\tleft: Math.max(rect.left, scroll_area_rect.left),\n\t\t\t\t\t\t\ttop: Math.max(rect.top, scroll_area_rect.top),\n\t\t\t\t\t\t\tright: Math.min(rect.right, scroll_area_rect.right),\n\t\t\t\t\t\t\tbottom: Math.min(rect.bottom, scroll_area_rect.bottom),\n\t\t\t\t\t\t};\n\t\t\t\t\t\trect.width = rect.right - rect.left;\n\t\t\t\t\t\trect.height = rect.bottom - rect.top;\n\t\t\t\t\t}\n\t\t\t\t\tancestor = ancestor.parentNode;\n\t\t\t\t}\n\t\t\t\thalo.style.display = \"block\";\n\t\t\t\thalo.style.position = \"fixed\";\n\t\t\t\thalo.style.left = `${rect.left}px`;\n\t\t\t\thalo.style.top = `${rect.top}px`;\n\t\t\t\thalo.style.width = `${rect.width}px`;\n\t\t\t\thalo.style.height = `${rect.height}px`;\n\t\t\t\t// shorthand properties might not work in all browsers (not tested)\n\t\t\t\t// this is so overkill...\n\t\t\t\t// Maybe instead of collecting scale transforms and applying them to the border radii specifically,\n\t\t\t\t// just collect transforms in general and apply them to the halo element?\n\t\t\t\t// But of course getBoundingClientRect() includes transforms...\n\t\t\t\tfor (const prop of [\n\t\t\t\t\t\"borderTopRightRadius\",\n\t\t\t\t\t\"borderTopLeftRadius\",\n\t\t\t\t\t\"borderBottomRightRadius\",\n\t\t\t\t\t\"borderBottomLeftRadius\",\n\t\t\t\t]) {\n\t\t\t\t\t// Unfortunately, getComputedStyle can return percentages, probably other units, probably also \"auto\"\n\t\t\t\t\tif (computed_style[prop].endsWith(\"px\")) {\n\t\t\t\t\t\thalo.style[prop] = `${parseFloat(computed_style[prop]) * border_radius_scale}px`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\thalo.style[prop] = computed_style[prop];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\thalo.style.display = \"none\";\n\t\t\t}\n\n\t\t\tif (time < inactive_until_time) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (recent_movement_amount < 5) {\n\t\t\t\tif (!hover_candidate) {\n\t\t\t\t\thover_candidate = {\n\t\t\t\t\t\tx: average_point.x,\n\t\t\t\t\t\ty: average_point.y,\n\t\t\t\t\t\ttime: performance.now(),\n\t\t\t\t\t\ttarget: dwell_dragging || null,\n\t\t\t\t\t};\n\t\t\t\t\tif (!dwell_dragging) {\n\t\t\t\t\t\thover_candidate = get_hover_candidate(hover_candidate.x, hover_candidate.y);\n\t\t\t\t\t}\n\t\t\t\t\tif (hover_candidate && (paused && !config.dwellClickEvenIfPaused?.(hover_candidate.target))) {\n\t\t\t\t\t\thover_candidate = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (recent_movement_amount > 100) {\n\t\t\t\tif (dwell_dragging) {\n\t\t\t\t\tconfig.beforeDispatch?.();\n\t\t\t\t\twindow.dispatchEvent(new PointerEvent(\"pointerup\",\n\t\t\t\t\t\tObject.assign(get_event_options(average_point), {\n\t\t\t\t\t\t\tbutton: 0,\n\t\t\t\t\t\t\tbuttons: 0,\n\t\t\t\t\t\t})\n\t\t\t\t\t));\n\t\t\t\t\tconfig.afterDispatch?.();\n\t\t\t\t\tconfig.afterReleaseDrag?.();\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (recent_movement_amount > 60) {\n\t\t\t\thover_candidate = null;\n\t\t\t}\n\t\t}\n\t};\n\tlet raf_id;\n\tconst animate = () => {\n\t\traf_id = requestAnimationFrame(animate);\n\t\tupdate();\n\t};\n\traf_id = requestAnimationFrame(animate);\n\n\tconst dispose = () => {\n\t\tcancelAnimationFrame(raf_id);\n\t\thalo.remove();\n\t\tdwell_indicator.remove();\n\t\twindow.removeEventListener(\"pointermove\", on_pointer_move);\n\t\twindow.removeEventListener(\"pointerup\", on_pointer_up_or_cancel);\n\t\twindow.removeEventListener(\"pointercancel\", on_pointer_up_or_cancel);\n\t\twindow.removeEventListener(\"focus\", on_focus);\n\t\twindow.removeEventListener(\"blur\", on_blur);\n\t\tdocument.removeEventListener(\"mouseleave\", on_mouse_leave_page);\n\t\tdocument.removeEventListener(\"mouseenter\", on_mouse_enter_page);\n\t};\n\n\tconst dwellClicker = {\n\t\tget paused() {\n\t\t\treturn paused;\n\t\t},\n\t\tset paused(value) {\n\t\t\tpaused = value;\n\t\t},\n\t\tdispose,\n\t};\n\tdwell_clickers.push(dwellClicker);\n\treturn dwellClicker;\n};\n\nTrackyMouse.initDwellClicking = function (config) {\n\treturn init_dwell_clicking(config);\n};\nTrackyMouse.cleanupDwellClicking = function () {\n\tfor (const dwell_clicker of dwell_clickers) {\n\t\tdwell_clicker.dispose();\n\t}\n};\n\nTrackyMouse.init = function (div, { statsJs = false } = {}) {\n\n\tvar uiContainer = div || document.createElement(\"div\");\n\tuiContainer.classList.add(\"tracky-mouse-ui\");\n\tuiContainer.innerHTML = `\n\t\t<div class=\"tracky-mouse-controls\">\n\t\t\t<button class=\"tracky-mouse-start-stop-button\" aria-pressed=\"false\" aria-keyshortcuts=\"F9\">Start</button>\n\t\t\t<br>\n\t\t\t<br>\n\t\t\t<label class=\"tracky-mouse-control-row\">\n\t\t\t\t<span class=\"tracky-mouse-label-text\">Horizontal Sensitivity</span>\n\t\t\t\t<span class=\"tracky-mouse-labeled-slider\">\n\t\t\t\t\t<input type=\"range\" min=\"0\" max=\"100\" value=\"25\" class=\"tracky-mouse-sensitivity-x\">\n\t\t\t\t\t<span class=\"tracky-mouse-min-label\">Slow</span>\n\t\t\t\t\t<span class=\"tracky-mouse-max-label\">Fast</span>\n\t\t\t\t</span>\n\t\t\t</label>\n\t\t\t<label class=\"tracky-mouse-control-row\">\n\t\t\t\t<span class=\"tracky-mouse-label-text\">Vertical Sensitivity</span>\n\t\t\t\t<span class=\"tracky-mouse-labeled-slider\">\n\t\t\t\t\t<input type=\"range\" min=\"0\" max=\"100\" value=\"50\" class=\"tracky-mouse-sensitivity-y\">\n\t\t\t\t\t<span class=\"tracky-mouse-min-label\">Slow</span>\n\t\t\t\t\t<span class=\"tracky-mouse-max-label\">Fast</span>\n\t\t\t\t</span>\n\t\t\t</label>\n\t\t\t<!-- <label class=\"tracky-mouse-control-row\">\n\t\t\t\t<span class=\"tracky-mouse-label-text\">Smoothing</span>\n\t\t\t\t<span class=\"tracky-mouse-labeled-slider\">\n\t\t\t\t\t<input type=\"range\" min=\"0\" max=\"100\" value=\"50\" class=\"tracky-mouse-smoothing\">\n\t\t\t\t\t<span class=\"tracky-mouse-min-label\"></span>\n\t\t\t\t\t<span class=\"tracky-mouse-max-label\"></span>\n\t\t\t\t</span>\n\t\t\t</label> -->\n\t\t\t<label class=\"tracky-mouse-control-row\">\n\t\t\t\t<span class=\"tracky-mouse-label-text\">Acceleration</span>\n\t\t\t\t<span class=\"tracky-mouse-labeled-slider\">\n\t\t\t\t\t<input type=\"range\" min=\"0\" max=\"100\" value=\"50\" class=\"tracky-mouse-acceleration\">\n\t\t\t\t\t<!-- TODO: \"Linear\" could be described as \"Fast\", and the other \"Fast\" labels are on the other side. Should it be swapped? What does other software with acceleration control look like? In Windows it's just a checkbox apparently, but it could go as far as a custom curve editor. -->\n\t\t\t\t\t<span class=\"tracky-mouse-min-label\">Linear</span>\n\t\t\t\t\t<span class=\"tracky-mouse-max-label\">Smooth</span>\n\t\t\t\t</span>\n\t\t\t</label>\n\t\t\t<!-- <label class=\"tracky-mouse-control-row\">\n\t\t\t\t<span class=\"tracky-mouse-label-text\">Easy Stop (min distance to move)</span>\n\t\t\t\t<span class=\"tracky-mouse-labeled-slider\">\n\t\t\t\t\t<input type=\"range\" min=\"0\" max=\"100\" value=\"50\" class=\"tracky-mouse-min-distance\">\n\t\t\t\t\t<span class=\"tracky-mouse-min-label\">Jittery</span>\n\t\t\t\t\t<span class=\"tracky-mouse-max-label\">Steady</span>\n\t\t\t\t</span>\n\t\t\t</label> -->\n\t\t\t<br>\n\t\t\t<!-- special interest: jspaint wants label not to use parent-child relationship so that os-gui's 98.css checkbox styles can work -->\n\t\t\t<!-- though this option might not be wanted in jspaint; might be good to hide it in the embedded case, or make it optional -->\n\t\t\t<!-- also TODO: add description of what this is for: on Windows, currently, when buttons are swapped at the system level, it affects serenade-driver's click() -->\n\t\t\t<!-- also this may be seen as a weirdly named/designed option for right-clicking -->\n\t\t\t<!-- btw: label is selected based on 'for' attribute -->\n\t\t\t<div class=\"tracky-mouse-control-row\">\n\t\t\t\t<input type=\"checkbox\" id=\"tracky-mouse-swap-mouse-buttons\"/>\n\t\t\t\t<label for=\"tracky-mouse-swap-mouse-buttons\"><span class=\"tracky-mouse-label-text\">Swap mouse buttons</span></label>\n\t\t\t</div>\n\t\t\t<br>\n\t\t\t<!-- special interest: jspaint wants label not to use parent-child relationship so that os-gui's 98.css checkbox styles can work -->\n\t\t\t<!-- opposite, \"Start paused\", might be clearer, especially if I add a \"pause\" button -->\n\t\t\t<div class=\"tracky-mouse-control-row\">\n\t\t\t\t<input type=\"checkbox\" id=\"tracky-mouse-start-enabled\"/>\n\t\t\t\t<label for=\"tracky-mouse-start-enabled\"><span class=\"tracky-mouse-label-text\">Start enabled</span></label>\n\t\t\t</div>\n\t\t\t<br>\n\t\t\t<!-- special interest: jspaint wants label not to use parent-child relationship so that os-gui's 98.css checkbox styles can work -->\n\t\t\t<div class=\"tracky-mouse-control-row\">\n\t\t\t\t<input type=\"checkbox\" id=\"tracky-mouse-run-at-login\"/>\n\t\t\t\t<label for=\"tracky-mouse-run-at-login\"><span class=\"tracky-mouse-label-text\">Run at login</span></label>\n\t\t\t</div>\n\t\t\t<br>\n\t\t\t<!-- special interest: jspaint wants label not to use parent-child relationship so that os-gui's 98.css checkbox styles can work -->\n\t\t\t<!-- TODO: try moving this to the corner of the camera view, so it's clearer it applies only to the camera view -->\n\t\t\t<div class=\"tracky-mouse-control-row\">\n\t\t\t\t<input type=\"checkbox\" checked id=\"tracky-mouse-mirror\"/>\n\t\t\t\t<label for=\"tracky-mouse-mirror\"><span class=\"tracky-mouse-label-text\">Mirror</span></label>\n\t\t\t</div>\n\t\t\t<br>\n\t\t</div>\n\t\t<div class=\"tracky-mouse-canvas-container-container\">\n\t\t\t<div class=\"tracky-mouse-canvas-container\">\n\t\t\t\t<div class=\"tracky-mouse-canvas-overlay\">\n\t\t\t\t\t<button class=\"tracky-mouse-use-camera-button\">Allow Camera Access</button>\n\t\t\t\t\t<!--<button class=\"tracky-mouse-use-camera-button\">Use my camera</button>-->\n\t\t\t\t\t<button class=\"tracky-mouse-use-demo-footage-button\" hidden>Use demo footage</button>\n\t\t\t\t\t<div class=\"tracky-mouse-error-message\" role=\"alert\" hidden></div>\n\t\t\t\t</div>\n\t\t\t\t<canvas class=\"tracky-mouse-canvas\"></canvas>\n\t\t\t</div>\n\t\t</div>\n\t\t<p class=\"tracky-mouse-desktop-app-download-message\">\n\t\t\tYou can control your entire computer with the <a href=\"https://trackymouse.js.org/\">TrackyMouse</a> desktop app.\n\t\t</p>\n\t`;\n\tif (!div) {\n\t\tdocument.body.appendChild(uiContainer);\n\t}\n\tvar startStopButton = uiContainer.querySelector(\".tracky-mouse-start-stop-button\");\n\tvar mirrorCheckbox = uiContainer.querySelector(\"#tracky-mouse-mirror\");\n\tvar swapMouseButtonsCheckbox = uiContainer.querySelector(\"#tracky-mouse-swap-mouse-buttons\");\n\tvar startEnabledCheckbox = uiContainer.querySelector(\"#tracky-mouse-start-enabled\");\n\tvar runAtLoginCheckbox = uiContainer.querySelector(\"#tracky-mouse-run-at-login\");\n\tvar swapMouseButtonsLabel = uiContainer.querySelector(\"label[for='tracky-mouse-swap-mouse-buttons']\");\n\tvar sensitivityXSlider = uiContainer.querySelector(\".tracky-mouse-sensitivity-x\");\n\tvar sensitivityYSlider = uiContainer.querySelector(\".tracky-mouse-sensitivity-y\");\n\tvar accelerationSlider = uiContainer.querySelector(\".tracky-mouse-acceleration\");\n\tvar useCameraButton = uiContainer.querySelector(\".tracky-mouse-use-camera-button\");\n\tvar useDemoFootageButton = uiContainer.querySelector(\".tracky-mouse-use-demo-footage-button\");\n\tvar errorMessage = uiContainer.querySelector(\".tracky-mouse-error-message\");\n\tvar canvasContainer = uiContainer.querySelector('.tracky-mouse-canvas-container');\n\tvar desktopAppDownloadMessage = uiContainer.querySelector('.tracky-mouse-desktop-app-download-message');\n\n\tif (window.electronAPI) {\n\t\t// Hide the desktop app download message if we're in the desktop app\n\t\t// Might be good to also hide it, or change it, when on a mobile device\n\t\tdesktopAppDownloadMessage.hidden = true;\n\n\t\t// Disable the \"run at login\" option if the app isn't packaged,\n\t\t// as it's not set up to work in development mode.\n\t\twindow.electronAPI.getIsPackaged().then((isPackaged) => {\n\t\t\trunAtLoginCheckbox.disabled = !isPackaged;\n\t\t});\n\t} else {\n\t\t// Hide the mouse button swapping option if we're not in the desktop app,\n\t\t// since the system-level mouse button setting doesn't apply,\n\t\t// and the feature isn't implemented for the web version.\n\t\t// It could be implemented for the web version, but if you're designing an app for facial mouse users,\n\t\t// you might want to avoid right-clicking altogether.\n\t\tswapMouseButtonsCheckbox.parentElement.hidden = true;\n\n\t\t// Hide the \"run at login\" option if we're not in the desktop app.\n\t\trunAtLoginCheckbox.parentElement.hidden = true;\n\t}\n\n\tvar canvas = uiContainer.querySelector(\".tracky-mouse-canvas\");\n\tvar ctx = canvas.getContext('2d');\n\n\tvar pointerEl = document.createElement('div');\n\tpointerEl.className = \"tracky-mouse-pointer\";\n\tpointerEl.style.display = \"none\";\n\tdocument.body.appendChild(pointerEl);\n\n\tvar cameraVideo = document.createElement('video');\n\t// required to work in iOS 11 & up:\n\tcameraVideo.setAttribute('playsinline', '');\n\n\tif (statsJs) {\n\t\tvar stats = new Stats();\n\t\tstats.domElement.style.position = 'absolute';\n\t\tstats.domElement.style.top = '0px';\n\t\tstats.domElement.style.right = '0px';\n\t\tstats.domElement.style.left = '';\n\t\tdocument.body.appendChild(stats.domElement);\n\t}\n\n\tvar defaultWidth = 640;\n\tvar defaultHeight = 480;\n\tvar maxPoints = 1000;\n\tvar mouseX = 0;\n\tvar mouseY = 0;\n\tvar prevMovementX = 0;\n\tvar prevMovementY = 0;\n\tvar enableTimeTravel = false;\n\t// var movementXSinceFacemeshUpdate = 0;\n\t// var movementYSinceFacemeshUpdate = 0;\n\tvar cameraFramesSinceFacemeshUpdate = [];\n\tvar sensitivityX;\n\tvar sensitivityY;\n\tvar acceleration;\n\tvar face;\n\tvar faceScore = 0;\n\tvar faceScoreThreshold = 0.5;\n\tvar faceConvergence = 0;\n\t// var faceConvergenceThreshold = 50;\n\tvar pointsBasedOnFaceScore = 0;\n\tvar paused = true;\n\tvar mouseNeedsInitPos = true;\n\tvar debugTimeTravel = false;\n\tvar debugAcceleration = false;\n\tvar showDebugText = false;\n\tvar mirror;\n\tvar startEnabled;\n\tvar runAtLogin;\n\tvar swapMouseButtons;\n\n\tvar useClmTracking = true;\n\tvar showClmTracking = useClmTracking;\n\tvar useFacemesh = true;\n\tvar facemeshOptions = {\n\t\tmaxContinuousChecks: 5,\n\t\tdetectionConfidence: 0.9,\n\t\tmaxFaces: 1,\n\t\tiouThreshold: 0.3,\n\t\tscoreThreshold: 0.75\n\t};\n\tvar fallbackTimeoutID;\n\n\tvar facemeshLoaded = false;\n\tvar facemeshFirstEstimation = true;\n\tvar facemeshEstimating = false;\n\tvar facemeshRejectNext = 0;\n\tvar facemeshPrediction;\n\tvar facemeshEstimateFaces;\n\tvar faceInViewConfidenceThreshold = 0.7;\n\tvar pointsBasedOnFaceInViewConfidence = 0;\n\n\t// scale of size of frames that are passed to worker and then computed several at once when backtracking for latency compensation\n\t// reducing this makes it much more likely to drop points and thus not work\n\t// THIS IS DISABLED and using a performance optimization of currentCameraImageData instead of getCameraImageData;\n\t// (the currentCameraImageData is also scaled differently, to the fixed canvas size instead of using the native camera image size)\n\t// const frameScaleForWorker = 1;\n\n\tvar mainOops;\n\tvar workerSyncedOops;\n\n\t// const frameCanvas = document.createElement(\"canvas\");\n\t// const frameCtx = frameCanvas.getContext(\"2d\");\n\t// const getCameraImageData = () => {\n\t// \tif (cameraVideo.videoWidth * frameScaleForWorker * cameraVideo.videoHeight * frameScaleForWorker < 1) {\n\t// \t\treturn;\n\t// \t}\n\t// \tframeCanvas.width = cameraVideo.videoWidth * frameScaleForWorker;\n\t// \tframeCanvas.height = cameraVideo.videoHeight * frameScaleForWorker;\n\t// \tframeCtx.drawImage(cameraVideo, 0, 0, frameCanvas.width, frameCanvas.height);\n\t// \treturn frameCtx.getImageData(0, 0, frameCanvas.width, frameCanvas.height);\n\t// };\n\n\tlet currentCameraImageData;\n\tlet facemeshWorker;\n\tconst initFacemeshWorker = () => {\n\t\tif (facemeshWorker) {\n\t\t\tfacemeshWorker.terminate();\n\t\t}\n\t\tfacemeshEstimating = false;\n\t\tfacemeshFirstEstimation = true;\n\t\tfacemeshLoaded = false;\n\t\tfacemeshWorker = new Worker(`${TrackyMouse.dependenciesRoot}/facemesh.worker.js`);\n\t\tfacemeshWorker.addEventListener(\"message\", (e) => {\n\t\t\t// console.log('Message received from worker', e.data);\n\t\t\tif (e.data.type === \"LOADED\") {\n\t\t\t\tfacemeshLoaded = true;\n\t\t\t\tfacemeshEstimateFaces = () => {\n\t\t\t\t\tconst imageData = currentCameraImageData;//getCameraImageData();\n\t\t\t\t\tif (!imageData) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tfacemeshWorker.postMessage({ type: \"ESTIMATE_FACES\", imageData });\n\t\t\t\t\treturn new Promise((resolve, _reject) => {\n\t\t\t\t\t\tfacemeshWorker.addEventListener(\"message\", (e) => {\n\t\t\t\t\t\t\tif (e.data.type === \"ESTIMATED_FACES\") {\n\t\t\t\t\t\t\t\tresolve(e.data.predictions);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, { once: true });\n\t\t\t\t\t});\n\t\t\t\t};\n\t\t\t}\n\t\t}, { once: true });\n\t\tfacemeshWorker.postMessage({ type: \"LOAD\", options: facemeshOptions });\n\t};\n\n\tif (useFacemesh) {\n\t\tinitFacemeshWorker();\n\t}\n\n\tfunction deserializeSettings(settings, initialLoad = false) {\n\t\t// TODO: DRY with deserializeSettings in electron-main.js\n\t\tif (\"globalSettings\" in settings) {\n\t\t\t// Don't use `in` here. Must ignore `undefined` values for the settings to default to the HTML template's defaults in the Electron app.\n\t\t\tif (settings.globalSettings.swapMouseButtons !== undefined) {\n\t\t\t\tswapMouseButtons = settings.globalSettings.swapMouseButtons;\n\t\t\t\tswapMouseButtonsCheckbox.checked = swapMouseButtons;\n\t\t\t}\n\t\t\tif (settings.globalSettings.mirrorCameraView !== undefined) {\n\t\t\t\tmirror = settings.globalSettings.mirrorCameraView;\n\t\t\t\tmirrorCheckbox.checked = mirror;\n\t\t\t}\n\t\t\tif (settings.globalSettings.headTrackingSensitivityX !== undefined) {\n\t\t\t\tsensitivityX = settings.globalSettings.headTrackingSensitivityX;\n\t\t\t\tsensitivityXSlider.value = sensitivityX * 1000;\n\t\t\t}\n\t\t\tif (settings.globalSettings.headTrackingSensitivityY !== undefined) {\n\t\t\t\tsensitivityY = settings.globalSettings.headTrackingSensitivityY;\n\t\t\t\tsensitivityYSlider.value = sensitivityY * 1000;\n\t\t\t}\n\t\t\tif (settings.globalSettings.headTrackingAcceleration !== undefined) {\n\t\t\t\tacceleration = settings.globalSettings.headTrackingAcceleration;\n\t\t\t\taccelerationSlider.value = acceleration * 100;\n\t\t\t}\n\t\t\tif (settings.globalSettings.startEnabled !== undefined) {\n\t\t\t\tstartEnabled = settings.globalSettings.startEnabled;\n\t\t\t\tstartEnabledCheckbox.checked = startEnabled;\n\t\t\t\tif (initialLoad) {\n\t\t\t\t\tpaused = !startEnabled;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (settings.globalSettings.runAtLogin !== undefined) {\n\t\t\t\trunAtLogin = settings.globalSettings.runAtLogin;\n\t\t\t\trunAtLoginCheckbox.checked = runAtLogin;\n\t\t\t}\n\t\t}\n\t}\n\tconst formatVersion = 1;\n\tconst formatName = \"tracky-mouse-settings\";\n\tfunction serializeSettings() {\n\t\t// TODO: DRY with serializeSettings in electron-main.js\n\t\treturn {\n\t\t\tformatVersion,\n\t\t\tformatName,\n\t\t\tglobalSettings: {\n\t\t\t\tstartEnabled,\n\t\t\t\trunAtLogin,\n\t\t\t\tswapMouseButtons,\n\t\t\t\tmirrorCameraView: mirror,\n\t\t\t\theadTrackingSensitivityX: sensitivityX,\n\t\t\t\theadTrackingSensitivityY: sensitivityY,\n\t\t\t\theadTrackingAcceleration: acceleration,\n\t\t\t\t// TODO:\n\t\t\t\t// eyeTrackingSensitivityX,\n\t\t\t\t// eyeTrackingSensitivityY,\n\t\t\t\t// eyeTrackingAcceleration,\n\t\t\t},\n\t\t\t// profiles: [],\n\t\t};\n\t};\n\tconst setOptions = (options) => {\n\t\tif (window.electronAPI) {\n\t\t\twindow.electronAPI.setOptions(options);\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem(\"tracky-mouse-settings\", JSON.stringify(serializeSettings(), null, \"\\t\"));\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t}\n\t};\n\tconst loadOptions = async (initialLoad = false) => {\n\t\tif (window.electronAPI) {\n\t\t\tdeserializeSettings(await window.electronAPI.getOptions(), initialLoad);\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tif (localStorage.getItem(\"tracky-mouse-settings\")) {\n\t\t\t\t\tdeserializeSettings(JSON.parse(localStorage.getItem(\"tracky-mouse-settings\")), initialLoad);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t}\n\t};\n\n\tsensitivityXSlider.onchange = (event) => {\n\t\tsensitivityX = sensitivityXSlider.value / 1000;\n\t\t// HACK: using event argument as a flag to indicate when it's not the initial setup,\n\t\t// to avoid saving the default settings before the actual preferences are loaded.\n\t\tif (event) {\n\t\t\tsetOptions({ globalSettings: { headTrackingSensitivityX: sensitivityX } });\n\t\t}\n\t};\n\tsensitivityYSlider.onchange = (event) => {\n\t\tsensitivityY = sensitivityYSlider.value / 1000;\n\t\t// HACK: using event argument as a flag to indicate when it's not the initial setup,\n\t\t// to avoid saving the default settings before the actual preferences are loaded.\n\t\tif (event) {\n\t\t\tsetOptions({ globalSettings: { headTrackingSensitivityY: sensitivityY } });\n\t\t}\n\t};\n\taccelerationSlider.onchange = (event) => {\n\t\tacceleration = accelerationSlider.value / 100;\n\t\t// HACK: using event argument as a flag to indicate when it's not the initial setup,\n\t\t// to avoid saving the default settings before the actual preferences are loaded.\n\t\tif (event) {\n\t\t\tsetOptions({ globalSettings: { headTrackingAcceleration: acceleration } });\n\t\t}\n\t};\n\tmirrorCheckbox.onchange = (event) => {\n\t\tmirror = mirrorCheckbox.checked;\n\t\t// HACK: using event argument as a flag to indicate when it's not the initial setup,\n\t\t// to avoid saving the default settings before the actual preferences are loaded.\n\t\tif (event) {\n\t\t\tsetOptions({ globalSettings: { mirrorCameraView: mirror } });\n\t\t}\n\t};\n\tswapMouseButtonsCheckbox.onchange = (event) => {\n\t\tswapMouseButtons = swapMouseButtonsCheckbox.checked;\n\t\t// HACK: using event argument as a flag to indicate when it's not the initial setup,\n\t\t// to avoid saving the default settings before the actual preferences are loaded.\n\t\tif (event) {\n\t\t\tsetOptions({ globalSettings: { swapMouseButtons } });\n\t\t}\n\t};\n\tstartEnabledCheckbox.onchange = (event) => {\n\t\tstartEnabled = startEnabledCheckbox.checked;\n\t\t// HACK: using event argument as a flag to indicate when it's not the initial setup,\n\t\t// to avoid saving the default settings before the actual preferences are loaded.\n\t\tif (event) {\n\t\t\tsetOptions({ globalSettings: { startEnabled } });\n\t\t}\n\t};\n\trunAtLoginCheckbox.onchange = (event) => {\n\t\trunAtLogin = runAtLoginCheckbox.checked;\n\t\t// HACK: using event argument as a flag to indicate when it's not the initial setup,\n\t\t// to avoid saving the default settings before the actual preferences are loaded.\n\t\tif (event) {\n\t\t\tsetOptions({ globalSettings: { runAtLogin } });\n\t\t}\n\t};\n\n\t// Load defaults from HTML\n\tmirrorCheckbox.onchange();\n\tswapMouseButtonsCheckbox.onchange();\n\tstartEnabledCheckbox.onchange();\n\trunAtLoginCheckbox.onchange();\n\tsensitivityXSlider.onchange();\n\tsensitivityYSlider.onchange();\n\taccelerationSlider.onchange();\n\tpaused = !startEnabled;\n\n\t// Handle right click on \"swap mouse buttons\", so it doesn't leave users stranded right-clicking.\n\t// Note that if you click outside the application window, hiding it behind another window, or minimize it,\n\t// you can still be left in a tricky situation.\n\t// A more general safety net would be a \"revert changes?\" timer (https://github.com/1j01/tracky-mouse/issues/43)\n\t// But this is good to have in any case, since you don't want to have to wait for a timeout if you don't have to.\n\tfor (const el of [swapMouseButtonsLabel, swapMouseButtonsCheckbox]) {\n\t\tel.addEventListener(\"contextmenu\", (e) => {\n\t\t\te.preventDefault();\n\t\t\tswapMouseButtonsCheckbox.checked = !swapMouseButtonsCheckbox.checked;\n\t\t\tswapMouseButtonsCheckbox.onchange(e);\n\t\t});\n\t}\n\n\tconst settingsLoadedPromise = loadOptions(true);\n\n\t// Don't use WebGL because clmTracker is our fallback! It's also not much slower than with WebGL.\n\tvar clmTracker = new clm.tracker({ useWebGL: false });\n\tclmTracker.init();\n\tvar clmTrackingStarted = false;\n\n\tconst reset = () => {\n\t\tclmTrackingStarted = false;\n\t\tcameraFramesSinceFacemeshUpdate.length = 0;\n\t\tif (facemeshPrediction) {\n\t\t\t// facemesh has a setting maxContinuousChecks that determines \"How many frames to go without running\n\t\t\t// the bounding box detector. Only relevant if maxFaces > 1. Defaults to 5.\"\n\t\t\tfacemeshRejectNext = facemeshOptions.maxContinuousChecks;\n\t\t}\n\t\tfacemeshPrediction = null;\n\t\tuseClmTracking = true;\n\t\tshowClmTracking = true;\n\t\tpointsBasedOnFaceScore = 0;\n\t\tfaceScore = 0;\n\t\tfaceConvergence = 0;\n\n\t\tstartStopButton.textContent = \"Start\";\n\t\tstartStopButton.setAttribute(\"aria-pressed\", \"false\");\n\t};\n\n\tuseCameraButton.onclick = TrackyMouse.useCamera = () => {\n\t\tnavigator.mediaDevices.getUserMedia({\n\t\t\taudio: false,\n\t\t\tvideo: {\n\t\t\t\twidth: defaultWidth,\n\t\t\t\theight: defaultHeight,\n\t\t\t\tfacingMode: \"user\",\n\t\t\t}\n\t\t}).then((stream) => {\n\t\t\treset();\n\t\t\ttry {\n\t\t\t\tif ('srcObject' in cameraVideo) {\n\t\t\t\t\tcameraVideo.srcObject = stream;\n\t\t\t\t} else {\n\t\t\t\t\tcameraVideo.src = window.URL.createObjectURL(stream);\n\t\t\t\t}\n\t\t\t} catch (_err) {\n\t\t\t\tcameraVideo.src = stream;\n\t\t\t}\n\t\t\tuseCameraButton.hidden = true;\n\t\t\terrorMessage.hidden = true;\n\t\t\tif (!paused) {\n\t\t\t\tstartStopButton.textContent = \"Stop\";\n\t\t\t\tstartStopButton.setAttribute(\"aria-pressed\", \"true\");\n\t\t\t}\n\t\t}, (error) => {\n\t\t\tconsole.log(error);\n\t\t\tif (error.name == \"NotFoundError\" || error.name == \"DevicesNotFoundError\") {\n\t\t\t\t// required track is missing\n\t\t\t\terrorMessage.textContent = \"No camera found. Please make sure you have a camera connected and enabled.\";\n\t\t\t} else if (error.name == \"NotReadableError\" || error.name == \"TrackStartError\") {\n\t\t\t\t// webcam is already in use\n\t\t\t\terrorMessage.textContent = \"Webcam is already in use. Please make sure you have no other programs using the camera.\";\n\t\t\t} else if (error.name == \"OverconstrainedError\" || error.name == \"ConstraintNotSatisfiedError\") {\n\t\t\t\t// constraints can not be satisfied by avb. devices\n\t\t\t\terrorMessage.textContent = \"Webcam does not support the required resolution. Please change your settings.\";\n\t\t\t} else if (error.name == \"NotAllowedError\" || error.name == \"PermissionDeniedError\") {\n\t\t\t\t// permission denied in browser\n\t\t\t\terrorMessage.textContent = \"Permission denied. Please enable access to the camera.\";\n\t\t\t} else if (error.name == \"TypeError\") {\n\t\t\t\t// empty constraints object\n\t\t\t\terrorMessage.textContent = `Something went wrong accessing the camera. (${error.name}: ${error.message})`;\n\t\t\t} else {\n\t\t\t\t// other errors\n\t\t\t\terrorMessage.textContent = `Something went wrong accessing the camera. Please try again. (${error.name}: ${error.message})`;\n\t\t\t}\n\t\t\terrorMessage.textContent = `⚠️ ${errorMessage.textContent}`;\n\t\t\terrorMessage.hidden = false;\n\t\t});\n\t};\n\tuseDemoFootageButton.onclick = TrackyMouse.useDemoFootage = () => {\n\t\treset();\n\t\tcameraVideo.srcObject = null;\n\t\tcameraVideo.src = `${TrackyMouse.dependenciesRoot}/private/demo-input-footage.webm`;\n\t\tcameraVideo.loop = true;\n\t};\n\n\tstartStopButton.onclick = () => {\n\t\tif (!useCameraButton.hidden) {\n\t\t\tTrackyMouse.useCamera();\n\t\t\tif (!paused) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\thandleShortcut(\"toggle-tracking\");\n\t};\n\n\tif (!(navigator.mediaDevices && navigator.mediaDevices.getUserMedia)) {\n\t\tconsole.log('getUserMedia not supported in this browser');\n\t}\n\n\tcanvasContainer.style.aspectRatio = `${defaultWidth} / ${defaultHeight}`;\n\tcanvasContainer.style.setProperty('--aspect-ratio', defaultWidth / defaultHeight);\n\n\tcameraVideo.addEventListener('loadedmetadata', () => {\n\t\tcameraVideo.play();\n\t\tcameraVideo.width = cameraVideo.videoWidth;\n\t\tcameraVideo.height = cameraVideo.videoHeight;\n\t\tcanvas.width = cameraVideo.videoWidth;\n\t\tcanvas.height = cameraVideo.videoHeight;\n\t\tdebugFramesCanvas.width = cameraVideo.videoWidth;\n\t\tdebugFramesCanvas.height = cameraVideo.videoHeight;\n\t\tdebugPointsCanvas.width = cameraVideo.videoWidth;\n\t\tdebugPointsCanvas.height = cameraVideo.videoHeight;\n\n\t\t// .tracky-mouse-canvas-container needs aspect-ratio CSS property\n\t\t// so that the video can be scaled to fit the container.\n\t\tcanvasContainer.style.aspectRatio = `${cameraVideo.videoWidth} / ${cameraVideo.videoHeight}`;\n\t\tcanvasContainer.style.setProperty('--aspect-ratio', cameraVideo.videoWidth / cameraVideo.videoHeight);\n\n\t\tmainOops = new OOPS();\n\t\tif (useFacemesh) {\n\t\t\tworkerSyncedOops = new OOPS();\n\t\t}\n\t});\n\tcameraVideo.addEventListener('play', () => {\n\t\tclmTracker.reset();\n\t\tclmTracker.initFaceDetector(cameraVideo);\n\t\tclmTrackingStarted = true;\n\t});\n\tcameraVideo.addEventListener('ended', () => {\n\t\tuseCameraButton.hidden = false;\n\t\tif (!paused) {\n\t\t\thandleShortcut(\"toggle-tracking\");\n\t\t}\n\t});\n\tcameraVideo.addEventListener('error', () => {\n\t\tuseCameraButton.hidden = false;\n\t\tif (!paused) {\n\t\t\thandleShortcut(\"toggle-tracking\");\n\t\t}\n\t});\n\n\tcanvas.width = defaultWidth;\n\tcanvas.height = defaultHeight;\n\tcameraVideo.width = defaultWidth;\n\tcameraVideo.height = defaultHeight;\n\n\tconst debugFramesCanvas = document.createElement(\"canvas\");\n\tdebugFramesCanvas.width = canvas.width;\n\tdebugFramesCanvas.height = canvas.height;\n\tconst debugFramesCtx = debugFramesCanvas.getContext(\"2d\");\n\n\tconst debugPointsCanvas = document.createElement(\"canvas\");\n\tdebugPointsCanvas.width = canvas.width;\n\tdebugPointsCanvas.height = canvas.height;\n\tconst debugPointsCtx = debugPointsCanvas.getContext(\"2d\");\n\n\t// function getPyramidData(pyramid) {\n\t// \tconst array = new Float32Array(pyramid.data.reduce((sum, matrix)=> sum + matrix.buffer.f32.length, 0));\n\t// \tlet offset = 0;\n\t// \tfor (const matrix of pyramid.data) {\n\t// \t\tcopy matrix.buffer.f32 into array starting at offset;\n\t// \t\toffset += matrix.buffer.f32.length;\n\t// \t}\n\t// \treturn array;\n\t// }\n\t// function setPyramidData(pyramid, array) {\n\t// \tlet offset = 0;\n\t// \tfor (const matrix of pyramid.data) {\n\t// \t\tcopy portion of array starting at offset into matrix.buffer.f32\n\t// \t\toffset += matrix.buffer.f32.length;\n\t// \t}\n\t// }\n\n\t// maybe should be based on size of head in view?\n\tconst pruningGridSize = 5;\n\tconst minDistanceToAddPoint = pruningGridSize * 1.5;\n\n\t// Object Oriented Programming Sucks\n\t// or Optical flOw Points System\n\tclass OOPS {\n\t\tconstructor() {\n\t\t\tthis.curPyramid = new jsfeat.pyramid_t(3);\n\t\t\tthis.prevPyramid = new jsfeat.pyramid_t(3);\n\t\t\tthis.curPyramid.allocate(cameraVideo.videoWidth, cameraVideo.videoHeight, jsfeat.U8C1_t);\n\t\t\tthis.prevPyramid.allocate(cameraVideo.videoWidth, cameraVideo.videoHeight, jsfeat.U8C1_t);\n\n\t\t\tthis.pointCount = 0;\n\t\t\tthis.pointStatus = new Uint8Array(maxPoints);\n\t\t\tthis.prevXY = new Float32Array(maxPoints * 2);\n\t\t\tthis.curXY = new Float32Array(maxPoints * 2);\n\t\t}\n\t\taddPoint(x, y) {\n\t\t\tif (this.pointCount < maxPoints) {\n\t\t\t\tvar pointIndex = this.pointCount * 2;\n\t\t\t\tthis.curXY[pointIndex] = x;\n\t\t\t\tthis.curXY[pointIndex + 1] = y;\n\t\t\t\tthis.prevXY[pointIndex] = x;\n\t\t\t\tthis.prevXY[pointIndex + 1] = y;\n\t\t\t\tthis.pointCount++;\n\t\t\t}\n\t\t}\n\t\tfilterPoints(condition) {\n\t\t\tvar outputPointIndex = 0;\n\t\t\tfor (var inputPointIndex = 0; inputPointIndex < this.pointCount; inputPointIndex++) {\n\t\t\t\tif (condition(inputPointIndex)) {\n\t\t\t\t\tif (outputPointIndex < inputPointIndex) {\n\t\t\t\t\t\tconst inputOffset = inputPointIndex * 2;\n\t\t\t\t\t\tconst outputOffset = outputPointIndex * 2;\n\t\t\t\t\t\tthis.curXY[outputOffset] = this.curXY[inputOffset];\n\t\t\t\t\t\tthis.curXY[outputOffset + 1] = this.curXY[inputOffset + 1];\n\t\t\t\t\t\tthis.prevXY[outputOffset] = this.prevXY[inputOffset];\n\t\t\t\t\t\tthis.prevXY[outputOffset + 1] = this.prevXY[inputOffset + 1];\n\t\t\t\t\t}\n\t\t\t\t\toutputPointIndex++;\n\t\t\t\t} else {\n\t\t\t\t\tdebugPointsCtx.fillStyle = \"red\";\n\t\t\t\t\tconst inputOffset = inputPointIndex * 2;\n\t\t\t\t\tcircle(debugPointsCtx, this.curXY[inputOffset], this.curXY[inputOffset + 1], 5);\n\t\t\t\t\tdebugPointsCtx.fillText(condition.toString(), 5 + this.curXY[inputOffset], this.curXY[inputOffset + 1]);\n\t\t\t\t\t// console.log(this.curXY[inputOffset], this.curXY[inputOffset + 1]);\n\t\t\t\t\tctx.strokeStyle = ctx.fillStyle;\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.moveTo(this.prevXY[inputOffset], this.prevXY[inputOffset + 1]);\n\t\t\t\t\tctx.lineTo(this.curXY[inputOffset], this.curXY[inputOffset + 1]);\n\t\t\t\t\tctx.stroke();\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.pointCount = outputPointIndex;\n\t\t}\n\t\tprunePoints() {\n\t\t\t// pointStatus is only valid (indices line up) before filtering occurs, so must come first (could be combined though)\n\t\t\tthis.filterPoints((pointIndex) => this.pointStatus[pointIndex] == 1);\n\n\t\t\t// De-duplicate points that are too close together\n\t\t\t// - Points that have collapsed together are completely useless.\n\t\t\t// - Points that are too close together are not necessarily helpful,\n\t\t\t//   and may adversely affect the tracking due to uneven weighting across your face.\n\t\t\t// - Reducing the number of points improves FPS.\n\t\t\tconst grid = {};\n\t\t\tfor (let pointIndex = 0; pointIndex < this.pointCount; pointIndex++) {\n\t\t\t\tconst pointOffset = pointIndex * 2;\n\t\t\t\tgrid[`${~~(this.curXY[pointOffset] / pruningGridSize)},${~~(this.curXY[pointOffset + 1] / pruningGridSize)}`] = pointIndex;\n\t\t\t}\n\t\t\tconst indexesToKeep = Object.values(grid);\n\t\t\tthis.filterPoints((pointIndex) => indexesToKeep.includes(pointIndex));\n\t\t}\n\t\tupdate(imageData) {\n\t\t\t[this.prevXY, this.curXY] = [this.curXY, this.prevXY];\n\t\t\t[this.prevPyramid, this.curPyramid] = [this.curPyramid, this.prevPyramid];\n\n\t\t\t// these are options worth breaking out and exploring\n\t\t\tvar winSize = 20;\n\t\t\tvar maxIterations = 30;\n\t\t\tvar epsilon = 0.01;\n\t\t\tvar minEigen = 0.001;\n\n\t\t\tjsfeat.imgproc.grayscale(imageData.data, imageData.width, imageData.height, this.curPyramid.data[0]);\n\t\t\tthis.curPyramid.build(this.curPyramid.data[0], true);\n\t\t\tjsfeat.optical_flow_lk.track(\n\t\t\t\tthis.prevPyramid, this.curPyramid,\n\t\t\t\tthis.prevXY, this.curXY,\n\t\t\t\tthis.pointCount,\n\t\t\t\twinSize, maxIterations,\n\t\t\t\tthis.pointStatus,\n\t\t\t\tepsilon, minEigen);\n\t\t\tthis.prunePoints();\n\t\t}\n\t\tdraw(ctx) {\n\t\t\tfor (var i = 0; i < this.pointCount; i++) {\n\t\t\t\tvar pointOffset = i * 2;\n\t\t\t\t// var distMoved = Math.hypot(\n\t\t\t\t// \tthis.prevXY[pointOffset] - this.curXY[pointOffset],\n\t\t\t\t// \tthis.prevXY[pointOffset + 1] - this.curXY[pointOffset + 1]\n\t\t\t\t// );\n\t\t\t\t// if (distMoved >= 1) {\n\t\t\t\t// \tctx.fillStyle = \"lime\";\n\t\t\t\t// } else {\n\t\t\t\t// \tctx.fillStyle = \"gray\";\n\t\t\t\t// }\n\t\t\t\tcircle(ctx, this.curXY[pointOffset], this.curXY[pointOffset + 1], 3);\n\t\t\t\tctx.strokeStyle = ctx.fillStyle;\n\t\t\t\tctx.beginPath();\n\t\t\t\tctx.moveTo(this.prevXY[pointOffset], this.prevXY[pointOffset + 1]);\n\t\t\t\tctx.lineTo(this.curXY[pointOffset], this.curXY[pointOffset + 1]);\n\t\t\t\tctx.stroke();\n\t\t\t}\n\t\t}\n\t\tgetMovement() {\n\t\t\tvar movementX = 0;\n\t\t\tvar movementY = 0;\n\t\t\tvar numMovements = 0;\n\t\t\tfor (var i = 0; i < this.pointCount; i++) {\n\t\t\t\tvar pointOffset = i * 2;\n\t\t\t\tmovementX += this.curXY[pointOffset] - this.prevXY[pointOffset];\n\t\t\t\tmovementY += this.curXY[pointOffset + 1] - this.prevXY[pointOffset + 1];\n\t\t\t\tnumMovements += 1;\n\t\t\t}\n\t\t\tif (numMovements > 0) {\n\t\t\t\tmovementX /= numMovements;\n\t\t\t\tmovementY /= numMovements;\n\t\t\t}\n\t\t\treturn [movementX, movementY];\n\t\t}\n\t}\n\n\tcanvas.addEventListener('click', (event) => {\n\t\tif (!mainOops) {\n\t\t\treturn;\n\t\t}\n\t\tconst rect = canvas.getBoundingClientRect();\n\t\tif (mirror) {\n\t\t\tmainOops.addPoint(\n\t\t\t\t(rect.right - event.clientX) / rect.width * canvas.width,\n\t\t\t\t(event.clientY - rect.top) / rect.height * canvas.height,\n\t\t\t);\n\t\t} else {\n\t\t\tmainOops.addPoint(\n\t\t\t\t(event.clientX - rect.left) / rect.width * canvas.width,\n\t\t\t\t(event.clientY - rect.top) / rect.height * canvas.height,\n\t\t\t);\n\t\t}\n\t});\n\n\tfunction maybeAddPoint(oops, x, y) {\n\t\t// In order to prefer points that already exist, since they're already tracking,\n\t\t// in order to keep a smooth overall tracking calculation,\n\t\t// don't add points if they're close to an existing point.\n\t\t// Otherwise, it would not just be redundant, but often remove the older points, in the pruning.\n\t\tfor (var pointIndex = 0; pointIndex < oops.pointCount; pointIndex++) {\n\t\t\tvar pointOffset = pointIndex * 2;\n\t\t\t// var distance = Math.hypot(\n\t\t\t// \tx - oops.curXY[pointOffset],\n\t\t\t// \ty - oops.curXY[pointOffset + 1]\n\t\t\t// );\n\t\t\t// if (distance < 8) {\n\t\t\t// \treturn;\n\t\t\t// }\n\t\t\t// It might be good to base this on the size of the face...\n\t\t\t// Also, since we're pruning points based on a grid,\n\t\t\t// there's not much point in using Euclidean distance here,\n\t\t\t// we can just look at x and y distances.\n\t\t\tif (\n\t\t\t\tMath.abs(x - oops.curXY[pointOffset]) <= minDistanceToAddPoint ||\n\t\t\t\tMath.abs(y - oops.curXY[pointOffset + 1]) <= minDistanceToAddPoint\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\toops.addPoint(x, y);\n\t}\n\n\tfunction draw(update = true) {\n\t\tctx.resetTransform(); // in case there is an error, don't flip constantly back and forth due to mirroring\n\t\tctx.clearRect(0, 0, canvas.width, canvas.height); // in case there's no footage\n\t\tctx.save();\n\t\tctx.drawImage(cameraVideo, 0, 0, canvas.width, canvas.height);\n\t\tconst imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n\t\tcurrentCameraImageData = imageData;\n\n\t\tif (mirror) {\n\t\t\tctx.translate(canvas.width, 0);\n\t\t\tctx.scale(-1, 1);\n\t\t\tctx.drawImage(cameraVideo, 0, 0, canvas.width, canvas.height);\n\t\t}\n\n\t\tif (!mainOops) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (update) {\n\t\t\tif (clmTrackingStarted) {\n\t\t\t\tif (useClmTracking || showClmTracking) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tclmTracker.track(cameraVideo);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.warn(\"Error in clmTracker.track()\", error);\n\t\t\t\t\t\tif (clmTracker.getCurrentParameters().includes(NaN)) {\n\t\t\t\t\t\t\tconsole.warn(\"NaNs crept in.\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tface = clmTracker.getCurrentPosition();\n\t\t\t\t\tfaceScore = clmTracker.getScore();\n\t\t\t\t\tfaceConvergence = Math.pow(clmTracker.getConvergence(), 0.5);\n\t\t\t\t}\n\t\t\t\tif (facemeshLoaded && !facemeshEstimating) {\n\t\t\t\t\tfacemeshEstimating = true;\n\t\t\t\t\t// movementXSinceFacemeshUpdate = 0;\n\t\t\t\t\t// movementYSinceFacemeshUpdate = 0;\n\t\t\t\t\tcameraFramesSinceFacemeshUpdate = [];\n\t\t\t\t\t// If I switch virtual console desktop sessions in Ubuntu with Ctrl+Alt+F1 (and back with Ctrl+Alt+F2),\n\t\t\t\t\t// WebGL context is lost, which breaks facemesh (and clmTracker if useWebGL is not false)\n\t\t\t\t\t// Error: Size(8192) must match the product of shape 0, 0, 0\n\t\t\t\t\t//     at inferFromImplicitShape (tf.js:14142)\n\t\t\t\t\t//     at Object.reshape$3 [as kernelFunc] (tf.js:110368)\n\t\t\t\t\t//     at kernelFunc (tf.js:17241)\n\t\t\t\t\t//     at tf.js:17334\n\t\t\t\t\t//     at Engine.scopedRun (tf.js:17094)\n\t\t\t\t\t//     at Engine.runKernelFunc (tf.js:17328)\n\t\t\t\t\t//     at Engine.runKernel (tf.js:17171)\n\t\t\t\t\t//     at reshape_ (tf.js:25875)\n\t\t\t\t\t//     at reshape__op (tf.js:18348)\n\t\t\t\t\t//     at executeOp (tf.js:85396)\n\t\t\t\t\t// WebGL: CONTEXT_LOST_WEBGL: loseContext: context lost\n\n\t\t\t\t\t// Note that the first estimation from facemesh often takes a while,\n\t\t\t\t\t// and we don't want to continuously terminate the worker as it's working on those first results.\n\t\t\t\t\t// And also, for the first estimate it hasn't actually disabled clmtrackr yet, so it's fine if it's a long timeout.\n\t\t\t\t\tclearTimeout(fallbackTimeoutID);\n\t\t\t\t\tfallbackTimeoutID = setTimeout(() => {\n\t\t\t\t\t\tif (!useClmTracking) {\n\t\t\t\t\t\t\treset();\n\t\t\t\t\t\t\tclmTracker.init();\n\t\t\t\t\t\t\tclmTracker.reset();\n\t\t\t\t\t\t\tclmTracker.initFaceDetector(cameraVideo);\n\t\t\t\t\t\t\tclmTrackingStarted = true;\n\t\t\t\t\t\t\tconsole.warn(\"Falling back to clmtrackr\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// If you've switched desktop sessions, it will presumably fail to get a new webgl context until you've switched back\n\t\t\t\t\t\t// Is this setInterval useful, vs just starting the worker?\n\t\t\t\t\t\t// It probably has a faster cycle, with the code as it is now, but maybe not inherently.\n\t\t\t\t\t\t// TODO: do the extra getContext() calls add to a GPU process crash limit\n\t\t\t\t\t\t// that makes it only able to recover a couple times (outside the electron app)?\n\t\t\t\t\t\t// For electron, I set chromium flag --disable-gpu-process-crash-limit so it can recover unlimited times.\n\t\t\t\t\t\t// TODO: there's still the case of WebGL backend failing to initialize NOT due to the process crash limit,\n\t\t\t\t\t\t// where it'd be good to have it try again (maybe with exponential falloff?)\n\t\t\t\t\t\t// (I think I can move my fallbackTimeout code into/around `initFacemeshWorker` and `facemeshEstimateFaces`)\n\n\t\t\t\t\t\t// Note: clearTimeout/clearInterval work interchangeably\n\t\t\t\t\t\tfallbackTimeoutID = setInterval(() => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t// Once we can create a webgl2 canvas...\n\t\t\t\t\t\t\t\tdocument.createElement(\"canvas\").getContext(\"webgl2\");\n\t\t\t\t\t\t\t\tclearInterval(fallbackTimeoutID);\n\t\t\t\t\t\t\t\t// It's worth trying to re-initialize...\n\t\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\t\tconsole.warn(\"Re-initializing facemesh worker\");\n\t\t\t\t\t\t\t\t\tinitFacemeshWorker();\n\t\t\t\t\t\t\t\t\tfacemeshRejectNext = 1; // or more?\n\t\t\t\t\t\t\t\t}, 1000);\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tif (error.name !== \"InvalidStateError\") {\n\t\t\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tconsole.warn(\"Trying to recover; can't create webgl2 canvas yet...\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, 500);\n\t\t\t\t\t}, facemeshFirstEstimation ? 20000 : 2000);\n\t\t\t\t\tfacemeshEstimateFaces().then((predictions) => {\n\t\t\t\t\t\tfacemeshEstimating = false;\n\t\t\t\t\t\tfacemeshFirstEstimation = false;\n\n\t\t\t\t\t\tfacemeshRejectNext -= 1;\n\t\t\t\t\t\tif (facemeshRejectNext > 0) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfacemeshPrediction = predictions[0]; // undefined if no faces found\n\n\t\t\t\t\t\tuseClmTracking = false;\n\t\t\t\t\t\tshowClmTracking = false;\n\t\t\t\t\t\tclearTimeout(fallbackTimeoutID);\n\n\t\t\t\t\t\tif (!facemeshPrediction) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// this applies to facemeshPrediction.annotations as well, which references the same points\n\t\t\t\t\t\t// facemeshPrediction.scaledMesh.forEach((point) => {\n\t\t\t\t\t\t// \tpoint[0] /= frameScaleForWorker;\n\t\t\t\t\t\t// \tpoint[1] /= frameScaleForWorker;\n\t\t\t\t\t\t// });\n\n\t\t\t\t\t\t// time travel latency compensation\n\t\t\t\t\t\t// keep a history of camera frames since the prediction was requested,\n\t\t\t\t\t\t// and analyze optical flow of new points over that history\n\n\t\t\t\t\t\t// mainOops.filterPoints(() => false); // for DEBUG, empty points (could probably also just set pointCount = 0;\n\n\t\t\t\t\t\tworkerSyncedOops.filterPoints(() => false); // empty points (could probably also just set pointCount = 0;\n\n\t\t\t\t\t\tconst { annotations } = facemeshPrediction;\n\t\t\t\t\t\t// nostrils\n\t\t\t\t\t\tworkerSyncedOops.addPoint(annotations.noseLeftCorner[0][0], annotations.noseLeftCorner[0][1]);\n\t\t\t\t\t\tworkerSyncedOops.addPoint(annotations.noseRightCorner[0][0], annotations.noseRightCorner[0][1]);\n\t\t\t\t\t\t// midway between eyes\n\t\t\t\t\t\tworkerSyncedOops.addPoint(annotations.midwayBetweenEyes[0][0], annotations.midwayBetweenEyes[0][1]);\n\t\t\t\t\t\t// inner eye corners\n\t\t\t\t\t\t// workerSyncedOops.addPoint(annotations.leftEyeLower0[8][0], annotations.leftEyeLower0[8][1]);\n\t\t\t\t\t\t// workerSyncedOops.addPoint(annotations.rightEyeLower0[8][0], annotations.rightEyeLower0[8][1]);\n\n\t\t\t\t\t\t// console.log(workerSyncedOops.pointCount, cameraFramesSinceFacemeshUpdate.length, workerSyncedOops.curXY);\n\t\t\t\t\t\tif (enableTimeTravel) {\n\t\t\t\t\t\t\tdebugFramesCtx.clearRect(0, 0, debugFramesCanvas.width, debugFramesCanvas.height);\n\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\tdebugPointsCtx.clearRect(0, 0, debugPointsCanvas.width, debugPointsCanvas.height);\n\t\t\t\t\t\t\t}, 900);\n\t\t\t\t\t\t\tcameraFramesSinceFacemeshUpdate.forEach((imageData, _index) => {\n\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\tif (debugTimeTravel) {\n\t\t\t\t\t\t\t\t\tdebugFramesCtx.save();\n\t\t\t\t\t\t\t\t\tdebugFramesCtx.globalAlpha = 0.1;\n\t\t\t\t\t\t\t\t\t// debugFramesCtx.globalCompositeOperation = index % 2 === 0 ? \"xor\" : \"xor\";\n\t\t\t\t\t\t\t\t\tframeCtx.putImageData(imageData, 0, 0);\n\t\t\t\t\t\t\t\t\t// debugFramesCtx.putImageData(imageData, 0, 0);\n\t\t\t\t\t\t\t\t\tdebugFramesCtx.drawImage(frameCanvas, 0, 0, canvas.width, canvas.height);\n\t\t\t\t\t\t\t\t\tdebugFramesCtx.restore();\n\t\t\t\t\t\t\t\t\tdebugPointsCtx.fillStyle = \"aqua\";\n\t\t\t\t\t\t\t\t\tworkerSyncedOops.draw(debugPointsCtx);\n\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\tworkerSyncedOops.update(imageData);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Bring points from workerSyncedOops to realtime mainOops\n\t\t\t\t\t\tfor (var pointIndex = 0; pointIndex < workerSyncedOops.pointCount; pointIndex++) {\n\t\t\t\t\t\t\tconst pointOffset = pointIndex * 2;\n\t\t\t\t\t\t\tmaybeAddPoint(mainOops, workerSyncedOops.curXY[pointOffset], workerSyncedOops.curXY[pointOffset + 1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Don't do this! It's not how this is supposed to work.\n\t\t\t\t\t\t// mainOops.pointCount = workerSyncedOops.pointCount;\n\t\t\t\t\t\t// for (var pointIndex = 0; pointIndex < workerSyncedOops.pointCount; pointIndex++) {\n\t\t\t\t\t\t// \tconst pointOffset = pointIndex * 2;\n\t\t\t\t\t\t// \tmainOops.curXY[pointOffset] = workerSyncedOops.curXY[pointOffset];\n\t\t\t\t\t\t// \tmainOops.curXY[pointOffset+1] = workerSyncedOops.curXY[pointOffset+1];\n\t\t\t\t\t\t// \tmainOops.prevXY[pointOffset] = workerSyncedOops.prevXY[pointOffset];\n\t\t\t\t\t\t// \tmainOops.prevXY[pointOffset+1] = workerSyncedOops.prevXY[pointOffset+1];\n\t\t\t\t\t\t// }\n\n\t\t\t\t\t\t// naive latency compensation\n\t\t\t\t\t\t// Note: this applies to facemeshPrediction.annotations as well which references the same point objects\n\t\t\t\t\t\t// Note: This latency compensation only really works if it's already tracking well\n\t\t\t\t\t\t// if (prevFaceInViewConfidence > 0.99) {\n\t\t\t\t\t\t// \tfacemeshPrediction.scaledMesh.forEach((point) => {\n\t\t\t\t\t\t// \t\tpoint[0] += movementXSinceFacemeshUpdate;\n\t\t\t\t\t\t// \t\tpoint[1] += movementYSinceFacemeshUpdate;\n\t\t\t\t\t\t// \t});\n\t\t\t\t\t\t// }\n\n\t\t\t\t\t\tpointsBasedOnFaceInViewConfidence = facemeshPrediction.faceInViewConfidence;\n\n\t\t\t\t\t\t// TODO: separate confidence threshold for removing vs adding points?\n\n\t\t\t\t\t\t// cull points to those within useful facial region\n\t\t\t\t\t\t// TODO: use time travel for this too, probably! with a history of the points\n\t\t\t\t\t\t// a complexity would be that points can be removed over time and we need to keep them identified\n\t\t\t\t\t\tmainOops.filterPoints((pointIndex) => {\n\t\t\t\t\t\t\tvar pointOffset = pointIndex * 2;\n\t\t\t\t\t\t\t// distance from tip of nose (stretched so make an ellipse taller than wide)\n\t\t\t\t\t\t\tvar distance = Math.hypot(\n\t\t\t\t\t\t\t\t(annotations.noseTip[0][0] - mainOops.curXY[pointOffset]) * 1.4,\n\t\t\t\t\t\t\t\tannotations.noseTip[0][1] - mainOops.curXY[pointOffset + 1]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tvar headSize = Math.hypot(\n\t\t\t\t\t\t\t\tannotations.leftCheek[0][0] - annotations.rightCheek[0][0],\n\t\t\t\t\t\t\t\tannotations.leftCheek[0][1] - annotations.rightCheek[0][1]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (distance > headSize) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Avoid blinking eyes affecting pointer position.\n\t\t\t\t\t\t\t// distance to outer corners of eyes\n\t\t\t\t\t\t\tdistance = Math.min(\n\t\t\t\t\t\t\t\tMath.hypot(\n\t\t\t\t\t\t\t\t\tannotations.leftEyeLower0[0][0] - mainOops.curXY[pointOffset],\n\t\t\t\t\t\t\t\t\tannotations.leftEyeLower0[0][1] - mainOops.curXY[pointOffset + 1]\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tMath.hypot(\n\t\t\t\t\t\t\t\t\tannotations.rightEyeLower0[0][0] - mainOops.curXY[pointOffset],\n\t\t\t\t\t\t\t\t\tannotations.rightEyeLower0[0][1] - mainOops.curXY[pointOffset + 1]\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (distance < headSize * 0.42) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t});\n\t\t\t\t\t}, () => {\n\t\t\t\t\t\tfacemeshEstimating = false;\n\t\t\t\t\t\tfacemeshFirstEstimation = false;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tmainOops.update(imageData);\n\t\t}\n\n\t\tif (window.electronAPI) {\n\t\t\twindow.electronAPI.notifyCameraFeedDiagnostics({ headNotFound: !face && !facemeshPrediction });\n\t\t}\n\n\t\tif (facemeshPrediction) {\n\t\t\tctx.fillStyle = \"red\";\n\n\t\t\tconst bad = facemeshPrediction.faceInViewConfidence < faceInViewConfidenceThreshold;\n\t\t\tctx.fillStyle = bad ? 'rgb(255,255,0)' : 'rgb(130,255,50)';\n\t\t\tif (!bad || mainOops.pointCount < 3 || facemeshPrediction.faceInViewConfidence > pointsBasedOnFaceInViewConfidence + 0.05) {\n\t\t\t\tif (bad) {\n\t\t\t\t\tctx.fillStyle = 'rgba(255,0,255)';\n\t\t\t\t}\n\t\t\t\tif (update && useFacemesh) {\n\t\t\t\t\t// this should just be visual, since we only add/remove points based on the facemesh data when receiving it\n\t\t\t\t\tfacemeshPrediction.scaledMesh.forEach((point) => {\n\t\t\t\t\t\tpoint[0] += prevMovementX;\n\t\t\t\t\t\tpoint[1] += prevMovementY;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tfacemeshPrediction.scaledMesh.forEach(([x, y, _z]) => {\n\t\t\t\t\tctx.fillRect(x, y, 1, 1);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tif (update && useFacemesh) {\n\t\t\t\t\tpointsBasedOnFaceInViewConfidence -= 0.001;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (face) {\n\t\t\tconst bad = faceScore < faceScoreThreshold;\n\t\t\tctx.strokeStyle = bad ? 'rgb(255,255,0)' : 'rgb(130,255,50)';\n\t\t\tif (!bad || mainOops.pointCount < 2 || faceScore > pointsBasedOnFaceScore + 0.05) {\n\t\t\t\tif (bad) {\n\t\t\t\t\tctx.strokeStyle = 'rgba(255,0,255)';\n\t\t\t\t}\n\t\t\t\tif (update && useClmTracking) {\n\t\t\t\t\tpointsBasedOnFaceScore = faceScore;\n\n\t\t\t\t\t// nostrils\n\t\t\t\t\tmaybeAddPoint(mainOops, face[42][0], face[42][1]);\n\t\t\t\t\tmaybeAddPoint(mainOops, face[43][0], face[43][1]);\n\t\t\t\t\t// inner eye corners\n\t\t\t\t\t// maybeAddPoint(mainOops, face[25][0], face[25][1]);\n\t\t\t\t\t// maybeAddPoint(mainOops, face[30][0], face[30][1]);\n\n\t\t\t\t\t// TODO: separate confidence threshold for removing vs adding points?\n\n\t\t\t\t\t// cull points to those within useful facial region\n\t\t\t\t\tmainOops.filterPoints((pointIndex) => {\n\t\t\t\t\t\tvar pointOffset = pointIndex * 2;\n\t\t\t\t\t\t// distance from tip of nose (stretched so make an ellipse taller than wide)\n\t\t\t\t\t\tvar distance = Math.hypot(\n\t\t\t\t\t\t\t(face[62][0] - mainOops.curXY[pointOffset]) * 1.4,\n\t\t\t\t\t\t\tface[62][1] - mainOops.curXY[pointOffset + 1]\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// distance based on outer eye corners\n\t\t\t\t\t\tvar headSize = Math.hypot(\n\t\t\t\t\t\t\tface[23][0] - face[28][0],\n\t\t\t\t\t\t\tface[23][1] - face[28][1]\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (distance > headSize) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (update && useClmTracking) {\n\t\t\t\t\tpointsBasedOnFaceScore -= 0.001;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (showClmTracking) {\n\t\t\t\tclmTracker.draw(canvas, undefined, undefined, true);\n\t\t\t}\n\t\t}\n\t\tif (debugTimeTravel) {\n\t\t\tctx.save();\n\t\t\tctx.globalAlpha = 0.8;\n\t\t\tctx.drawImage(debugFramesCanvas, 0, 0);\n\t\t\tctx.restore();\n\t\t\tctx.drawImage(debugPointsCanvas, 0, 0);\n\t\t}\n\t\tctx.fillStyle = \"lime\";\n\t\tmainOops.draw(ctx);\n\t\tdebugPointsCtx.fillStyle = \"green\";\n\t\tmainOops.draw(debugPointsCtx);\n\n\t\tif (update) {\n\t\t\tvar [movementX, movementY] = mainOops.getMovement();\n\n\t\t\t// Acceleration curves add a lot of stability,\n\t\t\t// letting you focus on a specific point without jitter, but still move quickly.\n\n\t\t\t// var accelerate = (delta, distance) => (delta / 10) * (distance ** 0.8);\n\t\t\t// var accelerate = (delta, distance) => (delta / 1) * (Math.abs(delta) ** 0.8);\n\t\t\tvar accelerate = (delta, _distance) => (delta / 1) * (Math.abs(delta * 5) ** acceleration);\n\n\t\t\tvar distance = Math.hypot(movementX, movementY);\n\t\t\tvar deltaX = accelerate(movementX * sensitivityX, distance);\n\t\t\tvar deltaY = accelerate(movementY * sensitivityY, distance);\n\n\t\t\tif (debugAcceleration) {\n\t\t\t\tconst graphWidth = 200;\n\t\t\t\tconst graphHeight = 150;\n\t\t\t\tconst graphMaxInput = 0.2;\n\t\t\t\tconst graphMaxOutput = 0.4;\n\t\t\t\tconst highlightInputRange = 0.01;\n\t\t\t\tctx.save();\n\t\t\t\tctx.fillStyle = \"black\";\n\t\t\t\tctx.fillRect(0, 0, graphWidth, graphHeight);\n\t\t\t\tconst highlightInput = movementX * sensitivityX;\n\t\t\t\tfor (let x = 0; x < graphWidth; x++) {\n\t\t\t\t\tconst input = x / graphWidth * graphMaxInput;\n\t\t\t\t\tconst output = accelerate(input, input);\n\t\t\t\t\tconst y = output / graphMaxOutput * graphHeight;\n\t\t\t\t\t// ctx.fillStyle = Math.abs(y - deltaX) < 1 ? \"yellow\" : \"lime\";\n\t\t\t\t\tconst highlight = Math.abs(Math.abs(input) - Math.abs(highlightInput)) < highlightInputRange;\n\t\t\t\t\tif (highlight) {\n\t\t\t\t\t\tctx.fillStyle = \"rgba(255, 255, 0, 0.3)\";\n\t\t\t\t\t\tctx.fillRect(x, 0, 1, graphHeight);\n\t\t\t\t\t}\n\t\t\t\t\tctx.fillStyle = highlight ? \"yellow\" : \"lime\";\n\t\t\t\t\tctx.fillRect(x, graphHeight - y, 1, y);\n\t\t\t\t}\n\t\t\t\tctx.restore();\n\t\t\t}\n\n\t\t\t// This should never happen\n\t\t\tif (!isFinite(deltaX) || !isFinite(deltaY)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!paused) {\n\t\t\t\tconst screenWidth = window.electronAPI ? screen.width : innerWidth;\n\t\t\t\tconst screenHeight = window.electronAPI ? screen.height : innerHeight;\n\n\t\t\t\tmouseX -= deltaX * screenWidth;\n\t\t\t\tmouseY += deltaY * screenHeight;\n\n\t\t\t\tmouseX = Math.min(Math.max(0, mouseX), screenWidth);\n\t\t\t\tmouseY = Math.min(Math.max(0, mouseY), screenHeight);\n\n\t\t\t\tif (mouseNeedsInitPos) {\n\t\t\t\t\t// TODO: option to get preexisting mouse position instead of set it to center of screen\n\t\t\t\t\tmouseX = screenWidth / 2;\n\t\t\t\t\tmouseY = screenHeight / 2;\n\t\t\t\t\tmouseNeedsInitPos = false;\n\t\t\t\t}\n\t\t\t\tif (window.electronAPI) {\n\t\t\t\t\twindow.electronAPI.moveMouse(~~mouseX, ~~mouseY);\n\t\t\t\t\tpointerEl.style.display = \"none\";\n\t\t\t\t} else {\n\t\t\t\t\tpointerEl.style.display = \"\";\n\t\t\t\t\tpointerEl.style.left = `${mouseX}px`;\n\t\t\t\t\tpointerEl.style.top = `${mouseY}px`;\n\t\t\t\t}\n\t\t\t\tif (TrackyMouse.onPointerMove) {\n\t\t\t\t\tTrackyMouse.onPointerMove(mouseX, mouseY);\n\t\t\t\t}\n\t\t\t}\n\t\t\tprevMovementX = movementX;\n\t\t\tprevMovementY = movementY;\n\t\t\t// movementXSinceFacemeshUpdate += movementX;\n\t\t\t// movementYSinceFacemeshUpdate += movementY;\n\t\t\t/*\n\t\t\tif (enableTimeTravel) {\n\t\t\t\tif (facemeshEstimating) {\n\t\t\t\t\tconst imageData = getCameraImageData();\n\t\t\t\t\tif (imageData) {\n\t\t\t\t\t\tcameraFramesSinceFacemeshUpdate.push(imageData);\n\t\t\t\t\t}\n\t\t\t\t\t// limit this buffer size in case something goes wrong\n\t\t\t\t\tif (cameraFramesSinceFacemeshUpdate.length > 500) {\n\t\t\t\t\t\t// maybe just clear it entirely, because a partial buffer might not be useful\n\t\t\t\t\t\tcameraFramesSinceFacemeshUpdate.length = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t*/\n\t\t}\n\t\tctx.restore();\n\n\t\tif (showDebugText) {\n\t\t\tctx.save();\n\t\t\tctx.fillStyle = \"#fff\";\n\t\t\tctx.strokeStyle = \"#000\";\n\t\t\tctx.lineWidth = 3;\n\t\t\tctx.font = \"20px sans-serif\";\n\t\t\tctx.beginPath();\n\t\t\tconst text3 = \"Face convergence score: \" + ((useFacemesh && facemeshPrediction) ? \"N/A\" : faceConvergence.toFixed(4));\n\t\t\tconst text1 = \"Face tracking score: \" + ((useFacemesh && facemeshPrediction) ? facemeshPrediction.faceInViewConfidence : faceScore).toFixed(4);\n\t\t\tconst text2 = \"Points based on score: \" + ((useFacemesh && facemeshPrediction) ? pointsBasedOnFaceInViewConfidence : pointsBasedOnFaceScore).toFixed(4);\n\t\t\tctx.strokeText(text1, 50, 50);\n\t\t\tctx.fillText(text1, 50, 50);\n\t\t\tctx.strokeText(text2, 50, 70);\n\t\t\tctx.fillText(text2, 50, 70);\n\t\t\tctx.strokeText(text3, 50, 170);\n\t\t\tctx.fillText(text3, 50, 170);\n\t\t\tctx.fillStyle = \"lime\";\n\t\t\tctx.fillRect(0, 150, faceConvergence, 5);\n\t\t\tctx.fillRect(0, 0, faceScore * canvas.width, 5);\n\t\t\tctx.restore();\n\t\t}\n\t\tstats?.update();\n\t}\n\n\tfunction circle(ctx, x, y, r) {\n\t\tctx.beginPath();\n\t\tctx.arc(x, y, r, 0, Math.PI * 2);\n\t\tctx.fill();\n\t}\n\n\t// Can't use requestAnimationFrame, doesn't work with webPreferences.backgroundThrottling: false (at least in some version of Electron (v12 I think, when I tested it), on Ubuntu, with XFCE)\n\tsetInterval(function animationLoop() {\n\t\tdraw(!paused || document.visibilityState === \"visible\");\n\t}, 15);\n\n\tlet autoDemo = false;\n\ttry {\n\t\tautoDemo = localStorage.trackyMouseAutoDemo === \"true\";\n\t} catch (_error) {\n\t\t// ignore; this is just for development\n\t}\n\tif (autoDemo) {\n\t\tTrackyMouse.useDemoFootage();\n\t} else if (window.electronAPI) {\n\t\tTrackyMouse.useCamera();\n\t}\n\n\tconst updatePaused = () => {\n\t\tmouseNeedsInitPos = true;\n\t\tif (paused) {\n\t\t\tpointerEl.style.display = \"none\";\n\t\t}\n\t\tif (paused) {\n\t\t\tstartStopButton.textContent = \"Start\";\n\t\t\tstartStopButton.setAttribute(\"aria-pressed\", \"false\");\n\t\t} else {\n\t\t\tstartStopButton.textContent = \"Stop\";\n\t\t\tstartStopButton.setAttribute(\"aria-pressed\", \"true\");\n\t\t}\n\t\tif (window.electronAPI) {\n\t\t\twindow.electronAPI.notifyToggleState(!paused);\n\t\t}\n\t};\n\tconst handleShortcut = (shortcutType) => {\n\t\tif (shortcutType === \"toggle-tracking\") {\n\t\t\tpaused = !paused;\n\t\t\tupdatePaused();\n\t\t}\n\t};\n\tsettingsLoadedPromise.then(updatePaused);\n\n\t// Try to handle both the global and local shortcuts\n\t// If the global shortcut successfully registered, keydown shouldn't occur for the shortcut, right?\n\t// I hope there's no cross-platform issue with this.\n\tif (window.electronAPI) {\n\t\twindow.electronAPI.onShortcut(handleShortcut);\n\t}\n\tconst handleKeydown = (event) => {\n\t\t// Same shortcut as the global shortcut in the electron app\n\t\tif (!event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey && event.key === \"F9\") {\n\t\t\thandleShortcut(\"toggle-tracking\");\n\t\t}\n\t};\n\taddEventListener(\"keydown\", handleKeydown);\n\n\treturn {\n\t\tdispose() {\n\t\t\t// TODO: re-structure so that cleanup can succeed even if initialization fails\n\t\t\t// OOP would help with this, by storing references in an object, but it doesn't necessarily\n\t\t\t// need to be converted to a class, it could just be an object, with a try-finally used for returning the API with a `dispose` method.\n\t\t\t// Wouldn't need to change the API that way.\n\t\t\t// (Would also be easy to maintain backwards compatibility while switching to using a class,\n\t\t\t// returning an instance of the class from `TrackyMouse.init` but deprecating it in favor of constructing the class.)\n\n\t\t\t// clean up camera stream\n\t\t\tif (cameraVideo.srcObject) {\n\t\t\t\tfor (const track of cameraVideo.srcObject.getTracks()) {\n\t\t\t\t\ttrack.stop();\n\t\t\t\t}\n\t\t\t}\n\t\t\tcameraVideo.srcObject = null; // probably pointless\n\n\t\t\t// not sure this helps\n\t\t\treset();\n\t\t\t// just in case there's any async code looking at whether it's paused\n\t\t\tpaused = true;\n\n\t\t\tif (facemeshWorker) {\n\t\t\t\tfacemeshWorker.terminate();\n\t\t\t}\n\t\t\tif (clmTracker) {\n\t\t\t\t// not sure this helps clean up any resources\n\t\t\t\tclmTracker.reset();\n\t\t\t}\n\n\t\t\tpointerEl.remove();\n\n\t\t\tstats?.domElement.remove(); // there is no dispose method but this may be all that it would need to do https://github.com/mrdoob/stats.js/pull/96\n\n\t\t\tremoveEventListener(\"keydown\", handleKeydown);\n\n\t\t\t// This is a little awkward, reversing the initialization based on a possibly-preexisting element\n\t\t\t// Could save and restore innerHTML but that won't restore event listeners, references, etc.\n\t\t\t// and may not even be desired if the HTML was placeholder text mentioning it not yet being initialized for example.\n\t\t\tuiContainer.classList.remove(\"tracky-mouse-ui\");\n\t\t\tuiContainer.innerHTML = \"\";\n\t\t\tif (!div) {\n\t\t\t\tuiContainer.remove();\n\t\t\t}\n\t\t},\n\t};\n};\n\n// CommonJS export is untested. Script tag usage recommended.\n// Just including this in case it is somehow useful.\n// eslint-disable-next-line no-undef\nif (typeof module !== \"undefined\" && module.exports) {\n\t// eslint-disable-next-line no-undef\n\tmodule.exports = TrackyMouse;\n}\n"
  },
  {
    "path": "lib/tracky-mouse/cspell.json",
    "content": "{\n\t\"ignorePaths\": [\n\t\t\"node_modules\",\n\t\t\"lib\",\n\t\t\"out\",\n\t\t\"dist\",\n\t\t\"images\",\n\t\t\"CNAME\"\n\t],\n\t\"words\": [\n\t\t\"argparse\",\n\t\t\"clmtrackr\",\n\t\t\"combinatorially\",\n\t\t\"deinitialize\",\n\t\t\"Eigen\",\n\t\t\"embeddable\",\n\t\t\"eviacam\",\n\t\t\"facemesh\",\n\t\t\"firstrun\",\n\t\t\"fullscreenable\",\n\t\t\"Gameface\",\n\t\t\"grayscale\",\n\t\t\"guvcview\",\n\t\t\"handsfree\",\n\t\t\"headmouse\",\n\t\t\"imgproc\",\n\t\t\"isaiahodhner\",\n\t\t\"jsfeat\",\n\t\t\"jspaint\",\n\t\t\"Kanade\",\n\t\t\"keyshortcuts\",\n\t\t\"lsusb\",\n\t\t\"maximizable\",\n\t\t\"metaprogramming\",\n\t\t\"metavar\",\n\t\t\"minimizable\",\n\t\t\"MSIE\",\n\t\t\"nargs\",\n\t\t\"noprofile\",\n\t\t\"occluder\",\n\t\t\"occluders\",\n\t\t\"Odhner\",\n\t\t\"playsinline\",\n\t\t\"pointerdown\",\n\t\t\"pointerenter\",\n\t\t\"pointerleave\",\n\t\t\"pointermove\",\n\t\t\"retarget\",\n\t\t\"retargeted\",\n\t\t\"setx\",\n\t\t\"Setx\",\n\t\t\"SLOWMO\",\n\t\t\"Takeback\",\n\t\t\"tfjs\",\n\t\t\"timespan\",\n\t\t\"titlebar\",\n\t\t\"togglefullscreen\",\n\t\t\"tracky\",\n\t\t\"uninstallation\",\n\t\t\"unpackaged\",\n\t\t\"Viacam\",\n\t\t\"XFCE\"\n\t]\n}\n"
  },
  {
    "path": "lib/tracky-mouse/desktop-app/forge.config.js",
    "content": "const sharedDebRpmOptions = {\n\tname: \"tracky-mouse\",\n\tproductName: \"Tracky Mouse\",\n\tproductDescription: \"Hands-free mouse control\",\n\tgenericName: \"Facial Mouse\",\n\thomepage: \"https://trackymouse.js.org/\",\n\ticon: \"images/tracky-mouse-logo-512.png\",\n\tcategories: [\n\t\t\"Utility\",\n\t],\n\tmimeType: [\n\t\t// Affects whether the app shows as a recommended app in the \"Open With\" menu/dialog.\n\t\t// Not sure if this would be useful for a config file format, or only standard file formats.\n\t\t// \"application/x-tracky-mouse\",\n\t],\n};\nmodule.exports = {\n\tpackagerConfig: {\n\t\ticon: \"./images/tracky-mouse-logo\",\n\t\tname: \"Tracky Mouse\",\n\t\texecutableName: \"tracky-mouse\",\n\t\tappBundleId: \"io.isaiahodhner.tracky-mouse\",\n\t\tappCategoryType: \"public.app-category.utilities\",\n\t\tappCopyright: \"© 2024 Isaiah Odhner\",\n\t\tjunk: true,\n\t\t// TODO: assess filtering of files; check node_modules to make sure prune is working\n\t\tignore: [\n\t\t\t\".history\", // VS Code \"Local History\" extension\n\t\t\t// TODO: organize image files so I can ignore most of them\n\t\t\t// Maybe add a custom lint script to check that no images are being used by the app\n\t\t\t// that won't be packaged, and that all images are being used\n\t\t],\n\t\t// TODO: maybe\n\t\t// https://electron.github.io/packager/main/interfaces/Options.html#darwinDarkModeSupport\n\t},\n\tmakers: [\n\t\t{\n\t\t\tname: \"@electron-forge/maker-squirrel\",\n\t\t\tconfig: {\n\t\t\t\tname: \"tracky-mouse\",\n\t\t\t\texe: \"tracky-mouse.exe\",\n\t\t\t\ttitle: \"Tracky Mouse\",\n\t\t\t\tdescription: \"Hands-free mouse control\",\n\t\t\t\ticonUrl: \"https://raw.githubusercontent.com/1j01/tracky-mouse/4f22321a3f65ecf66d0a9ed431a24a76d547ea4c/images/tracky-mouse-logo-512.png\",\n\t\t\t\tsetupIcon: \"./images/tracky-mouse-logo.ico\",\n\t\t\t\t// loadingGif: \"images/install.gif\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"@electron-forge/maker-zip\",\n\t\t\tplatforms: [\n\t\t\t\t\"darwin\",  // macOS uses a .zip, which may be automatically extracted when opened\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tname: \"@electron-forge/maker-deb\",\n\t\t\tconfig: {\n\t\t\t\toptions: {\n\t\t\t\t\t...sharedDebRpmOptions,\n\t\t\t\t\tsection: \"utils\",\n\t\t\t\t\tmaintainer: \"Isaiah Odhner <isaiahodhner@gmail.com>\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"@electron-forge/maker-rpm\",\n\t\t\tconfig: {\n\t\t\t\toptions: {\n\t\t\t\t\t...sharedDebRpmOptions,\n\t\t\t\t\tlicense: \"MIT\",\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\t],\n\tpublishers: [\n\t\t{\n\t\t\tname: '@electron-forge/publisher-github',\n\t\t\tconfig: {\n\t\t\t\trepository: {\n\t\t\t\t\towner: '1j01',\n\t\t\t\t\tname: 'tracky-mouse'\n\t\t\t\t},\n\t\t\t\tprerelease: false,\n\t\t\t\tdraft: true,\n\t\t\t}\n\t\t}\n\t],\n};\n"
  },
  {
    "path": "lib/tracky-mouse/desktop-app/package.json",
    "content": "{\n  \"name\": \"tracky-mouse-electron\",\n  \"productName\": \"Tracky Mouse\",\n  \"version\": \"1.2.0\",\n  \"description\": \"Control your computer with your head movements\",\n  \"license\": \"MIT\",\n  \"author\": {\n    \"name\": \"Isaiah Odhner\",\n    \"email\": \"isaiahodhner@gmail.com\",\n    \"url\": \"https://isaiahodhner.io\"\n  },\n  \"keywords\": [\n    \"camera-mouse\",\n    \"mouse\",\n    \"camera\",\n    \"webcam\",\n    \"head-tracker\",\n    \"head-tracking\",\n    \"face-tracker\",\n    \"face-tracking\",\n    \"headmouse\",\n    \"facial-mouse\",\n    \"accessibility\",\n    \"cursor\",\n    \"pointer\",\n    \"pointing\",\n    \"input-method\",\n    \"hands-free\",\n    \"handsfree\",\n    \"desktop-automation\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/1j01/tracky-mouse.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/1j01/tracky-mouse/issues\"\n  },\n  \"homepage\": \"https://trackymouse.js.org/\",\n  \"main\": \"src/electron-main/electron-main.js\",\n  \"scripts\": {\n    \"start\": \"electron-forge start\",\n    \"package\": \"electron-forge package\",\n    \"make\": \"electron-forge make\",\n    \"publish\": \"env-cmd electron-forge publish\"\n  },\n  \"dependencies\": {\n    \"about-window\": \"^1.15.2\",\n    \"argparse\": \"^2.0.1\",\n    \"electron-window-state\": \"^5.0.3\",\n    \"fs-plus\": \"^3.1.1\",\n    \"serenade-driver\": \"^1.1.13\",\n    \"tracky-mouse\": \"file:../core\"\n  },\n  \"devDependencies\": {\n    \"@electron-forge/cli\": \"7.4.0\",\n    \"@electron-forge/maker-deb\": \"7.4.0\",\n    \"@electron-forge/maker-rpm\": \"7.4.0\",\n    \"@electron-forge/maker-squirrel\": \"7.4.0\",\n    \"@electron-forge/maker-zip\": \"7.4.0\",\n    \"@electron-forge/publisher-github\": \"7.4.0\",\n    \"electron\": \"20.0.1\",\n    \"env-cmd\": \"^10.1.0\"\n  }\n}\n"
  },
  {
    "path": "lib/tracky-mouse/desktop-app/src/electron-app.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"UTF-8\">\n\t<meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'self' 'unsafe-inline' blob:\">\n\t<title>Tracky Mouse</title>\n\t<script src=\"../node_modules/tracky-mouse/lib/stats.js\"></script>\n\t<script src=\"../node_modules/tracky-mouse/lib/no-eval.js\"></script>\n\t<script src=\"../node_modules/tracky-mouse/lib/clmtrackr.js\"></script>\n\t<!-- <script src=\"../node_modules/tracky-mouse/lib/jsfeat-min.js\"></script> exported from patched clmtrackr.js -->\n\t<style>\n\t\tbody {\n\t\t\tbackground-color: white;\n\t\t\tcolor: black;\n\t\t}\n\n\t\t@media (prefers-color-scheme: dark) {\n\t\t\tbody {\n\t\t\t\tbackground-color: black;\n\t\t\t\tcolor: white;\n\t\t\t}\n\n\t\t\ta:link {\n\t\t\t\tcolor: aquamarine;\n\t\t\t}\n\n\t\t\ta:visited {\n\t\t\t\tcolor: rgb(197, 127, 255);\n\t\t\t}\n\t\t}\n\n\t\thtml,\n\t\tbody,\n\t\t.tracky-mouse-ui {\n\t\t\tmargin: 0;\n\t\t\tpadding: 0;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\toverflow: hidden;\n\t\t\t/* Don't need min height when height of the container is 100%,\n\t\t\tand don't want it because it can make the camera view get pushed\n\t\t\toff-screen, making the media query's breakpoint highly dependent\n\t\t\ton the UI. Without a min height, it's flexible, it's just a matter\n\t\t\tof how small the camera view gets. If the settings take up a lot of\n\t\t\theight, it might shrink to nothing, but it'll never get cut off. */\n\t\t\t--tracky-mouse-camera-view-min-height: 0;\n\t\t}\n\n\t\t@media screen and (max-height: 500px) {\n\n\t\t\t/* TODO: provide modal access to settings when window is small,\n\t\t\ti.e. a button that shows the settings over/replacing the camera feed.\n\t\t\tright now, this hides the settings and there's no indication that they exist */\n\t\t\t.tracky-mouse-controls {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\n\t\t\t.tracky-mouse-ui.tracky-mouse-ui {\n\t\t\t\tpadding: 0;\n\t\t\t\t--tracky-mouse-camera-view-min-height: 0;\n\t\t\t}\n\t\t}\n\t</style>\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../node_modules/tracky-mouse/tracky-mouse.css\">\n\t<link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"images/tracky-mouse-logo-16.png\">\n\t<link rel=\"icon\" type=\"image/png\" sizes=\"512x512\" href=\"images/tracky-mouse-logo-512.png\">\n</head>\n\n<body>\n\t<script src=\"../node_modules/tracky-mouse/tracky-mouse.js\"></script>\n\t<script>\n\t\tTrackyMouse.dependenciesRoot = \"../node_modules/tracky-mouse\";\n\t\tTrackyMouse.init();\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "lib/tracky-mouse/desktop-app/src/electron-main/cli.js",
    "content": "const { ArgumentParser, SUPPRESS /*, RawDescriptionHelpFormatter*/ } = require(\"argparse\");\n\nconst parser = new ArgumentParser({\n\tprog: \"tracky-mouse\",\n\tdescription: \"Control your mouse hands-free. This CLI controls the running Tracky Mouse app. It's meant for external programs like a voice command system to toggle Tracky Mouse and adjust settings on the fly.\",\n\t// \tepilog: `Configuration Options (for use with --set, --adjust, and --get):\n\t// - \"startEnabled\"              default: false  controls whether head tracking is enabled when the app starts.\n\t// - \"runAtLogin\"                default: false  controls whether the app starts when you log in.\n\t// - \"swapMouseButtons\"          default: false  swaps the left and right mouse buttons. Should be synced with the system setting in order for the dwell clicker to trigger primary clicks.\n\t// - \"mirrorCameraView\"          default: true   mirrors the camera view horizontally.\n\t// - \"headTrackingSensitivityX\"  default: 0.025  controls how much the mouse moves horizontally in response to head movement.\n\t// - \"headTrackingSensitivityY\"  default: 0.050  controls how much the mouse moves vertically in response to head movement.\n\t// - \"headTrackingAcceleration\"  default: 0.5    controls smoothness of mouse movement; 0 is linear, 1 is smoothest.\n\t// - \"dwellTime\"                 default: 0.5    controls how long the mouse must be over a point before a click is registered.\n\t// - \"restOnStartup\"             default: 1500   non-clicking period after starting the app\n\t// - \"restOnRelease\"             default: 1000   non-clicking period after click or release of a drag (from dwell clicker or otherwise)\n\t// - \"restOnWithdrawal\"          default: ?      non-clicking period after dwell click is canceled by moving away from the target\n\t// - \"restOnOcclusion\"           default: 1000   non-clicking period after a dwell click is canceled due something popping up in front, or existing in front at the center of, the target\n\t// - \"restOnAppSwitch\"           default: 1000   non-clicking period after switching to a different app\n\t// `,\n\t// Without this, the epilog's line breaks are ignored!\n\t// However, this might not be a good general solution, since it could break the formatting of other help text.\n\t// formatter_class: RawDescriptionHelpFormatter,\n});\n\n// Should this support loading by name or by file path? Should it have two separate options?\n// parser.add_argument(\"--profile\", {\n// \thelp: \"The settings profile to use.\",\n// \tnargs: 1,\n// \tmetavar: \"PROFILE\",\n// });\n\n// parser.add_argument(\"--set\", {\n// \thelp: \"Change an option to a particular value. (Also outputs the new value, which may be constrained to some limits.)\",\n// \tnargs: 2,\n// \tmetavar: [\"OPTION\", \"VALUE\"],\n// \taction: \"append\",\n// });\n\n// parser.add_argument(\"--adjust\", {\n// \thelp: \"Adjust an option by an amount relative to its current value. (Also outputs the new value, which may be constrained to some limits.)\",\n// \tnargs: 2,\n// \tmetavar: [\"OPTION\", \"DELTA\"],\n// \taction: \"append\",\n// });\n\n// parser.add_argument(\"--get\", {\n// \thelp: \"Outputs the current value of an option.\",\n// \tnargs: 1,\n// \tmetavar: \"OPTION\",\n// \taction: \"append\",\n// });\n\n// TODO: Need to decide how to handle toggling mouse movement vs dwell clicking...\nparser.add_argument(\"--start\", {\n\thelp: \"Start head tracking.\",\n\taction: \"store_true\",\n});\n\nparser.add_argument(\"--stop\", {\n\thelp: \"Stop head tracking.\",\n\taction: \"store_true\",\n});\n\nparser.add_argument(\"-v\", \"--version\", {\n\t// action: \"version\",\n\t// version: require(\"../../package.json\").version,\n\thelp: \"Show the version number.\",\n\taction: \"store_true\",\n});\n\n// Squirrel.Windows passes \"--squirrel-firstrun\" when the app is first run after being installed.\n// This could be used to show a \"Thanks for installing\" message or similar, but it needs to at least be handled so that it doesn't cause an error.\n// We can hide it from the help since it's not a useful option.\nparser.add_argument(\"--squirrel-firstrun\", {\n\thelp: SUPPRESS,\n\taction: \"store_true\",\n});\n\n// Other Squirrel.Windows event arguments are currently handled separately in squirrel-update.js, but could make use of the argparse CLI, alternatively.\n\n// parser.add_argument(\"--squirrel-uninstall\", {\n// \thelp: SUPPRESS,\n// \taction: \"store_true\",\n// });\n\n// parser.add_argument(\"--squirrel-install\", {\n// \thelp: SUPPRESS,\n// \taction: \"store_true\",\n// });\n\n// parser.add_argument(\"--squirrel-updated\", {\n// \thelp: SUPPRESS,\n// \taction: \"store_true\",\n// });\n\n// parser.add_argument(\"--squirrel-obsolete\", {\n// \thelp: SUPPRESS,\n// \taction: \"store_true\",\n// });\n\nmodule.exports.parser = parser;\n"
  },
  {
    "path": "lib/tracky-mouse/desktop-app/src/electron-main/electron-main.js",
    "content": "\n// Note: Don't require any third-party (or own) modules until after squirrel events are handled.\n// If anything goes wrong, it's very bad for it to go wrong during installation and uninstallation!\nconst { app, globalShortcut, dialog, BrowserWindow, ipcMain } = require('electron');\nconst path = require('path');\nconst fs = require('fs/promises');\nconst { handleStartupEvent } = require('./squirrel-update.js');\n\n// TODO: is there any merit to app.quit when there are no windows open?\n\n// Needed for run-at-login on Windows. This is used as the registry key name.\n// Needs to be set early since `setLoginItemSettings` is used in the `--squirrel-uninstall` handler.\napp.setAppUserModelId(\"io.isaiahodhner.tracky-mouse\");\n\n// Handle installing/uninstalling shortcuts and the CLI's PATH modification on Windows.\nif (process.platform === 'win32') {\n\tconst possibleSquirrelEventFlag = process.argv[1];\n\tif (handleStartupEvent(possibleSquirrelEventFlag)) {\n\t\treturn;\n\t}\n}\n\n// From this point on, third party modules can be required now without risking interfering with the installer.\n\nconst { parser } = require('./cli.js');\nconst { getVersion } = require('./version.js');\n\n// Compare command line arguments:\n// - unpackaged (in development):      \"path/to/electron.exe\" \".\" \"maybe/a/file.png\"\n// - packaged (usually in production): \"path/to/jspaint.exe\" \"maybe/a/file.png\"\nconst { isPackaged } = app;\nconst argsArray = process.argv.slice(isPackaged ? 1 : 2);\n// Note: this may exit the app, if the user runs `tracky-mouse --help`.\nconst args = parser.parse_args(argsArray);\n\n// After argument parsing that may have exited the app, handle single instance behavior.\n// Electron provides a way to communicate between instances of the app,\n// using a lock file to determine if the process is the primary instance.\n// However, it only provides communication in one direction\n// (from the second instance to the primary instance, via the \"second-instance\" event),\n// so we have to implement communication the other way ourselves.\n\n// This is used to communicate the output of a CLI command from the existing instance to the new instance.\n// Could use an in-memory pipe, or HTTP, but this may be the simplest way.\nconst tempFilePath = path.join(app.getPath('temp'), `tracky-mouse-cli-output-${Date.now()}.txt`);\n\n// Note: The \"second-instance\" event has an `argv` argument but it's unusably broken,\n// and the documented workaround is to pass the arguments as `additionalData` here.\n// https://www.electronjs.org/docs/api/app#event-second-instance\nconst gotSingleInstanceLock = app.requestSingleInstanceLock({\n\t// WARNING: key order and key length can cause this bug to crop up: https://github.com/electron/electron/issues/40615\n\t// For instance, naming this key \"argv\" instead of \"arguments\" can cause `additionalData` to be null when no arguments are passed.\n\targuments: argsArray,\n\ttempFilePath,\n});\n\n// Note: If the main process crashes during the \"second-instance\" event, the second instance will get the lock,\n// even if the first instance is still showing an error dialog.\nif (!gotSingleInstanceLock) {\n\t// console.log(\"Already running. Opening in existing instance.\");\n\n\tif (args.version) {\n\t\t// Special handling for --version: show versions of both instances.\n\t\t// TODO: might want to ditch the streaming below and read the whole file in order to COMPARE the versions,\n\t\t// and only show the version of the existing instance if it's different.\n\t\t// Or to format it differently. Right now it's constrained to outputting the existing instance as the last line.\n\t\t// Alternatively, I could pass the version into requestSingleInstanceLock (only if --version is passed, since it requires executing a git command),\n\t\t// and format the output in the existing instance's \"second-instance\" handler.\n\t\t// That would probably be cleaner, although it would be worse for error handling.\n\t\tconsole.log(\"CLI version:\", getVersion());\n\t\tprocess.stdout.write(\"Running app's version: \"); // avoid newline which would be added by console.log\n\t}\n\n\t// Proxy the output from the existing instance to the CLI command.\n\t(async () => {\n\t\tsetTimeout(() => {\n\t\t\tif (args.version) {\n\t\t\t\tconsole.log(\"unknown\");\n\t\t\t}\n\t\t\tconsole.error(\"Timed out waiting for file to exist:\", tempFilePath);\n\t\t\tconsole.error(\"The already-running app is meant to write to this file with the output for the CLI command.\");\n\t\t\tconsole.error(\"However, the app may have crashed or hung, or there may be a bug in the communication code.\");\n\t\t\tapp.exit(1);\n\t\t}, 10000);\n\n\t\t// Wait for file to exist.\n\t\t// (It may exist already, but we can't assume that.)\n\t\tconst waitFor = (fn) => new Promise((resolve) => {\n\t\t\tconst interval = setInterval(async () => {\n\t\t\t\tconst result = await fn();\n\t\t\t\tif (result) {\n\t\t\t\t\tclearInterval(interval);\n\t\t\t\t\tresolve(result);\n\t\t\t\t}\n\t\t\t}, 100);\n\t\t});\n\t\tawait waitFor(async () => fs.stat(tempFilePath).catch(() => null));\n\t\t// Stream the file to the new instance.\n\t\t// Note that this only avoids race conditions because the file is fully written before it's renamed and seen.\n\t\t// So using streaming here is not super meaningful.\n\t\t// (One could tail the file, but that would be more complex and I'm not sure you'd be able to tell when the file is closed without a sentinel value to mark the end of the stream.)\n\t\tconst stream = require('fs').createReadStream(tempFilePath);\n\t\tstream.pipe(process.stdout);\n\t\tstream.on('close', () => {\n\t\t\t// Extra temp files will also be cleaned up on app startup, in case something goes wrong here.\n\t\t\tfs.unlink(tempFilePath).catch((error) => {\n\t\t\t\tconsole.error(\"Error deleting temp file:\", error);\n\t\t\t}).finally(() => {\n\t\t\t\tapp.quit();\n\t\t\t});\n\t\t});\n\t\tstream.on('error', (error) => {\n\t\t\tconsole.error(\"file stream error:\", error);\n\t\t\tapp.quit();\n\t\t});\n\t})();\n\n\t// app.quit();\n\t// `app.quit` does not immediately exit the process.\n\t// Return to avoid errors / main window briefly appearing.\n\t//   [52128:0304/194956.188:ERROR:cache_util_win.cc(20)] Unable to move the cache: Access is denied. (0x5)\n\t//   [52128:0304/194956.189:ERROR:cache_util.cc(145)] Unable to move cache folder C:\\Users\\Isaiah\\AppData\\Roaming\\Electron\\GPUCache to C:\\Users\\Isaiah\\AppData\\Roaming\\Electron\\old_GPUCache_000\n\t//   [52128:0304/194956.189:ERROR:disk_cache.cc(196)] Unable to create cache\n\t//   [52128:0304/194956.189:ERROR:shader_disk_cache.cc(613)] Shader Cache Creation failed: -2\n\treturn;\n} else {\n\t// console.log(\"Got single instance lock.\");\n\t// When a second instance is opened, the \"second-instance\" event will be emitted in the this instance.\n\t// See handler below.\n}\n\n// Clean up temp files from previous runs.\n// Only do this if the lock is acquired, so that multiple \"second instances\" can be handled in parallel, theoretically.\n// (Otherwise one instance could delete the file before another instance reads it.)\n// TODO: switch to a more inherently ephemeral communication method, like a pipe or a socket.\n(async () => {\n\ttry {\n\t\tfor (const file of await fs.readdir(app.getPath('temp'))) {\n\t\t\tif (file.startsWith(\"tracky-mouse-cli-output-\")) {\n\t\t\t\tawait fs.unlink(path.join(app.getPath('temp'), file));\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\tconsole.error(\"Error during temp file cleanup:\", error);\n\t}\n})();\n\n// Handle --version in the basic case where the app is not already running.\nif (args.version) {\n\tconsole.log(getVersion());\n\tapp.quit();\n\treturn;\n}\n\n// Exit for arguments that are not supported when the app is not already running.\n// Some or all of these could be supported in the future.\n// `--profile` seems useful; `--adjust` not so much.\nconst secondInstanceOnlyArgs = [\"profile\", \"adjust\", \"set\", \"get\", \"start\", \"stop\"];\nif (secondInstanceOnlyArgs.some(arg => args[arg])) {\n\tconst badArgs = secondInstanceOnlyArgs.filter(arg => args[arg]);\n\tconst badArgsString = badArgs.map(arg => `--${arg}`).join(\", \");\n\tif (badArgs.length === 1) {\n\t\tconsole.log(`The argument ${badArgsString} is only supported when the app is already running.`);\n\t} else {\n\t\tconsole.log(`These arguments are only supported when the app is already running: ${badArgsString}.`);\n\t}\n\tconsole.log(\"If you have a use case, please let me know by opening an issue at https://github.com/1j01/tracky-mouse/issues/new or sending an email to isaiahodhner@gmail.com\");\n\tapp.quit();\n\treturn;\n}\n\n// Normal app behavior continues here.\n\nconst windowStateKeeper = require('electron-window-state');\nconst { setMouseLocation: setMouseLocationWithoutTracking, getMouseLocation, click } = require('serenade-driver');\n\nrequire(\"./menus.js\"); //({ loadSettings });\n\n// Allow recovering from WebGL crash unlimited times.\n// (To test the recovery, I've been using Ctrl+Alt+F1 and Ctrl+Alt+F2 in Ubuntu.\n// Note, if Ctrl + Alt + F2 doesn't get you back, try Ctrl+Alt+F7.)\napp.commandLine.appendSwitch(\"--disable-gpu-process-crash-limit\");\n\n// Settings\n// (actual defaults come from the HTML template)\nlet swapMouseButtons = undefined; // for left-handed users on Windows, where serenade-driver is affected by the system setting\nlet mirror = undefined;\nlet sensitivityX = undefined;\nlet sensitivityY = undefined;\nlet acceleration = undefined;\nlet startEnabled = undefined;\nlet runAtLogin = undefined;\n\nlet enabled = true;\n\nconst settingsFile = path.join(app.getPath('userData'), 'tracky-mouse-settings.json');\nconst formatName = \"tracky-mouse-settings\";\nconst formatVersion = 1;\n\nasync function loadSettings() {\n\tlet data;\n\ttry {\n\t\tdata = await fs.readFile(settingsFile, 'utf8');\n\t} catch (error) {\n\t\tif (error.code === 'ENOENT') {\n\t\t\treturn;\n\t\t}\n\t\tthrow error;\n\t}\n\tconst settings = JSON.parse(data);\n\tif (settings.formatName !== formatName) {\n\t\tthrow new Error(\"Settings file format name doesn't match\");\n\t}\n\t// Upgrade settings here\n\t// e.g.:\n\t// if (settings.formatVersion === 0) {\n\t// \tsettings.formatVersion++;\n\t// \tsettings.newSettingName = settings.someOldSettingName;\n\t// \tdelete settings.someOldSettingName;\n\t// }\n\tif (settings.formatVersion < formatVersion) {\n\t\tthrow new Error(`Unsupported settings file format version. There is no upgrade path from ${settings.formatVersion} to ${formatVersion}.`);\n\t}\n\tif (settings.formatVersion > formatVersion) {\n\t\tthrow new Error(`Unsupported settings file format version (${settings.formatVersion}). This version of the app only supports up to format version ${formatVersion}.`);\n\t}\n\tdeserializeSettings(settings);\n}\nasync function saveSettings() {\n\tawait fs.writeFile(settingsFile, JSON.stringify(serializeSettings(), null, '\\t'));\n}\nfunction serializeSettings() {\n\t// TODO: DRY with serializeSettings in tracky-mouse.js\n\treturn {\n\t\tformatVersion,\n\t\tformatName,\n\t\tglobalSettings: {\n\t\t\tstartEnabled,\n\t\t\trunAtLogin,\n\t\t\tswapMouseButtons,\n\t\t\tmirrorCameraView: mirror,\n\t\t\theadTrackingSensitivityX: sensitivityX,\n\t\t\theadTrackingSensitivityY: sensitivityY,\n\t\t\theadTrackingAcceleration: acceleration,\n\t\t\t// TODO:\n\t\t\t// eyeTrackingSensitivityX,\n\t\t\t// eyeTrackingSensitivityY,\n\t\t\t// eyeTrackingAcceleration,\n\t\t},\n\t\t// profiles: [],\n\t};\n};\nfunction deserializeSettings(settings) {\n\t// TODO: DRY with deserializeSettings in tracky-mouse.js\n\t// Handles partial settings objects,\n\t// to allow manually editing the settings file, removing settings to reset them to their defaults,\n\t// as well as accepting settings updates over IPC from the UI.\n\tif (\"globalSettings\" in settings) {\n\t\t// Don't use `in` here. Must ignore `undefined` values for the settings to default to the HTML template's defaults in the Electron app.\n\t\tif (settings.globalSettings.swapMouseButtons !== undefined) {\n\t\t\tswapMouseButtons = settings.globalSettings.swapMouseButtons;\n\t\t}\n\t\tif (settings.globalSettings.mirrorCameraView !== undefined) {\n\t\t\tmirror = settings.globalSettings.mirrorCameraView;\n\t\t}\n\t\tif (settings.globalSettings.headTrackingSensitivityX !== undefined) {\n\t\t\tsensitivityX = settings.globalSettings.headTrackingSensitivityX;\n\t\t}\n\t\tif (settings.globalSettings.headTrackingSensitivityY !== undefined) {\n\t\t\tsensitivityY = settings.globalSettings.headTrackingSensitivityY;\n\t\t}\n\t\tif (settings.globalSettings.headTrackingAcceleration !== undefined) {\n\t\t\tacceleration = settings.globalSettings.headTrackingAcceleration;\n\t\t}\n\t\tif (settings.globalSettings.startEnabled !== undefined) {\n\t\t\tstartEnabled = settings.globalSettings.startEnabled;\n\t\t}\n\t\tif (settings.globalSettings.runAtLogin !== undefined) {\n\t\t\trunAtLogin = settings.globalSettings.runAtLogin;\n\t\t\tif (app.isPackaged) {\n\t\t\t\tif (process.platform === 'win32') {\n\t\t\t\t\t// Handle Squirrel installer on Windows.\n\t\t\t\t\t// It places the app in a subdirectory, with a version number, but Update.exe can be used to launch the app.\n\t\t\t\t\tconst appFolder = path.dirname(process.execPath);\n\t\t\t\t\tconst updateExe = path.resolve(appFolder, '..', 'Update.exe');\n\t\t\t\t\tconst exeName = path.basename(process.execPath);\n\n\t\t\t\t\tapp.setLoginItemSettings({\n\t\t\t\t\t\topenAtLogin: runAtLogin,\n\t\t\t\t\t\tpath: updateExe,\n\t\t\t\t\t\targs: [\n\t\t\t\t\t\t\t'--processStart', `\"${exeName}\"`,\n\t\t\t\t\t\t\t// '--process-start-args', '\"--hidden\"',\n\t\t\t\t\t\t]\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tapp.setLoginItemSettings({\n\t\t\t\t\t\topenAtLogin: runAtLogin,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// console.log(\"Ignoring runAtLogin setting because the app is not packaged.\");\n\t\t\t\t// Could maybe try to pass it arguments to run the app in development mode, but it might not be worth it.\n\t\t\t}\n\t\t}\n\t}\n}\n\n// setMouseLocation/getMouseLocation are asynchronous,\n// which means we have to be smart about detecting manual mouse movement.\n// We don't want to pause the mouse control due to head tracker based movement.\n// So instead of detecting a distance from the last mouse position,\n// we'll check against a history of positions.\n// How long should the queue be? Points could be removed when setMouseLocation resolves,\n// if and only if it's guaranteed that getMouseLocation will return the new position at that point.\n// However, a simple time limit should be fine.\nconst mousePosHistoryDuration = 5000; // in milliseconds; affects time to switch back to camera control after manual mouse movement (although maybe it shouldn't)\nconst mousePosHistory = [];\nasync function setMouseLocationTracky(x, y) {\n\tconst time = performance.now();\n\tmousePosHistory.push({ point: { x, y }, time });\n\t// Test robustness using this artificial delay:\n\t// await new Promise((resolve) => setTimeout(resolve, Math.random() * 100));\n\tawait setMouseLocationWithoutTracking(x, y);\n}\nfunction pruneMousePosHistory() {\n\tconst now = performance.now();\n\twhile (mousePosHistory[0] && now - mousePosHistory[0].time > mousePosHistoryDuration) {\n\t\tmousePosHistory.shift();\n\t}\n}\n\n\n/** @type {BrowserWindow} */\nlet appWindow;\n/** @type {BrowserWindow} */\nlet screenOverlayWindow;\n\nconst createWindow = () => {\n\tconst appWindowState = windowStateKeeper({\n\t\tdefaultWidth: 750,\n\t\tdefaultHeight: 700,\n\t});\n\n\t// Create the browser window.\n\tappWindow = new BrowserWindow({\n\t\tx: appWindowState.x,\n\t\ty: appWindowState.y,\n\t\twidth: appWindowState.width,\n\t\theight: appWindowState.height,\n\t\twebPreferences: {\n\t\t\tpreload: path.join(app.getAppPath(), 'src/preload-app-window.js'),\n\t\t\t// Disable throttling of animations and timers so the mouse control can still work when minimized.\n\t\t\tbackgroundThrottling: false,\n\t\t},\n\t\ticon: `${__dirname}/../../images/tracky-mouse-logo-512.png`,\n\t});\n\n\t// and load the html page of the app.\n\tappWindow.loadFile(`src/electron-app.html`);\n\n\t// Toggle the DevTools with F12\n\tappWindow.webContents.on(\"before-input-event\", (_e, input) => {\n\t\tif (input.type === \"keyDown\" && input.key === \"F12\") {\n\t\t\tappWindow.webContents.toggleDevTools();\n\n\t\t\tappWindow.webContents.on('devtools-opened', async () => {\n\t\t\t\t// Can't use appWindow.webContents.devToolsWebContents.on(\"before-input-event\") - it just doesn't intercept any events.\n\t\t\t\tawait appWindow.webContents.devToolsWebContents.executeJavaScript(`\n\t\t\t\t\tnew Promise((resolve)=> {\n\t\t\t\t\t\taddEventListener(\"keydown\", (event) => {\n\t\t\t\t\t\t\tif (event.key === \"F12\") {\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, { once: true });\n\t\t\t\t\t})\n\t\t\t\t`);\n\t\t\t\tappWindow.webContents.toggleDevTools();\n\t\t\t});\n\t\t}\n\t});\n\n\t// Restore window state, and listen for window state changes.\n\tappWindowState.manage(appWindow);\n\n\t// Clean up overlay when the app window is closed.\n\tappWindow.on('closed', () => {\n\t\tappWindow = null; // not needed if calling app.exit(), which exits immediately, but useful if calling other methods to quit\n\t\t// screenOverlayWindow?.close(); // doesn't work because screenOverlayWindow.closable is false\n\t\t// app.quit(); // doesn't work either, because screenOverlayWindow.closable is false\n\t\tapp.exit(); // doesn't call beforeunload and unload listeners, or before-quit or will-quit\n\t\t// Note: if re-assessing this, for macOS, make sure to handle the global shortcut, when the window doesn't exist.\n\t});\n\n\t// Expose functionality to the renderer processes.\n\n\t// Allow controlling the mouse, but pause if the mouse is moved normally.\n\tconst thresholdToRegainControl = 10; // in pixels\n\tconst regainControlForTime = 2000; // in milliseconds, AFTER the mouse hasn't moved for more than mouseMoveRequestHistoryDuration milliseconds (I think)\n\tlet regainControlTimeout = null; // also used to check if we're pausing temporarily\n\tlet cameraFeedDiagnostics = {};\n\tconst updateDwellClicking = () => {\n\t\tscreenOverlayWindow.webContents.send(\n\t\t\t'change-dwell-clicking',\n\t\t\tenabled && regainControlTimeout === null,\n\t\t\tenabled && regainControlTimeout !== null,\n\t\t\tcameraFeedDiagnostics,\n\t\t);\n\t};\n\tipcMain.on('move-mouse', async (_event, x, y, time) => {\n\t\t// TODO: consider postponing getMouseLocation, if possible, to minimize latency,\n\t\t// perhaps separating logic for pausing/resuming camera control out from the camera control itself.\n\t\tconst curPos = await getMouseLocation();\n\t\t// Assume any point in setMouseLocationHistory may be the latest that the mouse has been moved to,\n\t\t// since setMouseLocation is asynchronous,\n\t\t// or that getMouseLocation's result may be outdated and we've moved the mouse since then,\n\t\t// since getMouseLocation is asynchronous.\n\t\tpruneMousePosHistory();\n\t\tconst distances = mousePosHistory.map(({ point }) => Math.hypot(curPos.x - point.x, curPos.y - point.y));\n\t\tconst distanceMoved = distances.length ? Math.min(...distances) : 0;\n\t\t// console.log(\"distanceMoved\", distanceMoved);\n\t\tif (distanceMoved > thresholdToRegainControl) {\n\t\t\t// if (regainControlTimeout === null) {\n\t\t\t// \tconsole.log(\"mousePosHistory\", mousePosHistory);\n\t\t\t// \tconsole.log(\"distances\", distances);\n\t\t\t// \tconsole.log(\"distanceMoved\", distanceMoved, \">\", thresholdToRegainControl, \"curPos\", curPos, \"last pos\", mousePosHistory[mousePosHistory.length - 1], \"mousePosHistory.length\", mousePosHistory.length);\n\t\t\t// \tconsole.log(\"Pausing camera control due to manual mouse movement.\");\n\t\t\t// }\n\t\t\tclearTimeout(regainControlTimeout);\n\t\t\tregainControlTimeout = setTimeout(() => {\n\t\t\t\tregainControlTimeout = null; // used to check if we're pausing\n\t\t\t\t// console.log(\"Mouse not moved for\", regainControlForTime, \"ms; resuming.\");\n\t\t\t\tupdateDwellClicking();\n\t\t\t}, regainControlForTime);\n\t\t\tupdateDwellClicking();\n\t\t\t// Prevent immediately returning to manual control after switching to camera control\n\t\t\t// based on head movement while in manual control mode.\n\t\t\t// This is one of two places where we add the RETRIEVED system mouse position to `mousePosHistory`.\n\t\t\t// It may be a good idea to split `mousePosHistory` into two arrays,\n\t\t\t// say `setMouseLocationHistory` and `getMouseLocationHistory`,\n\t\t\t// in order to handle maintaining manual control differently from switching to manual control,\n\t\t\t// and/or for clarity of intent.\n\t\t\tmousePosHistory.push({ point: { x: curPos.x, y: curPos.y }, time: performance.now(), from: \"move-mouse\" });\n\t\t} else if (regainControlTimeout === null && enabled) { // (shouldn't really get this event if enabled is false)\n\t\t\t// Note: there's no await here, not necessarily for a particular reason,\n\t\t\t// although maybe it's better to send the 'move-mouse' event as soon as possible?\n\t\t\tsetMouseLocationTracky(x, y);\n\t\t}\n\t\t// const latency = performance.now() - time;\n\t\t// console.log(`move-mouse: (${x}, ${y}), latency: ${latency}, distanceMoved: ${distanceMoved}, curPos: (${curPos.x}, ${curPos.y}), lastPos: (${lastPos.x}, ${lastPos.y})`);\n\n\t\tscreenOverlayWindow.webContents.send('move-mouse', x, y, time);\n\t});\n\n\tipcMain.on('notify-toggle-state', async (_event, nowEnabled) => {\n\t\tlet initialPos;\n\t\tif (nowEnabled) { // don't rely on getMouseLocation when disabling the software\n\t\t\tinitialPos = await getMouseLocation();\n\t\t}\n\t\tenabled = nowEnabled;\n\t\tupdateDwellClicking();\n\n\t\t// Start immediately if enabled.\n\t\tclearTimeout(regainControlTimeout);\n\t\tregainControlTimeout = null;\n\t\tmousePosHistory.length = 0;\n\t\tif (nowEnabled) {\n\t\t\t// Avoid false positive for manual takeback.\n\t\t\tmousePosHistory.push({ point: { x: initialPos.x, y: initialPos.y }, time: performance.now(), from: \"notify-toggle-state\" });\n\t\t}\n\t});\n\tipcMain.on('notify-camera-feed-diagnostics', (_event, data) => {\n\t\tcameraFeedDiagnostics = data;\n\t\tupdateDwellClicking();\n\t});\n\n\n\tipcMain.on('set-options', (_event, newOptions) => {\n\t\tdeserializeSettings(newOptions);\n\t\tsaveSettings();\n\t});\n\n\tipcMain.handle('get-options', async () => {\n\t\treturn serializeSettings();\n\t});\n\n\tipcMain.handle('get-is-packaged', async () => {\n\t\treturn app.isPackaged;\n\t});\n\n\tipcMain.on('click', async (_event, x, y, _time) => {\n\t\tif (regainControlTimeout || !enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Failsafe: don't click if the window(s) are closed.\n\t\t// This helps with debugging the closing/quitting behavior.\n\t\t// It would also help to have a heartbeat to avoid clicking while paused in the debugger in other scenarios,\n\t\t// and avoid the dwell clicking indicator from repeatedly showing while there's no connectivity between the processes.\n\t\tif (\n\t\t\t(!screenOverlayWindow || screenOverlayWindow.isDestroyed()) ||\n\t\t\t(!appWindow || appWindow.isDestroyed())\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Translate coords in case of debug (doesn't matter when it's fullscreen).\n\t\tx += screenOverlayWindow.getContentBounds().x;\n\t\ty += screenOverlayWindow.getContentBounds().y;\n\n\t\tawait setMouseLocationTracky(x, y);\n\t\tawait click(swapMouseButtons ? \"right\" : \"left\");\n\n\t\t// const latency = performance.now() - time;\n\t\t// console.log(`click: ${x}, ${y}, latency: ${latency}`);\n\t});\n\n\t// Set up the screen overlay window.\n\t// We cannot require the screen module until the app is ready.\n\tconst { screen } = require('electron');\n\tconst primaryDisplay = screen.getPrimaryDisplay();\n\tscreenOverlayWindow = new BrowserWindow({\n\t\tfullscreen: true, // needed on Windows 11, since it seems to constrain the size to the work area otherwise\n\t\tx: primaryDisplay.bounds.x,\n\t\ty: primaryDisplay.bounds.y,\n\t\twidth: primaryDisplay.bounds.width,\n\t\theight: primaryDisplay.bounds.height,\n\t\tframe: false,\n\t\ttransparent: true,\n\t\tbackgroundColor: '#00000000',\n\t\thasShadow: false,\n\t\troundedCorners: false,\n\t\talwaysOnTop: true,\n\t\tresizable: false,\n\t\tmovable: false,\n\t\tminimizable: false,\n\t\tmaximizable: false,\n\t\tclosable: false,\n\t\tfocusable: false,\n\t\tskipTaskbar: true,\n\t\taccessibleTitle: 'Tracky Mouse Screen Overlay',\n\t\twebPreferences: {\n\t\t\tpreload: path.join(app.getAppPath(), 'src/preload-screen-overlay.js'),\n\t\t},\n\t});\n\tscreenOverlayWindow.setIgnoreMouseEvents(true);\n\tscreenOverlayWindow.setAlwaysOnTop(true, 'screen-saver');\n\n\tscreenOverlayWindow.loadFile(`src/electron-screen-overlay.html`);\n\tscreenOverlayWindow.on('close', (event) => {\n\t\t// If Windows Explorer is restarted while the app is running,\n\t\t// the Screen Overlay Window can appear in the taskbar, and become closable.\n\t\t// Various window attributes are forgotten, so we need to reset them.\n\t\t// A more proactive approach of restoring skipTaskbar when Windows Explorer is restarted would be better.\n\t\t// See: https://github.com/1j01/tracky-mouse/issues/47\n\t\t// And: https://github.com/electron/electron/issues/29526\n\t\tevent.preventDefault();\n\t\tscreenOverlayWindow.setSkipTaskbar(true);\n\t\tscreenOverlayWindow.setClosable(false);\n\t\tscreenOverlayWindow.setFullScreen(true);\n\t\tscreenOverlayWindow.setIgnoreMouseEvents(true);\n\t\t// \"screen-saver\" is the highest level; it should show above the taskbar.\n\t\tscreenOverlayWindow.setAlwaysOnTop(true, 'screen-saver');\n\t\t// The window isn't showing on top of the taskbar without this.\n\t\tscreenOverlayWindow.hide();\n\t\tscreenOverlayWindow.show();\n\t});\n\tscreenOverlayWindow.on('closed', () => {\n\t\tscreenOverlayWindow = null;\n\t});\n\n\t// screenOverlayWindow.webContents.openDevTools({ mode: 'detach' });\n};\n\n// This method will be called when Electron has finished\n// initialization and is ready to create browser windows.\n// Some APIs can only be used after this event occurs.\napp.on('ready', async () => {\n\ttry {\n\t\tawait loadSettings();\n\t} catch (error) {\n\t\t// TODO: copy file to a backup location, and continue with default settings\n\t\tconsole.error(\"Failed to load settings:\", error);\n\t\tdialog.showErrorBox(\"Failed to load settings\", `Failed to load settings. The app will now quit.\\n\\n${error.message}`);\n\t\tapp.quit();\n\t\treturn;\n\t}\n\tcreateWindow();\n\n\tconst success = globalShortcut.register('F9', () => {\n\t\t// console.log('Toggle tracking');\n\t\tappWindow.webContents.send(\"shortcut\", \"toggle-tracking\");\n\t});\n\tif (!success) {\n\t\tdialog.showErrorBox(\"Failed to register shortcut\", \"Failed to register global shortcut F9. You'll need to pause from within the app.\");\n\t}\n});\n\napp.on(\"second-instance\", (_event, uselessCorruptedArgv, workingDirectory, additionalData) => {\n\t// Someone tried to run a second instance, or is trying to use the tracky-mouse CLI.\n\t// If there are no arguments, we should focus the app's main window.\n\t// If there are arguments, we should handle adjusting settings for the running app.\n\n\t// Note: the \"second-instance\" event sends a broken argv which may rearrange and add extra arguments,\n\t// so we have to use the `additionalData` object, passed from `requestSingleInstanceLock`.\n\t// This hack is recommended in the docs: https://www.electronjs.org/docs/api/app#event-second-instance\n\tconsole.log(\"second-instance\", { uselessCorruptedArgv, workingDirectory, additionalData });\n\n\t// Unfortunately, it turns out `additionalData` is buggy too, and becomes null under some obscure conditions.\n\t// See https://github.com/electron/electron/issues/40615\n\tif (!additionalData) {\n\t\t// I would move this into `handleSecondInstance` and use `logToCLI`, but it won't work because `additionalData` is null.\n\t\t// logToCLI(`Command line arguments were not received by the already-running application. They are meant to be passed via additionalData, however due to a bug in Electron, additionalData === ${additionalData}. See https://github.com/electron/electron/issues/40615`);\n\t\tconsole.log(`second-instance: additionalData === ${additionalData}. See https://github.com/electron/electron/issues/40615`);\n\t\treturn;\n\t}\n\n\tfunction deliverOutputToCLI(output) {\n\t\tconsole.log(\"second-instance: Outputting to CLI:\", output);\n\n\t\t// Basic implementation\n\t\t// fs.writeFile(additionalData.tempFilePath, output)\n\t\t// \t.then(() => {\n\t\t// \t\tconsole.log(\"second-instance: Wrote output to\", additionalData.tempFilePath);\n\t\t// \t}, (error) => {\n\t\t// \t\tconsole.error(`second-instance: Failed to write output to ${additionalData.tempFilePath}:`, error);\n\t\t// \t});\n\n\t\t// Write the file in chunks to test for race conditions.\n\t\t// const stream = require('fs').createWriteStream(additionalData.tempFilePath);\n\t\t// setTimeout(() => {\n\t\t// \tstream.write(output.slice(0, Math.floor(output.length / 2)), 'utf8', () => {\n\t\t// \t\tconsole.log(\"second-instance: Wrote first chunk to\", additionalData.tempFilePath);\n\t\t// \t\tsetTimeout(() => {\n\t\t// \t\t\tstream.write(output.slice(Math.floor(output.length / 2)), 'utf8', () => {\n\t\t// \t\t\t\tconsole.log(\"second-instance: Wrote second chunk to\", additionalData.tempFilePath);\n\t\t// \t\t\t\tstream.end();\n\t\t// \t\t\t});\n\t\t// \t\t}, 2000); // Delay before writing the second chunk\n\t\t// \t});\n\t\t// }, 2000); // Delay before writing the first chunk\n\t\t// stream.on('error', (error) => {\n\t\t// \tconsole.error(`second-instance: Failed to write output to ${additionalData.tempFilePath}:`, error);\n\t\t// });\n\n\t\t// Rename the file after fully writing it to avoid race conditions.\n\t\t// Can use setTimeout to test the file polling behavior and timeout error message.\n\t\t// setTimeout(() => {\n\t\tconst tempTempFilePath = additionalData.tempFilePath + \".tmp\";\n\t\tfs.writeFile(tempTempFilePath, output)\n\t\t\t.then(() => {\n\t\t\t\tconsole.log(\"second-instance: Wrote output to\", tempTempFilePath);\n\t\t\t\tfs.rename(tempTempFilePath, additionalData.tempFilePath)\n\t\t\t\t\t.then(() => {\n\t\t\t\t\t\tconsole.log(\"second-instance: Renamed output file to\", additionalData.tempFilePath);\n\t\t\t\t\t}, (error) => {\n\t\t\t\t\t\tconsole.error(`second-instance: Failed to rename output file to ${additionalData.tempFilePath}:`, error);\n\t\t\t\t\t});\n\t\t\t}, (error) => {\n\t\t\t\tconsole.error(`second-instance: Failed to write output to ${tempTempFilePath}:`, error);\n\t\t\t});\n\t\t// }, 20000);\n\t}\n\n\t// `deliverOutputToCLI` has to be called exactly once.\n\t// If it's not called, the CLI command will show a timeout error message.\n\t// If it's called multiple times, only one output will be shown, or there might be an error renaming the file.\n\t// In order to allow many return paths in this logic, without requiring a function call before each return,\n\t// use an inner function (`handleSecondInstance`), and call `deliverOutputToCLI` at the end of the outer function.\n\tlet output = \"\";\n\tfunction logToCLI(message) {\n\t\toutput += message + \"\\n\";\n\t\t// console.log(message);\n\t}\n\tfunction handleSecondInstance() {\n\t\tconst argv = additionalData.arguments;\n\t\tif (argv.length === 0) {\n\t\t\t// TODO: DRY with `activate` event handler?\n\t\t\tif (BrowserWindow.getAllWindows().length === 0) {\n\t\t\t\tlogToCLI(\"Opening new app window in already-running application.\");\n\t\t\t\tcreateWindow();\n\t\t\t} else if (appWindow) {\n\t\t\t\tlogToCLI(\"Focusing the existing app window.\");\n\t\t\t\tif (appWindow.isMinimized()) {\n\t\t\t\t\tappWindow.restore();\n\t\t\t\t}\n\t\t\t\tappWindow.show();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst args = parser.parse_args(argv);\n\t\tconsole.log(\"second-instance: parsed args:\", args);\n\t\t// if (args.profile) {\n\t\t// \tconst filePath = path.resolve(workingDirectory, args.profile[0]);\n\t\t// \tconsole.log(\"second-instance: Opening settings profile:\", filePath);\n\t\t// }\n\t\tif (args.start || args.stop) {\n\t\t\tif (!!args.start === !!args.stop) {\n\t\t\t\tlogToCLI(\"Exactly one of --start or --stop must be provided.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!appWindow) {\n\t\t\t\t// TODO: create window if it doesn't exist (like `activate`) and make sure to start enabled\n\t\t\t\t// (but don't need to open the app for --stop)\n\t\t\t\t// (and don't focus the window if it's already open)\n\t\t\t\tlogToCLI(\"The app window is not open.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// TODO: differentiate between --start and --stop\n\t\t\tif (enabled !== !!args.start) {\n\t\t\t\tappWindow.webContents.send(\"shortcut\", \"toggle-tracking\");\n\t\t\t\tlogToCLI(`Toggled head tracking to ${enabled ? \"off\" : \"on\"}.`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlogToCLI(`Head tracking is already ${enabled ? \"on\" : \"off\"}.`);\n\t\t\treturn;\n\t\t}\n\t\tif (args.set || args.adjust || args.get || args.profile) {\n\t\t\tlogToCLI(\"Arguments not supported yet. CLI is a work in progress.\");\n\t\t\treturn;\n\t\t}\n\t\tif (args.version) {\n\t\t\t// This is special-cased to show both the CLI and running app versions.\n\t\t\t// The output from here is combined on the CLI's side.\n\t\t\tlogToCLI(getVersion());\n\t\t\treturn;\n\t\t}\n\t\t// logToCLI(\"No arguments recognized.\");\n\t\tlogToCLI(\"Happy birthday!\"); // just in case\n\t}\n\n\thandleSecondInstance();\n\tdeliverOutputToCLI(output);\n});\n\n// Quit when all windows are closed, except on macOS. There, it's common\n// for applications and their menu bar to stay active until the user quits\n// explicitly with Cmd + Q.\n// NOTE: currently exiting with app.exit()\n// If re-assessing this, for macOS, make sure to handle the global shortcut, when the window doesn't exist.\napp.on('window-all-closed', () => {\n\tif (process.platform !== 'darwin') {\n\t\tapp.quit();\n\t}\n});\n\napp.on('activate', () => {\n\t// On OS X it's common to re-create a window in the app when the\n\t// dock icon is clicked and there are no other windows open.\n\tif (BrowserWindow.getAllWindows().length === 0) {\n\t\tcreateWindow();\n\t}\n});\n"
  },
  {
    "path": "lib/tracky-mouse/desktop-app/src/electron-main/menus.js",
    "content": "const { app, dialog, Menu } = require('electron');\nconst { readFile, writeFile, copyFile } = require('fs').promises;\nconst { join } = require('path');\n\nconst isMac = process.platform === 'darwin';\n\n// let loadSettings;\n// module.exports = (dependencies) => {\n// \tloadSettings = dependencies.loadSettings;\n// };\n\n// The `about-window` module doesn't support custom version string.\n// Also it doesn't give a lot of room for the string, since it's expecting a simple format.\n// Should probably just use a custom about window.\nconst originalAppGetVersion = app.getVersion;\nconst isCalledFromModule = (moduleName) => new Error().stack.includes(require.resolve(moduleName));\napp.getVersion = () =>\n\tisCalledFromModule(\"about-window\") ?\n\t\trequire('./version').getVersion().replace(/development/, 'dev') :\n\t\toriginalAppGetVersion();\n\nconst aboutItem = {\n\tlabel: 'About Tracky Mouse',\n\tclick: async () => {\n\t\tconst openAboutWindow = require('about-window').default;\n\t\topenAboutWindow({\n\t\t\ticon_path: join(__dirname, '../../images/tracky-mouse-logo-512.png'),\n\t\t\tbug_report_url: 'https://github.com/1j01/tracky-mouse/issues',\n\t\t\thomepage: 'https://trackymouse.js.org',\n\t\t\tdescription: 'Control your computer with your webcam.',\n\t\t\tlicense: 'MIT',\n\t\t});\n\t},\n};\n// Open about window automatically for development\n// (Normally I would use a localStorage flag for this, but localStorage isn't available in the main process.)\n// setTimeout(aboutItem.click, 1000);\n\nconst template = [\n\t// { role: 'appMenu' }\n\t...(isMac\n\t\t? [{\n\t\t\tlabel: app.name,\n\t\t\tsubmenu: [\n\t\t\t\taboutItem,\n\t\t\t\t{ type: 'separator' },\n\t\t\t\t{ role: 'services' },\n\t\t\t\t{ type: 'separator' },\n\t\t\t\t{ role: 'hide' },\n\t\t\t\t{ role: 'hideOthers' },\n\t\t\t\t{ role: 'unhide' },\n\t\t\t\t{ type: 'separator' },\n\t\t\t\t{ role: 'quit' }\n\t\t\t]\n\t\t}]\n\t\t: []),\n\t// { role: 'fileMenu' }\n\t{\n\t\tlabel: 'File',\n\t\tsubmenu: [\n\t\t\t{\n\t\t\t\tlabel: 'Export Settings',\n\t\t\t\tclick: async () => {\n\t\t\t\t\tconst settingsPath = join(app.getPath('userData'), 'tracky-mouse-settings.json');\n\t\t\t\t\tconst defaultPath = join(app.getPath('documents'), 'tracky-mouse-settings.json');\n\t\t\t\t\tconst { filePath } = await dialog.showSaveDialog({\n\t\t\t\t\t\ttitle: 'Export Settings',\n\t\t\t\t\t\tbuttonLabel: 'Export',\n\t\t\t\t\t\tdefaultPath,\n\t\t\t\t\t\tfilters: [{ name: 'JSON', extensions: ['json'] }],\n\t\t\t\t\t});\n\t\t\t\t\tif (!filePath) return;\n\t\t\t\t\tawait copyFile(settingsPath, filePath);\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'Import Settings',\n\t\t\t\tclick: async () => {\n\t\t\t\t\tconst settingsPath = join(app.getPath('userData'), 'tracky-mouse-settings.json');\n\t\t\t\t\tconst defaultPath = app.getPath('documents');\n\t\t\t\t\tconst { canceled, filePaths } = await dialog.showOpenDialog({\n\t\t\t\t\t\ttitle: 'Import Settings',\n\t\t\t\t\t\tbuttonLabel: 'Import',\n\t\t\t\t\t\tdefaultPath,\n\t\t\t\t\t\tproperties: ['openFile'],\n\t\t\t\t\t\tfilters: [{ name: 'JSON', extensions: ['json'] }],\n\t\t\t\t\t});\n\t\t\t\t\tif (canceled) return;\n\t\t\t\t\tconst [filePath] = filePaths;\n\t\t\t\t\tconst json = await readFile(filePath, 'utf8');\n\t\t\t\t\t// Backup settings\n\t\t\t\t\tconst backupPath = settingsPath.replace(/\\.json$/, `-backup-${new Date().toISOString().replace(/:/g, '')}.json`);\n\t\t\t\t\tconsole.log('Copying settings to backup path:', backupPath);\n\t\t\t\t\tawait copyFile(settingsPath, backupPath);\n\t\t\t\t\t// Write settings\n\t\t\t\t\tconsole.log('Writing settings:', settingsPath);\n\t\t\t\t\tawait writeFile(settingsPath, json);\n\t\t\t\t\t// Reload settings\n\t\t\t\t\t// loadSettings(); // doesn't actually reload the settings in the app window\n\t\t\t\t\tapp.relaunch(); // overkill! TODO: apply the settings without restarting the app\n\t\t\t\t\tapp.quit(); // required for the app to actually restart\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ type: 'separator' },\n\t\t\tisMac ? { role: 'close' } : { role: 'quit' }\n\t\t]\n\t},\n\t// { role: 'editMenu' }\n\t{\n\t\tlabel: 'Edit',\n\t\tsubmenu: [\n\t\t\t{ role: 'undo' },\n\t\t\t{ role: 'redo' },\n\t\t\t{ type: 'separator' },\n\t\t\t{ role: 'cut' },\n\t\t\t{ role: 'copy' },\n\t\t\t{ role: 'paste' },\n\t\t\t...(isMac\n\t\t\t\t? [\n\t\t\t\t\t{ role: 'pasteAndMatchStyle' },\n\t\t\t\t\t{ role: 'delete' },\n\t\t\t\t\t{ role: 'selectAll' },\n\t\t\t\t\t{ type: 'separator' },\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: 'Speech',\n\t\t\t\t\t\tsubmenu: [\n\t\t\t\t\t\t\t{ role: 'startSpeaking' },\n\t\t\t\t\t\t\t{ role: 'stopSpeaking' }\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\t\t{ role: 'delete' },\n\t\t\t\t\t{ type: 'separator' },\n\t\t\t\t\t{ role: 'selectAll' }\n\t\t\t\t])\n\t\t]\n\t},\n\t// { role: 'viewMenu' }\n\t{\n\t\tlabel: 'View',\n\t\tsubmenu: [\n\t\t\t{ role: 'reload' },\n\t\t\t{ role: 'forceReload' },\n\t\t\t{ role: 'toggleDevTools' },\n\t\t\t{\n\t\t\t\tlabel: 'Toggle Developer Tools (Screen Overlay)',\n\t\t\t\tclick: async () => {\n\t\t\t\t\tconst { BrowserWindow } = require('electron');\n\t\t\t\t\t// XXX: localization hazard: relying on the untranslated window title\n\t\t\t\t\tconst screenOverlayWindow = BrowserWindow.getAllWindows().find(window => window.getTitle() === 'Tracky Mouse Screen Overlay');\n\t\t\t\t\tif (screenOverlayWindow.webContents.isDevToolsOpened()) {\n\t\t\t\t\t\tscreenOverlayWindow.webContents.closeDevTools();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tscreenOverlayWindow.webContents.openDevTools({ mode: 'detach' });\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ type: 'separator' },\n\t\t\t{ role: 'resetZoom' },\n\t\t\t{ role: 'zoomIn' },\n\t\t\t{ role: 'zoomOut' },\n\t\t\t{ type: 'separator' },\n\t\t\t{ role: 'togglefullscreen' }\n\t\t]\n\t},\n\t// { role: 'windowMenu' }\n\t{\n\t\tlabel: 'Window',\n\t\tsubmenu: [\n\t\t\t{ role: 'minimize' },\n\t\t\t{ role: 'zoom' },\n\t\t\t...(isMac\n\t\t\t\t? [\n\t\t\t\t\t{ type: 'separator' },\n\t\t\t\t\t{ role: 'front' },\n\t\t\t\t\t{ type: 'separator' },\n\t\t\t\t\t{ role: 'window' }\n\t\t\t\t]\n\t\t\t\t: [\n\t\t\t\t\t{ role: 'close' }\n\t\t\t\t])\n\t\t]\n\t},\n\t{\n\t\trole: 'help',\n\t\tsubmenu: [\n\t\t\t{\n\t\t\t\tlabel: 'Home Page',\n\t\t\t\tclick: async () => {\n\t\t\t\t\tconst { shell } = require('electron');\n\t\t\t\t\tawait shell.openExternal('https://trackymouse.js.org');\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'GitHub Repository',\n\t\t\t\tclick: async () => {\n\t\t\t\t\tconst { shell } = require('electron');\n\t\t\t\t\tawait shell.openExternal('https://github.com/1j01/tracky-mouse');\n\t\t\t\t},\n\t\t\t},\n\t\t\t...(isMac\n\t\t\t\t? [] : [\n\t\t\t\t\taboutItem,\n\t\t\t\t]\n\t\t\t),\n\t\t],\n\t}\n];\n\nconst menu = Menu.buildFromTemplate(template);\nMenu.setApplicationMenu(menu);\n"
  },
  {
    "path": "lib/tracky-mouse/desktop-app/src/electron-main/spawner.js",
    "content": "// Copyright (c) 2011-2022 GitHub Inc.\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\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nconst ChildProcess = require('child_process');\n\n// Spawn a command and invoke the callback when it completes with an error\n// and the output from standard out.\n//\n// * `command`    The underlying OS command {String} to execute.\n// * `args` (optional) The {Array} with arguments to be passed to command.\n// * `callback` (optional) The {Function} to call after the command has run. It will be invoked with arguments:\n//   * `error` (optional) An {Error} object returned by the command, `null` if no error was thrown.\n//     * `code` Error code returned by the command.\n//     * `stdout`  The {String} output text generated by the command.\n//   * `stdout`  The {String} output text generated by the command.\nexports.spawn = function (command, args, callback) {\n\tlet error;\n\tlet spawnedProcess;\n\tlet stdout = '';\n\n\ttry {\n\t\tspawnedProcess = ChildProcess.spawn(command, args);\n\t} catch (error) {\n\t\tprocess.nextTick(() => callback && callback(error, stdout));\n\t\treturn;\n\t}\n\n\tspawnedProcess.stdout.on('data', data => {\n\t\tstdout += data;\n\t});\n\tspawnedProcess.on('error', processError => {\n\t\terror = processError;\n\t});\n\tspawnedProcess.on('close', (code, signal) => {\n\t\tif (!error && code !== 0) {\n\t\t\terror = new Error(`Command failed: ${signal != null ? signal : code}`);\n\t\t}\n\n\t\tif (error) {\n\t\t\tif (error.code == null) error.code = code;\n\t\t\tif (error.stdout == null) error.stdout = stdout;\n\t\t}\n\n\t\tcallback && callback(error, stdout);\n\t});\n\n\t// This is necessary if using Powershell 2 on Windows 7 to get the events to raise\n\t// http://stackoverflow.com/questions/9155289/calling-powershell-from-nodejs\n\treturn spawnedProcess.stdin.end();\n};\n"
  },
  {
    "path": "lib/tracky-mouse/desktop-app/src/electron-main/squirrel-update.js",
    "content": "// Copyright (c) 2011-2022 GitHub Inc.\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\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nlet setxPath;\nconst { app } = require('electron');\nconst fs = require('fs-plus');\nconst path = require('path');\nconst Spawner = require('./spawner');\n// const WinShell = require('./win-shell');\nconst WinPowerShell = require('./win-powershell');\n\nconst appFolder = path.resolve(process.execPath, '..');\nconst rootTrackyMouseFolder = path.resolve(appFolder, '..');\nconst binFolder = path.join(rootTrackyMouseFolder, 'bin');\nconst updateDotExe = path.join(rootTrackyMouseFolder, 'Update.exe');\nconst execName = path.basename(app.getPath('exe'));\n\nif (process.env.SystemRoot) {\n\tconst system32Path = path.join(process.env.SystemRoot, 'System32');\n\tsetxPath = path.join(system32Path, 'setx.exe');\n} else {\n\tsetxPath = 'setx.exe';\n}\n\n// Spawn setx.exe and callback when it completes\nconst spawnSetx = (args, callback) => Spawner.spawn(setxPath, args, callback);\n\n// Spawn the Update.exe with the given arguments and invoke the callback when\n// the command completes.\nconst spawnUpdate = (args, callback) =>\n\tSpawner.spawn(updateDotExe, args, callback);\n\n// Add `tracky-mouse` to the `PATH`\n//\n// This is done by adding .cmd shims to the root bin folder in the Tracky Mouse\n// install directory that point to the newly installed versions inside\n// the versioned app directories.\nconst addCommandsToPath = callback => {\n\tconst cmdName = execName.replace('.exe', '.cmd');\n\tconst shName = execName.replace('.exe', '');\n\n\tconst installCommands = callback => {\n\t\tconst cmdPath = path.join(binFolder, cmdName);\n\t\t// const relativeCmdPath = path.relative(\n\t\t// \tbinFolder,\n\t\t// \tpath.join(appFolder, 'resources', 'cli', 'tracky-mouse.cmd')\n\t\t// );\n\t\t// const command = `@echo off\\r\\n\"%~dp0\\\\${relativeCmdPath}\" %*`;\n\t\tconst relativeExePath = path.relative(\n\t\t\tbinFolder,\n\t\t\tpath.join(appFolder, 'tracky-mouse.exe')\n\t\t);\n\t\tconst command = `@echo off\\r\\n\"%~dp0\\\\${relativeExePath}\" %*`;\n\n\t\tconst shCommandPath = path.join(binFolder, shName);\n\t\t// const relativeShPath = path.relative(\n\t\t// \tbinFolder,\n\t\t// \tpath.join(appFolder, 'resources', 'cli', 'tracky-mouse.sh')\n\t\t// );\n\t\t// const shCommand = `#!/bin/sh\\r\\n\"$(dirname \"$0\")/${relativeShPath.replace(\n\t\t// \t/\\\\/g,\n\t\t// \t'/'\n\t\t// )}\" \"$@\"\\r\\necho`;\n\t\tconst shCommand = `#!/bin/sh\\r\\n\"$(dirname \"$0\")/${relativeExePath.replace(\n\t\t\t/\\\\/g,\n\t\t\t'/'\n\t\t)}\" \"$@\"\\r\\necho`;\n\n\t\tfs.writeFile(cmdPath, command, () =>\n\t\t\tfs.writeFile(shCommandPath, shCommand, () => callback())\n\t\t);\n\t};\n\n\tconst addBinToPath = (pathSegments, callback) => {\n\t\tpathSegments.push(binFolder);\n\t\tconst newPathEnv = pathSegments.join(';');\n\t\tspawnSetx(['Path', newPathEnv], callback);\n\t};\n\n\tinstallCommands(error => {\n\t\tif (error) return callback(error);\n\n\t\tWinPowerShell.getPath((error, pathEnv) => {\n\t\t\tif (error) return callback(error);\n\n\t\t\tconst pathSegments = pathEnv\n\t\t\t\t.split(/;+/)\n\t\t\t\t.filter(pathSegment => pathSegment);\n\t\t\tif (pathSegments.indexOf(binFolder) === -1) {\n\t\t\t\taddBinToPath(pathSegments, callback);\n\t\t\t} else {\n\t\t\t\tcallback();\n\t\t\t}\n\t\t});\n\t});\n};\n\n// Remove `tracky-mouse` from the `PATH`\nconst removeCommandsFromPath = callback =>\n\tWinPowerShell.getPath((error, pathEnv) => {\n\t\tif (error != null) {\n\t\t\treturn callback(error);\n\t\t}\n\n\t\tconst pathSegments = pathEnv\n\t\t\t.split(/;+/)\n\t\t\t.filter(pathSegment => pathSegment && pathSegment !== binFolder);\n\t\tconst newPathEnv = pathSegments.join(';');\n\n\t\tif (pathEnv !== newPathEnv) {\n\t\t\treturn spawnSetx(['Path', newPathEnv], callback);\n\t\t} else {\n\t\t\treturn callback();\n\t\t}\n\t});\n\n// Create a desktop and start menu shortcut by using the command line API\n// provided by Squirrel's Update.exe\nconst createShortcuts = (locations, callback) =>\n\tspawnUpdate(\n\t\t['--createShortcut', execName, '-l', locations.join(',')],\n\t\tcallback\n\t);\n\n// Update the desktop and start menu shortcuts by using the command line API\n// provided by Squirrel's Update.exe\nconst updateShortcuts = callback => {\n\tconst homeDirectory = fs.getHomeDirectory();\n\tif (homeDirectory) {\n\t\tconst desktopShortcutPath = path.join(\n\t\t\thomeDirectory,\n\t\t\t'Desktop',\n\t\t\t`${app.getName()}.lnk`\n\t\t);\n\t\t// Check if the desktop shortcut has been previously deleted and\n\t\t// and keep it deleted if it was\n\t\tfs.exists(desktopShortcutPath, desktopShortcutExists => {\n\t\t\tconst locations = ['StartMenu'];\n\t\t\tif (desktopShortcutExists) {\n\t\t\t\tlocations.push('Desktop');\n\t\t\t}\n\n\t\t\tcreateShortcuts(locations, callback);\n\t\t});\n\t} else {\n\t\tcreateShortcuts(['Desktop', 'StartMenu'], callback);\n\t}\n};\n\n// Remove the desktop and start menu shortcuts by using the command line API\n// provided by Squirrel's Update.exe\nconst removeShortcuts = callback =>\n\tspawnUpdate(['--removeShortcut', execName], callback);\n\nexports.spawn = spawnUpdate;\n\n// Is the Update.exe installed with Tracky Mouse?\nexports.existsSync = () => fs.existsSync(updateDotExe);\n\n// Restart Tracky Mouse using the version pointed to by the tracky-mouse.cmd shim\nexports.restartTrackyMouse = () => {\n\tlet args;\n\tconst cmdName = execName.replace('.exe', '.cmd');\n\n\t// if (global.atomApplication && global.atomApplication.lastFocusedWindow) {\n\t// \tconst { projectPath } = global.atomApplication.lastFocusedWindow;\n\t// \tif (projectPath) args = [projectPath];\n\t// }\n\tSpawner.spawn(path.join(binFolder, cmdName), args);\n\tapp.quit();\n};\n\n// const updateContextMenus = callback =>\n// \tWinShell.fileContextMenu.update(() =>\n// \t\tWinShell.folderContextMenu.update(() =>\n// \t\t\tWinShell.folderBackgroundContextMenu.update(() => callback())\n// \t\t)\n// \t);\n\n// Handle squirrel events denoted by --squirrel-* command line arguments.\nexports.handleStartupEvent = squirrelCommand => {\n\tswitch (squirrelCommand) {\n\t\tcase '--squirrel-install':\n\t\t\tcreateShortcuts(['Desktop', 'StartMenu'], () =>\n\t\t\t\taddCommandsToPath(() =>\n\t\t\t\t\tapp.quit()\n\t\t\t\t\t// WinShell.fileHandler.register(() =>\n\t\t\t\t\t// \tupdateContextMenus(() => app.quit())\n\t\t\t\t\t// )\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn true;\n\t\tcase '--squirrel-updated':\n\t\t\tupdateShortcuts(() =>\n\t\t\t\taddCommandsToPath(() =>\n\t\t\t\t\tapp.quit()\n\t\t\t\t\t// WinShell.fileHandler.update(() =>\n\t\t\t\t\t// \tupdateContextMenus(() => app.quit())\n\t\t\t\t\t// )\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn true;\n\t\tcase '--squirrel-uninstall':\n\t\t\tapp.setLoginItemSettings({ openAtLogin: false });\n\t\t\tremoveShortcuts(() =>\n\t\t\t\tremoveCommandsFromPath(() =>\n\t\t\t\t\tapp.quit()\n\t\t\t\t\t// WinShell.fileHandler.deregister(() =>\n\t\t\t\t\t// \tWinShell.fileContextMenu.deregister(() =>\n\t\t\t\t\t// \t\tWinShell.folderContextMenu.deregister(() =>\n\t\t\t\t\t// \t\t\tWinShell.folderBackgroundContextMenu.deregister(() =>\n\t\t\t\t\t// \t\t\t\tapp.quit()\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\t\t\t);\n\t\t\treturn true;\n\t\tcase '--squirrel-obsolete':\n\t\t\tapp.quit();\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n"
  },
  {
    "path": "lib/tracky-mouse/desktop-app/src/electron-main/version.js",
    "content": "function getVersion() {\n\tconst isGitRepo = require('fs').existsSync(__dirname + \"/../../../.git\");\n\n\tlet version = require(\"../../package.json\").version;\n\tif (isGitRepo) {\n\t\tconst { execSync } = require('child_process');\n\t\tconst describeCommand = \"git describe --tags\";\n\t\ttry {\n\t\t\t// By default, execSync inherits stderr, but we want to capture it for a nicer error message.\n\t\t\t// (It says the default is \"pipe\", which is equivalent to [\"pipe\", \"pipe\", \"pipe\"].\n\t\t\t// But it seems to be [\"pipe\", \"pipe\", \"inherit\"] in practice.)\n\t\t\tconst describeOutput = execSync(describeCommand, { cwd: __dirname, stdio: ['pipe', 'pipe', 'pipe'] }).toString().trim();\n\t\t\tversion = \"development \" + describeOutput;\n\t\t} catch (error) {\n\t\t\tconst stderrOutput = error.stderr ? error.stderr.toString().trim() : '(No stderr output)';\n\t\t\tconsole.error(`Failed to get \\`${describeCommand}\\` output (Exit code: ${error.status ?? \"unknown\"}):\\n${stderrOutput}`);\n\t\t}\n\t}\n\treturn version;\n}\n\nexports.getVersion = getVersion;\n"
  },
  {
    "path": "lib/tracky-mouse/desktop-app/src/electron-main/win-powershell.js",
    "content": "// Copyright (c) 2011-2022 GitHub Inc.\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\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nlet powershellPath;\nconst path = require('path');\nconst Spawner = require('./spawner');\n\nif (process.env.SystemRoot) {\n\tconst system32Path = path.join(process.env.SystemRoot, 'System32');\n\tpowershellPath = path.join(\n\t\tsystem32Path,\n\t\t'WindowsPowerShell',\n\t\t'v1.0',\n\t\t'powershell.exe'\n\t);\n} else {\n\tpowershellPath = 'powershell.exe';\n}\n\n// Spawn powershell.exe and callback when it completes\nconst spawnPowershell = function (args, callback) {\n\t// Set encoding and execute the command, capture the output, and return it\n\t// via .NET's console in order to have consistent UTF-8 encoding.\n\t// See http://stackoverflow.com/questions/22349139/utf-8-output-from-powershell\n\t// to address https://github.com/atom/atom/issues/5063\n\targs[0] = `\\\n[Console]::OutputEncoding=[System.Text.Encoding]::UTF8\n$output=${args[0]}\n[Console]::WriteLine($output)\\\n`;\n\targs.unshift('-command');\n\targs.unshift('RemoteSigned');\n\targs.unshift('-ExecutionPolicy');\n\targs.unshift('-noprofile');\n\tSpawner.spawn(powershellPath, args, callback);\n};\n\n// Get the user's PATH environment variable registry value.\n//\n// * `callback` The {Function} to call after registry operation is done.\n//   It will be invoked with the same arguments provided by {Spawner.spawn}.\n//\n// Returns the user's path {String}.\nexports.getPath = callback =>\n\tspawnPowershell(\n\t\t[\"[environment]::GetEnvironmentVariable('Path','User')\"],\n\t\tfunction (error, stdout) {\n\t\t\tif (error != null) {\n\t\t\t\treturn callback(error);\n\t\t\t}\n\n\t\t\tconst pathOutput = stdout.replace(/^\\s+|\\s+$/g, '');\n\t\t\treturn callback(null, pathOutput);\n\t\t}\n\t);\n"
  },
  {
    "path": "lib/tracky-mouse/desktop-app/src/electron-screen-overlay.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"UTF-8\">\n\t<meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'self'\">\n\t<!-- XXX: localization hazard: relying on the untranslated window title for View > Toggle Developer Tools (Screen Overlay) -->\n\t<title>Tracky Mouse Screen Overlay</title>\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../node_modules/tracky-mouse/tracky-mouse.css\">\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"screen-overlay.css\">\n\t<!-- <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../images/tracky-mouse-logo-16.png\"> -->\n\t<!-- <link rel=\"icon\" type=\"image/png\" sizes=\"512x512\" href=\"../images/tracky-mouse-logo-512.png\"> -->\n</head>\n\n<body>\n\t<div class=\"tracky-mouse-absolute-center\">\n\t\t<div class=\"tracky-mouse-screen-overlay-status-indicator tracky-mouse-manual-takeback-indicator\">\n\t\t\t<img src=\"../images/manual-takeback.svg\" alt=\"hand reaching for mouse\" width=\"128\" height=\"128\">\n\t\t</div>\n\t\t<div class=\"tracky-mouse-screen-overlay-status-indicator tracky-mouse-head-not-found-indicator\">\n\t\t\t<img src=\"../images/head-not-found.svg\" alt=\"head not found\" width=\"128\" height=\"128\">\n\t\t</div>\n\t</div>\n\t<div id=\"tracky-mouse-screen-overlay-message\">\n\t\t<div class=\"tracky-mouse-manual-takeback-indicator\">\n\t\t\t<!-- Pausing temporarily for manual takeback. -->\n\t\t\t<!-- Manual Takeback -->\n\t\t\t<!-- Will resume in <span id=\"countdown\">5</span> seconds. -->\n\t\t\tWill resume after mouse stops moving.\n\t\t</div>\n\t\t<div class=\"tracky-mouse-no-takeback-indicator\">\n\t\t\tPress F9 to <span id=\"enable-disable\">toggle</span> Tracky Mouse.\n\t\t</div>\n\t</div>\n</body>\n\n<script src=\"../node_modules/tracky-mouse/tracky-mouse.js\"></script>\n<script src=\"screen-overlay.js\"></script>\n\n</html>"
  },
  {
    "path": "lib/tracky-mouse/desktop-app/src/preload-app-window.js",
    "content": "// This script is injected into the MAIN APP WINDOW, before other scripts,\n// with privileged access to the electron API, which it should expose in a limited way.\n// That said, mouse control is pretty powerful, so it's important to keep it secure.\n\nconst { contextBridge, ipcRenderer } = require('electron');\n\n\ncontextBridge.exposeInMainWorld(\"electronAPI\", {\n\tmoveMouse: (x, y) => {\n\t\tipcRenderer.send('move-mouse', x, y, performance.now());\n\t},\n\n\tonShortcut: (callback) => {\n\t\tipcRenderer.on(\"shortcut\", (_event, data) => {\n\t\t\t// console.log(\"shortcut\", data);\n\t\t\tcallback(data);\n\t\t});\n\t},\n\n\tnotifyToggleState: (nowEnabled) => {\n\t\tipcRenderer.send('notify-toggle-state', nowEnabled);\n\t},\n\n\tnotifyCameraFeedDiagnostics: (data) => {\n\t\tipcRenderer.send('notify-camera-feed-diagnostics', data);\n\t},\n\n\tsetOptions: (optionsPatch) => {\n\t\tipcRenderer.send('set-options', optionsPatch);\n\t},\n\n\tgetOptions: () => {\n\t\treturn ipcRenderer.invoke('get-options');\n\t},\n\n\t// isPackaged: app.isPackaged, // can't require electron's app module here\n\t// isPackaged: !!process.defaultApp, // nope, doesn't exist\n\tgetIsPackaged: () => ipcRenderer.invoke('get-is-packaged'),\n});\n"
  },
  {
    "path": "lib/tracky-mouse/desktop-app/src/preload-screen-overlay.js",
    "content": "// This script is injected into the screen overlay window, before other scripts,\n// with privileged access to the electron API, which it should expose in a limited way.\n// That said, mouse control is pretty powerful, so it's important to keep it secure.\n\nconst { contextBridge, ipcRenderer } = require('electron');\n\ncontextBridge.exposeInMainWorld('electronAPI', {\n\tonChangeDwellClicking: (callback) => ipcRenderer.on('change-dwell-clicking', callback),\n\t// Note terrible naming inconsistency.\n\tonMouseMove: (callback) => ipcRenderer.on('move-mouse', callback),\n\n\t// This is pretty weird but I'm giving the overlay window control over clicking,\n\t// whereas the app window has control over moving the mouse.\n\t// The app window has the head tracker, which moves the mouse,\n\t// and the overlay window handles the dwell clicking (rendering, and, in this case, clicking).\n\t// It's quite the hacky architecture.\n\t// A more sane architecture might have the overlay window, which can't receive any input directly,\n\t// as purely a visual output, rather than containing business logic for handling clicks.\n\t// But this let me reuse my existing code for dwell clicking, without tearing it apart.\n\n\tmouseClick: (x, y) => ipcRenderer.send('click', x, y, performance.now()),\n});\n"
  },
  {
    "path": "lib/tracky-mouse/desktop-app/src/screen-overlay.css",
    "content": "html,\nbody {\n\toverflow: hidden;\n\tmargin: 0;\n}"
  },
  {
    "path": "lib/tracky-mouse/desktop-app/src/screen-overlay.js",
    "content": "/* global TrackyMouse, electronAPI */\nconst message = document.getElementById(\"tracky-mouse-screen-overlay-message\");\nconst actionSpan = document.getElementById(\"enable-disable\");\n\nconst bigButton = document.createElement(\"button\");\nbigButton.style.position = \"absolute\";\nbigButton.style.top = \"0\";\nbigButton.style.left = \"0\";\nbigButton.style.width = \"100%\";\nbigButton.style.height = \"100%\";\nbigButton.style.backgroundColor = \"transparent\";\nbigButton.style.border = \"none\";\nbigButton.id = \"button-that-takes-up-the-entire-screen\";\ndocument.body.appendChild(bigButton);\n\nTrackyMouse.initDwellClicking({\n\ttargets: \"#button-that-takes-up-the-entire-screen\",\n\tnoCenter: (el) => el.matches(\"#button-that-takes-up-the-entire-screen\"),\n\tclick: ({ x, y }) => {\n\t\telectronAPI.mouseClick(x, y);\n\t},\n});\n\nelectronAPI.onMouseMove((_event, x, y) => {\n\t// console.log(\"move-mouse\", x, y);\n\tdocument.dispatchEvent(new Event(\"mouseenter\"));\n\tconst domEvent = new PointerEvent(\"pointermove\", {\n\t\tview: window,\n\t\tclientX: x,\n\t\tclientY: y,\n\t\tpointerId: 1,\n\t\tpointerType: \"mouse\",\n\t\tisPrimary: true,\n\t\tbutton: 0,\n\t\tbuttons: 1,\n\t\tbubbles: true,\n\t\tcancelable: true,\n\t});\n\twindow.dispatchEvent(domEvent);\n});\n\nlet wasEnabled = false;\nelectronAPI.onChangeDwellClicking((_event, isEnabled, isManualTakeback, cameraFeedDiagnostics) => {\n\tconsole.log(\"onChangeDwellClicking\", isEnabled, isManualTakeback, cameraFeedDiagnostics);\n\n\t// Other diagnostics in the future would be stuff like:\n\t// - head too far away (smaller than a certain size) https://github.com/1j01/tracky-mouse/issues/49\n\t// - bad lighting conditions\n\t// see: https://github.com/1j01/tracky-mouse/issues/26\n\n\tdocument.body.classList.toggle(\"tracky-mouse-manual-takeback\", isManualTakeback);\n\tdocument.body.classList.toggle(\"tracky-mouse-head-not-found\", cameraFeedDiagnostics.headNotFound);\n\tactionSpan.innerText = isEnabled ? \"disable\" : \"enable\";\n\n\tif (!isEnabled && !isManualTakeback) {\n\t\t// Fade out the message after a little while so it doesn't get in the way.\n\t\t// TODO: make sure animation isn't interrupted by cameraFeedDiagnostics updates.\n\t\tmessage.style.animation = \"tracky-mouse-screen-overlay-message-fade-out 2s ease-in-out forwards 10s\";\n\t} else {\n\t\tmessage.style.animation = \"\";\n\t\tmessage.style.opacity = \"1\";\n\t}\n\n\t// \"Trick\" Tracky Mouse into stopping/starting the dwell clicker.\n\t// (TODO: can I use the return value of initDwellClicking instead? Or otherwise formalize this?)\n\tif (wasEnabled !== isEnabled) {\n\t\tdocument.dispatchEvent(new Event(isEnabled ? \"mouseenter\" : \"mouseleave\"));\n\t\twindow.dispatchEvent(new Event(isEnabled ? \"focus\" : \"blur\"));\n\t}\n\twasEnabled = isEnabled;\n});\n"
  },
  {
    "path": "lib/tracky-mouse/desktop-app/src/tracky-mouse-bin.js",
    "content": "#!/usr/bin/env node\nconst { spawnSync } = require('child_process');\nconst path = require('path');\nconst electronPath = require('electron');\nconst args = process.argv.slice(2);\nspawnSync(electronPath, [path.join(__dirname, '..'), ...args], { stdio: 'inherit' });\n"
  },
  {
    "path": "lib/tracky-mouse/eslint.config.js",
    "content": "const globals = require(\"globals\");\nconst js = require(\"@eslint/js\");\n\n/** @type {import('@types/eslint').Linter.FlatConfig[]} */\nmodule.exports = [\n\t{\n\t\t\"ignores\": [\n\t\t\t\"**/node_modules\",\n\t\t\t\"**/out\",\n\t\t\t\"**/dist\",\n\t\t\t\"**/lib\",\n\t\t\t\"**/.*\",\n\t\t],\n\t},\n\tjs.configs.recommended,\n\t{\n\t\t\"languageOptions\": {\n\t\t\t\"globals\": {\n\t\t\t\t...globals.browser,\n\t\t\t\t// ...globals.es2021,\n\t\t\t},\n\t\t\t\"ecmaVersion\": \"latest\"\n\t\t},\n\t\t\"rules\": {\n\t\t\t\"indent\": [\n\t\t\t\t\"error\",\n\t\t\t\t\"tab\",\n\t\t\t\t{ \"SwitchCase\": 1 }\n\t\t\t],\n\t\t\t// \"quotes\": [\n\t\t\t// \t\"error\",\n\t\t\t// \t\"single\"\n\t\t\t// ],\n\t\t\t\"semi\": [\n\t\t\t\t\"error\",\n\t\t\t\t\"always\"\n\t\t\t],\n\t\t\t// \"no-unused-vars\": \"off\",\n\t\t\t// \"@typescript-eslint/no-unused-vars\": [\n\t\t\t// \t\"warn\", // or \"error\"\n\t\t\t// \t{\n\t\t\t// \t\t\"argsIgnorePattern\": \"^_\",\n\t\t\t// \t\t\"varsIgnorePattern\": \"^_\",\n\t\t\t// \t\t\"caughtErrorsIgnorePattern\": \"^_\"\n\t\t\t// \t}\n\t\t\t// ]\n\t\t\t\"no-unused-vars\": [\"warn\", {\n\t\t\t\t\"args\": \"all\",\n\t\t\t\t\"argsIgnorePattern\": \"^_\",\n\t\t\t\t\"caughtErrorsIgnorePattern\": \"^_\",\n\t\t\t\t// \"varsIgnorePattern\": \"^_\",\n\t\t\t}],\n\t\t},\n\t},\n\t{\n\t\t\"files\": [\n\t\t\t\"desktop-app/src/tracky-mouse-bin.js\",\n\t\t\t\"desktop-app/src/electron-main/*\",\n\t\t\t\"desktop-app/src/preload-app-window.js\",\n\t\t\t\"desktop-app/src/preload-screen-overlay.js\",\n\t\t\t\"desktop-app/forge.config.js\",\n\t\t\t\"eslint.config.js\",\n\t\t],\n\t\t\"languageOptions\": {\n\t\t\t\"globals\": {\n\t\t\t\t// ...globals.commonjs,\n\t\t\t\t...globals.node\n\t\t\t},\n\t\t\t\"sourceType\": \"commonjs\"\n\t\t},\n\t}\n];\n"
  },
  {
    "path": "lib/tracky-mouse/package.json",
    "content": "{\n\t\"private\": true,\n\t\"name\": \"tracky-mouse-monorepo\",\n\t\"description\": \"This package contains scripts shared between packages.\",\n\t\"version\": \"1.2.0\",\n\t\"CAN'T USE NPM WORKSPACES, see: https://github.com/1j01/tracky-mouse/issues/53\": [\n\t\t\"core\",\n\t\t\"desktop-app\",\n\t\t\"website\"\n\t],\n\t\"scripts\": {\n\t\t\"website\": \"cd website && npm run start\",\n\t\t\"in-website\": \"cd website &&\",\n\t\t\"desktop-app\": \"cd desktop-app && npm run start\",\n\t\t\"in-desktop-app\": \"cd desktop-app &&\",\n\t\t\"in-core\": \"cd core &&\",\n\t\t\"lint-cspell\": \"cspell-cli lint .\",\n\t\t\"lint-eslint\": \"eslint .\",\n\t\t\"lint\": \"npm-run-all --continue-on-error --serial lint-*\",\n\t\t\"update-cli-docs\": \"node -e \\\"const fs = require('fs'); fs.writeFileSync('CLI.md', fs.readFileSync('CLI.md', 'utf8').replace(/```HELP_OUTPUT.+?```/s, '```HELP_OUTPUT\\\\n' + require('child_process').execSync('tracky-mouse --help').toString().trim() + '\\\\n```'))\\\"\"\n\t},\n\t\"bin\": {\n\t\t\"tracky-mouse\": \"desktop-app/src/tracky-mouse-bin.js\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@eslint/js\": \"^9.0.0\",\n\t\t\"@types/eslint\": \"^8.56.9\",\n\t\t\"cspell-cli\": \"^8.7.0\",\n\t\t\"eslint\": \"^9.0.0\",\n\t\t\"npm-run-all\": \"^4.1.5\"\n\t}\n}\n"
  },
  {
    "path": "lib/tracky-mouse/website/CNAME",
    "content": "trackymouse.js.org"
  },
  {
    "path": "lib/tracky-mouse/website/demo.js",
    "content": "/* global TrackyMouse */\n\nTrackyMouse.dependenciesRoot = \"./core\";\n\nawait TrackyMouse.loadDependencies();\n\n// Note: init currently extends the passed element,\n// rather than replacing it or adding a child to it.\n// That is technically the most flexible, I suppose,\n// but may violate the principle of least surprise.\n// I could accept an options object with mutually exclusive options\n// to `extend`, `replace`, or `appendTo`.\nTrackyMouse.init(document.getElementById(\"tracky-mouse-demo\"));\n\n// This example is based off of how JS Paint uses the Tracky Mouse API.\n// It's simplified a bit, but includes various settings.\nconst config = {\n\t// The elements to click. Anything else is ignored.\n\t// TODO: maybe allow clicking on everything, but first\n\t// make sure to enable dwell clicking only when the head tracker is enabled.\n\ttargets: \".archery-target\",\n\t// targets: `\n\t// \tbutton:not([disabled]),\n\t// \tinput,\n\t// \ttextarea,\n\t// \tlabel,\n\t// \ta,\n\t// \tdetails summary,\n\t// \t.radio-or-checkbox-wrapper,\n\t// \t.drawing-canvas,\n\t// \t.window:not(.maximized) .window-titlebar\n\t// `,\n\t// Filter for elements to drag. They must be included in the targets first.\n\t// shouldDrag: (target) => (\n\t// \ttarget.matches(\".window-titlebar\") ||\n\t// \t(target.matches(\".drawing-canvas\") && current_tool.supports_drag)\n\t// ),\n\t// Instead of clicking in the center of these elements, click at any point within the element.\n\t// This is useful for drag offsets, like for a window titlebar,\n\t// and position-based inputs like sliders or color pickers, or a drawing canvas.\n\tnoCenter: (target) => (\n\t\ttarget.matches(`\n\t\t\tinput[type=\"range\"],\n\t\t\t.drawing-canvas,\n\t\t\t.window-titlebar\n\t\t`)\n\t),\n\t// Nudge hovers near the edges of an element onto the element itself,\n\t// to make it easier to click on the element.\n\t// More specifically it makes it easier to click on the edge of an element,\n\t// useful for a drawing canvas.\n\tretarget: [\n\t\t{ from: \".canvas-container\", to: \".drawing-canvas\", withinMargin: 50 },\n\t],\n\t// Elements that are equivalent are considered the same control.\n\t// This is useful for forms if you want the label of a radio button or checkbox\n\t// to be highlighted together with the radio button or checkbox.\n\tisEquivalentTarget: (apparent_hover_target, hover_target) => (\n\t\tapparent_hover_target.closest(\"label\") === hover_target ||\n\t\tapparent_hover_target.closest(\".radio-or-checkbox-wrapper\") === hover_target\n\t),\n\t// Allow dwell clicking on a \"Resume Dwell Clicking\" button, while paused.\n\tdwellClickEvenIfPaused: (target) => (\n\t\ttarget.matches(\".toggle-dwell-clicking-button\")\n\t),\n\t// Define how to click on an element.\n\tclick: ({ target, x, y }) => {\n\t\tif (target.matches(\"input[type='range']\")) {\n\t\t\t// Special handling for sliders\n\t\t\tconst rect = target.getBoundingClientRect();\n\t\t\tconst vertical =\n\t\t\t\ttarget.getAttribute(\"orient\") === \"vertical\" ||\n\t\t\t\t(getCurrentRotation(target) !== 0) ||\n\t\t\t\trect.height > rect.width;\n\t\t\tconst min = Number(target.min);\n\t\t\tconst max = Number(target.max);\n\t\t\ttarget.value = (\n\t\t\t\tvertical ?\n\t\t\t\t\t(y - rect.top) / rect.height :\n\t\t\t\t\t(x - rect.left) / rect.width\n\t\t\t) * (max - min) + min;\n\t\t\ttarget.dispatchEvent(new Event(\"input\", { bubbles: true }));\n\t\t\ttarget.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\t\t} else {\n\t\t\t// Normal click\n\t\t\ttarget.click();\n\t\t\tif (target.matches(\"input, textarea\")) {\n\t\t\t\ttarget.focus();\n\t\t\t}\n\t\t}\n\t},\n\t// Handle untrusted gestures specially in external code.\n\t// Somewhere else, for example, you might do something like:\n\t// if (window.untrusted_gesture) {\n\t// \t// show download window\n\t// } else {\n\t// \t// show save file dialog with FS Access API\n\t// }\n\t// Recommended: use `event.isTrusted` instead, where possible.\n\tbeforeDispatch: () => { window.untrusted_gesture = true; },\n\tafterDispatch: () => { window.untrusted_gesture = false; },\n};\nTrackyMouse.initDwellClicking(config);\n\n// Source: https://stackoverflow.com/a/54492696/2624876\nfunction getCurrentRotation(el) {\n\tconst st = window.getComputedStyle(el, null);\n\tconst tm = st.getPropertyValue(\"-webkit-transform\") ||\n\t\tst.getPropertyValue(\"-moz-transform\") ||\n\t\tst.getPropertyValue(\"-ms-transform\") ||\n\t\tst.getPropertyValue(\"-o-transform\") ||\n\t\tst.getPropertyValue(\"transform\") ||\n\t\t\"none\";\n\tif (tm !== \"none\") {\n\t\tconst [a, b] = tm.split('(')[1].split(')')[0].split(',');\n\t\treturn Math.round(Math.atan2(a, b) * (180 / Math.PI));\n\t}\n\treturn 0;\n}\n\n// Pointer event simulation logic should be built into tracky-mouse in the future.\n// These simulated events connect the Tracky Mouse head tracker to the Tracky Mouse dwell clicker,\n// as well as any other pointermove/pointerenter/pointerleave handlers on the page.\nconst getEventOptions = ({ x, y }) => {\n\treturn {\n\t\tview: window, // needed so the browser can calculate offsetX/Y from the clientX/Y\n\t\tclientX: x,\n\t\tclientY: y,\n\t\tpointerId: 1234567890, // a special value so other code can detect these simulated events\n\t\tpointerType: \"mouse\",\n\t\tisPrimary: true,\n\t};\n};\nlet last_el_over = null;\nTrackyMouse.onPointerMove = (x, y) => {\n\tconst target = document.elementFromPoint(x, y) || document.body;\n\tif (target !== last_el_over) {\n\t\tif (last_el_over) {\n\t\t\tconst event = new PointerEvent(\"pointerleave\", Object.assign(getEventOptions({ x, y }), {\n\t\t\t\tbutton: 0,\n\t\t\t\tbuttons: 1,\n\t\t\t\tbubbles: false,\n\t\t\t\tcancelable: false,\n\t\t\t}));\n\t\t\tlast_el_over.dispatchEvent(event);\n\t\t}\n\t\tconst event = new PointerEvent(\"pointerenter\", Object.assign(getEventOptions({ x, y }), {\n\t\t\tbutton: 0,\n\t\t\tbuttons: 1,\n\t\t\tbubbles: false,\n\t\t\tcancelable: false,\n\t\t}));\n\t\ttarget.dispatchEvent(event);\n\t\tlast_el_over = target;\n\t}\n\tconst event = new PointerEvent(\"pointermove\", Object.assign(getEventOptions({ x, y }), {\n\t\tbutton: 0,\n\t\tbuttons: 1,\n\t\tbubbles: true,\n\t\tcancelable: true,\n\t}));\n\ttarget.dispatchEvent(event);\n};\n\n// Archery mini-game\nconst archery_game = document.getElementById(\"archery-demo\");\nconst archery_scoreboard = document.getElementById(\"archery-scoreboard\");\nconst archery_targets = document.querySelectorAll(\".archery-target\");\nlet round;\nconst best_times = {\n\twith_head_tracker: Infinity,\n\twith_dwell_clicker: Infinity,\n\twith_dwell_clicker_touch: Infinity, // unlikely, since touch doesn't have hovering (except on a few phones, as a gimmick; dunno if they trigger events with pointerType \"touch\" for hovering)\n\twith_dwell_clicker_pen: Infinity,\n\twith_mouse: Infinity,\n\twith_touch: Infinity,\n\twith_pen: Infinity,\n\twith_keyboard: Infinity,\n\twith_unknown_input: Infinity,\n};\nfunction initRound() {\n\tround = {\n\t\tused_manual_movement: false, // non-head-tracker mouse movement\n\t\tused_manual_movement_touch: false, // non-head-tracker mouse movement\n\t\tused_manual_movement_pen: false, // non-head-tracker mouse movement\n\t\tused_manual_click: false, // non-dwell clicking\n\t\tused_manual_click_touch: false, // non-dwell clicking\n\t\tused_manual_click_pen: false, // non-dwell clicking\n\t\tused_keyboard: false, // not much of a game, but may be an interesting comparison\n\t\tused_unknown_input: false, // click event despite preventing via keydown/pointerdown\n\t\tstart_time: undefined, // set when the first target is hit\n\t};\n\tfor (const archery_target of archery_targets) {\n\t\tarchery_target.classList.remove(\"hit\");\n\t}\n}\ninitRound();\nlet last_pointerdown_time = -Infinity;\narchery_game.addEventListener(\"pointerdown\", (event) => {\n\tif (event.pointerId !== 1234567890) {\n\t\t// TODO: maybe only set if target was hit; could use a callback (or return value but that would be a little confusing since handleTargetHit looks like an event handler)\n\t\tround.used_manual_click = true;\n\t\tif (event.pointerType === \"pen\") {\n\t\t\tround.used_manual_click_pen = true;\n\t\t} else if (event.pointerType === \"touch\") {\n\t\t\tround.used_manual_click_touch = true;\n\t\t}\n\t}\n\t// Don't call `event.preventDefault()` because click will be triggered regardless, but it will prevent text deselection, which is very irritating.\n\thandleTargetHit(event);\n\tlast_pointerdown_time = performance.now();\n});\narchery_game.addEventListener(\"keydown\", (event) => {\n\tif (event.key === \" \" || event.key === \"Enter\") {\n\t\tevent.preventDefault();\n\t\tround.used_keyboard = true;\n\t\thandleTargetHit(event);\n\t}\n});\narchery_game.addEventListener(\"click\", (event) => {\n\tif (performance.now() - last_pointerdown_time < 100) {\n\t\treturn;\n\t}\n\tround.used_unknown_input = true;\n\thandleTargetHit(event);\n});\narchery_game.addEventListener(\"pointerenter\", (event) => {\n\tif (event.pointerId === 1234567890) {\n\t\treturn;\n\t}\n\tround.used_manual_movement = true;\n\tif (event.pointerType === \"pen\") {\n\t\tround.used_manual_movement_pen = true;\n\t} else if (event.pointerType === \"touch\") {\n\t\tround.used_manual_movement_touch = true;\n\t}\n});\n\n/**\n * @returns {keyof typeof best_times} scoreboard_slot - the slot in the scoreboard for the current input method (the most powerful, if it's ambiguous)\n * \n * If you for example use the head tracker for one target and then mash Tab+Enter for the rest, that should count as using the keyboard.\n * \n * Note that pointerType may be \"mouse\" when using a pen, under some circumstances.\n * It seems I need to enable \"Windows Ink\" in the Wacom settings (and re-open the tab, not just reload) to get \"pen\" as the pointerType.\n */\nfunction get_scoreboard_slot() {\n\tif (round.used_keyboard) {\n\t\t// keyboard is the most like cheating, so it goes first\n\t\treturn \"with_keyboard\";\n\t} else if (round.used_manual_click_touch) {\n\t\t// next easiest is clicking with touch (it's an absolute input method, and you can see exactly where you're clicking; you could even line up multiple fingers with targets... actually that might even make it more powerful than the keyboard...)\n\t\treturn \"with_touch\";\n\t} else if (round.used_manual_click_pen) {\n\t\t// next easiest is clicking with a pen (it's an absolute input method, but you have to look at the cursor to see where you're clicking)\n\t\treturn \"with_pen\";\n\t} else if (round.used_manual_click) {\n\t\t// next easiest is clicking with a mouse (it's relative, but precise and familiar)\n\t\treturn \"with_mouse\";\n\t} else if (round.used_manual_movement_touch) {\n\t\t// next easiest is moving the mouse but using the dwell clicker (it's precise but slower)\n\t\t// not sure about touch vs pen/mouse in this case, as I don't have a touch screen supporting hover\n\t\treturn \"with_dwell_clicker_touch\";\n\t} else if (round.used_manual_movement_pen) {\n\t\t// (see previous comment)\n\t\treturn \"with_dwell_clicker_pen\";\n\t} else if (round.used_manual_movement) {\n\t\t// (see previous comment)\n\t\treturn \"with_dwell_clicker\";\n\t} else if (round.used_unknown_input) {\n\t\t// this last one is a wild card; it's hard to say whether this condition should be last or first\n\t\t// I imagine some other accessibility feature might trigger this\n\t\t// Can simulate with:\n\t\t// for (const archeryTarget of document.querySelectorAll(\".archery-target\")) {\n\t\t// \tarcheryTarget.dispatchEvent(new PointerEvent(\"click\", { bubbles: true }));\n\t\t// }\n\t\t// Of course, that example is completely cheating, which makes it feel like it should be first,\n\t\t// but I suspect if this occurs outside of a test, it won't be due to cheating.\n\t\t// Of course, the ranking by \"easiness\" is only in case you mix input methods in a single round.\n\t\t// It might not be the best way to detect a different (unknown) input method.\n\t\t// That is to say, there's a different argument for giving this priority.\n\t\treturn \"with_unknown_input\";\n\t} else {\n\t\treturn \"with_head_tracker\";\n\t}\n}\n\nconst slot_labels = {\n\twith_head_tracker: \"With Head Tracking\",\n\twith_dwell_clicker: \"With Dwell Clicking\", // may be pen, undetectable in some cases\n\twith_dwell_clicker_touch: \"With Dwell Clicking (Touch)\",\n\twith_dwell_clicker_pen: \"With Dwell Clicking (Pen)\",\n\twith_mouse: \"With Manual Clicking\", // may be pen, undetectable in some cases, hence \"manual\" instead of \"mouse\"\n\twith_touch: \"With Touch\",\n\twith_pen: \"With Pen\",\n\twith_keyboard: \"With Keyboard\",\n\twith_unknown_input: \"With Unknown Input\",\n};\n\n/**\n * @param {PointerEvent | KeyboardEvent} event \n */\nfunction handleTargetHit(event) {\n\tif (!event.target.matches(\".archery-target\")) {\n\t\treturn;\n\t}\n\tif (archery_game.classList.contains(\"round-over\")) {\n\t\treturn;\n\t}\n\tconst archery_target = event.target;\n\tif (!round.start_time) {\n\t\tinitRound(); // reset input detection to ignore spurious hovering before the round starts\n\t\tround.start_time = performance.now();\n\t\tarchery_scoreboard.hidden = true;\n\t}\n\t// after initRound since initRound removes the .hit class\n\tarchery_target.classList.add(\"hit\");\n\tanimateTargetHit(archery_target).then(() => {\n\t\t// archery_target.classList.remove(\"hit\");\n\t});\n\tif (document.querySelectorAll(\".archery-target:not(.hit)\").length === 0) {\n\t\tconst time = (performance.now() - round.start_time) / 1000;\n\t\tarchery_scoreboard.hidden = false;\n\t\tarchery_scoreboard.textContent = `Time: ${time.toFixed(2)}s`;\n\t\tconst slot = get_scoreboard_slot();\n\t\tconst new_best = time < best_times[slot];\n\t\tif (new_best) {\n\t\t\tbest_times[slot] = time;\n\t\t}\n\t\tconst slot_indicator = document.createElement(\"p\");\n\t\tslot_indicator.textContent = slot_labels[slot];\n\t\tslot_indicator.classList.add(\"slot-indicator\");\n\t\tarchery_scoreboard.append(slot_indicator);\n\t\tconst best_times_label = document.createElement(\"p\");\n\t\tbest_times_label.textContent = `Best times:`;\n\t\tbest_times_label.classList.add(\"best-times-label\");\n\t\tarchery_scoreboard.append(best_times_label);\n\t\tconst ul = document.createElement(\"ul\");\n\t\tarchery_scoreboard.append(ul);\n\t\tfor (const [id, time] of Object.entries(best_times)) {\n\t\t\tif (time === Infinity) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst label = slot_labels[id];\n\t\t\tconst li = document.createElement(\"li\");\n\t\t\tli.textContent = `${label}: ${time.toFixed(2)}s`;\n\t\t\tif (slot === id && new_best) {\n\t\t\t\tli.classList.add(\"new-best-time\");\n\t\t\t\tconst new_best = document.createElement(\"span\");\n\t\t\t\tnew_best.textContent = \" New Best!\";\n\t\t\t\tli.append(new_best);\n\t\t\t}\n\t\t\tul.append(li);\n\t\t}\n\t\tarchery_game.classList.add(\"round-over\");\n\t\tsetTimeout(() => {\n\t\t\tfor (const archery_target of archery_targets) {\n\t\t\t\tfor (const animation of archery_target.getAnimations()) {\n\t\t\t\t\tanimation.cancel();\n\t\t\t\t}\n\t\t\t}\n\t\t\tsetTimeout(() => {\n\t\t\t\tarchery_game.classList.remove(\"round-over\");\n\t\t\t\tinitRound();\n\t\t\t}, 100);\n\t\t}, 2000);\n\t}\n}\n\n/**\n * @param {HTMLButtonElement} archery_target \n */\nasync function animateTargetHit(archery_target) {\n\t// archery_target.style.animation = \"archery-target-hit 0.5s ease-in-out\";\n\t// archery_target.addEventListener(\"animationend\", () => {\n\t// \tarchery_target.style.animation = \"\";\n\t// }, { once: true });\n\tconst frames = [];\n\tlet angle = 0;\n\tlet angularVelocity = 2 + Math.random() * 0.2;\n\tfor (let t = 0; t < 100; t++) {\n\t\tangularVelocity *= 0.92;\n\t\tangle += angularVelocity;\n\t\tangularVelocity += (Math.sin(angle)) * 0.1;\n\t\tframes.push({\n\t\t\ttransform: `translate(-50%, -50%) rotateX(${angle}rad)`,\n\t\t\topacity: Math.min(1, Math.max(0.2, 1 - t / 100 * 4.123456) - Math.cos(angle) * 0.1),\n\t\t});\n\t}\n\ttry {\n\t\tawait archery_target.animate(frames, {\n\t\t\tduration: 10000,\n\t\t\teasing: \"linear\",\n\t\t\tfill: \"both\",\n\t\t}).finished;\n\t} catch (_error) {\n\t\t// ignore cancelation\n\t}\n}\n"
  },
  {
    "path": "lib/tracky-mouse/website/eval-is-evil.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"UTF-8\">\n\t<meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'self' 'unsafe-inline' 'unsafe-eval' blob:\">\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\t<title>JS Library De-eval()-er</title>\n\t<style>\n\t\tbody {\n\t\t\tbackground-color: white;\n\t\t\tcolor: black;\n\t\t}\n\n\t\t@media (prefers-color-scheme: dark) {\n\t\t\tbody {\n\t\t\t\tbackground-color: black;\n\t\t\t\tcolor: white;\n\t\t\t}\n\n\t\t\ta:link {\n\t\t\t\tcolor: aquamarine;\n\t\t\t}\n\n\t\t\ta:visited {\n\t\t\t\tcolor: rgb(197, 127, 255);\n\t\t\t}\n\t\t}\n\t</style>\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"core/tracky-mouse.css\">\n\t<link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"images/tracky-mouse-logo-16.png\">\n\t<link rel=\"icon\" type=\"image/png\" sizes=\"512x512\" href=\"images/tracky-mouse-logo-512.png\">\n</head>\n\n<body>\n\t<h2>JS Library De-<code>eval()</code>-er</h2>\n\t<p>\n\t\tThis page runs a library that uses <code>eval</code> and <code>Function</code>, but instruments them,\n\t\tin order to figure out ahead of time what code the library actually needs to run.\n\t</p>\n\t<p>\n\t\tIn cases where this stays the same generally, and there is not a billion lines of evaluated code,\n\t\tthis allows generating a library that does not require <code>eval</code> and <code>Function</code> to be used,\n\t\tso you can do away with <code>unsafe-eval</code> and in the Content-Security-Policy.\n\t</p>\n\t<p>\n\t\tThis doesn't work for all libraries, but it works for the ones I use.\n\t\tLibraries that use <code>eval</code> and <code>Function</code> for performance reasons only\n\t\tare more likely to work.\n\t\tBut something that uses it for a JavaScript command prompt (like on-page dev tools) will not.\n\t</p>\n\t<p>\n\t\tThis tool doesn't detect when the code evaluation is dynamic or not.\n\t\tIt simply generates code to replace <code>eval</code> and <code>Function</code>\n\t\twith versions that only allows snippets of code already seen while running on this page.\n\t</p>\n\t<p>\n\t\tThe output is a monkey patch to be loaded before any code that uses <code>eval</code> and <code>Function</code>.\n\t\tThe monkey patch can be included in the library itself, or in a separate file.\n\t</p>\n\t<h2>Won't this miss certain cases?</h2>\n\t<p>\n\t\tThere are other ways of accessing <code>eval</code> and <code>Function</code>,\n\t\tsuch as <code>(function(){}).constructor(\"alert('hey')\")()</code>;\n\t\tbut the intent of this tool is not to catch all possible cases in order to directly prevent access to eval,\n\t\tbut rather to allow you to prevent access with Content-Security-Policy's <code>script-src</code>.\n\t</p>\n\t<h2>Won't this generate huge amounts of code?</h2>\n\t<p>\n\t\tFor code that evaluates code using templates, as a way of metaprogramming,\n\t\tit may lead to a huge amount of code.\n\t\tHowever, it should compress well, as it is very repetitive.\n\t</p>\n\t<p>\n\t\tParsing performance may still be an issue.\n\t</p>\n\t<p>\n\t\tIt will be interesting to test this.\n\t\tI would expect it to work better if you include the monkey patch as a wrapper around the library,\n\t\tso that it can compress together with the library.\n\t</p>\n\t<h2>Can this work without first running the code using <code>eval</code>?</h2>\n\t<p>\n\t\tIt would be possible to generate combinatorially all possibilities of code to be generated,\n\t\t<em>in some cases</em>, however in general it is undecidable.\n\t</p>\n\t<p>\n\t\tIt may be worthwhile to attempt, but in this project,\n\t\tit wasn't necessary to statically analyze the code.\n\t</p>\n\t<p>\n\t\tExecuting it with instrumentation was actually quite simple and effective.\n\t</p>\n\t<h2>How does this behave differently from native <code>eval</code>?</h2>\n\t<p>\n\t\tThe generated functions do not run in the same context as the original code.\n\t\tSo this makes <code>eval</code> more like how <code>Function</code> works.\n\t\tYou may get <code>ReferenceError</code>s if <code>eval</code> accesses variables in the surrounding code.\n\t</p>\n\t<p>\n\t\tThis could be fixed by passing a function to get/set variables from the surrounding code into each\n\t\t<code>eval</code> call site (that needs it).\n\t\tThis would need some static analysis to determine which variables are accessed... or, to do it lazily,\n\t\tperhaps every valid JS literal within the eval code could be assumed as possibly accessing a variable outside,\n\t\tand getters/setters generated for it, and the functions generated for recorded eval calls could be wrapped in\n\t\t<code>with (contextGettersAndSetters) {}</code>\n\t\tand the <code>contextGettersAndSetters</code> is passed in to each <code>eval</code> call site,\n\t\tso that the inner code does not need to be modified into function calls.\n\t</p>\n\t<h2>Will you make this into a reusable tool?</h2>\n\t<!-- <p>\n\t\tI'm thinking about it, <em>as you can tell from this heading.</em> Cough.\n\t</p> -->\n\t<p>\n\t\tI'd like to, yes. I think it would be very valuable for tightening security in various projects.\n\t</p>\n\t<p>\n\t\tFor now, this is part of <a href=\"https://github.com/1j01/tracky-mouse\">Tracky Mouse</a>.\n\t\tMIT-licensed.\n\t</p>\n\t<p>\n\t\tThat said, if you need this, you can copy this HTML file and change the code it loads.\n\t\tIt should be pretty easy to use already.\n\t</p>\n\n\t<hr>\n\n\t<!-- Record code evaluations -->\n\t<script>\n\t\tconst originalEval = eval;\n\t\tconst OriginalFunction = Function;\n\t\tconst evalCodes = [];\n\t\tconst functionConstructions = [];\n\t\twindow.eval = function (code) {\n\t\t\tevalCodes.push(code);\n\t\t\treturn originalEval(code);\n\t\t};\n\t\twindow.Function = function (...args) {\n\t\t\tconst argNames = args.slice(0, -1);\n\t\t\tconst code = args.slice(-1)[0];\n\t\t\tfunctionConstructions.push({ argNames, code });\n\t\t\treturn new OriginalFunction(...args);\n\t\t};\n\t</script>\n\n\t<!-- Run code that uses eval, in a similar way to how it's normally used: -->\n\t<script src=\"core/lib/stats.js\"></script>\n\t<script src=\"core/lib/clmtrackr.js\"></script>\n\t<script src=\"core/tracky-mouse.js\"></script>\n\t<script>\n\t\tTrackyMouse.dependenciesRoot = \"./core\";\n\t\tTrackyMouse.init();\n\t</script>\n\t<!--\n\t\tThere's a Function construction that happens in tf.js which I'm loading in a worker.\n\t\tI'm manually triggering a similar construction here because\n\t\tI don't want to get it to load a camera/video stream just for this.\n\t\t(TrackyMouse.useCamera() could be used, but it can fail if the camera is not available.)\n\t\t(Undocumented TrackyMouse.useDemoFootage could work, but the demo video is currently gitignored.)\n\t-->\n\t<script>\n\t\tFunction(\"r\", \"regeneratorRuntime = r\");\n\t</script>\n\n\t<!-- Generate code for eval and Function replacements -->\n\t<script>\n\n\t\tfunction generateMonkeyPatch() {\n\t\t\tlet mapCode = \"const evalMap = new Map();\\n\\t\";\n\t\t\tfor (const evalCode of evalCodes) {\n\t\t\t\t// eval supports both expressions and statements.\n\t\t\t\t// eval(\"1\")\n\t\t\t\t// eval(\"var foo=1; foo;\")\n\t\t\t\t// We need to detect the last expression, and turn it into a return statement.\n\t\t\t\t// eval(\"var foo=1; foo;\") -> function() { var foo=1; return foo; }\n\t\t\t\t// eval(\"var foo=1;\") -> function() { var foo=1; }\n\t\t\t\t// eval(\"foo=1;\") -> function() { return foo=1; }\n\t\t\t\t// eval(\"1;\") -> function() { return 1; }\n\n\t\t\t\t// We can't use a regex to find the last expression, because it might be inside a string.\n\t\t\t\t// Instead, split on semicolons, and try expanding from the end until we find valid expression.\n\t\t\t\t// I'm ignoring semicolon insertion for now, only supporting single-line eval code.\n\t\t\t\tconst potentialStatements = evalCode.replace(/(;|\\s)+$/, \"\").split(\";\");\n\t\t\t\tconsole.log(potentialStatements);\n\t\t\t\tlet fnCode = \"\";\n\t\t\t\tlet parsed = false;\n\t\t\t\tfor (let i = potentialStatements.length - 1; i >= 0; i--) {\n\t\t\t\t\tfnCode = potentialStatements.slice(0, i).join(\";\") + (i ? \"; \" : \"\") + \"return (\" + potentialStatements.slice(i).join(\";\") + \");\";\n\t\t\t\t\ttry {\n\t\t\t\t\t\tnew OriginalFunction(fnCode);\n\t\t\t\t\t\tparsed = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (e instanceof SyntaxError) {\n\t\t\t\t\t\t\t// Continue.\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!parsed) {\n\t\t\t\t\t// The code may be just statements (i.e. with side-effects), with no return value expression.\n\t\t\t\t\tfnCode = evalCode;\n\t\t\t\t\tconsole.log(\"Leaving code as-is for function body:\", evalCode);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(\"Parsed eval code into function body:\", { evalCode, fnCode });\n\t\t\t\t}\n\n\t\t\t\tmapCode += `evalMap.set(${JSON.stringify(evalCode)}, function() { ${fnCode} });\\n\\t`;\n\t\t\t}\n\t\t\tmapCode += \"const functionMap = new Map();\\n\\t\";\n\t\t\tfor (const { argNames, code } of functionConstructions) {\n\t\t\t\tconst key = JSON.stringify({ argNames, code });\n\t\t\t\ttry {\n\t\t\t\t\tnew OriginalFunction(...argNames, code);\n\t\t\t\t\tmapCode += `functionMap.set(${JSON.stringify(key)}, function(${argNames}) { ${code} });\\n\\t`;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.warn(\"Failed to parse function:\", { argNames, code });\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst code = `// @generated by eval-is-evil.html\n// \n// This is a monkey patch that replaces eval and Function\n// with versions that and only run code known ahead of time.\n// They do not use the real eval and Function, and thus\n// the Content Security Policy (CSP) can be tightened.\n(()=> {\n\t${mapCode}\n\tconst eval = (code) => {\n\t\tconst fn = evalMap.get(code);\n\t\tif (fn) {\n\t\t\treturn fn();\n\t\t} else {\n\t\t\tthrow new Error(\"Prevented eval of code not seen ahead-of-time on De-eval()-er page: \" + code);\n\t\t}\n\t};\n\tconst Function = function (...args) {\n\t\tconst argNames = args.slice(0, -1);\n\t\tconst code = args.slice(-1)[0];\n\t\tconst key = JSON.stringify({argNames, code});\n\t\tconst fn = functionMap.get(key);\n\t\tif (fn) {\n\t\t\treturn fn;\n\t\t} else {\n\t\t\tthrow new Error(\"Prevented Function constructor called with arguments not seen ahead-of-time on De-eval()-er page: \" + JSON.stringify(args));\n\t\t}\n\t};\n\t// ------------------------------------------------------------\n\t// Option 1. Insert original library code here.\n\t// If the original library uses ES modules, you would need to ensure\n\t// import/export statements remain at the top level,\n\t// as they're not allowed within a function.\n\t// This is the cleanest option, as it requires no globals to be added or modified.\n\t/*__ORIGINAL_LIBRARY_CODE__*/;\n\n\t// Option 2. Export eval and Function globally:\n\t// globalThis.eval = eval;\n\t// globalThis.Function = Function;\n\t// This is the simplest option, but it may conflict with other code.\n\t\n\t// Option 3. Export eval and Function to a namespace:\n\tglobalThis.ClmtrackrAntiEval = { eval, Function };\n\t// This requires patching the library to use the namespace,\n\t// e.g. with const { eval, Function } = globalThis.ClmtrackrAntiEval ?? globalThis;\n\t// The fallback to globalThis allows to run without the generated monkey patch loaded,\n\t// which makes possible running the code collection process on the modified library,\n\t// which may or may not be useful.\n\t// (If you're updating the library, you'll likely have an unpatched version to run against anyway,\n\t// but if you're using an automated patching solution, it may be patched as soon as you update it,\n\t// and, another reason to re-run the code collection process is to trigger new code paths that weren't previously run.)\n\t// ------------------------------------------------------------\n})();`;\n\t\t\tconst blob = new Blob([code], { type: \"text/javascript\" });\n\t\t\tconst url = URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement(\"a\");\n\t\t\ta.href = url;\n\t\t\ta.download = \"no-eval.js\";\n\t\t\ta.textContent = \"Download no-eval.js\";\n\t\t\tdocument.body.appendChild(a);\n\t\t\ta.style.position = \"fixed\";\n\t\t\ta.style.bottom = \"10px\";\n\t\t\ta.style.right = \"10px\";\n\t\t\ta.style.fontSize = \"2em\";\n\t\t\ta.style.color = \"white\";\n\t\t\ta.style.backgroundColor = \"#07a\";\n\t\t\ta.style.padding = \"0.5em\";\n\t\t\ta.style.borderRadius = \"0.5em\";\n\t\t\ta.style.border = \"1px outset rgba(255,255,255,0.5)\";\n\t\t\ta.style.zIndex = \"1000000\";\n\t\t\ta.style.textDecoration = \"none\";\n\t\t\ta.style.boxShadow = \"0 0 0.5em 0.5em #07a2, 5px 5px 5px rgba(0,0,0,0.5)\";\n\t\t}\n\n\t\tsetTimeout(generateMonkeyPatch, 1000);\n\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "lib/tracky-mouse/website/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\t<meta charset=\"UTF-8\">\n\t<meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'self' 'unsafe-inline' blob:\">\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\t<title>Tracky Mouse</title>\n\t<meta name=\"description\" content=\"Control your computer with just a webcam.\">\n\t<link rel=\"preload\" href=\"core/lib/stats.js\" as=\"script\">\n\t<link rel=\"preload\" href=\"core/lib/no-eval.js\" as=\"script\">\n\t<link rel=\"preload\" href=\"core/lib/clmtrackr.js\" as=\"script\">\n\t<!-- TODO: figure out how to preload worker-context dependencies that use `importScripts` -->\n\t<!-- <link rel=\"preload\" href=\"core/lib/tf.js\" as=\"worker-importScripts-dependency?\"> -->\n\t<!-- <link rel=\"preload\" href=\"core/lib/facemesh/facemesh.js\" as=\"worker-importScripts-dependency?\"> -->\n\t<!-- <link rel=\"preload\" href=\"core/lib/jsfeat-min.js\" as=\"script\"> exported from patched clmtrackr.js -->\n\t<!-- TODO: defer loading tracky-mouse.css -->\n\t<!-- <link rel=\"preload\" href=\"core/tracky-mouse.css\" as=\"style\"> -->\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"core/tracky-mouse.css\">\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"tracky-mouse-homepage.css\">\n\t<link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"images/tracky-mouse-logo-16.png\">\n\t<link rel=\"icon\" type=\"image/png\" sizes=\"512x512\" href=\"images/tracky-mouse-logo-512.png\">\n</head>\n\n<body>\n\t<header>\n\t\t<img src=\"images/tracky-mouse-logo-512.png\" width=\"200\" height=\"200\" alt=\"\" class=\"logo\">\n\t\t<h1>Tracky Mouse</h1>\n\t\t<!-- <p class=\"tagline\">Control your computer with your head!</p> -->\n\t\t<p class=\"tagline\">Hands-free mouse control</p>\n\t\t<!-- <p class=\"tagline\">Hands-free computer control</p> -->\n\t</header>\n\t<section class=\"page-section\">\n\t\t<h2>Control your whole computer</h2>\n\t\t<p>\n\t\t\tInstall the desktop app to control your whole computer with just a webcam.\n\t\t</p>\n\t\t<p>\n\t\t\t<!-- TODO: download links for multiple platforms; detect platform, present download with dropdown similar to VS Code homepage, near top of page -->\n\t\t\t<a href=\"https://github.com/1j01/tracky-mouse/releases/download/v1.2.0/Tracky.Mouse.v1.1.0.Setup.exe\"\n\t\t\t\tclass=\"big-download-button\">\n\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 120 120\"\n\t\t\t\t\tstyle=\"vertical-align: middle; margin-right: 11px; height: 1em; transform: scale(1.7, 1.5) perspective(9px) rotateY(-10deg) translateY(-1px)\">\n\t\t\t\t\t<rect x=\"5\" y=\"5\" width=\"50\" height=\"50\" fill=\"white\" />\n\t\t\t\t\t<rect x=\"65\" y=\"5\" width=\"50\" height=\"50\" fill=\"white\" />\n\t\t\t\t\t<rect x=\"5\" y=\"65\" width=\"50\" height=\"50\" fill=\"white\" />\n\t\t\t\t\t<rect x=\"65\" y=\"65\" width=\"50\" height=\"50\" fill=\"white\" />\n\t\t\t\t</svg>\n\t\t\t\tDownload for Windows\n\t\t\t</a>\n\t\t\t<!-- <br>\n\t\t\t<a href=\"\" class=\"secondary-download-button\">Download for Windows</a>\n\t\t\t<br>\n\t\t\t<a href=\"\" class=\"secondary-download-button\">Download for Linux</a>\n\t\t\t<br>\n\t\t\t<a href=\"\" class=\"secondary-download-button\">Download for Mac</a> -->\n\t\t</p>\n\t\t<p>\n\t\t\t<a href=\"https://github.com/1j01/tracky-mouse/releases\">View All Releases</a>\n\t\t\t✦\n\t\t\t<a href=\"https://github.com/1j01/tracky-mouse?tab=readme-ov-file#install-desktop-app\">\n\t\t\t\tInstructions for other platforms\n\t\t\t</a>\n\t\t</p>\n\t</section>\n\t<section class=\"page-section\">\n\t\t<h2>Features</h2>\n\t\t<ul class=\"features-list\">\n\t\t\t<li>\n\t\t\t\t<img width=\"64\" height=\"64\" src=\"images/input-head.svg\" alt=\"Head with horizontal and vertical arrows\">\n\t\t\t\t<div>\n\t\t\t\t\t<h3>Head Tracking</h3>\n\t\t\t\t\t<p>Precisely control the mouse cursor by moving your head.</p>\n\t\t\t\t</div>\n\t\t\t</li>\n\t\t\t<li>\n\t\t\t\t<img width=\"64\" height=\"64\" src=\"images/dwell-clicking.svg\" alt=\"Mouse cursor with timer\">\n\t\t\t\t<div>\n\t\t\t\t\t<h3>Dwell Clicking</h3>\n\t\t\t\t\t<p>Click by hovering over a control for a set amount of time. Cancel by moving away.</p>\n\t\t\t\t</div>\n\t\t\t</li>\n\t\t\t<li>\n\t\t\t\t<img width=\"64\" height=\"64\" src=\"images/manual-takeback.svg\" alt=\"Mouse with hand grabbing it\">\n\t\t\t\t<!-- <img width=\"64\" height=\"64\" src=\"images/input-mouse.svg\" alt=\"Mouse with horizontal and vertical arrows\"> -->\n\t\t\t\t<div>\n\t\t\t\t\t<h3>Manual Takeback</h3>\n\t\t\t\t\t<p>Regain control of the mouse by simply moving it. Head tracking will pause temporarily.</p>\n\t\t\t\t</div>\n\t\t\t</li>\n\t\t\t<!-- <li>\n\t\t\t\t<img width=\"64\" height=\"64\" src=\"images/keyboard-shortcuts.svg\" alt=\"Keyboard with keys highlighted\">\n\t\t\t\t<div>\n\t\t\t\t\t<h3>Keyboard Shortcuts</h3>\n\t\t\t\t\t<p>Use the keyboard to toggle head tracking, dwell clicking, and more.</p>\n\t\t\t\t</div>\n\t\t\t</li> -->\n\t\t\t<li>\n\t\t\t\t<img width=\"64\" height=\"64\" src=\"images/sliders.svg\" alt=\"Sliders\">\n\t\t\t\t<div>\n\t\t\t\t\t<h3>Settings</h3>\n\t\t\t\t\t<p>Adjust the sensitivity and smoothing of head tracking.</p>\n\t\t\t\t</div>\n\t\t\t</li>\n\t\t\t<!-- <li>\n\t\t\t\t<img width=\"64\" height=\"64\" src=\"images/gestures.svg\" alt=\"Facial gestures\">\n\t\t\t\t<div>\n\t\t\t\t\t<h3>Gestures</h3>\n\t\t\t\t\t<p>Blink, smile, or raise your eyebrows to trigger actions.</p>\n\t\t\t\t</div>\n\t\t\t</li> -->\n\t\t\t<!-- <li>\n\t\t\t\t<img width=\"64\" height=\"64\" src=\"images/open-source.svg\" alt=\"Open source logo\">\n\t\t\t\t<div>\n\t\t\t\t\t<h3>Free and Open Source</h3>\n\t\t\t\t\t<p>The software is yours forever.</p>\n\t\t\t\t</div>\n\t\t\t</li> -->\n\t\t\t<!-- <li>\n\t\t\t\t<img width=\"64\" height=\"64\" src=\"images/embeddable.svg\" alt=\"Embedding support\">\n\t\t\t\t<div>\n\t\t\t\t\t<h3>Embeddable</h3>\n\t\t\t\t\t<p>Web apps can embed Tracky Mouse.</p>\n\t\t\t\t\t(or: Web apps can include a full Tracky Mouse experience, or: Web apps can use Tracky Mouse as a library)\n\t\t\t\t\t(see: API)\n\t\t\t\t</div>\n\t\t\t</li> -->\n\t\t\t<!-- <li>\n\t\t\t\t<img width=\"64\" height=\"64\" src=\"images/voice-control.svg\" alt=\"Voice control\">\n\t\t\t\t<div>\n\t\t\t\t\t<h3>Voice Control</h3>\n\t\t\t\t\t(or: External Control, or: Interoperability, or: Command Line Interface)\n\t\t\t\t\t<p>Tracky Mouse can be controlled by external voice recognition software.</p>\n\t\t\t\t\t(see: CLI)\n\t\t\t\t</div>\n\t\t\t</li> -->\n\t\t</ul>\n\t</section>\n\t<section class=\"page-section\">\n\t\t<h2>The best of both worlds</h2>\n\t\t<p>\n\t\t\tTracky Mouse combines state-of-the-art face detection with tried-and-true optical flow tracking\n\t\t\tto precisely control mouse movement with your head.\n\t\t</p>\n\t\t<div class=\"comparison-left-right\">\n\t\t\t<p>\n\t\t\t\t<img src=\"images/enable-viacam.png\" width=\"220\" height=\"220\" alt=\"\">\n\t\t\t\t<a href=\"https://eviacam.crea-si.com/\"><b>Enable Viacam</b></a>\n\t\t\t\tuses optical flow to track the movement of points on your face,\n\t\t\t\tbut it has trouble finding your face in the first place.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<img src=\"images/project-gameface.png\" width=\"220\" height=\"220\" alt=\"\">\n\t\t\t\t<a href=\"https://blog.google/technology/ai/google-project-gameface/\"><b>Project Gameface</b></a>\n\t\t\t\tuses state-of-the art machine learning model FaceMesh to find your face,\n\t\t\t\tbut cursor movement is very jittery because it uses the face position information directly.\n\t\t\t</p>\n\t\t</div>\n\t\t<div class=\"comparison-middle\">\n\t\t\t<p>\n\t\t\t\t<b>Tracky Mouse</b> works like Enable Viacam, tracking points on your face precisely with optical flow,\n\t\t\t\tbut it uses state-of-the-art face detection to place those points.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tSince the face detection is so good, it can place the points not just on your face,\n\t\t\t\tbut at locations on your face that are ideal for tracking, and it can prune away the points\n\t\t\t\twhen they stray from those specific locations on your face.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tThe result is a system that's <b>more accurate than either.</b>\n\t\t\t</p>\n\t\t</div>\n\t</section>\n\t<section class=\"cursors-background\">\n\t\t<h2>Who is this for?</h2>\n\t\t<p>\n\t\t\tPeople who have limited mobility, due to motor neuron diseases like ALS,\n\t\t\tor other conditions that make it difficult to use a mouse,\n\t\t\tcan greatly benefit from hands-free computer control.\n\t\t</p>\n\t\t<p>\n\t\t\tI hope to make it good enough that people want to use it even for common repetitive strain injuries like\n\t\t\tcarpal tunnel syndrome.\n\t\t</p>\n\t\t<p>\n\t\t\tIt's also just fun! It feels like controlling the computer with your mind.\n\t\t</p>\n\t\t<p>\n\t\t\tEver wanted to use your computer while playing guitar, or while eating a sandwich?\n\t\t\tMaybe Tracky Mouse is for you!\n\t\t</p>\n\t</section>\n\t<section class=\"page-section\">\n\t\t<h2>Try it out</h2>\n\t\t<p>\n\t\t\tYou can try out Tracky Mouse right here in your browser.\n\t\t</p>\n\t\t<p>\n\t\t\tJust click to allow camera access, and then adjust the settings until it feels comfortable pointing to any\n\t\t\tpart of the screen.\n\t\t</p>\n\t\t<p>\n\t\t\tIf you scroll down, there is an area where you can practice pointing at targets.\n\t\t</p>\n\t\t<!-- TODO: maybe expose \"Use Demo Footage\" option I've used for testing?\n\t\t\tI'm a bit worried about bloating the size of the repo with demo footage though.\n\t\t\tAlso, it would probably work better to just embed a video showing the software in action.\n\t\t\tThat way it could give more context for how its used, not just demonstrate the head tracking.\n\t\t-->\n\t\t<div id=\"tracky-mouse-demo\">\n\t\t\t<p id=\"tracky-mouse-demo-placeholder\">\n\t\t\t\tA demo of Tracky Mouse should appear here.\n\t\t\t</p>\n\t\t\t<p id=\"tracky-mouse-demo-error\" hidden>\n\t\t\t</p>\n\t\t\t<noscript>\n\t\t\t\t<p>\n\t\t\t\t\tTracky Mouse requires JavaScript to run.\n\t\t\t\t</p>\n\t\t\t</noscript>\n\t\t\t<script>\n\t\t\t\t// Only ES5 syntax here please\n\t\t\t\twindow.onerror = function (message, source, lineno, colno, error) {\n\t\t\t\t\tvar isIE = /Trident|MSIE/.test(window.navigator.userAgent);\n\t\t\t\t\tvar errorElement = document.getElementById(\"tracky-mouse-demo-error\");\n\t\t\t\t\tif (!errorElement) {\n\t\t\t\t\t\t// Tracky Mouse UI already loaded\n\t\t\t\t\t\t// Might still be good to show the error, but it also might not be a showstopper.\n\t\t\t\t\t\t// For now, just ignore it, to avoid an additional error during error handling.\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\terrorElement.hidden = false;\n\t\t\t\t\tif (isIE) {\n\t\t\t\t\t\terrorElement.textContent = \"Internet Explorer is not supported. Please use a modern browser like Chrome, Firefox, or Edge.\";\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\terrorElement.textContent = message;\n\t\t\t\t\tvar location = source + \":\" + lineno + \":\" + colno;\n\t\t\t\t\tvar locationElement = document.createElement(\"code\");\n\t\t\t\t\tlocationElement.textContent = location;\n\t\t\t\t\terrorElement.appendChild(document.createElement(\"br\"));\n\t\t\t\t\terrorElement.appendChild(locationElement);\n\t\t\t\t};\n\t\t\t</script>\n\t\t</div>\n\t\t<h3 style=\"font-weight: normal; font-size: 5em; opacity: 0.5; margin: 0.2em; text-align: center;\">\n\t\t\tArchery Practice Area\n\t\t\t<!-- 🏹 -->\n\t\t\t<!-- Could be nice to represent the bow and arrow, but an emoji isn't cutting it for me. -->\n\t\t</h3>\n\t\t<!-- margin is radius of largest target -->\n\t\t<div id=\"archery-demo\" style=\"position: relative; height: 400px; margin: 100px;\">\n\t\t\t<div id=\"archery-scoreboard\"></div>\n\t\t\t<button class=\"archery-target\" style=\"--diameter: 200px; top: 50%; left: 50%\"\n\t\t\t\taria-label=\"archery target\"></button>\n\t\t\t<button class=\"archery-target\" style=\"--diameter: 100px; top: 0%; left: 0%\"\n\t\t\t\taria-label=\"archery target\"></button>\n\t\t\t<button class=\"archery-target\" style=\"--diameter: 100px; top: 0%; left: 100%\"\n\t\t\t\taria-label=\"archery target\"></button>\n\t\t\t<button class=\"archery-target\" style=\"--diameter: 100px; top: 100%; left: 0%\"\n\t\t\t\taria-label=\"archery target\"></button>\n\t\t\t<button class=\"archery-target\" style=\"--diameter: 100px; top: 100%; left: 100%\"\n\t\t\t\taria-label=\"archery target\"></button>\n\t\t</div>\n\t</section>\n\t<section class=\"page-section\">\n\t\t<h2>Embed in your own web application</h2>\n\t\t<p>\n\t\t\tMost of the functionality of Tracky Mouse is available as a JavaScript library.\n\t\t</p>\n\t\t<p>\n\t\t\tYou can use it to add head tracking and dwell clicking to your own web application.\n\t\t</p>\n\t\t<p>\n\t\t\tCheck out the\n\t\t\t<a href=\"https://github.com/1j01/tracky-mouse/blob/main/core/README.md#tracky-mouse-api\">API\n\t\t\t\tdocumentation</a>\n\t\t\t<!-- <a href=\"https://www.npmjs.com/package/tracky-mouse\">API documentation</a> -->\n\t\t\tfor more information.\n\t\t</p>\n\t\t<p>\n\t\t\t<a href=\"https://jspaint.app/about\">JS Paint</a> uses Tracky Mouse for dwell clicking in its\n\t\t\t<a href=\"https://jspaint.app/#eye-gaze-mode\">Eye Gaze Mode</a>.\n\t\t</p>\n\t</section>\n\t<section class=\"page-section\">\n\t\t<h2>Technical Info</h2>\n\t\t<p>\n\t\t\tThis is a head tracking system similar to <a href=\"https://eviacam.crea-si.com/\">eViacam</a>,\n\t\t\tusing <a href=\"https://en.wikipedia.org/wiki/Lucas%E2%80%93Kanade_method\">Lucas–Kanade optical flow</a>\n\t\t\tto track points for high accuracy,\n\t\t\tand face detection for understanding of where to place tracking points.\n\t\t\tIt uses two different face detectors, a fast-to-load one\n\t\t\t(<a href=\"https://github.com/auduno/clmtrackr\">clmtrackr.js</a>)\n\t\t\tand a slower to load but much more accurate one\n\t\t\t(<a href=\"https://github.com/tensorflow/tfjs-models/tree/master/face-landmarks-detection\">FaceMesh</a>),\n\t\t\twhich it switches to automatically when available.\n\t\t</p>\n\t\t<p>\n\t\t\t<a href=\"https://inspirit.github.io/jsfeat/\">JSFeat</a>\n\t\t\tis used for optical flow, and clmtrackr.js also uses JSFeat,\n\t\t\tso I patched clmtrackr.js to export JSFeat so it doesn't need to be loaded twice.\n\t\t</p>\n\t\t<p>\n\t\t\tclmtrackr.js used <code>eval</code> heavily, but I created\n\t\t\t<a href=\"eval-is-evil.html\">a tool that eliminates the need for <code>eval</code></a>\n\t\t\tby running the code and seeing what it tries to evaluate,\n\t\t\tand creating functions that do the same thing.\n\t\t\tThis allows Tracky Mouse to run in a context secured with <code>Content-Security-Policy</code>.\n\t\t</p>\n\t</section>\n\t<section class=\"page-section\">\n\t\t<h2>Source Code</h2>\n\t\t<p><a href=\"https://github.com/1j01/tracky-mouse\">Open source on GitHub.</a> MIT-licensed.</p>\n\t</section>\n\t<section class=\"page-section\">\n\t\t<h2>Privacy Policy</h2>\n\t\t<p>\n\t\t\tAll processing is done locally on your computer.\n\t\t</p>\n\t\t<p>\n\t\t\tTracky Mouse does not store any personally identifiable information.\n\t\t</p>\n\t\t<p>\n\t\t\tTracky Mouse may use a third-party service to report errors,\n\t\t\tincluding some context about how you've configured the software.\n\t\t</p>\n\t</section>\n\t<section class=\"page-section\">\n\t\t<h2>Feedback</h2>\n\t\t<p>\n\t\t\tPlease <a href=\"mailto:isaiahodhner@gmail.com\">email me</a> with any feedback or questions,\n\t\t\tor <a href=\"https://github.com/1j01/tracky-mouse/issues\">open an issue on GitHub</a>.\n\t\t</p>\n\t</section>\n\t<script defer src=\"core/tracky-mouse.js\"></script>\n\t<!-- `<script type=\"module\">` is implicitly deferred, so this will load after the library despite `defer` on the library -->\n\t<script type=\"module\" src=\"demo.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "lib/tracky-mouse/website/package.json",
    "content": "{\n  \"private\": true,\n  \"name\": \"tracky-mouse-website\",\n  \"version\": \"1.2.0\",\n  \"description\": \"Website for Tracky Mouse\",\n  \"devDependencies\": {\n    \"gh-pages\": \"^6.1.1\",\n    \"live-server\": \"^1.2.1\"\n  },\n  \"scripts\": {\n    \"start\": \"live-server --port=64206\",\n    \"deploy:@TODO\": \"echo 'Please make the deploy script efficient with rsync or something.'\",\n    \"deploy\": \"cp -rL . ../dist && rm -rf ../dist/node_modules && rm ../dist/package-lock.json && rm ../dist/package.json && gh-pages -d ../dist\"\n  },\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "lib/tracky-mouse/website/tracky-mouse-homepage.css",
    "content": "html {\n\tbackground-color: white;\n\tcolor: black;\n\tfont-family: sans-serif;\n}\n\nbody {\n\tmax-width: 70em;\n\tmax-width: min(70em, calc(100% - 2em));\n\tmargin: 0 auto;\n}\n\n@media (prefers-color-scheme: dark) {\n\thtml {\n\t\tbackground-color: black;\n\t\tcolor: white;\n\t}\n\n\ta:link {\n\t\tcolor: aquamarine;\n\t}\n\n\ta:visited {\n\t\tcolor: rgb(197, 127, 255);\n\t}\n}\n\nheader {\n\ttext-align: center;\n\tmargin-top: 2em;\n}\n\nheader h1 {\n\tfont-size: 2.6em;\n\tmargin-bottom: 0;\n}\n\nheader .tagline {\n\tfont-size: 1.5em;\n\tmargin-top: 0.3em;\n}\n\nheader .logo {\n\tfilter: drop-shadow(0 0 0.8em rgb(0, 217, 255));\n}\n\n.page-section {\n\tmargin-top: 3em;\n\tmargin-bottom: 3em;\n}\n\n.features-list {\n\tmax-width: 50em;\n\tmargin: 0 auto;\n\tpadding: 0;\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fit, minmax(320px, 1fr));\n\tgrid-gap: 1rem;\n\tlist-style-type: none;\n}\n\n.features-list>li {\n\tmargin: 1em;\n\tpadding: 1em;\n\tbackground-color: rgb(73, 77, 80);\n\tcolor: white;\n\tborder-radius: 0.5em;\n}\n\n.features-list>li>h3 {\n\ttext-align: center;\n}\n\n.features-list>li>img {\n\tdisplay: block;\n\tmargin: 0 auto;\n\twidth: 75%;\n\theight: auto;\n\tmin-height: 100px;\n\tmax-height: 220px;\n}\n\n/* Applies to IE10-11; fixes image aspect ratio; not important, feel free to remove this */\n@media all and (-ms-high-contrast: none),\n(-ms-high-contrast: active) {\n\t.features-list>li>img {\n\t\twidth: auto;\n\t}\n}\n\n.comparison-left-right {\n\tdisplay: flex;\n\tjustify-content: space-around;\n\ttext-align: center;\n\tmax-width: 50em;\n\tmargin: 0 auto;\n}\n\n.comparison-left-right p {\n\tflex: 1 1 auto;\n\tmax-width: 45%;\n}\n\n@media (max-width: 30em) {\n\t.comparison-left-right {\n\t\tflex-direction: column;\n\t}\n\n\t.comparison-left-right p {\n\t\tmax-width: 100%;\n\t}\n}\n\n.comparison-left-right img {\n\tdisplay: block;\n\tmargin: 0 auto;\n\tmargin-bottom: 0.8em;\n\twidth: 50%;\n\theight: auto;\n}\n\n.comparison-middle {\n\tmax-width: 40em;\n\tmargin: 0 auto;\n\ttext-align: center;\n}\n\na.big-download-button {\n\tdisplay: inline-block;\n\tpadding: 0.8em 1em;\n\tbackground-color: rgb(0, 96, 206);\n\tcolor: white;\n\ttext-decoration: none;\n\tborder-radius: 0.5em;\n}\n\n.cursors-background {\n\t/*background-image: url(images/cursor-tesselation-ceramic-random-colors.svg);*/\n\t/*background-image: url(images/cursor-tesselation-curved-random-colors.svg);*/\n\tbackground-image: url(images/cursor-tesselation-melted-rainbow.svg);\n\tbackground-size: 100%;\n\tbackground-color: rgb(234, 215, 255);\n\tbackground-blend-mode: overlay;\n\tbackground-attachment: fixed;\n\tpadding: 1em;\n\tborder-radius: 1em / 10em;\n}\n\n@media (prefers-color-scheme: dark) {\n\t.cursors-background {\n\t\tbackground-color: rgb(86, 39, 124);\n\t}\n}\n\n.tracky-mouse-ui #tracky-mouse-demo-placeholder {\n\tdisplay: none;\n}\n\n#tracky-mouse-demo:not(.tracky-mouse-ui) {\n\ttext-align: center;\n\tmin-height: 300px;\n\t/* WET: styles copied from .tracky-mouse-ui */\n\tbackground-color: rgb(223, 204, 255);\n\tcolor: black;\n\tpadding: 10px;\n\tborder-radius: 5px;\n\tmax-width: 600px;\n\tbox-sizing: border-box;\n}\n\n#tracky-mouse-demo-error {\n\tcolor: rgb(255, 182, 182);\n\tbackground-color: rgb(136, 0, 0);\n\tpadding: 1em;\n\tborder-radius: 0.2em;\n}\n\n.archery-target {\n\tbackground: radial-gradient(circle, rgba(255, 255, 255, 1) 24%, rgba(255, 0, 0, 1) 25%, rgba(255, 0, 0, 1) 48%, rgba(255, 255, 255, 1) 49%, rgba(255, 255, 255, 1) 66%, rgba(255, 0, 0, 1) 67%, rgba(255, 0, 0, 1) 100%);\n\tborder-radius: 50%;\n\tborder: 2px solid #222;\n\twidth: 100px;\n\theight: 100px;\n\twidth: var(--diameter, 100px);\n\theight: var(--diameter, 100px);\n\tposition: absolute;\n\ttransform: translate(-50%, -50%);\n\t/* `center` for basic hit animation, `center bottom` for hinge hit animation */\n\ttransform-origin: center bottom;\n}\n\n.round-over .archery-target {\n\tbackground: radial-gradient(circle, rgba(255, 255, 255, 1) 24%, rgb(97, 216, 0) 25%, rgb(97, 216, 0) 48%, rgba(255, 255, 255, 1) 49%, rgba(255, 255, 255, 1) 66%, rgb(97, 216, 0) 67%, rgb(97, 216, 0) 100%);\n}\n\n#archery-scoreboard {\n\tposition: absolute;\n\ttop: 77.7%;\n\tleft: 0;\n\tright: 0;\n\ttext-align: center;\n\tfont-size: 2rem;\n}\n\n#archery-scoreboard .slot-indicator {\n\tfont-size: 1.2rem;\n\tcolor: gray;\n\tmargin-top: 0;\n\tmargin-bottom: 0.5rem;\n}\n\n#archery-scoreboard .best-times-label {\n\tfont-size: 1rem;\n\tmargin-bottom: 0.5rem;\n}\n\n#archery-scoreboard ul {\n\tlist-style-type: none;\n\tpadding: 0;\n\tfont-size: 1rem;\n\ttext-align: left;\n\tmargin: 0 auto;\n\t/* display: inline-block; */\n\twidth: fit-content;\n}\n\n#archery-scoreboard li.new-best-time span {\n\tcolor: rgb(97, 216, 0);\n\tfont-weight: bold;\n\tfont-style: italic;\n}\n\n/*@keyframes archery-target-hit-basic {\n\t0% {\n\t\ttransform: translate(-50%, -50%) scale(1);\n\t}\n\n\t50% {\n\t\ttransform: translate(-50%, -50%) scale(1.2);\n\t}\n\n\t100% {\n\t\ttransform: translate(-50%, -50%) scale(1);\n\t}\n}*/\n/*@keyframes archery-target-spin {\n\t0% {\n\t\ttransform: translate(-50%, -50%) rotateY(0deg);\n\t}\n\n\t100% {\n\t\ttransform: translate(-50%, -50%) rotateY(3600deg);\n\t}\n}*/\n/*@keyframes archery-target-hit {\n\t0% {\n\t\ttransform: translate(-50%, -50%) rotateX(0deg);\n\t}\n\n\t50% {\n\t\ttransform: translate(-50%, -50%) rotateX(200deg);\n\t}\n\n\t60% {\n\t\ttransform: translate(-50%, -50%) rotateX(160deg);\n\t}\n\n\t70% {\n\t\ttransform: translate(-50%, -50%) rotateX(190deg);\n\t}\n\n\t80% {\n\t\ttransform: translate(-50%, -50%) rotateX(176deg);\n\t}\n\n\t90% {\n\t\ttransform: translate(-50%, -50%) rotateX(183deg);\n\t}\n\n\t100% {\n\t\ttransform: translate(-50%, -50%) rotateX(180deg);\n\t}\n}*/"
  },
  {
    "path": "localization/ar/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"ar\", {\n\t\"Attributes\": \"السمات\",\n\t\"&Width:\": \"ال&عرض:\",\n\t\"Width:\": \"العرض:\",\n\t\"&Height:\": \"الار&تفاع:\",\n\t\"Height:\": \"الارتفاع:\",\n\t\"Units\": \"الوحدة\",\n\t\"&Inches\": \"بو&صة\",\n\t\"Inches\": \"بوصة\",\n\t\"C&m\": \"&سم\",\n\t\"Cm\": \"سم\",\n\t\"&Pixels\": \"ب&كسل\",\n\t\"Pixels\": \"بكسل\",\n\t\"Colors\": \"‏‏ألوان\",\n\t\"&Black and white\": \"أسو&د وأبيض\",\n\t\"Black and white\": \"أسود وأبيض\",\n\t\"Co&lors\": \"ألو&ان\",\n\t\"Transparency\": \"الشفافية\",\n\t\"Use &Transparent background color\": \"استخدام لون خلفية &شفاف\",\n\t\"Use Transparent background color\": \"استخدام لون خلفية شفاف\",\n\t\"Select &Color\": \"تحديد &لون\",\n\t\"Select Color\": \"‏‏تحديد لون\",\n\t\"OK\": \"موافق\",\n\t\"Cancel\": \"إلغاء الأمر\",\n\t\"&Default\": \"افترا&ضي\",\n\t\"Default\": \"افتراضي\",\n\t\"Custom Zoom\": \"تكبير/تصغير مخصص\",\n\t\"Current zoom:\": \"التكبير/التصغير الحالي:\",\n\t\"Zoom to\": \"تكبير/تصغير إلى\",\n\t\"Flip and Rotate\": \"الانعكاس والاستدارة\",\n\t\"Flip or rotate\": \"الانعكاس أو الاستدارة\",\n\t\"&Flip horizontal\": \"&انعكاس أفقي\",\n\t\"Flip horizontal\": \"انعكاس أفقي\",\n\t\"Flip &vertical\": \"ا&نعكاس عمودي\",\n\t\"Flip vertical\": \"انعكاس عمودي\",\n\t\"&Rotate by angle\": \"ا&ستدارة بزاوية\",\n\t\"Rotate by angle\": \"استدارة بزاوية\",\n\t\"Stretch and Skew\": \"التمدد والانحراف\",\n\t\"Stretch\": \"التمدد\",\n\t\"&Horizontal:\": \"أف&قياً:\",\n\t\"Horizontal:\": \"أفقياً:\",\n\t\"&Vertical:\": \"&عمودياً:\",\n\t\"Vertical:\": \"عمودياً:\",\n\t\"Skew\": \"الانحراف\",\n\t\"H&orizontal:\": \"أ&فقياً:\",\n\t\"Degrees\": \"درجة\",\n\t\"V&ertical:\": \"ع&مودياً:\",\n\t\"Color Table\": \"جدول الألوان\",\n\t\"New\": \"جديد\",\n\t\"&New \": \"&جديد\",\n\t\"New \": \"جديد\",\n\t\"&Help\": \"&تعليمات\",\n\t\"Help\": \"تعليمات\",\n\t\"Printing\": \"طباعة\",\n\t\"on the\": \"على\",\n\t\"&Print\": \"&طباعة\",\n\t\"Print\": \"طباعة\",\n\t\"&Next Page\": \"الصفحة ال&تالية\",\n\t\"Next Page\": \"الصفحة التالية\",\n\t\"Pre&v Page\": \"الصفحة ال&سابقة\",\n\t\"Prev Page\": \"الصفحة السابقة\",\n\t\"Zoom &In\": \"ت&كبير\",\n\t\"Zoom In\": \"تكبير\",\n\t\"Zoom &Out\": \"ت&صغير\",\n\t\"Zoom Out\": \"تصغير\",\n\t\"&Close\": \"إ&غلاق\",\n\t\"Close\": \"إغلاق\",\n\t\"Grid Settings\": \"إعدادات الشبكة\",\n\t\"&Pixel Grid\": \"شب&كة بكسل\",\n\t\"Pixel Grid\": \"شبكة بكسل\",\n\t\"&Tile Grid\": \"&شبكة تجانب\",\n\t\"Tile Grid\": \"شبكة تجانب\",\n\t\"pixels\": \"بكسل\",\n\t\"H&eight:\": \"الار&تفاع:\",\n\t\"Text\": \"نص\",\n\t\"Undo\": \"تراجع\",\n\t\"Cut\": \"قص\",\n\t\"Copy\": \"نسخ\",\n\t\"Paste\": \"لصق\",\n\t\"Clear Selection\": \"مسح التحديد\",\n\t\"Select All\": \"تحديد الكل\",\n\t\"Text Toolbar\": \"شريط أدوات نص\",\n\t\"Selection\": \"التحديد\",\n\t\"Cu&t\": \"&قص\",\n\t\"&Copy\": \"ن&سخ\",\n\t\"&Paste\": \"&لصق\",\n\t\"C&lear Selection\": \"&مسح التحديد\",\n\t\"Select &All\": \"تحديد ال&كل\",\n\t\"C&opy To\": \"&نسخ إلى\",\n\t\"Copy To\": \"‏‏نسخ إلى\",\n\t\"Paste &From\": \"ل&صق من\",\n\t\"Paste From\": \"‏‏لصق من\",\n\t\"Flip/&Rotate\": \"&انعكاس/استدارة\",\n\t\"Flip/Rotate\": \"انعكاس/استدارة\",\n\t\"&Stretch/Skew\": \"&تمدد/انحراف\",\n\t\"Stretch/Skew\": \"تمدد/انحراف\",\n\t\"&Invert Colors\": \"&عكس الألوان\",\n\t\"Invert Colors\": \"عكس الألوان\",\n\t\"Thumbnail\": \"مصغرة\",\n\t\"&File\": \"&ملف\",\n\t\"File\": \"ملف\",\n\t\"&New\": \"&جديد\",\n\t\"&Open\": \"&فتح\",\n\t\"Open\": \"فتح\",\n\t\"&Save\": \"&حفظ\",\n\t\"Save\": \"حفظ\",\n\t\"Save &As\": \"حفظ &باسم\",\n\t\"Save As\": \"حفظ باسم\",\n\t\"Print Pre&view\": \"&معاينة قبل الطباعة\",\n\t\"Print Preview\": \"معاينة قبل الطباعة\",\n\t\"Page Se&tup\": \"إ&عداد الصفحة\",\n\t\"Page Setup\": \"إعداد الصفحة\",\n\t\"S&end\": \"إرس&ال\",\n\t\"Send\": \"إرسال\",\n\t\"Set As &Wallpaper (Tiled)\": \"تعيين كخلفية للشاشة (متجانب)\",\n\t\"Set As Wallpaper (Tiled)\": \"تعيين كخلفية للشاشة (متجانب)\",\n\t\"Set As Wa&llpaper (Centered)\": \"تعيين كخلفية للشاشة (موسّط)\",\n\t\"Set As Wallpaper (Centered)\": \"تعيين كخلفية للشاشة (موسّط)\",\n\t\"Recent File\": \"الملف الأخير\",\n\t\"E&xit\": \"إن&هاء\",\n\t\"Exit\": \"إنهاء\",\n\t\"&Edit\": \"ت&حرير\",\n\t\"Edit\": \"تحرير\",\n\t\"&Undo\": \"ترا&جع\",\n\t\"&Repeat\": \"&تكرار\",\n\t\"Repeat\": \"تكرار\",\n\t\"&View\": \"&عرض\",\n\t\"View\": \"عرض\",\n\t\"&Tool Box\": \"مربع الأ&دوات\",\n\t\"Tool Box\": \"مربع الأدوات\",\n\t\"&Color Box\": \"&مربع الألوان\",\n\t\"Color Box\": \"مربع الألوان\",\n\t\"&Status Bar\": \"شريط المع&لومات\",\n\t\"Status Bar\": \"شريط المعلومات\",\n\t\"T&ext Toolbar\": \"شريط أدوات ال&نص\",\n\t\"&Zoom\": \"تكبير/ت&صغير\",\n\t\"Zoom\": \"تكبير/تصغير\",\n\t\"&Normal Size\": \"&حجم عادي\",\n\t\"Normal Size\": \"حجم عادي\",\n\t\"&Large Size\": \"حجم &كبير\",\n\t\"Large Size\": \"حجم كبير\",\n\t\"C&ustom\": \"م&خصص\",\n\t\"Custom\": \"مخصص\",\n\t\"Show &Grid\": \"إظهار ال&شبكة\",\n\t\"Show Grid\": \"إظهار الشبكة\",\n\t\"Show T&humbnail\": \"إظهار الم&صغّرة\",\n\t\"Show Thumbnail\": \"إظهار المصغّرة\",\n\t\"&View Bitmap\": \"&عرض صورة نقطية\",\n\t\"View Bitmap\": \"عرض صورة نقطية\",\n\t\"&Image\": \"&صورة\",\n\t\"Image\": \"صورة\",\n\t\"&Flip/Rotate\": \"&انعكاس/استدارة\",\n\t\"&Attributes\": \"&سمات\",\n\t\"&Clear Image\": \"&مسح الصورة\",\n\t\"Clear Image\": \"مسح الصورة\",\n\t\"&Draw Opaque\": \"&رسم كامد\",\n\t\"Draw Opaque\": \"رسم كامد\",\n\t\"&Colors\": \"أ&لوان\",\n\t\"&Edit Colors\": \"&تحرير الألوان\",\n\t\"Edit Colors\": \"‏‏تحرير الألوان\",\n\t\"&Help Topics\": \"&مواضيع التعليمات\",\n\t\"Help Topics\": \"مواضيع التعليمات\",\n\t\"&About Paint\": \"&حول الرسام\",\n\t\"About Paint\": \"حول الرسام\",\n\t\"&Update\": \"&تحديث\",\n\t\"Update\": \"تحديث\",\n\t\"Save Copy &As\": \"&حفظ نسخة باسم\",\n\t\"Save Copy As\": \"حفظ نسخة باسم\",\n\t\"Paint\": \"الرسام\",\n\t\"untitled\": \"بدون عنوان\",\n\t\"Bitmap Image\": \"صورة نقطية\",\n\t\"Bitmap Files (*.bmp)\": \"ملفات صور نقطية (*.bmp)\",\n\t\"Paint.Picture\": \"صورة الرسام\",\n\t\"PCX Files\": \"ملفات PCX\",\n\t\"Icon Files\": \"ملفات رموز\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"صورة نقطية أحادية اللون (*.bmp,*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"صورة نقطية 16 لون (*.bmp,*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"صورة نقطية 256 لون (*.bmp,*.dib)\",\n\t\"Paint cannot open this file.\": \"‏‏لا يستطيع الرسام فتح هذا الملف.\",\n\t\"Paint cannot read this file.\": \"‏‏لا يستطيع الرسام قراءة هذا الملف.\",\n\t\"This file is read-only.\": \"‏‏هذا الملف للقراءة فقط.\",\n\t\"To save your changes, use a different filename.\": \"استخدم اسم ملف آخر لحفظ تعديلاتك.\",\n\t\"This file is already open.\": \"‏‏هذا الملف مفتوح مسبقاً.\",\n\t\"This is not a valid .PCS file.\": \"‏‏هذا ليس ملف .PCS صالحاً.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"‏‏هذا الملف مفتوح للتحرير ولا يمكن الكتابة فوقه.\",\n\t\"Use a different filename to save your changes.\": \"استخدم اسم ملف آخر لحفظ تعديلاتك.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"‏‏هذا الملف ملف صورة نقطية غير صالح أو أن تنسيقه غير معتمد حالياً.\",\n\t\"This is not a valid icon.\": \"‏‏هذا الرمز غير صالح.\",\n\t\"This is not a valid cursor.\": \"‏‏رأس المؤشر هذا غير صالح.\",\n\t\"Save was interrupted, so your file has not been saved.\": \"‏‏تمت مقاطعة عملية الحفظ، لذا لم يتم حفظ ملفك.\",\n\t\"You cannot save to a read-only file.\": \"‏‏لا يمكنك الحفظ في ملف قراءة فقط.\",\n\t\"Use a different file name.\": \"استخدم اسم ملف آخر.\",\n\t\"This file is already in use.\": \"‏‏هذا الملف مستخدم مسبقاً.\",\n\t\"Close the program, and then try again.\": \"أغلق البرنامج وحاول ثانيةً.\",\n\t\"Paint cannot save this file.\": \"‏‏لا يستطيع الرسام حفظ هذا الملف.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"‏‏لا يمكن للرسام أن يحفظ في اسم الملف نفسه مستخدماً نوع ملف مختلفاً.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"‏‏يجب أن يكون تباعد الشبكة رقماً صحيحاً بين %d و %d.\",\n\t\"There is not enough memory or resources to complete operation.\": \"‏‏لا توجد ذاكرة أو مصادر كافية لإتمام العملية.\",\n\t\"Close some programs, and then try again.\": \"أغلق بعض البرامج ثم حاول ثانيةً.\",\n\t\"Low on memory or resources.\": \"‏‏نقص في الذاكرة أو المصادر.\",\n\t\"Group error.\": \"‏‏خطأ مجموعة.\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"‏‏لم يتمكن الرسام من طباعة وثيقتك. يرجى التأكد من وجود مساحة كافية على القرص وأن الطابعة تعمل بشكل صحيح.\",\n\t\"Saving into this format may cause some loss of color information.\": \"‏‏يؤدي الحفظ بهذا التنسيق إلى فقدان بعض معلومات اللون.\",\n\t\"Do you want to continue?\": \"هل تريد المتابعة؟\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"‏‏لا يمكن التراجع عن عملية التحويل إلى أسود وأبيض. يؤدي هذا إلى التأثير على الملف الحالي وقد يؤدي إلى فقدان بعض معلومات اللون.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"‏‏يجب أن تكون الصور النقطية أكبر من نقطة واحدة في الطرف.\",\n\t\"Generic error.\": \"‏‏خطأ عام.\",\n\t\"File not found.\": \"‏‏الملف غير موجود.\",\n\t\"Bad path.\": \"‏‏مسار غير صالح.\",\n\t\"Too many open files.\": \"‏‏عدد كبير من الملفات المفتوحة.\",\n\t\"Access denied.\": \"‏‏لم يسمح بالوصول.\",\n\t\"Invalid file.\": \"‏‏ملف غير صالح.\",\n\t\"Remove current folder.\": \"‏‏أزل المجلد الحالي.\",\n\t\"Folder full.\": \"‏‏المجلد ممتلئ.\",\n\t\"Bad seek.\": \"‏‏إيجاد خاطئ.\",\n\t\"Hard IO error.\": \"‏‏خطأ إدخال/إخراج في التجهيزات.\",\n\t\"Sharing violation.\": \"‏‏انتهاك في المشاركة.\",\n\t\"Lock violation.\": \"‏‏انتهاك التأمين.\",\n\t\"Disk full.\": \"‏‏القرص ممتلئ.\",\n\t\"End of file.\": \"‏‏نهاية الملف.\",\n\t\"Error getting the Clipboard Data!\": \"‏‏خطأ في إحضار بيانات الحافظة!\",\n\t\"No Printer Found @ page setup\": \"‏‏لا توجد طابعة @ إعداد الصفحة\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"صورة نقطية 24 بت (*.bmp,*.dib)\",\n\t\"All Files\": \"كافة الملفات\",\n\t\"Palette|*.pal|\": \"لوح ألوان|*.pal|\",\n\t\"OLE 2.0 was unable to start.\": \"‏‏فشل في تهيئة OLE 2.0. \",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"تأكد من أنك تستخدم الإصدارالصحيح لمكتبات OLE\",\n\t\"Resets the text be without any attributes.\": \"‏‏إعادة تعيين النص ليكون دون أية سمات.\",\n\t\"Sets or clears the text bold attribute.\": \"‏‏تعيين أو إلغاء سمة النص الأسود العريض.\",\n\t\"Sets or clears the text italic attribute.\": \"‏‏تعيين أو إلغاء سمة النص المائل.\",\n\t\"Selects the font used by the text.\": \"‏‏تحديد الخط المستخدَم للنص.\",\n\t\"Selects the point size of the text.\": \"‏‏تحديد حجم النقطة للنص.\",\n\t\"Sets or clears the text underline attribute.\": \"‏‏تعيين أو إلغاء سمة النص المسطّر.\",\n\t\"Shows or hides the tooltips.\": \"‏‏إظهار تعريفات الأدوات أو إخفاؤها.\",\n\t\"Show Paint Help.\": \"‏‏إظهار تعليمات الرسام.\",\n\t\"Sends a picture by using mail or fax.\": \"‏‏إرسال صورة عن طريق البريد أو الفاكس.\",\n\t\"Copies the selection to a file.\": \"‏‏نسخ التحديد إلى ملف.\",\n\t\"Pastes a file into the selection.\": \"‏‏لصق ملف إلى التحديد.\",\n\t\"Zooms the picture to 100%.\": \"‏‏تكبير/تصغير الصورة إلى 100%.\",\n\t\"Zooms the picture to 400%.\": \"‏‏تكبير/تصغير الصورة إلى 400%.\",\n\t\"Zooms the picture.\": \"‏‏تكبير/تصغير الصورة .\",\n\t\"Displays the entire picture.\": \"‏‏إظهار الصورة بالكامل.\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"‏‏إظهار مصغرة الصورة أو إخفاؤها.\",\n\t\"Shows or hides the grid.\": \"‏‏إظهار الشبكة أو إخفاؤها.\",\n\t\"Shows or hides the text toolbar.\": \"‏‏إظهار شريط أدوات النص أو إخفاؤه.\",\n\t\"Flips or rotates the picture or a selection.\": \"‏‏عكس أو تدوير الصورة أو التحديد.\",\n\t\"Stretches or skews the picture or a selection.\": \"‏‏تمديد أو حرف الصورة أو التحديد.\",\n\t\"Inverts the colors of the picture or a selection.\": \"‏‏عكس ألوان الصورة أو التحديد.\",\n\t\"Changes the attributes of the picture.\": \"‏‏تغيير سمات الصورة.\",\n\t\"Clears the picture or selection.\": \"‏‏مسح الصورة أو التحديد.\",\n\t\"The font size must be a numeric value.\": \"‏‏يجب أن يكون حجم الخط قيمة عددية.\",\n\t\"Contains commands for working with the selected item(s).\": \"‏‏يتضمن أوامر للعمل بالعنصر أو العناصر المختارة.\",\n\t\"Contains commands for selecting and transferring items.\": \"‏‏يتضمن أوامر لتحديد العناصر أو نقلها.\",\n\t\"Contains commands for customizing this window.\": \"‏‏يتضمن أوامر لتخصيص هذا الإطار.\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"‏‏يتضمن أوامر لمعالجة الصور وتعيين السمات.\",\n\t\"Contains commands for using custom colors and drawing options.\": \"‏‏يتضمن أوامر لاستخدام ألوان مخصصة وخيارات الرسم.\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"‏‏يتضمن أوامر لإظهار تعليمات ومعلومات حول الرسام.\",\n\t\"Cannot save file.\": \"‏‏غير قادر على حفظ الملف.\",\n\t\"Error removing temporary file.\": \"‏‏خطأ في إزالة الملف المؤقت.\",\n\t\"Get Colors\": \"‏‏إحضار الألوان\",\n\t\"Save Colors\": \"‏‏حفظ الألوان\",\n\t\"File last saved:\": \"‏‏آخر حفظ للملف:\",\n\t\"Not Available\": \"غير متوفر\",\n\t\"Size on disk:\": \"‏‏الحجم على القرص:\",\n\t\"%s bytes\": \"%s بايت\",\n\t\"Painting\": \"‏‏الرسم\",\n\t\"Bitmap\": \"‏‏صورة نقطية\",\n\t\"Fonts\": \"‏‏خطوط\",\n\t\"Tools\": \"‏‏أدوات\",\n\t\"All Picture Files\": \"‏‏كافة ملفات الصور\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"‏‏للحصول على التعليمات؛ انقر \\\"مواضيع التعليمات\\\" في لائحة \\\"تعليمات\\\".\",\n\t\"Select an area on which to get Help.\": \"‏‏حدد المنطقة التي تريد تعليمات حولها.\",\n\t\"%1 in %2\": \"‏‏%1 في %2\",\n\t\"%1 - %2\": \"‏‏%1 - %2\",\n\t\"Creates a new document.\": \"‏‏إنشاء مستند جديد.\",\n\t\"Opens an existing document.\": \"‏‏فتح مستند موجود.\",\n\t\"Closes the active document.\": \"‏‏إغلاق المستند النشط.\",\n\t\"Saves the active document.\": \"‏‏حفظ المستند النشط.\",\n\t\"Saves the active document with a new name.\": \"‏‏حفظ المستند النشط باسم جديد.\",\n\t\"Changes the page layout.\": \"‏‏تغيير تخطيط الصفحة.\",\n\t\"Specifies the default printer setup.\": \"‏‏تحديد إعداد الطابعة الافتراضي.\",\n\t\"Prints the active document and sets printing options.\": \"‏‏طباعة المستند النشط وتعيين خيارات الطباعة.\",\n\t\"Displays full pages.\": \"‏‏إظهار صفحات كاملة.\",\n\t\"Opens this document.\": \"‏‏فتح هذا المستند.\",\n\t\"Deletes the selection.\": \"‏‏حذف التحديد.\",\n\t\"Erases everything.\": \"‏‏مسح كل شيء.\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"‏‏نسخ التحديد ووضعه في الحافظة.\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"‏‏قص التحديد ووضعه في الحافظة.\",\n\t\"Finds the specified text.\": \"‏‏العثور على النص المعين.\",\n\t\"Inserts the contents of the Clipboard.\": \"‏‏إدراج محتويات الحافظة.\",\n\t\"Repeats the last action.\": \"‏‏إعادة آخر إجراء.\",\n\t\"Replaces specific text with different text.\": \"‏‏تبديل نص معين بنص آخر.\",\n\t\"Selects everything.\": \"‏‏تحديد كل شيء.\",\n\t\"Undoes the last action.\": \"‏‏التراجع عن آخر إجراء.\",\n\t\"Redoes the previously undone action.\": \"إعادة آخر إجراء تم التراجع عنه.\",\n\t\"Displays program information, version number, and copyright.\": \"إظهار معلومات البرنامج ورقم الإصدار وحقوق النشر.\",\n\t\"Quits Paint.\": \"إنهاء الرسام.\",\n\t\"Opens Paint Help.\": \"فتح تعليمات الرسام.\",\n\t\"Displays instructions about how to use Help.\": \"إظهار إرشادات حول استخدام التعليمات.\",\n\t\"Displays Help for areas you click on.\": \"إظهار تعليمات عن المناطق التي تنقر فوقها.\",\n\t\"Displays Help for the current task or command.\": \"إظهار تعليمات المهمة أو الأمر الحاليين.\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"توسيط هذه الصورة النقطية  كخلفية لسطح المكتب.\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"تجانُب هذه الصورة النقطية كخلفية لسطح المكتب.\",\n\t\"Sends the selection using mail or fax.\": \"إرسال التحديد عن طريق البريد أو الفاكس.\",\n\t\"Prints the selection.\": \"طباعة التحديد.\",\n\t\"Shows or hides the thumbnail.\": \"إظهار المصغرات أو إخفاؤها.\",\n\t\"Shows Paint Help.\": \"إظهار تعليمات الرسام.\",\n\t\"Shows or hides the status bar.\": \"إظهار شريط الحالة أو إخفاؤه.\",\n\t\"Shows or hides the tool box.\": \"إظهار مربع الأدوات أو إخفاؤه.\",\n\t\"Shows or hides the color box.\": \"إظهار مربع الألوان أو إخفاؤه.\",\n\t\"Only a Far East font can be used for vertical editing.\": \"‏‏يمكن فقط استخدام خط من خطوط الشرق الأقصى للتحرير الشاقولي.\",\n\t\"Changes the window size.\": \"تغيير حجم الإطار.\",\n\t\"Changes the window position.\": \"تغيير موضع الإطار.\",\n\t\"Reduces the window to an icon.\": \"تصغير الإطار إلى رمز.\",\n\t\"Enlarges the window to full size.\": \"تكبير الإطار إلى الحجم الكامل.\",\n\t\"Switches to the next document window.\": \"تبديل إلى إطار المستند التالي.\",\n\t\"Switches to the previous document window.\": \"تبديل إلى إطار المستند السابق.\",\n\t\"Closes the active window and asks if you want to save changes.\": \"إغلاق الإطار النشط والسؤال عن الرغبة في حفظ التعديلات.\",\n\t\"Restores the window to normal size.\": \"ستعادة الإطار إلى الحجم العادي.\",\n\t\"Activates the task list.\": \"تنشيط قائمة المهام.\",\n\t\"All Files (*.*)\": \"كافة الملفات (*.*)\",\n\t\"Untitled\": \"بلا عنوان\",\n\t\"an unnamed file\": \"ملف غير مسمى\",\n\t\"&Hide\": \"إ&خفاء\",\n\t\"Hide\": \"إخفاء\",\n\t\"No error message is available.\": \"‏‏لا تتوفر رسالة خطأ.\",\n\t\"An unsupported operation was attempted.\": \"‏‏جرت محاولة للقيام بعملية غير معتمدة.\",\n\t\"A required resource was unavailable.\": \"‏‏هناك مورد مطلوب لم يكن متوفراً.\",\n\t\"Out of memory.\": \"‏‏نفدت الذاكرة.\",\n\t\"An unknown error has occurred.\": \"‏‏حدث خطأ غير معروف.\",\n\t\"on %1\": \"‏‏على %1\",\n\t\"&One Page\": \"‏‏&صفحة واحدة\",\n\t\"One Page\": \"‏‏صفحة واحدة\",\n\t\"&Two Page\": \"‏‏&صفحتان\",\n\t\"Two Page\": \"‏‏صفحتان\",\n\t\"Page %u\": \"‏‏صفحة %u\",\n\t\"Pages %u-%u\": \"الصفحات %u-%u\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"ملفات الطابعة (*.prn)|*.prn|كافة الملفات (*.*)|*.*||\",\n\t\"Print to File\": \"طباعة إلى ملف\",\n\t\"to %1\": \"إلى %1\",\n\t\"&Update %1\": \"&تحديث %1\",\n\t\"Update %1\": \"تحديث %1\",\n\t\"E&xit && Return to %1\": \"&خروج وعودة إلى %1\",\n\t\"Exit & Return to %1\": \"خروج وعودة إلى %1\",\n\t\"Linked %s\": \"%s مرتبط\",\n\t\"Unknown Type\": \"‏‏نوع غير معروف\",\n\t\"Invalid filename.\": \"‏‏اسم ملف غير صالح.\",\n\t\"Failed to open document.\": \"‏‏فشل فتح المستند.\",\n\t\"Failed to save document.\": \"‏‏فشل حفظ المستند.\",\n\t\"Save changes to %1?\": \"‏‏حفظ التغييرات في %1؟\",\n\t\"Failed to create empty document.\": \"‏‏فشل إنشاء مستند فارغ.\",\n\t\"The file is too large to open.\": \"‏‏الملف كبير جداً بحيث لا يمكن فتحه.\",\n\t\"Could not start print job.\": \"‏‏تعذّر بدء مهمة الطباعة.\",\n\t\"Failed to launch help.\": \"‏‏فشل بدء تشغيل التعليمات.\",\n\t\"Internal application error.\": \"‏‏خطأ داخلي في التطبيق.\",\n\t\"Command failed.\": \"‏‏فشل الأمر.\",\n\t\"Insufficient memory to perform operation.\": \"‏‏لا تكفي الذاكرة لإنجاز العملية.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"‏‏تمت إزالة إدخالات تسجيل النظام وحذف ملف INI (إن وجد).\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"‏‏لم تتم إزالة كافة إدخالات تسجيل النظام (أو ملف INI).\",\n\t\"This program requires the file %s, which was not found on this system.\": \"‏‏يحتاج هذا البرنامج إلى الملف %s الذي لم يتم العثور عليه في النظام.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"‏‏هذا البرنامج مرتبط بالتصدير المفقود %s في الملف %s. ربما يوجد في هذا الجهاز إصدار غير متوافق من %s.\",\n\t\"Please enter an integer.\": \"‏‏أدخل عدداً صحيحاً.\",\n\t\"Please enter a number.\": \"‏‏أدخل رقماً.\",\n\t\"Please enter an integer between %1 and %2.\": \"‏‏أدخل عدداً صحيحاً بين 1% و 2%.\",\n\t\"Please enter a number between %1 and %2.\": \"‏‏أدخل رقماً بين 1% و 2%.\",\n\t\"Please enter no more than %1 characters.\": \"‏‏أدخل ما لا يزيد عن 1% حرف.\",\n\t\"Please select a button.\": \"‏‏حدد زراً.\",\n\t\"Please enter an integer between 0 and 255.\": \"‏‏أدخل عدداً صحيحاً بين 0 و 255.\",\n\t\"Please enter a positive integer.\": \"‏‏أدخل عدداً صحيحاً موجباً.\",\n\t\"Please enter a date and/or time.\": \"‏‏أدخل تاريخاً أو وقتاً.\",\n\t\"Please enter a currency.\": \"‏‏أدخل عملة.\",\n\t\"Unexpected file format.\": \"‏‏تنسيق ملف غير متوقع.\",\n\t\"%1\": \"‏‏%1\",\n\t\"Cannot find this file.\": \"تعذر العثور على هذا الملف.\",\n\t\"Please verify that the correct path and file name are given.\": \"تحقق من أن المسار واسم الملف الصحيحين مدخلان.\",\n\t\"Destination disk drive is full.\": \"‏‏محرك القرص الوجهة ممتلئ.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"‏‏غير قادر على القراءة من 1%، لأنه مفتوح من قبل شخص آخر.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"‏‏غير قادر على الكتابة في %1، لأنه للقراءة فقط أو مفتوح من قبل شخص آخر.\",\n\t\"An unexpected error occurred while reading %1.\": \"‏‏حدث خطأ غير متوقع أثناء قراءة 1%.\",\n\t\"An unexpected error occurred while writing %1.\": \"‏‏حدث خطأ غير متوقع أثناء كتابة 1%.\",\n\t\"Unable to register document.\": \"غير قادر على تسجيل المستند.\",\n\t\"The document may already be open.\": \"قد يكون المستند مفتوحاً مسبقاً.\",\n\t\"Update %1 before proceeding?\": \"‏‏هل تريد تحديث %1 قبل المتابعة؟\",\n\t\"Could not update client.\": \"‏‏تعذّر تحديث العميل.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"‏‏فشل التسجيل. قد لا تعمل ميزات ActiveX بشكل صحيح.\",\n\t\"Failed to update the system registry.\": \"‏‏فشل تحديث تسجيل النظام.\",\n\t\"Please try using REGEDIT.\": \"الرجاء المحاولة باستخدام REGEDIT.\",\n\t\"Unable to read write-only property.\": \"‏‏تعذرت قراءة خاصية الكتابة فقط.\",\n\t\"Unable to write read-only property.\": \"‏‏تعذرت كتابة خاصية القراءة فقط.\",\n\t\"Unable to load mail system support.\": \"‏‏تعذر تحميل دعم نظام البريد.\",\n\t\"Mail system DLL is invalid.\": \"‏‏DLL نظام البريد غير صالح.\",\n\t\"Send Mail failed to send message.\": \"‏‏فشل 'إرسال البريد' في إرسال الرسالة.\",\n\t\"No error occurred.\": \"‏‏لم يحدث أي خطأ.\",\n\t\"An unknown error occurred while accessing %1.\": \"‏‏حدث خطأ غير معروف أثناء الوصول إلى %1.\",\n\t\"%1 was not found.\": \"‏‏تعذر العثور على %1.\",\n\t\"%1 contains an invalid path.\": \"‏‏يحتوي %1 على مسار غير صالح.\",\n\t\"%1 could not be opened because there are too many open files.\": \"‏‏تعذّر فتح %1 لوجود عدد كبير من الملفات المفتوحة.\",\n\t\"Access to %1 was denied.\": \"‏‏تم رفض الوصول إلى %1.\",\n\t\"An invalid file handle was associated with %1.\": \"‏‏اقتران مؤشر غير صالح للملف مع %1.\",\n\t\"%1 could not be removed because it is the current directory.\": \"‏‏تعذّرت إزالة %1 لأنه الدليل الحالي.\",\n\t\"%1 could not be created because the directory is full.\": \"‏‏تعذّر إنشاء %1 بسبب امتلاء الدليل.\",\n\t\"Seek failed on %1\": \"‏‏فشل إيجاد %1\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"‏‏تم الإعلام عن خطأ إدخال/إخراج في الجهاز أثناء الوصول إلى %1.\",\n\t\"A sharing violation occurred while accessing %1.\": \"‏‏حدث انتهاك في المشاركة أثناء الوصول إلى %1.\",\n\t\"A locking violation occurred while accessing %1.\": \"‏‏حدث انتهاك في التأمين أثناء الوصول إلى %1.\",\n\t\"Disk full while accessing %1.\": \"‏‏امتلاء القرص أثناء الوصول إلى %1.\",\n\t\"An attempt was made to access %1 past its end.\": \"‏‏جرت محاولة للوصول إلى %1 مع تجاوز نهايته.\",\n\t\"An attempt was made to write to the reading %1.\": \"‏‏جرت محاولة للكتابة من %1 للقراءة.\",\n\t\"An attempt was made to read from the writing %1.\": \"‏‏جرت محاولة للقراءة من %1 للكتابة.\",\n\t\"%1 has a bad format.\": \"‏‏تنسيق غير صحيح في %1.\",\n\t\"%1 contained an unexpected object.\": \"‏‏احتوى %1 كائناً غير متوقع.\",\n\t\"%1 contains an incorrect schema.\": \"‏‏يحتوي %1 على مخطط غير صحيح.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"‏‏تحديد جزء مستطيل من الصورة لنقله أو نسخه أو تعديله.\",\n\t\"Select\": \"تحديد\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"‏‏تحديد جزء حر من الصورة لنقله أو نسخه أو تعديله.\",\n\t\"Free-Form Select\": \"تحديد حر\",\n\t\"Inserts text into the picture.\": \"‏‏إدراج نص في الصورة.\",\n\t\"Fills an area with the current drawing color.\": \"‏‏ملء منطقة بلون الرسم الحالي.\",\n\t\"Fill With Color\": \"ملء باللون\",\n\t\"Draws a straight line with the selected line width.\": \"‏‏رسم خط مستقيم بالعرض المحدد.\",\n\t\"Line\": \"خط\",\n\t\"Draws using an airbrush of the selected size.\": \"‏‏رسم باستخدام مرشة بالحجم المحدد.\",\n\t\"Airbrush\": \"مرشة\",\n\t\"Draws a curved line with the selected line width.\": \"‏‏رسم خط منحنٍ بالعرض المحدد.\",\n\t\"Curve\": \"منحن\",\n\t\"Draws a polygon with the selected fill style.\": \"‏‏رسم مضلع بنمط التعبئة المحدد.\",\n\t\"Polygon\": \"مضلع\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"‏‏رسم مستطيل مستدير الزوايا بنمط التعبئة المحدد.\",\n\t\"Rounded Rectangle\": \"مستطيل مستدير الزوايا\",\n\t\"Draws a free-form line one pixel wide.\": \"‏‏رسم خط حر بعرض نقطة واحدة.\",\n\t\"Pencil\": \"قلم\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"‏‏مسح جزء من الصورة باستخدام الشكل المحدد للممحاة.\",\n\t\"Eraser/Color Eraser\": \"ممحاة/ممحاة لون\",\n\t\"Changes the magnification.\": \"‏‏تغيير التكبير.\",\n\t\"Magnifier\": \"مكبر\",\n\t\"Picks up a color from the picture for drawing.\": \"‏‏انتقاء لون للرسم من الصورة.\",\n\t\"Pick Color\": \"انتقاء لون\",\n\t\"Draws using a brush with the selected shape and size.\": \"‏‏رسم باستخدام فرشاة بالشكل والحجم المحددين.\",\n\t\"Brush\": \"فرشاة\",\n\t\"Draws a rectangle with the selected fill style.\": \"‏‏رسم مستطيل بنمط التعبئة المحدد.\",\n\t\"Rectangle\": \"مستطيل\",\n\t\"Draws a filled rectangle.\": \"رسم مستطيل ممتلئ.\",\n\t\"Draws an ellipse with the selected fill style.\": \"رسم قطع ناقص بنمط التعبئة المحدد.\",\n\t\"Ellipse\": \"قطع ناقص\",\n\t\"Draws a filled ellipse.\": \"رسم قطع ناقص ممتلئ.\",\n\t\"Makes the current selection either opaque or transparent.\": \"‏‏جعل التحديد الحالي كامداً أو شفافاً.\",\n\t\"Creates a new color.\": \"‏‏إنشاء لون جديد.\",\n\t\"Uses a previously saved palette of colors.\": \"‏‏استخدام لوح ألوان محفوظ سابقاً.\",\n\t\"Saves the current palette of colors to a file.\": \"‏‏حفظ لوح الألوان الحالي في ملف.\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"‏‏يجب حفظ الملف قبل اختياره كخلفية للشاشة.\",\n\t\"The selection is now larger than the bitmap.\": \"‏‏التحديد الآن أكبر من الصورة النقطية.\",\n\t\"Would you like the bitmap enlarged?\": \"هل ترغب في تكبير الصورة النقطية؟\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"‏‏الصورة في الحافظة أكبر من الصورة النقطية.\",\n\t\"The file is not in the correct format.\": \"‏‏تنسيق الملف غير صحيح.\",\n\t\"Not enough room to paste text.\": \"‏‏لا يوجد حيز كاف للصق النص.\",\n\t\"Enlarge the text area and try again.\": \"كبِّر منطقة النص وحاول ثانيةً.\",\n\t\"Places the text.\": \"توضيع النص.\"\n});\n"
  },
  {
    "path": "localization/cs/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"cs\", {\n\t\"Attributes\": \"Atributy\",\n\t\"&Width:\": \"Šíř&ka:\",\n\t\"Width:\": \"Šířka:\",\n\t\"&Height:\": \"Výšk&a:\",\n\t\"Height:\": \"Výška:\",\n\t\"Units\": \"Jednotky\",\n\t\"&Inches\": \"Pa&lce\",\n\t\"Inches\": \"Palce\",\n\t\"C&m\": \"&Cm\",\n\t\"Cm\": \"Cm\",\n\t\"&Pixels\": \"&Pixely\",\n\t\"Pixels\": \"Pixely\",\n\t\"Colors\": \"Barvy\",\n\t\"&Black and white\": \"Černo&bíle\",\n\t\"Black and white\": \"Černobíle\",\n\t\"Co&lors\": \"Ba&rvy\",\n\t\"Transparency\": \"Průhlednost\",\n\t\"Use &Transparent background color\": \"Použít prů&hlednou barvu pozadí\",\n\t\"Use Transparent background color\": \"Použít průhlednou barvu pozadí\",\n\t\"Select &Color\": \"V&ybrat barvu\",\n\t\"Select Color\": \"Vybrat barvu\",\n\t\"Cancel\": \"Storno\",\n\t\"&Default\": \"&Výchozí\",\n\t\"Default\": \"Výchozí\",\n\t\"Custom Zoom\": \"Vlastní měřítko\",\n\t\"Current zoom:\": \"Aktuální měřítko:\",\n\t\"Zoom to\": \"Měřítko\",\n\t\"Flip and Rotate\": \"Převrátit či otočit\",\n\t\"Flip or rotate\": \"Převrátit či otočit\",\n\t\"&Flip horizontal\": \"Převrátit vo&dorovně\",\n\t\"Flip horizontal\": \"Převrátit vodorovně\",\n\t\"Flip &vertical\": \"Převrátit &svisle\",\n\t\"Flip vertical\": \"Převrátit svisle\",\n\t\"&Rotate by angle\": \"O&točit o\",\n\t\"Rotate by angle\": \"Otočit o\",\n\t\"Stretch and Skew\": \"Roztáhnout či zkosit\",\n\t\"Stretch\": \"Roztáhnout\",\n\t\"&Horizontal:\": \"&Vodorovně:\",\n\t\"Horizontal:\": \"Vodorovně:\",\n\t\"&Vertical:\": \"&Svisle:\",\n\t\"Vertical:\": \"Svisle:\",\n\t\"Skew\": \"Zkosit\",\n\t\"H&orizontal:\": \"V&odorovně:\",\n\t\"Degrees\": \"stupňů\",\n\t\"V&ertical:\": \"Sv&isle:\",\n\t\"Color Table\": \"Tabulka barev\",\n\t\"New\": \"Nový\",\n\t\"&New \": \"&Nový \",\n\t\"New \": \"Nový \",\n\t\"&Help\": \"Nápo&věda\",\n\t\"Help\": \"Nápověda\",\n\t\"Printing\": \"Probíhá tisk\",\n\t\"on the\": \"na tiskárně\",\n\t\"&Print\": \"&Tisk\",\n\t\"Print\": \"Tisk\",\n\t\"&Next Page\": \"&Další\",\n\t\"Next Page\": \"Další\",\n\t\"Pre&v Page\": \"&Předchozí\",\n\t\"Prev Page\": \"Předchozí\",\n\t\"Zoom &In\": \"Při&blížit\",\n\t\"Zoom In\": \"Přiblížit\",\n\t\"Zoom &Out\": \"&Oddálit\",\n\t\"Zoom Out\": \"Oddálit\",\n\t\"&Close\": \"&Zavřít\",\n\t\"Close\": \"Zavřít\",\n\t\"Grid Settings\": \"Nastavení mřížky\",\n\t\"&Pixel Grid\": \"&Mřížka pixelů\",\n\t\"Pixel Grid\": \"Mřížka pixelů\",\n\t\"&Tile Grid\": \"Mřížka &obdélníků\",\n\t\"Tile Grid\": \"Mřížka obdélníků\",\n\t\"pixels\": \"pixelů\",\n\t\"H&eight:\": \"&Výška:\",\n\t\"Undo\": \"Zpět\",\n\t\"Cut\": \"Vyjmout\",\n\t\"Copy\": \"Kopírovat\",\n\t\"Paste\": \"Vložit\",\n\t\"Clear Selection\": \"Vymazat výběr\",\n\t\"Select All\": \"Vybrat vše\",\n\t\"Text Toolbar\": \"Panel nástrojů Text\",\n\t\"Selection\": \"Výběr\",\n\t\"Cu&t\": \"&Vyjmout\",\n\t\"&Copy\": \"&Kopírovat\",\n\t\"&Paste\": \"V&ložit\",\n\t\"C&lear Selection\": \"Vy&mazat výběr\",\n\t\"Select &All\": \"Vybr&at vše\",\n\t\"C&opy To\": \"Zkopírovat &do\",\n\t\"Copy To\": \"Zkopírovat do\",\n\t\"Paste &From\": \"Vloži&t z\",\n\t\"Paste From\": \"Vložit z\",\n\t\"Flip/&Rotate\": \"&Převrátit či otočit\",\n\t\"Flip/Rotate\": \"Převrátit či otočit\",\n\t\"&Stretch/Skew\": \"&Roztáhnout či zkosit\",\n\t\"Stretch/Skew\": \"Roztáhnout či zkosit\",\n\t\"&Invert Colors\": \"&Invertovat barvy\",\n\t\"Invert Colors\": \"Invertovat barvy\",\n\t\"Thumbnail\": \"Miniatura\",\n\t\"&File\": \"&Soubor\",\n\t\"File\": \"Soubor\",\n\t\"&New\": \"&Nový\",\n\t\"&Open\": \"&Otevřít\",\n\t\"Open\": \"Otevřít\",\n\t\"&Save\": \"&Uložit\",\n\t\"Save\": \"Uložit\",\n\t\"Save &As\": \"Uložit j&ako\",\n\t\"Save As\": \"Uložit jako\",\n\t\"Print Pre&view\": \"Ná&hled\",\n\t\"Print Preview\": \"Náhled\",\n\t\"Page Se&tup\": \"Vzhled &stránky\",\n\t\"Page Setup\": \"Vzhled stránky\",\n\t\"S&end\": \"O&deslat\",\n\t\"Send\": \"Odeslat\",\n\t\"Set As &Wallpaper (Tiled)\": \"Nastavit jako tapetu &vedle sebe\",\n\t\"Set As Wallpaper (Tiled)\": \"Nastavit jako tapetu vedle sebe\",\n\t\"Set As Wa&llpaper (Centered)\": \"Nastavit jako tapetu up&rostřed\",\n\t\"Set As Wallpaper (Centered)\": \"Nastavit jako tapetu uprostřed\",\n\t\"Recent File\": \"Minulý soubor\",\n\t\"E&xit\": \"&Konec\",\n\t\"Exit\": \"Konec\",\n\t\"&Edit\": \"Úpr&avy\",\n\t\"Edit\": \"Úpravy\",\n\t\"&Undo\": \"&Zpět\",\n\t\"&Repeat\": \"&Opakovat\",\n\t\"Repeat\": \"Opakovat\",\n\t\"&View\": \"&Zobrazit\",\n\t\"View\": \"Zobrazit\",\n\t\"&Tool Box\": \"Panel &nástrojů\",\n\t\"Tool Box\": \"Panel nástrojů\",\n\t\"&Color Box\": \"Panel &barev\",\n\t\"Color Box\": \"Panel barev\",\n\t\"&Status Bar\": \"&Stavový řádek\",\n\t\"Status Bar\": \"Stavový řádek\",\n\t\"T&ext Toolbar\": \"&Panel nástrojů Text\",\n\t\"&Zoom\": \"&Lupa\",\n\t\"Zoom\": \"Lupa\",\n\t\"&Normal Size\": \"&Normální velikost\",\n\t\"Normal Size\": \"Normální velikost\",\n\t\"&Large Size\": \"V&elká velikost\",\n\t\"Large Size\": \"Velká velikost\",\n\t\"C&ustom\": \"&Vlastní\",\n\t\"Custom\": \"Vlastní\",\n\t\"Show &Grid\": \"&Zobrazit mřížku\",\n\t\"Show Grid\": \"Zobrazit mřížku\",\n\t\"Show T&humbnail\": \"Zobrazit &miniaturu\",\n\t\"Show Thumbnail\": \"Zobrazit miniaturu\",\n\t\"&View Bitmap\": \"&Celá obrazovka\",\n\t\"View Bitmap\": \"Celá obrazovka\",\n\t\"&Image\": \"&Obraz\",\n\t\"Image\": \"Obraz\",\n\t\"&Flip/Rotate\": \"&Převrátit či otočit\",\n\t\"&Attributes\": \"&Atributy\",\n\t\"&Clear Image\": \"Vy&mazat\",\n\t\"Clear Image\": \"Vymazat\",\n\t\"Ctrl+Shft+N\": \"Ctrl+Shift+N\",\n\t\"&Draw Opaque\": \"&Kreslit neprůhledně\",\n\t\"Draw Opaque\": \"Kreslit neprůhledně\",\n\t\"&Colors\": \"&Barvy\",\n\t\"&Edit Colors\": \"&Upravit barvy\",\n\t\"Edit Colors\": \"Upravit barvy\",\n\t\"&Help Topics\": \"&Témata nápovědy\",\n\t\"Help Topics\": \"Témata nápovědy\",\n\t\"&About Paint\": \"&O aplikaci Malování\",\n\t\"About Paint\": \"O aplikaci Malování\",\n\t\"&Update\": \"&Aktualizovat\",\n\t\"Update\": \"Aktualizovat\",\n\t\"Save Copy &As\": \"&Uložit kopii jako\",\n\t\"Save Copy As\": \"Uložit kopii jako\",\n\t\"Paint\": \"Malování\",\n\t\"untitled\": \"Bez_názvu\",\n\t\"Bitmap Image\": \"Rastrový obraz\",\n\t\"Bitmap Files (*.bmp)\": \"Rastrové soubory (*.bmp)\",\n\t\"Paint.Picture\": \"Obraz programu Malování\",\n\t\"PCX Files\": \"Soubory PCX\",\n\t\"Icon Files\": \"Soubory ikon\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"Černobílý rastr (*.bmp;*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"16barevný rastr (*.bmp;*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"256barevný rastr (*.bmp;*.dib)\",\n\t\"Paint cannot open this file.\": \"Program Malování nemůže otevřít tento soubor.\",\n\t\"Paint cannot read this file.\": \"Program Malování nemůže přečíst tento soubor.\",\n\t\"This file is read-only.\": \"Tento soubor je jen pro čtení.\",\n\t\"To save your changes, use a different filename.\": \"Chcete-li změny uložit, zadejte jiný název souboru.\",\n\t\"This file is already open.\": \"Tento soubor je již otevřen.\",\n\t\"This is not a valid .PCS file.\": \"Toto není platný soubor typu .PCS.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"Soubor je otevřen pro úpravy a nelze ho přepsat.\",\n\t\"Use a different filename to save your changes.\": \"Chcete-li změny uložit, zadejte jiný název souboru.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"Toto není platný soubor s rastrovým obrázkem nebo jeho formát není nyní podporován.\",\n\t\"This is not a valid icon.\": \"Toto není platná ikona.\",\n\t\"This is not a valid cursor.\": \"Toto není platný kurzor.\",\n\t\"Save was interrupted, so your file has not been saved.\": \"Ukládání bylo přerušeno, soubor není uložen.\",\n\t\"You cannot save to a read-only file.\": \"Nelze uložit soubor, který je jen pro čtení.\",\n\t\"Use a different file name.\": \"Zadejte jiný název souboru.\",\n\t\"This file is already in use.\": \"Tento soubor je již používán.\",\n\t\"Close the program, and then try again.\": \"Program zavřete a akci zopakujte.\",\n\t\"Paint cannot save this file.\": \"Program Malování nemůže tento soubor uložit.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"Program Malování nemůže uložit pod stejným názvem soubor jiného typu.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"Hustota mřížky se zadává jako celé číslo hodnoty %d až %d.\",\n\t\"There is not enough memory or resources to complete operation.\": \"K dokončení operace není dost paměti nebo prostředků.\",\n\t\"Close some programs, and then try again.\": \"Zavřete některé programy a akci zopakujte.\",\n\t\"Low on memory or resources.\": \"Nedostatek paměti nebo prostředků.\",\n\t\"Group error.\": \"Chyba skupiny.\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"Program Malování nemůže dokument vytisknout. Přesvědčte se, zda je na disku dostatek místa a zda tiskárna pracuje správně.\",\n\t\"Saving into this format may cause some loss of color information.\": \"Uložení v tomto formátu může způsobit ztrátu některých informací o barvě.\",\n\t\"Do you want to continue?\": \"Chcete pokračovat?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"Převod na černobílý obrázek nelze vzít zpět. Tato akce upraví aktivní soubor a může způsobit ztrátu informací o barvách.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"Velikost strany rastru musí být větší než jeden pixel.\",\n\t\"Generic error.\": \"Došlo k obecné chybě.\",\n\t\"File not found.\": \"Soubor nebyl nalezen.\",\n\t\"Bad path.\": \"Chybná cesta.\",\n\t\"Too many open files.\": \"Je otevřeno příliš mnoho souborů.\",\n\t\"Access denied.\": \"Přístup odepřen.\",\n\t\"Invalid file.\": \"Neplatný soubor.\",\n\t\"Remove current folder.\": \"Odstranit aktuální složku.\",\n\t\"Folder full.\": \"Složka je plná.\",\n\t\"Bad seek.\": \"Chybné hledání.\",\n\t\"Hard IO error.\": \"Došlo k závažné vstupně-výstupní chybě.\",\n\t\"Sharing violation.\": \"Byla narušeno sdílení.\",\n\t\"Lock violation.\": \"Bylo narušeno uzamčení.\",\n\t\"Disk full.\": \"Disk je plný.\",\n\t\"End of file.\": \"Konec souboru.\",\n\t\"Error getting the Clipboard Data!\": \"Při získávání dat ze schránky došlo k chybě.\",\n\t\"No Printer Found @ page setup\": \"Nebyla nalezena tiskárna pro nastavení stránky\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"24bitový rastr (*.bmp;*.dib)\",\n\t\"All Files\": \"Všechny soubory\",\n\t\"Palette|*.pal|\": \"Paleta|*.pal|\",\n\t\"untitled.pal\": \"bez_názvu.pal\",\n\t\"OLE 2.0 was unable to start.\": \"OLE 2.0 nelze spustit.\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"Ujistěte se, zda používáte správnou verzi knihoven OLE.\",\n\t\"Resets the text be without any attributes.\": \"Zruší všechny atributy textu.\",\n\t\"Sets or clears the text bold attribute.\": \"Zapne nebo vypne tučné písmo.\",\n\t\"Sets or clears the text italic attribute.\": \"Zapne nebo vypne kurzívu.\",\n\t\"Selects the font used by the text.\": \"Vybere písmo pro psaní textu.\",\n\t\"Selects the point size of the text.\": \"Vybere výšku textu (v bodech).\",\n\t\"Sets or clears the text underline attribute.\": \"Zapne nebo vypne podtržení písma.\",\n\t\"Shows or hides the tooltips.\": \"Zobrazí nebo skryje tipy panelů.\",\n\t\"Show Paint Help.\": \"Zobrazí nápovědu programu Malování.\",\n\t\"Sends a picture by using mail or fax.\": \"Odešle obrázek poštou nebo faxem.\",\n\t\"Copies the selection to a file.\": \"Zkopíruje vybranou část do souboru.\",\n\t\"Pastes a file into the selection.\": \"Vloží soubor do vybrané části.\",\n\t\"Zooms the picture to 100%.\": \"Nastaví měřítko na 100%.\",\n\t\"Zooms the picture to 400%.\": \"Nastaví měřítko na 400%.\",\n\t\"Zooms the picture.\": \"Přiblíží obrázek.\",\n\t\"Displays the entire picture.\": \"Zobrazí celý obrázek.\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"Zobrazí nebo skryje miniaturu.\",\n\t\"Shows or hides the grid.\": \"Zobrazí nebo skryje mřížku.\",\n\t\"Shows or hides the text toolbar.\": \"Zobrazí nebo skryje panel nástrojů Text.\",\n\t\"Flips or rotates the picture or a selection.\": \"Převrátí nebo otočí obrázek nebo vybranou část.\",\n\t\"Stretches or skews the picture or a selection.\": \"Roztáhne nebo zkosí obrázek nebo vybranou část.\",\n\t\"Inverts the colors of the picture or a selection.\": \"Invertuje barvy obrázku nebo vybrané části.\",\n\t\"Changes the attributes of the picture.\": \"Změní atributy obrázku.\",\n\t\"Clears the picture or selection.\": \"Vymaže obrázek nebo vybranou část.\",\n\t\"The font size must be a numeric value.\": \"Velikost písma musí být číslo.\",\n\t\"Contains commands for working with the selected item(s).\": \"Obsahuje příkazy pro práci s vybranými položkami.\",\n\t\"Contains commands for selecting and transferring items.\": \"Obsahuje příkazy pro výběr a přenos položek.\",\n\t\"Contains commands for customizing this window.\": \"Obsahuje příkazy pro přizpůsobení vzhledu okna.\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"Obsahuje příkazy pro manipulaci s obrázkem a pro nastavení atributů.\",\n\t\"Contains commands for using custom colors and drawing options.\": \"Obsahuje příkazy pro práci s barvami a pro nastavení možností kreslení.\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"Obsahuje příkazy pro zobrazení nápovědy a informací o programu Malování.\",\n\t\"Cannot save file.\": \"Soubor nelze uložit.\",\n\t\"Error removing temporary file.\": \"Při odstraňování dočasného souboru došlo k chybě.\",\n\t\"Get Colors\": \"Převzít barvy\",\n\t\"Save Colors\": \"Uložit barvy\",\n\t\"File last saved:\": \"Naposledy uložený soubor:\",\n\t\"Not Available\": \"Není k dispozici\",\n\t\"Size on disk:\": \"Místo na disku:\",\n\t\"%s bytes\": \"%s bajtů\",\n\t\"Painting\": \"Kreslení\",\n\t\"Fonts\": \"Písma\",\n\t\"Tools\": \"Nástroje\",\n\t\"All Picture Files\": \"Všechny soubory obrázků\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"Nápovědu získáte klepnutím na položku Témata nápovědy v nabídce Nápověda.\",\n\t\"Select an area on which to get Help.\": \"Klepněte na oblast obrazovky, ke které chcete nápovědu.\",\n\t\"%1 in %2\": \"%1 v %2\",\n\t\"Creates a new document.\": \"Vytvoří nový dokument.\",\n\t\"Opens an existing document.\": \"Otevře dříve vytvořený dokument.\",\n\t\"Closes the active document.\": \"Zavře aktivní dokument.\",\n\t\"Saves the active document.\": \"Uloží aktivní dokument.\",\n\t\"Saves the active document with a new name.\": \"Uloží aktivní dokument pod novým názvem.\",\n\t\"Changes the page layout.\": \"Změní vzhled tiskové stránky.\",\n\t\"Specifies the default printer setup.\": \"Nastaví výchozí tiskárnu.\",\n\t\"Prints the active document and sets printing options.\": \"Vytiskne aktivní dokument a určí způsob tisku.\",\n\t\"Displays full pages.\": \"Zobrazí tiskové stránky.\",\n\t\"Opens this document.\": \"Otevře tento dokument.\",\n\t\"Deletes the selection.\": \"Odstraní vybranou část.\",\n\t\"Erases everything.\": \"Vymaže všechno.\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"Zkopíruje výběr do schránky.\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"Vyjme výběr a vloží ho do schránky.\",\n\t\"Finds the specified text.\": \"Hledá zadaný text.\",\n\t\"Inserts the contents of the Clipboard.\": \"Vloží obsah schránky.\",\n\t\"Repeats the last action.\": \"Zopakuje předchozí akci.\",\n\t\"Replaces specific text with different text.\": \"Nahradí zadaný text jiným textem.\",\n\t\"Selects everything.\": \"Vybere všechno.\",\n\t\"Undoes the last action.\": \"Vrátí zpět poslední akci.\",\n\t\"Redoes the previously undone action.\": \"Znovu provede vrácenou akci.\",\n\t\"Displays program information, version number, and copyright.\": \"Zobrazí informace o programu, verzi a o autorských právech.\",\n\t\"Quits Paint.\": \"Ukončí program Malování.\",\n\t\"Opens Paint Help.\": \"Otevře nápovědu programu Malování.\",\n\t\"Displays instructions about how to use Help.\": \"Zobrazí návod k práci s nápovědou.\",\n\t\"Displays Help for areas you click on.\": \"Zobrazí nápovědu k místům, na která klepnete.\",\n\t\"Displays Help for the current task or command.\": \"Zobrazí nápovědu k úkolu nebo příkazu.\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"Použije vycentrovaný obrázek jako tapetu pracovní plochy.\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"Opakováním obrázku vytvoří tapetu pracovní plochy.\",\n\t\"Sends the selection using mail or fax.\": \"Odešle výběr poštou nebo faxem.\",\n\t\"Prints the selection.\": \"Vytiskne výběr.\",\n\t\"Shows or hides the thumbnail.\": \"Zobrazí nebo skryje miniaturu.\",\n\t\"Shows Paint Help.\": \"Zobrazí nápovědu programu Malování.\",\n\t\"Shows or hides the status bar.\": \"Zobrazí nebo skryje stavový řádek.\",\n\t\"Shows or hides the tool box.\": \"Zobrazí nebo skryje panel nástrojů.\",\n\t\"Shows or hides the color box.\": \"Zobrazí nebo skryje panel barev.\",\n\t\"Only a Far East font can be used for vertical editing.\": \"V režimu svislých úprav může být použito pouze písmo pro Vzdálený východ.\",\n\t\"Changes the window size.\": \"Změní velikost okna.\",\n\t\"Changes the window position.\": \"Změní polohu okna.\",\n\t\"Reduces the window to an icon.\": \"Zmenší okno do ikony.\",\n\t\"Enlarges the window to full size.\": \"Zvětší okno na plnou velikost.\",\n\t\"Switches to the next document window.\": \"Přepne do dalšího okna dokumentu.\",\n\t\"Switches to the previous document window.\": \"Přepne do předchozího okna dokumentu.\",\n\t\"Closes the active window and asks if you want to save changes.\": \"Zavře aktivní okno a dotáže se na uložení změn.\",\n\t\"Restores the window to normal size.\": \"Obnoví normální velikost okna.\",\n\t\"Activates the task list.\": \"Aktivuje seznam úkolů.\",\n\t\"All Files (*.*)\": \"Všechny soubory (*.*)\",\n\t\"Untitled\": \"Bez názvu\",\n\t\"an unnamed file\": \"Soubor bez názvu\",\n\t\"&Hide\": \"&Skrýt\",\n\t\"Hide\": \"Skrýt\",\n\t\"No error message is available.\": \"Není dostupná žádná chybová zpráva.\",\n\t\"An unsupported operation was attempted.\": \"Byl učiněn pokus o nepodporovanou operaci.\",\n\t\"A required resource was unavailable.\": \"Požadovaný zdroj nebyl dostupný.\",\n\t\"Out of memory.\": \"Nedostatek paměti.\",\n\t\"An unknown error has occurred.\": \"Došlo k neznámé chybě.\",\n\t\"on %1\": \"Na %1\",\n\t\"&One Page\": \"&Jedna stránka\",\n\t\"One Page\": \"Jedna stránka\",\n\t\"&Two Page\": \"&Dvě stránky\",\n\t\"Two Page\": \"Dvě stránky\",\n\t\"Page %u\": \"Stránka %u\",\n\t\"Pages %u-%u\": \"stránky %u-%u\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"Soubory tiskárny (*.prn)|*.prn|Všechny soubory (*.*)|*.*||\",\n\t\"Print to File\": \"Tisk do souboru\",\n\t\"to %1\": \"do %1\",\n\t\"&Update %1\": \"&Aktualizovat %1\",\n\t\"Update %1\": \"Aktualizovat %1\",\n\t\"E&xit && Return to %1\": \"&Ukončit a návrat do %1\",\n\t\"Exit & Return to %1\": \"Ukončit a návrat do %1\",\n\t\"Linked %s\": \"Připojený objekt %s\",\n\t\"Unknown Type\": \"Neznámý typ\",\n\t\"Invalid filename.\": \"Neplatný název souboru.\",\n\t\"Failed to open document.\": \"Dokument se nepodařilo otevřít.\",\n\t\"Failed to save document.\": \"Dokument se nepodařilo uložit.\",\n\t\"Save changes to %1?\": \"Chcete uložit změny v dokumentu %1?\",\n\t\"Failed to create empty document.\": \"Nepodařilo se vytvořit prázdný dokument.\",\n\t\"The file is too large to open.\": \"Soubor je pro otevření příliš veliký.\",\n\t\"Could not start print job.\": \"Tiskovou úlohu nelze zahájit.\",\n\t\"Failed to launch help.\": \"Nepodařilo se spustit nápovědu.\",\n\t\"Internal application error.\": \"Došlo k vnitřní chybě aplikace.\",\n\t\"Command failed.\": \"Došlo k chybě příkazu.\",\n\t\"Insufficient memory to perform operation.\": \"K provedení operace není dostatek paměti.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"Položky systémového registru byly odebrány a soubor INI, pokud existoval, byl odstraněn.\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"Nebyly odebrány všechny položky registru nebo soubor INI.\",\n\t\"This program requires the file %s, which was not found on this system.\": \"Tento program vyžaduje soubor %s, který ve vašem systému nebyl nalezen.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"Tento program je propojen s nenalezeným exportem %s v souboru %s. Tento počítač může obsahovat nekompatibilní verzi %s.\",\n\t\"Please enter an integer.\": \"Zadejte celé číslo.\",\n\t\"Please enter a number.\": \"Zadejte číslo.\",\n\t\"Please enter an integer between %1 and %2.\": \"Zadejte celé číslo od %1 do %2.\",\n\t\"Please enter a number between %1 and %2.\": \"Zadejte číslo od %1 do %2.\",\n\t\"Please enter no more than %1 characters.\": \"Zadejte maximálně %1 znaků.\",\n\t\"Please select a button.\": \"Klepněte na tlačítko.\",\n\t\"Please enter an integer between 0 and 255.\": \"Zadejte celé číslo od 0 do 255.\",\n\t\"Please enter a positive integer.\": \"Zadejte celé kladné číslo.\",\n\t\"Please enter a date and/or time.\": \"Zadejte datum nebo čas.\",\n\t\"Please enter a currency.\": \"Zadejte měnu.\",\n\t\"Unexpected file format.\": \"Neočekávaný formát souboru.\",\n\t\"Cannot find this file.\": \"Tento soubor nelze najít.\",\n\t\"Please verify that the correct path and file name are given.\": \"Zkontrolujte zadanou cestu a název souboru.\",\n\t\"Destination disk drive is full.\": \"Cílový disk je zaplněn.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"%1 nelze otevřít; je otevřen jiným programem.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"%1 nelze uložit; je jen pro čtení nebo je otevřen jiným programem.\",\n\t\"An unexpected error occurred while reading %1.\": \"Došlo k neočekávané chybě během čtení souboru %1.\",\n\t\"An unexpected error occurred while writing %1.\": \"Došlo k neočekávané chybě během zápisu do souboru %1.\",\n\t\"Unable to register document.\": \"Dokument nelze zaregistrovat.\",\n\t\"The document may already be open.\": \"Možná je již otevřen.\",\n\t\"Update %1 before proceeding?\": \"Chcete %1 před pokračováním zaktualizovat?\",\n\t\"Could not update client.\": \"Klienta nelze zaktualizovat.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"Při registraci došlo k chybě. Funkce ActiveX nemusí pracovat správně.\",\n\t\"Failed to update the system registry.\": \"Nepodařilo se zaktualizovat systémový registr.\",\n\t\"Please try using REGEDIT.\": \"Zkuste použít program REGEDIT.\",\n\t\"Unable to read write-only property.\": \"Nelze přečíst vlastnost, která je jen pro zápis.\",\n\t\"Unable to write read-only property.\": \"Nelze zapsat vlastnost, která je jen pro čtení.\",\n\t\"Unable to load mail system support.\": \"Nelze načíst systémovou podporu pošty.\",\n\t\"Mail system DLL is invalid.\": \"Systémová dynamická knihovna pošty není platná.\",\n\t\"Send Mail failed to send message.\": \"Modul Send Mail nemohl odeslat zprávu.\",\n\t\"No error occurred.\": \"Nedošlo k žádné chybě.\",\n\t\"An unknown error occurred while accessing %1.\": \"Při přístupu k %1 došlo k neznámé chybě.\",\n\t\"%1 was not found.\": \"%1 nebyl nalezen.\",\n\t\"%1 contains an invalid path.\": \"%1 obsahuje neplatnou cestu.\",\n\t\"%1 could not be opened because there are too many open files.\": \"%1 nemohl být otevřen, protože je otevřeno příliš mnoho souborů.\",\n\t\"Access to %1 was denied.\": \"Přístup k %1 byl odepřen.\",\n\t\"An invalid file handle was associated with %1.\": \"K %1 byl přidružen neplatný souborový manipulátor.\",\n\t\"%1 could not be removed because it is the current directory.\": \"%1 nemohl být odstraněn, protože to je aktuální adresář.\",\n\t\"%1 could not be created because the directory is full.\": \"%1 nemohl být vytvořen, protože adresář je plný.\",\n\t\"Seek failed on %1\": \"Hledání selhalo na %1\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"Při přístupu k %1 byla ohlášena vstupně-výstupní chyba hardwaru.\",\n\t\"A sharing violation occurred while accessing %1.\": \"Při přístupu k %1 došlo k porušení sdílení.\",\n\t\"A locking violation occurred while accessing %1.\": \"Při přístupu k %1 došlo k porušení uzamčení.\",\n\t\"Disk full while accessing %1.\": \"Při přístupu k %1 došlo k zaplnění disku.\",\n\t\"An attempt was made to access %1 past its end.\": \"Byl učiněn pokus přistoupit k %1 po jeho ukončení.\",\n\t\"An attempt was made to write to the reading %1.\": \"Byl učiněn pokus zapsat při čtení %1.\",\n\t\"An attempt was made to read from the writing %1.\": \"Byl učiněn pokus číst při zápisu do %1.\",\n\t\"%1 has a bad format.\": \"%1 má chybný formát.\",\n\t\"%1 contained an unexpected object.\": \"%1 obsahoval neočekávaný objekt.\",\n\t\"%1 contains an incorrect schema.\": \"%1 obsahuje nesprávné schéma.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"Vybere pravoúhlou část obrázku, která může být přesouvána, kopírována nebo upravována.\",\n\t\"Select\": \"Výběr\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"Ohraničením vybere část obrázku, která může být přesouvána, kopírována nebo upravována.\",\n\t\"Free-Form Select\": \"Výběr libovolného tvaru\",\n\t\"Inserts text into the picture.\": \"Zapíše text do obrázku.\",\n\t\"Fills an area with the current drawing color.\": \"Vyplní oblast aktuální barvou pera.\",\n\t\"Fill With Color\": \"Plechovka\",\n\t\"Draws a straight line with the selected line width.\": \"Nakreslí úsečku zvolené tloušťky.\",\n\t\"Line\": \"Úsečka\",\n\t\"Draws using an airbrush of the selected size.\": \"Maluje sprejem zvolené velikosti.\",\n\t\"Airbrush\": \"Sprej\",\n\t\"Draws a curved line with the selected line width.\": \"Kreslí křivku zvolené tloušťky.\",\n\t\"Curve\": \"Křivka\",\n\t\"Draws a polygon with the selected fill style.\": \"Kreslí mnohoúhelník se zvolenou výplní.\",\n\t\"Polygon\": \"Mnohoúhelník\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"Kreslí zaoblený obdélník se zvolenou výplní.\",\n\t\"Rounded Rectangle\": \"Zaoblený obdélník\",\n\t\"Draws a free-form line one pixel wide.\": \"Kreslí od ruky čáru tloušťky 1 bod.\",\n\t\"Pencil\": \"Tužka\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"Vymaže část obrázku zvoleným tvarem gumy.\",\n\t\"Eraser/Color Eraser\": \"Guma a barevná guma\",\n\t\"Changes the magnification.\": \"Změní měřítko zobrazení.\",\n\t\"Magnifier\": \"Lupa\",\n\t\"Picks up a color from the picture for drawing.\": \"Nabere z obrázku barvu do pera.\",\n\t\"Pick Color\": \"Kapátko\",\n\t\"Draws using a brush with the selected shape and size.\": \"Maluje štětcem zvoleného tvaru a tloušťky.\",\n\t\"Brush\": \"Štětec\",\n\t\"Draws a rectangle with the selected fill style.\": \"Kreslí obdélník se zvolenou výplní.\",\n\t\"Rectangle\": \"Obdélník\",\n\t\"Draws a filled rectangle.\": \"Kreslí plný obdélník.\",\n\t\"Draws an ellipse with the selected fill style.\": \"Kreslí elipsu se zvolenou výplní.\",\n\t\"Ellipse\": \"Elipsa\",\n\t\"Draws a filled ellipse.\": \"Kreslí plnou elipsu.\",\n\t\"Makes the current selection either opaque or transparent.\": \"Změní aktuální výběr na neprůhledný nebo průhledný.\",\n\t\"Creates a new color.\": \"Připraví novou barvu.\",\n\t\"Uses a previously saved palette of colors.\": \"Použije dříve uloženou paletu barev.\",\n\t\"Saves the current palette of colors to a file.\": \"Uloží tuto barevnou paletu do souboru.\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"Než obrázek použijete jako tapetu, musíte ho uložit.\",\n\t\"The selection is now larger than the bitmap.\": \"Vybraná část je nyní větší než rastr.\",\n\t\"Would you like the bitmap enlarged?\": \"Chcete rastr zvětšit?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"Obraz ve schránce je větší než rastr.\",\n\t\"The file is not in the correct format.\": \"Formát souboru není správný.\",\n\t\"Not enough room to paste text.\": \"K vložení textu není dost místa.\",\n\t\"Enlarge the text area and try again.\": \"Zvětšete oblast pro text a akci zopakujte.\",\n\t\"Places the text.\": \"Umístí text.\"\n});\n"
  },
  {
    "path": "localization/da/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"da\", {\n\t\"Attributes\": \"Attributter\",\n\t\"&Width:\": \"&Bredde:\",\n\t\"Width:\": \"Bredde:\",\n\t\"&Height:\": \"H&øjde:\",\n\t\"Height:\": \"Højde:\",\n\t\"Units\": \"Måleenhed\",\n\t\"&Inches\": \"&Tommer\",\n\t\"Inches\": \"Tommer\",\n\t\"C&m\": \"&Cm\",\n\t\"Cm\": \"Cm\",\n\t\"&Pixels\": \"&Pixel\",\n\t\"Pixels\": \"Pixel\",\n\t\"Colors\": \"Farver\",\n\t\"&Black and white\": \"Sort-&hvid\",\n\t\"Black and white\": \"Sort-hvid\",\n\t\"Co&lors\": \"&Farver\",\n\t\"Transparency\": \"Gennemsigtighed\",\n\t\"Use &Transparent background color\": \"Br&ug gennemsigtig baggrundsfarve\",\n\t\"Use Transparent background color\": \"Brug gennemsigtig baggrundsfarve\",\n\t\"Select &Color\": \"&Vælg farve\",\n\t\"Select Color\": \"Vælg farve\",\n\t\"Cancel\": \"Annuller\",\n\t\"&Default\": \"&Standard\",\n\t\"Default\": \"Standard\",\n\t\"Custom Zoom\": \"Brugerdefineret zoom\",\n\t\"Current zoom:\": \"Aktuel zoomprocent:\",\n\t\"Zoom to\": \"Zoom til\",\n\t\"Flip and Rotate\": \"Vend og roter\",\n\t\"Flip or rotate\": \"Spejlvend eller roter\",\n\t\"&Flip horizontal\": \"&Spejlvend vandret\",\n\t\"Flip horizontal\": \"Spejlvend vandret\",\n\t\"Flip &vertical\": \"Sp&ejlvend lodret\",\n\t\"Flip vertical\": \"Spejlvend lodret\",\n\t\"&Rotate by angle\": \"&Roter efter vinkel\",\n\t\"Rotate by angle\": \"Roter efter vinkel\",\n\t\"Stretch and Skew\": \"Stræk og vrid\",\n\t\"Stretch\": \"Stræk\",\n\t\"&Horizontal:\": \"&Vandret:\",\n\t\"Horizontal:\": \"Vandret:\",\n\t\"&Vertical:\": \"&Lodret:\",\n\t\"Vertical:\": \"Lodret:\",\n\t\"Skew\": \"Vrid\",\n\t\"H&orizontal:\": \"Va&ndret:\",\n\t\"Degrees\": \"grader\",\n\t\"V&ertical:\": \"Lodr&et:\",\n\t\"Color Table\": \"Farvetabel\",\n\t\"New\": \"Ny\",\n\t\"&New \": \"&Ny \",\n\t\"New \": \"Ny \",\n\t\"&Help\": \"&Hjælp\",\n\t\"Help\": \"Hjælp\",\n\t\"Printing\": \"Udskriver\",\n\t\"on the\": \"på\",\n\t\"&Print\": \"&Udskriv\",\n\t\"Print\": \"Udskriv\",\n\t\"&Next Page\": \"N&æste side\",\n\t\"Next Page\": \"Næste side\",\n\t\"Pre&v Page\": \"&Forrige side\",\n\t\"Prev Page\": \"Forrige side\",\n\t\"Zoom &In\": \"Zoom &ind\",\n\t\"Zoom In\": \"Zoom ind\",\n\t\"Zoom &Out\": \"Zoo&m ud\",\n\t\"Zoom Out\": \"Zoom ud\",\n\t\"&Close\": \"&Luk\",\n\t\"Close\": \"Luk\",\n\t\"Grid Settings\": \"Gitterindstillinger\",\n\t\"&Pixel Grid\": \"&Pixelgitter\",\n\t\"Pixel Grid\": \"Pixelgitter\",\n\t\"&Tile Grid\": \"&Arranger gitter\",\n\t\"Tile Grid\": \"Arranger gitter\",\n\t\"pixels\": \"pixel\",\n\t\"H&eight:\": \"&Højde:\",\n\t\"Text\": \"Tekst\",\n\t\"Undo\": \"Fortryd\",\n\t\"Cut\": \"Klip\",\n\t\"Copy\": \"Kopier\",\n\t\"Paste\": \"Sæt ind\",\n\t\"Clear Selection\": \"Slet markering\",\n\t\"Select All\": \"Marker alt\",\n\t\"Text Toolbar\": \"Værktøjslinjen Tekst\",\n\t\"Selection\": \"Markering\",\n\t\"Cu&t\": \"&Klip\",\n\t\"&Copy\": \"K&opier\",\n\t\"&Paste\": \"Sæt i&nd\",\n\t\"C&lear Selection\": \"&Slet markering\",\n\t\"Select &All\": \"&Marker alt\",\n\t\"C&opy To\": \"Kopier &til\",\n\t\"Copy To\": \"Kopier til\",\n\t\"Paste &From\": \"Sæt in&d fra\",\n\t\"Paste From\": \"Sæt ind fra\",\n\t\"Flip/&Rotate\": \"&Vend/roter\",\n\t\"Flip/Rotate\": \"Vend/roter\",\n\t\"&Stretch/Skew\": \"St&ræk/vrid\",\n\t\"Stretch/Skew\": \"Stræk/vrid\",\n\t\"&Invert Colors\": \"&Inverter farver\",\n\t\"Invert Colors\": \"Inverter farver\",\n\t\"Thumbnail\": \"Miniature\",\n\t\"&File\": \"&Filer\",\n\t\"File\": \"Filer\",\n\t\"&New\": \"&Ny\",\n\t\"&Open\": \"Å&bn\",\n\t\"Open\": \"Åbn\",\n\t\"&Save\": \"&Gem\",\n\t\"Save\": \"Gem\",\n\t\"Save &As\": \"Ge&m som\",\n\t\"Save As\": \"Gem som\",\n\t\"Print Pre&view\": \"&Vis udskrift\",\n\t\"Print Preview\": \"Vis udskrift\",\n\t\"Page Se&tup\": \"S&ideopsætning\",\n\t\"Page Setup\": \"Sideopsætning\",\n\t\"S&end\": \"&Send\",\n\t\"Send\": \"Send\",\n\t\"Set As &Wallpaper (Tiled)\": \"Anven&d som tapet (side om side)\",\n\t\"Set As Wallpaper (Tiled)\": \"Anvend som tapet (side om side)\",\n\t\"Set As Wa&llpaper (Centered)\": \"Anvend som &tapet (centreret)\",\n\t\"Set As Wallpaper (Centered)\": \"Anvend som tapet (centreret)\",\n\t\"Recent File\": \"Seneste fil\",\n\t\"E&xit\": \"&Afslut\",\n\t\"Exit\": \"Afslut\",\n\t\"&Edit\": \"&Rediger\",\n\t\"Edit\": \"Rediger\",\n\t\"&Undo\": \"Fo&rtryd\",\n\t\"&Repeat\": \"&Gentag\",\n\t\"Repeat\": \"Gentag\",\n\t\"&View\": \"&Vis\",\n\t\"View\": \"Vis\",\n\t\"&Tool Box\": \"&Værktøjskasse\",\n\t\"Tool Box\": \"Værktøjskasse\",\n\t\"&Color Box\": \"&Farveboks\",\n\t\"Color Box\": \"Farveboks\",\n\t\"&Status Bar\": \"&Statuslinje\",\n\t\"Status Bar\": \"Statuslinje\",\n\t\"T&ext Toolbar\": \"Værktøjslinjen Skrift&typer\",\n\t\"&Normal Size\": \"&Normal størrelse\",\n\t\"Normal Size\": \"Normal størrelse\",\n\t\"&Large Size\": \"&Stor størrelse\",\n\t\"Large Size\": \"Stor størrelse\",\n\t\"C&ustom\": \"Bruger&defineret\",\n\t\"Custom\": \"Brugerdefineret\",\n\t\"Show &Grid\": \"V&is gitter\",\n\t\"Show Grid\": \"Vis gitter\",\n\t\"Show T&humbnail\": \"&Vis miniature\",\n\t\"Show Thumbnail\": \"Vis miniature\",\n\t\"&View Bitmap\": \"Vis &bitmap\",\n\t\"View Bitmap\": \"Vis bitmap\",\n\t\"Ctrl+F\": \"Ctrl+B\",\n\t\"&Image\": \"&Billede\",\n\t\"Image\": \"Billede\",\n\t\"&Flip/Rotate\": \"&Vend/roter\",\n\t\"&Attributes\": \"&Attributter\",\n\t\"&Clear Image\": \"&Ryd billede\",\n\t\"Clear Image\": \"Ryd billede\",\n\t\"&Draw Opaque\": \"&Tegn uigennemsigtigt\",\n\t\"Draw Opaque\": \"Tegn uigennemsigtigt\",\n\t\"&Colors\": \"F&arver\",\n\t\"&Edit Colors\": \"&Rediger farver\",\n\t\"Edit Colors\": \"Rediger farver\",\n\t\"&Help Topics\": \"Emner i &Hjælp\",\n\t\"Help Topics\": \"Emner i Hjælp\",\n\t\"&About Paint\": \"&Om Paint\",\n\t\"About Paint\": \"Om Paint\",\n\t\"&Update\": \"Op&dater\",\n\t\"Update\": \"Opdater\",\n\t\"Save Copy &As\": \"Gem &kopi som\",\n\t\"Save Copy As\": \"Gem kopi som\",\n\t\"untitled\": \"Ikke-navngivet\",\n\t\"Bitmap Image\": \"Bitmapbillede\",\n\t\"Bitmap Files (*.bmp)\": \"Bitmapfiler (*.bmp)\",\n\t\"PCX Files\": \"PCX-filer\",\n\t\"Icon Files\": \"Ikonfiler\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"Monokrom bitmap (*.bmp,*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"16-farvers bitmap (*.bmp,*.dip)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"256-farvers bitmap (*.bmp,*.dip)\",\n\t\"Paint cannot open this file.\": \"Paint kan ikke åbne denne fil.\",\n\t\"Paint cannot read this file.\": \"Paint kan ikke læse denne fil.\",\n\t\"This file is read-only.\": \"Filen er skrivebeskyttet.\",\n\t\"To save your changes, use a different filename.\": \"Hvis du vil gemme ændringerne, skal du benytte et andet filnavn.\",\n\t\"This file is already open.\": \"Filen er allerede åben.\",\n\t\"This is not a valid .PCS file.\": \"Dette er ikke en gyldig .PCS-fil.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"Denne fil er åbnet til redigering og kan ikke overskrives.\",\n\t\"Use a different filename to save your changes.\": \"Hvis du vil gemme ændringerne, skal du benytte et andet filnavn.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"Enten er dette ikke en gyldig bitmap-fil eller også understøttes formatet ikke.\",\n\t\"This is not a valid icon.\": \"Dette er ikke et gyldigt ikon.\",\n\t\"This is not a valid cursor.\": \"Dette er ikke en gyldig markør.\",\n\t\"Save was interrupted, so your file has not been saved.\": \"Lagringen blev afbrudt, så filen er ikke blevet gemt.\",\n\t\"You cannot save to a read-only file.\": \"Du kan ikke gemme i en skrivebeskyttet fil.\",\n\t\"Use a different file name.\": \"Benyt et andet filnavn.\",\n\t\"This file is already in use.\": \"Filen er i brug.\",\n\t\"Close the program, and then try again.\": \"Luk programmet, og prøv igen.\",\n\t\"Paint cannot save this file.\": \"Paint kan ikke gemme denne fil.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"Filen kan ikke gemmes under samme filnavn, men med et andet filtypenavn.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"Gitterafstanden skal være et heltal mellem %d og %d.\",\n\t\"There is not enough memory or resources to complete operation.\": \"Der er ikke tilstrækkelig hukommelse eller tilstrækkelige ressourcer til at udføre handlingen.\",\n\t\"Close some programs, and then try again.\": \"Luk nogle programmer, og prøv igen.\",\n\t\"Low on memory or resources.\": \"Der er næsten ikke mere hukommelse eller næsten ikke flere ressourcer.\",\n\t\"Group error.\": \"Gruppefejl.\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"Paint kunne ikke udskrive dit dokument. Kontroller, at der er tilstrækkelig plads på harddisken og at printeren fungerer korrekt.\",\n\t\"Saving into this format may cause some loss of color information.\": \"Hvis du gemmer i dette format, kan visse farveoplysninger gå tabt.\",\n\t\"Do you want to continue?\": \"Vil du fortsætte?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"Konverteringen til sort-hvid kan ikke annulleres. Denne handling påvirker den aktuelle fil og kan medføre tab af farveoplysninger.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"Bitmaps skal være større end én pixel på hver led.\",\n\t\"Generic error.\": \"Standardfejl.\",\n\t\"File not found.\": \"Filen blev ikke fundet.\",\n\t\"Bad path.\": \"Forkert sti.\",\n\t\"Too many open files.\": \"Der er for mange filer åbne.\",\n\t\"Access denied.\": \"Adgang nægtet.\",\n\t\"Invalid file.\": \"Filen er ugyldig.\",\n\t\"Remove current folder.\": \"Fjern den aktuelle mappe.\",\n\t\"Folder full.\": \"Mappen er fuld.\",\n\t\"Bad seek.\": \"Forkert søgning.\",\n\t\"Hard IO error.\": \"IO-harddiskfejl.\",\n\t\"Sharing violation.\": \"Fildelingsfejl.\",\n\t\"Lock violation.\": \"Låsningsfejl.\",\n\t\"Disk full.\": \"Disken er fuld.\",\n\t\"End of file.\": \"Slut på fil.\",\n\t\"Error getting the Clipboard Data!\": \"Fejl under hentning af data fra Udklipsholder.\",\n\t\"No Printer Found @ page setup\": \"Ingen printer fundet @ sideopsætning\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"24-bit bitmap (*.bmp,*.dip)\",\n\t\"All Files\": \"Alle filer\",\n\t\"Palette|*.pal|\": \"Palet|*.pal|\",\n\t\"untitled.pal\": \"udennavn.pal\",\n\t\"OLE 2.0 was unable to start.\": \"OLE 2.0 kunne ikke startes.\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"Kontroller, at du anvender den rigtige version af OLE-bibliotekerne.\",\n\t\"Resets the text be without any attributes.\": \"Nulstiller teksten uden attributter\",\n\t\"Sets or clears the text bold attribute.\": \"Slår skriftattributten Fed fra eller til\",\n\t\"Sets or clears the text italic attribute.\": \"Slår skriftattributten Kursiv fra eller til\",\n\t\"Selects the font used by the text.\": \"Vælger den skrifttype, der bruges i teksten\",\n\t\"Selects the point size of the text.\": \"Vælger skriftstørrelse i teksten\",\n\t\"Sets or clears the text underline attribute.\": \"Slår skriftattributten Understreget fra eller til\",\n\t\"Shows or hides the tooltips.\": \"Viser eller skjuler værktøjstip\",\n\t\"Show Paint Help.\": \"Viser Hjælp til Paint\",\n\t\"Sends a picture by using mail or fax.\": \"Sender et billede med elektronisk post eller fax\",\n\t\"Copies the selection to a file.\": \"Kopierer markeringen til en fil\",\n\t\"Pastes a file into the selection.\": \"Indsætter en fil i markeringen\",\n\t\"Zooms the picture to 100%.\": \"Zoomer billedet med 100%\",\n\t\"Zooms the picture to 400%.\": \"Zoomer billedet med 400%\",\n\t\"Zooms the picture.\": \"Zoomer billedet\",\n\t\"Displays the entire picture.\": \"Viser hele billedet\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"Viser eller skjuler miniaturen\",\n\t\"Shows or hides the grid.\": \"Viser eller skjuler gitteret\",\n\t\"Shows or hides the text toolbar.\": \"Viser eller skjuler værktøjslinjen Tekst\",\n\t\"Flips or rotates the picture or a selection.\": \"Spejlvender eller roterer billedet eller en markering\",\n\t\"Stretches or skews the picture or a selection.\": \"Strækker eller vrider billedet eller en markering\",\n\t\"Inverts the colors of the picture or a selection.\": \"Inverterer farverne på billedet eller en markering\",\n\t\"Changes the attributes of the picture.\": \"Ændrer billedets egenskaber\",\n\t\"Clears the picture or selection.\": \"Sletter billedet eller markeringen\",\n\t\"The font size must be a numeric value.\": \"Skriftstørrelsen skal være en numerisk værdi.\",\n\t\"Contains commands for working with the selected item(s).\": \"Indeholder kommandoer til arbejde med det eller de markerede elementer\",\n\t\"Contains commands for selecting and transferring items.\": \"Indeholder kommandoer til markering og overførsel af elementer\",\n\t\"Contains commands for customizing this window.\": \"Indeholder kommandoer til tilpasning af vinduet\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"Indeholder kommandoer til håndtering af billeder og indstilling af attributter\",\n\t\"Contains commands for using custom colors and drawing options.\": \"Indeholder kommandoer til brug af brugerdefinerede farver og tegneindstillinger\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"Indeholder kommandoer til visning af Hjælp til og oplysninger om Paint\",\n\t\"Cannot save file.\": \"Filen kan ikke gemmes.\",\n\t\"Error removing temporary file.\": \"Fejl under fjernelse af midlertidig fil.\",\n\t\"Get Colors\": \"Hent farver\",\n\t\"Save Colors\": \"Gem farver\",\n\t\"File last saved:\": \"Filen blev sidst gemt:\",\n\t\"Not Available\": \"Ikke tilgængelig\",\n\t\"Size on disk:\": \"Størrelse på disk:\",\n\t\"%s bytes\": \"%s byte\",\n\t\"Painting\": \"Maler\",\n\t\"Fonts\": \"Skrifttyper\",\n\t\"Tools\": \"Funktioner\",\n\t\"All Picture Files\": \"Alle billedfiler\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"Klik på Emner i Hjælp i menuen Hjælp for at få hjælp\",\n\t\"Select an area on which to get Help.\": \"Marker et område, som du vil have hjælp til.\",\n\t\"%1 in %2\": \"%1 i %2\",\n\t\"Creates a new document.\": \"Opretter et nyt dokument\",\n\t\"Opens an existing document.\": \"Åbner et eksisterende dokument\",\n\t\"Closes the active document.\": \"Lukker det aktive dokument\",\n\t\"Saves the active document.\": \"Gemmer det aktive dokument\",\n\t\"Saves the active document with a new name.\": \"Gemmer det aktive dokument under et nyt navn\",\n\t\"Changes the page layout.\": \"Ændrer sideopsætningen\",\n\t\"Specifies the default printer setup.\": \"Angiver standardindstillinger for printeren\",\n\t\"Prints the active document and sets printing options.\": \"Udskriver det aktive dokument og definerer udskriftsindstillinger\",\n\t\"Displays full pages.\": \"Viser hele sider\",\n\t\"Opens this document.\": \"Åbner dokumentet\",\n\t\"Deletes the selection.\": \"Sletter markeringen\",\n\t\"Erases everything.\": \"Sletter alt\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"Kopierer markeringen og placerer den i Udklipsholder\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"Klipper markeringen ud og placerer den i Udklipsholder\",\n\t\"Finds the specified text.\": \"Søger efter den angivne tekst\",\n\t\"Inserts the contents of the Clipboard.\": \"Indsætter indholdet af Udklipsholder\",\n\t\"Repeats the last action.\": \"Gentager den sidste handling\",\n\t\"Replaces specific text with different text.\": \"Erstatter bestemt tekst med anden tekst\",\n\t\"Selects everything.\": \"Markerer hele dokumentet\",\n\t\"Undoes the last action.\": \"Fortryder den sidste handling\",\n\t\"Redoes the previously undone action.\": \"Annullerer fortrydelsen af den tidligere fortrudte handling\",\n\t\"Displays program information, version number, and copyright.\": \"Viser programoplysninger, versionsnummer og copyright\",\n\t\"Quits Paint.\": \"Afslutter Paint\",\n\t\"Opens Paint Help.\": \"Åbner Paint Hjælp\",\n\t\"Displays instructions about how to use Help.\": \"Viser instruktioner om brugen af Hjælp\",\n\t\"Displays Help for areas you click on.\": \"Viser hjælp til områder, som du klikker på\",\n\t\"Displays Help for the current task or command.\": \"Viser hjælp til den aktuelle opgave eller kommando\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"Centrerer bitmappen som tapet bag skrivebordet\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"Arrangerer bitmappen som tapet bag skrivebordet\",\n\t\"Sends the selection using mail or fax.\": \"Sender markeringen med elektronisk post eller fax\",\n\t\"Prints the selection.\": \"Udskriver markeringen\",\n\t\"Shows or hides the thumbnail.\": \"Viser eller skjuler miniaturen\",\n\t\"Shows Paint Help.\": \"Viser Paint Hjælp\",\n\t\"Shows or hides the status bar.\": \"Viser eller skjuler statuslinjen\",\n\t\"Shows or hides the tool box.\": \"Viser eller skjuler værktøjskassen\",\n\t\"Shows or hides the color box.\": \"Viser eller skjuler farveboksen\",\n\t\"Only a Far East font can be used for vertical editing.\": \"Kun en fjernøstlig skrifttype kan bruges til lodret redigering.\",\n\t\"Changes the window size.\": \"Ændrer vinduesstørrelsen\",\n\t\"Changes the window position.\": \"Ændrer vinduesplaceringen\",\n\t\"Reduces the window to an icon.\": \"Formindsker vinduet til et ikon\",\n\t\"Enlarges the window to full size.\": \"Forstørrer vinduet til fuld størrelse\",\n\t\"Switches to the next document window.\": \"Skifter til næste dokumentvindue\",\n\t\"Switches to the previous document window.\": \"Skifter til det forrige dokumentvindue\",\n\t\"Closes the active window and asks if you want to save changes.\": \"Lukker det aktive vindue og spørger, om du vil gemme dokumenterne\",\n\t\"Restores the window to normal size.\": \"Gendanner vinduet til normal størrelse\",\n\t\"Activates the task list.\": \"Aktiverer Jobliste\",\n\t\"All Files (*.*)\": \"Alle filer (*.*)\",\n\t\"Untitled\": \"Ikke-navngivet\",\n\t\"an unnamed file\": \"en ikke-navngivet fil\",\n\t\"&Hide\": \"&Skjul\",\n\t\"Hide\": \"Skjul\",\n\t\"No error message is available.\": \"Der er ingen fejlmeddelelse tilgængelig.\",\n\t\"An unsupported operation was attempted.\": \"Det blev forsøgt at udføre en ikke-understøttet handling.\",\n\t\"A required resource was unavailable.\": \"En krævet ressource var ikke tilgængelig.\",\n\t\"Out of memory.\": \"Der er ikke mere hukommelse.\",\n\t\"An unknown error has occurred.\": \"Der er opstået en ukendt fejl.\",\n\t\"on %1\": \"tilsluttet %1\",\n\t\"&One Page\": \"&En side\",\n\t\"One Page\": \"En side\",\n\t\"&Two Page\": \"&To sider\",\n\t\"Two Page\": \"To sider\",\n\t\"Page %u\": \"Side %u\",\n\t\"Pages %u-%u\": \"Sider %u-%u\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"Printerfiler (*.prn)|*.prn|Alle filer (*.*)|*.*||\",\n\t\"Print to File\": \"Skriv til fil\",\n\t\"to %1\": \"til %1\",\n\t\"&Update %1\": \"&Opdater %1\",\n\t\"Update %1\": \"Opdater %1\",\n\t\"E&xit && Return to %1\": \"A&fslut, og vend tilbage til %1\",\n\t\"Exit & Return to %1\": \"Afslut, og vend tilbage til %1\",\n\t\"Linked %s\": \"Sammenkædet %s\",\n\t\"Unknown Type\": \"Ukendt type\",\n\t\"Invalid filename.\": \"Ugyldigt filnavn.\",\n\t\"Failed to open document.\": \"Dokumentet kunne ikke åbnes.\",\n\t\"Failed to save document.\": \"Dokumentet kunne ikke gemmes.\",\n\t\"Save changes to %1?\": \"Skal ændringerne i %1 gemmes?\",\n\t\"Failed to create empty document.\": \"Der kunne ikke oprettes et tomt dokument.\",\n\t\"The file is too large to open.\": \"Filen er for stor til at åbne.\",\n\t\"Could not start print job.\": \"Udskriftsjob kunne ikke startes.\",\n\t\"Failed to launch help.\": \"Hjælp kunne ikke startes.\",\n\t\"Internal application error.\": \"Intern programfejl.\",\n\t\"Command failed.\": \"Kommandoen mislykkedes.\",\n\t\"Insufficient memory to perform operation.\": \"Der er ikke tilstrækkelig hukommelse til at udføre handlingen.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"Systemposter i registreringsdatabasen er blevet fjernet, og INI-filen (hvis der var en) er blevet slettet.\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"Nogle af systemposterne i registreringsdatabasen eller INI-filen blev ikke fjernet.\",\n\t\"This program requires the file %s, which was not found on this system.\": \"Dette program kræver filen %s, som ikke blev fundet på dette system.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"Dette program er kædet til den manglende eksport %s i filen %s. Denne computer har muligvis en ikke-kompatibel version af %s.\",\n\t\"Please enter an integer.\": \"Indtast et heltal.\",\n\t\"Please enter a number.\": \"Indtast et tal.\",\n\t\"Please enter an integer between %1 and %2.\": \"Indtast et heltal mellem %1 og %2.\",\n\t\"Please enter a number between %1 and %2.\": \"Indtast et tal mellem %1 og %2.\",\n\t\"Please enter no more than %1 characters.\": \"Indtast højst %1 tegn.\",\n\t\"Please select a button.\": \"Vælg en knap.\",\n\t\"Please enter an integer between 0 and 255.\": \"Skriv et heltal mellem 0 og 255.\",\n\t\"Please enter a positive integer.\": \"Skriv et positivt heltal.\",\n\t\"Please enter a date and/or time.\": \"Indtast dato og/eller klokkeslæt.\",\n\t\"Please enter a currency.\": \"Angiv en valuta.\",\n\t\"Unexpected file format.\": \"Uventet filformat.\",\n\t\"Cannot find this file.\": \"Denne fil kan ikke findes.\",\n\t\"Please verify that the correct path and file name are given.\": \"Kontroller, at sti og filnavn er korrekt.\",\n\t\"Destination disk drive is full.\": \"Destinationsdrevet er fuldt.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"Der kan ikke læses fra %1. Filen er åbnet af en anden bruger.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"Der kan ikke skrives til %1. Filen er skrivebeskyttet eller åbnet af en anden bruger.\",\n\t\"An unexpected error occurred while reading %1.\": \"Der opstod en uventet fejl under indlæsning af %1.\",\n\t\"An unexpected error occurred while writing %1.\": \"Der opstod en uventet fejl under skrivning til %1.\",\n\t\"Unable to register document.\": \"Dokumentet kunne ikke registreres.\",\n\t\"The document may already be open.\": \"Dokumentet er muligvis allerede åbnet.\",\n\t\"Update %1 before proceeding?\": \"Skal %1 opdateres, inden der fortsættes?\",\n\t\"Could not update client.\": \"Klientprogrammet kunne ikke opdateres.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"Der kan ikke registreres. ActiveX-funktioner virker måske ikke korrekt.\",\n\t\"Failed to update the system registry.\": \"Kan ikke opdatere systemregistreringsdatabasen.\",\n\t\"Please try using REGEDIT.\": \"Benyt REGEDIT.\",\n\t\"Unable to read write-only property.\": \"En læsebeskyttet egenskab kan ikke læses.\",\n\t\"Unable to write read-only property.\": \"En skrivebeskyttet egenskab kan ikke skrives.\",\n\t\"Unable to load mail system support.\": \"Der kan ikke indlæses understøttelse af postsystem.\",\n\t\"Mail system DLL is invalid.\": \"DLL-filen til e-mail-system er ugyldig.\",\n\t\"Send Mail failed to send message.\": \"Send post kunne ikke sende meddelelsen.\",\n\t\"No error occurred.\": \"Der opstod ingen fejl.\",\n\t\"An unknown error occurred while accessing %1.\": \"Der opstod en ukendt fejl ved adgang til %1.\",\n\t\"%1 was not found.\": \"%1 blev ikke fundet.\",\n\t\"%1 contains an invalid path.\": \"%1 indeholder en ugyldig sti.\",\n\t\"%1 could not be opened because there are too many open files.\": \"%1 kunne ikke åbnes, fordi der er for mange åbne filer.\",\n\t\"Access to %1 was denied.\": \"Adgang til %1 nægtet.\",\n\t\"An invalid file handle was associated with %1.\": \"En ugyldig fil-handle blev associeret med %1.\",\n\t\"%1 could not be removed because it is the current directory.\": \"%1 kunne ikke fjernes, da den er den aktive mappe.\",\n\t\"%1 could not be created because the directory is full.\": \"%1 kunne ikke oprettes, fordi mappen er fuld.\",\n\t\"Seek failed on %1\": \"Søgning på %1 mislykkedes\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"Der opstod en hardware I/O-fejl ved adgang til %1.\",\n\t\"A sharing violation occurred while accessing %1.\": \"Der opstod en delingsfejl ved adgang til %1.\",\n\t\"A locking violation occurred while accessing %1.\": \"Der opstod en låsefejl ved adgang til %1.\",\n\t\"Disk full while accessing %1.\": \"Disken blev fuld ved adgang til %1.\",\n\t\"An attempt was made to access %1 past its end.\": \"Det blev forsøgt at få adgang til %1 efter dens afslutning.\",\n\t\"An attempt was made to write to the reading %1.\": \"Det blev forsøgt at skrive til %1, som var i færd med at læse.\",\n\t\"An attempt was made to read from the writing %1.\": \"Det blev forsøgt at læse fra %1, som i øjeblikket er ved at skrive.\",\n\t\"%1 has a bad format.\": \"%1 har et ugyldigt format.\",\n\t\"%1 contained an unexpected object.\": \"%1 indeholdt et uventet objekt.\",\n\t\"%1 contains an incorrect schema.\": \"%1 indeholder et ugyldigt skema.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"Markerer et firkantet område af billedet, som kan flyttes, kopieres eller redigeres \",\n\t\"Select\": \"Marker\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"Markerer et frihåndsudsnit af billedet, som kan flyttes, kopieres eller redigeres \",\n\t\"Free-Form Select\": \"Frihåndsmarkering\",\n\t\"Inserts text into the picture.\": \"Indsætter tekst i billedet \",\n\t\"Fills an area with the current drawing color.\": \"Udfylder et område med den aktuelle tegnefarve \",\n\t\"Fill With Color\": \"Udfyld med farve\",\n\t\"Draws a straight line with the selected line width.\": \"Tegner en lige streg med den valgte stregtykkelse \",\n\t\"Line\": \"Streger\",\n\t\"Draws using an airbrush of the selected size.\": \"Tegner med en airbrush af den markerede størrelse.\",\n\t\"Draws a curved line with the selected line width.\": \"Tegner en kurvet streg med den valgte stregtykkelse \",\n\t\"Curve\": \"Kurver\",\n\t\"Draws a polygon with the selected fill style.\": \"Tegner en polygon med den valgte stregtykkelse og fyldtype \",\n\t\"Polygon\": \"Polygoner\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"Tegner et afrundet rektangel med den valgte stregtykkelse og fyldtype \",\n\t\"Rounded Rectangle\": \"Afrundet rektangel\",\n\t\"Draws a free-form line one pixel wide.\": \"Tegner en frihåndsstreg, som er én pixel bred \",\n\t\"Pencil\": \"Blyant\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"Sletter en del af billedet med den markerede viskelæderform \",\n\t\"Eraser/Color Eraser\": \"Viskelæder/Farveviskelæder\",\n\t\"Changes the magnification.\": \"Ændrer forstørrelsen \",\n\t\"Magnifier\": \"Forstørrelsesglas\",\n\t\"Picks up a color from the picture for drawing.\": \"Samler en farve op fra billedet til at tegne med \",\n\t\"Pick Color\": \"Vælg farve\",\n\t\"Draws using a brush with the selected shape and size.\": \"Tegner med en pensel med den valgte facon og størrelse \",\n\t\"Brush\": \"Pensel\",\n\t\"Draws a rectangle with the selected fill style.\": \"Tegner et rektangel med den valgte stregtykkelse og det valgte fyldmønster \",\n\t\"Rectangle\": \"Rektangel\",\n\t\"Draws a filled rectangle.\": \"Tegner et udfyldt rektangel\",\n\t\"Draws an ellipse with the selected fill style.\": \"Tegner en ellipse med den valgte stregtykkelse og det valgte fyldmønster \",\n\t\"Draws a filled ellipse.\": \"Tegner en udfyldt ellipse\",\n\t\"Makes the current selection either opaque or transparent.\": \"Gør markeringen uigennemsigtigt eller gennemsigtigt\",\n\t\"Creates a new color.\": \"Opretter en ny farve\",\n\t\"Uses a previously saved palette of colors.\": \"Benytter en tidligere gemt farvepalet\",\n\t\"Saves the current palette of colors to a file.\": \"Gemmer den aktuelle farvepalet i en fil\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"Du skal gemme filen, inden du vælger den som tapet.\",\n\t\"The selection is now larger than the bitmap.\": \"Det markerede område er større end bitmappen.\",\n\t\"Would you like the bitmap enlarged?\": \"Skal bitmappen forstørres?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"Billedet i Udklipsholder er større end bitmappen.\",\n\t\"The file is not in the correct format.\": \"Filen har ikke det rigtige format.\",\n\t\"Not enough room to paste text.\": \"Der er ikke plads nok til at indsætte tekst.\",\n\t\"Enlarge the text area and try again.\": \"Gør tekstområdet større, og prøv igen.\",\n\t\"Places the text.\": \"Placerer teksten\"\n});\n"
  },
  {
    "path": "localization/de/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"de\", {\n\t\"Attributes\": \"Attribute\",\n\t\"&Width:\": \"&Breite:\",\n\t\"Width:\": \"Breite:\",\n\t\"&Height:\": \"&Höhe:\",\n\t\"Height:\": \"Höhe:\",\n\t\"Units\": \"Maßeinheit\",\n\t\"&Inches\": \"&Zoll\",\n\t\"Inches\": \"Zoll\",\n\t\"C&m\": \"&cm\",\n\t\"Cm\": \"cm\",\n\t\"&Pixels\": \"&Pixel\",\n\t\"Pixels\": \"Pixel\",\n\t\"Colors\": \"Farben\",\n\t\"&Black and white\": \"&Schwarzweiß\",\n\t\"Black and white\": \"Schwarzweiß\",\n\t\"Co&lors\": \"&Farben\",\n\t\"Transparency\": \"Transparenz\",\n\t\"Use &Transparent background color\": \"&Transparente Hintergrundfarbe\",\n\t\"Use Transparent background color\": \"Transparente Hintergrundfarbe\",\n\t\"Select &Color\": \"Farbe aus&wählen\",\n\t\"Select Color\": \"Farbe wählen\",\n\t\"Cancel\": \"Abbrechen\",\n\t\"&Default\": \"St&andard\",\n\t\"Default\": \"Standard\",\n\t\"Custom Zoom\": \"Vergrößerung\",\n\t\"Current zoom:\": \"Aktueller Zoomfaktor:\",\n\t\"Zoom to\": \"Neuer Zoomfaktor\",\n\t\"Flip and Rotate\": \"Bild drehen und spiegeln\",\n\t\"Flip or rotate\": \"Spiegeln oder drehen\",\n\t\"&Flip horizontal\": \"&Horizontal spiegeln\",\n\t\"Flip horizontal\": \"Horizontal spiegeln\",\n\t\"Flip &vertical\": \"&Vertikal spiegeln\",\n\t\"Flip vertical\": \"Vertikal spiegeln\",\n\t\"&Rotate by angle\": \"&Drehen im Winkel von:\",\n\t\"Rotate by angle\": \"Drehen im Winkel von:\",\n\t\"Stretch and Skew\": \"Bild strecken und zerren\",\n\t\"Stretch\": \"Strecken\",\n\t\"&Vertical:\": \"&Vertikal:\",\n\t\"Vertical:\": \"Vertikal:\",\n\t\"Skew\": \"Zerren\",\n\t\"Degrees\": \"Grad\",\n\t\"V&ertical:\": \"V&ertikal:\",\n\t\"Color Table\": \"Farbtabelle\",\n\t\"New\": \"Neu\",\n\t\"&New \": \"&Neu\",\n\t\"New \": \"Neu\",\n\t\"&Help\": \"&Hilfe\",\n\t\"Help\": \"Hilfe\",\n\t\"Printing\": \"Drucken von\",\n\t\"on the\": \"auf\",\n\t\"&Print\": \"&Drucken\",\n\t\"Print\": \"Drucken\",\n\t\"&Next Page\": \"&Weiter\",\n\t\"Next Page\": \"Weiter\",\n\t\"Pre&v Page\": \"&Zurück\",\n\t\"Prev Page\": \"Zurück\",\n\t\"Zoom &In\": \"&Vergrößern\",\n\t\"Zoom In\": \"Vergrößern\",\n\t\"Zoom &Out\": \"V&erkleinern\",\n\t\"Zoom Out\": \"Verkleinern\",\n\t\"&Close\": \"&Schließen\",\n\t\"Close\": \"Schließen\",\n\t\"Grid Settings\": \"Rastereinstellungen\",\n\t\"&Pixel Grid\": \"&Feinraster\",\n\t\"Pixel Grid\": \"Feinraster\",\n\t\"&Tile Grid\": \"&Grobraster\",\n\t\"Tile Grid\": \"Grobraster\",\n\t\"pixels\": \"Pixel\",\n\t\"H&eight:\": \"&Höhe:\",\n\t\"Undo\": \"Rückgängig\",\n\t\"Cut\": \"Ausschneiden\",\n\t\"Copy\": \"Kopieren\",\n\t\"Paste\": \"Einfügen\",\n\t\"Clear Selection\": \"Löschen\",\n\t\"Select All\": \"Alles markieren\",\n\t\"Text Toolbar\": \"Formatsymbolleiste\",\n\t\"Selection\": \"Auswahl\",\n\t\"Cu&t\": \"&Ausschneiden\",\n\t\"&Copy\": \"&Kopieren\",\n\t\"&Paste\": \"&Einfügen\",\n\t\"C&lear Selection\": \"&Löschen\",\n\t\"Select &All\": \"Alles &markieren\",\n\t\"C&opy To\": \"Kopiere&n nach\",\n\t\"Copy To\": \"Kopieren nach\",\n\t\"Paste &From\": \"Einfügen a&us\",\n\t\"Paste From\": \"Einfügen von\",\n\t\"Flip/&Rotate\": \"D&rehen/Spiegeln\",\n\t\"Flip/Rotate\": \"Drehen/Spiegeln\",\n\t\"&Stretch/Skew\": \"&Strecken/Zerren\",\n\t\"Stretch/Skew\": \"Strecken/Zerren\",\n\t\"&Invert Colors\": \"&Farben umkehren\",\n\t\"Invert Colors\": \"Farben umkehren\",\n\t\"Thumbnail\": \"Miniaturansicht\",\n\t\"&File\": \"&Datei\",\n\t\"File\": \"Datei\",\n\t\"&New\": \"&Neu\",\n\t\"Ctrl+N\": \"Strg+N\",\n\t\"&Open\": \"Ö&ffnen\",\n\t\"Open\": \"Öffnen\",\n\t\"Ctrl+O\": \"Strg+O\",\n\t\"&Save\": \"&Speichern\",\n\t\"Save\": \"Speichern\",\n\t\"Ctrl+S\": \"Strg+S\",\n\t\"Save &As\": \"Speichern &unter\",\n\t\"Save As\": \"Speichern unter\",\n\t\"Print Pre&view\": \"Seitenansi&cht\",\n\t\"Print Preview\": \"Seitenansicht\",\n\t\"Page Se&tup\": \"Seite ein&richten\",\n\t\"Page Setup\": \"Seite einrichten\",\n\t\"Ctrl+P\": \"Strg+P\",\n\t\"S&end\": \"S&enden\",\n\t\"Send\": \"Senden\",\n\t\"Set As &Wallpaper (Tiled)\": \"Als &Hintergrund (Fläche)\",\n\t\"Set As Wallpaper (Tiled)\": \"Als Hintergrund (Fläche)\",\n\t\"Set As Wa&llpaper (Centered)\": \"A&ls Hintergrund (Zentriert)\",\n\t\"Set As Wallpaper (Centered)\": \"Als Hintergrund (Zentriert)\",\n\t\"Recent File\": \"Vorherige Datei\",\n\t\"E&xit\": \"&Beenden\",\n\t\"Exit\": \"Beenden\",\n\t\"&Edit\": \"&Bearbeiten\",\n\t\"Edit\": \"Bearbeiten\",\n\t\"&Undo\": \"&Rückgängig\",\n\t\"Ctrl+Z\": \"Strg+Z\",\n\t\"&Repeat\": \"&Wiederholen\",\n\t\"Repeat\": \"Wiederholen\",\n\t\"Ctrl+X\": \"Strg+X\",\n\t\"Ctrl+C\": \"Strg+C\",\n\t\"Ctrl+V\": \"Strg+V\",\n\t\"Del\": \"Entf\",\n\t\"Ctrl+A\": \"Strg+A\",\n\t\"&View\": \"&Ansicht\",\n\t\"View\": \"Ansicht\",\n\t\"&Tool Box\": \"&Toolbox\",\n\t\"Tool Box\": \"Toolbox\",\n\t\"Ctrl+T\": \"Strg+T\",\n\t\"&Color Box\": \"&Farbpalette\",\n\t\"Color Box\": \"Farbpalette\",\n\t\"Ctrl+L\": \"Strg+F\",\n\t\"&Status Bar\": \"Status&leiste\",\n\t\"Status Bar\": \"Statusleiste\",\n\t\"T&ext Toolbar\": \"F&ormatsymbolleiste\",\n\t\"&Zoom\": \"&Zoomfaktor\",\n\t\"Zoom\": \"Zoomfaktor\",\n\t\"&Normal Size\": \"&Normalgröße\",\n\t\"Normal Size\": \"Normalgröße\",\n\t\"Ctrl+PgUp\": \"Strg+<\",\n\t\"&Large Size\": \"&Stark vergrößert\",\n\t\"Large Size\": \"Stark vergrößert\",\n\t\"Ctrl+PgDn\": \"Strg+>\",\n\t\"C&ustom\": \"&Benutzerdefiniert\",\n\t\"Custom\": \"Benutzerdefiniert\",\n\t\"Show &Grid\": \"&Raster einblenden\",\n\t\"Show Grid\": \"Raster einblenden\",\n\t\"Ctrl+G\": \"Strg+R\",\n\t\"Show T&humbnail\": \"&Miniaturansicht einblenden\",\n\t\"Show Thumbnail\": \"Miniaturansicht einblenden\",\n\t\"&View Bitmap\": \"&Gesamtbild\",\n\t\"View Bitmap\": \"Gesamtbild\",\n\t\"Ctrl+F\": \"Strg+G\",\n\t\"&Image\": \"B&ild\",\n\t\"Image\": \"Bild\",\n\t\"&Flip/Rotate\": \"D&rehen/Spiegeln\",\n\t\"Ctrl+R\": \"Strg+D\",\n\t\"Ctrl+W\": \"Strg+K\",\n\t\"Ctrl+I\": \"Strg+U\",\n\t\"&Attributes\": \"&Attribute\",\n\t\"Ctrl+E\": \"Strg+E\",\n\t\"&Clear Image\": \"&Bild löschen\",\n\t\"Clear Image\": \"Bild löschen\",\n\t\"Ctrl+Shft+N\": \"Strg+Umschalt+N\",\n\t\"&Draw Opaque\": \"&Deckend zeichnen\",\n\t\"Draw Opaque\": \"Deckend zeichnen\",\n\t\"&Colors\": \"&Farben\",\n\t\"&Edit Colors\": \"&Palette bearbeiten\",\n\t\"Edit Colors\": \"Farben bearbeiten\",\n\t\"&Help Topics\": \"&Hilfethemen\",\n\t\"Help Topics\": \"Hilfethemen\",\n\t\"&About Paint\": \"Inf&o\",\n\t\"About Paint\": \"Info\",\n\t\"&Update\": \"&Aktualisieren\",\n\t\"Update\": \"Aktualisieren\",\n\t\"Save Copy &As\": \"Speichern &unter\",\n\t\"Save Copy As\": \"Kopie speichern unter\",\n\t\"untitled\": \"Unbenannt\",\n\t\"Bitmap Image\": \"Bitmap-Bild\",\n\t\"Bitmap Files (*.bmp)\": \"Bitmap-Dateien (*.bmp)\",\n\t\"PCX Files\": \"PCX-Dateien\",\n\t\"Icon Files\": \"Symboldateien\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"Monochrom-Bitmap (*.bmp;*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"16-Farben-Bitmap (*.bmp;*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"256-Farben-Bitmap (*.bmp;*.dib)\",\n\t\"Paint cannot open this file.\": \"Die Datei konnte nicht geöffnet werden.\",\n\t\"Paint cannot read this file.\": \"Die Datei konnte nicht gelesen werden.\",\n\t\"This file is read-only.\": \"Diese Datei ist schreibgeschützt.\",\n\t\"To save your changes, use a different filename.\": \"Verwenden Sie zum Speichern der Änderungen einen anderen Dateinamen.\",\n\t\"This file is already open.\": \"Diese Datei ist bereits geöffnet.\",\n\t\"This is not a valid .PCS file.\": \"Dies ist keine gültige .PCS-Datei.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"Die Datei ist zur Bearbeitung geöffnet und kann nicht überschrieben werden.\",\n\t\"Use a different filename to save your changes.\": \"Verwenden Sie zum Speichern der Änderungen einen anderen Dateinamen.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"Dies ist keine gültige Bitmapdatei,  oder das Format wird nicht unterstützt.\",\n\t\"This is not a valid icon.\": \"Dies ist kein gültiges Symbol.\",\n\t\"This is not a valid cursor.\": \"Dies ist kein gültiger Cursor.\",\n\t\"Save was interrupted, so your file has not been saved.\": \"Der Speichervorgang wurde unterbrochen. Die Datei wurde nicht gespeichert.\",\n\t\"You cannot save to a read-only file.\": \"Eine schreibgeschützte Datei kann nicht gespeichert werden.\",\n\t\"Use a different file name.\": \"Verwenden Sie einen anderen Dateinamen.\",\n\t\"This file is already in use.\": \"Diese Datei wird bereits verwendet.\",\n\t\"Close the program, and then try again.\": \"Beenden Sie das Programm, und wiederholen Sie den Vorgang.\",\n\t\"Paint cannot save this file.\": \"Diese Datei kann nicht gespeichert werden.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"Die Datei kann nicht unter demselben Namen in einem anderen Format gespeichert werden.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"Der Wert für die Rasterweite muss eine ganze Zahl im Bereich von %d bis %d sein.\",\n\t\"There is not enough memory or resources to complete operation.\": \"Für den Vorgang sind nicht genügend Arbeitsspeicher oder Ressourcen verfügbar.\",\n\t\"Close some programs, and then try again.\": \"Schließen Sie andere Programme, und wiederholen Sie den Vorgang.\",\n\t\"Low on memory or resources.\": \"Nicht genügend Speicher oder Ressourcen.\",\n\t\"Group error.\": \"Gruppierungsfehler.\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"Das Dokument konnte nicht gedruckt werden. Überprüfen Sie, ob genügend Speicherplatz verfügbar ist und der Drucker richtig funktioniert.\",\n\t\"Saving into this format may cause some loss of color information.\": \"Das Speichern in diesem Format kann zum Verlust von Farbinformationen führen.\",\n\t\"Do you want to continue?\": \"Möchten Sie den Vorgang fortsetzen?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"Eine Konvertierung in die Farben Schwarz oder Weiß kann nicht rückgängig gemacht werden. Dieser Vorgang hat evtl. den Verlust von Farbinformationen zur Folge.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"Die Mindestgröße einer Bitmap beträgt 1 Pixel pro Seite.\",\n\t\"Generic error.\": \"Allgemeiner Fehler.\",\n\t\"File not found.\": \"Datei nicht gefunden.\",\n\t\"Bad path.\": \"Ungültiger Pfad.\",\n\t\"Too many open files.\": \"Zu viele Dateien geöffnet.\",\n\t\"Access denied.\": \"Zugriff verweigert.\",\n\t\"Invalid file.\": \"Ungültige Datei.\",\n\t\"Remove current folder.\": \"Aktuellen Ordner löschen.\",\n\t\"Folder full.\": \"Ordner ist voll.\",\n\t\"Bad seek.\": \"Positionierungsfehler.\",\n\t\"Hard IO error.\": \"Ein-/Ausgabefehler.\",\n\t\"Sharing violation.\": \"Zugriffsverletzung.\",\n\t\"Lock violation.\": \"Sperrverletzung.\",\n\t\"Disk full.\": \"Datenträger ist voll.\",\n\t\"End of file.\": \"Dateiende.\",\n\t\"Error getting the Clipboard Data!\": \"Fehler beim Lesen der Zwischenablagedaten!\",\n\t\"No Printer Found @ page setup\": \"Kein Drucker bei Seiteneinrichtung gefunden\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"24-Bit-Bitmap (*.bmp;*.dib)\",\n\t\"All Files\": \"Alle Dateien\",\n\t\"untitled.pal\": \"unbenannt.pal\",\n\t\"OLE 2.0 was unable to start.\": \"OLE 2.0 konnte nicht gestartet werden.\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"Stellen Sie sicher, dass Sie die richtige Version der OLE-Bibliotheken verwenden.\",\n\t\"Resets the text be without any attributes.\": \"Setzt die Textattribute zurück.\",\n\t\"Sets or clears the text bold attribute.\": \"Aktiviert oder deaktiviert den Fettdruck.\",\n\t\"Sets or clears the text italic attribute.\": \"Aktiviert oder deaktiviert die Kursivschrift.\",\n\t\"Selects the font used by the text.\": \"Wählt eine Schriftart aus.\",\n\t\"Selects the point size of the text.\": \"Wählt den Schriftgrad aus.\",\n\t\"Sets or clears the text underline attribute.\": \"Aktiviert oder deaktiviert die Textunterstreichung.\",\n\t\"Shows or hides the tooltips.\": \"Blendet die QuickInfo ein oder aus.\",\n\t\"Show Paint Help.\": \"Zeigt die Paint-Hilfe an.\",\n\t\"Sends a picture by using mail or fax.\": \"Übermittelt ein Bild per Email oder Fax.\",\n\t\"Copies the selection to a file.\": \"Kopiert die Auswahl in eine Datei.\",\n\t\"Pastes a file into the selection.\": \"Fügt eine Datei in die Auswahl ein.\",\n\t\"Zooms the picture to 100%.\": \"Stellt das Bild in Normalgröße dar.\",\n\t\"Zooms the picture to 400%.\": \"Vergrößert das Bild um das Vierfache.\",\n\t\"Zooms the picture.\": \"Legt den Zoomfaktor für das Bild fest.\",\n\t\"Displays the entire picture.\": \"Zeigt das Gesamtbild an.\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"Blendet die Miniaturansicht ein oder aus.\",\n\t\"Shows or hides the grid.\": \"Blendet das Raster ein oder aus.\",\n\t\"Shows or hides the text toolbar.\": \"Blendet die Formatsymbolleiste ein oder aus.\",\n\t\"Flips or rotates the picture or a selection.\": \"Dreht oder spiegelt das Bild oder einen Bildausschnitt.\",\n\t\"Stretches or skews the picture or a selection.\": \"Streckt oder zerrt das Bild oder einen Ausschnitt.\",\n\t\"Inverts the colors of the picture or a selection.\": \"Kehrt die Farben des Bildes oder Ausschnitts um.\",\n\t\"Changes the attributes of the picture.\": \"Ändert die Bildattribute.\",\n\t\"Clears the picture or selection.\": \"Löscht das Bild oder einen Bildausschnitt.\",\n\t\"The font size must be a numeric value.\": \"Geben Sie eine Zahl für den Schriftgrad ein.\",\n\t\"Contains commands for working with the selected item(s).\": \"Befehle zur Arbeit mit gewählten Elementen\",\n\t\"Contains commands for selecting and transferring items.\": \"Befehle zum Auswählen und Übertragen von Elementen\",\n\t\"Contains commands for customizing this window.\": \"Enthält Befehle zum Ändern des Fensters\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"Befehle zur Bildbearbeitung und zum Festlegen von Attributen\",\n\t\"Contains commands for using custom colors and drawing options.\": \"Befehle für benutzerdefinierte Farben und Zeichenoptionen\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"Befehle zum Anzeigen der Hilfe und Informationen über Paint\",\n\t\"Cannot save file.\": \"Datei kann nicht gespeichert werden.\",\n\t\"Error removing temporary file.\": \"Fehler beim Entfernen der temporären Datei.\",\n\t\"Get Colors\": \"Palette laden\",\n\t\"Save Colors\": \"Palette speichern\",\n\t\"File last saved:\": \"Zuletzt gespeichert:\",\n\t\"Not Available\": \"Nicht verfügbar\",\n\t\"Size on disk:\": \"Dateigröße:\",\n\t\"%s bytes\": \"%s Bytes\",\n\t\"Painting\": \"Zeichnung\",\n\t\"Fonts\": \"Schriftarten\",\n\t\"Tools\": \"Extras\",\n\t\"All Picture Files\": \"Alle Bilddateien\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"Klicken Sie im Menü \\\"Hilfe\\\" auf \\\"Hilfethemen\\\".\",\n\t\"Select an area on which to get Help.\": \"Wählen Sie einen Bereich aus, über den Sie sich informieren möchten.\",\n\t\"Creates a new document.\": \"Erstellt ein neues Dokument.\",\n\t\"Opens an existing document.\": \"Öffnet ein vorhandenes Dokument.\",\n\t\"Closes the active document.\": \"Schließt das aktive Dokument.\",\n\t\"Saves the active document.\": \"Speichert das aktive Dokument.\",\n\t\"Saves the active document with a new name.\": \"Speichert das aktive Dokument unter neuem Namen.\",\n\t\"Changes the page layout.\": \"Ändert die Seitengestaltung.\",\n\t\"Specifies the default printer setup.\": \"Definiert die Standarddruckerkonfiguration.\",\n\t\"Prints the active document and sets printing options.\": \"Druckt das aktive Dokument und ändert Druckoptionen.\",\n\t\"Displays full pages.\": \"Zeigt die Seitenansicht an.\",\n\t\"Opens this document.\": \"Öffnet das angegebene Dokument.\",\n\t\"Deletes the selection.\": \"Löscht die Auswahl.\",\n\t\"Erases everything.\": \"Löscht das gesamte Dokument.\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"Kopiert die Auswahl in die Zwischenablage.\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"Überträgt die Auswahl in die Zwischenablage.\",\n\t\"Finds the specified text.\": \"Sucht nach dem angegebenen Text.\",\n\t\"Inserts the contents of the Clipboard.\": \"Fügt den Inhalt der Zwischenablage ein.\",\n\t\"Repeats the last action.\": \"Wiederholt den letzten Vorgang.\",\n\t\"Replaces specific text with different text.\": \"Ersetzt den angegebenen Text.\",\n\t\"Selects everything.\": \"Markiert das gesamte Dokument.\",\n\t\"Undoes the last action.\": \"Macht den letzten Vorgang rückgängig.\",\n\t\"Redoes the previously undone action.\": \"Wiederholt den rückgängig gemachten Vorgang.\",\n\t\"Displays program information, version number, and copyright.\": \"Zeigt Angaben zum Programm, Copyright und zur Version an.\",\n\t\"Quits Paint.\": \"Beendet Paint.\",\n\t\"Opens Paint Help.\": \"Öffnet die Paint-Hilfe.\",\n\t\"Displays instructions about how to use Help.\": \"Zeigt Anweisungen zur Arbeit mit der Hilfe an.\",\n\t\"Displays Help for areas you click on.\": \"Zeigt Hilfe zu dem Element an, auf das Sie klicken.\",\n\t\"Displays Help for the current task or command.\": \"Zeigt Hilfe zum aktuellen Vorgang oder Befehl an.\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"Wählt die Bitmap als Desktophintergrund (Mitte) aus.\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"Wählt die Bitmap als Desktophintergrund (Fläche) aus.\",\n\t\"Sends the selection using mail or fax.\": \"Übermittelt die Auswahl per E-Mail oder Fax.\",\n\t\"Prints the selection.\": \"Druckt die Auswahl.\",\n\t\"Shows or hides the thumbnail.\": \"Blendet die Miniaturansicht ein oder aus.\",\n\t\"Shows Paint Help.\": \"Zeigt die Paint-Hilfe an.\",\n\t\"Shows or hides the status bar.\": \"Blendet die Statusleiste ein oder aus.\",\n\t\"Shows or hides the tool box.\": \"Blendet die Toolbox ein oder aus.\",\n\t\"Shows or hides the color box.\": \"Blendet die Farbpalette ein oder aus.\",\n\t\"Only a Far East font can be used for vertical editing.\": \"Für die vertikale Bearbeitung kann nur eine Fernostschriftart verwendet werden.\",\n\t\"Changes the window size.\": \"Ändert die Fenstergröße.\",\n\t\"Changes the window position.\": \"Ändert die Fensterposition.\",\n\t\"Reduces the window to an icon.\": \"Minimiert das Fenster.\",\n\t\"Enlarges the window to full size.\": \"Maximiert das Fenster.\",\n\t\"Switches to the next document window.\": \"Wechselt zum nächsten Dokumentfenster.\",\n\t\"Switches to the previous document window.\": \"Wechselt zum vorherigen Dokumentfenster.\",\n\t\"Closes the active window and asks if you want to save changes.\": \"Schließt das Fenster und fordert zum Speichern auf.\",\n\t\"Restores the window to normal size.\": \"Stellt das Fenster wieder in Normalgröße her.\",\n\t\"Activates the task list.\": \"Aktiviert den Task-Manager.\",\n\t\"All Files (*.*)\": \"Alle Dateien (*.*)\",\n\t\"Untitled\": \"Unbenannt\",\n\t\"an unnamed file\": \"eine unbenannte Datei\",\n\t\"&Hide\": \"&Ausblenden\",\n\t\"Hide\": \"Ausblenden\",\n\t\"No error message is available.\": \"Es ist keine Fehlermeldung verfügbar.\",\n\t\"An unsupported operation was attempted.\": \"Ein Vorgang wurde nicht unterstützt.\",\n\t\"A required resource was unavailable.\": \"Eine erforderliche Ressource war nicht verfügbar.\",\n\t\"Out of memory.\": \"Nicht genügend Arbeitsspeicher\",\n\t\"An unknown error has occurred.\": \"Unbekannter Fehler\",\n\t\"on %1\": \"auf %1\",\n\t\"&One Page\": \"E&inseitig\",\n\t\"One Page\": \"Einseitig\",\n\t\"&Two Page\": \"Zwe&iseitig\",\n\t\"Two Page\": \"Zweiseitig\",\n\t\"Page %u\": \"Seite %u\",\n\t\"Pages %u-%u\": \"Seiten %u-%u\",\n\t\"Output.prn\": \"Ausgabe.prn\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"Druckdateien (*.prn)|*.prn|Alle Dateien (*.*)|*.*||\",\n\t\"Print to File\": \"Ausdruck in Datei\",\n\t\"to %1\": \"zu %1\",\n\t\"&Update %1\": \"%1 &aktualisieren\",\n\t\"Update %1\": \"%1 aktualisieren\",\n\t\"E&xit && Return to %1\": \"&Beenden und zurück zu %1\",\n\t\"Exit & Return to %1\": \"Beenden und zurück zu %1\",\n\t\"Linked %s\": \"Verknüpft %s\",\n\t\"Unknown Type\": \"Unbekannter Typ\",\n\t\"Invalid filename.\": \"Ungültiger Dateiname\",\n\t\"Failed to open document.\": \"Das Dokument konnte nicht geöffnet werden.\",\n\t\"Failed to save document.\": \"Das Dokument konnte nicht gespeichert werden.\",\n\t\"Save changes to %1?\": \"Änderungen an %1 speichern?\",\n\t\"Failed to create empty document.\": \"Es konnte kein leeres Dokument erstellt werden.\",\n\t\"The file is too large to open.\": \"Die Datei ist zu groß zum Öffnen.\",\n\t\"Could not start print job.\": \"Der Druckauftrag konnte nicht gestartet werden.\",\n\t\"Failed to launch help.\": \"Die Hilfe konnte nicht gestartet werden.\",\n\t\"Internal application error.\": \"Interner Fehler der Anwendung\",\n\t\"Command failed.\": \"Der Befehl konnte nicht ausgeführt werden.\",\n\t\"Insufficient memory to perform operation.\": \"Nicht genügend Arbeitsspeicher für diesen Vorgang.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"Einträge in der Systemregistrierung wurden entfernt, und die INI-Datei (falls vorhanden) wurde gelöscht.\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"Nicht alle Einträge in der Systemregistrierung (oder INI-Dateien) wurden entfernt.\",\n\t\"This program requires the file %s, which was not found on this system.\": \"Die für dieses Programm erforderliche Datei %s wurde nicht gefunden.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"Dieses Programm ist mit dem fehlenden Export %s in der Datei %s verknüpft. Möglicherweise ist die Version von %s inkompatibel.\",\n\t\"Please enter an integer.\": \"Geben Sie eine ganze Zahl ein.\",\n\t\"Please enter a number.\": \"Geben Sie eine Zahl ein.\",\n\t\"Please enter an integer between %1 and %2.\": \"Geben Sie eine ganze Zahl zwischen %1 und %2 ein.\",\n\t\"Please enter a number between %1 and %2.\": \"Geben Sie eine Zahl zwischen %1 und %2 ein.\",\n\t\"Please enter no more than %1 characters.\": \"Geben Sie maximal %1 Zeichen ein.\",\n\t\"Please select a button.\": \"Klicken Sie auf eine Schaltfläche.\",\n\t\"Please enter an integer between 0 and 255.\": \"Geben Sie eine ganze Zahl zwischen 0 und 255 ein.\",\n\t\"Please enter a positive integer.\": \"Geben Sie eine positive ganze Zahl ein.\",\n\t\"Please enter a date and/or time.\": \"Geben Sie ein Datum und/oder eine Uhrzeit ein.\",\n\t\"Please enter a currency.\": \"Geben Sie eine Währung ein.\",\n\t\"Unexpected file format.\": \"Unerwartetes Dateiformat.\",\n\t\"Cannot find this file.\": \"Diese Datei wurde nicht gefunden.\",\n\t\"Please verify that the correct path and file name are given.\": \"Stellen Sie sicher, dass die Pfad- und Dateinamenangabe richtig ist.\",\n\t\"Destination disk drive is full.\": \"Das Ziellaufwerk ist voll.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"%1 konnte nicht gelesen werden. Die Datei ist anderweitig geöffnet.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"Die Datei %1 konnte nicht geschrieben werden. Sie ist schreibgeschützt oder anderweitig geöffnet.\",\n\t\"An unexpected error occurred while reading %1.\": \"Beim Lesen von %1 ist ein unerwarteter Fehler aufgetreten.\",\n\t\"An unexpected error occurred while writing %1.\": \"Beim Schreiben von %1 ist ein unerwarteter Fehler aufgetreten.\",\n\t\"Unable to register document.\": \"Das Dokument konnte nicht registriert werden.\",\n\t\"The document may already be open.\": \"Das Dokument ist möglicherweise bereits geöffnet.\",\n\t\"Update %1 before proceeding?\": \"Möchten Sie %1 vor dem Fortsetzen aktualisieren?\",\n\t\"Could not update client.\": \"Client konnte nicht aktualisiert werden.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"Fehler beim Registrieren. Es können ggf. Fehler bei ActiveX-Funktionen auftreten.\",\n\t\"Failed to update the system registry.\": \"Die Systemregistrierung konnte nicht aktualisiert werden.\",\n\t\"Please try using REGEDIT.\": \"Aktualisieren Sie sie über REGEDIT.\",\n\t\"Unable to read write-only property.\": \"Das Schreibschutzattribut kann nicht gelesen werden.\",\n\t\"Unable to write read-only property.\": \"Das Schreibschutzattribut kann nicht geschrieben werden.\",\n\t\"Unable to load mail system support.\": \"Die Unterstützung für das Mailsystem konnte nicht geladen werden.\",\n\t\"Mail system DLL is invalid.\": \"Die DLL des Mailsystems ist ungültig.\",\n\t\"Send Mail failed to send message.\": \"Eine Nachricht konnte nicht gesendet werden.\",\n\t\"No error occurred.\": \"Kein Fehler.\",\n\t\"An unknown error occurred while accessing %1.\": \"Unbekannter Fehler beim Zugriff auf %1.\",\n\t\"%1 was not found.\": \"%1 wurde nicht gefunden.\",\n\t\"%1 contains an invalid path.\": \"%1 enthält eine ungültige Pfadangabe.\",\n\t\"%1 could not be opened because there are too many open files.\": \"%1 konnte nicht geöffnet werden, da zu viele Dateien geöffnet sind.\",\n\t\"Access to %1 was denied.\": \"Der Zugriff auf %1 wurde verweigert.\",\n\t\"An invalid file handle was associated with %1.\": \"%1 wurde eine ungültige Dateizugriffsnummer zugeordnet.\",\n\t\"%1 could not be removed because it is the current directory.\": \"%1 konnte nicht entfernt werden, da es das aktuelle Verzeichnis ist.\",\n\t\"%1 could not be created because the directory is full.\": \"%1 konnte nicht erstellt werden, da das Verzeichnis voll ist.\",\n\t\"Seek failed on %1\": \"Der Suchvorgang auf %1 ist fehlgeschlagen.\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"Beim Zugriff auf %1 wurde ein Hardware-E/A-Fehler gemeldet.\",\n\t\"A sharing violation occurred while accessing %1.\": \"Zugriffsverletzung beim Zugriff auf %1.\",\n\t\"A locking violation occurred while accessing %1.\": \"Sperrverletzung beim Zugriff auf %1.\",\n\t\"Disk full while accessing %1.\": \"Festplatte war beim Zugriff auf %1 voll.\",\n\t\"An attempt was made to access %1 past its end.\": \"Es wurde versucht, auf eine Stelle hinter dem Ende von %1 zuzugreifen.\",\n\t\"An attempt was made to write to the reading %1.\": \"%1 ist nur lesbar. Es wurde versucht, darauf zu schreiben.\",\n\t\"An attempt was made to read from the writing %1.\": \"%1 ist lesegeschützt. Es wurde versucht, davon zu lesen.\",\n\t\"%1 has a bad format.\": \"%1 hat ein ungültiges Format.\",\n\t\"%1 contained an unexpected object.\": \"%1 enthält ein unerwartetes Objekt.\",\n\t\"%1 contains an incorrect schema.\": \"%1 enthält ein ungültiges Schema.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"Markiert ein Rechteck zum Bearbeiten.\",\n\t\"Select\": \"Auswahl\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"Markiert einen formfreien Ausschnitt zum Bearbeiten.\",\n\t\"Free-Form Select\": \"Freihandauswahl\",\n\t\"Inserts text into the picture.\": \"Fügt Text im Bild ein.\",\n\t\"Fills an area with the current drawing color.\": \"Füllt einen Bereich mit der aktuellen Farbe.\",\n\t\"Fill With Color\": \"Farbfüller\",\n\t\"Draws a straight line with the selected line width.\": \"Zeichnet eine Gerade mit der gewählten Strichbreite.\",\n\t\"Line\": \"Linien\",\n\t\"Draws using an airbrush of the selected size.\": \"Zeichnet mit dem gewählten Airbrushmuster.\",\n\t\"Draws a curved line with the selected line width.\": \"Zeichnet eine gekrümmte Linie mit der gewählten Strichbreite.\",\n\t\"Curve\": \"Bögen\",\n\t\"Draws a polygon with the selected fill style.\": \"Zeichnet ein Vieleck mit der gewählten Füllung.\",\n\t\"Polygon\": \"Vieleck\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"Zeichnet ein gerundetes Rechteck mit gewählter  Füllung.\",\n\t\"Rounded Rectangle\": \"Gerundetes Rechteck\",\n\t\"Draws a free-form line one pixel wide.\": \"Zeichnet eine formfreie Linie mit einem Pixel Breite.\",\n\t\"Pencil\": \"Stift\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"Löscht einen Bildbereich mit der gewählten Radiererform.\",\n\t\"Eraser/Color Eraser\": \"Radierer\",\n\t\"Changes the magnification.\": \"Ändert den Vergrößerungsfaktor.\",\n\t\"Magnifier\": \"Lupe\",\n\t\"Picks up a color from the picture for drawing.\": \"Wählt eine Farbe des Bildes zum Zeichnen aus.\",\n\t\"Pick Color\": \"Farbe auswählen\",\n\t\"Draws using a brush with the selected shape and size.\": \"Zeichnet mit dem Pinsel der gewählten Form und Größe.\",\n\t\"Brush\": \"Pinsel\",\n\t\"Draws a rectangle with the selected fill style.\": \"Zeichnet ein Rechteck mit gewählter Füllung.\",\n\t\"Rectangle\": \"Rechteck\",\n\t\"Draws a filled rectangle.\": \"Zeichnet ein gefülltes Rechteck.\",\n\t\"Draws an ellipse with the selected fill style.\": \"Zeichnet eine Ellipse mit gewählter Füllung.\",\n\t\"Draws a filled ellipse.\": \"Zeichnet eine gefüllte Ellipse.\",\n\t\"Makes the current selection either opaque or transparent.\": \"Macht die aktuelle Auswahl durchsichtig oder undurchsichtig.\",\n\t\"Creates a new color.\": \"Erstellt eine neue Farbe.\",\n\t\"Uses a previously saved palette of colors.\": \"Ruft eine zuvor gespeicherte Farbpalette auf.\",\n\t\"Saves the current palette of colors to a file.\": \"Speichert die aktuelle Farbpalette in einer Datei.\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"Sie müssen die Datei speichern, bevor Sie sie als Hintergrund auswählen.\",\n\t\"The selection is now larger than the bitmap.\": \"Die Auswahl ist jetzt größer als die Bitmap.\",\n\t\"Would you like the bitmap enlarged?\": \"Möchten Sie die Bitmap vergrößern?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"Das Bild in der Zwischenablage ist größer als die Bitmap.\",\n\t\"The file is not in the correct format.\": \"Die Datei hat das falsche Format.\",\n\t\"Not enough room to paste text.\": \"Nicht genügend Platz zur Texteingabe.\",\n\t\"Enlarge the text area and try again.\": \"Vergrößern Sie vor der Eingabe das Textfeld.\",\n\t\"Places the text.\": \"Platziert den Text.\"\n});\n"
  },
  {
    "path": "localization/el/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"el\", {\n\t\"Attributes\": \"Χαρακτηριστικά\",\n\t\"&Width:\": \"Π&λάτος:\",\n\t\"Width:\": \"Πλάτος:\",\n\t\"&Height:\": \"Ύ&ψος:\",\n\t\"Height:\": \"Ύψος:\",\n\t\"Units\": \"Μονάδες\",\n\t\"&Inches\": \"Ί&ντσες\",\n\t\"Inches\": \"Ίντσες\",\n\t\"C&m\": \"&Εκατοστά\",\n\t\"Cm\": \"Εκατοστά\",\n\t\"&Pixels\": \"Pi&χel\",\n\t\"Pixels\": \"Piχel\",\n\t\"Colors\": \"Χρώματα\",\n\t\"&Black and white\": \"Ασπρό&μαυρη\",\n\t\"Black and white\": \"Ασπρόμαυρη\",\n\t\"Co&lors\": \"Έ&γχρωμη\",\n\t\"Transparency\": \"Διαφάνεια\",\n\t\"Use &Transparent background color\": \"Χρήση &διαφανούς χρώματος φόντου\",\n\t\"Use Transparent background color\": \"Χρήση διαφανούς χρώματος φόντου\",\n\t\"Select &Color\": \"Επ&ιλογή χρώματος\",\n\t\"Select Color\": \"Επιλογή χρώματος\",\n\t\"OK\": \"ΟΚ\",\n\t\"Cancel\": \"Άκυρο\",\n\t\"&Default\": \"&Προεπιλογή\",\n\t\"Default\": \"Προεπιλογή\",\n\t\"Custom Zoom\": \"Προσαρμοσμένο ζουμ\",\n\t\"Current zoom:\": \"Τρέχον ζουμ:\",\n\t\"Zoom to\": \"Ζουμ κατά\",\n\t\"Flip and Rotate\": \"Αναστροφή και περιστροφή\",\n\t\"Flip or rotate\": \"Αναστροφή ή περιστροφή\",\n\t\"&Flip horizontal\": \"Ορι&ζόντια αναστροφή\",\n\t\"Flip horizontal\": \"Οριζόντια αναστροφή\",\n\t\"Flip &vertical\": \"&Κατακόρυφη αναστροφή\",\n\t\"Flip vertical\": \"Κατακόρυφη αναστροφή\",\n\t\"&Rotate by angle\": \"&Περιστροφή κατά γωνία\",\n\t\"Rotate by angle\": \"Περιστροφή κατά γωνία\",\n\t\"Stretch and Skew\": \"Αυξομείωση και παραμόρφωση\",\n\t\"Stretch\": \"Αυξομείωση\",\n\t\"&Horizontal:\": \"&Οριζόντια:\",\n\t\"Horizontal:\": \"Οριζόντια:\",\n\t\"&Vertical:\": \"&Κάθετη:\",\n\t\"Vertical:\": \"Κάθετη:\",\n\t\"Skew\": \"Παραμόρφωση\",\n\t\"H&orizontal:\": \"Οριζό&ντια:\",\n\t\"Degrees\": \"Μοίρες\",\n\t\"V&ertical:\": \"Κάθ&ετη:\",\n\t\"Color Table\": \"Πίνακας χρωμάτων\",\n\t\"New\": \"Δημιουργία\",\n\t\"&New \": \"&Δημιουργία \",\n\t\"New \": \"Δημιουργία \",\n\t\"&Help\": \"&Βοήθεια\",\n\t\"Help\": \"Βοήθεια\",\n\t\"Printing\": \"Γίνεται εκτύπωση\",\n\t\"on the\": \"στο\",\n\t\"&Print\": \"Εκ&τύπωση\",\n\t\"Print\": \"Εκτύπωση\",\n\t\"&Next Page\": \"&Επόμενη σελίδα\",\n\t\"Next Page\": \"Επόμενη σελίδα\",\n\t\"Pre&v Page\": \"&Προηγούμενη σελίδα\",\n\t\"Prev Page\": \"Προηγούμενη σελίδα\",\n\t\"Zoom &In\": \"&Μεγέθυνση\",\n\t\"Zoom In\": \"Μεγέθυνση\",\n\t\"Zoom &Out\": \"&Σμίκρυνση\",\n\t\"Zoom Out\": \"Σμίκρυνση\",\n\t\"&Close\": \"&Κλείσιμο\",\n\t\"Close\": \"Κλείσιμο\",\n\t\"Grid Settings\": \"Ρυθμίσεις πλέγματος\",\n\t\"&Pixel Grid\": \"Π&λέγμα pixel\",\n\t\"Pixel Grid\": \"Πλέγμα pixel\",\n\t\"&Tile Grid\": \"Παρά&θεση στο πλέγμα\",\n\t\"Tile Grid\": \"Παράθεση στο πλέγμα\",\n\t\"pixels\": \"pixel\",\n\t\"H&eight:\": \"Ύ&ψος:\",\n\t\"Text\": \"Κείμενο\",\n\t\"Undo\": \"Αναίρεση\",\n\t\"Cut\": \"Αποκοπή\",\n\t\"Copy\": \"Αντιγραφή\",\n\t\"Paste\": \"Επικόλληση\",\n\t\"Clear Selection\": \"Καθαρισμός επιλεγμένης περιοχής\",\n\t\"Select All\": \"Επιλογή όλων\",\n\t\"Text Toolbar\": \"Γραμμή εργαλείων κειμένου\",\n\t\"Selection\": \"Επιλεγμένη περιοχή\",\n\t\"Cu&t\": \"Απο&κοπή\",\n\t\"&Copy\": \"Αντι&γραφή\",\n\t\"&Paste\": \"&Επικόλληση\",\n\t\"C&lear Selection\": \"Κα&θαρισμός επιλεγμένης περιοχής\",\n\t\"Select &All\": \"Επι&λογή όλων\",\n\t\"C&opy To\": \"Αντιγραφή &στο\",\n\t\"Copy To\": \"Αντιγραφή στο\",\n\t\"Paste &From\": \"Ε&πικόλληση από\",\n\t\"Paste From\": \"Επικόλληση από\",\n\t\"Flip/&Rotate\": \"Αναστρο&φή/περιστροφή\",\n\t\"Flip/Rotate\": \"Αναστροφή/περιστροφή\",\n\t\"&Stretch/Skew\": \"Αυ&ξομείωση/παραμόρφωση\",\n\t\"Stretch/Skew\": \"Αυξομείωση/παραμόρφωση\",\n\t\"&Invert Colors\": \"Α&ρνητικά χρώματα\",\n\t\"Invert Colors\": \"Αρνητικά χρώματα\",\n\t\"Thumbnail\": \"Μικρογραφία\",\n\t\"&File\": \"&Αρχείο\",\n\t\"File\": \"Αρχείο\",\n\t\"&New\": \"&Δημιουργία\",\n\t\"&Open\": \"Άν&οιγμα\",\n\t\"Open\": \"Άνοιγμα\",\n\t\"&Save\": \"&Αποθήκευση\",\n\t\"Save\": \"Αποθήκευση\",\n\t\"Save &As\": \"Αποθήκευση &ως\",\n\t\"Save As\": \"Αποθήκευση ως\",\n\t\"Print Pre&view\": \"&Προεπισκόπηση εκτύπωσης\",\n\t\"Print Preview\": \"Προεπισκόπηση εκτύπωσης\",\n\t\"Page Se&tup\": \"Διαμό&ρφωση σελίδας\",\n\t\"Page Setup\": \"Διαμόρφωση σελίδας\",\n\t\"S&end\": \"Αποστο&λή\",\n\t\"Send\": \"Αποστολή\",\n\t\"Set As &Wallpaper (Tiled)\": \"Ορισμός ως &Ταπετσαρία (σε παράθεση)\",\n\t\"Set As Wallpaper (Tiled)\": \"Ορισμός ως Ταπετσαρία (σε παράθεση)\",\n\t\"Set As Wa&llpaper (Centered)\": \"Ορισμός ως Ταπετ&σαρία (στο κέντρο)\",\n\t\"Set As Wallpaper (Centered)\": \"Ορισμός ως Ταπετσαρία (στο κέντρο)\",\n\t\"Recent File\": \"Πρόσφατο αρχείο\",\n\t\"E&xit\": \"Έ&ξοδος\",\n\t\"Exit\": \"Έξοδος\",\n\t\"&Edit\": \"Επε&ξεργασία\",\n\t\"Edit\": \"Επεξεργασία\",\n\t\"&Undo\": \"&Αναίρεση\",\n\t\"&Repeat\": \"Επανάλη&ψη\",\n\t\"Repeat\": \"Επανάληψη\",\n\t\"&View\": \"Π&ροβολή\",\n\t\"View\": \"Προβολή\",\n\t\"&Tool Box\": \"&Εργαλειοθήκη\",\n\t\"Tool Box\": \"Εργαλειοθήκη\",\n\t\"&Color Box\": \"Πλαίσιο χρω&μάτων\",\n\t\"Color Box\": \"Πλαίσιο χρωμάτων\",\n\t\"&Status Bar\": \"&Γραμμή κατάστασης\",\n\t\"Status Bar\": \"Γραμμή κατάστασης\",\n\t\"T&ext Toolbar\": \"Γραμμή εργαλείων κειμέ&νου\",\n\t\"&Zoom\": \"&Ζουμ\",\n\t\"Zoom\": \"Ζουμ\",\n\t\"&Normal Size\": \"&Φυσικό μέγεθος\",\n\t\"Normal Size\": \"Φυσικό μέγεθος\",\n\t\"&Large Size\": \"&Μεγάλο μέγεθος\",\n\t\"Large Size\": \"Μεγάλο μέγεθος\",\n\t\"C&ustom\": \"Προ&σαρμογή\",\n\t\"Custom\": \"Προσαρμογή\",\n\t\"Show &Grid\": \"Εμφάνιση &πλέγματος\",\n\t\"Show Grid\": \"Εμφάνιση πλέγματος\",\n\t\"Show T&humbnail\": \"Εμφάνιση μι&κρογραφίας\",\n\t\"Show Thumbnail\": \"Εμφάνιση μικρογραφίας\",\n\t\"&View Bitmap\": \"&Προβολή bitmap\",\n\t\"View Bitmap\": \"Προβολή bitmap\",\n\t\"&Image\": \"Ει&κόνα\",\n\t\"Image\": \"Εικόνα\",\n\t\"&Flip/Rotate\": \"Ανασ&τροφή/περιστροφή\",\n\t\"&Attributes\": \"&Χαρακτηριστικά\",\n\t\"&Clear Image\": \"Κα&θαρισμός εικόνας\",\n\t\"Clear Image\": \"Καθαρισμός εικόνας\",\n\t\"Ctrl+Shft+N\": \"Ctrl+Shift+Ν\",\n\t\"&Draw Opaque\": \"&Αδιαφανής σχεδίαση\",\n\t\"Draw Opaque\": \"Αδιαφανής σχεδίαση\",\n\t\"&Colors\": \"&Χρώματα\",\n\t\"&Edit Colors\": \"&Επεξεργασία χρωμάτων\",\n\t\"Edit Colors\": \"Επεξεργασία χρωμάτων\",\n\t\"&Help Topics\": \"Θέματα στη &Βοήθεια\",\n\t\"Help Topics\": \"Θέματα στη Βοήθεια\",\n\t\"&About Paint\": \"&Πληροφορίες για τη Ζωγραφική\",\n\t\"About Paint\": \"Πληροφορίες για τη Ζωγραφική\",\n\t\"&Update\": \"&Ενημέρωση\",\n\t\"Update\": \"Ενημέρωση\",\n\t\"Save Copy &As\": \"Αποθήκευση αντι&γράφου ως\",\n\t\"Save Copy As\": \"Αποθήκευση αντιγράφου ως\",\n\t\"Paint\": \"Ζωγραφική\",\n\t\"untitled\": \"ανώνυμο\",\n\t\"Bitmap Image\": \"Εικόνα bitmap\",\n\t\"Bitmap Files (*.bmp)\": \"Αρχεία bitmap (*.bmp)\",\n\t\"Paint.Picture\": \"Ζωγραφική. Εικόνα\",\n\t\"PCX Files\": \"Αρχεία PCX\",\n\t\"Icon Files\": \"Αρχεία εικονιδίων\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"Μονόχρωμο bitmap (*.bmp;*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"Bitmap 16 χρωμάτων (*.bmp;*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"Bitmap 256 χρωμάτων (*.bmp;*.dib)\",\n\t\"Paint cannot open this file.\": \"Δεν είναι δυνατό να ανοίξει η Ζωγραφική αυτό το αρχείο.\",\n\t\"Paint cannot read this file.\": \"Δεν είναι δυνατό να διαβάσει η Ζωγραφική αυτό το αρχείο.\",\n\t\"This file is read-only.\": \"Αυτό το αρχείο είναι μόνο για ανάγνωση.\",\n\t\"To save your changes, use a different filename.\": \"Για να φυλάξετε τις αλλαγές σας, χρησιμοποιήστε διαφορετικό όνομα αρχείου.\",\n\t\"This file is already open.\": \"Αυτό το αρχείο είναι ήδη ανοιχτό.\",\n\t\"This is not a valid .PCS file.\": \"Αυτό δεν είναι έγκυρο αρχείο .PCS.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"Αυτό το αρχείο είναι ανοιχτό για διορθώσεις και δεν μπορεί να αντικατασταθεί.\",\n\t\"Use a different filename to save your changes.\": \"Χρησιμοποιήστε διαφορετικό όνομα αρχείου για να φυλάξετε τις αλλαγές σας.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"Αυτό δεν είναι έγκυρο αρχείο bitmap ή η μορφή του δεν υποστηρίζεται πλέον.\",\n\t\"This is not a valid icon.\": \"Αυτό δεν είναι έγκυρο εικονίδιο.\",\n\t\"This is not a valid cursor.\": \"Αυτός δεν είναι έγκυρος δρομέας.\",\n\t\"Save was interrupted, so your file has not been saved.\": \"Η αποθήκευση διακόπηκε, γι' αυτό δεν σώθηκε το αρχείο σας.\",\n\t\"You cannot save to a read-only file.\": \"Δεν μπορείτε να αποθηκεύσετε σε ένα αρχείο μόνο για ανάγνωση.\",\n\t\"Use a different file name.\": \"Χρησιμοποιήστε διαφορετικό όνομα αρχείου.\",\n\t\"This file is already in use.\": \"Αυτό το αρχείο χρησιμοποιείται ήδη.\",\n\t\"Close the program, and then try again.\": \"Κλείστε το πρόγραμμα και μετά ξαναπροσπαθήστε.\",\n\t\"Paint cannot save this file.\": \"Η Ζωγραφική δεν μπορεί να αποθηκεύσει αυτό το αρχείο.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"Η Ζωγραφική δεν μπορεί να αποθηκεύσει με το ίδιο όνομα ένα αρχείο διαφορετικού τύπου.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"Η απόσταση του πλέγματος πρέπει να είναι ακέραιος μεταξύ %d και %d.\",\n\t\"There is not enough memory or resources to complete operation.\": \"Δεν υπάρχει αρκετή μνήμη ή πόροι για να ολοκληρωθεί η λειτουργία.\",\n\t\"Close some programs, and then try again.\": \"Κλείστε μερικά προγράμματα και ξαναπροσπαθήστε.\",\n\t\"Low on memory or resources.\": \"Ελλιπής μνήμη ή πόροι.\",\n\t\"Group error.\": \"Παρουσιάστηκε σφάλμα ομάδας.\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"Η Ζωγραφική δεν μπορεί να τυπώσει το έγγραφό σας. Βεβαιωθείτε ότι υπάρχει επαρκής χώρος στο δίσκο σας και ότι ο εκτυπωτής σας δουλεύει σωστά.\",\n\t\"Saving into this format may cause some loss of color information.\": \"Αποθηκεύοντας σε αυτήν τη μορφή μπορεί να προκαλέσετε απώλεια πληροφοριών χρώματος.\",\n\t\"Do you want to continue?\": \"Θέλετε να συνεχίσετε;\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"Η μετατροπή σε ασπρόμαυρο δεν είναι δυνατό να αναιρεθεί.  Αυτή η ενέργεια επηρεάζει το τρέχον αρχείο και ίσως προκαλέσει απώλεια χρωματικών πληροφοριών.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"Τα bitmaps πρέπει να είναι μεγαλύτερα από ένα pixel σε κάθε πλευρά τους.\",\n\t\"Generic error.\": \"Παρουσιάστηκε γενικό σφάλμα.\",\n\t\"File not found.\": \"Το αρχείο δεν βρέθηκε.\",\n\t\"Bad path.\": \"Ακατάλληλη διαδρομή δίσκου.\",\n\t\"Too many open files.\": \"Υπάρχουν πάρα πολλά ανοιχτά αρχεία.\",\n\t\"Access denied.\": \"Δεν επιτράπηκε η πρόσβαση.\",\n\t\"Invalid file.\": \"Το αρχείο δεν είναι έγκυρο.\",\n\t\"Remove current folder.\": \"Κατάργηση τρέχοντος φακέλου.\",\n\t\"Folder full.\": \"Ο φάκελος είναι γεμάτος.\",\n\t\"Bad seek.\": \"Εσφαλμένη αναζήτηση.\",\n\t\"Hard IO error.\": \"Παρουσιάστηκε σφάλμα υλικού IO.\",\n\t\"Sharing violation.\": \"Παραβίαση κοινής χρήσης.\",\n\t\"Lock violation.\": \"Παραβίαση κλειδώματος.\",\n\t\"Disk full.\": \"Ο δίσκος είναι γεμάτος.\",\n\t\"End of file.\": \"Τέλος του αρχείου.\",\n\t\"Error getting the Clipboard Data!\": \"Παρουσιάστηκε σφάλμα κατά τη λήψη των δεδομένων του Πρόχειρου!\",\n\t\"No Printer Found @ page setup\": \"Δεν βρέθηκε εκτυπωτής @ διαμόρφωση σελίδας\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"Bitmap 24-bit (*.bmp;*.dib)\",\n\t\"All Files\": \"Όλα τα αρχεία\",\n\t\"Palette|*.pal|\": \"Παλέτα|*.pal|\",\n\t\"OLE 2.0 was unable to start.\": \"Δεν ήταν δυνατό να ξεκινήσει το OLE 2.0.\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"Βεβαιωθείτε ότι χρησιμοποιείτε τη σωστή έκδοση των βιβλιοθηκών OLE.\",\n\t\"Resets the text be without any attributes.\": \"Αποκατάσταση του κειμένου χωρίς χαρακτηριστικά.\",\n\t\"Sets or clears the text bold attribute.\": \"Ορισμός ή κατάργηση του χαρακτηριστικού έντονου κειμένου.\",\n\t\"Sets or clears the text italic attribute.\": \"Ορισμός ή κατάργηση του χαρακτηριστικού πλάγιου κειμένου.\",\n\t\"Selects the font used by the text.\": \"Επιλογή της γραμματοσειράς για το κείμενο.\",\n\t\"Selects the point size of the text.\": \"Επιλογή του μεγέθους του κειμένου σε στιγμές.\",\n\t\"Sets or clears the text underline attribute.\": \"Ορισμός ή κατάργηση του χαρακτηριστικού υπογράμμισης.\",\n\t\"Shows or hides the tooltips.\": \"Εμφάνιση/απόκρυψη των επεξηγήσεων εργαλείων.\",\n\t\"Show Paint Help.\": \"Εμφάνιση Βοήθειας για τη Ζωγραφική.\",\n\t\"Sends a picture by using mail or fax.\": \"Αποστολή μίας εικόνας χρησιμοποιώντας ταχυδρομείο ή fax.\",\n\t\"Copies the selection to a file.\": \"Αντιγραφή της επιλεγμένης περιοχής σε ένα αρχείο.\",\n\t\"Pastes a file into the selection.\": \"Επικόλληση ενός αρχείου στην επιλεγμένη περιοχή.\",\n\t\"Zooms the picture to 100%.\": \"Μεγέθυνση της εικόνας στο 100%.\",\n\t\"Zooms the picture to 400%.\": \"Μεγέθυνση της εικόνας στο 400%.\",\n\t\"Zooms the picture.\": \"Μεγέθυνση της εικόνας.\",\n\t\"Displays the entire picture.\": \"Εμφάνιση ολόκληρης της εικόνας.\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"Εμφάνιση/απόκρυψη της προβολής της εικόνας σε μικρογραφία.\",\n\t\"Shows or hides the grid.\": \"Εμφάνιση/απόκρυψη του πλέγματος.\",\n\t\"Shows or hides the text toolbar.\": \"Εμφάνιση/απόκρυψη της γραμμής εργαλείων κειμένου.\",\n\t\"Flips or rotates the picture or a selection.\": \"Αναστροφή ή περιστροφή της εικόνας ή της επιλεγμένης περιοχής.\",\n\t\"Stretches or skews the picture or a selection.\": \"Μεγέθυνση ή παραμόρφωση της εικόνας ή της επιλεγμένης περιοχής.\",\n\t\"Inverts the colors of the picture or a selection.\": \"Αναστροφή των χρωμάτων της εικόνας ή της επιλεγμένης περιοχής.\",\n\t\"Changes the attributes of the picture.\": \"Αλλαγή των χαρακτηριστικών της εικόνας.\",\n\t\"Clears the picture or selection.\": \"Σβήσιμο της εικόνας ή της επιλεγμένης περιοχής.\",\n\t\"The font size must be a numeric value.\": \"Το μέγεθος της γραμματοσειράς πρέπει να είναι αριθμητική τιμή.\",\n\t\"Contains commands for working with the selected item(s).\": \"Εντολές για εργασία με τα επιλεγμένα στοιχεία.\",\n\t\"Contains commands for selecting and transferring items.\": \"Εντολές για την επιλογή και μεταφορά στοιχείων.\",\n\t\"Contains commands for customizing this window.\": \"Εντολές για την προσαρμογή αυτού του παράθυρου.\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"Εντολές για το χειρισμό εικόνων και τη ρύθμιση χαρακτηριστικών.\",\n\t\"Contains commands for using custom colors and drawing options.\": \"Εντολές για τη χρήση προσαρμοσμένων χρωμάτων και επιλογών σχεδίασης.\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"Εντολές για την εμφάνιση Βοήθειας και πληροφοριών για τη Ζωγραφική.\",\n\t\"Cannot save file.\": \"Δεν είναι δυνατό να αποθηκευτεί το αρχείο.\",\n\t\"Error removing temporary file.\": \"Παρουσιάστηκε σφάλμα κατά την κατάργηση του προσωρινού αρχείου.\",\n\t\"Get Colors\": \"Λήψη χρωμάτων\",\n\t\"Save Colors\": \"Αποθήκευση χρωμάτων\",\n\t\"File last saved:\": \"Τελευταία αποθήκευση:\",\n\t\"Not Available\": \"Μη διαθέσιμη\",\n\t\"Size on disk:\": \"Μέγεθος στο δίσκο:\",\n\t\"%s bytes\": \"%s byte\",\n\t\"Painting\": \"Χρωματισμός\",\n\t\"Fonts\": \"Γραμματοσειρές\",\n\t\"Tools\": \"Εργαλεία\",\n\t\"All Picture Files\": \"Όλα τα αρχεία εικόνας\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"Για βοήθεια, επιλέξτε τα \\\"Θέματα στη Βοήθεια\\\" από το μενού \\\"Βοήθεια\\\".\",\n\t\"Select an area on which to get Help.\": \"Επιλέξτε μία περιοχή για την οποία θέλετε Βοήθεια.\",\n\t\"%1 in %2\": \"%1 σε %2\",\n\t\"Creates a new document.\": \"Δημιουργεί ένα νέο έγγραφο.\",\n\t\"Opens an existing document.\": \"Ανοίγει ένα υπάρχον έγγραφο.\",\n\t\"Closes the active document.\": \"Κλείνει το ενεργό έγγραφο.\",\n\t\"Saves the active document.\": \"Αποθηκεύει το ενεργό έγγραφο.\",\n\t\"Saves the active document with a new name.\": \"Αποθηκεύει το ενεργό έγγραφο με νέο όνομα.\",\n\t\"Changes the page layout.\": \"Αλλάζει τη διάταξη της σελίδας.\",\n\t\"Specifies the default printer setup.\": \"Καθορίζει τις προεπιλεγμένες παραμέτρους εκτύπωσης.\",\n\t\"Prints the active document and sets printing options.\": \"Εκτυπώνει το ενεργό έγγραφο και ρυθμίζει τις παραμέτρους εκτύπωσης.\",\n\t\"Displays full pages.\": \"Εμφανίζει ολόκληρες σελίδες.\",\n\t\"Opens this document.\": \"Ανοίγει αυτό το έγγραφο.\",\n\t\"Deletes the selection.\": \"Διαγράφει την επιλεγμένη περιοχή.\",\n\t\"Erases everything.\": \"Διαγραφή όλων.\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"Αντιγράφει την επιλεγμένη περιοχή και την τοποθετεί στο Πρόχειρο.\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"Αποκόβει την επιλεγμένη περιοχή και την τοποθετεί στο Πρόχειρο.\",\n\t\"Finds the specified text.\": \"Βρίσκει το καθορισμένο κείμενο.\",\n\t\"Inserts the contents of the Clipboard.\": \"Εισάγει τα περιεχόμενα του Προχείρου.\",\n\t\"Repeats the last action.\": \"Επαναλαμβάνει την τελευταία ενέργεια.\",\n\t\"Replaces specific text with different text.\": \"Αντικαθιστά ένα συγκεκριμένο κείμενο με διαφορετικό.\",\n\t\"Selects everything.\": \"Επιλέγει όλα τα στοιχεία.\",\n\t\"Undoes the last action.\": \"Αναιρεί την τελευταία ενέργεια.\",\n\t\"Redoes the previously undone action.\": \"Επαναλαμβάνει την τελευταία ενέργεια που αναιρέθηκε.\",\n\t\"Displays program information, version number, and copyright.\": \"Εμφανίζει πληροφορίες για το πρόγραμμα, την έκδοση και τα δικαιώματα.\",\n\t\"Quits Paint.\": \"Κλείνει τη Ζωγραφική.\",\n\t\"Opens Paint Help.\": \"Ανοίγει τη Βοήθεια για τη Ζωγραφική.\",\n\t\"Displays instructions about how to use Help.\": \"Εμφανίζει οδηγίες για τη χρήση της Βοήθειας.\",\n\t\"Displays Help for areas you click on.\": \"Εμφανίζει Βοήθεια για τα στοιχεία που κάνετε κλικ.\",\n\t\"Displays Help for the current task or command.\": \"Εμφανίζει Βοήθεια για την τρέχουσα εργασία ή εντολή.\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"Τοποθετεί στο κέντρο αυτό το bitmap ως ταπετσαρία της επιφάνεια εργασίας.\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"Τοποθετεί σε παράθεση αυτό το bitmap ως ταπετσαρία στην επιφάνεια εργασίας.\",\n\t\"Sends the selection using mail or fax.\": \"Αποστέλλει την επιλεγμένη περιοχή χρησιμοποιώντας ταχυδρομείο ή fax.\",\n\t\"Prints the selection.\": \"Εκτυπώνει την επιλεγμένη περιοχή.\",\n\t\"Shows or hides the thumbnail.\": \"Εμφανίζει ή κρύβει τη μικρογραφία.\",\n\t\"Shows Paint Help.\": \"Εμφανίζει τη Βοήθεια για τη Ζωγραφική.\",\n\t\"Shows or hides the status bar.\": \"Εμφανίζει ή κρύβει τη γραμμή κατάστασης.\",\n\t\"Shows or hides the tool box.\": \"Εμφανίζει ή κρύβει την εργαλειοθήκη.\",\n\t\"Shows or hides the color box.\": \"Εμφανίζει ή κρύβει το πλαίσιο χρωμάτων.\",\n\t\"Only a Far East font can be used for vertical editing.\": \"Μόνο γραμματοσειρά Far East μπορεί να χρησιμοποιηθεί για κατακόρυφη γραφή.\",\n\t\"Changes the window size.\": \"Αλλάζει το μέγεθος του παραθύρου.\",\n\t\"Changes the window position.\": \"Αλλάζει τη θέση του παραθύρου.\",\n\t\"Reduces the window to an icon.\": \"Σμικρύνει το παράθυρο σε εικονίδιο.\",\n\t\"Enlarges the window to full size.\": \"Μεγεθύνει το παράθυρο στο μέγιστο μέγεθος.\",\n\t\"Switches to the next document window.\": \"Περνά στο επόμενο παράθυρο εγγράφου.\",\n\t\"Switches to the previous document window.\": \"Περνά στο προηγούμενο παράθυρο εγγράφου.\",\n\t\"Closes the active window and asks if you want to save changes.\": \"Κλείνει το ενεργό παράθυρο και ρωτά για αποθήκευση των αλλαγών.\",\n\t\"Restores the window to normal size.\": \"Επαναφέρει το παράθυρο στο κανονικό μέγεθος.\",\n\t\"Activates the task list.\": \"Ενεργοποιεί τη λίστα εργασιών.\",\n\t\"All Files (*.*)\": \"Όλα τα αρχεία (*.*)\",\n\t\"Untitled\": \"Ανώνυμο\",\n\t\"an unnamed file\": \"ανώνυμο αρχείο\",\n\t\"&Hide\": \"&Απόκρυψη\",\n\t\"Hide\": \"Απόκρυψη\",\n\t\"No error message is available.\": \"Δεν υπάρχει διαθέσιμο μήνυμα σφάλματος.\",\n\t\"An unsupported operation was attempted.\": \"Έγινε προσπάθεια εκτέλεσης μιας λειτουργίας που δεν υποστηρίζεται.\",\n\t\"A required resource was unavailable.\": \"Ένας απαραίτητος πόρος δεν ήταν διαθέσιμος.\",\n\t\"Out of memory.\": \"Η μνήμη εξαντλήθηκε.\",\n\t\"An unknown error has occurred.\": \"Παρουσιάστηκε άγνωστο σφάλμα.\",\n\t\"on %1\": \"σε %1\",\n\t\"&One Page\": \"&Μία σελίδα\",\n\t\"One Page\": \"Μία σελίδα\",\n\t\"&Two Page\": \"&Δύο σελίδες\",\n\t\"Two Page\": \"Δύο σελίδες\",\n\t\"Page %u\": \"Σελίδα %u\",\n\t\"Pages %u-%u\": \"Σελίδες %u-%u\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"Αρχεία εκτυπωτή (*.prn)|*.prn|Όλα τα αρχεία (*.*)|*.*||\",\n\t\"Print to File\": \"Εκτύπωση σε αρχείο\",\n\t\"to %1\": \"στο %1\",\n\t\"&Update %1\": \"&Ενημέρωση του %1\",\n\t\"Update %1\": \"Ενημέρωση του %1\",\n\t\"E&xit && Return to %1\": \"Έ&ξοδος && επιστροφή στο %1\",\n\t\"Exit & Return to %1\": \"Έξοδος & επιστροφή στο %1\",\n\t\"Linked %s\": \"Δεσμός %s\",\n\t\"Unknown Type\": \"Άγνωστου τύπου\",\n\t\"Invalid filename.\": \"Το όνομα του αρχείου δεν είναι έγκυρο.\",\n\t\"Failed to open document.\": \"Το άνοιγμα του εγγράφου απέτυχε.\",\n\t\"Failed to save document.\": \"Η αποθήκευση του εγγράφου απέτυχε.\",\n\t\"Save changes to %1?\": \"Να αποθηκευτούν οι αλλαγές στο %1;\",\n\t\"Failed to create empty document.\": \"Η δημιουργία κενού εγγράφου απέτυχε.\",\n\t\"The file is too large to open.\": \"Δεν είναι δυνατό να ανοιχτεί το αρχείο γιατί είναι υπερβολικά μεγάλο.\",\n\t\"Could not start print job.\": \"Δεν είναι δυνατό να ξεκινήσει η εργασία εκτύπωσης.\",\n\t\"Failed to launch help.\": \"Η εκκίνηση της Βοήθειας απέτυχε.\",\n\t\"Internal application error.\": \"Εσωτερικό σφάλμα εφαρμογής.\",\n\t\"Command failed.\": \"Η εντολή απέτυχε.\",\n\t\"Insufficient memory to perform operation.\": \"Η μνήμη δεν επαρκεί για να ολοκληρωθεί η λειτουργία.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"Οι καταχωρήσεις στο αρχείο μητρώου έχουν καταργηθεί και το αρχείο INI (εφόσον υπήρχε) έχει διαγραφεί.\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"Δεν καταργήθηκαν όλες οι καταχωρήσεις στο μητρώο του συστήματος (ή το αρχείο INI).\",\n\t\"This program requires the file %s, which was not found on this system.\": \"Αυτό το πρόγραμμα χρειάζεται το αρχείο %s το οποίο δεν βρέθηκε στο σύστημά σας.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"Το στοιχείο %s στο αρχείο %s με το οποίο συνδέεται αυτό το πρόγραμμα λείπει. Αυτή η μηχανή ίσως δεν έχει συμβατή έκδοση του %s.\",\n\t\"Please enter an integer.\": \"Πληκτρολογήστε έναν ακέραιο αριθμό.\",\n\t\"Please enter a number.\": \"Πληκτρολογήστε έναν αριθμό.\",\n\t\"Please enter an integer between %1 and %2.\": \"Πληκτρολογήστε έναν ακέραιο μεταξύ %1 και %2.\",\n\t\"Please enter a number between %1 and %2.\": \"Πληκτρολογήστε έναν αριθμό μεταξύ %1 και %2.\",\n\t\"Please enter no more than %1 characters.\": \"Μην πληκτρολογήσετε περισσότερους από %1 χαρακτήρες.\",\n\t\"Please select a button.\": \"Επιλέξτε ένα κουμπί.\",\n\t\"Please enter an integer between 0 and 255.\": \"Πληκτρολογήστε έναν ακέραιο μεταξύ 0 και 255.\",\n\t\"Please enter a positive integer.\": \"Πληκτρολογήστε έναν θετικό ακέραιο.\",\n\t\"Please enter a date and/or time.\": \"Πληκτρολογήστε ημερομηνία ή/και ώρα.\",\n\t\"Please enter a currency.\": \"Πληκτρολογήστε μία νομισματική μονάδα.\",\n\t\"Unexpected file format.\": \"Μη αναμενόμενη μορφή αρχείου.\",\n\t\"Cannot find this file.\": \"Δεν είναι δυνατό να βρεθεί αυτό το αρχείο.\",\n\t\"Please verify that the correct path and file name are given.\": \"Βεβαιωθείτε ότι δώσατε σωστά το όνομα αρχείου και τη διαδρομή.\",\n\t\"Destination disk drive is full.\": \"Η μονάδα δίσκου προορισμού είναι γεμάτη.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"Δεν είναι δυνατή η ανάγνωση του αρχείου %1 επειδή έχει ανοιχτεί από κάποιον άλλο.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"Δεν είναι δυνατή η εγγραφή στο %1 επειδή είναι μόνο για ανάγνωση ή έχει ανοιχτεί από κάποιον άλλο.\",\n\t\"An unexpected error occurred while reading %1.\": \"Παρουσιάστηκε ένα μη αναμενόμενο σφάλμα κατά την ανάγνωση του %1.\",\n\t\"An unexpected error occurred while writing %1.\": \"Εκδηλώθηκε ένα μη αναμενόμενο σφάλμα κατά την εγγραφή στο %1.\",\n\t\"Unable to register document.\": \"Δεν ήταν δυνατό να καταχωρηθεί το έγγραφο.\",\n\t\"The document may already be open.\": \"Το έγγραφο ίσως είναι ήδη ανοιχτό.\",\n\t\"Update %1 before proceeding?\": \"Να ενημερωθεί το %1 πριν από τη συνέχεια;\",\n\t\"Could not update client.\": \"Δεν ήταν δυνατό να ενημερωθεί το πρόγραμμα-πελάτης.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"Η καταχώρηση απέτυχε. Τα χαρακτηριστικά του ActiveX ίσως δεν λειτουργήσουν σωστά.\",\n\t\"Failed to update the system registry.\": \"Η ενημέρωση του μητρώου συστήματος απέτυχε.\",\n\t\"Please try using REGEDIT.\": \"Προσπαθήστε χρησιμοποιώντας το REGEDIT.\",\n\t\"Unable to read write-only property.\": \"Δεν είναι δυνατή η ανάγνωση μιας ιδιότητας που είναι μόνο για εγγραφή.\",\n\t\"Unable to write read-only property.\": \"Δεν είναι δυνατή η εγγραφή σε μία ιδιότητα που είναι μόνο για ανάγνωση.\",\n\t\"Unable to load mail system support.\": \"Δεν είναι δυνατό να φορτωθεί η υποστήριξη συστήματος αλληλογραφίας.\",\n\t\"Mail system DLL is invalid.\": \"Το DLL του συστήματος ταχυδρομείου δεν είναι έγκυρο.\",\n\t\"Send Mail failed to send message.\": \"Η Αποστολή Αλληλογραφίας απέτυχε να στείλει το μήνυμα.\",\n\t\"No error occurred.\": \"Δεν παρουσιάστηκε σφάλμα.\",\n\t\"An unknown error occurred while accessing %1.\": \"Παρουσιάστηκε ένα άγνωστο σφάλμα κατά την πρόσβαση στο %1.\",\n\t\"%1 was not found.\": \"Το %1 δεν βρέθηκε.\",\n\t\"%1 contains an invalid path.\": \"Το %1 περιέχει  μία μη έγκυρη διαδρομή.\",\n\t\"%1 could not be opened because there are too many open files.\": \"Δεν είναι δυνατό να ανοιχτεί το %1 γιατί υπάρχουν πολλά ανοικτά αρχεία.\",\n\t\"Access to %1 was denied.\": \"Δεν επιτράπηκε η πρόσβαση στο %1.\",\n\t\"An invalid file handle was associated with %1.\": \"Ο δείκτης χειρισμού αρχείου που συσχετίστηκε με το %1 δεν είναι έγκυρος.\",\n\t\"%1 could not be removed because it is the current directory.\": \"Δεν είναι δυνατή η κατάργηση του %1 γιατί είναι ο τρέχων κατάλογος.\",\n\t\"%1 could not be created because the directory is full.\": \"Δεν είναι δυνατή η δημιουργία του %1 γιατί ο κατάλογος είναι πλήρης.\",\n\t\"Seek failed on %1\": \"Η αναζήτηση στο αρχείο %1 απέτυχε\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"Αναφέρθηκε σφάλμα υλικού εισόδου/εξόδου κατά την πρόσβαση στο %1.\",\n\t\"A sharing violation occurred while accessing %1.\": \"Παρουσιάστηκε παραβίαση κοινής χρήσης κατά την πρόσβαση στο %1.\",\n\t\"A locking violation occurred while accessing %1.\": \"Παρουσιάστηκε παραβίαση κλειδώματος κατά την πρόσβαση στο %1.\",\n\t\"Disk full while accessing %1.\": \"Ο δίσκος γέμισε κατά την πρόσβαση στο %1.\",\n\t\"An attempt was made to access %1 past its end.\": \"Έγινε προσπάθεια πρόσβασης μετά το τέλος του %1.\",\n\t\"An attempt was made to write to the reading %1.\": \"Έγινε προσπάθεια εγγραφής στο αρχείο ανάγνωσης %1.\",\n\t\"An attempt was made to read from the writing %1.\": \"Έγινε προσπάθεια ανάγνωσης από το αρχείο εγγραφής %1.\",\n\t\"%1 has a bad format.\": \"Το %1 έχει ακατάλληλη μορφή.\",\n\t\"%1 contained an unexpected object.\": \"Το %1 περιέχει ένα μη αναμενόμενο αντικείμενο.\",\n\t\"%1 contains an incorrect schema.\": \"Το %1 περιέχει μια εσφαλμένη διάταξη.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"Επιλογή ορθογώνιου τμήματος για μετακίνηση, αποκοπή ή διόρθωση.\",\n\t\"Select\": \"Επιλογή\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"Επιλογή τμήματος με ελεύθερη μορφή για μετακίνηση, αποκοπή ή διόρθωση.\",\n\t\"Free-Form Select\": \"Επιλογή ελεύθερης μορφής\",\n\t\"Inserts text into the picture.\": \"Εισαγωγή κειμένου στην εικόνα.\",\n\t\"Fills an area with the current drawing color.\": \"Γέμισμα περιοχής με το τρέχον χρώμα σχεδίασης.\",\n\t\"Fill With Color\": \"Γέμισμα με χρώμα\",\n\t\"Draws a straight line with the selected line width.\": \"Σχεδίαση ευθείας γραμμής με το επιλεγμένο πλάτος γραμμής.\",\n\t\"Line\": \"Γραμμή\",\n\t\"Draws using an airbrush of the selected size.\": \"Σχεδίαση με αερογράφο στο επιλεγμένο μέγεθος.\",\n\t\"Airbrush\": \"Αερογράφος\",\n\t\"Draws a curved line with the selected line width.\": \"Σχεδίαση καμπύλης γραμμής με το επιλεγμένο πλάτος γραμμής.\",\n\t\"Curve\": \"Καμπύλη\",\n\t\"Draws a polygon with the selected fill style.\": \"Σχεδίαση πολυγώνου με το επιλεγμένο γέμισμα.\",\n\t\"Polygon\": \"Πολύγωνο\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"Σχεδίαση στρογγυλεμένου ορθογώνιου με το επιλεγμένο γέμισμα.\",\n\t\"Rounded Rectangle\": \"Στρογγυλεμένο ορθογώνιο\",\n\t\"Draws a free-form line one pixel wide.\": \"Ελεύθερη σχεδίαση γραμμής με πλάτος ένα pixel.\",\n\t\"Pencil\": \"Μολύβι\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"Σβήσιμο τμήματος της εικόνας με χρήση της επιλεγμένης γόμας.\",\n\t\"Eraser/Color Eraser\": \"Γόμα/Έγχρωμη γόμα\",\n\t\"Changes the magnification.\": \"Αλλαγή της μεγέθυνσης.\",\n\t\"Magnifier\": \"Μεγεθυντικός φακός\",\n\t\"Picks up a color from the picture for drawing.\": \"Επιλογή χρώματος από την εικόνα για σχεδίαση.\",\n\t\"Pick Color\": \"Συλλογή χρώματος\",\n\t\"Draws using a brush with the selected shape and size.\": \"Σχεδίαση με πινέλο με το επιλεγμένο σχήμα και μέγεθος.\",\n\t\"Brush\": \"Πινέλο\",\n\t\"Draws a rectangle with the selected fill style.\": \"Σχεδίαση ορθογώνιου με το επιλεγμένο γέμισμα.\",\n\t\"Rectangle\": \"Ορθογώνιο\",\n\t\"Draws a filled rectangle.\": \"Σχεδίαση γεμισμένου ορθογώνιου.\",\n\t\"Draws an ellipse with the selected fill style.\": \"Σχεδίαση έλλειψης με το επιλεγμένο γέμισμα.\",\n\t\"Ellipse\": \"Έλλειψη\",\n\t\"Draws a filled ellipse.\": \"Σχεδίαση γεμισμένης έλλειψης.\",\n\t\"Makes the current selection either opaque or transparent.\": \"Μεταβολή της τρέχουσας επιλεγμένης περιοχής σε αδιαφανή ή διαφανή.\",\n\t\"Creates a new color.\": \"Δημιουργία νέου χρώματος.\",\n\t\"Uses a previously saved palette of colors.\": \"Χρήση ήδη αποθηκευμένης παλέτας χρωμάτων.\",\n\t\"Saves the current palette of colors to a file.\": \"Αποθήκευση της τρέχουσας παλέτας χρωμάτων σε ένα αρχείο.\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"Πρέπει να αποθηκεύσετε το αρχείο πριν το επιλέξετε ως ταπετσαρία.\",\n\t\"The selection is now larger than the bitmap.\": \"Η επιλεγμένη περιοχή είναι τώρα μεγαλύτερη από το bitmap.\",\n\t\"Would you like the bitmap enlarged?\": \"Μήπως θέλετε να μεγαλώσει το bitmap;\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"Η εικόνα στο Πρόχειρο είναι μεγαλύτερη από το bitmap.\",\n\t\"The file is not in the correct format.\": \"Το αρχείο δεν έχει τη σωστή μορφή.\",\n\t\"Not enough room to paste text.\": \"Δεν υπάρχει αρκετός χώρος για την επικόλληση του κειμένου.\",\n\t\"Enlarge the text area and try again.\": \"Μεγεθύνετε την περιοχή του κειμένου και ξαναπροσπαθήστε.\",\n\t\"Places the text.\": \"Τοποθέτηση κειμένου.\"\n});\n"
  },
  {
    "path": "localization/es/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"es\", {\n\t\"Attributes\": \"Atributos\",\n\t\"&Width:\": \"&Ancho:\",\n\t\"Width:\": \"Ancho:\",\n\t\"&Height:\": \"A&lto:\",\n\t\"Height:\": \"Alto:\",\n\t\"Units\": \"Unidades\",\n\t\"&Inches\": \"P&ulgadas\",\n\t\"Inches\": \"Pulgadas\",\n\t\"C&m\": \"&cm\",\n\t\"Cm\": \"cm\",\n\t\"&Pixels\": \"Pí&xeles\",\n\t\"Pixels\": \"Píxeles\",\n\t\"Colors\": \"Colores\",\n\t\"&Black and white\": \"&Blanco y negro\",\n\t\"Black and white\": \"Blanco y negro\",\n\t\"Co&lors\": \"C&olores\",\n\t\"Transparency\": \"Transparencia\",\n\t\"Use &Transparent background color\": \"Usar un color &transparente de fondo\",\n\t\"Use Transparent background color\": \"Usar un color transparente de fondo\",\n\t\"Select &Color\": \"&Seleccionar color\",\n\t\"Select Color\": \"Seleccione un color\",\n\t\"OK\": \"Aceptar\",\n\t\"Cancel\": \"Cancelar\",\n\t\"&Default\": \"&Predeterminado\",\n\t\"Default\": \"Predeterminado\",\n\t\"Custom Zoom\": \"Zoom personalizado\",\n\t\"Current zoom:\": \"Zoom actual:\",\n\t\"Zoom to\": \"Zoom\",\n\t\"Flip and Rotate\": \"Voltear y rotar\",\n\t\"Flip or rotate\": \"Voltear o rotar\",\n\t\"&Flip horizontal\": \"Voltear &horizontalmente\",\n\t\"Flip horizontal\": \"Voltear horizontalmente\",\n\t\"Flip &vertical\": \"Voltear &verticalmente\",\n\t\"Flip vertical\": \"Voltear verticalmente\",\n\t\"&Rotate by angle\": \"&Rotar\",\n\t\"Rotate by angle\": \"Rotar\",\n\t\"Stretch and Skew\": \"Expandir y contraer\",\n\t\"Stretch\": \"Expandir\",\n\t\"Skew\": \"Contraer\",\n\t\"H&orizontal:\": \"Hori&zontal:\",\n\t\"Horizontal:\": \"Horizontal:\",\n\t\"Degrees\": \"grados\",\n\t\"Color Table\": \"Tabla de colores\",\n\t\"New\": \"Nuevo\",\n\t\"&New \": \"&Nuevo \",\n\t\"New \": \"Nuevo \",\n\t\"&Help\": \"Ay&uda\",\n\t\"Help\": \"Ayuda\",\n\t\"Printing\": \"Imprimiendo\",\n\t\"on the\": \"en\",\n\t\"&Print\": \"I&mprimir\",\n\t\"Print\": \"Imprimir\",\n\t\"&Next Page\": \"&Pág. sig.\",\n\t\"Next Page\": \"Pág. sig.\",\n\t\"Pre&v Page\": \"Pág. ante&rior\",\n\t\"Prev Page\": \"Pág. anterior\",\n\t\"Zoom &In\": \"&Acercar\",\n\t\"Zoom In\": \"Acercar\",\n\t\"Zoom &Out\": \"A&lejar\",\n\t\"Zoom Out\": \"Alejar\",\n\t\"&Close\": \"&Cerrar\",\n\t\"Close\": \"Cerrar\",\n\t\"Grid Settings\": \"Configuración de la cuadrícula\",\n\t\"&Pixel Grid\": \"Cuadrícula de pí&xeles\",\n\t\"Pixel Grid\": \"Cuadrícula de píxeles\",\n\t\"&Tile Grid\": \"Cuadrícula de &mosaico\",\n\t\"Tile Grid\": \"Cuadrícula de mosaico\",\n\t\"pixels\": \"píxeles\",\n\t\"H&eight:\": \"Alt&o:\",\n\t\"Text\": \"Texto\",\n\t\"Undo\": \"Deshacer\",\n\t\"Cut\": \"Cortar\",\n\t\"Copy\": \"Copiar\",\n\t\"Paste\": \"Pegar\",\n\t\"Clear Selection\": \"Borrar selección\",\n\t\"Select All\": \"Seleccionar todo\",\n\t\"Text Toolbar\": \"Barra de herramientas de texto\",\n\t\"Selection\": \"Selección\",\n\t\"Cu&t\": \"C&ortar\",\n\t\"&Copy\": \"&Copiar\",\n\t\"&Paste\": \"&Pegar\",\n\t\"C&lear Selection\": \"&Borrar selección\",\n\t\"Select &All\": \"Seleccionar &todo\",\n\t\"C&opy To\": \"Copi&ar a\",\n\t\"Copy To\": \"Copiar a\",\n\t\"Paste &From\": \"P&egar desde\",\n\t\"Paste From\": \"Pegar desde\",\n\t\"Flip/&Rotate\": \"&Voltear o rotar\",\n\t\"Flip/Rotate\": \"Voltear o rotar\",\n\t\"&Stretch/Skew\": \"E&xpandir o contraer\",\n\t\"Stretch/Skew\": \"Expandir o contraer\",\n\t\"&Invert Colors\": \"I&nvertir colores\",\n\t\"Invert Colors\": \"Invertir colores\",\n\t\"Thumbnail\": \"Vista en miniatura\",\n\t\"&File\": \"&Archivo\",\n\t\"File\": \"Archivo\",\n\t\"&New\": \"&Nuevo\",\n\t\"&Open\": \"&Abrir\",\n\t\"Open\": \"Abrir\",\n\t\"Ctrl+O\": \"Ctrl+A\",\n\t\"&Save\": \"&Guardar\",\n\t\"Save\": \"Guardar\",\n\t\"Ctrl+S\": \"Ctrl+G\",\n\t\"Save &As\": \"Guardar co&mo\",\n\t\"Save As\": \"Guardar como\",\n\t\"Print Pre&view\": \"&Vista preliminar\",\n\t\"Print Preview\": \"Vista preliminar\",\n\t\"Page Se&tup\": \"&Configurar página\",\n\t\"Page Setup\": \"Configurar página\",\n\t\"S&end\": \"&Enviar\",\n\t\"Send\": \"Enviar\",\n\t\"Set As &Wallpaper (Tiled)\": \"Establecer como papel tapiz (m&osaico)\",\n\t\"Set As Wallpaper (Tiled)\": \"Establecer como papel tapiz (mosaico)\",\n\t\"Set As Wa&llpaper (Centered)\": \"Estab&lecer como papel tapiz (centrado)\",\n\t\"Set As Wallpaper (Centered)\": \"Establecer como papel tapiz (centrado)\",\n\t\"Recent File\": \"Archivo reciente\",\n\t\"E&xit\": \"&Salir\",\n\t\"Exit\": \"Salir\",\n\t\"&Edit\": \"&Edición\",\n\t\"Edit\": \"Edición\",\n\t\"&Undo\": \"&Deshacer\",\n\t\"&Repeat\": \"&Repetir\",\n\t\"Repeat\": \"Repetir\",\n\t\"Del\": \"Supr\",\n\t\"Ctrl+A\": \"Ctrl+E\",\n\t\"&View\": \"&Ver\",\n\t\"View\": \"Ver\",\n\t\"&Tool Box\": \"Cuadro de &herramientas\",\n\t\"Tool Box\": \"Cuadro de herramientas\",\n\t\"Ctrl+T\": \"Ctrl+H\",\n\t\"&Color Box\": \"Cua&dro de colores\",\n\t\"Color Box\": \"Cuadro de colores\",\n\t\"Ctrl+L\": \"Ctrl+D\",\n\t\"&Status Bar\": \"Barra d&e estado\",\n\t\"Status Bar\": \"Barra de estado\",\n\t\"T&ext Toolbar\": \"&Barra de herramientas de texto\",\n\t\"&Normal Size\": \"&Tamaño normal\",\n\t\"Normal Size\": \"Tamaño normal\",\n\t\"Ctrl+PgUp\": \"Ctrl+Re Pág\",\n\t\"&Large Size\": \"T&amaño grande\",\n\t\"Large Size\": \"Tamaño grande\",\n\t\"Ctrl+PgDn\": \"Ctrl+Av Pág\",\n\t\"C&ustom\": \"&Personalizado\",\n\t\"Custom\": \"Personalizado\",\n\t\"Show &Grid\": \"Most&rar cuadrícula\",\n\t\"Show Grid\": \"Mostrar cuadrícula\",\n\t\"Ctrl+G\": \"Ctrl+M\",\n\t\"Show T&humbnail\": \"Mostrar página en &miniatura\",\n\t\"Show Thumbnail\": \"Mostrar página en miniatura\",\n\t\"&View Bitmap\": \"&Ver mapa de bits\",\n\t\"View Bitmap\": \"Ver mapa de bits\",\n\t\"Ctrl+F\": \"Ctrl+B\",\n\t\"&Image\": \"&Imagen\",\n\t\"Image\": \"Imagen\",\n\t\"&Flip/Rotate\": \"&Voltear o rotar\",\n\t\"&Attributes\": \"&Atributos\",\n\t\"Ctrl+E\": \"Ctrl+Mayús+E\",\n\t\"&Clear Image\": \"&Borrar imagen\",\n\t\"Clear Image\": \"Borrar imagen\",\n\t\"Ctrl+Shft+N\": \"Ctrl+Mayús+N\",\n\t\"&Draw Opaque\": \"&Dibujar figuras opacas\",\n\t\"Draw Opaque\": \"Dibujar figuras opacas\",\n\t\"&Colors\": \"C&olores\",\n\t\"&Edit Colors\": \"&Modificar colores\",\n\t\"Edit Colors\": \"Modificar colores\",\n\t\"&Help Topics\": \"&Temas de Ayuda\",\n\t\"Help Topics\": \"Temas de Ayuda\",\n\t\"&About Paint\": \"&Acerca de Paint\",\n\t\"About Paint\": \"Acerca de Paint\",\n\t\"&Update\": \"Act&ualizar\",\n\t\"Update\": \"Actualizar\",\n\t\"Save Copy &As\": \"&Guardar copia como\",\n\t\"Save Copy As\": \"Guardar copia como\",\n\t\"untitled\": \"Dibujo\",\n\t\"Bitmap Image\": \"Imagen de mapa de bits\",\n\t\"Bitmap Files (*.bmp)\": \"Archivos de mapa de bits (*.bmp)\",\n\t\"PCX Files\": \"Archivos PCX\",\n\t\"Icon Files\": \"Archivos de icono\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"Mapa de bits monocromo (*.bmp;*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"Mapa de bits de 16 colores (*.bmp;*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"Mapa de bits de 256 colores (*.bmp;*.dib)\",\n\t\"Paint cannot open this file.\": \"Paint no puede abrir este archivo.\",\n\t\"Paint cannot read this file.\": \"Paint no puede leer este archivo.\",\n\t\"This file is read-only.\": \"Este archivo es de sólo lectura.\",\n\t\"To save your changes, use a different filename.\": \"Para guardar los cambios, utilice un nombre de archivo diferente.\",\n\t\"This file is already open.\": \"Este archivo ya está abierto.\",\n\t\"This is not a valid .PCS file.\": \"No es un archivo .PCS válido.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"Este archivo está abierto para edición y no puede sobrescribirse.\",\n\t\"Use a different filename to save your changes.\": \"Utilice un nombre de archivo diferente para guardar los cambios.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"Este archivo no es un archivo de mapa de bits válido o su formato no es compatible.\",\n\t\"This is not a valid icon.\": \"No es un icono válido.\",\n\t\"This is not a valid cursor.\": \"No es un cursor válido.\",\n\t\"Save was interrupted, so your file has not been saved.\": \"El proceso de  guardar fue interrumpido. El archivo no se ha guardado.\",\n\t\"You cannot save to a read-only file.\": \"No se puede guardar un archivo de sólo lectura.\",\n\t\"Use a different file name.\": \"Utilice un nombre de archivo diferente.\",\n\t\"This file is already in use.\": \"Este archivo ya está en uso.\",\n\t\"Close the program, and then try again.\": \"Cierre el programa e intente de nuevo.\",\n\t\"Paint cannot save this file.\": \"Paint no puede guardar este archivo.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"Paint no puede guardar un archivo de nombre idéntico con un tipo de archivo diferente.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"El espaciado de la cuadrícula debe ser un entero entre %d y %d.\",\n\t\"There is not enough memory or resources to complete operation.\": \"No hay recursos o memoria suficientes para completar la operación.\",\n\t\"Close some programs, and then try again.\": \"Cierre algunos programas e intente de nuevo.\",\n\t\"Low on memory or resources.\": \"Memoria o recursos insuficientes.\",\n\t\"Group error.\": \"Error de grupo.\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"Paint no puede imprimir su documento. Asegúrese de que existe suficiente espacio en el disco y de que su impresora funciona correctamente.\",\n\t\"Saving into this format may cause some loss of color information.\": \"Guardar en este formato puede causar pérdida de información de color.\",\n\t\"Do you want to continue?\": \"¿Desea continuar?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"No se puede deshacer la operación de convertir en blanco y negro. Esto afecta al archivo actual y puede causar la pérdida de información de color.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"Los mapas de bits deben ser mayores de un píxel en un lado.\",\n\t\"Generic error.\": \"Error genérico.\",\n\t\"File not found.\": \"Archivo no encontrado.\",\n\t\"Bad path.\": \"Ruta errónea.\",\n\t\"Too many open files.\": \"Demasiados archivos abiertos.\",\n\t\"Access denied.\": \"Acceso denegado.\",\n\t\"Invalid file.\": \"Archivo no válido.\",\n\t\"Remove current folder.\": \"Quitar carpeta actual.\",\n\t\"Folder full.\": \"Carpeta llena.\",\n\t\"Bad seek.\": \"Búsqueda errónea.\",\n\t\"Hard IO error.\": \"Error de hardware de E/S.\",\n\t\"Sharing violation.\": \"Infracción al compartir.\",\n\t\"Lock violation.\": \"Infracción de bloqueo.\",\n\t\"Disk full.\": \"Disco lleno.\",\n\t\"End of file.\": \"Final de archivo.\",\n\t\"Error getting the Clipboard Data!\": \"Error al obtener información del Portapapeles\",\n\t\"No Printer Found @ page setup\": \"No se encontró impresora en Configuración de página\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"Mapa de bits de 24 bits (*.bmp;*.dib)\",\n\t\"All Files\": \"Todos los archivos\",\n\t\"Palette|*.pal|\": \"Paleta|*.pal|\",\n\t\"untitled.pal\": \"Dibujo.pal\",\n\t\"OLE 2.0 was unable to start.\": \"OLE 2.0 no se puede iniciar.\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"Asegúrese de que está utilizando la versión correcta de las bibliotecas OLE.\",\n\t\"Resets the text be without any attributes.\": \"Restablece el texto sin ningún atributo.\",\n\t\"Sets or clears the text bold attribute.\": \"Aplica o quita el formato de negrita.\",\n\t\"Sets or clears the text italic attribute.\": \"Aplica o quita el formato de cursiva.\",\n\t\"Selects the font used by the text.\": \"Selecciona la fuente utilizada por el texto.\",\n\t\"Selects the point size of the text.\": \"Selecciona el tamaño en puntos del texto.\",\n\t\"Sets or clears the text underline attribute.\": \"Establece o quita el atributo subrayado del texto.\",\n\t\"Shows or hides the tooltips.\": \"Muestra u oculta la información sobre herramientas.\",\n\t\"Show Paint Help.\": \"Muestra la Ayuda de Paint.\",\n\t\"Sends a picture by using mail or fax.\": \"Envía una imagen utilizando correo o fax.\",\n\t\"Copies the selection to a file.\": \"Copia la selección a un archivo.\",\n\t\"Pastes a file into the selection.\": \"Pega un archivo en la selección.\",\n\t\"Zooms the picture to 100%.\": \"Amplía la imagen a 100%.\",\n\t\"Zooms the picture to 400%.\": \"Amplía la imagen a 400%.\",\n\t\"Zooms the picture.\": \"Amplía la imagen.\",\n\t\"Displays the entire picture.\": \"Muestra toda la imagen.\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"Muestra u oculta la vista en miniatura de la imagen.\",\n\t\"Shows or hides the grid.\": \"Muestra u oculta la cuadrícula.\",\n\t\"Shows or hides the text toolbar.\": \"Muestra u oculta la barra de herramientas de texto.\",\n\t\"Flips or rotates the picture or a selection.\": \"Voltea o rota el dibujo o una selección.\",\n\t\"Stretches or skews the picture or a selection.\": \"Extiende o contrae la imagen o la selección.\",\n\t\"Inverts the colors of the picture or a selection.\": \"Invierte los colores de la imagen o de una selección.\",\n\t\"Changes the attributes of the picture.\": \"Cambia los atributos de la imagen.\",\n\t\"Clears the picture or selection.\": \"Borra la imagen o selección.\",\n\t\"The font size must be a numeric value.\": \"El tamaño de fuente debe ser un valor numérico.\",\n\t\"Contains commands for working with the selected item(s).\": \"Contiene comandos para trabajar con los elementos seleccionados.\",\n\t\"Contains commands for selecting and transferring items.\": \"Contiene comandos para seleccionar y transferir elementos.\",\n\t\"Contains commands for customizing this window.\": \"Contiene comandos para personalizar esta ventana.\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"Contiene comandos para manipular imágenes y establecer atributos.\",\n\t\"Contains commands for using custom colors and drawing options.\": \"Contiene comandos para utilizar colores personalizados y opciones de dibujo.\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"Contiene comandos para mostrar la Ayuda e información acerca de Paint.\",\n\t\"Cannot save file.\": \"No se puede guardar el archivo.\",\n\t\"Error removing temporary file.\": \"Error al quitar el archivo temporal.\",\n\t\"Get Colors\": \"Cargar colores\",\n\t\"Save Colors\": \"Guardar colores\",\n\t\"File last saved:\": \"Último archivo guardado:\",\n\t\"Not Available\": \"No disponible\",\n\t\"Size on disk:\": \"Tamaño en disco:\",\n\t\"Painting\": \"Pintando\",\n\t\"Bitmap\": \"Mapa de bits\",\n\t\"Fonts\": \"Fuentes\",\n\t\"Tools\": \"Herramientas\",\n\t\"All Picture Files\": \"Todos los archivos de imagen\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"Para obtener Ayuda, haga clic en Temas de Ayuda en el menú Ayuda.\",\n\t\"Select an area on which to get Help.\": \"Seleccione un área sobre la que desee obtener Ayuda.\",\n\t\"%1 in %2\": \"%1 en %2\",\n\t\"Creates a new document.\": \"Crea un nuevo documento.\",\n\t\"Opens an existing document.\": \"Abre un documento existente.\",\n\t\"Closes the active document.\": \"Cierra el documento activo.\",\n\t\"Saves the active document.\": \"Guarda el documento activo.\",\n\t\"Saves the active document with a new name.\": \"Guarda el documento activo con un nuevo nombre.\",\n\t\"Changes the page layout.\": \"Cambia la distribución de la página.\",\n\t\"Specifies the default printer setup.\": \"Especifica la configuración de la  impresora predeterminada.\",\n\t\"Prints the active document and sets printing options.\": \"Imprime el documento activo y establece las opciones de impresión.\",\n\t\"Displays full pages.\": \"Muestra páginas enteras.\",\n\t\"Opens this document.\": \"Abre este documento.\",\n\t\"Deletes the selection.\": \"Elimina la selección.\",\n\t\"Erases everything.\": \"Borra todo.\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"Copia la selección y la pone en el Portapapeles.\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"Corta la selección y la pone en el Portapapeles.\",\n\t\"Finds the specified text.\": \"Busca el texto especificado.\",\n\t\"Inserts the contents of the Clipboard.\": \"Inserta el contenido del Portapapeles.\",\n\t\"Repeats the last action.\": \"Repite la última acción.\",\n\t\"Replaces specific text with different text.\": \"Reemplaza un texto determinado con texto diferente.\",\n\t\"Selects everything.\": \"Selecciona todo.\",\n\t\"Undoes the last action.\": \"Deshace la última acción.\",\n\t\"Redoes the previously undone action.\": \"Rehace la acción previamente deshecha.\",\n\t\"Displays program information, version number, and copyright.\": \"Muestra la información del programa, número de versión, y copyright.\",\n\t\"Quits Paint.\": \"Sale de Paint.\",\n\t\"Opens Paint Help.\": \"Abre la Ayuda de Paint.\",\n\t\"Displays instructions about how to use Help.\": \"Muestra instrucciones acerca del uso de la Ayuda.\",\n\t\"Displays Help for areas you click on.\": \"Muestra Ayuda para las áreas en las que haga clic.\",\n\t\"Displays Help for the current task or command.\": \"Muestra Ayuda para la tarea o el comando actual.\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"Centra este mapa de bits como el papel tapiz del escritorio.\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"Pone en mosaico este mapa de bits como papel tapiz del escritorio.\",\n\t\"Sends the selection using mail or fax.\": \"Envía la selección utilizando correo electrónico o fax.\",\n\t\"Prints the selection.\": \"Imprime la selección.\",\n\t\"Shows or hides the thumbnail.\": \"Muestra u oculta vistas en miniatura.\",\n\t\"Shows Paint Help.\": \"Muestra la Ayuda de Paint.\",\n\t\"Shows or hides the status bar.\": \"Muestra u oculta la barra de estado.\",\n\t\"Shows or hides the tool box.\": \"Muestra u oculta el cuadro de herramientas.\",\n\t\"Shows or hides the color box.\": \"Muestra u oculta el cuadro de colores.\",\n\t\"Only a Far East font can be used for vertical editing.\": \"Sólo se puede usar una fuente del Lejano Oriente para edición vertical.\",\n\t\"Changes the window size.\": \"Cambia el tamaño de la ventana.\",\n\t\"Changes the window position.\": \"Cambia la posición de la ventana.\",\n\t\"Reduces the window to an icon.\": \"Reduce la ventana a un icono.\",\n\t\"Enlarges the window to full size.\": \"Amplía la ventana a tamaño completo.\",\n\t\"Switches to the next document window.\": \"Cambia a la siguiente ventana de documento.\",\n\t\"Switches to the previous document window.\": \"Cambia a la anterior ventana de documento.\",\n\t\"Closes the active window and asks if you want to save changes.\": \"Cierra la ventana activa y pregunta si se desea guardar los cambios.\",\n\t\"Restores the window to normal size.\": \"Restaura la ventana a su tamaño normal.\",\n\t\"Activates the task list.\": \"Activa la lista de tareas.\",\n\t\"All Files (*.*)\": \"Todos los archivos (*.*)\",\n\t\"Untitled\": \"Sin título\",\n\t\"an unnamed file\": \"un archivo sin nombre\",\n\t\"&Hide\": \"&Ocultar\",\n\t\"Hide\": \"Ocultar\",\n\t\"No error message is available.\": \"No hay ningún mensaje de error disponible.\",\n\t\"An unsupported operation was attempted.\": \"Intento de realizar una operación incompatible.\",\n\t\"A required resource was unavailable.\": \"No se encuentra disponible un recurso necesario.\",\n\t\"Out of memory.\": \"Memoria insuficiente.\",\n\t\"An unknown error has occurred.\": \"Error desconocido.\",\n\t\"on %1\": \"en %1\",\n\t\"&One Page\": \"&Una página\",\n\t\"One Page\": \"Una página\",\n\t\"&Two Page\": \"&Dos páginas\",\n\t\"Two Page\": \"Dos páginas\",\n\t\"Page %u\": \"Página %u\",\n\t\"Pages %u-%u\": \"Páginas %u-%u\",\n\t\"Output.prn\": \"Salida.prn\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"Archivos de impresora (*.prn)|*.prn|Todos los archivos (*.*)|*.*||\",\n\t\"Print to File\": \"Imprimir a un archivo\",\n\t\"to %1\": \"a %1\",\n\t\"&Update %1\": \"Act&ualizar %1\",\n\t\"Update %1\": \"Actualizar %1\",\n\t\"E&xit && Return to %1\": \"&Salir y regresar a %1\",\n\t\"Exit & Return to %1\": \"Salir y regresar a %1\",\n\t\"Linked %s\": \"%s vinculado\",\n\t\"Unknown Type\": \"Tipo desconocido\",\n\t\"Invalid filename.\": \"Nombre de archivo no válido.\",\n\t\"Failed to open document.\": \"Error al abrir documento.\",\n\t\"Failed to save document.\": \"Error al guardar documento.\",\n\t\"Save changes to %1?\": \"¿Desea guardar los cambios en %1?\",\n\t\"Failed to create empty document.\": \"Error al crear un documento vacío.\",\n\t\"The file is too large to open.\": \"No se puede abrir el archivo porque es demasiado grande.\",\n\t\"Could not start print job.\": \"No se puede iniciar el trabajo de impresión.\",\n\t\"Failed to launch help.\": \"Error al iniciar la Ayuda.\",\n\t\"Internal application error.\": \"Error interno de la aplicación.\",\n\t\"Command failed.\": \"Error al ejecutar comando.\",\n\t\"Insufficient memory to perform operation.\": \"Memoria insuficiente para realizar la operación.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"Se han quitado las entradas del Registro del sistema y se ha eliminado el archivo INI (si existe).\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"No se han quitado todas las entradas del Registro del sistema (o el archivo INI).\",\n\t\"This program requires the file %s, which was not found on this system.\": \"Este programa requiere el archivo %s, que no se encontró en este sistema.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"Este programa está vinculado a la exportación ausente %s en el archivo %s. Es posible que este equipo tenga una versión incompatible de %s.\",\n\t\"Please enter an integer.\": \"Escriba un número entero.\",\n\t\"Please enter a number.\": \"Escriba un número.\",\n\t\"Please enter an integer between %1 and %2.\": \"Escriba un número entero entre  %1 y %2.\",\n\t\"Please enter a number between %1 and %2.\": \"Escriba un número entre %1 y %2.\",\n\t\"Please enter no more than %1 characters.\": \"No escriba más de %1 caracteres.\",\n\t\"Please select a button.\": \"Seleccione un botón.\",\n\t\"Please enter an integer between 0 and 255.\": \"Escriba un número entero entre 0 y 255.\",\n\t\"Please enter a positive integer.\": \"Escriba un número entero positivo.\",\n\t\"Please enter a date and/or time.\": \"Escriba una fecha, una hora o ambas.\",\n\t\"Please enter a currency.\": \"Escriba una moneda.\",\n\t\"Unexpected file format.\": \"Formato de archivo inesperado.\",\n\t\"Cannot find this file.\": \"No se encuentra el archivo.\",\n\t\"Please verify that the correct path and file name are given.\": \"Compruebe si el nombre de archivo y la ruta son correctos.\",\n\t\"Destination disk drive is full.\": \"La unidad de disco de destino está llena.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"No se puede leer %1, está abierto por otra persona.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"No se puede escribir en %1: es de sólo lectura o alguien lo ha abierto.\",\n\t\"An unexpected error occurred while reading %1.\": \"Error inesperado al leer %1.\",\n\t\"An unexpected error occurred while writing %1.\": \"Error inesperado al escribir %1.\",\n\t\"Unable to register document.\": \"No se puede registrar el documento.\",\n\t\"The document may already be open.\": \"Puede que ya esté abierto.\",\n\t\"Update %1 before proceeding?\": \"¿Desea actualizar %1 antes de continuar?\",\n\t\"Could not update client.\": \"No se puede actualizar el cliente.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"Error al registrar. Es posible que las características ActiveX no funcionen correctamente.\",\n\t\"Failed to update the system registry.\": \"Error al actualizar el Registro de sistema.\",\n\t\"Please try using REGEDIT.\": \"Inténtelo utilizando REGEDIT.\",\n\t\"Unable to read write-only property.\": \"No se puede leer la propiedad de sólo escritura.\",\n\t\"Unable to write read-only property.\": \"No se puede escribir la propiedad de sólo lectura.\",\n\t\"Unable to load mail system support.\": \"No se puede cargar sistema de correo.\",\n\t\"Mail system DLL is invalid.\": \"DLL del sistema de correo no válida.\",\n\t\"Send Mail failed to send message.\": \"No se puede enviar el mensaje.\",\n\t\"No error occurred.\": \"Sin errores.\",\n\t\"An unknown error occurred while accessing %1.\": \"Error desconocido al tener acceso a %1.\",\n\t\"%1 was not found.\": \"No se encuentra %1.\",\n\t\"%1 contains an invalid path.\": \"%1 contiene una ruta de acceso no válida.\",\n\t\"%1 could not be opened because there are too many open files.\": \"No se puede abrir %1 porque hay demasiados archivos abiertos.\",\n\t\"Access to %1 was denied.\": \"Se ha denegado el acceso a %1.\",\n\t\"An invalid file handle was associated with %1.\": \"Se asoció con %1 un manipulador de archivo no válido.\",\n\t\"%1 could not be removed because it is the current directory.\": \"No se puede quitar %1 porque es el directorio actual.\",\n\t\"%1 could not be created because the directory is full.\": \"No se puede crear %1 porque el directorio está lleno.\",\n\t\"Seek failed on %1\": \"Error de búsqueda en %1\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"Se ha notificado un error de E/S de hardware al tener acceso a %1.\",\n\t\"A sharing violation occurred while accessing %1.\": \"Infracción de recurso compartido al tener acceso a %1.\",\n\t\"A locking violation occurred while accessing %1.\": \"Infracción de bloqueo al tener acceso a %1.\",\n\t\"Disk full while accessing %1.\": \"El disco se llenó al tener acceso a %1.\",\n\t\"An attempt was made to access %1 past its end.\": \"Intento de acceso a %1 más allá de su término.\",\n\t\"An attempt was made to write to the reading %1.\": \"Se ha intentado escribir en la lectura %1.\",\n\t\"An attempt was made to read from the writing %1.\": \"Se ha intentado leer en la escritura %1.\",\n\t\"%1 has a bad format.\": \"%1 tiene un formato incorrecto.\",\n\t\"%1 contained an unexpected object.\": \"%1 contenía un objeto inesperado.\",\n\t\"%1 contains an incorrect schema.\": \"%1 contiene un esquema incorrecto.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"Selecciona una zona rectangular de la imagen para moverla, copiarla o modificarla.\",\n\t\"Select\": \"Selección\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"Selecciona una zona de forma libre para moverla, copiarla o modificarla.\",\n\t\"Free-Form Select\": \"Selección de forma libre\",\n\t\"Inserts text into the picture.\": \"Inserta texto dentro de la imagen.\",\n\t\"Fills an area with the current drawing color.\": \"Rellena un área con el color del dibujo actual.\",\n\t\"Fill With Color\": \"Relleno con color\",\n\t\"Draws a straight line with the selected line width.\": \"Dibuja una línea recta de la anchura seleccionada.\",\n\t\"Line\": \"Línea\",\n\t\"Draws using an airbrush of the selected size.\": \"Dibuja utilizando un aerógrafo del tamaño seleccionado.\",\n\t\"Airbrush\": \"Aerógrafo\",\n\t\"Draws a curved line with the selected line width.\": \"Dibuja una línea curva de la anchura seleccionada.\",\n\t\"Curve\": \"Curva\",\n\t\"Draws a polygon with the selected fill style.\": \"Dibuja un polígono con el estilo de relleno seleccionado.\",\n\t\"Polygon\": \"Polígono\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"Dibuja un rectángulo de esquinas redondeadas con el estilo de relleno seleccionado.\",\n\t\"Rounded Rectangle\": \"Rectángulo redondeado\",\n\t\"Draws a free-form line one pixel wide.\": \"Dibuja una línea de forma libre de un píxel de ancho.\",\n\t\"Pencil\": \"Lápiz\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"Borra una parte de la imagen utilizando la forma de borrador seleccionada.\",\n\t\"Eraser/Color Eraser\": \"Borrador/Borrador de color\",\n\t\"Changes the magnification.\": \"Cambia la ampliación.\",\n\t\"Magnifier\": \"Ampliación\",\n\t\"Picks up a color from the picture for drawing.\": \"Selecciona un color de la imagen para dibujar.\",\n\t\"Pick Color\": \"Seleccionar color\",\n\t\"Draws using a brush with the selected shape and size.\": \"Dibuja utilizando un pincel de la forma y tamaño seleccionados.\",\n\t\"Brush\": \"Pincel\",\n\t\"Draws a rectangle with the selected fill style.\": \"Dibuja un rectángulo con el estilo de relleno seleccionado.\",\n\t\"Rectangle\": \"Rectángulo\",\n\t\"Draws a filled rectangle.\": \"Dibuja un rectángulo lleno.\",\n\t\"Draws an ellipse with the selected fill style.\": \"Dibuja una elipse con el estilo de relleno seleccionado.\",\n\t\"Ellipse\": \"Elipse\",\n\t\"Draws a filled ellipse.\": \"Dibuja una elipse llena.\",\n\t\"Makes the current selection either opaque or transparent.\": \"Hace la actual selección opaca o transparente.\",\n\t\"Creates a new color.\": \"Crea un nuevo color.\",\n\t\"Uses a previously saved palette of colors.\": \"Utiliza una paleta de colores guardada previamente.\",\n\t\"Saves the current palette of colors to a file.\": \"Guarda en un archivo la paleta de colores actual.\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"Debe guardar el archivo antes de elegirlo como Papel tapiz.\",\n\t\"The selection is now larger than the bitmap.\": \"La selección es ahora más grande que el mapa de bits.\",\n\t\"Would you like the bitmap enlarged?\": \"¿Desea ampliar el mapa de bits?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"La imagen en el portapapeles es mayor  que el mapa de bits.\",\n\t\"The file is not in the correct format.\": \"El archivo no tiene el formato correcto.\",\n\t\"Not enough room to paste text.\": \"Espacio insuficiente para pegar el texto.\",\n\t\"Enlarge the text area and try again.\": \"Amplíe el área de texto y repita la operación.\",\n\t\"Places the text.\": \"Coloca el texto.\"\n});\n"
  },
  {
    "path": "localization/fi/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"fi\", {\n\t\"Attributes\": \"Määritteet\",\n\t\"&Width:\": \"&Leveys:\",\n\t\"Width:\": \"Leveys:\",\n\t\"&Height:\": \"&Korkeus:\",\n\t\"Height:\": \"Korkeus:\",\n\t\"Units\": \"Yksiköt\",\n\t\"&Inches\": \"&tuuma\",\n\t\"Inches\": \"tuuma\",\n\t\"C&m\": \"&cm\",\n\t\"Cm\": \"cm\",\n\t\"&Pixels\": \"ku&vapiste\",\n\t\"Pixels\": \"kuvapiste\",\n\t\"Colors\": \"Värit\",\n\t\"&Black and white\": \"&Mustavalkoinen\",\n\t\"Black and white\": \"Mustavalkoinen\",\n\t\"Co&lors\": \"V&ärit\",\n\t\"Transparency\": \"Kalvo\",\n\t\"Use &Transparent background color\": \"Käytä lä&pinäkyvää taustaväriä\",\n\t\"Use Transparent background color\": \"Käytä läpinäkyvää taustaväriä\",\n\t\"Select &Color\": \"V&alitse väri\",\n\t\"Select Color\": \"Valitse väri\",\n\t\"Cancel\": \"Peruuta\",\n\t\"&Default\": \"&Oletus\",\n\t\"Default\": \"Oletus\",\n\t\"Custom Zoom\": \"Oma zoomaus\",\n\t\"Current zoom:\": \"Nykyinen zoomaus:\",\n\t\"Zoom to\": \"Zoomaa\",\n\t\"&100%\": \"&100 %\",\n\t\"100%\": \"100 %\",\n\t\"&200%\": \"&200 %\",\n\t\"200%\": \"200 %\",\n\t\"&400%\": \"&400 %\",\n\t\"400%\": \"400 %\",\n\t\"&600%\": \"&600 %\",\n\t\"600%\": \"600 %\",\n\t\"&800%\": \"&800 %\",\n\t\"800%\": \"800 %\",\n\t\"Flip and Rotate\": \"Käännä ja kierrä\",\n\t\"Flip or rotate\": \"Kääntäminen tai kiertäminen\",\n\t\"&Flip horizontal\": \"Käännä &vaakasuunnassa\",\n\t\"Flip horizontal\": \"Käännä vaakasuunnassa\",\n\t\"Flip &vertical\": \"Käännä py&stysuunnassa\",\n\t\"Flip vertical\": \"Käännä pystysuunnassa\",\n\t\"&Rotate by angle\": \"&Kierrä kulmassa\",\n\t\"Rotate by angle\": \"Kierrä kulmassa\",\n\t\"Stretch and Skew\": \"Venytä ja viistota\",\n\t\"Stretch\": \"Venytä\",\n\t\"&Horizontal:\": \"Vaa&katasossa:\",\n\t\"Horizontal:\": \"Vaakatasossa:\",\n\t\"&Vertical:\": \"Pys&tytasossa:\",\n\t\"Vertical:\": \"Pystytasossa:\",\n\t\"Skew\": \"Viistota\",\n\t\"H&orizontal:\": \"V&aakatasossa:\",\n\t\"Degrees\": \"astetta\",\n\t\"V&ertical:\": \"Py&stytasossa:\",\n\t\"Color Table\": \"Väritaulukko\",\n\t\"New\": \"Uusi\",\n\t\"&New \": \"&Uusi \",\n\t\"New \": \"Uusi \",\n\t\"&Help\": \"&Ohje\",\n\t\"Help\": \"Ohje\",\n\t\"Printing\": \"Tulostetaan\",\n\t\"on the\": \"porttiin\",\n\t\"&Print\": \"Tul&osta\",\n\t\"Print\": \"Tulosta\",\n\t\"&Next Page\": \"Se&uraava sivu\",\n\t\"Next Page\": \"Seuraava sivu\",\n\t\"Pre&v Page\": \"&Edellinen sivu\",\n\t\"Prev Page\": \"Edellinen sivu\",\n\t\"Zoom &In\": \"&Lähennä\",\n\t\"Zoom In\": \"Lähennä\",\n\t\"Zoom &Out\": \"Loito&nna\",\n\t\"Zoom Out\": \"Loitonna\",\n\t\"&Close\": \"&Sulje\",\n\t\"Close\": \"Sulje\",\n\t\"Grid Settings\": \"Ruudukon asetukset\",\n\t\"&Pixel Grid\": \"&Kuvapisteruudukko\",\n\t\"Pixel Grid\": \"Kuvapisteruudukko\",\n\t\"&Tile Grid\": \"&Vierekkäinen ruudukko\",\n\t\"Tile Grid\": \"Vierekkäinen ruudukko\",\n\t\"pixels\": \"kuvapistettä\",\n\t\"H&eight:\": \"K&orkeus:\",\n\t\"Text\": \"Teksti\",\n\t\"Undo\": \"Kumoa\",\n\t\"Cut\": \"Leikkaa\",\n\t\"Copy\": \"Kopioi\",\n\t\"Paste\": \"Liitä\",\n\t\"Clear Selection\": \"Poista valinta\",\n\t\"Select All\": \"Valitse kaikki\",\n\t\"Text Toolbar\": \"Tekstityökalurivi\",\n\t\"Selection\": \"Valinta\",\n\t\"Cu&t\": \"&Leikkaa\",\n\t\"&Copy\": \"K&opioi\",\n\t\"&Paste\": \"L&iitä\",\n\t\"C&lear Selection\": \"&Poista valinta\",\n\t\"Select &All\": \"V&alitse kaikki\",\n\t\"C&opy To\": \"Kopioi &mihin\",\n\t\"Copy To\": \"Kopioi mihin\",\n\t\"Paste &From\": \"Liitä mi&stä\",\n\t\"Paste From\": \"Liitä mistä\",\n\t\"Flip/&Rotate\": \"&Käännä/kierrä\",\n\t\"Flip/Rotate\": \"Käännä/kierrä\",\n\t\"&Stretch/Skew\": \"&Venytä/viistota\",\n\t\"Stretch/Skew\": \"Venytä/viistota\",\n\t\"&Invert Colors\": \"Kää&nteiset värit\",\n\t\"Invert Colors\": \"Käänteiset värit\",\n\t\"Thumbnail\": \"Pikkukuva\",\n\t\"&File\": \"&Tiedosto\",\n\t\"File\": \"Tiedosto\",\n\t\"&New\": \"&Uusi\",\n\t\"&Open\": \"&Avaa\",\n\t\"Open\": \"Avaa\",\n\t\"&Save\": \"&Tallenna\",\n\t\"Save\": \"Tallenna\",\n\t\"Save &As\": \"Talle&nna nimellä\",\n\t\"Save As\": \"Tallenna nimellä\",\n\t\"Print Pre&view\": \"&Esikatselu\",\n\t\"Print Preview\": \"Esikatselu\",\n\t\"Page Se&tup\": \"&Sivun asetukset\",\n\t\"Page Setup\": \"Sivun asetukset\",\n\t\"S&end\": \"L&ähetä\",\n\t\"Send\": \"Lähetä\",\n\t\"Set As &Wallpaper (Tiled)\": \"Aseta taustakuvaksi (&vierekkäin)\",\n\t\"Set As Wallpaper (Tiled)\": \"Aseta taustakuvaksi (vierekkäin)\",\n\t\"Set As Wa&llpaper (Centered)\": \"Aseta taustakuvaksi (kesk&itetty)\",\n\t\"Set As Wallpaper (Centered)\": \"Aseta taustakuvaksi (keskitetty)\",\n\t\"Recent File\": \"Viimeisin tiedosto\",\n\t\"E&xit\": \"&Lopeta\",\n\t\"Exit\": \"Lopeta\",\n\t\"&Edit\": \"&Muokkaa\",\n\t\"Edit\": \"Muokkaa\",\n\t\"&Undo\": \"&Kumoa\",\n\t\"&Repeat\": \"&Tee uudelleen\",\n\t\"Repeat\": \"Tee uudelleen\",\n\t\"&View\": \"&Näytä\",\n\t\"View\": \"Näytä\",\n\t\"&Tool Box\": \"T&yökaluryhmä\",\n\t\"Tool Box\": \"Työkaluryhmä\",\n\t\"&Color Box\": \"&Värivalikoima\",\n\t\"Color Box\": \"Värivalikoima\",\n\t\"&Status Bar\": \"&Tilarivi\",\n\t\"Status Bar\": \"Tilarivi\",\n\t\"T&ext Toolbar\": \"T&ekstityökalurivi\",\n\t\"&Zoom\": \"&Zoomaa\",\n\t\"Zoom\": \"Zoomaa\",\n\t\"&Normal Size\": \"&Normaali koko\",\n\t\"Normal Size\": \"Normaali koko\",\n\t\"&Large Size\": \"&Suuri koko\",\n\t\"Large Size\": \"Suuri koko\",\n\t\"C&ustom\": \"&Mukauta\",\n\t\"Custom\": \"Mukauta\",\n\t\"Show &Grid\": \"N&äytä ruudukko\",\n\t\"Show Grid\": \"Näytä ruudukko\",\n\t\"Show T&humbnail\": \"Näytä &pikkukuva\",\n\t\"Show Thumbnail\": \"Näytä pikkukuva\",\n\t\"&View Bitmap\": \"&Näytä bittikartta\",\n\t\"View Bitmap\": \"Näytä bittikartta\",\n\t\"&Image\": \"&Kuva\",\n\t\"Image\": \"Kuva\",\n\t\"&Flip/Rotate\": \"&Käännä/kierrä\",\n\t\"&Attributes\": \"&Määritteet\",\n\t\"&Clear Image\": \"Poi&sta kuva\",\n\t\"Clear Image\": \"Poista kuva\",\n\t\"Ctrl+Shft+N\": \"Ctrl+Vaihto+N\",\n\t\"&Draw Opaque\": \"&Piirrä peittäen\",\n\t\"Draw Opaque\": \"Piirrä peittäen\",\n\t\"&Colors\": \"&Värit\",\n\t\"&Edit Colors\": \"&Muokkaa värit\",\n\t\"Edit Colors\": \"Muokkaa värit\",\n\t\"&Help Topics\": \"&Ohjeen aiheet\",\n\t\"Help Topics\": \"Ohjeen aiheet\",\n\t\"&About Paint\": \"&Tietoja Paintista\",\n\t\"About Paint\": \"Tietoja Paintista\",\n\t\"&Update\": \"&Päivitä\",\n\t\"Update\": \"Päivitä\",\n\t\"Save Copy &As\": \"T&allenna kopio nimellä\",\n\t\"Save Copy As\": \"Tallenna kopio nimellä\",\n\t\"untitled\": \"nimetön\",\n\t\"Bitmap Image\": \"Bittikartta\",\n\t\"Bitmap Files (*.bmp)\": \"Bittikarttatiedostot (*.bmp)\",\n\t\"PCX Files\": \"PCX-tiedostot\",\n\t\"Icon Files\": \"Kuvaketiedostot\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"Yksivärinen bittikartta (*.bmp;*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"16-värinen bittikartta (*.bmp;*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"256-värinen bittikartta (*.bmp;*.dib)\",\n\t\"Paint cannot open this file.\": \"Paint ei voi avata tätä tiedostoa.\",\n\t\"Paint cannot read this file.\": \"Paint ei voi lukea tätä tiedostoa.\",\n\t\"This file is read-only.\": \"Tämä tiedosto on vain luku -tyyppiä.\",\n\t\"To save your changes, use a different filename.\": \"Tallenna muutokset toisella tiedostonimellä.\",\n\t\"This file is already open.\": \"Tiedosto on jo avoinna.\",\n\t\"This is not a valid .PCS file.\": \"Tämä ei ole kelvollinen .PCS-tiedosto.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"Tiedosto on avoinna muokkausta varten eikä sitä voi korvata.\",\n\t\"Use a different filename to save your changes.\": \"Tallenna muutokset toisella tiedostonimellä.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"Tämä ei ole kelvollinen bittikarttatiedosto tai sen muotoa ei tueta.\",\n\t\"This is not a valid icon.\": \"Tämä ei ole kelvollinen kuvake.\",\n\t\"This is not a valid cursor.\": \"Tämä ei ole kelvollinen kohdistin.\",\n\t\"Save was interrupted, so your file has not been saved.\": \"Tallentaminen keskeytetty. Tiedostoa ei ole tallennettu.\",\n\t\"You cannot save to a read-only file.\": \"Vain luku -tiedostoon ei voi tallentaa.\",\n\t\"Use a different file name.\": \"Käytä toista tiedostonimeä.\",\n\t\"This file is already in use.\": \"Tiedosto on jo käytössä.\",\n\t\"Close the program, and then try again.\": \"Sulje ohjelma ja yritä uudelleen.\",\n\t\"Paint cannot save this file.\": \"Paint ei voi tallentaa tätä tiedostoa.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"Paint ei voi tallentaa samalla tiedostonimellä eri tiedostotyyppiä.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"Ruudukon välin on oltava kokonaisluku %d - %d.\",\n\t\"There is not enough memory or resources to complete operation.\": \"Liian vähän muistia tai resursseja tämän toiminnon suorittamiseksi.\",\n\t\"Close some programs, and then try again.\": \"Sulje ohjelmia ja yritä uudelleen.\",\n\t\"Low on memory or resources.\": \"Vähän muistia ja resursseja.\",\n\t\"Group error.\": \"Ryhmävirhe.\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"Paint ei pystynyt tulostamaan asiakirjaasi. Varmista että Sinulla on riittävästi kiintolevytilaa ja että kirjoittimesi toimii oikein.\",\n\t\"Saving into this format may cause some loss of color information.\": \"Tähän muotoon tallentaminen voi aiheuttaa joidenkin väritietojen menettämisen.\",\n\t\"Do you want to continue?\": \" Jatketaanko?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"Muuntamista mustavalkoiseksi ei voi kumota. Tämä toiminto vaikuttaa nykyiseen tiedostoon ja voi aiheuttaa väritietojen häviämistä.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"Bittikartassa on oltava enemmän kuin yksi kuvapiste.\",\n\t\"Generic error.\": \"Yleisvirhe.\",\n\t\"File not found.\": \"Tiedostoa ei löydy.\",\n\t\"Bad path.\": \"Polku ei ole kelvollinen.\",\n\t\"Too many open files.\": \"Liian monta avointa tiedostoa.\",\n\t\"Access denied.\": \"Käyttö estetty.\",\n\t\"Invalid file.\": \"Tiedosto ei ole kelvollinen.\",\n\t\"Remove current folder.\": \"Poista nykyinen kansio.\",\n\t\"Folder full.\": \"Kansio on täynnä.\",\n\t\"Bad seek.\": \"Etsintä ei ole kelvollinen.\",\n\t\"Hard IO error.\": \"Laitteiston IO-virhe.\",\n\t\"Sharing violation.\": \"Yhteiskäyttövirhe.\",\n\t\"Lock violation.\": \"Lukitusvirhe.\",\n\t\"Disk full.\": \"Levy on täynnä.\",\n\t\"End of file.\": \"Tiedoston loppu.\",\n\t\"Error getting the Clipboard Data!\": \"Virhe Leikepöydän tietojen saamisessa.\",\n\t\"No Printer Found @ page setup\": \"Kirjoitinta ei löydy @ sivun asetuksilla\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"24-bittinen bittikartta (*.bmp;*.dib)\",\n\t\"All Files\": \"Kaikki tiedostot\",\n\t\"Palette|*.pal|\": \"Valikoima|*.pal|\",\n\t\"untitled.pal\": \"nimetön.pal\",\n\t\"OLE 2.0 was unable to start.\": \"OLE:a ei voi käynnistää.\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"Varmista, että käytät oikeita versioita OLE-kirjastoista.\",\n\t\"Resets the text be without any attributes.\": \"Poistaa tekstin kaikki määritteet.\",\n\t\"Sets or clears the text bold attribute.\": \"Asettaa tai poistaa tekstin lihavointi -määritteen.\",\n\t\"Sets or clears the text italic attribute.\": \"Asettaa tai poistaa tekstin kursivointi -määritteen.\",\n\t\"Selects the font used by the text.\": \"Valitsee tekstin käyttämän fontin.\",\n\t\"Selects the point size of the text.\": \"Valitsee tekstin pistekoon.\",\n\t\"Sets or clears the text underline attribute.\": \"Asettaa tai poistaa tekstin alleviivaus -määritteen.\",\n\t\"Shows or hides the tooltips.\": \"Näyttää tai piilottaa työkaluvihjeet.\",\n\t\"Show Paint Help.\": \"Näyttää Paintin Ohjeen.\",\n\t\"Sends a picture by using mail or fax.\": \"Lähettää kuvan sähköpostina tai faksilla.\",\n\t\"Copies the selection to a file.\": \"Kopioi valinnan tiedostoon.\",\n\t\"Pastes a file into the selection.\": \"Liittää tiedoston valintaan.\",\n\t\"Zooms the picture to 100%.\": \"Zoomaa kuvan 100 %:n kokoon.\",\n\t\"Zooms the picture to 400%.\": \"Zoomaa kuva 400 %:n kokoon.\",\n\t\"Zooms the picture.\": \"Zoomaa kuvan.\",\n\t\"Displays the entire picture.\": \"Näyttää koko kuvan.\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"Näyttää tai piilottaa pikkukuvan.\",\n\t\"Shows or hides the grid.\": \"Näyttää tai piilottaa ruudukon.\",\n\t\"Shows or hides the text toolbar.\": \"Näyttää tai piilottaa tekstityökalurivin.\",\n\t\"Flips or rotates the picture or a selection.\": \"Kääntää tai kiertää kuvaa tai valintaa.\",\n\t\"Stretches or skews the picture or a selection.\": \"Venyttää tai viistottaa kuvaa tai valintaa.\",\n\t\"Inverts the colors of the picture or a selection.\": \"Muuttaa kuvan tai valinnan värit käänteisiksi.\",\n\t\"Changes the attributes of the picture.\": \"Muuttaa kuvan määritteitä.\",\n\t\"Clears the picture or selection.\": \"Poistaa kuvan tai valinnan.\",\n\t\"The font size must be a numeric value.\": \"Fonttikoon on oltava luku.\",\n\t\"Contains commands for working with the selected item(s).\": \"Komennot, joilla käsitellään valittua kohdetta.\",\n\t\"Contains commands for selecting and transferring items.\": \"Komennot, joilla valitaan ja siirretään kohteita.\",\n\t\"Contains commands for customizing this window.\": \"Komennot, joilla mukautetaan tätä ikkunaa.\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"Komennot, joilla muokataan kuvia ja muutetaan määritteitä.\",\n\t\"Contains commands for using custom colors and drawing options.\": \"Komennot, joilla käytetään mukautettuja värejä ja piirtoasetuksia.\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"Komennot, joilla näytetään Ohje ja tietoja Paintista.\",\n\t\"Cannot save file.\": \"Tiedostoa ei voi tallentaa.\",\n\t\"Error removing temporary file.\": \"Virhe poistettaessa tilapäistiedostoa.\",\n\t\"Get Colors\": \"Hae värit\",\n\t\"Save Colors\": \"Tallenna värit\",\n\t\"File last saved:\": \"Viimeisin tallennus:\",\n\t\"Not Available\": \"Ei tietoa\",\n\t\"Size on disk:\": \"Koko levylle tallennettuna:\",\n\t\"%s bytes\": \"%s tavua\",\n\t\"Painting\": \"Maalaus\",\n\t\"Fonts\": \"Fontit\",\n\t\"Tools\": \"Työkalut\",\n\t\"All Picture Files\": \"Kaikki kuvatiedostot\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"Valitse Ohjeen aiheet Ohje-valikosta, jos haluat lisätietoja.\",\n\t\"Select an area on which to get Help.\": \"Valitse alue, josta haluat Ohjeita\",\n\t\"%1 in %2\": \"%1 kohteessa %2\",\n\t\"Creates a new document.\": \"Luo uuden tiedoston.\",\n\t\"Opens an existing document.\": \"Avaa aiemmin luodun tiedoston.\",\n\t\"Closes the active document.\": \"Sulkee aktiivisen tiedoston.\",\n\t\"Saves the active document.\": \"Tallentaa aktiivisen tiedoston.\",\n\t\"Saves the active document with a new name.\": \"Tallentaa aktiivisen tiedoston uudella nimellä.\",\n\t\"Changes the page layout.\": \"Muuttaa sivun asettelua.\",\n\t\"Specifies the default printer setup.\": \"Määrittää kirjoittimen oletusasetukset.\",\n\t\"Prints the active document and sets printing options.\": \"Tulostaa aktiivisen tiedoston ja asettaa tulostusasetukset.\",\n\t\"Displays full pages.\": \"Näyttää koko sivun.\",\n\t\"Opens this document.\": \"Avaa tämän tiedoston.\",\n\t\"Deletes the selection.\": \"Poistaa valinnan.\",\n\t\"Erases everything.\": \"Pyyhkii kaiken.\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"Kopioi valinnan ja sijoittaa sen Leikepöydälle\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"Leikkaa valinnan ja sijoittaa sen Leikepöydälle.\",\n\t\"Finds the specified text.\": \"Etsii määritetyn tekstin.\",\n\t\"Inserts the contents of the Clipboard.\": \"Lisää Leikepöydän sisällön.\",\n\t\"Repeats the last action.\": \"Toistaa viimeisimmän toiminnon.\",\n\t\"Replaces specific text with different text.\": \"Korvaa määritetyn tekstin toisella tekstillä.\",\n\t\"Selects everything.\": \"Valitsee kaiken.\",\n\t\"Undoes the last action.\": \"Kumoaa viimeisimmän toiminnon.\",\n\t\"Redoes the previously undone action.\": \"Tekee uudelleen aikaisemmin kumotun toiminnon.\",\n\t\"Displays program information, version number, and copyright.\": \"Näyttää tietoja ohjelmasta, versionumeron ja tekijänoikeustiedot.\",\n\t\"Quits Paint.\": \"Lopettaa Paintin.\",\n\t\"Opens Paint Help.\": \"Avaa Paintin Ohjeen.\",\n\t\"Displays instructions about how to use Help.\": \"Näyttää tietoja Ohjeen käyttämisestä.\",\n\t\"Displays Help for areas you click on.\": \"Näyttää Ohjeen valitsemastasi alueesta.\",\n\t\"Displays Help for the current task or command.\": \"Näyttää Ohjeen nykyisestä tehtävästä tai komennosta.\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"Keskittää tämän bittikartan työpöydän taustakuvaksi.\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"Asettaa tämän bittikartan vierekkäiseksi työpöydän taustakuvaksi.\",\n\t\"Sends the selection using mail or fax.\": \"Lähettää valinnan sähköpostina tai faksilla.\",\n\t\"Prints the selection.\": \"Tulostaa valinnan.\",\n\t\"Shows or hides the thumbnail.\": \"Näyttää tai piilottaa pikkukuvan.\",\n\t\"Shows Paint Help.\": \"Näyttää Paintin Ohjeen.\",\n\t\"Shows or hides the status bar.\": \"Näyttää tai piilottaa tilarivin.\",\n\t\"Shows or hides the tool box.\": \"Näyttää tai piilottaa työkaluruudun.\",\n\t\"Shows or hides the color box.\": \"Näyttää tai piilottaa väriruudun.\",\n\t\"Only a Far East font can be used for vertical editing.\": \"Vain Far East -fonttia voidaan käyttää pystysuoraan muokkaukseen.\",\n\t\"Changes the window size.\": \"Muuttaa ikkunan kokoa.\",\n\t\"Changes the window position.\": \"Muuttaa ikkunan paikkaa.\",\n\t\"Reduces the window to an icon.\": \"Pienentää ikkunan kuvakkeeksi.\",\n\t\"Enlarges the window to full size.\": \"Suurentaa ikkunan täyteen kokoon.\",\n\t\"Switches to the next document window.\": \"Vaihtaa seuraavaan tiedostoikkunaan.\",\n\t\"Switches to the previous document window.\": \"Vaihtaa edelliseen tiedostoikkunaan.\",\n\t\"Closes the active window and asks if you want to save changes.\": \"Sulkee aktiivisen ikkunan ja pyytää tallentamaan muutokset.\",\n\t\"Restores the window to normal size.\": \"Palauttaa ikkunan normaaliin kokoon.\",\n\t\"Activates the task list.\": \"Aktivoi tehtäväluettelon.\",\n\t\"All Files (*.*)\": \"Kaikki tiedostot (*.*)\",\n\t\"Untitled\": \"Nimetön\",\n\t\"an unnamed file\": \"Nimeämätön tiedosto\",\n\t\"&Hide\": \"&Piilota\",\n\t\"Hide\": \"Piilota\",\n\t\"No error message is available.\": \"Virhesanomaa ei ole käytettävissä.\",\n\t\"An unsupported operation was attempted.\": \"Yritettiin suorittaa  toiminto, jota ei tueta.\",\n\t\"A required resource was unavailable.\": \"Tarvittava resurssi ei ole käytettävissä.\",\n\t\"Out of memory.\": \"Muisti ei riitä.\",\n\t\"An unknown error has occurred.\": \"Tuntematon virhe.\",\n\t\"on %1\": \"kohteessa %1\",\n\t\"&One Page\": \"&Yksi sivu\",\n\t\"One Page\": \"Yksi sivu\",\n\t\"&Two Page\": \"&Kaksi sivua\",\n\t\"Two Page\": \"Kaksi sivua\",\n\t\"Page %u\": \"Sivu %u\",\n\t\"Pages %u-%u\": \"Sivut %u-%u\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"Kirjoitintiedostot (*.prn)|*.prn|Kaikki tiedostot (*.*)|*.*||\",\n\t\"Print to File\": \"Tulosta tiedostoon\",\n\t\"to %1\": \"tiedostoon %1\",\n\t\"&Update %1\": \"&Päivitä %1\",\n\t\"Update %1\": \"Päivitä %1\",\n\t\"E&xit && Return to %1\": \"&Lopeta ja palaa kohteeseen %1\",\n\t\"Exit & Return to %1\": \"Lopeta ja palaa kohteeseen %1\",\n\t\"Linked %s\": \"Linkitetty %s\",\n\t\"Unknown Type\": \"Tuntematon tyyppi\",\n\t\"Invalid filename.\": \"Tiedostonimi ei kelpaa.\",\n\t\"Failed to open document.\": \"Tiedoston avaaminen epäonnistui.\",\n\t\"Failed to save document.\": \"Tiedoston tallentaminen epäonnistui.\",\n\t\"Save changes to %1?\": \"Tallennetaanko tiedoston %1 muutokset?\",\n\t\"Failed to create empty document.\": \"Tyhjän tiedoston luominen epäonnistui.\",\n\t\"The file is too large to open.\": \"Tiedosto on liian suuri avattavaksi.\",\n\t\"Could not start print job.\": \"Tulostustyötä ei voi aloittaa.\",\n\t\"Failed to launch help.\": \"Ohjeen käynnistäminen epäonnistui.\",\n\t\"Internal application error.\": \"Sisäinen sovellusvirhe.\",\n\t\"Command failed.\": \"Komento epäonnistui.\",\n\t\"Insufficient memory to perform operation.\": \"Liian vähän muistia toiminnon suorittamiseen.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"Järjestelmän rekisteritietueet ja mahdollinen INI -tiedosto on poistettu.\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"Kaikkia järjestelmän rekisteritietueita tai INI -tiedostoa ei ole poistettu.\",\n\t\"This program requires the file %s, which was not found on this system.\": \"Ohjelman vaatimaa tiedostoa %s ei löytynyt järjestelmästä.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"Ohjelma on yhdistetty puuttuvaan vientiin %s tiedostossa %s. Tietokoneen versio %s voi olla yhteensopimaton.\",\n\t\"Please enter an integer.\": \"Anna kokonaisluku.\",\n\t\"Please enter a number.\": \"Anna luku.\",\n\t\"Please enter an integer between %1 and %2.\": \"Anna kokonaisluku %1 - %2.\",\n\t\"Please enter a number between %1 and %2.\": \"Anna luku %1 - %2.\",\n\t\"Please enter no more than %1 characters.\": \"Anna enintään %1 merkkiä.\",\n\t\"Please select a button.\": \"Valitse painike.\",\n\t\"Please enter an integer between 0 and 255.\": \"Anna kokonaisluku 0 - 255.\",\n\t\"Please enter a positive integer.\": \"Anna positiivinen kokonaisluku.\",\n\t\"Please enter a date and/or time.\": \"Anna päivämäärä tai aika.\",\n\t\"Please enter a currency.\": \"Anna valuutta.\",\n\t\"Unexpected file format.\": \"Odottamaton tiedostomuoto.\",\n\t\"Cannot find this file.\": \"Tiedostoa ei löydy.\",\n\t\"Please verify that the correct path and file name are given.\": \"Varmista, että polku ja tiedostonimi ovat oikein.\",\n\t\"Destination disk drive is full.\": \"Kohdelevyasema on täynnä.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"Tiedostoa %1 ei voi lukea, koska joku toinen on avannut sen.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"Tiedostoon %1 ei voi kirjoittaa, koska se on vain luku -tyyppiä tai joku toinen on avannut sen.\",\n\t\"An unexpected error occurred while reading %1.\": \"Odottamaton virhe luettaessa tiedostoa %1.\",\n\t\"An unexpected error occurred while writing %1.\": \"Odottamaton virhe kirjoitettaessa tiedostoon %1.\",\n\t\"Unable to register document.\": \"Tiedostoa ei voi rekisteröidä.\",\n\t\"The document may already be open.\": \"Tiedosto voi olla jo avoinna.\",\n\t\"Update %1 before proceeding?\": \"Päivitetäänkö %1 ennen jatkamista?\",\n\t\"Could not update client.\": \"Asiakasta ei voi päivittää.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"Rekisteröinti epäonnistui. ActiveX-ominaisuudet eivät ehkä toimi oikein.\",\n\t\"Failed to update the system registry.\": \"Järjestelmärekisteriä ei voitu päivittää.\",\n\t\"Please try using REGEDIT.\": \"Yritä uudelleen käyttämällä Regedit-ohjelmaa.\",\n\t\"Unable to read write-only property.\": \"Vain kirjoitus -ominaisuutta ei voi lukea.\",\n\t\"Unable to write read-only property.\": \"Vain luku -ominaisuuteen ei voi kirjoittaa.\",\n\t\"Unable to load mail system support.\": \"Sähköpostijärjestelmän tukea ei voi ladata.\",\n\t\"Mail system DLL is invalid.\": \"Sähköpostijärjestelmän DLL ei kelpaa.\",\n\t\"Send Mail failed to send message.\": \"Sähköpostin lähettäminen ei onnistu.\",\n\t\"No error occurred.\": \"Ei virheitä.\",\n\t\"An unknown error occurred while accessing %1.\": \"Tuntematon virhe  käytettäessä: %1.\",\n\t\"%1 was not found.\": \"%1 ei löydy.\",\n\t\"%1 contains an invalid path.\": \"%1 sisältää epäkelvon polun.\",\n\t\"%1 could not be opened because there are too many open files.\": \"Tiedostoa %1 ei voi avata, koska avoimia tiedostoja on liikaa.\",\n\t\"Access to %1 was denied.\": \"Kohteen %1 käyttö estetty.\",\n\t\"An invalid file handle was associated with %1.\": \"Kohteeseen %1 liitetty epäkelpo tiedostokahva.\",\n\t\"%1 could not be removed because it is the current directory.\": \"Hakemistoa %1 ei voida poistaa, koska se on nykyinen hakemisto.\",\n\t\"%1 could not be created because the directory is full.\": \"%1 ei voi luoda, koska hakemisto on täynnä.\",\n\t\"Seek failed on %1\": \"Etsintä hakemistossa %1 epäonnistui\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"Laitteiston I/O-virhe käsiteltäessä kohdetta %1.\",\n\t\"A sharing violation occurred while accessing %1.\": \"Yhteiskäyttövirhe käytettäessä kohdetta %1.\",\n\t\"A locking violation occurred while accessing %1.\": \"Lukitusvirhe käytettäessä kohdetta %1.\",\n\t\"Disk full while accessing %1.\": \"Levyn täyttyminen käytettäessä kohdetta %1.\",\n\t\"An attempt was made to access %1 past its end.\": \"Yritys käyttää kohdetta %1 sen lopun jälkeen.\",\n\t\"An attempt was made to write to the reading %1.\": \"Yritys kirjoittaa luettavaan kohteeseen %1.\",\n\t\"An attempt was made to read from the writing %1.\": \"Yritys lukea kirjoitettavaan kohteesta %1.\",\n\t\"%1 has a bad format.\": \"%1 on väärää muotoa.\",\n\t\"%1 contained an unexpected object.\": \"%1 sisältää odottamattoman objektin.\",\n\t\"%1 contains an incorrect schema.\": \"%1 sisältää väärän mallin.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"Valitsee suorakulmion muotoisen kuvan osan siirrettäväksi, kopioitavaksi tai muokattavaksi.\",\n\t\"Select\": \"Valinta\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"Valitsee vapaamuotoisen alueen siirrettäväksi, kopioitavaksi tai muokattavaksi.\",\n\t\"Free-Form Select\": \"Vapaa valinta\",\n\t\"Inserts text into the picture.\": \"Liittää tekstin kuvaan.\",\n\t\"Fills an area with the current drawing color.\": \"Täyttää alueen nykyisellä piirtovärillä.\",\n\t\"Fill With Color\": \"Täytä värillä\",\n\t\"Draws a straight line with the selected line width.\": \"Piirtää valitun levyisen suoran viivan.\",\n\t\"Line\": \"Viiva\",\n\t\"Draws using an airbrush of the selected size.\": \"Piirtää valitun kokoisella ruiskulla.\",\n\t\"Airbrush\": \"Ruisku\",\n\t\"Draws a curved line with the selected line width.\": \"Piirtää valitun levyisen käyrän viivan.\",\n\t\"Curve\": \"Käyrä\",\n\t\"Draws a polygon with the selected fill style.\": \"Piirtää valitun värisen täytetyn monikulmion.\",\n\t\"Polygon\": \"Monikulmio\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"Piirtää pyöristetyn suorakulmion käyttäen valittua täyttötyyliä.\",\n\t\"Rounded Rectangle\": \"Pyöristetty suorakulmio\",\n\t\"Draws a free-form line one pixel wide.\": \"Piirtää yhden kuvapisteen levyisen vapaan viivan.\",\n\t\"Pencil\": \"Kynä\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"Pyyhkii osan kuvasta käyttäen valittua pyyhkimen muotoa.\",\n\t\"Eraser/Color Eraser\": \"Pyyhin\",\n\t\"Changes the magnification.\": \"Muuttaa suurennusta.\",\n\t\"Magnifier\": \"Suurennus\",\n\t\"Picks up a color from the picture for drawing.\": \"Valitsee piirrettävän kuvan värin.\",\n\t\"Pick Color\": \"Värin valinta\",\n\t\"Draws using a brush with the selected shape and size.\": \"Piirtää käyttäen valitun muotoista ja kokoista sivellintä.\",\n\t\"Brush\": \"Sivellin\",\n\t\"Draws a rectangle with the selected fill style.\": \"Piirtää suorakulmion käyttäen valittua täyttötyyliä.\",\n\t\"Rectangle\": \"Suorakulmio\",\n\t\"Draws a filled rectangle.\": \"Piirtää täytetyn suorakulmion.\",\n\t\"Draws an ellipse with the selected fill style.\": \"Piirtää ellipsin käyttäen valittua täyttötyyliä.\",\n\t\"Ellipse\": \"Ellipsi\",\n\t\"Draws a filled ellipse.\": \"Piirtää täytetyn ellipsin.\",\n\t\"Makes the current selection either opaque or transparent.\": \"Tekee nykyisestä valinnasta joko peittävän tai läpinäkyvän.\",\n\t\"Creates a new color.\": \"Luo uuden piirtovärin.\",\n\t\"Uses a previously saved palette of colors.\": \"Käyttää aikaisemmin tallennettua värivalikoimaa.\",\n\t\"Saves the current palette of colors to a file.\": \"Tallentaa nykyisen värivalikoiman tiedostoon.\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"Tallenna tiedosto ennen sen valitsemista taustakuvaksi.\",\n\t\"The selection is now larger than the bitmap.\": \"Valinta on nyt suurempi kuin bittikartta.\",\n\t\"Would you like the bitmap enlarged?\": \"Haluatko suurentaa bittikarttaa?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"Leikepöydän kuva on suurempi kuin bittikartta.\",\n\t\"The file is not in the correct format.\": \"Tiedosto ei ole oikeassa muodossa.\",\n\t\"Not enough room to paste text.\": \"Liian vähän tilaa tekstin liittämiseen.\",\n\t\"Enlarge the text area and try again.\": \"Suurenna tekstialuetta ja yritä uudelleen.\",\n\t\"Places the text.\": \"Sijoittaa tekstin.\"\n});\n"
  },
  {
    "path": "localization/fr/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"fr\", {\n\t\"Attributes\": \"Attributs\",\n\t\"&Width:\": \"&Largeur :\",\n\t\"Width:\": \"Largeur :\",\n\t\"&Height:\": \"&Hauteur :\",\n\t\"Height:\": \"Hauteur :\",\n\t\"Units\": \"Unités\",\n\t\"&Inches\": \"&Pouces\",\n\t\"Inches\": \"Pouces\",\n\t\"&Pixels\": \"Pi&xels\",\n\t\"Pixels\": \"Pixels\",\n\t\"Colors\": \"Couleurs\",\n\t\"&Black and white\": \"&Noir et blanc\",\n\t\"Black and white\": \"Noir et blanc\",\n\t\"Co&lors\": \"C&ouleurs\",\n\t\"Transparency\": \"Transparence\",\n\t\"Use &Transparent background color\": \"Utiliser une couleur de fond &transparente\",\n\t\"Use Transparent background color\": \"Utiliser une couleur de fond transparente\",\n\t\"Select &Color\": \"Choisir la &couleur\",\n\t\"Select Color\": \"Sélection d'une couleur\",\n\t\"Cancel\": \"Annuler\",\n\t\"&Default\": \"Par &défaut\",\n\t\"Default\": \"Par défaut\",\n\t\"Custom Zoom\": \"Zoom personnalisé\",\n\t\"Current zoom:\": \"Zoom actuel :\",\n\t\"Zoom to\": \"Faire un zoom de\",\n\t\"Flip and Rotate\": \"Retourner et faire pivoter\",\n\t\"Flip or rotate\": \"Retourner ou faire pivoter\",\n\t\"&Flip horizontal\": \"Retourner &horizontalement\",\n\t\"Flip horizontal\": \"Retourner horizontalement\",\n\t\"Flip &vertical\": \"Retourner &verticalement\",\n\t\"Flip vertical\": \"Retourner verticalement\",\n\t\"&Rotate by angle\": \"&Faire pivoter d'un angle de\",\n\t\"Rotate by angle\": \"Faire pivoter d'un angle de\",\n\t\"Stretch and Skew\": \"Étirer et incliner\",\n\t\"Stretch\": \"Étirement\",\n\t\"&Horizontal:\": \"&Horizontal :\",\n\t\"Horizontal:\": \"Horizontal :\",\n\t\"&Vertical:\": \"V&ertical :\",\n\t\"Vertical:\": \"Vertical :\",\n\t\"Skew\": \"Inclinaison\",\n\t\"H&orizontal:\": \"H&orizontale :\",\n\t\"Degrees\": \"degrés\",\n\t\"V&ertical:\": \"Ve&rticale :\",\n\t\"Color Table\": \"Table des couleurs\",\n\t\"New\": \"Nouveau\",\n\t\"&New \": \"&Nouveau \",\n\t\"New \": \"Nouveau \",\n\t\"&Help\": \"&Aide\",\n\t\"Help\": \"Aide\",\n\t\"Printing\": \"Impression en cours\",\n\t\"on the\": \"sur le\",\n\t\"&Print\": \"&Imprimer\",\n\t\"Print\": \"Imprimer\",\n\t\"&Next Page\": \"Page &suiv.\",\n\t\"Next Page\": \"Page suiv.\",\n\t\"Pre&v Page\": \"Page &préc.\",\n\t\"Prev Page\": \"Page préc.\",\n\t\"Zoom &In\": \"Zoom a&vant\",\n\t\"Zoom In\": \"Zoom avant\",\n\t\"Zoom &Out\": \"Zoom a&rrière\",\n\t\"Zoom Out\": \"Zoom arrière\",\n\t\"&Close\": \"&Fermer\",\n\t\"Close\": \"Fermer\",\n\t\"Grid Settings\": \"Paramètres de la grille\",\n\t\"&Pixel Grid\": \"Grille de &pixels\",\n\t\"Pixel Grid\": \"Grille de pixels\",\n\t\"&Tile Grid\": \"Grille &mosaïque\",\n\t\"Tile Grid\": \"Grille mosaïque\",\n\t\"H&eight:\": \"&Hauteur :\",\n\t\"Text\": \"Texte\",\n\t\"Undo\": \"Annuler\",\n\t\"Cut\": \"Couper\",\n\t\"Copy\": \"Copier\",\n\t\"Paste\": \"Coller\",\n\t\"Clear Selection\": \"Effacer la sélection\",\n\t\"Select All\": \"Sélectionner tout\",\n\t\"Text Toolbar\": \"Barre d'outils texte\",\n\t\"Selection\": \"Sélection\",\n\t\"Cu&t\": \"&Couper\",\n\t\"&Copy\": \"Co&pier\",\n\t\"&Paste\": \"C&oller\",\n\t\"C&lear Selection\": \"&Effacer la sélection\",\n\t\"Select &All\": \"Sélectionner &tout\",\n\t\"C&opy To\": \"Copier &vers\",\n\t\"Copy To\": \"Copier dans\",\n\t\"Paste &From\": \"Coller à partir &de\",\n\t\"Paste From\": \"Coller à partir de\",\n\t\"Flip/&Rotate\": \"&Retourner/Faire pivoter\",\n\t\"Flip/Rotate\": \"Retourner/Faire pivoter\",\n\t\"&Stretch/Skew\": \"Étirer/I&ncliner\",\n\t\"Stretch/Skew\": \"Étirer/Incliner\",\n\t\"&Invert Colors\": \"Inver&ser les couleurs\",\n\t\"Invert Colors\": \"Inverser les couleurs\",\n\t\"Thumbnail\": \"Miniature\",\n\t\"&File\": \"&Fichier\",\n\t\"File\": \"Fichier\",\n\t\"&New\": \"&Nouveau\",\n\t\"&Open\": \"&Ouvrir\",\n\t\"Open\": \"Ouvrir\",\n\t\"&Save\": \"&Enregistrer\",\n\t\"Save\": \"Enregistrer\",\n\t\"Save &As\": \"En&registrer sous\",\n\t\"Save As\": \"Enregistrer sous\",\n\t\"Print Pre&view\": \"&Aperçu avant impression\",\n\t\"Print Preview\": \"Aperçu avant impression\",\n\t\"Page Se&tup\": \"&Mise en page\",\n\t\"Page Setup\": \"Mise en page\",\n\t\"S&end\": \"Envo&yer\",\n\t\"Send\": \"Envoyer\",\n\t\"Set As &Wallpaper (Tiled)\": \"&Papier peint par défaut (mosaïque)\",\n\t\"Set As Wallpaper (Tiled)\": \"Papier peint par défaut (mosaïque)\",\n\t\"Set As Wa&llpaper (Centered)\": \"Papier peint par &défaut (centré)\",\n\t\"Set As Wallpaper (Centered)\": \"Papier peint par défaut (centré)\",\n\t\"Recent File\": \"Fichier récent\",\n\t\"E&xit\": \"&Quitter\",\n\t\"Exit\": \"Quitter\",\n\t\"&Edit\": \"&Edition\",\n\t\"Edit\": \"Edition\",\n\t\"&Undo\": \"&Annuler\",\n\t\"&Repeat\": \"&Répéter\",\n\t\"Repeat\": \"Répéter\",\n\t\"Del\": \"Suppr\",\n\t\"&View\": \"&Affichage\",\n\t\"View\": \"Affichage\",\n\t\"&Tool Box\": \"B&oîte à outils\",\n\t\"Tool Box\": \"Boîte à outils\",\n\t\"&Color Box\": \"&Palette de couleurs \",\n\t\"Color Box\": \"Palette de couleurs \",\n\t\"&Status Bar\": \"&Barre d'état\",\n\t\"Status Bar\": \"Barre d'état\",\n\t\"T&ext Toolbar\": \"Barr&e d'outils texte\",\n\t\"&Normal Size\": \"&Taille normale\",\n\t\"Normal Size\": \"Taille normale\",\n\t\"Ctrl+PgUp\": \"Ctrl+PG.PREC\",\n\t\"&Large Size\": \"G&rande taille\",\n\t\"Large Size\": \"Grande taille\",\n\t\"Ctrl+PgDn\": \"Ctrl+PG.SUIV\",\n\t\"C&ustom\": \"&Personnaliser\",\n\t\"Custom\": \"Personnaliser\",\n\t\"Show &Grid\": \"Afficher la &grille\",\n\t\"Show Grid\": \"Afficher la grille\",\n\t\"Show T&humbnail\": \"Afficher la &miniature\",\n\t\"Show Thumbnail\": \"Afficher la miniature\",\n\t\"&View Bitmap\": \"Afficher l'&image\",\n\t\"View Bitmap\": \"Afficher l'image\",\n\t\"&Flip/Rotate\": \"&Retourner/Faire pivoter\",\n\t\"&Attributes\": \"&Attributs\",\n\t\"&Clear Image\": \"E&ffacer l'image\",\n\t\"Clear Image\": \"Effacer l'image\",\n\t\"Ctrl+Shft+N\": \"Ctrl+Maj+N\",\n\t\"&Draw Opaque\": \"&Dessiner opaque\",\n\t\"Draw Opaque\": \"Dessiner opaque\",\n\t\"&Colors\": \"&Couleurs\",\n\t\"&Edit Colors\": \"&Modifier les couleurs\",\n\t\"Edit Colors\": \"Modification des couleurs\",\n\t\"&Help Topics\": \"&Rubriques d'aide\",\n\t\"Help Topics\": \"Rubriques d'aide\",\n\t\"&About Paint\": \"À &propos de Paint\",\n\t\"About Paint\": \"À propos de Paint\",\n\t\"&Update\": \"Mettre à jo&ur\",\n\t\"Update\": \"Mettre à jour\",\n\t\"Save Copy &As\": \"&Enregistrer la copie sous\",\n\t\"Save Copy As\": \"Enregistrer la copie sous\",\n\t\"untitled\": \"Sans titre\",\n\t\"Bitmap Image\": \"Image Bitmap\",\n\t\"Bitmap Files (*.bmp)\": \"Fichiers Bitmap (*.bmp)\",\n\t\"PCX Files\": \"Fichiers PCX\",\n\t\"Icon Files\": \"Fichiers icône\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"Bitmap monochrome (*.bmp;*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"Bitmap 16 couleurs (*.bmp;*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"Bitmap 256 couleurs (*.bmp;*.dib)\",\n\t\"Paint cannot open this file.\": \"Paint ne peut pas ouvrir ce fichier.\",\n\t\"Paint cannot read this file.\": \"Paint ne peut pas lire ce fichier.\",\n\t\"This file is read-only.\": \"Ce fichier est en lecture seule.\",\n\t\"To save your changes, use a different filename.\": \"Pour sauvegarder vos changements, utilisez un nom différent.\",\n\t\"This file is already open.\": \"Ce fichier est déjà ouvert.\",\n\t\"This is not a valid .PCS file.\": \"Ce fichier n'est pas un fichier .PCS valide.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"Ce fichier est ouvert pour l'édition et ne peut pas être écrasé.\",\n\t\"Use a different filename to save your changes.\": \"Utilisez un nom différent pour enregistrer vos changements.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"Ce fichier n'est pas un fichier bitmap valide, ou son format n'est pas pris en charge.\",\n\t\"This is not a valid icon.\": \"Cette icône n'est pas valide.\",\n\t\"This is not a valid cursor.\": \"Ce curseur n'est pas valide.\",\n\t\"Save was interrupted, so your file has not been saved.\": \"L'enregistrement a été interrompu et votre fichier n'a donc pas été enregistré.\",\n\t\"You cannot save to a read-only file.\": \"Impossible d'enregistrer un fichier en lecture seule.\",\n\t\"Use a different file name.\": \"Utilisez un nom de fichier différent.\",\n\t\"This file is already in use.\": \"Ce fichier est déjà utilisé.\",\n\t\"Close the program, and then try again.\": \"Quittez le programme, et essayez de nouveau.\",\n\t\"Paint cannot save this file.\": \"Paint ne peut pas enregistrer ce fichier.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"Le programme Paint ne peut pas enregistrer le fichier sous le même nom avec un type de fichier différent.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"La valeur de l'espacement de la grille doit être un entier compris entre %d et %d.\",\n\t\"There is not enough memory or resources to complete operation.\": \"Mémoire ou ressources insuffisantes pour terminer cette opération.\",\n\t\"Close some programs, and then try again.\": \"Quittez certains programmes, et essayez de nouveau.\",\n\t\"Low on memory or resources.\": \"Mémoire ou ressources faibles.\",\n\t\"Group error.\": \"Erreur de groupe.\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"Paint n'a pas pu imprimer votre document. Vérifiez que l'espace disque est suffisant et que l'imprimante fonctionne.\",\n\t\"Saving into this format may cause some loss of color information.\": \"Si vous enregistrez dans ce format vous risquez de perdre des informations sur les couleurs.\",\n\t\"Do you want to continue?\": \"Voulez-vous continuer ?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"La conversion en noir et blanc ne peut pas être annulée. Cette action affecte le fichier en cours et peut entraîner une perte de couleurs.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"Les bitmaps doivent avoir une taille supérieure à un pixel de côté.\",\n\t\"Generic error.\": \"Erreur générique.\",\n\t\"File not found.\": \"Fichier introuvable.\",\n\t\"Bad path.\": \"Chemin d'accès incorrect.\",\n\t\"Too many open files.\": \"Trop de fichiers ouverts.\",\n\t\"Access denied.\": \"Accès refusé.\",\n\t\"Invalid file.\": \"Fichier non valide.\",\n\t\"Remove current folder.\": \"Supprimer le dossier en cours.\",\n\t\"Folder full.\": \"Dossier plein.\",\n\t\"Bad seek.\": \"Recherche incorrecte.\",\n\t\"Hard IO error.\": \"Erreur E/S matérielle.\",\n\t\"Sharing violation.\": \"Violation de partage.\",\n\t\"Lock violation.\": \"Violation de verrouillage.\",\n\t\"Disk full.\": \"Disque plein.\",\n\t\"End of file.\": \"Fin de fichier.\",\n\t\"Error getting the Clipboard Data!\": \"Erreur d'obtention des données du Presse-papiers !\",\n\t\"No Printer Found @ page setup\": \"Aucune imprimante à cette configuration de page\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"Bitmap 24 bits (*.bmp;*.dib)\",\n\t\"All Files\": \"Tous\",\n\t\"untitled.pal\": \"Sans titre.pal\",\n\t\"OLE 2.0 was unable to start.\": \"OLE 2.0 n'a pu démarrer.\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"Assurez-vous que vous utilisez la bonne version des bibliothèques OLE.\",\n\t\"Resets the text be without any attributes.\": \"Supprime les attributs du texte.\",\n\t\"Sets or clears the text bold attribute.\": \"Active ou désactive l'attribut gras du texte.\",\n\t\"Sets or clears the text italic attribute.\": \"Active ou désactive l'attribut italique du texte.\",\n\t\"Selects the font used by the text.\": \"Sélectionne la police utilisée pour le texte.\",\n\t\"Selects the point size of the text.\": \"Sélectionne la taille du texte en points.\",\n\t\"Sets or clears the text underline attribute.\": \"Active ou désactive l'attribut souligné du texte.\",\n\t\"Shows or hides the tooltips.\": \"Affiche ou masque les info-bulles.\",\n\t\"Show Paint Help.\": \"Afficher l'aide de Paint.\",\n\t\"Sends a picture by using mail or fax.\": \"Envoie une image en utilisant le courrier électronique ou le télécopieur.\",\n\t\"Copies the selection to a file.\": \"Copie la sélection dans un fichier.\",\n\t\"Pastes a file into the selection.\": \"Colle un fichier dans la sélection.\",\n\t\"Zooms the picture to 100%.\": \"Agrandit l'image à 100%.\",\n\t\"Zooms the picture to 400%.\": \"Agrandit l'image à 400%.\",\n\t\"Zooms the picture.\": \"Agrandit l'image.\",\n\t\"Displays the entire picture.\": \"Affiche l'image entière.\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"Affiche ou masque la vue de la miniature dans l'image.\",\n\t\"Shows or hides the grid.\": \"Affiche ou masque la grille.\",\n\t\"Shows or hides the text toolbar.\": \"Affiche ou masque la barre d'outil du texte.\",\n\t\"Flips or rotates the picture or a selection.\": \"Retourne ou fait pivoter l'image ou une sélection.\",\n\t\"Stretches or skews the picture or a selection.\": \"Étire ou incline l'image ou la sélection.\",\n\t\"Inverts the colors of the picture or a selection.\": \"Inverse les couleurs de l'image ou de la sélection.\",\n\t\"Changes the attributes of the picture.\": \"Change les attributs de l'image.\",\n\t\"Clears the picture or selection.\": \"Efface l'image ou la sélection.\",\n\t\"The font size must be a numeric value.\": \"La taille de la police doit être une valeur numérique.\",\n\t\"Contains commands for working with the selected item(s).\": \"Contient les commandes pour travailler avec le ou les éléments sélectionnés.\",\n\t\"Contains commands for selecting and transferring items.\": \"Contient les commandes pour la sélection et le transfert des éléments.\",\n\t\"Contains commands for customizing this window.\": \"Contient les commandes pour personnaliser cette fenêtre.\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"Contient les commandes pour la manipulation des images et la configuration des attributs.\",\n\t\"Contains commands for using custom colors and drawing options.\": \"Contient les commandes pour utiliser les options des couleurs personnalisées et du dessin.\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"Contient les commandes pour afficher l'aide et des informations à propos de Paint.\",\n\t\"Cannot save file.\": \"Impossible d'enregistrer le fichier.\",\n\t\"Error removing temporary file.\": \"Erreur de suppression du fichier temporaire.\",\n\t\"Get Colors\": \"Charger la palette de couleurs\",\n\t\"Save Colors\": \"Enregistrer la palette de couleurs\",\n\t\"File last saved:\": \"Dernière sauvegarde :\",\n\t\"Not Available\": \"Non Disponible\",\n\t\"Size on disk:\": \"Taille sur le disque :\",\n\t\"%s bytes\": \"%s octets\",\n\t\"Painting\": \"Peindre\",\n\t\"Fonts\": \"Polices\",\n\t\"Tools\": \"Outils\",\n\t\"All Picture Files\": \"Tous les fichiers images\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"Pour obtenir de l'aide, sélectionnez l'option Rubriques d'aide du menu d'aide.\",\n\t\"Select an area on which to get Help.\": \"Choisissez un domaine sur lequel vous voulez de l'aide.\",\n\t\"%1 in %2\": \"%1 de %2\",\n\t\"Creates a new document.\": \"Crée un nouveau document.\",\n\t\"Opens an existing document.\": \"Ouvre un document existant.\",\n\t\"Closes the active document.\": \"Ferme le document actif.\",\n\t\"Saves the active document.\": \"Enregistre le document actif.\",\n\t\"Saves the active document with a new name.\": \"Enregistre le document actif sous un autre nom.\",\n\t\"Changes the page layout.\": \"Change la spécification de la page.\",\n\t\"Specifies the default printer setup.\": \"Spécifie la configuration de l'imprimante par défaut.\",\n\t\"Prints the active document and sets printing options.\": \"Imprime le document actif et définit les options d'impression.\",\n\t\"Displays full pages.\": \"Affiche les pages entières.\",\n\t\"Opens this document.\": \"Ouvre ce document.\",\n\t\"Deletes the selection.\": \"Supprime la sélection.\",\n\t\"Erases everything.\": \"Efface tout.\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"Copie la sélection et la place dans le Presse-papiers.\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"Coupe la sélection et la place dans le Presse-papiers.\",\n\t\"Finds the specified text.\": \"Recherche le texte spécifié.\",\n\t\"Inserts the contents of the Clipboard.\": \"Insère le contenu du Presse-papiers.\",\n\t\"Repeats the last action.\": \"Répète la dernière action.\",\n\t\"Replaces specific text with different text.\": \"Remplace un texte par un autre.\",\n\t\"Selects everything.\": \"Sélectionne tout.\",\n\t\"Undoes the last action.\": \"Annule la dernière action.\",\n\t\"Redoes the previously undone action.\": \"Rétablit l'action précédemment annulée.\",\n\t\"Displays program information, version number, and copyright.\": \"Affiche les informations sur le programme, son numéro de version et son copyright.\",\n\t\"Quits Paint.\": \"Quitte Paint.\",\n\t\"Opens Paint Help.\": \"Ouvre l'aide de Paint.\",\n\t\"Displays instructions about how to use Help.\": \"Affiche le manuel d'utilisation de l'aide.\",\n\t\"Displays Help for areas you click on.\": \"Affiche l'aide pour les zones que vous avez sélectionnées.\",\n\t\"Displays Help for the current task or command.\": \"Affiche l'aide pour la tâche ou la commande en cours.\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"Centre ce bitmap en tant que papier peint du bureau.\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"Définit ce bitmap en mode mosaïque en tant que papier peint du bureau.\",\n\t\"Sends the selection using mail or fax.\": \"Envoie la sélection en utilisant le courrier ou le télécopieur.\",\n\t\"Prints the selection.\": \"Imprime la sélection.\",\n\t\"Shows or hides the thumbnail.\": \"Affiche ou masque la miniature.\",\n\t\"Shows Paint Help.\": \"Affiche l'aide de Paint.\",\n\t\"Shows or hides the status bar.\": \"Affiche ou masque la barre d'état.\",\n\t\"Shows or hides the tool box.\": \"Affiche ou masque la boîte à outils.\",\n\t\"Shows or hides the color box.\": \"Affiche ou masque la palette de couleurs.\",\n\t\"Only a Far East font can be used for vertical editing.\": \"Seule une police extrême orientale peut être éditée à la verticale.\",\n\t\"Changes the window size.\": \"Modifie la taille de la fenêtre.\",\n\t\"Changes the window position.\": \"Modifie la position de la fenêtre.\",\n\t\"Reduces the window to an icon.\": \"Réduit la fenêtre à une icône.\",\n\t\"Enlarges the window to full size.\": \"Agrandit la fenêtre en plein écran.\",\n\t\"Switches to the next document window.\": \"Bascule vers la fenêtre document suivante.\",\n\t\"Switches to the previous document window.\": \"Bascule vers la fenêtre document précédente.\",\n\t\"Closes the active window and asks if you want to save changes.\": \"Ferme la fenêtre active et vous demande si vous voulez conserver vos modifications.\",\n\t\"Restores the window to normal size.\": \"Restaure la fenêtre à sa taille d'origine.\",\n\t\"Activates the task list.\": \"Active la liste des tâches.\",\n\t\"All Files (*.*)\": \"Tous (*.*)\",\n\t\"Untitled\": \"Sans titre\",\n\t\"an unnamed file\": \"un fichier sans nom\",\n\t\"&Hide\": \"&Masquer\",\n\t\"Hide\": \"Masquer\",\n\t\"No error message is available.\": \"Aucun message d'erreur disponible.\",\n\t\"An unsupported operation was attempted.\": \"Une opération non prise en charge a été tentée.\",\n\t\"A required resource was unavailable.\": \"Une ressource nécessaire n'était pas disponible.\",\n\t\"Out of memory.\": \"Mémoire insuffisante.\",\n\t\"An unknown error has occurred.\": \"Une erreur inconnue s'est produite.\",\n\t\"on %1\": \"sur %1\",\n\t\"&One Page\": \"&Une page\",\n\t\"One Page\": \"Une page\",\n\t\"&Two Page\": \"&Deux pages\",\n\t\"Two Page\": \"Deux pages\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"Fichiers imprimante (*.prn)|*.prn|Tous(*.*)|*.*||\",\n\t\"Print to File\": \"Impression dans un fichier\",\n\t\"to %1\": \"vers %1\",\n\t\"&Update %1\": \"&Mettre %1 à jour\",\n\t\"Update %1\": \"Mettre %1 à jour\",\n\t\"E&xit && Return to %1\": \"&Quitter et revenir à %1\",\n\t\"Exit & Return to %1\": \"Quitter et revenir à %1\",\n\t\"Linked %s\": \"Lié %s\",\n\t\"Unknown Type\": \"Type inconnu\",\n\t\"Invalid filename.\": \"Nom de fichier non valide.\",\n\t\"Failed to open document.\": \"Impossible d'ouvrir le document.\",\n\t\"Failed to save document.\": \"Impossible d'enregistrer le document.\",\n\t\"Save changes to %1?\": \"Enregistrer les modifications vers %1 ?\",\n\t\"Failed to create empty document.\": \"Impossible de créer un document vide.\",\n\t\"The file is too large to open.\": \"Le fichier est trop grand pour être ouvert.\",\n\t\"Could not start print job.\": \"Impossible de démarrer le travail d'impression.\",\n\t\"Failed to launch help.\": \"Impossible de démarrer l'aide.\",\n\t\"Internal application error.\": \"Erreur interne à l'application.\",\n\t\"Command failed.\": \"La commande a échoué.\",\n\t\"Insufficient memory to perform operation.\": \"Mémoire insuffisante pour accomplir cette opération.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"Les entrées du Registre système ont été supprimées et le fichier INI (s'il y en avait un) a été supprimé également.\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"Certaines entrées du Registre système (ou fichiers INI) n'ont pas été supprimées.\",\n\t\"This program requires the file %s, which was not found on this system.\": \"Ce programme nécessite le fichier %s qui ne peut pas être trouvé sur ce système.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"Ce programme et lié à l'export manquant %s dans le fichier %s. Cette machine peut avoir une version incompatible de %s.\",\n\t\"Please enter an integer.\": \"Veuillez entrer un entier.\",\n\t\"Please enter a number.\": \"Veuillez entrer un nombre.\",\n\t\"Please enter an integer between %1 and %2.\": \"Veuillez entrer un entier compris entre %1 et %2.\",\n\t\"Please enter a number between %1 and %2.\": \"Veuillez entrer un nombre compris entre %1 et %2.\",\n\t\"Please enter no more than %1 characters.\": \"Veuillez ne pas entrer plus de %1 caractères.\",\n\t\"Please select a button.\": \"Veuillez sélectionner un bouton.\",\n\t\"Please enter an integer between 0 and 255.\": \"Veuillez entrer un entier compris entre 0 et 255.\",\n\t\"Please enter a positive integer.\": \"Veuillez entrer un entier positif.\",\n\t\"Please enter a date and/or time.\": \"Veuillez entrer une date ou une heure.\",\n\t\"Please enter a currency.\": \"Veuillez entrer une monnaie.\",\n\t\"Unexpected file format.\": \"Format de fichier inattendu.\",\n\t\"Cannot find this file.\": \"Impossible de trouver ce fichier.\",\n\t\"Please verify that the correct path and file name are given.\": \"Vérifiez que le chemin d'accès et le nom de fichier sont corrects.\",\n\t\"Destination disk drive is full.\": \"Le disque de destination est plein.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"Impossible de lire depuis %1 ; il est ouvert par quelqu'un d'autre.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"Impossible d'écrire à partir de %1 ; il est peut-être protégé en écriture ou ouvert par un autre utilisateur.\",\n\t\"An unexpected error occurred while reading %1.\": \"Une erreur inattendue s'est produite durant la lecture de %1.\",\n\t\"An unexpected error occurred while writing %1.\": \"Une erreur inattendue s'est produite durant l'écriture de %1.\",\n\t\"Unable to register document.\": \"Impossible d'inscrire le document au registre.\",\n\t\"The document may already be open.\": \"Le document est peut-être déjà ouvert.\",\n\t\"Update %1 before proceeding?\": \"Souhaitez-vous mettre à jour %1 avant de continuer ?\",\n\t\"Could not update client.\": \"Impossible de mettre à jour le client.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"Échec de l'enregistrement. Il se peut que les fonctionnalités ActiveX ne fonctionnent pas correctement.\",\n\t\"Failed to update the system registry.\": \"Impossible de mettre à jour le Registre système.\",\n\t\"Please try using REGEDIT.\": \"Veuillez essayer avec REGEDIT.\",\n\t\"Unable to read write-only property.\": \"Impossible de lire les propriétés en écriture seule.\",\n\t\"Unable to write read-only property.\": \"Impossible d'écrire les propriétés en lecture seule.\",\n\t\"Unable to load mail system support.\": \"Impossible de charger la gestion du courrier électronique.\",\n\t\"Mail system DLL is invalid.\": \"La DLL système du courrier électronique n'est pas valide.\",\n\t\"Send Mail failed to send message.\": \"La commande Envoyer le message n'a pas pu envoyer le message.\",\n\t\"No error occurred.\": \"Aucune erreur ne s'est produite.\",\n\t\"An unknown error occurred while accessing %1.\": \"Une erreur inconnue s'est produite lors de l'accès à %1.\",\n\t\"%1 was not found.\": \"%1 n'a pas été trouvé.\",\n\t\"%1 contains an invalid path.\": \"%1 contient un chemin d'accès non valide.\",\n\t\"%1 could not be opened because there are too many open files.\": \"%1 n'a pas pu être ouvert car trop de fichiers sont ouverts.\",\n\t\"Access to %1 was denied.\": \"L'accès à %1 a été refusé.\",\n\t\"An invalid file handle was associated with %1.\": \"Un descripteur de fichier non valide a été associé à %1.\",\n\t\"%1 could not be removed because it is the current directory.\": \"%1 n'a pas pu être supprimé car il s'agit du répertoire en cours.\",\n\t\"%1 could not be created because the directory is full.\": \"%1 n'a pu être créé car le répertoire est plein.\",\n\t\"Seek failed on %1\": \"Recherche infructueuse sur %1\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"Une erreur d'E/S matérielle a été signalée lors de l'accès à %1.\",\n\t\"A sharing violation occurred while accessing %1.\": \"Une violation de partage s'est produite lors de l'accès à %1.\",\n\t\"A locking violation occurred while accessing %1.\": \"Une violation de verrouillage s'est produite lors de l'accès à %1.\",\n\t\"Disk full while accessing %1.\": \"Le disque était plein lors de l'accès à %1.\",\n\t\"An attempt was made to access %1 past its end.\": \"Il y a eu une tentative d'accès au-delà de %1.\",\n\t\"An attempt was made to write to the reading %1.\": \"Il y a eu une tentative d'écriture sur %1 en lecture.\",\n\t\"An attempt was made to read from the writing %1.\": \"Il y a eu une tentative de lecture sur %1 en écriture.\",\n\t\"%1 has a bad format.\": \"%1 possède un format incorrect.\",\n\t\"%1 contained an unexpected object.\": \"%1 contenait un objet inattendu.\",\n\t\"%1 contains an incorrect schema.\": \"%1 contient un schéma incorrect.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"Sélectionne une partie rectangulaire de l'image à déplacer, à copier ou à modifier.\",\n\t\"Select\": \"Sélection\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"Sélectionne une partie quelconque du dessin à déplacer, à copier ou à modifier.\",\n\t\"Free-Form Select\": \"Sélection libre\",\n\t\"Inserts text into the picture.\": \"Insère du texte dans le dessin.\",\n\t\"Fills an area with the current drawing color.\": \"Remplit une surface avec la couleur actuelle.\",\n\t\"Fill With Color\": \"Remplissage\",\n\t\"Draws a straight line with the selected line width.\": \"Dessine une ligne droite avec l'épaisseur de trait sélectionnée.\",\n\t\"Line\": \"Ligne\",\n\t\"Draws using an airbrush of the selected size.\": \"Dessine en utilisant un aérographe de la taille sélectionnée.\",\n\t\"Airbrush\": \"Aérographe\",\n\t\"Draws a curved line with the selected line width.\": \"Dessine une courbe avec l'épaisseur de trait sélectionnée.\",\n\t\"Curve\": \"Courbe\",\n\t\"Draws a polygon with the selected fill style.\": \"Dessine un polygone avec l'épaisseur de trait et le style de remplissage sélectionnés.\",\n\t\"Polygon\": \"Polygone\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"Dessine un rectangle arrondi avec le style de remplissage sélectionné.\",\n\t\"Rounded Rectangle\": \"Rectangle arrondi\",\n\t\"Draws a free-form line one pixel wide.\": \"Dessine une ligne quelconque d'une épaisseur d'un pixel.\",\n\t\"Pencil\": \"Pinceau\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"Efface une partie de l'image en utilisant la forme de la gomme sélectionnée.\",\n\t\"Eraser/Color Eraser\": \"Gomme/Gomme une couleur\",\n\t\"Changes the magnification.\": \"Modifie le grossissement.\",\n\t\"Magnifier\": \"Loupe\",\n\t\"Picks up a color from the picture for drawing.\": \"Prélève la couleur à utiliser dans le dessin lui-même.\",\n\t\"Pick Color\": \"Prélèvement d'une couleur\",\n\t\"Draws using a brush with the selected shape and size.\": \"Dessine en utilisant une brosse de la forme et de la taille sélectionnées.\",\n\t\"Brush\": \"Brosse\",\n\t\"Draws a rectangle with the selected fill style.\": \"Dessine un rectangle avec l'épaisseur de trait et le style de remplissage sélectionnés.\",\n\t\"Draws a filled rectangle.\": \"Dessine un rectangle plein.\",\n\t\"Draws an ellipse with the selected fill style.\": \"Dessine une ellipse avec l'épaisseur de trait et le style de remplissage sélectionnés.\",\n\t\"Draws a filled ellipse.\": \"Dessine une ellipse pleine.\",\n\t\"Makes the current selection either opaque or transparent.\": \"Rend la sélection en cours opaque ou transparente.\",\n\t\"Creates a new color.\": \"Crée une nouvelle couleur.\",\n\t\"Uses a previously saved palette of colors.\": \"Utilise une palette de couleurs enregistrée antérieurement.\",\n\t\"Saves the current palette of colors to a file.\": \"Enregistre la palette de couleurs actuelle dans un fichier.\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"Vous devez enregistrer ce fichier avant de l'utiliser en tant que papier peint.\",\n\t\"The selection is now larger than the bitmap.\": \"La sélection est plus grande que l'image.\",\n\t\"Would you like the bitmap enlarged?\": \"Voulez-vous agrandir l'image ?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"L'image dans le Presse-papiers est plus grande que la bitmap.\",\n\t\"The file is not in the correct format.\": \"Le fichier n'est pas au format correct.\",\n\t\"Not enough room to paste text.\": \"Espace insuffisant pour coller le texte.\",\n\t\"Enlarge the text area and try again.\": \"Agrandissez la zone de texte puis réessayez.\",\n\t\"Places the text.\": \"Place le texte.\"\n});\n"
  },
  {
    "path": "localization/grab-files-from-vm.sh",
    "content": "lang=$1\nimg_dir=/home/io/Downloads/Windowses/vdi-to-img\nimg_file=$img_dir/Win98-$lang.vdi.img\noutput_dir=/home/io/Downloads/Windowses/resources/$lang\n\nif [ ! \"$1\" ]; then\n\techo \"One argument required: a target language code (e.g. en)\"\n\texit 1\nfi\nif [ ! \"$2\" ]; then\n\tvdi_file=\"/home/io/VirtualBox VMs/Win98-$lang/Win98-$lang.vdi\"\nelif [ -d \"$2\" ]; then\n\tmount_dir=$2\nelif [ -f \"$2\" ]; then\n\tvdi_file=$2\nelse\n\techo \"No file or directory at \\\"$2\\\"!\"\n\texit 1\nfi\nif [ ! \"$mount_dir\" ]; then\n\tif [ ! -d \"$img_dir\" ]; then\n\t\tmkdir -p \"$img_dir\"\n\tfi\n\tif [ ! -f \"$img_file\" ]; then\n\t\techo \"File \\\"$img_file\\\" does not exist yet...\"\n\t\t# To avoid \"VBoxManage: error: Cannot register the hard disk ... because a hard disk ... already exists\",\n\t\t# copy the .vdi file and randomize the UUID.\n\t\tvdi_copy=\"$vdi_file-copy.vdi\"\n\t\techo \"Copy .vdi file\"\n\t\tcp \"$vdi_file\" \"$vdi_copy\"\n\t\techo \"Regenerate copied .vdi file's UUID\"\n\t\tVBoxManage internalcommands sethduuid \"$vdi_copy\"\n\t\techo \"Convert .vdi to RAW .img\"\n\t\tVBoxManage clonemedium disk \"$vdi_copy\" \"$img_file\" --format RAW\n\t\trm \"$vdi_copy\"\n\t\tif [ ! -f \"$img_file\" ]; then\n\t\t\techo \"Failed to create \\\"$img_file\\\"!\"\n\t\t\texit 1\n\t\tfi\n\t\techo \"Created \\\"$img_file\\\"\"\n\tfi\n\techo \"Time to do some desktop automation!\"\n\tsleep 3\n\techo \"Show .img file in folder\"\n\tnautilus --browser \"$img_file\"\n\techo \"Waiting for window \\\"vdi-to-img\\\"\"\n\txdotool search --sync --name \"vdi-to-img\" windowactivate --sync\n\techo \"Found window \\\"vdi-to-img\\\"\"\n\tsleep 5\n\txdotool key --clearmodifiers Return\n\tsleep 1\n\techo \"Click on notification to go to mounted folder\"\n\techo \"If the wrong notification is selected, quick, use the arrow keys!\"\n\txdotool key --clearmodifiers Super_L+v\n\tsleep 15 # time to select appropriate notification\n\txdotool key --clearmodifiers Return\n\tsleep 0.5\n\txdotool key --clearmodifiers Escape\n\tsleep 8\n\t# It's just called e.g. 341 MB Volume\n\t# echo \"Waiting for window \\\"Win98-$lang.vdi\\\"\"\n\t# xdotool search --sync --name \"Win98-$lang.vdi\" windowactivate --sync\n\t# echo \"Found window \\\"Win98-$lang.vdi\\\"\"\n\t# sleep 1\n\techo \"Copy path of mounted folder\"\n\txdotool key --clearmodifiers ctrl+l\n\tsleep 1\n\told_clipboard=`xclip -selection clipboard -o`\n\txdotool key --clearmodifiers ctrl+c\n\tsleep 0.5\n\tmount_dir=`xclip -selection clipboard -o`\n\tcat \"$old_clipboard\" | xclip -selection clipboard\n\techo \"(Restored clipboard text)\"\n\techo \"Close mounted folder window\"\n\txdotool key --clearmodifiers alt+F4\n\techo \"Close vdi-to-img folder window\"\n\twmctrl -c \"vdi-to-img\"\n\tif [ ! -d \"$mount_dir\" ]; then\n\t\techo \"Failed to get path of mounted directory, or failed to mount. \\\"$mount_dir\\\" is not a directory.\"\n\t\texit 1\n\tfi\nfi\nif [ ! -d \"$output_dir\" ]; then\n\tmkdir -p \"$output_dir\"\nfi\n\necho \"Using mount dir: \\\"$mount_dir\\\"\"\n\ngrab() {\n\tfile_path=`find \"$mount_dir\" -iname \"$1\" | head -n 1`\n\tif [ -f \"$file_path\" ]; then\n\t\tprintf \"Copy \\\"$file_path\\\" -> \\\"$output_dir\\\" \"\n\t\tcp \"$file_path\" \"$output_dir\"\n\t\tif [ $? = 0 ]; then\n\t\t\tprintf \" ✅\\n\"\n\t\telse\n\t\t\tprintf \" ❌\\n\"\n\t\tfi\n\telse\n\t\tprintf \"No file found for \\\"$1\\\" ❌\\n\"\n\tfi\n}\n\ngrab_folder() {\n\tfolder_path=`find \"$mount_dir\" -type d -iname \"$1\" | head -n 1`\n\tif [ -d \"$folder_path\" ]; then\n\t\tprintf \"Copy folder \\\"$folder_path\\\" -> \\\"$output_dir\\\" \"\n\t\tcp -r \"$folder_path\" \"$output_dir\"\n\t\tif [ $? = 0 ]; then\n\t\t\tprintf \" ✅\\n\"\n\t\telse\n\t\t\tprintf \" ❌\\n\"\n\t\tfi\n\telse\n\t\tprintf \"No folder found for \\\"$1\\\" ❌\\n\"\n\tfi\n}\n\n\ngrab_folder \"Help\" # \"C:\\\\Windows\\\\Help\"\ngrab \"Notepad.exe\" # \"C:\\\\Windows\\\\Notepad.exe\"\ngrab \"Sndrec32.exe\" # \"C:\\\\Windows\\\\Sndrec32.exe\"\ngrab \"WinHelp.exe\" # \"C:\\\\Windows\\\\WinHelp.exe\"\ngrab \"WinHlp32.exe\" # \"C:\\\\Windows\\\\WinHlp32.exe\"\ngrab \"Explorer.exe\" # \"C:\\\\Windows\\\\Explorer.exe\"\ngrab \"Offline.htm\" # \"C:\\\\Windows\\\\Web\\\\Offline.htm\"\n# grab \"iexplore.exe\" # \"C:\\\\Program Files\\\\Internet Explorer\\\\iexplore.exe\" # contains no interesting strings\n# grab \"browseui.dll\" # \"C:\\\\Program Files\\\\Internet Explorer\\\\iexplore.exe\" # contains no strings\ngrab \"mspaint.exe\" # \"C:\\\\Program Files\\\\Accessories\\\\mspaint.exe\"\ngrab \"wordpad.exe\" # \"C:\\\\Program Files\\\\Accessories\\\\wordpad.exe\"\ngrab \"Write.exe\" # \"C:\\\\Windows\\\\Write.exe\"\n\necho \"Grabbed files, now copy them to the Windows 10 VM shared folder\"\nrsync -av --exclude=\"HELP/\" \"/home/io/Downloads/Windowses/resources\" \"/home/io/VirtualBox VMs/Win10 Share\"\n\necho \"Go to Windows 10 VM\"\nVBoxManage controlvm \"Windows 10\" resume\nxdotool search --sync --name \"Windows 10 (\\(.*\\) )?\\[Running\\]\" windowactivate --sync\nsleep 1\necho \"Open Run dialog\"\nxdotool key --clearmodifiers --delay 20 Super_L+r\nsleep 1\necho \"Open Resource Tuner for the localized mspaint.exe\"\nxdotool type --delay 20 \"C:\\\\Program Files (x86)\\\\Resource Tuner\\\\restuner.exe Z:\\\\resources\\\\$lang\\\\mspaint.exe\"\nsleep 0.3\nxdotool key --clearmodifiers Return\nsleep 10\necho \"Open \\\"Save Multiple Resources At Once\\\" batch export dialog\"\nxdotool key --clearmodifiers --delay 20 ctrl+shift+m\nsleep 2\necho \"Settings should be already selected; Next\"\nxdotool key --clearmodifiers --delay 20 alt+n\nsleep 2\necho \"Enter output folder\"\nxdotool key --clearmodifiers --delay 20 Tab\nsleep 0.2\nxdotool key --clearmodifiers --delay 20 Tab\nsleep 0.2\nxdotool key --clearmodifiers --delay 20 Tab\nsleep 0.2\n# It will create these folders automatically :)\nxdotool type \"Z:\\\\extracted-resources\\\\$lang\\\\mspaint\"\nsleep 0.2\necho \"Finish\"\nxdotool key --clearmodifiers Return\nsleep 1\necho \"Close Resource Tuner\"\nxdotool key --clearmodifiers alt+F4\nsleep 1\necho \"Pause the VM\"\nVBoxManage controlvm \"Windows 10\" pause\n\necho \"Copy extracted strings out of the VM shared folder\"\nmkdir -p \"/home/io/Projects/jspaint/localization/$lang\"\ncp -r \"/home/io/VirtualBox VMs/Win10 Share/extracted-resources/$lang/mspaint/Dialog\" \"/home/io/Projects/jspaint/localization/$lang\"\ncp -r \"/home/io/VirtualBox VMs/Win10 Share/extracted-resources/$lang/mspaint/Menu\" \"/home/io/Projects/jspaint/localization/$lang\"\ncp -r \"/home/io/VirtualBox VMs/Win10 Share/extracted-resources/$lang/mspaint/String Table\" \"/home/io/Projects/jspaint/localization/$lang\"\necho \"Rebuild localization files in jspaint\"\ncd \"/home/io/Projects/jspaint\"\nnpm run update-localization\necho \"DONE! Now just test the new language in jspaint and commit!\"\n\n# TODO: find where strings are stored for:\n# - The Edit Colors dialog text\n# - The Help viewer text\n# - Minesweeper - is Games not part of Typical/Recommended installation?\n\n\n# Script to open Paint and the Edit Colors dialog in a VM:\n# echo \"Alt-tab to and click on VM window to select it\"\n# xdotool selectwindow windowactivate --sync\n# sleep 1\n# xdotool key --clearmodifiers --delay 20 Super_L+r\n# sleep 1\n# xdotool type --delay 20 \"C:\\\\Program Files\\\\Accessories\\\\Mspaint.exe\"\n# xdotool key --clearmodifiers Return\n# sleep 1\n# xdotool key --clearmodifiers --delay 20 alt+c\n# xdotool key --clearmodifiers --delay 20 Return\n# xdotool key --clearmodifiers --delay 20 alt+d\n"
  },
  {
    "path": "localization/he/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"he\", {\n\t\"Attributes\": \"תכונות\",\n\t\"MS Shell Dlg\": \"MS Sans Serif\",\n\t\"&Width:\": \"&רוחב:\",\n\t\"Width:\": \"רוחב:\",\n\t\"&Height:\": \"&גובה:\",\n\t\"Height:\": \"גובה:\",\n\t\"Units\": \"יחידות\",\n\t\"&Inches\": \"אי&נץ'\",\n\t\"Inches\": \"אינץ'\",\n\t\"C&m\": \"&ס\\\"מ\",\n\t\"Cm\": \"ס\\\"מ\",\n\t\"&Pixels\": \"&פיקסלים\",\n\t\"Pixels\": \"פיקסלים\",\n\t\"Colors\": \"צבעים\",\n\t\"&Black and white\": \"&שחור-לבן\",\n\t\"Black and white\": \"שחור-לבן\",\n\t\"Co&lors\": \"&צבעים\",\n\t\"Transparency\": \"שקיפות\",\n\t\"Use &Transparent background color\": \"&השתמש בצבע רקע שקוף\",\n\t\"Use Transparent background color\": \"השתמש בצבע רקע שקוף\",\n\t\"Select &Color\": \"&בחירת צבע\",\n\t\"Select Color\": \"בחירת צבע\",\n\t\"OK\": \"אישור\",\n\t\"Cancel\": \"ביטול\",\n\t\"&Default\": \"ברירת &מחדל\",\n\t\"Default\": \"ברירת מחדל\",\n\t\"Custom Zoom\": \"התאמה אישית של מרחק מתצוגה\",\n\t\"Current zoom:\": \"מרחק נוכחי מתצוגה:\",\n\t\"Zoom to\": \"שנה ל- \",\n\t\"Flip and Rotate\": \"היפוך וסיבוב\",\n\t\"Flip or rotate\": \"הפוך או סובב\",\n\t\"&Flip horizontal\": \"הפוך או&פקית\",\n\t\"Flip horizontal\": \"הפוך אופקית\",\n\t\"Flip &vertical\": \"הפוך א&נכית\",\n\t\"Flip vertical\": \"הפוך אנכית\",\n\t\"&Rotate by angle\": \"&סובב בזווית\",\n\t\"Rotate by angle\": \"סובב בזווית\",\n\t\"Stretch and Skew\": \"מתיחה והטיה\",\n\t\"Stretch\": \"מתיחה\",\n\t\"&Horizontal:\": \"או&פקית:\",\n\t\"Horizontal:\": \"אופקית:\",\n\t\"&Vertical:\": \"א&נכית:\",\n\t\"Vertical:\": \"אנכית:\",\n\t\"Skew\": \"הטיה\",\n\t\"H&orizontal:\": \"&אופקית:\",\n\t\"Degrees\": \"מעלות\",\n\t\"V&ertical:\": \"אנ&כית:\",\n\t\"Color Table\": \"טבלת צבעים\",\n\t\"New\": \"חדש\",\n\t\"&New \": \"&חדש \",\n\t\"New \": \"חדש \",\n\t\"&Help\": \"ע&זרה\",\n\t\"Help\": \"עזרה\",\n\t\"Printing\": \"מדפיס\",\n\t\"on the\": \"ב-\",\n\t\"&Print\": \"&הדפסה\",\n\t\"Print\": \"הדפסה\",\n\t\"&Next Page\": \"העמוד ה&בא\",\n\t\"Next Page\": \"העמוד הבא\",\n\t\"Pre&v Page\": \"ה&עמוד הקודם\",\n\t\"Prev Page\": \"העמוד הקודם\",\n\t\"Zoom &In\": \"&קרב\",\n\t\"Zoom In\": \"קרב\",\n\t\"Zoom &Out\": \"ה&רחק\",\n\t\"Zoom Out\": \"הרחק\",\n\t\"&Close\": \"&סגור\",\n\t\"Close\": \"סגור\",\n\t\"Grid Settings\": \"הגדרות רשת\",\n\t\"&Pixel Grid\": \"&רשת פיקסלים\",\n\t\"Pixel Grid\": \"רשת פיקסלים\",\n\t\"&Tile Grid\": \"רשת &פרישה\",\n\t\"Tile Grid\": \"רשת פרישה\",\n\t\"pixels\": \"פיקסלים\",\n\t\"H&eight:\": \"&גובה:\",\n\t\"Text\": \"טקסט\",\n\t\"Undo\": \"בטל\",\n\t\"Cut\": \"גזור\",\n\t\"Copy\": \"העתק\",\n\t\"Paste\": \"הדבק\",\n\t\"Clear Selection\": \"בטל בחירה\",\n\t\"Select All\": \"בחר הכל\",\n\t\"Text Toolbar\": \"סרגל הכלים טקסט\",\n\t\"Selection\": \"בחירה\",\n\t\"Cu&t\": \"&גזור\",\n\t\"&Copy\": \"ה&עתק\",\n\t\"&Paste\": \"ה&דבק\",\n\t\"C&lear Selection\": \"&נקה בחירה\",\n\t\"Select &All\": \"&בחר הכל\",\n\t\"C&opy To\": \"העתקה &אל\",\n\t\"Copy To\": \"העתקה אל\",\n\t\"Paste &From\": \"הדבקה &מתוך\",\n\t\"Paste From\": \"הדבקה מתוך\",\n\t\"Flip/&Rotate\": \"&היפוך/סיבוב\",\n\t\"Flip/Rotate\": \"היפוך/סיבוב\",\n\t\"&Stretch/Skew\": \"מ&תיחה/הטיה\",\n\t\"Stretch/Skew\": \"מתיחה/הטיה\",\n\t\"&Invert Colors\": \"הפוך &צבעים\",\n\t\"Invert Colors\": \"הפוך צבעים\",\n\t\"Thumbnail\": \"תמונה ממוזערת\",\n\t\"&File\": \"&קובץ\",\n\t\"File\": \"קובץ\",\n\t\"&New\": \"&חדש\",\n\t\"&Open\": \"&פתיחה\",\n\t\"Open\": \"פתיחה\",\n\t\"&Save\": \"&שמור\",\n\t\"Save\": \"שמור\",\n\t\"Save &As\": \"שמירה &בשם\",\n\t\"Save As\": \"שמירה בשם\",\n\t\"Print Pre&view\": \"הצג &לפני הדפסה\",\n\t\"Print Preview\": \"הצג לפני הדפסה\",\n\t\"Page Se&tup\": \"הגדרת &עמוד\",\n\t\"Page Setup\": \"הגדרת עמוד\",\n\t\"S&end\": \"של&יחה\",\n\t\"Send\": \"שליחה\",\n\t\"Set As &Wallpaper (Tiled)\": \"קבע כטפט (פר&וש)\",\n\t\"Set As Wallpaper (Tiled)\": \"קבע כטפט (פרוש)\",\n\t\"Set As Wa&llpaper (Centered)\": \"קבע כטפט (ב&מרכז)\",\n\t\"Set As Wallpaper (Centered)\": \"קבע כטפט (במרכז)\",\n\t\"Recent File\": \"קובץ אחרון\",\n\t\"E&xit\": \"י&ציאה\",\n\t\"Exit\": \"יציאה\",\n\t\"&Edit\": \"&עריכה\",\n\t\"Edit\": \"עריכה\",\n\t\"&Undo\": \"&בטל\",\n\t\"&Repeat\": \"&חזור על\",\n\t\"Repeat\": \"חזור על\",\n\t\"Ctrl+A\": \"Ctrl+L\",\n\t\"&View\": \"&תצוגה\",\n\t\"View\": \"תצוגה\",\n\t\"&Tool Box\": \"תיבת &כלים\",\n\t\"Tool Box\": \"תיבת כלים\",\n\t\"&Color Box\": \"תיבת &צבעים\",\n\t\"Color Box\": \"תיבת צבעים\",\n\t\"Ctrl+L\": \"Ctrl+A\",\n\t\"&Status Bar\": \"שורת &מצב\",\n\t\"Status Bar\": \"שורת מצב\",\n\t\"T&ext Toolbar\": \"סרגל הכלים &טקסט\",\n\t\"&Zoom\": \"מ&רחק מתצוגה\",\n\t\"Zoom\": \"מרחק מתצוגה\",\n\t\"&Normal Size\": \"&גודל רגיל\",\n\t\"Normal Size\": \"גודל רגיל\",\n\t\"&Large Size\": \"&תצוגה מוגדלת\",\n\t\"Large Size\": \"תצוגה מוגדלת\",\n\t\"C&ustom\": \"&התאמה אישית\",\n\t\"Custom\": \"התאמה אישית\",\n\t\"Show &Grid\": \"הצג &רשת\",\n\t\"Show Grid\": \"הצג רשת\",\n\t\"Show T&humbnail\": \"הצג תמונה ממו&זערת\",\n\t\"Show Thumbnail\": \"הצג תמונה ממוזערת\",\n\t\"&View Bitmap\": \"&הצג מפת סיביות\",\n\t\"View Bitmap\": \"הצג מפת סיביות\",\n\t\"&Image\": \"ת&מונה\",\n\t\"Image\": \"תמונה\",\n\t\"&Flip/Rotate\": \"&היפוך/סיבוב\",\n\t\"&Attributes\": \"&תכונות\",\n\t\"&Clear Image\": \"&נקה תמונה\",\n\t\"Clear Image\": \"נקה תמונה\",\n\t\"&Draw Opaque\": \"צייר &אטום\",\n\t\"Draw Opaque\": \"צייר אטום\",\n\t\"&Colors\": \"&צבעים\",\n\t\"&Edit Colors\": \"&עריכת צבעים\",\n\t\"Edit Colors\": \"עריכת צבעים\",\n\t\"&Help Topics\": \"&נושאי עזרה\",\n\t\"Help Topics\": \"נושאי עזרה\",\n\t\"&About Paint\": \"&אודות צייר\",\n\t\"About Paint\": \"אודות צייר\",\n\t\"&Update\": \"עד&כן\",\n\t\"Update\": \"עדכן\",\n\t\"Save Copy &As\": \"שמירת עותק &בשם\",\n\t\"Save Copy As\": \"שמירת עותק בשם\",\n\t\"Paint\": \"צייר\",\n\t\"untitled\": \"ללא שם\",\n\t\"Bitmap Image\": \"תמונת מפת סיביות\",\n\t\"Bitmap Files (*.bmp)\": \"קבצי מפת סיביות (‎*.bmp)\",\n\t\"PCX Files\": \"קבצי PCX\",\n\t\"Icon Files\": \"קבצי סמלים\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"מפת סיביות חד-צבעית (‎*.bmp;‎*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"מפת סיביות של 16 צבעים (‎*.bmp;‎*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"מפת סיביות של 256 צבעים (‎*.bmp;‎*.dib)\",\n\t\"Paint cannot open this file.\": \"‏‏אין אפשרות לפתוח קובץ זה בצייר.\",\n\t\"Paint cannot read this file.\": \"‏‏אין אפשרות לקרוא קובץ זה בצייר.\",\n\t\"This file is read-only.\": \"‏‏זהו קובץ לקריאה בלבד.\",\n\t\"To save your changes, use a different filename.\": \"לשמירת השינויים שביצעת השתמש בשם קובץ שונה.\",\n\t\"This file is already open.\": \"‏‏קובץ זה פתוח כבר.\",\n\t\"This is not a valid .PCS file.\": \"‏‏קובץ זה אינו קובץ ‎.PCS חוקי.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"‏‏קובץ זה פתוח לעריכה ואין אפשרות לכתוב עליו.\",\n\t\"Use a different filename to save your changes.\": \"השתמש בשם קובץ שונה לשמירת השינויים שביצעת.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"‏‏קובץ זה אינו קובץ מפת סיביות חוקי או שהתבנית שלו אינה נתמכת כעת.\",\n\t\"This is not a valid icon.\": \"‏‏סמל זה אינו חוקי.\",\n\t\"This is not a valid cursor.\": \"‏‏סמן זה אינו חוקי.\",\n\t\"Save was interrupted, so your file has not been saved.\": \"‏‏השמירה הופסקה, ולכן הקובץ שלך לא נשמר.\",\n\t\"You cannot save to a read-only file.\": \"‏‏אין אפשרות לשמור קובץ לקריאה בלבד.\",\n\t\"Use a different file name.\": \"השתמש בשם קובץ שונה.\",\n\t\"This file is already in use.\": \"‏‏קובץ זה נמצא כבר בשימוש.\",\n\t\"Close the program, and then try again.\": \"סגור את התוכנית ולאחר מכן נסה שנית.\",\n\t\"Paint cannot save this file.\": \"‏‏אין אפשרות לשמור קובץ זה בצייר.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"‏‏בצייר אין אפשרות לשמור סוג קובץ שונה תחת שם קובץ זהה.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"‏‏על מרווח הרשת להיות מספר שלם בטווח שבין %d ל- %d.\",\n\t\"There is not enough memory or resources to complete operation.\": \"‏‏אין די זיכרון או משאבים להשלמת הפעולה.\",\n\t\"Close some programs, and then try again.\": \"סגור מספר תוכניות ולאחר מכן נסה שנית.\",\n\t\"Low on memory or resources.\": \"‏‏אין די זיכרון או משאבים.\",\n\t\"Group error.\": \"‏‏שגיאת קבוצה.\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"‏‏אין אפשרות להדפיס את המסמך בצייר. ודא כי קיים די שטח דיסק והמדפסת פועלת כראוי.\",\n\t\"Saving into this format may cause some loss of color information.\": \"‏‏שמירה לתבנית זו עלולה לגרום לאובדן של חלק מהמידע אודות צבעים.\",\n\t\"Do you want to continue?\": \"האם ברצונך להמשיך?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"‏‏אין אפשרות לבטל את ביצוע ההמרה לשחור-לבן. פעולה זו משפיעה על הקובץ הנוכחי ועלולה לגרום לאובדן של חלק מהמידע אודות צבעים.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"‏‏מפות סיביות חייבות להיות גדולות יותר מפיקסל אחד בכל צד.\",\n\t\"Generic error.\": \"‏‏שגיאה כללית.\",\n\t\"File not found.\": \"‏‏הקובץ לא נמצא.\",\n\t\"Bad path.\": \"‏‏נתיב שגוי.\",\n\t\"Too many open files.\": \"‏‏קבצים רבים מדי פתוחים.\",\n\t\"Access denied.\": \"‏‏הגישה נדחתה.\",\n\t\"Invalid file.\": \"‏‏קובץ לא חוקי.\",\n\t\"Remove current folder.\": \"‏‏הסר את התיקיה הנוכחית.\",\n\t\"Folder full.\": \"‏‏התיקיה מלאה.\",\n\t\"Bad seek.\": \"‏‏חיפוש שגוי.\",\n\t\"Hard IO error.\": \"‏‏שגיאת קלט/פלט קשה.\",\n\t\"Sharing violation.\": \"‏‏הפרת זכויות גישה.\",\n\t\"Lock violation.\": \"‏‏הפרת נעילה.\",\n\t\"Disk full.\": \"‏‏הדיסק מלא.\",\n\t\"End of file.\": \"‏‏סוף הקובץ.\",\n\t\"Error getting the Clipboard Data!\": \"‏‏שגיאה בקבלת נתוני הלוח!\",\n\t\"No Printer Found @ page setup\": \"‏‏לא נמצאה מדפסת @ הגדרת עמוד\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"מפת סיביות של 24 סיביות (‎*.bmp;‎*.dib)\",\n\t\"All Files\": \"כל הקבצים\",\n\t\"Palette|*.pal|\": \"לוח צבעים|‎*.pal|\",\n\t\"OLE 2.0 was unable to start.\": \"‏‏הפעלת OLE 2.0 לא הצליחה.\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"ודא כי אתה משתמש בגירסה הנכונה של ספריות OLE.\",\n\t\"Resets the text be without any attributes.\": \"הסרת כל התכונות מהטקסט.\",\n\t\"Sets or clears the text bold attribute.\": \"קביעה או הסרה של התכונה הדגשת טקסט.\",\n\t\"Sets or clears the text italic attribute.\": \"קביעה או הסרה של התכונה הטיית טקסט.\",\n\t\"Selects the font used by the text.\": \"בחירת הגופן לשימוש בטקסט.\",\n\t\"Selects the point size of the text.\": \"בחירת הגודל בנקודות של הטקסט.\",\n\t\"Sets or clears the text underline attribute.\": \"קביעה או הסרה של התכונה קו תחתון.\",\n\t\"Shows or hides the tooltips.\": \"הצגה או הסתרה של תיאורי הכלים.\",\n\t\"Show Paint Help.\": \"הצגת העזרה לצייר.\",\n\t\"Sends a picture by using mail or fax.\": \"שליחת תמונה באמצעות דואר או פקס.‏\",\n\t\"Copies the selection to a file.\": \"העתקת הקטע הנבחר לקובץ.\",\n\t\"Pastes a file into the selection.\": \"הדבקת קובץ לתוך הקטע הנבחר.\",\n\t\"Zooms the picture to 100%.\": \"שינוי המרחק מהתמונה ל- ‎100%‎.\",\n\t\"Zooms the picture to 400%.\": \"שינוי המרחק מהתמונה ל- ‎400%‎.\",\n\t\"Zooms the picture.\": \"שינוי המרחק מהתמונה.\",\n\t\"Displays the entire picture.\": \"הצגת התמונה כולה.\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"הצגה או הסתרה של תצוגת התמונה הממוזערת.\",\n\t\"Shows or hides the grid.\": \"הצגה או הסתרה של הרשת.\",\n\t\"Shows or hides the text toolbar.\": \"הצגה או הסתרה של סרגל הכלים טקסט.\",\n\t\"Flips or rotates the picture or a selection.\": \"היפוך או סיבוב של התמונה או הקטע הנבחר.\",\n\t\"Stretches or skews the picture or a selection.\": \"מתיחה או הטיה של התמונה או הקטע הנבחר.\",\n\t\"Inverts the colors of the picture or a selection.\": \"היפוך הצבעים של התמונה או הקטע הנבחר.\",\n\t\"Changes the attributes of the picture.\": \"שינוי התכונות של התמונה.\",\n\t\"Clears the picture or selection.\": \"ניקוי התמונה או הקטע הנבחר.\",\n\t\"The font size must be a numeric value.\": \"‏‏על גודל הגופן להיות ערך מספרי.\",\n\t\"Contains commands for working with the selected item(s).\": \"מכיל פקודות לעבודה עם הפריטים הנבחרים.\",\n\t\"Contains commands for selecting and transferring items.\": \"מכיל פקודות לבחירה והעברה של פריטים.\",\n\t\"Contains commands for customizing this window.\": \"מכיל פקודות להתאמה אישית של חלון זה.\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"מכיל פקודות לטיפול בתמונות והגדרת תכונות.\",\n\t\"Contains commands for using custom colors and drawing options.\": \"מכיל פקודות לשימוש בצבעים מותאמים אישית ובאפשרויות ציור.\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"מכיל פקודות להצגת עזרה ומידע אודות צייר.\",\n\t\"Cannot save file.\": \"‏‏אין אפשרות לשמור את הקובץ.\",\n\t\"Error removing temporary file.\": \"‏‏שגיאה בהסרת הקובץ הזמני.\",\n\t\"Get Colors\": \"קבלת צבעים\",\n\t\"Save Colors\": \"שמירת צבעים\",\n\t\"File last saved:\": \"הקובץ נשמר לאחרונה:\",\n\t\"Not Available\": \"לא זמין\",\n\t\"Size on disk:\": \"גודל בדיסק:\",\n\t\"%s bytes\": \"%s בתים\",\n\t\"Painting\": \"ציור\",\n\t\"Bitmap\": \"מפת סיביות\",\n\t\"Fonts\": \"גופנים\",\n\t\"Tools\": \"כלים\",\n\t\"All Picture Files\": \"כל קבצי התמונה\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"לקבלת עזרה, לחץ על נושאי עזרה בתפריט עזרה.\",\n\t\"Select an area on which to get Help.\": \"בחר אזור לשם קבלת עזרה אודותיו.\",\n\t\"%1 in %2\": \"%1 ב- %2\",\n\t\"Creates a new document.\": \"יצירת מסמך חדש.\",\n\t\"Opens an existing document.\": \"פתיחת מסמך קיים.\",\n\t\"Closes the active document.\": \"סגירת המסמך הפעיל.\",\n\t\"Saves the active document.\": \"שמירת המסמך הפעיל.\",\n\t\"Saves the active document with a new name.\": \"שמירת המסמך הפעיל תחת שם חדש.\",\n\t\"Changes the page layout.\": \"שינוי עיצוב העמוד.\",\n\t\"Specifies the default printer setup.\": \"ציון הגדרת מדפסת ברירת המחדל.\",\n\t\"Prints the active document and sets printing options.\": \"הדפסת המסמך הפעיל וקביעת אפשרויות הדפסה.\",\n\t\"Displays full pages.\": \"הצגת עמודים מלאים.\",\n\t\"Opens this document.\": \"פתיחת מסמך זה.\",\n\t\"Deletes the selection.\": \"מחיקת הקטע הנבחר.\",\n\t\"Erases everything.\": \"מחיקת הכל.\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"העתקת הקטע הנבחר ומיקומו בלוח.\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"גזירת הקטע הנבחר ומיקומו בלוח.\",\n\t\"Finds the specified text.\": \"חיפוש הטקסט שצויין.\",\n\t\"Inserts the contents of the Clipboard.\": \"הוספת תוכן הלוח.\",\n\t\"Repeats the last action.\": \"חזרה על הפעולה האחרונה.\",\n\t\"Replaces specific text with different text.\": \"החלפת טקסט ספציפי בטקסט אחר.\",\n\t\"Selects everything.\": \"בחירת הכל.\",\n\t\"Undoes the last action.\": \"ביטול הפעולה האחרונה.\",\n\t\"Redoes the previously undone action.\": \"ביצוע מחדש של הפעולה שבוטלה קודם לכן.\",\n\t\"Displays program information, version number, and copyright.\": \"הצגת מידע אודות התוכנית, מספר גירסה וזכויות יוצרים.\",\n\t\"Quits Paint.\": \"יציאה מצייר.\",\n\t\"Opens Paint Help.\": \"פתיחת העזרה לצייר.\",\n\t\"Displays instructions about how to use Help.\": \"הצגת הוראות אודות אופן השימוש בעזרה.\",\n\t\"Displays Help for areas you click on.\": \"הצגת עזרה עבור אזורים עליהם אתה לוחץ.\",\n\t\"Displays Help for the current task or command.\": \"הצגת עזרה עבור המשימה או הפקודה הנוכחית.\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"מרכוז מפת סיביות זו כטפט שולחן העבודה.\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"פרישת מפת סיביות זו כטפט שולחן העבודה.\",\n\t\"Sends the selection using mail or fax.\": \"שליחת הקטע הנבחר באמצעות דואר או פקס.\",\n\t\"Prints the selection.\": \"הדפסת הקטע הנבחר.\",\n\t\"Shows or hides the thumbnail.\": \"הצגה או הסתרה של התמונה הממוזערת.\",\n\t\"Shows Paint Help.\": \"הצגת העזרה לצייר.\",\n\t\"Shows or hides the status bar.\": \"הצגה או הסתרה של שורת המצב.\",\n\t\"Shows or hides the tool box.\": \"הצגה או הסתרה של תיבת הכלים.\",\n\t\"Shows or hides the color box.\": \"הצגה או הסתרה של תיבת הצבעים.\",\n\t\"Only a Far East font can be used for vertical editing.\": \"ניתן להשתמש רק בגופן של המזרח הרחוק עבור עריכה אנכית.\",\n\t\"Changes the window size.\": \"שינוי גודל החלון.\",\n\t\"Changes the window position.\": \"שינוי מיקום החלון.\",\n\t\"Reduces the window to an icon.\": \"הקטנת החלון לסמל.\",\n\t\"Enlarges the window to full size.\": \"הגדלת החלון לגודל מלא.\",\n\t\"Switches to the next document window.\": \"מעבר לחלון המסמך הבא.\",\n\t\"Switches to the previous document window.\": \"מעבר לחלון המסמך הקודם.\",\n\t\"Closes the active window and asks if you want to save changes.\": \"סגירת החלון הפעיל והצגת שאלה אם ברצונך לשמור שינויים.\",\n\t\"Restores the window to normal size.\": \"החזרת החלון לגודל הרגיל.\",\n\t\"Activates the task list.\": \"הפעלת רשימת המשימות.\",\n\t\"All Files (*.*)\": \"כל הקבצים (*.*)\",\n\t\"Untitled\": \"ללא שם\",\n\t\"an unnamed file\": \"קובץ ללא שם\",\n\t\"&Hide\": \"ה&סתר\",\n\t\"Hide\": \"הסתר\",\n\t\"No error message is available.\": \"‏‏אין הודעת שגיאה זמינה.\",\n\t\"An unsupported operation was attempted.\": \"‏‏בוצע ניסיון לבצע פעולה שאינה נתמכת.\",\n\t\"A required resource was unavailable.\": \"‏‏משאב נחוץ לא היה זמין.\",\n\t\"Out of memory.\": \"‏‏אין זיכרון פנוי.\",\n\t\"An unknown error has occurred.\": \"‏‏אירעה שגיאה לא מוכרת.\",\n\t\"on %1\": \"ב- %1\",\n\t\"&One Page\": \"עמוד &אחד\",\n\t\"One Page\": \"עמוד אחד\",\n\t\"&Two Page\": \"&שני עמודים\",\n\t\"Two Page\": \"שני עמודים\",\n\t\"Page %u\": \"עמוד %u\",\n\t\"Pages %u-%u\": \"עמודים %u-%u\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"קבצי מדפסת (*.prn)|*.prn|כל הקבצים (*.*)|*.*||\",\n\t\"Print to File\": \"הדפסה לקובץ\",\n\t\"to %1\": \"ל- %1\",\n\t\"&Update %1\": \"&עדכן את %1\",\n\t\"Update %1\": \"עדכן את %1\",\n\t\"E&xit && Return to %1\": \"י&ציאה וחזרה אל %1\",\n\t\"Exit & Return to %1\": \"יציאה וחזרה אל %1\",\n\t\"Linked %s\": \"%s מקושר\",\n\t\"Unknown Type\": \"‏‏סוג לא מוכר\",\n\t\"Invalid filename.\": \"‏‏שם קובץ לא חוקי.\",\n\t\"Failed to open document.\": \"‏‏פתיחת המסמך נכשלה.\",\n\t\"Failed to save document.\": \"‏‏שמירת המסמך נכשלה.\",\n\t\"Save changes to %1?\": \"‏‏האם לשמור שינויים ב- %1?\",\n\t\"Failed to create empty document.\": \"‏‏יצירת מסמך ריק נכשלה.\",\n\t\"The file is too large to open.\": \"‏‏הקובץ גדול מכדי שניתן יהיה לפתוח אותו.\",\n\t\"Could not start print job.\": \"‏‏הפעלת עבודת הדפסה לא הצליחה.\",\n\t\"Failed to launch help.\": \"‏‏הפעלת עזרה נכשלה.\",\n\t\"Internal application error.\": \"‏‏שגיאה פנימית ביישום.\",\n\t\"Command failed.\": \"‏‏הפקודה נכשלה.\",\n\t\"Insufficient memory to perform operation.\": \"‏‏אין די זיכרון לביצוע הפעולה.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"‏‏ערכי רישום המערכת הוסרו וקובץ ה- INI (אם קיים) נמחק.\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"‏‏לא כל ערכי רישום המערכת (או קובץ INI) הוסרו.\",\n\t\"This program requires the file %s, which was not found on this system.\": \"‏‏לתוכנית זו נחוץ הקובץ %s שלא נמצא במערכת זו.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"‏‏תוכנית זו מקושרת ל- %s של הייצוא החסר בקובץ %s. ייתכן כי במחשב זה קיימת גירסה לא תואמת של %s.\",\n\t\"Please enter an integer.\": \"‏‏הזן מספר שלם.\",\n\t\"Please enter a number.\": \"‏‏הזן מספר.\",\n\t\"Please enter an integer between %1 and %2.\": \"‏‏הזן מספר שלם בטווח שבין %1 ל- %2.\",\n\t\"Please enter a number between %1 and %2.\": \"‏‏הזן מספר שלם בטווח שבין %1 ל- %2.\",\n\t\"Please enter no more than %1 characters.\": \"‏‏אל תזין יותר מ- %1 תווים.\",\n\t\"Please select a button.\": \"‏‏בחר לחצן.\",\n\t\"Please enter an integer between 0 and 255.\": \"‏‏הזן מספר שלם בטווח שבין 0  ל-255.\",\n\t\"Please enter a positive integer.\": \"‏‏הזן מספר שלם חיובי.\",\n\t\"Please enter a date and/or time.\": \"‏‏הזן תאריך ו/שעה.\",\n\t\"Please enter a currency.\": \"‏‏הזן מטבע.\",\n\t\"Unexpected file format.\": \"‏‏תבנית קובץ לא צפויה.\",\n\t\"%1\": \"‏‏%1\",\n\t\"Cannot find this file.\": \"קובץ זה לא נמצא.\",\n\t\"Please verify that the correct path and file name are given.\": \"ודא כי הנתיב ושם הקובץ הנתונים נכונים.\",\n\t\"Destination disk drive is full.\": \"‏‏כונן הדיסקים המשמש כיעד מלא.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"‏‏אין אפשרות לקרוא מתוך %1, הפריט פתוח על-ידי משתמש אחר.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"‏‏אין אפשרות לכתוב אל %1, הפריט לקריאה בלבד או פתוח על-ידי משתמש אחר.\",\n\t\"An unexpected error occurred while reading %1.\": \"‏‏אירעה שגיאה לא צפויה בעת קריאת %1.\",\n\t\"An unexpected error occurred while writing %1.\": \"‏‏אירעה שגיאה לא צפויה בעת כתיבת %1.\",\n\t\"Unable to register document.\": \"אין אפשרות לרשום את המסמך.\",\n\t\"The document may already be open.\": \"ייתכן כי המסמך כבר פתוח.\",\n\t\"Update %1 before proceeding?\": \"‏‏האם לעדכן את %1 לפני המשך העבודה?\",\n\t\"Could not update client.\": \"‏‏עדכון הלקוח לא הצליח.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"‏‏הרישום נכשל. ייתכן כי תכונות ActiveX אינן פועלות כראוי.\",\n\t\"Failed to update the system registry.\": \"‏‏עדכון רישום המערכת נכשל.\",\n\t\"Please try using REGEDIT.\": \"נסה להשתמש ב- REGEDIT.\",\n\t\"Unable to read write-only property.\": \"‏‏אין אפשרות לקרוא מאפיין לכתיבה בלבד.\",\n\t\"Unable to write read-only property.\": \"‏‏אין אפשרות לכתוב מאפיין לקריאה בלבד.\",\n\t\"Unable to load mail system support.\": \"‏‏אין אפשרות לטעון תמיכה במערכת דואר.\",\n\t\"Mail system DLL is invalid.\": \"‏‏DLL של מערכת דואר אינו חוקי.\",\n\t\"Send Mail failed to send message.\": \"‏‏שליחת הודעה באמצעות Send Mail נכשלה.\",\n\t\"No error occurred.\": \"‏‏לא אירעה שגיאה.\",\n\t\"An unknown error occurred while accessing %1.\": \"‏‏אירעה שגיאה לא מוכרת בעת גישה ל- %1.\",\n\t\"%1 was not found.\": \"‏‏%1 לא נמצא.\",\n\t\"%1 contains an invalid path.\": \"‏‏%1 מכיל נתיב לא חוקי.\",\n\t\"%1 could not be opened because there are too many open files.\": \"‏‏פתיחת %1 לא הצליחה משום שקבצים רבים מדי פתוחים.\",\n\t\"Access to %1 was denied.\": \"‏‏הגישה ל- %1 נדחתה.\",\n\t\"An invalid file handle was associated with %1.\": \"‏‏מזהה ייחודי (handle) לא חוקי של קובץ שוייך אל %1.\",\n\t\"%1 could not be removed because it is the current directory.\": \"‏‏הסרת %1 לא הצליחה משום שזו הספריה הנוכחית.\",\n\t\"%1 could not be created because the directory is full.\": \"‏‏יצירת %1 לא הצליחה משום שהספריה מלאה.\",\n\t\"Seek failed on %1\": \"‏‏פעולת Seek נכשלה ב- %1\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"‏‏דווח על שגיאת קלט/פלט בחומרה בעת גישה ל- %1.\",\n\t\"A sharing violation occurred while accessing %1.\": \"‏‏אירעה הפרת זכויות גישה בעת גישה ל- %1.\",\n\t\"A locking violation occurred while accessing %1.\": \"‏‏אירעה הפרת נעילה בעת גישה ל- %1.\",\n\t\"Disk full while accessing %1.\": \"‏‏דיסק מלא בעת גישה ל- %1.\",\n\t\"An attempt was made to access %1 past its end.\": \"‏‏בוצע נסיון גישה ל- %1 מעבר לקצהו.\",\n\t\"An attempt was made to write to the reading %1.\": \"‏‏בוצע ניסיון לכתוב אל %1 המוגדר לקריאה.\",\n\t\"An attempt was made to read from the writing %1.\": \"‏‏בוצע ניסיון לקרוא מתוך %1 המוגדר לכתיבה.\",\n\t\"%1 has a bad format.\": \"‏‏ל- %1 תבנית שגויה.\",\n\t\"%1 contained an unexpected object.\": \"‏‏%1 הכיל אובייקט לא צפוי.\",\n\t\"%1 contains an incorrect schema.\": \"‏‏%1 מכיל סכימה שגויה.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"בחירת קטע מלבני מהתמונה לשם הזזה, העתקה או עריכה.\",\n\t\"Select\": \"בחירה\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"בחירת קטע בעל צורה חופשית מהתמונה לשם הזזה, העתקה או עריכה.\",\n\t\"Free-Form Select\": \"בחירה חופשית\",\n\t\"Inserts text into the picture.\": \"הוספת טקסט לתוך התמונה.\",\n\t\"Fills an area with the current drawing color.\": \"מילוי אזור בצבע הציור הנוכחי.\",\n\t\"Fill With Color\": \"מילוי בצבע\",\n\t\"Draws a straight line with the selected line width.\": \"ציור קו ישר בעובי הקו הנבחר.\",\n\t\"Line\": \"קו\",\n\t\"Draws using an airbrush of the selected size.\": \"ציור באמצעות מברשת אוויר בגודל הנבחר.\",\n\t\"Airbrush\": \"מברשת אוויר\",\n\t\"Draws a curved line with the selected line width.\": \"ציור קו מעוקל בעובי הקו הנבחר.\",\n\t\"Curve\": \"עיקול\",\n\t\"Draws a polygon with the selected fill style.\": \"ציור מצולע בסגנון המילוי הנבחר.\",\n\t\"Polygon\": \"מצולע\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"ציור מלבן מעוגל בסגנון המילוי הנבחר.\",\n\t\"Rounded Rectangle\": \"מלבן מעוגל\",\n\t\"Draws a free-form line one pixel wide.\": \"ציור קו בעל צורה חופשית בעובי פיקסל אחד.\",\n\t\"Pencil\": \"עיפרון\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"מחיקת קטע מהתמונה באמצעות צורת המחק הנבחרת.\",\n\t\"Eraser/Color Eraser\": \"מחק/מחק צבעוני\",\n\t\"Changes the magnification.\": \"שינוי המרחק מהתצוגה.\",\n\t\"Magnifier\": \"זכוכית מגדלת\",\n\t\"Picks up a color from the picture for drawing.\": \"בחירת צבע מהתמונה לשם ציור.\",\n\t\"Pick Color\": \"בחירת צבע\",\n\t\"Draws using a brush with the selected shape and size.\": \"ציור באמצעות מברשת בצורה ובגודל הנבחרים.\",\n\t\"Brush\": \"מברשת\",\n\t\"Draws a rectangle with the selected fill style.\": \"ציור מלבן בסגנון המילוי הנבחר.\",\n\t\"Rectangle\": \"מלבן\",\n\t\"Draws a filled rectangle.\": \"ציור מלבן עם מילוי.\",\n\t\"Draws an ellipse with the selected fill style.\": \"ציור אליפסה בסגנון המילוי הנבחר.\",\n\t\"Ellipse\": \"אליפסה\",\n\t\"Draws a filled ellipse.\": \"ציור אליפסה עם מילוי.\",\n\t\"Makes the current selection either opaque or transparent.\": \"‏‏הפיכת הקטע הנבחר הנוכחי לאטום או שקוף.\",\n\t\"Creates a new color.\": \"יצירת צבע חדש.\",\n\t\"Uses a previously saved palette of colors.\": \"שימוש בלוח צבעים שנשמר קודם.\",\n\t\"Saves the current palette of colors to a file.\": \"שמירת לוח הצבעים הנוכחי בקובץ.‏\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"‏‏עליך לשמור את הקובץ לפני בחירתו כטפט.\",\n\t\"The selection is now larger than the bitmap.\": \"‏‏הקטע הנבחר כעת גדול יותר ממפת הסיביות.\",\n\t\"Would you like the bitmap enlarged?\": \"האם ברצונך להגדיל את מפת הסיביות?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"‏‏התמונה בלוח גדולה יותר ממפת הסיביות.\",\n\t\"The file is not in the correct format.\": \"‏‏הקובץ אינו בתבנית הנכונה.\",\n\t\"Not enough room to paste text.\": \"‏‏אין די מקום להדבקת הטקסט.\",\n\t\"Enlarge the text area and try again.\": \"הגדל את אזור הטקסט ונסה שנית.\",\n\t\"Places the text.\": \"מיקום הטקסט.\"\n});\n"
  },
  {
    "path": "localization/hu/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"hu\", {\n\t\"Attributes\": \"Tulajdonságok\",\n\t\"&Width:\": \"S&zélesség:\",\n\t\"Width:\": \"Szélesség:\",\n\t\"&Height:\": \"&Magasság:\",\n\t\"Height:\": \"Magasság:\",\n\t\"Units\": \"Egység\",\n\t\"&Inches\": \"&hüvelyk\",\n\t\"Inches\": \"hüvelyk\",\n\t\"C&m\": \"&cm\",\n\t\"Cm\": \"cm\",\n\t\"&Pixels\": \"&képpont\",\n\t\"Pixels\": \"képpont\",\n\t\"Colors\": \"Színek\",\n\t\"&Black and white\": \"&Fekete-fehér\",\n\t\"Black and white\": \"Fekete-fehér\",\n\t\"Co&lors\": \"&Színes\",\n\t\"Transparency\": \"Áttetszőség\",\n\t\"Use &Transparent background color\": \"Á&tlátszó háttérszín használata\",\n\t\"Use Transparent background color\": \"Átlátszó háttérszín használata\",\n\t\"Select &Color\": \"Szí&n választása\",\n\t\"Select Color\": \"Szín választása\",\n\t\"Cancel\": \"Mégse\",\n\t\"&Default\": \"&Alapértelmezett\",\n\t\"Default\": \"Alapértelmezett\",\n\t\"Custom Zoom\": \"Egyéni méret\",\n\t\"Current zoom:\": \"Jelenlegi méret:\",\n\t\"Zoom to\": \"Nagyítás\",\n\t\"Flip and Rotate\": \"Tükrözés és forgatás\",\n\t\"Flip or rotate\": \"Tükrözés és forgatás\",\n\t\"&Flip horizontal\": \"&Vízszintes tükrözés\",\n\t\"Flip horizontal\": \"Vízszintes tükrözés\",\n\t\"Flip &vertical\": \"Függőleges &tükrözés\",\n\t\"Flip vertical\": \"Függőleges tükrözés\",\n\t\"&Rotate by angle\": \"&Forgatás\",\n\t\"Rotate by angle\": \"Forgatás\",\n\t\"Stretch and Skew\": \"Nyújtás és döntés\",\n\t\"Stretch\": \"Nyújtás\",\n\t\"&Horizontal:\": \"&Vízszintes:\",\n\t\"Horizontal:\": \"Vízszintes:\",\n\t\"&Vertical:\": \"&Függőleges:\",\n\t\"Vertical:\": \"Függőleges:\",\n\t\"Skew\": \"Döntés\",\n\t\"H&orizontal:\": \"Ví&zszintes:\",\n\t\"Degrees\": \"fok\",\n\t\"V&ertical:\": \"Függől&eges:\",\n\t\"Color Table\": \"Színtábla\",\n\t\"New\": \"Új\",\n\t\"&New \": \"Ú&j\",\n\t\"New \": \"Új\",\n\t\"&Help\": \"&Súgó\",\n\t\"Help\": \"Súgó\",\n\t\"Printing\": \"Nyomtatott dokumentum:\",\n\t\"on the\": \"Nyomtató:\",\n\t\"&Print\": \"Ny&omtatás\",\n\t\"Print\": \"Nyomtatás\",\n\t\"&Next Page\": \"Kö&vetkező oldal\",\n\t\"Next Page\": \"Következő oldal\",\n\t\"Pre&v Page\": \"Előző ol&dal\",\n\t\"Prev Page\": \"Előző oldal\",\n\t\"Zoom &In\": \"&Nagyítás\",\n\t\"Zoom In\": \"Nagyítás\",\n\t\"Zoom &Out\": \"K&icsinyítés\",\n\t\"Zoom Out\": \"Kicsinyítés\",\n\t\"&Close\": \"&Bezárás\",\n\t\"Close\": \"Bezárás\",\n\t\"Grid Settings\": \"Rács beállításai\",\n\t\"&Pixel Grid\": \"&Képpontokként\",\n\t\"Pixel Grid\": \"Képpontokként\",\n\t\"&Tile Grid\": \"&Egyéni\",\n\t\"Tile Grid\": \"Egyéni\",\n\t\"pixels\": \"képpont\",\n\t\"H&eight:\": \"&Magasság:\",\n\t\"Text\": \"Szöveg\",\n\t\"Undo\": \"Visszavonás\",\n\t\"Cut\": \"Kivágás \",\n\t\"Copy\": \"Másolás \",\n\t\"Paste\": \"Beillesztés\",\n\t\"Clear Selection\": \"Kijelölés törlése\",\n\t\"Select All\": \"Mindet kijelöli\",\n\t\"Text Toolbar\": \"Szöveg eszköztár\",\n\t\"Selection\": \"Kijelölés\",\n\t\"Cu&t\": \"&Kivágás \",\n\t\"&Copy\": \"&Másolás \",\n\t\"&Paste\": \"&Beillesztés\",\n\t\"C&lear Selection\": \"Kijelölés &törlése\",\n\t\"Select &All\": \"Min&det kijelöli\",\n\t\"C&opy To\": \"Fájlba más&olás\",\n\t\"Copy To\": \"Fájlba másolás\",\n\t\"Paste &From\": \"Fájl beilles&ztése\",\n\t\"Paste From\": \"Fájl beillesztése\",\n\t\"Flip/&Rotate\": \"Tükrözés/&Forgatás\",\n\t\"Flip/Rotate\": \"Tükrözés/Forgatás\",\n\t\"&Stretch/Skew\": \"&Nyújtás/Döntés\",\n\t\"Stretch/Skew\": \"Nyújtás/Döntés\",\n\t\"&Invert Colors\": \"&Színek megfordítása\",\n\t\"Invert Colors\": \"Színek megfordítása\",\n\t\"Thumbnail\": \"Vázlat\",\n\t\"&File\": \"&Fájl \",\n\t\"File\": \"Fájl \",\n\t\"&New\": \"Ú&j\",\n\t\"&Open\": \"&Megnyitás\",\n\t\"Open\": \"Megnyitás\",\n\t\"&Save\": \"M&entés\",\n\t\"Save\": \"Mentés\",\n\t\"Save &As\": \"Menté&s másként\",\n\t\"Save As\": \"Mentés másként\",\n\t\"Print Pre&view\": \"Nyom&tatási kép\",\n\t\"Print Preview\": \"Nyomtatási kép\",\n\t\"Page Se&tup\": \"&Oldalbeállítás\",\n\t\"Page Setup\": \"Oldalbeállítás\",\n\t\"S&end\": \"Kül&dés\",\n\t\"Send\": \"Küldés\",\n\t\"Set As &Wallpaper (Tiled)\": \"&Felhasználás tapétaként (Mozaik)\",\n\t\"Set As Wallpaper (Tiled)\": \"Felhasználás tapétaként (Mozaik)\",\n\t\"Set As Wa&llpaper (Centered)\": \"Fel&használás tapétaként (Középre)\",\n\t\"Set As Wallpaper (Centered)\": \"Felhasználás tapétaként (Középre)\",\n\t\"Recent File\": \"Legutóbbi fájl\",\n\t\"E&xit\": \"&Kilépés\",\n\t\"Exit\": \"Kilépés\",\n\t\"&Edit\": \"S&zerkesztés\",\n\t\"Edit\": \"Szerkesztés\",\n\t\"&Undo\": \"&Visszavonás\",\n\t\"&Repeat\": \"&Ismét\",\n\t\"Repeat\": \"Ismét\",\n\t\"&View\": \"&Nézet \",\n\t\"View\": \"Nézet \",\n\t\"&Tool Box\": \"S&zerszámkészlet\",\n\t\"Tool Box\": \"Szerszámkészlet\",\n\t\"&Color Box\": \"P&aletta\",\n\t\"Color Box\": \"Paletta\",\n\t\"Ctrl+L\": \"Ctrl+A\",\n\t\"&Status Bar\": \"Állapot&sor\",\n\t\"Status Bar\": \"Állapotsor\",\n\t\"T&ext Toolbar\": \"Szöveg eszköz&tár\",\n\t\"&Zoom\": \"&Nagyítás\",\n\t\"Zoom\": \"Nagyítás\",\n\t\"&Normal Size\": \"&Normál méret\",\n\t\"Normal Size\": \"Normál méret\",\n\t\"&Large Size\": \"Nagy &méret\",\n\t\"Large Size\": \"Nagy méret\",\n\t\"C&ustom\": \"&Egyéni beállítás\",\n\t\"Custom\": \"Egyéni beállítás\",\n\t\"Show &Grid\": \"&Rács megjelenítése\",\n\t\"Show Grid\": \"Rács megjelenítése\",\n\t\"Show T&humbnail\": \"&Vázlat megjelenítése\",\n\t\"Show Thumbnail\": \"Vázlat megjelenítése\",\n\t\"&View Bitmap\": \"&Bitkép megjelenítése\",\n\t\"View Bitmap\": \"Bitkép megjelenítése\",\n\t\"&Image\": \"&Kép\",\n\t\"Image\": \"Kép\",\n\t\"&Flip/Rotate\": \"Tükrözés/&Forgatás\",\n\t\"&Attributes\": \"&Tulajdonságok\",\n\t\"&Clear Image\": \"&Kép törlése\",\n\t\"Clear Image\": \"Kép törlése\",\n\t\"&Draw Opaque\": \"Ne&m átlátszó\",\n\t\"Draw Opaque\": \"Nem átlátszó\",\n\t\"&Colors\": \"Szín&ek\",\n\t\"&Edit Colors\": \"&Színek szerkesztése\",\n\t\"Edit Colors\": \"Színek szerkesztése\",\n\t\"&Help Topics\": \"&Tartalom\",\n\t\"Help Topics\": \"Tartalom\",\n\t\"&About Paint\": \"&Névjegy\",\n\t\"About Paint\": \"Névjegy\",\n\t\"&Update\": \"&Frissítés\",\n\t\"Update\": \"Frissítés\",\n\t\"Save Copy &As\": \"&Másolat mentése másként\",\n\t\"Save Copy As\": \"Másolat mentése másként\",\n\t\"untitled\": \"névtelen\",\n\t\"Bitmap Image\": \"Bitkép\",\n\t\"Bitmap Files (*.bmp)\": \"Bitkép fájlok (*.bmp)\",\n\t\"PCX Files\": \"PCX fájl\",\n\t\"Icon Files\": \"Ikon fájl\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"Fekete-fehér bitkép (*.bmp;*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"16 színű bitkép (*.bmp;*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"256 színű bitkép (*.bmp;*.dib)\",\n\t\"Paint cannot open this file.\": \"A Paint nem tudja megnyitni ezt a fájlt.\",\n\t\"Paint cannot read this file.\": \"A Paint nem tudja olvasni ezt a fájlt.\",\n\t\"This file is read-only.\": \"A fájl írásvédett.\",\n\t\"To save your changes, use a different filename.\": \"A módosítások mentéséhez használjon más fájlnevet.\",\n\t\"This file is already open.\": \"A fájl már meg van nyitva.\",\n\t\"This is not a valid .PCS file.\": \"Érvénytelen .PCS fájl\",\n\t\"This file is open for editing and cannot be overwritten.\": \"A fájl szerkesztésre van megnyitva, és nem lehet felülírni.\",\n\t\"Use a different filename to save your changes.\": \"A módosítások mentéséhez használjon más fájlnevet.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"Érvénytelen bitkép fájl, vagy a formátuma nem támogatott.\",\n\t\"This is not a valid icon.\": \"Érvénytelen ikon\",\n\t\"This is not a valid cursor.\": \"Érvénytelen kurzor\",\n\t\"Save was interrupted, so your file has not been saved.\": \"A mentés megszakadt, a fájl mentésére nem került sor.\",\n\t\"You cannot save to a read-only file.\": \"Írásvédett fájlba nem lehet menteni.\",\n\t\"Use a different file name.\": \"Használjon más fájlnevet.\",\n\t\"This file is already in use.\": \"A fájl már használatban van.\",\n\t\"Close the program, and then try again.\": \"Zárja be a programot, majd próbálkozzon újra.\",\n\t\"Paint cannot save this file.\": \"A Paint nem tudja menteni ezt a fájlt.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"A Paint nem tudja menteni a fájlt ugyanazzal a fájlnévvel, de más fájltípussal.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"A rácsköznek %d és %d közötti egész számnak kell lennie.\",\n\t\"There is not enough memory or resources to complete operation.\": \"Nincs elegendő memória vagy erőforrás a művelet befejezéséhez.\",\n\t\"Close some programs, and then try again.\": \"Zárjon be néhány programot, majd próbálkozzon újra.\",\n\t\"Low on memory or resources.\": \"Kevés a memória vagy az  erőforrás.\",\n\t\"Group error.\": \"Csoporthiba\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"A Paint nem tudta a dokumentumot kinyomtatni. Győződjön meg arról, hogy van elegendő szabad hely a merevlemezen, és arról, hogy a nyomtató megfelelően működik.\",\n\t\"Saving into this format may cause some loss of color information.\": \"Ha ebben a formátumban ment, színveszteséget okozhat.\",\n\t\"Do you want to continue?\": \"Biztosan folytatja?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"A fekete-fehér konverzió nem vonható vissza.  Ez a művelet a színinformáció elvesztésével jár.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"A bitkép minden oldalának legalább két képpont szélesnek kell lennie.\",\n\t\"Generic error.\": \"Általános hiba\",\n\t\"File not found.\": \"A fájl nem található.\",\n\t\"Bad path.\": \"Rossz elérési út\",\n\t\"Too many open files.\": \"Túl sok fájl van megnyitva.\",\n\t\"Access denied.\": \"A hozzáférés megtagadva.\",\n\t\"Invalid file.\": \"Érvénytelen fájl\",\n\t\"Remove current folder.\": \"Távolítsa el az aktuális mappát.\",\n\t\"Folder full.\": \"A mappa megtelt.\",\n\t\"Bad seek.\": \"Rossz keresés\",\n\t\"Hard IO error.\": \"Súlyos IO hiba\",\n\t\"Sharing violation.\": \"Megosztásmegsértés\",\n\t\"Lock violation.\": \"Zárolásmegsértés\",\n\t\"Disk full.\": \"A lemez megtelt.\",\n\t\"End of file.\": \"Vége van a fájlnak.\",\n\t\"Error getting the Clipboard Data!\": \"Hiba a Vágólap adatainak vételekor!\",\n\t\"No Printer Found @ page setup\": \"Nem található nyomtató @ oldalbeállítás\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"24 bites bitkép (*.bmp;*.dib)\",\n\t\"All Files\": \"Minden fájl\",\n\t\"Palette|*.pal|\": \"Paletta|*.pal|\",\n\t\"OLE 2.0 was unable to start.\": \"Az OLE 2.0 nem tudott elindulni.\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"Győződjön meg arról, hogy az OLE függvénytárak megfelelő verzióját használja-e.\",\n\t\"Resets the text be without any attributes.\": \"A szöveget attribútumok nélküli alapállapotba állítása\",\n\t\"Sets or clears the text bold attribute.\": \"A szöveg félkövér attribútumának beállítása vagy törlése\",\n\t\"Sets or clears the text italic attribute.\": \"A szöveg dőlt attribútumának beállítása vagy törlése\",\n\t\"Selects the font used by the text.\": \"A szöveg által használt betűtípus kijelölése\",\n\t\"Selects the point size of the text.\": \"A szöveg pontméretének kijelölése\",\n\t\"Sets or clears the text underline attribute.\": \"A szöveg aláhúzott attribútumának beállítása vagy törlése\",\n\t\"Shows or hides the tooltips.\": \"Gombnevek megjelenítése vagy elrejtése\",\n\t\"Show Paint Help.\": \"A Paint Súgójának megjelenítése\",\n\t\"Sends a picture by using mail or fax.\": \"Kép küldése levélként vagy faxként\",\n\t\"Copies the selection to a file.\": \"A kijelölt rész fájlba másolása\",\n\t\"Pastes a file into the selection.\": \"Fájlt beillesztése a kijelölésbe\",\n\t\"Zooms the picture to 100%.\": \"A kép nagyítása 100%.\",\n\t\"Zooms the picture to 400%.\": \"A kép nagyítása 400%.\",\n\t\"Zooms the picture.\": \"A kép nagyítása\",\n\t\"Displays the entire picture.\": \"A teljes kép megjelenítése\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"A kép vázlatának megjelenítése vagy elrejtése\",\n\t\"Shows or hides the grid.\": \"A rács megjelenítése vagy elrejtése\",\n\t\"Shows or hides the text toolbar.\": \"A Szöveg eszköztár megjelenítése vagy elrejtése\",\n\t\"Flips or rotates the picture or a selection.\": \"Kép vagy kijelölés tükrözése vagy forgatása\",\n\t\"Stretches or skews the picture or a selection.\": \"Kép vagy kijelölés megnyújtása vagy megdöntése\",\n\t\"Inverts the colors of the picture or a selection.\": \"Kép vagy kijelölés színeinek megfordítása\",\n\t\"Changes the attributes of the picture.\": \"A kép jellemzőinek a módosítása\",\n\t\"Clears the picture or selection.\": \"A kép vagy a kijelölés törlése\",\n\t\"The font size must be a numeric value.\": \"A betű méretének numerikus értéknek kell lennie.\",\n\t\"Contains commands for working with the selected item(s).\": \"A kijelölt elemmel vagy elemekkel való munkára szolgáló parancsok\",\n\t\"Contains commands for selecting and transferring items.\": \"Elemek kijelölésére és átvitelére szolgáló parancsok\",\n\t\"Contains commands for customizing this window.\": \"Parancsok ennek az ablaknak a testreszabásához.\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"Képek kezelésére és attribútumok beállítására szolgáló parancsok\",\n\t\"Contains commands for using custom colors and drawing options.\": \"Egyéni színek és rajzoló beállítások használatára szolgáló parancsok\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"A Paint Súgójának és információinak megjelenítésére szolgáló parancsok\",\n\t\"Cannot save file.\": \"A fájlt nem lehet menteni.\",\n\t\"Error removing temporary file.\": \"Hiba ideiglenes fájl eltávolításakor\",\n\t\"Get Colors\": \"Színek betöltése\",\n\t\"Save Colors\": \"Színek mentése\",\n\t\"File last saved:\": \"Utolsó mentés:\",\n\t\"Not Available\": \"Nincs adat\",\n\t\"Size on disk:\": \"Méret a lemezen:\",\n\t\"%s bytes\": \"%s bájt\",\n\t\"Painting\": \"Kép\",\n\t\"Bitmap\": \"Bitkép\",\n\t\"Fonts\": \"Betűtípusok\",\n\t\"Tools\": \"Eszközök \",\n\t\"All Picture Files\": \"Minden képfájl\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"Ha segítségre van szüksége, kattintson a Súgó menü Témakörök parancsára.\",\n\t\"Select an area on which to get Help.\": \"Jelölje ki azt a területet, melyhez segítséget szeretne.\",\n\t\"%1 in %2\": \"%1 a következőben: %2\",\n\t\"Creates a new document.\": \"Új dokumentum létrehozása\",\n\t\"Opens an existing document.\": \"Létező dokumentum megnyitása\",\n\t\"Closes the active document.\": \"Az aktív dokumentum bezárása\",\n\t\"Saves the active document.\": \"Az aktív dokumentum mentése\",\n\t\"Saves the active document with a new name.\": \"Az aktív dokumentum mentése új néven\",\n\t\"Changes the page layout.\": \"Az oldalbeállítás módosítása\",\n\t\"Specifies the default printer setup.\": \"Az alapnyomtató beállításainak megadása\",\n\t\"Prints the active document and sets printing options.\": \"Az aktív dokumentum nyomtatása és a nyomtatási beállítások megadása\",\n\t\"Displays full pages.\": \"Teljes oldalak megjelenítése\",\n\t\"Opens this document.\": \"A dokumentum megnyitása\",\n\t\"Deletes the selection.\": \"A kijelölés törlése\",\n\t\"Erases everything.\": \"Minden törlése\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"A kijelölt rész másolása a Vágólapra  \",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"A kijelölés kivágása és a Vágólapra másolása\",\n\t\"Finds the specified text.\": \"A megadott szöveg keresése\",\n\t\"Inserts the contents of the Clipboard.\": \"A Vágólap tartalmának beillesztése\",\n\t\"Repeats the last action.\": \"A legutóbbi művelet megismétlése\",\n\t\"Replaces specific text with different text.\": \"A megadott szöveg helyettesítése egy másik szöveggel\",\n\t\"Selects everything.\": \"Mindent kijelöl.\",\n\t\"Undoes the last action.\": \"A legutóbbi művelet visszavonása\",\n\t\"Redoes the previously undone action.\": \"Az előzőleg visszavont művelet visszavonása\",\n\t\"Displays program information, version number, and copyright.\": \"Programinformáció, verziószám és szerzői jogi szöveg megjelenítése\",\n\t\"Quits Paint.\": \"Kilépés a Paint programból\",\n\t\"Opens Paint Help.\": \"A Paint Súgójának megnyitása\",\n\t\"Displays instructions about how to use Help.\": \"A Súgó használatáról szóló Súgó megjelenítése.\",\n\t\"Displays Help for areas you click on.\": \"Súgó megjelenítése arra a területre vonatkozóan, amelyre rákattint.\",\n\t\"Displays Help for the current task or command.\": \"Az aktuális feladatra vagy parancsra vonatkozó Súgó megjelenítése\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"Asztal tapétájaként a bitkép középre igazítása.\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"Bitkép mozaik elrendezése asztal-tapétaként.\",\n\t\"Sends the selection using mail or fax.\": \"Kijelölt rész küldése levélként vagy faxként\",\n\t\"Prints the selection.\": \"A kijelölt rész nyomtatása\",\n\t\"Shows or hides the thumbnail.\": \"A vázlat megjelenítése vagy elrejtése\",\n\t\"Shows Paint Help.\": \"A Paint Súgójának megjelenítése\",\n\t\"Shows or hides the status bar.\": \"Az állapotsor megjelenítése vagy elrejtése.\",\n\t\"Shows or hides the tool box.\": \"Az eszközkészlet megjelenítése vagy elrejtése\",\n\t\"Shows or hides the color box.\": \"A paletta megjelenítése vagy elrejtése\",\n\t\"Only a Far East font can be used for vertical editing.\": \"Csak távol-keleti betűtípust lehet használni függőleges szerkesztéshez.\",\n\t\"Changes the window size.\": \"Az ablakméret módosítása\",\n\t\"Changes the window position.\": \"Az ablak helyének módosítása\",\n\t\"Reduces the window to an icon.\": \"Az ablak kis méretűvé tétele\",\n\t\"Enlarges the window to full size.\": \"Az ablak teljes méretűvé növelése\",\n\t\"Switches to the next document window.\": \"Váltás a következő dokumentumablakra\",\n\t\"Switches to the previous document window.\": \"Váltás az előző dokumentumablakra\",\n\t\"Closes the active window and asks if you want to save changes.\": \"Az aktív ablak bezárása, és annak megkérdezése, hogy kívánja-e menteni a módosításokat\",\n\t\"Restores the window to normal size.\": \"Az ablak visszaállítása eredeti méretre\",\n\t\"Activates the task list.\": \"A feladatlista megnyitása\",\n\t\"All Files (*.*)\": \"Minden fájl (*.*)\",\n\t\"Untitled\": \"Cím nélküli\",\n\t\"an unnamed file\": \"névtelen fájl\",\n\t\"&Hide\": \"&Elrejtés\",\n\t\"Hide\": \"Elrejtés\",\n\t\"No error message is available.\": \"Nincs hibaüzenet.\",\n\t\"An unsupported operation was attempted.\": \"Nem támogatott művelet végrehajtására történt kísérlet.\",\n\t\"A required resource was unavailable.\": \"A kért erőforrás nem érhető el.\",\n\t\"Out of memory.\": \"Nincs elég memória.\",\n\t\"An unknown error has occurred.\": \"Ismeretlen hiba történt.\",\n\t\"on %1\": \"Port: %1\",\n\t\"&One Page\": \"&Egy oldal\",\n\t\"One Page\": \"Egy oldal\",\n\t\"&Two Page\": \"&Kétoldalas\",\n\t\"Two Page\": \"Kétoldalas\",\n\t\"Page %u\": \"%u. oldal\",\n\t\"Pages %u-%u\": \"%u.-%u. oldal\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"Nyomtatófájlok (*.prn)|*.prn|Minden fájl (*.*)|*.*||\",\n\t\"Print to File\": \"Nyomtatás fájlba\",\n\t\"to %1\": \"cél: %1\",\n\t\"&Update %1\": \"%1 &frissítése\",\n\t\"Update %1\": \"%1 frissítése\",\n\t\"E&xit && Return to %1\": \"Kilépés és &visszatérés a következőbe: %1\",\n\t\"Exit & Return to %1\": \"Kilépés és visszatérés a következőbe: %1\",\n\t\"Linked %s\": \"Csatolva: %s\",\n\t\"Unknown Type\": \"Ismeretlen típus\",\n\t\"Invalid filename.\": \"Érvénytelen fájlnév\",\n\t\"Failed to open document.\": \"Nem sikerült a dokumentumot megnyitni.\",\n\t\"Failed to save document.\": \"A dokumentum mentése nem sikerült.\",\n\t\"Save changes to %1?\": \"Menti %1 módosításait?\",\n\t\"Failed to create empty document.\": \"Nem sikerült üres dokumentumot létrehozni.\",\n\t\"The file is too large to open.\": \"A fájl túl nagy a megnyitáshoz.\",\n\t\"Could not start print job.\": \"Nem lehetett elindítani a nyomtatási feladatot.\",\n\t\"Failed to launch help.\": \"A Súgó indítása nem sikerült.\",\n\t\"Internal application error.\": \"Belső hiba az alkalmazásban.\",\n\t\"Command failed.\": \"A parancs végrehajtása nem sikerült.\",\n\t\"Insufficient memory to perform operation.\": \"Nincs elég memória a művelet végrehajtásához.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"A rendszerleíróadatbázis-bejegyzések eltávolítva, az INI fájlok (ha voltak) törölve.\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"Nem sikerült eltávolítani valamennyi rendszerleíróadatbázis-bejegyzést és INI fájlt.\",\n\t\"This program requires the file %s, which was not found on this system.\": \"A programnak szüksége van erre a fájlra: %s. Ez a fájl nem található a rendszeren.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"Ez a program a következő fájlban található hiányzó %s exporthoz van csatolva: %s. Lehet, hogy ez a gép %s inkompatíbilis verziójával rendelkezik.\",\n\t\"Please enter an integer.\": \"Írjon be egy egész számot.\",\n\t\"Please enter a number.\": \"Adjon meg egy számot.\",\n\t\"Please enter an integer between %1 and %2.\": \"Adjon meg egy %1 és %2 közé eső egész számot.\",\n\t\"Please enter a number between %1 and %2.\": \"Adjon meg egy %1 és %2 közé eső számot.\",\n\t\"Please enter no more than %1 characters.\": \"Adjon meg nem több, mint %1 karaktert.\",\n\t\"Please select a button.\": \"Válasszon egy gombot.\",\n\t\"Please enter an integer between 0 and 255.\": \"Adjon meg egy 0 és 255 közötti egész számot.\",\n\t\"Please enter a positive integer.\": \"Adjon meg egy pozitív egész számot.\",\n\t\"Please enter a date and/or time.\": \"Adjon meg egy dátumot vagy egy időpontot.\",\n\t\"Please enter a currency.\": \"Adjon meg egy pénznemet.\",\n\t\"Unexpected file format.\": \"Váratlan fájlformátum.\",\n\t\"Cannot find this file.\": \"Ez a fájl nem található.\",\n\t\"Please verify that the correct path and file name are given.\": \"Ellenőrizze, hogy a helyes elérési utat és fájlnevet adta-e meg.\",\n\t\"Destination disk drive is full.\": \"A céllemez megtelt.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"A következő nem olvasható, mert valaki megnyitotta: %1.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"%1 írása nem lehetséges, mert az vagy írásvédett, vagy valaki más már megnyitotta.\",\n\t\"An unexpected error occurred while reading %1.\": \"Nem várt hiba történt %1 olvasása közben.\",\n\t\"An unexpected error occurred while writing %1.\": \"Nem várt hiba történt %1 írása közben.\",\n\t\"Unable to register document.\": \"A dokumentum nem regisztrálható.\",\n\t\"The document may already be open.\": \"Valószínűleg már használatban van.\",\n\t\"Update %1 before proceeding?\": \"Folytatás előtt frissíti a következőt: %1?\",\n\t\"Could not update client.\": \"Az ügyfél frissítése nem sikerült.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"Nem sikerült a regisztrálás. Valószínűleg nem működnek megfelelően az ActiveX funkciók.\",\n\t\"Failed to update the system registry.\": \"Nem sikerült a rendszerleíró adatbázis frissítése.\",\n\t\"Please try using REGEDIT.\": \"Próbálja meg a REGEDIT használatával.\",\n\t\"Unable to read write-only property.\": \"Nem lehet csak írható tulajdonságot olvasni.\",\n\t\"Unable to write read-only property.\": \"Nem lehet írásvédett tulajdonságot írni.\",\n\t\"Unable to load mail system support.\": \"A levelezőrendszert nem sikerült betölteni.\",\n\t\"Mail system DLL is invalid.\": \"Érvénytelen a levelezőrendszer DLL-je.\",\n\t\"Send Mail failed to send message.\": \"A levelezőrendszer nem tudta elküldeni az üzenetet.\",\n\t\"No error occurred.\": \"Nem történt hiba.\",\n\t\"An unknown error occurred while accessing %1.\": \"Ismeretlen hiba történt %1 használata közben.\",\n\t\"%1 was not found.\": \"%1 nem található.\",\n\t\"%1 contains an invalid path.\": \"%1 érvénytelen elérési utat tartalmaz.\",\n\t\"%1 could not be opened because there are too many open files.\": \"%1 nem nyitható meg, mert túl sok fájl van nyitva.\",\n\t\"Access to %1 was denied.\": \"A következő fájlhoz való hozzáférés megtagadva: %1.\",\n\t\"An invalid file handle was associated with %1.\": \"A következő fájlhoz érvénytelen leírót rendeltek: %1.\",\n\t\"%1 could not be removed because it is the current directory.\": \"%1 nem távolítható el, mert ez az aktuális könyvtár.\",\n\t\"%1 could not be created because the directory is full.\": \"%1 nem hozható létre, mert a könyvtár megtelt.\",\n\t\"Seek failed on %1\": \"Pozícionálási hiba a következőn: %1\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"%1 használata során hardver I/O hiba történt.\",\n\t\"A sharing violation occurred while accessing %1.\": \"%1 használata közben megosztásmegsértés történt.\",\n\t\"A locking violation occurred while accessing %1.\": \"%1 használata közben zárolásmegsértés történt.\",\n\t\"Disk full while accessing %1.\": \"%1 használata közben a lemez megtelt.\",\n\t\"An attempt was made to access %1 past its end.\": \"%1 használatára történt kísérlet, annak megszüntetése után.\",\n\t\"An attempt was made to write to the reading %1.\": \"Írni próbált a következő, olvasásra megnyitott objektumba: %1.\",\n\t\"An attempt was made to read from the writing %1.\": \"Olvasni próbált a következő, írásra megnyitott objektumból: %1.\",\n\t\"%1 has a bad format.\": \"%1 formátuma hibás.\",\n\t\"%1 contained an unexpected object.\": \"%1 nem várt objektumot tartalmaz.\",\n\t\"%1 contains an incorrect schema.\": \"%1 hibás sémát tartalmaz.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"A kép egy téglalappal határolt részének kijelölése áthelyezéshez, másoláshoz vagy szerkesztéshez\",\n\t\"Select\": \"Kijelölés\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"A kép egy szabadkézzel határolt részének kijelölése áthelyezéshez, másoláshoz vagy szerkesztéshez\",\n\t\"Free-Form Select\": \"Szabadkézi kijelölés\",\n\t\"Inserts text into the picture.\": \"Szöveg beszúrása a képbe\",\n\t\"Fills an area with the current drawing color.\": \"Terület kitöltése az aktuális rajzoló színnel\",\n\t\"Fill With Color\": \"Kitöltés színnel\",\n\t\"Draws a straight line with the selected line width.\": \"Egyenes vonal rajzolása a kijelölt vonalvastagsággal\",\n\t\"Line\": \"Vonal\",\n\t\"Draws using an airbrush of the selected size.\": \"Rajzolás a kijelölt méretű festékszóróval\",\n\t\"Airbrush\": \"Festékszóró\",\n\t\"Draws a curved line with the selected line width.\": \"Görbe vonal rajzolása a kijelölt vonalvastagsággal.\",\n\t\"Curve\": \"Görbe\",\n\t\"Draws a polygon with the selected fill style.\": \"Sokszög rajzolása a kijelölt kitöltő stílussal\",\n\t\"Polygon\": \"Sokszög\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"Kerekített sarkú téglalap rajzolása a kijelölt kitöltő stílussal\",\n\t\"Rounded Rectangle\": \"Kerekített sarkú téglalap\",\n\t\"Draws a free-form line one pixel wide.\": \"Egy képpont vastagságú szabadkézi vonal húzása\",\n\t\"Pencil\": \"Ceruza\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"Kép törlése a kijelölt radír használatával\",\n\t\"Eraser/Color Eraser\": \"Radír\",\n\t\"Changes the magnification.\": \"A nagyítás mértékének megváltoztatása\",\n\t\"Magnifier\": \"Nagyító\",\n\t\"Picks up a color from the picture for drawing.\": \"Szín felvétele a képről a rajzoláshoz\",\n\t\"Pick Color\": \"Szín felvétele\",\n\t\"Draws using a brush with the selected shape and size.\": \"Rajzolás a kijelölt alakú és méretű ecsettel\",\n\t\"Brush\": \"Ecset\",\n\t\"Draws a rectangle with the selected fill style.\": \"Téglalap rajzolása a kijelölt kitöltő stílussal\",\n\t\"Rectangle\": \"Téglalap\",\n\t\"Draws a filled rectangle.\": \"Kitöltött téglalap rajzolása\",\n\t\"Draws an ellipse with the selected fill style.\": \"Ellipszis rajzolása a kijelölt kitöltő stílussal\",\n\t\"Ellipse\": \"Ellipszis\",\n\t\"Draws a filled ellipse.\": \"Kitöltött ellipszis rajzolása\",\n\t\"Makes the current selection either opaque or transparent.\": \"Az aktuális kijelölés átlátszatlanná vagy áttetszővé tétele\",\n\t\"Creates a new color.\": \"Új szín létrehozása\",\n\t\"Uses a previously saved palette of colors.\": \"Egy előzőleg mentett színpaletta használata\",\n\t\"Saves the current palette of colors to a file.\": \"A jelenlegi színpaletta mentése egy fájlba\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"Tapétaként való kiválasztás előtt mentenie kell a fájlt.\",\n\t\"The selection is now larger than the bitmap.\": \"A kijelölés most nagyobb, mint a bitkép.\",\n\t\"Would you like the bitmap enlarged?\": \"Szeretné a bitképet megnövelni?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"A Vágólapon lévő kép nagyobb, mint a bitkép.\",\n\t\"The file is not in the correct format.\": \"A fájl nem a megfelelő formátumban van.\",\n\t\"Not enough room to paste text.\": \"Nincs elég hely a szöveg beillesztéséhez.\",\n\t\"Enlarge the text area and try again.\": \"Növelje meg a szövegterületet, majd próbálkozzon újra.\",\n\t\"Places the text.\": \"Szöveg elhelyezése\"\n});\n"
  },
  {
    "path": "localization/install-windows-98.sh",
    "content": "# This is a script to automate creating a VirtualBox VM and setting up Windows 98 within it\n# in order to grab files from numerous localized versions of Windows 98 to gather up strings\n# and jumpstart localization of jspaint.\n# A better idea would have been to use an unattended answer file (msbatch.inf).\n# I knew there would be sysadmin type ways of doing this, but I went this route I guess because I thought it was cool.\n# It's a lot of work tho, and way less reliable.\n\nlang=$1\ntarget_os_iso=$2\nvm_name=\"Win98-${lang}\"\nalready_got_image=false\nif [ ! \"$lang\" ] || [ ! \"$target_os_iso\" ]; then\n\techo \"Two arguments required: a target language code (e.g. en), and a path to an iso file.\"\n\texit 1\nfi\nif [ ! -f \"$target_os_iso\" ]; then\n\techo \"File \\\"$target_os_iso\\\" does not exist!\"\n\texit 1\nfi\n\nwindow_id=\nwait_for_window(){\n\tlocal window_name=$1\n\techo \"Waiting for \\\"$window_name\\\" window\"\n\t# \"--sync\" in this case means wait for results before exiting\n\twindow_id=`xdotool search --sync --onlyvisible --name \"$window_name\"`\n\techo \"Found \\\"$window_name\\\" window\"\n\txdotool search --name \"$window_name\" windowactivate --sync\n}\n\nwait_for_window \"Oracle VM VirtualBox Manager\"\nsleep 1\nif [ \"$already_got_image\" != true ]; then\n\techo \"Let's make a VM...\"\n\txdotool key --clearmodifiers --delay 20 ctrl+n\n\twait_for_window \"Create Virtual Machine\"\n\txdotool type --delay 20 \"$vm_name\"\n\tsleep 1\n\techo \"Create!\"\n\txdotool key --clearmodifiers --delay 20 Return\n\techo \"Create hard disk\"\n\techo \"Select Size slider\"\n\tsleep 0.5\n\txdotool key --clearmodifiers --delay 20 alt+s\n\techo \"Set it to lowest possible, to get MB units\"\n\tsleep 0.5\n\txdotool key --clearmodifiers --delay 20 Home\n\techo \"Select Size text input\"\n\tsleep 0.5\n\txdotool key --clearmodifiers --delay 20 Tab\n\tsleep 0.5\n\techo \"Set size to 300 MB\"\n\txdotool type --delay 20 \"300\"\n\tsleep 1\n\techo \"Choose fixed size hard disk image\"\n\txdotool key --clearmodifiers --delay 20 alt+f\n\tsleep 0.5\n\txdotool key --clearmodifiers --delay 20 Return\n\t# echo \"Waiting for VM to be created (sometimes it's fast, sometimes it takes a while)\"\n\t# TODO: wait for popup windows to close instead of doing a fixed sleep\n\t# sleep 20\n\techo \"Waiting for VM to be created (popups to close)\"\n\txdotool search --name \"Oracle VM VirtualBox Manager\" windowactivate --sync\nfi\n\nsleep 2\necho \"Launch the VM!\"\nxdotool key --clearmodifiers --delay 20 Return\nsleep 5\n\nboot_into_setup(){\n\techo \"Select 2. Boot From CD ROM\"\n\t# typing a 2 in this particular screen is INCREDIBLY FINNICKY\n\t# maybe the key is down and up too fast and I need to find how to separately trigger press and release\n\t# xdotool key --delay 200 222222222222222222222222\n\t# xdotool search --sync --name \"$vm_name \\[Running\\] - Oracle VM VirtualBox\" windowactivate --sync key --clearmodifiers --delay 20 2\n\t# could try xdotool type\n\t# Down + Return works tho\n\txdotool key --clearmodifiers --delay 20 Down\n\tsleep 0.5\n\txdotool key --clearmodifiers --delay 20 Return\n\tsleep 2\n\tif [ \"$lang\" = \"he\" ]; then\n\t\techo \"Select 2. Start Localized Windows 98 Setup from CD ROM\"\n\t\txdotool key --clearmodifiers --delay 20 2\n\telse\n\t\techo \"Select 1. Start Windows 98 Setup from CD ROM\"\n\t\txdotool key --clearmodifiers --delay 20 1\n\tfi\n\tsleep 0.5\n\txdotool key --clearmodifiers --delay 20 Return\n}\n\nif [ \"$already_got_image\" != true ]; then\n\twait_for_window \"Select start-up disk\"\n\techo \"Select iso file...\"\n\txdotool key --clearmodifiers --delay 20 Tab\n\tsleep 1\n\txdotool key --clearmodifiers --delay 20 space\n\tsleep 4\n\t# there is no way to add a new iso via the keyboard\n\twait_for_window \"Optical Disk Selector\"\n\txdotool mousemove --window \"$window_id\" 25 50\n\tsleep 0.5\n\txdotool click 1\n\twait_for_window \"Please choose a virtual optical disk\"\n\txdotool key --clearmodifiers --delay 20 ctrl+l\n\tsleep 0.5\n\txdotool type --delay 20 \"${target_os_iso}\"\n\tsleep 2\n\techo \"Open\"\n\txdotool key --clearmodifiers --delay 20 Return\n\tsleep 2\n\techo \"Choose\"\n\txdotool key --clearmodifiers --delay 20 Return\n\tsleep 2\n\techo \"Start\"\n\txdotool key --clearmodifiers --delay 20 Return\n\tsleep 2\nfi\n\nsleep 2\nwait_for_window \"$vm_name \\[Running\\] - Oracle VM VirtualBox\"\nboot_into_setup\nsleep 9\n\necho \"Welcome to Setup - Set up Windows now\"\nxdotool key --clearmodifiers --delay 20 Return\nsleep 2\necho \"No, do not use large disk support\"\nxdotool key --clearmodifiers --delay 20 Return\nsleep 2\necho \"Setup will restart your computer now - Continue\"\nxdotool key --clearmodifiers --delay 20 Return\nsleep 3\nboot_into_setup\nsleep 9\necho \"Setup is now going to perform a routine check on your system. - Continue\"\nxdotool key --clearmodifiers --delay 20 Return\nsleep 8\necho \"Welcome to Windows 98 Setup. (GUI) - Continue\"\nxdotool key --clearmodifiers --delay 20 Return\nsleep 8\necho \"Select Directory (C:\\\\Windows\\\\) - Next\"\nxdotool key --clearmodifiers --delay 20 Return\nsleep 5\necho \"Setup Options (Typical) - Next\"\nxdotool key --clearmodifiers --delay 20 Return\nsleep 5\necho \"Windows Components (Install the most common components (Recommended) - Next\"\nxdotool key --clearmodifiers --delay 20 Return\n\nsleep 5\necho \"Computer name\"\nxdotool key --clearmodifiers --delay 20 alt+shift # switch language input\nsleep 0.5\nxdotool type --delay 20 \"VM\"\nsleep 0.5\nxdotool key --clearmodifiers --delay 20 Return\nsleep 5\necho \"Establishing Your Location - Next\"\nxdotool key --clearmodifiers --delay 20 Return\nsleep 1\necho \"Start Copying Files - Next\"\nxdotool key --clearmodifiers --delay 20 Return\n\necho \"(It should be copying files.)\"\nsleep 20\necho \"(This might take a while...)\"\nsleep 100\necho \"(It better be almost done, or already done...)\"\nsleep 10\n\n# make sure you haven't wandered off\nwait_for_window \"$vm_name \\[Running\\] - Oracle VM VirtualBox\"\nsleep 2\n\necho \"Username\"\n# computer has restarted at this point, so switch the language input again\nxdotool key --clearmodifiers --delay 20 alt+shift\nsleep 0.5\nxdotool type --delay 20 \"User\"\nsleep 0.5\nxdotool key --clearmodifiers --delay 20 Return\nsleep 1\necho \"Accept agreement\"\nxdotool key --clearmodifiers --delay 20 Tab\nsleep 1\nxdotool key --clearmodifiers --delay 20 Return\nsleep 1\necho \"Product key\"\n# Attempt 1: Type the key directly\n# Doesn't work with non-English language because it types e.g. Cyrillic instead\n# xdotool type --delay 20 \"B8MFRCFTGQC9PBWVHG3J3R3YW\"\n# but there's a built-in special keyboard for entering the product key, so we can use that\n\n# Attempt 2: Tab thru the on-screen keyboard to enter the product key like a combination lock.\n# Doesn't work because pressing a button focuses an input, and tabbing to the buttons means focusing either the first or last input which will then recieve the text when buttons are pressed.\n# It's not meant to be used via the keyboard.\n\n# echo \"Enable product key on-screen keyboard\"\n# sleep 1\n# xdotool key --delay 20 Tab\n# sleep 0.02\n# xdotool key --delay 20 Tab\n# sleep 0.02\n# xdotool key --delay 20 Tab\n# sleep 0.02\n# xdotool key --delay 20 Tab\n# sleep 0.02\n# xdotool key --delay 20 Tab\n# sleep 0.02\n# xdotool key --delay 20 space\n# sleep 1\n# xdotool key --delay 20 space\n# sleep 1\n# xdotool key --delay 20 Return\n# sleep 1\n\n# JavaScript code to generate shell code for tabbing:\n# (()=> {\n# let buttons = \"BCDFGHJKMPQRTVWXY2346789\";\n# let tab_index = -5;\n# let product_key = \"B8MFR - CFTGQ - C9PBW - VHG3J - 3R3YW\".replace(/[\\s-]/g, \"\");\n# let tab_indexes = product_key.split(\"\").map((char)=> buttons.indexOf(char));\n# let shell_code = `echo \"Enter product key (${product_key})\"\\n`;\n# for (let i=0; i<tab_indexes.length; i++) {\n# \twhile (tab_indexes[i] < tab_index) {\n# \t\ttab_index -= 1;\n# \t\tshell_code += \"xdotool key --delay 20 shift+Tab\\n\";\n# \t}\n# \twhile (tab_indexes[i] > tab_index) {\n# \t\ttab_index += 1;\n# \t\tshell_code += \"xdotool key --delay 20 Tab\\n\";\n# \t}\n# \tshell_code += \"xdotool key --delay 20 space\\n\";\n# }\n# return shell_code\n# })();\n\n# Attempt 3: click buttons with the mouse.\n# Doesn't work because of how VirtualBox takes control of the mouse.\n# It works fine with just mosuemove and not click, but with click,\n# xdotool gets confused and clicks in the wrong spots.\n# This behavior can be altered but afaik not fixed by using mousedown/mouseup instead of click.\n\n# echo \"Enable product key on-screen keyboard\"\n# sleep 1\n# xdotool key --delay 20 Tab\n# sleep 0.02\n# xdotool key --delay 20 Tab\n# sleep 0.02\n# xdotool key --delay 20 Tab\n# sleep 0.02\n# xdotool key --delay 20 Tab\n# sleep 0.02\n# xdotool key --delay 20 Tab\n# sleep 0.02\n# xdotool key --delay 20 space\n# sleep 1\n# xdotool key --delay 20 space\n# sleep 1\n# xdotool key --delay 20 Return\n# sleep 1\n\n# JavaScript code to generate shell code for mouse clicking:\n# (()=> {\n# let button_rows = [\n# \t[\"B\", \"C\", \"D\", \"F\", \"G\", \"H\", \"J\", \"K\", \"M\", \"P\", \"Q\", \"R\"],\n# \t[\"T\", \"V\", \"W\", \"X\", \"Y\", \"2\", \"3\", \"4\", \"6\", \"7\", \"8\", \"9\"],\n# ];\n# // let product_key = \"B8MFR - CFTGQ - C9PBW - VHG3J - 3R3YW\".replace(/[\\s-]/g, \"\");\n# let product_key = \"BCDFGHJKMPQRTVWXY2346789\"; // for testing\n# let shell_code = `echo \"Enter product key (${product_key})\"\\n`;\n# for (let i=0; i<product_key.length; i++) {\n# \tfor (let y=0; y<button_rows.length; y++) {\n# \t\tlet x = button_rows[y].indexOf(product_key[i]);\n# \t\tif (x !== -1) {\n# \t\t\tlet mx = 230 + x * 26;\n# \t\t\tlet my = 270 + y * 24;\n# \t\t\tshell_code += `\n# xdotool mousemove --window $window_id ${mx} ${my}\n# sleep 0.5\n# xdotool click 1`;\n# \t\t}\n# \t}\n# }\n# return shell_code\n# })();\n\n# Other ideas:\n# - Use an unattended answers file (msbatch.inf) instead of all this scripting\n# - Use a different program for desktop automation in order to send clicks properly\n#   - Be sure to test clicking in the VM before converting any of this script!\n# - See if there's a setting or keyboard shortcut to switch keyboard layouts within Windows 98 setup\n\n# echo \"\"\n# echo \"Can't enter product key. You have to do the most tedious part yourself.\"\n# echo \"\"\n# echo \"Product key: B8MFR - CFTGQ - C9PBW - VHG3J - 3R3YW\"\n# echo \"\"\n# exit\n\n# Attempt 4.\n# Switch language inputs before typing normally.\n# Actually, applied this (alt+shift) to the earlier input.\n# The computer has not restarted since typing the User name,\n# so don't switch language inputs again.\necho \"Enter product key (B8MFR - CFTGQ - C9PBW - VHG3J - 3R3YW)\"\nsleep 0.5\nxdotool type --delay 20 \"B8MFRCFTGQC9PBWVHG3J3R3YW\"\n\n# One liner to enter a key in case you need to try several keys or retype the key:\n# xdotool search --sync --name \"Win98-ja \\[Running\\] - Oracle VM VirtualBox\" windowactivate --sync type --delay 20 \"K4HVDQ9TJ96CRX9C9G68RQ2D3\"\n# xdotool search --sync --name \" \\[Running\\] - Oracle VM VirtualBox\" windowactivate --sync type --delay 20 \"B8MFRCFTGQC9PBWVHG3J3R3YW\"\n\nsleep 0.5\nxdotool key --clearmodifiers --delay 20 Return\nsleep 1\necho \"Finish (almost done, just Time Zone left after this...)\"\nxdotool key --clearmodifiers --delay 20 Return\nsleep 200\necho \"Time Zone\"\nxdotool key --clearmodifiers --delay 20 Return\nsleep 1\necho \"All done here! Did it work? I hope it worked!\"\n"
  },
  {
    "path": "localization/it/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"it\", {\n\t\"Attributes\": \"Attributi\",\n\t\"&Width:\": \"&Larghezza:\",\n\t\"Width:\": \"Larghezza:\",\n\t\"&Height:\": \"&Altezza:\",\n\t\"Height:\": \"Altezza:\",\n\t\"Units\": \"Unità di misura\",\n\t\"&Inches\": \"&Pollici\",\n\t\"Inches\": \"Pollici\",\n\t\"C&m\": \"&Cm\",\n\t\"Cm\": \"Cm\",\n\t\"&Pixels\": \"Pi&xel\",\n\t\"Pixels\": \"Pixel\",\n\t\"Colors\": \"Colori\",\n\t\"&Black and white\": \"&Bianco e nero\",\n\t\"Black and white\": \"Bianco e nero\",\n\t\"Co&lors\": \"C&olori\",\n\t\"Transparency\": \"Lucido\",\n\t\"Use &Transparent background color\": \"Usa colore di sfondo &trasparente\",\n\t\"Use Transparent background color\": \"Usa colore di sfondo trasparente\",\n\t\"Select &Color\": \"Sele&ziona colore\",\n\t\"Select Color\": \"Seleziona colore\",\n\t\"Cancel\": \"Annulla\",\n\t\"&Default\": \"P&redefiniti\",\n\t\"Default\": \"Predefiniti\",\n\t\"Custom Zoom\": \"Personalizza zoom\",\n\t\"Current zoom:\": \"Zoom corrente:\",\n\t\"Zoom to\": \"Percentuale zoom\",\n\t\"Flip and Rotate\": \"Capovolgi o ruota\",\n\t\"Flip or rotate\": \"Capovolgi o ruota\",\n\t\"&Flip horizontal\": \"&Capovolgi orizzontalmente\",\n\t\"Flip horizontal\": \"Capovolgi orizzontalmente\",\n\t\"Flip &vertical\": \"Capo&volgi verticalmente\",\n\t\"Flip vertical\": \"Capovolgi verticalmente\",\n\t\"&Rotate by angle\": \"&Ruota di\",\n\t\"Rotate by angle\": \"Ruota di\",\n\t\"Stretch and Skew\": \"Allunga e inclina\",\n\t\"Stretch\": \"Allunga\",\n\t\"&Horizontal:\": \"&Orizzontalmente:\",\n\t\"Horizontal:\": \"Orizzontalmente:\",\n\t\"&Vertical:\": \"&Verticalmente:\",\n\t\"Vertical:\": \"Verticalmente:\",\n\t\"Skew\": \"Inclina\",\n\t\"H&orizontal:\": \"Ori&zzontalmente:\",\n\t\"Degrees\": \"gradi\",\n\t\"V&ertical:\": \"V&erticalmente:\",\n\t\"Color Table\": \"Tavola colori\",\n\t\"New\": \"Nuova connessione\",\n\t\"&New \": \"&Nuovo \",\n\t\"New \": \"Nuovo \",\n\t\"&Help\": \"&?\",\n\t\"Help\": \"?\",\n\t\"Printing\": \"Stampa in corso\",\n\t\"on the\": \"su\",\n\t\"&Print\": \"Sta&mpa\",\n\t\"Print\": \"Stampa\",\n\t\"&Next Page\": \"S&uccessiva\",\n\t\"Next Page\": \"Successiva\",\n\t\"Pre&v Page\": \"&Precedente\",\n\t\"Prev Page\": \"Precedente\",\n\t\"Zoom &In\": \"Zoom &avanti\",\n\t\"Zoom In\": \"Zoom avanti\",\n\t\"Zoom &Out\": \"Zoom &indietro\",\n\t\"Zoom Out\": \"Zoom indietro\",\n\t\"&Close\": \"&Chiudi\",\n\t\"Close\": \"Chiudi\",\n\t\"Grid Settings\": \"Impostazioni griglia\",\n\t\"&Pixel Grid\": \"&Griglia in pixel\",\n\t\"Pixel Grid\": \"Griglia in pixel\",\n\t\"&Tile Grid\": \"A&ffianca griglia\",\n\t\"Tile Grid\": \"Affianca griglia\",\n\t\"pixels\": \"pixel\",\n\t\"H&eight:\": \"&Altezza:\",\n\t\"Text\": \"Testo\",\n\t\"Undo\": \"Annulla\",\n\t\"Cut\": \"Taglia\",\n\t\"Copy\": \"Copia\",\n\t\"Paste\": \"Incolla\",\n\t\"Clear Selection\": \"Cancella area selezionata\",\n\t\"Select All\": \"Seleziona tutto\",\n\t\"Text Toolbar\": \"Barra degli strumenti di testo\",\n\t\"Selection\": \"Selezione\",\n\t\"Cu&t\": \"&Taglia\",\n\t\"&Copy\": \"&Copia\",\n\t\"&Paste\": \"&Incolla\",\n\t\"C&lear Selection\": \"Cance&lla area selezionata\",\n\t\"Select &All\": \"&Seleziona tutto\",\n\t\"C&opy To\": \"C&opia su\",\n\t\"Copy To\": \"Copia su\",\n\t\"Paste &From\": \"Incolla &da\",\n\t\"Paste From\": \"Incolla da\",\n\t\"Flip/&Rotate\": \"Capovolgi/R&uota\",\n\t\"Flip/Rotate\": \"Capovolgi/Ruota\",\n\t\"&Stretch/Skew\": \"&Allunga/Inclina\",\n\t\"Stretch/Skew\": \"Allunga/Inclina\",\n\t\"&Invert Colors\": \"In&verti colori\",\n\t\"Invert Colors\": \"Inverti colori\",\n\t\"Thumbnail\": \"Panoramica\",\n\t\"&New\": \"&Nuovo\",\n\t\"Ctrl+N\": \"CTRL+N\",\n\t\"&Open\": \"&Apri\",\n\t\"Open\": \"Apri\",\n\t\"Ctrl+O\": \"CTRL+F12\",\n\t\"&Save\": \"&Salva\",\n\t\"Save\": \"Salva\",\n\t\"Ctrl+S\": \"MAIUSC+F12\",\n\t\"Save &As\": \"Salva &con nome\",\n\t\"Save As\": \"Salva con nome\",\n\t\"Print Pre&view\": \"Anteprima &di stampa\",\n\t\"Print Preview\": \"Anteprima di stampa\",\n\t\"Page Se&tup\": \"&Imposta pagina\",\n\t\"Page Setup\": \"Imposta pagina\",\n\t\"Ctrl+P\": \"CTRL+MAIUSC+F12\",\n\t\"S&end\": \"In&via\",\n\t\"Send\": \"Invia\",\n\t\"Set As &Wallpaper (Tiled)\": \"Im&posta come sfondo (affiancato)\",\n\t\"Set As Wallpaper (Tiled)\": \"Imposta come sfondo (affiancato)\",\n\t\"Set As Wa&llpaper (Centered)\": \"Imp&osta come sfondo (centrato)\",\n\t\"Set As Wallpaper (Centered)\": \"Imposta come sfondo (centrato)\",\n\t\"Recent File\": \"File recente\",\n\t\"E&xit\": \"&Esci\",\n\t\"Exit\": \"Esci\",\n\t\"Alt+F4\": \"ALT+F4\",\n\t\"&Edit\": \"&Modifica\",\n\t\"Edit\": \"Modifica\",\n\t\"&Undo\": \"&Annulla\",\n\t\"Ctrl+Z\": \"CTRL+Z\",\n\t\"&Repeat\": \"&Ripeti\",\n\t\"Repeat\": \"Ripeti\",\n\t\"Ctrl+X\": \"CTRL+X\",\n\t\"Ctrl+C\": \"CTRL+C\",\n\t\"Ctrl+V\": \"CTRL+V\",\n\t\"Del\": \"CANC\",\n\t\"Ctrl+A\": \"CTRL+5 (Tn)\",\n\t\"&View\": \"&Visualizza\",\n\t\"View\": \"Visualizza\",\n\t\"&Tool Box\": \"&Casella degli strumenti\",\n\t\"Tool Box\": \"Casella degli strumenti\",\n\t\"Ctrl+T\": \"CTRL+T\",\n\t\"&Color Box\": \"&Tavolozza\",\n\t\"Color Box\": \"Tavolozza\",\n\t\"Ctrl+L\": \"CTRL+O\",\n\t\"&Status Bar\": \"&Barra di stato\",\n\t\"Status Bar\": \"Barra di stato\",\n\t\"T&ext Toolbar\": \"B&arra degli strumenti di testo\",\n\t\"&Normal Size\": \"&Dimensioni normali\",\n\t\"Normal Size\": \"Dimensioni normali\",\n\t\"Ctrl+PgUp\": \"CTRL+PGSU\",\n\t\"&Large Size\": \"I&ngrandisci\",\n\t\"Large Size\": \"Ingrandisci\",\n\t\"Ctrl+PgDn\": \"CTRL+PGGIÙ\",\n\t\"C&ustom\": \"Personali&zza\",\n\t\"Custom\": \"Personalizza\",\n\t\"Show &Grid\": \"Mostra &griglia\",\n\t\"Show Grid\": \"Mostra griglia\",\n\t\"Ctrl+G\": \"CTRL+G\",\n\t\"Show T&humbnail\": \"&Mostra Panoramica\",\n\t\"Show Thumbnail\": \"Mostra Panoramica\",\n\t\"&View Bitmap\": \"&Visualizza bitmap\",\n\t\"View Bitmap\": \"Visualizza bitmap\",\n\t\"Ctrl+F\": \"CTRL+F\",\n\t\"&Image\": \"&Immagine\",\n\t\"Image\": \"Immagine\",\n\t\"&Flip/Rotate\": \"&Capovolgi/Ruota\",\n\t\"Ctrl+W\": \"CTRL+W\",\n\t\"&Attributes\": \"A&ttributi\",\n\t\"Ctrl+E\": \"CTRL+E\",\n\t\"&Clear Image\": \"Ca&ncella immagine\",\n\t\"Clear Image\": \"Cancella immagine\",\n\t\"Ctrl+Shft+N\": \"CTRL+MAIUSC+N\",\n\t\"&Draw Opaque\": \"&Opaco\",\n\t\"Draw Opaque\": \"Opaco\",\n\t\"&Colors\": \"&Colori\",\n\t\"&Edit Colors\": \"&Modifica colori\",\n\t\"Edit Colors\": \"Modifica colori\",\n\t\"&Help Topics\": \"&Guida in linea\",\n\t\"Help Topics\": \"Guida in linea\",\n\t\"&About Paint\": \"&Informazioni su Paint\",\n\t\"About Paint\": \"Informazioni su Paint\",\n\t\"&Update\": \"&Aggiorna\",\n\t\"Update\": \"Aggiorna\",\n\t\"Save Copy &As\": \"Salva &copia con nome\",\n\t\"Save Copy As\": \"Salva copia con nome.\",\n\t\"untitled\": \"Immagine\",\n\t\"Bitmap Image\": \"Immagine bitmap\",\n\t\"Bitmap Files (*.bmp)\": \"File bitmap(*.bmp)\",\n\t\"PCX Files\": \"File PCX\",\n\t\"Icon Files\": \"File icona\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"Bitmap monocromatica (*.bmp;*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"Bitmap a 16 colori (*.bmp;*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"Bitmap a 256 colori (*.bmp;*.dib)\",\n\t\"Paint cannot open this file.\": \"Impossibile aprire il file.\",\n\t\"Paint cannot read this file.\": \"Impossibile leggere il file.\",\n\t\"This file is read-only.\": \"Il file è di sola lettura.\",\n\t\"To save your changes, use a different filename.\": \"Per salvare le modifiche, utilizzare un nome di file diverso.\",\n\t\"This file is already open.\": \"Il file è già aperto.\",\n\t\"This is not a valid .PCS file.\": \"Non è un file PCS valido.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"Impossibile sovrascrivere il file in quanto è in fase di modifica.\",\n\t\"Use a different filename to save your changes.\": \"Per salvare le modifiche, utilizzare un nome di file diverso.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"File bitmap non valido o formato del file non supportato.\",\n\t\"This is not a valid icon.\": \"Non è un'icona valida.\",\n\t\"This is not a valid cursor.\": \"Puntatore non valido.\",\n\t\"Save was interrupted, so your file has not been saved.\": \"Salvataggio annullato. Il file non è stato salvato.\",\n\t\"You cannot save to a read-only file.\": \"Impossibile salvare su un file di sola lettura.\",\n\t\"Use a different file name.\": \"Utilizzare un nome diverso.\",\n\t\"This file is already in use.\": \"Il file è già in uso.\",\n\t\"Close the program, and then try again.\": \"Chiudere l'applicazione e riprovare.\",\n\t\"Paint cannot save this file.\": \"Impossibile salvare il file.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"Impossibile salvare il file con lo stesso nome con un tipo di file diverso.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"Il valore per la spaziatura della griglia deve essere un intero compreso tra %d e %d.\",\n\t\"There is not enough memory or resources to complete operation.\": \"Memoria o risorse insufficienti per completare l'operazione.\",\n\t\"Close some programs, and then try again.\": \"Chiudere una o più applicazioni e riprovare.\",\n\t\"Low on memory or resources.\": \"Memoria o risorse insufficienti.\",\n\t\"Group error.\": \"Errore di gruppo.\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"Impossibile stampare il documento. Assicurarsi di disporre di spazio su disco sufficiente e del corretto funzionamento della stampante.\",\n\t\"Saving into this format may cause some loss of color information.\": \"Il salvataggio in questo formato potrebbe provocare perdita di informazioni sul colore.\",\n\t\"Do you want to continue?\": \"Procedere?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"Impossibile convertire in bianco e nero. Questa operazione potrebbe influenzare il file corrente e far perdere alcune informazioni sul colore.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"Le bitmap devono essere più grandi di 1x1 pixel.\",\n\t\"Generic error.\": \"Errore generico.\",\n\t\"File not found.\": \"Impossibile trovare il file.\",\n\t\"Bad path.\": \"Percorso non valido.\",\n\t\"Too many open files.\": \"Troppi file aperti.\",\n\t\"Access denied.\": \"Accesso negato.\",\n\t\"Invalid file.\": \"File non valido.\",\n\t\"Remove current folder.\": \"Rimuove la cartella corrente.\",\n\t\"Folder full.\": \"Cartella piena.\",\n\t\"Bad seek.\": \"Ricerca non riuscita.\",\n\t\"Hard IO error.\": \"Errore di I/O.\",\n\t\"Sharing violation.\": \"Violazione di condivisione.\",\n\t\"Lock violation.\": \"Violazione di protezione.\",\n\t\"Disk full.\": \"Disco pieno.\",\n\t\"End of file.\": \"Fine del file.\",\n\t\"Error getting the Clipboard Data!\": \"Errore durante la visualizzazione dei dati negli Appunti.\",\n\t\"No Printer Found @ page setup\": \"Impossibile trovare @ page setup\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"Bitmap a 24 bit (*.bmp;*.dib)\",\n\t\"All Files\": \"Tutti i file\",\n\t\"Palette|*.pal|\": \"Tavolozza|*.pal|\",\n\t\"OLE 2.0 was unable to start.\": \"Impossibile avviare OLE 2.0.\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"Verificare che la versione delle librerie OLE in uso sia corretta.\",\n\t\"Resets the text be without any attributes.\": \"Reimposta il testo anche senza attributi.\",\n\t\"Sets or clears the text bold attribute.\": \"Imposta o cancella l'attributo in grassetto del testo.\",\n\t\"Sets or clears the text italic attribute.\": \"Imposta o cancella l'attributo in corsivo del testo.\",\n\t\"Selects the font used by the text.\": \"Seleziona il tipo di carattere utilizzato dal testo.\",\n\t\"Selects the point size of the text.\": \"Seleziona le dimensioni in punti del testo.\",\n\t\"Sets or clears the text underline attribute.\": \"Imposta o cancella l'attributo sottolineato del testo.\",\n\t\"Shows or hides the tooltips.\": \"Mostra o nasconde la descrizione comandi.\",\n\t\"Show Paint Help.\": \"Mostra la Guida di Paint.\",\n\t\"Sends a picture by using mail or fax.\": \"Invia l'immagine per posta elettronica o fax.\",\n\t\"Copies the selection to a file.\": \"Copia la selezione su un file.\",\n\t\"Pastes a file into the selection.\": \"Incolla un file nella selezione.\",\n\t\"Zooms the picture to 100%.\": \"Ripristina le dimensioni originali.\",\n\t\"Zooms the picture to 400%.\": \"Ingrandisce l'immagine del 400%.\",\n\t\"Zooms the picture.\": \"Ingrandisce l'immagine.\",\n\t\"Displays the entire picture.\": \"Visualizza l'immagine intera.\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"Mostra o nasconde Panoramica dell'immagine.\",\n\t\"Shows or hides the grid.\": \"Mostra o nasconde la griglia.\",\n\t\"Shows or hides the text toolbar.\": \"Mostra o nasconde la barra degli strumenti di testo.\",\n\t\"Flips or rotates the picture or a selection.\": \"Capovolge o ruota l'immagine o l'area selezionata.\",\n\t\"Stretches or skews the picture or a selection.\": \"Allunga o inclina l'immagine o l'area selezionata.\",\n\t\"Inverts the colors of the picture or a selection.\": \"Inverte i colori dell'immagine o dell'area selezionata.\",\n\t\"Changes the attributes of the picture.\": \"Modifica gli attributi dell'immagine.\",\n\t\"Clears the picture or selection.\": \"Cancella l'immagine o annulla la selezione.\",\n\t\"The font size must be a numeric value.\": \"La dimensione del carattere deve essere un valore numerico.\",\n\t\"Contains commands for working with the selected item(s).\": \"Comandi per la gestione dell'oggetto o degli oggetti selezionati.\",\n\t\"Contains commands for selecting and transferring items.\": \"Comandi per la selezione e il trasferimento degli oggetti.\",\n\t\"Contains commands for customizing this window.\": \"Comandi per la personalizzazione della finestra.\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"Comandi per la gestione delle immagini e l'impostazione degli attributi.\",\n\t\"Contains commands for using custom colors and drawing options.\": \"Comandi per l'utilizzo dei colori personalizzati e delle opzioni.\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"Comandi per la visualizzazione della Guida e delle informazioni su Paint.\",\n\t\"Cannot save file.\": \"Impossibile salvare il file.\",\n\t\"Error removing temporary file.\": \"Errore durante la rimozione del file temporaneo.\",\n\t\"Get Colors\": \"Carica colori\",\n\t\"Save Colors\": \"Salva colori\",\n\t\"File last saved:\": \"Ultimo salvataggio:\",\n\t\"Not Available\": \"Non disponibile\",\n\t\"Size on disk:\": \"Dimensioni su disco:\",\n\t\"%s bytes\": \"%s byte\",\n\t\"Painting\": \"Disegno in corso\",\n\t\"Fonts\": \"Tipi di carattere\",\n\t\"Tools\": \"Strumenti\",\n\t\"All Picture Files\": \"Tutti i file immagine\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"Scegliere Guida in linea dal menu ? per visualizzare la Guida di Paint.\",\n\t\"Select an area on which to get Help.\": \"Selezionare un'area per la quale si desidera visualizzare la Guida.\",\n\t\"%1 in %2\": \"%1 su %2\",\n\t\"Creates a new document.\": \"Crea un nuovo documento.\",\n\t\"Opens an existing document.\": \"Apre un documento esistente.\",\n\t\"Closes the active document.\": \"Chiude il documento attivo.\",\n\t\"Saves the active document.\": \"Salva il documento attivo.\",\n\t\"Saves the active document with a new name.\": \"Salva il documento attivo con un nuovo nome.\",\n\t\"Changes the page layout.\": \"Modifica le impostazioni della pagina.\",\n\t\"Specifies the default printer setup.\": \"Specifica l'impostazione della stampante predefinita.\",\n\t\"Prints the active document and sets printing options.\": \"Stampa il documento attivo e imposta le opzioni di stampa.\",\n\t\"Displays full pages.\": \"Mostra le pagine intere.\",\n\t\"Opens this document.\": \"Apre il documento.\",\n\t\"Deletes the selection.\": \"Annulla la selezione.\",\n\t\"Erases everything.\": \"Cancella tutto.\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"Copia l'area selezionata negli Appunti.\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"Taglia l'area selezionata e la copia negli Appunti.\",\n\t\"Finds the specified text.\": \"Trova il testo specificato.\",\n\t\"Inserts the contents of the Clipboard.\": \"Inserisce il contenuto degli Appunti.\",\n\t\"Repeats the last action.\": \"Ripete l'ultima operazione.\",\n\t\"Replaces specific text with different text.\": \"Sostituisce del testo specifico con altro testo.\",\n\t\"Selects everything.\": \"Seleziona tutto.\",\n\t\"Undoes the last action.\": \"Annulla l'ultima operazione.\",\n\t\"Redoes the previously undone action.\": \"Ripete l'ultima operazione annullata.\",\n\t\"Displays program information, version number, and copyright.\": \"Visualizza le informazioni sul programma, il numero della versione e il copyright.\",\n\t\"Quits Paint.\": \"Chiude Paint.\",\n\t\"Opens Paint Help.\": \"Apre la Guida di Paint.\",\n\t\"Displays instructions about how to use Help.\": \"Visualizza istruzioni sull'utilizzo della Guida.\",\n\t\"Displays Help for areas you click on.\": \"Visualizza la Guida corrispondente all'area selezionata.\",\n\t\"Displays Help for the current task or command.\": \"Apre la Guida.\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"Imposta la bitmap come nuovo sfondo centrato.\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"Imposta la bitmap come nuovo sfondo affiancato.\",\n\t\"Sends the selection using mail or fax.\": \"Invia la selezione per posta elettronica o fax.\",\n\t\"Prints the selection.\": \"Stampa l'area selezionata.\",\n\t\"Shows or hides the thumbnail.\": \"Mostra o nasconde Panoramica.\",\n\t\"Shows Paint Help.\": \"Mostra la Guida di Paint.\",\n\t\"Shows or hides the status bar.\": \"Mostra o nasconde la barra di stato.\",\n\t\"Shows or hides the tool box.\": \"Mostra o nasconde la casella degli strumenti.\",\n\t\"Shows or hides the color box.\": \"Mostra o nasconde la tavolozza.\",\n\t\"Only a Far East font can be used for vertical editing.\": \"Per la composizione verticale è possibile utilizzare solamente caratteri delle lingue dell'estremo oriente.\",\n\t\"Changes the window size.\": \"Modifica le dimensioni della finestra.\",\n\t\"Changes the window position.\": \"Modifica la posizione della finestra.\",\n\t\"Reduces the window to an icon.\": \"Riduce a icona la finestra.\",\n\t\"Enlarges the window to full size.\": \"Ingrandisce la finestra a tutto schermo.\",\n\t\"Switches to the next document window.\": \"Passa alla finestra di documento successiva.\",\n\t\"Switches to the previous document window.\": \"Torna alla finestra di documento precedente.\",\n\t\"Closes the active window and asks if you want to save changes.\": \"Chiude la finestra attiva e chiede di salvare il documento.\",\n\t\"Restores the window to normal size.\": \"Ripristina le dimensioni normali della finestra.\",\n\t\"Activates the task list.\": \"Attiva l'elenco dei processi.\",\n\t\"All Files (*.*)\": \"Tutti i file (*.*)\",\n\t\"Untitled\": \"Senza nome\",\n\t\"an unnamed file\": \"file senza nome\",\n\t\"&Hide\": \"&Nascondi\",\n\t\"Hide\": \"Nascondi\",\n\t\"No error message is available.\": \"Nessun messaggio di errore disponibile.\",\n\t\"An unsupported operation was attempted.\": \"Si è tentato di eseguire un'operazione non supportata.\",\n\t\"A required resource was unavailable.\": \"Risorsa richiesta non disponibile.\",\n\t\"Out of memory.\": \"Memoria insufficiente.\",\n\t\"An unknown error has occurred.\": \"Errore sconosciuto.\",\n\t\"on %1\": \"su %1\",\n\t\"&One Page\": \"&Una pagina\",\n\t\"One Page\": \"Una pagina\",\n\t\"&Two Page\": \"&Due pagine\",\n\t\"Two Page\": \"Due pagine\",\n\t\"Page %u\": \"Pagina %u\",\n\t\"Pages %u-%u\": \"Pagine %u-%u\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"File di stampa (*.prn)|*.prn|Tutti i file (*.*)|*.*||\",\n\t\"Print to File\": \"Stampa su file\",\n\t\"to %1\": \"su %1\",\n\t\"&Update %1\": \"&Aggiorna %1\",\n\t\"Update %1\": \"Aggiorna %1\",\n\t\"E&xit && Return to %1\": \"&Esci e torna a %1\",\n\t\"Exit & Return to %1\": \"Esci e torna a %1\",\n\t\"Linked %s\": \"Collegamento di %s\",\n\t\"Unknown Type\": \"Tipo sconosciuto\",\n\t\"Invalid filename.\": \"Nome file non valido.\",\n\t\"Failed to open document.\": \"Impossibile aprire il documento.\",\n\t\"Failed to save document.\": \"Impossibile salvare il documento.\",\n\t\"Save changes to %1?\": \"Salvare le modifiche apportate a %1?\",\n\t\"Failed to create empty document.\": \"Impossibile creare un documento vuoto.\",\n\t\"The file is too large to open.\": \"File troppo grande per essere aperto.\",\n\t\"Could not start print job.\": \"Impossibile avviare il processo di stampa.\",\n\t\"Failed to launch help.\": \"Impossibile aprire la Guida.\",\n\t\"Internal application error.\": \"Errore interno dell'applicazione.\",\n\t\"Command failed.\": \"Comando non riuscito.\",\n\t\"Insufficient memory to perform operation.\": \"Memoria insufficiente per eseguire l'operazione.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"Le voci del registro di sistema sono state rimosse e il file .INI (se presente) è stato eliminato\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"Non tutte le voci del registro di sistema (o file .INI) sono state rimosse.\",\n\t\"This program requires the file %s, which was not found on this system.\": \"Il programma richiede il file %s che non è stato trovato nel sistema.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"Questo programma è collegato all'esportazione mancante %s nel file %s. Questo computer potrebbe avere un versione di %s non compatibile.\",\n\t\"Please enter an integer.\": \"Immettere un numero intero.\",\n\t\"Please enter a number.\": \"Immettere un numero.\",\n\t\"Please enter an integer between %1 and %2.\": \"Immettere un numero intero compreso tra %1 e %2.\",\n\t\"Please enter a number between %1 and %2.\": \"Immettere un numero compreso tra %1 e %2.\",\n\t\"Please enter no more than %1 characters.\": \"Immettere un numero massimo di %1 caratteri.\",\n\t\"Please select a button.\": \"Scegliere un pulsante.\",\n\t\"Please enter an integer between 0 and 255.\": \"Immettere un numero intero compreso tra 0 e 255.\",\n\t\"Please enter a positive integer.\": \"Immettere un numero intero positivo.\",\n\t\"Please enter a date and/or time.\": \"Immettere una data e/o un'ora.\",\n\t\"Please enter a currency.\": \"Immettere una valuta.\",\n\t\"Unexpected file format.\": \"Formato file imprevisto.\",\n\t\"Cannot find this file.\": \"Impossibile trovare il file.\",\n\t\"Please verify that the correct path and file name are given.\": \"Verificare che il nome del file e il percorso siano corretti.\",\n\t\"Destination disk drive is full.\": \"L'unità di destinazione è piena.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"Impossibile leggere da %1, il file è correntemente in uso.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"Impossibile scrivere su %1, il file è di sola lettura o è stato aperto da un altro utente.\",\n\t\"An unexpected error occurred while reading %1.\": \"Errore imprevisto durante la lettura di %1.\",\n\t\"An unexpected error occurred while writing %1.\": \"Errore imprevisto durante la scrittura di %1.\",\n\t\"Unable to register document.\": \"Impossibile registrare il documento.\",\n\t\"The document may already be open.\": \"Il documento potrebbe essere aperto.\",\n\t\"Update %1 before proceeding?\": \"Aggiornare %1 prima di procedere?\",\n\t\"Could not update client.\": \"Impossibile aggiornare il client.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"Registrazione non riuscita. Le caratteristiche ActiveX potrebbero non funzionare correttamente.\",\n\t\"Failed to update the system registry.\": \"Impossibile aggiornare il registro di configurazione del sistema.\",\n\t\"Please try using REGEDIT.\": \"Riprovare usando REGEDIT.\",\n\t\"Unable to read write-only property.\": \"Impossibile leggere: proprietà di sola scrittura.\",\n\t\"Unable to write read-only property.\": \"Impossibile scrivere: proprietà di sola lettura.\",\n\t\"Unable to load mail system support.\": \"Impossibile caricare il supporto per la posta elettronica.\",\n\t\"Mail system DLL is invalid.\": \"La DLL del sistema di posta elettronica non è valida.\",\n\t\"Send Mail failed to send message.\": \"Impossibile inviare messaggi.\",\n\t\"No error occurred.\": \"Nessun errore rilevato.\",\n\t\"An unknown error occurred while accessing %1.\": \"Errore sconosciuto durante l'accesso a %1.\",\n\t\"%1 was not found.\": \"Impossibile trovare %1.\",\n\t\"%1 contains an invalid path.\": \"%1 contiene un percorso non valido.\",\n\t\"%1 could not be opened because there are too many open files.\": \"Impossibile aprire %1. Troppi file aperti.\",\n\t\"Access to %1 was denied.\": \"Accesso a %1 negato.\",\n\t\"An invalid file handle was associated with %1.\": \"Handle di file non valido associato a %1.\",\n\t\"%1 could not be removed because it is the current directory.\": \"Impossibile rimuovere %1 poiché si tratta della directory corrente.\",\n\t\"%1 could not be created because the directory is full.\": \"Impossibile creare %1 poiché la directory è piena.\",\n\t\"Seek failed on %1\": \"Ricerca non riuscita su %1\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"Errore di I/O dell'hardware rilevato durante l'accesso a %1.\",\n\t\"A sharing violation occurred while accessing %1.\": \"Violazione di condivisione durante l'accesso a %1.\",\n\t\"A locking violation occurred while accessing %1.\": \"Violazione di blocco durante l'accesso a %1.\",\n\t\"Disk full while accessing %1.\": \"Disco pieno durante l'accesso a %1.\",\n\t\"An attempt was made to access %1 past its end.\": \"Tentativo di accedere a %1 dopo la sua fine.\",\n\t\"An attempt was made to write to the reading %1.\": \"Tentativo di scrittura su %1 in lettura.\",\n\t\"An attempt was made to read from the writing %1.\": \"Tentativo di lettura su %1 in scrittura.\",\n\t\"%1 has a bad format.\": \"Formato di %1 non valido.\",\n\t\"%1 contained an unexpected object.\": \"%1 conteneva un oggetto imprevisto.\",\n\t\"%1 contains an incorrect schema.\": \"%1 contiene una combinazione non corretta.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"Seleziona una parte rettangolare dell'immagine da spostare, copiare o modificare.\",\n\t\"Select\": \"Seleziona\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"Seleziona una parte dell'immagine da spostare, copiare o modificare.\",\n\t\"Free-Form Select\": \"Seleziona parte\",\n\t\"Inserts text into the picture.\": \"Inserisce del testo nell'immagine.\",\n\t\"Fills an area with the current drawing color.\": \"Riempie un'area con il colore selezionato.\",\n\t\"Fill With Color\": \"Riempi\",\n\t\"Draws a straight line with the selected line width.\": \"Disegna una linea retta utilizzando lo spessore selezionato.\",\n\t\"Line\": \"Linea\",\n\t\"Draws using an airbrush of the selected size.\": \"Disegna utilizzando un aerografo con le dimensioni selezionate.\",\n\t\"Airbrush\": \"Aerografo\",\n\t\"Draws a curved line with the selected line width.\": \"Disegna una curva utilizzando lo spessore selezionato.\",\n\t\"Curve\": \"Curva\",\n\t\"Draws a polygon with the selected fill style.\": \"Disegna un poligono utilizzando il tipo di riempimento selezionato.\",\n\t\"Polygon\": \"Poligono\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"Disegna un rettangolo arrotondato utilizzando il tipo di riempimento selezionato.\",\n\t\"Rounded Rectangle\": \"Rettangolo arrotondato\",\n\t\"Draws a free-form line one pixel wide.\": \"Disegna una linea di spessore pari ad un pixel.\",\n\t\"Pencil\": \"Matita\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"Cancella una parte dell'immagine, utilizzando la gomma selezionata.\",\n\t\"Eraser/Color Eraser\": \"Cancella/Cancella colore\",\n\t\"Changes the magnification.\": \"Modifica il tipo di ingrandimento.\",\n\t\"Magnifier\": \"Ingrandisci\",\n\t\"Picks up a color from the picture for drawing.\": \"Sceglie un colore dall'immagine per disegnare.\",\n\t\"Pick Color\": \"Scegli colore\",\n\t\"Draws using a brush with the selected shape and size.\": \"Disegna utilizzando un pennello con la forma e le dimensioni selezionate.\",\n\t\"Brush\": \"Pennello\",\n\t\"Draws a rectangle with the selected fill style.\": \"Disegna un rettangolo utilizzando il tipo di riempimento selezionato.\",\n\t\"Rectangle\": \"Rettangolo\",\n\t\"Draws a filled rectangle.\": \"Disegna un rettangolo riempito.\",\n\t\"Draws an ellipse with the selected fill style.\": \"Disegna un'ellisse utilizzando il tipo di riempimento selezionato.\",\n\t\"Ellipse\": \"Ellisse\",\n\t\"Draws a filled ellipse.\": \"Disegna un'ellisse riempita.\",\n\t\"Makes the current selection either opaque or transparent.\": \"Rende la selezione corrente opaca o trasparente.\",\n\t\"Creates a new color.\": \"Crea un nuovo colore.\",\n\t\"Uses a previously saved palette of colors.\": \"Utilizza la tavolozza di colori salvata precedentemente.\",\n\t\"Saves the current palette of colors to a file.\": \"Salva la tavolozza di colori corrente su un file.\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"È necessario salvare il file prima di utilizzarlo come sfondo.\",\n\t\"The selection is now larger than the bitmap.\": \"L'area selezionata è più grande della bitmap.\",\n\t\"Would you like the bitmap enlarged?\": \"Ingrandire la bitmap?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"L'immagine negli Appunti è più grande della bitmap.\",\n\t\"The file is not in the correct format.\": \"Formato file non corretto.\",\n\t\"Not enough room to paste text.\": \"Spazio insufficiente per incollare il testo.\",\n\t\"Enlarge the text area and try again.\": \"Ingrandire l'area del testo e riprovare.\",\n\t\"Places the text.\": \"Colloca il testo.\"\n});\n"
  },
  {
    "path": "localization/ja/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"ja\", {\n\t\"Attributes\": \"キャンバスの色とサイズ\",\n\t\"MS Shell Dlg\": \"MS UI Gothic\",\n\t\"&Width:\": \"幅(&W):\",\n\t\"Width:\": \"幅:\",\n\t\"&Height:\": \"高さ(&H):\",\n\t\"Height:\": \"高さ:\",\n\t\"Units\": \"単位\",\n\t\"&Inches\": \"インチ(&I)\",\n\t\"Inches\": \"インチ\",\n\t\"C&m\": \"センチ(&M)\",\n\t\"Cm\": \"センチ\",\n\t\"&Pixels\": \"ピクセル(&P)\",\n\t\"Pixels\": \"ピクセル\",\n\t\"Colors\": \"色\",\n\t\"&Black and white\": \"白黒(&B)\",\n\t\"Black and white\": \"白黒\",\n\t\"Co&lors\": \"カラー(&L)\",\n\t\"Transparency\": \"透明フィルム\",\n\t\"Use &Transparent background color\": \"背景色に透明を使用(&T)\",\n\t\"Use Transparent background color\": \"背景色に透明を使用\",\n\t\"Select &Color\": \"色の選択(&C)\",\n\t\"Select Color\": \"色の選択\",\n\t\"Cancel\": \"キャンセル\",\n\t\"&Default\": \"既定値(&D)\",\n\t\"Default\": \"既定値\",\n\t\"Custom Zoom\": \"拡大率の指定\",\n\t\"Current zoom:\": \"現在の拡大率:\",\n\t\"Zoom to\": \"拡大率\",\n\t\"&100%\": \"100%(&1)\",\n\t\"100%\": \"100%\",\n\t\"&200%\": \"200%(&2)\",\n\t\"200%\": \"200%\",\n\t\"&400%\": \"400%(&4)\",\n\t\"400%\": \"400%\",\n\t\"&600%\": \"600%(&6)\",\n\t\"600%\": \"600%\",\n\t\"&800%\": \"800%(&8)\",\n\t\"800%\": \"800%\",\n\t\"Flip and Rotate\": \"反転と回転\",\n\t\"Flip or rotate\": \"反転/回転\",\n\t\"&Flip horizontal\": \"水平方向(&F)\",\n\t\"Flip horizontal\": \"水平方向\",\n\t\"Flip &vertical\": \"垂直方向(&V)\",\n\t\"Flip vertical\": \"垂直方向\",\n\t\"&Rotate by angle\": \"角度を指定(&R)\",\n\t\"Rotate by angle\": \"角度を指定\",\n\t\"&90°\": \"90 度(&9)\",\n\t\"90°\": \"90 度\",\n\t\"&180°\": \"180 度(&1)\",\n\t\"180°\": \"180 度\",\n\t\"&270°\": \"270 度(&2)\",\n\t\"270°\": \"270 度\",\n\t\"Stretch and Skew\": \"伸縮と傾き\",\n\t\"Stretch\": \"伸縮\",\n\t\"&Horizontal:\": \"水平方向(&H):\",\n\t\"Horizontal:\": \"水平方向:\",\n\t\"&Vertical:\": \"垂直方向(&V):\",\n\t\"Vertical:\": \"垂直方向:\",\n\t\"Skew\": \"傾き\",\n\t\"H&orizontal:\": \"水平方向(&O):\",\n\t\"Degrees\": \"度\",\n\t\"V&ertical:\": \"垂直方向(&E):\",\n\t\"Color Table\": \"カラー テーブル\",\n\t\"New\": \"新規作成\",\n\t\"&New \": \"新規(&N) \",\n\t\"New \": \"新規 \",\n\t\"&Help\": \"ヘルプ(&H)\",\n\t\"Help\": \"ヘルプ\",\n\t\"Printing\": \"印刷中\",\n\t\"on the\": \"を\",\n\t\"&Print\": \"印刷(&P)\",\n\t\"Print\": \"印刷\",\n\t\"&Next Page\": \"次のページ(&N)\",\n\t\"Next Page\": \"次のページ\",\n\t\"Pre&v Page\": \"前のページ(&V)\",\n\t\"Prev Page\": \"前のページ\",\n\t\"Zoom &In\": \"拡大(&I)\",\n\t\"Zoom In\": \"拡大\",\n\t\"Zoom &Out\": \"縮小(&O)\",\n\t\"Zoom Out\": \"縮小\",\n\t\"&Close\": \"閉じる(&C)\",\n\t\"Close\": \"閉じる\",\n\t\"Grid Settings\": \"グリッドの設定\",\n\t\"&Pixel Grid\": \"点で表示(&P)\",\n\t\"Pixel Grid\": \"点で表示\",\n\t\"&Tile Grid\": \"線で表示(&T)\",\n\t\"Tile Grid\": \"線で表示\",\n\t\"pixels\": \"ピクセル\",\n\t\"H&eight:\": \"高さ(&E):\",\n\t\"Text\": \"テキスト\",\n\t\"Undo\": \"元に戻す\",\n\t\"Cut\": \"切り取り\",\n\t\"Copy\": \"コピー\",\n\t\"Paste\": \"貼り付け\",\n\t\"Clear Selection\": \"選択範囲のクリア\",\n\t\"Select All\": \"すべて選択\",\n\t\"Text Toolbar\": \"書式バー\",\n\t\"Selection\": \"選択\",\n\t\"Cu&t\": \"切り取り(&T)\",\n\t\"&Copy\": \"コピー(&C)\",\n\t\"&Paste\": \"貼り付け(&P)\",\n\t\"C&lear Selection\": \"選択範囲のクリア(&L)\",\n\t\"Select &All\": \"すべて選択(&A)\",\n\t\"C&opy To\": \"ファイルへコピー(&O)\",\n\t\"Copy To\": \"コピー先\",\n\t\"Paste &From\": \"ファイルから貼り付け(&F)\",\n\t\"Paste From\": \"ファイルから貼り付け\",\n\t\"Flip/&Rotate\": \"反転と回転(&R)\",\n\t\"Flip/Rotate\": \"反転と回転\",\n\t\"&Stretch/Skew\": \"伸縮と傾き(&S)\",\n\t\"Stretch/Skew\": \"伸縮と傾き\",\n\t\"&Invert Colors\": \"色の反転(&I)\",\n\t\"Invert Colors\": \"色の反転\",\n\t\"Thumbnail\": \"実寸表示\",\n\t\"&File\": \"ファイル(&F)\",\n\t\"File\": \"ファイル\",\n\t\"&New\": \"新規作成(&N)\",\n\t\"&Open\": \"開く(&O)\",\n\t\"Open\": \"開く\",\n\t\"&Save\": \"上書き保存(&S)\",\n\t\"Save\": \"上書き保存\",\n\t\"Save &As\": \"名前を付けて保存(&A)\",\n\t\"Save As\": \"名前を付けて保存\",\n\t\"Print Pre&view\": \"印刷プレビュー(&V)\",\n\t\"Print Preview\": \"印刷プレビュー\",\n\t\"Page Se&tup\": \"ページ設定(&T)\",\n\t\"Page Setup\": \"ページ設定\",\n\t\"S&end\": \"送信(&E)\",\n\t\"Send\": \"送信\",\n\t\"Set As &Wallpaper (Tiled)\": \"壁紙に設定 (並べて表示) (&W)\",\n\t\"Set As Wallpaper (Tiled)\": \"壁紙に設定 (並べて表示)\",\n\t\"Set As Wa&llpaper (Centered)\": \"壁紙に設定 (中央に表示) (&L)\",\n\t\"Set As Wallpaper (Centered)\": \"壁紙に設定 (中央に表示)\",\n\t\"Recent File\": \"最新のファイル\",\n\t\"E&xit\": \"ペイントの終了(&X)\",\n\t\"Exit\": \"ペイントの終了\",\n\t\"&Edit\": \"編集(&E)\",\n\t\"Edit\": \"編集\",\n\t\"&Undo\": \"元に戻す(&U)\",\n\t\"&Repeat\": \"やり直し(&R)\",\n\t\"Repeat\": \"やり直し\",\n\t\"&View\": \"表示(&V)\",\n\t\"View\": \"表示\",\n\t\"&Tool Box\": \"ツール ボックス(&T)\",\n\t\"Tool Box\": \"ツール ボックス\",\n\t\"&Color Box\": \"カラー ボックス(&C)\",\n\t\"Color Box\": \"カラー ボックス\",\n\t\"&Status Bar\": \"ステータス バー(&S)\",\n\t\"Status Bar\": \"ステータス バー\",\n\t\"T&ext Toolbar\": \"書式バー(&E)\",\n\t\"&Zoom\": \"拡大(&Z)\",\n\t\"Zoom\": \"拡大\",\n\t\"&Normal Size\": \"標準に戻す(&N)\",\n\t\"Normal Size\": \"標準に戻す\",\n\t\"&Large Size\": \"拡大する(&L)\",\n\t\"Large Size\": \"拡大する\",\n\t\"C&ustom\": \"拡大率の指定(&U)\",\n\t\"Custom\": \"拡大率の指定\",\n\t\"Show &Grid\": \"グリッドを表示(&G)\",\n\t\"Show Grid\": \"グリッドを表示\",\n\t\"Show T&humbnail\": \"実寸表示(&H)\",\n\t\"Show Thumbnail\": \"実寸表示\",\n\t\"&View Bitmap\": \"ビットマップ表示(&V)\",\n\t\"View Bitmap\": \"ビットマップ表示\",\n\t\"&Image\": \"変形(&I)\",\n\t\"Image\": \"変形\",\n\t\"&Flip/Rotate\": \"反転と回転(&F)\",\n\t\"&Attributes\": \"キャンバスの色とサイズ(&A)\",\n\t\"&Clear Image\": \"すべてクリア(&C)\",\n\t\"Clear Image\": \"すべてクリア\",\n\t\"Ctrl+Shft+N\": \"Ctrl+Shift+N\",\n\t\"&Draw Opaque\": \"背景色を不透明にする(&D)\",\n\t\"Draw Opaque\": \"背景色を不透明にする\",\n\t\"&Colors\": \"色(&C)\",\n\t\"&Edit Colors\": \"色の編集(&E)\",\n\t\"Edit Colors\": \"色の編集\",\n\t\"&Help Topics\": \"トピックの検索(&H)\",\n\t\"Help Topics\": \"トピックの検索\",\n\t\"&About Paint\": \"バージョン情報(&A)\",\n\t\"About Paint\": \"バージョン情報\",\n\t\"&Update\": \"更新(&U)\",\n\t\"Update\": \"更新\",\n\t\"Save Copy &As\": \"名前を付けて保存(&A)\",\n\t\"Save Copy As\": \"名前を付けて保存\",\n\t\"Paint\": \"ペイント\",\n\t\"untitled\": \"無題\",\n\t\"Bitmap Image\": \"ビットマップの絵\",\n\t\"Bitmap Files (*.bmp)\": \"ビットマップ ファイル (*.bmp)\",\n\t\"PCX Files\": \"PCX ファイル\",\n\t\"Icon Files\": \"アイコン ファイル\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"白黒ビットマップ (*.bmp;*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"16 色ビットマップ (*.bmp;*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"256 色ビットマップ (*.bmp;*.dib)\",\n\t\"Paint cannot open this file.\": \"このファイルは開けません。\",\n\t\"Paint cannot read this file.\": \"このファイルは読み取れません。\",\n\t\"This file is read-only.\": \"このファイルは読み取り専用です。\",\n\t\"To save your changes, use a different filename.\": \"変更を保存するには、別のファイル名を使ってください。\",\n\t\"This file is already open.\": \"このファイルは既に開かれています。\",\n\t\"This is not a valid .PCS file.\": \"この PCS ファイルは無効です。\",\n\t\"This file is open for editing and cannot be overwritten.\": \"このファイルには上書きできません。\",\n\t\"Use a different filename to save your changes.\": \"別のファイル名で保存してください。\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"このビットマップ ファイルは無効であるか、または現在サポートされていない形式です。\",\n\t\"This is not a valid icon.\": \"このアイコンは無効です。\",\n\t\"This is not a valid cursor.\": \"このポインタは無効です。\",\n\t\"Save was interrupted, so your file has not been saved.\": \"保存が中断されたので、ファイルは保存されませんでした。\",\n\t\"You cannot save to a read-only file.\": \"読み取り専用ファイルには保存できません。\",\n\t\"Use a different file name.\": \"別のファイル名にしてください。\",\n\t\"This file is already in use.\": \"このファイルは既に使われています。\",\n\t\"Close the program, and then try again.\": \"アプリケーションを終了して、やり直してください。\",\n\t\"Paint cannot save this file.\": \"このファイルは保存できません。\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"ファイルの種類が違うため、同じファイル名では保存できません。\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"グリッドの間隔には、%d から %d の間の整数を指定してください。\",\n\t\"There is not enough memory or resources to complete operation.\": \"メモリまたはリソースが足りないため、作業を完了できません。\",\n\t\"Close some programs, and then try again.\": \"いくつかのアプリケーションを終了して、もう一度やり直してください。\",\n\t\"Low on memory or resources.\": \"メモリまたはリソースが足りません。\",\n\t\"Group error.\": \"グループ エラーです。\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"ドキュメントを印刷できませんでした。十分なディスク領域があることと、プリンタが正しく動作していることを確認してください。\",\n\t\"Saving into this format may cause some loss of color information.\": \"この形式に保存すると、カラー情報のいくつかが失われる可能性があります。\",\n\t\"Do you want to continue?\": \"続行しますか?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"白黒への変換は元に戻せません。この操作を行うと現在のファイルに影響を及ぼし、色の情報が失われる可能性があります。\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"ビットマップは、1 辺あたり 1 ピクセルより大きくなければなりません。\",\n\t\"Generic error.\": \"エラーです。\",\n\t\"File not found.\": \"ファイルが見つかりません。\",\n\t\"Bad path.\": \"パスが違っています。\",\n\t\"Too many open files.\": \"開いているファイルの数が多すぎます。\",\n\t\"Access denied.\": \"アクセスは拒否されました。\",\n\t\"Invalid file.\": \"無効なファイルです。\",\n\t\"Remove current folder.\": \"現在のフォルダを削除します。\",\n\t\"Folder full.\": \"フォルダがいっぱいです。\",\n\t\"Bad seek.\": \"シーク エラーです。\",\n\t\"Hard IO error.\": \"ハードウェア I/O エラーです。\",\n\t\"Sharing violation.\": \"共有違反です。\",\n\t\"Lock violation.\": \"ロック違反です。\",\n\t\"Disk full.\": \"ディスクがいっぱいです。\",\n\t\"End of file.\": \"ファイルの終わりです。\",\n\t\"Error getting the Clipboard Data!\": \"クリップボードのエラーです。\",\n\t\"No Printer Found @ page setup\": \"プリンタが見つかりません。\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"24 ビット ビットマップ (*.bmp;*.dib)\",\n\t\"All Files\": \"すべてのファイル\",\n\t\"Palette|*.pal|\": \"パレット|*.pal|\",\n\t\"untitled.pal\": \"無題.pal\",\n\t\"OLE 2.0 was unable to start.\": \"OLE 2.0 を起動できませんでした。\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"OLE ライブラリのバージョンが合っているかどうか確認してください。\",\n\t\"Resets the text be without any attributes.\": \"テキストを元の状態に戻します。\",\n\t\"Sets or clears the text bold attribute.\": \"テキストの太字設定を切り替えます。\",\n\t\"Sets or clears the text italic attribute.\": \"テキストの斜体設定を切り替えます。\",\n\t\"Selects the font used by the text.\": \"テキストで使うフォントを選びます。\",\n\t\"Selects the point size of the text.\": \"テキストで使うフォント サイズを選びます。\",\n\t\"Sets or clears the text underline attribute.\": \"テキストの下線設定を切り替えます。\",\n\t\"Shows or hides the tooltips.\": \"ツールのヒントの表示/非表示を切り替えます。\",\n\t\"Show Paint Help.\": \"ペイントのヘルプを表示します。\",\n\t\"Sends a picture by using mail or fax.\": \"メールまたは FAX で絵を送信します。\",\n\t\"Copies the selection to a file.\": \"選択範囲をファイルにコピーします。\",\n\t\"Pastes a file into the selection.\": \"選択範囲にファイルを貼り付けます。\",\n\t\"Zooms the picture to 100%.\": \"絵を 100% に戻します。\",\n\t\"Zooms the picture to 400%.\": \"絵を 4 倍に拡大します。\",\n\t\"Zooms the picture.\": \"絵を拡大します。\",\n\t\"Displays the entire picture.\": \"絵を画面全体に表示します。\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"実寸の表示/非表示を切り替えます。\",\n\t\"Shows or hides the grid.\": \"グリッドの表示/非表示を切り替えます。\",\n\t\"Shows or hides the text toolbar.\": \"書式バーの表示/非表示を切り替えます。\",\n\t\"Flips or rotates the picture or a selection.\": \"絵または選択範囲を反転/回転させます。\",\n\t\"Stretches or skews the picture or a selection.\": \"絵または選択範囲を伸縮/傾斜させます。\",\n\t\"Inverts the colors of the picture or a selection.\": \"絵または選択範囲の色を反転させます。\",\n\t\"Changes the attributes of the picture.\": \"キャンバスの色とサイズを変更します。\",\n\t\"Clears the picture or selection.\": \"絵または選択範囲をクリアします。\",\n\t\"The font size must be a numeric value.\": \"フォント サイズは数字で指定してください。\",\n\t\"Contains commands for working with the selected item(s).\": \"選択したオブジェクトを操作するコマンドです。\",\n\t\"Contains commands for selecting and transferring items.\": \"オブジェクトを選択したり転送するコマンドです。\",\n\t\"Contains commands for customizing this window.\": \"このウィンドウを設定するコマンドです。\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"絵を操作したりキャンバスの設定を変えるコマンドです。\",\n\t\"Contains commands for using custom colors and drawing options.\": \"色やオプションを設定するコマンドです。\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"ペイントのヘルプやバージョン情報を表示するコマンドです。\",\n\t\"Cannot save file.\": \"ファイルを保存できません。\",\n\t\"Error removing temporary file.\": \"一時ファイルを削除できません。\",\n\t\"Get Colors\": \"パレットの交換\",\n\t\"Save Colors\": \"パレットの保存\",\n\t\"File last saved:\": \"ファイルの最終保存:\",\n\t\"Not Available\": \"利用できません\",\n\t\"Size on disk:\": \"ディスク上のサイズ:\",\n\t\"%s bytes\": \"%s バイト\",\n\t\"Painting\": \"絵\",\n\t\"Bitmap\": \"ビットマップ\",\n\t\"Fonts\": \"書式設定\",\n\t\"Tools\": \"ツール\",\n\t\"All Picture Files\": \"すべてのピクチャ ファイル\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"ヘルプを見るには、[ヘルプ] メニューの [トピックの検索] を選んでください。\",\n\t\"Select an area on which to get Help.\": \"ヘルプを見る項目を選んでください。\",\n\t\"%1 in %2\": \"%2 の %1\",\n\t\"Creates a new document.\": \"新しいファイルを作成します。\",\n\t\"Opens an existing document.\": \"既存のファイルを開きます。\",\n\t\"Closes the active document.\": \"現在のファイルを閉じます。\",\n\t\"Saves the active document.\": \"現在のファイルを保存します。\",\n\t\"Saves the active document with a new name.\": \"現在のファイルを新しい名前で保存します。\",\n\t\"Changes the page layout.\": \"ページ レイアウトの設定を変更します。\",\n\t\"Specifies the default printer setup.\": \"通常使うプリンタの設定を指定します。\",\n\t\"Prints the active document and sets printing options.\": \"印刷オプションを設定し、現在のファイルを印刷します。\",\n\t\"Displays full pages.\": \"ページ全体を表示します。\",\n\t\"Opens this document.\": \"このファイルを開きます。\",\n\t\"Deletes the selection.\": \"選択範囲を削除します。\",\n\t\"Erases everything.\": \"すべてクリアします。\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"選択範囲をクリップボードにコピーします。\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"選択範囲を切り取ってクリップボードに移動します。\",\n\t\"Finds the specified text.\": \"指定された文字列を検索します。\",\n\t\"Inserts the contents of the Clipboard.\": \"クリップボードの内容を挿入します。\",\n\t\"Repeats the last action.\": \"直前に行った操作をやり直します。\",\n\t\"Replaces specific text with different text.\": \"指定された文字列をほかの文字列に置き換えます。\",\n\t\"Selects everything.\": \"すべての範囲を選択します。\",\n\t\"Undoes the last action.\": \"直前に行った操作を取り消します。\",\n\t\"Redoes the previously undone action.\": \"取り消した操作をやり直します。\",\n\t\"Displays program information, version number, and copyright.\": \"プログラム情報、バージョン、著作権を表示します。\",\n\t\"Quits Paint.\": \"ペイントを終了します。\",\n\t\"Opens Paint Help.\": \"ペイントのヘルプを開きます。\",\n\t\"Displays instructions about how to use Help.\": \"ヘルプの使い方を表示します。\",\n\t\"Displays Help for areas you click on.\": \"クリックした項目のヘルプを表示します。\",\n\t\"Displays Help for the current task or command.\": \"ヘルプ トピックを表示します。\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"このビットマップを壁紙として使用し、中央に表示します。\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"このビットマップを壁紙として使用し、並べて表示します。\",\n\t\"Sends the selection using mail or fax.\": \"メールまたは FAX で選択範囲を送信します。\",\n\t\"Prints the selection.\": \"選択範囲を印刷します。\",\n\t\"Shows or hides the thumbnail.\": \"実寸の表示/非表示を切り替えます。\",\n\t\"Shows Paint Help.\": \"ペイントのヘルプを表示します。\",\n\t\"Shows or hides the status bar.\": \"ステータス バーの表示/非表示を切り替えます。\",\n\t\"Shows or hides the tool box.\": \"ツール ボックスの表示/非表示を切り替えます。\",\n\t\"Shows or hides the color box.\": \"カラー ボックスの表示/非表示を切り替えます。\",\n\t\"Only a Far East font can be used for vertical editing.\": \"極東アジア言語のフォントを使用する場合のみ縦書き編集が可能です。\",\n\t\"Changes the window size.\": \"このウィンドウのサイズを変更します。\",\n\t\"Changes the window position.\": \"このウィンドウを画面の別の位置に移動します。\",\n\t\"Reduces the window to an icon.\": \"このウィンドウを最小化します。\",\n\t\"Enlarges the window to full size.\": \"このウィンドウを画面いっぱいに拡大します。\",\n\t\"Switches to the next document window.\": \"次のドキュメント ウィンドウに切り替えます。\",\n\t\"Switches to the previous document window.\": \"前のドキュメント ウィンドウに切り替えます。\",\n\t\"Closes the active window and asks if you want to save changes.\": \"変更の保存を確認してから、アクティブ ウィンドウを閉じます。\",\n\t\"Restores the window to normal size.\": \"ウィンドウを通常の大きさに戻します。\",\n\t\"Activates the task list.\": \"タクス リストを表示します。\",\n\t\"All Files (*.*)\": \"すべてのファイル (*.*)\",\n\t\"Untitled\": \"無題\",\n\t\"an unnamed file\": \"無題のファイル\",\n\t\"&Hide\": \"非表示(&H)\",\n\t\"Hide\": \"非表示\",\n\t\"No error message is available.\": \"エラー メッセージはありません。\",\n\t\"An unsupported operation was attempted.\": \"サポートされていない操作を実行しました。\",\n\t\"A required resource was unavailable.\": \"必要なリソースを利用できませんでした。\",\n\t\"Out of memory.\": \"メモリが不足しています。\",\n\t\"An unknown error has occurred.\": \"不明なエラーが発生しました。\",\n\t\"on %1\": \"%1 へ出力中\",\n\t\"&One Page\": \"1 ページ(&O)\",\n\t\"One Page\": \"1 ページ\",\n\t\"&Two Page\": \"2 ページ(&T)\",\n\t\"Two Page\": \"2 ページ\",\n\t\"Page %u\": \"ページ %u\",\n\t\"Pages %u-%u\": \"ページ %u-%u\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"プリンタ ファイル (*.prn)|*.prn|すべてのファイル (*.*)|*.*||\",\n\t\"Print to File\": \"ファイルへ出力\",\n\t\"to %1\": \"%1 へ\",\n\t\"&Update %1\": \"%1 を更新(&U)\",\n\t\"Update %1\": \"%1 を更新\",\n\t\"E&xit && Return to %1\": \"終了して %1 に戻る(&X)\",\n\t\"Exit & Return to %1\": \"終了して %1 に戻る\",\n\t\"Linked %s\": \"%s をリンクしました。\",\n\t\"Unknown Type\": \"不明な型です。\",\n\t\"Invalid filename.\": \"無効なファイル名です。\",\n\t\"Failed to open document.\": \"ドキュメントを開くことに失敗しました。\",\n\t\"Failed to save document.\": \"ドキュメントの保存に失敗しました。\",\n\t\"Save changes to %1?\": \"%1 への変更を保存しますか?\",\n\t\"Failed to create empty document.\": \"空のドキュメントの作成に失敗しました。\",\n\t\"The file is too large to open.\": \"ファイルが大きすぎて開けません。\",\n\t\"Could not start print job.\": \"印刷ジョブを開始できませんでした。\",\n\t\"Failed to launch help.\": \"ヘルプの起動に失敗しました。\",\n\t\"Internal application error.\": \"アプリケーションの内部エラーです。\",\n\t\"Command failed.\": \"コマンドの実行に失敗しました。\",\n\t\"Insufficient memory to perform operation.\": \"メモリ不足のため実行できません。\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"システム レジストリ エントリは削除されています。また、INI ファイルがある場合は、 INI ファイルも削除されました。\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"一部のシステム レジストリ エントリ (または INI ファイル) は削除されませんでした。\",\n\t\"This program requires the file %s, which was not found on this system.\": \"このプログラムにはファイル %s が必要ですがこのシステム上に見つかりませんでした。\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"このプログラムは欠落エクスポート %s にファイル %s 内でリンクされています。このコンピュータは互換性のないバージョンの %s を含んでいる可能性があります。\",\n\t\"Please enter an integer.\": \"整数を入力してください。\",\n\t\"Please enter a number.\": \"数字を入力してください。\",\n\t\"Please enter an integer between %1 and %2.\": \"%1 から %2 までの整数を入力してください。\",\n\t\"Please enter a number between %1 and %2.\": \"%1 から %2 までの数字を入力してください。\",\n\t\"Please enter no more than %1 characters.\": \"%1 文字以内で入力してください。\",\n\t\"Please select a button.\": \"ボタンを選択してください。\",\n\t\"Please enter an integer between 0 and 255.\": \"0 から 255 までの整数を入力してください。\",\n\t\"Please enter a positive integer.\": \"正の整数を入力してください。\",\n\t\"Please enter a date and/or time.\": \"日付/時刻を入力してください。\",\n\t\"Please enter a currency.\": \"通貨型を入力してください。\",\n\t\"Unexpected file format.\": \"予期しないファイル形式です。\",\n\t\"Cannot find this file.\": \"このファイルが見つかりません。\",\n\t\"Please verify that the correct path and file name are given.\": \"パスとファイル名が正しいかどうか確認してください。\",\n\t\"Destination disk drive is full.\": \"受け側のディスク ドライブがいっぱいです。\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"%1 は使用中のため、読み取れません。\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"%1 は使用中、または読み取り専用のため、書き込めません。\",\n\t\"An unexpected error occurred while reading %1.\": \"%1 の読み取り中に予期しないエラーが発生しました。\",\n\t\"An unexpected error occurred while writing %1.\": \"%1 の書き込み中に予期しないエラーが発生しました。\",\n\t\"Unable to register document.\": \"ドキュメントを登録できません。\",\n\t\"The document may already be open.\": \"ドキュメントは既に開かれている可能性があります。\",\n\t\"Update %1 before proceeding?\": \"先に %1 を更新しますか?\",\n\t\"Could not update client.\": \"クライアントを更新できませんでした。\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"登録に失敗しました。ActiveX の機能は正しく動作しない可能性があります。\",\n\t\"Failed to update the system registry.\": \"システム レジストリの更新に失敗しました。\",\n\t\"Please try using REGEDIT.\": \"REGEDIT を使って更新してください。\",\n\t\"Unable to read write-only property.\": \"書き込み専用プロパティからは読み取れません。\",\n\t\"Unable to write read-only property.\": \"読み取り専用プロパティには書き込めません。\",\n\t\"Unable to load mail system support.\": \"メール システム サポートを読み込めません。\",\n\t\"Mail system DLL is invalid.\": \"メール システム DLL が無効です。\",\n\t\"Send Mail failed to send message.\": \"メールの送信に失敗しました。\",\n\t\"No error occurred.\": \"エラーはありませんでした。\",\n\t\"An unknown error occurred while accessing %1.\": \"%1 へのアクセス中に不明なエラーが発生しました。\",\n\t\"%1 was not found.\": \"%1 が見つかりませんでした。\",\n\t\"%1 contains an invalid path.\": \"%1 には無効なパスが含まれています。\",\n\t\"%1 could not be opened because there are too many open files.\": \"開いているファイルが多すぎるため、%1 を開けませんでした。\",\n\t\"Access to %1 was denied.\": \"%1 へのアクセスは拒否されました。\",\n\t\"An invalid file handle was associated with %1.\": \"%1 へ無効なファイル ハンドルが関連付けられていました。\",\n\t\"%1 could not be removed because it is the current directory.\": \"現在のディレクトリ %1 は削除できませんでした。\",\n\t\"%1 could not be created because the directory is full.\": \" %1 を作成できませんでした。そのディレクトリはいっぱいです。\",\n\t\"Seek failed on %1\": \"%1 のシークに失敗しました\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"%1 へのアクセス中にハードウェア I/O エラーが報告されました。\",\n\t\"A sharing violation occurred while accessing %1.\": \"%1 へのアクセス中に共有違反が発生しました。\",\n\t\"A locking violation occurred while accessing %1.\": \"%1 へのアクセス中にロック違反が発生しました。\",\n\t\"Disk full while accessing %1.\": \"%1 へのアクセス中にディスクがいっぱいになりました。\",\n\t\"An attempt was made to access %1 past its end.\": \"%1 の末尾以降にアクセスしようとしました。\",\n\t\"An attempt was made to write to the reading %1.\": \"%1 の読み取り中に書き込もうとしました。\",\n\t\"An attempt was made to read from the writing %1.\": \"%1 へ書き込み中に読み取ろうとしました。\",\n\t\"%1 has a bad format.\": \"%1 の形式が正しくありません。\",\n\t\"%1 contained an unexpected object.\": \"%1 は予期しないオブジェクトを含んでいます。\",\n\t\"%1 contains an incorrect schema.\": \"%1 は不正なスキーマを含んでいます。\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"絵の一部を四角形で選択して、移動、コピー、または編集します。\",\n\t\"Select\": \"選択\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"絵の一部を選択して、移動、コピー、または編集します。\",\n\t\"Free-Form Select\": \"自由選択\",\n\t\"Inserts text into the picture.\": \"絵の中にテキストを貼り付けます。\",\n\t\"Fills an area with the current drawing color.\": \"現在の色で領域を塗りつぶします。\",\n\t\"Fill With Color\": \"塗りつぶし\",\n\t\"Draws a straight line with the selected line width.\": \"選択された太さの線で、直線を引きます。\",\n\t\"Line\": \"直線\",\n\t\"Draws using an airbrush of the selected size.\": \"選択されたサイズのエアブラシで描きます。\",\n\t\"Airbrush\": \"エアブラシ\",\n\t\"Draws a curved line with the selected line width.\": \"選択された太さの線で、曲線を引きます。\",\n\t\"Curve\": \"曲線\",\n\t\"Draws a polygon with the selected fill style.\": \"選択された塗りつぶし形式で、多角形を描きます。\",\n\t\"Polygon\": \"多角形\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"選択された塗りつぶし形式で、角の丸い四角形を描きます。\",\n\t\"Rounded Rectangle\": \"角丸四角形\",\n\t\"Draws a free-form line one pixel wide.\": \"1 ピクセル幅の線を引きます。\",\n\t\"Pencil\": \"鉛筆\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"選択された消しゴムで、絵の一部を消します。\",\n\t\"Eraser/Color Eraser\": \"消しゴム/カラー消しゴム\",\n\t\"Changes the magnification.\": \"拡大または縮小します。\",\n\t\"Magnifier\": \"拡大と縮小\",\n\t\"Picks up a color from the picture for drawing.\": \"絵の中から、色を選択します。\",\n\t\"Pick Color\": \"色の選択\",\n\t\"Draws using a brush with the selected shape and size.\": \"選択された形や幅のブラシで描きます。\",\n\t\"Brush\": \"ブラシ\",\n\t\"Draws a rectangle with the selected fill style.\": \"選択された塗りつぶし形式で、四角形を描きます。\",\n\t\"Rectangle\": \"四角形\",\n\t\"Draws a filled rectangle.\": \"塗りつぶし四角形を描きます。\",\n\t\"Draws an ellipse with the selected fill style.\": \"選択された塗りつぶし形式で、楕円を描きます。\",\n\t\"Ellipse\": \"楕円\",\n\t\"Draws a filled ellipse.\": \"塗りつぶし楕円を描きます。\",\n\t\"Makes the current selection either opaque or transparent.\": \"選択範囲の背景色を不透明または透明にします。\",\n\t\"Creates a new color.\": \"新しい色を作成します。\",\n\t\"Uses a previously saved palette of colors.\": \"以前に保存したパレットを使用します。\",\n\t\"Saves the current palette of colors to a file.\": \"現在のパレットをファイルに保存します。\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"壁紙に指定する前に、ファイルを保存しなければなりません。\",\n\t\"The selection is now larger than the bitmap.\": \"選択範囲はビットマップより大きいです。\",\n\t\"Would you like the bitmap enlarged?\": \"ビットマップを大きくしますか?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"クリップボードの絵はビットマップより大きいです。\",\n\t\"The file is not in the correct format.\": \"ファイルの形式が正しくありません。\",\n\t\"Not enough room to paste text.\": \"テキストを貼り付けるスペースがありません。\",\n\t\"Enlarge the text area and try again.\": \"テキスト領域を広げて、やり直してください。\",\n\t\"Places the text.\": \"テキストを配置します。\"\n});\n"
  },
  {
    "path": "localization/ko/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"ko\", {\n\t\"Attributes\": \"속성\",\n\t\"MS Shell Dlg\": \"굴림\",\n\t\"&Width:\": \"너비(&W):\",\n\t\"Width:\": \"너비:\",\n\t\"&Height:\": \"높이(&H):\",\n\t\"Height:\": \"높이:\",\n\t\"Units\": \"단위\",\n\t\"&Inches\": \"인치(&I)\",\n\t\"Inches\": \"인치\",\n\t\"C&m\": \"센티미터(&M)\",\n\t\"Cm\": \"센티미터\",\n\t\"&Pixels\": \"픽셀(&P)\",\n\t\"Pixels\": \"픽셀\",\n\t\"Colors\": \"색상\",\n\t\"&Black and white\": \"흑백(&B)\",\n\t\"Black and white\": \"흑백\",\n\t\"Co&lors\": \"컬러(&L)\",\n\t\"Transparency\": \"투명\",\n\t\"Use &Transparent background color\": \"투명한 배경색 사용(&T)\",\n\t\"Use Transparent background color\": \"투명한 배경색 사용\",\n\t\"Select &Color\": \"색 선택(&C)\",\n\t\"Select Color\": \"색 선택\",\n\t\"OK\": \"확인\",\n\t\"Cancel\": \"취소\",\n\t\"&Default\": \"기본값(&D)\",\n\t\"Default\": \"기본값\",\n\t\"Custom Zoom\": \"사용자 정의 확대/축소\",\n\t\"Current zoom:\": \"현재 배율:\",\n\t\"Zoom to\": \"축소/확대 배율\",\n\t\"&100%\": \"100%(&1)\",\n\t\"100%\": \"100%\",\n\t\"&200%\": \"200%(&2)\",\n\t\"200%\": \"200%\",\n\t\"&400%\": \"400%(&4)\",\n\t\"400%\": \"400%\",\n\t\"&600%\": \"600%(&6)\",\n\t\"600%\": \"600%\",\n\t\"&800%\": \"800%(&8)\",\n\t\"800%\": \"800%\",\n\t\"Flip and Rotate\": \"대칭 이동/회전\",\n\t\"Flip or rotate\": \"대칭 이동 또는 회전\",\n\t\"&Flip horizontal\": \"수평 대칭 이동(&F)\",\n\t\"Flip horizontal\": \"수평 대칭 이동\",\n\t\"Flip &vertical\": \"수직 대칭 이동(&V)\",\n\t\"Flip vertical\": \"수직 대칭 이동\",\n\t\"&Rotate by angle\": \"회전 각도(&R)\",\n\t\"Rotate by angle\": \"회전 각도\",\n\t\"&90°\": \"90°(&9)\",\n\t\"90°\": \"90°\",\n\t\"&180°\": \"180°(&1)\",\n\t\"180°\": \"180°\",\n\t\"&270°\": \"270°(&2)\",\n\t\"270°\": \"270°\",\n\t\"Stretch and Skew\": \"늘이기/기울이기\",\n\t\"Stretch\": \"늘이기\",\n\t\"&Horizontal:\": \"수평(&H):\",\n\t\"Horizontal:\": \"수평:\",\n\t\"&Vertical:\": \"수직(&V):\",\n\t\"Vertical:\": \"수직:\",\n\t\"Skew\": \"기울이기\",\n\t\"H&orizontal:\": \"수평(&O):\",\n\t\"Degrees\": \"도\",\n\t\"V&ertical:\": \"수직(&E):\",\n\t\"Color Table\": \"색상표\",\n\t\"New\": \"새로 만들기\",\n\t\"&New \": \"새로 만들기(&N)\",\n\t\"New \": \"새로 만들기\",\n\t\"&Help\": \"도움말(&H)\",\n\t\"Help\": \"도움말\",\n\t\"Printing\": \"인쇄 중\",\n\t\"on the\": \"프린터 -\",\n\t\"&Print\": \"인쇄(&P)\",\n\t\"Print\": \"인쇄\",\n\t\"&Next Page\": \"다음 페이지(&N)\",\n\t\"Next Page\": \"다음 페이지\",\n\t\"Pre&v Page\": \"이전 페이지(&V)\",\n\t\"Prev Page\": \"이전 페이지\",\n\t\"Zoom &In\": \"확대(&I)\",\n\t\"Zoom In\": \"확대\",\n\t\"Zoom &Out\": \"축소(&O)\",\n\t\"Zoom Out\": \"축소\",\n\t\"&Close\": \"닫기(&C)\",\n\t\"Close\": \"닫기\",\n\t\"Grid Settings\": \"눈금 설정\",\n\t\"&Pixel Grid\": \"픽셀 눈금(&P)\",\n\t\"Pixel Grid\": \"픽셀 눈금\",\n\t\"&Tile Grid\": \"바둑판식 눈금(&T)\",\n\t\"Tile Grid\": \"바둑판식 눈금\",\n\t\"pixels\": \"픽셀\",\n\t\"H&eight:\": \"높이(&E):\",\n\t\"Text\": \"텍스트\",\n\t\"Undo\": \"실행 취소\",\n\t\"Cut\": \"잘라내기\",\n\t\"Copy\": \"복사\",\n\t\"Paste\": \"붙여넣기\",\n\t\"Clear Selection\": \"선택 영역 지우기\",\n\t\"Select All\": \"모두 선택\",\n\t\"Text Toolbar\": \"텍스트 도구 모음\",\n\t\"Selection\": \"선택 영역\",\n\t\"Cu&t\": \"잘라내기(&T)\",\n\t\"&Copy\": \"복사(&C)\",\n\t\"&Paste\": \"붙여넣기(&P)\",\n\t\"C&lear Selection\": \"선택 영역 지우기(&L)\",\n\t\"Select &All\": \"모두 선택(&A)\",\n\t\"C&opy To\": \"선택 영역 저장(&O)\",\n\t\"Copy To\": \"선택 영역 저장\",\n\t\"Paste &From\": \"파일로부터 붙여넣기(&F)\",\n\t\"Paste From\": \"파일로부터 붙여넣기\",\n\t\"Flip/&Rotate\": \"대칭 이동/회전(&R)\",\n\t\"Flip/Rotate\": \"대칭 이동/회전\",\n\t\"&Stretch/Skew\": \"늘이기/기울이기(&S)\",\n\t\"Stretch/Skew\": \"늘이기/기울이기\",\n\t\"&Invert Colors\": \"색 반전(&I)\",\n\t\"Invert Colors\": \"색 반전\",\n\t\"Thumbnail\": \"멀리 보기\",\n\t\"&File\": \"파일(&F)\",\n\t\"File\": \"파일\",\n\t\"&New\": \"새로 만들기(&N)\",\n\t\"&Open\": \"열기(&O)\",\n\t\"Open\": \"열기\",\n\t\"&Save\": \"저장(&S)\",\n\t\"Save\": \"저장\",\n\t\"Save &As\": \"다른 이름으로 저장(&A)\",\n\t\"Save As\": \"다른 이름으로 저장\",\n\t\"Print Pre&view\": \"미리 보기(&V)\",\n\t\"Print Preview\": \"미리 보기\",\n\t\"Page Se&tup\": \"페이지 설정(&T)\",\n\t\"Page Setup\": \"페이지 설정\",\n\t\"S&end\": \"보내기(&E)\",\n\t\"Send\": \"보내기\",\n\t\"Set As &Wallpaper (Tiled)\": \"배경 무늬로 설정(바둑판식)(&W)\",\n\t\"Set As Wallpaper (Tiled)\": \"배경 무늬로 설정(바둑판식)\",\n\t\"Set As Wa&llpaper (Centered)\": \"배경 무늬로 설정(가운데)(&L)\",\n\t\"Set As Wallpaper (Centered)\": \"배경 무늬로 설정(가운데)\",\n\t\"Recent File\": \"최근에 사용한 파일\",\n\t\"E&xit\": \"끝내기(&X)\",\n\t\"Exit\": \"끝내기\",\n\t\"&Edit\": \"편집(&E)\",\n\t\"Edit\": \"편집\",\n\t\"&Undo\": \"실행 취소(&U)\",\n\t\"&Repeat\": \"반복(&R)\",\n\t\"Repeat\": \"반복\",\n\t\"&View\": \"보기(&V)\",\n\t\"View\": \"보기\",\n\t\"&Tool Box\": \"도구 상자(&T)\",\n\t\"Tool Box\": \"도구 상자\",\n\t\"&Color Box\": \"색상표(&C)\",\n\t\"Color Box\": \"색상표\",\n\t\"&Status Bar\": \"상태 표시줄(&S)\",\n\t\"Status Bar\": \"상태 표시줄\",\n\t\"T&ext Toolbar\": \"텍스트 도구 모음(&E)\",\n\t\"&Zoom\": \"축소/확대(&Z)\",\n\t\"Zoom\": \"축소/확대\",\n\t\"&Normal Size\": \"보통(&N)\",\n\t\"Normal Size\": \"보통\",\n\t\"&Large Size\": \"크게(&L)\",\n\t\"Large Size\": \"크게\",\n\t\"C&ustom\": \"사용자 정의(&U)\",\n\t\"Custom\": \"사용자 정의\",\n\t\"Show &Grid\": \"눈금 표시(&G)\",\n\t\"Show Grid\": \"눈금 표시\",\n\t\"Show T&humbnail\": \"멀리 보기 표시(&H)\",\n\t\"Show Thumbnail\": \"멀리 보기 표시\",\n\t\"&View Bitmap\": \"비트맵 보기(&V)\",\n\t\"View Bitmap\": \"비트맵 보기\",\n\t\"&Image\": \"이미지(&I)\",\n\t\"Image\": \"이미지\",\n\t\"&Flip/Rotate\": \"대칭 이동/회전(&F)\",\n\t\"&Attributes\": \"속성(&A)\",\n\t\"&Clear Image\": \"이미지 지우기(&C)\",\n\t\"Clear Image\": \"이미지 지우기\",\n\t\"&Draw Opaque\": \"불투명하게 그리기(&D)\",\n\t\"Draw Opaque\": \"불투명하게 그리기\",\n\t\"&Colors\": \"색(&C)\",\n\t\"&Edit Colors\": \"색 편집(&E)\",\n\t\"Edit Colors\": \"색 편집\",\n\t\"&Help Topics\": \"도움말 항목(&H)\",\n\t\"Help Topics\": \"도움말 항목\",\n\t\"&About Paint\": \"그림판 정보(&A)\",\n\t\"About Paint\": \"그림판 정보\",\n\t\"&Update\": \"업데이트(&U)\",\n\t\"Update\": \"업데이트\",\n\t\"Save Copy &As\": \"복사본 저장(&A)\",\n\t\"Save Copy As\": \"복사본 저장\",\n\t\"Paint\": \"그림판\",\n\t\"untitled\": \"제목없음\",\n\t\"Bitmap Image\": \"비트맵 이미지\",\n\t\"Bitmap Files (*.bmp)\": \"비트맵 파일(*.bmp)\",\n\t\"PCX Files\": \"PCX 파일\",\n\t\"Icon Files\": \"아이콘 파일\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"흑백 비트맵(*.bmp;*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"16색 비트맵(*.bmp;*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"256색 비트맵(*.bmp;*.dib)\",\n\t\"Paint cannot open this file.\": \"파일을 열 수 없습니다.\",\n\t\"Paint cannot read this file.\": \"파일을 읽을 수 없습니다.\",\n\t\"This file is read-only.\": \"이 파일은 읽기 전용입니다.\",\n\t\"To save your changes, use a different filename.\": \"변경 사항을 저장하려면 다른 파일 이름을 사용하십시오.\",\n\t\"This file is already open.\": \"이 파일이 이미 열려 있습니다.\",\n\t\"This is not a valid .PCS file.\": \"이 파일은 올바른 .PCS 파일이 아닙니다.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"이 파일은 편집용으로 열었으므로 겹쳐쓸 수 없습니다.\",\n\t\"Use a different filename to save your changes.\": \"다른 파일 이름을 사용하여 변경 내용을 저장하십시오.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"올바른 비트맵 파일이 아니거나 현재 지원되지 않는 형식입니다.\",\n\t\"This is not a valid icon.\": \"올바른 아이콘이 아닙니다.\",\n\t\"This is not a valid cursor.\": \"올바른 커서가 아닙니다.\",\n\t\"Save was interrupted, so your file has not been saved.\": \"저장 작업이 중단되었으므로 파일이 저장되지 않았습니다.\",\n\t\"You cannot save to a read-only file.\": \"읽기 전용 파일에 저장할 수 없습니다.\",\n\t\"Use a different file name.\": \"다른 파일 이름을 사용하십시오.\",\n\t\"This file is already in use.\": \"이 파일이 이미 사용되고 있습니다.\",\n\t\"Close the program, and then try again.\": \"프로그램을 닫고 다시 실행하십시오.\",\n\t\"Paint cannot save this file.\": \"이 파일을 저장할 수 없습니다.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"같은 파일 이름을 다른 파일 형식으로 저장할 수 없습니다.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"눈금 간격은 %d에서 %d 사이의 정수이어야 합니다.\",\n\t\"There is not enough memory or resources to complete operation.\": \"메모리나 리소스가 부족하여 작업을 마칠 수 없습니다.\",\n\t\"Close some programs, and then try again.\": \"몇몇 프로그램을 닫고 다시 하십시오.\",\n\t\"Low on memory or resources.\": \"메모리나 리소스가 부족합니다.\",\n\t\"Group error.\": \"그룹 오류.\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"문서를 인쇄할 수 없습니다. 디스크 공간이 충분하고 프린터가 올바르게 작동하는지 확인하십시오.\",\n\t\"Saving into this format may cause some loss of color information.\": \"이 형식으로 저장하면 일부 색상 정보가 손실될 수 있습니다.\",\n\t\"Do you want to continue?\": \"계속하시겠습니까?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"흑백으로의 변환은 취소할 수 없습니다. 이 동작은 현재 파일에 영향을 주기 때문에 색 정보를 일부 손실할 수도 있습니다. \",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"비트맵의 한쪽 면이 1픽셀보다 커야 합니다.\",\n\t\"Generic error.\": \"일반 오류.\",\n\t\"File not found.\": \"파일을 찾을 수 없습니다.\",\n\t\"Bad path.\": \"경로가 올바르지 않습니다.\",\n\t\"Too many open files.\": \"열려있는 파일이 너무 많습니다.\",\n\t\"Access denied.\": \"액세스할 수 없습니다.\",\n\t\"Invalid file.\": \"잘못된 파일입니다.\",\n\t\"Remove current folder.\": \"현재 폴더를 제거합니다.\",\n\t\"Folder full.\": \"폴더가 꽉 차있습니다.\",\n\t\"Bad seek.\": \"디스크 찾기 오류입니다.\",\n\t\"Hard IO error.\": \"하드 입출력 오류입니다.\",\n\t\"Sharing violation.\": \"공유 위반입니다.\",\n\t\"Lock violation.\": \"잠금 위반입니다.\",\n\t\"Disk full.\": \"디스크가 꽉 차있습니다.\",\n\t\"End of file.\": \"파일의 끝입니다.\",\n\t\"Error getting the Clipboard Data!\": \"클립보드 데이터를 가져오는데 오류가 일어났습니다!\",\n\t\"No Printer Found @ page setup\": \"프린터를 찾을 수 없습니다(페이지 설정).\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"24비트 비트맵(*.bmp;*.dib)\",\n\t\"All Files\": \"모든 파일\",\n\t\"Palette|*.pal|\": \"색상표|*.pal|\",\n\t\"untitled.pal\": \"제목없음.pal\",\n\t\"OLE 2.0 was unable to start.\": \"OLE 2.0을 시작할 수 없습니다.\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"올바른 버전의 OLE 라이브러리를 사용하고 있는지 확인하십시오.\",\n\t\"Resets the text be without any attributes.\": \"텍스트가 속성을 가지지 않도록 다시 설정합니다.\",\n\t\"Sets or clears the text bold attribute.\": \"텍스트의 '굵게' 속성을 설정하거나 해제합니다.\",\n\t\"Sets or clears the text italic attribute.\": \"텍스트의 '기울임꼴' 속성을 설정하거나 해제합니다.\",\n\t\"Selects the font used by the text.\": \"텍스트에 사용할 글꼴을 선택합니다.\",\n\t\"Selects the point size of the text.\": \"텍스트의 글꼴 크기를 선택합니다.\",\n\t\"Sets or clears the text underline attribute.\": \"텍스트의 밑줄 속성을 설정하거나 해제합니다.\",\n\t\"Shows or hides the tooltips.\": \"도구 설명을 표시하거나 숨깁니다.\",\n\t\"Show Paint Help.\": \"그림판 도움말을 표시합니다.\",\n\t\"Sends a picture by using mail or fax.\": \"메일이나 팩스로 그림을 보냅니다.\",\n\t\"Copies the selection to a file.\": \"선택 영역을 파일에 복사합니다.\",\n\t\"Pastes a file into the selection.\": \"파일을 선택 영역에 붙여넣습니다.\",\n\t\"Zooms the picture to 100%.\": \"그림을 원래 크기대로 합니다.\",\n\t\"Zooms the picture to 400%.\": \"그림을 4배로 확대합니다.\",\n\t\"Zooms the picture.\": \"그림 영역을 축소/확대합니다.\",\n\t\"Displays the entire picture.\": \"그림을 전체 화면으로 표시합니다.\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"그림을 멀리 보기로 표시하거나 숨깁니다.\",\n\t\"Shows or hides the grid.\": \"눈금을 표시하거나 숨깁니다.\",\n\t\"Shows or hides the text toolbar.\": \"텍스트 도구 모음을 표시하거나 숨깁니다.\",\n\t\"Flips or rotates the picture or a selection.\": \"그림이나 선택한 부분을 대칭 이동 또는 회전시킵니다.\",\n\t\"Stretches or skews the picture or a selection.\": \"그림 영역이나 선택 영역을 늘이거나 기울입니다.\",\n\t\"Inverts the colors of the picture or a selection.\": \"그림 영역이나 선택 영역의 색을 반전 표시합니다.\",\n\t\"Changes the attributes of the picture.\": \"그림 영역의 속성을 바꿉니다.\",\n\t\"Clears the picture or selection.\": \"그림 영역이나 선택 영역을 지웁니다.\",\n\t\"The font size must be a numeric value.\": \"글꼴 크기는 숫자여야 합니다.\",\n\t\"Contains commands for working with the selected item(s).\": \"선택된 항목으로 작업할 명령입니다.\",\n\t\"Contains commands for selecting and transferring items.\": \"항목을 선택하고 전송합니다.\",\n\t\"Contains commands for customizing this window.\": \"창을 사용자 정의합니다.\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"그림을 조작하고 속성을 설정합니다.\",\n\t\"Contains commands for using custom colors and drawing options.\": \"사용자 정의 색과 그리기 옵션을 사용합니다.\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"그림판에 관한 도움말과 정보를 표시합니다.\",\n\t\"Cannot save file.\": \"파일을 저장할 수 없습니다.\",\n\t\"Error removing temporary file.\": \"임시 파일을 지우는데 오류가 발생했습니다.\",\n\t\"Get Colors\": \"색 가져오기\",\n\t\"Save Colors\": \"색 저장\",\n\t\"File last saved:\": \"마지막으로 저장된 파일:\",\n\t\"Not Available\": \"사용할 수 없음\",\n\t\"Size on disk:\": \"디스크 크기:\",\n\t\"Painting\": \"페인팅\",\n\t\"Bitmap\": \"비트맵\",\n\t\"Fonts\": \"글꼴 크기\",\n\t\"Tools\": \"도구\",\n\t\"All Picture Files\": \"모든 그림 파일\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"도움말을 보려면 도움말 메뉴의 도움말 항목을 누르십시오.\",\n\t\"Select an area on which to get Help.\": \"도움말을 참고할 항목을 선택하십시오.\",\n\t\"%1 in %2\": \"%2의 %1\",\n\t\"Creates a new document.\": \"새 문서를 만듭니다.\",\n\t\"Opens an existing document.\": \"기존 문서를 엽니다.\",\n\t\"Closes the active document.\": \"현재 문서를 닫습니다.\",\n\t\"Saves the active document.\": \"현재 문서를 저장합니다.\",\n\t\"Saves the active document with a new name.\": \"현재 문서를 새로운 이름으로 저장합니다.\",\n\t\"Changes the page layout.\": \"페이지 윤곽을 바꿉니다.\",\n\t\"Specifies the default printer setup.\": \"기본 프린터 설정을 지정합니다.\",\n\t\"Prints the active document and sets printing options.\": \"현재 문서를 인쇄하고 인쇄 옵션을 설정합니다.\",\n\t\"Displays full pages.\": \"전체 페이지를 표시합니다.\",\n\t\"Opens this document.\": \"이 문서를 엽니다.\",\n\t\"Deletes the selection.\": \"선택 영역을 삭제합니다.\",\n\t\"Erases everything.\": \"모든 부분을 지웁니다.\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"선택한 영역을 복사하여 클립보드에 저장합니다.\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"선택한 영역을 잘라내어 클립보드에 저장합니다.\",\n\t\"Finds the specified text.\": \"지정한 텍스트를 찾습니다.\",\n\t\"Inserts the contents of the Clipboard.\": \"클립보드의 내용을 삽입합니다.\",\n\t\"Repeats the last action.\": \"마지막 작업을 반복합니다.\",\n\t\"Replaces specific text with different text.\": \"특정 텍스트를 다른 텍스트로 바꿉니다.\",\n\t\"Selects everything.\": \"전체 문서를 선택합니다.\",\n\t\"Undoes the last action.\": \"마지막 동작을 취소합니다.\",\n\t\"Redoes the previously undone action.\": \"이전에 취소한 작업을 반복합니다.\",\n\t\"Displays program information, version number, and copyright.\": \"프로그램 정보, 버전 번호, 저작권을 표시합니다.\",\n\t\"Quits Paint.\": \"그림판을 마칩니다.\",\n\t\"Opens Paint Help.\": \"그림판 도움말을 엽니다.\",\n\t\"Displays instructions about how to use Help.\": \"도움말 사용법에 관한 설명을 표시합니다.\",\n\t\"Displays Help for areas you click on.\": \"선택한 영역에 대한 도움말을 표시합니다.\",\n\t\"Displays Help for the current task or command.\": \"현재 작업이나 명령에 대한 도움말을 표시합니다.\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"이 비트맵을 바탕 화면의 배경 무늬로 가운데에 놓습니다.\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"이 비트맵을 바탕 화면의 배경 무늬에 바둑판식으로 놓습니다.\",\n\t\"Sends the selection using mail or fax.\": \"메일이나 팩스를 이용하여 선택 영역을 전송합니다.\",\n\t\"Prints the selection.\": \"선택 영역을 인쇄합니다.\",\n\t\"Shows or hides the thumbnail.\": \"멀리 보기를 표시하거나 숨깁니다.\",\n\t\"Shows Paint Help.\": \"그림판 도움말을 표시합니다.\",\n\t\"Shows or hides the status bar.\": \"상태 표시줄을 표시하거나 숨깁니다.\",\n\t\"Shows or hides the tool box.\": \"도구 상자를 표시하거나 숨깁니다.\",\n\t\"Shows or hides the color box.\": \"색상표를 표시하거나 숨깁니다.\",\n\t\"Only a Far East font can be used for vertical editing.\": \"수직 편집에서는 Far East 글꼴만 사용할 수 있습니다.\",\n\t\"Changes the window size.\": \"창 크기를 바꿉니다.\",\n\t\"Changes the window position.\": \"창 위치를 바꿉니다.\",\n\t\"Reduces the window to an icon.\": \"창을 아이콘 크기로 축소합니다.\",\n\t\"Enlarges the window to full size.\": \"창을 전체 화면 크기로 확대합니다.\",\n\t\"Switches to the next document window.\": \"다음 문서 창으로 전환합니다.\",\n\t\"Switches to the previous document window.\": \"이전 문서 창으로 전환합니다.\",\n\t\"Closes the active window and asks if you want to save changes.\": \"현재 창을 닫고 문서를 저장할 것인지 물어 봅니다.\",\n\t\"Restores the window to normal size.\": \"창을 본래 크기로 복원합니다.\",\n\t\"Activates the task list.\": \"작업 목록을 활성화합니다.\",\n\t\"All Files (*.*)\": \"모든 파일(*.*)\",\n\t\"Untitled\": \"제목 없음\",\n\t\"an unnamed file\": \"이름 없는 파일\",\n\t\"&Hide\": \"숨기기(&H)\",\n\t\"Hide\": \"숨기기\",\n\t\"No error message is available.\": \"오류 메시지를 사용할 수 없습니다.\",\n\t\"An unsupported operation was attempted.\": \"지원되지 않는 작업을 시도했습니다.\",\n\t\"A required resource was unavailable.\": \"필요한 리소스를 사용할 수 없습니다.\",\n\t\"Out of memory.\": \"메모리가 부족합니다.\",\n\t\"An unknown error has occurred.\": \"알 수 없는 오류가 발생했습니다.\",\n\t\"on %1\": \"- %1\",\n\t\"&One Page\": \"한 페이지(&O)\",\n\t\"One Page\": \"한 페이지\",\n\t\"&Two Page\": \"두 페이지(&T)\",\n\t\"Two Page\": \"두 페이지\",\n\t\"Page %u\": \"%u 페이지\",\n\t\"Pages %u-%u\": \"%u-%u 페이지\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"프린터 파일(*.prn)|*.prn|모든 파일(*.*)|*.*||\",\n\t\"Print to File\": \"파일로 인쇄\",\n\t\"to %1\": \"%1(으)로\",\n\t\"&Update %1\": \"%1 업데이트(&U)\",\n\t\"Update %1\": \"%1 업데이트\",\n\t\"E&xit && Return to %1\": \"끝내고  %1(으)로 복귀(&X)\",\n\t\"Exit & Return to %1\": \"끝내고  %1(으)로 복귀\",\n\t\"Linked %s\": \"연결된 %s\",\n\t\"Unknown Type\": \"알 수 없는 종류\",\n\t\"Invalid filename.\": \"잘못된 파일 이름\",\n\t\"Failed to open document.\": \"문서를 열 수 없습니다.\",\n\t\"Failed to save document.\": \"문서를 저장할 수 없습니다.\",\n\t\"Save changes to %1?\": \"%1의 변경 사항을 저장하시겠습니까?\",\n\t\"Failed to create empty document.\": \"빈 문서를 만들 수 없습니다.\",\n\t\"The file is too large to open.\": \"파일이 너무 커서 열 수 없습니다.\",\n\t\"Could not start print job.\": \"인쇄 작업을 시작할 수 없습니다.\",\n\t\"Failed to launch help.\": \"도움말을 시작할 수 없습니다.\",\n\t\"Internal application error.\": \"내부 응용 프로그램 오류\",\n\t\"Command failed.\": \"명령이 실행되지 않았습니다.\",\n\t\"Insufficient memory to perform operation.\": \"메모리가 부족하여 작업을 수행할 수 없습니다.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"시스템 레지스트리 항목을 제거하고, 해당 파일이 있는 경우 INI 파일도 삭제했습니다.\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"시스템 레지스트리 항목 (또는 INI 파일)이 모두 제거되지 않았습니다.\",\n\t\"This program requires the file %s, which was not found on this system.\": \"이 프로그램이 필요한 %s 파일을 시스템에서 찾을 수 없습니다.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"이 프로그램이 없는 export %s(%s 파일)에 연결되어 있습니다. 이 컴퓨터에 있는 %s이(가) 호환성 없는 버전일 수 있습니다.\",\n\t\"Please enter an integer.\": \"정수를 입력하십시오.\",\n\t\"Please enter a number.\": \"숫자를 입력하십시오.\",\n\t\"Please enter an integer between %1 and %2.\": \"%1에서 %2 사이의 정수를 입력하십시오.\",\n\t\"Please enter a number between %1 and %2.\": \"%1에서 %2 사이의 숫자를 입력하십시오.\",\n\t\"Please enter no more than %1 characters.\": \"%1개 이하의 문자를 입력하십시오.\",\n\t\"Please select a button.\": \"단추를 선택하십시오.\",\n\t\"Please enter an integer between 0 and 255.\": \"0에서 255사이의 정수를 입력하십시오.\",\n\t\"Please enter a positive integer.\": \"양의 정수를 입력하십시오.\",\n\t\"Please enter a date and/or time.\": \"날짜와(나) 시간을 입력하십시오.\",\n\t\"Please enter a currency.\": \"통화를 입력하십시오.\",\n\t\"Unexpected file format.\": \"예상치 않은 파일 형식.\",\n\t\"Cannot find this file.\": \"이 파일을 찾을 수 없습니다.\",\n\t\"Please verify that the correct path and file name are given.\": \"올바른 경로와 파일 이름이 주어졌는지 확인하십시오.\",\n\t\"Destination disk drive is full.\": \"대상 디스크 드라이브가 꽉 찼습니다.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"%1 파일을 읽을 수 없습니다. 다른 사용자가 사용 중입니다.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"%1 파일에 기록할 수 없습니다. 읽기 전용이거나 다른 사용자가 사용 중입니다.\",\n\t\"An unexpected error occurred while reading %1.\": \"%1 파일을 읽는 동안 예상치 않은 오류가 발생했습니다.\",\n\t\"An unexpected error occurred while writing %1.\": \"%1 파일에 쓰는 동안 예상치 않은 오류가 발생했습니다.\",\n\t\"Unable to register document.\": \"문서를 등록할 수 없습니다.\",\n\t\"The document may already be open.\": \"문서가 이미 열려 있는 것 같습니다.\",\n\t\"Update %1 before proceeding?\": \"계속하기 전에 %1을(를) 업데이트하시겠습니까?\",\n\t\"Could not update client.\": \"클라이언트를 업데이트할 수 없습니다.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"등록할 수 없습니다. ActiveX 기능이 올바르게 작동하지 않을 수 있습니다.\",\n\t\"Failed to update the system registry.\": \"시스템 레지스트리를 업데이트할 수 없습니다.\",\n\t\"Please try using REGEDIT.\": \"REGEDIT를 사용해 보십시오.\",\n\t\"Unable to read write-only property.\": \"쓰기 전용 속성을 읽을 수 없습니다.\",\n\t\"Unable to write read-only property.\": \"읽기 전용 속성을 쓸 수 없습니다.\",\n\t\"Unable to load mail system support.\": \"메일 시스템 지원 프로그램을 로드할 수 없습니다.\",\n\t\"Mail system DLL is invalid.\": \"메일 시스템 DLL이 올바르지 않습니다.\",\n\t\"Send Mail failed to send message.\": \"[편지 보내기]가 메시지를 보내지 못했습니다.\",\n\t\"No error occurred.\": \"오류가 발생하지 않았습니다.\",\n\t\"An unknown error occurred while accessing %1.\": \"%1을(를) 액세스하는 동안 알 수 없는 오류가 발생했습니다.\",\n\t\"%1 was not found.\": \"%1을(를) 찾을 수 없습니다.\",\n\t\"%1 contains an invalid path.\": \"%1이(가) 잘못된 경로를 가지고 있습니다.\",\n\t\"%1 could not be opened because there are too many open files.\": \"열려있는 파일이 너무 많기 때문에 %1을(를) 열지 못했습니다.\",\n\t\"Access to %1 was denied.\": \"%1을(를) 액세스할 수 없습니다.\",\n\t\"An invalid file handle was associated with %1.\": \"잘못된 파일 핸들이 %1와(과) 연결되었습니다.\",\n\t\"%1 could not be removed because it is the current directory.\": \"%1은(는) 현재 디렉터리이기 때문에 제거하지 못했습니다.\",\n\t\"%1 could not be created because the directory is full.\": \"디렉터리가 꽉 찼기 때문에 %1을(를) 만들지 못했습니다.\",\n\t\"Seek failed on %1\": \"%1에서 찾지 못했습니다.\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"%1을(를) 액세스하는 동안 하드웨어 I/O 오류가 보고되었습니다.\",\n\t\"A sharing violation occurred while accessing %1.\": \"%1을(를) 액세스하는 동안 공유 위반이 일어났습니다.\",\n\t\"A locking violation occurred while accessing %1.\": \"%1을(를) 액세스하는 동안 잠금 위반이 일어났습니다.\",\n\t\"Disk full while accessing %1.\": \"%1을(를) 액세스하는 동안 디스크가 꽉 찼습니다.\",\n\t\"An attempt was made to access %1 past its end.\": \"%1의 끝을 지나 액세스하려고 했습니다.\",\n\t\"An attempt was made to write to the reading %1.\": \"%1을(를) 읽는 동안 쓰려고 했습니다.\",\n\t\"An attempt was made to read from the writing %1.\": \"%1을(를) 쓰는 동안 읽으려고 했습니다.\",\n\t\"%1 has a bad format.\": \"%1이(가) 잘못된 포맷을 가지고 있습니다.\",\n\t\"%1 contained an unexpected object.\": \"%1이(가) 예상하지 않은 개체를 가지고 있습니다.\",\n\t\"%1 contains an incorrect schema.\": \"%1이(가) 잘못된 스키마를 가지고 있습니다.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"이동, 복사, 또는 편집할 그림의 직사각형 부분을 선택합니다.\",\n\t\"Select\": \"선택\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"이동, 복사, 또는 편집할 그림의 자유형 부분을 선택합니다.\",\n\t\"Free-Form Select\": \"자유형 선택\",\n\t\"Inserts text into the picture.\": \"그림에 텍스트를 입력합니다.\",\n\t\"Fills an area with the current drawing color.\": \"현재 그림 색으로 영역을 칠합니다.\",\n\t\"Fill With Color\": \"색 칠하기\",\n\t\"Draws a straight line with the selected line width.\": \"선택한 굵기의 직선을 그립니다.\",\n\t\"Line\": \"선\",\n\t\"Draws using an airbrush of the selected size.\": \"선택한 크기의 에어브러쉬로 그립니다.\",\n\t\"Airbrush\": \"에어브러쉬\",\n\t\"Draws a curved line with the selected line width.\": \"선택한 굵기의 곡선을 그립니다.\",\n\t\"Curve\": \"곡선\",\n\t\"Draws a polygon with the selected fill style.\": \"선택한 칠하기 유형의 다각형을 그립니다.\",\n\t\"Polygon\": \"다각형\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"선택한 칠하기 유형의 둥근 직사각형을 그립니다.\",\n\t\"Rounded Rectangle\": \"둥근 직사각형 \",\n\t\"Draws a free-form line one pixel wide.\": \"1픽셀 굵기의 자유 곡선을 그립니다.\",\n\t\"Pencil\": \"연필\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"선택한 지우개 모양으로 그림의 일부를 지웁니다.\",\n\t\"Eraser/Color Eraser\": \"지우개/색 지우개\",\n\t\"Changes the magnification.\": \"확대율을 바꿉니다.\",\n\t\"Magnifier\": \"돋보기\",\n\t\"Picks up a color from the picture for drawing.\": \"그리기용으로 그림에서 색을 골라냅니다.\",\n\t\"Pick Color\": \"색 골라내기\",\n\t\"Draws using a brush with the selected shape and size.\": \"선택한 모양과 크기의 붓으로 그립니다.\",\n\t\"Brush\": \"붓\",\n\t\"Draws a rectangle with the selected fill style.\": \"선택한 칠하기 유형으로 직사각형을 그립니다.\",\n\t\"Rectangle\": \"직사각형\",\n\t\"Draws a filled rectangle.\": \"칠해진 직사각형을 그립니다.\",\n\t\"Draws an ellipse with the selected fill style.\": \"선택한 칠하기 유형으로 타원을 그립니다.\",\n\t\"Ellipse\": \"타원\",\n\t\"Draws a filled ellipse.\": \"칠해진 타원을 그립니다.\",\n\t\"Makes the current selection either opaque or transparent.\": \"현재 선택한 부분을 불투명하게 또는 투명하게 합니다.\",\n\t\"Creates a new color.\": \"새로운 색을 만듭니다.\",\n\t\"Uses a previously saved palette of colors.\": \"이전에 저장된 색상표를 사용합니다.\",\n\t\"Saves the current palette of colors to a file.\": \"현재 색상표를 파일로 저장합니다.\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"배경 무늬로 선택하기 전에 파일을 저장해야 합니다.\",\n\t\"The selection is now larger than the bitmap.\": \"선택 영역이 비트맵보다 큽니다.\",\n\t\"Would you like the bitmap enlarged?\": \"비트맵을 확대하시겠습니까?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"클립보드에 저장된 이미지가 비트맵보다 큽니다.\",\n\t\"The file is not in the correct format.\": \"파일 형식이 올바르지 않습니다.\",\n\t\"Not enough room to paste text.\": \"텍스트를 붙여넣을 만한 공간이 없습니다.\",\n\t\"Enlarge the text area and try again.\": \"텍스트 영역을 늘리고 다시 하십시오.\",\n\t\"Places the text.\": \"텍스트를 넣습니다.\"\n});\n"
  },
  {
    "path": "localization/nl/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"nl\", {\n\t\"Attributes\": \"Kenmerken\",\n\t\"&Width:\": \"&Breedte:\",\n\t\"Width:\": \"Breedte:\",\n\t\"&Height:\": \"&Hoogte:\",\n\t\"Height:\": \"Hoogte:\",\n\t\"Units\": \"Eenheden\",\n\t\"C&m\": \"&Cm\",\n\t\"Cm\": \"Cm\",\n\t\"Colors\": \"Kleuren\",\n\t\"&Black and white\": \"&Zwart-wit\",\n\t\"Black and white\": \"Zwart-wit\",\n\t\"Co&lors\": \"&Kleuren\",\n\t\"Transparency\": \"Doorzichtigheid\",\n\t\"Use &Transparent background color\": \"&Doorzichtige achtergrondkleur gebruiken\",\n\t\"Use Transparent background color\": \"Doorzichtige achtergrondkleur gebruiken\",\n\t\"Select &Color\": \"Kl&eur kiezen\",\n\t\"Select Color\": \"Kleur selecteren\",\n\t\"Cancel\": \"Annuleren\",\n\t\"&Default\": \"&Standaard\",\n\t\"Default\": \"Standaard\",\n\t\"Custom Zoom\": \"In-/uitzoomen aanpassen\",\n\t\"Current zoom:\": \"Huidig in-/uitzoomniveau:\",\n\t\"Zoom to\": \"In-/uitzoomen naar\",\n\t\"Flip and Rotate\": \"Spiegelen en draaien\",\n\t\"Flip or rotate\": \"Spiegelen of draaien\",\n\t\"&Flip horizontal\": \"&Horizontaal spiegelen\",\n\t\"Flip horizontal\": \"Horizontaal spiegelen\",\n\t\"Flip &vertical\": \"&Verticaal spiegelen\",\n\t\"Flip vertical\": \"Verticaal spiegelen\",\n\t\"&Rotate by angle\": \"&Draaihoek\",\n\t\"Rotate by angle\": \"Draaihoek\",\n\t\"Stretch and Skew\": \"Uitrekken en hellen\",\n\t\"Stretch\": \"Uitrekken\",\n\t\"&Horizontal:\": \"&Horizontaal:\",\n\t\"Horizontal:\": \"Horizontaal:\",\n\t\"&Vertical:\": \"&Verticaal:\",\n\t\"Vertical:\": \"Verticaal:\",\n\t\"Skew\": \"Hellen\",\n\t\"H&orizontal:\": \"H&orizontaal:\",\n\t\"Degrees\": \"Graden\",\n\t\"V&ertical:\": \"V&erticaal:\",\n\t\"Color Table\": \"Kleurentabel\",\n\t\"New\": \"Nieuw\",\n\t\"&New \": \"&Nieuw \",\n\t\"New \": \"Nieuw \",\n\t\"Printing\": \"Bezig met afdrukken van\",\n\t\"on the\": \"op\",\n\t\"&Print\": \"Af&drukken\",\n\t\"Print\": \"Afdrukken\",\n\t\"&Next Page\": \"Vo&lgende pagina\",\n\t\"Next Page\": \"Volgende pagina\",\n\t\"Pre&v Page\": \"Vo&rige pagina\",\n\t\"Prev Page\": \"Vorige pagina\",\n\t\"Zoom &In\": \"&Inzoomen\",\n\t\"Zoom In\": \"Inzoomen\",\n\t\"Zoom &Out\": \"&Uitzoomen\",\n\t\"Zoom Out\": \"Uitzoomen\",\n\t\"&Close\": \"&Sluiten\",\n\t\"Close\": \"Sluiten\",\n\t\"Grid Settings\": \"Rasterinstellingen\",\n\t\"&Pixel Grid\": \"&Pixels\",\n\t\"Pixel Grid\": \"Pixels\",\n\t\"&Tile Grid\": \"B&lokken\",\n\t\"Tile Grid\": \"Blokken\",\n\t\"H&eight:\": \"&Hoogte:\",\n\t\"Text\": \"Tekst\",\n\t\"Undo\": \"Ongedaan maken\",\n\t\"Cut\": \"Knippen\",\n\t\"Copy\": \"Kopiëren\",\n\t\"Paste\": \"Plakken\",\n\t\"Clear Selection\": \"Selectie wissen\",\n\t\"Select All\": \"Alles selecteren\",\n\t\"Text Toolbar\": \"Werkbalk Tekst\",\n\t\"Selection\": \"Selectie\",\n\t\"Cu&t\": \"K&nippen\",\n\t\"&Copy\": \"&Kopiëren\",\n\t\"&Paste\": \"&Plakken\",\n\t\"C&lear Selection\": \"Se&lectie wissen\",\n\t\"Select &All\": \"&Alles selecteren\",\n\t\"C&opy To\": \"K&opiëren naar\",\n\t\"Copy To\": \"Kopiëren naar\",\n\t\"Paste &From\": \"Plakken &uit\",\n\t\"Paste From\": \"Plakken uit\",\n\t\"Flip/&Rotate\": \"&Spiegelen/draaien\",\n\t\"Flip/Rotate\": \"Spiegelen/draaien\",\n\t\"&Stretch/Skew\": \"Uit&rekken/hellen\",\n\t\"Stretch/Skew\": \"Uitrekken/hellen\",\n\t\"&Invert Colors\": \"Nega&tief\",\n\t\"Invert Colors\": \"Negatief\",\n\t\"Thumbnail\": \"Schets\",\n\t\"&File\": \"&Bestand\",\n\t\"File\": \"Bestand\",\n\t\"&New\": \"&Nieuw\",\n\t\"&Open\": \"&Openen\",\n\t\"Open\": \"Openen\",\n\t\"&Save\": \"O&pslaan\",\n\t\"Save\": \"Opslaan\",\n\t\"Save &As\": \"Ops&laan als\",\n\t\"Save As\": \"Opslaan als\",\n\t\"Print Pre&view\": \"A&fdrukvoorbeeld\",\n\t\"Print Preview\": \"Afdrukvoorbeeld\",\n\t\"Page Se&tup\": \"Pag&ina-instelling\",\n\t\"Page Setup\": \"Pagina-instelling\",\n\t\"S&end\": \"Bericht &verzenden\",\n\t\"Send\": \"Bericht verzenden\",\n\t\"Set As &Wallpaper (Tiled)\": \"Ins&tellen als achtergrond (naast elkaar)\",\n\t\"Set As Wallpaper (Tiled)\": \"Instellen als achtergrond (naast elkaar)\",\n\t\"Set As Wa&llpaper (Centered)\": \"In&stellen als achtergrond (gecentreerd)\",\n\t\"Set As Wallpaper (Centered)\": \"Instellen als achtergrond (gecentreerd)\",\n\t\"Recent File\": \"Recent bestand\",\n\t\"E&xit\": \"&Afsluiten\",\n\t\"Exit\": \"Afsluiten\",\n\t\"&Edit\": \"Be&werken\",\n\t\"Edit\": \"Bewerken\",\n\t\"&Undo\": \"&Ongedaan maken\",\n\t\"&Repeat\": \"&Herhalen\",\n\t\"Repeat\": \"Herhalen\",\n\t\"&View\": \"Beel&d\",\n\t\"View\": \"Beeld\",\n\t\"&Tool Box\": \"&Werkset\",\n\t\"Tool Box\": \"Werkset\",\n\t\"&Color Box\": \"&Kleurenset\",\n\t\"Color Box\": \"Kleurenset\",\n\t\"&Status Bar\": \"&Statusbalk\",\n\t\"Status Bar\": \"Statusbalk\",\n\t\"T&ext Toolbar\": \"W&erkbalk Tekst\",\n\t\"&Zoom\": \"In-/uit&zoomen\",\n\t\"Zoom\": \"In-/uitzoomen\",\n\t\"&Normal Size\": \"&Normaal formaat\",\n\t\"Normal Size\": \"Normaal formaat\",\n\t\"&Large Size\": \"&Groot formaat\",\n\t\"Large Size\": \"Groot formaat\",\n\t\"C&ustom\": \"&Aanpassen\",\n\t\"Custom\": \"Aanpassen\",\n\t\"Show &Grid\": \"&Raster weergeven\",\n\t\"Show Grid\": \"Raster weergeven\",\n\t\"Show T&humbnail\": \"&Schets weergeven\",\n\t\"Show Thumbnail\": \"Schets weergeven\",\n\t\"&View Bitmap\": \"&Bitmap weergeven\",\n\t\"View Bitmap\": \"Bitmap weergeven\",\n\t\"&Image\": \"&Afbeelding\",\n\t\"Image\": \"Afbeelding\",\n\t\"&Flip/Rotate\": \"&Spiegelen/draaien\",\n\t\"&Attributes\": \"&Kenmerken\",\n\t\"&Clear Image\": \"&Afbeelding wissen\",\n\t\"Clear Image\": \"Afbeelding wissen\",\n\t\"&Draw Opaque\": \"On&doorzichtig tekenen\",\n\t\"Draw Opaque\": \"Ondoorzichtig tekenen\",\n\t\"&Colors\": \"&Kleuren\",\n\t\"&Edit Colors\": \"Kleuren &bewerken\",\n\t\"Edit Colors\": \"Kleuren bewerken\",\n\t\"&Help Topics\": \"&Help-onderwerpen\",\n\t\"Help Topics\": \"Help-onderwerpen\",\n\t\"&About Paint\": \"&Info\",\n\t\"About Paint\": \"Info\",\n\t\"&Update\": \"&Bijwerken\",\n\t\"Update\": \"Bijwerken\",\n\t\"Save Copy &As\": \"K&opie opslaan als\",\n\t\"Save Copy As\": \"Kopie opslaan als\",\n\t\"untitled\": \"naamloos\",\n\t\"Bitmap Image\": \"Bitmapafbeelding\",\n\t\"Bitmap Files (*.bmp)\": \"Bitmapbestanden (*.bmp)\",\n\t\"PCX Files\": \"PCX-bestanden\",\n\t\"Icon Files\": \"Pictogrambestanden\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"Monochrome bitmap (*.bmp;*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"16-kleuren bitmap (*.bmp;*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"256-kleuren bitmap (*.bmp;*.dib)\",\n\t\"Paint cannot open this file.\": \"Paint kan dit bestand niet openen.\",\n\t\"Paint cannot read this file.\": \"Paint kan dit bestand niet lezen.\",\n\t\"This file is read-only.\": \"Dit is een alleen-lezenbestand.\",\n\t\"To save your changes, use a different filename.\": \"Om wijzigingen op te slaan moet u een andere bestandsnaam gebruiken.\",\n\t\"This file is already open.\": \"Het bestand is al geopend.\",\n\t\"This is not a valid .PCS file.\": \"Dit is geen geldig .PCS-bestand.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"Dit bestand wordt momenteel bewerkt en kan daarom niet worden overschreven.\",\n\t\"Use a different filename to save your changes.\": \"Gebruik een andere bestandsnaam om uw wijzigingen op te slaan.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"Dit is geen geldig bitmapbestand, of deze opmaak wordt niet ondersteund.\",\n\t\"This is not a valid icon.\": \"Dit is geen geldig pictogram.\",\n\t\"This is not a valid cursor.\": \"Dit is geen geldige cursor.\",\n\t\"Save was interrupted, so your file has not been saved.\": \"Opslaan is afgebroken. Het bestand is niet opgeslagen.\",\n\t\"You cannot save to a read-only file.\": \"Opslaan naar een alleen-lezenbestand is niet mogelijk.\",\n\t\"Use a different file name.\": \"Gebruik een andere bestandsnaam.\",\n\t\"This file is already in use.\": \"Het bestand is al in gebruik.\",\n\t\"Close the program, and then try again.\": \"Sluit de toepassing af en probeer het opnieuw.\",\n\t\"Paint cannot save this file.\": \"Paint kan dit bestand niet opslaan.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"Paint kan een ander bestandstype niet met dezelfde bestandsnaam opslaan.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"De rasterafstand moet een geheel getal zijn tussen %d en %d.\",\n\t\"There is not enough memory or resources to complete operation.\": \"Onvoldoende geheugen of bronnen om de bewerking te voltooien.\",\n\t\"Close some programs, and then try again.\": \"Sluit enkele programma's af en probeer het opnieuw.\",\n\t\"Low on memory or resources.\": \"Onvoldoende vrij geheugen of vrije bronnen.\",\n\t\"Group error.\": \"Groepsfout.\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"Paint kan het document niet afdrukken. Controleer of er voldoende schijfruimte is, en de printer aan staat.\",\n\t\"Saving into this format may cause some loss of color information.\": \"Als u in dit formaat opslaat, kunnen kleurgegevens verloren gaan.\",\n\t\"Do you want to continue?\": \"Wilt u toch doorgaan?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"Een conversie naar zwart-wit kan niet ongedaan worden gemaakt. Deze actie heeft gevolgen voor het actieve bestand en kan tot verlies van kleurinformatie lijden.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"Bitmaps moeten groter zijn dan 1 x 1 pixel.\",\n\t\"Generic error.\": \"Algemene fout.\",\n\t\"File not found.\": \"Het bestand is niet gevonden.\",\n\t\"Bad path.\": \"Ongeldig pad.\",\n\t\"Too many open files.\": \"Er zijn te veel geopende bestanden.\",\n\t\"Access denied.\": \"De toegang is geweigerd.\",\n\t\"Invalid file.\": \"Ongeldig bestand.\",\n\t\"Remove current folder.\": \"Actieve map verwijderen.\",\n\t\"Folder full.\": \"Map vol.\",\n\t\"Bad seek.\": \"Ongeldige zoekactie.\",\n\t\"Hard IO error.\": \"Hardwarematige I/O-fout.\",\n\t\"Sharing violation.\": \"Fout bij delen.\",\n\t\"Lock violation.\": \"Fout bij vergrendelen.\",\n\t\"Disk full.\": \"De schijf is vol.\",\n\t\"End of file.\": \"Einde van bestand.\",\n\t\"Error getting the Clipboard Data!\": \"Fout bij ophalen van Klembord-gegevens.\",\n\t\"No Printer Found @ page setup\": \"Geen printer gevonden bij pagina-instelling\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"24-bits bitmap (*.bmp;*.dib)\",\n\t\"All Files\": \"Alle bestanden\",\n\t\"Palette|*.pal|\": \"Palet|*.pal|\",\n\t\"OLE 2.0 was unable to start.\": \"Opstarten van OLE 2.0 niet gelukt.\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"Zorg ervoor dat u de juiste versie van de OLE-bibliotheken gebruikt.\",\n\t\"Resets the text be without any attributes.\": \"Alle tekstkenmerken wissen\",\n\t\"Sets or clears the text bold attribute.\": \"Het tekstkenmerk Vet instellen of wissen\",\n\t\"Sets or clears the text italic attribute.\": \"Het tekstkenmerk Cursief instellen of wissen\",\n\t\"Selects the font used by the text.\": \"Het lettertype voor de tekst selecteren\",\n\t\"Selects the point size of the text.\": \"De puntgrootte van de tekst selecteren\",\n\t\"Sets or clears the text underline attribute.\": \"Het tekstkenmerk Onderstrepen instellen of wissen\",\n\t\"Shows or hides the tooltips.\": \"De Knopinfo weergeven of verbergen\",\n\t\"Show Paint Help.\": \"Help voor Paint weergeven\",\n\t\"Sends a picture by using mail or fax.\": \"Een figuur verzenden via Mail of Fax\",\n\t\"Copies the selection to a file.\": \"De selectie naar een bestand kopiëren\",\n\t\"Pastes a file into the selection.\": \"Een bestand in de selectie plakken\",\n\t\"Zooms the picture to 100%.\": \"Een figuur in-/uitzoomen tot 100%\",\n\t\"Zooms the picture to 400%.\": \"Een figuur in-/uitzoomen tot 400%\",\n\t\"Zooms the picture.\": \"Een figuur in-/uitzoomen\",\n\t\"Displays the entire picture.\": \"De hele figuur weergeven\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"De schets van de figuur weergeven of verbergen\",\n\t\"Shows or hides the grid.\": \"Het raster weergeven of verbergen\",\n\t\"Shows or hides the text toolbar.\": \"De werkbalk Tekst weergeven of verbergen\",\n\t\"Flips or rotates the picture or a selection.\": \"De figuur of selectie spiegelen of draaien\",\n\t\"Stretches or skews the picture or a selection.\": \"De figuur of selectie uitrekken of hellen\",\n\t\"Inverts the colors of the picture or a selection.\": \"Kleuren van de figuur of van een selectie omkeren\",\n\t\"Changes the attributes of the picture.\": \"Kenmerken van de figuur wijzigen\",\n\t\"Clears the picture or selection.\": \"De figuur of selectie wissen\",\n\t\"The font size must be a numeric value.\": \"De tekengrootte moet een numerieke waarde zijn.\",\n\t\"Contains commands for working with the selected item(s).\": \"Opdrachten voor het werken met geselecteerde items\",\n\t\"Contains commands for selecting and transferring items.\": \"Opdrachten voor het selecteren en overbrengen van items\",\n\t\"Contains commands for customizing this window.\": \"Opdrachten voor het aanpassen van dit venster\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"Opdrachten voor het werken met figuren en het instellen van kenmerken\",\n\t\"Contains commands for using custom colors and drawing options.\": \"Opdrachten voor het gebruik van aangepaste kleuren en tekenopties\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"Opdrachten voor de weergave van Help en informatie over Paint\",\n\t\"Cannot save file.\": \"Kan het bestand niet opslaan.\",\n\t\"Error removing temporary file.\": \"Fout bij verwijderen van tijdelijk bestand.\",\n\t\"Get Colors\": \"Kleuren ophalen\",\n\t\"Save Colors\": \"Kleuren opslaan\",\n\t\"File last saved:\": \"Voor het laatst opgeslagen:\",\n\t\"Not Available\": \"niet beschikbaar\",\n\t\"Size on disk:\": \"Bestandsgrootte:\",\n\t\"Painting\": \"Schilderen\",\n\t\"Fonts\": \"Lettertypen\",\n\t\"Tools\": \"Extra\",\n\t\"All Picture Files\": \"Alle figuurbestanden\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"Klik op Help-onderwerpen in het menu Help als u Help wilt weergeven\",\n\t\"Select an area on which to get Help.\": \"Selecteer een gebied waarover u Help wilt weergeven\",\n\t\"Creates a new document.\": \"Een nieuw document maken\",\n\t\"Opens an existing document.\": \"Een bestaand document openen\",\n\t\"Closes the active document.\": \"Het actieve document sluiten\",\n\t\"Saves the active document.\": \"Het actieve document opslaan\",\n\t\"Saves the active document with a new name.\": \"Het actieve document opslaan met een andere naam\",\n\t\"Changes the page layout.\": \"De pagina-indeling wijzigen\",\n\t\"Specifies the default printer setup.\": \"De instellingen voor de standaardprinter\",\n\t\"Prints the active document and sets printing options.\": \"Het actieve document afdrukken en afdrukopties instellen\",\n\t\"Displays full pages.\": \"Volledige pagina's weergeven\",\n\t\"Opens this document.\": \"Dit document openen\",\n\t\"Deletes the selection.\": \"De selectie verwijderen\",\n\t\"Erases everything.\": \"Alles wissen\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"De selectie naar het Klembord kopiëren\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"De selectie knippen en naar het Klembord verplaatsen\",\n\t\"Finds the specified text.\": \"De opgegeven tekst zoeken\",\n\t\"Inserts the contents of the Clipboard.\": \"De inhoud van het Klembord invoegen\",\n\t\"Repeats the last action.\": \"De laatste actie herhalen\",\n\t\"Replaces specific text with different text.\": \"De opgegeven tekst vervangen\",\n\t\"Selects everything.\": \"Alles selecteren\",\n\t\"Undoes the last action.\": \"De laatste actie ongedaan maken\",\n\t\"Redoes the previously undone action.\": \"De laatst ongedaan gemaakte actie opnieuw uitvoeren\",\n\t\"Displays program information, version number, and copyright.\": \"Programma-informatie, versienummer en copyright weergeven\",\n\t\"Quits Paint.\": \"Paint afsluiten\",\n\t\"Opens Paint Help.\": \"Help voor Paint weergeven\",\n\t\"Displays instructions about how to use Help.\": \"Help weergeven voor gebieden waarop u klikt\",\n\t\"Displays Help for areas you click on.\": \"Help weergeven voor de huidige taak of opdracht\",\n\t\"Displays Help for the current task or command.\": \"Help weergeven voor de huidige taak of opdracht\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"Deze bitmap centreren als achtergrond voor het bureaublad\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"Kopieën van deze bitmap naast elkaar plaatsen als bureaubladachtergrond\",\n\t\"Sends the selection using mail or fax.\": \"De selectie verzenden via Mail of Fax\",\n\t\"Prints the selection.\": \"De selectie afdrukken\",\n\t\"Shows or hides the thumbnail.\": \"De schets weergeven of verbergen\",\n\t\"Shows Paint Help.\": \"Help voor Paint weergeven\",\n\t\"Shows or hides the status bar.\": \"De statusbalk weergeven of verbergen\",\n\t\"Shows or hides the tool box.\": \"De werkset weergeven of verbergen\",\n\t\"Shows or hides the color box.\": \"De kleurenset weergeven of verbergen\",\n\t\"Only a Far East font can be used for vertical editing.\": \"Verticaal bewerken kan alleen met een lettertype uit het verre oosten.\",\n\t\"Changes the window size.\": \"De venstergrootte wijzigen\",\n\t\"Changes the window position.\": \"De vensterpositie wijzigen\",\n\t\"Reduces the window to an icon.\": \"Het venster verkleinen tot pictogram\",\n\t\"Enlarges the window to full size.\": \"Het venster vergroten tot volledig scherm\",\n\t\"Switches to the next document window.\": \"Het volgende documentvenster activeren\",\n\t\"Switches to the previous document window.\": \"Het vorige documentvenster activeren\",\n\t\"Closes the active window and asks if you want to save changes.\": \"Het werkvenster sluiten en wijzigingen al of niet opslaan\",\n\t\"Restores the window to normal size.\": \"Het formaat van het venster herstellen\",\n\t\"Activates the task list.\": \"De taaklijst activeren\",\n\t\"All Files (*.*)\": \"Alle bestanden (*.*)\",\n\t\"Untitled\": \"Naamloos\",\n\t\"an unnamed file\": \"een bestand zonder naam\",\n\t\"&Hide\": \"&Verbergen\",\n\t\"Hide\": \"Verbergen\",\n\t\"No error message is available.\": \"Er is geen foutbericht beschikbaar.\",\n\t\"An unsupported operation was attempted.\": \"Er is een poging gedaan tot een niet-ondersteunde bewerking.\",\n\t\"A required resource was unavailable.\": \"Een vereiste bron was niet beschikbaar.\",\n\t\"Out of memory.\": \"Er is onvoldoende geheugen beschikbaar.\",\n\t\"An unknown error has occurred.\": \"Er is een onbekende fout opgetreden.\",\n\t\"on %1\": \"op %1\",\n\t\"&One Page\": \"&Een pagina\",\n\t\"One Page\": \"Een pagina\",\n\t\"&Two Page\": \"&Twee pagina's\",\n\t\"Two Page\": \"Twee pagina's\",\n\t\"Page %u\": \"Pagina %u\",\n\t\"Pages %u-%u\": \"Pagina's %u-%u\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"Printerbestanden (*.prn)|*.prn|Alle bestanden (*.*)|*.*||\",\n\t\"Print to File\": \"Naar bestand\",\n\t\"to %1\": \"naar %1\",\n\t\"&Update %1\": \"%1 &bijwerken\",\n\t\"Update %1\": \"%1 bijwerken\",\n\t\"E&xit && Return to %1\": \"&Afsluiten en terugkeren naar %1\",\n\t\"Exit & Return to %1\": \"Afsluiten en terugkeren naar %1\",\n\t\"Linked %s\": \"Gekoppeld(e) %s\",\n\t\"Unknown Type\": \"Onbekend type\",\n\t\"Invalid filename.\": \"De bestandsnaam is ongeldig.\",\n\t\"Failed to open document.\": \"Kan document niet openen.\",\n\t\"Failed to save document.\": \"Kan document niet opslaan.\",\n\t\"Save changes to %1?\": \"Wijzigingen in %1 opslaan?\",\n\t\"Failed to create empty document.\": \"Kan geen leeg document maken.\",\n\t\"The file is too large to open.\": \"Het bestand is te groot om te openen.\",\n\t\"Could not start print job.\": \"Kan de afdruktaak niet starten.\",\n\t\"Failed to launch help.\": \"Kan Help niet starten.\",\n\t\"Internal application error.\": \"Interne toepassingsfout.\",\n\t\"Command failed.\": \"De opdracht is mislukt.\",\n\t\"Insufficient memory to perform operation.\": \"Er is onvoldoende geheugen om de bewerking uit te voeren.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"Ingangen in het systeemregister zijn verwijderd en het INI-bestand (indien aanwezig) is verwijderd.\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"Niet alle ingangen in het systeemregister (of INI-bestand) zijn verwijderd.\",\n\t\"This program requires the file %s, which was not found on this system.\": \"Dit programma vereist het bestand %s. Dit bestand is niet op het systeem gevonden.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"Dit programma is gekoppeld aan de ontbrekende uitvoer %s in het bestand %s. Deze computer heeft misschien een incompatibele versie van %s.\",\n\t\"Please enter an integer.\": \"Geef een geheel getal op.\",\n\t\"Please enter a number.\": \"Geef een getal op.\",\n\t\"Please enter an integer between %1 and %2.\": \"Geef een geheel getal tussen %1 en %2 op.\",\n\t\"Please enter a number between %1 and %2.\": \"Geef een getal tussen %1 en %2 op.\",\n\t\"Please enter no more than %1 characters.\": \"Geef maximaal %1 tekens op.\",\n\t\"Please select a button.\": \"Selecteer een knop.\",\n\t\"Please enter an integer between 0 and 255.\": \"Geef een geheel getal tussen 0 en 255 op.\",\n\t\"Please enter a positive integer.\": \"Geef een positief geheel getal op.\",\n\t\"Please enter a date and/or time.\": \"Voer een datum en/of tijd in.\",\n\t\"Please enter a currency.\": \"Voer een valuta in.\",\n\t\"Unexpected file format.\": \"Onverwachte bestandsindeling.\",\n\t\"Cannot find this file.\": \"Kan dit bestand niet vinden.\",\n\t\"Please verify that the correct path and file name are given.\": \"Controleer of het pad en de bestandsnaam juist zijn.\",\n\t\"Destination disk drive is full.\": \"Bestemmingsstation is vol.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"Kan niet van %1 lezen, het is door iemand anders geopend.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"Kan niet naar %1 schrijven, het is een alleen-lezenbestand of het is door iemand anders geopend.\",\n\t\"An unexpected error occurred while reading %1.\": \"Onverwachte fout bij het lezen van %1.\",\n\t\"An unexpected error occurred while writing %1.\": \"Onverwachte fout bij het schrijven van %1.\",\n\t\"Unable to register document.\": \"Kan het document niet registreren.\",\n\t\"The document may already be open.\": \"Het document is mogelijk al geopend.\",\n\t\"Update %1 before proceeding?\": \"Wilt u %1 bijwerken voordat u doorgaat?\",\n\t\"Could not update client.\": \"Kan de client niet bijwerken.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"Kan niet registreren. ActiveX-functies werken niet juist.\",\n\t\"Failed to update the system registry.\": \"Kan het systeemregister niet bijwerken.\",\n\t\"Please try using REGEDIT.\": \"Probeer het met REGEDIT.\",\n\t\"Unable to read write-only property.\": \"Kan alleen-schrijvenkenmerk niet lezen.\",\n\t\"Unable to write read-only property.\": \"Kan alleen-lezenkenmerk niet schrijven.\",\n\t\"Unable to load mail system support.\": \"Kan ondersteuning voor mailsysteem niet laden.\",\n\t\"Mail system DLL is invalid.\": \"DLL-bestand voor mailsysteem is ongeldig.\",\n\t\"Send Mail failed to send message.\": \"Mail versturen kan het bericht niet versturen.\",\n\t\"No error occurred.\": \"Er is geen fout opgetreden.\",\n\t\"An unknown error occurred while accessing %1.\": \"Onbekende fout tijdens de toegang tot %1.\",\n\t\"%1 was not found.\": \"%1 is niet gevonden.\",\n\t\"%1 contains an invalid path.\": \"%1 bevat een ongeldig pad.\",\n\t\"%1 could not be opened because there are too many open files.\": \"%1 kan niet worden geopend omdat er te veel geopende bestanden zijn.\",\n\t\"Access to %1 was denied.\": \"Toegang tot %1 is geweigerd.\",\n\t\"An invalid file handle was associated with %1.\": \"Er is een ongeldige bestandsingang gekoppeld aan %1.\",\n\t\"%1 could not be removed because it is the current directory.\": \"%1 kan niet worden verwijderd omdat het de actieve map is.\",\n\t\"%1 could not be created because the directory is full.\": \"%1 kan niet worden gemaakt omdat de map vol is.\",\n\t\"Seek failed on %1\": \"Zoekopdracht mislukt op %1.\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"Bij het openen van %1 wordt een I/O-fout gemeld in de hardware.\",\n\t\"A sharing violation occurred while accessing %1.\": \"Er is een fout bij het delen opgetreden tijdens de toegang tot %1.\",\n\t\"A locking violation occurred while accessing %1.\": \"Er is een vergrendelingsfout opgetreden tijdens de toegang tot %1.\",\n\t\"Disk full while accessing %1.\": \"Onvoldoende schijfruimte tijdens de toegang tot %1.\",\n\t\"An attempt was made to access %1 past its end.\": \"Er is een poging gedaan tot toegang tot %1 voorbij het eindpunt.\",\n\t\"An attempt was made to write to the reading %1.\": \"Er is een poging gedaan om te lezen van %1 terwijl deze bezig was met schrijven.\",\n\t\"An attempt was made to read from the writing %1.\": \"Er is een poging gedaan om te schrijven naar %1 terwijl deze bezig was met lezen.\",\n\t\"%1 has a bad format.\": \"%1 heeft een onjuiste indeling.\",\n\t\"%1 contained an unexpected object.\": \"%1 bevat een onverwacht object.\",\n\t\"%1 contains an incorrect schema.\": \"%1 bevat een onjuist schema.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"Een rechthoekig gedeelte selecteren om te verplaatsen, kopiëren of bewerken\",\n\t\"Select\": \"Selecteren\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"Een vrije-vormgedeelte selecteren om te verplaatsen, kopiëren of bewerken\",\n\t\"Free-Form Select\": \"Vrije vorm selecteren\",\n\t\"Inserts text into the picture.\": \"Tekst invoegen in de figuur\",\n\t\"Fills an area with the current drawing color.\": \"Een gebied opvullen met de huidige tekenkleur\",\n\t\"Fill With Color\": \"Opvullen\",\n\t\"Draws a straight line with the selected line width.\": \"Een rechte lijn tekenen met de gekozen lijndikte\",\n\t\"Line\": \"Lijn\",\n\t\"Draws using an airbrush of the selected size.\": \"Tekenen met een verfspuit van het gekozen formaat\",\n\t\"Airbrush\": \"Verfspuit\",\n\t\"Draws a curved line with the selected line width.\": \"Een gebogen lijn tekenen met de gekozen lijndikte\",\n\t\"Curve\": \"Boog\",\n\t\"Draws a polygon with the selected fill style.\": \"Een veelhoek tekenen met de gekozen opvulstijl\",\n\t\"Polygon\": \"Veelhoek\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"Een afgeronde rechthoek tekenen met de gekozen opvulstijl\",\n\t\"Rounded Rectangle\": \"Afgeronde rechthoek\",\n\t\"Draws a free-form line one pixel wide.\": \"Een vrije-vormlijn tekenen van één pixel breed\",\n\t\"Pencil\": \"Potlood\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"Een gedeelte van de figuur uitgummen met de geselecteerde gumvorm\",\n\t\"Eraser/Color Eraser\": \"Gum/Kleurengum\",\n\t\"Changes the magnification.\": \"De vergroting wijzigen\",\n\t\"Magnifier\": \"Vergroten\",\n\t\"Picks up a color from the picture for drawing.\": \"Een kleur uit de figuur selecteren om mee te tekenen\",\n\t\"Pick Color\": \"Kleur selecteren\",\n\t\"Draws using a brush with the selected shape and size.\": \"Tekenen met een kwast van de gewenste vorm en dikte\",\n\t\"Brush\": \"Kwast\",\n\t\"Draws a rectangle with the selected fill style.\": \"Een rechthoek tekenen met de gekozen opvulstijl\",\n\t\"Rectangle\": \"Rechthoek\",\n\t\"Draws a filled rectangle.\": \"Een opgevulde rechthoek tekenen\",\n\t\"Draws an ellipse with the selected fill style.\": \"Een ovaal tekenen met de gekozen opvulstijl\",\n\t\"Ellipse\": \"Ovaal\",\n\t\"Draws a filled ellipse.\": \"Een opgevuld ovaal tekenen\",\n\t\"Makes the current selection either opaque or transparent.\": \"De huidige selectie ondoorzichtig of doorzichtig maken\",\n\t\"Creates a new color.\": \"Een nieuwe kleur maken\",\n\t\"Uses a previously saved palette of colors.\": \"Een eerder opgeslagen kleurenpalet gebruiken\",\n\t\"Saves the current palette of colors to a file.\": \"Het huidige kleurenpalet opslaan in een bestand\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"U moet het bestand opslaan voordat u het als achtergrond kunt gebruiken.\",\n\t\"The selection is now larger than the bitmap.\": \"De selectie is groter dan de bitmap.\",\n\t\"Would you like the bitmap enlarged?\": \"Wilt u de bitmap vergroten?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"De afbeelding op het Klembord is groter dan de bitmap.\",\n\t\"The file is not in the correct format.\": \"Het bestand heeft niet de juiste indeling.\",\n\t\"Not enough room to paste text.\": \"Onvoldoende ruimte om de tekst te plakken.\",\n\t\"Enlarge the text area and try again.\": \"Vergroot het tekstgebied en probeer het opnieuw.\",\n\t\"Places the text.\": \"Tekst plaatsen\"\n});\n"
  },
  {
    "path": "localization/no/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"no\", {\n\t\"Attributes\": \"Attributter\",\n\t\"&Width:\": \"&Bredde:\",\n\t\"Width:\": \"Bredde:\",\n\t\"&Height:\": \"&Høyde:\",\n\t\"Height:\": \"Høyde:\",\n\t\"Units\": \"Enheter\",\n\t\"&Inches\": \"&Tommer\",\n\t\"Inches\": \"Tommer\",\n\t\"C&m\": \"&Cm\",\n\t\"Cm\": \"Cm\",\n\t\"&Pixels\": \"&Piksler\",\n\t\"Pixels\": \"Piksler\",\n\t\"Colors\": \"Farger\",\n\t\"&Black and white\": \"S&vart-hvitt\",\n\t\"Black and white\": \"Svart-hvitt\",\n\t\"Co&lors\": \"&Farger\",\n\t\"Transparency\": \"Gjennomsiktighet\",\n\t\"Use &Transparent background color\": \"Br&uk gjennomsiktig bakgrunnsfarge\",\n\t\"Use Transparent background color\": \"Bruk gjennomsiktig bakgrunnsfarge\",\n\t\"Select &Color\": \"V&elg farge\",\n\t\"Select Color\": \"Velg farge\",\n\t\"Cancel\": \"Avbryt\",\n\t\"&Default\": \"&Standard\",\n\t\"Default\": \"Standard\",\n\t\"Custom Zoom\": \"Egendefinert zoom\",\n\t\"Current zoom:\": \"Gjeldende zoom:\",\n\t\"Zoom to\": \"Zoom til\",\n\t\"&100%\": \"&100 %\",\n\t\"100%\": \"100 %\",\n\t\"&200%\": \"&200 %\",\n\t\"200%\": \"200 %\",\n\t\"&400%\": \"&400 %\",\n\t\"400%\": \"400 %\",\n\t\"&600%\": \"&600 %\",\n\t\"600%\": \"600 %\",\n\t\"&800%\": \"&800 %\",\n\t\"800%\": \"800 %\",\n\t\"Flip and Rotate\": \"Vend og roter\",\n\t\"Flip or rotate\": \"Vend eller roter\",\n\t\"&Flip horizontal\": \"&Vend vannrett\",\n\t\"Flip horizontal\": \"Vend vannrett\",\n\t\"Flip &vertical\": \"V&end loddrett\",\n\t\"Flip vertical\": \"Vend loddrett\",\n\t\"&Rotate by angle\": \"&Roter\",\n\t\"Rotate by angle\": \"Roter\",\n\t\"Stretch and Skew\": \"Strekk og forskyv bilde\",\n\t\"Stretch\": \"Strekk\",\n\t\"&Horizontal:\": \"&Vannrett:\",\n\t\"Horizontal:\": \"Vannrett:\",\n\t\"%\": \" %\",\n\t\"&Vertical:\": \"&Loddrett:\",\n\t\"Vertical:\": \"Loddrett:\",\n\t\"Skew\": \"Forskyv\",\n\t\"H&orizontal:\": \"V&annrett:\",\n\t\"Degrees\": \"grader\",\n\t\"V&ertical:\": \"L&oddrett:\",\n\t\"Color Table\": \"Fargetabell\",\n\t\"New\": \"Ny\",\n\t\"&New \": \"&Ny \",\n\t\"New \": \"Ny \",\n\t\"&Help\": \"&Hjelp\",\n\t\"Help\": \"Hjelp\",\n\t\"Printing\": \"Skriver ut\",\n\t\"on the\": \"på\",\n\t\"&Print\": \"Skriv &ut\",\n\t\"Print\": \"Skriv ut\",\n\t\"&Next Page\": \"&Neste side\",\n\t\"Next Page\": \"Neste side\",\n\t\"Pre&v Page\": \"&Forrige side\",\n\t\"Prev Page\": \"Forrige side\",\n\t\"Zoom &In\": \"&Zoom inn\",\n\t\"Zoom In\": \"Zoom inn\",\n\t\"Zoom &Out\": \"Z&oom ut\",\n\t\"Zoom Out\": \"Zoom ut\",\n\t\"&Close\": \"&Lukk\",\n\t\"Close\": \"Lukk\",\n\t\"Grid Settings\": \"Innstillinger for rutenett\",\n\t\"&Pixel Grid\": \"&Pikselrutenett\",\n\t\"Pixel Grid\": \"Pikselrutenett\",\n\t\"&Tile Grid\": \"&Rutenett\",\n\t\"Tile Grid\": \"Rutenett\",\n\t\"pixels\": \"piksler\",\n\t\"H&eight:\": \"&Høyde:\",\n\t\"Text\": \"Tekst\",\n\t\"Undo\": \"Angre\",\n\t\"Cut\": \"Klipp ut\",\n\t\"Copy\": \"Kopier\",\n\t\"Paste\": \"Lim inn\",\n\t\"Clear Selection\": \"Fjern utvalg\",\n\t\"Select All\": \"Merk alt\",\n\t\"Text Toolbar\": \"Tekstverktøylinje\",\n\t\"Selection\": \"Merket område\",\n\t\"Cu&t\": \"Klipp &ut\",\n\t\"&Copy\": \"&Kopier\",\n\t\"&Paste\": \"&Lim inn\",\n\t\"C&lear Selection\": \"&Fjern utvalg\",\n\t\"Select &All\": \"&Merk alt\",\n\t\"C&opy To\": \"K&opier til\",\n\t\"Copy To\": \"Kopier til\",\n\t\"Paste &From\": \"Lim &inn fra\",\n\t\"Paste From\": \"Lim inn fra\",\n\t\"Flip/&Rotate\": \"&Vend/roter\",\n\t\"Flip/Rotate\": \"Vend/roter\",\n\t\"&Stretch/Skew\": \"&Strekk/forskyv\",\n\t\"Stretch/Skew\": \"Strekk/forskyv\",\n\t\"&Invert Colors\": \"Inv&erter farger\",\n\t\"Invert Colors\": \"Inverter farger\",\n\t\"Thumbnail\": \"Miniatyr\",\n\t\"&File\": \"&Fil\",\n\t\"File\": \"Fil\",\n\t\"&New\": \"&Ny\",\n\t\"&Open\": \"Å&pne\",\n\t\"Open\": \"Åpne\",\n\t\"&Save\": \"La&gre\",\n\t\"Save\": \"Lagre\",\n\t\"Save &As\": \"Lagre &som\",\n\t\"Save As\": \"Lagre som\",\n\t\"Print Pre&view\": \"Forhånds&visning\",\n\t\"Print Preview\": \"Forhåndsvisning\",\n\t\"Page Se&tup\": \"Utskr&iftsformat\",\n\t\"Page Setup\": \"Utskriftsformat\",\n\t\"S&end\": \"Sen&d\",\n\t\"Send\": \"Send\",\n\t\"Set As &Wallpaper (Tiled)\": \"&Bruk som bakgrunn (side ved side)\",\n\t\"Set As Wallpaper (Tiled)\": \"Bruk som bakgrunn (side ved side)\",\n\t\"Set As Wa&llpaper (Centered)\": \"B&ruk som bakgrunn (midtstilt)\",\n\t\"Set As Wallpaper (Centered)\": \"Bruk som bakgrunn (midtstilt)\",\n\t\"Recent File\": \"Nylig brukt fil\",\n\t\"E&xit\": \"&Avslutt\",\n\t\"Exit\": \"Avslutt\",\n\t\"&Edit\": \"&Rediger\",\n\t\"Edit\": \"Rediger\",\n\t\"&Undo\": \"&Angre\",\n\t\"&Repeat\": \"&Gjenta\",\n\t\"Repeat\": \"Gjenta\",\n\t\"Del\": \"DEL\",\n\t\"&View\": \"&Vis\",\n\t\"View\": \"Vis\",\n\t\"&Tool Box\": \"&Verktøykasse\",\n\t\"Tool Box\": \"Verktøykasse\",\n\t\"&Color Box\": \"&Fargeboks\",\n\t\"Color Box\": \"Fargeboks\",\n\t\"&Status Bar\": \"Stat&uslinje\",\n\t\"Status Bar\": \"Statuslinje\",\n\t\"T&ext Toolbar\": \"&Tekstverktøylinje\",\n\t\"&Normal Size\": \"&Normal størrelse\",\n\t\"Normal Size\": \"Normal størrelse\",\n\t\"&Large Size\": \"&Stor størrelse\",\n\t\"Large Size\": \"Stor størrelse\",\n\t\"C&ustom\": \"&Egendefinert\",\n\t\"Custom\": \"Egendefinert\",\n\t\"Show &Grid\": \"&Vis rutenett\",\n\t\"Show Grid\": \"Vis rutenett\",\n\t\"Show T&humbnail\": \"Vis &miniatyr\",\n\t\"Show Thumbnail\": \"Vis miniatyr\",\n\t\"&View Bitmap\": \"&Punktgrafikk\",\n\t\"View Bitmap\": \"Punktgrafikk\",\n\t\"Ctrl+F\": \"Ctrl+H\",\n\t\"&Image\": \"&Bilde\",\n\t\"Image\": \"Bilde\",\n\t\"&Flip/Rotate\": \"&Vend/roter\",\n\t\"&Attributes\": \"&Attributter\",\n\t\"&Clear Image\": \"&Fjern bilde\",\n\t\"Clear Image\": \"Fjern bilde\",\n\t\"Ctrl+Shft+N\": \"Ctrl+Skift+N\",\n\t\"&Draw Opaque\": \"&Tegn ugjennomsiktig\",\n\t\"Draw Opaque\": \"Tegn ugjennomsiktig\",\n\t\"&Colors\": \"F&arger\",\n\t\"&Edit Colors\": \"&Rediger farger\",\n\t\"Edit Colors\": \"Rediger farger\",\n\t\"&Help Topics\": \"&Emner i Hjelp\",\n\t\"Help Topics\": \"Emner i Hjelp\",\n\t\"&About Paint\": \"&Om Paint\",\n\t\"About Paint\": \"Om Paint\",\n\t\"&Update\": \"&Oppdater\",\n\t\"Update\": \"Oppdater\",\n\t\"Save Copy &As\": \"Lagre kopi &som\",\n\t\"Save Copy As\": \"Lagre kopi som\",\n\t\"untitled\": \"Uten navn\",\n\t\"Bitmap Image\": \"Punktgrafikk\",\n\t\"Bitmap Files (*.bmp)\": \"Punktgrafikkfiler (bmp)\",\n\t\"Paint.Picture\": \"Paint.Bilde\",\n\t\"PCX Files\": \"PCX-filer\",\n\t\"Icon Files\": \"Ikonfiler\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"Monokrom punktgrafikk (*.bmp, *.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"16-fargers punktgrafikk (*.bmp, *.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"256-fargers punktgrafikk (*.bmp, *.dib)\",\n\t\"Paint cannot open this file.\": \"Kan ikke åpne denne filen.\",\n\t\"Paint cannot read this file.\": \"Kan ikke lese denne filen.\",\n\t\"This file is read-only.\": \"Filen er skrivebeskyttet.\",\n\t\"To save your changes, use a different filename.\": \"Bruk et annet filnavn for å lagre endringene.\",\n\t\"This file is already open.\": \"Filen er allerede åpen.\",\n\t\"This is not a valid .PCS file.\": \"Dette er ikke en gyldig PCS-fil.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"Denne filen er åpen for redigering, og kan ikke overskrives.\",\n\t\"Use a different filename to save your changes.\": \"Bruk et annet filnavn for å lagre endringene.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"Dette er ikke en gyldig punktgrafikkfil, eller formatet på filen støttes ikke.\",\n\t\"This is not a valid icon.\": \"Dette er ikke et gyldig ikon.\",\n\t\"This is not a valid cursor.\": \"Dette er ikke en gyldig markør.\",\n\t\"Save was interrupted, so your file has not been saved.\": \"Lagringen ble avbrutt. Filen ble ikke lagret.\",\n\t\"You cannot save to a read-only file.\": \"Du kan ikke lagre en skrivebeskyttet fil.\",\n\t\"Use a different file name.\": \"Bruk et annet filnavn.\",\n\t\"This file is already in use.\": \"Filen er allerede i bruk.\",\n\t\"Close the program, and then try again.\": \"Lukk programmet, og prøv på nytt.\",\n\t\"Paint cannot save this file.\": \"Kan ikke lagre denne filen.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"Kan ikke lagre det samme filnavnet med en annen filtype.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"Rutenettmellomrommet må være et heltall mellom %d og %d.\",\n\t\"There is not enough memory or resources to complete operation.\": \"Ikke nok minne eller ressurser til å fullføre operasjonen.\",\n\t\"Close some programs, and then try again.\": \"Lukk noen programmer, og prøv på nytt.\",\n\t\"Low on memory or resources.\": \"Lite minne eller systemressurser.\",\n\t\"Group error.\": \"Gruppefeil.\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"Paint kan ikke skrive ut dokumentet. Kontroller at du har nok diskplass og at skriveren fungerer korrekt.\",\n\t\"Saving into this format may cause some loss of color information.\": \"Noe fargeinformasjon kan gå tapt hvis du lagrer filen i dette formatet.\",\n\t\"Do you want to continue?\": \"Vil du fortsette?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"Du kan ikke angre konvertering til svart/hvitt. Denne handlingen påvirker gjeldende fil, og kan medføre tap av fargeinformasjon.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"Punktgrafikk må ha mer enn en piksel på hver side.\",\n\t\"Generic error.\": \"Generell feil.\",\n\t\"File not found.\": \"Finner ikke filen.\",\n\t\"Bad path.\": \"Ugyldig bane.\",\n\t\"Too many open files.\": \"For mange åpne filer.\",\n\t\"Access denied.\": \"Ingen tilgang.\",\n\t\"Invalid file.\": \"Ugyldig fil.\",\n\t\"Remove current folder.\": \"Fjern gjeldende mappe.\",\n\t\"Folder full.\": \"Mappen er full.\",\n\t\"Bad seek.\": \"Ugyldig søk.\",\n\t\"Hard IO error.\": \"I/U-feil i maskinvaren.\",\n\t\"Sharing violation.\": \"Brudd på delingstillatelse.\",\n\t\"Lock violation.\": \"Brudd på låsetillatelse.\",\n\t\"Disk full.\": \"Disken er full.\",\n\t\"End of file.\": \"Slutt på filen.\",\n\t\"Error getting the Clipboard Data!\": \"Kan ikke hente data fra utklippstavlen.\",\n\t\"No Printer Found @ page setup\": \"Finner ingen skriver @ utskriftsformat.\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"24-biters punktgrafikk (*.bmp, *.dib)\",\n\t\"All Files\": \"Alle filer\",\n\t\"Palette|*.pal|\": \"Palett|*.PAL|\",\n\t\"OLE 2.0 was unable to start.\": \"Kan ikke starte OLE 2.0.\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"Kontroller at du bruker riktig versjon av OLE-bibliotekene.\",\n\t\"Resets the text be without any attributes.\": \"Tilbakestiller teksten slik at den ikke har noen attributter\",\n\t\"Sets or clears the text bold attribute.\": \"Aktiverer eller deaktiverer attributtet for fet tekst\",\n\t\"Sets or clears the text italic attribute.\": \"Aktiverer eller deaktiverer attributtet for kursiv tekst\",\n\t\"Selects the font used by the text.\": \"Velger skriften som brukes på teksten\",\n\t\"Selects the point size of the text.\": \"Velger punktstørrelsen for teksten\",\n\t\"Sets or clears the text underline attribute.\": \"Aktiverer eller deaktiverer attributtet for understreket tekst\",\n\t\"Shows or hides the tooltips.\": \"Viser eller skjuler verktøytips\",\n\t\"Show Paint Help.\": \"Viser Hjelp for Paint\",\n\t\"Sends a picture by using mail or fax.\": \"Sender et bilde via e-post eller telefaks\",\n\t\"Copies the selection to a file.\": \"Kopierer det merkede området til en fil\",\n\t\"Pastes a file into the selection.\": \"Limer inn en fil i det merkede området\",\n\t\"Zooms the picture to 100%.\": \"Zoomer bildet til 100 %\",\n\t\"Zooms the picture to 400%.\": \"Zoomer bildet til 400 %\",\n\t\"Zooms the picture.\": \"Zoomer bildet\",\n\t\"Displays the entire picture.\": \"Viser hele bildet\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"Viser eller skjuler miniatyren\",\n\t\"Shows or hides the grid.\": \"Viser eller skjuler rutenettet\",\n\t\"Shows or hides the text toolbar.\": \"Viser eller skjuler tekstverktøylinjen\",\n\t\"Flips or rotates the picture or a selection.\": \"Vender eller roterer bildet eller det merkede området\",\n\t\"Stretches or skews the picture or a selection.\": \"Strekker eller forskyver bildet eller det merkede området\",\n\t\"Inverts the colors of the picture or a selection.\": \"Inverterer fargene i bildet eller i det merkede området\",\n\t\"Changes the attributes of the picture.\": \"Endrer attributtene til dette bildet\",\n\t\"Clears the picture or selection.\": \"Fjerner bildet eller det merkede området\",\n\t\"The font size must be a numeric value.\": \"Skriftstørrelsen må være en numerisk verdi.\",\n\t\"Contains commands for working with the selected item(s).\": \"Inneholder kommandoer for å arbeide med valgt(e) element(er)\",\n\t\"Contains commands for selecting and transferring items.\": \"Inneholder kommandoer for å merke og flytte elementer\",\n\t\"Contains commands for customizing this window.\": \"Inneholder kommandoer for å tilpasse vinduet\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"Inneholder kommandoer for å endre bilder og angi attributter\",\n\t\"Contains commands for using custom colors and drawing options.\": \"Inneholder kommandoer for å bruke egendefinerte farger og tegnealternativer\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"Inneholder kommandoer for å vise Hjelp for og informasjon om Paint\",\n\t\"Cannot save file.\": \"Kan ikke lagre filen\",\n\t\"Error removing temporary file.\": \"Feil under fjerning av midlertidig fil.\",\n\t\"Get Colors\": \"Hent farger\",\n\t\"Save Colors\": \"Lagre farger\",\n\t\"File last saved:\": \"Fil sist lagret:\",\n\t\"Size on disk:\": \"Størrelse på disk:\",\n\t\"Not Available\": \"Ikke tilgjengelig\",\n\t\"%s bytes\": \"%s byte\",\n\t\"Painting\": \"Maleri\",\n\t\"Fonts\": \"Skrifter\",\n\t\"Tools\": \"Verktøy\",\n\t\"All Picture Files\": \"Alle bildefiler\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"Velg Emner i Hjelp på Hjelp-menyen hvis du vil ha mer informasjon.\",\n\t\"Select an area on which to get Help.\": \"Merker et emne som du vil vise Hjelp for.\",\n\t\"%1 in %2\": \"%1 i %2\",\n\t\"Creates a new document.\": \"Oppretter et nytt dokument\",\n\t\"Opens an existing document.\": \"Åpner et eksisterende dokument\",\n\t\"Closes the active document.\": \"Lukker det aktive dokumentet\",\n\t\"Saves the active document.\": \"Lagrer det aktive dokumentet\",\n\t\"Saves the active document with a new name.\": \"Lagrer det aktive dokumentet med et nytt navn.\",\n\t\"Changes the page layout.\": \"Endrer sideoppsettet\",\n\t\"Specifies the default printer setup.\": \"Angir standard skriveroppsett\",\n\t\"Prints the active document and sets printing options.\": \"Skriver ut det aktive dokumentet og angir utskriftsalternativer\",\n\t\"Displays full pages.\": \"Viser hele sider\",\n\t\"Opens this document.\": \"Åpner dette dokumentet\",\n\t\"Deletes the selection.\": \"Sletter det merkede området\",\n\t\"Erases everything.\": \"Sletter alt\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"Kopierer det merkede området til utklippstavlen\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"Klipper ut det merkede området og flytter det til utklippstavlen\",\n\t\"Finds the specified text.\": \"Søker etter den angitte teksten\",\n\t\"Inserts the contents of the Clipboard.\": \"Setter inn innholdet på utklippstavlen\",\n\t\"Repeats the last action.\": \"Gjentar siste handling\",\n\t\"Replaces specific text with different text.\": \"Erstatter angitt tekst med en annen tekst\",\n\t\"Selects everything.\": \"Merker alt\",\n\t\"Undoes the last action.\": \"Angrer siste handling\",\n\t\"Redoes the previously undone action.\": \"Gjør om siste angret handling\",\n\t\"Displays program information, version number, and copyright.\": \"Viser programinformasjon, versjonsnummer og opphavsrett.\",\n\t\"Quits Paint.\": \"Avslutter Paint\",\n\t\"Opens Paint Help.\": \"Åpner Hjelp for Paint\",\n\t\"Displays instructions about how to use Help.\": \"Viser informasjon om hvordan du bruker Hjelp\",\n\t\"Displays Help for areas you click on.\": \"Viser hjelp til områder du klikker\",\n\t\"Displays Help for the current task or command.\": \"Viser hjelp for gjeldende oppgave eller kommando\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"Bruker dette bildet som bakgrunn på skrivebordet (midtstilt)\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"Bruker dette bildet som bakgrunn på skrivebordet (side ved side)\",\n\t\"Sends the selection using mail or fax.\": \"Sender det merkede området via av e-post eller telefaks\",\n\t\"Prints the selection.\": \"Skriver ut det merkede området\",\n\t\"Shows or hides the thumbnail.\": \"Viser eller skjuler miniatyren\",\n\t\"Shows Paint Help.\": \"Viser Hjelp for Paint\",\n\t\"Shows or hides the status bar.\": \"Viser eller skjuler statuslinjen\",\n\t\"Shows or hides the tool box.\": \"Viser eller skjuler verktøykassen\",\n\t\"Shows or hides the color box.\": \"Viser eller skjuler fargeboksen\",\n\t\"Only a Far East font can be used for vertical editing.\": \"Bare skrifter fra Fjerne østen kan brukes til loddrett redigering.\",\n\t\"Changes the window size.\": \"Endrer vindusstørrelsen\",\n\t\"Changes the window position.\": \"Endrer vindusplasseringen\",\n\t\"Reduces the window to an icon.\": \"Minimerer vinduet til et ikon\",\n\t\"Enlarges the window to full size.\": \"Forstørrer vinduet til full størrelse\",\n\t\"Switches to the next document window.\": \"Bytter til det neste dokumentvinduet\",\n\t\"Switches to the previous document window.\": \"Bytter til det forrige dokumentvinduet\",\n\t\"Closes the active window and asks if you want to save changes.\": \"Lukker det aktive vinduet, og spør om du vil lagre eventuelle endringer\",\n\t\"Restores the window to normal size.\": \"Gjenoppretter vinduet til normal størrelse\",\n\t\"Activates the task list.\": \"Aktiverer oppgavelisten\",\n\t\"All Files (*.*)\": \"Alle filer (*.*)\",\n\t\"Untitled\": \"Uten navn\",\n\t\"an unnamed file\": \"en fil uten navn\",\n\t\"&Hide\": \"&Skjul\",\n\t\"Hide\": \"Skjul\",\n\t\"No error message is available.\": \"Ingen feilmelding er tilgjengelig.\",\n\t\"An unsupported operation was attempted.\": \"Forsøkte å utføre en operasjon som ikke støttes.\",\n\t\"A required resource was unavailable.\": \"En nødvendig ressurs var ikke tilgjengelig.\",\n\t\"Out of memory.\": \"Ikke nok minne.\",\n\t\"An unknown error has occurred.\": \"Det har oppstått en ukjent feil.\",\n\t\"on %1\": \"på %1\",\n\t\"&One Page\": \"&En side\",\n\t\"One Page\": \"En side\",\n\t\"&Two Page\": \"&To sider\",\n\t\"Two Page\": \"To sider\",\n\t\"Page %u\": \"Side %u\",\n\t\"Pages %u-%u\": \"Side %u-%u\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"Skriverfiler (*.prn)|*.prn|Alle filer (*.*)|*.*||\",\n\t\"Print to File\": \"Skriv til fil\",\n\t\"to %1\": \"til %1\",\n\t\"&Update %1\": \"&Oppdater %1\",\n\t\"Update %1\": \"Oppdater %1\",\n\t\"E&xit && Return to %1\": \"&Avslutt og gå til %1\",\n\t\"Exit & Return to %1\": \"Avslutt og gå til %1\",\n\t\"Linked %s\": \"Koblet %s\",\n\t\"Unknown Type\": \"Ukjent type\",\n\t\"Invalid filename.\": \"Ugyldig filnavn.\",\n\t\"Failed to open document.\": \"Kan ikke åpne dokumentet.\",\n\t\"Failed to save document.\": \"Kan ikke lagre dokumentet.\",\n\t\"Save changes to %1?\": \"Lagre endringer i %1?\",\n\t\"Failed to create empty document.\": \"Kan ikke opprette tomt dokument.\",\n\t\"The file is too large to open.\": \"Filen er for stor til å kunne åpnes.\",\n\t\"Could not start print job.\": \"Kan ikke starte utskriftsjobben.\",\n\t\"Failed to launch help.\": \"Kan ikke starte Hjelp.\",\n\t\"Internal application error.\": \"Intern programfeil.\",\n\t\"Command failed.\": \"Kommandoen mislyktes.\",\n\t\"Insufficient memory to perform operation.\": \"Ikke nok minne til å utføre operasjonen.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"Oppføringer i systemregistret er fjernet og INI-filen (hvis det fantes noen) er slettet.\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"Ikke alle oppføringene i systemregistret (eller INI-filen) ble fjernet.\",\n\t\"This program requires the file %s, which was not found on this system.\": \"Dette programmet krever filen %s. Filen finnes ikke på dette systemet.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"Dette programmet er koblet til den manglende eksporten %s i filen %s. Denne datamaskinen har kanskje en versjon av %s som ikke er kompatibel.\",\n\t\"Please enter an integer.\": \"Angi et heltall.\",\n\t\"Please enter a number.\": \"Angi et tall.\",\n\t\"Please enter an integer between %1 and %2.\": \"Angi et heltall mellom %1 og %2.\",\n\t\"Please enter a number between %1 and %2.\": \"Angi et tall mellom %1 og %2.\",\n\t\"Please enter no more than %1 characters.\": \"Ikke skriv inn mer enn %1 tegn.\",\n\t\"Please select a button.\": \"Trykk en knapp.\",\n\t\"Please enter an integer between 0 and 255.\": \"Angi et heltall mellom 0 og 255.\",\n\t\"Please enter a positive integer.\": \"Angi et positivt heltall.\",\n\t\"Please enter a date and/or time.\": \"Angi en dato og/eller klokkeslett.\",\n\t\"Please enter a currency.\": \"Angi en valuta.\",\n\t\"Unexpected file format.\": \"Uventet filformat.\",\n\t\"Cannot find this file.\": \"Finner ikke filen.\",\n\t\"Please verify that the correct path and file name are given.\": \"Kontroller at riktig bane og filnavn er angitt.\",\n\t\"Destination disk drive is full.\": \"Måldisken er full.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"Kan ikke lese fra %1. Den er åpnet av en annen bruker.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"Kan ikke skrive til %1. Den er skrivebeskyttet eller åpnet av andre.\",\n\t\"An unexpected error occurred while reading %1.\": \"Det oppstod en uventet feil under lesing av %1.\",\n\t\"An unexpected error occurred while writing %1.\": \"Det oppstod en uventet feil under skriving til %1.\",\n\t\"Unable to register document.\": \"kan ikke registrere dokumentet.\",\n\t\"The document may already be open.\": \"Det kan allerede være åpnet.\",\n\t\"Update %1 before proceeding?\": \"Vil du oppdatere %1 før du går videre?\",\n\t\"Could not update client.\": \"Kan ikke oppdatere klienten.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"Kan ikke registrere. ActiveX-funksjoner vil kanskje ikke fungere.\",\n\t\"Failed to update the system registry.\": \"Kan ikke oppdatere systemregistret.\",\n\t\"Please try using REGEDIT.\": \"Prøv med REGEDIT.\",\n\t\"Unable to read write-only property.\": \"Kan ikke lese lesebeskyttet egenskap.\",\n\t\"Unable to write read-only property.\": \"Kan ikke skrive til skrivebeskyttet egenskap.\",\n\t\"Unable to load mail system support.\": \"Kan ikke laste støtte for e-postsystemer.\",\n\t\"Mail system DLL is invalid.\": \"Ugyldig DLL for e-postsystem.\",\n\t\"Send Mail failed to send message.\": \"Meldingen ble ikke sendt.\",\n\t\"No error occurred.\": \"Ingen feil oppstod.\",\n\t\"An unknown error occurred while accessing %1.\": \"Det oppstod en ukjent feil under tilgang til %1.\",\n\t\"%1 was not found.\": \"Fant ikke %1.\",\n\t\"%1 contains an invalid path.\": \"%1 inneholder en ugyldig bane.\",\n\t\"%1 could not be opened because there are too many open files.\": \"%1 kunne ikke åpnes fordi det er for mange åpne filer.\",\n\t\"Access to %1 was denied.\": \"Ingen tilgang til %1.\",\n\t\"An invalid file handle was associated with %1.\": \"En ugyldig filreferanse ble knyttet til %1.\",\n\t\"%1 could not be removed because it is the current directory.\": \"%1 kunne ikke fjernes fordi det er gjeldende katalog.\",\n\t\"%1 could not be created because the directory is full.\": \"%1 kunne ikke opprettes fordi katalogen er full.\",\n\t\"Seek failed on %1\": \"Søk mislyktes på %1\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"En I/U-feil på maskinvaren ble rapportert under tilgang til %1.\",\n\t\"A sharing violation occurred while accessing %1.\": \"Det oppstod brudd på delingstillatelse under tilgang til %1.\",\n\t\"A locking violation occurred while accessing %1.\": \"Det oppstod brudd på låsetillatelse under tilgang til %1.\",\n\t\"Disk full while accessing %1.\": \"Full disk ved tilgang til %1.\",\n\t\"An attempt was made to access %1 past its end.\": \"Forsøkte å få tilgang til %1 etter dens slutt.\",\n\t\"An attempt was made to write to the reading %1.\": \"Det ble forsøkt å skrive til %1, som er skrivebeskyttet.\",\n\t\"An attempt was made to read from the writing %1.\": \"Det ble forsøkt å lese fra %1, som er lesebeskyttet.\",\n\t\"%1 has a bad format.\": \"%1 har feil format.\",\n\t\"%1 contained an unexpected object.\": \"%1 inneholdt et uventet objekt.\",\n\t\"%1 contains an incorrect schema.\": \"%1 inneholder et ugyldig skjema.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"Merker en rektangulær del av bildet som kan flyttes, kopieres eller redigeres\",\n\t\"Select\": \"Merk\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"Merker en frihåndsdel av bildet som kan flyttes, kopieres eller redigeres\",\n\t\"Free-Form Select\": \"Frihåndsmerking\",\n\t\"Inserts text into the picture.\": \"Setter inn tekst i bildet\",\n\t\"Fills an area with the current drawing color.\": \"Fyller et område med gjeldende tegnefarge.\",\n\t\"Fill With Color\": \"Fyll med farge\",\n\t\"Draws a straight line with the selected line width.\": \"Tegner en rett strek med den valgte bredden\",\n\t\"Line\": \"Strek\",\n\t\"Draws using an airbrush of the selected size.\": \"Spraymaler med den valgte størrelsen\",\n\t\"Airbrush\": \"Spraymaling\",\n\t\"Draws a curved line with the selected line width.\": \"Tegner en bue med den valgte strektykkelsen\",\n\t\"Curve\": \"Bue\",\n\t\"Draws a polygon with the selected fill style.\": \"Tegner en polygon med den valgte fylltypen\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"Tegner et avrundet rektangel med det valgte fyllmønsteret\",\n\t\"Rounded Rectangle\": \"Avrundet rektangel\",\n\t\"Draws a free-form line one pixel wide.\": \"Tegner en frihåndslinje som er en piksel tykk\",\n\t\"Pencil\": \"Blyant\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"Sletter en del av bildet med den valgte formen på viskelæret\",\n\t\"Eraser/Color Eraser\": \"Viskelær\",\n\t\"Changes the magnification.\": \"Endrer forstørrelsen\",\n\t\"Magnifier\": \"Forstørrelseglass\",\n\t\"Picks up a color from the picture for drawing.\": \"Henter en farge som det skal tegnes med, fra bildet\",\n\t\"Pick Color\": \"Hent farge\",\n\t\"Draws using a brush with the selected shape and size.\": \"Tegner med en kost i valgt størrelse og form.\",\n\t\"Brush\": \"Kost\",\n\t\"Draws a rectangle with the selected fill style.\": \"Tegner et rektangel med det valgte fyllmønsteret\",\n\t\"Rectangle\": \"Rektangel\",\n\t\"Draws a filled rectangle.\": \"Tegner et fylt rektangel\",\n\t\"Draws an ellipse with the selected fill style.\": \"Tegner en ellipse med det valgte fyllmønsteret\",\n\t\"Draws a filled ellipse.\": \"Tegner en fylt ellipse\",\n\t\"Makes the current selection either opaque or transparent.\": \"Gjør det merkede området gjennomsiktig eller ugjennomsiktig\",\n\t\"Creates a new color.\": \"Lager en ny farge\",\n\t\"Uses a previously saved palette of colors.\": \"Bruker en tidligere lagret fargepalett\",\n\t\"Saves the current palette of colors to a file.\": \"Lagrer gjeldende fargepalett i en fil\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"Du må lagre filen før den kan velges som bakgrunn.\",\n\t\"The selection is now larger than the bitmap.\": \"Det merkede området er nå større enn punktgrafikkbildet.\",\n\t\"Would you like the bitmap enlarged?\": \"Vil du forstørre bildet?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"Bildet på utklippstavlen er større enn punktgrafikkbildet.\",\n\t\"The file is not in the correct format.\": \"Filen har ikke riktig format.\",\n\t\"Not enough room to paste text.\": \"Ikke nok plass til å lime inn tekst.\",\n\t\"Enlarge the text area and try again.\": \"Gjør tekstområdet større og prøv på nytt.\",\n\t\"Places the text.\": \"Plasserer teksten\"\n});\n"
  },
  {
    "path": "localization/parse-rc-file.js",
    "content": "// @ts-check\n// Based on: https://github.com/evernote/serge/blob/master/lib/Serge/Engine/Plugin/parse_rc.pm\n\n/**\n * Find translatable strings in a .rc file\n * @param {string} rc_file_text - text from a .rc file; may need to be read as UTF-16\n * @returns {string[]} - Array of translatable strings found in the file\n */\nmodule.exports = function parse_rc_file(rc_file_text) {\n\n\t// fetch().text() assumes utf8; hack to make it more readable (not needed in Node.js)\n\t// rc_file_text = rc_file_text.replace(/\\0/g, \"\");\n\n\tlet strings = [];\n\n\tlet menu;\n\tlet dialog;\n\t// let stringtable;\n\tlet block_level = 0;\n\tlet id_str;\n\tlet dialog_id;\n\n\tfor (let line of rc_file_text.split(/\\r?\\n/g)) {\n\n\t\t// let hint;\n\t\tlet orig_str;\n\n\t\t// normalize line\n\t\tlet norm_line = line.trim()\n\t\t\t.replace(/[\\t ]+/g, \" \")\n\t\t\t.replace(/\\/\\/.*$/g, \"\");\n\n\t\tif (norm_line.match(/ MENU$/)) {\n\t\t\tmenu = true;\n\t\t}\n\t\tconst dialog_match = norm_line.match(/^(\\w+) (DIALOG|DIALOGEX) /);\n\t\tif (dialog_match) {\n\t\t\tdialog_id = dialog_match[1];\n\t\t\tdialog = true;\n\t\t}\n\t\tif (norm_line === \"STRINGTABLE\") {\n\t\t\t// stringtable = true;\n\t\t}\n\t\tif (norm_line === \"BEGIN\") {\n\t\t\tblock_level++;\n\t\t}\n\t\tif (norm_line === \"END\") {\n\t\t\tblock_level--;\n\t\t\tif (block_level == 0) {\n\t\t\t\tmenu = undefined;\n\t\t\t\tdialog = undefined;\n\t\t\t\tdialog_id = undefined;\n\t\t\t\t// stringtable = undefined;\n\t\t\t}\n\t\t}\n\n\t\t// console.log(`${line}\\n`);\n\t\t// console.log(`[m=${menu},d=${dialog},s=${stringtable},b=${block_level}]\\n`);\n\t\t// console.log(`[${norm_line}]\\n`);\n\n\t\t// DIALOG header contents\n\t\tif (dialog && !block_level) {\n\t\t\tconst match = line.match(/^[\\t ]*(CAPTION)[\\t ]+(L?\"(.*?(\"\")*)*?\")/);\n\t\t\tif (match) {\n\t\t\t\tid_str = `${dialog_id}:${match[1]}`;\n\t\t\t\t// hint = `${dialog_id} ${match[1]}`;\n\t\t\t\torig_str = match[2];\n\t\t\t}\n\n\t\t\t// MENU and DIALOGEX BEGIN...END block contents\n\t\t} else if ((menu || dialog) && block_level) {\n\t\t\tconst match = line.match(/^[\\t ]*(\\w+)[\\t ]+(L?\"([^\"]*?(\"\")*)*?\")(,[\\t ]*(\\w+)){0,1}/);\n\t\t\tif (match) {\n\t\t\t\tid_str = match[6];\n\t\t\t\t// hint = match[6] ? `${match[1]} ${match[6]}` : match[1];\n\t\t\t\torig_str = match[2];\n\t\t\t}\n\n\t\t\t// STRINGTABLE BEGIN...END block contents\n\t\t\t// } else if (stringtable && block_level) {\n\t\t\t// actually just do any time, find any strings\n\t\t} {\n\t\t\t// let match = line.match(/^[\\t ]*(\\w+)[\\t ]+(L?\"([^\"]*?(\"\")*)*?\")/);\n\t\t\tlet match = line.match(/(L?\"(.*)\")/);\n\t\t\tif (match) { // test for one-line string definitions\n\t\t\t\t// id_str = match[1];\n\t\t\t\t// hint = match[1];\n\t\t\t\t// orig_str = match[2];\n\t\t\t\torig_str = match[0];\n\t\t\t} else {\n\t\t\t\t// test for the first line (id) of the two-line string definitions\n\t\t\t\tmatch = line.match(/^[\\t ]*(\\w+)[\\t ]*(\\/\\/.*)*$/);\n\t\t\t\tif (match) {\n\t\t\t\t\tid_str = match[1];\n\t\t\t\t} else {\n\t\t\t\t\tmatch = line.match(/^[\\t ]*(L?\"(.*)\")/);\n\t\t\t\t\tif (id_str && match) { // test for the second line (string) of the two-line string definitions\n\t\t\t\t\t\t// hint = id_str;\n\t\t\t\t\t\torig_str = match[1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tid_str = undefined;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (orig_str) {\n\t\t\tlet str = orig_str;\n\n\t\t\tlet wide = str.match(/^L/);\n\t\t\tstr = str.replace(/^L?\"(.*)\"$/g, \"$1\");\n\t\t\tstr = str.replace(/\\\\r/g, \"\\r\");\n\t\t\tstr = str.replace(/\\\\n/g, \"\\n\");\n\t\t\tstr = str.replace(/\\\\t/g, \"\\t\");\n\t\t\tstr = str.replace(/\\\\\"/g, '\"');\n\t\t\tif (wide) {\n\t\t\t\tstr = str.replace(/\\\\x([0-9a-fA-F]{4})/g, (_, hex) => String.fromCodePoint(parseInt(hex, 16)));\n\t\t\t}\n\n\t\t\tstrings.push(str);\n\n\t\t\tid_str = undefined;\n\t\t\t// hint = undefined;\n\t\t\torig_str = undefined;\n\t\t}\n\t}\n\n\treturn strings;\n};\n"
  },
  {
    "path": "localization/pl/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"pl\", {\n\t\"Attributes\": \"Atrybuty\",\n\t\"&Width:\": \"&Szerokość:\",\n\t\"Width:\": \"Szerokość:\",\n\t\"&Height:\": \"W&ysokość:\",\n\t\"Height:\": \"Wysokość:\",\n\t\"Units\": \"Jednostki\",\n\t\"&Inches\": \"Cal&e\",\n\t\"Inches\": \"Cale\",\n\t\"&Pixels\": \"Pi&ksele\",\n\t\"Pixels\": \"Piksele\",\n\t\"Colors\": \"Kolory\",\n\t\"&Black and white\": \"&Czarno-biały\",\n\t\"Black and white\": \"Czarno-biały\",\n\t\"Co&lors\": \"K&olorowy\",\n\t\"Transparency\": \"Przezroczystość\",\n\t\"Use &Transparent background color\": \"Używaj &przezroczystego tła\",\n\t\"Use Transparent background color\": \"Używaj przezroczystego tła\",\n\t\"Select &Color\": \"&Wybierz kolor\",\n\t\"Select Color\": \"Wybierz kolor\",\n\t\"Cancel\": \"Anuluj\",\n\t\"&Default\": \"&Domyślne\",\n\t\"Default\": \"Domyślne\",\n\t\"Custom Zoom\": \"Powiększenie niestandardowe\",\n\t\"Current zoom:\": \"Bieżące powiększenie:\",\n\t\"Zoom to\": \"Powiększenie\",\n\t\"Flip and Rotate\": \"Przerzuć/obróć\",\n\t\"Flip or rotate\": \"Przerzuć lub obróć\",\n\t\"&Flip horizontal\": \"&Przerzuć w poziomie\",\n\t\"Flip horizontal\": \"Przerzuć w poziomie\",\n\t\"Flip &vertical\": \"Przerzuć w pio&nie\",\n\t\"Flip vertical\": \"Przerzuć w pionie\",\n\t\"&Rotate by angle\": \"&Obróć o kąt\",\n\t\"Rotate by angle\": \"Obróć o kąt\",\n\t\"Stretch and Skew\": \"Rozciągnij/pochyl\",\n\t\"Stretch\": \"Rozciągnij\",\n\t\"&Horizontal:\": \"W p&oziomie:\",\n\t\"Horizontal:\": \"W poziomie:\",\n\t\"&Vertical:\": \"W pio&nie:\",\n\t\"Vertical:\": \"W pionie:\",\n\t\"Skew\": \"Pochyl\",\n\t\"H&orizontal:\": \"W &poziomie:\",\n\t\"Degrees\": \"stopni\",\n\t\"V&ertical:\": \"&W pionie:\",\n\t\"Color Table\": \"Tabela kolorów\",\n\t\"New\": \"Nowy\",\n\t\"&New \": \"&Nowy\",\n\t\"New \": \"Nowy\",\n\t\"&Help\": \"Pomo&c\",\n\t\"Help\": \"Pomoc\",\n\t\"Printing\": \"Trwa drukowanie\",\n\t\"on the\": \"na\",\n\t\"&Print\": \"&Drukuj\",\n\t\"Print\": \"Drukuj\",\n\t\"&Next Page\": \"&Następna strona\",\n\t\"Next Page\": \"Następna strona\",\n\t\"Pre&v Page\": \"&Poprzednia strona\",\n\t\"Prev Page\": \"Poprzednia strona\",\n\t\"Zoom &In\": \"Po&większ\",\n\t\"Zoom In\": \"Powiększ\",\n\t\"Zoom &Out\": \"Po&mniejsz\",\n\t\"Zoom Out\": \"Pomniejsz\",\n\t\"&Close\": \"&Zamknij\",\n\t\"Close\": \"Zamknij\",\n\t\"Grid Settings\": \"Ustawienia siatki\",\n\t\"&Pixel Grid\": \"&Siatka pikseli\",\n\t\"Pixel Grid\": \"Siatka pikseli\",\n\t\"&Tile Grid\": \"Si&atka sąsiadująca\",\n\t\"Tile Grid\": \"Siatka sąsiadująca\",\n\t\"pixels\": \"pikseli\",\n\t\"H&eight:\": \"&Wysokość:\",\n\t\"Text\": \"Tekst\",\n\t\"Undo\": \"Cofnij\",\n\t\"Cut\": \"Wytnij\",\n\t\"Copy\": \"Kopiuj\",\n\t\"Paste\": \"Wklej\",\n\t\"Clear Selection\": \"Wyczyść zaznaczenie\",\n\t\"Select All\": \"Zaznacz wszystko\",\n\t\"Text Toolbar\": \"Pasek narzędzi tekstowych\",\n\t\"Selection\": \"Zaznaczenie\",\n\t\"Cu&t\": \"&Wytnij\",\n\t\"&Copy\": \"&Kopiuj\",\n\t\"&Paste\": \"Wkl&ej\",\n\t\"C&lear Selection\": \"Wyczyść z&aznaczenie\",\n\t\"Select &All\": \"Zaz&nacz wszystko\",\n\t\"C&opy To\": \"Kopiuj &do\",\n\t\"Copy To\": \"Kopiuj do\",\n\t\"Paste &From\": \"Wklej &z\",\n\t\"Paste From\": \"Wklej z\",\n\t\"Flip/&Rotate\": \"&Przerzuć/Obróć\",\n\t\"Flip/Rotate\": \"Przerzuć/Obróć\",\n\t\"&Stretch/Skew\": \"Roz&ciągnij/Pochyl\",\n\t\"Stretch/Skew\": \"Rozciągnij/Pochyl\",\n\t\"&Invert Colors\": \"&Odwróć kolory\",\n\t\"Invert Colors\": \"Odwróć kolory\",\n\t\"Thumbnail\": \"Miniatura\",\n\t\"&File\": \"&Plik\",\n\t\"File\": \"Plik\",\n\t\"&New\": \"&Nowy\",\n\t\"&Open\": \"&Otwórz\",\n\t\"Open\": \"Otwórz\",\n\t\"Ctrl+O\": \"Ctrl+0\",\n\t\"&Save\": \"&Zapisz\",\n\t\"Save\": \"Zapisz\",\n\t\"Save &As\": \"Z&apisz jako\",\n\t\"Save As\": \"Zapisz jako\",\n\t\"Print Pre&view\": \"&Podgląd wydruku\",\n\t\"Print Preview\": \"Podgląd wydruku\",\n\t\"Page Se&tup\": \"&Ustawienia strony\",\n\t\"Page Setup\": \"Ustawienia strony\",\n\t\"S&end\": \"&Wyślij\",\n\t\"Send\": \"Wyślij\",\n\t\"Set As &Wallpaper (Tiled)\": \"Ustaw jako &tapetę (sąsiadująco)\",\n\t\"Set As Wallpaper (Tiled)\": \"Ustaw jako tapetę (sąsiadująco)\",\n\t\"Set As Wa&llpaper (Centered)\": \"U&staw jako tapetę (wyśrodkowaną)\",\n\t\"Set As Wallpaper (Centered)\": \"Ustaw jako tapetę (wyśrodkowaną)\",\n\t\"Recent File\": \"Niedawno używany plik\",\n\t\"E&xit\": \"Za&kończ\",\n\t\"Exit\": \"Zakończ\",\n\t\"&Edit\": \"&Edycja\",\n\t\"Edit\": \"Edycja\",\n\t\"&Undo\": \"&Cofnij\",\n\t\"&Repeat\": \"&Powtórz\",\n\t\"Repeat\": \"Powtórz\",\n\t\"&View\": \"&Widok\",\n\t\"View\": \"Widok\",\n\t\"&Tool Box\": \"&Przybornik\",\n\t\"Tool Box\": \"Przybornik\",\n\t\"&Color Box\": \"Pole &koloru\",\n\t\"Color Box\": \"Pole koloru\",\n\t\"Ctrl+L\": \"Ctrl+A\",\n\t\"&Status Bar\": \"Pa&sek stanu\",\n\t\"Status Bar\": \"Pasek stanu\",\n\t\"T&ext Toolbar\": \"Pasek &narzędzi tekstowych\",\n\t\"&Zoom\": \"P&owiększenie\",\n\t\"Zoom\": \"Powiększenie\",\n\t\"&Normal Size\": \"&Normalny rozmiar\",\n\t\"Normal Size\": \"Normalny rozmiar\",\n\t\"&Large Size\": \"&Duży rozmiar\",\n\t\"Large Size\": \"Duży rozmiar\",\n\t\"C&ustom\": \"&Inny\",\n\t\"Custom\": \"Inny\",\n\t\"Show &Grid\": \"Pokaż &siatkę\",\n\t\"Show Grid\": \"Pokaż siatkę\",\n\t\"Show T&humbnail\": \"Pokaż &miniaturę\",\n\t\"Show Thumbnail\": \"Pokaż miniaturę\",\n\t\"&View Bitmap\": \"Pokaż &mapę bitową\",\n\t\"View Bitmap\": \"Pokaż mapę bitową\",\n\t\"&Image\": \"O&braz\",\n\t\"Image\": \"Obraz\",\n\t\"&Flip/Rotate\": \"&Przerzuć/Obróć\",\n\t\"&Attributes\": \"&Atrybuty\",\n\t\"&Clear Image\": \"&Wyczyść obraz\",\n\t\"Clear Image\": \"Wyczyść obraz\",\n\t\"&Draw Opaque\": \"Ry&suj nieprzezroczyste\",\n\t\"Draw Opaque\": \"Rysuj nieprzezroczyste\",\n\t\"&Colors\": \"K&olory\",\n\t\"&Edit Colors\": \"&Edytuj kolory\",\n\t\"Edit Colors\": \"Edytuj kolory\",\n\t\"&Help Topics\": \"&Tematy Pomocy\",\n\t\"Help Topics\": \"Tematy Pomocy\",\n\t\"&About Paint\": \"Paint — i&nformacje\",\n\t\"About Paint\": \"Paint — informacje\",\n\t\"&Update\": \"&Aktualizuj\",\n\t\"Update\": \"Aktualizuj\",\n\t\"Save Copy &As\": \"Z&apisz kopię jako\",\n\t\"Save Copy As\": \"Zapisz kopię jako\",\n\t\"untitled\": \"bez nazwy\",\n\t\"Bitmap Image\": \"Mapa bitowa\",\n\t\"Bitmap Files (*.bmp)\": \"Pliki map bitowych (*.bmp)\",\n\t\"Paint.Picture\": \"Pbraz Paint.\",\n\t\"PCX Files\": \"Pliki PCX\",\n\t\"Icon Files\": \"Pliki ikon\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"Monochromatyczna mapa bitowa (*.bmp;*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"Mapa bitowa 16 kolorowa  (*.bmp;*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"Mapa bitowa 256 kolorowa (*.bmp;*.dib)\",\n\t\"Paint cannot open this file.\": \"Nie można otworzyć tego pliku w programie Paint. \",\n\t\"Paint cannot read this file.\": \"Program Paint nie może odczytać tego pliku.\",\n\t\"This file is read-only.\": \"Ten plik jest tylko do odczytu.\",\n\t\"To save your changes, use a different filename.\": \"Aby zapisać zmiany, użyj innej nazwy pliku.\",\n\t\"This file is already open.\": \"Ten plik jest już otwarty.\",\n\t\"This is not a valid .PCS file.\": \"To nie jest poprawny plik .PCS.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"Ten plik jest otwarty do edycji i nie można go zastąpić.\",\n\t\"Use a different filename to save your changes.\": \"Użyj innej nazwy pliku do zapisania zmian.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"To nie jest poprawny plik mapy bitowej.\",\n\t\"This is not a valid icon.\": \"To nie jest poprawna ikona.\",\n\t\"This is not a valid cursor.\": \"To nie jest poprawny kursor.\",\n\t\"Save was interrupted, so your file has not been saved.\": \"Proces zapisywania został przerwany, więc plik nie został zapisany.\",\n\t\"You cannot save to a read-only file.\": \"Nie można zapisać pliku tylko do odczytu\",\n\t\"Use a different file name.\": \"Użyj innej nazwy pliku.\",\n\t\"This file is already in use.\": \"Ten plik jest już używany.\",\n\t\"Close the program, and then try again.\": \"Zamknij program i ponów próbę.\",\n\t\"Paint cannot save this file.\": \"Zapisanie tego pliku jest niemożliwe.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"Nie można zapisać pliku z tą samą nazwą lecz innego typu\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"Odstęp linii siatki musi być liczbą całkowitą pomiędzy %d i %d.\",\n\t\"There is not enough memory or resources to complete operation.\": \"Za mało pamięci lub zasobów do zakończenia operacji.\",\n\t\"Close some programs, and then try again.\": \"Zamknij kilka programów i spróbuj ponownie.\",\n\t\"Low on memory or resources.\": \"Za mało pamięci lub zasobów. Zamknij niektóre programy i spróbuj ponownie.\",\n\t\"Group error.\": \"Błąd grupowy.\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"Program Paint nie mógł wydrukować dokumentu. Upewnij się czy ilość wolnej przestrzeni na dysku jest wystarczająca oraz czy drukarka działa poprawnie.\",\n\t\"Saving into this format may cause some loss of color information.\": \"Zachowanie w tym formacie może spowodować, że pewne informacje o kolorach mogą zostać utracone.\",\n\t\"Do you want to continue?\": \"Czy chcesz kontynuować?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"Konwersja na format czarno-biały nie może zostać cofnięta. Akcja ta może spowodować zmiany w aktualnym pliku lub utratę informacji o kolorach.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"Bok map bitowych musi mieć co najmniej jeden piksel.\",\n\t\"Generic error.\": \"Błąd ogólny.\",\n\t\"File not found.\": \"Nie odnaleziono pliku.\",\n\t\"Bad path.\": \"Błędna ścieżka.\",\n\t\"Too many open files.\": \"Za dużo otwartych plików.\",\n\t\"Access denied.\": \"Dostęp zabroniony.\",\n\t\"Invalid file.\": \"Nieprawidłowy plik.\",\n\t\"Remove current folder.\": \"Usuń bieżący folder.\",\n\t\"Folder full.\": \"Folder jest pełny.\",\n\t\"Bad seek.\": \"Błędne poszukiwanie.\",\n\t\"Hard IO error.\": \"Błąd sprzętowy We-Wy.\",\n\t\"Sharing violation.\": \"Naruszenie zasad współużytkowania.\",\n\t\"Lock violation.\": \"Naruszenie blokady.\",\n\t\"Disk full.\": \"Dysk jest pełny.\",\n\t\"End of file.\": \"Koniec pliku.\",\n\t\"Error getting the Clipboard Data!\": \"Błąd uzyskania danych ze Schowka!\",\n\t\"No Printer Found @ page setup\": \"Nie znaleziono drukarki @ układ strony\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"Mapa bitowa 24 bitowa (*.bmp;*.dib)\",\n\t\"All Files\": \"Wszystkie pliki\",\n\t\"Palette|*.pal|\": \"Paleta|*.pal|\",\n\t\"untitled.pal\": \"bez nazwy.pal\",\n\t\"OLE 2.0 was unable to start.\": \"Nie można był uruchomić łączenia i osadzania obiektów (OLE).\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"Należy się upewnić, czy jest używana prawidłowa wersja bibliotek OLE.\",\n\t\"Resets the text be without any attributes.\": \"Przywraca tekst bez żadnych atrybutów.\",\n\t\"Sets or clears the text bold attribute.\": \"Ustawia lub czyści atrybut tekstu pogrubionego.\",\n\t\"Sets or clears the text italic attribute.\": \"Ustawia lub czyści atrybut tekstu pisanego kursywą.\",\n\t\"Selects the font used by the text.\": \"Zaznacza czcionki używane w tekście.\",\n\t\"Selects the point size of the text.\": \"Zaznacz rozmiar punktowy tekstu.\",\n\t\"Sets or clears the text underline attribute.\": \"Ustawia lub czyści atrybut tekstu podkreślonego.\",\n\t\"Shows or hides the tooltips.\": \"Pokazuje lub ukrywa  etykietki.\",\n\t\"Show Paint Help.\": \"Pokaż Pomoc programu Paint.\",\n\t\"Sends a picture by using mail or fax.\": \"Wysyła obraz za pomocą poczty lub faksu.\",\n\t\"Copies the selection to a file.\": \"Kopiuje zaznaczenie do pliku.\",\n\t\"Pastes a file into the selection.\": \"Wkleja plik do zaznaczenia.\",\n\t\"Zooms the picture to 100%.\": \"Powiększa obraz do 100%.\",\n\t\"Zooms the picture to 400%.\": \"Powiększa obraz do 400%.\",\n\t\"Zooms the picture.\": \"Powiększa obraz.\",\n\t\"Displays the entire picture.\": \"Wyświetla cały obraz.\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"Pokazuje lub ukrywa podgląd obrazu.\",\n\t\"Shows or hides the grid.\": \"Pokazuje lub ukrywa siatkę.\",\n\t\"Shows or hides the text toolbar.\": \"Pokazuje lub ukrywa tekstowy pasek narzędzi.\",\n\t\"Flips or rotates the picture or a selection.\": \"Przerzuca/obraca obraz lub zaznaczenie.\",\n\t\"Stretches or skews the picture or a selection.\": \"Rozciąga/pochyla obraz lub zaznaczenie.\",\n\t\"Inverts the colors of the picture or a selection.\": \"Odwraca kolory obrazu lub zaznaczenia.\",\n\t\"Changes the attributes of the picture.\": \"Zmienia atrybuty obrazu.\",\n\t\"Clears the picture or selection.\": \"Czyści obraz lub zaznaczenie.\",\n\t\"The font size must be a numeric value.\": \"Rozmiar czcionki musi być wartością liczbową.\",\n\t\"Contains commands for working with the selected item(s).\": \"Zawiera polecenia służące do pracy z wybranym elementem(elementami).\",\n\t\"Contains commands for selecting and transferring items.\": \"Zawiera polecenia służące do wybierania i przenoszenia elementów.\",\n\t\"Contains commands for customizing this window.\": \"Zawiera polecenia służące do dostosowania tego okna.\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"Zawiera polecenia służące do manipulacji rysunkami i ustawiania atrybutów.\",\n\t\"Contains commands for using custom colors and drawing options.\": \"Zawiera polecenia służące do używania niestandardowych kolorów i opcji rysowania.\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"Zawiera polecenia służące do wyświetlania Pomocy i informacji o programie Paint.\",\n\t\"Cannot save file.\": \"Nie można zapisać pliku jest .\",\n\t\"Error removing temporary file.\": \"Błąd usuwania pliku tymczasowego.\",\n\t\"Get Colors\": \"Pobierz kolory\",\n\t\"Save Colors\": \"Zapisz kolory\",\n\t\"File last saved:\": \"Ostatnie zapisanie pliku:\",\n\t\"Not Available\": \"Niedostępne\",\n\t\"Size on disk:\": \"Rozmiar na dysku:\",\n\t\"%s bytes\": \"%s bajtów\",\n\t\"Painting\": \"Malowanie\",\n\t\"Fonts\": \"Czcionki\",\n\t\"Tools\": \"Narzędzia\",\n\t\"All Picture Files\": \"Wszystkie pliki rysunków\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"Aby uzyskać Pomoc, kliknij polecenie Tematy Pomocy w menu Pomoc.\",\n\t\"Select an area on which to get Help.\": \"Wybierz obszar, na temat którego chcesz uzyskać Pomoc.\",\n\t\"%1 in %2\": \"%1 w %2\",\n\t\"Creates a new document.\": \"Tworzy nowy dokument.\",\n\t\"Opens an existing document.\": \"Otwiera istniejący dokument.\",\n\t\"Closes the active document.\": \"Zamyka aktywny dokument.\",\n\t\"Saves the active document.\": \"Zapisuje aktywny dokument.\",\n\t\"Saves the active document with a new name.\": \"Zapisuje aktywny dokument pod nową nazwą.\",\n\t\"Changes the page layout.\": \"Zmienia układ strony.\",\n\t\"Specifies the default printer setup.\": \"Określa ustawienie drukarki domyślnej.\",\n\t\"Prints the active document and sets printing options.\": \"Drukuje aktywny dokument i ustawia opcje wydruku.\",\n\t\"Displays full pages.\": \"Wyświetla całe strony.\",\n\t\"Opens this document.\": \"Otwiera ten dokument.\",\n\t\"Deletes the selection.\": \"Kasuje zaznaczenie.\",\n\t\"Erases everything.\": \"Kasuje wszystko.\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"Kopiuje zaznaczenie i umieszcza je w Schowku.\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"Wycina zaznaczenie i wstawia je do Schowka.\",\n\t\"Finds the specified text.\": \"Znajduje określony tekst.\",\n\t\"Inserts the contents of the Clipboard.\": \"Wstawia zawartość Schowka.\",\n\t\"Repeats the last action.\": \"Powtarza ostatnią czynność.\",\n\t\"Replaces specific text with different text.\": \"Zamienia określony tekst na inny tekst.\",\n\t\"Selects everything.\": \"Zaznacza wszystko.\",\n\t\"Undoes the last action.\": \"Cofa ostatnią czynność.\",\n\t\"Redoes the previously undone action.\": \"Przywraca cofniętą uprzednio czynność.\",\n\t\"Displays program information, version number, and copyright.\": \"Wyświetla informacje o programie, numerze wersji i prawach autorskich.\",\n\t\"Quits Paint.\": \"Kończy działanie programu Paint.\",\n\t\"Opens Paint Help.\": \"Otwiera Pomoc programu Paint.\",\n\t\"Displays instructions about how to use Help.\": \"Wyświetla wskazówki na temat korzystania z Pomocy.\",\n\t\"Displays Help for areas you click on.\": \"Wyświetla Pomoc na temat klikniętych obszarów.\",\n\t\"Displays Help for the current task or command.\": \"Wyświetla Pomoc na temat bieżącego zadania lub polecenia.\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"Wyśrodkowuje tę mapę bitową jako tapetę pulpitu.\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"Ustawia sąsiadująco tę mapę bitową jako tapetę pulpitu.\",\n\t\"Sends the selection using mail or fax.\": \"Wysyła zaznaczenie za pomocą poczty lub faksu.\",\n\t\"Prints the selection.\": \"Drukuje zaznaczenie.\",\n\t\"Shows or hides the thumbnail.\": \"Pokazuje lub ukrywa podgląd.\",\n\t\"Shows Paint Help.\": \"Pokazuje Pomoc programu Paint.\",\n\t\"Shows or hides the status bar.\": \"Pokazuje lub ukrywa pasek stanu.\",\n\t\"Shows or hides the tool box.\": \"Pokazuje lub ukrywa przybornik.\",\n\t\"Shows or hides the color box.\": \"Pokazuje lub ukrywa pole koloru.\",\n\t\"Only a Far East font can be used for vertical editing.\": \"Tylko czcionka Far East może być użyta do edycji pionowej.\",\n\t\"Changes the window size.\": \"Zmienia rozmiar okna.\",\n\t\"Changes the window position.\": \"Zmienia położenie okna.\",\n\t\"Reduces the window to an icon.\": \"Zmniejsza okno do ikony.\",\n\t\"Enlarges the window to full size.\": \"Powiększa okno do pełnego rozmiaru.\",\n\t\"Switches to the next document window.\": \"Przełącza do następnego okna dokumentu.\",\n\t\"Switches to the previous document window.\": \"Przełącza do poprzedniego okna dokumentu.\",\n\t\"Closes the active window and asks if you want to save changes.\": \"Zamyka aktywne okno i pyta, czy chcesz zapisać zmiany.\",\n\t\"Restores the window to normal size.\": \"Przywraca normalny rozmiar okna.\",\n\t\"Activates the task list.\": \"Uaktywnia listę zadań.\",\n\t\"All Files (*.*)\": \"Wszystkie pliki (*.*)\",\n\t\"Untitled\": \"Bez tytułu\",\n\t\"an unnamed file\": \"plik bez nazwy\",\n\t\"&Hide\": \"&Ukryj\",\n\t\"Hide\": \"Ukryj\",\n\t\"No error message is available.\": \"Komunikat o błędzie nie jest dostępny.\",\n\t\"An unsupported operation was attempted.\": \"Dokonano próby wykonania nieobsługiwanej operacji.\",\n\t\"A required resource was unavailable.\": \"Wymagane zasoby nie były dostępne.\",\n\t\"Out of memory.\": \"Za mało pamięci.\",\n\t\"An unknown error has occurred.\": \"Wystąpił nieznany błąd.\",\n\t\"on %1\": \"na %1\",\n\t\"&One Page\": \"&Jedna strona\",\n\t\"One Page\": \"Jedna strona\",\n\t\"&Two Page\": \"&Dwie strony\",\n\t\"Two Page\": \"Dwie strony\",\n\t\"Page %u\": \"Strona %u\",\n\t\"Pages %u-%u\": \"Strony %u-%u\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"Pliki drukarki (*.prn)|*.prn|Wszystkie Pliki (*.*)|*.*||\",\n\t\"Print to File\": \"Drukuj do pliku\",\n\t\"to %1\": \"do %1\",\n\t\"&Update %1\": \"&Aktualizuj %1\",\n\t\"Update %1\": \"Aktualizuj %1\",\n\t\"E&xit && Return to %1\": \"Wy&jście && Powrót do %1\",\n\t\"Exit & Return to %1\": \"Wyjście & Powrót do %1\",\n\t\"Linked %s\": \"Łączony %s\",\n\t\"Unknown Type\": \"Nieznany typ\",\n\t\"Invalid filename.\": \"Niewłaściwa nazwa pliku.\",\n\t\"Failed to open document.\": \"Nie można otworzyć dokumentu.\",\n\t\"Failed to save document.\": \"Nie można zapisać dokumentu.\",\n\t\"Save changes to %1?\": \"Zapisać zmiany w %1?\",\n\t\"Failed to create empty document.\": \"Nie można utworzyć pustego dokumentu.\",\n\t\"The file is too large to open.\": \"Ten plik jest zbyt duży, aby go otworzyć.\",\n\t\"Could not start print job.\": \"Nie można rozpocząć zadania drukowania.\",\n\t\"Failed to launch help.\": \"Uruchomienie Pomocy nie powiodło się.\",\n\t\"Internal application error.\": \"Wewnętrzny błąd aplikacji.\",\n\t\"Command failed.\": \"Nie można wykonać polecenia.\",\n\t\"Insufficient memory to perform operation.\": \"Niewystarczająca ilość pamięci, aby wykonać operację.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"Wpisy rejestru systemowego  i plik INI (jeżeli istniał) zostały usunięte.\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"Nie wszystkie wpisy rejestru (lub pliku INI) zostały usunięte.\",\n\t\"This program requires the file %s, which was not found on this system.\": \"Nie znaleziony został plik %s, którego wymaga ten program..\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"Ten program jest podłączony do utraconego wyjścia %s w pliku %s. Komputer może posiadać niezgodną wersję %s.\",\n\t\"Please enter an integer.\": \"Wprowadź liczbę całkowitą.\",\n\t\"Please enter a number.\": \"Wprowadź liczbę.\",\n\t\"Please enter an integer between %1 and %2.\": \"Wprowadź całkowitą liczbę dodatnią z przedziału od %1 do %2.\",\n\t\"Please enter a number between %1 and %2.\": \"Wprowadź liczbę z przedziału od %1 do %2.\",\n\t\"Please enter no more than %1 characters.\": \"Wprowadź nie więcej znaków niż %1.\",\n\t\"Please select a button.\": \"Wybierz przycisk.\",\n\t\"Please enter an integer between 0 and 255.\": \"Wprowadź liczbę całkowitą z zakresu od 0 do 255.\",\n\t\"Please enter a positive integer.\": \"Wprowadź liczbę dodatnią.\",\n\t\"Please enter a date and/or time.\": \"Podaj datę i godzinę.\",\n\t\"Please enter a currency.\": \"Podaj walutę.\",\n\t\"Unexpected file format.\": \"Nieoczekiwany format pliku.\",\n\t\"Cannot find this file.\": \"Nie można odnaleźć pliku.\",\n\t\"Please verify that the correct path and file name are given.\": \"Upewnij się, czy podano  poprawną ścieżkę i nazwę pliku.\",\n\t\"Destination disk drive is full.\": \"Dysk docelowy jest pełny.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"Nie można odczytać z %1, jest on otwarty przez inną osobę.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"Nie można zapisać do %1, jest on tylko do odczytu lub jest otwarty przez inną osobę.\",\n\t\"An unexpected error occurred while reading %1.\": \"Wystąpił nieoczekiwany błąd podczas odczytu %1.\",\n\t\"An unexpected error occurred while writing %1.\": \"Wystąpił nieoczekiwany błąd podczas zapisu %1.\",\n\t\"Unable to register document.\": \"Nie można zarejestrować dokumentu.\",\n\t\"The document may already be open.\": \"Być może ten dokument jest już otwarty.\",\n\t\"Update %1 before proceeding?\": \"Czy aktualizować %1 przed wykonaniem polecenia?\",\n\t\"Could not update client.\": \"Nie można aktualizować danych klienta.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"Nie można zarejestrować. ActiveX może działać niesprawnie.\",\n\t\"Failed to update the system registry.\": \"Aktualizacja rejestru systemowego nie powiodła się.\",\n\t\"Please try using REGEDIT.\": \"Spróbuj użyć programu REGEDIT.\",\n\t\"Unable to read write-only property.\": \"Odczyt nie jest możliwy — właściwość tylko do zapisu.\",\n\t\"Unable to write read-only property.\": \"Nie można zapisać — właściwość tylko do odczytu.\",\n\t\"Unable to load mail system support.\": \"Nie można załadować obsługi systemu poczty.\",\n\t\"Mail system DLL is invalid.\": \"Biblioteka DLL systemu poczty jest nieprawidłowa.\",\n\t\"Send Mail failed to send message.\": \"Nie można wysłać wiadomości.\",\n\t\"No error occurred.\": \"Nie wystąpił żaden błąd.\",\n\t\"An unknown error occurred while accessing %1.\": \"Wystąpił nieznany błąd podczas dostępu do %1.\",\n\t\"%1 was not found.\": \"Nie znaleziono %1.\",\n\t\"%1 contains an invalid path.\": \"%1 zawiera nieprawidłową ścieżkę.\",\n\t\"%1 could not be opened because there are too many open files.\": \"%1 nie może być otwarty, ponieważ zbyt wiele plików jest otwartych.\",\n\t\"Access to %1 was denied.\": \"Brak dostępu do %1.\",\n\t\"An invalid file handle was associated with %1.\": \"Nieprawidłowe dojście było skojarzone z %1.\",\n\t\"%1 could not be removed because it is the current directory.\": \"%1 nie mógł być usunięty, ponieważ jest to bieżący katalog.\",\n\t\"%1 could not be created because the directory is full.\": \"%1 nie mógł być utworzony, ponieważ katalog jest pełny.\",\n\t\"Seek failed on %1\": \"Wyszukanie na %1 nie udało się.\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"Zgłoszony został błąd sprzętowy we-wy podczas dostępu do %1.\",\n\t\"A sharing violation occurred while accessing %1.\": \"Nastąpiło naruszenie zasad współużytkowania podczas dostępu do %1.\",\n\t\"A locking violation occurred while accessing %1.\": \"Nastąpiło naruszenie blokady podczas dostępu do %1.\",\n\t\"Disk full while accessing %1.\": \"Dysk zapełniony podczas dostępu do %1.\",\n\t\"An attempt was made to access %1 past its end.\": \"Dokonano próby dostępu do %1 poza jego końcem.\",\n\t\"An attempt was made to write to the reading %1.\": \"Dokonano próby zapisu przy odczycie %1.\",\n\t\"An attempt was made to read from the writing %1.\": \"Dokonano próby odczytu przy zapisywaniu %1.\",\n\t\"%1 has a bad format.\": \"%1 ma zły format.\",\n\t\"%1 contained an unexpected object.\": \"%1 zawiera nie oczekiwany obiekt.\",\n\t\"%1 contains an incorrect schema.\": \"%1 zawiera nieprawidłowy schemat.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"Zaznacza prostokątną część rysunku do przesunięcia, skopiowania lub edycji.\",\n\t\"Select\": \"Zaznacz\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"Zaznacza część rysunku do przesunięcia, skopiowania lub edycji.\",\n\t\"Free-Form Select\": \"Zaznacz dowolny kształt\",\n\t\"Inserts text into the picture.\": \"Wstawia tekst do rysunku.\",\n\t\"Fills an area with the current drawing color.\": \"Wypełnia obszar bieżącym kolorem rysowania.\",\n\t\"Fill With Color\": \"Wypełnianie kolorem\",\n\t\"Draws a straight line with the selected line width.\": \"Rysuje linię prostą o wybranej grubości.\",\n\t\"Line\": \"Linia\",\n\t\"Draws using an airbrush of the selected size.\": \"Rysuje za pomocą aerografu o wybranym rozmiarze.\",\n\t\"Airbrush\": \"Aerograf\",\n\t\"Draws a curved line with the selected line width.\": \"Rysuje linię krzywą o wybranej grubości.\",\n\t\"Curve\": \"Krzywa\",\n\t\"Draws a polygon with the selected fill style.\": \"Rysuje wielokąt o wybranym stylu wypełnienia.\",\n\t\"Polygon\": \"Wielokąt\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"Rysuje zaokrąglony prostokąt o wybranym stylu wypełnienia.\",\n\t\"Rounded Rectangle\": \"Zaokrąglony prostokąt\",\n\t\"Draws a free-form line one pixel wide.\": \"Rysuje krzywą dowolnego kształtu o szerokości jednego piksela.\",\n\t\"Pencil\": \"Ołówek\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"Wymazuje część rysunku używając gumki o wybranym kształcie.\",\n\t\"Eraser/Color Eraser\": \"Gumka/Gumka kolorowa\",\n\t\"Changes the magnification.\": \"Zmienia powiększenie.\",\n\t\"Magnifier\": \"Lupa\",\n\t\"Picks up a color from the picture for drawing.\": \"Przejmuje kolor z rysunku do rysowania.\",\n\t\"Pick Color\": \"Weź kolor\",\n\t\"Draws using a brush with the selected shape and size.\": \"Rysuje pędzlem o wybranym kształcie i rozmiarze.\",\n\t\"Brush\": \"Pędzel\",\n\t\"Draws a rectangle with the selected fill style.\": \"Rysuje prostokąt o wybranym stylu wypełnienia.\",\n\t\"Rectangle\": \"Prostokąt\",\n\t\"Draws a filled rectangle.\": \"Rysuje wypełniony prostokąt.\",\n\t\"Draws an ellipse with the selected fill style.\": \"Rysuje elipsę o wybranym stylu wypełnienia.\",\n\t\"Ellipse\": \"Elipsa\",\n\t\"Draws a filled ellipse.\": \"Rysuje wypełnioną elipsę.\",\n\t\"Makes the current selection either opaque or transparent.\": \"Powoduje, że bieżące zaznaczenie jest przezroczyste lub nie.\",\n\t\"Creates a new color.\": \"Tworzy nowy kolor.\",\n\t\"Uses a previously saved palette of colors.\": \"Używa zapisanej uprzednio palety kolorów.\",\n\t\"Saves the current palette of colors to a file.\": \"Zapisuje bieżącą paletę kolorów w pliku.\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"Przed wybraniem pliku jako tapety należy go zapisać.\",\n\t\"The selection is now larger than the bitmap.\": \"Zaznaczenie jest teraz większe niż mapa bitowa.\",\n\t\"Would you like the bitmap enlarged?\": \"Czy chcesz powiększyć mapę bitową?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"Obraz w Schowku jest większy niż mapa bitowa.\",\n\t\"The file is not in the correct format.\": \"Plik jest w nieprawidłowym formacie.\",\n\t\"Not enough room to paste text.\": \"Za mało miejsca do wklejenia tekstu.\",\n\t\"Enlarge the text area and try again.\": \"Powiększ obszar tekstu i spróbuj ponownie.\",\n\t\"Places the text.\": \"Umieszcza tekst.\"\n});\n"
  },
  {
    "path": "localization/preprocess.js",
    "content": "// @ts-check\nconst fs = require(\"fs\");\nconst glob = require(\"glob\");\nconst parse_rc_file = require(\"./parse-rc-file\");\nconst { AccessKeys } = require(\"../lib/os-gui/MenuBar.js\");\n\nconst base_lang = \"en\";\nconst available_langs = fs.readdirSync(__dirname).filter((dir) => dir.match(/^\\w+(-\\w+)?$/));\nconst target_langs = available_langs.filter((lang) => lang !== base_lang);\n\nconsole.log(\"Target languages:\", target_langs);\n\nconst remove_ellipsis = (str) => str.replace(\"...\", \"\");\n\nconst only_unique = (value, index, self) => self.indexOf(value) === index;\n\nconst get_strings = (lang) => {\n\tconst rc_files = glob.sync(`${lang}/**/*.rc`, { cwd: __dirname, absolute: true });\n\trc_files.sort((a, b) => a.localeCompare(b, \"en\"));\n\treturn rc_files.map(\n\t\t(rc_file) => parse_rc_file(fs.readFileSync(rc_file, \"utf16le\").replace(/\\ufeff/g, \"\"))\n\t).flat();\n};\n\nconst base_strings = get_strings(base_lang);\nfor (const target_lang of target_langs) {\n\tconst target_strings = get_strings(target_lang);\n\tconst localizations = {};\n\tconst add_localization = (base_string, target_string, fudgedness) => {\n\t\tlocalizations[base_string] = localizations[base_string] || [];\n\t\tlocalizations[base_string].push({ target_string, fudgedness });\n\t};\n\tconst add_localizations = (base_strings, target_strings) => {\n\t\tfor (let i = 0; i < target_strings.length; i++) {\n\t\t\tconst base_string = base_strings[i];\n\t\t\tconst target_string = target_strings[i];\n\t\t\tif (base_string !== target_string && base_string && target_string) {\n\t\t\t\t// Split strings like \"&Attributes...\\tCtrl+E\"\n\t\t\t\t// and \"Fills an area with the current drawing color.\\nFill With Color\"\n\t\t\t\tconst splitter = /\\t|\\r?\\n/;\n\t\t\t\tif (base_string.match(splitter)) {\n\t\t\t\t\tadd_localizations(\n\t\t\t\t\t\tbase_string.split(splitter),\n\t\t\t\t\t\ttarget_string.split(splitter)\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\t// add_localization(base_string, target_string, 0);\n\t\t\t\t\tadd_localization(remove_ellipsis(base_string), remove_ellipsis(target_string), 1);\n\t\t\t\t\tif (AccessKeys.has(base_string)) {\n\t\t\t\t\t\t// add_localization(AccessKeys.remove(base_string), AccessKeys.remove(target_string), 2);\n\t\t\t\t\t\tadd_localization(remove_ellipsis(AccessKeys.remove(base_string)), remove_ellipsis(AccessKeys.remove(target_string)), 3);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\tadd_localizations(base_strings, target_strings);\n\n\tfor (const base_string in localizations) {\n\t\tconst options = localizations[base_string];\n\t\toptions.sort((a, b) => a.fudgedness - b.fudgedness);\n\t\tconst unique_strings = options.map(({ target_string }) => target_string).filter(only_unique);\n\t\tif (unique_strings.length > 1) {\n\t\t\tconsole.warn(`Collision for \"${base_string}\": ${JSON.stringify(unique_strings, null, \"\\t\")}`);\n\t\t}\n\t\tlocalizations[base_string] = unique_strings[0];\n\t}\n\tconst js = `//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"${target_lang}\", ${JSON.stringify(localizations, null, \"\\t\")});\\n`;\n\tfs.writeFileSync(`${__dirname}/${target_lang}/localizations.js`, js);\n}\n\n// Update available_languages list automatically!\n// This feature is likely no longer useful, as I have added all the languages\n// from Windows 98 editions that I could find, and additional languages\n// will not be through preprocessing resource files from Windows 98,\n// but through AI and community translation.\nconst file = require(\"path\").resolve(__dirname + \"/../src/app-localization.js\");\nconst old_code = fs.readFileSync(file, \"utf8\");\nconst available_languages_regex = /(available_languages\\s*=\\s*)\\[[^\\]]*\\]/;\nif (!old_code.match(available_languages_regex)) {\n\tconsole.error(`Failed to find available_languages list in \"${file}\"`);\n\tprocess.exit(1);\n}\nconst new_code = old_code.replace(available_languages_regex, `$1${JSON.stringify(available_langs).replace(/\",\"/g, `\", \"`)}`);\nif (new_code === old_code) {\n\tconsole.log(`No changes needed to available_languages list in \"${file}\"`);\n} else {\n\tfs.writeFileSync(file, new_code, \"utf8\");\n\tconsole.log(`Updated available_languages list in \"${file}\"`);\n}\n"
  },
  {
    "path": "localization/pt/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"pt\", {\n\t\"Attributes\": \"Atributos\",\n\t\"MS Shell Dlg\": \"MS Sans Serif\",\n\t\"&Width:\": \"&Largura:\",\n\t\"Width:\": \"Largura:\",\n\t\"&Height:\": \"&Altura:\",\n\t\"Height:\": \"Altura:\",\n\t\"Units\": \"Unidades\",\n\t\"&Inches\": \"Pol&egadas\",\n\t\"Inches\": \"Polegadas\",\n\t\"C&m\": \"&Cm\",\n\t\"Cm\": \"Cm\",\n\t\"Colors\": \"Cores\",\n\t\"&Black and white\": \"Preto e &branco\",\n\t\"Black and white\": \"Preto e branco\",\n\t\"Co&lors\": \"C&ores\",\n\t\"Transparency\": \"Transparência\",\n\t\"Use &Transparent background color\": \"Utilizar cor de fundo &transparente\",\n\t\"Use Transparent background color\": \"Utilizar cor de fundo transparente\",\n\t\"Select &Color\": \"&Seleccionar cor\",\n\t\"Select Color\": \"Seleccionar cor\",\n\t\"Cancel\": \"Cancelar\",\n\t\"&Default\": \"Pre&definido\",\n\t\"Default\": \"Predefinido\",\n\t\"Custom Zoom\": \"Personalizar zoom\",\n\t\"Current zoom:\": \"Zoom actual:\",\n\t\"Zoom to\": \"Aplicar zoom até\",\n\t\"Flip and Rotate\": \"Inverter e rodar\",\n\t\"Flip or rotate\": \"Inverter ou rodar\",\n\t\"&Flip horizontal\": \"&Inverter na horizontal\",\n\t\"Flip horizontal\": \"Inverter na horizontal\",\n\t\"Flip &vertical\": \"In&verter na vertical\",\n\t\"Flip vertical\": \"Inverter na vertical\",\n\t\"&Rotate by angle\": \"&Rodar por ângulo\",\n\t\"Rotate by angle\": \"Rodar por ângulo\",\n\t\"Stretch and Skew\": \"Esticar e torcer\",\n\t\"Stretch\": \"Esticar\",\n\t\"Skew\": \"Torcer\",\n\t\"Degrees\": \"graus\",\n\t\"Color Table\": \"Tabela de cores\",\n\t\"New\": \"Novo\",\n\t\"&New \": \"&Novo \",\n\t\"New \": \"Novo \",\n\t\"&Help\": \"&Ajuda\",\n\t\"Help\": \"Ajuda\",\n\t\"Printing\": \"A imprimir\",\n\t\"on the\": \"em\",\n\t\"&Print\": \"&Imprimir\",\n\t\"Print\": \"Imprimir\",\n\t\"&Next Page\": \"Página &seg.\",\n\t\"Next Page\": \"Página seg.\",\n\t\"Pre&v Page\": \"Página &ant.\",\n\t\"Prev Page\": \"Página ant.\",\n\t\"Zoom &In\": \"Mais &zoom\",\n\t\"Zoom In\": \"Mais zoom\",\n\t\"Zoom &Out\": \"Men&os zoom\",\n\t\"Zoom Out\": \"Menos zoom\",\n\t\"&Close\": \"Fe&char\",\n\t\"Close\": \"Fechar\",\n\t\"Grid Settings\": \"Definições de grelha\",\n\t\"                  \": \"                                    \",\n\t\"&Pixel Grid\": \"Grelha de &pixels\",\n\t\"Pixel Grid\": \"Grelha de pixels\",\n\t\"&Tile Grid\": \"Grelha de &mosaicos\",\n\t\"Tile Grid\": \"Grelha de mosaicos\",\n\t\"H&eight:\": \"&Altura:\",\n\t\"Undo\": \"Anular\",\n\t\"Cut\": \"Cortar\",\n\t\"Copy\": \"Copiar\",\n\t\"Paste\": \"Colar\",\n\t\"Clear Selection\": \"Limpar selecção\",\n\t\"Select All\": \"Seleccionar tudo\",\n\t\"Text Toolbar\": \"Barra de ferramentas de texto\",\n\t\"Cu&t\": \"Cor&tar\",\n\t\"&Copy\": \"&Copiar\",\n\t\"&Paste\": \"Co&lar\",\n\t\"C&lear Selection\": \"Limpar &selecção\",\n\t\"Select &All\": \"Seleccion&ar tudo\",\n\t\"C&opy To\": \"C&opiar para\",\n\t\"Copy To\": \"Copiar para\",\n\t\"Paste &From\": \"Colar &de\",\n\t\"Paste From\": \"Colar de\",\n\t\"Flip/&Rotate\": \"Inverter/&rodar\",\n\t\"Flip/Rotate\": \"Inverter/rodar\",\n\t\"&Stretch/Skew\": \"&Esticar/torcer\",\n\t\"Stretch/Skew\": \"Esticar/torcer\",\n\t\"&Invert Colors\": \"&Inverter cores\",\n\t\"Invert Colors\": \"Inverter cores\",\n\t\"Thumbnail\": \"Miniatura\",\n\t\"&File\": \"&Ficheiro\",\n\t\"File\": \"Ficheiro\",\n\t\"&New\": \"&Novo\",\n\t\"Ctrl+N\": \"Ctrl+O\",\n\t\"&Open\": \"&Abrir\",\n\t\"Open\": \"Abrir\",\n\t\"Ctrl+O\": \"Ctrl+A\",\n\t\"&Save\": \"&Guardar\",\n\t\"Save\": \"Guardar\",\n\t\"Ctrl+S\": \"Ctrl+G\",\n\t\"Save &As\": \"Guardar &como\",\n\t\"Save As\": \"Guardar como\",\n\t\"Print Pre&view\": \"&Pré-visualizar\",\n\t\"Print Preview\": \"Pré-visualizar\",\n\t\"Page Se&tup\": \"Config&urar página\",\n\t\"Page Setup\": \"Configurar página\",\n\t\"S&end\": \"&Enviar\",\n\t\"Send\": \"Enviar\",\n\t\"Set As &Wallpaper (Tiled)\": \"&Definir como imagem de fundo (mosaico)\",\n\t\"Set As Wallpaper (Tiled)\": \"Definir como imagem de fundo (mosaico)\",\n\t\"Set As Wa&llpaper (Centered)\": \"Definir como &fundo (centrado)\",\n\t\"Set As Wallpaper (Centered)\": \"Definir como fundo (centrado)\",\n\t\"Recent File\": \"Ficheiro recente\",\n\t\"E&xit\": \"&Sair\",\n\t\"Exit\": \"Sair\",\n\t\"&Edit\": \"&Editar\",\n\t\"Edit\": \"Editar\",\n\t\"&Undo\": \"An&ular\",\n\t\"&Repeat\": \"&Repetir\",\n\t\"Repeat\": \"Repetir\",\n\t\"Ctrl+A\": \"Ctrl+T\",\n\t\"&View\": \"&Ver\",\n\t\"View\": \"Ver\",\n\t\"&Tool Box\": \"Caixa de ferramen&tas\",\n\t\"Tool Box\": \"Caixa de ferramentas\",\n\t\"&Color Box\": \"&Caixa de cores\",\n\t\"Color Box\": \"Caixa de cores\",\n\t\"Ctrl+L\": \"Ctrl+A\",\n\t\"&Status Bar\": \"Barra de e&stado\",\n\t\"Status Bar\": \"Barra de estado\",\n\t\"T&ext Toolbar\": \"Barra de f&erramentas de texto\",\n\t\"&Normal Size\": \"&Tamanho normal\",\n\t\"Normal Size\": \"Tamanho normal\",\n\t\"&Large Size\": \"Tamanho &grande\",\n\t\"Large Size\": \"Tamanho grande\",\n\t\"C&ustom\": \"&Personalizar\",\n\t\"Custom\": \"Personalizar\",\n\t\"Show &Grid\": \"&Mostrar grelha\",\n\t\"Show Grid\": \"Mostrar grelha\",\n\t\"Show T&humbnail\": \"Mostrar mi&niatura\",\n\t\"Show Thumbnail\": \"Mostrar miniatura\",\n\t\"&View Bitmap\": \"&Ver mapa de bits\",\n\t\"View Bitmap\": \"Ver mapa de bits\",\n\t\"&Image\": \"&Imagem\",\n\t\"Image\": \"Imagem\",\n\t\"&Flip/Rotate\": \"I&nverter/rodar\",\n\t\"&Attributes\": \"&Atributos\",\n\t\"&Clear Image\": \"&Limpar imagem\",\n\t\"Clear Image\": \"Limpar imagem\",\n\t\"&Draw Opaque\": \"&Desenhar opaco\",\n\t\"Draw Opaque\": \"Desenhar opaco\",\n\t\"&Colors\": \"&Cores\",\n\t\"&Edit Colors\": \"&Editar cores\",\n\t\"Edit Colors\": \"Editar cores\",\n\t\"&Help Topics\": \"&Tópicos da Ajuda\",\n\t\"Help Topics\": \"Tópicos da Ajuda\",\n\t\"&About Paint\": \"&Acerca do Paint\",\n\t\"About Paint\": \"Acerca do Paint\",\n\t\"&Update\": \"Act&ualizar\",\n\t\"Update\": \"Actualizar\",\n\t\"Save Copy &As\": \"Guard&ar cópia como\",\n\t\"Save Copy As\": \"Guardar cópia como\",\n\t\"untitled\": \"Sem título\",\n\t\"Bitmap Image\": \"Imagem de mapa de bits\",\n\t\"Bitmap Files (*.bmp)\": \"Ficheiros de mapa de bits (*.bmp)\",\n\t\"PCX Files\": \"Ficheiros PCX\",\n\t\"Icon Files\": \"Ficheiros de ícones\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"Mapa de bits monocromático (*.bmp;*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"Mapa de bits de 16 cores (*.bmp;*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"Mapa de bits de 256 cores (*.bmp;*.dib)\",\n\t\"Paint cannot open this file.\": \"O Paint não pode abrir este ficheiro.\",\n\t\"Paint cannot read this file.\": \"O Paint não pode ler este ficheiro.\",\n\t\"This file is read-only.\": \"Este ficheiro é só de leitura.\",\n\t\"To save your changes, use a different filename.\": \"Para guardar as alterações, utilize outro nome de ficheiro.\",\n\t\"This file is already open.\": \"Este ficheiro já está aberto.\",\n\t\"This is not a valid .PCS file.\": \"Este não é um ficheiro .PCS válido.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"Este ficheiro está aberto para edição e não pode ser substituído.\",\n\t\"Use a different filename to save your changes.\": \"Utilize outro nome de ficheiro para guardar as alterações.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"Este não é um ficheiro de mapa de bits válido, ou o seu formato não é actualmente suportado.\",\n\t\"This is not a valid icon.\": \"Não é um ícone válido.\",\n\t\"This is not a valid cursor.\": \"Não é um cursor válido.\",\n\t\"Save was interrupted, so your file has not been saved.\": \"A operação de guardar foi interrompida, por isso o seu ficheiro não foi guardado.\",\n\t\"You cannot save to a read-only file.\": \"Não pode guardar num ficheiro só de leitura.\",\n\t\"Use a different file name.\": \"Utilize outro nome de ficheiro.\",\n\t\"This file is already in use.\": \"Este ficheiro já está a ser utilizado.\",\n\t\"Close the program, and then try again.\": \"Feche o programa e tente de novo.\",\n\t\"Paint cannot save this file.\": \"O Paint não pode guardar este ficheiro.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"O Paint não pode guardar num mesmo nome um tipo de ficheiro diferente.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"O espaçamento da grelha tem de ser um número inteiro entre %d e %d.\",\n\t\"There is not enough memory or resources to complete operation.\": \"Não existe memória suficiente ou recursos para concluir a operação.\",\n\t\"Close some programs, and then try again.\": \"Feche alguns programas e tente de novo.\",\n\t\"Low on memory or resources.\": \"Memória ou recursos insuficientes.\",\n\t\"Group error.\": \"Erro do grupo.\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"O paint não conseguiu imprimir o seu documento. Certifique-se de que tem espaço suficiente em disco e que a sua impressora está a funcionar correctamente.\",\n\t\"Saving into this format may cause some loss of color information.\": \"Guardar neste formato pode causar perda de informação sobre a cor.\",\n\t\"Do you want to continue?\": \"Deseja continuar?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"A conversão em preto e branco não pode ser anulada. Esta acção afecta o ficheiro actual e pode causar a perda de informação sobre as cores.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"Os mapas de bits têm de ter mais que um pixel num dos lados.\",\n\t\"Generic error.\": \"Erro genérico.\",\n\t\"File not found.\": \"Ficheiro não encontrado.\",\n\t\"Bad path.\": \"Caminho incorrecto.\",\n\t\"Too many open files.\": \"Existem demasiados ficheiros abertos.\",\n\t\"Access denied.\": \"Acesso negado.\",\n\t\"Invalid file.\": \"Ficheiro inválido.\",\n\t\"Remove current folder.\": \"Remover pasta actual.\",\n\t\"Folder full.\": \"Pasta cheia.\",\n\t\"Bad seek.\": \"Pesquisa incorrecta.\",\n\t\"Hard IO error.\": \"Erro de entrada/saída.\",\n\t\"Sharing violation.\": \"Violação de partilha.\",\n\t\"Lock violation.\": \"Violação de bloqueio.\",\n\t\"Disk full.\": \"Disco cheio.\",\n\t\"End of file.\": \"Fim do ficheiro.\",\n\t\"Error getting the Clipboard Data!\": \"Erro ao obter os dados da Área de Transferência!\",\n\t\"No Printer Found @ page setup\": \"Não foi encontrada nenhuma impressora durante a configuração da página\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"Mapa de bits de 24 bits (*.bmp;*.dib)\",\n\t\"All Files\": \"Todos os ficheiros\",\n\t\"Palette|*.pal|\": \"Paleta|*.pal|\",\n\t\"OLE 2.0 was unable to start.\": \"O OLE 2.0 não foi iniciado.\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"Certifique-se de que está a utilizar a versão correcta das bibliotecas OLE.\",\n\t\"Resets the text be without any attributes.\": \"Repõe o texto sem quaisquer atributos.\",\n\t\"Sets or clears the text bold attribute.\": \"Activa ou desactiva o atributo de negrito no texto.\",\n\t\"Sets or clears the text italic attribute.\": \"Activa ou desactiva o atributo de itálico no texto.\",\n\t\"Selects the font used by the text.\": \"Selecciona o tipo de letra utilizado pelo texto.\",\n\t\"Selects the point size of the text.\": \"Selecciona o tamanho do texto em pontos.\",\n\t\"Sets or clears the text underline attribute.\": \"Define ou limpa o atributo de sublinhado no texto.\",\n\t\"Shows or hides the tooltips.\": \"Mostra ou oculta as descrições.\",\n\t\"Show Paint Help.\": \"Mostrar a ajuda do Paint.\",\n\t\"Sends a picture by using mail or fax.\": \"Envia uma imagem por correio ou fax.\",\n\t\"Copies the selection to a file.\": \"Copia a selecção para um ficheiro.\",\n\t\"Pastes a file into the selection.\": \"Cola um ficheiro na selecção.\",\n\t\"Zooms the picture to 100%.\": \"Mostra a imagem com 100% do seu tamanho original.\",\n\t\"Zooms the picture to 400%.\": \"Mostra a imagem com 400% do seu tamanho original.\",\n\t\"Zooms the picture.\": \"Aplica zoom à imagem.\",\n\t\"Displays the entire picture.\": \"Mostra a imagem completa.\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"Mostra ou oculta a vista da miniatura da imagem.\",\n\t\"Shows or hides the grid.\": \"Mostra ou oculta a grelha.\",\n\t\"Shows or hides the text toolbar.\": \"Mostra ou oculta a barra de ferramentas de texto.\",\n\t\"Flips or rotates the picture or a selection.\": \"Inverte ou roda a imagem ou uma selecção.\",\n\t\"Stretches or skews the picture or a selection.\": \"Estica ou torce a imagem ou uma selecção.\",\n\t\"Inverts the colors of the picture or a selection.\": \"Inverte as cores da imagem ou de uma selecção.\",\n\t\"Changes the attributes of the picture.\": \"Altera os atributos da imagem.\",\n\t\"Clears the picture or selection.\": \"Limpa imagem ou selecção.\",\n\t\"The font size must be a numeric value.\": \"O tamanho do tipo de letra tem de ser um valor numérico.\",\n\t\"Contains commands for working with the selected item(s).\": \"Contém comandos para trabalhar com os itens seleccionados.\",\n\t\"Contains commands for selecting and transferring items.\": \"Contém comandos para seleccionar e transferir itens.\",\n\t\"Contains commands for customizing this window.\": \"Contém comandos para personalizar esta janela.\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"Contém comandos para manipular imagens e definir atributos.\",\n\t\"Contains commands for using custom colors and drawing options.\": \"Contém comandos para utilizar cores personalizadas e opções de desenho.\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"Contém comandos para visualizar a ajuda e as informações sobre o Paint.\",\n\t\"Cannot save file.\": \"Impossível guardar o ficheiro.\",\n\t\"Error removing temporary file.\": \"Erro ao remover o ficheiro temporário.\",\n\t\"Get Colors\": \"Obter cores\",\n\t\"Save Colors\": \"Guardar cores\",\n\t\"File last saved:\": \"Última gravação do ficheiro:\",\n\t\"Not Available\": \"Não disponível\",\n\t\"Size on disk:\": \"Tamanho em disco:\",\n\t\"Painting\": \"A pintar\",\n\t\"Fonts\": \"Tipos de letra\",\n\t\"Tools\": \"Ferramentas\",\n\t\"All Picture Files\": \"Todos os ficheiros de imagens\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"Para obter ajuda, faça clique sobre 'Tópicos da ajuda' no menu 'Ajuda'.\",\n\t\"Select an area on which to get Help.\": \"Seleccione uma área sobre a qual deseja obter ajuda.\",\n\t\"%1 in %2\": \"%1 em %2\",\n\t\"Creates a new document.\": \"Cria um novo documento.\",\n\t\"Opens an existing document.\": \"Abre um documento existente.\",\n\t\"Closes the active document.\": \"Fecha o documento activo.\",\n\t\"Saves the active document.\": \"Guarda o documento activo.\",\n\t\"Saves the active document with a new name.\": \"Guarda com um novo nome o documento activo.\",\n\t\"Changes the page layout.\": \"Altera o esquema da página.\",\n\t\"Specifies the default printer setup.\": \"Especifica a configuração da impressora predefinida.\",\n\t\"Prints the active document and sets printing options.\": \"Imprime o documento activo e define as opções de impressão.\",\n\t\"Displays full pages.\": \"Mostra páginas completas.\",\n\t\"Opens this document.\": \"Abre este documento.\",\n\t\"Deletes the selection.\": \"Elimina a selecção.\",\n\t\"Erases everything.\": \"Apaga tudo.\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"Copia a selecção e coloca-a na Área de Transferência.\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"Corta a selecção e coloca-a na Área de Transferência.\",\n\t\"Finds the specified text.\": \"Localiza o texto especificado.\",\n\t\"Inserts the contents of the Clipboard.\": \"Insere o conteúdo da Área de Transferência.\",\n\t\"Repeats the last action.\": \"Repete a última acção.\",\n\t\"Replaces specific text with different text.\": \"Substitui texto específico por texto diferente.\",\n\t\"Selects everything.\": \"Selecciona tudo.\",\n\t\"Undoes the last action.\": \"Anula a última acção.\",\n\t\"Redoes the previously undone action.\": \"Repete a acção previamente anulada.\",\n\t\"Displays program information, version number, and copyright.\": \"Mostra informações sobre o programa, número da versão e copyright.\",\n\t\"Quits Paint.\": \"Sai do Paint.\",\n\t\"Opens Paint Help.\": \"Abre a ajuda do Paint.\",\n\t\"Displays instructions about how to use Help.\": \"Mostra instruções acerca do uso da ajuda.\",\n\t\"Displays Help for areas you click on.\": \"Mostra ajuda para as áreas em que fizer clique.\",\n\t\"Displays Help for the current task or command.\": \"Mostra a ajuda para a tarefa ou o comando actuais.\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"Centra este mapa de bits como imagem de fundo do Ambiente de Trabalho.\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"Coloca este mapa de bits em mosaico como imagem de fundo do Ambiente de Trabalho.\",\n\t\"Sends the selection using mail or fax.\": \"Envia a selecção por correio ou por fax.\",\n\t\"Prints the selection.\": \"Imprime a selecção.\",\n\t\"Shows or hides the thumbnail.\": \"Mostra ou oculta a miniatura.\",\n\t\"Shows Paint Help.\": \"Mostra a ajuda do Paint.\",\n\t\"Shows or hides the status bar.\": \"Mostra ou oculta a barra de estado.\",\n\t\"Shows or hides the tool box.\": \"Mostra ou oculta a caixa de ferramentas.\",\n\t\"Shows or hides the color box.\": \"Mostra ou oculta a caixa de cores.\",\n\t\"Only a Far East font can be used for vertical editing.\": \"Só um tipo de letra do Oriente pode ser usado para editar verticalmente.\",\n\t\"Changes the window size.\": \"Altera o tamanho da janela.\",\n\t\"Changes the window position.\": \"Altera a posição da janela.\",\n\t\"Reduces the window to an icon.\": \"Reduz a janela a um ícone.\",\n\t\"Enlarges the window to full size.\": \"Aumenta a janela para ecrã inteiro.\",\n\t\"Switches to the next document window.\": \"Muda para a janela de documento seguinte.\",\n\t\"Switches to the previous document window.\": \"Muda para a janela de documento anterior.\",\n\t\"Closes the active window and asks if you want to save changes.\": \"Fecha a janela activa e pergunta se pretende guardar as alterações.\",\n\t\"Restores the window to normal size.\": \"Restaura o tamanho normal da janela.\",\n\t\"Activates the task list.\": \"Activa a lista de tarefas.\",\n\t\"All Files (*.*)\": \"Todos os ficheiros (*.*)\",\n\t\"Untitled\": \"Sem título\",\n\t\"an unnamed file\": \"um ficheiro sem nome\",\n\t\"&Hide\": \"&Ocultar\",\n\t\"Hide\": \"Ocultar\",\n\t\"No error message is available.\": \"Não existe nenhuma mensagem de erro disponível.\",\n\t\"An unsupported operation was attempted.\": \"Foi tentada uma operação não suportada.\",\n\t\"A required resource was unavailable.\": \"Um recurso necessário não estava disponível.\",\n\t\"Out of memory.\": \"Memória esgotada.\",\n\t\"An unknown error has occurred.\": \"Ocorreu um erro desconhecido.\",\n\t\"on %1\": \"em %1\",\n\t\"&One Page\": \"&Uma página\",\n\t\"One Page\": \"Uma página\",\n\t\"&Two Page\": \"&Duas pág.\",\n\t\"Two Page\": \"Duas pág.\",\n\t\"Page %u\": \"Página %u\",\n\t\"Pages %u-%u\": \"Páginas %u-%u\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"Ficheiros de impressora (*.prn)|*.prn|Todos os ficheiros (*.*)|*.*||\",\n\t\"Print to File\": \"Imprimir para ficheiro\",\n\t\"to %1\": \"para %1\",\n\t\"&Update %1\": \"Act&ualizar %1\",\n\t\"Update %1\": \"Actualizar %1\",\n\t\"E&xit && Return to %1\": \"Sai&r e regressar a %1\",\n\t\"Exit & Return to %1\": \"Sair e regressar a %1\",\n\t\"Linked %s\": \"Ligado %s\",\n\t\"Unknown Type\": \"Tipo desconhecido\",\n\t\"Invalid filename.\": \"Nome de ficheiro inválido.\",\n\t\"Failed to open document.\": \"Ocorreu uma falha ao abrir o documento.\",\n\t\"Failed to save document.\": \"Ocorreu uma falha ao guardar o documento.\",\n\t\"Save changes to %1?\": \"Guardar as alterações a %1?\",\n\t\"Failed to create empty document.\": \"Ocorreu uma falha ao criar um documento vazio.\",\n\t\"The file is too large to open.\": \"O ficheiro é demasiado grande para ser aberto.\",\n\t\"Could not start print job.\": \"Não foi possível iniciar a tarefa de impressão.\",\n\t\"Failed to launch help.\": \"Ocorreu uma falha ao iniciar a ajuda.\",\n\t\"Internal application error.\": \"Erro interno da aplicação.\",\n\t\"Command failed.\": \"O comando falhou.\",\n\t\"Insufficient memory to perform operation.\": \"Memória insuficiente para efectuar a operação.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"As entradas no registo do sistema foram removidas e o ficheiro INI (se existente) foi eliminado.\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"Nem todas as entradas no registo do sistema (ou ficheiro INI) foram removidas.\",\n\t\"This program requires the file %s, which was not found on this system.\": \"Este programa necessita do ficheiro %s, que não foi encontrado no sistema.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"Este programa está ligado à exportação %s em falta no ficheiro %s. Este computador pode ter uma versão incompatível de %s.\",\n\t\"Please enter an integer.\": \"Introduza um número inteiro.\",\n\t\"Please enter a number.\": \"Introduza um número.\",\n\t\"Please enter an integer between %1 and %2.\": \"Introduza um número inteiro entre %1 e %2.\",\n\t\"Please enter a number between %1 and %2.\": \"Introduza um número entre %1 e %2.\",\n\t\"Please enter no more than %1 characters.\": \"Não introduza mais que %1 caracteres.\",\n\t\"Please select a button.\": \"Seleccione um botão.\",\n\t\"Please enter an integer between 0 and 255.\": \"Introduza um número inteiro entre 0 e 255.\",\n\t\"Please enter a positive integer.\": \"Introduza um número inteiro positivo.\",\n\t\"Please enter a date and/or time.\": \"Introduza uma data e/ou hora.\",\n\t\"Please enter a currency.\": \"Introduza uma unidade monetária.\",\n\t\"Unexpected file format.\": \"Formato inesperado de ficheiro.\",\n\t\"Cannot find this file.\": \"Não é possível localizar este ficheiro.\",\n\t\"Please verify that the correct path and file name are given.\": \"Verifique se indicou correctamente o caminho e o nome de ficheiro.\",\n\t\"Destination disk drive is full.\": \"A unidade de destino está cheia.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"Não é possível ler a partir de %1. Está aberto por outro utilizador.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"Não foi possível escrever em %1. É só de leitura ou foi aberto por outro utilizador.\",\n\t\"An unexpected error occurred while reading %1.\": \"Ocorreu um erro inesperado ao ler %1.\",\n\t\"An unexpected error occurred while writing %1.\": \"Ocorreu um erro inesperado ao escrever %1.\",\n\t\"Unable to register document.\": \"Não é possível registar o documento.\",\n\t\"The document may already be open.\": \"O documento pode já estar aberto.\",\n\t\"Update %1 before proceeding?\": \"Deseja actualizar %1 antes de continuar?\",\n\t\"Could not update client.\": \"Não foi possível actualizar o cliente.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"Ocorreu uma falha ao registar. As funcionalidades do ActiveX podem não funcionar correctamente.\",\n\t\"Failed to update the system registry.\": \"Ocorreu uma falha ao actualizar o registo do sistema.\",\n\t\"Please try using REGEDIT.\": \"Tente utilizar o REGEDIT.\",\n\t\"Unable to read write-only property.\": \"Não é possível ler a propriedade só de escrita.\",\n\t\"Unable to write read-only property.\": \"Não é possível escrever a propriedade só de leitura.\",\n\t\"Unable to load mail system support.\": \"Não é possível carregar o suporte ao sistema de correio.\",\n\t\"Mail system DLL is invalid.\": \"A DLL do sistema de correio é inválida.\",\n\t\"Send Mail failed to send message.\": \"A função 'Enviar correio' falhou ao enviar a mensagem.\",\n\t\"No error occurred.\": \"Não ocorreu nenhum erro.\",\n\t\"An unknown error occurred while accessing %1.\": \"Ocorreu um erro desconhecido ao aceder a %1.\",\n\t\"%1 was not found.\": \"%1 não foi encontrado.\",\n\t\"%1 contains an invalid path.\": \"%1 contém um caminho inválido.\",\n\t\"%1 could not be opened because there are too many open files.\": \"Não foi possível abrir %1 porque há demasiados ficheiros abertos.\",\n\t\"Access to %1 was denied.\": \"Foi negado o acesso a %1.\",\n\t\"An invalid file handle was associated with %1.\": \"Foi associado a %1 um identificador de ficheiro inválido.\",\n\t\"%1 could not be removed because it is the current directory.\": \"Não foi possível remover %1 porque é o directório actual.\",\n\t\"%1 could not be created because the directory is full.\": \"Não foi possível criar %1 porque o directório está cheio.\",\n\t\"Seek failed on %1\": \"A procura falhou em %1\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"Foi comunicado um erro de E/S de hardware ao aceder a %1.\",\n\t\"A sharing violation occurred while accessing %1.\": \"Ocorreu uma violação de partilha ao aceder a %1.\",\n\t\"A locking violation occurred while accessing %1.\": \"Ocorreu uma violação de bloqueio ao aceder a %1.\",\n\t\"Disk full while accessing %1.\": \"O disco ficou cheio ao aceder a %1.\",\n\t\"An attempt was made to access %1 past its end.\": \"Foi efectuada uma tentativa de aceder a %1 já depois do respectivo fim.\",\n\t\"An attempt was made to write to the reading %1.\": \"Foi efectuada uma tentativa de escrever em %1 (leitura).\",\n\t\"An attempt was made to read from the writing %1.\": \"Foi efectuada uma tentativa de ler a partir de %1 (escrita).\",\n\t\"%1 has a bad format.\": \"%1 tem um formato inválido.\",\n\t\"%1 contained an unexpected object.\": \"%1 continha um objecto inesperado.\",\n\t\"%1 contains an incorrect schema.\": \"%1 contém um esquema incorrecto.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"Selecciona uma parte rectangular da imagem para mover, copiar ou editar.\",\n\t\"Select\": \"Seleccionar\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"Selecciona de forma livre uma parte da imagem para mover, copiar ou editar.\",\n\t\"Free-Form Select\": \"Seleccionar forma livre\",\n\t\"Inserts text into the picture.\": \"Insere texto na imagem.\",\n\t\"Text\": \"Texto\",\n\t\"Fills an area with the current drawing color.\": \"Preenche uma área com a cor de desenho actual.\",\n\t\"Fill With Color\": \"Preencher com cor\",\n\t\"Draws a straight line with the selected line width.\": \"Desenha uma linha recta com a largura seleccionada.\",\n\t\"Line\": \"Linha\",\n\t\"Draws using an airbrush of the selected size.\": \"Desenha utilizando um aerógrafo do tamanho seleccionado.\",\n\t\"Airbrush\": \"Aerógrafo\",\n\t\"Draws a curved line with the selected line width.\": \"Desenha uma linha curva com a largura seleccionada.\",\n\t\"Curve\": \"Curva\",\n\t\"Draws a polygon with the selected fill style.\": \"Desenha um polígono com o estilo de preenchimento seleccionado.\",\n\t\"Polygon\": \"Polígono\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"Desenha um rectângulo arredondado com o estilo de preenchimento seleccionado.\",\n\t\"Rounded Rectangle\": \"Rectângulo arredondado\",\n\t\"Draws a free-form line one pixel wide.\": \"Desenha uma linha de forma livre com um pixel de largura.\",\n\t\"Pencil\": \"Lápis\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"Apaga uma parte da imagem utilizando a borracha com a forma seleccionada.\",\n\t\"Eraser/Color Eraser\": \"Borracha/apagar cor\",\n\t\"Changes the magnification.\": \"Altera a ampliação.\",\n\t\"Magnifier\": \"Lupa\",\n\t\"Picks up a color from the picture for drawing.\": \"Escolhe uma cor da imagem para o desenho.\",\n\t\"Pick Color\": \"Escolher cor\",\n\t\"Draws using a brush with the selected shape and size.\": \"Desenha utilizando um pincel com a forma e o tamanho seleccionados.\",\n\t\"Brush\": \"Pincel\",\n\t\"Draws a rectangle with the selected fill style.\": \"Desenha um rectângulo com o estilo de preenchimento seleccionado.\",\n\t\"Rectangle\": \"Rectângulo\",\n\t\"Draws a filled rectangle.\": \"Desenha um rectângulo preenchido.\",\n\t\"Draws an ellipse with the selected fill style.\": \"Desenha uma elipse com o estilo de preenchimento seleccionado.\",\n\t\"Ellipse\": \"Elipse\",\n\t\"Draws a filled ellipse.\": \"Desenha uma elipse preenchida.\",\n\t\"Makes the current selection either opaque or transparent.\": \"Torna a selecção actual opaca ou transparente.\",\n\t\"Creates a new color.\": \"Cria uma nova cor.\",\n\t\"Uses a previously saved palette of colors.\": \"Utiliza uma paleta de cores anteriormente guardada.\",\n\t\"Saves the current palette of colors to a file.\": \"Guarda a actual paleta de cores num ficheiro.\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"Tem de guardar o ficheiro antes de o escolher como imagem de fundo.\",\n\t\"The selection is now larger than the bitmap.\": \"A selecção é maior que o mapa de bits.\",\n\t\"Would you like the bitmap enlarged?\": \"Deseja aumentar o mapa de bits?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"A imagem existente na Área de Transferência é maior que o mapa de bits.\",\n\t\"The file is not in the correct format.\": \"O ficheiro não tem o formato correcto.\",\n\t\"Not enough room to paste text.\": \"Não existe espaço suficiente para colar texto.\",\n\t\"Enlarge the text area and try again.\": \"Aumente a área de texto e tente de novo.\",\n\t\"Places the text.\": \"Coloca o texto.\"\n});\n"
  },
  {
    "path": "localization/pt-br/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"pt-br\", {\n\t\"Attributes\": \"Atributos\",\n\t\"&Width:\": \"&Largura:\",\n\t\"Width:\": \"Largura:\",\n\t\"&Height:\": \"&Altura:\",\n\t\"Height:\": \"Altura:\",\n\t\"Units\": \"Unidades\",\n\t\"&Inches\": \"P&olegadas\",\n\t\"Inches\": \"Polegadas\",\n\t\"&Pixels\": \"Pi&xels\",\n\t\"Pixels\": \"Pixels\",\n\t\"Colors\": \"Cores\",\n\t\"&Black and white\": \"Preto e &branco\",\n\t\"Black and white\": \"Preto e branco\",\n\t\"Co&lors\": \"Co&res\",\n\t\"Transparency\": \"Transparência\",\n\t\"Use &Transparent background color\": \"Usar cor de fundo &transparente\",\n\t\"Use Transparent background color\": \"Usar cor de fundo transparente\",\n\t\"Select &Color\": \"Selecionar &cor\",\n\t\"Select Color\": \"Selecionar a cor\",\n\t\"Cancel\": \"Cancelar\",\n\t\"&Default\": \"&Padrão\",\n\t\"Default\": \"Padrão\",\n\t\"Custom Zoom\": \"Zoom personalizado\",\n\t\"Current zoom:\": \"Zoom atual:\",\n\t\"Zoom to\": \"Nível de zoom\",\n\t\"Flip and Rotate\": \"Inverter e girar\",\n\t\"Flip or rotate\": \"Inverter ou girar\",\n\t\"&Flip horizontal\": \"Inverter &horizontalmente\",\n\t\"Flip horizontal\": \"Inverter horizontalmente\",\n\t\"Flip &vertical\": \"Inverter &verticalmente\",\n\t\"Flip vertical\": \"Inverter verticalmente\",\n\t\"&Rotate by angle\": \"&Girar\",\n\t\"Rotate by angle\": \"Girar\",\n\t\"Stretch and Skew\": \"Alongar e inclinar\",\n\t\"Stretch\": \"Alongar\",\n\t\"Skew\": \"Inclinar\",\n\t\"Degrees\": \"graus\",\n\t\"Color Table\": \"Tabela de cores\",\n\t\"New\": \"Novo\",\n\t\"&New \": \"&Novo \",\n\t\"New \": \"Novo \",\n\t\"&Help\": \"Aj&uda\",\n\t\"Help\": \"Ajuda\",\n\t\"Printing\": \"Imprimindo\",\n\t\"on the\": \"em\",\n\t\"&Print\": \"&Imprimir\",\n\t\"Print\": \"Imprimir\",\n\t\"&Next Page\": \"Página &seg.\",\n\t\"Next Page\": \"Página seg.\",\n\t\"Pre&v Page\": \"Página a&nt.\",\n\t\"Prev Page\": \"Página ant.\",\n\t\"Zoom &In\": \"&Mais zoom\",\n\t\"Zoom In\": \"Mais zoom\",\n\t\"Zoom &Out\": \"Men&os zoom\",\n\t\"Zoom Out\": \"Menos zoom\",\n\t\"&Close\": \"&Fechar\",\n\t\"Close\": \"Fechar\",\n\t\"Grid Settings\": \"Configurações da grade\",\n\t\"&Pixel Grid\": \"&Grade de pixels\",\n\t\"Pixel Grid\": \"Grade de pixels\",\n\t\"&Tile Grid\": \"G&rade lado a lado\",\n\t\"Tile Grid\": \"Grade lado a lado\",\n\t\"H&eight:\": \"&Altura:\",\n\t\"Text\": \"Texto\",\n\t\"Undo\": \"Desfazer\",\n\t\"Cut\": \"Recortar\",\n\t\"Copy\": \"Copiar\",\n\t\"Paste\": \"Colar\",\n\t\"Clear Selection\": \"Limpar seleção\",\n\t\"Select All\": \"Selecionar tudo\",\n\t\"Text Toolbar\": \"Barra de ferramentas de texto\",\n\t\"Selection\": \"Seleção\",\n\t\"Cu&t\": \"&Recortar\",\n\t\"&Copy\": \"&Copiar\",\n\t\"&Paste\": \"C&olar\",\n\t\"C&lear Selection\": \"&Limpar seleção\",\n\t\"Select &All\": \"Selecionar &tudo\",\n\t\"C&opy To\": \"Copiar &para\",\n\t\"Copy To\": \"Copiar para\",\n\t\"Paste &From\": \"Colar &de\",\n\t\"Paste From\": \"Colar de\",\n\t\"Flip/&Rotate\": \"Inverter/&girar\",\n\t\"Flip/Rotate\": \"Inverter/girar\",\n\t\"&Stretch/Skew\": \"&Alongar/inclinar\",\n\t\"Stretch/Skew\": \"Alongar/inclinar\",\n\t\"&Invert Colors\": \"&Inverter cores\",\n\t\"Invert Colors\": \"Inverter cores\",\n\t\"Thumbnail\": \"Miniatura\",\n\t\"&File\": \"&Arquivo\",\n\t\"File\": \"Arquivo\",\n\t\"&New\": \"&Novo\",\n\t\"&Open\": \"A&brir\",\n\t\"Open\": \"Abrir\",\n\t\"&Save\": \"&Salvar\",\n\t\"Save\": \"Salvar\",\n\t\"Save &As\": \"Salvar &como\",\n\t\"Save As\": \"Salvar como\",\n\t\"Print Pre&view\": \"&Visualizar impressão\",\n\t\"Print Preview\": \"Visualizar impressão\",\n\t\"Page Se&tup\": \"Con&figurar página\",\n\t\"Page Setup\": \"Configurar página\",\n\t\"S&end\": \"&Enviar\",\n\t\"Send\": \"Enviar\",\n\t\"Set As &Wallpaper (Tiled)\": \"Configurar como papel de parede (&lado a lado)\",\n\t\"Set As Wallpaper (Tiled)\": \"Configurar como papel de parede (lado a lado)\",\n\t\"Set As Wa&llpaper (Centered)\": \"Configurar como papel de parede (cen&tralizado)\",\n\t\"Set As Wallpaper (Centered)\": \"Configurar como papel de parede (centralizado)\",\n\t\"Recent File\": \"Arquivo recente\",\n\t\"E&xit\": \"Sai&r\",\n\t\"Exit\": \"Sair\",\n\t\"&Edit\": \"&Editar\",\n\t\"Edit\": \"Editar\",\n\t\"&Undo\": \"Desfa&zer\",\n\t\"&Repeat\": \"R&epetir\",\n\t\"Repeat\": \"Repetir\",\n\t\"&View\": \"E&xibir\",\n\t\"View\": \"Exibir\",\n\t\"&Tool Box\": \"Caixa de &ferramentas\",\n\t\"Tool Box\": \"Caixa de ferramentas\",\n\t\"&Color Box\": \"Caixa de &cores\",\n\t\"Color Box\": \"Caixa de cores\",\n\t\"&Status Bar\": \"Barra de &status\",\n\t\"Status Bar\": \"Barra de status\",\n\t\"T&ext Toolbar\": \"&Barra de ferramentas de texto\",\n\t\"&Normal Size\": \"Tama&nho normal\",\n\t\"Normal Size\": \"Tamanho normal\",\n\t\"&Large Size\": \"Tamanho gran&de\",\n\t\"Large Size\": \"Tamanho grande\",\n\t\"C&ustom\": \"Personali&zar\",\n\t\"Custom\": \"Personalizar\",\n\t\"Show &Grid\": \"Mos&trar grade\",\n\t\"Show Grid\": \"Mostrar grade\",\n\t\"Show T&humbnail\": \"Mostrar &miniatura\",\n\t\"Show Thumbnail\": \"Mostrar miniatura\",\n\t\"&View Bitmap\": \"E&xibir bitmap\",\n\t\"View Bitmap\": \"Exibir bitmap\",\n\t\"&Image\": \"&Imagem\",\n\t\"Image\": \"Imagem\",\n\t\"&Flip/Rotate\": \"Inverter/&girar\",\n\t\"&Attributes\": \"A&tributos\",\n\t\"&Clear Image\": \"&Limpar imagem\",\n\t\"Clear Image\": \"Limpar imagem\",\n\t\"&Draw Opaque\": \"&Desenho opaco\",\n\t\"Draw Opaque\": \"Desenho opaco\",\n\t\"&Colors\": \"&Cores\",\n\t\"&Edit Colors\": \"&Editar cores\",\n\t\"Edit Colors\": \"Editar cores\",\n\t\"&Help Topics\": \"&Tópicos da Ajuda\",\n\t\"Help Topics\": \"Tópicos da Ajuda\",\n\t\"&About Paint\": \"So&bre o Paint\",\n\t\"About Paint\": \"Sobre o Paint\",\n\t\"&Update\": \"A&tualizar\",\n\t\"Update\": \"Atualizar\",\n\t\"Save Copy &As\": \"Salvar cópia &como\",\n\t\"Save Copy As\": \"Salvar cópia como\",\n\t\"untitled\": \"imagem\",\n\t\"Bitmap Image\": \"Imagem de bitmap\",\n\t\"Bitmap Files (*.bmp)\": \"Arquivos de bitmap (*.bmp)\",\n\t\"PCX Files\": \"Arquivos PCX\",\n\t\"Icon Files\": \"Arquivos de ícone\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"Bitmap monocromático (*.bmp;*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"Bitmap de 16 cores (*.bmp;*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"Bitmap de 256 cores (*.bmp;*.dib)\",\n\t\"Paint cannot open this file.\": \"O Paint não pode abrir este arquivo.\",\n\t\"Paint cannot read this file.\": \"O Paint não pode ler este arquivo.\",\n\t\"This file is read-only.\": \"Este arquivo é somente leitura.\",\n\t\"To save your changes, use a different filename.\": \"Para salvar suas alterações, utilize um nome de arquivo diferente.\",\n\t\"This file is already open.\": \"Este arquivo já está aberto.\",\n\t\"This is not a valid .PCS file.\": \"Este não é um arquivo .PCS válido.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"Este arquivo está aberto para edição e não pode ser sobrescrito.\",\n\t\"Use a different filename to save your changes.\": \"Utilize um nome de arquivo diferente para salvar suas alterações.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"Este não é um arquivo de bitmap válido ou o seu formato não é atualmente aceito.\",\n\t\"This is not a valid icon.\": \"Este não é um ícone válido.\",\n\t\"This is not a valid cursor.\": \"Este não é um cursor válido.\",\n\t\"Save was interrupted, so your file has not been saved.\": \"O salvamento foi interrompido. O seu arquivo não foi salvo.\",\n\t\"You cannot save to a read-only file.\": \"Você não pode salvar em um arquivo somente leitura.\",\n\t\"Use a different file name.\": \"Utilize um nome de arquivo diferente.\",\n\t\"This file is already in use.\": \"Este arquivo já está em uso.\",\n\t\"Close the program, and then try again.\": \"Feche o programa e tente novamente.\",\n\t\"Paint cannot save this file.\": \"O Paint não pode salvar este arquivo.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"O Paint não pode salvar arquivos de tipos diferentes com o mesmo nome.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"O espaçamento da grade deve ser um número inteiro entre %d e %d.\",\n\t\"There is not enough memory or resources to complete operation.\": \"Memória ou recursos insuficientes para completar a operação.\",\n\t\"Close some programs, and then try again.\": \"Feche alguns programas e tente novamente.\",\n\t\"Low on memory or resources.\": \"Memória ou recursos insuficientes.\",\n\t\"Group error.\": \"Erro de grupo.\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"O Paint não pôde imprimir seu documento. Verifique se você possui espaço em disco suficiente e se sua impressora está funcionando corretamente.\",\n\t\"Saving into this format may cause some loss of color information.\": \"O salvamento neste formato poderá causar perda de informações sobre as cores.\",\n\t\"Do you want to continue?\": \"Deseja continuar?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"A conversão para preto e branco não pode ser desfeita. Esta ação afeta o arquivo atual e pode causar a perda de algumas informações sobre cores.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"Arquivos de bitmap devem ser maiores que 1 pixel em um lado.\",\n\t\"Generic error.\": \"Erro genérico.\",\n\t\"File not found.\": \"Arquivo não encontrado.\",\n\t\"Bad path.\": \"Caminho incorreto.\",\n\t\"Too many open files.\": \"Existem muitos arquivos abertos.\",\n\t\"Access denied.\": \"Acesso negado.\",\n\t\"Invalid file.\": \"Arquivo inválido.\",\n\t\"Remove current folder.\": \"Remover a pasta atual.\",\n\t\"Folder full.\": \"Pasta cheia.\",\n\t\"Bad seek.\": \"Pesquisa incorreta.\",\n\t\"Hard IO error.\": \"Erro de E/S de hardware.\",\n\t\"Sharing violation.\": \"Violação de compartilhamento.\",\n\t\"Lock violation.\": \"Violação de bloqueio.\",\n\t\"Disk full.\": \"Disco cheio.\",\n\t\"End of file.\": \"Final de arquivo.\",\n\t\"Error getting the Clipboard Data!\": \"Erro ao obter os dados da área de transferência!\",\n\t\"No Printer Found @ page setup\": \"Nenhuma impressora encontrada na configuração da página\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"Bitmap de 24 bits (*.bmp;*.dib)\",\n\t\"All Files\": \"Todos os arquivos\",\n\t\"Palette|*.pal|\": \"Paleta|*.pal|\",\n\t\"untitled.pal\": \"imagem.pal\",\n\t\"OLE 2.0 was unable to start.\": \"O OLE 2.0 não pôde ser iniciado.\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"Certifique-se de que você esteja usando a versão correta das bibliotecas de OLE.\",\n\t\"Resets the text be without any attributes.\": \"Redefine o texto para não ter nenhum atributo.\",\n\t\"Sets or clears the text bold attribute.\": \"Define ou limpa o atributo negrito do texto.\",\n\t\"Sets or clears the text italic attribute.\": \"Define ou limpa o atributo itálico do texto.\",\n\t\"Selects the font used by the text.\": \"Seleciona a fonte utilizada pelo texto.\",\n\t\"Selects the point size of the text.\": \"Seleciona o tamanho do ponto do texto.\",\n\t\"Sets or clears the text underline attribute.\": \"Define ou limpa o atributo sublinhado do texto.\",\n\t\"Shows or hides the tooltips.\": \"Mostra ou oculta as dicas para uso de ferramentas.\",\n\t\"Show Paint Help.\": \"Mostrar a Ajuda do Paint.\",\n\t\"Sends a picture by using mail or fax.\": \"Envia a figura utilizando correio ou fax.\",\n\t\"Copies the selection to a file.\": \"Copia a seleção para um arquivo.\",\n\t\"Pastes a file into the selection.\": \"Cola o arquivo na seleção.\",\n\t\"Zooms the picture to 100%.\": \"Aplica zoom na figura em 100%.\",\n\t\"Zooms the picture to 400%.\": \"Aplica zoom na figura em 400%.\",\n\t\"Zooms the picture.\": \"Aplica zoom na figura.\",\n\t\"Displays the entire picture.\": \"Exibe a figura inteira.\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"Mostra ou oculta a miniatura da imagem.\",\n\t\"Shows or hides the grid.\": \"Mostra ou oculta a grade.\",\n\t\"Shows or hides the text toolbar.\": \"Mostra ou oculta a barra de ferramentas do texto.\",\n\t\"Flips or rotates the picture or a selection.\": \"Inverte ou gira a figura ou uma seleção.\",\n\t\"Stretches or skews the picture or a selection.\": \"Alonga ou inclina a figura ou uma seleção.\",\n\t\"Inverts the colors of the picture or a selection.\": \"Inverte as cores da figura ou de uma seleção.\",\n\t\"Changes the attributes of the picture.\": \"Altera os atributos da figura.\",\n\t\"Clears the picture or selection.\": \"Limpa a figura ou seleção.\",\n\t\"The font size must be a numeric value.\": \"O tamanho da fonte deve ser um valor numérico.\",\n\t\"Contains commands for working with the selected item(s).\": \"Contém comandos para trabalhar com o(s) item(ns) selecionado(s).\",\n\t\"Contains commands for selecting and transferring items.\": \"Contém comandos para selecionar e transferir itens.\",\n\t\"Contains commands for customizing this window.\": \"Contém comandos para personalizar esta janela.\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"Contém comandos para manipular figuras e definir atributos.\",\n\t\"Contains commands for using custom colors and drawing options.\": \"Contém comandos para utilizar cores personalizadas e opções de desenho.\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"Contém comandos para exibir a Ajuda e informação sobre o Paint.\",\n\t\"Cannot save file.\": \"Não é possível salvar o arquivo.\",\n\t\"Error removing temporary file.\": \"Erro na remoção do arquivo temporário.\",\n\t\"Get Colors\": \"Obter cores\",\n\t\"Save Colors\": \"Salvar cores\",\n\t\"File last saved:\": \"Último arquivo gravado:\",\n\t\"Not Available\": \"Não disponível\",\n\t\"Size on disk:\": \"Tamanho no disco:\",\n\t\"Painting\": \"Pintando\",\n\t\"Fonts\": \"Fontes\",\n\t\"Tools\": \"Ferramentas\",\n\t\"All Picture Files\": \"Todos os arquivos de imagem\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"Para obter Ajuda, clique em 'Tópicos da Ajuda' no menu 'Ajuda'.\",\n\t\"Select an area on which to get Help.\": \"Selecionar uma área sobre a qual se quer obter Ajuda.\",\n\t\"%1 in %2\": \"%1 em %2\",\n\t\"Creates a new document.\": \"Cria um novo documento.\",\n\t\"Opens an existing document.\": \"Abre um documento existente.\",\n\t\"Closes the active document.\": \"Fecha o documento ativo.\",\n\t\"Saves the active document.\": \"Salva o documento ativo.\",\n\t\"Saves the active document with a new name.\": \"Salva o documento ativo com um novo nome.\",\n\t\"Changes the page layout.\": \"Altera o layout da página.\",\n\t\"Specifies the default printer setup.\": \"Especifica a configuração da impressora padrão.\",\n\t\"Prints the active document and sets printing options.\": \"Imprime o documento ativo e configura as opções de impressão.\",\n\t\"Displays full pages.\": \"Exibe páginas inteiras.\",\n\t\"Opens this document.\": \"Abre este documento.\",\n\t\"Deletes the selection.\": \"Exclui a seleção.\",\n\t\"Erases everything.\": \"Apaga tudo.\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"Copia a seleção e a coloca na área de transferência.\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"Recorta a seleção e a coloca na área de transferência.\",\n\t\"Finds the specified text.\": \"Localiza o texto especificado.\",\n\t\"Inserts the contents of the Clipboard.\": \"Insere o conteúdo da área de transferência.\",\n\t\"Repeats the last action.\": \"Repete a última ação.\",\n\t\"Replaces specific text with different text.\": \"Substitui o texto específico por um texto diferente.\",\n\t\"Selects everything.\": \"Seleciona tudo.\",\n\t\"Undoes the last action.\": \"Desfaz a última ação.\",\n\t\"Redoes the previously undone action.\": \"Refaz a ação desfeita anteriormente.\",\n\t\"Displays program information, version number, and copyright.\": \"Exibe informações do programa, número da versão e copyright.\",\n\t\"Quits Paint.\": \"Encerra o Paint.\",\n\t\"Opens Paint Help.\": \"Abre a Ajuda do Paint.\",\n\t\"Displays instructions about how to use Help.\": \"Exibe instruções sobre como utilizar a Ajuda.\",\n\t\"Displays Help for areas you click on.\": \"Exibe Ajuda para as áreas onde você clicou.\",\n\t\"Displays Help for the current task or command.\": \"Exibe Ajuda para a tarefa ou comando atual.\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"Centraliza este bitmap como papel de parede da área de trabalho.\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"Posiciona lado a lado este bitmap como papel de parede da área de trabalho.\",\n\t\"Sends the selection using mail or fax.\": \"Envia a figura utilizando correio ou fax.\",\n\t\"Prints the selection.\": \"Imprime a seleção.\",\n\t\"Shows or hides the thumbnail.\": \"Mostra ou oculta a miniatura.\",\n\t\"Shows Paint Help.\": \"Mostra a Ajuda do Paint.\",\n\t\"Shows or hides the status bar.\": \"Mostra ou oculta a barra de status.\",\n\t\"Shows or hides the tool box.\": \"Mostra ou oculta a caixa de ferramentas.\",\n\t\"Shows or hides the color box.\": \"Mostra ou oculta a caixa de cores.\",\n\t\"Only a Far East font can be used for vertical editing.\": \"Somente fontes para o Extremo Oriente podem ser editadas na vertical.\",\n\t\"Changes the window size.\": \"Altera o tamanho da janela.\",\n\t\"Changes the window position.\": \"Altera a posição da janela.\",\n\t\"Reduces the window to an icon.\": \"Reduz esta janela a um ícone.\",\n\t\"Enlarges the window to full size.\": \"Amplia a janela para o tamanho máximo.\",\n\t\"Switches to the next document window.\": \"Alterna para a janela do próximo documento.\",\n\t\"Switches to the previous document window.\": \"Alterna para a janela do documento anterior.\",\n\t\"Closes the active window and asks if you want to save changes.\": \"Fecha a janela ativa e pergunta se deseja salvar as alterações.\",\n\t\"Restores the window to normal size.\": \"Restaura a janela ao tamanho normal.\",\n\t\"Activates the task list.\": \"Ativa a lista de tarefas.\",\n\t\"All Files (*.*)\": \"Todos os arquivos (*.*)\",\n\t\"Untitled\": \"Sem nome\",\n\t\"an unnamed file\": \"um arquivo sem nome\",\n\t\"&Hide\": \"&Ocultar\",\n\t\"Hide\": \"Ocultar\",\n\t\"No error message is available.\": \"Não há mensagens de erro disponíveis.\",\n\t\"An unsupported operation was attempted.\": \"Foi feita uma tentativa de executar uma operação não aceita.\",\n\t\"A required resource was unavailable.\": \"Um recurso necessário não estava disponível.\",\n\t\"Out of memory.\": \"Sem memória.\",\n\t\"An unknown error has occurred.\": \"Ocorreu um erro desconhecido.\",\n\t\"on %1\": \"em %1\",\n\t\"&One Page\": \"&Uma página\",\n\t\"One Page\": \"Uma página\",\n\t\"&Two Page\": \"&Duas pág.\",\n\t\"Two Page\": \"Duas pág.\",\n\t\"Page %u\": \"Página %u\",\n\t\"Pages %u-%u\": \"Páginas %u-%u\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"Arquivos de impressora (*.prn)|*.prn|Todos os arquivos (*.*)|*.*||\",\n\t\"Print to File\": \"Imprimir em arquivo\",\n\t\"to %1\": \"para %1\",\n\t\"&Update %1\": \"&Atualizar %1\",\n\t\"Update %1\": \"Atualizar %1\",\n\t\"E&xit && Return to %1\": \"Sai&r e retornar a %1\",\n\t\"Exit & Return to %1\": \"Sair e retornar a %1\",\n\t\"Linked %s\": \"%s vinculado\",\n\t\"Unknown Type\": \"Tipo desconhecido\",\n\t\"Invalid filename.\": \"Nome de arquivo inválido.\",\n\t\"Failed to open document.\": \"Não foi possível abrir o documento.\",\n\t\"Failed to save document.\": \"Não foi possível salvar o documento.\",\n\t\"Save changes to %1?\": \"Salvar as alterações em %1?\",\n\t\"Failed to create empty document.\": \"Não foi possível criar um documento vazio.\",\n\t\"The file is too large to open.\": \"O arquivo é muito grande para ser aberto.\",\n\t\"Could not start print job.\": \"Não foi possível iniciar o trabalho de impressão.\",\n\t\"Failed to launch help.\": \"Não foi possível iniciar a Ajuda.\",\n\t\"Internal application error.\": \"Erro interno do aplicativo.\",\n\t\"Command failed.\": \"O comando falhou.\",\n\t\"Insufficient memory to perform operation.\": \"Memória insuficiente para executar a operação.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"As entradas no Registro do sistema foram removidas e o arquivo INI (se havia) foi excluído.\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"Não foram removidas todas as entradas do Registro do sistema (ou o arquivo INI).\",\n\t\"This program requires the file %s, which was not found on this system.\": \"Este programa requer o arquivo %s que não foi encontrado neste sistema.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"Este programa está vinculado ao %s de exportação não encontrado no arquivo %s. Talvez este computador tenha uma versão incompatível de %s.\",\n\t\"Please enter an integer.\": \"Digite um número inteiro.\",\n\t\"Please enter a number.\": \"Digite um número.\",\n\t\"Please enter an integer between %1 and %2.\": \"Digite um número inteiro entre %1 e %2.\",\n\t\"Please enter a number between %1 and %2.\": \"Digite um número entre %1 e %2.\",\n\t\"Please enter no more than %1 characters.\": \"Digite no máximo %1 caracteres.\",\n\t\"Please select a button.\": \"Selecione um botão.\",\n\t\"Please enter an integer between 0 and 255.\": \"Digite um número inteiro entre 0 e 255.\",\n\t\"Please enter a positive integer.\": \"Digite um número inteiro positivo.\",\n\t\"Please enter a date and/or time.\": \"Digite uma data e/ou hora.\",\n\t\"Please enter a currency.\": \"Digite uma unidade monetária.\",\n\t\"Unexpected file format.\": \"Formato de arquivo inesperado.\",\n\t\"Cannot find this file.\": \"Não é possível encontrar este arquivo.\",\n\t\"Please verify that the correct path and file name are given.\": \"Verifique se o caminho e o nome do arquivo estão corretos.\",\n\t\"Destination disk drive is full.\": \"A unidade de disco de destino está cheia.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"Não é possível ler de %1. Ele está aberto por outra pessoa.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"Não é possível gravar em %1. Ele é somente leitura ou está aberto por outra pessoa.\",\n\t\"An unexpected error occurred while reading %1.\": \"Ocorreu um erro inesperado durante a leitura de %1.\",\n\t\"An unexpected error occurred while writing %1.\": \"Ocorreu um erro inesperado durante a gravação de %1.\",\n\t\"Unable to register document.\": \"Não é possível registrar o documento.\",\n\t\"The document may already be open.\": \"O documento pode já estar aberto.\",\n\t\"Update %1 before proceeding?\": \"Atualizar %1 antes de prosseguir?\",\n\t\"Could not update client.\": \"Não foi possível atualizar o cliente.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"Não foi possível registrar. Os recursos ActiveX podem não funcionar corretamente.\",\n\t\"Failed to update the system registry.\": \"Não foi possível atualizar o Registro do sistema.\",\n\t\"Please try using REGEDIT.\": \"Tente usar o REGEDIT.\",\n\t\"Unable to read write-only property.\": \"Não é possível ler, propriedade somente gravação.\",\n\t\"Unable to write read-only property.\": \"Não é possível gravar, propriedade somente leitura.\",\n\t\"Unable to load mail system support.\": \"Não é possível carregar o suporte ao sistema de correio.\",\n\t\"Mail system DLL is invalid.\": \"A DLL do sistema de correio é inválida.\",\n\t\"Send Mail failed to send message.\": \"Não foi possível enviar a mensagem.\",\n\t\"No error occurred.\": \"Não houve erros.\",\n\t\"An unknown error occurred while accessing %1.\": \"Ocorreu um erro desconhecido durante o acesso a %1.\",\n\t\"%1 was not found.\": \"%1 não foi encontrado.\",\n\t\"%1 contains an invalid path.\": \"%1 contém um caminho inválido.\",\n\t\"%1 could not be opened because there are too many open files.\": \"%1 não pôde ser aberto porque existem muitos arquivos abertos.\",\n\t\"Access to %1 was denied.\": \"O acesso a %1 foi negado.\",\n\t\"An invalid file handle was associated with %1.\": \"Um identificador de arquivo inválido foi associado a %1.\",\n\t\"%1 could not be removed because it is the current directory.\": \"%1 não pôde ser removida porque é a pasta atual.\",\n\t\"%1 could not be created because the directory is full.\": \"%1 não pôde ser criado porque a pasta está cheia.\",\n\t\"Seek failed on %1\": \"A pesquisa falhou em %1\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"Foi relatado um erro de E/S de hardware durante o acesso a %1.\",\n\t\"A sharing violation occurred while accessing %1.\": \"Ocorreu uma violação de compartilhamento durante o acesso a %1.\",\n\t\"A locking violation occurred while accessing %1.\": \"Ocorreu uma violação de bloqueio durante o acesso a %1.\",\n\t\"Disk full while accessing %1.\": \"Disco cheio durante o acesso a %1.\",\n\t\"An attempt was made to access %1 past its end.\": \"Foi feita uma tentativa de acesso a %1 depois de seu fim.\",\n\t\"An attempt was made to write to the reading %1.\": \"Foi feita uma tentativa de gravar em %1, que é somente leitura.\",\n\t\"An attempt was made to read from the writing %1.\": \"Foi feita uma tentativa de ler de %1, que é somente gravação.\",\n\t\"%1 has a bad format.\": \"%1 tem um formato incorreto.\",\n\t\"%1 contained an unexpected object.\": \"%1 continha um objeto inesperado.\",\n\t\"%1 contains an incorrect schema.\": \"%1 contém um esquema incorreto.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"Seleciona uma parte retangular da figura para mover, copiar ou editar.\",\n\t\"Select\": \"Seleção\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"Seleciona uma parte em forma livre da figura para ser movida, copiada ou editada.\",\n\t\"Free-Form Select\": \"Selecionar forma livre\",\n\t\"Inserts text into the picture.\": \"Insere o texto na figura.\",\n\t\"Fills an area with the current drawing color.\": \"Preenche uma área com a cor de desenho atual.\",\n\t\"Fill With Color\": \"Preencher com cor\",\n\t\"Draws a straight line with the selected line width.\": \"Desenha uma linha reta com a largura de linha selecionada.\",\n\t\"Line\": \"Linha\",\n\t\"Draws using an airbrush of the selected size.\": \"Desenha com um spray do tamanho selecionado.\",\n\t\"Airbrush\": \"Spray\",\n\t\"Draws a curved line with the selected line width.\": \"Desenha uma linha curva com a largura de linha selecionada.\",\n\t\"Curve\": \"Curva\",\n\t\"Draws a polygon with the selected fill style.\": \"Desenha um polígono com o estilo de preenchimento selecionado.\",\n\t\"Polygon\": \"Polígono\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"Desenha um retângulo arredondado com o estilo de preenchimento selecionado.\",\n\t\"Rounded Rectangle\": \"Retângulo arredondado\",\n\t\"Draws a free-form line one pixel wide.\": \"Desenha uma linha de um pixel em forma livre.\",\n\t\"Pencil\": \"Lápis\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"Apaga uma parte da figura, usando a forma de apagador selecionada.\",\n\t\"Eraser/Color Eraser\": \"Apagador/Apagador de cor\",\n\t\"Changes the magnification.\": \"Altera a ampliação.\",\n\t\"Magnifier\": \"Ampliador\",\n\t\"Picks up a color from the picture for drawing.\": \"Seleciona uma cor da figura para desenhar.\",\n\t\"Pick Color\": \"Seleciona cor\",\n\t\"Draws using a brush with the selected shape and size.\": \"Desenha utilizando um pincel com a forma e tamanho selecionados.\",\n\t\"Brush\": \"Pincel\",\n\t\"Draws a rectangle with the selected fill style.\": \"Desenha um retângulo com o estilo de preenchimento selecionado.\",\n\t\"Rectangle\": \"Retângulo\",\n\t\"Draws a filled rectangle.\": \"Desenha um retângulo preenchido.\",\n\t\"Draws an ellipse with the selected fill style.\": \"Desenha uma elipse com o estilo de preenchimento selecionado.\",\n\t\"Ellipse\": \"Elipse\",\n\t\"Draws a filled ellipse.\": \"Desenha uma elipse preenchida.\",\n\t\"Makes the current selection either opaque or transparent.\": \"Torna a seleção atual opaca ou transparente.\",\n\t\"Creates a new color.\": \"Cria uma nova cor.\",\n\t\"Uses a previously saved palette of colors.\": \"Utiliza a paleta de cores salva previamente.\",\n\t\"Saves the current palette of colors to a file.\": \"Salva a paleta de cores atual em um arquivo.\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"Você deve salvar o arquivo antes de defini-lo como papel de parede.\",\n\t\"The selection is now larger than the bitmap.\": \"A seleção é agora maior do que o bitmap.\",\n\t\"Would you like the bitmap enlarged?\": \"Deseja aumentar o bitmap?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"A imagem na área de transferência é maior do que o bitmap.\",\n\t\"The file is not in the correct format.\": \"O arquivo não está no formato correto.\",\n\t\"Not enough room to paste text.\": \"Espaço insuficiente para colar o texto.\",\n\t\"Enlarge the text area and try again.\": \"Aumente a área de texto e tente novamente.\",\n\t\"Places the text.\": \"Posiciona o texto.\"\n});\n"
  },
  {
    "path": "localization/ru/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"ru\", {\n\t\"Attributes\": \"Атрибуты\",\n\t\"&Width:\": \"&Ширина:\",\n\t\"Width:\": \"Ширина:\",\n\t\"&Height:\": \"&Высота:\",\n\t\"Height:\": \"Высота:\",\n\t\"Units\": \"Единицы\",\n\t\"&Inches\": \"Д&юймы\",\n\t\"Inches\": \"Дюймы\",\n\t\"C&m\": \"С&м\",\n\t\"Cm\": \"См\",\n\t\"&Pixels\": \"Т&очки\",\n\t\"Pixels\": \"Точки\",\n\t\"Colors\": \"Палитра\",\n\t\"&Black and white\": \"&Черно-белая\",\n\t\"Black and white\": \"Черно-белая\",\n\t\"Co&lors\": \"Цв&етная\",\n\t\"Transparency\": \"Прозрачность\",\n\t\"Use &Transparent background color\": \"Использовать про&зрачный цвет фона\",\n\t\"Use Transparent background color\": \"Использовать прозрачный цвет фона\",\n\t\"Select &Color\": \"Выбор цве&та\",\n\t\"Select Color\": \"Выбор цвета\",\n\t\"OK\": \"ОК\",\n\t\"Cancel\": \"Отмена\",\n\t\"&Default\": \"По умо&лчанию\",\n\t\"Default\": \"По умолчанию\",\n\t\"Custom Zoom\": \"Масштаб\",\n\t\"Current zoom:\": \"Текущий масштаб:\",\n\t\"Zoom to\": \"Варианты\",\n\t\"Flip and Rotate\": \"Отражение и поворот\",\n\t\"Flip or rotate\": \"Действие\",\n\t\"&Flip horizontal\": \"Отразить с&лева направо\",\n\t\"Flip horizontal\": \"Отразить слева направо\",\n\t\"Flip &vertical\": \"Отразить с&верху вниз\",\n\t\"Flip vertical\": \"Отразить сверху вниз\",\n\t\"&Rotate by angle\": \"&Повернуть на угол\",\n\t\"Rotate by angle\": \"Повернуть на угол\",\n\t\"Stretch and Skew\": \"Растяжение и наклон\",\n\t\"Stretch\": \"Растянуть\",\n\t\"&Horizontal:\": \"По &горизонтали:\",\n\t\"Horizontal:\": \"По горизонтали:\",\n\t\"&Vertical:\": \"По &вертикали:\",\n\t\"Vertical:\": \"По вертикали:\",\n\t\"Skew\": \"Наклонить\",\n\t\"H&orizontal:\": \"По г&оризонтали:\",\n\t\"Degrees\": \"градусов\",\n\t\"V&ertical:\": \"По в&ертикали:\",\n\t\"Color Table\": \"Таблица цветов\",\n\t\"New\": \"Новый документ\",\n\t\"&New \": \"&Новый\",\n\t\"New \": \"Новый\",\n\t\"&Help\": \"&Справка\",\n\t\"Help\": \"Справка\",\n\t\"Printing\": \"Печать\",\n\t\"on the\": \"на\",\n\t\"&Print\": \"&Печать\",\n\t\"Print\": \"Печать\",\n\t\"&Next Page\": \"&Следующая\",\n\t\"Next Page\": \"Следующая\",\n\t\"Pre&v Page\": \"Пр&едыдущая\",\n\t\"Prev Page\": \"Предыдущая\",\n\t\"Zoom &In\": \"&Увеличить\",\n\t\"Zoom In\": \"Увеличить\",\n\t\"Zoom &Out\": \"У&меньшить\",\n\t\"Zoom Out\": \"Уменьшить\",\n\t\"&Close\": \"&Закрыть\",\n\t\"Close\": \"Закрыть\",\n\t\"Grid Settings\": \"Настройка сетки\",\n\t\"                  \": \"                                         \",\n\t\"&Pixel Grid\": \"Ш&аг в 1 точку\",\n\t\"Pixel Grid\": \"Шаг в 1 точку\",\n\t\"&Tile Grid\": \"&Параметры сетки\",\n\t\"Tile Grid\": \"Параметры сетки\",\n\t\"pixels\": \"точек\",\n\t\"H&eight:\": \"&Высота ячейки:\",\n\t\"Text\": \"Текст\",\n\t\"Undo\": \"Отменить\",\n\t\"Cut\": \"Вырезать\",\n\t\"Copy\": \"Копировать\",\n\t\"Paste\": \"Вставить\",\n\t\"Clear Selection\": \"Очистить выделение\",\n\t\"Select All\": \"Выделить все\",\n\t\"Text Toolbar\": \"Панель атрибутов текста\",\n\t\"Selection\": \"Выделение\",\n\t\"Cu&t\": \"&Вырезать\",\n\t\"&Copy\": \"&Копировать\",\n\t\"&Paste\": \"Вст&авить\",\n\t\"C&lear Selection\": \"О&чистить выделение\",\n\t\"Select &All\": \"Выделить в&се\",\n\t\"C&opy To\": \"Ко&пировать в файл\",\n\t\"Copy To\": \"Копирование в файл\",\n\t\"Paste &From\": \"Вставить из &файла\",\n\t\"Paste From\": \"Вставка из файла\",\n\t\"Flip/&Rotate\": \"&Отразить/повернуть\",\n\t\"Flip/Rotate\": \"Отразить/повернуть\",\n\t\"&Stretch/Skew\": \"&Растянуть/наклонить\",\n\t\"Stretch/Skew\": \"Растянуть/наклонить\",\n\t\"&Invert Colors\": \"О&братить цвета\",\n\t\"Invert Colors\": \"Обратить цвета\",\n\t\"Thumbnail\": \"Эскиз\",\n\t\"&File\": \"&Файл\",\n\t\"File\": \"Файл\",\n\t\"&New\": \"Созд&ать\",\n\t\"&Open\": \"&Открыть\",\n\t\"Open\": \"Открыть\",\n\t\"&Save\": \"&Сохранить\",\n\t\"Save\": \"Сохранить\",\n\t\"Save &As\": \"Сохранить &как\",\n\t\"Save As\": \"Сохранить как\",\n\t\"Print Pre&view\": \"Пред&варительный просмотр\",\n\t\"Print Preview\": \"Предварительный просмотр\",\n\t\"Page Se&tup\": \"&Макет страницы\",\n\t\"Page Setup\": \"Макет страницы\",\n\t\"S&end\": \"Отправит&ь\",\n\t\"Send\": \"Отправить\",\n\t\"Set As &Wallpaper (Tiled)\": \"&Замостить рабочий стол Windows\",\n\t\"Set As Wallpaper (Tiled)\": \"Замостить рабочий стол Windows\",\n\t\"Set As Wa&llpaper (Centered)\": \"В ц&ентр рабочего стола Windows\",\n\t\"Set As Wallpaper (Centered)\": \"В центр рабочего стола Windows\",\n\t\"Recent File\": \"Последний файл\",\n\t\"E&xit\": \"В&ыход\",\n\t\"Exit\": \"Выход\",\n\t\"&Edit\": \"&Правка\",\n\t\"Edit\": \"Правка\",\n\t\"&Undo\": \"&Отменить\",\n\t\"&Repeat\": \"Пов&торить\",\n\t\"Repeat\": \"Повторить\",\n\t\"&View\": \"&Вид\",\n\t\"View\": \"Вид\",\n\t\"&Tool Box\": \"Набор &инструментов\",\n\t\"Tool Box\": \"Набор инструментов\",\n\t\"&Color Box\": \"Па&литра\",\n\t\"Color Box\": \"Палитра\",\n\t\"&Status Bar\": \"&Строка состояния\",\n\t\"Status Bar\": \"Строка состояния\",\n\t\"T&ext Toolbar\": \"Панель &атрибутов текста\",\n\t\"&Zoom\": \"Мас&штаб\",\n\t\"Zoom\": \"Масштаб\",\n\t\"&Normal Size\": \"&Обычный\",\n\t\"Normal Size\": \"Обычный\",\n\t\"&Large Size\": \"&Крупный\",\n\t\"Large Size\": \"Крупный\",\n\t\"C&ustom\": \"&Другой\",\n\t\"Custom\": \"Другой\",\n\t\"Show &Grid\": \"Показать се&тку\",\n\t\"Show Grid\": \"Показать сетку\",\n\t\"Show T&humbnail\": \"&Показать эскиз\",\n\t\"Show Thumbnail\": \"Показать эскиз\",\n\t\"&View Bitmap\": \"&Просмотреть рисунок\",\n\t\"View Bitmap\": \"Просмотреть рисунок\",\n\t\"&Image\": \"&Рисунок\",\n\t\"Image\": \"Рисунок\",\n\t\"&Flip/Rotate\": \"&Отразить/повернуть\",\n\t\"&Attributes\": \"&Атрибуты\",\n\t\"&Clear Image\": \"О&чистить\",\n\t\"Clear Image\": \"Очистить\",\n\t\"&Draw Opaque\": \"&Непрозрачный фон\",\n\t\"Draw Opaque\": \"Непрозрачный фон\",\n\t\"&Colors\": \"П&алитра\",\n\t\"&Edit Colors\": \"&Изменить палитру\",\n\t\"Edit Colors\": \"Изменение палитры\",\n\t\"&Help Topics\": \"&Вызов справки\",\n\t\"Help Topics\": \"Вызов справки\",\n\t\"&About Paint\": \"&О программе\",\n\t\"About Paint\": \"О программе\",\n\t\"&Update\": \"О&бновить\",\n\t\"Update\": \"Обновить\",\n\t\"Save Copy &As\": \"Сохранить копию &как\",\n\t\"Save Copy As\": \"Сохранить копию как\",\n\t\"untitled\": \"Безымянный\",\n\t\"Bitmap Image\": \"Точечный рисунок\",\n\t\"Bitmap Files (*.bmp)\": \"Точечные рисунки (*.bmp)\",\n\t\"PCX Files\": \"Файлы PCX\",\n\t\"Icon Files\": \"Файлы значков (*.ico)\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"Монохромный рисунок (*.bmp;*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"16-цветный рисунок (*.bmp;*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"256-цветный рисунок (*.bmp;*.dib)\",\n\t\"Paint cannot open this file.\": \"Не удается открыть файл.\",\n\t\"Paint cannot read this file.\": \"Не удается прочитать файл.\",\n\t\"This file is read-only.\": \"Файл доступен только для чтения.\",\n\t\"To save your changes, use a different filename.\": \"Чтобы сохранить его, укажите другое имя.\",\n\t\"This file is already open.\": \"Файл уже открыт.\",\n\t\"This is not a valid .PCS file.\": \"Файл не является файлом .PCS.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"Файл открыт для редактирования и не может быть заменен.\",\n\t\"Use a different filename to save your changes.\": \"Сохраните изменения под другим именем.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"Файл не является правильным точечным рисунком (BMP), или этот формат не поддерживается.\",\n\t\"This is not a valid icon.\": \"Файл не является значком (ICO).\",\n\t\"This is not a valid cursor.\": \"Файл не является указателем (CUR).\",\n\t\"Save was interrupted, so your file has not been saved.\": \"Операция сохранения была прервана. Файл не сохранен.\",\n\t\"You cannot save to a read-only file.\": \"Нельзя сохранить файл, доступный только для чтения.\",\n\t\"Use a different file name.\": \"Укажите другое имя.\",\n\t\"This file is already in use.\": \"Файл уже используется.\",\n\t\"Close the program, and then try again.\": \"Закройте программу и повторите попытку.\",\n\t\"Paint cannot save this file.\": \"Не удается сохранить файл.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"Нельзя использовать то же самое имя для файла другого типа.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"Шаг сетки должен быть целым числом в пределах между %d и %d.\",\n\t\"There is not enough memory or resources to complete operation.\": \"Недостаточно памяти или ресурсов для выполнения операции.\",\n\t\"Close some programs, and then try again.\": \"Закройте несколько программ и повторите попытку.\",\n\t\"Low on memory or resources.\": \"Недостаточно памяти или ресурсов.\",\n\t\"Group error.\": \"Групповая ошибка.\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"Не удалось напечатать документ. Проверьте, достаточно ли свободного места на диске и правильно ли настроена программа управления печатью.\",\n\t\"Saving into this format may cause some loss of color information.\": \"Сохранение документа в данном формате может привести к частичной потере данных о цвете. \",\n\t\"Do you want to continue?\": \"Подтверждаете выполнение сохранения?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"Преобразование цветного рисунка в черно-белый вызовет потерю сведений о цвете, после чего восстановление исходного рисунка будет невозможно.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"Каждый из размеров рисунка должен быть не менее 1 точку.\",\n\t\"Generic error.\": \"Ошибка.\",\n\t\"File not found.\": \"Файл не найден.\",\n\t\"Bad path.\": \"Неверно указан путь.\",\n\t\"Too many open files.\": \"Открыто слишком много файлов.\",\n\t\"Access denied.\": \"Нет доступа.\",\n\t\"Invalid file.\": \"Неправильный файл.\",\n\t\"Remove current folder.\": \"Удаление текущей папки.\",\n\t\"Folder full.\": \"Папка заполнена.\",\n\t\"Bad seek.\": \"Неудачный поиск.\",\n\t\"Hard IO error.\": \"Ошибка ввода/вывода.\",\n\t\"Sharing violation.\": \"Попытка доступа к занятому файлу.\",\n\t\"Lock violation.\": \"Нарушение блокировки.\",\n\t\"Disk full.\": \"Диск заполнен.\",\n\t\"End of file.\": \"Конец файла.\",\n\t\"Error getting the Clipboard Data!\": \"Ошибка при чтении данных из буфера обмена.\",\n\t\"No Printer Found @ page setup\": \"Принтер не найден @\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"24-разрядный рисунок (*.bmp;*.dib)\",\n\t\"All Files\": \"Все файлы\",\n\t\"Palette|*.pal|\": \"Палитра|*.pal|\",\n\t\"OLE 2.0 was unable to start.\": \"Не удалось запустить OLE 2.0.\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"Проверьте, установлена ли правильная версия библиотек OLE.\",\n\t\"Resets the text be without any attributes.\": \"Сброс атрибутов текста.\",\n\t\"Sets or clears the text bold attribute.\": \"Использование или отмена полужирного шрифта.\",\n\t\"Sets or clears the text italic attribute.\": \"Использование или отмена курсива.\",\n\t\"Selects the font used by the text.\": \"Выбор шрифта для надписи.\",\n\t\"Selects the point size of the text.\": \"Выбор размера символов надписи.\",\n\t\"Sets or clears the text underline attribute.\": \"Превращение шрифта в подчеркнутый и обратно.\",\n\t\"Shows or hides the tooltips.\": \"Вывод и скрытие всплывающих подсказок.\",\n\t\"Show Paint Help.\": \"Вызов справки по Paint.\",\n\t\"Sends a picture by using mail or fax.\": \"Отправка рисунка по электронной почте или факсу.\",\n\t\"Copies the selection to a file.\": \"Копирование выделенного фрагмента в файл.\",\n\t\"Pastes a file into the selection.\": \"Вставка содержимого буфера обмена.\",\n\t\"Zooms the picture to 100%.\": \"Возврат к масштабу 100%.\",\n\t\"Zooms the picture to 400%.\": \"Установка масштаба 400%.\",\n\t\"Zooms the picture.\": \"Установка масштаба.\",\n\t\"Displays the entire picture.\": \"Просмотр рисунка целиком.\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"Вывод и скрытие окна просмотра в масштабе 100%.\",\n\t\"Shows or hides the grid.\": \"Вывод и скрытие сетки.\",\n\t\"Shows or hides the text toolbar.\": \"Вывод и скрытие панели атрибутов текста.\",\n\t\"Flips or rotates the picture or a selection.\": \"Отражение и поворот рисунка целиком или его фрагмента.\",\n\t\"Stretches or skews the picture or a selection.\": \"Растяжение и наклон рисунка целиком или его фрагмента.\",\n\t\"Inverts the colors of the picture or a selection.\": \"Обращение цветов для рисунка целиком или его фрагмента.\",\n\t\"Changes the attributes of the picture.\": \"Изменение параметров рисунка.\",\n\t\"Clears the picture or selection.\": \"Очистка рисунка целиком или его фрагмента.\",\n\t\"The font size must be a numeric value.\": \"Размер шрифта должен быть числом.\",\n\t\"Contains commands for working with the selected item(s).\": \"Команды для работы с выбранными объектами.\",\n\t\"Contains commands for selecting and transferring items.\": \"Команды выделения и перемещения объектов.\",\n\t\"Contains commands for customizing this window.\": \"Команды управления окном.\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"Команды работы с рисунками и установки атрибутов.\",\n\t\"Contains commands for using custom colors and drawing options.\": \"Команды работы с палитрами и выбора параметров настройки.\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"Команды вывода справки и сведений о программе.\",\n\t\"Cannot save file.\": \"Не удается сохранить файл.\",\n\t\"Error removing temporary file.\": \"Ошибка при удалении временного файла.\",\n\t\"Get Colors\": \"Загрузка палитры\",\n\t\"Save Colors\": \"Сохранение палитры\",\n\t\"File last saved:\": \"Файл сохранен:\",\n\t\"Not Available\": \"нет данных\",\n\t\"Size on disk:\": \"Размер файла:\",\n\t\"%s bytes\": \"%s байт\",\n\t\"Painting\": \"Рисование\",\n\t\"Fonts\": \"Шрифты\",\n\t\"Tools\": \"Панель\",\n\t\"All Picture Files\": \"Все файлы рисунков\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"Для получения справки выберите команду \\\"Вызов справки\\\" из меню \\\"Справка\\\".\",\n\t\"Select an area on which to get Help.\": \"Выберите интересующий объект.\",\n\t\"%1 in %2\": \"%1 в %2\",\n\t\"Creates a new document.\": \"Создание нового документа.\",\n\t\"Opens an existing document.\": \"Открытие существующего документа.\",\n\t\"Closes the active document.\": \"Закрытие активного документа.\",\n\t\"Saves the active document.\": \"Сохранение активного документа.\",\n\t\"Saves the active document with a new name.\": \"Сохранение активного документа под другим именем.\",\n\t\"Changes the page layout.\": \"Изменение макета страницы.\",\n\t\"Specifies the default printer setup.\": \"Выбор принтера и параметров печати\",\n\t\"Prints the active document and sets printing options.\": \"Печать активного документа и выбор параметров печати.\",\n\t\"Displays full pages.\": \"Отображает страницы целиком.\",\n\t\"Opens this document.\": \"Открытие этого документа.\",\n\t\"Deletes the selection.\": \"Удаление выделенного фрагмента.\",\n\t\"Erases everything.\": \"Удаление рисунка целиком.\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"Копирование выделенного фрагмента в буфер обмена.\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"Удаление выделенного фрагмента в буфер обмена.\",\n\t\"Finds the specified text.\": \"Поиск заданного текста.\",\n\t\"Inserts the contents of the Clipboard.\": \"Вставка в документ содержимого буфера обмена.\",\n\t\"Repeats the last action.\": \"Повтор последнего действия.\",\n\t\"Replaces specific text with different text.\": \"Замена одного текста другим.\",\n\t\"Selects everything.\": \"Выделение всего документа целиком.\",\n\t\"Undoes the last action.\": \"Отмена последнего выполненного действия.\",\n\t\"Redoes the previously undone action.\": \"Возврат результатов отмененного действия.\",\n\t\"Displays program information, version number, and copyright.\": \"Вывод сведений о программе, ее версии и авторских правах.\",\n\t\"Quits Paint.\": \"Завершение работы с приложением.\",\n\t\"Opens Paint Help.\": \"Открытие справочной системы Paint.\",\n\t\"Displays instructions about how to use Help.\": \"Вывод инструкций по использованию встроенной справки.\",\n\t\"Displays Help for areas you click on.\": \"Вывод контекстной справки по выбранным объектам.\",\n\t\"Displays Help for the current task or command.\": \"Вывод справки по текущему действию или команде.\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"Размещение рисунка в центре рабочего стола.\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"Заполнение рабочего стола копиями рисунка.\",\n\t\"Sends the selection using mail or fax.\": \"Отправка выделенного фрагмента по электронной почте или факсу.\",\n\t\"Prints the selection.\": \"Печать выделенного фрагмента.\",\n\t\"Shows or hides the thumbnail.\": \"Вывод и скрытие окна просмотра в масштабе 100%.\",\n\t\"Shows Paint Help.\": \"Открытие справочной системы Paint.\",\n\t\"Shows or hides the status bar.\": \"Вывод и скрытие строки состояния.\",\n\t\"Shows or hides the tool box.\": \"Вывод и скрытие набора инструментов.\",\n\t\"Shows or hides the color box.\": \"Вывод и скрытие цветовой палитры.\",\n\t\"Only a Far East font can be used for vertical editing.\": \"Для вертикального написания текста можно использовать только шрифты Дальнего Востока.\",\n\t\"Changes the window size.\": \"Изменение размеров окна.\",\n\t\"Changes the window position.\": \"Изменение положения окна.\",\n\t\"Reduces the window to an icon.\": \"Свертывание окна в значок.\",\n\t\"Enlarges the window to full size.\": \"Развертывание окна до максимального размера.\",\n\t\"Switches to the next document window.\": \"Переход в окно следующего документа.\",\n\t\"Switches to the previous document window.\": \"Переход в окно предыдущего документа.\",\n\t\"Closes the active window and asks if you want to save changes.\": \"Закрытие активного окна с запросом на сохранение документов.\",\n\t\"Restores the window to normal size.\": \"Восстановление исходных размеров окна.\",\n\t\"Activates the task list.\": \"Активизация списка задач.\",\n\t\"All Files (*.*)\": \"Все файлы (*.*)\",\n\t\"Untitled\": \"Безымянный\",\n\t\"an unnamed file\": \"безымянный файл\",\n\t\"&Hide\": \"&Скрыть\",\n\t\"Hide\": \"Скрыть\",\n\t\"No error message is available.\": \"Отсутствует сообщение об ошибке.\",\n\t\"An unsupported operation was attempted.\": \"Попытка выполнить недопустимую операцию.\",\n\t\"A required resource was unavailable.\": \"Запрашиваемый ресурс недоступен.\",\n\t\"Out of memory.\": \"Недостаточно памяти.\",\n\t\"An unknown error has occurred.\": \"Неопознанная ошибка.\",\n\t\"on %1\": \"на \\\"%1\\\"\",\n\t\"&One Page\": \"&Одна страница\",\n\t\"One Page\": \"Одна страница\",\n\t\"&Two Page\": \"&Две страницы\",\n\t\"Two Page\": \"Две страницы\",\n\t\"Page %u\": \"Страница %u\",\n\t\"Pages %u-%u\": \"Страницы %u-%u\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"Файлы печати (*.prn)|*.prn|Все файлы (*.*)|*.*||\",\n\t\"Print to File\": \"Печать в файл\",\n\t\"to %1\": \"в %1\",\n\t\"&Update %1\": \"&Обновить %1\",\n\t\"Update %1\": \"Обновить %1\",\n\t\"E&xit && Return to %1\": \"В&ыход и возврат к %1\",\n\t\"Exit & Return to %1\": \"Выход и возврат к %1\",\n\t\"Linked %s\": \"Связанный %s\",\n\t\"Unknown Type\": \"Неизвестный тип\",\n\t\"Invalid filename.\": \"Неправильное имя файла.\",\n\t\"Failed to open document.\": \"Не удалось открыть документ.\",\n\t\"Failed to save document.\": \"Не удалось сохранить документ.\",\n\t\"Save changes to %1?\": \"Сохранить изменения в файле \\\"%1\\\"?\",\n\t\"Failed to create empty document.\": \"Не удалось создать новый документ.\",\n\t\"The file is too large to open.\": \"Не удалось открыть слишком большой файл.\",\n\t\"Could not start print job.\": \"Не удалось запустить задание на печать.\",\n\t\"Failed to launch help.\": \"Не удалось вызвать встроенную справку.\",\n\t\"Internal application error.\": \"Внутренняя ошибка приложения.\",\n\t\"Command failed.\": \"Ошибка при выполнении команды.\",\n\t\"Insufficient memory to perform operation.\": \"Недостаточно памяти для выполнения операции.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"Элементы системного реестра были удалены, и INI-файл (если таковой существовал) также был удален.\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"Не все элементы системного реестра (или INI-файлы) были удалены.\",\n\t\"This program requires the file %s, which was not found on this system.\": \"Этой программе нужен файл \\\"%s\\\", который не найден на этом компьютере.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"Программа связана с отсутствующей функцией %s в файле \\\"%s\\\". На компьютере может быть установлена несовместимая версия %s.\",\n\t\"Please enter an integer.\": \"Введите целое число.\",\n\t\"Please enter a number.\": \"Введите числовое значение.\",\n\t\"Please enter an integer between %1 and %2.\": \"Введите целое число в диапазоне от %1 до %2.\",\n\t\"Please enter a number between %1 and %2.\": \"Введите числовое значение в диапазоне от %1 до %2.\",\n\t\"Please enter no more than %1 characters.\": \"Введите не более %1 знаков.\",\n\t\"Please select a button.\": \"Нажмите одну из кнопок.\",\n\t\"Please enter an integer between 0 and 255.\": \"Введите целое число в диапазоне от 0 до 255.\",\n\t\"Please enter a positive integer.\": \"Введите положительное целое число.\",\n\t\"Please enter a date and/or time.\": \"Введите дату и время.\",\n\t\"Please enter a currency.\": \"Введите денежную единицу.\",\n\t\"Unexpected file format.\": \"Непредусмотренный формат файла.\",\n\t\"Cannot find this file.\": \"Не удается найти файл.\",\n\t\"Please verify that the correct path and file name are given.\": \"Проверьте правильность указания пути и имени файла.\",\n\t\"Destination disk drive is full.\": \"Диск назначения заполнен.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"Не удается прочесть данные из файла \\\"%1\\\", он открыт другим пользователем.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"Не удается записать данные в файл \\\"%1\\\", он предназначен только для чтения или открыт другим пользователем.\",\n\t\"An unexpected error occurred while reading %1.\": \"Непредусмотренная ошибка при чтении файла \\\"%1\\\".\",\n\t\"An unexpected error occurred while writing %1.\": \"Непредусмотренная ошибка при записи файла \\\"%1\\\".\",\n\t\"Unable to register document.\": \"Не удается зарегистрировать документ.\",\n\t\"The document may already be open.\": \"Возможно, он уже открыт.\",\n\t\"Update %1 before proceeding?\": \"Обновить %1 перед продолжением?\",\n\t\"Could not update client.\": \"Не удается обновить клиента.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"Не удалось зарегистрировать. Возможны неполадки при использовании ActiveX.\",\n\t\"Failed to update the system registry.\": \"Не удалось обновить системный реестр.\",\n\t\"Please try using REGEDIT.\": \"Попробуйте использовать программу REGEDIT.\",\n\t\"Unable to read write-only property.\": \"Не удалось прочесть - свойство только для записи.\",\n\t\"Unable to write read-only property.\": \"Не удалось записать - свойство только для чтения.\",\n\t\"Unable to load mail system support.\": \"Не удалось загрузить поддержку почтовой системы.\",\n\t\"Mail system DLL is invalid.\": \"Неправильная библиотека DLL почтовой системы.\",\n\t\"Send Mail failed to send message.\": \"Команда \\\"Отправить\\\" не смогла отправить сообщение.\",\n\t\"No error occurred.\": \"Нет ошибки.\",\n\t\"An unknown error occurred while accessing %1.\": \"Произошла неизвестная ошибка во время доступа к \\\"%1\\\".\",\n\t\"%1 was not found.\": \"Файл \\\"%1\\\" не найден.\",\n\t\"%1 contains an invalid path.\": \"\\\"%1\\\" содержит неправильный путь.\",\n\t\"%1 could not be opened because there are too many open files.\": \"Не удается открыть \\\"%1\\\", поскольку уже открыто слишком много файлов.\",\n\t\"Access to %1 was denied.\": \"Нет доступа к \\\"%1\\\".\",\n\t\"An invalid file handle was associated with %1.\": \"С файлом \\\"%1\\\" связан неправильный дескриптор файла.\",\n\t\"%1 could not be removed because it is the current directory.\": \"Не удается удалить \\\"%1\\\", поскольку это текущая папка.\",\n\t\"%1 could not be created because the directory is full.\": \"Невозможно создать \\\"%1\\\", поскольку данная папка заполнена.\",\n\t\"Seek failed on %1\": \"Ошибка поиска в \\\"%1\\\"\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"Аппаратная ошибка ввода/вывода при доступе к \\\"%1\\\".\",\n\t\"A sharing violation occurred while accessing %1.\": \"Нарушение совместного использования при доступе к \\\"%1\\\".\",\n\t\"A locking violation occurred while accessing %1.\": \"Нарушение блокировки при доступе к \\\"%1\\\".\",\n\t\"Disk full while accessing %1.\": \"Нет места на диске при доступе к \\\"%1\\\".\",\n\t\"An attempt was made to access %1 past its end.\": \"Попытка доступа к \\\"%1\\\" за пределами файла.\",\n\t\"An attempt was made to write to the reading %1.\": \"Попытка выполнить операцию записи при чтении \\\"%1\\\".\",\n\t\"An attempt was made to read from the writing %1.\": \"Попытка выполнить операцию чтения при записи \\\"%1\\\".\",\n\t\"%1 has a bad format.\": \"\\\"%1\\\" имеет неправильный формат.\",\n\t\"%1 contained an unexpected object.\": \"\\\"%1\\\" содержит неподдерживаемый объект.\",\n\t\"%1 contains an incorrect schema.\": \"\\\"%1\\\" содержит неправильную схему.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"Выделение прямоугольного элемента рисунка.\",\n\t\"Select\": \"Выделение\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"Выделение произвольного фрагмента рисунка.\",\n\t\"Free-Form Select\": \"Выделение произвольной области\",\n\t\"Inserts text into the picture.\": \"Создание надписи.\",\n\t\"Fills an area with the current drawing color.\": \"Заполнение области одним из двух текущих цветов.\",\n\t\"Fill With Color\": \"Заливка\",\n\t\"Draws a straight line with the selected line width.\": \"Проведение прямой линии выбранной толщины.\",\n\t\"Line\": \"Линия\",\n\t\"Draws using an airbrush of the selected size.\": \"Рисование с помощью выбранного распылителя.\",\n\t\"Airbrush\": \"Распылитель\",\n\t\"Draws a curved line with the selected line width.\": \"Проведение кривой линии выбранной толщины.\",\n\t\"Curve\": \"Кривая\",\n\t\"Draws a polygon with the selected fill style.\": \"Рисование многоугольника с заданным типом заливки.\",\n\t\"Polygon\": \"Многоугольник\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"Рисование скругленного прямоугольника с заданным типом заливки.\",\n\t\"Rounded Rectangle\": \"Скругленный прямоугольник\",\n\t\"Draws a free-form line one pixel wide.\": \"Проведение произвольной линии толщиной в 1 точку.\",\n\t\"Pencil\": \"Карандаш\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"Стирание части рисунка с помощью ластика выбранного типа.\",\n\t\"Eraser/Color Eraser\": \"Ластик/Цветной ластик\",\n\t\"Changes the magnification.\": \"Изменение масштаба.\",\n\t\"Magnifier\": \"Масштаб\",\n\t\"Picks up a color from the picture for drawing.\": \"Выбор текущих цветов из имеющихся на рисунке.\",\n\t\"Pick Color\": \"Выбор цветов\",\n\t\"Draws using a brush with the selected shape and size.\": \"Рисование с помощью кисти выбранных формы и размера.\",\n\t\"Brush\": \"Кисть\",\n\t\"Draws a rectangle with the selected fill style.\": \"Рисование прямоугольника с заданным типом заливки.\",\n\t\"Rectangle\": \"Прямоугольник\",\n\t\"Draws a filled rectangle.\": \"Рисование заполненного прямоугольника.\",\n\t\"Draws an ellipse with the selected fill style.\": \"Рисование эллипса с заданным типом заливки.\",\n\t\"Ellipse\": \"Эллипс\",\n\t\"Draws a filled ellipse.\": \"Рисование заполненного эллипса.\",\n\t\"Makes the current selection either opaque or transparent.\": \"Превращение выделенного фрагмента в прозрачный либо непрозрачный.\",\n\t\"Creates a new color.\": \"Создание нового цвета.\",\n\t\"Uses a previously saved palette of colors.\": \"Загрузка созданной ранее палитры.\",\n\t\"Saves the current palette of colors to a file.\": \"Сохранение палитры в файле.\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"Для размещение рисунка на рабочем столе его следует сохранить.\",\n\t\"The selection is now larger than the bitmap.\": \"Выделенный фрагмент превосходит рисунок по размерам.\",\n\t\"Would you like the bitmap enlarged?\": \"Увеличить рисунок?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"Фрагмент, находящийся в буфере, превосходит рисунок по размерам.\",\n\t\"The file is not in the correct format.\": \"Файл имеет неверный формат.\",\n\t\"Not enough room to paste text.\": \"Недостаточно места для вставки текста.\",\n\t\"Enlarge the text area and try again.\": \"Увеличьте надпись и повторите попытку.\",\n\t\"Places the text.\": \"Размещение текста.\"\n});\n"
  },
  {
    "path": "localization/sk/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"sk\", {\n\t\"Attributes\": \"Atribúty\",\n\t\"&Width:\": \"Ší&rka:\",\n\t\"Width:\": \"Šírka:\",\n\t\"&Height:\": \"&Výška:\",\n\t\"Height:\": \"Výška:\",\n\t\"Units\": \"Jednotky\",\n\t\"&Inches\": \"p&alce\",\n\t\"Inches\": \"palce\",\n\t\"C&m\": \"c&m\",\n\t\"Cm\": \"cm\",\n\t\"&Pixels\": \"pi&xely\",\n\t\"Pixels\": \"pixely\",\n\t\"Colors\": \"Farby\",\n\t\"&Black and white\": \"Čierno&bielo\",\n\t\"Black and white\": \"Čiernobielo\",\n\t\"Co&lors\": \"&Farebne\",\n\t\"Transparency\": \"Fólia\",\n\t\"Use &Transparent background color\": \"P&oužiť farebné pozadie\",\n\t\"Use Transparent background color\": \"Použiť farebné pozadie\",\n\t\"Select &Color\": \"V&ybrať farbu\",\n\t\"Select Color\": \"Vybrať farbu\",\n\t\"Cancel\": \"Zrušiť\",\n\t\"&Default\": \"&Predvolené\",\n\t\"Default\": \"Predvolené\",\n\t\"Custom Zoom\": \"Vlastná mierka\",\n\t\"Current zoom:\": \"Aktuálna mierka:\",\n\t\"Zoom to\": \"Mierka\",\n\t\"Flip and Rotate\": \"Prevrátiť a otočiť\",\n\t\"Flip or rotate\": \"Prevrátiť alebo otočiť\",\n\t\"&Flip horizontal\": \"P&revrátiť vodorovne\",\n\t\"Flip horizontal\": \"Prevrátiť vodorovne\",\n\t\"Flip &vertical\": \"Prevrátiť &zvislo\",\n\t\"Flip vertical\": \"Prevrátiť zvislo\",\n\t\"&Rotate by angle\": \"&Otočiť o uhol\",\n\t\"Rotate by angle\": \"Otočiť o uhol\",\n\t\"Stretch and Skew\": \"Roztiahnutie alebo skosenie\",\n\t\"Stretch\": \"Roztiahnuť\",\n\t\"&Horizontal:\": \"&Vodorovne:\",\n\t\"Horizontal:\": \"Vodorovne:\",\n\t\"&Vertical:\": \"&Zvislo:\",\n\t\"Vertical:\": \"Zvislo:\",\n\t\"Skew\": \"Skosiť\",\n\t\"H&orizontal:\": \"Vo&dorovne:\",\n\t\"Degrees\": \"stupňov\",\n\t\"V&ertical:\": \"Zvi&slo:\",\n\t\"Color Table\": \"Tabuľka farieb\",\n\t\"New\": \"Nový\",\n\t\"&New \": \"&Nový \",\n\t\"New \": \"Nový \",\n\t\"&Help\": \"&Pomocník\",\n\t\"Help\": \"Pomocník\",\n\t\"Printing\": \"Prebieha tlač\",\n\t\"on the\": \"na\",\n\t\"&Print\": \"&Tlačiť\",\n\t\"Print\": \"Tlačiť\",\n\t\"&Next Page\": \"N&asled.\",\n\t\"Next Page\": \"Nasled.\",\n\t\"Pre&v Page\": \"&Predch.\",\n\t\"Prev Page\": \"Predch.\",\n\t\"Zoom &In\": \"P&riblížiť\",\n\t\"Zoom In\": \"Priblížiť\",\n\t\"Zoom &Out\": \"&Vzdialiť\",\n\t\"Zoom Out\": \"Vzdialiť\",\n\t\"&Close\": \"&Zavrieť\",\n\t\"Close\": \"Zavrieť\",\n\t\"Grid Settings\": \"Nastavenie mriežky\",\n\t\"&Pixel Grid\": \"Mriežka pi&xelov\",\n\t\"Pixel Grid\": \"Mriežka pixelov\",\n\t\"&Tile Grid\": \"&Mriežka\",\n\t\"Tile Grid\": \"Mriežka\",\n\t\"pixels\": \"pixelov\",\n\t\"H&eight:\": \"&Výška:\",\n\t\"Undo\": \"Späť\",\n\t\"Cut\": \"Vystrihnúť\",\n\t\"Copy\": \"Kopírovať\",\n\t\"Paste\": \"Prilepiť\",\n\t\"Clear Selection\": \"Vymazať výber\",\n\t\"Select All\": \"Vybrať všetko\",\n\t\"Text Toolbar\": \"Panel písma\",\n\t\"Selection\": \"Výber\",\n\t\"Cu&t\": \"&Vystrihnúť\",\n\t\"&Copy\": \"&Kopírovať\",\n\t\"&Paste\": \"&Prilepiť\",\n\t\"C&lear Selection\": \"Vy&mazať výber\",\n\t\"Select &All\": \"Vy&brať všetko\",\n\t\"C&opy To\": \"K&opírovať do\",\n\t\"Copy To\": \"Kopírovať do\",\n\t\"Paste &From\": \"Pri&lepiť z\",\n\t\"Paste From\": \"Prilepiť z\",\n\t\"Flip/&Rotate\": \"Prev&rátiť alebo otočiť\",\n\t\"Flip/Rotate\": \"Prevrátiť alebo otočiť\",\n\t\"&Stretch/Skew\": \"Roztiahnuť alebo &skosiť\",\n\t\"Stretch/Skew\": \"Roztiahnuť alebo skosiť\",\n\t\"&Invert Colors\": \"&Invertovať farby\",\n\t\"Invert Colors\": \"Invertovať farby\",\n\t\"Thumbnail\": \"Miniatúra\",\n\t\"&File\": \"&Súbor\",\n\t\"File\": \"Súbor\",\n\t\"&New\": \"&Nový\",\n\t\"&Open\": \"&Otvoriť\",\n\t\"Open\": \"Otvoriť\",\n\t\"&Save\": \"&Uložiť\",\n\t\"Save\": \"Uložiť\",\n\t\"Save &As\": \"Uložiť &ako\",\n\t\"Save As\": \"Uložiť ako\",\n\t\"Print Pre&view\": \"U&kážka pred tlačou\",\n\t\"Print Preview\": \"Ukážka pred tlačou\",\n\t\"Page Se&tup\": \"Nasta&venie strany\",\n\t\"Page Setup\": \"Nastavenie strany\",\n\t\"S&end\": \"O&doslať\",\n\t\"Send\": \"Odoslať\",\n\t\"Set As &Wallpaper (Tiled)\": \"Nastaviť ako tap&etu (dlaždice)\",\n\t\"Set As Wallpaper (Tiled)\": \"Nastaviť ako tapetu (dlaždice)\",\n\t\"Set As Wa&llpaper (Centered)\": \"Nastaviť ako ta&petu (centrovať)\",\n\t\"Set As Wallpaper (Centered)\": \"Nastaviť ako tapetu (centrovať)\",\n\t\"Recent File\": \"Naposledy otvorený súbor\",\n\t\"E&xit\": \"&Skončiť\",\n\t\"Exit\": \"Skončiť\",\n\t\"&Edit\": \"Úpr&avy\",\n\t\"Edit\": \"Úpravy\",\n\t\"&Undo\": \"&Späť\",\n\t\"&Repeat\": \"&Opakovať\",\n\t\"Repeat\": \"Opakovať\",\n\t\"&View\": \"&Zobraziť\",\n\t\"View\": \"Zobraziť\",\n\t\"&Tool Box\": \"Panel s &nástrojmi\",\n\t\"Tool Box\": \"Panel s nástrojmi\",\n\t\"&Color Box\": \"Panel &farieb\",\n\t\"Color Box\": \"Panel farieb\",\n\t\"Ctrl+L\": \"Ctrl+A\",\n\t\"&Status Bar\": \"&Stavový riadok\",\n\t\"Status Bar\": \"Stavový riadok\",\n\t\"T&ext Toolbar\": \"Panel &písma\",\n\t\"&Zoom\": \"&Lupa\",\n\t\"Zoom\": \"Lupa\",\n\t\"&Normal Size\": \"&Normálna veľkosť\",\n\t\"Normal Size\": \"Normálna veľkosť\",\n\t\"&Large Size\": \"&Zväčšená veľkosť\",\n\t\"Large Size\": \"Zväčšená veľkosť\",\n\t\"C&ustom\": \"&Vlastná\",\n\t\"Custom\": \"Vlastná\",\n\t\"Show &Grid\": \"Zobraziť m&riežku\",\n\t\"Show Grid\": \"Zobraziť mriežku\",\n\t\"Show T&humbnail\": \"Zobraziť &miniatúru\",\n\t\"Show Thumbnail\": \"Zobraziť miniatúru\",\n\t\"&View Bitmap\": \"&Celá obrazovka\",\n\t\"View Bitmap\": \"Celá obrazovka\",\n\t\"&Image\": \"&Obrázok\",\n\t\"Image\": \"Obrázok\",\n\t\"&Flip/Rotate\": \"Prev&rátiť alebo otočiť\",\n\t\"&Attributes\": \"&Atribúty\",\n\t\"&Clear Image\": \"Vy&mazať obrázok\",\n\t\"Clear Image\": \"Vymazať obrázok\",\n\t\"&Draw Opaque\": \"&Kresliť nepriesvitne\",\n\t\"Draw Opaque\": \"Kresliť nepriesvitne\",\n\t\"&Colors\": \"&Farby\",\n\t\"&Edit Colors\": \"Upraviť &farby\",\n\t\"Edit Colors\": \"Upraviť farby\",\n\t\"&Help Topics\": \"&Témy Pomocníka\",\n\t\"Help Topics\": \"Témy Pomocníka\",\n\t\"&About Paint\": \"Č&o je Skicár\",\n\t\"About Paint\": \"Čo je Skicár\",\n\t\"&Update\": \"&Aktualizovať\",\n\t\"Update\": \"Aktualizovať\",\n\t\"Save Copy &As\": \"&Uložiť kópiu ako\",\n\t\"Save Copy As\": \"Uložiť kópiu ako\",\n\t\"Paint\": \"Skicár\",\n\t\"untitled\": \"Bez_názvu\",\n\t\"Bitmap Image\": \"Bitová mapa\",\n\t\"Bitmap Files (*.bmp)\": \"Súbory bitových máp (*.bmp)\",\n\t\"Paint.Picture\": \"Obrázok.Skicár\",\n\t\"PCX Files\": \"Súbory PCX\",\n\t\"Icon Files\": \"Súbory ikon\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"Čiernobiela bitová mapa (*.bmp;*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"16-farebná bitová mapa (*.bmp;*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"256-farebná bitová mapa (*.bmp;*.dib)\",\n\t\"Paint cannot open this file.\": \"Program Skicár nemôže otvoriť tento súbor.\",\n\t\"Paint cannot read this file.\": \"Program Skicár nemôže prečítať tento súbor.\",\n\t\"This file is read-only.\": \"Tento súbor je iba na čítanie.\",\n\t\"To save your changes, use a different filename.\": \"Ak chcete zmeny uložiť, zadajte iný názov súboru.\",\n\t\"This file is already open.\": \"Tento súbor je už otvorený.\",\n\t\"This is not a valid .PCS file.\": \"Toto nie je platný súbor typu .PCS.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"Súbor je otvorený pre úpravy a nedá sa prepísať.\",\n\t\"Use a different filename to save your changes.\": \"Ak chcete zmeny uložiť, zadajte iný názov súboru.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"Toto nie je platný súbor bitovej mapy alebo jeho formát nie je momentálne podporovaný.\",\n\t\"This is not a valid icon.\": \"Toto nie je platná ikona.\",\n\t\"This is not a valid cursor.\": \"Toto nie je platný kurzor.\",\n\t\"Save was interrupted, so your file has not been saved.\": \"Ukladanie bolo prerušené, súbor nie je uložený.\",\n\t\"You cannot save to a read-only file.\": \"Súbor, určený iba na čítanie, sa nedá uložiť.\",\n\t\"Use a different file name.\": \"Zadajte iný názov súboru.\",\n\t\"This file is already in use.\": \"Tento súbor sa už používa.\",\n\t\"Close the program, and then try again.\": \"Skončite program a pokúste sa znova.\",\n\t\"Paint cannot save this file.\": \"Program Skicár nemôže tento súbor uložiť.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"Program Skicár nemôže uložiť pod rovnakým názvom súbor iného typu.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"Hustota mriežky sa zadáva ako celé číslo v intervale %d až %d.\",\n\t\"There is not enough memory or resources to complete operation.\": \"Na dokončenie operácie nie je dostatok pamäte alebo prostriedkov.\",\n\t\"Close some programs, and then try again.\": \"Skončite niektoré programy a pokúste sa znova.\",\n\t\"Low on memory or resources.\": \"Nedostatok pamäte alebo prostriedkov.\",\n\t\"Group error.\": \"Chyba skupiny.\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"Skicár nemôže vytlačiť dokument. Skontrolujte, či je dostatok miesta na disku a či tlačiareň pracuje správne.\",\n\t\"Saving into this format may cause some loss of color information.\": \"Uloženie v tomto formáte môže spôsobiť stratu informácie o farbách.\",\n\t\"Do you want to continue?\": \" Chcete pokračovať?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"Prevod na čiernobiely obrázok sa nedá vrátiť späť. Táto akcia upraví súbor a môže spôsobiť stratu informácií o farbách.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"Veľkosť strany bitovej mapy musí byť väčšia než jeden pixel.\",\n\t\"Generic error.\": \"Všeobecná chyba.\",\n\t\"File not found.\": \"Súbor sa nenašiel.\",\n\t\"Bad path.\": \"Chybná cesta.\",\n\t\"Too many open files.\": \"Príliš veľa otvorených súborov.\",\n\t\"Access denied.\": \"Prístup bol odmietnutý.\",\n\t\"Invalid file.\": \"Neplatný súbor.\",\n\t\"Remove current folder.\": \"Odstrániť aktuálny priečinok.\",\n\t\"Folder full.\": \"Priečinok je plný.\",\n\t\"Bad seek.\": \"Chybné vystavenie.\",\n\t\"Hard IO error.\": \"Vážna IO chyba.\",\n\t\"Sharing violation.\": \"Poručenie zdieľania.\",\n\t\"Lock violation.\": \"Uzamknutie narušené.\",\n\t\"Disk full.\": \"Disk je plný.\",\n\t\"End of file.\": \"Koniec súboru.\",\n\t\"Error getting the Clipboard Data!\": \"Chyba počas získavania údajov zo Schránky.\",\n\t\"No Printer Found @ page setup\": \"Chýba tlačiareň pre nastavenie strany\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"24-bitová mapa (*.bmp;*.dib)\",\n\t\"All Files\": \"Všetky súbory\",\n\t\"Palette|*.pal|\": \"Paleta|*.pal|\",\n\t\"untitled.pal\": \"Obrázok.pal\",\n\t\"OLE 2.0 was unable to start.\": \"OLE 2.0 sa nedá spustiť.\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"Presvedčte sa, či používate správnu verziu knižníc OLE.\",\n\t\"Resets the text be without any attributes.\": \"Zruší všetky atribúty textu. \",\n\t\"Sets or clears the text bold attribute.\": \"Zapne alebo vypne tučné písmo.\",\n\t\"Sets or clears the text italic attribute.\": \"Zapne alebo vypne kurzívu.\",\n\t\"Selects the font used by the text.\": \"Vyberie písmo pre písanie textu.\",\n\t\"Selects the point size of the text.\": \"Vyberie výšku textu v bodoch.\",\n\t\"Sets or clears the text underline attribute.\": \"Zapne alebo vypne podčiarknutie písma.\",\n\t\"Shows or hides the tooltips.\": \"Zobrazí alebo skryje popisy tlačidiel.\",\n\t\"Show Paint Help.\": \"Zobrazí Pomocníka programu Skicár.\",\n\t\"Sends a picture by using mail or fax.\": \"Odošle obrázok poštou alebo faxom.\",\n\t\"Copies the selection to a file.\": \"Skopíruje vybratú časť do súboru.\",\n\t\"Pastes a file into the selection.\": \"Prilepí súbor do vybranej časti.\",\n\t\"Zooms the picture to 100%.\": \"Nastaví mierku na 100%.\",\n\t\"Zooms the picture to 400%.\": \"Nastaví mierku na 400%.\",\n\t\"Zooms the picture.\": \"Priblíži obrázok.\",\n\t\"Displays the entire picture.\": \"Zobrazí celý obrázok.\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"Zobrazí alebo skryje miniatúru obrázka.\",\n\t\"Shows or hides the grid.\": \"Zobrazí alebo skryje mriežku.\",\n\t\"Shows or hides the text toolbar.\": \"Zobrazí alebo skryje panel písma.\",\n\t\"Flips or rotates the picture or a selection.\": \"Prevráti alebo otočí obrázok, alebo vybranú časť.\",\n\t\"Stretches or skews the picture or a selection.\": \"Roztiahne alebo skosí obrázok, alebo vybranú časť.\",\n\t\"Inverts the colors of the picture or a selection.\": \"Invertuje farby obrázka alebo vybranej časti.\",\n\t\"Changes the attributes of the picture.\": \"Zmení atribúty obrázka.\",\n\t\"Clears the picture or selection.\": \"Vymaže obrázok alebo vybranú časť.\",\n\t\"The font size must be a numeric value.\": \"Veľkosť písma musí byť číselná hodnota.\",\n\t\"Contains commands for working with the selected item(s).\": \"Obsahuje príkazy pre prácu s vybranými položkami.\",\n\t\"Contains commands for selecting and transferring items.\": \"Obsahuje príkazy pre výber a prenos jednotiek.\",\n\t\"Contains commands for customizing this window.\": \"Obsahuje príkazy pre prispôsobenie zobrazenia okna.\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"Obsahuje príkazy pre manipuláciu s obrázkom a pre nastavenie atribútov.\",\n\t\"Contains commands for using custom colors and drawing options.\": \"Obsahuje príkazy pre prácu s farbami a pre nastavenie možností maľovania.\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"Obsahuje príkazy pre zobrazenie Pomocníka a informácií o programe Skicár.\",\n\t\"Cannot save file.\": \"Súbor nemožno uložiť.\",\n\t\"Error removing temporary file.\": \"Chyba pri odstraňovaní dočasného súboru.\",\n\t\"Get Colors\": \"Prevziať farby\",\n\t\"Save Colors\": \"Uložiť farby\",\n\t\"File last saved:\": \"Posledné uloženie súboru: Nie je k dispozícii\",\n\t\"Size on disk:\": \"Veľkosť disku: Nie je k dispozícii\",\n\t\"%s bytes\": \"%s bajtov\",\n\t\"Painting\": \"Maľovať\",\n\t\"Fonts\": \"Písma\",\n\t\"Tools\": \"Nástroje\",\n\t\"All Picture Files\": \"Všetky súbory obrázkov\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"Pomocníka získate kliknutím na položku Témy Pomocníka z ponuky Pomocník.\",\n\t\"Select an area on which to get Help.\": \"Kliknite na oblasť obrazovky, ku ktorej chcete radu od Pomocníka.\",\n\t\"%1 in %2\": \"%1 v %2\",\n\t\"%1 - %2\": \"%2 - %1\",\n\t\"Creates a new document.\": \"Vytvorí nový dokument.\",\n\t\"Opens an existing document.\": \"Otvorí existujúci dokument.\",\n\t\"Closes the active document.\": \"Zavrie aktuálny dokument.\",\n\t\"Saves the active document.\": \"Uloží aktuálny dokument.\",\n\t\"Saves the active document with a new name.\": \"Uloží aktuálny dokument pod novým názvom.\",\n\t\"Changes the page layout.\": \"Zmení vzhľad tlačovej strany.\",\n\t\"Specifies the default printer setup.\": \"Nastaví predvolenú tlačiareň. \",\n\t\"Prints the active document and sets printing options.\": \"Vytlačí aktívny dokument a nastaví spôsob tlače.\",\n\t\"Displays full pages.\": \"Zobrazí celé strany.\",\n\t\"Opens this document.\": \"Otvorí tento dokument.\",\n\t\"Deletes the selection.\": \"Odstráni výber.\",\n\t\"Erases everything.\": \"Vymaže všetko.\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"Skopíruje výber do Schránky.\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"Vystrihne výber a vloží ho do Schránky.\",\n\t\"Finds the specified text.\": \"Hľadá zadaný text.\",\n\t\"Inserts the contents of the Clipboard.\": \"Vloží obsah Schránky.\",\n\t\"Repeats the last action.\": \"Zopakuje predchádzajúcu akciu.\",\n\t\"Replaces specific text with different text.\": \"Nahradí zadaný text iným textom.\",\n\t\"Selects everything.\": \"Vyberie všetko.\",\n\t\"Undoes the last action.\": \"Vráti späť predchádzajúcu akciu.\",\n\t\"Redoes the previously undone action.\": \"Znova vykoná vrátenú akciu.\",\n\t\"Displays program information, version number, and copyright.\": \"Zobrazí informácie o programe, verzii a autorských právach.\",\n\t\"Quits Paint.\": \"Skončí program Skicár.\",\n\t\"Opens Paint Help.\": \"Otvorí Pomocníka programu Skicár.\",\n\t\"Displays instructions about how to use Help.\": \"Zobrazí návod k práci s Pomocníkom.\",\n\t\"Displays Help for areas you click on.\": \"Zobrazí Pomocníka pre oblasť, na ktorú ste klikli.\",\n\t\"Displays Help for the current task or command.\": \"Zobrazí Pomocníka pre túto úlohu alebo príkaz.\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"Použije vycentrovaný obrázok ako tapetu pracovnej plochy.\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"Použije obrázok ako tapetu na celú pracovnú plochu.\",\n\t\"Sends the selection using mail or fax.\": \"Odošle výber poštou alebo faxom.\",\n\t\"Prints the selection.\": \"Vytlačí výber.\",\n\t\"Shows or hides the thumbnail.\": \"Zobrazí alebo skryje miniatúru.\",\n\t\"Shows Paint Help.\": \"Zobrazí Pomocníka programu Skicár.\",\n\t\"Shows or hides the status bar.\": \"Zobrazí alebo skryje stavový riadok.\",\n\t\"Shows or hides the tool box.\": \"Zobrazí alebo skryje panel s nástrojmi.\",\n\t\"Shows or hides the color box.\": \"Zobrazí alebo skryje panel farieb.\",\n\t\"Only a Far East font can be used for vertical editing.\": \"Pre zvislé písanie sa dajú použiť len písma ďalekého východu.\",\n\t\"Changes the window size.\": \"Zmení veľkosť okna.\",\n\t\"Changes the window position.\": \"Zmení polohu okna.\",\n\t\"Reduces the window to an icon.\": \"Zmenší okno na ikonu.\",\n\t\"Enlarges the window to full size.\": \"Zväčší okno na plnú veľkosť.\",\n\t\"Switches to the next document window.\": \"Prepne do nasledujúceho okna dokumentu.\",\n\t\"Switches to the previous document window.\": \"Prepne do predchádzajúceho okna dokumentu.\",\n\t\"Closes the active window and asks if you want to save changes.\": \"Zatvorí aktívne okno a spýta sa, či sa majú zmeny uložiť.\",\n\t\"Restores the window to normal size.\": \"Obnoví normálnu veľkosť okna.\",\n\t\"Activates the task list.\": \"Aktivuje zoznam úloh.\",\n\t\"All Files (*.*)\": \"Všetky súbory (*.*)\",\n\t\"Untitled\": \"Bez názvu\",\n\t\"an unnamed file\": \"nepomenovaný súbor\",\n\t\"&Hide\": \"&Skryť\",\n\t\"Hide\": \"Skryť\",\n\t\"No error message is available.\": \"Žiadne chybové hlásenie nie je k dispozícii.\",\n\t\"An unsupported operation was attempted.\": \"Pokus o nepodporovanú operáciu.\",\n\t\"A required resource was unavailable.\": \"Požadovaný prostriedok nebol k dispozícii.\",\n\t\"Out of memory.\": \"Nedostatok pamäte.\",\n\t\"An unknown error has occurred.\": \"Vyskytla sa neznáma chyba.\",\n\t\"on %1\": \"na %1\",\n\t\"&One Page\": \"&Jedna strana\",\n\t\"One Page\": \"Jedna strana\",\n\t\"&Two Page\": \"&Dve strany\",\n\t\"Two Page\": \"Dve strany\",\n\t\"Page %u\": \"Strana %u\",\n\t\"Pages %u-%u\": \"Strany %u-%u\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"Súbory tlačiarne (*.prn)|*.prn|Všetky súbory (*.*)|*.*||\",\n\t\"Print to File\": \"Tlačiť do súboru\",\n\t\"to %1\": \"do %1\",\n\t\"&Update %1\": \"&Aktualizovať %1\",\n\t\"Update %1\": \"Aktualizovať %1\",\n\t\"E&xit && Return to %1\": \"&Skončiť a vrátiť sa k %1\",\n\t\"Exit & Return to %1\": \"Skončiť a vrátiť sa k %1\",\n\t\"Linked %s\": \"Prepojený %s\",\n\t\"Unknown Type\": \"Neznámy typ\",\n\t\"Invalid filename.\": \"Neplatný názov súboru.\",\n\t\"Failed to open document.\": \"Dokument sa nepodarilo otvoriť.\",\n\t\"Failed to save document.\": \"Dokument sa nepodarilo uložiť.\",\n\t\"Save changes to %1?\": \"Uložiť zmeny do súboru %1?\",\n\t\"Failed to create empty document.\": \"Prázdny dokument sa nepodarilo vytvoriť.\",\n\t\"The file is too large to open.\": \"Tento súbor sa nedá otvoriť. Je príliš veľký.\",\n\t\"Could not start print job.\": \"Tlačovú úlohu sa nepodarilo spustiť.\",\n\t\"Failed to launch help.\": \"Pomocník sa nespustil.\",\n\t\"Internal application error.\": \"Vnútorná chyba aplikácie.\",\n\t\"Command failed.\": \"Príkaz sa nevykonal.\",\n\t\"Insufficient memory to perform operation.\": \"Nedostatok pamäte na vykonanie operácie.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"Položky v databáze Registry a súbor INI (ak existoval) boli odstránené.\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"Niektoré položky databázy Registry (alebo súbor INI) neboli odstránené.\",\n\t\"This program requires the file %s, which was not found on this system.\": \"Program potrebuje súbor %s, ktorý sa v systéme nenašiel.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"Program je pripojený na chýbajúci export %s súboru %s. Počítač má pravdepodobne nekompatibilnú verziu systému %s.\",\n\t\"Please enter an integer.\": \"Zadajte celé číslo.\",\n\t\"Please enter a number.\": \"Zadajte číslo.\",\n\t\"Please enter an integer between %1 and %2.\": \"Zadajte celé číslo od %1 do %2.\",\n\t\"Please enter a number between %1 and %2.\": \"Zadajte číslo od %1 do %2.\",\n\t\"Please enter no more than %1 characters.\": \"Zadajte maximálne %1 znakov.\",\n\t\"Please select a button.\": \"Kliknite na tlačidlo.\",\n\t\"Please enter an integer between 0 and 255.\": \"Zadajte celé číslo od 0 do 255.\",\n\t\"Please enter a positive integer.\": \"Zadajte celé kladné číslo.\",\n\t\"Please enter a date and/or time.\": \"Zadajte dátum alebo čas.\",\n\t\"Please enter a currency.\": \"Zadajte menu.\",\n\t\"Unexpected file format.\": \"Neočakávaný formát súboru.\",\n\t\"Cannot find this file.\": \"Súbor sa nenašiel.\",\n\t\"Please verify that the correct path and file name are given.\": \"Skontrolujte, či bola zadaná správna cesta a názov súboru.\",\n\t\"Destination disk drive is full.\": \"Cieľová disková jednotka je plná.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"Zo súboru %1 sa nedá čítať, pretože je už otvorený.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"Do súboru %1 sa nedá zapisovať, pretože je iba na čítanie alebo otvorený iným používateľom.\",\n\t\"An unexpected error occurred while reading %1.\": \"Počas čítania %1 sa vyskytla neočakávaná chyba.\",\n\t\"An unexpected error occurred while writing %1.\": \"Počas zapisovania %1 sa vyskytla neočakávaná chyba.\",\n\t\"Unable to register document.\": \"Dokument sa nedá zaregistrovať.\",\n\t\"The document may already be open.\": \"Už je pravdepodobne otvorený.\",\n\t\"Update %1 before proceeding?\": \"Aktualizovať %1 pred pokračovaním?\",\n\t\"Could not update client.\": \"Klient sa nedá aktualizovať.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"Registrácia nebola úspešná. Funkcie ActiveX asi nebudú pracovať správne.\",\n\t\"Failed to update the system registry.\": \"Databáza Registry sa neaktualizovala.\",\n\t\"Please try using REGEDIT.\": \"Pokúste sa použiť program Regedit.\",\n\t\"Unable to read write-only property.\": \"Nie je možné čítať vlastnosť, ktorá je iba na zápis.\",\n\t\"Unable to write read-only property.\": \"Nie je možné zapísať vlastnosť, ktorá je iba na čítanie.\",\n\t\"Unable to load mail system support.\": \"Systémová podpora elektronickej pošty sa nedá načítať.\",\n\t\"Mail system DLL is invalid.\": \"Systémová DLL pošty nie je platná.\",\n\t\"Send Mail failed to send message.\": \"Odoslanie správy nebolo úspešné.\",\n\t\"No error occurred.\": \"Nevyskytla sa žiadna chyba.\",\n\t\"An unknown error occurred while accessing %1.\": \"Počas prístupu na %1 sa vyskytla neznáma chyba.\",\n\t\"%1 was not found.\": \"%1 sa nenašiel.\",\n\t\"%1 contains an invalid path.\": \"%1 obsahuje neplatnú cestu.\",\n\t\"%1 could not be opened because there are too many open files.\": \"%1 sa nedá otvoriť, pretože je otvorených príliš veľa súborov.\",\n\t\"Access to %1 was denied.\": \"Prístup k %1 bol odmietnutý.\",\n\t\"An invalid file handle was associated with %1.\": \"K %1 bol priradený neplatný popisovač súboru.\",\n\t\"%1 could not be removed because it is the current directory.\": \"%1 sa nedá odstrániť, pretože je to aktuálny adresár.\",\n\t\"%1 could not be created because the directory is full.\": \"%1 sa nedá vytvoriť, pretože adresár je plný.\",\n\t\"Seek failed on %1\": \"Hľadanie zlyhalo na %1\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"Počas prístupu k %1 bola hlásená vstupno-výstupná chyba hardvéru.\",\n\t\"A sharing violation occurred while accessing %1.\": \"Počas prístupu k %1 sa vyskytlo porušenie zdieľania.\",\n\t\"A locking violation occurred while accessing %1.\": \"Počas prístupu k %1 sa vyskytlo porušenie uzamknutia.\",\n\t\"Disk full while accessing %1.\": \"Disk sa zaplnil počas prístupu na %1.\",\n\t\"An attempt was made to access %1 past its end.\": \"Pokus o prístup k %1 po jeho skončení.\",\n\t\"An attempt was made to write to the reading %1.\": \"Prebehol pokus o zápis do %1, ktorý sa načítava.\",\n\t\"An attempt was made to read from the writing %1.\": \"Prebehol pokus o čítanie %1, do ktorého sa zapisuje.\",\n\t\"%1 has a bad format.\": \"%1 má nesprávny formát.\",\n\t\"%1 contained an unexpected object.\": \"%1 obsahuje neočakávaný objekt.\",\n\t\"%1 contains an incorrect schema.\": \"%1 obsahuje nesprávnu schému.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"Vyberie pravouhlú časť obrázka, ktorá sa bude premiestňovať, kopírovať, alebo upravovať.\",\n\t\"Select\": \"Výber\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"Ohraničením vyberie časť obrázka, ktorá sa bude premiestňovať, kopírovať, alebo upravovať.\",\n\t\"Free-Form Select\": \"Laso\",\n\t\"Inserts text into the picture.\": \"Vloží text do obrázka.\",\n\t\"Fills an area with the current drawing color.\": \"Vyplní oblasť aktuálnou farbou pera.\",\n\t\"Fill With Color\": \"Farebná výplň\",\n\t\"Draws a straight line with the selected line width.\": \"Kreslí čiaru vybratej hrúbky.\",\n\t\"Line\": \"Čiara\",\n\t\"Draws using an airbrush of the selected size.\": \"Kreslí sprejom vybratej veľkosti.\",\n\t\"Airbrush\": \"Sprej\",\n\t\"Draws a curved line with the selected line width.\": \"Kreslí krivku vybratej hrúbky.\",\n\t\"Curve\": \"Krivka\",\n\t\"Draws a polygon with the selected fill style.\": \"Kreslí mnohouholník s vybratou výplňou.\",\n\t\"Polygon\": \"Mnohouholník\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"Kreslí zaoblený obdĺžnik s vybratou výplňou.\",\n\t\"Rounded Rectangle\": \"Zaoblený obdĺžnik\",\n\t\"Draws a free-form line one pixel wide.\": \"Kreslí od ruky čiaru hrúbky jedného bodu.\",\n\t\"Pencil\": \"Ceruzka\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"Vymaže časť obrázka vybratým tvarom gumy.\",\n\t\"Eraser/Color Eraser\": \"Guma a guma farieb\",\n\t\"Changes the magnification.\": \"Zmení mierku zobrazenia.\",\n\t\"Magnifier\": \"Lupa\",\n\t\"Picks up a color from the picture for drawing.\": \"Vyberie farbu z obrázka do pera.\",\n\t\"Pick Color\": \"Kvapkadlo\",\n\t\"Draws using a brush with the selected shape and size.\": \"Kreslí štetcom vybratého tvaru a hrúbky.\",\n\t\"Brush\": \"Štetec\",\n\t\"Draws a rectangle with the selected fill style.\": \"Kreslí obdĺžnik s vybratou výplňou.\",\n\t\"Rectangle\": \"Obdĺžnik\",\n\t\"Draws a filled rectangle.\": \"Kreslí plný obdĺžnik.\",\n\t\"Draws an ellipse with the selected fill style.\": \"Kreslí elipsu s vybratou výplňou.\",\n\t\"Ellipse\": \"Elipsa\",\n\t\"Draws a filled ellipse.\": \"Kreslí plnú elipsu.\",\n\t\"Makes the current selection either opaque or transparent.\": \"Urobí aktuálny výber nepriehľadným, alebo priehľadným.\",\n\t\"Creates a new color.\": \"Vytvorí novú farbu.\",\n\t\"Uses a previously saved palette of colors.\": \"Použije už uloženú paletu farieb.\",\n\t\"Saves the current palette of colors to a file.\": \"Uloží túto paletu farieb do súboru.\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"Predtým, než obrázok použijete ako tapetu, musíte ho uložiť.\",\n\t\"The selection is now larger than the bitmap.\": \"Vybraná časť je teraz väčšia ako bitová mapa.\",\n\t\"Would you like the bitmap enlarged?\": \"Má sa bitová mapa zväčšiť?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"Obrázok v Schránke je väčší ako bitová mapa.\",\n\t\"The file is not in the correct format.\": \"Formát súboru nie je správny.\",\n\t\"Not enough room to paste text.\": \"Na prilepenie textu nie je dostatok miesta.\",\n\t\"Enlarge the text area and try again.\": \"Zväčšite oblasť pre text a pokúste sa znova.\",\n\t\"Places the text.\": \"Umiestni text.\"\n});\n"
  },
  {
    "path": "localization/sl/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"sl\", {\n\t\"Attributes\": \"Atributi\",\n\t\"MS Shell Dlg\": \"MS Sans Serif\",\n\t\"&Width:\": \"&Širina:\",\n\t\"Width:\": \"Širina:\",\n\t\"&Height:\": \"&Višina:\",\n\t\"Height:\": \"Višina:\",\n\t\"Units\": \"Enote\",\n\t\"&Inches\": \"pal&ci\",\n\t\"Inches\": \"palci\",\n\t\"C&m\": \"c&m\",\n\t\"Cm\": \"cm\",\n\t\"&Pixels\": \"p&el\",\n\t\"Pixels\": \"pel\",\n\t\"Colors\": \"Barve\",\n\t\"&Black and white\": \"&Črno-belo\",\n\t\"Black and white\": \"Črno-belo\",\n\t\"Co&lors\": \"&Barvno\",\n\t\"Transparency\": \"Prosojnost\",\n\t\"Use &Transparent background color\": \"&Prosojna barva ozadja\",\n\t\"Use Transparent background color\": \"Prosojna barva ozadja\",\n\t\"Select &Color\": \"&Izberi barvo \",\n\t\"Select Color\": \"Izbira barve\",\n\t\"OK\": \"V redu\",\n\t\"Cancel\": \"Prekliči\",\n\t\"&Default\": \"P&rivzeto\",\n\t\"Default\": \"Privzeto\",\n\t\"Custom Zoom\": \"Po meri\",\n\t\"Current zoom:\": \"Trenutni faktor:\",\n\t\"Zoom to\": \"Faktor povečave\",\n\t\"Flip and Rotate\": \"Zrcaljenje in sukanje\",\n\t\"Flip or rotate\": \"Zrcaljenje ali sukanje\",\n\t\"&Flip horizontal\": \"&Vodoravno zrcaljenje\",\n\t\"Flip horizontal\": \"Vodoravno zrcaljenje\",\n\t\"Flip &vertical\": \"&Navpično zrcaljenje\",\n\t\"Flip vertical\": \"Navpično zrcaljenje\",\n\t\"&Rotate by angle\": \"Sukanje &za\",\n\t\"Rotate by angle\": \"Sukanje za\",\n\t\"Stretch and Skew\": \"Raztegovanje in nagibanje\",\n\t\"Stretch\": \"Raztegovanje\",\n\t\"&Horizontal:\": \"&Vodoravno:\",\n\t\"Horizontal:\": \"Vodoravno:\",\n\t\"&Vertical:\": \"&Navpično:\",\n\t\"Vertical:\": \"Navpično:\",\n\t\"Skew\": \"Nagibanje\",\n\t\"H&orizontal:\": \"V&odoravno:\",\n\t\"Degrees\": \"stopinj\",\n\t\"V&ertical:\": \"N&avpično:\",\n\t\"Color Table\": \"Barvna tabela\",\n\t\"New\": \"Nova\",\n\t\"&New \": \"&Nova \",\n\t\"New \": \"Nova \",\n\t\"&Help\": \"&Pomoč\",\n\t\"Help\": \"Pomoč\",\n\t\"Printing\": \"Tiskanje\",\n\t\"on the\": \"na\",\n\t\"&Print\": \"Na&tisni \",\n\t\"Print\": \"Natisni \",\n\t\"&Next Page\": \"&Naprej\",\n\t\"Next Page\": \"Naprej\",\n\t\"Pre&v Page\": \"N&azaj\",\n\t\"Prev Page\": \"Nazaj\",\n\t\"Zoom &In\": \"&Povečaj\",\n\t\"Zoom In\": \"Povečaj\",\n\t\"Zoom &Out\": \"P&omanjšaj\",\n\t\"Zoom Out\": \"Pomanjšaj\",\n\t\"&Close\": \"&Zapri\",\n\t\"Close\": \"Zapri\",\n\t\"Grid Settings\": \"Nastavitve mreže\",\n\t\"&Pixel Grid\": \"&Fina mreža\",\n\t\"Pixel Grid\": \"Fina mreža\",\n\t\"&Tile Grid\": \"&Groba mreža\",\n\t\"Tile Grid\": \"Groba mreža\",\n\t\"pixels\": \"slikovnih pik\",\n\t\"H&eight:\": \"&Višina:\",\n\t\"Text\": \"Besedilo\",\n\t\"Undo\": \"Razveljavi\",\n\t\"Cut\": \"Izreži\",\n\t\"Copy\": \"Kopiraj\",\n\t\"Paste\": \"Prilepi\",\n\t\"Clear Selection\": \"Izbriši izbor\",\n\t\"Select All\": \"Izberi vse\",\n\t\"Text Toolbar\": \"Oblikovanje besedila\",\n\t\"Selection\": \"Izbor\",\n\t\"Cu&t\": \"&Izreži\",\n\t\"&Copy\": \"&Kopiraj\",\n\t\"&Paste\": \"&Prilepi\",\n\t\"C&lear Selection\": \"Izbri&ši izbor\",\n\t\"Select &All\": \"Izberi &vse\",\n\t\"C&opy To\": \"Kopir&aj v \",\n\t\"Copy To\": \"Kopiranje v datoteko\",\n\t\"Paste &From\": \"Pril&epi iz \",\n\t\"Paste From\": \"Lepljenje v izbor\",\n\t\"Flip/&Rotate\": \"&Zrcali/Zasukaj \",\n\t\"Flip/Rotate\": \"Zrcali/Zasukaj \",\n\t\"&Stretch/Skew\": \"&Raztegni/Nagni \",\n\t\"Stretch/Skew\": \"Raztegni/Nagni \",\n\t\"&Invert Colors\": \"&Barvni negativ\",\n\t\"Invert Colors\": \"Barvni negativ\",\n\t\"Thumbnail\": \"Sličica\",\n\t\"&File\": \"&Datoteka\",\n\t\"File\": \"Datoteka\",\n\t\"&New\": \"&Nova\",\n\t\"&Open\": \"&Odpri \",\n\t\"Open\": \"Odpri\",\n\t\"&Save\": \"&Shrani\",\n\t\"Save\": \"Shrani\",\n\t\"Save &As\": \"Shrani &kot \",\n\t\"Save As\": \"Shrani kot\",\n\t\"Print Pre&view\": \"Pre&dogled tiskanja\",\n\t\"Print Preview\": \"Predogled tiskanja\",\n\t\"Page Se&tup\": \"P&riprava strani \",\n\t\"Page Setup\": \"Priprava strani \",\n\t\"S&end\": \"Po&šlji \",\n\t\"Send\": \"Pošlji \",\n\t\"Set As &Wallpaper (Tiled)\": \"Kot oz&adje (razpostavi)\",\n\t\"Set As Wallpaper (Tiled)\": \"Kot ozadje (razpostavi)\",\n\t\"Set As Wa&llpaper (Centered)\": \"Kot ozadj&e (na sredino)\",\n\t\"Set As Wallpaper (Centered)\": \"Kot ozadje (na sredino)\",\n\t\"Recent File\": \"Nedavna datoteka\",\n\t\"E&xit\": \"Iz&hod\",\n\t\"Exit\": \"Izhod\",\n\t\"&Edit\": \"&Urejanje\",\n\t\"Edit\": \"Urejanje\",\n\t\"&Undo\": \"&Razveljavi\",\n\t\"&Repeat\": \"P&onovi\",\n\t\"Repeat\": \"Ponovi\",\n\t\"&View\": \"Pogl&ed\",\n\t\"View\": \"Pogled\",\n\t\"&Tool Box\": \"&Orodja\",\n\t\"Tool Box\": \"Orodja\",\n\t\"&Color Box\": \"&Paleta z barvami\",\n\t\"Color Box\": \"Paleta z barvami\",\n\t\"Ctrl+L\": \"Ctrl+A\",\n\t\"&Status Bar\": \"&Vrstica stanja\",\n\t\"Status Bar\": \"Vrstica stanja\",\n\t\"T&ext Toolbar\": \"O&blikovanje besedila\",\n\t\"&Normal Size\": \"&Običajna velikost\",\n\t\"Normal Size\": \"Običajna velikost\",\n\t\"&Large Size\": \"&Velika povečava\",\n\t\"Large Size\": \"Velika povečava\",\n\t\"C&ustom\": \"&Po meri \",\n\t\"Custom\": \"Po meri \",\n\t\"Show &Grid\": \"Prikaži &mrežo\",\n\t\"Show Grid\": \"Prikaži mrežo\",\n\t\"Show T&humbnail\": \"Prikaži sl&ičico\",\n\t\"Show Thumbnail\": \"Prikaži sličico\",\n\t\"&View Bitmap\": \"&Celotna slika\",\n\t\"View Bitmap\": \"Celotna slika\",\n\t\"&Image\": \"&Slika\",\n\t\"Image\": \"Slika\",\n\t\"&Flip/Rotate\": \"&Zrcali/Zasukaj \",\n\t\"&Attributes\": \"&Atributi \",\n\t\"&Clear Image\": \"Izbri&ši sliko\",\n\t\"Clear Image\": \"Izbriši sliko\",\n\t\"Ctrl+Shft+N\": \"Ctrl+Shift+N\",\n\t\"&Draw Opaque\": \"&Riši prekrivajoče\",\n\t\"Draw Opaque\": \"Riši prekrivajoče\",\n\t\"&Colors\": \"&Barve\",\n\t\"&Edit Colors\": \"&Priprava barvne palete \",\n\t\"Edit Colors\": \"Priprava barvne palete\",\n\t\"&Help Topics\": \"&Teme pomoči\",\n\t\"Help Topics\": \"Teme pomoči\",\n\t\"&About Paint\": \"Vi&zitka\",\n\t\"About Paint\": \"Vizitka\",\n\t\"&Update\": \"&Posodobi\",\n\t\"Update\": \"Posodobi\",\n\t\"Save Copy &As\": \"Shrani kopijo &kot \",\n\t\"Save Copy As\": \"Shrani kopijo kot\",\n\t\"Paint\": \"Slikar\",\n\t\"untitled\": \"neimenovana\",\n\t\"Bitmap Image\": \"Bitna slika\",\n\t\"Bitmap Files (*.bmp)\": \"Datoteke z bitnimi slikami (*.bmp)\",\n\t\"PCX Files\": \"PCX datoteke\",\n\t\"Icon Files\": \"Ikonske datoteke\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"Enobarvna bitna slika (*.bmp;*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"16-barvna bitna slika (*.bmp;*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"256-barvna bitna slika (*.bmp;*.dib)\",\n\t\"Paint cannot open this file.\": \"Datoteke ni mogoče odpreti.\",\n\t\"Paint cannot read this file.\": \"Datoteke ni mogoče prebrati.\",\n\t\"This file is read-only.\": \"Ta datoteka je samo za branje.\",\n\t\"To save your changes, use a different filename.\": \"Če želite shraniti spremembe, spremenite ime datoteke.\",\n\t\"This file is already open.\": \"Ta datoteka je že odprta.\",\n\t\"This is not a valid .PCS file.\": \"To ni veljavna .PCS datoteka.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"Ta datoteka je v uporabi in je ni mogoče prepisati.\",\n\t\"Use a different filename to save your changes.\": \"Če želite shraniti spremembe, spremenite ime datoteke.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"To ni veljavna datoteka z bitno sliko oz. ta format trenutno ni podprt.\",\n\t\"This is not a valid icon.\": \"To ni veljavna ikona.\",\n\t\"This is not a valid cursor.\": \"To ni veljavna kazalka.\",\n\t\"Save was interrupted, so your file has not been saved.\": \"Shranjevanje je bilo prekinjeno, zato datoteka ni bila shranjena.\",\n\t\"You cannot save to a read-only file.\": \"Datoteke, ki je samo za branje, ne morete shraniti.\",\n\t\"Use a different file name.\": \"Spremenite ime datoteke.\",\n\t\"This file is already in use.\": \"Ta datoteka je v uporabi.\",\n\t\"Close the program, and then try again.\": \"Končajte program in poskusite znova.\",\n\t\"Paint cannot save this file.\": \"Datoteke ni mogoče shraniti.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"Datoteke ni mogoče zapisati z drugačno obliko zapisa pod istim imenom.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"Razmik med črtami mreže mora biti celo število v obsegu od %d do %d.\",\n\t\"There is not enough memory or resources to complete operation.\": \"Na voljo ni dovolj pomnilnika ali sredstev, da bi bilo mogoče dokončati operacijo.\",\n\t\"Close some programs, and then try again.\": \"Končajte nekaj programov in zatem poskusite znova.\",\n\t\"Low on memory or resources.\": \"Zmanjkuje pomnilnika ali sredstev.\",\n\t\"Group error.\": \"Napaka pri združevanju v skupino.\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"Slikar ni uspel natisniti dokumenta. Poskrbite, da bo na disku dovolj prostora in da bo tiskalnik deloval pravilno.\",\n\t\"Saving into this format may cause some loss of color information.\": \"Shranjevanje v tej obliki ima lahko za posledico izgubo informacij o barvah.\",\n\t\"Do you want to continue?\": \"Ali želite nadaljevati?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"Pretvorbe v črno-belo sliko ni mogoče razveljaviti. Taka pretvorba vpliva na trenutno datoteko in ima za posledico izgubo informacij o barvah.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"Najmanjša razsežnost bitne slike sme biti ena slikovna pika.\",\n\t\"Generic error.\": \"Splošna napaka.\",\n\t\"File not found.\": \"Datoteke ni mogoče najti.\",\n\t\"Bad path.\": \"Neveljavna pot.\",\n\t\"Too many open files.\": \"Odprtih je preveč datotek.\",\n\t\"Access denied.\": \"Dostop zavrnjen.\",\n\t\"Invalid file.\": \"Neveljavna datoteka.\",\n\t\"Remove current folder.\": \"Izbriši trenutno mapo.\",\n\t\"Folder full.\": \"Mapa je polna.\",\n\t\"Bad seek.\": \"Napaka pri iskanju.\",\n\t\"Hard IO error.\": \"Vhodno-izhodna napaka.\",\n\t\"Sharing violation.\": \"Kršitev skupne rabe.\",\n\t\"Lock violation.\": \"Kršitev zaklepanja.\",\n\t\"Disk full.\": \"Disk je poln.\",\n\t\"End of file.\": \"Konec datoteke.\",\n\t\"Error getting the Clipboard Data!\": \"Napaka pri branju podatkov iz odložišča!\",\n\t\"No Printer Found @ page setup\": \"Med pripravo strani ni bilo mogoče najti tiskalnika\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"24-bitna bitna slika (*.bmp;*.dib)\",\n\t\"All Files\": \"Vse datoteke\",\n\t\"Palette|*.pal|\": \"Paleta|*.pal|\",\n\t\"OLE 2.0 was unable to start.\": \"OLE 2.0 ni bilo mogoče zagnati.\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"Poskrbite, da boste uporabljali pravo različico knjižnic OLE.\",\n\t\"Resets the text be without any attributes.\": \"Izklopi vse atribute besedila.\",\n\t\"Sets or clears the text bold attribute.\": \"Vklopi ali izklopi krepki tisk.\",\n\t\"Sets or clears the text italic attribute.\": \"Vklopi ali izklopi ležeči tisk.\",\n\t\"Selects the font used by the text.\": \"Izbira pisave za besedilo.\",\n\t\"Selects the point size of the text.\": \"Izbira velikosti besedila.\",\n\t\"Sets or clears the text underline attribute.\": \"Vklopi ali izklopi podčrtavanje besedila.\",\n\t\"Shows or hides the tooltips.\": \"Prikaže ali skrije opise orodij.\",\n\t\"Show Paint Help.\": \"Prikaže pomoč.\",\n\t\"Sends a picture by using mail or fax.\": \"Sliko odpošlje po elektronski pošti ali s faksom.\",\n\t\"Copies the selection to a file.\": \"Prekopira izbor v datoteko.\",\n\t\"Pastes a file into the selection.\": \"V izbor prilepi vsebino datoteke.\",\n\t\"Zooms the picture to 100%.\": \"Prikaže sliko v naravni velikosti.\",\n\t\"Zooms the picture to 400%.\": \"Prikaže sliko štirikrat povečano.\",\n\t\"Zooms the picture.\": \"Omogoča izbiro faktorja povečave.\",\n\t\"Displays the entire picture.\": \"Prikaže celotno sliko.\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"Prikaže ali skrije sličico.\",\n\t\"Shows or hides the grid.\": \"Prikaže ali skrije mrežo.\",\n\t\"Shows or hides the text toolbar.\": \"Prikaže ali skrije vrstico za oblikovanje besedila.\",\n\t\"Flips or rotates the picture or a selection.\": \"Zrcali ali zasuka sliko ali izbor.\",\n\t\"Stretches or skews the picture or a selection.\": \"Raztegne ali nagne sliko ali izbor.\",\n\t\"Inverts the colors of the picture or a selection.\": \"Sliko ali izbor prikaže kot negativ.\",\n\t\"Changes the attributes of the picture.\": \"Spremeni atribute slike.\",\n\t\"Clears the picture or selection.\": \"Izbriše sliko ali izbor.\",\n\t\"The font size must be a numeric value.\": \"Za velikost pisave morate vnesti številko.\",\n\t\"Contains commands for working with the selected item(s).\": \"Ukazi za delo z izbranimi elementi.\",\n\t\"Contains commands for selecting and transferring items.\": \"Ukazi za izbiranje in prenos elementov.\",\n\t\"Contains commands for customizing this window.\": \"Ukazi za spreminjanje videza okna.\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"Ukazi za obdelavo slik in postavljanje atributov.\",\n\t\"Contains commands for using custom colors and drawing options.\": \"Ukazi za uporabo namešanih barv in možnosti za risanje.\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"Ukaza za prikaz pomoči in informacij o programu.\",\n\t\"Cannot save file.\": \"Datoteke ni mogoče shraniti.\",\n\t\"Error removing temporary file.\": \"Napaka pri brisanju začasne datoteke.\",\n\t\"Get Colors\": \"Odpiranje barvne palete\",\n\t\"Save Colors\": \"Shranjevanje barvne palete\",\n\t\"File last saved:\": \"Zadnjič shranjeno:\",\n\t\"Not Available\": \"ni na voljo\",\n\t\"Size on disk:\": \"Velikost na disku:\",\n\t\"%s bytes\": \"%sB\",\n\t\"Painting\": \"Slikanje\",\n\t\"Fonts\": \"Pisave\",\n\t\"Tools\": \"Orodja\",\n\t\"All Picture Files\": \"vse slikovne datoteke\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"Če potrebujete pomoč, kliknite ukaz »Teme pomoči« v meniju »Pomoč«.\",\n\t\"Select an area on which to get Help.\": \"Izberite področje, o katerem želite dobiti informacije.\",\n\t\"%1 in %2\": \"%1 v %2\",\n\t\"Creates a new document.\": \"Ustvari nov dokument.\",\n\t\"Opens an existing document.\": \"Odpre obstoječ dokument.\",\n\t\"Closes the active document.\": \"Zapre aktivni dokument.\",\n\t\"Saves the active document.\": \"Shrani aktivni dokument.\",\n\t\"Saves the active document with a new name.\": \"Shrani aktivni dokument pod novim imenom.\",\n\t\"Changes the page layout.\": \"Spremeni postavitev strani.\",\n\t\"Specifies the default printer setup.\": \"Definira privzete nastavitve za tiskalnik.\",\n\t\"Prints the active document and sets printing options.\": \"Omogoča nastavitev možnosti za tiskanje in natisne dokument.\",\n\t\"Displays full pages.\": \"Prikaže cele strani.\",\n\t\"Opens this document.\": \"Odpre ta dokument.\",\n\t\"Deletes the selection.\": \"Izbriše izbor.\",\n\t\"Erases everything.\": \"Izbriše vse.\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"Prekopira izbor in ga shrani v odložišče.\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"Izreže izbor in ga shrani v odložišče.\",\n\t\"Finds the specified text.\": \"Poišče navedeno besedilo.\",\n\t\"Inserts the contents of the Clipboard.\": \"Vstavi vsebino odložišča.\",\n\t\"Repeats the last action.\": \"Ponovi zadnje dejanje.\",\n\t\"Replaces specific text with different text.\": \"Zamenja določeno besedilo z drugim.\",\n\t\"Selects everything.\": \"Izbere vse.\",\n\t\"Undoes the last action.\": \"Razveljavi zadnje dejanje.\",\n\t\"Redoes the previously undone action.\": \"Ponovno uveljavi prej razveljavljeno dejanje.\",\n\t\"Displays program information, version number, and copyright.\": \"Informacije o programu, številki različice in avtorskih pravicah.\",\n\t\"Quits Paint.\": \"Izhod iz programa.\",\n\t\"Opens Paint Help.\": \"Odpre pomoč.\",\n\t\"Displays instructions about how to use Help.\": \"Prikaže navodila za uporabo pomoči.\",\n\t\"Displays Help for areas you click on.\": \"Prikaže opis elementa, ki ga kliknete.\",\n\t\"Displays Help for the current task or command.\": \"Prikaže pojasnilo v zvezi s trenutnim opravilom ali ukazom.\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"Sliko za ozadje ustvari tako, da postavi bitno sliko na sredino.\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"Sliko za ozadje ustvari tako, da razpostavi bitne slike po zaslonu.\",\n\t\"Sends the selection using mail or fax.\": \"Izbor odpošlje po elektronski pošti ali s faksom.\",\n\t\"Prints the selection.\": \"Natisne izbor.\",\n\t\"Shows or hides the thumbnail.\": \"Prikaže ali skrije sličico.\",\n\t\"Shows Paint Help.\": \"Prikaže pomoč.\",\n\t\"Shows or hides the status bar.\": \"Prikaže ali skrije vrstico stanja.\",\n\t\"Shows or hides the tool box.\": \"Prikaže ali skrije orodja.\",\n\t\"Shows or hides the color box.\": \"Prikaže ali skrije barvno paleto.\",\n\t\"Only a Far East font can be used for vertical editing.\": \"Za navpično urejanje lahko uporabite samo daljnevzhodno pisavo.\",\n\t\"Changes the window size.\": \"Spremeni velikost okna.\",\n\t\"Changes the window position.\": \"Spremeni položaj okna.\",\n\t\"Reduces the window to an icon.\": \"Zmanjša okno na velikost ikone.\",\n\t\"Enlarges the window to full size.\": \"Poveča okno na največjo velikost.\",\n\t\"Switches to the next document window.\": \"Preklopi v naslednje dokumentno okno.\",\n\t\"Switches to the previous document window.\": \"Preklopi v prejšnje dokumentno okno.\",\n\t\"Closes the active window and asks if you want to save changes.\": \"Zapre aktivno okno in vas povpraša, ali želite shraniti spremembe.\",\n\t\"Restores the window to normal size.\": \"Obnovi običajno velikost okna.\",\n\t\"Activates the task list.\": \"Aktivira seznam opravil.\",\n\t\"All Files (*.*)\": \"Vse datoteke (*.*)\",\n\t\"Untitled\": \"Neimenovana\",\n\t\"an unnamed file\": \"neimenovana datoteka\",\n\t\"&Hide\": \"&Skrij\",\n\t\"Hide\": \"Skrij\",\n\t\"No error message is available.\": \"Na voljo ni nobenega sporočila o napaki.\",\n\t\"An unsupported operation was attempted.\": \"Prišlo je do poskusa izvedbe nepodprte operacije.\",\n\t\"A required resource was unavailable.\": \"Zahtevano sredstvo ni bilo na voljo.\",\n\t\"Out of memory.\": \"Zmanjkalo je pomnilnika.\",\n\t\"An unknown error has occurred.\": \"Prišlo je do neznane napake.\",\n\t\"on %1\": \"na %1\",\n\t\"&One Page\": \"&Ena stran\",\n\t\"One Page\": \"Ena stran\",\n\t\"&Two Page\": \"&Dve strani\",\n\t\"Two Page\": \"Dve strani\",\n\t\"Page %u\": \"Stran %u\",\n\t\"Pages %u-%u\": \"Strani %u-%u\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"Tiskalniške datoteke (*.prn)|*.prn|Vse datoteke (*.*)|*.*||\",\n\t\"Print to File\": \"Tiskanje v datoteko\",\n\t\"to %1\": \"v %1\",\n\t\"&Update %1\": \"&Posodobi %1\",\n\t\"Update %1\": \"Posodobi %1\",\n\t\"E&xit && Return to %1\": \"I&zhod in vrnitev v %1\",\n\t\"Exit & Return to %1\": \"Izhod in vrnitev v %1\",\n\t\"Linked %s\": \"Povezan %s\",\n\t\"Unknown Type\": \"Neznana vrsta\",\n\t\"Invalid filename.\": \"Neveljavno ime datoteke.\",\n\t\"Failed to open document.\": \"Dokumenta ni bilo mogoče odpreti.\",\n\t\"Failed to save document.\": \"Dokumenta ni bilo mogoče shraniti.\",\n\t\"Save changes to %1?\": \"Ali želite shraniti spremembe v %1?\",\n\t\"Failed to create empty document.\": \"Praznega dokumenta ni bilo mogoče ustvariti.\",\n\t\"The file is too large to open.\": \"Datoteke ni mogoče odpreti, ker je prevelika.\",\n\t\"Could not start print job.\": \"Tiskalnega posla ni bilo mogoče začeti.\",\n\t\"Failed to launch help.\": \"Pomoči ni bilo mogoče zagnati.\",\n\t\"Internal application error.\": \"Notranja napaka programa.\",\n\t\"Command failed.\": \"Ukaz se ni izvedel.\",\n\t\"Insufficient memory to perform operation.\": \"Za izvedbo operacije ni dovolj pomnilnika.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"Vnosi v sistemski register so bili odstranjeni in INI datoteka je bila izbrisana.\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"Vsi vnosi v sistemski register (ali INI datoteko) niso bili odstranjeni.\",\n\t\"This program requires the file %s, which was not found on this system.\": \"Ta program zahteva datoteko %s, ki je na tem računalniku ni bilo mogoče najti.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"Ta program je povezan z manjkajočim %s v datoteki %s. Morda ima ta računalnik nezdružljivo različico %s.\",\n\t\"Please enter an integer.\": \"Vnesite celo število.\",\n\t\"Please enter a number.\": \"Vnesite število.\",\n\t\"Please enter an integer between %1 and %2.\": \"Vnesite celo število med %1 in %2.\",\n\t\"Please enter a number between %1 and %2.\": \"Vnesite število med %1 in %2.\",\n\t\"Please enter no more than %1 characters.\": \"Največje dovoljeno število znakov je %1.\",\n\t\"Please select a button.\": \"Izberite gumb.\",\n\t\"Please enter an integer between 0 and 255.\": \"Vnesite celo število med 0 in 255.\",\n\t\"Please enter a positive integer.\": \"Vnesite pozitivno celo število.\",\n\t\"Please enter a date and/or time.\": \"Vnesite datum in/ali čas.\",\n\t\"Please enter a currency.\": \"Vnesite valuto.\",\n\t\"Unexpected file format.\": \"Nepričakovana oblika zapisa datoteke.\",\n\t\"Cannot find this file.\": \"Te datoteke ni mogoče najti.\",\n\t\"Please verify that the correct path and file name are given.\": \"Preverite, ali ste pravilno vnesli ime datoteke in mesto.\",\n\t\"Destination disk drive is full.\": \"Ciljni pogon je poln.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"Datoteke %1 ni mogoče brati, ker jo je odprl nekdo drug.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"V datoteko %1 ni mogoče pisati, ker je samo za branje ali pa jo ima nekdo odprto.\",\n\t\"An unexpected error occurred while reading %1.\": \"Pri branju %1 je prišlo do nepričakovane napake.\",\n\t\"An unexpected error occurred while writing %1.\": \"Pri pisanju %1 je prišlo do nepričakovane napake.\",\n\t\"Unable to register document.\": \"Dokumenta ni mogoče registrirati.\",\n\t\"The document may already be open.\": \"Morda je že odprt.\",\n\t\"Update %1 before proceeding?\": \"Ali želite zdaj posodobiti %1?\",\n\t\"Could not update client.\": \"Odjemalca ni bilo mogoče posodobiti.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"Registracija ni uspela. ActiveX funkcije morda ne bodo delovale pravilno.\",\n\t\"Failed to update the system registry.\": \"Sistemskega registra ni bilo mogoče posodobiti.\",\n\t\"Please try using REGEDIT.\": \"Poskusite uporabiti REGEDIT.\",\n\t\"Unable to read write-only property.\": \"Lastnosti »samo za pisanje« ni mogoče prebrati.\",\n\t\"Unable to write read-only property.\": \"Lastnosti »samo za branje« ni mogoče zapisati.\",\n\t\"Unable to load mail system support.\": \"Podpore za poštni sistem ni bilo mogoče naložiti.\",\n\t\"Mail system DLL is invalid.\": \"DLL knjižnica poštnega sistema ni veljavna.\",\n\t\"Send Mail failed to send message.\": \"Sporočila ni bilo mogoče poslati.\",\n\t\"No error occurred.\": \"Brez napak\",\n\t\"An unknown error occurred while accessing %1.\": \"Pri dostopu do %1 je prišlo do neznane napake.\",\n\t\"%1 was not found.\": \"%1 ni bilo mogoče najti.\",\n\t\"%1 contains an invalid path.\": \"%1 vsebuje neveljavno pot.\",\n\t\"%1 could not be opened because there are too many open files.\": \"%1 ni bilo mogoče odpreti, ker je preveč odprtih datotek.\",\n\t\"Access to %1 was denied.\": \"Dostop do %1 je bil zavrnjen.\",\n\t\"An invalid file handle was associated with %1.\": \"Datoteki %1 je bila dodeljena neveljavna koda za dostop.\",\n\t\"%1 could not be removed because it is the current directory.\": \"%1 ni mogoče odstraniti, ker je to trenutna mapa.\",\n\t\"%1 could not be created because the directory is full.\": \"%1 ni bilo mogoče ustvariti, ker je mapa polna.\",\n\t\"Seek failed on %1\": \"Pozicioniranje na %1 je spodletelo.\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"Pri dostopu do %1 je bila javljena V/I napaka.\",\n\t\"A sharing violation occurred while accessing %1.\": \"Pri dostopu do %1 je prišlo do kršitve skupne rabe.\",\n\t\"A locking violation occurred while accessing %1.\": \"Pri dostopu do %1 je prišlo do kršitve zaklepanja.\",\n\t\"Disk full while accessing %1.\": \"Pri dostopu do %1 je na disku zmanjkalo prostora.\",\n\t\"An attempt was made to access %1 past its end.\": \"Prišlo je do poskusa dostopa prek konca %1.\",\n\t\"An attempt was made to write to the reading %1.\": \"Prišlo je do poskusa pisanja v brano %1.\",\n\t\"An attempt was made to read from the writing %1.\": \"Prišlo je do poskusa branja iz zapisovane %1.\",\n\t\"%1 has a bad format.\": \"%1 ima napačno obliko zapisa.\",\n\t\"%1 contained an unexpected object.\": \"%1 vsebuje nepričakovani predmet.\",\n\t\"%1 contains an incorrect schema.\": \"%1 vsebuje nepravilno shemo.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"Označi pravokotni del slike, ki ga lahko premaknete, kopirate ali uredite.\",\n\t\"Select\": \"Izbor\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"Izbere poljubno oblikovan del slike, ki ga lahko premaknete, kopirate ali uredite.\",\n\t\"Free-Form Select\": \"Prostoročni izbor\",\n\t\"Inserts text into the picture.\": \"V sliko vstavi besedilo.\",\n\t\"Fills an area with the current drawing color.\": \"Področje zapolni s trenutno izbrano barvo.\",\n\t\"Fill With Color\": \"Barvno polnilo\",\n\t\"Draws a straight line with the selected line width.\": \"Risanje ravne črte izbrane širine.\",\n\t\"Line\": \"Črta\",\n\t\"Draws using an airbrush of the selected size.\": \"Risanje z razpršilcem izbrane širine.\",\n\t\"Airbrush\": \"Razpršilec\",\n\t\"Draws a curved line with the selected line width.\": \"Risanje krivulje izbrane širine.\",\n\t\"Curve\": \"Krivulja\",\n\t\"Draws a polygon with the selected fill style.\": \"Risanje mnogokotnika z izbranim polnilom.\",\n\t\"Polygon\": \"Mnogokotnik\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"Risanje zaobljenega pravokotnika z izbranim polnilom.\",\n\t\"Rounded Rectangle\": \"Zaobljeni pravokotnik\",\n\t\"Draws a free-form line one pixel wide.\": \"Prostoročno risanje črte s širino ene slikovne pike.\",\n\t\"Pencil\": \"Svinčnik\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"Brisanje dela slike z izbrano vrsto radirke.\",\n\t\"Eraser/Color Eraser\": \"Radirka/Barvna radirka\",\n\t\"Changes the magnification.\": \"Spremeni povečavo.\",\n\t\"Magnifier\": \"Lupa\",\n\t\"Picks up a color from the picture for drawing.\": \"Orodje za izbiro barve risanja iz slike.\",\n\t\"Pick Color\": \"Kapalka\",\n\t\"Draws using a brush with the selected shape and size.\": \"Risanje s čopičem izbrane oblike in velikosti.\",\n\t\"Brush\": \"Čopič\",\n\t\"Draws a rectangle with the selected fill style.\": \"Risanje pravokotnika z izbranim polnilom.\",\n\t\"Rectangle\": \"Pravokotnik\",\n\t\"Draws a filled rectangle.\": \"Risanje pobarvanega pravokotnika.\",\n\t\"Draws an ellipse with the selected fill style.\": \"Risanje elipse z izbranim polnilom.\",\n\t\"Ellipse\": \"Elipsa\",\n\t\"Draws a filled ellipse.\": \"Risanje pobarvane elipse.\",\n\t\"Makes the current selection either opaque or transparent.\": \"Naredi trenutni izbor prozoren ali neprozoren.\",\n\t\"Creates a new color.\": \"Ustvari novo barvo.\",\n\t\"Uses a previously saved palette of colors.\": \"Odpre shranjeno barvno paleto.\",\n\t\"Saves the current palette of colors to a file.\": \"Trenutno barvno paleto shrani v datoteko.\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"Datoteko morate shraniti, preden jo lahko uporabite kot ozadje.\",\n\t\"The selection is now larger than the bitmap.\": \"Izbor je večji kot bitna slika.\",\n\t\"Would you like the bitmap enlarged?\": \"Ali želite povečati bitno sliko?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"Slika v odložišču je večja kot bitna slika.\",\n\t\"The file is not in the correct format.\": \"Oblika zapisa datoteke ni pravilna.\",\n\t\"Not enough room to paste text.\": \"Na voljo ni dovolj prostora, da bi bilo mogoče prilepiti besedilo.\",\n\t\"Enlarge the text area and try again.\": \"Povečajte področje za besedilo in poskusite znova.\",\n\t\"Places the text.\": \"Namesti besedilo.\"\n});\n"
  },
  {
    "path": "localization/sv/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"sv\", {\n\t\"Attributes\": \"Inställningar\",\n\t\"&Width:\": \"&Bredd:\",\n\t\"Width:\": \"Bredd:\",\n\t\"&Height:\": \"&Höjd:\",\n\t\"Height:\": \"Höjd:\",\n\t\"Units\": \"Enhet\",\n\t\"&Inches\": \"&tum\",\n\t\"Inches\": \"tum\",\n\t\"C&m\": \"&cm\",\n\t\"Cm\": \"cm\",\n\t\"&Pixels\": \"b&ildpunkter\",\n\t\"Pixels\": \"bildpunkter\",\n\t\"Colors\": \"Färger\",\n\t\"&Black and white\": \"Svart&vit\",\n\t\"Black and white\": \"Svartvit\",\n\t\"Co&lors\": \"&Färger\",\n\t\"Transparency\": \"Transparens\",\n\t\"Use &Transparent background color\": \"&Använd transparent bakgrundsfärg\",\n\t\"Use Transparent background color\": \"Använd transparent bakgrundsfärg\",\n\t\"Select &Color\": \"Välj f&ärg\",\n\t\"Select Color\": \"Välj färg\",\n\t\"Cancel\": \"Avbryt\",\n\t\"&Default\": \"&Standard\",\n\t\"Default\": \"Standard\",\n\t\"Custom Zoom\": \"Anpassad zoomning\",\n\t\"Current zoom:\": \"Aktuell zoomning:\",\n\t\"Zoom to\": \"Zooma till\",\n\t\"&100%\": \"&100 %\",\n\t\"100%\": \"100 %\",\n\t\"&200%\": \"&200 %\",\n\t\"200%\": \"200 %\",\n\t\"&400%\": \"&400 %\",\n\t\"400%\": \"400 %\",\n\t\"&600%\": \"&600 %\",\n\t\"600%\": \"600 %\",\n\t\"&800%\": \"&800 %\",\n\t\"800%\": \"800 %\",\n\t\"Flip and Rotate\": \"Vänd och rotera\",\n\t\"Flip or rotate\": \"Vänd eller rotera\",\n\t\"&Flip horizontal\": \"Vänd &horisontellt\",\n\t\"Flip horizontal\": \"Vänd horisontellt\",\n\t\"Flip &vertical\": \"Vänd &vertikalt\",\n\t\"Flip vertical\": \"Vänd vertikalt\",\n\t\"&Rotate by angle\": \"&Rotera med vinkeln\",\n\t\"Rotate by angle\": \"Rotera med vinkeln\",\n\t\"Stretch and Skew\": \"Ändra storlek och snedställ\",\n\t\"Stretch\": \"Ändra storlek\",\n\t\"&Horizontal:\": \"&Vågrätt:\",\n\t\"Horizontal:\": \"Vågrätt:\",\n\t\"&Vertical:\": \"&Lodrätt:\",\n\t\"Vertical:\": \"Lodrätt:\",\n\t\"Skew\": \"Snedställ\",\n\t\"H&orizontal:\": \"V&ågrätt:\",\n\t\"Degrees\": \"grader\",\n\t\"V&ertical:\": \"Lo&drätt:\",\n\t\"Color Table\": \"Färgtabell\",\n\t\"New\": \"Ny\",\n\t\"&New \": \"&Ny(tt)\",\n\t\"New \": \"Ny(tt)\",\n\t\"&Help\": \"&Hjälp\",\n\t\"Help\": \"Hjälp\",\n\t\"Printing\": \"Skriver ut\",\n\t\"on the\": \"på\",\n\t\"&Print\": \"&Skriv ut\",\n\t\"Print\": \"Skriv ut\",\n\t\"&Next Page\": \"&Nästa sida\",\n\t\"Next Page\": \"Nästa sida\",\n\t\"Pre&v Page\": \"&Föreg sida\",\n\t\"Prev Page\": \"Föreg sida\",\n\t\"Zoom &In\": \"Zooma &in\",\n\t\"Zoom In\": \"Zooma in\",\n\t\"Zoom &Out\": \"Zooma &ut\",\n\t\"Zoom Out\": \"Zooma ut\",\n\t\"&Close\": \"St&äng\",\n\t\"Close\": \"Stäng\",\n\t\"Grid Settings\": \"Inställningar för rutnät\",\n\t\"&Pixel Grid\": \"&Punktrutnät\",\n\t\"Pixel Grid\": \"Punktrutnät\",\n\t\"&Tile Grid\": \"&Vanligt rutnät\",\n\t\"Tile Grid\": \"Vanligt rutnät\",\n\t\"pixels\": \"bildpunkter\",\n\t\"H&eight:\": \"&Höjd:\",\n\t\"Undo\": \"Ångra\",\n\t\"Cut\": \"Klipp ut\",\n\t\"Copy\": \"Kopiera\",\n\t\"Paste\": \"Klistra in\",\n\t\"Clear Selection\": \"Radera markering\",\n\t\"Select All\": \"Markera allt\",\n\t\"Text Toolbar\": \"Verktygsfältet Formatera\",\n\t\"Selection\": \"Markering\",\n\t\"Cu&t\": \"&Klipp ut\",\n\t\"&Copy\": \"K&opiera\",\n\t\"&Paste\": \"K&listra in\",\n\t\"C&lear Selection\": \"&Radera markering\",\n\t\"Select &All\": \"&Markera allt\",\n\t\"C&opy To\": \"Kopiera &till\",\n\t\"Copy To\": \"Kopiera till\",\n\t\"Paste &From\": \"Klistra in &från\",\n\t\"Paste From\": \"Klistra in från\",\n\t\"Flip/&Rotate\": \"&Vänd/Rotera\",\n\t\"Flip/Rotate\": \"Vänd/Rotera\",\n\t\"&Stretch/Skew\": \"&Ändra storlek/Snedställ\",\n\t\"Stretch/Skew\": \"Ändra storlek/Snedställ\",\n\t\"&Invert Colors\": \"&Invertera färger\",\n\t\"Invert Colors\": \"Invertera färger\",\n\t\"Thumbnail\": \"Miniatyr\",\n\t\"&File\": \"&Arkiv\",\n\t\"File\": \"Arkiv\",\n\t\"&New\": \"&Nytt\",\n\t\"&Open\": \"&Öppna\",\n\t\"Open\": \"Öppna\",\n\t\"&Save\": \"&Spara\",\n\t\"Save\": \"Spara\",\n\t\"Save &As\": \"Spara so&m\",\n\t\"Save As\": \"Spara som\",\n\t\"Print Pre&view\": \"För&handsgranska\",\n\t\"Print Preview\": \"Förhandsgranska\",\n\t\"Page Se&tup\": \"Utskri&ftsformat\",\n\t\"Page Setup\": \"Utskriftsformat\",\n\t\"S&end\": \"S&kicka\",\n\t\"Send\": \"Skicka\",\n\t\"Set As &Wallpaper (Tiled)\": \"Använd som skrivbordsunderlägg (s&ida vid sida)\",\n\t\"Set As Wallpaper (Tiled)\": \"Använd som skrivbordsunderlägg (sida vid sida)\",\n\t\"Set As Wa&llpaper (Centered)\": \"Använd som skrivbordsunderlägg (&centrerad)\",\n\t\"Set As Wallpaper (Centered)\": \"Använd som skrivbordsunderlägg (centrerad)\",\n\t\"Recent File\": \"Senaste fil\",\n\t\"E&xit\": \"&Avsluta\",\n\t\"Exit\": \"Avsluta\",\n\t\"&Edit\": \"&Redigera\",\n\t\"Edit\": \"Redigera\",\n\t\"&Undo\": \"&Ångra\",\n\t\"&Repeat\": \"&Upprepa\",\n\t\"Repeat\": \"Upprepa\",\n\t\"Ctrl+A\": \"Ctrl+L\",\n\t\"&View\": \"Vi&sa\",\n\t\"View\": \"Visa\",\n\t\"&Tool Box\": \"&Verktygslåda\",\n\t\"Tool Box\": \"Verktygslåda\",\n\t\"&Color Box\": \"&Färglåda\",\n\t\"Color Box\": \"Färglåda\",\n\t\"Ctrl+L\": \"Ctrl+A\",\n\t\"&Status Bar\": \"&Statusfält\",\n\t\"Status Bar\": \"Statusfält\",\n\t\"T&ext Toolbar\": \"Verktygsfältet F&ormatera\",\n\t\"&Zoom\": \"&Zooma\",\n\t\"Zoom\": \"Zooma\",\n\t\"&Normal Size\": \"&Normal storlek\",\n\t\"Normal Size\": \"Normal storlek\",\n\t\"&Large Size\": \"&Förstoring\",\n\t\"Large Size\": \"Förstoring\",\n\t\"C&ustom\": \"&Egen zoomning\",\n\t\"Custom\": \"Egen zoomning\",\n\t\"Show &Grid\": \"Visa &rutnät\",\n\t\"Show Grid\": \"Visa rutnät\",\n\t\"Show T&humbnail\": \"Visa &miniatyr\",\n\t\"Show Thumbnail\": \"Visa miniatyr\",\n\t\"&View Bitmap\": \"Visa &bitmapp\",\n\t\"View Bitmap\": \"Visa bitmapp\",\n\t\"&Image\": \"&Bild\",\n\t\"Image\": \"Bild\",\n\t\"&Flip/Rotate\": \"&Vänd/Rotera\",\n\t\"&Attributes\": \"&Inställningar\",\n\t\"&Clear Image\": \"&Radera bild\",\n\t\"Clear Image\": \"Radera bild\",\n\t\"Ctrl+Shft+N\": \"Ctrl+Skift+N\",\n\t\"&Draw Opaque\": \"Ri&ta heltäckande objekt\",\n\t\"Draw Opaque\": \"Rita heltäckande objekt\",\n\t\"&Colors\": \"&Färger\",\n\t\"&Edit Colors\": \"&Redigera färger\",\n\t\"Edit Colors\": \"Redigera färger\",\n\t\"&Help Topics\": \"&Hjälpavsnitt\",\n\t\"Help Topics\": \"Hjälpavsnitt\",\n\t\"&About Paint\": \"&Om Paint\",\n\t\"About Paint\": \"Om Paint\",\n\t\"&Update\": \"Upp&datera\",\n\t\"Update\": \"Uppdatera\",\n\t\"Save Copy &As\": \"&Spara kopia som\",\n\t\"Save Copy As\": \"Spara kopia som\",\n\t\"untitled\": \"namnlös\",\n\t\"Bitmap Image\": \"Bitmappsbild\",\n\t\"Bitmap Files (*.bmp)\": \"Bitmappsfiler (*.BMP)\",\n\t\"PCX Files\": \"PCX-fil\",\n\t\"Icon Files\": \"Ikon-filer\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"Monokrom bitmapp (*.BMP;*.DIB)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"16-färgers bitmapp (*.BMP;*.DIB)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"256-färgers bitmapp (*.BMP;*.DIB)\",\n\t\"Paint cannot open this file.\": \"Det går inte att öppna filen.\",\n\t\"Paint cannot read this file.\": \"Ett läsfel inträffade när filen laddades.\",\n\t\"This file is read-only.\": \"Filen är skrivskyddad.\",\n\t\"To save your changes, use a different filename.\": \"Använd ett annat filnamn.\",\n\t\"This file is already open.\": \"Filen är redan öppen.\",\n\t\"This is not a valid .PCS file.\": \"Det här är inte en giltig PCS-fil.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"Filen är öppen för redigering och kan inte skrivas över.\",\n\t\"Use a different filename to save your changes.\": \"Använd ett annat filnamn.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"Ogiltig bitmappsbild eller format som inte stöds.\",\n\t\"This is not a valid icon.\": \"Detta är inte en giltig ikon.\",\n\t\"This is not a valid cursor.\": \"Detta är inte giltig markör.\",\n\t\"Save was interrupted, so your file has not been saved.\": \"Kommandot avbröts. Filen sparades inte.\",\n\t\"You cannot save to a read-only file.\": \"Du kan inte spara en skrivskyddad fil.\",\n\t\"Use a different file name.\": \"Använd ett annat filnamn.\",\n\t\"This file is already in use.\": \"Filen används redan.\",\n\t\"Close the program, and then try again.\": \"Stäng programmet och försök igen.\",\n\t\"Paint cannot save this file.\": \"Det går inte att spara filen.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"Det går inte att spara filen med samma namn i ett annat filformat.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"Värdet för mellanrum i rutnätet måste vara ett heltal mellan %d och %d.\",\n\t\"There is not enough memory or resources to complete operation.\": \"Det finns inte tillräckligt med ledigt minne för att slutföra åtgärden.\",\n\t\"Close some programs, and then try again.\": \"Stäng några program och försök igen.\",\n\t\"Low on memory or resources.\": \"Det finns inte tillräckligt med ledigt minne.\",\n\t\"Group error.\": \"Gruppfel\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"Paint kunde inte skriva ut dokumentet. Kontrollera att det finns tillräckligt med ledigt minne och att skrivaren fungerar korrekt.\",\n\t\"Saving into this format may cause some loss of color information.\": \"Om du sparar i detta format kan du förlora färginformation.\",\n\t\"Do you want to continue?\": \"Vill du fortsätta?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"Det går inte att ångra konvertering till svartvitt. Det här kommandot påverkar den aktiva filen så att du kan förlora färginformation.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"Sidan på en bitmapp måste vara större än en bildpunkt.\",\n\t\"Generic error.\": \"Allmänt fel.\",\n\t\"File not found.\": \"Det gick inte att hitta filen.\",\n\t\"Bad path.\": \"Felaktig sökväg.\",\n\t\"Too many open files.\": \"För många öppna filer.\",\n\t\"Access denied.\": \"Åtkomst nekad.\",\n\t\"Invalid file.\": \"Ogiltig fil.\",\n\t\"Remove current folder.\": \"Ta bort aktuell mapp.\",\n\t\"Folder full.\": \"Mappen är full.\",\n\t\"Bad seek.\": \"Felaktig sökning.\",\n\t\"Hard IO error.\": \"Maskinvaru-I/O-fel.\",\n\t\"Sharing violation.\": \"Fildelningsfel.\",\n\t\"Lock violation.\": \"Fillåsningsfel\",\n\t\"Disk full.\": \"Disken är full.\",\n\t\"End of file.\": \"Slutet på filen.\",\n\t\"Error getting the Clipboard Data!\": \"Det gick inte att hämta information från Urklipp!\",\n\t\"No Printer Found @ page setup\": \"Hittade ingen skrivare @ Utskriftsformat\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"24-bitars bitmapp (*.BMP;*.DIB)\",\n\t\"All Files\": \"Alla filer\",\n\t\"Palette|*.pal|\": \"Palett|*.pal|\",\n\t\"OLE 2.0 was unable to start.\": \"Det gick inte att starta OLE 2.0.\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"Kontrollera att du använder rätt version av OLE-biblioteket.\",\n\t\"Resets the text be without any attributes.\": \"Återställer texten så att alla formateringar försvinner.\",\n\t\"Sets or clears the text bold attribute.\": \"Formaterar med fet stil eller tar bort fet stil.\",\n\t\"Sets or clears the text italic attribute.\": \"Formaterar med kursiv stil eller tar bort kursiv stil.\",\n\t\"Selects the font used by the text.\": \"Väljer teckensnitt.\",\n\t\"Selects the point size of the text.\": \"Väljer teckenstorlek.\",\n\t\"Sets or clears the text underline attribute.\": \"Stryker under text eller ta bort understrykning.\",\n\t\"Shows or hides the tooltips.\": \"Visar/döljer knappbeskrivning.\",\n\t\"Show Paint Help.\": \"Visa Hjälpen.\",\n\t\"Sends a picture by using mail or fax.\": \"Skickar en bild via Mail eller fax.\",\n\t\"Copies the selection to a file.\": \"Kopierar markerat område till en fil.\",\n\t\"Pastes a file into the selection.\": \"Klistrar in en fil i markeringen.\",\n\t\"Zooms the picture to 100%.\": \"Zoomar 100 %.\",\n\t\"Zooms the picture to 400%.\": \"Zoomar 400 %.\",\n\t\"Zooms the picture.\": \"Zoomar.\",\n\t\"Displays the entire picture.\": \"Visar hela bilden.\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"Visar/döljer miniatyr.\",\n\t\"Shows or hides the grid.\": \"Visar/döljer rutnät.\",\n\t\"Shows or hides the text toolbar.\": \"Visar/döljer verktygsfältet Formatera.\",\n\t\"Flips or rotates the picture or a selection.\": \"Vänder eller roterar en bild eller markering.\",\n\t\"Stretches or skews the picture or a selection.\": \"Ändrar storlek på eller snedställer bilden eller markeringen.\",\n\t\"Inverts the colors of the picture or a selection.\": \"Inverterar färgerna på bilden eller markeringen.\",\n\t\"Changes the attributes of the picture.\": \"Ändrar bildinställningar.\",\n\t\"Clears the picture or selection.\": \"Rensar bilden eller markeringen.\",\n\t\"The font size must be a numeric value.\": \"Teckenstorlek måste vara ett numeriskt värde.\",\n\t\"Contains commands for working with the selected item(s).\": \"Innehåller kommandon för att arbeta med markerade objekt.\",\n\t\"Contains commands for selecting and transferring items.\": \"Innehåller kommandon för att markera och flytta objekt.\",\n\t\"Contains commands for customizing this window.\": \"Innehåller kommandon för att anpassa fönstret.\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"Innehåller kommandon för att ändra bilder och sätta attribut.\",\n\t\"Contains commands for using custom colors and drawing options.\": \"Innehåller kommandon för att använda anpassade färger.\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"Innehåller kommandon för att visa Hjälp och information om Paint.\",\n\t\"Cannot save file.\": \"Det går inte att spara filen.\",\n\t\"Error removing temporary file.\": \"Ett fel inträffade när en temporär fil togs bort.\",\n\t\"Get Colors\": \"Hämta färger\",\n\t\"Save Colors\": \"Spara färger\",\n\t\"File last saved:\": \"Senast sparad:\",\n\t\"Not Available\": \"Ej tillgängligt\",\n\t\"Size on disk:\": \"Storlek på disk:\",\n\t\"%s bytes\": \"%s byte\",\n\t\"Painting\": \"Målning\",\n\t\"Fonts\": \"Formatera\",\n\t\"Tools\": \"Verktyg\",\n\t\"All Picture Files\": \"Alla bildfiler\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"Välj Hjälpavsnitt på Hjälp-menyn om du vill ha hjälp.\",\n\t\"Select an area on which to get Help.\": \"Välj det område du vill söka hjälp om.\",\n\t\"%1 in %2\": \"%1 i %2\",\n\t\"Creates a new document.\": \"Skapar ett nytt dokument.\",\n\t\"Opens an existing document.\": \"Öppnar ett befintligt dokument.\",\n\t\"Closes the active document.\": \"Stänger det aktiva dokumentet.\",\n\t\"Saves the active document.\": \"Sparar det aktiva dokumentet.\",\n\t\"Saves the active document with a new name.\": \"Sparar det aktiva dokumentet med ett nytt namn.\",\n\t\"Changes the page layout.\": \"Ändrar utskriftsformat.\",\n\t\"Specifies the default printer setup.\": \"Anger standardinställning för skrivaren.\",\n\t\"Prints the active document and sets printing options.\": \"Skriver ut aktivt dokument och ställer in utskriftsalternativ.\",\n\t\"Displays full pages.\": \"Visar hela sidor.\",\n\t\"Opens this document.\": \"Öppnar dokumentet.\",\n\t\"Deletes the selection.\": \"Raderar markeringen.\",\n\t\"Erases everything.\": \"Raderar allt.\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"Kopierar markeringen och lägger den i Urklipp.\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"Klipper ut markeringen och lägger den i Urklipp.\",\n\t\"Finds the specified text.\": \"Söker efter angiven text.\",\n\t\"Inserts the contents of the Clipboard.\": \"Infogar innehållet i Urklipp.\",\n\t\"Repeats the last action.\": \"Gör om senaste kommando.\",\n\t\"Replaces specific text with different text.\": \"Ersätter angiven text med annan text.\",\n\t\"Selects everything.\": \"Markerar allt.\",\n\t\"Undoes the last action.\": \"Ångrar senaste kommando.\",\n\t\"Redoes the previously undone action.\": \"Gör om senast ångrade åtgärd.\",\n\t\"Displays program information, version number, and copyright.\": \"Visar programinformation, versionsnummer och copyright.\",\n\t\"Quits Paint.\": \"Avslutar Paint\",\n\t\"Opens Paint Help.\": \"Öppnar Hjälp.\",\n\t\"Displays instructions about how to use Help.\": \"Visar hur du använder Hjälp.\",\n\t\"Displays Help for areas you click on.\": \"Visar Hjälp för de områden du markerar.\",\n\t\"Displays Help for the current task or command.\": \"Visar Hjälp för aktuell uppgift eller kommando.\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"Centrerar bitmappen som skrivbordsunderlägg.\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"Lägger bitmappen sida vid sida som skrivbordsunderlägg.\",\n\t\"Sends the selection using mail or fax.\": \"Skickar markeringen via Mail eller fax.\",\n\t\"Prints the selection.\": \"Skriver ut markeringen.\",\n\t\"Shows or hides the thumbnail.\": \"Visar/döljer miniatyr.\",\n\t\"Shows Paint Help.\": \"Visar Hjälpen.\",\n\t\"Shows or hides the status bar.\": \"Visar/döljer statusfält.\",\n\t\"Shows or hides the tool box.\": \"Visar/döljer verktygslådan.\",\n\t\"Shows or hides the color box.\": \"Visar/döljer färglådan.\",\n\t\"Only a Far East font can be used for vertical editing.\": \"Endast en Fjärran östern-teckensnitt kan redigeras vertikalt.\",\n\t\"Changes the window size.\": \"Ändrar fönstrets storlek.\",\n\t\"Changes the window position.\": \"Ändrar fönstrets läge på skärmen.\",\n\t\"Reduces the window to an icon.\": \"Förminskar fönstret till en ikon.\",\n\t\"Enlarges the window to full size.\": \"Maximerar fönstret till full storlek.\",\n\t\"Switches to the next document window.\": \"Växlar till nästa dokumentfönster.\",\n\t\"Switches to the previous document window.\": \"Växlar till föregående dokumentfönster.\",\n\t\"Closes the active window and asks if you want to save changes.\": \"Stänger aktivt fönster och frågar om du vill spara ändringar.\",\n\t\"Restores the window to normal size.\": \"Återställer fönstret till normal storlek.\",\n\t\"Activates the task list.\": \"Visar aktiva program.\",\n\t\"All Files (*.*)\": \"Alla filer (*.*)\",\n\t\"Untitled\": \"Namnlös\",\n\t\"an unnamed file\": \"en namnlös fil\",\n\t\"&Hide\": \"&Dölj\",\n\t\"Hide\": \"Dölj\",\n\t\"No error message is available.\": \"Inget felmeddelande finns tillgängligt.\",\n\t\"An unsupported operation was attempted.\": \"Det har gjorts ett försök att utföra en åtgärd som inte stöds.\",\n\t\"A required resource was unavailable.\": \"En resurs som krävs var inte tillgänglig.\",\n\t\"Out of memory.\": \"Otillräckligt minne.\",\n\t\"An unknown error has occurred.\": \"Ett okänt fel har uppstått.\",\n\t\"on %1\": \"på %1\",\n\t\"&One Page\": \"&En sida\",\n\t\"One Page\": \"En sida\",\n\t\"&Two Page\": \"&Två sidor\",\n\t\"Two Page\": \"Två sidor\",\n\t\"Page %u\": \"Sidan %u\",\n\t\"Pages %u-%u\": \"Sidorna %u-%u\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"Skrivarfiler (*.prn)|*.prn|Alla filer (*.*)|*.*||\",\n\t\"Print to File\": \"Skriv ut till fil\",\n\t\"to %1\": \"till %1\",\n\t\"&Update %1\": \"&Uppdatera %1\",\n\t\"Update %1\": \"Uppdatera %1\",\n\t\"E&xit && Return to %1\": \"A&vsluta och återvänd till %1\",\n\t\"Exit & Return to %1\": \"Avsluta och återvänd till %1\",\n\t\"Linked %s\": \"Länkad %s\",\n\t\"Unknown Type\": \"Okänd typ\",\n\t\"Invalid filename.\": \"Ogiltigt filnamn.\",\n\t\"Failed to open document.\": \"Det gick inte att öppna dokumentet.\",\n\t\"Failed to save document.\": \"Det gick inte att spara dokumentet.\",\n\t\"Save changes to %1?\": \"Vill du spara ändringar till %1?\",\n\t\"Failed to create empty document.\": \"Det gick inte att skapa ett tomt dokument.\",\n\t\"The file is too large to open.\": \"Filen är för stor för att kunna öppnas.\",\n\t\"Could not start print job.\": \"Det gick inte att starta utskriften.\",\n\t\"Failed to launch help.\": \"Det gick inte att starta hjälpen.\",\n\t\"Internal application error.\": \"Internt programfel.\",\n\t\"Command failed.\": \"Kommandot misslyckades.\",\n\t\"Insufficient memory to perform operation.\": \"Det finns inte tillräckligt med minne för att utföra åtgärden.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"INI-filen och systemets registervärden har tagits bort.\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"Inte alla registervärden (eller INI-filen) har tagits bort.\",\n\t\"This program requires the file %s, which was not found on this system.\": \"Detta program kräver filen %s,Som inte kunde hittas i det här systemet.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"Detta program är länkat till den saknade exporten %s i filen %s. Den här datorn har eventuellt en inkompatibel version av %s.\",\n\t\"Please enter an integer.\": \"Ange ett heltal.\",\n\t\"Please enter a number.\": \"Ange ett tal.\",\n\t\"Please enter an integer between %1 and %2.\": \"Ange ett heltal mellan %1 och %2.\",\n\t\"Please enter a number between %1 and %2.\": \"Ange ett tal mellan %1 och %2.\",\n\t\"Please enter no more than %1 characters.\": \"Ange högst %1 tecken.\",\n\t\"Please select a button.\": \"Välj en knapp.\",\n\t\"Please enter an integer between 0 and 255.\": \"Ange ett heltal mellan 0 och 255.\",\n\t\"Please enter a positive integer.\": \"Du måste ange ett positivt heltal.\",\n\t\"Please enter a date and/or time.\": \"Skriv ett datum och/eller tid.\",\n\t\"Please enter a currency.\": \"Skriv en valuta.\",\n\t\"Unexpected file format.\": \"Oväntat filformat.\",\n\t\"Cannot find this file.\": \"Det går inte att hitta filen.\",\n\t\"Please verify that the correct path and file name are given.\": \"Kontrollera sökväg och filnamn.\",\n\t\"Destination disk drive is full.\": \"Måldisken är full.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"Det går inte att läsa från %1, eftersom den är öppnad av en annan användare.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"Det går inte att skriva till %1, eftersom den är skrivskyddad eller öppnad av en annan användare.\",\n\t\"An unexpected error occurred while reading %1.\": \"Ett oväntat fel inträffade vid läsning av %1.\",\n\t\"An unexpected error occurred while writing %1.\": \"Ett oväntat fel inträffade vid skrivning till %1.\",\n\t\"Unable to register document.\": \"Det gick inte att öppna registerdokumentet.\",\n\t\"The document may already be open.\": \"Dokumentet kanske redan är öppet.\",\n\t\"Update %1 before proceeding?\": \"Vill du uppdatera %1 innan du fortsätter?\",\n\t\"Could not update client.\": \"Det gick inte att uppdatera klient.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"Det gick inte att registrera. Det är inte säkert att ActiveX-funktionerna kommer att fungera.\",\n\t\"Failed to update the system registry.\": \"Det gick inte att uppdatera systemregistret.\",\n\t\"Please try using REGEDIT.\": \"Använd REGEDIT.\",\n\t\"Unable to read write-only property.\": \"Det går inte att läsa skrivskyddat material.\",\n\t\"Unable to write read-only property.\": \"Det går inte att skriva till skrivskyddat material.\",\n\t\"Unable to load mail system support.\": \"Det gick inte att ladda stöd för e-postsystemet.\",\n\t\"Mail system DLL is invalid.\": \"E-postsystem-DLL:en är inte giltig.\",\n\t\"Send Mail failed to send message.\": \"Det gick inte att skicka meddelande.\",\n\t\"No error occurred.\": \"Inget fel inträffade.\",\n\t\"An unknown error occurred while accessing %1.\": \"Ett okänt fel inträffade vid åtkomst av %1.\",\n\t\"%1 was not found.\": \"%1 kunde inte hittas.\",\n\t\"%1 contains an invalid path.\": \"%1 innehåller en ogiltig sökväg.\",\n\t\"%1 could not be opened because there are too many open files.\": \"%1 kunde inte öppnas eftersom det finns för många öppnade filer.\",\n\t\"Access to %1 was denied.\": \"Åtkomst till %1 nekades.\",\n\t\"An invalid file handle was associated with %1.\": \"Det finns en ogiltig filreferens i %1.\",\n\t\"%1 could not be removed because it is the current directory.\": \"%1 kunde inte tas bort eftersom det är den aktuella katalogen.\",\n\t\"%1 could not be created because the directory is full.\": \"%1 kunde inte skapas eftersom katalogen är full.\",\n\t\"Seek failed on %1\": \"Sökningen på %1 misslyckades.\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"Hårdvarufel vid åtkomst till %1.\",\n\t\"A sharing violation occurred while accessing %1.\": \"Delningsfel vid åtkomst till %1.\",\n\t\"A locking violation occurred while accessing %1.\": \"Låsningsfel vid åtkomst till %1.\",\n\t\"Disk full while accessing %1.\": \"Diskutrymmet tog slut vid åtkomst till %1.\",\n\t\"An attempt was made to access %1 past its end.\": \"Det gjordes ett försök att nå %1 efter filslut.\",\n\t\"An attempt was made to write to the reading %1.\": \"Det går inte att skriva till %1 medan den läses.\",\n\t\"An attempt was made to read from the writing %1.\": \"Det går inte att läsa från %1 medan den skrivs.\",\n\t\"%1 has a bad format.\": \"%1 har felaktigt format.\",\n\t\"%1 contained an unexpected object.\": \"%1 innehåller ett oväntat objekt.\",\n\t\"%1 contains an incorrect schema.\": \"%1 innehåller ett felaktigt schema.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"Markerar en rektangulär del av bilden för att flytta, kopiera eller redigera.\",\n\t\"Select\": \"Markera\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"Markerar en del av bilden, med valfri form, för att flytta, kopiera eller redigera.\",\n\t\"Free-Form Select\": \"Markera valfri form\",\n\t\"Inserts text into the picture.\": \"Infogar text i bilden.\",\n\t\"Fills an area with the current drawing color.\": \"Fyller ett område med aktuell färg.\",\n\t\"Fill With Color\": \"Fyll\",\n\t\"Draws a straight line with the selected line width.\": \"Ritar en rät linje med markerad linjebredd.\",\n\t\"Line\": \"Linje\",\n\t\"Draws using an airbrush of the selected size.\": \"Ritar med en retuschspruta med markerad storlek.\",\n\t\"Airbrush\": \"Retuschspruta\",\n\t\"Draws a curved line with the selected line width.\": \"Ritar en kurvlinje med markerad linjebredd.\",\n\t\"Curve\": \"Kurvlinje\",\n\t\"Draws a polygon with the selected fill style.\": \"Ritar en polygon med markerad fyllning.\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"Ritar en rektangel med runda hörn med markerad fyllning.\",\n\t\"Rounded Rectangle\": \"Rundad rektangel\",\n\t\"Draws a free-form line one pixel wide.\": \"Ritar en frihandslinje med en bildpunkts bredd.\",\n\t\"Pencil\": \"Penna\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"Raderar en del av bilden med markerad form på radergummit.\",\n\t\"Eraser/Color Eraser\": \"Radergummi\",\n\t\"Changes the magnification.\": \"Ändrar förstoringen.\",\n\t\"Magnifier\": \"Förstora\",\n\t\"Picks up a color from the picture for drawing.\": \"Hämtar en färg från bilden för att rita med den.\",\n\t\"Pick Color\": \"Hämta färg\",\n\t\"Draws using a brush with the selected shape and size.\": \"Ritar med en pensel med markerad form och storlek.\",\n\t\"Brush\": \"Pensel\",\n\t\"Draws a rectangle with the selected fill style.\": \"Ritar en rektangel med markerad fyllning.\",\n\t\"Rectangle\": \"Rektangel\",\n\t\"Draws a filled rectangle.\": \"Ritar en fylld rektangel.\",\n\t\"Draws an ellipse with the selected fill style.\": \"Ritar en oval med markerad fyllning.\",\n\t\"Ellipse\": \"Oval\",\n\t\"Draws a filled ellipse.\": \"Ritar en fylld oval.\",\n\t\"Makes the current selection either opaque or transparent.\": \"Gör aktuell markering antingen ogenomskinlig eller genomskinlig.\",\n\t\"Creates a new color.\": \"Skapar en ny färg.\",\n\t\"Uses a previously saved palette of colors.\": \"Använder en tidigare sparat färgpalett.\",\n\t\"Saves the current palette of colors to a file.\": \"Sparar aktuell färgpalett till en fil.\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"Du måste spara filen innan du använder den som skrivbordsunderlägg.\",\n\t\"The selection is now larger than the bitmap.\": \"Markeringen är nu större än bitmappen.\",\n\t\"Would you like the bitmap enlarged?\": \"Vill du förstora bitmappen?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"Bilden i Urklipp är större än bitmappen.\",\n\t\"The file is not in the correct format.\": \"Filen har ett ogiltigt filformat.\",\n\t\"Not enough room to paste text.\": \"Textområdet är tillräckligt stort för att klistra in texten.\",\n\t\"Enlarge the text area and try again.\": \"Förstora textområdet och försök igen.\",\n\t\"Places the text.\": \"Placerar texten.\"\n});\n"
  },
  {
    "path": "localization/tr/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"tr\", {\n\t\"Attributes\": \"Öznitelikler\",\n\t\"&Width:\": \"&Genişlik:\",\n\t\"Width:\": \"Genişlik:\",\n\t\"&Height:\": \"&Yükseklik:\",\n\t\"Height:\": \"Yükseklik:\",\n\t\"Units\": \"Birimler\",\n\t\"&Inches\": \"İ&nç\",\n\t\"Inches\": \"İnç\",\n\t\"C&m\": \"&Cm\",\n\t\"Cm\": \"Cm\",\n\t\"&Pixels\": \"&Piksel\",\n\t\"Pixels\": \"Piksel\",\n\t\"Colors\": \"Renkler\",\n\t\"&Black and white\": \"&Siyah beyaz\",\n\t\"Black and white\": \"Siyah beyaz\",\n\t\"Co&lors\": \"&Renkli\",\n\t\"Transparency\": \"Saydamlık\",\n\t\"Use &Transparent background color\": \"S&aydam artalan rengi kullan\",\n\t\"Use Transparent background color\": \"Saydam artalan rengi kullan\",\n\t\"Select &Color\": \"Renk S&eç\",\n\t\"Select Color\": \"Renk Seç\",\n\t\"OK\": \"Tamam\",\n\t\"Cancel\": \"İptal\",\n\t\"&Default\": \"&Varsayılan\",\n\t\"Default\": \"Varsayılan\",\n\t\"Custom Zoom\": \"Özel Yakınlaştırma\",\n\t\"Current zoom:\": \"Geçerli yakınlaştırma:\",\n\t\"Zoom to\": \"Yakınlaştır\",\n\t\"&100%\": \"%&100 \",\n\t\"100%\": \"%100 \",\n\t\"&200%\": \"%&200 \",\n\t\"200%\": \"%200 \",\n\t\"&400%\": \"%&400 \",\n\t\"400%\": \"%400 \",\n\t\"&600%\": \"%&600 \",\n\t\"600%\": \"%600 \",\n\t\"&800%\": \"%&800 \",\n\t\"800%\": \"%800 \",\n\t\"Flip and Rotate\": \"Döndür ve Çevir\",\n\t\"MS Shell Dlg\": \"MS Sans Serif\",\n\t\"Flip or rotate\": \"Döndür veya çevir\",\n\t\"&Flip horizontal\": \"&Yatay çevir\",\n\t\"Flip horizontal\": \"Yatay çevir\",\n\t\"Flip &vertical\": \"&Dikey çevir\",\n\t\"Flip vertical\": \"Dikey çevir\",\n\t\"&Rotate by angle\": \"&Açılı döndür\",\n\t\"Rotate by angle\": \"Açılı döndür\",\n\t\"Stretch and Skew\": \"Uzat ve Eğ\",\n\t\"Stretch\": \"Uzat\",\n\t\"&Horizontal:\": \"Ya&tay:\",\n\t\"Horizontal:\": \"Yatay:\",\n\t\"&Vertical:\": \"&Dikey:\",\n\t\"Vertical:\": \"Dikey:\",\n\t\"Skew\": \"Eğ\",\n\t\"H&orizontal:\": \"Yata&y:\",\n\t\"Degrees\": \"Derece\",\n\t\"V&ertical:\": \"Di&key:\",\n\t\"Color Table\": \"Renk Tablosu\",\n\t\"New\": \"Yeni\",\n\t\"&New \": \"Y&eni \",\n\t\"New \": \"Yeni \",\n\t\"&Help\": \"&Yardım\",\n\t\"Help\": \"Yardım\",\n\t\"Printing\": \"Yazdırılan\",\n\t\"on the\": \"yazdırıldığı yazıcı\",\n\t\"&Print\": \"&Yazdır\",\n\t\"Print\": \"Yazdır\",\n\t\"&Next Page\": \"&Sonraki Sayfa\",\n\t\"Next Page\": \"Sonraki Sayfa\",\n\t\"Pre&v Page\": \"Ön&ceki Sayfa\",\n\t\"Prev Page\": \"Önceki Sayfa\",\n\t\"Zoom &In\": \"&Büyüt\",\n\t\"Zoom In\": \"Büyüt\",\n\t\"Zoom &Out\": \"Küçü&lt\",\n\t\"Zoom Out\": \"Küçült\",\n\t\"&Close\": \"K&apat\",\n\t\"Close\": \"Kapat\",\n\t\"Grid Settings\": \"Klavuz Ayarları\",\n\t\"&Pixel Grid\": \"&Piksel Klavuzu\",\n\t\"Pixel Grid\": \"Piksel Klavuzu\",\n\t\"&Tile Grid\": \"Klavu&z Döşe\",\n\t\"Tile Grid\": \"Klavuz Döşe\",\n\t\"pixels\": \"piksel\",\n\t\"H&eight:\": \"&Yükseklik:\",\n\t\"Text\": \"Metin\",\n\t\"Undo\": \"Geri Al\",\n\t\"Cut\": \"Kes\",\n\t\"Copy\": \"Kopyala\",\n\t\"Paste\": \"Yapıştır\",\n\t\"Clear Selection\": \"Seçileni Temizle\",\n\t\"Select All\": \"Tümünü Seç\",\n\t\"Text Toolbar\": \"Metin Araç Çubuğu\",\n\t\"Selection\": \"Seçim\",\n\t\"Cu&t\": \"&Kes\",\n\t\"&Copy\": \"K&opyala\",\n\t\"&Paste\": \"&Yapıştır\",\n\t\"C&lear Selection\": \"&Seçileni Temizle\",\n\t\"Select &All\": \"&Tümünü Seç\",\n\t\"C&opy To\": \"&Dosyaya Kopyala\",\n\t\"Copy To\": \"Kopyala\",\n\t\"Paste &From\": \"Dosyada&n Yapıştır\",\n\t\"Paste From\": \"Yapıştır\",\n\t\"Flip/&Rotate\": \"Döndür/Çe&vir\",\n\t\"Flip/Rotate\": \"Döndür/Çevir\",\n\t\"&Stretch/Skew\": \"&Uzat/Eğ\",\n\t\"Stretch/Skew\": \"Uzat/Eğ\",\n\t\"&Invert Colors\": \"R&enkleri Ters Çevir\",\n\t\"Invert Colors\": \"Renkleri Ters Çevir\",\n\t\"Thumbnail\": \"Parçacık\",\n\t\"&File\": \"&Dosya\",\n\t\"File\": \"Dosya\",\n\t\"&New\": \"&Yeni\",\n\t\"&Open\": \"&Aç\",\n\t\"Open\": \"Aç\",\n\t\"&Save\": \"Kayde&t\",\n\t\"Save\": \"Kaydet\",\n\t\"Save &As\": \"&Farklı Kaydet\",\n\t\"Save As\": \"Farklı Kaydet\",\n\t\"Print Pre&view\": \"Baskı Önizl&eme\",\n\t\"Print Preview\": \"Baskı Önizleme\",\n\t\"Page Se&tup\": \"&Sayfa Yapısı\",\n\t\"Page Setup\": \"Sayfa Yapısı\",\n\t\"S&end\": \"&Gönder\",\n\t\"Send\": \"Gönder\",\n\t\"Set As &Wallpaper (Tiled)\": \"Duvar Kağıdı &Olarak Ayarla (Döşeli)\",\n\t\"Set As Wallpaper (Tiled)\": \"Duvar Kağıdı Olarak Ayarla (Döşeli)\",\n\t\"Set As Wa&llpaper (Centered)\": \"D&uvar Kağıdı Olarak Ayarla (Ortalanmış)\",\n\t\"Set As Wallpaper (Centered)\": \"Duvar Kağıdı Olarak Ayarla (Ortalanmış)\",\n\t\"Recent File\": \"Son Dosya\",\n\t\"E&xit\": \"Çı&kış\",\n\t\"Exit\": \"Çıkış\",\n\t\"&Edit\": \"Dü&zen\",\n\t\"Edit\": \"Düzen\",\n\t\"&Undo\": \"&Geri Al\",\n\t\"&Repeat\": \"&Yinele\",\n\t\"Repeat\": \"Yinele\",\n\t\"&View\": \"&Görünüm\",\n\t\"View\": \"Görünüm\",\n\t\"&Tool Box\": \"&Araç Kutusu\",\n\t\"Tool Box\": \"Araç Kutusu\",\n\t\"&Color Box\": \"&Renk Kutusu\",\n\t\"Color Box\": \"Renk Kutusu\",\n\t\"&Status Bar\": \"&Durum Çubuğu\",\n\t\"Status Bar\": \"Durum Çubuğu\",\n\t\"T&ext Toolbar\": \"&Metin Araç Çubuğu\",\n\t\"&Zoom\": \"&Yakınlaştır\",\n\t\"Zoom\": \"Yakınlaştır\",\n\t\"&Normal Size\": \"&Normal Boyut\",\n\t\"Normal Size\": \"Normal Boyut\",\n\t\"&Large Size\": \"&Geniş Boyut\",\n\t\"Large Size\": \"Geniş Boyut\",\n\t\"C&ustom\": \"Ö&zel\",\n\t\"Custom\": \"Özel\",\n\t\"Show &Grid\": \"Klavuzu Gö&ster\",\n\t\"Show Grid\": \"Klavuzu Göster\",\n\t\"Show T&humbnail\": \"&Parçacığı Göster\",\n\t\"Show Thumbnail\": \"Parçacığı Göster\",\n\t\"&View Bitmap\": \"&Bit Eşlem Göster\",\n\t\"View Bitmap\": \"Bit Eşlem Göster\",\n\t\"&Image\": \"&Resim\",\n\t\"Image\": \"Resim\",\n\t\"&Flip/Rotate\": \"&Döndür/Çevir\",\n\t\"&Attributes\": \"Ö&znitelikler\",\n\t\"&Clear Image\": \"Res&mi Temizle\",\n\t\"Clear Image\": \"Resmi Temizle\",\n\t\"&Draw Opaque\": \"D&onuk Çiz\",\n\t\"Draw Opaque\": \"Donuk Çiz\",\n\t\"&Colors\": \"R&enkler\",\n\t\"&Edit Colors\": \"&Renkleri Düzenle\",\n\t\"Edit Colors\": \"Renkleri Düzenle\",\n\t\"&Help Topics\": \"&Yardım Konuları\",\n\t\"Help Topics\": \"Yardım Konuları\",\n\t\"&About Paint\": \"Paint &Hakkında\",\n\t\"About Paint\": \"Paint Hakkında\",\n\t\"&Update\": \"&Güncelleştir\",\n\t\"Update\": \"Güncelleştir\",\n\t\"Save Copy &As\": \"K&opyayı Farklı Kaydet\",\n\t\"Save Copy As\": \"Kopyayı Farklı Kaydet\",\n\t\"untitled\": \"adsız\",\n\t\"Bitmap Image\": \"Bit Eşlem Resmi\",\n\t\"Bitmap Files (*.bmp)\": \"Bit Eşlem Dosyaları\",\n\t\"PCX Files\": \"PCX Dosyaları\",\n\t\"Icon Files\": \"Simge Dosyaları\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"Tek Renkli Bit Eşlem (*.bmp;*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"16 Renkli Bit Eşlem (*.bmp;*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"256 Renkli Bit Eşlem (*.bmp;*.dib)\",\n\t\"Paint cannot open this file.\": \"Paint bu dosyayı açamıyor.\",\n\t\"Paint cannot read this file.\": \"Paint bu dosyayı okuyamıyor.\",\n\t\"This file is read-only.\": \"Bu dosya salt okunur.\",\n\t\"To save your changes, use a different filename.\": \"Değişikliklerinizi kaydetmek için, farklı bir dosya adı kullanın.\",\n\t\"This file is already open.\": \"Bu dosya zaten açık.\",\n\t\"This is not a valid .PCS file.\": \"Bu, geçerli bir .PCS dosyası değil.\",\n\t\"This file is open for editing and cannot be overwritten.\": \"Bu dosya düzenleme için açık ve üstüne yazılamaz.\",\n\t\"Use a different filename to save your changes.\": \"Değişikliklerinizi kaydetmek için farklı bir dosya adı kullanın.\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"Bu, geçerli bir bit eşlem dosyası değil veya bu biçim artık desteklenmiyor.\",\n\t\"This is not a valid icon.\": \"Bu, geçerli bir simge değil.\",\n\t\"This is not a valid cursor.\": \"Bu, geçerli bir imleç değil.\",\n\t\"Save was interrupted, so your file has not been saved.\": \"Kayıt kesildiğinden dosyanız kaydedilemedi.\",\n\t\"You cannot save to a read-only file.\": \"Salt okunur bir dosyayı kaydedemezsiniz.\",\n\t\"Use a different file name.\": \"Farklı bir dosya adı kullanın.\",\n\t\"This file is already in use.\": \"Bu dosya kullanımda.\",\n\t\"Close the program, and then try again.\": \"Programı kapatıp yeniden deneyin.\",\n\t\"Paint cannot save this file.\": \"Paint bu dosyayı kaydedemiyor.\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"Paint, aynı dosya adını farklı bir dosya türüyle kaydedemez.\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"Klavuz aralığı, %d ile %d arasında bir tamsayı olmalıdır.\",\n\t\"There is not enough memory or resources to complete operation.\": \"İşlemi tamamlamak için yeterli bellek veya kaynak yok.\",\n\t\"Close some programs, and then try again.\": \"Bazı programları kapatıp yeniden deneyin.\",\n\t\"Low on memory or resources.\": \"Bellek veya kaynak azlığı.\",\n\t\"Group error.\": \"Grup hatası.\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"Paint belgenizi yazdıramadı. Lütfen yeterli sabit disk alanınız olup olmadığından ve yazıcınızın düzgün çalışıp çalışmadığından emin olun.\",\n\t\"Saving into this format may cause some loss of color information.\": \"Bu biçimde saklamak bazı renk bilgilerinin kaybedilmesine neden olabilir .\",\n\t\"Do you want to continue?\": \"Devam etmek istiyor musunuz?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"Siyah beyaza dönüştürme işlemi geri alınamaz.  Bu eylem geçerli dosyayı etkiler ve bazı renk bilgilerinin kaybolmasına neden olabilir.\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"Bit eşlemler bir kenarda bir pikselden büyük olmalıdırlar.\",\n\t\"Generic error.\": \"Soysal hata.\",\n\t\"File not found.\": \"Dosya bulunamadı.\",\n\t\"Bad path.\": \"Hatalı yol.\",\n\t\"Too many open files.\": \"Açık dosya sayısı çok fazla.\",\n\t\"Access denied.\": \"Erişim engellendi.\",\n\t\"Invalid file.\": \"Geçersiz dosya.\",\n\t\"Remove current folder.\": \"Geçerli klasörü kaldırın.\",\n\t\"Folder full.\": \"Klasör dolu.\",\n\t\"Bad seek.\": \"Hatalı arama.\",\n\t\"Hard IO error.\": \"Donanım GÇ hatası.\",\n\t\"Sharing violation.\": \"Paylaşım ihlali.\",\n\t\"Lock violation.\": \"Kilitleme ihlali.\",\n\t\"Disk full.\": \"Disk dolu.\",\n\t\"End of file.\": \"Dosya sonu.\",\n\t\"Error getting the Clipboard Data!\": \"Pano Verisi alınırken hata!\",\n\t\"No Printer Found @ page setup\": \"Yazıcı Bulunamadı @ sayfa yapısı\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"24-bit Bit Eşlem (*.bmp;*.dib)\",\n\t\"All Files\": \"Tüm Dosyalar\",\n\t\"Palette|*.pal|\": \"Palet|*.pal|\",\n\t\"untitled.pal\": \"adsız.pal\",\n\t\"OLE 2.0 was unable to start.\": \"OLE 2.0 başlayamadı.\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"Doğru OLE kitaplığı sürümünü kullandığınızdan emin olun.\",\n\t\"Resets the text be without any attributes.\": \"Metni hiç özniteliği olmayacak şekilde sıfırlar.\",\n\t\"Sets or clears the text bold attribute.\": \"Metnin kalın özniteliğini ayarlar veya temizler.\",\n\t\"Sets or clears the text italic attribute.\": \"Metnin italik özniteliğini ayarlar veya temizler.\",\n\t\"Selects the font used by the text.\": \"Metin tarafından kullanılan yazı tipini seçer.\",\n\t\"Selects the point size of the text.\": \"Metnin nokta boyutunu seçer.\",\n\t\"Sets or clears the text underline attribute.\": \"Metnin altçizgi özniteliğini ayarlar veya temizler.\",\n\t\"Shows or hides the tooltips.\": \"Araç ipuçlarını gösterir veya gizler.\",\n\t\"Show Paint Help.\": \"Paint Yardımını Gösterir.\",\n\t\"Sends a picture by using mail or fax.\": \"Posta veya faks kullanarak resim gönderir.\",\n\t\"Copies the selection to a file.\": \"Seçimi bir dosyaya kopyalar.\",\n\t\"Pastes a file into the selection.\": \"Seçimin içine bir dosya yapıştırır.\",\n\t\"Zooms the picture to 100%.\": \"Resmi %100 boyutuna büyütür.\",\n\t\"Zooms the picture to 400%.\": \"Resmi %400 boyutuna büyütür.\",\n\t\"Zooms the picture.\": \"Resmi büyütür.\",\n\t\"Displays the entire picture.\": \"Tüm resmi gösterir.\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"Resmin parçacık görüntüsünü gösterir veya gizler.\",\n\t\"Shows or hides the grid.\": \"Klavuzu gösterir veya gizler.\",\n\t\"Shows or hides the text toolbar.\": \"Metin araç çubuğunu gösterir veya gizler.\",\n\t\"Flips or rotates the picture or a selection.\": \"Resmi veya bir seçimi döndürür veya çevirir.\",\n\t\"Stretches or skews the picture or a selection.\": \"Resmi veya bir seçimi uzatır veya eğer.\",\n\t\"Inverts the colors of the picture or a selection.\": \"Resmin veya bir seçimin renklerini evirir.\",\n\t\"Changes the attributes of the picture.\": \"Resmin özniteliklerini değiştirir.\",\n\t\"Clears the picture or selection.\": \"Resmi veya seçimi temizler.\",\n\t\"The font size must be a numeric value.\": \"Yazı tipi boyutu sayısal bir değer olmalıdır.\",\n\t\"Contains commands for working with the selected item(s).\": \"Seçili öğelerle çalışmak için komutlar içerir.\",\n\t\"Contains commands for selecting and transferring items.\": \"Öğeleri seçmek ve aktarmak için komutlar içerir.\",\n\t\"Contains commands for customizing this window.\": \"Bu pencereyi özelleştirmek için komutlar içerir.\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"Resimleri değiştirmek ve öznitelikleri ayarlamak için kullanılan komutlar içerir.\",\n\t\"Contains commands for using custom colors and drawing options.\": \"İsteğe uyarlanmış renkleri ve çizim nesnelerini kullanmak için komutlar içerir.\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"Paint hakkında bilgi ve Yardım göstermek için komutlar içerir.\",\n\t\"Cannot save file.\": \"Dosya kaydedilemiyor.\",\n\t\"Error removing temporary file.\": \"Geçici dosyayı kaldırma hatası.\",\n\t\"Get Colors\": \"Renkleri Al\",\n\t\"Save Colors\": \"Renkleri Kaydet\",\n\t\"File last saved:\": \"Son kayıt tarihi:\",\n\t\"Not Available\": \"Kullanım dışı\",\n\t\"Size on disk:\": \"Diskteki boyutu:\",\n\t\"%s bytes\": \"%s bayt\",\n\t\"Painting\": \"Boyama\",\n\t\"Fonts\": \"Yazıtipleri\",\n\t\"Tools\": \"Araçlar\",\n\t\"All Picture Files\": \"Tüm Resim Dosyaları\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"Yardım için Yardım Menüsü'ndeki Yardım Konuları'nı tıklatın.\",\n\t\"Select an area on which to get Help.\": \"Yardım almak istediğiniz alanı seçin.\",\n\t\"%1 in %2\": \"%2 içinde %1\",\n\t\"Creates a new document.\": \"Yeni bir belge oluşturur.\",\n\t\"Opens an existing document.\": \"Varolan bir belgeyi açar.\",\n\t\"Closes the active document.\": \"Etkin belgeyi kapatır.\",\n\t\"Saves the active document.\": \"Etkin belgeyi kaydeder.\",\n\t\"Saves the active document with a new name.\": \"Etkin belgeyi yeni bir adla kaydeder.\",\n\t\"Changes the page layout.\": \"Sayfa düzenini değiştirir.\",\n\t\"Specifies the default printer setup.\": \"Varsayılan yazıcı ayarlarını belirtir.\",\n\t\"Prints the active document and sets printing options.\": \"Etkin belgeyi yazdırır ve yazdırma seçeneklerini ayarlar.\",\n\t\"Displays full pages.\": \"Tam sayfa olarak gösterir.\",\n\t\"Opens this document.\": \"Bu belgeyi açar.\",\n\t\"Deletes the selection.\": \"Seçimi siler.\",\n\t\"Erases everything.\": \"Her şeyi siler.\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"Seçimi kopyalar ve Pano'ya koyar.\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"Seçimi keser ve Pano'ya koyar.\",\n\t\"Finds the specified text.\": \"Belirtilen metni bulur.\",\n\t\"Inserts the contents of the Clipboard.\": \"Pano içeriğini ekler.\",\n\t\"Repeats the last action.\": \"Son eylemi yineler.\",\n\t\"Replaces specific text with different text.\": \"Belirtilen metni farklı bir metinle değiştirir.\",\n\t\"Selects everything.\": \"Her şeyi seçer.\",\n\t\"Undoes the last action.\": \"Son eylemi geri alır.\",\n\t\"Redoes the previously undone action.\": \"Son geri alınan eylemi yineler.\",\n\t\"Displays program information, version number, and copyright.\": \"Program bilgisini, sürüm numarasını ve telif hakkını görüntüler.\",\n\t\"Quits Paint.\": \"Paint'ten çıkar.\",\n\t\"Opens Paint Help.\": \"Paint Yardımı'nı açar.\",\n\t\"Displays instructions about how to use Help.\": \"Yardım'ın nasıl kullanılacağı ile ilgili yönergeler görüntüler.\",\n\t\"Displays Help for areas you click on.\": \"Tıklattığınız alanlarla ilgili Yardım görüntüler.\",\n\t\"Displays Help for the current task or command.\": \"Geçerli görev veya komut için yardım ekranını gösterir.\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"Bu bit eşlemini masaüstü duvar kağıdı olarak ortalar.\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"Bu bit eşlemini masaüstü duvar kağıdı olarak döşer.\",\n\t\"Sends the selection using mail or fax.\": \"Seçimi posta veya faks kullanarak gönderir.\",\n\t\"Prints the selection.\": \"Seçimi yazdırır.\",\n\t\"Shows or hides the thumbnail.\": \"Parçacığı gösterir veya gizler.\",\n\t\"Shows Paint Help.\": \"Paint Yardımı'nı görüntüler.\",\n\t\"Shows or hides the status bar.\": \"Durum çubuğunu gösterir veya gizler.\",\n\t\"Shows or hides the tool box.\": \"Araç çubuğunu gösterir veya gizler.\",\n\t\"Shows or hides the color box.\": \"Renk kutusunu gösterir veya gizler.\",\n\t\"Only a Far East font can be used for vertical editing.\": \"Sadece Uzak Doğu yazıtipleri dikey yazmak için kullanılabilir.\",\n\t\"Changes the window size.\": \"Pencere boyutunu değiştirir.\",\n\t\"Changes the window position.\": \"Pencere konumunu değiştirir.\",\n\t\"Reduces the window to an icon.\": \"Pencereyi bir simge boyutuna küçültür.\",\n\t\"Enlarges the window to full size.\": \"Pencereyi tam boyuta genişletir.\",\n\t\"Switches to the next document window.\": \"Sonraki belge penceresine geçer.\",\n\t\"Switches to the previous document window.\": \"Önceki belge penceresine geçer.\",\n\t\"Closes the active window and asks if you want to save changes.\": \"Etkin pencereyi kapatır ve değişiklikleri kaydetmek isteyip istemediğinizi sorar.\",\n\t\"Restores the window to normal size.\": \"Pencereyi normal boyutuna döndürür.\",\n\t\"Activates the task list.\": \"Görev listesini etkinleştirir.\",\n\t\"All Files (*.*)\": \"Tüm Dosyalar (*.*)\",\n\t\"Untitled\": \"Adsız\",\n\t\"an unnamed file\": \"isimsiz bir dosya\",\n\t\"&Hide\": \"&Gizle\",\n\t\"Hide\": \"Gizle\",\n\t\"No error message is available.\": \"Geçerli hata iletisi yok.\",\n\t\"An unsupported operation was attempted.\": \"Desteklenmeyen bir işlem istendi.\",\n\t\"A required resource was unavailable.\": \"Gerekli bir kaynak kullanılmaz durumda.\",\n\t\"Out of memory.\": \"Bellek yetersiz.\",\n\t\"An unknown error has occurred.\": \"Bilinmeyen bir hata oluştu.\",\n\t\"on %1\": \"%1 üzerinde\",\n\t\"&One Page\": \"&Bir Sayfa\",\n\t\"One Page\": \"Bir Sayfa\",\n\t\"&Two Page\": \"İ&ki Sayfa\",\n\t\"Two Page\": \"İki Sayfa\",\n\t\"Page %u\": \"Sayfa %u\",\n\t\"Pages %u-%u\": \"Sayfa %u-%u\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"Yazıcı Dosyaları (*.prn)|*.prn|Tüm Dosyalar (*.*)|*.*||\",\n\t\"Print to File\": \"Dosyaya Yazdır\",\n\t\"to %1\": \"%1 dosyasına\",\n\t\"&Update %1\": \"%1 Nesnesini &Güncelleştir\",\n\t\"Update %1\": \"%1 Nesnesini Güncelleştir\",\n\t\"E&xit && Return to %1\": \"Çık ve %1 &Uygulamasına Geri Dön\",\n\t\"Exit & Return to %1\": \"Çık ve %1 Uygulamasına Geri Dön\",\n\t\"Linked %s\": \"Bağlı %s\",\n\t\"Unknown Type\": \"Bilinmeyen Tür\",\n\t\"Invalid filename.\": \"Geçersiz dosya adı.\",\n\t\"Failed to open document.\": \"Belge açılamadı.\",\n\t\"Failed to save document.\": \"Belge kaydedilemedi.\",\n\t\"Save changes to %1?\": \"%1 içindeki değişiklikler kaydedilsin mi?\",\n\t\"Failed to create empty document.\": \"Boş belge oluşturulamadı.\",\n\t\"The file is too large to open.\": \"Dosya açılamayacak kadar büyük.\",\n\t\"Could not start print job.\": \"Yazdırma işlemi başlatılamadı.\",\n\t\"Failed to launch help.\": \"Yardım başlatılamadı.\",\n\t\"Internal application error.\": \"İç uygulama hatası.\",\n\t\"Command failed.\": \"Komut başarısız.\",\n\t\"Insufficient memory to perform operation.\": \"İşlemi yürütmek için bellek yetersiz.\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"Sistem kayıt girdileri kaldırıldı ve (varsa) INI dosyaları silindi.\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"Sistem kayıt girdilerinin (veya INI dosyalarının) hepsi kaldırılmadı.\",\n\t\"This program requires the file %s, which was not found on this system.\": \"Bu program için, sisteminizde mevcut olmayan %s dosyası gereklidir.\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"Bu program %s dosyasındaki eksik dış %s 'e bağlanmış. Bu makinede %s 'in uyumsuz sürümü bulunuyor olabilir.\",\n\t\"Please enter an integer.\": \"Lütfen bir tamsayı girin.\",\n\t\"Please enter a number.\": \"Lütfen bir sayı girin.\",\n\t\"Please enter an integer between %1 and %2.\": \"Lütfen %1 ile %2 arasında bir tamsayı girin.\",\n\t\"Please enter a number between %1 and %2.\": \"Lütfen %1 ile %2 arasında bir sayı girin.\",\n\t\"Please enter no more than %1 characters.\": \"Lütfen en çok %1 karakter girin.\",\n\t\"Please select a button.\": \"Lütfen bir düğme seçin.\",\n\t\"Please enter an integer between 0 and 255.\": \"Lütfen 0 ile 255 arasında bir tamsayı girin.\",\n\t\"Please enter a positive integer.\": \"Lütfen pozitif bir tamsayı girin.\",\n\t\"Please enter a date and/or time.\": \"Lütfen tarih ve/veya saat girin.\",\n\t\"Please enter a currency.\": \"Lütfen para birimi girin.\",\n\t\"Unexpected file format.\": \"Beklenilmeyen dosya biçimi.\",\n\t\"Cannot find this file.\": \"Bu dosya bulunamıyor.\",\n\t\"Please verify that the correct path and file name are given.\": \"Lütfen doğru yolun ve dosya adının verildiğini doğrulayın.\",\n\t\"Destination disk drive is full.\": \"Hedef disk sürücü dolu.\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"%1 okunamıyor, başka birisi tarafından açılmış.\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"%1 dosyasına yazılamıyor, salt okunur veya bir başkası tarafından açılmış.\",\n\t\"An unexpected error occurred while reading %1.\": \"%1 dosyası okunurken beklenilmeyen bir hata oluştu.\",\n\t\"An unexpected error occurred while writing %1.\": \"%1 dosyası yazılırken beklenilmeyen bir hata oluştu.\",\n\t\"Unable to register document.\": \"Belge kaydedilemedi.\",\n\t\"The document may already be open.\": \"Belge zaten açık olabilir.\",\n\t\"Update %1 before proceeding?\": \"Devam etmeden önce %1 güncelleştirilsin mi?\",\n\t\"Could not update client.\": \"İstemci güncelleştirilemedi.\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"Kayıt yapılamadı. ActiveX özellikleri düzgün çalışmayabilir.\",\n\t\"Failed to update the system registry.\": \"Sistem kayıt defteri güncelleştirilemedi.\",\n\t\"Please try using REGEDIT.\": \"Lütfen REGEDIT'i kullanarak deneyin.\",\n\t\"Unable to read write-only property.\": \"Salt yazılır özelliği okunamıyor.\",\n\t\"Unable to write read-only property.\": \"Salt okunur özelliği yazılamıyor.\",\n\t\"Unable to load mail system support.\": \"Posta sistemi desteği yüklenemedi.\",\n\t\"Mail system DLL is invalid.\": \"Posta sistem DLL'i geçersiz.\",\n\t\"Send Mail failed to send message.\": \"Posta Gönder, ileti'yi gönderemedi.\",\n\t\"No error occurred.\": \"Hata oluşmadı.\",\n\t\"An unknown error occurred while accessing %1.\": \"%1 erişiminde bilinmeyen bir hata oluştu.\",\n\t\"%1 was not found.\": \"%1 bulunamadı.\",\n\t\"%1 contains an invalid path.\": \"%1 geçersiz bir yol içeriyor.\",\n\t\"%1 could not be opened because there are too many open files.\": \"Çok fazla açık dosya olduğundan %1 açılamadı.\",\n\t\"Access to %1 was denied.\": \"%1 erişimi engellendi.\",\n\t\"An invalid file handle was associated with %1.\": \"%1 ile geçersiz bir dosya tutamacı ilişkilendirilmiş.\",\n\t\"%1 could not be removed because it is the current directory.\": \"%1 geçerli dizin olduğundan kaldırılamadı.\",\n\t\"%1 could not be created because the directory is full.\": \"Dizin dolu olduğundan %1 oluşturulamadı.\",\n\t\"Seek failed on %1\": \"%1 üzerinde arama başarısız\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"%1 erişimi sırasında donanım G/Ç hatası bildirildi.\",\n\t\"A sharing violation occurred while accessing %1.\": \"%1 erişimi sırasında paylaşım ihlali oluştu.\",\n\t\"A locking violation occurred while accessing %1.\": \"%1 erişimi sırasında kilit ihlali oluştu.\",\n\t\"Disk full while accessing %1.\": \"%1 erişimi sırasında disk doldu.\",\n\t\"An attempt was made to access %1 past its end.\": \"%1 erişimi denemesi sonunu aştı.\",\n\t\"An attempt was made to write to the reading %1.\": \"%1 okumasına yazmaya çalışıldı.\",\n\t\"An attempt was made to read from the writing %1.\": \"%1 yazısından okunmaya çalışıldı.\",\n\t\"%1 has a bad format.\": \"%1 hatalı biçime sahip.\",\n\t\"%1 contained an unexpected object.\": \"%1 beklenmeyen bir nesne içerdi.\",\n\t\"%1 contains an incorrect schema.\": \"%1 doğru olmayan bir düzen içeriyor.\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"Taşımak, kopyalamak veya düzenlemek için resmin dikdörtgen bir parçasını seçer.\",\n\t\"Select\": \"Seç\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"Taşımak, kopyalamak veya düzenlemek için resmin serbest şekilli bir parçasını seçer.\",\n\t\"Free-Form Select\": \"Serbest Şekil Seçimi\",\n\t\"Inserts text into the picture.\": \"Metni resmin içine yerleştirir.\",\n\t\"Fills an area with the current drawing color.\": \"Bir alanı geçerli çizim rengiyle doldurur.\",\n\t\"Fill With Color\": \"Renkle Doldur\",\n\t\"Draws a straight line with the selected line width.\": \"Seçili çizgi kalınlığında bir düz çizgi çizer.\",\n\t\"Line\": \"Çizgi\",\n\t\"Draws using an airbrush of the selected size.\": \"Seçili boyutta bir püskürtme kabı kullanarak çizer.\",\n\t\"Airbrush\": \"Püskürtme kabı\",\n\t\"Draws a curved line with the selected line width.\": \"Seçili çizgi kalınlığında kıvrımlı bir çizgi çizer.\",\n\t\"Curve\": \"Kıvrım\",\n\t\"Draws a polygon with the selected fill style.\": \"Seçili doldurma biçemiyle bir çokgen çizer.\",\n\t\"Polygon\": \"Çokgen\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"Seçili doldurma biçemiyle yuvarlatılmış bir dikdörtgen çizer.\",\n\t\"Rounded Rectangle\": \"Yuvarlatılmış Dikdörtgen\",\n\t\"Draws a free-form line one pixel wide.\": \"Bir piksel genişliğinde serbest şekilli çizgi çizer.\",\n\t\"Pencil\": \"Kalem\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"Seçili silici şeklini kullanarak resmin bir parçasını siler.\",\n\t\"Eraser/Color Eraser\": \"Silgi/Renk Silicisi\",\n\t\"Changes the magnification.\": \"Büyütme oranını değiştirir.\",\n\t\"Magnifier\": \"Büyüteç\",\n\t\"Picks up a color from the picture for drawing.\": \"Çizim için resimden bir renk seçer.\",\n\t\"Pick Color\": \"Renk Seç\",\n\t\"Draws using a brush with the selected shape and size.\": \"Seçili şekil ve boyutta bir fırçayla çizer.\",\n\t\"Brush\": \"Fırça\",\n\t\"Draws a rectangle with the selected fill style.\": \"Seçili doldurma biçemiyle bir dikdörtgen çizer.\",\n\t\"Rectangle\": \"Dikdörtgen\",\n\t\"Draws a filled rectangle.\": \"Dolu bir dikdörtgen çizer.\",\n\t\"Draws an ellipse with the selected fill style.\": \"Seçili doldurma biçemiyle bir elips çizer.\",\n\t\"Ellipse\": \"Elips\",\n\t\"Draws a filled ellipse.\": \"Dolu bir elips çizer.\",\n\t\"Makes the current selection either opaque or transparent.\": \"Geçerli seçimi donuk veya saydam yapar.\",\n\t\"Creates a new color.\": \"Yeni bir renk oluşturur.\",\n\t\"Uses a previously saved palette of colors.\": \"Önceden kaydedilen bir renk paletini kullanır.\",\n\t\"Saves the current palette of colors to a file.\": \"Geçerli renk paletini bir dosyaya kaydeder.\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"Dosyayı Duvar Kağıdı olarak kullanmadan önce kaydetmelisiniz.\",\n\t\"The selection is now larger than the bitmap.\": \"Seçim şimdi bit eşlemden daha geniş.\",\n\t\"Would you like the bitmap enlarged?\": \"Bit eşlemin genişletilmesini ister misiniz?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"Pano içindeki resim, bit eşlemden daha geniş.\",\n\t\"The file is not in the correct format.\": \"Dosya doğru biçimde değil.\",\n\t\"Not enough room to paste text.\": \"Metni yapıştırmak için yer yok.\",\n\t\"Enlarge the text area and try again.\": \"Metin alanını genişletip yeniden deneyin.\",\n\t\"Places the text.\": \"Metni yerleştirir.\"\n});\n"
  },
  {
    "path": "localization/zh/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"zh\", {\n\t\"Attributes\": \"屬性\",\n\t\"MS Shell Dlg\": \"新細明體\",\n\t\"&Width:\": \"寬度(&W):\",\n\t\"Width:\": \"寬度:\",\n\t\"&Height:\": \"高度(&H):\",\n\t\"Height:\": \"高度:\",\n\t\"Units\": \"單位\",\n\t\"&Inches\": \"英吋(&I)\",\n\t\"Inches\": \"英吋\",\n\t\"C&m\": \"公分(&M)\",\n\t\"Cm\": \"公分\",\n\t\"&Pixels\": \"像素(&P)\",\n\t\"Pixels\": \"像素\",\n\t\"Colors\": \"色彩\",\n\t\"&Black and white\": \"黑白(&B)\",\n\t\"Black and white\": \"黑白\",\n\t\"Co&lors\": \"彩色(&L)\",\n\t\"Transparency\": \"投影片\",\n\t\"Use &Transparent background color\": \"使用透明背景色彩(&T)\",\n\t\"Use Transparent background color\": \"使用透明背景色彩\",\n\t\"Select &Color\": \"選取色彩(&C)\",\n\t\"Select Color\": \"選取色彩\",\n\t\"OK\": \"確定\",\n\t\"Cancel\": \"取消\",\n\t\"&Default\": \"預設值(&D)\",\n\t\"Default\": \"預設值\",\n\t\"Custom Zoom\": \"自訂縮放\",\n\t\"Current zoom:\": \"目前縮放比例:\",\n\t\"Zoom to\": \"縮放成\",\n\t\"&100%\": \"100%(&1)\",\n\t\"100%\": \"100%\",\n\t\"&200%\": \"200%(&2)\",\n\t\"200%\": \"200%\",\n\t\"&400%\": \"400%(&4)\",\n\t\"400%\": \"400%\",\n\t\"&600%\": \"600%(&6)\",\n\t\"600%\": \"600%\",\n\t\"&800%\": \"800%(&8)\",\n\t\"800%\": \"800%\",\n\t\"Flip and Rotate\": \"翻轉及旋轉\",\n\t\"Flip or rotate\": \"翻轉或旋轉\",\n\t\"&Flip horizontal\": \"水平翻轉(&F)\",\n\t\"Flip horizontal\": \"水平翻轉\",\n\t\"Flip &vertical\": \"垂直翻轉(&V)\",\n\t\"Flip vertical\": \"垂直翻轉\",\n\t\"&Rotate by angle\": \"旋轉角度(&R)\",\n\t\"Rotate by angle\": \"旋轉角度\",\n\t\"&90°\": \"90 度(&9)\",\n\t\"90°\": \"90 度\",\n\t\"&180°\": \"180 度(&1)\",\n\t\"180°\": \"180 度\",\n\t\"&270°\": \"270 度(&2)\",\n\t\"270°\": \"270 度\",\n\t\"Stretch and Skew\": \"延伸及扭曲\",\n\t\"Stretch\": \"延伸\",\n\t\"&Horizontal:\": \"水平(&H):\",\n\t\"Horizontal:\": \"水平:\",\n\t\"&Vertical:\": \"垂直(&V):\",\n\t\"Vertical:\": \"垂直:\",\n\t\"Skew\": \"扭曲\",\n\t\"H&orizontal:\": \"水平(&O):\",\n\t\"Degrees\": \"度\",\n\t\"V&ertical:\": \"垂直(&E):\",\n\t\"Color Table\": \"色彩表\",\n\t\"New\": \"新增\",\n\t\"&New \": \"新增(&N)\",\n\t\"New \": \"新增\",\n\t\"&Help\": \"說明(&H)\",\n\t\"Help\": \"說明\",\n\t\"Printing\": \"列印\",\n\t\"on the\": \"從\",\n\t\"&Print\": \"列印(&P)\",\n\t\"Print\": \"列印\",\n\t\"&Next Page\": \"下一頁(&N)\",\n\t\"Next Page\": \"下一頁\",\n\t\"Pre&v Page\": \"上一頁(&V)\",\n\t\"Prev Page\": \"上一頁\",\n\t\"Zoom &In\": \"拉近(&I)\",\n\t\"Zoom In\": \"拉近\",\n\t\"Zoom &Out\": \"拉遠(&O)\",\n\t\"Zoom Out\": \"拉遠\",\n\t\"&Close\": \"關閉(&C)\",\n\t\"Close\": \"關閉\",\n\t\"Grid Settings\": \"格線設定\",\n\t\"                  \": \"                            \",\n\t\"&Pixel Grid\": \"像素格線(&P)\",\n\t\"Pixel Grid\": \"像素格線\",\n\t\"&Tile Grid\": \"並排格線(&T)\",\n\t\"Tile Grid\": \"並排格線\",\n\t\"pixels\": \"像素\",\n\t\"H&eight:\": \"高度(&E):\",\n\t\"Text\": \"文字\",\n\t\"Undo\": \"復原\",\n\t\"Cut\": \"剪下\",\n\t\"Copy\": \"複製\",\n\t\"Paste\": \"貼上\",\n\t\"Clear Selection\": \"清除選取範圍\",\n\t\"Select All\": \"全選\",\n\t\"Text Toolbar\": \"文字工具列\",\n\t\"Selection\": \"選擇\",\n\t\"Cu&t\": \"剪下(&T)\",\n\t\"&Copy\": \"複製(&C)\",\n\t\"&Paste\": \"貼上(&P)\",\n\t\"C&lear Selection\": \"清除選取範圍(&L)\",\n\t\"Select &All\": \"全選(&A)\",\n\t\"C&opy To\": \"複製到(&O)\",\n\t\"Copy To\": \"複製到\",\n\t\"Paste &From\": \"貼上來源(&F)\",\n\t\"Paste From\": \"貼上來源\",\n\t\"Flip/&Rotate\": \"翻轉/旋轉(&R)\",\n\t\"Flip/Rotate\": \"翻轉/旋轉\",\n\t\"&Stretch/Skew\": \"延伸/扭曲(&S)\",\n\t\"Stretch/Skew\": \"延伸/扭曲\",\n\t\"&Invert Colors\": \"色彩對換(&I)\",\n\t\"Invert Colors\": \"色彩對換\",\n\t\"Thumbnail\": \"縮圖\",\n\t\"&File\": \"檔案(&F)\",\n\t\"File\": \"檔案\",\n\t\"&New\": \"開新檔案(&N)\",\n\t\"&Open\": \"開啟舊檔(&O)\",\n\t\"Open\": \"開啟舊檔\",\n\t\"&Save\": \"存檔(&S)\",\n\t\"Save\": \"存檔\",\n\t\"Save &As\": \"另存新檔(&A)\",\n\t\"Save As\": \"另存新檔\",\n\t\"Print Pre&view\": \"預覽列印(&V)\",\n\t\"Print Preview\": \"預覽列印\",\n\t\"Page Se&tup\": \"版面設定(&T)\",\n\t\"Page Setup\": \"版面設定\",\n\t\"S&end\": \"傳送(&E)\",\n\t\"Send\": \"傳送\",\n\t\"Set As &Wallpaper (Tiled)\": \"設定為底色圖案 (並排)(&W)\",\n\t\"Set As Wallpaper (Tiled)\": \"設定為底色圖案 (並排)\",\n\t\"Set As Wa&llpaper (Centered)\": \"設定為底色圖案 (置於中央)(&L)\",\n\t\"Set As Wallpaper (Centered)\": \"設定為底色圖案 (置於中央)\",\n\t\"Recent File\": \"最新的檔案\",\n\t\"E&xit\": \"結束(&X)\",\n\t\"Exit\": \"結束\",\n\t\"&Edit\": \"編輯(&E)\",\n\t\"Edit\": \"編輯\",\n\t\"&Undo\": \"復原(&U)\",\n\t\"&Repeat\": \"重複(&R)\",\n\t\"Repeat\": \"重複\",\n\t\"&View\": \"檢視(&V)\",\n\t\"View\": \"檢視\",\n\t\"&Tool Box\": \"工具箱(&T)\",\n\t\"Tool Box\": \"工具箱\",\n\t\"&Color Box\": \"色塊(&C)\",\n\t\"Color Box\": \"色塊\",\n\t\"&Status Bar\": \"狀態列(&S)\",\n\t\"Status Bar\": \"狀態列\",\n\t\"T&ext Toolbar\": \"文字工具列(&E)\",\n\t\"&Zoom\": \"縮放(&Z)\",\n\t\"Zoom\": \"縮放\",\n\t\"&Normal Size\": \"標準大小(&N)\",\n\t\"Normal Size\": \"標準大小\",\n\t\"&Large Size\": \"放大(&L)\",\n\t\"Large Size\": \"放大\",\n\t\"C&ustom\": \"自訂(&U)\",\n\t\"Custom\": \"自訂\",\n\t\"Show &Grid\": \"顯示格線(&G)\",\n\t\"Show Grid\": \"顯示格線\",\n\t\"Show T&humbnail\": \"顯示縮圖(&H)\",\n\t\"Show Thumbnail\": \"顯示縮圖\",\n\t\"&View Bitmap\": \"檢視點陣圖(&V)\",\n\t\"View Bitmap\": \"檢視點陣圖\",\n\t\"&Image\": \"影像(&I)\",\n\t\"Image\": \"影像\",\n\t\"&Flip/Rotate\": \"翻轉/旋轉(&F)\",\n\t\"&Attributes\": \"屬性(&A)\",\n\t\"&Clear Image\": \"清除影像(&C)\",\n\t\"Clear Image\": \"清除影像\",\n\t\"&Draw Opaque\": \"不透明處理(&D)\",\n\t\"Draw Opaque\": \"不透明處理\",\n\t\"&Colors\": \"色彩(&C)\",\n\t\"&Edit Colors\": \"編輯色彩(&E)\",\n\t\"Edit Colors\": \"編輯色彩\",\n\t\"&Help Topics\": \"說明主題(&H)\",\n\t\"Help Topics\": \"說明主題\",\n\t\"&About Paint\": \"關於小畫家(&A)\",\n\t\"About Paint\": \"關於小畫家\",\n\t\"&Update\": \"更新(&U)\",\n\t\"Update\": \"更新\",\n\t\"Save Copy &As\": \"另存備份(&A)\",\n\t\"Save Copy As\": \"另存備份\",\n\t\"Paint\": \"小畫家\",\n\t\"untitled\": \"未命名\",\n\t\"Bitmap Image\": \"點陣圖影像\",\n\t\"Bitmap Files (*.bmp)\": \"點陣圖檔案(*.BMP,*.DIB)\",\n\t\"PCX Files\": \"PCX 檔\",\n\t\"Icon Files\": \"圖示檔(*.ICO)\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"單色點陣圖 (*.bmp;*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"16 色點陣圖 (*.bmp;*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"256 色點陣圖 (*.bmp;*.dib)\",\n\t\"Paint cannot open this file.\": \"「小畫家」無法開啟這個檔案。\",\n\t\"Paint cannot read this file.\": \"「小畫家」無法讀取這個檔案。\",\n\t\"This file is read-only.\": \"這是一個唯讀檔。\",\n\t\"To save your changes, use a different filename.\": \"要儲存所做的變更時，請用其它的檔名。\",\n\t\"This file is already open.\": \"這個檔案已經開啟了。\",\n\t\"This is not a valid .PCS file.\": \"不是有效的 .PCS 檔。\",\n\t\"This file is open for editing and cannot be overwritten.\": \"這個檔案是開啟來供編輯之用，無法改寫。\",\n\t\"Use a different filename to save your changes.\": \"請用的不同的檔名來儲存所做的變更。\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"這不是正確的點陣圖檔案，或是已不再支援這種格式。\",\n\t\"This is not a valid icon.\": \"不是有效的圖示。\",\n\t\"This is not a valid cursor.\": \"不是有效的游標。\",\n\t\"Save was interrupted, so your file has not been saved.\": \"存檔時被中斷了，所以您的檔案並未儲存。\",\n\t\"You cannot save to a read-only file.\": \"您無法儲存唯讀檔。\",\n\t\"Use a different file name.\": \"請用其它的檔名。\",\n\t\"This file is already in use.\": \"這個檔案已經在使用中。\",\n\t\"Close the program, and then try again.\": \"請關閉程式，然後重試。\",\n\t\"Paint cannot save this file.\": \"「小畫家」無法儲存這個檔案。\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"「小畫家」無法用相同的檔名儲存不同的檔案類型。\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"格線的間距必須是 %d 到 %d 之間的整數。\",\n\t\"There is not enough memory or resources to complete operation.\": \"記憶體或資源不足，無法完成作業。\",\n\t\"Close some programs, and then try again.\": \"請關閉某些程式，然後重試。\",\n\t\"Low on memory or resources.\": \"記憶體或資源不足。\",\n\t\"Group error.\": \"群組發生錯誤。\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"小畫家無法列印您的文件。請確定您的磁碟空間足夠，而且印表機正常運作。\",\n\t\"Saving into this format may cause some loss of color information.\": \"儲存成這種格式可能會造成色彩資訊遺失。\",\n\t\"Do you want to continue?\": \"您還要繼續嗎?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"無法轉換成黑白。這個動作會影響目前的檔案，而且會造成某些色彩資訊的失落。\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"點陣圖必須一邊大於一個像素。\",\n\t\"Generic error.\": \"發生同屬錯誤。\",\n\t\"File not found.\": \"檔案找不到。\",\n\t\"Bad path.\": \"路徑不正確。\",\n\t\"Too many open files.\": \"開啟太多檔案。\",\n\t\"Access denied.\": \"拒絕存取。\",\n\t\"Invalid file.\": \"檔案無效。\",\n\t\"Remove current folder.\": \"移除現有的資料夾。\",\n\t\"Folder full.\": \"資案夾已滿。\",\n\t\"Bad seek.\": \"錯誤的搜尋方式。\",\n\t\"Hard IO error.\": \"Hard IO 錯誤。\",\n\t\"Sharing violation.\": \"分享違規。\",\n\t\"Lock violation.\": \"鎖定違規。\",\n\t\"Disk full.\": \"磁碟已滿。\",\n\t\"End of file.\": \"檔案結尾。\",\n\t\"Error getting the Clipboard Data!\": \"取得剪貼簿資料發生錯誤！\",\n\t\"No Printer Found @ page setup\": \"找不到印表機 @ 版面設定\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"24 位元點陣圖 (*.bmp;*.dib)\",\n\t\"All Files\": \"所有檔案\",\n\t\"Palette|*.pal|\": \"色板|*.pal|\",\n\t\"OLE 2.0 was unable to start.\": \"無法啟動 OLE 2.0。\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"請確定是否使用正確的 OLE 程式庫版本。\",\n\t\"Resets the text be without any attributes.\": \"重設成沒有任何屬性的文字。\",\n\t\"Sets or clears the text bold attribute.\": \"設定或清除文字的粗體屬性。\",\n\t\"Sets or clears the text italic attribute.\": \"設定或清除文字的斜體屬性。\",\n\t\"Selects the font used by the text.\": \"選擇文字使用的字型。\",\n\t\"Selects the point size of the text.\": \"選擇文字使用的點數大小。\",\n\t\"Sets or clears the text underline attribute.\": \"設定或清除文字的底線屬性。\",\n\t\"Shows or hides the tooltips.\": \"顯示或隱藏工具提示。\",\n\t\"Show Paint Help.\": \"顯示「小畫家」「說明」。\",\n\t\"            \": \"             \",\n\t\"Sends a picture by using mail or fax.\": \"用電子郵件或傳真機傳送圖片。\",\n\t\"Copies the selection to a file.\": \"將選取範圍複製到檔案。\",\n\t\"Pastes a file into the selection.\": \"將檔案貼到選取範圍。\",\n\t\"Zooms the picture to 100%.\": \"將圖片放大 100%。\",\n\t\"Zooms the picture to 400%.\": \"將圖片放大 400%。\",\n\t\"Zooms the picture.\": \"縮放圖片。\",\n\t\"Displays the entire picture.\": \"顯示整個圖片。\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"顯示或隱藏圖片的縮圖。\",\n\t\"Shows or hides the grid.\": \"顯示或隱藏格線。\",\n\t\"Shows or hides the text toolbar.\": \"顯示或隱藏文字工具列。\",\n\t\"Flips or rotates the picture or a selection.\": \"翻轉或旋轉圖片或選取範圍。\",\n\t\"Stretches or skews the picture or a selection.\": \"拉長或扭曲圖片或選取範圍。\",\n\t\"Inverts the colors of the picture or a selection.\": \"將圖片或選取範圍的顏色對調。\",\n\t\"Changes the attributes of the picture.\": \"變更圖片的屬性。\",\n\t\"Clears the picture or selection.\": \"清除圖片或選取範圍。\",\n\t\"The font size must be a numeric value.\": \"字型大小必須是一個數值。\",\n\t\"Contains commands for working with the selected item(s).\": \"內含使用選擇項目的指令。\",\n\t\"Contains commands for selecting and transferring items.\": \"內含選擇及轉換項目的指令。\",\n\t\"Contains commands for customizing this window.\": \"內含自訂這個視窗的指令。\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"內含處理圖片及設定屬性的指令。\",\n\t\"Contains commands for using custom colors and drawing options.\": \"內含使用自訂顏色及繪圖選項的指令。\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"內含顯示「說明」及「小畫家」相關資訊的指令。\",\n\t\"Cannot save file.\": \"無法儲存檔案。\",\n\t\"Error removing temporary file.\": \"移除暫時檔的時候發生錯誤。\",\n\t\"Get Colors\": \"選取色彩\",\n\t\"Save Colors\": \"儲存色彩\",\n\t\"File last saved:\": \"上次儲存的檔案:\",\n\t\"Not Available\": \"無法使用\",\n\t\"Size on disk:\": \"磁碟大小:\",\n\t\"%s bytes\": \"%s 位元組\",\n\t\"Painting\": \"繪圖中\",\n\t\"Bitmap\": \"點陣圖\",\n\t\"Fonts\": \"字型\",\n\t\"Tools\": \"工具\",\n\t\" \": \"    \",\n\t\"x\": \"X\",\n\t\"All Picture Files\": \"所有圖片檔案\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"如需說明，請按一下「說明」功能表中的「說明主題」。\",\n\t\"Select an area on which to get Help.\": \"選擇要取得「說明」的區域。\",\n\t\"%1 in %2\": \"%2 中的%1\",\n\t\"Creates a new document.\": \"建立新的文件。\",\n\t\"Opens an existing document.\": \"開啟現有的文件。\",\n\t\"Closes the active document.\": \"關閉目前的文件。\",\n\t\"Saves the active document.\": \"關閉目前的文件。\",\n\t\"Saves the active document with a new name.\": \"以新的名稱儲存目前的文件。\",\n\t\"Changes the page layout.\": \"變更版面配置。\",\n\t\"Specifies the default printer setup.\": \"指定預設的印表機。\",\n\t\"Prints the active document and sets printing options.\": \"列印目前的文件並設定列印選項。\",\n\t\"Displays full pages.\": \"顯示全頁。\",\n\t\"Opens this document.\": \"開啟這個文件。\",\n\t\"Deletes the selection.\": \"刪除選取範圍。\",\n\t\"Erases everything.\": \"全部清除。\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"複製選取範圍，並將它放到剪貼簿中。\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"剪下選取範圍，並將它放到剪貼簿中。\",\n\t\"Finds the specified text.\": \"尋找指定的文字。\",\n\t\"Inserts the contents of the Clipboard.\": \"插入剪貼簿的內容。\",\n\t\"Repeats the last action.\": \"重複前次的動作。\",\n\t\"Replaces specific text with different text.\": \"以不同的文字置換指定的文字。\",\n\t\"Selects everything.\": \"選擇全部。\",\n\t\"Undoes the last action.\": \"取消前次的動作。\",\n\t\"Redoes the previously undone action.\": \"重做前次取消的動作。\",\n\t\"Displays program information, version number, and copyright.\": \"顯示程式資訊、版本號碼及著作權。\",\n\t\"Quits Paint.\": \"結束「小畫家」。\",\n\t\"Opens Paint Help.\": \"開啟「小畫家」的「說明」。\",\n\t\"Displays instructions about how to use Help.\": \"顯示使用「說明」的方法。\",\n\t\"Displays Help for areas you click on.\": \"顯示您按一下之區域的「說明」。\",\n\t\"Displays Help for the current task or command.\": \"顯示目前工作或指令的「說明」。\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"將這個圖陣圖當做底色圖案置於桌面中央。\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"將這個點陣圖當成底色圖案並排在桌面上。\",\n\t\"Sends the selection using mail or fax.\": \"用電子郵件或傳真機傳送所選的部份。\",\n\t\"Prints the selection.\": \"列印選取範圍。\",\n\t\"Shows or hides the thumbnail.\": \"顯示或隱藏縮圖。\",\n\t\"Shows Paint Help.\": \"顯示「小畫家」「說明」。\",\n\t\"Shows or hides the status bar.\": \"顯示或隱藏狀態列。\",\n\t\"Shows or hides the tool box.\": \"顯示或隱藏工具箱。\",\n\t\"Shows or hides the color box.\": \"顯示或隱藏色塊。\",\n\t\"Only a Far East font can be used for vertical editing.\": \"在垂直式編輯中只能使用一種中文字型。\",\n\t\"Changes the window size.\": \"變更視窗大小。\",\n\t\"Changes the window position.\": \"變更視窗位置。\",\n\t\"Reduces the window to an icon.\": \"將視窗縮成一個圖示。\",\n\t\"Enlarges the window to full size.\": \"將視窗放到最大。\",\n\t\"Switches to the next document window.\": \"切換到下一個文件視窗。\",\n\t\"Switches to the previous document window.\": \"切換到前一個文件視窗。\",\n\t\"Closes the active window and asks if you want to save changes.\": \"關閉目前的視窗並詢問您要不要儲存所做的變更。\",\n\t\"Restores the window to normal size.\": \"將視窗復原成標準的大小。\",\n\t\"Activates the task list.\": \"啟動工作清單。\",\n\t\"All Files (*.*)\": \"所有檔案 (*.*)\",\n\t\"Untitled\": \"未命名\",\n\t\"an unnamed file\": \"未命名的檔案\",\n\t\"&Hide\": \"隱藏(&H)\",\n\t\"Hide\": \"隱藏\",\n\t\"No error message is available.\": \"沒有錯誤訊息。\",\n\t\"An unsupported operation was attempted.\": \"嘗試了一項未受支援的操作。\",\n\t\"A required resource was unavailable.\": \"所需的資源無法使用。\",\n\t\"Out of memory.\": \"記憶體不足。\",\n\t\"An unknown error has occurred.\": \"一個無法辨識的錯誤已發生。\",\n\t\"on %1\": \"於 %1\",\n\t\"&One Page\": \"一頁(&O)\",\n\t\"One Page\": \"一頁\",\n\t\"&Two Page\": \"兩頁(&T)\",\n\t\"Two Page\": \"兩頁\",\n\t\"Page %u\": \"第 %u 頁\",\n\t\"Pages %u-%u\": \"%u-%u 頁\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"印表機檔案 (*.prn)|*.prn|所有的檔案 (*.*)|*.*||\",\n\t\"Print to File\": \"列印到檔案\",\n\t\"to %1\": \"到 %1\",\n\t\"&Update %1\": \"升級 %1(&U)\",\n\t\"Update %1\": \"升級 %1\",\n\t\"E&xit && Return to %1\": \"結束後回到 %1 (&X)\",\n\t\"Exit & Return to %1\": \"結束後回到 %1\",\n\t\"Linked %s\": \"已連結的 %s\",\n\t\"Unknown Type\": \"未知的類型\",\n\t\"Invalid filename.\": \"檔名無效。\",\n\t\"Failed to open document.\": \"開啟文件失敗。\",\n\t\"Failed to save document.\": \"儲存文件失敗。\",\n\t\"Save changes to %1?\": \"儲存變更到 %1？\",\n\t\"Failed to create empty document.\": \"建立空文件失敗。\",\n\t\"The file is too large to open.\": \"檔案太大無法開啟。\",\n\t\"Could not start print job.\": \"無法開始列印工作。\",\n\t\"Failed to launch help.\": \"啟動說明失敗。\",\n\t\"Internal application error.\": \"內部應用程式錯誤。\",\n\t\"Command failed.\": \"指令失敗。\",\n\t\"Insufficient memory to perform operation.\": \"記憶體不足以執行作業。\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"已移除系統登錄項目，且已刪除 INI 檔 (若有的話)。\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"未移除所有的系統登錄項目 (或 INI 檔)。\",\n\t\"This program requires the file %s, which was not found on this system.\": \"這個程式需要檔案 %s，但在這個系統上找不到它。\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"這個程式連結到遺失的匯出項目 %s (在檔案 %s)。這個機器的 %s 版本可能不相容。\",\n\t\"Please enter an integer.\": \"請輸入整數。\",\n\t\"Please enter a number.\": \"請輸入數字。\",\n\t\"Please enter an integer between %1 and %2.\": \"請輸入介於 %1 和 %2 之間的整數。\",\n\t\"Please enter a number between %1 and %2.\": \"請輸入介於 %1 和 %2 之間的數字。\",\n\t\"Please enter no more than %1 characters.\": \"請輸入不超過 %1 個字。\",\n\t\"Please select a button.\": \"請選擇一個按鈕。\",\n\t\"Please enter an integer between 0 and 255.\": \"請輸入介於 0 和 255 之間的整數。\",\n\t\"Please enter a positive integer.\": \"請輸入一正整數。\",\n\t\"Please enter a date and/or time.\": \"請輸入一個日期及(或）時間。\",\n\t\"Please enter a currency.\": \"請輸入一種貨幣。\",\n\t\"Unexpected file format.\": \"檔案格式不正確。\",\n\t\"Cannot find this file.\": \"C找不到此檔案。\",\n\t\"Please verify that the correct path and file name are given.\": \"請確認已給正確的路徑和檔案名稱。\",\n\t\"Destination disk drive is full.\": \"目的地磁碟機已滿。\",\n\t\"Unable to read from %1, it is opened by someone else.\": \"無法讀取 %1，已被其他人開啟。\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \"無法寫入 %1，可能是唯讀或被其他人開啟。\",\n\t\"An unexpected error occurred while reading %1.\": \"讀取 %1 時發生無法預期的錯誤。\",\n\t\"An unexpected error occurred while writing %1.\": \"寫入 %1 時發生無法預期的錯誤。\",\n\t\"Unable to register document.\": \"無法登錄文件。\",\n\t\"The document may already be open.\": \"此文件可能已被開啟。\",\n\t\"Update %1 before proceeding?\": \"繼續下個動作前先更新 %1？\",\n\t\"Could not update client.\": \"無法更新用戶端。\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"無法登錄。ActiveX 功能可能無法正確運作。\",\n\t\"Failed to update the system registry.\": \"更新系統登錄失敗。\",\n\t\"Please try using REGEDIT.\": \"請試著使用 REGEDIT。\",\n\t\"Unable to read write-only property.\": \"無法讀取唯寫內容。\",\n\t\"Unable to write read-only property.\": \"無法寫入唯讀內容。\",\n\t\"Unable to load mail system support.\": \"無法載入郵件系統支援\",\n\t\"Mail system DLL is invalid.\": \"郵件系統 DLL 不正確。\",\n\t\"Send Mail failed to send message.\": \"無法傳送訊息。\",\n\t\"No error occurred.\": \"沒有任何錯誤發生。\",\n\t\"An unknown error occurred while accessing %1.\": \"在存取 %1 時發生了一個無法辨識的錯誤。\",\n\t\"%1 was not found.\": \"找不到 %1。\",\n\t\"%1 contains an invalid path.\": \"%1 包含一個不正確的路徑。\",\n\t\"%1 could not be opened because there are too many open files.\": \"%1無法開啟，因為已經開啟太多檔案。\",\n\t\"Access to %1 was denied.\": \"存取 %1 被拒。\",\n\t\"An invalid file handle was associated with %1.\": \"一個不正確的檔案控制碼與 %1 產生關聯。\",\n\t\"%1 could not be removed because it is the current directory.\": \"%1無法移除，因為它是目前的目錄。\",\n\t\"%1 could not be created because the directory is full.\": \"%1無法建立，因為此目錄已滿。\",\n\t\"Seek failed on %1\": \"搜尋 %1 失敗。\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"在存取 %1 時報告硬體 I/O 錯誤。\",\n\t\"A sharing violation occurred while accessing %1.\": \"在存取 %1 時發生共用違規。\",\n\t\"A locking violation occurred while accessing %1.\": \"在存取 %1 時發生鎖定違規。\",\n\t\"Disk full while accessing %1.\": \"在存取 %1 時磁碟已滿。\",\n\t\"An attempt was made to access %1 past its end.\": \"嘗試一次超過 %1 結尾的存取。\",\n\t\"An attempt was made to write to the reading %1.\": \"嘗試寫入正在讀取的 %1。\",\n\t\"An attempt was made to read from the writing %1.\": \"嘗試從正在寫入的 %1 讀取。\",\n\t\"%1 has a bad format.\": \"%1 有一個錯誤格式。\",\n\t\"%1 contained an unexpected object.\": \"%1 包含一個意外物件。\",\n\t\"%1 contains an incorrect schema.\": \"%1 包含一個不正確的架構。\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"選圖片的矩形部份，加以移動、複製或編輯。\",\n\t\"Select\": \"選擇\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"選圖片的任何部份，加以移動、複製或編輯。\",\n\t\"Free-Form Select\": \"選擇任意範圍\",\n\t\"Inserts text into the picture.\": \"將文字貼到圖片中。\",\n\t\"Fills an area with the current drawing color.\": \"用目前的繪圖色彩填入某個區域\",\n\t\"Fill With Color\": \"填入色彩\",\n\t\"Draws a straight line with the selected line width.\": \"用所選的線條寬度繪製直線。\",\n\t\"Line\": \"直線\",\n\t\"Draws using an airbrush of the selected size.\": \"用所選的噴槍大小繪圖\",\n\t\"Airbrush\": \"噴槍\",\n\t\"Draws a curved line with the selected line width.\": \"用所選的線條寬度繪製曲線。\",\n\t\"Curve\": \"曲線\",\n\t\"Draws a polygon with the selected fill style.\": \"用所選的填入樣式繪製多邊形。\",\n\t\"Polygon\": \"多邊形\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"用所選的填入樣式繪製圓角矩形。\",\n\t\"Rounded Rectangle\": \"圓角矩形\",\n\t\"Draws a free-form line one pixel wide.\": \"以一個像素寬度大小繪出任意形狀的線條。\",\n\t\"Pencil\": \"鉛筆\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"使用所選的橡皮擦形狀，清除部份圖片。\",\n\t\"Eraser/Color Eraser\": \"橡皮擦/彩色橡皮擦\",\n\t\"Changes the magnification.\": \"變更倍率。\",\n\t\"Magnifier\": \"放大鏡\",\n\t\"Picks up a color from the picture for drawing.\": \"挑選圖片中的一種顏色用來繪圖。\",\n\t\"Pick Color\": \"挑選顏色\",\n\t\"Draws using a brush with the selected shape and size.\": \"用所選的刷子形狀及大小來繪圖。\",\n\t\"Brush\": \"粉刷\",\n\t\"Draws a rectangle with the selected fill style.\": \"用所選的填入樣式繪製矩形。\",\n\t\"Rectangle\": \"矩形\",\n\t\"Draws a filled rectangle.\": \"繪製填入樣式的矩形。\",\n\t\"Draws an ellipse with the selected fill style.\": \"用所選的填入樣式繪製橢圓形。\",\n\t\"Ellipse\": \"橢圓形\",\n\t\"Draws a filled ellipse.\": \"繪製內填樣式的橢圓形。\",\n\t\"Makes the current selection either opaque or transparent.\": \"讓目前的選取範圍變成透明或不透明。\",\n\t\"Creates a new color.\": \"建立新的顏色。\",\n\t\"Uses a previously saved palette of colors.\": \"使用以前儲存的色板。\",\n\t\"Saves the current palette of colors to a file.\": \"將目前的色板存到檔案中。\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"在將它選為底色圖案之前，必須先儲存檔案。\",\n\t\"The selection is now larger than the bitmap.\": \"選取範圍大於點陣圖。\",\n\t\"Would you like the bitmap enlarged?\": \"您要放大點陣圖嗎？\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"剪貼簿的影像大於點陣圖。\",\n\t\"The file is not in the correct format.\": \"檔案的格式不正確。\",\n\t\"Not enough room to paste text.\": \"空間不夠，無法貼上文字。\",\n\t\"Enlarge the text area and try again.\": \"請放大文字區域後重試。\",\n\t\"Places the text.\": \"置放文字。\"\n});\n"
  },
  {
    "path": "localization/zh-simplified/localizations.js",
    "content": "//\n// NOTE: This is a generated file! Don't edit it directly.\n// Eventually community translation will be set up on some translation platform.\n// \n// Generated with: npm run update-localization\n//\nloaded_localizations(\"zh-simplified\", {\n\t\"Attributes\": \"属性\",\n\t\"MS Shell Dlg\": \"宋体\",\n\t\"&Width:\": \"宽度(&W):\",\n\t\"Width:\": \"宽度:\",\n\t\"&Height:\": \"高度(&H):\",\n\t\"Height:\": \"高度:\",\n\t\"Units\": \"单位\",\n\t\"&Inches\": \"英寸(&I)\",\n\t\"Inches\": \"英寸\",\n\t\"C&m\": \"厘米(&M)\",\n\t\"Cm\": \"厘米\",\n\t\"&Pixels\": \"象素(&P)\",\n\t\"Pixels\": \"象素\",\n\t\"Colors\": \"颜色\",\n\t\"&Black and white\": \"黑白(&B)\",\n\t\"Black and white\": \"黑白\",\n\t\"Co&lors\": \"颜色(&L)\",\n\t\"Transparency\": \"透明胶片\",\n\t\"Use &Transparent background color\": \"使用透明背景颜色(&T)\",\n\t\"Use Transparent background color\": \"使用透明背景颜色\",\n\t\"Select &Color\": \"选择颜色(&C)\",\n\t\"Select Color\": \"选择颜色\",\n\t\"OK\": \"确定\",\n\t\"Cancel\": \"取消\",\n\t\"&Default\": \"默认(&D)\",\n\t\"Default\": \"默认\",\n\t\"Custom Zoom\": \"自定义缩放\",\n\t\"Current zoom:\": \"当前缩放比例:\",\n\t\"Zoom to\": \"缩放比例\",\n\t\"&100%\": \"100%(&1)\",\n\t\"100%\": \"100%\",\n\t\"&200%\": \"200%(&2)\",\n\t\"200%\": \"200%\",\n\t\"&400%\": \"400%(&4)\",\n\t\"400%\": \"400%\",\n\t\"&600%\": \"600%(&6)\",\n\t\"600%\": \"600%\",\n\t\"&800%\": \"800%(&8)\",\n\t\"800%\": \"800%\",\n\t\"Flip and Rotate\": \"翻转和旋转\",\n\t\"Flip or rotate\": \"翻转或旋转\",\n\t\"&Flip horizontal\": \"水平翻转(&F)\",\n\t\"Flip horizontal\": \"水平翻转\",\n\t\"Flip &vertical\": \"垂直翻转(&V)\",\n\t\"Flip vertical\": \"垂直翻转\",\n\t\"&Rotate by angle\": \"按一定角度旋转(&R)\",\n\t\"Rotate by angle\": \"按一定角度旋转\",\n\t\"&90°\": \"90 度(&9)\",\n\t\"90°\": \"90 度\",\n\t\"&180°\": \"180 度(&1)\",\n\t\"180°\": \"180 度\",\n\t\"&270°\": \"270 度(&2)\",\n\t\"270°\": \"270 度\",\n\t\"Stretch and Skew\": \"拉伸和扭曲\",\n\t\"Stretch\": \"拉伸\",\n\t\"&Horizontal:\": \"水平(&H):\",\n\t\"Horizontal:\": \"水平:\",\n\t\"&Vertical:\": \"垂直(&V):\",\n\t\"Vertical:\": \"垂直:\",\n\t\"Skew\": \"扭曲\",\n\t\"H&orizontal:\": \"水平(&O):\",\n\t\"Degrees\": \"度\",\n\t\"V&ertical:\": \"垂直(&E):\",\n\t\"Color Table\": \"颜色表\",\n\t\"New\": \"新建\",\n\t\"&New \": \"新建(&N)\",\n\t\"New \": \"新建\",\n\t\"&Help\": \"帮助(&H)\",\n\t\"Help\": \"帮助\",\n\t\"Printing\": \"正在打印\",\n\t\"on the\": \"在\",\n\t\"&Print\": \"打印(&P)\",\n\t\"Print\": \"打印\",\n\t\"&Next Page\": \"下一页(&N)\",\n\t\"Next Page\": \"下一页\",\n\t\"Pre&v Page\": \"上一页(&V)\",\n\t\"Prev Page\": \"上一页\",\n\t\"Zoom &In\": \"放大(&I)\",\n\t\"Zoom In\": \"放大\",\n\t\"Zoom &Out\": \"缩小(&O)\",\n\t\"Zoom Out\": \"缩小\",\n\t\"&Close\": \"关闭(&C)\",\n\t\"Close\": \"关闭\",\n\t\"Grid Settings\": \"网格设置\",\n\t\"                  \": \"               \",\n\t\"&Pixel Grid\": \"象素网格(&P)\",\n\t\"Pixel Grid\": \"象素网格\",\n\t\"&Tile Grid\": \"平铺网格(&T)\",\n\t\"Tile Grid\": \"平铺网格\",\n\t\"pixels\": \"象素\",\n\t\"H&eight:\": \"高度(&E):\",\n\t\"Text\": \"文字\",\n\t\"Undo\": \"撤消\",\n\t\"Cut\": \"剪切\",\n\t\"Copy\": \"复制\",\n\t\"Paste\": \"粘贴\",\n\t\"Clear Selection\": \"清除选定区域\",\n\t\"Select All\": \"全选\",\n\t\"Text Toolbar\": \"文字工具栏\",\n\t\"Selection\": \"选定区域\",\n\t\"Cu&t\": \"剪切(&T)\",\n\t\"&Copy\": \"复制(&C)\",\n\t\"&Paste\": \"粘贴(&P)\",\n\t\"C&lear Selection\": \"清除选择(&L)\",\n\t\"Select &All\": \"全选(&A)\",\n\t\"C&opy To\": \"复制到(&O)\",\n\t\"Copy To\": \"复制到\",\n\t\"Paste &From\": \"粘贴自(&F)\",\n\t\"Paste From\": \"粘贴自\",\n\t\"Flip/&Rotate\": \"翻转/旋转(&R)\",\n\t\"Flip/Rotate\": \"翻转/旋转\",\n\t\"&Stretch/Skew\": \"拉伸/扭曲(&S)\",\n\t\"Stretch/Skew\": \"拉伸/扭曲\",\n\t\"&Invert Colors\": \"反色(&I)\",\n\t\"Invert Colors\": \"反色\",\n\t\"Thumbnail\": \"缩略图\",\n\t\"&File\": \"文件(&F)\",\n\t\"File\": \"文件\",\n\t\"&New\": \"新建(&N)\",\n\t\"&Open\": \"打开(&O)\",\n\t\"Open\": \"打开\",\n\t\"&Save\": \"保存(&S)\",\n\t\"Save\": \"保存\",\n\t\"Save &As\": \"另存为(&A)\",\n\t\"Save As\": \"另存为\",\n\t\"Print Pre&view\": \"打印预览(&V)\",\n\t\"Print Preview\": \"打印预览\",\n\t\"Page Se&tup\": \"页面设置(&T)\",\n\t\"Page Setup\": \"页面设置\",\n\t\"S&end\": \"发送(&D)\",\n\t\"Send\": \"发送\",\n\t\"Set As &Wallpaper (Tiled)\": \"设置为墙纸(平铺)(&W)\",\n\t\"Set As Wallpaper (Tiled)\": \"设置为墙纸(平铺)\",\n\t\"Set As Wa&llpaper (Centered)\": \"设置为墙纸(居中)(&L)\",\n\t\"Set As Wallpaper (Centered)\": \"设置为墙纸(居中)\",\n\t\"Recent File\": \"当前文件\",\n\t\"E&xit\": \"退出(&X)\",\n\t\"Exit\": \"退出\",\n\t\"&Edit\": \"编辑(&E)\",\n\t\"Edit\": \"编辑\",\n\t\"&Undo\": \"撤消(&U)\",\n\t\"&Repeat\": \"重复(&R)\",\n\t\"Repeat\": \"重复\",\n\t\"&View\": \"查看(&V)\",\n\t\"View\": \"查看\",\n\t\"&Tool Box\": \"工具箱(&T)\",\n\t\"Tool Box\": \"工具箱\",\n\t\"&Color Box\": \"颜料盒(&C)\",\n\t\"Color Box\": \"颜料盒\",\n\t\"&Status Bar\": \"状态栏(&S)\",\n\t\"Status Bar\": \"状态栏\",\n\t\"T&ext Toolbar\": \"文字工具栏(&E)\",\n\t\"&Zoom\": \"缩放(&Z)\",\n\t\"Zoom\": \"缩放\",\n\t\"&Normal Size\": \"常规尺寸(&N)\",\n\t\"Normal Size\": \"常规尺寸\",\n\t\"Ctrl+PgUp\": \" Ctrl+PgUp\",\n\t\"&Large Size\": \"大尺寸(&L)\",\n\t\"Large Size\": \"大尺寸\",\n\t\"Ctrl+PgDn\": \" Ctrl+PgDn\",\n\t\"C&ustom\": \"自定义(&C)\",\n\t\"Custom\": \"自定义\",\n\t\"Show &Grid\": \"显示网格(&G)\",\n\t\"Show Grid\": \"显示网格\",\n\t\"Show T&humbnail\": \"显示缩略图(&H)\",\n\t\"Show Thumbnail\": \"显示缩略图\",\n\t\"&View Bitmap\": \"全图(&V)\",\n\t\"View Bitmap\": \"全图\",\n\t\"&Image\": \"图象(&I)\",\n\t\"Image\": \"图象\",\n\t\"&Flip/Rotate\": \"翻转/旋转(&F)\",\n\t\"&Attributes\": \"属性(&A)\",\n\t\"&Clear Image\": \"清除图象(&C)\",\n\t\"Clear Image\": \"清除图象\",\n\t\"&Draw Opaque\": \"不透明处理(&D)\",\n\t\"Draw Opaque\": \"不透明处理\",\n\t\"&Colors\": \"颜色(&C)\",\n\t\"&Edit Colors\": \"编辑颜色(&E)\",\n\t\"Edit Colors\": \"编辑颜色\",\n\t\"&Help Topics\": \"帮助主题(&H)\",\n\t\"Help Topics\": \"帮助主题\",\n\t\"&About Paint\": \"关于画图(&A)\",\n\t\"About Paint\": \"关于画图\",\n\t\"&Update\": \"更新(&U)\",\n\t\"Update\": \"更新\",\n\t\"Save Copy &As\": \"另存为(&A)\",\n\t\"Save Copy As\": \"将副本存为\",\n\t\"Paint\": \"画图\",\n\t\"untitled\": \"未命名\",\n\t\"Bitmap Image\": \"位图图象\",\n\t\"Bitmap Files (*.bmp)\": \"位图文件(*.bmp)\",\n\t\"PCX Files\": \"PCX 文件\",\n\t\"Icon Files\": \"图标文件\",\n\t\"Monochrome Bitmap (*.bmp;*.dib)\": \"单色位图 (*.bmp;*.dib)\",\n\t\"16 Color Bitmap (*.bmp;*.dib)\": \"16 色位图 (*.bmp;*.dib)\",\n\t\"256 Color Bitmap (*.bmp;*.dib)\": \"256 色位图 (*.bmp;*.dib)\",\n\t\"Paint cannot open this file.\": \"画图程序无法打开该文件。\",\n\t\"Paint cannot read this file.\": \"画图程序无法读取该文件。\",\n\t\"This file is read-only.\": \"该文件为只读文件。\",\n\t\"To save your changes, use a different filename.\": \"请选用其他文件名保存改动后的结果。\",\n\t\"This file is already open.\": \"该文件已打开。\",\n\t\"This is not a valid .PCS file.\": \"无效的 .PCS 文件。\",\n\t\"This file is open for editing and cannot be overwritten.\": \"该文件已被打开用于编辑，无法改写。\",\n\t\"Use a different filename to save your changes.\": \"请选用其他文件名保存改动后的结果。\",\n\t\"This is not a valid bitmap file, or its format is not currently supported.\": \"无效的位图文件，或者当前尚不支持这种文件格式。\",\n\t\"This is not a valid icon.\": \"无效的图标。\",\n\t\"This is not a valid cursor.\": \"无效的光标。\",\n\t\"Save was interrupted, so your file has not been saved.\": \"保存被中断，所以文件未被保存。\",\n\t\"You cannot save to a read-only file.\": \"不能保存到只读文件中，请选用其他文件名。\",\n\t\"This file is already in use.\": \"文件已在使用。\",\n\t\"Close the program, and then try again.\": \"请关闭程序，然后再试。\",\n\t\"Paint cannot save this file.\": \"画图程序不能保存该文件。\",\n\t\"Paint cannot save to the same filename with a different file type.\": \"画图程序不能以不同的文件类型保存同名文件。\",\n\t\"The grid spacing must be an integer between %d and %d.\": \"网格宽度必须是 %d 和 %d 之间的整数。\",\n\t\"There is not enough memory or resources to complete operation.\": \"内存或资源不够，无法完成操作。\",\n\t\"Close some programs, and then try again.\": \"请关闭部分程序，然后再试。\",\n\t\"Low on memory or resources.\": \"内存或资源不够。\",\n\t\"Group error.\": \"组错误。\",\n\t\"Paint was unable to print your document. Please make sure you have sufficient disk space and that your printer is working correctly.\": \"画图程序无法打印文档。请确认磁盘空间是否足够以及打印机是否能正常工作。\",\n\t\"Saving into this format may cause some loss of color information.\": \"保存为这种格式可能会丢失某些颜色信息。\",\n\t\"Do you want to continue?\": \"是否还要继续?\",\n\t\"Converting to black and white cannot be undone.  This action affects the current file and may cause some loss of color information.\": \"转换为黑白图像后将无法恢复。该操作可能会影响到当前文件，并导致部分颜色信息丢失。\",\n\t\"Bitmaps must be greater than one pixel on a side.\": \"位图必须大于一个象素。\",\n\t\"Generic error.\": \"常规错误。\",\n\t\"File not found.\": \"找不到文件。\",\n\t\"Bad path.\": \"路径不对。\",\n\t\"Too many open files.\": \"打开的文件太多。\",\n\t\"Access denied.\": \"禁止访问。\",\n\t\"Invalid file.\": \"无效文件。\",\n\t\"Remove current folder.\": \"删除当前文件夹。\",\n\t\"Folder full.\": \"文件夹已满。\",\n\t\"Bad seek.\": \"定位不对。\",\n\t\"Hard IO error.\": \"硬件 IO 错误。\",\n\t\"Sharing violation.\": \"共享侵犯。\",\n\t\"Lock violation.\": \"锁定侵犯。\",\n\t\"Disk full.\": \"磁盘已满。\",\n\t\"End of file.\": \"文件尾。\",\n\t\"Error getting the Clipboard Data!\": \"获取剪贴板数据出错！\",\n\t\"No Printer Found @ page setup\": \"未找到打印机@页面设置\",\n\t\"24-bit Bitmap (*.bmp;*.dib)\": \"24 位位图 (*.bmp;*.dib)\",\n\t\"All Files\": \"所有文件\",\n\t\"Palette|*.pal|\": \"调色板|*.pal|\",\n\t\"OLE 2.0 was unable to start.\": \"无法启动 OLE 2.0 。\",\n\t\"Make sure that you are using the correct version of the OLE libraries.\": \"请确认所使用的 OLE 库版本是否正确。\",\n\t\"Resets the text be without any attributes.\": \"取消文字的所有属性。\",\n\t\"Sets or clears the text bold attribute.\": \"设置或清除字体的加粗属性。\",\n\t\"Sets or clears the text italic attribute.\": \"设置或清除字体的斜体属性。\",\n\t\"Selects the font used by the text.\": \"选定正文字体。\",\n\t\"Selects the point size of the text.\": \"选定文字磅值。\",\n\t\"Sets or clears the text underline attribute.\": \"设置或清除字体加下划线属性。\",\n\t\"Shows or hides the tooltips.\": \"显示或隐藏工具提示。\",\n\t\"Show Paint Help.\": \"显示画图帮助。\",\n\t\"Sends a picture by using mail or fax.\": \"通过邮件或传真发送图片。\",\n\t\"Copies the selection to a file.\": \"将所选内容复制到文件。\",\n\t\"Pastes a file into the selection.\": \"将文件粘贴到选定区域。\",\n\t\"Zooms the picture to 100%.\": \"保持图片的原有尺寸。\",\n\t\"Zooms the picture to 400%.\": \"将图片放大至四倍。\",\n\t\"Zooms the picture.\": \"缩放图片。\",\n\t\"Displays the entire picture.\": \"显示整个图片。\",\n\t\"Shows or hides the thumbnail view of the picture.\": \"显示或隐藏图片的缩略图。\",\n\t\"Shows or hides the grid.\": \"显示或隐藏网格。\",\n\t\"Shows or hides the text toolbar.\": \"显示或隐藏文字工具栏。\",\n\t\"Flips or rotates the picture or a selection.\": \"翻转或旋转图片或选定的区域。\",\n\t\"Stretches or skews the picture or a selection.\": \"拉伸或扭曲图片或选定的区域。\",\n\t\"Inverts the colors of the picture or a selection.\": \"反转图片或所选区域的颜色。\",\n\t\"Changes the attributes of the picture.\": \"更改图片的属性。\",\n\t\"Clears the picture or selection.\": \"清除图片或选定区域。\",\n\t\"The font size must be a numeric value.\": \"字体大小应为数值。\",\n\t\"Contains commands for working with the selected item(s).\": \"包含处理所选项目的命令。\",\n\t\"Contains commands for selecting and transferring items.\": \"包括选定和传送某些项目的命令。\",\n\t\"Contains commands for customizing this window.\": \"包含自定义窗口的命令。\",\n\t\"Contains commands for manipulating pictures and setting attributes.\": \"包含处理图片和设置属性的命令。\",\n\t\"Contains commands for using custom colors and drawing options.\": \"包含使用自定义颜色和绘图选项的命令。\",\n\t\"Contains commands for displaying Help for and information about Paint.\": \"包含显示图画程序的帮助信息以及其他有关信息的命令。\",\n\t\"Cannot save file.\": \"不能保存文件。\",\n\t\"Error removing temporary file.\": \"删除临时文件时出错。\",\n\t\"Get Colors\": \"获取颜色\",\n\t\"Save Colors\": \"保存颜色\",\n\t\"File last saved:\": \"上次保存的文件:\",\n\t\"Not Available\": \"无法使用\",\n\t\"Size on disk:\": \"磁盘大小:\",\n\t\"%s bytes\": \"%s 字节\",\n\t\"Painting\": \"画图\",\n\t\"Bitmap\": \"位图\",\n\t\"Fonts\": \"字体\",\n\t\"Tools\": \"工具\",\n\t\"x\": \"X\",\n\t\"All Picture Files\": \"所有图片文件\",\n\t\"For Help, click Help Topics on the Help Menu.\": \"要获得帮助，请在“帮助”菜单中，单击“帮助主题”。\",\n\t\"Select an area on which to get Help.\": \"选定要了解其帮助信息的区域。\",\n\t\"%1 in %2\": \"%2 中的 %1\",\n\t\"Creates a new document.\": \"创建新文档。\",\n\t\"Opens an existing document.\": \"打开现有文档。\",\n\t\"Closes the active document.\": \"关闭活动文档。\",\n\t\"Saves the active document.\": \"保存活动文档。\",\n\t\"Saves the active document with a new name.\": \"用其他文件名保存活动文档。\",\n\t\"Changes the page layout.\": \"改变页面布局。\",\n\t\"Specifies the default printer setup.\": \"指明默认打印机设置。\",\n\t\"Prints the active document and sets printing options.\": \"打印活动文档并设置打印选项。\",\n\t\"Displays full pages.\": \"显示整页。\",\n\t\"Opens this document.\": \"打开本文档。\",\n\t\"Deletes the selection.\": \"删除所选内容。\",\n\t\"Erases everything.\": \"全部删除。\",\n\t\"Copies the selection and puts it on the Clipboard.\": \"复制所选内容并放入剪贴板。\",\n\t\"Cuts the selection and puts it on the Clipboard.\": \"剪切所选内容并放入剪贴板。\",\n\t\"Finds the specified text.\": \"查找指定文字。\",\n\t\"Inserts the contents of the Clipboard.\": \"插入剪贴板内容。\",\n\t\"Repeats the last action.\": \"重复上一操作。\",\n\t\"Replaces specific text with different text.\": \"用不同的文字替换指定的文字。\",\n\t\"Selects everything.\": \"选定所有项目。\",\n\t\"Undoes the last action.\": \"撤消上一操作。\",\n\t\"Redoes the previously undone action.\": \"重做上一次被撤消的操作。\",\n\t\"Displays program information, version number, and copyright.\": \"显示程序信息、版本号和版权。\",\n\t\"Quits Paint.\": \"退出画图。\",\n\t\"Opens Paint Help.\": \"打开画图帮助。\",\n\t\"Displays instructions about how to use Help.\": \"显示如何使用帮助的指令。\",\n\t\"Displays Help for areas you click on.\": \"显示单击区域的帮助。\",\n\t\"Displays Help for the current task or command.\": \"显示当前任务或命令的帮助。\",\n\t\"Centers this bitmap as the desktop wallpaper.\": \"将该位图作为桌面墙纸居中显示。\",\n\t\"Tiles this bitmap as the desktop wallpaper.\": \"将该位图作为桌面墙纸平铺显示。\",\n\t\"Sends the selection using mail or fax.\": \"通过邮件或传真发送选定的内容。\",\n\t\"Prints the selection.\": \"打印选定的内容。\",\n\t\"Shows or hides the thumbnail.\": \"显示或隐藏缩略图。\",\n\t\"Shows Paint Help.\": \"显示画图帮助。\",\n\t\"Shows or hides the status bar.\": \"显示或隐藏状态栏。\",\n\t\"Shows or hides the tool box.\": \"显示或隐藏工具框。\",\n\t\"Shows or hides the color box.\": \"显示或隐藏颜色盒。\",\n\t\"Only a Far East font can be used for vertical editing.\": \"只能使用远东字体进行垂直编辑。\",\n\t\"Changes the window size.\": \"更改窗口大小。\",\n\t\"Changes the window position.\": \"更改窗口位置。\",\n\t\"Reduces the window to an icon.\": \"将窗口缩为图标。\",\n\t\"Enlarges the window to full size.\": \"将窗口扩为全屏。\",\n\t\"Switches to the next document window.\": \"转至下一个文档窗口。\",\n\t\"Switches to the previous document window.\": \"转至前一个文档窗口。\",\n\t\"Closes the active window and asks if you want to save changes.\": \"关闭活动窗口，询问是否保存所做的改动。\",\n\t\"Restores the window to normal size.\": \"将窗口恢复为正常大小。\",\n\t\"Activates the task list.\": \"激活任务列表。\",\n\t\"All Files (*.*)\": \"所有文件 (*.*)\",\n\t\"Untitled\": \"未定标题\",\n\t\"an unnamed file\": \"未命名文件\",\n\t\"&Hide\": \"隐藏(&H)\",\n\t\"Hide\": \"隐藏\",\n\t\"No error message is available.\": \"没有可用的错误消息。\",\n\t\"An unsupported operation was attempted.\": \"视图执行不支持的操作。\",\n\t\"A required resource was unavailable.\": \"没有必需的资源。\",\n\t\"Out of memory.\": \"内存不足。\",\n\t\"An unknown error has occurred.\": \"出现了未知错误。\",\n\t\"on %1\": \"在 %1 上\",\n\t\"&One Page\": \"单页(&O)\",\n\t\"One Page\": \"单页\",\n\t\"&Two Page\": \"双页(&T)\",\n\t\"Two Page\": \"双页\",\n\t\"Page %u\": \"第 %u 页\",\n\t\"Pages %u-%u\": \" %u-%u 页\",\n\t\"Printer Files (*.prn)|*.prn|All Files (*.*)|*.*||\": \"打印文件 (*.prn)|*.prn|所有文件 (*.*)|*.*||\",\n\t\"Print to File\": \"打印到文件\",\n\t\"to %1\": \"到 %1\",\n\t\"&Update %1\": \"更新 %1(&U)\",\n\t\"Update %1\": \"更新 %1\",\n\t\"E&xit && Return to %1\": \"退出并返回到 %1(&X)\",\n\t\"Exit & Return to %1\": \"退出并返回到 %1\",\n\t\"Linked %s\": \"链接的 %s\",\n\t\"Unknown Type\": \"未知类型\",\n\t\"Invalid filename.\": \"无效文件名。\",\n\t\"Failed to open document.\": \"不能打开文件。\",\n\t\"Failed to save document.\": \"不能保存文件。\",\n\t\"Save changes to %1?\": \"将更改后的结果保存到 %1 吗？\",\n\t\"Failed to create empty document.\": \"创建空文档失败。\",\n\t\"The file is too large to open.\": \"文件太大，无法打开。\",\n\t\"Could not start print job.\": \"无法开始打印作业。\",\n\t\"Failed to launch help.\": \"帮助调入失败。\",\n\t\"Internal application error.\": \"内部应用程序错误。\",\n\t\"Command failed.\": \"命令无效。\",\n\t\"Insufficient memory to perform operation.\": \"内存不够，无法执行操作。\",\n\t\"System registry entries have been removed and the INI file (if any) was deleted.\": \"系统注册表项和 INI 文件（如果有）已被删除。\",\n\t\"Not all of the system registry entries (or INI file) were removed.\": \"并未删除所有系统注册表项（或 INI 文件）。\",\n\t\"This program requires the file %s, which was not found on this system.\": \"系统上找不到该程序必需的 %s文件。\",\n\t\"This program is linked to the missing export %s in the file %s. This machine may have an incompatible version of %s.\": \"该程序被链接到丢失的导出项 %s (在文件 %s 中)。所使用的 %s 版本可能不兼容。\",\n\t\"Please enter an integer.\": \"请输入一个整数。\",\n\t\"Please enter a number.\": \"请输入一个数字。\",\n\t\"Please enter an integer between %1 and %2.\": \"请输入在 %1 和 %2 之间的一个整数。\",\n\t\"Please enter a number between %1 and %2.\": \"请键入介于 %1 和 %2 之间的数字。\",\n\t\"Please enter no more than %1 characters.\": \"请输入 %1 个以内的字符。\",\n\t\"Please select a button.\": \"请选定某个按钮。\",\n\t\"Please enter an integer between 0 and 255.\": \"请输入介于 0 和 255 之间的一个整数。\",\n\t\"Please enter a positive integer.\": \"请输入一个正整数。\",\n\t\"Please enter a date and/or time.\": \"请输入日期和 / 或时间。\",\n\t\"Please enter a currency.\": \"请输入货币。\",\n\t\"Unexpected file format.\": \"意外的文件格式。\",\n\t\"Cannot find this file.\": \"找不到这份文件。\",\n\t\"Please verify that the correct path and file name are given.\": \"请确定路径和文件名是否正确。\",\n\t\"Destination disk drive is full.\": \"目标盘已满。\",\n\t\"Unable to read from %1, it is opened by someone else.\": \" %1 已被其他用户打开，因此无法从中读取数据。\",\n\t\"Unable to write to %1, it is read-only or opened by someone else.\": \" %1 为只读文件或者已被其他用户打开，因此无法写入。\",\n\t\"An unexpected error occurred while reading %1.\": \"读 %1 时出现了意外错误。\",\n\t\"An unexpected error occurred while writing %1.\": \"写 %1 时出现了意外错误。\",\n\t\"Unable to register document.\": \"无法注册文档。\",\n\t\"The document may already be open.\": \"该文档可能已被打开。\",\n\t\"Update %1 before proceeding?\": \"先更新 %1 再继续吗？\",\n\t\"Could not update client.\": \"无法更新客户。\",\n\t\"Failed to register. ActiveX features may not work properly.\": \"注册失败。ActiveX 功能将工作不正确。\",\n\t\"Failed to update the system registry.\": \"更新系统注册表失败。\",\n\t\"Please try using REGEDIT.\": \"请使用 REGEDIT 试一试。\",\n\t\"Unable to read write-only property.\": \"不能读取只写属性。\",\n\t\"Unable to write read-only property.\": \"不能写只读特性。\",\n\t\"Unable to load mail system support.\": \"不能加载邮件系统支持。\",\n\t\"Mail system DLL is invalid.\": \"邮件系统动态链接库无效。\",\n\t\"Send Mail failed to send message.\": \"“发送邮件”命令执行失败。\",\n\t\"No error occurred.\": \"没有出现错误。\",\n\t\"An unknown error occurred while accessing %1.\": \"访问 %1 时出现了未知错误。\",\n\t\"%1 was not found.\": \"找不到 %1。\",\n\t\"%1 contains an invalid path.\": \"%1 包含无效的路径。\",\n\t\"%1 could not be opened because there are too many open files.\": \"打开的文件太多，无法打开 %1。\",\n\t\"Access to %1 was denied.\": \"拒绝访问 %1。\",\n\t\"An invalid file handle was associated with %1.\": \"一个无效的文件句柄和 %1 关联。\",\n\t\"%1 could not be removed because it is the current directory.\": \"%1为当前目录，因此不能删除。\",\n\t\"%1 could not be created because the directory is full.\": \"目录已满，无法创建 %1。\",\n\t\"Seek failed on %1\": \"在 %1 上的查找失败\",\n\t\"A hardware I/O error was reported while accessing %1.\": \"访问 %1 时报告一个硬件 I/O 错误。\",\n\t\"A sharing violation occurred while accessing %1.\": \"访问 %1 时发生共享侵犯。\",\n\t\"A locking violation occurred while accessing %1.\": \"访问 %1 时发生锁定侵犯。\",\n\t\"Disk full while accessing %1.\": \"访问 %1 时磁盘已满。\",\n\t\"An attempt was made to access %1 past its end.\": \"试图访问 %1 结尾之后的数据。\",\n\t\"An attempt was made to write to the reading %1.\": \"试图将数据写入正读取的 %1 中。\",\n\t\"An attempt was made to read from the writing %1.\": \"试图从正写入的 %1 中读取数据。\",\n\t\"%1 has a bad format.\": \"%1 格式错误。\",\n\t\"%1 contained an unexpected object.\": \"%1 包含意外的对象。\",\n\t\"%1 contains an incorrect schema.\": \"%1 包含不正确的模式。\",\n\t\"Selects a rectangular part of the picture to move, copy, or edit.\": \"在图片中选定一个矩形区域，以进行移动、复制或者编辑。\",\n\t\"Select\": \"选定\",\n\t\"Selects a free-form part of the picture to move, copy, or edit.\": \"从图片中裁剪任意形状的一块进行移动、复制和编辑。\",\n\t\"Free-Form Select\": \"任意形状的裁剪\",\n\t\"Inserts text into the picture.\": \"在图片中插入文字。\",\n\t\"Fills an area with the current drawing color.\": \"使用当前的绘图色填充某块区域。\",\n\t\"Fill With Color\": \"用颜色填充\",\n\t\"Draws a straight line with the selected line width.\": \"用选定的线宽画一条直线。\",\n\t\"Line\": \"直线\",\n\t\"Draws using an airbrush of the selected size.\": \"用选定大小的喷枪绘图。\",\n\t\"Airbrush\": \"喷枪\",\n\t\"Draws a curved line with the selected line width.\": \"用选定的线宽画一条曲线。\",\n\t\"Curve\": \"曲线\",\n\t\"Draws a polygon with the selected fill style.\": \"用选定的填充模式画多边形。\",\n\t\"Polygon\": \"多边形\",\n\t\"Draws a rounded rectangle with the selected fill style.\": \"用选定的填充模式画圆角矩形。\",\n\t\"Rounded Rectangle\": \"圆角矩形\",\n\t\"Draws a free-form line one pixel wide.\": \"用单象素线宽画任意形状的线条。\",\n\t\"Pencil\": \"铅笔\",\n\t\"Erases a portion of the picture, using the selected eraser shape.\": \"使用选定橡皮抹去图片的一部分。\",\n\t\"Eraser/Color Eraser\": \"橡皮/颜色橡皮\",\n\t\"Changes the magnification.\": \"更改放大倍数。\",\n\t\"Magnifier\": \"放大\",\n\t\"Picks up a color from the picture for drawing.\": \"请在图片上选取一种颜色用以画图。\",\n\t\"Pick Color\": \"取色\",\n\t\"Draws using a brush with the selected shape and size.\": \"用选定形状和大小的刷子绘图\",\n\t\"Brush\": \"刷子\",\n\t\"Draws a rectangle with the selected fill style.\": \"用选定的填充模式画矩形。\",\n\t\"Rectangle\": \"矩形\",\n\t\"Draws a filled rectangle.\": \"画实心矩形。\",\n\t\"Draws an ellipse with the selected fill style.\": \"用选定的填充模式画椭圆。\",\n\t\"Ellipse\": \"椭圆\",\n\t\"Draws a filled ellipse.\": \"画实心椭圆。\",\n\t\"Makes the current selection either opaque or transparent.\": \"设置当前选定区域的透明特性。\",\n\t\"Creates a new color.\": \"创建新颜色。\",\n\t\"Uses a previously saved palette of colors.\": \"选用以前保存的调色板。\",\n\t\"Saves the current palette of colors to a file.\": \"将当前颜色的调色板存入文件。\",\n\t\"You must save the file before choosing it as Wallpaper.\": \"必须在将文件选为墙纸前进行保存。\",\n\t\"The selection is now larger than the bitmap.\": \"所选区域比位图大。\",\n\t\"Would you like the bitmap enlarged?\": \"是否希望放大位图?\",\n\t\"The image in the clipboard is larger than the bitmap.\": \"剪贴板中的图象比位图大。是否希望扩大位图?\",\n\t\"The file is not in the correct format.\": \"文件格式不对。\",\n\t\"Not enough room to paste text.\": \"空间不够，无法粘贴文字。\",\n\t\"Enlarge the text area and try again.\": \"请加大文字区，然后重试。\",\n\t\"Places the text.\": \"放置文字。\"\n});\n"
  },
  {
    "path": "manifest.webmanifest",
    "content": "{\n\t\"name\": \"JS Paint\",\n\t\"short_name\": \"Paint\",\n\t\"description\": \"An MS Paint remake.\",\n\t\"categories\": [\n\t\t\"photo\",\n\t\t\"utilities\",\n\t\t\"entertainment\"\n\t],\n\t\"display\": \"standalone\",\n\t\"start_url\": \".\",\n\t\"lang\": \"en-US\",\n\t\"theme_color\": \"#000080\",\n\t\"background_color\": \"#7b7b7b\",\n\t\"screenshots\": [\n\t\t{\n\t\t\t\"src\": \"images/meta/main-screenshot.png\",\n\t\t\t\"sizes\": \"888x555\",\n\t\t\t\"type\": \"image/png\"\n\t\t}\n\t],\n\t\"icons\": [\n\t\t{\n\t\t\t\"src\": \"images/icons/16x16.png\",\n\t\t\t\"sizes\": \"16x16\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"images/icons/32x32.png\",\n\t\t\t\"sizes\": \"32x32\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"images/icons/36x36.png\",\n\t\t\t\"sizes\": \"36x36\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"images/icons/48x48.png\",\n\t\t\t\"sizes\": \"48x48\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"images/icons/72x72.png\",\n\t\t\t\"sizes\": \"72x72\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"images/icons/96x96.png\",\n\t\t\t\"sizes\": \"96x96\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"images/icons/144x144.png\",\n\t\t\t\"sizes\": \"144x144\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"images/icons/192x192.png\",\n\t\t\t\"sizes\": \"192x192\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"images/icons/512x512.png\",\n\t\t\t\"sizes\": \"512x512\",\n\t\t\t\"type\": \"image/png\"\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"jspaint\",\n  \"productName\": \"JS Paint\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Classic MS Paint clone with extra features\",\n  \"license\": \"MIT\",\n  \"keywords\": [\n    \"paint\",\n    \"jspaint\",\n    \"mspaint\",\n    \"ms-paint\",\n    \"microsoft-paint\",\n    \"paintbrush\",\n    \"drawing\",\n    \"draw\",\n    \"create\",\n    \"image\",\n    \"picture\",\n    \"editor\",\n    \"edit\",\n    \"canvas\",\n    \"app\",\n    \"web-app\",\n    \"remake\",\n    \"recreation\",\n    \"clone\",\n    \"image-editing\",\n    \"image-editor\",\n    \"image-manipulation\",\n    \"raster\",\n    \"graphics\",\n    \"graphics-editing\",\n    \"graphics-editor\",\n    \"retro\",\n    \"vaporwave\",\n    \"aesthetic\",\n    \"nostalgia\",\n    \"90s\",\n    \"1990s\",\n    \"windows\",\n    \"windows-95\",\n    \"windows-98\",\n    \"windows-2000\",\n    \"windows-xp\",\n    \"windows-vista\",\n    \"electron\",\n    \"desktop-app\",\n    \"electron-app\",\n    \"pwa\",\n    \"progressive-web-app\",\n    \"98.css\",\n    \"os-gui\",\n    \"98.js.org\",\n    \"speech-recognition\",\n    \"voice-control\",\n    \"voice-commands\",\n    \"voice-recognition\",\n    \"eye-gaze\",\n    \"eye-tracking\",\n    \"head-tracking\",\n    \"palette\",\n    \"color-picker\",\n    \"color-palette\",\n    \"png\",\n    \"tiff\",\n    \"jpeg\",\n    \"bmp\",\n    \"bitmap\"\n  ],\n  \"homepage\": \"https://jspaint.app/about\",\n  \"author\": \"Isaiah Odhner <isaiahodhner@gmail.com> (https://isaiahodhner.io)\",\n  \"funding\": [\n    {\n      \"type\": \"individual\",\n      \"url\": \"https://paypal.me/isaiahodhner\"\n    }\n  ],\n  \"main\": \"src/electron-main.js\",\n  \"dependencies\": {\n    \"argparse\": \"^2.0.1\",\n    \"electron-squirrel-startup\": \"^1.0.0\",\n    \"lookpath\": \"^1.2.2\",\n    \"wallpaper\": \"^4.4.2\"\n  },\n  \"devDependencies\": {\n    \"@1j01/live-server\": \"^1.3.1\",\n    \"@electron-forge/cli\": \"^7.3.0\",\n    \"@electron-forge/maker-deb\": \"^7.3.0\",\n    \"@electron-forge/maker-rpm\": \"^7.3.0\",\n    \"@electron-forge/maker-squirrel\": \"^7.3.0\",\n    \"@electron-forge/maker-zip\": \"^7.3.0\",\n    \"@electron-forge/publisher-github\": \"^7.3.0\",\n    \"@eslint/js\": \"^9.4.0\",\n    \"@stylistic/eslint-plugin\": \"^2.1.0\",\n    \"@types/dom-speech-recognition\": \"^0.0.4\",\n    \"@types/jquery\": \"^3.5.29\",\n    \"@types/wicg-file-system-access\": \"^2023.10.5\",\n    \"@types/youtube\": \"^0.0.50\",\n    \"cspell-cli\": \"^8.4.0\",\n    \"cypress\": \"4.7.0\",\n    \"cypress-image-snapshot\": \"^4.0.1\",\n    \"electron\": \"^20.3.12\",\n    \"electron-debug\": \"^3.2.0\",\n    \"eslint\": \"^9.4.0\",\n    \"glob\": \"^10.3.10\",\n    \"globals\": \"^15.3.0\",\n    \"npm-run-all\": \"^4.1.5\",\n    \"onchange\": \"^7.1.0\",\n    \"os-gui\": \"0.7.3\",\n    \"rtlcss\": \"^4.1.1\",\n    \"start-server-and-test\": \"^2.0.3\",\n    \"typescript\": \"^5.4.3\"\n  },\n  \"scripts\": {\n    \"electron:start\": \"electron-forge start\",\n    \"electron:debug-start\": \"electron-forge start --inspect-electron\",\n    \"electron:package\": \"electron-forge package\",\n    \"electron:make\": \"electron-forge make\",\n    \"electron:publish\": \"electron-forge publish\",\n    \"lint-cspell\": \"cspell-cli lint .\",\n    \"lint-tsc\": \"tsc --noEmit --project jsconfig.json\",\n    \"lint-eslint\": \"eslint\",\n    \"lint\": \"npm-run-all --continue-on-error --serial lint-*\",\n    \"format\": \"eslint --fix --fix-type layout\",\n    \"build-css\": \"rtlcss styles/layout.css styles/layout.rtl.css && rtlcss lib/os-gui/build/layout.css lib/os-gui/build/layout.rtl.css && rtlcss lib/98.css/98.custom-build.css lib/98.css/98.custom-build.rtl.css\",\n    \"watch-css\": \"onchange --initial --poll 100 \\\"styles/layout.css\\\" \\\"lib/os-gui/build/layout.css\\\" \\\"lib/98.css/98.custom-build.css\\\" -- npm run build-css\",\n    \"update-localization\": \"node ./localization/preprocess.js\",\n    \"sync-os-gui\": \"node ./sync-package.js os-gui && git apply --ignore-whitespace ./lib/os-gui.patch && npm run build-css\",\n    \"dev\": \"run-p watch-css dev:start-server\",\n    \"dev:start-server\": \"live-server --port=1999 --ignorePattern=\\\"(node_modules|cypress|out)[/\\\\\\\\\\\\\\\\]|package\\\\.json|cypress\\\\.json\\\"\",\n    \"dev:start-server:NOTE\": \"@XXX: the octuple backlash ends up meaning a single backslash on Linux, two backslashes on Windows. In this case it's fine because it's in a regexp character class so the extra is redundant and doesn't cause an error.\",\n    \"test:start-server\": \"live-server --port=11822 --no-browser --ignorePattern=\\\"(node_modules|cypress|out)[/\\\\\\\\\\\\\\\\]|package\\\\.json|cypress\\\\.json\\\"\",\n    \"test:start-server:NOTE\": \"@XXX: the octuple backlash ends up meaning a single backslash on Linux, two backslashes on Windows. In this case it's fine because it's in a regexp character class so the extra is redundant and doesn't cause an error.\",\n    \"cy:open\": \"cypress open\",\n    \"cy:run\": \"cypress run\",\n    \"cy:accept\": \"cypress run --env updateSnapshots=true\",\n    \"test\": \"start-server-and-test test:start-server http://localhost:11822 cy:run\",\n    \"accept\": \"start-server-and-test test:start-server http://localhost:11822 cy:accept\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/1j01/jspaint.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/1j01/jspaint/issues\",\n    \"email\": \"isaiahodhner@gmail.com\"\n  }\n}\n"
  },
  {
    "path": "privacy.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>JS Paint — Privacy Policy</title>\n\n\t<meta http-equiv=\"Content-Security-Policy\" content=\"\n\t\tdefault-src 'self';\n\t\tstyle-src 'self' 'unsafe-inline';\n\t\">\n\n\t<link rel=\"apple-touch-icon\" href=\"images/icons/apple-icon-180x180.png\">\n\t<!-- Chrome will pick the largest image for some reason, instead of the most appropriate one. -->\n\t<!-- <link rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"images/icons/192x192.png\">\n\t\t<link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"images/icons/32x32.png\">\n\t\t<link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"images/icons/96x96.png\"> -->\n\t<!-- <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"images/icons/16x16.png\"> -->\n\t<link rel=\"shortcut icon\" href=\"favicon.ico\">\n\t<link rel=\"mask-icon\" href=\"images/icons/safari-pinned-tab.svg\" color=\"red\">\n\t<link rel=\"manifest\" href=\"manifest.webmanifest\">\n\t<meta name=\"msapplication-TileColor\" content=\"#008080\">\n\t<meta name=\"msapplication-TileImage\" content=\"images/icons/ms-icon-144x144.png\">\n\t<meta name=\"theme-color\" content=\"#000080\">\n\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n\t<meta name=\"description\" content=\"Classic MS Paint in the browser, with extra features\">\n\n\t<link href=\"styles/legal.css\" rel=\"stylesheet\" type=\"text/css\">\n\n</head>\n\n<body>\n\t<h1 style=\"text-align: center;\">\n\t\t<a href=\"https://jspaint.app\">\n\t\t\t<img src=\"images/icons/jspaint.svg\" width=\"192\" height=\"192\" alt=\"\">\n\t\t\t<br>\n\t\t\t<span id=\"jspaint-project-name\">JS Paint</span>\n\t\t</a>\n\t\t<br>\n\t\t<span id=\"jspaint-page-title\">Privacy Policy</span>\n\t</h1>\n\n\t<p style=\"text-align: center;\">JS Paint is a pixel-perfect remake of Microsoft Paint that runs in the browser.\n\t</p>\n\n\t<p style=\"text-align: center;\">This privacy policy applies to the JS Paint website at\n\t\t<a href=\"https://jspaint.app\">jspaint.app</a>.\n\t</p>\n\n\t<main>\n\t\t<h2>Personal Data</h2>\n\t\t<p>\n\t\t\tJS Paint doesn't track you or sell your data.\n\t\t</p>\n\t\t<h2>Third-Party Services</h2>\n\t\t<p>\n\t\t\tJS Paint doesn't send any information to a server in most cases.\n\t\t</p>\n\t\t<p>\n\t\t\tThere are a few features which do talk to a server:\n\t\t</p>\n\t\t<ul>\n\t\t\t<li>\n\t\t\t\t<strong>File > Upload to Imgur</strong> naturally requires sending the image to\n\t\t\t\t<a href=\"https://imgur.com\">Imgur</a> for hosting.\n\t\t\t</li>\n\t\t\t<li>\n\t\t\t\tIf you paste an image URL, the app will fetch the image via the URL,\n\t\t\t\tor if that doesn't work, fetch via a\n\t\t\t\t<a href=\"https://github.com/Rob--W/cors-anywhere\">CORS Anywhere</a>\n\t\t\t\tproxy service, or if that doesn't work, attempt to fetch via the\n\t\t\t\t<a href=\"https://web.archive.org/\">Internet Archive Wayback Machine</a>.\n\t\t\t</li>\n\t\t\t<li>\n\t\t\t\tIn Speech Recognition mode (<strong>Extras > Speech Recognition</strong>),\n\t\t\t\tif you say for example \"draw a cat\",\n\t\t\t\tit will try to do an anonymous Bing Images search for \"cat\" clipart,\n\t\t\t\tand then animate sketching it.\n\t\t\t</li>\n\t\t\t<li>\n\t\t\t\tMulti-User mode (<strong>Extras > Multi-User</strong>), intended for online collaboration, uses\n\t\t\t\t<a href=\"https://firebase.google.com/\">Firebase</a> for real-time communication.\n\t\t\t</li>\n\t\t</ul>\n\t\t<p>\n\t\t\tSome of these features may be defunct due to changes in the services they rely on.\n\t\t\tThey may be replaced or removed in the future, to simplify the privacy policy.\n\t\t</p>\n\n\t\t<h2>Local Storage</h2>\n\t\t<p>\n\t\t\tJS Paint uses local storage to save your work in progress.\n\t\t</p>\n\t\t<p>\n\t\t\tYou can view and delete stored images with <strong>File > Manage Storage</strong>.\n\t\t</p>\n\t\t<p>\n\t\t\tThink of this as a backup, in case you close the tab by accident or your computer crashes.\n\t\t\tDon't rely on it as your only backup.\n\t\t</p>\n\t\t<p>\n\t\t\tThere is currently no option to prevent the app from saving a backup,\n\t\t\thowever you can use your browser's private browsing mode to prevent the data from being persisted.\n\t\t</p>\n\t\t<p>\n\t\t\tIf the URL starts with <code>https://jspaint.app/#local:</code>, it's a local session, private to you.\n\t\t</p>\n\n\t\t<h2>Collaborative Sessions</h2>\n\t\t<p>\n\t\t\tMulti-user sessions are currently public. Anyone could find and view, edit, or delete them.\n\t\t</p>\n\t\t<p>\n\t\t\tPrivate collaborative sessions are not yet supported.\n\t\t</p>\n\t\t<p>\n\t\t\tIf the URL starts with <code>https://jspaint.app/#session:</code>, it's a multi-user session.\n\t\t</p>\n\t</main>\n\t<hr>\n\t<footer>\n\t\t<h2>More Info</h2>\n\t\t<p>\n\t\t\t<a href=\"https://jspaint.app\"><img src=\"images/icons/32x32.png\" width=\"32\" height=\"32\" alt=\"\"\n\t\t\t\t\tstyle=\"vertical-align: middle\"></a>\n\t\t\tJS Paint is a project by <a href=\"https://isaiahodhner.io\">Isaiah Odhner</a>.\n\t\t<p>\n\t\t\t<a href=\"https://github.com/1j01/jspaint/blob/master/LICENSE.txt\"><img src=\"images/about/free.gif\"\n\t\t\t\t\twidth=\"88\" height=\"39\" alt=\"Free\" style=\"vertical-align: middle\"></a>\n\t\t\tThe project is open source under the permissive\n\t\t\t<a href=\"https://github.com/1j01/jspaint/blob/master/LICENSE.txt\">MIT License</a>.\n\t\t</p>\n\t\t<p>\n\t\t\t<a href=\"https://github.com/1j01/jspaint/issues\"><img src=\"images/about/foco.gif\" width=\"40\" height=\"40\"\n\t\t\t\t\talt=\"Ideas\" style=\"vertical-align: middle\"></a>\n\t\t\tYou can request features and report bugs\n\t\t\t<a href=\"https://github.com/1j01/jspaint/issues\">on GitHub</a>\n\t\t\tor <a href=\"mailto:isaiahodhner@gmail.com?subject=JS%20Paint\">by email</a>.\n\t\t</p>\n\t\t<p>\n\t\t\t<a href=\"about.html\">\n\t\t\t\t<img src=\"images/about/moreinfo_paint.gif\" width=\"100\" height=\"60\" alt=\"More info\"\n\t\t\t\t\tstyle=\"vertical-align: middle\">\n\t\t\t\tMore about JS Paint\n\t\t\t</a>\n\t\t</p>\n\t</footer>\n</body>\n\n</html>"
  },
  {
    "path": "prune-globals.js",
    "content": "// Usage: node prune-globals.js\n// This script will document which `window.* = ...` assignments are used by other files in the src directory.\n// Also its purpose is very specific; it only looks for global assignments following a \"// Temporary globals\" comment.\n\nconst fs = require(\"fs\");\nconst path = require(\"path\");\nconst espree = require(\"espree\");\n\n// Assuming all files are in the src directory and not subdirectories\nconst srcDir = \"./src\";\n\n// Silly wrapper function to read a file and return its content\nfunction readFile(filePath) {\n\treturn fs.readFileSync(filePath, \"utf8\");\n}\n\n// Function to write content to a file\nfunction writeFile(filePath, content) {\n\tconsole.log(\"Writing file\", filePath);\n\tfs.writeFileSync(filePath, content, \"utf8\");\n}\n\n// function escapeRegExp(string) {\n// \treturn string.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"); // $& means the whole matched string\n// }\n\n// Function to find non-ESM usages of an identifier\n// Unstructured naive search\n// function findDependencies(identifier, fileContent, excludeFiles = []) {\n// \t// console.log(\"Finding dependencies for\", identifier);\n// \tconst importRegex = new RegExp(`^\\\\s*import .*${escapeRegExp(identifier)}.* from`, \"m\");\n// \t// Identifiers starting with $ will not work with \\b because $ is not part of \\w\n// \t// const usageRegex = new RegExp(`\\\\b${escapeRegExp(identifier)}\\\\b`, \"m\");\n// \t// So instead we use a negative lookbehind and a negative lookahead\n// \t// This is not Unicode-friendly, but it should work for ASCII\n// \tconst usageRegex = new RegExp(`(?<![0-9A-Z_$])${escapeRegExp(identifier)}(?![0-9A-Z_$])`, \"m\");\n// \tconst dependencies = [];\n// \tfor (const [filePath, content] of Object.entries(fileContent)) {\n// \t\tif (excludeFiles.includes(filePath)) {\n// \t\t\tcontinue;\n// \t\t}\n// \t\tif (usageRegex.test(content)) {\n// \t\t\tif (!importRegex.test(content)) {\n// \t\t\t\t// console.log(`'${filePath}' includes '${identifier}' but doesn't match ${importRegex}`);\n// \t\t\t\t// console.log(\"Usage:\\n    \", content.match(new RegExp(`.*${escapeRegExp(identifier)}.*`, \"m\"))[0]);\n// \t\t\t\tdependencies.push(filePath);\n// \t\t\t}\n// \t\t}\n// \t}\n// \treturn dependencies;\n// }\n\n// Somewhat more structured search using tokens but not fully utilizing AST\n// This will correctly ignore comments and strings, but will still give false positives for identifiers in local scopes and such.\nfunction findDependencies(identifier, fileContentTree, excludeFiles = []) {\n\tconst dependencies = [];\n\tfor (const [filePath, tree] of Object.entries(fileContentTree)) {\n\t\tif (excludeFiles.includes(filePath)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconsole.log(\"Checking\", filePath, \"for\", identifier);\n\t\t// Look for imports of the identifier:\n\t\tlet foundImport = false;\n\t\tfor (const node of tree.body) {\n\t\t\tif (node.type === \"ImportDeclaration\") {\n\t\t\t\tfor (const specifier of node.specifiers) {\n\t\t\t\t\tif (specifier.imported.name === identifier) {\n\t\t\t\t\t\tconsole.log(\"Found ESM (non-global) import of\", identifier, \"in\", filePath);\n\t\t\t\t\t\tfoundImport = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (foundImport) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Look for other usages of the identifier:\n\t\t// console.log(\"Tokens:\", tree.tokens);\n\t\tfor (const token of tree.tokens) {\n\t\t\tif (token.type === \"Identifier\" && token.value === identifier) {\n\t\t\t\t// const parent = token.parent;\n\t\t\t\tdependencies.push(filePath);\n\t\t\t\tconsole.log(\"Found\", identifier, \"in\", filePath);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn dependencies;\n}\n\n// Function to process each file in the src directory\nfunction processFiles() {\n\tconst fileUpperContent = {};\n\tconst fileUpperContentTree = {};\n\tconst fileLowerContent = {};\n\tfs.readdir(srcDir, (err, files) => {\n\t\tif (err) {\n\t\t\tconsole.error(\"Error reading directory:\", err);\n\t\t\treturn;\n\t\t}\n\t\t// First read all files into memory, since we'll need to look at each file\n\t\t// in reference to every other file, and there's not that many files.\n\t\tfor (const file of files) {\n\t\t\tif (path.extname(file) === \".js\") {\n\t\t\t\tconst filePath = path.join(srcDir, file);\n\t\t\t\tconst content = readFile(filePath);\n\t\t\t\t// Break the files into content above and below (and including) the \"// Temporary globals\" comment,\n\t\t\t\t// in order to avoid matching the identifier within the comments generated by this script.\n\t\t\t\t// The identifier matching is still naive, but this lets the script be idempotent.\n\t\t\t\t// By passing only upper content to findDependencies,\n\t\t\t\t// while the replacements are only made to the lower content,\n\t\t\t\t// we avoid changes to the content that would affect the ultimate behavior of the script.\n\t\t\t\tconst startIndex = content.indexOf(\"// Temporary globals\");\n\t\t\t\tif (startIndex !== -1) {\n\t\t\t\t\tfileUpperContent[filePath] = content.slice(0, startIndex);\n\t\t\t\t\tfileLowerContent[filePath] = content.slice(startIndex);\n\t\t\t\t} else {\n\t\t\t\t\tfileUpperContent[filePath] = content;\n\t\t\t\t\tfileLowerContent[filePath] = \"\";\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tfileUpperContentTree[filePath] = espree.parse(fileUpperContent[filePath], {\n\t\t\t\t\t\tecmaVersion: 2020,\n\t\t\t\t\t\tsourceType: fileUpperContent[filePath].match(/import .* from/) ? \"module\" : \"script\",\n\t\t\t\t\t\ttokens: true,\n\t\t\t\t\t});\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(`Error parsing ${filePath}:`, e);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Then process each file.\n\t\tfor (const filePath of Object.keys(fileUpperContent)) {\n\t\t\tconsole.log(\"--------\", filePath);\n\t\t\tconst upper = fileUpperContent[filePath];\n\t\t\tconst lower = fileLowerContent[filePath];\n\t\t\t// Match and replace in one fell swoop\n\t\t\tconst updatedContent = upper + lower.replace(\n\t\t\t\t/(?:\\/\\/\\s*)?(window\\.(.*?) = .*;)(\\s*\\/\\/.*)?/g,\n\t\t\t\t(_match, assignment, identifier, _comment) => {\n\t\t\t\t\tconst dependencies = findDependencies(identifier, fileUpperContentTree, [filePath]);\n\t\t\t\t\tconst formatPath = (filePath) => path.relative(srcDir, filePath).replace(/\\\\/g, \"/\");\n\t\t\t\t\tconst formattedPaths = dependencies.map(formatPath).join(\", \");\n\t\t\t\t\tconsole.log(`Dependencies for ${identifier}: ${formattedPaths || \"(none found)\"}`);\n\t\t\t\t\tif (dependencies.length) {\n\t\t\t\t\t\treturn `${assignment} // may be used by ${formattedPaths}`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn `// ${assignment} // unused`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t\twriteFile(filePath, updatedContent);\n\t\t}\n\t});\n}\n\nprocessFiles();\n"
  },
  {
    "path": "src/$ColorBox.js",
    "content": "// @ts-check\n/* global $bottom, $left, $right, button, get_direction, localize, palette, selected_colors */\nimport { $Component } from \"./$Component.js\";\n// import { get_direction, localize } from \"./app-localization.js\";\nimport { show_edit_colors_window } from \"./edit-colors.js\";\nimport { $G, E, make_canvas } from \"./helpers.js\";\n\n/**\n * Used by the Colors Box and by the Edit Colors dialog.\n * @param {string | CanvasPattern} color\n * @returns {JQuery<HTMLDivElement>}\n */\nfunction $Swatch(color) {\n\tconst $swatch = $(E(\"div\")).addClass(\"swatch\");\n\tconst swatch_canvas = make_canvas();\n\t$(swatch_canvas).css({ pointerEvents: \"none\" }).appendTo($swatch);\n\n\t// @TODO: clean up event listener\n\t$G.on(\"theme-load\", () => { update_$swatch($swatch); });\n\t$swatch.data(\"swatch\", color);\n\tupdate_$swatch($swatch, color);\n\n\treturn $swatch;\n}\n\n/**\n * @param {JQuery<HTMLDivElement>} $swatch\n * @param {string | CanvasPattern | undefined=} new_color\n */\nfunction update_$swatch($swatch, new_color) {\n\tif (new_color instanceof CanvasPattern) {\n\t\t$swatch.addClass(\"pattern\");\n\t\t$swatch[0].dataset.color = \"\";\n\t} else if (typeof new_color === \"string\") {\n\t\t$swatch.removeClass(\"pattern\");\n\t\t$swatch[0].dataset.color = new_color;\n\t} else if (new_color !== undefined) {\n\t\tthrow new TypeError(`argument to update_$swatch must be CanvasPattern or string (or undefined); got type ${typeof new_color}`);\n\t}\n\tnew_color = new_color || $swatch.data(\"swatch\");\n\t$swatch.data(\"swatch\", new_color);\n\tconst swatch_canvas = /** @type {PixelCanvas} */ (\n\t\t$swatch.find(\"canvas\")[0]\n\t);\n\trequestAnimationFrame(() => {\n\t\tswatch_canvas.width = $swatch.innerWidth();\n\t\tswatch_canvas.height = $swatch.innerHeight();\n\t\tif (new_color) {\n\t\t\tswatch_canvas.ctx.fillStyle = new_color;\n\t\t\tswatch_canvas.ctx.fillRect(0, 0, swatch_canvas.width, swatch_canvas.height);\n\t\t}\n\t});\n}\n\n/**\n * @param {boolean} vertical\n * @returns {JQuery<HTMLDivElement> & I$Component & I$ColorBox}\n */\nfunction $ColorBox(vertical) {\n\tconst $cb = $(E(\"div\")).addClass(\"color-box\");\n\n\tconst $current_colors = $Swatch(selected_colors.ternary).addClass(\"current-colors\");\n\tconst $palette = $(E(\"div\")).addClass(\"palette\");\n\n\t$cb.append($current_colors, $palette);\n\n\tconst $foreground_color = $Swatch(selected_colors.foreground).addClass(\"color-selection foreground-color\");\n\tconst $background_color = $Swatch(selected_colors.background).addClass(\"color-selection background-color\");\n\t$current_colors.append($background_color, $foreground_color);\n\n\t$G.on(\"option-changed\", () => {\n\t\tupdate_$swatch($foreground_color, selected_colors.foreground);\n\t\tupdate_$swatch($background_color, selected_colors.background);\n\t\tupdate_$swatch($current_colors, selected_colors.ternary);\n\t});\n\n\t$current_colors.on(\"pointerdown\", () => {\n\t\tconst new_bg = selected_colors.foreground;\n\t\tselected_colors.foreground = selected_colors.background;\n\t\tselected_colors.background = new_bg;\n\t\t$G.triggerHandler(\"option-changed\");\n\t});\n\n\tconst make_color_button = (color) => {\n\n\t\tconst $b = $Swatch(color).addClass(\"color-button\");\n\t\t$b.appendTo($palette);\n\n\t\tconst double_click_period_ms = 400;\n\t\tlet within_double_click_period = false;\n\t\tlet double_click_button = null;\n\t\tlet double_click_tid;\n\t\t// @TODO: handle left+right click at same time\n\t\t// can do this with mousedown instead of pointerdown, but may need to improve Dwell Clicker click simulation\n\t\t$b.on(\"pointerdown\", (e) => {\n\t\t\t// @TODO: allow metaKey for ternary color, and selection cropping, on macOS?\n\n\t\t\tif (button === 0) {\n\t\t\t\t$c.data(\"$last_fg_color_button\", $b);\n\t\t\t}\n\n\t\t\tconst color_selection_slot = e.ctrlKey ? \"ternary\" : e.button === 0 ? \"foreground\" : e.button === 2 ? \"background\" : null;\n\t\t\tif (color_selection_slot) {\n\t\t\t\tif (within_double_click_period && e.button === double_click_button) {\n\t\t\t\t\tshow_edit_colors_window($b, color_selection_slot);\n\t\t\t\t} else {\n\t\t\t\t\tselected_colors[color_selection_slot] = $b.data(\"swatch\");\n\t\t\t\t\t$G.trigger(\"option-changed\");\n\t\t\t\t}\n\n\t\t\t\tclearTimeout(double_click_tid);\n\t\t\t\tdouble_click_tid = setTimeout(() => {\n\t\t\t\t\twithin_double_click_period = false;\n\t\t\t\t\tdouble_click_button = null;\n\t\t\t\t}, double_click_period_ms);\n\t\t\t\twithin_double_click_period = true;\n\t\t\t\tdouble_click_button = e.button;\n\t\t\t}\n\t\t});\n\t};\n\n\tconst build_palette = () => {\n\t\t$palette.empty();\n\n\t\tpalette.forEach(make_color_button);\n\n\t\t// Note: this doesn't work until the colors box is in the DOM\n\t\tconst $some_button = $palette.find(\".color-button\");\n\t\tif (vertical) {\n\t\t\tconst height_per_button =\n\t\t\t\t$some_button.outerHeight() +\n\t\t\t\tparseFloat(getComputedStyle($some_button[0]).getPropertyValue(\"margin-top\")) +\n\t\t\t\tparseFloat(getComputedStyle($some_button[0]).getPropertyValue(\"margin-bottom\"));\n\t\t\t$palette.height(Math.ceil(palette.length / 2) * height_per_button);\n\t\t} else {\n\t\t\tconst width_per_button =\n\t\t\t\t$some_button.outerWidth() +\n\t\t\t\tparseFloat(getComputedStyle($some_button[0]).getPropertyValue(\"margin-left\")) +\n\t\t\t\tparseFloat(getComputedStyle($some_button[0]).getPropertyValue(\"margin-right\"));\n\t\t\t$palette.width(Math.ceil(palette.length / 2) * width_per_button);\n\t\t}\n\n\t\t// the \"last foreground color button\" starts out as the first in the palette\n\t\t$c.data(\"$last_fg_color_button\", $palette.find(\".color-button:first-child\"));\n\t};\n\n\tlet $c;\n\tif (vertical) {\n\t\t$c = $Component(localize(\"Colors\"), \"colors-component\", \"tall\", $cb);\n\t\t$c.appendTo(get_direction() === \"rtl\" ? $left : $right); // opposite ToolBox by default\n\t} else {\n\t\t$c = $Component(localize(\"Colors\"), \"colors-component\", \"wide\", $cb);\n\t\t$c.appendTo($bottom);\n\t}\n\n\tbuild_palette();\n\t$(window).on(\"theme-change\", build_palette);\n\n\t// I'm gonna do things messy, got a long road to go!\n\t// eslint-disable-next-line no-self-assign\n\t$c = /** @type {JQuery<HTMLDivElement> & I$Component & I$ColorBox} */ ($c);\n\n\t$c.rebuild_palette = build_palette;\n\n\treturn $c;\n}\n\nexport {\n\t$ColorBox,\n\t$Swatch,\n\tupdate_$swatch\n};\n\n"
  },
  {
    "path": "src/$Component.js",
    "content": "// @ts-check\n/* global $bottom, $canvas, $left, $right, $top, get_direction */\n\nimport { $ToolWindow } from \"./$ToolWindow.js\";\n// import { get_direction } from \"./app-localization.js\";\nimport { $G, E } from \"./helpers.js\";\n\n// Segments here represent UI components as far as a layout algorithm is concerned,\n// line segments in one dimension (regardless of whether that dimension is vertical or horizontal),\n// with a reference to the UI component DOM element so it can be updated.\n\nfunction get_segments(component_area_el, pos_axis, exclude_component_el) {\n\tconst $other_components = $(component_area_el).find(\".component\").not(exclude_component_el);\n\treturn $other_components.toArray().map((component_el) => {\n\t\tconst segment = { element: component_el };\n\t\tif (pos_axis === \"top\") {\n\t\t\tsegment.pos = component_el.offsetTop;\n\t\t\tsegment.length = component_el.clientHeight;\n\t\t} else if (pos_axis === \"left\") {\n\t\t\tsegment.pos = component_el.offsetLeft;\n\t\t\tsegment.length = component_el.clientWidth;\n\t\t} else if (pos_axis === \"right\") {\n\t\t\tsegment.pos = component_area_el.scrollWidth - component_el.offsetLeft;\n\t\t\tsegment.length = component_el.clientWidth;\n\t\t}\n\t\treturn segment;\n\t});\n}\n\nfunction adjust_segments(segments, total_available_length) {\n\tsegments.sort((a, b) => a.pos - b.pos);\n\n\t// Clamp\n\tfor (const segment of segments) {\n\t\tsegment.pos = Math.max(segment.pos, 0);\n\t\tsegment.pos = Math.min(segment.pos, total_available_length - segment.length);\n\t}\n\n\t// Shove things downwards to prevent overlap\n\tfor (let i = 1; i < segments.length; i++) {\n\t\tconst segment = segments[i];\n\t\tconst prev_segment = segments[i - 1];\n\t\tconst overlap = prev_segment.pos + prev_segment.length - segment.pos;\n\t\tif (overlap > 0) {\n\t\t\tsegment.pos += overlap;\n\t\t}\n\t}\n\n\t// Clamp\n\tfor (const segment of segments) {\n\t\tsegment.pos = Math.max(segment.pos, 0);\n\t\tsegment.pos = Math.min(segment.pos, total_available_length - segment.length);\n\t}\n\n\t// Shove things upwards to get things back on screen\n\tfor (let i = segments.length - 2; i >= 0; i--) {\n\t\tconst segment = segments[i];\n\t\tconst prev_segment = segments[i + 1];\n\t\tconst overlap = segment.pos + segment.length - prev_segment.pos;\n\t\tif (overlap > 0) {\n\t\t\tsegment.pos -= overlap;\n\t\t}\n\t}\n}\n\nfunction apply_segments(component_area_el, pos_axis, segments) {\n\t// Since things aren't positioned absolutely, calculate space between\n\tlet length_before = 0;\n\tfor (const segment of segments) {\n\t\tsegment.margin_before = segment.pos - length_before;\n\t\tlength_before = segment.length + segment.pos;\n\t}\n\n\t// Apply to the DOM\n\tfor (const segment of segments) {\n\t\tcomponent_area_el.appendChild(segment.element);\n\t\t$(segment.element).css(`margin-${pos_axis}`, segment.margin_before);\n\t}\n}\n\n/**\n * @param {string} title\n * @param {string} className\n * @param {\"tall\" | \"wide\"} orientation\n * @param {JQuery<HTMLElement>} $el\n * @returns {JQuery<HTMLDivElement> & I$Component}\n */\nfunction $Component(title, className, orientation, $el) {\n\t// A draggable widget that can be undocked into a window\n\tconst $c = /** @type {JQuery<HTMLDivElement> & I$Component} */ ($(E(\"div\")).addClass(\"component\"));\n\t$c.addClass(className);\n\t$c.addClass(orientation);\n\t$c.append($el);\n\t$c.css(\"touch-action\", \"none\");\n\n\tconst $w = $ToolWindow($c);\n\t$w.title(title);\n\t$w.hide();\n\t$w.$content.addClass({\n\t\ttall: \"vertical\",\n\t\twide: \"horizontal\",\n\t}[orientation]);\n\n\t// Nudge the Colors component over a tiny bit\n\tif (className === \"colors-component\" && orientation === \"wide\") {\n\t\t$c.css(\"position\", \"relative\");\n\t\t$c.css(`margin-${get_direction() === \"rtl\" ? \"right\" : \"left\"}`, \"3px\");\n\t}\n\n\tconst apply_scale = () => {\n\t\tconst enabled = $(\"body\").hasClass(\"enlarge-ui\");\n\n\t\t// Temporarily disable the transform to measure the unscaled size\n\t\t// (Previously used scrollWidth/scrollHeight, which is naturally unaffected by the scale,\n\t\t// but that is affected by the advent calendar style tool button flaps in the Winter theme.)\n\t\t$c.css(\"transform\", \"none\");\n\n\t\t// Measure the untransformed size\n\t\tconst containerBounds = $c[0].getBoundingClientRect();\n\t\tconst containerWidth = containerBounds.width;\n\t\tconst containerHeight = containerBounds.height;\n\n\t\t// Define CSS properties for scaling\n\t\tlet scale = 3;\n\t\tconst docked = $c.parent().is(\".component-area\");\n\t\tif (docked) {\n\t\t\tscale = Math.min(scale,\n\t\t\t\torientation === \"tall\" ?\n\t\t\t\t\t$c.parent().height() / containerHeight :\n\t\t\t\t\t$c.parent().width() / containerWidth\n\t\t\t);\n\t\t}\n\t\tconst props = {\n\t\t\t// The `transform` breaks the overflow of the Winter theme's tool button flaps, but what are you going to do?\n\t\t\t// Well, `zIndex: 2` or higher seems to fix it, probably competing with the .main-canvas's z-index of 2,\n\t\t\t// but causes other problems, like depth ordering with the floating undo button,\n\t\t\t// and there's probably a reason for the .main-canvas having that z-index, and I don't really want to play z-index wack-a-mole.\n\t\t\t// zIndex: 2, // @#: z-index\n\t\t\ttransform: `scale(${scale})`,\n\t\t\ttransformOrigin: \"0 0\",\n\t\t\tmarginRight: containerWidth * (scale - 1),\n\t\t\tmarginBottom: containerHeight * (scale - 1),\n\t\t};\n\n\t\t// Apply or remove the scaling\n\t\tif (enabled) {\n\t\t\t$c.css(props);\n\t\t} else {\n\t\t\tfor (const key in props) {\n\t\t\t\t$c.css(key, \"\");\n\t\t\t}\n\t\t}\n\t};\n\tlet iid;\n\tconst update_auto_scaling = () => {\n\t\tclearInterval(iid);\n\t\tif ($(\"body\").hasClass(\"enlarge-ui\")) {\n\t\t\t// @TODO: don't use an interval for this!\n\t\t\tiid = setInterval(apply_scale, 200);\n\t\t}\n\t\tapply_scale();\n\t};\n\t$G.on(\"enlarge-ui-toggled\", update_auto_scaling);\n\tupdate_auto_scaling();\n\n\tlet ox, oy;\n\tlet ox2, oy2;\n\tlet w, h;\n\tlet pos = 0;\n\tlet pos_axis;\n\tlet last_docked_to_pos;\n\tlet $last_docked_to;\n\tlet $dock_to;\n\tlet $ghost;\n\n\tif (orientation === \"tall\") {\n\t\tpos_axis = \"top\";\n\t} else if (get_direction() === \"rtl\") {\n\t\tpos_axis = \"right\";\n\t} else {\n\t\tpos_axis = \"left\";\n\t}\n\n\t/**\n\t * @param {JQuery<HTMLElement>} $dock_to\n\t */\n\tconst dock_to = ($dock_to) => {\n\t\t$w.hide();\n\n\t\t// must get layout state *before* changing it\n\t\tconst segments = get_segments($dock_to[0], pos_axis, $c[0]);\n\n\t\t// so we can measure clientWidth/clientHeight\n\t\t$dock_to.append($c);\n\n\t\tsegments.push({\n\t\t\telement: $c[0],\n\t\t\tpos: pos,\n\t\t\tlength: $c[0][pos_axis === \"top\" ? \"clientHeight\" : \"clientWidth\"],\n\t\t});\n\n\t\tconst total_available_length = pos_axis === \"top\" ? $dock_to.height() : $dock_to.width();\n\t\t// console.log(\"before adjustment\", JSON.stringify(segments, (_key,val)=> (val instanceof Element) ? val.className : val));\n\t\tadjust_segments(segments, total_available_length);\n\t\t// console.log(\"after adjustment\", JSON.stringify(segments, (_key,val)=> (val instanceof Element) ? val.className : val));\n\n\t\tapply_segments($dock_to[0], pos_axis, segments);\n\n\t\t// Save where it's now docked to\n\t\t$last_docked_to = $dock_to;\n\t\tlast_docked_to_pos = pos;\n\t};\n\t/**\n\t * @param {number} x\n\t * @param {number} y\n\t */\n\tconst undock_to = (x, y) => {\n\t\tconst component_area_el = $c.closest(\".component-area\")[0];\n\t\t// must get layout state *before* changing it\n\t\tconst segments = get_segments(component_area_el, pos_axis, $c[0]);\n\n\t\t$c.css(\"position\", \"relative\");\n\t\t$c.css(`margin-${pos_axis}`, \"\");\n\n\t\t// Put the component in the window\n\t\t$w.$content.append($c);\n\t\t// Show and position the window\n\t\t$w.show();\n\t\t$w.css({\n\t\t\tleft: x,\n\t\t\ttop: y,\n\t\t});\n\n\t\tconst total_available_length = pos_axis === \"top\" ? $(component_area_el).height() : $(component_area_el).width();\n\t\t// console.log(\"before adjustment\", JSON.stringify(segments, (_key,val)=> (val instanceof Element) ? val.className : val));\n\t\tadjust_segments(segments, total_available_length);\n\t\t// console.log(\"after adjustment\", JSON.stringify(segments, (_key,val)=> (val instanceof Element) ? val.className : val));\n\t\tapply_segments(component_area_el, pos_axis, segments);\n\t};\n\n\t$w.on(\"window-drag-start\", (e) => {\n\t\te.preventDefault();\n\t});\n\tconst size_css_props = (styles) => {\n\t\tconst scale_match = styles.transform.match(/(?:scale|matrix)\\((\\d+(?:\\.\\d+)?)/);\n\t\tconst scale = Number((scale_match ?? [])[1] ?? \"1\");\n\t\treturn {\n\t\t\twidth: `calc(${styles.width} * ${scale})`,\n\t\t\theight: `calc(${styles.height} * ${scale})`,\n\t\t\t// don't copy margin, margin is actually used for positioning the components in the docking areas\n\t\t\t// don't copy padding, padding changes based on whether the component is in a window in modern theme\n\t\t\t// let padding be influenced by CSS\n\t\t};\n\t};\n\tconst imagine_window_dimensions = () => {\n\t\tconst prev_window_shown = $w.is(\":visible\");\n\t\t$w.show();\n\t\tlet $spacer;\n\t\tlet { offsetLeft, offsetTop } = $c[0];\n\t\tif ($c.closest(\".tool-window\").length == 0) {\n\t\t\tconst styles = getComputedStyle($c[0]);\n\t\t\t$spacer = $(E(\"div\")).addClass(\"component\").css(size_css_props(styles));\n\t\t\t$w.append($spacer);\n\t\t\t({ offsetLeft, offsetTop } = $spacer[0]);\n\t\t}\n\t\tconst rect = $w[0].getBoundingClientRect();\n\t\tif ($spacer) {\n\t\t\t$spacer.remove();\n\t\t}\n\t\tif (!prev_window_shown) {\n\t\t\t$w.hide();\n\t\t}\n\t\tconst w_styles = getComputedStyle($w[0]);\n\t\toffsetLeft += parseFloat(w_styles.borderLeftWidth);\n\t\toffsetTop += parseFloat(w_styles.borderTopWidth);\n\t\treturn { rect, offsetLeft, offsetTop };\n\t};\n\tconst imagine_docked_dimensions = ($dock_to = (pos_axis === \"top\" ? $left : $bottom)) => {\n\t\tif ($c.closest(\".tool-window\").length == 0) {\n\t\t\treturn { rect: $c[0].getBoundingClientRect() };\n\t\t}\n\t\tconst styles = getComputedStyle($c[0]);\n\t\tconst $spacer = $(E(\"div\")).addClass(\"component\").css({\n\t\t\t...size_css_props(styles),\n\t\t\tflex: \"0 0 auto\",\n\t\t});\n\t\t$dock_to.prepend($spacer);\n\t\tconst rect = $spacer[0].getBoundingClientRect();\n\t\tif ($spacer) {\n\t\t\t$spacer.remove();\n\t\t}\n\t\treturn { rect };\n\t};\n\tconst render_ghost = (e) => {\n\n\t\tconst { rect } = $dock_to ? imagine_docked_dimensions($dock_to) : imagine_window_dimensions();\n\n\t\t// Make sure these dimensions are odd numbers\n\t\t// so the alternating pattern of the border is unbroken\n\t\tw = (~~(rect.width / 2)) * 2 + 1;\n\t\th = (~~(rect.height / 2)) * 2 + 1;\n\n\t\tif (!$ghost) {\n\t\t\t$ghost = $(E(\"div\")).addClass(\"component-ghost dock\");\n\t\t\t$ghost.appendTo(\"body\");\n\t\t}\n\t\tconst inset = $dock_to ? 0 : 3;\n\t\t$ghost.css({\n\t\t\tposition: \"absolute\",\n\t\t\tdisplay: \"block\",\n\t\t\twidth: w - inset * 2,\n\t\t\theight: h - inset * 2,\n\t\t\tleft: e.clientX + ($dock_to ? ox : ox2) + inset,\n\t\t\ttop: e.clientY + ($dock_to ? oy : oy2) + inset,\n\t\t});\n\n\t\tif ($dock_to) {\n\t\t\t$ghost.addClass(\"dock\");\n\t\t} else {\n\t\t\t$ghost.removeClass(\"dock\");\n\t\t}\n\t};\n\t$c.add($w.$titlebar).on(\"pointerdown\", (e) => {\n\t\t// Only start a drag via a left click directly on the component element or titlebar\n\t\tif (e.button !== 0) { return; }\n\t\tconst validTarget =\n\t\t\t$c.is(e.target) ||\n\t\t\t(\n\t\t\t\t$(e.target).closest($w.$titlebar).length > 0 &&\n\t\t\t\t$(e.target).closest(\"button\").length === 0\n\t\t\t);\n\t\tif (!validTarget) { return; }\n\n\t\tconst docked = imagine_docked_dimensions();\n\t\tconst rect = $c[0].getBoundingClientRect();\n\t\tox = rect.left - e.clientX;\n\t\toy = rect.top - e.clientY;\n\t\tox = -Math.min(Math.max(-ox, 0), docked.rect.width);\n\t\toy = -Math.min(Math.max(-oy, 0), docked.rect.height);\n\n\t\tconst { offsetLeft, offsetTop } = imagine_window_dimensions();\n\t\tox2 = rect.left - offsetLeft - e.clientX;\n\t\toy2 = rect.top - offsetTop - e.clientY;\n\n\t\t$(\"body\").addClass(\"dragging\");\n\t\t$(\"body\").css({ cursor: \"default\" }).addClass(\"cursor-bully\");\n\n\t\t$G.on(\"pointermove\", drag_update_position);\n\t\t$G.one(\"pointerup\", (e) => {\n\t\t\t$G.off(\"pointermove\", drag_update_position);\n\t\t\tdrag_onpointerup(e);\n\t\t\t$(\"body\").removeClass(\"dragging\");\n\t\t\t$(\"body\").css({ cursor: \"\" }).removeClass(\"cursor-bully\");\n\t\t\t$canvas.trigger(\"pointerleave\"); // prevent magnifier preview showing until you move the mouse\n\t\t});\n\n\t\trender_ghost(e);\n\t\tdrag_update_position(e);\n\n\t\t// Prevent text selection anywhere within the component\n\t\te.preventDefault();\n\t});\n\tconst drag_update_position = (e) => {\n\n\t\t$ghost.css({\n\t\t\tleft: e.clientX + ox,\n\t\t\ttop: e.clientY + oy,\n\t\t});\n\n\t\t$dock_to = null;\n\n\t\tconst { width, height } = imagine_docked_dimensions().rect;\n\t\tconst dock_ghost_left = e.clientX + ox;\n\t\tconst dock_ghost_top = e.clientY + oy;\n\t\tconst dock_ghost_right = dock_ghost_left + width;\n\t\tconst dock_ghost_bottom = dock_ghost_top + height;\n\t\tconst q = 5;\n\t\tif (orientation === \"tall\") {\n\t\t\tpos_axis = \"top\";\n\t\t\tif (dock_ghost_left - q < $left[0].getBoundingClientRect().right) {\n\t\t\t\t$dock_to = $left;\n\t\t\t}\n\t\t\tif (dock_ghost_right + q > $right[0].getBoundingClientRect().left) {\n\t\t\t\t$dock_to = $right;\n\t\t\t}\n\t\t} else {\n\t\t\tpos_axis = get_direction() === \"rtl\" ? \"right\" : \"left\";\n\t\t\tif (dock_ghost_top - q < $top[0].getBoundingClientRect().bottom) {\n\t\t\t\t$dock_to = $top;\n\t\t\t}\n\t\t\tif (dock_ghost_bottom + q > $bottom[0].getBoundingClientRect().top) {\n\t\t\t\t$dock_to = $bottom;\n\t\t\t}\n\t\t}\n\n\t\tif ($dock_to) {\n\t\t\tconst dock_to_rect = $dock_to[0].getBoundingClientRect();\n\t\t\tpos = (\n\t\t\t\tpos_axis === \"top\" ? dock_ghost_top : pos_axis === \"right\" ? dock_ghost_right : dock_ghost_left\n\t\t\t) - dock_to_rect[pos_axis];\n\t\t\tif (pos_axis === \"right\") {\n\t\t\t\tpos *= -1;\n\t\t\t}\n\t\t}\n\n\t\trender_ghost(e);\n\n\t\te.preventDefault();\n\t};\n\n\tconst drag_onpointerup = (e) => {\n\n\t\t$w.hide();\n\n\t\t// If the component is docked to a component area (a side)\n\t\tif ($c.parent().is(\".component-area\")) {\n\t\t\t// Save where it's docked so we can dock back later\n\t\t\t$last_docked_to = $c.parent();\n\t\t\tif ($dock_to) {\n\t\t\t\tlast_docked_to_pos = pos;\n\t\t\t}\n\t\t}\n\n\t\tif ($dock_to) {\n\t\t\t// Dock component to $dock_to\n\t\t\tdock_to($dock_to);\n\t\t} else {\n\t\t\tundock_to(e.clientX + ox2, e.clientY + oy2);\n\t\t}\n\n\t\t$ghost?.remove();\n\t\t$ghost = null;\n\n\t\t$G.trigger(\"resize\");\n\t};\n\n\t$c.dock = ($dock_to) => {\n\t\tpos = last_docked_to_pos ?? 0;\n\t\tdock_to($dock_to ?? $last_docked_to);\n\t};\n\t$c.undock_to = undock_to;\n\n\t$c.show = () => {\n\t\t$($c[0]).show(); // avoid recursion\n\t\tif ($.contains($w[0], $c[0])) {\n\t\t\t$w.show();\n\t\t}\n\t\treturn $c;\n\t};\n\t$c.hide = () => {\n\t\t$c.add($w).hide();\n\t\treturn $c;\n\t};\n\t$c.toggle = () => {\n\t\tif ($c.is(\":visible\")) {\n\t\t\t$c.hide();\n\t\t} else {\n\t\t\t$c.show();\n\t\t}\n\t\treturn $c;\n\t};\n\t$c.destroy = () => {\n\t\t$w.close();\n\t\t$c.remove();\n\t\tclearInterval(iid);\n\t};\n\n\t$w.on(\"close\", (e) => {\n\t\te.preventDefault();\n\t\t$w.hide();\n\t});\n\n\treturn $c;\n}\n\nexport { $Component };\n\n"
  },
  {
    "path": "src/$FontBox.js",
    "content": "// @ts-check\n/* global localize, text_tool_font */\nimport { $ToolWindow } from \"./$ToolWindow.js\";\n// import { localize } from \"./app-localization.js\";\nimport { $G, E } from \"./helpers.js\";\n\nconst eachFont = async (callback, afterAllCallback) => {\n\tfunction localFontAccessUnavailable() {\n\t\tFontDetective.each(callback);\n\t\tFontDetective.all(afterAllCallback);\n\t}\n\tif (window.queryLocalFonts) {\n\t\tlet availableFonts;\n\t\ttry {\n\t\t\tavailableFonts = await window.queryLocalFonts();\n\t\t} catch (error) {\n\t\t\tconsole.log(\"queryLocalFonts failed:\", error, \"\\nFalling back to FontDetective.\");\n\t\t\tlocalFontAccessUnavailable();\n\t\t\treturn;\n\t\t}\n\t\tif (availableFonts.length === 0) {\n\t\t\tconsole.log(\"queryLocalFonts returned no fonts; falling back to FontDetective.\");\n\t\t\tlocalFontAccessUnavailable();\n\t\t\treturn;\n\t\t}\n\t\tconst familyNames = new Set();\n\t\tfor (const font of availableFonts) {\n\t\t\tif (familyNames.has(font.family)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfamilyNames.add(font.family);\n\t\t\tcallback({\n\t\t\t\tname: font.family,\n\t\t\t\ttoString() {\n\t\t\t\t\treturn '\"' + this.name.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, \"\\\\\\\"\") + '\"';\n\t\t\t\t},\n\t\t\t});\n\t\t\t// This class is not exported by FontDetective.\n\t\t\t// That said, this queryLocalFonts functionality should be moved into FontDetective.\n\t\t\t// callback(new FontDetective.Font(font.family));\n\t\t}\n\t\tafterAllCallback();\n\t} else {\n\t\tconsole.log(\"queryLocalFonts unavailable; falling back to FontDetective.\");\n\t\tlocalFontAccessUnavailable();\n\t}\n};\n\n/**\n * @returns {OSGUI$Window}\n */\nfunction $FontBox() {\n\tconst $fb = $(E(\"div\")).addClass(\"font-box\");\n\n\t// This complex cast tells it that jQuery's val() method can return a string and not an array of strings.\n\t// See the types for val().\n\tconst $family = /** @type {JQuery<HTMLSelectElement & { type: \"select-one\" }>} */(\n\t\t$(E(\"select\")).addClass(\"inset-deep\").attr({\n\t\t\t\"aria-label\": \"Font Family\",\n\t\t\t\"aria-description\": localize(\"Selects the font used by the text.\"),\n\t\t})\n\t);\n\tconst $size = $(E(\"input\")).addClass(\"inset-deep\").attr({\n\t\ttype: \"number\",\n\t\tmin: 8,\n\t\tmax: 72,\n\t\tvalue: text_tool_font.size,\n\t\t\"aria-label\": \"Font Size\",\n\t\t\"aria-description\": localize(\"Selects the point size of the text.\"),\n\t}).css({\n\t\tmaxWidth: 50,\n\t});\n\tconst $button_group = $(E(\"span\")).addClass(\"text-toolbar-button-group\");\n\t// @TODO: localized labels\n\tconst $bold = $Toggle(0, \"bold\", \"Bold\", localize(\"Sets or clears the text bold attribute.\"));\n\tconst $italic = $Toggle(1, \"italic\", \"Italic\", localize(\"Sets or clears the text italic attribute.\"));\n\tconst $underline = $Toggle(2, \"underline\", \"Underline\", localize(\"Sets or clears the text underline attribute.\"));\n\tconst $vertical = $Toggle(3, \"vertical\", \"Vertical Writing Mode\", localize(\"Only a Far East font can be used for vertical editing.\"));\n\t$vertical.prop(\"disabled\", true);\n\n\t$button_group.append($bold, $italic, $underline, $vertical);\n\t$fb.append($family, $size, $button_group);\n\n\tconst update_font = () => {\n\t\ttext_tool_font.size = Number($size.val());\n\t\ttext_tool_font.family = $family.val();\n\t\t$G.trigger(\"option-changed\");\n\t};\n\n\tconst originalFamily = text_tool_font.family;\n\teachFont((font) => {\n\t\tconst $option = $(E(\"option\"));\n\t\t$option.val(font).text(font.name);\n\t\t// Insert in alphabetical order\n\t\tconst $options = $family.children(\"option\");\n\t\tlet i = 0;\n\t\tfor (; i < $options.length; i++) {\n\t\t\tif ($options.eq(i).text().localeCompare(font.name) > 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif ($options.eq(i).length) {\n\t\t\t$options.eq(i).before($option);\n\t\t} else {\n\t\t\t$family.append($option);\n\t\t}\n\t\t// Select the first known-available font, just in case FontDetective.each is slow.\n\t\tif (!text_tool_font.family) {\n\t\t\tupdate_font();\n\t\t}\n\t}, () => {\n\t\t// All fonts have been added to the list. Now we can select the default font.\n\t\t$family.val(originalFamily);\n\t\t// Liberation Sans is designed to be metrically compatible with Arial,\n\t\t// and is available in free operating systems like Ubuntu.\n\t\tif (!$family.val()) {\n\t\t\t$family.val('\"Liberation Sans\"');\n\t\t}\n\t\t// Fallback to the first font in the list. At least it's something.\n\t\tif (!$family.val()) {\n\t\t\t$family.val($family.children(\"option\").eq(0).val());\n\t\t}\n\t\tupdate_font();\n\t});\n\n\tif (text_tool_font.family) {\n\t\t$family.val(text_tool_font.family);\n\t}\n\n\t$family.on(\"change\", update_font);\n\t$size.on(\"change\", update_font);\n\n\tconst $w = $ToolWindow();\n\t$w.title(localize(\"Fonts\"));\n\t$w.$content.append($fb);\n\t$w.center();\n\n\t// Hotfix for bug where the font dropdown would close immediately when clicked in Chrome.\n\t// Code in $Window.js (from os-gui.js but PATCHED) is trying to focus the dropdown when it's already focused,\n\t// or focusing the window content area. Either can cause the dropdown to close.\n\t// The code patches in $Window.js specific to this repo may be related to why this is happening.\n\t// See: \"PATCHED; I want focus tracking in a tool window\"\n\t// Maybe I don't want it for the font window! (What tool window did I want it for? A history panel, or...?)\n\t// I could probably adjust my patch to not apply to the font box, but this is a quick fix.\n\t$family[0].focus = () => {\n\t\t// console.trace(\"$FontBox: Font family select focus() called\");\n\t};\n\t$w.$content[0].focus = () => {\n\t\t// console.trace(\"$FontBox: Font box window content area focus() called\");\n\t};\n\n\treturn $w;\n\n\n\tfunction $Toggle(xi, thing, label, description) {\n\t\tconst $button = $(E(\"button\")).addClass(\"toggle\").attr({\n\t\t\t\"aria-pressed\": false,\n\t\t\t\"aria-label\": label,\n\t\t\t\"aria-description\": description,\n\t\t});\n\t\tconst $icon = $(E(\"span\")).addClass(\"icon\").appendTo($button);\n\t\t$button.css({\n\t\t\twidth: 23,\n\t\t\theight: 22,\n\t\t\tpadding: 0,\n\t\t\tdisplay: \"inline-flex\",\n\t\t\talignContent: \"center\",\n\t\t\talignItems: \"center\",\n\t\t\tjustifyContent: \"center\",\n\t\t});\n\t\t$icon.css({\n\t\t\tflex: \"0 0 auto\",\n\t\t\tdisplay: \"block\",\n\t\t\twidth: 16,\n\t\t\theight: 16,\n\t\t\t\"--icon-index\": xi,\n\t\t});\n\t\t$button.on(\"click\", () => {\n\t\t\t$button.toggleClass(\"selected\");\n\t\t\ttext_tool_font[thing] = $button.hasClass(\"selected\");\n\t\t\t$button.attr(\"aria-pressed\", $button.hasClass(\"selected\") ? \"true\" : \"false\");\n\t\t\tupdate_font();\n\t\t});\n\t\tif (text_tool_font[thing]) {\n\t\t\t$button.addClass(\"selected\").attr(\"aria-pressed\", \"true\");\n\t\t}\n\t\treturn $button;\n\t}\n}\n\nexport { $FontBox };\n\n"
  },
  {
    "path": "src/$ToolBox.js",
    "content": "// @ts-check\n/* global $canvas, $left, $right, $status_text, get_direction, localize, main_canvas, return_to_tools, selected_tool, selected_tools */\nimport { $Component } from \"./$Component.js\";\n// import { get_direction, localize } from \"./app-localization.js\";\nimport { select_tool, select_tools } from \"./functions.js\";\nimport { $G, E, make_css_cursor } from \"./helpers.js\";\nimport { get_theme } from \"./theme.js\";\n\n\nlet theme_dev_blob_url;\n\n/**\n * @param {Tool[]} tools\n * @param {boolean=} is_extras\n * @returns {JQuery<HTMLDivElement> & I$ToolBox & I$Component}\n */\nfunction $ToolBox(tools, is_extras) {\n\tconst $tools = $(E(\"div\")).addClass(\"tools\");\n\tconst $tool_options = $(E(\"div\")).addClass(\"tool-options\");\n\n\tlet showing_tooltips = false;\n\t$tools.on(\"pointerleave\", () => {\n\t\tshowing_tooltips = false;\n\t\t$status_text.default();\n\t});\n\n\tconst $buttons = $($.map(tools, (tool, i) => {\n\t\tconst $b = $(E(\"div\")).addClass(\"tool\");\n\t\t$b.appendTo($tools);\n\t\ttool.$button = $b;\n\n\t\t$b.attr(\"title\", tool.name);\n\n\t\tconst $icon = $(E(\"span\")).addClass(\"tool-icon\");\n\t\t$icon.appendTo($b);\n\t\tconst update_css = () => {\n\t\t\tconst use_svg = !theme_dev_blob_url && (\n\t\t\t\t(\n\t\t\t\t\tget_theme() === \"modern.css\" || get_theme() === \"modern-dark.css\" ?\n\t\t\t\t\t\t// only use raster when screen pixels line up with image pixels exactly\n\t\t\t\t\t\t(window.devicePixelRatio !== 1) :\n\t\t\t\t\t\t// with nearest neighbor scaling, favor raster at larger integer sizes as well, for retro look\n\t\t\t\t\t\t(window.devicePixelRatio >= 3 || (window.devicePixelRatio % 1) !== 0)\n\t\t\t\t) ||\n\t\t\t\t$(\"body\").hasClass(\"enlarge-ui\")\n\t\t\t);\n\t\t\t$icon.css({\n\t\t\t\tdisplay: \"block\",\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: 4,\n\t\t\t\ttop: 4,\n\t\t\t\twidth: 16,\n\t\t\t\theight: 16,\n\t\t\t\tbackgroundImage: theme_dev_blob_url ? `url(${theme_dev_blob_url})` : \"\",\n\t\t\t\t\"--icon-index\": i.toString(),\n\t\t\t});\n\t\t\t$icon.toggleClass(\"use-svg\", use_svg);\n\t\t};\n\t\tupdate_css();\n\t\t$G.on(\"theme-load resize\", update_css);\n\n\t\t$b.on(\"click\", (e) => {\n\t\t\tif (e.shiftKey || e.ctrlKey) {\n\t\t\t\tselect_tool(tool, true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (selected_tool === tool && tool.deselect) {\n\t\t\t\tselect_tools(return_to_tools);\n\t\t\t} else {\n\t\t\t\tselect_tool(tool);\n\t\t\t}\n\t\t});\n\n\t\t$b.on(\"pointerenter\", () => {\n\t\t\tconst show_tooltip = () => {\n\t\t\t\tshowing_tooltips = true;\n\t\t\t\t$status_text.text(tool.description);\n\t\t\t};\n\t\t\tif (showing_tooltips) {\n\t\t\t\tshow_tooltip();\n\t\t\t} else {\n\t\t\t\tconst tid = setTimeout(show_tooltip, 300);\n\t\t\t\t$b.on(\"pointerleave\", () => {\n\t\t\t\t\tclearTimeout(tid);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\treturn $b[0];\n\t}));\n\n\t/**\n\t * @typedef {Object} I$ToolBox\n\t * @prop {() => void} update_selected_tool\n\t */\n\n\tconst $c = /** @type {JQuery<HTMLDivElement> & I$Component & I$ToolBox} **/ ($Component(\n\t\tis_extras ? \"Extra Tools\" : localize(\"Tools\"),\n\t\tis_extras ? \"tools-component extra-tools-component\" : \"tools-component\",\n\t\t\"tall\",\n\t\t$tools.add($tool_options)\n\t));\n\t$c.appendTo(get_direction() === \"rtl\" ? $right : $left); // opposite ColorBox by default\n\t$c.update_selected_tool = () => {\n\t\t$buttons.removeClass(\"selected\");\n\t\tselected_tools.forEach((selected_tool) => {\n\t\t\tselected_tool.$button.addClass(\"selected\");\n\t\t});\n\t\t$tool_options.children().detach();\n\t\t$tool_options.append(selected_tool.$options);\n\t\t$tool_options.children().trigger(\"update\");\n\t\t$canvas.css({\n\t\t\tcursor: make_css_cursor(...selected_tool.cursor),\n\t\t});\n\t};\n\t$c.update_selected_tool();\n\n\tif (is_extras) {\n\t\t$c.height(80);\n\t}\n\n\treturn $c;\n}\n\nlet dev_theme_tool_icons = false;\ntry {\n\tdev_theme_tool_icons = localStorage.dev_theme_tool_icons === \"true\";\n} catch (_error) { /* ignore */ }\nif (dev_theme_tool_icons) {\n\tlet last_update_id = 0;\n\t$G.on(\"session-update\", () => {\n\t\tlast_update_id += 1;\n\t\tconst this_update_id = last_update_id;\n\t\tmain_canvas.toBlob((blob) => {\n\t\t\t// avoid a race condition particularly when loading the document initially when the default canvas size is large, giving a larger PNG\n\t\t\tif (this_update_id !== last_update_id) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tURL.revokeObjectURL(theme_dev_blob_url);\n\t\t\ttheme_dev_blob_url = URL.createObjectURL(blob);\n\t\t\t$G.triggerHandler(\"theme-load\");\n\t\t});\n\t});\n}\n\nexport { $ToolBox };\n\n"
  },
  {
    "path": "src/$ToolWindow.js",
    "content": "// @ts-check\n/* global $Window */\n\nimport { $G, E } from \"./helpers.js\";\n\n/**\n * @param {OSGUIWindowOptions} options\n * @returns {OSGUI$Window}\n */\nfunction make_window_supporting_scale(options) {\n\tconst $w = $Window(options);\n\n\tconst scale_for_enlarge_ui_mode_and_center = () => {\n\t\tif (!$w.is(\".edit-colors-window, .storage-manager, .attributes-window, .flip-and-rotate, .stretch-and-skew\")) {\n\t\t\treturn;\n\t\t}\n\t\tconst c = $w.$content[0];\n\t\tconst t = $w.$titlebar[0];\n\t\tlet scale = 1;\n\t\t$w.$content.css({\n\t\t\ttransform: `scale(${scale})`,\n\t\t\ttransformOrigin: \"0 0\",\n\t\t\tmarginRight: \"\",\n\t\t\tmarginBottom: \"\",\n\t\t});\n\t\tif (document.body.classList.contains(\"enlarge-ui\")) {\n\t\t\tscale = Math.min(\n\t\t\t\t(innerWidth) / c.offsetWidth,\n\t\t\t\t(innerHeight - t.offsetHeight) / c.offsetHeight\n\t\t\t);\n\t\t\t$w.$content.css({\n\t\t\t\ttransform: `scale(${scale})`,\n\t\t\t\ttransformOrigin: \"0 0\",\n\t\t\t\tmarginRight: c.scrollWidth * (scale - 1),\n\t\t\t});\n\t\t\t// This is separate to prevent content going off the bottom of the window\n\t\t\t// in case the layout changes due to text wrapping.\n\t\t\t$w.$content.css({\n\t\t\t\tmarginBottom: c.scrollHeight * (scale - 1),\n\t\t\t});\n\t\t\t$w.center();\n\t\t}\n\t\t// for testing (WARNING: can cause rapid flashing, which can cause seizures):\n\t\t// requestAnimationFrame(scale_for_enlarge_ui_mode_and_center);\n\t};\n\n\tif (!options.$component) {\n\t\t$w.center();\n\n\t\tconst scale_for_enlarge_ui_mode_and_center_next_frame = () => {\n\t\t\trequestAnimationFrame(scale_for_enlarge_ui_mode_and_center);\n\t\t};\n\t\tconst on_close = () => {\n\t\t\t$w.off(\"close\", on_close);\n\t\t\t$G.off(\"enlarge-ui-toggled resize\", scale_for_enlarge_ui_mode_and_center_next_frame);\n\t\t};\n\t\t$w.on(\"close\", on_close);\n\t\t$G.on(\"enlarge-ui-toggled resize\", scale_for_enlarge_ui_mode_and_center_next_frame);\n\n\t\tscale_for_enlarge_ui_mode_and_center_next_frame();\n\t}\n\n\tif (options.$component) {\n\t\t$w.$content.css({\n\t\t\tcontain: \"none\",\n\t\t});\n\t}\n\n\treturn $w;\n}\n\n/**\n * @param {JQuery<HTMLDivElement> & I$Component} [$component]\n * @returns {OSGUI$Window & I$ToolWindow}\n */\nfunction $ToolWindow($component) {\n\treturn make_window_supporting_scale({\n\t\t$component,\n\t\ttoolWindow: true,\n\t});\n}\n\n/**\n * @param {string} [title]\n * @returns {OSGUI$Window & I$DialogWindow}\n */\nfunction $DialogWindow(title) {\n\tconst $w = /** @type {OSGUI$Window & I$DialogWindow} */ (make_window_supporting_scale({\n\t\ttitle,\n\t\tresizable: false,\n\t\tmaximizeButton: false,\n\t\tminimizeButton: false,\n\t\t// helpButton: @TODO\n\t}));\n\t$w.addClass(\"dialog-window\");\n\n\t// I don't know why type inference isn't working here. It seems to infer HTMLDivElement but not HTMLFormElement.\n\t// Both are in HTMLElementTagNameMap...\n\t$w.$form = /** @type {JQuery<HTMLFormElement>} */($(E(\"form\"))).appendTo($w.$content);\n\t$w.$main = $(E(\"div\")).appendTo($w.$form);\n\t$w.$buttons = $(E(\"div\")).appendTo($w.$form).addClass(\"button-group\");\n\n\t/**\n\t * @param {string | Node} label\n\t * @param {()=> void} action\n\t * @param {object} [options]\n\t * @param {string} [options.type]\n\t * @returns {JQuery<HTMLButtonElement>}\n\t */\n\t$w.$Button = (label, action, options = { type: \"button\" }) => {\n\t\tconst $b = $(E(\"button\")).appendTo($w.$buttons);\n\n\t\t// jQuery's append() is unsafe (text interpreted as HTML); native append() is safe,\n\t\t// and accepts text, DOM nodes, or DocumentFragments.\n\t\t$b[0].append(label);\n\n\t\t$b.on(\"click\", () => {\n\t\t\taction();\n\t\t});\n\n\t\t$b.on(\"pointerdown\", () => {\n\t\t\t$b.focus();\n\t\t});\n\n\t\t$b.attr({ type: options.type });\n\n\t\treturn $b;\n\t};\n\t// Note: the \"submit\" event on the form element may not fire if the window is closed,\n\t// as the form element is removed from the DOM. You can test this by preventing the \"close\" event on $w.\n\t// But in case it does submit, prevent the default action of reloading the page.\n\t// In the future, this could be cleaner by using the <dialog> element.\n\t$w.$form.on(\"submit\", (e) => {\n\t\te.preventDefault();\n\t});\n\n\t// Highlight button that will be activated if you press Enter, if any.\n\t// - If there's any focused control that will handle Enter (highlight it if it's a button)\n\t// - Otherwise the default submit button according to HTML form semantics (highlight it if there is one)\n\tfunction updateDefaultHighlight() {\n\t\t$w.find(\"button, input\").removeClass(\"default\");\n\t\tlet $default = $(document.activeElement).closest(\"button, input[type='submit'], input[type='button'], textarea, select\");\n\t\tif ($default.length === 0) {\n\t\t\t// Buttons in forms default to type=\"submit\" implicitly.\n\t\t\t$default = $w.$form.find('button[type=\"submit\"], input[type=\"submit\"], button:not([type])').first();\n\t\t}\n\t\tif ($default.is(\"button, input[type='submit'], input[type='button']\")) {\n\t\t\t$default.addClass(\"default\");\n\t\t}\n\t}\n\t$w.on(\"focusin\", updateDefaultHighlight);\n\t$w.on(\"focusout\", () => {\n\t\t$w.find(\"button, input\").removeClass(\"default\");\n\t});\n\tsetTimeout(() => {\n\t\tupdateDefaultHighlight();\n\t}, 0);\n\n\treturn $w;\n}\n\nexport { $DialogWindow, $ToolWindow, make_window_supporting_scale };\n\n"
  },
  {
    "path": "src/Handles.js",
    "content": "// @ts-check\n/* global magnification */\nimport { $G, E, make_css_cursor, to_canvas_coords } from \"./helpers.js\";\n\n/**\n * Handles for resizable, draggable, on-canvas objects.\n * @param {object} options\n * @param {JQuery} options.$handles_container\n * @param {JQuery} options.$object_container\n * @param {number} [options.outset=0]\n * @param {() => number} [options.get_handles_offset_left=() => 0]\n * @param {() => number} [options.get_handles_offset_top=() => 0]\n * @param {() => number} [options.get_ghost_offset_left=() => 0]\n * @param {() => number} [options.get_ghost_offset_top=() => 0]\n * @param {boolean} [options.size_only=false]\n * @param {() => { x: number, y: number, width: number, height: number }} options.get_rect\n * @param {(rect: { x: number, y: number, width: number, height: number }) => void} options.set_rect\n * @param {(rect: { x: number, y: number, width: number, height: number }, x_axis: -1 | 0 | 1, y_axis: -1 | 0 | 1) => { x: number, y: number, width: number, height: number }} [options.constrain_rect]\n * @param {boolean} [options.thick]\n * @constructor\n * @property {HTMLElement[]} handles\n * @property {() => void} hide\n * @property {() => void} show\n * @property {HTMLElement[]} handles\n */\nfunction Handles(options) {\n\tconst { $handles_container, $object_container } = options; // required\n\tconst outset = options.outset || 0;\n\tconst get_handles_offset_left = options.get_handles_offset_left || (() => 0);\n\tconst get_handles_offset_top = options.get_handles_offset_top || (() => 0);\n\tconst get_ghost_offset_left = options.get_ghost_offset_left || (() => 0);\n\tconst get_ghost_offset_top = options.get_ghost_offset_top || (() => 0);\n\tconst size_only = options.size_only || false;\n\n\t/** @type {-1 | 0 | 1} */\n\tconst HANDLE_MIDDLE = 0;\n\t/** @type {-1 | 0 | 1} */\n\tconst HANDLE_START = -1;\n\t/** @type {-1 | 0 | 1} */\n\tconst HANDLE_END = 1;\n\tconst HANDLE_LEFT = HANDLE_START;\n\tconst HANDLE_RIGHT = HANDLE_END;\n\tconst HANDLE_TOP = HANDLE_START;\n\tconst HANDLE_BOTTOM = HANDLE_END;\n\n\tconst $resize_ghost = $(E(\"div\")).addClass(\"resize-ghost\");\n\tif (options.thick) {\n\t\t$resize_ghost.addClass(\"thick\");\n\t}\n\t/** @type {HTMLElement[]} */\n\tconst handles = [];\n\t[\n\t\t[HANDLE_TOP, HANDLE_RIGHT], // ↗\n\t\t[HANDLE_TOP, HANDLE_MIDDLE], // ↑\n\t\t[HANDLE_TOP, HANDLE_LEFT], // ↖\n\t\t[HANDLE_MIDDLE, HANDLE_LEFT], // ←\n\t\t[HANDLE_BOTTOM, HANDLE_LEFT], // ↙\n\t\t[HANDLE_BOTTOM, HANDLE_MIDDLE], // ↓\n\t\t[HANDLE_BOTTOM, HANDLE_RIGHT], // ↘\n\t\t[HANDLE_MIDDLE, HANDLE_RIGHT], // →\n\t].forEach(([y_axis, x_axis]) => {\n\t\tconst $h = $(E(\"div\")).addClass(\"handle\");\n\t\t$h.appendTo($handles_container);\n\t\tconst $grab_region = $(E(\"div\")).addClass(\"grab-region\").appendTo($handles_container);\n\t\tif (y_axis === HANDLE_MIDDLE || x_axis === HANDLE_MIDDLE) {\n\t\t\t$grab_region.addClass(\"is-middle\");\n\t\t}\n\n\t\t$h.css(\"touch-action\", \"none\");\n\n\t\tlet rect;\n\t\tlet dragged = false;\n\t\tconst resizes_height = y_axis !== HANDLE_MIDDLE;\n\t\tconst resizes_width = x_axis !== HANDLE_MIDDLE;\n\t\tif (size_only && (y_axis === HANDLE_TOP || x_axis === HANDLE_LEFT)) {\n\t\t\t$h.addClass(\"useless-handle\");\n\t\t\t$grab_region.remove();\n\t\t} else {\n\n\t\t\tlet cursor_fname;\n\t\t\tif ((x_axis === HANDLE_LEFT && y_axis === HANDLE_TOP) || (x_axis === HANDLE_RIGHT && y_axis === HANDLE_BOTTOM)) {\n\t\t\t\tcursor_fname = \"nwse-resize\";\n\t\t\t} else if ((x_axis === HANDLE_RIGHT && y_axis === HANDLE_TOP) || (x_axis === HANDLE_LEFT && y_axis === HANDLE_BOTTOM)) {\n\t\t\t\tcursor_fname = \"nesw-resize\";\n\t\t\t} else if (resizes_width) {\n\t\t\t\tcursor_fname = \"ew-resize\";\n\t\t\t} else if (resizes_height) {\n\t\t\t\tcursor_fname = \"ns-resize\";\n\t\t\t}\n\n\t\t\tlet fallback_cursor = \"\";\n\t\t\tif (y_axis === HANDLE_TOP) { fallback_cursor += \"n\"; }\n\t\t\tif (y_axis === HANDLE_BOTTOM) { fallback_cursor += \"s\"; }\n\t\t\tif (x_axis === HANDLE_LEFT) { fallback_cursor += \"w\"; }\n\t\t\tif (x_axis === HANDLE_RIGHT) { fallback_cursor += \"e\"; }\n\n\t\t\tfallback_cursor += \"-resize\";\n\t\t\tconst cursor = make_css_cursor(cursor_fname, [16, 16], fallback_cursor);\n\t\t\t$h.add($grab_region).css({ cursor });\n\n\t\t\tconst drag = (event) => {\n\t\t\t\t$resize_ghost.appendTo($object_container);\n\t\t\t\tdragged = true;\n\n\t\t\t\trect = options.get_rect();\n\t\t\t\tconst m = to_canvas_coords(event);\n\t\t\t\tlet delta_x = 0;\n\t\t\t\tlet delta_y = 0;\n\t\t\t\tlet width, height;\n\t\t\t\t// @TODO: decide between Math.floor/Math.ceil/Math.round for these values\n\t\t\t\tif (x_axis === HANDLE_RIGHT) {\n\t\t\t\t\tdelta_x = 0;\n\t\t\t\t\twidth = ~~(m.x - rect.x);\n\t\t\t\t} else if (x_axis === HANDLE_LEFT) {\n\t\t\t\t\tdelta_x = ~~(m.x - rect.x);\n\t\t\t\t\twidth = ~~(rect.x + rect.width - m.x);\n\t\t\t\t} else {\n\t\t\t\t\twidth = ~~(rect.width);\n\t\t\t\t}\n\t\t\t\tif (y_axis === HANDLE_BOTTOM) {\n\t\t\t\t\tdelta_y = 0;\n\t\t\t\t\theight = ~~(m.y - rect.y);\n\t\t\t\t} else if (y_axis === HANDLE_TOP) {\n\t\t\t\t\tdelta_y = ~~(m.y - rect.y);\n\t\t\t\t\theight = ~~(rect.y + rect.height - m.y);\n\t\t\t\t} else {\n\t\t\t\t\theight = ~~(rect.height);\n\t\t\t\t}\n\t\t\t\tlet new_rect = {\n\t\t\t\t\tx: rect.x + delta_x,\n\t\t\t\t\ty: rect.y + delta_y,\n\t\t\t\t\twidth: width,\n\t\t\t\t\theight: height,\n\t\t\t\t};\n\n\t\t\t\tnew_rect.width = Math.max(1, new_rect.width);\n\t\t\t\tnew_rect.height = Math.max(1, new_rect.height);\n\n\t\t\t\tif (options.constrain_rect) {\n\t\t\t\t\tnew_rect = options.constrain_rect(new_rect, x_axis, y_axis);\n\t\t\t\t} else {\n\t\t\t\t\tnew_rect.x = Math.min(new_rect.x, rect.x + rect.width);\n\t\t\t\t\tnew_rect.y = Math.min(new_rect.y, rect.y + rect.height);\n\t\t\t\t}\n\n\t\t\t\t$resize_ghost.css({\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\tleft: magnification * new_rect.x + get_ghost_offset_left(),\n\t\t\t\t\ttop: magnification * new_rect.y + get_ghost_offset_top(),\n\t\t\t\t\twidth: magnification * new_rect.width - 2,\n\t\t\t\t\theight: magnification * new_rect.height - 2,\n\t\t\t\t});\n\t\t\t\trect = new_rect;\n\t\t\t};\n\t\t\t$h.add($grab_region).on(\"pointerdown\", (event) => {\n\t\t\t\tdragged = false;\n\t\t\t\tif (event.button === 0) {\n\t\t\t\t\t$G.on(\"pointermove\", drag);\n\t\t\t\t\t$(\"body\").css({ cursor }).addClass(\"cursor-bully\");\n\t\t\t\t}\n\t\t\t\t$G.one(\"pointerup\", () => {\n\t\t\t\t\t$G.off(\"pointermove\", drag);\n\t\t\t\t\t$(\"body\").css({ cursor: \"\" }).removeClass(\"cursor-bully\");\n\n\t\t\t\t\t$resize_ghost.remove();\n\t\t\t\t\tif (dragged) {\n\t\t\t\t\t\toptions.set_rect(rect);\n\t\t\t\t\t}\n\t\t\t\t\t$handles_container.trigger(\"update\");\n\t\t\t\t});\n\t\t\t});\n\t\t\t$h.on(\"mousedown selectstart\", (event) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t});\n\t\t}\n\n\t\tconst update_handle = () => {\n\t\t\tconst rect = options.get_rect();\n\t\t\tconst hs = $h.width();\n\t\t\t// const x = rect.x + get_handles_offset_left();\n\t\t\t// const y = rect.y + get_handles_offset_top();\n\t\t\tconst x = get_handles_offset_left();\n\t\t\tconst y = get_handles_offset_top();\n\t\t\tconst grab_size = 32;\n\t\t\tfor (const { len_key, pos_key, region, offset } of [\n\t\t\t\t{ len_key: \"width\", pos_key: \"left\", region: x_axis, offset: x },\n\t\t\t\t{ len_key: \"height\", pos_key: \"top\", region: y_axis, offset: y },\n\t\t\t]) {\n\t\t\t\tlet middle_start = Math.max(\n\t\t\t\t\trect[len_key] * magnification / 2 - grab_size / 2,\n\t\t\t\t\tMath.min(\n\t\t\t\t\t\tgrab_size / 2,\n\t\t\t\t\t\trect[len_key] * magnification / 3\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\tlet middle_end = rect[len_key] * magnification - middle_start;\n\t\t\t\tif (middle_end - middle_start < magnification) {\n\t\t\t\t\t// give middle region min size of one (1) canvas pixel\n\t\t\t\t\tmiddle_start = 0;\n\t\t\t\t\tmiddle_end = magnification;\n\t\t\t\t}\n\t\t\t\tconst start_start = -grab_size / 2;\n\t\t\t\tconst start_end = Math.min(\n\t\t\t\t\tgrab_size / 2,\n\t\t\t\t\tmiddle_start\n\t\t\t\t);\n\t\t\t\tconst end_start = rect[len_key] * magnification - start_end;\n\t\t\t\tconst end_end = rect[len_key] * magnification - start_start;\n\t\t\t\tif (size_only) {\n\t\t\t\t\t// For main canvas handles, where only the right/bottom handles are interactive,\n\t\t\t\t\t// extend the middle regions left/up into the unused space of the useless handles.\n\t\t\t\t\t// (This must be after middle_start is used above.)\n\t\t\t\t\tmiddle_start = Math.max(-offset, Math.min(middle_start, middle_end - grab_size));\n\t\t\t\t}\n\t\t\t\tif (region === HANDLE_START) {\n\t\t\t\t\t$h.css({ [pos_key]: offset - outset });\n\t\t\t\t\t$grab_region.css({\n\t\t\t\t\t\t[pos_key]: offset + start_start,\n\t\t\t\t\t\t[len_key]: start_end - start_start,\n\t\t\t\t\t});\n\t\t\t\t} else if (region === HANDLE_MIDDLE) {\n\t\t\t\t\t$h.css({ [pos_key]: offset + (rect[len_key] * magnification - hs) / 2 });\n\t\t\t\t\t$grab_region.css({\n\t\t\t\t\t\t[pos_key]: offset + middle_start,\n\t\t\t\t\t\t[len_key]: middle_end - middle_start,\n\t\t\t\t\t});\n\t\t\t\t} else if (region === HANDLE_END) {\n\t\t\t\t\t$h.css({ [pos_key]: offset + (rect[len_key] * magnification - hs / 2) });\n\t\t\t\t\t$grab_region.css({\n\t\t\t\t\t\t[pos_key]: offset + end_start,\n\t\t\t\t\t\t[len_key]: end_end - end_start,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t$handles_container.on(\"update resize scroll\", update_handle);\n\t\t$G.on(\"resize theme-load\", update_handle);\n\t\tsetTimeout(update_handle, 50);\n\n\t\thandles.push($h[0], $grab_region[0]);\n\t});\n\n\tthis.handles = handles;\n\n\t// It shouldn't scroll when hiding/showing handles, so don't use jQuery hide/show or CSS display.\n\tthis.hide = () => { $(handles).css({ opacity: 0, pointerEvents: \"none\" }); };\n\tthis.show = () => { $(handles).css({ opacity: \"\", pointerEvents: \"\" }); };\n}\n\nexport { Handles };\n\n"
  },
  {
    "path": "src/OnCanvasHelperLayer.js",
    "content": "// @ts-check\n\nimport { OnCanvasObject } from \"./OnCanvasObject.js\";\nimport { make_canvas } from \"./helpers.js\";\n\nclass OnCanvasHelperLayer extends OnCanvasObject {\n\t/**\n\t * @param {number} x\n\t * @param {number} y\n\t * @param {number} width\n\t * @param {number} height\n\t * @param {boolean} hideMainCanvasHandles\n\t * @param {number} [pixelRatio=1]\n\t */\n\tconstructor(x, y, width, height, hideMainCanvasHandles, pixelRatio = 1) {\n\t\tsuper(x, y, width, height, hideMainCanvasHandles);\n\n\t\tthis.$el.addClass(\"helper-layer\");\n\t\tthis.$el.css({\n\t\t\tpointerEvents: \"none\",\n\t\t});\n\t\tthis.position();\n\t\tthis.canvas = make_canvas(this.width * pixelRatio, this.height * pixelRatio);\n\t\tthis.$el.append(this.canvas);\n\t}\n}\n\nexport { OnCanvasHelperLayer };\n\n"
  },
  {
    "path": "src/OnCanvasObject.js",
    "content": "// @ts-check\n/* global $canvas_area, $status_position, $status_size, canvas_handles, magnification */\nimport { $G, E } from \"./helpers.js\";\n\nclass OnCanvasObject {\n\t/**\n\t * @param {number} x\n\t * @param {number} y\n\t * @param {number} width\n\t * @param {number} height\n\t * @param {boolean} hideMainCanvasHandles\n\t */\n\tconstructor(x, y, width, height, hideMainCanvasHandles) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.hideMainCanvasHandles = hideMainCanvasHandles;\n\t\tthis.$el = $(E(\"div\")).addClass(\"on-canvas-object\").appendTo($canvas_area);\n\t\tif (this.hideMainCanvasHandles) {\n\t\t\tcanvas_handles.hide();\n\t\t}\n\t\t$G.on(\"resize theme-load\", this._global_resize_handler = () => {\n\t\t\tthis.position();\n\t\t});\n\t}\n\tposition(updateStatus) {\n\t\t// Nevermind, canvas, isn't aligned to the right in RTL layout!\n\t\t// const direction = get_direction();\n\t\t// const left_for_ltr = direction === \"rtl\" ? \"right\" : \"left\";\n\t\t// const offset_left = parseFloat($canvas_area.css(`padding-${left_for_ltr}`));\n\t\tconst offset_left = parseFloat($canvas_area.css(\"padding-left\"));\n\t\tconst offset_top = parseFloat($canvas_area.css(\"padding-top\"));\n\t\tthis.$el.css({\n\t\t\tposition: \"absolute\",\n\t\t\t// [left_for_ltr]: magnification * (direction === \"rtl\" ? canvas.width - this.width - this.x : this.x) + offset_left,\n\t\t\tleft: magnification * this.x + offset_left,\n\t\t\ttop: magnification * this.y + offset_top,\n\t\t\twidth: magnification * this.width,\n\t\t\theight: magnification * this.height,\n\t\t});\n\t\tif (updateStatus) {\n\t\t\t$status_position.text(`${this.x},${this.y}`);\n\t\t\t$status_size.text(`${this.width}x${this.height}`);\n\t\t}\n\t}\n\tdestroy() {\n\t\tthis.$el.remove();\n\t\tif (this.hideMainCanvasHandles) {\n\t\t\tcanvas_handles.show();\n\t\t}\n\t\t$G.off(\"resize theme-load\", this._global_resize_handler);\n\t}\n}\n\nexport { OnCanvasObject };\n\n"
  },
  {
    "path": "src/OnCanvasSelection.js",
    "content": "// @ts-check\n/* global $canvas_area, $status_position, $status_size, main_canvas, main_ctx, selected_colors, tool_transparent_mode, transparency */\nimport { Handles } from \"./Handles.js\";\nimport { OnCanvasObject } from \"./OnCanvasObject.js\";\nimport { get_tool_by_id, make_or_update_undoable, undoable, update_helper_layer } from \"./functions.js\";\nimport { $G, get_icon_for_tool, get_rgba_from_color, make_canvas, make_css_cursor, to_canvas_coords } from \"./helpers.js\";\nimport { replace_colors_with_swatch } from \"./image-manipulation.js\";\nimport { TOOL_SELECT } from \"./tools.js\";\n\nclass OnCanvasSelection extends OnCanvasObject {\n\t/**\n\t * @param {number} x\n\t * @param {number} y\n\t * @param {number} width\n\t * @param {number} height\n\t * @param {HTMLImageElement | HTMLCanvasElement | ImageData=} image_source\n\t */\n\tconstructor(x, y, width, height, image_source) {\n\t\tsuper(x, y, width, height, true);\n\n\t\tthis.$el.addClass(\"selection\");\n\t\tlet last_tool_transparent_mode = tool_transparent_mode;\n\t\tlet last_background_color = selected_colors.background;\n\t\tthis._on_option_changed = () => {\n\t\t\tif (!this.source_canvas) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (last_tool_transparent_mode !== tool_transparent_mode ||\n\t\t\t\tlast_background_color !== selected_colors.background) {\n\t\t\t\tlast_tool_transparent_mode = tool_transparent_mode;\n\t\t\t\tlast_background_color = selected_colors.background;\n\t\t\t\tthis.update_tool_transparent_mode();\n\t\t\t}\n\t\t};\n\t\t$G.on(\"option-changed\", this._on_option_changed);\n\n\t\tthis.instantiate(image_source);\n\t}\n\tposition() {\n\t\tsuper.position(true);\n\t\tupdate_helper_layer(); // @TODO: under-grid specific helper layer?\n\t}\n\t/**\n\t * @param {HTMLImageElement | HTMLCanvasElement | ImageData=} image_source\n\t */\n\tinstantiate(image_source) {\n\t\tthis.$el.css({\n\t\t\tcursor: make_css_cursor(\"move\", [8, 8], \"move\"),\n\t\t\ttouchAction: \"none\",\n\t\t});\n\t\tthis.position();\n\n\t\tconst instantiate = () => {\n\t\t\tif (image_source) {\n\t\t\t\t// (this applies when pasting a selection)\n\t\t\t\t// NOTE: need to create a Canvas because something about imgs makes dragging not work with magnification\n\t\t\t\t// (width vs naturalWidth?)\n\t\t\t\t// and at least apply_image_transformation needs it to be a canvas now (and the property name says canvas anyways)\n\t\t\t\tthis.source_canvas = make_canvas(image_source);\n\t\t\t\t// @TODO: is this width/height code needed? probably not! wouldn't it clear the canvas anyways?\n\t\t\t\t// but maybe we should assert in some way that the widths are the same, or resize the selection?\n\t\t\t\tif (this.source_canvas.width !== this.width) {\n\t\t\t\t\tthis.source_canvas.width = this.width;\n\t\t\t\t}\n\t\t\t\tif (this.source_canvas.height !== this.height) {\n\t\t\t\t\tthis.source_canvas.height = this.height;\n\t\t\t\t}\n\t\t\t\tthis.canvas = make_canvas(this.source_canvas);\n\t\t\t} else {\n\t\t\t\tthis.source_canvas = make_canvas(this.width, this.height);\n\t\t\t\tthis.source_canvas.ctx.drawImage(main_canvas, this.x, this.y, this.width, this.height, 0, 0, this.width, this.height);\n\t\t\t\tthis.canvas = make_canvas(this.source_canvas);\n\t\t\t\tthis.cut_out_background();\n\t\t\t}\n\t\t\tthis.$el.append(this.canvas);\n\t\t\tthis.handles = new Handles({\n\t\t\t\t$handles_container: this.$el,\n\t\t\t\t$object_container: $canvas_area,\n\t\t\t\toutset: 2,\n\t\t\t\tget_rect: () => ({ x: this.x, y: this.y, width: this.width, height: this.height }),\n\t\t\t\tset_rect: ({ x, y, width, height }) => {\n\t\t\t\t\tundoable({\n\t\t\t\t\t\tname: \"Resize Selection\",\n\t\t\t\t\t\ticon: get_icon_for_tool(get_tool_by_id(TOOL_SELECT)),\n\t\t\t\t\t\tsoft: true,\n\t\t\t\t\t}, () => {\n\t\t\t\t\t\tthis.x = x;\n\t\t\t\t\t\tthis.y = y;\n\t\t\t\t\t\tthis.width = width;\n\t\t\t\t\t\tthis.height = height;\n\t\t\t\t\t\tthis.position();\n\t\t\t\t\t\tthis.resize();\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tget_ghost_offset_left: () => parseFloat($canvas_area.css(\"padding-left\")) + 1,\n\t\t\t\tget_ghost_offset_top: () => parseFloat($canvas_area.css(\"padding-top\")) + 1,\n\t\t\t});\n\t\t\tlet mox, moy;\n\t\t\tconst pointermove = (e) => {\n\t\t\t\tmake_or_update_undoable({\n\t\t\t\t\t// XXX: Localization hazard: logic based on English action names\n\t\t\t\t\tmatch: (history_node) =>\n\t\t\t\t\t\t(e.shiftKey && /^(Smear|Stamp|Move) Selection$/.test(history_node.name)) ||\n\t\t\t\t\t\t(!e.shiftKey && /^Move Selection$/.test(history_node.name)),\n\t\t\t\t\tname: e.shiftKey ? \"Smear Selection\" : \"Move Selection\",\n\t\t\t\t\tupdate_name: true,\n\t\t\t\t\ticon: get_icon_for_tool(get_tool_by_id(TOOL_SELECT)),\n\t\t\t\t\tsoft: true,\n\t\t\t\t}, () => {\n\t\t\t\t\tconst m = to_canvas_coords(e);\n\t\t\t\t\tthis.x = Math.max(Math.min(m.x - mox, main_canvas.width), -this.width);\n\t\t\t\t\tthis.y = Math.max(Math.min(m.y - moy, main_canvas.height), -this.height);\n\t\t\t\t\tthis.position();\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\t// Smear selection\n\t\t\t\t\t\tthis.draw();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t\tthis.canvas_pointerdown = (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst rect = this.canvas.getBoundingClientRect();\n\t\t\t\tconst cx = e.clientX - rect.left;\n\t\t\t\tconst cy = e.clientY - rect.top;\n\t\t\t\tmox = ~~(cx / rect.width * this.canvas.width);\n\t\t\t\tmoy = ~~(cy / rect.height * this.canvas.height);\n\t\t\t\t$G.on(\"pointermove\", pointermove);\n\t\t\t\tthis.dragging = true;\n\t\t\t\tupdate_helper_layer(); // for thumbnail, which draws textbox outline if it's not being dragged\n\t\t\t\t$G.one(\"pointerup\", () => {\n\t\t\t\t\t$G.off(\"pointermove\", pointermove);\n\t\t\t\t\tthis.dragging = false;\n\t\t\t\t\tupdate_helper_layer(); // for thumbnail, which draws selection outline if it's not being dragged\n\t\t\t\t});\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t// Stamp or start to smear selection\n\t\t\t\t\tundoable({\n\t\t\t\t\t\tname: \"Stamp Selection\",\n\t\t\t\t\t\ticon: get_icon_for_tool(get_tool_by_id(TOOL_SELECT)),\n\t\t\t\t\t\tsoft: true,\n\t\t\t\t\t}, () => {\n\t\t\t\t\t\tthis.draw();\n\t\t\t\t\t});\n\t\t\t\t} else if (e.ctrlKey) { // @TODO: how should this work for macOS? where ctrl+click = secondary click?\n\t\t\t\t\t// Stamp selection\n\t\t\t\t\tundoable({\n\t\t\t\t\t\tname: \"Stamp Selection\",\n\t\t\t\t\t\ticon: get_icon_for_tool(get_tool_by_id(TOOL_SELECT)),\n\t\t\t\t\t\tsoft: true,\n\t\t\t\t\t}, () => {\n\t\t\t\t\t\tthis.draw();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\t\t\t$(this.canvas).on(\"pointerdown\", this.canvas_pointerdown);\n\t\t\t$canvas_area.trigger(\"resize\"); // could use \"update\" event instead if this is just to hide the main canvas handles\n\t\t\t$status_position.text(\"\");\n\t\t\t$status_size.text(\"\");\n\t\t};\n\n\t\tinstantiate();\n\t}\n\tcut_out_background() {\n\t\tconst cutout = this.canvas;\n\t\t// doc/this or canvas/cutout, either of those pairs would result in variable names of equal length which is nice :)\n\t\tconst canvasImageData = main_ctx.getImageData(this.x, this.y, this.width, this.height);\n\t\tconst cutoutImageData = cutout.ctx.getImageData(0, 0, this.width, this.height);\n\t\t// cutoutImageData is initialized with the shape to be cut out (whether rectangular or polygonal)\n\t\t// and should end up as the cut out image data for the selection\n\t\t// canvasImageData is initially the portion of image data on the canvas,\n\t\t// and should end up as... the portion of image data on the canvas that it should end up as.\n\t\t// @TODO: could simplify by making the later (shared) condition just if (colored_cutout)\n\t\t// but might change how it works anyways so whatever\n\t\t// if (!transparency) { // now if !transparency or if tool_transparent_mode\n\t\t// this is mainly in order to support patterns as the background color\n\t\t// NOTE: must come before cutout canvas is modified\n\t\tconst colored_cutout = make_canvas(cutout);\n\t\treplace_colors_with_swatch(colored_cutout.ctx, selected_colors.background, this.x, this.y);\n\t\t// const colored_cutout_image_data = colored_cutout.ctx.getImageData(0, 0, this.width, this.height);\n\t\t// }\n\t\tfor (let i = 0; i < cutoutImageData.data.length; i += 4) {\n\t\t\tconst in_cutout = cutoutImageData.data[i + 3] > 0;\n\t\t\tif (in_cutout) {\n\t\t\t\tcutoutImageData.data[i + 0] = canvasImageData.data[i + 0];\n\t\t\t\tcutoutImageData.data[i + 1] = canvasImageData.data[i + 1];\n\t\t\t\tcutoutImageData.data[i + 2] = canvasImageData.data[i + 2];\n\t\t\t\tcutoutImageData.data[i + 3] = canvasImageData.data[i + 3];\n\t\t\t\tcanvasImageData.data[i + 0] = 0;\n\t\t\t\tcanvasImageData.data[i + 1] = 0;\n\t\t\t\tcanvasImageData.data[i + 2] = 0;\n\t\t\t\tcanvasImageData.data[i + 3] = 0;\n\t\t\t} else {\n\t\t\t\tcutoutImageData.data[i + 0] = 0;\n\t\t\t\tcutoutImageData.data[i + 1] = 0;\n\t\t\t\tcutoutImageData.data[i + 2] = 0;\n\t\t\t\tcutoutImageData.data[i + 3] = 0;\n\t\t\t}\n\t\t}\n\t\tmain_ctx.putImageData(canvasImageData, this.x, this.y);\n\t\tcutout.ctx.putImageData(cutoutImageData, 0, 0);\n\t\tthis.update_tool_transparent_mode();\n\t\t// NOTE: in case you want to use the tool_transparent_mode\n\t\t// in a document with transparency (for an operation in an area where there's a local background color)\n\t\t// (and since currently switching to the opaque document mode makes the image opaque)\n\t\t// (and it would be complicated to make it update the canvas when switching tool options (as opposed to just the selection))\n\t\t// I'm having it use the tool_transparent_mode option here, so you could at least choose beforehand\n\t\t// (and this might actually give you more options, although it could be confusingly inconsistent)\n\t\t// @FIXME: yeah, this is confusing; if you have both transparency modes on and you try to clear an area to transparency, it doesn't work\n\t\t// and there's no indication that you should try the other selection transparency mode,\n\t\t// and even if you do, if you do it after creating a selection, it still won't work,\n\t\t// because you will have already *not cut out* the selection from the canvas\n\t\tif (!transparency || tool_transparent_mode) {\n\t\t\tmain_ctx.drawImage(colored_cutout, this.x, this.y);\n\t\t}\n\n\t\t$G.triggerHandler(\"session-update\"); // autosave\n\t\tupdate_helper_layer();\n\t}\n\tupdate_tool_transparent_mode() {\n\t\tconst sourceImageData = this.source_canvas.ctx.getImageData(0, 0, this.width, this.height);\n\t\tconst cutoutImageData = this.canvas.ctx.createImageData(this.width, this.height);\n\t\tconst background_color_rgba = get_rgba_from_color(selected_colors.background);\n\t\t// NOTE: In b&w mode, mspaint treats the transparency color as white,\n\t\t// regardless of the pattern selected, even if the selected background color is pure black.\n\t\t// We allow any kind of image data while in our \"b&w mode\".\n\t\t// Our b&w mode is essentially 'patterns in the palette'.\n\t\tconst match_threshold = 1; // 1 is just enough for a workaround for Brave browser's farbling: https://github.com/1j01/jspaint/issues/184\n\t\tfor (let i = 0; i < cutoutImageData.data.length; i += 4) {\n\t\t\tlet in_cutout = sourceImageData.data[i + 3] > 1;\n\t\t\tif (tool_transparent_mode) {\n\t\t\t\t// @FIXME: work with transparent selected background color\n\t\t\t\t// (support treating partially transparent background colors as transparency)\n\t\t\t\tif (\n\t\t\t\t\tMath.abs(sourceImageData.data[i + 0] - background_color_rgba[0]) <= match_threshold &&\n\t\t\t\t\tMath.abs(sourceImageData.data[i + 1] - background_color_rgba[1]) <= match_threshold &&\n\t\t\t\t\tMath.abs(sourceImageData.data[i + 2] - background_color_rgba[2]) <= match_threshold &&\n\t\t\t\t\tMath.abs(sourceImageData.data[i + 3] - background_color_rgba[3]) <= match_threshold\n\t\t\t\t) {\n\t\t\t\t\tin_cutout = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (in_cutout) {\n\t\t\t\tcutoutImageData.data[i + 0] = sourceImageData.data[i + 0];\n\t\t\t\tcutoutImageData.data[i + 1] = sourceImageData.data[i + 1];\n\t\t\t\tcutoutImageData.data[i + 2] = sourceImageData.data[i + 2];\n\t\t\t\tcutoutImageData.data[i + 3] = sourceImageData.data[i + 3];\n\t\t\t} else {\n\t\t\t\t// cutoutImageData.data[i+0] = 0;\n\t\t\t\t// cutoutImageData.data[i+1] = 0;\n\t\t\t\t// cutoutImageData.data[i+2] = 0;\n\t\t\t\t// cutoutImageData.data[i+3] = 0;\n\t\t\t}\n\t\t}\n\t\tthis.canvas.ctx.putImageData(cutoutImageData, 0, 0);\n\n\t\tupdate_helper_layer();\n\t}\n\t// @TODO: should Image > Invert apply to this.source_canvas or to this.canvas (replacing this.source_canvas with the result)?\n\t/**\n\t * @param {PixelCanvas} new_source_canvas\n\t */\n\treplace_source_canvas(new_source_canvas) {\n\t\tthis.source_canvas = new_source_canvas;\n\t\tconst new_canvas = make_canvas(new_source_canvas);\n\t\t$(this.canvas).replaceWith(new_canvas);\n\t\tthis.canvas = new_canvas;\n\t\tconst center_x = this.x + this.width / 2;\n\t\tconst center_y = this.y + this.height / 2;\n\t\tconst new_width = new_canvas.width;\n\t\tconst new_height = new_canvas.height;\n\t\t// NOTE: flooring the coordinates to integers avoids blurring\n\t\t// but it introduces \"inching\", where the selection can move along by pixels if you rotate it repeatedly\n\t\t// could introduce an \"error offset\" just to avoid this but that seems overkill\n\t\t// and then that would be weird hidden behavior, probably not worth it\n\t\t// Math.round() might make it do it on fewer occasions(?),\n\t\t// but then it goes down *and* to the right, 2 directions vs One Direction\n\t\t// and Math.ceil() is the worst of both worlds\n\t\tthis.x = ~~(center_x - new_width / 2);\n\t\tthis.y = ~~(center_y - new_height / 2);\n\t\tthis.width = new_width;\n\t\tthis.height = new_height;\n\t\tthis.position();\n\t\t$(this.canvas).on(\"pointerdown\", this.canvas_pointerdown);\n\t\tthis.$el.triggerHandler(\"resize\"); //?\n\t\tthis.update_tool_transparent_mode();\n\t}\n\tresize() {\n\t\tconst new_source_canvas = make_canvas(this.width, this.height);\n\t\tnew_source_canvas.ctx.drawImage(this.source_canvas, 0, 0, this.width, this.height);\n\t\tthis.replace_source_canvas(new_source_canvas);\n\t}\n\tscale(factor) {\n\t\tconst new_width = Math.max(1, this.width * factor);\n\t\tconst new_height = Math.max(1, this.height * factor);\n\t\tconst new_source_canvas = make_canvas(new_width, new_height);\n\t\tnew_source_canvas.ctx.drawImage(this.source_canvas, 0, 0, new_source_canvas.width, new_source_canvas.height);\n\t\tthis.replace_source_canvas(new_source_canvas);\n\t}\n\tdraw() {\n\t\ttry {\n\t\t\tmain_ctx.drawImage(this.canvas, this.x, this.y);\n\t\t} catch (_error) {\n\t\t\t// ignore\n\t\t}\n\t}\n\tdestroy() {\n\t\tsuper.destroy();\n\t\t$G.off(\"option-changed\", this._on_option_changed);\n\t\tupdate_helper_layer(); // @TODO: under-grid specific helper layer?\n\t}\n}\n\nexport { OnCanvasSelection };\n\n"
  },
  {
    "path": "src/OnCanvasTextBox.js",
    "content": "// @ts-check\n/* global $canvas_area, $status_position, $status_size, magnification, main_canvas, selected_colors, text_tool_font, tool_transparent_mode */\nimport { $FontBox } from \"./$FontBox.js\";\nimport { Handles } from \"./Handles.js\";\nimport { OnCanvasObject } from \"./OnCanvasObject.js\";\nimport { update_helper_layer } from \"./functions.js\";\nimport { $G, E, get_rgba_from_color, make_canvas, make_css_cursor, to_canvas_coords } from \"./helpers.js\";\n\nclass OnCanvasTextBox extends OnCanvasObject {\n\t/**\n\t * @param {number} x\n\t * @param {number} y\n\t * @param {number} width\n\t * @param {number} height\n\t * @param {string=} starting_text\n\t */\n\tconstructor(x, y, width, height, starting_text = \"\") {\n\t\tsuper(x, y, width, height, true);\n\n\t\tthis.$el.addClass(\"textbox\");\n\t\tvar edit_textarea = E(\"textarea\");\n\t\tthis.$editor = $(edit_textarea).addClass(\"textbox-editor\");\n\n\t\tvar svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n\t\tsvg.setAttribute(\"version\", \"1.1\");\n\t\tvar foreignObject = document.createElementNS(\"http://www.w3.org/2000/svg\", \"foreignObject\");\n\t\tforeignObject.setAttribute(\"x\", \"0\");\n\t\tforeignObject.setAttribute(\"y\", \"0\");\n\t\tsvg.append(foreignObject);\n\n\t\t// inline styles so that they'll be serialized for the SVG\n\t\tthis.$editor.css({\n\t\t\tposition: \"absolute\",\n\t\t\tleft: \"0\",\n\t\t\ttop: \"0\",\n\t\t\tright: \"0\",\n\t\t\tbottom: \"0\",\n\t\t\tpadding: \"0\",\n\t\t\tmargin: \"0\",\n\t\t\tborder: \"0\",\n\t\t\tresize: \"none\",\n\t\t\toverflow: \"hidden\",\n\t\t\tminWidth: \"3em\",\n\t\t});\n\t\tvar render_textarea = /** @type HTMLTextAreaElement */ (edit_textarea.cloneNode(false));\n\t\tforeignObject.append(render_textarea);\n\n\t\tedit_textarea.value = starting_text;\n\n\t\tthis.canvas = make_canvas(width, height);\n\t\tthis.canvas.style.pointerEvents = \"none\";\n\t\tthis.$el.append(this.canvas);\n\n\t\tconst update_size = () => {\n\t\t\tthis.position();\n\t\t\tthis.$el.triggerHandler(\"update\"); // update handles\n\t\t\tthis.$editor.add(render_textarea).css({\n\t\t\t\twidth: this.width,\n\t\t\t\theight: this.height,\n\t\t\t});\n\t\t};\n\n\t\tconst auto_size = () => {\n\t\t\t// Auto-expand, and apply minimum size.\n\t\t\tedit_textarea.style.height = \"\";\n\t\t\tedit_textarea.style.minHeight = \"0px\";\n\t\t\tedit_textarea.style.bottom = \"\"; // needed for when magnified\n\t\t\tedit_textarea.setAttribute(\"rows\", \"1\");\n\t\t\tthis.height = Math.max(edit_textarea.scrollHeight, this.height);\n\t\t\tedit_textarea.removeAttribute(\"rows\");\n\t\t\tthis.width = edit_textarea.scrollWidth;\n\t\t\tedit_textarea.style.bottom = \"0\"; // doesn't seem to be needed?\n\t\t\t// always needs to update at least this.$editor, since style.height is reset above\n\t\t\tupdate_size();\n\t\t};\n\n\t\tconst update = () => {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tedit_textarea.scrollTop = 0; // prevent scrolling edit textarea to keep in sync\n\t\t\t});\n\n\t\t\tconst font = text_tool_font;\n\t\t\tconst get_solid_color = (swatch) => `rgba(${get_rgba_from_color(swatch).join(\", \")}`;\n\t\t\tfont.color = get_solid_color(selected_colors.foreground);\n\t\t\tfont.background = tool_transparent_mode ? \"transparent\" : get_solid_color(selected_colors.background);\n\t\t\tthis.$editor.add(this.canvas).css({\n\t\t\t\ttransform: `scale(${magnification})`,\n\t\t\t\ttransformOrigin: \"left top\",\n\t\t\t});\n\t\t\tthis.$editor.add(render_textarea).css({\n\t\t\t\twidth: this.width,\n\t\t\t\theight: this.height,\n\t\t\t\tfontFamily: font.family,\n\t\t\t\tfontSize: `${font.size}pt`,\n\t\t\t\tfontWeight: font.bold ? \"bold\" : \"normal\",\n\t\t\t\tfontStyle: font.italic ? \"italic\" : \"normal\",\n\t\t\t\ttextDecoration: font.underline ? \"underline\" : \"none\",\n\t\t\t\twritingMode: font.vertical ? \"vertical-lr\" : \"\",\n\t\t\t\tMsWritingMode: font.vertical ? \"vertical-lr\" : \"\",\n\t\t\t\tWebkitWritingMode: font.vertical ? \"vertical-lr\" : \"\",\n\t\t\t\tlineHeight: `${font.size * font.line_scale}px`,\n\t\t\t\tcolor: font.color,\n\t\t\t\tbackground: font.background,\n\t\t\t});\n\n\t\t\t// Must be after font is updated, since the minimum size depends on the font size.\n\t\t\tauto_size();\n\n\t\t\twhile (render_textarea.firstChild) {\n\t\t\t\trender_textarea.removeChild(render_textarea.firstChild);\n\t\t\t}\n\t\t\trender_textarea.appendChild(document.createTextNode(edit_textarea.value));\n\n\t\t\tsvg.setAttribute(\"width\", this.width.toString());\n\t\t\tsvg.setAttribute(\"height\", this.height.toString());\n\t\t\tforeignObject.setAttribute(\"width\", this.width.toString());\n\t\t\tforeignObject.setAttribute(\"height\", this.height.toString());\n\n\t\t\tvar svg_source = new XMLSerializer().serializeToString(svg);\n\t\t\tvar data_url = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg_source)}`;\n\n\t\t\tvar img = new Image();\n\t\t\timg.onload = () => {\n\t\t\t\tthis.canvas.width = this.width;\n\t\t\t\tthis.canvas.height = this.height;\n\t\t\t\tthis.canvas.ctx.drawImage(img, 0, 0);\n\t\t\t\tupdate_helper_layer(); // @TODO: under-grid specific helper layer?\n\t\t\t};\n\t\t\timg.onerror = (event) => {\n\t\t\t\twindow.console?.log(\"Failed to load image\", event);\n\t\t\t};\n\t\t\timg.src = data_url;\n\t\t};\n\n\t\t$G.on(\"option-changed\", this._on_option_changed = update);\n\t\tthis.$editor.on(\"input\", this._on_input = update);\n\t\tthis.$editor.on(\"scroll\", this._on_scroll = () => {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tedit_textarea.scrollTop = 0; // prevent scrolling edit textarea to keep in sync\n\t\t\t});\n\t\t});\n\n\t\tthis.$el.css({\n\t\t\tcursor: make_css_cursor(\"move\", [8, 8], \"move\"),\n\t\t\ttouchAction: \"none\",\n\t\t});\n\t\tthis.position();\n\n\t\tthis.$el.append(this.$editor);\n\t\tthis.$editor[0].focus();\n\t\tthis.handles = new Handles({\n\t\t\t$handles_container: this.$el,\n\t\t\t$object_container: $canvas_area,\n\t\t\toutset: 2,\n\t\t\tthick: true,\n\t\t\tget_rect: () => ({ x: this.x, y: this.y, width: this.width, height: this.height }),\n\t\t\tset_rect: ({ x, y, width, height }) => {\n\t\t\t\tthis.x = x;\n\t\t\t\tthis.y = y;\n\t\t\t\tthis.width = width;\n\t\t\t\tthis.height = height;\n\t\t\t\tthis.position();\n\t\t\t\tupdate();\n\t\t\t\t// clear canvas to avoid an occasional flash of the old canvas (with old size) in the new position\n\t\t\t\t// (trade it off for a flash of the background behind the textbox)\n\t\t\t\tthis.canvas.width = width;\n\t\t\t\tthis.canvas.height = height;\n\t\t\t},\n\t\t\tconstrain_rect: ({ x, y, width, height }, x_axis, y_axis) => {\n\t\t\t\t// remember dimensions\n\t\t\t\tconst old_x = this.x;\n\t\t\t\tconst old_y = this.y;\n\t\t\t\tconst old_width = this.width;\n\t\t\t\tconst old_height = this.height;\n\n\t\t\t\t// apply prospective new dimensions\n\t\t\t\tthis.x = x;\n\t\t\t\tthis.y = y;\n\t\t\t\tthis.width = width;\n\t\t\t\tthis.height = height;\n\t\t\t\tupdate_size();\n\n\t\t\t\t// apply constraints\n\t\t\t\tauto_size();\n\n\t\t\t\t// prevent free movement via resize\n\t\t\t\tif (x_axis === -1) {\n\t\t\t\t\tx = Math.min(this.x, old_x + old_width - this.width);\n\t\t\t\t}\n\t\t\t\tif (y_axis === -1) {\n\t\t\t\t\ty = Math.min(this.y, old_y + old_height - this.height);\n\t\t\t\t}\n\n\t\t\t\t// remember constrained dimensions\n\t\t\t\twidth = this.width;\n\t\t\t\theight = this.height;\n\n\t\t\t\t// reset\n\t\t\t\tthis.x = old_x;\n\t\t\t\tthis.y = old_y;\n\t\t\t\tthis.width = old_width;\n\t\t\t\tthis.height = old_height;\n\t\t\t\tupdate_size();\n\n\t\t\t\treturn { x, y, width, height };\n\t\t\t},\n\t\t\tget_ghost_offset_left: () => parseFloat($canvas_area.css(\"padding-left\")) + 1,\n\t\t\tget_ghost_offset_top: () => parseFloat($canvas_area.css(\"padding-top\")) + 1,\n\t\t});\n\t\tlet mox, moy; // mouse offset\n\t\tconst pointermove = (e) => {\n\t\t\tconst m = to_canvas_coords(e);\n\t\t\tthis.x = Math.max(Math.min(m.x - mox, main_canvas.width), -this.width);\n\t\t\tthis.y = Math.max(Math.min(m.y - moy, main_canvas.height), -this.height);\n\t\t\tthis.position();\n\t\t\tif (e.shiftKey) {\n\t\t\t\t// @TODO: maybe re-enable but handle undoables well\n\t\t\t\t// this.draw();\n\t\t\t}\n\t\t};\n\t\tthis.$el.on(\"pointerdown\", (e) => {\n\t\t\tif (e.target instanceof HTMLInputElement ||\n\t\t\t\te.target instanceof HTMLTextAreaElement ||\n\t\t\t\te.target.classList.contains(\"handle\") ||\n\t\t\t\te.target.classList.contains(\"grab-region\")) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.preventDefault();\n\t\t\tconst rect = this.$el[0].getBoundingClientRect();\n\t\t\tconst cx = e.clientX - rect.left;\n\t\t\tconst cy = e.clientY - rect.top;\n\t\t\tmox = ~~(cx / rect.width * this.canvas.width);\n\t\t\tmoy = ~~(cy / rect.height * this.canvas.height);\n\t\t\tthis.dragging = true;\n\t\t\tupdate_helper_layer(); // for thumbnail, which draws textbox outline if it's not being dragged\n\t\t\t$G.on(\"pointermove\", pointermove);\n\t\t\t$G.one(\"pointerup\", () => {\n\t\t\t\t$G.off(\"pointermove\", pointermove);\n\t\t\t\tthis.dragging = false;\n\t\t\t\tupdate_helper_layer(); // for thumbnail, which draws textbox outline if it's not being dragged\n\t\t\t});\n\t\t});\n\t\t$status_position.text(\"\");\n\t\t$status_size.text(\"\");\n\t\t$canvas_area.trigger(\"resize\"); // could use \"update\" event instead if this is just to hide the main canvas handles\n\n\t\tif (OnCanvasTextBox.$fontbox && OnCanvasTextBox.$fontbox.closed) {\n\t\t\tOnCanvasTextBox.$fontbox = null;\n\t\t}\n\t\tconst $fb = OnCanvasTextBox.$fontbox = OnCanvasTextBox.$fontbox || $FontBox();\n\t\tconst displace_font_box = () => {\n\t\t\t// move the font box out of the way if it's overlapping the OnCanvasTextBox\n\t\t\tconst fb_rect = $fb[0].getBoundingClientRect();\n\t\t\tconst tb_rect = this.$el[0].getBoundingClientRect();\n\t\t\tif (\n\t\t\t\t// the fontbox overlaps textbox\n\t\t\t\tfb_rect.left <= tb_rect.right &&\n\t\t\t\ttb_rect.left <= fb_rect.right &&\n\t\t\t\tfb_rect.top <= tb_rect.bottom &&\n\t\t\t\ttb_rect.top <= fb_rect.bottom\n\t\t\t) {\n\t\t\t\t// move the font box out of the way\n\t\t\t\t$fb.css({\n\t\t\t\t\ttop: this.$el.position().top - $fb.height(),\n\t\t\t\t});\n\t\t\t}\n\t\t\t$fb.applyBounds();\n\t\t};\n\n\t\t// must be after textbox is in the DOM\n\t\tupdate();\n\n\t\tdisplace_font_box();\n\n\t\t// In case a software keyboard opens, like Optikey for eye gaze / head tracking users,\n\t\t// or perhaps a handwriting input for pen tablet users, or *partially* for mobile browsers.\n\t\t// Mobile browsers generally scroll the view for a textbox well enough, but\n\t\t// don't include the custom behavior of moving the font box out of the way.\n\t\t$(window).on(\"resize\", this._on_window_resize = () => {\n\t\t\tthis.$editor[0].scrollIntoView({ block: \"nearest\", inline: \"nearest\" });\n\t\t\tdisplace_font_box();\n\t\t});\n\t}\n\tposition() {\n\t\tsuper.position(true);\n\t\tupdate_helper_layer(); // @TODO: under-grid specific helper layer?\n\t}\n\tdestroy() {\n\t\tsuper.destroy();\n\t\tif (OnCanvasTextBox.$fontbox && !OnCanvasTextBox.$fontbox.closed) {\n\t\t\tOnCanvasTextBox.$fontbox.close();\n\t\t}\n\t\tOnCanvasTextBox.$fontbox = null;\n\t\t$G.off(\"option-changed\", this._on_option_changed);\n\t\tthis.$editor.off(\"input\", this._on_input);\n\t\tthis.$editor.off(\"scroll\", this._on_scroll);\n\t\t$(window).off(\"resize\", this._on_window_resize);\n\t\tupdate_helper_layer(); // @TODO: under-grid specific helper layer?\n\t}\n}\n\n/**\n * @static\n * @type {OSGUI$Window | null}\n * @memberof OnCanvasTextBox\n */\nOnCanvasTextBox.$fontbox = null;\n\nexport { OnCanvasTextBox };\n\n"
  },
  {
    "path": "src/app-localization.js",
    "content": "// @ts-check\n/* global $G, AccessKeys, are_you_sure, exit_fullscreen_if_ios, show_error_message, showMessageBox */\n\n// const { are_you_sure, exit_fullscreen_if_ios, show_error_message } = require(\"./functions.js\");\n// const { $G } = require(\"./helpers.js\");\n// const { showMessageBox } = require(\"./msgbox.js\");\n// These globals (at least $G) may not exist yet.\n// const { are_you_sure, exit_fullscreen_if_ios, show_error_message, $G, showMessageBox } = window;\n\n((exports) => {\n\tlet localizations = {};\n\t/**\n\t * @param {string} english_text - The English text to localize\n\t * @param  {...string} interpolations - Strings to replace %1, %2, etc.\n\t * @returns {string} - Text in the current language\n\t */\n\tfunction localize(english_text, ...interpolations) {\n\t\tfunction find_localization(english_text) {\n\t\t\tif (AccessKeys.has(english_text)) {\n\t\t\t\tconst without_hotkey = AccessKeys.remove(english_text);\n\t\t\t\tif (localizations[without_hotkey]) {\n\t\t\t\t\tconst hotkey_def = AccessKeys.get(english_text);\n\t\t\t\t\tif (localizations[without_hotkey].toUpperCase().indexOf(hotkey_def.toUpperCase()) > -1) {\n\t\t\t\t\t\treturn localizations[without_hotkey];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (AccessKeys.has(localizations[without_hotkey])) {\n\t\t\t\t\t\t\t// window.console?.warn(`Localization has differing access key hint: '${localizations[without_hotkey]}' vs '${english_text}'`);\n\t\t\t\t\t\t\t// @TODO: detect differing access key more generally\n\t\t\t\t\t\t\treturn `${AccessKeys.remove(localizations[without_hotkey])} (${hotkey_def})`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn `${localizations[without_hotkey]} (${hotkey_def})`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (localizations[english_text]) {\n\t\t\t\treturn localizations[english_text];\n\t\t\t}\n\t\t\treturn english_text;\n\t\t}\n\t\tfunction interpolate(text, interpolations) {\n\t\t\tfor (let i = 0; i < interpolations.length; i++) {\n\t\t\t\ttext = text.replace(`%${i + 1}`, interpolations[i]);\n\t\t\t}\n\t\t\treturn text;\n\t\t}\n\t\treturn interpolate(find_localization(english_text), interpolations);\n\t}\n\n\tconst language_storage_key = \"jspaint language\";\n\t// @ts-ignore\n\tconst accepted_languages = Array.from(navigator.languages || [navigator.language || navigator.userLanguage]);\n\ttry {\n\t\tif (localStorage[language_storage_key]) {\n\t\t\taccepted_languages.unshift(localStorage[language_storage_key]);\n\t\t}\n\t} catch (_error) {\n\t\t// if there's no localStorage access, you can still configure the language via system settings, theoretically\n\t\t// TODO: also via URL?\n\t}\n\n\tvar language_to_default_region = {\n\t\taa: \"ET\",\n\t\tab: \"GE\",\n\t\tabr: \"GH\",\n\t\tace: \"ID\",\n\t\tach: \"UG\",\n\t\tada: \"GH\",\n\t\tady: \"RU\",\n\t\tae: \"IR\",\n\t\taeb: \"TN\",\n\t\taf: \"ZA\",\n\t\tagq: \"CM\",\n\t\taho: \"IN\",\n\t\tak: \"GH\",\n\t\takk: \"IQ\",\n\t\taln: \"XK\",\n\t\talt: \"RU\",\n\t\tam: \"ET\",\n\t\tamo: \"NG\",\n\t\taoz: \"ID\",\n\t\tapd: \"TG\",\n\t\tar: \"EG\",\n\t\tarc: \"IR\",\n\t\t\"arc-Nbat\": \"JO\",\n\t\t\"arc-Palm\": \"SY\",\n\t\tarn: \"CL\",\n\t\taro: \"BO\",\n\t\tarq: \"DZ\",\n\t\tary: \"MA\",\n\t\tarz: \"EG\",\n\t\tas: \"IN\",\n\t\tasa: \"TZ\",\n\t\tase: \"US\",\n\t\tast: \"ES\",\n\t\tatj: \"CA\",\n\t\tav: \"RU\",\n\t\tawa: \"IN\",\n\t\tay: \"BO\",\n\t\taz: \"AZ\",\n\t\t\"az-Arab\": \"IR\",\n\t\tba: \"RU\",\n\t\tbal: \"PK\",\n\t\tban: \"ID\",\n\t\tbap: \"NP\",\n\t\tbar: \"AT\",\n\t\tbas: \"CM\",\n\t\tbax: \"CM\",\n\t\tbbc: \"ID\",\n\t\tbbj: \"CM\",\n\t\tbci: \"CI\",\n\t\tbe: \"BY\",\n\t\tbej: \"SD\",\n\t\tbem: \"ZM\",\n\t\tbew: \"ID\",\n\t\tbez: \"TZ\",\n\t\tbfd: \"CM\",\n\t\tbfq: \"IN\",\n\t\tbft: \"PK\",\n\t\tbfy: \"IN\",\n\t\tbg: \"BG\",\n\t\tbgc: \"IN\",\n\t\tbgn: \"PK\",\n\t\tbgx: \"TR\",\n\t\tbhb: \"IN\",\n\t\tbhi: \"IN\",\n\t\tbhk: \"PH\",\n\t\tbho: \"IN\",\n\t\tbi: \"VU\",\n\t\tbik: \"PH\",\n\t\tbin: \"NG\",\n\t\tbjj: \"IN\",\n\t\tbjn: \"ID\",\n\t\tbjt: \"SN\",\n\t\tbkm: \"CM\",\n\t\tbku: \"PH\",\n\t\tblt: \"VN\",\n\t\tbm: \"ML\",\n\t\tbmq: \"ML\",\n\t\tbn: \"BD\",\n\t\tbo: \"CN\",\n\t\tbpy: \"IN\",\n\t\tbqi: \"IR\",\n\t\tbqv: \"CI\",\n\t\tbr: \"FR\",\n\t\tbra: \"IN\",\n\t\tbrh: \"PK\",\n\t\tbrx: \"IN\",\n\t\tbs: \"BA\",\n\t\tbsq: \"LR\",\n\t\tbss: \"CM\",\n\t\tbto: \"PH\",\n\t\tbtv: \"PK\",\n\t\tbua: \"RU\",\n\t\tbuc: \"YT\",\n\t\tbug: \"ID\",\n\t\tbum: \"CM\",\n\t\tbvb: \"GQ\",\n\t\tbyn: \"ER\",\n\t\tbyv: \"CM\",\n\t\tbze: \"ML\",\n\t\tca: \"ES\",\n\t\tcch: \"NG\",\n\t\tccp: \"BD\",\n\t\tce: \"RU\",\n\t\tceb: \"PH\",\n\t\tcgg: \"UG\",\n\t\tch: \"GU\",\n\t\tchk: \"FM\",\n\t\tchm: \"RU\",\n\t\tcho: \"US\",\n\t\tchp: \"CA\",\n\t\tchr: \"US\",\n\t\tcja: \"KH\",\n\t\tcjm: \"VN\",\n\t\tckb: \"IQ\",\n\t\tco: \"FR\",\n\t\tcop: \"EG\",\n\t\tcps: \"PH\",\n\t\tcr: \"CA\",\n\t\tcrh: \"UA\",\n\t\tcrj: \"CA\",\n\t\tcrk: \"CA\",\n\t\tcrl: \"CA\",\n\t\tcrm: \"CA\",\n\t\tcrs: \"SC\",\n\t\tcs: \"CZ\",\n\t\tcsb: \"PL\",\n\t\tcsw: \"CA\",\n\t\tctd: \"MM\",\n\t\tcu: \"RU\",\n\t\t\"cu-Glag\": \"BG\",\n\t\tcv: \"RU\",\n\t\tcy: \"GB\",\n\t\tda: \"DK\",\n\t\tdak: \"US\",\n\t\tdar: \"RU\",\n\t\tdav: \"KE\",\n\t\tdcc: \"IN\",\n\t\tde: \"DE\",\n\t\tden: \"CA\",\n\t\tdgr: \"CA\",\n\t\tdje: \"NE\",\n\t\tdnj: \"CI\",\n\t\tdoi: \"IN\",\n\t\tdsb: \"DE\",\n\t\tdtm: \"ML\",\n\t\tdtp: \"MY\",\n\t\tdty: \"NP\",\n\t\tdua: \"CM\",\n\t\tdv: \"MV\",\n\t\tdyo: \"SN\",\n\t\tdyu: \"BF\",\n\t\tdz: \"BT\",\n\t\tebu: \"KE\",\n\t\tee: \"GH\",\n\t\tefi: \"NG\",\n\t\tegl: \"IT\",\n\t\tegy: \"EG\",\n\t\teky: \"MM\",\n\t\tel: \"GR\",\n\t\ten: \"US\",\n\t\t\"en-Shaw\": \"GB\",\n\t\tes: \"ES\",\n\t\tesu: \"US\",\n\t\tet: \"EE\",\n\t\tett: \"IT\",\n\t\teu: \"ES\",\n\t\tewo: \"CM\",\n\t\text: \"ES\",\n\t\tfa: \"IR\",\n\t\tfan: \"GQ\",\n\t\tff: \"SN\",\n\t\t\"ff-Adlm\": \"GN\",\n\t\tffm: \"ML\",\n\t\tfi: \"FI\",\n\t\tfia: \"SD\",\n\t\tfil: \"PH\",\n\t\tfit: \"SE\",\n\t\tfj: \"FJ\",\n\t\tfo: \"FO\",\n\t\tfon: \"BJ\",\n\t\tfr: \"FR\",\n\t\tfrc: \"US\",\n\t\tfrp: \"FR\",\n\t\tfrr: \"DE\",\n\t\tfrs: \"DE\",\n\t\tfub: \"CM\",\n\t\tfud: \"WF\",\n\t\tfuf: \"GN\",\n\t\tfuq: \"NE\",\n\t\tfur: \"IT\",\n\t\tfuv: \"NG\",\n\t\tfvr: \"SD\",\n\t\tfy: \"NL\",\n\t\tga: \"IE\",\n\t\tgaa: \"GH\",\n\t\tgag: \"MD\",\n\t\tgan: \"CN\",\n\t\tgay: \"ID\",\n\t\tgbm: \"IN\",\n\t\tgbz: \"IR\",\n\t\tgcr: \"GF\",\n\t\tgd: \"GB\",\n\t\tgez: \"ET\",\n\t\tggn: \"NP\",\n\t\tgil: \"KI\",\n\t\tgjk: \"PK\",\n\t\tgju: \"PK\",\n\t\tgl: \"ES\",\n\t\tglk: \"IR\",\n\t\tgn: \"PY\",\n\t\tgom: \"IN\",\n\t\tgon: \"IN\",\n\t\tgor: \"ID\",\n\t\tgos: \"NL\",\n\t\tgot: \"UA\",\n\t\tgrc: \"CY\",\n\t\t\"grc-Linb\": \"GR\",\n\t\tgrt: \"IN\",\n\t\tgsw: \"CH\",\n\t\tgu: \"IN\",\n\t\tgub: \"BR\",\n\t\tguc: \"CO\",\n\t\tgur: \"GH\",\n\t\tguz: \"KE\",\n\t\tgv: \"IM\",\n\t\tgvr: \"NP\",\n\t\tgwi: \"CA\",\n\t\tha: \"NG\",\n\t\thak: \"CN\",\n\t\thaw: \"US\",\n\t\thaz: \"AF\",\n\t\the: \"IL\",\n\t\thi: \"IN\",\n\t\thif: \"FJ\",\n\t\thil: \"PH\",\n\t\thlu: \"TR\",\n\t\thmd: \"CN\",\n\t\thnd: \"PK\",\n\t\thne: \"IN\",\n\t\thnj: \"LA\",\n\t\thnn: \"PH\",\n\t\thno: \"PK\",\n\t\tho: \"PG\",\n\t\thoc: \"IN\",\n\t\thoj: \"IN\",\n\t\thr: \"HR\",\n\t\thsb: \"DE\",\n\t\thsn: \"CN\",\n\t\tht: \"HT\",\n\t\thu: \"HU\",\n\t\thy: \"AM\",\n\t\thz: \"NA\",\n\t\tia: \"FR\",\n\t\tiba: \"MY\",\n\t\tibb: \"NG\",\n\t\tid: \"ID\",\n\t\tife: \"TG\",\n\t\tig: \"NG\",\n\t\tii: \"CN\",\n\t\tik: \"US\",\n\t\tikt: \"CA\",\n\t\tilo: \"PH\",\n\t\tin: \"ID\",\n\t\tinh: \"RU\",\n\t\tis: \"IS\",\n\t\tit: \"IT\",\n\t\tiu: \"CA\",\n\t\tiw: \"IL\",\n\t\tizh: \"RU\",\n\t\tja: \"JP\",\n\t\tjam: \"JM\",\n\t\tjgo: \"CM\",\n\t\tji: \"UA\",\n\t\tjmc: \"TZ\",\n\t\tjml: \"NP\",\n\t\tjut: \"DK\",\n\t\tjv: \"ID\",\n\t\tjw: \"ID\",\n\t\tka: \"GE\",\n\t\tkaa: \"UZ\",\n\t\tkab: \"DZ\",\n\t\tkac: \"MM\",\n\t\tkaj: \"NG\",\n\t\tkam: \"KE\",\n\t\tkao: \"ML\",\n\t\tkbd: \"RU\",\n\t\tkby: \"NE\",\n\t\tkcg: \"NG\",\n\t\tkck: \"ZW\",\n\t\tkde: \"TZ\",\n\t\tkdh: \"TG\",\n\t\tkdt: \"TH\",\n\t\tkea: \"CV\",\n\t\tken: \"CM\",\n\t\tkfo: \"CI\",\n\t\tkfr: \"IN\",\n\t\tkfy: \"IN\",\n\t\tkg: \"CD\",\n\t\tkge: \"ID\",\n\t\tkgp: \"BR\",\n\t\tkha: \"IN\",\n\t\tkhb: \"CN\",\n\t\tkhn: \"IN\",\n\t\tkhq: \"ML\",\n\t\tkht: \"IN\",\n\t\tkhw: \"PK\",\n\t\tki: \"KE\",\n\t\tkiu: \"TR\",\n\t\tkj: \"NA\",\n\t\tkjg: \"LA\",\n\t\tkk: \"KZ\",\n\t\t\"kk-Arab\": \"CN\",\n\t\tkkj: \"CM\",\n\t\tkl: \"GL\",\n\t\tkln: \"KE\",\n\t\tkm: \"KH\",\n\t\tkmb: \"AO\",\n\t\tkn: \"IN\",\n\t\tknf: \"SN\",\n\t\tko: \"KR\",\n\t\tkoi: \"RU\",\n\t\tkok: \"IN\",\n\t\tkos: \"FM\",\n\t\tkpe: \"LR\",\n\t\tkrc: \"RU\",\n\t\tkri: \"SL\",\n\t\tkrj: \"PH\",\n\t\tkrl: \"RU\",\n\t\tkru: \"IN\",\n\t\tks: \"IN\",\n\t\tksb: \"TZ\",\n\t\tksf: \"CM\",\n\t\tksh: \"DE\",\n\t\tku: \"TR\",\n\t\t\"ku-Arab\": \"IQ\",\n\t\tkum: \"RU\",\n\t\tkv: \"RU\",\n\t\tkvr: \"ID\",\n\t\tkvx: \"PK\",\n\t\tkw: \"GB\",\n\t\tkxm: \"TH\",\n\t\tkxp: \"PK\",\n\t\tky: \"KG\",\n\t\t\"ky-Arab\": \"CN\",\n\t\t\"ky-Latn\": \"TR\",\n\t\tla: \"VA\",\n\t\tlab: \"GR\",\n\t\tlad: \"IL\",\n\t\tlag: \"TZ\",\n\t\tlah: \"PK\",\n\t\tlaj: \"UG\",\n\t\tlb: \"LU\",\n\t\tlbe: \"RU\",\n\t\tlbw: \"ID\",\n\t\tlcp: \"CN\",\n\t\tlep: \"IN\",\n\t\tlez: \"RU\",\n\t\tlg: \"UG\",\n\t\tli: \"NL\",\n\t\tlif: \"NP\",\n\t\t\"lif-Limb\": \"IN\",\n\t\tlij: \"IT\",\n\t\tlis: \"CN\",\n\t\tljp: \"ID\",\n\t\tlki: \"IR\",\n\t\tlkt: \"US\",\n\t\tlmn: \"IN\",\n\t\tlmo: \"IT\",\n\t\tln: \"CD\",\n\t\tlo: \"LA\",\n\t\tlol: \"CD\",\n\t\tloz: \"ZM\",\n\t\tlrc: \"IR\",\n\t\tlt: \"LT\",\n\t\tltg: \"LV\",\n\t\tlu: \"CD\",\n\t\tlua: \"CD\",\n\t\tluo: \"KE\",\n\t\tluy: \"KE\",\n\t\tluz: \"IR\",\n\t\tlv: \"LV\",\n\t\tlwl: \"TH\",\n\t\tlzh: \"CN\",\n\t\tlzz: \"TR\",\n\t\tmad: \"ID\",\n\t\tmaf: \"CM\",\n\t\tmag: \"IN\",\n\t\tmai: \"IN\",\n\t\tmak: \"ID\",\n\t\tman: \"GM\",\n\t\t\"man-Nkoo\": \"GN\",\n\t\tmas: \"KE\",\n\t\tmaz: \"MX\",\n\t\tmdf: \"RU\",\n\t\tmdh: \"PH\",\n\t\tmdr: \"ID\",\n\t\tmen: \"SL\",\n\t\tmer: \"KE\",\n\t\tmfa: \"TH\",\n\t\tmfe: \"MU\",\n\t\tmg: \"MG\",\n\t\tmgh: \"MZ\",\n\t\tmgo: \"CM\",\n\t\tmgp: \"NP\",\n\t\tmgy: \"TZ\",\n\t\tmh: \"MH\",\n\t\tmi: \"NZ\",\n\t\tmin: \"ID\",\n\t\tmis: \"IQ\",\n\t\tmk: \"MK\",\n\t\tml: \"IN\",\n\t\tmls: \"SD\",\n\t\tmn: \"MN\",\n\t\t\"mn-Mong\": \"CN\",\n\t\tmni: \"IN\",\n\t\tmnw: \"MM\",\n\t\tmoe: \"CA\",\n\t\tmoh: \"CA\",\n\t\tmos: \"BF\",\n\t\tmr: \"IN\",\n\t\tmrd: \"NP\",\n\t\tmrj: \"RU\",\n\t\tmro: \"BD\",\n\t\tms: \"MY\",\n\t\tmt: \"MT\",\n\t\tmtr: \"IN\",\n\t\tmua: \"CM\",\n\t\tmus: \"US\",\n\t\tmvy: \"PK\",\n\t\tmwk: \"ML\",\n\t\tmwr: \"IN\",\n\t\tmwv: \"ID\",\n\t\tmxc: \"ZW\",\n\t\tmy: \"MM\",\n\t\tmyv: \"RU\",\n\t\tmyx: \"UG\",\n\t\tmyz: \"IR\",\n\t\tmzn: \"IR\",\n\t\tna: \"NR\",\n\t\tnan: \"CN\",\n\t\tnap: \"IT\",\n\t\tnaq: \"NA\",\n\t\tnb: \"NO\",\n\t\tnch: \"MX\",\n\t\tnd: \"ZW\",\n\t\tndc: \"MZ\",\n\t\tnds: \"DE\",\n\t\tne: \"NP\",\n\t\tnew: \"NP\",\n\t\tng: \"NA\",\n\t\tngl: \"MZ\",\n\t\tnhe: \"MX\",\n\t\tnhw: \"MX\",\n\t\tnij: \"ID\",\n\t\tniu: \"NU\",\n\t\tnjo: \"IN\",\n\t\tnl: \"NL\",\n\t\tnmg: \"CM\",\n\t\tnn: \"NO\",\n\t\tnnh: \"CM\",\n\t\tno: \"NO\",\n\t\tnod: \"TH\",\n\t\tnoe: \"IN\",\n\t\tnon: \"SE\",\n\t\tnqo: \"GN\",\n\t\tnr: \"ZA\",\n\t\tnsk: \"CA\",\n\t\tnso: \"ZA\",\n\t\tnus: \"SS\",\n\t\tnv: \"US\",\n\t\tnxq: \"CN\",\n\t\tny: \"MW\",\n\t\tnym: \"TZ\",\n\t\tnyn: \"UG\",\n\t\tnzi: \"GH\",\n\t\toc: \"FR\",\n\t\tom: \"ET\",\n\t\tor: \"IN\",\n\t\tos: \"GE\",\n\t\tosa: \"US\",\n\t\totk: \"MN\",\n\t\tpa: \"IN\",\n\t\t\"pa-Arab\": \"PK\",\n\t\tpag: \"PH\",\n\t\tpal: \"IR\",\n\t\t\"pal-Phlp\": \"CN\",\n\t\tpam: \"PH\",\n\t\tpap: \"AW\",\n\t\tpau: \"PW\",\n\t\tpcd: \"FR\",\n\t\tpcm: \"NG\",\n\t\tpdc: \"US\",\n\t\tpdt: \"CA\",\n\t\tpeo: \"IR\",\n\t\tpfl: \"DE\",\n\t\tphn: \"LB\",\n\t\tpka: \"IN\",\n\t\tpko: \"KE\",\n\t\tpl: \"PL\",\n\t\tpms: \"IT\",\n\t\tpnt: \"GR\",\n\t\tpon: \"FM\",\n\t\tpra: \"PK\",\n\t\tprd: \"IR\",\n\t\tps: \"AF\",\n\t\tpt: \"PT\", //\"BR\",\n\t\tpuu: \"GA\",\n\t\tqu: \"PE\",\n\t\tquc: \"GT\",\n\t\tqug: \"EC\",\n\t\traj: \"IN\",\n\t\trcf: \"RE\",\n\t\trej: \"ID\",\n\t\trgn: \"IT\",\n\t\tria: \"IN\",\n\t\trif: \"MA\",\n\t\trjs: \"NP\",\n\t\trkt: \"BD\",\n\t\trm: \"CH\",\n\t\trmf: \"FI\",\n\t\trmo: \"CH\",\n\t\trmt: \"IR\",\n\t\trmu: \"SE\",\n\t\trn: \"BI\",\n\t\trng: \"MZ\",\n\t\tro: \"RO\",\n\t\trob: \"ID\",\n\t\trof: \"TZ\",\n\t\trtm: \"FJ\",\n\t\tru: \"RU\",\n\t\true: \"UA\",\n\t\trug: \"SB\",\n\t\trw: \"RW\",\n\t\trwk: \"TZ\",\n\t\tryu: \"JP\",\n\t\tsa: \"IN\",\n\t\tsaf: \"GH\",\n\t\tsah: \"RU\",\n\t\tsaq: \"KE\",\n\t\tsas: \"ID\",\n\t\tsat: \"IN\",\n\t\tsav: \"SN\",\n\t\tsaz: \"IN\",\n\t\tsbp: \"TZ\",\n\t\tsc: \"IT\",\n\t\tsck: \"IN\",\n\t\tscn: \"IT\",\n\t\tsco: \"GB\",\n\t\tscs: \"CA\",\n\t\tsd: \"PK\",\n\t\t\"sd-Deva\": \"IN\",\n\t\t\"sd-Khoj\": \"IN\",\n\t\t\"sd-Sind\": \"IN\",\n\t\tsdc: \"IT\",\n\t\tsdh: \"IR\",\n\t\tse: \"NO\",\n\t\tsef: \"CI\",\n\t\tseh: \"MZ\",\n\t\tsei: \"MX\",\n\t\tses: \"ML\",\n\t\tsg: \"CF\",\n\t\tsga: \"IE\",\n\t\tsgs: \"LT\",\n\t\tshi: \"MA\",\n\t\tshn: \"MM\",\n\t\tsi: \"LK\",\n\t\tsid: \"ET\",\n\t\tsk: \"SK\",\n\t\tskr: \"PK\",\n\t\tsl: \"SI\",\n\t\tsli: \"PL\",\n\t\tsly: \"ID\",\n\t\tsm: \"WS\",\n\t\tsma: \"SE\",\n\t\tsmj: \"SE\",\n\t\tsmn: \"FI\",\n\t\tsmp: \"IL\",\n\t\tsms: \"FI\",\n\t\tsn: \"ZW\",\n\t\tsnk: \"ML\",\n\t\tso: \"SO\",\n\t\tsou: \"TH\",\n\t\tsq: \"AL\",\n\t\tsr: \"RS\",\n\t\tsrb: \"IN\",\n\t\tsrn: \"SR\",\n\t\tsrr: \"SN\",\n\t\tsrx: \"IN\",\n\t\tss: \"ZA\",\n\t\tssy: \"ER\",\n\t\tst: \"ZA\",\n\t\tstq: \"DE\",\n\t\tsu: \"ID\",\n\t\tsuk: \"TZ\",\n\t\tsus: \"GN\",\n\t\tsv: \"SE\",\n\t\tsw: \"TZ\",\n\t\tswb: \"YT\",\n\t\tswc: \"CD\",\n\t\tswg: \"DE\",\n\t\tswv: \"IN\",\n\t\tsxn: \"ID\",\n\t\tsyl: \"BD\",\n\t\tsyr: \"IQ\",\n\t\tszl: \"PL\",\n\t\tta: \"IN\",\n\t\ttaj: \"NP\",\n\t\ttbw: \"PH\",\n\t\ttcy: \"IN\",\n\t\ttdd: \"CN\",\n\t\ttdg: \"NP\",\n\t\ttdh: \"NP\",\n\t\tte: \"IN\",\n\t\ttem: \"SL\",\n\t\tteo: \"UG\",\n\t\ttet: \"TL\",\n\t\ttg: \"TJ\",\n\t\t\"tg-Arab\": \"PK\",\n\t\tth: \"TH\",\n\t\tthl: \"NP\",\n\t\tthq: \"NP\",\n\t\tthr: \"NP\",\n\t\tti: \"ET\",\n\t\ttig: \"ER\",\n\t\ttiv: \"NG\",\n\t\ttk: \"TM\",\n\t\ttkl: \"TK\",\n\t\ttkr: \"AZ\",\n\t\ttkt: \"NP\",\n\t\ttl: \"PH\",\n\t\ttly: \"AZ\",\n\t\ttmh: \"NE\",\n\t\ttn: \"ZA\",\n\t\tto: \"TO\",\n\t\ttog: \"MW\",\n\t\ttpi: \"PG\",\n\t\ttr: \"TR\",\n\t\ttru: \"TR\",\n\t\ttrv: \"TW\",\n\t\tts: \"ZA\",\n\t\ttsd: \"GR\",\n\t\ttsf: \"NP\",\n\t\ttsg: \"PH\",\n\t\ttsj: \"BT\",\n\t\ttt: \"RU\",\n\t\tttj: \"UG\",\n\t\ttts: \"TH\",\n\t\tttt: \"AZ\",\n\t\ttum: \"MW\",\n\t\ttvl: \"TV\",\n\t\ttwq: \"NE\",\n\t\ttxg: \"CN\",\n\t\tty: \"PF\",\n\t\ttyv: \"RU\",\n\t\ttzm: \"MA\",\n\t\tudm: \"RU\",\n\t\tug: \"CN\",\n\t\t\"ug-Cyrl\": \"KZ\",\n\t\tuga: \"SY\",\n\t\tuk: \"UA\",\n\t\tuli: \"FM\",\n\t\tumb: \"AO\",\n\t\tund: \"US\",\n\t\tunr: \"IN\",\n\t\t\"unr-Deva\": \"NP\",\n\t\tunx: \"IN\",\n\t\tur: \"PK\",\n\t\tuz: \"UZ\",\n\t\t\"uz-Arab\": \"AF\",\n\t\tvai: \"LR\",\n\t\tve: \"ZA\",\n\t\tvec: \"IT\",\n\t\tvep: \"RU\",\n\t\tvi: \"VN\",\n\t\tvic: \"SX\",\n\t\tvls: \"BE\",\n\t\tvmf: \"DE\",\n\t\tvmw: \"MZ\",\n\t\tvot: \"RU\",\n\t\tvro: \"EE\",\n\t\tvun: \"TZ\",\n\t\twa: \"BE\",\n\t\twae: \"CH\",\n\t\twal: \"ET\",\n\t\twar: \"PH\",\n\t\twbp: \"AU\",\n\t\twbq: \"IN\",\n\t\twbr: \"IN\",\n\t\twls: \"WF\",\n\t\twni: \"KM\",\n\t\two: \"SN\",\n\t\twtm: \"IN\",\n\t\twuu: \"CN\",\n\t\txav: \"BR\",\n\t\txcr: \"TR\",\n\t\txh: \"ZA\",\n\t\txlc: \"TR\",\n\t\txld: \"TR\",\n\t\txmf: \"GE\",\n\t\txmn: \"CN\",\n\t\txmr: \"SD\",\n\t\txna: \"SA\",\n\t\txnr: \"IN\",\n\t\txog: \"UG\",\n\t\txpr: \"IR\",\n\t\txsa: \"YE\",\n\t\txsr: \"NP\",\n\t\tyao: \"MZ\",\n\t\tyap: \"FM\",\n\t\tyav: \"CM\",\n\t\tybb: \"CM\",\n\t\tyo: \"NG\",\n\t\tyrl: \"BR\",\n\t\tyua: \"MX\",\n\t\tyue: \"HK\",\n\t\t\"yue-Hans\": \"CN\",\n\t\tza: \"CN\",\n\t\tzag: \"SD\",\n\t\tzdj: \"KM\",\n\t\tzea: \"NL\",\n\t\tzgh: \"MA\",\n\t\tzh: \"CN\",\n\t\t\"zh-Bopo\": \"TW\",\n\t\t\"zh-Hanb\": \"TW\",\n\t\t\"zh-Hant\": \"TW\",\n\t\tzlm: \"TG\",\n\t\tzmi: \"MY\",\n\t\tzu: \"ZA\",\n\t\tzza: \"TR\",\n\t};\n\n\tfunction get_language_emoji(locale) {\n\t\tvar split = locale.toUpperCase().split(/-|_/);\n\t\tvar lang = split.shift();\n\t\tvar code = split.pop();\n\n\t\tif (!/^[A-Z]{2}$/.test(code)) {\n\t\t\tcode = language_to_default_region[lang.toLowerCase()];\n\t\t}\n\n\t\tif (!code) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tconst a = String.fromCodePoint(code.codePointAt(0) - 0x41 + 0x1F1E6);\n\t\tconst b = String.fromCodePoint(code.codePointAt(1) - 0x41 + 0x1F1E6);\n\t\treturn a + b;\n\t}\n\n\tconst base_language = \"en\";\n\t// This array can be updated automatically by preprocess.js, although that feature is likely no longer useful,\n\t// as I have added all the languages from Windows 98 editions that I could find, and additional languages\n\t// will not be through preprocessing resource files from Windows 98.\n\t// (preprocess.js may still be useful since the preprocessing wasn't perfect, and I could improve and re-run it,\n\t// but that won't add new languages.)\n\tconst available_languages = [\"ar\", \"cs\", \"da\", \"de\", \"el\", \"en\", \"es\", \"fi\", \"fr\", \"he\", \"hu\", \"it\", \"ja\", \"ko\", \"nl\", \"no\", \"pl\", \"pt\", \"pt-br\", \"ru\", \"sk\", \"sl\", \"sv\", \"tr\", \"zh\", \"zh-simplified\"];\n\t// spell-checker:disable\n\tconst language_names = {\n\t\t// \"639-1\": [[\"ISO language name\"], [\"Native name (endonym)\"]],\n\t\tab: [[\"Abkhazian\"], [\"Аҧсуа Бызшәа\", \"Аҧсшәа\"]],\n\t\taa: [[\"Afar\"], [\"Afaraf\"]],\n\t\taf: [[\"Afrikaans\"], [\"Afrikaans\"]],\n\t\tak: [[\"Akan\"], [\"Akan\"]],\n\t\tsq: [[\"Albanian\"], [\"Shqip\"]],\n\t\tam: [[\"Amharic\"], [\"አማርኛ\"]],\n\t\tar: [[\"Arabic\"], [\"العربية\"]],\n\t\tan: [[\"Aragonese\"], [\"Aragonés\"]],\n\t\thy: [[\"Armenian\"], [\"Հայերեն\"]],\n\t\tas: [[\"Assamese\"], [\"অসমীয়া\"]],\n\t\tav: [[\"Avaric\"], [\"Авар МацӀ\", \"МагӀарул МацӀ\"]],\n\t\tae: [[\"Avestan\"], [\"Avesta\"]],\n\t\tay: [[\"Aymara\"], [\"Aymar Aru\"]],\n\t\taz: [[\"Azerbaijani\"], [\"Azərbaycan Dili\"]],\n\t\tbm: [[\"Bambara\"], [\"Bamanankan\"]],\n\t\tba: [[\"Bashkir\"], [\"Башҡорт Теле\"]],\n\t\teu: [[\"Basque\"], [\"Euskara\", \"Euskera\"]],\n\t\tbe: [[\"Belarusian\"], [\"Беларуская Мова\"]],\n\t\tbn: [[\"Bengali\"], [\"বাংলা\"]],\n\t\tbh: [[\"Bihari Languages\"], [\"भोजपुरी\"]],\n\t\tbi: [[\"Bislama\"], [\"Bislama\"]],\n\t\tbs: [[\"Bosnian\"], [\"Bosanski Jezik\"]],\n\t\tbr: [[\"Breton\"], [\"Brezhoneg\"]],\n\t\tbg: [[\"Bulgarian\"], [\"Български Език\"]],\n\t\tmy: [[\"Burmese\"], [\"ဗမာစာ\"]],\n\t\tca: [[\"Catalan\", \"Valencian\"], [\"Català\", \"Valencià\"]],\n\t\tch: [[\"Chamorro\"], [\"Chamoru\"]],\n\t\tce: [[\"Chechen\"], [\"Нохчийн Мотт\"]],\n\t\tny: [[\"Chichewa\", \"Chewa\", \"Nyanja\"], [\"ChiCheŵa\", \"Chinyanja\"]],\n\t\t// zh: [[\"Chinese\"], [\"中文\", \"Zhōngwén\", \"汉语\", \"漢語\"]],\n\t\t// The ISO 639-1 code \"zh\" doesn't refer to Traditional Chinese specifically,\n\t\t// but we want to show the distinction between Chinese varieties in the Language menu,\n\t\t// so this is overly specific for now.\n\t\t// @TODO: do this cleaner by establishing a mapping between ISO codes (such as \"zh\") and default language IDs (such as \"zh-traditional\")\n\t\tzh: [[\"Traditional Chinese\"], [\"繁體中文\", \"傳統中文\", \"正體中文\", \"繁体中文\"]],\n\t\t\"zh-traditional\": [[\"Traditional Chinese\"], [\"繁體中文\", \"傳統中文\", \"正體中文\", \"繁体中文\"]], // made-up ID, not real ISO 639-1\n\t\t\"zh-simplified\": [[\"Simple Chinese\"], [\"简体中文\"]], // made-up ID, not real ISO 639-1\n\t\tcv: [[\"Chuvash\"], [\"Чӑваш Чӗлхи\"]],\n\t\tkw: [[\"Cornish\"], [\"Kernewek\"]],\n\t\tco: [[\"Corsican\"], [\"Corsu\", \"Lingua Corsa\"]],\n\t\tcr: [[\"Cree\"], [\"ᓀᐦᐃᔭᐍᐏᐣ\"]],\n\t\thr: [[\"Croatian\"], [\"Hrvatski Jezik\"]],\n\t\tcs: [[\"Czech\"], [\"Čeština\", \"Český Jazyk\"]],\n\t\tda: [[\"Danish\"], [\"Dansk\"]],\n\t\tdv: [[\"Divehi\", \"Dhivehi\", \"Maldivian\"], [\"ދިވެހި\"]],\n\t\tnl: [[\"Dutch\", \"Flemish\"], [\"Nederlands\", \"Vlaams\"]],\n\t\tdz: [[\"Dzongkha\"], [\"རྫོང་ཁ\"]],\n\t\ten: [[\"English\"], [\"English\"]],\n\t\teo: [[\"Esperanto\"], [\"Esperanto\"]],\n\t\tet: [[\"Estonian\"], [\"Eesti\", \"Eesti Keel\"]],\n\t\tee: [[\"Ewe\"], [\"Eʋegbe\"]],\n\t\tfo: [[\"Faroese\"], [\"Føroyskt\"]],\n\t\tfj: [[\"Fijian\"], [\"Vosa Vakaviti\"]],\n\t\tfi: [[\"Finnish\"], [\"Suomi\", \"Suomen Kieli\"]],\n\t\tfr: [[\"French\"], [\"Français\", \"Langue Française\"]],\n\t\tff: [[\"Fulah\"], [\"Fulfulde\", \"Pulaar\", \"Pular\"]],\n\t\tgl: [[\"Galician\"], [\"Galego\"]],\n\t\tka: [[\"Georgian\"], [\"ქართული\"]],\n\t\tde: [[\"German\"], [\"Deutsch\"]],\n\t\tel: [[\"Greek\"], [\"Ελληνικά\"]],\n\t\tgn: [[\"Guarani\"], [\"Avañe'ẽ\"]],\n\t\tgu: [[\"Gujarati\"], [\"ગુજરાતી\"]],\n\t\tht: [[\"Haitian\", \"Haitian Creole\"], [\"Kreyòl Ayisyen\"]],\n\t\tha: [[\"Hausa\"], [\"هَوُسَ\"]],\n\t\the: [[\"Hebrew\"], [\"עברית\"]],\n\t\thz: [[\"Herero\"], [\"Otjiherero\"]],\n\t\thi: [[\"Hindi\"], [\"हिन्दी\", \"हिंदी\"]],\n\t\tho: [[\"Hiri Motu\"], [\"Hiri Motu\"]],\n\t\thu: [[\"Hungarian\"], [\"Magyar\"]],\n\t\tia: [[\"Interlingua\"], [\"Interlingua\"]],\n\t\tid: [[\"Indonesian\"], [\"Bahasa Indonesia\"]],\n\t\tie: [[\"Interlingue\", \"Occidental\"], [\"Interlingue\", \"Occidental\"]],\n\t\tga: [[\"Irish\"], [\"Gaeilge\"]],\n\t\tig: [[\"Igbo\"], [\"Asụsụ Igbo\"]],\n\t\tik: [[\"Inupiaq\"], [\"Iñupiaq\", \"Iñupiatun\"]],\n\t\tio: [[\"Ido\"], [\"Ido\"]],\n\t\tis: [[\"Icelandic\"], [\"Íslenska\"]],\n\t\tit: [[\"Italian\"], [\"Italiano\"]],\n\t\tiu: [[\"Inuktitut\"], [\"ᐃᓄᒃᑎᑐᑦ\"]],\n\t\tja: [[\"Japanese\"], [\"日本語\", \"にほんご\"]],\n\t\tjv: [[\"Javanese\"], [\"ꦧꦱꦗꦮ\", \"Basa Jawa\"]],\n\t\tkl: [[\"Kalaallisut\", \"Greenlandic\"], [\"Kalaallisut\", \"Kalaallit Oqaasii\"]],\n\t\tkn: [[\"Kannada\"], [\"ಕನ್ನಡ\"]],\n\t\tkr: [[\"Kanuri\"], [\"Kanuri\"]],\n\t\tks: [[\"Kashmiri\"], [\"कश्मीरी\", \"كشميري‎\"]],\n\t\tkk: [[\"Kazakh\"], [\"Қазақ Тілі\"]],\n\t\tkm: [[\"Central Khmer\"], [\"ខ្មែរ\", \"ខេមរភាសា\", \"ភាសាខ្មែរ\"]],\n\t\tki: [[\"Kikuyu\", \"Gikuyu\"], [\"Gĩkũyũ\"]],\n\t\trw: [[\"Kinyarwanda\"], [\"Ikinyarwanda\"]],\n\t\tky: [[\"Kirghiz\", \"Kyrgyz\"], [\"Кыргызча\", \"Кыргыз Тили\"]],\n\t\tkv: [[\"Komi\"], [\"Коми Кыв\"]],\n\t\tkg: [[\"Kongo\"], [\"Kikongo\"]],\n\t\tko: [[\"Korean\"], [\"한국어\"]],\n\t\tku: [[\"Kurdish\"], [\"Kurdî\", \"کوردی‎\"]],\n\t\tkj: [[\"Kuanyama\", \"Kwanyama\"], [\"Kuanyama\"]],\n\t\tla: [[\"Latin\"], [\"Latine\", \"Lingua Latina\"]],\n\t\tlb: [[\"Luxembourgish\", \"Letzeburgesch\"], [\"Lëtzebuergesch\"]],\n\t\tlg: [[\"Ganda\"], [\"Luganda\"]],\n\t\tli: [[\"Limburgan\", \"Limburger\", \"Limburgish\"], [\"Limburgs\"]],\n\t\tln: [[\"Lingala\"], [\"Lingála\"]],\n\t\tlo: [[\"Lao\"], [\"ພາສາລາວ\"]],\n\t\tlt: [[\"Lithuanian\"], [\"Lietuvių Kalba\"]],\n\t\tlu: [[\"Luba-Katanga\"], [\"Kiluba\"]],\n\t\tlv: [[\"Latvian\"], [\"Latviešu Valoda\"]],\n\t\tgv: [[\"Manx\"], [\"Gaelg\", \"Gailck\"]],\n\t\tmk: [[\"Macedonian\"], [\"Македонски Јазик\"]],\n\t\tmg: [[\"Malagasy\"], [\"Fiteny Malagasy\"]],\n\t\tms: [[\"Malay\"], [\"Bahasa Melayu\", \"بهاس ملايو‎\"]],\n\t\tml: [[\"Malayalam\"], [\"മലയാളം\"]],\n\t\tmt: [[\"Maltese\"], [\"Malti\"]],\n\t\tmi: [[\"Maori\"], [\"Te Reo Māori\"]],\n\t\tmr: [[\"Marathi\"], [\"मराठी\"]],\n\t\tmh: [[\"Marshallese\"], [\"Kajin M̧ajeļ\"]],\n\t\tmn: [[\"Mongolian\"], [\"Монгол Хэл\"]],\n\t\tna: [[\"Nauru\"], [\"Dorerin Naoero\"]],\n\t\tnv: [[\"Navajo\", \"Navaho\"], [\"Diné Bizaad\"]],\n\t\tnd: [[\"North Ndebele\"], [\"IsiNdebele\"]],\n\t\tne: [[\"Nepali\"], [\"नेपाली\"]],\n\t\tng: [[\"Ndonga\"], [\"Owambo\"]],\n\t\tnb: [[\"Norwegian Bokmål\"], [\"Norsk Bokmål\"]],\n\t\tnn: [[\"Norwegian Nynorsk\"], [\"Norsk Nynorsk\"]],\n\t\tno: [[\"Norwegian\"], [\"Norsk\"]],\n\t\tii: [[\"Sichuan Yi\", \"Nuosu\"], [\"ꆈꌠ꒿\", \"Nuosuhxop\"]],\n\t\tnr: [[\"South Ndebele\"], [\"IsiNdebele\"]],\n\t\toc: [[\"Occitan\"], [\"Occitan\", \"Lenga d'Òc\"]],\n\t\toj: [[\"Ojibwa\"], [\"ᐊᓂᔑᓈᐯᒧᐎᓐ\"]],\n\t\tcu: [[\"Church Slavic\", \"Old Slavonic\", \"Church Slavonic\", \"Old Bulgarian\", \"Old Church Slavonic\"], [\"Ѩзыкъ Словѣньскъ\"]],\n\t\tom: [[\"Oromo\"], [\"Afaan Oromoo\"]],\n\t\tor: [[\"Oriya\"], [\"ଓଡ଼ିଆ\"]],\n\t\tos: [[\"Ossetian\", \"Ossetic\"], [\"Ирон Æвзаг\"]],\n\t\tpa: [[\"Punjabi\", \"Panjabi\"], [\"ਪੰਜਾਬੀ\", \"پنجابی‎\"]],\n\t\tpi: [[\"Pali\"], [\"पालि\", \"पाळि\"]],\n\t\tfa: [[\"Persian\"], [\"فارسی\"]],\n\t\tpl: [[\"Polish\"], [\"Język Polski\", \"Polszczyzna\"]],\n\t\tps: [[\"Pashto\", \"Pushto\"], [\"پښتو\"]],\n\t\tpt: [[\"Portuguese\"], [\"Português\"]],\n\t\t\"pt-br\": [[\"Brazilian Portuguese\"], [\"Português Brasileiro\"]],\n\t\t\"pt-pt\": [[\"Portuguese (Portugal)\"], [\"Português De Portugal\"]],\n\t\tqu: [[\"Quechua\"], [\"Runa Simi\", \"Kichwa\"]],\n\t\trm: [[\"Romansh\"], [\"Rumantsch Grischun\"]],\n\t\trn: [[\"Rundi\"], [\"Ikirundi\"]],\n\t\tro: [[\"Romanian\", \"Moldavian\", \"Moldovan\"], [\"Română\"]],\n\t\tru: [[\"Russian\"], [\"Русский\"]],\n\t\tsa: [[\"Sanskrit\"], [\"संस्कृतम्\"]],\n\t\tsc: [[\"Sardinian\"], [\"Sardu\"]],\n\t\tsd: [[\"Sindhi\"], [\"सिन्धी\", \"سنڌي، سندھی‎\"]],\n\t\tse: [[\"Northern Sami\"], [\"Davvisámegiella\"]],\n\t\tsm: [[\"Samoan\"], [\"Gagana Fa'a Samoa\"]],\n\t\tsg: [[\"Sango\"], [\"Yângâ Tî Sängö\"]],\n\t\tsr: [[\"Serbian\"], [\"Српски Језик\"]],\n\t\tgd: [[\"Gaelic\", \"Scottish Gaelic\"], [\"Gàidhlig\"]],\n\t\tsn: [[\"Shona\"], [\"ChiShona\"]],\n\t\tsi: [[\"Sinhala\", \"Sinhalese\"], [\"සිංහල\"]],\n\t\tsk: [[\"Slovak\"], [\"Slovenčina\", \"Slovenský Jazyk\"]],\n\t\tsl: [[\"Slovenian\"], [\"Slovenski Jezik\", \"Slovenščina\"]],\n\t\tso: [[\"Somali\"], [\"Soomaaliga\", \"Af Soomaali\"]],\n\t\tst: [[\"Southern Sotho\"], [\"Sesotho\"]],\n\t\tes: [[\"Spanish\", \"Castilian\"], [\"Español\"]],\n\t\tsu: [[\"Sundanese\"], [\"Basa Sunda\"]],\n\t\tsw: [[\"Swahili\"], [\"Kiswahili\"]],\n\t\tss: [[\"Swati\"], [\"SiSwati\"]],\n\t\tsv: [[\"Swedish\"], [\"Svenska\"]],\n\t\tta: [[\"Tamil\"], [\"தமிழ்\"]],\n\t\tte: [[\"Telugu\"], [\"తెలుగు\"]],\n\t\ttg: [[\"Tajik\"], [\"Тоҷикӣ\", \"Toçikī\", \"تاجیکی‎\"]],\n\t\tth: [[\"Thai\"], [\"ไทย\"]],\n\t\tti: [[\"Tigrinya\"], [\"ትግርኛ\"]],\n\t\tbo: [[\"Tibetan\"], [\"བོད་ཡིག\"]],\n\t\ttk: [[\"Turkmen\"], [\"Türkmen\", \"Түркмен\"]],\n\t\ttl: [[\"Tagalog\"], [\"Wikang Tagalog\"]],\n\t\ttn: [[\"Tswana\"], [\"Setswana\"]],\n\t\tto: [[\"Tonga\"], [\"Faka Tonga\"]],\n\t\ttr: [[\"Turkish\"], [\"Türkçe\"]],\n\t\tts: [[\"Tsonga\"], [\"Xitsonga\"]],\n\t\ttt: [[\"Tatar\"], [\"Татар Теле\", \"Tatar Tele\"]],\n\t\ttw: [[\"Twi\"], [\"Twi\"]],\n\t\tty: [[\"Tahitian\"], [\"Reo Tahiti\"]],\n\t\tug: [[\"Uighur\", \"Uyghur\"], [\"ئۇيغۇرچە‎\", \"Uyghurche\"]],\n\t\tuk: [[\"Ukrainian\"], [\"Українська\"]],\n\t\tur: [[\"Urdu\"], [\"اردو\"]],\n\t\tuz: [[\"Uzbek\"], [\"Oʻzbek\", \"Ўзбек\", \"أۇزبېك‎\"]],\n\t\tve: [[\"Venda\"], [\"Tshivenḓa\"]],\n\t\tvi: [[\"Vietnamese\"], [\"Tiếng Việt\"]],\n\t\tvo: [[\"Volapük\"], [\"Volapük\"]],\n\t\twa: [[\"Walloon\"], [\"Walon\"]],\n\t\tcy: [[\"Welsh\"], [\"Cymraeg\"]],\n\t\two: [[\"Wolof\"], [\"Wollof\"]],\n\t\tfy: [[\"Western Frisian\"], [\"Frysk\"]],\n\t\txh: [[\"Xhosa\"], [\"IsiXhosa\"]],\n\t\tyi: [[\"Yiddish\"], [\"ייִדיש\"]],\n\t\tyo: [[\"Yoruba\"], [\"Yorùbá\"]],\n\t\tza: [[\"Zhuang\", \"Chuang\"], [\"Saɯ Cueŋƅ\", \"Saw Cuengh\"]],\n\t\tzu: [[\"Zulu\"], [\"IsiZulu\"]],\n\t};\n\t// spell-checker:enable\n\n\tfunction get_iso_language_name(language) {\n\t\treturn language_names[language][0][0];\n\t}\n\tfunction get_language_endonym(language) {\n\t\treturn language_names[language][1][0];\n\t}\n\n\tlet current_language = base_language;\n\tfor (const accepted_language of accepted_languages) {\n\t\tif (available_languages.indexOf(accepted_language) !== -1) {\n\t\t\tcurrent_language = accepted_language;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tfunction get_language() {\n\t\treturn current_language;\n\t}\n\tfunction get_direction(language = current_language) {\n\t\treturn language.match(/^(ar|dv|fa|ha|he|ks|ku|ms|pa|ps|sd|ug|yi)\\b/i) ? \"rtl\" : \"ltr\";\n\t}\n\tfunction load_language(language) {\n\t\t// const prev_language = current_language;\n\n\t\tconst stylesheets = [...document.querySelectorAll(\".flippable-layout-stylesheet\")];\n\t\tfor (const stylesheet of stylesheets) {\n\t\t\tlet href = stylesheet.getAttribute(\"href\");\n\t\t\tif (get_direction(language) === \"rtl\") {\n\t\t\t\tif (href.indexOf(\".rtl.css\") === -1) {\n\t\t\t\t\thref = href.replace(/\\.css$/i, \".rtl.css\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (href.indexOf(\".rtl.css\") > -1) {\n\t\t\t\t\thref = href.replace(/\\.rtl\\.css$/i, \".css\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tstylesheet.setAttribute(\"href\", href);\n\t\t\t// hack to wait for stylesheet to load\n\t\t\tconst img = document.createElement(\"img\");\n\t\t\timg.onerror = () => {\n\t\t\t\t$(() => {\n\t\t\t\t\t$G.triggerHandler(\"theme-load\"); // signal layout change\n\t\t\t\t});\n\t\t\t};\n\t\t\timg.src = href;\n\t\t}\n\n\t\tif (language === base_language) {\n\t\t\tlocalizations = {};\n\t\t\tcurrent_language = base_language;\n\t\t\treturn;\n\t\t}\n\t\t// fetch(`localization/${language}/localizations.json`)\n\t\t// .then((response)=> response.json())\n\t\t// .then((new_localizations)=> {\n\t\t// \tlocalizations = new_localizations;\n\t\t// \tcurrent_language = language;\n\t\t// }).catch((error)=> {\n\t\t// \tshow_error_message(`Failed to load localizations for ${language_names[language]}.`, error);\n\t\t// \tcurrent_language = prev_language;\n\t\t// });\n\t\tconst src = `localization/${language}/localizations.js`;\n\t\tdocument.write(`<script src=\"${src}\"></${\"\"/*(avoiding ending script tag if inlined in HTML)*/}script>`);\n\t}\n\t// JSONP callback in the localization files\n\twindow.loaded_localizations = function loaded_localizations(language, mapping) {\n\t\tlocalizations = mapping;\n\t\tcurrent_language = language;\n\t};\n\tfunction set_language(language) {\n\t\tshowMessageBox({\n\t\t\ttitle: \"Reload Required\",\n\t\t\tmessage: \"The application needs to reload to change the language.\",\n\t\t\tbuttons: [\n\t\t\t\t{ label: localize(\"OK\"), value: \"reload\", default: true },\n\t\t\t\t{ label: localize(\"Cancel\"), value: \"cancel\" },\n\t\t\t],\n\t\t\twindowOptions: {\n\t\t\t\tinnerWidth: 450,\n\t\t\t},\n\t\t}).then((result) => {\n\t\t\tif (result === \"reload\") {\n\t\t\t\tare_you_sure(() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlocalStorage[language_storage_key] = language;\n\t\t\t\t\t\texit_fullscreen_if_ios();\n\t\t\t\t\t\tlocation.reload();\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tshow_error_message(\"Failed to store language preference. Make sure cookies / local storage is enabled in your browser settings.\", error);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\tload_language(current_language);\n\n\texports.localize = localize;\n\texports.set_language = set_language;\n\texports.get_language = get_language;\n\texports.get_iso_language_name = get_iso_language_name;\n\texports.get_language_endonym = get_language_endonym;\n\texports.get_language_emoji = get_language_emoji;\n\texports.get_direction = get_direction;\n\texports.available_languages = available_languages;\n\n})(window);\n"
  },
  {
    "path": "src/app-state.js",
    "content": "// @ts-check\n/* exported $thumbnail_window, airbrush_size, aliasing, brush_shape, brush_size, button, ctrl, current_history_node, enable_fs_access_api, enable_palette_loading_from_indexed_images, eraser_size, file_format, file_name, fill_color, helper_layer, history_node_to_cancel_to, magnification, main_ctx, monochrome, monochrome_palette, my_canvas_height, my_canvas_width, palette, pencil_size, pick_color_slot, pointer, pointer_active, pointer_buttons, pointer_over_canvas, pointer_previous, pointer_start, pointer_type, pointers, polychrome_palette, redos, return_to_magnification, return_to_tools, reverse, root_history_node, saved, selected_colors, selected_tool, selected_tools, selection, shift, show_grid, show_thumbnail, stroke_color, stroke_size, system_file_handle, text_tool_font, textbox, thumbnail_canvas, tool_transparent_mode, transparency, undos, update_helper_layer_on_pointermove_active */\n\n// Can't import things until this file is a module...\n// (Well, could use dynamic imports, but that's async and thus probably as complicated as getting it to work with all ESM.)\n// import { default_palette } from \"./color-data.js\";\n// import { get_tool_by_id, make_monochrome_palette, make_history_node } from \"./functions.js\";\n// import { make_canvas } from \"./helpers.js\";\n// import { TOOL_PENCIL } from \"./tools.js\";\n\n// Causes TypeScript errors\n// const { get_tool_by_id, make_monochrome_palette, make_history_node, default_palette, make_canvas, TOOL_PENCIL } = window;\n\nconst default_magnification = 1;\n\n/** @type {Tool} */\nconst default_tool = window.get_tool_by_id(window.TOOL_PENCIL);\n\nconst default_canvas_width = 683;\nconst default_canvas_height = 384;\nlet my_canvas_width = default_canvas_width;\nlet my_canvas_height = default_canvas_height;\n\nlet aliasing = true;\nlet transparency = false;\nlet monochrome = false;\n\nlet magnification = default_magnification;\nlet return_to_magnification = 4;\n\n/** @type {PixelCanvas} */\nconst main_canvas = window.make_canvas();\nmain_canvas.classList.add(\"main-canvas\");\n/** @type {PixelContext} */\nconst main_ctx = main_canvas.ctx;\n\n/** @type {(string | CanvasPattern)[]} */\nlet palette = window.default_palette;\n/** @type {(string | CanvasPattern)[]} */\nlet polychrome_palette = palette;\n/** @type {(string | CanvasPattern)[]} */\nlet monochrome_palette = window.make_monochrome_palette();\n\n// This feature is not ready yet.\n// It needs to let the user decide when to switch the palette or not, when saving/opening an image.\n// (maybe there could be a palette undo button? feels weird. MS Paint would probably use a dialog.)\n// And it needs to handle canvas farbling, where pixel values are slightly different from each other,\n// and equivalize them, when saving to a file. And maybe at other times.\n// There are a lot of places in this app where I have to handle canvas farbling. It's obnoxious.\nlet enable_palette_loading_from_indexed_images = false;\n\n// The File System Access API doesn't provide a way to get the file type selected by the user,\n// or to automatically append a file extension to the file name.\n// I'm not sure it's worth it to be able to save over an existing file.\n// I also like the downloads bar UI to be honest.\n// So this might need to be optional, but right now I'm disabling it as it's not ready.\n// There are cases where 0-byte files are created, which is either a serious problem,\n// it's just from canceling saving when the file name has a problem, and it needs to be cleaned up.\n// Also, while I've implemented most of the UI, it'd be nice to release this with recent files support.\nlet enable_fs_access_api = false;\n\n/** @type {BrushShape} */\nconst default_brush_shape = \"circle\";\nconst default_brush_size = 4;\nconst default_eraser_size = 8;\nconst default_airbrush_size = 9;\nconst default_pencil_size = 1;\nconst default_stroke_size = 1; // applies to lines, curves, shape outlines\n\n/** @type {BrushShape} */\nlet brush_shape = default_brush_shape;\nlet brush_size = default_brush_size;\nlet eraser_size = default_eraser_size;\nlet airbrush_size = default_airbrush_size;\nlet pencil_size = default_pencil_size;\nlet stroke_size = default_stroke_size; // applies to lines, curves, shape outlines\n\n/** @type {boolean} */\nlet tool_transparent_mode = false;\n\n/** @type {string | CanvasPattern} */\nlet stroke_color;\n/** @type {string | CanvasPattern} */\nlet fill_color;\n/** @type {ColorSelectionSlot} */\nlet pick_color_slot = \"background\";\n\n/** @type {Tool} */\nlet selected_tool = default_tool;\n/** @type {Tool[]} */\nlet selected_tools = [selected_tool];\n/** @type {Tool[]} */\nlet return_to_tools = [selected_tool];\n\n/** @type {{foreground: string | CanvasPattern, background: string | CanvasPattern, ternary: string | CanvasPattern}} */\nlet selected_colors = {\n\tforeground: \"\",\n\tbackground: \"\",\n\tternary: \"\",\n};\n\n/** @type {OnCanvasSelection} */\nlet selection; // singleton\n/** @type {OnCanvasTextBox} */\nlet textbox; // singleton\n/** @type {OnCanvasHelperLayer} */\nlet helper_layer; // instance used for the grid and tool previews (not a singleton)\n/** @type {OSGUI$Window} */\nlet $thumbnail_window;\n/** @type {PixelCanvas} */\nlet thumbnail_canvas;\n/** @type {boolean} */\nlet show_grid = false;\n/** @type {boolean} */\nlet show_thumbnail = false;\n/** @type {TextToolFontOptions} */\nlet text_tool_font = {\n\tfamily: '\"Arial\"', // should be an exact value detected by Font Detective\n\tsize: 12,\n\tline_scale: 20 / 12,\n\tbold: false,\n\titalic: false,\n\tunderline: false,\n\tvertical: false,\n\tcolor: \"\",\n\tbackground: \"\",\n};\n\n/** @type {HistoryNode} */\nlet root_history_node = window.make_history_node({ name: \"App Not Loaded Properly - Please send a bug report.\" }); // will be replaced\n/** @type {HistoryNode} */\nlet current_history_node = root_history_node;\n/** @type {HistoryNode | null} */\nlet history_node_to_cancel_to = null;\n/** @type {HistoryNode[]} */\nlet undos = [];\n/** @type {HistoryNode[]} */\nlet redos = [];\n\n/** @type {string | undefined} */\nlet file_name;\n/** @type {string | undefined} */\nlet file_format;\n/**\n * For saving over opened file on Save. Can be different type for File System Access API vs Electron.\n * @type {UserFileHandle}\n */\nlet system_file_handle;\n/** @type {boolean} */\nlet saved = true;\n\n/** works in canvas coordinates @type {{x: number, y: number} | undefined} */\nlet pointer;\n/** works in canvas coordinates @type {{x: number, y: number} | undefined} */\nlet pointer_start;\n/** works in canvas coordinates @type {{x: number, y: number} | undefined} */\nlet pointer_previous;\n\n/** @type {boolean} */\nlet pointer_active = false;\n/** @type {string | undefined} */\nlet pointer_type;\n/** @type {number} */\nlet pointer_buttons;\n/** @type {boolean} */\nlet reverse;\n/** @type {boolean} */\nlet ctrl;\n/** @type {boolean} */\nlet shift;\n/** @type {number | undefined} */\nlet button;\n/** @type {boolean} */\nlet pointer_over_canvas = false;\n/** @type {boolean} */\nlet update_helper_layer_on_pointermove_active = false;\n\n/**\n * works in client coordinates, NOT canvas coordinates\n * @type {{ x: number, y: number, pointerId: number, pointerType: string, isPrimary: boolean }[]}\n */\nlet pointers = [];\n"
  },
  {
    "path": "src/app.js",
    "content": "// @ts-check\n// eslint-disable-next-line no-unused-vars\n/* global airbrush_size:writable, brush_shape:writable, brush_size:writable, button:writable, ctrl:writable, eraser_size:writable, fill_color:writable, pick_color_slot:writable, history_node_to_cancel_to:writable, MenuBar:writable, my_canvas_height:writable, my_canvas_width:writable, palette:writable, pencil_size:writable, pointer:writable, pointer_active:writable, pointer_buttons:writable, pointer_over_canvas:writable, pointer_previous:writable, pointer_start:writable, pointer_type:writable, pointers:writable, reverse:writable, shift:writable, stroke_color:writable, stroke_size:writable, update_helper_layer_on_pointermove_active:writable */\n/* global AccessKeys, current_history_node, default_airbrush_size, default_brush_shape, default_brush_size, default_canvas_height, default_canvas_width, default_eraser_size, default_magnification, default_pencil_size, default_stroke_size, enable_fs_access_api, file_name, get_direction, localize, magnification, main_canvas, main_ctx, return_to_tools, selected_colors, selected_tool, selected_tools, selection, systemHooks, textbox, transparency */\n\nimport { $ColorBox } from \"./$ColorBox.js\";\nimport { $ToolBox } from \"./$ToolBox.js\";\nimport { Handles } from \"./Handles.js\";\n// import { get_direction, localize } from \"./app-localization.js\";\nimport { default_palette, get_winter_palette } from \"./color-data.js\";\nimport { image_formats } from \"./file-format-data.js\";\nimport { $this_version_news, cancel, change_some_url_params, change_url_param, clear, confirm_overwrite_capability, delete_selection, deselect, edit_copy, edit_cut, edit_paste, file_new, file_open, file_save, file_save_as, get_tool_by_id, get_uris, image_attributes, image_flip_and_rotate, image_invert_colors, image_stretch_and_skew, load_image_from_uri, make_or_update_undoable, open_from_file, paste, paste_image_from_file, redo, render_history_as_gif, reset_canvas_and_history, reset_file, reset_selected_colors, resize_canvas_and_save_dimensions, resize_canvas_without_saving_dimensions, save_as_prompt, select_all, select_tool, select_tools, set_magnification, show_document_history, show_error_message, show_news, show_resource_load_error_message, toggle_grid, undo, update_canvas_rect, update_disable_aa, update_helper_layer, update_magnified_canvas_size, view_bitmap, write_image_file } from \"./functions.js\";\nimport { show_help } from \"./help.js\";\nimport { $G, E, TAU, get_file_extension, get_help_folder_icon, is_discord_embed, make_canvas, to_canvas_coords } from \"./helpers.js\";\nimport { init_webgl_stuff, rotate } from \"./image-manipulation.js\";\nimport { menus } from \"./menus.js\";\nimport { showMessageBox } from \"./msgbox.js\";\nimport { stopSimulatingGestures } from \"./simulate-random-gestures.js\";\nimport { disable_speech_recognition, enable_speech_recognition, trace_and_sketch_stop } from \"./speech-recognition.js\";\nimport { localStore } from \"./storage.js\";\nimport { get_theme, set_theme } from \"./theme.js\";\nimport { TOOL_AIRBRUSH, TOOL_BRUSH, TOOL_CURVE, TOOL_ELLIPSE, TOOL_ERASER, TOOL_LINE, TOOL_PENCIL, TOOL_POLYGON, TOOL_RECTANGLE, TOOL_ROUNDED_RECTANGLE, TOOL_SELECT, tools } from \"./tools.js\";\n\n// #region Exports\n\n// Q: Why are the exports at the top of the file?\n// A: The exports are scattered throughout the file, exactly where they\n//    were implicitly being exported before transitioning to ESM.\n//    For function declarations at the top level, this means the start of the file.\n//    For let/const, this means the line after the declaration.\n//    This is a temporary solution to resolve circular dependencies.\n//    For instance, $ToolBox uses $left/$right. If $left/$right were exported\n//    at the bottom of this file, an error would occur. This is because $ToolBox\n//    is instantiated in the middle of this file (but after $left/$right are declared).\n// @TODO: Minimize global variables and exports from app.js\nwindow.update_fill_and_stroke_colors_and_lineWidth = update_fill_and_stroke_colors_and_lineWidth;\nwindow.tool_go = tool_go;\n\n// #endregion\n\n\n// #region System Hooks and default implementations\n\n/**\n * @param {string} extension\n * @returns {`.${string}`}\n */\nconst prependDot = (extension) => `.${extension}`;\n/**\n * @param {FileFormat} format\n * @returns {string}\n */\nconst getMimeType = (format) => \"mimeType\" in format ? format.mimeType : `application/x-${format.formatID}`;\n\n// Note: JSDoc type annotations don't seem to actually work on window.*\n/**\n * @type {SystemHooks}\n * The methods in systemHooks can be overridden by a containing page like 98.js.org which hosts jspaint in a same-origin iframe.\n * This allows integrations like setting the wallpaper as the background of the host page, or saving files to a server.\n * This API may be removed at any time (and perhaps replaced by something based around postMessage)\n * The API is documented in the README.md file.\n */\nwindow.systemHooks = window.systemHooks || {};\n/** @type {SystemHooks} */\nwindow.systemHookDefaults = {\n\t// named to be distinct from various platform APIs (showSaveFilePicker, saveAs, electron's showSaveDialog; and saveFile is too ambiguous)\n\t// could call it saveFileAs maybe but then it'd be weird that you don't pass in the file directly\n\tshowSaveFileDialog: async ({ formats, defaultFileName, defaultPath, defaultFileFormatID, getBlob, savedCallbackUnreliable, dialogTitle }) => {\n\n\t\t// Note: showSaveFilePicker currently doesn't support suggesting a filename,\n\t\t// or retrieving which file type was selected in the dialog (you have to get it (guess it) from the file name)\n\t\t// In particular, some formats are ambiguous with the file name, e.g. different bit depths of BMP files.\n\t\t// So, it's a tradeoff with the benefit of overwriting on Save.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/API/Window/showSaveFilePicker\n\t\t// Also, if you're using accessibility options Speech Recognition or Dwell Clicker,\n\t\t// `showSaveFilePicker` fails based on a notion of it not being a \"user gesture\".\n\t\t// `saveAs` will likely also fail on the same basis,\n\t\t// but at least in chrome, there's a \"Downloads Blocked\" icon with a popup where you can say Always Allow.\n\t\t// I can't detect when it's allowed or blocked, but `saveAs` has a better chance of working,\n\t\t// so for Speech Recognition and Dwell Clicker, I set a global flag temporarily to disable File System Access API (window.untrusted_gesture).\n\t\tif (window.showSaveFilePicker && !window.untrusted_gesture && enable_fs_access_api) {\n\t\t\t// We can't get the selected file type, not even from newHandle.getFile()\n\t\t\t// so limit formats shown to a set that can all be used by their unique file extensions\n\t\t\t// formats = formats_unique_per_file_extension(formats);\n\t\t\t// OR, show two dialogs, one for the format and then one for the save location.\n\t\t\tconst { newFileFormatID } = await save_as_prompt({ dialogTitle, defaultFileName, defaultFileFormatID, formats, promptForName: false });\n\t\t\tconst new_format = formats.find((format) => format.formatID === newFileFormatID);\n\t\t\tconst blob = await getBlob(new_format && new_format.formatID);\n\t\t\tformats = [new_format];\n\t\t\tlet newHandle;\n\t\t\tlet newFileName;\n\t\t\ttry {\n\t\t\t\tnewHandle = await showSaveFilePicker({\n\t\t\t\t\ttypes: formats.map((format) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tdescription: format.name,\n\t\t\t\t\t\t\taccept: {\n\t\t\t\t\t\t\t\t[getMimeType(format)]: format.extensions.map(prependDot),\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\tnewFileName = newHandle.name;\n\t\t\t\tconst newFileExtension = get_file_extension(newFileName);\n\t\t\t\tconst doItAgain = async (message) => {\n\t\t\t\t\tconst button_value = await showMessageBox({\n\t\t\t\t\t\tmessage: `${message}\\n\\nTry adding .${new_format.extensions[0]} to the name. Sorry about this.`,\n\t\t\t\t\t\ticonID: \"error\",\n\t\t\t\t\t\tbuttons: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: localize(\"Save As\"), // or \"Retry\"\n\t\t\t\t\t\t\t\tvalue: \"show-save-as-dialog-again\",\n\t\t\t\t\t\t\t\tdefault: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: localize(\"Save\"), // or \"Ignore\"\n\t\t\t\t\t\t\t\tvalue: \"save-without-extension\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: localize(\"Cancel\"), // or \"Abort\"\n\t\t\t\t\t\t\t\tvalue: \"cancel\",\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\tif (button_value === \"show-save-as-dialog-again\") {\n\t\t\t\t\t\treturn window.systemHookDefaults.showSaveFileDialog({\n\t\t\t\t\t\t\tformats,\n\t\t\t\t\t\t\tdefaultFileName,\n\t\t\t\t\t\t\tdefaultPath,\n\t\t\t\t\t\t\tdefaultFileFormatID,\n\t\t\t\t\t\t\tgetBlob,\n\t\t\t\t\t\t\tsavedCallbackUnreliable,\n\t\t\t\t\t\t\tdialogTitle,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (button_value === \"save-without-extension\") {\n\t\t\t\t\t\t// @TODO: DRY\n\t\t\t\t\t\tconst writableStream = await newHandle.createWritable();\n\t\t\t\t\t\tawait writableStream.write(blob);\n\t\t\t\t\t\tawait writableStream.close();\n\t\t\t\t\t\tsavedCallbackUnreliable?.({\n\t\t\t\t\t\t\tnewFileName: newFileName,\n\t\t\t\t\t\t\tnewFileFormatID: new_format && new_format.formatID,\n\t\t\t\t\t\t\tnewFileHandle: newHandle,\n\t\t\t\t\t\t\tnewBlob: blob,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// user canceled save\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tif (!newFileExtension) {\n\t\t\t\t\t// return await doItAgain(`Missing file extension.`);\n\t\t\t\t\treturn await doItAgain(`'${newFileName}' doesn't have an extension.`);\n\t\t\t\t}\n\t\t\t\tif (!new_format.extensions.includes(newFileExtension)) {\n\t\t\t\t\t// Closest translation: \"Paint cannot save to the same filename with a different file type.\"\n\t\t\t\t\t// return await doItAgain(`Wrong file extension for selected file type.`);\n\t\t\t\t\treturn await doItAgain(`File extension '.${newFileExtension}' does not match the selected file type ${new_format.name}.`);\n\t\t\t\t}\n\t\t\t\t// const new_format =\n\t\t\t\t// \tget_format_from_extension(formats, newHandle.name) ||\n\t\t\t\t// \tformats.find((format)=> format.formatID === defaultFileFormatID);\n\t\t\t\t// const blob = await getBlob(new_format && new_format.formatID);\n\t\t\t\tconst writableStream = await newHandle.createWritable();\n\t\t\t\tawait writableStream.write(blob);\n\t\t\t\tawait writableStream.close();\n\t\t\t} catch (error) {\n\t\t\t\tif (error.name === \"AbortError\") {\n\t\t\t\t\t// user canceled save\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// console.warn(\"Error during showSaveFileDialog (for showSaveFilePicker; now falling back to saveAs)\", error);\n\t\t\t\t// newFileName = (newFileName || file_name || localize(\"untitled\"))\n\t\t\t\t// \t.replace(/\\.(bmp|dib|a?png|gif|jpe?g|jpe|jfif|tiff?|webp|raw)$/i, \"\") +\n\t\t\t\t// \t\".\" + new_format.extensions[0];\n\t\t\t\t// saveAs(blob, newFileName);\n\t\t\t\tif (error.message.match(/gesture|activation/)) {\n\t\t\t\t\t// show_error_message(\"Your browser blocked the file from being saved, because you didn't use the mouse or keyboard directly to save. Try looking for a Downloads Blocked icon and say Always Allow, or save again with the keyboard or mouse.\", error);\n\t\t\t\t\tshow_error_message(\"Sorry, due to browser security measures, you must use the keyboard or mouse directly to save.\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tshow_error_message(localize(\"Failed to save document.\"), error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsavedCallbackUnreliable?.({\n\t\t\t\tnewFileName: newFileName,\n\t\t\t\tnewFileFormatID: new_format && new_format.formatID,\n\t\t\t\tnewFileHandle: newHandle,\n\t\t\t\tnewBlob: blob,\n\t\t\t});\n\t\t} else {\n\n\t\t\tconst { newFileName, newFileFormatID } = await save_as_prompt({ dialogTitle, defaultFileName, defaultFileFormatID, formats });\n\t\t\tconst blob = await getBlob(newFileFormatID);\n\t\t\tsaveAs(blob, newFileName);\n\t\t\tsavedCallbackUnreliable?.({\n\t\t\t\tnewFileName,\n\t\t\t\tnewFileFormatID,\n\t\t\t\tnewFileHandle: null,\n\t\t\t\tnewBlob: blob,\n\t\t\t});\n\t\t}\n\t},\n\tshowOpenFileDialog: async ({ formats }) => {\n\t\tif (window.untrusted_gesture) {\n\t\t\t// We can't show a file picker RELIABLY.\n\t\t\t// FIXME: double error message\n\t\t\tshow_error_message(\"Sorry, a file picker cannot be shown when using Speech Recognition or Dwell Clicker. You must click File > Open directly with the mouse, or press Ctrl+O on the keyboard.\");\n\t\t\tthrow new Error(\"can't show file picker reliably\");\n\t\t}\n\t\tif (window.showOpenFilePicker && enable_fs_access_api) {\n\t\t\tconst [fileHandle] = await window.showOpenFilePicker({\n\t\t\t\ttypes: formats.map((format) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdescription: format.name,\n\t\t\t\t\t\taccept: {\n\t\t\t\t\t\t\t[getMimeType(format)]: format.extensions.map(prependDot),\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t});\n\t\t\tconst file = await fileHandle.getFile();\n\t\t\treturn { file, fileHandle };\n\t\t} else {\n\t\t\t// @TODO: specify mime types?\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tconst $input = /** @type {JQuery<HTMLInputElement>} */($(\"<input type='file'>\")\n\t\t\t\t\t.on(\"change\", () => {\n\t\t\t\t\t\tresolve({ file: $input[0].files[0] });\n\t\t\t\t\t\t$input.remove();\n\t\t\t\t\t})\n\t\t\t\t\t.appendTo($app)\n\t\t\t\t\t.hide()\n\t\t\t\t\t.trigger(\"click\")\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\twriteBlobToHandle: async (save_file_handle, blob) => {\n\t\tif (save_file_handle && save_file_handle.createWritable && enable_fs_access_api) {\n\t\t\tconst acknowledged = await confirm_overwrite_capability();\n\t\t\tif (!acknowledged) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst writableStream = await save_file_handle.createWritable();\n\t\t\t\tawait writableStream.write(blob);\n\t\t\t\tawait writableStream.close();\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tif (error.name === \"AbortError\") {\n\t\t\t\t\t// user canceled save (this might not be a real error code that can occur here)\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (error.name === \"NotAllowedError\") {\n\t\t\t\t\t// use didn't give permission to save\n\t\t\t\t\t// is this too much of a warning?\n\t\t\t\t\tshow_error_message(localize(\"Save was interrupted, so your file has not been saved.\"), error);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (error.name === \"SecurityError\") {\n\t\t\t\t\t// not in a user gesture (\"User activation is required to request permissions.\")\n\t\t\t\t\tsaveAs(blob, file_name);\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tsaveAs(blob, file_name);\n\t\t\t// hopefully if the page reloads/closes the save dialog/download will persist and succeed?\n\t\t\treturn undefined;\n\t\t}\n\t},\n\treadBlobFromHandle: async (file_handle) => {\n\t\tif (file_handle && file_handle.getFile) {\n\t\t\tconst file = await file_handle.getFile();\n\t\t\treturn file;\n\t\t} else {\n\t\t\tthrow new Error(`Unknown file handle (${file_handle})`);\n\t\t\t// show_error_message(`${localize(\"Failed to open document.\")}\\n${localize(\"An unsupported operation was attempted.\")}`, error);\n\t\t}\n\t},\n\tsetWallpaperTiled: (canvas) => {\n\t\tconst wallpaperCanvas = make_canvas(screen.width, screen.height);\n\t\tconst pattern = wallpaperCanvas.ctx.createPattern(canvas, \"repeat\");\n\t\twallpaperCanvas.ctx.fillStyle = pattern;\n\t\twallpaperCanvas.ctx.fillRect(0, 0, wallpaperCanvas.width, wallpaperCanvas.height);\n\n\t\tsystemHooks.setWallpaperCentered(wallpaperCanvas);\n\t},\n\tsetWallpaperCentered: (canvas) => {\n\t\tsystemHooks.showSaveFileDialog({\n\t\t\tdialogTitle: localize(\"Save As\"),\n\t\t\tdefaultFileName: `${file_name.replace(/\\.(bmp|dib|a?png|gif|jpe?g|jpe|jfif|tiff?|webp|raw)$/i, \"\")} wallpaper.png`,\n\t\t\tdefaultFileFormatID: \"image/png\",\n\t\t\tformats: image_formats,\n\t\t\tgetBlob: (new_file_type) => {\n\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\twrite_image_file(canvas, new_file_type, (blob) => {\n\t\t\t\t\t\tresolve(blob);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t},\n};\n\nfor (const [key, defaultValue] of Object.entries(window.systemHookDefaults)) {\n\twindow.systemHooks[key] = window.systemHooks[key] || defaultValue;\n}\n\n// #endregion\n\n// #region URL Params\nconst update_from_url_params = () => {\n\t// Dwell Clicker\n\t// (Head Tracker implies Dwell Clicker for now, but could be made independent if Tracky Mouse supports other modes in the future.)\n\tif (location.hash.match(/dwell-clicker|head-tracker/i)) {\n\t\tif (!$(\"body\").hasClass(\"dwell-clicker-mode\")) {\n\t\t\t$(\"body\").addClass(\"dwell-clicker-mode\");\n\t\t\t$G.triggerHandler(\"dwell-clicker-toggled\");\n\t\t}\n\t} else {\n\t\tif ($(\"body\").hasClass(\"dwell-clicker-mode\")) {\n\t\t\t$(\"body\").removeClass(\"dwell-clicker-mode\");\n\t\t\t$G.triggerHandler(\"dwell-clicker-toggled\");\n\t\t}\n\t}\n\n\t// Enlarge UI\n\tif (location.hash.match(/enlarge-ui/i)) {\n\t\tif (!$(\"body\").hasClass(\"enlarge-ui\")) {\n\t\t\t$(\"body\").addClass(\"enlarge-ui\");\n\t\t\t$G.triggerHandler(\"enlarge-ui-toggled\");\n\t\t\t$G.triggerHandler(\"theme-load\"); // signal layout change\n\t\t}\n\t} else {\n\t\tif ($(\"body\").hasClass(\"enlarge-ui\")) {\n\t\t\t$(\"body\").removeClass(\"enlarge-ui\");\n\t\t\t$G.triggerHandler(\"enlarge-ui-toggled\");\n\t\t\t$G.triggerHandler(\"theme-load\"); // signal layout change\n\t\t}\n\t}\n\n\t// Vertical Color Box Mode\n\tif (location.hash.match(/vertical-color-box-mode/i)) {\n\t\tif (!$(\"body\").hasClass(\"vertical-color-box-mode\")) {\n\t\t\t$(\"body\").addClass(\"vertical-color-box-mode\");\n\t\t\t$G.triggerHandler(\"vertical-color-box-mode-toggled\");\n\t\t\t$G.triggerHandler(\"theme-load\"); // signal layout change\n\t\t}\n\t} else {\n\t\tif ($(\"body\").hasClass(\"vertical-color-box-mode\")) {\n\t\t\t$(\"body\").removeClass(\"vertical-color-box-mode\");\n\t\t\t$G.triggerHandler(\"vertical-color-box-mode-toggled\");\n\t\t\t$G.triggerHandler(\"theme-load\"); // signal layout change\n\t\t}\n\t}\n\n\t// Quick Undo Button\n\tif (location.hash.match(/easy-undo/i)) {\n\t\tif (!$(\"body\").hasClass(\"easy-undo-mode\")) {\n\t\t\t$(\"body\").addClass(\"easy-undo-mode\");\n\t\t\t$G.triggerHandler(\"easy-undo-mode-toggled\");\n\t\t\t$G.triggerHandler(\"theme-load\"); // signal layout change (just copying pattern thoughtlessly)\n\t\t}\n\t} else {\n\t\tif ($(\"body\").hasClass(\"easy-undo-mode\")) {\n\t\t\t$(\"body\").removeClass(\"easy-undo-mode\");\n\t\t\t$G.triggerHandler(\"easy-undo-mode-toggled\");\n\t\t\t$G.triggerHandler(\"theme-load\"); // signal layout change (just copying pattern thoughtlessly)\n\t\t}\n\t}\n\n\t// Head Tracker Mode\n\tif (location.hash.match(/head-tracker/i)) {\n\t\tif (!$(\"body\").hasClass(\"head-tracker-mode\")) {\n\t\t\t$(\"body\").addClass(\"head-tracker-mode\");\n\t\t\t$G.triggerHandler(\"head-tracker-toggled\");\n\t\t}\n\t} else {\n\t\tif ($(\"body\").hasClass(\"head-tracker-mode\")) {\n\t\t\t$(\"body\").removeClass(\"head-tracker-mode\");\n\t\t\t$G.triggerHandler(\"head-tracker-toggled\");\n\t\t}\n\t}\n\n\t// Speech Recognition Mode\n\tif (location.hash.match(/speech-recognition-mode/i)) {\n\t\tenable_speech_recognition();\n\t} else {\n\t\tdisable_speech_recognition();\n\t}\n\n\t// Developer helpers to compare with reference screenshots of MS Paint\n\t// (Seems like the color box is getting (un)shifted when this is enabled, making it line up less than it should?\n\t// like the code \"// Nudge the Colors component over a tiny bit\" is applying and then being reset.)\n\t$(\"body\").toggleClass(\"compare-reference\", !!location.hash.match(/compare-reference/i));\n\t$(\"body\").toggleClass(\"compare-reference-tool-windows\", !!location.hash.match(/compare-reference-tool-windows/i));\n\tsetTimeout(() => {\n\t\tif (location.hash.match(/compare-reference/i)) { // including compare-reference-tool-windows\n\t\t\tselect_tool(get_tool_by_id(TOOL_SELECT));\n\t\t\tconst test_canvas_width = 576;\n\t\t\tconst test_canvas_height = 432;\n\t\t\tif (main_canvas.width !== test_canvas_width || main_canvas.height !== test_canvas_height) {\n\t\t\t\t// Unfortunately, right now this can cause a reverse \"Save changes?\" dialog,\n\t\t\t\t// where Discard will restore your drawing, Cancel will discard it, and Save will save a blank canvas,\n\t\t\t\t// because the load from storage happens after this resize.\n\t\t\t\t// But this is just a helper for development, so it's not a big deal.\n\t\t\t\t// are_you_sure here doesn't help, either.\n\t\t\t\t// are_you_sure(() => {\n\t\t\t\tresize_canvas_without_saving_dimensions(test_canvas_width, test_canvas_height);\n\t\t\t\t// });\n\t\t\t}\n\t\t\tif (!location.hash.match(/compare-reference-tool-windows/i)) {\n\t\t\t\t$toolbox.dock($left);\n\t\t\t\t$colorbox.dock($bottom);\n\t\t\t\twindow.debugKeepMenusOpen = false;\n\t\t\t}\n\t\t}\n\t\tif (location.hash.match(/compare-reference-tool-windows/i)) {\n\t\t\t$toolbox.undock_to(84, 35);\n\t\t\t$colorbox.undock_to(239, 195);\n\t\t\twindow.debugKeepMenusOpen = true;\n\t\t\t// $(\".help-menu-button\").click(); // have to trigger pointerdown/up, it doesn't respond to click\n\t\t\t// $(\".help-menu-button\").trigger(\"pointerdown\").trigger(\"pointerup\"); // and it doesn't use jQuery\n\t\t\t$(\".help-menu-button\")[0].dispatchEvent(new Event(\"pointerdown\"));\n\t\t\t$(\".help-menu-button\")[0].dispatchEvent(new Event(\"pointerup\"));\n\t\t\t$(\"[aria-label='About Paint']\")[0].dispatchEvent(new Event(\"pointerenter\"));\n\t\t}\n\t}, 500);\n\n\t// dev helper to open Project News window to preview news write-up\n\t// I'm naming this \"force-open-project-news\" and not simply \"project-news\"\n\t// because I'm not handling closing the window, and I don't want it to sound\n\t// super friendly.\n\t// I did go on a tangent of making it a proper UI navigation URL hash,\n\t// and binding the window state to the URL state (bidirectionally),\n\t// but I'm not sure how it should work with the back button.\n\t// It's probably nice on mobile for the back button to close windows,\n\t// but I'd want it to be consistent between all the windows of the app.\n\tif (location.hash.match(/force-open-project-news/i)) {\n\t\tif (!$(\".news-window:visible\").length) {\n\t\t\tshow_news();\n\t\t}\n\t}\n};\nupdate_from_url_params();\n$G.on(\"hashchange popstate change-url-params\", update_from_url_params);\n\n// handle backwards compatibility URLs\n// Eye Gaze Mode was a monolithic feature that has been since been split into smaller features.\n// We can maintain backwards compatibility with the old URL param by mapping it to the new features.\n// (BTW: Eye Gaze Mode never included an actual eye tracker (instead relying on external software),\n// but if I added that as a feature I could call the feature Eye Tracker, so it wouldn't be too confusing.)\nif (location.search.match(/eye-gaze-mode/) || location.hash.match(/eye-gaze-mode/)) {\n\tchange_some_url_params({\n\t\t\"eye-gaze-mode\": false,\n\t\t\"enlarge-ui\": true,\n\t\t\"dwell-clicker\": true,\n\t\t\"vertical-color-box-mode\": true,\n\t\t\"easy-undo\": true,\n\t}, { replace_history_state: true });\n\tupdate_from_url_params();\n}\nif (location.search.match(/vertical-colors?-box/)) {\n\tchange_url_param(\"vertical-color-box\", true, { replace_history_state: true });\n\tupdate_from_url_params();\n}\n\n// #endregion\n\n// #region App UI\n\nconst $app = $(E(\"div\")).addClass(\"jspaint\").appendTo(\"body\");\nwindow.$app = $app;\n\nconst $V = $(E(\"div\")).addClass(\"vertical\").appendTo($app);\nconst $H = $(E(\"div\")).addClass(\"horizontal\").appendTo($V);\n\nconst $canvas_area = $(E(\"div\")).addClass(\"canvas-area inset-deep\").appendTo($H);\nwindow.$canvas_area = $canvas_area;\n\nconst $canvas = $(main_canvas).appendTo($canvas_area);\nwindow.$canvas = $canvas;\n$canvas.css(\"touch-action\", \"none\");\nwindow.canvas_bounding_client_rect = main_canvas.getBoundingClientRect(); // cached for performance, updated later\nconst canvas_handles = new Handles({\n\t$handles_container: $canvas_area,\n\t$object_container: $canvas_area,\n\tget_rect: () => ({ x: 0, y: 0, width: main_canvas.width, height: main_canvas.height }),\n\tset_rect: ({ width, height }) => resize_canvas_and_save_dimensions(width, height),\n\toutset: 4,\n\tget_handles_offset_left: () => parseFloat($canvas_area.css(\"padding-left\")) + 1,\n\tget_handles_offset_top: () => parseFloat($canvas_area.css(\"padding-top\")) + 1,\n\tget_ghost_offset_left: () => parseFloat($canvas_area.css(\"padding-left\")) + 1,\n\tget_ghost_offset_top: () => parseFloat($canvas_area.css(\"padding-top\")) + 1,\n\tsize_only: true,\n});\nwindow.canvas_handles = canvas_handles;\n\nconst $top = $(E(\"div\")).addClass(\"component-area top\").prependTo($V);\nwindow.$top = $top;\nconst $bottom = $(E(\"div\")).addClass(\"component-area bottom\").appendTo($V);\nwindow.$bottom = $bottom;\nconst $left = $(E(\"div\")).addClass(\"component-area left\").prependTo($H);\nwindow.$left = $left;\nconst $right = $(E(\"div\")).addClass(\"component-area right\").appendTo($H);\nwindow.$right = $right;\n\n\n// there's also probably a CSS solution alternative to this\nif (get_direction() === \"rtl\") {\n\t$left.appendTo($H);\n\t$right.prependTo($H);\n}\n\n// #endregion\n// (arguably still App UI stuff below, but it becomes a fuzzy line later on)\n\n// #region Status Bar\nconst $status_area = $(E(\"div\")).addClass(\"status-area\").appendTo($V);\nwindow.$status_area = $status_area;\nconst $status_text = /** @type {JQuery<HTMLDivElement> & {default: ()=> void}} */($(E(\"div\")).addClass(\"status-text status-field inset-shallow\").appendTo($status_area));\nwindow.$status_text = $status_text;\nconst $status_position = $(E(\"div\")).addClass(\"status-coordinates status-field inset-shallow\").appendTo($status_area);\nwindow.$status_position = $status_position;\nconst $status_size = $(E(\"div\")).addClass(\"status-coordinates status-field inset-shallow\").appendTo($status_area);\nwindow.$status_size = $status_size;\n\n// #region News Indicator\nconst news_seen_key = \"jspaint latest news seen\";\nconst latest_news_datetime = $this_version_news.find(\"time\").attr(\"datetime\");\nconst $news_indicator = $(`\n\t<a class=\"news-indicator\" href=\"#project-news\">\n\t\t<img src=\"images/winter/present.png\" width=\"24\" height=\"22\" alt=\"\"/>\n\t\t<!--<img src=\"images/about/news.gif\" width=\"40\" height=\"16\" alt=\"\"/>-->\n\t\t<!--<img src=\"images/new.gif\" width=\"40\" height=\"16\" alt=\"\"/>-->\n\t\t<span class=\"marquee\" dir=\"ltr\" style=\"--text-width: 69ch; --animation-duration: 3s;\">\n\t\t\t<span>\n\t\t\t\tDiscord server, Head Tracker, Quick Undo Button, Enlarge UI, and Dwell Clicker\n\t\t\t</span>\n\t\t</span>\n\t\t<!--<span class=\"marquee\" dir=\"ltr\" style=\"--text-width: 44ch; --animation-duration: 3s;\">\n\t\t\t<span>\n\t\t\t\t<b>Cool new things</b> — One thing! Another thing! Something else!\n\t\t\t</span>\n\t\t</span>\n\t\t<span>\n\t\t\t<b>Just One Thing</b>\n\t\t</span>-->\n\t</a>\n`);\n$news_indicator.on(\"click auxclick\", (event) => {\n\tevent.preventDefault();\n\tshow_news();\n\t$news_indicator.remove();\n\ttry {\n\t\tlocalStorage[news_seen_key] = latest_news_datetime;\n\t} catch (_error) { /* ignore */ }\n});\nlet news_seen;\nlet local_storage_unavailable;\ntry {\n\tnews_seen = localStorage[news_seen_key];\n} catch (_error) {\n\tlocal_storage_unavailable = true;\n}\nconst day = 24 * 60 * 60 * 1000;\nconst news_period_if_can_dismiss = 15 * day;\nconst news_period_if_cannot_dismiss = 5 * day;\nconst news_period = local_storage_unavailable ? news_period_if_cannot_dismiss : news_period_if_can_dismiss;\nif (Date.now() < Date.parse(latest_news_datetime) + news_period && news_seen !== latest_news_datetime) {\n\t$status_area.append($news_indicator);\n}\nif ($news_indicator.text().includes(\"Bubblegum\")) {\n\tlet bubbles_raf_id = -1;\n\tconst bubbles = [];\n\tconst make_bubble = () => {\n\t\tconst $bubble = $(E(\"img\")).attr({\n\t\t\tsrc: \"images/bubblegum/bubble.png\",\n\t\t\twidth: 24,\n\t\t\theight: 24,\n\t\t\talt: \"\",\n\t\t}).css({\n\t\t\tposition: \"absolute\",\n\t\t\tpointerEvents: \"none\",\n\t\t\ttop: 0,\n\t\t\tleft: 0,\n\t\t\tzIndex: 10,\n\t\t}).appendTo(\"body\");\n\t\tconst rect = $news_indicator[0].getBoundingClientRect();\n\t\tconst x = rect.left + Math.random() * rect.width;\n\t\tconst y = rect.top + rect.height;\n\t\tconst scale = Math.random() * 0.5 + 0.5;\n\t\tconst bubble = { $bubble, x, y, scale, vx: Math.random() * 2 - 1, vy: -Math.random() * 2 };\n\t\tbubbles.push(bubble);\n\t\tif (bubbles_raf_id === -1) {\n\t\t\tanimate_bubbles();\n\t\t}\n\t\tsetTimeout(() => {\n\t\t\t$bubble.remove();\n\t\t\tbubbles.splice(bubbles.indexOf(bubble), 1);\n\t\t\tif (bubbles.length === 0) {\n\t\t\t\tcancelAnimationFrame(bubbles_raf_id);\n\t\t\t\tbubbles_raf_id = -1;\n\t\t\t}\n\t\t}, 10000);\n\t};\n\tlet last_time = performance.now();\n\tconst animate_bubbles = () => {\n\t\tbubbles_raf_id = requestAnimationFrame(animate_bubbles);\n\t\tconst now = performance.now();\n\t\tconst dt = now - last_time;\n\t\tfor (const bubble of bubbles) {\n\t\t\t// not actually frame rate independent physics, I don't think\n\t\t\tbubble.x += bubble.vx * dt / 16;\n\t\t\tbubble.y += bubble.vy * dt / 16;\n\t\t\tconst wind_x = Math.sin(bubble.y / 100 + now / 3000) * 0.01;\n\t\t\tconst wind_y = Math.cos(bubble.x / 100 + now / 3000) * 0.01;\n\t\t\tbubble.vx += wind_x;\n\t\t\tbubble.vy += wind_y;\n\t\t\tbubble.$bubble.css({\n\t\t\t\ttransform: `translate(${bubble.x}px, ${bubble.y}px) scale(${bubble.scale})`,\n\t\t\t});\n\t\t}\n\t\tlast_time = now;\n\t};\n\t$news_indicator.on(\"pointerenter\", () => {\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tsetTimeout(make_bubble, i * 100);\n\t\t}\n\t});\n\t$news_indicator.on(\"pointerdown\", () => {\n\t\tfor (let i = 0; i < 50; i++) {\n\t\t\tsetTimeout(make_bubble, i * 1);\n\t\t}\n\t});\n}\n// #endregion\n\n$status_text.default = () => {\n\t$status_text.text(localize(\"For Help, click Help Topics on the Help Menu.\"));\n};\n$status_text.default();\n\n// #endregion\n\n// #region Menu Bar\nlet menu_bar_outside_frame = false;\nif (frameElement) {\n\ttry {\n\t\tif (parent.MenuBar) {\n\t\t\t// @ts-ignore\n\t\t\tMenuBar = parent.MenuBar;\n\t\t\tmenu_bar_outside_frame = true;\n\t\t}\n\t} catch (_error) { /* ignore */ }\n}\nconst menu_bar = MenuBar(menus);\nwindow.menu_bar = menu_bar;\nif (menu_bar_outside_frame) {\n\t$(menu_bar.element).insertBefore(frameElement);\n} else {\n\t$(menu_bar.element).prependTo($V);\n}\n\n$(menu_bar.element).on(\"info\", (event) => {\n\t// @ts-ignore\n\t$status_text.text(event.detail?.description ?? \"\");\n});\n$(menu_bar.element).on(\"default-info\", () => {\n\t$status_text.default();\n});\n\n// Hidden in a menu, these GIFs are not as obtrusive even though they can't be dismissed\nconst theme_updated_period = 20 * day;\nconst theme_new_period = 40 * day;\nconst theme_soon_period = 40 * day;\nif (Date.now() < Date.parse(\"2024-02-22\") + theme_new_period) {\n\t$(\"[role=menuitem][aria-label*='Modern Dark'] .menu-item-shortcut\").append(\"<img src='images/new2.gif' alt='New!'/>\");\n}\nif (Date.now() < Date.parse(\"2024-02-24\") + theme_soon_period) {\n\t// $(\"[role=menuitem][aria-label*='Bubblegum'] .menu-item-shortcut\").append(\"<img src='images/soon-twist-anim.gif' alt='Coming Soon!' class='too-big-soon-gif'/>\");\n\t// $(\"[role=menuitem][aria-label*='Retro Futurist'] .menu-item-shortcut\").append(\"<img src='images/soon.gif' alt='Coming Soon!'/>\");\n\t// $(\"[role=menuitem][aria-label*='Picnic'] .menu-item-shortcut\").append(\"<img src='images/soon.gif' alt='Coming Soon!'/>\");\n}\nif (Date.now() < Date.parse(\"2024-02-22\") + theme_updated_period) {\n\t$(\"[role=menuitem][aria-label*='Modern Light'] .menu-item-shortcut\").append(\"<img src='images/updated.gif' alt='Updated!'/>\");\n\t$(\"[role=menuitem][aria-label*='Classic Dark'] .menu-item-shortcut\").append(\"<img src='images/updated.gif' alt='Updated!'/>\");\n\t$(\"[role=menuitem][aria-label*='Occult'] .menu-item-shortcut\").append(\"<img src='images/updated.gif' alt='Updated!'/>\");\n}\n\n// Extras menu emoji icons\n// (OS-GUI.js doesn't support icons yet but I wanted to spruce it up a bit.)\n// Originally I defined the emoji as part of the label, which worked well for a while.\n// Now I'm rendering the emoji as pseudo elements.\n// - It allows for matching on the menu item text exactly, without including emoji in my tests,\n//   which will hopefully be replaced with custom icons in the future.\n// - It makes it easier to replace the emoji with custom icons in the future.\n// - It hides the emoji from `aria-label`, for screen reader users.\n// - It makes the menu data cleaner.\n// - It allows aligning the emoji nicely, even when some don't show as emoji, depending on the platform.\n\n/**\n * @param {OSGUIMenuFragment[]} menu_items\n * @param {HTMLElement} menu_element\n * @yields {[OSGUIMenuItem, HTMLElement]}\n * @returns {Generator<[OSGUIMenuItem, HTMLElement], void, void>}\n */\nfunction* traverse_menu(menu_items, menu_element) {\n\t// Traverse menu data and elements in tandem, yielding pairs of menu item specifications and elements.\n\t// This approach handles identically named menu items in separate menus,\n\t// as is the case with \"File > Manage Storage\" and \"Edit > History\", both present in the Extras menu,\n\t// but also in the other menus for discoverability.\n\t// However, it doesn't handle identically named menu items in the same menu,\n\t// as it still matches up items within the menu using aria-label.\n\n\t// Menu structure:\n\t// - Menu popups are not descendants of the menu bar or other menu popups; they are always direct children of the body.\n\t// - Menu items that open submenus have \"aria-controls\" pointing to the ID of the submenu.\n\t// - (Menu popups also have \"data-semantic-parent\" pointing to the ID of the menu item that opens them.)\n\t// - `submenu` is an array, but the top level (menu bar) is represented as an object, which is a bit awkward.\n\t//   However, this function doesn't deal with the top level.\n\n\tconst menu_item_elements = /** @type {HTMLElement[]} */([...menu_element.querySelectorAll(\".menu-item\")]);\n\tfor (const menu_item of menu_items) {\n\t\tif (typeof menu_item !== \"object\" || !(\"label\" in menu_item)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst aria_label = AccessKeys.toText(menu_item.label);\n\t\tconst menu_item_element = menu_item_elements.filter((el) =>\n\t\t\tel.getAttribute(\"aria-label\") === aria_label\n\t\t)[0];\n\t\tif (!menu_item_element) {\n\t\t\tconsole.warn(\"Couldn't find menu item\", menu_item, \"with aria-label\", aria_label);\n\t\t\tcontinue;\n\t\t}\n\t\tyield [menu_item, menu_item_element];\n\t\tif (menu_item.submenu) {\n\t\t\tyield* traverse_menu(menu_item.submenu, menu_document.getElementById(menu_item_element.getAttribute(\"aria-controls\")));\n\t\t}\n\t\t// if (menu_item.radioItems) {\n\t\t// \tyield* traverse_menu(menu_item.radioItems, menu_element);\n\t\t// }\n\t}\n}\n\nconst menu_document = menu_bar.element.ownerDocument;\nconst extras_menu_button = menu_document.querySelector(\".extras-menu-button\");\nconst extras_menu_popup = menu_document.getElementById(extras_menu_button.getAttribute(\"aria-controls\"));\n\nlet emoji_css = `\n\t.menu-item .menu-item-label::before {\n\t\tdisplay: inline-block;\n\t\twidth: 1.8em;\n\t\tmargin-right: 0.2em;\n\t\ttext-align: center;\n\t}\n`;\nfor (const [menu_item, menu_item_element] of traverse_menu(menus[\"E&xtras\"], extras_menu_popup)) {\n\tif (menu_item.emoji_icon) {\n\t\temoji_css += `\n\t\t\t#${menu_item_element.id} .menu-item-label::before {\n\t\t\t\tcontent: \"${menu_item.emoji_icon}\";\n\t\t\t}\n\t\t`;\n\t}\n}\n$(\"<style>\").text(emoji_css).appendTo(menu_document.head);\n\n// Electron menu integration\nif (window.is_electron_app) {\n\twindow.setMenus(menus);\n}\n\n// #endregion\n\nlet $toolbox = $ToolBox(tools);\nwindow.$toolbox = $toolbox;\n// let $toolbox2 = $ToolBox(extra_tools, true);//.hide();\n// Note: a second $ToolBox doesn't work because they use the same tool options (which could be remedied)\n// If there's to be extra tools, they should probably get a window, with different UI\n// so it can display names of the tools, and maybe authors and previews (and not necessarily icons)\n\nlet $colorbox = $ColorBox($(\"body\").hasClass(\"vertical-color-box-mode\"));\nwindow.$colorbox = $colorbox;\n\n$G.on(\"vertical-color-box-mode-toggled\", () => {\n\t// Destroy and recreate the color box because it uses a constructor parameter\n\t// for this state and this handles re-docking to the correct edge\n\t$colorbox.destroy();\n\t$colorbox = $ColorBox($(\"body\").hasClass(\"vertical-color-box-mode\"));\n\twindow.$colorbox = $colorbox;\n\tprevent_selection($colorbox);\n});\n\n$G.on(\"resize\", () => { // for browser zoom, and in-app zoom of the canvas\n\tupdate_canvas_rect();\n\tupdate_disable_aa();\n});\n$canvas_area.on(\"scroll\", () => {\n\tupdate_canvas_rect();\n});\n$canvas_area.on(\"resize\", () => {\n\tupdate_magnified_canvas_size();\n});\n\n// Despite overflow:hidden on html and body,\n// focusing elements that are partially offscreen can still scroll the page.\n// For example, with Edit Colors dialog partially offscreen, navigating the color grid.\n// We need to prevent (reset) scroll on focus, and also avoid scrollIntoView().\n// Listening for scroll here is mainly in case a case is forgotten, like scrollIntoView,\n// in which case it will flash sometimes but at least not end up with part of\n// the application scrolled off the screen with no scrollbar to get it back.\n$G.on(\"scroll focusin\", () => {\n\twindow.scrollTo(0, 0);\n});\n\n// #region Drag and Drop\n\n// jQuery's multiple event handling is not that useful in the first place, but when adding type info... it's downright ugly.\n$(\"body\").on(\"dragover dragenter\", (/** @type {JQuery.DragOverEvent | JQuery.DragEnterEvent} */event) => {\n\tconst dt = event.originalEvent.dataTransfer;\n\tconst has_files = dt && Array.from(dt.types).includes(\"Files\");\n\tif (has_files) {\n\t\tevent.preventDefault();\n\t}\n}).on(\"drop\", async (event) => {\n\tif (event.isDefaultPrevented()) {\n\t\treturn;\n\t}\n\tconst dt = event.originalEvent.dataTransfer;\n\tconst has_files = dt && Array.from(dt.types).includes(\"Files\");\n\tif (has_files) {\n\t\tevent.preventDefault();\n\t\t// @TODO: sort files/items in priority of image, theme, palette\n\t\t// and then try loading them in series, with async await to avoid race conditions?\n\t\t// or maybe support opening multiple documents in tabs\n\t\t// Note: don't use FS Access API in Electron app because:\n\t\t// 1. it's faulty (permissions problems, 0 byte files maybe due to the perms problems)\n\t\t// 2. we want to save the file.path, which the dt.files code path takes care of\n\t\tif (window.FileSystemHandle && !window.is_electron_app) {\n\t\t\tfor (const item of dt.items) {\n\t\t\t\t// kind will be \"file\" for file/directory entries.\n\t\t\t\tif (item.kind === \"file\") {\n\t\t\t\t\tlet handle;\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Experimental API, not supported on Firefox as of 2024-02-17\n\t\t\t\t\t\tif (\"getAsFileSystemHandle\" in item) {\n\t\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\t\thandle = await item.getAsFileSystemHandle();\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t// I'm not sure when this happens.\n\t\t\t\t\t\t// should this use \"An invalid file handle was associated with %1.\" message?\n\t\t\t\t\t\tshow_error_message(localize(\"File not found.\"), error);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (!handle || handle.kind === \"file\") {\n\t\t\t\t\t\tlet file;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// instanceof is for the type checker; it should be guaranteed since kind is \"file\"\n\t\t\t\t\t\t\tif (handle && handle instanceof FileSystemFileHandle) {\n\t\t\t\t\t\t\t\tfile = await handle.getFile();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfile = item.getAsFile();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t// NotFoundError can happen when the file was moved or deleted,\n\t\t\t\t\t\t\t// then dragged and dropped via the browser's downloads bar, or some other outdated file listing.\n\t\t\t\t\t\t\tshow_error_message(localize(\"File not found.\"), error);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\topen_from_file(file, handle);\n\t\t\t\t\t\tif (window._open_images_serially) {\n\t\t\t\t\t\t\t// For testing a suite of files:\n\t\t\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 500));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Normal behavior: only open one file.\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// else if (handle.kind === \"directory\") {}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (dt.files && dt.files.length) {\n\t\t\tif (window._open_images_serially) {\n\t\t\t\t// For testing a suite of files, such as http://www.schaik.com/pngsuite/\n\t\t\t\tlet i = 0;\n\t\t\t\tconst iid = setInterval(() => {\n\t\t\t\t\tconsole.log(\"opening\", dt.files[i].name);\n\t\t\t\t\topen_from_file(dt.files[i]);\n\t\t\t\t\ti++;\n\t\t\t\t\tif (i >= dt.files.length) {\n\t\t\t\t\t\tclearInterval(iid);\n\t\t\t\t\t}\n\t\t\t\t}, 1500);\n\t\t\t} else {\n\t\t\t\t// Normal behavior: only open one file.\n\t\t\t\topen_from_file(dt.files[0]);\n\t\t\t}\n\t\t}\n\t}\n});\n\n// #endregion\n\n// #region Keyboard Shortcuts\n$G.on(\"keydown\", (e) => {\n\t// typecast to HTMLElement because e.target is incorrectly given as Window, due to $G wrapping window\n\tconst target = /** @type {HTMLElement} */ (/** @type {unknown} */ (e.target));\n\n\tif (e.isDefaultPrevented()) {\n\t\treturn;\n\t}\n\tif (e.key === \"Escape\") { // Note: Escape handled below too! (after input/textarea return condition)\n\t\tif (textbox && textbox.$editor.is(target)) {\n\t\t\tdeselect();\n\t\t}\n\t}\n\tif (\n\t\t// Ctrl+Shift+Y for history window,\n\t\t// chosen because it's related to the undo/redo shortcuts\n\t\t// and it looks like a branching symbol.\n\t\t(e.ctrlKey || e.metaKey) && e.shiftKey && !e.altKey &&\n\t\te.key.toUpperCase() === \"Y\"\n\t) {\n\t\tshow_document_history();\n\t\te.preventDefault();\n\t\treturn;\n\t}\n\t// @TODO: return if menus/menubar focused or focus in dialog window\n\t// or maybe there's a better way to do this that works more generally\n\t// maybe it should only handle the event if document.activeElement is the body or html element?\n\t// (or $app could have a tabIndex and no focus style and be focused under various conditions,\n\t// if that turned out to make more sense for some reason)\n\tif (\n\t\te.target instanceof HTMLInputElement ||\n\t\te.target instanceof HTMLTextAreaElement\n\t) {\n\t\treturn;\n\t}\n\n\t// @TODO: preventDefault in all cases where the event is handled\n\t// also, ideally check that modifiers *aren't* pressed\n\t// probably best to use a library at this point!\n\n\tif (selection) {\n\t\tconst nudge_selection = (delta_x, delta_y) => {\n\t\t\tselection.x += delta_x;\n\t\t\tselection.y += delta_y;\n\t\t\tselection.position();\n\t\t};\n\t\tswitch (e.key) {\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tnudge_selection(-1, 0);\n\t\t\t\te.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tnudge_selection(+1, 0);\n\t\t\t\te.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tnudge_selection(0, +1);\n\t\t\t\te.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tnudge_selection(0, -1);\n\t\t\t\te.preventDefault();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (e.key === \"Escape\") { // Note: Escape handled above too!\n\t\tif (selection) {\n\t\t\tdeselect();\n\t\t} else {\n\t\t\tcancel();\n\t\t}\n\t\tstopSimulatingGestures();\n\t\ttrace_and_sketch_stop();\n\t} else if (e.key === \"Enter\") {\n\t\tif (selection) {\n\t\t\tdeselect();\n\t\t}\n\t} else if (e.key === \"F1\") {\n\t\tshow_help();\n\t\te.preventDefault();\n\t} else if (e.key === \"F4\") {\n\t\tredo();\n\t} else if (e.key === \"Delete\" || e.key === \"Backspace\") {\n\t\t// alt+backspace: undo\n\t\t// shift+delete: cut\n\t\t// delete/backspace: delete selection\n\t\tif (e.key === \"Delete\" && e.shiftKey) {\n\t\t\tedit_cut();\n\t\t} else if (e.key === \"Backspace\" && e.altKey) {\n\t\t\tundo();\n\t\t} else {\n\t\t\tdelete_selection();\n\t\t}\n\t\te.preventDefault();\n\t} else if (e.key === \"Insert\") {\n\t\t// ctrl+insert: copy\n\t\t// shift+insert: paste\n\t\tif (e.ctrlKey) {\n\t\t\tedit_copy();\n\t\t\te.preventDefault();\n\t\t} else if (e.shiftKey) {\n\t\t\tedit_paste();\n\t\t\te.preventDefault();\n\t\t}\n\t} else if (\n\t\te.code === \"NumpadAdd\" ||\n\t\te.code === \"NumpadSubtract\" ||\n\t\t// normal + and - keys\n\t\te.key === \"+\" ||\n\t\te.key === \"-\" ||\n\t\te.key === \"=\"\n\t) {\n\t\tconst plus = e.code === \"NumpadAdd\" || e.key === \"+\" || e.key === \"=\";\n\t\tconst minus = e.code === \"NumpadSubtract\" || e.key === \"-\";\n\t\tconst delta = Number(plus) - Number(minus); // const delta = +plus++ -minus--; // Δ = ±±±±\n\n\t\tif (selection) {\n\t\t\tselection.scale(2 ** delta);\n\t\t} else {\n\t\t\tif (selected_tool.id === TOOL_BRUSH) {\n\t\t\t\tbrush_size = Math.max(1, Math.min(brush_size + delta, 500));\n\t\t\t} else if (selected_tool.id === TOOL_ERASER) {\n\t\t\t\teraser_size = Math.max(1, Math.min(eraser_size + delta, 500));\n\t\t\t} else if (selected_tool.id === TOOL_AIRBRUSH) {\n\t\t\t\tairbrush_size = Math.max(1, Math.min(airbrush_size + delta, 500));\n\t\t\t} else if (selected_tool.id === TOOL_PENCIL) {\n\t\t\t\tpencil_size = Math.max(1, Math.min(pencil_size + delta, 50));\n\t\t\t} else if (\n\t\t\t\tselected_tool.id === TOOL_LINE ||\n\t\t\t\tselected_tool.id === TOOL_CURVE ||\n\t\t\t\tselected_tool.id === TOOL_RECTANGLE ||\n\t\t\t\tselected_tool.id === TOOL_ROUNDED_RECTANGLE ||\n\t\t\t\tselected_tool.id === TOOL_ELLIPSE ||\n\t\t\t\tselected_tool.id === TOOL_POLYGON\n\t\t\t) {\n\t\t\t\tstroke_size = Math.max(1, Math.min(stroke_size + delta, 500));\n\t\t\t}\n\n\t\t\t$G.trigger(\"option-changed\");\n\t\t\tif (button !== undefined && pointer) { // pointer may only be needed for tests\n\t\t\t\tselected_tools.forEach((selected_tool) => {\n\t\t\t\t\ttool_go(selected_tool);\n\t\t\t\t});\n\t\t\t}\n\t\t\tupdate_helper_layer();\n\t\t}\n\t\te.preventDefault();\n\t\treturn;\n\t} else if (e.ctrlKey || e.metaKey) {\n\t\tif (textbox) {\n\t\t\tswitch (e.key.toUpperCase()) {\n\t\t\t\tcase \"A\":\n\t\t\t\tcase \"Z\":\n\t\t\t\tcase \"Y\":\n\t\t\t\tcase \"I\":\n\t\t\t\tcase \"B\":\n\t\t\t\tcase \"U\":\n\t\t\t\t\t// Don't prevent the default. Allow text editing commands.\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t// Ctrl+PageDown: zoom to 400%\n\t\t// Ctrl+PageUp: zoom to 100%\n\t\t// In Chrome and Firefox, these switch to the next/previous tab,\n\t\t// but it's allowed to be overridden in fullscreen in Chrome.\n\t\tif (e.key === \"PageDown\") {\n\t\t\tset_magnification(4);\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t} else if (e.key === \"PageUp\") {\n\t\t\tset_magnification(1);\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\t\tswitch (e.key.toUpperCase()) {\n\t\t\tcase \",\": // \"<\" without Shift\n\t\t\tcase \"<\":\n\t\t\tcase \"[\":\n\t\t\tcase \"{\":\n\t\t\t\trotate(-TAU / 4);\n\t\t\t\tbreak;\n\t\t\tcase \".\": // \">\" without Shift\n\t\t\tcase \">\":\n\t\t\tcase \"]\":\n\t\t\tcase \"}\":\n\t\t\t\trotate(+TAU / 4);\n\t\t\t\tbreak;\n\t\t\tcase \"Z\":\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\tredo();\n\t\t\t\t} else {\n\t\t\t\t\tundo();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"Y\":\n\t\t\t\t// Ctrl+Shift+Y handled above\n\t\t\t\tredo();\n\t\t\t\tbreak;\n\t\t\tcase \"G\":\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\trender_history_as_gif();\n\t\t\t\t} else {\n\t\t\t\t\ttoggle_grid();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"F\":\n\t\t\t\t// @ts-ignore (repeat doesn't exist on jQuery.Event, I guess, but this is fine)\n\t\t\t\tif (!e.repeat && !e.originalEvent?.repeat) {\n\t\t\t\t\tview_bitmap();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"O\":\n\t\t\t\tfile_open();\n\t\t\t\tbreak;\n\t\t\tcase \"S\":\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\tfile_save_as();\n\t\t\t\t} else {\n\t\t\t\t\tfile_save();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"A\":\n\t\t\t\tselect_all();\n\t\t\t\tbreak;\n\t\t\tcase \"I\":\n\t\t\t\timage_invert_colors();\n\t\t\t\tbreak;\n\t\t\tcase \"E\":\n\t\t\t\timage_attributes();\n\t\t\t\tbreak;\n\n\t\t\t// These shortcuts are mostly reserved by browsers,\n\t\t\t// but they are allowed in Electron.\n\t\t\t// The shortcuts are hidden in the menus (or changed) when not in Electron,\n\t\t\t// to prevent accidental closing/refreshing.\n\t\t\t// I'm supporting Alt+<shortcut> here (implicitly) as a workaround (and showing this in the menus in some cases).\n\t\t\t// Also, note that Chrome allows some shortcuts to be overridden in fullscreen (but showing/hiding the shortcuts would be confusing).\n\t\t\tcase \"N\":\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\tclear();\n\t\t\t\t} else {\n\t\t\t\t\tfile_new();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"T\":\n\t\t\t\t$toolbox.toggle();\n\t\t\t\tbreak;\n\t\t\tcase \"L\": // allowed to override in Firefox\n\t\t\t\t$colorbox.toggle();\n\t\t\t\tbreak;\n\t\t\tcase \"R\":\n\t\t\t\timage_flip_and_rotate();\n\t\t\t\tbreak;\n\t\t\tcase \"W\":\n\t\t\t\timage_stretch_and_skew();\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\treturn; // don't preventDefault\n\t\t}\n\t\te.preventDefault();\n\t\t// put nothing below! note return above\n\t}\n});\n// #endregion\n\n// #region Alt+Mousewheel Zooming (and also some dev helper that I haven't used in years)\nlet alt_zooming = false;\naddEventListener(\"keyup\", (e) => {\n\tif (e.key === \"Alt\" && alt_zooming) {\n\t\te.preventDefault(); // prevent menu bar from activating in Firefox from zooming\n\t}\n\tif (!e.altKey) {\n\t\talt_zooming = false;\n\t}\n});\n// $G.on(\"wheel\", (e) => {\naddEventListener(\"wheel\", (e) => {\n\tif (e.altKey) {\n\t\te.preventDefault();\n\t\tlet new_magnification = magnification;\n\t\tconst factor = 1 + Math.min(0.5, Math.abs(e.deltaY) / 100);\n\t\tif (e.deltaY < 0) {\n\t\t\tnew_magnification *= factor;\n\t\t} else {\n\t\t\tnew_magnification /= factor;\n\t\t}\n\t\tnew_magnification = Math.max(0.5, Math.min(new_magnification, 80));\n\t\tset_magnification(new_magnification, to_canvas_coords(e));\n\t\talt_zooming = true;\n\t\treturn;\n\t}\n\tif (e.ctrlKey || e.metaKey) {\n\t\treturn;\n\t}\n\t// for reference screenshot mode (development helper):\n\tif (location.hash.match(/compare-reference/i)) { // including compare-reference-tool-windows\n\t\t// const delta_opacity = Math.sign(e.originalEvent.deltaY) * -0.1; // since attr() is not supported other than for content, this increment must match CSS\n\t\tconst delta_opacity = Math.sign(e.deltaY) * -0.2; // since attr() is not supported other than for content, this increment must match CSS\n\t\tlet old_opacity = parseFloat($(\"body\").attr(\"data-reference-opacity\"));\n\t\tif (!isFinite(old_opacity)) {\n\t\t\told_opacity = 0.5;\n\t\t}\n\t\tconst new_opacity = Math.max(0, Math.min(1, old_opacity + delta_opacity));\n\t\t$(\"body\").attr(\"data-reference-opacity\", new_opacity);\n\t\t// prevent scrolling, keeping the screenshot lined up\n\t\t// e.preventDefault(); // doesn't work\n\t\t// $canvas_area.scrollTop(0); // doesn't work with smooth scrolling\n\t\t// $canvas_area.scrollLeft(0);\n\t}\n}, { passive: false });\n// #endregion\n\n// #region Clipboard Handling\n$G.on(\"cut copy paste\", (e) => {\n\tif (e.isDefaultPrevented()) {\n\t\treturn;\n\t}\n\tif (\n\t\tdocument.activeElement instanceof HTMLInputElement ||\n\t\tdocument.activeElement instanceof HTMLTextAreaElement ||\n\t\t!window.getSelection().isCollapsed\n\t) {\n\t\t// Don't prevent cutting/copying/pasting within inputs or textareas, or if there's a selection\n\t\treturn;\n\t}\n\n\te.preventDefault();\n\t// @ts-ignore\n\tconst cd = e.originalEvent.clipboardData || window.clipboardData;\n\tif (!cd) { return; }\n\n\tif (e.type === \"copy\" || e.type === \"cut\") {\n\t\tif (selection && selection.canvas) {\n\t\t\tconst do_sync_clipboard_copy_or_cut = () => {\n\t\t\t\t// works only for pasting within a jspaint instance\n\t\t\t\tconst data_url = selection.canvas.toDataURL();\n\t\t\t\tcd.setData(\"text/x-data-uri; type=image/png\", data_url);\n\t\t\t\tcd.setData(\"text/uri-list\", data_url);\n\t\t\t\tcd.setData(\"URL\", data_url);\n\t\t\t\tif (e.type === \"cut\") {\n\t\t\t\t\tdelete_selection({\n\t\t\t\t\t\tname: localize(\"Cut\"),\n\t\t\t\t\t\ticon: get_help_folder_icon(\"p_cut.png\"),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\t\t\tif (!navigator.clipboard || !navigator.clipboard.write || is_discord_embed) {\n\t\t\t\treturn do_sync_clipboard_copy_or_cut();\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tif (e.type === \"cut\") {\n\t\t\t\t\tedit_cut();\n\t\t\t\t} else {\n\t\t\t\t\tedit_copy();\n\t\t\t\t}\n\t\t\t} catch (_error) {\n\t\t\t\tdo_sync_clipboard_copy_or_cut();\n\t\t\t}\n\t\t}\n\t} else if (e.type === \"paste\") {\n\t\tfor (const item of cd.items) {\n\t\t\tif (item.type.match(/^text\\/(?:x-data-uri|uri-list|plain)|URL$/)) {\n\t\t\t\titem.getAsString((text) => {\n\t\t\t\t\tconst uris = get_uris(text);\n\t\t\t\t\tif (uris.length > 0) {\n\t\t\t\t\t\tload_image_from_uri(uris[0]).then((info) => {\n\t\t\t\t\t\t\tpaste(info.image || make_canvas(info.image_data));\n\t\t\t\t\t\t}, (error) => {\n\t\t\t\t\t\t\tshow_resource_load_error_message(error);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tshow_error_message(\"The information on the Clipboard can't be inserted into Paint.\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t} else if (item.type.match(/^image\\//)) {\n\t\t\t\tpaste_image_from_file(item.getAsFile());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n});\n// #endregion\n\n// #region Initialization\n// This sort of thing should really be at the END of the file.\n\nreset_file();\nreset_selected_colors();\nreset_canvas_and_history(); // (with newly reset colors)\nset_magnification(default_magnification);\n\n// this is synchronous for now, but @TODO: handle possibility of loading a document before callback\n// when switching to asynchronous storage, e.g. with localforage\nlocalStore.get({\n\twidth: default_canvas_width,\n\theight: default_canvas_height,\n}, (err, stored_values) => {\n\tif (err) { return; }\n\tmy_canvas_width = Number(stored_values.width);\n\tmy_canvas_height = Number(stored_values.height);\n\n\tmake_or_update_undoable({\n\t\tmatch: (history_node) => history_node.name === localize(\"New\"),\n\t\tname: \"Resize Canvas For New Document\",\n\t\ticon: get_help_folder_icon(\"p_stretch_both.png\"),\n\t}, () => {\n\t\tmain_canvas.width = Math.max(1, my_canvas_width);\n\t\tmain_canvas.height = Math.max(1, my_canvas_height);\n\t\tmain_ctx.disable_image_smoothing();\n\t\tif (!transparency) {\n\t\t\tmain_ctx.fillStyle = selected_colors.background;\n\t\t\tmain_ctx.fillRect(0, 0, main_canvas.width, main_canvas.height);\n\t\t}\n\t\t$canvas_area.trigger(\"resize\");\n\t});\n});\n\nif (window.initial_system_file_handle) {\n\tsystemHooks.readBlobFromHandle(window.initial_system_file_handle).then((file) => {\n\t\tif (file) {\n\t\t\topen_from_file(file, window.initial_system_file_handle);\n\t\t}\n\t}, (error) => {\n\t\t// this handler is not always called, sometimes error message is shown from readBlobFromHandle\n\t\tshow_error_message(`Failed to open file ${window.initial_system_file_handle}`, error);\n\t});\n}\n// #endregion\n\n// #region Palette Updating From Theme\n\nconst update_palette_from_theme = () => {\n\tif (get_theme() === \"winter.css\") {\n\t\tpalette = get_winter_palette();\n\t\t$colorbox.rebuild_palette();\n\t} else {\n\t\tpalette = default_palette;\n\t\t$colorbox.rebuild_palette();\n\t}\n};\n\n$G.on(\"theme-load\", update_palette_from_theme);\n// #region Initialization (continued)\nupdate_palette_from_theme();\n// #endregion\n\n// #endregion\n\nfunction update_fill_and_stroke_colors_and_lineWidth(selected_tool) {\n\tmain_ctx.lineWidth = stroke_size;\n\n\tconst reverse_because_fill_only = !!(selected_tool.$options && selected_tool.$options.fill && !selected_tool.$options.stroke);\n\t/** @type {ColorSelectionSlot} */\n\tconst color_k =\n\t\t(ctrl && selected_colors.ternary && pointer_active) ? \"ternary\" :\n\t\t\t((reverse !== reverse_because_fill_only) ? \"background\" : \"foreground\");\n\tmain_ctx.fillStyle = fill_color =\n\t\tmain_ctx.strokeStyle = stroke_color =\n\t\tselected_colors[color_k];\n\n\t/** @type {ColorSelectionSlot} */\n\tlet fill_color_k =\n\t\tctrl ? \"ternary\" : ((reverse !== reverse_because_fill_only) ? \"background\" : \"foreground\");\n\t/** @type {ColorSelectionSlot} */\n\tlet stroke_color_k = fill_color_k;\n\n\tif (selected_tool.shape || selected_tool.shape_colors) {\n\t\tif (!selected_tool.stroke_only) {\n\t\t\tif ((reverse !== reverse_because_fill_only)) {\n\t\t\t\tfill_color_k = \"foreground\";\n\t\t\t\tstroke_color_k = \"background\";\n\t\t\t} else {\n\t\t\t\tfill_color_k = \"background\";\n\t\t\t\tstroke_color_k = \"foreground\";\n\t\t\t}\n\t\t}\n\t\tmain_ctx.fillStyle = fill_color = selected_colors[fill_color_k];\n\t\tmain_ctx.strokeStyle = stroke_color = selected_colors[stroke_color_k];\n\t}\n\tpick_color_slot = fill_color_k;\n}\n\n// #region Primary Canvas Interaction\nfunction tool_go(selected_tool, event_name) {\n\tupdate_fill_and_stroke_colors_and_lineWidth(selected_tool);\n\n\tif (selected_tool[event_name]) {\n\t\tselected_tool[event_name](main_ctx, pointer.x, pointer.y);\n\t}\n\tif (selected_tool.paint) {\n\t\tselected_tool.paint(main_ctx, pointer.x, pointer.y);\n\t}\n}\nfunction canvas_pointer_move(e) {\n\tctrl = e.ctrlKey;\n\tshift = e.shiftKey;\n\tpointer = to_canvas_coords(e);\n\n\t// Quick Undo (for mouse/pen)\n\t// (Note: pointermove also occurs when the set of buttons pressed changes,\n\t// except when another event would fire like pointerdown)\n\tif (pointers.length && e.button != -1) {\n\t\t// compare buttons other than middle mouse button by using bitwise OR to make that bit of the number the same\n\t\tconst MMB = 4;\n\t\tif (e.pointerType != pointer_type || (e.buttons | MMB) != (pointer_buttons | MMB)) {\n\t\t\tcancel();\n\t\t\tpointer_active = false; // NOTE: pointer_active used in cancel()\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (e.shiftKey) {\n\t\t// TODO: snap to 45 degrees for Pencil and Polygon tools\n\t\t// TODO: manipulating the pointer object directly is a bit of a hack\n\t\tif (\n\t\t\tselected_tool.id === TOOL_LINE ||\n\t\t\tselected_tool.id === TOOL_CURVE\n\t\t) {\n\t\t\t// snap to eight directions\n\t\t\tconst dist = Math.sqrt(\n\t\t\t\t(pointer.y - pointer_start.y) * (pointer.y - pointer_start.y) +\n\t\t\t\t(pointer.x - pointer_start.x) * (pointer.x - pointer_start.x)\n\t\t\t);\n\t\t\tconst eighth_turn = TAU / 8;\n\t\t\tconst angle_0_to_8 = Math.atan2(pointer.y - pointer_start.y, pointer.x - pointer_start.x) / eighth_turn;\n\t\t\tconst angle = Math.round(angle_0_to_8) * eighth_turn;\n\t\t\tpointer.x = Math.round(pointer_start.x + Math.cos(angle) * dist);\n\t\t\tpointer.y = Math.round(pointer_start.y + Math.sin(angle) * dist);\n\t\t} else if (selected_tool.shape) {\n\t\t\t// snap to four diagonals\n\t\t\tconst w = Math.abs(pointer.x - pointer_start.x);\n\t\t\tconst h = Math.abs(pointer.y - pointer_start.y);\n\t\t\tif (w < h) {\n\t\t\t\tif (pointer.y > pointer_start.y) {\n\t\t\t\t\tpointer.y = pointer_start.y + w;\n\t\t\t\t} else {\n\t\t\t\t\tpointer.y = pointer_start.y - w;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (pointer.x > pointer_start.x) {\n\t\t\t\t\tpointer.x = pointer_start.x + h;\n\t\t\t\t} else {\n\t\t\t\t\tpointer.x = pointer_start.x - h;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tselected_tools.forEach((selected_tool) => {\n\t\ttool_go(selected_tool);\n\t});\n\tpointer_previous = pointer;\n}\n$canvas.on(\"pointermove\", (e) => {\n\tpointer = to_canvas_coords(e);\n\t$status_position.text(`${pointer.x},${pointer.y}`);\n});\n$canvas.on(\"pointerenter\", (e) => {\n\tpointer_over_canvas = true;\n\n\tupdate_helper_layer(e);\n\n\tif (!update_helper_layer_on_pointermove_active) {\n\t\t$G.on(\"pointermove\", update_helper_layer);\n\t\tupdate_helper_layer_on_pointermove_active = true;\n\t}\n});\n$canvas.on(\"pointerleave\", (e) => {\n\tpointer_over_canvas = false;\n\n\t$status_position.text(\"\");\n\n\tupdate_helper_layer(e);\n\n\tif (!pointer_active && update_helper_layer_on_pointermove_active) {\n\t\t$G.off(\"pointermove\", update_helper_layer);\n\t\tupdate_helper_layer_on_pointermove_active = false;\n\t}\n});\n// #endregion\n\n// #region Panning and Zooming\nlet last_zoom_pointer_distance;\nlet pan_last_pos;\n// let pan_start_magnification; // for panning and zooming in the same gesture (...was this ever used?)\nlet first_pointer_time;\nconst discard_quick_undo_period = 500; // milliseconds in which to treat gesture as just a pan/zoom if you use two fingers, rather than treating it as a brush stroke you might care about\nfunction average_points(points) {\n\tconst average = { x: 0, y: 0 };\n\tfor (const pointer of points) {\n\t\taverage.x += pointer.x;\n\t\taverage.y += pointer.y;\n\t}\n\taverage.x /= points.length;\n\taverage.y /= points.length;\n\treturn average;\n}\n$canvas_area.on(\"pointerdown\", (event) => {\n\tif (\n\t\tdocument.activeElement instanceof HTMLElement && // exists and (for type checker:) has blur()\n\t\tdocument.activeElement !== document.body &&\n\t\tdocument.activeElement !== document.documentElement\n\t) {\n\t\t// Allow unfocusing dialogs etc. in order to use keyboard shortcuts\n\t\tdocument.activeElement.blur();\n\t}\n\n\tif (pointers.every((pointer) =>\n\t\t// prevent multitouch panning in case of synthetic events from Dwell Clicker\n\t\tpointer.pointerId !== 1234567890 &&\n\t\t// prevent multitouch panning in case of dragging across iframe boundary with a mouse/pen\n\t\t// Note: there can be multiple active primary pointers, one per pointer type\n\t\t!(pointer.isPrimary && (pointer.pointerType === \"mouse\" || pointer.pointerType === \"pen\"))\n\t\t// @TODO: handle case of dragging across iframe boundary with touch\n\t)) {\n\t\tpointers.push({\n\t\t\tpointerId: event.pointerId,\n\t\t\tpointerType: event.pointerType,\n\t\t\t// isPrimary not available on jQuery.Event, and originalEvent not available in synthetic case\n\t\t\t// @ts-ignore\n\t\t\tisPrimary: event.originalEvent && event.originalEvent.isPrimary || event.isPrimary,\n\t\t\tx: event.clientX,\n\t\t\ty: event.clientY,\n\t\t});\n\t}\n\tif (pointers.length === 1) {\n\t\tfirst_pointer_time = performance.now();\n\t}\n\tif (pointers.length == 2) {\n\t\tlast_zoom_pointer_distance = Math.hypot(pointers[0].x - pointers[1].x, pointers[0].y - pointers[1].y);\n\t\tpan_last_pos = average_points(pointers);\n\t\t// pan_start_magnification = magnification;\n\t}\n\t// Quick Undo when there are multiple pointers (i.e. for touch)\n\t// See pointermove for other pointer types\n\t// SEE OTHER POINTERDOWN HANDLER ALSO\n\tif (pointers.length >= 2) {\n\t\t// If you press two fingers quickly, it shouldn't make a new history entry.\n\t\t// But if you draw something and then press a second finger to clear it, it should let you redo.\n\t\tconst discard_document_state = first_pointer_time && performance.now() - first_pointer_time < discard_quick_undo_period;\n\t\tcancel(false, discard_document_state);\n\t\tpointer_active = false; // NOTE: pointer_active used in cancel(); must be set after cancel()\n\t\treturn;\n\t}\n});\n$G.on(\"pointerup pointercancel\", (event) => {\n\tpointers = pointers.filter((pointer) =>\n\t\tpointer.pointerId !== event.pointerId\n\t);\n});\n$G.on(\"pointermove\", (event) => {\n\tfor (const pointer of pointers) {\n\t\tif (pointer.pointerId === event.pointerId) {\n\t\t\tpointer.x = event.clientX;\n\t\t\tpointer.y = event.clientY;\n\t\t}\n\t}\n\tif (pointers.length >= 2) {\n\t\tconst current_pos = average_points(pointers);\n\t\tconst distance = Math.hypot(pointers[0].x - pointers[1].x, pointers[0].y - pointers[1].y);\n\t\tconst difference_in_distance = distance - last_zoom_pointer_distance;\n\t\tlet new_magnification = magnification;\n\t\tif (Math.abs(difference_in_distance) > 60) {\n\t\t\tlast_zoom_pointer_distance = distance;\n\t\t\tif (difference_in_distance > 0) {\n\t\t\t\tnew_magnification *= 1.5;\n\t\t\t} else {\n\t\t\t\tnew_magnification /= 1.5;\n\t\t\t}\n\t\t}\n\t\tnew_magnification = Math.max(0.5, Math.min(new_magnification, 40));\n\t\tif (new_magnification != magnification) {\n\t\t\tset_magnification(new_magnification, to_canvas_coords({ clientX: current_pos.x, clientY: current_pos.y }));\n\t\t}\n\t\tconst difference_in_x = current_pos.x - pan_last_pos.x;\n\t\tconst difference_in_y = current_pos.y - pan_last_pos.y;\n\t\t$canvas_area.scrollLeft($canvas_area.scrollLeft() - difference_in_x);\n\t\t$canvas_area.scrollTop($canvas_area.scrollTop() - difference_in_y);\n\t\tpan_last_pos = current_pos;\n\t}\n});\n// #endregion\n\n// #region Primary Canvas Interaction (continued)\n$canvas.on(\"pointerdown\", (e) => {\n\tupdate_canvas_rect();\n\n\t// Quick Undo when there are multiple pointers (i.e. for touch)\n\t// see pointermove for other pointer types\n\t// SEE OTHER POINTERDOWN HANDLER ALSO\n\t// NOTE: this relies on event handler order for pointerdown\n\t// pointer is not added to pointers yet\n\tif (pointers.length >= 1) {\n\t\t// If you press two fingers quickly, it shouldn't make a new history entry.\n\t\t// But if you draw something and then press a second finger to clear it, it should let you redo.\n\t\tconst discard_document_state = first_pointer_time && performance.now() - first_pointer_time < discard_quick_undo_period;\n\t\tcancel(false, discard_document_state);\n\t\tpointer_active = false; // NOTE: pointer_active used in cancel(); must be set after cancel()\n\n\t\t// in Dwell Clicker mode, allow drawing with mouse after canceling dwell gesture with mouse\n\t\tpointers = pointers.filter((pointer) =>\n\t\t\tpointer.pointerId !== 1234567890\n\t\t);\n\t\treturn;\n\t}\n\n\thistory_node_to_cancel_to = current_history_node;\n\n\tpointer_active = !!(e.buttons & (1 | 2)); // as far as tools are concerned\n\tpointer_type = e.pointerType;\n\tpointer_buttons = e.buttons;\n\t$G.one(\"pointerup\", (e) => {\n\t\tpointer_active = false;\n\t\tupdate_helper_layer(e);\n\n\t\tif (!pointer_over_canvas && update_helper_layer_on_pointermove_active) {\n\t\t\t$G.off(\"pointermove\", update_helper_layer);\n\t\t\tupdate_helper_layer_on_pointermove_active = false;\n\t\t}\n\t});\n\n\tif (e.button === 0) {\n\t\treverse = false;\n\t} else if (e.button === 2) {\n\t\treverse = true;\n\t} else {\n\t\treturn;\n\t}\n\n\tbutton = e.button;\n\tctrl = e.ctrlKey;\n\tshift = e.shiftKey;\n\tpointer_start = pointer_previous = pointer = to_canvas_coords(e);\n\n\tconst pointerdown_action = () => {\n\t\tlet interval_ids = [];\n\t\tselected_tools.forEach((selected_tool) => {\n\t\t\tif (selected_tool.paint || selected_tool.pointerdown) {\n\t\t\t\ttool_go(selected_tool, \"pointerdown\");\n\t\t\t}\n\t\t\tif (selected_tool.paint_on_time_interval != null) {\n\t\t\t\tinterval_ids.push(setInterval(() => {\n\t\t\t\t\ttool_go(selected_tool);\n\t\t\t\t}, selected_tool.paint_on_time_interval));\n\t\t\t}\n\t\t});\n\n\t\t$G.on(\"pointermove\", canvas_pointer_move);\n\n\t\t$G.one(\"pointerup\", (e, canceling, no_undoable) => {\n\t\t\tbutton = undefined;\n\t\t\treverse = false;\n\n\t\t\tif (e.clientX !== undefined) { // may be synthetic event without coordinates\n\t\t\t\tpointer = to_canvas_coords(e);\n\t\t\t}\n\t\t\t// don't create undoables if you're two-finger-panning\n\t\t\t// @TODO: do any tools use pointerup for cleanup?\n\t\t\tif (!no_undoable) {\n\t\t\t\tselected_tools.forEach((selected_tool) => {\n\t\t\t\t\tselected_tool.pointerup?.(main_ctx, pointer.x, pointer.y);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (selected_tools.length === 1) {\n\t\t\t\tif (selected_tool.deselect) {\n\t\t\t\t\tselect_tools(return_to_tools);\n\t\t\t\t}\n\t\t\t}\n\t\t\t$G.off(\"pointermove\", canvas_pointer_move);\n\t\t\tfor (const interval_id of interval_ids) {\n\t\t\t\tclearInterval(interval_id);\n\t\t\t}\n\n\t\t\tif (!canceling) {\n\t\t\t\thistory_node_to_cancel_to = null;\n\t\t\t}\n\t\t});\n\t};\n\n\tpointerdown_action();\n\n\tupdate_helper_layer(e);\n});\n// #endregion\n\n// #region Deselection / Selection Prevention\n$canvas_area.on(\"pointerdown\", (e) => {\n\tif (e.button === 0) {\n\t\tif ($canvas_area.is(e.target)) {\n\t\t\tif (selection) {\n\t\t\t\tdeselect();\n\t\t\t}\n\t\t}\n\t}\n});\n\nfunction prevent_selection($el) {\n\t$el.on(\"mousedown selectstart contextmenu\", (e) => {\n\t\tif (e.isDefaultPrevented()) {\n\t\t\treturn;\n\t\t}\n\t\tif (\n\t\t\te.target instanceof HTMLSelectElement ||\n\t\t\te.target instanceof HTMLTextAreaElement ||\n\t\t\t(e.target instanceof HTMLLabelElement && e.type !== \"contextmenu\") ||\n\t\t\t(e.target instanceof HTMLInputElement && e.target.type !== \"color\")\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tif (e.button === 1) {\n\t\t\treturn; // allow middle-click scrolling\n\t\t}\n\t\te.preventDefault();\n\t\t// we're just trying to prevent selection\n\t\t// but part of the default for mousedown is *deselection*\n\t\t// so we have to do that ourselves explicitly\n\t\twindow.getSelection().removeAllRanges();\n\t});\n}\n\nprevent_selection($app);\nprevent_selection($toolbox);\n// prevent_selection($toolbox2);\nprevent_selection($colorbox);\n// #endregion\n\n// Stop drawing (or dragging or whatever) if you Alt+Tab or whatever\n$G.on(\"blur\", () => {\n\t$G.triggerHandler(\"pointerup\");\n});\n\n// #region Fullscreen Handling for iOS\n// For Safari on iPad, Fullscreen mode overlays the system bar, completely obscuring our menu bar.\n// See CSS .fullscreen handling (and exit_fullscreen_if_ios) for more info.\nfunction iOS() {\n\treturn (\n\t\t[\n\t\t\t\"iPad Simulator\",\n\t\t\t\"iPhone Simulator\",\n\t\t\t\"iPod Simulator\",\n\t\t\t\"iPad\",\n\t\t\t\"iPhone\",\n\t\t\t\"iPod\",\n\t\t].includes(navigator.platform) ||\n\t\t// iPad on iOS 13 detection\n\t\t(navigator.userAgent.includes(\"Mac\") && \"ontouchend\" in document)\n\t);\n}\n$(\"html\").toggleClass(\"ios\", iOS());\n$G.on(\"fullscreenchange webkitfullscreenchange\", () => {\n\t// const fullscreen = $G.is(\":fullscreen\") || $G.is(\":-webkit-full-screen\"); // gives \"Script error.\"\n\tconst fullscreen = !!(document.fullscreenElement || document.webkitFullscreenElement);\n\t// $status_text.text(`fullscreen: ${fullscreen}`);\n\t$(\"html\").toggleClass(\"fullscreen\", fullscreen);\n});\n// #endregion\n\n// #region Testing Helpers\n// Note: this is defined here so the app is loaded when this is defined.\nwindow.api_for_cypress_tests = {\n\treset_for_next_test() {\n\t\tselected_colors.foreground = \"#000\";\n\t\tselected_colors.background = \"#fff\";\n\t\tbrush_shape = default_brush_shape;\n\t\tbrush_size = default_brush_size;\n\t\teraser_size = default_eraser_size;\n\t\tairbrush_size = default_airbrush_size;\n\t\tpencil_size = default_pencil_size;\n\t\tstroke_size = default_stroke_size;\n\t\tclear();\n\t},\n\tselected_colors,\n\tset_theme,\n\t$,\n};\n// #endregion\n\ninit_webgl_stuff();\n"
  },
  {
    "path": "src/color-data.js",
    "content": "// @ts-check\n\nimport { make_stripe_pattern } from \"./functions.js\";\n\nconst default_palette = [\n\t\"rgb(0,0,0)\", // Black\n\t\"rgb(128,128,128)\", // Dark Gray\n\t\"rgb(128,0,0)\", // Dark Red\n\t\"rgb(128,128,0)\", // Pea Green\n\t\"rgb(0,128,0)\", // Dark Green\n\t\"rgb(0,128,128)\", // Slate\n\t\"rgb(0,0,128)\", // Dark Blue\n\t\"rgb(128,0,128)\", // Lavender\n\t\"rgb(128,128,64)\", //\n\t\"rgb(0,64,64)\", //\n\t\"rgb(0,128,255)\", //\n\t\"rgb(0,64,128)\", //\n\t\"rgb(64,0,255)\", //\n\t\"rgb(128,64,0)\", //\n\n\t\"rgb(255,255,255)\", // White\n\t\"rgb(192,192,192)\", // Light Gray\n\t\"rgb(255,0,0)\", // Bright Red\n\t\"rgb(255,255,0)\", // Yellow\n\t\"rgb(0,255,0)\", // Bright Green\n\t\"rgb(0,255,255)\", // Cyan\n\t\"rgb(0,0,255)\", // Bright Blue\n\t\"rgb(255,0,255)\", // Magenta\n\t\"rgb(255,255,128)\", //\n\t\"rgb(0,255,128)\", //\n\t\"rgb(128,255,255)\", //\n\t\"rgb(128,128,255)\", //\n\t\"rgb(255,0,128)\", //\n\t\"rgb(255,128,64)\", //\n];\nconst monochrome_palette_as_colors = [\n\t\"rgb(0,0,0)\",\n\t\"rgb(9,9,9)\",\n\t\"rgb(18,18,18)\",\n\t\"rgb(27,27,27)\",\n\t\"rgb(37,37,37)\",\n\t\"rgb(46,46,46)\",\n\t\"rgb(55,55,55)\",\n\t\"rgb(63,63,63)\",\n\t\"rgb(73,73,73)\",\n\t\"rgb(82,82,82)\",\n\t\"rgb(92,92,92)\",\n\t\"rgb(101,101,101)\",\n\t\"rgb(110,110,110)\",\n\t\"rgb(119,119,119)\",\n\n\t\"rgb(255,255,255)\",\n\t\"rgb(250,250,250)\",\n\t\"rgb(242,242,242)\",\n\t\"rgb(212,212,212)\",\n\t\"rgb(201,201,201)\",\n\t\"rgb(191,191,191)\",\n\t\"rgb(182,182,182)\",\n\t\"rgb(159,159,159)\",\n\t\"rgb(128,128,128)\",\n\t\"rgb(173,173,173)\",\n\t\"rgb(164,164,164)\",\n\t\"rgb(155,155,155)\",\n\t\"rgb(146,146,146)\",\n\t\"rgb(137,137,137)\",\n];\n\n// https://github.com/kouzhudong/win2k/blob/ce6323f76d5cd7d136b74427dad8f94ee4c389d2/trunk/private/shell/win16/comdlg/color.c#L38-L43\n// These are a fallback in case colors are not received from some driver.\n// const default_basic_colors = [\n// \t\"#8080FF\", \"#80FFFF\", \"#80FF80\", \"#80FF00\", \"#FFFF80\", \"#FF8000\", \"#C080FF\", \"#FF80FF\",\n// \t\"#0000FF\", \"#00FFFF\", \"#00FF80\", \"#40FF00\", \"#FFFF00\", \"#C08000\", \"#C08080\", \"#FF00FF\",\n// \t\"#404080\", \"#4080FF\", \"#00FF00\", \"#808000\", \"#804000\", \"#FF8080\", \"#400080\", \"#8000FF\",\n// \t\"#000080\", \"#0080FF\", \"#008000\", \"#408000\", \"#FF0000\", \"#A00000\", \"#800080\", \"#FF0080\",\n// \t\"#000040\", \"#004080\", \"#004000\", \"#404000\", \"#800000\", \"#400000\", \"#400040\", \"#800040\",\n// \t\"#000000\", \"#008080\", \"#408080\", \"#808080\", \"#808040\", \"#C0C0C0\", \"#400040\", \"#FFFFFF\",\n// ];\n// Grabbed with Color Cop from the screen with Windows 98 SE running in VMWare\nconst basic_colors = [\n\t\"#FF8080\", \"#FFFF80\", \"#80FF80\", \"#00FF80\", \"#80FFFF\", \"#0080FF\", \"#FF80C0\", \"#FF80FF\",\n\t\"#FF0000\", \"#FFFF00\", \"#80FF00\", \"#00FF40\", \"#00FFFF\", \"#0080C0\", \"#8080C0\", \"#FF00FF\",\n\t\"#804040\", \"#FF8040\", \"#00FF00\", \"#008080\", \"#004080\", \"#8080FF\", \"#800040\", \"#FF0080\",\n\t\"#800000\", \"#FF8000\", \"#008000\", \"#008040\", \"#0000FF\", \"#0000A0\", \"#800080\", \"#8000FF\",\n\t\"#400000\", \"#804000\", \"#004000\", \"#004040\", \"#000080\", \"#000040\", \"#400040\", \"#400080\",\n\t\"#000000\", \"#808000\", \"#808040\", \"#808080\", \"#408080\", \"#C0C0C0\", \"#400040\", \"#FFFFFF\",\n];\n// Note: this array gets modified even though the reference to it is constant.\nconst custom_colors = [\n\t\"#FFFFFF\", \"#FFFFFF\", \"#FFFFFF\", \"#FFFFFF\", \"#FFFFFF\", \"#FFFFFF\", \"#FFFFFF\", \"#FFFFFF\",\n\t\"#FFFFFF\", \"#FFFFFF\", \"#FFFFFF\", \"#FFFFFF\", \"#FFFFFF\", \"#FFFFFF\", \"#FFFFFF\", \"#FFFFFF\",\n];\n\nconst lerp = (a, b, b_ness) => a + (b - a) * b_ness;\n\nconst color_ramp = (num_colors, start_hsla, end_hsla) =>\n\tArray(num_colors).fill().map((_undefined, ramp_index, array) => {\n\t\t// TODO: should this use (array.length - 1)?\n\t\tconst h = lerp(start_hsla[0], end_hsla[0], ramp_index / array.length);\n\t\tconst s = lerp(start_hsla[1], end_hsla[1], ramp_index / array.length);\n\t\tconst l = lerp(start_hsla[2], end_hsla[2], ramp_index / array.length);\n\t\tconst a = lerp(start_hsla[3], end_hsla[3], ramp_index / array.length);\n\t\treturn `hsla(${h}deg, ${s}%, ${l}%, ${a})`;\n\t});\n\n/**\n * @returns {(string | CanvasPattern)[]}  A palette of colors and patterns for the Winter theme.\n */\nconst get_winter_palette = () => {\n\tconst make_stripe_patterns = (reverse) => [\n\t\tmake_stripe_pattern(reverse, [\n\t\t\t\"hsl(166, 93%, 38%)\",\n\t\t\t\"white\",\n\t\t]),\n\t\tmake_stripe_pattern(reverse, [\n\t\t\t\"white\",\n\t\t\t\"hsl(355, 78%, 46%)\",\n\t\t]),\n\t\tmake_stripe_pattern(reverse, [\n\t\t\t\"hsl(355, 78%, 46%)\",\n\t\t\t\"white\",\n\t\t\t\"white\",\n\t\t\t\"hsl(355, 78%, 46%)\",\n\t\t\t\"hsl(355, 78%, 46%)\",\n\t\t\t\"hsl(355, 78%, 46%)\",\n\t\t\t\"white\",\n\t\t\t\"white\",\n\t\t\t\"hsl(355, 78%, 46%)\",\n\t\t\t\"white\",\n\t\t], 2),\n\t\tmake_stripe_pattern(reverse, [\n\t\t\t\"hsl(166, 93%, 38%)\",\n\t\t\t\"white\",\n\t\t\t\"white\",\n\t\t\t\"hsl(166, 93%, 38%)\",\n\t\t\t\"hsl(166, 93%, 38%)\",\n\t\t\t\"hsl(166, 93%, 38%)\",\n\t\t\t\"white\",\n\t\t\t\"white\",\n\t\t\t\"hsl(166, 93%, 38%)\",\n\t\t\t\"white\",\n\t\t], 2),\n\t\tmake_stripe_pattern(reverse, [\n\t\t\t\"hsl(166, 93%, 38%)\",\n\t\t\t\"white\",\n\t\t\t\"hsl(355, 78%, 46%)\",\n\t\t\t\"white\",\n\t\t], 2),\n\t];\n\treturn [\n\t\t\"black\",\n\t\t// green\n\t\t\"hsl(91, 55%, 81%)\",\n\t\t\"hsl(142, 57%, 64%)\",\n\t\t\"hsl(166, 93%, 38%)\",\n\t\t\"#04ce1f\", // elf green\n\t\t\"hsl(159, 93%, 16%)\",\n\t\t// red\n\t\t\"hsl(2, 77%, 27%)\",\n\t\t\"hsl(350, 100%, 50%)\",\n\t\t\"hsl(356, 97%, 64%)\",\n\t\t// brown\n\t\t\"#ad4632\",\n\t\t\"#5b3b1d\",\n\t\t// stripes\n\t\t...make_stripe_patterns(false),\n\t\t// white to blue\n\t\t...color_ramp(\n\t\t\t6,\n\t\t\t[200, 100, 100, 100],\n\t\t\t[200, 100, 10, 100],\n\t\t),\n\t\t// pink\n\t\t\"#fcbaf8\",\n\t\t// silver\n\t\t\"hsl(0, 0%, 90%)\",\n\t\t\"hsl(22, 5%, 71%)\",\n\t\t// gold\n\t\t\"hsl(48, 82%, 54%)\",\n\t\t\"hsl(49, 82%, 72%)\",\n\t\t// stripes\n\t\t...make_stripe_patterns(true),\n\t];\n};\n\n\nexport {\n\tbasic_colors, custom_colors, default_palette, get_winter_palette, monochrome_palette_as_colors\n};\n// Temporary globals until all dependent code is converted to ES Modules\nwindow.default_palette = default_palette; // used by app-state.js\n"
  },
  {
    "path": "src/copy-inkscape-labels.js",
    "content": "// This script copies inkscape:label attributes from one SVG to another.\n// I have SVGs with ids that correspond because they're tweaked copies of the same SVG.\n// I added labels to the first SVG, and wanted to copy them to the second SVG.\n// First I tried a proper XML approach, but whitespace wasn't preserved,\n// even when using a library that claims to preserve it. (Maybe this feature only works with JSDOM? I don't know.)\n// Regex is fragile, but it's a reasonably quick way to get a result with a very readable diff,\n// which I consider to be more important than a technically robust transformation that appears to change everything.\n// I also tried opening the SVG in Inkscape and saving it, but it didn't format the SVG even close to the original.\n// And Inkscape has some weird ideas about how to format XML, so I can't just use any old formatter,\n// I would have to find a very configurable one; and if Inkscape won't even format it the way Inkscape wants,\n// I don't have high hopes for that approach.\n// So regexp it is. If I wanted to use this more often, I might look at other libraries for XML manipulation,\n// and consider writing it in other languages, since it's a simple transform, easy to port.\n\n// USAGE: paste this script into the devtools console in the app, updating the URLs as needed.\n// Copy the message (right click -> \"Copy Object\" in Firefox) and paste it into the target file.\n\n// // import { default as XMLSerializer } from \"https://cdn.skypack.dev/@teclone/xml-serializer@1.3.0/build/esm/main.js\";\n\n// async function fetchSVG(url) {\n// \tconst response = await fetch(url);\n// \tconst text = await response.text();\n// \tconst parser = new DOMParser();\n// \treturn parser.parseFromString(text, \"image/svg+xml\");\n// }\n\n// async function applyLabels() {\n// \tconst svgDoc1 = await fetchSVG(\"images/modern/tools-dark.svg\");\n// \tconst svgDoc2 = await fetchSVG(\"images/modern/tools.svg\");\n\n// \t// Find all elements with inkscape:label\n// \tconst labeledElements = svgDoc1.querySelectorAll(\"[inkscape\\\\:label]\");\n\n// \t// Apply labels from first SVG to corresponding elements in the second SVG\n// \tlabeledElements.forEach(labeledElement => {\n// \t\tconst id = labeledElement.getAttribute(\"id\");\n// \t\tconst element = svgDoc2.getElementById(id);\n// \t\tif (element) {\n// \t\t\telement.setAttribute(\"inkscape:label\", labeledElement.getAttribute(\"inkscape:label\"));\n// \t\t}\n// \t});\n\n// \t// Output the resulting XML\n// \tconst serializer = new XMLSerializer(true);\n// \t// const resultXML = serializer.serializeToString(svgDoc2.documentElement);\n// \tconst resultXML = serializer.serializeToString(svgDoc2);\n// \treturn resultXML;\n// }\n\n// applyLabels();\n\nasync function fetchSVGText(url) {\n\tconst response = await fetch(url);\n\tconst text = await response.text();\n\treturn text.replace(/<!-- Code injected by live-server -->[\\s\\S]*<\\/script>\\n?/m, \"\");\n}\n\nasync function applyLabels(sourceURL, targetURL) {\n\tconst sourceSVG = await fetchSVGText(sourceURL);\n\tlet targetSVG = await fetchSVGText(targetURL);\n\n\t// Find all elements with inkscape:label\n\tconst labeledOpeningTags = sourceSVG.match(/<[^>]+\\sinkscape:label=\"([^\"]+)\"[^>]*>/g) || [];\n\n\t// Apply labels from first SVG to corresponding elements in the second SVG\n\tfor (const labeledOpeningTag of labeledOpeningTags) {\n\t\tconst label = labeledOpeningTag.match(/inkscape:label=\"([^\"]+)\"/)[1];\n\t\tconst idMatch = labeledOpeningTag.match(/id=\"([^\"]+)\"/);\n\t\tif (idMatch) {\n\t\t\tconst id = idMatch[1];\n\t\t\tconst regex = new RegExp(`<[^>]+id=\"${id}\"[^>]*>`);\n\t\t\ttargetSVG = targetSVG.replace(regex, (match) => {\n\t\t\t\tif (match.includes(\"inkscape:label\")) {\n\t\t\t\t\treturn match.replace(/inkscape:label=\"[^\"]+\"/, `inkscape:label=\"${label}\"`);\n\t\t\t\t} else {\n\t\t\t\t\treturn match.replace(/(\\s*)(\\/?)>$/, (_match, whitespace, slash) =>\n\t\t\t\t\t\t`${whitespace || \" \"}inkscape:label=\"${label}\"${slash}>`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t// Output the resulting XML\n\treturn targetSVG;\n}\n\n(async () => {\n\tconsole.log(await applyLabels(\"images/classic/tools.svg\", \"images/dark/tools.svg\"));\n})();\n"
  },
  {
    "path": "src/discord-activity-client.js",
    "content": "// @ts-check\n\nimport { save_as_prompt } from \"./functions.js\";\n\n// Discord Embedded App SDK, bundled with Skypack, saved from:\n// https://cdn.skypack.dev/-/@discord/embedded-app-sdk@v1.2.0-QXsdBg8VfgltgT8IEtBP/dist=es2019,mode=imports/optimized/@discord/embedded-app-sdk.js\nconst Discord = await import(\"../lib/discord-embedded-app-sdk-v1.2.0-bundled-with-skypack.js\");\n// @ts-ignore\nwindow._Discord = Discord;\n\nconst CLIENT_ID = \"$$$$$CLIENT_ID$$$$$\"; // monkey-patched in by the server\nconst APPLICATION_ID = CLIENT_ID; // seems to be the same\n\nconst DISCORD_API_BASE = \"https://discord.com/api\";\n\nconst { DiscordSDK } = Discord;\nconst discordSdk = new DiscordSDK(CLIENT_ID);\nawait discordSdk.ready();\n\n// Authorize with Discord Client\nconst { code } = await discordSdk.commands.authorize({\n\tclient_id: CLIENT_ID,\n\tresponse_type: \"code\",\n\tstate: \"\",\n\tprompt: \"none\",\n\t// More info on scopes here: https://discord.com/developers/docs/topics/oauth2#shared-resources-oauth2-scopes\n\tscope: [\n\t\t// At least one scope is required. Otherwise authorize will throw an error.\n\t\t// Likely useful scopes:\n\t\t\"identify\", // for user presence, and including username/avatar in the undo history window (Edit > History)\n\t\t// \"guilds.members.read\", // for server-specific nicknames/avatars\n\t\t// \"messages.read\", // could plug into the interpret_command of Extras > Speech Recognition (not sure how useless this would be on a scale of Google Assistant to Twitch Plays Pokemon)\n\t\t// For Extras > Speech Recognition, could use something like https://github.com/Rei-x/discord-speech-recognition\n\t\t// but that works server-side as a bot. There's \"rpc.voice.read\" but I don't see a way to get the audio stream.\n\t\t// There's also \"voice\"... but the docs are hard to find.\n\t],\n});\n\n// Retrieve an access_token from your embedded app's server\nconst response = await fetch(\"/api/token\", {\n\tmethod: \"POST\",\n\theaders: {\n\t\t\"Content-Type\": \"application/json\",\n\t},\n\tbody: JSON.stringify({\n\t\tcode,\n\t}),\n});\nconst { access_token } = await response.json();\n\n// Authenticate with Discord client (using the access_token)\nconst newAuth = await discordSdk.commands.authenticate({\n\taccess_token,\n});\n\n// Get guild specific nickname and avatar, and fallback to user name and avatar?\n/** @type {IGuildsMembersRead | null} */\nconst guildMember = await fetch(\n\t`/discord/api/users/@me/guilds/${discordSdk.guildId}/member`,\n\t{\n\t\tmethod: \"get\",\n\t\theaders: { Authorization: `Bearer ${access_token}` },\n\t},\n)\n\t.then((j) => j.json())\n\t.catch(() => {\n\t\treturn null;\n\t});\n\nexport function handleExternalLinks() {\n\tdocument.addEventListener(\"click\", (e) => {\n\t\tif (e.defaultPrevented) return;\n\t\tconst target = e.target;\n\t\tif (target instanceof HTMLAnchorElement && target.href && target.target === \"_blank\") {\n\t\t\te.preventDefault();\n\t\t\tdiscordSdk.commands.openExternalLink({ url: target.href });\n\t\t}\n\t});\n\twindow.open = (url) => {\n\t\tdiscordSdk.commands.openExternalLink({ url });\n\t\treturn null;\n\t};\n}\n\nexport async function shareImage(blob, filename) {\n\tconst mimeType = blob.type;\n\n\t// image data as buffer\n\tconst buf = await blob.arrayBuffer();\n\n\t// image as file\n\tconst imageFile = new File([buf], filename, { type: mimeType });\n\n\tconst body = new FormData();\n\tbody.append(\"file\", imageFile);\n\n\tconst attachmentResponse = await fetch(`${DISCORD_API_BASE}/applications/${APPLICATION_ID}/attachment`, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\tAuthorization: `Bearer ${access_token}`,\n\t\t},\n\t\tbody,\n\t});\n\tconst attachmentJson = await attachmentResponse.json();\n\n\t// mediaUrl is an ephemeral Discord CDN URL\n\tconst mediaUrl = attachmentJson.attachment.url;\n\n\t// opens dialog in Discord client\n\tawait discordSdk.commands.openShareMomentDialog({ mediaUrl });\n}\n\n/** @type {Partial<SystemHooks>} */\nexport const discordActivitySystemHooks = {\n\t// named to be distinct from various platform APIs (showSaveFilePicker, saveAs, electron's showSaveDialog; and saveFile is too ambiguous)\n\t// could call it saveFileAs maybe but then it'd be weird that you don't pass in the file directly\n\tshowSaveFileDialog: async ({ formats, defaultFileName, defaultPath: _unused, defaultFileFormatID, getBlob, savedCallbackUnreliable, dialogTitle }) => {\n\n\t\t// Discord has a nice prompt asking you if you want to allow `blob:` URLs, rather than allow a domain (which is the usual case),\n\t\t// but it fails to open a tab with the image or send a download.\n\t\t// const blob_url = URL.createObjectURL(blob);\n\t\t// console.log(\"blob_url\", blob_url);\n\t\t// discordSdk.commands.openExternalLink({ url: blob_url });\n\n\t\t// A data URI doesn't work either.\n\t\t// For a data URI it says it's \"malformed and potentially dangerous\".\n\t\t// Probably just because it's a long string. Not very friendly.\n\t\t// const reader = new FileReader();\n\t\t// reader.onload = () => {\n\t\t// \tconst dataUri = reader.result;\n\t\t// \tdiscordSdk.commands.openExternalLink({ url: dataUri });\n\t\t// };\n\t\t// reader.readAsDataURL(blob);\n\n\t\t// The FS Access API gives\n\t\t//   SecurityError\n\t\t//   Error: Failed to execute 'showSaveFilePicker' on 'Window': Cross origin sub frames aren't allowed to show a file picker.\n\n\t\t// Some other things to try:\n\t\t// - See if the Discord bot API can upload files to a channel\n\t\t// - Upload the file to our Discord Activity server and give a link to that\n\t\t//   - Have to be wary of security, and not allow arbitrary files to be uploaded\n\t\t// - Open an external link to a page that lets you download the file\n\t\t//   - Maybe include the blob URL as a query parameter\n\t\t// - Ask for a new API for downloads, possibly a parameter to openExternalLink\n\t\t// - openShareMomentDialog?\n\t\t//   https://discord.com/developers/docs/activities/development-guides#open-share-moment-dialog\n\t\t//   Oh, there's an \"activities attachment API endpoint (discord.com/api/applications/${applicationId}/attachment) to create an ephemeral CDN URL\"\n\t\t//   ...eventually got it working! see discord-activity-client.js\n\t\t// - Show a dialog and ask users to right click and save the image\n\n\t\tconst { shareImage } = await import(\"./discord-activity-client.js\");\n\n\t\tconst { newFileName, newFileFormatID } = await save_as_prompt({ dialogTitle, defaultFileName, defaultFileFormatID, formats });\n\t\tconst blob = await getBlob(newFileFormatID);\n\t\tawait shareImage(blob, newFileName);\n\t\t// not guaranteed saved, but the share dialog should be shown successfully\n\t\tsavedCallbackUnreliable?.({\n\t\t\tnewFileName,\n\t\t\tnewFileFormatID,\n\t\t\tnewFileHandle: null,\n\t\t\tnewBlob: blob,\n\t\t});\n\t\treturn;\n\t},\n};\n\nexport { Discord, discordSdk, guildMember, newAuth };\n\n// Done with discord-specific setup\n\n// // Now we create a colyseus client\n// const wsUrl = `wss://${location.host}/api/colyseus`;\n// const client = new Client(wsUrl);\n\n// let roomName = \"Channel\";\n\n// // Requesting the channel in GDMs (when the guild ID is null) requires\n// // the dm_channels.read scope which requires Discord approval.\n// if (discordSdk.channelId != null && discordSdk.guildId != null) {\n// \t// Over RPC collect info about the channel\n// \tconst channel = await discordSdk.commands.getChannel({ channel_id: discordSdk.channelId });\n// \tif (channel.name != null) {\n// \t\troomName = channel.name;\n// \t}\n// }\n\n// // Get the user's guild-specific avatar uri\n// // If none, fall back to the user profile avatar\n// // If no main avatar, use a default avatar\n// const avatarUri = getUserAvatarUrl({\n// \tguildMember,\n// \tuser: newAuth.user,\n// });\n// console.log(avatarUri);\n\n// // Get the user's guild nickname. If none set, fall back to global_name, or username\n// // Note - this name is note guaranteed to be unique\n// const name = getUserDisplayName({\n// \tguildMember,\n// \tuser: newAuth.user,\n// });\n// console.log(name);\n\n\n// // The second argument has to include for the room as well as the current player\n// const newRoom = await client.joinOrCreate < State > (GAME_NAME, {\n// \tchannelId: discordSdk.channelId,\n// \troomName,\n// \tuserId: newAuth.user.id,\n// \tname,\n// \tavatarUri,\n// });\n\n// // Finally, we construct our authenticatedContext object to be consumed throughout the app\n// setAuth({ ...newAuth, guildMember, client, room: newRoom });\n"
  },
  {
    "path": "src/edit-colors.js",
    "content": "// @ts-check\n/* global palette:writable */\n/* global $colorbox, localize, main_ctx, monochrome, selected_colors, selection */\nimport { $Swatch, update_$swatch } from \"./$ColorBox.js\";\nimport { $DialogWindow } from \"./$ToolWindow.js\";\n// import { localize } from \"./app-localization.js\";\nimport { basic_colors, custom_colors } from \"./color-data.js\";\nimport { detect_monochrome, make_monochrome_palette, show_error_message, undoable } from \"./functions.js\";\nimport { $G, get_help_folder_icon, get_rgba_from_color, make_canvas, render_access_key, rgb_to_hsl } from \"./helpers.js\";\nimport { replace_color_globally } from \"./image-manipulation.js\";\n\n// @TODO:\n// - Persist custom colors list across reloads? It's not very persistent in real Windows...\n// - maybe use https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/Grid_Role\n// - Question mark button in titlebar that lets you click on parts of UI to ask about them; also context menu \"What's this?\"\n// - For mobile layout, maybe add a way to get back (<<) without adding (potentially overwriting) a custom color\n// - Speech recognition\n//   - Lum as Luminosity, Luminance, Lightness, maybe even Brightness\n//   - Sat as Saturation\n//   - Add / Add Color / Add Custom Color for Add To Custom Colors or if not available then Define Custom Colors >>\n//   - Set green to 50 etc.\n\n// In Windows, the Hue goes from 0 to 239 (240 being equivalent to 0), and Sat and Lum go from 0 to 240\n// I think people are more familiar with degrees and percentages, so I don't think I'll be implementing that.\n\n// Development workflow:\n// - In the console, set localStorage.dev_edit_colors = \"true\";\n// - Reload the page\n// - Load a screenshot of the Edit Colors window into the editor\n// - Position it finely using the arrow keys on a selection\n// - For measuring positions, look at the Windows source code OR:\n//   - close the window,\n//   - point on the canvas, mark down the coordinates shown in status bar,\n//   - point on the canvas at the origin\n//     - the top left of the inside of the window, or\n//     - the top left of (what corresponds to) the nearest parent position:fixed/absolute/relative\n//   - subtract the origin from the target\n\nlet $edit_colors_window;\n\nlet dev_edit_colors = false;\ntry {\n\tdev_edit_colors = localStorage.dev_edit_colors === \"true\";\n} catch (_error) { /* ignore */ }\nif (dev_edit_colors) {\n\t$(() => {\n\t\tshow_edit_colors_window();\n\t\t$(\".define-custom-colors-button\").click();\n\t\t$edit_colors_window.css({\n\t\t\tleft: 80,\n\t\t\ttop: 50,\n\t\t\topacity: 0.5,\n\t\t});\n\t});\n}\n\n/**\n * Paint-specific handling of color picking.\n *\n * Note: It always updates a cell in the palette and one of the color selections.\n * When the dialog is opened, it always starts[1] with one of the color selections,\n * which lets you use the color picker and then add a custom color based on that.\n * [1]: It may not show the color in the grid, but it will in the custom colors area.\n *\n * @param {JQuery<HTMLDivElement>=} $swatch_to_edit\n * @param {ColorSelectionSlot=} color_selection_slot_to_edit\n */\nfunction show_edit_colors_window($swatch_to_edit, color_selection_slot_to_edit) {\n\t// console.log($swatch_to_edit, $colorbox.data(\"$last_fg_color_button\"));\n\t$swatch_to_edit = $swatch_to_edit || $colorbox.data(\"$last_fg_color_button\");\n\tcolor_selection_slot_to_edit = color_selection_slot_to_edit || \"foreground\";\n\n\tconst $palette = $swatch_to_edit.closest(\".palette, .color-box\");\n\tconst swatch_index = $palette.find(\".swatch\").toArray().indexOf($swatch_to_edit[0]);\n\tconst initial_color = selected_colors[color_selection_slot_to_edit];\n\tchoose_color(initial_color, (color) => {\n\t\t// The palette may have changed or rerendered due to switching themes,\n\t\t// toggling vertical color box mode, or monochrome document mode.\n\t\t$swatch_to_edit = $(/** @type {HTMLDivElement} */($palette.find(\".swatch\")[swatch_index]));\n\t\tif (!$swatch_to_edit.length) {\n\t\t\tshow_error_message(\"Swatch no longer exists.\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (monochrome && (swatch_index === 0 || swatch_index === 14)) {\n\t\t\t// when editing first color in first or second row (the solid base colors),\n\t\t\t// update whole monochrome patterns palette and image\n\t\t\tlet old_rgba = get_rgba_from_color(palette[swatch_index]);\n\t\t\tconst new_rgba = get_rgba_from_color(color);\n\t\t\tconst other_rgba = get_rgba_from_color(palette[14 - swatch_index]);\n\t\t\tconst main_monochrome_info = detect_monochrome(main_ctx);\n\t\t\tconst selection_monochrome_info = (selection && selection.canvas) ? detect_monochrome(selection.canvas.ctx) : main_monochrome_info;\n\t\t\tconst selection_matches_main_canvas_colors =\n\t\t\t\tselection_monochrome_info.isMonochrome &&\n\t\t\t\tselection_monochrome_info.presentNonTransparentRGBAs.every((rgba) =>\n\t\t\t\t\tmain_monochrome_info.presentNonTransparentRGBAs.map((rgba) => rgba.toString()).includes(rgba.toString())\n\t\t\t\t);\n\t\t\tif (\n\t\t\t\tmain_monochrome_info.isMonochrome &&\n\t\t\t\tselection_monochrome_info.isMonochrome &&\n\t\t\t\tselection_matches_main_canvas_colors\n\t\t\t) {\n\t\t\t\tconst recolor = (ctx, present_rgbas) => {\n\t\t\t\t\t// HTML5 Canvas API is unreliable for exact colors.\n\t\t\t\t\t// 1. The specifications specify unpremultiplied alpha, but in practice browsers use premultiplied alpha for performance.\n\t\t\t\t\t// 2. Some browsers implement protections against fingerprinting that return slightly random data\n\t\t\t\t\t// 3. There may be color profiles that affect returned pixel values vs color table values when loading images.\n\t\t\t\t\t//    (BMPs are supposed to be able to embed ICC profiles although I doubt it's prevalent.\n\t\t\t\t\t//    Some global system color profile might apply however, I don't know how all that works.)\n\t\t\t\t\tif (\n\t\t\t\t\t\tpresent_rgbas.length === 2 &&\n\t\t\t\t\t\tpresent_rgbas.every((present_rgba) => `${present_rgba}` !== `${old_rgba}`)\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Find the nearer color in the image data to replace.\n\t\t\t\t\t\tconst distances = present_rgbas.map((rgba) =>\n\t\t\t\t\t\t\tMath.abs(rgba[0] - old_rgba[0]) +\n\t\t\t\t\t\t\tMath.abs(rgba[1] - old_rgba[1]) +\n\t\t\t\t\t\t\tMath.abs(rgba[2] - old_rgba[2]) +\n\t\t\t\t\t\t\tMath.abs(rgba[3] - old_rgba[3])\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (distances[0] < distances[1]) {\n\t\t\t\t\t\t\told_rgba = present_rgbas[0];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\told_rgba = present_rgbas[1];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst image_data = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);\n\t\t\t\t\treplace_color_globally(image_data, old_rgba[0], old_rgba[1], old_rgba[2], old_rgba[3], new_rgba[0], new_rgba[1], new_rgba[2], new_rgba[3]);\n\t\t\t\t\tctx.putImageData(image_data, 0, 0);\n\t\t\t\t};\n\t\t\t\tundoable({\n\t\t\t\t\tname: \"Recolor\",\n\t\t\t\t\ticon: get_help_folder_icon(\"p_color.png\"),\n\t\t\t\t}, () => {\n\t\t\t\t\trecolor(main_ctx, main_monochrome_info.presentNonTransparentRGBAs);\n\t\t\t\t\tif (selection && selection.canvas) {\n\t\t\t\t\t\trecolor(selection.canvas.ctx, selection_monochrome_info.presentNonTransparentRGBAs);\n\t\t\t\t\t\t// I feel like this shouldn't be necessary, if I'm not changing the size, but it makes it work:\n\t\t\t\t\t\tselection.replace_source_canvas(selection.canvas);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (swatch_index) {\n\t\t\t\tpalette = make_monochrome_palette(other_rgba, new_rgba);\n\t\t\t} else {\n\t\t\t\tpalette = make_monochrome_palette(new_rgba, other_rgba);\n\t\t\t}\n\t\t\t$colorbox.rebuild_palette();\n\t\t\tselected_colors.foreground = palette[0];\n\t\t\tselected_colors.background = palette[14]; // first in second row\n\t\t\tselected_colors.ternary = \"\";\n\t\t\t$G.triggerHandler(\"option-changed\");\n\t\t} else {\n\t\t\tpalette[swatch_index] = color;\n\t\t\tupdate_$swatch($swatch_to_edit, color);\n\t\t\tselected_colors[color_selection_slot_to_edit] = color;\n\t\t\t$G.triggerHandler(\"option-changed\");\n\t\t\twindow.console?.log(`Updated palette: ${palette.map(() => \"%c█\").join(\"\")}`, ...palette.map((color) => `color: ${color};`));\n\t\t}\n\t});\n}\n\n// Repurposable color picker modeled after the Windows system color picker\nfunction choose_color(initial_color, callback) {\n\tif ($edit_colors_window) {\n\t\t$edit_colors_window.close();\n\t}\n\tconst $w = $DialogWindow(localize(\"Edit Colors\"));\n\t$w.addClass(\"edit-colors-window\");\n\t$edit_colors_window = $w;\n\n\tlet hue_degrees = 0;\n\tlet sat_percent = 50;\n\tlet lum_percent = 50;\n\n\tlet custom_colors_index = 0;\n\n\tconst get_current_color = () => `hsl(${hue_degrees}deg, ${sat_percent}%, ${lum_percent}%)`;\n\tconst set_color_from_rgb = (r, g, b) => {\n\t\tconst [h, s, l] = rgb_to_hsl(r, g, b);\n\t\thue_degrees = h * 360;\n\t\tsat_percent = s * 100;\n\t\tlum_percent = l * 100;\n\t};\n\tconst set_color = (color) => {\n\t\tconst [r, g, b] = get_rgba_from_color(color);\n\t\tset_color_from_rgb(r, g, b);\n\t};\n\tconst select = ($swatch) => {\n\t\t$w.$content.find(\".swatch\").removeClass(\"selected\");\n\t\t$swatch.addClass(\"selected\");\n\t\tset_color($swatch[0].dataset.color);\n\t\tif ($swatch.closest(\"#custom-colors\")) {\n\t\t\tcustom_colors_index = Math.max(0, custom_colors_swatches_list_order.indexOf(\n\t\t\t\t$custom_colors_grid.find(\".swatch.selected\")[0]\n\t\t\t));\n\t\t}\n\t\tupdate_inputs(\"hslrgb\");\n\t};\n\n\tconst make_color_grid = (colors, id) => {\n\t\tconst $color_grid = $(`<div class=\"color-grid\" tabindex=\"0\">`).attr({ id });\n\t\tfor (const color of colors) {\n\t\t\tconst $swatch = $Swatch(color);\n\t\t\t$swatch.appendTo($color_grid).addClass(\"inset-deep\");\n\t\t\t$swatch.attr(\"tabindex\", -1); // can be focused by clicking or calling focus() but not by tabbing\n\t\t}\n\t\tlet $local_last_focus = $color_grid.find(\".swatch:first-child\");\n\t\tconst num_colors_per_row = 8;\n\t\tconst navigate = (relative_index) => {\n\t\t\tconst $focused = $color_grid.find(\".swatch:focus\");\n\t\t\tif (!$focused.length) { return; }\n\t\t\tconst $swatches = $color_grid.find(\".swatch\");\n\t\t\tconst from_index = $swatches.toArray().indexOf($focused[0]);\n\t\t\tif (relative_index === -1 && (from_index % num_colors_per_row) === 0) { return; }\n\t\t\tif (relative_index === +1 && (from_index % num_colors_per_row) === num_colors_per_row - 1) { return; }\n\t\t\tconst to_index = from_index + relative_index;\n\t\t\tconst $to_focus = $($swatches.toArray()[to_index]);\n\t\t\t// console.log({from_index, to_index, $focused, $to_focus});\n\t\t\tif (!$to_focus.length) { return; }\n\t\t\t$to_focus.focus();\n\t\t};\n\t\t$color_grid.on(\"keydown\", (event) => {\n\t\t\t// console.log(event.code);\n\t\t\tif (event.code === \"ArrowRight\") { navigate(+1); }\n\t\t\tif (event.code === \"ArrowLeft\") { navigate(-1); }\n\t\t\tif (event.code === \"ArrowDown\") { navigate(+num_colors_per_row); }\n\t\t\tif (event.code === \"ArrowUp\") { navigate(-num_colors_per_row); }\n\t\t\tif (event.code === \"Home\") { $color_grid.find(\".swatch:first-child\").focus(); }\n\t\t\tif (event.code === \"End\") { $color_grid.find(\".swatch:last-child\").focus(); }\n\t\t\tif (event.code === \"Space\" || event.code === \"Enter\") {\n\t\t\t\tselect($color_grid.find(\".swatch:focus\"));\n\t\t\t\tdraw();\n\t\t\t}\n\t\t});\n\t\t$color_grid.on(\"pointerdown\", (event) => {\n\t\t\tconst $swatch = $(event.target).closest(\".swatch\");\n\t\t\tif ($swatch.length) {\n\t\t\t\tselect($swatch);\n\t\t\t\tdraw();\n\t\t\t}\n\t\t});\n\t\t$color_grid.on(\"dragstart\", (event) => {\n\t\t\tevent.preventDefault();\n\t\t});\n\t\t$color_grid.on(\"focusin\", (event) => {\n\t\t\tif (event.target.closest(\".swatch\")) {\n\t\t\t\t$local_last_focus = $(/** @type {HTMLElement} */(event.target.closest(\".swatch\")));\n\t\t\t} else {\n\t\t\t\tif (!$local_last_focus.is(\":focus\")) { // prevent infinite recursion\n\t\t\t\t\t$local_last_focus.focus();\n\t\t\t\t}\n\t\t\t}\n\t\t\t// allow shift+tabbing out of the control\n\t\t\t// otherwise it keeps setting focus back to the color cell,\n\t\t\t// since the parent grid is previous in the tab order\n\t\t\t$color_grid.attr(\"tabindex\", -1);\n\t\t});\n\t\t$color_grid.on(\"focusout\", () => {\n\t\t\t$color_grid.attr(\"tabindex\", 0);\n\t\t});\n\t\treturn $color_grid;\n\t};\n\tconst $left_right_split = $(`<div class=\"left-right-split\">`).appendTo($w.$main);\n\tconst $left = $(`<div class=\"left-side\">`).appendTo($left_right_split);\n\tconst $right = $(`<div class=\"right-side\">`).appendTo($left_right_split).hide();\n\t$left.append(`<label for=\"basic-colors\">${render_access_key(\"&Basic colors:\")}</label>`);\n\tconst $basic_colors_grid = make_color_grid(basic_colors, \"basic-colors\").appendTo($left);\n\t$left.append(`<label for=\"custom-colors\">${render_access_key(\"&Custom colors:\")}</label>`);\n\tconst custom_colors_dom_order = []; // (wanting) horizontal top to bottom\n\tfor (let list_index = 0; list_index < custom_colors.length; list_index++) {\n\t\tconst row = list_index % 2;\n\t\tconst column = Math.floor(list_index / 2);\n\t\tconst dom_index = row * 8 + column;\n\t\tcustom_colors_dom_order[dom_index] = custom_colors[list_index];\n\t}\n\tconst $custom_colors_grid = make_color_grid(custom_colors_dom_order, \"custom-colors\").appendTo($left);\n\tconst custom_colors_swatches_dom_order = $custom_colors_grid.find(\".swatch\").toArray(); // horizontal top to bottom\n\tconst custom_colors_swatches_list_order = []; // (wanting) vertical left to right\n\tfor (let dom_index = 0; dom_index < custom_colors_swatches_dom_order.length; dom_index++) {\n\t\tconst row = Math.floor(dom_index / 8);\n\t\tconst column = dom_index % 8;\n\t\tconst list_index = column * 2 + row;\n\t\tcustom_colors_swatches_list_order[list_index] = custom_colors_swatches_dom_order[dom_index];\n\t\t// custom_colors_swatches_list_order[list_index].textContent = list_index; // visualization\n\t}\n\n\tconst $define_custom_colors_button = $(`<button class=\"define-custom-colors-button\" type=\"button\">`)\n\t\t.html(render_access_key(\"&Define Custom Colors >>\"))\n\t\t.appendTo($left)\n\t\t.on(\"click\", (e) => {\n\t\t\t// prevent the form from submitting\n\t\t\t// @TODO: instead, prevent the form's submit event in $Window.js in os-gui (or don't have a form? idk)\n\t\t\te.preventDefault();\n\n\t\t\t$right.show();\n\t\t\t$w.addClass(\"defining-custom-colors\"); // for mobile layout\n\t\t\t$define_custom_colors_button.attr(\"disabled\", \"disabled\");\n\t\t\t// assuming small viewport implies mobile implies an onscreen keyboard,\n\t\t\t// and that you probably don't want to use the keyboard to choose colors\n\t\t\tif ($w.width() >= 300) {\n\t\t\t\tinputs_by_component_letter.h.focus();\n\t\t\t}\n\t\t\tmaybe_reenable_button_for_mobile_navigation();\n\t\t});\n\n\t// for mobile layout, re-enable button because it's a navigation button in that case, rather than one-time expand action\n\tconst maybe_reenable_button_for_mobile_navigation = () => {\n\t\t// if ($right.is(\":hidden\")) {\n\t\tif ($w.width() < 300 || document.body.classList.contains(\"enlarge-ui\")) {\n\t\t\t$define_custom_colors_button.removeAttr(\"disabled\");\n\t\t}\n\t};\n\t$(window).on(\"resize\", maybe_reenable_button_for_mobile_navigation);\n\n\tconst $color_solid_label = $(`<label for=\"color-solid-canvas\">${render_access_key(\"Color|S&olid\")}</label>`);\n\t$color_solid_label.css({\n\t\tposition: \"absolute\",\n\t\tleft: 10,\n\t\ttop: 244,\n\t});\n\n\tconst rainbow_canvas = make_canvas(175, 187);\n\tconst luminosity_canvas = make_canvas(10, 187);\n\tconst result_canvas = make_canvas(58, 40);\n\tconst lum_arrow_canvas = make_canvas(5, 9);\n\n\t$(result_canvas).css({\n\t\tposition: \"absolute\",\n\t\tleft: 10,\n\t\ttop: 198,\n\t});\n\n\tlet mouse_down_on_rainbow_canvas = false;\n\tlet crosshair_shown_on_rainbow_canvas = false;\n\tconst draw = () => {\n\t\tif (!mouse_down_on_rainbow_canvas || crosshair_shown_on_rainbow_canvas) {\n\t\t\t// rainbow\n\t\t\tfor (let y = 0; y < rainbow_canvas.height; y += 6) {\n\t\t\t\tfor (let x = -1; x < rainbow_canvas.width; x += 3) {\n\t\t\t\t\trainbow_canvas.ctx.fillStyle = `hsl(${x / rainbow_canvas.width * 360}deg, ${(1 - y / rainbow_canvas.height) * 100}%, 50%)`;\n\t\t\t\t\trainbow_canvas.ctx.fillRect(x, y, 3, 6);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// crosshair\n\t\t\tif (!mouse_down_on_rainbow_canvas) {\n\t\t\t\tconst x = ~~(hue_degrees / 360 * rainbow_canvas.width);\n\t\t\t\tconst y = ~~((1 - sat_percent / 100) * rainbow_canvas.height);\n\t\t\t\trainbow_canvas.ctx.fillStyle = \"black\";\n\t\t\t\trainbow_canvas.ctx.fillRect(x - 1, y - 9, 3, 5);\n\t\t\t\trainbow_canvas.ctx.fillRect(x - 1, y + 5, 3, 5);\n\t\t\t\trainbow_canvas.ctx.fillRect(x - 9, y - 1, 5, 3);\n\t\t\t\trainbow_canvas.ctx.fillRect(x + 5, y - 1, 5, 3);\n\t\t\t}\n\t\t\tcrosshair_shown_on_rainbow_canvas = !mouse_down_on_rainbow_canvas;\n\t\t}\n\n\t\tfor (let y = -2; y < luminosity_canvas.height; y += 6) {\n\t\t\tluminosity_canvas.ctx.fillStyle = `hsl(${hue_degrees}deg, ${sat_percent}%, ${(1 - y / luminosity_canvas.height) * 100}%)`;\n\t\t\tluminosity_canvas.ctx.fillRect(0, y, luminosity_canvas.width, 6);\n\t\t}\n\n\t\tlum_arrow_canvas.ctx.fillStyle = getComputedStyle($w.$content[0]).getPropertyValue(\"--ButtonText\");\n\t\tfor (let x = 0; x < lum_arrow_canvas.width; x++) {\n\t\t\tlum_arrow_canvas.ctx.fillRect(x, lum_arrow_canvas.width - x - 1, 1, 1 + x * 2);\n\t\t}\n\t\tlum_arrow_canvas.style.position = \"absolute\";\n\t\tlum_arrow_canvas.style.left = \"215px\";\n\t\tlum_arrow_canvas.style.top = `${3 + ~~((1 - lum_percent / 100) * luminosity_canvas.height)}px`;\n\n\t\tresult_canvas.ctx.fillStyle = get_current_color();\n\t\tresult_canvas.ctx.fillRect(0, 0, result_canvas.width, result_canvas.height);\n\t};\n\tdraw();\n\t$(rainbow_canvas).addClass(\"rainbow-canvas inset-shallow\");\n\t$(luminosity_canvas).addClass(\"luminosity-canvas inset-shallow\");\n\t$(result_canvas).addClass(\"result-color-canvas inset-shallow\").attr(\"id\", \"color-solid-canvas\");\n\n\tconst select_hue_sat = (event) => {\n\t\thue_degrees = Math.min(1, Math.max(0, event.offsetX / rainbow_canvas.width)) * 360;\n\t\tsat_percent = Math.min(1, Math.max(0, (1 - event.offsetY / rainbow_canvas.height))) * 100;\n\t\tupdate_inputs(\"hsrgb\");\n\t\tdraw();\n\t\tevent.preventDefault();\n\t};\n\t$(rainbow_canvas).on(\"pointerdown\", (event) => {\n\t\tmouse_down_on_rainbow_canvas = true;\n\t\tselect_hue_sat(event);\n\n\t\t$(rainbow_canvas).on(\"pointermove\", select_hue_sat);\n\t\tif (event.pointerId !== 1234567890) { // for Dwell Clicker simulated clicks\n\t\t\trainbow_canvas.setPointerCapture(event.pointerId);\n\t\t}\n\t});\n\t$G.on(\"pointerup pointercancel\", () => {\n\t\t$(rainbow_canvas).off(\"pointermove\", select_hue_sat);\n\t\t// rainbow_canvas.releasePointerCapture(event.pointerId);\n\t\tmouse_down_on_rainbow_canvas = false;\n\t\tdraw();\n\t});\n\n\tconst select_lum = (event) => {\n\t\tlum_percent = Math.min(1, Math.max(0, (1 - event.offsetY / luminosity_canvas.height))) * 100;\n\t\tupdate_inputs(\"lrgb\");\n\t\tdraw();\n\t\tevent.preventDefault();\n\t};\n\t$(luminosity_canvas).on(\"pointerdown\", (event) => {\n\t\tselect_lum(event);\n\n\t\t$(luminosity_canvas).on(\"pointermove\", select_lum);\n\t\tif (event.pointerId !== 1234567890) { // for Dwell Clicker simulated clicks\n\t\t\tluminosity_canvas.setPointerCapture(event.pointerId);\n\t\t}\n\t});\n\t$G.on(\"pointerup pointercancel\", () => {\n\t\t$(luminosity_canvas).off(\"pointermove\", select_lum);\n\t\t// luminosity_canvas.releasePointerCapture(event.pointerId);\n\t});\n\n\tconst inputs_by_component_letter = {};\n\n\t[\"hsl\", \"rgb\"].forEach((color_model, color_model_index) => {\n\t\t[...color_model].forEach((component_letter, component_index) => {\n\t\t\tconst text_with_hotkey = {\n\t\t\t\th: \"Hu&e:\",\n\t\t\t\ts: \"&Sat:\",\n\t\t\t\tl: \"&Lum:\",\n\t\t\t\tr: \"&Red:\",\n\t\t\t\tg: \"&Green:\",\n\t\t\t\tb: \"Bl&ue:\",\n\t\t\t}[component_letter];\n\t\t\tconst input = document.createElement(\"input\");\n\t\t\t// not doing type=\"number\" because the inputs have no up/down buttons and they have special behavior with validation\n\t\t\tinput.type = \"text\";\n\t\t\tinput.classList.add(\"inset-deep\");\n\t\t\tinput.dataset.componentLetter = component_letter;\n\t\t\tinput.dataset.min = \"0\";\n\t\t\tinput.dataset.max = {\n\t\t\t\th: 360,\n\t\t\t\ts: 100,\n\t\t\t\tl: 100,\n\t\t\t\tr: 255,\n\t\t\t\tg: 255,\n\t\t\t\tb: 255,\n\t\t\t}[component_letter];\n\t\t\tconst label = document.createElement(\"label\");\n\t\t\tlabel.innerHTML = render_access_key(text_with_hotkey);\n\t\t\tconst input_y_spacing = 22;\n\t\t\t$(label).css({\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: 63 + color_model_index * 80,\n\t\t\t\ttop: 202 + component_index * input_y_spacing,\n\t\t\t\ttextAlign: \"right\",\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\twidth: 40,\n\t\t\t\theight: 20,\n\t\t\t\tlineHeight: \"20px\",\n\t\t\t});\n\t\t\t$(input).css({\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: 106 + color_model_index * 80,\n\t\t\t\ttop: 202 + component_index * input_y_spacing + (component_index > 1 ? 1 : 0), // spacing of rows is uneven by a pixel\n\t\t\t\twidth: 21,\n\t\t\t\theight: 14,\n\t\t\t});\n\t\t\t$right.append(label, input);\n\n\t\t\tinputs_by_component_letter[component_letter] = input;\n\t\t});\n\t});\n\n\t// listening for input events on input elements using event delegation (looks a little weird)\n\t$right.on(\"input\", \"input\", (event) => {\n\t\tconst input = event.target;\n\t\tconst component_letter = input.dataset.componentLetter;\n\t\tif (component_letter) {\n\t\t\t// In Windows, it actually only updates if the numerical value changes, not just the text.\n\t\t\t// That is, you can add leading zeros, and they'll stay, then add them in the other color model\n\t\t\t// and it won't remove the ones in the fields of the first color model.\n\t\t\t// This is not important, so I don't know if I'll do that.\n\n\t\t\tif (input.value.match(/^\\d+$/)) {\n\t\t\t\tlet n = Number(input.value);\n\t\t\t\tif (n < input.dataset.min) {\n\t\t\t\t\tn = input.dataset.min;\n\t\t\t\t\tinput.value = n;\n\t\t\t\t} else if (n > input.dataset.max) {\n\t\t\t\t\tn = input.dataset.max;\n\t\t\t\t\tinput.value = n;\n\t\t\t\t}\n\t\t\t\tif (\"hsl\".indexOf(component_letter) > -1) {\n\t\t\t\t\tswitch (component_letter) {\n\t\t\t\t\t\tcase \"h\":\n\t\t\t\t\t\t\thue_degrees = n;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"s\":\n\t\t\t\t\t\t\tsat_percent = n;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"l\":\n\t\t\t\t\t\t\tlum_percent = n;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tupdate_inputs(\"rgb\");\n\t\t\t\t} else {\n\t\t\t\t\tlet [r, g, b] = get_rgba_from_color(get_current_color());\n\t\t\t\t\tconst rgb = { r, g, b };\n\t\t\t\t\trgb[component_letter] = n;\n\t\t\t\t\tset_color_from_rgb(rgb.r, rgb.g, rgb.b);\n\t\t\t\t\tupdate_inputs(\"hsl\");\n\t\t\t\t}\n\t\t\t\tdraw();\n\t\t\t} else if (input.value.length) {\n\t\t\t\tupdate_inputs(component_letter);\n\t\t\t\tinput.select();\n\t\t\t}\n\t\t}\n\t});\n\t$right.on(\"focusout\", \"input\", (event) => {\n\t\tconst input = event.target;\n\t\tconst component_letter = input.dataset.componentLetter;\n\t\tif (component_letter) {\n\t\t\t// Handle empty input when focus moves away\n\t\t\tif (!input.value.match(/^\\d+$/)) {\n\t\t\t\tupdate_inputs(component_letter);\n\t\t\t\tinput.select();\n\t\t\t}\n\t\t}\n\t});\n\n\t$w.on(\"keydown\", (event) => {\n\t\t// For some reason Enter isn't working to submit the form. (Am I preventing it somewhere?)\n\t\t// It's understandable that it wouldn't work for my custom grid controls,\n\t\t// but it's not submitting even when regular inputs are focused.\n\t\tif (event.code === \"Enter\" && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) {\n\t\t\t// There are no controls in this dialog that need to handle Enter like a multi-line textarea,\n\t\t\t// other than buttons, which should trigger the specific button,\n\t\t\t// and color cells, which should select the color and submit the dialog.\n\t\t\t// The color should be already selected, by the more specific event handler, as the event bubbles up.\n\t\t\tif (!event.target.closest(\"button\")) {\n\t\t\t\tcallback(get_current_color());\n\t\t\t\t$w.close();\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) {\n\t\t\tswitch (event.key) {\n\t\t\t\tcase \"o\":\n\t\t\t\t\tset_color(get_current_color());\n\t\t\t\t\tupdate_inputs(\"hslrgb\");\n\t\t\t\t\tdraw();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"b\":\n\t\t\t\t\t$basic_colors_grid.find(\".swatch.selected, .swatch\").focus();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"c\":\n\t\t\t\t\t$basic_colors_grid.find(\".swatch.selected, .swatch\").focus();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"e\":\n\t\t\t\t\tinputs_by_component_letter.h.focus();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"s\":\n\t\t\t\t\tinputs_by_component_letter.s.focus();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"l\":\n\t\t\t\t\tinputs_by_component_letter.l.focus();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"r\":\n\t\t\t\t\tinputs_by_component_letter.r.focus();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"g\":\n\t\t\t\t\tinputs_by_component_letter.g.focus();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"u\":\n\t\t\t\t\tinputs_by_component_letter.b.focus();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"a\":\n\t\t\t\t\tif ($add_to_custom_colors_button.is(\":visible\")) {\n\t\t\t\t\t\t$add_to_custom_colors_button.click();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"d\":\n\t\t\t\t\t$define_custom_colors_button.click();\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\treturn; // don't prevent default by default\n\t\t\t}\n\t\t} else {\n\t\t\treturn; // don't prevent default by default\n\t\t}\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t});\n\n\tconst update_inputs = (components) => {\n\t\tfor (const component_letter of components) {\n\t\t\tconst input = inputs_by_component_letter[component_letter];\n\t\t\tconst [r, g, b] = get_rgba_from_color(get_current_color());\n\t\t\tinput.value = Math.floor({\n\t\t\t\th: hue_degrees,\n\t\t\t\ts: sat_percent,\n\t\t\t\tl: lum_percent,\n\t\t\t\tr,\n\t\t\t\tg,\n\t\t\t\tb,\n\t\t\t}[component_letter]);\n\t\t}\n\t};\n\n\t$right.append(rainbow_canvas, luminosity_canvas, result_canvas, $color_solid_label, lum_arrow_canvas);\n\n\tconst $add_to_custom_colors_button = $(`<button class=\"add-to-custom-colors-button\" type=\"button\">`)\n\t\t.html(render_access_key(\"&Add To Custom Colors\"))\n\t\t.appendTo($right)\n\t\t.on(\"click\", (event) => {\n\t\t\t// prevent the form from submitting\n\t\t\t// @TODO: instead, prevent the form's submit event in $Window.js in os-gui (or don't have a form? idk)\n\t\t\tevent.preventDefault();\n\n\t\t\tconst color = get_current_color();\n\t\t\tcustom_colors[custom_colors_index] = color;\n\t\t\t// console.log(custom_colors_swatches_reordered, custom_colors_index, custom_colors_swatches_reordered[custom_colors_index]));\n\t\t\tupdate_$swatch($(custom_colors_swatches_list_order[custom_colors_index]), color);\n\t\t\tcustom_colors_index = (custom_colors_index + 1) % custom_colors.length;\n\n\t\t\t$w.removeClass(\"defining-custom-colors\"); // for mobile layout\n\t\t});\n\n\t$w.$Button(localize(\"OK\"), () => {\n\t\tcallback(get_current_color());\n\t\t$w.close();\n\t}, { type: \"submit\" });\n\t$w.$Button(localize(\"Cancel\"), () => {\n\t\t$w.close();\n\t});\n\n\t$left.append($w.$buttons);\n\n\t// Initially select the first color cell that matches the color to edit, if any\n\t// (first in the basic colors, then in the custom colors otherwise.\n\t// This works implicitly, since basic colors come before custom colors in the DOM.)\n\tfor (const swatch_el of $left.find(\".swatch\").toArray()) {\n\t\tif (get_rgba_from_color(swatch_el.dataset.color).join(\",\") === get_rgba_from_color(initial_color).join(\",\")) {\n\t\t\tselect($(swatch_el));\n\t\t\tswatch_el.focus();\n\t\t\tbreak;\n\t\t}\n\t}\n\tcustom_colors_index = Math.max(0, custom_colors_swatches_list_order.indexOf(\n\t\t$custom_colors_grid.find(\".swatch.selected\")[0]\n\t));\n\t// If no color cell matches the color to edit,\n\t// focus the first color cell, without changing the selected color value as displayed if you expand the dialog.\n\t// This supports workflows:\n\t// 1. Make a custom color, without saving it to the custom colors list, hit OK, then edit this new color.\n\t// 2. Use the eye dropper tool to select a color in an image, then edit it or see the RGB/HSL values.\n\t// (Also test adding to custom colors, without editing, a color not already in the custom colors list.\n\t// I swear it added the wrong color once...)\n\tif ($w.find(\".swatch:focus\").length === 0) {\n\t\t$w.find(\".swatch\").first().focus();\n\t}\n\n\tset_color(initial_color);\n\tupdate_inputs(\"hslrgb\");\n\n\t$w.center();\n}\n\nexport { show_edit_colors_window };\n\n"
  },
  {
    "path": "src/electron-injected.js",
    "content": "// @ts-check\n/* global are_you_sure, formats_unique_per_file_extension, get_format_from_extension, localize, make_canvas, open_from_file, sanity_check_blob, show_about_paint, show_error_message, systemHooks */\n\n// Electron-specific code injected into the renderer process\n// to provide integrations, for the desktop app\n\n// I've enabled sandboxing, so the fs module is not available.\n// Operations must be carried out in the main process.\n\nconst { /*contextBridge,*/ ipcRenderer } = require(\"electron\");\n\n// const { are_you_sure, open_from_file, show_error_message, show_about_paint, sanity_check_blob } = require(\"./functions.js\");\n// const { get_format_from_extension } = require(\"./helpers.js\");\n// Can't immediately access globals from window, since this script is executed before any other scripts.\n// const { are_you_sure, open_from_file, show_error_message, show_about_paint, sanity_check_blob, get_format_from_extension, formats_unique_per_file_extension } = window;\n\n\nconst { isDev, isMacOS, initialFilePath } = ipcRenderer.sendSync(\"get-env-info\");\n\n// contextBridge.exposeInMainWorld(\"is_electron_app\", true);\n// contextBridge.exposeInMainWorld(\"electron_is_dev\", isDev);\n// contextBridge.exposeInMainWorld(\"initial_system_file_handle\", initialFilePath);\n\n// contextBridge.exposeInMainWorld(\"electron_app\", {\n\nwindow.is_electron_app = true;\nwindow.electron_is_dev = isDev;\nwindow.initial_system_file_handle = initialFilePath;\n\nipcRenderer.on(\"close-window-prompt\", () => {\n\tare_you_sure(() => {\n\t\twindow.close();\n\t});\n});\n\nipcRenderer.on(\"open-file\", (_event, file_path) => {\n\t// Sent when dragging a file onto the dock on macOS.\n\t// Comes from Electron's \"open-file\" event of the same name, though this is a custom IPC event.\n\t// WET: copied from window.initial_system_file_handle handling\n\tsystemHooks.readBlobFromHandle(file_path).then((file) => {\n\t\tif (file) {\n\t\t\topen_from_file(file, file_path);\n\t\t}\n\t}, (error) => {\n\t\t// this handler is not always called, sometimes error message is shown from readBlobFromHandle\n\t\tshow_error_message(`Failed to open file ${file_path}`, error);\n\t});\n});\n\n// TODO: decide if these should be moved into systemHooks, made part of API\nwindow.setRepresentedFilename = (filePath) => {\n\tipcRenderer.send(\"set-represented-filename\", filePath);\n};\nwindow.setDocumentEdited = (documentEdited) => {\n\tipcRenderer.send(\"set-document-edited\", documentEdited);\n};\nconst menuFunctions = {};\nlet menuFunctionId = 0;\nwindow.setMenus = (menus) => {\n\tipcRenderer.send(\"set-menus\", JSON.stringify(menus, (_key, value) => {\n\t\tif (typeof value === \"function\") {\n\t\t\tconst id = menuFunctionId++;\n\t\t\tmenuFunctions[id] = value;\n\t\t\treturn `$$function$$${id}`;\n\t\t}\n\t\treturn value;\n\t}));\n};\nipcRenderer.on(\"menu-function\", (_event, function_id, request_id) => {\n\tconst result = menuFunctions[function_id]();\n\tipcRenderer.send(`menu-function-result-${request_id}`, result);\n});\n// Currently the macOS app menu is defined in the main process,\n// and not in menus.js; @TODO: move macOS specific menu items and shortcut logic to menus.js\nipcRenderer.on(\"show-about-dialog\", (_event) => {\n\tshow_about_paint();\n});\n\nfunction show_save_error_message(responseCode, error) {\n\tif (responseCode === \"ACCESS_DENIED\") {\n\t\treturn show_error_message(localize(\"Access denied.\"));\n\t}\n\tif (responseCode === \"INVALID_DATA\") {\n\t\treturn show_error_message(\"Failed to save: Invalid data. This shouldn't happen!\");\n\t}\n\tif (responseCode !== \"SUCCESS\") {\n\t\treturn show_error_message(localize(\"Failed to save document.\"), error);\n\t}\n\t// return show_save_error_message(localize(\"No error occurred.\"));\n}\nasync function write_blob_to_file_path(filePath, blob) {\n\tconst arrayBuffer = await blob.arrayBuffer();\n\tconst { responseCode, error } = await ipcRenderer.invoke(\"write-file\", filePath, arrayBuffer);\n\treturn { responseCode, error };\n}\n\nwindow.systemHooks = window.systemHooks || {};\nwindow.systemHooks.showSaveFileDialog = async ({ formats, defaultFileName, defaultPath, defaultFileFormatID: _unused, getBlob, savedCallbackUnreliable }) => {\n\n\t// First filter in filters list determines default selected file type.\n\t// @TODO: default to existing extension, except it would be awkward to rearrange the list...\n\t// const suggestedExtension = get_file_extension(defaultFileName);\n\n\t// We can't get the selected file type, so show only a set of formats\n\t// that can be accessed uniquely by their file extensions\n\tformats = formats_unique_per_file_extension(formats);\n\n\tconst filters = formats.map(({ name, extensions }) => ({ name, extensions }));\n\n\t// @TODO: should defaultFileName/defaultPath be sanitized in some way?\n\tlet filePath, fileName, canceled;\n\ttry {\n\t\t// This is not the Electron API directly, but it's similar\n\t\t// fileName stuff is added so I don't need to do equivalent to path.basename() in the renderer\n\t\t({ filePath, fileName, canceled } = await ipcRenderer.invoke(\"show-save-dialog\", {\n\t\t\ttitle: localize(\"Save As\"),\n\t\t\t// defaultPath: defaultPath || path.basename(defaultFileName),\n\t\t\tdefaultFileName,\n\t\t\tdefaultPath,\n\t\t\tfilters,\n\t\t}));\n\t} catch (error) {\n\t\tshow_error_message(localize(\"Failed to save document.\"), error);\n\t}\n\tif (canceled) {\n\t\treturn;\n\t}\n\n\tconst extension = (filePath.indexOf(\".\") > -1) && filePath.split(/\\./g).pop().toLowerCase();\n\tif (!extension) {\n\t\t// @TODO: Linux/Unix?? you're not supposed to need file extensions\n\t\t// should it use defaultFileFormatID?\n\t\treturn show_error_message(\"Missing file extension - Try adding .png to the end of the file name\");\n\t}\n\tconst format = get_format_from_extension(formats, filePath);\n\tif (!format) {\n\t\treturn show_error_message(`Can't save as *.${extension} - Try adding .png to the end of the file name`);\n\t}\n\tconst blob = await getBlob(format.formatID);\n\tconst { responseCode, error } = await write_blob_to_file_path(filePath, blob);\n\tif (responseCode !== \"SUCCESS\") {\n\t\treturn show_save_error_message(responseCode, error);\n\t}\n\tsavedCallbackUnreliable?.({\n\t\t// newFileName: path.basename(filePath),\n\t\tnewFileName: fileName,\n\t\tnewFileFormatID: format.formatID,\n\t\tnewFileHandle: filePath,\n\t\tnewBlob: blob,\n\t});\n};\nwindow.systemHooks.showOpenFileDialog = async ({ formats, defaultPath }) => {\n\t// @TODO: use categories for filters\n\t// ideally this function should be generic to formats, so shouldn't do it here:\n\t// const filters = image_format_categories(formats).map(({ name, extensions }) => ({ name, extensions }));\n\tconst filters = formats.map(({ name, extensions }) => ({ name, extensions }));\n\tconst { canceled, filePaths } = await ipcRenderer.invoke(\"show-open-dialog\", {\n\t\ttitle: localize(\"Open\"),\n\t\tfilters,\n\t\tdefaultPath,\n\t});\n\tif (canceled) {\n\t\tthrow new Error(\"user canceled\");\n\t}\n\tconst filePath = filePaths[0];\n\tconst file = await window.systemHooks.readBlobFromHandle(filePath);\n\treturn { file, fileHandle: filePath };\n};\n\nwindow.systemHooks.writeBlobToHandle = async (filePath, blob) => {\n\tif (typeof filePath !== \"string\") {\n\t\tshow_error_message(\"writeBlobToHandle in Electron expects a file path, got \" + filePath);\n\t\t// should it fall back to default writeBlobToHandle?\n\t\treturn false;\n\t}\n\tconst { responseCode, error } = await write_blob_to_file_path(filePath, blob);\n\tif (responseCode !== \"SUCCESS\") {\n\t\tshow_save_error_message(responseCode, error);\n\t\treturn false;\n\t}\n\treturn true;\n};\nwindow.systemHooks.readBlobFromHandle = async (filePath) => {\n\tif (typeof filePath !== \"string\") {\n\t\tshow_error_message(\"readBlobFromHandle in Electron expects a file path, got \" + filePath);\n\t\treturn;\n\t\t// should it fall back to default readBlobFromHandle?\n\t}\n\tconst { responseCode, error, data, fileName } = await ipcRenderer.invoke(\"read-file\", filePath);\n\tif (responseCode === \"ACCESS_DENIED\") {\n\t\tshow_error_message(localize(\"Access denied.\"));\n\t\treturn;\n\t}\n\tif (responseCode !== \"SUCCESS\") {\n\t\tshow_error_message(localize(\"Paint cannot open this file.\"), error);\n\t\treturn;\n\t}\n\tconst file = new File([new Uint8Array(data)], fileName);\n\t// can't set file.path directly, but we can do this:\n\tObject.defineProperty(file, \"path\", {\n\t\tvalue: filePath,\n\t});\n\n\treturn file;\n};\n\nwindow.systemHooks.setWallpaperCentered = (canvas) => {\n\t// @TODO: implement centered option for Windows and Linux in https://www.npmjs.com/package/wallpaper\n\t// currently it's only supported on macOS\n\tlet wallpaperCanvas;\n\tif (isMacOS) {\n\t\twallpaperCanvas = canvas;\n\t} else {\n\t\twallpaperCanvas = make_canvas(screen.width, screen.height);\n\t\tconst x = (screen.width - canvas.width) / 2;\n\t\tconst y = (screen.height - canvas.height) / 2;\n\t\twallpaperCanvas.ctx.drawImage(canvas, ~~x, ~~y);\n\t}\n\n\twallpaperCanvas.toBlob((blob) => {\n\t\tsanity_check_blob(blob, () => {\n\t\t\tblob.arrayBuffer().then((arrayBuffer) => {\n\t\t\t\tipcRenderer.invoke(\"set-wallpaper\", arrayBuffer).then(({ responseCode, error }) => {\n\t\t\t\t\tif (responseCode === \"WRITE_TEMP_PNG_FAILED\") {\n\t\t\t\t\t\treturn show_error_message(\"Failed to set wallpaper: Couldn't write temporary image file.\", error);\n\t\t\t\t\t}\n\t\t\t\t\tif (responseCode === \"INVALID_DATA\") {\n\t\t\t\t\t\treturn show_error_message(\"Failed to set wallpaper. Invalid data in IPC.\", error);\n\t\t\t\t\t}\n\t\t\t\t\tif (responseCode === \"INVALID_PNG_DATA\") {\n\t\t\t\t\t\treturn show_error_message(`Failed to set wallpaper.\\n\\n${localize(\"Unexpected file format.\")}`, error);\n\t\t\t\t\t}\n\t\t\t\t\tif (responseCode === \"XFCONF_FAILED\") {\n\t\t\t\t\t\treturn show_error_message(\"Failed to set wallpaper (for Xfce).\", error);\n\t\t\t\t\t}\n\t\t\t\t\tif (responseCode !== \"SUCCESS\") {\n\t\t\t\t\t\treturn show_error_message(\"Failed to set wallpaper.\", error);\n\t\t\t\t\t}\n\t\t\t\t}).catch((error) => {\n\t\t\t\t\tshow_error_message(\"Failed to set wallpaper.\", error);\n\t\t\t\t});\n\t\t\t}, (error) => {\n\t\t\t\tshow_error_message(\"Failed to set wallpaper: Couldn't read blob as array buffer.\", error);\n\t\t\t});\n\t\t});\n\t});\n};\n"
  },
  {
    "path": "src/electron-main.js",
    "content": "const { app, shell, session, dialog, ipcMain, BrowserWindow, Menu, MenuItem } = require(\"electron\");\nconst fs = require(\"fs\");\nconst path = require(\"path\");\nconst { ArgumentParser, SUPPRESS } = require(\"argparse\");\n\n// Handle creating/removing shortcuts on Windows when installing/uninstalling.\nif (require(\"electron-squirrel-startup\")) {\n\tapp.quit();\n\t// `app.quit` does not immediately exit the process.\n\treturn;\n}\n\nconst parser = new ArgumentParser({\n\tprog: \"jspaint\",\n\tdescription: \"MS Paint in JavaScript, running in Electron.\",\n});\n\nparser.add_argument(\"file_path\", {\n\thelp: \"Image file to open\",\n\tnargs: \"?\", // \"?\" indicates 0 or 1 arguments: it's optional\n});\n\nparser.add_argument(\"-v\", \"--version\", {\n\taction: \"version\",\n\tversion: require(\"../package.json\").version,\n});\n\n// Squirrel.Windows passes \"-squirrel-firstrun\" when the app is first run after being installed.\n// Other Squirrel.Windows event argument are handled by `electron-squirrel-startup`, which returns whether it handled an event.\n// This could be used to show a \"Thanks for installing\" message or some such, but just hide and ignore it for now.\nparser.add_argument(\"-s\", \"--squirrel-firstrun\", {\n\thelp: SUPPRESS,\n\taction: \"store_true\",\n});\n\n// Compare command line arguments:\n// - unpackaged (in development):      \"path/to/electron.exe\" \".\" \"maybe/a/file.png\"\n// - packaged (usually in production): \"path/to/jspaint.exe\" \"maybe/a/file.png\"\nconst { isPackaged } = app;\nconst args_array = process.argv.slice(isPackaged ? 1 : 2);\nconst args = parser.parse_args(args_array);\n\n// After argument parsing that may have exited the app, handle single instance behavior.\n// In other words, the priority is:\n// - Squirrel event arguments (other than `--squirrel-firstrun`) which exit the app\n// - `--help` or `--version` which print a message and exit the app\n// - Opening an existing instance and exiting the app, forwarding arguments to the existing instance\n// (If it quit because there was an existing instance before handling `--help`,\n// you wouldn't get any help at the command line if the app was running.)\n\n// Note: The \"second-instance\" event has an `argv` argument but it's unusably broken,\n// and the documented workaround is to pass the arguments as `additionalData` here.\n// https://www.electronjs.org/docs/api/app#event-second-instance\nconst got_single_instance_lock = app.requestSingleInstanceLock({\n\targv: args_array,\n});\n\n// Note: If the main process crashes during the \"second-instance\" event, the second instance will get the lock,\n// even if the first instance is still showing an error dialog.\nif (!got_single_instance_lock) {\n\tconsole.log(\"Already running. Opening in existing instance.\");\n\tapp.quit();\n\t// `app.quit` does not immediately exit the process.\n\t// Return to avoid errors / main window briefly appearing.\n\t//   [52128:0304/194956.188:ERROR:cache_util_win.cc(20)] Unable to move the cache: Access is denied. (0x5)\n\t//   [52128:0304/194956.189:ERROR:cache_util.cc(145)] Unable to move cache folder C:\\Users\\Isaiah\\AppData\\Roaming\\Electron\\GPUCache to C:\\Users\\Isaiah\\AppData\\Roaming\\Electron\\old_GPUCache_000\n\t//   [52128:0304/194956.189:ERROR:disk_cache.cc(196)] Unable to create cache\n\t//   [52128:0304/194956.189:ERROR:shader_disk_cache.cc(613)] Shader Cache Creation failed: -2\n\treturn;\n} else {\n\tconsole.log(\"Got single instance lock.\");\n\t// When a second instance is opened, the \"second-instance\" event will be emitted in the this instance.\n\t// See handler below.\n}\n\napp.enableSandbox();\napp.commandLine.appendSwitch(\"high-dpi-support\", 1);\napp.commandLine.appendSwitch(\"force-device-scale-factor\", 1);\n\n// Reloading and dev tools shortcuts\nconst isDev = process.env.ELECTRON_DEBUG === \"1\" || !isPackaged;\nif (isDev) {\n\trequire(\"electron-debug\")({ showDevTools: false });\n}\n\n// @TODO: let user apply this setting somewhere in the UI (togglable)\n// (Note: it would be better to use REG.EXE to apply the change, rather than a .reg file)\n// This registry modification changes the right click > Edit option for images in Windows Explorer\n// ...or in Windows 11, the right click > More Options > Edit option, increasingly buried and useless.\n// Also, currently, this points to a specific version of the app e.g. \"C:\\Users\\Isaiah\\AppData\\Local\\jspaint\\app-1.0.0\\jspaint.exe\" instead of \"C:\\Users\\Isaiah\\AppData\\Local\\jspaint\\jspaint.exe\"\n// I guess this wouldn't be a problem if it manages the registry on every update, but it's manual for now, so it will break on any update.\n// FOR NOW, I'm recommending that users use the \"Open with\" dialog and paste in the path to the exe manually.\nconst reg_contents = `Windows Registry Editor Version 5.00\n\n[HKEY_CLASSES_ROOT\\\\SystemFileAssociations\\\\image\\\\shell\\\\edit\\\\command]\n@=\"\\\\\"${process.argv[0].replace(/\\\\/g, \"\\\\\\\\\")}\\\\\" ${isPackaged ? \"\" : '\\\\\".\\\\\" '}\\\\\"%1\\\\\"\"\n`; // oof that's a lot of escaping \\\\\n////                                \\\\\\\\\n//  /\\   /\\   /\\   /\\   /\\   /\\   /\\  \\\\\n// //\\\\ //\\\\ //\\\\ //\\\\ //\\\\ //\\\\ //\\\\ \\\\\n//  ||   ||   ||   ||   ||   ||   ||  \\\\\n//\\\\/\\\\/\\\\/\\\\/\\\\/\\\\/\\\\/\\\\/\\\\/\\\\/\\\\/\\\\/\\\\\nconst reg_file_path = path.join(\n\tisPackaged ? path.dirname(process.argv[0]) : \".\",\n\t`set-jspaint${isPackaged ? \"\" : \"-DEV-MODE\"}-as-default-image-editor.reg`\n);\nif (process.platform == \"win32\" && isPackaged) {\n\tfs.writeFile(reg_file_path, reg_contents, (err) => {\n\t\tif (err) {\n\t\t\treturn console.error(err);\n\t\t}\n\t});\n}\n\n// In case of XSS holes, don't give the page free reign over the filesystem!\n// Only allow allow access to files explicitly opened by the user.\nconst allowed_file_paths = [];\n\nlet initial_file_path;\nif (args.file_path) {\n\tinitial_file_path = path.resolve(args.file_path);\n\tallowed_file_paths.push(initial_file_path);\n}\n\n// Keep a global reference of the window object, if you don't, the window will\n// be closed automatically when the JavaScript object is garbage collected.\n// @TODO: It's been several electron versions. I doubt this is still necessary. (It was from a boilerplate.)\n/** @type {BrowserWindow | undefined} */\nlet editor_window;\n\nconst createWindow = () => {\n\t// Create the browser window.\n\teditor_window = new BrowserWindow({\n\t\tuseContentSize: true,\n\t\tautoHideMenuBar: true, // it adds height for a native menu bar unless we hide it here\n\t\t// setMenu(null) below is too late; it's already decided on the size by then\n\t\twidth: 800,\n\t\theight: 600,\n\t\tminWidth: 260,\n\t\tminHeight: 360,\n\t\ticon: path.join(__dirname, \"../images/icons\",\n\t\t\tprocess.platform === \"win32\" ?\n\t\t\t\t\"jspaint.ico\" :\n\t\t\t\tprocess.platform === \"darwin\" ?\n\t\t\t\t\t\"jspaint.icns\" :\n\t\t\t\t\t\"48x48.png\"\n\t\t),\n\t\ttitle: \"JS Paint\",\n\t\twebPreferences: {\n\t\t\tpreload: path.join(__dirname, \"/electron-injected.js\"),\n\t\t\tcontextIsolation: false,\n\t\t},\n\t});\n\n\t// @TODO: maybe use the native menu for the \"Modern\" theme, or a \"Native\" theme\n\teditor_window.setMenu(null);\n\n\t// and load the index.html of the app.\n\teditor_window.loadURL(`file://${__dirname}/../index.html`);\n\n\t// Emitted when the window is closed.\n\teditor_window.on(\"closed\", () => {\n\t\t// Dereference the window object, usually you would store windows\n\t\t// in an array if your app supports multi windows, this is the time\n\t\t// when you should delete the corresponding element.\n\t\teditor_window = null;\n\t});\n\n\t// Emitted before the window is closed.\n\teditor_window.on(\"close\", (event) => {\n\t\t// Don't need to check editor_window.isDocumentEdited(),\n\t\t// because the (un)edited state is handled by the renderer process, in are_you_sure().\n\t\t// Note: if the web contents are not responding, this will make the app harder to close.\n\t\t// Similarly, if there's an error, the app will be harder to close (perhaps worse as it's less likely to show a Not Responding dialog).\n\t\t// And this also prevents it from closing with Ctrl+C in the terminal, which is arguably a feature.\n\t\t// TODO: focus window if it's not focused, which can happen via right clicking the dock/taskbar icon, or Ctrl+C in the terminal\n\t\t// (but ideally not if it's going to close without prompting)\n\t\teditor_window.webContents.send(\"close-window-prompt\");\n\t\tevent.preventDefault();\n\t});\n\n\t// Open links without target=_blank externally.\n\teditor_window.webContents.on(\"will-navigate\", (e, url) => {\n\t\t// check that the URL is not part of the app\n\t\tif (!url.includes(\"file://\")) {\n\t\t\te.preventDefault();\n\t\t\tshell.openExternal(url);\n\t\t}\n\t});\n\t// Open links with target=_blank externally.\n\teditor_window.webContents.setWindowOpenHandler(({ url }) => {\n\t\t// check that the URL is not part of the app\n\t\tif (!url.includes(\"file://\")) {\n\t\t\tshell.openExternal(url);\n\t\t}\n\t\treturn { action: \"deny\" };\n\t});\n\n\tsession.defaultSession.webRequest.onHeadersReceived((details, callback) => {\n\t\tcallback({\n\t\t\tresponseHeaders: {\n\t\t\t\t...details.responseHeaders,\n\t\t\t\t// connect-src needs data: for loading from localStorage,\n\t\t\t\t// and maybe blob: for loading from IndexedDB in the future.\n\t\t\t\t// (It uses fetch().)\n\t\t\t\t// Note: this should mirror the CSP in index.html, except maybe for firebase stuff.\n\t\t\t\t\"Content-Security-Policy\": [`\n\t\t\t\t\tdefault-src 'self';\n\t\t\t\t\tscript-src 'self' blob:;\n\t\t\t\t\tstyle-src 'self' 'unsafe-inline' https://fonts.googleapis.com;\n\t\t\t\t\timg-src 'self' data: blob: http: https:;\n\t\t\t\t\tfont-src 'self' https://fonts.gstatic.com;\n\t\t\t\t\tconnect-src * data: blob:;\n\t\t\t\t`],\n\t\t\t},\n\t\t});\n\t});\n\n\t// Allow write access to files dropped onto the window.\n\t// I'm not sure if this is more secure than handling it in the preload script with IPC,\n\t// but it might be, due to the isolated context.\n\t// TODO: is there a way to intercept drag and drop from the main process directly?\n\t// \"will-navigate\" isn't sent even if the app's dragstart/dragover/drop handlers are disabled.\n\t// If there was an event for dropped files, or an API like wasFileDropped(filePath) or more generally,\n\t// wasFileOpenedByUserGesture(filePath), that would allow for tighter control.\n\t// Right now the renderer process tells the main process what file paths are allowed,\n\t// which is not ideal, although it's within an isolated world, and even separate from the preload script.\n\t// For file dialogs and command line arguments and all the other ways to open files,\n\t// the file list is managed exclusively by the main process, so drag and drop is the weak link.\n\t// If drag and drop could be handled by the main process, it would be more secure overall.\n\teditor_window.webContents.on(\"did-finish-load\", () => {\n\t\t// Could use contextBridge, but re-registering an event listener recursively was easier.\n\t\t// It's a pattern I've done before, and this code actually worked on the first try.\n\t\tfunction handle_one_drop() {\n\t\t\teditor_window.webContents.executeJavaScriptInIsolatedWorld(777, [\n\t\t\t\t{\n\t\t\t\t\tcode: `\n\t\t\t\t\t\tnew Promise((resolve, reject) => {\n\t\t\t\t\t\t\t// The app's normal drag and drop handling will take care of dragstart, dragover,\n\t\t\t\t\t\t\t// and actually opening files. This is just to allow write access to the dropped file.\n\t\t\t\t\t\t\twindow.addEventListener(\"drop\", (event) => {\n\t\t\t\t\t\t\t\tconst file_path = event.dataTransfer.files[0].path;\n\t\t\t\t\t\t\t\tresolve(file_path);\n\t\t\t\t\t\t\t}, { once: true });\n\t\t\t\t\t\t})\n\t\t\t\t\t`,\n\t\t\t\t},\n\t\t\t]).then((file_path) => {\n\t\t\t\tconsole.log(\"Allowing write access to dropped file:\", file_path);\n\t\t\t\tallowed_file_paths.push(file_path);\n\t\t\t\teditor_window.webContents.send(\"open-file\", file_path);\n\t\t\t\thandle_one_drop();\n\t\t\t});\n\t\t}\n\t\thandle_one_drop();\n\t});\n};\n\n// Register listeners outside of createWindow to avoid them being added multiple times\n// on macOS, where the app is not actually closed when the window is closed,\n// and thus it can be opened multiple times from the same electron main process.\n// (It causes an error in the case of handle() but not on().)\n//     Error: Attempted to register a second handler for 'show-save-dialog'\n// I'm using an indented block here just to avoid a large git diff, for now.\n{\n\tipcMain.on(\"get-env-info\", (event) => {\n\t\tconst env_info = {\n\t\t\tisDev,\n\t\t\tisMacOS: process.platform === \"darwin\",\n\t\t\tinitialFilePath: initial_file_path,\n\t\t};\n\t\tevent.returnValue = env_info;\n\t\t// not sure if this is the best way to do this, but like,\n\t\t// it shouldn't open the file if the window is closed and re-opened, right?\n\t\tinitial_file_path = null;\n\t});\n\tipcMain.on(\"set-represented-filename\", (_event, filePath) => {\n\t\t// filePath of \"\" is used to reset the title bar's filename,\n\t\t// and \"\" isn't in the allow list.\n\t\tif (!allowed_file_paths.includes(filePath)) {\n\t\t\tfilePath = \"\";\n\t\t}\n\t\teditor_window.setRepresentedFilename(filePath);\n\t});\n\tipcMain.on(\"set-document-edited\", (_event, isEdited) => {\n\t\teditor_window.setDocumentEdited(isEdited);\n\t});\n\tlet request_counter = 0;\n\tipcMain.on(\"set-menus\", (_event, menusJSON) => {\n\t\t// Parse the JSON, reviving functions.\n\t\tconst menus = JSON.parse(menusJSON, (_key, value) => {\n\t\t\tif (typeof value === \"string\" && value.startsWith(\"$$function$$\")) {\n\t\t\t\tconst function_id = Number(value.slice(\"$$function$$\".length));\n\t\t\t\treturn () => {\n\t\t\t\t\t// https://www.electronjs.org/docs/latest/tutorial/ipc#optional-returning-a-reply\n\t\t\t\t\t// \"There's no equivalent for ipcRenderer.invoke for main-to-renderer IPC.\n\t\t\t\t\t// Instead, you can send a reply back to the main process from within the ipcRenderer.on callback.\"\n\t\t\t\t\t// Kinda lame but OK.\n\t\t\t\t\t// There's also no sendSync, so I have to make the (un)marshalled functions return Promises,\n\t\t\t\t\t// deviating from OS-GUI's API.\n\t\t\t\t\tconst this_request_id = ++request_counter;\n\t\t\t\t\teditor_window?.webContents.send(\"menu-function\", function_id, this_request_id);\n\t\t\t\t\treturn new Promise((resolve, _reject) => {\n\t\t\t\t\t\tipcMain.once(`menu-function-result-${this_request_id}`, (_event, result) => {\n\t\t\t\t\t\t\tresolve(result);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn value;\n\t\t});\n\n\t\t// Adapt the structure defined in menus.js to the Electron Menu API.\n\t\t// const menus = {\n\t\t// \t\"&Example\": [\n\t\t// \t\t{\n\t\t// \t\t\tlabel: \"&Nothing\",\n\t\t// \t\t\tshortcut?: \"Ctrl+N\",\n\t\t// \t\t\tspeech_recognition?: [\"nothing\", \"no-op\"],\n\t\t// \t\t\taction?: () => { },\n\t\t// \t\t\tdescription?: \"Does nothing. This is an example.\",\n\t\t// \t\t\tsubmenu?: [ ... ],\n\t\t// \t\t\tenabled?: () => true, // or a plain boolean\n\t\t// \t\t\temoji_icon?: \"🚫\", // not part of OS-GUI.js, just jspaint\n\t\t// \t\t\tcheckbox?: { // exclusive with action and submenu\n\t\t// \t\t\t\ttoggle?: () => { },\n\t\t// \t\t\t\tcheck?: () => true,\n\t\t// \t\t\t},\n\t\t// \t\t},\n\t\t// \t],\n\t\t// \t\"MENU_DIVIDER\",\n\t\t// \t...\n\t\t// };\n\t\tconst menubar = new Menu();\n\t\tconst intervalIDs = [];\n\t\teditor_window.once(\"closed\", () => {\n\t\t\tfor (const intervalID of intervalIDs) {\n\t\t\t\tclearInterval(intervalID);\n\t\t\t}\n\t\t\tfunction disable_menu(menu) {\n\t\t\t\t// TypeError: menu.items is not iterable\n\t\t\t\t// for (const menu_item of menu.items) {\n\t\t\t\tfor (let i = 0; i < menu.items.length; i++) {\n\t\t\t\t\tconst menu_item = menu.items[i];\n\t\t\t\t\tif (menu_item.submenu) {\n\t\t\t\t\t\tdisable_menu(menu_item.submenu);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmenu_item.enabled = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tdisable_menu(menubar);\n\t\t});\n\t\tif (process.platform === \"darwin\") {\n\t\t\t// @TODO: localize like other menus\n\t\t\tmenubar.append(new MenuItem({\n\t\t\t\tlabel: \"JS Paint\",\n\t\t\t\tsubmenu: [\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: \"About JS Paint\",\n\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\t// TODO handle editor_window closed on macOS\n\t\t\t\t\t\t\teditor_window?.webContents.send(\"show-about-dialog\");\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{ type: \"separator\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: \"Services\",\n\t\t\t\t\t\trole: \"services\",\n\t\t\t\t\t\tsubmenu: [],\n\t\t\t\t\t},\n\t\t\t\t\t{ type: \"separator\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: \"Hide JS Paint\",\n\t\t\t\t\t\trole: \"hide\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: \"Hide Others\",\n\t\t\t\t\t\trole: \"hideothers\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: \"Show All\",\n\t\t\t\t\t\trole: \"unhide\",\n\t\t\t\t\t},\n\t\t\t\t\t{ type: \"separator\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: \"Quit JS Paint\",\n\t\t\t\t\t\trole: \"quit\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t}));\n\t\t}\n\t\tfor (const menu_key in menus) {\n\t\t\tconst menu = menus[menu_key];\n\t\t\tmenubar.append(new MenuItem({\n\t\t\t\tlabel: menu_key,\n\t\t\t\tsubmenu: makeMenu(menu),\n\t\t\t}));\n\t\t}\n\n\t\t/**\n\t\t * @param {OSGUIMenuFragment[]} menu_items\n\t\t * @returns {MenuItem[]}\n\t\t */\n\t\tfunction makeMenu(menu_items) {\n\t\t\treturn menu_items.map((menu_item) => {\n\t\t\t\tif (menu_item === \"MENU_DIVIDER\") {\n\t\t\t\t\treturn { type: \"separator\" };\n\t\t\t\t}\n\t\t\t\tconst electron_menu_item = new MenuItem({\n\t\t\t\t\t// Emoji actually look terrible in macOS (mojave at least),\n\t\t\t\t\t// they get super blown out when white from the canvas shows through.\n\t\t\t\t\t// @TODO: remove emoji or try using `icon` field,\n\t\t\t\t\t// either by rendering emoji with <canvas> in the renderer process\n\t\t\t\t\t// or by designing custom icons.\n\t\t\t\t\tlabel:\n\t\t\t\t\t\t(menu_item.emoji_icon ? menu_item.emoji_icon + \" \" : \"\") +\n\t\t\t\t\t\tmenu_item.label,\n\t\t\t\t\t// There's some hacky translation of shortcuts here,\n\t\t\t\t\t// but the app supports Cmd for all Ctrl shortcuts.\n\t\t\t\t\t// @TODO: use \"CmdOrCtrl\", make OS-GUI.js support it, and simplify this.\n\t\t\t\t\taccelerator:\n\t\t\t\t\t\tmenu_item.shortcut ?\n\t\t\t\t\t\t\tmenu_item.shortcut\n\t\t\t\t\t\t\t\t.replace(/^F4$/, \"Shift+Cmd+Z\")\n\t\t\t\t\t\t\t\t.replace(/Ctrl/g, \"Cmd\") :\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t// Fix Cmd+C/Cmd+V etc. in devtools, let renderer process handle it.\n\t\t\t\t\t// `role: \"copy\"` might work better, and handle text selections as well,\n\t\t\t\t\t// but handling text selections from the non-native Edit menu is still TODO anyways,\n\t\t\t\t\t// so might as well implement that instead if possible.\n\t\t\t\t\tregisterAccelerator: false,\n\t\t\t\t\t//\n\t\t\t\t\tclick: () => menu_item.action(),\n\t\t\t\t\tsubmenu: menu_item.submenu ? makeMenu(menu_item.submenu) : undefined,\n\t\t\t\t\ttype: menu_item.checkbox ? \"checkbox\" : undefined,\n\t\t\t\t\t// @TODO: disable menu items when window is closed, and\n\t\t\t\t\t// make File > Exit work on macOS or hide it since it's redundant with Quit JS Paint\n\t\t\t\t\t// Right now it gets an Uncaught Exception:\n\t\t\t\t\t// TypeError: Cannot read properties of null (reading 'webContents')\n\t\t\t\t\tenabled:\n\t\t\t\t\t\ttypeof menu_item.enabled === \"function\" ?\n\t\t\t\t\t\t\ttrue : // dynamically updated below, don't need `await menu_item.enabled()`\n\t\t\t\t\t\t\t(menu_item.enabled ?? true),\n\t\t\t\t});\n\t\t\t\tif (typeof menu_item.enabled === \"function\") {\n\t\t\t\t\t// @TODO: avoid polling (OS-GUI.js queries the state when showing the menu, but I doubt that's an option for the native menus)\n\t\t\t\t\tintervalIDs.push(setInterval(async () => {\n\t\t\t\t\t\t// OS-GUI.js doesn't use Promises here but the (un)marshalled functions do.\n\t\t\t\t\t\telectron_menu_item.enabled = editor_window?.webContents && await menu_item.enabled();\n\t\t\t\t\t}, 100));\n\t\t\t\t}\n\t\t\t\tif (menu_item.checkbox) {\n\t\t\t\t\telectron_menu_item.type = \"checkbox\";\n\t\t\t\t\tif (menu_item.checkbox.check) {\n\t\t\t\t\t\tintervalIDs.push(setInterval(async () => {\n\t\t\t\t\t\t\t// OS-GUI.js doesn't use Promises here but the (un)marshalled functions do.\n\t\t\t\t\t\t\telectron_menu_item.checked = await menu_item.checkbox.check();\n\t\t\t\t\t\t}, 100));\n\t\t\t\t\t}\n\t\t\t\t\telectron_menu_item.click = () => menu_item.checkbox.toggle?.();\n\t\t\t\t}\n\t\t\t\treturn electron_menu_item;\n\t\t\t});\n\t\t}\n\n\t\tMenu.setApplicationMenu(menubar);\n\t});\n\tipcMain.handle(\"show-save-dialog\", async (_event, options) => {\n\t\tconst { filePath, canceled } = await dialog.showSaveDialog(editor_window, {\n\t\t\ttitle: options.title,\n\t\t\t// defaultPath: options.defaultPath,\n\t\t\tdefaultPath: options.defaultPath || (options.defaultFileName ? path.basename(options.defaultFileName) : undefined),\n\t\t\tfilters: options.filters,\n\t\t});\n\t\tconst fileName = path.basename(filePath);\n\t\tallowed_file_paths.push(filePath);\n\t\treturn { filePath, fileName, canceled };\n\t});\n\tipcMain.handle(\"show-open-dialog\", async (_event, options) => {\n\t\tconst { filePaths, canceled } = await dialog.showOpenDialog(editor_window, {\n\t\t\ttitle: options.title,\n\t\t\tdefaultPath: options.defaultPath,\n\t\t\tfilters: options.filters,\n\t\t\tproperties: options.properties,\n\t\t});\n\t\tallowed_file_paths.push(...filePaths);\n\t\treturn { filePaths, canceled };\n\t});\n\tipcMain.handle(\"write-file\", async (_event, file_path, data) => {\n\t\tif (!allowed_file_paths.includes(file_path)) {\n\t\t\treturn { responseCode: \"ACCESS_DENIED\" };\n\t\t}\n\t\t// make sure data is an ArrayBuffer, so you can't use an options object for (unknown) evil reasons\n\t\tif (data instanceof ArrayBuffer) {\n\t\t\ttry {\n\t\t\t\tawait fs.promises.writeFile(file_path, Buffer.from(data));\n\t\t\t} catch (error) {\n\t\t\t\treturn { responseCode: \"WRITE_FAILED\", error };\n\t\t\t}\n\t\t\treturn { responseCode: \"SUCCESS\" };\n\t\t} else {\n\t\t\treturn { responseCode: \"INVALID_DATA\" };\n\t\t}\n\t});\n\tipcMain.handle(\"read-file\", async (_event, file_path) => {\n\t\tif (!allowed_file_paths.includes(file_path)) {\n\t\t\treturn { responseCode: \"ACCESS_DENIED\" };\n\t\t}\n\t\ttry {\n\t\t\tconst buffer = await fs.promises.readFile(file_path);\n\t\t\treturn { responseCode: \"SUCCESS\", data: new Uint8Array(buffer), fileName: path.basename(file_path) };\n\t\t} catch (error) {\n\t\t\treturn { responseCode: \"READ_FAILED\", error };\n\t\t}\n\t});\n\tipcMain.handle(\"set-wallpaper\", async (_event, data) => {\n\t\tconst image_path = path.join(app.getPath(\"userData\"), \"bg.png\"); // Note: used without escaping\n\t\tif (!(data instanceof ArrayBuffer)) {\n\t\t\treturn { responseCode: \"INVALID_DATA\" };\n\t\t}\n\t\tdata = new Uint8Array(data);\n\t\tconst png_magic_bytes = [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A];\n\t\tfor (let i = 0; i < png_magic_bytes.length; i++) {\n\t\t\tif (data[i] !== png_magic_bytes[i]) {\n\t\t\t\tconsole.log(\"Found bytes:\", data.slice(0, png_magic_bytes.length), \"but expected:\", png_magic_bytes);\n\t\t\t\treturn { responseCode: \"INVALID_PNG_DATA\" };\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tawait fs.promises.writeFile(image_path, Buffer.from(data));\n\t\t} catch (error) {\n\t\t\treturn { responseCode: \"WRITE_TEMP_PNG_FAILED\", error };\n\t\t}\n\n\t\t// The wallpaper module actually has support for Xfce, but it's not general enough.\n\t\tconst bash_for_xfce = `xfconf-query -c xfce4-desktop -l | grep last-image | while read path; do xfconf-query -c xfce4-desktop -p $path -s '${image_path}'; done`;\n\t\tconst { lookpath } = require(\"lookpath\");\n\t\tif (await lookpath(\"xfconf-query\") && await lookpath(\"grep\")) {\n\t\t\tconst exec = require(\"util\").promisify(require(\"child_process\").exec);\n\t\t\ttry {\n\t\t\t\tawait exec(bash_for_xfce);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Error setting wallpaper for Xfce:\", error);\n\t\t\t\treturn { responseCode: \"XFCONF_FAILED\", error };\n\t\t\t}\n\t\t\treturn { responseCode: \"SUCCESS\" };\n\t\t} else {\n\t\t\t// Note: { scale: \"center\" } is only supported on macOS.\n\t\t\t// I worked around this by providing an image with a transparent margin on other platforms,\n\t\t\t// in setWallpaperCentered.\n\t\t\treturn new Promise((resolve, _reject) => {\n\t\t\t\trequire(\"wallpaper\").set(image_path, { scale: \"center\" }, (error) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\tresolve({ responseCode: \"SET_WALLPAPER_FAILED\", error });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolve({ responseCode: \"SUCCESS\" });\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t\t// Newer promise-based wallpaper API that I can't import:\n\t\t\t// try {\n\t\t\t// \tawait setWallpaper(image_path, { scale: \"center\" });\n\t\t\t// } catch (error) {\n\t\t\t// \treturn { responseCode: \"SET_WALLPAPER_FAILED\", error };\n\t\t\t// }\n\t\t\t// return { responseCode: \"SUCCESS\" };\n\t\t}\n\t});\n}\n\n// Quit when all windows are closed.\napp.on(\"window-all-closed\", () => {\n\t// On OS X it is common for applications and their menu bar\n\t// to stay active until the user quits explicitly with Cmd + Q\n\tif (process.platform !== \"darwin\") {\n\t\tapp.quit();\n\t}\n});\n\nasync function activate_app() {\n\tawait app.whenReady();\n\tif (editor_window) {\n\t\tconsole.log(\"Focusing existing window.\");\n\t\t// show() handles focus, un-minimizing, and bringing to front.\n\t\t// focus() and restore() doesn't bring to front on macOS.\n\n\t\t// However, on Windows, show() causes the window to become un-snapped from the corner/edge of the screen,\n\t\t// and may end up significantly off-screen. https://github.com/electron/electron/issues/25359\n\n\t\t// Here's some more people dealing with these pitfalls in various ways:\n\t\t// https://stackoverflow.com/questions/70925355/why-does-win-focus-not-bring-the-window-to-the-front\n\t\t// \"If you want the window to be brought to the front, you'll have to get more creative.\"\n\t\tif (process.platform === \"win32\") {\n\t\t\tif (editor_window.isMinimized()) {\n\t\t\t\teditor_window.restore();\n\t\t\t}\n\t\t\teditor_window.focus();\n\t\t} else {\n\t\t\teditor_window.show();\n\t\t}\n\t} else {\n\t\tconsole.log(\"Creating window.\");\n\t\tcreateWindow();\n\t}\n}\n\nfunction open_file_in_app(file_path) {\n\tallowed_file_paths.push(file_path);\n\tif (editor_window) {\n\t\tconsole.log(\"Telling existing editor window to open file.\");\n\t\teditor_window.webContents.send(\"open-file\", file_path);\n\t} else {\n\t\tconsole.log(\"Setting initial file path to be opened when window is ready.\");\n\t\tinitial_file_path = file_path;\n\t}\n}\n\n// Note: to test dragging a file onto the dock in macOS, the app needs to be packaged,\n// since the dock icon doesn't accept files without CFBundleDocumentTypes defined in Info.plist,\n// which tells macOS what files can be opened with the app, and Info.plist is generated by Electron Forge,\n// configured with `extendInfo` in forge.config.js.\n// It may be possible to test this in development by copying the Info.plist outside the package,\n// or somehow, though I haven't seen any evidence of anyone achieving that.\n// Worst case scenario, I guess you could edit files within the package to iterate more quickly,\n// possibly with some symbolic links or rsync or something.\napp.on(\"open-file\", (event, file_path) => {\n\t// Emitted when dragging a file onto the dock on macOS (when the app was NOT running),\n\t// or when opening a file from the file manager (when the app WAS already running),\n\t// either via Open With or dragging a file onto the desktop icon.\n\n\t// NOTE: if implementing support for multiple editor windows, make sure not to create two windows at startup.\n\t// Right now activate_app checks for an existing window, and both \"open-file\" and the initial general window creation use it.\n\n\tevent.preventDefault();\n\tconsole.log(\"open-file\", file_path);\n\tactivate_app();\n\topen_file_in_app(file_path);\n});\n\napp.on(\"second-instance\", (_event, uselessCorruptedArgv, workingDirectory, additionalData) => {\n\t// Someone tried to run a second instance, we should focus our window,\n\t// and handle the file path if there is one.\n\n\t// Note: the \"second-instance\" event sends a broken argv which may rearrange and add extra arguments,\n\t// so we have to use the `additionalData` object, passed from `requestSingleInstanceLock`.\n\t// This hack is recommended in the docs: https://www.electronjs.org/docs/api/app#event-second-instance\n\tconsole.log(\"second-instance\", uselessCorruptedArgv, workingDirectory, additionalData);\n\n\tactivate_app();\n\n\t// I was glad when I finally saw there was at least an official workaround for the broken argv,\n\t// as I was very much ready to be done with this complicated nonsense.\n\t// Unfortunately, it turns out `additionalData` is buggy too, and becomes null under some obscure conditions.\n\t// To reproduce it:\n\t//   Terminal 1:  npx electron .\n\t//   Terminal 2:  npx electron .\n\t// Empty arrays seem to cause the problem, but it's dependent on key order and key names.\n\t// Odd-length key names seem to be unaffected, in isolation.\n\t// I could rename \"argv\" to \"arguments\" and it would likely work,\n\t// but I wouldn't feel comfortable removing this safeguard anyway until it's better understood,\n\t// and hopefully fixed.\n\t// https://github.com/electron/electron/issues/40615\n\tif (!additionalData) {\n\t\tconsole.log(`second-instance: additionalData === ${additionalData}, likely due to an empty list of command-line arguments.`);\n\t\treturn;\n\t}\n\n\tconst argv = additionalData.argv;\n\tconst args = parser.parse_args(argv);\n\tif (args.file_path) {\n\t\tconst file_path = path.resolve(workingDirectory, args.file_path);\n\t\tconsole.log(\"second-instance: Opening file from second instance:\", file_path);\n\t\topen_file_in_app(file_path);\n\t}\n});\n\n// On OS X it's common to re-create a window in the app when the\n// dock icon is clicked and there are no other windows open.\n// Don't really need focus/restore logic of activate_app here,\n// as I believe macOS will do that, but it's simpler to just call activate_app.\napp.on(\"activate\", activate_app);\n\n// Create the main window when Electron is ready.\n// Use `activate_app` instead of `app.on(\"ready\", createWindow)`, because it includes a check for an existing window,\n// so it could avoid potentially creating two windows at startup (though I suspect the event order would prevent that).\nactivate_app();\n\n// Test cases for opening files in the app:\n//\n//                                                                    |                                                                     |\n//                                                                    |                     App State Before Action                         |\n//                                                                    | ------------------------------------------------------------------- |\n// | Operating System | Action                                        | App Window Open | App Running with No Windows | App Completely Quit |\n// | ---------------- | --------------------------------------------- | --------------- | --------------------------- | ------------------- |\n// | 🍏 Mac           | Open With[1]                                  |                 |                             |                     |\n// | 🍏 Mac           | Drag onto dock icon                           |                 |                             |                     |\n// | 🍏 Mac           | Drag onto desktop icon                        |                 |                             |                     |\n// | 🍏 Mac           | Drag onto app window directly                 |                 | N/A                         | N/A                 |\n// | 🍏 Mac           | Drag onto app window after hovering dock icon | [3]             | N/A                         | N/A                 |\n// | 🍏 Mac           | File > Open                                   |                 | N/A [4]                     | N/A                 |\n// | 🪟 Windows       | Open With[1]                                  |                 | N/A                         |                     |\n// | 🪟 Windows       | Drag onto taskbar icon                        | N/A             | N/A                         | N/A                 |\n// | 🪟 Windows       | Drag onto JS Paint shortcut desktop icon      |                 | N/A                         |                     |\n// | 🪟 Windows       | Drag onto app window                          |                 | N/A                         | N/A                 |\n// | 🪟 Windows       | File > Open in app                            |                 | N/A                         | N/A                 |\n// | 🐧 Ubuntu        | Open With[1]                                  |                 | N/A                         |                     |\n// | 🐧 Ubuntu        | Drag onto dock icon                           | N/A             | N/A                         | N/A                 |\n// | 🐧 Ubuntu        | Drag onto desktop icon[2]                     |                 | N/A                         |                     |\n// | 🐧 Ubuntu        | Drag onto app window                          |                 | N/A                         | N/A                 |\n// | 🐧 Ubuntu        | File > Open                                   |                 | N/A                         | N/A                 |\n//\n// [1] On Mac, make sure to test with Open With > Other... > Cmd+Shift+G, paste ~/Projects/jspaint/out/make/zip/darwin/x64/JS Paint.app\n//     even if JS Paint shows up in the list, because it might not be the one you expect.\n// [2] I've tested this by dragging onto the /lib/jspaint/jspaint binary so far.\n// [3] This seems to be broken, but I don't know if macOS supports it.\n//     It would be a middle ground between having the app as a target and a specific point on a window,\n//     so they might not have an API for it, or it may be uncommon to implement at the app level.\n//     I'm not familiar enough with macOS to say.\n// [4] Not applicable until/unless I add native menus with File > Open, since macOS menu bar is present without windows.\n"
  },
  {
    "path": "src/error-handling-basic.js",
    "content": "/* eslint-disable no-useless-concat */\n/* eslint-disable no-alert */\n\n// Use only ES5 syntax for this script!\n// (I would enforce this but I wasn't able to get it working with ESLint.)\n\n// Set up basic global error handling, which we can override later in error-handling-enhanced.js\n\nvar isIE = /MSIE \\d|Trident.*rv:/.test(navigator.userAgent);\n\nwindow.onerror = function (msg, url, lineNo, columnNo, _error) {\n\tif (isIE) {\n\t\treturn false; // Don't need alerts postponing the \"not supported\" message.\n\t}\n\tvar string = msg.toLowerCase();\n\tvar substring = \"script error\";\n\tif (string.indexOf(substring) > -1) {\n\t\talert(\"Script Error: See Browser Console for Detail\");\n\t} else {\n\t\t// try {\n\t\t// \t// try-catch in case of circular references or old browsers without JSON.stringify\n\t\t// \terror = JSON.stringify(error);\n\t\t// } catch (e) {}\n\t\talert(\"Internal application error: \" + msg + \"\\n\\n\" + \"URL: \" + url + \"\\n\" + \"Line: \" + lineNo + \"\\n\" + \"Column: \" + columnNo);\n\t}\n\treturn false;\n};\n\nwindow.onunhandledrejection = function (event) {\n\tif (isIE) {\n\t\treturn false; // Don't need alerts postponing the \"not supported\" message.\n\t}\n\talert(\"Unhandled Rejection: \" + event.reason);\n};\n\n// Show a message for old Internet Explorer.\nif (isIE) {\n\tvar html =\n\t\t\"<style>\" +\n\t\t\"\tbody { text-align: center; font-family: sans-serif; }\" +\n\t\t\"\thr { width: 180px; }\" +\n\t\t\"\t.logo { position: relative; top: 3px; }\" +\n\t\t\"</style>\" +\n\t\t'<div className=\"not-supported\">' +\n\t\t'\t<h1><img src=\"images/icons/32x32.png\" class=\"logo\"> JS Paint</h1>' +\n\t\t\"\t<h2>Internet Explorer is not supported!</h2>\" +\n\t\t'\t<p className=\"not-supported-details\">' +\n\t\t\"\t\tTry \" +\n\t\t'\t\t<a href=\"https://www.mozilla.org/firefox/\">Firefox</a>, ' +\n\t\t'\t\t<a href=\"https://www.google.com/chrome/\">Chrome</a>, ' +\n\t\t\"\t\tor \" +\n\t\t'\t\t<a href=\"https://www.microsoft.com/edge/\">Edge</a>.' +\n\t\t\"\t</p>\" +\n\t\t\"\t<hr>\" +\n\t\t\"\t<p>\" +\n\t\t'\t\t<a href=\"about.html\">More about JS Paint</a>' +\n\t\t\"\t</p>\" +\n\t\t\"</div>\";\n\t// Wait for body to exist.\n\tvar interval = setInterval(function () {\n\t\tif (document.body) {\n\t\t\tclearInterval(interval);\n\t\t\tdocument.body.innerHTML = html;\n\t\t}\n\t}, 100);\n}\n"
  },
  {
    "path": "src/error-handling-enhanced.js",
    "content": "// @ts-check\n/* global localize */\n\nimport { show_error_message } from \"./functions.js\";\n\n// import { localize } from \"./app-localization.js\";\n\n// This script progressively enhances from error-handling-basic.js.\n\n// Note that this can't simply be merged with the other onerror handler with a try/catch,\n// falling back to the other handler, because `showMessageBox` is async,\n// and could throw an error if used before dependencies are met[1] or if there was an error in the error handling itself,\n// and `try` doesn't catch errors in async code. It would need to be awaited.\n// And making `show_error_message` return a promise might cause subtle problems due to the pattern of `return show_error_message()`.\n// [1]: This possibility may be reduced as I'm transitioning to ES Modules.\nvar old_onerror = window.onerror;\nwindow.onerror = function (message, source, lineno, colno, error) {\n\ttry {\n\t\t/** @type {Error | string} */\n\t\tvar error_details = \"\";\n\t\tif (!error) {\n\t\t\t// Some errors don't give an error object, like \"ResizeObserver loop limit exceeded\"\n\t\t\t// in which case the message should be used.\n\t\t\t// The source/lineno/colno arguments are not helpful in this case.\n\t\t\t// To test this: copy code (excluding onerror handler) from this nice repo: https://github.com/OliverJAsh/resize-observer-loop-tests/blob/6a9a5bd8e443c38d3df63833fc7e04abfc6fec32/simple.html#L8-L25\n\t\t\t// (BTW: I could specifically check that `source === location.href` to ignore the source/lineno/colno arguments, and otherwise show them...)\n\t\t\terror_details = /** @type {string} */(message); // This is a string, never an Event. Event is for onerror of images etc.\n\t\t} else if (\"stack\" in error && error.stack.indexOf(source) === -1) {\n\t\t\t// Some errors give an error object without a stack trace, like \"SyntaxError: Unexpected reserved word\",\n\t\t\t// but the source/lineno/colno are actually available.\n\t\t\t// There's no stack trace because it hasn't started executing yet.\n\t\t\t// Still it would be nice if they gave a \"fake\" stack trace with the source/lineno/colno,\n\t\t\t// so we don't have to handle this special case.\n\t\t\terror_details = `${message}\\n\\nURL: ${source}\\nLine: ${lineno}\\nColumn: ${colno}`;\n\t\t} else {\n\t\t\terror_details = error;\n\t\t}\n\t\tshow_error_message(localize(\"Internal application error.\"), error_details);\n\t} catch (e) {\n\t\told_onerror(message, source, lineno, colno, error);\n\t\tconsole.warn(\"Error in error handler:\", e);\n\t}\n};\n\nvar old_onunhandledrejection = window.onunhandledrejection;\nvar restore_new_onunhandledrejection_tid;\nvar new_onunhandledrejection = function (event) {\n\t// Just in case show_error_message triggers a new unhandledrejection event,\n\t// we need to make sure we don't call it again.\n\t// Test by adding to the top of show_error_message:\n\t// Promise.reject(new Error(\"EMIT EMIT EMIT\"))\n\t// Also test:\n\t// throw new Error(\"EMIT EMIT EMIT\");\n\t// I want my error handling to be RESILIENT!\n\twindow.onunhandledrejection = old_onunhandledrejection;\n\tclearTimeout(restore_new_onunhandledrejection_tid);\n\trestore_new_onunhandledrejection_tid = setTimeout(function () {\n\t\twindow.onunhandledrejection = new_onunhandledrejection;\n\t}, 0);\n\n\ttry {\n\t\tshow_error_message(localize(\"Internal application error.\") + \"\\nUnhandled Rejection.\", event.reason);\n\t} catch (e) {\n\t\told_onunhandledrejection.call(window, event);\n\t\tconsole.warn(\"Error in unhandledrejection handler:\", e);\n\t}\n};\nwindow.onunhandledrejection = new_onunhandledrejection;\n"
  },
  {
    "path": "src/extra-tools.js",
    "content": "// @ts-nocheck\n/* global airbrush_size, brush_canvas, brush_ctx, brush_shape, brush_size, stroke_color */\n\nimport { get_brush_canvas_size, render_brush } from \"./image-manipulation.js\";\nimport { $choose_airbrush_size, $choose_brush } from \"./tool-options.js\";\n\nconst extra_tools = [{\n\tname: \"Airbrushbrush\",\n\tdescription: \"Draws randomly within a radius based on the selected Airbrush size, using a brush with the selected shape and size.\",\n\tcursor: [\"precise-dotted\", [16, 16], \"crosshair\"],\n\tcontinuous: \"time\",\n\trendered_color: \"\",\n\trendered_size: 0,\n\trendered_shape: \"\",\n\tpaint(ctx, x, y) {\n\t\t// @XXX: copy pasted all this brush caching/rendering code!\n\t\t// @TODO: DRY!\n\t\tconst csz = get_brush_canvas_size(brush_size, brush_shape);\n\t\tif (\n\t\t\tthis.rendered_shape !== brush_shape ||\n\t\t\tthis.rendered_color !== stroke_color ||\n\t\t\tthis.rendered_size !== brush_size\n\t\t) {\n\t\t\tbrush_canvas.width = csz;\n\t\t\tbrush_canvas.height = csz;\n\t\t\t// don't need to do brush_ctx.disable_image_smoothing() currently because images aren't drawn to the brush\n\n\t\t\tbrush_ctx.fillStyle = brush_ctx.strokeStyle = stroke_color;\n\t\t\trender_brush(brush_ctx, brush_shape, brush_size);\n\n\t\t\tthis.rendered_color = stroke_color;\n\t\t\tthis.rendered_size = brush_size;\n\t\t\tthis.rendered_shape = brush_shape;\n\t\t}\n\t\tconst draw_brush = (x, y) => {\n\t\t\tctx.drawImage(brush_canvas, Math.ceil(x - csz / 2), Math.ceil(y - csz / 2));\n\t\t};\n\t\tconst r = airbrush_size * 2;\n\t\tfor (let i = 0; i < 6 + r / 5; i++) {\n\t\t\tconst rx = (Math.random() * 2 - 1) * r;\n\t\t\tconst ry = (Math.random() * 2 - 1) * r;\n\t\t\tconst d = rx * rx + ry * ry;\n\t\t\tif (d <= r * r) {\n\t\t\t\tdraw_brush(x + ~~rx, y + ~~ry);\n\t\t\t}\n\t\t}\n\t},\n\t$options: $choose_brush,\n}, {\n\tname: \"Spirobrush\",\n\tdescription: \"Spirals chaotically using a brush with the selected shape and size.\",\n\tcursor: [\"precise-dotted\", [16, 16], \"crosshair\"],\n\tcontinuous: \"time\",\n\trendered_color: \"\",\n\trendered_size: 0,\n\trendered_shape: \"\",\n\tposition: {\n\t\tx: 0,\n\t\ty: 0,\n\t},\n\tvelocity: {\n\t\tx: 0,\n\t\ty: 0,\n\t},\n\tpointerdown(_ctx, x, y) {\n\t\tthis.position.x = x;\n\t\tthis.position.y = y;\n\t\tthis.velocity.x = 0;\n\t\tthis.velocity.y = 0;\n\t},\n\tpaint(ctx, x, y) {\n\t\t// @XXX: copy pasted all this brush caching/rendering code!\n\t\t// @TODO: DRY!\n\t\tconst csz = get_brush_canvas_size(brush_size, brush_shape);\n\t\tif (\n\t\t\tthis.rendered_shape !== brush_shape ||\n\t\t\tthis.rendered_color !== stroke_color ||\n\t\t\tthis.rendered_size !== brush_size\n\t\t) {\n\t\t\tbrush_canvas.width = csz;\n\t\t\tbrush_canvas.height = csz;\n\t\t\t// don't need to do brush_ctx.disable_image_smoothing() currently because images aren't drawn to the brush\n\n\t\t\tbrush_ctx.fillStyle = brush_ctx.strokeStyle = stroke_color;\n\t\t\trender_brush(brush_ctx, brush_shape, brush_size);\n\n\t\t\tthis.rendered_color = stroke_color;\n\t\t\tthis.rendered_size = brush_size;\n\t\t\tthis.rendered_shape = brush_shape;\n\t\t}\n\t\tconst draw_brush = (x, y) => {\n\t\t\tctx.drawImage(brush_canvas, Math.ceil(x - csz / 2), Math.ceil(y - csz / 2));\n\t\t};\n\t\tfor (let i = 0; i < 60; i++) {\n\t\t\tconst x_diff = x - this.position.x;\n\t\t\tconst y_diff = y - this.position.y;\n\t\t\tconst dist = Math.hypot(x_diff, y_diff);\n\t\t\tconst divisor = Math.max(1, dist);\n\t\t\tconst force_x = x_diff / divisor;\n\t\t\tconst force_y = y_diff / divisor;\n\t\t\tthis.velocity.x += force_x;\n\t\t\tthis.velocity.y += force_y;\n\t\t\tthis.position.x += this.velocity.x;\n\t\t\tthis.position.y += this.velocity.y;\n\t\t\tdraw_brush(this.position.x, this.position.y);\n\t\t}\n\t},\n\t$options: $choose_brush,\n}, {\n\tname: \"Airbrush Options\",\n\tdescription: \"Lets you configure the Airbrushbrush. It uses this type of tool option as well.\",\n\tcursor: [\"airbrush\", [7, 22], \"crosshair\"],\n\tcontinuous: \"time\",\n\tpaint(_ctx, _x, _y) {\n\n\t},\n\t$options: $choose_airbrush_size,\n}];\n\nexport { extra_tools };\n\n"
  },
  {
    "path": "src/eye-gaze-mode.js",
    "content": "// @ts-check\n// eslint-disable-next-line no-unused-vars\n/* global pointers:writable */\n/* global $Window, main_canvas, pointer_active, selected_tool, TrackyMouse */\nimport { change_url_param, undo } from \"./functions.js\";\nimport { $G, load_image_simple } from \"./helpers.js\";\nimport { TOOL_CURVE, TOOL_FILL, TOOL_MAGNIFIER, TOOL_PICK_COLOR, TOOL_POLYGON } from \"./tools.js\";\n\n// Tracky Mouse provides dwell clicking and head tracking features.\n// https://trackymouse.js.org/\n\n\nlet dwell_clicker = { paused: false, dispose: () => { } };\n\nlet clean_up_dwell_clicker = () => { };\n$G.on(\"dwell-clicker-toggled\", () => {\n\tif ($(\"body\").hasClass(\"dwell-clicker-mode\")) {\n\t\tinit_dwell_clicker();\n\t} else {\n\t\tclean_up_dwell_clicker();\n\t}\n});\nif ($(\"body\").hasClass(\"dwell-clicker-mode\")) {\n\t// #region Initialization (continued; marking stuff that ideally should be at the end of the file)\n\tinit_dwell_clicker();\n\t// #endregion\n}\n\nlet clean_up_tracky_mouse_ui = () => { };\n$G.on(\"head-tracker-toggled\", () => {\n\tif ($(\"body\").hasClass(\"head-tracker-mode\")) {\n\t\tinit_tracky_mouse_ui();\n\t} else {\n\t\tclean_up_tracky_mouse_ui();\n\t}\n});\nif ($(\"body\").hasClass(\"head-tracker-mode\")) {\n\t// #region Initialization (continued; marking stuff that ideally should be at the end of the file)\n\tinit_tracky_mouse_ui();\n\t// #endregion\n}\n\nconst dwell_clicker_config = {\n\ttargets: `\n\t\tbutton:not([disabled]),\n\t\tinput,\n\t\ttextarea,\n\t\tlabel,\n\t\ta,\n\t\tdetails summary,\n\t\t.flip-and-rotate .sub-options .radio-wrapper,\n\t\t.current-colors,\n\t\t.color-button,\n\t\t.edit-colors-window .swatch,\n\t\t.edit-colors-window .rainbow-canvas,\n\t\t.edit-colors-window .luminosity-canvas,\n\t\t.tool:not(.selected),\n\t\t.chooser-option,\n\t\t.menu-button:not(.active),\n\t\t.menu-item,\n\t\t.main-canvas,\n\t\t.selection canvas,\n\t\t.handle,\n\t\t.grab-region,\n\t\t.window:not(.maximized) .window-titlebar,\n\t\t.history-entry\n\t`,\n\tnoCenter: (target) => (\n\t\ttarget.matches(`\n\t\t\t.main-canvas,\n\t\t\t.selection canvas,\n\t\t\t.window-titlebar,\n\t\t\t.rainbow-canvas,\n\t\t\t.luminosity-canvas,\n\t\t\tinput[type=\"range\"]\n\t\t`)\n\t),\n\tretarget: [\n\t\t// Nudge hovers near the edges of the canvas onto the canvas\n\t\t{ from: \".canvas-area\", to: \".main-canvas\", withinMargin: 50 },\n\t\t// Top level menus are just immediately switched between for now.\n\t\t// Prevent awkward hover clicks on top level menu buttons while menus are open.\n\t\t{\n\t\t\tfrom: (target) => (\n\t\t\t\t(target.closest(\".menu-button\") || target.matches(\".menu-container\")) &&\n\t\t\t\tdocument.querySelector(\".menu-button.active\") != null\n\t\t\t),\n\t\t\tto: null,\n\t\t},\n\t\t// Can we make it easier to click on help topics with short names?\n\t\t// { from: \".help-window li\", to: (target) => target.querySelector(\".item\")},\n\t],\n\tisEquivalentTarget: (apparent_hover_target, hover_target) => (\n\t\tapparent_hover_target.closest(\"label\") === hover_target ||\n\t\tapparent_hover_target.closest(\".radio-wrapper\") === hover_target\n\t),\n\tdwellClickEvenIfPaused: (target) => (\n\t\ttarget.matches(\".toggle-dwell-clicking\")\n\t),\n\tshouldDrag: (target) => (\n\t\ttarget.matches(\".window-titlebar, .window-titlebar *:not(button)\") ||\n\t\ttarget.matches(\".selection, .selection *, .handle, .grab-region\") ||\n\t\t(\n\t\t\ttarget === main_canvas &&\n\t\t\tselected_tool.id !== TOOL_PICK_COLOR &&\n\t\t\tselected_tool.id !== TOOL_FILL &&\n\t\t\tselected_tool.id !== TOOL_MAGNIFIER &&\n\t\t\tselected_tool.id !== TOOL_POLYGON &&\n\t\t\tselected_tool.id !== TOOL_CURVE\n\t\t)\n\t),\n\tisHeld: () => pointer_active,\n\tclick: ({ target, x, y }) => {\n\t\tif (target.matches(\"button:not(.toggle)\")) {\n\t\t\ttarget.style.borderImage = \"var(--inset-deep-border-image)\";\n\t\t\tsetTimeout(() => {\n\t\t\t\ttarget.style.borderImage = \"\";\n\t\t\t\t// delay the button.click() as well, so the pressed state is\n\t\t\t\t// visible even if the button closes a dialog\n\t\t\t\twindow.untrusted_gesture = true;\n\t\t\t\ttarget.click();\n\t\t\t\twindow.untrusted_gesture = false;\n\t\t\t}, 100);\n\t\t} else if (target.matches(\"input[type='range']\")) {\n\t\t\tconst rect = target.getBoundingClientRect();\n\t\t\tconst vertical =\n\t\t\t\ttarget.getAttribute(\"orient\") === \"vertical\" ||\n\t\t\t\t(getCurrentRotation(target) !== 0) ||\n\t\t\t\trect.height > rect.width;\n\t\t\tconst min = Number(target.min);\n\t\t\tconst max = Number(target.max);\n\t\t\tconst v = (\n\t\t\t\tvertical ?\n\t\t\t\t\t(y - rect.top) / rect.height :\n\t\t\t\t\t(x - rect.left) / rect.width\n\t\t\t) * (max - min) + min;\n\t\t\ttarget.value = v;\n\t\t\twindow.untrusted_gesture = true;\n\t\t\ttarget.dispatchEvent(new Event(\"input\", { bubbles: true }));\n\t\t\ttarget.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\t\t\twindow.untrusted_gesture = false;\n\t\t} else {\n\t\t\twindow.untrusted_gesture = true;\n\t\t\ttarget.click();\n\t\t\tif (target.matches(\"input, textarea\")) {\n\t\t\t\ttarget.focus();\n\t\t\t}\n\t\t\twindow.untrusted_gesture = false;\n\t\t}\n\t\t// Source: https://stackoverflow.com/a/54492696/2624876\n\t\tfunction getCurrentRotation(el) {\n\t\t\tconst st = window.getComputedStyle(el, null);\n\t\t\tconst tm = st.getPropertyValue(\"-webkit-transform\") ||\n\t\t\t\tst.getPropertyValue(\"-moz-transform\") ||\n\t\t\t\tst.getPropertyValue(\"-ms-transform\") ||\n\t\t\t\tst.getPropertyValue(\"-o-transform\") ||\n\t\t\t\tst.getPropertyValue(\"transform\") ||\n\t\t\t\t\"none\";\n\t\t\tif (tm !== \"none\") {\n\t\t\t\tconst [a, b] = tm.split(\"(\")[1].split(\")\")[0].split(\",\").map(Number);\n\t\t\t\treturn Math.round(Math.atan2(a, b) * (180 / Math.PI));\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\t},\n\tbeforeDispatch: () => {\n\t\twindow.untrusted_gesture = true;\n\t},\n\tafterDispatch: () => {\n\t\twindow.untrusted_gesture = false;\n\t},\n\tbeforePointerDownDispatch() {\n\t\tpointers = []; // prevent multi-touch panning\n\t},\n\tafterReleaseDrag() {\n\t\tpointers = []; // prevent multi-touch panning\n\t},\n};\n\nasync function init_dwell_clicker() {\n\tawait new Promise((resolve) => $(resolve)); // wait for document ready so app UI is appended before Dwell Clicker visuals\n\n\t// (TODO: disable hovering to open submenus (other than with dwell clicking) while Dwell Clicker is enabled?)\n\n\tdwell_clicker = TrackyMouse.initDwellClicking(dwell_clicker_config);\n\n\tupdate_floating_buttons();\n\n\tclean_up_dwell_clicker = () => {\n\t\tconsole.log(\"Cleaning up / disabling Dwell Clicker mode\");\n\t\tdwell_clicker.dispose();\n\t\tupdate_floating_buttons();\n\t\tclean_up_dwell_clicker = () => { };\n\t};\n}\n\nvar tracky_mouse_deps_promise;\n\nasync function init_tracky_mouse_ui() {\n\tawait new Promise((resolve) => $(resolve)); // wait for document ready... maybe not needed here?\n\t// block for indentation to avoid confusing git diff\n\t{\n\t\tif (!tracky_mouse_deps_promise) {\n\t\t\tTrackyMouse.dependenciesRoot = \"lib/tracky-mouse/core\";\n\t\t\ttracky_mouse_deps_promise = TrackyMouse.loadDependencies();\n\t\t}\n\t\tawait tracky_mouse_deps_promise;\n\n\t\tconst $tracky_mouse_window = $Window({\n\t\t\ttitle: \"Tracky Mouse\",\n\t\t\ticon: await load_image_simple(\"images/tracky-mouse-16x16.png\"),\n\t\t});\n\t\t$tracky_mouse_window.addClass(\"tracky-mouse-window\");\n\t\tconst tracky_mouse_container = $tracky_mouse_window.$content[0];\n\n\t\t$tracky_mouse_window.on(\"closed\", () => {\n\t\t\tchange_url_param(\"head-tracker\", false);\n\t\t});\n\n\t\t// Use a minimize target so that the window doesn't minimize to the bottom left corner of the screen, overlapping the floating buttons.\n\t\t// Adding it to the menu bar ensures visibility and no overlap because it will wrap to the next row if necessary.\n\t\t// However, this is volatile because if I decided to destroy and recreate the menu bar, this extra button would be lost.\n\t\t// The OS-GUI.js menu bar API doesn't support changing menus on the fly yet, so I'm likely to want to do that (for Recent Files, for example).\n\t\t// I could make an event for menu modifications and listen for it here and re-add the minimize target if necessary.\n\t\t// Of course if OS-GUI.js does support changing menus in the future, I could make this minimize target an actual menu item,\n\t\t// which would be a little different but probably good. (I would need to support non-menu-opening top level buttons too - a real Windows feature, btw.)\n\t\tconst minimize_target = document.createElement(\"button\");\n\t\tminimize_target.classList.add(\"minimize-target\");\n\t\tminimize_target.title = \"Restore window\";\n\t\tminimize_target.addEventListener(\"click\", () => {\n\t\t\tif ($tracky_mouse_window.is(\":visible\")) {\n\t\t\t\t$tracky_mouse_window.minimize();\n\t\t\t} else {\n\t\t\t\t$tracky_mouse_window.unminimize();\n\t\t\t}\n\t\t});\n\t\tminimize_target.textContent = \"Tracky Mouse\";\n\t\tconst icon = document.createElement(\"img\");\n\t\ticon.src = \"images/tracky-mouse-16x16.png\";\n\t\ticon.width = 16;\n\t\ticon.height = 16;\n\t\tminimize_target.prepend(icon);\n\t\t$(\".menus\").append(minimize_target);\n\t\t$tracky_mouse_window.setMinimizeTarget(minimize_target);\n\n\t\tconst tracky_mouse_ui = TrackyMouse.init(tracky_mouse_container);\n\t\tTrackyMouse.useCamera();\n\n\t\t$tracky_mouse_window.center();\n\n\t\tconst get_event_options = ({ x, y }) => {\n\t\t\treturn {\n\t\t\t\tview: window, // needed for offsetX/Y calculation\n\t\t\t\tclientX: x,\n\t\t\t\tclientY: y,\n\t\t\t\tpointerId: 1234567890,\n\t\t\t\tpointerType: \"mouse\",\n\t\t\t\tisPrimary: true,\n\t\t\t\tbubbles: true,\n\t\t\t\tcancelable: true,\n\t\t\t};\n\t\t};\n\n\t\tlet last_el_over;\n\t\tTrackyMouse.onPointerMove = (x, y) => {\n\t\t\tconst target = document.elementFromPoint(x, y) || document.body;\n\t\t\tif (target !== last_el_over) {\n\t\t\t\tif (last_el_over) {\n\t\t\t\t\twindow.untrusted_gesture = true;\n\t\t\t\t\tconst event = new /*PointerEvent*/$.Event(\"pointerleave\", Object.assign(get_event_options({ x, y }), {\n\t\t\t\t\t\tbutton: 0,\n\t\t\t\t\t\tbuttons: 1,\n\t\t\t\t\t\tbubbles: false,\n\t\t\t\t\t\tcancelable: false,\n\t\t\t\t\t}));\n\t\t\t\t\t// last_el_over.dispatchEvent(event);\n\t\t\t\t\t$(last_el_over).trigger(event);\n\t\t\t\t\twindow.untrusted_gesture = false;\n\t\t\t\t}\n\t\t\t\twindow.untrusted_gesture = true;\n\t\t\t\tconst event = new /*PointerEvent*/$.Event(\"pointerenter\", Object.assign(get_event_options({ x, y }), {\n\t\t\t\t\tbutton: 0,\n\t\t\t\t\tbuttons: 1,\n\t\t\t\t\tbubbles: false,\n\t\t\t\t\tcancelable: false,\n\t\t\t\t}));\n\t\t\t\t// target.dispatchEvent(event);\n\t\t\t\t$(target).trigger(event);\n\t\t\t\twindow.untrusted_gesture = false;\n\t\t\t\tlast_el_over = target;\n\t\t\t}\n\t\t\twindow.untrusted_gesture = true;\n\t\t\tconst event = new PointerEvent/*$.Event*/(\"pointermove\", Object.assign(get_event_options({ x, y }), {\n\t\t\t\tbutton: 0,\n\t\t\t\tbuttons: 1,\n\t\t\t}));\n\t\t\ttarget.dispatchEvent(event);\n\t\t\t// $(target).trigger(event);\n\t\t\twindow.untrusted_gesture = false;\n\t\t};\n\n\t\t// tracky_mouse_container.querySelector(\".tracky-mouse-canvas\").classList.add(\"inset-deep\");\n\n\t\t// TODO: avoid using setInterval for this\n\t\tlet last_head_tracker_paused;\n\t\tconst update_paused_iid = setInterval(() => {\n\t\t\t// TODO: avoid accessing UI state like this\n\t\t\tconst head_tracker_paused = $tracky_mouse_window.find(\".tracky-mouse-start-stop-button\").attr(\"aria-pressed\") === \"false\";\n\t\t\t// Be careful so that the floating pause button still works.\n\t\t\tif (head_tracker_paused !== last_head_tracker_paused) {\n\t\t\t\tdwell_clicker.paused = head_tracker_paused;\n\t\t\t\tlast_head_tracker_paused = head_tracker_paused;\n\t\t\t}\n\t\t\tconst $pause_button = $(\".toggle-dwell-clicking\");\n\t\t\t// TODO: ensure disabled state is visually distinct\n\t\t\t// or instead of disabling it, make it toggle the head tracker pause state as well?\n\t\t\t// but that might be confusing\n\t\t\t$pause_button.prop(\"disabled\", head_tracker_paused);\n\t\t\t// TODO: DRY\n\t\t\tconst pause_button_text = \"Pause Dwell Clicking\";\n\t\t\tconst resume_button_text = \"Resume Dwell Clicking\";\n\t\t\t$(\"body\").toggleClass(\"dwell-clicker-paused\", dwell_clicker.paused);\n\t\t\t$pause_button.attr(\"title\", dwell_clicker.paused ? resume_button_text : pause_button_text);\n\t\t}, 100);\n\n\t\tclean_up_tracky_mouse_ui = () => {\n\t\t\tconsole.log(\"Cleaning up / disabling Head Tracker mode\");\n\t\t\tclearInterval(update_paused_iid);\n\t\t\ttracky_mouse_ui.dispose();\n\t\t\tif (!$tracky_mouse_window.closed) {\n\t\t\t\t$tracky_mouse_window.close();\n\t\t\t}\n\t\t\tminimize_target.remove();\n\t\t\tclean_up_tracky_mouse_ui = () => { };\n\t\t};\n\t}\n}\n// TODO: move this to a separate file (note dependency on `dwell_clicker`)\nlet $floating_buttons = null;\nlet clean_up_floating_buttons = null;\nasync function update_floating_buttons() {\n\tawait new Promise((resolve) => $(resolve)); // wait for document ready so app UI is appended before floating buttons\n\n\tclean_up_floating_buttons?.();\n\n\tif (!$(\"body\").is(\".easy-undo-mode, .dwell-clicker-mode\")) {\n\t\treturn;\n\t}\n\n\t$floating_buttons =\n\t\t$(\"<div class='floating-buttons'/>\")\n\t\t\t.appendTo(\"body\");\n\n\tif ($(\"body\").hasClass(\"easy-undo-mode\")) {\n\t\t$(\"<button title='Undo' class='floating-undo-button'/>\")\n\t\t\t.on(\"click\", undo)\n\t\t\t.appendTo($floating_buttons)\n\t\t\t.append(\n\t\t\t\t$(\"<div class='button-icon'>\")\n\t\t\t);\n\t}\n\n\tif ($(\"body\").hasClass(\"dwell-clicker-mode\")) {\n\t\t// These are matched on exactly, for code that provides speech command synonyms\n\t\tconst pause_button_text = \"Pause Dwell Clicking\";\n\t\tconst resume_button_text = \"Resume Dwell Clicking\";\n\n\t\tconst $pause_button = $(`<button class=\"toggle-dwell-clicking\"/>`)\n\t\t\t.attr(\"title\", pause_button_text)\n\t\t\t.on(\"click\", () => {\n\t\t\t\tdwell_clicker.paused = !dwell_clicker.paused;\n\t\t\t\t// TODO: also apply when initially toggling Dwell Clicker mode\n\t\t\t\t// I guess the class would already be there, but the title would be wrong.\n\t\t\t\t$(\"body\").toggleClass(\"dwell-clicker-paused\", dwell_clicker.paused);\n\t\t\t\t$pause_button.attr(\"title\", dwell_clicker.paused ? resume_button_text : pause_button_text);\n\t\t\t})\n\t\t\t.appendTo($floating_buttons)\n\t\t\t.append(\n\t\t\t\t$(\"<div class='button-icon'>\")\n\t\t\t);\n\t} else if ($(\"body\").hasClass(\"easy-undo-mode\")) {\n\t\t// TODO: redo button (needs an icon)\n\t\t// $(\"<button title='Redo' class='floating-redo-button'/>\")\n\t\t// \t.on(\"click\", redo)\n\t\t// \t.appendTo($floating_buttons)\n\t\t// \t.append(\n\t\t// \t\t$(\"<div class='button-icon'>\")\n\t\t// \t);\n\t}\n\n\tconst update_width = () => {\n\t\t// It's transformed so needs getBoundingClientRect() instead of width()\n\t\t$(\"body\").css(\"--floating-buttons-width\", $floating_buttons[0].getBoundingClientRect().width + \"px\");\n\t};\n\tupdate_width();\n\n\t// Update when Enlarge UI mode is toggled, which currently triggers this event, piggybacking off of existing handlers for it, making it a misnomer\n\t// (but also when the theme is changed; either could alter the layout)\n\t$G.on(\"theme-load\", update_width);\n\n\tclean_up_floating_buttons = () => {\n\t\t$(\"body\").css(\"--floating-buttons-width\", \"0px\");\n\t\t$G.off(\"theme-load\", update_width);\n\t\t$floating_buttons.remove();\n\t\t$floating_buttons = null;\n\t\tclean_up_floating_buttons = null;\n\t};\n}\n\n$G.on(\"easy-undo-mode-toggled\", update_floating_buttons);\n\n// Enlarge UI mode: menu scaling\n// other scaling code is in specific files like $Component.js and $ToolWindow.js\n// but MenuBar isn't owned by this repo\n// TODO: separate file too?\n\nconst apply_scale = (menu_popup) => {\n\tconst enabled = $(\"body\").hasClass(\"enlarge-ui\");\n\n\tconst $menu_popup = $(menu_popup);\n\tconst is_submenu = $menu_popup.is(\"[data-semantic-parent^='menu-popup']\");\n\n\tconst reset_scale_css = () => {\n\t\t$menu_popup.css({\n\t\t\ttransform: \"\",\n\t\t\ttransformOrigin: \"\",\n\t\t\tmarginLeft: \"\",\n\t\t\tmarginTop: \"\",\n\t\t});\n\t};\n\n\tif (!enabled) {\n\t\tmenu_popup.getBoundingClientRect = HTMLElement.prototype.getBoundingClientRect;\n\t\treset_scale_css();\n\t\treturn;\n\t}\n\n\tlet own_call = true;\n\t// Override getBoundingClientRect to ignore the transform,\n\t// and potentially schedule updating the scale, for a resize event.\n\t// It's used in here but also in MenuBar.js for positioning (see update_position_from_containing_bounds)\n\tmenu_popup.getBoundingClientRect = () => {\n\t\treset_scale_css();\n\t\tconst bounds = HTMLElement.prototype.getBoundingClientRect.call(menu_popup);\n\t\t// For our own call of getBoundingClientRect, we don't want to recurse,\n\t\t// and we don't need to restore the CSS either since we'll be setting it again.\n\t\tif (!own_call) {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tapply_scale(menu_popup);\n\t\t\t});\n\t\t}\n\t\treturn bounds;\n\t};\n\n\t// Measure the untransformed size\n\tconst base_bounds = menu_popup.getBoundingClientRect();\n\town_call = false;\n\n\t// Define CSS properties for scaling\n\tconst scale = Math.min(1,\n\t\tMath.min(\n\t\t\tinnerWidth / base_bounds.width,\n\t\t\t(is_submenu ? innerHeight : innerHeight - base_bounds.top) / base_bounds.height,\n\t\t)\n\t);\n\tconst scaled_width = base_bounds.width * scale;\n\tconst scaled_height = base_bounds.height * scale;\n\tlet new_left = Math.max(Math.min(base_bounds.left, window.innerWidth - scaled_width), 0);\n\t// Move submenus to the right edge of the screen if there's not enough room\n\t// I don't know what Windows 98 does, but this feels better, although the left border is hard to see...\n\t// Also, not really taking into account RTL languages here.\n\t// Hm, also, this makes it inconsistent with the non-Enlarge UI mode behavior....\n\tif (base_bounds.left === 0 && is_submenu) {\n\t\tnew_left = window.innerWidth - scaled_width;\n\t}\n\tconst new_top = is_submenu ? Math.min(base_bounds.top, window.innerHeight - scaled_height) : base_bounds.top;\n\n\t$menu_popup.css({\n\t\ttransform: `scale(${scale})`,\n\t\ttransformOrigin: \"0% 0%\",\n\n\t\t// Don't need to reserve space for other elements since menu popups are floating\n\t\t// marginRight: base_bounds.width * (scale - 1),\n\t\t// marginBottom: base_bounds.height * (scale - 1),\n\n\t\t// Move the menu up/left to fit all on the screen\n\t\t// Not using left/top so that the effect can be reset; they're already used for positioning.\n\t\t// That may not be an important concern considering the menus would need repositioning when toggling the setting, and should really be closed when toggling the setting.\n\t\tmarginLeft: new_left - base_bounds.left,\n\t\tmarginTop: new_top - base_bounds.top,\n\t});\n};\n\nlet observer;\nconst update_auto_scaling = () => {\n\tif (observer) {\n\t\tobserver.disconnect();\n\t\tobserver = null;\n\t}\n\tif ($(\"body\").hasClass(\"enlarge-ui\")) {\n\t\t// - `.menu-popup` elements can exist in the DOM before the menu is opened, hidden with `style.display = \"none\";`\n\t\t// - `.menu-popup` elements may not exist yet when this code runs\n\t\t// - We want to avoid running the scaling code any time other than a menu being opened\n\t\t//   - It MUST not cause recursion when modifying the styles for scaling in the `MutationObserver` callback\n\t\t// - This code should work regardless of whether `.menu-popup` elements are be shown with `style.display = \"block\";` or `style.display = \"\";`\n\t\tobserver = new MutationObserver((mutations) => {\n\t\t\tfor (const mutation of mutations) {\n\t\t\t\tif (!(mutation.target instanceof HTMLElement)) {\n\t\t\t\t\tcontinue; // type narrowing, to avoid type checker errors\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tmutation.attributeName === \"style\" &&\n\t\t\t\t\tmutation.target.style.display !== \"none\" &&\n\t\t\t\t\tmutation.oldValue?.includes(\"display: none\") &&\n\t\t\t\t\tmutation.target.matches(\".menu-popup\")\n\t\t\t\t) {\n\t\t\t\t\t// setTimeout(() => {\n\t\t\t\t\tapply_scale(mutation.target);\n\t\t\t\t\t// }, 1000);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tobserver.observe(document.body, {\n\t\t\tattributes: true,\n\t\t\tattributeOldValue: true,\n\t\t\tattributeFilter: [\"style\"],\n\t\t\tsubtree: true,\n\t\t});\n\t}\n\t// Apply scaling to existing menus\n\tsetTimeout(() => {\n\t\t// Trigger update_position_from_containing_bounds in MenuBar.js, which uses getBoundingClientRect overridden above\n\t\tif (!$(\"body\").hasClass(\"enlarge-ui\")) {\n\t\t\tfor (const el of $(\".menu-popup\")) {\n\t\t\t\tel.dispatchEvent(new CustomEvent(\"update\", {}));\n\t\t\t}\n\t\t}\n\t\tfor (const el of $(\".menu-popup\")) {\n\t\t\tapply_scale(el);\n\t\t}\n\t}, 0);\n};\n$G.on(\"enlarge-ui-toggled\", update_auto_scaling);\nupdate_auto_scaling();\n\n"
  },
  {
    "path": "src/file-format-data.js",
    "content": "// @ts-check\n/* global get_direction, localize */\n\n// import { get_direction, localize } from \"./app-localization.js\";\n\n/** @type {ImageFileFormat[]} */\nlet image_formats = [];\n// const ext_to_image_formats = {}; // there can be multiple with the same extension, e.g. different bit depth BMP files\n// const mime_type_to_image_formats = {};\n/**\n * @param {string} mime_type\n * @param {string} name_and_exts\n * @param {ImageFileFormat[]} [target_array]\n */\nconst add_image_format = (mime_type, name_and_exts, target_array = image_formats) => {\n\t// Note: some localizations have commas instead of semicolons to separate file extensions\n\t// Assumption: file extensions are never localized\n\tconst format = {\n\t\tformatID: mime_type,\n\t\tmimeType: mime_type,\n\t\tname: localize(name_and_exts).replace(/\\s+\\([^(]+$/, \"\"),\n\t\tnameWithExtensions: localize(name_and_exts),\n\t\textensions: [],\n\t};\n\tconst ext_regexp = /\\*\\.([^);,]+)/g;\n\tif (get_direction() === \"rtl\") {\n\t\tconst rlm = \"\\u200F\";\n\t\tconst lrm = \"\\u200E\";\n\t\tformat.nameWithExtensions = format.nameWithExtensions.replace(ext_regexp, `${rlm}*.${lrm}$1${rlm}`);\n\t}\n\tlet match;\n\t// eslint-disable-next-line no-cond-assign\n\twhile (match = ext_regexp.exec(name_and_exts)) {\n\t\tconst ext = match[1];\n\t\t// ext_to_image_formats[ext] = ext_to_image_formats[ext] || [];\n\t\t// ext_to_image_formats[ext].push(format);\n\t\t// mime_type_to_image_formats[mime_type] = mime_type_to_image_formats[mime_type] || [];\n\t\t// mime_type_to_image_formats[mime_type].push(format);\n\t\tformat.extensions.push(ext);\n\t}\n\n\ttarget_array.push(format);\n};\n// First file extension in a parenthetical defines default for the format.\n// Strings are localized in add_image_format, don't need localize() here.\nadd_image_format(\"image/png\", \"PNG (*.png)\");\nadd_image_format(\"image/webp\", \"WebP (*.webp)\");\nadd_image_format(\"image/gif\", \"GIF (*.gif)\");\nadd_image_format(\"image/tiff\", \"TIFF (*.tif;*.tiff)\");\nadd_image_format(\"image/jpeg\", \"JPEG (*.jpg;*.jpeg;*.jpe;*.jfif)\");\nadd_image_format(\"image/x-bmp-1bpp\", \"Monochrome Bitmap (*.bmp;*.dib)\");\nadd_image_format(\"image/x-bmp-4bpp\", \"16 Color Bitmap (*.bmp;*.dib)\");\nadd_image_format(\"image/x-bmp-8bpp\", \"256 Color Bitmap (*.bmp;*.dib)\");\nadd_image_format(\"image/bmp\", \"24-bit Bitmap (*.bmp;*.dib)\");\n// add_image_format(\"image/x-bmp-32bpp\", \"32-bit Transparent Bitmap (*.bmp;*.dib)\");\n\n/**\n * Filter to only support 24bpp BMP files for File System Access API and Electron save dialog,\n * as these APIs don't allow you to access the selected file type.\n * You can only guess it from the file extension the user types.\n * @template {FileFormat} T\n * @param {T[]} formats\n * @returns {T[]}\n */\nconst formats_unique_per_file_extension = (formats) => {\n\t// first handle BMP format specifically to make sure the 24-bpp is the selected BMP format\n\tformats = formats.filter((format) =>\n\t\tformat.extensions.includes(\"bmp\") ? (/**@type {ImageFileFormat}*/(format).mimeType === \"image/bmp\") : true\n\t);\n\t// then generally uniquify on extensions\n\t// (this could be overzealous in case of partial overlap in extensions of different formats,\n\t// but in general it needs special care anyways, to decide which format should win)\n\t// This can't be simply chained with the above because it needs to use the intermediate, partially filtered formats array.\n\treturn formats.filter((format, format_index) =>\n\t\t!format.extensions.some((extension) =>\n\t\t\tformats.some((other_format, other_format_index) =>\n\t\t\t\tother_format_index < format_index &&\n\t\t\t\tother_format.extensions.includes(extension)\n\t\t\t)\n\t\t)\n\t);\n};\n\n// For the Open dialog, show more general format categories, like \"Bitmap Files\", maybe \"Icon Files\", etc.\n// @TODO: probably need to do this differently for showOpenFilePicker...\n/*\nconst image_format_categories = (image_formats) => {\n\timage_formats = image_formats.filter((format) =>\n\t\t!format.extensions.includes(\"bmp\")\n\t);\n\tadd_image_format(\"image/bmp\", localize(\"Bitmap Files (*.bmp)\").replace(\"(*.bmp)\", \"(*.bmp;*.dib)\"), image_formats);\n\t// add_image_format(\"\", \"Icon Files (*.ico;*.cur;*.ani;*.icns)\", image_formats);\n\t// add_image_format(\"\", \"All Picture Files\", image_formats);\n\t// add_image_format(\"\", \"All Files\", image_formats);\n\timage_formats.push({\n\t\t// TODO: we don't treat formatID and mimeType interchangeably, do we?\n\t\tformatID: \"IMAGE_FILES\",\n\t\tmimeType: \"image/*\", // but also application/pdf, not included here, but hopefully the mime type isn't what we go off of (I don't remember)\n\t\tname: localize(\"All Picture Files\"),\n\t\tnameWithExtensions: localize(\"All Picture Files\"),\n\t\textensions: image_formats.map((format) => format.extensions).flat(),\n\t});\n\timage_formats.push({\n\t\tformatID: \"ALL_FILES\",\n\t\tmimeType: \"*\" + \"/*\",\n\t\tname: localize(\"All Files\"),\n\t\tnameWithExtensions: localize(\"All Files\"),\n\t\textensions: [\"*\"], // Note: no other wildcard is allowed in the extension list\n\t});\n\treturn image_formats;\n};\n*/\n\n/** @type {PaletteFileFormat[]} */\nconst palette_formats = [];\nfor (const [format_id, format] of Object.entries(AnyPalette.formats)) {\n\tif (format.write) {\n\t\tconst inside_parens = format.fileExtensions.map((extension) => `*.${extension}`).join(\";\");\n\t\tpalette_formats.push({\n\t\t\tformatID: format_id,\n\t\t\tname: format.name,\n\t\t\tnameWithExtensions: `${format.name} (${inside_parens})`,\n\t\t\textensions: format.fileExtensions,\n\t\t});\n\t}\n}\npalette_formats.sort((a, b) =>\n\t// Order important formats first, starting with RIFF PAL format:\n\t+(b.formatID === \"RIFF_PALETTE\") - +(a.formatID === \"RIFF_PALETTE\") ||\n\t+(b.formatID === \"GIMP_PALETTE\") - +(a.formatID === \"GIMP_PALETTE\") ||\n\t0\n);\n\nexport { formats_unique_per_file_extension, image_formats, palette_formats };\n// Temporary globals until all dependent code is converted to ES Modules\nwindow.formats_unique_per_file_extension = formats_unique_per_file_extension; // used by electron-injected.js\n"
  },
  {
    "path": "src/functions.js",
    "content": "// @ts-check\n// eslint-disable-next-line no-unused-vars\n/* global $thumbnail_window:writable, canvas_bounding_client_rect:writable, current_history_node:writable, file_format:writable, file_name:writable, helper_layer:writable, history_node_to_cancel_to:writable, magnification:writable, monochrome:writable, palette:writable, pointer:writable, return_to_magnification:writable, return_to_tools:writable, root_history_node:writable, saved:writable, selected_colors:writable, selected_tool:writable, selected_tools:writable, selection:writable, show_grid:writable, show_thumbnail:writable, system_file_handle:writable, textbox:writable, thumbnail_canvas:writable, tool_transparent_mode:writable, transparency:writable, undos:writable */\n/* global $canvas, $canvas_area, $colorbox, $status_text, $toolbox, $Window, AccessKeys, applyCSSProperties, decodeBMP, default_canvas_height, default_canvas_width, default_magnification, default_tool, enable_palette_loading_from_indexed_images, encodeBMP, localize, main_canvas, main_ctx, monochrome_palette, my_canvas_height, my_canvas_width, new_local_session, parseThemeFileString, pointer_active, pointers, polychrome_palette, redos, systemHooks, text_tool_font, update_fill_and_stroke_colors_and_lineWidth, UPNG, UTIF */\n\nimport { $DialogWindow } from \"./$ToolWindow.js\";\nimport { OnCanvasHelperLayer } from \"./OnCanvasHelperLayer.js\";\nimport { OnCanvasSelection } from \"./OnCanvasSelection.js\";\nimport { OnCanvasTextBox } from \"./OnCanvasTextBox.js\";\n// import { localize } from \"./app-localization.js\";\nimport { default_palette } from \"./color-data.js\";\nimport { image_formats } from \"./file-format-data.js\";\nimport { $G, E, TAU, debounce, from_canvas_coords, get_help_folder_icon, get_icon_for_tool, get_rgba_from_color, is_discord_embed, is_pride_month, make_canvas, render_access_key, to_canvas_coords } from \"./helpers.js\";\nimport { apply_image_transformation, draw_grid, draw_selection_box, flip_horizontal, flip_vertical, invert_monochrome, invert_rgb, rotate, stretch_and_skew, threshold_black_and_white } from \"./image-manipulation.js\";\nimport { show_imgur_uploader } from \"./imgur.js\";\nimport { showMessageBox } from \"./msgbox.js\";\nimport { localStore } from \"./storage.js\";\nimport { TOOL_CURVE, TOOL_FREE_FORM_SELECT, TOOL_POLYGON, TOOL_SELECT, TOOL_TEXT, tools } from \"./tools.js\";\n// `sessions.js` must be loaded after `app.js`\n// This would cause it to be loaded earlier, and error trying to access `undos`\n// I'm surprised I haven't been bitten by this sort of bug, and I've\n// mostly converted the whole app to ES Modules!\n// TODO: make sessions.js export function to initialize it\n// import { new_local_session } from \"./sessions.js\";\n\n// expresses order in the URL as well as type\nconst param_types = {\n\t// settings\n\t\"eye-gaze-mode\": \"bool\", // maps to \"enlarge-ui\"+\"dwell-clicker\"+\"vertical-color-box-mode\"+\"easy-undo\"\n\t\"enlarge-ui\": \"bool\",\n\t\"easy-undo\": \"bool\",\n\t\"dwell-clicker\": \"bool\",\n\t\"head-tracker\": \"bool\",\n\t\"vertical-color-box-mode\": \"bool\", // could rename this to simply \"vertical-color-box\" or \"vertical-palette\"\n\t\"speech-recognition-mode\": \"bool\", // could rename this to simply \"voice\"\n\t// dev settings\n\t\"compare-reference\": \"bool\",\n\t\"compare-reference-tool-windows\": \"bool\",\n\t\"force-open-project-news\": \"bool\",\n\t// sessions\n\t\"local\": \"string\",\n\t\"session\": \"string\",\n\t\"load\": \"string\",\n};\n\nconst exclusive_params = [\n\t\"local\",\n\t\"session\",\n\t\"load\",\n];\n\nfunction get_all_url_params() {\n\t/** @type {Record<string, string | boolean>} */\n\tconst params = {};\n\tlocation.hash.replace(/^#/, \"\").split(/,/).forEach((param_decl) => {\n\t\t// colon is used in param value for URLs so split(\":\") isn't good enough\n\t\tconst colon_index = param_decl.indexOf(\":\");\n\t\tif (colon_index === -1) {\n\t\t\t// boolean value, implicitly true because it's in the URL\n\t\t\tconst param_name = param_decl;\n\t\t\tparams[param_name] = true;\n\t\t} else {\n\t\t\tconst param_name = param_decl.slice(0, colon_index);\n\t\t\tconst param_value = param_decl.slice(colon_index + 1);\n\t\t\tparams[param_name] = decodeURIComponent(param_value);\n\t\t}\n\t});\n\tfor (const [param_name, param_type] of Object.entries(param_types)) {\n\t\tif (param_type === \"bool\" && !params[param_name]) {\n\t\t\tparams[param_name] = false;\n\t\t}\n\t}\n\treturn params;\n}\n\nfunction get_url_param(param_name) {\n\treturn get_all_url_params()[param_name];\n}\n\n/**\n * @param {string} param_name\n * @param {string | boolean} value\n * @param {object} [options]\n * @param {boolean} [options.replace_history_state=false]\n */\nfunction change_url_param(param_name, value, { replace_history_state = false } = {}) {\n\tchange_some_url_params({ [param_name]: value }, { replace_history_state });\n}\n\n/**\n * @param {Record<string, string | boolean>} updates\n * @param {object} [options]\n * @param {boolean} [options.replace_history_state=false]\n */\nfunction change_some_url_params(updates, { replace_history_state = false } = {}) {\n\tfor (const exclusive_param of exclusive_params) {\n\t\tif (updates[exclusive_param]) {\n\t\t\texclusive_params.forEach((param) => {\n\t\t\t\tif (param !== exclusive_param) {\n\t\t\t\t\tupdates[param] = null; // must be enumerated (for Object.assign) but falsy, to get removed from the URL\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\tset_all_url_params(Object.assign({}, get_all_url_params(), updates), { replace_history_state });\n}\n\n/**\n * @param {Record<string, string | boolean>} params\n * @param {object} [options]\n * @param {boolean} [options.replace_history_state=false]\n */\nfunction set_all_url_params(params, { replace_history_state = false } = {}) {\n\n\tlet new_hash = \"\";\n\tfor (const [param_name, param_type] of Object.entries(param_types)) {\n\t\tif (params[param_name]) {\n\t\t\tif (new_hash.length) {\n\t\t\t\tnew_hash += \",\";\n\t\t\t}\n\t\t\tnew_hash += encodeURIComponent(param_name);\n\t\t\tif (param_type !== \"bool\") {\n\t\t\t\tnew_hash += \":\" + encodeURIComponent(params[param_name]);\n\t\t\t}\n\t\t}\n\t}\n\tlet query_string = location.search;\n\t// The Discord Activity needs to preserve the query string, so it's exempt from this.\n\tif (!query_string.includes(\"frame_id\")) {\n\t\t// Omit query string for theoretical backwards compatibility with old URLs.\n\t\t// TODO: what were these URLs? do they really still work? are they still relevant? probably not...\n\t\tquery_string = \"\";\n\t}\n\tconst new_url = `${location.origin}${location.pathname}${query_string}#${new_hash}`;\n\ttry {\n\t\t// can fail when running from file: protocol\n\t\tif (replace_history_state) {\n\t\t\thistory.replaceState(null, document.title, new_url);\n\t\t} else {\n\t\t\thistory.pushState(null, document.title, new_url);\n\t\t}\n\t} catch (_error) {\n\t\tlocation.hash = new_hash;\n\t}\n\n\t$G.triggerHandler(\"change-url-params\");\n}\n\nfunction update_magnified_canvas_size() {\n\t$canvas.css(\"width\", main_canvas.width * magnification);\n\t$canvas.css(\"height\", main_canvas.height * magnification);\n\n\tupdate_canvas_rect();\n}\n\nfunction update_canvas_rect() {\n\twindow.canvas_bounding_client_rect = main_canvas.getBoundingClientRect();\n\n\tupdate_helper_layer();\n}\n\nlet helper_layer_update_queued = false;\n/**\n * for updating the brush preview when the mouse stays in the same place,\n * but its coordinates in the document change due to scrolling or browser zooming (handled with scroll and resize events)\n * @type {{ clientX: number, clientY: number, devicePixelRatio: number }}\n */\nlet info_for_updating_pointer;\n/** @param {{ clientX: number, clientY: number }} [e] */\nfunction update_helper_layer(e) {\n\t// e should be passed for pointer events, but not scroll or resize events\n\t// e may be a synthetic event without clientX/Y, so ignore that (using isFinite)\n\t// e may also be a timestamp from requestAnimationFrame callback; ignore that\n\tif (e && isFinite(e.clientX)) {\n\t\tinfo_for_updating_pointer = { clientX: e.clientX, clientY: e.clientY, devicePixelRatio };\n\t}\n\tif (helper_layer_update_queued) {\n\t\t// window.console?.log(\"update_helper_layer - nah, already queued\");\n\t\treturn;\n\t} else {\n\t\t// window.console?.log(\"update_helper_layer\");\n\t}\n\thelper_layer_update_queued = true;\n\trequestAnimationFrame(() => {\n\t\thelper_layer_update_queued = false;\n\t\tupdate_helper_layer_immediately();\n\t});\n}\nfunction update_helper_layer_immediately() {\n\t// window.console?.log(\"Update helper layer NOW\");\n\tif (info_for_updating_pointer) {\n\t\tconst rescale = info_for_updating_pointer.devicePixelRatio / devicePixelRatio;\n\t\tinfo_for_updating_pointer.clientX *= rescale;\n\t\tinfo_for_updating_pointer.clientY *= rescale;\n\t\tinfo_for_updating_pointer.devicePixelRatio = devicePixelRatio;\n\t\tpointer = to_canvas_coords(info_for_updating_pointer);\n\t}\n\n\tconst scale = magnification * window.devicePixelRatio;\n\n\tif (!helper_layer) {\n\t\thelper_layer = new OnCanvasHelperLayer(0, 0, main_canvas.width, main_canvas.height, false, scale);\n\t}\n\n\tconst margin = 15;\n\tconst viewport_x = Math.floor(Math.max($canvas_area.scrollLeft() / magnification - margin, 0));\n\t// Nevermind, canvas, isn't aligned to the right in RTL layout!\n\t// const viewport_x =\n\t// \tget_direction() === \"rtl\" ?\n\t// \t\t// Note: $canvas_area.scrollLeft() can return negative numbers for RTL layout\n\t// \t\tMath.floor(Math.max(($canvas_area.scrollLeft() - $canvas_area.innerWidth()) / magnification + canvas.width - margin, 0)) :\n\t// \t\tMath.floor(Math.max($canvas_area.scrollLeft() / magnification - margin, 0));\n\tconst viewport_y = Math.floor(Math.max($canvas_area.scrollTop() / magnification - margin, 0));\n\tconst viewport_x2 = Math.floor(Math.min(viewport_x + $canvas_area.width() / magnification + margin * 2, main_canvas.width));\n\tconst viewport_y2 = Math.floor(Math.min(viewport_y + $canvas_area.height() / magnification + margin * 2, main_canvas.height));\n\tconst viewport_width = viewport_x2 - viewport_x;\n\tconst viewport_height = viewport_y2 - viewport_y;\n\tconst resolution_width = viewport_width * scale;\n\tconst resolution_height = viewport_height * scale;\n\tif (\n\t\thelper_layer.canvas.width !== resolution_width ||\n\t\thelper_layer.canvas.height !== resolution_height\n\t) {\n\t\thelper_layer.canvas.width = resolution_width;\n\t\thelper_layer.canvas.height = resolution_height;\n\t\thelper_layer.canvas.ctx.disable_image_smoothing();\n\t\thelper_layer.width = viewport_width;\n\t\thelper_layer.height = viewport_height;\n\t}\n\thelper_layer.x = viewport_x;\n\thelper_layer.y = viewport_y;\n\thelper_layer.position();\n\n\trender_canvas_view(helper_layer.canvas, scale, viewport_x, viewport_y, true);\n\n\tif (thumbnail_canvas && $thumbnail_window.is(\":visible\")) {\n\t\t// The thumbnail can be bigger or smaller than the viewport, depending on the magnification and thumbnail window size.\n\t\t// So can the document.\n\t\t// Ideally it should show the very corner if scrolled all the way to the corner,\n\t\t// so that you can get a thumbnail of any location just by scrolling.\n\t\t// But it's impossible if the thumbnail is smaller than the viewport. You have to resize the thumbnail window in that case.\n\t\t// (And if the document is smaller than the viewport, there's no scrolling to indicate where you want to get a thumbnail of.)\n\t\t// It gets clipped to the top left portion of the viewport if the thumbnail is too small.\n\n\t\t// This works except for if there's a selection, it affects the scrollable area, and it shouldn't affect this calculation.\n\t\t// const scroll_width = $canvas_area[0].scrollWidth - $canvas_area[0].clientWidth;\n\t\t// const scroll_height = $canvas_area[0].scrollHeight - $canvas_area[0].clientHeight;\n\n\t\t// These padding terms are negligible in comparison to the margin reserved for canvas handles,\n\t\t// which I'm not accounting for (except for clamping below).\n\t\tconst padding_left = parseFloat($canvas_area.css(\"padding-left\"));\n\t\tconst padding_top = parseFloat($canvas_area.css(\"padding-top\"));\n\t\tconst scroll_width = main_canvas.clientWidth + padding_left - $canvas_area[0].clientWidth;\n\t\tconst scroll_height = main_canvas.clientHeight + padding_top - $canvas_area[0].clientHeight;\n\t\t// Don't divide by less than one, or the thumbnail with disappear off to the top/left (or completely for NaN).\n\t\tlet scroll_x_fraction = $canvas_area[0].scrollLeft / Math.max(1, scroll_width);\n\t\tlet scroll_y_fraction = $canvas_area[0].scrollTop / Math.max(1, scroll_height);\n\t\t// If the canvas is larger than the document view, but not by much, and you scroll to the bottom or right,\n\t\t// the margin for the canvas handles can lead to the thumbnail being cut off or even showing\n\t\t// just blank space without this clamping (due to the not quite accurate scrollable area calculation).\n\t\tscroll_x_fraction = Math.min(scroll_x_fraction, 1);\n\t\tscroll_y_fraction = Math.min(scroll_y_fraction, 1);\n\n\t\tlet viewport_x = Math.floor(Math.max(scroll_x_fraction * (main_canvas.width - thumbnail_canvas.width), 0));\n\t\tlet viewport_y = Math.floor(Math.max(scroll_y_fraction * (main_canvas.height - thumbnail_canvas.height), 0));\n\n\t\trender_canvas_view(thumbnail_canvas, 1, viewport_x, viewport_y, false); // devicePixelRatio?\n\t}\n}\n\n/**\n * @param {PixelCanvas} hcanvas\n * @param {number} scale\n * @param {number} viewport_x\n * @param {number} viewport_y\n * @param {boolean} is_helper_layer\n */\nfunction render_canvas_view(hcanvas, scale, viewport_x, viewport_y, is_helper_layer) {\n\tupdate_fill_and_stroke_colors_and_lineWidth(selected_tool);\n\n\tconst grid_visible = show_grid && magnification >= 4 && (window.devicePixelRatio * magnification) >= 4 && is_helper_layer;\n\n\tconst hctx = hcanvas.ctx;\n\n\thctx.clearRect(0, 0, hcanvas.width, hcanvas.height);\n\n\tif (!is_helper_layer) {\n\t\t// Draw the actual document canvas (for the thumbnail)\n\t\t// (For the main canvas view, the helper layer is separate from (and overlaid on top of) the document canvas)\n\t\thctx.drawImage(main_canvas, viewport_x, viewport_y, hcanvas.width, hcanvas.height, 0, 0, hcanvas.width, hcanvas.height);\n\t}\n\n\tvar tools_to_preview = [...selected_tools];\n\n\t// Don't preview tools while dragging components/component windows\n\t// (The magnifier preview is especially confusing looking together with the component preview!)\n\tif ($(\"body\").hasClass(\"dragging\") && !pointer_active) {\n\t\t// tools_to_preview.length = 0;\n\t\t// Curve and Polygon tools have a persistent state over multiple gestures,\n\t\t// which is, as of writing, part of the \"tool preview\"; it's ugly,\n\t\t// but at least they don't have ALSO a brush like preview, right?\n\t\t// so we can just allow those thru\n\t\ttools_to_preview = tools_to_preview.filter((tool) =>\n\t\t\ttool.id === TOOL_CURVE ||\n\t\t\ttool.id === TOOL_POLYGON\n\t\t);\n\t}\n\n\t// the select box previews draw the document canvas onto the preview canvas\n\t// so they have something to invert within the preview canvas\n\t// but this means they block out anything earlier\n\t// NOTE: sort Select after Free-Form Select,\n\t// Brush after Eraser, as they are from the toolbar ordering\n\ttools_to_preview.sort((a, b) => {\n\t\tif (a.selectBox && !b.selectBox) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (!a.selectBox && b.selectBox) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n\t// two select box previews would just invert and cancel each other out\n\t// so only render one if there's one or more\n\tvar select_box_index = tools_to_preview.findIndex((tool) => tool.selectBox);\n\tif (select_box_index >= 0) {\n\t\ttools_to_preview = tools_to_preview.filter((tool, index) => !tool.selectBox || index == select_box_index);\n\t}\n\n\ttools_to_preview.forEach((tool) => {\n\t\tif (tool.drawPreviewUnderGrid && pointer && pointers.length < 2) {\n\t\t\thctx.save();\n\t\t\ttool.drawPreviewUnderGrid(hctx, pointer.x, pointer.y, grid_visible, scale, -viewport_x, -viewport_y);\n\t\t\thctx.restore();\n\t\t}\n\t});\n\n\tif (selection) {\n\t\thctx.save();\n\n\t\thctx.scale(scale, scale);\n\t\thctx.translate(-viewport_x, -viewport_y);\n\n\t\thctx.drawImage(selection.canvas, selection.x, selection.y);\n\n\t\thctx.restore();\n\n\t\tif (!is_helper_layer && !selection.dragging) {\n\t\t\t// Draw the selection outline (for the thumbnail)\n\t\t\t// (The main canvas view has the OnCanvasSelection object which has its own outline)\n\t\t\tdraw_selection_box(hctx, selection.x, selection.y, selection.width, selection.height, scale, -viewport_x, -viewport_y);\n\t\t}\n\t}\n\n\tif (textbox) {\n\t\thctx.save();\n\n\t\thctx.scale(scale, scale);\n\t\thctx.translate(-viewport_x, -viewport_y);\n\n\t\thctx.drawImage(textbox.canvas, textbox.x, textbox.y);\n\n\t\thctx.restore();\n\n\t\tif (!is_helper_layer && !textbox.dragging) {\n\t\t\t// Draw the textbox outline (for the thumbnail)\n\t\t\t// (The main canvas view has the OnCanvasTextBox object which has its own outline)\n\t\t\tdraw_selection_box(hctx, textbox.x, textbox.y, textbox.width, textbox.height, scale, -viewport_x, -viewport_y);\n\t\t}\n\t}\n\n\tif (grid_visible) {\n\t\tdraw_grid(hctx, scale);\n\t}\n\n\ttools_to_preview.forEach((tool) => {\n\t\tif (tool.drawPreviewAboveGrid && pointer && pointers.length < 2) {\n\t\t\thctx.save();\n\t\t\ttool.drawPreviewAboveGrid(hctx, pointer.x, pointer.y, grid_visible, scale, -viewport_x, -viewport_y);\n\t\t\thctx.restore();\n\t\t}\n\t});\n}\nfunction update_disable_aa() {\n\tconst dots_per_canvas_px = window.devicePixelRatio * magnification;\n\tconst round = Math.floor(dots_per_canvas_px) === dots_per_canvas_px;\n\t$canvas_area.toggleClass(\"disable-aa-for-things-at-main-canvas-scale\", dots_per_canvas_px >= 3 || round);\n}\n\n/**\n * @param {number} new_scale\n * @param {{x: number, y: number}} [anchor_point] - uses canvas coordinates; default is the top-left of the $canvas_area viewport\n */\nfunction set_magnification(new_scale, anchor_point) {\n\t// How this works is, you imagine \"what if it was zoomed, where would the anchor point be?\"\n\t// Then to make it end up where it started, you simply shift the viewport by the difference.\n\t// And actually you don't have to \"imagine\" zooming, you can just do the zoom.\n\n\tanchor_point = anchor_point ?? {\n\t\tx: $canvas_area.scrollLeft() / magnification,\n\t\ty: $canvas_area.scrollTop() / magnification,\n\t};\n\tconst anchor_on_page = from_canvas_coords(anchor_point);\n\n\tmagnification = new_scale;\n\tif (new_scale !== 1) {\n\t\treturn_to_magnification = new_scale;\n\t}\n\tupdate_magnified_canvas_size(); // also updates canvas_bounding_client_rect used by from_canvas_coords()\n\n\tconst anchor_after_zoom = from_canvas_coords(anchor_point);\n\t// Note: scrollBy() not scrollTo()\n\t$canvas_area[0].scrollBy({\n\t\tleft: anchor_after_zoom.clientX - anchor_on_page.clientX,\n\t\ttop: anchor_after_zoom.clientY - anchor_on_page.clientY,\n\t\tbehavior: \"instant\",\n\t});\n\n\t$G.triggerHandler(\"resize\"); // updates handles & grid\n\t$G.trigger(\"option-changed\"); // updates options area\n\t$G.trigger(\"magnification-changed\"); // updates custom zoom window\n}\n\n/** @type {OSGUI$Window} */\nlet $custom_zoom_window;\n\nlet dev_custom_zoom = false;\ntry {\n\tdev_custom_zoom = localStorage.dev_custom_zoom === \"true\";\n} catch (_error) { /* ignore */ }\nif (dev_custom_zoom) {\n\t$(() => {\n\t\tshow_custom_zoom_window();\n\t\t$custom_zoom_window.css({\n\t\t\tleft: 80,\n\t\t\ttop: 50,\n\t\t\topacity: 0.5,\n\t\t});\n\t});\n}\n\nfunction show_custom_zoom_window() {\n\tif ($custom_zoom_window) {\n\t\t$custom_zoom_window.close();\n\t}\n\tconst $w = $DialogWindow(localize(\"Custom Zoom\"));\n\t$custom_zoom_window = $w;\n\t$w.addClass(\"custom-zoom-window\");\n\n\t$w.$main.append(`<div class='current-zoom'>${localize(\"Current zoom:\")} <bdi>${magnification * 100}%</bdi></div>`);\n\t// update when zoom changes\n\t$G.on(\"magnification-changed\", () => {\n\t\t$w.$main.find(\".current-zoom bdi\").text(`${magnification * 100}%`);\n\t});\n\n\tconst $fieldset = $(E(\"fieldset\")).appendTo($w.$main);\n\t$fieldset.append(`\n\t\t<legend>${localize(\"Zoom to\")}</legend>\n\t\t<div class=\"fieldset-body\">\n\t\t\t<div class=\"radio-field\"><input type=\"radio\" name=\"custom-zoom-radio\" id=\"zoom-option-1\" aria-keyshortcuts=\"Alt+1 1\" value=\"1\"/><label for=\"zoom-option-1\">${render_access_key(\"&100%\")}</label></div>\n\t\t\t<div class=\"radio-field\"><input type=\"radio\" name=\"custom-zoom-radio\" id=\"zoom-option-2\" aria-keyshortcuts=\"Alt+2 2\" value=\"2\"/><label for=\"zoom-option-2\">${render_access_key(\"&200%\")}</label></div>\n\t\t\t<div class=\"radio-field\"><input type=\"radio\" name=\"custom-zoom-radio\" id=\"zoom-option-4\" aria-keyshortcuts=\"Alt+4 4\" value=\"4\"/><label for=\"zoom-option-4\">${render_access_key(\"&400%\")}</label></div>\n\t\t\t<div class=\"radio-field\"><input type=\"radio\" name=\"custom-zoom-radio\" id=\"zoom-option-6\" aria-keyshortcuts=\"Alt+6 6\" value=\"6\"/><label for=\"zoom-option-6\">${render_access_key(\"&600%\")}</label></div>\n\t\t\t<div class=\"radio-field\"><input type=\"radio\" name=\"custom-zoom-radio\" id=\"zoom-option-8\" aria-keyshortcuts=\"Alt+8 8\" value=\"8\"/><label for=\"zoom-option-8\">${render_access_key(\"&800%\")}</label></div>\n\t\t\t<div class=\"radio-field\"><input type=\"radio\" name=\"custom-zoom-radio\" id=\"zoom-option-really-custom\" value=\"really-custom\"/><label for=\"zoom-option-really-custom\"><input type=\"number\" min=\"10\" max=\"1000\" name=\"really-custom-zoom-input\" class=\"inset-deep no-spinner\" value=\"\"/>%</label></div>\n\t\t</div>\n\t`);\n\tlet is_custom = true;\n\t$fieldset.find(\"input[type=radio]\").get().forEach((/** @type {HTMLInputElement} */ el) => {\n\t\tif (parseFloat(el.value) === magnification) {\n\t\t\tel.checked = true;\n\t\t\tel.focus();\n\t\t\tis_custom = false;\n\t\t}\n\t});\n\tconst $really_custom_radio_option = $fieldset.find(\"input[value='really-custom']\");\n\tconst $really_custom_input = /** @type {JQuery<HTMLInputElement>}*/($fieldset.find(\"input[name='really-custom-zoom-input']\"));\n\n\t$really_custom_input.closest(\"label\").on(\"click\", (event) => {\n\t\t$really_custom_radio_option.prop(\"checked\", true);\n\t\t// If the user clicks on the input, let it get focus naturally, placing the caret where you click.\n\t\t// If the user clicks outside it on the label, focus the input and select the text.\n\t\tif ($(event.target).closest(\"input\").length === 0) {\n\t\t\t// Why does focusing this input programmatically not lead to the input\n\t\t\t// being focused ultimately after the click?\n\t\t\t// I'm working around this by using requestAnimationFrame (setTimeout would lead to a flicker).\n\t\t\t// What am I working around, though? Is it my os-gui.js library? It has code to focus the\n\t\t\t// last focused control in a window. I didn't see that code in the debugger, but I could've missed it.\n\t\t\t// Debugging without time travel is hard. Maybe I should attack this problem with time travel, using replay.io.\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\t$really_custom_input[0].focus();\n\t\t\t\t$really_custom_input[0].select();\n\t\t\t});\n\t\t\t// Maybe this would all be a little simpler if I made the label point to the input.\n\t\t\t// I want the label to have a larger click target, but maybe I can do that with CSS.\n\t\t}\n\t});\n\n\tif (is_custom) {\n\t\t$really_custom_input.val(magnification * 100);\n\t\t$really_custom_radio_option.prop(\"checked\", true);\n\t\t$really_custom_input.select();\n\t}\n\n\t$really_custom_radio_option.on(\"keydown\", (event) => {\n\t\tif (event.key.match(/^[0-9.]$/)) {\n\t\t\t// Can't set number input to invalid number \".\" or even \"0.\",\n\t\t\t// but if we don't prevent the default keydown behavior of typing the letter,\n\t\t\t// we can actually change the focus before the letter is typed!\n\t\t\t// $really_custom_input.val(event.key === \".\" ? \"0.\" : event.key);\n\t\t\t// $really_custom_input.focus(); // should move caret to end\n\t\t\t// event.preventDefault();\n\t\t\t$really_custom_input.val(\"\").focus();\n\t\t}\n\t});\n\n\t// If you tab to the number input and type, it should select the radio button\n\t// so that your input is actually used.\n\t$really_custom_input.on(\"input\", () => {\n\t\t$really_custom_radio_option.prop(\"checked\", true);\n\t});\n\n\t$fieldset.find(\"label\").css({ display: \"block\" });\n\n\t$w.$Button(localize(\"OK\"), () => {\n\t\tlet option_val = String($fieldset.find(\"input[name='custom-zoom-radio']:checked\").val());\n\t\tlet mag;\n\t\tif (option_val === \"really-custom\") {\n\t\t\toption_val = $really_custom_input.val();\n\t\t\tif (`${option_val}`.match(/\\dx$/)) { // ...you can't actually type an x; oh well...\n\t\t\t\tmag = parseFloat(option_val);\n\t\t\t} else if (`${option_val}`.match(/\\d%?$/)) {\n\t\t\t\tmag = parseFloat(option_val) / 100;\n\t\t\t}\n\t\t\tif (isNaN(mag)) {\n\t\t\t\tplease_enter_a_number();\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\t\t\tmag = parseFloat(option_val);\n\t\t}\n\n\t\tset_magnification(mag);\n\n\t\t$w.close();\n\t}, { type: \"submit\" });\n\t$w.$Button(localize(\"Cancel\"), () => {\n\t\t$w.close();\n\t});\n\n\t$w.center();\n\n\thandle_keyshortcuts($w);\n}\n\n\nfunction toggle_grid() {\n\tshow_grid = !show_grid;\n\t// $G.trigger(\"option-changed\");\n\tupdate_helper_layer();\n}\n\nfunction toggle_thumbnail() {\n\tshow_thumbnail = !show_thumbnail;\n\tif (!show_thumbnail) {\n\t\t$thumbnail_window.hide();\n\t} else {\n\t\tif (!thumbnail_canvas) {\n\t\t\tthumbnail_canvas = make_canvas(108, 92);\n\t\t\tthumbnail_canvas.style.width = \"100%\";\n\t\t\tthumbnail_canvas.style.height = \"100%\";\n\t\t}\n\t\tif (!$thumbnail_window) {\n\t\t\t$thumbnail_window = $Window({\n\t\t\t\ttitle: localize(\"Thumbnail\"),\n\t\t\t\ttoolWindow: true,\n\t\t\t\tresizable: true,\n\t\t\t\tinnerWidth: thumbnail_canvas.width + 4, // @TODO: should the border of $content be included in the definition of innerWidth/Height?\n\t\t\t\tinnerHeight: thumbnail_canvas.height + 4,\n\t\t\t\tminInnerWidth: 52 + 4,\n\t\t\t\tminInnerHeight: 36 + 4,\n\t\t\t\tminOuterWidth: 0, // @FIXME: this shouldn't be needed\n\t\t\t\tminOuterHeight: 0, // @FIXME: this shouldn't be needed\n\t\t\t});\n\t\t\t$thumbnail_window.addClass(\"thumbnail-window\");\n\t\t\t$thumbnail_window.$content.append(thumbnail_canvas);\n\t\t\t$thumbnail_window.$content.addClass(\"inset-deep\");\n\t\t\t$thumbnail_window.$content.css({ marginTop: \"1px\" }); // @TODO: should this (or equivalent on titlebar) be for all windows?\n\t\t\t$thumbnail_window.maximize = () => { }; // @TODO: disable maximize with an option\n\t\t\t// NOTE: I'm not sure some of these fallbacks are relevant anymore,\n\t\t\t// or if they even work since changing `box` from an array to a string.\n\t\t\t// Presumably the spec changed, but I don't feel like trying to dig up the history.\n\t\t\tnew ResizeObserver((entries) => {\n\t\t\t\tconst entry = entries[0];\n\t\t\t\tlet width, height;\n\t\t\t\tif (\"devicePixelContentBoxSize\" in entry) {\n\t\t\t\t\t// console.log(\"devicePixelContentBoxSize\", entry.devicePixelContentBoxSize);\n\t\t\t\t\t// Firefox seems to support this, although I can't find any documentation that says it should\n\t\t\t\t\t// I can't find an implementation bug or anything.\n\t\t\t\t\t// So I had to disable this case to test the fallback case (in Firefox 94.0)\n\t\t\t\t\twidth = entry.devicePixelContentBoxSize[0].inlineSize;\n\t\t\t\t\theight = entry.devicePixelContentBoxSize[0].blockSize;\n\t\t\t\t} else if (\"contentBoxSize\" in entry) {\n\t\t\t\t\t// console.log(\"contentBoxSize\", entry.contentBoxSize);\n\t\t\t\t\t// round() seems to line up with what Firefox does for device pixel alignment, which is great.\n\t\t\t\t\t// In Chrome it's blurry at some zoom levels with round(), ceil(), or floor(), but it (documentedly) supports devicePixelContentBoxSize.\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\twidth = Math.round(entry.contentBoxSize[0].inlineSize * devicePixelRatio);\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\theight = Math.round(entry.contentBoxSize[0].blockSize * devicePixelRatio);\n\t\t\t\t} else {\n\t\t\t\t\t// Safari on iPad doesn't support either of the above as of iOS 15.0.2\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\twidth = Math.round(entry.contentRect.width * devicePixelRatio);\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\theight = Math.round(entry.contentRect.height * devicePixelRatio);\n\t\t\t\t}\n\t\t\t\tif (width && height) { // If it's hidden, and then shown, it gets a width and height of 0 briefly on iOS. (This would give IndexSizeError in drawImage.)\n\t\t\t\t\tthumbnail_canvas.width = width;\n\t\t\t\t\tthumbnail_canvas.height = height;\n\t\t\t\t}\n\t\t\t\tupdate_helper_layer_immediately(); // updates thumbnail (but also unnecessarily the helper layer)\n\t\t\t}).observe(thumbnail_canvas, { box: \"device-pixel-content-box\" });\n\t\t}\n\t\t$thumbnail_window.show();\n\t\t$thumbnail_window.on(\"close\", (e) => {\n\t\t\te.preventDefault();\n\t\t\t$thumbnail_window.hide();\n\t\t\tshow_thumbnail = false;\n\t\t});\n\t}\n\t// Currently the thumbnail updates with the helper layer. But it's not part of the helper layer, so this is a bit of a misnomer for now.\n\tupdate_helper_layer();\n}\n\nfunction reset_selected_colors() {\n\tselected_colors = {\n\t\tforeground: \"#000000\",\n\t\tbackground: \"#ffffff\",\n\t\tternary: \"\",\n\t};\n\t$G.trigger(\"option-changed\");\n}\n\nfunction reset_file() {\n\tsystem_file_handle = null;\n\tfile_name = localize(\"untitled\");\n\tfile_format = \"image/png\";\n\tsaved = true;\n\tupdate_title();\n}\n\nfunction reset_canvas_and_history() {\n\tundos.length = 0;\n\tredos.length = 0;\n\tcurrent_history_node = root_history_node = make_history_node({\n\t\tname: localize(\"New\"),\n\t\ticon: get_help_folder_icon(\"p_blank.png\"),\n\t});\n\thistory_node_to_cancel_to = null;\n\n\tmain_canvas.width = Math.max(1, my_canvas_width);\n\tmain_canvas.height = Math.max(1, my_canvas_height);\n\tmain_ctx.disable_image_smoothing();\n\tmain_ctx.fillStyle = selected_colors.background;\n\tmain_ctx.fillRect(0, 0, main_canvas.width, main_canvas.height);\n\n\tcurrent_history_node.image_data = main_ctx.getImageData(0, 0, main_canvas.width, main_canvas.height);\n\n\t$canvas_area.trigger(\"resize\");\n\t$G.triggerHandler(\"history-update\"); // update history view\n}\n\n// TODO: fix inconsistent use of ancestry metaphor (parent vs futures); could use the term \"basis\" for the parent, or \"children\" for the futures\n/**\n * @param {object} options\n * @param {HistoryNode | null=} options.parent - the state before this state (its basis), or null if this is the first state\n * @param {HistoryNode[]=} options.futures - the states branching off from this state (its children)\n * @param {number=} options.timestamp - when this state was created\n * @param {boolean=} options.soft - indicates that undo should skip this state; it can still be accessed with the History window\n * @param {ImageData | null=} options.image_data - the image data for the canvas (TODO: region updates)\n * @param {ImageData | null=} options.selection_image_data - the image data for the selection, if any\n * @param {number=} options.selection_x - the x position of the selection, if any\n * @param {number=} options.selection_y - the y position of the selection, if any\n * @param {string=} options.textbox_text - the text in the textbox, if any\n * @param {number=} options.textbox_x - the x position of the textbox, if any\n * @param {number=} options.textbox_y - the y position of the textbox, if any\n * @param {number=} options.textbox_width - the width of the textbox, if any\n * @param {number=} options.textbox_height - the height of the textbox, if any\n * @param {TextToolFontOptions | null=} options.text_tool_font - the font of the Text tool (important to restore a textbox-containing state, but persists without a textbox)\n * @param {boolean=} options.tool_transparent_mode - whether transparent mode is on for Select/Free-Form Select/Text tools; otherwise box is opaque\n * @param {string | CanvasPattern=} options.foreground_color - selected foreground color (left click)\n * @param {string | CanvasPattern=} options.background_color - selected background color (right click)\n * @param {string | CanvasPattern=} options.ternary_color - selected ternary color (ctrl+click)\n * @param {string=} options.name - the name of the operation, shown in the history window, e.g. localize(\"Resize Canvas\")\n * @param {HTMLImageElement |HTMLCanvasElement | null=} options.icon - a visual representation of the operation type, shown in the history window, e.g. get_help_folder_icon(\"p_blank.png\")\n * @returns {HistoryNode}\n */\nfunction make_history_node({\n\tparent = null, // the state before this state (its basis), or null if this is the first state\n\tfutures = [], // the states branching off from this state (its children)\n\ttimestamp = Date.now(), // when this state was created\n\tsoft = false, // indicates that undo should skip this state; it can still be accessed with the History window\n\timage_data = null, // the image data for the canvas (TODO: region updates)\n\tselection_image_data = null, // the image data for the selection, if any\n\tselection_x, // the x position of the selection, if any\n\tselection_y, // the y position of the selection, if any\n\ttextbox_text, // the text in the textbox, if any\n\ttextbox_x, // the x position of the textbox, if any\n\ttextbox_y, // the y position of the textbox, if any\n\ttextbox_width, // the width of the textbox, if any\n\ttextbox_height, // the height of the textbox, if any\n\ttext_tool_font = null, // the font of the Text tool (important to restore a textbox-containing state, but persists without a textbox)\n\ttool_transparent_mode = false, // whether transparent mode is on for Select/Free-Form Select/Text tools; otherwise box is opaque\n\tforeground_color, // selected foreground color (left click)\n\tbackground_color, // selected background color (right click)\n\tternary_color, // selected ternary color (ctrl+click)\n\tname, // the name of the operation, shown in the history window, e.g. localize(\"Resize Canvas\")\n\ticon = null, // an Image representation of the operation type, shown in the history window, e.g. get_help_folder_icon(\"p_blank.png\")\n}) {\n\treturn {\n\t\tparent,\n\t\tfutures,\n\t\ttimestamp,\n\t\tsoft,\n\t\timage_data,\n\t\tselection_image_data,\n\t\tselection_x,\n\t\tselection_y,\n\t\ttextbox_text,\n\t\ttextbox_x,\n\t\ttextbox_y,\n\t\ttextbox_width,\n\t\ttextbox_height,\n\t\ttext_tool_font,\n\t\ttool_transparent_mode,\n\t\tforeground_color,\n\t\tbackground_color,\n\t\tternary_color,\n\t\tname,\n\t\ticon,\n\t};\n}\n\nfunction update_title() {\n\tdocument.title = `${file_name} - ${is_pride_month ? \"June Solidarity \" : \"\"}${localize(\"Paint\")}`;\n\n\tif (is_pride_month) {\n\t\t$(\"link[rel~='icon']\").attr(\"href\", \"./images/icons/gay-es-paint-16x16-light-outline.png\");\n\t}\n\n\tif (window.setRepresentedFilename) {\n\t\twindow.setRepresentedFilename(system_file_handle ?? \"\");\n\t}\n\tif (window.setDocumentEdited) {\n\t\twindow.setDocumentEdited(!saved);\n\t}\n}\n\n/**\n * Parse text/uri-list format\n * @param {string} text\n * @returns {string[]} URLs\n */\nfunction get_uris(text) {\n\t// get lines, discarding comments\n\tconst lines = text.split(/[\\n\\r]+/).filter((line) => line[0] !== \"#\" && line);\n\t// discard text with too many lines (likely pasted HTML or something) - may want to revisit this\n\tif (lines.length > 15) {\n\t\treturn [];\n\t}\n\t// parse URLs, discarding anything that parses as a relative URL\n\tconst uris = [];\n\tfor (let i = 0; i < lines.length; i++) {\n\t\t// Relative URLs will throw when no base URL is passed to the URL constructor.\n\t\ttry {\n\t\t\tconst url = new URL(lines[i]);\n\t\t\turis.push(url.href);\n\t\t} catch (_error) { /* ignore */ }\n\t}\n\treturn uris;\n}\n/**\n * Load an image file from a URL by any means necessary.\n * For basic image loading, see `load_image_simple` instead.\n * @param {string} uri\n * @returns {Promise<ImageInfo>}\n * @throws {Error & { code?: string }}\n */\nasync function load_image_from_uri(uri) {\n\n\t// Cases to consider:\n\t// - data URI\n\t// - blob URI\n\t//   - blob URI from another domain\n\t// - file URI\n\t// - http URI\n\t// - https URI\n\t// - unsupported protocol, e.g. \"ftp://example.com/image.png\"\n\t// - invalid URI\n\t//   - no protocol specified, e.g. \"example.com/image.png\"\n\t//     --> We can fix these up!\n\t//   - The user may be just trying to paste text, not an image.\n\t// - non-CORS-enabled URI\n\t//   --> Use a CORS proxy! :)\n\t//   - In electron, using a CORS proxy 1. is silly, 2. maybe isn't working.\n\t//     --> Either proxy requests to the main process,\n\t//         or configure headers in the main process to make requests work.\n\t//         Probably the latter. @TODO\n\t//         https://stackoverflow.com/questions/51254618/how-do-you-handle-cors-in-an-electron-app\n\t// - invalid image / unsupported image format\n\t// - image is no longer available on the live web\n\t//   --> try loading from WayBack Machine :)\n\t//   - often swathes of URLs are redirected to a new site, and do not give a 404.\n\t//     --> make sure the flow of fallbacks accounts for this, and doesn't just see it as an unsupported file format.\n\t// - localhost URI, e.g. \"http://127.0.0.1/\" or \"http://localhost/\"\n\t//   --> Don't try to proxy these, as it will just fail.\n\t//   - Some domain extensions are reserved, e.g. .localdomain (how official is this?)\n\t//   - There can also be arbitrary hostnames mapped to local servers, which we can't test for\n\t// - already a proxy URI, e.g. \"https://cors.bridged.cc/https://example.com/image.png\"\n\t// - file already downloaded\n\t//   --> maybe should cache downloads? maybe HTTP caching is good enough? maybe uncommon enough that it doesn't matter.\n\t// - Pasting (Edit > Paste or Ctrl+V) vs Opening (drag & drop, File > Open, Ctrl+O, or File > Load From URL)\n\t//   --> make wording generic or specific to the context\n\n\tconst is_blob_uri = uri.match(/^blob:/i);\n\tconst is_download = !uri.match(/^(blob|data|file):/i);\n\tconst is_localhost = uri.match(/^(http|https):\\/\\/((127\\.0\\.0\\.1|localhost)|.*(\\.(local|localdomain|domain|lan|home|host|corp|invalid)))\\b/i);\n\n\tif (is_blob_uri && uri.indexOf(`blob:${location.origin}`) === -1) {\n\t\tconst error = new Error(\"can't load blob: URI from another domain\");\n\t\t// @ts-ignore\n\t\terror.code = \"cross-origin-blob-uri\";\n\t\tthrow error;\n\t}\n\n\tconst uris_to_try = (is_download && !is_localhost) ? [\n\t\turi,\n\t\t// work around CORS headers not sent by whatever server\n\t\t`https://cors.bridged.cc/${uri}`,\n\t\t`https://jspaint-cors-proxy.herokuapp.com/${uri}`,\n\t\t// if the image isn't available on the live web, see if it's archived\n\t\t`https://web.archive.org/${uri}`,\n\t] : [uri];\n\tconst fails = [];\n\n\tfor (let index_to_try = 0; index_to_try < uris_to_try.length; index_to_try += 1) {\n\t\tconst uri_to_try = uris_to_try[index_to_try];\n\t\ttry {\n\t\t\tif (is_download) {\n\t\t\t\t$status_text.text(\"Downloading picture...\");\n\t\t\t}\n\n\t\t\tconst show_progress = ({ loaded, total }) => {\n\t\t\t\tif (is_download) {\n\t\t\t\t\t$status_text.text(`Downloading picture... (${Math.round(loaded / total * 100)}%)`);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (is_download) {\n\t\t\t\tconsole.log(`Try loading image from URI (${index_to_try + 1}/${uris_to_try.length}): \"${uri_to_try}\"`);\n\t\t\t}\n\n\t\t\tconst original_response = await fetch(uri_to_try);\n\t\t\tlet response_to_read = original_response;\n\t\t\tif (!original_response.ok) {\n\t\t\t\tfails.push({ status: original_response.status, statusText: original_response.statusText, url: uri_to_try });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!original_response.body) {\n\t\t\t\tif (is_download) {\n\t\t\t\t\tconsole.log(\"ReadableStream not yet supported in this browser. Progress won't be shown for image requests.\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// to access headers, server must send CORS header \"Access-Control-Expose-Headers: content-encoding, content-length x-file-size\"\n\t\t\t\t// server must send custom x-file-size header if gzip or other content-encoding is used\n\t\t\t\tconst contentEncoding = original_response.headers.get(\"content-encoding\");\n\t\t\t\tconst contentLength = original_response.headers.get(contentEncoding ? \"x-file-size\" : \"content-length\");\n\t\t\t\tif (contentLength === null) {\n\t\t\t\t\tif (is_download) {\n\t\t\t\t\t\tconsole.log(\"Response size header unavailable. Progress won't be shown for this image request.\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst total = parseInt(contentLength, 10);\n\t\t\t\t\tlet loaded = 0;\n\t\t\t\t\tresponse_to_read = new Response(\n\t\t\t\t\t\tnew ReadableStream({\n\t\t\t\t\t\t\tstart(controller) {\n\t\t\t\t\t\t\t\tconst reader = original_response.body.getReader();\n\n\t\t\t\t\t\t\t\tread();\n\t\t\t\t\t\t\t\tfunction read() {\n\t\t\t\t\t\t\t\t\treader.read().then(({ done, value }) => {\n\t\t\t\t\t\t\t\t\t\tif (done) {\n\t\t\t\t\t\t\t\t\t\t\tcontroller.close();\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\tloaded += value.byteLength;\n\t\t\t\t\t\t\t\t\t\tshow_progress({ loaded, total });\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue(value);\n\t\t\t\t\t\t\t\t\t\tread();\n\t\t\t\t\t\t\t\t\t}).catch((error) => {\n\t\t\t\t\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t\t\t\t\t\tcontroller.error(error);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst blob = await response_to_read.blob();\n\t\t\tif (is_download) {\n\t\t\t\tconsole.log(\"Download complete.\");\n\t\t\t\t$status_text.text(\"Download complete.\");\n\t\t\t}\n\t\t\t// @TODO: use headers to detect HTML, since a doctype is not guaranteed\n\t\t\t// @TODO: fall back to WayBack Machine still for decode errors,\n\t\t\t// since a website might start redirecting swathes of URLs regardless of what they originally pointed to,\n\t\t\t// at which point they would likely point to a web page instead of an image.\n\t\t\t// (But still show an error about it not being an image, if WayBack also fails.)\n\t\t\tconst info = await new Promise((resolve, reject) => {\n\t\t\t\tread_image_file(blob, (error, info) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolve(info);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t\treturn info;\n\t\t} catch (error) {\n\t\t\tfails.push({ url: uri_to_try, error });\n\t\t}\n\t}\n\tif (is_download) {\n\t\t$status_text.text(\"Failed to download picture.\");\n\t}\n\tconst error = new Error(`failed to fetch image from any of ${uris_to_try.length} URI(s):\\n  ${fails.map((fail) =>\n\t\t(fail.statusText ? `${fail.status} ${fail.statusText} ` : \"\") + fail.url + (fail.error ? `\\n    ${fail.error}` : \"\")\n\t).join(\"\\n  \")}`);\n\t// @ts-ignore\n\terror.code = \"access-failure\";\n\t// @ts-ignore\n\terror.fails = fails;\n\tthrow error;\n}\n\n/**\n * @param {ImageInfo} info\n * @param {() => void} [callback]\n * @param {() => void} [canceled]\n * @param {boolean} [into_existing_session]\n * @param {boolean} [from_session_load]\n */\nfunction open_from_image_info(info, callback, canceled, into_existing_session, from_session_load) {\n\tare_you_sure(({ canvas_modified_while_loading } = {}) => {\n\t\tdeselect();\n\t\tcancel();\n\n\t\tif (!into_existing_session) {\n\t\t\t$G.triggerHandler(\"session-update\"); // autosave old session\n\t\t\tnew_local_session();\n\t\t}\n\n\t\treset_file();\n\t\treset_selected_colors();\n\t\treset_canvas_and_history(); // (with newly reset colors)\n\t\tset_magnification(default_magnification);\n\n\t\tmain_ctx.copy(info.image || info.image_data);\n\t\tapply_file_format_and_palette_info(info);\n\t\ttransparency = has_any_transparency(main_ctx);\n\t\t$canvas_area.trigger(\"resize\");\n\n\t\tcurrent_history_node.name = localize(\"Open\");\n\t\tcurrent_history_node.image_data = main_ctx.getImageData(0, 0, main_canvas.width, main_canvas.height);\n\t\tcurrent_history_node.icon = get_help_folder_icon(\"p_open.png\");\n\n\t\tif (canvas_modified_while_loading || !from_session_load) {\n\t\t\t// normally we don't want to autosave if we're loading a session,\n\t\t\t// as this is redundant, but if the user has modified the canvas while loading a session,\n\t\t\t// right now how it works is the session would be overwritten, so if you reloaded, it'd be lost,\n\t\t\t// so we'd better save it.\n\t\t\t// (and we want to save if this is a new session being initialized with an image)\n\t\t\t$G.triggerHandler(\"session-update\"); // autosave\n\t\t}\n\t\t$G.triggerHandler(\"history-update\"); // update history view\n\n\t\tif (info.source_blob instanceof File) {\n\t\t\tfile_name = info.source_blob.name;\n\t\t\t// file.path is available in Electron (see https://www.electronjs.org/docs/api/file-object#file-object)\n\t\t\t// @ts-ignore\n\t\t\tsystem_file_handle = info.source_blob.path;\n\t\t}\n\t\tif (info.source_file_handle) {\n\t\t\tsystem_file_handle = info.source_file_handle;\n\t\t}\n\t\tsaved = true;\n\t\tupdate_title();\n\n\t\tcallback?.();\n\t}, canceled, from_session_load);\n}\n\n// Note: This function is part of the API.\n/**\n * @param {Blob} file\n * @param {UserFileHandle} source_file_handle\n */\nfunction open_from_file(file, source_file_handle) {\n\t// The browser isn't very smart about MIME types.\n\t// It seems to look at the file extension, but not the actual file contents.\n\t// This is particularly problematic for files with no extension, where file.type gives an empty string.\n\t// And the File Access API currently doesn't let us automatically append a file extension,\n\t// so the user is likely to end up with files with no extension.\n\t// It's better to look at the file content to determine file type.\n\t// We do this for image files in read_image_file, and palette files in AnyPalette.js.\n\n\tif (file instanceof File && file.name.match(/\\.theme(pack)?$/i)) {\n\t\tfile.text().then(load_theme_from_text, (error) => {\n\t\t\tshow_error_message(localize(\"Paint cannot open this file.\"), error);\n\t\t});\n\t\treturn;\n\t}\n\t// Try loading as an image file first, then as a palette file, but show a combined error message if both fail.\n\tread_image_file(file, (as_image_error, image_info) => {\n\t\tif (as_image_error) {\n\t\t\tAnyPalette.loadPalette(file, (as_palette_error, new_palette) => {\n\t\t\t\tif (as_palette_error) {\n\t\t\t\t\tshow_file_format_errors({ as_image_error, as_palette_error });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tpalette = new_palette.map((color) => color.toString());\n\t\t\t\t$colorbox.rebuild_palette();\n\t\t\t\twindow.console?.log(`Loaded palette: ${palette.map(() => \"%c█\").join(\"\")}`, ...palette.map((color) => `color: ${color};`));\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\timage_info.source_file_handle = source_file_handle;\n\t\topen_from_image_info(image_info);\n\t});\n}\n\n/**\n * @param {ImageInfo} info\n */\nfunction apply_file_format_and_palette_info(info) {\n\tfile_format = info.file_format;\n\n\tif (!enable_palette_loading_from_indexed_images) {\n\t\treturn;\n\t}\n\n\tif (info.palette) {\n\t\twindow.console?.log(`Loaded palette from image file: ${info.palette.map(() => \"%c█\").join(\"\")}`, ...info.palette.map((color) => `color: ${color};`));\n\t\tpalette = info.palette;\n\t\tselected_colors.foreground = palette[0];\n\t\tselected_colors.background = palette.length === 14 * 2 ? palette[14] : palette[1]; // first in second row for default sized palette, else second color (debatable behavior; should it find a dark and a light color?)\n\t\t$G.trigger(\"option-changed\");\n\t} else if (monochrome && !info.monochrome) {\n\t\tpalette = default_palette;\n\t\treset_selected_colors();\n\t}\n\t$colorbox.rebuild_palette();\n\n\tmonochrome = info.monochrome;\n}\n\n/**\n * @param {string} fileText\n */\nfunction load_theme_from_text(fileText) {\n\tvar cssProperties = parseThemeFileString(fileText);\n\tif (!cssProperties) {\n\t\tshow_error_message(localize(\"Paint cannot open this file.\"));\n\t\treturn;\n\t}\n\tapplyCSSProperties(cssProperties, { recurseIntoIframes: true });\n\n\twindow.themeCSSProperties = cssProperties;\n\n\t$G.triggerHandler(\"theme-load\");\n}\n\nfunction file_new() {\n\tare_you_sure(() => {\n\t\tdeselect();\n\t\tcancel();\n\n\t\t$G.triggerHandler(\"session-update\"); // autosave old session\n\t\tnew_local_session();\n\n\t\treset_file();\n\t\treset_selected_colors();\n\t\treset_canvas_and_history(); // (with newly reset colors)\n\t\tset_magnification(default_magnification);\n\n\t\t$G.triggerHandler(\"session-update\"); // autosave\n\t});\n}\n\nasync function file_open() {\n\tconst { file, fileHandle } = await systemHooks.showOpenFileDialog({ formats: image_formats });\n\topen_from_file(file, fileHandle);\n}\n\n/** @type {OSGUI$Window} */\nlet $file_load_from_url_window;\nfunction file_load_from_url() {\n\tif ($file_load_from_url_window) {\n\t\t$file_load_from_url_window.close();\n\t}\n\tconst $w = $DialogWindow().addClass(\"horizontal-buttons\");\n\t$file_load_from_url_window = $w;\n\t$w.title(\"Load from URL\");\n\t// @TODO: URL validation (input has to be in a form (and we don't want the form to submit))\n\t$w.$main.html(`\n\t\t<div style=\"padding: 10px;\">\n\t\t\t<label style=\"display: block; margin-bottom: 5px;\" for=\"url-input\">Paste or type the web address of an image:</label>\n\t\t\t<input type=\"url\" required value=\"\" id=\"url-input\" class=\"inset-deep\" style=\"width: 300px;\"/></label>\n\t\t</div>\n\t`);\n\tconst $input = $w.$main.find(\"#url-input\");\n\t// $w.$Button(\"Load\", () => {\n\t$w.$Button(localize(\"Open\"), () => {\n\t\tconst uris = get_uris(String($input.val()));\n\t\tif (uris.length > 0) {\n\t\t\t// @TODO: retry loading if same URL entered\n\t\t\t// actually, make it change the hash only after loading successfully\n\t\t\t// (but still load from the hash when necessary)\n\t\t\t// make sure it doesn't overwrite the old session before switching\n\t\t\t$w.close();\n\t\t\tchange_url_param(\"load\", uris[0]);\n\t\t} else {\n\t\t\tshow_error_message(\"Invalid URL. It must include a protocol (https:// or http://)\");\n\t\t}\n\t}, { type: \"submit\" });\n\t$w.$Button(localize(\"Cancel\"), () => {\n\t\t$w.close();\n\t});\n\t$w.center();\n\t$input[0].focus();\n}\n\n// Native FS API / File Access API allows you to overwrite files, but people are not used to it.\n// So we ask them to confirm it the first time.\nlet acknowledged_overwrite_capability = false;\nconst confirmed_overwrite_key = \"jspaint confirmed overwrite capable\";\ntry {\n\tacknowledged_overwrite_capability = localStorage[confirmed_overwrite_key] === \"true\";\n} catch (_error) {\n\t// no localStorage\n\t// In the year 2033, people will be more used to it, right?\n\t// This will be known as the \"Y2T bug\"\n\tacknowledged_overwrite_capability = Date.now() >= 2000000000000;\n}\nasync function confirm_overwrite_capability() {\n\tif (acknowledged_overwrite_capability) {\n\t\treturn true;\n\t}\n\tconst { $window, promise } = showMessageBox({\n\t\tmessageHTML: `\n\t\t\t<p>JS Paint can now save over existing files.</p>\n\t\t\t<p>Do you want to overwrite the file?</p>\n\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" id=\"do-not-ask-me-again-checkbox\"/>\n\t\t\t\t<label for=\"do-not-ask-me-again-checkbox\">Don't ask me again</label>\n\t\t\t</p>\n\t\t`,\n\t\tbuttons: [\n\t\t\t{ label: localize(\"Yes\"), value: \"overwrite\", default: true },\n\t\t\t{ label: localize(\"Cancel\"), value: \"cancel\" },\n\t\t],\n\t});\n\tconst result = await promise;\n\tif (result === \"overwrite\") {\n\t\tacknowledged_overwrite_capability = $window.$content.find(\"#do-not-ask-me-again-checkbox\").prop(\"checked\");\n\t\ttry {\n\t\t\tlocalStorage[confirmed_overwrite_key] = acknowledged_overwrite_capability;\n\t\t} catch (_error) {\n\t\t\t// no localStorage... @TODO: don't show the checkbox in this case\n\t\t}\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\nfunction file_save(maybe_saved_callback = () => { }, update_from_saved = true) {\n\tdeselect();\n\t// store and use file handle at this point in time, to avoid race conditions\n\tconst save_file_handle = system_file_handle;\n\tif (!save_file_handle || file_name.match(/\\.(svg|pdf)$/i)) {\n\t\treturn file_save_as(maybe_saved_callback, update_from_saved);\n\t}\n\twrite_image_file(main_canvas, file_format, async (blob) => {\n\t\t// An error may be shown by `systemHooks.writeBlobToHandle`,\n\t\t// or it may be unknown whether the save will succeed,\n\t\t// so for now: true means definite success, false means failure or cancelation, and undefined means it's unknown.\n\t\tconst success = await systemHooks.writeBlobToHandle(save_file_handle, blob);\n\t\t// When using a file download, where it's unknown whether the save will succeed,\n\t\t// we don't want to mark the file as saved, as it would prevent the user from retrying the save.\n\t\t// So only mark the file as saved if it's definite.\n\t\tif (success === true) {\n\t\t\tsaved = true;\n\t\t\tupdate_title();\n\t\t}\n\t\t// However, we can still apply format-specific color reduction to the canvas,\n\t\t// and call the \"maybe saved\" callback, which, as the name implies, is intended to handle the uncertainty.\n\t\tif (success !== false) {\n\t\t\tif (update_from_saved) {\n\t\t\t\tupdate_from_saved_file(blob);\n\t\t\t}\n\t\t\tmaybe_saved_callback();\n\t\t}\n\t});\n}\n\nfunction file_save_as(maybe_saved_callback = () => { }, update_from_saved = true) {\n\tdeselect();\n\tsystemHooks.showSaveFileDialog({\n\t\tdialogTitle: localize(\"Save As\"),\n\t\tformats: image_formats,\n\t\tdefaultFileName: file_name,\n\t\tdefaultPath: typeof system_file_handle === \"string\" ? system_file_handle : null,\n\t\tdefaultFileFormatID: file_format,\n\t\tgetBlob: (new_file_type) => {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\twrite_image_file(main_canvas, new_file_type, (blob) => {\n\t\t\t\t\tresolve(blob);\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tsavedCallbackUnreliable: ({ newFileName, newFileFormatID, newFileHandle, newBlob }) => {\n\t\t\tsaved = true;\n\t\t\tsystem_file_handle = newFileHandle;\n\t\t\tfile_name = newFileName;\n\t\t\tfile_format = newFileFormatID;\n\t\t\tupdate_title();\n\t\t\tmaybe_saved_callback();\n\t\t\tif (update_from_saved) {\n\t\t\t\tupdate_from_saved_file(newBlob);\n\t\t\t}\n\t\t},\n\t});\n}\n\nfunction file_print() {\n\tif (is_discord_embed) {\n\t\t// closest localized string: \"Could not start print job.\"\n\t\tshow_error_message(localize(\"Printing is not supported in the Discord Activity.\"));\n\t\treturn;\n\t}\n\tprint();\n}\n\n/**\n * Prompts the user to save changes to the document.\n * @param {(info?: { canvas_modified_while_loading?: boolean }) => void} action\n * @param {() => void} [canceled]\n * @param {boolean} [from_session_load]\n */\nfunction are_you_sure(action, canceled, from_session_load) {\n\tif (saved) {\n\t\taction();\n\t} else if (from_session_load) {\n\t\t// @FIXME: this dialog is confusingly worded in the best case.\n\t\t// It's intended for when the user edits the document while the initial document is loading,\n\t\t// which is hard to do, at least for local sessions on my fast new computer.\n\t\t// However it's also shown inappropriately if you edit the document and then either:\n\t\t// - type a #load: URL into the address bar such as\n\t\t//   http://127.0.0.1:1999/#load:https://i.imgur.com/M5zcPuk.jpeg\n\t\t// - click an Open link in the Manage Storage dialog in the Electron app\n\t\tshowMessageBox({\n\t\t\tmessage: localize(\"You've modified the document while an existing document was loading.\\nSave the new document?\", file_name),\n\t\t\tbuttons: [\n\t\t\t\t{\n\t\t\t\t\t// label: localize(\"Save\"),\n\t\t\t\t\tlabel: localize(\"Yes\"),\n\t\t\t\t\tvalue: \"save\",\n\t\t\t\t\tdefault: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// label: \"Discard\",\n\t\t\t\t\tlabel: localize(\"No\"),\n\t\t\t\t\tvalue: \"discard\",\n\t\t\t\t},\n\t\t\t],\n\t\t\t// @TODO: not closable with Escape or close button\n\t\t}).then((result) => {\n\t\t\tif (result === \"save\") {\n\t\t\t\tfile_save(() => {\n\t\t\t\t\taction();\n\t\t\t\t}, false);\n\t\t\t} else if (result === \"discard\") {\n\t\t\t\taction({ canvas_modified_while_loading: true });\n\t\t\t} else {\n\t\t\t\t// should not ideally happen\n\t\t\t\t// but prefer to preserve the previous document,\n\t\t\t\t// as the user has only (probably) as small window to make changes while loading,\n\t\t\t\t// whereas there could be any amount of work put into the document being loaded.\n\t\t\t\t// @TODO: could show dialog again, but making it un-cancelable would be better.\n\t\t\t\taction();\n\t\t\t}\n\t\t});\n\t} else {\n\t\tshowMessageBox({\n\t\t\tmessage: localize(\"Save changes to %1?\", file_name),\n\t\t\tbuttons: [\n\t\t\t\t{\n\t\t\t\t\t// label: localize(\"Save\"),\n\t\t\t\t\tlabel: localize(\"Yes\"),\n\t\t\t\t\tvalue: \"save\",\n\t\t\t\t\tdefault: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// label: \"Discard\",\n\t\t\t\t\tlabel: localize(\"No\"),\n\t\t\t\t\tvalue: \"discard\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: localize(\"Cancel\"),\n\t\t\t\t\tvalue: \"cancel\",\n\t\t\t\t},\n\t\t\t],\n\t\t}).then((result) => {\n\t\t\tif (result === \"save\") {\n\t\t\t\tfile_save(() => {\n\t\t\t\t\taction();\n\t\t\t\t}, false);\n\t\t\t} else if (result === \"discard\") {\n\t\t\t\taction();\n\t\t\t} else {\n\t\t\t\tcanceled?.();\n\t\t\t}\n\t\t});\n\t}\n}\n\nfunction please_enter_a_number() {\n\tshowMessageBox({\n\t\t// title: \"Invalid Value\",\n\t\tmessage: localize(\"Please enter a number.\"),\n\t});\n}\n\n// Note: This function is part of the API.\n/**\n * @param {string} message\n * @param {Error | string} [error]\n */\nfunction show_error_message(message, error) {\n\t// Test global error handling resiliency by enabling one or both of these:\n\t// Promise.reject(new Error(\"EMIT EMIT EMIT\"));\n\t// throw new Error(\"EMIT EMIT EMIT\");\n\t// It should fall back to an alert.\n\t// EMIT stands for \"Error Message Itself Test\".\n\n\tconst { $message } = showMessageBox({\n\t\ticonID: \"error\",\n\t\tmessage,\n\t\t// windowOptions: {\n\t\t// \tinnerWidth: 600,\n\t\t// },\n\t});\n\t// $message.css(\"max-width\", \"600px\");\n\tif (error) {\n\t\tconst $details = $(\"<details><summary><span>Details</span></summary></details>\")\n\t\t\t.appendTo($message);\n\n\t\t// Chrome includes the error message in the error.stack string, whereas Firefox doesn't.\n\t\t// Also note that there can be Exception objects that don't have a message (empty string) but a name,\n\t\t// for instance Exception { message: \"\", name: \"NS_ERROR_FAILURE\", ... } for out of memory when resizing the canvas too large in Firefox.\n\t\t// Chrome just lets you bring the system to a grating halt by trying to grab too much memory.\n\t\t// Firefox does too sometimes.\n\t\tconst e = /** @type {Error} */(error);\n\t\tlet error_string = e.stack;\n\t\tif (!error_string) {\n\t\t\terror_string = error.toString();\n\t\t\t// Discord API throws plain objects.\n\t\t\tif (error_string === \"[object Object]\") {\n\t\t\t\ttry {\n\t\t\t\t\terror_string = JSON.stringify(error, null, 2);\n\t\t\t\t} catch (e) {\n\t\t\t\t\terror_string = \"Error details could not be stringified: \" + e;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (e.message && error_string.indexOf(e.message) === -1) {\n\t\t\terror_string = `${error.toString()}\\n\\n${error_string}`;\n\t\t} else if (e.name && error_string.indexOf(e.name) === -1) {\n\t\t\terror_string = `${e.name}\\n\\n${error_string}`;\n\t\t}\n\t\t$(E(\"pre\"))\n\t\t\t.text(error_string)\n\t\t\t.appendTo($details)\n\t\t\t.css({\n\t\t\t\tbackground: \"white\",\n\t\t\t\tcolor: \"#333\",\n\t\t\t\t// background: \"#A00\",\n\t\t\t\t// color: \"white\",\n\t\t\t\tfontFamily: \"monospace\",\n\t\t\t\twidth: \"500px\",\n\t\t\t\tmaxWidth: \"100%\",\n\t\t\t\toverflow: \"auto\",\n\t\t\t});\n\t}\n\tif (error) {\n\t\twindow.console?.error?.(message, error);\n\t} else {\n\t\twindow.console?.error?.(message);\n\t}\n}\n\n// @TODO: close are_you_sure windows and these Error windows when switching sessions\n// because it can get pretty confusing\n/** @param {Error & {code: string, fails?: {status: number, statusText: string, url: string}[]}} error */\nfunction show_resource_load_error_message(error) {\n\tconst { $window, $message } = showMessageBox({});\n\tconst firefox = navigator.userAgent.toLowerCase().indexOf(\"firefox\") > -1;\n\t// @TODO: copy & paste vs download & open, more specific guidance\n\tif (error.code === \"cross-origin-blob-uri\") {\n\t\t$message.html(`\n\t\t\t<p>Can't load image from address starting with \"blob:\".</p>\n\t\t\t${firefox ?\n\t\t\t\t`<p>Try \"Copy Image\" instead of \"Copy Image Location\".</p>` :\n\t\t\t\t`<p>Try \"Copy image\" instead of \"Copy image address\".</p>`\n\t\t\t}\n\t\t`);\n\t} else if (error.code === \"html-not-image\") {\n\t\t$message.html(`\n\t\t\t<p>Address points to a web page, not an image file.</p>\n\t\t\t<p>Try copying and pasting an image instead of a URL.</p>\n\t\t`);\n\t} else if (error.code === \"decoding-failure\") {\n\t\t$message.html(`\n\t\t\t<p>Address doesn't point to an image file of a supported format.</p>\n\t\t\t<p>Try copying and pasting an image instead of a URL.</p>\n\t\t`);\n\t} else if (error.code === \"access-failure\") {\n\t\tif (navigator.onLine) {\n\t\t\t$message.html(`\n\t\t\t\t<p>Failed to download image.</p>\n\t\t\t\t<p>Try copying and pasting an image instead of a URL.</p>\n\t\t\t`);\n\t\t\tif (error.fails) {\n\t\t\t\t$(\"<ul>\").append(error.fails.map(({ status, statusText, url }) =>\n\t\t\t\t\t$(\"<li>\").text(url).prepend($(\"<b>\").text(`${status || \"\"} ${statusText || \"Failed\"} `))\n\t\t\t\t)).appendTo($message);\n\t\t\t}\n\t\t} else {\n\t\t\t$message.html(`\n\t\t\t\t<p>Failed to download image.</p>\n\t\t\t\t<p>You're offline. Connect to the internet and try again.</p>\n\t\t\t\t<p>Or copy and paste an image instead of a URL, if possible.</p>\n\t\t\t`);\n\t\t}\n\t} else {\n\t\t// TODO: what to do in Electron? also most users don't know how to check the console\n\t\t$message.html(`\n\t\t\t<p>Failed to load image from URL.</p>\n\t\t\t<p>Check your browser's devtools for details.</p>\n\t\t`);\n\t}\n\t$message.css({ maxWidth: \"500px\" });\n\t$window.center(); // after adding content\n}\n/**\n * @typedef {object} PaletteErrorGroup\n * @property {string} message\n * @property {PaletteErrorObject[]} errors\n *\n * @typedef {object} PaletteErrorObject\n * @property {Error} error\n * @property {{name: string}} __PATCHED_LIB_TO_ADD_THIS__format\n *\n * @param {object} options\n * @param {Error=} options.as_image_error\n * @param {Error|PaletteErrorGroup=} options.as_palette_error\n */\nfunction show_file_format_errors({ as_image_error, as_palette_error }) {\n\tlet html = `\n\t\t<p>${localize(\"Paint cannot open this file.\")}</p>\n\t`;\n\tif (as_image_error) {\n\t\t// TODO: handle weird errors, only show invalid format error if that's what happened\n\t\thtml += `\n\t\t\t<details>\n\t\t\t\t<summary>${localize(\"Bitmap Image\")}</summary>\n\t\t\t\t<p>${localize(\"This is not a valid bitmap file, or its format is not currently supported.\")}</p>\n\t\t\t</details>\n\t\t`;\n\t}\n\tvar entity_map = {\n\t\t\"&\": \"&amp;\",\n\t\t\"<\": \"&lt;\",\n\t\t\">\": \"&gt;\",\n\t\t'\"': \"&quot;\",\n\t\t\"'\": \"&#39;\",\n\t\t\"/\": \"&#x2F;\",\n\t\t\"`\": \"&#x60;\",\n\t\t\"=\": \"&#x3D;\",\n\t};\n\tconst escape_html = (string) => String(string).replace(/[&<>\"'`=/]/g, (s) => entity_map[s]);\n\tconst uppercase_first = (string) => string.charAt(0).toUpperCase() + string.slice(1);\n\n\tconst only_palette_error = as_palette_error && !as_image_error; // update me if there are more error types\n\tif (as_palette_error) {\n\t\tlet details = \"\";\n\t\tif (\"errors\" in as_palette_error) {\n\t\t\tdetails = `<ul dir=\"ltr\">${as_palette_error.errors.map((error) => {\n\t\t\t\tconst format = error.__PATCHED_LIB_TO_ADD_THIS__format;\n\t\t\t\tif (format && error.error) {\n\t\t\t\t\treturn `<li><b>${escape_html(`${format.name}`)}</b>: ${escape_html(uppercase_first(error.error.message))}</li>`;\n\t\t\t\t}\n\t\t\t\t// Fallback for unknown errors\n\t\t\t\t// @ts-ignore\n\t\t\t\treturn `<li>${escape_html(error.message || error)}</li>`;\n\t\t\t}).join(\"\\n\")}</ul>`;\n\t\t} else {\n\t\t\t// Fallback for unknown errors\n\t\t\tdetails = `<p>${escape_html(as_palette_error.message || as_palette_error)}</p>`;\n\t\t}\n\t\thtml += `\n\t\t\t<details>\n\t\t\t\t<summary>${only_palette_error ? \"Details\" : localize(\"Palette|*.pal|\").split(\"|\")[0]}</summary>\n\t\t\t\t<p>${localize(\"Unexpected file format.\")}</p>\n\t\t\t\t${details}\n\t\t\t</details>\n\t\t`;\n\t}\n\tshowMessageBox({\n\t\tmessageHTML: html,\n\t});\n}\n\n/** @type {OSGUI$Window} */\nlet $about_paint_window;\nconst $about_paint_content = $(\"#about-paint\");\n\n/** @type {OSGUI$Window} */\nlet $news_window;\nconst $this_version_news = $(\"#news\");\nlet $latest_news = $this_version_news;\n\n// not included directly in the HTML as a simple way of not showing it if it's loaded with fetch\n// (...not sure how to phrase this clearly and concisely...)\n// \"Showing the news as of this version of JS Paint. For the latest, see <a href='https://jspaint.app'>jspaint.app</a>\"\nif (location.origin !== \"https://jspaint.app\") {\n\t$this_version_news.prepend(\n\t\t$(\"<p>For the latest news, visit <a href='https://jspaint.app'>jspaint.app</a></p>\")\n\t\t\t.css({ padding: \"8px 15px\" })\n\t);\n}\n\nfunction show_about_paint() {\n\tif ($about_paint_window) {\n\t\t$about_paint_window.close();\n\t}\n\t$about_paint_window = $Window({\n\t\ttitle: localize(\"About Paint\"),\n\t\tresizable: false,\n\t\tmaximizeButton: false,\n\t\tminimizeButton: false,\n\t});\n\t$about_paint_window.addClass(\"about-paint squish\");\n\tif (is_pride_month) {\n\t\t$(\"#about-paint-icon\").attr(\"src\", \"./images/icons/gay-es-paint-128x128.png\");\n\t}\n\n\t$about_paint_window.$content.append($about_paint_content.show()).css({ padding: \"15px\" });\n\n\t$(\"#jspaint-update-status-area\").removeAttr(\"hidden\");\n\n\t$(\"#failed-to-check-if-outdated\").attr(\"hidden\", \"hidden\");\n\t$(\"#outdated\").attr(\"hidden\", \"hidden\");\n\n\t$about_paint_window.$Button(localize(\"OK\"), () => {\n\t\t$about_paint_window.close();\n\t})\n\t\t.attr(\"id\", \"close-about-paint\")\n\t\t.focus()\n\t\t.css({\n\t\t\tfloat: \"right\",\n\t\t\tmarginBottom: \"10px\",\n\t\t});\n\n\t$(\"#refresh-to-update\").on(\"click\", (event) => {\n\t\tevent.preventDefault();\n\t\tare_you_sure(() => {\n\t\t\texit_fullscreen_if_ios();\n\t\t\tlocation.reload();\n\t\t});\n\t});\n\n\t$(\"#view-project-news\").on(\"click\", () => {\n\t\tshow_news();\n\t});//.focus();\n\n\t// Hack to avoid mis-centering within small screens,\n\t// due to dynamic width of window when it abuts the right side of the screen\n\t// (due to line wrapping of text content at the right edge of the screen)\n\t// TODO: include this in OS-GUI library's centering logic\n\t$about_paint_window.css({ left: -innerWidth, top: -innerHeight });\n\t$about_paint_window.center();\n\n\tif (is_discord_embed) {\n\t\t// No checking for updates in the Discord Activity for now at least.\n\t\t// It's sandboxed, so it can't fetch the news without some extra server logic to proxy it,\n\t\t// and since there will be one official version of the Discord Activity,\n\t\t// the user isn't responsible for updating it.\n\n\t\t// Might be cute to say \"This product is licensed to <Discord User>\",\n\t\t// since we have the API for that.\n\t\treturn;\n\t}\n\n\t$(\"#checking-for-updates\").removeAttr(\"hidden\");\n\n\t// Forward compatibility note: I could change what's served at /?news and remove the news from the HTML,\n\t// but I've only added this query string on 2024-04-12, so I may not choose to take advantage of this.\n\t// I wish I had used a separate URL from the beginning, maybe a proper blog with an RSS feed.\n\t// It's somewhat unsustainable to add news continuously to the HTML of the app,\n\t// especially when images are requested even though the container is hidden. (https://github.com/1j01/jspaint/issues/320)\n\t// Also note: as long as I preserve the basic structure of the news entries at /, I should be able to\n\t// have old versions of the app still say they're outdated, and I could include some short message instead of full news articles.\n\t// Maybe I could even include the news in an iframe, just for old versions of the app, within the latest `.news-entry`...\n\t// as long as it doesn't have the same problem as images, of loading in the background.\n\tconst url =\n\t\t// \".\";\n\t\t// \"test-news-newer.html\";\n\t\t\"https://jspaint.app/?news\";\n\tfetch(url)\n\t\t.then((response) => response.text())\n\t\t.then((text) => {\n\t\t\tconst parser = new DOMParser();\n\t\t\tconst htmlDoc = parser.parseFromString(text, \"text/html\");\n\t\t\t$latest_news = $(htmlDoc).find(\"#news\");\n\n\t\t\tconst $latest_entries = $latest_news.find(\".news-entry\");\n\t\t\tconst $this_version_entries = $this_version_news.find(\".news-entry\");\n\n\t\t\tif (!$latest_entries.length) {\n\t\t\t\t$latest_news = $this_version_news;\n\t\t\t\tthrow new Error(`No news found at fetched site (${url})`);\n\t\t\t}\n\n\t\t\tfunction entries_contains_update($entries, id) {\n\t\t\t\treturn $entries.get().some((el_from_this_version) =>\n\t\t\t\t\tid === el_from_this_version.id\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// @TODO: visibly mark entries that overlap\n\t\t\tconst entries_newer_than_this_version =\n\t\t\t\t$latest_entries.get().filter((el_from_latest) =>\n\t\t\t\t\t!entries_contains_update($this_version_entries, el_from_latest.id)\n\t\t\t\t);\n\n\t\t\tconst entries_new_in_this_version = // i.e. in development, when updating the news\n\t\t\t\t$this_version_entries.get().filter((el_from_latest) =>\n\t\t\t\t\t!entries_contains_update($latest_entries, el_from_latest.id)\n\t\t\t\t);\n\n\t\t\tif (entries_newer_than_this_version.length > 0) {\n\t\t\t\t$(\"#outdated\").removeAttr(\"hidden\");\n\t\t\t} else if (entries_new_in_this_version.length > 0) {\n\t\t\t\t$latest_news = $this_version_news; // show this version's news for development\n\t\t\t}\n\n\t\t\t$(\"#checking-for-updates\").attr(\"hidden\", \"hidden\");\n\t\t\tupdate_css_classes_for_conditional_messages();\n\t\t}).catch((exception) => {\n\t\t\t$(\"#failed-to-check-if-outdated\").removeAttr(\"hidden\");\n\t\t\t$(\"#checking-for-updates\").attr(\"hidden\", \"hidden\");\n\t\t\tupdate_css_classes_for_conditional_messages();\n\t\t\twindow.console?.log(\"Couldn't check for updates.\", exception);\n\t\t});\n}\n\nfunction exit_fullscreen_if_ios() {\n\tif ($(\"body\").hasClass(\"ios\")) {\n\t\ttry {\n\t\t\tif (document.exitFullscreen) {\n\t\t\t\tdocument.exitFullscreen();\n\t\t\t} else if (document.webkitExitFullscreen) {\n\t\t\t\tdocument.webkitExitFullscreen();\n\t\t\t} else if (document.mozCancelFullScreen) {\n\t\t\t\tdocument.mozCancelFullScreen();\n\t\t\t} else if (document.msExitFullscreen) {\n\t\t\t\tdocument.msExitFullscreen();\n\t\t\t}\n\t\t} catch (_error) {\n\t\t\t// not important, just trying to prevent broken fullscreen after refresh\n\t\t\t// (:fullscreen and document.fullscreenElement stops working because it's not \"requested by the page\" anymore)\n\t\t\t// (the fullscreen styling is not generally obtrusive, but it is obtrusive when it DOESN'T work)\n\t\t\t//\n\t\t\t// alternatives:\n\t\t\t// - detect reload-while-fullscreen by storing a timestamp on unload when fullscreen,\n\t\t\t//   and apply the fullscreen class if timestamp is within a few seconds during load.\n\t\t\t//   - This doesn't have an answer for detecting leaving fullscreen,\n\t\t\t//     and if it keeps thinking it's fullscreen, it'll keep storing the timestamp, and get stuck.\n\t\t\t//     Unless it only stores the timestamp if it knows it's fullscreen? (i.e. page-requested fullscreen)\n\t\t\t//     Then it would only work for one reload.\n\t\t\t//     So ideally it would have the below anyway, in which case this would be unnecessary.\n\t\t\t// - detect fullscreen state without fullscreen API, using viewport size\n\t\t\t//   - If this is possible, why don't browsers just expose this information in the fullscreen API? :(\n\t\t\t//   - iPad resets the zoom level when going fullscreen, and then when reloading,\n\t\t\t//     the zoom level is reset to the user-set zoom level.\n\t\t\t//     Safari doesn't update devicePixelRatio based on the zoom level,\n\t\t\t//     and doesn't support ResizeObserver for device pixels.\n\t\t\t//     It does support https://developer.mozilla.org/en-US/docs/Web/API/Visual_Viewport_API\n\t\t\t//     though, so maybe something can be done with that.\n\t\t\t// - prompt to add to homescreen\n\t\t}\n\t}\n}\n\n// show_about_paint(); // for testing\n\nfunction update_css_classes_for_conditional_messages() {\n\n\t$(\".on-dev-host, .on-third-party-host, .on-official-host\").hide();\n\tif (location.hostname.match(/localhost|127.0.0.1/)) {\n\t\t$(\".on-dev-host\").show();\n\t} else if (location.hostname.match(/jspaint.app/)) {\n\t\t$(\".on-official-host\").show();\n\t} else {\n\t\t$(\".on-third-party-host\").show();\n\t}\n\n\t$(\".navigator-online, .navigator-offline\").hide();\n\tif (navigator.onLine) {\n\t\t$(\".navigator-online\").show();\n\t} else {\n\t\t$(\".navigator-offline\").show();\n\t}\n}\n\nfunction show_news() {\n\tif ($news_window) {\n\t\t$news_window.close();\n\t}\n\t$news_window = $Window({\n\t\ttitle: \"Project News\",\n\t\tmaximizeButton: false,\n\t\tminimizeButton: false,\n\t\tresizable: false,\n\t});\n\t$news_window.addClass(\"news-window squish\");\n\n\n\t// const $latest_entries = $latest_news.find(\".news-entry\");\n\t// const latest_entry = $latest_entries[$latest_entries.length - 1];\n\t// window.console?.log(\"LATEST MEWS:\", $latest_news);\n\t// window.console?.log(\"LATEST ENTRY:\", latest_entry);\n\n\tconst $latest_news_style = $latest_news.find(\"style\");\n\t$this_version_news.find(\"style\").remove();\n\t$latest_news.append($latest_news_style); // in case $this_version_news is $latest_news\n\n\t$news_window.$content.append($latest_news.removeAttr(\"hidden\"));\n\n\t$news_window.center();\n\t$news_window.center(); // @XXX - but it helps tho\n\n\t$latest_news.attr(\"tabIndex\", \"-1\").focus();\n\n\t// Prevent opening images dropped on news window\n\t// especially those dragged from the news window itself (accidentally or habitually/idly)\n\t// TODO: should this be for all windows?\n\t$news_window.on(\"dragover\", (event) => {\n\t\t// the default behavior is to not allow dropping,\n\t\t// so don't prevent the default, but do stop propagation\n\t\t// so that the global handler doesn't allow the drop\n\t\tevent.stopPropagation();\n\t});\n\t$news_window.on(\"dragenter\", (event) => {\n\t\t// same as dragover, but just prevents flickering of the cursor basically,\n\t\t// when dragover is already handled\n\t\tevent.stopPropagation();\n\t});\n\t$news_window.on(\"drop\", (event) => {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t});\n}\n\n\n// @TODO: DRY between these functions and open_from_* functions further?\n\n/**\n * @param {Blob} blob\n */\nfunction paste_image_from_file(blob) {\n\tread_image_file(blob, (error, info) => {\n\t\tif (error) {\n\t\t\tshow_file_format_errors({ as_image_error: error });\n\t\t\treturn;\n\t\t}\n\t\tpaste(info.image || make_canvas(info.image_data));\n\t});\n}\n\n// Edit > Paste From\nasync function choose_file_to_paste() {\n\tconst { file } = await systemHooks.showOpenFileDialog({ formats: image_formats });\n\tif (file.type.match(/^image|application\\/pdf/)) {\n\t\tpaste_image_from_file(file);\n\t\treturn;\n\t}\n\tshow_error_message(localize(\"This is not a valid bitmap file, or its format is not currently supported.\"));\n}\n\n/**\n * @param {HTMLImageElement | HTMLCanvasElement} img_or_canvas\n */\nfunction paste(img_or_canvas) {\n\n\tif (img_or_canvas.width > main_canvas.width || img_or_canvas.height > main_canvas.height) {\n\t\tconst message = localize(\"The image in the clipboard is larger than the bitmap.\") + \"\\n\" +\n\t\t\tlocalize(\"Would you like the bitmap enlarged?\");\n\t\tshowMessageBox({\n\t\t\tmessage,\n\t\t\ticonID: \"question\",\n\t\t\twindowOptions: {\n\t\t\t\ticons: {\n\t\t\t\t\t16: \"images/windows-16x16.png\",\n\t\t\t\t\t32: \"images/windows-32x32.png\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tbuttons: [\n\t\t\t\t{\n\t\t\t\t\t// label: \"Enlarge\",\n\t\t\t\t\tlabel: localize(\"Yes\"),\n\t\t\t\t\tvalue: \"enlarge\",\n\t\t\t\t\tdefault: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// label: \"Crop\",\n\t\t\t\t\tlabel: localize(\"No\"),\n\t\t\t\t\tvalue: \"crop\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: localize(\"Cancel\"),\n\t\t\t\t\tvalue: \"cancel\",\n\t\t\t\t},\n\t\t\t],\n\t\t}).then((result) => {\n\t\t\tif (result === \"enlarge\") {\n\t\t\t\t// The resize gets its own undoable, as in mspaint\n\t\t\t\tresize_canvas_and_save_dimensions(\n\t\t\t\t\tMath.max(main_canvas.width, img_or_canvas.width),\n\t\t\t\t\tMath.max(main_canvas.height, img_or_canvas.height),\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"Enlarge Canvas For Paste\",\n\t\t\t\t\t\ticon: get_help_folder_icon(\"p_stretch_both.png\"),\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tdo_the_paste();\n\t\t\t\t$canvas_area.trigger(\"resize\"); // already taken care of by resize_canvas_and_save_dimensions? or does this hide the main canvas handles?\n\t\t\t} else if (result === \"crop\") {\n\t\t\t\tdo_the_paste();\n\t\t\t}\n\t\t});\n\t} else {\n\t\tdo_the_paste();\n\t}\n\n\tfunction do_the_paste() {\n\t\tdeselect();\n\t\tselect_tool(get_tool_by_id(TOOL_SELECT));\n\n\t\tconst x = Math.max(0, Math.ceil($canvas_area.scrollLeft() / magnification));\n\t\tconst y = Math.max(0, Math.ceil(($canvas_area.scrollTop()) / magnification));\n\t\t// Nevermind, canvas, isn't aligned to the right in RTL layout!\n\t\t// let x = Math.max(0, Math.ceil($canvas_area.scrollLeft() / magnification));\n\t\t// if (get_direction() === \"rtl\") {\n\t\t// \t// magic number 8 is a guess, I guess based on the scrollbar width which shows on the left in RTL layout\n\t\t// \t// x = Math.max(0, Math.ceil(($canvas_area.innerWidth() - canvas.width + $canvas_area.scrollLeft() + 8) / magnification));\n\t\t// \tconst scrollbar_width = $canvas_area[0].offsetWidth - $canvas_area[0].clientWidth; // maybe??\n\t\t// \tconsole.log(\"scrollbar_width\", scrollbar_width);\n\t\t// \tx = Math.max(0, Math.ceil((-$canvas_area.innerWidth() + $canvas_area.scrollLeft() + scrollbar_width) / magnification + canvas.width));\n\t\t// }\n\n\t\tundoable({\n\t\t\tname: localize(\"Paste\"),\n\t\t\ticon: get_help_folder_icon(\"p_paste.png\"),\n\t\t\tsoft: true,\n\t\t}, () => {\n\t\t\tselection = new OnCanvasSelection(x, y, img_or_canvas.width, img_or_canvas.height, img_or_canvas);\n\t\t});\n\t}\n}\n\nfunction render_history_as_gif() {\n\tconst $win = $DialogWindow();\n\t$win.title(\"Rendering GIF\");\n\n\tconst $output = $win.$main;\n\tconst $progress = $(E(\"progress\")).appendTo($output).addClass(\"inset-deep\");\n\tconst $progress_percent = $(E(\"span\")).appendTo($output).css({\n\t\twidth: \"2.3em\",\n\t\tdisplay: \"inline-block\",\n\t\ttextAlign: \"center\",\n\t});\n\t$win.$main.css({ padding: 5 });\n\n\tconst $cancel = $win.$Button(\"Cancel\", () => {\n\t\t$win.close();\n\t}).focus();\n\n\t$win.center();\n\n\ttry {\n\t\tconst width = main_canvas.width;\n\t\tconst height = main_canvas.height;\n\t\tconst gif = new GIF({\n\t\t\t//workers: Math.min(5, Math.floor(undos.length/50)+1),\n\t\t\tworkerScript: \"lib/gif.js/gif.worker.js\",\n\t\t\twidth,\n\t\t\theight,\n\t\t});\n\n\t\t$win.on(\"close\", () => {\n\t\t\tgif.abort();\n\t\t});\n\n\t\tgif.on(\"progress\", (p) => {\n\t\t\t$progress.val(p);\n\t\t\t$progress_percent.text(`${~~(p * 100)}%`);\n\t\t});\n\n\t\tgif.on(\"finished\", (blob) => {\n\t\t\t$win.title(\"Rendered GIF\");\n\t\t\tconst blob_url = URL.createObjectURL(blob);\n\t\t\t$output.empty().append(\n\t\t\t\t$(E(\"div\")).addClass(\"inset-deep\").append(\n\t\t\t\t\t$(E(\"img\")).attr({\n\t\t\t\t\t\tsrc: blob_url,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\theight,\n\t\t\t\t\t}).css({\n\t\t\t\t\t\tdisplay: \"block\", // prevent margin below due to inline display (vertical-align can also be used)\n\t\t\t\t\t}),\n\t\t\t\t).css({\n\t\t\t\t\toverflow: \"auto\",\n\t\t\t\t\tmaxHeight: \"70vh\",\n\t\t\t\t\tmaxWidth: \"70vw\",\n\t\t\t\t})\n\t\t\t);\n\t\t\t$win.on(\"close\", () => {\n\t\t\t\t// revoking on image load(+error) breaks right click > \"Save image as\" and \"Open image in new tab\"\n\t\t\t\tURL.revokeObjectURL(blob_url);\n\t\t\t});\n\t\t\t$win.$Button(\"Upload to Imgur\", () => {\n\t\t\t\t$win.close();\n\t\t\t\tsanity_check_blob(blob, () => {\n\t\t\t\t\tshow_imgur_uploader(blob);\n\t\t\t\t});\n\t\t\t}).focus();\n\t\t\t$win.$Button(localize(\"Save\"), () => {\n\t\t\t\t$win.close();\n\t\t\t\tsanity_check_blob(blob, () => {\n\t\t\t\t\tconst suggested_file_name = `${file_name.replace(/\\.(bmp|dib|a?png|gif|jpe?g|jpe|jfif|tiff?|webp|raw)$/i, \"\")} history.gif`;\n\t\t\t\t\tsystemHooks.showSaveFileDialog({\n\t\t\t\t\t\tdialogTitle: localize(\"Save As\"), // localize(\"Save Animation As\"),\n\t\t\t\t\t\tgetBlob: () => blob,\n\t\t\t\t\t\tdefaultFileName: suggested_file_name,\n\t\t\t\t\t\tdefaultPath: typeof system_file_handle === \"string\" ? `${system_file_handle.replace(/[/\\\\][^/\\\\]*/, \"\")}/${suggested_file_name}` : null,\n\t\t\t\t\t\tdefaultFileFormatID: \"image/gif\",\n\t\t\t\t\t\tformats: [{\n\t\t\t\t\t\t\tformatID: \"image/gif\",\n\t\t\t\t\t\t\tmimeType: \"image/gif\",\n\t\t\t\t\t\t\tname: localize(\"Animated GIF (*.gif)\").replace(/\\s+\\([^(]+$/, \"\"),\n\t\t\t\t\t\t\tnameWithExtensions: localize(\"Animated GIF (*.gif)\"),\n\t\t\t\t\t\t\textensions: [\"gif\"],\n\t\t\t\t\t\t}],\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t\t$cancel.appendTo($win.$buttons);\n\t\t\t$win.center();\n\t\t});\n\n\t\tconst gif_canvas = make_canvas(width, height);\n\t\tconst frame_history_nodes = [...undos, current_history_node];\n\t\tfor (const frame_history_node of frame_history_nodes) {\n\t\t\tgif_canvas.ctx.clearRect(0, 0, gif_canvas.width, gif_canvas.height);\n\t\t\tgif_canvas.ctx.putImageData(frame_history_node.image_data, 0, 0);\n\t\t\tif (frame_history_node.selection_image_data) {\n\t\t\t\tconst selection_canvas = make_canvas(frame_history_node.selection_image_data);\n\t\t\t\tgif_canvas.ctx.drawImage(selection_canvas, frame_history_node.selection_x, frame_history_node.selection_y);\n\t\t\t}\n\t\t\tgif.addFrame(gif_canvas, { delay: 200, copy: true });\n\t\t}\n\t\tgif.render();\n\n\t} catch (err) {\n\t\t$win.close();\n\t\tshow_error_message(\"Failed to render GIF.\", err);\n\t}\n}\n\n/**\n * @param {HistoryNode} target_history_node\n * @param {boolean=} canceling\n */\nfunction go_to_history_node(target_history_node, canceling) {\n\tconst from_history_node = current_history_node;\n\n\tif (!target_history_node.image_data) {\n\t\tif (!canceling) {\n\t\t\tshow_error_message(\"History entry has no image data.\");\n\t\t\twindow.console?.log(\"Target history entry has no image data:\", target_history_node);\n\t\t}\n\t\treturn;\n\t}\n\t/* For performance (especially with two finger panning), I'm disabling this safety check that preserves certain document states in the history.\n\tconst current_image_data = main_ctx.getImageData(0, 0, main_canvas.width, main_canvas.height);\n\tif (!current_history_node.image_data || !image_data_match(current_history_node.image_data, current_image_data, 5)) {\n\t\twindow.console?.log(\"Canvas image data changed outside of undoable\", current_history_node, \"current_history_node.image_data:\", current_history_node.image_data, \"document's current image data:\", current_image_data);\n\t\tundoable({name: \"Unknown [go_to_history_node]\", use_loose_canvas_changes: true}, ()=> {});\n\t}\n\t*/\n\tcurrent_history_node = target_history_node;\n\n\tdeselect(true);\n\tif (!canceling) {\n\t\tcancel(true);\n\t}\n\tsaved = false;\n\tupdate_title();\n\n\tmain_ctx.copy(target_history_node.image_data);\n\tif (target_history_node.selection_image_data) {\n\t\tif (selection) {\n\t\t\tselection.destroy();\n\t\t}\n\t\t// @TODO maybe: could store whether a selection is from Free-Form Select\n\t\t// so it selects Free-Form Select when you jump to e.g. Move Selection\n\t\t// (or could traverse history to figure it out)\n\t\tif (target_history_node.name === localize(\"Free-Form Select\")) {\n\t\t\tselect_tool(get_tool_by_id(TOOL_FREE_FORM_SELECT));\n\t\t} else {\n\t\t\tselect_tool(get_tool_by_id(TOOL_SELECT));\n\t\t}\n\t\tselection = new OnCanvasSelection(\n\t\t\ttarget_history_node.selection_x,\n\t\t\ttarget_history_node.selection_y,\n\t\t\ttarget_history_node.selection_image_data.width,\n\t\t\ttarget_history_node.selection_image_data.height,\n\t\t\ttarget_history_node.selection_image_data,\n\t\t);\n\t}\n\tif (target_history_node.textbox_text != null) {\n\t\tif (textbox) {\n\t\t\ttextbox.destroy();\n\t\t}\n\t\t// @# text_tool_font =\n\t\tfor (const [k, v] of Object.entries(target_history_node.text_tool_font)) {\n\t\t\ttext_tool_font[k] = v;\n\t\t}\n\n\t\tselected_colors.foreground = target_history_node.foreground_color;\n\t\tselected_colors.background = target_history_node.background_color;\n\t\ttool_transparent_mode = target_history_node.tool_transparent_mode;\n\t\t$G.trigger(\"option-changed\");\n\n\t\tselect_tool(get_tool_by_id(TOOL_TEXT));\n\t\ttextbox = new OnCanvasTextBox(\n\t\t\ttarget_history_node.textbox_x,\n\t\t\ttarget_history_node.textbox_y,\n\t\t\ttarget_history_node.textbox_width,\n\t\t\ttarget_history_node.textbox_height,\n\t\t\ttarget_history_node.textbox_text,\n\t\t);\n\t}\n\n\tconst ancestors_of_target = get_history_ancestors(target_history_node);\n\n\tundos = [...ancestors_of_target];\n\tundos.reverse();\n\n\tconst old_history_path =\n\t\tredos.length > 0 ?\n\t\t\t[redos[0], ...get_history_ancestors(redos[0])] :\n\t\t\t[from_history_node, ...get_history_ancestors(from_history_node)];\n\n\t// window.console?.log(\"target_history_node:\", target_history_node);\n\t// window.console?.log(\"ancestors_of_target:\", ancestors_of_target);\n\t// window.console?.log(\"old_history_path:\", old_history_path);\n\tredos.length = 0;\n\n\tlet latest_node = target_history_node;\n\twhile (latest_node.futures.length > 0) {\n\t\tconst futures = [...latest_node.futures];\n\t\tfutures.sort((a, b) => {\n\t\t\tif (old_history_path.indexOf(a) > -1) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (old_history_path.indexOf(b) > -1) {\n\t\t\t\treturn +1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\t\tlatest_node = futures[0];\n\t\tredos.unshift(latest_node);\n\t}\n\t// window.console?.log(\"new undos:\", undos);\n\t// window.console?.log(\"new redos:\", redos);\n\n\t$canvas_area.trigger(\"resize\");\n\t$G.triggerHandler(\"session-update\"); // autosave\n\t$G.triggerHandler(\"history-update\"); // update history view\n}\n\n// Note: This function is part of the API.\n/**\n * Creates an undo point.\n * @param {ActionMetadata} options\n * @param {function=} callback\n */\nfunction undoable({ name, icon, use_loose_canvas_changes, soft, assume_saved }, callback) {\n\tif (!use_loose_canvas_changes) {\n\t\t/* For performance (especially with two finger panning), I'm disabling this safety check that preserves certain document states in the history.\n\t\tconst current_image_data = main_ctx.getImageData(0, 0, main_canvas.width, main_canvas.height);\n\t\tif (!current_history_node.image_data || !image_data_match(current_history_node.image_data, current_image_data, 5)) {\n\t\t\twindow.console?.log(\"Canvas image data changed outside of undoable\", current_history_node, \"current_history_node.image_data:\", current_history_node.image_data, \"document's current image data:\", current_image_data);\n\t\t\tundoable({name: \"Unknown [undoable]\", use_loose_canvas_changes: true}, ()=> {});\n\t\t}\n\t\t*/\n\t}\n\n\tif (!assume_saved) { // flag is used for undoable file reloading on save, for reduction in color depth\n\t\tsaved = false;\n\t\tupdate_title();\n\t}\n\n\tconst before_callback_history_node = current_history_node;\n\tcallback?.();\n\tif (current_history_node !== before_callback_history_node) {\n\t\tshow_error_message(`History node switched during undoable callback for ${name}. This shouldn't happen.`);\n\t\twindow.console?.log(`History node switched during undoable callback for ${name}, from`, before_callback_history_node, \"to\", current_history_node);\n\t}\n\n\tconst image_data = main_ctx.getImageData(0, 0, main_canvas.width, main_canvas.height);\n\n\tredos.length = 0;\n\tundos.push(current_history_node);\n\n\tconst new_history_node = make_history_node({\n\t\timage_data,\n\t\tselection_image_data: selection && selection.canvas.ctx.getImageData(0, 0, selection.canvas.width, selection.canvas.height),\n\t\tselection_x: selection && selection.x,\n\t\tselection_y: selection && selection.y,\n\t\ttextbox_text: textbox && textbox.$editor.val(),\n\t\ttextbox_x: textbox && textbox.x,\n\t\ttextbox_y: textbox && textbox.y,\n\t\ttextbox_width: textbox && textbox.width,\n\t\ttextbox_height: textbox && textbox.height,\n\t\ttext_tool_font: JSON.parse(JSON.stringify(text_tool_font)),\n\t\ttool_transparent_mode,\n\t\tforeground_color: selected_colors.foreground,\n\t\tbackground_color: selected_colors.background,\n\t\tternary_color: selected_colors.ternary,\n\t\tparent: current_history_node,\n\t\tname,\n\t\ticon,\n\t\tsoft,\n\t});\n\tcurrent_history_node.futures.push(new_history_node);\n\tcurrent_history_node = new_history_node;\n\n\t$G.triggerHandler(\"history-update\"); // update history view\n\n\t$G.triggerHandler(\"session-update\"); // autosave\n}\n/**\n * @param {ActionMetadataUpdate} undoable_meta\n * @param {()=> void} undoable_action\n */\nfunction make_or_update_undoable(undoable_meta, undoable_action) {\n\tif (current_history_node.futures.length === 0 && undoable_meta.match(current_history_node)) {\n\t\tundoable_action();\n\t\tcurrent_history_node.image_data = main_ctx.getImageData(0, 0, main_canvas.width, main_canvas.height);\n\t\tcurrent_history_node.selection_image_data = selection && selection.canvas.ctx.getImageData(0, 0, selection.canvas.width, selection.canvas.height);\n\t\tcurrent_history_node.selection_x = selection && selection.x;\n\t\tcurrent_history_node.selection_y = selection && selection.y;\n\t\tif (undoable_meta.update_name) {\n\t\t\tcurrent_history_node.name = undoable_meta.name;\n\t\t}\n\t\t$G.triggerHandler(\"history-update\"); // update history view\n\t} else {\n\t\tundoable(undoable_meta, undoable_action);\n\t}\n}\nfunction undo() {\n\tif (undos.length < 1) { return false; }\n\n\tredos.push(current_history_node);\n\tlet target_history_node = undos.pop();\n\n\twhile (target_history_node.soft && undos.length) {\n\t\tredos.push(target_history_node);\n\t\ttarget_history_node = undos.pop();\n\t}\n\n\tgo_to_history_node(target_history_node);\n\n\treturn true;\n}\n\n// @TODO: use Clippy.js instead for potentially annoying tips\n/** @type {OSGUI$Window} */\nlet $document_history_prompt_window;\nfunction redo() {\n\tif (redos.length < 1) {\n\t\tif ($document_history_prompt_window) {\n\t\t\t$document_history_prompt_window.close();\n\t\t}\n\t\tif (!$document_history_window || $document_history_window.closed) {\n\t\t\t$document_history_prompt_window = showMessageBox({\n\t\t\t\ttitle: \"Redo\",\n\t\t\t\tmessageHTML: \"To view all branches of the history tree, click <b>Edit > History</b>.\",\n\t\t\t\ticonID: \"info\",\n\t\t\t}).$window;\n\t\t}\n\t\treturn false;\n\t}\n\n\tundos.push(current_history_node);\n\tlet target_history_node = redos.pop();\n\n\twhile (target_history_node.soft && redos.length) {\n\t\tundos.push(target_history_node);\n\t\ttarget_history_node = redos.pop();\n\t}\n\n\tgo_to_history_node(target_history_node);\n\n\treturn true;\n}\n\n/**\n * @param {HistoryNode} node\n * @returns {HistoryNode[]} ancestors\n */\nfunction get_history_ancestors(node) {\n\tconst ancestors = [];\n\tfor (node = node.parent; node; node = node.parent) {\n\t\tancestors.push(node);\n\t}\n\treturn ancestors;\n}\n\n/** @type {OSGUI$Window} */\nlet $document_history_window;\n// setTimeout(show_document_history, 100);\nfunction show_document_history() {\n\tif ($document_history_prompt_window) {\n\t\t$document_history_prompt_window.close();\n\t}\n\tif ($document_history_window) {\n\t\t$document_history_window.close();\n\t}\n\tconst $w = $document_history_window = $Window({\n\t\ttitle: \"Document History\",\n\t\tresizable: false,\n\t\tmaximizeButton: false,\n\t\tminimizeButton: false,\n\t});\n\t// $w.prependTo(\"body\").css({position: \"\"});\n\t$w.addClass(\"history-window squish\");\n\t$w.$content.html(`\n\t\t<label>\n\t\t\t<select id=\"history-view-mode\" class=\"inset-deep\">\n\t\t\t\t<option value=\"linear\">Linear timeline</option>\n\t\t\t\t<option value=\"tree\">Tree</option>\n\t\t\t</select>\n\t\t</label>\n\t\t<div class=\"history-view\" tabIndex=\"0\"></div>\n\t`);\n\n\tconst $history_view = $w.$content.find(\".history-view\");\n\t$history_view.focus();\n\n\tlet previous_scroll_position = 0;\n\n\tlet rendered_$entries = [];\n\tlet current_$entry;\n\n\tlet $mode_select = $w.$content.find(\"#history-view-mode\");\n\t$mode_select.css({\n\t\tmargin: \"10px\",\n\t});\n\tlet mode = $mode_select.val();\n\t$mode_select.on(\"change\", () => {\n\t\tmode = $mode_select.val();\n\t\trender_tree();\n\t});\n\n\t/**\n\t * @param {HistoryNode} node\n\t */\n\tfunction render_tree_from_node(node) {\n\t\tconst $entry = $(`\n\t\t\t<div class=\"history-entry\">\n\t\t\t\t<div class=\"history-entry-icon-area\"></div>\n\t\t\t\t<div class=\"history-entry-name\"></div>\n\t\t\t</div>\n\t\t`);\n\t\t// $entry.find(\".history-entry-name\").text((node.name || \"Unknown\") + (node.soft ? \" (soft)\" : \"\"));\n\t\t$entry.find(\".history-entry-name\").text((node.name || \"Unknown\") + (node === root_history_node ? \" (Start of History)\" : \"\"));\n\t\t$entry.find(\".history-entry-icon-area\").append(node.icon);\n\t\tif (mode === \"tree\") {\n\t\t\tlet dist_to_root = 0;\n\t\t\tfor (let ancestor = node.parent; ancestor; ancestor = ancestor.parent) {\n\t\t\t\tdist_to_root++;\n\t\t\t}\n\t\t\t$entry.css({\n\t\t\t\tmarginInlineStart: `${dist_to_root * 8}px`,\n\t\t\t});\n\t\t}\n\t\tif (node === current_history_node) {\n\t\t\t$entry.addClass(\"current\");\n\t\t\tcurrent_$entry = $entry;\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\t// scrollIntoView causes <html> to scroll when the window is partially offscreen,\n\t\t\t\t// despite overflow: hidden on html and body, so it's not an option.\n\t\t\t\t$history_view[0].scrollTop =\n\t\t\t\t\tMath.min(\n\t\t\t\t\t\t$entry[0].offsetTop,\n\t\t\t\t\t\tMath.max(\n\t\t\t\t\t\t\tprevious_scroll_position,\n\t\t\t\t\t\t\t$entry[0].offsetTop - $history_view[0].clientHeight + $entry.outerHeight()\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t});\n\t\t} else {\n\t\t\tconst history_ancestors = get_history_ancestors(current_history_node);\n\t\t\tif (history_ancestors.indexOf(node) > -1) {\n\t\t\t\t$entry.addClass(\"ancestor-of-current\");\n\t\t\t}\n\t\t}\n\t\tfor (const sub_node of node.futures) {\n\t\t\trender_tree_from_node(sub_node);\n\t\t}\n\t\t$entry.on(\"click\", () => {\n\t\t\tgo_to_history_node(node);\n\t\t});\n\t\t// @ts-ignore  (TODO: maybe don't tack properties onto objects so much!)\n\t\t$entry.history_node = node;\n\t\trendered_$entries.push($entry);\n\t}\n\tconst render_tree = () => {\n\t\tprevious_scroll_position = $history_view.scrollTop();\n\t\t$history_view.empty();\n\t\trendered_$entries = [];\n\t\trender_tree_from_node(root_history_node);\n\t\tif (mode === \"linear\") {\n\t\t\trendered_$entries.sort(($a, $b) => {\n\t\t\t\tif ($a.history_node.timestamp < $b.history_node.timestamp) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ($b.history_node.timestamp < $a.history_node.timestamp) {\n\t\t\t\t\treturn +1;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t});\n\t\t} else {\n\t\t\trendered_$entries.reverse();\n\t\t}\n\t\trendered_$entries.forEach(($entry) => {\n\t\t\t$history_view.append($entry);\n\t\t});\n\t};\n\trender_tree();\n\n\t// This is different from Ctrl+Z/Ctrl+Shift+Z because it goes over all branches of the history tree, chronologically,\n\t// not just one branch.\n\tconst go_by = (index_delta) => {\n\t\tconst from_index = rendered_$entries.indexOf(current_$entry);\n\t\tconst to_index = from_index + index_delta;\n\t\tif (rendered_$entries[to_index]) {\n\t\t\trendered_$entries[to_index].click();\n\t\t}\n\t};\n\t$history_view.on(\"keydown\", (event) => {\n\t\tif (!event.ctrlKey && !event.altKey && !event.shiftKey && !event.metaKey) {\n\t\t\tif (event.key === \"ArrowDown\" || event.key === \"Down\") {\n\t\t\t\tgo_by(1);\n\t\t\t\tevent.preventDefault();\n\t\t\t} else if (event.key === \"ArrowUp\" || event.key === \"Up\") {\n\t\t\t\tgo_by(-1);\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t});\n\n\t$G.on(\"history-update\", render_tree);\n\t$w.on(\"close\", () => {\n\t\t$G.off(\"history-update\", render_tree);\n\t});\n\n\t$w.center();\n}\n\n/**\n * Cancel the current tool gesture, if any.\n * Note: this function should be idempotent. `cancel(); cancel();` should do the same thing as `cancel();`\n * @param {boolean} [going_to_history_node]\n * @param {boolean} [discard_document_state]\n */\nfunction cancel(going_to_history_node, discard_document_state) {\n\tif (!history_node_to_cancel_to) {\n\t\treturn;\n\t}\n\n\t// For two finger panning, I want to prevent history nodes from being created,\n\t// for performance, and to avoid cluttering the history.\n\t// (And also so if you undo and then pan, you can still redo (without accessing the nonlinear history window).)\n\t// Most tools create undoables on pointerup, in which case we can prevent them from being created,\n\t// but Fill tool creates on pointerdown, so we need to delete a history node in that case.\n\t// Select tool can create multiple undoables before being cancelled (for moving/resizing/inverting/smearing),\n\t// but only the last should be discarded due to panning. (All of them should be undone you hit Esc. But not deleted.)\n\tconst history_node_to_discard = (\n\t\tdiscard_document_state &&\n\t\tcurrent_history_node.parent && // can't discard the root node\n\t\tcurrent_history_node !== history_node_to_cancel_to && // can't discard what will be the active node\n\t\tcurrent_history_node.futures.length === 0 // prevent discarding whole branches of history if you go back in history and then pan / hit Esc\n\t) ? current_history_node : null;\n\n\t// console.log(\"history_node_to_discard\", history_node_to_discard, \"current_history_node\", current_history_node, \"history_node_to_cancel_to\", history_node_to_cancel_to);\n\n\t// history_node_to_cancel_to = history_node_to_cancel_to || current_history_node;\n\t$G.triggerHandler(\"pointerup\", [\"canceling\", discard_document_state]);\n\tfor (const selected_tool of selected_tools) {\n\t\tselected_tool.cancel?.();\n\t}\n\tif (!going_to_history_node) {\n\t\t// Note: this will revert any changes from other users in multi-user sessions\n\t\t// which isn't good, but there's no real conflict resolution in multi-user mode anyways\n\t\tgo_to_history_node(history_node_to_cancel_to, true);\n\n\t\tif (history_node_to_discard) {\n\t\t\tconst index = history_node_to_discard.parent.futures.indexOf(history_node_to_discard);\n\t\t\tif (index === -1) {\n\t\t\t\tshow_error_message(\"History node not found. Please report this bug.\");\n\t\t\t\tconsole.log(\"history_node_to_discard\", history_node_to_discard);\n\t\t\t\tconsole.log(\"current_history_node\", current_history_node);\n\t\t\t\tconsole.log(\"history_node_to_discard.parent\", history_node_to_discard.parent);\n\t\t\t} else {\n\t\t\t\thistory_node_to_discard.parent.futures.splice(index, 1);\n\t\t\t\t$G.triggerHandler(\"history-update\"); // update history view (don't want you to be able to click on the excised node)\n\t\t\t\t// (@TODO: prevent duplicate update, here vs go_to_history_node)\n\t\t\t}\n\t\t}\n\t}\n\thistory_node_to_cancel_to = null;\n\tupdate_helper_layer();\n}\n/**\n * @param {boolean} [going_to_history_node]\n */\nfunction meld_selection_into_canvas(going_to_history_node) {\n\tselection.draw();\n\tselection.destroy();\n\tselection = null;\n\tif (!going_to_history_node) {\n\t\tundoable({\n\t\t\tname: \"Deselect\",\n\t\t\ticon: get_icon_for_tool(get_tool_by_id(TOOL_SELECT)),\n\t\t\tuse_loose_canvas_changes: true, // HACK; @TODO: make OnCanvasSelection not change the canvas outside undoable, same rules as tools\n\t\t}, () => { });\n\t}\n}\n/**\n * @param {boolean} [going_to_history_node]\n */\nfunction meld_textbox_into_canvas(going_to_history_node) {\n\tconst text = textbox.$editor.val();\n\tif (text && !going_to_history_node) {\n\t\tundoable({\n\t\t\tname: localize(\"Text\"),\n\t\t\ticon: get_icon_for_tool(get_tool_by_id(TOOL_TEXT)),\n\t\t\tsoft: true,\n\t\t}, () => { });\n\t\tundoable({\n\t\t\tname: \"Finish Text\",\n\t\t\ticon: get_icon_for_tool(get_tool_by_id(TOOL_TEXT)),\n\t\t}, () => {\n\t\t\tmain_ctx.drawImage(textbox.canvas, textbox.x, textbox.y);\n\t\t\ttextbox.destroy();\n\t\t\ttextbox = null;\n\t\t});\n\t} else {\n\t\ttextbox.destroy();\n\t\ttextbox = null;\n\t}\n}\n/**\n * @param {boolean} [going_to_history_node]\n */\nfunction deselect(going_to_history_node) {\n\tif (selection) {\n\t\tmeld_selection_into_canvas(going_to_history_node);\n\t}\n\tif (textbox) {\n\t\tmeld_textbox_into_canvas(going_to_history_node);\n\t}\n\tfor (const selected_tool of selected_tools) {\n\t\tselected_tool.end?.(main_ctx);\n\t}\n}\n\n/**\n * @param {{name?: string, icon?: HTMLImageElement | HTMLCanvasElement}} [meta] - overrides certain properties of ActionMetadata\n */\nfunction delete_selection(meta = {}) {\n\tif (selection) {\n\t\tundoable({\n\t\t\tname: meta.name || localize(\"Clear Selection\"), //\"Delete\", (I feel like \"Clear Selection\" is unclear, could mean \"Deselect\")\n\t\t\ticon: meta.icon || get_help_folder_icon(\"p_delete.png\"),\n\t\t\t// soft: @TODO: conditionally soft?,\n\t\t}, () => {\n\t\t\tselection.destroy();\n\t\t\tselection = null;\n\t\t});\n\t}\n}\nfunction select_all() {\n\tdeselect();\n\tselect_tool(get_tool_by_id(TOOL_SELECT));\n\n\tundoable({\n\t\tname: localize(\"Select All\"),\n\t\ticon: get_icon_for_tool(get_tool_by_id(TOOL_SELECT)),\n\t\tsoft: true,\n\t}, () => {\n\t\tselection = new OnCanvasSelection(0, 0, main_canvas.width, main_canvas.height);\n\t});\n}\n\nconst ctrlOrCmd = /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform) ? \"⌘\" : \"Ctrl\";\nconst recommendationForClipboardAccess = `Please use the keyboard: ${ctrlOrCmd}+C to copy, ${ctrlOrCmd}+X to cut, ${ctrlOrCmd}+V to paste. If keyboard is not an option, try using Chrome version 76 or higher.`;\n/**\n * @param {string} commandId\n */\nfunction try_exec_command(commandId) {\n\tif (document.queryCommandEnabled(commandId)) { // not a reliable source for whether it'll work, if I recall\n\t\tdocument.execCommand(commandId);\n\t\tif (!navigator.userAgent.includes(\"Firefox\") || commandId === \"paste\") {\n\t\t\treturn show_error_message(`That ${commandId} probably didn't work. ${recommendationForClipboardAccess}`);\n\t\t}\n\t} else {\n\t\treturn show_error_message(`Cannot perform ${commandId}. ${recommendationForClipboardAccess}`);\n\t}\n}\n\nfunction getSelectionText() {\n\t// instanceof might make this simpler, particularly with TypeScript JSDoc\n\tconst activeEl = document.activeElement;\n\tconst activeElTagName = activeEl ? activeEl.tagName.toLowerCase() : null;\n\tif (\n\t\t(activeElTagName == \"textarea\") || (\n\t\t\tactiveElTagName == \"input\" &&\n\t\t\t/^(?:text|search|password|tel|url)$/i.test(/** @type {HTMLInputElement} */(activeEl).type)\n\t\t)\n\t) {\n\t\tconst textField = /** @type {HTMLInputElement | HTMLTextAreaElement} */(activeEl);\n\t\tif (typeof textField.selectionStart == \"number\") {\n\t\t\treturn textField.value.slice(textField.selectionStart, textField.selectionEnd);\n\t\t}\n\t}\n\tif (window.getSelection) {\n\t\treturn window.getSelection().toString();\n\t}\n\treturn \"\";\n}\n\n/**\n * @param {boolean} [execCommandFallback]\n */\nfunction edit_copy(execCommandFallback) {\n\tconst text = getSelectionText();\n\n\tif (text.length > 0) {\n\t\tif (!navigator.clipboard || !navigator.clipboard.writeText) {\n\t\t\tif (execCommandFallback) {\n\t\t\t\treturn try_exec_command(\"copy\");\n\t\t\t} else {\n\t\t\t\tshow_error_message(`${localize(\"Error getting the Clipboard Data!\")} ${recommendationForClipboardAccess}`);\n\t\t\t\t// show_error_message(`The Async Clipboard API is not supported by this browser. ${browserRecommendationForClipboardAccess}`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tnavigator.clipboard.writeText(text);\n\t} else if (selection && selection.canvas) {\n\t\tif (!navigator.clipboard || !navigator.clipboard.write) {\n\t\t\tif (execCommandFallback) {\n\t\t\t\treturn try_exec_command(\"copy\");\n\t\t\t} else {\n\t\t\t\tshow_error_message(`${localize(\"Error getting the Clipboard Data!\")} ${recommendationForClipboardAccess}`);\n\t\t\t\t// show_error_message(`The Async Clipboard API is not supported by this browser. ${browserRecommendationForClipboardAccess}`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tselection.canvas.toBlob((blob) => {\n\t\t\tsanity_check_blob(blob, () => {\n\t\t\t\tnavigator.clipboard.write([\n\t\t\t\t\tnew ClipboardItem(Object.defineProperty({}, blob.type, {\n\t\t\t\t\t\tvalue: blob,\n\t\t\t\t\t\tenumerable: true,\n\t\t\t\t\t})),\n\t\t\t\t]).then(() => {\n\t\t\t\t\twindow.console?.log(\"Copied image to the clipboard.\");\n\t\t\t\t}, (error) => {\n\t\t\t\t\tshow_error_message(\"Failed to copy to the Clipboard.\", error);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n}\n/**\n * @param {boolean} [execCommandFallback]\n */\nfunction edit_cut(execCommandFallback) {\n\tif (!navigator.clipboard || !navigator.clipboard.write) {\n\t\tif (execCommandFallback) {\n\t\t\treturn try_exec_command(\"cut\");\n\t\t} else {\n\t\t\tshow_error_message(`${localize(\"Error getting the Clipboard Data!\")} ${recommendationForClipboardAccess}`);\n\t\t\t// show_error_message(`The Async Clipboard API is not supported by this browser. ${browserRecommendationForClipboardAccess}`);\n\t\t\treturn;\n\t\t}\n\t}\n\tedit_copy();\n\tdelete_selection({\n\t\tname: localize(\"Cut\"),\n\t\ticon: get_help_folder_icon(\"p_cut.png\"),\n\t});\n}\n/**\n * @param {boolean} [execCommandFallback]\n */\nasync function edit_paste(execCommandFallback) {\n\tif (\n\t\tdocument.activeElement instanceof HTMLInputElement ||\n\t\tdocument.activeElement instanceof HTMLTextAreaElement\n\t) {\n\t\tif (!navigator.clipboard || !navigator.clipboard.readText) {\n\t\t\tif (execCommandFallback) {\n\t\t\t\treturn try_exec_command(\"paste\");\n\t\t\t} else {\n\t\t\t\tshow_error_message(`${localize(\"Error getting the Clipboard Data!\")} ${recommendationForClipboardAccess}`);\n\t\t\t\t// show_error_message(`The Async Clipboard API is not supported by this browser. ${browserRecommendationForClipboardAccess}`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tconst clipboardText = await navigator.clipboard.readText();\n\t\tdocument.execCommand(\"InsertText\", false, clipboardText);\n\t\treturn;\n\t}\n\tif (!navigator.clipboard || !navigator.clipboard.read) {\n\t\tif (execCommandFallback) {\n\t\t\treturn try_exec_command(\"paste\");\n\t\t} else {\n\t\t\tshow_error_message(`${localize(\"Error getting the Clipboard Data!\")} ${recommendationForClipboardAccess}`);\n\t\t\t// show_error_message(`The Async Clipboard API is not supported by this browser. ${browserRecommendationForClipboardAccess}`);\n\t\t\treturn;\n\t\t}\n\t}\n\ttry {\n\t\tconst clipboardItems = await navigator.clipboard.read();\n\t\tconst blob = await clipboardItems[0].getType(\"image/png\");\n\t\tpaste_image_from_file(blob);\n\t} catch (error) {\n\t\tif (error.name === \"NotFoundError\") {\n\t\t\ttry {\n\t\t\t\tconst clipboardText = await navigator.clipboard.readText();\n\t\t\t\tif (clipboardText) {\n\t\t\t\t\tconst uris = get_uris(clipboardText);\n\t\t\t\t\tif (uris.length > 0) {\n\t\t\t\t\t\tload_image_from_uri(uris[0]).then((info) => {\n\t\t\t\t\t\t\tpaste(info.image || make_canvas(info.image_data));\n\t\t\t\t\t\t}, (error) => {\n\t\t\t\t\t\t\tshow_resource_load_error_message(error);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// @TODO: should I just make a textbox instead?\n\t\t\t\t\t\tshow_error_message(\"The information on the Clipboard can't be inserted into Paint.\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tshow_error_message(\"The information on the Clipboard can't be inserted into Paint.\");\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tshow_error_message(localize(\"Error getting the Clipboard Data!\"), error);\n\t\t\t}\n\t\t} else {\n\t\t\tshow_error_message(localize(\"Error getting the Clipboard Data!\"), error);\n\t\t}\n\t}\n}\n\nfunction image_invert_colors() {\n\tapply_image_transformation({\n\t\tname: localize(\"Invert Colors\"),\n\t\ticon: get_help_folder_icon(\"p_invert.png\"),\n\t}, (_original_canvas, original_ctx, _new_canvas, new_ctx) => {\n\t\tconst monochrome_info = monochrome && detect_monochrome(original_ctx);\n\t\tif (monochrome && monochrome_info.isMonochrome) {\n\t\t\tinvert_monochrome(original_ctx, new_ctx, monochrome_info);\n\t\t} else {\n\t\t\tinvert_rgb(original_ctx, new_ctx);\n\t\t}\n\t});\n}\n\nfunction clear() {\n\tdeselect();\n\tcancel();\n\tundoable({\n\t\tname: localize(\"Clear Image\"),\n\t\ticon: get_help_folder_icon(\"p_blank.png\"),\n\t}, () => {\n\t\tsaved = false;\n\t\tupdate_title();\n\n\t\tif (transparency) {\n\t\t\tmain_ctx.clearRect(0, 0, main_canvas.width, main_canvas.height);\n\t\t} else {\n\t\t\tmain_ctx.fillStyle = selected_colors.background;\n\t\t\tmain_ctx.fillRect(0, 0, main_canvas.width, main_canvas.height);\n\t\t}\n\t});\n}\n\nlet cleanup_bitmap_view = () => { };\nfunction view_bitmap() {\n\tcleanup_bitmap_view();\n\n\tconst bitmap_view_div = document.createElement(\"div\");\n\tbitmap_view_div.classList.add(\"bitmap-view\", \"inset-deep\");\n\tdocument.body.appendChild(bitmap_view_div);\n\t$(bitmap_view_div).css({\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tposition: \"fixed\",\n\t\ttop: \"0\",\n\t\tleft: \"0\",\n\t\twidth: \"100%\",\n\t\theight: \"100%\",\n\t\tzIndex: \"9999\",\n\t\tbackground: \"var(--Background)\",\n\t});\n\tif (bitmap_view_div.requestFullscreen) {\n\t\tbitmap_view_div.requestFullscreen();\n\t} else if (bitmap_view_div.webkitRequestFullscreen) {\n\t\tbitmap_view_div.webkitRequestFullscreen();\n\t}\n\n\tlet blob_url;\n\tlet got_fullscreen = false;\n\tlet iid = setInterval(() => {\n\t\t// In Chrome, if the page is already fullscreen, and you requestFullscreen,\n\t\t// hitting Esc will change document.fullscreenElement without triggering the fullscreenchange event!\n\t\t// It doesn't trigger a keydown either.\n\t\tif (document.fullscreenElement === bitmap_view_div || document.webkitFullscreenElement === bitmap_view_div) {\n\t\t\tgot_fullscreen = true;\n\t\t} else if (got_fullscreen) {\n\t\t\tcleanup_bitmap_view();\n\t\t}\n\t}, 100);\n\tcleanup_bitmap_view = () => {\n\t\tdocument.removeEventListener(\"fullscreenchange\", onFullscreenChange);\n\t\tdocument.removeEventListener(\"webkitfullscreenchange\", onFullscreenChange);\n\t\tdocument.removeEventListener(\"keydown\", onKeyDown);\n\t\tdocument.removeEventListener(\"mousedown\", onMouseDown);\n\t\t// If you have e.g. the Help window open,\n\t\t// and right click to close the View Bitmap, with the mouse over the window,\n\t\t// this needs a delay to cancel the context menu.\n\t\tsetTimeout(() => {\n\t\t\tdocument.removeEventListener(\"contextmenu\", onContextMenu);\n\t\t}, 100);\n\t\tURL.revokeObjectURL(blob_url);\n\t\tclearInterval(iid);\n\t\tif (document.fullscreenElement === bitmap_view_div || document.webkitFullscreenElement === bitmap_view_div) {\n\t\t\tif (document.exitFullscreen) {\n\t\t\t\tdocument.exitFullscreen(); // avoid warning in Firefox\n\t\t\t} else if (document.msExitFullscreen) {\n\t\t\t\tdocument.msExitFullscreen();\n\t\t\t} else if (document.mozCancelFullScreen) {\n\t\t\t\tdocument.mozCancelFullScreen();\n\t\t\t} else if (document.webkitExitFullscreen) {\n\t\t\t\tdocument.webkitExitFullscreen();\n\t\t\t}\n\t\t}\n\t\tbitmap_view_div.remove();\n\t\tcleanup_bitmap_view = () => { };\n\t};\n\tdocument.addEventListener(\"fullscreenchange\", onFullscreenChange, { once: true });\n\tdocument.addEventListener(\"webkitfullscreenchange\", onFullscreenChange, { once: true });\n\tdocument.addEventListener(\"keydown\", onKeyDown);\n\tdocument.addEventListener(\"mousedown\", onMouseDown);\n\tdocument.addEventListener(\"contextmenu\", onContextMenu);\n\n\tfunction onFullscreenChange() {\n\t\tif (document.fullscreenElement !== bitmap_view_div && document.webkitFullscreenElement !== bitmap_view_div) {\n\t\t\tcleanup_bitmap_view();\n\t\t}\n\t}\n\tlet repeating_f = false;\n\tfunction onKeyDown(event) {\n\t\t// console.log(event.key, event.repeat);\n\t\trepeating_f = repeating_f || event.repeat && (event.key === \"f\" || event.key === \"F\");\n\t\tif (event.repeat) { return; }\n\t\tif (repeating_f && (event.key === \"f\" || event.key === \"F\")) {\n\t\t\trepeating_f = false;\n\t\t\treturn; // Chrome sends an F keydown with repeat=false if you release Ctrl before F, while repeating.\n\t\t\t// This is a slightly overkill, and slightly overzealous workaround (can ignore one normal F before handling F as exit)\n\t\t}\n\t\t// Prevent also toggling View Bitmap on while toggling off, with Ctrl+F+F.\n\t\t// That is, if you hold Ctrl and press F twice, the second F should close View Bitmap and not reopen it immediately.\n\t\t// This relies on the keydown handler handling event.defaultPrevented (or isDefaultPrevented() if it's using jQuery)\n\t\tevent.preventDefault();\n\t\t// Note: in mspaint, Esc is the only key that DOESN'T close the bitmap view,\n\t\t// but it also doesn't do anything else — other than changing the cursor. Stupid.\n\t\tcleanup_bitmap_view();\n\t}\n\tfunction onMouseDown(_event) {\n\t\t// Note: in mspaint, only left click exits View Bitmap mode.\n\t\t// Right click can show a useless context menu.\n\t\tcleanup_bitmap_view();\n\t}\n\tfunction onContextMenu(event) {\n\t\tevent.preventDefault();\n\t\tcleanup_bitmap_view(); // not needed\n\t}\n\n\t// @TODO: include selection in the bitmap\n\t// I believe mspaint uses a similar code path to the Thumbnail,\n\t// considering that if you right click on the image in View Bitmap mode,\n\t// it shows the silly \"Thumbnail\" context menu item.\n\t// (It also shows the selection, in a meaningless place, similar to the Thumbnail's bugs)\n\tmain_canvas.toBlob((blob) => {\n\t\tblob_url = URL.createObjectURL(blob);\n\t\tconst img = document.createElement(\"img\");\n\t\timg.src = blob_url;\n\t\tbitmap_view_div.appendChild(img);\n\t}, \"image/png\");\n}\n/**\n * @param {ToolID} id\n * @returns {Tool} tool object\n */\nfunction get_tool_by_id(id) {\n\tfor (let i = 0; i < tools.length; i++) {\n\t\tif (tools[i].id == id) {\n\t\t\treturn tools[i];\n\t\t}\n\t}\n\t// for (let i = 0; i < extra_tools.length; i++) {\n\t// \tif (extra_tools[i].id == id) {\n\t// \t\treturn extra_tools[i];\n\t// \t}\n\t// }\n}\n\n// hacky but whatever\n// this whole \"multiple tools\" thing is hacky for now\n/**\n * @param {Tool[]} tools\n */\nfunction select_tools(tools) {\n\tfor (let i = 0; i < tools.length; i++) {\n\t\tselect_tool(tools[i], i > 0);\n\t}\n\tupdate_helper_layer();\n}\n\n/**\n * @param {Tool} tool\n * @param {boolean} [toggle]\n */\nfunction select_tool(tool, toggle) {\n\tdeselect();\n\n\tif (!(selected_tools.length === 1 && selected_tool.deselect)) {\n\t\treturn_to_tools = [...selected_tools];\n\t}\n\tif (toggle) {\n\t\tconst index = selected_tools.indexOf(tool);\n\t\tif (index === -1) {\n\t\t\tselected_tools.push(tool);\n\t\t\tselected_tools.sort((a, b) => {\n\t\t\t\tif (tools.indexOf(a) < tools.indexOf(b)) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif (tools.indexOf(a) > tools.indexOf(b)) {\n\t\t\t\t\treturn +1;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t});\n\t\t} else {\n\t\t\tselected_tools.splice(index, 1);\n\t\t}\n\t\tif (selected_tools.length > 0) {\n\t\t\tselected_tool = selected_tools[selected_tools.length - 1];\n\t\t} else {\n\t\t\tselected_tool = default_tool;\n\t\t\tselected_tools = [selected_tool];\n\t\t}\n\t} else {\n\t\tselected_tool = tool;\n\t\tselected_tools = [tool];\n\t}\n\n\tif (tool.preload) {\n\t\ttool.preload();\n\t}\n\n\t$toolbox.update_selected_tool();\n\t// $toolbox2.update_selected_tool();\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @returns {boolean} whether the canvas has any translucent pixels (with a stupid margin of error)\n */\nfunction has_any_transparency(ctx) {\n\t// @TODO Optimization: Assume JPEGs and some other file types are opaque.\n\t// Raster file formats that SUPPORT transparency include GIF, PNG, BMP and TIFF\n\t// (Yes, even BMPs support transparency!)\n\tconst id = ctx.getImageData(0, 0, main_canvas.width, main_canvas.height);\n\tfor (let i = 0, l = id.data.length; i < l; i += 4) {\n\t\t// I've seen firefox give [ 254, 254, 254, 254 ] for get_rgba_from_color(\"#fff\")\n\t\t// or other values\n\t\tif (id.data[i + 3] < 253) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @returns {MonochromeInfo}\n */\nfunction detect_monochrome(ctx) {\n\t// Note: Brave browser, and DuckDuckGo Privacy Essentials browser extension\n\t// implement a privacy technique known as \"farbling\", which breaks this code.\n\t// (I've implemented workarounds in many places, but not here yet.)\n\t// This function currently returns the set of one or two colors if applicable,\n\t// and things outside would need to be changed to handle a \"near-monochrome\" state.\n\n\tconst id = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);\n\tconst pixelArray = new Uint32Array(id.data.buffer); // to access as whole pixels (for greater efficiency & simplicity)\n\t// Note: values in pixelArray may be different on big endian vs little endian machines.\n\t// Use id.data, which is guaranteed to be in RGBA order, for getting color information.\n\t// Only use the Uint32Array for comparing pixel equality (faster than comparing each color component).\n\tconst colorUint32s = [];\n\tconst colorRGBAs = [];\n\tlet anyTransparency = false;\n\tfor (let i = 0, len = pixelArray.length; i < len; i += 1) {\n\t\t// @TODO: should this threshold not mirror has_any_transparency?\n\t\t// seems to have different notions of \"any transparency\"\n\t\t// has_any_transparency is \"has any pixels not fully opaque\"\n\t\t// detect_monochrome's anyTransparency means \"has any pixels fully transparent\"\n\t\tif (id.data[i * 4 + 3] > 1) {\n\t\t\tif (!colorUint32s.includes(pixelArray[i])) {\n\t\t\t\tif (colorUint32s.length < 2) {\n\t\t\t\t\tcolorUint32s.push(pixelArray[i]);\n\t\t\t\t\tcolorRGBAs.push(id.data.slice(i * 4, (i + 1) * 4));\n\t\t\t\t} else {\n\t\t\t\t\treturn { isMonochrome: false };\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tanyTransparency = true;\n\t\t}\n\t}\n\treturn {\n\t\tisMonochrome: true,\n\t\tpresentNonTransparentRGBAs: colorRGBAs,\n\t\tpresentNonTransparentUint32s: colorUint32s,\n\t\tmonochromeWithTransparency: anyTransparency,\n\t};\n}\n\n/**\n * Creates a dithered pattern using two colors.\n * @param {number} lightness - The approximate fraction of pixels that will use the second(?) color.\n * @param {Uint8ClampedArray | number[]} rgba1 - RGBA color values for the first color.\n * @param {Uint8ClampedArray | number[]} rgba2 - RGBA color values for the second color.\n * @returns {CanvasPattern}\n */\nfunction make_monochrome_pattern(lightness, rgba1 = [0, 0, 0, 255], rgba2 = [255, 255, 255, 255]) {\n\n\tconst dither_threshold_table = Array.from({ length: 64 }, (_undefined, p) => {\n\t\tconst q = p ^ (p >> 3);\n\t\treturn (\n\t\t\t((p & 4) >> 2) | ((q & 4) >> 1) |\n\t\t\t((p & 2) << 1) | ((q & 2) << 2) |\n\t\t\t((p & 1) << 4) | ((q & 1) << 5)\n\t\t) / 64;\n\t});\n\n\tconst pattern_canvas = document.createElement(\"canvas\");\n\tconst pattern_ctx = pattern_canvas.getContext(\"2d\");\n\n\tpattern_canvas.width = 8;\n\tpattern_canvas.height = 8;\n\n\tconst pattern_image_data = main_ctx.createImageData(pattern_canvas.width, pattern_canvas.height);\n\n\tfor (let x = 0; x < pattern_canvas.width; x += 1) {\n\t\tfor (let y = 0; y < pattern_canvas.height; y += 1) {\n\t\t\tconst map_value = dither_threshold_table[(x & 7) + ((y & 7) << 3)];\n\t\t\tconst px_white = lightness > map_value;\n\t\t\tconst index = ((y * pattern_image_data.width) + x) * 4;\n\t\t\tpattern_image_data.data[index + 0] = px_white ? rgba2[0] : rgba1[0];\n\t\t\tpattern_image_data.data[index + 1] = px_white ? rgba2[1] : rgba1[1];\n\t\t\tpattern_image_data.data[index + 2] = px_white ? rgba2[2] : rgba1[2];\n\t\t\tpattern_image_data.data[index + 3] = (px_white ? rgba2[3] : rgba1[3]) ?? 255; // handling also 3-length arrays (RGB)\n\t\t}\n\t}\n\n\tpattern_ctx.putImageData(pattern_image_data, 0, 0);\n\n\treturn main_ctx.createPattern(pattern_canvas, \"repeat\");\n}\n\n/**\n * @param {Uint8ClampedArray | number[]} rgba1\n * @param {Uint8ClampedArray | number[]} rgba2\n * @returns {CanvasPattern[]}\n */\nfunction make_monochrome_palette(rgba1 = [0, 0, 0, 255], rgba2 = [255, 255, 255, 255]) {\n\tconst palette = [];\n\tconst n_colors_per_row = 14;\n\tconst n_colors = n_colors_per_row * 2;\n\tfor (let i = 0; i < n_colors_per_row; i++) {\n\t\tlet lightness = i / n_colors;\n\t\tpalette.push(make_monochrome_pattern(lightness, rgba1, rgba2));\n\t}\n\tfor (let i = 0; i < n_colors_per_row; i++) {\n\t\tlet lightness = 1 - i / n_colors;\n\t\tpalette.push(make_monochrome_pattern(lightness, rgba1, rgba2));\n\t}\n\n\treturn palette;\n}\n\n/**\n * @param {boolean} reverse\n * @param {string[]} colors\n * @param {number=} stripe_size\n * @returns {CanvasPattern}\n */\nfunction make_stripe_pattern(reverse, colors, stripe_size = 4) {\n\tconst rgba_colors = colors.map(get_rgba_from_color);\n\n\tconst pattern_canvas = document.createElement(\"canvas\");\n\tconst pattern_ctx = pattern_canvas.getContext(\"2d\");\n\n\tpattern_canvas.width = colors.length * stripe_size;\n\tpattern_canvas.height = colors.length * stripe_size;\n\n\tconst pattern_image_data = main_ctx.createImageData(pattern_canvas.width, pattern_canvas.height);\n\n\tfor (let x = 0; x < pattern_canvas.width; x += 1) {\n\t\tfor (let y = 0; y < pattern_canvas.height; y += 1) {\n\t\t\tconst pixel_index = ((y * pattern_image_data.width) + x) * 4;\n\t\t\t// +1000 to avoid remainder on negative numbers\n\t\t\tconst pos = reverse ? (x - y) : (x + y);\n\t\t\tconst color_index = Math.floor((pos + 1000) / stripe_size) % colors.length;\n\t\t\tconst rgba = rgba_colors[color_index];\n\t\t\tpattern_image_data.data[pixel_index + 0] = rgba[0];\n\t\t\tpattern_image_data.data[pixel_index + 1] = rgba[1];\n\t\t\tpattern_image_data.data[pixel_index + 2] = rgba[2];\n\t\t\tpattern_image_data.data[pixel_index + 3] = rgba[3];\n\t\t}\n\t}\n\n\tpattern_ctx.putImageData(pattern_image_data, 0, 0);\n\n\treturn main_ctx.createPattern(pattern_canvas, \"repeat\");\n}\n\nfunction switch_to_polychrome_palette() {\n\n}\n\nfunction make_opaque() {\n\tundoable({\n\t\tname: \"Make Opaque\",\n\t\ticon: get_help_folder_icon(\"p_make_opaque.png\"),\n\t}, () => {\n\t\tmain_ctx.save();\n\t\tmain_ctx.globalCompositeOperation = \"destination-atop\";\n\n\t\tmain_ctx.fillStyle = selected_colors.background;\n\t\tmain_ctx.fillRect(0, 0, main_canvas.width, main_canvas.height);\n\n\t\t// in case the selected background color is transparent/translucent\n\t\tmain_ctx.fillStyle = \"white\";\n\t\tmain_ctx.fillRect(0, 0, main_canvas.width, main_canvas.height);\n\n\t\tmain_ctx.restore();\n\t});\n}\n\n/**\n * Resizes the canvas without saving the dimensions to local storage.\n *\n * @param {number} unclamped_width - The new width of the canvas. Will be clamped to a minimum of 1.\n * @param {number} unclamped_height - The new height of the canvas. Will be clamped to a minimum of 1.\n * @param {{name?: string, icon?: HTMLImageElement | HTMLCanvasElement}} [undoable_meta={}] - overrides certain properties of ActionMetadata\n */\nfunction resize_canvas_without_saving_dimensions(unclamped_width, unclamped_height, undoable_meta = {}) {\n\tconst new_width = Math.max(1, unclamped_width);\n\tconst new_height = Math.max(1, unclamped_height);\n\tif (main_canvas.width !== new_width || main_canvas.height !== new_height) {\n\t\tundoable({\n\t\t\tname: undoable_meta.name || \"Resize Canvas\",\n\t\t\ticon: undoable_meta.icon || get_help_folder_icon(\"p_stretch_both.png\"),\n\t\t}, () => {\n\t\t\ttry {\n\t\t\t\tconst image_data = main_ctx.getImageData(0, 0, new_width, new_height);\n\t\t\t\tmain_canvas.width = new_width;\n\t\t\t\tmain_canvas.height = new_height;\n\t\t\t\tmain_ctx.disable_image_smoothing();\n\n\t\t\t\tif (!transparency) {\n\t\t\t\t\tmain_ctx.fillStyle = selected_colors.background;\n\t\t\t\t\tmain_ctx.fillRect(0, 0, main_canvas.width, main_canvas.height);\n\t\t\t\t}\n\n\t\t\t\tconst temp_canvas = make_canvas(image_data);\n\t\t\t\tmain_ctx.drawImage(temp_canvas, 0, 0);\n\t\t\t} catch (exception) {\n\t\t\t\tif (exception.name === \"NS_ERROR_FAILURE\") {\n\t\t\t\t\t// or localize(\"There is not enough memory or resources to complete operation.\")\n\t\t\t\t\tshow_error_message(localize(\"Insufficient memory to perform operation.\"), exception);\n\t\t\t\t} else {\n\t\t\t\t\tshow_error_message(localize(\"An unknown error has occurred.\"), exception);\n\t\t\t\t}\n\t\t\t\t// @TODO: undo and clean up undoable\n\t\t\t\t// maybe even keep Attributes dialog open if that's what's triggering the resize\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$canvas_area.trigger(\"resize\");\n\t\t});\n\t}\n}\n\n/**\n * Resizes the canvas and saves the dimensions to local storage as the new default.\n *\n * @param {number} unclamped_width - The new width of the canvas. Will be clamped to a minimum of 1.\n * @param {number} unclamped_height - The new height of the canvas. Will be clamped to a minimum of 1.\n * @param {{name?: string, icon?: HTMLImageElement | HTMLCanvasElement}} [undoable_meta={}] - overrides certain properties of ActionMetadata\n */\nfunction resize_canvas_and_save_dimensions(unclamped_width, unclamped_height, undoable_meta = {}) {\n\tresize_canvas_without_saving_dimensions(unclamped_width, unclamped_height, undoable_meta);\n\tlocalStore.set({\n\t\twidth: main_canvas.width.toString(),\n\t\theight: main_canvas.height.toString(),\n\t}, (_error) => {\n\t\t// oh well\n\t});\n}\n\nfunction image_attributes() {\n\tif (image_attributes.$window) {\n\t\timage_attributes.$window.close();\n\t}\n\tconst $w = image_attributes.$window = $DialogWindow(localize(\"Attributes\"));\n\t$w.addClass(\"attributes-window\");\n\n\tconst $main = $w.$main;\n\n\t// Information\n\n\tconst table = {\n\t\t[localize(\"File last saved:\")]: localize(\"Not Available\"), // @TODO: make available?\n\t\t[localize(\"Size on disk:\")]: localize(\"Not Available\"), // @TODO: make available?\n\t\t[localize(\"Resolution:\")]: \"72 x 72 dots per inch\", // if localizing this, remove \"direction\" setting below\n\t};\n\tconst $table = $(E(\"table\")).appendTo($main);\n\tfor (const k in table) {\n\t\tconst $tr = $(E(\"tr\")).appendTo($table);\n\t\t$(E(\"td\")).appendTo($tr).text(k);\n\t\tconst $value = $(E(\"td\")).appendTo($tr).text(table[k]);\n\t\tif (table[k].indexOf(\"72\") !== -1) {\n\t\t\t$value.css(\"direction\", \"ltr\");\n\t\t}\n\t}\n\n\t// Dimensions\n\n\tconst unit_sizes_in_px = { px: 1, in: 72, cm: 28.3465 };\n\tlet current_unit = image_attributes.unit = image_attributes.unit || \"px\";\n\tlet width_in_px = main_canvas.width;\n\tlet height_in_px = main_canvas.height;\n\n\tconst $width_label = $(E(\"label\")).appendTo($main).html(render_access_key(localize(\"&Width:\")));\n\tconst $height_label = $(E(\"label\")).appendTo($main).html(render_access_key(localize(\"&Height:\")));\n\tconst $width = $(E(\"input\")).attr({ type: \"number\", min: 1, \"aria-keyshortcuts\": \"Alt+W W W\" }).addClass(\"no-spinner inset-deep\").appendTo($width_label);\n\tconst $height = $(E(\"input\")).attr({ type: \"number\", min: 1, \"aria-keyshortcuts\": \"Alt+H H H\" }).addClass(\"no-spinner inset-deep\").appendTo($height_label);\n\n\t$main.find(\"input\")\n\t\t.css({ width: \"40px\" })\n\t\t.on(\"change keyup keydown keypress pointerdown pointermove paste drop\", () => {\n\t\t\twidth_in_px = Number($width.val()) * unit_sizes_in_px[current_unit];\n\t\t\theight_in_px = Number($height.val()) * unit_sizes_in_px[current_unit];\n\t\t});\n\n\t// Fieldsets\n\n\tconst $units = $(E(\"fieldset\")).appendTo($main).append(`\n\t\t<legend>${localize(\"Units\")}</legend>\n\t\t<div class=\"fieldset-body\">\n\t\t\t<div class=\"radio-field\"><input type=\"radio\" name=\"units\" id=\"unit-in\" value=\"in\" aria-keyshortcuts=\"Alt+I I\"><label for=\"unit-in\">${render_access_key(localize(\"&Inches\"))}</label></div>\n\t\t\t<div class=\"radio-field\"><input type=\"radio\" name=\"units\" id=\"unit-cm\" value=\"cm\" aria-keyshortcuts=\"Alt+M M\"><label for=\"unit-cm\">${render_access_key(localize(\"C&m\"))}</label></div>\n\t\t\t<div class=\"radio-field\"><input type=\"radio\" name=\"units\" id=\"unit-px\" value=\"px\" aria-keyshortcuts=\"Alt+P P\"><label for=\"unit-px\">${render_access_key(localize(\"&Pixels\"))}</label></div>\n\t\t</div>\n\t`);\n\t$units.find(`[value=${current_unit}]`).attr({ checked: true });\n\t$units.on(\"change\", () => {\n\t\tconst new_unit = String($units.find(\":checked\").val());\n\t\t$width.val(width_in_px / unit_sizes_in_px[new_unit]);\n\t\t$height.val(height_in_px / unit_sizes_in_px[new_unit]);\n\t\tcurrent_unit = new_unit;\n\t}).triggerHandler(\"change\");\n\n\tconst $colors = $(E(\"fieldset\")).appendTo($main).append(`\n\t\t<legend>${localize(\"Colors\")}</legend>\n\t\t<div class=\"fieldset-body\">\n\t\t\t<div class=\"radio-field\"><input type=\"radio\" name=\"colors\" id=\"attribute-monochrome\" value=\"monochrome\" aria-keyshortcuts=\"Alt+B B\"><label for=\"attribute-monochrome\">${render_access_key(localize(\"&Black and white\"))}</label></div>\n\t\t\t<div class=\"radio-field\"><input type=\"radio\" name=\"colors\" id=\"attribute-polychrome\" value=\"polychrome\" aria-keyshortcuts=\"Alt+L L\"><label for=\"attribute-polychrome\">${render_access_key(localize(\"Co&lors\"))}</label></div>\n\t\t</div>\n\t`);\n\t$colors.find(`[value=${monochrome ? \"monochrome\" : \"polychrome\"}]`).attr({ checked: true });\n\n\tconst $transparency = $(E(\"fieldset\")).appendTo($main).append(`\n\t\t<legend>${localize(\"Transparency\")}</legend>\n\t\t<div class=\"fieldset-body\">\n\t\t\t<div class=\"radio-field\"><input type=\"radio\" name=\"transparency\" id=\"attribute-transparent\" value=\"transparent\"><label for=\"attribute-transparent\">${localize(\"Transparent\")}</label></div>\n\t\t\t<div class=\"radio-field\"><input type=\"radio\" name=\"transparency\" id=\"attribute-opaque\" value=\"opaque\"><label for=\"attribute-opaque\">${localize(\"Opaque\")}</label></div>\n\t\t</div>\n\t`);\n\t$transparency.find(`[value=${transparency ? \"transparent\" : \"opaque\"}]`).attr({ checked: true });\n\n\t// Buttons on the right\n\n\t$w.$Button(localize(\"OK\"), () => {\n\t\tconst transparency_option = $transparency.find(\":checked\").val();\n\t\tconst colors_option = $colors.find(\":checked\").val();\n\t\tconst unit = String($units.find(\":checked\").val());\n\n\t\tconst was_monochrome = monochrome;\n\t\tlet monochrome_info;\n\n\t\timage_attributes.unit = unit;\n\t\ttransparency = (transparency_option == \"transparent\");\n\t\tmonochrome = (colors_option == \"monochrome\");\n\n\t\tif (monochrome != was_monochrome) {\n\t\t\tif (selection) {\n\t\t\t\t// want to detect monochrome based on selection + canvas\n\t\t\t\t// simplest way to do that is to meld them together\n\t\t\t\tmeld_selection_into_canvas();\n\t\t\t}\n\t\t\tmonochrome_info = detect_monochrome(main_ctx);\n\n\t\t\tif (monochrome) {\n\t\t\t\tif (monochrome_info.isMonochrome && monochrome_info.presentNonTransparentRGBAs.length === 2) {\n\t\t\t\t\tpalette = make_monochrome_palette(...monochrome_info.presentNonTransparentRGBAs);\n\t\t\t\t} else {\n\t\t\t\t\tpalette = monochrome_palette;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpalette = polychrome_palette;\n\t\t\t}\n\t\t\tselected_colors.foreground = palette[0];\n\t\t\tselected_colors.background = palette[14]; // first in second row\n\t\t\tselected_colors.ternary = \"\";\n\t\t\t$colorbox.rebuild_palette();\n\t\t\t$G.trigger(\"option-changed\");\n\t\t}\n\n\t\tconst unit_to_px = unit_sizes_in_px[unit];\n\t\tconst width = Number($width.val()) * unit_to_px;\n\t\tconst height = Number($height.val()) * unit_to_px;\n\t\tresize_canvas_and_save_dimensions(~~width, ~~height);\n\n\t\tif (!transparency && has_any_transparency(main_ctx)) {\n\t\t\tmake_opaque();\n\t\t}\n\n\t\t// 1. Must be after canvas resize to avoid weird undoable interaction and such.\n\t\t// 2. Check that monochrome option changed, same as above.\n\t\t//   a) for monochrome_info variable to be available\n\t\t//   b) Consider the case where color is introduced to the canvas while in monochrome mode.\n\t\t//      We only want to show this dialog if it would also change the palette (above), never leave you on an outdated palette.\n\t\t//   c) And it's nice to be able to change other options without worrying about it trying to convert the document to monochrome.\n\t\tif (monochrome != was_monochrome) {\n\t\t\tif (monochrome && !monochrome_info.isMonochrome) {\n\t\t\t\tshow_convert_to_black_and_white();\n\t\t\t}\n\t\t}\n\n\t\timage_attributes.$window.close();\n\t}, { type: \"submit\" });\n\n\t$w.$Button(localize(\"Cancel\"), () => {\n\t\timage_attributes.$window.close();\n\t});\n\n\t// Parsing HTML with jQuery; $Button takes text (not HTML) or Node/DocumentFragment\n\t$w.$Button($.parseHTML(render_access_key(localize(\"&Default\")))[0], () => {\n\t\twidth_in_px = default_canvas_width;\n\t\theight_in_px = default_canvas_height;\n\t\t$width.val(width_in_px / unit_sizes_in_px[current_unit]);\n\t\t$height.val(height_in_px / unit_sizes_in_px[current_unit]);\n\t}).attr(\"aria-keyshortcuts\", \"Alt+D D\");\n\n\thandle_keyshortcuts($w);\n\n\t// Default focus\n\n\t$width.select();\n\n\t// Reposition the window\n\n\timage_attributes.$window.center();\n}\n\n// TODO: maybe don't tack properties onto functions so much!?\n/**\n * @memberof image_attributes\n * @type {OSGUI$Window}\n */\nimage_attributes.$window = null;\n/**\n * @memberof image_attributes\n * @type {string}\n */\nimage_attributes.unit = \"px\";\n\nfunction show_convert_to_black_and_white() {\n\tconst $w = $DialogWindow(\"Convert to Black and White\");\n\t$w.addClass(\"convert-to-black-and-white\");\n\t$w.$main.append(\"<fieldset><legend>Threshold:</legend><input type='range' min='0' max='1' step='0.01' value='0.5'></fieldset>\");\n\tconst $slider = $w.$main.find(\"input[type='range']\");\n\tconst original_canvas = make_canvas(main_canvas);\n\tlet threshold;\n\tconst update_threshold = () => {\n\t\tmake_or_update_undoable({\n\t\t\tname: \"Make Monochrome\",\n\t\t\tmatch: (history_node) => history_node.name === \"Make Monochrome\",\n\t\t\ticon: get_help_folder_icon(\"p_monochrome.png\"),\n\t\t}, () => {\n\t\t\tthreshold = Number($slider.val());\n\t\t\tmain_ctx.copy(original_canvas);\n\t\t\tthreshold_black_and_white(main_ctx, threshold);\n\t\t});\n\t};\n\tupdate_threshold();\n\tconst update_threshold_soon = debounce(update_threshold, 100);\n\t$slider.on(\"input\", update_threshold_soon);\n\n\t$w.$Button(localize(\"OK\"), () => {\n\t\t$w.close();\n\t}, { type: \"submit\" }).focus();\n\t$w.$Button(localize(\"Cancel\"), () => {\n\t\tif (current_history_node.name === \"Make Monochrome\") {\n\t\t\tundo();\n\t\t} else {\n\t\t\tundoable({\n\t\t\t\tname: \"Cancel Make Monochrome\",\n\t\t\t\ticon: get_help_folder_icon(\"p_color.png\"),\n\t\t\t}, () => {\n\t\t\t\tmain_ctx.copy(original_canvas);\n\t\t\t});\n\t\t}\n\t\t$w.close();\n\t});\n\t$w.center();\n}\n\nfunction image_flip_and_rotate() {\n\tconst $w = $DialogWindow(localize(\"Flip and Rotate\"));\n\t$w.addClass(\"flip-and-rotate\");\n\n\tconst $fieldset = $(E(\"fieldset\")).appendTo($w.$main);\n\t$fieldset.append(`\n\t\t<legend>${localize(\"Flip or rotate\")}</legend>\n\t\t<div class=\"radio-wrapper\">\n\t\t\t<input\n\t\t\t\ttype=\"radio\"\n\t\t\t\tname=\"flip-or-rotate\"\n\t\t\t\tid=\"flip-horizontal\"\n\t\t\t\tvalue=\"flip-horizontal\"\n\t\t\t\taria-keyshortcuts=\"Alt+F\"\n\t\t\t\tchecked\n\t\t\t/><label for=\"flip-horizontal\">${render_access_key(localize(\"&Flip horizontal\"))}</label>\n\t\t</div>\n\t\t<div class=\"radio-wrapper\">\n\t\t\t<input\n\t\t\t\ttype=\"radio\"\n\t\t\t\tname=\"flip-or-rotate\"\n\t\t\t\tid=\"flip-vertical\"\n\t\t\t\tvalue=\"flip-vertical\"\n\t\t\t\taria-keyshortcuts=\"Alt+V\"\n\t\t\t/><label for=\"flip-vertical\">${render_access_key(localize(\"Flip &vertical\"))}</label>\n\t\t</div>\n\t\t<div class=\"radio-wrapper\">\n\t\t\t<input\n\t\t\t\ttype=\"radio\"\n\t\t\t\tname=\"flip-or-rotate\"\n\t\t\t\tid=\"rotate-by-angle\"\n\t\t\t\tvalue=\"rotate-by-angle\"\n\t\t\t\taria-keyshortcuts=\"Alt+R\"\n\t\t\t/><label for=\"rotate-by-angle\">${render_access_key(localize(\"&Rotate by angle\"))}</label>\n\t\t</div>\n\t`);\n\n\tconst $rotate_by_angle = $(E(\"div\")).appendTo($fieldset);\n\t$rotate_by_angle.addClass(\"sub-options\");\n\tfor (const label_with_hotkey of [\n\t\t\"&90°\",\n\t\t\"&180°\",\n\t\t\"&270°\",\n\t]) {\n\t\tconst degrees = parseInt(AccessKeys.toText(label_with_hotkey), 10);\n\t\t$rotate_by_angle.append(`\n\t\t\t<div class=\"radio-wrapper\">\n\t\t\t\t<input\n\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\tname=\"rotate-by-angle\"\n\t\t\t\t\tvalue=\"${degrees}\"\n\t\t\t\t\tid=\"rotate-${degrees}\"\n\t\t\t\t\taria-keyshortcuts=\"Alt+${AccessKeys.get(label_with_hotkey).toUpperCase()}\"\n\t\t\t\t/><label\n\t\t\t\t\tfor=\"rotate-${degrees}\"\n\t\t\t\t>${render_access_key(label_with_hotkey)}</label>\n\t\t\t</div>\n\t\t`);\n\t}\n\t$rotate_by_angle.append(`\n\t\t<div class=\"radio-wrapper\">\n\t\t\t<input\n\t\t\t\ttype=\"radio\"\n\t\t\t\tname=\"rotate-by-angle\"\n\t\t\t\tvalue=\"arbitrary\"\n\t\t\t/><input\n\t\t\t\ttype=\"number\"\n\t\t\t\tmin=\"-360\"\n\t\t\t\tmax=\"360\"\n\t\t\t\tname=\"rotate-by-arbitrary-angle\"\n\t\t\t\tid=\"custom-degrees\"\n\t\t\t\tvalue=\"\"\n\t\t\t\tclass=\"no-spinner inset-deep\"\n\t\t\t\tstyle=\"width: 50px\"\n\t\t\t/>\n\t\t\t<label for=\"custom-degrees\">${localize(\"Degrees\")}</label>\n\t\t</div>\n\t`);\n\t$rotate_by_angle.find(\"#rotate-90\").attr({ checked: true });\n\t// Disabling inputs makes them not even receive mouse events,\n\t// and so pointer-events: none is needed to respond to events on the parent.\n\t$rotate_by_angle.find(\"input\").attr({ disabled: true });\n\t$fieldset.find(\"input\").on(\"change\", () => {\n\t\tconst action = $fieldset.find(\"input[name='flip-or-rotate']:checked\").val();\n\t\t$rotate_by_angle.find(\"input\").attr({\n\t\t\tdisabled: action !== \"rotate-by-angle\",\n\t\t});\n\t});\n\t$rotate_by_angle.find(\".radio-wrapper\").on(\"click\", (e) => {\n\t\t// Select \"Rotate by angle\" and enable subfields\n\t\t$fieldset.find(\"input[value='rotate-by-angle']\").prop(\"checked\", true);\n\t\t$fieldset.find(\"input\").triggerHandler(\"change\");\n\n\t\tconst $wrapper = $(e.target).closest(\".radio-wrapper\");\n\t\t// Focus the numerical input if this field has one\n\t\tconst num_input = $wrapper.find(\"input[type='number']\")[0];\n\t\tif (num_input) {\n\t\t\tnum_input.focus();\n\t\t}\n\t\t// Select the radio for this field\n\t\t$wrapper.find(\"input[type='radio']\").prop(\"checked\", true);\n\t});\n\n\t$fieldset.find(\"input[name='rotate-by-arbitrary-angle']\").on(\"input\", () => {\n\t\t$fieldset.find(\"input[value='rotate-by-angle']\").prop(\"checked\", true);\n\t\t$fieldset.find(\"input[value='arbitrary']\").prop(\"checked\", true);\n\t});\n\n\t$w.$Button(localize(\"OK\"), () => {\n\t\tconst action = $fieldset.find(\"input[name='flip-or-rotate']:checked\").val();\n\t\tswitch (action) {\n\t\t\tcase \"flip-horizontal\":\n\t\t\t\tflip_horizontal();\n\t\t\t\tbreak;\n\t\t\tcase \"flip-vertical\":\n\t\t\t\tflip_vertical();\n\t\t\t\tbreak;\n\t\t\tcase \"rotate-by-angle\": {\n\t\t\t\tlet angle_val = $fieldset.find(\"input[name='rotate-by-angle']:checked\").val();\n\t\t\t\tif (angle_val === \"arbitrary\") {\n\t\t\t\t\tangle_val = $fieldset.find(\"input[name='rotate-by-arbitrary-angle']\").val();\n\t\t\t\t}\n\t\t\t\tconst angle_deg = Number(angle_val);\n\t\t\t\tconst angle = angle_deg / 360 * TAU;\n\n\t\t\t\tif (isNaN(angle)) {\n\t\t\t\t\tplease_enter_a_number();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\trotate(angle);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t$w.close();\n\t}, { type: \"submit\" });\n\t$w.$Button(localize(\"Cancel\"), () => {\n\t\t$w.close();\n\t});\n\n\t$fieldset.find(\"input[type='radio']\").first().focus();\n\n\t$w.center();\n\n\thandle_keyshortcuts($w);\n}\n\nfunction image_stretch_and_skew() {\n\tconst $w = $DialogWindow(localize(\"Stretch and Skew\"));\n\t$w.addClass(\"stretch-and-skew\");\n\n\tconst $fieldset_stretch = $(E(\"fieldset\")).appendTo($w.$main);\n\t$fieldset_stretch.append(`<legend>${localize(\"Stretch\")}</legend><table></table>`);\n\tconst $fieldset_skew = $(E(\"fieldset\")).appendTo($w.$main);\n\t$fieldset_skew.append(`<legend>${localize(\"Skew\")}</legend><table></table>`);\n\n\tconst $RowInput = ($table, img_src, label_with_hotkey, default_value, label_unit, min, max) => {\n\t\tconst $tr = $(E(\"tr\")).appendTo($table);\n\t\tconst $img = $(E(\"img\")).attr({\n\t\t\tsrc: `images/transforms/${img_src}.png`,\n\t\t\twidth: 32,\n\t\t\theight: 32,\n\t\t}).css({\n\t\t\tmarginRight: \"20px\",\n\t\t});\n\t\tconst input_id = (\"input\" + Math.random() + Math.random()).replace(/\\./, \"\");\n\t\tconst $input = $(E(\"input\")).attr({\n\t\t\ttype: \"number\",\n\t\t\tmin,\n\t\t\tmax,\n\t\t\tvalue: default_value,\n\t\t\tid: input_id,\n\t\t\t\"aria-keyshortcuts\": `Alt+${AccessKeys.get(label_with_hotkey).toUpperCase()}`,\n\t\t}).css({\n\t\t\twidth: \"40px\",\n\t\t}).addClass(\"no-spinner inset-deep\");\n\t\t$(E(\"td\")).appendTo($tr).append($img);\n\t\t$(E(\"td\")).appendTo($tr).append($(E(\"label\")).html(render_access_key(label_with_hotkey)).attr(\"for\", input_id));\n\t\t$(E(\"td\")).appendTo($tr).append($input);\n\t\t$(E(\"td\")).appendTo($tr).text(label_unit);\n\n\t\treturn $input;\n\t};\n\n\tconst stretch_x = $RowInput($fieldset_stretch.find(\"table\"), \"stretch-x\", localize(\"&Horizontal:\"), 100, \"%\", 1, 5000);\n\tconst stretch_y = $RowInput($fieldset_stretch.find(\"table\"), \"stretch-y\", localize(\"&Vertical:\"), 100, \"%\", 1, 5000);\n\tconst skew_x = $RowInput($fieldset_skew.find(\"table\"), \"skew-x\", localize(\"H&orizontal:\"), 0, localize(\"Degrees\"), -90, 90);\n\tconst skew_y = $RowInput($fieldset_skew.find(\"table\"), \"skew-y\", localize(\"V&ertical:\"), 0, localize(\"Degrees\"), -90, 90);\n\n\t$w.$Button(localize(\"OK\"), () => {\n\t\tconst x_scale = parseFloat(stretch_x.val()) / 100;\n\t\tconst y_scale = parseFloat(stretch_y.val()) / 100;\n\t\tconst h_skew = parseFloat(skew_x.val()) / 360 * TAU;\n\t\tconst v_skew = parseFloat(skew_y.val()) / 360 * TAU;\n\t\tif (isNaN(x_scale) || isNaN(y_scale) || isNaN(h_skew) || isNaN(v_skew)) {\n\t\t\tplease_enter_a_number();\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tstretch_and_skew(x_scale, y_scale, h_skew, v_skew);\n\t\t} catch (exception) {\n\t\t\tif (exception.name === \"NS_ERROR_FAILURE\") {\n\t\t\t\t// or localize(\"There is not enough memory or resources to complete operation.\")\n\t\t\t\tshow_error_message(localize(\"Insufficient memory to perform operation.\"), exception);\n\t\t\t} else {\n\t\t\t\tshow_error_message(localize(\"An unknown error has occurred.\"), exception);\n\t\t\t}\n\t\t\t// @TODO: undo and clean up undoable\n\t\t\treturn;\n\t\t}\n\t\t$w.close();\n\t}, { type: \"submit\" });\n\n\t$w.$Button(localize(\"Cancel\"), () => {\n\t\t$w.close();\n\t});\n\n\t$w.$main.find(\"input\").first().focus().select();\n\n\t$w.center();\n\n\thandle_keyshortcuts($w);\n}\n\n/**\n * @param {JQuery<HTMLElement>} $container\n */\nfunction handle_keyshortcuts($container) {\n\t// This function implements shortcuts defined with aria-keyshortcuts.\n\t// It also modifies aria-keyshortcuts to remove shortcuts that don't\n\t// contain a modifier (other than shift) when an input field is focused,\n\t// in order to avoid conflicts with typing.\n\t// It stores the original aria-keyshortcuts (indefinitely), so if aria-keyshortcuts\n\t// is ever to be modified at runtime (externally), the code here may need to be changed.\n\n\t$container.on(\"keydown\", (event) => {\n\t\tconst $targets = $container.find(\"[aria-keyshortcuts]\");\n\t\tfor (let shortcut_target of $targets) {\n\t\t\tconst shortcuts = $(shortcut_target).attr(\"aria-keyshortcuts\").split(\" \");\n\t\t\tfor (const shortcut of shortcuts) {\n\t\t\t\t// TODO: should we use code instead of key? need examples\n\t\t\t\tif (\n\t\t\t\t\t!!shortcut.match(/Alt\\+/i) === event.altKey &&\n\t\t\t\t\t!!shortcut.match(/Ctrl\\+/i) === event.ctrlKey &&\n\t\t\t\t\t!!shortcut.match(/Meta\\+/i) === event.metaKey &&\n\t\t\t\t\t!!shortcut.match(/Shift\\+/i) === event.shiftKey &&\n\t\t\t\t\tshortcut.split(\"+\").pop().toUpperCase() === event.key.toUpperCase()\n\t\t\t\t) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tif (shortcut_target.disabled) {\n\t\t\t\t\t\tshortcut_target = shortcut_target.closest(\".radio-wrapper\");\n\t\t\t\t\t}\n\t\t\t\t\tshortcut_target.click();\n\t\t\t\t\tshortcut_target.focus();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\t// Prevent keyboard shortcuts from interfering with typing in text fields.\n\t// Rather than conditionally handling the shortcut, I'm conditionally removing it,\n\t// because _theoretically_ it's better for assistive technology to know that the shortcut isn't available.\n\t// (Theoretically I should also remove aria-keyshortcuts when the window isn't focused...)\n\t$container.on(\"focusin focusout\", (event) => {\n\t\tif ($(event.target).is('textarea, input:not([type=\"checkbox\"]):not([type=\"radio\"]):not([type=\"button\"]):not([type=\"submit\"]):not([type=\"reset\"]):not([type=\"image\"]):not([type=\"file\"]):not([type=\"color\"]):not([type=\"range\"])')) {\n\t\t\tfor (const control of $container.find(\"[aria-keyshortcuts]\")) {\n\t\t\t\t// @ts-ignore (could use a Map but that would be a little more complicated)\n\t\t\t\tcontrol._original_aria_keyshortcuts = control._original_aria_keyshortcuts ?? control.getAttribute(\"aria-keyshortcuts\");\n\t\t\t\t// Remove shortcuts without modifiers.\n\t\t\t\tcontrol.setAttribute(\"aria-keyshortcuts\",\n\t\t\t\t\tcontrol.getAttribute(\"aria-keyshortcuts\")\n\t\t\t\t\t\t.split(\" \")\n\t\t\t\t\t\t.filter((shortcut) => shortcut.match(/(Alt|Ctrl|Meta)\\+/i))\n\t\t\t\t\t\t.join(\" \")\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\t// Restore shortcuts.\n\t\t\tfor (const control of $container.find(\"[aria-keyshortcuts]\")) {\n\t\t\t\t// @ts-ignore\n\t\t\t\tif (control._original_aria_keyshortcuts) {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tcontrol.setAttribute(\"aria-keyshortcuts\", control._original_aria_keyshortcuts);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n}\n\n/**\n * Displays a save prompt dialog with options to specify the file name and format.\n *\n * @param {Object} options\n * @param {string} [options.dialogTitle=\"Save As\"] - The title of the dialog.\n * @param {string} [options.defaultFileName=\"\"] - The default file name.\n * @param {string} [options.defaultFileFormatID] - The file format to select by default.\n * @param {FileFormat[]} options.formats - The file formats available in the dropdown.\n * @param {boolean} [options.promptForName=true] - Whether to prompt for the file name, or just the format.\n *\n * @returns {Promise<{newFileName: string, newFileFormatID: string}>} - A promise that resolves with the new file name and format ID.\n */\nfunction save_as_prompt({\n\tdialogTitle = localize(\"Save As\"),\n\tdefaultFileName = \"\",\n\tdefaultFileFormatID,\n\tformats,\n\tpromptForName = true,\n}) {\n\treturn new Promise((resolve) => {\n\t\tconst $w = $DialogWindow(dialogTitle);\n\t\t$w.addClass(\"save-as\");\n\n\t\t// This is needed to prevent the keyboard from closing when you tap the file name input! in FF mobile\n\t\t// @TODO: Investigate this in os-gui.js; is it literally just the browser default behavior to focus a div with tabindex that's the parent of an input?\n\t\t// That'd be crazy, right?\n\t\t$w.$content.attr(\"tabIndex\", null);\n\n\t\t// @TODO: hotkeys (N, T, S, Enter, Esc)\n\t\tif (promptForName) {\n\t\t\t$w.$main.append(`\n\t\t\t\t<label>\n\t\t\t\t\tFile name:\n\t\t\t\t\t<input type=\"text\" class=\"file-name inset-deep\"/>\n\t\t\t\t</label>\n\t\t\t`);\n\t\t}\n\t\t$w.$main.append(`\n\t\t\t<label>\n\t\t\t\tSave as type:\n\t\t\t\t<select class=\"file-type-select inset-deep\"></select>\n\t\t\t</label>\n\t\t`);\n\t\tconst $file_type = $w.$main.find(\".file-type-select\");\n\t\tconst $file_name = $w.$main.find(\".file-name\");\n\n\t\tfor (const format of formats) {\n\t\t\t$file_type.append($(\"<option>\").val(format.formatID).text(format.nameWithExtensions));\n\t\t}\n\n\t\tif (promptForName) {\n\t\t\t$file_name.val(defaultFileName);\n\t\t}\n\n\t\tconst get_selected_format = () => {\n\t\t\tconst selected_format_id = $file_type.val();\n\t\t\tfor (const format of formats) {\n\t\t\t\tif (format.formatID === selected_format_id) {\n\t\t\t\t\treturn format;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Select file type when typing file name\n\t\tconst select_file_type_from_file_name = () => {\n\t\t\tconst extension_match = (promptForName ? String($file_name.val()) : defaultFileName).match(/\\.([\\w\\d]+)$/);\n\t\t\tif (extension_match) {\n\t\t\t\tconst selected_format = get_selected_format();\n\t\t\t\tconst matched_ext = extension_match[1].toLowerCase();\n\t\t\t\tif (selected_format && selected_format.extensions.includes(matched_ext)) {\n\t\t\t\t\t// File extension already matches selected file type.\n\t\t\t\t\t// Don't select a different file type with the same extension.\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfor (const format of formats) {\n\t\t\t\t\tif (format.extensions.includes(matched_ext)) {\n\t\t\t\t\t\t$file_type.val(format.formatID);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tif (promptForName) {\n\t\t\t$file_name.on(\"input\", select_file_type_from_file_name);\n\t\t}\n\t\tif (defaultFileFormatID && formats.some((format) => format.formatID === defaultFileFormatID)) {\n\t\t\t$file_type.val(defaultFileFormatID);\n\t\t} else {\n\t\t\tselect_file_type_from_file_name();\n\t\t}\n\n\t\t// Change file extension when selecting file type\n\t\t// allowing non-default extension like .dib vs .bmp, .jpg vs .jpeg to stay\n\t\tconst update_extension_from_file_type = (add_extension_if_absent) => {\n\t\t\tif (!promptForName) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet file_name = /** @type {string} */($file_name.val());\n\t\t\tconst selected_format = get_selected_format();\n\t\t\tif (!selected_format) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst extensions_for_type = selected_format.extensions;\n\t\t\tconst primary_extension_for_type = extensions_for_type[0];\n\t\t\t// This way of removing the file extension doesn't scale very well! But I don't want to delete text the user wanted like in case of a version number...\n\t\t\tconst without_extension = file_name.replace(/\\.(\\w{1,3}|apng|jpeg|jfif|tiff|webp|psppalette|sketchpalette|gimp|colors|scss|sass|less|styl|html|theme|themepack)$/i, \"\");\n\t\t\tconst extension_present = without_extension !== file_name;\n\t\t\tconst extension = file_name.slice(without_extension.length + 1).toLowerCase(); // without dot\n\t\t\tif (\n\t\t\t\t(add_extension_if_absent || extension_present) &&\n\t\t\t\textensions_for_type.indexOf(extension) === -1\n\t\t\t) {\n\t\t\t\tfile_name = `${without_extension}.${primary_extension_for_type}`;\n\t\t\t\t$file_name.val(file_name);\n\t\t\t}\n\t\t};\n\t\t$file_type.on(\"change\", () => {\n\t\t\tupdate_extension_from_file_type(false);\n\t\t});\n\t\t// and initially\n\t\tupdate_extension_from_file_type(false);\n\n\t\tconst $save = $w.$Button(localize(\"Save\"), () => {\n\t\t\t$w.close();\n\t\t\tupdate_extension_from_file_type(true);\n\t\t\tresolve({\n\t\t\t\tnewFileName: promptForName ? String($file_name.val()) : defaultFileName,\n\t\t\t\tnewFileFormatID: String($file_type.val()),\n\t\t\t});\n\t\t}, { type: \"submit\" });\n\t\t$w.$Button(localize(\"Cancel\"), () => {\n\t\t\t$w.close();\n\t\t});\n\n\t\t$w.center();\n\t\t// For mobile devices with on-screen keyboards, move the window to the top\n\t\tif (window.innerWidth < 500 || window.innerHeight < 700) {\n\t\t\t$w.css({ top: 20 });\n\t\t}\n\n\t\tif (promptForName) {\n\t\t\t$file_name.focus().select();\n\t\t} else {\n\t\t\t// $file_type.focus(); // most of the time you don't want to change the type from PNG\n\t\t\t$save.focus();\n\t\t}\n\t});\n}\n\n/**\n * Writes an image file to a blob, in the given format.\n * @param {HTMLCanvasElement} canvas - The canvas to export as an image file. Must have a 2d context.\n * @param {string} mime_type - The MIME type of the image file.\n * @param {(Blob)=> void} blob_callback - This function is called with the blob, or may never be called if there is an error.\n */\nfunction write_image_file(canvas, mime_type, blob_callback) {\n\tconst ctx = canvas.getContext(\"2d\");\n\tconst bmp_match = mime_type.match(/^image\\/(?:x-)?bmp\\s*(?:-(\\d+)bpp)?/);\n\tif (bmp_match) {\n\t\tconst file_content = encodeBMP(ctx.getImageData(0, 0, canvas.width, canvas.height), parseInt(bmp_match[1] || \"24\", 10));\n\t\tconst blob = new Blob([file_content]);\n\t\tsanity_check_blob(blob, () => {\n\t\t\tblob_callback(blob);\n\t\t});\n\t} else if (mime_type === \"image/png\") {\n\t\t// UPNG.js gives better compressed PNGs than the built-in browser PNG encoder\n\t\t// In fact you can use it as a minifier! http://upng.photopea.com/\n\t\tconst image_data = ctx.getImageData(0, 0, canvas.width, canvas.height);\n\t\tconst array_buffer = UPNG.encode([image_data.data.buffer], image_data.width, image_data.height);\n\t\tconst blob = new Blob([array_buffer]);\n\t\tsanity_check_blob(blob, () => {\n\t\t\tblob_callback(blob);\n\t\t});\n\t} else if (mime_type === \"image/tiff\") {\n\t\tconst image_data = ctx.getImageData(0, 0, canvas.width, canvas.height);\n\t\tconst metadata = {\n\t\t\tt305: [\"jspaint (UTIF.js)\"],\n\t\t};\n\t\tconst array_buffer = UTIF.encodeImage(image_data.data.buffer, image_data.width, image_data.height, metadata);\n\t\tconst blob = new Blob([array_buffer]);\n\t\tsanity_check_blob(blob, () => {\n\t\t\tblob_callback(blob);\n\t\t});\n\t} else {\n\t\tcanvas.toBlob((blob) => {\n\t\t\t// Note: could check blob.type (mime type) instead\n\t\t\tconst png_magic_bytes = [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A];\n\t\t\tsanity_check_blob(blob, () => {\n\t\t\t\tblob_callback(blob);\n\t\t\t}, png_magic_bytes, mime_type === \"image/png\");\n\t\t}, mime_type);\n\t}\n}\n\n/**\n * @param {Blob} blob\n * @param {(error: Error|null, result?: ImageInfo) => void} callback\n */\nfunction read_image_file(blob, callback) {\n\t// @TODO: handle SVG (might need to keep track of source URL, for relative resources)\n\t// @TODO: read palette from GIF files\n\n\tlet file_format;\n\tlet palette;\n\tlet monochrome = false;\n\n\tblob.arrayBuffer().then((arrayBuffer) => {\n\t\t// Helpers:\n\t\t// \"GIF\".split(\"\").map(c=>\"0x\"+c.charCodeAt(0).toString(\"16\")).join(\", \")\n\t\t// [0x47, 0x49, 0x46].map(c=>String.fromCharCode(c)).join(\"\")\n\t\tconst magics = {\n\t\t\tpng: [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A],\n\t\t\tbmp: [0x42, 0x4D], // \"BM\" in ASCII\n\t\t\tjpeg: [0xFF, 0xD8, 0xFF],\n\t\t\tgif: [0x47, 0x49, 0x46, 0x38], // \"GIF8\" in ASCII, fully either \"GIF87a\" or \"GIF89a\"\n\t\t\twebp: [0x57, 0x45, 0x42, 0x50], // \"WEBP\" in ASCII\n\t\t\ttiff_be: [0x4D, 0x4D, 0x0, 0x2A],\n\t\t\ttiff_le: [0x49, 0x49, 0x2A, 0x0],\n\t\t\tico: [0x00, 0x00, 0x01, 0x00],\n\t\t\tcur: [0x00, 0x00, 0x02, 0x00],\n\t\t\ticns: [0x69, 0x63, 0x6e, 0x73], // \"icns\" in ASCII\n\t\t};\n\t\tconst file_bytes = new Uint8Array(arrayBuffer);\n\t\tlet detected_type_id;\n\t\tfor (const [type_id, magic_bytes] of Object.entries(magics)) {\n\t\t\tconst magic_found = magic_bytes.every((byte, index) => byte === file_bytes[index]);\n\t\t\tif (magic_found) {\n\t\t\t\tdetected_type_id = type_id;\n\t\t\t}\n\t\t}\n\t\tif (!detected_type_id) {\n\t\t\tif (String.fromCharCode(...file_bytes.slice(0, 1024)).includes(\"%PDF\")) {\n\t\t\t\tdetected_type_id = \"pdf\";\n\t\t\t}\n\t\t}\n\t\tif (detected_type_id === \"bmp\") {\n\t\t\tconst { colorTable, bitsPerPixel, imageData } = decodeBMP(arrayBuffer);\n\t\t\tfile_format = bitsPerPixel === 24 ? \"image/bmp\" : `image/bmp;bpp=${bitsPerPixel}`;\n\t\t\tif (colorTable.length >= 2) {\n\t\t\t\tif (colorTable.length === 2) {\n\t\t\t\t\tpalette = make_monochrome_palette(...colorTable.map((color) => [color.r, color.g, color.b, 255]));\n\t\t\t\t\tmonochrome = true;\n\t\t\t\t} else {\n\t\t\t\t\tpalette = colorTable.map((color) => `rgb(${color.r}, ${color.g}, ${color.b})`);\n\t\t\t\t\tmonochrome = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// if (bitsPerPixel !== 32 && bitsPerPixel !== 16) {\n\t\t\t// \tfor (let i = 3; i < imageData.data.length; i += 4) {\n\t\t\t// \t\timageData.data[i] = 255;\n\t\t\t// \t}\n\t\t\t// }\n\t\t\tcallback(null, { file_format, monochrome, palette, image_data: imageData, source_blob: blob });\n\t\t} else if (detected_type_id === \"png\") {\n\t\t\tconst decoded = UPNG.decode(arrayBuffer);\n\t\t\tconst rgba = UPNG.toRGBA8(decoded)[0];\n\t\t\tconst { width, height, tabs, ctype } = decoded;\n\t\t\t// If it's a palettized PNG, load the palette for the Colors box.\n\t\t\t// Note: PLTE (palette) chunk must be present for palettized PNGs,\n\t\t\t// but can also be present as a recommended set of colors in true-color mode.\n\t\t\t// tRNs (transparency) chunk can provide alpha data associated with each color in the PLTE chunk.\n\t\t\t// It may contain as many transparency entries as there are palette entries, or as few as one.\n\t\t\t// tRNS chunk can also be used to specify a single color to be considered fully transparent in true-color mode.\n\t\t\tif (tabs.PLTE && tabs.PLTE.length >= 3 * 2 && ctype === 3 /* palettized */) {\n\t\t\t\tif (tabs.PLTE.length === 3 * 2) {\n\t\t\t\t\tpalette = make_monochrome_palette(\n\t\t\t\t\t\t[...tabs.PLTE.slice(0, 3), tabs.tRNS?.[0] ?? 255],\n\t\t\t\t\t\t[...tabs.PLTE.slice(3, 6), tabs.tRNS?.[1] ?? 255]\n\t\t\t\t\t);\n\t\t\t\t\tmonochrome = true;\n\t\t\t\t} else {\n\t\t\t\t\tpalette = new Array(tabs.PLTE.length / 3);\n\t\t\t\t\tfor (let i = 0; i < palette.length; i++) {\n\t\t\t\t\t\tif (tabs.tRNS && tabs.tRNS.length >= i + 1) {\n\t\t\t\t\t\t\tpalette[i] = `rgba(${tabs.PLTE[i * 3 + 0]}, ${tabs.PLTE[i * 3 + 1]}, ${tabs.PLTE[i * 3 + 2]}, ${tabs.tRNS[i] / 255})`;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpalette[i] = `rgb(${tabs.PLTE[i * 3 + 0]}, ${tabs.PLTE[i * 3 + 1]}, ${tabs.PLTE[i * 3 + 2]})`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tmonochrome = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfile_format = \"image/png\";\n\t\t\tconst image_data = new ImageData(new Uint8ClampedArray(rgba), width, height);\n\t\t\tcallback(null, { file_format, monochrome, palette, image_data, source_blob: blob });\n\t\t} else if (detected_type_id === \"tiff_be\" || detected_type_id === \"tiff_le\") {\n\t\t\t// IFDs = image file directories\n\t\t\t// VSNs = ???\n\t\t\t// This code is based on UTIF.bufferToURI\n\t\t\tvar ifds = UTIF.decode(arrayBuffer);\n\t\t\t//console.log(ifds);\n\t\t\tvar vsns = ifds, ma = 0, page = vsns[0];\n\t\t\tif (ifds[0].subIFD) {\n\t\t\t\tvsns = vsns.concat(ifds[0].subIFD);\n\t\t\t}\n\t\t\tfor (var i = 0; i < vsns.length; i++) {\n\t\t\t\tvar img = vsns[i];\n\t\t\t\tif (img[\"t258\"] == null || img[\"t258\"].length < 3) continue;\n\t\t\t\tvar ar = img[\"t256\"] * img[\"t257\"];\n\t\t\t\tif (ar > ma) { ma = ar; page = img; }\n\t\t\t}\n\t\t\tUTIF.decodeImage(arrayBuffer, page, ifds);\n\t\t\tvar rgba = UTIF.toRGBA8(page);\n\n\t\t\tvar image_data = new ImageData(new Uint8ClampedArray(rgba.buffer), page.width, page.height);\n\n\t\t\tfile_format = \"image/tiff\";\n\t\t\tcallback(null, { file_format, monochrome, palette, image_data, source_blob: blob });\n\t\t} else if (detected_type_id === \"pdf\") {\n\t\t\tfile_format = \"application/pdf\";\n\n\t\t\tconst pdfjs = window[\"pdfjs-dist/build/pdf\"];\n\n\t\t\tpdfjs.GlobalWorkerOptions.workerSrc = \"lib/pdf.js/build/pdf.worker.js\";\n\n\t\t\tconst file_bytes = new Uint8Array(arrayBuffer);\n\n\t\t\tconst loadingTask = pdfjs.getDocument({\n\t\t\t\tdata: file_bytes,\n\t\t\t\tcMapUrl: \"lib/pdf.js/web/cmaps/\",\n\t\t\t\tcMapPacked: true,\n\t\t\t});\n\n\t\t\tloadingTask.promise.then((pdf) => {\n\t\t\t\tconsole.log(\"PDF loaded\");\n\n\t\t\t\t// Fetch the first page\n\t\t\t\t// TODO: maybe concatenate all pages into one image?\n\t\t\t\tvar pageNumber = 1;\n\t\t\t\tpdf.getPage(pageNumber).then((page) => {\n\t\t\t\t\tconsole.log(\"Page loaded\");\n\n\t\t\t\t\tvar scale = 1.5;\n\t\t\t\t\tvar viewport = page.getViewport({ scale });\n\n\t\t\t\t\t// Prepare canvas using PDF page dimensions\n\t\t\t\t\tvar canvas = make_canvas(viewport.width, viewport.height);\n\n\t\t\t\t\t// Render PDF page into canvas context\n\t\t\t\t\tvar renderContext = {\n\t\t\t\t\t\tcanvasContext: canvas.ctx,\n\t\t\t\t\t\tviewport,\n\t\t\t\t\t};\n\t\t\t\t\tvar renderTask = page.render(renderContext);\n\t\t\t\t\trenderTask.promise.then(() => {\n\t\t\t\t\t\tconsole.log(\"Page rendered\");\n\t\t\t\t\t\tconst image_data = canvas.ctx.getImageData(0, 0, canvas.width, canvas.height);\n\t\t\t\t\t\tcallback(null, { file_format, monochrome, palette, image_data, source_blob: blob });\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}, (reason) => {\n\t\t\t\tcallback(new Error(`Failed to load PDF. ${reason}`));\n\t\t\t});\n\t\t} else {\n\t\t\tmonochrome = false;\n\t\t\tfile_format = {\n\t\t\t\t// bmp: \"image/bmp\",\n\t\t\t\tpng: \"image/png\",\n\t\t\t\twebp: \"image/webp\",\n\t\t\t\tjpeg: \"image/jpeg\",\n\t\t\t\tgif: \"image/gif\",\n\t\t\t\ttiff_be: \"image/tiff\",\n\t\t\t\ttiff_le: \"image/tiff\", // can also be image/x-canon-cr2 etc.\n\t\t\t\tico: \"image/x-icon\",\n\t\t\t\tcur: \"image/x-win-bitmap\",\n\t\t\t\ticns: \"image/icns\",\n\t\t\t}[detected_type_id] || blob.type;\n\n\t\t\tconst blob_uri = URL.createObjectURL(blob);\n\t\t\tconst img = new Image();\n\t\t\t// img.crossOrigin = \"Anonymous\";\n\t\t\tconst handle_decode_fail = () => {\n\t\t\t\tURL.revokeObjectURL(blob_uri);\n\t\t\t\tblob.text().then((file_text) => {\n\t\t\t\t\tconst error = new Error(\"failed to decode blob as an image\");\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\terror.code = file_text.match(/^\\s*<!doctype\\s+html/i) ? \"html-not-image\" : \"decoding-failure\";\n\t\t\t\t\tcallback(error);\n\t\t\t\t}, (_err) => {\n\t\t\t\t\tconst error = new Error(\"failed to decode blob as image or text\");\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\terror.code = \"decoding-failure\";\n\t\t\t\t\tcallback(error);\n\t\t\t\t});\n\t\t\t};\n\t\t\timg.onload = () => {\n\t\t\t\tURL.revokeObjectURL(blob_uri);\n\t\t\t\tif (!img.complete || typeof img.naturalWidth == \"undefined\" || img.naturalWidth === 0) {\n\t\t\t\t\thandle_decode_fail();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcallback(null, { file_format, monochrome, palette, image: img, source_blob: blob });\n\t\t\t};\n\t\t\timg.onerror = handle_decode_fail;\n\t\t\timg.src = blob_uri;\n\t\t}\n\t}, (error) => {\n\t\tcallback(error);\n\t});\n}\n\n/**\n * Updates the canvas to reflect reductions in color when saving to certain file formats.\n * @param {Blob} blob - The saved file blob.\n */\nfunction update_from_saved_file(blob) {\n\tread_image_file(blob, (error, info) => {\n\t\tif (error) {\n\t\t\tshow_error_message(\"The file has been saved, however... \" + localize(\"Paint cannot read this file.\"), error);\n\t\t\treturn;\n\t\t}\n\t\tapply_file_format_and_palette_info(info);\n\t\tconst format = image_formats.find(({ mimeType }) => mimeType === info.file_format);\n\t\tundoable({\n\t\t\tname: `${localize(\"Save As\")} ${format ? format.name : info.file_format}`,\n\t\t\ticon: get_help_folder_icon(\"p_save.png\"),\n\t\t\tassume_saved: true, // prevent setting saved to false\n\t\t}, () => {\n\t\t\tmain_ctx.copy(info.image || info.image_data);\n\t\t});\n\t});\n}\n\nfunction save_selection_to_file() {\n\tif (selection && selection.canvas) {\n\t\tsystemHooks.showSaveFileDialog({\n\t\t\tdialogTitle: localize(\"Save As\"),\n\t\t\tdefaultFileName: \"selection.png\",\n\t\t\tdefaultFileFormatID: \"image/png\",\n\t\t\tformats: image_formats,\n\t\t\tgetBlob: (new_file_type) => {\n\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\twrite_image_file(selection.canvas, new_file_type, (blob) => {\n\t\t\t\t\t\tresolve(blob);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n}\n\n/**\n * @param {Blob} blob\n * @param {() => void} okay_callback\n * @param {number[]} [magic_number_bytes]\n * @param {boolean} [magic_wanted]\n */\nfunction sanity_check_blob(blob, okay_callback, magic_number_bytes, magic_wanted = true) {\n\tif (blob.size > 0) {\n\t\tif (magic_number_bytes) {\n\t\t\tblob.arrayBuffer().then((arrayBuffer) => {\n\t\t\t\tconst file_bytes = new Uint8Array(arrayBuffer);\n\t\t\t\tconst magic_found = magic_number_bytes.every((byte, index) => byte === file_bytes[index]);\n\t\t\t\t// console.log(file_bytes, magic_number_bytes, magic_found, magic_wanted);\n\t\t\t\tif (magic_found === magic_wanted) {\n\t\t\t\t\tokay_callback();\n\t\t\t\t} else {\n\t\t\t\t\tshowMessageBox({\n\t\t\t\t\t\t// hackily combining messages that are already localized, in ways they were not meant to be used.\n\t\t\t\t\t\t// you may have to do some deduction to understand this message.\n\t\t\t\t\t\t// messageHTML: `\n\t\t\t\t\t\t// \t<p>${localize(\"Unexpected file format.\")}</p>\n\t\t\t\t\t\t// \t<p>${localize(\"An unsupported operation was attempted.\")}</p>\n\t\t\t\t\t\t// `,\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\twindow.is_electron_app ?\n\t\t\t\t\t\t\t\t\"Writing images in this file format is not supported.\" :\n\t\t\t\t\t\t\t\t\"Your browser does not support writing images in this file format.\",\n\t\t\t\t\t\ticonID: \"error\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}, (error) => {\n\t\t\t\tshow_error_message(localize(\"An unknown error has occurred.\"), error);\n\t\t\t});\n\t\t} else {\n\t\t\tokay_callback();\n\t\t}\n\t} else {\n\t\tshow_error_message(localize(\"Failed to save document.\"));\n\t}\n}\n\n/**\n * @param {boolean} from_current_document\n */\nfunction show_multi_user_setup_dialog(from_current_document) {\n\tconst $w = $DialogWindow();\n\t$w.title(\"Multi-User Setup\").addClass(\"horizontal-buttons\");\n\t$w.$main.html(`\n\t\t${from_current_document ? \"<p>This will make the current document public.</p>\" : \"\"}\n\t\t<p>\n\t\t\t<!-- Choose a name for the multi-user session, included in the URL for sharing: -->\n\t\t\tEnter the session name that will be used in the URL for sharing:\n\t\t</p>\n\t\t<p>\n\t\t\t<label>\n\t\t\t\t<span class=\"partial-url-label\">jspaint.app/#session:</span>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tid=\"session-name\"\n\t\t\t\t\taria-label=\"session name\"\n\t\t\t\t\tpattern=\"[-0-9A-Za-z\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u02af\\\\u1d00-\\\\u1d25\\\\u1d62-\\\\u1d65\\\\u1d6b-\\\\u1d77\\\\u1d79-\\\\u1d9a\\\\u1e00-\\\\u1eff\\\\u2090-\\\\u2094\\\\u2184-\\\\u2184\\\\u2488-\\\\u2490\\\\u271d-\\\\u271d\\\\u2c60-\\\\u2c7c\\\\u2c7e-\\\\u2c7f\\\\ua722-\\\\ua76f\\\\ua771-\\\\ua787\\\\ua78b-\\\\ua78c\\\\ua7fb-\\\\ua7ff\\\\ufb00-\\\\ufb06]+\"\n\t\t\t\t\ttitle=\"Numbers, letters, and hyphens are allowed.\"\n\t\t\t\t\tclass=\"inset-deep\"\n\t\t\t\t>\n\t\t\t</label>\n\t\t</p>\n\t`);\n\tconst $session_name = $w.$main.find(\"#session-name\");\n\t$w.$main.css({ maxWidth: \"500px\" });\n\t$w.$Button(\"Start\", () => {\n\t\tlet name = String($session_name.val()).trim();\n\n\t\tif (name == \"\") {\n\t\t\tshow_error_message(\"The session name cannot be empty.\");\n\t\t} else if ($session_name.is(\":invalid\")) {\n\t\t\tshow_error_message(\"The session name must be made from only numbers, letters, and hyphens.\");\n\t\t} else {\n\t\t\tif (from_current_document) {\n\t\t\t\tchange_url_param(\"session\", name);\n\t\t\t} else {\n\t\t\t\t// @TODO: load new empty session in the same browser tab\n\t\t\t\t// (or at least... keep settings like vertical-color-box-mode?)\n\t\t\t\twindow.open(`${location.origin}${location.pathname}#session:${name}`);\n\t\t\t}\n\t\t\t$w.close();\n\t\t}\n\t}, { type: \"submit\" });\n\t$w.$Button(localize(\"Cancel\"), () => {\n\t\t$w.close();\n\t});\n\t$w.center();\n\t$session_name.focus();\n}\n\nexport {\n\t$this_version_news,\n\tapply_file_format_and_palette_info, are_you_sure, cancel, change_some_url_params, change_url_param, choose_file_to_paste, cleanup_bitmap_view, clear, confirm_overwrite_capability, delete_selection, deselect, detect_monochrome,\n\tedit_copy, edit_cut, edit_paste, exit_fullscreen_if_ios, file_load_from_url, file_new, file_open, file_print, file_save,\n\tfile_save_as, getSelectionText, get_all_url_params, get_history_ancestors, get_tool_by_id, get_uris, get_url_param, go_to_history_node, handle_keyshortcuts, has_any_transparency, image_attributes, image_flip_and_rotate, image_invert_colors, image_stretch_and_skew, load_image_from_uri, load_theme_from_text, make_history_node, make_monochrome_palette, make_monochrome_pattern, make_opaque, make_or_update_undoable, make_stripe_pattern, meld_selection_into_canvas,\n\tmeld_textbox_into_canvas, open_from_file, open_from_image_info, paste, paste_image_from_file, please_enter_a_number, read_image_file, redo, render_canvas_view, render_history_as_gif, reset_canvas_and_history, reset_file, reset_selected_colors, resize_canvas_and_save_dimensions, resize_canvas_without_saving_dimensions, sanity_check_blob, save_as_prompt, save_selection_to_file, select_all, select_tool, select_tools, set_all_url_params, set_magnification, show_about_paint, show_convert_to_black_and_white, show_custom_zoom_window, show_document_history, show_error_message, show_file_format_errors, show_multi_user_setup_dialog, show_news, show_resource_load_error_message, switch_to_polychrome_palette, toggle_grid,\n\ttoggle_thumbnail, try_exec_command, undo, undoable, update_canvas_rect, update_css_classes_for_conditional_messages, update_disable_aa, update_from_saved_file, update_helper_layer,\n\tupdate_helper_layer_immediately, update_magnified_canvas_size, update_title, view_bitmap, write_image_file\n};\n// Temporary globals until all dependent code is converted to ES Modules\nwindow.make_history_node = make_history_node; // used by app-state.js\nwindow.open_from_file = open_from_file; // used by electron-injected.js\nwindow.are_you_sure = are_you_sure; // used by app-localization.js, electron-injected.js\nwindow.show_error_message = show_error_message; // used by app-localization.js, electron-injected.js\nwindow.show_about_paint = show_about_paint; // used by electron-injected.js\nwindow.exit_fullscreen_if_ios = exit_fullscreen_if_ios; // used by app-localization.js\nwindow.get_tool_by_id = get_tool_by_id; // used by app-state.js\nwindow.make_monochrome_palette = make_monochrome_palette; // used by app-state.js\nwindow.sanity_check_blob = sanity_check_blob; // used by electron-injected.js\n"
  },
  {
    "path": "src/globals.d.ts",
    "content": "// This file defines globals used in the app, for typescript.\n// Some types are installed through npm, like for jQuery and the Youtube API, so it doesn't need to be defined here,\n// but some libraries don't have types (at least not installed), and the app uses a lot of custom globals.\n\n// I'm working on transitioning to ES Modules, but having the ES Modules\n// export globals until all dependent files are converted to ESM.\n// The scripts are mostly converted to ESM, nominally, but not properly modularized.\n// Once they all use imports and no globals, I should be able to remove a lot of code from this file.\n\n// NOTE: IMPORTING/EXPORTING ANYTHING WILL BREAK AMBIENT DECLARATIONS\n\ndeclare const libtess: any;\ndeclare const firebase: any;\ndeclare const GIF: any;\ndeclare const UTIF: any;\ndeclare const UPNG: any;\ndeclare const encodeBMP: any;\ndeclare const decodeBMP: any;\ndeclare const saveAs: any;\ndeclare const FontDetective: any;\ndeclare const AnyPalette: any;\ndeclare const ImageTracer: any;\ndeclare const TrackyMouse: any;\n\n// Globals from scripts that are not converted to ESM yet,\n// and thus can't be imported. (I've been marking scripts as @ts-check as I convert them.)\n// This supports bare identifier global access (no `window.` needed).\n// app-localization.js\ndeclare function localize(english_text: string, ...interpolations: string[]): string;\ndeclare function get_direction(language?: string): \"rtl\" | \"ltr\";\ndeclare function get_language(): string;\ndeclare function set_language(language: string): void;\ndeclare function get_language_endonym(language: string): string;\ndeclare function get_iso_language_name(language: string): string;\ndeclare function get_language_emoji(language: string): string;\ndeclare const available_languages: string[];\n// tools.js\ndeclare const TOOL_PENCIL: \"TOOL_PENCIL\";\n// app-state.js\n// declare let brush_shape: BrushShape;\n// declare let brush_size: number\n// declare let eraser_size: number;\n// declare let airbrush_size: number;\n// declare let pencil_size: number;\n// declare let stroke_size: number; // applies to lines, curves, shape outlines\n// declare let default_brush_shape: BrushShape;\n// declare let default_brush_size: number\n// declare let default_eraser_size: number;\n// declare let default_airbrush_size: number;\n// declare let default_pencil_size: number;\n// declare let default_stroke_size: number;\n\n// declare let tool_transparent_mode: boolean;\n// declare let stroke_color: string | CanvasPattern;\n// declare let fill_color: string | CanvasPattern;\n// declare let pick_color_slot: ColorSelectionSlot;\n\n// declare let selected_tool: Tool;\n// declare let selected_tools: Tool[];\n// declare let return_to_tools: Tool[];\n// declare let selected_colors: {\n// \tforeground: string | CanvasPattern,\n// \tbackground: string | CanvasPattern,\n// \tternary: string | CanvasPattern,\n// };\n\n// declare let selection: OnCanvasSelection;\n// declare let textbox: OnCanvasTextBox;\n// declare let helper_layer: OnCanvasHelperLayer;\n// declare let $thumbnail_window: OSGUI$Window;\n// declare let thumbnail_canvas: HTMLCanvasElement;\n// declare let show_grid: boolean;\n// declare let show_thumbnail: boolean;\n// declare let text_tool_font: TextToolFontOptions;\ninterface TextToolFontOptions {\n\t/** should be an exact value detected by Font Detective */\n\tfamily: string,\n\n\tsize: number,\n\tline_scale: number,\n\n\tbold: boolean,\n\titalic: boolean,\n\tunderline: boolean,\n\tvertical: boolean,\n\n\tcolor: string,\n\tbackground: string,\n};\n// declare let root_history_node: HistoryNode;\n// declare let current_history_node: HistoryNode;\n// declare let history_node_to_cancel_to: HistoryNode | null;\n// declare let undos: HistoryNode[];\n// declare let redos: HistoryNode[];\n// declare let file_name: string;\n// declare let system_file_handle: UserFileHandle;\n// declare let saved: boolean;\n// declare let pointer: { x: number, y: number } | undefined;\n// declare let pointer_start: { x: number, y: number } | undefined;\n// declare let pointer_previous: { x: number, y: number } | undefined;\n// declare let pointer_active: boolean;\n// declare let pointer_type: string;\n// declare let pointer_buttons: number;\n// declare let reverse: boolean;\n// declare let ctrl: boolean;\n// declare let shift: boolean;\n// declare let button: number;\n// declare let pointer_over_canvas: boolean;\n// declare let update_helper_layer_on_pointermove_active: boolean;\n// declare let pointers: { x: number, y: number, pointerId: number, pointerType: string, isPrimary: boolean }[];\n\n// $ToolBox.js\ndeclare interface I$ToolBox {\n\tupdate_selected_tool(): void;\n}\n// $ColorBox.js\ndeclare interface I$ColorBox {\n\trebuild_palette(): void;\n}\n\n// $Component.js\ninterface I$Component {\n\thide(): this;\n\tshow(): this;\n\ttoggle(): this;\n\tdock($dock_to?: JQuery<HTMLElement>): void;\n\tundock_to(x: number, y: number): void;\n\tdestroy(): void;\n}\n// helpers.js\ndeclare function make_css_cursor(name: string, coords: [number, number], fallback: string): string;\ndeclare function make_canvas(width: number, height: number): PixelCanvas;\ndeclare function make_canvas(source: HTMLImageElement | HTMLCanvasElement | ImageData): PixelCanvas;\ndeclare function make_canvas(): PixelCanvas;\ndeclare function get_format_from_extension<T extends FileFormat>(formats: T[], file_path_or_name_or_ext: string): T;\ndeclare const $G: JQuery<Window>;\n\n// color-data.js\ndeclare const default_palette: (string | CanvasPattern)[];\n// file-format-data.js\ndeclare function formats_unique_per_file_extension<T extends FileFormat>(formats: T[]): T[];\n// storage.js\ninterface LocalStore {\n\tget(key: string, callback: (error: Error | null, value: string) => void): void,\n\n\tget(key_default_value_pairs: Record<string, string>, callback: (error: Error | null, values: Record<string, string>) => void): void,\n\n\t// This signature is more for showing a mistake, as only strings can be stored in localStorage.\n\t// That said, you can get arbitrary types when the default values are returned.\n\t// get(key_default_value_pairs: Record<string, unknown>, callback: (error: Error | null, values: Record<string, unknown>) => void): void,\n\t// This was an attempt to handle arbitrary default types as a feature, but it didn't work out.\n\t// get<T extends string>(key_default_value_pairs: Record<string, T>, callback: (error: Error | null, values: Record<string, T>) => void): void,\n\t// Actually this does what I meant (and I think this is most accurate):\n\t// (This generalizes the above too, but I might want to keep the above string-specific version for clarity.)\n\tget<T>(key_default_value_pairs: Record<string, T | string>, callback: (error: Error | null, values: Record<string, T | string>) => void): void,\n\n\tget(keys: string[], callback: (error: Error | null, values: Record<string, string>) => void): void,\n\n\tset(key: string, value: string, callback: (error: Error | null) => void): void,\n\n\tset(key_value_pairs: Record<string, string>, callback: (error: Error | null) => void): void,\n}\n// sessions.js\ndeclare function new_local_session(): void;\n\n// functions.js\ndeclare function get_tool_by_id(id: string): Tool;\ndeclare function make_monochrome_palette(rgba1?: number[], rgba2?: number[]): (string | CanvasPattern)[];\n/**\n * @param {object} options\n * @param {HistoryNode | null=} options.parent - the state before this state (its basis), or null if this is the first state\n * @param {HistoryNode[]=} options.futures - the states branching off from this state (its children)\n * @param {number=} options.timestamp - when this state was created\n * @param {boolean=} options.soft - indicates that undo should skip this state; it can still be accessed with the History window\n * @param {ImageData | null=} options.image_data - the image data for the canvas (TODO: region updates)\n * @param {ImageData | null=} options.selection_image_data - the image data for the selection, if any\n * @param {number=} options.selection_x - the x position of the selection, if any\n * @param {number=} options.selection_y - the y position of the selection, if any\n * @param {string=} options.textbox_text - the text in the textbox, if any\n * @param {number=} options.textbox_x - the x position of the textbox, if any\n * @param {number=} options.textbox_y - the y position of the textbox, if any\n * @param {number=} options.textbox_width - the width of the textbox, if any\n * @param {number=} options.textbox_height - the height of the textbox, if any\n * @param {TextToolFontOptions | null=} options.text_tool_font - the font of the Text tool (important to restore a textbox-containing state, but persists without a textbox)\n * @param {boolean=} options.tool_transparent_mode - whether transparent mode is on for Select/Free-Form Select/Text tools; otherwise box is opaque\n * @param {string | CanvasPattern=} options.foreground_color - selected foreground color (left click)\n * @param {string | CanvasPattern=} options.background_color - selected background color (right click)\n * @param {string | CanvasPattern=} options.ternary_color - selected ternary color (ctrl+click)\n * @param {string=} options.name - the name of the operation, shown in the history window, e.g. localize(\"Resize Canvas\")\n * @param {HTMLImageElement |HTMLCanvasElement | null=} options.icon - a visual representation of the operation type, shown in the history window, e.g. get_help_folder_icon(\"p_blank.png\")\n * @returns {HistoryNode}\n */\ndeclare function make_history_node({ parent, futures, timestamp, soft, image_data, selection_image_data, selection_x, selection_y, textbox_text, textbox_x, textbox_y, textbox_width, textbox_height, text_tool_font, tool_transparent_mode, foreground_color, background_color, ternary_color, name, icon, }: {\n\tparent?: (HistoryNode | null) | undefined;\n\tfutures?: HistoryNode[] | undefined;\n\ttimestamp?: number | undefined;\n\tsoft?: boolean | undefined;\n\timage_data?: (ImageData | null) | undefined;\n\tselection_image_data?: (ImageData | null) | undefined;\n\tselection_x?: number | undefined;\n\tselection_y?: number | undefined;\n\ttextbox_text?: string | undefined;\n\ttextbox_x?: number | undefined;\n\ttextbox_y?: number | undefined;\n\ttextbox_width?: number | undefined;\n\ttextbox_height?: number | undefined;\n\ttext_tool_font?: (TextToolFontOptions | null) | undefined;\n\ttool_transparent_mode?: boolean | undefined;\n\tforeground_color?: (string | CanvasPattern) | undefined;\n\tbackground_color?: (string | CanvasPattern) | undefined;\n\tternary_color?: (string | CanvasPattern) | undefined;\n\tname?: string | undefined;\n\ticon?: (HTMLImageElement | HTMLCanvasElement | null) | undefined;\n}): HistoryNode;\ndeclare function exit_fullscreen_if_ios(): void;\ndeclare function show_about_paint(): void;\n/**\n * @param {Blob} blob\n * @param {() => void} okay_callback\n * @param {number[]} [magic_number_bytes]\n * @param {boolean} [magic_wanted]\n */\ndeclare function sanity_check_blob(blob: Blob, okay_callback: () => void, magic_number_bytes?: number[], magic_wanted?: boolean): void;\n/**\n * @param {string} message\n * @param {Error | string} [error]\n */\ndeclare function show_error_message(message: string, error?: Error | string | undefined): void;\n/**\n * Prompts the user to save changes to the document.\n * @param {(info?: { canvas_modified_while_loading?: boolean }) => void} action\n * @param {() => void} [canceled]\n * @param {boolean} [from_session_load]\n */\ndeclare function are_you_sure(\n\taction: (info?: { canvas_modified_while_loading?: boolean }) => void,\n\tcanceled?: () => void, from_session_load?: boolean\n): void;\n/**\n * @param {Blob} file\n * @param {UserFileHandle} source_file_handle\n */\ndeclare function open_from_file(file: Blob, source_file_handle: UserFileHandle): void;\n\n// msgbox.js\ndeclare function showMessageBox(options: MessageBoxOptions): Promise<string>;\n\n// app.js\ndeclare const systemHooks: SystemHooks;\ndeclare const systemHookDefaults: SystemHooks;\ndeclare const canvas_bounding_client_rect: DOMRect;\ndeclare const _open_images_serially: boolean; // for testing\ndeclare const $app: JQuery<HTMLDivElement>;\ndeclare const $left: JQuery<HTMLDivElement>;\ndeclare const $right: JQuery<HTMLDivElement>;\ndeclare const $top: JQuery<HTMLDivElement>;\ndeclare const $bottom: JQuery<HTMLDivElement>;\ndeclare const $canvas_area: JQuery<HTMLDivElement>;\ndeclare const $canvas: JQuery<HTMLCanvasElement>;\ndeclare const $colorbox: JQuery<HTMLDivElement> & I$Component & I$ColorBox;\ndeclare const $status_area: JQuery<HTMLDivElement>;\ndeclare const $status_position: JQuery<HTMLDivElement>;\ndeclare const $status_size: JQuery<HTMLDivElement>;\ndeclare const $status_text: JQuery<HTMLDivElement> & { default: () => void };\ndeclare const $toolbox: JQuery<HTMLDivElement> & I$Component & I$ToolBox;\ndeclare const canvas_handles: Handles;\ndeclare const clipboardData: DataTransfer | null; // old IE?\ndeclare const debugKeepMenusOpen: boolean; // for debugging (otherwise you need `setTimeout(() => { debugger; }, 4000);`)\ndeclare const initial_system_file_handle: UserFileHandle | null;\ndeclare const menu_bar: MenuBar;\ndeclare const systemHookDefaults: SystemHooks;\ndeclare const systemHooks: SystemHooks;\n\ndeclare function update_fill_and_stroke_colors_and_lineWidth(tool: Tool): void;\ndeclare function tool_go(tool: Tool, event_name?: string): void;\n\n// Globals temporarily exported from ES Modules,\n// as well as globals from scripts that are not converted to ESM yet.\n// This supports `window.*` property access.\ninterface Window {\n\t// helpers.js\n\t$G: JQuery<Window>;\n\tmake_canvas: {\n\t\t(width: number, height: number): PixelCanvas,\n\t\t(source: HTMLImageElement | HTMLCanvasElement | ImageData): PixelCanvas,\n\t\t(): PixelCanvas,\n\t};\n\tget_help_folder_icon: (file_name: string) => HTMLImageElement;\n\tget_format_from_extension: <T extends FileFormat>(formats: T[], file_path_or_name_or_ext: string) => T;\n\t// functions.js\n\tget_tool_by_id(id: string): Tool;\n\tmake_monochrome_palette(rgba1?: number[], rgba2?: number[]): (string | CanvasPattern)[];\n\t/**\n\t * @param {object} options\n\t * @param {HistoryNode | null=} options.parent - the state before this state (its basis), or null if this is the first state\n\t * @param {HistoryNode[]=} options.futures - the states branching off from this state (its children)\n\t * @param {number=} options.timestamp - when this state was created\n\t * @param {boolean=} options.soft - indicates that undo should skip this state; it can still be accessed with the History window\n\t * @param {ImageData | null=} options.image_data - the image data for the canvas (TODO: region updates)\n\t * @param {ImageData | null=} options.selection_image_data - the image data for the selection, if any\n\t * @param {number=} options.selection_x - the x position of the selection, if any\n\t * @param {number=} options.selection_y - the y position of the selection, if any\n\t * @param {string=} options.textbox_text - the text in the textbox, if any\n\t * @param {number=} options.textbox_x - the x position of the textbox, if any\n\t * @param {number=} options.textbox_y - the y position of the textbox, if any\n\t * @param {number=} options.textbox_width - the width of the textbox, if any\n\t * @param {number=} options.textbox_height - the height of the textbox, if any\n\t * @param {TextToolFontOptions | null=} options.text_tool_font - the font of the Text tool (important to restore a textbox-containing state, but persists without a textbox)\n\t * @param {boolean=} options.tool_transparent_mode - whether transparent mode is on for Select/Free-Form Select/Text tools; otherwise box is opaque\n\t * @param {string | CanvasPattern=} options.foreground_color - selected foreground color (left click)\n\t * @param {string | CanvasPattern=} options.background_color - selected background color (right click)\n\t * @param {string | CanvasPattern=} options.ternary_color - selected ternary color (ctrl+click)\n\t * @param {string=} options.name - the name of the operation, shown in the history window, e.g. localize(\"Resize Canvas\")\n\t * @param {HTMLImageElement |HTMLCanvasElement | null=} options.icon - a visual representation of the operation type, shown in the history window, e.g. get_help_folder_icon(\"p_blank.png\")\n\t * @returns {HistoryNode}\n\t */\n\tmake_history_node({ parent, futures, timestamp, soft, image_data, selection_image_data, selection_x, selection_y, textbox_text, textbox_x, textbox_y, textbox_width, textbox_height, text_tool_font, tool_transparent_mode, foreground_color, background_color, ternary_color, name, icon, }: {\n\t\tparent?: (HistoryNode | null) | undefined;\n\t\tfutures?: HistoryNode[] | undefined;\n\t\ttimestamp?: number | undefined;\n\t\tsoft?: boolean | undefined;\n\t\timage_data?: (ImageData | null) | undefined;\n\t\tselection_image_data?: (ImageData | null) | undefined;\n\t\tselection_x?: number | undefined;\n\t\tselection_y?: number | undefined;\n\t\ttextbox_text?: string | undefined;\n\t\ttextbox_x?: number | undefined;\n\t\ttextbox_y?: number | undefined;\n\t\ttextbox_width?: number | undefined;\n\t\ttextbox_height?: number | undefined;\n\t\ttext_tool_font?: (TextToolFontOptions | null) | undefined;\n\t\ttool_transparent_mode?: boolean | undefined;\n\t\tforeground_color?: (string | CanvasPattern) | undefined;\n\t\tbackground_color?: (string | CanvasPattern) | undefined;\n\t\tternary_color?: (string | CanvasPattern) | undefined;\n\t\tname?: string | undefined;\n\t\ticon?: (HTMLImageElement | HTMLCanvasElement | null) | undefined;\n\t}): HistoryNode;\n\texit_fullscreen_if_ios: () => void;\n\tshow_about_paint: () => void;\n\t/**\n\t * @param {Blob} blob\n\t * @param {() => void} okay_callback\n\t * @param {number[]} [magic_number_bytes]\n\t * @param {boolean} [magic_wanted]\n\t */\n\tsanity_check_blob: (blob: Blob, okay_callback: () => void, magic_number_bytes?: number[], magic_wanted?: boolean) => void;\n\t/**\n\t * @param {string} message\n\t * @param {Error | string} [error]\n\t */\n\tshow_error_message: (message: string, error?: Error | string | undefined) => void;\n\t/**\n\t * Prompts the user to save changes to the document.\n\t * @param {(info?: { canvas_modified_while_loading?: boolean }) => void} action\n\t * @param {() => void} [canceled]\n\t * @param {boolean} [from_session_load]\n\t */\n\tare_you_sure(\n\t\taction: (info?: { canvas_modified_while_loading?: boolean }) => void,\n\t\tcanceled?: () => void, from_session_load?: boolean\n\t): void;\n\t/**\n\t * @param {File} file\n\t * @param {UserFileHandle} source_file_handle\n\t */\n\topen_from_file(file: File, source_file_handle: UserFileHandle): void;\n\t// tools.js\n\tTOOL_PENCIL: \"TOOL_PENCIL\";\n\t// app.js\n\tcanvas_bounding_client_rect: DOMRect;\n\t_open_images_serially: boolean; // for testing\n\t$app: JQuery<HTMLDivElement>;\n\t$left: JQuery<HTMLDivElement>;\n\t$right: JQuery<HTMLDivElement>;\n\t$top: JQuery<HTMLDivElement>;\n\t$bottom: JQuery<HTMLDivElement>;\n\t$canvas_area: JQuery<HTMLDivElement>;\n\t$canvas: JQuery<HTMLCanvasElement>;\n\t$colorbox: JQuery<HTMLDivElement> & I$Component & I$ColorBox;\n\t$status_area: JQuery<HTMLDivElement>;\n\t$status_position: JQuery<HTMLDivElement>;\n\t$status_size: JQuery<HTMLDivElement>;\n\t$status_text: JQuery<HTMLDivElement> & { default: () => void };\n\t$toolbox: JQuery<HTMLDivElement> & I$Component & I$ToolBox;\n\tcanvas_handles: Handles;\n\tclipboardData: DataTransfer | null; // old IE?\n\tdebugKeepMenusOpen: boolean; // for debugging (otherwise you need `setTimeout(() => { debugger; }, 4000);`)\n\tinitial_system_file_handle: UserFileHandle | null;\n\tmenu_bar: MenuBar;\n\tsystemHookDefaults: SystemHooks;\n\tsystemHooks: SystemHooks;\n\t// app-state.js\n\tselection: OnCanvasSelection;\n\ttextbox: OnCanvasTextBox;\n\thelper_layer: OnCanvasHelperLayer;\n\tselected_tool: Tool;\n\tselected_tools: Tool[];\n\treturn_to_tools: Tool[];\n\tselected_colors: {\n\t\tforeground: string | CanvasPattern,\n\t\tbackground: string | CanvasPattern,\n\t\tternary: string | CanvasPattern,\n\t};\n\ttext_tool_font: {\n\t\tfamily: string, // should be an exact value detected by Font Detective\n\t\tsize: number,\n\t\tline_scale: number,\n\t\tbold: boolean,\n\t\titalic: boolean,\n\t\tunderline: boolean,\n\t\tvertical: boolean,\n\t\tcolor: string,\n\t\tbackground: string,\n\t};\n\tbrush_shape: BrushShape;\n\tbrush_size: number\n\teraser_size: number;\n\tairbrush_size: number;\n\tpencil_size: number;\n\tstroke_size: number;\n\tdefault_brush_shape: BrushShape;\n\tdefault_brush_size: number\n\tdefault_eraser_size: number;\n\tdefault_airbrush_size: number;\n\tdefault_pencil_size: number;\n\tdefault_stroke_size: number;\n\n\tapi_for_cypress_tests: {\n\t\treset_for_next_test: () => void;\n\t\tselected_colors: {\n\t\t\tforeground: string | CanvasPattern,\n\t\t\tbackground: string | CanvasPattern,\n\t\t\tternary: string | CanvasPattern,\n\t\t};\n\t\tset_theme: (theme_file_name: string) => void;\n\t\t$: JQueryStatic;\n\t};\n\n\t// app-localization.js\n\tavailable_languages: string[];\n\tloaded_localizations: (language: string, mapping: Record<string, string>) => void; // JSONP callback in the localization files\n\t// msgbox.js\n\tshowMessageBox: (options: MessageBoxOptions) => Promise<string>;\n\tdefaultMessageBoxTitle: string;\n\taudioContext: AudioContext;\n\t// color-data.js\n\tdefault_palette: (string | CanvasPattern)[];\n\t// help.js\n\tjQuery: JQueryStatic; // help.js reaches into iframe to use jQuery\n\tMouseEvent: typeof MouseEvent; // help.js reaches into iframe and uses MouseEvent\n\tapplyTheme: (cssProperties: Record<string, string>, documentElement?: HTMLElement) => void; // this is defined in 98.js.org... does it actually exist [when running in 98.js.org]? btw HTMLHtmlElement would be more specific, but document.documentElement is typed as HTMLElement, so it'd just be annoying\n\tthemeCSSProperties: Record<string, string>;\n\t// file-format-data.js\n\timage_formats: ImageFileFormat[];\n\tpalette_formats: PaletteFileFormat[];\n\tformats_unique_per_file_extension: <T extends FileFormat>(formats: T[]) => T[];\n\t// sessions.js\n\tnew_local_session: () => void;\n\t// speech-recognition.js\n\tsearch_page_html: string; // just for debugging\n\tsearch_page_$html: JQuery; // just for debugging\n\t// image-manipulation.js\n\tWEBGL_lose_context: WEBGL_lose_context | null; // just for debugging\n\t// eye-gaze-mode.js and speech-recognition.js\n\tuntrusted_gesture: boolean;\n\t// simulate-random-gestures.js\n\tsimulateRandomGesturesPeriodically: () => void;\n\tdrawRandomlySeed: number;\n\t// electron-injected.js\n\tis_electron_app?: boolean;\n\telectron_is_dev?: boolean;\n\tsetDocumentEdited?: (edited: boolean) => void;\n\tsetRepresentedFilename?: (filename: string) => void;\n\tsetMenus?: (menus: any) => void; // TODO: types for OS-GUI.js menus\n\t// OS-GUI's MenuBar.js\n\tMenuBar: typeof MenuBar;\n\t// Youtube API, used by vaporwave-fun.js, missing from @types/youtube\n\tonYouTubeIframeAPIReady?: () => void;\n\t// Local Font Access API\n\tqueryLocalFonts?: () => Promise<FontData[]>;\n\t// Chrome browser detection\n\tchrome?: { loadTimes: unknown, csi: unknown };\n}\n\n// Extending OS-GUI's MenuBar API\ninterface OSGUIMenuItem {\n\tspeech_recognition?: string[];\n\temoji_icon?: string;\n}\n\n// The JS Paint `systemHooks` API\ninterface SaveFileDialogOptions {\n\tformats: FileFormat[];\n\tdefaultFileName?: string;\n\tdefaultPath?: UserFileHandle; // a bit of a misnomer since UserFileHandle is not _necessarily_ a path\n\tdefaultFileFormatID?: string;\n\tgetBlob: (formatID: string) => Promise<Blob>;\n\tsavedCallbackUnreliable?: (params: { newFileName: string; newFileFormatID: string; newFileHandle: any; newBlob: Blob }) => void;\n\tdialogTitle?: string;\n}\n\ninterface OpenFileDialogOptions {\n\tformats: FileFormat[];\n}\n\ninterface SystemHooks {\n\tshowSaveFileDialog(options: SaveFileDialogOptions): Promise<void>;\n\tshowOpenFileDialog(options: OpenFileDialogOptions): Promise<{ file: Blob; fileHandle?: UserFileHandle; }>;\n\twriteBlobToHandle(fileHandle: UserFileHandle, blob: Blob): Promise<boolean | undefined>;\n\treadBlobFromHandle(fileHandle: UserFileHandle): Promise<Blob | undefined>;\n\tsetWallpaperTiled(canvas: HTMLCanvasElement): void;\n\tsetWallpaperCentered(canvas: HTMLCanvasElement): void;\n}\n\n//\n\ninterface MessageBoxOptions {\n\ttitle?: string;\n\tmessage?: string;\n\tmessageHTML?: string;\n\tbuttons?: { label: string, value: string, default?: boolean, action?: () => void }[];\n\ticonID?: \"error\" | \"warning\" | \"info\" | \"nuke\";\n\twindowOptions?: OSGUIWindowOptions;\n}\n\ndeclare class FontData {\n\tfamily: string;\n\tfullName: string;\n\tpostscriptName: string;\n\tstyle: string;\n}\n\ndeclare class OnCanvasObject {\n\tconstructor(x: number, y: number, width: number, height: number, hideMainCanvasHandles: boolean);\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n\thideMainCanvasHandles: boolean;\n\t$el: JQuery<HTMLDivElement>;\n\t// _global_resize_handler: () => void;\n\tposition(updateStatus?: boolean): void;\n\tdestroy(): void;\n}\ndeclare class OnCanvasHelperLayer extends OnCanvasObject {\n\tconstructor(x: any, y: any, width: any, height: any, hideMainCanvasHandles: any, pixelRatio?: number);\n\tcanvas: PixelCanvas;\n}\ndeclare class OnCanvasSelection extends OnCanvasObject {\n\tconstructor(x: number, y: number, width: number, height: number, image_source?: HTMLImageElement | HTMLCanvasElement | ImageData);\n\tinstantiate(image_source: HTMLImageElement | HTMLCanvasElement | ImageData): void;\n\tcut_out_background(): void;\n\tupdate_tool_transparent_mode(): void;\n\treplace_source_canvas(new_source_canvas: PixelCanvas): void;\n\tresize(): void;\n\tscale(factor: number): void;\n\tdraw(): void;\n\tcanvas: PixelCanvas;\n\tsource_canvas: PixelCanvas;\n\tdragging: boolean;\n}\ndeclare class OnCanvasTextBox extends OnCanvasObject {\n\tconstructor(x: number, y: number, width: number, height: number, starting_text?: string);\n\tposition(): void;\n\tstatic $fontbox: OSGUI$Window | null;\n\tcanvas: PixelCanvas;\n\t$editor: JQuery<HTMLTextAreaElement>;\n\tdragging: boolean;\n}\n\n// `Handles` declaration may not be needed anymore, but its options are complex enough\n// that it might make sense to define them here as `HandlesOptions`...\ndeclare class Handles {\n\t/**\n\t * Handles for resizable, draggable, on-canvas objects.\n\t * @param {object} options\n\t * @param {JQuery} options.$handles_container\n\t * @param {JQuery} options.$object_container\n\t * @param {number} [options.outset=0]\n\t * @param {() => number} [options.get_handles_offset_left=() => 0]\n\t * @param {() => number} [options.get_handles_offset_top=() => 0]\n\t * @param {() => number} [options.get_ghost_offset_left=() => 0]\n\t * @param {() => number} [options.get_ghost_offset_top=() => 0]\n\t * @param {boolean} [options.size_only=false]\n\t * @param {() => Rect} options.get_rect\n\t * @param {(rect: Rect) => void} options.set_rect\n\t * @param {(rect: Rect, x_axis: -1 | 0 | 1, y_axis: -1 | 0 | 1) => Rect} [options.constrain_rect]\n\t * @param {boolean} [options.thick]\n\t * @constructor\n\t * @property {HTMLElement[]} handles\n\t * @property {() => void} hide\n\t * @property {() => void} show\n\t * @property {HTMLElement[]} handles\n\t */\n\tconstructor(options: {\n\t\t$handles_container: JQuery;\n\t\t$object_container: JQuery;\n\t\toutset?: number;\n\t\tget_handles_offset_left?: () => number;\n\t\tget_handles_offset_top?: () => number;\n\t\tget_ghost_offset_left?: () => number;\n\t\tget_ghost_offset_top?: () => number;\n\t\tsize_only?: boolean;\n\t\tget_rect: () => {\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t\twidth: number;\n\t\t\theight: number;\n\t\t};\n\t\tset_rect: (rect: {\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t\twidth: number;\n\t\t\theight: number;\n\t\t}) => void;\n\t\tconstrain_rect?: (rect: {\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t\twidth: number;\n\t\t\theight: number;\n\t\t}, x_axis: -1 | 0 | 1, y_axis: -1 | 0 | 1) => {\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t\twidth: number;\n\t\t\theight: number;\n\t\t};\n\t\tthick?: boolean;\n\t});\n\thandles: HTMLElement[];\n\thide: () => void;\n\tshow: () => void;\n}\n\ninterface Rect { x: number; y: number; width: number; height: number; }\n\n// part of os-gui.js which was extracted from jspaint into a library\n// interface I$FormWindow {\n// \t$form: JQuery<HTMLFormElement>;\n// \t$main: JQuery<HTMLDivElement>;\n// \t$buttons: JQuery<HTMLDivElement>;\n\n// \t$Button(label: string, action: () => void): JQuery<HTMLButtonElement>;\n// }\n\n// still part of jspaint, uncomfortably overlapping with os-gui.js's I$FormWindow\ninterface I$DialogWindow {\n\t$form: JQuery<HTMLFormElement>;\n\t$main: JQuery<HTMLDivElement>;\n\t$buttons: JQuery<HTMLDivElement>;\n\n\t$Button(label: string | Node, action: () => void, options?: { type?: string }): JQuery<HTMLButtonElement>;\n}\n// definitely some cleanup to be done here regarding the window \"classes\"\ninterface I$ToolWindow { }\n\n//\n\ntype ToolID =\n\t\"TOOL_FREE_FORM_SELECT\" |\n\t\"TOOL_SELECT\" |\n\t\"TOOL_ERASER\" |\n\t\"TOOL_FILL\" |\n\t\"TOOL_PICK_COLOR\" |\n\t\"TOOL_MAGNIFIER\" |\n\t\"TOOL_PENCIL\" |\n\t\"TOOL_BRUSH\" |\n\t\"TOOL_AIRBRUSH\" |\n\t\"TOOL_TEXT\" |\n\t\"TOOL_LINE\" |\n\t\"TOOL_CURVE\" |\n\t\"TOOL_RECTANGLE\" |\n\t\"TOOL_POLYGON\" |\n\t\"TOOL_ELLIPSE\" |\n\t\"TOOL_ROUNDED_RECTANGLE\";\n\n// This is very silly!\n// This isn't a coherent API, but rather a layered set of functionality\n// all typed as if it were a single API.\n// It's not providing much type safety,\n// just look at eraser_paint_iteration/ffs_paint_iteration for example.\n// I had to rename them from \"paint_iteration\" because was defined differently for two different tools.\n// A class hierarchy may be in order, or another way of encapsulating\n// subsets of functionality, such as functions that return tool objects,\n// instead of properties that imply other properties should be generated.\ninterface Tool {\n\tid: ToolID,\n\tname: string,\n\tspeech_recognition: string[],\n\thelp_icon: string,\n\tdescription: string,\n\tcursor: Parameters<typeof make_css_cursor>,\n\t/** Indicates that the brush operation should be previewed on the canvas at the cursor location. */\n\tdynamic_preview_cursor?: boolean,\n\t/** Indicates that the tool should be deselected after a single use. */\n\tdeselect?: boolean,\n\t/** Used by Polygon tool. Indicates that the tool should use colors like point-to-point shape tools, even though it has different UI. */\n\tshape_colors?: boolean,\n\t/** Used for Curve, Line, Pencil tools. */\n\tstroke_only?: boolean,\n\t/** Used by Airbrush tool */\n\tpaint_on_time_interval?: number,\n\n\t/** Called when... */\n\tpreload?(): void,\n\t/** Called when... */\n\tpointerdown?(ctx: CanvasRenderingContext2D, x: number, y: number): void,\n\t/** Called when... */\n\tpaint?(ctx: CanvasRenderingContext2D, x: number, y: number): void,\n\t/** Used by Free-Form Select tool */\n\tffs_paint_iteration?(x: number, y: number): void,\n\t/** Used by Eraser tool */\n\teraser_paint_iteration?(ctx: CanvasRenderingContext2D, x: number, y: number): void,\n\t/** Called when... */\n\tpointerup?(ctx: CanvasRenderingContext2D, x: number, y: number): void,\n\t/** Called when... */\n\tcancel?(): void,\n\t/** Called when... */\n\tend?(ctx: CanvasRenderingContext2D): void,\n\t/** Called when rendering... */\n\tdrawPreviewUnderGrid?(ctx: CanvasRenderingContext2D, x: number, y: number, grid_visible: boolean, scale: number, translate_x: number, translate_y: number);\n\t/** Called when rendering... */\n\tdrawPreviewAboveGrid?(ctx: CanvasRenderingContext2D, x: number, y: number, grid_visible: boolean, scale: number, translate_x: number, translate_y: number);\n\t/** Called when... */\n\tinit_mask_canvas?(): void,\n\t/** Called when... Can return true to indicate it should be animated (re-rendered next frame) */\n\trender_from_mask?(ctx: CanvasRenderingContext2D, previewing?: boolean): void | boolean,\n\t/** Defines the tool as one that draws a shape between the mouse down location and mouse up location. */\n\tshape?(ctx: CanvasRenderingContext2D, x: number, y: number, w: number, h: number): void,\n\t/** Defines the tool as one that paints a region with the current color... */\n\tpaint_mask?(ctx: CanvasRenderingContext2D, x: number, y: number): void,\n\t/** Called when... */\n\tselectBox?(x: number, y: number, w: number, h: number): void,\n\t/** Defines the tool as one that paints continuously as the cursor moves. */\n\tget_brush?(): { size: number, shape: BrushShape },\n\t/** Used by Polygon tool */\n\treset?(): void,\n\t/** Used by Polygon tool */\n\tcomplete?(ctx: CanvasRenderingContext2D): void,\n\t/** Used by Polygon tool */\n\tupdateStatus?(): void,\n\t/** Used by Magnifier tool */\n\tgetProspectiveMagnification?(): number,\n\n\t/** Used by several tools */\n\tmask_canvas?: PixelCanvas,\n\t/** Used by some tools */\n\tshape_canvas?: PixelCanvas,\n\t/** Used by some tools */\n\tpreview_canvas?: PixelCanvas,\n\t/** Used by Free-Form Select tool */\n\tx_min?: number,\n\t/** Used by Free-Form Select tool */\n\tx_max?: number,\n\t/** Used by Free-Form Select tool */\n\ty_min?: number,\n\t/** Used by Free-Form Select tool */\n\ty_max?: number,\n\t/** Used by Free-Form Select, Curve, and Polygon tools */\n\tpoints?: { x: number, y: number }[],\n\t/** Used by Polygon tool */\n\tlast_click_pointerdown?: { x: number, y: number, time: number },\n\t/** Used by Polygon tool */\n\tlast_click_pointerup?: { x: number, y: number, time: number },\n\t/** Used by Eraser tool */\n\tget_rect?(x: number, y: number): { rect_x: number, rect_y: number, rect_w: number, rect_h: number },\n\t/** Used by Eraser tool */\n\tcolor_eraser_mode?: boolean,\n\t/** Used by Pick Color tool */\n\tcurrent_color?: string,\n\t/** Used by Pick Color tool */\n\tdisplay_current_color?(): void,\n\n\t// UI\n\t$options?: JQuery<HTMLElement> & { fill?: boolean, stroke?: boolean },\n\t$button?: JQuery<HTMLElement>,\n}\n\ninterface HistoryNode {\n\t/** the state before this state (its basis), or null if this is the first state */\n\tparent: HistoryNode | null;\n\t/** the states branching off from this state (its children) */\n\tfutures: HistoryNode[];\n\t/** when this state was created */\n\ttimestamp: number;\n\t/** indicates that undo should skip this state; it can still be accessed with the History window */\n\tsoft: boolean;\n\t/** the image data for the canvas (TODO: region updates) */\n\timage_data: ImageData | null;\n\t/** the image data for the selection, if any */\n\tselection_image_data: ImageData | null;\n\t/** the x position of the selection, if any */\n\tselection_x: number;\n\t/** the y position of the selection, if any */\n\tselection_y: number;\n\t/** the text in the textbox, if any */\n\ttextbox_text: string;\n\t/** the x position of the textbox, if any */\n\ttextbox_x: number;\n\t/** the y position of the textbox, if any */\n\ttextbox_y: number;\n\t/** the width of the textbox, if any */\n\ttextbox_width: number;\n\t/** the height of the textbox, if any */\n\ttextbox_height: number;\n\t/** the font of the Text tool (important to restore a textbox-containing state, but persists without a textbox) */\n\ttext_tool_font: TextToolFontOptions | null;\n\t/** whether transparent mode is on for Select/Free-Form Select/Text tools; otherwise box is opaque */\n\ttool_transparent_mode: boolean;\n\t/** selected foreground color (left click) */\n\tforeground_color: string | CanvasPattern;\n\t/** selected background color (right click) */\n\tbackground_color: string | CanvasPattern;\n\t/** selected ternary color (ctrl+click) */\n\tternary_color: string | CanvasPattern;\n\t/** the name of the operation, shown in the history window, e.g. localize(\"Resize Canvas\") */\n\tname: string;\n\t/** a visual representation of the operation type, shown in the history window, e.g. get_help_folder_icon(\"p_blank.png\") */\n\ticon: HTMLImageElement | HTMLCanvasElement | null;\n}\n\ninterface ActionMetadata {\n\tname: string;\n\ticon?: HTMLImageElement | HTMLCanvasElement;\n\tuse_loose_canvas_changes?: boolean;\n\tsoft?: boolean;\n\tassume_saved?: boolean;\n}\n\ninterface ActionMetadataUpdate extends ActionMetadata {\n\tupdate_name?: boolean;\n\tmatch?: (current_history_node: HistoryNode) => boolean;\n}\n\n/**\n * A canvas with a 2D context that has some extra methods. Returned by `make_canvas`.\n */\ninterface PixelCanvas extends HTMLCanvasElement {\n\tctx: PixelContext;\n}\ninterface PixelContext extends CanvasRenderingContext2D {\n\tdisable_image_smoothing(): void;\n\tenable_image_smoothing(): void;\n\tcopy(image: HTMLImageElement | HTMLCanvasElement | ImageData): void;\n\tcanvas: PixelCanvas;\n}\n\ntype BrushShape = \"circle\" | \"square\" | \"reverse_diagonal\" | \"diagonal\";\n\ntype ColorSelectionSlot = \"foreground\" | \"background\" | \"ternary\";\n\ninterface ImageFileFormat {\n\tformatID: string;\n\tmimeType: string;\n\tname: string;\n\tnameWithExtensions: string;\n\textensions: string[];\n}\n\ninterface PaletteFileFormat {\n\tformatID: string;\n\t// mimeType: string;\n\tname: string;\n\tnameWithExtensions: string;\n\textensions: string[];\n}\n\ninterface MonochromeInfo {\n\tisMonochrome: boolean;\n\tpresentNonTransparentRGBAs?: Uint8ClampedArray[];\n\tpresentNonTransparentUint32s?: number[];\n\tmonochromeWithTransparency?: boolean;\n}\n\ntype FileFormat = ImageFileFormat | PaletteFileFormat;\n\ninterface ImageInfo {\n\tfile_format: string,\n\tmonochrome: boolean,\n\tpalette?: string[],\n\timage?: HTMLImageElement, // exclusive with image_data\n\timage_data?: ImageData, // exclusive with image\n\tsource_blob: Blob,\n\tsource_file_handle?: UserFileHandle,\n}\n\n/** It's up to the user of the API to define this; could be parametrized in a better version of the JS Paint API. */\ntype UserFileHandle = any;\n\ninterface VoiceCommand {\n\tmatch_text: string,\n\texec: () => void,\n\t// for sorting\n\tprioritize?: boolean,\n\t// extra info for test assertions\n\ttype?: string,\n\ttool_id?: ToolID,\n\tsketch_subject?: string,\n\tvector?: { x: number, y: number },\n\tsize?: number,\n}\n\n// Fullscreen API vendor prefixes\ninterface Document {\n\twebkitFullscreenElement?: Document[\"fullscreenElement\"];\n\tmozFullScreenElement?: Document[\"fullscreenElement\"];\n\tmsFullscreenElement?: Document[\"fullscreenElement\"];\n\twebkitExitFullscreen?: typeof Document.prototype.exitFullscreen;\n\tmozCancelFullScreen?: typeof Document.prototype.exitFullscreen;\n\tmsExitFullscreen?: typeof Document.prototype.exitFullscreen;\n\twebkitFullscreenEnabled?: Document[\"fullscreenEnabled\"];\n\tmozFullScreenEnabled?: Document[\"fullscreenEnabled\"];\n\tmsFullscreenEnabled?: Document[\"fullscreenEnabled\"];\n}\ninterface HTMLElement {\n\twebkitRequestFullscreen?: typeof HTMLElement.prototype.requestFullscreen;\n\tmozRequestFullScreen?: typeof HTMLElement.prototype.requestFullscreen;\n\tmsRequestFullscreen?: typeof HTMLElement.prototype.requestFullscreen;\n}\n\n// Discord Embedded App SDK\n// Copied from:\n// https://github.com/discord/embedded-app-sdk/blob/49d23756144ebf36a5735bd7f161aae6cb359939/examples/react-colyseus/packages/client/src/types.tsx#L13C1-L31C2\ninterface IGuildsMembersRead {\n\troles: string[];\n\tnick: string | null;\n\tavatar: string | null;\n\tpremium_since: string | null;\n\tjoined_at: string;\n\tis_pending: boolean;\n\tpending: boolean;\n\tcommunication_disabled_until: string | null;\n\tuser: {\n\t\tid: string;\n\t\tusername: string;\n\t\tavatar: string | null;\n\t\tdiscriminator: string;\n\t\tpublic_flags: number;\n\t};\n\tmute: boolean;\n\tdeaf: boolean;\n}\n"
  },
  {
    "path": "src/help.js",
    "content": "// @ts-check\n/* global $Window, localize */\n// import { localize } from \"./app-localization.js\";\nimport { show_error_message } from \"./functions.js\";\nimport { $G, E } from \"./helpers.js\";\nimport { showMessageBox } from \"./msgbox.js\";\n\nlet $help_window;\nfunction show_help() {\n\tif ($help_window) {\n\t\t$help_window.focus();\n\t\treturn;\n\t}\n\t$help_window = open_help_viewer({\n\t\ttitle: localize(\"Paint Help\"),\n\t\troot: \"help\",\n\t\tcontentsFile: \"help/mspaint.hhc\",\n\t}).$help_window;\n\t$help_window.on(\"close\", () => {\n\t\t$help_window = null;\n\t});\n}\n\n// shared code with 98.js.org\n// (copy-pasted / manually synced for now)\n\nfunction open_help_viewer(options) {\n\tconst $help_window = $Window({\n\t\ttitle: options.title || \"Help Topics\",\n\t\ticons: {\n\t\t\t16: \"images/chm-16x16.png\",\n\t\t},\n\t\tresizable: true,\n\t});\n\t$help_window.addClass(\"help-window\");\n\n\tlet ignore_one_load = true;\n\tlet back_length = 0;\n\tlet forward_length = 0;\n\n\tconst $main = $(E(\"div\")).addClass(\"main\");\n\tconst $toolbar = $(E(\"div\")).addClass(\"toolbar\");\n\tconst add_toolbar_button = (name, sprite_n, action_fn, enabled_fn) => {\n\t\tconst $button = /** @type JQuery<HTMLButtonElement> */ ($(\"<button class='lightweight'>\")\n\t\t\t.append($(\"<span>\").text(name))\n\t\t\t.appendTo($toolbar)\n\t\t\t.on(\"click\", () => {\n\t\t\t\taction_fn();\n\t\t\t})\n\t\t);\n\t\t$(\"<div class='icon'/>\")\n\t\t\t.appendTo($button)\n\t\t\t.css({\n\t\t\t\tbackgroundPosition: `${-sprite_n * 55}px 0px`,\n\t\t\t});\n\t\tconst update_enabled = () => {\n\t\t\t$button[0].disabled = enabled_fn && !enabled_fn();\n\t\t};\n\t\tupdate_enabled();\n\t\t$help_window.on(\"click\", \"*\", update_enabled);\n\t\t$help_window.on(\"update-buttons\", update_enabled);\n\t\treturn $button;\n\t};\n\tconst measure_sidebar_width = () =>\n\t\t$contents.outerWidth() +\n\t\tparseFloat(getComputedStyle($contents[0]).getPropertyValue(\"margin-left\")) +\n\t\tparseFloat(getComputedStyle($contents[0]).getPropertyValue(\"margin-right\")) +\n\t\t$resizer.outerWidth();\n\tconst $hide_button = add_toolbar_button(\"Hide\", 0, () => {\n\t\tconst toggling_width = measure_sidebar_width();\n\t\t$contents.hide();\n\t\t$resizer.hide();\n\t\t$hide_button.hide();\n\t\t$show_button.show();\n\t\t$help_window.width($help_window.width() - toggling_width);\n\t\t$help_window.css(\"left\", $help_window.offset().left + toggling_width);\n\t\t$help_window.bringTitleBarInBounds();\n\t});\n\tconst $show_button = add_toolbar_button(\"Show\", 5, () => {\n\t\t$contents.show();\n\t\t$resizer.show();\n\t\t$show_button.hide();\n\t\t$hide_button.show();\n\t\tconst toggling_width = measure_sidebar_width();\n\t\t$help_window.css(\"max-width\", \"unset\");\n\t\t$help_window.width($help_window.width() + toggling_width);\n\t\t$help_window.css(\"left\", $help_window.offset().left - toggling_width);\n\t\t// $help_window.applyBounds() would push the window to fit (before trimming it only if needed)\n\t\t// Trim the window to fit (especially for if maximized)\n\t\tif ($help_window.offset().left < 0) {\n\t\t\t$help_window.width($help_window.width() + $help_window.offset().left);\n\t\t\t$help_window.css(\"left\", 0);\n\t\t}\n\t\t$help_window.css(\"max-width\", \"\");\n\t}).hide();\n\tadd_toolbar_button(\"Back\", 1, () => {\n\t\t$iframe[0].contentWindow.history.back();\n\t\tignore_one_load = true;\n\t\tback_length -= 1;\n\t\tforward_length += 1;\n\t}, () => back_length > 0);\n\tadd_toolbar_button(\"Forward\", 2, () => {\n\t\t$iframe[0].contentWindow.history.forward();\n\t\tignore_one_load = true;\n\t\tforward_length -= 1;\n\t\tback_length += 1;\n\t}, () => forward_length > 0);\n\tadd_toolbar_button(\"Options\", 3, () => { }, () => false); // @TODO: hotkey and underline on O\n\tadd_toolbar_button(\"Web Help\", 4, () => {\n\t\tiframe.src = \"help/online_support.htm\";\n\t});\n\n\tconst $iframe = $Iframe({ src: \"help/default.html\" }).addClass(\"inset-deep\");\n\tconst iframe = $iframe[0];\n\tiframe.$window = $help_window; // for focus handling integration\n\tconst $resizer = $(E(\"div\")).addClass(\"resizer\");\n\tconst $contents = $(E(\"ul\")).addClass(\"contents inset-deep\");\n\n\t// @TODO: fix race conditions\n\t$iframe.on(\"load\", () => {\n\t\tif (!ignore_one_load) {\n\t\t\tback_length += 1;\n\t\t\tforward_length = 0;\n\t\t}\n\t\t// iframe.contentWindow.location.href\n\t\tignore_one_load = false;\n\t\t$help_window.triggerHandler(\"update-buttons\");\n\t});\n\n\t$main.append($contents, $resizer, $iframe);\n\t$help_window.$content.append($toolbar, $main);\n\n\t$help_window.css({ width: 800, height: 600 });\n\n\t$iframe.attr({ name: \"help-frame\" });\n\t$iframe.css({\n\t\tbackgroundColor: \"white\",\n\t\tborder: \"\",\n\t\tmargin: \"1px\",\n\t});\n\t$contents.css({\n\t\tmargin: \"1px\",\n\t});\n\t$help_window.center();\n\n\t$main.css({\n\t\tposition: \"relative\", // for resizer\n\t});\n\n\tconst resizer_width = 4;\n\t$resizer.css({\n\t\tcursor: \"ew-resize\",\n\t\twidth: resizer_width,\n\t\tboxSizing: \"border-box\",\n\t\tbackground: \"var(--ButtonFace)\",\n\t\tborderLeft: \"1px solid var(--ButtonShadow)\",\n\t\tboxShadow: \"inset 1px 0 0 var(--ButtonHilight)\",\n\t\ttop: 0,\n\t\tbottom: 0,\n\t\tzIndex: 1,\n\t});\n\t$resizer.on(\"pointerdown\", () => {\n\t\tlet pointermove, pointerup;\n\t\tconst getPos = (e) =>\n\t\t\tMath.min($help_window.width() - 100, Math.max(20,\n\t\t\t\te.clientX - $help_window.$content.offset().left\n\t\t\t));\n\t\t$G.on(\"pointermove\", pointermove = (e) => {\n\t\t\t$resizer.css({\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: getPos(e),\n\t\t\t});\n\t\t\t$contents.css({\n\t\t\t\tmarginRight: resizer_width,\n\t\t\t});\n\t\t});\n\t\t$G.on(\"pointerup\", pointerup = (e) => {\n\t\t\t$G.off(\"pointermove\", pointermove);\n\t\t\t$G.off(\"pointerup\", pointerup);\n\t\t\t$resizer.css({\n\t\t\t\tposition: \"\",\n\t\t\t\tleft: \"\",\n\t\t\t});\n\t\t\t$contents.css({\n\t\t\t\tflexBasis: getPos(e) - resizer_width,\n\t\t\t\tmarginRight: \"\",\n\t\t\t});\n\t\t});\n\t});\n\n\tconst parse_object_params = ($object) => {\n\t\t// parse an $(<object>) to a plain object of key value pairs\n\t\tconst object = {};\n\t\tfor (const param of $object.children(\"param\").get()) {\n\t\t\tobject[param.name] = param.value;\n\t\t}\n\t\treturn object;\n\t};\n\n\tlet $last_expanded;\n\n\tconst $Item = (text) => {\n\t\tconst $item = $(E(\"div\")).addClass(\"item\").text(text.trim());\n\t\t$item.on(\"mousedown\", () => {\n\t\t\t$contents.find(\".item\").removeClass(\"selected\");\n\t\t\t$item.addClass(\"selected\");\n\t\t});\n\t\t$item.on(\"click\", () => {\n\t\t\tconst $li = $item.parent();\n\t\t\tif ($li.is(\".folder\")) {\n\t\t\t\tif ($last_expanded) {\n\t\t\t\t\t$last_expanded.not($li).removeClass(\"expanded\");\n\t\t\t\t}\n\t\t\t\t$li.toggleClass(\"expanded\");\n\t\t\t\t$last_expanded = $li;\n\t\t\t}\n\t\t});\n\t\treturn $item;\n\t};\n\n\tconst $default_item_li = $(E(\"li\")).addClass(\"page\");\n\t$default_item_li.append($Item(\"Welcome to Help\").on(\"click\", () => {\n\t\t$iframe.attr({ src: \"help/default.html\" });\n\t}));\n\t$contents.append($default_item_li);\n\n\tfunction renderItem(source_li, $folder_items_ul) {\n\t\tconst object = parse_object_params($(source_li).children(\"object\"));\n\t\tif ($(source_li).find(\"li\").length > 0) {\n\n\t\t\tconst $folder_li = $(E(\"li\")).addClass(\"folder\");\n\t\t\t$folder_li.append($Item(object.Name));\n\t\t\t$contents.append($folder_li);\n\n\t\t\tconst $folder_items_ul = $(E(\"ul\"));\n\t\t\t$folder_li.append($folder_items_ul);\n\n\t\t\t$(source_li).children(\"ul\").children().get().forEach((li) => {\n\t\t\t\trenderItem(li, $folder_items_ul);\n\t\t\t});\n\t\t} else {\n\t\t\tconst $item_li = $(E(\"li\")).addClass(\"page\");\n\t\t\t$item_li.append($Item(object.Name).on(\"click\", () => {\n\t\t\t\t$iframe.attr({ src: `${options.root}/${object.Local}` });\n\t\t\t}));\n\t\t\tif ($folder_items_ul) {\n\t\t\t\t$folder_items_ul.append($item_li);\n\t\t\t} else {\n\t\t\t\t$contents.append($item_li);\n\t\t\t}\n\t\t}\n\t}\n\n\tfetch(options.contentsFile).then((response) => {\n\t\tresponse.text().then((hhc) => {\n\t\t\t$($.parseHTML(hhc)).filter(\"ul\").children().get().forEach((li) => {\n\t\t\t\trenderItem(li, null);\n\t\t\t});\n\t\t}, (error) => {\n\t\t\tshow_error_message(`${localize(\"Failed to launch help.\")} Failed to read ${options.contentsFile}.`, error);\n\t\t});\n\t}, (_error) => {\n\t\t// access to error message is not allowed either, basically\n\t\tif (location.protocol === \"file:\") {\n\t\t\tshowMessageBox({\n\t\t\t\t// <p>${localize(\"Failed to launch help.\")}</p>\n\t\t\t\t// but it's already launched at this point\n\n\t\t\t\t// what's a good tutorial for starting a web server?\n\t\t\t\t// https://gist.github.com/willurd/5720255 - impressive list, but not a tutorial\n\t\t\t\t// https://attacomsian.com/blog/local-web-server - OK, good enough\n\t\t\t\tmessageHTML: `\n\t\t\t\t\t<p>Help is not available when running from the <code>file:</code> protocol.</p>\n\t\t\t\t\t<p>To use this feature, <a href=\"https://attacomsian.com/blog/local-web-server\">start a web server</a>.</p>\n\t\t\t\t`,\n\t\t\t\ticonID: \"error\",\n\t\t\t});\n\t\t} else {\n\t\t\tshow_error_message(`${localize(\"Failed to launch help.\")} ${localize(\"Access to %1 was denied.\", options.contentsFile)}`);\n\t\t}\n\t});\n\n\t// @TODO: keyboard accessability\n\t// $help_window.on(\"keydown\", (e)=> {\n\t// \tswitch(e.keyCode){\n\t// \t\tcase 37:\n\t// \t\t\tshow_error_message(\"MOVE IT\");\n\t// \t\t\tbreak;\n\t// \t}\n\t// });\n\t// var task = new Task($help_window);\n\tvar task = {};\n\ttask.$help_window = $help_window;\n\treturn task;\n}\n\n\nvar programs_being_loaded = 0;\n\n/**\n * @typedef {object} I$Iframe\n * @property {() => void} focus_contents\n * @property {() => void} destroy\n *\n * @param {object} options\n * @param {string} options.src\n *\n * @returns {JQuery<HTMLIFrameElement & {$window: OSGUI$Window}>} $iframe\n */\nfunction $Iframe(options) {\n\tvar $iframe = /** @type {JQuery<HTMLIFrameElement & {$window: OSGUI$Window}> & I$Iframe} */ (\n\t\t$(\"<iframe allowfullscreen sandbox='allow-same-origin allow-scripts allow-forms allow-pointer-lock allow-modals allow-popups allow-downloads'>\")\n\t);\n\tvar iframe = $iframe[0];\n\n\tvar disable_delegate_pointerup = false;\n\n\t$iframe.focus_contents = function () {\n\t\tif (!iframe.contentWindow) {\n\t\t\treturn;\n\t\t}\n\t\tif (iframe.contentDocument.hasFocus()) {\n\t\t\treturn;\n\t\t}\n\n\t\tdisable_delegate_pointerup = true;\n\t\tiframe.contentWindow.focus();\n\t\tsetTimeout(function () {\n\t\t\tiframe.contentWindow.focus();\n\t\t\tdisable_delegate_pointerup = false;\n\t\t});\n\t};\n\n\t// Let the iframe to handle mouseup events outside itself\n\tvar delegate_pointerup = function () {\n\t\tif (disable_delegate_pointerup) {\n\t\t\treturn;\n\t\t}\n\t\t// This try-catch may only be needed for running Cypress tests.\n\t\ttry {\n\t\t\tif (iframe.contentWindow && iframe.contentWindow.jQuery) {\n\t\t\t\tiframe.contentWindow.jQuery(\"body\").trigger(\"pointerup\");\n\t\t\t}\n\t\t\tif (iframe.contentWindow) {\n\t\t\t\tconst event = new iframe.contentWindow.MouseEvent(\"mouseup\", { button: 0 });\n\t\t\t\tiframe.contentWindow.dispatchEvent(event);\n\t\t\t\tconst event2 = new iframe.contentWindow.MouseEvent(\"mouseup\", { button: 2 });\n\t\t\t\tiframe.contentWindow.dispatchEvent(event2);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.log(\"Failed to access iframe to delegate pointerup; got\", error);\n\t\t}\n\t};\n\t$G.on(\"mouseup blur\", delegate_pointerup);\n\t$iframe.destroy = () => {\n\t\t$G.off(\"mouseup blur\", delegate_pointerup);\n\t};\n\n\t// @TODO: delegate pointermove events too?\n\n\t$(\"body\").addClass(\"loading-program\");\n\tprograms_being_loaded += 1;\n\n\t$iframe.on(\"load\", function () {\n\n\t\tif (--programs_being_loaded <= 0) {\n\t\t\t$(\"body\").removeClass(\"loading-program\");\n\t\t}\n\n\t\t// This try-catch may only be needed for running Cypress tests.\n\t\ttry {\n\t\t\tif (window.themeCSSProperties && window.applyTheme) {\n\t\t\t\twindow.applyTheme(window.themeCSSProperties, iframe.contentDocument.documentElement);\n\t\t\t}\n\n\t\t\t// on Wayback Machine, and iframe's url not saved yet\n\t\t\tif (iframe.contentDocument.querySelector(\"#error #livewebInfo.available\")) {\n\t\t\t\tvar message = document.createElement(\"div\");\n\t\t\t\tmessage.style.position = \"absolute\";\n\t\t\t\tmessage.style.left = \"0\";\n\t\t\t\tmessage.style.right = \"0\";\n\t\t\t\tmessage.style.top = \"0\";\n\t\t\t\tmessage.style.bottom = \"0\";\n\t\t\t\tmessage.style.background = \"#c0c0c0\";\n\t\t\t\tmessage.style.color = \"#000\";\n\t\t\t\tmessage.style.padding = \"50px\";\n\t\t\t\tiframe.contentDocument.body.appendChild(message);\n\t\t\t\tmessage.innerHTML = `<a target=\"_blank\">Save this url in the Wayback Machine</a>`;\n\t\t\t\tmessage.querySelector(\"a\").href =\n\t\t\t\t\t\"https://web.archive.org/save/https://98.js.org/\" +\n\t\t\t\t\tiframe.src.replace(/.*https:\\/\\/98.js.org\\/?/, \"\");\n\t\t\t\tmessage.querySelector(\"a\").style.color = \"blue\";\n\t\t\t}\n\n\t\t\tvar $contentWindow = $(iframe.contentWindow);\n\t\t\t$contentWindow.on(\"pointerdown click\", function () {\n\t\t\t\tiframe.$window?.focus();\n\n\t\t\t\t// from close_menus in $MenuBar\n\t\t\t\t$(\".menu-button\").trigger(\"release\");\n\t\t\t\t// Close any rogue floating submenus\n\t\t\t\t$(\".menu-popup\").hide();\n\t\t\t});\n\t\t\t// We want to disable pointer events for other iframes, but not this one\n\t\t\t$contentWindow.on(\"pointerdown\", function () {\n\t\t\t\t$iframe.css(\"pointer-events\", \"all\");\n\t\t\t\t$(\"body\").addClass(\"dragging\");\n\t\t\t});\n\t\t\t$contentWindow.on(\"pointerup\", function () {\n\t\t\t\t$(\"body\").removeClass(\"dragging\");\n\t\t\t\t$iframe.css(\"pointer-events\", \"\");\n\t\t\t});\n\t\t\t// $(\"iframe\").css(\"pointer-events\", \"\"); is called elsewhere.\n\t\t\t// Otherwise iframes would get stuck in this interaction mode\n\n\t\t\tiframe.contentWindow.close = function () {\n\t\t\t\tiframe.$window?.close();\n\t\t\t};\n\t\t\t// @TODO: hook into saveAs (a la FileSaver.js) and another function for opening files\n\t\t\t// iframe.contentWindow.saveAs = function(){\n\t\t\t// \tsaveAsDialog();\n\t\t\t// };\n\n\t\t} catch (error) {\n\t\t\tconsole.log(\"Failed to reach into iframe; got\", error);\n\t\t}\n\t});\n\tif (options.src) {\n\t\t$iframe.attr({ src: options.src });\n\t}\n\t$iframe.css({\n\t\tminWidth: 0,\n\t\tminHeight: 0, // overrides user agent styling apparently, fixes Sound Recorder\n\t\tflex: 1,\n\t\tborder: 0, // overrides user agent styling\n\t});\n\n\treturn $iframe;\n}\n\n// function $IframeWindow(options) {\n\n// \tvar $win = $Window(options);\n\n// \tvar $iframe = $win.$iframe = $Iframe({ src: options.src });\n// \t$win.$content.append($iframe);\n// \tvar iframe = $win.iframe = $iframe[0];\n// \t// @TODO: should I instead of having iframe.$window, have something like get$Window?\n// \t// Where all is $window needed?\n// \t// I know it's used from within the iframe contents as frameElement.$window\n// \tiframe.$window = $win;\n\n// \t$win.on(\"close\", function () {\n// \t\t$iframe.destroy();\n// \t});\n// \t$win.onFocus($iframe.focus_contents);\n\n// \t$iframe.on(\"load\", function () {\n// \t\t$win.show();\n// \t\t$win.focus();\n// \t\t// $iframe.focus_contents();\n// \t});\n\n// \t$win.setInnerDimensions = ({ width, height }) => {\n// \t\tconst width_from_frame = $win.width() - $win.$content.width();\n// \t\tconst height_from_frame = $win.height() - $win.$content.height();\n// \t\t$win.css({\n// \t\t\twidth: width + width_from_frame,\n// \t\t\theight: height + height_from_frame + 21,\n// \t\t});\n// \t};\n// \t$win.setInnerDimensions({\n// \t\twidth: (options.innerWidth || 640),\n// \t\theight: (options.innerHeight || 380),\n// \t});\n// \t$win.$content.css({\n// \t\tdisplay: \"flex\",\n// \t\tflexDirection: \"column\",\n// \t});\n\n// \t// @TODO: cascade windows\n// \t$win.center();\n// \t$win.hide();\n\n// \treturn $win;\n// }\n\n// Fix dragging things (i.e. windows) over iframes (i.e. other windows)\n// (when combined with a bit of css, .dragging iframe { pointer-events: none; })\n// (and a similar thing in $IframeWindow)\n$(window).on(\"pointerdown\", function () {\n\t//console.log(e.type);\n\t$(\"body\").addClass(\"dragging\");\n});\n$(window).on(\"pointerup dragend blur\", function (e) {\n\t//console.log(e.type);\n\tif (e.type === \"blur\") {\n\t\tif (document.activeElement.tagName.match(/iframe/i)) {\n\t\t\treturn;\n\t\t}\n\t}\n\t$(\"body\").removeClass(\"dragging\");\n\t$(\"iframe\").css(\"pointer-events\", \"\");\n});\n\nexport { show_help };\n\n"
  },
  {
    "path": "src/helpers.js",
    "content": "// @ts-check\n\n/* global AccessKeys, main_canvas */\n/* eslint-disable @stylistic/space-unary-ops */\n\nconst TAU =\n\t//                //////|//////                //\n\t//            /////     |     /////            //\n\t//         ///         tau         ///         //\n\t//       ///     ...--> | <--...     ///       //  //\n\t//     ///     -'   one | turn  '-     ///     //  //\n\t//    //     .'         |         '.     //    //  //\n\t//   //     /           |           \\     //   //  //\n\t//  //     |            | <-..       |     //  //  //\n\t//  //    |          .->|     \\       |    //  //  //\n\t//  //    |         /   |      |      |    //  //  //\n\t- - - - - - - - Math.PI + Math.PI - - - - - 0;\n//\t//  //    |         \\   |      |      |    //  //\n//\t//  //    |          '->|     /       |    //  //\n//\t//  //     |            | <-''       |     //  //\n//\t//   //     \\           |           /     //   //\n//\t//    //     '.         |         .'     //    //\n//\t//     ///     -.       |       .-     ///     //\n//\t//       ///     '''----|----'''     ///       //\n//\t//         ///          |          ///         //\n//\t//           //////     |     /////            //\n//\t//                //////|//////          C/r;  //  /////////////\n\nconst is_pride_month = new Date().getMonth() === 5; // June (0-based, 0 is January)\n\nconst query_params = new URLSearchParams(window.location.search);\nexport const is_discord_embed = query_params.get(\"frame_id\") != null;\n\nconst $G = $(window);\n\n/**\n * Wrapper for AccessKeys.toHTML that ensures whitespace isn't collapsed in cases like \"Fox &Trot\" or \"Fo&x Trot\" where the access key abuts a space.\n *\n * (Actually a simple `<span>` may be enough (since it's an inline element?), but `white-space: pre` is more explicit.)\n *\n * @param {string} label  text with an access key denoted by an ampersand (can escape with double ampersand)\n * @returns {string}  HTML for label with access key underlined\n */\nfunction render_access_key(label) {\n\treturn `<span style=\"white-space: pre\">${AccessKeys.toHTML(label)}</span>`;\n}\n\n/**\n * @param {string} name  filename without extension\n * @param {[number, number]} coords  hotspot coordinates\n * @param {string} fallback  fallback cursor value\n * @returns {string}  CSS `cursor` value\n */\nfunction make_css_cursor(name, coords, fallback) {\n\treturn `url(images/cursors/${name}.png) ${coords.join(\" \")}, ${fallback}`;\n}\n\n/**\n * @type {typeof document.createElement}\n */\nconst E = function E(t) {\n\treturn document.createElement(t);\n};\n\n/**\n * @template {any[]} A\n * @param {(...args: A)=> void} func  function to debounce\n * @param {number} wait_ms  minimum milliseconds between invocations\n * @param {boolean=} immediate  trigger the function on the leading edge, instead of the trailing.\n * @returns {((...args: A)=> void) & {cancel: ()=> void}}  a function, that, as long as it continues to be invoked, will not be triggered.\n *   The function will be called after it stops being called for `wait_ms` milliseconds.\n *\n * @example\n * window.addEventListener(\"resize\", debounce(() => {\n *  console.log(window.innerWidth);\n * }, 250));\n */\nfunction debounce(func, wait_ms, immediate) {\n\tlet timeout;\n\tconst debounced_func = function () {\n\t\t// eslint-disable-next-line no-invalid-this\n\t\tconst context = this;\n\t\tconst args = arguments;\n\n\t\tconst later = () => {\n\t\t\ttimeout = null;\n\t\t\tif (!immediate) {\n\t\t\t\tfunc.apply(context, args);\n\t\t\t}\n\t\t};\n\n\t\tconst callNow = immediate && !timeout;\n\n\t\tclearTimeout(timeout);\n\n\t\ttimeout = setTimeout(later, wait_ms);\n\n\t\tif (callNow) {\n\t\t\tfunc.apply(context, args);\n\t\t}\n\t};\n\tdebounced_func.cancel = () => {\n\t\tclearTimeout(timeout);\n\t};\n\treturn debounced_func;\n}\n\n/**\n * @template {any[]} A - The type of the arguments to the function\n * @template {any} R - The return type of the function\n * @param {(...args: A) => R} func - The function to memoize.\n * @param {number} [max_entries=50000] - The maximum number of entries to store in the cache.\n * @returns {((...args: A) => R) & { clear_memo_cache: () => void }} - The memoized function, with an extra `clear_memo_cache` method.\n */\nfunction memoize_synchronous_function(func, max_entries = 50000) {\n\tconst cache = {};\n\tconst keys = [];\n\tconst memoized_func = (...args) => {\n\t\tif (args.some((arg) => arg instanceof CanvasPattern)) {\n\t\t\treturn func.apply(null, args);\n\t\t}\n\t\tconst key = JSON.stringify(args);\n\t\tif (cache[key]) {\n\t\t\treturn cache[key];\n\t\t} else {\n\t\t\tconst val = func.apply(null, args);\n\t\t\tcache[key] = val;\n\t\t\tkeys.push(key);\n\t\t\tif (keys.length > max_entries) {\n\t\t\t\tconst oldest_key = keys.shift();\n\t\t\t\tdelete cache[oldest_key];\n\t\t\t}\n\t\t\treturn val;\n\t\t}\n\t};\n\tmemoized_func.clear_memo_cache = () => {\n\t\tfor (const key of keys) {\n\t\t\tdelete cache[key];\n\t\t}\n\t\tkeys.length = 0;\n\t};\n\treturn memoized_func;\n}\n\n/**\n * @param {string | CanvasPattern | CanvasGradient} color  CSS color value (or pattern/gradient, which will be sampled from a 1x1 canvas)\n * @returns {[number, number, number, number]}  [r, g, b, a] values ranging from 0 to 255\n * @example\n * const [r, g, b, a] = get_rgba_from_color(\"rgba(255, 0, 0, 0.5)\");\n * console.log(r, g, b, a); // 255, 0, 0, 128\n */\nconst get_rgba_from_color_implementation = (color) => {\n\tconst single_pixel_canvas = make_canvas(1, 1);\n\n\tsingle_pixel_canvas.ctx.fillStyle = color;\n\tsingle_pixel_canvas.ctx.fillRect(0, 0, 1, 1);\n\n\tconst image_data = single_pixel_canvas.ctx.getImageData(0, 0, 1, 1);\n\n\t// We could just return image_data.data, but let's return an Array instead\n\t// I'm not totally sure image_data.data wouldn't keep the ImageData object around in memory\n\treturn /** @type {[number, number, number, number]} */ (Array.from(image_data.data));\n\t// Equivalently:\n\t// return [image_data.data[0], image_data.data[1], image_data.data[2], image_data.data[3]];\n};\nconst get_rgba_from_color = memoize_synchronous_function(get_rgba_from_color_implementation);\n\n/**\n * Compare two ImageData.\n * Note: putImageData is lossy, due to premultiplied alpha.\n * @param {ImageData} a\n * @param {ImageData} b\n * @param {number} threshold  maximum difference in channel values\n * @returns {boolean} whether all pixels match within the specified threshold\n*/\nfunction image_data_match(a, b, threshold) {\n\tconst a_data = a.data;\n\tconst b_data = b.data;\n\tif (a_data.length !== b_data.length) {\n\t\treturn false;\n\t}\n\tfor (let len = a_data.length, i = 0; i < len; i++) {\n\t\tif (a_data[i] !== b_data[i]) {\n\t\t\tif (Math.abs(a_data[i] - b_data[i]) > threshold) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * @overload\n * @param {number} width\n * @param {number} height\n * @returns {PixelCanvas}  a new canvas element, augmented with `ctx` property, which is also augmented\n */\n/**\n * @overload\n * @param {HTMLImageElement | HTMLCanvasElement | ImageData} source  image to copy\n * @returns {PixelCanvas}  a new canvas element, augmented with `ctx` property, which is also augmented\n */\n/**\n * @overload\n * @returns {PixelCanvas}  a new canvas element, augmented with `ctx` property, which is also augmented\n */\nfunction make_canvas(width, height) {\n\tconst image = width;\n\n\n\tconst new_canvas = /** @type {PixelCanvas} */ (E(\"canvas\"));\n\tconst new_ctx = /** @type {PixelContext} */ (new_canvas.getContext(\"2d\"));\n\n\tnew_canvas.ctx = new_ctx;\n\n\tnew_ctx.disable_image_smoothing = () => {\n\t\tnew_ctx.imageSmoothingEnabled = false;\n\t\t// condition is to avoid a deprecation warning in Firefox\n\t\tif (new_ctx.imageSmoothingEnabled !== false) {\n\t\t\t// @ts-ignore\n\t\t\tnew_ctx.mozImageSmoothingEnabled = false;\n\t\t\t// @ts-ignore\n\t\t\tnew_ctx.webkitImageSmoothingEnabled = false;\n\t\t\t// @ts-ignore\n\t\t\tnew_ctx.msImageSmoothingEnabled = false;\n\t\t}\n\t};\n\tnew_ctx.enable_image_smoothing = () => {\n\t\tnew_ctx.imageSmoothingEnabled = true;\n\t\tif (new_ctx.imageSmoothingEnabled !== true) {\n\t\t\t// @ts-ignore\n\t\t\tnew_ctx.mozImageSmoothingEnabled = true;\n\t\t\t// @ts-ignore\n\t\t\tnew_ctx.webkitImageSmoothingEnabled = true;\n\t\t\t// @ts-ignore\n\t\t\tnew_ctx.msImageSmoothingEnabled = true;\n\t\t}\n\t};\n\n\t// @TODO: simplify the abstraction by defining setters for width/height\n\t// that reset the image smoothing to disabled\n\t// and make image smoothing a parameter to make_canvas\n\n\tnew_ctx.copy = (image) => {\n\t\t// @ts-ignore\n\t\tnew_canvas.width = image.naturalWidth || image.width;\n\t\t// @ts-ignore\n\t\tnew_canvas.height = image.naturalHeight || image.height;\n\n\t\t// setting width/height resets image smoothing (along with everything)\n\t\tnew_ctx.disable_image_smoothing();\n\n\t\tif (image instanceof ImageData) {\n\t\t\tnew_ctx.putImageData(image, 0, 0);\n\t\t} else {\n\t\t\tnew_ctx.drawImage(image, 0, 0);\n\t\t}\n\t};\n\n\tif (width && height) {\n\t\t// make_canvas(width, height)\n\t\tnew_canvas.width = width;\n\t\tnew_canvas.height = height;\n\t\t// setting width/height resets image smoothing (along with everything)\n\t\tnew_ctx.disable_image_smoothing();\n\t} else if (image) {\n\t\t// make_canvas(image)\n\t\tnew_ctx.copy(image);\n\t}\n\n\treturn new_canvas;\n}\n\n/**\n * @param {string} file_name  name of an image file in the help/ folder, including extension\n * @returns {HTMLImageElement}  an image element\n */\nfunction get_help_folder_icon(file_name) {\n\tconst icon_img = new Image();\n\ticon_img.src = `help/${file_name}`;\n\treturn icon_img;\n}\n\n/**\n * @param {Tool} tool\n * @returns {HTMLImageElement}  an image element representing the tool\n */\nfunction get_icon_for_tool(tool) {\n\treturn get_help_folder_icon(tool.help_icon);\n}\n\n/**\n * not to be confused with load_image_from_uri\n * @param {string} src  URI of an image\n * @returns {Promise<HTMLImageElement>}  an image element\n */\nfunction load_image_simple(src) {\n\treturn new Promise((resolve, reject) => {\n\t\tconst img = new Image();\n\n\t\timg.onload = () => { resolve(img); };\n\t\timg.onerror = () => { reject(new Error(`failed to load image from ${src}`)); };\n\n\t\timg.src = src;\n\t});\n}\n\n/**\n * @param {Tool[]} tools  an array of selected tools\n * @returns {HTMLImageElement | HTMLCanvasElement}  an icon representing the tools\n */\nfunction get_icon_for_tools(tools) {\n\tif (tools.length === 1) {\n\t\treturn get_icon_for_tool(tools[0]);\n\t}\n\tconst icon_canvas = make_canvas(16, 16);\n\n\tPromise.all(tools.map((tool) => load_image_simple(`help/${tool.help_icon}`)))\n\t\t.then((icons) => {\n\t\t\ticons.forEach((icon, i) => {\n\t\t\t\tconst w = icon_canvas.width / icons.length;\n\t\t\t\tconst x = i * w;\n\t\t\t\tconst h = icon_canvas.height;\n\t\t\t\tconst y = 0;\n\t\t\t\ticon_canvas.ctx.drawImage(icon, x, y, w, h, x, y, w, h);\n\t\t\t});\n\t\t});\n\treturn icon_canvas;\n}\n\n/**\n * does NOT accept a file extension itself as input - if input does not have a dot, returns empty string\n * @param {string} file_path_or_name  path or name of a file\n * @returns {string}  file extension without the dot\n */\nfunction get_file_extension(file_path_or_name) {\n\treturn file_path_or_name.match(/\\.([^./]+)$/)?.[1] || \"\";\n}\n\n/**\n * accepts a file extension as input, or a file name, or path\n * @template {FileFormat} T\n * @param {T[]} formats\n * @param {string} file_path_or_name_or_ext  file path, name, or extension\n * @returns {T}  format object\n */\nfunction get_format_from_extension(formats, file_path_or_name_or_ext) {\n\tconst ext_match = file_path_or_name_or_ext.match(/\\.([^.]+)$/);\n\tconst ext = ext_match ? ext_match[1].toLowerCase() : file_path_or_name_or_ext; // excluding dot\n\tfor (const format of formats) {\n\t\tif (format.extensions.includes(ext)) {\n\t\t\treturn format;\n\t\t}\n\t}\n}\n\n/**\n * Converts an RGB color value to HSL. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n * Assumes r, g, and b are contained in the set [0, 255] and\n * returns h, s, and l in the set [0, 1].\n *\n * @param   {number}  r  The red color value\n * @param   {number}  g  The green color value\n * @param   {number}  b  The blue color value\n * @return  {[number, number, number]}  The HSL representation\n */\nfunction rgb_to_hsl(r, g, b) {\n\tr /= 255; g /= 255; b /= 255;\n\n\tvar max = Math.max(r, g, b), min = Math.min(r, g, b);\n\tvar h, s, l = (max + min) / 2;\n\n\tif (max == min) {\n\t\th = s = 0; // achromatic\n\t} else {\n\t\tvar d = max - min;\n\t\ts = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n\t\tswitch (max) {\n\t\t\tcase r: h = (g - b) / d + (g < b ? 6 : 0); break;\n\t\t\tcase g: h = (b - r) / d + 2; break;\n\t\t\tcase b: h = (r - g) / d + 4; break;\n\t\t}\n\n\t\th /= 6;\n\t}\n\n\treturn [h, s, l];\n}\n\n// #region Coordinate Transformations\n/**\n * @param {{ clientX: number, clientY: number }} client_point e.g. a MouseEvent\n * @returns {{ x: number, y: number }} canvas coordinates\n */\nfunction to_canvas_coords({ clientX, clientY }) {\n\tif (clientX === undefined || clientY === undefined) {\n\t\tthrow new TypeError(\"clientX and clientY must be defined (not {x, y} or x, y or [x, y])\");\n\t}\n\tconst rect = window.canvas_bounding_client_rect;\n\treturn {\n\t\tx: ~~((clientX - rect.left) / rect.width * main_canvas.width),\n\t\ty: ~~((clientY - rect.top) / rect.height * main_canvas.height),\n\t};\n}\n/**\n * @param {{ x: number, y: number }} canvas_point\n * @returns {{ clientX: number, clientY: number }} client coordinates\n */\nfunction from_canvas_coords({ x, y }) {\n\tconst rect = window.canvas_bounding_client_rect;\n\treturn {\n\t\tclientX: ~~(x / main_canvas.width * rect.width + rect.left),\n\t\tclientY: ~~(y / main_canvas.height * rect.height + rect.top),\n\t};\n}\n// #endregion\n\nexport {\n\t$G,\n\tE,\n\tTAU,\n\tdebounce,\n\tfrom_canvas_coords,\n\tget_file_extension,\n\tget_format_from_extension,\n\tget_help_folder_icon,\n\tget_icon_for_tool,\n\tget_icon_for_tools,\n\tget_rgba_from_color,\n\timage_data_match,\n\tis_pride_month,\n\tload_image_simple,\n\tmake_canvas,\n\tmake_css_cursor,\n\tmemoize_synchronous_function,\n\trender_access_key,\n\trgb_to_hsl,\n\tto_canvas_coords\n};\n// Temporary globals until all dependent code is converted to ES Modules\nwindow.$G = $G; // used by app-localization.js\nwindow.make_canvas = make_canvas; // used by app-state.js, electron-injected.js\nwindow.get_format_from_extension = get_format_from_extension; // used by electron-injected.js\n"
  },
  {
    "path": "src/image-manipulation.js",
    "content": "// @ts-check\n// eslint-disable-next-line no-unused-vars\n/* global saved:writable, brush_size:writable, pencil_size:writable, stroke_size:writable */\n/* global $canvas_area, aliasing, localize, main_canvas, main_ctx, palette, selected_colors, selection, stroke_color, transparency */\n// import { localize } from \"./app-localization.js\";\nimport { cancel, deselect, detect_monochrome, show_error_message, undoable, update_title } from \"./functions.js\";\nimport { $G, TAU, get_help_folder_icon, get_rgba_from_color, make_canvas, memoize_synchronous_function } from \"./helpers.js\";\n\nconst fill_threshold = 1; // 1 is just enough for a workaround for Brave browser's farbling: https://github.com/1j01/jspaint/issues/184\n\n/**\n * Calculates the canvas size required for a brush based on the brush size and shape.\n *\n * @param {number} brush_size - The size of the brush.\n * @param {BrushShape} [brush_shape] - The shape of the brush.\n * @returns {number} The canvas width/height required for the brush.\n */\nfunction get_brush_canvas_size(brush_size, brush_shape) {\n\t// brush_shape optional, only matters if it's circle\n\t// @TODO: does it actually still matter? the ellipse drawing code has changed\n\n\t// round to nearest even number in order for the canvas to be drawn centered at a point reasonably\n\treturn Math.ceil(brush_size * (brush_shape === \"circle\" ? 2.1 : 1) / 2) * 2;\n}\n/**\n * Renders a brush shape onto a canvas for later drawing onto the main canvas.\n *\n * @param {CanvasRenderingContext2D} ctx - The canvas rendering context.\n * @param {BrushShape} shape - The shape of the brush.\n * @param {number} size - The size of the brush.\n */\nfunction render_brush(ctx, shape, size) {\n\t// USAGE NOTE: must be called outside of any other usage of op_canvas (because of draw_ellipse)\n\tif (shape.match(/diagonal/)) {\n\t\tsize -= 0.4;\n\t}\n\n\tconst mid_x = Math.round(ctx.canvas.width / 2);\n\tconst left = Math.round(mid_x - size / 2);\n\tconst right = Math.round(mid_x + size / 2);\n\tconst mid_y = Math.round(ctx.canvas.height / 2);\n\tconst top = Math.round(mid_y - size / 2);\n\tconst bottom = Math.round(mid_y + size / 2);\n\n\tif (shape === \"circle\") {\n\t\t// @TODO: ideally _without_pattern_support\n\t\tdraw_ellipse(ctx, left, top, size, size, false, true);\n\t\t// was useful for testing:\n\t\t// ctx.fillStyle = \"red\";\n\t\t// ctx.fillRect(mid_x, mid_y, 1, 1);\n\t} else if (shape === \"square\") {\n\t\tctx.fillRect(left, top, ~~size, ~~size);\n\t} else if (shape === \"diagonal\") {\n\t\tdraw_line_without_pattern_support(ctx, left, top, right, bottom);\n\t} else if (shape === \"reverse_diagonal\") {\n\t\tdraw_line_without_pattern_support(ctx, left, bottom, right, top);\n\t} else if (shape === \"horizontal\") {\n\t\tdraw_line_without_pattern_support(ctx, left, mid_y, size, mid_y);\n\t} else if (shape === \"vertical\") {\n\t\tdraw_line_without_pattern_support(ctx, mid_x, top, mid_x, size);\n\t}\n}\n\n/**\n * Draws an oval.\n *\n * @param {CanvasRenderingContext2D} ctx - The canvas rendering context.\n * @param {number} x - The x-coordinate of the top-left corner of the ellipse's bounding box.\n * @param {number} y - The y-coordinate of the top-left corner of the ellipse's bounding box.\n * @param {number} w - The width of the ellipse's bounding box.\n * @param {number} h - The height of the ellipse's bounding box.\n * @param {boolean} stroke - Whether to outline the shape.\n * @param {boolean} fill - Whether to fill the shape.\n */\nfunction draw_ellipse(ctx, x, y, w, h, stroke, fill) {\n\tconst center_x = x + w / 2;\n\tconst center_y = y + h / 2;\n\n\tif (aliasing) {\n\t\tconst points = [];\n\t\tconst step = 0.05;\n\t\tfor (let theta = 0; theta < TAU; theta += step) {\n\t\t\tpoints.push({\n\t\t\t\tx: center_x + Math.cos(theta) * w / 2,\n\t\t\t\ty: center_y + Math.sin(theta) * h / 2,\n\t\t\t});\n\t\t}\n\t\tdraw_polygon(ctx, points, stroke, fill);\n\t} else {\n\t\tctx.beginPath();\n\t\tctx.ellipse(center_x, center_y, Math.abs(w / 2), Math.abs(h / 2), 0, 0, TAU, false);\n\t\tctx.stroke();\n\t\tctx.fill();\n\t}\n}\n\n/**\n * Draws a rectangle with rounded corners.\n *\n * @param {CanvasRenderingContext2D} ctx - The canvas rendering context.\n * @param {number} x - The x-coordinate of the top-left corner of the rectangle.\n * @param {number} y - The y-coordinate of the top-left corner of the rectangle.\n * @param {number} width - The width of the rectangle.\n * @param {number} height - The height of the rectangle.\n * @param {number} radius_x - The x-radius of the rounded corners.\n * @param {number} radius_y - The y-radius of the rounded corners.\n * @param {boolean} stroke - Whether to outline the rectangle.\n * @param {boolean} fill - Whether to fill the rectangle.\n */\nfunction draw_rounded_rectangle(ctx, x, y, width, height, radius_x, radius_y, stroke, fill) {\n\n\tif (aliasing) {\n\t\tconst points = [];\n\t\tconst lineTo = (x, y) => {\n\t\t\tpoints.push({ x, y });\n\t\t};\n\t\tconst arc = (x, y, radius_x, radius_y, startAngle, endAngle) => {\n\t\t\tconst step = 0.05;\n\t\t\tfor (let theta = startAngle; theta < endAngle; theta += step) {\n\t\t\t\tpoints.push({\n\t\t\t\t\tx: x + Math.cos(theta) * radius_x,\n\t\t\t\t\ty: y + Math.sin(theta) * radius_y,\n\t\t\t\t});\n\t\t\t}\n\t\t\t// not just doing `theta <= endAngle` above because that doesn't account for floating point rounding errors\n\t\t\tpoints.push({\n\t\t\t\tx: x + Math.cos(endAngle) * radius_x,\n\t\t\t\ty: y + Math.sin(endAngle) * radius_y,\n\t\t\t});\n\t\t};\n\n\t\tconst x2 = x + width;\n\t\tconst y2 = y + height;\n\t\tarc(x2 - radius_x, y + radius_y, radius_x, radius_y, TAU * 3 / 4, TAU);\n\t\tlineTo(x2, y2 - radius_y);\n\t\tarc(x2 - radius_x, y2 - radius_y, radius_x, radius_y, 0, TAU * 1 / 4);\n\t\tlineTo(x + radius_x, y2);\n\t\tarc(x + radius_x, y2 - radius_y, radius_x, radius_y, TAU * 1 / 4, TAU * 1 / 2);\n\t\tlineTo(x, y + radius_y);\n\t\tarc(x + radius_x, y + radius_y, radius_x, radius_y, TAU / 2, TAU * 3 / 4);\n\n\t\tdraw_polygon(ctx, points, stroke, fill);\n\t} else {\n\t\tctx.beginPath();\n\t\tctx.moveTo(x + radius_x, y);\n\t\tctx.lineTo(x + width - radius_x, y);\n\t\tctx.quadraticCurveTo(x + width, y, x + width, y + radius_y);\n\t\tctx.lineTo(x + width, y + height - radius_y);\n\t\tctx.quadraticCurveTo(x + width, y + height, x + width - radius_x, y + height);\n\t\tctx.lineTo(x + radius_x, y + height);\n\t\tctx.quadraticCurveTo(x, y + height, x, y + height - radius_y);\n\t\tctx.lineTo(x, y + radius_y);\n\t\tctx.quadraticCurveTo(x, y, x + radius_x, y);\n\t\tctx.closePath();\n\t\tif (stroke) {\n\t\t\tctx.stroke();\n\t\t}\n\t\tif (fill) {\n\t\t\tctx.fill();\n\t\t}\n\t}\n}\n\n/**\n * Gets the canvas for a brush.\n *\n * USAGE NOTE: must be called outside of any other usage of op_canvas (because of render_brush)\n * @TODO: protect against browser clearing canvases, invalidate cache\n *\n * @param {BrushShape} brush_shape\n * @param {number} brush_size\n * @returns {PixelCanvas}\n */\nconst get_brush_canvas_implementation = (brush_shape, brush_size) => {\n\tconst canvas_size = get_brush_canvas_size(brush_size, brush_shape);\n\n\tconst brush_canvas = make_canvas(canvas_size, canvas_size);\n\n\t// brush_canvas.ctx.fillStyle = brush_canvas.ctx.strokeStyle = \"black\";\n\trender_brush(brush_canvas.ctx, brush_shape, brush_size);\n\n\treturn brush_canvas;\n};\n// Cache size: 12 brush tool options + current brush + current pencil + current eraser + current shape stroke + a few\nconst get_brush_canvas = memoize_synchronous_function(get_brush_canvas_implementation, 20);\n\n$G.on(\"invalidate-brush-canvases\", () => {\n\tget_brush_canvas.clear_memo_cache();\n});\n\n\n/**\n * Stamps a brush canvas onto the specified context at the given coordinates.\n *\n * USAGE NOTE: must be called outside of any other usage of op_canvas (because of render_brush)\n *\n * @param {CanvasRenderingContext2D} ctx - The rendering context to draw on.\n * @param {number} x - The x-coordinate for the center of the brush.\n * @param {number} y - The y-coordinate for the center of the brush.\n * @param {BrushShape} brush_shape - The shape of the brush.\n * @param {number} brush_size - The size of the brush.\n */\nconst stamp_brush_canvas = (ctx, x, y, brush_shape, brush_size) => {\n\tconst brush_canvas = get_brush_canvas(brush_shape, brush_size);\n\n\tconst offset_x = -Math.ceil(brush_canvas.width / 2);\n\tconst offset_y = -Math.ceil(brush_canvas.height / 2);\n\n\tctx.drawImage(brush_canvas, x + offset_x, y + offset_y);\n};\n\n/**\n * Returns the points on the circumference of a brush shape.\n *\n * USAGE NOTE: must be called outside of any other usage of op_canvas (because of render_brush)\n *\n * @param {BrushShape} brush_shape\n * @param {number} brush_size\n * @returns {{ x: number, y: number }[]}\n */\nconst get_circumference_points_for_brush_implementation = (brush_shape, brush_size) => {\n\n\tconst brush_canvas = get_brush_canvas(brush_shape, brush_size);\n\n\tconst image_data = brush_canvas.ctx.getImageData(0, 0, brush_canvas.width, brush_canvas.height);\n\n\tconst at = (x, y) => (\n\t\t// coordinate checking is important so it doesn't wrap (if the brush abuts the edge of the canvas)\n\t\tx >= 0 && y >= 0 &&\n\t\tx < image_data.width && y < image_data.height &&\n\t\timage_data.data[(y * image_data.width + x) * 4 + 3] > 127\n\t);\n\n\tconst offset_x = -Math.ceil(brush_canvas.width / 2);\n\tconst offset_y = -Math.ceil(brush_canvas.height / 2);\n\n\tconst points = [];\n\n\tfor (let x = 0; x < image_data.width; x += 1) {\n\t\tfor (let y = 0; y < image_data.height; y += 1) {\n\t\t\tif (at(x, y) && (\n\t\t\t\t!at(x, y - 1) ||\n\t\t\t\t!at(x, y + 1) ||\n\t\t\t\t!at(x - 1, y) ||\n\t\t\t\t!at(x + 1, y)\n\t\t\t)) {\n\t\t\t\tpoints.push({\n\t\t\t\t\tx: x + offset_x,\n\t\t\t\t\ty: y + offset_y,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\treturn points;\n};\nconst get_circumference_points_for_brush = memoize_synchronous_function(get_circumference_points_for_brush_implementation);\n\n$G.on(\"invalidate-brush-canvases\", () => {\n\tget_circumference_points_for_brush.clear_memo_cache();\n});\n\n\n/** @type {PixelCanvas} */\nlet line_brush_canvas;\n/**\n * Updates the brush canvas used for line drawing.\n *\n * USAGE NOTE: must be called outside of any other usage of op_canvas (because of render_brush)\n *\n * @param {number} stroke_size - The line width of the stroke.\n */\nfunction update_brush_for_drawing_lines(stroke_size) {\n\tif (aliasing && stroke_size > 1) {\n\t\tline_brush_canvas = get_brush_canvas(\"circle\", stroke_size);\n\t}\n}\n\n/**\n * Draws a line on the canvas, without pattern support, only solid colors.\n *\n * @param {CanvasRenderingContext2D} ctx - The 2D rendering context of the canvas.\n * @param {number} x1 - The x-coordinate of the starting point of the line.\n * @param {number} y1 - The y-coordinate of the starting point of the line.\n * @param {number} x2 - The x-coordinate of the ending point of the line.\n * @param {number} y2 - The y-coordinate of the ending point of the line.\n * @param {number} [stroke_size=1] - The line width of the stroke.\n */\nfunction draw_line_without_pattern_support(ctx, x1, y1, x2, y2, stroke_size = 1) {\n\tif (aliasing) {\n\t\tif (stroke_size > 1) {\n\t\t\tbresenham_line(x1, y1, x2, y2, (x, y) => {\n\t\t\t\tctx.drawImage(line_brush_canvas, ~~(x - line_brush_canvas.width / 2), ~~(y - line_brush_canvas.height / 2));\n\t\t\t});\n\t\t} else {\n\t\t\tbresenham_line(x1, y1, x2, y2, (x, y) => {\n\t\t\t\tctx.fillRect(x, y, 1, 1);\n\t\t\t});\n\t\t}\n\t} else {\n\t\tctx.beginPath();\n\t\tctx.moveTo(x1, y1);\n\t\tctx.lineTo(x2, y2);\n\n\t\tctx.lineWidth = stroke_size;\n\t\tctx.lineCap = \"round\";\n\t\tctx.stroke();\n\t\tctx.lineCap = \"butt\";\n\t}\n}\n\n/**\n * Calls the given function for each point along a line segment.\n *\n * @param {number} x1 - The x-coordinate of the starting point.\n * @param {number} y1 - The y-coordinate of the starting point.\n * @param {number} x2 - The x-coordinate of the ending point.\n * @param {number} y2 - The y-coordinate of the ending point.\n * @param {function} callback - A callback function that will be called for each point on the line.\n */\nfunction bresenham_line(x1, y1, x2, y2, callback) {\n\t// Bresenham's line algorithm\n\tx1 = ~~x1; x2 = ~~x2; y1 = ~~y1; y2 = ~~y2;\n\n\tconst dx = Math.abs(x2 - x1);\n\tconst dy = Math.abs(y2 - y1);\n\tconst sx = (x1 < x2) ? 1 : -1;\n\tconst sy = (y1 < y2) ? 1 : -1;\n\tlet err = dx - dy;\n\n\n\twhile (true) {\n\t\tcallback(x1, y1);\n\n\t\tif (x1 === x2 && y1 === y2) break;\n\t\tconst e2 = err * 2;\n\t\tif (e2 > -dy) { err -= dy; x1 += sx; }\n\t\tif (e2 < dx) { err += dx; y1 += sy; }\n\t}\n}\n\n/**\n * Calls the given function for each point along a line segment, moving horizontally and vertically, never diagonally.\n *\n * @param {number} x1 - The x-coordinate of the starting point.\n * @param {number} y1 - The y-coordinate of the starting point.\n * @param {number} x2 - The x-coordinate of the ending point.\n * @param {number} y2 - The y-coordinate of the ending point.\n * @param {function} callback - The callback function to be called for each point on the line.\n */\nfunction bresenham_dense_line(x1, y1, x2, y2, callback) {\n\t// Bresenham's line algorithm with a callback between going horizontal and vertical\n\tx1 = ~~x1; x2 = ~~x2; y1 = ~~y1; y2 = ~~y2;\n\n\tconst dx = Math.abs(x2 - x1);\n\tconst dy = Math.abs(y2 - y1);\n\tconst sx = (x1 < x2) ? 1 : -1;\n\tconst sy = (y1 < y2) ? 1 : -1;\n\tlet err = dx - dy;\n\n\n\twhile (true) {\n\t\tcallback(x1, y1);\n\n\t\tif (x1 === x2 && y1 === y2) break;\n\t\tconst e2 = err * 2;\n\t\tif (e2 > -dy) { err -= dy; x1 += sx; }\n\t\tcallback(x1, y1);\n\t\tif (e2 < dx) { err += dx; y1 += sy; }\n\t}\n}\n\n/**\n * Flood-fills a region of the canvas with a specified solid color.\n *\n * @param {CanvasRenderingContext2D} ctx - The 2D rendering context of the canvas.\n * @param {number} start_x - The starting x-coordinate of the region to flood.\n * @param {number} start_y - The starting y-coordinate of the region to flood.\n * @param {number} fill_r - The red component of the fill color (0-255).\n * @param {number} fill_g - The green component of the fill color (0-255).\n * @param {number} fill_b - The blue component of the fill color (0-255).\n * @param {number} fill_a - The alpha component of the fill color (0-255).\n */\nfunction draw_fill_without_pattern_support(ctx, start_x, start_y, fill_r, fill_g, fill_b, fill_a) {\n\n\t// @TODO: split up processing in case it takes too long?\n\t// progress bar and abort button (outside of image-manipulation.js)\n\t// or at least just free up the main thread every once in a while\n\t// @TODO: speed up with typed arrays? https://hacks.mozilla.org/2011/12/faster-canvas-pixel-manipulation-with-typed-arrays/\n\t// could avoid endianness issues if only copying colors\n\t// the jsperf only shows ~15% improvement\n\t// maybe do something fancier like special-casing large chunks of single-color image\n\t// (octree? or just have a higher level stack of chunks to fill and check at if a chunk is homogeneous)\n\n\tconst c_width = main_canvas.width;\n\tconst c_height = main_canvas.height;\n\tstart_x = Math.max(0, Math.min(Math.floor(start_x), c_width));\n\tstart_y = Math.max(0, Math.min(Math.floor(start_y), c_height));\n\tconst stack = [[start_x, start_y]];\n\tconst id = ctx.getImageData(0, 0, c_width, c_height);\n\tlet pixel_pos = (start_y * c_width + start_x) * 4;\n\tconst start_r = id.data[pixel_pos + 0];\n\tconst start_g = id.data[pixel_pos + 1];\n\tconst start_b = id.data[pixel_pos + 2];\n\tconst start_a = id.data[pixel_pos + 3];\n\n\t// @TODO: Allow flood-filling colors similar within fill threshold.\n\t// Right now it will cause an infinite loop if we don't stop early in this case.\n\t// As of writing, the fill threshold is very low, so this problem is unlikely to be noticed,\n\t// but it would be nice as a user-configurable option.\n\tif (\n\t\tMath.abs(fill_r - start_r) <= fill_threshold &&\n\t\tMath.abs(fill_g - start_g) <= fill_threshold &&\n\t\tMath.abs(fill_b - start_b) <= fill_threshold &&\n\t\tMath.abs(fill_a - start_a) <= fill_threshold\n\t) {\n\t\treturn;\n\t}\n\n\twhile (stack.length) {\n\t\tlet new_pos;\n\t\tlet x;\n\t\tlet y;\n\t\tlet reach_left;\n\t\tlet reach_right;\n\t\tnew_pos = stack.pop();\n\t\tx = new_pos[0];\n\t\ty = new_pos[1];\n\n\t\tpixel_pos = (y * c_width + x) * 4;\n\t\twhile (should_fill_at(pixel_pos)) {\n\t\t\ty--;\n\t\t\tpixel_pos = (y * c_width + x) * 4;\n\t\t}\n\t\treach_left = false;\n\t\treach_right = false;\n\n\t\twhile (true) {\n\t\t\ty++;\n\t\t\tpixel_pos = (y * c_width + x) * 4;\n\n\t\t\tif (!(y < c_height && should_fill_at(pixel_pos))) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdo_fill_at(pixel_pos);\n\n\t\t\tif (x > 0) {\n\t\t\t\tif (should_fill_at(pixel_pos - 4)) {\n\t\t\t\t\tif (!reach_left) {\n\t\t\t\t\t\tstack.push([x - 1, y]);\n\t\t\t\t\t\treach_left = true;\n\t\t\t\t\t}\n\t\t\t\t} else if (reach_left) {\n\t\t\t\t\treach_left = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (x < c_width - 1) {\n\t\t\t\tif (should_fill_at(pixel_pos + 4)) {\n\t\t\t\t\tif (!reach_right) {\n\t\t\t\t\t\tstack.push([x + 1, y]);\n\t\t\t\t\t\treach_right = true;\n\t\t\t\t\t}\n\t\t\t\t} else if (reach_right) {\n\t\t\t\t\treach_right = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpixel_pos += c_width * 4;\n\t\t}\n\t}\n\tctx.putImageData(id, 0, 0);\n\n\tfunction should_fill_at(pixel_pos) {\n\t\treturn (\n\t\t\t// matches start color (i.e. region to fill)\n\t\t\tMath.abs(id.data[pixel_pos + 0] - start_r) <= fill_threshold &&\n\t\t\tMath.abs(id.data[pixel_pos + 1] - start_g) <= fill_threshold &&\n\t\t\tMath.abs(id.data[pixel_pos + 2] - start_b) <= fill_threshold &&\n\t\t\tMath.abs(id.data[pixel_pos + 3] - start_a) <= fill_threshold\n\t\t);\n\t}\n\n\tfunction do_fill_at(pixel_pos) {\n\t\tid.data[pixel_pos + 0] = fill_r;\n\t\tid.data[pixel_pos + 1] = fill_g;\n\t\tid.data[pixel_pos + 2] = fill_b;\n\t\tid.data[pixel_pos + 3] = fill_a;\n\t}\n}\n\n/**\n * Flood-fills a region in the canvas with a specified color or pattern.\n *\n * @param {CanvasRenderingContext2D} ctx - The rendering context of the canvas.\n * @param {number} start_x - The x-coordinate of the starting point of the region.\n * @param {number} start_y - The y-coordinate of the starting point of the region.\n * @param {string | CanvasPattern} swatch - The color or pattern to fill the region with.\n */\nfunction draw_fill(ctx, start_x, start_y, swatch) {\n\tif (typeof swatch === \"string\") {\n\t\tconst fill_rgba = get_rgba_from_color(swatch);\n\t\tdraw_fill_without_pattern_support(ctx, start_x, start_y, fill_rgba[0], fill_rgba[1], fill_rgba[2], fill_rgba[3]);\n\t} else {\n\t\tconst source_canvas = ctx.canvas;\n\t\tconst fill_canvas = make_canvas(source_canvas.width, source_canvas.height);\n\t\tdraw_fill_separately(ctx, fill_canvas.ctx, start_x, start_y, 255, 255, 255, 255);\n\t\treplace_colors_with_swatch(fill_canvas.ctx, swatch, 0, 0);\n\t\tctx.drawImage(fill_canvas, 0, 0);\n\t}\n}\n\n/**\n * Draws a flood-fill region in a separate destination canvas, bounded by sampling from the source canvas.\n *\n * @param {CanvasRenderingContext2D} source_ctx - The source canvas context from which to start filling.\n * @param {CanvasRenderingContext2D} dest_ctx - The destination canvas context in which to fill the region.\n * @param {number} start_x - The x-coordinate of the starting position.\n * @param {number} start_y - The y-coordinate of the starting position.\n * @param {number} fill_r - The red component of the fill color (0-255).\n * @param {number} fill_g - The green component of the fill color (0-255).\n * @param {number} fill_b - The blue component of the fill color (0-255).\n * @param {number} fill_a - The alpha component of the fill color (0-255).\n * @throws {Error} If filling with an alpha of zero, which is not supported.\n */\nfunction draw_fill_separately(source_ctx, dest_ctx, start_x, start_y, fill_r, fill_g, fill_b, fill_a) {\n\tif (fill_a === 0) {\n\t\tthrow new Error(\"Filling with alpha of zero is not supported. Zero alpha is used for detecting whether a pixel has been visited.\");\n\t}\n\tconst c_width = main_canvas.width;\n\tconst c_height = main_canvas.height;\n\tstart_x = Math.max(0, Math.min(Math.floor(start_x), c_width));\n\tstart_y = Math.max(0, Math.min(Math.floor(start_y), c_height));\n\tconst stack = [[start_x, start_y]];\n\tconst source_id = source_ctx.getImageData(0, 0, c_width, c_height);\n\tconst dest_id = dest_ctx.getImageData(0, 0, c_width, c_height);\n\tlet pixel_pos = (start_y * c_width + start_x) * 4;\n\tconst start_r = source_id.data[pixel_pos + 0];\n\tconst start_g = source_id.data[pixel_pos + 1];\n\tconst start_b = source_id.data[pixel_pos + 2];\n\tconst start_a = source_id.data[pixel_pos + 3];\n\n\twhile (stack.length) {\n\t\tlet new_pos;\n\t\tlet x;\n\t\tlet y;\n\t\tlet reach_left;\n\t\tlet reach_right;\n\t\tnew_pos = stack.pop();\n\t\tx = new_pos[0];\n\t\ty = new_pos[1];\n\n\t\tpixel_pos = (y * c_width + x) * 4;\n\t\twhile (should_fill_at(pixel_pos)) {\n\t\t\ty--;\n\t\t\tpixel_pos = (y * c_width + x) * 4;\n\t\t}\n\t\treach_left = false;\n\t\treach_right = false;\n\n\t\twhile (true) {\n\t\t\ty++;\n\t\t\tpixel_pos = (y * c_width + x) * 4;\n\n\t\t\tif (!(y < c_height && should_fill_at(pixel_pos))) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdo_fill_at(pixel_pos);\n\n\t\t\tif (x > 0) {\n\t\t\t\tif (should_fill_at(pixel_pos - 4)) {\n\t\t\t\t\tif (!reach_left) {\n\t\t\t\t\t\tstack.push([x - 1, y]);\n\t\t\t\t\t\treach_left = true;\n\t\t\t\t\t}\n\t\t\t\t} else if (reach_left) {\n\t\t\t\t\treach_left = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (x < c_width - 1) {\n\t\t\t\tif (should_fill_at(pixel_pos + 4)) {\n\t\t\t\t\tif (!reach_right) {\n\t\t\t\t\t\tstack.push([x + 1, y]);\n\t\t\t\t\t\treach_right = true;\n\t\t\t\t\t}\n\t\t\t\t} else if (reach_right) {\n\t\t\t\t\treach_right = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpixel_pos += c_width * 4;\n\t\t}\n\t}\n\tdest_ctx.putImageData(dest_id, 0, 0);\n\n\tfunction should_fill_at(pixel_pos) {\n\t\treturn (\n\t\t\t// not reached yet\n\t\t\tdest_id.data[pixel_pos + 3] === 0 &&\n\t\t\t// and matches start color (i.e. region to fill)\n\t\t\t(\n\t\t\t\tMath.abs(source_id.data[pixel_pos + 0] - start_r) <= fill_threshold &&\n\t\t\t\tMath.abs(source_id.data[pixel_pos + 1] - start_g) <= fill_threshold &&\n\t\t\t\tMath.abs(source_id.data[pixel_pos + 2] - start_b) <= fill_threshold &&\n\t\t\t\tMath.abs(source_id.data[pixel_pos + 3] - start_a) <= fill_threshold\n\t\t\t)\n\t\t);\n\t}\n\n\tfunction do_fill_at(pixel_pos) {\n\t\tdest_id.data[pixel_pos + 0] = fill_r;\n\t\tdest_id.data[pixel_pos + 1] = fill_g;\n\t\tdest_id.data[pixel_pos + 2] = fill_b;\n\t\tdest_id.data[pixel_pos + 3] = fill_a;\n\t}\n}\n\n/**\n * Replaces a specific color globally in the given image data.\n *\n * @param {ImageData} image_data - The image data to manipulate.\n * @param {number} from_r - The red component of the color to replace.\n * @param {number} from_g - The green component of the color to replace.\n * @param {number} from_b - The blue component of the color to replace.\n * @param {number} from_a - The alpha component of the color to replace.\n * @param {number} to_r - The red component of the new color.\n * @param {number} to_g - The green component of the new color.\n * @param {number} to_b - The blue component of the new color.\n * @param {number} to_a - The alpha component of the new color.\n */\nfunction replace_color_globally(image_data, from_r, from_g, from_b, from_a, to_r, to_g, to_b, to_a) {\n\tif (\n\t\tfrom_r === to_r &&\n\t\tfrom_g === to_g &&\n\t\tfrom_b === to_b &&\n\t\tfrom_a === to_a\n\t) {\n\t\treturn;\n\t}\n\tconst { data } = image_data;\n\tfor (let i = 0; i < data.length; i += 4) {\n\t\tif (\n\t\t\tMath.abs(data[i + 0] - from_r) <= fill_threshold &&\n\t\t\tMath.abs(data[i + 1] - from_g) <= fill_threshold &&\n\t\t\tMath.abs(data[i + 2] - from_b) <= fill_threshold &&\n\t\t\tMath.abs(data[i + 3] - from_a) <= fill_threshold\n\t\t) {\n\t\t\tdata[i + 0] = to_r;\n\t\t\tdata[i + 1] = to_g;\n\t\t\tdata[i + 2] = to_b;\n\t\t\tdata[i + 3] = to_a;\n\t\t}\n\t}\n}\n\n/**\n * Creates a mask for a specific color in the given image data, as separate destination image data.\n *\n * @param {ImageData} source_image_data - The source image data containing the color to be found.\n * @param {ImageData} dest_image_data - The destination image data where the mask will be created.\n * @param {number} find_r - The red component of the color to be found.\n * @param {number} find_g - The green component of the color to be found.\n * @param {number} find_b - The blue component of the color to be found.\n * @param {number} find_a - The alpha component of the color to be found.\n */\nfunction find_color_globally(source_image_data, dest_image_data, find_r, find_g, find_b, find_a) {\n\tconst source_data = source_image_data.data;\n\tconst dest_data = dest_image_data.data;\n\tfor (let i = 0; i < source_data.length; i += 4) {\n\t\tif (\n\t\t\tMath.abs(source_data[i + 0] - find_r) <= fill_threshold &&\n\t\t\tMath.abs(source_data[i + 1] - find_g) <= fill_threshold &&\n\t\t\tMath.abs(source_data[i + 2] - find_b) <= fill_threshold &&\n\t\t\tMath.abs(source_data[i + 3] - find_a) <= fill_threshold\n\t\t) {\n\t\t\tdest_data[i + 0] = 255;\n\t\t\tdest_data[i + 1] = 255;\n\t\t\tdest_data[i + 2] = 255;\n\t\t\tdest_data[i + 3] = 255;\n\t\t}\n\t}\n}\n\n/**\n * Replaces a color globally on the canvas with the specified solid color.\n *\n * @param {CanvasRenderingContext2D} ctx - The canvas rendering context.\n * @param {number} x - The x-coordinate of the color to replace.\n * @param {number} y - The y-coordinate of the color to replace.\n * @param {number} fill_r - The red component of the new color.\n * @param {number} fill_g - The green component of the new color.\n * @param {number} fill_b - The blue component of the new color.\n * @param {number} fill_a - The alpha component of the new color.\n */\nfunction draw_noncontiguous_fill_without_pattern_support(ctx, x, y, fill_r, fill_g, fill_b, fill_a) {\n\tx = Math.max(0, Math.min(Math.floor(x), ctx.canvas.width));\n\ty = Math.max(0, Math.min(Math.floor(y), ctx.canvas.height));\n\tconst image_data = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);\n\tconst start_index = (y * image_data.width + x) * 4;\n\tconst start_r = image_data.data[start_index + 0];\n\tconst start_g = image_data.data[start_index + 1];\n\tconst start_b = image_data.data[start_index + 2];\n\tconst start_a = image_data.data[start_index + 3];\n\n\treplace_color_globally(image_data, start_r, start_g, start_b, start_a, fill_r, fill_g, fill_b, fill_a);\n\n\tctx.putImageData(image_data, 0, 0);\n}\n\n/**\n * Replaces a color globally on the canvas with the specified color or pattern.\n *\n * @param {CanvasRenderingContext2D} ctx - The canvas rendering context.\n * @param {number} x - The x-coordinate of the color to replace.\n * @param {number} y - The y-coordinate of the color to replace.\n * @param {string | CanvasPattern} swatch - The color or pattern to replace the color with.\n */\nfunction draw_noncontiguous_fill(ctx, x, y, swatch) {\n\tif (typeof swatch === \"string\") {\n\t\tconst fill_rgba = get_rgba_from_color(swatch);\n\t\tdraw_noncontiguous_fill_without_pattern_support(ctx, x, y, fill_rgba[0], fill_rgba[1], fill_rgba[2], fill_rgba[3]);\n\t} else {\n\t\tconst source_canvas = ctx.canvas;\n\t\tconst fill_canvas = make_canvas(source_canvas.width, source_canvas.height);\n\t\tdraw_noncontiguous_fill_separately(ctx, fill_canvas.ctx, x, y);\n\t\treplace_colors_with_swatch(fill_canvas.ctx, swatch, 0, 0);\n\t\tctx.drawImage(fill_canvas, 0, 0);\n\t}\n}\n\n/**\n * Creates a mask for a specific color in the given canvas context, within a separate destination context.\n *\n * @param {CanvasRenderingContext2D} source_ctx - The source canvas context.\n * @param {CanvasRenderingContext2D} dest_ctx - The destination canvas context.\n * @param {number} x - The x-coordinate of the color to create a mask for.\n * @param {number} y - The y-coordinate of the color to create a mask for.\n */\nfunction draw_noncontiguous_fill_separately(source_ctx, dest_ctx, x, y) {\n\tx = Math.max(0, Math.min(Math.floor(x), source_ctx.canvas.width));\n\ty = Math.max(0, Math.min(Math.floor(y), source_ctx.canvas.height));\n\tconst source_image_data = source_ctx.getImageData(0, 0, source_ctx.canvas.width, source_ctx.canvas.height);\n\tconst dest_image_data = dest_ctx.getImageData(0, 0, dest_ctx.canvas.width, dest_ctx.canvas.height);\n\tconst start_index = (y * source_image_data.width + x) * 4;\n\tconst start_r = source_image_data.data[start_index + 0];\n\tconst start_g = source_image_data.data[start_index + 1];\n\tconst start_b = source_image_data.data[start_index + 2];\n\tconst start_a = source_image_data.data[start_index + 3];\n\n\tfind_color_globally(source_image_data, dest_image_data, start_r, start_g, start_b, start_a);\n\n\tdest_ctx.putImageData(dest_image_data, 0, 0);\n}\n\n/**\n * Applies an image transformation to the selection, if it exists, or otherwise the whole document.\n *\n * The transformation function can change the size of the new canvas, and it will update the selection or document accordingly.\n *\n * @param {{name: string, icon: HTMLImageElement | HTMLCanvasElement}} meta - object containing the name and icon for undo history.\n * @param {(original_canvas: PixelCanvas, original_ctx: PixelContext, new_canvas: PixelCanvas, new_ctx: PixelContext) => void} fn - The image transformation function to apply.\n */\nfunction apply_image_transformation(meta, fn) {\n\tconst original_canvas = selection ? selection.source_canvas : main_canvas;\n\n\tconst new_canvas = make_canvas(original_canvas.width, original_canvas.height);\n\n\tconst original_ctx = original_canvas.ctx;\n\tconst new_ctx = new_canvas.ctx;\n\n\tfn(original_canvas, original_ctx, new_canvas, new_ctx);\n\n\tif (selection) {\n\t\tundoable({\n\t\t\tname: `${meta.name} (${localize(\"Selection\")})`,\n\t\t\ticon: meta.icon,\n\t\t\tsoft: true,\n\t\t}, () => {\n\t\t\tselection.replace_source_canvas(new_canvas);\n\t\t});\n\t} else {\n\t\tdeselect();\n\t\tcancel();\n\t\tundoable({\n\t\t\tname: meta.name,\n\t\t\ticon: meta.icon,\n\t\t}, () => {\n\t\t\tsaved = false;\n\t\t\tupdate_title();\n\n\t\t\tmain_ctx.copy(new_canvas);\n\n\t\t\t// $canvas.trigger(\"update\"); // update handles\n\t\t\t$canvas_area.trigger(\"resize\"); // update handles and magnified canvas size (CSS width/height)\n\t\t});\n\t}\n}\n\nfunction flip_horizontal() {\n\tapply_image_transformation({\n\t\tname: localize(\"Flip horizontal\"),\n\t\ticon: get_help_folder_icon(\"p_fliph.png\"),\n\t}, (original_canvas, _original_ctx, new_canvas, new_ctx) => {\n\t\tnew_ctx.translate(new_canvas.width, 0);\n\t\tnew_ctx.scale(-1, 1);\n\t\tnew_ctx.drawImage(original_canvas, 0, 0);\n\t});\n}\n\nfunction flip_vertical() {\n\tapply_image_transformation({\n\t\tname: localize(\"Flip vertical\"),\n\t\ticon: get_help_folder_icon(\"p_flipv.png\"),\n\t}, (original_canvas, _original_ctx, new_canvas, new_ctx) => {\n\t\tnew_ctx.translate(0, new_canvas.height);\n\t\tnew_ctx.scale(1, -1);\n\t\tnew_ctx.drawImage(original_canvas, 0, 0);\n\t});\n}\n\n/**\n * Rotates the image (or selection) by the specified angle.\n *\n * @param {number} angle - The angle of rotation in radians.\n */\nfunction rotate(angle) {\n\tapply_image_transformation({\n\t\tname: `${localize(\"Rotate by angle\")} ${angle / TAU * 360} ${localize(\"Degrees\")}`,\n\t\ticon: get_help_folder_icon(`p_rotate_${angle >= 0 ? \"cw\" : \"ccw\"}.png`),\n\t}, (original_canvas, _original_ctx, new_canvas, new_ctx) => {\n\t\tnew_ctx.save();\n\t\tswitch (angle) {\n\t\t\tcase TAU / 4:\n\t\t\tcase TAU * -3 / 4:\n\t\t\t\tnew_canvas.width = original_canvas.height;\n\t\t\t\tnew_canvas.height = original_canvas.width;\n\t\t\t\tnew_ctx.disable_image_smoothing();\n\t\t\t\tnew_ctx.translate(new_canvas.width, 0);\n\t\t\t\tnew_ctx.rotate(TAU / 4);\n\t\t\t\tbreak;\n\t\t\tcase TAU / 2:\n\t\t\tcase TAU / -2:\n\t\t\t\tnew_ctx.translate(new_canvas.width, new_canvas.height);\n\t\t\t\tnew_ctx.rotate(TAU / 2);\n\t\t\t\tbreak;\n\t\t\tcase TAU * 3 / 4:\n\t\t\tcase TAU / -4:\n\t\t\t\tnew_canvas.width = original_canvas.height;\n\t\t\t\tnew_canvas.height = original_canvas.width;\n\t\t\t\tnew_ctx.disable_image_smoothing();\n\t\t\t\tnew_ctx.translate(0, new_canvas.height);\n\t\t\t\tnew_ctx.rotate(TAU / -4);\n\t\t\t\tbreak;\n\t\t\tdefault: {\n\t\t\t\tconst w = original_canvas.width;\n\t\t\t\tconst h = original_canvas.height;\n\n\t\t\t\tlet bb_min_x = +Infinity;\n\t\t\t\tlet bb_max_x = -Infinity;\n\t\t\t\tlet bb_min_y = +Infinity;\n\t\t\t\tlet bb_max_y = -Infinity;\n\t\t\t\tconst corner = (x01, y01) => {\n\t\t\t\t\tconst x = Math.sin(-angle) * h * x01 + Math.cos(+angle) * w * y01;\n\t\t\t\t\tconst y = Math.sin(+angle) * w * y01 + Math.cos(-angle) * h * x01;\n\t\t\t\t\tbb_min_x = Math.min(bb_min_x, x);\n\t\t\t\t\tbb_max_x = Math.max(bb_max_x, x);\n\t\t\t\t\tbb_min_y = Math.min(bb_min_y, y);\n\t\t\t\t\tbb_max_y = Math.max(bb_max_y, y);\n\t\t\t\t};\n\n\t\t\t\tcorner(0, 0);\n\t\t\t\tcorner(0, 1);\n\t\t\t\tcorner(1, 0);\n\t\t\t\tcorner(1, 1);\n\n\t\t\t\tconst bb_x = bb_min_x;\n\t\t\t\tconst bb_y = bb_min_y;\n\t\t\t\tconst bb_w = bb_max_x - bb_min_x;\n\t\t\t\tconst bb_h = bb_max_y - bb_min_y;\n\n\t\t\t\tnew_canvas.width = bb_w;\n\t\t\t\tnew_canvas.height = bb_h;\n\t\t\t\tnew_ctx.disable_image_smoothing();\n\n\t\t\t\tif (!transparency) {\n\t\t\t\t\tnew_ctx.fillStyle = selected_colors.background;\n\t\t\t\t\tnew_ctx.fillRect(0, 0, new_canvas.width, new_canvas.height);\n\t\t\t\t}\n\n\t\t\t\tnew_ctx.translate(-bb_x, -bb_y);\n\t\t\t\tnew_ctx.rotate(angle);\n\t\t\t\tnew_ctx.drawImage(original_canvas, 0, 0, w, h);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tnew_ctx.drawImage(original_canvas, 0, 0);\n\t\tnew_ctx.restore();\n\t});\n}\n\n/**\n * Applies a stretch and skew transformation to the image (or selection).\n *\n * @param {number} x_scale - The horizontal scale factor.\n * @param {number} y_scale - The vertical scale factor.\n * @param {number} h_skew - The horizontal skew angle in radians.\n * @param {number} v_skew - The vertical skew angle in radians.\n */\nfunction stretch_and_skew(x_scale, y_scale, h_skew, v_skew) {\n\tapply_image_transformation({\n\t\tname:\n\t\t\t(h_skew !== 0 || v_skew !== 0) ? (\n\t\t\t\t(x_scale !== 1 || y_scale !== 1) ? localize(\"Stretch and Skew\") : localize(\"Skew\")\n\t\t\t) : localize(\"Stretch\"),\n\t\ticon: get_help_folder_icon(\n\t\t\t(h_skew !== 0) ? \"p_skew_h.png\" :\n\t\t\t\t(v_skew !== 0) ? \"p_skew_v.png\" :\n\t\t\t\t\t(y_scale !== 1) ? (\n\t\t\t\t\t\t(x_scale !== 1) ? \"p_stretch_both.png\" : \"p_stretch_v.png\"\n\t\t\t\t\t) : \"p_stretch_h.png\"\n\t\t),\n\t}, (original_canvas, _original_ctx, new_canvas, new_ctx) => {\n\t\tconst w = original_canvas.width * x_scale;\n\t\tconst h = original_canvas.height * y_scale;\n\n\t\tlet bb_min_x = +Infinity;\n\t\tlet bb_max_x = -Infinity;\n\t\tlet bb_min_y = +Infinity;\n\t\tlet bb_max_y = -Infinity;\n\t\tconst corner = (x01, y01) => {\n\t\t\tconst x = Math.tan(h_skew) * h * x01 + w * y01;\n\t\t\tconst y = Math.tan(v_skew) * w * y01 + h * x01;\n\t\t\tbb_min_x = Math.min(bb_min_x, x);\n\t\t\tbb_max_x = Math.max(bb_max_x, x);\n\t\t\tbb_min_y = Math.min(bb_min_y, y);\n\t\t\tbb_max_y = Math.max(bb_max_y, y);\n\t\t};\n\n\t\tcorner(0, 0);\n\t\tcorner(0, 1);\n\t\tcorner(1, 0);\n\t\tcorner(1, 1);\n\n\t\tconst bb_x = bb_min_x;\n\t\tconst bb_y = bb_min_y;\n\t\tconst bb_w = bb_max_x - bb_min_x;\n\t\tconst bb_h = bb_max_y - bb_min_y;\n\n\t\tnew_canvas.width = Math.max(1, bb_w);\n\t\tnew_canvas.height = Math.max(1, bb_h);\n\t\tnew_ctx.disable_image_smoothing();\n\n\t\tif (!transparency) {\n\t\t\tnew_ctx.fillStyle = selected_colors.background;\n\t\t\tnew_ctx.fillRect(0, 0, new_canvas.width, new_canvas.height);\n\t\t}\n\n\t\tnew_ctx.save();\n\t\tnew_ctx.transform(\n\t\t\t1, // x scale\n\t\t\tMath.tan(v_skew), // vertical skew (skewY)\n\t\t\tMath.tan(h_skew), // horizontal skew (skewX)\n\t\t\t1, // y scale\n\t\t\t-bb_x, // x translation\n\t\t\t-bb_y // y translation\n\t\t);\n\t\tnew_ctx.drawImage(original_canvas, 0, 0, w, h);\n\t\tnew_ctx.restore();\n\t});\n}\n\n/**\n * Inverts the RGB values in a canvas, optionally storing the result in a separate destination canvas.\n *\n * @param {CanvasRenderingContext2D} source_ctx - The source canvas rendering context.\n * @param {CanvasRenderingContext2D} [dest_ctx=source_ctx] - The destination canvas rendering context.\n */\nfunction invert_rgb(source_ctx, dest_ctx = source_ctx) {\n\tconst image_data = source_ctx.getImageData(0, 0, source_ctx.canvas.width, source_ctx.canvas.height);\n\tfor (let i = 0; i < image_data.data.length; i += 4) {\n\t\timage_data.data[i + 0] = 255 - image_data.data[i + 0];\n\t\timage_data.data[i + 1] = 255 - image_data.data[i + 1];\n\t\timage_data.data[i + 2] = 255 - image_data.data[i + 2];\n\t}\n\tdest_ctx.putImageData(image_data, 0, 0);\n}\n\n/**\n * Swaps the two colors of a monochrome image.\n * If no destination context is provided, the source context is used as the destination context.\n * If no monochrome information is provided, it is detected from the source context.\n *\n * @param {CanvasRenderingContext2D} source_ctx - The source canvas context.\n * @param {CanvasRenderingContext2D} [dest_ctx=source_ctx] - The destination canvas context.\n * @param {MonochromeInfo} [monochrome_info=detect_monochrome(source_ctx)] - The monochrome information.\n */\nfunction invert_monochrome(source_ctx, dest_ctx = source_ctx, monochrome_info = detect_monochrome(source_ctx)) {\n\tconst image_data = source_ctx.getImageData(0, 0, source_ctx.canvas.width, source_ctx.canvas.height);\n\t// Note: values in pixel_array may be different on big endian vs little endian machines.\n\t// Only rely on equality of values within the array.\n\t// pixel_array is a performance optimization, to access whole pixels at a time instead of individual color channels.\n\tconst pixel_array = new Uint32Array(image_data.data.buffer);\n\tif (monochrome_info.presentNonTransparentUint32s.length === 0) {\n\t\t// Fully transparent.\n\t\t// No change, and no need to copy the image to dest canvas to represent that lack of a change.\n\t\treturn;\n\t}\n\tif (monochrome_info.presentNonTransparentUint32s.length === 1) {\n\t\t// Only one non-transparent color present in the image.\n\t\t// Can't use just the information of what colors are in the canvas to invert, need to look at the palette.\n\t\t// We could've done this in a unified way, but whatever!\n\t\t// Personally, I think this is a CHARMINGLY poor solution.\n\t\t// Maybe a little less so now that I added handling for transparency (i.e. Free-Form Select).\n\t\tconst color_1 = palette[0];\n\t\tconst color_2 = palette[14] || palette[1];\n\t\tconst color_1_rgba = get_rgba_from_color(color_1);\n\t\tconst present_rgba = monochrome_info.presentNonTransparentRGBAs[0];\n\t\tif (\n\t\t\tpresent_rgba[0] === color_1_rgba[0] &&\n\t\t\tpresent_rgba[1] === color_1_rgba[1] &&\n\t\t\tpresent_rgba[2] === color_1_rgba[2] &&\n\t\t\tpresent_rgba[3] === color_1_rgba[3]\n\t\t) {\n\t\t\tdest_ctx.fillStyle = color_2;\n\t\t} else {\n\t\t\tdest_ctx.fillStyle = color_1;\n\t\t}\n\t\tif (monochrome_info.monochromeWithTransparency) {\n\t\t\tdest_ctx.putImageData(image_data, 0, 0);\n\t\t\tdest_ctx.globalCompositeOperation = \"source-in\";\n\t\t}\n\t\tdest_ctx.fillRect(0, 0, source_ctx.canvas.width, source_ctx.canvas.height);\n\t\treturn;\n\t}\n\tconst [uint32_a, uint32_b] = monochrome_info.presentNonTransparentUint32s;\n\tfor (let i = 0, len = pixel_array.length; i < len; i += 1) {\n\t\tif (pixel_array[i] === uint32_a) {\n\t\t\tpixel_array[i] = uint32_b;\n\t\t} else if (pixel_array[i] === uint32_b) {\n\t\t\tpixel_array[i] = uint32_a;\n\t\t}\n\t}\n\tdest_ctx.putImageData(image_data, 0, 0);\n}\n\n/**\n * Converts the image to black and white by applying a lightness threshold.\n * @param {CanvasRenderingContext2D} ctx - The 2D rendering context of the canvas.\n * @param {number} threshold - The threshold value between black and white (0 to 1).\n */\nfunction threshold_black_and_white(ctx, threshold) {\n\tconst image_data = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);\n\tfor (let i = 0; i < image_data.data.length; i += 4) {\n\t\tconst white = (image_data.data[i + 0] + image_data.data[i + 1] + image_data.data[i + 2]) / 3 / 255 > threshold;\n\t\timage_data.data[i + 0] = white ? 255 : 0;\n\t\timage_data.data[i + 1] = white ? 255 : 0;\n\t\timage_data.data[i + 2] = white ? 255 : 0;\n\t\timage_data.data[i + 3] = 255;\n\t}\n\tctx.putImageData(image_data, 0, 0);\n}\n\n/**\n * Replaces colors from a mask with a specified color or pattern.\n * This function is mainly for patterns support but naturally handles solid colors as well.\n *\n * USAGE NOTE: Context MUST be untranslated! (for the rectangle to cover the exact area of the canvas, and presumably for the pattern alignment as well)\n *\n * @param {CanvasRenderingContext2D} ctx - The canvas rendering context.\n * @param {string | CanvasPattern | CanvasGradient} swatch - The color swatch to replace the colors with.\n * @param {number} [x_offset_from_global_canvas=0] - The x-coordinate of the mask's top-left corner relative to the global canvas.\n * @param {number} [y_offset_from_global_canvas=0] - The y-coordinate of the mask's top-left corner relative to the global canvas.\n */\nfunction replace_colors_with_swatch(ctx, swatch, x_offset_from_global_canvas = 0, y_offset_from_global_canvas = 0) {\n\tctx.globalCompositeOperation = \"source-in\";\n\tctx.fillStyle = swatch;\n\tctx.beginPath();\n\tctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);\n\tctx.save();\n\tctx.translate(-x_offset_from_global_canvas, -y_offset_from_global_canvas);\n\tctx.fill();\n\tctx.restore();\n}\n\n/**\n * Computes the position on a cubic Bezier curve at a given parameter `t`.\n * @param {number} t - The parameter value between 0 and 1.\n * @param {number} start_x - The x-coordinate of the starting point.\n * @param {number} start_y - The y-coordinate of the starting point.\n * @param {number} control_1_x - The x-coordinate of the first control point.\n * @param {number} control_1_y - The y-coordinate of the first control point.\n * @param {number} control_2_x - The x-coordinate of the second control point.\n * @param {number} control_2_y - The y-coordinate of the second control point.\n * @param {number} end_x - The x-coordinate of the ending point.\n * @param {number} end_y - The y-coordinate of the ending point.\n * @returns {{x: number, y: number}} The position on the Bezier curve at parameter `t`.\n */\nfunction compute_bezier(t, start_x, start_y, control_1_x, control_1_y, control_2_x, control_2_y, end_x, end_y) {\n\t// adapted from https://github.com/Pomax/bezierjs\n\tconst mt = 1 - t;\n\tconst mt2 = mt * mt;\n\tconst t2 = t * t;\n\n\tconst a = mt2 * mt;\n\tconst b = mt2 * t * 3;\n\tconst c = mt * t2 * 3;\n\tconst d = t * t2;\n\n\treturn {\n\t\tx: a * start_x + b * control_1_x + c * control_2_x + d * end_x,\n\t\ty: a * start_y + b * control_1_y + c * control_2_y + d * end_y,\n\t};\n}\n\n/**\n * Draws a solid-color mask of a bezier curve.\n *\n * @param {CanvasRenderingContext2D} ctx - The rendering context of the canvas.\n * @param {number} start_x - The x-coordinate of the starting point of the curve.\n * @param {number} start_y - The y-coordinate of the starting point of the curve.\n * @param {number} control_1_x - The x-coordinate of the first control point of the curve.\n * @param {number} control_1_y - The y-coordinate of the first control point of the curve.\n * @param {number} control_2_x - The x-coordinate of the second control point of the curve.\n * @param {number} control_2_y - The y-coordinate of the second control point of the curve.\n * @param {number} end_x - The x-coordinate of the ending point of the curve.\n * @param {number} end_y - The y-coordinate of the ending point of the curve.\n * @param {number} stroke_size - The line width of the curve.\n */\nfunction draw_bezier_curve_without_pattern_support(ctx, start_x, start_y, control_1_x, control_1_y, control_2_x, control_2_y, end_x, end_y, stroke_size) {\n\tconst steps = 100;\n\tlet point_a = { x: start_x, y: start_y };\n\tfor (let t = 0; t < 1; t += 1 / steps) {\n\t\tconst point_b = compute_bezier(t, start_x, start_y, control_1_x, control_1_y, control_2_x, control_2_y, end_x, end_y);\n\t\t// @TODO: carry \"error\" from Bresenham line algorithm between iterations? and/or get a proper Bezier drawing algorithm\n\t\tdraw_line_without_pattern_support(ctx, point_a.x, point_a.y, point_b.x, point_b.y, stroke_size);\n\t\tpoint_a = point_b;\n\t}\n}\n\n/**\n * Draws a quadratic curve on the canvas context, supporting patterns.\n *\n * @param {CanvasRenderingContext2D} ctx - The canvas rendering context.\n * @param {number} start_x - The x-coordinate of the starting point of the curve.\n * @param {number} start_y - The y-coordinate of the starting point of the curve.\n * @param {number} control_x - The x-coordinate of the control point of the curve.\n * @param {number} control_y - The y-coordinate of the control point of the curve.\n * @param {number} end_x - The x-coordinate of the ending point of the curve.\n * @param {number} end_y - The y-coordinate of the ending point of the curve.\n * @param {number} stroke_size - The size of the stroke used to draw the curve.\n */\nfunction draw_quadratic_curve(ctx, start_x, start_y, control_x, control_y, end_x, end_y, stroke_size) {\n\tdraw_bezier_curve(ctx, start_x, start_y, control_x, control_y, control_x, control_y, end_x, end_y, stroke_size);\n}\n\n/**\n * Draws a bezier curve on the canvas, supporting patterns.\n *\n * @param {CanvasRenderingContext2D} ctx - The rendering context of the canvas.\n * @param {number} start_x - The x-coordinate of the starting point of the curve.\n * @param {number} start_y - The y-coordinate of the starting point of the curve.\n * @param {number} control_1_x - The x-coordinate of the first control point of the curve.\n * @param {number} control_1_y - The y-coordinate of the first control point of the curve.\n * @param {number} control_2_x - The x-coordinate of the second control point of the curve.\n * @param {number} control_2_y - The y-coordinate of the second control point of the curve.\n * @param {number} end_x - The x-coordinate of the ending point of the curve.\n * @param {number} end_y - The y-coordinate of the ending point of the curve.\n * @param {number} stroke_size - The line width of the curve.\n */\nfunction draw_bezier_curve(ctx, start_x, start_y, control_1_x, control_1_y, control_2_x, control_2_y, end_x, end_y, stroke_size) {\n\t// could calculate bounds of Bezier curve with something like bezier-js\n\t// but just using the control points should be fine\n\tconst min_x = Math.min(start_x, control_1_x, control_2_x, end_x);\n\tconst min_y = Math.min(start_y, control_1_y, control_2_y, end_y);\n\tconst max_x = Math.max(start_x, control_1_x, control_2_x, end_x);\n\tconst max_y = Math.max(start_y, control_1_y, control_2_y, end_y);\n\tdraw_with_swatch(ctx, min_x, min_y, max_x, max_y, stroke_color, (op_ctx_2d) => {\n\t\tdraw_bezier_curve_without_pattern_support(op_ctx_2d, start_x, start_y, control_1_x, control_1_y, control_2_x, control_2_y, end_x, end_y, stroke_size);\n\t});\n}\n\n/**\n * Draws a line on the canvas context, supporting patterns.\n *\n * @param {CanvasRenderingContext2D} ctx - The canvas rendering context.\n * @param {number} x1 - The x-coordinate of the starting point of the line.\n * @param {number} y1 - The y-coordinate of the starting point of the line.\n * @param {number} x2 - The x-coordinate of the ending point of the line.\n * @param {number} y2 - The y-coordinate of the ending point of the line.\n * @param {number} stroke_size - The line width.\n */\nfunction draw_line(ctx, x1, y1, x2, y2, stroke_size) {\n\tconst min_x = Math.min(x1, x2);\n\tconst min_y = Math.min(y1, y2);\n\tconst max_x = Math.max(x1, x2);\n\tconst max_y = Math.max(y1, y2);\n\tdraw_with_swatch(ctx, min_x, min_y, max_x, max_y, stroke_color, (op_ctx_2d) => {\n\t\tdraw_line_without_pattern_support(op_ctx_2d, x1, y1, x2, y2, stroke_size);\n\t});\n\t// also works:\n\t// draw_line_strip(ctx, [{ x: x1, y: y1 }, { x: x2, y: y2 }]);\n}\n\n/** @type {CanvasPattern} */\nlet grid_pattern;\nlet grid_pattern_size = -1;\n/**\n * Draws the pixel grid pattern, for View > Zoom > Show Grid.\n *\n * @param {PixelContext} ctx - The helper layer canvas rendering context.\n * @param {number} scale - The scale factor for the grid pattern.\n */\nfunction draw_grid(ctx, scale) {\n\tconst pattern_size = Math.floor(scale); // @TODO: try ceil too\n\t// CanvasPattern doesn't have width/height properties, annoyingly.\n\tif (!grid_pattern || grid_pattern_size !== pattern_size) {\n\t\tgrid_pattern_size = pattern_size;\n\t\tconst grid_pattern_canvas = make_canvas(pattern_size, pattern_size);\n\t\tconst dark_gray = \"#808080\";\n\t\tconst light_gray = \"#c0c0c0\";\n\t\tgrid_pattern_canvas.ctx.fillStyle = dark_gray;\n\t\tgrid_pattern_canvas.ctx.fillRect(0, 0, 1, pattern_size);\n\t\tgrid_pattern_canvas.ctx.fillStyle = dark_gray;\n\t\tgrid_pattern_canvas.ctx.fillRect(0, 0, pattern_size, 1);\n\t\tgrid_pattern_canvas.ctx.fillStyle = light_gray;\n\t\tfor (let i = 1; i < pattern_size; i += 2) {\n\t\t\tgrid_pattern_canvas.ctx.fillRect(i, 0, 1, 1);\n\t\t\tgrid_pattern_canvas.ctx.fillRect(0, i, 1, 1);\n\t\t}\n\t\tgrid_pattern = ctx.createPattern(grid_pattern_canvas, \"repeat\");\n\t}\n\tctx.save();\n\tctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);\n\tif (scale !== pattern_size) {\n\t\tctx.translate(-0.5, -0.75); // hand picked to look \"good\" at 110% in chrome\n\t\t// might be better to just hide the grid in some more cases tho\n\t\t// ...@TODO: if I can get helper layer to be pixel aligned, I can probably remove this\n\t}\n\tctx.scale(scale / pattern_size, scale / pattern_size);\n\tctx.enable_image_smoothing();\n\tctx.fillStyle = grid_pattern;\n\tctx.fill();\n\tctx.restore();\n}\n\n// #region Dashed Selection Box Border\n// TODO: move to a separate file\n\n// the dashes of the border are sized such that at 4x zoom,\n// they're squares equal to one canvas pixel\n// they're offset by a screen pixel tho from the canvas pixel cells\n\nconst svg_for_creating_matrices = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n\nconst horizontal_pattern_canvas = make_canvas(8, 4);\nconst vertical_pattern_canvas = make_canvas(4, 8);\nlet horizontal_pattern;\nlet vertical_pattern;\n\nfunction draw_dashes(ctx, x, y, go_x, go_y, scale, translate_x, translate_y) {\n\tif (!vertical_pattern) {\n\t\thorizontal_pattern_canvas.ctx.fillStyle = \"white\";\n\t\thorizontal_pattern_canvas.ctx.fillRect(4, 0, 4, 4);\n\t\tvertical_pattern_canvas.ctx.fillStyle = \"white\";\n\t\tvertical_pattern_canvas.ctx.fillRect(0, 4, 4, 4);\n\t\thorizontal_pattern = ctx.createPattern(horizontal_pattern_canvas, \"repeat\");\n\t\tvertical_pattern = ctx.createPattern(vertical_pattern_canvas, \"repeat\");\n\t}\n\n\tconst dash_width = 1;\n\tconst hairline_width = 1 / scale; // size of a screen pixel\n\n\tctx.save();\n\n\tctx.scale(scale, scale);\n\tctx.translate(translate_x, translate_y);\n\n\tctx.translate(x, y);\n\tctx.globalCompositeOperation = \"difference\";\n\n\n\tif (go_x > 0) {\n\t\tconst matrix = svg_for_creating_matrices.createSVGMatrix();\n\t\tif (horizontal_pattern.setTransform) { // not supported by Edge as of 2019-12-04\n\t\t\thorizontal_pattern.setTransform(matrix.translate(-x, -y).translate(hairline_width, 0).scale(1 / scale));\n\t\t}\n\t\tctx.fillStyle = horizontal_pattern;\n\t\tctx.fillRect(0, 0, go_x, dash_width);\n\t} else if (go_y > 0) {\n\t\tconst matrix = svg_for_creating_matrices.createSVGMatrix();\n\t\tif (vertical_pattern.setTransform) { // not supported by Edge as of 2019-12-04\n\t\t\tvertical_pattern.setTransform(matrix.translate(-x, -y).translate(0, hairline_width).scale(1 / scale));\n\t\t}\n\t\tctx.fillStyle = vertical_pattern;\n\t\tctx.fillRect(0, 0, dash_width, go_y);\n\t}\n\tctx.restore();\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {number} rect_x\n * @param {number} rect_y\n * @param {number} rect_w\n * @param {number} rect_h\n * @param {number} scale\n * @param {number} translate_x\n * @param {number} translate_y\n */\nexport function draw_selection_box(ctx, rect_x, rect_y, rect_w, rect_h, scale, translate_x, translate_y) {\n\tdraw_dashes(ctx, rect_x, rect_y, rect_w - 1, 0, scale, translate_x, translate_y); // top\n\tif (rect_h === 1) {\n\t\tdraw_dashes(ctx, rect_x, rect_y, 0, 1, scale, translate_x, translate_y); // left\n\t} else {\n\t\tdraw_dashes(ctx, rect_x, rect_y + 1, 0, rect_h - 2, scale, translate_x, translate_y); // left\n\t}\n\tdraw_dashes(ctx, rect_x + rect_w - 1, rect_y, 0, rect_h, scale, translate_x, translate_y); // right\n\tdraw_dashes(ctx, rect_x, rect_y + rect_h - 1, rect_w - 1, 0, scale, translate_x, translate_y); // bottom\n\tdraw_dashes(ctx, rect_x, rect_y + 1, 0, 1, scale, translate_x, translate_y); // top left dangling bit???\n}\n\n// #endregion\n// #region WebGL\n// TODO: move to a separate file\n\nlet tessy;\n/** @type {WebGLRenderingContext} */\nlet gl;\n/** @type {number} */\nlet positionLoc;\n/** @type {HTMLCanvasElement} */\nlet op_canvas_webgl;\n/** @type {HTMLCanvasElement} */\nlet op_canvas_2d;\n/** @type {CanvasRenderingContext2D} */\nlet op_ctx_2d;\n\n\nfunction initTesselator() {\n\t// function called for each vertex of tesselator output\n\tfunction vertex_callback(data, poly_vert_array) {\n\t\t// window.console?.log(data[0], data[1]);\n\t\tpoly_vert_array[poly_vert_array.length] = data[0];\n\t\tpoly_vert_array[poly_vert_array.length] = data[1];\n\t}\n\tfunction begin_callback(type) {\n\t\tif (type !== libtess.primitiveType.GL_TRIANGLES) {\n\t\t\twindow.console?.log(`Expected TRIANGLES but got type: ${type}`);\n\t\t}\n\t}\n\tfunction error_callback(errno) {\n\t\twindow.console?.log(\"error callback\");\n\t\twindow.console?.log(`error number: ${errno}`);\n\t}\n\t// callback for when segments intersect and must be split\n\tfunction combine_callback(coords, _data, _weight) {\n\t\t// window.console?.log(\"combine callback\");\n\t\treturn [coords[0], coords[1], coords[2]];\n\t}\n\tfunction edge_callback(_flag) {\n\t\t// don't really care about the flag, but need no-strip/no-fan behavior\n\t\t// window.console?.log(\"edge flag: \" + flag);\n\t}\n\n\tconst tessy = new libtess.GluTesselator();\n\t// tessy.gluTessProperty(libtess.gluEnum.GLU_TESS_WINDING_RULE, libtess.windingRule.GLU_TESS_WINDING_POSITIVE);\n\ttessy.gluTessCallback(libtess.gluEnum.GLU_TESS_VERTEX_DATA, vertex_callback);\n\ttessy.gluTessCallback(libtess.gluEnum.GLU_TESS_BEGIN, begin_callback);\n\ttessy.gluTessCallback(libtess.gluEnum.GLU_TESS_ERROR, error_callback);\n\ttessy.gluTessCallback(libtess.gluEnum.GLU_TESS_COMBINE, combine_callback);\n\ttessy.gluTessCallback(libtess.gluEnum.GLU_TESS_EDGE_FLAG, edge_callback);\n\n\treturn tessy;\n}\n\nfunction triangulate(contours) {\n\t// libtess will take 3d verts and flatten to a plane for tesselation\n\t// since only doing 2d tesselation here, provide z=1 normal to skip\n\t// iterating over verts only to get the same answer.\n\ttessy.gluTessNormal(0, 0, 1);\n\n\tconst triangleVerts = [];\n\ttessy.gluTessBeginPolygon(triangleVerts);\n\n\tfor (let i = 0; i < contours.length; i++) {\n\t\ttessy.gluTessBeginContour();\n\t\tconst contour = contours[i];\n\t\tfor (let j = 0; j < contour.length; j += 2) {\n\t\t\tconst coords = [contour[j], contour[j + 1], 0];\n\t\t\ttessy.gluTessVertex(coords, coords);\n\t\t}\n\t\ttessy.gluTessEndContour();\n\t}\n\n\ttessy.gluTessEndPolygon();\n\n\treturn triangleVerts;\n}\n\n\nfunction initWebGL(canvas) {\n\ttry {\n\t\tgl = canvas.getContext(\"webgl\", { antialias: false });\n\t} catch (error) {\n\t\t// TODO: reload button for Electron app\n\t\tshow_error_message(\"Failed to get WebGL context. You may need to refresh the web page, or restart your computer.\", error);\n\t\treturn;\n\t}\n\n\tif (!gl) {\n\t\t// TODO: reload button for Electron app\n\t\tshow_error_message(\"Failed to get WebGL context. You may need to refresh the web page, or restart your computer.\");\n\t\treturn;\n\t}\n\n\twindow.WEBGL_lose_context = gl.getExtension(\"WEBGL_lose_context\");\n\n\tconst program = createShaderProgram();\n\tpositionLoc = gl.getAttribLocation(program, \"position\");\n\tgl.enableVertexAttribArray(positionLoc);\n}\n\nfunction initArrayBuffer(triangleVertexCoords) {\n\t// put triangle coordinates into a WebGL ArrayBuffer and bind to\n\t// shader's 'position' attribute variable\n\tconst rawData = new Float32Array(triangleVertexCoords);\n\tconst polygonArrayBuffer = gl.createBuffer();\n\tgl.bindBuffer(gl.ARRAY_BUFFER, polygonArrayBuffer);\n\tgl.bufferData(gl.ARRAY_BUFFER, rawData, gl.STATIC_DRAW);\n\tgl.vertexAttribPointer(positionLoc, 2, gl.FLOAT, false, 0, 0);\n\n\treturn triangleVertexCoords.length / 2;\n}\n\nfunction createShaderProgram() {\n\t// create vertex shader\n\tconst vertexSrc = [\n\t\t\"attribute vec4 position;\",\n\t\t\"void main() {\",\n\t\t\"\t/* already in normalized coordinates, so just pass through */\",\n\t\t\"\tgl_Position = position;\",\n\t\t\"}\",\n\t].join(\"\");\n\tconst vertexShader = gl.createShader(gl.VERTEX_SHADER);\n\tgl.shaderSource(vertexShader, vertexSrc);\n\tgl.compileShader(vertexShader);\n\n\tif (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n\t\twindow.console?.log(\n\t\t\t`Vertex shader failed to compile. Log: ${gl.getShaderInfoLog(vertexShader)}`\n\t\t);\n\t}\n\n\t// create fragment shader\n\tconst fragmentSrc = [\n\t\t\"precision mediump float;\",\n\t\t\"void main() {\",\n\t\t\"\tgl_FragColor = vec4(0, 0, 0, 1);\",\n\t\t\"}\",\n\t].join(\"\");\n\tconst fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n\tgl.shaderSource(fragmentShader, fragmentSrc);\n\tgl.compileShader(fragmentShader);\n\n\tif (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n\t\twindow.console?.log(\n\t\t\t`Fragment shader failed to compile. Log: ${gl.getShaderInfoLog(fragmentShader)}`\n\t\t);\n\t}\n\n\t// link shaders to create our program\n\tconst program = gl.createProgram();\n\tgl.attachShader(program, vertexShader);\n\tgl.attachShader(program, fragmentShader);\n\tgl.linkProgram(program);\n\n\tgl.useProgram(program);\n\n\treturn program;\n}\n\nexport function init_webgl_stuff() {\n\n\ttessy = initTesselator();\n\n\top_canvas_webgl = document.createElement(\"canvas\");\n\top_canvas_2d = document.createElement(\"canvas\");\n\top_ctx_2d = op_canvas_2d.getContext(\"2d\");\n\n\tinitWebGL(op_canvas_webgl);\n\n\tlet warning_tid;\n\top_canvas_webgl.addEventListener(\"webglcontextlost\", (e) => {\n\t\te.preventDefault();\n\t\twindow.console?.warn(\"WebGL context lost\");\n\t\tclamp_brush_sizes();\n\n\t\twarning_tid = setTimeout(() => {\n\t\t\t// TODO: reload button for Electron app\n\t\t\tshow_error_message(\"The WebGL context was lost. You may need to refresh the web page, or restart your computer.\");\n\t\t}, 3000);\n\t}, false);\n\top_canvas_webgl.addEventListener(\"webglcontextrestored\", () => {\n\t\tinitWebGL(op_canvas_webgl);\n\n\t\twindow.console?.warn(\"WebGL context restored\");\n\t\tclearTimeout(warning_tid);\n\n\t\tclamp_brush_sizes();\n\n\t\t// brushes rendered using WebGL may be invalid (i.e. invisible) since the context was lost\n\t\t// invalidate the cache(s) so that brushes will be re-rendered now that WebGL is restored\n\t\t$G.triggerHandler(\"invalidate-brush-canvases\");\n\n\t\t$G.triggerHandler(\"redraw-tool-options-because-webglcontextrestored\");\n\t}, false);\n}\n\nfunction clamp_brush_sizes() {\n\tconst max_size = 100;\n\tif (brush_size > max_size) {\n\t\tbrush_size = max_size;\n\t\tshow_error_message(`Brush size clamped to ${max_size}`);\n\t}\n\tif (pencil_size > max_size) {\n\t\tpencil_size = max_size;\n\t\tshow_error_message(`Pencil size clamped to ${max_size}`);\n\t}\n\tif (stroke_size > max_size) {\n\t\tstroke_size = max_size;\n\t\tshow_error_message(`Stroke size clamped to ${max_size}`);\n\t}\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {{x: number, y: number}[]} points\n */\nexport function draw_line_strip(ctx, points) {\n\tdraw_polygon_or_line_strip(ctx, points, true, false, false);\n}\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {{x: number, y: number}[]} points\n * @param {boolean} stroke\n * @param {boolean} fill\n */\nexport function draw_polygon(ctx, points, stroke, fill) {\n\tdraw_polygon_or_line_strip(ctx, points, stroke, fill, true);\n}\n\n/**\n * Draws a polygon or line strip (polyline) on the canvas context.\n *\n * @param {CanvasRenderingContext2D} ctx - The canvas rendering context.\n * @param {{x: number, y: number}[]} points - The array of points defining the polygon or line strip.\n * @param {boolean} stroke - Whether to stroke the shape.\n * @param {boolean} fill - Whether to fill the shape.\n * @param {boolean} close_path - Whether to join the start and end points, forming a closed polygon.\n */\nfunction draw_polygon_or_line_strip(ctx, points, stroke, fill, close_path) {\n\tif (!gl) {\n\t\t// TODO: reload button for Electron app\n\t\tshow_error_message(\"Failed to get WebGL context. You may need to refresh the web page, or restart your computer.\");\n\t\treturn; // @TODO: don't pollute brush cache with empty brushes (also maybe fallback to 2D canvas rendering)\n\t}\n\n\t// this must be before stuff is done with op_canvas\n\t// otherwise update_brush_for_drawing_lines calls render_brush calls draw_ellipse calls draw_polygon calls draw_polygon_or_line_strip\n\t// trying to use the same op_canvas\n\t// (also, avoiding infinite recursion by checking for stroke; assuming brushes will never have outlines)\n\tif (stroke && stroke_size > 1) {\n\t\tupdate_brush_for_drawing_lines(stroke_size);\n\t}\n\n\tconst stroke_color = ctx.strokeStyle;\n\tconst fill_color = ctx.fillStyle;\n\n\tconst numPoints = points.length;\n\tconst numCoords = numPoints * 2;\n\n\tif (numPoints === 0) {\n\t\treturn;\n\t}\n\n\tlet x_min = +Infinity;\n\tlet x_max = -Infinity;\n\tlet y_min = +Infinity;\n\tlet y_max = -Infinity;\n\tfor (const { x, y } of points) {\n\t\tx_min = Math.min(x, x_min);\n\t\tx_max = Math.max(x, x_max);\n\t\ty_min = Math.min(y, y_min);\n\t\ty_max = Math.max(y, y_max);\n\t}\n\tx_max += 1;\n\ty_max += 1;\n\tx_min -= 1;\n\ty_min -= 1;\n\n\top_canvas_webgl.width = x_max - x_min;\n\top_canvas_webgl.height = y_max - y_min;\n\tgl.viewport(0, 0, op_canvas_webgl.width, op_canvas_webgl.height);\n\n\tconst coords = new Float32Array(numCoords);\n\tfor (let i = 0; i < numPoints; i++) {\n\t\tcoords[i * 2 + 0] = (points[i].x - x_min) / op_canvas_webgl.width * 2 - 1;\n\t\tcoords[i * 2 + 1] = 1 - (points[i].y - y_min) / op_canvas_webgl.height * 2;\n\t\t// @TODO: investigate: does this cause resolution/information loss? can we change the coordinate system?\n\t}\n\n\tif (fill) {\n\t\tconst contours = [coords];\n\t\tconst polyTriangles = triangulate(contours);\n\t\tlet numVertices = initArrayBuffer(polyTriangles);\n\t\tgl.clear(gl.COLOR_BUFFER_BIT);\n\t\tgl.drawArrays(gl.TRIANGLES, 0, numVertices);\n\n\t\top_canvas_2d.width = op_canvas_webgl.width;\n\t\top_canvas_2d.height = op_canvas_webgl.height;\n\n\t\top_ctx_2d.drawImage(op_canvas_webgl, 0, 0);\n\t\treplace_colors_with_swatch(op_ctx_2d, fill_color, x_min, y_min);\n\t\tctx.drawImage(op_canvas_2d, x_min, y_min);\n\t}\n\tif (stroke) {\n\t\tif (stroke_size > 1) {\n\t\t\tconst stroke_margin = ~~(stroke_size * 1.1);\n\n\t\t\tconst op_canvas_x = x_min - stroke_margin;\n\t\t\tconst op_canvas_y = y_min - stroke_margin;\n\n\t\t\top_canvas_2d.width = x_max - x_min + stroke_margin * 2;\n\t\t\top_canvas_2d.height = y_max - y_min + stroke_margin * 2;\n\t\t\tfor (let i = 0; i < numPoints - (close_path ? 0 : 1); i++) {\n\t\t\t\tconst point_a = points[i];\n\t\t\t\tconst point_b = points[(i + 1) % numPoints];\n\t\t\t\t// Note: update_brush_for_drawing_lines way above\n\t\t\t\tdraw_line_without_pattern_support(\n\t\t\t\t\top_ctx_2d,\n\t\t\t\t\tpoint_a.x - op_canvas_x,\n\t\t\t\t\tpoint_a.y - op_canvas_y,\n\t\t\t\t\tpoint_b.x - op_canvas_x,\n\t\t\t\t\tpoint_b.y - op_canvas_y,\n\t\t\t\t\tstroke_size\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treplace_colors_with_swatch(op_ctx_2d, stroke_color, op_canvas_x, op_canvas_y);\n\t\t\tctx.drawImage(op_canvas_2d, op_canvas_x, op_canvas_y);\n\t\t} else {\n\t\t\tlet numVertices = initArrayBuffer(coords);\n\t\t\tgl.clear(gl.COLOR_BUFFER_BIT);\n\t\t\tgl.drawArrays(close_path ? gl.LINE_LOOP : gl.LINE_STRIP, 0, numVertices);\n\n\t\t\top_canvas_2d.width = op_canvas_webgl.width;\n\t\t\top_canvas_2d.height = op_canvas_webgl.height;\n\n\t\t\top_ctx_2d.drawImage(op_canvas_webgl, 0, 0);\n\t\t\treplace_colors_with_swatch(op_ctx_2d, stroke_color, x_min, y_min);\n\t\t\tctx.drawImage(op_canvas_2d, x_min, y_min);\n\t\t}\n\t}\n}\n\n/**\n * @param {HTMLCanvasElement} canvas\n * @param {{x: number, y: number}[]} points\n * @param {number} x_min\n * @param {number} y_min\n * @param {number} x_max\n * @param {number} y_max\n * @returns {PixelCanvas}\n */\nexport function copy_contents_within_polygon(canvas, points, x_min, y_min, x_max, y_max) {\n\t// Copy the contents of the given canvas within the polygon given by points bounded by x/y_min/max\n\tx_max = Math.max(x_max, x_min + 1);\n\ty_max = Math.max(y_max, y_min + 1);\n\tconst width = x_max - x_min;\n\tconst height = y_max - y_min;\n\n\t// @TODO: maybe have the cutout only the width/height of the bounds\n\t// const cutout = make_canvas(width, height);\n\tconst cutout = make_canvas(canvas);\n\n\tcutout.ctx.save();\n\tcutout.ctx.globalCompositeOperation = \"destination-in\";\n\tdraw_polygon(cutout.ctx, points, false, true);\n\tcutout.ctx.restore();\n\n\tconst cutout_crop = make_canvas(width, height);\n\tcutout_crop.ctx.drawImage(cutout, x_min, y_min, width, height, 0, 0, width, height);\n\n\treturn cutout_crop;\n}\n\n// @TODO: maybe shouldn't be external...\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {number} x_min\n * @param {number} y_min\n * @param {number} x_max\n * @param {number} y_max\n * @param {CanvasPattern | string} swatch\n * @param {(ctx: CanvasRenderingContext2D) => void} callback\n */\nexport function draw_with_swatch(ctx, x_min, y_min, x_max, y_max, swatch, callback) {\n\tconst stroke_margin = ~~(stroke_size * 1.1);\n\n\tx_max = Math.max(x_max, x_min + 1);\n\ty_max = Math.max(y_max, y_min + 1);\n\top_canvas_2d.width = x_max - x_min + stroke_margin * 2;\n\top_canvas_2d.height = y_max - y_min + stroke_margin * 2;\n\n\tconst x = x_min - stroke_margin;\n\tconst y = y_min - stroke_margin;\n\n\top_ctx_2d.save();\n\top_ctx_2d.translate(-x, -y);\n\tcallback(op_ctx_2d);\n\top_ctx_2d.restore(); // for replace_colors_with_swatch!\n\n\treplace_colors_with_swatch(op_ctx_2d, swatch, x, y);\n\tctx.drawImage(op_canvas_2d, x, y);\n\n\t// for debug:\n\t// ctx.fillStyle = \"rgba(255, 0, 255, 0.1)\";\n\t// ctx.fillRect(x, y, op_canvas_2d.width, op_canvas_2d.height);\n}\n\nexport {\n\tapply_image_transformation, bresenham_dense_line, bresenham_line, compute_bezier, draw_bezier_curve, draw_bezier_curve_without_pattern_support, draw_ellipse, draw_fill,\n\tdraw_fill_separately, draw_fill_without_pattern_support, draw_grid, draw_line, draw_line_without_pattern_support, draw_noncontiguous_fill,\n\tdraw_noncontiguous_fill_separately, draw_noncontiguous_fill_without_pattern_support, draw_quadratic_curve, draw_rounded_rectangle, find_color_globally, flip_horizontal,\n\tflip_vertical, get_brush_canvas_size, get_circumference_points_for_brush, invert_monochrome, invert_rgb, render_brush, replace_color_globally, replace_colors_with_swatch, rotate, stamp_brush_canvas, stretch_and_skew, threshold_black_and_white, update_brush_for_drawing_lines\n};\n\n"
  },
  {
    "path": "src/imgur.js",
    "content": "// @ts-check\n/* global localize */\nimport { $DialogWindow } from \"./$ToolWindow.js\";\nimport { show_error_message } from \"./functions.js\";\n// import { localize } from \"./app-localization.js\";\nimport { E, is_discord_embed } from \"./helpers.js\";\n\n/** @type {OSGUI$Window & I$DialogWindow} */\nlet $imgur_window;\n\n/**\n * @param {Blob} blob\n */\nfunction show_imgur_uploader(blob) {\n\tif ($imgur_window) {\n\t\t$imgur_window.close();\n\t}\n\t$imgur_window = $DialogWindow();\n\t$imgur_window.title(\"Upload To Imgur\").addClass(\"horizontal-buttons\");\n\n\tconst $preview_image_area = $(E(\"div\")).appendTo($imgur_window.$main).addClass(\"inset-deep\");\n\tconst $imgur_url_area = $(E(\"div\")).appendTo($imgur_window.$main);\n\tconst $imgur_status = $(E(\"div\")).appendTo($imgur_window.$main);\n\n\t// @TODO: maybe make this preview small but zoomable to full size?\n\t// (starting small (max-width: 100%) and toggling to either scrollable or fullscreen)\n\t// it should be clear that it's not going to upload a downsized version of your image\n\tconst $preview_image = $(E(\"img\")).appendTo($preview_image_area).css({\n\t\tdisplay: \"block\", // prevent margin below due to inline display (vertical-align can also be used)\n\t});\n\tconst blob_url = URL.createObjectURL(blob);\n\t$preview_image.attr({ src: blob_url });\n\t// $preview_image.css({maxWidth: \"100%\", maxHeight: \"400px\"});\n\t$preview_image_area.css({\n\t\tmaxWidth: \"90vw\",\n\t\tmaxHeight: \"70vh\",\n\t\toverflow: \"auto\",\n\t\tmarginBottom: \"0.5em\",\n\t});\n\t$preview_image.on(\"load\", () => {\n\t\t$imgur_window.css({ width: \"auto\" });\n\t\t$imgur_window.center();\n\t});\n\t$imgur_window.on(\"close\", () => {\n\t\tURL.revokeObjectURL(blob_url);\n\t});\n\n\tconst $upload_button = $imgur_window.$Button(\"Upload\", () => {\n\n\t\tURL.revokeObjectURL(blob_url);\n\t\t$preview_image_area.remove();\n\t\t$upload_button.remove();\n\t\t$cancel_button.remove(); // @TODO: allow canceling upload request\n\n\t\t$imgur_window.$content.width(300);\n\t\t$imgur_window.center();\n\n\t\tconst $progress = $(E(\"progress\")).appendTo($imgur_window.$main).addClass(\"inset-deep\");\n\t\tconst $progress_percent = $(E(\"span\")).appendTo($imgur_window.$main).css({\n\t\t\twidth: \"2.3em\",\n\t\t\tdisplay: \"inline-block\",\n\t\t\ttextAlign: \"center\",\n\t\t});\n\n\t\tconst parseImgurResponseJSON = (responseJSON) => {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(responseJSON);\n\t\t\t} catch (error) {\n\t\t\t\t$imgur_status.text(\"Received an invalid JSON response from Imgur: \");\n\t\t\t\t// .append($(E(\"pre\")).text(responseJSON));\n\n\t\t\t\t// show_error_message(\"Received an invalid JSON response from Imgur: \", responseJSON);\n\t\t\t\t// show_error_message(\"Received an invalid JSON response from Imgur: \", responseJSON, but also error);\n\t\t\t\t// $imgur_window.close();\n\n\t\t\t\t// @TODO: DRY, including with show_error_message\n\t\t\t\t$(E(\"pre\"))\n\t\t\t\t\t.appendTo($imgur_status)\n\t\t\t\t\t.text(responseJSON)\n\t\t\t\t\t.css({\n\t\t\t\t\t\tbackground: \"white\",\n\t\t\t\t\t\tcolor: \"#333\",\n\t\t\t\t\t\tfontFamily: \"monospace\",\n\t\t\t\t\t\twidth: \"500px\",\n\t\t\t\t\t\toverflow: \"auto\",\n\t\t\t\t\t});\n\t\t\t\t$(E(\"pre\"))\n\t\t\t\t\t.appendTo($imgur_status)\n\t\t\t\t\t.text(error.toString())\n\t\t\t\t\t.css({\n\t\t\t\t\t\tbackground: \"white\",\n\t\t\t\t\t\tcolor: \"#333\",\n\t\t\t\t\t\tfontFamily: \"monospace\",\n\t\t\t\t\t\twidth: \"500px\",\n\t\t\t\t\t\toverflow: \"auto\",\n\t\t\t\t\t});\n\t\t\t\t$imgur_window.css({ width: \"auto\" });\n\t\t\t\t$imgur_window.center();\n\t\t\t}\n\t\t};\n\n\t\t// make an HTTP request to the Imgur image upload API\n\n\t\tconst req = new XMLHttpRequest();\n\n\t\tif (req.upload) {\n\t\t\treq.upload.addEventListener(\"progress\", (event) => {\n\t\t\t\tif (event.lengthComputable) {\n\t\t\t\t\tconst progress_value = event.loaded / event.total;\n\t\t\t\t\tconst percentage_text = `${Math.floor(progress_value * 100)}%`;\n\t\t\t\t\t$progress.val(progress_value);\n\t\t\t\t\t$progress_percent.text(percentage_text);\n\t\t\t\t}\n\t\t\t}, false);\n\t\t}\n\n\t\treq.addEventListener(\"readystatechange\", () => {\n\t\t\tif (req.readyState == 4 && req.status == 200) {\n\t\t\t\t$progress.add($progress_percent).remove();\n\n\t\t\t\tconst response = parseImgurResponseJSON(req.responseText);\n\t\t\t\tif (!response) return;\n\n\t\t\t\tif (!response.success) {\n\t\t\t\t\t//$imgur_status.text(\"Failed to upload image :(\");\n\t\t\t\t\t$imgur_window.close();\n\t\t\t\t\tshow_error_message(\"Failed to upload image.\", req.responseText);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst url = response.data.link;\n\n\t\t\t\t$imgur_status.text(\"\");\n\n\t\t\t\tconst $imgur_url = $(E(\"a\")).attr({ id: \"imgur-url\", target: \"_blank\" });\n\n\t\t\t\t$imgur_url.text(url);\n\t\t\t\t$imgur_url.attr(\"href\", url);\n\t\t\t\t$imgur_url_area.append(\n\t\t\t\t\t\"<label>URL: </label>\"\n\t\t\t\t).append($imgur_url);\n\t\t\t\t// @TODO: a button to copy the URL to the clipboard\n\t\t\t\t// (also maybe put the URL in a readonly input)\n\n\t\t\t\tlet $ok_button;\n\t\t\t\tconst $delete_button = $imgur_window.$Button(\"Delete\", () => {\n\t\t\t\t\tconst req = new XMLHttpRequest();\n\t\t\t\t\t$delete_button[0].disabled = true;\n\t\t\t\t\treq.addEventListener(\"readystatechange\", () => {\n\t\t\t\t\t\tif (req.readyState == 4 && req.status == 200) {\n\t\t\t\t\t\t\t$delete_button.remove();\n\t\t\t\t\t\t\t$ok_button.focus();\n\n\t\t\t\t\t\t\tconst response = parseImgurResponseJSON(req.responseText);\n\t\t\t\t\t\t\tif (!response) return;\n\n\t\t\t\t\t\t\tif (response.success) {\n\t\t\t\t\t\t\t\t$imgur_url_area.remove();\n\t\t\t\t\t\t\t\t$imgur_status.text(\"Deleted successfully\");\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$imgur_status.text(\"Failed to delete image :(\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if (req.readyState == 4) {\n\t\t\t\t\t\t\t$imgur_status.text(\"Error deleting image :(\");\n\t\t\t\t\t\t\t$delete_button[0].disabled = false;\n\t\t\t\t\t\t\t$delete_button.focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\treq.open(\"DELETE\", `https://api.imgur.com/3/image/${response.data.deletehash}`, true);\n\n\t\t\t\t\treq.setRequestHeader(\"Authorization\", \"Client-ID 203da2f300125a1\");\n\t\t\t\t\treq.setRequestHeader(\"Accept\", \"application/json\");\n\t\t\t\t\treq.send(null);\n\n\t\t\t\t\t$imgur_status.text(\"Deleting...\");\n\t\t\t\t});\n\t\t\t\t$ok_button = $imgur_window.$Button(localize(\"OK\"), () => {\n\t\t\t\t\t$imgur_window.close();\n\t\t\t\t}).focus();\n\t\t\t} else if (req.readyState == 4) {\n\t\t\t\t//$progress.add($progress_percent).remove();\n\t\t\t\t//$imgur_status.text(\"Error uploading image :(\");\n\t\t\t\t$imgur_window.close();\n\t\t\t\tif (is_discord_embed) {\n\t\t\t\t\t// closest localized string: \"An unsupported operation was attempted.\"\n\t\t\t\t\tshow_error_message(\"Uploading to Imgur is not currently supported in the Discord Activity.\");\n\t\t\t\t} else {\n\t\t\t\t\tlet response;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tresponse = JSON.parse(req.responseText);\n\t\t\t\t\t} catch (_error) {\n\t\t\t\t\t\t// Prefer to show error about failing to upload,\n\t\t\t\t\t\t// rather than it not being JSON.\n\t\t\t\t\t\t// Full response can be shown in the expandible details.\n\t\t\t\t\t}\n\t\t\t\t\tif (response && response.data && response.data.error) {\n\t\t\t\t\t\tshow_error_message(`Failed to upload image.\\n\\n${response.data.error}`, req.responseText);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tshow_error_message(`Failed to upload image. HTTP ${req.status}`, req.responseText);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treq.open(\"POST\", \"https://api.imgur.com/3/image\", true);\n\n\t\tconst form_data = new FormData();\n\t\tform_data.append(\"image\", blob);\n\n\t\treq.setRequestHeader(\"Authorization\", \"Client-ID 203da2f300125a1\");\n\t\treq.setRequestHeader(\"Accept\", \"application/json\");\n\t\treq.send(form_data);\n\n\t\t$imgur_status.text(\"Uploading...\");\n\t}, { type: \"submit\" }).focus();\n\tconst $cancel_button = $imgur_window.$Button(localize(\"Cancel\"), () => {\n\t\t$imgur_window.close();\n\t});\n\t$imgur_window.$content.css({\n\t\twidth: \"min(1000px, 80vw)\",\n\t});\n\t$imgur_window.center();\n}\n\nexport { show_imgur_uploader };\n\n"
  },
  {
    "path": "src/konami.js",
    "content": "// @ts-check\nfunction afterSequence(sequence, action) {\n\tvar index = 0;\n\n\treturn function (event) {\n\t\tvar matchedKey = event.keyCode === sequence[index];\n\t\t// if it didn't match, reset and try matching against the first key\n\t\tif (!matchedKey) {\n\t\t\tindex = 0;\n\t\t\tmatchedKey = event.keyCode === sequence[index];\n\t\t}\n\n\t\tif (matchedKey) {\n\t\t\tindex += 1;\n\n\t\t\t// fix for Firefox with \"Search for text when you start typing\" enabled\n\t\t\t// https://support.mozilla.org/en-US/kb/search-contents-current-page-text-or-links\n\t\t\t// prevent the default (opening Quick Search) for B and A,\n\t\t\t// which are luckily at the end of the Konami Code sequence\n\t\t\t// (otherwise it could prevent typing A and B in text fields unwantedly)\n\t\t\tif (event.keyCode === 66 || event.keyCode === 65) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\n\t\t\tif (index === sequence.length) {\n\n\t\t\t\t// reset when sequence completed\n\t\t\t\tindex = 0;\n\n\t\t\t\t// fire action\n\t\t\t\taction();\n\t\t\t}\n\t\t}\n\n\t};\n}\n\nexport function onKonamiCodeEntered(action) {\n\taddEventListener(\"keydown\", afterSequence([38, 38, 40, 40, 37, 39, 37, 39, 66, 65], action));\n}\n"
  },
  {
    "path": "src/manage-storage.js",
    "content": "// @ts-check\n/* global localize */\nimport { $DialogWindow } from \"./$ToolWindow.js\";\n// import { localize } from \"./app-localization.js\";\nimport { E, is_discord_embed } from \"./helpers.js\";\nimport { showMessageBox } from \"./msgbox.js\";\n\n/** @type {OSGUI$Window & I$DialogWindow} */\nlet $storage_manager;\nlet $quota_exceeded_window;\nlet ignoring_quota_exceeded = false;\n\nasync function storage_quota_exceeded() {\n\tif ($quota_exceeded_window) {\n\t\t$quota_exceeded_window.close();\n\t\t$quota_exceeded_window = null;\n\t}\n\tif (ignoring_quota_exceeded) {\n\t\treturn;\n\t}\n\tconst { promise, $window } = showMessageBox({\n\t\ttitle: \"Storage Error\",\n\t\tmessageHTML: `\n\t\t\t<p>JS Paint normally keeps a local backup of images you edit.</p>\n\t\t\t<p>However, it has run out of space to do so.</p>\n\t\t\t<p>You can still save the current image with <b>File > Save</b>. You should save frequently, or free up space for backups.</p>\n\t\t`,\n\t\tbuttons: [\n\t\t\t{ label: \"Manage Storage\", value: \"manage\", default: true },\n\t\t\t{ label: \"Ignore\", value: \"ignore\" },\n\t\t],\n\t\ticonID: \"warning\",\n\t});\n\t$quota_exceeded_window = $window;\n\tconst result = await promise;\n\tif (result === \"ignore\") {\n\t\tignoring_quota_exceeded = true;\n\t} else if (result === \"manage\") {\n\t\tignoring_quota_exceeded = false;\n\t\tmanage_storage();\n\t}\n}\n\nfunction manage_storage() {\n\tif ($storage_manager) {\n\t\t$storage_manager.close();\n\t}\n\t$storage_manager = $DialogWindow();\n\t$storage_manager.title(\"Manage Storage\").addClass(\"storage-manager squish\");\n\t// @TODO: way to remove all (with confirmation)\n\tconst $table = $(E(\"table\")).appendTo($storage_manager.$main);\n\tconst $message = $(E(\"p\")).appendTo($storage_manager.$main).html(\n\t\t\"Any images you've saved to your computer with <b>File > Save</b> will not be affected.\"\n\t);\n\tconst $close = $storage_manager.$Button(\"Close\", () => {\n\t\t$storage_manager.close();\n\t});\n\n\tconst addRow = (k, imgSrc) => {\n\t\tconst $tr = $(E(\"tr\")).appendTo($table);\n\n\t\tconst $img = $(E(\"img\")).attr({ src: imgSrc }).addClass(\"thumbnail-img\");\n\t\tconst $remove = $(E(\"button\")).text(\"Remove\").addClass(\"remove-button\").attr(\"type\", \"button\");\n\t\tconst href = `#${k.replace(\"image#\", \"local:\")}`;\n\t\t// The Electron app is a single window for now. This isn't a great experience, but it's better than a broken link.\n\t\t// The Discord Activity can open a external links (with a prompt), but opening internally seems better,\n\t\t// and it was opening a new tab with the app but not loading the document, so this fixes that.\n\t\t// (It seemed to be a separate storage area, despite the same origin? only glancing, not sure.)\n\t\tconst target = window.is_electron_app || is_discord_embed ? \"_self\" : \"_blank\";\n\t\tconst $open_link = $(E(\"a\")).attr({ href, target }).text(localize(\"Open\"));\n\t\tconst $thumbnail_open_link = $(E(\"a\")).attr({ href, target }).addClass(\"thumbnail-container\");\n\t\t$thumbnail_open_link.append($img);\n\t\t$(E(\"td\")).append($thumbnail_open_link).appendTo($tr);\n\t\t$(E(\"td\")).append($open_link).appendTo($tr);\n\t\t$(E(\"td\")).append($remove).appendTo($tr);\n\n\t\t$remove.on(\"click\", () => {\n\t\t\t// Focus the next or previous row's remove button, or the close button if there are no more rows.\n\t\t\t// Try focusing controls in reverse order of priority, so the highest priority control gets focus.\n\t\t\t$close.focus();\n\t\t\t$tr.prev().find(\".remove-button\").focus();\n\t\t\t$tr.next().find(\".remove-button\").focus();\n\n\t\t\tlocalStorage.removeItem(k);\n\t\t\t$tr.remove();\n\t\t\tif ($table.find(\"tr\").length == 0) {\n\t\t\t\t$message.html(\"<p>All clear!</p>\");\n\t\t\t}\n\t\t});\n\t};\n\n\tlet localStorageAvailable = false;\n\ttry {\n\t\tif (localStorage.length > 0) {\n\t\t\t// This is needed in case it's COMPLETELY full.\n\t\t\t// Test with https://stackoverflow.com/questions/45760110/how-to-fill-javascript-localstorage-to-its-max-capacity-quickly\n\t\t\t// Of course, this dialog only manages images, not other data (for now anyway).\n\t\t\tlocalStorageAvailable = true;\n\t\t} else {\n\t\t\tlocalStorage._available = true;\n\t\t\tlocalStorageAvailable = localStorage._available;\n\t\t\tdelete localStorage._available;\n\t\t}\n\t} catch (_error) { /* ignore */ }\n\n\tif (localStorageAvailable) {\n\t\tfor (const k in localStorage) {\n\t\t\tif (k.match(/^image#/)) {\n\t\t\t\tlet v = localStorage[k];\n\t\t\t\ttry {\n\t\t\t\t\tif (v[0] === '\"') {\n\t\t\t\t\t\tv = JSON.parse(v);\n\t\t\t\t\t}\n\t\t\t\t} catch (_error) { /* ignore */ }\n\t\t\t\taddRow(k, v);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!localStorageAvailable) {\n\t\t// @TODO: DRY with similar message\n\t\t// @TODO: instructions for your browser; it's called Cookies in chrome/chromium at least, and \"storage\" gives NO results\n\t\t$message.html(\"<p>Please enable local storage in your browser's settings for local backup. It may be called Cookies, Storage, or Site Data.</p>\");\n\t} else if ($table.find(\"tr\").length == 0) {\n\t\t$message.html(\"<p>All clear!</p>\");\n\t}\n\n\t$storage_manager.$content.width(450);\n\t$storage_manager.center();\n\n\t$storage_manager.find(\".remove-button\").focus();\n}\n\nexport {\n\tmanage_storage, storage_quota_exceeded\n};\n\n"
  },
  {
    "path": "src/menus.js",
    "content": "// @ts-check\n/* global tool_transparent_mode:writable, palette:writable */\n/* global $canvas_area, $colorbox, $status_area, $toolbox, available_languages, get_iso_language_name, get_language, get_language_emoji, get_language_endonym, localize, magnification, main_canvas, menu_bar, MENU_DIVIDER, redos, selection, set_language, show_grid, show_thumbnail, systemHooks, undos */\n// import { available_languages, get_iso_language_name, get_language, get_language_emoji, get_language_endonym, localize, set_language } from \"./app-localization.js\";\nimport { show_edit_colors_window } from \"./edit-colors.js\";\nimport { palette_formats } from \"./file-format-data.js\";\nimport { are_you_sure, change_url_param, choose_file_to_paste, clear, delete_selection, deselect, edit_copy, edit_cut, edit_paste, file_load_from_url, file_new, file_open, file_print, file_save, file_save_as, image_attributes, image_flip_and_rotate, image_invert_colors, image_stretch_and_skew, redo, render_history_as_gif, sanity_check_blob, save_selection_to_file, select_all, set_magnification, show_about_paint, show_custom_zoom_window, show_document_history, show_file_format_errors, show_multi_user_setup_dialog, show_news, toggle_grid, toggle_thumbnail, undo, view_bitmap } from \"./functions.js\";\nimport { show_help } from \"./help.js\";\nimport { $G, get_rgba_from_color, is_discord_embed } from \"./helpers.js\";\nimport { show_imgur_uploader } from \"./imgur.js\";\nimport { manage_storage } from \"./manage-storage.js\";\nimport { showMessageBox } from \"./msgbox.js\";\nimport { simulateRandomGesturesPeriodically, simulatingGestures, stopSimulatingGestures } from \"./simulate-random-gestures.js\";\nimport { speech_recognition_active, speech_recognition_available } from \"./speech-recognition.js\";\nimport { get_theme, set_theme } from \"./theme.js\";\n\nconst looksLikeChrome = !!(window.chrome && (window.chrome.loadTimes || window.chrome.csi));\n// NOTE: Microsoft Edge includes window.chrome.app\n// (also this browser detection logic could likely use some more nuance)\n\n/** @type {OSGUITopLevelMenus} */\nconst menus = {\n\t[localize(\"&File\")]: [\n\t\t{\n\t\t\tlabel: localize(\"&New\"),\n\t\t\t...shortcut(window.is_electron_app ? \"Ctrl+N\" : \"Ctrl+Alt+N\"), // Ctrl+N opens a new browser window\n\t\t\tspeech_recognition: [\n\t\t\t\t\"new\", \"new file\", \"new document\", \"create new document\", \"create a new document\", \"start new document\", \"start a new document\",\n\t\t\t],\n\t\t\taction: () => { file_new(); },\n\t\t\tdescription: localize(\"Creates a new document.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"&Open\"),\n\t\t\t...shortcut(\"Ctrl+O\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"open\", \"open document\", \"open file\", \"open an image file\", \"open a document\", \"open a file\",\n\t\t\t\t\"load document\", \"load a document\", \"load an image file\", \"load an image\",\n\t\t\t\t\"show file picker\", \"show file chooser\", \"show file browser\", \"show finder\",\n\t\t\t\t\"browser for file\", \"browse for a file\", \"browse for an image\", \"browse for an image file\",\n\t\t\t],\n\t\t\taction: () => { file_open(); },\n\t\t\tdescription: localize(\"Opens an existing document.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"&Save\"),\n\t\t\t...shortcut(\"Ctrl+S\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"save\", \"save document\", \"save file\", \"save image\", \"save picture\", \"save image file\",\n\t\t\t\t// \"save a document\", \"save a file\", \"save an image\", \"save an image file\", // too \"save as\"-like\n\t\t\t\t\"save the document\", \"save the file\", \"save the image\", \"save the image file\",\n\n\t\t\t\t\"download\", \"download document\", \"download file\", \"download image\", \"download picture\", \"download image file\",\n\t\t\t\t\"download the document\", \"download the file\", \"download the image\", \"download the image file\",\n\t\t\t],\n\t\t\taction: () => { file_save(); },\n\t\t\tdescription: localize(\"Saves the active document.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"Save &As\"),\n\t\t\t// in mspaint, no shortcut is listed; it supports F12 (but in a browser that opens the dev tools)\n\t\t\t// it doesn't support Ctrl+Shift+S but that's a good & common modern shortcut\n\t\t\t...shortcut(\"Ctrl+Shift+S\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t// this is ridiculous\n\t\t\t\t// this would be really simple in JSGF format\n\t\t\t\t\"save as\", \"save as a new file\", \"save as a new picture\", \"save as a new image\", \"save a new file\", \"save new file\",\n\t\t\t\t\"save a new document\", \"save a new image file\", \"save a new image\", \"save a new picture\",\n\t\t\t\t\"save as a copy\", \"save a copy\", \"save as copy\", \"save under a new name\", \"save with a new name\",\n\t\t\t\t\"save document as a copy\", \"save document copy\", \"save document as copy\", \"save document under a new name\", \"save document with a new name\",\n\t\t\t\t\"save image as a copy\", \"save image copy\", \"save image as copy\", \"save image under a new name\", \"save image with a new name\",\n\t\t\t\t\"save file as a copy\", \"save file copy\", \"save file as copy\", \"save file under a new name\", \"save file with a new name\",\n\t\t\t\t\"save image file as a copy\", \"save image file copy\", \"save image file as copy\", \"save image file under a new name\", \"save image file with a new name\",\n\t\t\t],\n\t\t\taction: () => { file_save_as(); },\n\t\t\tdescription: localize(\"Saves the active document with a new name.\"),\n\t\t},\n\t\tMENU_DIVIDER,\n\t\t{\n\t\t\tlabel: localize(\"&Load From URL\"),\n\t\t\t// shortcut: \"\", // no shortcut: Ctrl+L is taken, and you can paste a URL with Ctrl+V, so it's not really needed\n\t\t\tspeech_recognition: [\n\t\t\t\t\"load from url\",\n\t\t\t\t\"load from a url\",\n\t\t\t\t\"load from address\",\n\t\t\t\t\"load from an address\",\n\t\t\t\t\"load from a web address\",\n\t\t\t\t// this is ridiculous\n\t\t\t\t// this would be really simple in JSGF format\n\t\t\t\t\"load an image from a URL\",\n\t\t\t\t\"load an image from an address\",\n\t\t\t\t\"load an image from a web address\",\n\t\t\t\t\"load image from a URL\",\n\t\t\t\t\"load image from an address\",\n\t\t\t\t\"load image from a web address\",\n\t\t\t\t\"load an image from URL\",\n\t\t\t\t\"load an image from address\",\n\t\t\t\t\"load an image from web address\",\n\t\t\t\t\"load image from URL\",\n\t\t\t\t\"load image from address\",\n\t\t\t\t\"load image from web address\",\n\n\t\t\t\t\"load an picture from a URL\",\n\t\t\t\t\"load an picture from an address\",\n\t\t\t\t\"load an picture from a web address\",\n\t\t\t\t\"load picture from a URL\",\n\t\t\t\t\"load picture from an address\",\n\t\t\t\t\"load picture from a web address\",\n\t\t\t\t\"load an picture from URL\",\n\t\t\t\t\"load an picture from address\",\n\t\t\t\t\"load an picture from web address\",\n\t\t\t\t\"load picture from URL\",\n\t\t\t\t\"load picture from address\",\n\t\t\t\t\"load picture from web address\",\n\t\t\t],\n\t\t\taction: () => { file_load_from_url(); },\n\t\t\tdescription: localize(\"Opens an image from the web.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"&Upload To Imgur\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"upload to imgur\", \"upload image to imgur\", \"upload picture to imgur\",\n\t\t\t],\n\t\t\taction: () => {\n\t\t\t\t// include the selection in the saved image\n\t\t\t\tdeselect();\n\n\t\t\t\tmain_canvas.toBlob((blob) => {\n\t\t\t\t\tsanity_check_blob(blob, () => {\n\t\t\t\t\t\tshow_imgur_uploader(blob);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\tdescription: localize(\"Uploads the active document to Imgur\"),\n\t\t},\n\t\tMENU_DIVIDER,\n\t\t{\n\t\t\tlabel: localize(\"Manage Storage\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"manage storage\", \"show storage\", \"open storage window\", \"manage sessions\", \"show sessions\", \"show local sessions\", \"local sessions\", \"storage manager\", \"show storage manager\", \"open storage manager\",\n\t\t\t\t\"show autosaves\", \"show saves\", \"show saved documents\", \"show saved files\", \"show saved pictures\", \"show saved images\", \"show local storage\",\n\t\t\t\t\"autosaves\", \"autosave\", \"saved documents\", \"saved files\", \"saved pictures\", \"saved images\", \"local storage\",\n\t\t\t],\n\t\t\taction: () => { manage_storage(); },\n\t\t\tdescription: localize(\"Manages storage of previously created or opened pictures.\"),\n\t\t},\n\t\tMENU_DIVIDER,\n\t\t{\n\t\t\tlabel: localize(\"Print Pre&view\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"preview print\", \"print preview\", \"show print preview\", \"show preview of print\",\n\t\t\t],\n\t\t\taction: () => {\n\t\t\t\tfile_print();\n\t\t\t},\n\t\t\tdescription: localize(\"Prints the active document and sets printing options.\"),\n\t\t\t//description: localize(\"Displays full pages.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"Page Se&tup\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"setup page for print\", \"setup page for printing\", \"set-up page for print\", \"set-up page for printing\", \"set up page for print\", \"set up page for printing\",\n\t\t\t\t\"page setup\", \"printing setup\", \"page set-up\", \"printing set-up\", \"page set up\", \"printing set up\",\n\t\t\t],\n\t\t\taction: () => {\n\t\t\t\tfile_print();\n\t\t\t},\n\t\t\tdescription: localize(\"Prints the active document and sets printing options.\"),\n\t\t\t//description: localize(\"Changes the page layout.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"&Print\"),\n\t\t\t...shortcut(\"Ctrl+P\"), // relies on browser's print shortcut being Ctrl+P\n\t\t\tspeech_recognition: [\n\t\t\t\t\"print\", \"send to printer\", \"show print dialog\",\n\t\t\t\t\"print page\", \"print image\", \"print picture\", \"print drawing\",\n\t\t\t\t\"print out page\", \"print out image\", \"print out picture\", \"print out drawing\",\n\t\t\t\t\"print out the page\", \"print out the image\", \"print out the picture\", \"print out the drawing\",\n\n\t\t\t\t\"send page to printer\", \"send image to printer\", \"send picture to printer\", \"send drawing to printer\",\n\t\t\t\t\"send page to the printer\", \"send image to the printer\", \"send picture to the printer\", \"send drawing to the printer\",\n\t\t\t\t\"send the page to the printer\", \"send the image to the printer\", \"send the picture to the printer\", \"send the drawing to the printer\",\n\t\t\t\t\"send the page to printer\", \"send the image to printer\", \"send the picture to printer\", \"send the drawing to printer\",\n\t\t\t],\n\t\t\taction: () => {\n\t\t\t\tfile_print();\n\t\t\t},\n\t\t\tdescription: localize(\"Prints the active document and sets printing options.\"),\n\t\t},\n\t\tMENU_DIVIDER,\n\t\t{\n\t\t\tlabel: localize(\"Set As &Wallpaper (Tiled)\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"set as wallpaper\",\n\t\t\t\t\"set as wallpaper tiled\",\n\t\t\t\t\"set image as wallpaper tiled\", \"set picture as wallpaper tiled\", \"set drawing as wallpaper tiled\",\n\t\t\t\t\"use as wallpaper tiled\",\n\t\t\t\t\"use image as wallpaper tiled\", \"use picture as wallpaper tiled\", \"use drawing as wallpaper tiled\",\n\t\t\t\t\"tile image as wallpaper\", \"tile picture as wallpaper\", \"tile drawing as wallpaper\",\n\t\t\t],\n\t\t\taction: () => { systemHooks.setWallpaperTiled(main_canvas); },\n\t\t\tdescription: localize(\"Tiles this bitmap as the desktop background.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"Set As Wallpaper (&Centered)\"), // in mspaint it's Wa&llpaper\n\t\t\tspeech_recognition: [\n\t\t\t\t\"set as wallpaper centered\",\n\t\t\t\t\"set image as wallpaper centered\", \"set picture as wallpaper centered\", \"set drawing as wallpaper centered\",\n\t\t\t\t\"use as wallpaper centered\",\n\t\t\t\t\"use image as wallpaper centered\", \"use picture as wallpaper centered\", \"use drawing as wallpaper centered\",\n\t\t\t\t\"center image as wallpaper\", \"center picture as wallpaper\", \"center drawing as wallpaper\",\n\t\t\t],\n\t\t\taction: () => { systemHooks.setWallpaperCentered(main_canvas); },\n\t\t\tdescription: localize(\"Centers this bitmap as the desktop background.\"),\n\t\t},\n\t\tMENU_DIVIDER,\n\t\t{\n\t\t\tlabel: localize(\"Recent File\"),\n\t\t\tenabled: false, // @TODO for desktop app\n\t\t\tdescription: localize(\"\"),\n\t\t},\n\t\tMENU_DIVIDER,\n\t\t{\n\t\t\tlabel: localize(\"E&xit\"),\n\t\t\t...shortcut(window.is_electron_app ? \"Alt+F4\" : \"\"), // Alt+F4 closes the browser window (in most window managers)\n\t\t\tspeech_recognition: [\n\t\t\t\t\"exit application\", \"exit paint\", \"close paint window\",\n\t\t\t],\n\t\t\taction: () => {\n\t\t\t\tare_you_sure(() => {\n\t\t\t\t\tif (is_discord_embed) {\n\t\t\t\t\t\t// For the Discord Activity, there doesn't seem to be an API to exit the activity.\n\t\t\t\t\t\tshowMessageBox({\n\t\t\t\t\t\t\tmessage: \"Click the Leave Activity button in Discord to exit.\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Note: For a Chrome PWA, window.close() is allowed only if there is only one history entry.\n\t\t\t\t\t// I could make it try to close the window and then navigate to the official web desktop if it fails,\n\t\t\t\t\t// but that would be inconsistent, as it wouldn't close the window after using File > New or File > Open.\n\t\t\t\t\t// I could make it so that it uses replaceState when opening a new document (starting a new session);\n\t\t\t\t\t// that would prevent you from using Alt+Left to go back to the previous document, but that may be acceptable\n\t\t\t\t\t// for a desktop app experience, where the back button is already hidden.\n\t\t\t\t\t// That said, if you just installed the PWA, it will have history already (even if just the New Tab page),\n\t\t\t\t\t// as the tab is converted to a window, and in that case,\n\t\t\t\t\t// it would be unable to close, again being inconsistent, but less so.\n\t\t\t\t\t// (If on PWA install, the app could open a fresh new window and close itself, it could work from the start,\n\t\t\t\t\t// but if we try to do that, we'll be back at square one, trying to close a window with history.)\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// API contract is containing page can override window.close()\n\t\t\t\t\t\t// Note that e.g. (()=>{}).bind().toString() gives \"function () { [native code] }\"\n\t\t\t\t\t\t// so the window.close() must not use bind() (not that that's common practice anyway)\n\t\t\t\t\t\tconst close_overridden = frameElement && window.close && !/\\{\\s*\\[native code\\]\\s*\\}/.test(window.close.toString());\n\t\t\t\t\t\tif (close_overridden || window.is_electron_app) {\n\t\t\t\t\t\t\twindow.close();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (_error) {\n\t\t\t\t\t\t// In a cross-origin iframe, most likely\n\t\t\t\t\t\t// @TODO: establish postMessage API\n\t\t\t\t\t}\n\t\t\t\t\t// In a cross-origin iframe, or same origin but without custom close(), or top level:\n\t\t\t\t\t// Not all browsers support close() for closing a tab,\n\t\t\t\t\t// so redirect instead. Exit to the official web desktop.\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\twindow.location = \"https://98.js.org/\";\n\t\t\t\t});\n\t\t\t},\n\t\t\tdescription: localize(\"Quits Paint.\"),\n\t\t},\n\t],\n\t[localize(\"&Edit\")]: [\n\t\t{\n\t\t\tlabel: localize(\"&Undo\"),\n\t\t\t...shortcut(\"Ctrl+Z\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"undo\", \"undo that\",\n\t\t\t],\n\t\t\tenabled: () => undos.length >= 1,\n\t\t\taction: () => { undo(); },\n\t\t\tdescription: localize(\"Undoes the last action.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"&Repeat\"),\n\t\t\t...shortcut(\"F4\"), // also supported: Ctrl+Shift+Z, Ctrl+Y\n\t\t\tspeech_recognition: [\n\t\t\t\t\"repeat\", \"redo\",\n\t\t\t],\n\t\t\tenabled: () => redos.length >= 1,\n\t\t\taction: () => { redo(); },\n\t\t\tdescription: localize(\"Redoes the previously undone action.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"&History\"),\n\t\t\t...shortcut(\"Ctrl+Shift+Y\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"show history\", \"history\",\n\t\t\t],\n\t\t\taction: () => { show_document_history(); },\n\t\t\tdescription: localize(\"Shows the document history and lets you navigate to states not accessible with Undo or Repeat.\"),\n\t\t},\n\t\tMENU_DIVIDER,\n\t\t{\n\t\t\tlabel: localize(\"Cu&t\"),\n\t\t\t...shortcut(\"Ctrl+X\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"cut\", \"cut selection\", \"cut selection to clipboard\", \"cut the selection\", \"cut the selection to clipboard\", \"cut the selection to the clipboard\",\n\t\t\t],\n\t\t\tenabled: () =>\n\t\t\t\t// @TODO: support cutting text with this menu item as well (e.g. for the text tool)\n\t\t\t\t!!selection,\n\t\t\taction: () => {\n\t\t\t\tedit_cut(true);\n\t\t\t},\n\t\t\tdescription: localize(\"Cuts the selection and puts it on the Clipboard.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"&Copy\"),\n\t\t\t...shortcut(\"Ctrl+C\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"copy\", \"copy selection\", \"copy selection to clipboard\", \"copy the selection\", \"copy the selection to clipboard\", \"copy the selection to the clipboard\",\n\t\t\t],\n\t\t\tenabled: () =>\n\t\t\t\t// @TODO: support copying text with this menu item as well (e.g. for the text tool)\n\t\t\t\t!!selection,\n\t\t\taction: () => {\n\t\t\t\tedit_copy(true);\n\t\t\t},\n\t\t\tdescription: localize(\"Copies the selection and puts it on the Clipboard.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"&Paste\"),\n\t\t\t...shortcut(\"Ctrl+V\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"paste\", \"paste from clipboard\", \"paste from the clipboard\", \"insert clipboard\", \"insert clipboard contents\", \"insert the contents of the clipboard\", \"paste what's on the clipboard\",\n\t\t\t],\n\t\t\tenabled: () =>\n\t\t\t\t// @TODO: disable if nothing in clipboard or wrong type (if we can access that)\n\t\t\t\ttrue,\n\t\t\taction: () => {\n\t\t\t\tedit_paste(true);\n\t\t\t},\n\t\t\tdescription: localize(\"Inserts the contents of the Clipboard.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"C&lear Selection\"),\n\t\t\t...shortcut(\"Del\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"delete\", \"clear selection\", \"delete selection\", \"delete selected\", \"delete selected area\", \"clear selected area\", \"erase selected\", \"erase selected area\",\n\t\t\t],\n\t\t\tenabled: () => !!selection,\n\t\t\taction: () => { delete_selection(); },\n\t\t\tdescription: localize(\"Deletes the selection.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"Select &All\"),\n\t\t\t...shortcut(\"Ctrl+A\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"select all\", \"select everything\",\n\t\t\t\t\"select the whole image\", \"select the whole picture\", \"select the whole drawing\", \"select the whole canvas\", \"select the whole document\",\n\t\t\t\t\"select the entire image\", \"select the entire picture\", \"select the entire drawing\", \"select the entire canvas\", \"select the entire document\",\n\t\t\t],\n\t\t\taction: () => { select_all(); },\n\t\t\tdescription: localize(\"Selects everything.\"),\n\t\t},\n\t\tMENU_DIVIDER,\n\t\t{\n\t\t\tlabel: `${localize(\"C&opy To\")}...`,\n\t\t\tspeech_recognition: [\n\t\t\t\t\"copy to file\", \"copy selection to file\", \"copy selection to a file\", \"save selection\",\n\t\t\t\t\"save selection as file\", \"save selection as image\", \"save selection as picture\", \"save selection as image file\", \"save selection as document\",\n\t\t\t\t\"save selection as a file\", \"save selection as a image\", \"save selection as a picture\", \"save selection as a image file\", \"save selection as a document\",\n\t\t\t\t\"save selection to file\", \"save selection to image\", \"save selection to picture\", \"save selection to image file\", \"save selection to document\",\n\t\t\t\t\"save selection to a file\", \"save selection to a image\", \"save selection to a picture\", \"save selection to a image file\", \"save selection to a document\",\n\t\t\t],\n\t\t\tenabled: () => !!selection,\n\t\t\taction: () => { save_selection_to_file(); },\n\t\t\tdescription: localize(\"Copies the selection to a file.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: `${localize(\"Paste &From\")}...`,\n\t\t\tspeech_recognition: [\n\t\t\t\t\"paste a file\", \"paste from a file\", \"insert a file\", \"insert an image file\",\n\t\t\t],\n\t\t\taction: () => { choose_file_to_paste(); },\n\t\t\tdescription: localize(\"Pastes a file into the selection.\"),\n\t\t},\n\t],\n\t[localize(\"&View\")]: [\n\t\t{\n\t\t\tlabel: localize(\"&Tool Box\"),\n\t\t\t...shortcut(window.is_electron_app ? \"Ctrl+T\" : \"\"), // Ctrl+T opens a new browser tab, Ctrl+Alt+T opens a Terminal in Ubuntu, and Ctrl+Shift+Alt+T feels silly.\n\t\t\tspeech_recognition: [\n\t\t\t\t\"toggle tool box\", \"toggle tools box\", \"toggle toolbox\", \"toggle tool palette\", \"toggle tools palette\",\n\t\t\t\t// @TODO: hide/show\n\t\t\t],\n\t\t\tcheckbox: {\n\t\t\t\ttoggle: () => {\n\t\t\t\t\t$toolbox.toggle();\n\t\t\t\t},\n\t\t\t\tcheck: () => $toolbox.is(\":visible\"),\n\t\t\t},\n\t\t\tdescription: localize(\"Shows or hides the tool box.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"&Color Box\"),\n\t\t\t...shortcut(\"Ctrl+L\"), // focuses browser address bar, but Firefox and Chrome both allow overriding the default behavior\n\t\t\tspeech_recognition: [\n\t\t\t\t\"toggle color box\", \"toggle colors box\", \"toggle palette\", \"toggle color palette\", \"toggle colors palette\",\n\t\t\t\t// @TODO: hide/show\n\t\t\t],\n\t\t\tcheckbox: {\n\t\t\t\ttoggle: () => {\n\t\t\t\t\t$colorbox.toggle();\n\t\t\t\t},\n\t\t\t\tcheck: () => $colorbox.is(\":visible\"),\n\t\t\t},\n\t\t\tdescription: localize(\"Shows or hides the color box.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"&Status Bar\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"toggle status bar\", \"toggle status text\", \"toggle status area\", \"toggle status indicator\",\n\t\t\t\t// @TODO: hide/show\n\t\t\t],\n\t\t\tcheckbox: {\n\t\t\t\ttoggle: () => {\n\t\t\t\t\t$status_area.toggle();\n\t\t\t\t},\n\t\t\t\tcheck: () => $status_area.is(\":visible\"),\n\t\t\t},\n\t\t\tdescription: localize(\"Shows or hides the status bar.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"T&ext Toolbar\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"toggle text toolbar\", \"toggle font toolbar\", \"toggle text tool bar\", \"toggle font tool bar\",\n\t\t\t\t\"toggle font box\", \"toggle fonts box\", \"toggle text options box\", \"toggle text tool options box\", \"toggle font options box\",\n\t\t\t\t\"toggle font window\", \"toggle fonts window\", \"toggle text options window\", \"toggle text tool options window\", \"toggle font options window\",\n\t\t\t\t// @TODO: hide/show\n\t\t\t],\n\t\t\tenabled: false, // @TODO: toggle fonts box\n\t\t\tcheckbox: {\n\t\t\t\ttoggle: () => {\n\t\t\t\t\t// Kind of silly that I haven't implemented this in the 10 years I've been working on this project.\n\t\t\t\t},\n\t\t\t\tcheck: () => false,\n\t\t\t},\n\t\t\tdescription: localize(\"Shows or hides the text toolbar.\"),\n\t\t},\n\t\tMENU_DIVIDER,\n\t\t{\n\t\t\tlabel: localize(\"&Zoom\"),\n\t\t\tsubmenu: [\n\t\t\t\t{\n\t\t\t\t\tlabel: localize(\"&Normal Size\"),\n\t\t\t\t\t...shortcut(window.is_electron_app ? \"Ctrl+PgUp\" : \"\"), // Ctrl+PageUp cycles thru browser tabs in Chrome & Firefox; can be overridden in Chrome in fullscreen only\n\t\t\t\t\tspeech_recognition: [\n\t\t\t\t\t\t\"reset zoom\", \"zoom to normal size\",\n\t\t\t\t\t\t\"zoom to 100%\", \"set zoom to 100%\", \"set zoom 100%\",\n\t\t\t\t\t\t\"zoom to 1x\", \"set zoom to 1x\", \"set zoom 1x\",\n\t\t\t\t\t\t\"zoom level to 100%\", \"set zoom level to 100%\", \"set zoom level 100%\",\n\t\t\t\t\t\t\"zoom level to 1x\", \"set zoom level to 1x\", \"set zoom level 1x\",\n\t\t\t\t\t],\n\t\t\t\t\tdescription: localize(\"Zooms the picture to 100%.\"),\n\t\t\t\t\tenabled: () => magnification !== 1,\n\t\t\t\t\taction: () => {\n\t\t\t\t\t\tset_magnification(1);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: localize(\"&Large Size\"),\n\t\t\t\t\t...shortcut(window.is_electron_app ? \"Ctrl+PgDn\" : \"\"), // Ctrl+PageDown cycles thru browser tabs in Chrome & Firefox; can be overridden in Chrome in fullscreen only\n\t\t\t\t\tspeech_recognition: [\n\t\t\t\t\t\t\"zoom to large size\",\n\t\t\t\t\t\t\"zoom to 400%\", \"set zoom to 400%\", \"set zoom 400%\",\n\t\t\t\t\t\t\"zoom to 4x\", \"set zoom to 4x\", \"set zoom 4x\",\n\t\t\t\t\t\t\"zoom level to 400%\", \"set zoom level to 400%\", \"set zoom level 400%\",\n\t\t\t\t\t\t\"zoom level to 4x\", \"set zoom level to 4x\", \"set zoom level 4x\",\n\t\t\t\t\t],\n\t\t\t\t\tdescription: localize(\"Zooms the picture to 400%.\"),\n\t\t\t\t\tenabled: () => magnification !== 4,\n\t\t\t\t\taction: () => {\n\t\t\t\t\t\tset_magnification(4);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: localize(\"Zoom To &Window\"),\n\t\t\t\t\tspeech_recognition: [\n\t\t\t\t\t\t\"zoom to window\", \"zoom to view\",\n\t\t\t\t\t\t\"zoom to fit\",\n\t\t\t\t\t\t\"zoom to fit within window\", \"zoom to fit within view\",\n\t\t\t\t\t\t\"zoom to fit within the window\", \"zoom to fit within the view\",\n\t\t\t\t\t\t\"zoom to fit in window\", \"zoom to fit in view\",\n\t\t\t\t\t\t\"zoom to fit in the window\", \"zoom to fit in the view\",\n\t\t\t\t\t\t\"auto zoom\", \"fit zoom\",\n\t\t\t\t\t\t\"zoom to max\", \"zoom to maximum\", \"zoom to max size\", \"zoom to maximum size\",\n\t\t\t\t\t\t\"zoom so canvas fits\", \"zoom so picture fits\", \"zoom so image fits\", \"zoom so document fits\",\n\t\t\t\t\t\t\"zoom so whole canvas is visible\", \"zoom so whole picture is visible\", \"zoom so whole image is visible\", \"zoom so whole document is visible\",\n\t\t\t\t\t\t\"zoom so the whole canvas is visible\", \"zoom so the whole picture is visible\", \"zoom so the whole image is visible\", \"zoom so the whole document is visible\",\n\n\t\t\t\t\t\t\"fit to window\", \"fit to view\", \"fit in window\", \"fit in view\", \"fit within window\", \"fit within view\",\n\t\t\t\t\t\t\"fit picture to window\", \"fit picture to view\", \"fit picture in window\", \"fit picture in view\", \"fit picture within window\", \"fit picture within view\",\n\t\t\t\t\t\t\"fit image to window\", \"fit image to view\", \"fit image in window\", \"fit image in view\", \"fit image within window\", \"fit image within view\",\n\t\t\t\t\t\t\"fit canvas to window\", \"fit canvas to view\", \"fit canvas in window\", \"fit canvas in view\", \"fit canvas within window\", \"fit canvas within view\",\n\t\t\t\t\t\t\"fit document to window\", \"fit document to view\", \"fit document in window\", \"fit document in view\", \"fit document within window\", \"fit document within view\",\n\t\t\t\t\t],\n\t\t\t\t\tdescription: localize(\"Zooms the picture to fit within the view.\"),\n\t\t\t\t\taction: () => {\n\t\t\t\t\t\tconst rect = $canvas_area[0].getBoundingClientRect();\n\t\t\t\t\t\tconst margin = 30; // leave a margin so scrollbars won't appear\n\t\t\t\t\t\tlet mag = Math.min(\n\t\t\t\t\t\t\t(rect.width - margin) / main_canvas.width,\n\t\t\t\t\t\t\t(rect.height - margin) / main_canvas.height,\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// round to an integer percent for the View > Zoom > Custom... dialog, which shows non-integers as invalid\n\t\t\t\t\t\tmag = Math.floor(100 * mag) / 100;\n\t\t\t\t\t\tset_magnification(mag);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: `${localize(\"C&ustom\")}...`,\n\t\t\t\t\tdescription: localize(\"Zooms the picture.\"),\n\t\t\t\t\tspeech_recognition: [\n\t\t\t\t\t\t\"zoom custom\", \"custom zoom\", \"set custom zoom\", \"set custom zoom level\", \"zoom to custom level\", \"zoom to custom\", \"zoom level\", \"set zoom level\",\n\t\t\t\t\t],\n\t\t\t\t\taction: () => { show_custom_zoom_window(); },\n\t\t\t\t},\n\t\t\t\tMENU_DIVIDER,\n\t\t\t\t{\n\t\t\t\t\tlabel: localize(\"Show &Grid\"),\n\t\t\t\t\t...shortcut(\"Ctrl+G\"),\n\t\t\t\t\tspeech_recognition: [\n\t\t\t\t\t\t\"toggle show grid\",\n\t\t\t\t\t\t\"toggle grid\", \"toggle gridlines\", \"toggle grid lines\", \"toggle grid cells\",\n\t\t\t\t\t\t// @TODO: hide/show\n\t\t\t\t\t],\n\t\t\t\t\tenabled: () => magnification >= 4,\n\t\t\t\t\tcheckbox: {\n\t\t\t\t\t\ttoggle: () => { toggle_grid(); },\n\t\t\t\t\t\tcheck: () => show_grid,\n\t\t\t\t\t},\n\t\t\t\t\tdescription: localize(\"Shows or hides the grid.\"),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: localize(\"Show T&humbnail\"),\n\t\t\t\t\tspeech_recognition: [\n\t\t\t\t\t\t\"toggle show thumbnail\",\n\t\t\t\t\t\t\"toggle thumbnail\", \"toggle thumbnail view\", \"toggle thumbnail box\", \"toggle thumbnail window\",\n\t\t\t\t\t\t\"toggle preview\", \"toggle image preview\", \"toggle picture preview\",\n\t\t\t\t\t\t\"toggle picture in picture\", \"toggle picture in picture view\", \"toggle picture in picture box\", \"toggle picture in picture window\",\n\t\t\t\t\t\t// @TODO: hide/show\n\t\t\t\t\t],\n\t\t\t\t\tcheckbox: {\n\t\t\t\t\t\ttoggle: () => { toggle_thumbnail(); },\n\t\t\t\t\t\tcheck: () => show_thumbnail,\n\t\t\t\t\t},\n\t\t\t\t\tdescription: localize(\"Shows or hides the thumbnail view of the picture.\"),\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"&View Bitmap\"),\n\t\t\t...shortcut(\"Ctrl+F\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"view bitmap\", \"show bitmap\",\n\t\t\t\t\"fullscreen\", \"full-screen\", \"full screen\",\n\t\t\t\t\"show picture fullscreen\", \"show picture full-screen\", \"show picture full screen\",\n\t\t\t\t\"show image fullscreen\", \"show image full-screen\", \"show image full screen\",\n\t\t\t\t// @TODO: exit fullscreen\n\t\t\t],\n\t\t\taction: () => { view_bitmap(); },\n\t\t\tdescription: localize(\"Displays the entire picture.\"),\n\t\t},\n\t\tMENU_DIVIDER,\n\t\t{\n\t\t\tlabel: localize(\"&Fullscreen\"),\n\t\t\t...shortcut(\"F11\"), // relies on browser's shortcut\n\t\t\tspeech_recognition: [\n\t\t\t\t// won't work with speech recognition, needs a user gesture\n\t\t\t],\n\t\t\tenabled: () => Boolean(document.fullscreenEnabled || document.webkitFullscreenEnabled),\n\t\t\tcheckbox: {\n\t\t\t\tcheck: () => Boolean(document.fullscreenElement || document.webkitFullscreenElement),\n\t\t\t\ttoggle: () => {\n\t\t\t\t\tif (document.fullscreenElement || document.webkitFullscreenElement) {\n\t\t\t\t\t\tif (document.exitFullscreen) {\n\t\t\t\t\t\t\tdocument.exitFullscreen();\n\t\t\t\t\t\t} else if (document.webkitExitFullscreen) {\n\t\t\t\t\t\t\tdocument.webkitExitFullscreen();\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (document.documentElement.requestFullscreen) {\n\t\t\t\t\t\t\tdocument.documentElement.requestFullscreen();\n\t\t\t\t\t\t} else if (document.documentElement.webkitRequestFullscreen) {\n\t\t\t\t\t\t\tdocument.documentElement.webkitRequestFullscreen();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// check() would need to be async or faked with a timeout,\n\t\t\t\t\t// if the menus stayed open. @TODO: make all checkboxes close menus\n\t\t\t\t\tmenu_bar.closeMenus();\n\t\t\t\t},\n\t\t\t},\n\t\t\tdescription: localize(\"Makes the application take up the entire screen.\"),\n\t\t},\n\t],\n\t[localize(\"&Image\")]: [\n\t\t// @TODO: speech recognition: terms that apply to selection\n\t\t{\n\t\t\tlabel: localize(\"&Flip/Rotate\"),\n\t\t\t...shortcut((window.is_electron_app && !window.electron_is_dev) ? \"Ctrl+R\" : \"Ctrl+Alt+R\"), // Ctrl+R reloads the browser tab (or Electron window in dev mode via electron-debug)\n\t\t\tspeech_recognition: [\n\t\t\t\t\"flip\",\n\t\t\t\t\"rotate\",\n\t\t\t\t\"flip/rotate\", \"flip slash rotate\", \"flip and rotate\", \"flip or rotate\", \"flip rotate\",\n\t\t\t\t// @TODO: parameters to command\n\t\t\t],\n\t\t\taction: () => { image_flip_and_rotate(); },\n\t\t\tdescription: localize(\"Flips or rotates the picture or a selection.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"&Stretch/Skew\"),\n\t\t\t...shortcut(window.is_electron_app ? \"Ctrl+W\" : \"Ctrl+Alt+W\"), // Ctrl+W closes the browser tab\n\t\t\tspeech_recognition: [\n\t\t\t\t\"stretch\", \"scale\", \"resize image\",\n\t\t\t\t\"skew\",\n\t\t\t\t\"stretch/skew\", \"stretch slash skew\", \"stretch and skew\", \"stretch or skew\", \"stretch skew\",\n\t\t\t\t// @TODO: parameters to command\n\t\t\t],\n\t\t\taction: () => { image_stretch_and_skew(); },\n\t\t\tdescription: localize(\"Stretches or skews the picture or a selection.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"&Invert Colors\"),\n\t\t\t...shortcut(\"Ctrl+I\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"invert\",\n\t\t\t\t\"invert colors\",\n\t\t\t\t\"invert image\", \"invert picture\", \"invert drawing\",\n\t\t\t\t\"invert image colors\", \"invert picture colors\", \"invert drawing colors\",\n\t\t\t\t\"invert colors of image\", \"invert colors of picture\", \"invert colors of drawing\",\n\t\t\t],\n\t\t\taction: () => { image_invert_colors(); },\n\t\t\tdescription: localize(\"Inverts the colors of the picture or a selection.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: `${localize(\"&Attributes\")}...`,\n\t\t\t...shortcut(\"Ctrl+E\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"attributes\", \"image attributes\", \"picture attributes\", \"image options\", \"picture options\",\n\t\t\t\t\"dimensions\", \"image dimensions\", \"picture dimensions\",\n\t\t\t\t\"resize canvas\", \"resize document\", \"resize page\", // not resize image/picture because that implies scaling, handled by Stretch/Skew\n\t\t\t\t\"set image size\", \"set picture size\", \"set canvas size\", \"set document size\", \"set page size\",\n\t\t\t\t\"image size\", \"picture size\", \"canvas size\", \"document size\", \"page size\",\n\t\t\t\t\"configure image size\", \"configure picture size\", \"configure canvas size\", \"configure document size\", \"configure page size\",\n\t\t\t],\n\t\t\taction: () => { image_attributes(); },\n\t\t\tdescription: localize(\"Changes the attributes of the picture.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"&Clear Image\"),\n\t\t\t...shortcut((window.is_electron_app || !looksLikeChrome) ? \"Ctrl+Shift+N\" : \"\"), // Ctrl+Shift+N opens incognito window in chrome\n\t\t\tspeech_recognition: [\n\t\t\t\t\"clear image\", \"clear canvas\", \"clear picture\", \"clear page\", \"clear drawing\",\n\t\t\t\t// @TODO: erase?\n\t\t\t],\n\t\t\t// (mspaint says \"Ctrl+Shft+N\")\n\t\t\taction: () => { if (!selection) { clear(); } },\n\t\t\tenabled: () => !selection,\n\t\t\tdescription: localize(\"Clears the picture.\"),\n\t\t\t// action: ()=> {\n\t\t\t// \tif (selection) {\n\t\t\t// \t\tdelete_selection();\n\t\t\t// \t} else {\n\t\t\t// \t\tclear();\n\t\t\t// \t}\n\t\t\t// },\n\t\t\t// mspaint says localize(\"Clears the picture or selection.\"), but grays out the option when there's a selection\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"&Draw Opaque\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"toggle draw opaque\",\n\t\t\t\t\"toggle transparent selection\", \"toggle transparent selections\",\n\t\t\t\t\"toggle transparent selection mode\", \"toggle transparent selections mode\",\n\t\t\t\t\"toggle opaque selection\", \"toggle opaque selections\",\n\t\t\t\t\"toggle opaque selection mode\", \"toggle opaque selections mode\",\n\t\t\t\t// toggle opaque? toggle opacity?\n\t\t\t\t// @TODO: hide/show / \"draw opaque\" / \"draw transparent\"/translucent?\n\t\t\t],\n\t\t\tcheckbox: {\n\t\t\t\ttoggle: () => {\n\t\t\t\t\ttool_transparent_mode = !tool_transparent_mode;\n\t\t\t\t\t$G.trigger(\"option-changed\");\n\t\t\t\t},\n\t\t\t\tcheck: () => !tool_transparent_mode,\n\t\t\t},\n\t\t\tdescription: localize(\"Makes the current selection either opaque or transparent.\"),\n\t\t},\n\t],\n\t[localize(\"&Colors\")]: [\n\t\t{\n\t\t\tlabel: `${localize(\"&Edit Colors\")}...`,\n\t\t\tspeech_recognition: [\n\t\t\t\t\"edit colors\", \"edit color\", \"edit custom colors\", \"edit custom color\",\n\t\t\t\t\"pick custom color\", \"choose custom color\", \"pick a custom color\", \"choose a custom color\",\n\t\t\t\t\"edit last color\", \"create new color\", \"choose new color\", \"create a new color\", \"pick a new color\",\n\t\t\t],\n\t\t\taction: () => {\n\t\t\t\tshow_edit_colors_window();\n\t\t\t},\n\t\t\tdescription: localize(\"Creates a new color.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"&Get Colors\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"get colors\", \"load colors\", \"load color palette\", \"load palette\", \"load color palette file\", \"load palette file\", \"load list of colors\",\n\t\t\t],\n\t\t\taction: async () => {\n\t\t\t\tconst { file } = await systemHooks.showOpenFileDialog({ formats: palette_formats });\n\t\t\t\tAnyPalette.loadPalette(file, (error, new_palette) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\tshow_file_format_errors({ as_palette_error: error });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpalette = new_palette.map((color) => color.toString());\n\t\t\t\t\t\t$colorbox.rebuild_palette();\n\t\t\t\t\t\twindow.console?.log(`Loaded palette: ${palette.map(() => \"%c█\").join(\"\")}`, ...palette.map((color) => `color: ${color};`));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t\tdescription: localize(\"Uses a previously saved palette of colors.\"),\n\t\t},\n\t\t{\n\t\t\tlabel: localize(\"&Save Colors\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"save colors\", \"save list of colors\", \"save color palette\", \"save palette\", \"save color palette file\", \"save palette file\",\n\t\t\t],\n\t\t\taction: () => {\n\t\t\t\tconst ap = new AnyPalette.Palette();\n\t\t\t\tap.name = \"JS Paint Saved Colors\";\n\t\t\t\tap.numberOfColumns = 16; // 14?\n\t\t\t\tfor (const color of palette) {\n\t\t\t\t\tconst [r, g, b] = get_rgba_from_color(color);\n\t\t\t\t\tap.push(new AnyPalette.Color({\n\t\t\t\t\t\tred: r / 255,\n\t\t\t\t\t\tgreen: g / 255,\n\t\t\t\t\t\tblue: b / 255,\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t\tsystemHooks.showSaveFileDialog({\n\t\t\t\t\tdialogTitle: localize(\"Save Colors\"),\n\t\t\t\t\tdefaultFileName: localize(\"untitled.pal\"),\n\t\t\t\t\tformats: palette_formats,\n\t\t\t\t\tgetBlob: (format_id) => {\n\t\t\t\t\t\tconst file_content = AnyPalette.writePalette(ap, AnyPalette.formats[format_id]);\n\t\t\t\t\t\tconst blob = new Blob([file_content], { type: \"text/plain\" });\n\t\t\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\t\t\tsanity_check_blob(blob, () => {\n\t\t\t\t\t\t\t\tresolve(blob);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t},\n\t\t\tdescription: localize(\"Saves the current palette of colors to a file.\"),\n\t\t},\n\t],\n\t[localize(\"&Help\")]: [\n\t\t{\n\t\t\tlabel: localize(\"&Help Topics\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"help topics\", \"help me\", \"show help\", \"help\", \"show help window\", \"show help topics\", \"open help\",\n\t\t\t\t\"help viewer\", \"show help viewer\", \"open help viewer\",\n\t\t\t],\n\t\t\taction: () => { show_help(); },\n\t\t\tdescription: localize(\"Displays Help for the current task or command.\"),\n\t\t},\n\t\tMENU_DIVIDER,\n\t\t{\n\t\t\tlabel: localize(\"&About Paint\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"about paint\", \"about js paint\", \"about jspaint\", \"show about window\", \"open about window\", \"about window\",\n\t\t\t\t\"app info\", \"about the app\", \"app information\", \"information about the app\",\n\t\t\t\t\"application info\", \"about the application\", \"application information\", \"information about the application\",\n\t\t\t\t\"who made this\", \"who did this\", \"who did this xd\",\n\t\t\t],\n\t\t\taction: () => { show_about_paint(); },\n\t\t\tdescription: localize(\"Displays information about this application.\"),\n\t\t\t//description: localize(\"Displays program information, version number, and copyright.\"),\n\t\t},\n\t],\n\t[localize(\"E&xtras\")]: [\n\t\t{\n\t\t\temoji_icon: \"⌚\",\n\t\t\tlabel: localize(\"&History\"),\n\t\t\t...shortcut(\"Ctrl+Shift+Y\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t// This is a duplicate menu item (for easy access), so it doesn't need speech recognition data here.\n\t\t\t],\n\t\t\taction: () => { show_document_history(); },\n\t\t\tdescription: localize(\"Shows the document history and lets you navigate to states not accessible with Undo or Repeat.\"),\n\t\t},\n\t\t{\n\t\t\temoji_icon: \"🎞️\",\n\t\t\tlabel: localize(\"&Render History As GIF\"),\n\t\t\t...shortcut(\"Ctrl+Shift+G\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t// @TODO: animated gif, blah\n\t\t\t\t\"render history as gif\", \"render history as a gif\", \"render history animation\", \"make history animation\", \"make animation of history\", \"make animation of document history\", \"make animation from document history\",\n\t\t\t\t\"render a gif from the history\", \"render a gif animation from the history\", \"render an animation from the history\",\n\t\t\t\t\"make a gif from the history\", \"make a gif animation from the history\", \"make an animation from the history\",\n\t\t\t\t\"create a gif from the history\", \"create a gif animation from the history\", \"create an animation from the history\",\n\t\t\t\t// aaaaaaaaaaaaaaaaaaaaaaaaaa *exponentially explodes*\n\t\t\t\t\"make a gif\", \"make a gif of the history\", \"make a gif of the document history\", \"make a gif from the document history\",\n\t\t\t\t\"create a gif\", \"create a gif of the history\", \"create a gif of the document history\", \"create a gif from the document history\",\n\t\t\t\t\"make gif\", \"make gif of the history\", \"make gif of the document history\", \"make gif from the document history\",\n\t\t\t\t\"create gif\", \"create gif of the history\", \"create gif of the document history\", \"create gif from the document history\",\n\t\t\t\t\"make an animation\", \"make an animation of the history\", \"make an animation of the document history\", \"make an animation from the document history\",\n\t\t\t\t\"create an animation\", \"create an animation of the history\", \"create an animation of the document history\", \"create an animation from the document history\",\n\t\t\t\t\"make animation\", \"make animation of the history\", \"make animation of the document history\", \"make animation from the document history\",\n\t\t\t\t\"create animation\", \"create animation of the history\", \"create animation of the document history\", \"create animation from the document history\",\n\t\t\t],\n\t\t\taction: () => { render_history_as_gif(); },\n\t\t\tdescription: localize(\"Creates an animation from the document history.\"),\n\t\t},\n\t\t// {\n\t\t// \tlabel: localize(\"Render History as &APNG\",\n\t\t// \t// shortcut: \"Ctrl+Shift+A\",\n\t\t// \taction: ()=> { render_history_as_apng(); },\n\t\t// \tdescription: localize(\"Creates an animation from the document history.\"),\n\t\t// },\n\t\tMENU_DIVIDER,\n\t\t// {\n\t\t// \tlabel: localize(\"Extra T&ool Box\",\n\t\t// \tcheckbox: {\n\t\t// \t\ttoggle: ()=> {\n\t\t// \t\t\t// this doesn't really work well at all to have two toolboxes\n\t\t// \t\t\t// (this was not the original plan either)\n\t\t// \t\t\t$toolbox2.toggle();\n\t\t// \t\t},\n\t\t// \t\tcheck: ()=> {\n\t\t// \t\t\treturn $toolbox2.is(\":visible\");\n\t\t// \t\t},\n\t\t// \t},\n\t\t// \tdescription: localize(\"Shows or hides an extra tool box.\"),\n\t\t// },\n\t\t// {\n\t\t// \tlabel: localize(\"&Preferences\",\n\t\t// \taction: ()=> {\n\t\t// \t\t// :)\n\t\t// \t},\n\t\t// \tdescription: localize(\"Configures JS Paint.\"),\n\t\t// }\n\t\t{\n\t\t\temoji_icon: \"🤪\",\n\t\t\tlabel: localize(\"&Draw Randomly\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"draw randomly\", \"draw pseudorandomly\", \"draw wildly\", \"make random art\",\n\t\t\t],\n\t\t\tcheckbox: {\n\t\t\t\ttoggle: () => {\n\t\t\t\t\tif (simulatingGestures) {\n\t\t\t\t\t\tstopSimulatingGestures();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsimulateRandomGesturesPeriodically();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcheck: () => {\n\t\t\t\t\treturn simulatingGestures;\n\t\t\t\t},\n\t\t\t},\n\t\t\tdescription: localize(\"Draws randomly with different tools.\"),\n\t\t},\n\t\tMENU_DIVIDER,\n\t\t{\n\t\t\temoji_icon: \"👥\",\n\t\t\tlabel: localize(\"&Multi-User\"),\n\t\t\tsubmenu: [\n\t\t\t\t{\n\t\t\t\t\tlabel: localize(\"&New Session From Document\"),\n\t\t\t\t\tspeech_recognition: [\n\t\t\t\t\t\t\"new session from document\",\n\t\t\t\t\t\t\"session from document\",\n\t\t\t\t\t\t\"online session\",\n\t\t\t\t\t\t\"enable multi-user\",\n\t\t\t\t\t\t\"enable multiplayer\",\n\t\t\t\t\t\t\"start multi-user\",\n\t\t\t\t\t\t\"start multiplayer\",\n\t\t\t\t\t\t\"start collaboration\",\n\t\t\t\t\t\t\"start collaborating\",\n\t\t\t\t\t\t\"multi-user mode\",\n\t\t\t\t\t\t\"multiplayer mode\",\n\t\t\t\t\t\t\"collaboration mode\",\n\t\t\t\t\t\t\"collaborative mode\",\n\t\t\t\t\t\t\"collaborating mode\",\n\t\t\t\t\t\t\"online mode\",\n\t\t\t\t\t\t\"go online\",\n\t\t\t\t\t\t\"share canvas\",\n\t\t\t\t\t\t\"play with friends\",\n\t\t\t\t\t\t\"draw with friends\",\n\t\t\t\t\t\t\"draw together with friends\",\n\t\t\t\t\t\t\"draw together\",\n\t\t\t\t\t\t\"multiplayer\",\n\t\t\t\t\t\t\"multi-user\",\n\t\t\t\t\t\t\"collaborate\",\n\t\t\t\t\t\t\"collaboration\",\n\t\t\t\t\t\t\"collaborative\",\n\t\t\t\t\t\t\"collaborating\",\n\t\t\t\t\t],\n\t\t\t\t\taction: () => {\n\t\t\t\t\t\tshow_multi_user_setup_dialog(true);\n\t\t\t\t\t},\n\t\t\t\t\tdescription: localize(\"Starts a new multi-user session from the current document.\"),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: localize(\"New &Blank Session\"),\n\t\t\t\t\tspeech_recognition: [\n\t\t\t\t\t\t\"new blank session\",\n\t\t\t\t\t\t\"new empty session\",\n\t\t\t\t\t\t\"new fresh session\",\n\t\t\t\t\t\t\"new blank multi-user session\",\n\t\t\t\t\t\t\"new empty multi-user session\",\n\t\t\t\t\t\t\"new fresh multi-user session\",\n\t\t\t\t\t\t\"new blank multiplayer session\",\n\t\t\t\t\t\t\"new empty multiplayer session\",\n\t\t\t\t\t\t\"new fresh multiplayer session\",\n\t\t\t\t\t\t\"new multi-user session\",\n\t\t\t\t\t\t\"new multiplayer session\",\n\t\t\t\t\t\t\"new collaboration session\",\n\t\t\t\t\t\t\"new collaborative session\",\n\t\t\t\t\t\t\"start multi-user session\",\n\t\t\t\t\t\t\"start multiplayer session\",\n\t\t\t\t\t\t\"start collaboration session\",\n\t\t\t\t\t\t\"start collaborative session\",\n\t\t\t\t\t\t\"start multi-user with a new\",\n\t\t\t\t\t\t\"start multiplayer with a new\",\n\t\t\t\t\t\t\"start collaboration with a new\",\n\t\t\t\t\t\t\"start collaborating with a new\",\n\t\t\t\t\t\t\"start multi-user with a blank\",\n\t\t\t\t\t\t\"start multiplayer with a blank\",\n\t\t\t\t\t\t\"start collaboration with a blank\",\n\t\t\t\t\t\t\"start collaborating with a blank\",\n\t\t\t\t\t\t\"start multi-user with an empty\",\n\t\t\t\t\t\t\"start multiplayer with an empty\",\n\t\t\t\t\t\t\"start collaboration with an empty\",\n\t\t\t\t\t\t\"start collaborating with an empty\",\n\t\t\t\t\t\t\"start multi-user with new\",\n\t\t\t\t\t\t\"start multiplayer with new\",\n\t\t\t\t\t\t\"start collaboration with new\",\n\t\t\t\t\t\t\"start collaborating with new\",\n\t\t\t\t\t\t\"start multi-user with blank\",\n\t\t\t\t\t\t\"start multiplayer with blank\",\n\t\t\t\t\t\t\"start collaboration with blank\",\n\t\t\t\t\t\t\"start collaborating with blank\",\n\t\t\t\t\t\t\"start multi-user with empty\",\n\t\t\t\t\t\t\"start multiplayer with empty\",\n\t\t\t\t\t\t\"start collaboration with empty\",\n\t\t\t\t\t\t\"start collaborating with empty\",\n\t\t\t\t\t],\n\t\t\t\t\taction: () => {\n\t\t\t\t\t\tshow_multi_user_setup_dialog(false);\n\t\t\t\t\t},\n\t\t\t\t\tdescription: localize(\"Starts a new multi-user session from an empty document.\"),\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\temoji_icon: \"💄\",\n\t\t\tlabel: localize(\"&Themes\"),\n\t\t\tsubmenu: [\n\t\t\t\t{\n\t\t\t\t\temoji_icon: \"⬜\",\n\t\t\t\t\tlabel: localize(\"&Classic Light\"),\n\t\t\t\t\tspeech_recognition: [\n\t\t\t\t\t\t\"reset theme\", \"revert theme setting\",\n\t\t\t\t\t\t\"classic theme\", \"switch to classic theme\", \"use classic theme\", \"set theme to classic\", \"set theme classic\", \"switch to classic theme\", \"switch theme to classic\", \"switch theme classic\",\n\t\t\t\t\t\t\"retro theme\", \"switch to retro theme\", \"use retro theme\", \"set theme to retro\", \"set theme retro\", \"switch to retro theme\", \"switch theme to retro\", \"switch theme retro\",\n\t\t\t\t\t\t\"normal theme\", \"switch to normal theme\", \"use normal theme\", \"set theme to normal\", \"set theme normal\", \"switch to normal theme\", \"switch theme to normal\", \"switch theme normal\",\n\t\t\t\t\t\t\"default theme\", \"switch to default theme\", \"use default theme\", \"set theme to default\", \"set theme default\", \"switch to default theme\", \"switch theme to default\", \"switch theme default\",\n\t\t\t\t\t\t\"original theme\", \"switch to original theme\", \"use original theme\", \"set theme to original\", \"set theme original\", \"switch to original theme\", \"switch theme to original\", \"switch theme original\",\n\t\t\t\t\t\t\"basic theme\", \"switch to basic theme\", \"use basic theme\", \"set theme to basic\", \"set theme basic\", \"switch to basic theme\", \"switch theme to basic\", \"switch theme basic\",\n\t\t\t\t\t\t\"90s theme\", \"switch to 90s theme\", \"use 90s theme\", \"set theme to 90s\", \"set theme 90s\", \"switch to 90s theme\", \"switch theme to 90s\", \"switch theme 90s\",\n\t\t\t\t\t\t\"windows 98 theme\", \"switch to windows 98 theme\", \"use windows 98 theme\", \"set theme to windows 98\", \"set theme windows 98\", \"switch to windows 98 theme\", \"switch theme to windows 98\", \"switch theme windows 98\",\n\t\t\t\t\t\t\"windows 95 theme\", \"switch to windows 95 theme\", \"use windows 95 theme\", \"set theme to windows 95\", \"set theme windows 95\", \"switch to windows 95 theme\", \"switch theme to windows 95\", \"switch theme windows 95\",\n\t\t\t\t\t\t\"windows 2000 theme\", \"switch to windows 2000 theme\", \"use windows 2000 theme\", \"set theme to windows 2000\", \"set theme windows 2000\", \"switch to windows 2000 theme\", \"switch theme to windows 2000\", \"switch theme windows 2000\",\n\t\t\t\t\t\t// in contrast to the Dark theme:\n\t\t\t\t\t\t// TODO: stick with Modern/Classic while changing to Dark/Light variant\n\t\t\t\t\t\t\"light theme\", \"switch to light theme\", \"use light theme\", \"set theme to light\", \"set theme light\", \"switch to light theme\", \"switch theme to light\", \"switch theme light\",\n\t\t\t\t\t\t\"light mode\", \"switch to light mode\", \"use light mode\", \"set mode to light\", \"set mode light\", \"switch to light mode\", \"switch mode to light\", \"switch mode light\",\n\t\t\t\t\t\t\"bright theme\", \"switch to bright theme\", \"use bright theme\", \"set theme to bright\", \"set theme bright\", \"switch to bright theme\", \"switch theme to bright\", \"switch theme bright\",\n\t\t\t\t\t\t\"bright mode\", \"switch to bright mode\", \"use bright mode\", \"set mode to bright\", \"set mode bright\", \"switch to bright mode\", \"switch mode to bright\", \"switch mode bright\",\n\t\t\t\t\t\t\"day theme\", \"switch to day theme\", \"use day theme\", \"set theme to day\", \"set theme day\", \"switch to day theme\", \"switch theme to day\", \"switch theme day\",\n\t\t\t\t\t\t\"day mode\", \"switch to day mode\", \"use day mode\", \"set mode to day\", \"set mode day\", \"switch to day mode\", \"switch mode to day\", \"switch mode day\",\n\t\t\t\t\t\t\"go light\", \"go bright\",\n\t\t\t\t\t\t// new naming scheme\n\t\t\t\t\t\t\"classic light\", \"light classic\",\n\t\t\t\t\t],\n\t\t\t\t\taction: () => {\n\t\t\t\t\t\tset_theme(\"classic.css\");\n\t\t\t\t\t},\n\t\t\t\t\tenabled: () => get_theme() != \"classic.css\",\n\t\t\t\t\tdescription: localize(\"Makes JS Paint look like MS Paint from Windows 98.\"),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\temoji_icon: \"⬛\",\n\t\t\t\t\tlabel: localize(\"Classic &Dark\"),\n\t\t\t\t\tspeech_recognition: [\n\t\t\t\t\t\t\"dark theme\", \"switch to dark theme\", \"use dark theme\", \"set theme to dark\", \"set theme dark\", \"switch to dark theme\", \"switch theme to dark\", \"switch theme dark\",\n\t\t\t\t\t\t\"dark mode\", \"switch to dark mode\", \"use dark mode\", \"set mode to dark\", \"set mode dark\", \"switch to dark mode\", \"switch mode to dark\", \"switch mode dark\",\n\t\t\t\t\t\t\"dim theme\", \"switch to dim theme\", \"use dim theme\", \"set theme to dim\", \"set theme dim\", \"switch to dim theme\", \"switch theme to dim\", \"switch theme dim\",\n\t\t\t\t\t\t\"dim mode\", \"switch to dim mode\", \"use dim mode\", \"set mode to dim\", \"set mode dim\", \"switch to dim mode\", \"switch mode to dim\", \"switch mode dim\",\n\t\t\t\t\t\t\"night theme\", \"switch to night theme\", \"use night theme\", \"set theme to night\", \"set theme night\", \"switch to night theme\", \"switch theme to night\", \"switch theme night\",\n\t\t\t\t\t\t\"night mode\", \"switch to night mode\", \"use night mode\", \"set mode to night\", \"set mode night\", \"switch to night mode\", \"switch mode to night\", \"switch mode night\",\n\t\t\t\t\t\t\"go dark\", \"go dim\",\n\t\t\t\t\t\t// new naming scheme\n\t\t\t\t\t\t\"classic dark\", \"dark classic\",\n\t\t\t\t\t],\n\t\t\t\t\taction: () => {\n\t\t\t\t\t\tset_theme(\"dark.css\");\n\t\t\t\t\t},\n\t\t\t\t\tenabled: () => get_theme() != \"dark.css\",\n\t\t\t\t\tdescription: localize(\"Makes JS Paint look like MS Paint from Windows 98, with a dark color scheme.\"),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\temoji_icon: \"⚪\",\n\t\t\t\t\tlabel: localize(\"&Modern Light\"),\n\t\t\t\t\tspeech_recognition: [\n\t\t\t\t\t\t\"modern theme\", \"switch to modern theme\", \"use modern theme\", \"set theme to modern\", \"set theme modern\", \"switch to modern theme\", \"switch theme to modern\", \"switch theme modern\",\n\t\t\t\t\t\t// new naming scheme\n\t\t\t\t\t\t\"modern light\", \"light modern\",\n\t\t\t\t\t],\n\t\t\t\t\taction: () => {\n\t\t\t\t\t\tset_theme(\"modern.css\");\n\t\t\t\t\t},\n\t\t\t\t\tenabled: () => get_theme() != \"modern.css\",\n\t\t\t\t\tdescription: localize(\"Gives JS Paint a more modern look, with light colors.\"),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\temoji_icon: \"⚫\",\n\t\t\t\t\tlabel: localize(\"Mod&ern Dark\"),\n\t\t\t\t\tspeech_recognition: [\n\t\t\t\t\t\t\"dark modern theme\", \"switch to dark modern theme\", \"use dark modern theme\", \"set theme to dark modern\", \"set theme dark modern\", \"switch to dark modern theme\", \"switch theme to dark modern\", \"switch theme dark modern\",\n\t\t\t\t\t\t// new naming scheme\n\t\t\t\t\t\t\"modern dark\", \"dark modern\",\n\t\t\t\t\t],\n\t\t\t\t\taction: () => {\n\t\t\t\t\t\tset_theme(\"modern-dark.css\");\n\t\t\t\t\t},\n\t\t\t\t\tenabled: () => get_theme() != \"modern-dark.css\",\n\t\t\t\t\tdescription: localize(\"Gives JS Paint a more modern look, with dark colors.\"),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\temoji_icon: \"❄️\",\n\t\t\t\t\tlabel: localize(\"&Winter\"),\n\t\t\t\t\tspeech_recognition: [\n\t\t\t\t\t\t\"winter theme\", \"switch to winter theme\", \"use winter theme\", \"set theme to winter\", \"set theme winter\", \"switch to winter theme\", \"switch theme to winter\", \"switch theme winter\",\n\t\t\t\t\t\t\"holiday theme\", \"switch to holiday theme\", \"use holiday theme\", \"set theme to holiday\", \"set theme holiday\", \"switch to holiday theme\", \"switch theme to holiday\", \"switch theme holiday\",\n\t\t\t\t\t\t\"christmas theme\", \"switch to christmas theme\", \"use christmas theme\", \"set theme to christmas\", \"set theme christmas\", \"switch to christmas theme\", \"switch theme to christmas\", \"switch theme christmas\",\n\t\t\t\t\t\t\"hanukkah theme\", \"switch to hanukkah theme\", \"use hanukkah theme\", \"set theme to hanukkah\", \"set theme hanukkah\", \"switch to hanukkah theme\", \"switch theme to hanukkah\", \"switch theme hanukkah\",\n\t\t\t\t\t],\n\t\t\t\t\taction: () => {\n\t\t\t\t\t\tset_theme(\"winter.css\");\n\t\t\t\t\t},\n\t\t\t\t\tenabled: () => get_theme() != \"winter.css\",\n\t\t\t\t\tdescription: localize(\"Makes JS Paint look festive for the holidays.\"),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\temoji_icon: \"🤘\",\n\t\t\t\t\tlabel: localize(\"&Occult\"),\n\t\t\t\t\tspeech_recognition: [\n\t\t\t\t\t\t\"occult theme\", \"switch to occult theme\", \"use occult theme\", \"set theme to occult\", \"set theme occult\", \"switch to occult theme\", \"switch theme to occult\", \"switch theme occult\",\n\t\t\t\t\t\t\"occultist theme\", \"switch to occultist theme\", \"use occultist theme\", \"set theme to occultist\", \"set theme occultist\", \"switch to occultist theme\", \"switch theme to occultist\", \"switch theme occultist\",\n\t\t\t\t\t\t\"occultism theme\", \"switch to occultism theme\", \"use occultism theme\", \"set theme to occultism\", \"set theme occultism\", \"switch to occultism theme\", \"switch theme to occultism\", \"switch theme occultism\",\n\t\t\t\t\t\t\"satan theme\", \"switch to satan theme\", \"use satan theme\", \"set theme to satan\", \"set theme satan\", \"switch to satan theme\", \"switch theme to satan\", \"switch theme satan\",\n\t\t\t\t\t\t\"satanic theme\", \"switch to satanic theme\", \"use satanic theme\", \"set theme to satanic\", \"set theme satanic\", \"switch to satanic theme\", \"switch theme to satanic\", \"switch theme satanic\",\n\t\t\t\t\t\t\"satanist theme\", \"switch to satanist theme\", \"use satanist theme\", \"set theme to satanist\", \"set theme satanist\", \"switch to satanist theme\", \"switch theme to satanist\", \"switch theme satanist\",\n\t\t\t\t\t\t\"satanism theme\", \"switch to satanism theme\", \"use satanism theme\", \"set theme to satanism\", \"set theme satanism\", \"switch to satanism theme\", \"switch theme to satanism\", \"switch theme satanism\",\n\t\t\t\t\t\t\"demon theme\", \"switch to demon theme\", \"use demon theme\", \"set theme to demon\", \"set theme demon\", \"switch to demon theme\", \"switch theme to demon\", \"switch theme demon\",\n\t\t\t\t\t\t\"demonic theme\", \"switch to demonic theme\", \"use demonic theme\", \"set theme to demonic\", \"set theme demonic\", \"switch to demonic theme\", \"switch theme to demonic\", \"switch theme demonic\",\n\t\t\t\t\t\t\"daemon theme\", \"switch to daemon theme\", \"use daemon theme\", \"set theme to daemon\", \"set theme daemon\", \"switch to daemon theme\", \"switch theme to daemon\", \"switch theme daemon\",\n\t\t\t\t\t\t\"daemonic theme\", \"switch to daemonic theme\", \"use daemonic theme\", \"set theme to daemonic\", \"set theme daemonic\", \"switch to daemonic theme\", \"switch theme to daemonic\", \"switch theme daemonic\",\n\t\t\t\t\t\t\"devil theme\", \"switch to devil theme\", \"use devil theme\", \"set theme to devil\", \"set theme devil\", \"switch to devil theme\", \"switch theme to devil\", \"switch theme devil\",\n\t\t\t\t\t\t\"devilish theme\", \"switch to devilish theme\", \"use devilish theme\", \"set theme to devilish\", \"set theme devilish\", \"switch to devilish theme\", \"switch theme to devilish\", \"switch theme devilish\",\n\t\t\t\t\t\t\"devil worship theme\", \"switch to devil worship theme\", \"use devil worship theme\", \"set theme to devil worship\", \"set theme devil worship\", \"switch to devil worship theme\", \"switch theme to devil worship\", \"switch theme devil worship\",\n\t\t\t\t\t\t\"witchcraft theme\", \"switch to witchcraft theme\", \"use witchcraft theme\", \"set theme to witchcraft\", \"set theme witchcraft\", \"switch to witchcraft theme\", \"switch theme to witchcraft\", \"switch theme witchcraft\",\n\t\t\t\t\t\t\"witch theme\", \"switch to witch theme\", \"use witch theme\", \"set theme to witch\", \"set theme witch\", \"switch to witch theme\", \"switch theme to witch\", \"switch theme witch\",\n\t\t\t\t\t\t\"witchy theme\", \"switch to witchy theme\", \"use witchy theme\", \"set theme to witchy\", \"set theme witchy\", \"switch to witchy theme\", \"switch theme to witchy\", \"switch theme witchy\",\n\t\t\t\t\t\t\"witchery theme\", \"switch to witchery theme\", \"use witchery theme\", \"set theme to witchery\", \"set theme witchery\", \"switch to witchery theme\", \"switch theme to witchery\", \"switch theme witchery\",\n\t\t\t\t\t\t\"ritual theme\", \"switch to ritual theme\", \"use ritual theme\", \"set theme to ritual\", \"set theme ritual\", \"switch to ritual theme\", \"switch theme to ritual\", \"switch theme ritual\",\n\t\t\t\t\t\t\"ritualism theme\", \"switch to ritualism theme\", \"use ritualism theme\", \"set theme to ritualism\", \"set theme ritualism\", \"switch to ritualism theme\", \"switch theme to ritualism\", \"switch theme ritualism\",\n\t\t\t\t\t\t\"ritualistic theme\", \"switch to ritualistic theme\", \"use ritualistic theme\", \"set theme to ritualistic\", \"set theme ritualistic\", \"switch to ritualistic theme\", \"switch theme to ritualistic\", \"switch theme ritualistic\",\n\t\t\t\t\t\t\"Halloween theme\", \"switch to Halloween theme\", \"use Halloween theme\", \"set theme to Halloween\", \"set theme Halloween\", \"switch to Halloween theme\", \"switch theme to Halloween\", \"switch theme Halloween\",\n\n\t\t\t\t\t\t\"summon demon\", \"summon daemon\", \"summon demon theme\", \"summon daemon theme\",\n\t\t\t\t\t\t\"summon demons\", \"summon daemons\", \"summon demons theme\", \"summon daemons theme\",\n\t\t\t\t\t\t\"demon summoning\", \"daemon summoning\", \"demon summoning theme\", \"daemon summoning theme\",\n\t\t\t\t\t\t\"demons summoning\", \"daemons summoning\", \"demons summoning theme\", \"daemons summoning theme\",\n\t\t\t\t\t\t\"welcome demon\", \"welcome daemon\", \"welcome demon theme\", \"welcome daemon theme\",\n\t\t\t\t\t\t\"welcome demons\", \"welcome daemons\", \"welcome demons theme\", \"welcome daemons theme\",\n\t\t\t\t\t\t\"summon satan\", \"summon satan theme\", \"summon daemon theme\",\n\t\t\t\t\t\t\"satan summoning\", \"satan summoning theme\", \"daemon summoning theme\",\n\t\t\t\t\t\t\"welcome satan\", \"welcome satan theme\",\n\t\t\t\t\t\t\"summon devil\", \"summon the devil\", \"summon devil theme\", \"summon the devil theme\",\n\t\t\t\t\t\t\"welcome devil\", \"welcome the devil\", \"welcome devil theme\", \"welcome the devil theme\",\n\n\t\t\t\t\t\t\"I beseech thee\", \"I entreat thee\", \"I summon thee\", \"I call upon thy name\", \"I call upon thine name\", \"Lord Satan\", \"hail Satan\", \"hail Lord Satan\", \"O Mighty Satan\", \"Oh Mighty Satan\",\n\t\t\t\t\t\t\"In nomine Dei nostri Satanas Luciferi Excelsi\", \"Rege Satanas\", \"Ave Satanas\", \"Rege Satana\", \"Ave Satana\",\n\t\t\t\t\t\t\"go demonic\", \"go daemonic\", \"go occult\", \"666\",\n\t\t\t\t\t\t\"begin ritual\", \"begin the ritual\", \"begin a ritual\",\n\t\t\t\t\t\t\"start ritual\", \"start the ritual\", \"start a ritual\",\n\t\t\t\t\t],\n\t\t\t\t\taction: () => {\n\t\t\t\t\t\tset_theme(\"occult.css\");\n\t\t\t\t\t},\n\t\t\t\t\tenabled: () => get_theme() != \"occult.css\",\n\t\t\t\t\tdescription: localize(\"Starts the ritual.\"),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\temoji_icon: \"🫧\",\n\t\t\t\t\tlabel: localize(\"&Bubblegum\"),\n\t\t\t\t\tspeech_recognition: [\n\t\t\t\t\t\t\"bubblegum theme\", \"switch to bubblegum theme\", \"use bubblegum theme\", \"set theme to bubblegum\", \"set theme bubblegum\", \"switch to bubblegum theme\", \"switch theme to bubblegum\", \"switch theme bubblegum\",\n\t\t\t\t\t\t\"pink theme\", \"switch to pink theme\", \"use pink theme\", \"set theme to pink\", \"set theme pink\", \"switch to pink theme\", \"switch theme to pink\", \"switch theme pink\",\n\t\t\t\t\t\t\"pearlescent theme\", \"pearlescent bubblegum\", \"pearlescent pink\",\n\t\t\t\t\t\t\"pearly theme\", \"pearly bubblegum\", \"pearly pink\",\n\t\t\t\t\t\t\"shiny theme\", \"shiny bubblegum\", \"shiny pink\",\n\t\t\t\t\t\t\"3D theme\", \"3D bubblegum\", \"3D pink\",\n\t\t\t\t\t\t\"bubbly theme\",\n\t\t\t\t\t\t\"corporate bubblegum\",\n\t\t\t\t\t\t\"business pink\",\n\t\t\t\t\t],\n\t\t\t\t\taction: () => {\n\t\t\t\t\t\tset_theme(\"bubblegum.css\");\n\t\t\t\t\t},\n\t\t\t\t\tenabled: () => get_theme() != \"bubblegum.css\",\n\t\t\t\t\tdescription: localize(\"Makes JS Paint look like pearlescent bubblegum.\"),\n\t\t\t\t},\n\t\t\t\t// {\n\t\t\t\t// \temoji_icon: \"🪐\",\n\t\t\t\t// \tlabel: localize(\"&Retro Futurist\"),\n\t\t\t\t// \tspeech_recognition: [\n\t\t\t\t// \t\t\"retrofuturist theme\", \"switch to retrofuturist theme\", \"use retrofuturist theme\", \"set theme to retrofuturist\", \"set theme retrofuturist\", \"switch to retrofuturist theme\", \"switch theme to retrofuturist\", \"switch theme retrofuturist\",\n\t\t\t\t// \t\t\"retro futurist theme\", \"switch to retro futurist theme\", \"use retro futurist theme\", \"set theme to retro futurist\", \"set theme retro futurist\", \"switch to retro futurist theme\", \"switch theme to retro futurist\", \"switch theme retro futurist\",\n\t\t\t\t// \t\t\"retrofuturistic theme\", \"switch to retrofuturistic theme\", \"use retrofuturistic theme\", \"set theme to retrofuturistic\", \"set theme retrofuturistic\", \"switch to retrofuturistic theme\", \"switch theme to retrofuturistic\", \"switch theme retrofuturistic\",\n\t\t\t\t// \t\t\"retro futuristic theme\", \"switch to retro futuristic theme\", \"use retro futuristic theme\", \"set theme to retro futuristic\", \"set theme retro futuristic\", \"switch to retro futuristic theme\", \"switch theme to retro futuristic\", \"switch theme retro futuristic\",\n\t\t\t\t// \t\t// spell-checker: disable\n\t\t\t\t// \t\t\"scifi theme\", \"switch to scifi theme\", \"use scifi theme\", \"set theme to scifi\", \"set theme scifi\", \"switch to scifi theme\", \"switch theme to scifi\", \"switch theme scifi\",\n\t\t\t\t// \t\t// spell-checker: enable\n\t\t\t\t// \t\t\"sci-fi theme\", \"switch to sci-fi theme\", \"use sci-fi theme\", \"set theme to sci-fi\", \"set theme sci-fi\", \"switch to sci-fi theme\", \"switch theme to sci-fi\", \"switch theme sci-fi\",\n\t\t\t\t// \t],\n\t\t\t\t// \taction: () => {\n\t\t\t\t// \t\tset_theme(\"retrofuturist.css\");\n\t\t\t\t// \t},\n\t\t\t\t// \tenabled: false,\n\t\t\t\t// \t// enabled: () => get_theme() != \"retrofuturist.css\",\n\t\t\t\t// \tdescription: localize(\"Makes JS Paint look like the future as imagined in the past.\"),\n\t\t\t\t// },\n\t\t\t\t// {\n\t\t\t\t// \temoji_icon: \"🧺\",\n\t\t\t\t// \tlabel: localize(\"&Picnic\"),\n\t\t\t\t// \tspeech_recognition: [\n\t\t\t\t// \t\t\"picnic theme\", \"switch to picnic theme\", \"use picnic theme\", \"set theme to picnic\", \"set theme picnic\", \"switch to picnic theme\", \"switch theme to picnic\", \"switch theme picnic\",\n\t\t\t\t// \t\t\"pic-nic theme\", \"switch to pic-nic theme\", \"use pic-nic theme\", \"set theme to pic-nic\", \"set theme pic-nic\", \"switch to pic-nic theme\", \"switch theme to pic-nic\", \"switch theme pic-nic\",\n\t\t\t\t// \t\t\"sandbox theme\", \"switch to sandbox theme\", \"use sandbox theme\", \"set theme to sandbox\", \"set theme sandbox\", \"switch to sandbox theme\", \"switch theme to sandbox\", \"switch theme sandbox\",\n\t\t\t\t// \t\t\"wooden theme\", \"switch to wooden theme\", \"use wooden theme\", \"set theme to wooden\", \"set theme wooden\", \"switch to wooden theme\", \"switch theme to wooden\", \"switch theme wooden\",\n\t\t\t\t// \t],\n\t\t\t\t// \taction: () => {\n\t\t\t\t// \t\tset_theme(\"picnic.css\");\n\t\t\t\t// \t},\n\t\t\t\t// \tenabled: false,\n\t\t\t\t// \t// enabled: () => get_theme() != \"picnic.css\",\n\t\t\t\t// \tdescription: localize(\"Makes JS Paint look like a picnic in the park.\"),\n\t\t\t\t// },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\temoji_icon: \"🌍\",\n\t\t\tlabel: localize(\"&Language\"),\n\t\t\tsubmenu: available_languages.map((available_language) => (\n\t\t\t\t{\n\t\t\t\t\temoji_icon: get_language_emoji(available_language),\n\t\t\t\t\tlabel: get_language_endonym(available_language),\n\t\t\t\t\taction: () => {\n\t\t\t\t\t\tset_language(available_language);\n\t\t\t\t\t},\n\t\t\t\t\tenabled: () => get_language() != available_language,\n\t\t\t\t\tdescription: localize(\"Changes the language to %1.\", get_iso_language_name(available_language)),\n\t\t\t\t}\n\t\t\t)),\n\t\t},\n\t\t{\n\t\t\temoji_icon: \"🧑\",\n\t\t\t// label: localize(\"Head Tracking\"),\n\t\t\t// label: localize(\"M&ove Cursor With Head\"),\n\t\t\tlabel: localize(\"Head Tracker\"), // adding (Experimental) makes it too long, \"WIP\" or \"Beta\" feels too techy\n\t\t\tspeech_recognition: [\n\t\t\t\t\"head tracking\", \"head tracker\", \"move cursor with head\", \"control cursor with head\", \"mouse with head\", \"mouse cursor with head\",\n\t\t\t\t\"face tracking\", \"face tracker\", \"move cursor with face\", \"control cursor with face\", \"mouse with face\", \"mouse cursor with face\",\n\t\t\t\t\"head mouse\", \"face mouse\", \"facial mouse\",\n\t\t\t\t\"head cursor\", \"face cursor\", \"facial cursor\",\n\t\t\t\t\"head pointer\", \"face pointer\", \"facial pointer\",\n\t\t\t\t\"head control\", \"face control\", \"facial control\",\n\t\t\t\t\"head movement\", \"face movement\", \"facial movement\",\n\t\t\t\t\"head motion\", \"face motion\", \"facial motion\",\n\t\t\t\t\"head gestures\", \"face gestures\", \"facial gestures\",\n\t\t\t\t\"tracky mouse\", // name of the library\n\t\t\t],\n\t\t\tcheckbox: {\n\t\t\t\ttoggle: () => {\n\t\t\t\t\tif (/head-tracker/i.test(location.hash)) {\n\t\t\t\t\t\tchange_url_param(\"head-tracker\", false);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchange_url_param(\"head-tracker\", true);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcheck: () => {\n\t\t\t\t\treturn /head-tracker/i.test(location.hash);\n\t\t\t\t},\n\t\t\t},\n\t\t\tdescription: localize(\"Controls the cursor with head movements.\"),\n\t\t},\n\t\t// Later on I'll probably merge the Head Tracker and Dwell Clicker options into a Tracky Mouse option,\n\t\t// or I'll create a preferences screen, where I'll be able to better clarify the relationships between features.\n\t\t{\n\t\t\temoji_icon: \"⏱️\",\n\t\t\t// label: localize(\"Dwell &Click\"),\n\t\t\tlabel: localize(\"Dwell &Clicker\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"dwell clicking\", \"dwell click\", \"dwell clicker\", \"auto click\", \"auto clicker\", \"auto clicking\", \"click automatically\",\n\t\t\t\t\"stop clicking\", \"stop auto clicking\", \"stop auto click\", \"stop auto clicker\", \"stop dwell clicking\", \"stop dwell click\", \"stop dwell clicker\",\n\t\t\t],\n\t\t\tcheckbox: {\n\t\t\t\ttoggle: () => {\n\t\t\t\t\tif (/head-tracker/i.test(location.hash)) {\n\t\t\t\t\t\t// @TODO: confirmation dialog that you could cancel with dwell clicking!\n\t\t\t\t\t\t// Or: make head tracker work independently of dwell clicking, i.e. with facial gestures\n\t\t\t\t\t\t// if (confirm(\"This will disable head tracker mode.\")) {\n\t\t\t\t\t\t// change_some_url_params({\n\t\t\t\t\t\t// \t\"head-tracker\": false,\n\t\t\t\t\t\t// \t\"dwell-clicker\": false,\n\t\t\t\t\t\t// });\n\t\t\t\t\t\t// }\n\t\t\t\t\t} else if (/dwell-clicker/i.test(location.hash)) {\n\t\t\t\t\t\tchange_url_param(\"dwell-clicker\", false);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchange_url_param(\"dwell-clicker\", true);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcheck: () => {\n\t\t\t\t\treturn /dwell-clicker|head-tracker/i.test(location.hash);\n\t\t\t\t},\n\t\t\t},\n\t\t\tenabled: () => {\n\t\t\t\treturn !/head-tracker/i.test(location.hash);\n\t\t\t},\n\t\t\tdescription: localize(\"Clicks automatically after hovering in one place.\"),\n\t\t},\n\t\t{\n\t\t\temoji_icon: \"🔍\",\n\t\t\t// label: localize(\"&Enlarge Buttons\"), // too specific; it also enlarges windows and other UI elements\n\t\t\tlabel: localize(\"&Enlarge UI\"), // a bit technical, but hopefully common enough\n\t\t\t// label: localize(\"&Enlarge Interface\"), // avoids an acronym, but not much less technical\n\t\t\tspeech_recognition: [\n\t\t\t\t\"enlarge buttons\", \"enlarge ui\", \"enlarge user interface\", \"enlarge interface\", \"enlarge the buttons\", \"enlarge the user interface\", \"enlarge the interface\", \"make buttons bigger\", \"make ui bigger\", \"make user interface bigger\", \"make interface bigger\", \"make the buttons bigger\", \"make the user interface bigger\", \"make the interface bigger\", \"bigger buttons\", \"bigger ui\", \"bigger user interface\", \"bigger interface\",\n\t\t\t\t\"toggle enlarged buttons\", \"toggle enlarged ui\", \"toggle enlarged user interface\", \"toggle enlarged interface\", \"toggle bigger buttons\", \"toggle bigger ui\", \"toggle bigger user interface\", \"toggle bigger interface\",\n\t\t\t\t\"enable enlarged buttons\", \"enable enlarged ui\", \"enable enlarged user interface\", \"enable enlarged interface\", \"enable bigger buttons\", \"enable bigger ui\", \"enable bigger user interface\", \"enable bigger interface\",\n\t\t\t\t\"disable enlarged buttons\", \"disable enlarged ui\", \"disable enlarged user interface\", \"disable enlarged interface\", \"disable bigger buttons\", \"disable bigger ui\", \"disable bigger user interface\", \"disable bigger interface\",\n\t\t\t\t\"shrink buttons\", \"shrink ui\", \"shrink user interface\", \"shrink interface\", \"shrink the buttons\", \"shrink the user interface\", \"shrink the interface\", \"make buttons smaller\", \"make ui smaller\", \"make user interface smaller\", \"make interface smaller\", \"make the buttons smaller\", \"make the user interface smaller\", \"make the interface smaller\", \"smaller buttons\", \"smaller ui\", \"smaller user interface\", \"smaller interface\",\n\t\t\t],\n\t\t\tcheckbox: {\n\t\t\t\ttoggle: () => {\n\t\t\t\t\tchange_url_param(\"enlarge-ui\", !/enlarge-ui/i.test(location.hash));\n\t\t\t\t},\n\t\t\t\tcheck: () => {\n\t\t\t\t\treturn /enlarge-ui/i.test(location.hash);\n\t\t\t\t},\n\t\t\t},\n\t\t\tdescription: localize(\"Enlarges buttons, windows, and menus for easier clicking.\"),\n\t\t},\n\t\t{\n\t\t\temoji_icon: \"↩️\", // doesn't match orientation of the actual button icon's arrow\n\t\t\t// label: localize(\"&Floating Undo/Redo Buttons\"),\n\t\t\t// label: localize(\"Easy Undo/Redo\"),\n\t\t\t// label: localize(\"Easy &Undo\"),\n\t\t\t// label: localize(\"Easy &Undo Button\"),\n\t\t\t// label: localize(\"Floating &Undo\"), // it might not always be floating, it might become part of the tool box\n\t\t\tlabel: localize(\"Quick Undo Button\"), // a bit long\n\t\t\t// label: localize(\"Quick Undo\"), // \"Quick Undo\" also refers to pressing both mouse buttons to cancel an action, not that you can't have multiple ways to \"quick undo\" if that's the better name\n\t\t\tspeech_recognition: [\n\t\t\t],\n\t\t\tcheckbox: {\n\t\t\t\ttoggle: () => {\n\t\t\t\t\tchange_url_param(\"easy-undo\", !/easy-undo/i.test(location.hash));\n\t\t\t\t},\n\t\t\t\tcheck: () => {\n\t\t\t\t\treturn /easy-undo/i.test(location.hash);\n\t\t\t\t},\n\t\t\t},\n\t\t\tdescription: localize(\"Adds a button for undoing the last action.\"),\n\t\t},\n\t\t{\n\t\t\temoji_icon: \"↕️\",\n\t\t\tlabel: localize(\"&Vertical Color Box\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"toggle vertical color box\", \"toggle vertical color box mode\",\n\t\t\t\t\"toggle vertical colors box\", \"toggle vertical colors box mode\",\n\t\t\t\t\"toggle vertical palette\", \"toggle vertical palette mode\",\n\t\t\t\t\"toggle horizontal color box\", \"toggle horizontal color box mode\",\n\t\t\t\t\"toggle horizontal colors box\", \"toggle horizontal colors box mode\",\n\t\t\t\t\"toggle horizontal palette\", \"toggle horizontal palette mode\",\n\t\t\t\t// @TODO: \"use a vertical/horizontal color box\", \"place palette on the left\", \"make palette tall/wide\", etc.\n\t\t\t],\n\t\t\tcheckbox: {\n\t\t\t\ttoggle: () => {\n\t\t\t\t\tchange_url_param(\"vertical-color-box-mode\", !/vertical-color-box-mode/i.test(location.hash));\n\t\t\t\t},\n\t\t\t\tcheck: () => {\n\t\t\t\t\treturn /vertical-color-box-mode/i.test(location.hash);\n\t\t\t\t},\n\t\t\t},\n\t\t\tdescription: localize(\"Arranges the color box vertically.\"),\n\t\t},\n\t\t{\n\t\t\temoji_icon: \"🎙️\",\n\t\t\tlabel: localize(\"&Speech Recognition\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"toggle speech recognition\", \"toggle speech recognition mode\",\n\t\t\t\t\"disable speech recognition\", \"disable speech recognition mode\", \"turn off speech recognition\", \"turn off speech recognition mode\", \"leave speech recognition mode\", \"exit speech recognition mode\",\n\t\t\t],\n\t\t\tcheckbox: {\n\t\t\t\ttoggle: () => {\n\t\t\t\t\tif (/speech-recognition-mode/i.test(location.hash)) {\n\t\t\t\t\t\tchange_url_param(\"speech-recognition-mode\", false);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchange_url_param(\"speech-recognition-mode\", true);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcheck: () => {\n\t\t\t\t\treturn speech_recognition_active;\n\t\t\t\t},\n\t\t\t},\n\t\t\tenabled: () => speech_recognition_available,\n\t\t\tdescription: localize(\"Controls the application with voice commands.\"),\n\t\t},\n\t\tMENU_DIVIDER,\n\t\t{\n\t\t\temoji_icon: \"🗃️\",\n\t\t\tlabel: localize(\"Manage Storage\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t// This is a duplicate menu item (for easy access), so it doesn't need speech recognition data here.\n\t\t\t],\n\t\t\taction: () => { manage_storage(); },\n\t\t\tdescription: localize(\"Manages storage of previously created or opened pictures.\"),\n\t\t},\n\t\tMENU_DIVIDER,\n\t\t{\n\t\t\temoji_icon: \"📢\",\n\t\t\tlabel: localize(\"Project News\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"project news\", \"news about the project\", \"news about this project\",\n\t\t\t\t\"app news\", \"news about the app\", \"news about this app\",\n\t\t\t\t\"application news\", \"news about the application\", \"news about this application\",\n\t\t\t\t\"what's new\", \"new features\",\n\t\t\t\t\"show news\", \"show news update\", \"news update\",\n\t\t\t],\n\t\t\taction: () => { show_news(); },\n\t\t\tdescription: localize(\"Shows news about JS Paint.\"),\n\t\t},\n\t\t{\n\t\t\temoji_icon: \"👾\", // \"👋\",\n\t\t\tlabel: localize(\"Discord\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"chat on discord\", \"discord server\", \"discord community\", \"join the discord\", \"join discord\", \"visit the discord\", \"visit discord\", \"discord chat\",\n\t\t\t],\n\t\t\taction: () => {\n\t\t\t\twindow.open(\"https://discord.gg/jxQBK3k8tx\");\n\t\t\t},\n\t\t\tdescription: localize(\"Joins the community on Discord.\"),\n\t\t},\n\t\t{\n\t\t\temoji_icon: \"ℹ️\",\n\t\t\tlabel: localize(\"GitHub\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"repo on github\", \"project on github\", \"show the source code\", \"show source code\",\n\t\t\t],\n\t\t\taction: () => { window.open(\"https://github.com/1j01/jspaint\"); },\n\t\t\tdescription: localize(\"Shows the project on GitHub.\"),\n\t\t},\n\t\t{\n\t\t\temoji_icon: \"💵\",\n\t\t\tlabel: localize(\"Donate\"),\n\t\t\tspeech_recognition: [\n\t\t\t\t\"donate\", \"make a monetary contribution\",\n\t\t\t],\n\t\t\taction: () => { window.open(\"https://www.paypal.me/IsaiahOdhner\"); },\n\t\t\tdescription: localize(\"Supports the project.\"),\n\t\t},\n\t],\n};\n\nfor (const [top_level_menu_key, menu] of Object.entries(menus)) {\n\tconst top_level_menu_name = top_level_menu_key.replace(/&/, \"\");\n\tconst add_literal_navigation_speech_recognition = (menu, ancestor_names) => {\n\t\tfor (const menu_item of menu) {\n\t\t\tif (menu_item !== MENU_DIVIDER) {\n\t\t\t\tconst menu_item_name = menu_item.label.replace(/&|\\.\\.\\.|\\(|\\)/g, \"\");\n\t\t\t\t// console.log(menu_item_name);\n\t\t\t\tlet menu_item_matchers = [menu_item_name];\n\t\t\t\tif (/\\//.test(menu_item_name)) {\n\t\t\t\t\tmenu_item_matchers = [\n\t\t\t\t\t\tmenu_item_name,\n\t\t\t\t\t\tmenu_item_name.replace(/\\//, \" \"),\n\t\t\t\t\t\tmenu_item_name.replace(/\\//, \" and \"),\n\t\t\t\t\t\tmenu_item_name.replace(/\\//, \" or \"),\n\t\t\t\t\t\tmenu_item_name.replace(/\\//, \" slash \"),\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t\tmenu_item_matchers = menu_item_matchers.map((menu_item_matcher) => {\n\t\t\t\t\treturn `${ancestor_names} ${menu_item_matcher}`;\n\t\t\t\t});\n\t\t\t\tmenu_item.speech_recognition = (menu_item.speech_recognition || []).concat(menu_item_matchers);\n\t\t\t\t// console.log(menu_item_matchers, menu_item.speech_recognition);\n\n\t\t\t\tif (menu_item.submenu) {\n\t\t\t\t\tadd_literal_navigation_speech_recognition(menu_item.submenu, `${ancestor_names} ${menu_item_name}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\tadd_literal_navigation_speech_recognition(menu, top_level_menu_name);\n}\n\nexport { menus };\n\n/**\n * Expands a shortcut label into an object with the label and a corresponding ARIA key shortcuts value.\n * Could handle \"CtrlOrCmd\" like Electron does, here, or just treat \"Ctrl\" as control or command.\n * Of course it would be more ergonomic if OS-GUI.js handled this sort of thing,\n * and I have thought about rewriting the OS-GUI API to mimic Electron's.\n * I also have some munging logic in electron-main.js related to this.\n * @param {string} shortcutLabel\n * @returns {{shortcutLabel?: string, ariaKeyShortcuts?: string}}\n */\nfunction shortcut(shortcutLabel) {\n\tif (!shortcutLabel) return {};\n\tconst ariaKeyShortcuts = shortcutLabel.replace(/Ctrl/g, \"Control\").replace(/\\bDel\\b/, \"Delete\");//.replace(/\\bEsc\\b/, \"Escape\").replace(/\\bIns\\b/, \"Insert\");\n\tif (!validateAriaKeyshortcuts(ariaKeyShortcuts)) {\n\t\tconsole.error(`Invalid ARIA key shortcuts: ${JSON.stringify(ariaKeyShortcuts)} (from shortcut label: ${JSON.stringify(shortcutLabel)}) (or validator is incomplete)`);\n\t}\n\treturn {\n\t\tshortcutLabel,\n\t\tariaKeyShortcuts,\n\t};\n}\n\n/**\n * Validates an aria-keyshortcuts value.\n *\n * AI-generated code (ChatGPT), prompted with the spec section: https://w3c.github.io/aria/#aria-keyshortcuts\n *\n * @param {string} value\n * @returns {boolean} valid\n */\nfunction validateAriaKeyshortcuts(value) {\n\t// Define valid modifier and non-modifier keys based on UI Events KeyboardEvent key Values spec\n\tconst modifiers = [\"Alt\", \"Control\", \"Shift\", \"Meta\", \"AltGraph\"];\n\tconst nonModifiers = [\n\t\t\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\",\n\t\t\"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\",\n\t\t\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"0\",\n\t\t\"Delete\",\n\t\t\"Enter\", \"Tab\", \"ArrowRight\", \"ArrowLeft\", \"ArrowUp\", \"ArrowDown\",\n\t\t\"PageUp\", \"PageDown\", \"End\", \"Home\", \"Escape\", \"Space\", \"Plus\",\n\t\t\"Minus\", \"Comma\", \"Period\", \"Slash\", \"Backslash\", \"Quote\", \"Semicolon\",\n\t\t\"BracketLeft\", \"BracketRight\", \"F1\", \"F2\", \"F3\", \"F4\", \"F5\", \"F6\",\n\t\t\"F7\", \"F8\", \"F9\", \"F10\", \"F11\", \"F12\",\n\t\t// Add more non-modifier keys as needed\n\t];\n\n\t// Split the value into individual shortcuts\n\tconst shortcuts = value.split(\" \");\n\n\t// Function to validate a single shortcut\n\tfunction validateShortcut(shortcut) {\n\t\tconst keys = shortcut.split(\"+\");\n\n\t\tif (keys.length === 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlet nonModifierFound = false;\n\n\t\t// Check each key in the shortcut\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tconst key = keys[i];\n\n\t\t\tif (modifiers.includes(key)) {\n\t\t\t\tif (nonModifierFound) {\n\t\t\t\t\t// Modifier key found after a non-modifier key\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else if (nonModifiers.includes(key)) {\n\t\t\t\tif (nonModifierFound) {\n\t\t\t\t\t// Multiple non-modifier keys found\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tnonModifierFound = true;\n\t\t\t} else {\n\t\t\t\t// Invalid key\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Ensure at least one non-modifier key is present\n\t\treturn nonModifierFound;\n\t}\n\n\t// Validate all shortcuts\n\tfor (let i = 0; i < shortcuts.length; i++) {\n\t\tif (!validateShortcut(shortcuts[i])) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/** @type {[string, boolean][]} */\nconst ariaKeyShortcutsTestCases = [\n\t[\"Control+A Shift+Alt+B\", true],\n\t[\"Control+Shift+1\", true],\n\t[\"Shift+Alt+T Control+5\", true],\n\t[\"T\", true],\n\t[\"ArrowLeft\", true],\n\t[\"Shift+T Alt+Control\", false],\n\t[\"T+Shift\", false],\n\t[\"Alt\", false],\n\t[\"IncredibleKey\", false],\n\t[\"Ctrl+Shift+A\", false],\n];\nfor (const [ariaKeyShortcuts, expectedValidity] of ariaKeyShortcutsTestCases) {\n\tconst returnedValidity = validateAriaKeyshortcuts(ariaKeyShortcuts);\n\tif (returnedValidity !== expectedValidity) {\n\t\tconsole.error(`validateAriaKeyshortcuts(\"${ariaKeyShortcuts}\") returned ${returnedValidity} but expected ${expectedValidity}`);\n\t}\n}\n"
  },
  {
    "path": "src/msgbox.js",
    "content": "// @ts-check\n/* global localize */\n\n// Note that this API must be kept in sync with the version in 98.js.org,\n// as 98.js.org will write the global `showMessageBox` to provide integration with the web desktop environment,\n// i.e. windows that can go outside the iframe.\n// We also need to accept the injected global `showMessageBox` function if it exists,\n// and set `window.defaultMessageBoxTitle` which is used in 98.js.org to set the default title for message boxes...\n// or, couldn't we just provide the default in a wrapper function, similar to how 98.js.org does it?\n\nimport { make_window_supporting_scale } from \"./$ToolWindow.js\";\n// import { localize } from \"./app-localization.js\";\n\nconst exports = {};\n\nconst CHORD_WAV_URL = \"audio/chord.wav\";\n\ntry {\n\t// <audio> element is simpler for sound effects,\n\t// but in iOS/iPad it shows up in the Control Center, as if it's music you'd want to play/pause/etc.\n\t// It's very silly. Also, on subsequent plays, it only plays part of the sound.\n\t// And Web Audio API is better for playing SFX anyway because it can play a sound overlapping with itself.\n\tconst audioContext = window.audioContext = window.audioContext || new AudioContext();\n\tconst audio_buffer_promise =\n\t\tfetch(CHORD_WAV_URL)\n\t\t\t.then((response) => response.arrayBuffer())\n\t\t\t.then((array_buffer) => audioContext.decodeAudioData(array_buffer));\n\tvar play_chord = async function () {\n\t\taudioContext.resume(); // in case it was not allowed to start until a user interaction\n\t\t// Note that this should be before waiting for the audio buffer,\n\t\t// so that it works the first time.\n\t\t// (This only works if the message box is opened during a user gesture.)\n\n\t\tconst audio_buffer = await audio_buffer_promise;\n\t\tconst source = audioContext.createBufferSource();\n\t\tsource.buffer = audio_buffer;\n\t\tsource.connect(audioContext.destination);\n\t\tsource.start();\n\t};\n} catch (error) {\n\tconsole.log(\"AudioContext not supported\", error);\n}\n\n/**\n * @typedef {Object} MessageBoxOptions\n * @property {string} [title]\n * @property {string} [message]\n * @property {string} [messageHTML]\n * @property {Array<{ label: string, value: string, default?: boolean, action?: () => void }>} [buttons]\n * @property {\"error\" | \"warning\" | \"info\" | \"nuke\"} [iconID]\n * @property {OSGUIWindowOptions} [windowOptions]\n *\n * @typedef {Promise<string> & { $window: JQuery<Window>, $message: JQuery<HTMLDivElement>, promise: MessageBoxPromise }} MessageBoxPromise\n *\n * @param {MessageBoxOptions} options\n * @returns {MessageBoxPromise} Resolves with the value of the button that was clicked. The promise has extra properties for convenience.\n */\nfunction showMessageBox_implementation({\n\ttitle = window.defaultMessageBoxTitle ?? \"Alert\",\n\tmessage,\n\tmessageHTML,\n\tbuttons = [{ label: \"OK\", value: \"ok\", default: true }],\n\ticonID = \"warning\", // \"error\", \"warning\", \"info\", or \"nuke\" for deleting files/folders\n\twindowOptions = {}, // for controlling width, etc.\n}) {\n\tlet $window, $message;\n\tconst promise = /** @type {MessageBoxPromise} */ (new Promise((resolve) => {\n\t\t$window = make_window_supporting_scale(Object.assign({\n\t\t\ttitle,\n\t\t\tresizable: false,\n\t\t\tinnerWidth: 400,\n\t\t\tmaximizeButton: false,\n\t\t\tminimizeButton: false,\n\t\t}, windowOptions));\n\t\t// $window.addClass(\"dialog-window horizontal-buttons\");\n\t\t$message =\n\t\t\t$(\"<div>\").css({\n\t\t\t\ttextAlign: \"left\",\n\t\t\t\tfontFamily: \"MS Sans Serif, Arial, sans-serif\",\n\t\t\t\tfontSize: \"14px\",\n\t\t\t\tmarginTop: \"22px\",\n\t\t\t\tflex: 1,\n\t\t\t\tminWidth: 0, // Fixes hidden overflow, see https://css-tricks.com/flexbox-truncated-text/\n\t\t\t\twhiteSpace: \"normal\", // overriding .window:not(.squish)\n\t\t\t});\n\t\tif (messageHTML) {\n\t\t\t$message.html(messageHTML);\n\t\t} else if (message) { // both are optional because you may populate later with dynamic content\n\t\t\t$message.text(message).css({\n\t\t\t\twhiteSpace: \"pre-wrap\",\n\t\t\t\twordWrap: \"break-word\",\n\t\t\t});\n\t\t}\n\t\t$(\"<div>\").append(\n\t\t\t$(\"<img width='32' height='32'>\").attr(\"src\", `images/${iconID}-32x32-8bpp.png`).css({\n\t\t\t\tmargin: \"16px\",\n\t\t\t\tdisplay: \"block\",\n\t\t\t}),\n\t\t\t$message\n\t\t).css({\n\t\t\tdisplay: \"flex\",\n\t\t\tflexDirection: \"row\",\n\t\t}).appendTo($window.$content);\n\n\t\t$window.$content.css({\n\t\t\ttextAlign: \"center\",\n\t\t});\n\t\tfor (const button of buttons) {\n\t\t\tconst $button = $window.$Button(button.label, () => {\n\t\t\t\tbutton.action?.(); // API may be required for using user gesture requiring APIs\n\t\t\t\tresolve(button.value);\n\t\t\t\t$window.close(); // actually happens automatically\n\t\t\t});\n\t\t\tif (button.default) {\n\t\t\t\t$button.addClass(\"default\");\n\t\t\t\t$button.focus();\n\t\t\t\tsetTimeout(() => $button.focus(), 0); // @TODO: why is this needed? does it have to do with the iframe window handling?\n\t\t\t}\n\t\t\t$button.css({\n\t\t\t\tminWidth: 75,\n\t\t\t\theight: 23,\n\t\t\t\tmargin: \"16px 2px\",\n\t\t\t});\n\t\t}\n\t\t$window.on(\"focusin\", \"button\", (event) => {\n\t\t\t$(event.currentTarget).addClass(\"default\");\n\t\t});\n\t\t$window.on(\"focusout\", \"button\", (event) => {\n\t\t\t$(event.currentTarget).removeClass(\"default\");\n\t\t});\n\t\t$window.on(\"closed\", () => {\n\t\t\tresolve(\"closed\"); // or \"cancel\"? do you need to distinguish?\n\t\t});\n\t\t$window.center();\n\t}));\n\tpromise.$window = $window;\n\tpromise.$message = $message;\n\tpromise.promise = promise; // for easy destructuring\n\ttry {\n\t\tplay_chord();\n\t} catch (error) {\n\t\tconsole.log(`Failed to play ${CHORD_WAV_URL}: `, error);\n\t}\n\treturn promise;\n}\n\n// Prefer a function injected from outside an iframe,\n// which will make dialogs that can go outside the iframe,\n// for 98.js.org integration.\nexports.showMessageBox = window.showMessageBox || showMessageBox_implementation;\n\n// Note `defaultMessageBoxTitle` handling in make_iframe_window (or now function enhance_iframe) in 98.js.org\n// https://github.com/1j01/98/blob/361bd759a6d9b71d0fad9e479840598dc0128bb6/src/iframe-windows.js#L111\n// Any other default parameters need to be handled there (as it works now)\n\nwindow.defaultMessageBoxTitle = localize(\"Paint\");\n\n// Don't override alert, because I only use it as a fallback for global error handling.\n// If make_window_supporting_scale is not defined, then alert is used instead,\n// so it must not also end up calling make_window_supporting_scale.\n// More generally, if there's an error in showMessageBox, it must fall back to something that does not use showMessageBox.\n// window.alert = (message) => {\n// \tshowMessageBox({ message });\n// };\n\nconst { showMessageBox } = exports;\nexport { showMessageBox };\n// Temporary globals until all dependent code is converted to ES Modules\nwindow.showMessageBox = showMessageBox; // used by app-localization.js\n"
  },
  {
    "path": "src/repack-spritesheet.js",
    "content": "// @ts-check\n/* global localize */\n\n// This script adds padding between tiles in a spritesheet, to avoid bleeding when at non-integer zoom levels\n// (or indeed, design errors, where one icon accidentally extends into the space of another)\n\n// USAGE: load an image into the app, then paste this code into the browser console, updating parameters as needed.\n\n// HACK: Using unnecessary-looking \"../src\" so that TypeScript can follow the path, but in the browser,\n// when pasting this script into the console, it will be relative to the current page's URL, and the \"..\" will be ignored,\n// as there's nothing higher up than \"/\", assuming the app is hosted at the root of the domain.\n// TypeScript still doesn't like the top-level await because there are no exports, but\n// exports are not valid in the JS console. So, ignore the errors.\n// @ts-ignore\nconst { apply_image_transformation } = await import(\"../src/image-manipulation.js\");\n// @ts-ignore\nconst { get_help_folder_icon } = await import(\"../src/helpers.js\");\n\nfunction repack_spritesheet(tile_width, tile_height = tile_width, padding = tile_width) {\n\tapply_image_transformation({\n\t\tname: localize(\"Repack Spritesheet\"),\n\t\ticon: get_help_folder_icon(\"p_paste.png\"),\n\t\t// icon: get_help_folder_icon(\"p_stretch_both.png\"),\n\t}, (original_canvas, _original_ctx, new_canvas, new_ctx) => {\n\t\tconst tiles_x = Math.ceil(original_canvas.width / tile_width);\n\t\tconst tiles_y = Math.ceil(original_canvas.height / tile_height);\n\t\tnew_canvas.width = tiles_x * (tile_width + padding) + padding;\n\t\tnew_canvas.height = tiles_y * (tile_height + padding) + padding;\n\t\tfor (let x = 0; x < tiles_x; x++) {\n\t\t\tfor (let y = 0; y < tiles_y; y++) {\n\t\t\t\tconst sx = x * tile_width;\n\t\t\t\tconst sy = y * tile_height;\n\t\t\t\tconst dx = x * (tile_width + padding) + padding;\n\t\t\t\tconst dy = y * (tile_height + padding) + padding;\n\t\t\t\tnew_ctx.drawImage(original_canvas, sx, sy, tile_width, tile_height, dx, dy, tile_width, tile_height);\n\t\t\t}\n\t\t}\n\t});\n}\n\nrepack_spritesheet(16, 16, 16);\n"
  },
  {
    "path": "src/save-history-as-spritesheet.js",
    "content": "// @ts-check\n/* global localize, main_canvas, systemHooks, file_name, system_file_handle, undos, current_history_node */\n\n// This script exports the document history as a spritesheet,\n// in guaranteed quality, and supporting transparency,\n// as compared with the poor color quality of the GIF export.\n// In the future, exporting as APNG might be supported as an official feature,\n// which would also allow high quality and transparency in history exports.\n\n// USAGE: paste this code into the browser console\n\n// HACK: Using unnecessary-looking \"../src\" so that TypeScript can follow the path, but in the browser,\n// when pasting this script into the console, it will be relative to the current page's URL, and the \"..\" will be ignored,\n// as there's nothing higher up than \"/\", assuming the app is hosted at the root of the domain.\n// TypeScript still doesn't like the top-level await because there are no exports, but\n// exports are not valid in the JS console. So, ignore the errors.\n// @ts-ignore\nconst { write_image_file } = await import(\"../src/functions.js\");\n// @ts-ignore\nconst { make_canvas } = await import(\"../src/helpers.js\");\n\n\nconst width = main_canvas.width;\nconst height = main_canvas.height;\nconst frame_history_nodes = [...undos, current_history_node];\nconst sheet_canvas = make_canvas(width * frame_history_nodes.length, height);\nlet x = 0;\nfor (const frame_history_node of frame_history_nodes) {\n\tsheet_canvas.ctx.clearRect(x, 0, width, height);\n\tsheet_canvas.ctx.putImageData(frame_history_node.image_data, x, 0);\n\tx += width;\n\tif (frame_history_node.selection_image_data) {\n\t\tconst selection_canvas = make_canvas(frame_history_node.selection_image_data);\n\t\tsheet_canvas.ctx.drawImage(selection_canvas, x + frame_history_node.selection_x, frame_history_node.selection_y);\n\t}\n}\nwrite_image_file(sheet_canvas, \"image/png\", (blob) => {\n\tconst suggested_file_name = `${file_name.replace(/\\.(bmp|dib|a?png|gif|jpe?g|jpe|jfif|tiff?|webp|raw)$/i, \"\")} history animation sheet.png`;\n\tsystemHooks.showSaveFileDialog({\n\t\tdialogTitle: localize(\"Save As\"), // localize(\"Save Animation As\"),\n\t\tgetBlob: () => blob,\n\t\tdefaultFileName: suggested_file_name,\n\t\tdefaultPath: typeof system_file_handle === \"string\" ? `${system_file_handle.replace(/[/\\\\][^/\\\\]*/, \"\")}/${suggested_file_name}` : null,\n\t\tdefaultFileFormatID: \"image/png\",\n\t\tformats: [{\n\t\t\tformatID: \"image/png\",\n\t\t\tmimeType: \"image/png\",\n\t\t\tname: localize(\"PNG (*.png)\").replace(/\\s+\\([^(]+$/, \"\"),\n\t\t\tnameWithExtensions: localize(\"PNG (*.png)\"),\n\t\t\textensions: [\"png\"],\n\t\t}],\n\t});\n});\n\n"
  },
  {
    "path": "src/sessions.js",
    "content": "// @ts-check\n// eslint-disable-next-line no-unused-vars\n/* global file_name:writable */\n/* global $app, $canvas_area, localize, magnification, main_canvas, main_ctx, redos, undos */\nimport { $DialogWindow } from \"./$ToolWindow.js\";\n// import { localize } from \"./app-localization.js\";\nimport { change_url_param, get_uris, load_image_from_uri, open_from_image_info, redo, reset_file, show_error_message, show_resource_load_error_message, undo, undoable, update_title } from \"./functions.js\";\nimport { $G, debounce, get_help_folder_icon, image_data_match, is_discord_embed, make_canvas, to_canvas_coords } from \"./helpers.js\";\nimport { storage_quota_exceeded } from \"./manage-storage.js\";\nimport { showMessageBox } from \"./msgbox.js\";\nimport { localStore } from \"./storage.js\";\n\nconst log = (...args) => {\n\twindow.console?.log(...args);\n};\n\nlet localStorageAvailable = false;\ntry {\n\tlocalStorage._available = true;\n\tlocalStorageAvailable = localStorage._available;\n\tdelete localStorage._available;\n} catch (_error) { /* ignore */ }\n\n// @TODO: keep other data in addition to the image data\n// such as the file_name and other state\n// (maybe even whether it's considered saved? idk about that)\n// I could have the image in one storage slot and the state in another\n\nconst match_threshold = 1; // 1 is just enough for a workaround for Brave browser's farbling: https://github.com/1j01/jspaint/issues/184\nconst canvas_has_any_apparent_image_data = () =>\n\tmain_canvas.ctx.getImageData(0, 0, main_canvas.width, main_canvas.height).data.some((v) => v > match_threshold);\n\nlet $recovery_window;\nfunction show_recovery_window(no_longer_blank) {\n\t$recovery_window?.close();\n\tconst $w = $recovery_window = $DialogWindow();\n\t$w.on(\"close\", () => {\n\t\t$recovery_window = null;\n\t});\n\t$w.title(\"Recover Document\");\n\tlet backup_impossible = false;\n\ttry { window.localStorage.getItem(\"bogus test key\"); } catch (_error) { backup_impossible = true; }\n\t// TODO: get rid of this invasive dialog https://github.com/1j01/jspaint/issues/325\n\t// It appears when it shouldn't, in basic scenarios like Ctrl+A in a transparent document,\n\t// and it gets bigger once you edit the document, which feels... almost aggressive.\n\t// That said, I've made it more compact and delineated the expanded section with a horizontal rule,\n\t// so it doesn't feel as much like it's changed out from under you and you have to re-read it.\n\t$w.$main.append($(`\n\t\t<p>Woah! The canvas became empty.</p>\n\t\t<p>If this was on purpose, please ignore this message.</p>\n\t\t<p>\n\t\t\tIf the canvas was cleared due to memory usage,<br>\n\t\t\tclick Undo to recover the document.\n\t\t</p>\n\t\t<!--<p>Remember to save with <b>File > Save</b>!</p>-->\n\t\t${backup_impossible ?\n\t\t\t\"<p><b>Note:</b> No automatic backup is possible unless you enable Cookies in your browser.</p>\" :\n\t\t\t(\n\t\t\t\tno_longer_blank ?\n\t\t\t\t\t`<hr>\n\t\t\t\t\t<p style=\"opacity: 0.8; font-size: 0.9em;\">\n\t\t\t\t\t\tAuto-save is paused while this dialog is open.\n\t\t\t\t\t</p>\n\t\t\t\t\t<p style=\"opacity: 0.8; font-size: 0.9em;\">\n\t\t\t\t\t\t(See <b>File &gt; Manage Storage</b> to view backups.)\n\t\t\t\t\t</p>` :\n\t\t\t\t\t\"\"\n\t\t\t)\n\t\t}\n\t`));\n\n\tconst $undo = $w.$Button(\"Undo\", () => {\n\t\tundo();\n\t});\n\tconst $redo = $w.$Button(\"Redo\", () => {\n\t\tredo();\n\t});\n\tconst update_buttons_disabled = () => {\n\t\t$undo.prop(\"disabled\", undos.length < 1);\n\t\t$redo.prop(\"disabled\", redos.length < 1);\n\t};\n\t$G.on(\"session-update.session-hook\", update_buttons_disabled);\n\tupdate_buttons_disabled();\n\n\t$w.$Button(localize(\"Close\"), () => {\n\t\t$w.close();\n\t});\n\t$w.center();\n\n\t$w.find(\"button:enabled\").focus();\n}\n\nlet last_undos_length = undos.length;\nfunction handle_data_loss() {\n\tconst window_is_open = $recovery_window && !$recovery_window.closed;\n\tlet save_paused = false;\n\tif (!canvas_has_any_apparent_image_data()) {\n\t\tif (!window_is_open) {\n\t\t\tshow_recovery_window();\n\t\t}\n\t\tsave_paused = true;\n\t} else if (window_is_open) {\n\t\tif (undos.length > last_undos_length) {\n\t\t\tshow_recovery_window(true);\n\t\t}\n\t\tsave_paused = true;\n\t}\n\tlast_undos_length = undos.length;\n\treturn save_paused;\n}\n\nclass LocalSession {\n\tconstructor(session_id) {\n\t\tthis.id = session_id;\n\t\tconst ls_key = `image#${session_id}`;\n\t\tlog(`Local storage key: ${ls_key}`);\n\t\t// save image to storage\n\t\tthis.save_image_to_storage_immediately = () => {\n\t\t\tconst save_paused = handle_data_loss();\n\t\t\tif (save_paused) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlog(`Saving image to storage: ${ls_key}`);\n\t\t\tlocalStore.set(ls_key, main_canvas.toDataURL(\"image/png\"), (err) => {\n\t\t\t\tif (err) {\n\t\t\t\t\t// @ts-ignore (quotaExceeded is added by storage.js)\n\t\t\t\t\tif (err.quotaExceeded) {\n\t\t\t\t\t\tstorage_quota_exceeded();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// e.g. localStorage is disabled\n\t\t\t\t\t\t// (or there's some other error?)\n\t\t\t\t\t\t// @TODO: show warning with \"Don't tell me again\" type option\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\t\tthis.save_image_to_storage_soon = debounce(this.save_image_to_storage_immediately, 100);\n\t\tlocalStore.get(ls_key, (err, uri) => {\n\t\t\tif (err) {\n\t\t\t\tif (localStorageAvailable) {\n\t\t\t\t\tshow_error_message(\"Failed to retrieve image from local storage.\", err);\n\t\t\t\t} else {\n\t\t\t\t\t// @TODO: DRY with storage manager message\n\t\t\t\t\tshowMessageBox({\n\t\t\t\t\t\tmessage: \"Please enable local storage in your browser's settings for local backup. It may be called Cookies, Storage, or Site Data.\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (uri) {\n\t\t\t\tload_image_from_uri(uri).then((info) => {\n\t\t\t\t\topen_from_image_info(info, null, null, true, true);\n\t\t\t\t}, (error) => {\n\t\t\t\t\tshow_error_message(\"Failed to open image from local storage.\", error);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// no uri so lets save the blank canvas\n\t\t\t\tthis.save_image_to_storage_soon();\n\t\t\t}\n\t\t});\n\t\t$G.on(\"session-update.session-hook\", () => {\n\t\t\tthis.save_image_to_storage_soon();\n\t\t});\n\t}\n\tend() {\n\t\t// Skip debounce and save immediately\n\t\tthis.save_image_to_storage_soon.cancel();\n\t\tthis.save_image_to_storage_immediately();\n\t\t// Remove session-related hooks\n\t\t$G.off(\".session-hook\");\n\t}\n}\n\n\n// The user ID is not persistent\n// A person can enter a session multiple times,\n// and is always given a new user ID\nlet user_id;\n// @TODO: I could make the color persistent, though.\n// You could still have multiple cursors and they would just be the same color.\n// There could also be an option to change your color\n\n// The data in this object is stored in the server when you enter a session\n// It is (supposed to be) removed when you leave\nconst user = {\n\t// Cursor status\n\tcursor: {\n\t\t// cursor position in canvas coordinates\n\t\tx: 0,\n\t\ty: 0,\n\t\t// whether the user is elsewhere, such as in another tab\n\t\taway: true,\n\t},\n\t// Currently selected tool (@TODO)\n\ttool: localize(\"Pencil\"),\n\t// Color components\n\thue: ~~(Math.random() * 360),\n\tsaturation: ~~(Math.random() * 50) + 50,\n\tlightness: ~~(Math.random() * 40) + 50,\n};\n\n// The main cursor color\nuser.color = `hsla(${user.hue}, ${user.saturation}%, ${user.lightness}%, 1)`;\n// Unused\nuser.color_transparent = `hsla(${user.hue}, ${user.saturation}%, ${user.lightness}%, 0.5)`;\n// (@TODO) The color (that may be) used in the toolbar indicating to other users it is selected by this user\nuser.color_desaturated = `hsla(${user.hue}, ${~~(user.saturation * 0.4)}%, ${user.lightness}%, 0.8)`;\n\n\n// The image used for other people's cursors\nconst cursor_image = new Image();\ncursor_image.src = \"images/cursors/default.png\";\n\n\nclass FirebaseSession {\n\tconstructor(session_id) {\n\t\tthis.id = session_id;\n\t\tthis._fb_listeners = [];\n\n\t\tfile_name = `[Loading ${this.id}]`;\n\t\tupdate_title();\n\t\tconst on_firebase_loaded = () => {\n\t\t\tfile_name = `[${this.id}]`;\n\t\t\tupdate_title();\n\t\t\tthis.start();\n\t\t};\n\t\tif (!FirebaseSession.fb_root) {\n\t\t\tvar script = document.createElement(\"script\");\n\t\t\tscript.addEventListener(\"load\", () => {\n\t\t\t\tconst config = {\n\t\t\t\t\tapiKey: \"AIzaSyBgau8Vu9ZE8u_j0rp-Lc044gYTX5O3X9k\",\n\t\t\t\t\tauthDomain: \"jspaint.firebaseapp.com\",\n\t\t\t\t\tdatabaseURL: \"https://jspaint.firebaseio.com\",\n\t\t\t\t\tprojectId: \"firebase-jspaint\",\n\t\t\t\t\tstorageBucket: \"\",\n\t\t\t\t\tmessagingSenderId: \"63395010995\",\n\t\t\t\t};\n\t\t\t\tfirebase.initializeApp(config);\n\t\t\t\tFirebaseSession.fb_root = firebase.database().ref(\"/\");\n\t\t\t\ton_firebase_loaded();\n\t\t\t});\n\t\t\tscript.addEventListener(\"error\", () => {\n\t\t\t\tshow_error_message(\"Failed to load Firebase; the document will not load, and changes will not be saved.\");\n\t\t\t\tfile_name = `[Failed to load ${this.id}]`;\n\t\t\t\tupdate_title();\n\t\t\t});\n\t\t\tscript.src = \"lib/firebase.js\";\n\t\t\tdocument.head.appendChild(script);\n\t\t} else {\n\t\t\ton_firebase_loaded();\n\t\t}\n\t}\n\tstart() {\n\t\t// @TODO: how do you actually detect if it's failing???\n\t\tshowMessageBox({\n\t\t\tmessageHTML: `\n\t\t\t\t<p>The document may not load. Changes may not save.</p>\n\t\t\t\t<p>Multiuser sessions are public. There is no security.</p>\n\t\t\t`,\n\t\t});\n\t\t// \"<p>The document may not load. Changes may not save. If it does save, it's public. There is no security.</p>\"// +\n\t\t// \"<p>I haven't found a way to detect Firebase quota limits being exceeded, \" +\n\t\t// \"so for now I'm showing this message regardless of whether it's working.</p>\" +\n\t\t// \"<p>If you're interested in using multiuser mode, please thumbs-up \" +\n\t\t// \"<a href='https://github.com/1j01/jspaint/issues/68'>this issue</a> to show interest, and/or subscribe for updates.</p>\"\n\n\t\t// Wrap the Firebase API because they don't\n\t\t// provide a great way to clean up event listeners\n\t\tconst _fb_on = (fb, event_type, callback, error_callback) => {\n\t\t\tthis._fb_listeners.push({ fb, event_type, callback, error_callback });\n\t\t\tfb.on(event_type, callback, error_callback);\n\t\t};\n\t\t// Get Firebase references\n\t\tthis.fb = FirebaseSession.fb_root.child(this.id);\n\t\tthis.fb_data = this.fb.child(\"data\");\n\t\tthis.fb_users = this.fb.child(\"users\");\n\t\tif (user_id) {\n\t\t\tthis.fb_user = this.fb_users.child(user_id);\n\t\t} else {\n\t\t\tthis.fb_user = this.fb_users.push();\n\t\t\tuser_id = this.fb_user.key;\n\t\t}\n\t\t// Remove the user from the session when they disconnect\n\t\tthis.fb_user.onDisconnect().remove();\n\t\t// Make the user present in the session\n\t\tthis.fb_user.set(user);\n\t\t// @TODO: Execute the above two lines when .info/connected\n\t\t// For each existing and new user\n\t\t_fb_on(this.fb_users, \"child_added\", (snap) => {\n\t\t\t// Is this you?\n\t\t\tif (snap.key === user_id) {\n\t\t\t\t// You already have a cursor.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Get the Firebase reference for this user\n\t\t\tconst fb_other_user = snap.ref;\n\t\t\t// Get the user object stored on the server\n\t\t\tlet other_user = snap.val();\n\t\t\t// @TODO: display other cursor types?\n\t\t\t// @TODO: display pointer button state?\n\t\t\t// @TODO: display selections\n\t\t\tconst cursor_canvas = make_canvas(32, 32);\n\t\t\t// Make the cursor element\n\t\t\tconst $cursor = $(cursor_canvas).addClass(\"user-cursor\").appendTo($app);\n\t\t\t$cursor.css({\n\t\t\t\tdisplay: \"none\",\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0,\n\t\t\t\topacity: 0,\n\t\t\t\tzIndex: 5, // @#: z-index\n\t\t\t\tpointerEvents: \"none\",\n\t\t\t\ttransition: \"opacity 0.5s\",\n\t\t\t});\n\t\t\t// When the cursor data changes\n\t\t\t_fb_on(fb_other_user, \"value\", (snap) => {\n\t\t\t\tother_user = snap.val();\n\t\t\t\t// If the user has left\n\t\t\t\tif (other_user == null) {\n\t\t\t\t\t// Remove the cursor element\n\t\t\t\t\t$cursor.remove();\n\t\t\t\t} else {\n\t\t\t\t\t// Draw the cursor\n\t\t\t\t\tconst draw_cursor = () => {\n\t\t\t\t\t\tcursor_canvas.width = cursor_image.width;\n\t\t\t\t\t\tcursor_canvas.height = cursor_image.height;\n\t\t\t\t\t\tconst cursor_ctx = cursor_canvas.ctx;\n\t\t\t\t\t\tcursor_ctx.fillStyle = other_user.color;\n\t\t\t\t\t\tcursor_ctx.fillRect(0, 0, cursor_canvas.width, cursor_canvas.height);\n\t\t\t\t\t\tcursor_ctx.globalCompositeOperation = \"multiply\";\n\t\t\t\t\t\tcursor_ctx.drawImage(cursor_image, 0, 0);\n\t\t\t\t\t\tcursor_ctx.globalCompositeOperation = \"destination-atop\";\n\t\t\t\t\t\tcursor_ctx.drawImage(cursor_image, 0, 0);\n\t\t\t\t\t};\n\t\t\t\t\tif (cursor_image.complete) {\n\t\t\t\t\t\tdraw_cursor();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$(cursor_image).one(\"load\", draw_cursor);\n\t\t\t\t\t}\n\t\t\t\t\t// Update the cursor element\n\t\t\t\t\tconst canvas_rect = window.canvas_bounding_client_rect;\n\t\t\t\t\t$cursor.css({\n\t\t\t\t\t\tdisplay: \"block\",\n\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\tleft: canvas_rect.left + magnification * other_user.cursor.x,\n\t\t\t\t\t\ttop: canvas_rect.top + magnification * other_user.cursor.y,\n\t\t\t\t\t\topacity: 1 - other_user.cursor.away,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\tlet previous_uri;\n\t\t// let pointer_operations = []; // the multiplayer syncing stuff is a can of worms, so this is disabled\n\t\tthis.write_canvas_to_database_immediately = () => {\n\t\t\tconst save_paused = handle_data_loss();\n\t\t\tif (save_paused) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Sync the data from this client to the server (one-way)\n\t\t\tconst uri = main_canvas.toDataURL();\n\t\t\tif (previous_uri !== uri) {\n\t\t\t\t// log(\"clear pointer operations to set data\", pointer_operations);\n\t\t\t\t// pointer_operations = [];\n\t\t\t\tlog(\"Write canvas data to Firebase\");\n\t\t\t\tthis.fb_data.set(uri);\n\t\t\t\tprevious_uri = uri;\n\t\t\t} else {\n\t\t\t\tlog(\"(Don't write canvas data to Firebase; it hasn't changed)\");\n\t\t\t}\n\t\t};\n\t\tthis.write_canvas_to_database_soon = debounce(this.write_canvas_to_database_immediately, 100);\n\t\tlet ignore_session_update = false;\n\t\t$G.on(\"session-update.session-hook\", () => {\n\t\t\tif (ignore_session_update) {\n\t\t\t\tlog(\"(Ignore session-update from Sync Session undoable)\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.write_canvas_to_database_soon();\n\t\t});\n\t\t// Any time we change or receive the image data\n\t\t_fb_on(this.fb_data, \"value\", (snap) => {\n\t\t\tlog(\"Firebase data update\");\n\t\t\tconst uri = snap.val();\n\t\t\tif (uri == null) {\n\t\t\t\t// If there's no value at the data location, this is a new session\n\t\t\t\t// Sync the current data to it\n\t\t\t\tthis.write_canvas_to_database_soon();\n\t\t\t} else {\n\t\t\t\tprevious_uri = uri;\n\t\t\t\t// Load the new image data\n\t\t\t\tconst img = new Image();\n\t\t\t\timg.onload = () => {\n\t\t\t\t\t// Cancel any in-progress pointer operations\n\t\t\t\t\t// if (pointer_operations.length) {\n\t\t\t\t\t// \t$G.triggerHandler(\"pointerup\", \"cancel\");\n\t\t\t\t\t// }\n\n\t\t\t\t\tconst test_canvas = make_canvas(img);\n\t\t\t\t\tconst image_data_remote = test_canvas.ctx.getImageData(0, 0, test_canvas.width, test_canvas.height);\n\t\t\t\t\tconst image_data_local = main_ctx.getImageData(0, 0, main_canvas.width, main_canvas.height);\n\n\t\t\t\t\tif (!image_data_match(image_data_remote, image_data_local, 5)) {\n\t\t\t\t\t\tignore_session_update = true;\n\t\t\t\t\t\tundoable({\n\t\t\t\t\t\t\tname: \"Sync Session\",\n\t\t\t\t\t\t\ticon: get_help_folder_icon(\"p_database.png\"),\n\t\t\t\t\t\t}, () => {\n\t\t\t\t\t\t\t// Write the image data to the canvas\n\t\t\t\t\t\t\tmain_ctx.copy(img);\n\t\t\t\t\t\t\t$canvas_area.trigger(\"resize\");\n\t\t\t\t\t\t});\n\t\t\t\t\t\tignore_session_update = false;\n\t\t\t\t\t}\n\n\t\t\t\t\t// (transparency = has_any_transparency(main_ctx); here would not be ideal\n\t\t\t\t\t// Perhaps a better way of syncing transparency\n\t\t\t\t\t// and other options will be established)\n\t\t\t\t\t/*\n\t\t\t\t\t// Playback recorded in-progress pointer operations\n\t\t\t\t\tlog(\"Playback\", pointer_operations);\n\n\t\t\t\t\tfor (const e of pointer_operations) {\n\t\t\t\t\t\t// Trigger the event at each place it is listened for\n\t\t\t\t\t\t$canvas.triggerHandler(e, [\"synthetic\"]);\n\t\t\t\t\t\t$G.triggerHandler(e, [\"synthetic\"]);\n\t\t\t\t\t}\n\t\t\t\t\t*/\n\t\t\t\t};\n\t\t\t\timg.src = uri;\n\t\t\t}\n\t\t}, (error) => {\n\t\t\tshow_error_message(\"Failed to retrieve data from Firebase. The document will not load, and changes will not be saved.\", error);\n\t\t\tfile_name = `[Failed to load ${this.id}]`;\n\t\t\tupdate_title();\n\t\t});\n\t\t// Update the cursor status\n\t\t$G.on(\"pointermove.session-hook\", (e) => {\n\t\t\tconst m = to_canvas_coords(e);\n\t\t\tthis.fb_user.child(\"cursor\").update({\n\t\t\t\tx: m.x,\n\t\t\t\ty: m.y,\n\t\t\t\taway: false,\n\t\t\t});\n\t\t});\n\t\t$G.on(\"blur.session-hook\", () => {\n\t\t\tthis.fb_user.child(\"cursor\").update({\n\t\t\t\taway: true,\n\t\t\t});\n\t\t});\n\t\t// @FIXME: the cursor can come back from \"away\" via a pointer event\n\t\t// while the window is blurred and stay there when the user goes away\n\t\t// maybe replace \"away\" with a timestamp of activity and then\n\t\t// clients can decide whether a given cursor should be visible\n\n\t\t/*\n\t\tconst debug_event = (e, synthetic) => {\n\t\t\t// const label = synthetic ? \"(synthetic)\" : \"(normal)\";\n\t\t\t// window.console?.debug?.debug(e.type, label);\n\t\t};\n\n\t\t$canvas_area.on(\"pointerdown.session-hook\", \"*\", (e, synthetic) => {\n\t\t\tdebug_event(e, synthetic);\n\t\t\tif (synthetic) { return; }\n\n\t\t\tpointer_operations = [e];\n\t\t\tconst pointermove = (e, synthetic) => {\n\t\t\t\tdebug_event(e, synthetic);\n\t\t\t\tif (synthetic) { return; }\n\n\t\t\t\tpointer_operations.push(e);\n\t\t\t};\n\t\t\t$G.on(\"pointermove.session-hook\", pointermove);\n\t\t\t$G.one(\"pointerup.session-hook\", (e, synthetic) => {\n\t\t\t\tdebug_event(e, synthetic);\n\t\t\t\tif (synthetic) { return; }\n\n\t\t\t\t$G.off(\"pointermove.session-hook\", pointermove);\n\t\t\t});\n\t\t});\n\t\t*/\n\t}\n\tend() {\n\t\t// Skip debounce and save immediately\n\t\tthis.write_canvas_to_database_soon.cancel();\n\t\tthis.write_canvas_to_database_immediately();\n\t\t// Remove session-related hooks\n\t\t$G.off(\".session-hook\");\n\t\t// $canvas_area.off(\"pointerdown.session-hook\");\n\t\t// Remove collected Firebase event listeners\n\t\tthis._fb_listeners.forEach(({ fb, event_type, callback, _error_callback }) => {\n\t\t\tlog(`Remove listener for ${fb.path.toString()} .on ${event_type}`);\n\t\t\tfb.off(event_type, callback);\n\t\t});\n\t\tthis._fb_listeners.length = 0;\n\t\t// Remove the user from the session\n\t\tthis.fb_user.remove();\n\t\t// Remove any cursor elements\n\t\t$app.find(\".user-cursor\").remove();\n\t\t// Reset to \"untitled\"\n\t\treset_file();\n\t}\n}\n\n/**\n * fb_root is the root reference for the Firebase Realtime Database\n * @memberof FirebaseSession\n * @type {any} - @TODO: install types for Firebase or ditch Firebase\n */\nFirebaseSession.fb_root = null;\n\n\n// class WebSocketSession {\n// \tconstructor(session_id) {\n// \t\tthis.id = session_id;\n// \t\tthis._listeners = [];\n\n// \t\t// this.ws = new WebSocket(`wss://${location.host}/api/sessions/${this.id}`);\n// \t\tthis.ws = new WebSocket(`ws://${location.host}/api/session`);\n\n// \t\tfile_name = `[${this.id}]`;\n// \t\tupdate_title();\n// \t\tthis.start();\n// \t}\n// \tstart() {\n// \t\tthis.ws.addEventListener(\"open\", () => {\n// \t\t\tthis.ws.send(JSON.stringify({\n// \t\t\t\ttype: \"join\",\n// \t\t\t\tuser,\n// \t\t\t\tsession_id: this.id,\n// \t\t\t}));\n// \t\t});\n\n// \t\tthis.ws.addEventListener(\"message\", e => {\n// \t\t\tconst data = JSON.parse(e.data);\n// \t\t\tif (data.type === \"image\") {\n// \t\t\t\t// TODO: transfer as binary data\n// \t\t\t\tconst img = new Image();\n// \t\t\t\timg.onload = () => {\n// \t\t\t\t\tundoable({\n// \t\t\t\t\t\tname: \"Sync Session\",\n// \t\t\t\t\t\ticon: get_help_folder_icon(\"p_database.png\"),\n// \t\t\t\t\t}, () => {\n// \t\t\t\t\t\tmain_ctx.copy(img);\n// \t\t\t\t\t\t$canvas_area.trigger(\"resize\");\n// \t\t\t\t\t});\n// \t\t\t\t};\n// \t\t\t\timg.src = data.uri;\n// \t\t\t} else if (data.type === \"cursor\") {\n// \t\t\t\tconst cursor_canvas = make_canvas(32, 32);\n// \t\t\t\tconst $cursor = $(cursor_canvas).addClass(\"user-cursor\").appendTo($app);\n// \t\t\t\t$cursor.css({\n// \t\t\t\t\tdisplay: \"none\",\n// \t\t\t\t\tposition: \"absolute\",\n// \t\t\t\t\tleft: 0,\n// \t\t\t\t\ttop: 0,\n// \t\t\t\t\topacity: 0,\n// \t\t\t\t\tzIndex: 5, // @#: z-index\n// \t\t\t\t\tpointerEvents: \"none\",\n// \t\t\t\t\ttransition: \"opacity 0.5s\",\n// \t\t\t\t});\n// \t\t\t\tconst draw_cursor = () => {\n// \t\t\t\t\tcursor_canvas.width = cursor_image.width;\n// \t\t\t\t\tcursor_canvas.height = cursor_image.height;\n// \t\t\t\t\tconst cursor_ctx = cursor_canvas.ctx;\n// \t\t\t\t\tcursor_ctx.fillStyle = data.color;\n// \t\t\t\t\tcursor_ctx.fillRect(0, 0, cursor_canvas.width, cursor_canvas.height);\n// \t\t\t\t\tcursor_ctx.globalCompositeOperation = \"multiply\";\n// \t\t\t\t\tcursor_ctx.drawImage(cursor_image, 0, 0);\n// \t\t\t\t\tcursor_ctx.globalCompositeOperation = \"destination-atop\";\n// \t\t\t\t\tcursor_ctx.drawImage(cursor_image, 0, 0);\n// \t\t\t\t};\n// \t\t\t\tif (cursor_image.complete) {\n// \t\t\t\t\tdraw_cursor();\n// \t\t\t\t}\n// \t\t\t\telse {\n// \t\t\t\t\t$(cursor_image).one(\"load\", draw_cursor);\n// \t\t\t\t}\n// \t\t\t\t// Update the cursor element\n// \t\t\t\tconst canvas_rect = window.canvas_bounding_client_rect;\n// \t\t\t\t$cursor.css({\n// \t\t\t\t\tdisplay: \"block\",\n// \t\t\t\t\tposition: \"absolute\",\n// \t\t\t\t\tleft: canvas_rect.left + magnification * data.x,\n// \t\t\t\t\ttop: canvas_rect.top + magnification * data.y,\n// \t\t\t\t\topacity: 1 - data.away,\n// \t\t\t\t});\n// \t\t\t} else {\n// \t\t\t\tconsole.warn(\"Unknown message type\", data.type);\n// \t\t\t}\n// \t\t});\n\n\n// \t\t// // For each existing and new user\n// \t\t// _fb_on(this.fb_users, \"child_added\", snap => {\n// \t\t// \t// Is this you?\n// \t\t// \tif (snap.key === user_id) {\n// \t\t// \t\t// You already have a cursor.\n// \t\t// \t\treturn;\n// \t\t// \t}\n// \t\t// \t// Get the Firebase reference for this user\n// \t\t// \tconst fb_other_user = snap.ref;\n// \t\t// \t// Get the user object stored on the server\n// \t\t// \tlet other_user = snap.val();\n// \t\t// \t// @TODO: display other cursor types?\n// \t\t// \t// @TODO: display pointer button state?\n// \t\t// \t// @TODO: display selections\n// \t\t// \tconst cursor_canvas = make_canvas(32, 32);\n// \t\t// \t// Make the cursor element\n// \t\t// \tconst $cursor = $(cursor_canvas).addClass(\"user-cursor\").appendTo($app);\n// \t\t// \t$cursor.css({\n// \t\t// \t\tdisplay: \"none\",\n// \t\t// \t\tposition: \"absolute\",\n// \t\t// \t\tleft: 0,\n// \t\t// \t\ttop: 0,\n// \t\t// \t\topacity: 0,\n// \t\t// \t\tzIndex: 5, // @#: z-index\n// \t\t// \t\tpointerEvents: \"none\",\n// \t\t// \t\ttransition: \"opacity 0.5s\",\n// \t\t// \t});\n// \t\t// \t// When the cursor data changes\n// \t\t// \t_fb_on(fb_other_user, \"value\", snap => {\n// \t\t// \t\tother_user = snap.val();\n// \t\t// \t\t// If the user has left\n// \t\t// \t\tif (other_user == null) {\n// \t\t// \t\t\t// Remove the cursor element\n// \t\t// \t\t\t$cursor.remove();\n// \t\t// \t\t}\n// \t\t// \t\telse {\n// \t\t// \t\t\t// Draw the cursor\n// \t\t// \t\t\tconst draw_cursor = () => {\n// \t\t// \t\t\t\tcursor_canvas.width = cursor_image.width;\n// \t\t// \t\t\t\tcursor_canvas.height = cursor_image.height;\n// \t\t// \t\t\t\tconst cursor_ctx = cursor_canvas.ctx;\n// \t\t// \t\t\t\tcursor_ctx.fillStyle = other_user.color;\n// \t\t// \t\t\t\tcursor_ctx.fillRect(0, 0, cursor_canvas.width, cursor_canvas.height);\n// \t\t// \t\t\t\tcursor_ctx.globalCompositeOperation = \"multiply\";\n// \t\t// \t\t\t\tcursor_ctx.drawImage(cursor_image, 0, 0);\n// \t\t// \t\t\t\tcursor_ctx.globalCompositeOperation = \"destination-atop\";\n// \t\t// \t\t\t\tcursor_ctx.drawImage(cursor_image, 0, 0);\n// \t\t// \t\t\t};\n// \t\t// \t\t\tif (cursor_image.complete) {\n// \t\t// \t\t\t\tdraw_cursor();\n// \t\t// \t\t\t}\n// \t\t// \t\t\telse {\n// \t\t// \t\t\t\t$(cursor_image).one(\"load\", draw_cursor);\n// \t\t// \t\t\t}\n// \t\t// \t\t\t// Update the cursor element\n// \t\t// \t\t\tconst canvas_rect = window.canvas_bounding_client_rect;\n// \t\t// $cursor.css({\n// \t\t// \t\t\t\tdisplay: \"block\",\n// \t\t// \t\t\t\tposition: \"absolute\",\n// \t\t// \t\t\t\tleft: canvas_rect.left + magnification * other_user.cursor.x,\n// \t\t// \t\t\t\ttop: canvas_rect.top + magnification * other_user.cursor.y,\n// \t\t// \t\t\t\topacity: 1 - other_user.cursor.away,\n// \t\t// \t\t\t});\n// \t\t// \t\t}\n// \t\t// \t});\n// \t\t// });\n// \t\t// let previous_uri;\n// \t\t// // let pointer_operations = []; // the multiplayer syncing stuff is a can of worms, so this is disabled\n// \t\t// this.write_canvas_to_database_immediately = () => {\n// \t\t// \tconst save_paused = handle_data_loss();\n// \t\t// \tif (save_paused) {\n// \t\t// \t\treturn;\n// \t\t// \t}\n// \t\t// \t// Sync the data from this client to the server (one-way)\n// \t\t// \tconst uri = main_canvas.toDataURL();\n// \t\t// \tif (previous_uri !== uri) {\n// \t\t// \t\t// log(\"clear pointer operations to set data\", pointer_operations);\n// \t\t// \t\t// pointer_operations = [];\n// \t\t// \t\tlog(\"Write canvas data to Firebase\");\n// \t\t// \t\tthis.fb_data.set(uri);\n// \t\t// \t\tprevious_uri = uri;\n// \t\t// \t}\n// \t\t// \telse {\n// \t\t// \t\tlog(\"(Don't write canvas data to Firebase; it hasn't changed)\");\n// \t\t// \t}\n// \t\t// };\n// \t\t// this.write_canvas_to_database_soon = debounce(this.write_canvas_to_database_immediately, 100);\n// \t\t// let ignore_session_update = false;\n// \t\t// $G.on(\"session-update.session-hook\", () => {\n// \t\t// \tif (ignore_session_update) {\n// \t\t// \t\tlog(\"(Ignore session-update from Sync Session undoable)\");\n// \t\t// \t\treturn;\n// \t\t// \t}\n// \t\t// \tthis.write_canvas_to_database_soon();\n// \t\t// });\n// \t\t// // Any time we change or receive the image data\n// \t\t// _fb_on(this.fb_data, \"value\", snap => {\n// \t\t// \tlog(\"Firebase data update\");\n// \t\t// \tconst uri = snap.val();\n// \t\t// \tif (uri == null) {\n// \t\t// \t\t// If there's no value at the data location, this is a new session\n// \t\t// \t\t// Sync the current data to it\n// \t\t// \t\tthis.write_canvas_to_database_soon();\n// \t\t// \t}\n// \t\t// \telse {\n// \t\t// \t\tprevious_uri = uri;\n// \t\t// \t\t// Load the new image data\n// \t\t// \t\tconst img = new Image();\n// \t\t// \t\timg.onload = () => {\n// \t\t// \t\t\t// Cancel any in-progress pointer operations\n// \t\t// \t\t\t// if (pointer_operations.length) {\n// \t\t// \t\t\t// \t$G.triggerHandler(\"pointerup\", \"cancel\");\n// \t\t// \t\t\t// }\n\n// \t\t// \t\t\tconst test_canvas = make_canvas(img);\n// \t\t// \t\t\tconst image_data_remote = test_canvas.ctx.getImageData(0, 0, test_canvas.width, test_canvas.height);\n// \t\t// \t\t\tconst image_data_local = main_ctx.getImageData(0, 0, main_canvas.width, main_canvas.height);\n\n// \t\t// \t\t\tif (!image_data_match(image_data_remote, image_data_local, 5)) {\n// \t\t// \t\t\t\tignore_session_update = true;\n// \t\t// \t\t\t\tundoable({\n// \t\t// \t\t\t\t\tname: \"Sync Session\",\n// \t\t// \t\t\t\t\ticon: get_help_folder_icon(\"p_database.png\"),\n// \t\t// \t\t\t\t}, () => {\n// \t\t// \t\t\t\t\t// Write the image data to the canvas\n// \t\t// \t\t\t\t\tmain_ctx.copy(img);\n// \t\t// \t\t\t\t\t$canvas_area.trigger(\"resize\");\n// \t\t// \t\t\t\t});\n// \t\t// \t\t\t\tignore_session_update = false;\n// \t\t// \t\t\t}\n// \t\t// \t\t};\n// \t\t// \t\timg.src = uri;\n// \t\t// \t}\n// \t\t// }, error => {\n// \t\t// \tshow_error_message(\"Failed to retrieve data from Firebase. The document will not load, and changes will not be saved.\", error);\n// \t\t// \tfile_name = `[Failed to load ${this.id}]`;\n// \t\t// \tupdate_title();\n// \t\t// });\n// \t\t// // Update the cursor status\n// \t\t// $G.on(\"pointermove.session-hook\", e => {\n// \t\t// \tconst m = to_canvas_coords(e);\n// \t\t// \tthis.fb_user.child(\"cursor\").update({\n// \t\t// \t\tx: m.x,\n// \t\t// \t\ty: m.y,\n// \t\t// \t\taway: false,\n// \t\t// \t});\n// \t\t// });\n// \t\t// $G.on(\"blur.session-hook\", () => {\n// \t\t// \tthis.fb_user.child(\"cursor\").update({\n// \t\t// \t\taway: true,\n// \t\t// \t});\n// \t\t// });\n// \t\t// @FIXME: the cursor can come back from \"away\" via a pointer event\n// \t\t// while the window is blurred and stay there when the user goes away\n// \t\t// maybe replace \"away\" with a timestamp of activity and then\n// \t\t// clients can decide whether a given cursor should be visible\n// \t}\n// \tend() {\n// \t\t// Skip debounce and save immediately\n// \t\tthis.write_canvas_to_database_soon.cancel();\n// \t\tthis.write_canvas_to_database_immediately();\n// \t\t// Remove session-related hooks\n// \t\t$G.off(\".session-hook\");\n// \t\t// $canvas_area.off(\"pointerdown.session-hook\");\n// \t\t// Remove collected Firebase event listeners\n// \t\tthis._fb_listeners.forEach(({ fb, event_type, callback, _error_callback }) => {\n// \t\t\tlog(`Remove listener for ${fb.path.toString()} .on ${event_type}`);\n// \t\t\tfb.off(event_type, callback);\n// \t\t});\n// \t\tthis._fb_listeners.length = 0;\n// \t\t// Remove the user from the session\n// \t\tthis.fb_user.remove();\n// \t\t// Remove any cursor elements\n// \t\t$app.find(\".user-cursor\").remove();\n// \t\t// Reset to \"untitled\"\n// \t\treset_file();\n// \t}\n// }\n\n\nclass RESTSession {\n\tconstructor(session_id) {\n\t\tthis.id = session_id;\n\n\t\tfile_name = `[Loading ${this.id}]`;\n\t\tupdate_title();\n\t\tthis.start();\n\n\t\tthis._previous_uri = \"\";\n\t\tthis._ignore_session_update = false;\n\t\tthis._poll_tid = -1;\n\t\tthis._poll_fetch_start_time = -1;\n\t\tthis._last_write_time = -1;\n\t}\n\tasync _write_canvas_to_server_immediately() {\n\t\tconst save_paused = handle_data_loss();\n\t\tif (save_paused) {\n\t\t\treturn;\n\t\t}\n\t\t// Sync the data from this client to the server (one-way)\n\t\tconst uri = main_canvas.toDataURL();\n\t\tif (this._previous_uri !== uri) {\n\t\t\t// log(\"clear pointer operations to set data\", pointer_operations);\n\t\t\t// pointer_operations = [];\n\t\t\tlog(\"Write canvas data to server\");\n\t\t\tthis._previous_uri = uri;\n\t\t\tthis._last_write_time = performance.now(); // not sure about this\n\t\t\tawait fetch(`/api/rooms/${this.id}/data`, {\n\t\t\t\tmethod: \"PUT\",\n\t\t\t\tbody: uri,\n\t\t\t});\n\t\t\tthis._last_write_time = performance.now(); // not sure about this\n\t\t} else {\n\t\t\tlog(\"(Don't write canvas data to server; it hasn't changed)\");\n\t\t}\n\t}\n\tstart() {\n\t\tthis._write_canvas_to_server_soon = debounce(this._write_canvas_to_server_immediately, 100);\n\t\t$G.on(\"session-update.session-hook\", () => {\n\t\t\tif (this._ignore_session_update) {\n\t\t\t\tlog(\"(Ignore session-update from Sync Session undoable)\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._write_canvas_to_server_soon();\n\t\t\tthis._last_write_time = performance.now(); // not sure about this\n\t\t});\n\t\t// Poll for changes\n\t\tconst poll = async () => {\n\t\t\tlet received_image_data_uri;\n\t\t\ttry {\n\t\t\t\tthis._poll_fetch_start_time = performance.now();\n\t\t\t\tconst response = await fetch(`/api/rooms/${this.id}/data`);\n\t\t\t\tif (response.status === 404) {\n\t\t\t\t\t// If the image data wasn't found, this is a new session\n\t\t\t\t\treceived_image_data_uri = null;\n\t\t\t\t} else {\n\t\t\t\t\treceived_image_data_uri = await response.text();\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tshow_error_message(\"Failed to load image document from the server.\", error);\n\t\t\t\tfile_name = `[Failed to load ${this.id}]`;\n\t\t\t\tupdate_title();\n\t\t\t\treturn; // Uh, TODO: retry?\n\t\t\t}\n\t\t\tfile_name = `[${this.id}]`;\n\t\t\tupdate_title();\n\t\t\tthis.handle_data_snapshot(received_image_data_uri, this._poll_fetch_start_time);\n\t\t\t// @ts-ignore  (stupid @types/node interference, with their setTimeout typing)\n\t\t\tthis._poll_tid = setTimeout(poll, 1000);\n\t\t};\n\t\tpoll();\n\t}\n\thandle_data_snapshot(uri, start_time) {\n\t\t// Any time we change or receive the image data\n\t\tif (!uri) {\n\t\t\t// This is a new session; sync the current data to it\n\t\t\tthis._write_canvas_to_server_soon();\n\t\t\tthis._last_write_time = performance.now(); // not sure about this\n\t\t} else {\n\t\t\tthis._previous_uri = uri;\n\t\t\t// Load the new image data\n\t\t\tconst img = new Image();\n\t\t\timg.onload = () => {\n\n\t\t\t\tif (this._last_write_time > start_time) {\n\t\t\t\t\t// If the image data was written since we started fetching it,\n\t\t\t\t\t// ignore the likely-stale data.\n\t\t\t\t\tlog(\"(Ignore stale image data)\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Cancel any in-progress pointer operations\n\t\t\t\t// if (pointer_operations.length) {\n\t\t\t\t// \t$G.triggerHandler(\"pointerup\", \"cancel\");\n\t\t\t\t// }\n\n\t\t\t\tconst test_canvas = make_canvas(img);\n\t\t\t\tconst image_data_remote = test_canvas.ctx.getImageData(0, 0, test_canvas.width, test_canvas.height);\n\t\t\t\tconst image_data_local = main_ctx.getImageData(0, 0, main_canvas.width, main_canvas.height);\n\n\t\t\t\tif (!image_data_match(image_data_remote, image_data_local, 5)) {\n\t\t\t\t\tthis._ignore_session_update = true;\n\t\t\t\t\tundoable({\n\t\t\t\t\t\tname: \"Sync Session\",\n\t\t\t\t\t\ticon: get_help_folder_icon(\"p_database.png\"),\n\t\t\t\t\t}, () => {\n\t\t\t\t\t\t// Write the image data to the canvas\n\t\t\t\t\t\tmain_ctx.copy(img);\n\t\t\t\t\t\t$canvas_area.trigger(\"resize\");\n\t\t\t\t\t});\n\t\t\t\t\tthis._ignore_session_update = false;\n\t\t\t\t}\n\t\t\t};\n\t\t\timg.onerror = () => {\n\t\t\t\t// uri is invalid, so it might be an error message or something; I'll include it in the expandible details.\n\t\t\t\tshow_error_message(\"Failed to load image document from the server. Invalid image data.\", uri);\n\t\t\t};\n\t\t\timg.src = uri;\n\t\t}\n\t}\n\tend() {\n\t\t// Stop polling\n\t\tclearTimeout(this._poll_tid);\n\t\t// Skip debounce and save immediately\n\t\tthis._write_canvas_to_server_soon.cancel();\n\t\tthis._write_canvas_to_server_immediately();\n\t\t// Remove session-related hooks\n\t\t$G.off(\".session-hook\");\n\t\t// Remove any cursor elements\n\t\t$app.find(\".user-cursor\").remove();\n\t\t// Reset to \"untitled\"\n\t\treset_file();\n\t}\n}\n\n\n// Handle the starting, switching, and ending of sessions from the location.hash\n\nlet current_session;\nconst end_current_session = () => {\n\tif (current_session) {\n\t\tlog(\"Ending current session\");\n\t\tcurrent_session.end();\n\t\tcurrent_session = null;\n\t}\n};\nconst generate_session_id = () => (Math.random() * (2 ** 32)).toString(16).replace(\".\", \"\");\nconst update_session_from_location_hash = () => {\n\tconst session_match = location.hash.match(/^#?(?:.*,)?(session|local):(.*)$/i);\n\tconst load_from_url_match = location.hash.match(/^#?(?:.*,)?(load):(.*)$/i);\n\tif (session_match) {\n\t\tconst local = session_match[1].toLowerCase() === \"local\";\n\t\tconst session_id = session_match[2];\n\t\tif (session_id === \"\") {\n\t\t\tlog(\"Invalid session ID; session ID cannot be empty\");\n\t\t\tend_current_session();\n\t\t} else if (!local && session_id.match(/[./[\\]#$]/)) {\n\t\t\tlog(\"Session ID is not a valid Firebase location; it cannot contain any of ./[]#$\");\n\t\t\tend_current_session();\n\t\t} else if (!session_id.match(/[-0-9A-Za-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u02af\\u1d00-\\u1d25\\u1d62-\\u1d65\\u1d6b-\\u1d77\\u1d79-\\u1d9a\\u1e00-\\u1eff\\u2090-\\u2094\\u2184-\\u2184\\u2488-\\u2490\\u271d-\\u271d\\u2c60-\\u2c7c\\u2c7e-\\u2c7f\\ua722-\\ua76f\\ua771-\\ua787\\ua78b-\\ua78c\\ua7fb-\\ua7ff\\ufb00-\\ufb06]+/)) {\n\t\t\tlog(\"Invalid session ID; it must consist of 'alphanumeric-esque' characters\");\n\t\t\tend_current_session();\n\t\t} else if (\n\t\t\tcurrent_session && current_session.id === session_id &&\n\t\t\tlocal === (current_session instanceof LocalSession)\n\t\t) {\n\t\t\tlog(\"Hash changed but the session ID and session type are the same\");\n\t\t} else {\n\t\t\t// @TODO: Ask if you want to save before starting a new session\n\t\t\tend_current_session();\n\t\t\tlet online_session_implementation = is_discord_embed ? \"RESTSession\" : \"FirebaseSession\";\n\t\t\ttry {\n\t\t\t\tonline_session_implementation = localStorage[\"online_session_implementation\"] || online_session_implementation;\n\t\t\t} catch (_error) {\n\t\t\t\t// ignore, as this is only for development\n\t\t\t}\n\t\t\tif (local) {\n\t\t\t\tlog(`Starting a new LocalSession, ID: ${session_id}`);\n\t\t\t\tcurrent_session = new LocalSession(session_id);\n\t\t\t} else if (online_session_implementation === \"RESTSession\") {\n\t\t\t\t// log(`Starting a new WebSocketSession, ID: ${session_id}`);\n\t\t\t\t// current_session = new WebSocketSession(session_id);\n\t\t\t\tlog(`Starting a new RESTSession, ID: ${session_id}`);\n\t\t\t\tcurrent_session = new RESTSession(session_id);\n\t\t\t} else if (online_session_implementation === \"FirebaseSession\") {\n\t\t\t\tlog(`Starting a new FirebaseSession, ID: ${session_id}`);\n\t\t\t\tcurrent_session = new FirebaseSession(session_id);\n\t\t\t} else {\n\t\t\t\tshow_error_message(`Invalid online session implementation '${online_session_implementation}'`);\n\t\t\t\tcurrent_session = new LocalSession(session_id);\n\t\t\t}\n\t\t}\n\t} else if (load_from_url_match) {\n\t\tconst url = decodeURIComponent(load_from_url_match[2]);\n\n\t\tconst uris = get_uris(url);\n\t\tif (uris.length === 0) {\n\t\t\tshow_error_message(\"Invalid URL to load (after #load: in the address bar). It must include a protocol (https:// or http://)\");\n\t\t\treturn;\n\t\t}\n\n\t\tlog(\"Switching to new session from #load: URL (to #local: URL with session ID)\");\n\t\t// Note: could use into_existing_session=false on open_from_image_info instead of creating the new session beforehand\n\t\tend_current_session();\n\t\tchange_url_param(\"local\", generate_session_id());\n\n\t\tload_image_from_uri(url).then((info) => {\n\t\t\topen_from_image_info(info, null, null, true, true);\n\t\t}, show_resource_load_error_message);\n\n\t} else {\n\t\tlog(\"No session ID in hash\");\n\t\tconst old_hash = location.hash;\n\t\tend_current_session();\n\t\tchange_url_param(\"local\", generate_session_id(), { replace_history_state: true });\n\t\tlog(\"After replaceState:\", location.hash);\n\t\tif (old_hash === location.hash) {\n\t\t\t// e.g. on Wayback Machine\n\t\t\tshow_error_message(\"Autosave is disabled. Failed to update URL to start session.\");\n\t\t} else {\n\t\t\tupdate_session_from_location_hash();\n\t\t}\n\t}\n};\n\n$G.on(\"hashchange popstate change-url-params\", (e) => {\n\tlog(e.type, location.hash);\n\tupdate_session_from_location_hash();\n});\n\nconst new_local_session = () => {\n\tend_current_session();\n\tlog(\"Changing URL to start new session...\");\n\tchange_url_param(\"local\", generate_session_id());\n};\n\n// @TODO: Session GUI\n// @TODO: Indicate when the session ID is invalid\n// @TODO: Indicate when the session switches\n\n// @TODO: Indicate when there is no session!\n// Probably in app.js so as to handle the possibility of sessions.js failing to load.\n\n\nif (is_discord_embed) {\n\t// I'm using top level await WITHIN the discord-activity-client.js module,\n\t// but not here due to lack of support in the current browser version used for Cypress tests.\n\t// This async IIFE could be eliminated if Cypress was updated.\n\t(async () => {\n\t\tconst { /*Discord,*/ discordSdk, newAuth, guildMember, handleExternalLinks, discordActivitySystemHooks } = await import(\"./discord-activity-client.js\");\n\t\t// const { Events } = Discord;\n\n\t\tlog(\"Discord SDK\", discordSdk);\n\t\tlog(\"New Auth:\", newAuth);\n\t\tlog(\"Guild Member\", guildMember);\n\n\t\t// Handle external links\n\t\thandleExternalLinks();\n\n\t\t// Start session for the Discord Activity instance\n\t\t// (Would channelId be better?)\n\t\tlog(`Starting session for Discord Activity instance ${discordSdk.instanceId}`);\n\t\tchange_url_param(\"session\", `discord-activity-${discordSdk.instanceId}`);\n\n\t\t// Apply system hooks\n\t\tObject.assign(window.systemHooks, discordActivitySystemHooks);\n\n\t\t// // Fetch\n\t\t// const participants = await discordSdk.commands.getInstanceConnectedParticipants();\n\t\t// console.log(\"Initial participants\", participants);\n\n\t\t// // Subscribe\n\t\t// discordSdk.subscribe(Events.ACTIVITY_INSTANCE_PARTICIPANTS_UPDATE, updateParticipants);\n\t\t// // Unsubscribe\n\t\t// discordSdk.unsubscribe(Events.ACTIVITY_INSTANCE_PARTICIPANTS_UPDATE, updateParticipants);\n\t})();\n} else {\n\tlog(\"Initializing with location hash:\", location.hash);\n\tupdate_session_from_location_hash();\n}\n\n// function updateParticipants(participants) {\n// \t// Do something really cool\n// \tconsole.log(\"Updated participants:\", participants);\n// }\n\nexport { new_local_session };\n// Temporary globals until all dependent code is converted to ES Modules\nwindow.new_local_session = new_local_session; // used by functions.js\n\n"
  },
  {
    "path": "src/simulate-random-gestures.js",
    "content": "// @ts-check\n/* global $app, $canvas_area, $status_text, main_canvas, selection */\n\nimport { cancel } from \"./functions.js\";\n\nlet seed = 4; // chosen later\n\nconst seededRandom = (max = 1, min = 0) => {\n\tseed = (seed * 9301 + 49297) % 233280;\n\tconst rnd = seed / 233280;\n\n\treturn min + rnd * (max - min);\n};\n\nexport let simulatingGestures = false;\n\nlet gestureTimeoutID;\nlet periodicGesturesTimeoutID;\n\nlet choose = (array) => array[~~(seededRandom() * array.length)];\nlet isAnyMenuOpen = () => $(\".menu-button.active\").length > 0;\n\nlet cursor_image = new Image();\ncursor_image.src = \"images/cursors/default.png\";\n\nconst $cursor = $(cursor_image).addClass(\"user-cursor\");\n$cursor.css({\n\tposition: \"absolute\",\n\tleft: 0,\n\ttop: 0,\n\topacity: 0,\n\tzIndex: 5, // @#: z-index\n\tpointerEvents: \"none\",\n\ttransition: \"opacity 0.5s\",\n});\n\nexport const simulateRandomGesture = (callback, { shift, shiftToggleChance = 0.01, secondary, secondaryToggleChance, target = main_canvas }) => {\n\tlet startWithinRect = target.getBoundingClientRect();\n\tlet canvasAreaRect = $canvas_area[0].getBoundingClientRect();\n\n\tlet startMinX = Math.max(startWithinRect.left, canvasAreaRect.left);\n\tlet startMaxX = Math.min(startWithinRect.right, canvasAreaRect.right);\n\tlet startMinY = Math.max(startWithinRect.top, canvasAreaRect.top);\n\tlet startMaxY = Math.min(startWithinRect.bottom, canvasAreaRect.bottom);\n\tlet startPointX = startMinX + seededRandom() * (startMaxX - startMinX);\n\tlet startPointY = startMinY + seededRandom() * (startMaxY - startMinY);\n\n\t$cursor.appendTo($app);\n\tlet triggerMouseEvent = (type, point) => {\n\n\t\tif (isAnyMenuOpen()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst clientX = point.x;\n\t\tconst clientY = point.y;\n\t\tconst el_over = document.elementFromPoint(clientX, clientY);\n\t\tconst do_nothing = !type.match(/move/) && (!el_over || !el_over.closest(\".canvas-area\"));\n\t\t$cursor.css({\n\t\t\tdisplay: \"block\",\n\t\t\tposition: \"absolute\",\n\t\t\tleft: clientX,\n\t\t\ttop: clientY,\n\t\t\topacity: do_nothing ? 0.5 : 1,\n\t\t});\n\t\tif (do_nothing) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet event = new $.Event(type, {\n\t\t\tview: window,\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t\tclientX,\n\t\t\tclientY,\n\t\t\tscreenX: clientX,\n\t\t\tscreenY: clientY,\n\t\t\toffsetX: point.x,\n\t\t\toffsetY: point.y,\n\t\t\tbutton: secondary ? 2 : 0,\n\t\t\tbuttons: secondary ? 2 : 1,\n\t\t\tshiftKey: shift,\n\t\t});\n\t\t$(target).trigger(event);\n\t};\n\n\tlet t = 0;\n\tlet gestureComponents = [];\n\tlet numberOfComponents = 5;\n\tfor (let i = 0; i < numberOfComponents; i += 1) {\n\t\tgestureComponents.push({\n\t\t\trx:\n\t\t\t\t(seededRandom() * Math.min(canvasAreaRect.width, canvasAreaRect.height)) /\n\t\t\t\t2 /\n\t\t\t\tnumberOfComponents,\n\t\t\try:\n\t\t\t\t(seededRandom() * Math.min(canvasAreaRect.width, canvasAreaRect.height)) /\n\t\t\t\t2 /\n\t\t\t\tnumberOfComponents,\n\t\t\tangularFactor: seededRandom() * 5 - seededRandom(),\n\t\t\tangularOffset: seededRandom() * 5 - seededRandom(),\n\t\t});\n\t}\n\tconst stepsInGesture = 50;\n\tlet pointForTimeWithArbitraryStart = (t) => {\n\t\tlet point = { x: 0, y: 0 };\n\t\tfor (let i = 0; i < gestureComponents.length; i += 1) {\n\t\t\tlet { rx, ry, angularFactor, angularOffset } = gestureComponents[i];\n\t\t\tpoint.x +=\n\t\t\t\tMath.sin(Math.PI * 2 * ((t / 2) * angularFactor + angularOffset)) *\n\t\t\t\trx;\n\t\t\tpoint.y +=\n\t\t\t\tMath.cos(Math.PI * 2 * ((t / 2) * angularFactor + angularOffset)) *\n\t\t\t\try;\n\t\t}\n\t\treturn point;\n\t};\n\tlet pointForTime = (t) => {\n\t\tlet point = pointForTimeWithArbitraryStart(t);\n\t\tlet zeroPoint = pointForTimeWithArbitraryStart(0);\n\t\tpoint.x -= zeroPoint.x;\n\t\tpoint.y -= zeroPoint.y;\n\t\tpoint.x += startPointX;\n\t\tpoint.y += startPointY;\n\t\treturn point;\n\t};\n\n\ttriggerMouseEvent(\"pointerenter\", pointForTime(t)); // so dynamic cursors follow the simulation cursor\n\ttriggerMouseEvent(\"pointerdown\", pointForTime(t));\n\tlet move = () => {\n\t\tt += 1 / stepsInGesture;\n\t\tif (seededRandom() < shiftToggleChance) {\n\t\t\tshift = !shift;\n\t\t}\n\t\tif (seededRandom() < secondaryToggleChance) {\n\t\t\tsecondary = !secondary;\n\t\t}\n\t\tif (t > 1) {\n\t\t\ttriggerMouseEvent(\"pointerup\", pointForTime(t));\n\n\t\t\t$cursor.remove();\n\n\t\t\tif (callback) {\n\t\t\t\tcallback();\n\t\t\t}\n\t\t} else {\n\t\t\ttriggerMouseEvent(\"pointermove\", pointForTime(t));\n\t\t\tgestureTimeoutID = setTimeout(move, 10);\n\t\t}\n\t};\n\ttriggerMouseEvent(\"pointerleave\", pointForTime(t));\n\tmove();\n};\n\nexport const simulateRandomGesturesPeriodically = () => {\n\tsimulatingGestures = true;\n\n\tif (window.drawRandomlySeed != null) {\n\t\tseed = window.drawRandomlySeed;\n\t} else {\n\t\tseed = ~~(Math.random() * 5000000);\n\t}\n\twindow.console?.log(\"Using seed:\", seed);\n\twindow.console?.log(\"Note: Seeds are not guaranteed to work with different versions of the app, but within the same version it should produce the same results given the same starting document & other state & NO interference, and except for airbrush randomness which is uncontrolled by the seed.\");\n\twindow.console?.log(`To use this seed:\n\n\t\twindow.drawRandomlySeed = ${seed};\n\t\tdocument.body.style.width = \"${getComputedStyle(document.body).width}\";\n\t\tdocument.body.style.height = \"${getComputedStyle(document.body).height}\";\n\t\twindow.simulateRandomGesturesPeriodically();\n\t\tdelete window.drawRandomlySeed;\n\n\t`);\n\n\tlet delayBetweenGestures = 500;\n\tlet shiftStart = false;\n\tlet shiftStartToggleChance = 0.1;\n\tlet shiftToggleChance = 0.001;\n\tlet secondaryStart = false;\n\tlet secondaryStartToggleChance = 0.1;\n\tlet secondaryToggleChance = 0.001;\n\tlet switchToolsChance = 0.5;\n\tlet multiToolsChance = 0.8;\n\tlet pickColorChance = 0.5;\n\tlet pickToolOptionsChance = 0.8;\n\tlet scrollChance = 0.2;\n\tlet dragSelectionChance = 0.8;\n\n\t// scroll randomly absolutely initially so the starting scroll doesn't play into whether a seed reproduces\n\t$canvas_area.scrollTop($canvas_area.width() * seededRandom());\n\t$canvas_area.scrollLeft($canvas_area.height() * seededRandom());\n\n\tlet _simulateRandomGesture = (callback) => {\n\t\tsimulateRandomGesture(callback, {\n\t\t\tshift: shiftStart,\n\t\t\tshiftToggleChance,\n\t\t\tsecondary: secondaryStart,\n\t\t\tsecondaryToggleChance,\n\t\t});\n\t};\n\tlet waitThenGo = () => {\n\t\t// @TODO: a button to stop it as well (maybe make \"stop drawing randomly\" a link button?)\n\t\t$status_text.text(\"Press Esc to stop drawing randomly.\");\n\t\tif (isAnyMenuOpen()) {\n\t\t\tperiodicGesturesTimeoutID = setTimeout(waitThenGo, 50);\n\t\t\treturn;\n\t\t}\n\n\t\tif (seededRandom() < shiftStartToggleChance) {\n\t\t\tshiftStart = !shiftStart;\n\t\t}\n\t\tif (seededRandom() < secondaryStartToggleChance) {\n\t\t\tsecondaryStart = !secondaryStart;\n\t\t}\n\t\tif (seededRandom() < switchToolsChance) {\n\t\t\tlet multiToolsPlz = seededRandom() < multiToolsChance;\n\t\t\t$(choose($(\".tool, tool-button\"))).trigger($.Event(\"click\", { shiftKey: multiToolsPlz }));\n\t\t}\n\t\tif (seededRandom() < pickToolOptionsChance) {\n\t\t\t$(choose($(\".tool-options *\"))).trigger(\"click\");\n\t\t}\n\t\tif (seededRandom() < pickColorChance) {\n\t\t\t// @TODO: maybe these should respond to a normal click?\n\t\t\tlet secondary = seededRandom() < 0.5;\n\t\t\tconst colorButton = choose($(\".swatch, .color-button\"));\n\t\t\t$(colorButton)\n\t\t\t\t.trigger($.Event(\"pointerdown\", { button: secondary ? 2 : 0 }))\n\t\t\t\t.trigger($.Event(\"click\", { button: secondary ? 2 : 0 }))\n\t\t\t\t.trigger($.Event(\"pointerup\", { button: secondary ? 2 : 0 }));\n\t\t}\n\t\tif (seededRandom() < scrollChance) {\n\t\t\tlet scrollAmount = (seededRandom() * 2 - 1) * 700;\n\t\t\tif (seededRandom() < 0.5) {\n\t\t\t\t$canvas_area.scrollTop($canvas_area.scrollTop() + scrollAmount);\n\t\t\t} else {\n\t\t\t\t$canvas_area.scrollLeft($canvas_area.scrollLeft() + scrollAmount);\n\t\t\t}\n\t\t}\n\t\tperiodicGesturesTimeoutID = setTimeout(() => {\n\t\t\t_simulateRandomGesture(() => {\n\t\t\t\tif (selection && seededRandom() < dragSelectionChance) {\n\t\t\t\t\tsimulateRandomGesture(waitThenGo, {\n\t\t\t\t\t\tshift: shiftStart,\n\t\t\t\t\t\tshiftToggleChance,\n\t\t\t\t\t\tsecondary: secondaryStart,\n\t\t\t\t\t\tsecondaryToggleChance,\n\t\t\t\t\t\ttarget: selection.canvas,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\twaitThenGo();\n\t\t\t\t}\n\t\t\t});\n\t\t}, delayBetweenGestures);\n\t};\n\t_simulateRandomGesture(waitThenGo);\n};\n\nexport const stopSimulatingGestures = () => {\n\tif (simulatingGestures) {\n\t\tclearTimeout(gestureTimeoutID);\n\t\tclearTimeout(periodicGesturesTimeoutID);\n\t\tsimulatingGestures = false;\n\t\t$status_text.default();\n\t\t$cursor.remove();\n\t\tcancel();\n\t}\n\tdocument.body.style.width = \"\";\n\tdocument.body.style.height = \"\";\n};\n\n// For code snippet logged to console\nwindow.simulateRandomGesturesPeriodically = simulateRandomGesturesPeriodically;\n"
  },
  {
    "path": "src/speech-recognition.js",
    "content": "// @ts-check\n// eslint-disable-next-line no-unused-vars\n/* global airbrush_size:writable, brush_size:writable, eraser_size:writable, pencil_size:writable, stroke_size:writable, pointer_active:writable, pointer_over_canvas:writable, pointer_previous:writable, pointer:writable */\n/* global $canvas_area, $status_text, button, localize, main_canvas, main_ctx, MENU_DIVIDER, selected_colors, selected_tool, selected_tools, tool_go */\n// import { localize } from \"./app-localization.js\";\nimport { deselect, get_tool_by_id, resize_canvas_without_saving_dimensions, select_tool, show_error_message, update_helper_layer } from \"./functions.js\";\nimport { $G, make_canvas } from \"./helpers.js\";\nimport { menus } from \"./menus.js\";\nimport { stopSimulatingGestures } from \"./simulate-random-gestures.js\";\nimport { TOOL_AIRBRUSH, TOOL_BRUSH, TOOL_CURVE, TOOL_ELLIPSE, TOOL_ERASER, TOOL_FILL, TOOL_FREE_FORM_SELECT, TOOL_LINE, TOOL_PENCIL, TOOL_POLYGON, TOOL_RECTANGLE, TOOL_ROUNDED_RECTANGLE, TOOL_SELECT, TOOL_TEXT, tools } from \"./tools.js\";\n\nexport let speech_recognition_active = false;\n\n/** @param {ImageData} subject_imagedata */\nexport let trace_and_sketch = (subject_imagedata) => { void subject_imagedata; };\nexport let trace_and_sketch_stop = () => { };\nexport let enable_speech_recognition = () => { };\nexport let disable_speech_recognition = () => { };\n/**\n * @param {string} input_text\n * @param {boolean} [default_to_entering_text]\n * @returns {VoiceCommand[]} interpretations\n */\nexport let interpret_command = (input_text, default_to_entering_text) => { void input_text; void default_to_entering_text; return []; };\n\nconst SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;\nconst SpeechGrammarList = window.SpeechGrammarList || window.webkitSpeechGrammarList;\n// const SpeechRecognitionEvent = window.SpeechRecognitionEvent || window.webkitSpeechRecognitionEvent;\n\nexport const speech_recognition_available = !!(SpeechRecognition && SpeechGrammarList);\n\nlet sketching_iid = -1;\n\nif (speech_recognition_available) {\n\n\tconst recognitionFixes = [\n\t\t// spell-checker:disable\n\n\t\t// colors\n\t\t[/^rat$/i, \"red\"],\n\t\t[/^Fred$/i, \"red\"],\n\t\t[/^Rhett$/i, \"red\"],\n\t\t[/^Brett$/i, \"red\"],\n\t\t[/^friend$/i, \"red\"],\n\t\t[\"hello\", \"yellow\"],\n\t\t[\"grave\", \"green\"],\n\t\t[\"the ruse\", \"maroon\"],\n\t\t[\"the wren\", \"maroon\"],\n\t\t[\"Ren\", \"maroon\"],\n\t\t[\"Arun\", \"maroon\"],\n\t\t[\"cream\", \"green\"],\n\t\t[\"LiteBlue\", \"light blue\"],\n\t\t[\"crown\", \"brown\"],\n\t\t[\"ombre\", \"umbre\"],\n\t\t[\"tan-tan\", \"tan tan\"],\n\t\t[/^pan$/i, \"tan\"],\n\t\t[/^cleo$/i, \"blue\"],\n\t\t[\"plaque\", \"black\"],\n\n\t\t// commands/misc\n\t\t[\"slick to the\", \"select the\"],\n\t\t[\"it's like the\", \"select the\"],\n\t\t[\"like the\", \"select the\"],\n\t\t[\"suck the\", \"select the\"],\n\t\t[\"septa\", \"select the\"],\n\t\t[\"spectre\", \"select the\"],\n\t\t[\"crab the\", \"grab the\"],\n\t\t[\"cram the\", \"grab the\"],\n\t\t[/^can the\\b/i, \"grab the\"],\n\t\t[/^scrams\\b/i, \"grab the\"],\n\t\t[/^craft\\b/i, \"grab the\"],\n\t\t[/^cabinet\\b/i, \"grab the\"],\n\t\t[/^tammy\\b/i, \"grab the\"],\n\t\t[/^grandpa\\b/i, \"grab the\"],\n\t\t[/^is the\\b/i, \"use the\"],\n\t\t[/^who's the\\b/i, \"use the\"],\n\t\t[\"flex\", \"select\"],\n\t\t[\"to all\", \"tool\"],\n\t\t[\"stool\", \"tool\"],\n\t\t[\"tour\", \"tool\"],\n\t\t[\"draught\", \"draw a\"],\n\t\t[\"try\", \"draw\"], // seems too general - (unless you previously told it to draw something...) - but it keeps coming up!\n\t\t// [\"drag\", \"draw a\"], // too general\n\t\t[\"giraffe\", \"draw\"],\n\t\t[\"tri-cat\", \"draw a cat\"],\n\t\t[\"tricap\", \"draw a cat\"],\n\t\t[\"tristar\", \"draw a star\"],\n\t\t[\"try picture\", \"draw a picture\"],\n\t\t[\"stop trying\", \"stop drawing\"],\n\t\t[\"dog drawing\", \"stop drawing\"],\n\t\t[\"camp drag\", \"stop drawing\"],\n\t\t[\"tuggle\", \"toggle\"],\n\t\t[/^travel/i, \"toggle\"],\n\t\t[/^title/i, \"toggle\"],\n\t\t[/^halo/i, \"toggle\"],\n\t\t[/^michael/i, \"toggle\"],\n\t\t[/^taco/i, \"toggle\"],\n\t\t[\"about pink\", \"about paint\"],\n\t\t[\"projects news\", \"project news\"],\n\t\t[\"you project is\", \"view project news\"],\n\t\t[\"the project news\", \"view project news\"],\n\t\t[\"super news\", \"show news\"],\n\t\t[\"husbando\", \"close window\"],\n\t\t[\"put vertical\", \"flip vertical\"],\n\t\t[\"6 / 48\", \"flip/rotate\"],\n\t\t[\"flip / rotate\", \"flip/rotate\"],\n\t\t[\"flipper rotate\", \"flip or rotate\"],\n\t\t[\"superiority\", \"flip or rotate\"],\n\t\t[\"flip rotate\", \"flip/rotate\"],\n\t\t[\"website ready\", \"flip/rotate\"],\n\t\t[\"clips ashworth date\", \"flip/rotate\"],\n\t\t[\"set flash rotate\", \"flip/rotate\"],\n\t\t[\"Eclipse X Reddit\", \"flip/rotate\"],\n\t\t[\"secretariat\", \"flip/rotate\"],\n\t\t[\"iprotec\", \"flip/rotate\"],\n\t\t[\"flippin rotate\", \"flip/rotate\"],\n\t\t[\"pretty by angle\", \"rotate by angle\"],\n\t\t[\"birthday by angle\", \"rotate by angle\"],\n\t\t[\"30 triangle\", \"rotate by angle\"],\n\t\t[\"35 angle\", \"rotate by angle\"],\n\t\t[\"rotate triangle\", \"rotate by angle\"],\n\t\t[\"agreeance\", \"degrees\"],\n\t\t[\"flip / protein\", \"flip/rotate\"],\n\t\t[\"stretch / q\", \"stretch/skew\"],\n\t\t[\"stretch/q\", \"stretch/skew\"],\n\t\t[\"stretch / skew\", \"stretch/skew\"],\n\t\t[\"stretch scale\", \"stretch/skew\"],\n\t\t[\"stretch skew\", \"stretch/skew\"],\n\t\t[\"stretcher skew\", \"stretch or skew\"],\n\t\t[\"stretcher q\", \"stretch or skew\"],\n\t\t[\"stretcher scale\", \"stretch or skew\"],\n\t\t[\"structure skill\", \"stretch or skew\"],\n\t\t[\"cat rescue\", \"stretch or skew\"],\n\t\t[\"stretch your skill\", \"stretch or skew\"],\n\t\t[\"stretching scale\", \"stretch and skew\"], // (said like \"stretch 'n' skew\")\n\t\t[\"black doll\", \"select all\"],\n\t\t[\"slept all\", \"select all\"],\n\t\t[\"torres election\", \"delete selection\"],\n\t\t[\"deweese election\", \"delete selection\"],\n\t\t[\"tilly\", \"delete\"],\n\t\t[\"clearxchange\", \"clear image\"],\n\t\t[/^a pink\\b/i, \"opaque\"],\n\t\t[\"opic\", \"opaque\"],\n\t\t[\"the pick\", \"opaque\"],\n\t\t[\"a pick\", \"opaque\"],\n\t\t[\"cupcake\", \"opaque\"],\n\t\t[/^a pic\\b/i, \"opaque\"],\n\t\t[\"hoecake\", \"opaque\"],\n\t\t[\"hope inc\", \"opaque\"],\n\t\t[/^went$/i, \"width\"],\n\t\t[/^with$/i, \"width\"],\n\t\t[\"sasha\", \"session\"],\n\t\t[\"mabel\", \"enable\"],\n\t\t[\"multiuser\", \"multi-user\"],\n\t\t[\"multi user\", \"multi-user\"],\n\t\t[\"horizontal books\", \"horizontal color box\"],\n\t\t[\"talk vertical color box\", \"toggle vertical color box\"],\n\t\t[\"talk horizontal color box\", \"toggle horizontal color box\"],\n\t\t[\"toggle rico color box\", \"toggle vertical color box\"],\n\t\t[\"taco rico color box\", \"toggle vertical color box\"],\n\t\t[\"title horizontal colorbox\", \"toggle horizontal color box\"],\n\t\t[\"entail\", \"undo\"],\n\t\t[\"ngo\", \"undo\"],\n\t\t[\"when do\", \"undo\"],\n\t\t[\"hindu\", \"undo\"],\n\t\t[\"hyundai\", \"undo\"],\n\t\t[\"can do\", \"undo\"],\n\t\t[\"andale\", \"undo\"],\n\t\t[\"n2\", \"undo\"],\n\t\t[\"unto\", \"undo\"],\n\t\t[/^until$/i, \"undo\"],\n\t\t[\"radio\", \"redo\"],\n\t\t[\"poppy\", \"repeat\"],\n\t\t[\"fit within review\", \"fit within view\"],\n\t\t[\"the canvas within view\", \"fit canvas within view\"],\n\t\t[\"take him to sweden with you\", \"fit canvas within view\"],\n\t\t[\"canvas within review\", \"canvas within view\"],\n\t\t[\"heather colors\", \"edit colors\"],\n\t\t[\"headache colors\", \"edit colors\"],\n\t\t[\"hair colors\", \"edit colors\"],\n\t\t[\"nude palette\", \"load palette\"],\n\t\t[\"sol palette\", \"load palette\"],\n\t\t[\"load pallet\", \"load palette\"],\n\t\t[\"blood palette\", \"load palette\"],\n\t\t[\"appellate\", \"load palette\"],\n\t\t[\"play palette\", \"load palette\"],\n\t\t[\"colorbox\", \"color box\"],\n\t\t[\"colorboxx\", \"color box\"],\n\t\t[\"playbox\", \"color box\"],\n\t\t[\"coin box\", \"color box\"],\n\t\t[\"carmax\", \"color box\"],\n\t\t[\"climax\", \"color box\"],\n\t\t[\"colored rocks\", \"color box\"],\n\t\t[\"tell me about\", \"color box\"],\n\t\t[\"toy box\", \"color box\"], // weirdly not for tool box; this is for color box\n\t\t[\"coolbox\", \"tool box\"],\n\t\t[\"toolbox\", \"tool box\"],\n\t\t[\"chocolate toolbox\", \"toggle tool box\"],\n\t\t[\"talking toolbox\", \"toggle tool box\"],\n\t\t[\"tonka tool box\", \"toggle tool box\"],\n\t\t[\"scarred\", \"discard\"],\n\t\t[\"the wine with\", \"set line width\"],\n\t\t[\"wine with\", \"line width\"], // after \"the wine with\"\n\t\t[\"line with\", \"line width\"],\n\t\t[\"mine with\", \"line width\"],\n\t\t[\"man with\", \"line width\"],\n\t\t[\"thing with\", \"line width\"],\n\t\t[\"man width\", \"line width\"],\n\t\t[\"thing width\", \"line width\"],\n\t\t[\"line lips\", \"line width\"],\n\t\t[\"pics alignment\", \"pixel line width\"],\n\t\t[\"single-pixel\", \"single pixel\"],\n\t\t[\"pixel with\", \"pixel width\"],\n\t\t[\"hypixel's\", \"5 pixels\"],\n\t\t[\"tawana\", \"to 1\"],\n\t\t[\"set my next\", \"set line width to\"],\n\t\t[\"set language to\", \"set line width to\"],\n\t\t[\"sunline with\", \"set line width to\"],\n\t\t[\"pinewood's\", \"set line width to\"],\n\t\t[\"set line with two\", \"set line width to\"],\n\t\t[\"set line width two\", \"set line width to\"],\n\t\t[\"with the tattoo\", \"width to 2\"],\n\t\t[\"with tattoo\", \"width to 2\"],\n\t\t[\"width the tattoo\", \"width to 2\"],\n\t\t[\"width tattoo\", \"width to 2\"],\n\t\t[\"with tutu\", \"width to 2\"],\n\t\t[\"width tutu\", \"width to 2\"],\n\t\t[/width to$/i, \"width 2\"],\n\t\t[/size to$/i, \"size 2\"],\n\t\t[/thickness to$/i, \"thickness 2\"],\n\t\t[/width to pixels$/i, \"width 2 pixels\"],\n\t\t[/size to pixels$/i, \"size 2 pixels\"],\n\t\t[/thickness to pixels$/i, \"thickness 2 pixels\"],\n\t\t[\"he's fine with\", \"use line width\"],\n\t\t[\"you slime with\", \"use line width\"],\n\t\t[\"use lime with\", \"use line width\"],\n\t\t[\"line width v\", \"line width 5\"],\n\t\t[\"quick save\", \"click save\"],\n\t\t[/^safe$/i, \"save\"],\n\t\t[/^quince$/i, \"close\"],\n\t\t[/^text mint\\b/i, \"exit\"],\n\n\t\t// addressing actions by menu they're in\n\t\t[\"dial neal\", \"file new\"],\n\t\t[\"dial now\", \"file new\"],\n\t\t[\"kyle neal\", \"file new\"],\n\t\t[\"bio on them\", \"file new\"],\n\t\t[\"eye on them\", \"file new\"],\n\t\t[\"found them\", \"file new\"],\n\t\t[\"kyle new\", \"file new\"],\n\t\t[\"kyle knew\", \"file new\"],\n\t\t[\"kyle now\", \"file new\"],\n\t\t[\"file nail\", \"file new\"],\n\t\t[\"kyle net\", \"file new\"],\n\t\t[\"file net\", \"file new\"],\n\t\t[\"final nail\", \"file new\"],\n\t\t[\"fileopen\", \"file open\"],\n\t\t[\"well safe\", \"file save\"],\n\t\t[\"fail-safe\", \"file save\"],\n\t\t[\"i'll save\", \"file save\"],\n\t\t[\"a done deal\", \"edit undo\"],\n\t\t[\"how to undo\", \"edit undo\"],\n\t\t[\"edit undertale\", \"edit undo\"],\n\n\t\t// navigating menus\n\t\t[\"wyoming\", \"file menu\"],\n\t\t[\"piyo menu\", \"file menu\"],\n\t\t[\"bayou menu\", \"file menu\"],\n\t\t[\"io menu\", \"file menu\"],\n\t\t[\"rio menu\", \"file menu\"],\n\t\t[\"q menu\", \"view menu\"],\n\t\t[\"at at\", \"edit\"],\n\t\t[\"peppa\", \"edit\"],\n\t\t[\"how to\", \"edit\"],\n\t\t[\"add a\", \"edit\"],\n\t\t[\"had a\", \"edit\"],\n\t\t[\"resume sub menu\", \"show zoom submenu\"],\n\t\t[\"kelly's menu\", \"colors menu\"],\n\t\t[\"auggies menu\", \"colors menu\"],\n\t\t[\"cowboys menu\", \"colors menu\"],\n\t\t[\"cowboy's menu\", \"colors menu\"],\n\t\t[\"kelly menu\", \"colors menu\"],\n\t\t[\"color menu\", \"colors menu\"],\n\t\t[\"king's menu\", \"themes menu\"],\n\t\t[\"tim's menu\", \"themes menu\"],\n\t\t[\"dean's menu\", \"themes menu\"],\n\t\t[\"things menu\", \"themes menu\"],\n\t\t[\"pennsylvania\", \"themes menu\"],\n\t\t[\"teamz menu\", \"themes menu\"],\n\t\t[\"teams menu\", \"themes menu\"],\n\t\t[\"goldstein's menu\", \"close themes menu\"],\n\t\t[\"christine's menu\", \"close themes menu\"],\n\t\t[\"express menu\", \"extras menu\"],\n\t\t[\"next wrestlemania\", \"extras menu\"],\n\t\t[\"to help i know\", \"show help menu\"],\n\t\t[\"chow menu\", \"show help menu\"],\n\t\t[\"show help bunion\", \"show help menu\"],\n\t\t[\"show how many mm\", \"show help menu\"],\n\t\t[\"how many mm\", \"help menu\"],\n\t\t[\"help many mm\", \"help menu\"],\n\t\t[\"help many\", \"help menu\"],\n\t\t[\"helping you\", \"help menu\"],\n\t\t[\"kuzmania\", \"close menu\"],\n\t\t[\"close minded\", \"close menu\"],\n\t\t[\"connecticare\", \"get out of here\"],\n\t\t[\"pho extras menu\", \"show extras menu\"],\n\t\t[\"show me access menu\", \"show the extras menu\"],\n\t\t[/^express$/i, \"extras\"],\n\t\t[\"kyle\", \"file\"],\n\t\t[\"heil\", \"file\"],\n\t\t[/^final$/i, \"file\"],\n\t\t[\"q\", \"view\"],\n\t\t[\"you do you\", \"view\"],\n\t\t[\"deal\", \"view\"],\n\n\t\t// dictation\n\t\t[\"hey live\", \"new line\"],\n\t\t[\"halite\", \"new line\"],\n\n\t\t// panning/scrolling the view\n\t\t[/scrolling/i, \"scroll\"],\n\t\t[\"pin the view\", \"pan the view\"],\n\t\t[\"pen the view\", \"pan the view\"],\n\t\t[\"penn the view\", \"pan the view\"],\n\t\t[\"interview\", \"pan the view\"],\n\t\t[\"family view\", \"pan the view\"],\n\t\t[\"pen masala\", \"pan the view to the south\"],\n\t\t[\"penn masala\", \"pan the view to the south\"],\n\t\t[\"it's called a few\", \"scroll the view\"],\n\t\t[\"call the view\", \"scroll the view\"],\n\t\t[\"south rim\", \"southward\"],\n\t\t[\"scrollview\", \"scroll view\"],\n\t\t[\"call north\", \"scroll north\"],\n\t\t[\"crawl north\", \"scroll north\"],\n\t\t[\"crawl northward\", \"scroll northward\"],\n\t\t[\"call down\", \"scroll down\"],\n\t\t[\"skull rain\", \"scroll right\"],\n\t\t[\"scroll rack\", \"scroll right\"],\n\t\t[\"skull right\", \"scroll right\"],\n\t\t[\"you're right\", \"scroll right\"],\n\t\t[\"charlotte\", \"scroll left\"],\n\t\t[\"scroll app\", \"scroll up\"],\n\t\t[\"scrap\", \"scroll up\"],\n\t\t[\"go out\", \"scroll up\"],\n\t\t[\"scroll up in\", \"scroll up and\"],\n\t\t[\"what happened to the\", \"scroll up and to the\"],\n\t\t[\"and not words\", \"and upwards\"],\n\t\t[\"in operates\", \"and upwards\"],\n\t\t[\"down work\", \"downward\"],\n\t\t[\"down works\", \"downwards\"],\n\t\t[\"up rinse and spit\", \"upwards and to the right\"],\n\t\t[\"down at the right\", \"down and to the right\"],\n\t\t[\"down at the left\", \"down and to the left\"],\n\t\t[\"carpenter ant\", \"go up and to the right\"],\n\t\t[\"walking to the right\", \"go up and to the right\"],\n\t\t[/^show up/i, \"go up\"],\n\t\t[/^cool up/i, \"go up\"],\n\t\t[\"scroll acting up\", \"scroll left and up\"],\n\t\t[\"scroll left enough\", \"scroll left and up\"],\n\t\t[\"scroll right enough\", \"scroll right and up\"],\n\t\t[\"scroll writing up\", \"scroll right and up\"],\n\t\t[\"scroll written up\", \"scroll right and up\"],\n\t\t[\"scroll left pan downwards\", \"scroll left and downwards\"],\n\t\t[\"scroll right pan downwards\", \"scroll right and downwards\"],\n\t\t[\"scroll left pan downward\", \"scroll left and downward\"],\n\t\t[\"scroll right pan downward\", \"scroll right and downward\"],\n\t\t[\"scroll left pan upwards\", \"scroll left and upwards\"],\n\t\t[\"scroll right pan upwards\", \"scroll right and upwards\"],\n\t\t[\"scroll left pan upward\", \"scroll left and upward\"],\n\t\t[\"scroll right pan upward\", \"scroll right and upward\"],\n\t\t[\"scroll left pan down\", \"scroll left and down\"],\n\t\t[\"scroll right pan down\", \"scroll right and down\"],\n\t\t[\"scroll left pan up\", \"scroll left and up\"],\n\t\t[\"scroll right pan up\", \"scroll right and up\"],\n\t\t[\"and to go\", \"and to the\"],\n\t\t[\"into the\", \"and to the\"],\n\t\t[\"pen view\", \"pan view\"],\n\t\t[\"penn view\", \"pan view\"],\n\t\t[\"pam view\", \"pan view\"],\n\t\t[/^turn right$/i, \"pan right\"],\n\t\t[\"penn wright\", \"pan right\"],\n\t\t[\"pen wright\", \"pan right\"],\n\t\t[\"pam wright\", \"pan right\"],\n\t\t[\"penn right\", \"pan right\"],\n\t\t[\"pen right\", \"pan right\"],\n\t\t[\"pam right\", \"pan right\"],\n\t\t[\"penn left\", \"pan left\"],\n\t\t[\"pen left\", \"pan left\"],\n\t\t[\"pam left\", \"pan left\"],\n\t\t[\"penn up\", \"pan up\"],\n\t\t[\"pen up\", \"pan up\"],\n\t\t[\"pam up\", \"pan up\"],\n\t\t[\"penn down\", \"pan down\"],\n\t\t[\"pen down\", \"pan down\"],\n\t\t[\"pam down\", \"pan down\"],\n\t\t[\"penn upwards\", \"pan upwards\"],\n\t\t[\"pen upwards\", \"pan upwards\"],\n\t\t[\"pam upwards\", \"pan upwards\"],\n\t\t[\"penn downwards\", \"pan downwards\"],\n\t\t[\"pen downwards\", \"pan downwards\"],\n\t\t[\"pam downwards\", \"pan downwards\"],\n\t\t[\"penn upward\", \"pan upward\"],\n\t\t[\"pen upward\", \"pan upward\"],\n\t\t[\"pam upward\", \"pan upward\"],\n\t\t[\"penn downward\", \"pan downward\"],\n\t\t[\"pen downward\", \"pan downward\"],\n\t\t[\"pam downward\", \"pan downward\"],\n\t\t[\"penn north\", \"pan north\"],\n\t\t[\"pen north\", \"pan north\"],\n\t\t[\"pam north\", \"pan north\"],\n\t\t[\"penn south\", \"pan south\"],\n\t\t[\"pen south\", \"pan south\"],\n\t\t[\"pam south\", \"pan south\"],\n\t\t[\"penn east\", \"pan east\"],\n\t\t[\"pen east\", \"pan east\"],\n\t\t[\"pam east\", \"pan east\"],\n\t\t[\"penn west\", \"pan west\"],\n\t\t[\"pen west\", \"pan west\"],\n\t\t[\"pam west\", \"pan west\"],\n\t\t[\"penn northward\", \"pan northward\"],\n\t\t[\"pen northward\", \"pan northward\"],\n\t\t[\"pam northward\", \"pan northward\"],\n\t\t[\"penn southward\", \"pan southward\"],\n\t\t[\"pen southward\", \"pan southward\"],\n\t\t[\"pam southward\", \"pan southward\"],\n\t\t[\"penn eastward\", \"pan eastward\"],\n\t\t[\"pen eastward\", \"pan eastward\"],\n\t\t[\"pam eastward\", \"pan eastward\"],\n\t\t[\"penn westward\", \"pan westward\"],\n\t\t[\"pen westward\", \"pan westward\"],\n\t\t[\"pam westward\", \"pan westward\"],\n\t\t[\"penn northwest\", \"pan northwest\"],\n\t\t[\"pen northwest\", \"pan northwest\"],\n\t\t[\"pam northwest\", \"pan northwest\"],\n\t\t[\"penn northeast\", \"pan northeast\"],\n\t\t[\"pen northeast\", \"pan northeast\"],\n\t\t[\"pam northeast\", \"pan northeast\"],\n\t\t[\"penn southwest\", \"pan southwest\"],\n\t\t[\"pen southwest\", \"pan southwest\"],\n\t\t[\"pam southwest\", \"pan southwest\"],\n\t\t[\"penn southeast\", \"pan southeast\"],\n\t\t[\"pen southeast\", \"pan southeast\"],\n\t\t[\"pam southeast\", \"pan southeast\"],\n\t\t[\"tannerite\", \"pan right\"],\n\t\t[\"penray\", \"pan right\"],\n\t\t[\"pain left\", \"pan left\"],\n\t\t[\"pinup\", \"pan up\"],\n\t\t[\"pin-up\", \"pan up\"],\n\t\t[\"panna\", \"pan up\"],\n\t\t[\"pinned down\", \"pan down\"],\n\t\t[\"pin down\", \"pan down\"],\n\t\t[\"and down words\", \"pan downwards\"],\n\t\t[\"and downwards\", \"pan downwards\"],\n\t\t[\"pin-up words\", \"pan upwards\"],\n\t\t[\"pin-up word\", \"pan upward\"],\n\t\t[\"pinup words\", \"pan upwards\"],\n\t\t[\"pinup word\", \"pan upward\"],\n\t\t[\"pager\", \"page up\"],\n\t\t[\"page app\", \"page up\"],\n\t\t[\"paint job\", \"page up\"],\n\t\t[\"peach town\", \"page down\"],\n\t\t[\"h-town\", \"page down\"],\n\t\t[\"go up fat page\", \"go up by a page\"],\n\t\t[\"backpage\", \"by a page\"],\n\t\t[\"by a pitch\", \"by a page\"],\n\t\t[\"turn down\", \"go down\"],\n\t\t[\"newtown\", \"go down\"],\n\t\t[/^co-op\\b/i, \"go up\"],\n\t\t[\"come up\", \"go up\"],\n\t\t// [\"correct\", \"go right\"], // can be from \"go left\" or \"go right\"; which one is correct is up in the air so I'm not down with that\n\t\t[/^direct\\b/i, \"go right\"],\n\t\t[/^collect\\b/i, \"go left\"],\n\t\t[/^the left\\b/i, \"go left\"],\n\t\t[\"cooperates\", \"go upwards\"],\n\t\t[\"cooperated\", \"go upwards\"],\n\t\t[\"cooperate\", \"go upward\"], // can also be from \"go up right\"\n\t\t[\"cooperating\", \"go upward\"],\n\t\t[\"cooperative\", \"go upward\"],\n\t\t[\"corporate\", \"go upward\"],\n\t\t[\"go leopard\", \"go upward\"],\n\t\t[\"leopard\", \"go upward\"],\n\t\t[\"clifford\", \"go upward\"],\n\t\t[\"go upgrade\", \"go upwards\"],\n\t\t// [\"prince\", \"go upwards\"],\n\t\t// [\"electrics\", \"go upwards\"],\n\t\t// [\"dog breeds\", \"go upwards\"],\n\t\t// [\"heloc rates\", \"go upwards\"],\n\t\t[\"free download\", \"go downward\"],\n\t\t[\"to download\", \"go downward\"],\n\t\t[\"go download\", \"go downward\"],\n\t\t[\"go down orange\", \"go downward\"],\n\t\t[\"godown road\", \"go downward\"],\n\t\t[\"go down road\", \"go downward\"],\n\t\t[\"fordham road\", \"go downward\"],\n\t\t[\"donuts\", \"go downwards\"],\n\t\t[/^got left\\b/i, \"go up left\"],\n\t\t[/^talk left\\b/i, \"go up left\"],\n\t\t[\"the great\", \"look right\"],\n\t\t[\"the craig\", \"look right\"],\n\t\t[\"mccreight\", \"look right\"],\n\t\t[\"lock right\", \"look right\"],\n\t\t[\"lecrae\", \"look right\"],\n\t\t[\"the cleft\", \"look left\"],\n\t\t[\"the craft\", \"look left\"],\n\t\t[\"shut down\", \"look down\"],\n\t\t[\"what town\", \"look down\"],\n\t\t[\"what's down\", \"look down\"],\n\t\t[\"bucktown\", \"look down\"],\n\t\t[\"lockdown\", \"look down\"],\n\t\t[\"circumference\", \"look upwards\"],\n\t\t[\"look up weights\", \"look upwards\"],\n\t\t[\"look up words\", \"look upwards\"],\n\t\t[\"if you up\", \"view up\"],\n\t\t[\"you up\", \"view up\"],\n\t\t[\"review town\", \"view down\"],\n\t\t[\"few down\", \"view down\"],\n\t\t[\"view downloads\", \"view downwards\"],\n\t\t[\"view download\", \"view downward\"],\n\t\t[\"music download\", \"view downward\"],\n\t\t[\"music downloads\", \"view downwards\"],\n\t\t[\"are you down lyrics\", \"view downwards\"],\n\t\t[\"you down lyrics\", \"view downwards\"],\n\t\t[\"few downwards\", \"view downwards\"],\n\t\t[\"you are prince\", \"view upwards\"],\n\t\t[\"do upgrades\", \"view upwards\"],\n\t\t[\"and you are friends\", \"view upwards\"],\n\t\t[\"do you right\", \"view right\"],\n\t\t[\"you right\", \"view right\"],\n\t\t[\"pure right\", \"view right\"],\n\t\t[\"do you left\", \"view left\"],\n\t\t[\"you left\", \"view left\"],\n\t\t[\"he left\", \"view left\"],\n\n\t\t// zooming\n\t\t[\"normal-size\", \"normal size\"],\n\t\t[\"large-size\", \"large size\"],\n\t\t[\"barb size\", \"large size\"],\n\t\t[\"versailles\", \"large size\"],\n\t\t[\"launch sites\", \"large size\"],\n\t\t[\"large sides\", \"large size\"],\n\t\t[\"tire size\", \"large size\"],\n\t\t[\"live science\", \"large size\"],\n\t\t[\"name two large size\", \"zoom to large size\"],\n\t\t[\"dim to large size\", \"zoom to large size\"],\n\t\t[\"name two normal size\", \"zoom to normal size\"],\n\t\t[\"dim to normal size\", \"zoom to normal size\"],\n\t\t[\"custom zoo\", \"custom zoom\"],\n\t\t[/^soon/i, \"zoom\"],\n\t\t[\"zoomin\", \"zoom in\"],\n\t\t[/^newman$/i, \"zoom in\"],\n\t\t[\"resume to\", \"zoom to\"],\n\t\t[\"zoom too\", \"zoom to\"],\n\t\t[\"zoom two\", \"zoom to\"],\n\t\t[\"zoom 2\", \"zoom to\"],\n\t\t[\"seem to\", \"zoom to\"],\n\t\t[\"seem 2\", \"zoom to\"],\n\t\t[\"same to\", \"zoom to\"],\n\t\t[\"sin 2\", \"zoom to\"],\n\t\t[\"zoomed to\", \"zoom to\"],\n\t\t[\"zoomed\", \"zoom to\"],\n\t\t[\"volume to\", \"zoom to\"],\n\t\t[\"tune to\", \"zoom to\"],\n\t\t[\"02\", \"zoom to\"],\n\t\t[\"forex\", \"4x\"],\n\t\t[\"borax\", \"4x\"],\n\t\t[\"sex acts\", \"6x\"],\n\t\t[\"seem to 1x\", \"zoom to 1x\"],\n\t\t[\"zoom g1x\", \"zoom to 1x\"],\n\t\t[\"jim to 1x\", \"zoom to 1x\"],\n\t\t[\"nims 1x\", \"zoom to 1x\"],\n\t\t[\"zoom 2 2x\", \"zoom to 2x\"],\n\t\t[\"sims 2 x\", \"zoom to 2x\"],\n\t\t[\"cmt 2x\", \"zoom to 2x\"],\n\t\t[\"is m22 x\", \"zoom to 2x\"],\n\t\t[\"m22 x\", \"zoom to 2x\"],\n\t\t[\"mtx\", \"zoom to 2x\"],\n\t\t[\"zoom tattoo x\", \"zoom to 2x\"],\n\t\t[\"name 2x\", \"zoom to 2x\"],\n\t\t[\"m24 x\", \"zoom to 4x\"],\n\t\t[\"frx\", \"zoom to 4x\"],\n\t\t[\"seemed forex\", \"zoom to 4x\"],\n\t\t[\"jim to forex\", \"zoom to 4x\"],\n\t\t[\"jim to 4x\", \"zoom to 4x\"],\n\t\t[\"sims 4 x\", \"zoom to 4x\"],\n\t\t[\"m25 x\", \"zoom to 5x\"],\n\t\t[\"zoom to headaches\", \"zoom to 8x\"],\n\t\t[\"museum t-rex\", \"zoom to 8x\"],\n\t\t[\"zoom t-rex\", \"zoom to 8x\"],\n\t\t[\"zoom tx\", \"zoom to 8x\"],\n\t\t[\"znzx\", \"zoom to 8x\"],\n\t\t[\"zoom to a tax\", \"zoom to 8x\"],\n\t\t[\"zoom derek's\", \"zoom to 8x\"],\n\t\t[\"zoom lyrics\", \"zoom to 8x\"],\n\t\t[\"same to you lyrics\", \"zoom to 8x\"],\n\t\t[\"zoom to you lyrics\", \"zoom to 8x\"],\n\t\t[\"same day tax\", \"zoom to 8x\"],\n\t\t[\"zoom kdx\", \"zoom to 8x\"],\n\t\t[\"resume 210ex\", \"zoom to 10x\"],\n\t\t[\"zoom 210ex\", \"zoom to 10x\"],\n\t\t[\"zoom 210x\", \"zoom to 10x\"],\n\t\t[\"sim21 axe\", \"zoom to 1x\"],\n\t\t[\"sim21 ax\", \"zoom to 1x\"],\n\t\t[\"sim21 x\", \"zoom to 1x\"],\n\t\t[\"sim22 axe\", \"zoom to 2x\"],\n\t\t[\"sim22 ax\", \"zoom to 2x\"],\n\t\t[\"sim22 x\", \"zoom to 2x\"],\n\t\t[\"sim23 axe\", \"zoom to 3x\"],\n\t\t[\"sim23 ax\", \"zoom to 3x\"],\n\t\t[\"sim23 x\", \"zoom to 3x\"],\n\t\t[\"sim24 axe\", \"zoom to 4x\"],\n\t\t[\"sim24 ax\", \"zoom to 4x\"],\n\t\t[\"sim24 x\", \"zoom to 4x\"],\n\t\t[\"sim25 axe\", \"zoom to 5x\"],\n\t\t[\"sim25 ax\", \"zoom to 5x\"],\n\t\t[\"sim25 x\", \"zoom to 5x\"],\n\t\t[\"sim26 axe\", \"zoom to 6x\"],\n\t\t[\"sim26 ax\", \"zoom to 6x\"],\n\t\t[\"sim26 x\", \"zoom to 6x\"],\n\t\t[\"sim27 axe\", \"zoom to 7x\"],\n\t\t[\"sim27 ax\", \"zoom to 7x\"],\n\t\t[\"sim27 x\", \"zoom to 7x\"],\n\t\t[\"sim28 axe\", \"zoom to 8x\"],\n\t\t[\"sim28 ax\", \"zoom to 8x\"],\n\t\t[\"sim28 x\", \"zoom to 8x\"],\n\t\t[\"sim29 axe\", \"zoom to 9x\"],\n\t\t[\"sim29 ax\", \"zoom to 9x\"],\n\t\t[\"sim29 x\", \"zoom to 9x\"],\n\t\t[\"name the three acts\", \"zoom to 3x\"],\n\t\t[\"name the four acts\", \"zoom to 4x\"],\n\t\t[\"name the five acts\", \"zoom to 5x\"],\n\t\t[\"name the six acts\", \"zoom to 6x\"],\n\t\t[\"71x\", \"zoom to 1x\"],\n\t\t[\"72x\", \"zoom to 2x\"],\n\t\t[\"73x\", \"zoom to 3x\"],\n\t\t[\"74x\", \"zoom to 4x\"],\n\t\t[\"75x\", \"zoom to 5x\"],\n\t\t[\"76x\", \"zoom to 6x\"],\n\t\t[\"77x\", \"zoom to 7x\"],\n\t\t[\"78x\", \"zoom to 8x\"],\n\t\t[\"79x\", \"zoom to 9x\"],\n\t\t[\"mp3x\", \"zoom to 3x\"],\n\t\t[\"zoom g3x\", \"zoom to 3x\"],\n\t\t[\"zoo 2000%\", \"zoom to 1000%\"], // \"zoom to-a thousand percent\"\n\t\t[\"zoom to a thousand percent\", \"zoom to 1000%\"],\n\n\t\t// switching themes\n\t\t[\"set game to\", \"set theme to\"],\n\t\t[\"set themed to\", \"set theme to\"],\n\t\t[\"set themed\", \"set theme\"],\n\t\t[/^setting the\\b/i, \"set theme to\"],\n\t\t[/^accepting the\\b/i, \"set theme to\"],\n\t\t[/^something to\\b/i, \"set theme to\"],\n\t\t[\"cooking dark\", \"set theme to dark\"],\n\t\t[\"something with dark\", \"set theme to dark\"],\n\t\t[\"something to white\", \"set theme to light\"],\n\t\t[\"settings light\", \"set theme to light\"],\n\t\t[\"second winter\", \"set theme to winter\"],\n\t\t[\"set theme to mother\", \"set theme to modern\"],\n\t\t[\"modern team\", \"modern theme\"],\n\t\t[\"classic team\", \"classic theme\"],\n\t\t[\"retro team\", \"retro theme\"],\n\t\t[\"default team\", \"default theme\"],\n\t\t[\"normal team\", \"normal theme\"],\n\t\t[\"classic thor\", \"classic theme\"],\n\t\t[\"my 19\", \"modern theme\"],\n\t\t[\"modern tim\", \"modern theme\"],\n\t\t[\"when kissing\", \"winter theme\"],\n\t\t[\"printer stand\", \"winter theme\"],\n\t\t[\"winter thing\", \"winter theme\"],\n\t\t[\"modern thing\", \"modern theme\"],\n\t\t[\"classic thing\", \"classic theme\"],\n\t\t[\"normal sim\", \"normal theme\"],\n\t\t[\"yarmouth inn\", \"normal theme\"],\n\t\t[\"norma theme\", \"normal theme\"],\n\t\t[\"normal thing\", \"normal theme\"],\n\t\t[\"christmas-themed\", \"christmas theme\"],\n\t\t[\"christmas game\", \"christmas theme\"],\n\t\t[\"switch directory theme\", \"switch to retro theme\"],\n\t\t[\"flight mode\", \"light mode\"],\n\t\t[\"light them\", \"light theme\"],\n\t\t[\"bite them\", \"light theme\"],\n\t\t[\"lifeteen\", \"light theme\"],\n\t\t[\"lightning\", \"light theme\"],\n\t\t[\"white theme\", \"light theme\"], // @TODO: if you're already on the Classic theme, should \"white theme\" go to the Modern theme?\n\t\t[\"game mode\", \"day mode\"],\n\t\t[\"a colt\", \"occult\"],\n\t\t[\"a cult\", \"occult\"],\n\t\t[\"colt theme\", \"occult theme\"],\n\t\t[\"cult theme\", \"occult theme\"],\n\t\t[\"occult thing\", \"occult theme\"],\n\t\t[\"colt thing\", \"occult theme\"],\n\t\t[\"cult thing\", \"occult theme\"],\n\t\t[\"six six six\", \"666\"],\n\t\t[\"pantagraph\", \"pentagraph\"],\n\t\t[\"which crafting\", \"witchcraft theme\"],\n\t\t[\"witch crafting\", \"witchcraft theme\"],\n\t\t[\"witchcrafting\", \"witchcraft theme\"],\n\t\t[\"witch-crafting\", \"witchcraft theme\"],\n\t\t[\"penis\", \"themes\"],\n\t\t[\"things\", \"themes\"],\n\t\t[\"teams\", \"themes\"],\n\n\t\t// render gif animation from document history\n\t\t[\"render gift\", \"render gif\"],\n\t\t[\"create gift\", \"create gif\"],\n\t\t[\"make gift\", \"make gif\"],\n\t\t[\"render a gift\", \"render a gif\"],\n\t\t[\"create a gift\", \"create a gif\"],\n\t\t[\"make a gift\", \"make a gif\"],\n\n\t\t// opening help\n\t\t[\"hope topics\", \"help topics\"],\n\t\t[\"health topics\", \"help topics\"],\n\t\t[\"subtopics\", \"help topics\"],\n\t\t[\"top topics\", \"help topics\"],\n\t\t[\"topix\", \"help topics\"],\n\t\t[\"quickhelp\", \"click help\"],\n\t\t[\"healthier\", \"help viewer\"],\n\n\t\t// help window\n\t\t[\"webhelp\", \"web help\"],\n\t\t[\"medhelp\", \"web help\"],\n\t\t[\"four words\", \"forwards\"],\n\t\t[\"forbearance\", \"forwards\"],\n\t\t[\"pack\", \"back\"],\n\t\t[\"hindsight bar\", \"hide sidebar\"],\n\t\t[\"high tide bar\", \"hide sidebar\"],\n\t\t[\"glenside bar\", \"hide sidebar\"],\n\t\t// help topic names\n\t\t[\"trirectangular square\", \"draw a rectangle or square\"],\n\t\t[\"draw rectangular square\", \"draw a rectangle or square\"],\n\t\t[\"draw a rectangular square\", \"draw a rectangle or square\"],\n\t\t[\"rectangular square\", \"draw a rectangle or square\"],\n\t\t[\"welcome the help\", \"welcome to help\"],\n\t\t[\"tri polygon\", \"draw a polygon\"],\n\t\t[\"chop polygon\", \"draw a polygon\"],\n\t\t[\"java polygon\", \"draw a polygon\"],\n\t\t[\"trop polygon\", \"draw a polygon\"],\n\t\t[\"drawpolygon\", \"draw a polygon\"],\n\t\t[\"print text in pictures\", \"putting text in pictures\"],\n\t\t[\"print texts and pictures\", \"putting text in pictures\"],\n\t\t[\"print texts in pictures\", \"putting text in pictures\"],\n\t\t[\"print text and pictures\", \"putting text in pictures\"],\n\t\t[\"bring text to pictures\", \"putting text in pictures\"],\n\t\t[\"an area with color\", \"fill an area with color\"],\n\t\t[\"culinaria was color\", \"fill an area with color\"],\n\t\t[\"tell an area with color\", \"fill an area with color\"],\n\t\t[\"typing format text\", \"type and format text\"],\n\t\t[\"risa small area\", \"erase a small area\"],\n\t\t[\"risa large area\", \"erase a large area\"],\n\t\t[\"harissa large area\", \"erase a large area\"],\n\t\t[\"harissa small area\", \"erase a small area\"],\n\t\t[\"erasing entire image\", \"erase an entire image\"],\n\t\t[\"erase entire image\", \"erase an entire image\"],\n\t\t[\"erase the entire image\", \"erase an entire image\"],\n\t\t[\"Maurice's small area\", \"erase a small area\"],\n\t\t[\"Theresa small area\", \"erase a small area\"],\n\t\t[\"threesome entire image\", \"erase an entire image\"],\n\t\t[\"select part of the picture\", \"select part of a picture\"],\n\t\t[\"slick part of the picture\", \"select part of a picture\"],\n\t\t[\"slick part of a picture\", \"select part of a picture\"],\n\t\t[\"stopped part of the picture\", \"select part of a picture\"],\n\t\t[\"stopped part of a picture\", \"select part of a picture\"],\n\t\t[\"flex part of the picture\", \"select part of a picture\"],\n\t\t[\"flex part of a picture\", \"select part of a picture\"],\n\t\t[\"search part of the picture\", \"select part of a picture\"],\n\t\t[\"search part of a picture\", \"select part of a picture\"],\n\t\t[\"change how the picture looks on the screen\", \"changing how your picture looks on the screen\"],\n\t\t[\"changing how the picture looks on the screen\", \"change the size of your picture\"],\n\t\t[\"changing the size of your picture\", \"change the size of your picture\"],\n\t\t[\"changing the size of the picture\", \"change the size of your picture\"],\n\t\t[\"change the size of the picture\", \"change the size of your picture\"],\n\t\t[\"display grid lines\", \"display gridlines\"],\n\t\t[\"working with pride as a picture\", \"working with part of the picture\"],\n\t\t[\"change the size of a picture\", \"change the size of your picture\"],\n\t\t[\"clipper rotate a picture\", \"flip or rotate a picture\"],\n\t\t[\"set for rotated picture\", \"flip or rotate a picture\"],\n\t\t[\"set for rotate a picture\", \"flip or rotate a picture\"],\n\t\t[\"flip or rotator picture\", \"flip or rotate a picture\"],\n\t\t[\"clipper rotate picture\", \"flip or rotate a picture\"],\n\t\t[\"clipper rotate the picture\", \"flip or rotate a picture\"],\n\t\t[\"flipper rotate a picture\", \"flip or rotate a picture\"],\n\t\t[\"separatism picture\", \"flip or rotate a picture\"],\n\t\t[\"set for rotated the picture\", \"flip or rotate a picture\"],\n\t\t[\"set for rotate the picture\", \"flip or rotate a picture\"],\n\t\t[\"display the toolbox\", \"display the tool box\"],\n\t\t[\"stretcher skewen item\", \"stretch or skew an item\"],\n\t\t[\"stretch rescue and item\", \"stretch or skew an item\"],\n\t\t[\"stretcher sku and item\", \"stretch or skew an item\"],\n\t\t[\"compete with other programs\", \"using paint with other programs\"],\n\t\t[\"turn lights and shapes\", \"drawing lines and shapes\"],\n\n\t\t// Eye Gaze Mode\n\t\t[\"i gaze\", \"eye gaze\"],\n\t\t[\"auggies\", \"eye gaze\"],\n\t\t[\"eye-gaze\", \"eye gaze\"],\n\t\t[\"igas\", \"eye gaze\"],\n\t\t[\"a gizmodo\", \"eye gaze mode\"],\n\t\t[\"a gizmo\", \"eye gaze mode\"],\n\t\t[\"august moon\", \"eye gaze mode\"],\n\t\t[\"ik's mode\", \"eye gaze mode\"],\n\t\t[\"mycase mode\", \"eye gaze mode\"],\n\t\t[\"craigslist mode\", \"eye gaze mode\"],\n\t\t[\"vegas mode\", \"eye gaze mode\"],\n\t\t[\"i guess mode\", \"eye gaze mode\"],\n\t\t[\"ideas mode\", \"eye gaze mode\"],\n\t\t[\"agee's mode\", \"eye gaze mode\"],\n\t\t[\"aggie's mode\", \"eye gaze mode\"],\n\t\t[\"iggy's mode\", \"eye gaze mode\"],\n\t\t[\"iggie's mode\", \"eye gaze mode\"],\n\t\t[\"angus mode\", \"eye gaze mode\"],\n\t\t[\"ids mode\", \"eye gaze mode\"],\n\t\t[\"ie kiosk mode\", \"eye gaze mode\"],\n\t\t[\"audit mode\", \"eye gaze mode\"],\n\t\t[\"agnes mode\", \"eye gaze mode\"],\n\t\t[\"add case mode\", \"eye gaze mode\"],\n\t\t[\"galactus mode\", \"toggle eye gaze mode\"],\n\t\t[\"tyga ligase mode\", \"toggle eye gaze mode\"],\n\t\t[\"puggle auggies mode\", \"toggle eye gaze mode\"],\n\t\t[\"tug ligase mode\", \"toggle eye gaze mode\"],\n\t\t[\"tonka ligase mode\", \"toggle eye gaze mode\"],\n\t\t[\"taco eye gaze mode\", \"toggle eye gaze mode\"],\n\t\t[\"tugela geese mode\", \"toggle eye gaze mode\"],\n\t\t[\"alkali gaze mode\", \"toggle eye gaze mode\"],\n\t\t[\"interrogative mood\", \"enter eye gaze mode\"],\n\t\t[\"enteritis mode\", \"enter eye gaze mode\"],\n\t\t[\"maplelag it's mode\", \"enable eye gaze mode\"],\n\t\t[\"maplelag is mode\", \"enable eye gaze mode\"],\n\t\t[\"maplelag a spoon\", \"enable eye gaze mode\"],\n\t\t[\"sableye gizmo\", \"enable eye gaze mode\"],\n\t\t[\"play bar-kays\", \"enable eye gaze mode\"],\n\t\t[\"maple eye gaze mode\", \"enable eye gaze mode\"],\n\t\t[\"maple ikea smell\", \"enable eye gaze mode\"],\n\t\t[\"nearby gas pain\", \"enable eye gaze mode\"],\n\t\t[\"sableye gizmodo\", \"disable eye gaze mode\"],\n\t\t[\"sableye case mode\", \"disable eye gaze mode\"],\n\t\t[\"sableye games mode\", \"disable eye gaze mode\"],\n\t\t[\"sableye gaze mode\", \"disable eye gaze mode\"],\n\t\t[\"samurai games\", \"disable eye gaze mode\"],\n\t\t[\"and eye gaze mode\", \"end eye gaze mode\"],\n\t\t[\"disable guest mode\", \"disable eye gaze mode\"],\n\t\t[\"turn off my gizmo\", \"turn off eye gaze mode\"],\n\t\t[\"turn off my guest mode\", \"turn off eye gaze mode\"],\n\n\t\t// Eye Gaze Mode: Pause/Resume Dwell Clicking\n\t\t[\"tangled dwell clicking\", \"toggle dwell clicking\"],\n\t\t[\"michael dwelle clicking\", \"toggle dwell clicking\"],\n\t\t[\"toggled dwell clicking\", \"toggle dwell clicking\"],\n\t\t[\"call goldwell clicking\", \"toggle dwell clicking\"],\n\t\t[\"toggled well clicking\", \"toggle dwell clicking\"],\n\t\t[\"toggled dwele clicking\", \"toggle dwell clicking\"],\n\t\t[\"toggled dwelle clicking\", \"toggle dwell clicking\"],\n\t\t[\"toggled while cooking\", \"toggle dwell clicking\"],\n\t\t[\"toggled wildflecken\", \"toggle dwell clicking\"],\n\t\t[\"puggle dwell clicking\", \"toggle dwell clicking\"],\n\t\t[\"tangled while clicking\", \"toggle dwell clicking\"],\n\t\t[\"taco bell cooking\", \"toggle dwell clicking\"],\n\t\t[\"a goldwell clicking\", \"toggle dwell clicking\"],\n\t\t[\"toggled while clicking\", \"toggle dwell clicking\"],\n\t\t[\"toggle do i click in\", \"toggle dwell clicking\"],\n\t\t[\"tangled while cooking\", \"toggle dwell clicking\"],\n\t\t[\"tacos while cutting\", \"toggle dwell clicking\"],\n\t\t[\"call coldwell clicking\", \"toggle dwell clicking\"],\n\t\t[\"taco bell clicking\", \"toggle dwell clicking\"],\n\t\t[\"tangled dwell clicks\", \"toggle dwell clicks\"],\n\t\t[\"michael dwelle clicks\", \"toggle dwell clicks\"],\n\t\t[\"toggled dwell clicks\", \"toggle dwell clicks\"],\n\t\t[\"call goldwell clicks\", \"toggle dwell clicks\"],\n\t\t[\"toggled well clicks\", \"toggle dwell clicks\"],\n\t\t[\"toggled dwele clicks\", \"toggle dwell clicks\"],\n\t\t[\"toggled dwelle clicks\", \"toggle dwell clicks\"],\n\t\t[\"toggle do i clicks\", \"toggle dwell clicks\"],\n\t\t[\"puggle dwell clicks\", \"toggle dwell clicks\"],\n\t\t[\"tangled while clicks\", \"toggle dwell clicks\"],\n\t\t[\"a goldwell clicks\", \"toggle dwell clicks\"],\n\t\t[\"toggled while clicks\", \"toggle dwell clicks\"],\n\t\t[\"call coldwell clicks\", \"toggle dwell clicks\"],\n\t\t[\"talk about cliques\", \"toggle dwell clicks\"],\n\t\t[\"target wall clocks\", \"toggle dwell clicks\"],\n\t\t[\"talk about sex\", \"toggle dwell clicks\"],\n\t\t[\"toggled welplex\", \"toggle dwell clicks\"],\n\t\t[\"taco bell clicks\", \"toggle dwell clicks\"],\n\t\t[\"12 quickening\", \"dwell clicking\"],\n\t\t[\"12 clicking\", \"dwell clicking\"],\n\t\t[\"12 cooking\", \"dwell clicking\"],\n\t\t[\"to a clicking\", \"dwell clicking\"],\n\t\t[\"12 clicks\", \"dwell clicks\"],\n\t\t[\"12 clicker\", \"dwell clicker\"],\n\t\t[\"to a click\", \"dwell click\"],\n\t\t[\"dwele clicking\", \"dwell clicking\"],\n\t\t[\"dwele click\", \"dwell click\"],\n\t\t[\"dwele clicks\", \"dwell clicks\"],\n\t\t[\"dwele clicker\", \"dwell clicker\"],\n\t\t[\"dwelle clicking\", \"dwell clicking\"],\n\t\t[\"dwelle click\", \"dwell click\"],\n\t\t[\"dwelle clicks\", \"dwell clicks\"],\n\t\t[\"dwelle clicker\", \"dwell clicker\"],\n\t\t[\"pasta while cutting\", \"pause dwell clicking\"],\n\t\t[\"pasta while cooking\", \"pause dwell clicking\"],\n\t\t[\"pasquale cooking\", \"pause dwell clicking\"],\n\t\t[\"pause while clicking\", \"pause dwell clicking\"],\n\t\t[\"pause while cooking\", \"pause dwell clicking\"],\n\t\t[\"paused while clicking\", \"pause dwell clicking\"],\n\t\t[\"paused while cooking\", \"pause dwell clicking\"],\n\t\t[\"unpause while clicking\", \"unpause dwell clicking\"],\n\t\t[\"unpause while cooking\", \"unpause dwell clicking\"],\n\t\t[\"unpaused while clicking\", \"unpause dwell clicking\"],\n\t\t[\"unpaused while cooking\", \"unpause dwell clicking\"],\n\t\t[\"stop while clicking\", \"stop dwell clicking\"],\n\t\t[\"stop while cooking\", \"stop dwell clicking\"],\n\t\t[\"stop wall clocks\", \"stop dwell clicks\"],\n\t\t[\"stopped while clicking\", \"stop dwell clicking\"],\n\t\t[\"stopped while cooking\", \"stop dwell clicking\"],\n\t\t[\"stopped wall clocks\", \"stop dwell clicks\"],\n\t\t[\"disabled while clicking\", \"disable dwell clicking\"],\n\t\t[\"disabled while cooking\", \"disable dwell clicking\"],\n\t\t[\"disabled wall clocks\", \"disable dwell clicks\"],\n\t\t[\"disabled wall clock in\", \"disable dwell clicking\"],\n\t\t[\"disable wall clock in\", \"disable dwell clicking\"],\n\t\t[\"disable while clicking\", \"disable dwell clicking\"],\n\t\t[\"disable while cooking\", \"disable dwell clicking\"],\n\t\t[\"disable wall clocks\", \"disable dwell clicks\"],\n\t\t[\"mabel dwell clicking\", \"enable dwell clicking\"],\n\t\t[\"enable to walk clicking\", \"enable dwell clicking\"],\n\t\t[\"enabled while clicking\", \"enable dwell clicking\"],\n\t\t[\"enabled while cooking\", \"enable dwell clicking\"],\n\t\t[\"enabled wall clocks\", \"enable dwell clicks\"],\n\t\t[\"enable while clicking\", \"enable dwell clicking\"],\n\t\t[\"enable while cooking\", \"enable dwell clicking\"],\n\t\t[\"enable wall clocks\", \"enable dwell clicks\"],\n\t\t[\"start wall clocks\", \"start dwell clicks\"],\n\t\t[\"start while cooking\", \"start dwell clicking\"],\n\t\t[\"start while clicking\", \"start dwell clicking\"],\n\t\t[\"resume while cooking\", \"resume dwell clicking\"],\n\t\t[\"resumed while cooking\", \"resume dwell clicking\"],\n\t\t[\"resume while clicking\", \"resume dwell clicking\"],\n\t\t[\"resumed while clicking\", \"resume dwell clicking\"],\n\t\t[\"resume walk clicks\", \"resume dwell clicks\"],\n\t\t[\"resumed walk clicks\", \"resume dwell clicks\"],\n\t\t[\"startalk looking\", \"start dwell clicking\"],\n\t\t[\"dwell quickening\", \"dwell clicking\"],\n\t\t[\"dual clicking\", \"dwell clicking\"],\n\t\t[\"dual quickening\", \"dwell clicking\"],\n\t\t[\"dual cooking\", \"dwell clicking\"],\n\t\t[\"dwell cooking\", \"dwell clicking\"],\n\t\t[\"well clicking\", \"dwell clicking\"],\n\t\t[\"well quitting\", \"dwell clicking\"],\n\t\t[\"well clicks\", \"dwell clicks\"],\n\n\t\t// Free-Form Select\n\t\t[\"state farm\", \"free-form\"],\n\t\t[\"freeform\", \"free-form\"],\n\t\t[\"free form\", \"free-form\"],\n\t\t[\"preference light\", \"free-form select\"],\n\t\t[\"free from select\", \"free-form select\"],\n\t\t[\"refund select\", \"free-form select\"],\n\t\t[\"pee from select\", \"free-form select\"],\n\t\t[\"pee form select\", \"free-form select\"],\n\t\t[\"reformist left\", \"free-form select\"],\n\t\t[\"reform select\", \"free-form select\"],\n\t\t[\"free p*** site\", \"free-form select\"],\n\t\t[\"sea sponge select\", \"free-form select\"],\n\t\t[\"refund selection\", \"free-form selection\"],\n\t\t[\"reform selection\", \"free-form selection\"],\n\t\t[\"refine selection\", \"free-form selection\"],\n\t\t[\"pee from selection\", \"free-form selection\"],\n\t\t[\"pee form selection\", \"free-form selection\"],\n\t\t[\"preformed selector\", \"free-form select tool\"],\n\t\t[\"difference electrical\", \"free-form select tool\"],\n\t\t[\"preformed selectable\", \"free-form select tool\"],\n\t\t[\"refund selector\", \"free-form select tool\"],\n\t\t[\"refund select tool\", \"free-form select tool\"],\n\t\t[\"select staffing\", \"select by outline\"],\n\t\t[\"sucks buy online\", \"select by outline\"],\n\t\t[\"sliced by outline\", \"select by outline\"],\n\t\t[\"stacked by outline\", \"select by outline\"],\n\t\t[\"the lights ballantyne\", \"select by outline\"],\n\t\t[\"shark ballet\", \"select by outline\"],\n\t\t[\"flexpay outline\", \"select by outline\"],\n\t\t[\"flexispy outline\", \"select by outline\"],\n\t\t[\"plexpy outline\", \"select by outline\"],\n\t\t[\"select palin\", \"select by outline\"],\n\t\t[\"soft vagina shape\", \"select by drawing a shape\"],\n\t\t[\"select by triangle shape\", \"select by drawing a shape\"],\n\t\t[\"flex by drawing a shape\", \"select by drawing a shape\"],\n\t\t[\"flex by drawing a sheep\", \"select by drawing a shape\"],\n\t\t[\"flex by drawing shape\", \"select by drawing shape\"],\n\t\t[\"flex by drawing sheep\", \"select by drawing shape\"],\n\t\t[\"psychic by drawing a shape\", \"select by drawing a shape\"],\n\t\t[\"psychic by drawing shape\", \"select by drawing shape\"],\n\t\t[\"psychic by drawing a sheep\", \"select by drawing a shape\"],\n\t\t[\"psychic by drawing sheep\", \"select by drawing shape\"],\n\t\t// Select\n\t\t[\"flekstore\", \"select tool\"],\n\t\t[\"select one\", \"select tool\"],\n\t\t[\"selectel\", \"select tool\"],\n\t\t[\"selector\", \"select tool\"],\n\t\t[\"sectoral\", \"select tool\"],\n\t\t[\"slack tool\", \"select tool\"],\n\t\t[\"slack poll\", \"select tool\"],\n\t\t[\"electoral\", \"select tool\"],\n\t\t[\"collectible\", \"select tool\"],\n\t\t[\"what tool\", \"select tool\"],\n\t\t[\"you select\", \"use select\"],\n\t\t[\"you select all\", \"use select tool\"],\n\t\t[\"use select all\", \"use select tool\"],\n\t\t[\"you slept well\", \"use select tool\"],\n\t\t[\"suck my dragon\", \"select by dragging\"],\n\t\t[\"swift\", \"select\"],\n\t\t[\"crab stop 2\", \"grab the select tool\"],\n\t\t[\"diamond select tool\", \"grab the select tool\"],\n\t\t[\"grandmas like tool\", \"grab the select tool\"],\n\t\t[\"7 / 12\", \"grab the select tool\"],\n\t\t[\"christmas light tour\", \"grab the select tool\"],\n\t\t[\"christmas light tool\", \"grab the select tool\"],\n\t\t[\"crab the spectre\", \"grab the select tool\"],\n\t\t[\"grab the select the\", \"grab the select tool\"],\n\t\t[\"endless love\", \"grab the select tool\"],\n\t\t[\"prince elector\", \"grab the select tool\"],\n\t\t[\"grandma's flector\", \"grab the select tool\"],\n\t\t[\"fortune\", \"selection\"],\n\t\t[\"flexion\", \"selection\"],\n\t\t// Eraser/Color Eraser\n\t\t[\"tracer\", \"eraser\"],\n\t\t[\"grace\", \"erase\"],\n\t\t[\"rapper\", \"rubber\"],\n\t\t[\"robber\", \"rubber\"],\n\t\t[\"racing\", \"eraser\"],\n\t\t[\"racer\", \"eraser\"],\n\t\t[\"appraiser\", \"eraser\"],\n\t\t// Fill With Color\n\t\t[\"tail with color\", \"fill with color\"],\n\t\t[\"pickpocket\", \"paint bucket\"],\n\t\t[\"pink bucket\", \"paint bucket\"],\n\t\t[\"pillbox hat\", \"fill bucket\"],\n\t\t[\"pill lookup\", \"fill bucket\"],\n\t\t[\"tell bucket\", \"fill bucket\"],\n\t\t[\"phil luckett\", \"fill bucket\"],\n\t\t[\"fel bucket\", \"fill bucket\"],\n\t\t[\"phil bucket\", \"fill bucket\"],\n\t\t[\"tell the cat\", \"fill bucket\"],\n\t\t[\"tell becca\", \"fill bucket\"],\n\t\t[\"tell buck app\", \"fill bucket\"],\n\t\t[\"celtic app\", \"fill bucket\"],\n\t\t[\"don't like it\", \"fill bucket\"],\n\t\t[\"sell back at\", \"fill bucket\"],\n\t\t[\"celtic cat\", \"fill bucket\"],\n\t\t[\"delphi cat\", \"fill bucket\"],\n\t\t[\"sobriquet\", \"fill bucket\"],\n\t\t[\"tell beckett\", \"fill bucket\"],\n\t\t[\"sound like a cat\", \"fill bucket\"],\n\t\t[\"seal bucket\", \"fill bucket\"],\n\t\t[\"cell bucket\", \"fill bucket\"],\n\t\t[\"go back at\", \"fill bucket\"],\n\t\t[\"silver cat\", \"fill bucket\"],\n\t\t[\"selma cat\", \"fill bucket\"],\n\t\t[\"fell back at\", \"fill bucket\"],\n\t\t[\"philadelphia\", \"fill bucket\"],\n\t\t[\"thelma cat\", \"fill bucket\"],\n\t\t[\"go back app\", \"fill bucket\"],\n\t\t[\"tell dunkin\", \"fill bucket\"],\n\t\t[\"bobcat\", \"bucket\"],\n\t\t[\"tell tool\", \"fill tool\"],\n\t\t[\"till tool\", \"fill tool\"],\n\t\t[\"delta\", \"fill tool\"],\n\t\t[\"tilt\", \"fill tool\"],\n\t\t[\"filter\", \"fill tool\"],\n\t\t[\"telltale\", \"fill tool\"],\n\t\t[\"felt tool\", \"fill tool\"],\n\t\t[\"feltl\", \"fill tool\"],\n\t\t[\"beltsville\", \"fill tool\"],\n\t\t[\"biltmore\", \"fill tool\"],\n\t\t[\"tiltable\", \"fill tool\"],\n\t\t[\"felt wool\", \"fill tool\"],\n\t\t[\"peltor\", \"fill tool\"],\n\t\t[\"field tool\", \"fill tool\"],\n\t\t[\"tilt wall\", \"fill tool\"],\n\t\t[\"tool wall\", \"tool\"],\n\t\t[\"elvis coloring\", \"fill with color\"],\n\t\t[\"pill with color\", \"fill with color\"],\n\t\t[\"so what's color\", \"fill with color\"],\n\t\t[\"platteville\", \"floodfill\"], // @TODO: make sure to handle variations of flood-fill/flood fill/floodfill if not already handled\n\t\t[\"landfill\", \"floodfill\"],\n\t\t[\"clydesdale\", \"floodfill\"],\n\t\t[\"plant fill\", \"floodfill\"],\n\t\t[\"area feltwell\", \"area fill tool\"],\n\t\t[\"hurry up fill tool\", \"area fill tool\"],\n\t\t[\"FL to wawa\", \"area fill tool\"],\n\t\t[\"region feltwell\", \"region fill tool\"],\n\t\t[\"regent fill tool\", \"region fill tool\"],\n\t\t[\"regent feltwell\", \"region fill tool\"],\n\t\t[\"tell\", \"fill\"],\n\t\t[\"cell\", \"fill\"],\n\t\t[\"phil\", \"fill\"],\n\t\t[/^shell$/i, \"fill\"],\n\t\t[\"delaware\", \"filler\"],\n\t\t[\"heller\", \"filler\"],\n\t\t[\"tiller\", \"filler\"],\n\t\t[\"philly\", \"filler\"],\n\t\t[\"feller\", \"filler\"],\n\t\t[\"keller\", \"filler\"],\n\t\t[\"teller\", \"filler\"],\n\t\t[\"set wear\", \"filler\"],\n\t\t[\"stellar\", \"filler\"],\n\t\t[\"delair\", \"filler\"],\n\t\t[\"cellar\", \"filler\"],\n\t\t[\"pillar\", \"filler\"],\n\t\t[\"bel air\", \"filler\"],\n\t\t[\"killer\", \"filler\"],\n\t\t[\"cypress hill tool\", \"select the fill tool\"],\n\t\t[\"cypress hill tour\", \"select the fill tool\"],\n\t\t[\"adele tool\", \"select the fill tool\"],\n\t\t[\"adele tour\", \"select the fill tool\"],\n\t\t[\"cycle filter on\", \"select the fill tool\"],\n\t\t[\"cycle fill tool on\", \"select the fill tool\"],\n\t\t[\"spect protocol\", \"select the fill tool\"],\n\t\t[\"temperature\", \"dump bucket\"],\n\t\t[\"temp bucket\", \"dump bucket\"],\n\t\t[\"tom paquette\", \"dump bucket\"],\n\t\t[\"come bucket\", \"dump bucket\"],\n\t\t[\"dumb bucket\", \"dump bucket\"],\n\t\t[\"pink jumper\", \"paint dumper\"],\n\t\t[\"pink diaper\", \"paint dumper\"],\n\t\t[\"paint number\", \"paint dumper\"],\n\t\t[\"pen temper\", \"paint dumper\"],\n\t\t[\"penn temper\", \"paint dumper\"],\n\t\t[\"camper\", \"dumper\"],\n\t\t[\"something bucket\", \"dumping bucket\"],\n\t\t[\"camping bucket\", \"dumping bucket\"],\n\t\t[\"panda filled my cat\", \"grab the fill bucket\"],\n\t\t[\"have the philadelphia\", \"grab the fill bucket\"],\n\t\t[\"grab the filter cap\", \"grab the fill bucket\"],\n\t\t[\"grab the fill tool cap\", \"grab the fill bucket\"],\n\t\t[\"can the felt like it\", \"grab the fill bucket\"],\n\t\t[\"turn the filter cap\", \"grab the fill bucket\"],\n\t\t[\"turn the fill tool cap\", \"grab the fill bucket\"],\n\t\t[\"kenneth l. cat\", \"grab the fill bucket\"],\n\t\t[\"crabs fl. cat\", \"grab the fill bucket\"],\n\t\t// Pick Color\n\t\t[\"pink color\", \"pick color\"],\n\t\t[\"what color\", \"pick color\"],\n\t\t[\"pickler\", \"pick color\"],\n\t\t[\"picolor\", \"pick color\"],\n\t\t[\"the color\", \"pick color\"],\n\t\t[\"color from a picture\", \"color from the picture\"],\n\t\t[\"hydrometer\", \"eye dropper\"],\n\t\t[\"hijacker\", \"eye dropper\"],\n\t\t[\"price chopper\", \"eye dropper\"],\n\t\t[\"hydra\", \"eye drop\"],\n\t\t[\"hydro\", \"eye drop\"],\n\t\t[\"high job\", \"eye drop\"],\n\t\t[\"color left in too long\", \"color lifting tool\"],\n\t\t[\"kelly rector\", \"color lifter\"],\n\t\t[\"best color\", \"lift color\"],\n\t\t[\"toy left it\", \"color lifter\"],\n\t\t[\"collector\", \"color lifter\"],\n\t\t[\"color corrector\", \"color lifter\"],\n\t\t[\"kelly wester\", \"color lifter\"],\n\t\t[\"color vector\", \"color lifter\"],\n\t\t// Magnifier\n\t\t[\"loop\", \"loupe\"],\n\t\t[\"poop\", \"loupe\"],\n\t\t[\"duke\", \"loupe\"],\n\t\t[\"snoop\", \"loupe\"],\n\t\t[\"mutual\", \"loupe tool\"],\n\t\t[\"big claw\", \"loupe tool\"],\n\t\t[\"skip trowel\", \"loupe tool\"],\n\t\t[\"webtoon\", \"loupe tool\"],\n\t\t[\"high class\", \"eyeglass\"],\n\t\t[\"anything glass\", \"magnifying glass\"],\n\t\t[\"human tool\", \"zooming tool\"],\n\t\t[\"resuming tool\", \"zooming tool\"],\n\t\t[\"looming tool\", \"zooming tool\"],\n\t\t[\"tuning tool\", \"zooming tool\"],\n\t\t[\"swimming pool\", \"zooming tool\"],\n\t\t[\"simmental\", \"zooming tool\"],\n\t\t[\"jimmy neutron\", \"zooming tool\"],\n\t\t[\"zoom in tool\", \"zooming tool\"],\n\t\t[\"covid-19 fire\", \"grab the magnifier\"],\n\t\t[\"turn the magnifier\", \"grab the magnifier\"],\n\t\t[\"hang fire\", \"magnifier\"],\n\t\t// Pencil\n\t\t[\"penn\", \"pen\"],\n\t\t[\"penndot\", \"pen tool\"],\n\t\t[\"pixel 2\", \"pixel tool\"],\n\t\t[\"texas lottery tool\", \"pixel art tool\"],\n\t\t// Brush\n\t\t[\"barstool\", \"brush tool\"],\n\t\t[\"pashto\", \"brush tool\"],\n\t\t[\"cache store\", \"brush tool\"],\n\t\t[\"festival\", \"brush tool\"],\n\t\t[\"press tool\", \"brush tool\"],\n\t\t[\"restaurant\", \"brush tool\"],\n\t\t[\"vegetable\", \"brush tool\"],\n\t\t[\"brushed wool\", \"brush tool\"],\n\t\t[\"fresh\", \"brush\"],\n\t\t[\"rush\", \"brush\"],\n\t\t[\"crash\", \"brush\"],\n\t\t[\"crush\", \"brush\"],\n\t\t// Airbrush\n\t\t[\"hair brush\", \"airbrush\"],\n\t\t[\"hairbrush\", \"airbrush\"],\n\t\t[\"hair brushing\", \"airbrushing\"],\n\t\t[\"hairbrushing\", \"airbrushing\"],\n\t\t[\"parasol\", \"aerosol\"],\n\t\t[\"paragraph\", \"aerograph\"],\n\t\t// Text\n\t\t[\"x2\", \"text tool\"],\n\t\t[\"text talk\", \"text tool\"],\n\t\t[\"hacks\", \"text\"],\n\t\t[\"pex tool\", \"text tool\"],\n\t\t[\"text one\", \"text tool\"],\n\t\t[\"text mom\", \"text tool\"],\n\t\t[\"text will\", \"text tool\"],\n\t\t[\"text to him\", \"text tool\"],\n\t\t[\"text tone\", \"text tool\"],\n\t\t[\"extol\", \"text tool\"],\n\t\t[\"tech stool\", \"text tool\"],\n\t\t[\"textile\", \"text tool\"],\n\t\t[/^and text\\b/i, \"end text\"],\n\t\t// Line\n\t\t[\"blind\", \"line tool\"],\n\t\t[\"mindful\", \"line tool\"],\n\t\t[\"mine tour\", \"line tool\"],\n\t\t[\"mantle\", \"line tool\"],\n\t\t[\"fine tool\", \"line tool\"],\n\t\t[\"912\", \"line tool\"],\n\t\t[\"night owl\", \"line tool\"],\n\t\t[\"klein tool\", \"line tool\"],\n\t\t[\"feintool\", \"line tool\"],\n\t\t[\"wine tool\", \"line tool\"],\n\t\t[\"wine tour\", \"line tool\"],\n\t\t[\"mine\", \"line\"],\n\t\t[\"fine\", \"line\"],\n\t\t[\"find\", \"line\"],\n\t\t[\"lying\", \"line\"],\n\t\t[\"straight life\", \"straight line\"],\n\t\t[\"lions\", \"lines\"],\n\t\t[\"landstuhl\", \"lines tool\"],\n\t\t[\"wine store\", \"lines tool\"],\n\t\t[\"find rantoul\", \"line drawing tool\"],\n\t\t// Curve\n\t\t[\"careful\", \"curve tool\"],\n\t\t[\"capital\", \"curve tool\"],\n\t\t[\"curveball\", \"curve tool\"],\n\t\t[\"curved wall\", \"curve tool\"],\n\t\t[\"creve coeur\", \"curve tool\"],\n\t\t[\"terp talk\", \"curve tool\"],\n\t\t[\"character\", \"curve tool\"],\n\t\t[\"turtle\", \"curve tool\"],\n\t\t[\"kirksville\", \"curve tool\"],\n\t\t[\"busy acre\", \"bezier curve\"],\n\t\t[\"sheriff\", \"curve\"],\n\t\t[\"turf\", \"curve\"],\n\t\t[\"curt\", \"curve\"],\n\t\t[\"kerf\", \"curve\"],\n\t\t[\"cuz\", \"curve\"],\n\t\t[\"kirk\", \"curve\"],\n\t\t[\"leaving bye\", \"wavy line\"],\n\t\t[\"weave\", \"wave\"],\n\t\t[\"cosign\", \"cosine\"],\n\t\t[\"co-sign\", \"cosine\"],\n\t\t[\"curse\", \"curves\"],\n\t\t[\"curved stool\", \"curves tool\"],\n\t\t// Rectangle\n\t\t[\"spectacle\", \"rectangle\"],\n\t\t[\"wrecked\", \"rect\"],\n\t\t// Polygon\n\t\t[\"play on\", \"polygon\"],\n\t\t[\"and gone\", \"n-gon\"],\n\t\t[\"handgun\", \"n-gon\"],\n\t\t[\"police\", \"polys\"],\n\t\t[\"polly's\", \"polys\"],\n\t\t[\"polly stool\", \"polys tool\"],\n\t\t[\"polly tool\", \"poly tool\"],\n\t\t[\"polly\", \"poly\"],\n\t\t[\"shaped wall\", \"shape tool\"],\n\t\t[\"octagon table\", \"octagon tool\"],\n\t\t// Ellipse\n\t\t[\"lips\", \"ellipse\"],\n\t\t[\"clips\", \"ellipse\"],\n\t\t[\"eclipse\", \"ellipse\"],\n\t\t[\"let's\", \"ellipse\"],\n\t\t[\"flip store\", \"ellipse tool\"],\n\t\t[\"toefl\", \"oval\"],\n\t\t[\"offal\", \"oval\"],\n\t\t[\"google\", \"oval\"],\n\t\t[\"hopeful\", \"oval\"],\n\t\t[\"duval\", \"oval\"],\n\t\t[\"oporto\", \"oval tool\"],\n\t\t// Rounded Rectangle\n\t\t[\"mandy tatinkin\", \"rounded rectangle\"],\n\t\t[\"random rectangles\", \"rounded rectangle\"],\n\t\t[\"random rectangle\", \"rounded rectangle\"],\n\t\t[\"brandon rectangle\", \"rounded rectangle\"],\n\t\t[\"and it rectangle\", \"rounded rectangle\"],\n\t\t[\"and a rectangle\", \"rounded rectangle\"],\n\t\t[\"padded rectangle\", \"rounded rectangle\"],\n\t\t[\"standard rectangle\", \"rounded rectangle\"], // (I hope you don't actually say \"standard rectangle\" haha)\n\t\t[\"roundrect\", \"round rect\"],\n\t\t[\"contract\", \"round rect\"],\n\t\t[\"found wrecked\", \"round rect\"],\n\t\t[\"found rect\", \"round rect\"],\n\t\t[\"and wrecked\", \"round rect\"],\n\t\t[\"and rect\", \"round rect\"],\n\t\t[\"man draft\", \"round rect\"],\n\t\t[\"found wrapped\", \"round rect\"],\n\t\t[\"round draft\", \"round rect\"],\n\t\t[\"brown direct\", \"round rect\"],\n\t\t[\"brown tract\", \"round rect\"],\n\t\t[\"brown draft\", \"round rect\"],\n\t\t[\"round wrecked\", \"round rect\"],\n\t\t[\"a tract\", \"round rect\"],\n\t\t[\"grand rapids\", \"round rect\"],\n\t\t[\"ron recht\", \"round rect\"],\n\t\t[\"cataract\", \"round rect\"],\n\t\t[\"soundtrack\", \"round rect\"],\n\t\t[\"round wrapped\", \"round rect\"],\n\t\t[\"unwrapped\", \"round rect\"],\n\t\t[\"downdraft\", \"round rect\"],\n\t\t[\"round rock\", \"round rect\"],\n\t\t[\"grand racked\", \"round rect\"],\n\t\t[\"and racked\", \"round rect\"],\n\n\t\t// Tool options\n\t\t[\"hope hicks election\", \"opaque selection\"],\n\t\t[\"oaks collection\", \"opaque selection\"],\n\t\t[\"okay selection\", \"opaque selection\"],\n\t\t[\"hoecakes election\", \"opaque selection\"],\n\t\t[\"selection of pic\", \"selection opaque\"],\n\t\t[\"next selection of pig\", \"make selection opaque\"],\n\t\t[\"next selection of pic\", \"make selection opaque\"],\n\t\t[\"next selection opaque\", \"make selection opaque\"],\n\t\t[\"explosion transparent\", \"make selection transparent\"],\n\t\t[\"increase breast size\", \"increase brush size\"],\n\n\t\t// spell-checker:enable\n\t];\n\tconst colorNames = [\"aqua\", \"azure\", \"beige\", \"bisque\", \"black\", \"blue\", \"brown\", \"chocolate\", \"coral\", \"crimson\", \"cyan\", \"fuchsia\", \"ghostwhite\", \"gold\", \"goldenrod\", \"gray\", \"green\", \"indigo\", \"ivory\", \"khaki\", \"lavender\", \"lime\", \"linen\", \"magenta\", \"maroon\", \"moccasin\", \"navy\", \"olive\", \"orange\", \"orchid\", \"peru\", \"pink\", \"plum\", \"purple\", \"red\", \"salmon\", \"sienna\", \"silver\", \"snow\", \"tan\", \"teal\", \"thistle\", \"tomato\", \"turquoise\", \"violet\", \"white\", \"yellow\"];\n\t// const toolNames = tools.map((tool) => tool.speech_recognition).flat();\n\t// @TODO: select foreground/background/ternary color specifically\n\t// @TODO: switch colors / swap colors / swap foreground and background colors\n\t// @TODO: zoom in/out / increase/decrease magnification, zoom to 20x / 5% etc., zoom out all the way (actual size or best fit if it's too big), actual size\n\t// @TODO: \"convert image to black-and-white\" / \"convert image to monochrome\" / \"make image monochrome\", \"increase/decrease threshold\" / \"more white\" / \"more black\"\n\t// @TODO: in Image Attributes, \"Color\"/\"Colors\"/\"Not black and white\" for Colors\n\t// @TODO: select tool options like selection opacity and brush sizes\n\t//   opaque/transparent/translucent/see-through selection / make selection opaque/transparent/translucent/see-through\n\t//   \"increase size\"(too vague) / \"increase brush size\" / \"increase eraser size\" / \"larger eraser\" / \"enlarge eraser\"\n\n\t// @TODO: Is there a way to enable the grammar only as a hint, non-restrictively?\n\t// Construct a grammar that just contains an English dictionary, and set it as lower weight?\n\t// That might mess with / not work with things like \"MC\" in \"MC Hammer\", numbers, emoji, etc.\n\t// and be super inefficient and terrible.\n\t// (Really I just want the speech recognition to be better. I wonder if it's better these days...)\n\t/*const grammar = `#JSGF V1.0;\n\tgrammar jspaintCommands;\n\t<color> = ${colorNames.join(\" | \")};\n\t<tool_name> = ${toolNames.join(\" | \")};\n\t<tool> = [the] <tool_name> [tool];\n\t<pick-verb> = select | pick | choose | use | activate | \"pick up\" | grab;\n\t<stop> = stop | end | cease | (that's | that is) enough | enough of that | terminate | halt | put an end to [this] | break off;\n\t// @TODO: is there an escape hatch for \"any text here\"?\n\t<something> = [a|an] (something | thing | anything | dog | cat | house | mouse | bird | snake | tree | turtle | mountain | [smiley | smiling | happy | frowny | frowning | sad] face);\n\t<draw> = draw | sketch | doodle | render | ((draw | sketch | doodle | render | do | paint) [a picture | an image | a drawing | a painting | a rendition | a sketch | a doodle) of]);\n\t<draw-something> = <draw> <something>;\n\tpublic <command> = [<pick-verb>] (<color> | <tool>) | <stop> | <draw-something>;\n\t`;*/\n\n\tconst recognition = new SpeechRecognition();\n\t// const speechRecognitionList = new SpeechGrammarList();\n\t// speechRecognitionList.addFromString(grammar, 1);\n\t// recognition.grammars = speechRecognitionList;\n\trecognition.continuous = false;\n\trecognition.lang = \"en-US\";\n\trecognition.interimResults = false;\n\trecognition.maxAlternatives = 1;\n\n\tspeech_recognition_active = false;\n\n\tenable_speech_recognition = function () {\n\t\tif (!speech_recognition_active) {\n\t\t\tspeech_recognition_active = true;\n\t\t\trecognition.start();\n\t\t}\n\t};\n\tdisable_speech_recognition = function () {\n\t\tif (speech_recognition_active) {\n\t\t\tspeech_recognition_active = false;\n\t\t\trecognition.stop();\n\t\t}\n\t};\n\n\tconst textual_input_selector = \"input:not([type=file]):not([type=button]):not([type=submit]):not([type=reset]):not([type=radio]):not([type=checkbox]):not([type=color]):not([type=image]), textarea, [contenteditable]\";\n\n\t// @TODO: maybe make this a pure function? doesn't seem great to use document state here\n\tfunction fix_up_speech_recognition(command) {\n\t\tcommand = command.toLowerCase();\n\t\tif (!command.match(/^draw /i) && !(document.activeElement && document.activeElement.matches(textual_input_selector))) {\n\t\t\tfor (const [bad, good] of recognitionFixes) {\n\t\t\t\tif (bad instanceof RegExp) {\n\t\t\t\t\tif (bad.flags.indexOf(\"i\") === -1) {\n\t\t\t\t\t\tconsole.warn(`A speech recognition fix was introduced using a regexp (${bad}) that is not case insensitive. Add the /i flag or make this message more nuanced.`);\n\t\t\t\t\t}\n\t\t\t\t\tcommand = command.replace(bad, good);\n\t\t\t\t} else if (bad.match(/^\\W|\\W$/)) {\n\t\t\t\t\tcommand = command.replace(new RegExp(escapeRegExp(bad), \"ig\"), good);\n\t\t\t\t} else {\n\t\t\t\t\tcommand = command.replace(new RegExp(`\\\\b${escapeRegExp(bad)}\\\\b`, \"ig\"), good);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn command;\n\t}\n\trecognition.onresult = function (event) {\n\t\tif (document.visibilityState !== \"visible\") {\n\t\t\treturn;\n\t\t}\n\t\t// The SpeechRecognitionEvent results property returns a SpeechRecognitionResultList object\n\t\t// The SpeechRecognitionResultList object contains SpeechRecognitionResult objects.\n\t\t// It has a getter so it can be accessed like an array\n\t\t// The first [0] returns the SpeechRecognitionResult at the last position.\n\t\t// Each SpeechRecognitionResult object contains SpeechRecognitionAlternative objects that contain individual results.\n\t\t// These also have getters so they can be accessed like arrays.\n\t\t// The second [0] returns the SpeechRecognitionAlternative at position 0.\n\t\t// We then return the transcript property of the SpeechRecognitionAlternative object\n\t\tconsole.log(event.results);\n\t\tlet command = event.results[0][0].transcript;\n\t\tconsole.log(`Result received: \"${command}\"`);\n\t\tconsole.log(\"Confidence: \" + event.results[0][0].confidence);\n\t\tcommand = fix_up_speech_recognition(command);\n\t\tconsole.log(`After any fixes: \"${command}\"`);\n\n\t\tconst interpretations = interpret_command(command, true);\n\t\tif (interpretations.length) {\n\t\t\tconst interpretation = choose_interpretation(interpretations);\n\t\t\t// @TODO: escape HTML around and inside the <b> tag\n\t\t\tconst speech_html = command.replace(\n\t\t\t\tnew RegExp(escapeRegExp(interpretation.match_text), \"i\"),\n\t\t\t\t(important_text) => `<b>${important_text}</b>`\n\t\t\t);\n\t\t\t$status_text.html(`Speech:&nbsp;<span style=\"white-space: pre;\">${speech_html}</span>`);\n\t\t\tconsole.log(`Interpreting command \"${command}\" as`, interpretation);\n\t\t\tinterpretation.exec();\n\t\t} else {\n\t\t\t$status_text.text(`Speech: ${command}`);\n\t\t\tconsole.log(`No interpretation for command \"${command}\"`);\n\t\t}\n\t};\n\n\trecognition.onspeechend = function () {\n\t\trecognition.addEventListener(\"end\", () => {\n\t\t\trecognition.start();\n\t\t}, { once: true });\n\t\trecognition.stop();\n\t};\n\n\trecognition.onnomatch = function () {\n\t\tif (document.visibilityState !== \"visible\") {\n\t\t\treturn;\n\t\t}\n\t\t$status_text.text(\"Speech not recognized.\");\n\t};\n\n\trecognition.onstart = function () {\n\t\tspeech_recognition_active = true;\n\t};\n\trecognition.onend = function () {\n\t\tspeech_recognition_active = false;\n\t};\n\n\trecognition.onerror = function (event) {\n\t\tif (event.error.toString().match(/no-speech/)) {\n\t\t\ttry {\n\t\t\t\trecognition.start();\n\t\t\t} catch (_error) {\n\t\t\t\trecognition.addEventListener(\"end\", () => {\n\t\t\t\t\trecognition.start();\n\t\t\t\t}, { once: true });\n\t\t\t}\n\t\t} else {\n\t\t\t$status_text.text(\"Error occurred in speech recognition: \" + event.error);\n\t\t\tconsole.log(\"Error occurred in speech recognition:\", event.error);\n\t\t\t// speech_recognition_active = false;\n\t\t}\n\t};\n\n\t// @TODO: move this logic to a sorting within interpret_command\n\tfunction choose_interpretation(interpretations) {\n\t\tlet best_interpretation = interpretations[0];\n\t\tif (!interpretations.length) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const interpretation of interpretations) {\n\t\t\tif (\n\t\t\t\tinterpretation.match_text.length > best_interpretation.match_text.length ||\n\t\t\t\tinterpretation.prioritize\n\t\t\t) {\n\t\t\t\tbest_interpretation = interpretation;\n\t\t\t}\n\t\t}\n\t\treturn best_interpretation;\n\t}\n\n\tinterpret_command = (input_text, default_to_entering_text) => {\n\t\t/** @type {VoiceCommand[]} */\n\t\tconst interpretations = [];\n\t\t/** @param {VoiceCommand} interpretation */\n\t\tconst add_interpretation = (interpretation) => {\n\t\t\tinterpretations.push(interpretation);\n\t\t};\n\n\t\tfor (const color of colorNames) {\n\t\t\tif (` ${input_text} `.toLowerCase().indexOf(` ${color.toLowerCase()} `) !== -1) {\n\t\t\t\tadd_interpretation({\n\t\t\t\t\tmatch_text: color,\n\t\t\t\t\texec: ((color) => () => {\n\t\t\t\t\t\tselected_colors.foreground = color;\n\t\t\t\t\t\t$G.trigger(\"option-changed\");\n\t\t\t\t\t})(color),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tfor (const tool of tools) {\n\t\t\tfor (const base_tool_phrase of tool.speech_recognition) {\n\t\t\t\t// Note: if \"select\" wasn't matched here, the phrase \"select text\" would select the Select tool instead of the Text tool (because \"select\" is longer than \"text\")\n\t\t\t\tconst select_tool_match = input_text.match(new RegExp(`\\\\b(?:(?:select|pick|choose|use|activate|pick up|grab) )?(?:the )?${escapeRegExp(base_tool_phrase)}(?: tool)?\\\\b`, \"i\"));\n\t\t\t\tif (select_tool_match) {\n\t\t\t\t\tadd_interpretation({\n\t\t\t\t\t\tmatch_text: select_tool_match[0],\n\t\t\t\t\t\ttool_id: tool.id,\n\t\t\t\t\t\texec: ((tool) => () => {\n\t\t\t\t\t\t\tselect_tool(tool);\n\t\t\t\t\t\t})(tool),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst all_menu_items = [];\n\t\tconst collect_menu_items = (menu) => {\n\t\t\tfor (const menu_item of menu) {\n\t\t\t\tif (menu_item !== MENU_DIVIDER) {\n\t\t\t\t\tall_menu_items.push(menu_item);\n\t\t\t\t}\n\t\t\t\tif (menu_item.submenu) {\n\t\t\t\t\tcollect_menu_items(menu_item.submenu);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tObject.values(menus).forEach(collect_menu_items);\n\n\t\tfor (const menu_item of all_menu_items) {\n\t\t\tif (menu_item.speech_recognition) {\n\t\t\t\tfor (const menu_item_phrase of menu_item.speech_recognition) {\n\t\t\t\t\tif (` ${input_text} `.toLowerCase().indexOf(` ${menu_item_phrase.toLowerCase()} `) !== -1) {\n\t\t\t\t\t\tadd_interpretation({\n\t\t\t\t\t\t\tmatch_text: menu_item_phrase,\n\t\t\t\t\t\t\texec: ((menu_item) => () => {\n\t\t\t\t\t\t\t\tif (menu_item.checkbox) {\n\t\t\t\t\t\t\t\t\tmenu_item.checkbox.toggle();\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tmenu_item.action();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})(menu_item),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst close_menus_match = input_text.match(/\\b(?:(?:close|exit|leave|hide|dismiss) menus?|never ?mind|get (?:out of|outta) (here|this menu|these menus)?|get out)\\b/i);\n\t\tif (close_menus_match) {\n\t\t\tadd_interpretation({\n\t\t\t\tmatch_text: close_menus_match[0],\n\t\t\t\texec: () => {\n\t\t\t\t\t// from close_menus in $MenuBar\n\t\t\t\t\t$(\".menu-button\").trigger(\"release\");\n\t\t\t\t\t// Close any rogue floating submenus\n\t\t\t\t\t$(\".menu-popup\").hide();\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tif (interpretations.length === 0) {\n\t\t\t// @TODO: clipboard as a source.. but you might want to just draw the clipboard directly to the canvas,\n\t\t\t// so maybe it should be limited to saying \"sketch\"/\"doodle\"/\"do a rendition of\"\n\t\t\t// /(?:sketch|doodle|do a (?:rendition|sketch|doodle) of) (?:the (?:contents of |(?:image|picture|data) on the )|(?:what's|what is) on the )?clipboard/i\n\t\t\tconst draw_match = input_text.match(/(?:draw|sketch|doodle|render|(?:paint|draw|do|render|sketch) (?:a picture|an image|a drawing|a painting|a rendition|a sketch|a doodle) of) (?:an? )?(.+)/i);\n\t\t\tif (draw_match) {\n\t\t\t\tconst subject_matter = draw_match[1].replace(/:-?\\)/g, \"smiley face\").replace(/:-?\\(/g, \"sad face\");\n\t\t\t\tadd_interpretation({\n\t\t\t\t\tmatch_text: draw_match[0],\n\t\t\t\t\tsketch_subject: subject_matter,\n\t\t\t\t\texec: () => {\n\t\t\t\t\t\tfind_clipart_and_sketch(subject_matter);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst buttons = $(\"button, .menu-button, .menu-item-label, label, .help-window .item\").filter(\":visible\").toArray();\n\n\t\tfor (const button of buttons) {\n\t\t\tlet button_text = button.textContent || button.getAttribute(\"aria-label\") || button.title;\n\t\t\tbutton_text = button_text\n\t\t\t\t.replace(/[^\\p{L}|\\p{N}|\\p{M}|\\s]/gu, \" \") // currently the Extras menu has emoji in its labels, so we need to remove them\n\t\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t\t.trim();\n\t\t\tlet button_text_phrases = [button_text];\n\t\t\tif (!button_text) {\n\t\t\t\tbutton_text_phrases = [];\n\t\t\t}\n\t\t\tif (button_text.match(/^(Okay|OK)$/i)) {\n\t\t\t\tbutton_text_phrases = [\"Okay\", localize(\"OK\")];\n\t\t\t}\n\t\t\t// TODO: \"clicker\" variant\n\t\t\tif (button_text.match(/^(Pause Dwell Clicking)$/i)) {\n\t\t\t\tbutton_text_phrases = [\n\t\t\t\t\t\"Toggle Dwell Clicking\", \"Toggle Dwell Clicks\",\n\t\t\t\t\t\"Rest Eye Gaze\", \"Rest Eyes\",\n\t\t\t\t\t// disable stop pause\n\t\t\t\t\t\"Disable Dwell Clicking\", \"Disable Eye Gaze\", \"Disable Gaze Clicking\", \"Disable Dwell Clicks\", \"Disable Gaze Clicks\",\n\t\t\t\t\t\"Stop Dwell Clicking\", \"Stop Eye Gaze\", \"Stop Gaze Clicking\", \"Stop Dwell Clicks\", \"Stop Gaze Clicks\",\n\t\t\t\t\t\"Pause Dwell Clicking\", \"Pause Eye Gaze\", \"Pause Gaze Clicking\", \"Pause Dwell Clicks\", \"Pause Gaze Clicks\",\n\t\t\t\t];\n\t\t\t}\n\t\t\tif (button_text.match(/^(Resume Dwell Clicking)$/i)) {\n\t\t\t\tbutton_text_phrases = [\n\t\t\t\t\t\"Toggle Dwell Clicking\", \"Toggle Dwell Clicks\",\n\t\t\t\t\t// enable reenable re-enable start resume unpause un-pause\n\t\t\t\t\t\"Enable Dwell Clicking\", \"Enable Eye Gaze\", \"Enable Gaze Clicking\", \"Enable Dwell Clicks\", \"Enable Gaze Clicks\",\n\t\t\t\t\t\"Reenable Dwell Clicking\", \"Reenable Eye Gaze\", \"Reenable Gaze Clicking\", \"Reenable Dwell Clicks\", \"Reenable Gaze Clicks\",\n\t\t\t\t\t\"Re-enable Dwell Clicking\", \"Re-enable Eye Gaze\", \"Re-enable Gaze Clicking\", \"Re-enable Dwell Clicks\", \"Re-enable Gaze Clicks\",\n\t\t\t\t\t\"Start Dwell Clicking\", \"Start Eye Gaze\", \"Start Gaze Clicking\", \"Start Dwell Clicks\", \"Start Gaze Clicks\",\n\t\t\t\t\t\"Resume Dwell Clicking\", \"Resume Eye Gaze\", \"Resume Gaze Clicking\", \"Resume Dwell Clicks\", \"Resume Gaze Clicks\",\n\t\t\t\t\t\"Unpause Dwell Clicking\", \"Unpause Eye Gaze\", \"Unpause Gaze Clicking\", \"Unpause Dwell Clicks\", \"Unpause Gaze Clicks\",\n\t\t\t\t\t\"Un-pause Dwell Clicking\", \"Un-pause Eye Gaze\", \"Un-pause Gaze Clicking\", \"Un-pause Dwell Clicks\", \"Un-pause Gaze Clicks\",\n\t\t\t\t];\n\t\t\t}\n\t\t\tif (button.matches(\".window-close-button\")) {\n\t\t\t\tbutton_text_phrases = [\n\t\t\t\t\t\"close\", \"close button\", \"close window\", \"close window button\",\n\t\t\t\t\t// @TODO: condition on window type\n\t\t\t\t\t\"close dialog\", \"close dialog window\", \"close dialog button\", \"close dialog window button\",\n\t\t\t\t];\n\t\t\t}\n\t\t\tif (button.matches(\".window-maximize-button\")) {\n\t\t\t\tbutton_text_phrases = [\n\t\t\t\t\t// @TODO: condition of maximized state\n\n\t\t\t\t\t\"maximize\", \"maximize button\", \"maximize window\", \"maximize window button\",\n\t\t\t\t\t\"enlarge window\", \"make window large\", \"make window larger\",\n\n\t\t\t\t\t\"unmaximize\", \"unmaximize button\", \"unmaximize window\", \"unmaximize window button\",\n\t\t\t\t\t\"restore\", \"restore button\", \"restore window\", \"restore window button\", \"restore window size\", \"restore window size button\",\n\t\t\t\t\t\"enlarge window\", \"make window small\", \"make window small again\", \"make window smaller\", \"make window smaller again\",\n\t\t\t\t];\n\t\t\t}\n\t\t\tif (button.matches(\".window-minimize-button\")) {\n\t\t\t\tbutton_text_phrases = [\n\t\t\t\t\t\"minimize\", \"minimize button\", \"minimize window\", \"minimize window button\",\n\t\t\t\t\t\"iconify\", \"iconify button\", \"iconify window\", \"iconify window button\",\n\t\t\t\t\t\"minimize to tray\", \"minimize to tray button\", \"minimize to tray window\", \"minimize to tray window button\",\n\t\t\t\t\t\"hide window\", \"hide window button\",\n\t\t\t\t];\n\t\t\t}\n\t\t\t// some help topics\n\t\t\tif (button_text.match(/^Draw a/i)) {\n\t\t\t\tbutton_text_phrases = [button_text, button_text.replace(/ an? /i, \" \")];\n\t\t\t}\n\t\t\t// help window buttons\n\t\t\tif (button.closest(\".help-window\")) {\n\t\t\t\tif (button_text.match(/^forward$/i)) {\n\t\t\t\t\tbutton_text_phrases = [\n\t\t\t\t\t\t\"forward\", \"forwards\",\n\t\t\t\t\t\t\"go forward\", \"go forwards\", \"navigate forward\", \"navigate forwards\",\n\t\t\t\t\t\t\"navigate history forward\", \"navigate history forwards\",\n\t\t\t\t\t\t\"go forward in history\", \"go forwards in history\", \"navigate forward in history\", \"navigate forwards in history\",\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t\tif (button_text.match(/^back$/i)) {\n\t\t\t\t\tbutton_text_phrases = [\n\t\t\t\t\t\t\"back\", \"backward\", \"backwards\",\n\t\t\t\t\t\t\"go back\", \"navigate back\", \"go backward\", \"go backwards\", \"navigate backward\", \"navigate backwards\",\n\t\t\t\t\t\t\"navigate history back\", \"navigate history backward\", \"navigate history backwards\",\n\t\t\t\t\t\t\"go back in history\", \"navigate back in history\", \"go backward in history\", \"go backwards in history\", \"navigate backward in history\", \"navigate backwards in history\",\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t\tif (button_text.match(/^hide$/i)) {\n\t\t\t\t\tbutton_text_phrases = [\"hide\", \"hide sidebar\", \"hide topics\"];\n\t\t\t\t}\n\t\t\t\tif (button_text.match(/^show$/i)) {\n\t\t\t\t\tbutton_text_phrases = [\"show\", \"show sidebar\", \"show topics\"];\n\t\t\t\t}\n\t\t\t}\n\t\t\t// some form labels\n\t\t\tif (button_text.match(/:$/i)) {\n\t\t\t\tbutton_text_phrases = [button_text.replace(/:$/i, \"\")];\n\t\t\t}\n\t\t\t// some menu items\n\t\t\tif (button_text.match(/\\.\\.\\.$/i)) {\n\t\t\t\tbutton_text_phrases = [button_text.replace(/\\.\\.\\.$/i, \"\")];\n\t\t\t}\n\t\t\tif (button_text === \"Tool Box\") {\n\t\t\t\tbutton_text_phrases = [\"tool box\", \"tool-box\", \"toolbox\"];\n\t\t\t}\n\t\t\tif (button_text === \"Color Box\") {\n\t\t\t\tbutton_text_phrases = [\"color box\", \"color-box\", \"colorbox\"];\n\t\t\t}\n\n\t\t\t// top level menu buttons\n\t\t\tif (button.matches(\".menu-button\")) {\n\t\t\t\tbutton_text_phrases = [\n\t\t\t\t\tbutton_text, `${button_text} menu`,\n\t\t\t\t\t`show ${button_text} menu`,\n\t\t\t\t\t`open ${button_text} menu`,\n\t\t\t\t\t`access ${button_text} menu`,\n\t\t\t\t\t`view ${button_text} menu`,\n\t\t\t\t\t`show the menu for ${button_text}`,\n\t\t\t\t\t`open the menu for ${button_text}`,\n\t\t\t\t\t`access the menu for ${button_text}`,\n\t\t\t\t\t`view the menu for ${button_text}`,\n\t\t\t\t];\n\t\t\t}\n\t\t\t// menu items with submenus\n\t\t\t// (designed to fail if class name \"menu-item-submenu-area\" changes)\n\t\t\tif (button.closest(\".menu-item\") && button.closest(\".menu-item\").querySelector(\".menu-item-submenu-area\").innerHTML !== \"\") {\n\t\t\t\tbutton_text_phrases = [\n\t\t\t\t\tbutton_text, `${button_text} menu`,\n\t\t\t\t\t`show ${button_text} menu`, `show ${button_text} submenu`, `show ${button_text} sub-menu`, `show ${button_text} sub menu`,\n\t\t\t\t\t`open ${button_text} menu`, `open ${button_text} submenu`, `open ${button_text} sub-menu`, `open ${button_text} sub menu`,\n\t\t\t\t\t`access ${button_text} menu`, `access ${button_text} submenu`, `access ${button_text} sub-menu`, `access ${button_text} sub menu`,\n\t\t\t\t\t`view ${button_text} menu`, `view ${button_text} submenu`, `view ${button_text} sub-menu`, `view ${button_text} sub menu`,\n\t\t\t\t];\n\t\t\t}\n\n\t\t\tif (button_text_phrases.length === 0) {\n\t\t\t\tconsole.log(\"Button inaccessible for speech recognition:\", button);\n\t\t\t}\n\t\t\t// console.log(button, button_text, button_text_phrases);\n\t\t\tfor (const button_text_phrase of button_text_phrases) {\n\t\t\t\tconst match_phrases = [button_text_phrase, `hit ${button_text_phrase}`, `press ${button_text_phrase}`, `click ${button_text_phrase}`, `click on ${button_text_phrase}`];\n\t\t\t\tfor (const match_phrase of match_phrases) {\n\t\t\t\t\t// console.log(match_phrase, ` ${command} `.toLowerCase().indexOf(` ${match_phrase.toLowerCase()} `));\n\t\t\t\t\tif (` ${input_text} `.toLowerCase().indexOf(` ${match_phrase.toLowerCase()} `) !== -1) {\n\t\t\t\t\t\tadd_interpretation({\n\t\t\t\t\t\t\tmatch_text: match_phrase,\n\t\t\t\t\t\t\texec: ((el) => () => {\n\t\t\t\t\t\t\t\tconsole.log(\"activate\", el);\n\t\t\t\t\t\t\t\tif (el.tagName === \"LABEL\") {\n\t\t\t\t\t\t\t\t\tif (el.hasAttribute(\"for\")) {\n\t\t\t\t\t\t\t\t\t\tel = document.getElementById(el.getAttribute(\"for\"));\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tel = el.querySelector(\"input\");\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 (el.matches(\"input[type=checkbox]\")) {\n\t\t\t\t\t\t\t\t\tconst checkbox = /** @type {HTMLInputElement} */ (el);\n\t\t\t\t\t\t\t\t\tcheckbox.checked = !checkbox.checked;\n\t\t\t\t\t\t\t\t} else if (el.matches(\"input[type=radio]\")) {\n\t\t\t\t\t\t\t\t\tconst radio = /** @type {HTMLInputElement} */ (el);\n\t\t\t\t\t\t\t\t\tradio.checked = true;\n\t\t\t\t\t\t\t\t} else if (el.matches(\".menu-button\")) {\n\t\t\t\t\t\t\t\t\t// pointerdown is needed, as of writing, for activating os-gui.js's menu items\n\t\t\t\t\t\t\t\t\t// if click event is supported in future, this can be simplified\n\t\t\t\t\t\t\t\t\tconst pointerdown = new PointerEvent(\"pointerdown\", {\n\t\t\t\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\t\t\t\tcancelable: true,\n\t\t\t\t\t\t\t\t\t\tpointerId: 12345,\n\t\t\t\t\t\t\t\t\t\tpointerType: \"mouse\",\n\t\t\t\t\t\t\t\t\t\tisPrimary: true,\n\t\t\t\t\t\t\t\t\t\t// target: el,\n\t\t\t\t\t\t\t\t\t\tbutton: 0,\n\t\t\t\t\t\t\t\t\t\tbuttons: 1,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t// not sure if pointerup helps at all\n\t\t\t\t\t\t\t\t\tconst pointerup = new PointerEvent(\"pointerup\", {\n\t\t\t\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\t\t\t\tcancelable: true,\n\t\t\t\t\t\t\t\t\t\tpointerId: 12345,\n\t\t\t\t\t\t\t\t\t\tpointerType: \"mouse\",\n\t\t\t\t\t\t\t\t\t\tisPrimary: true,\n\t\t\t\t\t\t\t\t\t\t// target: el,\n\t\t\t\t\t\t\t\t\t\tbutton: 0,\n\t\t\t\t\t\t\t\t\t\tbuttons: 0,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tel.dispatchEvent(pointerdown);\n\t\t\t\t\t\t\t\t\tel.dispatchEvent(pointerup);\n\t\t\t\t\t\t\t\t} else if (el.tagName === \"BUTTON\") {\n\t\t\t\t\t\t\t\t\tclickButtonVisibly(el);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tel.focus();\n\t\t\t\t\t\t\t\t\tel.click();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})(button),\n\t\t\t\t\t\t\tprioritize: !!button.closest(\".menu-popup\"),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// after the above to allow for \"draw a stop sign\", \"stop dwell clicking\"\n\t\tif (interpretations.length === 0) {\n\t\t\tconst stop_match = input_text.match(/\\b(?:stop|end|cease|(?:that's|that is) enough|enough of that|terminate|halt|put an end to(?: this)?|break off)(?: (?:drawing|sketching|painting|doodling|rendering))?\\b/i);\n\t\t\tif (stop_match) {\n\t\t\t\tadd_interpretation({\n\t\t\t\t\tmatch_text: stop_match[0],\n\t\t\t\t\ttype: \"stop-drawing\",\n\t\t\t\t\texec: () => {\n\t\t\t\t\t\tstopSimulatingGestures();\n\t\t\t\t\t\ttrace_and_sketch_stop();\n\t\t\t\t\t},\n\t\t\t\t\tprioritize: true,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// @TODO: don't support saying simply \"1 pixel\" if an input is focused\n\t\t// @TODO: \"pencil size\" (also select appropriate tool? altho you might say \"brush size\" for other tools)\n\t\tconst line_width_match = input_text.match(/\\b(?:set|use|pick)? ?(?:(?:line|stroke|outline) (?:width|size|thickness))? ?(?:to)? ?(\\d+|single|zero|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty|a hundred|one hundred|smallest|largest|littlest|biggest|small|large|little|big|tiny|huge|puny|massive|medium) ?(?:px|pixels?)? ?(?:(?:wide|thick|sized)? ?(?:for)? ?(?:(?:out)?lines?)?|(?:width|size|thickness)) ?(?:(?:out)?lines?)?\\b/i);\n\t\tif (line_width_match) {\n\t\t\tconst size_str = line_width_match[1];\n\t\t\tlet n = parseInt(size_str, 10);\n\t\t\tswitch (size_str.toLowerCase()) {\n\t\t\t\tcase \"zero\": n = 0; break;\n\t\t\t\tcase \"single\": n = 1; break;\n\t\t\t\tcase \"one\": n = 1; break;\n\t\t\t\tcase \"two\": n = 2; break;\n\t\t\t\tcase \"three\": n = 3; break;\n\t\t\t\tcase \"four\": n = 4; break;\n\t\t\t\tcase \"five\": n = 5; break;\n\t\t\t\tcase \"six\": n = 6; break;\n\t\t\t\tcase \"seven\": n = 7; break;\n\t\t\t\tcase \"eight\": n = 8; break;\n\t\t\t\tcase \"nine\": n = 9; break;\n\t\t\t\tcase \"ten\": n = 10; break;\n\t\t\t\tcase \"eleven\": n = 11; break;\n\t\t\t\tcase \"twelve\": n = 12; break;\n\t\t\t\tcase \"thirteen\": n = 13; break;\n\t\t\t\tcase \"fourteen\": n = 14; break;\n\t\t\t\tcase \"fifteen\": n = 15; break;\n\t\t\t\tcase \"sixteen\": n = 16; break;\n\t\t\t\tcase \"seventeen\": n = 17; break;\n\t\t\t\tcase \"eighteen\": n = 18; break;\n\t\t\t\tcase \"nineteen\": n = 19; break;\n\t\t\t\tcase \"twenty\": n = 20; break;\n\t\t\t\tcase \"a hundred\": n = 100; break;\n\t\t\t\tcase \"one hundred\": n = 100; break;\n\t\t\t}\n\t\t\tadd_interpretation({\n\t\t\t\tmatch_text: line_width_match[0],\n\t\t\t\tsize: n,\n\t\t\t\texec: () => {\n\t\t\t\t\tif (isFinite(n)) {\n\t\t\t\t\t\t// @TODO: DRY with app.js\n\t\t\t\t\t\tif (selected_tool.id === TOOL_BRUSH) {\n\t\t\t\t\t\t\tbrush_size = Math.max(1, Math.min(n, 500));\n\t\t\t\t\t\t} else if (selected_tool.id === TOOL_ERASER) {\n\t\t\t\t\t\t\teraser_size = Math.max(1, Math.min(n, 500));\n\t\t\t\t\t\t} else if (selected_tool.id === TOOL_AIRBRUSH) {\n\t\t\t\t\t\t\tairbrush_size = Math.max(1, Math.min(n, 500));\n\t\t\t\t\t\t} else if (selected_tool.id === TOOL_PENCIL) {\n\t\t\t\t\t\t\tpencil_size = Math.max(1, Math.min(n, 50));\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\tselected_tool.id === TOOL_LINE ||\n\t\t\t\t\t\t\tselected_tool.id === TOOL_CURVE ||\n\t\t\t\t\t\t\tselected_tool.id === TOOL_RECTANGLE ||\n\t\t\t\t\t\t\tselected_tool.id === TOOL_ROUNDED_RECTANGLE ||\n\t\t\t\t\t\t\tselected_tool.id === TOOL_ELLIPSE ||\n\t\t\t\t\t\t\tselected_tool.id === TOOL_POLYGON\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tstroke_size = Math.max(1, Math.min(n, 500));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$G.trigger(\"option-changed\");\n\t\t\t\t\t\tif (button !== undefined && pointer) { // pointer may only be needed for tests\n\t\t\t\t\t\t\tselected_tools.forEach((selected_tool) => {\n\t\t\t\t\t\t\t\ttool_go(selected_tool);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tupdate_helper_layer();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tshow_error_message(`Keywords like '${line_width_match[1]}' are not supported yet. Try a number of pixels instead.`);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// @TODO: \"scroll to bottom\", \"scroll by three pages\" etc.\n\t\tconst scrolling_regexp = /\\b(?:(?:scroll|pan|move|page)(?:(?: the)? view(?:port)?)?|go|view(?:port)?|look)( to( the)?)? (?:up|down|left|right|north|south|west|east|north ?west|south ?west|north ?east|south ?east)(?:wards?)?(( and)?( to( the)?)? (?:up|down|left|right|north|south|west|east)(wards?)?)?\\b(( by)?( a| one)? page)?/i;\n\t\tconst scroll_match = input_text.match(scrolling_regexp);\n\t\tif (scroll_match) {\n\t\t\tconst directions = scroll_match[0];\n\t\t\tconst vector = { x: 0, y: 0 };\n\t\t\tif (directions.match(/up|north/i)) {\n\t\t\t\tvector.y = -1;\n\t\t\t}\n\t\t\tif (directions.match(/down|south/i)) {\n\t\t\t\tvector.y = +1;\n\t\t\t}\n\t\t\tif (directions.match(/left|west/i)) {\n\t\t\t\tvector.x = -1;\n\t\t\t}\n\t\t\tif (directions.match(/right|east/i)) {\n\t\t\t\tvector.x = +1;\n\t\t\t}\n\t\t\tconst scroll_pane_el = $(\".window *\").toArray().filter((el) => el.scrollWidth > el.clientWidth || el.scrollHeight > el.clientHeight)[0] || $canvas_area[0];\n\t\t\tadd_interpretation({\n\t\t\t\tmatch_text: scroll_match[0],\n\t\t\t\texec: () => {\n\t\t\t\t\tconst factor = directions.match(/page/) ? 1 : 1 / 2;\n\t\t\t\t\t// scroll_pane_el.scrollLeft += vector.x * scroll_pane_el.clientWidth * factor;\n\t\t\t\t\t// scroll_pane_el.scrollTop += vector.y * scroll_pane_el.clientHeight * factor;\n\t\t\t\t\t$(scroll_pane_el).animate({\n\t\t\t\t\t\tscrollLeft: scroll_pane_el.scrollLeft + vector.x * scroll_pane_el.clientWidth * factor,\n\t\t\t\t\t\tscrollTop: scroll_pane_el.scrollTop + vector.y * scroll_pane_el.clientHeight * factor,\n\t\t\t\t\t}, 500);\n\t\t\t\t},\n\t\t\t\tvector,\n\t\t\t\tprioritize: true,\n\t\t\t});\n\t\t}\n\n\t\tif (document.activeElement && document.activeElement.matches(textual_input_selector)) {\n\t\t\tconst new_line_match = input_text.match(/^(?:new line|newline|line break|return|enter|carriage return|)$|\\b(?:(?:insert|add|put|put in|input)(?: an?)? (?:new line|newline|line break|return|enter|carriage return))\\b/i);\n\t\t\tif (new_line_match) {\n\t\t\t\tadd_interpretation({\n\t\t\t\t\tmatch_text: new_line_match[0],\n\t\t\t\t\texec: () => {\n\t\t\t\t\t\tdocument.execCommand(\"insertText\", false, \"\\n\");\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (window.textbox) {\n\t\t\tconst stop_match = input_text.match(/\\b(?:(?:finish(?:ed)?|done)(?: with)? (text|text input|textbox|text box|writing))\\b/i);\n\t\t\tif (stop_match) {\n\t\t\t\tadd_interpretation({\n\t\t\t\t\tmatch_text: stop_match[0],\n\t\t\t\t\texec: deselect,\n\t\t\t\t\tprioritize: true,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (window.selection) {\n\t\t\tconst stop_match = input_text.match(/\\b(?:(?:finish(?:ed)?|done)(?: with)? selection|deselect|unselect)\\b/i);\n\t\t\tif (stop_match) {\n\t\t\t\tadd_interpretation({\n\t\t\t\t\tmatch_text: stop_match[0],\n\t\t\t\t\texec: deselect,\n\t\t\t\t\tprioritize: true,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (interpretations.length === 0 && default_to_entering_text && input_text.length) {\n\t\t\tif (document.activeElement && document.activeElement.matches(textual_input_selector)) {\n\t\t\t\tconst text_to_insert = input_text.replace(/new[ -]?line|line[ -]?break|carriage return/g, \"\\n\");\n\t\t\t\tadd_interpretation({\n\t\t\t\t\tmatch_text: input_text,\n\t\t\t\t\texec: () => {\n\t\t\t\t\t\tif (document.activeElement && document.activeElement.matches(\"input[type='number']\")) {\n\t\t\t\t\t\t\t/** @type HTMLInputElement */ (document.activeElement).value = input_text;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdocument.execCommand(\"insertText\", false, text_to_insert);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tprioritize: true,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// @TODO: more nuanced command matching, probably multiplying confidence levels together\n\t\t// and giving lower confidence for things that start in the middle of the phrase\n\t\t// and like higher confidence in \"stop\" if it's actively drawing\n\n\t\treturn interpretations;\n\t};\n\n\ttrace_and_sketch = (subject_imagedata) => {\n\t\ttrace_and_sketch_stop();\n\n\t\t// @TODO: clickable cancel button? (in addition to Escape key handling and the \"stop\" voice command)\n\n\t\t// I'm suggesting saying \"stop drawing\" rather than \"stop\" because I think it's more likely to be picked up as speech at all\n\t\t$status_text.text(`To stop drawing, ${speech_recognition_active ? `say \"stop drawing\", or ` : \"\"}press Esc.`);\n\n\t\t// const subject_imagedata = ctx.getImageData(0, 0, canvas.width, canvas.height);\n\t\t// const pal = palette.map((color)=> get_rgba_from_color(color)).map(([r, g, b, a])=> ({r, g, b, a}));\n\t\tconst trace_data = ImageTracer.imagedataToTracedata(subject_imagedata, { ltres: 1, qtres: 0.01, scale: 10, /*pal,*/ numberofcolors: 6 });\n\t\tconst { layers } = trace_data;\n\t\tconst brush = get_tool_by_id(TOOL_BRUSH);\n\t\tselect_tool(brush);\n\n\t\tlet layer_index = 0;\n\t\tlet path_index = 0;\n\t\tlet segment_index = 0;\n\t\tlet active_path;\n\t\t// @ts-ignore (@types/node is annoyingly loaded even though it's a transitive dependency)\n\t\t// (I tried configuring `types` in jsconfig.json, but it didn't work. I tried tsconfig.json, but it broke finding ambient declarations in VS Code.)\n\t\tsketching_iid = setInterval(() => {\n\t\t\tconst layer = layers[layer_index];\n\t\t\tif (!layer) {\n\t\t\t\tclearInterval(sketching_iid);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst path = layer[path_index];\n\t\t\tif (!path) {\n\t\t\t\tpath_index = 0;\n\t\t\t\tsegment_index = 0;\n\t\t\t\tlayer_index += 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst segment = path.segments[segment_index];\n\t\t\tif (!segment) {\n\t\t\t\tsegment_index = 0;\n\t\t\t\tpath_index += 1;\n\t\t\t\tbrush.pointerup(main_ctx, pointer.x, pointer.y);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet { x1, y1, x2, y2 } = segment;\n\t\t\tif (path !== active_path) {\n\t\t\t\tpointer_previous = { x: x1, y: y1 };\n\t\t\t\tpointer = { x: x1, y: y1 };\n\t\t\t\tbrush.pointerdown(main_ctx, x1, y1);\n\t\t\t\tactive_path = path;\n\t\t\t}\n\t\t\tpointer_previous = { x: x1, y: y1 };\n\t\t\tpointer = { x: x2, y: y2 };\n\t\t\tbrush.paint(main_ctx, x2, y2);\n\t\t\tpointer_active = true;\n\t\t\tpointer_over_canvas = true;\n\t\t\tupdate_helper_layer();\n\t\t\tsegment_index += 1;\n\t\t}, 20);\n\t};\n\ttrace_and_sketch_stop = () => {\n\t\tclearInterval(sketching_iid);\n\t\tpointer_active = false;\n\t\tpointer_over_canvas = false;\n\t};\n\n\tfunction find_clipart_and_sketch(subject_matter) {\n\t\tfind_clipart(subject_matter).then((results) => {\n\n\t\t\t// @TODO: select less complex images (less file size to width, say?) maybe, and/or better semantic matches by looking for the search terms in the title?\n\t\t\t// detect gradients / spread out histogram at least, and reject based on that\n\t\t\tlet image_url = results[~~(Math.random() * results.length)].image_url;\n\t\t\tconsole.log(\"Using source image:\", image_url);\n\t\t\tif (!image_url.match(/^data:/)) {\n\t\t\t\timage_url = `https://jspaint-cors-proxy.herokuapp.com/${image_url}`;\n\t\t\t}\n\t\t\tconst img = new Image();\n\t\t\timg.crossOrigin = \"Anonymous\";\n\t\t\timg.onerror = () => {\n\t\t\t\t$status_text.text(\"Failed to load clipart.\");\n\t\t\t};\n\t\t\timg.onload = () => {\n\t\t\t\t// @TODO: find an empty spot on the canvas for the sketch, smaller if need be\n\t\t\t\tconst max_sketch_width = 500;\n\t\t\t\tconst max_sketch_height = 500;\n\t\t\t\tlet aspect_ratio = img.width / img.height;\n\t\t\t\tlet width = Math.min(img.width, max_sketch_width);\n\t\t\t\tlet height = Math.min(img.height, max_sketch_height);\n\t\t\t\tif (width / height < aspect_ratio) {\n\t\t\t\t\theight = width / aspect_ratio;\n\t\t\t\t}\n\t\t\t\tif (width / height > aspect_ratio) {\n\t\t\t\t\twidth = height * aspect_ratio;\n\t\t\t\t}\n\t\t\t\tconst img_canvas = make_canvas(width, height);\n\t\t\t\timg_canvas.ctx.drawImage(img, 0, 0, width, height);\n\t\t\t\tconst image_data = img_canvas.ctx.getImageData(0, 0, img_canvas.width, img_canvas.height);\n\t\t\t\tresize_canvas_without_saving_dimensions(Math.max(main_canvas.width, image_data.width), Math.max(main_canvas.height, image_data.height));\n\t\t\t\ttrace_and_sketch(image_data);\n\t\t\t};\n\t\t\timg.src = image_url;\n\t\t}, (error) => {\n\t\t\tif (error.code === \"no-results\") {\n\t\t\t\t$status_text.text(`No clipart found for '${subject_matter}'`);\n\t\t\t} else {\n\t\t\t\tshow_error_message(\"Failed to find clipart.\", error);\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction find_clipart(query) {\n\t\tconst bing_url = new URL(`https://www.bing.com/images/search?q=${encodeURIComponent(query)}&qft=+filterui:photo-clipart&FORM=IRFLTR`);\n\t\treturn fetch(`https://jspaint-cors-proxy.herokuapp.com/${bing_url}`)\n\t\t\t.then((response) => response.text())\n\t\t\t.then((html) => {\n\t\t\t\t// handle relative data-src\n\t\t\t\thtml = html.replace(\n\t\t\t\t\t/((?:data-src)=[\"'])(?!(?:https?:|data:))(\\/?)/gi,\n\t\t\t\t\t(_$0, $1, $2) => `${$1}${bing_url.origin}${$2 ? bing_url.pathname : \"\"}`\n\t\t\t\t);\n\t\t\t\t// handle relative src and href in a less error-prone way, with a <base> tag\n\t\t\t\tconst doc = new DOMParser().parseFromString(html, \"text/html\");\n\t\t\t\tconst $html = $(doc.documentElement);\n\t\t\t\tconst base = doc.createElement(\"base\");\n\t\t\t\tbase.href = bing_url.origin + bing_url.pathname;\n\t\t\t\tdoc.head.appendChild(base);\n\n\t\t\t\twindow.search_page_html = html;\n\t\t\t\twindow.search_page_$html = $html;\n\t\t\t\tconsole.log(\"window.search_page_html and window.search_page_$html are a available for debugging\");\n\n\t\t\t\tconst validate_item = (item) => item.image_url && (item.image_url.match(/^data:/) ? item.image_url.length > 1000 : true);\n\n\t\t\t\tlet items = $html.find(\"[m]\").toArray()\n\t\t\t\t\t.map((el) => el.getAttribute(\"m\"))\n\t\t\t\t\t.map((json) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\treturn JSON.parse(json);\n\t\t\t\t\t\t} catch (_error) {\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.filter((maybe_parsed) => maybe_parsed && maybe_parsed.murl)\n\t\t\t\t\t.map(({ murl, t }) => ({ image_url: murl, title: t || \"\" }))\n\t\t\t\t\t.filter(validate_item);\n\n\t\t\t\t// fallback to thumbnails in case they get rid of the \"m\" attribute (thumbnails are not as good, more likely to be jpeg)\n\t\t\t\tif (items.length === 0) {\n\t\t\t\t\tconsole.log(\"Fallback to thumbnails\");\n\t\t\t\t\titems = /** @type {HTMLImageElement[]} */($html.find(\"img.mimg\").toArray())\n\t\t\t\t\t\t.map((el) => ({ image_url: el.src || el.dataset.src, title: \"\" }))\n\t\t\t\t\t\t.filter(validate_item);\n\t\t\t\t}\n\t\t\t\t// fallback in case they also change the class for images (this may match totally irrelevant things)\n\t\t\t\tif (items.length === 0) {\n\t\t\t\t\tconsole.log(\"Fallback to most imgs\");\n\t\t\t\t\titems = /** @type {HTMLImageElement[]} */($html.find(\"img:not(.sw_spd):not(.rms_img):not(.flagIcon)\").toArray())\n\t\t\t\t\t\t.filter((el) => !el.closest(\"[role='navigation'], nav\")) // ignore \"Related searches\", \"Refine your search\" etc.\n\t\t\t\t\t\t.map((el) => ({ image_url: el.src || el.dataset.src, title: \"\" }))\n\t\t\t\t\t\t.filter(validate_item);\n\t\t\t\t}\n\t\t\t\tconsole.log(`Search results for '${query}':`, items);\n\t\t\t\tif (items.length === 0) {\n\t\t\t\t\tconst error = new Error(`failed to get clipart: no results returned for query '${query}'`);\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\terror.code = \"no-results\";\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn items;\n\t\t\t});\n\t}\n\n\tfunction clickButtonVisibly(button) {\n\n\t\t// pointerdown/pointerup may have been just for os-gui.js's menus, which are now handled separately\n\t\t// I should probably remove this part\n\t\t$(button).trigger($.Event(\"pointerdown\", {\n\t\t\tpointerId: 12345,\n\t\t\tpointerType: \"mouse\",\n\t\t\tbutton: 0,\n\t\t\tbuttons: 1,\n\t\t\tisPrimary: true,\n\t\t}));\n\t\t$(button).trigger($.Event(\"pointerup\", {\n\t\t\tpointerId: 12345,\n\t\t\tpointerType: \"mouse\",\n\t\t\tbutton: 0,\n\t\t\tbuttons: 0,\n\t\t\tisPrimary: true,\n\t\t}));\n\n\t\tif (button.matches(\"button:not(.toggle)\")) {\n\t\t\tbutton.style.borderImage = \"var(--inset-deep-border-image)\";\n\t\t\tsetTimeout(() => {\n\t\t\t\tbutton.style.borderImage = \"\";\n\t\t\t\t// delay the button.click() as well, so the pressed state is\n\t\t\t\t// visible even if the button action closes a dialog\n\t\t\t\twindow.untrusted_gesture = true;\n\t\t\t\tbutton.click();\n\t\t\t\twindow.untrusted_gesture = false;\n\t\t\t}, 100);\n\t\t} else {\n\t\t\twindow.untrusted_gesture = true;\n\t\t\tbutton.click();\n\t\t\twindow.untrusted_gesture = false;\n\t\t}\n\t}\n\n\tfunction escapeRegExp(string) {\n\t\treturn string.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"); // $& means the whole matched string\n\t}\n\n\tfunction test_command(input_text, expected, from_speech_text) {\n\t\tconst interpretations = interpret_command(input_text);\n\t\tconst failed_message = `Failed test.${from_speech_text ? ` (From speech '${from_speech_text}')` : \"\"}`;\n\t\tif (expected === null) {\n\t\t\tif (interpretations.length > 0) {\n\t\t\t\tconsole.error(`${failed_message}\n\tExpected '${input_text}' to have no interpretations; saw`, interpretations);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (interpretations.length === 0) {\n\t\t\tconsole.error(`${failed_message}\n\tExpected '${input_text}' to be interpreted as`, expected, \"but found no interpretations\");\n\t\t\treturn;\n\t\t}\n\t\tconst interpretation = choose_interpretation(interpretations);\n\t\tconst actual = Object.assign({}, interpretation, { prioritize: undefined, exec: undefined });\n\t\t// expected.match_text = expected.match_text || input_text; // puts key in wrong order\n\t\texpected = Object.assign({ match_text: input_text }, expected);\n\t\tconst expected_json = JSON.stringify(expected, null, 4);\n\t\tconst actual_json = JSON.stringify(actual, null, 4);\n\t\tif (expected_json !== actual_json) {\n\t\t\tconsole.error(`${failed_message}\n\tExpected '${input_text}' to be interpreted as ${expected_json} but it was interpreted as ${actual_json}\n\tNote: object key order matters in this test! Functions don't count.\n\tAll interpretations:`, interpretations);\n\t\t\treturn;\n\t\t}\n\t\tif (!from_speech_text) {\n\t\t\t// Also verify that if you said exactly this input, speech recognition fixes would not mess it up.\n\t\t\tconst fixed_up_input_text = fix_up_speech_recognition(input_text);\n\t\t\tif (fixed_up_input_text !== input_text) {\n\t\t\t\tconsole.error(`Failed test. Speech recognition fixup changed the input from:\n\t'${input_text}' to:\n\t'${fixed_up_input_text}'`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction test_speech(input_text, expected) {\n\t\tconst fixed_up_input_text = fix_up_speech_recognition(input_text);\n\t\tif (typeof expected === \"string\") {\n\t\t\tif (fixed_up_input_text !== expected) {\n\t\t\t\tconsole.error(`Failed test. Speech recognition fixup changed the input from:\n\t'${input_text}' to:\n\t'${fixed_up_input_text}' instead of:\n\t'${expected}'`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\t\t\ttest_command(fixed_up_input_text, expected, input_text);\n\t\t}\n\t}\n\n\tfunction test_speech_recognition() {\n\t\t// test_command(\"select blue\", {color: \"blue\"}); // @FIXME\n\t\ttest_command(\"select fill\", { tool_id: TOOL_FILL });\n\t\ttest_command(\"select text\", { tool_id: TOOL_TEXT });\n\t\ttest_command(\"select\", { tool_id: TOOL_SELECT });\n\t\ttest_speech(\"free form select\", { tool_id: TOOL_FREE_FORM_SELECT });\n\t\ttest_speech(\"lips\", { match_text: \"ellipse\", tool_id: TOOL_ELLIPSE });\n\t\ttest_command(\"\", null);\n\t\t// test_command(\"I got you some new books\", null);\n\t\t// test_command(\"pan view sorthweast\", null); // currently opens View menu\n\t\ttest_command(\"1 pixel lines\", { size: 1 });\n\t\ttest_command(\"1 pixel wide lines\", { size: 1 });\n\t\ttest_command(\"set line width to 5\", { size: 5 });\n\t\t// test_command(\"use medium-small stroke size\", {match_text: \"use medium-small stroke size\", size: NaN});\n\t\ttest_speech(\"set line lips to a hundred\", { match_text: \"set line width to a hundred\", size: 100 });\n\t\ttest_command(\"use stroke size 10 pixels\", { size: 10 });\n\t\t// test_command(\"use stroke size of 10 pixels\", {match_text: \"use stroke size of 10 pixels\", size: 10});\n\t\ttest_command(\"draw a :-)\", { sketch_subject: \"smiley face\" });\n\t\t// test_command(\"draw sample text\", {sketch_subject: \"sample text\"}); // @FIXME\n\t\ttest_command(\"end\", { type: \"stop-drawing\" });\n\t\ttest_command(\"stop\", { type: \"stop-drawing\" });\n\t\ttest_command(\"draw a stop sign\", { sketch_subject: \"stop sign\" });\n\n\t\ttest_command(\"pan view southwest\", { vector: { x: -1, y: +1 } });\n\t\ttest_command(\"pan southeast\", { vector: { x: +1, y: +1 } });\n\t\ttest_command(\"move view northwest\", { vector: { x: -1, y: -1 } });\n\t\ttest_command(\"view northwest\", { vector: { x: -1, y: -1 } });\n\t\ttest_command(\"move viewport northwest\", { vector: { x: -1, y: -1 } });\n\t\ttest_command(\"pan down\", { vector: { x: 0, y: +1 } });\n\t\ttest_command(\"scroll down\", { vector: { x: 0, y: +1 } });\n\t\ttest_command(\"go downwards\", { vector: { x: 0, y: +1 } });\n\t\ttest_command(\"go upward\", { vector: { x: 0, y: -1 } });\n\t\ttest_command(\"go downwards and to the left\", { vector: { x: -1, y: +1 } });\n\t\ttest_command(\"go up to the left\", { vector: { x: -1, y: -1 } });\n\t\ttest_speech(\"cool up\", { match_text: \"go up\", vector: { x: 0, y: -1 } });\n\t\ttest_command(\"scroll the view southward\", { vector: { x: 0, y: +1 } });\n\n\t}\n\n\tvar should_test_speech_recognition = false;\n\ttry {\n\t\tshould_test_speech_recognition = localStorage.test_speech_recognition === \"true\";\n\t} catch (_error) { /* ignore */ }\n\tif (should_test_speech_recognition) {\n\t\t$(test_speech_recognition);\n\t}\n\n}\n"
  },
  {
    "path": "src/storage.js",
    "content": "// @ts-check\n\n// @TODO: maybe replace this module with localforage or similar\n// (but need to address asynchronous concerns if doing that)\n\n/** @type {LocalStore} */\nconst localStore = {\n\t/**\n\t * See overrides in interface LocalStore.\n\t * @param {string | string[] | Record<string, string>} key_or_keys_or_pairs\n\t * @param {((error: Error, value_or_values?: string) => void) | ((error: Error, value_or_values?: Record<string, string>) => void)} callback\n\t */\n\tget(key_or_keys_or_pairs, callback) {\n\t\tlet obj;\n\t\ttry {\n\t\t\tif (typeof key_or_keys_or_pairs === \"string\") {\n\t\t\t\tconst key = key_or_keys_or_pairs;\n\t\t\t\tconst item = localStorage.getItem(key);\n\t\t\t\tif (item) {\n\t\t\t\t\tobj = JSON.parse(item);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tobj = {};\n\t\t\t\tif (Array.isArray(key_or_keys_or_pairs)) {\n\t\t\t\t\tconst keys = key_or_keys_or_pairs;\n\t\t\t\t\tfor (let i = 0, len = keys.length; i < len; i++) {\n\t\t\t\t\t\tconst key = keys[i];\n\t\t\t\t\t\tconst item = localStorage.getItem(key);\n\t\t\t\t\t\tif (item) {\n\t\t\t\t\t\t\tobj[key] = JSON.parse(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst keys_obj = key_or_keys_or_pairs;\n\t\t\t\t\tfor (const key in keys_obj) {\n\t\t\t\t\t\tlet defaultValue = keys_obj[key];\n\t\t\t\t\t\tconst item = localStorage.getItem(key);\n\t\t\t\t\t\tif (item) {\n\t\t\t\t\t\t\tobj[key] = JSON.parse(item);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tobj[key] = defaultValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tcallback(error);\n\t\t\treturn;\n\t\t}\n\t\tcallback(null, obj);\n\t},\n\t/**\n\t * See overrides in interface LocalStore.\n\t * @param {string | Record<string, string>} key_or_pairs\n\t * @param {string | ((error: Error) => void)} value_or_callback\n\t * @param {(error: Error) => void} [callback]\n\t */\n\tset(key_or_pairs, value_or_callback, callback) {\n\t\tlet to_set = {};\n\t\tif (typeof key_or_pairs === \"string\") {\n\t\t\tto_set = {\n\t\t\t\t[key_or_pairs]: value_or_callback,\n\t\t\t};\n\t\t} else if (Array.isArray(key_or_pairs)) {\n\t\t\tthrow new TypeError(\"Cannot set an array of keys (to what?)\");\n\t\t} else {\n\t\t\tto_set = key_or_pairs;\n\t\t\tcallback = /** @type {(error: Error) => void} */ (value_or_callback);\n\t\t}\n\t\tfor (const key in to_set) {\n\t\t\tconst value = to_set[key];\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem(key, JSON.stringify(value));\n\t\t\t} catch (error) {\n\t\t\t\terror.quotaExceeded = error.code === 22 || error.name === \"NS_ERROR_DOM_QUOTA_REACHED\" || error.number === -2147024882;\n\t\t\t\tcallback(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\treturn callback(null);\n\t},\n};\n\nexport { localStore };\n\n"
  },
  {
    "path": "src/test-news.js",
    "content": "/*\nAutomated checks to catch errors before publishing a news update:\n- The <time> element's datetime attribute is set to the date of the update.\n- The <time> element's text content is set to the date of the update.\n- The id of the <article> is unique and follows the format 'news-YYYY-some-topic'.\n- All <a> elements have a target=\"_blank\" attribute.\n- All <a> elements have an href attribute.\n- All <img> elements have alt and non-empty src attributes.\n- Grave accent characters are checked for, as they should likely be <code> elements.\n\nHTML validity checking is not performed.\n*/\n\nconst newsEl = document.querySelector(\"#news\");\nconst articles = newsEl.querySelectorAll(\"article\");\nconst articleIDs = [];\nfor (const article of articles) {\n\t// Check id\n\tif (articleIDs.includes(article.id)) {\n\t\tconsole.error(`Duplicate article id: #${article.id}`, article);\n\t}\n\tarticleIDs.push(article.id);\n\tif (!article.id.startsWith(\"news-\")) {\n\t\tconsole.error(`Article id does not start with 'news-': #${article.id}`, article);\n\t}\n\n\t// Check date\n\tconst time = article.querySelector(\"time\");\n\tif (!time) {\n\t\tconsole.error(`Missing <time> element in article #${article.id}`, article);\n\t} else {\n\t\tconst datetime = time.getAttribute(\"datetime\");\n\t\tconst dateText = time.textContent;\n\t\tif (!datetime) {\n\t\t\tconsole.error(`Missing datetime attribute in <time> element in article #${article.id}`, time);\n\t\t}\n\t\tif (!dateText) {\n\t\t\tconsole.error(`Missing text content in <time> element in article #${article.id}`, time);\n\t\t}\n\t\t// This doesn't handle time zones:\n\t\t// if (new Date(datetime).toUTCString() !== new Date(dateText).toUTCString()) {\n\t\t// \tconsole.error(\n\t\t// \t\t`Mismatch between datetime attribute and text content in <time> element in article #${article.id}`,\n\t\t// \t\ttime,\n\t\t// \t\t`\\ndatetime: ${datetime}`,\n\t\t// \t\t`\\ntext: ${dateText}`,\n\t\t// \t\t`\\n${new Date(datetime).toUTCString()} !== ${new Date(dateText).toUTCString()}`\n\t\t// \t);\n\t\t// }\n\t\t// I'm just using ISO 8601 date format for now.\n\t\tif (datetime && dateText && datetime !== dateText) {\n\t\t\tconsole.error(\n\t\t\t\t`Mismatch between datetime attribute and text content in <time> element in article #${article.id}`,\n\t\t\t\ttime,\n\t\t\t\t`\\n${JSON.stringify(datetime)} !== ${JSON.stringify(dateText)}`\n\t\t\t);\n\t\t}\n\t\tif (datetime) {\n\t\t\t// Check id matches date\n\t\t\tconst expectedYYYY = new Date(datetime).getFullYear().toString();\n\t\t\tif (!article.id.includes(`-${expectedYYYY}-`)) {\n\t\t\t\tconsole.error(`Article id does not contain expected year: #${article.id}`,\n\t\t\t\t\t`\\nexpected: \"-${expectedYYYY}-\"`,\n\t\t\t\t\t`\\nactual: ${JSON.stringify(article.id.substring(4, 10))}`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check links\n\tconst links = article.querySelectorAll(\"a\");\n\tfor (const link of links) {\n\t\tconst target = link.getAttribute(\"target\");\n\t\tconst href = link.getAttribute(\"href\");\n\t\tif (target !== \"_blank\") {\n\t\t\tconsole.error(`target is not \"_blank\"`, link);\n\t\t}\n\t\tif (!href) {\n\t\t\tconsole.error(\"href is not set\", link);\n\t\t}\n\t}\n\n\t// Check images\n\tconst images = article.querySelectorAll(\"img\");\n\tfor (const img of images) {\n\t\tconst hasAlt = img.hasAttribute(\"alt\");\n\t\tconst src = img.getAttribute(\"src\");\n\t\tif (!hasAlt) {\n\t\t\tconsole.error(\"img is missing alt (empty is often fine)\", img);\n\t\t}\n\t\tif (!src) {\n\t\t\tconsole.error(\"img is missing src URL\", img);\n\t\t}\n\t}\n\n\t// Check for grave accent characters which should probably be <code> elements\n\tconst graveAccentChars = article.textContent.match(/`/g);\n\tif (graveAccentChars) {\n\t\tconsole.error(`Found ${graveAccentChars.length} grave accent characters in article #${article.id}, pairs of which should likely be <code> elements`);\n\t}\n}\n"
  },
  {
    "path": "src/theme.js",
    "content": "// @ts-check\nconst default_theme = \"classic.css\";\nconst theme_storage_key = \"jspaint theme\";\nconst disable_seasonal_theme_key = \"jspaint disable seasonal theme\";\nconst href_for = (theme) => `styles/themes/${theme}`;\n\nlet iid;\nfunction wait_for_theme_loaded(theme, callback) {\n\tclearInterval(iid);\n\tiid = setInterval(() => {\n\t\tconst theme_loaded =\n\t\t\tgetComputedStyle(document.documentElement)\n\t\t\t\t.getPropertyValue(\"--theme-loaded\")\n\t\t\t\t.replace(/['\"]+/g, \"\").trim();\n\t\tif (theme_loaded === theme) {\n\t\t\tclearInterval(iid);\n\t\t\tcallback();\n\t\t}\n\t}, 15);\n}\n\nlet grinch_button;\nlet current_theme;\ntry {\n\tconst grinch = localStorage[disable_seasonal_theme_key] === \"true\";\n\tconst is_december = new Date().getMonth() === 11;\n\tconst running_tests = \"Cypress\" in window;\n\tif (is_december && !grinch && !running_tests) {\n\t\tcurrent_theme = \"winter.css\"; // overriding theme preference until you disable the seasonal theme\n\t\twait_for_theme_loaded(current_theme, () => { // could just wait for DOM to load, but theme is needed for the button styling\n\t\t\tmake_grinch_button();\n\t\t});\n\t} else {\n\t\tcurrent_theme = localStorage[theme_storage_key] || default_theme;\n\t}\n} catch (error) {\n\tconsole.error(error);\n\tcurrent_theme = default_theme;\n}\n\nconst theme_link = document.createElement(\"link\");\ntheme_link.rel = \"stylesheet\";\ntheme_link.type = \"text/css\";\ntheme_link.href = href_for(current_theme);\ntheme_link.id = \"theme-link\";\ndocument.head.appendChild(theme_link);\n\nupdate_not_for_modern_theme();\n\nconst get_theme = () => current_theme;\n\nconst set_theme = (theme) => {\n\tcurrent_theme = theme;\n\n\ttry {\n\t\tlocalStorage[theme_storage_key] = theme;\n\t\tlocalStorage[disable_seasonal_theme_key] = \"true\"; // any theme change disables seasonal theme (unless of course you select the seasonal theme)\n\t\tgrinch_button?.remove();\n\t} catch (_error) { /* ignore */ }\n\n\tconst signal_theme_load = () => {\n\t\t$(window).triggerHandler(\"theme-load\");\n\t\t$(window).trigger(\"resize\"); // not exactly, but get dynamic cursor to update its offset\n\t};\n\n\twait_for_theme_loaded(theme, signal_theme_load);\n\ttheme_link.href = href_for(theme);\n\n\tupdate_not_for_modern_theme();\n\n\tsignal_theme_load();\n};\n\nfunction update_not_for_modern_theme() {\n\tconst not_for_modern = /** @type {NodeListOf<HTMLLinkElement>} */(document.querySelectorAll(\"link.not-for-modern\"));\n\tfor (const link of not_for_modern) {\n\t\tlink.disabled = current_theme === \"modern.css\" || current_theme === \"modern-dark.css\" || current_theme === \"bubblegum.css\";\n\t}\n}\n\nfunction make_grinch_button() {\n\tconst button = document.createElement(\"button\");\n\tbutton.ariaLabel = \"Disable seasonal theme\";\n\tbutton.className = \"grinch-button\";\n\tlet clicked = false;\n\tlet smile = 0;\n\tlet momentum = 0;\n\tlet smile_target = 0;\n\tlet anim_id;\n\tconst num_frames = 38;\n\tconst frame_width = 100;\n\tbutton.onclick = () => {\n\t\tif (smile === smile_target) {\n\t\t\tsteal_christmas();\n\t\t}\n\t\tclicked = true;\n\t};\n\tconst start_smile = button.onmouseleave = () => {\n\t\tsmile_target = clicked ? 1 : 0;\n\t\tanimate();\n\t\tdocument.removeEventListener(\"touchmove\", document_touchmove);\n\t};\n\tconst stop_smile = button.onmouseenter = () => {\n\t\tsmile_target = 1;\n\t\tmomentum = Math.max(momentum, 0.02); // for the immediacy of the hover effect\n\t\tanimate();\n\t};\n\tbutton.onpointerdown = (event) => {\n\t\tif (event.pointerType === \"touch\") {\n\t\t\tstart_smile();\n\t\t\tdocument.addEventListener(\"touchmove\", document_touchmove);\n\t\t}\n\t};\n\t// Not using pointerleave because it includes when the finger is lifted off the screen\n\t// Maybe it would be easier to detect that case with event.button(s) though.\n\tfunction document_touchmove(event) {\n\t\tvar touch = event.touches[0];\n\t\tif (button !== document.elementFromPoint(touch.pageX, touch.pageY)) {\n\t\t\t// finger left the button\n\t\t\tclicked = false;\n\t\t\tstop_smile();\n\t\t}\n\t}\n\n\tfunction animate() {\n\t\tcancelAnimationFrame(anim_id);\n\t\tsmile += momentum * 0.5;\n\t\tmomentum *= 0.9; // set to 0.99 to test smile getting stuck (should be fixed)\n\t\tif (smile_target) {\n\t\t\tmomentum += 0.001;\n\t\t} else {\n\t\t\tif (smile < 0.4) {\n\t\t\t\tmomentum -= 0.0005; // slowing down the last bit of un-smiling (feels more natural; I wish there were more frames though)\n\t\t\t} else {\n\t\t\t\tmomentum -= 0.001;\n\t\t\t}\n\t\t}\n\t\tif (smile > 1) {\n\t\t\tsmile = 1;\n\t\t\tmomentum = 0;\n\t\t\tif (clicked) {\n\t\t\t\tsteal_christmas();\n\t\t\t}\n\t\t} else if (smile < 0) {\n\t\t\tsmile = 0;\n\t\t\tmomentum = 0;\n\t\t}\n\t\tif (smile !== smile_target) {\n\t\t\tanim_id = requestAnimationFrame(animate);\n\t\t}\n\t\tbutton.style.backgroundPosition = `${-Math.floor(smile * (num_frames - 1)) * frame_width}px 0px`;\n\t}\n\tfunction on_zoom_etc() {\n\t\t// scale to nearest pixel-perfect size\n\t\tbutton.style.transform = `scale(${Math.max(1, Math.floor(devicePixelRatio)) / devicePixelRatio})`;\n\t\tbutton.style.transformOrigin = \"bottom right\";\n\t\tbutton.style.imageRendering = \"pixelated\";\n\t}\n\twindow.addEventListener(\"resize\", on_zoom_etc);\n\ton_zoom_etc();\n\tfunction steal_christmas() {\n\t\tlet new_theme;\n\t\ttry {\n\t\t\tlocalStorage[disable_seasonal_theme_key] = \"true\";\n\t\t\tnew_theme = localStorage[theme_storage_key] || default_theme;\n\t\t} catch (_error) { /* ignore */ }\n\t\tif (new_theme === \"winter.css\") {\n\t\t\tnew_theme = default_theme;\n\t\t}\n\t\tset_theme(new_theme);\n\t\tbutton.remove();\n\t\twindow.removeEventListener(\"resize\", on_zoom_etc);\n\t\tdocument.removeEventListener(\"touchmove\", document_touchmove);\n\t}\n\tdocument.body.appendChild(button);\n\tgrinch_button = button;\n}\n\nexport { get_theme, set_theme };\n\n"
  },
  {
    "path": "src/tool-options.js",
    "content": "// @ts-check\n/* global stroke_size:writable, airbrush_size:writable, brush_shape:writable, brush_size:writable, eraser_size:writable, magnification:writable, tool_transparent_mode:writable */\nimport { set_magnification } from \"./functions.js\";\nimport { $G, E, make_canvas } from \"./helpers.js\";\nimport { render_brush, replace_colors_with_swatch, stamp_brush_canvas } from \"./image-manipulation.js\";\nimport { get_theme } from \"./theme.js\";\n\nconst ChooserCanvas = (\n\turl,\n\tinvert,\n\twidth,\n\theight,\n\tsourceX,\n\tsourceY,\n\tsourceWidth,\n\tsourceHeight,\n\tdestX,\n\tdestY,\n\tdestWidth,\n\tdestHeight,\n\treuse_canvas,\n) => {\n\tconst c = reuse_canvas(width, height);\n\tlet img = ChooserCanvas.cache[url];\n\tif (!img) {\n\t\timg = ChooserCanvas.cache[url] = E(\"img\");\n\t\timg.onerror = () => {\n\t\t\tdelete ChooserCanvas.cache[url];\n\t\t};\n\t\timg.src = url;\n\t}\n\tconst render = () => {\n\t\ttry {\n\t\t\tc.ctx.drawImage(\n\t\t\t\timg,\n\t\t\t\tsourceX, sourceY, sourceWidth, sourceHeight,\n\t\t\t\tdestX, destY, destWidth, destHeight\n\t\t\t);\n\t\t} catch (_error) { /* ignore */ }\n\t\t// if (invert) {\n\t\t// \tinvert_rgb(c.ctx); // can fail due to tainted canvas if running from file: protocol\n\t\t// }\n\t\tc.style.filter = invert ? \"invert()\" : \"\";\n\t};\n\t$(img).on(\"load\", render);\n\trender();\n\treturn c;\n};\nChooserCanvas.cache = {};\n\n// @TODO: convert all options to use this themeable version (or more options? some are dynamically rendered...)\nconst ChooserDiv = (\n\tclass_name,\n\tinvert,\n\twidth,\n\theight,\n\tsourceX,\n\tsourceY,\n\tsourceWidth,\n\tsourceHeight,\n\tdestX,\n\tdestY,\n\tdestWidth,\n\tdestHeight,\n\treuse_div,\n\tshift_y_by_1px_in_modern_theme_only,\n) => {\n\tconst div = reuse_div(width, height);\n\tdiv.classList.add(class_name);\n\tdiv.style.width = sourceWidth + \"px\";\n\tdiv.style.height = sourceHeight + \"px\";\n\n\t// @TODO: single listener for all divs\n\tconst on_zoom_etc = () => {\n\t\tconst modern = get_theme() === \"modern.css\" || get_theme() === \"modern-dark.css\" || get_theme() === \"bubblegum.css\";\n\t\tconst use_svg = modern ?\n\t\t\t// only use raster when screen pixels line up with image pixels exactly\n\t\t\t(window.devicePixelRatio !== 1) :\n\t\t\t// with nearest neighbor scaling, favor raster at larger integer sizes as well, for retro look\n\t\t\t(window.devicePixelRatio >= 3 || (window.devicePixelRatio % 1) !== 0);\n\t\tdiv.classList.toggle(\"use-svg\", use_svg);\n\t\t// The classic theme's transparency tool options spritesheet uses an\n\t\t// overlapped border, shared by the top and bottom options, as it is\n\t\t// simply a row of black for both, whereas the modern theme's spritesheet\n\t\t// uses a gradient in the border, and so does not use an overlap trick.\n\t\t// This might be clearer if I made the option \"shift_y_by_1px_in_classic_themes\" with the baseline being the modern theme's metrics.\n\t\tdiv.style.backgroundPosition = `${-sourceX}px ${-sourceY - (modern && shift_y_by_1px_in_modern_theme_only ? 1 : 0)}px`;\n\t};\n\tif (div._on_zoom_etc) { // condition is needed, otherwise it will remove all listeners! (leading to only the last graphic being updated when zooming)\n\t\t$G.off(\"theme-load resize\", div._on_zoom_etc);\n\t}\n\t$G.on(\"theme-load resize\", on_zoom_etc);\n\tdiv._on_zoom_etc = on_zoom_etc;\n\ton_zoom_etc();\n\n\tdiv.style.borderColor = \"transparent\";\n\tdiv.style.borderStyle = \"solid\";\n\tdiv.style.borderLeftWidth = destX + \"px\";\n\tdiv.style.borderTopWidth = destY + \"px\";\n\tdiv.style.borderRightWidth = (width - destX - destWidth) + \"px\";\n\tdiv.style.borderBottomWidth = (height - destY - destHeight) + \"px\";\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.style.filter = invert ? \"invert()\" : \"\";\n\treturn div;\n};\n\n\n/**\n * @template T\n * @param {T[]} things\n * @param {(thing: T, is_chosen: boolean, reuse_canvas: (width: number, height: number) => PixelCanvas, reuse_div: (width: number, height: number) => HTMLDivElement) => HTMLCanvasElement | HTMLDivElement} display\n * @param {(thing: T) => void} choose\n * @param {(thing: T) => boolean} is_chosen\n * @param {boolean=} gray_background_for_unselected\n * @returns {JQuery<HTMLDivElement> & { stroke?: boolean, fill?: boolean }}\n */\nconst $Choose = (things, display, choose, is_chosen, gray_background_for_unselected) => {\n\tconst $chooser = $(E(\"div\")).addClass(\"chooser\").css(\"touch-action\", \"none\");\n\tconst choose_thing = (thing) => {\n\t\tif (is_chosen(thing)) {\n\t\t\treturn;\n\t\t}\n\t\tchoose(thing);\n\t\t$G.trigger(\"option-changed\");\n\t};\n\t$chooser.on(\"update\", () => {\n\t\tif (!$chooser.is(\":visible\")) {\n\t\t\treturn;\n\t\t}\n\t\t$chooser.empty();\n\t\tfor (let i = 0; i < things.length; i++) {\n\t\t\t((thing) => {\n\t\t\t\tconst $option_container = $(E(\"div\")).addClass(\"chooser-option\").appendTo($chooser);\n\t\t\t\t// @ts-ignore\n\t\t\t\t$option_container.data(\"thing\", thing);\n\t\t\t\t/**\n\t\t\t\t * @param {number} width\n\t\t\t\t * @param {number} height\n\t\t\t\t * @returns {PixelCanvas}\n\t\t\t\t */\n\t\t\t\tconst reuse_canvas = (width, height) => {\n\t\t\t\t\tlet option_canvas = /** @type {PixelCanvas | undefined} */ ($option_container.find(\"canvas\")[0]);\n\t\t\t\t\tif (option_canvas) {\n\t\t\t\t\t\tif (option_canvas.width !== width) { option_canvas.width = width; }\n\t\t\t\t\t\tif (option_canvas.height !== height) { option_canvas.height = height; }\n\t\t\t\t\t} else {\n\t\t\t\t\t\toption_canvas = make_canvas(width, height);\n\t\t\t\t\t\t$option_container.append(option_canvas);\n\t\t\t\t\t}\n\t\t\t\t\treturn option_canvas;\n\t\t\t\t};\n\t\t\t\tconst reuse_div = (width, height) => {\n\t\t\t\t\tlet option_div = $option_container.find(\"div\")[0];\n\t\t\t\t\tif (option_div) {\n\t\t\t\t\t\tif (option_div.style.width !== width + \"px\") { option_div.style.width = width + \"px\"; }\n\t\t\t\t\t\tif (option_div.style.height !== height + \"px\") { option_div.style.height = height + \"px\"; }\n\t\t\t\t\t} else {\n\t\t\t\t\t\toption_div = E(\"div\");\n\t\t\t\t\t\toption_div.style.width = width + \"px\";\n\t\t\t\t\t\toption_div.style.height = height + \"px\";\n\t\t\t\t\t\t$option_container.append(option_div);\n\t\t\t\t\t}\n\t\t\t\t\treturn option_div;\n\t\t\t\t};\n\t\t\t\tconst update = () => {\n\t\t\t\t\tconst selected_color = getComputedStyle($chooser[0]).getPropertyValue(\"--Hilight\");\n\t\t\t\t\tconst unselected_color = gray_background_for_unselected ? \"rgb(192, 192, 192)\" : \"\";\n\t\t\t\t\t$option_container.css({\n\t\t\t\t\t\tbackgroundColor: is_chosen(thing) ? selected_color : unselected_color,\n\t\t\t\t\t});\n\t\t\t\t\tdisplay(thing, is_chosen(thing), reuse_canvas, reuse_div);\n\t\t\t\t};\n\t\t\t\tupdate();\n\t\t\t\t$G.on(\"option-changed theme-load redraw-tool-options-because-webglcontextrestored\", update);\n\t\t\t})(things[i]);\n\t\t}\n\n\t\tconst onpointerover_while_pointer_down = (event) => {\n\t\t\tconst option_container = event.target.closest(\".chooser-option\");\n\t\t\tif (option_container) {\n\t\t\t\tchoose_thing($(option_container).data(\"thing\"));\n\t\t\t}\n\t\t};\n\t\tconst ontouchmove_while_pointer_down = (event) => {\n\t\t\tconst touch = event.originalEvent.changedTouches[0];\n\t\t\tconst target = document.elementFromPoint(touch.clientX, touch.clientY);\n\t\t\tconst option_container = target.closest(\".chooser-option\");\n\t\t\tif (option_container) {\n\t\t\t\tchoose_thing($(option_container).data(\"thing\"));\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t};\n\t\t$chooser.on(\"pointerdown click\", (event) => {\n\t\t\tconst option_container = event.target.closest(\".chooser-option\");\n\t\t\tif (option_container) {\n\t\t\t\tchoose_thing($(option_container).data(\"thing\"));\n\t\t\t}\n\t\t\tif (event.type === \"pointerdown\") {\n\t\t\t\t// glide thru tool options\n\t\t\t\t$chooser.on(\"pointerover\", onpointerover_while_pointer_down);\n\t\t\t\t$chooser.on(\"touchmove\", ontouchmove_while_pointer_down);\n\t\t\t}\n\t\t});\n\t\t$G.on(\"pointerup pointercancel\", () => {\n\t\t\t$chooser.off(\"pointerover\", onpointerover_while_pointer_down);\n\t\t\t$chooser.off(\"touchmove\", ontouchmove_while_pointer_down);\n\t\t});\n\t});\n\treturn $chooser;\n};\n/**\n * @returns {JQuery<HTMLCanvasElement> & { stroke: boolean, fill: boolean }}\n */\nconst $ChooseShapeStyle = () => {\n\tconst $chooser = $Choose(\n\t\t[\n\t\t\t{ stroke: true, fill: false },\n\t\t\t{ stroke: true, fill: true },\n\t\t\t{ stroke: false, fill: true },\n\t\t],\n\t\t({ stroke, fill }, is_chosen, reuse_canvas) => {\n\t\t\tconst ss_canvas = reuse_canvas(39, 21);\n\t\t\tconst ss_ctx = ss_canvas.ctx;\n\n\t\t\t// border px inwards amount\n\t\t\tlet b = 5;\n\n\t\t\tconst style = getComputedStyle(ss_canvas);\n\t\t\tss_ctx.fillStyle = is_chosen ? style.getPropertyValue(\"--HilightText\") : style.getPropertyValue(\"--WindowText\");\n\n\t\t\tif (stroke) {\n\t\t\t\t// just using a solid rectangle for the stroke\n\t\t\t\t// so as not to have to deal with the pixel grid with strokes\n\t\t\t\tss_ctx.fillRect(b, b, ss_canvas.width - b * 2, ss_canvas.height - b * 2);\n\t\t\t}\n\n\t\t\t// go inward a pixel for the fill\n\t\t\tb += 1;\n\t\t\tss_ctx.fillStyle = style.getPropertyValue(\"--ButtonShadow\");\n\n\t\t\tif (fill) {\n\t\t\t\tss_ctx.fillRect(b, b, ss_canvas.width - b * 2, ss_canvas.height - b * 2);\n\t\t\t} else {\n\t\t\t\tss_ctx.clearRect(b, b, ss_canvas.width - b * 2, ss_canvas.height - b * 2);\n\t\t\t}\n\n\t\t\treturn ss_canvas;\n\t\t},\n\t\t({ stroke, fill }) => {\n\t\t\t$chooser.stroke = stroke;\n\t\t\t$chooser.fill = fill;\n\t\t},\n\t\t({ stroke, fill }) => $chooser.stroke === stroke && $chooser.fill === fill\n\t).addClass(\"choose-shape-style\");\n\n\t$chooser.fill = false;\n\t$chooser.stroke = true;\n\n\treturn $chooser;\n};\n\nconst $choose_brush = $Choose(\n\t(() => {\n\t\tconst brush_shapes = [\"circle\", \"square\", \"reverse_diagonal\", \"diagonal\"];\n\t\tconst circular_brush_sizes = [7, 4, 1];\n\t\tconst brush_sizes = [8, 5, 2];\n\t\tconst things = [];\n\t\tbrush_shapes.forEach((brush_shape) => {\n\t\t\tconst sizes = brush_shape === \"circle\" ? circular_brush_sizes : brush_sizes;\n\t\t\tsizes.forEach((brush_size) => {\n\t\t\t\tthings.push({\n\t\t\t\t\tshape: brush_shape,\n\t\t\t\t\tsize: brush_size,\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t\treturn things;\n\t})(),\n\t(o, is_chosen, reuse_canvas) => {\n\t\tconst cb_canvas = reuse_canvas(10, 10);\n\t\tconst style = getComputedStyle(cb_canvas);\n\n\t\tconst shape = o.shape;\n\t\tconst size = o.size;\n\t\tconst color = is_chosen ? style.getPropertyValue(\"--HilightText\") : style.getPropertyValue(\"--WindowText\");\n\n\t\tstamp_brush_canvas(cb_canvas.ctx, 5, 5, shape, size);\n\t\treplace_colors_with_swatch(cb_canvas.ctx, color);\n\n\t\treturn cb_canvas;\n\t}, ({ shape, size }) => {\n\t\tbrush_shape = shape;\n\t\tbrush_size = size;\n\t}, ({ shape, size }) => brush_shape === shape && brush_size === size\n).addClass(\"choose-brush\");\n\nconst $choose_eraser_size = $Choose(\n\t[4, 6, 8, 10],\n\t(size, is_chosen, reuse_canvas) => {\n\t\tconst ce_canvas = reuse_canvas(39, 16);\n\n\t\tconst style = getComputedStyle(ce_canvas);\n\t\tce_canvas.ctx.fillStyle = is_chosen ? style.getPropertyValue(\"--HilightText\") : style.getPropertyValue(\"--WindowText\");\n\t\trender_brush(ce_canvas.ctx, \"square\", size);\n\n\t\treturn ce_canvas;\n\t},\n\t(size) => {\n\t\teraser_size = size;\n\t},\n\t(size) => eraser_size === size\n).addClass(\"choose-eraser\");\n\nconst $choose_stroke_size = $Choose(\n\t[1, 2, 3, 4, 5],\n\t(size, is_chosen, reuse_canvas) => {\n\t\tconst w = 39, h = 12, b = 5;\n\t\tconst cs_canvas = reuse_canvas(w, h);\n\t\tconst center_y = (h - size) / 2;\n\t\tconst style = getComputedStyle(cs_canvas);\n\t\tcs_canvas.ctx.fillStyle = is_chosen ? style.getPropertyValue(\"--HilightText\") : style.getPropertyValue(\"--WindowText\");\n\t\tcs_canvas.ctx.fillRect(b, ~~center_y, w - b * 2, size);\n\t\treturn cs_canvas;\n\t},\n\t(size) => {\n\t\tstroke_size = size;\n\t},\n\t(size) => stroke_size === size\n).addClass(\"choose-stroke-size\");\n\nconst magnifications = [1, 2, 6, 8, 10];\nconst $choose_magnification = $Choose(\n\tmagnifications,\n\t(scale, is_chosen, _reuse_canvas, reuse_div) => {\n\t\tconst i = magnifications.indexOf(scale);\n\t\tconst secret = scale === 10; // 10x is secret\n\t\tconst chooser_el = ChooserDiv(\n\t\t\t\"magnification-option\",\n\t\t\tis_chosen, // invert if chosen\n\t\t\t39, (secret ? 2 : 13), // width, height of destination canvas\n\t\t\ti * 23, 0, 23, 9, // x, y, width, height from source image\n\t\t\t8, 2, 23, 9, // x, y, width, height on destination\n\t\t\treuse_div,\n\t\t);\n\t\tif (secret) {\n\t\t\t$(chooser_el).addClass(\"secret-option\");\n\t\t}\n\t\treturn chooser_el;\n\t},\n\t(scale) => {\n\t\tset_magnification(scale);\n\t},\n\t(scale) => scale === magnification,\n\ttrue,\n).addClass(\"choose-magnification\")\n\t.css({ position: \"relative\" }); // positioning context for .secret-option `position: \"absolute\"` canvas\n\n$choose_magnification.on(\"update\", () => {\n\t$choose_magnification\n\t\t.find(\".secret-option\")\n\t\t.parent()\n\t\t.css({ position: \"absolute\", bottom: \"-2px\", left: 0, opacity: 0, height: 2, overflow: \"hidden\" });\n});\n\nconst airbrush_sizes = [9, 16, 24];\nconst $choose_airbrush_size = $Choose(\n\tairbrush_sizes,\n\t(size, is_chosen, reuse_canvas) => {\n\n\t\tconst image_width = 72; // width of source image\n\t\tconst i = airbrush_sizes.indexOf(size); // 0 or 1 or 2\n\t\tconst l = airbrush_sizes.length; // 3\n\t\tconst is_bottom = (i === 2);\n\n\t\tconst shrink = is_bottom ? 0 : 4;\n\t\tconst w = image_width / l - shrink * 2;\n\t\tconst h = 23;\n\t\tconst source_x = image_width / l * i + shrink;\n\n\t\treturn ChooserCanvas(\n\t\t\t\"images/options-airbrush-size.png\",\n\t\t\tis_chosen, // invert if chosen\n\t\t\tw, h, // width, height of created destination canvas\n\t\t\tsource_x, 0, w, h, // x, y, width, height from source image\n\t\t\t0, 0, w, h, // x, y, width, height on created destination canvas\n\t\t\treuse_canvas,\n\t\t);\n\t},\n\t(size) => {\n\t\tairbrush_size = size;\n\t},\n\t(size) => size === airbrush_size,\n\ttrue,\n).addClass(\"choose-airbrush-size\");\n\nconst $choose_transparent_mode = $Choose(\n\t[false, true],\n\t(option, _is_chosen, _reuse_canvas, reuse_div) => {\n\t\tconst sw = 35, sh = 23; // width, height from source image\n\t\tconst b = 2; // margin by which the source image is inset on the destination\n\t\treturn ChooserDiv(\n\t\t\t\"transparent-mode-option\",\n\t\t\tfalse, // never invert it\n\t\t\tb + sw + b, b + sh + b, // width, height of created destination canvas\n\t\t\t0, option ? 22 : 0, sw, sh, // x, y, width, height from source image\n\t\t\tb, b, sw, sh, // x, y, width, height on created destination canvas\n\t\t\treuse_div,\n\t\t\toption, // shift y by 1px in modern theme only, for lower image; border is separate in modern theme, but shared in classic theme\n\t\t);\n\t},\n\t(option) => {\n\t\ttool_transparent_mode = option;\n\t},\n\t(option) => option === tool_transparent_mode,\n\ttrue,\n).addClass(\"choose-transparent-mode\");\n\n\nexport {\n\t$ChooseShapeStyle, $choose_airbrush_size, $choose_brush,\n\t$choose_eraser_size, $choose_magnification, $choose_stroke_size, $choose_transparent_mode\n};\n\n"
  },
  {
    "path": "src/tools.js",
    "content": "// @ts-check\n/* global selection:writable, stroke_size:writable, textbox:writable */\n/* global $canvas, $canvas_area, $status_size, airbrush_size, brush_shape, brush_size, button, canvas_handles, ctrl, eraser_size, fill_color, pick_color_slot, get_language, localize, magnification, main_canvas, main_ctx, pencil_size, pointer, pointer_active, pointer_over_canvas, pointer_previous, pointer_start, return_to_magnification, selected_colors, shift, stroke_color, transparency */\nimport { OnCanvasSelection } from \"./OnCanvasSelection.js\";\nimport { OnCanvasTextBox } from \"./OnCanvasTextBox.js\";\n// import { get_language, localize } from \"./app-localization.js\";\nimport { deselect, get_tool_by_id, meld_selection_into_canvas, meld_textbox_into_canvas, set_magnification, show_error_message, undoable, update_helper_layer } from \"./functions.js\";\nimport { $G, E, get_icon_for_tool, get_icon_for_tools, get_rgba_from_color, make_canvas, make_css_cursor } from \"./helpers.js\";\nimport { bresenham_dense_line, bresenham_line, copy_contents_within_polygon, draw_bezier_curve, draw_ellipse, draw_fill, draw_line, draw_line_strip, draw_noncontiguous_fill, draw_polygon, draw_quadratic_curve, draw_rounded_rectangle, draw_selection_box, get_circumference_points_for_brush, replace_colors_with_swatch, stamp_brush_canvas, update_brush_for_drawing_lines } from \"./image-manipulation.js\";\nimport { $ChooseShapeStyle, $choose_airbrush_size, $choose_brush, $choose_eraser_size, $choose_magnification, $choose_stroke_size, $choose_transparent_mode } from \"./tool-options.js\";\n\n// This is for linting stuff at the bottom.\n// It has to be defined per file, so I'm defining it up top and immediately disabling it.\n// It's re-enabled below to disallow the use of `this` in functions that are added to the tool objects\n// based on properties of the tool objects.\n/* eslint no-restricted-syntax: [\"error\", \"ThisExpression\"] */\n/* eslint-disable no-restricted-syntax */\n\n// Note that the way tool objects are defined and extended is a bit unconventional,\n// and makes type checking less useful (see `interface Tool`).\n// It would be better to define the tool objects using either:\n// - classes and inheritance (e.g. `class EllipseTool extends ShapeTool`), or\n// - functional composition (e.g. `const ellipseTool = shapeTool((ctx, x, y, w, h) => { ... })`).\n\n// Notes about tool status indicators:\n//\n// In MS Paint in Windows 98:\n// - Free-Form Select:\n//   - Shows the difference between the start and current mouse position, NOT the bounding box\n//   - Disappears when done making selection; does not show while dragging selection\n//   - Shows the absolute size while resizing selection (but not with using Numpad +/- or menu commands)\n// - Select:\n//   - Shows the absolute size of the selection\n//   - Disappears when done making selection; does not show while dragging selection\n//   - Shows the absolute size while resizing selection (but not with using Numpad +/- or menu commands)\n// - Eraser: N/A\n// - Fill With Color: N/A\n// - Eraser: N/A\n// - Pick Color: N/A\n// - Magnifier: N/A\n// - Pencil: N/A\n// - Brush: N/A\n// - Text:\n//   - Absolute size shown while making box\n//   - Stays after making box\n//   - Not affected when resizing the box or snapping to min width/height; it just shows the size of the box you originally \"asked for\"\n// - Line:\n//   - Relative to mouse down point\n//   - Disappears when finalizing or canceling\n// - Curve:\n//   - Relative to first point defining the curve\n//   - Disappears when finalizing or canceling\n// - Rectangle:\n//   - Relative to mouse down point\n//   - Disappears when finalizing or canceling\n// - Polygon:\n//   - Shows absolute bounding box of polygon\n//   - Always at least 2x2 for some reason (maybe takes a starting point and then finds the min/max from there, each at least 1?)\n//   - Disappears when finalizing or canceling\n// - Ellipse:\n//   - Relative to mouse down point\n//   - 3 wide or 3 tall is the smallest visible oval, and it's rendered 2px wide or tall respectively\n//   - Disappears when finalizing or canceling\n// - Rounded Rectangle:\n//   - Relative to mouse down point\n//   - 3 wide or 3 tall is the smallest visible rounded rectangle, and it's rendered 2px wide or tall respectively\n//   - Disappears when finalizing or canceling\n//\n// When showing relative sizes, MS Paint is afraid to show the number 0, so it shows 1 instead,\n// while it's happy to show negative numbers.\n// I've tentatively copied this behavior in JS Paint, although it feels like conflating\n// the visual (assuming a 1x1 brush) with the logical (the geometry defining the shape).\n// It's not affected by the chosen line width... EXCEPT for the Polygon tool!\n// (The Ellipse, Rectangle, and Rounded Rectangle tools show the outline inside, so they're ambiguous,\n// but the Polygon tool is definitely inconsistent with the Line and Curve tools.)\n//\n// The size shown is affected by holding Shift to constrain proportions.\n// The position indicator is actually locked into showing the first point defining a shape,\n// while the mouse is down, thus, Shift doesn't come into play.\n//\n// In JS Paint:\n//\n// - Free-Form Select:\n//   - (Tracks a `points` array)\n//   - I've made it show the bounding box\n//   - Updates after resizing the box; TODO: show while resizing the box\n// - Select:\n//   - (Implements `selectBox()`)\n//   - Shows the absolute size of the selection\n//   - Updates after resizing the box; TODO: show while resizing the box\n// - Text:\n//   - (Implements `selectBox()`)\n//   - Shows the absolute size of the box while making it\n//   - Shows actual size of the box after making it and snapping to min width/height\n//   - Updates after resizing the box; TODO: show while resizing the box (even though MS Paint doesn't)\n// - Line:\n//   - (Implements `shape()`)\n//   - Relative to mouse down point\n// - Curve:\n//   - (Tracks a `points` array)\n//   - Relative to first point\n// - Rectangle:\n//   - (Implements `shape()`)\n//   - Relative to mouse down point\n// - Polygon:\n//   - (Tracks a `points` array)\n//   - Shows absolute size of the bounding box\n// - Ellipse:\n//   - (Implements `shape()`)\n//   - Relative to mouse down point\n// - Rounded Rectangle:\n//   - (Implements `shape()`)\n//   - Relative to mouse down point\n//\n// The size shown is affected by holding Shift to constrain proportions.\n// TODO: either make Shift affect the position indicator, or do what MS Paint does\n// and lock it into showing the first point defining a shape while the mouse is down.\n\n// Tool IDs have type `ToolID`\nconst TOOL_FREE_FORM_SELECT = \"TOOL_FREE_FORM_SELECT\";\nconst TOOL_SELECT = \"TOOL_SELECT\";\nconst TOOL_ERASER = \"TOOL_ERASER\";\nconst TOOL_FILL = \"TOOL_FILL\";\nconst TOOL_PICK_COLOR = \"TOOL_PICK_COLOR\";\nconst TOOL_MAGNIFIER = \"TOOL_MAGNIFIER\";\nconst TOOL_PENCIL = \"TOOL_PENCIL\";\nconst TOOL_BRUSH = \"TOOL_BRUSH\";\nconst TOOL_AIRBRUSH = \"TOOL_AIRBRUSH\";\nconst TOOL_TEXT = \"TOOL_TEXT\";\nconst TOOL_LINE = \"TOOL_LINE\";\nconst TOOL_CURVE = \"TOOL_CURVE\";\nconst TOOL_RECTANGLE = \"TOOL_RECTANGLE\";\nconst TOOL_POLYGON = \"TOOL_POLYGON\";\nconst TOOL_ELLIPSE = \"TOOL_ELLIPSE\";\nconst TOOL_ROUNDED_RECTANGLE = \"TOOL_ROUNDED_RECTANGLE\";\n\n/** @type {Tool[]} */\nconst tools = [{\n\tid: TOOL_FREE_FORM_SELECT,\n\tname: localize(\"Free-Form Select\"),\n\tspeech_recognition: [\n\t\t\"lasso\", \"select with lasso\", \"select by lassoing\", \"lassoing\",\n\t\t\"lasso select\", \"freeform select\", \"free-form select\", \"free form select\", \"polygonal select\", \"polygon select\", \"shape select\", \"outline select\", \"select by outline\", \"select by outlining\", \"star select\", \"shape select\", \"select by shape\", \"select by drawing a shape\", \"select by drawing shape\",\n\t\t\"lasso selection\", \"freeform selection\", \"free-form selection\", \"free form selection\", \"polygonal selection\", \"polygon selection\", \"shape selection\", \"outline selection\", \"selection by outline\", \"selection by outlining\", \"star selection\", \"shape selection\", \"selection by shape\", \"selection by drawing a shape\", \"selection by drawing shape\",\n\t\t\"lasso selecting\", \"freeform selecting\", \"free-form selecting\", \"free form selecting\", \"polygonal selecting\", \"polygon selecting\", \"shape selecting\", \"outline selecting\", \"selecting by outline\", \"selecting by outlining\", \"star selecting\", \"shape selecting\", \"selecting by shape\", \"selecting by drawing a shape\", \"selecting by drawing shape\",\n\t\t\"lasso selector\", \"freeform selector\", \"free-form selector\", \"free form selector\", \"polygonal selector\", \"polygon selector\", \"shape selector\", \"outline selector\", \"by outline selector\", \"outlining selector\", \"star selector\", \"shape selector\", \"by shape selector\", \"by drawing a shape selector\", \"by drawing shape selector\",\n\t],\n\thelp_icon: \"p_free.gif\",\n\tdescription: localize(\"Selects a free-form part of the picture to move, copy, or edit.\"),\n\tcursor: [\"precise\", [16, 16], \"crosshair\"],\n\n\t// A canvas for rendering a preview of the shape\n\tpreview_canvas: null,\n\n\t// The vertices of the polygon\n\tpoints: [],\n\n\t// The boundaries of the polygon\n\tx_min: +Infinity,\n\tx_max: -Infinity,\n\ty_min: +Infinity,\n\ty_max: -Infinity,\n\n\tpointerdown() {\n\t\tthis.x_min = pointer.x;\n\t\tthis.x_max = pointer.x + 1;\n\t\tthis.y_min = pointer.y;\n\t\tthis.y_max = pointer.y + 1;\n\t\tthis.points = [];\n\t\tthis.preview_canvas = make_canvas(main_canvas.width, main_canvas.height);\n\n\t\t// End prior selection, drawing it to the canvas\n\t\tdeselect();\n\t},\n\tpaint(_ctx, _x, _y) {\n\t\t// Constrain the pointer to the canvas\n\t\tpointer.x = Math.min(main_canvas.width, pointer.x);\n\t\tpointer.x = Math.max(0, pointer.x);\n\t\tpointer.y = Math.min(main_canvas.height, pointer.y);\n\t\tpointer.y = Math.max(0, pointer.y);\n\t\t// Add the point\n\t\tthis.points.push(pointer);\n\t\t// Update the boundaries of the polygon\n\t\tthis.x_min = Math.min(pointer.x, this.x_min);\n\t\tthis.x_max = Math.max(pointer.x, this.x_max);\n\t\tthis.y_min = Math.min(pointer.y, this.y_min);\n\t\tthis.y_max = Math.max(pointer.y, this.y_max);\n\n\t\tbresenham_line(pointer_previous.x, pointer_previous.y, pointer.x, pointer.y, (x, y) => {\n\t\t\tthis.ffs_paint_iteration(x, y);\n\t\t});\n\n\t\t// Note: MS Paint in Windows 98 shows the difference between the starting point and the current mouse position\n\t\t// An absolute bounding box seems more useful though.\n\t\t$status_size.text(`${this.x_max - this.x_min}x${this.y_max - this.y_min}`);\n\t},\n\tffs_paint_iteration(x, y) {\n\t\t// Constrain the inversion paint brush position to the canvas\n\t\tx = Math.min(main_canvas.width, x);\n\t\tx = Math.max(0, x);\n\t\ty = Math.min(main_canvas.height, y);\n\t\ty = Math.max(0, y);\n\n\t\t// Find the dimensions on the canvas of the tiny square to invert\n\t\tconst inversion_size = 2;\n\t\tconst rect_x = ~~(x - inversion_size / 2);\n\t\tconst rect_y = ~~(y - inversion_size / 2);\n\t\tconst rect_w = inversion_size;\n\t\tconst rect_h = inversion_size;\n\n\t\tconst ctx_dest = this.preview_canvas.ctx;\n\t\tconst id_src = main_ctx.getImageData(rect_x, rect_y, rect_w, rect_h);\n\t\tconst id_dest = ctx_dest.getImageData(rect_x, rect_y, rect_w, rect_h);\n\n\t\tfor (let i = 0, l = id_dest.data.length; i < l; i += 4) {\n\t\t\tid_dest.data[i + 0] = 255 - id_src.data[i + 0];\n\t\t\tid_dest.data[i + 1] = 255 - id_src.data[i + 1];\n\t\t\tid_dest.data[i + 2] = 255 - id_src.data[i + 2];\n\t\t\tid_dest.data[i + 3] = 255;\n\t\t\t// @TODO maybe: invert based on id_src.data[i+3] and the checkered background\n\t\t}\n\n\t\tctx_dest.putImageData(id_dest, rect_x, rect_y);\n\t},\n\tpointerup() {\n\t\t$status_size.text(\"\");\n\t\tthis.preview_canvas.width = 1;\n\t\tthis.preview_canvas.height = 1;\n\n\t\tconst contents_within_polygon = copy_contents_within_polygon(\n\t\t\tmain_canvas,\n\t\t\tthis.points,\n\t\t\tthis.x_min,\n\t\t\tthis.y_min,\n\t\t\tthis.x_max,\n\t\t\tthis.y_max\n\t\t);\n\n\t\tif (selection) {\n\t\t\t// for silly multitools feature\n\t\t\tshow_error_message(\"This isn't supposed to happen: Free-Form Select after Select in the tool chain?\");\n\t\t\tmeld_selection_into_canvas();\n\t\t}\n\n\t\tundoable({\n\t\t\tname: localize(\"Free-Form Select\"),\n\t\t\ticon: get_icon_for_tool(get_tool_by_id(TOOL_FREE_FORM_SELECT)),\n\t\t\tsoft: true,\n\t\t}, () => {\n\t\t\tselection = new OnCanvasSelection(\n\t\t\t\tthis.x_min,\n\t\t\t\tthis.y_min,\n\t\t\t\tthis.x_max - this.x_min,\n\t\t\t\tthis.y_max - this.y_min,\n\t\t\t\tcontents_within_polygon,\n\t\t\t);\n\t\t\tselection.cut_out_background();\n\t\t});\n\t},\n\tcancel() {\n\t\tif (!this.preview_canvas) { return; }\n\t\tthis.preview_canvas.width = 1;\n\t\tthis.preview_canvas.height = 1;\n\t},\n\tdrawPreviewUnderGrid(ctx, _x, _y, _grid_visible, scale, translate_x, translate_y) {\n\t\tif (!pointer_active && !pointer_over_canvas) { return; }\n\t\tif (!this.preview_canvas) { return; }\n\n\t\tctx.scale(scale, scale);\n\t\tctx.translate(translate_x, translate_y);\n\n\t\tctx.drawImage(this.preview_canvas, 0, 0);\n\t},\n\t$options: $choose_transparent_mode,\n}, {\n\tid: TOOL_SELECT,\n\tname: localize(\"Select\"),\n\tspeech_recognition: [\n\t\t// formulaic combinations\n\t\t\"select\", \"rectangle select\", \"rectangular select\", \"box select\", \"square select\", \"drag select\", \"select rectangle\", \"select by rectangle\", \"select rectangular region\", \"select rectangular area\", \"rectangular region select\", \"rectangular area select\",\n\t\t\"selection\", \"rectangle selection\", \"rectangular selection\", \"box selection\", \"square selection\", \"rectangular region selection\", \"rectangular area selection\",\n\t\t\"selector\", \"rectangle selector\", \"rectangular selector\", \"box selector\", \"square selector\", \"drag selector\", \"rectangular region selector\", \"rectangular area selector\",\n\t\t// misc\n\t\t\"make selection\", \"make a selection\", \"select a rectangle\", \"select a box\", \"select a rectangular region\", \"select a rectangular area\", \"selection box\",\n\t\t\"part of image\", \"part of picture\", \"part of canvas\", \"part of the image\", \"part of the picture\", \"part of the canvas\",\n\t\t\"create selection\", \"create a selection\", \"selection maker\", \"selection box maker\",\n\t],\n\thelp_icon: \"p_sel.gif\",\n\tdescription: localize(\"Selects a rectangular part of the picture to move, copy, or edit.\"),\n\tcursor: [\"precise\", [16, 16], \"crosshair\"],\n\tselectBox(rect_x, rect_y, rect_width, rect_height) {\n\t\tif (rect_width > 1 && rect_height > 1) {\n\t\t\tvar free_form_selection = selection;\n\t\t\tif (selection) {\n\t\t\t\t// for silly multitools feature\n\t\t\t\tmeld_selection_into_canvas();\n\t\t\t}\n\t\t\tif (ctrl) {\n\t\t\t\tundoable({ name: \"Crop\" }, () => {\n\t\t\t\t\tvar cropped_canvas = make_canvas(rect_width, rect_height);\n\t\t\t\t\tcropped_canvas.ctx.drawImage(main_canvas, -rect_x, -rect_y);\n\t\t\t\t\tmain_ctx.copy(cropped_canvas);\n\t\t\t\t\tcanvas_handles.show();\n\t\t\t\t\t$canvas_area.trigger(\"resize\"); // does this not also call canvas_handles.show()?\n\t\t\t\t});\n\t\t\t} else if (free_form_selection) {\n\t\t\t\t// for silly multitools feature,\n\t\t\t\t// create a selection that's the Free-Form selection XOR the normal selection\n\n\t\t\t\tvar x_min = Math.min(free_form_selection.x, rect_x);\n\t\t\t\tvar y_min = Math.min(free_form_selection.y, rect_y);\n\t\t\t\tvar x_max = Math.max(free_form_selection.x + free_form_selection.width, rect_x + rect_width);\n\t\t\t\tvar y_max = Math.max(free_form_selection.y + free_form_selection.height, rect_y + rect_height);\n\n\t\t\t\tvar contents_canvas = make_canvas(\n\t\t\t\t\tx_max - x_min,\n\t\t\t\t\ty_max - y_min,\n\t\t\t\t);\n\t\t\t\tvar rect_canvas = make_canvas(\n\t\t\t\t\tx_max - x_min,\n\t\t\t\t\ty_max - y_min,\n\t\t\t\t);\n\t\t\t\trect_canvas.ctx.drawImage(\n\t\t\t\t\tmain_canvas,\n\t\t\t\t\t// source:\n\t\t\t\t\trect_x,\n\t\t\t\t\trect_y,\n\t\t\t\t\trect_width,\n\t\t\t\t\trect_height,\n\t\t\t\t\t// dest:\n\t\t\t\t\trect_x - x_min,\n\t\t\t\t\trect_y - y_min,\n\t\t\t\t\trect_width,\n\t\t\t\t\trect_height,\n\t\t\t\t);\n\n\t\t\t\tcontents_canvas.ctx.drawImage(\n\t\t\t\t\tfree_form_selection.canvas,\n\t\t\t\t\tfree_form_selection.x - x_min,\n\t\t\t\t\tfree_form_selection.y - y_min,\n\t\t\t\t);\n\t\t\t\tcontents_canvas.ctx.globalCompositeOperation = \"xor\";\n\t\t\t\tcontents_canvas.ctx.drawImage(rect_canvas, 0, 0);\n\n\t\t\t\tundoable({\n\t\t\t\t\tname: `${localize(\"Free-Form Select\")}⊕${localize(\"Select\")}`,\n\t\t\t\t\ticon: get_icon_for_tools([\n\t\t\t\t\t\tget_tool_by_id(TOOL_FREE_FORM_SELECT),\n\t\t\t\t\t\tget_tool_by_id(TOOL_SELECT),\n\t\t\t\t\t]),\n\t\t\t\t\tsoft: true,\n\t\t\t\t}, () => {\n\t\t\t\t\tselection = new OnCanvasSelection(\n\t\t\t\t\t\tx_min,\n\t\t\t\t\t\ty_min,\n\t\t\t\t\t\tx_max - x_min,\n\t\t\t\t\t\ty_max - y_min,\n\t\t\t\t\t\tcontents_canvas,\n\t\t\t\t\t);\n\t\t\t\t\tselection.cut_out_background();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tundoable({\n\t\t\t\t\tname: localize(\"Select\"),\n\t\t\t\t\ticon: get_icon_for_tool(get_tool_by_id(TOOL_SELECT)),\n\t\t\t\t\tsoft: true,\n\t\t\t\t}, () => {\n\t\t\t\t\tselection = new OnCanvasSelection(rect_x, rect_y, rect_width, rect_height);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t},\n\t$options: $choose_transparent_mode,\n}, {\n\tid: TOOL_ERASER,\n\tname: localize(\"Eraser/Color Eraser\"),\n\tspeech_recognition: [\n\t\t\"erase\", \"eraser\", \"rubber\", \"wiper\", \"clearer\", \"mark remover\", \"obliterator\", \"expunger\",\n\t\t\"color eraser\", \"color replacer\", \"replace color\", \"replace colors\",\n\t\t\"erasing\", \"erasing tool\", \"color erasing\", \"color replacing\", \"replacing color\", \"replacing colors\", \"wiping tool\", \"rubbing tool\", \"clearing tool\", \"mark removing tool\", \"removal tool\", \"obliterating tool\", \"obliteration tool\", \"expunging tool\",\n\t],\n\thelp_icon: \"p_erase.gif\",\n\tdescription: localize(\"Erases a portion of the picture, using the selected eraser shape.\"),\n\tcursor: [\"precise\", [16, 16], \"crosshair\"],\n\n\t// binary mask of the drawn area, either opaque white or transparent\n\tmask_canvas: null,\n\n\tget_rect(x, y) {\n\t\tconst rect_x = Math.ceil(x - eraser_size / 2);\n\t\tconst rect_y = Math.ceil(y - eraser_size / 2);\n\t\tconst rect_w = eraser_size;\n\t\tconst rect_h = eraser_size;\n\t\treturn { rect_x, rect_y, rect_w, rect_h };\n\t},\n\n\tdrawPreviewUnderGrid(ctx, x, y, _grid_visible, scale, translate_x, translate_y) {\n\t\tif (!pointer_active && !pointer_over_canvas) { return; }\n\t\tconst { rect_x, rect_y, rect_w, rect_h } = this.get_rect(x, y);\n\n\t\tctx.scale(scale, scale);\n\t\tctx.translate(translate_x, translate_y);\n\n\t\tif (this.mask_canvas) {\n\t\t\tthis.render_from_mask(ctx, true);\n\t\t\tif (transparency) {\n\t\t\t\t// animate for gradient\n\t\t\t\t// TODO: is rAF needed? update_helper_layer uses rAF\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tupdate_helper_layer();\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tctx.fillStyle = selected_colors.background;\n\t\tctx.fillRect(rect_x, rect_y, rect_w, rect_h);\n\t},\n\tdrawPreviewAboveGrid(ctx, x, y, grid_visible, scale, translate_x, translate_y) {\n\t\tif (!pointer_active && !pointer_over_canvas) { return; }\n\n\t\tconst { rect_x, rect_y, rect_w, rect_h } = this.get_rect(x, y);\n\n\t\tctx.scale(scale, scale);\n\t\tctx.translate(translate_x, translate_y);\n\t\tconst hairline_width = 1 / scale;\n\n\t\tctx.strokeStyle = \"black\";\n\t\tctx.lineWidth = hairline_width;\n\t\tif (grid_visible) {\n\t\t\tctx.strokeRect(rect_x + ctx.lineWidth / 2, rect_y + ctx.lineWidth / 2, rect_w, rect_h);\n\t\t} else {\n\t\t\tctx.strokeRect(rect_x + ctx.lineWidth / 2, rect_y + ctx.lineWidth / 2, rect_w - ctx.lineWidth, rect_h - ctx.lineWidth);\n\t\t}\n\t},\n\tpointerdown() {\n\t\tthis.mask_canvas = make_canvas(main_canvas.width, main_canvas.height);\n\t},\n\trender_from_mask(ctx, previewing) {\n\t\tctx.save();\n\t\tctx.globalCompositeOperation = \"destination-out\";\n\t\tctx.drawImage(this.mask_canvas, 0, 0);\n\t\tctx.restore();\n\n\t\tif (previewing || !transparency) {\n\t\t\t/** @type {string | CanvasPattern | CanvasGradient} */\n\t\t\tlet color = selected_colors.background;\n\t\t\tif (transparency) {\n\t\t\t\tconst t = performance.now() / 2000;\n\t\t\t\t// @TODO: DRY\n\t\t\t\t// animated rainbow effect representing transparency,\n\t\t\t\t// in lieu of any good way to draw temporary transparency in the current setup\n\t\t\t\t// 5 distinct colors, 5 distinct gradients, 7 color stops, 6 gradients\n\t\t\t\tconst n = 6;\n\t\t\t\tconst h = ctx.canvas.height;\n\t\t\t\tconst y = (t % 1) * -h * (n - 1);\n\t\t\t\tconst gradient = ctx.createLinearGradient(0, y, 0, y + h * n);\n\t\t\t\tgradient.addColorStop(0 / n, \"red\");\n\t\t\t\tgradient.addColorStop(1 / n, \"gold\");\n\t\t\t\tgradient.addColorStop(2 / n, \"#00d90b\");\n\t\t\t\tgradient.addColorStop(3 / n, \"#2e64d9\");\n\t\t\t\tgradient.addColorStop(4 / n, \"#8f2ed9\");\n\t\t\t\t// last two same as the first two so it can seamlessly wrap\n\t\t\t\tgradient.addColorStop(5 / n, \"red\");\n\t\t\t\tgradient.addColorStop(6 / n, \"gold\");\n\t\t\t\tcolor = gradient;\n\t\t\t}\n\t\t\tconst mask_fill_canvas = make_canvas(this.mask_canvas);\n\t\t\treplace_colors_with_swatch(mask_fill_canvas.ctx, color, 0, 0);\n\t\t\tctx.drawImage(mask_fill_canvas, 0, 0);\n\t\t}\n\t},\n\tpointerup() {\n\t\tif (!this.mask_canvas) {\n\t\t\treturn; // not sure why this would happen per se\n\t\t}\n\t\tundoable({\n\t\t\tname: get_language().match(/^en\\b/) ? (this.color_eraser_mode ? \"Color Eraser\" : \"Eraser\") : localize(\"Eraser/Color Eraser\"),\n\t\t\ticon: get_icon_for_tool(this),\n\t\t}, () => {\n\t\t\tthis.render_from_mask(main_ctx);\n\n\t\t\tthis.mask_canvas = null;\n\t\t});\n\t},\n\tcancel() {\n\t\tthis.mask_canvas = null;\n\t},\n\tpaint(ctx, _x, _y) {\n\t\tbresenham_line(pointer_previous.x, pointer_previous.y, pointer.x, pointer.y, (x, y) => {\n\t\t\tthis.eraser_paint_iteration(ctx, x, y);\n\t\t});\n\t},\n\teraser_paint_iteration(ctx, x, y) {\n\t\tconst { rect_x, rect_y, rect_w, rect_h } = this.get_rect(x, y);\n\n\t\tthis.color_eraser_mode = button !== 0;\n\n\t\tif (!this.color_eraser_mode) {\n\t\t\t// Eraser\n\t\t\tthis.mask_canvas.ctx.fillStyle = \"white\";\n\t\t\tthis.mask_canvas.ctx.fillRect(rect_x, rect_y, rect_w, rect_h);\n\t\t} else {\n\t\t\t// Color Eraser\n\t\t\t// Right click with the eraser to selectively replace\n\t\t\t// the selected foreground color with the selected background color\n\n\t\t\tconst fg_rgba = get_rgba_from_color(selected_colors.foreground);\n\n\t\t\tconst test_image_data = ctx.getImageData(rect_x, rect_y, rect_w, rect_h);\n\t\t\tconst result_image_data = this.mask_canvas.ctx.getImageData(rect_x, rect_y, rect_w, rect_h);\n\n\t\t\tconst fill_threshold = 1; // 1 is just enough for a workaround for Brave browser's farbling: https://github.com/1j01/jspaint/issues/184\n\n\t\t\tfor (let i = 0, l = test_image_data.data.length; i < l; i += 4) {\n\t\t\t\tif (\n\t\t\t\t\tMath.abs(test_image_data.data[i + 0] - fg_rgba[0]) <= fill_threshold &&\n\t\t\t\t\tMath.abs(test_image_data.data[i + 1] - fg_rgba[1]) <= fill_threshold &&\n\t\t\t\t\tMath.abs(test_image_data.data[i + 2] - fg_rgba[2]) <= fill_threshold &&\n\t\t\t\t\tMath.abs(test_image_data.data[i + 3] - fg_rgba[3]) <= fill_threshold\n\t\t\t\t) {\n\t\t\t\t\tresult_image_data.data[i + 0] = 255;\n\t\t\t\t\tresult_image_data.data[i + 1] = 255;\n\t\t\t\t\tresult_image_data.data[i + 2] = 255;\n\t\t\t\t\tresult_image_data.data[i + 3] = 255;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.mask_canvas.ctx.putImageData(result_image_data, rect_x, rect_y);\n\t\t}\n\t},\n\t$options: $choose_eraser_size,\n}, {\n\tid: TOOL_FILL,\n\tname: localize(\"Fill With Color\"),\n\tspeech_recognition: [\n\t\t\"fill with color\", \"flood fill\", \"fill\", \"flood filling\", \"flood-filling\", \"floodfilling\", \"floodfill\",\n\t\t\"fill area with color\", \"flood fill area\", \"fill area\", \"color area\", \"area fill\", \"area filling\", \"filling area\",\n\t\t\"fill region with color\", \"flood fill region\", \"fill region\", \"color region\", \"region fill\", \"region filling\", \"filling region\",\n\t\t\"fill bucket\", \"paint bucket\", \"paint can\", \"dump\", \"splash\", \"paintbucket\", \"bucket\", \"dumping\", \"paint dumping\", \"paint dumper\", \"dumper\", \"dump bucket\", \"color filler\", \"filler\",\n\t],\n\thelp_icon: \"p_paint.gif\",\n\tdescription: \"Fills an area with the selected drawing color.\",\n\tcursor: [\"fill-bucket\", [8, 22], \"crosshair\"],\n\tpointerdown(ctx, x, y) {\n\t\tif (shift) {\n\t\t\tundoable({\n\t\t\t\tname: \"Replace Color\",\n\t\t\t\ticon: get_icon_for_tool(this),\n\t\t\t}, () => {\n\t\t\t\t// Perform global color replacement\n\t\t\t\tdraw_noncontiguous_fill(ctx, x, y, fill_color);\n\t\t\t});\n\t\t} else {\n\t\t\tundoable({\n\t\t\t\tname: localize(\"Fill With Color\"),\n\t\t\t\ticon: get_icon_for_tool(this),\n\t\t\t}, () => {\n\t\t\t\t// Perform a normal fill operation\n\t\t\t\tdraw_fill(ctx, x, y, fill_color);\n\t\t\t});\n\t\t}\n\t},\n}, {\n\tid: TOOL_PICK_COLOR,\n\tname: localize(\"Pick Color\"),\n\tspeech_recognition: [\n\t\t\"pick color\", \"select color\", \"color select\", \"color selector\", \"color picker\", \"pick a color\", \"color picking\", \"color choosing\", \"color selecting\", \"color chooser\", \"color lift\", \"color lifter\", \"color lifting\", \"lift color\",\n\t\t\"eyedropper\", \"eye dropper\", \"eye-dropper\", \"pipette\", \"Pasteur pipette\", \"dropper\", \"eye drop\", \"eye-drop\", \"eyedrop\", \"suck up color\", \"absorb color\",\n\t\t\"choose color from image\", \"choose color from picture\", \"choose color from canvas\",\n\t\t\"select color from image\", \"select color from picture\", \"select color from canvas\",\n\t\t\"choose color from the image\", \"choose color from the picture\", \"choose color from the canvas\",\n\t\t\"select color from the image\", \"select color from the picture\", \"select color from the canvas\",\n\t\t\"choose a color from the image\", \"choose a color from the picture\", \"choose a color from the canvas\",\n\t\t\"select a color from the image\", \"select a color from the picture\", \"select a color from the canvas\",\n\t\t\"choose a color from image\", \"choose a color from picture\", \"choose a color from canvas\",\n\t\t\"select a color from image\", \"select a color from picture\", \"select a color from canvas\",\n\t\t\"pick color from canvas\", \"pick color from document\", \"pick color from page\", \"pick color from image\", \"pick color from picture\",\n\t\t\"pick color from the canvas\", \"pick color from the document\", \"pick color from the page\", \"pick color from the image\", \"pick color from the picture\",\n\t\t\"pick a color from canvas\", \"pick a color from document\", \"pick a color from page\", \"pick a color from image\", \"pick a color from picture\",\n\t\t\"pick a color from the canvas\", \"pick a color from the document\", \"pick a color from the page\", \"pick a color from the image\", \"pick a color from the picture\",\n\t],\n\thelp_icon: \"p_eye.gif\",\n\tdescription: localize(\"Picks up a color from the picture for drawing.\"),\n\tcursor: [\"eye-dropper\", [9, 22], \"crosshair\"],\n\tdeselect: true,\n\n\tcurrent_color: \"\",\n\tdisplay_current_color() {\n\t\tthis.$options.css({\n\t\t\tbackground: this.current_color,\n\t\t});\n\t},\n\tpointerdown() {\n\t\t$G.one(\"pointerup\", () => {\n\t\t\tthis.$options.css({\n\t\t\t\tbackground: \"\",\n\t\t\t});\n\t\t});\n\t},\n\tpaint(ctx, x, y) {\n\t\tif (x >= 0 && y >= 0 && x < main_canvas.width && y < main_canvas.height) {\n\t\t\tconst id = ctx.getImageData(~~x, ~~y, 1, 1);\n\t\t\tconst [r, g, b, a] = id.data;\n\t\t\tthis.current_color = `rgba(${r},${g},${b},${a / 255})`;\n\t\t} else {\n\t\t\tthis.current_color = \"white\";\n\t\t}\n\t\tthis.display_current_color();\n\t},\n\tpointerup() {\n\t\tselected_colors[pick_color_slot] = this.current_color;\n\t\t$G.trigger(\"option-changed\");\n\t},\n\t$options: $(E(\"div\")),\n}, {\n\tid: TOOL_MAGNIFIER,\n\tname: localize(\"Magnifier\"),\n\tspeech_recognition: [\n\t\t\"magnifier\", \"magnifying glass\", \"loupe\", \"hand lens\", \"hand glass\", \"eyeglass\", \"eye glass\", \"lens\", \"simple microscope\", \"microscope\", \"glass\", \"spyglass\", \"telescope\",\n\t\t\"magnification\", \"zoom\", \"zoom in\", \"zoom out\", \"zoomer\", \"magnifying\", \"zooming\", \"enlarging tool\",\n\t],\n\thelp_icon: \"p_zoom.gif\",\n\tdescription: localize(\"Changes the magnification.\"),\n\tcursor: [\"magnifier\", [16, 16], \"zoom-in\"], // overridden below\n\tdeselect: true,\n\n\tgetProspectiveMagnification: () => (\n\t\tmagnification === 1 ? return_to_magnification : 1\n\t),\n\n\tdrawPreviewAboveGrid(ctx, x, y, _grid_visible, scale, translate_x, translate_y) {\n\t\tif (!pointer_active && !pointer_over_canvas) { return; }\n\t\tif (pointer_active) { return; }\n\t\tconst prospective_magnification = this.getProspectiveMagnification();\n\n\t\t// hacky place to put this but whatever\n\t\t// use specific zoom-in/zoom-out as fallback,\n\t\t// even though the custom cursor image is less descriptive\n\t\t// because there's no generic \"zoom\" css cursor\n\t\tif (prospective_magnification < magnification) {\n\t\t\t$canvas.css({\n\t\t\t\tcursor: make_css_cursor(\"magnifier\", [16, 16], \"zoom-out\"),\n\t\t\t});\n\t\t} else {\n\t\t\t$canvas.css({\n\t\t\t\tcursor: make_css_cursor(\"magnifier\", [16, 16], \"zoom-in\"),\n\t\t\t});\n\t\t}\n\n\t\tif (prospective_magnification < magnification) { return; } // hide if would be zooming out\n\n\t\t// prospective viewport size in document coords\n\t\tconst w = $canvas_area.width() / prospective_magnification;\n\t\tconst h = $canvas_area.height() / prospective_magnification;\n\n\t\tlet rect_x1 = ~~(x - w / 2);\n\t\tlet rect_y1 = ~~(y - h / 2);\n\n\t\t// try to move rect into bounds without squishing\n\t\trect_x1 = Math.max(0, rect_x1);\n\t\trect_y1 = Math.max(0, rect_y1);\n\t\trect_x1 = Math.min(main_canvas.width - w, rect_x1);\n\t\trect_y1 = Math.min(main_canvas.height - h, rect_y1);\n\n\t\tlet rect_x2 = rect_x1 + w;\n\t\tlet rect_y2 = rect_y1 + h;\n\n\t\t// clamp rect to bounds (with squishing)\n\t\trect_x1 = Math.max(0, rect_x1);\n\t\trect_y1 = Math.max(0, rect_y1);\n\t\trect_x2 = Math.min(main_canvas.width, rect_x2);\n\t\trect_y2 = Math.min(main_canvas.height, rect_y2);\n\n\t\tconst rect_w = rect_x2 - rect_x1;\n\t\tconst rect_h = rect_y2 - rect_y1;\n\t\tconst rect_x = rect_x1;\n\t\tconst rect_y = rect_y1;\n\n\t\tconst id_src = main_canvas.ctx.getImageData(rect_x, rect_y, rect_w + 1, rect_h + 1);\n\t\tconst id_dest = ctx.getImageData((rect_x + translate_x) * scale, (rect_y + translate_y) * scale, rect_w * scale + 1, rect_h * scale + 1);\n\n\t\tfunction copyPixelInverted(x_dest, y_dest) {\n\t\t\tconst x_src = ~~(x_dest / scale);\n\t\t\tconst y_src = ~~(y_dest / scale);\n\t\t\tconst index_src = (x_src + y_src * id_src.width) * 4;\n\t\t\tconst index_dest = (x_dest + y_dest * id_dest.width) * 4;\n\t\t\tid_dest.data[index_dest + 0] = 255 - id_src.data[index_src + 0];\n\t\t\tid_dest.data[index_dest + 1] = 255 - id_src.data[index_src + 1];\n\t\t\tid_dest.data[index_dest + 2] = 255 - id_src.data[index_src + 2];\n\t\t\tid_dest.data[index_dest + 3] = 255;\n\t\t\t// @TODO maybe: invert based on id_src.data[index_src+3] and the checkered background\n\t\t}\n\n\t\tfor (let x = 0, limit = id_dest.width; x < limit; x += 1) {\n\t\t\tcopyPixelInverted(x, 0);\n\t\t\tcopyPixelInverted(x, id_dest.height - 1);\n\t\t}\n\t\tfor (let y = 1, limit = id_dest.height - 1; y < limit; y += 1) {\n\t\t\tcopyPixelInverted(0, y);\n\t\t\tcopyPixelInverted(id_dest.width - 1, y);\n\t\t}\n\n\t\t// for debug: fill rect\n\t\t// for (let x = 0, x_limit = id_dest.width; x < x_limit; x += 1) {\n\t\t// \tfor (let y = 1, y_limit = id_dest.height - 1; y < y_limit; y += 1) {\n\t\t// \t\tcopyPixelInverted(x, y);\n\t\t// \t}\n\t\t// }\n\n\t\tctx.putImageData(id_dest, (rect_x + translate_x) * scale, (rect_y + translate_y) * scale);\n\n\t\t// debug:\n\t\t// ctx.scale(scale, scale);\n\t\t// ctx.translate(translate_x, translate_y);\n\t\t// ctx.strokeStyle = \"#f0f\";\n\t\t// ctx.strokeRect(rect_x1, rect_y1, rect_w, rect_h);\n\t},\n\tpointerdown(_ctx, x, y) {\n\t\tconst prev_magnification = magnification;\n\t\tconst prospective_magnification = this.getProspectiveMagnification();\n\n\t\tset_magnification(prospective_magnification);\n\n\t\tif (magnification > prev_magnification) {\n\n\t\t\t// (new) viewport size in document coords\n\t\t\tconst w = $canvas_area.width() / magnification;\n\t\t\tconst h = $canvas_area.height() / magnification;\n\n\t\t\t$canvas_area.scrollLeft((x - w / 2) * magnification / prev_magnification);\n\t\t\t// Nevermind, canvas, isn't aligned to the right in RTL layout!\n\t\t\t// if (get_direction() === \"rtl\") {\n\t\t\t// \t// scrollLeft coordinates can be negative for RTL\n\t\t\t// \t$canvas_area.scrollLeft((x - w/2 - canvas.width) * magnification / prev_magnification + $canvas_area.innerWidth());\n\t\t\t// } else {\n\t\t\t// \t$canvas_area.scrollLeft((x - w/2) * magnification / prev_magnification);\n\t\t\t// }\n\t\t\t$canvas_area.scrollTop((y - h / 2) * magnification / prev_magnification);\n\t\t\t$canvas_area.trigger(\"scroll\");\n\t\t}\n\t},\n\t$options: $choose_magnification,\n}, {\n\tid: TOOL_PENCIL,\n\tname: localize(\"Pencil\"),\n\tspeech_recognition: [\n\t\t\"pencil\", \"lead\", \"graphite\", \"pen\", \"pixel\", \"pixel art\", \"penciling\", \"penning\", \"pixeling\",\n\t],\n\thelp_icon: \"p_pencil.gif\",\n\tdescription: localize(\"Draws a free-form line one pixel wide.\"),\n\tcursor: [\"pencil\", [13, 23], \"crosshair\"],\n\tstroke_only: true,\n\tget_brush() {\n\t\treturn { size: pencil_size, shape: \"circle\" };\n\t},\n}, {\n\tid: TOOL_BRUSH,\n\tname: localize(\"Brush\"),\n\tspeech_recognition: [\n\t\t\"brush\", \"paint brush\", \"paintbrush\",\n\t\t// \"paint\", // could also be the paint bucket tool; might be too general, matching saying \"MS Paint\" / \"JS Paint\"\n\t\t\"paint tool\", // could also be the paint bucket tool\n\t\t\"painting tool\", \"brushing paint tool\", \"paint brushing tool\", \"brushing\",\n\t\t// @TODO: specific brush shapes:\n\t\t// \"calligraphy\", \"nib\", \"slanted brush\", \"square brush\", \"circle brush\", \"circular brush\",\n\t],\n\thelp_icon: \"p_brush.gif\",\n\tdescription: localize(\"Draws using a brush with the selected shape and size.\"),\n\tcursor: [\"precise-dotted\", [16, 16], \"crosshair\"],\n\tdynamic_preview_cursor: true,\n\tget_brush() {\n\t\treturn { size: brush_size, shape: brush_shape };\n\t},\n\t$options: $choose_brush,\n}, {\n\tid: TOOL_AIRBRUSH,\n\tname: localize(\"Airbrush\"),\n\tspeech_recognition: [\n\t\t\"air brush\", \"airbrush\", \"aerograph\", \"airbrushing\", \"air brushing\",\n\t\t\"spray paint\", \"spraypaint\", \"paint spray\", \"spray painting\", \"spraypainting\",\n\t\t\"spray paint can\", \"spraypaint can\", \"spraycan\", \"spray-can\", \"spray can\",\n\t\t\"graffiti\", \"scatter\", \"splatter\", \"scattering\", \"splattering\", \"aerosol\", \"aerosol can\", \"throwie\", \"flamethrower\",\n\t],\n\thelp_icon: \"p_airb.gif\",\n\tdescription: localize(\"Draws using an airbrush of the selected size.\"),\n\tcursor: [\"airbrush\", [7, 22], \"crosshair\"],\n\tpaint_on_time_interval: 5,\n\tpaint_mask(ctx, x, y) {\n\t\tconst r = airbrush_size / 2;\n\t\tfor (let i = 0; i < 6 + r / 5; i++) {\n\t\t\tconst rx = (Math.random() * 2 - 1) * r;\n\t\t\tconst ry = (Math.random() * 2 - 1) * r;\n\t\t\tconst d = rx * rx + ry * ry;\n\t\t\tif (d <= r * r) {\n\t\t\t\tctx.fillRect(x + ~~rx, y + ~~ry, 1, 1);\n\t\t\t}\n\t\t}\n\t\tupdate_helper_layer();\n\t},\n\t$options: $choose_airbrush_size,\n}, {\n\tid: TOOL_TEXT,\n\tname: localize(\"Text\"),\n\tspeech_recognition: [\n\t\t\"text\", \"type\", \"typography\", \"write\", \"writing\", \"words\", \"text box\", \"text-box\", \"textbox\", \"word\", \"lettering\", \"font\", \"fonts\", \"texts\",\n\t],\n\thelp_icon: \"p_txt.gif\",\n\tdescription: localize(\"Inserts text into the picture.\"),\n\tcursor: [\"precise\", [16, 16], \"crosshair\"],\n\tpreload() {\n\t\tsetTimeout(FontDetective.preload, 10);\n\t},\n\tselectBox(rect_x, rect_y, rect_width, rect_height) {\n\t\tif (rect_width > 1 && rect_height > 1) {\n\t\t\ttextbox = new OnCanvasTextBox(rect_x, rect_y, rect_width, rect_height);\n\t\t}\n\t},\n\t$options: $choose_transparent_mode,\n}, {\n\tid: TOOL_LINE,\n\tname: localize(\"Line\"),\n\tspeech_recognition: [\n\t\t\"line\", \"line segment\", \"straight line\",\n\t\t\"lines\", \"line segments\", \"straight lines\",\n\t],\n\thelp_icon: \"p_line.gif\",\n\tdescription: localize(\"Draws a straight line with the selected line width.\"),\n\tcursor: [\"precise\", [16, 16], \"crosshair\"],\n\tstroke_only: true,\n\tshape(ctx, x, y, w, h) {\n\t\tupdate_brush_for_drawing_lines(stroke_size);\n\t\tdraw_line(ctx, x, y, x + w, y + h, stroke_size);\n\t},\n\t$options: $choose_stroke_size,\n}, {\n\tid: TOOL_CURVE,\n\tname: localize(\"Curve\"),\n\tspeech_recognition: [\n\t\t\"curve\", \"curved line\", \"curvy\", \"curvy line\", \"Bezier\", \"Bezier curve\", \"spline\", \"curves\", \"splines\", \"curved\", \"curving\",\n\t\t\"wave\", \"wavy line\", \"rounded line\", \"round line\", \"oscilloscope\", \"sine wave\", \"cosine\", \"cosine wave\",\n\t],\n\thelp_icon: \"p_curve.gif\",\n\tdescription: localize(\"Draws a curved line with the selected line width.\"),\n\tcursor: [\"precise\", [16, 16], \"crosshair\"],\n\tstroke_only: true,\n\tpoints: [],\n\tpreview_canvas: null,\n\tpointerup(ctx, _x, _y) {\n\t\tif (this.points.length >= 4) {\n\t\t\tundoable({\n\t\t\t\tname: localize(\"Curve\"),\n\t\t\t\ticon: get_icon_for_tool(this),\n\t\t\t}, () => {\n\t\t\t\tctx.drawImage(this.preview_canvas, 0, 0);\n\t\t\t});\n\t\t\tthis.points = [];\n\t\t\t$status_size.text(\"\");\n\t\t}\n\t},\n\tpointerdown(_ctx, x, y) {\n\t\tif (this.points.length < 1) {\n\t\t\tthis.preview_canvas = make_canvas(main_canvas.width, main_canvas.height);\n\t\t\tthis.points.push({ x, y });\n\t\t\t// TODO: can we detect if the gesture is from the dwell clicker instead of checking the class?\n\t\t\tif (!$(\"body\").hasClass(\"dwell-clicker-mode\")) {\n\t\t\t\t// second point so first action draws a line\n\t\t\t\tthis.points.push({ x, y });\n\t\t\t}\n\t\t} else {\n\t\t\tthis.points.push({ x, y });\n\t\t}\n\t},\n\tpaint(_ctx, x, y) {\n\t\tif (this.points.length < 1) { return; }\n\n\t\tupdate_brush_for_drawing_lines(stroke_size);\n\n\t\tconst i = this.points.length - 1;\n\t\tthis.points[i].x = x;\n\t\tthis.points[i].y = y;\n\n\t\tthis.preview_canvas.ctx.clearRect(0, 0, this.preview_canvas.width, this.preview_canvas.height);\n\t\tthis.preview_canvas.ctx.strokeStyle = stroke_color;\n\n\t\t// Draw curves on preview canvas\n\t\tif (this.points.length === 4) {\n\t\t\tdraw_bezier_curve(\n\t\t\t\tthis.preview_canvas.ctx,\n\t\t\t\tthis.points[0].x, this.points[0].y,\n\t\t\t\tthis.points[2].x, this.points[2].y,\n\t\t\t\tthis.points[3].x, this.points[3].y,\n\t\t\t\tthis.points[1].x, this.points[1].y,\n\t\t\t\tstroke_size\n\t\t\t);\n\t\t} else if (this.points.length === 3) {\n\t\t\tdraw_quadratic_curve(\n\t\t\t\tthis.preview_canvas.ctx,\n\t\t\t\tthis.points[0].x, this.points[0].y,\n\t\t\t\tthis.points[2].x, this.points[2].y,\n\t\t\t\tthis.points[1].x, this.points[1].y,\n\t\t\t\tstroke_size\n\t\t\t);\n\t\t} else if (this.points.length === 2) {\n\t\t\tdraw_line(\n\t\t\t\tthis.preview_canvas.ctx,\n\t\t\t\tthis.points[0].x, this.points[0].y,\n\t\t\t\tthis.points[1].x, this.points[1].y,\n\t\t\t\tstroke_size\n\t\t\t);\n\t\t} else {\n\t\t\tdraw_line(\n\t\t\t\tthis.preview_canvas.ctx,\n\t\t\t\tthis.points[0].x, this.points[0].y,\n\t\t\t\tthis.points[0].x, this.points[0].y,\n\t\t\t\tstroke_size\n\t\t\t);\n\t\t}\n\n\t\t// MS Paint shows the mouse position relative to the first point\n\t\t// (and is afraid of the number zero)\n\t\tconst signed_width = x - this.points[0].x || 1;\n\t\tconst signed_height = y - this.points[0].y || 1;\n\t\t$status_size.text(`${signed_width}x${signed_height}`);\n\t\t// I don't know how helpful this is, might be more useful to show the number of points:\n\t\t// $status_size.text(`${this.points.length} / 4 points`);\n\t},\n\tdrawPreviewUnderGrid(ctx, _x, _y, _grid_visible, scale, translate_x, translate_y) {\n\t\t// if (!pointer_active && !pointer_over_canvas) { return; }\n\t\tif (!this.preview_canvas) { return; }\n\t\tctx.scale(scale, scale);\n\t\tctx.translate(translate_x, translate_y);\n\n\t\tif (this.points.length >= 1) {\n\t\t\tctx.drawImage(this.preview_canvas, 0, 0);\n\t\t}\n\t},\n\tcancel() {\n\t\tthis.points = [];\n\t\t$status_size.text(\"\");\n\t},\n\tend() {\n\t\tthis.points = [];\n\t\tupdate_helper_layer();\n\t\t$status_size.text(\"\");\n\t},\n\t$options: $choose_stroke_size,\n}, {\n\tid: TOOL_RECTANGLE,\n\tname: localize(\"Rectangle\"),\n\tspeech_recognition: [\n\t\t\"rectangle\", \"square\", \"box\", \"rect\",\n\t\t\"sharp rectangle\", \"sharp square\", \"sharp box\", \"sharp rect\",\n\t\t\"sharp corners rectangle\", \"sharp corners square\", \"sharp corners box\", \"sharp corners rect\",\n\t\t\"sharp cornered rectangle\", \"sharp cornered square\", \"sharp cornered box\", \"sharp cornered rect\",\n\t\t\"rectangle with sharp corners\", \"square with sharp corners\", \"box with sharp corners\", \"rect with sharp corners\",\n\n\t\t\"rectangles\", \"squares\", \"boxes\", \"rects\",\n\t\t\"sharp rectangles\", \"sharp squares\", \"sharp boxes\", \"sharp rects\",\n\t\t\"sharp corners rectangles\", \"sharp corners squares\", \"sharp corners boxes\", \"sharp corners rects\",\n\t\t\"sharp cornered rectangles\", \"sharp cornered squares\", \"sharp cornered boxes\", \"sharp cornered rects\",\n\t\t\"rectangles with sharp corners\", \"squares with sharp corners\", \"boxes with sharp corners\", \"rects with sharp corners\",\n\t],\n\thelp_icon: \"p_rect.gif\",\n\tdescription: localize(\"Draws a rectangle with the selected fill style.\"),\n\tcursor: [\"precise\", [16, 16], \"crosshair\"],\n\tshape(ctx, x, y, w, h) {\n\t\tif (w < 0) { x += w; w = -w; }\n\t\tif (h < 0) { y += h; h = -h; }\n\n\t\tif (this.$options.fill) {\n\t\t\tctx.fillRect(x, y, w, h);\n\t\t}\n\t\tif (this.$options.stroke) {\n\t\t\tif (w < stroke_size * 2 || h < stroke_size * 2) {\n\t\t\t\tctx.save();\n\t\t\t\tctx.fillStyle = ctx.strokeStyle;\n\t\t\t\tctx.fillRect(x, y, w, h);\n\t\t\t\tctx.restore();\n\t\t\t} else {\n\t\t\t\tctx.save();\n\t\t\t\tctx.fillStyle = ctx.strokeStyle;\n\t\t\t\tctx.fillRect(x, y, stroke_size, h);\n\t\t\t\tctx.fillRect(x + w - stroke_size, y, stroke_size, h);\n\t\t\t\tctx.fillRect(x, y, w, stroke_size);\n\t\t\t\tctx.fillRect(x, y + h - stroke_size, w, stroke_size);\n\t\t\t\tctx.restore();\n\t\t\t}\n\t\t}\n\t},\n\t$options: $ChooseShapeStyle(),\n}, {\n\tid: TOOL_POLYGON,\n\tname: localize(\"Polygon\"),\n\tspeech_recognition: [\n\t\t\"polygon\", \"poly\", \"shape\", \"n-gon\", \"free-form polygon\", \"freeform polygon\", \"free form polygon\",\n\t\t\"triangle\", \"quadrangle\", \"pentagon\", \"hexagon\", \"heptagon\", \"octagon\", \"nonagon\", \"decagon\", \"undecagon\", \"dodecagon\",\n\n\t\t\"polygons\", \"polys\", \"shapes\", \"n-gons\", \"free-form polygons\", \"freeform polygons\", \"free form polygons\",\n\t\t\"triangles\", \"quadrangles\", \"pentagons\", \"hexagons\", \"heptagons\", \"octagons\", \"nonagons\", \"decagons\", \"undecagons\", \"dodecagons\",\n\t],\n\thelp_icon: \"p_poly.gif\",\n\tdescription: localize(\"Draws a polygon with the selected fill style.\"),\n\tcursor: [\"precise\", [16, 16], \"crosshair\"],\n\n\t// Record the last click for double-clicking\n\t// A double click happens on pointerdown of a second click\n\t// (within a cylindrical volume in 2d space + 1d time)\n\tlast_click_pointerdown: { x: -Infinity, y: -Infinity, time: -Infinity },\n\tlast_click_pointerup: { x: -Infinity, y: -Infinity, time: -Infinity },\n\n\t// The vertices of the polygon\n\tpoints: [],\n\n\t// A canvas for rendering a preview of the shape\n\tpreview_canvas: null,\n\n\tpointerup(ctx, x, y) {\n\t\tif (this.points.length < 1) { return; }\n\n\t\tconst i = this.points.length - 1;\n\t\tthis.points[i].x = x;\n\t\tthis.points[i].y = y;\n\t\tconst dx = this.points[i].x - this.points[0].x;\n\t\tconst dy = this.points[i].y - this.points[0].y;\n\t\tconst d = Math.sqrt(dx * dx + dy * dy);\n\t\t// TODO: can we detect if the gesture is from the dwell clicker instead of checking the class?\n\t\tif ($(\"body\").hasClass(\"dwell-clicker-mode\")) {\n\t\t\tif (this.points.length >= 3) {\n\t\t\t\tif (d < stroke_size * 10 + 20) {\n\t\t\t\t\tthis.complete(ctx);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (d < stroke_size * 5.1010101) { // arbitrary number (@TODO: find correct value (or formula))\n\t\t\t\tthis.complete(ctx);\n\t\t\t}\n\t\t}\n\n\t\tthis.last_click_pointerup = { x, y, time: +(new Date()) };\n\n\t\tthis.updateStatus();\n\t},\n\tpointerdown(ctx, x, y) {\n\t\tif (this.points.length < 1) {\n\t\t\tthis.preview_canvas = make_canvas(main_canvas.width, main_canvas.height);\n\n\t\t\t// Add the first point of the polygon\n\t\t\tthis.points.push({ x, y });\n\n\t\t\t// TODO: can we detect if the gesture is from the dwell clicker instead of checking the class?\n\t\t\tif (!$(\"body\").hasClass(\"dwell-clicker-mode\")) {\n\t\t\t\t// Add a second point so first action draws a line\n\t\t\t\tthis.points.push({ x, y });\n\t\t\t}\n\t\t} else {\n\t\t\tconst lx = this.last_click_pointerdown.x;\n\t\t\tconst ly = this.last_click_pointerdown.y;\n\t\t\tconst lt = this.last_click_pointerdown.time;\n\t\t\tconst dx = x - lx;\n\t\t\tconst dy = y - ly;\n\t\t\tconst dt = +(new Date()) - lt;\n\t\t\tconst d = Math.sqrt(dx * dx + dy * dy);\n\t\t\tif (d < 4.1010101 && dt < 250) { // arbitrary 101 (@TODO: find correct value (or formula))\n\t\t\t\tthis.complete(ctx);\n\t\t\t} else {\n\t\t\t\t// Add the point\n\t\t\t\tthis.points.push({ x, y });\n\t\t\t}\n\t\t}\n\t\tthis.last_click_pointerdown = { x, y, time: +new Date() };\n\t},\n\tpaint(_ctx, x, y) {\n\t\tif (this.points.length < 1) { return; }\n\n\t\tconst i = this.points.length - 1;\n\t\tthis.points[i].x = x;\n\t\tthis.points[i].y = y;\n\n\t\tthis.preview_canvas.ctx.clearRect(0, 0, this.preview_canvas.width, this.preview_canvas.height);\n\t\tif (this.$options.fill && !this.$options.stroke) {\n\t\t\tthis.preview_canvas.ctx.drawImage(main_canvas, 0, 0);\n\t\t\tthis.preview_canvas.ctx.strokeStyle = \"white\";\n\t\t\tthis.preview_canvas.ctx.globalCompositeOperation = \"difference\";\n\t\t\tvar orig_stroke_size = stroke_size;\n\t\t\tstroke_size = 2;\n\t\t\tdraw_line_strip(\n\t\t\t\tthis.preview_canvas.ctx,\n\t\t\t\tthis.points\n\t\t\t);\n\t\t\tstroke_size = orig_stroke_size;\n\t\t} else if (this.points.length > 1) {\n\t\t\tthis.preview_canvas.ctx.strokeStyle = stroke_color;\n\t\t\tdraw_line_strip(\n\t\t\t\tthis.preview_canvas.ctx,\n\t\t\t\tthis.points\n\t\t\t);\n\t\t} else {\n\t\t\tdraw_line(\n\t\t\t\tthis.preview_canvas.ctx,\n\t\t\t\tthis.points[0].x, this.points[0].y,\n\t\t\t\tthis.points[0].x, this.points[0].y,\n\t\t\t\tstroke_size\n\t\t\t);\n\t\t}\n\n\t\tthis.updateStatus();\n\t},\n\tdrawPreviewUnderGrid(ctx, _x, _y, _grid_visible, scale, translate_x, translate_y) {\n\t\t// if (!pointer_active && !pointer_over_canvas) { return; }\n\t\tif (!this.preview_canvas) { return; }\n\n\t\tctx.scale(scale, scale);\n\t\tctx.translate(translate_x, translate_y);\n\n\t\tctx.drawImage(this.preview_canvas, 0, 0);\n\t},\n\tcomplete(ctx) {\n\t\tif (this.points.length >= 3) {\n\t\t\tundoable({\n\t\t\t\tname: localize(\"Polygon\"),\n\t\t\t\ticon: get_icon_for_tool(this),\n\t\t\t}, () => {\n\t\t\t\tctx.fillStyle = fill_color;\n\t\t\t\tctx.strokeStyle = stroke_color;\n\n\t\t\t\tvar orig_stroke_size = stroke_size;\n\t\t\t\tif (this.$options.fill && !this.$options.stroke) {\n\t\t\t\t\tstroke_size = 2;\n\t\t\t\t\tctx.strokeStyle = fill_color;\n\t\t\t\t}\n\n\t\t\t\tdraw_polygon(\n\t\t\t\t\tctx,\n\t\t\t\t\tthis.points,\n\t\t\t\t\tthis.$options.stroke || (this.$options.fill && !this.$options.stroke),\n\t\t\t\t\tthis.$options.fill\n\t\t\t\t);\n\n\t\t\t\tstroke_size = orig_stroke_size;\n\t\t\t});\n\t\t}\n\n\t\tthis.reset();\n\t},\n\tcancel() {\n\t\tthis.reset();\n\t},\n\tend(ctx) {\n\t\tthis.complete(ctx);\n\t\tupdate_helper_layer();\n\t},\n\tupdateStatus() {\n\t\tlet x_min = +Infinity;\n\t\tlet x_max = -Infinity;\n\t\tlet y_min = +Infinity;\n\t\tlet y_max = -Infinity;\n\t\tfor (const point of this.points) {\n\t\t\tx_min = Math.min(point.x, x_min);\n\t\t\tx_max = Math.max(point.x, x_max);\n\t\t\ty_min = Math.min(point.y, y_min);\n\t\t\ty_max = Math.max(point.y, y_max);\n\t\t}\n\t\tconst signed_width = x_max - x_min || 1;\n\t\tconst signed_height = y_max - y_min || 1;\n\t\t$status_size.text(`${signed_width}x${signed_height}`);\n\t},\n\treset() {\n\t\t$status_size.text(\"\");\n\t\tthis.points = [];\n\t\tthis.last_click_pointerdown = { x: -Infinity, y: -Infinity, time: -Infinity };\n\t\tthis.last_click_pointerup = { x: -Infinity, y: -Infinity, time: -Infinity };\n\n\t\tif (!this.preview_canvas) { return; }\n\t\tthis.preview_canvas.width = 1;\n\t\tthis.preview_canvas.height = 1;\n\t},\n\tshape_colors: true,\n\t$options: $ChooseShapeStyle(),\n}, {\n\tid: TOOL_ELLIPSE,\n\tname: localize(\"Ellipse\"),\n\tspeech_recognition: [\n\t\t\"ellipse\", \"circle\", \"oval\", \"ovoid\", \"ovaloid\", \"oviform\", \"elliptical\", \"oblong circle\", \"stretched circle\", \"ball\", \"sphere\", \"round tool\", \"rounded tool\",\n\t\t\"ellipses\", \"circles\", \"ovals\", \"ovoids\", \"ovaloids\", \"oviforms\", \"ellipticals\", \"oblong circles\", \"stretched circles\", \"balls\", \"spheres\",\n\t],\n\thelp_icon: \"p_oval.gif\",\n\tdescription: localize(\"Draws an ellipse with the selected fill style.\"),\n\tcursor: [\"precise\", [16, 16], \"crosshair\"],\n\tshape(ctx, x, y, w, h) {\n\t\tif (w < 0) { x += w; w = -w; }\n\t\tif (h < 0) { y += h; h = -h; }\n\n\t\tif (w < stroke_size || h < stroke_size) {\n\t\t\tctx.fillStyle = ctx.strokeStyle;\n\t\t\tdraw_ellipse(ctx, x, y, w, h, false, true);\n\t\t} else {\n\t\t\tdraw_ellipse(\n\t\t\t\tctx,\n\t\t\t\tx + ~~(stroke_size / 2),\n\t\t\t\ty + ~~(stroke_size / 2),\n\t\t\t\tw - stroke_size,\n\t\t\t\th - stroke_size,\n\t\t\t\tthis.$options.stroke,\n\t\t\t\tthis.$options.fill\n\t\t\t);\n\t\t}\n\t},\n\t$options: $ChooseShapeStyle(),\n}, {\n\tid: TOOL_ROUNDED_RECTANGLE,\n\tname: localize(\"Rounded Rectangle\"),\n\tspeech_recognition: [\n\t\t\"rounded rectangle\", \"rounded square\", \"rounded box\",\n\t\t\"round rectangle\", \"round square\", \"round box\",\n\t\t\"rounded corners rectangle\", \"rounded corners square\", \"rounded corners box\",\n\t\t\"round cornered rectangle\", \"round cornered square\", \"round cornered box\",\n\t\t\"rounded cornered rectangle\", \"rounded cornered square\", \"rounded cornered box\",\n\t\t\"rounded corner rectangle\", \"rounded corner square\", \"rounded corner box\",\n\t\t\"rectangle with round corners\", \"square with round corners\", \"box with round corners\",\n\t\t\"rectangle with rounded corners\", \"square with rounded corners\", \"box with rounded corners\",\n\t\t\"soft rectangle\", \"soft square\", \"soft box\",\n\t\t\"soft corners rectangle\", \"soft corners square\", \"soft corners box\",\n\t\t\"soft cornered rectangle\", \"soft cornered square\", \"soft cornered box\",\n\t\t\"soft corner rectangle\", \"soft corner square\", \"soft corner box\",\n\t\t\"rectangle with soft corners\", \"square with soft corners\", \"box with soft corners\",\n\t\t\"round rect\", \"roundrect\",\n\n\t\t\"rounded rectangles\", \"rounded squares\", \"rounded boxes\",\n\t\t\"round rectangles\", \"round squares\", \"round boxes\",\n\t\t\"rounded corners rectangles\", \"rounded corners squares\", \"rounded corners boxes\",\n\t\t\"round cornered rectangles\", \"round cornered squares\", \"round cornered boxes\",\n\t\t\"rounded cornered rectangles\", \"rounded cornered squares\", \"rounded cornered boxes\",\n\t\t\"rounded corner rectangles\", \"rounded corner squares\", \"rounded corner boxes\",\n\t\t\"rectangles with round corners\", \"squares with round corners\", \"boxes with round corners\",\n\t\t\"rectangles with rounded corners\", \"squares with rounded corners\", \"boxes with rounded corners\",\n\t\t\"soft rectangles\", \"soft squares\", \"soft boxes\",\n\t\t\"soft corners rectangles\", \"soft corners squares\", \"soft corners boxes\",\n\t\t\"soft cornered rectangles\", \"soft cornered squares\", \"soft cornered boxes\",\n\t\t\"soft corner rectangles\", \"soft corner squares\", \"soft corner boxes\",\n\t\t\"rectangles with soft corners\", \"squares with soft corners\", \"boxes with soft corners\",\n\t\t\"round rects\", \"roundrects\",\n\t],\n\thelp_icon: \"p_rrect.gif\",\n\tdescription: localize(\"Draws a rounded rectangle with the selected fill style.\"),\n\tcursor: [\"precise\", [16, 16], \"crosshair\"],\n\tshape(ctx, x, y, w, h) {\n\t\tif (w < 0) { x += w; w = -w; }\n\t\tif (h < 0) { y += h; h = -h; }\n\n\t\tif (w < stroke_size || h < stroke_size) {\n\t\t\tctx.fillStyle = ctx.strokeStyle;\n\t\t\tconst radius = Math.min(8, w / 2, h / 2);\n\t\t\t// const radius_x = Math.min(8, w/2);\n\t\t\t// const radius_y = Math.min(8, h/2);\n\t\t\tdraw_rounded_rectangle(\n\t\t\t\tctx,\n\t\t\t\tx, y, w, h,\n\t\t\t\tradius, radius,\n\t\t\t\t// radius_x, radius_y,\n\t\t\t\tfalse,\n\t\t\t\ttrue\n\t\t\t);\n\t\t} else {\n\t\t\tconst radius = Math.min(8, (w - stroke_size) / 2, (h - stroke_size) / 2);\n\t\t\t// const radius_x = Math.min(8, (w - stroke_size)/2);\n\t\t\t// const radius_y = Math.min(8, (h - stroke_size)/2);\n\t\t\tdraw_rounded_rectangle(\n\t\t\t\tctx,\n\t\t\t\tx + ~~(stroke_size / 2),\n\t\t\t\ty + ~~(stroke_size / 2),\n\t\t\t\tw - stroke_size,\n\t\t\t\th - stroke_size,\n\t\t\t\tradius, radius,\n\t\t\t\t// radius_x, radius_y,\n\t\t\t\tthis.$options.stroke,\n\t\t\t\tthis.$options.fill\n\t\t\t);\n\t\t}\n\t},\n\t$options: $ChooseShapeStyle(),\n}];\n\n/* eslint-enable no-restricted-syntax */\n\ntools.forEach((tool) => {\n\tif (tool.selectBox) {\n\t\t// TODO: is drag_start_x/y redundant with pointer_start.x/y?\n\t\tlet drag_start_x = 0;\n\t\tlet drag_start_y = 0;\n\t\tlet pointer_has_moved = false;\n\t\tlet rect_x = 0;\n\t\tlet rect_y = 0;\n\t\tlet rect_width = 0;\n\t\tlet rect_height = 0;\n\n\t\ttool.pointerdown = () => {\n\t\t\tdrag_start_x = pointer.x;\n\t\t\tdrag_start_y = pointer.y;\n\t\t\tpointer_has_moved = false;\n\t\t\t$G.one(\"pointermove\", () => {\n\t\t\t\tpointer_has_moved = true;\n\t\t\t});\n\t\t\tif (selection) {\n\t\t\t\tmeld_selection_into_canvas();\n\t\t\t}\n\t\t\tif (textbox) {\n\t\t\t\tmeld_textbox_into_canvas();\n\t\t\t}\n\t\t\tcanvas_handles.hide();\n\t\t};\n\t\ttool.paint = () => {\n\t\t\trect_x = ~~Math.max(0, Math.min(drag_start_x, pointer.x));\n\t\t\trect_y = ~~Math.max(0, Math.min(drag_start_y, pointer.y));\n\t\t\trect_width = (~~Math.min(main_canvas.width, Math.max(drag_start_x, pointer.x) + 1)) - rect_x;\n\t\t\trect_height = (~~Math.min(main_canvas.height, Math.max(drag_start_y, pointer.y + 1))) - rect_y;\n\t\t\t$status_size.text(`${rect_width}x${rect_height}`); // note that OnCanvasObject/OnCanvasTextBox/OnCanvasSelection also manages this status text\n\t\t};\n\t\ttool.pointerup = () => {\n\t\t\t$status_size.text(\"\"); // note that OnCanvasObject/OnCanvasTextBox/OnCanvasSelection also manages this status text\n\t\t\tcanvas_handles.show();\n\t\t\ttool.selectBox(rect_x, rect_y, rect_width, rect_height);\n\t\t};\n\t\ttool.cancel = () => {\n\t\t\tcanvas_handles.show();\n\t\t};\n\t\ttool.drawPreviewUnderGrid = (ctx, _x, _y, _grid_visible, scale, translate_x, translate_y) => {\n\t\t\tif (!pointer_active) { return; }\n\t\t\tif (!pointer_has_moved) { return; }\n\n\t\t\tctx.scale(scale, scale);\n\t\t\tctx.translate(translate_x, translate_y);\n\n\t\t\t// make the document canvas part of the helper canvas so that inversion can apply to it\n\t\t\tctx.drawImage(main_canvas, 0, 0);\n\t\t};\n\t\ttool.drawPreviewAboveGrid = (ctx, _x, _y, _grid_visible, scale, translate_x, translate_y) => {\n\t\t\tif (!pointer_active) { return; }\n\t\t\tif (!pointer_has_moved) { return; }\n\n\t\t\tdraw_selection_box(ctx, rect_x, rect_y, rect_width, rect_height, scale, translate_x, translate_y);\n\t\t};\n\t}\n\tif (tool.shape) {\n\t\ttool.shape_canvas = null;\n\t\ttool.pointerdown = () => {\n\t\t\ttool.shape_canvas = make_canvas(main_canvas.width, main_canvas.height);\n\t\t};\n\t\ttool.paint = () => {\n\t\t\ttool.shape_canvas.ctx.clearRect(0, 0, tool.shape_canvas.width, tool.shape_canvas.height);\n\t\t\ttool.shape_canvas.ctx.fillStyle = main_ctx.fillStyle;\n\t\t\ttool.shape_canvas.ctx.strokeStyle = main_ctx.strokeStyle;\n\t\t\ttool.shape_canvas.ctx.lineWidth = main_ctx.lineWidth;\n\t\t\ttool.shape(tool.shape_canvas.ctx, pointer_start.x, pointer_start.y, pointer.x - pointer_start.x, pointer.y - pointer_start.y);\n\t\t\tconst signed_width = pointer.x - pointer_start.x || 1;\n\t\t\tconst signed_height = pointer.y - pointer_start.y || 1;\n\t\t\t$status_size.text(`${signed_width}x${signed_height}`);\n\t\t};\n\t\ttool.pointerup = () => {\n\t\t\t$status_size.text(\"\"); // also handles canceling with two mouse buttons or escape key\n\t\t\tif (!tool.shape_canvas) { return; }\n\t\t\tundoable({\n\t\t\t\tname: tool.name,\n\t\t\t\ticon: get_icon_for_tool(tool),\n\t\t\t}, () => {\n\t\t\t\tmain_ctx.drawImage(tool.shape_canvas, 0, 0);\n\t\t\t\ttool.shape_canvas = null;\n\t\t\t});\n\t\t};\n\t\ttool.drawPreviewUnderGrid = (ctx, _x, _y, _grid_visible, scale, translate_x, translate_y) => {\n\t\t\tif (!pointer_active) { return; }\n\t\t\tif (!tool.shape_canvas) { return; }\n\n\t\t\tctx.scale(scale, scale);\n\t\t\tctx.translate(translate_x, translate_y);\n\n\t\t\tctx.drawImage(tool.shape_canvas, 0, 0);\n\t\t};\n\t}\n\tif (tool.paint_mask) {\n\n\t\t// binary mask of the drawn area, either opaque white or transparent\n\t\ttool.mask_canvas = null;\n\n\t\ttool.pointerdown = (_ctx, _x, _y) => {\n\t\t\tif (!tool.mask_canvas) {\n\t\t\t\ttool.mask_canvas = make_canvas(main_canvas.width, main_canvas.height);\n\t\t\t}\n\t\t\tif (tool.mask_canvas.width !== main_canvas.width) {\n\t\t\t\ttool.mask_canvas.width = main_canvas.width;\n\t\t\t}\n\t\t\tif (tool.mask_canvas.height !== main_canvas.height) {\n\t\t\t\ttool.mask_canvas.height = main_canvas.height;\n\t\t\t}\n\t\t\ttool.mask_canvas.ctx.disable_image_smoothing();\n\t\t};\n\t\ttool.pointerup = () => {\n\t\t\tif (!tool.mask_canvas) {\n\t\t\t\treturn; // not sure why this would happen per se\n\t\t\t}\n\t\t\tundoable({\n\t\t\t\tname: tool.name,\n\t\t\t\ticon: get_icon_for_tool(tool),\n\t\t\t}, () => {\n\t\t\t\ttool.render_from_mask(main_ctx);\n\n\t\t\t\ttool.mask_canvas.width = 1;\n\t\t\t\ttool.mask_canvas.height = 1;\n\t\t\t});\n\t\t};\n\t\ttool.paint = (_ctx, x, y) => {\n\t\t\ttool.paint_mask(tool.mask_canvas.ctx, x, y);\n\t\t};\n\t\ttool.cancel = () => {\n\t\t\tif (tool.mask_canvas) {\n\t\t\t\ttool.mask_canvas.width = 1;\n\t\t\t\ttool.mask_canvas.height = 1;\n\t\t\t}\n\t\t};\n\t\ttool.render_from_mask = (ctx, previewing) => { // could be private\n\t\t\tctx.save();\n\t\t\tctx.globalCompositeOperation = \"destination-out\";\n\t\t\tctx.drawImage(tool.mask_canvas, 0, 0);\n\t\t\tctx.restore();\n\n\t\t\t/** @type {string | CanvasGradient | CanvasPattern} */\n\t\t\tlet color = stroke_color;\n\t\t\t// I've seen firefox give [ 254, 254, 254, 254 ] for get_rgba_from_color(\"#fff\")\n\t\t\t// or other values\n\t\t\t// even with privacy.resistFingerprinting set to false\n\t\t\t// the canvas API is just genuinely not reliable for exact color values\n\t\t\tconst translucent = get_rgba_from_color(color)[3] < 253;\n\t\t\tif (translucent && previewing) {\n\t\t\t\tconst t = performance.now() / 2000;\n\t\t\t\t// @TODO: DRY\n\t\t\t\t// animated rainbow effect representing transparency,\n\t\t\t\t// in lieu of any good way to draw temporary transparency in the current setup\n\t\t\t\t// 5 distinct colors, 5 distinct gradients, 7 color stops, 6 gradients\n\t\t\t\tconst n = 6;\n\t\t\t\tconst h = ctx.canvas.height;\n\t\t\t\tconst y = (t % 1) * -h * (n - 1);\n\t\t\t\tconst gradient = ctx.createLinearGradient(0, y, 0, y + h * n);\n\t\t\t\tgradient.addColorStop(0 / n, \"red\");\n\t\t\t\tgradient.addColorStop(1 / n, \"gold\");\n\t\t\t\tgradient.addColorStop(2 / n, \"#00d90b\");\n\t\t\t\tgradient.addColorStop(3 / n, \"#2e64d9\");\n\t\t\t\tgradient.addColorStop(4 / n, \"#8f2ed9\");\n\t\t\t\t// last two same as the first two so it can seamlessly wrap\n\t\t\t\tgradient.addColorStop(5 / n, \"red\");\n\t\t\t\tgradient.addColorStop(6 / n, \"gold\");\n\t\t\t\tcolor = gradient;\n\t\t\t}\n\t\t\t// @TODO: perf: keep this canvas around too\n\t\t\tconst mask_fill_canvas = make_canvas(tool.mask_canvas);\n\t\t\treplace_colors_with_swatch(mask_fill_canvas.ctx, color, 0, 0);\n\t\t\tctx.drawImage(mask_fill_canvas, 0, 0);\n\t\t\treturn translucent;\n\t\t};\n\t\ttool.drawPreviewUnderGrid = (ctx, _x, _y, _grid_visible, scale, translate_x, translate_y) => {\n\t\t\tif (!pointer_active && !pointer_over_canvas) { return; }\n\n\t\t\tctx.scale(scale, scale);\n\t\t\tctx.translate(translate_x, translate_y);\n\n\t\t\tif (tool.mask_canvas) {\n\t\t\t\tconst should_animate = tool.render_from_mask(ctx, true);\n\t\t\t\tif (should_animate) {\n\t\t\t\t\t// animate for gradient\n\t\t\t\t\t// TODO: is rAF needed? update_helper_layer uses rAF\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\tupdate_helper_layer();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\tif (tool.get_brush) {\n\t\t// binary mask of the drawn area, either opaque white or transparent\n\t\ttool.mask_canvas = null;\n\n\t\ttool.init_mask_canvas = (_ctx, _x, _y) => {\n\t\t\tif (!tool.mask_canvas) {\n\t\t\t\ttool.mask_canvas = make_canvas(main_canvas.width, main_canvas.height);\n\t\t\t}\n\t\t\tif (tool.mask_canvas.width !== main_canvas.width) {\n\t\t\t\ttool.mask_canvas.width = main_canvas.width;\n\t\t\t}\n\t\t\tif (tool.mask_canvas.height !== main_canvas.height) {\n\t\t\t\ttool.mask_canvas.height = main_canvas.height;\n\t\t\t}\n\t\t\ttool.mask_canvas.ctx.disable_image_smoothing();\n\t\t};\n\t\ttool.pointerdown = (_ctx, _x, _y) => {\n\t\t\ttool.init_mask_canvas();\n\t\t};\n\t\ttool.pointerup = () => {\n\t\t\tundoable({\n\t\t\t\tname: tool.name,\n\t\t\t\ticon: get_icon_for_tool(tool),\n\t\t\t}, () => {\n\t\t\t\ttool.render_from_mask(main_ctx);\n\n\t\t\t\ttool.mask_canvas.width = 1;\n\t\t\t\ttool.mask_canvas.height = 1;\n\t\t\t});\n\t\t};\n\n\t\ttool.paint = () => {\n\t\t\tconst brush = tool.get_brush();\n\t\t\tconst circumference_points = get_circumference_points_for_brush(brush.shape, brush.size);\n\t\t\ttool.mask_canvas.ctx.fillStyle = stroke_color;\n\t\t\tconst iterate_line = brush.size > 1 ? bresenham_dense_line : bresenham_line;\n\t\t\titerate_line(pointer_previous.x, pointer_previous.y, pointer.x, pointer.y, (x, y) => {\n\t\t\t\tfor (const point of circumference_points) {\n\t\t\t\t\ttool.mask_canvas.ctx.fillRect(x + point.x, y + point.y, 1, 1);\n\t\t\t\t}\n\t\t\t});\n\t\t\tstamp_brush_canvas(tool.mask_canvas.ctx, pointer_previous.x, pointer_previous.y, brush.shape, brush.size);\n\t\t\tstamp_brush_canvas(tool.mask_canvas.ctx, pointer.x, pointer.y, brush.shape, brush.size);\n\t\t};\n\n\t\ttool.cancel = () => {\n\t\t\tif (tool.mask_canvas) {\n\t\t\t\ttool.mask_canvas.width = 1;\n\t\t\t\ttool.mask_canvas.height = 1;\n\t\t\t}\n\t\t};\n\t\ttool.render_from_mask = (ctx, previewing) => { // could be private\n\t\t\tctx.save();\n\t\t\tctx.globalCompositeOperation = \"destination-out\";\n\t\t\tctx.drawImage(tool.mask_canvas, 0, 0);\n\t\t\tctx.restore();\n\n\t\t\t/** @type {string | CanvasGradient | CanvasPattern} */\n\t\t\tlet color = stroke_color;\n\t\t\t// I've seen firefox give [ 254, 254, 254, 254 ] for get_rgba_from_color(\"#fff\")\n\t\t\t// or other values\n\t\t\t// even with privacy.resistFingerprinting set to false\n\t\t\t// the canvas API is just genuinely not reliable for exact color values\n\t\t\tconst translucent = get_rgba_from_color(color)[3] < 253;\n\t\t\tif (translucent && previewing) {\n\t\t\t\tconst t = performance.now() / 2000;\n\t\t\t\t// @TODO: DRY\n\t\t\t\t// animated rainbow effect representing transparency,\n\t\t\t\t// in lieu of any good way to draw temporary transparency in the current setup\n\t\t\t\t// 5 distinct colors, 5 distinct gradients, 7 color stops, 6 gradients\n\t\t\t\tconst n = 6;\n\t\t\t\tconst h = ctx.canvas.height;\n\t\t\t\tconst y = (t % 1) * -h * (n - 1);\n\t\t\t\tconst gradient = ctx.createLinearGradient(0, y, 0, y + h * n);\n\t\t\t\tgradient.addColorStop(0 / n, \"red\");\n\t\t\t\tgradient.addColorStop(1 / n, \"gold\");\n\t\t\t\tgradient.addColorStop(2 / n, \"#00d90b\");\n\t\t\t\tgradient.addColorStop(3 / n, \"#2e64d9\");\n\t\t\t\tgradient.addColorStop(4 / n, \"#8f2ed9\");\n\t\t\t\t// last two same as the first two so it can seamlessly wrap\n\t\t\t\tgradient.addColorStop(5 / n, \"red\");\n\t\t\t\tgradient.addColorStop(6 / n, \"gold\");\n\t\t\t\tcolor = gradient;\n\t\t\t}\n\t\t\t// @TODO: perf: keep this canvas around too\n\t\t\tconst mask_fill_canvas = make_canvas(tool.mask_canvas);\n\t\t\tif (previewing && tool.dynamic_preview_cursor) {\n\t\t\t\tconst brush = tool.get_brush();\n\t\t\t\t// dynamic cursor preview:\n\t\t\t\t// stamp just onto this temporary canvas so it's temporary\n\t\t\t\tstamp_brush_canvas(mask_fill_canvas.ctx, pointer.x, pointer.y, brush.shape, brush.size);\n\t\t\t}\n\t\t\treplace_colors_with_swatch(mask_fill_canvas.ctx, color, 0, 0);\n\t\t\tctx.drawImage(mask_fill_canvas, 0, 0);\n\t\t\treturn translucent;\n\t\t};\n\t\ttool.drawPreviewUnderGrid = (ctx, _x, _y, _grid_visible, scale, translate_x, translate_y) => {\n\t\t\tif (!pointer_active && !pointer_over_canvas) { return; }\n\n\t\t\tctx.scale(scale, scale);\n\t\t\tctx.translate(translate_x, translate_y);\n\n\t\t\ttool.init_mask_canvas();\n\n\t\t\tconst should_animate = tool.render_from_mask(ctx, true);\n\n\t\t\tif (should_animate) {\n\t\t\t\t// animate for gradient\n\t\t\t\t// TODO: is rAF needed? update_helper_layer uses rAF\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tupdate_helper_layer();\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t}\n});\n\n\nexport {\n\tTOOL_AIRBRUSH, TOOL_BRUSH, TOOL_CURVE, TOOL_ELLIPSE, TOOL_ERASER,\n\tTOOL_FILL, TOOL_FREE_FORM_SELECT, TOOL_LINE, TOOL_MAGNIFIER,\n\tTOOL_PENCIL, TOOL_PICK_COLOR, TOOL_POLYGON, TOOL_RECTANGLE, TOOL_ROUNDED_RECTANGLE, TOOL_SELECT, TOOL_TEXT,\n\ttools\n};\n// Temporary globals until all dependent code is converted to ES Modules\nwindow.TOOL_PENCIL = TOOL_PENCIL; // used by app-state.js\n"
  },
  {
    "path": "src/vaporwave-fun.js",
    "content": "// @ts-check\nimport { onKonamiCodeEntered } from \"./konami.js\";\n(() => {\n\t/** @type {number} */\n\tlet rAF_ID;\n\t/** @type {HTMLImageElement} */\n\tlet rotologo;\n\t/** @type {(e: KeyboardEvent) => void} */\n\tlet space_phase_key_handler;\n\t/** @type {YT.Player} */\n\tlet player;\n\t/** @type {HTMLElement} */\n\tlet player_placeholder;\n\t/** @type {boolean} */\n\tlet vaporwave_active = false;\n\n\t/** @type {JQuery<HTMLElement>} */\n\tlet $window;\n\tif (parent && frameElement && parent.jQuery) {\n\t\t$window = /** @type {JQuery<HTMLElement>} */(parent.jQuery(frameElement).closest(\".window, .os-window\"));\n\t} else {\n\t\t$window = $();\n\t}\n\n\tconst wait_for_youtube_api = (callback) => {\n\t\tif (typeof YT !== \"undefined\") {\n\t\t\tcallback();\n\t\t} else {\n\t\t\tconst tag = document.createElement(\"script\");\n\t\t\ttag.src = \"https://www.youtube.com/player_api\";\n\t\t\tconst firstScriptTag = document.getElementsByTagName(\"script\")[0];\n\t\t\tfirstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n\n\t\t\t// The YouTube API will call this global function when loaded and ready.\n\t\t\twindow.onYouTubeIframeAPIReady = () => {\n\t\t\t\tcallback();\n\t\t\t};\n\t\t}\n\t};\n\n\tconst stop_vaporwave = () => {\n\t\tvaporwave_active = false;\n\n\t\tcancelAnimationFrame(rAF_ID);\n\n\t\t$(rotologo).remove();\n\t\t$window.css({ transform: \"\" });\n\n\t\tremoveEventListener(\"keydown\", space_phase_key_handler);\n\t\tif (player) {\n\t\t\tplayer.destroy();\n\t\t\tplayer = null;\n\t\t}\n\t\t$(player_placeholder).remove();\n\n\t\t// vaporwave is dead. long live vaporwave.\n\t\t// bepis pepsi isded pepsi isded\n\t};\n\n\tconst start_vaporwave = () => {\n\t\tvaporwave_active = true;\n\n\t\trotologo = document.createElement(\"img\");\n\t\trotologo.classList.add(\"rotologo\");\n\t\tif (frameElement) {\n\t\t\tframeElement.parentElement.appendChild(rotologo);\n\t\t\trotologo.src = \"images/logo/98.js.org.svg\";\n\t\t} else {\n\t\t\tdocument.body.appendChild(rotologo);\n\t\t\trotologo.src = \"images/98.js.org.svg\";\n\t\t}\n\n\t\t$(rotologo).css({\n\t\t\tposition: \"absolute\",\n\t\t\tleft: \"50%\",\n\t\t\ttop: \"50%\",\n\t\t\tpointerEvents: \"none\",\n\t\t\ttransformOrigin: \"0% 0%\",\n\t\t\ttransition: \"opacity 1s ease\",\n\t\t\topacity: \"0\",\n\t\t});\n\n\t\tconst animate = () => {\n\t\t\trAF_ID = requestAnimationFrame(animate);\n\n\t\t\t// @TODO: slow down and stop when you pause?\n\t\t\tconst turns = Math.sin(Date.now() / 5000);\n\t\t\tconst hueTurns = Math.sin(Date.now() / 4000);\n\t\t\t$(rotologo).css({\n\t\t\t\ttransform: `perspective(4000px) rotateY(${turns}turn) translate(-50%, -50%) translateZ(500px)`,\n\t\t\t\tfilter: `hue-rotate(${hueTurns}turn)`,\n\t\t\t});\n\n\t\t\tif ($window.length) {\n\t\t\t\tlet el = $window[0];\n\t\t\t\tlet offsetLeft = 0;\n\t\t\t\tlet offsetTop = 0;\n\t\t\t\tdo {\n\t\t\t\t\toffsetLeft += el.offsetLeft;\n\t\t\t\t\toffsetTop += el.offsetTop;\n\t\t\t\t\t// Doing this a little bit messily because I want it to be type-safe,\n\t\t\t\t\t// but I'm not 100% sure this is correct and I don't want to spend too much time on it\n\t\t\t\t\t// To test this, I need to run it in 98.js.org\n\t\t\t\t\tif (el.offsetParent instanceof HTMLElement) {\n\t\t\t\t\t\tel = el.offsetParent;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} while (el);\n\n\t\t\t\tconst rotateY = -(offsetLeft + ($window.outerWidth() - parent.innerWidth) / 2) / parent.innerWidth / 3;\n\t\t\t\tconst rotateX = (offsetTop + ($window.outerHeight() - parent.innerHeight) / 2) / parent.innerHeight / 3;\n\t\t\t\t$window.css({\n\t\t\t\t\ttransform: `perspective(4000px) rotateY(${rotateY}turn) rotateX(${rotateX}turn)`,\n\t\t\t\t\ttransformOrigin: \"50% 50%\",\n\t\t\t\t\ttransformStyle: \"preserve-3d\",\n\t\t\t\t\t// @FIXME: interactivity problems (with order elements are considered to have), I think related to preserve-3d\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t\tanimate();\n\n\t\tplayer_placeholder = document.createElement(\"div\");\n\t\tdocument.querySelector(\".canvas-area\").appendChild(player_placeholder);\n\t\t$(player_placeholder).css({\n\t\t\tposition: \"absolute\",\n\t\t\ttop: \"3px\", // @TODO: dynamic\n\t\t\tleft: \"3px\",\n\t\t\tmixBlendMode: \"multiply\",\n\t\t\tpointerEvents: \"none\",\n\t\t\ttransition: \"opacity 0.4s ease\",\n\t\t\twidth: \"100vw\",\n\t\t\theight: \"100vh\",\n\t\t});\n\t\t// NOTE: placeholder not a container; the YT API replaces the element passed in the DOM\n\t\t// but keeps inline styles apparently, and maybe other things, I don't know; it's weird\n\n\t\twait_for_youtube_api(() => {\n\t\t\tplayer = new YT.Player(player_placeholder, {\n\t\t\t\theight: \"390\",\n\t\t\t\twidth: \"640\",\n\t\t\t\tvideoId: \"8TvcyPCgKSU\",\n\t\t\t\tplayerVars: {\n\t\t\t\t\tautoplay: 1,\n\t\t\t\t\tcontrols: 0,\n\t\t\t\t},\n\t\t\t\tevents: {\n\t\t\t\t\tonReady: onPlayerReady,\n\t\t\t\t\tonStateChange: onPlayerStateChange,\n\t\t\t\t},\n\t\t\t});\n\t\t\t// @TODO: attribution for this video!\n\t\t\t// I mean, you can see the title if you hit spacebar, but\n\t\t\t// I could make it wave across the screen behind Paint on the desktop\n\t\t\t// I could add a \"Song Name?\" button that responds \"Darude Sandstorm\"\n\t\t\t// I could add a \"Song At 420?\" button that actually links to the video\n\t\t\t// some number of those things or something like that\n\t\t});\n\n\t\t// The API will call this function when the video player is ready.\n\t\tfunction onPlayerReady(_event) {\n\t\t\tplayer.playVideo();\n\t\t\tplayer.unMute();\n\t\t}\n\n\t\t// The API calls this function when the player's state changes.\n\t\tfunction onPlayerStateChange(event) {\n\t\t\tif (event.data == YT.PlayerState.PLAYING) {\n\t\t\t\t// @TODO: pause and resume this timer with the video\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t$(rotologo).css({ opacity: 1 });\n\t\t\t\t}, 14150);\n\t\t\t}\n\t\t\tif (event.data == YT.PlayerState.ENDED) {\n\t\t\t\tplayer.destroy();\n\t\t\t\tplayer = null;\n\t\t\t\t// @TODO: fade to white instead of black, to work with the multiply effect\n\t\t\t\t// or fade out opacity alternatively\n\t\t\t\t// setTimeout/setInterval and check player.getCurrentTime() for when near the end?\n\t\t\t\t// or we might switch to using soundcloud for the audio and so trigger it with that, with a separate video of just clouds\n\t\t\t\t// also fade out the rotologo earlier\n\t\t\t\t$(rotologo).css({ opacity: 0 });\n\t\t\t\t// destroy rotologo once faded out\n\t\t\t\tsetTimeout(stop_vaporwave, 1200);\n\t\t\t}\n\t\t}\n\n\t\tlet is_theoretically_playing = true;\n\t\tspace_phase_key_handler = (e) => {\n\t\t\t// press space to phase in and out of space phase スペース相 - windows 98 マイクロソフト 『ＷＩＮＴＲＡＰ』 X 将来のオペレーティングシステムサウンド 1998 VAPORWAVE\n\t\t\tif (e.which === 32) {\n\t\t\t\t// @TODO: record player SFX\n\t\t\t\tif (is_theoretically_playing) {\n\t\t\t\t\tplayer.pauseVideo();\n\t\t\t\t\tis_theoretically_playing = false;\n\t\t\t\t\t$(player.getIframe())\n\t\t\t\t\t\t.add(rotologo)\n\t\t\t\t\t\t.css({ opacity: \"0\" });\n\t\t\t\t} else {\n\t\t\t\t\tplayer.playVideo();\n\t\t\t\t\tis_theoretically_playing = true;\n\t\t\t\t\t$(player.getIframe())\n\t\t\t\t\t\t.add(rotologo)\n\t\t\t\t\t\t.css({ opacity: \"\" });\n\t\t\t\t}\n\t\t\t\te.preventDefault();\n\t\t\t\t// player.getIframe().focus();\n\t\t\t}\n\t\t};\n\t\taddEventListener(\"keydown\", space_phase_key_handler);\n\t};\n\n\tconst toggle_vaporwave = () => {\n\t\tif (vaporwave_active) {\n\t\t\tstop_vaporwave();\n\t\t} else {\n\t\t\tstart_vaporwave();\n\t\t}\n\t};\n\n\tonKonamiCodeEntered(toggle_vaporwave);\n\taddEventListener(\"keydown\", (event) => {\n\t\tif (event.key === \"Escape\") {\n\t\t\tstop_vaporwave();\n\t\t}\n\t});\n\n})();\n"
  },
  {
    "path": "styles/about.css",
    "content": "\nhtml,\nbody {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\nbody {\n\tfont-family: sans-serif;\n\t/* font-family: \"Comic Sans MS\", \"Comic Sans\", cursive; */\n\tbackground-color: white;\n\tcolor: black;\n}\n\nbody>section {\n\t--section-padding: 10px;\n\tpadding-left: calc(50vw - 500px);\n\tpadding-right: calc(50vw - 500px);\n\tpadding-left: max(var(--section-padding), calc(50vw - 500px));\n\tpadding-right: max(var(--section-padding), calc(50vw - 500px));\n\tpadding-top: var(--section-padding);\n\tpadding-bottom: var(--section-padding);\n}\n\n/* \nFancy multi-layered image link with a wooden window frame that zooms in on hover.\n\nHairy problem: causes horizontal scrolling on narrow viewports.\n- Can't simply use `overflow: hidden` since it would cut off the window frame (top and bottom) when it scales up.\n- One way to avoid a horizontal scrollbar is to use `float: right`, as this makes it push the element to the left.\n\t- Not centered, when it gets pushed to the left.\n\t- Requires extra `clear: both` element.\n\t- Requires a wrapper, or at least, that's how I did it.\n\t- Also causes extra space between the window and the floated flag GIF now.\n\t  (Before, the window would ignore the flag and go in front of it, which looked nice.)\n- Can't simply use `overflow-x: hidden` since browsers don't support hidden and visible in separate axes.\n  https://stackoverflow.com/questions/6421966/css-overflow-x-visible-and-overflow-y-hidden-causing-scrollbar-issue\n- `overflow-clip-margin` should be the magic sauce, the saving grace, but it's not supported in Safari,\n  and two-value syntax for specifying vertical and horizontal separately is not supported in Chrome or Firefox.\n- Adding padding on top and bottom and negative margins to compensate, in order to create a vertically extended clip:\n\t- Top negative margin didn't work, so I had to use `transform: translateY()` instead.\n\t\t- With the `transform`, if the viewport is EXTREMELY narrow, the text will go under the window frame link.\n\t- Requires `pointer-events: none` on the parent to avoid breaking interactions outside of the visible area.\n\t\t- Requires `pointer-events: all` on the link to re-enable interaction with the link.\n\t- Also causes extra space between the window and the floated flag GIF now.\n\t  (Before, the window would ignore the flag and go in front of it, which looked nice.)\n- Does `overflow-x: clip` work? YES!!!\n\t- I guess they've designed `clip` to be more sensible, since it was a later addition to the spec.\n\t- Requires a wrapper. Trying to simplify to one element with `overflow-x: clip; max-width: calc(100% + var(--section-padding) * 2);`\n\t  makes it off-center, because the `transform` is relative to the computed width.\n\t  Could probably do it with a complex `transform` calculation using `min` or `max`, but that's not worth it.\n\t  Oh, actually, since it's a fixed width, duh, I can just halve it and use that... right?\n\t  `transform: translateX(calc(360px / -2));`\n\t  Well that doesn't work right.\n- `clip-path`? Does that affect page layout (overflow)?\n*/\n#enter-98-wrapper {\n\tmargin: 0 calc(-1 * var(--section-padding));\n\twidth: calc(100% + var(--section-padding) * 2);\n\toverflow-x: clip;\n}\n\n#enter-98-link {\n\tposition: relative;\n\tdisplay: block;\n\twidth: 360px;\n\theight: 287px;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tpointer-events: all;\n}\n\n#wooden-window-frame {\n\ttransition: transform 4s ease, box-shadow 5s ease;\n\t/* Most images have this set to pixelated, but that looks bad for the transition. */\n\t/* I have no idea why unset doesn't work here... */\n\t/* Chrome shows the media query's `image-rendering` with strike-through, but maybe that's a bug and it's actually winning? */\n\timage-rendering: auto;\n}\n\na[href^=\"https://98.js.org\"]:hover #wooden-window-frame,\na[href^=\"https://98.js.org\"]:focus #wooden-window-frame {\n\ttransform: scale(1.2);\n\tbox-shadow:\n\t\t0 0 5px 2px rgba(0, 43, 78, 0.5),\n\t\t0 0 100px 50px rgba(100, 163, 214, 0.5);\n}\n\n#main-section {\n\tbackground-image: url(\"../images/cursors/precise-dotted.png\");\n\tbackground-repeat: repeat;\n\tbackground-size: 32px 32px;\n\t/* background-color: lightgray; */\n}\n\n#windows-98-section {\n\tbackground-image: url(\"https://raw.githubusercontent.com/1j01/98/361bd759a6d9b71d0fad9e479840598dc0128bb6/images/clouds.jpg\");\n\tbackground-color: rgb(100, 163, 214);\n\tbackground-size: cover;\n\tbackground-position: center center;\n}\n\n#desktop-app-section {\n\tbackground-image: url(\"../images/about/atombgwht.gif\");\n\tbackground-repeat: repeat;\n}\n\n#desktop-app-section .bg {\n\t/* matching Under Construction GIF */\n\t/* background-color: rgb(254, 231, 48); */\n\t/* matching Electron logo as drawn in JS Paint */\n\tbackground-color: rgb(0, 255, 128);\n\tborder: 1px solid black;\n\tpadding: 5px;\n}\n\n#desktop-app-section #compound-download-button {\n\t--active-background-color: rgb(192, 192, 192);\n\t--toggle-width: 40px;\n\tposition: relative;\n\twidth: fit-content;\n\tmax-width: calc(100vw - var(--section-padding) * 2 - var(--toggle-width));\n\t/* z-index is needed so the negative z-index of the dropdown doesn't make it go beneath other things on the page, only the toggle button */\n\tz-index: 1;\n}\n#desktop-app-section #more-download-options-expandable {\n\t/* Resetting overly broad details { margin-top: 8px; } from layout.css */\n\tmargin: 0;\n}\n#desktop-app-section #more-download-options-toggle {\n\tposition: absolute;\n\tleft: 100%;\n\ttop: 0;\n\tbottom: 0;\n\twidth: var(--toggle-width);\n\ttext-align: center;\n\tbox-sizing: border-box;\n\tborder: 4px solid black;\n\tborder-left: none;\n\tpadding: 4px;\n\tbackground-color: rgb(149, 148, 154);\n\tlist-style-type: none; /* no effect, testing in Firefox */\n}\n#desktop-app-section #more-download-options-expandable[open] > #more-download-options-toggle {\n\tborder-bottom: none;\n\tbackground-color: var(--active-background-color);\n}\n#desktop-app-section #more-download-options-toggle::marker {\n\tdisplay: none; /* no effect, testing in Firefox */\n\tcontent: \"\"; /* still leaves a ::marker, but hides it at least */\n}\n#desktop-app-section #more-download-options-toggle::after {\n\t/* spell-checker: disable */\n\tcontent: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 15.5l-6-6 1.41-1.41L12 12.67l4.59-4.58L18 9.5l-6 6z'/%3E%3C/svg%3E\");\n\t/* spell-checker: enable */\n\twidth: 32px;\n\theight: 32px;\n\tdisplay: block;\n\tfont-size: 25px;\n\tposition: absolute;\n\t/* This shifts slightly when pressed due to the removed border, but that's fine, it's like a free pressed effect. */\n\ttop: 50%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%);\n}\n#desktop-app-section #more-download-options-dropdown {\n\tposition: absolute;\n\tleft: 0;\n\twidth: 600px;\n\tbox-sizing: border-box;\n\tmax-width: calc(100vw - var(--external-margin) * 2);\n\t--border-width: 4px;\n\ttop: calc(100% - var(--border-width));\n\t/* Go underneath the toggle button so that the segment of border between the toggle and dropdown can disappear. */\n\tz-index: -1;\n\tmargin: 0;\n\tborder: var(--border-width) solid black;\n\tpadding: 4px;\n\tbackground-color: var(--active-background-color);\n\tanimation: dropdown 0.3s linear;\n}\n@media (prefers-reduced-motion) {\n\t#desktop-app-section #more-download-options-dropdown {\n\t\tanimation: none;\n\t}\n}\n@keyframes dropdown {\n\tfrom {\n\t\t/* clip-path: circle(0% at 50% 0%); */\n\t\tclip-path: polygon(0 0, 100% 0, 100% 0, 0 0);\n\t}\n\tto {\n\t\t/* clip-path: circle(100% at 50% 0%); */\n\t\tclip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);\n\t}\n}\n#desktop-app-section .main-download-link {\n\tborder: 4px solid black;\n\tpadding: 4px;\n\tbackground-color: rgb(149, 148, 154);\n\tcolor: rgb(195, 195, 255);\n\ttext-shadow: 1px 2px 2px black, 1px 1px 2px black, 0px 0px 2px black;\n\tdisplay: block;\n\ttext-decoration: none;\n\twidth: auto;\n}\n#desktop-app-section .main-download-link ~ .main-download-link {\n\tborder-top: none;\n}\n#desktop-app-section .main-download-link img {\n\tvertical-align: middle;\n}\n\n.os-icon {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\twidth: 35px;\n\theight: 35px;\n\tposition: relative;\n\tborder: 2px solid black;\n\tborder-radius: 5px;\n\tmargin: 2px;\n\tpadding: 2px;\n\t/* Used for asterisk icon for \"View all releases\" */\n\tfont-size: 30px;\n}\n\n.os-icon>img {\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n}\n\n@supports (display: inline-flex) {\n\t.os-icon {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t.os-icon>img {\n\t\tposition: unset;\n\t\tbottom: unset;\n\t\tleft: unset;\n\t}\n}\n\n#textual-paint-section {\n\tfont-family: monospace;\n\tbackground-color: black;\n\tcolor: white;\n}\n\n#textual-paint-section a:link {\n\tcolor: #00ff00;\n}\n\n#textual-paint-section a:visited {\n\tcolor: #00aa00;\n}\n\n#textual-paint-section code {\n\tcolor: #ff00ff;\n}\n\n#textual-paint-section li i:first-of-type {\n\tcolor: #00ff00;\n}\n\n#textual-paint-section li i:last-of-type {\n\tcolor: #ff0000;\n}\n\n#other-projects-section {\n\tbackground-image: url(\"../images/tracky-mouse-16x16.png\");\n\tbackground-repeat: repeat;\n\tbackground-size: 5.1px 160px;\n\tbackground-color: #ffeb77;\n\tbackground-blend-mode: overlay;\n}\n\n#junkbot-area {\n\tdisplay: inline-block;\n\tpadding: 50px;\n\tpadding-bottom: 0;\n\t/* border: 5px ridge #acacac; */\n\t/* background-color: #ebe3ba; */\n\tborder: 5px ridge #ccc08b;\n\tbackground-color: #ffe76c;\n}\n\n#feeding-text {\n\tfont-style: italic;\n\tposition: relative;\n\tleft: -50px;\n}\n\n#buttons-section img {\n\tvertical-align: middle;\n}\n"
  },
  {
    "path": "styles/layout.css",
    "content": "/*\\\n|*| Note: layout.rtl.css is a generated file. Only edit layout.css.\n|*| layout.rtl.css is generated automatically while running the dev server (npm run dev)\n|*| (or manually with npm run build-css)\n|*|\n|*| Right-to-left layout is handled with a processor called RTLCSS, using comment directives.\n|*| Note in particular that \"direction: ltr;\" by default gets flipped to \"direction: rtl;\",\n|*| so the way to make a piece of UI left-to-right-only is with an ignore directive.\n\\*/\n\nhtml, body, .jspaint {\n\twidth: 100%;\n\theight: 100%;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\toverflow: hidden;\n}\n.jspaint {\n\tdirection: ltr;\n\t\n\tbox-sizing: border-box; /* for iPad fullscreen workaround, which adds padding to .jspaint; without this it hides the status bar */\n\n\t/* prevent selection, especially for Safari on iOS/iPad, which likes to select random (nearest, kind of?) elements when long-pressing */\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n.chooser-option {\n\tdisplay: flex;\n}\n.choose-shape-style {\n\tdisplay: flex;\n\tflex-flow: column;\n}\n.choose-eraser,\n.choose-magnification,\n.choose-stroke-size,\n.choose-transparent-mode {\n\tdisplay: flex;\n\tflex-flow: column;\n\talign-items: center;\n\tjustify-content: space-around;\n}\n.choose-brush,\n.choose-airbrush-size {\n\tdisplay: flex;\n\tflex-flow: row wrap;\n\tjustify-content: space-around;\n\talign-content: space-around;\n}\n.tool-options canvas {\n\tflex: 0 0 auto;\n}\n.component-window .window-content,\n.component-window .window-content :not(table):not(tbody):not(tr):not(td) {\n\tdisplay: flex;\n}\n.jspaint {\n\tdisplay: flex;\n\tflex-flow: column;\n\tflex: 1;\n}\n.horizontal {\n\tdisplay: flex;\n\tflex-flow: row;\n\tflex: 1 1 0;\n\toverflow: hidden;\n}\n.vertical {\n\tdisplay: flex;\n\tflex-flow: column;\n\tflex: 1;\n}\n.jspaint > .vertical {\n\theight: 100%;\n}\n@media (max-width: 200px) {\n\t.horizontal > .component-area {\n\t\tdisplay: none;\n\t}\n}\n@media (max-height: 340px) {\n\t.vertical > .component-area {\n\t\tdisplay: none;\n\t}\n}\n@media (max-height: 359px) {\n\t.vertical > .status-area {\n\t\tdisplay: none !important;\n\t}\n}\n.window.squish,\n.window.squish .window-content {\n\tmax-width: 100vw;\n\tmax-height: 100vh;\n}\n.window:not(.squish) {\n\twhite-space: nowrap;\n}\n/* reset the above to avoid .tracky-mouse-error-message getting clipped (when webcam in use for example) */\n.tracky-mouse-window .tracky-mouse-canvas-overlay {\n\twhite-space: normal;\n}\n/* fix overlapped min/max labels and barely clickable slider due to 98.css slider styles */\n.tracky-mouse-labeled-slider {\n\theight: 20px;\n}\n.component-area {\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n.tool-window .window-titlebar {\n\tdirection: ltr;\n\ttext-align: start;\n}\n.status-area,\n.component-area {\n\tdisplay: flex;\n\tflex: 0 0 auto;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.selection,\n.textbox,\n.helper-layer {\n\tz-index: 3;\n}\n.selection,\n.textbox {\n\tdisplay: block !important; /* @TODO: reduce overzealous display: flex; */\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n}\n\n.textbox > img,\n.textbox > canvas,\n.selection > img,\n.selection > canvas {\n\t/* @TODO: maybe don't include the canvas in the DOM (is it helpful to inspect it tho? it's not critical...) */\n\topacity: 0;\n\t/* Fix draggable part of selection going outside the selection selection is vertically thin */\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n}\n.selection > img,\n.selection > canvas,\n.helper-layer > canvas {\n\twidth: 100%;\n\theight: 100%;\n}\n.helper-layer > canvas {\n\t/* Fix helper layer canvas going off the main canvas when main canvas is vertically thin */\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n}\n.resize-ghost,\n.component-ghost {\n\tpointer-events: none;\n}\n.resize-ghost {\n\tz-index: 4;\n}\n.component-ghost {\n\tz-index: 5001; /* 50-5000 reserved for subwindows, which dynamically increase z-index */\n}\n.textbox-editor {\n\tcolor: transparent !important;\n\tbackground: transparent !important;\n\tcaret-color: black;\n\tz-index: 4; /* go above handles and .main-canvas */\n\toutline: none;\n}\n/* debug */\n/*.textbox-editor:hover {\n\tcolor: rgba(255, 0, 255, 0.5) !important;\n}*/\n\n.status-area {\n\tdisplay: flex;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\tcursor: default;\n}\n.status-text {\n\tflex-basis: auto;\n\tflex-grow: 1;\n\tflex-shrink: 0;\n\tpadding-right: 2px;\n\toverflow: hidden;\n}\n.status-coordinates {\n\tflex: 0 0 114px;\n\tmin-width: 0px;\n\tpadding-left: 3px;\n}\n\n.enlarge-ui .color-button {\n\twidth: 25px;\n\theight: 25px;\n}\n.enlarge-ui .colors-component.tall {\n\twidth: 50px;\n}\n.enlarge-ui .colors-component.tall .color-box {\n\twidth: 100%;\n}\n.enlarge-ui .colors-component.tall .current-colors {\n\twidth: 100%;\n}\n.enlarge-ui .colors-component.tall .foreground-color {\n\tleft: 12px;\n}\n.enlarge-ui .colors-component.tall .background-color {\n\tright: 12px;\n}\n.enlarge-ui .colors-component.wide {\n\theight: 50px;\n}\n.enlarge-ui .colors-component.wide .color-box {\n\theight: 100%;\n}\n.enlarge-ui .colors-component.wide .current-colors {\n\theight: 100%;\n}\n.enlarge-ui .colors-component.wide .foreground-color {\n\ttop: 12px;\n}\n.enlarge-ui .colors-component.wide .background-color {\n\tbottom: 12px;\n}\n\n/* more specific .tool-window selectors are needed to override titlebar height currently defined in classic.css */\n.enlarge-ui .os-window .window-titlebar,\n.enlarge-ui .os-window.tool-window .window-titlebar {\n\tfont-size: 2rem;\n\tline-height: 1.2;\n\theight: 2.8rem;\n}\n.enlarge-ui .os-window .window-title-area,\n.enlarge-ui .os-window.tool-window .window-title-area {\n\theight: 100%;\n}\n.enlarge-ui .os-window .window-titlebar button {\n\ttransform: scale(3);\n\tmargin-right: 32px;\n}\n.enlarge-ui .tool-window .window-titlebar button {\n\ttransform-origin: 0 0;\n}\n\n.enlarge-ui .menu-button {\n\tpadding-right: 10px;\n\tpadding-left: 10px;\n}\n.enlarge-ui .menu-button {\n\theight: 3rem;\n\tline-height: 2.5rem;\n}\n.enlarge-ui .menu-button,\n.enlarge-ui .menu-button * {\n\tfont-size: 2rem;\n}\n.enlarge-ui .menu-item * {\n\tfont-size: 2rem;\n\tline-height: 1.5;\n}\n.enlarge-ui .menu-item-checkbox-area::after,\n.enlarge-ui .menu-item-submenu-area::after {\n\twidth: 1.2em;\n\theight: 1.2em;\n\tmask-size: 1.2em 1.2em;\n\t-webkit-mask-size: 1.2em 1.2em;\n}\n\n/* sigh, trying to move two things in a similar way but padding does look a bit better for the status area (esp. in Bubblegum theme),\nwhereas it breaks component docking calculations if used to shift the colors box */\n.status-area {\n\tpadding-left: var(--floating-buttons-width);\n}\n.component-area.bottom {\n\tmargin-left: var(--floating-buttons-width);\n}\n.floating-buttons {\n\tposition: fixed;\n\tbottom: 0;\n\tleft: 0;\n\ttransform-origin: bottom left;\n\ttransform: scale(2);\n\t/* Go on top of canvas if both left/bottom docking areas are empty */\n\tz-index: 1;\n\t/* They're not within .jspaint currently */\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n.enlarge-ui .floating-buttons {\n\ttransform: scale(3);\n}\n.floating-buttons button {\n\twidth: 28px;\n\theight: 28px;\n\tvertical-align: bottom;\n\tposition: relative;\n}\n.floating-buttons .button-icon {\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\twidth: 24px;\n\theight: 24px;\n}\n\n.menu-button {\n\t/* @TODO: make this part of os-gui */\n\twhite-space: nowrap;\n}\n.menus {\n\t/* @TODO: make this part of os-gui; note that Explorer does overflow differently though */\n\tflex-wrap: wrap;\n}\n\n.component-area {\n\t/* for measuring offsetTop/offsetLeft of component elements */\n\t/* (makes it relative to this element) */\n\tposition: relative;\n}\n\n.tools-component {\n\theight: 273px;\n\talign-items: center;\n\tpadding-left: 4px;\n\tpadding-right: 2px;\n\tdisplay: flex;\n\tflex-flow: column;\n}\n.tool-options {\n\tdisplay: flex;\n\tmargin-top: 3px;\n\twidth: 41px;\n\theight: 66px;\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n}\n.tool-options > div {\n\tflex: 1;\n}\n.tools {\n\tdisplay: flex;\n\tflex-flow: row wrap;\n}\n.tool {\n\tdisplay: block !important;\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tposition: relative;\n}\n\n.horizontal .component-area {\n\tflex-direction: column;\n}\n.component {\n\tdisplay: flex;\n}\n.colors-component {\n\talign-items: center;\n\tjustify-content: center;\n}\n.colors-component.wide {\n\theight: 47px;\n}\n.colors-component.tall {\n\twidth: 47px;\n}\n.palette {\n\tdisplay: flex;\n}\n.colors-component.wide .palette {\n\tflex-flow: row wrap;\n}\n.colors-component.tall .palette {\n\tflex-flow: column wrap;\n}\n.colors-component.wide .color-box,\n.colors-component.wide .palette {\n\tdisplay: flex;\n\tflex-direction: row;\n\theight: 32px;\n}\n.colors-component.tall .color-box,\n.colors-component.tall .palette {\n\tdisplay: flex;\n\tflex-direction: column;\n\twidth: 32px;\n}\n.colors-component.wide .current-colors {\n\twidth: 30px;\n\theight: 31px;\n}\n.colors-component.tall .current-colors {\n\twidth: 31px;\n\theight: 32px;\n}\n.current-colors,\n.color-button {\n\tposition: relative;\n}\n.foreground-color {\n\tposition: absolute;\n\tleft: 2px;\n\ttop: 4px;\n}\n.background-color {\n\tposition: absolute;\n\tright: 3px;\n\tbottom: 3px;\n}\n.colors-component.tall .foreground-color {\n\tleft: 4px;\n\ttop: 3px;\n}\n.colors-component.tall .background-color {\n\tright: 3px;\n\tbottom: 3px;\n}\n\n.colors-component.wide .color-button,\n.colors-component.wide .color-selection {\n\tmargin-left: 1px;\n}\n.colors-component.tall .color-button,\n.colors-component.tall .color-selection {\n\tmargin-top: 1px;\n}\n.color-button,\n.color-selection {\n\tdisplay: flex;\n\tpadding: 0;\n\tbox-sizing: border-box;\n\twidth: 15px;\n\theight: 15px;\n\tborder: 0;\n}\n\n.edit-colors-window .color-grid {\n\twidth: 222px;\n\tdisplay: grid;\n\tgrid-template-columns: repeat(8, 16px);\n\tgrid-gap: 5px 9px;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\tmargin-left: 8px/*rtl:ignore*/;\n}\n.edit-colors-window .swatch {\n\twidth: 16px;\n\theight: 13px;\n\tdisplay: flex;\n}\n.edit-colors-window .window-content {\n\tfont-family: Tahoma, sans-serif;\n\tfont-size: 12px;\n}\n.edit-colors-window .swatch {\n\toutline: none; /* we'll provide a new focus indicator below */\n}\n.edit-colors-window .swatch.selected {\n\toutline: 1px solid black;\n\toutline-offset: 0px;\n}\n.edit-colors-window .swatch:focus::after {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\toutline: 1px dotted black;\n\toutline-offset: 5px;\n}\n.edit-colors-window .window-content .left-right-split {\n\tdisplay: flex;\n\tflex-flow: row;\n}\n.edit-colors-window .window-content .left-side {\n\t/* display: flex;\n\tflex-flow: column; */\n\twidth: 217px;\n\theight: 298px;\n}\n.edit-colors-window .window-content .right-side {\n\twidth: 218px;\n\tposition: relative;\n\tpadding-top: 7px;\n\tpadding-left: 10px/*rtl:ignore*/;\n}\n.edit-colors-window .window-content .button-group {\n\tdisplay: flex;\n\tflex-flow: row;\n}\n.edit-colors-window .window-content .button-group button {\n\tmin-width: 66px;\n\tmargin: 3px;\n}\n.edit-colors-window .window-content .define-custom-colors-button,\n.edit-colors-window .window-content .button-group button:first-of-type {\n\tmargin-left: 5px/*rtl:ignore*/;\n}\n.edit-colors-window .window-content button {\n\theight: 23px;\n\tbox-sizing: border-box;\n\tpadding: 0;\n\tmargin-left: 3px/*rtl:ignore*/;\n}\n.edit-colors-window .window-content .define-custom-colors-button {\n\tmargin-top: 13px;\n\twidth: 210px;\n}\n.edit-colors-window .window-content .add-to-custom-colors-button {\n\tposition: absolute;\n\tbottom: 5px;\n\tright: 5px/*rtl:ignore*/;\n\twidth: 213px;\n}\n.edit-colors-window .left-side label {\n\tdisplay: block;\n\tmargin-top: 7px;\n\tmargin-bottom: 5px;\n\tmargin-left: 5px/*rtl:ignore*/;\n}\n.edit-colors-window .left-side label:nth-of-type(2) {\n\tmargin-top: 18px;\n\tmargin-bottom: 7px;\n}\n.edit-colors-window .luminosity-canvas {\n\tmargin-left: 15px/*rtl:ignore*/;\n}\n.edit-colors-window .result-color-canvas {\n\tmargin-top: 4px;\n}\n/* WET layout code for small viewports and Enlarge UI mode */\n/* could do it cleaner with JavaScript or CSS preprocessor */\n@media (max-width: 450px) {\n\t.edit-colors-window {\n\t\toverflow: hidden;\n\t}\n\t.edit-colors-window.defining-custom-colors .left-side {\n\t\t/* display: none !important; */\n\t\t/* this element is determining the height */\n\t\twidth: 0;\n\t\tvisibility: hidden;\n\t}\n\t.edit-colors-window:not(.defining-custom-colors) .right-side {\n\t\tdisplay: none !important;\n\t}\n}\n/* WET layout code for small viewports and Enlarge UI mode */\n.enlarge-ui .edit-colors-window {\n\toverflow: hidden;\n}\n.enlarge-ui .edit-colors-window.defining-custom-colors .left-side {\n\t/* display: none !important; */\n\t/* this element is determining the height */\n\twidth: 0;\n\tvisibility: hidden;\n}\n.enlarge-ui .edit-colors-window:not(.defining-custom-colors) .right-side {\n\tdisplay: none !important;\n}\n\n.save-as .window-content > form > div {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n.save-as .window-content > form > div > label {\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: space-between;\n\talign-items: center;\n\tmargin-left: 10px;\n}\n.save-as .window-content > form > div > label > input,\n.save-as .window-content > form > div > label > select {\n\twidth: calc(100vw - 220px);\n\tmax-width: 230px;\n\tfloat: right;\n\tmargin: 5px;\n\tbox-sizing: border-box;\n}\n.save-as .window-content > form > div > label:not(:first-of-type) {\n\tmargin-top: 8px;\n}\n.save-as .window-content {\n\tpadding-top: 10px;\n\tpadding-bottom: 10px;\n}\n.save-as .button-group button {\n\tmargin: 5px;\n}\n\n.font-box {\n\tdisplay: flex;\n\tflex-flow: row;\n\talign-items: center;\n\tmargin: 4px 7px; /* not measured, just guessed */\n\tgap: 10px;\n}\n\n.canvas-area {\n\tflex: 1;\n\tdisplay: block !important;\n\tposition: relative;\n\toverflow: auto;\n\tpadding: 3px;\n\tdirection: ltr/*rtl:ignore*/;\n}\n.main-canvas {\n\tposition: absolute;\n\tz-index: 2;\n}\n.canvas-area .handle {\n\tposition: absolute;\n\twidth: 3px;\n\theight: 3px;\n\tz-index: 1;\n\tpointer-events: none; /* important for Dwell Clicker mode */\n}\n.grab-region {\n\t/* the grab-region make handles way easier to grab by extending outside the visual representation of the handle */\n\tposition: absolute;\n\t/*background: rgba(255, 0, 0, 0.5);*/ /* debug */\n}\n/* .grab-region.is-middle { */\n\t/*background: rgba(255, 255, 0, 0.5);*/ /* debug */\n/* } */\n.textbox::before {\n\t/* allow dragging textbox */\n\t/* In mspaint the border drawn around selections and textboxes extends out from them,\n\tcentered on the pixels bordering the contents,\n\twhich makes it more reasonable to have the border be a draggable thing.\n\tI'm making the draggable area outside the border for now. */\n\tcontent: \"\";\n\tpointer-events: all; /* @TODO: maybe don't have a blanket pointer-events: none; on pseudo elements */\n\tdisplay: block;\n\tposition: absolute;\n\tleft: -10px;\n\tright: -10px;\n\ttop: -10px;\n\tbottom: -10px;\n\t/*background: orange;*/ /* debug */\n}\n\n.window-content .button-group {\n\tdisplay: flex;\n\tflex: 0 0 auto;\n\tflex-flow: column;\n}\n.window-content .button-group > button {\n\tmin-width: 80px;\n\tpadding: 3px 5px;\n\twhite-space: nowrap;\n}\n.window-content > form {\n\tdisplay: flex;\n\tflex-flow: row;\n}\n.window:not(.edit-colors-window) .window-content > form {\n\tdirection: ltr;\n}\n.horizontal-buttons .window-content > form {\n\tflex-flow: column;\n}\n.horizontal-buttons .window-content > form > .button-group {\n\tdisplay: flex;\n\tflex-flow: row;\n\tjustify-content: flex-end;\n\tgap: 5px;\n\tmargin: 5px;\n\tmargin-bottom: 10px;\n}\n.horizontal-buttons .window-content > form > div:first-child {\n\tpadding: 5px;\n}\n\n.stretch-and-skew .window-content,\n.flip-and-rotate .window-content,\n.convert-to-black-and-white .window-content,\n.component-window .window-content {\n\tdirection: ltr;\n}\n\n.dialog-window:not(.horizontal-buttons):not(.edit-colors-window) .window-content {\n\tpadding: 10px;\n}\n.dialog-window:not(.horizontal-buttons):not(.edit-colors-window) .window-content .button-group {\n\tpadding-left: 10px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 5px;\n}\n\n.flip-and-rotate fieldset {\n\twidth: 200px;\n}\n.flip-and-rotate fieldset > label {\n\tdisplay: flex !important; /* overriding `.window:not(.edit-colors-window) .window-content label` */\n}\n.flip-and-rotate input:disabled {\n\t/* pointer events already can't get received on disabled input elements,\n\tbut this lets them be received on a parent,\n\tin order to enable the element */\n\tpointer-events: none;\n}\n.flip-and-rotate .sub-options {\n\tpadding-left: 30px;\n}\n.flip-and-rotate .radio-wrapper {\n\twidth: fit-content;\n}\n\n/* Fix label ordering for RTL layout (display inline labels can get super out of order with the checkboxes/inputs - very confusing!) */\n.window:not(.edit-colors-window):not(.tracky-mouse-window) .window-content label {\n\tdisplay: inline-flex;\n\tflex-direction: row;\n\tdirection: ltr;\n}\n\n.attributes-window .window-content {\n\tdirection: ltr;\n}\n.attributes-window table {\n\tmargin-bottom: 5px;\n}\n.attributes-window input[type=\"number\"] {\n\tmargin-left: 5px; /* separate label from input for Width and Height fields */\n}\n.attributes-window table ~ label ~ label {\n\tmargin-left: 10px; /* separate Width and Height fields */\n}\n.attributes-window fieldset {\n\tmargin-top: 5px;\n}\n.attributes-window fieldset .fieldset-body {\n\tdisplay: grid;\n\tgrid-template-columns: calc(80px * 2) 80px;\n}\n.attributes-window fieldset:first-of-type .fieldset-body {\n\tgrid-template-columns: 80px 80px 80px;\n}\n\n.custom-zoom-window .current-zoom {\n\tmargin: 10px 15px;\n}\n.custom-zoom-window fieldset {\n\tmargin: 8px;\n\tpadding: 0;\n}\n.custom-zoom-window .fieldset-body {\n\tdisplay: flex;\n\tflex-flow: column wrap;\n\twidth: 240px;\n\theight: 70px;\n\tpadding: 12px 5px;\n\trow-gap: 10px;\n}\n.custom-zoom-window bdi {\n\tmargin: 0 10px;\n}\n.custom-zoom-window input[name=\"really-custom-zoom-input\"] {\n\twidth: 50px;\n}\n\n.radio-field {\n\tdisplay: flex;\n\tflex-flow: row;\n\talign-items: center;\n}\n\n/* @TODO: part of os-gui */\n.os-window {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n/* @TODO: part of os-gui */\n.os-window .window-content {\n\tflex: 1;\n}\n\n.help-window .window-content {\n\tdisplay: flex;\n\tflex-flow: column;\n}\n.help-window .main {\n\tflex: 1;\n\tdisplay: flex;\n\tflex-flow: row;\n\theight: 0; /* fixes an overflow issue with small window height, where the iframe and contents tree would be sized based on the intrinsic height of the contents tree */\n}\n.help-window .toolbar button {\n\twidth: 55px;\n\theight: 40px;\n\tpadding: 0;\n}\n.help-window .toolbar button span {\n\tdisplay: inline-flex;\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\t/* flex centering + preventing overflow wrap means the font can be too big and it'll still stay centered */\n\tfont-size: 12px;\n\twhite-space: pre;\n\tjustify-content: center;\n}\n.help-window .toolbar button {\n\tposition: relative;\n}\n.help-window .toolbar button .icon {\n\twidth: 100%;\n\theight: 100%;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n}\n.help-window .toolbar button .icon {\n\tbackground-image: url(\"../images/help-viewer-toolbar-icons-grayscale.png\");\n}\n.help-window .toolbar button:not([disabled]):hover .icon {\n\tbackground-image: url(\"../images/help-viewer-toolbar-icons.png\");\n}\n.help-window .toolbar button[disabled] .icon {\n\tfilter: saturate(0%) opacity(50%); /* fallback */\n\tfilter: url(\"#disabled-inset-filter\");\n}\n.help-window .contents {\n\tbackground: white;\n\tbackground: var(--Window);\n\tcolor: var(--WindowText);\n\tflex-basis: 300px; /* normally the default is 200px, but that leaves a scrollbar and we don't have rollover viewing of longer titles (@TODO) */\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\toverflow: auto;\n\tbox-sizing: border-box;\n}\n.help-window ul {\n\tmargin: 0;\n\tpadding: 0;\n}\n.help-window li {\n\tdisplay: block;\n\twhite-space: nowrap;\n}\n.help-window .item {\n\tdisplay: inline-block;\n}\n.help-window .folder:not(.expanded) ul {\n\tdisplay: none;\n}\n.help-window iframe {\n\tflex: 1;\n\twidth: 0;\n}\n.help-window li ul {\n\t/* Help content is not currently translated, so it's all in English */\n\tpadding-left: 16px/*rtl:ignore*/;\n}\n.help-window li:before {\n\tcontent: \"\";\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\twidth: 16px;\n\theight: 16px;\n\tbackground-position: 0 0/*rtl:ignore*/;\n\tmargin-right: 2px;\n}\n.help-window .folder.expanded:before {\n\tbackground-position: -16px 0/*rtl:ignore*/;\n}\n.help-window .page:before {\n\tbackground-position: -32px 0/*rtl:ignore*/;\n}\n\n.dragging iframe {\n\tpointer-events: none;\n}\n\n.storage-manager table {\n\tmax-height: 400px;\n\toverflow: auto;\n\tdisplay: block;\n}\n.storage-manager .thumbnail-container {\n\twidth: 64px;\n\theight: 64px;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n.storage-manager .thumbnail-container > img {\n\tmax-width: 64px;\n\tmax-height: 64px;\n\tflex: 0 0 auto;\n}\n.storage-manager .thumbnail-container,\n.storage-manager p {\n\tmargin: 5px;\n}\n.storage-manager .remove-button {\n\tmargin-left: 15px;\n}\n\n.history-window .window-content {\n\tdirection: ltr;\n}\n.history-view {\n\twidth: 500px;\n\theight: 500px;\n\tmax-width: calc(100vw - 10px);\n\tmax-height: calc(100vh - 100px);\n\toverflow: auto;\n\tposition: relative; /* needed for offsetTop to work relative to the top of the list (rather than the window) */\n\tdirection: ltr;\n}\n.history-entry {\n\tcursor: pointer;\n\tpadding: 5px;\n\tdisplay: flex;\n}\n.history-entry-icon-area {\n\twidth: 16px;\n\theight: 16px;\n\tmargin-right: 6px;\n}\n.history-entry.current {\n\tfont-weight: bold;\n}\n.history-entry:not(.current):not(.ancestor-of-current) {\n\tcolor: gray;\n}\n.history-entry:hover:hover:hover { /* specificity hack vs :not()s */\n\tcolor: #0000ff;\n\ttext-decoration: underline;\n}\n\n/* TODO: reduce scope of this rule, and remove exception(s) to it */\n::before, ::after {\n\tpointer-events: none;\n}\n/* Quick fix for clicking directly on the radio button in themes which use styles from 98.css */\ninput[type=\"radio\"] + label::before {\n\tpointer-events: all;\n}\n\n.cursor-bully * {\n\tcursor: inherit !important;\n}\n\n#about-paint-header {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: wrap;\n\tmargin: 0;\n\tmargin-top: 10px;\n\tmargin-bottom: 10px;\n}\n#about-paint-beside-icon {\n\tmargin: auto 10px;\n}\n#jspaint-project-name {\n\twhite-space: nowrap;\n\tfont-size: 2rem;\n\tmargin: 0;\n}\n#jspaint-version {\n\t/* @TODO: separate some of this into a shared.css? (not all layout!) */\n\twhite-space: nowrap;\n\tfont-size: 1.4rem;\n\tfont-weight: normal;\n}\n#maybe-outdated-line {\n\tfont-style: italic;\n\tline-height: 1;\n\t/* min-height avoids a flaky test where sometimes the element blackout is visible and sometimes not depending on whether the news had been loaded when the test runs */\n\tmin-height: 1em;\n\t/* top margin is almost just to separate blackout regions for clarity in the visual test snapshots */\n\tmargin-top: 3px;\n}\n#view-project-news,\n#close-about-paint {\n\tmargin: auto; /* for right-alignment AND avoiding stretching to height of the container */\n\tmargin-right: 0;\n\twidth: 100px;\n\tmin-height: 2.2rem;\n}\n#close-about-paint {\n\tfloat: right;\n\tmargin-bottom: 10px;\n}\n\n#news {\n\tmax-height: 500px;\n\toverflow: auto;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tcursor: auto;\n}\n@media (max-height: 550px) {\n\t#news {\n\t\tmax-height: calc(100vh - 50px);\n\t}\n}\n\n.news-indicator {\n\tdisplay: flex;\n\tfont-family: sans-serif;\n}\n.news-indicator > img {\n\tmargin-right: 5px;\n}\n@media (max-width: 550px) {\n\t.news-indicator > img {\n\t\tposition: absolute;\n\t\tright: 0;\n\t\tbottom: 0;\n\t}\n\t.news-indicator .marquee {\n\t\tdisplay: none;\n\t}\n}\n\n.marquee {\n\toverflow: hidden;\n\ttext-decoration: inherit;\n}\n\n.marquee span {\n\tdisplay: inline-block;\n\twhite-space: nowrap;\n\twidth: var(--text-width);\n\ttext-shadow:\n\t\tvar(--text-width) 0 currentColor,\n\t\tcalc(var(--text-width) * 2) 0 currentColor,\n\t\tcalc(var(--text-width) * 3) 0 currentColor,\n\t\tcalc(var(--text-width) * 4) 0 currentColor;\n\twill-change: transform;\n\tanimation: marquee var(--animation-duration) linear infinite;\n\tanimation-play-state: paused;\n\ttext-decoration: inherit;\n}\n\n.marquee:hover span {\n\tanimation-play-state: running;\n}\n\n@keyframes marquee {\n\t0% { transform: translateX(0); }\n\t100% { transform: translateX(-100%)/*rtl:ignore*/; }\n}\n\n/* On MacOs: System Preferences > Accessibility > Display > Reduce motion */\n@media (prefers-reduced-motion: reduce) {\n\t.marquee span {\n\t\tanimation: none;\n\t\ttext-shadow: none;\n\t\twidth: auto;\n\t\tdisplay: block;\n\t\tline-height: 1.5;\n\t\ttext-align: center;\n\t\twhite-space: normal;\n\t}\n}\n\n/* For Safari on iPad, Fullscreen mode overlays the system bar, completely obscuring our menu bar. */\n/* This adds a spacer to the top of the page, styled with the title bar gradient, to prevent that. */\n/* Only show this if the device is tall enough that this won't cause any problems (fullscreen is important for fitting the color palette on the screen on some phones) */\n:root {\n\t--ios-title-bar-height: 21px; /* this is what looks good to my eye, there's not a hard line in the overlay, just text/symbols, and I didn't measure the system bar in a case where it has a background */\n\t/* hope it doesn't change! */\n}\n@media (min-height: 450px) {\n\t.ios.fullscreen .jspaint {\n\t\tpadding-top: var(--ios-title-bar-height);\n\t}\n\t.ios.fullscreen .jspaint::before {\n\t\tcontent: \"\";\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tright: 0;\n\t\theight: var(--ios-title-bar-height);\n\t}\n\t/* That works, but now the exit fullscreen button (which we also can't change) obscures the menu bar. */\n\t/* So center the menu bar contents, that'll look nice. */\n\t/* .ios.fullscreen .menus {\n\t\tjustify-content: center;\n\t}\n\t/* Ugh no, then the three dots button (multitasking menu) at the top of the system menu steals taps from the menu bar. */\n\t/* Just shift it over by a fixed amount. */\n\t/* This lets it sit in between the exit button and the three dots button,\n\tat least on a 9th generation iPad with software version 15.0.2 (this is a very fragile workaround) */\n\t.ios.fullscreen .menus {\n\t\tpadding-left: 100px;\n\t}\n\t/* Also nudge the tools downward to avoid the exit fullscreen button */\n\t/* (not if it's in a window, only if it's docked) */\n\t/* (I considered using `.ios.fullscreen .horizontal > .component-area:first-child`\n\tso that it's not affected by the transform in Enlarge UI mode,\n\tbut it wants tweaking in that case anyways due to the menu bar being bigger */\n\t.ios.fullscreen .component-area .tools-component {\n\t\tpadding-top: 40px;\n\t}\n\t/* Not so much in Enlarge UI mode, where it's scaled with transform,\n\tand where the menu bar takes more of the space reserved for the exit fullscreen button */\n\t.ios.fullscreen .enlarge-ui .component-area .tools-component {\n\t\tpadding-top: 10px;\n\t}\n}\n\nselect.inset-deep {\n\tbackground-position: top 0px right 0px;\n\tpadding-right: 16px;\n}\n\nprogress {\n\twidth: 291px;\n\theight: 20px;\n\tbox-sizing: border-box;\n}\n\ndetails pre {\n\tmargin: 0;\n\tmargin-top: 5px;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n}\n\ndetails {\n\tmargin-top: 8px;\n}\nsummary {\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\tcursor: pointer;\n}\n\n.too-big-soon-gif {\n\ttransition: transform 0.2s;\n\ttransform-origin: 0% 100%;\n\timage-rendering: optimizeQuality;\n}\n.menu-item:not(.highlight) .too-big-soon-gif {\n\ttransform: scale(0.6);\n}"
  },
  {
    "path": "styles/layout.rtl.css",
    "content": "/*\\\n|*| Note: layout.rtl.css is a generated file. Only edit layout.css.\n|*| layout.rtl.css is generated automatically while running the dev server (npm run dev)\n|*| (or manually with npm run build-css)\n|*|\n|*| Right-to-left layout is handled with a processor called RTLCSS, using comment directives.\n|*| Note in particular that \"direction: ltr;\" by default gets flipped to \"direction: rtl;\",\n|*| so the way to make a piece of UI left-to-right-only is with an ignore directive.\n\\*/\n\nhtml, body, .jspaint {\n\twidth: 100%;\n\theight: 100%;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\toverflow: hidden;\n}\n.jspaint {\n\tdirection: rtl;\n\t\n\tbox-sizing: border-box; /* for iPad fullscreen workaround, which adds padding to .jspaint; without this it hides the status bar */\n\n\t/* prevent selection, especially for Safari on iOS/iPad, which likes to select random (nearest, kind of?) elements when long-pressing */\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n.chooser-option {\n\tdisplay: flex;\n}\n.choose-shape-style {\n\tdisplay: flex;\n\tflex-flow: column;\n}\n.choose-eraser,\n.choose-magnification,\n.choose-stroke-size,\n.choose-transparent-mode {\n\tdisplay: flex;\n\tflex-flow: column;\n\talign-items: center;\n\tjustify-content: space-around;\n}\n.choose-brush,\n.choose-airbrush-size {\n\tdisplay: flex;\n\tflex-flow: row wrap;\n\tjustify-content: space-around;\n\talign-content: space-around;\n}\n.tool-options canvas {\n\tflex: 0 0 auto;\n}\n.component-window .window-content,\n.component-window .window-content :not(table):not(tbody):not(tr):not(td) {\n\tdisplay: flex;\n}\n.jspaint {\n\tdisplay: flex;\n\tflex-flow: column;\n\tflex: 1;\n}\n.horizontal {\n\tdisplay: flex;\n\tflex-flow: row;\n\tflex: 1 1 0;\n\toverflow: hidden;\n}\n.vertical {\n\tdisplay: flex;\n\tflex-flow: column;\n\tflex: 1;\n}\n.jspaint > .vertical {\n\theight: 100%;\n}\n@media (max-width: 200px) {\n\t.horizontal > .component-area {\n\t\tdisplay: none;\n\t}\n}\n@media (max-height: 340px) {\n\t.vertical > .component-area {\n\t\tdisplay: none;\n\t}\n}\n@media (max-height: 359px) {\n\t.vertical > .status-area {\n\t\tdisplay: none !important;\n\t}\n}\n.window.squish,\n.window.squish .window-content {\n\tmax-width: 100vw;\n\tmax-height: 100vh;\n}\n.window:not(.squish) {\n\twhite-space: nowrap;\n}\n/* reset the above to avoid .tracky-mouse-error-message getting clipped (when webcam in use for example) */\n.tracky-mouse-window .tracky-mouse-canvas-overlay {\n\twhite-space: normal;\n}\n/* fix overlapped min/max labels and barely clickable slider due to 98.css slider styles */\n.tracky-mouse-labeled-slider {\n\theight: 20px;\n}\n.component-area {\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n.tool-window .window-titlebar {\n\tdirection: rtl;\n\ttext-align: start;\n}\n.status-area,\n.component-area {\n\tdisplay: flex;\n\tflex: 0 0 auto;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.selection,\n.textbox,\n.helper-layer {\n\tz-index: 3;\n}\n.selection,\n.textbox {\n\tdisplay: block !important; /* @TODO: reduce overzealous display: flex; */\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n}\n\n.textbox > img,\n.textbox > canvas,\n.selection > img,\n.selection > canvas {\n\t/* @TODO: maybe don't include the canvas in the DOM (is it helpful to inspect it tho? it's not critical...) */\n\topacity: 0;\n\t/* Fix draggable part of selection going outside the selection selection is vertically thin */\n\tposition: absolute;\n\tright: 0;\n\ttop: 0;\n}\n.selection > img,\n.selection > canvas,\n.helper-layer > canvas {\n\twidth: 100%;\n\theight: 100%;\n}\n.helper-layer > canvas {\n\t/* Fix helper layer canvas going off the main canvas when main canvas is vertically thin */\n\tposition: absolute;\n\tright: 0;\n\ttop: 0;\n}\n.resize-ghost,\n.component-ghost {\n\tpointer-events: none;\n}\n.resize-ghost {\n\tz-index: 4;\n}\n.component-ghost {\n\tz-index: 5001; /* 50-5000 reserved for subwindows, which dynamically increase z-index */\n}\n.textbox-editor {\n\tcolor: transparent !important;\n\tbackground: transparent !important;\n\tcaret-color: black;\n\tz-index: 4; /* go above handles and .main-canvas */\n\toutline: none;\n}\n/* debug */\n/*.textbox-editor:hover {\n\tcolor: rgba(255, 0, 255, 0.5) !important;\n}*/\n\n.status-area {\n\tdisplay: flex;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\tcursor: default;\n}\n.status-text {\n\tflex-basis: auto;\n\tflex-grow: 1;\n\tflex-shrink: 0;\n\tpadding-left: 2px;\n\toverflow: hidden;\n}\n.status-coordinates {\n\tflex: 0 0 114px;\n\tmin-width: 0px;\n\tpadding-right: 3px;\n}\n\n.enlarge-ui .color-button {\n\twidth: 25px;\n\theight: 25px;\n}\n.enlarge-ui .colors-component.tall {\n\twidth: 50px;\n}\n.enlarge-ui .colors-component.tall .color-box {\n\twidth: 100%;\n}\n.enlarge-ui .colors-component.tall .current-colors {\n\twidth: 100%;\n}\n.enlarge-ui .colors-component.tall .foreground-color {\n\tright: 12px;\n}\n.enlarge-ui .colors-component.tall .background-color {\n\tleft: 12px;\n}\n.enlarge-ui .colors-component.wide {\n\theight: 50px;\n}\n.enlarge-ui .colors-component.wide .color-box {\n\theight: 100%;\n}\n.enlarge-ui .colors-component.wide .current-colors {\n\theight: 100%;\n}\n.enlarge-ui .colors-component.wide .foreground-color {\n\ttop: 12px;\n}\n.enlarge-ui .colors-component.wide .background-color {\n\tbottom: 12px;\n}\n\n/* more specific .tool-window selectors are needed to override titlebar height currently defined in classic.css */\n.enlarge-ui .os-window .window-titlebar,\n.enlarge-ui .os-window.tool-window .window-titlebar {\n\tfont-size: 2rem;\n\tline-height: 1.2;\n\theight: 2.8rem;\n}\n.enlarge-ui .os-window .window-title-area,\n.enlarge-ui .os-window.tool-window .window-title-area {\n\theight: 100%;\n}\n.enlarge-ui .os-window .window-titlebar button {\n\ttransform: scale(3);\n\tmargin-left: 32px;\n}\n.enlarge-ui .tool-window .window-titlebar button {\n\ttransform-origin: 100% 0;\n}\n\n.enlarge-ui .menu-button {\n\tpadding-left: 10px;\n\tpadding-right: 10px;\n}\n.enlarge-ui .menu-button {\n\theight: 3rem;\n\tline-height: 2.5rem;\n}\n.enlarge-ui .menu-button,\n.enlarge-ui .menu-button * {\n\tfont-size: 2rem;\n}\n.enlarge-ui .menu-item * {\n\tfont-size: 2rem;\n\tline-height: 1.5;\n}\n.enlarge-ui .menu-item-checkbox-area::after,\n.enlarge-ui .menu-item-submenu-area::after {\n\twidth: 1.2em;\n\theight: 1.2em;\n\tmask-size: 1.2em 1.2em;\n\t-webkit-mask-size: 1.2em 1.2em;\n}\n\n/* sigh, trying to move two things in a similar way but padding does look a bit better for the status area (esp. in Bubblegum theme),\nwhereas it breaks component docking calculations if used to shift the colors box */\n.status-area {\n\tpadding-right: var(--floating-buttons-width);\n}\n.component-area.bottom {\n\tmargin-right: var(--floating-buttons-width);\n}\n.floating-buttons {\n\tposition: fixed;\n\tbottom: 0;\n\tright: 0;\n\ttransform-origin: bottom right;\n\ttransform: scale(2);\n\t/* Go on top of canvas if both left/bottom docking areas are empty */\n\tz-index: 1;\n\t/* They're not within .jspaint currently */\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n.enlarge-ui .floating-buttons {\n\ttransform: scale(3);\n}\n.floating-buttons button {\n\twidth: 28px;\n\theight: 28px;\n\tvertical-align: bottom;\n\tposition: relative;\n}\n.floating-buttons .button-icon {\n\tposition: absolute;\n\tright: 0;\n\ttop: 0;\n\twidth: 24px;\n\theight: 24px;\n}\n\n.menu-button {\n\t/* @TODO: make this part of os-gui */\n\twhite-space: nowrap;\n}\n.menus {\n\t/* @TODO: make this part of os-gui; note that Explorer does overflow differently though */\n\tflex-wrap: wrap;\n}\n\n.component-area {\n\t/* for measuring offsetTop/offsetLeft of component elements */\n\t/* (makes it relative to this element) */\n\tposition: relative;\n}\n\n.tools-component {\n\theight: 273px;\n\talign-items: center;\n\tpadding-right: 4px;\n\tpadding-left: 2px;\n\tdisplay: flex;\n\tflex-flow: column;\n}\n.tool-options {\n\tdisplay: flex;\n\tmargin-top: 3px;\n\twidth: 41px;\n\theight: 66px;\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n}\n.tool-options > div {\n\tflex: 1;\n}\n.tools {\n\tdisplay: flex;\n\tflex-flow: row wrap;\n}\n.tool {\n\tdisplay: block !important;\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tposition: relative;\n}\n\n.horizontal .component-area {\n\tflex-direction: column;\n}\n.component {\n\tdisplay: flex;\n}\n.colors-component {\n\talign-items: center;\n\tjustify-content: center;\n}\n.colors-component.wide {\n\theight: 47px;\n}\n.colors-component.tall {\n\twidth: 47px;\n}\n.palette {\n\tdisplay: flex;\n}\n.colors-component.wide .palette {\n\tflex-flow: row wrap;\n}\n.colors-component.tall .palette {\n\tflex-flow: column wrap;\n}\n.colors-component.wide .color-box,\n.colors-component.wide .palette {\n\tdisplay: flex;\n\tflex-direction: row;\n\theight: 32px;\n}\n.colors-component.tall .color-box,\n.colors-component.tall .palette {\n\tdisplay: flex;\n\tflex-direction: column;\n\twidth: 32px;\n}\n.colors-component.wide .current-colors {\n\twidth: 30px;\n\theight: 31px;\n}\n.colors-component.tall .current-colors {\n\twidth: 31px;\n\theight: 32px;\n}\n.current-colors,\n.color-button {\n\tposition: relative;\n}\n.foreground-color {\n\tposition: absolute;\n\tright: 2px;\n\ttop: 4px;\n}\n.background-color {\n\tposition: absolute;\n\tleft: 3px;\n\tbottom: 3px;\n}\n.colors-component.tall .foreground-color {\n\tright: 4px;\n\ttop: 3px;\n}\n.colors-component.tall .background-color {\n\tleft: 3px;\n\tbottom: 3px;\n}\n\n.colors-component.wide .color-button,\n.colors-component.wide .color-selection {\n\tmargin-right: 1px;\n}\n.colors-component.tall .color-button,\n.colors-component.tall .color-selection {\n\tmargin-top: 1px;\n}\n.color-button,\n.color-selection {\n\tdisplay: flex;\n\tpadding: 0;\n\tbox-sizing: border-box;\n\twidth: 15px;\n\theight: 15px;\n\tborder: 0;\n}\n\n.edit-colors-window .color-grid {\n\twidth: 222px;\n\tdisplay: grid;\n\tgrid-template-columns: repeat(8, 16px);\n\tgrid-gap: 5px 9px;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\tmargin-left: 8px;\n}\n.edit-colors-window .swatch {\n\twidth: 16px;\n\theight: 13px;\n\tdisplay: flex;\n}\n.edit-colors-window .window-content {\n\tfont-family: Tahoma, sans-serif;\n\tfont-size: 12px;\n}\n.edit-colors-window .swatch {\n\toutline: none; /* we'll provide a new focus indicator below */\n}\n.edit-colors-window .swatch.selected {\n\toutline: 1px solid black;\n\toutline-offset: 0px;\n}\n.edit-colors-window .swatch:focus::after {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\tright: 0;\n\ttop: 0;\n\tleft: 0;\n\tbottom: 0;\n\toutline: 1px dotted black;\n\toutline-offset: 5px;\n}\n.edit-colors-window .window-content .left-right-split {\n\tdisplay: flex;\n\tflex-flow: row;\n}\n.edit-colors-window .window-content .left-side {\n\t/* display: flex;\n\tflex-flow: column; */\n\twidth: 217px;\n\theight: 298px;\n}\n.edit-colors-window .window-content .right-side {\n\twidth: 218px;\n\tposition: relative;\n\tpadding-top: 7px;\n\tpadding-left: 10px;\n}\n.edit-colors-window .window-content .button-group {\n\tdisplay: flex;\n\tflex-flow: row;\n}\n.edit-colors-window .window-content .button-group button {\n\tmin-width: 66px;\n\tmargin: 3px;\n}\n.edit-colors-window .window-content .define-custom-colors-button,\n.edit-colors-window .window-content .button-group button:first-of-type {\n\tmargin-left: 5px;\n}\n.edit-colors-window .window-content button {\n\theight: 23px;\n\tbox-sizing: border-box;\n\tpadding: 0;\n\tmargin-left: 3px;\n}\n.edit-colors-window .window-content .define-custom-colors-button {\n\tmargin-top: 13px;\n\twidth: 210px;\n}\n.edit-colors-window .window-content .add-to-custom-colors-button {\n\tposition: absolute;\n\tbottom: 5px;\n\tright: 5px;\n\twidth: 213px;\n}\n.edit-colors-window .left-side label {\n\tdisplay: block;\n\tmargin-top: 7px;\n\tmargin-bottom: 5px;\n\tmargin-left: 5px;\n}\n.edit-colors-window .left-side label:nth-of-type(2) {\n\tmargin-top: 18px;\n\tmargin-bottom: 7px;\n}\n.edit-colors-window .luminosity-canvas {\n\tmargin-left: 15px;\n}\n.edit-colors-window .result-color-canvas {\n\tmargin-top: 4px;\n}\n/* WET layout code for small viewports and Enlarge UI mode */\n/* could do it cleaner with JavaScript or CSS preprocessor */\n@media (max-width: 450px) {\n\t.edit-colors-window {\n\t\toverflow: hidden;\n\t}\n\t.edit-colors-window.defining-custom-colors .left-side {\n\t\t/* display: none !important; */\n\t\t/* this element is determining the height */\n\t\twidth: 0;\n\t\tvisibility: hidden;\n\t}\n\t.edit-colors-window:not(.defining-custom-colors) .right-side {\n\t\tdisplay: none !important;\n\t}\n}\n/* WET layout code for small viewports and Enlarge UI mode */\n.enlarge-ui .edit-colors-window {\n\toverflow: hidden;\n}\n.enlarge-ui .edit-colors-window.defining-custom-colors .left-side {\n\t/* display: none !important; */\n\t/* this element is determining the height */\n\twidth: 0;\n\tvisibility: hidden;\n}\n.enlarge-ui .edit-colors-window:not(.defining-custom-colors) .right-side {\n\tdisplay: none !important;\n}\n\n.save-as .window-content > form > div {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n.save-as .window-content > form > div > label {\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: space-between;\n\talign-items: center;\n\tmargin-right: 10px;\n}\n.save-as .window-content > form > div > label > input,\n.save-as .window-content > form > div > label > select {\n\twidth: calc(100vw - 220px);\n\tmax-width: 230px;\n\tfloat: left;\n\tmargin: 5px;\n\tbox-sizing: border-box;\n}\n.save-as .window-content > form > div > label:not(:first-of-type) {\n\tmargin-top: 8px;\n}\n.save-as .window-content {\n\tpadding-top: 10px;\n\tpadding-bottom: 10px;\n}\n.save-as .button-group button {\n\tmargin: 5px;\n}\n\n.font-box {\n\tdisplay: flex;\n\tflex-flow: row;\n\talign-items: center;\n\tmargin: 4px 7px; /* not measured, just guessed */\n\tgap: 10px;\n}\n\n.canvas-area {\n\tflex: 1;\n\tdisplay: block !important;\n\tposition: relative;\n\toverflow: auto;\n\tpadding: 3px;\n\tdirection: ltr;\n}\n.main-canvas {\n\tposition: absolute;\n\tz-index: 2;\n}\n.canvas-area .handle {\n\tposition: absolute;\n\twidth: 3px;\n\theight: 3px;\n\tz-index: 1;\n\tpointer-events: none; /* important for Dwell Clicker mode */\n}\n.grab-region {\n\t/* the grab-region make handles way easier to grab by extending outside the visual representation of the handle */\n\tposition: absolute;\n\t/*background: rgba(255, 0, 0, 0.5);*/ /* debug */\n}\n/* .grab-region.is-middle { */\n\t/*background: rgba(255, 255, 0, 0.5);*/ /* debug */\n/* } */\n.textbox::before {\n\t/* allow dragging textbox */\n\t/* In mspaint the border drawn around selections and textboxes extends out from them,\n\tcentered on the pixels bordering the contents,\n\twhich makes it more reasonable to have the border be a draggable thing.\n\tI'm making the draggable area outside the border for now. */\n\tcontent: \"\";\n\tpointer-events: all; /* @TODO: maybe don't have a blanket pointer-events: none; on pseudo elements */\n\tdisplay: block;\n\tposition: absolute;\n\tright: -10px;\n\tleft: -10px;\n\ttop: -10px;\n\tbottom: -10px;\n\t/*background: orange;*/ /* debug */\n}\n\n.window-content .button-group {\n\tdisplay: flex;\n\tflex: 0 0 auto;\n\tflex-flow: column;\n}\n.window-content .button-group > button {\n\tmin-width: 80px;\n\tpadding: 3px 5px;\n\twhite-space: nowrap;\n}\n.window-content > form {\n\tdisplay: flex;\n\tflex-flow: row;\n}\n.window:not(.edit-colors-window) .window-content > form {\n\tdirection: rtl;\n}\n.horizontal-buttons .window-content > form {\n\tflex-flow: column;\n}\n.horizontal-buttons .window-content > form > .button-group {\n\tdisplay: flex;\n\tflex-flow: row;\n\tjustify-content: flex-end;\n\tgap: 5px;\n\tmargin: 5px;\n\tmargin-bottom: 10px;\n}\n.horizontal-buttons .window-content > form > div:first-child {\n\tpadding: 5px;\n}\n\n.stretch-and-skew .window-content,\n.flip-and-rotate .window-content,\n.convert-to-black-and-white .window-content,\n.component-window .window-content {\n\tdirection: rtl;\n}\n\n.dialog-window:not(.horizontal-buttons):not(.edit-colors-window) .window-content {\n\tpadding: 10px;\n}\n.dialog-window:not(.horizontal-buttons):not(.edit-colors-window) .window-content .button-group {\n\tpadding-right: 10px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 5px;\n}\n\n.flip-and-rotate fieldset {\n\twidth: 200px;\n}\n.flip-and-rotate fieldset > label {\n\tdisplay: flex !important; /* overriding `.window:not(.edit-colors-window) .window-content label` */\n}\n.flip-and-rotate input:disabled {\n\t/* pointer events already can't get received on disabled input elements,\n\tbut this lets them be received on a parent,\n\tin order to enable the element */\n\tpointer-events: none;\n}\n.flip-and-rotate .sub-options {\n\tpadding-right: 30px;\n}\n.flip-and-rotate .radio-wrapper {\n\twidth: fit-content;\n}\n\n/* Fix label ordering for RTL layout (display inline labels can get super out of order with the checkboxes/inputs - very confusing!) */\n.window:not(.edit-colors-window):not(.tracky-mouse-window) .window-content label {\n\tdisplay: inline-flex;\n\tflex-direction: row;\n\tdirection: rtl;\n}\n\n.attributes-window .window-content {\n\tdirection: rtl;\n}\n.attributes-window table {\n\tmargin-bottom: 5px;\n}\n.attributes-window input[type=\"number\"] {\n\tmargin-right: 5px; /* separate label from input for Width and Height fields */\n}\n.attributes-window table ~ label ~ label {\n\tmargin-right: 10px; /* separate Width and Height fields */\n}\n.attributes-window fieldset {\n\tmargin-top: 5px;\n}\n.attributes-window fieldset .fieldset-body {\n\tdisplay: grid;\n\tgrid-template-columns: calc(80px * 2) 80px;\n}\n.attributes-window fieldset:first-of-type .fieldset-body {\n\tgrid-template-columns: 80px 80px 80px;\n}\n\n.custom-zoom-window .current-zoom {\n\tmargin: 10px 15px;\n}\n.custom-zoom-window fieldset {\n\tmargin: 8px;\n\tpadding: 0;\n}\n.custom-zoom-window .fieldset-body {\n\tdisplay: flex;\n\tflex-flow: column wrap;\n\twidth: 240px;\n\theight: 70px;\n\tpadding: 12px 5px;\n\trow-gap: 10px;\n}\n.custom-zoom-window bdi {\n\tmargin: 0 10px;\n}\n.custom-zoom-window input[name=\"really-custom-zoom-input\"] {\n\twidth: 50px;\n}\n\n.radio-field {\n\tdisplay: flex;\n\tflex-flow: row;\n\talign-items: center;\n}\n\n/* @TODO: part of os-gui */\n.os-window {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n/* @TODO: part of os-gui */\n.os-window .window-content {\n\tflex: 1;\n}\n\n.help-window .window-content {\n\tdisplay: flex;\n\tflex-flow: column;\n}\n.help-window .main {\n\tflex: 1;\n\tdisplay: flex;\n\tflex-flow: row;\n\theight: 0; /* fixes an overflow issue with small window height, where the iframe and contents tree would be sized based on the intrinsic height of the contents tree */\n}\n.help-window .toolbar button {\n\twidth: 55px;\n\theight: 40px;\n\tpadding: 0;\n}\n.help-window .toolbar button span {\n\tdisplay: inline-flex;\n\tposition: absolute;\n\tbottom: 0;\n\tright: 0;\n\tleft: 0;\n\t/* flex centering + preventing overflow wrap means the font can be too big and it'll still stay centered */\n\tfont-size: 12px;\n\twhite-space: pre;\n\tjustify-content: center;\n}\n.help-window .toolbar button {\n\tposition: relative;\n}\n.help-window .toolbar button .icon {\n\twidth: 100%;\n\theight: 100%;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n}\n.help-window .toolbar button .icon {\n\tbackground-image: url(\"../images/help-viewer-toolbar-icons-grayscale.png\");\n}\n.help-window .toolbar button:not([disabled]):hover .icon {\n\tbackground-image: url(\"../images/help-viewer-toolbar-icons.png\");\n}\n.help-window .toolbar button[disabled] .icon {\n\tfilter: saturate(0%) opacity(50%); /* fallback */\n\tfilter: url(\"#disabled-inset-filter\");\n}\n.help-window .contents {\n\tbackground: white;\n\tbackground: var(--Window);\n\tcolor: var(--WindowText);\n\tflex-basis: 300px; /* normally the default is 200px, but that leaves a scrollbar and we don't have rollover viewing of longer titles (@TODO) */\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\toverflow: auto;\n\tbox-sizing: border-box;\n}\n.help-window ul {\n\tmargin: 0;\n\tpadding: 0;\n}\n.help-window li {\n\tdisplay: block;\n\twhite-space: nowrap;\n}\n.help-window .item {\n\tdisplay: inline-block;\n}\n.help-window .folder:not(.expanded) ul {\n\tdisplay: none;\n}\n.help-window iframe {\n\tflex: 1;\n\twidth: 0;\n}\n.help-window li ul {\n\t/* Help content is not currently translated, so it's all in English */\n\tpadding-left: 16px;\n}\n.help-window li:before {\n\tcontent: \"\";\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\twidth: 16px;\n\theight: 16px;\n\tbackground-position: 0 0;\n\tmargin-left: 2px;\n}\n.help-window .folder.expanded:before {\n\tbackground-position: -16px 0;\n}\n.help-window .page:before {\n\tbackground-position: -32px 0;\n}\n\n.dragging iframe {\n\tpointer-events: none;\n}\n\n.storage-manager table {\n\tmax-height: 400px;\n\toverflow: auto;\n\tdisplay: block;\n}\n.storage-manager .thumbnail-container {\n\twidth: 64px;\n\theight: 64px;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n.storage-manager .thumbnail-container > img {\n\tmax-width: 64px;\n\tmax-height: 64px;\n\tflex: 0 0 auto;\n}\n.storage-manager .thumbnail-container,\n.storage-manager p {\n\tmargin: 5px;\n}\n.storage-manager .remove-button {\n\tmargin-right: 15px;\n}\n\n.history-window .window-content {\n\tdirection: rtl;\n}\n.history-view {\n\twidth: 500px;\n\theight: 500px;\n\tmax-width: calc(100vw - 10px);\n\tmax-height: calc(100vh - 100px);\n\toverflow: auto;\n\tposition: relative; /* needed for offsetTop to work relative to the top of the list (rather than the window) */\n\tdirection: rtl;\n}\n.history-entry {\n\tcursor: pointer;\n\tpadding: 5px;\n\tdisplay: flex;\n}\n.history-entry-icon-area {\n\twidth: 16px;\n\theight: 16px;\n\tmargin-left: 6px;\n}\n.history-entry.current {\n\tfont-weight: bold;\n}\n.history-entry:not(.current):not(.ancestor-of-current) {\n\tcolor: gray;\n}\n.history-entry:hover:hover:hover { /* specificity hack vs :not()s */\n\tcolor: #0000ff;\n\ttext-decoration: underline;\n}\n\n/* TODO: reduce scope of this rule, and remove exception(s) to it */\n::before, ::after {\n\tpointer-events: none;\n}\n/* Quick fix for clicking directly on the radio button in themes which use styles from 98.css */\ninput[type=\"radio\"] + label::before {\n\tpointer-events: all;\n}\n\n.cursor-bully * {\n\tcursor: inherit !important;\n}\n\n#about-paint-header {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: wrap;\n\tmargin: 0;\n\tmargin-top: 10px;\n\tmargin-bottom: 10px;\n}\n#about-paint-beside-icon {\n\tmargin: auto 10px;\n}\n#jspaint-project-name {\n\twhite-space: nowrap;\n\tfont-size: 2rem;\n\tmargin: 0;\n}\n#jspaint-version {\n\t/* @TODO: separate some of this into a shared.css? (not all layout!) */\n\twhite-space: nowrap;\n\tfont-size: 1.4rem;\n\tfont-weight: normal;\n}\n#maybe-outdated-line {\n\tfont-style: italic;\n\tline-height: 1;\n\t/* min-height avoids a flaky test where sometimes the element blackout is visible and sometimes not depending on whether the news had been loaded when the test runs */\n\tmin-height: 1em;\n\t/* top margin is almost just to separate blackout regions for clarity in the visual test snapshots */\n\tmargin-top: 3px;\n}\n#view-project-news,\n#close-about-paint {\n\tmargin: auto; /* for right-alignment AND avoiding stretching to height of the container */\n\tmargin-left: 0;\n\twidth: 100px;\n\tmin-height: 2.2rem;\n}\n#close-about-paint {\n\tfloat: left;\n\tmargin-bottom: 10px;\n}\n\n#news {\n\tmax-height: 500px;\n\toverflow: auto;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tcursor: auto;\n}\n@media (max-height: 550px) {\n\t#news {\n\t\tmax-height: calc(100vh - 50px);\n\t}\n}\n\n.news-indicator {\n\tdisplay: flex;\n\tfont-family: sans-serif;\n}\n.news-indicator > img {\n\tmargin-left: 5px;\n}\n@media (max-width: 550px) {\n\t.news-indicator > img {\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\tbottom: 0;\n\t}\n\t.news-indicator .marquee {\n\t\tdisplay: none;\n\t}\n}\n\n.marquee {\n\toverflow: hidden;\n\ttext-decoration: inherit;\n}\n\n.marquee span {\n\tdisplay: inline-block;\n\twhite-space: nowrap;\n\twidth: var(--text-width);\n\ttext-shadow:\n\t\tvar(--text-width) 0 currentColor,\n\t\tcalc(-1*(var(--text-width) * 2)) 0 currentColor,\n\t\tcalc(-1*(var(--text-width) * 3)) 0 currentColor,\n\t\tcalc(-1*(var(--text-width) * 4)) 0 currentColor;\n\twill-change: transform;\n\tanimation: marquee var(--animation-duration) linear infinite;\n\tanimation-play-state: paused;\n\ttext-decoration: inherit;\n}\n\n.marquee:hover span {\n\tanimation-play-state: running;\n}\n\n@keyframes marquee {\n\t0% { transform: translateX(0); }\n\t100% { transform: translateX(-100%); }\n}\n\n/* On MacOs: System Preferences > Accessibility > Display > Reduce motion */\n@media (prefers-reduced-motion: reduce) {\n\t.marquee span {\n\t\tanimation: none;\n\t\ttext-shadow: none;\n\t\twidth: auto;\n\t\tdisplay: block;\n\t\tline-height: 1.5;\n\t\ttext-align: center;\n\t\twhite-space: normal;\n\t}\n}\n\n/* For Safari on iPad, Fullscreen mode overlays the system bar, completely obscuring our menu bar. */\n/* This adds a spacer to the top of the page, styled with the title bar gradient, to prevent that. */\n/* Only show this if the device is tall enough that this won't cause any problems (fullscreen is important for fitting the color palette on the screen on some phones) */\n:root {\n\t--ios-title-bar-height: 21px; /* this is what looks good to my eye, there's not a hard line in the overlay, just text/symbols, and I didn't measure the system bar in a case where it has a background */\n\t/* hope it doesn't change! */\n}\n@media (min-height: 450px) {\n\t.ios.fullscreen .jspaint {\n\t\tpadding-top: var(--ios-title-bar-height);\n\t}\n\t.ios.fullscreen .jspaint::before {\n\t\tcontent: \"\";\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tright: 0;\n\t\tleft: 0;\n\t\theight: var(--ios-title-bar-height);\n\t}\n\t/* That works, but now the exit fullscreen button (which we also can't change) obscures the menu bar. */\n\t/* So center the menu bar contents, that'll look nice. */\n\t/* .ios.fullscreen .menus {\n\t\tjustify-content: center;\n\t}\n\t/* Ugh no, then the three dots button (multitasking menu) at the top of the system menu steals taps from the menu bar. */\n\t/* Just shift it over by a fixed amount. */\n\t/* This lets it sit in between the exit button and the three dots button,\n\tat least on a 9th generation iPad with software version 15.0.2 (this is a very fragile workaround) */\n\t.ios.fullscreen .menus {\n\t\tpadding-right: 100px;\n\t}\n\t/* Also nudge the tools downward to avoid the exit fullscreen button */\n\t/* (not if it's in a window, only if it's docked) */\n\t/* (I considered using `.ios.fullscreen .horizontal > .component-area:first-child`\n\tso that it's not affected by the transform in Enlarge UI mode,\n\tbut it wants tweaking in that case anyways due to the menu bar being bigger */\n\t.ios.fullscreen .component-area .tools-component {\n\t\tpadding-top: 40px;\n\t}\n\t/* Not so much in Enlarge UI mode, where it's scaled with transform,\n\tand where the menu bar takes more of the space reserved for the exit fullscreen button */\n\t.ios.fullscreen .enlarge-ui .component-area .tools-component {\n\t\tpadding-top: 10px;\n\t}\n}\n\nselect.inset-deep {\n\tbackground-position: top 0px left 0px;\n\tpadding-left: 16px;\n}\n\nprogress {\n\twidth: 291px;\n\theight: 20px;\n\tbox-sizing: border-box;\n}\n\ndetails pre {\n\tmargin: 0;\n\tmargin-top: 5px;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n}\n\ndetails {\n\tmargin-top: 8px;\n}\nsummary {\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\tcursor: pointer;\n}\n\n.too-big-soon-gif {\n\ttransition: transform 0.2s;\n\ttransform-origin: 100% 100%;\n\timage-rendering: optimizeQuality;\n}\n.menu-item:not(.highlight) .too-big-soon-gif {\n\ttransform: scale(0.6);\n}"
  },
  {
    "path": "styles/legal.css",
    "content": "body {\n\tfont-family: sans-serif;\n}\n\nmain,\nfooter {\n\tmargin: 0 auto;\n\tmax-width: 60em;\n\tpadding: 1em;\n}\n"
  },
  {
    "path": "styles/normalize.css",
    "content": "\n/* Remove the inner border and padding in Firefox. */\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n\tborder-style: none;\n\tpadding: 0;\n}\n\n/* Restore the focus styles unset by the previous rule.*/\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n\toutline: 1px dotted ButtonText;\n}\n"
  },
  {
    "path": "styles/print.css",
    "content": "\nhtml, body, .jspaint {\n\twidth: 100%;\n\theight: 100%;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\toverflow: hidden;\n}\n\n.canvas-area,\n.main-canvas {\n\tposition: fixed;\n\tleft: 0;\n\ttop: 0;\n\tmax-width: 100%;\n\twidth: auto !important;\n\theight: auto !important;\n\tborder: 0 !important;\n}\n\n.window,\n.canvas-area .handle,\n.canvas-area .grab-region,\n.status-area,\n.menus,\n.component-area,\n.selection,\n.textbox,\n.helper-layer,\nbutton,\n.tracky-mouse-hover-halo,\n.tracky-mouse-dwell-indicator {\n\tdisplay: none !important;\n}\n\n* {\n\tbackground: transparent !important;\n}\n"
  },
  {
    "path": "styles/themes/bubblegum.css",
    "content": "@import url(\"modern.css\");\n\n:root {\n\t--theme-loaded: \"bubblegum.css\";\n\n\t--window-frame-active-color: transparent;\n\t--window-frame-inactive-color: transparent;\n\t--menu-text-disabled-color: #5c71a0;\n\t--menu-text-color: #330050;\n\t--window-text-color: #330050;\n\t--window-titlebar-text-color: #330050;\n\t--WindowText: #330050;\n}\n\n* {\n\ttext-shadow: 1px 1px 1px rgba(255, 255, 255, 0.5);\n}\n\n.menu-button,\nbutton,\n.window-titlebar {\n\tfont-weight: bold;\n}\n\n.component-area:not(:empty),\n.status-field  {\n\tborder-image-source: url(\"../../images/bubblegum/bubblegum-border-with-recess.png\") !important;\n\tborder-image-slice: 82 95 77 92 fill !important;\n\tborder-image-width: 20px 20px 20px 20px !important;\n\tborder-image-outset: 0px 0px 0px 0px !important;\n\tborder-image-repeat: stretch stretch !important;\n\tborder-style: solid !important;\n\tpadding: 7px !important;\n\tbackground-color: transparent !important;\n\t/* for box-shadow */\n\tborder-radius: 10px !important;\n}\n\n.os-window .window-titlebar {\n\tbackground: transparent !important;\n}\n\n.os-window .window-content {\n\tbackground: transparent !important;\n}\n\n.menu-button,\nbutton,\n.tools-component .tool {\n\tpadding: 7px !important;\n}\n\n.os-window,\nbutton:not(.lightweight):not(:active),\nbutton.lightweight:hover:not(:active),\n.tools-component .tool,\n.menus,\n.menu-popup,\n.menu-button.highlight:not(.active),\n.status-area {\n\tborder-image-source: url(\"../../images/bubblegum/bubblegum-border.png\") !important;\n\tborder-image-slice: 82 95 77 92 fill !important;\n\tborder-image-width: 20px 20px 20px 20px !important;\n\tborder-image-outset: 0px 0px 0px 0px !important;\n\tborder-image-repeat: stretch stretch !important;\n\tborder-style: solid !important;\n\tbackground-color: transparent !important;\n\tborder-radius: 10px !important;\n}\n\n.window-content,\nhr,\n.inset-deep,\n.swatch,\n.tool-options,\n.status-field,\n.menu-button.active,\nbutton:active,\n.tools-component .tool.selected {\n\tborder-image-source: url(\"../../images/bubblegum/bubblegum-recess.png\") !important;\n\tborder-image-slice: 82 95 77 92 fill !important;\n\tborder-image-width: 20px 20px 20px 20px !important;\n\tborder-image-outset: 0px 0px 0px 0px !important;\n\tborder-image-repeat: stretch stretch !important;\n\tborder-style: solid !important;\n\tpadding: 7px !important;\n\tbackground-color: transparent !important;\n\t/* border-radius affects hover outline in Dwell Clicker mode, as well as any clipping (with overflow: hidden), and box-shadows */\n\tborder-radius: 10px !important;\n\t/* box-shadow can't be applied directly here, because of the border-image fill (as far as I know; might want to test that assumption) */\n}\n\n.tools-component .tool,\n.tools-component .tool.selected {\n\tborder-image-width: 5px !important;\n\tborder-radius: 4px !important;\n}\n.tools-component .tool.selected {\n\tborder-image-outset: 2px !important;\n}\n\n/* The shadows that are part of the border-image don't go on top of the\ncontents of the element, but I can somewhat mimic the shadows,\nusing box-shadow on a pseudo element.\n\nThis better integrates the contents in the (virtual, imagined) physical scene,\nbut it does increase the visual weight of the shadows,\nwhere it overlaps the shadows baked into the border-image. */\n.tool-options {\n\tposition: relative;\n}\n.tool-options::before {\n\tcontent: \"\";\n\tdisplay: block;\n\tbox-shadow: inset 5px 5px 8px rgba(32, 49, 60, 0.36), inset -4px 4px 6px rgba(32, 49, 60, 0.26), inset 0px -4px 2px rgba(255, 224, 255, 0.96);\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n}\n\n.window-content,\n.canvas-area.inset-deep,\n.status-field {\n\tborder-image-outset: 5px !important;\n}\n.swatch {\n\tpadding: 0px !important;\n\tborder-image-outset: 14px !important;\n\ttransform: scale(0.6);\n\tborder-radius: 5px !important;\n\toverflow: hidden;\n}\n.swatch::after {\n\t/* hide box-shadow based border */\n\tdisplay: none;\n}\n\nhr {\n\ttransform: scaleY(0.5);\n}\n\n.tool-options {\n\tpadding: 0px !important;\n\tborder-image-outset: 10px !important;\n\toverflow: hidden;\n\tmargin-top: 10px;\n}\n.tools-component {\n\tpadding-top: 5px;\n}\n.menu-button.active,\n.menu-button.active,\nbutton:active {\n\tborder-image-outset: 7px !important;\n}\n\n.menu-item.highlight {\n\tbackground: rgba(255, 255, 255, 0.2);\n}\n\n/* About window */\n#about-paint-icon {\n\t/* Replace icon */\n\tdisplay: block;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tbackground: url(\"../../images/bubblegum/bubblegum-paint-128x128.png\") no-repeat;\n\tbackground-size: 100% 100%;\n\tpadding-left: 128px;\n}\n\n/* Need multiple specificity levels to override Modern theme. */\n.tool-icon,\n.tool-icon.use-svg,\n.enlarge-ui .tool-icon.use-svg {\n\tbackground-image: url(\"../../images/bubblegum/bubblegum-tools.svg\");\n\tbackground-position: calc(-16px * (var(--icon-index) * 2 + 1)) -16px;\n\tfilter: drop-shadow(2px 3px 1px rgba(53, 54, 134, 0.5));\n}\n\n.toggle-dwell-clicking .button-icon {\n\tbackground: url(../../images/bubblegum/eye-gaze-pause-128x128.png);\n\tbackground-size: 100% 100%;\n}\n.dwell-clicker-mode.dwell-clicker-paused .toggle-dwell-clicking .button-icon {\n\tbackground: url(../../images/bubblegum/eye-gaze-unpause-128x128.png);\n\tbackground-size: 100% 100%;\n}\n\n/* Need multiple specificity levels to override Modern theme. */\n.transparent-mode-option,\n.transparent-mode-option.use-svg {\n\tbackground-image: url(\"../../images/bubblegum/options-transparency.svg\");\n}\n\n/* Pressed effect: move icons down so they feel like they're recessed into the button */\n.tool.selected .tool-icon {\n\ttransform: translateY(1px);\n\tfilter: drop-shadow(1px 2px 0.5px rgba(53, 54, 134, 0.5));\n}\n\n/* Avoid light part of feathered recess texture appearing as a glow over top of the button above */\n.tool.selected:not(:nth-child(1)):not(:nth-child(2)) {\n\tclip-path: inset(0 0 0 0);\n}\n"
  },
  {
    "path": "styles/themes/classic.css",
    "content": "@import \"../../lib/os-gui/build/windows-98.css\";\n/* @import \"../../lib/os-gui/build/windows-default.css\"; */\n/* @import \"../../lib/os-gui/build/peggys-pastels.css\"; */\n\n:root {\n\t--theme-loaded: \"classic.css\";\n}\n\n/* .compare-reference is added to <body> when \"compare-reference\" is in the URL hash. */\n.compare-reference::after {\n\tcontent: url(\"../../images/mspaint-win98-reference.png\");\n\tposition: fixed;\n\ttop: -23px;\n\tleft: -4px;\n\tz-index: 10000;\n\topacity: 0.5;\n\t/* opacity: attr(data-reference-opacity); not supported */\n\ttransition: opacity 0.5s;\n}\n.compare-reference[data-reference-opacity=\"0\"]::after { opacity: 0; }\n.compare-reference[data-reference-opacity=\"0.1\"]::after { opacity: 0.1; }\n.compare-reference[data-reference-opacity=\"0.2\"]::after { opacity: 0.2; }\n.compare-reference[data-reference-opacity=\"0.3\"]::after { opacity: 0.3; }\n.compare-reference[data-reference-opacity=\"0.4\"]::after { opacity: 0.4; }\n.compare-reference[data-reference-opacity=\"0.5\"]::after { opacity: 0.5; }\n.compare-reference[data-reference-opacity=\"0.6\"]::after { opacity: 0.6; }\n.compare-reference[data-reference-opacity=\"0.7\"]::after { opacity: 0.7; }\n.compare-reference[data-reference-opacity=\"0.8\"]::after { opacity: 0.8; }\n.compare-reference[data-reference-opacity=\"0.9\"]::after { opacity: 0.9; }\n.compare-reference[data-reference-opacity=\"1\"]::after { opacity: 1; }\n\n.compare-reference-tool-windows::after {\n\tcontent: url(\"../../images/mspaint-win98-reference-tool-windows.png\");\n}\n.compare-reference {\n\twidth: calc(567px - 4px - 4px);\n\theight: calc(402px - 23px - 4px);\n\tbackground: var(--Background);\n}\n\n.jspaint {\n\tbackground: var(--ButtonFace);\n}\nbody,\n.canvas-area {\n\tbackground: var(--AppWorkspace);\n}\n.canvas-area > canvas {\n\tbackground: var(--checker);\n\t/* 16px is a common grid size, but that gives 8px grid cells, and our max zoom is 8x */\n\t/*background-size: 16px;*/\n\tbackground-size: 8px;\n}\n\n/* Show images as pixelated if at pixel-perfect scales. */\n/* WET for vendor prefixes (for Safari) */\n@media (resolution: 1x), (resolution: 2x), (min-resolution: 3x) {\n\t* {\n\t\timage-rendering: -moz-crisp-edges;\n\t\timage-rendering: crisp-edges;\n\t\timage-rendering: pixelated;\n\t}\n}\n@media (-webkit-device-pixel-ratio: 1), (-webkit-device-pixel-ratio: 2), (-webkit-device-pixel-ratio: 3) {\n\t* {\n\t\timage-rendering: -moz-crisp-edges;\n\t\timage-rendering: crisp-edges;\n\t\timage-rendering: pixelated;\n\t}\n}\n\n.disable-aa-for-things-at-main-canvas-scale .main-canvas,\n.disable-aa-for-things-at-main-canvas-scale .selection canvas {\n\timage-rendering: -moz-crisp-edges;\n\timage-rendering: crisp-edges;\n\timage-rendering: pixelated;\n}\n.thumbnail-img {\n\t/* these scale down, so nearest neighbor scaling looks bad */\n\timage-rendering: auto;\n}\n\n.selection:after,\n.textbox:after {\n\tcontent: \"\";\n\tposition: absolute;\n\tleft: 0px;\n\ttop: 0px;\n\tright: 0px;\n\tbottom: 0px;\n\toutline: 1px dashed black;\n\tbox-shadow: 0 0 0 1px white;\n}\n.canvas-area .handle {\n\tbackground: var(--Hilight);\n}\n.canvas-area .useless-handle {\n\tbackground: var(--HilightText); /* @TODO: --ButtonHilight? --Window? */\n\tbox-shadow: 1px 1px 0 var(--Hilight) inset;\n}\n.resize-ghost {\n\t/* this isn't quite the right inversion effect, but I think it's the best I can do;\n\twhite makes it invisible over the classic theme's dark gray background;\n\tit's supposed to be lighter over the dark gray background, but I can only make it darker */\n\toutline: 1px dotted #ccc;\n\tmix-blend-mode: difference;\n}\n\n.status-area {\n\tgap: 2px;\n\tfont-family: \"Segoe UI\", sans-serif;\n\tfont-size: 12px;\n\tcolor: var(--ButtonText);\n\tpadding-top: 2px;\n}\n.status-field {\n\theight: 21px;\n\tbox-sizing: border-box;\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.text-toolbar-button-group button:not(:first-child) {\n\tmargin-left: 0;\n}\n.text-toolbar-button-group button:not(:last-child) {\n\tmargin-right: 0;\n}\n\n.tool-options {\n\tborder: 1px solid var(--ButtonHilight);\n\tborder-top-color: var(--ButtonShadow);\n\tborder-left-color: var(--ButtonShadow);\n}\n.tool {\n\tmargin: 0;\n\tpadding: 0;\n\twidth: 25px;\n\theight: 25px;\n\tborder: 0;\n\tborder-right: 1px solid var(--ButtonDkShadow);\n\tborder-bottom: 1px solid var(--ButtonDkShadow);\n\tbackground: transparent;\n\toutline: 0;\n}\n.tool:before {\n\tcontent: \" \";\n\tposition: absolute;\n\tz-index: 1;\n\ttop: 0px;\n\tleft: 0px;\n\tright: 0px;\n\tbottom: 0px;\n\tborder-top: 1px solid var(--ButtonHilight);\n\tborder-left: 1px solid var(--ButtonHilight);\n\tborder-right: 1px solid var(--ButtonShadow);\n\tborder-bottom: 1px solid var(--ButtonShadow);\n}\n.tool:hover:active {\n\tpadding: 1px;\n\tbackground: transparent !important;\n}\n.tool:hover:active,\n.tool.selected {\n\tpadding-bottom: 2px;\n\ttop: 0px;\n\tleft: 0px;\n\tright: 0px;\n\tbottom: 0px;\n\tborder-top: 1px solid var(--ButtonDkShadow);\n\tborder-left: 1px solid var(--ButtonDkShadow);\n\tborder-right: 1px solid var(--ButtonHilight);\n\tborder-bottom: 1px solid var(--ButtonHilight);\n}\n.tool:hover:active:before,\n.tool.selected:before {\n\ttop: 0px;\n\tleft: 0px;\n\tright: 0px;\n\tbottom: 0px;\n\tborder-top: 1px solid var(--ButtonShadow);\n\tborder-left: 1px solid var(--ButtonShadow);\n\tborder-right: 1px solid var(--ButtonFace);\n\tborder-bottom: 1px solid var(--ButtonFace);\n}\n.tool.selected,\n.current-colors {\n\tbackground: var(--checker);\n}\n.tool-icon {\n\tbackground-image: url(\"../../images/classic/tools.png\");\n\tbackground-repeat: no-repeat;\n\tbackground-position: calc(-16px * var(--icon-index)) 0;\n}\n.tool-icon.use-svg {\n\tbackground-image: url(\"../../images/classic/tools.svg\");\n\tbackground-position: calc(-16px * (var(--icon-index) * 2 + 1)) -16px;\n}\n\n.tools {\n\theight: 200px;\n\twidth: 50px;\n}\n\n\n.current-colors {\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n}\n.color-selection {\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tborder-top: 1px solid var(--ButtonHilight);\n\tborder-left: 1px solid var(--ButtonHilight);\n\tborder-right: 1px solid var(--ButtonShadow);\n\tborder-bottom: 1px solid var(--ButtonShadow);\n}\n.color-selection:after {\n\tcontent: \"\";\n\tposition: absolute;\n\tleft: 0px;\n\ttop: 0px;\n\tright: 0px;\n\tbottom: 0px;\n\t/* @TODO: ButtonAlternateFace? */\n\tborder: 1px solid var(--ButtonFace);\n}\n.current-colors,\n.color-button {\n\tborder-top: 1px solid var(--ButtonShadow);\n\tborder-left: 1px solid var(--ButtonShadow);\n\t/* @TODO: var(--ButtonAlternateFace)? */\n\tborder-right: 1px solid var(--ButtonFace);\n\tborder-bottom: 1px solid var(--ButtonFace);\n\t/*box-shadow: 1px 1px 0px var(--ButtonDkShadow) inset;*/\n}\n.swatch:before {\n\tcontent: \"\";\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n}\n.color-selection:before {\n\tleft: 1px;\n\ttop: 1px;\n\tright: 1px;\n\tbottom: 1px;\n}\n.color-button:before,\n.current-colors:before,\n.swatch.pattern:before {\n\tborder-left: 1px solid var(--ButtonDkShadow);\n\tborder-top: 1px solid var(--ButtonDkShadow);\n}\n.swatch.pattern:before {\n\tborder-right: 1px solid var(--ButtonDkShadow);\n\tborder-bottom: 1px solid var(--ButtonDkShadow);\n}\n.current-colors:after,\n.color-button:after {\n\tcontent: \"\";\n\tposition: absolute;\n\tleft: -1px;\n\ttop: -1px;\n\tright: -2px;\n\tbottom: -2px;\n\tborder-right: 1px solid var(--ButtonHilight);\n\tborder-bottom: 1px solid var(--ButtonHilight);\n}\n\n.vertical > .component-area::before,\n.vertical > .component-area::after {\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\tborder-top: 1px solid var(--ButtonShadow);\n\tborder-bottom: 1px solid var(--ButtonHilight);\n\tz-index: 0;\n}\n.vertical > .component-area::before {\n\tcontent: \"\";\n\ttop: -2px;\n}\n.vertical > .component-area:not(:empty)::after {\n\tcontent: \"\";\n\tbottom: 0;\n}\n.vertical > .top.component-area::before {\n\ttop: -1px; /* hm, this is a one pixel change, and the tool buttons are supposed to be tucked in by 1px... may be related? */\n}\n.canvas-area {\n\tz-index: 1;\n}\n\n.component-ghost.dock {\n\t/* this isn't quite the right inversion effect, but I think it's the best I can do;\n\twhite makes it invisible over the classic theme's dark gray background;\n\tit's supposed to be lighter over the dark gray background, but I can only make it darker */\n\toutline: 1px solid #ccc;\n\tmix-blend-mode: difference;\n}\n.component-ghost:not(.dock) {\n\toutline: 1px dotted #ccc;\n\tmix-blend-mode: difference;\n}\n.component-ghost:not(.dock):after,\n.component-ghost:not(.dock):before,\n/* @TODO: thicker resize ghost (4px instead of 3px) */\n.resize-ghost.thick:after,\n.resize-ghost.thick:before {\n\tcontent: \"\";\n\tposition: absolute; left: 0; right: 0; top: 0; bottom: 0;\n\toutline: 1px dotted #ccc;\n}\n.component-ghost:not(.dock):after,\n.resize-ghost.thick:after {\n\toutline-offset: 1px;\n}\n.component-ghost:not(.dock):before,\n.resize-ghost.thick:before {\n\toutline-offset: 2px;\n}\n\n.font-box .toggle:enabled > .icon {\n\t-webkit-mask-image: url(\"../../images/text-tools.png\");\n\t-webkit-mask-position: calc(-16px * var(--icon-index)) 0;\n\tmask-image: url(\"../../images/text-tools.png\");\n\tmask-position: calc(-16px * var(--icon-index)) 0;\n\tbackground-color: currentColor;\n}\n.font-box .toggle:disabled > .icon {\n\tbackground-image: url(\"../../images/text-tools.png\");\n\tbackground-position: calc(-16px * var(--icon-index)) 0;\n\tfilter: saturate(0%) opacity(50%); /* fallback */\n\tfilter: url(\"#disabled-inset-filter-2\");\n}\n\n.tool-window .window-titlebar {\n\tfont-size: 12px;\n\theight: 15px;\n}\n.tool-window .window-title {\n\tpadding-left: 2px;\n}\n.tool-window .window-close-button {\n\twidth: 13px;\n\theight: 11px;\n\tbackground-position: 8px 0;\n}\n.tool-window .window-close-button:hover:active {\n\tbackground-position: 9px 1px;\n}\n.tool-window .window-titlebar button {\n\tmargin: 2px;\n}\n.window-content {\n\tfont-family: Arial, sans-serif;\n\tfont-size: 16px;\n\tcolor: var(--WindowText);\n}\n\n.help-window .item {\n\tfont-family: \"Segoe UI\", sans-serif;\n\tfont-size: 12px;\n\tpadding: 0 2px;\n\tposition: relative; /* for ::after */\n}\n.help-window .item:hover {\n\ttext-decoration: underline;\n\tcolor: #0000FF;\n\tcursor: pointer;\n}\n.help-window li:before {\n\tbackground-image: url(\"../../images/help-icons.png\");\n}\n.help-window:not(.focused) .item.selected {\n\tbackground-color: var(--ButtonFace);\n\tcolor: var(--ButtonText); /* ?? */\n}\n.help-window.focused .item.selected {\n\tbackground-color: var(--Hilight);\n\tcolor: var(--HilightText);\n\t/* @TODO: separate focus state of the item */\n\toutline: 1px dotted black;\n\toutline-offset: -1px;\n}\n/* @TODO: separate focus state of the item; while mouse down, the main highlight does not move with the arrow keys but this does, among other differences */\n/* .help-window.focused .item.selected::after {\n\tcontent: \"\";\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tborder: 1px dotted white;\n\tmix-blend-mode: difference;\n} */\n\n.history-view {\n\tbackground: var(--Window);\n\tcolor: var(--WindowText);\n}\n\n.magnification-option {\n\tbackground-image: url(\"../../images/options-magnification.png\");\n}\n.magnification-option.use-svg {\n\tbackground-image: url(\"../../images/options-magnification.svg\");\n}\n.transparent-mode-option {\n\tbackground-image: url(\"../../images/classic/options-transparency.png\");\n}\n.transparent-mode-option.use-svg {\n\tbackground-image: url(\"../../images/classic/options-transparency.svg\");\n}\n\n.floating-undo-button .button-icon {\n\tbackground: url(../../images/classic/undo.svg);\n}\n.toggle-dwell-clicking .button-icon {\n\tbackground: url(../../images/classic/eye-gaze-pause.svg);\n}\n.dwell-clicker-mode.dwell-clicker-paused .toggle-dwell-clicking .button-icon {\n\tbackground: url(../../images/classic/eye-gaze-unpause.svg);\n}\n\n/* Remove hover effect (and specify non-hover style just to be sure) */\n/* The hover effect is way too dramatic when it goes from classic theme-overridden gray to non-overridden red, where it's meant to be only a tweaked shade of red. */\n.tracky-mouse-use-camera-button,\n.tracky-mouse-use-camera-button:hover {\n\tbackground-color: var(--ButtonFace);\n}\n\ninput[type=text]:not(.inset-deep),\ninput[type=url]:not(.inset-deep),\ninput[type=number]:not(.inset-deep) {\n\tborder: 1px solid gray;\n}\ninput[type=text],\ninput[type=url],\ninput[type=search],\ninput[type=number],\ninput[type=text].inset-deep, /* overriding background */\ninput[type=url].inset-deep,\ninput[type=search].inset-deep,\ninput[type=number].inset-deep,\nselect.inset-deep {\n\tbackground-color: var(--Window);\n\tcolor: var(--WindowText);\n\t/* @TODO: should controls be styled by default, or need .inset-deep or similar? */\n\t/* border-image: var(--inset-deep-border-image); */\n}\n\n/* @XXX: using inset-deep to mean \"thematic\" */\ninput[type=text].inset-deep,\ninput[type=url].inset-deep,\ninput[type=search].inset-deep,\ninput[type=number].inset-deep,\nselect.inset-deep {\n\toutline: none;\n}\n\ninput[type=text]:disabled,\ninput[type=url]:disabled,\ninput[type=search]:disabled,\ninput[type=number]:disabled {\n\tbackground: var(--ButtonFace);\n\tcolor: var(--GrayText);\n}\n\ninput[type=number].no-spinner::-webkit-inner-spin-button,\ninput[type=number].no-spinner::-webkit-outer-spin-button {\n\t-webkit-appearance: none;\n\tmargin: 0;\n}\ninput[type=number].no-spinner {\n\t-moz-appearance: textfield;\n}\n\ninput:disabled + label {\n\tcolor: var(--GrayText);\n}\n\n/*\nWill need a wrapper element or ideally an accessible stylable replacement for the select element for further styling.\nCan't use option:hover, or option::after, or select::after, among other things.\n*/\n/* @XXX: using inset-deep to mean \"thematic\" */\nselect.inset-deep {\n\t/* taken from 98.css: https://jdan.github.io/98.css/ */\n\t/* padding-right and background-position are in layout.css for RTL support (@TODO: RTL theme CSS too) */\n\tappearance: none;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t/* spell-checker: disable */\n\tbackground-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='17' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M15 0H0v16h1V1h14V0z' fill='%23DFDFDF'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M2 1H1v14h1V2h12V1H2z' fill='%23fff'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M16 17H0v-1h15V0h1v17z' fill='%23000'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M15 1h-1v14H1v1h14V1z' fill='gray'/%3E%3Cpath fill='silver' d='M2 2h12v13H2z'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11 6H4v1h1v1h1v1h1v1h1V9h1V8h1V7h1V6z' fill='%23000'/%3E%3C/svg%3E\");\n\t/* spell-checker: enable */\n\tbackground-repeat: no-repeat;\n\tborder-radius: 0;\n\tbox-sizing: border-box;\n\theight: 21px;\n\toutline: none;\n}\nselect.inset-deep:focus:not(:active) {\n\tcolor: var(--HilightText);\n\tbackground-color: var(--Hilight);\n}\nselect.inset-deep option {\n\tbackground-color: var(--Window);\n\tcolor: var(--WindowText);\n}\n\n/* input:invalid {\n\tbox-shadow: 0 0 0 2px red;\n} */\n.partial-url-label {\n\topacity: 0.6;\n}\n\n/* @XXX: using .inset-deep to mean \"thematic\" */\n/* @TODO: show percentage on progress bar, white (HilightText) where it overlaps the Hilight */\nprogress[value].inset-deep {\n\tdisplay: block;\n\tappearance: none;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tbackground-color: var(--ButtonFace);\n\tposition: relative;\n}\nprogress[value].inset-deep::-webkit-progress-value { \n\tbackground: var(--Hilight);\n}\nprogress[value].inset-deep::-moz-progress-bar { \n\tbackground: var(--Hilight);\n}\n\nsummary {\n\tpadding: 0;\n}\nsummary:focus {\n\toutline: 1px dotted var(--ButtonText);\n}\nsummary:hover > span {\n\ttext-decoration: underline;\n\tcolor: #0000FF;\n}\nsummary::marker {\n\tcolor: var(--ButtonText);\n\tcontent: \"►\";\n\ttext-decoration: none;\n}\ndetails[open] > summary::marker {\n\tcolor: var(--ButtonText);\n\tcontent: \"▼\";\n\ttext-decoration: none;\n}\n\n/* For Safari on iPad, Fullscreen mode overlays the system bar, completely obscuring our menu bar. */\n/* Code in layout.css adds a spacer to the top of the page, and this styles it with the title bar gradient. */\n.jspaint::before {\n\tbackground: linear-gradient(to left, var(--ActiveTitle), var(--GradientActiveTitle));\n}\n"
  },
  {
    "path": "styles/themes/dark.css",
    "content": "@import \"./classic.css\";\n@import \"./vista-esque-midnight-green.css\";\n\n:root {\n\t--theme-loaded: \"dark.css\";\n}\n\n.tool-icon {\n\tbackground-image: url(\"../../images/dark/tools.png\");\n\tbackground-repeat: no-repeat;\n\tbackground-position: calc(-16px * var(--icon-index)) 0; /* same as classic theme, but couldn't hurt */\n}\n.tool-icon.use-svg {\n\tbackground-image: url(\"../../images/dark/tools.svg\");\n\tbackground-position: calc(-16px * (var(--icon-index) * 2 + 1)) -16px; /* same as classic theme, but couldn't hurt */\n}\n\n.toggle-dwell-clicking .button-icon {\n\tbackground: url(../../images/dark/eye-gaze-pause.svg);\n}\n.dwell-clicker-mode.dwell-clicker-paused .toggle-dwell-clicking .button-icon {\n\tbackground: url(../../images/dark/eye-gaze-unpause.svg);\n}\n"
  },
  {
    "path": "styles/themes/modern-dark.css",
    "content": "@import \"./modern.css\";\n@import \"./vista-esque-midnight-green.css\";\n\n:root {\n\t--theme-loaded: \"modern-dark.css\";\n\n\t--Hilight: #0178d7;\n\t--HilightText: #ffffff;\n\t--WindowText: #ffffff;\n\t--ButtonText: #ffffff;\n\n\t--accent-color: #2196f3;\n\t--accent-color-hover: #1976D2;\n\t--window-frame-active-color: #3f51b5;\n\t--window-frame-inactive-color: #3b3c42;\n\t--help-window-resizer-color: var(--window-frame-inactive-color);\n\t--canvas-area-background-color: #2c2c2c;\n\t--canvas-area-border-color: #000000;\n\t--window-background-color: #000000;\n\t--window-text-color: #ffffff;\n\t--menu-background-color: #000000;\n\t--menu-text-color: #ffffff;\n\t--menu-hover-color: #2c2c2c;\n\t--menu-active-color: #505050;\n\t--menu-text-disabled-color: #8d8d8d;\n\t--menu-text-active-color: #eeeeee;\n\t--menu-divider-color: rgba(128, 128, 128, 0.3);\n\t--selected-tool-color: rgba(128, 128, 128, 0.5);\n\n\t/* Styles built-in controls like buttons. */\n\tcolor-scheme: dark;\n}\n\n.tool-icon {\n\tbackground-image: url(\"../../images/modern/modern-dark-tools.png\");\n\tbackground-position: calc(-16px * (var(--icon-index) * 2 + 1)) -16px;\n}\n.tool-icon.use-svg,\n.enlarge-ui .tool-icon.use-svg {\n\tbackground-image: url(\"../../images/modern/modern-dark-tools.svg\");\n\tbackground-position: calc(-16px * (var(--icon-index) * 2 + 1)) -16px;\n}\n\n.toggle-dwell-clicking .button-icon {\n\tbackground: url(../../images/dark/eye-gaze-pause.svg);\n}\n.dwell-clicker-mode.dwell-clicker-paused .toggle-dwell-clicking .button-icon {\n\tbackground: url(../../images/dark/eye-gaze-unpause.svg);\n}\n"
  },
  {
    "path": "styles/themes/modern.css",
    "content": ":root {\n\t/* These variables are overridden by modern-dark.css */\n\n\t--theme-loaded: \"modern.css\";\n\t\n\t--Hilight: #0178d7;\n\t--HilightText: #ffffff;\n\t--WindowText: #000000;\n\t--ButtonText: #000000;\n\n\t--accent-color: #2196f3;\n\t--accent-color-hover: #1976D2;\n\t--window-frame-active-color: #3f51b5;\n\t--window-frame-inactive-color: #9396a5;\n\t--window-titlebar-text-color: #ffffff;\n\t--help-window-resizer-color: #aaaaaa;\n\t--canvas-area-background-color: #7b7b7b;\n\t--canvas-area-border-color: #808080;\n\t--window-background-color: #ffffff;\n\t--window-text-color: #000000;\n\t--menu-background-color: #ffffff;\n\t--menu-text-color: #000000;\n\t--menu-hover-color: #eeeeee;\n\t--menu-active-color: #e5e5e5;\n\t--menu-text-disabled-color: #bdbdbd;\n\t--menu-text-active-color: #eeeeee;\n\t--menu-divider-color: rgba(0, 0, 0, 0.12);\n\t--selected-tool-color: rgba(0, 0, 0, 0.24);\n\n\t/* Styles built-in controls like buttons. */\n\tcolor-scheme: light;\n}\n\nbody {\n\tfont-family: Roboto, sans-serif;\n\tfont-size: 15px;\n}\n\n.canvas-area > canvas {\n\tbackground: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACAQMAAABIeJ9nAAAABlBMVEW9vb3///8EwsWUAAAADElEQVQI12NoYHAAAAHEAMFJRSpJAAAAAElFTkSuQmCC\") repeat;\n\t/* 16px is a common grid size, but that gives 8px grid cells, and our max zoom is 8x */\n\t/*background-size: 16px;*/\n\tbackground-size: 8px;\n}\n\n@media (resolution: 1x), (resolution: 2x), (min-resolution: 3x) {\n\t.canvas-area canvas,\n\t.selection canvas,\n\t.selection img {\n\t\timage-rendering: -moz-crisp-edges;\n\t\timage-rendering: crisp-edges;\n\t\timage-rendering: pixelated;\n\t}\n}\n.disable-aa-for-things-at-main-canvas-scale .main-canvas,\n.disable-aa-for-things-at-main-canvas-scale .selection canvas {\n\timage-rendering: -moz-crisp-edges;\n\timage-rendering: crisp-edges;\n\timage-rendering: pixelated;\n}\n\n.selection:after,\n.textbox:after {\n\tcontent: \"\";\n\tposition: absolute;\n\tleft: 0px;\n\ttop: 0px;\n\tright: 0px;\n\tbottom: 0px;\n\toutline: 1px dashed black;\n\tbox-shadow: 0 0 0 1px white;\n}\n.canvas-area .handle {\n\tbackground: #000080;\n}\n.canvas-area .useless-handle {\n\tbackground: #fff;\n\tbox-shadow: 1px 1px 0 #000080 inset;\n}\n.resize-ghost {\n\toutline: 1px dotted #ccc;\n\tmix-blend-mode: difference;\n}\n\n.window {\n\t--window-frame-color: var(--window-frame-active-color);\n}\n.window:not(.focused) {\n\t--window-frame-color: var(--window-frame-inactive-color);\n}\n.window:not(.maximized) {\n\tborder: 4px solid var(--window-frame-color);\n\tborder-top-left-radius: 4px;\n\tborder-top-right-radius: 4px;\n}\n.window,\n.menu-popup {\n\tbox-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);\n}\n.menu-popup {\n\tborder-radius: 2px;\n}\n.window-titlebar {\n\tbackground: var(--window-frame-color);\n\tcolor: var(--window-titlebar-text-color);\n\tpadding-left: 8px;\n\tpadding-right: 8px;\n\tborder-bottom: 4px solid var(--window-frame-color);\n}\n.tool-window .window-titlebar {\n\tpadding: 5px;\n}\n.window-title-area {\n\tpadding: 8px;\n}\n.window-content {\n\tpadding: 16px;\n\tbackground: var(--window-background-color);\n\tcolor: var(--window-text-color);\n\tborder-bottom-left-radius: 2px;\n\tborder-bottom-right-radius: 2px;\n}\n.component-window .window-content {\n\tpadding: 0;\n}\n.component-window .component {\n\tpadding: 4px 8px;\n}\n.window-button {\n\tborder: 0;\n\tbackground: none;\n\tcolor: transparent;\n\ttransform: scale(1.5);\n\tfont-size: 1px;\n\tborder-radius: 50%;\n\twidth: 17px;\n\theight: 17px;\n\tmargin-left: 10px;\n\tposition: relative;\n}\n.window-button:hover {\n\tbackground: rgba(255, 255, 255, 0.2);\n}\n.window-button:hover:active {\n\tbackground: rgba(255, 255, 255, 0.5);\n}\n.os-window .window-button {\n\ttransform: scale(1.8);\n}\n.window-button::after {\n\tcolor: var(--window-titlebar-text-color);\n\tfont-size: 15px;\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\ttop: 0;\n\tbottom: 0;\n\ttext-align: center;\n}\n.window-close-button::after {\n\tcontent: \"×\";\n}\n.window-minimize-button::after {\n\tcontent: \"-\";\n}\n.window-maximize-button::after {\n\tcontent: \"+\";\n}\n\n.menus {\n\tbox-shadow: 0 2px 5px rgba(0, 0, 0, 0.26);\n}\n\n.enlarge-ui .menu-button {\n\theight: 3rem;\n\tline-height: 3rem;\n}\n\n.menu-button,\n.menu-item {\n\toutline: 0;\n}\n\n.menu-button {\n\t/*padding: 16px;*/\n\tpadding: 3px 7px 5px 7px;\n\tmargin-top: 2px;\n\tborder: 1px solid transparent;\n}\n.menu-button:hover {\n\tbackground: var(--menu-hover-color);\n}\n.menu-button:active,\n.menu-button.active {\n\tbackground: var(--menu-active-color);\n}\n\n.menu-item:hover {\n\tbackground: var(--menu-hover-color);\n}\n.menu-item:active,\n.menu-item.active {\n\tbackground: var(--menu-active-color);\n}\n\n.menu-popup {\n\tbackground: var(--menu-background-color);\n\tcolor: var(--menu-text-color);\n\tpadding: 8px 0;\n}\n\n/*.menu-item {\n\tpadding: 6px 10px 6px 30px;\n}*/\n.menu-item td {\n\t/*height: 32px;*/\n\theight: 27px;\n\tpadding: 0;\n}\n.menu-item td:first-child {\n\tpadding-left: 16px;\n}\n.menu-item td:last-child {\n\tpadding-right: 16px;\n}\n.menu-item[disabled] {\n\tcolor: var(--menu-text-disabled-color);\n}\n.menu-item.active {\n\tbackground: var(--menu-active-color);\n}\n.menu-hr {\n\t/*height: 32px;*/\n\tmargin-top: 6px;\n\tmargin-bottom: 6px;\n\tborder: 0;\n\tborder-bottom: 1px solid var(--menu-divider-color);\n}\n.menu-item .menu-item-checkbox-area {\n\tpadding-right: 8px;\n}\n.menu-item .menu-item-shortcut {\n\tpadding-left: 16px;\n}\n\n/* Menu item SVG for checkboxes and submenu indicators, copy pasted from OS-GUI's CSS */\n/* Note: viewBox is needed for scaling the SVG, used in Enlarge UI mode */\n/* spell-checker: disable */\n.menu-item-checkbox-area::after {\n\t-webkit-mask-image: url(\"data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg' style='fill:currentColor;display:inline-block;vertical-align:middle' %3E%3Cpath d='M5 7v3l2 2 5-5V4L7 9Z'/%3E%3C/svg%3E\");\n\t        mask-image: url(\"data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg' style='fill:currentColor;display:inline-block;vertical-align:middle' %3E%3Cpath d='M5 7v3l2 2 5-5V4L7 9Z'/%3E%3C/svg%3E\");\n}\n.menu-item-checkbox-area.radio::after {\n\t-webkit-mask-image: url(\"data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg' style='fill:currentColor;display:inline-block;vertical-align:middle' %3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E\");\n\t        mask-image: url(\"data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg' style='fill:currentColor;display:inline-block;vertical-align:middle' %3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E\");\n}\n.has-submenu .menu-item-submenu-area::after {\n\t-webkit-mask-image: url(\"data:image/svg+xml, %3Csvg width='16' height='16' viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg' style='fill:currentColor;display:inline-block;vertical-align:middle' %3E%3Cpath d='m6 4 4 4-4 4z'/%3E%3C/svg%3E\");\n\t        mask-image: url(\"data:image/svg+xml, %3Csvg width='16' height='16' viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg' style='fill:currentColor;display:inline-block;vertical-align:middle' %3E%3Cpath d='m6 4 4 4-4 4z'/%3E%3C/svg%3E\");\n}\n/* spell-checker: ensable */\n.has-submenu .menu-item-submenu-area.point-right::after {\n\ttransform: scaleX(-1);\n}\n.menu-item-checkbox-area::after,\n.menu-item-submenu-area::after {\n\tcontent: \"\";\n\tdisplay: block;\n\twidth: 16px;\n\theight: 16px;\n\t/* no background means it's invisible by default here (masking transparent gives transparent, i.e. nothing) */\n}\n.menu-item[aria-checked=true] .menu-item-checkbox-area::after,\n.menu-item.has-submenu .menu-item-submenu-area::after {\n\t/* makes it visible */\n\tbackground: currentColor;\n}\n\n\n.color-selection {\n\twidth: 18px;\n\theight: 18px;\n}\n.color-button, /* this outer one is only for detection for the hover halo in Dwell Clicker mode */\n.edit-colors-window .swatch, /* this outer one is only for detection for the hover halo in Dwell Clicker mode */\n.color-button canvas,\n.color-selection canvas,\n.edit-colors-window .swatch canvas,\n.color-button:after,\n.color-selection:after,\n.edit-colors-window .swatch:after {\n\tborder-radius: 3px;\n\tposition: relative;\n}\n.color-button::after,\n.color-selection::after,\n.edit-colors-window .swatch::after {\n\tcontent: \"\";\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tbox-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5) inset;\n}\n\n/* stupid slight margin in Enlarge UI mode, is it worth it? */\n.enlarge-ui .colors-component.tall {\n\twidth: 53px;\n}\n.enlarge-ui .colors-component.tall .color-button {\n\tmargin-left: 1px;\n}\n.enlarge-ui .colors-component.wide {\n\theight: 53px;\n}\n.enlarge-ui .colors-component.wide .color-button {\n\tmargin-top: 1px;\n}\n\n.edit-colors-window .inset-shallow {\n\tborder: 1px solid rgba(0, 0, 0, 0.5);\n\tborder-radius: 3px;\n}\n\n.edit-colors-window .swatch {\n\twidth: 20px;\n\theight: 17px;\n}\n.edit-colors-window .swatch:focus::after {\n\toutline-offset: 3px;\n}\n\n/* @TODO: modern style (this is copied straight from classic.css) */\n.font-box .toggle:enabled > .icon {\n\t-webkit-mask-image: url(\"../../images/text-tools.png\");\n\t-webkit-mask-position: calc(-16px * var(--icon-index)) 0;\n\tmask-image: url(\"../../images/text-tools.png\");\n\tmask-position: calc(-16px * var(--icon-index)) 0;\n\tbackground-color: currentColor;\n}\n.font-box .toggle:disabled > .icon {\n\tbackground-image: url(\"../../images/text-tools.png\");\n\tbackground-position: calc(-16px * var(--icon-index)) 0;\n\tfilter: saturate(0%) opacity(50%); /* fallback */\n\tfilter: url(\"#disabled-inset-filter-2\");\n}\n\n/* @TODO: padding/margin on the top at least when in the sidebar */\n.tools {\n\twidth: 50px;\n}\n.tool {\n\tborder: 0;\n\tbackground: 0;\n\twidth: 24px;\n\theight: 24px;\n}\n.tool.selected {\n\tbackground: var(--selected-tool-color);\n}\n.toggle.selected {\n\tbox-shadow: 0px -2px 1px 0px blue;\n}\n.tool-icon {\n\tbackground-image: url(\"../../images/modern/vista-tools.png\");\n\tbackground-repeat: no-repeat;\n\tbackground-position: calc(-16px * var(--icon-index)) 0;\n}\n.tool-icon.use-svg {\n\tbackground-image: url(\"../../images/modern/modern-light-tools.svg\");\n\tbackground-position: calc(-16px * (var(--icon-index) * 2 + 1)) -16px;\n}\n.enlarge-ui .tool-icon.use-svg {\n\tbackground-image: url(\"../../images/modern/modern-light-tools.svg\");\n\tbackground-position: calc(-16px * (var(--icon-index) * 2 + 1)) -16px;\n}\n\n.tool-options {\n\t/* the layout currently depends on the exact pixel width (specifically the brush tool options) */\n\tborder: 1px solid rgba(0, 0, 0, 0.24);\n}\n.magnification-option {\n\t/* background-image: url(\"../../images/options-magnification.png\"); */\n\tbackground-image: url(\"../../images/options-magnification.svg\");\n}\n/* .magnification-option.use-svg {\n\tbackground-image: url(\"../../images/options-magnification.svg\");\n} */\n.transparent-mode-option {\n\tbackground-image: url(\"../../images/modern/options-transparency.png\");\n}\n.transparent-mode-option.use-svg {\n\tbackground-image: url(\"../../images/modern/options-transparency.svg\");\n}\n\n.floating-undo-button .button-icon {\n\tbackground: url(../../images/classic/undo.svg);\n}\n.toggle-dwell-clicking .button-icon {\n\tbackground: url(../../images/classic/eye-gaze-pause.svg);\n}\n.dwell-clicker-mode.dwell-clicker-paused .toggle-dwell-clicking .button-icon {\n\tbackground: url(../../images/classic/eye-gaze-unpause.svg);\n}\n\n.menus,\n.component-area,\n.status-area {\n\tbackground: var(--window-background-color);\n\tcolor: var(--window-text-color);\n}\n.status-field {\n\theight: 1.5rem;\n\tline-height: 1.5rem;\n}\n.status-text {\n\tpadding-left: 8px;\n}\n\nbody,\n.canvas-area {\n\tbackground: var(--canvas-area-background-color);\n}\n.canvas-area {\n\tpadding: 8px;\n\tborder: 1px solid var(--canvas-area-border-color);\n}\n\n.component-ghost {\n\tborder-radius: 2px;\n\ttransition: border-radius .2s ease, border-width .2s ease, opacity .2s ease;\n\toutline: 0;\n}\n/* NOTE: copy/pasted from classic.css */\n/* @TODO: actually show a preview of the component itself when dragging for the modern theme */\n/* @TODO: cursor maybe? just when already dragging? */\n.component-ghost.dock {\n\tborder: 1px solid var(--accent-color);\n\tanimation: squish 0.7s ease infinite;\n}\n@keyframes squish {\n\t0% {\n\t\ttransform: scale(90%, 110%);\n\t}\n\t50% {\n\t\ttransform: scale(110%, 90%);\n\t}\n\t100% {\n\t\ttransform: scale(90%, 110%);\n\t}\n}\n.component-ghost:not(.dock) {\n\tborder: 4px solid var(--accent-color);\n\topacity: 0.3;\n\tanimation: bobble 1s ease-in-out infinite;\n\tborder-top-left-radius: 10px;\n\tborder-top-right-radius: 10px;\n}\n@keyframes bobble {\n\t0% {\n\t\ttransform: scale(95%);\n\t}\n\t50% {\n\t\ttransform: scale(105%);\n\t}\n\t100% {\n\t\ttransform: scale(95%);\n\t}\n}\n@media (prefers-reduced-motion) {\n\t.component-ghost {\n\t\tanimation: none !important;\n\t}\n}\n\n.resize-ghost.thick:after,\n.resize-ghost.thick:before {\n\tcontent: \"\";\n\tposition: absolute; left: 0; right: 0; top: 0; bottom: 0;\n\toutline: 1px dotted #ccc;\n}\n.resize-ghost.thick:after {\n\toutline-offset: 1px;\n}\n.resize-ghost.thick:before {\n\toutline-offset: 2px;\n}\n\n:root {\n\t/* for disabled button icon effect */\n\t--ButtonHilight: #fff;\n\t--ButtonShadow: #aaa;\n}\n.help-window .resizer {\n\tbackground-color: var(--help-window-resizer-color) !important;\n\tborder: 0 !important;\n\tbox-shadow: none !important;\n}\n.help-window .toolbar button {\n\twidth: 60px;\n\theight: 42px;\n\tmargin-left: 2px;\n\tmargin-right: 0;\n\tmargin-top: 2px;\n\tmargin-bottom: 1px;\n\tborder-width: 1px; /* or else it's like 17px in Firefox?? and totally screws up the icons */\n}\n.help-window .window-content {\n\tpadding: 0;\n}\n.help-window iframe {\n\tborder: 0;\n\t/* @TODO ideally, apply a padding: 16px on the body in the iframe, except for on the landing page (which has a background) */\n}\n.help-window ul.contents {\n\tpadding: 16px;\n\tborder-right: 1px solid rgba(128, 128, 128, 0.5);\n}\n.help-window .item {\n\tfont-family: \"Segoe UI\", sans-serif;\n\tfont-size: 12px;\n\tpadding: 0 2px;\n}\n.help-window .item:hover {\n\ttext-decoration: underline;\n\tcolor: var(--accent-color-hover);\n\tcursor: pointer;\n}\n.help-window li:before {\n\t/* @TODO: more modern icons */\n\tbackground-image: url(\"../../images/help-icons.png\");\n}\n.help-window .item.selected {\n\t/* @TODO: separate .help-window .contents.focused .item.selected */\n\tbackground-color: var(--accent-color);\n\tcolor: white;\n}\n/* ::selection {\n\tbackground-color: var(--accent-color);\n\tcolor: white;\n} */\n\n.history-view {\n\tbackground: var(--window-background-color);\n\tcolor: var(--window-text-color);\n}\n.history-entry:hover:hover:hover { /* specificity hack vs :not()s */\n\tcolor: var(--accent-color-hover);\n\ttext-decoration: underline;\n}\n\ninput:invalid {\n\tbox-shadow: 0 0 0 2px red;\n}\n.partial-url-label {\n\topacity: 0.6;\n}\n\ninput:disabled + label {\n\tcolor: gray;\n}\n\ndetails {\n\tborder: 1px solid gray;\n}\nsummary {\n\tbackground-color: #dfdfdf;\n\tcolor: black;\n\tpadding: 3px;\n\tpadding-left: 7px;\n}\ndetails[open] > summary {\n\tborder-bottom: 1px solid gray;\n}\ndetails,\nsummary {\n\tborder-top-left-radius: 3px;\n\tborder-top-right-radius: 3px;\n}\ndetails:not([open]),\ndetails:not([open]) > summary {\n\tborder-bottom-left-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n}\n"
  },
  {
    "path": "styles/themes/occult.css",
    "content": "@import \"./classic.css\";\n@import \"./red-wine.css\";\n\n:root {\n\t--theme-loaded: \"occult.css\";\n}\n\n.tool-icon,\n.tool-icon.use-svg { /* specificity needed for overriding classic theme; SVG is not supported yet for this theme */\n\tbackground-image: url(\"../../images/occult/tools.png\");\n\tbackground-repeat: no-repeat;\n\tbackground-position: calc(-16px * var(--icon-index)) 0;\n}\n/* .tool-icon.use-svg {\n\tbackground-image: url(\"../../images/occult/tools.svg\");\n\tbackground-position: calc(-16px * (var(--icon-index) * 2 + 1)) -16px;\n} */\n\n\n/* Show pixel art tool icons as pixelated. */\n/* Note: also inheriting image-rendering logic from classic.css */\n.enlarge-ui .tool-icon {\n\timage-rendering: -moz-crisp-edges;\n\timage-rendering: crisp-edges;\n\timage-rendering: pixelated;\n}\n\n\n.transparent-mode-option,\n.transparent-mode-option.use-svg { /* specificity needed for overriding classic theme; SVG is not supported yet for this theme */\n\tbackground-image: url(\"../../images/occult/options-transparency.png\");\n}\n/* .transparent-mode-option.use-svg {\n\tbackground-image: url(\"../../images/occult/options-transparency.svg\");\n} */\n\n.toggle-dwell-clicking .button-icon {\n\tbackground: url(../../images/dark/eye-gaze-pause.svg);\n}\n.dwell-clicker-mode.dwell-clicker-paused .toggle-dwell-clicking .button-icon {\n\tbackground: url(../../images/dark/eye-gaze-unpause.svg);\n}\n"
  },
  {
    "path": "styles/themes/red-wine.css",
    "content": "/* This is a generated file. */\n/* spell-checker: disable */\n:root {\n\t--checker: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAGklEQVQYV2M84GDxf9mZCwyMaTwc/6NMDBgASCgGs4uut0wAAAAASUVORK5CYII=\");\n\t--button-active-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22rgb(64%2C%2032%2C%2032)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h192v192h-192v-192z%22%20fill%3D%22rgb(67%2C%209%2C%205)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22rgb(102%2C%2012%2C%208)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--button-normal-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22rgb(192%2C%2064%2C%2056)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22rgb(64%2C%2032%2C%2032)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22rgb(102%2C%2012%2C%208)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22rgb(67%2C%209%2C%205)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22rgb(102%2C%2012%2C%208)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--inset-deep-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22rgb(64%2C%2032%2C%2032)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22rgb(192%2C%2064%2C%2056)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22rgb(67%2C%209%2C%205)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22rgb(102%2C%2012%2C%208)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22rgb(102%2C%2012%2C%208)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--button-default-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22rgb(64%2C%2032%2C%2032)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22rgb(192%2C%2064%2C%2056)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h96v32h-64v64h-32v-96z%22%20fill%3D%22rgb(102%2C%2012%2C%208)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M160%2064h32v128h-128v-32h96v-96z%22%20fill%3D%22rgb(67%2C%209%2C%205)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M96%2096h64v64h-64v-64z%22%20fill%3D%22rgb(102%2C%2012%2C%208)%22%2F%3E%0A%09%09%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%22256%22%20height%3D%22256%22%20stroke-width%3D%2264%22%20stroke%3D%22rgb(0%2C%200%2C%200)%22%20fill%3D%22none%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 96 / 3px;\n\t--button-default-active-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22rgb(64%2C%2032%2C%2032)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h192v192h-192v-192z%22%20fill%3D%22rgb(67%2C%209%2C%205)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22rgb(102%2C%2012%2C%208)%22%2F%3E%0A%09%09%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%22256%22%20height%3D%22256%22%20stroke-width%3D%2264%22%20stroke%3D%22rgb(0%2C%200%2C%200)%22%20fill%3D%22none%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--scrollbar-arrows-ButtonText: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAYElEQVQ4T2NkGGSAcZC5h4EmDvr///9/RkZGosxGVwvXBJJADy1chhKyEGYWIUdhU4fiC2RH4XMMzOG0UIMRrPh8T2woUi2EqJXACUUpsj040xC1HEOpOUTlBEotIUU/AKXFQAqyTJ6DAAAAAElFTkSuQmCC\");\n\t--scrollbar-arrows-GrayText: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAYElEQVQ4T2NkGGSAcZC5h4EmDjrg4PDf4cABosxGVwvXBJJADy1chhKyEGYWIUdhU4fiC2RH4XMMzOG0UIMRrPh8T2woUi2EqJXACUUpsj040xC1HEOpOUTlBEotIUU/AKtmQArdV6QJAAAAAElFTkSuQmCC\");\n\t--scrollbar-arrows-ButtonHilight: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAYElEQVQ4T2NkGGSAcZC5h4EmDjrgYPHf4cAJosxGVwvXBJJADy1chhKyEGYWIUdhU4fiC2RH4XMMzOG0UIMRrPh8T2woUi2EqJXACUUpsj040xC1HEOpOUTlBEotIUU/AKbmQArChw1hAAAAAElFTkSuQmCC\");\n\t--scrollbar-size: 13px;\n\t--scrollbar-button-inner-size: 9px;\n\t--ActiveTitle: rgb(64, 0, 12);\n\t--Background: rgb(147, 9, 0);\n\t--Hilight: rgb(192, 0, 0);\n\t--HilightText: rgb(255, 255, 255);\n\t--TitleText: rgb(255, 255, 255);\n\t--Window: rgb(64, 0, 0);\n\t--WindowText: rgb(255, 255, 255);\n\t--Scrollbar: rgb(192, 64, 56);\n\t--InactiveTitle: rgb(0, 0, 0);\n\t--Menu: rgb(102, 12, 8);\n\t--WindowFrame: rgb(0, 0, 0);\n\t--MenuText: rgb(255, 255, 255);\n\t--ActiveBorder: rgb(102, 12, 8);\n\t--InactiveBorder: rgb(102, 12, 8);\n\t--AppWorkspace: rgb(67, 9, 5);\n\t--ButtonFace: rgb(102, 12, 8);\n\t--ButtonShadow: rgb(67, 9, 5);\n\t--GrayText: rgb(192, 64, 64);\n\t--ButtonText: rgb(255, 255, 255);\n\t--InactiveTitleText: rgb(239, 44, 33);\n\t--ButtonHilight: rgb(192, 64, 56);\n\t--ButtonDkShadow: rgb(64, 32, 32);\n\t--ButtonLight: rgb(102, 12, 8);\n\t--InfoText: rgb(255, 217, 173);\n\t--InfoWindow: rgb(64, 0, 0);\n\t--GradientActiveTitle: rgb(217, 11, 0);\n\t--GradientInactiveTitle: rgb(134, 4, 2);\n\t--ButtonAlternateFace: rgb(192, 192, 192);\n\t--HotTrackingColor: rgb(255, 0, 0);\n\t--MenuHilight: rgb(192, 0, 0);\n\t--MenuBar: rgb(102, 12, 8);\n}\n"
  },
  {
    "path": "styles/themes/vista-esque-midnight-green.css",
    "content": "/* Source: https://www.deviantart.com/tpenguinltg/art/Vista-esque-Midnight-Green-563591910 */\n/* License: https://creativecommons.org/licenses/by-sa/3.0/ */\n/* This is a generated file. */\n/* spell-checker: disable */\n:root {\n\t--checker: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAGklEQVQYV2NsaGj4v2DBAgZGBQWF/wkJCQwAR5oG4S4rhtYAAAAASUVORK5CYII=\");\n\t--button-active-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h192v192h-192v-192z%22%20fill%3D%22rgb(21%2C%2021%2C%2021)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22rgb(32%2C%2032%2C%2032)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--button-normal-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22rgb(32%2C%2032%2C%2032)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22rgb(21%2C%2021%2C%2021)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22rgb(32%2C%2032%2C%2032)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--inset-deep-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h224v32h-192v192h-32v-224z%22%20fill%3D%22rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M224%200h32v256h-256v-32h224v-224z%22%20fill%3D%22rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22rgb(21%2C%2021%2C%2021)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M192%2032h32v192h-192v-32h160v-160z%22%20fill%3D%22rgb(32%2C%2032%2C%2032)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22rgb(32%2C%2032%2C%2032)%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--button-default-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h160v32h-128v128h-32v-160z%22%20fill%3D%22rgb(128%2C%20128%2C%20128)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h96v32h-64v64h-32v-96z%22%20fill%3D%22rgb(32%2C%2032%2C%2032)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M160%2064h32v128h-128v-32h96v-96z%22%20fill%3D%22rgb(21%2C%2021%2C%2021)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M96%2096h64v64h-64v-64z%22%20fill%3D%22rgb(32%2C%2032%2C%2032)%22%2F%3E%0A%09%09%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%22256%22%20height%3D%22256%22%20stroke-width%3D%2264%22%20stroke%3D%22rgb(0%2C%200%2C%200)%22%20fill%3D%22none%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 96 / 3px;\n\t--button-default-active-border-image: url(\"data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22256px%22%20height%3D%22256px%22%20viewBox%3D%220%200%20256%20256%22%3E%0A%09%09%09%0A%09%09%3Cpath%20d%3D%22M0%200h256v256h-256v-256z%22%20fill%3D%22rgb(0%2C%200%2C%200)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M32%2032h192v192h-192v-192z%22%20fill%3D%22rgb(21%2C%2021%2C%2021)%22%2F%3E%0A%09%09%3Cpath%20d%3D%22M64%2064h128v128h-128v-128z%22%20fill%3D%22rgb(32%2C%2032%2C%2032)%22%2F%3E%0A%09%09%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%22256%22%20height%3D%22256%22%20stroke-width%3D%2264%22%20stroke%3D%22rgb(0%2C%200%2C%200)%22%20fill%3D%22none%22%2F%3E%0A%09%0A%09%09%3C%2Fsvg%3E\") 64 / 2px;\n\t--scrollbar-arrows-ButtonText: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAYElEQVQ4T2NkGGSAcZC5h4EmDvr///9/RkZGosxGVwvXBJJADy1chhKyEGYWIUdhU4fiC2RH4XMMzOG0UIMRrPh8T2woUi2EqJXACUUpsj040xC1HEOpOUTlBEotIUU/AKXFQAqyTJ6DAAAAAElFTkSuQmCC\");\n\t--scrollbar-arrows-GrayText: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAYElEQVQ4T2NkGGSAcZC5h4EmDlJQUPj/4MEDosxGVwvXBJJADy1chhKyEGYWIUdhU4fiC2RH4XMMzOG0UIMRrPh8T2woUi2EqJXACUUpsj040xC1HEOpOUTlBEotIUU/AC1mQAqnFEiwAAAAAElFTkSuQmCC\");\n\t--scrollbar-arrows-ButtonHilight: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAJCAYAAABaMo5wAAAAYElEQVQ4T2NkGGSAcZC5h4EmDmpoaPjf0NBAlNnoauGaQBLooYXLUEIWwswi5Chs6lB8gewofI6BOZwWajCCFZ/viQ1FqoUQtRI4oShFtgdnGqKWYyg1h6icQKklpOgHAM9mQArEvm5+AAAAAElFTkSuQmCC\");\n\t--scrollbar-size: 13px;\n\t--scrollbar-button-inner-size: 9px;\n\t--ActiveTitle: rgb(18, 91, 30);\n\t--Background: rgb(15, 45, 30);\n\t--Hilight: rgb(32, 128, 44);\n\t--HilightText: rgb(255, 255, 255);\n\t--TitleText: rgb(255, 255, 255);\n\t--Window: rgb(0, 0, 0);\n\t--WindowText: rgb(255, 255, 255);\n\t--Scrollbar: rgb(128, 128, 128);\n\t--InactiveTitle: rgb(18, 91, 30);\n\t--Menu: rgb(32, 32, 32);\n\t--WindowFrame: rgb(0, 0, 0);\n\t--MenuText: rgb(255, 255, 255);\n\t--ActiveBorder: rgb(32, 32, 32);\n\t--InactiveBorder: rgb(32, 32, 32);\n\t--AppWorkspace: rgb(21, 21, 21);\n\t--ButtonFace: rgb(32, 32, 32);\n\t--ButtonShadow: rgb(21, 21, 21);\n\t--GrayText: rgb(32, 32, 32);\n\t--ButtonText: rgb(255, 255, 255);\n\t--InactiveTitleText: rgb(192, 192, 192);\n\t--ButtonHilight: rgb(128, 128, 128);\n\t--ButtonDkShadow: rgb(0, 0, 0);\n\t--ButtonLight: rgb(32, 32, 32);\n\t--InfoText: rgb(255, 255, 255);\n\t--InfoWindow: rgb(0, 30, 0);\n\t--GradientActiveTitle: rgb(100, 168, 60);\n\t--GradientInactiveTitle: rgb(18, 91, 30);\n\t--ButtonAlternateFace: rgb(192, 192, 192);\n\t--HotTrackingColor: rgb(64, 180, 64);\n\t--MenuHilight: rgb(32, 128, 44);\n\t--MenuBar: rgb(32, 32, 32);\n}\n"
  },
  {
    "path": "styles/themes/winter.css",
    "content": "@import \"./classic.css\";\n@import \"../../lib/os-gui/build/blue.css\";\n@import url(\"https://fonts.googleapis.com/css?family=Charm|Princess+Sofia&display=swap\");\n\n:root {\n\t--theme-loaded: \"winter.css\";\n}\n\n/* Advent calendar-style tool buttons that flip to reveal thematic pixel art for each tool */\n/* .tool-icon::before is a flap, and .tool-icon::after is an icon visible on the front of the flap, showing the classic theme's icons for usability */\n/* The .tool-icon is used to show the revealed thematic icon. */\n.tool-icon,\n.tool-icon.use-svg { /* specificity needed for overriding classic theme; SVG is not supported yet for this theme */\n\tbackground-image: url(\"../../images/winter/tools.png\");\n\tbackground-repeat: no-repeat;\n\tbackground-position: calc(-16px * var(--icon-index)) 0;\n}\n/* .tool-icon.use-svg {\n\tbackground-image: url(\"../../images/winter/tools.svg\");\n\tbackground-position: calc(-16px * (var(--icon-index) * 2 + 1)) -16px;\n} */\n.tool-icon::before,\n.tool-icon::after {\n\tcontent: \" \";\n\tposition: absolute;\n\t--border-width: 3px;\n\t/* inset doesn't have enough browser support for me */\n\ttop: calc(-1 * var(--border-width));\n\tleft: calc(-1 * var(--border-width));\n\tright: calc(-1 * var(--border-width));\n\tbottom: calc(-1 * var(--border-width));\n\tborder-top: var(--border-width) solid var(--ButtonHilight);\n\tborder-left: var(--border-width) solid var(--ButtonHilight);\n\tborder-right: var(--border-width) solid var(--ButtonShadow);\n\tborder-bottom: var(--border-width) solid var(--ButtonShadow);\n\t--transition-duration: 0.2s;\n\ttransition: transform var(--transition-duration) ease-in-out;\n\ttransform-origin: left;\n\t--side: -1;\n}\n.tool-icon::after {\n\tz-index: 3;\n\tbackground-image: url(\"../../images/classic/tools.png\");\n\tbackground-repeat: no-repeat;\n\tbackground-position: calc(-16px * var(--icon-index)) 0;\n\tbackface-visibility: hidden;\n}\n.tool-icon.use-svg::after {\n\tbackground-image: url(\"../../images/classic/tools.svg\");\n\tbackground-position: calc(-16px * (var(--icon-index) * 2 + 1)) -16px;\n}\n\n.tool .tool-icon::before {\n\tborder-width: 1px;\n\tbackground: linear-gradient(var(--gradient-direction), var(--ButtonFace), var(--ButtonShadow) 190%);\n\tbackground-position: 20px 0; /* starting gradient not visible */\n\tbackground-repeat: no-repeat; /* mustn't wrap to be invisible */\n\tbackground-color: var(--ButtonFace);\n\ttransition: transform var(--transition-duration) ease-in-out, background-position var(--transition-duration) ease-in-out;\n\tz-index: 2;\n\t--gradient-direction: to left;\n}\n.tool.selected .tool-icon::before,\n.tool.selected .tool-icon::after {\n\ttransform: rotateY(calc(120deg * var(--side))) skewY(calc(-20deg * var(--side)));\n}\n.tool.selected .tool-icon::before {\n\tbackground-position: 0% 0% !important; /* !important to override .tool:nth-child(2n+1) .tool-icon::before */\n}\n\n.tool:nth-child(2n) .tool-icon::before,\n.tool:nth-child(2n) .tool-icon::after {\n\t--side: 1;\n\ttransform-origin: right;\n\t--gradient-direction: to right;\n}\n.tool:nth-child(2n+1) .tool-icon::before {\n\tbackground-position: -20px 0; /* opposite for transition to work right */\n}\n\n/* Show pixel art tool icons as pixelated. */\n/* Note: also inheriting image-rendering logic from classic.css */\n.enlarge-ui .tool-icon {\n\timage-rendering: -moz-crisp-edges;\n\timage-rendering: crisp-edges;\n\timage-rendering: pixelated;\n}\n\n\n/* Fancy cursive menus */\n.menus * {\n\tfont-family: \"Princess Sofia\", cursive;\n\tfont-size: 20px;\n}\n.menu-button {\n\tpadding: 5px 10px;\n\theight: 30px;\n}\n.menu-popup * {\n\tfont-family: \"Charm\", cursive;\n\tfont-size: 18px;\n}\n\n/* Fanciful snow flakes for hotkey highlighting */\n@supports (mix-blend-mode: overlay) {\n\t.menu-hotkey {\n\t\ttext-decoration: none;\n\t\tposition: relative;\n\t}\n\t.menu-hotkey::after {\n\t\t/* content: \"❄️\"; */\n\t\t/* font-size: 20px; */\n\t\t/* color: #fff; */\n\t\tcontent: \"\";\n\t\twidth: 1em;\n\t\theight: 1em;\n\t\t/* Noto Color Emoji snowflake, brightened a bit. Original fill: #95c7ec */\n\t\t/* Source: https://github.com/googlefonts/noto-emoji/blob/9a5261d871451f9b5183c93483cbd68ed916b1e9/svg/emoji_u2744.svg */\n\t\t/* spell-checker: disable */\n\t\tbackground-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 128 128'%3E%3Cpath style='fill:%23aad1ef' d='m70 51-1-19s10-5 12-8 1-9-1-10c-2 0-11 7-12 6s4-6 4-8l-7-7-8 8s3 7 2 8-10-6-12-6c-3 1-2 5-1 7s15 9 15 9l-1 20h-3l-2 3-15-9-1-18c0-2-4-3-5-3l-4 16-6-10-9 2 3 12 10 2-12 14s3 3 6 2l11-8 16 8v3l1 1-16 9c-1 0-10-7-13-7s-5 4-5 4l12 9-10 5-4 9 11 3c2 0 4-8 5-9l1 2s3 11 5 11 4-3 5-4-1-15-1-15l15-8 2 2 4 1v17s-16 7-17 9l1 7 14-5v9s6 9 8 8l6-8-5-9c1 0 10 7 12 6 2 0 3-2 3-4S70 96 70 96V78l3-1 3-4 15 11 1 18 6 2 1-16 7 6 10-2-3-9c-1-2-8-1-8-1-1-1 11-5 11-7s-4-5-5-6l-15 7-17-10 1-2-1-2 17-10s15 6 16 5l3-3-12-7h9l5-10-12-3-5 6-1-13h-6l-2 18-16 9-2-3h-3z'/%3E%3Cpath style='fill:%23afe3ff' d='m76 56 19-10V26l-5 3-1 14-16 9 3 4zM99 44l8-8c2-1 9 2 9 2l1-3c-1-1-10-5-12-4s-5 7-5 7l-1 6zM99 51l-4 2s10 6 13 6 6-3 6-3h-5l-10-5zM77 70l-2 5 14 9s-1 15 1 17l4 2 1-22-18-11zM95 75s9-7 12-7 5 2 5 2l-13 7-4-2zM100 85l-1 4s3 8 6 8c2 1 10-2 11-3v-4s-7 3-9 2c-3 0-7-7-7-7zM59 55l-5 8c0 1 4 9 6 10h10l4-9-4-9H59zM63 22l-2-9 6-6-3-3c-2 0-9 6-9 8l4 9 4 1zM45 19s0 4 2 6c1 2 11 7 11 7l1 19h4V29l-10-5-8-5zM40 48l13 8 2-3-15-9zM30 40l3 3c2-1 2-19 2-19s-3-1-4 0l-1 16zM29 44c2 1 2 3 1 4L17 61s-3-1-3-3l11-11s-8 2-10 0l-4-14 5-1 2 11 11 1zM50 66l-16 9 4 3 14-9zM31 81l-6 4h-6l-4 10-3-1c-1-1 3-11 4-13h9l-10-7c-1-2 3-4 3-4s14 9 13 11zM33 86l-3 3 2 13h4l-3-16zM59 78v15l-14 9-1 5 19-10V78h-4zM83 109l-13-9v-6l12 10 1 5zM60 114l8 8-4 2c-1 0-9-7-9-9l4-9 3-1-2 9z'/%3E%3Cpath style='fill:%23fefefe' d='m71 62-2 4-1 4h-7c-2 0-3 4 0 4l10-1 5-10c0-2-4-7-6-8-1-2-4 0-2 3l3 4zM93 30c-2 0-2 3-2 6s1 6 3 6 1-5 1-7 1-5-2-5zM64 8c1 1-1 3-1 4-1 0-3 2-5 0s1-3 2-4h4zM63 28c-2 0-2 5-2 11 0 8 0 12 2 12s1-4 1-13c0-4 1-10-1-10zM15 33c-3 1-2 4-1 7 1 1 2 6 5 5 2-1 1-5 0-7 0-2-2-6-4-5zM92 90l-1 5 1 5c2 0 2-4 2-5 0-2 0-5-2-5zM63 78l-1 9c0 6-1 10 1 10 2-1 2-7 2-11s0-8-2-8zM37 78c1 1 5-2 8-3 4-2 8-4 7-6s-5 1-8 3c-3 1-8 4-7 6zM25 86l-5 1-2 4c-2 1-3-1-2-3 0-3 1-4 2-5l5-1c2 0 3 3 2 4z'/%3E%3C/svg%3E\");\n\t\t/* spell-checker: enable */\n\t\tbackground-repeat: no-repeat;\n\t\toverflow: hidden;\n\t\tposition: absolute;\n\t\tmix-blend-mode: overlay;\n\t\tleft: 50%;\n\t\tbottom: 0.1em;\n\t\ttransform: translateX(-50%);\n\t\t--base-transform: translateX(-50%);\n\t\ttransform-origin: center;\n\t\ttransition: width 0.2s ease-in-out, height 0.2s ease-in-out, bottom 0.2s ease-in-out, opacity 0.2s ease-in-out;\n\t}\n\t[aria-disabled=true] .menu-hotkey::after {\n\t\topacity: 0.7;\n\t\t--is-disabled: 1;\n\t}\n\t/* This might obscure the purpose of the snowflake indicators, but it's fun. */\n\t.menu-button:hover .menu-hotkey::after,\n\t.highlight:not(.menu-button[aria-expanded=\"true\"]) .menu-hotkey::after {\n\t\tanimation: rotate-snowflake calc(4s + 6s * var(--is-disabled, 0)) linear infinite;\n\t\topacity: calc(0.5 - 0.3 * var(--is-disabled, 0));\n\t\twidth: 2em;\n\t\theight: 2em;\n\t\tbottom: -0.4em;\n\t}\n\t@keyframes rotate-snowflake {\n\t\tfrom {\n\t\t\ttransform: var(--base-transform) rotate(0deg);\n\t\t}\n\t\tto {\n\t\t\ttransform: var(--base-transform) rotate(360deg);\n\t\t}\n\t}\n\t/* This might clarify the purpose of the indicators, by asserting that \"yes, this letter specifically is special\" */\n\t.menu-button:not([aria-disabled=true]).highlight .menu-hotkey,\n\t.menu-item:not([aria-disabled=true]).highlight .menu-hotkey {\n\t\tcolor: red;\n\t}\n}\n\n/* a button to leave the Winter theme */\nbutton.grinch-button {\n\tposition: absolute;\n\tbottom: 0px;\n\tright: 0px;\n\twidth: 100px;\n\theight: 179px;\n\tz-index: 2;\n\tbackground-image: url(\"../../images/winter/grinch-smile-spritesheet.png\");\n\tborder: 0;\n\tbackground-color: transparent;\n\tcursor: pointer;\n}\n"
  },
  {
    "path": "svg-paint/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>SVG Paint Experiment</title>\n</head>\n\n<body>\n\t<svg width=\"800\" height=\"600\">\n\t\t<defs>\n\t\t\t<radialGradient id=\"grad1\" cx=\"50%\" cy=\"50%\" r=\"50%\" fx=\"50%\" fy=\"50%\">\n\t\t\t\t<stop offset=\"0%\" style=\"stop-color:rgb(255,255,255);stop-opacity:0\" />\n\t\t\t\t<stop offset=\"100%\" style=\"stop-color:rgb(0,0,255);stop-opacity:1\" />\n\t\t\t</radialGradient>\n\t\t</defs>\n\t\t<rect x=\"10\" y=\"10\" width=\"200\" height=\"100\" fill=\"url(#grad1)\" />\n\t\t<text x=\"10\" y=\"150\" font-family=\"Verdana\" font-size=\"35\" fill=\"navy\" stroke=\"url(#grad1)\"\n\t\t\tstroke-width=\"3\">Hello SVG</text>\n\t\t<text x=\"10\" y=\"200\" font-family=\"Verdana\" font-size=\"20\" fill=\"black\">\n\t\t\tLeft click to draw circles.\n\t\t</text>\n\t\t<text x=\"10\" y=\"230\" font-family=\"Verdana\" font-size=\"20\" fill=\"black\">\n\t\t\tRight click to cut/paste a rectangular region at a fixed offset.\n\t\t</text>\n\t</svg>\n\t<h1>SVG Paint Experiment</h1>\n\t<p>\n\t\tThis is a proof of concept of a cutting/pasting operation in SVG,\n\t\twhich could be used for saving as SVG in JS Paint.\n\t</p>\n\t<p>\n\t\tNote the exponential slowdown when cutting/pasting multiple times.\n\t\tThis is due to the fact that all the contents of the document are cloned (using <code>&lt;use&gt;</code>)\n\t\tand masked/clipped in order to separate the cutout region from the rest of the document.\n\t\tWhen cloning the document content, it includes any previous clones.\n\t\tTherefore, if you have one circle, and cut/paste it twice,\n\t\tit will have to render the circle in potentially four places.\n\t</p>\n\t<p>\n\t\tIt may be more feasible to embed a raster image in the SVG,\n\t\tso it looks exactly as the canvas,\n\t\tand only use special logic for text elements,\n\t\tin order to support text selection and screen readers.\n\t</p>\n\t<p>\n\t\tHowever it would need some limits to avoid the exponential rendering problem.\n\t\tA given piece of text could be limited to a specific number of clones,\n\t\tand preference given to larger portions of text.\n\t</p>\n\t<p>\n\t\tIn the end, it would therefore always have edge cases where it would not (fully) work.\n\t\tIt would be a trade-off between performance and correctness.\n\t</p>\n\t<p>\n\t\tBesides that, if you erase text, it should no longer be selectable, but this would be hard to codify.\n\t\tIt may be best to leave text selection up to OCR tools like\n\t\t<a href=\"https://projectnaptha.com/\">Project Naptha</a>.\n\t</p>\n\t<script src=\"./svg-paint.js\"></script>\n\t<style>\n\t\tsvg {\n\t\t\tborder: 5px ridge gray;\n\t\t}\n\t</style>\n</body>\n\n</html>"
  },
  {
    "path": "svg-paint/svg-paint.js",
    "content": "\n\nconst svg = document.querySelector(\"svg\");\nconst defs = svg.querySelector(\"defs\");\n\nlet docGroup = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\ndocGroup.append(...svg.childNodes);\nsvg.appendChild(docGroup);\n\nvar pt = svg.createSVGPoint();\nvar mouseDown = false;\nsvg.addEventListener(\"mousedown\", function (_event) {\n\tmouseDown = true;\n});\nsvg.addEventListener(\"mouseup\", function (_event) {\n\tmouseDown = false;\n});\nsvg.addEventListener(\"mousemove\", function (event) {\n\tif (!mouseDown) return;\n\n\tpt.x = event.clientX;\n\tpt.y = event.clientY;\n\tvar svgCoords = pt.matrixTransform(svg.getScreenCTM().inverse());\n\n\tconst circle = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n\tcircle.setAttribute(\"cx\", svgCoords.x);\n\tcircle.setAttribute(\"cy\", svgCoords.y);\n\tcircle.setAttribute(\"r\", 10);\n\tcircle.setAttribute(\"fill\", \"red\");\n\tdocGroup.appendChild(circle);\n});\n\nsvg.addEventListener(\"auxclick\", function (event) {\n\n\tpt.x = event.clientX;\n\tpt.y = event.clientY;\n\tvar svgCoords = pt.matrixTransform(svg.getScreenCTM().inverse());\n\n\tconst rect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n\trect.setAttribute(\"width\", 100);\n\trect.setAttribute(\"height\", 100);\n\trect.setAttribute(\"x\", svgCoords.x);\n\trect.setAttribute(\"y\", svgCoords.y);\n\t// rect.setAttribute(\"fill\", \"white\"); // why?\n\n\tconst use = cutOut(rect);\n\tuse.setAttribute(\"transform\", \"translate(50, 50)\");\n});\nsvg.addEventListener(\"contextmenu\", function (event) {\n\tevent.preventDefault();\n});\n\n\nlet idCounter = 0;\n/**\n * @param {SVGGeometryElement} clipShape\n * @returns {SVGUseElement}\n */\nfunction cutOut(clipShape) {\n\t++idCounter;\n\n\t// <clipPath> for the selection\n\tconst clipPath = document.createElementNS(\"http://www.w3.org/2000/svg\", \"clipPath\");\n\tconst clipPathId = `clipPath${idCounter}`;\n\tclipPath.setAttribute(\"id\", clipPathId);\n\tdefs.appendChild(clipPath);\n\tclipPath.appendChild(clipShape);\n\n\t// <mask> for the remaining document\n\tconst mask = document.createElementNS(\"http://www.w3.org/2000/svg\", \"mask\");\n\tconst maskId = `mask${idCounter}`;\n\tmask.setAttribute(\"id\", maskId);\n\tdefs.appendChild(mask);\n\n\tconst maskRect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n\tmaskRect.setAttribute(\"width\", \"100%\");\n\tmaskRect.setAttribute(\"height\", \"100%\");\n\tmaskRect.setAttribute(\"fill\", \"white\");\n\tmask.appendChild(maskRect);\n\n\tconst maskShape = clipShape.cloneNode(true);\n\tmaskShape.setAttribute(\"fill\", \"black\");\n\tmaskShape.setAttribute(\"stroke\", \"none\");\n\tmask.appendChild(maskShape);\n\n\t// keep track of the document contents before the operation\n\tconst originalDocGroup = docGroup;\n\tconst originalDocGroupId = `docGroup${idCounter}`;\n\toriginalDocGroup.setAttribute(\"id\", originalDocGroupId); // a little weird to do this here\n\t// wrap the original document in a masked group\n\t// (don't apply mask to the original group because we need to reference the unmasked content with <use>)\n\tconst maskedGroup = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\tmaskedGroup.setAttribute(\"mask\", \"url(#\" + maskId + \")\");\n\tmaskedGroup.append(originalDocGroup);\n\t// wrap the masked group in new group for new shapes to be drawn to\n\t// (so they are unaffected by a previous cut-out operation's mask)\n\tdocGroup = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\tdocGroup.append(maskedGroup);\n\tsvg.appendChild(docGroup);\n\n\t// <use> to display the cut-out selection\n\tconst use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\n\tuse.setAttribute(\"href\", \"#\" + originalDocGroupId);\n\tuse.setAttribute(\"clip-path\", \"url(#\" + clipPathId + \")\");\n\tdocGroup.appendChild(use);\n\n\treturn use;\n}\n"
  },
  {
    "path": "sync-package.js",
    "content": "// Pulls a dependency's code into the repo, based on the package.json \"files\" field.\n\nconst fs = require(\"fs/promises\");\nconst path = require(\"path\");\n\n(async () => {\n\n\tconst packageName = process.argv[2];\n\n\tif (!packageName) {\n\t\tconsole.log(\"Usage: node sync-package.js <package-name>\");\n\t\tprocess.exit(1);\n\t}\n\n\tconst alwaysIncludedFiles = []; // [\"README.md\", \"LICENSE\", \"CHANGELOG.md\", \"package.json\"];\n\tconst alwaysExclude = [\"demo/\", \"index.html\", \"$MenuBar.js\"];\n\n\tconst packageDir = path.join(__dirname, \"node_modules\", packageName);\n\n\tconst outputDir = path.join(__dirname, \"lib\", packageName);\n\n\tconsole.log(`Syncing ${packageName}...`);\n\tconsole.log(`Source directory: ${packageDir}`);\n\tconsole.log(`Output directory: ${outputDir}`);\n\n\tconst packageJson = JSON.parse(await fs.readFile(path.join(packageDir, \"package.json\"), \"utf8\"));\n\tconst { files } = packageJson;\n\tif (!files) {\n\t\tconsole.log(`No \"files\" field in ${packageDir}`);\n\t\tprocess.exit(1);\n\t}\n\tif (!Array.isArray(files)) {\n\t\tconsole.log(`\"files\" field is not an array in ${packageDir}`);\n\t\tprocess.exit(1);\n\t}\n\tif (files.length === 0) {\n\t\tconsole.log(`\"files\" field is empty in ${packageDir}`);\n\t\tprocess.exit(1);\n\t}\n\n\t// TODO: Use more npm machinery, in order to include things like README.md without being specific to the variations used.\n\t// For example see https://www.npmjs.com/package/npm-packlist\n\t// Icing on the cake would be to rewrite README.md so that relative links work.\n\tfor (const extraFile of alwaysIncludedFiles) {\n\t\tif (!files.includes(extraFile)) {\n\t\t\tfiles.push(extraFile);\n\t\t}\n\t}\n\t// TODO: Command line option to exclude files, and use glob instead of exact match on \"files\" field item.\n\tfor (const exclude of alwaysExclude) {\n\t\tconst index = files.indexOf(exclude);\n\t\tif (index !== -1) {\n\t\t\tfiles.splice(index, 1);\n\t\t}\n\t}\n\n\tawait fs.rm(outputDir, { recursive: true });\n\n\tfor (const file of files) {\n\t\tconst from = path.join(packageDir, file);\n\t\tconst to = path.join(outputDir, file);\n\t\tconsole.log(\"Copying\", from, \"to\", to);\n\t\tawait fs.cp(from, to, { recursive: true });\n\t}\n})();\n"
  },
  {
    "path": "test-news-newer.html",
    "content": "<div id=\"news\" hidden>\n\t<article class=\"news-entry\" id=\"news-3000-aliens\">\n\t\t<h1>Extraterrestrial Life</h1>\n\t\t<time datetime=\"3000-13-17\">3000-13-17</time>\n\t\tAliens have a round head. I mean, arrived.\n\t</article>\n\t<article class=\"news-entry\" id=\"news-2100-js\">\n\t\t<h1>The Legacy of JavaScript</h1>\n\t\t<time datetime=\"2100-09-21\">2100-09-21</time>\n\t\tJavaScript still exists, but hey look on the bright side, at least we don't have to write it anymore.\n\t\tBtw the JS in JS Paint no longer stands for JavaScript, it's Jarvis's Spectre Paint,\n\t\tnamed after the AI that helps maintain this project.\n\t</article>\n\t<style>\n\t\t#news {\n\t\t\tbackground: black;\n\t\t\tcolor: aqua;\n\t\t}\n\n\t\t.news-entry {\n\t\t\tbackground: rgba(0, 255, 255, 0.2);\n\t\t\tcolor: aqua;\n\t\t\tborder-radius: 5px;\n\t\t\tborder: 1px solid rgba(0, 255, 255, 0.5);\n\t\t\tpadding: 10px;\n\t\t\tmax-width: 30em;\n\t\t\tmargin: 10px;\n\t\t}\n\n\t\t.news-entry>h1 {\n\t\t\tfont-size: 1.3em;\n\t\t\tmargin: 0;\n\t\t\tmargin-bottom: 0.5em;\n\t\t}\n\n\t\t.news-entry>time {\n\t\t\tfont-size: 1.3em;\n\t\t\tcolor: rgba(0, 255, 255, 0.5);\n\t\t}\n\n\t\t.news-entry .new {\n\t\t\tcolor: lime;\n\t\t}\n\t</style>\n</div>"
  }
]